ZGlmZiAtLWdpdCBhL3RydW5rL0NPTlRSSUJVVE9SUyBiL3RydW5rL0NPTlRSSUJVVE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2EwMmIxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvQ09OVFJJQlVUT1JTCkBAIC0wLDAgKzEsMjkwIEBACitBbW9uZ3N0IG90aGVyLCB0aGUgZm9sbG93aW5nIHBlb3BsZSBjb250cmlidXRlZCB0byBhbnQ6CisKK0FsZWtzYW5kciBJc2h1dGluCitBbGV4ZXkgUGFuY2hlbmtvCitBbGV4ZXkgU29sb2ZuZW5rbworQW5kcmVhcyBBbWVzCitBbmRyZWFzIE1yb3NzCitBbmRyZXcgRXZlcml0dAorQW5kcmV5IFVyYXpvdgorQW5keSBXb29kCitBbmlsIEsuIFZpamVuZHJhbgorQW5saSBTaHVuZGkKK0FudGhvbnkgR291YmFyZAorQW50aG9ueSBHcmVlbgorQW50b2luZSBCYXVkb3V4CitBbnRvaW5lIExldnktTGFtYmVydAorQW50b24gTWF6a292b2kKK0FybmF1ZCBWYW5keWNrCitBcm5vdXQgSi4gS3VpcGVyCitBc2xhayBIZWxsZXPDtHkKK0F0c3VoaWtvIFlhbWFuYWthCitBdmlrIFNlbmd1cHRhCitCYWxhenMgRmVqZXMgMgorQmVuamFtaW4gQnVyZ2VzcworQmVuIEdhbGJyYWl0aAorQmVub2l0IE1vdXNzYXVkCitCZXJuZCBEdXRrb3dza2kKK0JyYWQgQ2xhcmsKK0JyYW50IExhbmdlciBHdXJnYW51cworQnJpYW4gRGVpdHRlCitCcmlhbiBGZWxkZXIKK0JydWNlIEF0aGVydG9uCitDZWRvbWlyIElnYWx5CitDaGFybGVzIEh1ZGFrCitDaGFybGllIEh1YmJhcmQKK0NocmlzIFBvdmlyaworQ2hyaXN0aWFuIEtub3JyCitDaHJpc3RvcGggV2lsaGVsbXMKK0NocmlzdG9waGUgTGFib3Vpc3NlCitDaHJpc3RvcGhlciBBLiBMb25nbworQ2hyaXN0b3BoZXIgQ2hhcmxpZXIKK0Nvbm9yIE1hY05laWxsCitDcmFlZyBTdHJvbmcKK0NyYWlnIENvdHRpbmdoYW0KK0NyYWlnIFIuIE1jQ2xhbmFoYW4KK0NyYWlnIFJ5YW4KK0N1cnRpcyBXaGl0ZQorQ3lyaWxsZSBNb3J2YW4KK0QnQXJjeSBTbWl0aAorRGFsZSBBbnNvbgorRGFuIEFybWJydXN0CitEYW5pZWwgUmliYWduYWMKK0RhbmllbCBTcGlsa2VyCitEYW5ubyBGZXJyaW4KK0RhdmFudW0gU3Jpbml2YXMKK0RhdmUgQnJvbmRzZW1hCitEYXZlIEJyb3NpdXMKK0RhdmlkIEEuIEhlcm1hbgorRGF2aWQgQ3Jvc3NsZXkKK0RhdmlkIEfDpHJ0bmVyCitEYXZpZCBLYXZhbmFnaAorRGF2aWQgTWFjbGVhbgorRGF2aWQgUmVlcworRGVuaXMgSGVubmVzc3kKK0RlcmVrIFNsYWdlcgorRGlhbmUgSG9sdAorZElvbiBHaWxsYXJkCitEb21pbmlxdWUgRGV2aWVubmUKK0RvbmFsIFF1aW5sYW4KK0RvbiBCcm93bgorRG9uIEZlcmd1c29uCitEb24gSmVmZmVyeQorRHJldyBTdWRlbGwKK0Vkd2luIFdvdWR0CitFbGkgVHVja2VyCitFbW1hbnVlbCBCb3VyZworRXJpYyBPbHNlbgorRXJpYyBQdWdoCitFcmlrIEhhdGNoZXIKK0VyaWsgTGFuZ2VuYmFjaAorRXJpayBNZWFkZQorRXJuc3QgZGUgSGFhbgorRnJhbmsgSGFybmFjaworRnJhbmsgU29tZXJzCitGcmFuayBaZXlkYQorRnJlZGVyaWMgQm90aGFteQorRnJlZGVyaWMgTGF2aWduZQorR2FyeSBTLiBXZWF2ZXIKK0dhdXRhbSBHdWxpYW5pCitHZW9yZ2VzLUV0aWVubmUgTGVnZW5kcmUKK0dlcm8gVmVybWFhcworR2Vycml0IFJpZXNzZW4KK0dsZW5uIE1jQWxsaXN0ZXIKK0dsZW5uIFR3aWdncworR3JlZyBOZWxzb24KK0hhcmlzaCBQcmFiYW5kaGFtCitIYXJvb24gUmFmaXF1ZQorSGlyb2FraSBOYWthbXVyYQorSG9sZ2VyIEVuZ2VscworSWduYWNpbyBDb2xvbWEKK0luZ2Vub25zeWEgRnJhbmNlCitJbmdtYXIgU3RlaW4KK0lyZW5lIFJ1c21hbgorSXZhbiBJdmFub3YKK0phY2sgSi4gV29laHIKK0phbWVzIER1bmNhbiBEYXZpZHNvbgorSmFuIEN1bXBzCitKYW4gTWF0w6hybmUKK0phbiBNeW5hcmlrCitKYXNvbiBIdW50ZXIKK0phc29uIFBldHRpc3MKK0phc29uIFNhbHRlcgorSmFzb24gWWlwCitKYXkgRGlja29uIEdsYW52aWxsZQorSmF5IFBlY2sKK0pheSB2YW4gZGVyIE1lZXIKK0pDIE1hbm4KK0ogRCBHbGFudmlsbGUKK0plYW4tRnJhbmNvaXMgQnJvdXNzZWF1CitKZWZmIEdldHRsZQorSmVmZiBNYXJ0aW4KK0plZmYgVHVsbGV5CitKZWZmIFR1cm5lcgorSmVuZSBKYXNwZXIKK0plcmVteSBNYXdzb24KK0plcm9tZSBMYWNvc3RlCitKZXNzZSBHbGljaworSmVzc2UgU3RvY2thbGwKK0ppbSBBbGxlcnMKK0pvZXJnIFdhc3NtZXIKK0pvaG4gU2lzc29uCitKb24gRGlja2luc29uCitKb24gUy4gU3RldmVucworSm9zZSBBbGJlcnRvIEZlcm5hbmRlegorSm9zZXBoIFdhbHRvbgorSm9zaCBMdWNhcworSnVlcmcgV2FubmVyCitKdWxpYW4gU2ltcHNvbgorSnVzdGluIFZhbGxvbgorS2Vpcm9uIExpZGRsZQorS2VpdGggVmlzY28KK0tldmluIEdyZWluZXIKK0tldmluIEphY2tzb24KK0tldmluIFJvc3MKK0tldmluIFogR3JleQorS2lyayBXeWxpZQorS3lsZSBBZGFtcworTGFycnkgU2hhdHplcgorTGFycnkgU3RyZWVweQorTGVzIEh1Z2hlcworTGV2aSBDb29rCitsdWNhcworTHVkb3ZpYyBDbGF1ZGUKK01hYXJ0ZW4gQ29lbmUKK01hZ2VzaCBVbWFzYW5rYXIKK01hbmVlc2ggU2FodQorTWFyY2VsIFNjaHV0dGUKK01hcmN1cyBCJm91bWw7cmdlcgorTWFyaXVzeiBOb3dvc3Rhd3NraQorTWFyayBIZWNrZXIKK01hcmsgUi4gRGlnZ29yeQorTWFydGlqbiBLcnVpdGhvZgorTWFydGluIExhbmRlcnMKK01hcnRpbiBQb2VzY2hsCitNYXJ0aW4gdmFuIGRlbiBCZW10CitNYXRoaWV1IENoYW1wbG9uCitNYXRoaWV1IFBlbHRpZXIKK01hdHQgQWxicmVjaHQKK01hdHQgQmVuc29uCitNYXR0IEJpc2hvcAorTWF0dCBGb2VtbWVsCitNYXR0IEdyb3NzbworTWF0dCBIdW1waHJleQorTWF0dCBTbWFsbAorTWF0dGhldyBIYXd0aG9ybmUKK01hdHRoZXcgSW5nZXIKK01hdHRoZXcgS3VwZXJ1cyBIZXVuCitNYXR0aGV3IFdhdHNvbgorTWljaGFlbCBEYXZleQorTWljaGFlbCBKLiBTaWtvcnNreQorTWljaGFlbCBNY0NhbGx1bQorTWljaGFlbCBNb250dW9yaQorTWljaGFlbCBOZXdjb21iCitNaWNoZWFsIE55Z2FyZAorTWljaGFlbCBTYXVuZGVycworTWloYQorTWlrZSBSb2JlcnRzCittbm93b3N0YXdza2kKK05pY2sgQ2hhbGtvCitOaWNrIEZvcnRlc2N1ZQorTmljayBDcm9zc2xleQorTmljayBQZWxsb3cKK05pY29sYSBLZW4gQmFyb3p6aQorTmljbyBTZWVzc2xlCitOaWdlbCBNYWduYXkKK09saXZlciBNZXJrZWwKK09saXZlciBSb3NzbXVlbGxlcgorT3lzdGVpbiBHaXNuYXMKK1BhdHJpY2sgQy4gQmVhcmQKK1BhdHJpY2sgQ2hhbmV6b24KK1BhdHJpY2sgRy4gSGVjayAoR3VzIEhlY2spCitQYXRyaWNrIE1hcnRpbgorUGF1bCBBdXN0aW4KK1BhdWwgQ2hyaXN0bWFubgorUGF1bCBHYWxicmFpdGgKK1BhdWwgS2luZworUGF1bG8gR2FzcGFyCitQZXRlciBCLiBXZXN0CitQZXRlciBEb25hbGQKK1BldGVyIERvb3JuYm9zY2gKK1BldGVyIEh1bHN0CitQZXRlciBSZWlsbHkKK1BoaWxsaXAgV2VsbHMKK1BpZXJyZSBEZWxpc2xlCitQaWVycmUgRGl0dGdlbgorUiBIYW5kZXJzb24KK1JhbWkgT2phcmVzCitSYW5keSBXYXRsZXIKK1JhcGhhZWwgUGllcnF1aW4KK1JheSBXYWxkaW4KK1JpY2hhcmQgRXZhbnMKK1JpY2sgQmV0b24KK1JvYmVydCBBbmRlcnNvbgorUm9iZXJ0IFNoYXcKK1JvYmVydCBXYXRraW5zCitSb2JlcnRvIFNjYXJhbXV6emkKK1JvYmluIEdyZWVuCitSb2IgT3hzcHJpbmcKK1JvYiB2YW4gT29zdHJ1bQorUm9nZXIgVmF1Z2huCitSb21hbiBJdmFzaGluCitSb25lbiBNYXNoYWwKK1J1c3NlbGwgR29sZAorU2FtIFJ1YnkKK1Njb3R0IENhcmxzb24KK1Njb3R0IEVsbHN3b3J0aAorU2NvdHQgTS4gU3RpcmxpbmcKK1NlYW4gRWdhbgorU2VhbiBQLiBLYW5lCitTZWJhc3RpZW4gQXJvZAorU2hpcmF6IEthbmdhCitTZWJhc3RpYW4gS2FudGhhCitTaW1vbiBMYXcKK1N0ZWZhbiBCb2Rld2lnCitTdGVmYW5vIE1henpvY2NoaQorU3RlcGhhbiBTdHJpdHRtYXR0ZXIKK1N0ZXBoYW5lIEJhaWxsaWV6CitzdGVwaGFuCitTdGVwaGFuIE1pY2hlbHMKK1N0ZXBoZW4gQ2hpbgorU3RlcGhlbiBHb2V0emUKK1N0ZXZlIENvaGVuCitTdGV2ZSBMb3VnaHJhbgorU3RldmUgTW9yaW4KK1N0ZXZlIFdhZHN3b3J0aAorU3RldmVuIEUuIE5ld3RvbgorVGFrYXNoaSBPa2Ftb3RvCitUYW91ZmlrIFJvbWRoYW5lCitUYXJpcSBNYXN0ZXIKK1RyZWprYXogWGFvemEKK1Rob21hcyBCdXR6CitUaG9tYXMgQ2hyaXN0ZW4KK1Rob21hcyBDaHJpc3RlbnNlbgorVGhvbWFzIEhhYXMKK1Rob21hcyBRdWFzCitUaW0gRHJ1cnkKK1RpbSBGZW5uZWxsCitUaW1vdGh5IEdlcmFyZCBFbmRyZXMKK1RpbSBTdGVwaGVuc29uCitUb20gQmFsbAorVG9tIEJydXMKK1RvbSBDdW5uaW5naGFtCitUb20gRGltb2NrCitUb20gRXVnZWxpbmsKK1VscmljaCBTY2htaWR0CitWaWN0b3IgVG9uaQorV2FsZGVrIEhlcmthCitXaWxsIFdhbmcKK1dpbGxpYW0gRmVyZ3Vzb24KK1dvbGYgU2liZXJza2kKK1dvbGZnYW5nIEJhZXIKK1dvbGZnYW5nIEZyZWNoCitXb2xmZ2FuZyBXZXJuZXIKK1hhdmllciBIYW5pbgorWGF2aWVyIFdpdGRvdWNrCitZb2hhbm4gUm91c3NlbAorWXVqaSBZYW1hbm8KK1l2ZXMgTWFydGluCitaYWNoIEdhcm5lcgorWmRlbmVrIFdhZ25lcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvSU5TVEFMTCBiL3RydW5rL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjMTE2NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL0lOU1RBTEwKQEAgLTAsMCArMSwyIEBACitGb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBzZWUgdGhlIG1hbnVhbCBpbiB0aGUgZG9jcyBzdWJkaXJlY3RvcnkKK29yIG9ubGluZSBhdCA8aHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9pbmRleC5odG1sPi4KZGlmZiAtLWdpdCBhL3RydW5rL0tFWVMgYi90cnVuay9LRVlTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDg3NTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9LRVlTCkBAIC0wLDAgKzEsOTIxIEBACitUaGlzIGZpbGUgY29udGFpbnMgdGhlIFBHUCBrZXlzIG9mIHZhcmlvdXMgZGV2ZWxvcGVycy4KKworVXNlcnM6IHBncCA8IEtFWVMKKyAgICAgICBncGcgLS1pbXBvcnQgS0VZUworRGV2ZWxvcGVyczogCisgICAgICAgIHBncCAta3hhIDx5b3VyIG5hbWU+IGFuZCBhcHBlbmQgaXQgdG8gdGhpcyBmaWxlLgorICAgICAgICAocGdwayAtbGwgPHlvdXIgbmFtZT4gJiYgcGdwayAteGEgPHlvdXIgbmFtZT4pID4+IHRoaXMgZmlsZS4KKyAgICAgICAgKGdwZyAtLWxpc3Qtc2lncyA8eW91ciBuYW1lPgorICAgICAgICAgICAgICYmIGdwZyAtLWFybW9yIC0tZXhwb3J0IDx5b3VyIG5hbWU+KSA+PiB0aGlzIGZpbGUuCisKK1R5cGUgQml0cy9LZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKK3B1YiAgMTAyNC9GRUVDQUFFRCAxOTk4LzExLzExIFN0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGJvc3QuZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0BhcGFjaGUub3JnPgorCistLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KK1ZlcnNpb246IDIuNi4zaQorCittUUNOQXpaSm9pTUFBQUVFQU16aFV4VE9DMjBOcHJwNks0bkxUaUFSdCtFWGlpL2Rvdk5XV2NmelpjWVhpL2xYCityM3pwVVRUWnhsS1FwZDRSYUhqRm1HZ29PcmFaRTRqQ1JGQVJWY0ZKZ1ltR1VLcGNXSlpPN1lLTDM2V1VpelRNCisrZHlCMnljT3R6bHR5MVc1Vm1STDNGR3FvNjdwS0E5Ri9RSGczTlN1OWhZMVc5eFBQSzdLcTNmKzdLcnRBQVVSCit0Q0JUZEdWbVlXNGdRbTlrWlhkcFp5QThZbTlrWlhkcFowQmliM04wTG1SbFBva0FsUUlGRURaU3JHWEhjZ3lLCitqaVc5elFFQnNoRUVBTWxHNHFWaktwNC9hZ2RKRzU2TTZpeng5b2FLZWNGTFhIUUpyRlV5M3cyUHZaSEZZdFhjCitvc1hLb3JYNmJQckU4dUI1N014YlkyV2FwS2VWUm9kbEcwK2ozOXZBZjUwMWR1SzhxMnJrdGZXdDlDbDRKako0CitEYldoU1dmVjFjaTYydTJnQ3h3WVFlMjJGOVdoK3ZoT1I1Tks5UlRiU0todXBkbEZzbnJrL2k3eGlRQ1ZBd1VRCitOa21pSTY3S3EzZis3S3J0QVFHZHhRUUFsY0ZPelN2N0c2TTR1R2Jndnc3SUdncmh4N3Jhd3RJeXY5aExYZ1ZDCis3dWE5eGFaVjhHMEZsOWdoOFJuYmRjWjRSL2FUK0tJaUFGYXNsZlozdDZobEM0TVRibkFKcXZkUy9OTzk4WmtKCitZdm56WlNLSGZsQWJkNWd5RTdJVnhCQzkveFJsRi9XbHM1c1lOd2I2UmpvUkNhT2p4Ti95M1dDTGEzVmExMDF2Cit6TnkwSTFOMFpXWmhiaUJDYjJSbGQybG5JRHhpYjJSbGQybG5RR0Z3WVdOb1pTNXZjbWMraVFDVkF3VVFPeElvCitCSzdLcTNmKzdLcnRBUUduNmdQL1NCQUNkSGFrQTRILy9vdHB5RVNTcms0UG15T2FZRjBLeW9rNDNHZWUybVQrCittOStqWjNqTGNDMG9hdjZpSCtvdEwvbGhrOXQvSkRNOExqRDJrQWtkV1dvSXZ2dVB5Q3g5N2dPem9qSW8wVmUyCisxd3V4SlRGL1ZJand5T3RFOEZ6RTdwNHRrYzZFdWJWcGVaa1Y5UHE5SEZSQkNVY3lLSkRMbkY0dGJzdFNjTFU9Cis9T0JMZQorLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorCisKK3B1YiAgMTAyNEQvNTE4OTg1MDQgMjAwMS0wNS0yOSBDb25vciBNYWNOZWlsbCA8Y29ub3JAY29ydGV4ZWJ1c2luZXNzLmNvbS5hdT4KK3NpZyAzICAgICAgIDUxODk4NTA0IDIwMDEtMDUtMjkgICBDb25vciBNYWNOZWlsbCA8Y29ub3JAY29ydGV4ZWJ1c2luZXNzLmNvbS5hdT4KK3NpZyAgICAgICAgIDVGNkI4QjcyIDIwMDItMDEtMTEgICBTdGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0BhcGFjaGUub3JnPgordWlkICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm9yIE1hY05laWxsIDxjb25vckBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgNTE4OTg1MDQgMjAwMS0wNS0yOSAgIENvbm9yIE1hY05laWxsIDxjb25vckBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1Pgorc2lnICAgICAgICAgNUY2QjhCNzIgMjAwMi0wMS0xMSAgIFN0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+CitzdWIgIDEwMjRnL0QxRUNCQTVEIDIwMDEtMDUtMjkKK3NpZyAgICAgICAgIDUxODk4NTA0IDIwMDEtMDUtMjkgICBDb25vciBNYWNOZWlsbCA8Y29ub3JAY29ydGV4ZWJ1c2luZXNzLmNvbS5hdT4KKworLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCitWZXJzaW9uOiBHbnVQRyB2MS4yLjAgKEdOVS9MaW51eCkKKworbVFHaUJEc1RxeWdSQkFDaVpja05kY2xUbFFGb25MYUlLQkZHaE15MEtLQnl3MHg4WEE0aXdkYkNYdUY2eE5JYworSElGSGFqSjc0QUhjaFE0ZDh4dG9tQnk2Yjh5dkZnV1ZlYVplbnN2bjY5QmxMZXFHZHllSlJ6ZlB0NlRnUm56WgorMmVXaGIwSFhkRzNKd3hMLzJCYWJEaEhmczRZSk9yZ0IvdmhSRlFrdTZvQ01SaUJQdEpqMndlckQ2d0NnMC96cAoramFjWVR3NitDUitzVnZuZUNOeXlTRkVEL1IzajEwYzRSblI4ZGpndjFqS1Q4Q0tQdUhZcmF1cEk5SU5FZStJNgorN3FXanRKMDJHenZNTzZURWxBdFVzZjRheXN1NDVHZ3drd0VCbnVHNm1ZYjNQcTBWMmM1dEpjMkEzVGozRHJkUgoraTNIVU53dXJidXM3Nkkwc1B5eUVOUHUxMlFQZUM2bXZXTEVzeFZKOW8waFJLRmF5R3ZZVW1yd1dLOVVGTGp2cAorcDljWEJBQ0RIZ0xuN01BVkxxVWRZaFJyVWovTStHT1VwdkJpa0Vnb0pKckVVbWI1WDQrKytkZmZNaDVIQklPNAorNUxBMTFxRUt1TTJ4bktxT2lsUDdOTFlYejFGZTBvY3F2MGpzSEI0U3ByRlRUYWk3bWEzMXV3dVJRdkNRWFZ2MQoreUo1Q0xxWWRhNjRoL1VBMmttbVIyZGZvcG12RG9nWUVNei9IVTV2b296eGU3QkVJN2JRaFEyOXViM0lnVFdGagorVG1WcGJHd2dQR052Ym05eVFHRndZV05vWlM1dmNtYytpRmNFRXhFQ0FCY0ZBanNUcXlnRkN3Y0tBd1FERlFNQworQXhZQ0FRSVhnQUFLQ1JDQkJHUlBVWW1GQkRnSUFLQ1p6dFhxS2hLNmtYT25vR3k3b3BDTm1XVTBsd0Nnc1BEYQorNG0rcnVXM2NoMHJmYnF0Ujc1UzUyUitJUmdRUUVRSUFCZ1VDUEQ2ZVRnQUtDUkNpRVZyaFgydUxjcUNjQUtDcgorMVd5bHFqdTlZakJpNVR3ZWo5emU2OUpGQlFDZU9hTWdvNnlqbmtjVjNQblZJbkxsYU13UHI1cTBMVU52Ym05eQorSUUxaFkwNWxhV3hzSUR4amIyNXZja0JqYjNKMFpYaGxZblZ6YVc1bGMzTXVZMjl0TG1GMVBvaFhCQk1SQWdBWAorQlFJN0U2eE1CUXNIQ2dNRUF4VURBZ01XQWdFQ0Y0QUFDZ2tRZ1FSa1QxR0poUVRZMEFDZ21abUtoZUh6alBKcworNWh5YnB5dm52RWlQWXFZQW4yK3J5eGR0ejhYeU9NRXhHUm1ITmxoRzdzdnNpRVlFRUJFQ0FBWUZBancrbmxVQQorQ2drUW9oRmE0VjlyaTNKWVlBQ2cxV04rTkNwdGZLVlAxbWJySWErMGFqenRzaUlBbkFuK203MGl3UlJGWkN4cgoramNVTG9ZNVNqeVRMdVFFTkJEc1RxeTBRQkFDZnNDeEo2aUN0Z1g4empsVnRNc01mRHF1NzJ4NXNZYXRXS244YwordSs0T2o1bWkweDZhelpJaHdDYStLM2loTFZPeUcxbUNSbnp6dEdUSXhXWVJocTNURVNJVk9mZ20rTmdMR3JtQQorWFVURnlDVCsyMVRFeExDcHVWWkttVUhzV1hMeER0ZlExZGlQZVFwaVE4K0Z2Yi80akxHRmpGSXJRMlZqdEZRbgora3Vta1N3QURCZ1A5SDBiRjRoZE11VkVjU0o5aW14U29Kc2hjT09BM1ZkMitZaUNUWmhCeWdXTTQ5d1k1ak5vcworL0RBcklqTkNFNTNJbE91L1V0SEIyanFrU3FqRjBzb0dZc1VqZUNXb3VpVFA5aEx1TUtQam5xajlyeUpQVERLegorblRDWjRUdUI1Q3R6cktUbFdMbVBDUHBGc0dxZTRLak1lS2cvbXFHcWpQS2w5N3hnU3RLOU45R0lSZ1FZRVFJQQorQmdVQ094T3JMUUFLQ1JDQkJHUlBVWW1GQk1NNkFKc0YzRkZ5WkdFbWJ0OWFHRzFXL3Uwb0k5bWNMZ0NmUXlKKworYWFsYnNwYXplYTRKOXpnaTU5U1N3T009Cis9Y0JkUgorLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorCitwdWIgIDEwMjRSLzY5N0VDRUREIDIwMDAtMDQtMDYgSGVucmkgR29tZXogPGhnb21lekBzbGliLmZyPgorc2lnICAgICAgICAgNjk3RUNFREQgMjAwMC0wNC0wNiAgIEhlbnJpIEdvbWV6IDxoZ29tZXpAc2xpYi5mcj4KKworLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCitWZXJzaW9uOiBHbnVQRyB2MS4yLjAgKEdOVS9MaW51eCkKKworbVFDTkF6anN5ZHdBQUFFRUFNcHdGVS9jaTMvd1IzcnlDR3A5RXhyK1J4L2hUUTdoV0FKY1Z3OGVqbEJYbFQ0VAoreUlUbFJVczBIR2ZSV3hNRTJKNTVQdVhYc0lFUFp6amZvek50dk95cThXbExsSjdpYWl5V3hWUm9QSjI1c1NFagorQzlldG02d2pqNEU2NlpnenVFbFprbTFtNjl1RXNDSFBQTnV6MW9RL2cxTytTbUlWeElZaXJseHBmczdkQUFVUgordEJ4SVpXNXlhU0JIYjIxbGVpQThhR2R2YldWNlFITnNhV0l1Wm5JK2lRQ1ZBd1VRT096SjNJWWlybHhwZnM3ZAorQVFGUXlRUUFqMEQ5RzBoRUw3U1FHYVNDa2tvWHd2YW1RdzQyTjgrdE5tK2pmV0hXZEU0SEFpVmxoSm1JMkd5RAorc2RjWFZBY1I4UjdJTElSQjVBWTdhM2JGK3FNazByK3ZPNm9SODc4UktLbjlBdnRhQUlPbnJoNnRyMHRpUHdmNQorWERVTXlTeElXSkVGM1NtSkF5OUxxM2JBbDVHTXpaQ0ZIaVMwTlcyZ3RXZ21yL3UxUnVNPQorPTZsK0kKKy0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KKworcHViICAxMDI0Ui8zOTdEQ0FENSAyMDAyLTA3LTAzIEhlbnJpIEdvbWV6IDxoZ29tZXpAdXNlcnMuc291cmNlZm9yZ2UubmV0Pgorc2lnICAgICAgICAgMzk3RENBRDUgMjAwMi0wNy0wMyAgIEhlbnJpIEdvbWV6IDxoZ29tZXpAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCistLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KK1ZlcnNpb246IEdudVBHIHYxLjIuMCAoR05VL0xpbnV4KQorCittUUNOQXowaTBVVUFBQUVFQUxYZVBONklIbmUwVzk2WVJNblIrNEVYQjY0MDJRWTVmOFpMY25TVVpVSDU1RmIxCitxY1pHQmMzV1JLbFBpVXZ3QkQrZVZZZ0NwTlNYRi9IK29WMW1hd3hOSk41WHdxQkVwZlltWThNUklQY3FhNjFoCitiSmMzTEJTbTFxTmYwNUc1Q3d4ZWVkK09nVm0wcjFIQnk2REFnREhBcU5sa0M4RFovQlZncU1BNWZjclZBQVVSCit0Q3BJWlc1eWFTQkhiMjFsZWlBOGFHZHZiV1Y2UUhWelpYSnpMbk52ZFhKalpXWnZjbWRsTG01bGRENkpBSlVECitCUkE5SXRGRkZXQ293RGw5eXRVQkFTTnlBLzQ1OFQ4NExVVmhxcTZZOWZQQkFmY0ZNV1kya2VodURXc1FFWGtPCis0NlhvSytBbkZaQ2tLdXlETHFQSGNoVlVPNXBLL2daWXNESy94SmtmaDN1NEZURFRzZWNiOXdGbUlleWF5VklOCitTSThvNmw4RVp6RFgvUEd3cUV3enhIcmJRa0lnSWt0Tm41QXBJb2F6dmRCcGJrUWZOajF2cjJ3V29NWVBMQVdNCis4eHplY0E9PQorPVVtWjgKKy0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KKworcHViICAxMDI0RC8zMDdBMTBBNSAyMDAyLTA3LTE4IEhlbnJpIEdvbWV6IDxoZ29tZXpAdXNlcnMuc291cmNlZm9yZ2UubmV0Pgorc2lnIDMgICAgICAgMzA3QTEwQTUgMjAwMi0wNy0xOCAgIEhlbnJpIEdvbWV6IDxoZ29tZXpAdXNlcnMuc291cmNlZm9yZ2UubmV0Pgorc3ViICAyMDQ4Zy84NjJCOEY3MCAyMDAyLTA3LTE4CitzaWcgICAgICAgICAzMDdBMTBBNSAyMDAyLTA3LTE4ICAgSGVucmkgR29tZXogPGhnb21lekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKy0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorVmVyc2lvbjogR251UEcgdjEuMi4wIChHTlUvTGludXgpCisKK21RR2lCRDAydmJFUkJBQzF2OGZSNmdqRVJwYXo0VU1mZHkwaFJWV0NQU2JPZEYrU3dtL0llbmpWekVyY282emIKK01UYTEzdW1VTnJEUEJ5L3RUV2lDQ1pyT25xaTdmZ0R6V3FQRXFyWEpqS0FGVkxFV0U2TW1LeWxQUEVQRzEvYm0KK2lka05HRVJTQVpkdXZoS3Y3NzdQenZFSkovOGVHZTN3eS9POE5iZ0lqQ1B0cjRVa2x3Q1pTOGNGdXdDZzhvTU8KK1VkVDhxWlJ0emR4ZEF5dTFtNWZVYitNRC8zSUtKWVdYc2R0YjZpQnBoQ1U0Zi9Cb3lqVkM5RVpKMXl3THVpVk0KK3NpS2J1YURVYVhVOW5XY2JOS3YrZng4dVoxTmFhZHBmTG9rcXFobldjcG5TaXF3OEhOUjdTd3NGMUQzM3JrWEsKK080RlN1VnNzL3RJb3FHZFdGY0p5UGtQNHlQNXNoeHFSMzM1bmFyVncydkRhMCtCaVdrQUxiQTJxVnNTSWRaREIKK0xlRlpBLzQ3QU1CUzBVMkJSazJyUVQ4TG1NdUZsN21SK3dOQk00bjdGVUdkeHNHbjNUY1lkNHBYVE5yRVFQclYKK1lOZG9vS2xpa2dHazRoZ0ZuSUZYMDlTcG1pbXFncTBnb0Z1ZTgxcnR0VmRaWjR1ZXA4ZFRnaFk2Z3dtdmNPeFgKK2pBVGJoV1N0QmhkdTlCMzVremZIYysxUWloRDVaOTR1NHV5V0lWQkl6aWtjZGlZOExiUXFTR1Z1Y21rZ1IyOXQKK1pYb2dQR2huYjIxbGVrQjFjMlZ5Y3k1emIzVnlZMlZtYjNKblpTNXVaWFEraUZjRUV4RUNBQmNGQWowMnZiRUYKK0N3Y0tBd1FERlFNQ0F4WUNBUUlYZ0FBS0NSQVpNZGFFTUhvUXBZaWpBS0NDUDY4bmRVL2tUWFI5WEFLTHZpYkMKKzNTOCsxUUNmVUZRWXRlM0pvK01IS2FXanN1OUpHcHRSem8rNUFnMEVQVGE5M1JBSUFLbHNSSjVnT0dURnNtYVIKK1c5azZNSWg0Yy9NQ3k3SjdIVXhUNXhUZEhST2ErM3pVaCtGQUUvSmFPeDladFp0SDg2M0RGSEE4Y1A0TCt0cGkKK1BqQlQ2ZzJFOTRkd0djdUgvT2lTU0NUNEpTQnVrYkdiT3VMTGRtRlhxVWw4KzRnc0w5MFhhbDY3RnROTHd5TEcKKzFuN2dlTGlyMGJ5RCtPVDdWTEE1dys2RzBOT3BKRXZlVi9GSWEycUxnZFJaOHZ6NzN5YmdNaDE4aEJVclVtcm8KK2puY3AwcmxuMlZVN1ZDSDFDMmFDbEttN2tLNG1HQWpJRkl6S2JndUsra00zYjhOREhtWEtwVDZzeXlDdElNM2gKK3Bya1YxVFVDQUZxTEkzMmFTZGxUTjc5bHBlQTJ6RGdhOWs0LzRYL1JESHNGcFJOMm5lUkZHVE5VdHVVZ1lwUVEKK0U1eldCbU1BQXdVSC9SaUd4eWVCc2FkOTIzSXdFMStHQWp4RmwydHFGOXhXazBKNnlUblNLNG5maFlBRTlldlYKK2p3REVvazlqUmw0SUxDY1h4NllOL2QvbFdOdVNiQVJLSHovM2hMaVRvdVBwd2QzU1NKOGlzMng5UGdwSno1SlgKK2NEMHkxU2tiUEx2czNqSDNabWRjeFpwdUFtSmVJL3R5cHFGS0s1cFdQNDRvWElIK1hILzhuV0R0bUxFQmtnS1EKKy9BVFFXZW5NVG1aNk1JSjZhV0tXR2tPOVFTNmlZUnozUFBQR1ExTzhXMDJDZXByTTJ3QnRsYjhKMVozUnhOaE0KK3JaY2cvMVFpM1YzRDFISTR6dzZ0QUZtRGVCYjhKNFBhQlF6cWxoengyRUJUYmZ3TlBoVjhBbFB2cHhIRWVHR24KK3YrTzF5aFpyMzNTbnlaZElOTm9ORG4rb3dWTWRta29iZTlHSVJnUVlFUUlBQmdVQ1BUYTkzUUFLQ1JBWk1kYUUKK01Ib1FwUnNUQUo0cXN0M01oTG00OGZCQUVuenV6aS9CSUtyK0FnQ2ZZYUNCL0F2UG9uY1FiSGM4QmNOR1JpbVIKK1A5QT0KKz1oUWh6CistLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCisKK3B1YiAgMTAyNEQvRURGNjJDMzUgMjAwMi0wNC0xMCBNYWdlc2ggVW1hc2Fua2FyIDx1bWFnZXNoQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICBFREY2MkMzNSAyMDAyLTA0LTEwICAgTWFnZXNoIFVtYXNhbmthciA8dW1hZ2VzaEBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgNUY2QjhCNzIgMjAwMy0wMy0wNyAgIFN0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+CitzdWIgIDEwMjRnL0I1RkZDNTNGIDIwMDItMDQtMTAKK3NpZyAgICAgICAgIEVERjYyQzM1IDIwMDItMDQtMTAgICBNYWdlc2ggVW1hc2Fua2FyIDx1bWFnZXNoQGFwYWNoZS5vcmc+CisKKy0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorVmVyc2lvbjogR251UEcgdjEuMi4wIChHTlUvTGludXgpCisKK21RR2lCRHkwZWJnUkJBRHVLSUtEOFB1SjR3S0VWMWgyQXByd0pqeENSeDh2bjQ4WE53ZkxadXZodzhjcEFydEsKK3Jad2hvR1BQVVBFRVhndFROZXJsS3E0VndwQXdjbnZSejdvQy83YVdrVWJjUjJzQXloZmUyc2NvaHdQZ3c3WHYKKytpc1dDME5EUGRyeHZYRy9QVU9HL2NuRUx1bnI1MXlteWJCcUJ4VWQyZ01oWUl4UG82N0QrWVBZTHdDZ3djWnAKK3ljLzZrSmExMTZFU1dIcnRpMzQyR0Q4RC8xc3JwblJzOUNpUzFEUUYxdVoxd1c0dnpqNFZENjF0S3NqZFdEOEQKK1Y1NzNSMjJpTURMU2o0b01CNTM2V3hVSDdzbno4WHNBS20vcGVxSjZHOW0wc210bVdBMWFnbzV5elFqNzBXcUYKK3h6V0JoSG4ySS9ZZkFROHBiMnM5cTFsQ2xqOGVsbkN4VDY1TDI3eWRCQVp0ZWVqYjJWcWp0UTZpR3k4NlBVVDIKK3dSVXZCQURabW9WMWVJWkpFTTVObnhCdjFFdHZSWVp0SVFFelo4ZE8yQTFMT1M3cWxWcjhJeXBsak5QTEdoelgKK1ZITnZWc2pDOVFNVVNXZUJzRGVkdlFIUTNoSnBJTW5USTMyWEUxVjRnWDA2Z2ZWVFpkaGYyZkxUdHduc0hacDAKK291bXFzaEdEVlJoTkpKZERZTGlreFdPeE9ma052ZUtFcUpGdnR1QlIrWnFxbHVRS2ViUWxUV0ZuWlhOb0lGVnQKK1lYTmhibXRoY2lBOGRXMWhaMlZ6YUVCaGNHRmphR1V1YjNKblBvaFhCQk1SQWdBWEJRSTh0SG00QlFzSENnTUUKK0F4VURBZ01XQWdFQ0Y0QUFDZ2tRNzZQbmVlMzJMRFdTUndDZmVBU1dYdnBkdDdiU0ZQTXRzelUvN3VQRWt0c0EKK24yM21ZVU41V0tKQTFacmVXKzBDY1oyRVNuT3ZpRVlFRXhFQ0FBWUZBajVvZ1lnQUNna1FvaEZhNFY5cmkzSVcKK1lBQ2dzeEdpZzBQTDBNODZySnNBL0lwWGpCZGczeXNBb0p6c29VWi83czJCeERmekYvRlJUVkl6UytUTXVRRU4KK0JEeTBlYjhRQkFDQlZiOVlESlJwOUlyem1xNzFKZjlGSVB3KzRnL2NXcEYzdC9FYjdlU3pNY092VEFYeU5JV3oKK2FhT2pIcmU3bEZjdEhmcThscy82Z1I3dXFhamlBbmZRY2ZUY3U3cHArRjVLc1UwRW1idDgzU0Z6WjNhb0p3RVQKK21CL0xxVXlyckdEaXVlM2xVK2ZsSk83VW1jc1J2dGswK0JEa3lDZUI5SGdmZHBYYkJMQ3l1d0FEQlFQK1BOeFgKKzRlMXRnM1pKby94TkVuRDJSZTNIam1RUnJyMFJZSkxVR2pnUXJBRU9OU2dvd3gzSVc4L0pzc21OSlZqblltMHEKK2pTS3NiOHJlcmdDRkpoUE5aOERkL2swMHBLY3JxK0lONmo3V1RZTHFQY2U4N3pyR0FaVXRtRHdEU3A1bXh5NUUKK3hXSkp4c2dCUGs0WUJRTHpKdDIxQTNCZ0svaTI0U3plMlZMYmFadUlSZ1FZRVFJQUJnVUNQTFI1dndBS0NSRHYKK28rZDU3ZllzTmE4eEFKNG1MZm9uWmJkNjQrWVk5cmZ2aEloM1ZzbDNBQUNlTFBQS3RtYTJLNlhDZmhUQkVEbmoKK2h6U3I0dm89Cis9bEJmRgorLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorcHViICAxMDI0RC8yNjVCNEM2MyAyMDAzLTA4LTE4IEFudG9pbmUgTGV2eS1MYW1iZXJ0IChBcGFjaGUgQW50IENvbW1pdHRlcikgPGFudG9pbmVAYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgIDI2NUI0QzYzIDIwMDMtMTItMDYgICBBbnRvaW5lIExldnktTGFtYmVydCAoQXBhY2hlIEFudCBDb21taXR0ZXIpIDxhbnRvaW5lQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICA1RjZCOEI3MiAyMDAzLTEyLTEyICAgU3RlZmFuIEJvZGV3aWcgPGJvZGV3aWdAYXBhY2hlLm9yZz4KK3VpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRvaW5lIExldnktTGFtYmVydCAoQXBhY2hlIEFudCBDb21taXR0ZXIpIDxhbnRvaW5lQGFudGJ1aWxkLmNvbT4KK3NpZyAzICAgICAgIDI2NUI0QzYzIDIwMDMtMDgtMTggICBBbnRvaW5lIExldnktTGFtYmVydCAoQXBhY2hlIEFudCBDb21taXR0ZXIpIDxhbnRvaW5lQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICA1RjZCOEI3MiAyMDAzLTEyLTEyICAgU3RlZmFuIEJvZGV3aWcgPGJvZGV3aWdAYXBhY2hlLm9yZz4KK3N1YiAgMTAyNGcvQTMwNjAzOTMgMjAwMy0wOC0xOAorc2lnICAgICAgICAgMjY1QjRDNjMgMjAwMy0wOC0xOCAgIEFudG9pbmUgTGV2eS1MYW1iZXJ0IChBcGFjaGUgQW50IENvbW1pdHRlcikgPGFudG9pbmVAYXBhY2hlLm9yZz4KKworLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCitWZXJzaW9uOiBHbnVQRyB2MS4yLjIgKE1pbmdXMzIpCisKK21RR2lCRDlBem1jUkJBQ01xZ2I3SUZ2Qy9uTHh3N21VQWdIRU5lWlhZM0pPUUo4d1ZCZXZJYmJNRWVGdnpIRTIKK2RpRnlkcVVYb2NQZXhkdVlyMGFoa2YwMzNXdldkQWlOcURMZlZXL0hGT3NjMVRwamJIa3FQVUh0SjYyWWE1dGcKK25INFVHTjlCWVpmTWJmVkRPU3o0MWxZd21mSzVIWWdwWk4vc0JRQlNLZjJxZ29GQitMeFlhYWU4WXdDZ3JXbHUKK2ZZaGY3ZmtLYmJkU2YzQkdTNjdnZ05rRC8wVnZrWGt3MVNFblBhcXJrS0drUEtvbUNUYjJhdUd4Y1lZSTMvclAKKzFtK1NHUmYwZ0UxTnRvY21JRWl0aVI2V3ZmS1Vqb01BWFNDcDVLZG5VWG1POXJ3emtNMDAyS0NBN0s1Q1krZS8KKzJiTER1aVEzck5pRDRtRmZHNk0rVW5tWitHTUZiYTFwOUNwNFBxTE5Mc0NIejY3dDdoRXNzY1RaUThtWjl4S00KKytHQ3NBLzlQK1hGTTdKRG45TUxoWWFiOXFvMUNrY2VCa3RoVVA2aldHanVBWjAwZWxtQkNrcGt6TnY1YUl6c3MKK3hpaDJHcGFVL3RtY01qdzhGR3AwZFR3enFkcG1iWkJManVuUm51QlRpcjRtNGw1Rzlyd2w0SmJmSzFQVnFrNGEKK1ZLa2g5VzcveXFCY0VmTmNzZkpPOWNxYVErUHpjbkNvRGlEOVVIRUJZelVockNLd2hMUkNRVzUwYjJsdVpTQk0KK1pYWjVMVXhoYldKbGNuUWdLRUZ3WVdOb1pTQkJiblFnUTI5dGJXbDBkR1Z5S1NBOFlXNTBiMmx1WlVCaGJuUmkKK2RXbHNaQzVqYjIwK2lGc0VFeEVDQUJzRkFqOUF6bWNHQ3drSUJ3TUNBeFVDQXdNV0FnRUNIZ0VDRjRBQUNna1EKK2hoVFdxeVpiVEdNbk9nQ2VKVjJnSSsxQ0l4TVI3ZGNJaFhqUGtpdXNyZUlBbjJTR09zUFMwbzg5bDBFSVZ1YzkKK0oyRjAzYUIraUVZRUV4RUNBQVlGQWovWndpb0FDZ2tRb2hGYTRWOXJpM0o4Q0FDZ2lHbGgrdGQwQkFuSlBxMTkKK292RVFSMkRKMDJNQW9MUDIwM0VGK0JMUHB5a2VUY0dwOFVFV21lR1F0RUJCYm5SdmFXNWxJRXhsZG5rdFRHRnQKK1ltVnlkQ0FvUVhCaFkyaGxJRUZ1ZENCRGIyMXRhWFIwWlhJcElEeGhiblJ2YVc1bFFHRndZV05vWlM1dmNtYysKK2lGNEVFeEVDQUI0RkFqL1NTd1lDR3dNR0N3a0lCd01DQXhVQ0F3TVdBZ0VDSGdFQ0Y0QUFDZ2tRaGhUV3F5WmIKK1RHT2gvUUNmYnJTb2lwTWxpenlHVDZjOEJPUEVkOXp6ZmkwQW5SUlRxVER6WHpzR2s0Q0cvQkpNRTlDQ203VHMKK2lFWUVFeEVDQUFZRkFqL1p3aU1BQ2drUW9oRmE0VjlyaTNJT1ZBQ2doMlFIUzErY1Zqdk00ZUxqbHMxYkp3V2kKK281SUFvTHRBc3pIcndIUzVxcmh2cjJydG5seXl5VjJndVFFTkJEOUF6bWtRQkFDTnBCZnFpMlB3ZW96Q3R4b1gKK1BxektkUkRLcUN3N1RPckRSNmxiUDN6L292LzFTTjVWYzBYcU56QlNHcXdCY21HV3RuZUFCa1g3bjR1ekpyQzUKK3d2WC9UWi9Ea012eXBQeWVOVk11Ky9aTWx6ZGJ4MDZPVURLcjZGeS9OdGFJN2NOMXJ3K0lneXYyMlE4aWxoaGcKK3MvNVJkajg0RXRKa1dRalZSbWw2d1hTQVp3QURCd1AvVHF5aE9DNHNBNVlyZVBZR0g4aTQ2aDBTVTlkWGpmRUYKK0ppakM4dlhaK0JOUUhRVkszZmpFWGVkWkw4WnZ2cDFic011N011ejlTTW5xeWdNMXVucDJOR3hMUmQvOTMxNXAKK1FoMFZTdFlLbjB4cTEzeWJPS3IwR3N5eDV5eWwzTnpsdS8xcUFSMGVzL3pONGpWNy9JUWkzUjJHT3ZlemNwSFgKK21rYnNZaVpBaHUySVJnUVlFUUlBQmdVQ1AwRE9hUUFLQ1JDR0ZOYXJKbHRNWXhjc0FLQ1NKSlVBQmxYWW5MQmoKK2IrV3RtQXp1MEpqWk5BQ2RGSjRLSUFUSkRLLzVhakZxNStpck9wb2RvSGM9Cis9VW9tUgorLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorCitwdWIgICAxMDI0RC81RjZCOEI3MiAyMDAxLTA1LTI4Cit1aWQgICAgICAgICAgICAgICAgICBTdGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0BhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDVGNkI4QjcyIDIwMDEtMDUtMjggIFN0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgNTE4OTg1MDQgMjAwMi0wMS0xMSAgQ29ub3IgTWFjTmVpbGwgPGNvbm9yQGNvZGVmZWVkLmNvbT4KK3NpZyAzICAgICAgICBGODgzNDFEOSAyMDAzLTAzLTE3ICBMYXJzIEVpbGVicmVjaHQgPGxhcnNAZWlsZWJyZWNodC5vcmc+CitzaWcgMyAgICAgICAgMjI2MUQwNzMgMjAwMy0wMy0xNyAgQXN0cmlkIEtlc3NsZXIgKEtlc3MpIDxrZXNzQGtlc3MtbmV0LmRlPgorc2lnICAgICAgICAgIDIxRDBBNzFCIDIwMDMtMDMtMTcgIERpcmstV2lsbGVtIHZhbiBHdWxpayAoaHR0cDovL3d3dy5hbnl3aS5jb20vIC0gU2VuaW9yIHBhcnRuZXIpIDxkaXJreEBhbnl3aS5jb20+CitzaWcgICAgICAgICAgNzVBNjc2OTIgMjAwMy0wMy0xOCAgRXJpayBBYmVsZSA8ZXJpa0Bjb2RlZmFrdG9yLmRlPgorc2lnICAgICAgICAgIEIzQjJBMTJDIDIwMDMtMDUtMjAgIGN0IG1hZ2F6aW5lIENFUlRJRklDQVRFIDxwZ3BDQUBjdC5oZWlzZS5kZT4KK3NpZyAzICAgICAgICA4MTAzQTM3RSAyMDAzLTA0LTA0ICBBbmRyZSBNYWxvIDxuZEBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDVGNkI4QjcyIDIwMDEtMDUtMjggIFN0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgRDYyOThGMDEgMjAwMy0wNC0yNyAgUGF1bG8gSGVucmlxdWUgR2FzcGFyIEpvcmdlIDxwam9yZ2VAYXNhdG5ldC5jb20uYnI+CitzaWcgICAgICAgICAgMENBQTY4QjQgMjAwNC0xMS0xMSAgUGF0cmljayBSZW50c2NoIDxwYXRyaWNrLnJlbnRzY2hAc3Vpc3NpbWFnZS5jaD4KK3NpZyAgICAgICAgICAyRkUyOEJDRiAyMDA1LTA3LTAxICBIYXJhbGQgV2lsaGVsbSAoSEFXSSkgPEhhcmFsZC5XaWxoZWxtQGhhd2kuZGU+CitzaWcgICAgICAgICAgNTc5MzQ5OEYgMjAwNS0wNy0yMSAgVGltIEVsbGlzb24gPHRpbUBlbGxpc29uLm5hbWU+CitzaWcgICAgICAgICAgRTQxMzYzOTIgMjAwNS0wNy0yMSAgTm9lbCBKLiBCZXJnbWFuIDxub2VsQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgODQwOEY3NTUgMjAwNS0wNy0yMSAgQ2hyaXN0aWFuIEdlaXNlcnQgPGNocmlzZ0BhcGFjaGUub3JnPgorc2lnIDIgICAgICAgIEZDMjQzRjNDIDIwMDUtMDctMjAgIEhlbmsgUC4gUGVubmluZyA8cGVubmluZ0Bjcy51dS5ubD4KK3NpZyAzICAgICAgICBFQzE0MEI4MSAyMDA1LTA3LTIwICBEaXJrLVdpbGxlbSB2YW4gR3VsaWsgKGh0dHA6Ly93d3cuYW55d2kuY29tLyAtIFNlbmlvciBwYXJ0bmVyKSA8ZGlya3hAYW55d2kuY29tPgorc2lnIDMgICAgICAgIEVFNjVFMzIxIDIwMDUtMDctMjAgIE1hcnRpbiBLcmFlbWVyIDxtYXJ0aW5AYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICBBOTlGNzVERCAyMDA1LTA3LTIxICBSb2RlbnQgb2YgVW51c3VhbCBTaXplIDxjb2FyQHBocC5uZXQ+CitzaWcgMyAgICAgICAgMzY0MkNCNEIgMjAwNS0wNy0yMCAgTWFydGluIEtyYWVtZXIgPG1hcnRpbkBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDMwMkRBNTY4IDIwMDUtMDctMjEgIFJvZGVudCBvZiBVbnVzdWFsIFNpemUgKERTQSkgPGNvYXJAQXBhY2hlLk9yZz4KK3NpZyAzICAgICAgICAyQzMxMkQyRiAyMDA1LTA3LTIxICBSb2RlbnQgb2YgVW51c3VhbCBTaXplIDxjb2FyQHBocC5uZXQ+CitzaWcgMyAgICAgICAgQ0M3OEM4OTMgMjAwNS0wNy0yMiAgUmljaCBCb3dlbiA8cmJvd2VuQHJjYm93ZW4uY29tPgorc2lnIDMgICAgICAgIEUyRDc3NERGIDIwMDUtMDctMjIgIFN5bHZhaW4gV2FsbGV6IDxzeWx2YWluQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgRTA0RjlBODkgMjAwNS0wNy0yMiAgUm95IFQuIEZpZWxkaW5nIDxmaWVsZGluZ0BnYml2LmNvbT4KK3NpZyAzICAgICAgICAwMTVBRkM4QSAyMDA1LTA3LTIyICBCZXJ0cmFuZCBEZWxhY3JldGF6IDxiZGVsYWNyZXRhekBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDg3MzE1QzMxIDIwMDUtMDctMjMgIFJhcGhh62wgTHV0YSA8cmFwaGFlbC5sdXRhQGFwdGl3YW4uY29tPgorc2lnIDMgICAgICAgIEU0MUVEQzdFIDIwMDUtMDctMjQgIENhcnN0ZW4gWmllZ2VsZXIgPGN6aWVnZWxlckBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEYzOUIzNzUwIDIwMDUtMDctMjQgIENvbG0gTWFjQ2FydGhhaWdoIDxjb2xtQHN0ZGxpYi5uZXQ+CitzaWcgICAgICAgICAgMUNENDg2MUYgMjAwNS0wNy0yNSAgRXJhbiBDaGludGhha2EgPGNoaW50aGFrYUBhcGFjaGUub3JnPgorc2lnICAgICAgICAgIEVBMUJBMzhEIDIwMDUtMDctMjUgIEFqaXRoIEhhcnNoYW5hIFJhbmFiYWh1IChNYWRlIGF0IEFwYWNoZWNvbiAyMDA1KSA8YWppdGhAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICAzMzNFNEU4NCAyMDA1LTA3LTI2ICBDaGF0aHVyYSBLYW1hbGFuYXRoIEhlcmF0aCAoQXBhY2hlY29uIEV1cm9wZSAyMDA1KSA8Y2hhdGh1cmFAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICAxNTI5MjRBRiAyMDA1LTA3LTI5ICBTYW5kZXIgVGVtbWUgPHNhbmRlckB0ZW1tZS5uZXQ+CitzaWcgMyAgICAgICAgOUM4NTIyMkIgMjAwNS0wNy0yNCAgSGVubmluZyBTY2htaWVkZWhhdXNlbiA8aHBzQGludGVybWV0YS5kZT4KK3NpZyAzICAgICAgICA5OTc4QUY4NiAyMDA1LTA3LTI1ICBbVXNlciBJRCBub3QgZm91bmRdCitzaWcgMyAgICAgICAgMkE2MjNGNzIgMjAwNS0wNy0yNSAgW1VzZXIgSUQgbm90IGZvdW5kXQorc2lnIDMgICAgICAgIEY4RUEyOTY3IDIwMDUtMDctMjYgIFtVc2VyIElEIG5vdCBmb3VuZF0KK3NpZyAzICAgICAgICBDMTUyNDMxQSAyMDA1LTA3LTI3ICBTdGV2ZSBMb3VnaHJhbiA8c3RldmVsQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgREU4ODVERDMgMjAwNS0xMS0yNSAgU2FuZGVyIFN0cmlrZXIgPHN0cmlrZXJAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICBDRTQxOUM4RiAyMDA3LTAxLTA1ICBVcGF5YXZpcmEgPHVwYXlhdmlyYUBvZG9rby5jby51az4KK3NpZyAgICAgICAgICBFMjIyREU0RiAyMDA3LTA1LTAyICBNYXRoaWFzIEhlcmJlcnRzIDxNYXRoaWFzLkhlcmJlcnRzQGlyb2lzZS5uZXQ+CitzaWcgICAgICAgICAgOTExMjAzRTQgMjAwNy0wNS0wMiAgW1VzZXIgSUQgbm90IGZvdW5kXQorc2lnICAgICAgICAgIEYxMkY2MDcyIDIwMDctMDUtMDUgIFtVc2VyIElEIG5vdCBmb3VuZF0KK3NpZyAzICAgICAgICA5OTBFRDRBQSAyMDA3LTA1LTAyICBLbnV0IEFuZGVycyBIYXRsZW4gPGthaGF0bGVuQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgMzExQTNERTUgMjAwNy0wNS0wNSAgUnVlZGlnZXIgUGx1ZW0gPHJwbHVlbUBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDg4ODE3NDAyIDIwMDctMDUtMDYgIFRob21hcyBWYW5kYWhsIDx0aG9tYXNAdmFuZGFobC5vcmc+CitzaWcgICAgICAgICAgNUYyOTg4MjQgMjAwNy0wNS0wNiAgU2ltb24gUGVwcGluZyA8c3BlcHBpbmdAbGV2ZXJrcnVpZC5ldT4KK3NpZyAgICAgICAgICA0Q0VFRDc1RiAyMDA3LTA1LTA2ICBOaWNrIEJ1cmNoIDxuaWNrQGdhZ3JhdmFyci5vcmc+CitzaWcgICAgICAgICAgNDM1OEM1ODQgMjAwNy0wNS0wNiAgVmluY2VudCBIZW5uZWJlcnQgPHZoZW5uZWJlcnRAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICAwQjdFNkNGQSAyMDA3LTA1LTA2ICBTYW1pIFNpcmVuIDxzaXJlbkBhcGFjaGUub3JnPgorc2lnICAgICAgICAzIDAxNTMwMjM1IDIwMDctMDUtMDIgIEx1YyBNYWlzb25vYmUgKFNwYWNlUm9vdHMpIDxsdWNAc3BhY2Vyb290cy5vcmc+CitzaWcgICAgICAgICAgNDA1ODE4MzcgMjAwNy0wNS0wOCAgTmljayBLZXcgPG5pY2tAd2VidGhpbmcuY29tPgordWlkICAgICAgICAgICAgICAgICAgU3RlZmFuIEJvZGV3aWcgPHN0ZWZhbi5ib2Rld2lnQGZyZWVuZXQuZGU+CitzaWcgMyAgICAgICAgNUY2QjhCNzIgMjAwMy0wMy0wNyAgU3RlZmFuIEJvZGV3aWcgPGJvZGV3aWdAYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICBGODgzNDFEOSAyMDAzLTAzLTE3ICBMYXJzIEVpbGVicmVjaHQgPGxhcnNAZWlsZWJyZWNodC5vcmc+CitzaWcgMyAgICAgICAgMjI2MUQwNzMgMjAwMy0wMy0xNyAgQXN0cmlkIEtlc3NsZXIgKEtlc3MpIDxrZXNzQGtlc3MtbmV0LmRlPgorc2lnICAgICAgICAgIDIxRDBBNzFCIDIwMDMtMDMtMTcgIERpcmstV2lsbGVtIHZhbiBHdWxpayAoaHR0cDovL3d3dy5hbnl3aS5jb20vIC0gU2VuaW9yIHBhcnRuZXIpIDxkaXJreEBhbnl3aS5jb20+CitzaWcgICAgICAgICAgNzVBNjc2OTIgMjAwMy0wMy0xOCAgRXJpayBBYmVsZSA8ZXJpa0Bjb2RlZmFrdG9yLmRlPgorc2lnICAgICAgICAgIEIzQjJBMTJDIDIwMDMtMDUtMjAgIGN0IG1hZ2F6aW5lIENFUlRJRklDQVRFIDxwZ3BDQUBjdC5oZWlzZS5kZT4KK3NpZyAzICAgICAgICA4MTAzQTM3RSAyMDAzLTA0LTA0ICBBbmRyZSBNYWxvIDxuZEBhcGFjaGUub3JnPgorc2lnICAgICAgICAgIDUxODk4NTA0IDIwMDUtMDYtMjEgIENvbm9yIE1hY05laWxsIDxjb25vckBjb2RlZmVlZC5jb20+CitzaWcgICAgICAgICAgMENBQTY4QjQgMjAwNC0xMS0xMSAgUGF0cmljayBSZW50c2NoIDxwYXRyaWNrLnJlbnRzY2hAc3Vpc3NpbWFnZS5jaD4KK3NpZyAgICAgICAgICAyRkUyOEJDRiAyMDA1LTA3LTAxICBIYXJhbGQgV2lsaGVsbSAoSEFXSSkgPEhhcmFsZC5XaWxoZWxtQGhhd2kuZGU+CitzaWcgICAgICAgICAgNTc5MzQ5OEYgMjAwNS0wNy0yMSAgVGltIEVsbGlzb24gPHRpbUBlbGxpc29uLm5hbWU+CitzaWcgICAgICAgICAgODQwOEY3NTUgMjAwNS0wNy0yMSAgQ2hyaXN0aWFuIEdlaXNlcnQgPGNocmlzZ0BhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEVDMTQwQjgxIDIwMDUtMDctMjAgIERpcmstV2lsbGVtIHZhbiBHdWxpayAoaHR0cDovL3d3dy5hbnl3aS5jb20vIC0gU2VuaW9yIHBhcnRuZXIpIDxkaXJreEBhbnl3aS5jb20+CitzaWcgMyAgICAgICAgRUU2NUUzMjEgMjAwNS0wNy0yMCAgTWFydGluIEtyYWVtZXIgPG1hcnRpbkBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEE5OUY3NUREIDIwMDUtMDctMjEgIFJvZGVudCBvZiBVbnVzdWFsIFNpemUgPGNvYXJAcGhwLm5ldD4KK3NpZyAzICAgICAgICAzNjQyQ0I0QiAyMDA1LTA3LTIwICBNYXJ0aW4gS3JhZW1lciA8bWFydGluQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgMzAyREE1NjggMjAwNS0wNy0yMSAgUm9kZW50IG9mIFVudXN1YWwgU2l6ZSAoRFNBKSA8Y29hckBBcGFjaGUuT3JnPgorc2lnIDMgICAgICAgIDJDMzEyRDJGIDIwMDUtMDctMjEgIFJvZGVudCBvZiBVbnVzdWFsIFNpemUgPGNvYXJAcGhwLm5ldD4KK3NpZyAzICAgICAgICBDQzc4Qzg5MyAyMDA1LTA3LTIyICBSaWNoIEJvd2VuIDxyYm93ZW5AcmNib3dlbi5jb20+CitzaWcgMyAgICAgICAgRTJENzc0REYgMjAwNS0wNy0yMiAgU3lsdmFpbiBXYWxsZXogPHN5bHZhaW5AYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICBFMDRGOUE4OSAyMDA1LTA3LTIyICBSb3kgVC4gRmllbGRpbmcgPGZpZWxkaW5nQGdiaXYuY29tPgorc2lnIDMgICAgICAgIDg3MzE1QzMxIDIwMDUtMDctMjMgIFJhcGhh62wgTHV0YSA8cmFwaGFlbC5sdXRhQGFwdGl3YW4uY29tPgorc2lnIDMgICAgICAgIEU0MUVEQzdFIDIwMDUtMDctMjQgIENhcnN0ZW4gWmllZ2VsZXIgPGN6aWVnZWxlckBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEYzOUIzNzUwIDIwMDUtMDctMjQgIENvbG0gTWFjQ2FydGhhaWdoIDxjb2xtQHN0ZGxpYi5uZXQ+CitzaWcgICAgICAgICAgMUNENDg2MUYgMjAwNS0wNy0yNSAgRXJhbiBDaGludGhha2EgPGNoaW50aGFrYUBhcGFjaGUub3JnPgorc2lnICAgICAgICAgIEVBMUJBMzhEIDIwMDUtMDctMjUgIEFqaXRoIEhhcnNoYW5hIFJhbmFiYWh1IChNYWRlIGF0IEFwYWNoZWNvbiAyMDA1KSA8YWppdGhAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICAzMzNFNEU4NCAyMDA1LTA3LTI2ICBDaGF0aHVyYSBLYW1hbGFuYXRoIEhlcmF0aCAoQXBhY2hlY29uIEV1cm9wZSAyMDA1KSA8Y2hhdGh1cmFAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICAxNTI5MjRBRiAyMDA1LTA3LTI5ICBTYW5kZXIgVGVtbWUgPHNhbmRlckB0ZW1tZS5uZXQ+CitzaWcgMyAgICAgICAgOUM4NTIyMkIgMjAwNS0wNy0yNCAgSGVubmluZyBTY2htaWVkZWhhdXNlbiA8aHBzQGludGVybWV0YS5kZT4KK3NpZyAzICAgICAgICA5OTc4QUY4NiAyMDA1LTA3LTI1ICBbVXNlciBJRCBub3QgZm91bmRdCitzaWcgMyAgICAgICAgMkE2MjNGNzIgMjAwNS0wNy0yNSAgW1VzZXIgSUQgbm90IGZvdW5kXQorc2lnIDMgICAgICAgIEY4RUEyOTY3IDIwMDUtMDctMjYgIFtVc2VyIElEIG5vdCBmb3VuZF0KK3NpZyAzICAgICAgICBDMTUyNDMxQSAyMDA1LTA3LTI3ICBTdGV2ZSBMb3VnaHJhbiA8c3RldmVsQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgREU4ODVERDMgMjAwNS0xMS0yNSAgU2FuZGVyIFN0cmlrZXIgPHN0cmlrZXJAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICBFMjIyREU0RiAyMDA3LTA1LTAyICBNYXRoaWFzIEhlcmJlcnRzIDxNYXRoaWFzLkhlcmJlcnRzQGlyb2lzZS5uZXQ+CitzaWcgICAgICAgICAgOTExMjAzRTQgMjAwNy0wNS0wMiAgW1VzZXIgSUQgbm90IGZvdW5kXQorc2lnICAgICAgICAgIEYxMkY2MDcyIDIwMDctMDUtMDUgIFtVc2VyIElEIG5vdCBmb3VuZF0KK3NpZyAzICAgICAgICA5OTBFRDRBQSAyMDA3LTA1LTAyICBLbnV0IEFuZGVycyBIYXRsZW4gPGthaGF0bGVuQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgMzExQTNERTUgMjAwNy0wNS0wNSAgUnVlZGlnZXIgUGx1ZW0gPHJwbHVlbUBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIDg4ODE3NDAyIDIwMDctMDUtMDYgIFRob21hcyBWYW5kYWhsIDx0aG9tYXNAdmFuZGFobC5vcmc+CitzaWcgICAgICAgICAgNENFRUQ3NUYgMjAwNy0wNS0wNiAgTmljayBCdXJjaCA8bmlja0BnYWdyYXZhcnIub3JnPgorc2lnICAgICAgICAgIDQzNThDNTg0IDIwMDctMDUtMDYgIFZpbmNlbnQgSGVubmViZXJ0IDx2aGVubmViZXJ0QGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgMEI3RTZDRkEgMjAwNy0wNS0wNiAgU2FtaSBTaXJlbiA8c2lyZW5AYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICBERTg4ODRBMCAyMDA3LTA1LTA3ICBYYXZpZXIgSGFuaW4gPHhhdmllci5oYW5pbkBnbWFpbC5jb20+CitzaWcgICAgICAgIDMgMDE1MzAyMzUgMjAwNy0wNS0wMiAgTHVjIE1haXNvbm9iZSAoU3BhY2VSb290cykgPGx1Y0BzcGFjZXJvb3RzLm9yZz4KK3NpZyAgICAgICAgICA0MDU4MTgzNyAyMDA3LTA1LTA4ICBOaWNrIEtldyA8bmlja0B3ZWJ0aGluZy5jb20+Cit1aWQgICAgICAgICAgICAgICAgICBTdGVmYW4gQm9kZXdpZyA8c3RlZmFuQHNhbWFmbG9zdC5kZT4KK3NpZyAzICAgICAgICA1RjZCOEI3MiAyMDA1LTA1LTMxICBTdGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0BhcGFjaGUub3JnPgorc2lnICAgICAgICAgIDUxODk4NTA0IDIwMDUtMDYtMjEgIENvbm9yIE1hY05laWxsIDxjb25vckBjb2RlZmVlZC5jb20+CitzaWcgICAgICAgICAgMkZFMjhCQ0YgMjAwNS0wNy0wMSAgSGFyYWxkIFdpbGhlbG0gKEhBV0kpIDxIYXJhbGQuV2lsaGVsbUBoYXdpLmRlPgorc2lnICAgICAgICAgIDU3OTM0OThGIDIwMDUtMDctMjEgIFRpbSBFbGxpc29uIDx0aW1AZWxsaXNvbi5uYW1lPgorc2lnIDMgICAgICAgIEVDMTQwQjgxIDIwMDUtMDctMjAgIERpcmstV2lsbGVtIHZhbiBHdWxpayAoaHR0cDovL3d3dy5hbnl3aS5jb20vIC0gU2VuaW9yIHBhcnRuZXIpIDxkaXJreEBhbnl3aS5jb20+CitzaWcgMyAgICAgICAgRUU2NUUzMjEgMjAwNS0wNy0yMCAgTWFydGluIEtyYWVtZXIgPG1hcnRpbkBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEE5OUY3NUREIDIwMDUtMDctMjEgIFJvZGVudCBvZiBVbnVzdWFsIFNpemUgPGNvYXJAcGhwLm5ldD4KK3NpZyAzICAgICAgICAyMUQwQTcxQiAyMDA1LTA3LTIwICBEaXJrLVdpbGxlbSB2YW4gR3VsaWsgKGh0dHA6Ly93d3cuYW55d2kuY29tLyAtIFNlbmlvciBwYXJ0bmVyKSA8ZGlya3hAYW55d2kuY29tPgorc2lnIDMgICAgICAgIDM2NDJDQjRCIDIwMDUtMDctMjAgIE1hcnRpbiBLcmFlbWVyIDxtYXJ0aW5AYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICAzMDJEQTU2OCAyMDA1LTA3LTIxICBSb2RlbnQgb2YgVW51c3VhbCBTaXplIChEU0EpIDxjb2FyQEFwYWNoZS5Pcmc+CitzaWcgMyAgICAgICAgMkMzMTJEMkYgMjAwNS0wNy0yMSAgUm9kZW50IG9mIFVudXN1YWwgU2l6ZSA8Y29hckBwaHAubmV0Pgorc2lnIDMgICAgICAgIENDNzhDODkzIDIwMDUtMDctMjIgIFJpY2ggQm93ZW4gPHJib3dlbkByY2Jvd2VuLmNvbT4KK3NpZyAzICAgICAgICBFMkQ3NzRERiAyMDA1LTA3LTIyICBTeWx2YWluIFdhbGxleiA8c3lsdmFpbkBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEUwNEY5QTg5IDIwMDUtMDctMjIgIFJveSBULiBGaWVsZGluZyA8ZmllbGRpbmdAZ2Jpdi5jb20+CitzaWcgMyAgICAgICAgODczMTVDMzEgMjAwNS0wNy0yMyAgUmFwaGHrbCBMdXRhIDxyYXBoYWVsLmx1dGFAYXB0aXdhbi5jb20+CitzaWcgMyAgICAgICAgRTQxRURDN0UgMjAwNS0wNy0yNCAgQ2Fyc3RlbiBaaWVnZWxlciA8Y3ppZWdlbGVyQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgRjM5QjM3NTAgMjAwNS0wNy0yNCAgQ29sbSBNYWNDYXJ0aGFpZ2ggPGNvbG1Ac3RkbGliLm5ldD4KK3NpZyAgICAgICAgICAxQ0Q0ODYxRiAyMDA1LTA3LTI1ICBFcmFuIENoaW50aGFrYSA8Y2hpbnRoYWthQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgRUExQkEzOEQgMjAwNS0wNy0yNSAgQWppdGggSGFyc2hhbmEgUmFuYWJhaHUgKE1hZGUgYXQgQXBhY2hlY29uIDIwMDUpIDxhaml0aEBhcGFjaGUub3JnPgorc2lnICAgICAgICAgIDMzM0U0RTg0IDIwMDUtMDctMjYgIENoYXRodXJhIEthbWFsYW5hdGggSGVyYXRoIChBcGFjaGVjb24gRXVyb3BlIDIwMDUpIDxjaGF0aHVyYUBhcGFjaGUub3JnPgorc2lnICAgICAgICAgIDE1MjkyNEFGIDIwMDUtMDctMjkgIFNhbmRlciBUZW1tZSA8c2FuZGVyQHRlbW1lLm5ldD4KK3NpZyAzICAgICAgICA5Qzg1MjIyQiAyMDA1LTA3LTI0ICBIZW5uaW5nIFNjaG1pZWRlaGF1c2VuIDxocHNAaW50ZXJtZXRhLmRlPgorc2lnIDMgICAgICAgIDk5NzhBRjg2IDIwMDUtMDctMjUgIFtVc2VyIElEIG5vdCBmb3VuZF0KK3NpZyAzICAgICAgICAyQTYyM0Y3MiAyMDA1LTA3LTI1ICBbVXNlciBJRCBub3QgZm91bmRdCitzaWcgMyAgICAgICAgRjhFQTI5NjcgMjAwNS0wNy0yNiAgW1VzZXIgSUQgbm90IGZvdW5kXQorc2lnIDMgICAgICAgIEMxNTI0MzFBIDIwMDUtMDctMjcgIFN0ZXZlIExvdWdocmFuIDxzdGV2ZWxAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICBERTg4NUREMyAyMDA1LTExLTI1ICBTYW5kZXIgU3RyaWtlciA8c3RyaWtlckBhcGFjaGUub3JnPgorc2lnICAgICAgICAgIEUyMjJERTRGIDIwMDctMDUtMDIgIE1hdGhpYXMgSGVyYmVydHMgPE1hdGhpYXMuSGVyYmVydHNAaXJvaXNlLm5ldD4KK3NpZyAgICAgICAgICA5MTEyMDNFNCAyMDA3LTA1LTAyICBbVXNlciBJRCBub3QgZm91bmRdCitzaWcgICAgICAgICAgRjEyRjYwNzIgMjAwNy0wNS0wNSAgW1VzZXIgSUQgbm90IGZvdW5kXQorc2lnIDMgICAgICAgIDk5MEVENEFBIDIwMDctMDUtMDIgIEtudXQgQW5kZXJzIEhhdGxlbiA8a2FoYXRsZW5AYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICAzMTFBM0RFNSAyMDA3LTA1LTA1ICBSdWVkaWdlciBQbHVlbSA8cnBsdWVtQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgODg4MTc0MDIgMjAwNy0wNS0wNiAgVGhvbWFzIFZhbmRhaGwgPHRob21hc0B2YW5kYWhsLm9yZz4KK3NpZyAgICAgICAgICA0Q0VFRDc1RiAyMDA3LTA1LTA2ICBOaWNrIEJ1cmNoIDxuaWNrQGdhZ3JhdmFyci5vcmc+CitzaWcgICAgICAgICAgNDM1OEM1ODQgMjAwNy0wNS0wNiAgVmluY2VudCBIZW5uZWJlcnQgPHZoZW5uZWJlcnRAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgICAwQjdFNkNGQSAyMDA3LTA1LTA2ICBTYW1pIFNpcmVuIDxzaXJlbkBhcGFjaGUub3JnPgorc2lnICAgICAgICAzIDAxNTMwMjM1IDIwMDctMDUtMDIgIEx1YyBNYWlzb25vYmUgKFNwYWNlUm9vdHMpIDxsdWNAc3BhY2Vyb290cy5vcmc+CitzaWcgICAgICAgICAgNDA1ODE4MzcgMjAwNy0wNS0wOCAgTmljayBLZXcgPG5pY2tAd2VidGhpbmcuY29tPgorc3ViICAgMTAyNGcvMjQ3NzQxNTcgMjAwMS0wNS0yOAorc2lnICAgICAgICAgIDVGNkI4QjcyIDIwMDEtMDUtMjggIFN0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+CisKKy0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorVmVyc2lvbjogR251UEcgdjEuNC4yIChHTlUvTGludXgpCisKK21RR2lCRHNTSWs0UkJBRFNDajZyVWpWNjR0WUNHVDFEWUtZUjdHdGh5V3BOZEdIU1lMYkVUQmNEYXRBZTFkelEKKzVOc0NnZnJseWJmeWVZK3kxbHhyM1Q5YnFmNnpKV0R3LzcxOHdmZjk2cW1tdjFxemV4U1l0bUlyaitoNTNWODIKK0VYd1dPRnVZTUppc3V4ZFQ5NDBpUXpvc20zR092NE1KZEVnM29JMlNnZkV5UlFRNnZPNE9iNXJIRHdDZzV0YVoKK25ySE9yWHgyZElHSHhweFJaMFNVbDMwRC9qbXR0dEZqWU9RM0xCTXJpaWt6NW1oMnNLM1pub1NSRjRvNU8welcKK1ZlNmUyU0ZYT0VqVmpJbUtzSDZLQ2JkUU5lbHJBZGdpeU9vWENseVFLc1EyN3BuY2JkV282Yk8wRTNQT0paVm0KK1hhZVc3aXVkSFZyNjNyVTVQVmlYT2JJUXJkUWwwRDU5ajVicktqNHZkbFR5VXc4a2FIUHZiS1BERU93dlpxNFkKK0xKUTVCQUNBMVlpbFRlWFJKcXdGc05scGN4Q0h3bFVMRDRRVVZQNDk2cHJRV2YxQjdaNmcwS3ZMR3JRc08wVm4KK0pjbitmRXF1a3lzVEppeFNYQ1BlYm9zbHRkNFJhbEpJdXBWWWtwNHc2TUo3YmlhREFsTHVOaERjSS9BaVhUbVYKK2RYVWVkVlhJYU04STNOZTIzZ3Vjd2JBeWMwSHZiKzNjU0FLUmhsL2F6RlFodUhCdmxyUWpVM1JsWm1GdUlFSnYKK1pHVjNhV2NnUEdKdlpHVjNhV2RBWVhCaFkyaGxMbTl5Wno2SVlnUVRFUUlBR2dVTEJ3b0RCQU1WQXdJREZnSUIKK0FoZUFBaGtCQlFJN0VpSlBBQklIWlVkUVJ3QUJBUWtRb2hGYTRWOXJpM0tQT0FDZmRyNmNWNDF2ZVlCbEJIaVYKK0Z4ZkxjWDd4NU9FQW5pSzR1M2cyanBOUUgzRTBST3ViZGovUk8rUlRpRVlFRUJFQ0FBWUZBancrMVk4QUNna1EKK2dRUmtUMUdKaFFTZGtnQ2VNNlJESFVGL0UzMzRUdGlMUGd3N0dwbU5KU2tBb05DTFFDVy85VkhyVitaSHNvZG4KK1hVbmFENGRJaUprRUV3RUNBQVlGQWo1MTN3d0FDZ2tRUG8rMzh2aURRZGtuWkFQbEhOaU1uUitMVWF2bzJ5T1kKK2lKVCtXOSs4K3FOczJncllEWitXU1l1amFXVDJOSnJVQ1lYUVJNNmdLRHlGbGtjSnZISTlsRjJ5WU1rVmV0bGwKK1pWTjFUSmtlRWR0YkhuY05IY2RxK1pVUVIwTmtGS1RGOWQxSzdVSTJyZld4dDF5NmExM1RjVWpwSlh6YnR3L08KK1hYOUVaU0k2UVF0NHJTRmx2Y2k5SjNtSVJnUVRFUUlBQmdVQ1BuWGF3UUFLQ1JEdTBlbzVJbUhRYzBXNEFKOXYKK3VxNHdsa2M2VG1tbVpQRi9nWlZMbHVIY1RnQ2VJdHJudnp5UzExeGtJRVRrNnY0YjdLNGdhaWlJUHdNRkVENTEKK3FocjliNGpHSWRDbkd4RUNSQVVBb09hVlpXNUNkWjlvWXIzUHdJL2k4UkpOK0pmSkFLQ21kL1hJbFlPQ3BhOVEKK2M0Qzg1NXBNOE5GdzZZaEdCQkFSQWdBR0JRSStkNlFRQUFvSkVCVS9vTTExcG5hU0wrc0FuMURUSG1iaElUZUUKK3cwWlNneUJMUXcyWmhjTTVBSjBaclJCYlo5bGJnSFhCS09KUWlMcFdCajRYc1loR0JCQVJBZ0FHQlFJK3lpNlcKK0FBb0pFTnZTUmZ5enNxRXNGL0FBb05YcTdDcC8wQXdFbVd2aG9Uam10WTZlVllCNUFLQ01GaEJVZFlXTlhWeWEKK2xQVHE4VGhzd05VbnI0aEdCQk1SQWdBR0JRSStqYzRzQUFvSkVNcHBPWFNCQTZOK2tVb0FuMU5qNllxYXJRZzAKK3NMMktyRnNRUk9NM0E2ZlNBS0N5bDQwU3BmVkpTTzMzZll1UGNpOWRIcCtRQ0loWEJCTVJBZ0FYQlFJN0VpSk8KK0JRc0hDZ01FQXhVREFnTVdBZ0VDRjRBQUNna1FvaEZhNFY5cmkzSXNuZ0NmYklwSkRXajZVZ1hZN3JCSDhUbzEKKzJCZ0IrUklBbjNqdzcyV0p6cGxBdFNoVlRtdU1sUkZTK0ZVTmlFWUVFQkVDQUFZRkFqNnNhendBQ2drUXF5d3gKKzZkWXBqd0ZrZVFDZU9rSnJuTzVyMmhXRGhYNEFDUFBMT2JadlhMSUFuUjBWSEFna0VIMVcvdDdCNHpkRFlkQkIKK1pyZDVpRVlFRUJFQ0FBWUZBa0dTOG1NQUNna1E1Qk5oTXd5cWFMUXM5QUNnaW81ekpjaWVZTHBwaWd2U1lMQmYKK3ViVVZyWFVBblJLWko2TUFDcEg2ZnBvejJ2a2MyZGg2OXRiU2lFWUVFQkVDQUFZRkFrTEZNb0VBQ2drUW0vSWoKK1JTL2lpODhhQ1FDZmQxY0lhd0RxcGtZVTg2ZjNKRWpjTjg1bnRGY0FuaTBtOFdSNnMrYmtoM2ZkK0VJclNSc3IKK3UzdVFpRVlFRUJFQ0FBWUZBa0xmUlFJQUNna1FRZW9Kb0ZlVFNZOFh4UUNkRmQrWEVXcXlEa0N4MzdnYUlRQUcKKzRkSHB3aVVBb09aL0s1T0h5VEpDTkZhQlVEdHBDaDdoTDhUUGlFWUVFQkVDQUFZRkFrTGZrbmNBQ2drUUFRVm0KK3ZPUVRZNUwzU2dDZ2lFaTUvMXZZdkpyS29BZGwwaFJXVTU3aWVVSUFuMm4wOEJRZk1aSlE0MzlhTlcvQ25JSzgKK2pQQlBpRVlFRUJFQ0FBWUZBa0xnTmRBQUNna1FjODR1KzRRSTkxWGROUUNnb0JCMWVib2hJZmxpbkFQbHZJMzcKK3BGSHV1ME1Bb0o0eU10YktaTWFxMHhJQm54VjljNXV1OTl0R2lFWUVFaEVDQUFZRkFrTGVyV01BQ2drUWk1WXAKK1Evd2tQenhEN0FDZ3FLbnllYi9malZTOHZvdjRGZVB4ZUxqdTRtc0FuMVNDR2FpRjlnRWYrcUlhWlVuamNUN0oKK0RKOTZpSndFRXdFQ0FBWUZBa0xlckc4QUNna1FNYVk5bHV3VUM0RWE5Z1AvV09OKzB4SVdPdldQN21La2cvK1gKKzB1a1crbWJqRTQyNnFLdEcvQjB2TnJUS3BFbG16OHR0UitvYWpxYmcyMExhem9FVXVBOVpYakxQZnNkV0ErdkYKK2t4Z1Y2cUlkdHhZUE1hbVBtN3l0RUJPbWdNb3dZWFVmdEd0ZXFNNWZ4TGxjZUhpd2RVbHluRzJmbXRNcXZQbmQKKzJPQ2V6U0ZSeDNXNm52QWlJam9MWnBDSW5BUVRBUUlBQmdVQ1F0N0gwd0FLQ1JBMzQvUmY3bVhqSWNBVUEvNG4KK0RsUWJuVG9TU0RPWmtGajFDb0dMOFRqc1ZnenJPM3IzUzN4Mzh1UVFURkFFL0FHQlk0bXRIZ05jWW1pSmFDMmgKK04xWSttbEVHdS84MFJqdjE4NVpmSnNGRWVyVTZZLzl0UkpKMVNvOUFBZTVBbXZHcEQ5eXNYYWU1Z2VCK2srZXAKK0lNU3VmOVdNZVRSVUNiUXM5dWZHWkxWNWE4anFzdHYrYnRjcnpOYVk5b2ljQkJNQkFnQUdCUUpDMzJ4NEFBb0oKK0VKck5QTUNwbjNYZFJCa0QvaU5pMFk2QTNhZkRHOVpML0s0SnJPUGdIVUZXQy9EZ0FFQm1lNEFZNjJhZ1VzVDAKK3VYbHorTXUxUHMyRTB0MjZlalNjdVZNTXZxcFhnN2lKMiszeUt6c25YMHlTRVhXNi82OTZYRXBlM1RGbjFpVk8KK21NRWxQS3hha24zdC9qcjZTRGVwbzlqcUQ1UDVDSlI0R3NEc0czaUtJaXNXZERmODFaWHBmODZ5N0E1ZWlFWUUKK0V4RUNBQVlGQWtMZXV1VUFDZ2tRTXNua3pqWkN5MHZtU1FDZEhHQzZqT0VWbzk2eXlvc3BUcTdiTCtFRWVpb0EKK29OTUtJWnk1cUZMWFhaYlNOdnNqN21EUmcyYzhpRVlFRXhFQ0FBWUZBa0xmYkhvQUNna1FVSTZ1eFRBdHBXaFkKK2hRQ2FBdnFWQnNUWDVzNGMrc1RPbzA2Qk5NZHpISVVBb0l3cFRoQUtxOTM2U3p5LzNHZnY4SzNnczVOT2lFWUUKK0V4RUNBQVlGQWtMZmJId0FDZ2tRM2Jwa3Vpd3hMUzl6OEFDZlllb2NPSzRKMjA0eHdiWGdFZFVKUXl2SEsyVUEKK29LejJBRjFJMmI4RWJ1N3ZUVVpMTkZWMVFNdHdpRVlFRXhFQ0FBWUZBa0xneVRnQUNna1FYUDAzK3N4NHlKTmIKK0VnQ2ZSY2o2UUtIVkhRdFlWWGRDWUtVYnJqOTd3QW9BbmltcVYxNWN2ejFzaURqVUs5Sy9hVHNrR3dhamlFWUUKK0V4RUNBQVlGQWtMZzdNc0FDZ2tReWJXbTdPTFhkTjhVb1FDZEZmcWVmOE15MXhobjZtTGQ5V1RMTGFJZXdUUUEKK25SWEdoL0FmNGhWRzBLd3RaY0pFQTQ2NG5Db0ppRVlFRXhFQ0FBWUZBa0xnN1R3QUNna1FXNWFBRU9CUG1vbCsKK0p3Q2VMeFpqS05pc2pnUDRBeFY1QkNLUis1U1U5Tm9Bb0l3UEYvN0IyTm1HTlIwdDNFWnplOHdwTmhRMGlFWUUKK0V4RUNBQVlGQWtMZzdWOEFDZ2tRTi9hUDlRRmEvSXFlckFDZmFmS0ppNHM4TFlWMkp4TmZRS0hnbVJYemVJSUEKK29OQkhPenVrRENkeEl2bVlKZmFtSXRuQ1A0NWdpRVlFRXhFQ0FBWUZBa0xpWW04QUNna1FiWmlORjRjeFhESDgKK0h3Q2dxOFAyOUN3TVg3UEtoUm1ZM1QzMkFQc09hTUVBbmpkZC9XdnpWQkZ0VGNKRldrSDZpRjRMOEVRcGlFWUUKK0V4RUNBQVlGQWtMalZiNEFDZ2tRRXk1SjFPUWUzSDU2REFDY0RQZldMTzVjRGtlS0ZDdklQOG1jNHA0S2tma0EKK29KSVRST2xkSVJ4WHFVaU1MMW9USnhpZXVISmZpRVlFRXhFQ0FBWUZBa0xqWk5vQUNna1FkY3Fpby9PYk4xQ0kKK3RBQ2dzSmhxQnhlWlRhU3JSVk5rM2FqNmNpQUpyZ0VBb0l4UFhZVHZJcG5XQnI0L1dNYk4wanBWMFRHRWlFWUUKK0VCRUNBQVlGQWtMa2J4SUFDZ2tRak9OMnVCelVoaC9nWlFDYkJwSXFrQ0V1SWJkNnRxQ2h6M1B6Y0lHaVpiZ0EKK25qbHVCRkhsNGwxL05IdFA5ZkVZQ2dsOG5iQ3ZpRVlFRUJFQ0FBWUZBa0xra3I0QUNna1FCSkUwUXVvYm80MmYKKytRQ2dqdE82RU9kRFJpcnVDaTZnS3Z3TTFhMmVSd2NBbjBYVUVMbTVBWmV6TDVFMHJFZklNMkZCaU1pNWlFWUUKK0VCRUNBQVlGQWtMbHdoMEFDZ2tRWVJscUxqTStUb1M5cHdDZlVFZ084MzRYWS9jbFd6a3cvVkxCZmU3TUxaUUEKK213ZHowbmxlT0hZV0ZCcm5ZZ0V6NTNkNE14VVBpRVlFRUJFQ0FBWUZBa0xxWS9RQUNna1FzcjY4UUJVcEpLL28KK01RQ2ZjN005S3BBcENXVzdlRTIyUGxMb04xc1BLKzRBb0pkd0U4VHNETTJQbWVoazlLK3VISXg2Rm9SdmlFWUUKK0V4RUNBQVlGQWtMajdXY0FDZ2tRTW9aT1FaeUZJaXRDbEFDZldwSDArVi9ONnZ1dWNXWjdic01tMkJjbU0zb0EKK24zZkY1cXFvdmxvZzQvUGNndktDVG9ORUY4dVdpRVlFRXhFQ0FBWUZBa0xsRUxjQUNna1FVbmt2cjVsNHI0WVUKK1p3Q2dnN3ZKcERwVVhudU52Z2M1UkhnRzdVWWhSUVlBb0lFS0hzcnN3aDZYelZuNXlRUmtmamRCL0EwT2lFWUUKK0V4RUNBQVlGQWtMbEVhUUFDZ2tRYTNPaEJpcGlQM0pBNFFDZmZiOE5nUXNzT1FYYVZSMGRTd1BDZVUyblFQVUEKK24xNUVBanlrVlpzVWkydFpXcUVNMDhTTk9LSTlpRVlFRXhFQ0FBWUZBa0xtbVdJQUNna1FhT3VNZHZqcUtXZDcKK0FRQ2JCcHd5aXRRNzdrZDlLSVQ2eTk1SW0xdm1XdDhBbkFua05UQmN0VnRNZndkZFlURyt4TGthT2xsT2lFWUUKK0V4RUNBQVlGQWtMbllWQUFDZ2tRYnBSMWxNRlNReHFJUkFDZmZRcVVYVGdPYTRoeUhZUUJVd3JsR0VxbVd0NEEKK25STVhWR2hkNDdsb1MyN01taUVpV3dEbGtOakppRVlFRUJFQ0FBWUZBa09IbjU0QUNna1Faalcyd042SVhkT3IKKzlnQ2doMmZuMjZXMERTTDVXWkFUdnZRa3daZUpOaU1BblI2KzBBbFVLOHVGU0ZJVmhsK1JaTW5ZK1hGd2lFWUUKK0VCRUNBQVlGQWtXZG5rMEFDZ2tRSVlKSlZzNUJuSS8wU2dDZUtDdzM5SU55OUlTRnVubEFvallnU0luSGZva0EKK24ydlU4cTRKTmpnMTNxTmVjbFpOOWttTjltYldpRVlFRUJFQ0FBWUZBa1k0NHNNQUNna1FGVVd6L3VJaTNrK3EKK3ZBQ2ZmcHBCcG9ZODJNRXZEVjdjNC82Y2p3NTQ0Q1FBb0pBUENkWkEvTFJxSUNKbTBpRmJEcndoc1NiNmlFWUUKK0VCRUNBQVlGQWtZNDU1OEFDZ2tRWTlDdHJwRVNBK1FyQUFDZ2xSQi9WZEVtb3ZieVdkTURtc1RkeXc0a2hhNEEKK24wdUt3WmVLSGZCUjNjQzJzN012cXFtTW96OWppRVVFRUJFQ0FBWUZBa1k4a3lvQUNna1FtSER2OC9FdllISWsKK0NnQ1lnWFFaVEo4Vm1Id1NYM3BYT3huTWhwN21iQUNlSVBYd2NQdm1mUDcwOW5mZ1E4L0dwVDJ6OUlTSVJnUVQKK0VRSUFCZ1VDUmprYXNRQUtDUkRoNGZLd21RN1VxaFpLQUo5aXJhREJzdHplWFBNdHN0M3grWlhkTFFtN2NnQ2YKK1dERGdhUU9hOENvTTUvKzdXQ3RreWFzUDZCaUlSZ1FURVFJQUJnVUNSanhRUndBS0NSQk1CQ2dZTVJvOTVlUDQKK0FLQ3VFUVU2ZmpQeS9jUEVpcWhHSDIzSjJZRXI3Z0NmUzh2QlRFVTRzUmJPb21URXVJTlB4Yjk2T1ptSVJnUVQKK0VRSUFCZ1VDUmoyZ2tnQUtDUkF1dVVhQ2lJRjBBZ09CQUowYkptRnpBOVdrRzVGbWZhUDRpZUc5K1NDYlhBQ2cKK3crMndjT0EvQjk0TEtSdGpoSlQ2ajZ6U2lEbUlSZ1FRRVFJQUJnVUNSajRWdndBS0NSQStLbS9DWHltSUpJdmMKK0FKOVFTRTRtQ1FsZFZucGJZd0xUQ2sreEhEcWhjUUNnZ1Q5UDMvckhJekl2djF0SitBMVpKUHZYT2NxSVJnUVEKK0VRSUFCZ1VDUmozV2VBQUtDUkQxd21BV1RPN1hYd3BiQUo0bXIySXhGdHgwcHBrZWZ4eDBsMFRKNmNGa3JRQ2QKK0VGYmMrYU14UktoSzlTQ0FXaTNtcTFVcUVXaUlSZ1FRRVFJQUJnVUNSajMxQUFBS0NSQ2djdFRRUTFqRmhCeUsKK0FKOVNJaWVsVHVEM1N0eFBRcEJrQWtZUDZMZDg4QUNnZzFvUFg5cnlKQTdZdWhNRDdieVhRc0VUekQrSVJnUVEKK0VRSUFCZ1VDUmo0RnhRQUtDUkFDcGFZRkMzNXMray9HQUo5L1ZEeXcydk56azF4amN1L1FaQ2EzZ0dJMnpnQ2YKK2VHOGtsSjc4YkFHa256eEJsSzNYdG1vTnFBU0lTZ1FRRVFJQUNnVUNSamozaEFNRkF6d0FDZ2tRYzkyTUZnRlQKK0FqVkpvZ0NlTCszRlRUVlI1c25KeDlxYkdRc2d2MjNaYVQwQW4ySHkxQ2NYVmtsY1lCRjdMYm5iQWdiZTFIcGYKK2lFWUVFQkVDQUFZRkFrWkF0a01BQ2drUWJRdkhPa0JZR0RlUGVnQ2JCZTZybXo5L2tZRFY3dzVwdndudWdWc3YKK2JpRUFuaVRmTFc3Tlc4ejFTUkJXZjZsTUgzY2xHQXM4dENCVGRHVm1ZVzRnUW05a1pYZHBaeUE4WW05a1pYZHAKK1owQmliM04wTG1SbFBvaGZCQk1SQWdBWEJRSTdFam1CQlFzSENnTUVBeFVEQWdNV0FnRUNGNEFBRWdrUW9oRmEKKzRWOXJpM0lIWlVkUVJ3QUJBY202QUtEYUEvL1NZSnYycGNYd0dCQzg5T1N6R3Z4eTNnQ2cxa3g2cXU2ekpLYVcKK2FFMUw5b0ZxVmM2NU9VU0lSZ1FRRVFJQUJnVUNQRDdWbFFBS0NSQ0JCR1JQVVltRkJOQ3pBSjl0djd0TlM2TncKK2FPWlE4Y1IwcEdzbEpHS3R1UUNncHR0TW1oaFJyVXd5VnVFWGMrZEtYN3JkUU1LSW1RUVRBUUlBQmdVQ1BuWGYKK0R3QUtDUkErajdmeStJTkIyVm02QStJRHhpWXRNdmQvbWFkKzdoUm9LWHZENUFkZEIxU3dudlFkSmUwZXdTdEYKK0JZWnhaZE5PTFhka1ZuZ0N3QUp6aVBHWmNRbW9jRUhWTXJOK014ZSszT1gwUEVaKzNLT09zQVVpK2ZUb3YyeHYKK2Y4RVdLZ1g5ZDBsaTlpRXl0VkE0TTBjNTJhM2JQVEMwS2tpL0tBWTNtOG9OdkFtVHdXQjlkQlNvb0ZGRE1JaEcKK0JCTVJBZ0FHQlFJK2RkckhBQW9KRU83UjZqa2lZZEJ6cnVZQW5BenZUcnZEUU52b0FvYURRSitvL3lkcU1BOFoKK0FKd05FT1FESHN6KzZ5bmJNUG9RbUttVXFmRUlTSWcvQXdVUVBuV3FJZjF2aU1ZaDBLY2JFUUlrcHdDZUluZjQKK28zQzVZa2gveEJvZFZJbXJwMkN2Y3k4QW9NbjNtZTVwNFNsMnJtMnRqVnhUSlp0MnNVcjdpRVlFRUJFQ0FBWUYKK0FqNTNwQm9BQ2drUUZUK2d6WFdtZHBJcEdnQ2dpVEFSUDZDZitKS094VWFWRnIwTDlEQzVvVWNBb0l4RjdENW0KK09WSy9BRmNwMWN4TmszQkx0ZHEzaUVZRUVCRUNBQVlGQWo3S0xqSUFDZ2tRMjlKRi9MT3lvU3dBYkFDZ2xOcDcKK1YyUHc0VTU3NUl1b29NNjc3YlpmOHB3QW4yVTJUY0hqN1BZcHJVK3FZUmt5SjNwYTdGeXlpRVlFRXhFQ0FBWUYKK0FqNk56alVBQ2drUXltazVkSUVEbzM1WVB3Q2VKSVUvbW9uTjk2blA0akpqQXVmbEVYTWJlbVVBb0pYcTdvVkMKK1l1T0NxV3IvVDNWVzBETTNXK2RuaUVZRUVCRUNBQVlGQWtHUzgrc0FDZ2tRNUJOaE13eXFhTFEyUndDZU1jRGYKKzRiYitPTWpSVUp3QWsyTEhOOXRoNDJRQW4wM2ZWcU1VWkVWbU9yVlhmV0lMcGpYTkxNRElpRVlFRUJFQ0FBWUYKK0FrTEZNb1lBQ2drUW0vSWpSUy9paTgvZ3BRQ2ZmWFhSQ2VaZjFWdjVpaDcweUUyWlhnMHIvcnNBb0pZS3NkeDAKK0s1YXFmb0V6eWlCQ2o1STQ2SnZoaUdvRU1CRUNBQ29GQWtMaE9CQWpIU0JVYUdseklIZGhjeUJoSUdwdllpQmgKK1pHUnlaWE56SUdGdVpDQkpJSEYxYVhRQUNna1FvaEZhNFY5cmkzTHhHQUNnaVErd2xhYTlpTU91ZTVEdWh0eUwKK1BNU211aUlBb0lrcmNpWUZPZjNWQkJEMEhMV2ZHVldVcXh6UmlFWUVFQkVDQUFZRkFrTGZSUXdBQ2drUVFlb0oKK29GZVRTWS9uZGdDZlVFUWw0UmM1bm51M0c0WlgzbzRPeXdiRjdERUFuM0h0djFzL29uK2VpKzFtbVM2Wi9QZHcKK2dNN3ZpSndFRXdFQ0FBWUZBa0xlckhFQUNna1FNYVk5bHV3VUM0RjFKQVAvZXBKWURaWDRmbFUwc2E4QWxGdFMKK1JPWS9PNmczaVZxNXplWW0xV0QzZTB4T09ZVFhsa0ludGtZRmhxYkJ6WlEzcEZZZldtYmh6Q1cvVGMwUmlnQUMKK2Rtcm9FRUxyd3lyZkxJSHZzblVURjdDNUFMNlN1RlFacUc2cW9NanRIRmQ2S0RNb3Myc0RFWjNWWERHMWJ1VysKK2hwSFk5cldSSktQemIvU2dTZXRUQ2V1SW5BUVRBUUlBQmdVQ1F0N0gyUUFLQ1JBMzQvUmY3bVhqSWF4bUJBQ2kKK1lDd3haTHR4bmFSZndTT0JrQVNxbW5TOG9CZHlJS3ZUYWQ5ZExFM0N6aU5nRVcrQWRmRTc2dlFza2VEeEwzWlYKK1F1YmhLV2lhTTRCN1lVMm5ZeGs0SU5WcG9rMXFodDliTjFQc3krVFMzU3ZwUEtxcThSaTh4YzRaUER3ZGNDY0MKK0ppWEx5NWlSNXR4M2lCc25IUk01K0xNSUpnK0xpT3FkL1puQnNnZ2pqWWljQkJNQkFnQUdCUUpDMzJ4NUFBb0oKK0VKck5QTUNwbjNYZHJNUUQvM3ZGdG5Lc3NxVDZtQjdOT1owOFRjdytjQzVlOWdBVnI1WTMzWCtaZ1BlN0JKZDYKK3VQTnQrSTk3RkRkVkpPbk50VFpTdm5rUVovQzc5WW9jaTB5WkFBb0hZbHpSYjR0WGd1THk0VURCamozQmx2UHMKK0NPS0packtuN2J4dnRvVGJlSGdqSG1uZWlJd0N1eXpTb0ExaEFZeGlQbGlEcnd1VkNRVHVkSERWeGpsMWlFWUUKK0V4RUNBQVlGQWtMZXV1MEFDZ2tRTXNua3pqWkN5MHNTWUFDZlgyZ2lzNGc1amVwMEhqS0FCQWszMWJ5SFUwUUEKK29JNTI5NGZMSE9lSUhLTENJZHZLbSs3Z1ZMbitpRVlFRXhFQ0FBWUZBa0xmYkhzQUNna1FVSTZ1eFRBdHBXZzYKK0J3Q2ZWUXRkVFJiTlBnUUdGcUdRU1VsQko0NTl4ZllBb0xLaGo2OFlVd1pCNVZnSWVJb3JwcXQ5YldSMmlFWUUKK0V4RUNBQVlGQWtMZmJIMEFDZ2tRM2Jwa3Vpd3hMUzk0U1FDZ2hCNCs1UndHUjBaT3l5MnhVQTRlNkltTzZaUUEKK29JamtXd1lSZDFWcDlTUW9KVzVPZFNxdVlTY3RpRVlFRXhFQ0FBWUZBa0xneVRzQUNna1FYUDAzK3N4NHlKT3MKK0FBQ2VLbzM5aFRSTlZWeXZqNXk5b2hUOVllMy9DK01BbjI3YUVLckdneE5id3E1MHFHeEZFK3AzNmo3ZmlFWUUKK0V4RUNBQVlGQWtMZzdNd0FDZ2tReWJXbTdPTFhkTjhpMEFDZ3MrYVc0MUZuY2hCMEsvT1VkQjN0MExnNGk1SUEKK29NK2wwUHl4UzNYSnNBd0krSmJDbTBhUjNWQThpRVlFRXhFQ0FBWUZBa0xnN1VBQUNna1FXNWFBRU9CUG1va2IKK3FBQ2NDM2luNlUrbXFqU3diNjdyQjV6VFkwVGhZdWNBb0k0VjdxZTBYSFREVXd3V09nUm8vTnpSN2sxT2lFWUUKK0V4RUNBQVlGQWtMaVltOEFDZ2tRYlppTkY0Y3hYREdjRGdDZ2k1Q3JweVoxRGN1MElLTUwwNUZmdnc4bFBoWUEKK24wbkwwQmN6RW85UnBOVllnMnl0SitZdGpLVUZpRVlFRXhFQ0FBWUZBa0xqVmNBQUNna1FFeTVKMU9RZTNIN3EKKzlnQ2ZWNXhUeW81U0Q3RzYyVlNVYmpZZmVxY3V4WHdBb0tBdWNoc01rYXZZV0N0MGpCaGdMdVRKa0ZxVWlFWUUKK0V4RUNBQVlGQWtMalpOc0FDZ2tRZGNxaW8vT2JOMUFkWkFDZ3BVZ2k1cW5uRFVwVlhoVHNKVW9vNFU0ODVzWUEKK29PWG1NYmh5YU9NSDlnOW5kWUZtNWFIUE1iZjlpRVlFRUJFQ0FBWUZBa0xrYnhRQUNna1FqT04ydUJ6VWhoOVMKK2N3Q2dxRkVMZ0lkTldreTIyMUV1RmdqS3pnRUc1V29BbjNjQlpiRStQTUZoQVp5VWhRSWwyaEhFYlZKSWlFWUUKK0VCRUNBQVlGQWtMa2tzY0FDZ2tRQkpFMFF1b2JvNDNFb1FDZlJDdGJ2TUhvVEdtUzdkbVozc1J5QWo0VzdXb0EKK29KRGZvdXkxd1o1dFNNSlQrWEJtNW9GdHdTVVNpRVlFRUJFQ0FBWUZBa0xsd2lBQUNna1FZUmxxTGpNK1RvUkEKK0h3Q2JCeE1ITll5dmJZbUFiMWtURXQ4eWRGNjYwb1lBbjN6c3JtWmF3VFhyanZiUEUvVnBDKy83d3B6cGlFWUUKK0VCRUNBQVlGQWtMcVkvZ0FDZ2tRc3I2OFFCVXBKSzhWZ3dDZmFDUjQ1SnR6Rm56MHY0akN1b29xYUZHZ0g4MEEKK24yQmNvRS9wc0xQVEVDR1JES0U0djdKTkFEbkNpRVlFRXhFQ0FBWUZBa0xqN1dvQUNna1FNb1pPUVp5Rklpc2IKK0JnQ2VKakFYTEdmejVhaERkZ296cURZcmJPenhXRzhBbmk3aEZ3d3hIRkFJZTQyK09zTDZ4d2VSRDQ2ZmlFWUUKK0V4RUNBQVlGQWtMbEVMY0FDZ2tRVW5rdnI1bDRyNFpielFDZU1CakZ6RHZCSUZtSzVWTkl2dmNLM2VqZERQd0EKK29MemcxeXRLQ2czQTBPZWJmTVg5bnI1aVFPeHdpRVlFRXhFQ0FBWUZBa0xsRWFVQUNna1FhM09oQmlwaVAzSmUKK3ZnQ2VKR2p3ZXpvck9Tcmk4SVd4TUpxVHQzdE96a0VBb01OWkNUbzNBbWNLSUNGaHRkdHRnY3VPWk5XQWlFWUUKK0V4RUNBQVlGQWtMbW1XSUFDZ2tRYU91TWR2anFLV2ZnOFFDZmRZZEdoa2I3cEJxZ0ZoR24zdUo1MCtzWS9RZ0EKK24xUGRaQ2ZSdFZnZGsvSlZ2MzVGN2ZKcDVhMUNpRVlFRXhFQ0FBWUZBa0xuWVZjQUNna1FicFIxbE1GU1F4b0oKK2dnQ2ZRN0R1NVpLYjdvb0pqNkNGK25lNzdueFZ1WWdBbmpMRjF0WjE5QTFuK2hQYVQ0QTJubWZuVzJ0UmlFWUUKK0VCRUNBQVlGQWtPSG41NEFDZ2tRWmpXMndONklYZFBmdmdDZlJoWXpTRkxyWExhTTdoVGEzaUhrdHNRRTFpVUEKK24wMU1MZXAzZUVkZDMrVk5Qb2pyRThGbFYrb2RpRVlFRUJFQ0FBWUZBa09IbjU0QUNna1Faalcyd042SVhkT3IKKzlnQ2doMmZuMjZXMERTTDVXWkFUdnZRa3daZUpOaU1BblI2KzBBbFVLOHVGU0ZJVmhsK1JaTW5ZK1hGd3RDcFQKK2RHVm1ZVzRnUW05a1pYZHBaeUE4YzNSbFptRnVMbUp2WkdWM2FXZEFabkpsWlc1bGRDNWtaVDZJWEFRVEVRSUEKK0hBVUNQbWlCWEFJYkF3UUxCd01DQXhVQ0F3TVdBZ0VDSGdFQ0Y0QUFDZ2tRb2hGYTRWOXJpM0pQS0FDZlhoRk8KK3I0Z01NSVF3RUd2VWI2Si9YNGFzdXpJQW5qZTJIOVQxci9qU1ZpMU5iSUV0UWZicG15UVhpSmtFRXdFQ0FBWUYKK0FqNTEzdzhBQ2drUVBvKzM4dmlEUWRtR2tnUG5VWUpmSGxEclEyallKV3VQRHZlOW40cFY5T3Z5SWxsS3lMZGYKK1VManNMV1h3NEptK2ZNUUpnV3IyR0VvdjFaWUl5UzIrckdEWnBiei92eGFCVmJncU04VFBkaVh6eHdVOEFGcTQKK2srRW00ZktYUjU4QnlMU0pqdkxMemE2MXNwTkhKZW5uRVVGcDN0VHBFc3I0Yk51dWFvUllodGlLelRxTnVvQysKKzB4K0lSZ1FURVFJQUJnVUNQblhheHdBS0NSRHUwZW81SW1IUWM1bGNBSjlGT29BTDR1SE11cUhYcnJ4c0VWUEoKK3ZFSjIvQUNnZ2FPUjYyRXppVXFjcXBkbS8xWnkzUDRUMjJpSVB3TUZFRDUxcWpqOWI0akdJZENuR3hFQ1dzc0EKK29LbmtSNjNiV0dDRkRCNVlKdGZaSituUXEzVEFBS0QxYnpHL2tJVFFwSUhzVDJ2Q1kxeUJtbFdiQlloR0JCQVIKK0FnQUdCUUkrZDZRYUFBb0pFQlUvb00xMXBuYVMrOUlBbjBrRmxYQXpPaGh1NHI1ZmdsTVZ1dzViVEFkMEFLQ3QKK1lSWDJFU1UvK3RzRTh2dVhXdHNNQ0dlSTVZaEdCQkFSQWdBR0JRSSt5aTY3QUFvSkVOdlNSZnl6c3FFc1NjY0EKK29LcUczOVgyeTZ4b1FhNTZudmlGNWlDai9vVEZBSndMS3g5R3lLRVViU005Zi9JUTdBc1pQaEhUNTRoR0JCTVIKK0FnQUdCUUkramM0MUFBb0pFTXBwT1hTQkE2Tit4WWdBbjFIYkdhbWNYVERZU0ZqbjNVNWlrMnZRYThudUFLQy8KK3VVTTAxZ3Nkbis3MUVpQWttcmpsSDZIOU1JaEdCQkFSQWdBR0JRSkN1QXFyQUFvSkVJRUVaRTlSaVlVRTBNVUEKK24zY1dGVlcwM0NEdU11QTdUU1VxVGYvZVdBUldBS0MvR2pRblBaMCtnN05iRHc2OFpTWTNrOFd1dW9oR0JCQVIKK0FnQUdCUUpCa3ZQNUFBb0pFT1FUWVRNTXFtaTBHSVFBbjFtcGRIei93VisrclNVMlFuN1IzMnNsZk5kcEFLREoKK1BxcG5tY040TVVtazkweVpFZUhBZEptcmhJaEdCQkFSQWdBR0JRSkN4VEtHQUFvSkVKdnlJMFV2NG92UDNZVUEKK24xejhMMUVuTGRJWXR0V3JUMXpzMEU4OUx6NEJBSjRzRnpjU3EyTk8zT1pzRVFmaDlGNkNyVWUzVW9oR0JCQVIKK0FnQUdCUUpDMzBVTUFBb0pFRUhxQ2FCWGswbVBJVWdBb09GL09DemNvK24vM3NHSjU3bTArYXFHTE93akFKOWIKK0M4NkIyaFJ2a2FabEdtL25lM1R6Q2dGR25vaEdCQkFSQWdBR0JRSkM0RFhUQUFvSkVIUE9MdnVFQ1BkVnNFb0EKK24yaHE4dzBKVXRmSnB1M1NtTVVrRlpMQkZtMytBSjQ4cHhtakhYam9CSkdwb2tYdzRpOUNmYjU2Qm9pYkJCTUIKK0FnQUdCUUpDM3F4eEFBb0pFREdtUFpic0ZBdUJHRFVEOTNuSHpjRFdSNkF1RHhEdmFEcDF4UjhvSlpIb2plWjkKK3NXU1JRZmZpTkpLRjA3dnZkakdieWdxaVdiUW10VE05cUJuQXhFaUJwU3BKZW1CaHZHVEtpdlBrYjlIODhLUWUKKzJqcW93RE8zSUpvcklWTVQrZVVGQis0cG41YytrRkxEL0loRzdvaFoyckJJYzQ3TDYyRkZ1RDE5ZXN4dk1jVmUKK2xyQkZxNjdaVjRLSW5BUVRBUUlBQmdVQ1F0N0gyUUFLQ1JBMzQvUmY3bVhqSVk5dkJBRHFyZ3V6bE5PSkZrV3YKK0VrZ2RWWENDSDJUUDNPVXVQWjlKUXRiSmZia2cxbm4xaENuTUlUYXBOSmxFRTN5eWpCN2tFcEJrbVV0eUt2M1YKK1N3T0RzcGZpcy9wczZ6SlJJbmUvMlI1eHF0VDM4SGYvc1l1Y29NWlVjZWlwRkFvQ0xZT3FrS0pLd1RwWU0wNDAKKzFkVXB1eHAxeThMcTVOMFNEdFRXOWZLTU5zOWppb2ljQkJNQkFnQUdCUUpDMzJ4NUFBb0pFSnJOUE1DcG4zWGQKK2VrMEVBTkxqM3doMkZDdWt5ZHNmU3pxZ2pGRHBrVmppQnhiVHRDZXA4NmZsYUxNckYzSDBpZGNrR0NqTVVmL0oKK29zdEJzandDcEwyVmxDdHZod2w1WmdJem04bHVjZUh1cHEyaUM1aHZVTjBJakt1SVhNTGJaUDdERStMZmN2dzgKKzJuS3Q4Sk5QcGpvc1hpTWh5c1FabXMyWGZ1TlA2Zi9FeThKNWphQjJaMkpDWVdKQmlFWUVFeEVDQUFZRkFrTGUKK3V1MEFDZ2tRTXNua3pqWkN5MHZCcmdDZ2xmQ3R0SXhGR3FWVExUcS9uaFBuUkZNSFg5WUFvTTRaMDVvVHVQRngKK0dXUzRSenhDekNiM3Zwc0FpRVlFRXhFQ0FBWUZBa0xmYkhzQUNna1FVSTZ1eFRBdHBXZ2lwQUNmVEJ6YnliN1YKK2MwanIyRlpEaVhKRlVTQkNvRVlBblIreVNXbWVka2NKV0VTU3RxUnN0RDhUNzJtT2lFWUVFeEVDQUFZRkFrTGYKK2JIMEFDZ2tRM2Jwa3Vpd3hMUy81UkFDZ204OGxwWUR4eTBiWUY5L3ViRmJ2cUN3Nmk5WUFuanJRb09MUkJ0UTQKK1FtSVBSK1QvOUhSZU9lU2NpRVlFRXhFQ0FBWUZBa0xneVR3QUNna1FYUDAzK3N4NHlKTlh4UUNmZm9jY1VCV08KKzUxWUlFTTBtYnNxcG5LSHRhd29BbjJ4VGlEZ28zVGp0YlJKc2tBRHV3K1FuQVRRTGlFWUVFeEVDQUFZRkFrTGcKKzdNd0FDZ2tReWJXbTdPTFhkTjhiUHdDZmVLdGZRV0ttOGkrS3VGSlRJb01UdkFONjVRUUFuMkE5RzF3dEVONFYKK3pnNkhmblR2dGd1czMyclJpRVlFRXhFQ0FBWUZBa0xnN1VBQUNna1FXNWFBRU9CUG1vbkFrd0NmZUYzbDFsRTIKK1dpalFGMEJtUE1mcXZreUEyVWNBblJRenVjN1BXeVAwbnlkR29KdmZFVUhCeVZzN2lFWUVFeEVDQUFZRkFrTGkKK1ltOEFDZ2tRYlppTkY0Y3hYREVDNmdDZ3FJQ2gvZGp6dDFpNnVhZEpBT3p0WmMvenhsMEFualIxT2FNMkp4UisKK3dxSzNsb1NURUtYMXVPcEJpRVlFRXhFQ0FBWUZBa0xqVmNBQUNna1FFeTVKMU9RZTNIN3JSd0NlSldMbUx5UHoKK3BnM25yNjVqN0F4cUdSSmVEZlVBblJUMk9hODVkQU0wMndnZFlsajNGZWpQdU5GemlFWUVFeEVDQUFZRkFrTGoKK1pOc0FDZ2tRZGNxaW8vT2JOMURBK2dDZU9hZU1hckVKRFBiWmphTjN5L1BmNVBCL0N2MEFvTUdQalBTVEd0L2kKK0hKMmFBcmZ5ZDBNRS9SNTJpRVlFRUJFQ0FBWUZBa0xrYnhRQUNna1FqT04ydUJ6VWhoK2xuUUNmVmJQR0Y1VVcKK2x6RmJ4Syt4S21ZMkRiS1hiNXdBbmpwb0F4ZmZTUk8xUFpsUVVIZ1dsUytOYWVDemlFWUVFQkVDQUFZRkFrTGsKK2tzY0FDZ2tRQkpFMFF1b2JvNDBmYkFDZ285WUNKWHU1SHBvYy9TVnAzckhDWW1UdUVNWUFvSXQycTZyUEwvSmIKK2JraWtiUnFhdXNFbkZzdHppRVlFRUJFQ0FBWUZBa0xsd2lBQUNna1FZUmxxTGpNK1RvUlA4d0NlT1ZBSXBhRysKK3E5Rzd1SmdWQ3lEWjBKYmpqZklBb0pnZytOckJmaE5lT0J1dTVtUzFQU0dEenRRK2lFWUVFQkVDQUFZRkFrTHEKK1kvZ0FDZ2tRc3I2OFFCVXBKSzhIZndDZldnTmxZTkxCV21uL25lamx4MG02TnN0VDJDc0FuUmRoc3VzdjZSYmMKK0tOb1ZVdWR4R0c0WG0zbkdpRVlFRXhFQ0FBWUZBa0xqN1dvQUNna1FNb1pPUVp5RklpdjZqUUNlTWlvcjhUZzQKK21zclJjK0ZmWGZqNVVsbjAzZDRBbjNSVGFIS1UrU3Y0U2dFZWNYbFcwUllsVmE2ZWlFWUVFeEVDQUFZRkFrTGwKK0VMY0FDZ2tRVW5rdnI1bDRyNFpDOWdDYkI1WDByTC9EdHBHcHRpTk8xMkRkVFFxenNNTUFvT1dwSkZnM1c3ekEKK3I3YWxWanFseDB0MXZTNEtpRVlFRXhFQ0FBWUZBa0xsRWFVQUNna1FhM09oQmlwaVAzTFlhd0NnaXVRcWhWYXkKKzdGRThlMDVaYTY5c2VRd0Y0Q1lBbkF4QlZOeXZYdS8xYWVBdVNpM2lDNnR5d3ZGb2lFWUVFeEVDQUFZRkFrTG0KK21XSUFDZ2tRYU91TWR2anFLV2ZkYlFDZEhmRG5lWU0rbldYVC9vWU9xb2hhbUx2azhpUUFuMUxMSmhrTGlDTU8KK2E5L2JpRjI0ekt0K01qYUhpRVlFRXhFQ0FBWUZBa0xuWVZjQUNna1FicFIxbE1GU1F4b2cwQUNncC9tN2QvTmQKK05QMHc2MDVWeXJKV0Nkb2dlRzhBbjJFK0ZwRkJRZ3l2SmFENmtsekRSTk5ZTGM3MWlFWUVFQkVDQUFZRkFrT0gKK241NEFDZ2tRWmpXMndONklYZE5nRGdDZlVWTUdKWlYvRDFRRWRud3JUa1JtTWIzN0tSNEFuUkxEV01zS3RxNHEKK0tYUWpZYm11TE5kSGExRVFpRVlFRUJFQ0FBWUZBa1k0NHNnQUNna1FGVVd6L3VJaTNrOEgvQUNnbUtFZFRvaUIKK2F3MXdBTVhYS2pqKzhQVFU4ODBBbmpUV0RWalYyZlpuajhpWGFPSzdNVHgwMWdNUmlFWUVFQkVDQUFZRkFrWTQKKzU2SUFDZ2tRWTlDdHJwRVNBK1FYY0FDY0NGdFV2RWNtVFQ1ZXpBc01zV1BiUkpBcXR3b0FuakZkcUtBb0JEa1AKK3I4NS9WSTg5R2hmdHRNUmRpRVlFRUJFQ0FBWUZBa1k4a3lvQUNna1FtSER2OC9FdllITGRld0NnbzQyYXJ4aksKK0ZpcStscDliMTFmdVRxdmltRGtBbjFLT1NMUmFxdWJVQmhmRUJnWnp4OWtoNndoL2lFWUVFeEVDQUFZRkFrWTUKK0dya0FDZ2tRNGVIeXNKa08xS3FJT2dDZEh3VUQvSVpjUUIzcUEvUUNpS2pJd2VQcDdRb0FvSUIyZkZkUUg5NUwKK0EzM3dTUjVYQkkrbUlFc2JpRVlFRXhFQ0FBWUZBa1k4VUVjQUNna1FUQVFvR0RFYVBlWDVkZ0NmWTZUUGxicEoKK3BzcktLdFFhTVhmU1d2MEUveFVBb0lHcXc5WkhuUTd5OXdiU1VNdVNuVzI1YjdyZGlFWUVFeEVDQUFZRkFrWTkKK29KSUFDZ2tRTHJsR2dvaUJkQUpNV1FDZ2lyejJkaUhvQ2JGeXJCQVY1aUtXZ1A0VWEvUUFualdWclMrU0t6VWwKK1FnTXpjVTA3ekhEbFZzMWtpRVlFRUJFQ0FBWUZBa1k5MW5nQUNna1E5Y0pnRmt6dTExOXpHUUNjQ3d3Q2VHdTkKK0ExVTlBbXo4L25LeEJNb2RkbnNBb0lhdkZRV0xrVkQzZWdTNVlFYXJEL0Vkd3g5VWlFWUVFQkVDQUFZRkFrWTkKKzlRVUFDZ2tRb0hMVTBFTll4WVJLZmdDZU1mTnBxa2tSb2hnV0Z6L2YyRWhHYm1mUjJYMEFuMlVCZXFiUDVoQksKK29rcEQ5eHlGMHBzdDJGSVppRVlFRUJFQ0FBWUZBa1krQmNVQUNna1FBcVdtQlF0K2JQckdEd0NmVVFVYUlKNGoKK1VMN3NGUU9vam5HVSttenBZSGtBbjF4U2dUeURXS2tUOUMwSlZodzVTRVBuZkxGamlFWUVFeEVDQUFZRkFrWS8KK0JqRUFDZ2tRQS9hTXZkNkloS0NOdXdDZ3ZOMjh0M2wzeVlBTXhrTVV1TDNMQTh1VGlrRUFvSzNiZkhGWURBMUsKK1BsYjY0OFlzdnBIUWdSdm9pRW9FRUJFQ0FBb0ZBa1k0OTRjREJRTThBQW9KRUhQZGpCWUJVd0kxUGVrQW5SMzYKK1Ntb1hZWWVnaUVVU0t4SENqSFFublluYkFKOXptZENDbG9hYURJeXFoMnFyNXgyakpzY2pIWWhHQkJBUkFnQUcKK0JRSkdRTFpNQUFvSkVHMEx4enBBV0JnM1lYNEFuMlhyTGFhemp2d2dwVXdWRWo5S0NIQXE5RllCQUo0a2hIcUUKK0pIanBCalFpb3FHUWZMMlovTnFJOXJRa1UzUmxabUZ1SUVKdlpHVjNhV2NnUEhOMFpXWmhia0J6WVcxaFpteHYKK2MzUXVaR1UraUY0RUV4RUNBQjRGQWtLY2FlVUNHd01HQ3drSUJ3TUNBeFVDQXdNV0FnRUNIZ0VDRjRBQUNna1EKK29oRmE0VjlyaTNMSkxRQ2ZWNUZnTEx0TXlkdmQzUm12bUcycC9tYTlWZlFBb04yL1QzclhiT25tNmtHYUloMGEKK0tYSkcyemk2aUVZRUVCRUNBQVlGQWtLNENxc0FDZ2tRZ1FSa1QxR0poUVQ5RlFDZ2p4OUcrMHZrOHBWZGJnYm0KK0hHSjFpRy8wU2M4QW5pYjBVekQ1MWpZMWMvZ2xUcjFjeVV4K0tKZVppRVlFRUJFQ0FBWUZBa0xGTW9ZQUNna1EKK20vSWpSUy9paTg5NHFnQ2dsMFdWblJvd1ZXNDl5QVJaZDVMNGQ4UmRvTElBbkE5eCsvWm0xUTBUVE1hUmdLeFUKK05ZYWtCYzVYaUVZRUVCRUNBQVlGQWtMZlJRd0FDZ2tRUWVvSm9GZVRTWTh4MEFDZlNINUl5cEloTGhjVkljNTcKK0lJUUVQRzdBVnB3QW9LRTlKRmtnZDRsSHFTeUE2Rm9ZUnJReUV1UlVpSndFRXdFQ0FBWUZBa0xlckhFQUNna1EKK01hWTlsdXdVQzRIbXpnUUFnQlJhUkNoRXp0MlIyNHpKejZJQUFqYStoR1FrTWN4a3lGNjEwc2xrTE92RlhCK2UKK01GRGdPTXBOM0JxWHg5cVlBTVdJMmgzbzB5VWJ3eXJ4cXp4cFNoNEFtUmN1UHNCODZOZTZWdlNkV2lwTnJGRnAKK1UrdTdKdzFYVExwLzR2RnNRL2NzOXZmWEYwZW9nc1QzejloeURCS203TVZpV2x5RTZPM2Exa296dCtXSW5BUVQKK0FRSUFCZ1VDUXQ3SDJRQUtDUkEzNC9SZjdtWGpJVVdzQkFEUGNINS9iQVNMQmMwRVVHd0R2cFpmTjMvSkl2dmcKK09BSjQrZzEwT01VWmdwVk1hbW9TOVFZOGNYa0lSUGtLSnF0U0htd3lhOUVudCtGd2RJTnllMjg2LzR2VUpoTUIKK0twd3lYMWxhRzc5VklJOHZ0WTh4SzVXUVladklad2lQc3o1NjFpaTVOSisvTDh5ZVVhNTFXazAxZmpsdWErSzMKK1ZXZk9zaW1CN2FWVXFJaWNCQk1CQWdBR0JRSkMzMng1QUFvSkVKck5QTUNwbjNYZEJ3MEQvQXd3L3RSVUZQRHoKK3ozdmlybjlteVRqdTJISzNvK0NSZFNQeG03Tmh4OThWNERtYkViK2xpZU5UUDZMOFNTMks2VmFrQU5tQmZ4c2MKK0lMc0szK0pUNVB1TEtSWFdtNExvaVN0SGR2eW1RTFp5N0l5TTNXSEtHTk5TQ2hrOThaRDhDQXhLelJVcHNWK20KK3lnbEhqM0JUUjJHZW5Rd1J4UlhHRlU3SGFQOEd3SHVtaUVZRUV4RUNBQVlGQWtMZXNMSUFDZ2tRL1crSXhpSFEKK3B4dDlGQUNnd3NiRDJaTENpSEw0KzdXeDBCTUp2ajFlZmc4QW9PejZLMUFvQ0wweUZweUEvTTBWZ3dSdUFBbDIKK2lFWUVFeEVDQUFZRkFrTGV1dTBBQ2drUU1zbmt6alpDeTB2M2RnQ2NET3dVQ0VJS2l3TktnTytVZGhJeHhWMEMKK21WZ0FvS080bWdEUjhTRVhQemNOZlkvQXNUVzFpVVNlaUVZRUV4RUNBQVlGQWtMZmJIc0FDZ2tRVUk2dXhUQXQKK3BXaU1kd0NiQmRCNDY1dURkdFJNSGE1b1V2VHh5a0M5aW5ZQW9JNWJyTmhzcmdzMm40Ry9TUjFZUVE2NFhwWkoKK2lFWUVFeEVDQUFZRkFrTGZiSDBBQ2drUTNicGt1aXd4TFMrekZnQ2d1cTBGT21ZMGt1b0ZaOExNTHJXcWdjSDgKK0xiOEFvTDlwakJpWDlvWjJGV2pUYWxlVmlCUUxzbkpqaUVZRUV4RUNBQVlGQWtMZ3lUc0FDZ2tRWFAwMytzeDQKK3lKUFU1UUNmWFd6Tmg2TUNPYUErb1JrcHdBNFNOblNud2EwQW9PRHZWclJZa2N5Nmd0VTRBZ0xHNG9Lc3ZpUTQKK2lFWUVFeEVDQUFZRkFrTGc3TXdBQ2drUXliV203T0xYZE45ZGFRQ2ZTOThsSHV4bEhnNmpNM2QxaTFtclhKWCsKKzY3a0Fuam5wd1BaNGNpb0J3RW5oQ3YyVjBGd3d3VnRMaUVZRUV4RUNBQVlGQWtMZzdVQUFDZ2tRVzVhQUVPQlAKK21vbXpWUUNlTUp3SDNBUDY3VkxOL2g3dlp6Wi9HcS85a09jQW4zdWx2cFBjaDQzZTRXVnAyQjNad3BBR1pEakgKK2lFWUVFeEVDQUFZRkFrTGlZbThBQ2drUWJaaU5GNGN4WERIczBBQ2dwNVBrcU5BSjV1SkN3OEpmckt4N3lBZTIKKytvd0FvS2tUZ1RlVEhoQmwwSnZobXA5bFVyZnA3MDJmaUVZRUV4RUNBQVlGQWtMalZjQUFDZ2tRRXk1SjFPUWUKKzNINVVkQUNna3dKWDRUeGNCejE1d2FQdVNFVHFLY0RVSjdFQW9JZHJ4MHZWVVdVYmVTUFlyRFEyalg5VzRna0oKK2lFWUVFeEVDQUFZRkFrTGpaTnNBQ2drUWRjcWlvL09iTjFDdlZ3Q2doQzR1OHBzYlM4WGNHSDNYMWQzY1hldDUKK2xkc0FvSTRHbEpVS2hWNDhlWmw1MGJJTXVFdW5FdmNyaUVZRUVCRUNBQVlGQWtMa2J4UUFDZ2tRak9OMnVCelUKK2hoK2Y3QUNmU1ZSekZjQWNCdy9EemR3MEt2SVJ4THBwL0xjQW4xVUVsNktEV05qKytPQ3Z2Sk9wU3p2SnpoK2gKK2lFWUVFQkVDQUFZRkFrTGtrc2NBQ2drUUJKRTBRdW9ibzQyL3FnQ2RHZmdLQmcySHRkdHNFUURtQUNtc3BmWC8KK1h0RUFuaW5yYUpaZWpXZmtadnpTbXhTUmorbjJNc0NMaUVZRUVCRUNBQVlGQWtMbHdpQUFDZ2tRWVJscUxqTSsKK1RvUTNld0NlTkpkKzNDMlhFc1h6N2R6Ty8yamo0RlJxV3VjQW4zSW1oTXA4N2h3M3lFQS83N1Y2Mlc5cHRQalgKK2lFWUVFQkVDQUFZRkFrTHFZL2dBQ2drUXNyNjhRQlVwSks4RUxBQ2NEUENLclYwSlAwd1lrSXVoY3F2eHg1dWYKKzg3d0FvT1dyV1ZmQmZxKzQxVVlVOVVpZmhXbGJHa0E0aUVZRUV4RUNBQVlGQWtMajdXb0FDZ2tRTW9aT1FaeUYKK0lpc0xzZ0NjRHBZeTl2dm4xVU5BVWlrYnhVcjB2bjBydHlnQW5pY2JEb1c4Z25kNk42NnNHbFhtT1JSWXZoWnYKK2lFWUVFeEVDQUFZRkFrTGxFTGNBQ2drUVVua3ZyNWw0cjRiOURnQ2RFb1AxQkp3ZnlBS0tveDh5cUFZcndqR0EKKzdhMEFuMVdOeUF5a1IyMnl6WDFnVWd4RVZnazZSMTdZaUVZRUV4RUNBQVlGQWtMbEVhVUFDZ2tRYTNPaEJpcGkKK1AzS2hnUUNneElFM3NNN2VrNDVncENQVWEySXhlT212UitNQW5pVDRlRzVrOHBuSDhFUnArdElkR3ZUTTlaaW0KK2lFWUVFeEVDQUFZRkFrTG1tV0lBQ2drUWFPdU1kdmpxS1dkNVJBQ2ZjT0JGZ0lFVkRNWDlGSGRjNk1vR0EwSG4KK1FJRUFuaVR4MG01T3RoSTlkVFpZelJqZGMzY00wUjdraUVZRUV4RUNBQVlGQWtMbllWY0FDZ2tRYnBSMWxNRlMKK1F4cERud0Nnb0VEUHVkSFU1TFNRMmczZklGVGhnU2tZa2lJQW9KRS9ZSGJRMm5OSnZiTmlCd0twTFpOSm5ORlAKK2lFWUVFQkVDQUFZRkFrT0huNTRBQ2drUVpqVzJ3TjZJWGRPYnJ3Q2dveko1K0JxWjJZWTFoVXU0amRDeUY0TVoKK3VUOEFuMktIWXloZWMwbXlFVHNlL1hTZU5Sb05QMWNWaUVZRUVCRUNBQVlGQWtZNDRzZ0FDZ2tRRlVXei91SWkKKzNrODV6d0NnbWlGQ25Zc2ttcTRidi84eEZaK3U4dmF2N013QW5BMUtHOVM5bW5OVWRSUndmVnhPSDAzL3oxZFMKK2lFWUVFQkVDQUFZRkFrWTQ1NklBQ2drUVk5Q3RycEVTQStSWlZRQ2FBNFhOSFlvMUx6NWppaUM1RitueHVZTzkKK3c3b0FuajdEcTQxdm1DSE9may9hbmxUTXg4bjV0cUtiaUVZRUVCRUNBQVlGQWtZOGt5b0FDZ2tRbUhEdjgvRXYKK1lITFp5UUNnbk93MmV5YzE0R2dlQ0pvc0FkbmNoakJWQXZFQW9JclRoU2hNTmN1UGxkWFRUZDVHV0MrRC96UDcKK2lFWUVFeEVDQUFZRkFrWTVHcmtBQ2drUTRlSHlzSmtPMUtyMVdBQ2ZRWXh5dzhocGtlZXNTcFNoZDZsYXRmb3cKK0pvTUFuMEVmdEttMVZta2lHbFV0UXdvUE1sSzlyY1RuaUVZRUV4RUNBQVlGQWtZOFVFY0FDZ2tRVEFRb0dERWEKK1BlVlR0UUNnbnNCTUFMSEg0L1ZYMDhiTUJlZ1Mrc3pZL0t3QW4xdjk1QnU4enlOblVvMWljeG1EMEdEd0d0TEoKK2lFWUVFeEVDQUFZRkFrWTlvSklBQ2drUUxybEdnb2lCZEFJOFVRQ2dydlpJa0g3MVprcTFXVy9SeXZER3M0YnIKK2ZvY0FuMk9ZTGtqcy9laWgrWFNkdWZPWEp1Y0Q4aytaaUVZRUVCRUNBQVlGQWtZOTFuZ0FDZ2tROWNKZ0ZrenUKKzExOU9NZ0NlUDJiem43SHNRb0NFRWJxRVJJTmZ3L1c1NGlvQW4wM0NvZlhTeFpENDVROThpTVB6UW5OUzlQNjcKK2lFWUVFQkVDQUFZRkFrWTk5UVVBQ2drUW9ITFUwRU5ZeFlTWmdRQ2RFejJaU0pMS3RSSndHTFUwMG0vN1I2VjgKK1RWQUFuM2Y1dDQya3gzU1pZMFZ4aU8xQWJGUjV5OUoxaUVZRUVCRUNBQVlGQWtZK0JjVUFDZ2tRQXFXbUJRdCsKK2JQb2tKd0NkSGhzd2V6U0VMVnl4SU1ycVljbHRKd2FhVmEwQW5BNCtyWnRUQWlsd08zK00xZFVkTHQ5STYxSGcKK2lFb0VFQkVDQUFvRkFrWTQ5NGNEQlFNOEFBb0pFSFBkakJZQlV3STFmZGtBbmlQdE5zaTVFcXBuU1pUQVZYMVIKK1BZNkUvNlFRQUo0eVpjc0tMZC9EMHZCYmFIWllnbnpiNnArbFNJaEdCQkFSQWdBR0JRSkdRTFpNQUFvSkVHMEwKK3h6cEFXQmczSDFjQW4yMHVtMHR0RmRSSlo3a0FRS0g3Sm90TW8yODZBSjkzczdhdzBDSzRmdndaRnlDYU95QmQKK0Rjdm9GYlFvVTNSbFptRnVJRUp2WkdWM2FXY2dQSE4wWldaaGJpNWliMlJsZDJsblFHVndiM04wTG1SbFBvaDMKK0JEQVJBZ0EzQlFKQ3hVcnFNQjBnU1NCdWJ5QnNiMjVuWlhJZ2FHRjJaU0JoWTJObGMzTWdkRzhnZEdoaGRDQmwKK2JXRnBiQ0JoWkdSeVpYTnpMZ0FLQ1JDaUVWcmhYMnVMY3RidkFKMFJ6cUYwS3ZUM2hyd3NiNXlGTjM0N01iRjgKK1ZRQ2RIY1crMjRieXkvZnJzcWVUVEpzeWVrNHovaUdJUmdRUUVRSUFCZ1VDUG5la0dnQUtDUkFWUDZETmRhWjIKK2t2VjdBSjQ1Sjd1VTY1K0Z6ZVo5TmV6dDVLK29RSzN6MmdDZlJVejVpQkFkdDkxV25mWmdUc2UzbzNvWTkvU0kKK21RUVRBUUlBQmdVQ1BuWGZEd0FLQ1JBK2o3ZnkrSU5CMlEvdEErWTlsYytMdWJyQkdJdWgreE9VY0pzR3RINTYKK0ZhaEpLb0tZZENNM1VNWkcxcVlZVHBmeEJzd2kyMFA0MHVuNjVQSHlQOFRTd1pSMCtkYVNUTHAvQzNWL2NCaDYKK2dDQUpjMjgraDdDd0xxWm1mY1V4MFNqcThsempjV2FHeFIrNlk2MjZlOFkwR2RkMHp3WklJbjVFRkw4Qkl5TkcKK3NRSVhYYi9YakhDRExJaFhCQk1SQWdBWEJRSThQdG8yQlFzSENnTUVBeFVEQWdNV0FnRUNGNEFBQ2drUW9oRmEKKzRWOXJpM0t6L2dDZzBQbENFUjNKVWpLa0c4SlFlL2xJSm9BcHgzOEFvTVcyRzFsT3VNWDU0UmlXUzA4dEcwajMKK09ONFRpRVlFRXhFQ0FBWUZBajZOempVQUNna1F5bWs1ZElFRG8zNk1BZ0NnaHdCNElncTNaQUUrY0MyR2RTVGcKK09HV1l6c1VBb0lEUWpQMW02MWNadmFYNm55enVHRVhmNWowdmlFWUVFeEVDQUFZRkFqNTEyc2NBQ2drUTd0SHEKK09TSmgwSE9MemdDZEYxMjhISzRPaDJYa3BvSkoybDdxVDFwaVF1b0FtZ0wrNTNieGZRemp2d3FXWnB4VldOdjQKKytyTUVpRDhEQlJBK2Rhb3UvVytJeGlIUXB4c1JBbm9QQUo5LzNYd3RHS0FWVElTOWlQVGdMWGF5anpzazFRQ2YKK1JFMFhENC9YOUpIMHl2OGxDWTdNbFdHWEIydUlSZ1FRRVFJQUJnVUNRc1V5aGdBS0NSQ2I4aU5GTCtLTHo3Qm4KK0FKOUc5OWJvM0lHZ0NudWhMMGd0RWMxaUhZWnVHd0NkRmdheldGSm9ZcmlzYkdiOSthckdQNE8rb2phNUFRMEUKK094SWlWQkFFQU0xU2xrdkVLNU1yTW5XMHlidHY5ZU1DRzg5Z3FJdmQyZ0JucGNBc0Ywc1grZENhV0hXTnk1SEwKKzNkQmFrL0czQko4K056QWtzZkw1U3JtMExWS2NmVmpCaUcrSXNiVW9TeWVKUUd1aFNaWFljbkljLzNaOFVqY3MKKytUZkZ1ckc4dUhVMWNXbk5LNWFNWXdEcnF4bXA0UnUwekxZSHc0dEhCQktGMGNnRmFDc2pBQU1GQS80OWFTWnUKK0RhYXRwcFNhQk96Q3Q3d0lZQ3NHQnhYNVppYnJKcXIwZ0xVYmhYVTllYVd6Q2F3T1d3Q3ZwUU4wbFRqb1lWa3cKK2lMWmFZVWtkcXNTUWdIQVUzampLbEl1YUlSWEFwRWtUYjhKZzdSL3ZOQWR3WG9aUkxCQ2paUEdkNXFHdG5JZXoKK3NaMitseEZ4K2JSaWVVTDhmVUluZW1Yd1dsOGUyM1BNaXNnbStJaE9CQmdSQWdBR0JRSTdFaUpVQUJJSkVLSVIKK1d1RmZhNHR5QjJWSFVFY0FBUUVOTWdDZ25jMjJrajhUZmprdFU2dTRTVVVxdWQyNVpaY0FuMEIyYjB6UGpLakcKK3Vpd2RLU25rRmJOY0ZTM2cKKz0xd2hZCistLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCisKK3B1YiAgIDEwMjREL0MxNTI0MzFBIDIwMDUtMDctMTggW2V4cGlyZXM6IDIwMTAtMDctMTddCit1aWQgICAgICAgICAgICAgICAgICBTdGV2ZSBMb3VnaHJhbiA8c3RldmVsQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICAgQzE1MjQzMUEgMjAwNS0wNy0xOCAgU3RldmUgTG91Z2hyYW4gPHN0ZXZlbEBhcGFjaGUub3JnPgorc2lnIDIgICAgICAgIEZDMjQzRjNDIDIwMDUtMDctMjAgIEhlbmsgUC4gUGVubmluZyA8cGVubmluZ0Bjcy51dS5ubD4KK3NpZyAzICAgICAgICAzMDJEQTU2OCAyMDA1LTA3LTIxICBSb2RlbnQgb2YgVW51c3VhbCBTaXplIChEU0EpIDxjb2FyQEFwYWNoZS5Pcmc+CitzaWcgMyAgICAgICAgMkMzMTJEMkYgMjAwNS0wNy0yMSAgUm9kZW50IG9mIFVudXN1YWwgU2l6ZSA8Y29hckBPcGVuU291cmNlLk9yZz4KK3NpZyAzICAgICAgICBFMDRGOUE4OSAyMDA1LTA3LTIyICBSb3kgVC4gRmllbGRpbmcgPGZpZWxkaW5nQGdiaXYuY29tPgorc2lnICAgICAgICAgIDgxMDNBMzdFIDIwMDUtMDctMjAgIEFuZHJlIE1hbG8gPG5kQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgNTc5MzQ5OEYgMjAwNS0wNy0yMSAgVGltIEVsbGlzb24gPHRpbUBlbGxpc29uLm5hbWU+CitzaWcgICAgICAgICAgRTQxMzYzOTIgMjAwNS0wNy0yMSAgTm9lbCBKLiBCZXJnbWFuIDxub2VsQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgMUNENDg2MUYgMjAwNS0wNy0yNSAgRXJhbiBDaGludGhha2EgPGNoaW50aGFrYUBhcGFjaGUub3JnPgorc2lnICAgICAgICAgIEVBMUJBMzhEIDIwMDUtMDctMjUgIEFqaXRoIEhhcnNoYW5hIFJhbmFiYWh1IChNYWRlIGF0IEFwYWNoZWNvbiAyMDA1KSA8YWppdGhAYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICAyMUQwQTcxQiAyMDA1LTA3LTIwICBEaXJrLVdpbGxlbSB2YW4gR3VsaWsgKGh0dHA6Ly93d3cuYW55d2kuY29tLyAtIFNlbmlvciBwYXJ0bmVyKSA8ZGlya3hAYW55d2kuY29tPgorc2lnIDMgICAgICAgIDM2NDJDQjRCIDIwMDUtMDctMjAgIE1hcnRpbiBLcmFlbWVyIDxtYXJ0aW5AYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICAyMjYxRDA3MyAyMDA1LTA3LTIwICBBc3RyaWQgS2Vzc2xlciAoS2VzcykgPGtlc3NAa2Vzcy1uZXQuZGU+CitzaWcgMyAgICAgICAgRTJENzc0REYgMjAwNS0wNy0yMiAgU3lsdmFpbiBXYWxsZXogPHN5bHZhaW5AYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICAwMTVBRkM4QSAyMDA1LTA3LTIyICBCZXJ0cmFuZCBEZWxhY3JldGF6IDxiZGVsYWNyZXRhekBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEU0MUVEQzdFIDIwMDUtMDctMjQgIENhcnN0ZW4gWmllZ2VsZXIgPGN6aWVnZWxlckBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEYzOUIzNzUwIDIwMDUtMDctMjQgIENvbG0gTWFjQ2FydGhhaWdoIDxjb2xtQHN0ZGxpYi5uZXQ+CitzaWcgMyAgICAgICAgOUM4NTIyMkIgMjAwNS0wNy0yNCAgSGVubmluZyBTY2htaWVkZWhhdXNlbiA8aHBzQGludGVybWV0YS5kZT4KK3NpZyAzICAgICAgICA5OTc4QUY4NiAyMDA1LTA3LTI1ICBDaHJpc3RvcGggUHJvYnN0IDxjaHJpc0BuZXR6cHVua3Qub3JnPgorc2lnIDMgICAgICAgIDJBNjIzRjcyIDIwMDUtMDctMjUgIENocmlzdG9waCBQcm9ic3QgPGNocmlzQG5ldHpwdW5rdC5vcmc+CitzaWcgMyAgICAgICAgRjhFQTI5NjcgMjAwNS0wNy0yNiAgQnJpYW4gTWNDYWxsaXN0ZXIgPGJyaWFubUBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgIEE5OUY3NUREIDIwMDUtMDctMjEgIFJvZGVudCBvZiBVbnVzdWFsIFNpemUgPGNvYXJAT3BlblNvdXJjZS5Pcmc+CitzaWcgMyAgICAgICAgRUMxNDBCODEgMjAwNS0wNy0yMCAgRGlyay1XaWxsZW0gdmFuIEd1bGlrIChodHRwOi8vd3d3LmFueXdpLmNvbS8gLSBTZW5pb3IgcGFydG5lcikgPGRpcmt4QGFueXdpLmNvbT4KK3NpZyAzICAgICAgICBFRTY1RTMyMSAyMDA1LTA3LTIwICBNYXJ0aW4gS3JhZW1lciA8bWFydGluQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAgMTUyOTI0QUYgMjAwNS0wNy0yOSAgU2FuZGVyIFRlbW1lIDxzYW5kZXJAdGVtbWUubmV0Pgorc2lnIDMgICAgICAgIDg3MzE1QzMxIDIwMDUtMDctMjMgIFJhcGhhw6tsIEx1dGEgPHJhcGhhZWwubHV0YUBhcHRpd2FuLmNvbT4KK3N1YiAgIDIwNDhnLzU5MDY2RDdCIDIwMDUtMDctMTggW2V4cGlyZXM6IDIwMTAtMDctMTddCitzaWcgICAgICAgICAgQzE1MjQzMUEgMjAwNS0wNy0xOCAgU3RldmUgTG91Z2hyYW4gPHN0ZXZlbEBhcGFjaGUub3JnPgorCistLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KK1ZlcnNpb246IEdudVBHIHYxLjQuMiAoR05VL0xpbnV4KQorCittUUdpQkVMYjIrb1JCQURoZ0VWMjlqaEFNZzRkRkpOOWZqZUlqTjcrSjBMajNyY0xCV2M1UlRsTTMzRFRPQ0ZNCitCQ0lFOUIvUlhKdVZoR2dpN2ZVdUIrV3NIejdYTWdaUm4rNW5xSUtHZWNJeHdFVXRaQ2Z3c2FWNklkM2FidDMwCit3Y2N5WURUU1Y5NWdRaWUrYmJ3V0Y0NGFvN24vQ2FSMVdVVS9OeDViMjZuWTJFek9yUWNnUDFxWUV3Q2d5bm5jCitOVTFOM3pkMWNJWXI1aFFWcXZkYXpLc0VBTWJZQW01V3NqQmxMQnJvbHhzL3NteDR2eFpZSmFBM2dVcVR6OVdZCitEMDhyRHNvdFZJTW9vc1lGMGI0YjNXeGNlUEo2OE4xcGtGM1Urem84YklaSlRoVDkxbkFmTWgyOVpBY1N5UnFnCitNa2QyNU9jcnJqeWtlRjdPYXZ1RlN3aHZZb0RkbHdzdmt1aWpIWTN3ZVh5aHBqdnppK0d6dlpvT05vM3pTbDRnCithV25jQS80dnU2azdYWlVaNkI5RGJKTEo0WHFxOHVoRDd1VDQ0MTd1Q1Fkb3pJV2dLRTRUaE0yV2ZmaFYySWdZCitXNklYZytvNkFxWTFxaU1MU1lZZGVSc1ZrUS9HVnNzK3NSKytjYnNPNWlqREdmdmxXUGZHeEljQStQK2FsQXdmCitLWTlNNDVJQjhFOTJEVURydTZJbXJESE1lT3JsRE5QUnVzeFJ5WjRTaVNKWU5jZ0J0TFFpVTNSbGRtVWdURzkxCitaMmh5WVc0Z1BITjBaWFpsYkVCaGNHRmphR1V1YjNKblBvaGhCQk1SQWdBaEJRSkMyOXZxQlFrSlpnR0FCZ3NKCitDQWNEQWdNVkFnTURGZ0lCQWg0QkFoZUFBQW9KRUc2VWRaVEJVa01hWnVnQW5qSlZ5TWExRllFbS85ODExV2htCitLMDZrR3pYYkFKNHJnUlRCT2N1eVZibWJPQWVZQ2dxbG9PeGt5NGhHQkJJUkFnQUdCUUpDM3JsR0FBb0pFSXVXCitLVVA4SkQ4OFJld0FuM0xtcG5tbkxsWW5sUVc3K2J5SVRtS0xPOWd3QUtDaTBHR1F6MFFVcTl0Rkc0WWVGN1JwCitVQ2w4WkloR0JCTVJBZ0FHQlFKQzMyeThBQW9KRUZDT3JzVXdMYVZvZjFjQW9MWDNST085dWZIK1FYWWxCdXk2CitIQTVTZ29mQUFKOWFPTi9qQzNXbXJ4VDlMei9EbElCS1ZJOVRab2hHQkJNUkFnQUdCUUpDMzJ6QkFBb0pFTjI2CitaTG9zTVMwdkN5Y0FuakZoR2M2M0ZvV0h3enBmVm9vY3JCbTh5UVRIQUo0N0tsZTFUcitmQm5sa1lzQWcweFk2CisxMlZaOVloR0JCTVJBZ0FHQlFKQzRQRXFBQW9KRUZ1V2dCRGdUNXFKWTZJQW5qMmp4ZFJlWGgzZUJScitlYXNQCitiYm9IOUx1MEFLQ1NvVDBHdCtwTStHN1hNOHZRYlpqc3lqRGhyb2hNQkJBUkFnQU1CUUpDM3QrM0JZTUpZdjJ6CitBQW9KRU1wcE9YU0JBNk4rNFZBQW5SZkdER3ZVNHFEb3AwRWRBcG1IQ0V4RkRIRkRBSjkvM3haRG5KakVlU0dyCitsMkp5T1BKZmJ2L2swWWhNQkJBUkFnQU1CUUpDMzAvdEJZTUpZbzE5QUFvSkVFSHFDYUJYazBtUFJLd0FvSTBNCitGRHlocjJQT041N040NjE0UG8xNmE5Wk5BSjBTR0tKdE1PSXhnb0RIU2Y2U1l1RnkrOHNCTFloTUJCQVJBZ0FNCitCUUpDMzVNRkJZTUpZa3BsQUFvSkVBRUZacnprRTJPU2djc0Fuakt2NFBPUG1GVVloREdIK0dDY3hTeU05TFBvCitBSjBUUG5vTGY3NGxVcm9XRDUrcmxoVFBEOWVNSFloTUJCQVJBZ0FNQlFKQzVIdnRCWU1KWFdGOUFBb0pFSXpqCitkcmdjMUlZZmRDQUFvSUt5YllMR2Q0eUdFOE5jcnZuR2FQU1h4Nk5YQUo0enJJUEE5dFF1MjN0T0hhclp4U3FnCis3QVdHaDRoTUJCQVJBZ0FNQlFKQzVKQ0JCWU1KWFV6cEFBb0pFQVNSTkVMcUc2T05XWnNBbmlKdnZNaURSNjFOCityVjVZN3h4LzMvaWQvZWtXQUo5TU5VVVFBWFRFUzFka3l3UVZIVnA2QzhRRnZvaE1CQk1SQWdBTUJRSkMzclIxCitCWU1KWXlqMUFBb0pFUDF2aU1ZaDBLY2IyNm9BbjJKdUYzNTVMcTZQSUV2bmhFcitTQTNub3hTOEFKOW1zQlh6CituSHNPUnN6OG1CNFdaNERNQVlFSDBZaE1CQk1SQWdBTUJRSkMzcnZvQllNSll5R0NBQW9KRURMSjVNNDJRc3RMCitDdTBBbjJ2Q09pbW05aXlSSmVrdmxoN0ljc3JYVkRrc0FKOVMxaVZYQmd5UnVXQmtiY3VSazlPTHMvVG53b2hNCitCQk1SQWdBTUJRSkMzdHdsQllNSll3RkZBQW9KRU83UjZqa2lZZEJ6M2drQW4zYjQ4cEhwalBHNURDYmZwMG9UCisvV045SXFZbEFKNDdDTGsyeGc3ZThONTNXVG1ZZkwrRi9jL1pyb2hNQkJNUkFnQU1CUUpDNE8wakJZTUpZUEJICitBQW9KRU1tMXB1emkxM1RmK0tnQW5qdmlCajRrdkM5QUJpV1I3MHQ0QlUzeThrZ0pBSjlxbWo3MXFXanJlay9MCitDYjMrZkFtbEFTeDgySWhNQkJNUkFnQU1CUUpDNE8yMEJZTUpZTysyQUFvSkVEZjJqL1VCV3Z5S0p5d0FualNDCitzbWFCMTh1dFBnSHRoVlcwcURRK0REbU5BSjlhNjR1S3FjREk3dTFjREViaTNuTDVFTHp0Q29oTUJCTVJBZ0FNCitCUUpDNDFzbkJZTUpYb0pEQUFvSkVCTXVTZFRrSHR4K1N5VUFuMTlNalZkblBkeEtkaVhqcE1SV3dPczVmaFRMCitBSjlBR2grVHZ5T3Q4NzdjZkxWYXl3UEsrR2hOMG9oTUJCTVJBZ0FNQlFKQzQyVVFCWU1KWG5oYUFBb0pFSFhLCitvcVB6bXpkUWU5Z0FvTDdCdWdEZDFObmlYL1pOcXMwYUQ3WTF1VWZoQUowYjRwMzRaWVBXRmcxQ3lVZHV3WWx4CitNQU9xbzRoTUJCTVJBZ0FNQlFKQzQrM2dCWU1KWGUrS0FBb0pFREtHVGtHY2hTSXJIbDhBbjBFUmxXQ0NESFl5Ciswamxic1ZjUTRGT1M5cWU2QUo0c0xGMDJBbHRHMDFiSzFrcHZuS1h4SEZWWW9JaE1CQk1SQWdBTUJRSkM1UkR3CitCWU1KWE14NkFBb0pFRko1TDYrWmVLK0dXRWtBb0lsK0dNMWNnSm9zU01zTUcwTnFYb2c5eXFlS0FKOWFKMFhyCitqN0pQNWFiUnlqUk9yb0lVQ1VjYzRvaE1CQk1SQWdBTUJRSkM1UkhkQllNSlhNdU5BQW9KRUd0em9RWXFZajl5CitJYXdBbjNUemdSbkpQZmw0Z2cya3dJbEp0RC9hNHFsNUFKNDMrQmJnM0VXaDJSVmFMQjdRcEExcEFzUkZCNGhNCitCQk1SQWdBTUJRSkM1cG5WQllNSlcwT1ZBQW9KRUdqcmpIYjQ2aWxuV3o4QW4xV3B1bW9ZQVJxM0xlMVZHMHZ1CitTa1FjZGc4U0FKNDg4TUhOUVJxMmZ5UUZrOXVJc3RXcmlRZmE3WWljQkJNQkFnQUdCUUpDMzJ5MkFBb0pFSnJOCitQTUNwbjNYZHNsMEQvajdKKy92b2JILzQrcG1XQ1d2M29rcUJiYmQ5UEgvTkpUQzNCN0tVK3A4YkZkSUlaV1loCituOVNQWFJkTG9VbGJLbnFZdzYreDBLdG4vOW9XcXdUTTJiMWJPSG9NRVV5L2hQRE0xWksyZ0dEVTExQkZiZkM0Cit6a1hvd2JxMnhDSEx5YVFYcWo1V2p1MDFQVC93ajhidzVBMEUycnp2MmlVQTJpbFhKRTF2UWR4K2lLSUVFd0VDCitBQXdGQWtMZXJRMEZnd2xqTUYwQUNna1FNYVk5bHV3VUM0SDZqQVArTDNsdm50SWRlY2owUWxuRDRnVGtkTG4rCituYk9QVDBHOU1QU2pBM01MOUJxZW9oL3VEMlRlSFMwZHFiNjdEcEl6aEtWL3p1NnZyT2hzWEhYTmlDalI0bHhSCitZSEJnMFBveExKa2dncGpkQWR1azV2Y00yWmdSSlpRb2pzUTlDdW54bm1BL1lDUkNFRVVQRmVLai81cDFhRkdtCit1UHNsMnp3Z2dIeGJkT0JZMW1hSW9nUVRBUUlBREFVQ1F0N0l5d1dEQ1dNVW53QUtDUkEzNC9SZjdtWGpJVE5TCitBLzlZQjhzckhEMldicFp5NVAvY042V2pQc2hZZ3gwbFZGT2lmRmRYZ0Q0QVV6Z0ozVm10SDFOSTBSa2dhZGN3Cis4UGRKWUF5bkgvSGR6NFBKOHdJRWttTUZFZTZUS0IzQkNqQ0dZOCtUaTZSL1ZybGtpeklHTDBIekFVek5jK2cyCitEMU5JODcyNUlkeCtYTlNPU0JjT0JaM213UFZvMWs2N1gxckY4Qm9ZQWVvOFRvaE1CQkFSQWdBTUJRSkM2bVluCitCWU1KVjNkREFBb0pFTEsrdkVBVktTU3Y4QndBbmlRenI3bC9paFZ2QWh2TlVucEp6RldmcjZ0ZkFKOTNNYW1hCitEK0Z6NGtnRVZqbk81ajhNck02SnRJaE1CQk1SQWdBTUJRSkM0bU5CQllNSlgzb3BBQW9KRUcyWWpSZUhNVnd4CitQcjRBbVFHV2xBcFczQzFWYmt1UmdWczhwajYvZWpYcUFLQzF6M0Q1bU1wajgzeXllam5CanhEalhUTHNVYmtDCitEUVJDMjl2eEVBZ0EwNVBOZFhjVk9TVHNZdWl6VENiZEJVOWkzcVVCa0F5cVBtREU2aGtXSSs3Zm5yOEtBVVVvCitVZ2hXd2h4cUJuZ3B2NDhvM21FK2JDK2wvY1RIK0R1SElPc3N6cFNLNXlkdWZ5aXRYaTdwaVlrNFJTK1VOYnlsCitiNEJVNXFHb2R3V3dYQzl3S0JJalhMNXJLMktqS2g0T3ZoMFdvZ3RaMWZ3YzVOelFramNmYm5lcjlXc0FtanRkCitubVZWMnZaaEpkRGx4ZjNCQk05YWkyUjJJUnZmaEY2MVFGWmNyMmVocUFkc2lEaXg4cDB1Z3BDL29RUzhoOHBnCitHUWViejdhTmVTamgvVmIzZHNkbzhDYUx2SHAxbk01YVZDRFJxb0Nmb2VLVWJSZnd3d0t4dGMxY3lZek9IRDFmCitLRzlCdXZ0TDR5NEpRL2dEQ3NRVktkQUFvaWt0dThLczl3QURCUWYvZkdrVllJaDd3MCs4eFNJdmV6MURLaXJYCitybDFKM1hOdk9ZSWExcWxCazY1aGxsWG5GWGVYcW9PTFFwdnlnY3dOUmZpbDNBR2Nwd3p3bE5sb2VtM296am50CitJRnZZSll6QjZxNFNNbDEvYTV1THJjYzJmcnE4dGJHMFJoVStaRWhXUjZzSUVPQlFoa0taOUxaYkoxdEs5YnVKCitNMG1lYUl0NWdWTEFWYkk1dmYrMkx2bWx2MCtFL2E0Wm4yZXhsMVJjQllBVE5aVDFnQzU1bTB6NVBNekc2QmM0Cit0T0FoUEVvM1dwZk5qSXJGZVhjQjBrc2s0bWZESVdLbEEwbWM4QStmYUtTU01kaURwZVU0SDR1Wnk1cEUvaFZ2CisyVnlFM0VqNVBvQTNEYWpSemdRNjlZbG9qVFluZm5QeUpFckNCWmh0WlhUdFJZN2FEbTkveEJUN0ZaMDZSSWhNCitCQmdSQWdBTUJRSkMyOXZ4QlFrSlpnR0FBQW9KRUc2VWRaVEJVa01ha2pFQW9JTktWNnlMQWRiQmhYaHZNc3FLCiswTjZYT2doSkFKNG1TZ2R3Z3Yrc0lPYVBLUXFDbStQTDJNMGxQdz09Cis9NFRsSQorLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQorCitwdWIgICAxMDI0RC9BQTAwNzdCMCAyMDA2LTA2LTEzCit1aWQgICAgICAgICAgICAgICAgICBLZXYgSmFja3NvbiAoYXBhY2hlIGtleSkgPGtldmpAYXBhY2hlLm9yZz4KK3NpZyAzICAgICAgICBBQTAwNzdCMCAyMDA2LTA2LTEzICBLZXYgSmFja3NvbiAoYXBhY2hlIGtleSkgPGtldmpAYXBhY2hlLm9yZz4KK3N1YiAgIDIwNDhnLzhBNkRENzM4IDIwMDYtMDYtMTMKK3NpZyAgICAgICAgICBBQTAwNzdCMCAyMDA2LTA2LTEzICBLZXYgSmFja3NvbiAoYXBhY2hlIGtleSkgPGtldmpAYXBhY2hlLm9yZz4KKworLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCitWZXJzaW9uOiBHbnVQRyB2MS40LjEgKERhcndpbikKKworbVFHaUJFU09mdW9SQkFEaUNManZZOEVHOGNEcmZOdlBhVkpyMS84ZDhHRG9MakJDZUpXbDUwTTdqMUlRREIrcgorcnpCUFhPemhvcWlOUmJaTWtwanY4b2ZhNWhWT1FpdFZTNEI2OUZBMDdSYnVpUU5US2cxNDJoOG9ndEplQUkxZworZVh1VFp0bUdFNDdUT3BqN0ZNRzhiSE9tb0pkUU1relVzZE9oRUF5cVJ1NG5va251dUlLZ3NFMWtZd0NnbmhhSAorOUtCbHBLYVJHN0JiMkJINmRhK3dtS1VFQUlhQmVaMWFTUW9kVXpEcW5HakNkNGhaYnB6anlXZzdPNUJ5bE5oSworb2dNWTk1QnZ3RlJEOFdGZFN2aHZIOVZLQnRTdU5xZy82Z0lrcUFsalJSRVNWeEw0UXJ6bFlTcUY1MTNrSzFkcworbFVUbXFVOUR2YWY3ZGtIK01ZbmtQVlRQNXRNWlZDVDdIRXQ0RjZIY3FsYVpLbHo1anN1M1I1M0tCeDZYWkFUYworU0VHYkEvd09vdXJuSjY0V2U4c1hUSkdIRnVwdlNMQnkzbmg2OG1QTGFwbHpUbkgyYWwxRExCbm9GMmdpQzMydgorWkdHK2UxMmtXRStmeXlRM3BkQUlSSGdWalovY2tQbWNteG5WY1lyaHpiZ1Y5OWZvMitKUmgyU1ZyTHJtdncrRworQ0tpVXROSG4wSFMxa2xCS1NqKzNNTDFBUVFsYnlmcmNWU2YwRmVmdWc1MUJxb3FVK3JRcVMyVjJJRXBoWTJ0egorYjI0Z0tHRndZV05vWlNCclpYa3BJRHhyWlhacVFHRndZV05vWlM1dmNtYytpRjRFRXhFQ0FCNEZBa1NPZnVvQworR3dNR0N3a0lCd01DQXhVQ0F3TVdBZ0VDSGdFQ0Y0QUFDZ2tRb0wvNVBhb0FkN0JuVEFDZmY5ZjhZMlJGQjdPNworV2puY3liMVhiRXdKQi9nQW5pbnJSMGlzVzlqR3g0OUdtU25RQ2p0TzlrMzR1UUlOQkVTT2Z6TVFDQUNQK0dQMgoreDJuRTJKeGpVVWpqMTZmdE94VWl2Ykw4TDlrc3BseDQxbjd5ZVJ2dStSek9YY2psb251bGQwTFl4cHJOc0hHdgorbWJBb1pqOTNRb3pIUUlNZkMya2ZuaWEraHhDY0JQTWJldjlSUENxZ29ncGI5MEJ0VjBmOUhHeVdYczJRVGdXRworUjJoeWpxL1Jwd3RBM29iU1h3M3BiMUNuWFc0c3RWNjVXQWRkNzJLRGM2NndSUjFnbWp4S1F4NmIxZEdjQytFNAorSHlPZ3UyQ0R0cjFVTFBlSTVVNEJBNHk4RkxnRGZZd2t4cDZ2ajVWaWVnR1A3R2xNYTNiU2dOUkdzWVg3VndnWgorcG1JOFdZNEI1azMvUHl2MlRvZTYvNXpUbUtIOFdseVpkMDBlZGUvdGJGVHFRTGcrRXlsQWNXSjhjM2Fzb29kKworU2pDd1R1RDhsOGEwd3BPM0FBTUhCLzlHWGtiQlVFOGNiTVRhUzR5ajdVTDVpV1JWaFNQbzlJek1TcnphWG1aTgorOHlrWDk2dWQzNUJDRWZtWWd0eTNVU01rOTBScy9QYndCNE1oM2gxWlRYcVJXY2ZPWHpKOGtNYWJtMlJBTnlmMgorSDJEdkdLb0ZQdHBYLzlJMTN2bzlxUkxSSFZSRU5OZyszSkNhMWlpOGNxN2g4Yld2VFQwVnhYL3JPRzBjbDhuTworWGtIVFVBUlIxOWNHUGY2WGtIRWNsK3UxcEF4SUpHcVkvZ1Zvd2p5RkdacytSWEZsL3EvVnJndStsdnZ4bXJ5ZAoreUVkZUdkc0J2UTlNMEtLcjk4dzFSaUpuRFVrU3FJNzExeHdsVmsxNFV1NlhrZTBvQjNiYnBlNFV4RDUyYXZBQworeUV6WVk3dmJwZTZYUzIrZE9jWnhXRTNldXI2U2ZzdWNBa2o0SWI3Mm1jaGhpRWtFR0JFQ0FBa0ZBa1NPZnpNQworR3d3QUNna1FvTC81UGFvQWQ3QlFBd0NlSkZiOXladk9XZmRmNzNBN3QyTXZQWG4xeTZrQW5ScXVNbUE1ZVZkaAorSGJBVVhXeVl1VDJPSE9TRAorPUYycTMKKy0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KKworcHViICAxMDI0RC9ERTg4ODRBMCAyMDA3LTA0LTI3IFhhdmllciBIYW5pbiA8eGF2aWVyLmhhbmluQGdtYWlsLmNvbT4KK3NpZyAzICAgICAgIERFODg4NEEwIDIwMDctMDQtMjcgICBYYXZpZXIgSGFuaW4gPHhhdmllci5oYW5pbkBnbWFpbC5jb20+CitzaWcgICAgICAgICA1RjI5ODgyNCAyMDA3LTA1LTA2ICAgU2ltb24gUGVwcGluZyA8c3BlcHBpbmdAbGV2ZXJrcnVpZC5ldT4KK3NpZyAgICAgICAgIEE5OUY3NUREIDIwMDctMDUtMDMgICBSb2RlbnQgb2YgVW51c3VhbCBTaXplIDxjb2FyQE9wZW5Tb3VyY2UuT3JnPgorc2lnICAgICAgICAgRTIyMkRFNEYgMjAwNy0wNS0wMiAgIE1hdGhpYXMgSGVyYmVydHMgPE1hdGhpYXMuSGVyYmVydHNAaXJvaXNlLm5ldD4KK3NpZyAgICAgICAgIDkxMTIwM0U0IDIwMDctMDUtMDIgICBbVXNlciBpZCBub3QgZm91bmRdCitzaWcgICAgICAgICAzMDJEQTU2OCAyMDA3LTA1LTAzICAgUm9kZW50IG9mIFVudXN1YWwgU2l6ZSAoRFNBKSA8Y29hckBBcGFjaGUuT3JnPgorc2lnICAgICAgICAgMkMzMTJEMkYgMjAwNy0wNS0wMyAgIFJvZGVudCBvZiBVbnVzdWFsIFNpemUgPGNvYXJAT3BlblNvdXJjZS5Pcmc+CitzaWcgICAgICAgICBGMTJGNjA3MiAyMDA3LTA1LTA1ICAgRnJlZCBWb3MgPGZyZWQudm9zQG1va29sby5vcmc+CitzaWcgMyAgICAgICAzMTFBM0RFNSAyMDA3LTA1LTA1ICAgUnVlZGlnZXIgUGx1ZW0gPHJwbHVlbUBhcGFjaGUub3JnPgorc2lnIDMgICAgICAgODg4MTc0MDIgMjAwNy0wNS0wNiAgIFRob21hcyBWYW5kYWhsIDx0aG9tYXNAdmFuZGFobC5vcmc+CitzaWcgICAgICAgICAwMTUzMDIzNSAyMDA3LTA1LTAyICAgTHVjIE1haXNvbm9iZSAoU3BhY2VSb290cykgPGx1Y0BzcGFjZXJvb3RzLm9yZz4KK3NpZyAgICAgICAgIDVGNkI4QjcyIDIwMDctMDUtMTIgICBTdGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0BhcGFjaGUub3JnPgorc2lnICAgICAgICAgOUM4NTIyMkIgMjAwNy0wNS0xNCAgIEhlbm5pbmcgU2NobWllZGVoYXVzZW4gPGhwc0BpbnRlcm1ldGEuZGU+CitzaWcgICAgICAgICA0MzU4QzU4NCAyMDA3LTA1LTA2ICAgVmluY2VudCBIZW5uZWJlcnQgPHZoZW5uZWJlcnRAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgIDBCN0U2Q0ZBIDIwMDctMDUtMDYgICBTYW1pIFNpcmVuIDxzaXJlbkBhcGFjaGUub3JnPgorc2lnICAgICAgICAgNENFRUQ3NUYgMjAwNy0wNS0wNyAgIE5pY2sgQnVyY2ggPG5pY2tAZ2FncmF2YXJyLm9yZz4KK3NpZyAgICAgICAgIDQwNTgxODM3IDIwMDctMDUtMDggICBOaWNrIEtldyA8bmlja0B3ZWJ0aGluZy5jb20+CitzaWcgICAgICAgICA2QkQ4NzJBMCAyMDA3LTA1LTE3ICAgTWljaGFlbCBCdXNjaCAoTHVjZW5lIENvbW1pdHRlcikgPGJ1c2NobWlAYXBhY2hlLm9yZz4KK3NpZyAgICAgICAgIDYyMTBCRkMwIDIwMDctMDUtMTcgICBKZWFuLUZyZWRlcmljIENsZXJlIDxqZmNsZXJlQGFwYWNoZS5vcmc+CitzaWcgMyAgICAgICA5OTBFRDRBQSAyMDA3LTA1LTA2ICAgS251dCBBbmRlcnMgSGF0bGVuIDxrYWhhdGxlbkBhcGFjaGUub3JnPgorc2lnICAgICAgICAgMEYxNDNCQzEgMjAwNy0wNS0yMiAgIE1hdHQgSG9nc3Ryb20gPG1hdHRAaG9nc3Ryb20ub3JnPgorc2lnICAgICAgICAgQTQ2QzRDQTEgMjAwNy0wNS0yMiAgIE1hdHQgSG9nc3Ryb20gPGhvZ3N0cm9tQGFwYWNoZS5vcmc+CitzaWcgICAgICAgICAxNTI5MjRBRiAyMDA3LTA1LTIzICAgU2FuZGVyIFRlbW1lIDxzYW5kZXJAdGVtbWUubmV0Pgorc3ViICAxMDI0Zy9BNUVCOEQzRCAyMDA3LTA0LTI3CitzaWcgICAgICAgICBERTg4ODRBMCAyMDA3LTA0LTI3ICAgWGF2aWVyIEhhbmluIDx4YXZpZXIuaGFuaW5AZ21haWwuY29tPgorCistLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KK1ZlcnNpb246IEdudVBHIHYxLjIuMyAoTWluZ1czMikKKworbVFHaUJFWXhuZzRSQkFDUXBEaTBlYlBHZEhWQWRWMTRhSzQ3TXpGa0ZKRWJDaXNCZ2NaMk9UL3B5UGpWVE4rOQorUTNOdEl1c1Z1WS95RWVPNCt0YitZVGJCaXdOc3g1cDkxUmRlcjBwckJCVlByOVRHTjhiVjgxaG5TSGZWQ1IrTworb3FyTGoyT252MXFzTXNsT3VaUjJtMWQvaTZjRklLVjBDVjlFV09jRUpaNlVFUDlDWFAyOVp6amRSd0NnNU5nVworWWZlcmd6dnBWdE9OMEU1VXZqRm5HbVVEL0FvV2hKMENSeHc4eGovRUFHUzR4WE84M1lkZjZ1Y3UyUHdxVU9TWgorTjJtTVd5QnByMTJzUUgraU1qV0pXMjVHTm9id0pCS3pmdnJvanVqdmxVNHV5Tkl5RDQwc1BlSDBVclR3TGJMLworS2VrOXpwOU54Wjl3YXdqelp2ZHA4c2RyT1o1NG81OS83ZmxBakwzaXFKUnRMUVNleVFzZlphT1NOUnhzQVVpSQorb2JuM0EvOVNFdEpkRjZITTZDN1Y1N1dkS0lIdjZ1Vm9jZFpOTjN6aWcyVDl1UDJVcTFWTUlFWXRsbFJOWC80VgorOVZxKzJLZFY3MkRubE11WklBKytvMW41N2QvTGdVbWJEZDcyQUFaR05KYUZxMzlDVjlZRWxYemlPN0JWT2pBZworTUg5a054Q3l3Y2pjdzhFRmEzTkNGY09LTUVTQm41c0h1MW53L0l1MVo5VHRhZ25Kd3JRbFdHRjJhV1Z5SUVoaAorYm1sdUlEeDRZWFpwWlhJdWFHRnVhVzVBWjIxaGFXd3VZMjl0UG9oZUJCTVJBZ0FlQlFKR01aNE9BaHNEQmdzSgorQ0FjREFnTVZBZ01ERmdJQkFoNEJBaGVBQUFvSkVBUDJqTDNlaUlTZ3cwZ0FvS2NBZ2pqZlFXbHFuUU5SSlErOAorQTdINWlvSVpBSjlxQXB4YjFpSDh1bEdIamlCT2ppU2dRcTBTTm9oR0JCQVJBZ0FHQlFKR1BoaERBQW9KRUQ0cQorYjhKZktZZ2tCOEFBbjI4ZXVWSno4T1Fadm9Tdzg5dm9IdmNWemV3R0FKNGxtMlIwRkNTSVJmbUhDbCs1YVNZdworVGF6ZU5ZaWNCQkFCQWdBR0JRSkdPZ2lxQUFvSkVKck5QTUNwbjNYZDhaOEQvMVovbWwvcWNJZjF5RGlZUVR1OAorTysvc28wWmxmVFlsRUY2WHJXNldqWkRJaE5WQUFUK1JrMUUzcStGdlpmTXExQlYxbXVic0NYUnRjd3QxQnIzegorTVdJdUo3bEJabCtUMU51MnN4SDlIN0ZBdlk3Qms4cDVXZWNJYVZkTnlGeEM5OHZHWUFGczBhUlJHU2VDRmJFdQorb1c1WFh4VUFra1dwSVQvYUcyeTN0NEczaUVZRUVCRUNBQVlGQWtZNDVDZ0FDZ2tRRlVXei91SWkzay9tQ3dDZgorV1VOZUtHNGEzaGdEaE1PeVoxRkdGcERubGUwQW5SMXlYV2FFYXpKRDV3eVR0bm5TRS9Bams0TDNpRVlFRUJFQworQUFZRkFrWTQ2TW9BQ2drUVk5Q3RycEVTQStTT3RnQ2VNSWg3QktKZVNlekIraDFKUW1VeWc2RXVOV01BbjNwTgorYU1ZWUVqMUxMOFIvMlp4Qk5iVTluak5YaUVZRUVCRUNBQVlGQWtZNkNLb0FDZ2tRVUk2dXhUQXRwV2hydndDZgorYzJ1aG1lb2c1NDc1ZDloVFFnOTRNcUVvOGNFQW9KT3A5NUJkWjd4ZDlheUp3TDRMbUJWWWFJTUFpRVlFRUJFQworQUFZRkFrWTZDS29BQ2drUTNicGt1aXd4TFM5cnZ3Q2Zmd3pycWZJSmdoV1VvWGhKc2EvbS9QU0xpb2dBb00zagoreDJ4dDVzRzFzUVFiek0rVTRWSGhSbVdBaUVZRUVCRUNBQVlGQWtZOHhvVUFDZ2tRbUhEdjgvRXZZSEtCWmdDZQorUGtZb1FzRVNGa0JrVnlpU1Z1ZUlDVXZnNEcwQW4zcnFjOC9CZWlwOWEyWUYrN1VZc0tLSjFlNU9pRVlFRXhFQworQUFZRkFrWThVWWdBQ2drUVRBUW9HREVhUGVWTndRQ2RFNFVCMVJXK21qdFlFYmd4a1pTamRhVjNJS2dBbjFTeQoraG9Pcm4zUzIwT2hhWmh0NVkwRWtzVlZFaUVZRUV4RUNBQVlGQWtZOW82NEFDZ2tRTHJsR2dvaUJkQUt6M0FDZgorUmtKWHJ2cFFWUWxrOS8vK08wVzRCdmdnR3hNQW9QeXZqUlhtK0llK25QQUlJNzRrTDdjcm9SV3NpRVlFRUJFQworQUFZRkFrWTQrNUFBQ2drUWM5Mk1GZ0ZUQWpYSU1nQ2ZYZlJseFBVd2x6TFdvdHIwQkdRVkszOUpYeUVBblJodAorY2dIL3lzY3Fia3ZpMkp2YVZXa1YvVDlKaUVZRUVCRUNBQVlGQWtaR0VqZ0FDZ2tRb2hGYTRWOXJpM0twSndDZworNHY2M0RUOUxsNCttcW5BQzEvSFdJZ1NmUThzQW9OK0VRMTV6VXVJMG51U3lHNlVDdy9VVVpYODJpSEVFRUJFQworQURFRkFrWkl4V0VxSEVobGJtNXBibWNnVTJOb2JXbGxaR1ZvWVhWelpXNGdQR2h3YzBCcGJuUmxjbTFsZEdFdQorWkdVK0FBb0pFREtHVGtHY2hTSXJrVWdBbmpJNmpCYWlkcUlqS2h1c1ZtNmlobUc2TEVJZEFKd0puYzZZUk55WQorODhNV3RkMFhSZ2hENlNUMTc0aEdCQkFSQWdBR0JRSkdQZmRnQUFvSkVLQnkxTkJEV01XRVlFWUFuMFJTNjl2SgorMUVWb2Q3V3hBZWNiMEY0dHlKY0JBSnNFblRpVFJNb05tSm1SZTZ3M1dxaHFkTFFVZVloR0JCQVJBZ0FHQlFKRworUGhOL0FBb0pFQUtscGdVTGZtejZhSklBbXdjUUk1WERXckxEelNGUkpGdVczRjF6bDdQMEFKOUdRWUR2dTRtSQorYzlaQ2NhTGR1a2JZMmU2RkdJaEdCQkFSQWdBR0JRSkdQeW9FQUFvSkVQWENZQlpNN3RkZmJROEFvSlZTUGEzZworQ21jNWdoTHoxWDEyci9RQkhQUEtBSnNINmcvMGhjQW91MlpVZlZoT0U3VkpocGVHa29oR0JCQVJBZ0FHQlFKRworUUx6MUFBb0pFRzBMeHpwQVdCZzNjWEFBb0kyckthdUhlSURSd2gwNVM4aU5HS1R0RWFQTUFLQ01IcnFiTHNibAorMFA3WHhUcFo0RUtTdk9rUTZJaEdCQkFSQWdBR0JRSkdURWFEQUFvSkVCOGhJOE5yMkhLZ3RSb0FuUmVxbUh4cworTWJBVFR0Q0VGK1diVHFSRWUxK0pBSjlwTTVWbU0vQXBmaDFoUE04aTU1UTk2QlAxaDRoR0JCQVJBZ0FHQlFKRworVElGd0FBb0pFQTlGQ2laaUVML0E0ajBBbkFzQWpBdTZuRFRkNzNUTTNTODBKdGJ1YXRYOEFKMFdCUkprNVpaSQorVG1uTXl6MnlwNms1N3R5ZVJvaEdCQk1SQWdBR0JRSkdQYkxiQUFvSkVPSGg4ckNaRHRTcUNPUUFuMFNWYW45agorcjU1TUpyREdrOEQzTTVwUXZUZDhBSjl1VTQ1aTBPUVVQK3pZNUxTYWNOdE96U3k2TUloR0JCQVJBZ0FHQlFKRworVW5hMUFBb0pFRExCMXU4UEZEdkJLK0VBb01qcnVqcHNFMVhRczNZeER3ejVISFNXdjlFN0FLQ0pMVTBXMk1iRgorT0lnczlTbXh6MkxidVlIN2xJaEdCQkFSQWdBR0JRSkdVbmJHQUFvSkVNdXV2am1rYkV5aDl1TUFvSjJmQmdabworMmtsK2pPemhRblhISERIenlMeUFBS0NSOFo2dGxvS1hraFBSSVYvTi9PandJVzBpNTRpcEJCQVJBZ0JwQlFKRworVThxa0lCeFRZVzVrWlhJZ1ZHVnRiV1VnUEhOaGJtUmxja0IwWlcxdFpTNXVaWFErSWh4VFlXNWtaWElnVkdWdAorYldVZ1BITmpkR1Z0YldWQVlYQmhZMmhsTG05eVp6NGVIRk5oYm1SbGNpQlVaVzF0WlNBOGMyRnVaR1Z5UUcxaAorWXk1amIyMCtBQW9KRUxLK3ZFQVZLU1N2ZUpBQW5pcTh3QjRiL0RkR1RLOVlnbXU1WTc2dHFzdy9BSnNIR2tuMworNUp5aUhiWEN2VnVqV21QdFkxL09aYmtCRFFSR01aNFBFQVFBK1QwWVJ0ZDJhZVhVK0FPSm5yaENoeTBkcHRWdAorQ0U2UFc5THJ3WkdxZVY0VEhOV2hkWXVXUldseXpnVTRIU2Z1azFTdnUzV0tNYm53cCtGdjhmVTZNbWlkT3ZFSgorcDlJVjFsNERpZElYeWhBYWN3cENOMTFoWHZqNWNIZEY0S2hKci9ORzlvZWRpbjZuUW9RRlJRN0Vma1VqQVhPZgorTUNablNwczlYQkpkeTNjQUF3VUVBSUdySVRheVZtV2ZVZ2pQdlFnOEwrNFIyaTMxWFE3MEhJRUxRdFlEczBMbgoraVdyd1p1TythTEk2SncxUmJaaWk2RE0yUXNWZFpqK3YzNlMyS0pUdlhlSlZ5YjUxZDB1WFlGeHJlMXVDWnJiMgorSTFMbGU4djNHVlF2bHJUcG1aSVBoT1RvdHNrS0ZXVUNoMmpxZ0xhRXZKUHBSV2dJUlhQRjRnMTJuQlhjTExYRQoraUVrRUdCRUNBQWtGQWtZeG5nOENHd3dBQ2drUUEvYU12ZDZJaEtEVnRRQ2VLZFVHUVMwbEQwbkFKc0dpU2JLZworZ0x3RU0wc0FuMGRVSUlzYnhFMGZUSFFWSVFLNGJJSTgyVWhaCis9andOZgorLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvTElDRU5TRSBiL3RydW5rL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmNmZmOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL0xJQ0VOU0UKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworICoKKyAqICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisgKgorICogICAxLiBEZWZpbml0aW9ucy4KKyAqCisgKiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgKiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorICoKKyAqICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorICoKKyAqICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgKiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgKiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAqICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKyAqCisgKiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAqICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKyAqCisgKiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgKiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgKgorICogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgKiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAqICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorICoKKyAqICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAqICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAqICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKyAqCisgKiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAqICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgKiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgKiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgKiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisgKgorICogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgKiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgKiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAqICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAqICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAqICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisgKgorICogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAqICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisgKgorICogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAqICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgKiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisgKgorICogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAqICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgKiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgKiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgKiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAqICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAqICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAqICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAqICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAqICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKyAqCisgKiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAqICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorICoKKyAqICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgKiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgKiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorICoKKyAqICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgKiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgKiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAqICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgKiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgKiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgKiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAqICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAqICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgKiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgKiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAqICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKyAqCisgKiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAqICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgKiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorICoKKyAqICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAqICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgKiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAqICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAqICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorICoKKyAqICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgKiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKyAqCisgKiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgKiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAqICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAqICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgKiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKyAqCisgKiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAqICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAqICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAqICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAqICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgKiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgKiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAqICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgKiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgKiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorICoKKyAqICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisgKgorICogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisgKgorICogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgKiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgKiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgKiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisgKgorICogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitXM0OuIFNPRlRXQVJFIE5PVElDRSBBTkQgTElDRU5TRQoraHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMQorCitUaGlzIHdvcmsgKGFuZCBpbmNsdWRlZCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiBzdWNoIGFzIFJFQURNRXMsIG9yIG90aGVyCityZWxhdGVkIGl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIGZvbGxvd2luZworbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssIHlvdSAodGhlIGxpY2Vuc2VlKSBhZ3JlZQordGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZAorY29uZGl0aW9ucy4KKworUGVybWlzc2lvbiB0byBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uLAord2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzCitoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMgb2YgdGhlCitzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uczoKKworICAxLiBUaGUgZnVsbCB0ZXh0IG9mIHRoaXMgTk9USUNFIGluIGEgbG9jYXRpb24gdmlld2FibGUgdG8gdXNlcnMgb2YgdGhlCisgICAgIHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSB3b3JrLiAKKyAgMi4gQW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zCisgICAgIGFuZCBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCB0aGUgVzNDIFNvZnR3YXJlIFNob3J0IE5vdGljZSBzaG91bGQgYmUKKyAgICAgaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSB3aXRoaW4gdGhlIGJvZHkKKyAgICAgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlLgorICAzLiBOb3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZQorICAgICBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tCisgICAgIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKQorICAgICAKK1RISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTIE1BS0UKK05PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQKK1RIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZCitQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy4KKworQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04uCisKK1RoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KK1RpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYXQKK2FsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgaG9sZGVycy4KKworX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK1RoaXMgZm9ybXVsYXRpb24gb2YgVzNDJ3Mgbm90aWNlIGFuZCBsaWNlbnNlIGJlY2FtZSBhY3RpdmUgb24gRGVjZW1iZXIgMzEgMjAwMi4KK1RoaXMgdmVyc2lvbiByZW1vdmVzIHRoZSBjb3B5cmlnaHQgb3duZXJzaGlwIG5vdGljZSBzdWNoIHRoYXQgdGhpcyBsaWNlbnNlIGNhbgorYmUgdXNlZCB3aXRoIG1hdGVyaWFscyBvdGhlciB0aGFuIHRob3NlIG93bmVkIGJ5IHRoZSBXM0MsIHJlZmxlY3RzIHRoYXQgRVJDSU0KK2lzIG5vdyBhIGhvc3Qgb2YgdGhlIFczQywgaW5jbHVkZXMgcmVmZXJlbmNlcyB0byB0aGlzIHNwZWNpZmljIGRhdGVkIHZlcnNpb24gb2YKK3RoZSBsaWNlbnNlLCBhbmQgcmVtb3ZlcyB0aGUgYW1iaWd1b3VzIGdyYW50IG9mICJ1c2UiLiBPdGhlcndpc2UsIHRoaXMgdmVyc2lvbgoraXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24gYW5kIGlzIHdyaXR0ZW4gc28gYXMgdG8gcHJlc2VydmUgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24ncyBhc3Nlc3NtZW50IG9mIEdQTCBjb21wYXRpYmlsaXR5IGFuZCBPU0kncyBjZXJ0aWZpY2F0aW9uCit1bmRlciB0aGUgT3BlbiBTb3VyY2UgRGVmaW5pdGlvbi4gUGxlYXNlIHNlZSBvdXIgQ29weXJpZ2h0IEZBUSBmb3IgY29tbW9uCitxdWVzdGlvbnMgYWJvdXQgdXNpbmcgbWF0ZXJpYWxzIGZyb20gb3VyIHNpdGUsIGluY2x1ZGluZyBzcGVjaWZpYyB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gT3RoZXIgcXVlc3Rpb25zIGFib3V0Cit0aGlzIG5vdGljZSBjYW4gYmUgZGlyZWN0ZWQgdG8gc2l0ZS1wb2xpY3lAdzMub3JnLgorIAorSm9zZXBoIFJlYWdsZSA8c2l0ZS1wb2xpY3lAdzMub3JnPiAKKworVGhpcyBsaWNlbnNlIGNhbWUgZnJvbTogaHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC9jb3B5aW5nLmh0bWwKKyAgSG93ZXZlciBwbGVhc2Ugbm90ZSBmdXR1cmUgdmVyc2lvbnMgb2YgU0FYIG1heSBiZSBjb3ZlcmVkIAorICB1bmRlciBodHRwOi8vc2F4cHJvamVjdC5vcmcvP3NlbGVjdGVkPXBkCisKK1NBWDIgaXMgRnJlZSEKKworSSBoZXJlYnkgYWJhbmRvbiBhbnkgcHJvcGVydHkgcmlnaHRzIHRvIFNBWCAyLjAgKHRoZSBTaW1wbGUgQVBJIGZvcgorWE1MKSwgYW5kIHJlbGVhc2UgYWxsIG9mIHRoZSBTQVggMi4wIHNvdXJjZSBjb2RlLCBjb21waWxlZCBjb2RlLCBhbmQKK2RvY3VtZW50YXRpb24gY29udGFpbmVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGludG8gdGhlIFB1YmxpYyBEb21haW4uCitTQVggY29tZXMgd2l0aCBOTyBXQVJSQU5UWSBvciBndWFyYW50ZWUgb2YgZml0bmVzcyBmb3IgYW55CitwdXJwb3NlLgorCitEYXZpZCBNZWdnaW5zb24sIGRhdmlkQG1lZ2dpbnNvbi5jb20KKzIwMDAtMDUtMDUKZGlmZiAtLWdpdCBhL3RydW5rL05PVElDRSBiL3RydW5rL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzg4Y2M2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvTk9USUNFCkBAIC0wLDAgKzEsMjYgQEAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgID09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgQW50IGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgQXBhY2hlIEFudAorICAgQ29weXJpZ2h0IDE5OTktMjAwOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQorICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KKworICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGFsc28gc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IDoKKyAgICAgLSB0aGUgVzNDIGNvbnNvcnRpdW0gKGh0dHA6Ly93d3cudzNjLm9yZykgLAorICAgICAtIHRoZSBTQVggcHJvamVjdCAoaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZykKKworICAgVGhlIDxzeW5jPiB0YXNrIGlzIGJhc2VkIG9uIGNvZGUgQ29weXJpZ2h0IChjKSAyMDAyLCBMYW5kbWFyaworICAgR3JhcGhpY3MgQ29ycCB0aGF0IGhhcyBiZWVuIGtpbmRseSBkb25hdGVkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24uCisKKyAgIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6CisgICAgIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBJQk0gQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmlibS5jb20uCisgICAgIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBTdW4gTWljcm9zeXN0ZW1zLiwgaHR0cDovL3d3dy5zdW4uY29tLgorICAgICAtIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgUGF1bCBFbmcgb24gYmVoYWxmIG9mIHRoZSAKKyAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB0aGF0IHdlcmUgb3JpZ2luYWxseSBkZXZlbG9wZWQgYXQgaUNsaWNrLCBJbmMuLAorICAgICAgIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OS4KZGlmZiAtLWdpdCBhL3RydW5rL1JFQURNRSBiL3RydW5rL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTEwOTQxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvUkVBRE1FCkBAIC0wLDAgKzEsOTcgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSAgICAgTiAgICAgVAorIAorCisgIFdoYXQgaXMgaXQ/IAorICAtLS0tLS0tLS0tLQorICAKKyAgQW50IGlzIGEgSmF2YSBiYXNlZCBidWlsZCB0b29sLiBJbiB0aGVvcnkgaXQgaXMga2luZCBvZiBsaWtlICJtYWtlIiAKKyAgd2l0aG91dCBtYWtlcyB3cmlua2xlcyBhbmQgd2l0aCB0aGUgZnVsbCBwb3J0YWJpbGl0eSBvZiBwdXJlIGphdmEgY29kZS4KKworICAKKyAgV2h5PworICAtLS0tCisgIAorICBXaHkgYW5vdGhlciBidWlsZCB0b29sIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBtYWtlLCBnbnVtYWtlLCBubWFrZSwgamFtLCAKKyAgYW5kIG90aGVycz8gQmVjYXVzZSBhbGwgb2YgdGhvc2UgdG9vbHMgaGF2ZSBsaW1pdGF0aW9ucyB0aGF0IGl0cyBvcmlnaW5hbCAKKyAgYXV0aG9yIGNvdWxkbid0IGxpdmUgd2l0aCB3aGVuIGRldmVsb3Bpbmcgc29mdHdhcmUgYWNyb3NzIG11bHRpcGxlIHBsYXRmb3Jtcy4gCisgIAorICBNYWtlLWxpa2UgdG9vbHMgYXJlIGluaGVyZW50bHkgc2hlbGwgYmFzZWQuIFRoZXkgZXZhbHVhdGUgYSBzZXQgb2YgCisgIGRlcGVuZGVuY2llcyBhbmQgdGhlbiBleGVjdXRlIGNvbW1hbmRzIG5vdCB1bmxpa2Ugd2hhdCB5b3Ugd291bGQgaXNzdWUgb24gYSAKKyAgc2hlbGwuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGVhc2lseSBleHRlbmQgdGhlc2UgdG9vbHMgYnkgdXNpbmcgb3Igd3JpdGluZyAKKyAgYW55IHByb2dyYW0gZm9yIHRoZSBPUyB0aGF0IHlvdSBhcmUgd29ya2luZyBvbi4gSG93ZXZlciwgdGhpcyBhbHNvIG1lYW5zIHRoYXQgCisgIHlvdSBsaW1pdCB5b3Vyc2VsZiB0byB0aGUgT1MsIG9yIGF0IGxlYXN0IHRoZSBPUyB0eXBlIHN1Y2ggYXMgVW5peCwgdGhhdCB5b3UgCisgIGFyZSB3b3JraW5nIG9uLgorICAKKyAgTWFrZWZpbGVzIGFyZSBpbmhlcmVudGx5IGV2aWwgYXMgd2VsbC4gQW55Ym9keSB3aG8gaGFzIHdvcmtlZCBvbiB0aGVtIGZvciBhbnkgCisgIHRpbWUgaGFzIHJ1biBpbnRvIHRoZSBkcmVhZGVkIHRhYiBwcm9ibGVtLiAiSXMgbXkgY29tbWFuZCBub3QgZXhlY3V0aW5nIAorICBiZWNhdXNlIEkgaGF2ZSBhIHNwYWNlIGluIGZyb250IG9mIG15IHRhYiEhISIgc2FpZCB0aGUgb3JpZ2luYWwgYXV0aG9yIG9mIEFudCAKKyAgd2F5IHRvbyBtYW55IHRpbWVzLiBUb29scyBsaWtlIEphbSB0b29rIGNhcmUgb2YgdGhpcyB0byBhIGdyZWF0IGRlZ3JlZSwgYnV0IAorICBzdGlsbCB1c2UgeWV0IGFub3RoZXIgZm9ybWF0IHRvIHVzZSBhbmQgcmVtZW1iZXIuCisgIAorICBBbnQgaXMgZGlmZmVyZW50LiBJbnN0ZWFkIGEgbW9kZWwgd2hlcmUgaXQgaXMgZXh0ZW5kZWQgd2l0aCBzaGVsbCBiYXNlZCAKKyAgY29tbWFuZHMsIGl0IGlzIGV4dGVuZGVkIHVzaW5nIEphdmEgY2xhc3Nlcy4gSW5zdGVhZCBvZiB3cml0aW5nIHNoZWxsIAorICBjb21tYW5kcywgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIFhNTCBiYXNlZCBjYWxsaW5nIG91dCBhIHRhcmdldCB0cmVlIAorICB3aGVyZSB2YXJpb3VzIHRhc2tzIGdldCBleGVjdXRlZC4gRWFjaCB0YXNrIGlzIHJ1biBieSBhbiBvYmplY3Qgd2hpY2ggCisgIGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIFRhc2sgaW50ZXJmYWNlLgorICAKKyAgR3JhbnRlZCwgdGhpcyByZW1vdmVzIHNvbWUgb2YgdGhlIGV4cHJlc3NpdmUgcG93ZXIgdGhhdCBpcyBpbmhlcmVudCBieSBiZWluZyAKKyAgYWJsZSB0byBjb25zdHJ1Y3QgYSBzaGVsbCBjb21tYW5kIHN1Y2ggYXMgYGZpbmQgLiAtbmFtZSBmb28gLWV4ZWMgcm0ge31gIGJ1dCAKKyAgaXQgZ2l2ZXMgeW91IHRoZSBhYmlsaXR5IHRvIGJlIGNyb3NzIHBsYXRmb3JtLiBUbyB3b3JrIGFueXdoZXJlIGFuZCAKKyAgZXZlcnl3aGVyZS4gQW5kIGhleSwgaWYgeW91IHJlYWxseSBuZWVkIHRvIGV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kLCBBbnQgaGFzIAorICBhbiBleGVjIHJ1bGUgdGhhdCBhbGxvd3MgZGlmZmVyZW50IGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIGJhc2VkIG9uIHRoZSBPUyAKKyAgdGhhdCBpdCBpcyBleGVjdXRpbmcgb24uCisKKyAgVGhlIExhdGVzdCBWZXJzaW9uCisgIC0tLS0tLS0tLS0tLS0tLS0tLQorCisgIERldGFpbHMgb2YgdGhlIGxhdGVzdCB2ZXJzaW9uIGNhbiBiZSBmb3VuZCBvbiB0aGUgQXBhY2hlIEFudAorICBQcm9qZWN0IHdlYiBzaXRlIDxodHRwOi8vYW50LmFwYWNoZS5vcmcvPi4KKworCisgIERvY3VtZW50YXRpb24KKyAgLS0tLS0tLS0tLS0tLQorCisgIERvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIEhUTUwgZm9ybWF0LCBpbiB0aGUgZG9jcy8gZGlyZWN0b3J5LgorICBGb3IgaW5mb3JtYXRpb24gYWJvdXQgYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgQW50LCBzZWUKKyAgZG9jcy9tYW51YWwvaW5kZXguaHRtbAorCisKKyAgTGljZW5zaW5nCisgIC0tLS0tLS0tLQorCisgIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIHlvdSBtYXkgZmluZCBpbiB0aGUgZmlsZSAKKyAgbmFtZWQgIkxJQ0VOU0UiIGluIHRoaXMgZGlyZWN0b3J5LgorICAKKyAgVGhpcyBkaXN0cmlidXRpb24gaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZS4gIFRoZSBjb3VudHJ5IGluIAorICB3aGljaCB5b3UgY3VycmVudGx5IHJlc2lkZSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgCisgIHBvc3Nlc3Npb24sIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIAorICBlbmNyeXB0aW9uIHNvZnR3YXJlLiAgQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgCisgIGNoZWNrIHlvdXIgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZQorICBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byAKKyAgc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLiAgU2VlIDxodHRwOi8vd3d3Lndhc3NlbmFhci5vcmcvPiBmb3IgbW9yZQorICBpbmZvcm1hdGlvbi4KKworICBUaGUgVS5TLiBHb3Zlcm5tZW50IERlcGFydG1lbnQgb2YgQ29tbWVyY2UsIEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQKKyAgU2VjdXJpdHkgKEJJUyksIGhhcyBjbGFzc2lmaWVkIHRoaXMgc29mdHdhcmUgYXMgRXhwb3J0IENvbW1vZGl0eSAKKyAgQ29udHJvbCBOdW1iZXIgKEVDQ04pIDVEMDAyLkMuMSwgd2hpY2ggaW5jbHVkZXMgaW5mb3JtYXRpb24gc2VjdXJpdHkKKyAgc29mdHdhcmUgdXNpbmcgb3IgcGVyZm9ybWluZyBjcnlwdG9ncmFwaGljIGZ1bmN0aW9ucyB3aXRoIGFzeW1tZXRyaWMKKyAgYWxnb3JpdGhtcy4gIFRoZSBmb3JtIGFuZCBtYW5uZXIgb2YgdGhpcyBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICBkaXN0cmlidXRpb24gbWFrZXMgaXQgZWxpZ2libGUgZm9yIGV4cG9ydCB1bmRlciB0aGUgTGljZW5zZSBFeGNlcHRpb24KKyAgRU5DIFRlY2hub2xvZ3kgU29mdHdhcmUgVW5yZXN0cmljdGVkIChUU1UpIGV4Y2VwdGlvbiAoc2VlIHRoZSBCSVMgCisgIEV4cG9ydCBBZG1pbmlzdHJhdGlvbiBSZWd1bGF0aW9ucywgU2VjdGlvbiA3NDAuMTMpIGZvciBib3RoIG9iamVjdCAKKyAgY29kZSBhbmQgc291cmNlIGNvZGUuCisKKyAgVGhlIGZvbGxvd2luZyBwcm92aWRlcyBtb3JlIGRldGFpbHMgb24gdGhlIGluY2x1ZGVkIGNyeXB0b2dyYXBoaWMKKyAgc29mdHdhcmU6CisKKyAgRm9yIHRoZSBTU0ggZmFtaWx5IG9mIHRhc2tzICg8c3NoZXhlYz4gYW5kIDxzY3A+KSBBbnQgcmVxdWlyZXMgdGhlCisgIEpTY2ggPGh0dHA6Ly93d3cuamNyYWZ0LmNvbS9qc2NoL2luZGV4Lmh0bWw+IGxpYnJhcnkgYXMgd2VsbCBhcyB0aGUKKyAgSmF2YSBDcnlwdG9ncmFwaHkgZXh0ZW5zaW9ucworICA8aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvdGVjaG5vbG9naWVzL3NlY3VyaXR5Lz4uICBBbnQgZG9lcyBub3QKKyAgaW5jbHVkZSB0aGVzZSBsaWJyYXJpZXMgaXRzZWxmLCBidXQgaXMgZGVzaWduZWQgdG8gdXNlIHRoZW0uCisKKyAgVGhhbmtzIGZvciB1c2luZyBBbnQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBBcGFjaGUgQW50IFByb2plY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8+CmRpZmYgLS1naXQgYS90cnVuay9SZWxlYXNlSW5zdHJ1Y3Rpb25zIGIvdHJ1bmsvUmVsZWFzZUluc3RydWN0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQyNzcwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvUmVsZWFzZUluc3RydWN0aW9ucwpAQCAtMCwwICsxLDI2NSBAQAorSW5zdHJ1Y3Rpb25zIGZvciBtYWtpbmcgYSBSZWxlYXNlOgorCitBdXRob3JzOiBDb25vciBNYWNOZWlsbAorICAgICAgICAgU3RlZmFuIEJvZGV3aWcKKyAgICAgICAgIE1hZ2VzaCBVbWFzYW5rYXIKKyAgICAgICAgIEFudG9pbmUgTGV2eS1MYW1iZXJ0CisKK05vdGU6IFRoaXMgZG9jdW1lbnQgd2FzIHVwZGF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgcmVsZWFzaW5nIEFudCAxLjcuCisgICAgICBQbGVhc2UgaW50ZXJwcmV0IHRoZSBicmFuY2ggbmFtZXMsIHRhZ3MsIGV0Yy4gYWNjb3JkaW5nIHRvCisgICAgICB5b3VyIGNvbnRleHQuCisKKzEuICBQcm9wb3NlIGEgcmVsZWFzZSBwbGFuIGZvciB2b3RlLiAgVGhpcyBzaG91bGQgc2V0IG91dCB0aGUgdGltZXRhYmxlIGZvcgorICAgIHRoZSByZWxlYXNlIHVuZGVyIGlkZWFsIGNpcmN1bXN0YW5jZXMuICAKKworICAgIFRoZSBpc3N1ZSBvZiB3aGV0aGVyIHRvIGNyZWF0ZSBhIGJyYW5jaCBmb3IgdGhlIHJlbGVhc2Ugc2hvdWxkIGJlIGRpc2N1c3NlZAorICAgIGluIHRoZSByZWxlYXNlIHZvdGUuCisKKyAgICBUaGUgbGV2ZWwgb2YgYnVncyByZXBvcnRlZCAgY2FuIGRlbGF5IHRoaW5ncy4gR2VuZXJhbGx5LCBnaXZlIGEgZmV3IHdlZWtzIHRvIAorICAgICJjbG9zZSIgdGhlIHNvdXJjZSB0cmVlIHRvIGZ1cnRoZXIgY2hhbmdlcyBzbyBwZW9wbGUgY2FuIGZpbmFsaXNlIAorICAgIGNvbnRyaWJ1dGlvbnMsIGV0Yy4gQXQgdGhpcyB0aW1lLCB0aGUgZmlyc3QgYmV0YSB3aWxsIGJlIGN1dCBhbmQgdGhlcmUgd2lsbCBiZSAKKyAgICB0aGVuIGEgcGVyaW9kIG9mIGJldGEgdGVzdGluZywgdXN1YWxseSAxIG1vbnRoIGJ1dCB0aGlzIHNob3VsZCBiZSBmbGV4aWJsZS4KKworMi4gIE5vdGUgdGhhdCBhbnkgbWVudGlvbiBvZiBhIGRlYWRsaW5lIGNhdXNlcyBhIGZsb29kIG9mIGJ1ZyBmaXhlcywgbmV3IHRhc2tzLAorICAgIGV0Yy4gIFRoaXMgbmVlZHMgdG8gYmUgbWFuYWdlZCBhcyBiZXN0IGl0IGNhbi4gU29tZSBmaXhlcyB3aWxsIGJlIGFwcGxpZWQsCisgICAgb3RoZXJzIGhlbGQgb3Zlci4gTWFrZSB0aGlzIGNsZWFyIGluIHRoZSByZWxlYXNlIHBsYW4uIFRoZSBjb21taXR0ZXJzIGFuZAorICAgIHBhcnRpY3VsYXJseSB0aGUgcmVsZWFzZSBtYW5hZ2VyIHdpbGwgbmVlZCB0byBtYWtlIGp1ZGdlbWVudCBjYWxscyBoZXJlLgorICAgIEFueXRoaW5nIHRvbyAiYmlnIiBpcyBsaWtlbHkgdG8gYmUgaGVsZCBvdmVyLgorCiszLiAgT25jZSB0aGUgZnJlZXplIGRhdGUgYXJyaXZlcywgY3JlYXRlIGEgYnJhbmNoIGZvciB0aGUgcmVsZWFzZSBidWlsZHMsCisgICAgaWYgdGhpcyB3YXMgZGVjaWRlZCBpbiB0aGUgcmVsZWFzZSB2b3RlLiBUaGlzIHdhcyBkb25lIGZvciBBbnQgMS42LCAKKyAgICBidXQgbm90IGZvciBBbnQgMS43LiAKKworICAgIFlvdSB3aWxsIG5lZWQgdG8gYmUgY29tZm9ydGFibGUgaW4gaGFuZGxpbmcgU1ZOIGJyYW5jaGVzIHdpdGggbXVsdGlwbGUKKyAgICBtZXJnZS1iYWNrcyB0byB0aGUgbWFpbiBicmFuY2ggYW5kIGV2ZW4gc2VsZWN0ZWQgbWVyZ2VzIGZyb20gdGhlIHRoZSBtYWluCisgICAgYnJhbmNoIHRvIHRoZSByZWxlYXNlIGJyYW5jaC4KKworICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBlcmZvcm1pbmcgYnJhbmNoaW5nIGFuZCBtZXJnaW5nLCBwbGVhc2UgdmlzaXQKKyAgICBodHRwOi8vc3ZuYm9vay5yZWQtYmVhbi5jb20vbmlnaHRseS9lbi9zdm4tYm9vay5odG1sCisKKyAgICBMYWJlbCBzdWNoIGJyYW5jaGVzIEFOVF8xNl9CUkFOQ0guCisKKzQuICBPbmNlIHRoZSBicmFuY2ggaXMgc2V0dXAsIHRoZSB2ZXJzaW9uIG51bWJlcnMgaW4gU1ZOIGFyZSBjaGFuZ2VkLiBPbiB0aGUKKyAgICBicmFuY2gsIHRoZSBwcm9qZWN0LnZlcnNpb24gcHJvcGVydHkgaW4gYnVpbGQueG1sIGJlY29tZXMgMS43QmV0YS4KKworICAgIElmIHRoZXJlIHdlcmUgYSBtYWluIGJyYW5jaCwgaXRzIGJ1aWxkLnhtbCB3b3VsZCBoYXZlIDEuOGFscGhhLgorCisgICAgW1sgVE9ETzogQ2hlY2sgaWYgdGhlIGRvY3VtZW50YXRpb24gZmlsZXMgYWxzbyBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gcG9pbnQKKyAgICB0byB0aGUgcmlnaHQgYXJlYXMgb2YgQW50J3Mgd2Vic2l0ZS4gXV0KKworNS4gIEJlZm9yZSBhIGJ1aWxkIDoKKworICAgIHRoZSBmaXJzdCBiZXRhIG9uIHRoZSAxLjcgYnJhbmNoIGhhcyBiZWVuIGNhbGxlZCAxLjcuMEJldGExLCAuLi4KKworICAgIHRoZSBwcm9qZWN0LnZlcnNpb24gcHJvcGVydHkgaW4gYnVpbGQueG1sIGdvdmVybnMgdGhlIG91dHB1dCBvZiBhbnQgLXZlcnNpb24gYW5kCisgICAgdGhlIG5hbWluZyBvZiB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzLgorCisgICAgVXBkYXRlIHRoZSBmb2xsb3dpbmcgZmlsZXMgZm9yIHZlcnNpb24gbnVtYmVyOgorCisgICAgICAgIE9uIHRoZSBicmFuY2ggb25seSA6CisKKyAgICAgICAgICAgICogZG9jcy9tYW51YWwvY292ZXIuaHRtbAorICAgICAgICAgICAgKiBkb2NzL21hbnVhbC9jcmVkaXRzLmh0bWwKKyAgICAgICAgICAgICogYnVpbGQueG1sICh2ZXJzaW9uIHByb3BlcnR5ICYgbWFuaWZlc3QtdmVyc2lvbiBwcm9wZXJ0eSkKKworICAgICAgICBDb21taXQgeW91ciBjaGFuZ2VzLgorCisgICAgICAgIE9uIHRoZSBicmFuY2ggYW5kIG9uIHRoZSBtYWluIHRydW5rICgqKToKKworICAgICAgICAgICAgKiBXSEFUU05FVworICAgICAgICAgICAgKiB4ZG9jcy9hbnRuZXdzLnhtbCAoQW5ub3VuY2VtZW50KQorICAgICAgICAgICAgKiB4ZG9jcy9mYXEueG1sIChBbnQncyBoaXN0b3J5IGRldGFpbHMgLSBub3QgZm9yIGJldGFzKQorICAgICAgICAgICAgKiB4ZG9jcy9pbmRleC54bWwgKEFubm91bmNlbWVudCwgbGF0ZXN0IHJlbGVhc2UgZGV0YWlscywgbGluayB0bworICAgICAgICAgICAgbWFudWFsIHVuZGVyICJEb2N1bWVudGF0aW9uIikKKyAgICAgICAgICAgICogeGRvY3Mvc3JjZG93bmxvYWQueG1sCisgICAgICAgICAgICAqIHhkb2NzL2JpbmRvd25sb2FkLnhtbAorCisgICAgICAgIEdlbmVyYXRlIHRoZSBodG1sIGZpbGVzIGJ5IGludm9raW5nIGFudCBvbiBkb2NzLnhtbAorICAgICAgICAodXNlIC1wcm9qZWN0aGVscCBmb3IgaW5zdHJ1Y3Rpb25zKS4KKyAgICAgICAgQ29tbWl0IHRoZSBtb2RpZmllZC9nZW5lcmF0ZWQgZmlsZXMKKworNi4gIEVuc3VyZSB5b3UgaGF2ZSBhbGwgdGhlIGV4dGVybmFsIGxpYnJhcmllcyB0aGF0IEFudCB1c2VzIGluIHlvdXIKKyAgICBsaWIvb3B0aW9uYWwgZGlyZWN0b3J5LiAgVG8gZmluZCBvdXQgd2hhdCBsaWJyYXJpZXMgeW91IG5lZWQsIGV4ZWN1dGUKKyAgICB0aGUgYnVpbGQgd2l0aCAtdmVyYm9zZSBvcHRpb24gYW5kIHNjYW4gZm9yIGxpbmVzIGJlZ2lubmluZyB3aXRoCisgICAgIlVuYWJsZSB0byBsb2FkLi4uIi4KKworNy4gIE1ha2Ugc3VyZSB0aGF0IHlvdXIgZGlyZWN0b3J5IHRyZWUgaXMgY2xlYW4gYnkgcnVubmluZyBzdm4gc3RhdHVzLgorICAgIFNvbWUgdGVzdHMgbGVhdmUgYmVoaW5kIGxlZnRvdmVycyB3aGljaCBlbmQgdXAgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb3RoZXJ3aXNlLgorCis4LiAgIE5leHQgYm9vdHN0cmFwLCBidWlsZCBhbmQgcnVuIHRoZSB0ZXN0cy4gIFRoZW4gYnVpbGQgdGhlIGRpc3RyaWJ1dGlvbgorICAgIG9uIHRoZSBicmFuY2guIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgYmUgYSBjbGVhbiBidWlsZC4gTGFiZWwgdGhpcyB3aXRoCisgICAgYSB0YWcgQU5UXzE3MF9CMS4KKworICAgIEM6XGRldlxhc2ZcYW50LWNvcmU+CisgICAgc3ZuIGNvcHkgaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2NvcmUvdHJ1bmsgXAorICAgIGh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9jb3JlL3RhZ3MvQU5UXzE3MF9CMSBcCisgICAgLW0gIlRhZ2dpbmcgdmVyc2lvbiAxLjcuMEJldGExIG9mIEFudCIKKworICAgIFJldmlzaW9uIDQzNzUwOSA/XDE5NT9cMTg4YmVydHJhZ2VuLgorCis5LiAgU2lnbiB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzIHVzaW5nIHRoZSBmb2xsb3dpbmcgc2ltcGxlIHNjcmlwdAorICAgICMhL2Jpbi9zaAorICAgIGZvciBpIGluIGAvdXNyL2Jpbi9maW5kIGRpc3RyaWJ1dGlvbiBcKCAtbmFtZSAiKi5iejIiIC1vIC1uYW1lICAiKi56aXAiIC1vIC1uYW1lICIqLmd6IiBcKWAKKyAgICBkbworICAgICAgICAgZWNobyAiU2lnbmluZyAiICRpCisgICAgICAgICBncGcgLWEgLWIgLS1mb3JjZS12My1zaWdzICRpCisgICAgZG9uZQorCisgICAgVGhlIC0tZm9yY2UtdjMtc2lncyB3aWxsIGltcHJvdmUgdGhlIGludGVyb3BlcmFiaWxpdHkgd2l0aCBQR1AgNS54LAorICAgIHNlZSA8aHR0cDovL3d3dy5nbnVwZy5vcmcvKGVuKS9kb2N1bWVudGF0aW9uL2ZhcXMuaHRtbCNxNS41Pi4KKworICAgIEJlZm9yZSB5b3UgZG8gdGhhdCwgZW5zdXJlIHRoYXQgdGhlIGtleSB5b3UgdXNlIGlzIGluc2lkZSB0aGUgS0VZUworICAgIGZpbGUgaW4gQW50J3MgU1ZOIHJlcG9zaXRvcnkgLSBhbmQgdGhhdCB5b3UgcGVyZm9ybSBhIHN2biB1cGRhdGUgb24KKyAgICB0aGUgS0VZUyBmaWxlIGluIC93d3cvd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvCisKKyAgICBBbHNvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBzZW50IHRoZSBrZXkgdGhhdCB5b3UgdXNlIHRvIGEgcHVibGljCisgICAga2V5c2VydmVyLgorCisxMC4gVGhlIGJldGEgZGlzdHJpYnV0aW9uIGlzIG5vdyByZWFkeSB0byBnby4gQnVuZGxlIGl0IHVwIGludG8gYSB0YXIuZ3ogZmlsZQorICAgIGFuZCBzY3AgdG8geW91ciBhcGFjaGUgYWNjb3VudC4KKworMTEuIE1lYW53aGlsZSwgY29udmVydCB0aGUgcGFydCBvZiB0aGUgV0hBVFNORVcgZmlsZSBjb3ZlcmluZyB0aGUgY2hhbmdlcworICAgIHNpbmNlIHRoZSBsYXN0IHJlbGVhc2UgaW50byBIVE1MIGZvciB0aGUgUkVBRE1FIGZpbGUgb24gdGhlCisgICAgd2Vic2l0ZS4gU2VlIHRoZSBwcmV2aW91cyByZWxlYXNlIGRpcmVjdG9yaWVzIGZvciBleGFtcGxlcyBvZiB0aGVzZSBmaWxlcy4KKyAgICBBZGQgaW5zdHJ1Y3Rpb25zIGFuZCB3YXJuaW5ncyAoR05VIHRhciBmb3JtYXQgaXNzdWVzLCBldGMpLgorCisgICAgWW91IG1heSBjaG9vc2UgdG8gdXNlIHRoZSB0ZXh0Mmh0bWwgY29udmVydG9yIHByZXNlbnQgYXQKKyAgICBodHRwOi8vdHh0Mmh0bWwuc291cmNlZm9yZ2UubmV0LyN0ZXN0CisKKyAgICBOYW1lIHRoZSBnZW5lcmF0ZWQgZmlsZSBSRUxFQVNFLU5PVEVTLXgueS56Lmh0bWwuCisKKyAgICBDaGFuZ2UgdGhlIHRpdGxlIHRvIHNvbWV0aGluZyBsaWtlICJSZWxlYXNlIE5vdGVzIG9mIEFwYWNoZSBBbnQgMS43LjBCZXRhMiIgKGZyb20gdGhlIGRlZmF1bHQgdHh0Mmh0bWwpCisKKyAgICBbWyBUT0RPOiBUaGlzIG11c3QgcGVyaGFwcyBiZSBhbiBBbnQgdGFzay4gXV0KKworMTIuIE9uY2UgdGhpcyBpcyB1cGxvYWRlZCwgdW5wYWNrIHRoaW5ncywgY3JlYXRlIHRoZSByZWxlYXNlIGRpcmVjdG9yeSwKKyAgICBzb21ldGhpbmcgbGlrZSB2MS43LjBCZXRhMSwgcHVzaCB0aGUgcmVsZWFzZSBhbmQgUkVMRUFTRS1OT1RFUyBmaWxlcworICAgIGludG8gdGhpcyBkaXJlY3RvcnkuICBDcmVhdGUgYSBzeW1ib2xpYyBsaW5rIG5hbWVkIFJFQURNRS5odG1sCisgICAgdGhhdCBwb2ludHMgdG8gdGhlIFJFTEVBU0UtTk9URVMuCisKKyAgICBUaGUgZmlsZXMgc2hvdWxkIGdvIHRvIC93d3cvcGVvcGxlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIG9uIHBlb3BsZS5hcGFjaGUub3JnLgorCisxMy4gQWRkcmVzcyB0aGUgYXZhaWxhYmxlIHJlbGVhc2UgdGFncyBpbiBCdWdaaWxsYS4gQ3JlYXRlIGEgbmV3IHRhZyAxLjcuMEJldGExLgorICAgIElmIHRoZXJlIGlzIGEgc2VwYXJhdGUgbWFpbiBicmFuY2gsIGNyZWF0ZSBhIDEuOGFscGhhIHRhZy4KKyAgICBBc3NpZ24gYWxsIGV4aXN0aW5nIDEuNyBhbHBoYSBidWdzIHRvIDEuNy4wQmV0YTEuCisgICAgTm90ZSB0aGF0IHN1Y2ggbWFzc2l2ZSBjaGFuZ2VzIGNhbiBiZSBkb25lIGF0IG9uY2UgYnkgY2hvb3NpbmcgdGhlCisgICAgbGluayAiQ2hhbmdlIHNldmVyYWwgYnVncyBhdCBvbmNlIiBhdCB0aGUgYm90dG9tIG9mIHRoZSBidWcgbGlzdAorICAgIGRpc3BsYXlpbmcgdGhlIDEuN2FscGhhIGJ1Z3MuCisKKzE0LiBPbmNlIHRoYXQgaXMgZG9uZSwgZG8gYSB0ZXN0IGRvd25sb2FkIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIE9LLiBBCisgICAgY29tbW9uIHByb2JsZW0gbWF5IGJlOgorICAgICogdGhlIGZpbGUncyBtaW1lIHR5cGUgaXMgbm90IHJlY29nbml6ZWQgYW5kIGlzIGludGVycHJldGVkIGFzCisgICAgICB0ZXh0L3BsYWluLiAgRml4IGl0IGJ5IHVzaW5nIHNvbWUgLmh0YWNjZXNzIG1hZ2ljIChBZGRFbmNvZGluZyBzdHVmZikKKyAgICAqIFlvdXIgZ3ouYXNjIGZpbGVzIGFyZSBub3QgYmVpbmcgZGlzcGxheWVkIHByb3Blcmx5IChSZW1vdmVFbmNvaW5nIHN0dWZmKQorCisgICAgSWYgaXQgbG9va3MgT0ssIGFubm91bmNlIGl0IG9uIGRldkBhbnQgYW5kIHVzZXJAYW50LiBBZnRlciBhIGZldworICAgIGRheXMgcGFzcyBhbmQgdGhlcmUgYXJlIG5vIG1ham9yIHByb2JsZW1zLCBhIHdpZGVyIGFubm91bmNlbWVudCBpcworICAgIG1hZGUgKGFudCB3ZWJzaXRlLCBtYWluIGpha2FydGEgd2Vic2l0ZSwgYW5ub3VuY2VtZW50c0BqYWthcnRhLmFwYWNoZS5vcmcsCisgICAgZXRjKS4KKworICAgIGFuZCBhbHNvIHBlcmZvcm0gYSBzdm4gdXBkYXRlIG9uIGZpbGVzIGluIHBlb3BsZS5hcGFjaGUub3JnJ3MKKyAgICAvd3d3L2FudC5hcGFjaGUub3JnLworCisgICAgeW91IGFsc28gbmVlZCB0byBjaGVja291dCBwYXJhbGxlbCB0byBhbnQtY29yZSBodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2l0ZQorICAgIHRoZW4gZ28gdG8gdGhlIHN1YmRpcmVjdG9yeSBnZW5lcmF0ZWQKKyAgICBzdm4gcHJvcGVkaXQgc3ZuOmV4dGVybmFscyB0byBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBtYW51YWwKKworICAgIEFubm91bmNlIGJldGEgcmVsZWFzZXMgYXQgZnJlc2htZWF0Lm5ldCAoU3RlZmFuIEJvZGV3aWcgaXMgdGhlCisgICAgb3duZXIgb2YgQW50J3MgcHJvamVjdCBlbnRyeSAtIGJ1ZyBoaW0gOy0pLgorCisxNS4gQXMgcHJvYmxlbXMgaW4gdGhlIGJldGEgYXJlIGRpc2NvdmVyZWQsIHRoZXJlIG1heSBiZSBhIG5lZWQgZm9yCisgICAgb25lIG9yIG1vcmUgc3Vic2VxdWVudCBiZXRhcy4gVGhlIHJlbGVhc2UgbWFuYWdlciBtYWtlcyB0aGlzCisgICAgY2FsbC4gRWFjaCB0aW1lLCB0aGUgdmVyc2lvbnMgYXJlIHVwZGF0ZWQgYW5kIHRoZSBhYm92ZSBwcm9jZXNzIGlzCisgICAgcmVwZWF0ZWQuIFRyeSBub3QgdG8gaGF2ZSB0b28gbWFueSBiZXRhcy4KKworMTYuIFRyeSB0byBhZHZlcnRpc2UgdGhlIG5lZWQgZm9yIHRlc3Rpbmcgb2YgdGhlIGJldGFzIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICAgVGhpcyB3b3VsZCBlbGltaW5hdGUgdGhlIG5lZWQgdG8gcmVsZWFzZSBtaW5vciBwYXRjaCB2ZXJzaW9ucyBsaWtlCisgICAgd2UgaGFkIHRvIGRvIHdoZW4gcmVsZWFzaW5nIEFudCAxLjQuCisKKyAgICBUbyBtb25pdG9yIHRoZSBudW1iZXIgb2YgZG93bmxvYWRzLCBsb29rIGF0IHRoZSBhY2Nlc3NfbG9nCisgICAgZmlsZSB1bmRlciAvdXNyL2xvY2FsL2FwYWNoZTIvbG9ncworCisxNy4gV2hlbiB0aGUgZmluYWwgYmV0YSBpcyBjb25zaWRlcmVkIE9LLCBwcm9wb3NlIGEgdm90ZSBvbiBkZXZAYW50IHRvCisgICAgb2ZmaWNpYWxseSBhZG9wdCB0aGUgbGF0ZXN0IGJldGEgYXMgdGhlIEFudCAxLjYgcmVsZWFzZS4gSWYgaXQgaXMgcGFzc2VkLAorICAgIChpdCB1c3VhbGx5IGRvZXMsKSB0aGlzIHdvdWxkIGJlIGxhYmVsbGVkIEFOVF8xNiBhbmQgYnVpbHQgaW4gYSBzaW1pbGFyCisgICAgZmFzaGlvbiB0byB0aGUgYWJvdmUgcHJvY2Vzcy4KKworMTguIEJVVAorCisgICAgVGhpcyB0aW1lIHRoZSBkaXJlY3RvcnkgeW91IHVwbG9hZCB0aGUgZmlsZXMgdG8gaXMgZGlmZmVyZW50IGFuZAorICAgIHlvdSdsbCBoYXZlIHRvIGRvIHNvbWUgaG91c2Uta2VlcGluZyBmb3IgdGhlIG9sZCByZWxlYXNlOgorCisgICAgKiB1cGxvYWQgdGhlIG5ldyByZWxlYXNlIGZpbGVzIHRvCisKKyAgICAgIGZyb20gZGlzdHJpYnV0aW9uCisgICAgICB0byAgIC93d3cvd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvW3NvdXJjZXxiaW5hcmllc10uCisgICAgICAKKyAgICAgIGFuZCAKKworICAgICAgZnJvbSBqYXZhLXJlcG9zaXRvcnkvb3JnLmFwYWNoZS5hbnQKKyAgICAgIHRvICAgL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20xLWliaWJsaW8tcnN5bmMtcmVwb3NpdG9yeS9vcmcuYXBhY2hlLmFudAorCisgICAgICB0aGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSB0YXJnZXQgdXBsb2FkIG9mIHRoZSBidWlsZC54bWwKKworICAgICogcmVtb3ZlIHRoZSBzeW1ib2xpYyBsaW5rcyBmcm9tIC93d3cvd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQuCisKKyAgICAqIENyZWF0ZSBwcm9wZXIgLWN1cnJlbnQgc3ltbGlua3MgaW4gL3d3dy93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC8KKworICAgICogTWFrZSBzdXJlIHRoYXQgdGhlIHN5bWJvbGljIGxpbmsgUkVBRE1FLmh0bWwgcG9pbnRzIHRvIHRoZSBuZXcKKyAgICAgIFJFTEVBU0UtTk9URVMuCisKKyAgICAoKiopCisKKzE5LiBVcGRhdGUgdGhlIGFudC5hcGFjaGUub3JnIHNpdGUgOgorCisgICAgcnVubmluZyBzdm4gdXBkYXRlICouaHRtbCB1bmRlciAvd3d3L2FudC5hcGFjaGUub3JnIHNob3VsZCB1cGRhdGUgdGhlCisgICAgZmlsZXMgcmVnZW5lcmF0ZWQgYW5kIGNvbW1pdHRlZCBpbiBwb2ludCA1IGFib3ZlIChpbmRleC5odG1sLCBmYXEuaHRtbCwKKyAgICBhbnRuZXdzLmh0bWwsIHNyY2Rvd25sb2FkLmh0bWwsIGJpbmRvd25sb2FkLmh0bWwpLgorCisgICAgVXBkYXRlIHRoZSBvbmxpbmUgbWFudWFsIHRvby4KKworMjAuIENsZWFuIHVwLgorCisgICAgKiByZW1vdmUgdGhlIHJlbWFpbmluZyBmaWxlcyBvZiB0aGUgcHJldmlvdXMgcmVsZWFzZSBmcm9tCisgICAgICAvd3d3L3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L1tzb3VyY2V8YmluYXJpZXNdLgorICAgICAgVGhpcyBpbmNsdWRlcyB0aGUgb2xkIHJlbGVhc2Ugbm90ZXMuCisKKzIxLiBOb3cgYW5kIHBlcmhhcHMgZHVyaW5nIHByZXZpb3VzIGJldGFzIGFueSBjaGFuZ2VzIG9uIHRoZSBicmFuY2ggbXVzdAorICAgIGJlIG1lcmdlZCBiYWNrIGludG8gdGhlIHRyZWUuCisKKzIyLiBBdCB0aGlzIHBvaW50IGluIHRpbWUsIHRoZSByZWxlYXNlIGlzIGRvbmUgYW5kIGFubm91bmNlbWVudHMgYXJlIG1hZGUuCisgICAgUEdQLXNpZ24geW91ciBhbm5vdW5jZW1lbnQgcG9zdHMuCisKKyAgICBbW1RPRE86IElkZW50aWZ5IHRoZSBtYWlsaW5nIGxpc3RzIHdoZXJlIGFubm91bmNlbWVudHMgYXJlIHRvIGJlIG1hZGUuCisgICAgICBBbHNvIGlkZW50aWZ5IHRoZSB3ZWJwYWdlcyB0byB3aGljaCB0aGUgYW5ub3VuY2VtZW50cyBtdXN0IGdvLiBdXQorCisgICAgQXBhY2hlIG1haWxpbmcgbGlzdHMgdGhhdCBzaG91bGQgZ2V0IHRoZSBhbm5vdW5jZW1lbnRzOgorICAgIGFubm91bmNlbWVudHNAamFrYXJ0YS5hcGFjaGUub3JnLCBhbm5vdW5jZW1lbnRzQHhtbC5hcGFjaGUub3JnLAorICAgIGFubm91bmNlQGFwYWNoZS5vcmcsIGRldkBhbnQgYW5kIHVzZXJAYW50LgorCisgICAgQW5ub3VuY2UgcmVsZWFzZSBhdCBmcmVzaG1lYXQubmV0CisgICAgKFN0ZWZhbiBCb2Rld2lnIGlzIHRoZSBvd25lciBvZiBBbnQncyBwcm9qZWN0IGVudHJ5IC0gYnVnIGhpbSA7LSkuCisKKyAgICBBbm5vdW5jZSByZWxlYXNlIGluIHRoZSB1c2VuZXQgZ3JvdXBzIGNvbXAubGFuZy5qYXZhLnNvZnR3YXJldG9vbHMKKyAgICBhbmQgY29tcC5sYW5nLmphdmEuYW5ub3VuY2UuCisKKzIzLiBZb3UgY2FuIG5vdyByZWFjcXVhaW50IHlvdXJzZWxmIHdpdGggeW91ciBmYW1pbHkgYW5kIGZyaWVuZHMuCisKKygqKSAgdGhlIHhkb2NzIG5lZWQgdG8gYmUgdXBkYXRlZCBvbiBib3RoIHRoZSBicmFuY2ggYW5kIHRoZSBIRUFEIHJldmlzaW9uCisgICAgIGJlY2F1c2UgdHJhZGl0aW9uYWxseSB0aGUgYW50LmFwYWNoZS5vcmcgd2ViIHNpdGUgcmVmbGVjdHMgdGhlIEhFQUQKKyAgICAgcmV2aXNpb24gb2YgdGhlIHhkb2NzLCBidXQgdGhlIHVzZXJzIGRvd25sb2FkaW5nIGEgZGlzdHJpYnV0aW9uIHdpbGwgZ2V0CisgICAgIHRoZSB4ZG9jcyBhbmQgdGhlIGdlbmVyYXRlZCBodG1sIGZyb20gdGhlIGJyYW5jaCBhbmQgd2lsbCBjb21wbGFpbiBpZiB0aGVyZQorICAgICBhcmUgZGlzY3JlcGFuY2llcyBpbiB2ZXJzaW9uIG51bWJlcnMuCisKKygqKikgTWlycm9ycyA6IHRoZSBzcmNkb3dubG9hZC5odG1sIGFuZCBiaW5kb3dubG9hZC5odG1sIGVhY2ggbGlzdCBhIG51bWJlciBvZgorICAgICBtaXJyb3JzLiBGb3IgYW50IDEuNi4wIHRoZSBtaXJyb3JzIHBpY2tlZCB1cCB0aGUgbmV3IHZlcnNpb24gaW4gOCBob3VycworICAgICBvciBsZXNzLCB0aGUgcmVsZWFzZSBoYXZpbmcgYmVlbiBkb25lIGF0IG1pZG5pZ2h0IG9uIERlYyAxOHRoLCB0aGUKKyAgICAgbWlycm9ycyBoYWQgaXQgb24gRGVjIDE5dGggYXQgOCBhbS4gVGhlIHNyY2Rvd25sb2FkL2JpbmRvd25sb2FkIHBhZ2VzIGJvdGgKKyAgICAgY29udGFpbiBhIG5vdGUgYWR2aXNpbmcgdXNlcnMgdG8gYmUgcGF0aWVudCBpbW1lZGlhdGVseSBhZnRlciB0aGUgcmVsZWFzZS4KKworUmVsYXRlZCBJbmZvcm1hdGlvbgorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2UtcHVibGlzaGluZy5odG1sCitodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvcmVsZWFzZXMvCitodHRwOi8vd2lraS5hcGFjaGUub3JnL2pha2FydGEtY29tbW9ucy9TaWduaW5nUmVsZWFzZXMKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvU1RBVFVTIGIvdHJ1bmsvU1RBVFVTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWVkOTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9TVEFUVVMKQEAgLTAsMCArMSwyNCBAQAorQXBhY2hlIEFudCBTdGF0dXMKK0xhc3QgbW9kaWZpZWQgYXQgMjAwNy0wOC0wMworCitSZWxlYXNlOgorICAgIEN1cnJlbnQ6ICAgICAgICAxLjcuMCAgKGluIFNWTiBBTlRfMTdfQlJBTkNIKQorICAgIE1haW50ZW5hbmNlOiAgICAtCisgICAgRGV2ZWxvcG1lbnQ6ICAgIDEuNy4xICAoaW4gU1ZOIEFOVF8xN19CUkFOQ0gpCisgICAgICAgICAgICAgICAgICAgIDEuOCAgICAoaW4gU1ZOIEhFQUQpCisKK0Fzc2V0czoKKyAgICBETlM6ICAgICAgICAgICAgICAgIGFudC5hcGFjaGUub3JnCisKKyAgICBNYWlsaW5nIGxpc3RzOiAgICAgIGRldkBhbnQuYXBhY2hlLm9yZworICAgICAgICAgICAgICAgICAgICAgICAgdXNlckBhbnQuYXBhY2hlLm9yZworCisgICAgV2ViIHNpdGU6ICAgICAgICAgICBodHRwOi8vYW50LmFwYWNoZS5vcmcvCisKKyAgICBSZXBvc2l0b3JpZXM6ICAgICAgIGFudAorCitQTUMgTWVtYmVycworIHNlZSBodHRwOi8vYW50LmFwYWNoZS5vcmcvY29udHJpYnV0b3JzLmh0bWwKKworQ29tbWl0dGVyczoKKyBzZWUgaHR0cDovL2FudC5hcGFjaGUub3JnL2NvbnRyaWJ1dG9ycy5odG1sCmRpZmYgLS1naXQgYS90cnVuay9XSEFUU05FVyBiL3RydW5rL1dIQVRTTkVXCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzZlODEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9XSEFUU05FVwpAQCAtMCwwICsxLDQwMDQgQEAKK0NoYW5nZXMgZnJvbSBBbnQgMS43LnggVE8gY3VycmVudCBTVk4gdmVyc2lvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogSW1wcm92ZWQgaGFuZGxpbmcgb2YgSW50ZXJydXB0RXhjZXB0aW9uIChsZXRzIHN1cHBvc2Ugc29tZW9uZS90aGluZyBpcworICB0cnlpbmcgdG8ga2lsbCB0aGUgdGhyZWFkIHdoZW4gd2UgcmVjZWl2ZSBhbiBJbnRlcnJ1cHRFeGNlcHRpb24pLAorICB3aGVuIGFuIEludGVycnVwdEV4Y2VwdGlvbiBpcyByZWNlaXZlZCwgd2UgZG8gbm90IHdhaXQgYW55bW9yZSBpbiBhIHdoaWxlCisgIGxvb3AgdGlsbCB0aGUgZW5kIHRpbWUgaGFzIGJlZW4gcmVhY2hlZC4gQnVnemlsbGEgcmVwb3J0IDQyOTI0LgorCisqIFJlZmFjdG9yIFByb3BlcnR5SGVscGVyIGFuZCBpbnRyb3NwZWN0aW9uIEFQSXMgdG8gbWFrZSBleHRlbnNpb24gbW9yZQorICBncmFudWxhciBhbmQgc3VwcG9ydCBzZXR0aW5nIHRhc2svdHlwZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG9iamVjdHMKKyAgZGVjb2RlZCBieSBjdXN0b20gUHJvcGVydHlFdmFsdWF0b3IgZGVsZWdhdGVzLiBBbHNvIGFkZCA8cHJvcGVydHloZWxwZXI+CisgIHRhc2sgZm9yIHJlZ2lzdGVyaW5nIGRlbGVnYXRlcyBhbmQvb3IgcmVwbGFjaW5nIHRoZSByZWdpc3RlcmVkIFByb3BlcnR5SGVscGVyCisgIGluc3RhbmNlLiAgQnVnemlsbGEgcmVwb3J0IDQyNzM2LgorCisqIEFkZGVkIGEgcmVzdHJpY3RlZCBmb3JtIG9mIHR5cGVkZWYgY2FsbGVkIDxjb21wb25lbnRkZWY+LiBUaGlzIGFsbG93cworICBkZWZpbml0aW9uIG9mIGVsZW1lbnRzIHRoYXQgY2FuIG9ubHkgYmUgd2l0aGluIHRhc2tzIG9yIHR5cGVzLiBUaGlzCisgIG1ldGhvZCBpcyBub3cgdXNlZCB0byBkZWZpbmUgY29uZGl0aW9ucywgc2VsZWN0b3JzIGFuZCBzZWxlY3RvcnMuIFRoaXMKKyAgbWVhbnMgdGhhdCB0YXNrcyBtYXkgbm93IGhhdmUgbmVzdGVkIGNvbmRpdGlvbnMganVzdCBieSBpbXBsZW1lbnRpbmcKKyAgdGhlIENvbmRpdGlvbiBpbnRlcmZhY2UsIHJhdGhlciB0aGFuIGV4dGVuZGluZyBDb25kaXRpb25CYXNlLiBJdCBhbHNvCisgIG1lYW5zIHRoYXQgdGhlIHVzZSBvZiBuYW1lc3BhY2VzIGZvciBzb21lIG9mIHRoZSBzZWxlY3RvcnMgaW50cm9kdWNlZAorICBpbiBBbnQgMS43LjAgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KKyAgSW1wbGVtZW50aW5nIHRoaXMgbWVhbnMgdGhhdCB0aGUgRHluYW1pY0VsZW1lbnQgd29yay1hcm91bmQgaW50cm9kdWNlZAorICBpbiBBbnQgMS43LjAgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgQnVnemlsbGEgcmVwb3J0IDQwNTExLgorCisqIEluIHRoZSA8dG91Y2g+IHRhc2sgd2hlbiBhIDxtYXBwZXI+IGlzIHVzZWQsIHRoZSBtaWxsaXMgYW5kIGRhdGV0aW1lCisgIGF0dHJpYnV0ZXMgbm93IG92ZXJyaWRlIHRoZSB0aW1lIG9mIHRoZSBzb3VyY2UgcmVzb3VyY2UgaWYgcHJvdmlzaW9uZWQuIAorICBCdWd6aWxsYSByZXBvcnQgNDMyMzUuCisKKyogUmVtb3ZlIGZhbGwtYmFjayBtZWNoYW5pc20gZm9yIHJlZmVyZW5jZXMgdGhhdCBhcmUgbm90IHJlc29sdmVkCisgIGR1cmluZyBub3JtYWwgcnVudGltZSBleGVjdXRpb24uCisKKyogRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlIG5vdyBhY3R1YWxseSBjcmVhdGVzIHRoZSBmaWxlLgorICBUaGUgVGVtcEZpbGUgdGFzayBzdGlsbCBkb2VzIG5vdCBjcmVhdGUgdGhlIGZpbGUgYnkgZGVmYXVsdCwgY2FuIGJlIGluc3RydWN0ZWQKKyAgdG8gZG8gc28gaG93ZXZlciB1c2luZyBhIG5ldyBwYXJhbWV0ZXIuCisgIEJ1Z3ppbGxhIHJlcG9ydCAzMzk2OS4KKyAgCitGaXhlZCBidWdzOgorLS0tLS0tLS0tLS0KKworICogPHN5bWxpbms+IHRhc2sgY291bGRuJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIHN5bWxpbmtzIHRoYXQgcG9pbnRlZCB0byBub25leGlzdGVudCBmaWxlcworICAgQnVnemlsbGEgcmVwb3J0IDM4MTk5LgorCisgKiA8c3ltbGluaz4gdGFzayBjb3VsZG4ndCBvdmVyd3JpdGUgZmlsZXMgdGhhdCB3ZXJlIGluIHRoZSB3YXkgb2YgdGhlIHN5bWxpbmsuCisgICBCdWd6aWxsYSByZXBvcnQgNDM0MjYuCisgICAKKyAqIDxzeW1saW5rPiB0YXNrIGZhaWxvbmVycm9yPSJmYWxzZSIgZG9lcyBub3Qgc3RvcCBidWlsZCBmcm9tIGZhaWxpbmcgd2hlbiAnbG4nIAorICAgY29tbWFuZCByZXR1cm5zIG5vbi16ZXJvLiBCdWd6aWxsYSByZXBvcnQgNDM2MjQgIAorCisgKiA8dG91Y2g+IHRhc2sgY291bGRuJ3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuICJubyByZXNvdXJjZXMgc3BlY2lmaWVkIiBhbmQgIm5vIHJlc291cmNlcworICAgbWF0Y2hlZC4iICBCdWd6aWxsYSByZXBvcnQgNDM3OTkuCisgICAKK090aGVyIGNoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorCisgKiBUaGVyZSBpcyBub3cgYSBGaWxlUHJvdmlkZXIgaW50ZXJmYWNlIGZvciByZXNvdXJjZXMgdGhhdCBhY3QgYXMgYSBzb3VyY2UKKyAgIG9mIGZpbGVuYW1lcy4gVGhpcyBzaG91bGQgYmUgdXNlZCBieSB0YXNrcyB0aGF0IHJlcXVpcmUgcmVzb3VyY2VzCisgICB0byBwcm92aWRlIGZpbGVuYW1lcywgcmF0aGVyIHRoYW4gcmVxdWlyZSB0aGF0IGFsbCByZXNvdXJjZXMKKyAgIGFyZSBpbnN0YW5jZXMgb3Igc3ViY2xhc3NlcyBvZiBGaWxlUmVzb3VyY2UKKyAgIEJ1Z3ppbGxhIHJlcG9ydCA0MzM0OAorICAgCisgKiBGaXhjcmxmIG5vdyBnaXZlcyBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgb24gYmFkIGRpcmVjdG9yeSBhdHRyaWJ1dGVzLgorICAgQnVnemlsbGEgcmVwb3J0IDQzOTM2CisgICAKKworCitDaGFuZ2VzIGZyb20gQW50IDEuNy4wIFRPIEFudCAxLjcuMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogU3RyaW5nIHJlc291cmNlcyBvbmx5IGhhdmUgcHJvcGVydGllcyBzaW5nbGUgZXhwYW5kZWQuIElmIHlvdSByZWxpZWQgb24KKyAgPHN0cmluZz4gcmVzb3VyY2VzIGJlaW5nIGV4cGFuZGVkIG1vcmUgdGhhbiBvbmNlLCBpdCBubyBsb25nZXIgaGFwcGVucy4KKyAgQnVnemlsbGEgcmVwb3J0IDQyMjc3LgorCisqIEEgU3RyaW5nIHJlc291cmNlJ3MgZW5jb2RpbmcgYXR0cmlidXRlIHdhcyBvbmx5IHRha2VuIGludG8gYWNjb3VudCB3aGVuCisgIHNldCBmcm9tIHRoZSByZXNvdXJjZSdzIE91dHB1dFN0cmVhbTsgdGhlIElucHV0U3RyZWFtIHByb3ZpZGVkIHRoZSBTdHJpbmcncworICBiaW5hcnkgY29udGVudCBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBlbmNvZGluZy4gQmVoYXZpb3IgaGFzCisgIGJlZW4gbW9kaWZpZWQgdG8gZW5jb2RlIG91dGdvaW5nIChJbnB1dFN0cmVhbSkgY29udGVudCBhcyB3ZWxsIGFzIGVuY29kaW5nCisgIGluY29taW5nIChPdXRwdXRTdHJlYW0pIGNvbnRlbnQuCisKKyogPHNjcmlwdGNvbmRpdGlvbj4gbm93IHByZWZlcnMgZXZhbHVhdGlvbiByZXN1bHQvcmV0dXJuIHZhbHVlIG92ZXIgdmFsdWUgcHJvcGVydHkuCisKKyogPGphdmE+IHdpdGggZm9yayBub3cgcmV0dXJucyBnaXZlcyAtMSBpbnN0ZWFkIG9mIDAgYXMgcmVzdWx0IHdoZW4gZmFpbG9uZXJyb3IKKyAgaXMgZmFsc2UgYW5kIHNvbWUgZXhjZXB0aW9uIChpbmNsdWRpbmcgdGltZW91dCkgb2NjdXJzLiBCciA0MjM3Ny4gCisKKyogYW50LXR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIG1hcmtlZCBhcyBkZXByZWNhdGVkIGFuZCBhIHdhcm5pbmcgaGFzIGJlZW4KKyAgaXNzdWVkIGlmIGl0IGlzIGVuY291bnRlcmVkIGluIHRoZSBidWlsZCBmaWxlLgorCitGaXhlZCBidWdzOgorLS0tLS0tLS0tLS0KKworKiBUaGUgZGVmYXVsdCBsb2dnZXIgd2FzIGZhaWxpbmcgdG8gcHJpbnQgY29tcGxldGUgc3RhY2sgdHJhY2VzIGZvciBleGNlcHRpb25zCisgIG90aGVyIHRoYW4gQnVpbGRFeGNlcHRpb24sIHRodXMgb21pdHRpbmcgb2Z0ZW4gaW1wb3J0YW50IGRpYWdub3N0aWMKKyAgaW5mb3JtYXRpb24uIEJ1Z3ppbGxhIDQzMzk4LgorCisqIEVycm9yIGluIEZUUCB0YXNrCisgIEJ1Z3ppbGxhIHJlcG9ydCA0MTcyNAorCisqIFJlZ3Jlc3Npb246IExvY2F0b3IgZmFpbHMgd2l0aCBVUkkgZW5jb2RpbmcgcHJvYmxlbSB3aGVuIHNwYWNlcyBpbiBwYXRoCisgIEJ1Z3ppbGxhIHJlcG9ydCA0MjIyMgorCisqIFJlZ3Jlc3Npb24gaW4gTG9jYXRvcjogcnVubmluZyBBbnQgb2ZmIGEgbmV0d29yayBzaGFyZSBkb2VzIG5vdCB3b3JrOgorICBtZXNzYWdlICJVUkkgaGFzIGF1dGhvcml0eSBjb21wb25lbnQiIGFwcGVhcnMKKyAgQnVnemlsbGEgcmVwb3J0IDQyMjc1CisKKyogSW1wcm92ZW1lbnRzIGluIEFudENsYXNzTG9hZGVyIFNwZWVkLgorICBCdWd6aWxsYSByZXBvcnQgNDIyNTkKKworKiBFcnJvciBpbiBoYW5kbGluZyBvZiBzb21lIHBlcm1pc3Npb25zLCBtb3N0IG5vdGFibHkgdGhlIEFsbFBlcm1pc3Npb24gb24KKyAgamRrIDEuNQorICBCdWd6aWxsYSByZXBvcnQgNDE3NzYKKworKiBSZXBsYWNlIHRhc2sgc3VtbWFyeSBvdXRwdXQgaW5jb3JyZWN0LgorICBCdWd6aWxsYSByZXBvcnQgNDE1NDQKKworKiBEZXBlbmRzZXQgY3Jhc2hlcyBhbnQgd2hlbiB0aW1lc3RhbXAgb24gZmlsZXMgY2hhbmdlIGR1cmluZyBEZXBlbmRzZXQKKyAgZXhlY3V0aW9uLgorICBCdWd6aWxsYSByZXBvcnQgNDEyODQKKworKiBCdWcgaW4gb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzLkRhdGUKKyAgQnVnemlsbGEgcmVwb3J0IDQxNDExCisKKyogPGp1bml0PiBpbiBBbnQgMS43LjAgY291bGQgdGhyb3cgTlBFIGlmIG5vIDxjbGFzc3BhdGg+IHdhcyBkZWZpbmVkLgorICBCdWd6aWxsYSByZXBvcnQgNDE0MjIuCisKKyogSW4gQW50IDEuNy4wLCA8ZmlsZXNldD4gaW4gPGphdmFkb2M+IGRvZXMgbm90IGJ5IGRlZmF1bHQgaW5jbHVkZSBvbmx5CisgICoqLyouamF2YSBhcyB0aGUgZG9jdW1lbnRhdGlvbiBjbGFpbXMgYW5kIGVhcmxpZXIgcmV2aXNpb25zIGRpZC4KKyAgQnVnemlsbGEgcmVwb3J0IDQxMjY0LgorCisqIFNQSSBzdXBwb3J0IGluIGphciB3YXMgYnJva2VuLgorICBCdWd6aWxsYSByZXBvcnQgNDEyMDEuCisgIAorKiBqc2NoLTAuMS4zMCBjYXVzZXMgU0NQIHRhc2sgdG8gaGFuZworICBCdWd6aWxsYSByZXBvcnQgNDEwOTAuCisKKyogVGFyZ2V0IGZyb20gaW1wb3J0ZWQgZmlsZSBsaXN0ZWQgdHdpY2UgaW4gcHJvamVjdGhlbHAuCisgIEJ1Z3ppbGxhIHJlcG9ydCA0MTIyNi4KKworKiA8c3FsPiB0YXNrIGRvdWJsZS1leHBhbmRzIHByb3BlcnRpZXMgaWYgZXhwYW5kcHJvcGVydGllcyBpcyB0cnVlLAorICBhbmQgZXhwYW5kcyBwcm9wZXJ0aWVzIGlmIGV4cGFuZHByb3BlcnRpZXMgaXMgZmFsc2UuCisgIEJ1Z3ppbGxhIHJlcG9ydCA0MTIwNC4KKworKiBSb2xsaW5nIGJhY2sgQnVnemlsbGEgMzI5MjcgKHNldCBhIGRlZmF1bHQgZGVzY3JpcHRpb24gZm9yIGEgamF2YWRvYyB0YWcKKyAgaWYgbm90IHNldCkgYXMgaXQgY2F1c2VkIGEgQkMgcHJvYmxlbS4KKyAgQnVnemlsbGEgcmVwb3J0IDQxMjY4LgorCisqIDxhcHQ+IGZvcmtzIHByb3Blcmx5IGFuZCBzbyBtZW1vcnkgc2V0dGluZ3MgYXJlIHBpY2tlZCB1cC4KKyAgQnVnIHJlcG9ydCA0MTI4MC4KKworKiBSZWdyZXNzaW9uOiBOUEUgd2FzIHRocm93biB3aGVuIHVzaW5nIDxwYXRoY29udmVydD4gYWdhaW5zdCBhCisgICh0aGlyZC1wYXJ0eSBpbnN0YW50aWF0ZWQpIGZpbGVzZXQgd2l0aCBudWxsIFByb2plY3QgcmVmZXJlbmNlLgorCisqIFN0cmlwIG91dCBhbGwgLUogYXJndW1lbnRzIHRvIG5vbiBmb3JraW5nIHJtaWMgYWRhcHRlcnMsIHNwZWNpZmljYWxseQorICB0aGUgU3VuIGFuZCBXZWJsb2dpYyBjb21waWxlcnMuCisgIEJ1ZyByZXBvcnQgNDEzNDkKKworKiBTeW5jaG9uaXphdGlvbiBpc3N1ZXMgaW4gUHJvcGVydHlIZWxwZXIuICBCdWd6aWxsYSA0MTM1My4KKworKiA8Y29uY2F0IGJpbmFyeT0idHJ1ZSIgYXBwZW5kPSJ0cnVlIj4gZGlkIG5vdCBhcHBlbmQuICBCdWd6aWxsYSA0MTM5OS4KKyAKKyogLWF1dG9wcm94eSB0dXJucyBKYXZhMS41KyBhdXRvbWF0aWMgcHJveHkgc3VwcG9ydCBvbi4gQnVnemlsbGEgNDE5MDQKKworKiBIYW5kbGUgbnVsbCByZXN1bHQgb2Ygc3lzdGVtIGdldFByb3BlcnR5KCkuIEJ1Z3ppbGxhIDQyMzM0LgorCisqIFJlZ3Jlc3Npb246IGNvbmNhdCBmaXhsYXN0bGluZT0idHJ1ZSIgc2hvdWxkIG5vdCBoYXZlIGFwcGxpZWQgdG8KKyAgbmVzdGVkIHRleHQsIGJ1dCBkaWQgaW4gQW50IDEuNy4wLiBCdWd6aWxsYSA0MjM2OS4KKworKiBSZWdyZXNzaW9uOiBhbnQudmVyc2lvbiB3YXMgbm90IHBhc3NlZCBkb3duIGluIDxzdWJhbnQ+LgorICBUaGlzIHdvcmtlZCBpbiBBbnQxLjYuNSwgYnV0IG5vdCBpbiAxLjcuMC4gQnVnemlsbGEgYnVnIDQyMjYzCisKKyogUmVncmVzc2lvbjogYnppcDIgdGFzayBjcmVhdGVkIGNvcnJ1cHRlZCBvdXRwdXQgZmlsZXMgZm9yIHNvbWUgaW5wdXRzLgorICBCdWd6aWxsYSBidWcgNDE1OTYuCisKKyogUmVncmVzc2lvbjogPGF2YWlsYWJsZT4gd2l0aCA8ZmlsZXBhdGg+IGRpZCBub3Qgd29yay4KKyAgQnVnemlsbGEgNDI3MzUuCisKKyogYW50IHNjcmlwdCwgY2QgbWF5IG91dHB1dCB0byBzdGRvdXQuCisgIEJ1Z3ppbGxhIDQyNzM5LgorCisqIE1vZGlmaWVkIHNlbGVjdG9yIGRvZXNuJ3QgdXBkYXRlIHRoZSBjYWNoZSBpZiBvbmx5IG9uZSBmaWxlIGhhcyBjaGFuZ2VkLgorICBCdWd6aWxsYSA0MjgwMi4KKworKiBSZWdyZXNzaW9uOiBQYXRoIHN1YmNsYXNzZXMgdGhhdCBvdmVycm9kZSBsaXN0KCkgc3RvcHBlZCB3b3JraW5nIGluCisgIHJlc291cmNlQ29sbGVjdGlvbiBjb250ZXh0cyBpbiBBbnQgMS43LjAuIEJ1Z3ppbGxhIDQyOTY3LgorCisqIDxwcm9wZXJ0eT4gc3VwcG9ydHMgbG9hZGluZyBmcm9tIHhtbCBiYXNlZCBwcm9wZXJ0eSBkZWZpbml0aW9uLgorICBCdWd6aWxsYSA0Mjk0NgorCisqIDxqdW5pdD4gc3VwcG9ydHMgY29sbGVjdGluZyBhbmQgcmVydW5uaW5nIGZhaWxlZCB0ZXN0IGNhc2VzCisgICh0ZXh0WFhYIG1ldGhvZHMpLiBCdWd6aWxsYSA0Mjk4NC4gIAorCisqIFdhciB0YXNrIGZhaWxlZCB3aXRoICJObyBXRUItSU5GL3dlYi54bWwgZmlsZSB3YXMgYWRkZWQiIHdoZW4gY2FsbGVkCisgIGEgc2Vjb25kIHRpbWUuIEJ1Z3ppbGxhIDQzMTIxLgorCisqIEZpbHRlck1hcHBlciBjb3VsZCB0aHJvdyBhbiBOUEUuCisgIEJ1Z3ppbGxhIDQzMjkyLgorCisqIFJlZ2Vzc2lvbiBuZXN0ZWQgbWFjcm9kZWZzIHdpdGggZWxlbWVudHMgY291bGQgY2F1c2UgU3RhY2tPdmVyRmxvdy4KKyAgQnVnemlsbGEgNDMzMjQuCisKKyogU29tZSBjaGFuZ2VzIHRvIDxqdW5pdD4gYnJva2UgdGhpcmQgcGFydHkgdGFza3MgdGhhdCBleHRlbmQgaXQgKGxpa2UKKyAgQXBhY2hlIENhY3R1cycgQW50IHRhc2spLiAgVGhlIGNoYW5nZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHNvIHRoYXQKKyAgc3ViY2xhc2VzIHNob3VsZCBub3cgd29yayBhZ2FpbiAtIHdpdGhvdXQgYW55IGNoYW5nZXMgdG8gdGhlCisgIHN1YmNsYXNzLgorCitPdGhlciBjaGFuZ2VzOgorLS0tLS0tLS0tLS0tLS0KKworKiBWYXJpb3VzIHNtYWxsIG9wdGltaXphdGlvbnMgc3BlZWQgdXAgY29tbW9uIHRhc2tzIHN1Y2ggYXMgPGphdmFjPiBvbiBsYXJnZQorICBmaWxlc2V0cywgcmVkdWNpbmcgYm90aCBJL08gYW5kIENQVSB1c2FnZS4KKworKiBQcm9maWxpbmcgbG9nZ2VyIGhhcyBiZWVuIGFkZGVkIHdpdGggYmFzaWMgcHJvZmlsaW5nIGNhcGFiaWxpdGllcy4KKworKiA8c2NyaXB0PiBub3cgaGFzIGJhc2ljIHN1cHBvcnQgZm9yIEphdmFGWCBzY3JpcHRzCisKKyogU1NIIHRhc2sgY2FuIG5vdyB0YWtlIGEgY29tbWFuZCBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgY29tbWFuZHMgdG8gZXhlY3V0ZS4KKyAgVGhpcyBhbGxvd3MgeW91IHRvIGNvbm5lY3QgdG8gYSBzZXJ2ZXIgYW5kIGV4ZWN1dGUgYSBudW1iZXIgb2YgY29tbWFuZHMKKyAgd2l0aG91dCBjb25zdGFudGx5IHJlY29ubmVjdGluZyBmb3IgZWFjaCBjb21tYW5kLgorCisqIFVwZ3JhZGVkIFhNTCBBUEkgdG8gWE1MIGNvbW1vbnMgdmVyc2lvbiAxLjMuMDQuCisKKyogVXBncmFkZWQgdG8gWGVyY2VzIDIuOS4wCisKKyogPHNjcmlwdD4gY2FuIG5vdyB3b3JrIHdpdGggYnNmLmphciBhbmQganMuamFyIGluIGl0cyA8Y2xhc3NwYXRoPi4KKworKiBhZGQgZXJyb3JQcm9wZXJ0eSBhbmQgdXBkYXRlZFByb3BlcnR5IHRvIDxqYXZhYz4KKyAgQnVnemlsbGEgMzU2MzcgYW5kIDI4OTQxLgorCisqIGFkZCBjbGFzc3BhdGhyZWYgYXR0cmlidXRlIHRvIDx3aGljaHJlc291cmNlPgorICBCdWd6aWxsYSA0MTE1OC4KKworKiByZWR1Y2UgbG9nZ2luZyBub2lzZSBvZiA8YXBwbHkgc2tpcGVtcHR5ZmlsZXNldHM9InRydWUiPgorICBCdWd6aWxsYSAyOTE1NAorCisqIFNob3cgUHJldmlvdXMgUmV2aXNpb24gaW4gdGhlIHRhZ2RpZmYueHNsIHN0eWxlc2hlZXQKKyAgQnVnemlsbGEgMjkxNDMKKworKiBBbGxvdyA8bWFwcGVyIHJlZmlkPiB0byByZWZlciBkaXJlY3RseSB0byBhIEZpbGVOYW1lTWFwcGVyIGluc3RhbmNlLgorCisqIElmIHlvdSB0cnkgYW5kIHVzZSBhIHR5cGUgaW4gYSBuYW1lc3BhY2UgKG9yIGFuIGFudGxpYiksIGFuZCB0aGUgdHlwZSBpcyBub3QKKyAgcmVjb2duaXplZCBidXQgdGhlcmUgYXJlIG90aGVyIGRlZmluaXRpb25zIGluIHRoYXQgbmFtZXNwYWNlLCBBbnQgbGlzdHMgd2hhdAorICB0aGUga25vd24gZGVmaW5pdGlvbnMgYXJlLiBUaGlzIGhlbHBzIHlvdSBmaW5kIHNwZWxsaW5nIGVycm9ycy4KKworKiBBZGQgYSA8bGFzdD4gcmVzb3VyY2UgY29sbGVjdGlvbiwgY29ycmVzcG9uZGluZyB0byA8Zmlyc3Q+LgorCisqIEFkZCBuZXcgPHRydW5jYXRlPiB0YXNrLgorCisqIDxqdW5pdHJlcG9ydD4geHNsIHN0eWxlc2hlZXRzIGFsbG93IHNldHRpbmcgdGhlIHRpdGxlIHVzZWQgaW4gPHRpdGxlPiBhbmQgPGgxPiB0YWdzIGJ5CisgIHVzaW5nIDxyZXBvcnQ+PHBhcmFtPiBlbGVtZW50LiAgQnVnemlsbGEgNDE3NDIuCisKKyogQWRkIElnbm9yZURlcGVuZGVuY2llc0V4ZWN1dG9yIGZvciB3ZWlyZCBjYXNlcyB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIHJ1bgorICBvbmx5IHRoZSB0YXJnZXRzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorCisqIFBhdHRlcm5zZXQgYWxsb3dzIG5lc3RlZCBpbnZlcnRlZCBwYXR0ZXJuc2V0cyB1c2luZyA8aW52ZXJ0Pi4KKworKiA8bWFuaWZlc3Q+IGNoZWNrcyBmb3IgdmFsaWRpdHkgb2YgYXR0cmlidXRlIG5hbWVzLgorCisqIEpVbml0VmVyc2lvbkhlbHBlci5nZXRUZXN0Q2FzZUNsYXNzTmFtZSBpcyBub3cgcHVibGljLiBCdWd6aWxsYSA0MjIzMQorCisqIDxzdHJpbmc+IHJlc291cmNlIHN1cHBvcnRzIG5lc3RlZCB0ZXh0LiBCdWd6aWxsYSBidWcgNDIyNzYKKworKiA8c2NyaXB0ZGVmPiBub3cgc291cmNlcyBzY3JpcHRzIGZyb20gbmVzdGVkIHJlc291cmNlcy9yZXNvdXJjZSBjb2xsZWN0aW9ucy4gVGhpcyBsZXRzIHlvdQorICBkZWZpbmUgc2NyaXB0cyBpbiBKQVJzLCByZW1vdGUgVVJMcywgb3IgYW55IG90aGVyIHN1cHBvcnRlZCByZXNvdXJjZS4gQnVnemlsbGEgcmVwb3J0IDQxNTk3LgorCisqIDxjb25jYXQ+IGlzIG5vdyB1c2FibGUgYXMgYSBzaW5nbGUtZWxlbWVudCBSZXNvdXJjZUNvbGxlY3Rpb24uCisKKyogSXQgaXMgbm93IHBvc3NpYmxlIHRvIHByb3ZpZGUgdGhlIHZhbHVlIG9mIGEgPHN0cmlwbGluZWNvbW1lbnRzPiBmaWx0ZXIncworICA8Y29tbWVudD4gbmVzdGVkIGVsZW1lbnQgYXMgbmVzdGVkIHRleHQgaW5zdGVhZCBvZiB1c2luZyB0aGUgJ3ZhbHVlJworICBhdHRyaWJ1dGUuCisKKyogQSBuZXcgbG9nZ2VyLCBCaWdQcm9qZWN0TG9nZ2VyLCBsaXN0cyB0aGUgcHJvamVjdCBuYW1lIHdpdGggZXZlcnkgdGFyZ2V0ICAgCisKKyogRGVmYXVsdCB0ZXh0IGFkZGVkIHRvIG1hY3JvZGVmLiBCdWd6aWxsYSByZXBvcnQgNDIzMDEuCisKKyogInJhd2Jsb2JzIiBhdHRyaWJ1dGUgYWRkZWQgdG8gU1FMIHRhc2suCisKKyogQWRkIG5ldyByZXRyeSB0YXNrIGNvbnRhaW5lci4KKworKiA8amFyPiBoYXMgYSBuZXcgc3RyaWN0IGF0dHJpYnV0ZSB0aGF0IGNoZWNrcyBpZiB0aGUgamFyIGNvbXBsaWVzIHdpdGgKKyAgdGhlIGphciBwYWNrYWdpbmcgdmVyc2lvbiBzcGVjaWZpY2F0aW9uLgorCisqIDxqYXZhYz4gaGFzIGEgbmV3IGF0dHJpYnV0ZSAtIGluY2x1ZGVEZXN0Q2xhc3Nlcy4KKyAgQnVnemlsbGEgNDA3NzYuCisKKyogPGZpbGVzZXQ+IGhhcyBhIG5ldyBhdHRyaWJ1dGUgLSBlcnJvck9uTWlzc2luZ0Rpci4KKyAgQnVnemlsbGEgMTEyNzAuCisKKyogPGphdmFjPiBoYW5kbGVzIHBhY2thZ2UtaW5mby5qYXZhIGZpbGVzLCB0aGVyZSB3ZXJlIHJlcGVhdGVkbHkgY29tcGlsZWQuCisgIEJ1Z3ppbGxhIDQzMTE0LgorCitDaGFuZ2VzIGZyb20gQW50IDEuNi41IHRvIEFudCAxLjcuMAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBJbml0aWFsIHN1cHBvcnQgZm9yIEpESyA2IChKU1IgMjIzKSBzY3JpcHRpbmcuCisgIDwqc2NyaXB0Kj4gdGFza3Mgd2lsbCBub3cgdXNlIGphdmF4LnNjcmlwdGluZyBpZiBCU0YgaXMKKyAgbm90IGF2YWlsYWJsZSwgb3IgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdXNpbmcKKyAgYSAibWFuYWdlciIgYXR0cmlidXRlLgorCisqIFJlbW92ZWQgbGF1bmNoZXIgY2xhc3NlcyBmcm9tIG5vZGVwcyBqYXIuCisKKyogPGNsYXNzY29uc3RhbnRzPiBmaWx0ZXIgcmVhZGVyIHVzZXMgSVNPLTg4NTktMSBlbmNvZGluZyB0byByZWFkCisgIHRoZSBqYXZhIGNsYXNzIGZpbGUuIEJ1Z3ppbGxhIHJlcG9ydCAzMzYwNC4KKworKiBEZWZlciByZWZlcmVuY2UgcHJvY2Vzcy4gQnVnemlsbGEgMzY5NTUsIDM0NDU4LCAzNzY4OC4KKyAgVGhpcyBtYXkgYnJlYWsgYnVpbGQgZmlsZXMgaW4gd2hpY2ggYSByZWZlcmVuY2Ugd2FzIHNldCBpbiBhIHRhcmdldCB3aGljaCB3YXMKKyAgbmV2ZXIgZXhlY3V0ZWQuIEhpc3RvcmljYWxseSwgQW50IHdvdWxkIHNldCB0aGUgcmVmZXJlbmNlIGVhcmx5IG9uLCBkdXJpbmcgcGFyc2UKKyAgdGltZSwgc28gdGhlIGRhdGF0eXBlIHdvdWxkIGJlIGRlZmluZWQuIE5vdyBpdCByZXF1aXJlcyB0aGUgcmVmZXJlbmNlIHRvIGhhdmUKKyAgYmVlbiBpbiBhIGJpdCBvZiB0aGUgYnVpbGQgZmlsZSB3aGljaCB3YXMgYWN0dWFsbHkgZXhlY3V0ZWQuIElmIHlvdSBnZXQKKyAgYW4gZXJyb3IgYWJvdXQgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSwgbG9jYXRlIHRoZSByZWZlcmVuY2UgYW5kIG1vdmUgaXQgc29tZXdoZXJlCisgIHdoZXJlIGl0IGlzIHVzZWQsIG9yIGZpeCB0aGUgZGVwZW5kcyBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBpbiBxdWVzdGlvbiB0bworICBkZXBlbmQgb24gdGhlIHRhcmdldCB3aGljaCBkZWZpbmVzIHRoZSByZWZlcmVuY2UvZGF0YXR5cGUuCisgIEFzIGEgcmVzdWx0IG9mIHRlc3Rpbmcgb24gcmVhbCBsaXZlIGJ1aWxkIHNjcmlwdHMsIGEgZmFsbC1iYWNrIG1lY2hhbmlzbQorICB3YXMgcHV0IGl0IHBsYWNlIHRvIGFsbG93IHJlZmVyZW5jZXMgdGhhdCBhcmUgb3V0LW9mLWJhbmQgdG8gYmUgcmVzb2x2ZWQuIElmCisgIHRoaXMgaGFwcGVucyBhIGJpZyB3YXJuaW5nIG1lc3NhZ2UgaXMgbG9nZ2VkLiBUaGlzIGZhbGwtYmFjayBtZWNoYW5pc20gd2lsbAorICBiZSByZW1vdmVkIGluIEFudCAxLjguMC4KKworKiA8c2NyaXB0PiBhbmQgPHNjcmlwdGRlZj4gbm93IHNldCB0aGUgY3VycmVudCB0aHJlYWQgY29udGV4dC4KKworKiBVbnJlc3RyaWN0IHRoZSBkYnZlbmRvciBuYW1lcyBpbiB0aGUgd2Vic3BoZXJlIGVsZW1lbnQgb2YgdGhlIGVqYmphciB0YXNrLgorICBCdWd6aWxsYSBSZXBvcnQgNDA0NzUuCisKKyogPGVudj4gbmVzdGVkIGVsZW1lbnQgaW4gPGphdmE+LCA8ZXhlYz4gYW5kIG90aGVycyBpcyBub3cgY2FzZS1pbnNlbnNpdGl2ZQorICBmb3Igd2luZG93cyBPUy4gQnVnemlsbGEgUmVwb3J0IDI4ODc0LgorCisqIFJlbW92ZWQgc3VwcG9ydCBmb3IgeGFsYW4xIGNvbXBsZXRlbHkuIFVzZXJzIG9mIFhhbGFuMSBmb3IgQW50IGJ1aWxkcyB3aWxsCisgIGhhdmUgdG8gc3RheSBhdCBhbnQgMS42LjUgb3IgdXBncmFkZSB0byB4YWxhbjIuCisKKyogVXNlIG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyIGluc3RlYWQgb2Ygb3JnLmFwYWNoZS5sb2c0ai5DYXRlZ29yeS4KKyAgQ2F0ZWdvcnkgaGFzIGJlZW4gZGVwcmVjYXRlZCBmb3IgfjIgeWVhcnMgYW5kIGhhcyBiZWVuIHJlbW92ZWQgZnJvbQorICB0aGUgbG9nNGogY29kZS4gIExvZ2dlciB3YXMgaW50cm9kdWNlZCBpbiBsb2c0aiAxLjIgc28gdXNlcnMgb2YKKyAgbG9nNGogMS4xIGFuZCBsb2c0aiAxLjAgbmVlZCB0byB1cGdyYWRlIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBsb2c0ai4KKyAgQnVnemlsbGEgUmVwb3J0IDMxOTUxLgorCisqIGJ1aWxkLnN5c2NsYXNzcGF0aCBub3cgYWxzbyBhZmZlY3RzIHRoZSBib290Y2xhc3NwYXRoIGhhbmRsaW5nIG9mCisgIHNwYXduZWQgSmF2YSBWTXMuICBJZiB5b3Ugc2V0IGJ1aWxkLnN5c2NsYXNzcGF0aCB0byBhbnl0aGluZyBvdGhlcgorICB0aGFuICJpZ25vcmUiIChvciBsZWF2ZSBpdCB1bnNldCwgc2luY2UgImlnbm9yZSIgaXMgdGhlIGRlZmF1bHQgd2hlbgorICBpdCBjb21lcyB0byBib290Y2xhc3NwYXRoIGhhbmRsaW5nKSwgdGhlbiB0aGUgYm9vdGNsYXNzcGF0aCBvZiB0aGUKKyAgVk0gcnVubmluZyBBbnQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYm9vdGNsYXNzcGF0aCB5b3UndmUgc3BlY2lmaWVkLgorCisqIFRoZSA8amF2YSBmb3JrPSJmYWxzZSI+IG5vdyBhcyBwZXIgZGVmYXVsdCBpbnN0YWxscyBhIHNlY3VyaXR5IG1hbmFnZXIKKyAgdXNpbmcgdGhlIGRlZmF1bHQgcGVybWlzc2lvbnMuIFRoaXMgaXMgbm93IGluZGVwZW5kZW50IG9mIHRoZQorICBmYWlsb25lcnJvciBhdHRyaWJ1dGUuICBCdWd6aWxsYSByZXBvcnQgMzMzNjEuCisKKyogPHNpZ25qYXI+IG5vdyBub3RpY2VzIHdoZW4gdGhlIGphciBhbmQgc2lnbmVkamFyIGFyZSBlcXVhbCwgYW5kIHN3aXRjaGVzCisgIHRvIHRoZSBzYW1lIGRlcGVuZGVuY3kgbG9naWMgYXMgd2hlbiBzaWduZWRqYXIgaXMgb21pdHRlZC4gVGhpcyBtYXkgYnJlYWsKKyAgc29tZXRoaW5nIHRoYXQgZGVwZW5kZWQgdXBvbiBzaWduaW5nIGluIHRoaXMgc2l0dWF0aW9uLiBIb3dldmVyLCBzaW5jZQorICBpbnZva2luZyB0aGUgSkRLIGphcnNpZ25lciBwcm9ncmFtIHdpdGggLXNpZ25lZGphciBzZXQgdG8gdGhlIHNvdXJjZSBqYXIKKyAgYWN0dWFsbHkgY3Jhc2hlcyB0aGUgSlZNIG9uIG91ciAoSmF2YTEuNSkgc3lzdGVtcywgd2UgZG9uJ3QgdGhpbmsgYW55CisgIGJ1aWxkIGZpbGVzIHdoaWNoIGFjdHVhbGx5IHdvcmtlZCB3aWxsIGJlIGFmZmVjdGVkIGJ5IHRoZSBjaGFuZ2UuCisKKyogPHNpZ25qYXI+IHVzZWQgdG8gaWdub3JlIGEgbmVzdGVkIGZpbGVzZXQgd2hlbiBhIGphciB3YXMgYWxzbyBwcm92aWRlZCBhcyBhbgorICBhdHRyaWJ1dGUsIHByaW50aW5nIGEgd2FybmluZyBtZXNzYWdlOyBub3cgaXQgc2lnbnMgZmlsZXMgaW4gdGhlIGZpbGVzZXQuCisKKyogQW4gaW1wcm92ZWQgbWV0aG9kIG9mIGhhbmRsaW5nIHRpbWVzdGFtcCBncmFudWxhcml0eSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisgIGNsaWVudCBhbmQgc2VydmVyIHdhcyBhZGRlZCB0byB0aGUgPGZ0cD4gdGFzay4gIEZUUCBzZXJ2ZXJzIHR5cGljYWxseQorICBoYXZlIEhIOm1tIHRpbWVzdGFtcHMgd2hlcmVhcyBsb2NhbCBmaWxlc3lzdGVtcyBoYXZlIEhIOm1tOnNzIHRpbWVzdGFtcHMuCisgIFByZXZpb3VzbHksIHRoaXMgcmVxdWlyZWQgdHdlYWtpbmcgd2l0aCB0aGUgdGltZWRpZmZtaWxsaXMgYXR0cmlidXRlCisgIHdoaWNoIGFsc28gd2FzIHVzZWQgdG8gaGFuZGxlIHRpbWV6b25lIGRpZmZlcmVuY2VzLiAgTm93LCB0aGVyZSBpcyBhIG5ldworICB0aW1lc3RhbXBncmFudWxhcml0eSBhdHRyaWJ1dGUuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgZ2V0IG9wZXJhdGlvbnMgaXMgMAorICBzaW5jZSB0aGUgdXNlciBoYXMgdGhlIG1vcmUgcG93ZXJmdWwgcHJlc2VydmVsYXN0bW9kaWZpZWQgYXR0cmlidXRlIHRvIHdvcmsKKyAgd2l0aC4gIFNpbmNlIHRoaXMgaXMgbm90IGF2YWlsYWJsZSBvbiBwdXQgb3BlcmF0aW9ucyB0aGUgZGVmYXVsdCB2YWx1ZQorICBhZGRzIGEgbWludXRlIHRvIHRoZSBzZXJ2ZXIgdGltZXN0YW1wIGluIG9yZGVyIHRvIGFjY291bnQgZm9yIHRoaXMsCisgIFNjcmlwdHMgd2hpY2ggcHJldmlvdXNseSB1c2VkIHRpbWVkaWZmbWlsbGlzIHRvIGRvIHRoaXMgY29tcGVuc2F0aW9uIG1heQorICBuZWVkIHRvIGJlIHJld3JpdHRlbi4gIHRpbWVkaWZmbWlsbGlzIGhhcyBub3cgYmVlbiBkZXByZWNhdGVkLgorCisqIFN1cHBvcnQgZm9yIHRoZSBYU0w6UCBYTUwgcGFyc2VyIGhhcyBiZWVuIHJlbW92ZWQuCisgIEJ1Z3ppbGxhIFJlcG9ydCAyMzQ1NS4KKworKiBWaXN1YWwgQWdlIGZvciBKYXZhIG9wdGlvbmFsIHRhc2tzIHJlbW92ZWQgYXMgdGhlIHJlcXVpcmVkIGxpYnJhcnkgaXMgbm8KKyAgbG9uZ2VyIGF2YWlsYWJsZS4KKworKiBUZXN0bGV0ICh0ZXN0KSBvcHRpb25hbCB0YXNrIHJlbW92ZWQgYXMgdGhlIHJlcXVpcmVkIGxpYnJhcnkgaXMgbm8KKyAgbG9uZ2VyIGF2YWlsYWJsZS4KKworKiBJQ29udHJhY3Qgb3B0aW9uYWwgdGFzayByZW1vdmVkIGFzIHRoZSByZXF1aXJlZCBsaWJyYXJ5IGlzIG5vCisgIGxvbmdlciBhdmFpbGFibGUuCisKKyogTWV0YW1hdGEgKG1hdWRpdCwgbW1ldHJpY3MsIGFuZCBtcGFyc2UgdGFza3MpIHJlbW92ZWQgYXMgdGhlIHJlcXVpcmVkIAorICBsaWJyYXJ5IGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisKKyogU2l0cmFrYSAoanBjb3ZlcmFnZSwganBjb3ZtZXJnZSwganBjb3ZyZXBvcnQpIHRhc2tzIHN1cHByZXNzZWQgYXMgdGhlIAorICByZXF1aXJlZCBsaWJyYXJ5IGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisKKyogPGZpeGNybGY+IHVzZWQgXHIgKE1hYykgbGluZSBlbmRpbmdzIG9uIE9TIFgsIHdob3NlIHByb3BlciBsaW5lIHNlcGFyYXRvcgorICBpcyBcbiAoVW5peCkuICBCdWd6aWxsYSByZXBvcnQgMzk1ODUuCisKKyogPHNjcD4gbm93IG9wdGlvbmFsbHkgc3VwcG9ydHMgdGhlIHNmdHAgcHJvdG9jb2wsIHlvdSBtYXkgbmVlZCBhCisgIG5ld2VyIGpzY2guamFyLiAgQnVnemlsbGEgUmVwb3J0IDM5MzczLgorCisqIEFudCBsYXVuY2hlciBwcm9ncmFtIHByaW50cyBlcnJvcnMgdG8gc3RkZXJyLCBhbmQgZXhpdHMgd2l0aCBhIDIgZXhpdCBjb2RlCisgIHZhbHVlIGlmLCBmb3IgYW55IHJlYXNvbiwgaXQgY2Fubm90IGFjdHVhbGx5IHN0YXJ0IEFudCBwcm9wZXIuIFRoaXMgd2lsbCBvbmx5CisgIGFmZmVjdCBwcm9ncmFtcy9zY3JpcHRzIHRoYXQgY2FsbGVkIHRoZSBsYXVuY2hlciBhbmQgd2hpY2ggZGlkIG5vdCB3YW50IHRvCisgIHJlY2VpdmUgYW4gZXJyb3IgaWYgQW50IGl0c2VsZiB3b3VsZCBub3Qgc3RhcnQKKworKiBBbGwgLk5FVCB0YXNrcyBhcmUgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhlIG5ldyAuTkVUIEFudGxpYjoKKyAgaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvZG90bmV0L2luZGV4Lmh0bWwKKworRml4ZWQgYnVnczoKKy0tLS0tLS0tLS0tCisqIERpcmVjdG9yeSBkZWxldGlvbiBkaWQgbm90IHdvcmsgcHJvcGVybHkuCisgIEJ1Z3ppbGxhIDQwOTcyLgorCisqIGRvY2xldHBhdGggYXR0cmlidXRlIG9mIGphdmFkb2Mgd2FzIGlnbm9yZWQuCisgIEJ1Z3ppbGxhIDQwOTAwLgorCisqIEZpeGVkIGluY29ycmVjdCByZWN1cnNpb24gaW4gRE9NVXRpbC5saXN0Q2hpbGROb2RlcygpLgorICBCdWd6aWxsYSA0MDkxOC4KKworKiBDb21wcmVzc2VkUmVzb3VyY2UuY29tcGFyZVRvKCkgZGlkIG5vdAorICB0YWtlIGNvbXBhcmlzb24gd2l0aCBhbm90aGVyIENvbXByZXNzZWRSZXNvdXJjZSBpbnRvIGFjY291bnQuCisgIEJ1Z3ppbGxhIDQwOTQ5LgorCisqIEF2b2lkIHBvc3NpYmxlIE5QRSBpbiBKYXIuamF2YS4KKyAgQnVnemlsbGEgNDA4NDcuCisKKyogcmVncmVzc2lvbiBpbiBhdHRyaWJ1dGUgcHJlZml4ICgrIG90aGVycykgZm9yIHJlZmlkIGluIHppcGZpbGVzZXQgYW5kIHRhcmZpbGVzZXQuCisgIEJ1Z3ppbGxhIDQxMDA0LCAzMDQ5OC4KKworKiBkZXBlbmRzZXQgZmFpbGVkIGlmIHRoZSBiYXNlZGlyIG9mIGEgdGFyZ2V0IGZpbGVzZXQgZGlkIG5vdCBleGlzdC4KKyAgQnVnemlsbGEgNDA5MTYuCisKKyogUmVjdXJzaXZlIGZpbHRlcmluZyBlbmNvdW50ZXJlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbnMgdW5kZXIgY2VydGFpbgorICBjaXJjdW1zdGFuY2VzLiAgQnVnemlsbGEgNDEwODYuCisKKyogWG1sUHJvcGVydHkgb3ZlcnJpZGVzIHByZXZpb3VzbHkgc2V0IHByb3BlcnR5IHZhbHVlIHdoZW4gaGFuZGxpbmcgZHVwbGljYXRlCisgIGVsZW1lbnRzLiBCdWd6aWxsYSA0MTA4MC4KKworKiBIYXZpbmcgbWFueSB0YXNrcyBjYXVzZXMgT09NLiAgQnVnemlsbGEgNDEwNDkuCisKKyogUmVncmVzc2lvbjogPHBhdGg+IHdhcyBldmFsdWF0aW5nIG5lc3RlZCBjb250ZW50IG9ubHkgb25jZSwgc28gdGhhdCBpdCBjb3VsZAorICBub3QgZS5nLiBwaWNrIHVwIGZpbGVzIHRoYXQgZGlkbid0IGV4aXN0IHRoZSBmaXJzdCB0aW1lIHRocm91Z2guCisgIEJ1Z3ppbGxhIDQxMTUxLgorCisqIE9PTSBjYXVzZWQgYnkgSUggaG9sZGluZyBvbiB0byBjbGFzc2VzIGFuZCB0aHVzIHRoZWlyIGNsYXNzbG9hZGVycy4KKyAgQnVnemlsbGEgMjgyODMgYW5kIDMzMDYxLgorCisqIDxkZWxldGU+IGRvZXNudCBkZWxldGUgd2hlbiBkZWZhdWx0ZXhjbHVkZXM9ImZhbHNlIiBhbmQgbm8gaW5jbHVkZXMgaXMgc2V0CisgIGZpeGVkLiBCdWd6aWxsYSA0MDMxMy4KKworKiBCZWhhdmlvciBjaGFuZ2Ugb2YgRGlyZWN0b3J5U2Nhbm5lci9BYnN0cmFjdEZpbGVzZXQgd2hlbiBjb25kaXRpb25hbCBpbmNsdWRlCisgIHBhdHRlcm5zIGFyZSB1c2VkLiBCdWd6aWxsYSA0MDcyMi4KKworKiA8amF2YWM+IGZhaWxzIHdpdGggTlBFIHdoZW4gY29tcGlsaW5nIHdpdGggZWNsaXBzZSBlY2ogMy4xLnguCisgIEJ1Z3ppbGxhIDQwODM5LgorCisqIEpVbml0VGVzdFJ1bm5lciBoYWQgYSBOUEUgd2hlbiB1bmFibGUgdG8gY3JlYXRlIHBhcnNlciwgdGhlIGV4Y2VwdGlvbgorICBjb250YWluaW5nIHRoZSBlcnJvciBkaWQgbm90IGdldCByZXBvcnRlZC4gQnVnemlsbGEgMzY3MzMuCisKKyogPGNoZWNrc3VtPiB3aXRoIGZpbGUgYW5kIHRvZGlyIG9wdGlvbiBmYWlsZWQuIEJ1Z3ppbGxhIHJlcG9ydCAzNzM4Ni4KKworKiA8cGF0aCBsb2NhdGlvbj0ibG9jIj4gd2FzIGJyb2tlbiAoUmVncmVzc2lvbiBmcm9tIGJldGExKS4KKyAgQnVnemlsbGEgcmVwb3J0IDQwNTQ3LgorCisqIE5lc3RlZCBmaWxlc2V0IGluIDxjYWI+IGRpZCBub3Qgd29yay4gQnVnemlsbGEgcmVwb3J0IDM5NDM5LgorCisqIFRoZSBhbnQgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5vdyBjb3JyZWN0bHkgbG9jYXRlIHRoZSBqYXZhCisgIGV4ZWN1dGFibGUgaW4gbW9yZSByZWNlbnQgSUJNIEpES3MgZm9yIEFJWCBhcyB3ZWxsLgorCisqIFVSTFJlc291cmNlIGRpZCBub3QgY2xvc2UgamFyIGZpbGVzLCBhbmQgYWxzbyBkaWQgbm90IGRpc2Nvbm5lY3QgSFRUUENvbm5lY3Rpb24gKHMpLgorCisqIEVycm9yIGNhbGxpbmcganVuaXRyZXBvcnQuIEJ1Z3ppbGxhIDQwNTk1LgorCisqIDxqdW5pdHRhc2svPiBjcmVhdGVkIGp1bml0dm13YXRjaGVyKi5wcm9wZXJ0aWVzIGZpbGVzIGJ1dCBkaWQgbm90IGNsb3NlIGFuZCBkZWxldGUgdGhlbS4KKworKiA8eG1scHJvcGVydHk+IGRpZCBub3QgY3JlYXRlIHByb3BlcnRpZXMgZm9yIGVtcHR5IGxlYWYgZWxlbWVudHMuCisgIEJ1Z3ppbGxhIHJlcG9ydCAyNjI4Ni4KKworKiBVbmtub3duRWxlbWVudC5tYXliZUNvbmZpZ3VyZSBhbHdheXMgY29uZmlndXJlZC4KKyAgQnVnemlsbGEgcmVwb3J0IDQwNjQxLgorCisqIE5vIGNoZWNrIGZvciByZWZpZCB3aGVuIHByZWZpeCBhdHRyaWJ1dGUgaXMgc2V0IGluIHppcGZpbGVzZXQuCisgIEJ1Z3ppbGxhIHJlcG9ydCAzMDQ5OC4KKworKiBGaXggZm9yIGp1bml0NCBpc3N1ZSBpbnRyb2R1Y2VkIHNpbmNlIGJldGEyLgorICBCdWd6aWxsYSByZXBvcnQgNDA2ODIuCisKKyogRXJyb3IgaW4gZHVwbGljYXRlIHByb2plY3QgbmFtZSB3aXRoIDxpbXBvcnQ+IGFuZCA8YW50Y2FsbD4uCisgIEJ1Z3ppbGxhIHJlcG9ydCAzOTkyMC4KKworKiBqdW5pdDQgZGlkIG5vdCB3b3JrIHdpdGggZm9yaz1ubyBhbmQganVuaXQ0IGluICRBTlRfSE9NRS9saWIuCisgIEJ1Z3ppbGxhIHJlcG9ydCA0MDY5Ny4KKworKiBQYXRoQ29udmVydCBvbiBXaW5kb3dzIHNob3VsZCBwcm9jZXNzIGZvcndhcmQgYW5kIGJhY2sgc2xhc2hlcyBlcXVpdmFsZW50bHkuCisgIEJ1Z3ppbGxhIHJlcG9ydCAzMjg4NC4KKworKiBhbnQuYmF0IG5vdyBsb29rcyBpbiAlVVNFUlBST0ZJTEUlIGFuZCAlSE9NRURSSVZFJSVIT01FUEFUSCUgaW4gYWRkaXRpb24gdG8KKyAgJUhPTUUlIGZvciBwcmUvcG9zdCBiYXRjaCBmaWxlcy4gQnVnemlsbGEgcmVwb3J0IDM5Mjk4LgorCisqIFRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgb2YgdGhlIGxlZ2FjeSA8cGF0aD4gdHlwZSB3YXMgY2hhbmdlZDsgY29kZSBidWlsdAorICBhZ2FpbnN0IEFudCAxLjcgd291bGQgdGhlcmVmb3JlIG5vIGxvbmdlciBleGVjdXRlIG9uIG9sZGVyIHZlcnNpb25zIG9mIEFudC4KKyAgU2luY2UgPHBhdGg+IGlzIGhpc3RvcmljYWxseSBoZWF2aWx5IHVzZWQgdGhpcyB3YXMgdW5kZXNpcmFibGUsIGFuZCBzaW5jZSBpdAorICBpcyBhbHNvIGF2b2lkYWJsZSwgdGhlIGNoYW5nZSB0byA8cGF0aD4ncyB0YXhvbm9teSB3YXMgcmV2ZXJ0ZWQuCisKKyogPHppcCBmaWxlc29ubHk9InRydWUiPiBpbmNsdWRlZCBlbXB0eSBkaXJlY3Rvcmllcy4gIEJ1Z3ppbGxhIHJlcG9ydCA0MDI1OC4KKworKiBJbnZhbGlkIGhhc2ggY29kZSBvZiBUYXJnZXQgY2F1c2VzIFhtbExvZ2dlciB0byBmYWlsLgorICBCdWd6aWxsYSByZXBvcnQgNDAyMDcuCisKKyogTWFjcm8gZWxlbWVudCBkaWQgbm90IGluY2x1ZGUgdG9wIGxldmVsIFRleHQuIEJ1Z3ppbGxhIHJlcG9ydCAzNjgwMy4KKworKiBBbnRDbGFzc0xvYWRlciBkaWQgbm90IGlzb2xhdGUgcmVzb3VyY2VzIHdoZW4gaXNvbGF0ZSB3YXMgc2V0LiBCdWd6aWxsYSByZXBvcnQgMzg3NDcuCisKKyogRGlhZ25vc3RpY3MgYnJva2VuIHdoZW4gdXNpbmcgamF2YSAxLjQuIEJ1Z3ppbGxhIHJlcG9ydCA0MDM5NS4KKworKiBFeGNlcHRpb24gcmVwb3J0aW5nIGluIDxjb3B5PiB3YXMgYnJva2VuLiBCdWd6aWxsYSByZXBvcnQgNDAzMDAuCisKKyogSGFuZGxpbmcgb2YgY29ycnVwdCB0YXIgZmlsZXMsIFRhcklucHV0U3RyZWFtLnJlYWQoKSBuZXZlciByZXR1cm5zIEVPRi4KKyAgQnVnemlsbGEgcmVwb3J0IDM5OTI0LgorCisqIFNvbWUgYnVncyBpbiBSZWFkZXJJbnB1dFN0cmVhbS4gQnVnemlsbGEgcmVwb3J0IDM5NjM1LgorCisqIDxhbnRscj4gZGlkIG5vdCByZWNvZ25pc2Ugd2hldGhlciB0aGUgdGFyZ2V0IGlzIHVwLXRvLWRhdGUgZm9yIGh0bWwgb3B0aW9uLgorICBCdWd6aWxsYSByZXBvcnQgMzg0NTEuCisKKyogRG9jdW1lbnRlZCBtaW5pbWFsIHZlcnNpb24gb2YganNjaCBub3cgMC4xLjI5LgorICBCdWd6aWxsYSByZXBvcnQgNDAzMzMuCisKKyogPGF2YWlsYWJsZT4gc2VhcmNoZWQgcGFyZW50IGRpcmVjdG9yaWVzIGZvciBmaWxlcy4KKyAgQnVnemlsbGEgcmVwb3J0IDM3MTQ4LgorCisqIFRoZSBidWlsZCBjb3VsZCBiZSBoYWx0ZWQgaWYgYSBmaWxlIHBhdGggY29udGFpbmVkIG1vcmUgIi4uIiBjb21wb25lbnRzIHRoYW4KKyAgdGhlIGFjdHVhbCBkZXB0aCBvZiB0aGUgcHJlY2VkaW5nIHBhdGguIE5vdyBzdWNoIHBhdGhzIGFyZSBsZWZ0CisgIGFsb25lIChtZWFuaW5nIHRoZXkgd2lsbCBsaWtlbHkgYmUgdHJlYXRlZCBhcyBub25leGlzdGVudAorICBmaWxlcykuIEJ1Z3ppbGxhIFJlcG9ydCA0MDI4MS4KKworKiBDb252ZXJ0aW5nIGEgPGRpcnNldD4gdG8gYSBzdHJpbmcgd2FzIGJyb2tlbi4gQnVnemlsbGEgUmVwb3J0IDM5NjgzLgorCisqIE1hbmlmZXN0cyBoYXZlIGltcHJvdmVkIGxpbmUgbGVuZ3RoIGhhbmRsaW5nLCB0YWtpbmcgY2FyZSBvZiBlbmNvZGluZy4KKyAgQnVnIHJlcG9ydHMgMzc1NDggLyAzNDQyNS4KKworKiA8bWFuaWZlc3Q+IG5vdyBjbG9zZXMgdGhlIGlucHV0c3RyZWFtIGV4cGxpY2l0bHkuIEJ1ZyByZXBvcnQgMzk2MjguCisKKyogPHJwbT4gbm93IGFsc28gY29ycmVjdGx5IHNlYXJjaGVzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBwYXRoLgorICBCdWcgcmVwb3J0IDM5MzQ1LgorCisqIGFudC5iYXQgbm93IGhhbmRsZXMgY2xhc3NwYXRoIHNldCB0byAiIi4gQnVnIHJlcG9ydCAzODkxNC4KKworKiA8anVuaXQ+IG5vdyBzdXBwb3J0cyBKVW5pdCA0LiBCdWd6aWxsYSBSZXBvcnQgMzg4MTEuCisKKyogPGp1bml0PiBjYW4gbm93IHdvcmsgd2l0aCBqdW5pdC5qYXIgaW4gaXRzIDxjbGFzc3BhdGg+LiBCdWd6aWxsYQorICBSZXBvcnQgMzg3OTkuCisKKyogU29tZSBwb3RlbnRpYWwgTnVsbFBvaW50ZXJFeGNlcHRpb25zLCBCdWd6aWxsYSBSZXBvcnRzIDM3NzY1IGFuZCAzODA1Ni4KKworKiBQcm9ibGVtIHdoZW4gYWRkaW5nIG11bHRpcGxlIGZpbHRlciBmaWxlcywgQnVnemlsbGEgUmVwb3J0IDM3MzQxLgorCisqIFByb2JsZW0gcmVmZXJlbmNpbmcgamFycyBzcGVjaWZpZWQgYnkgQ2xhc3MtUGF0aCBhdHRyaWJ1dGUgaW4gbWFuaWZlc3QKKyAgb2YgYSBhbnQgdGFzayBqYXIgZmlsZSwgd2hlbiB0aGlzIGFudCB0YXNrIGphciBmaWxlIGlzIGxvY2F0ZWQgaW4KKyAgYSBkaXJlY3Rvcnkgd2l0aCBzcGFjZSwgQnVnemlsbGEgUmVwb3J0IDM3MDg1LgorCisqIEJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2UgaW4gWmlwRmlsZVNldCwgQnVnemlsbGEgUmVwb3J0IDM1ODI0LgorCisqIFdyb25nIHJlcGxhY2VtZW50IG9mIGZpbGUgc2VwYXJhdG9yIGNoYXJzIHByZXZlbnMganVuaXRiYXRjaHRlc3QKKyAgZnJvbSBydW5uaW5nIGNvcnJlY3RseSBvbiBmaWxlcyBmcm9tIGEgemlwZmlsZXNldC4gQnVnemlsbGEgUmVwb3J0IDM1NDk5LgorCisqIENhbGxpbmcgY2xvc2UgdHdpY2Ugb24gUmVhZGVySW5wdXRTdHJlYW0gZ2F2ZSBhIG51bGxwb2ludGVyIGV4Y2VwdGlvbi4KKyAgQnVnemlsbGEgUmVwb3J0IDM1NTQ0LgorCisqIE1lbW9yeSBsZWFrIGZyb20gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoQ2xhc3MpIGluIGVtYmVkZGVkCisgIGVudmlyb25tZW50cy4gQnVnemlsbGEgUmVwb3J0IDMwMTYyLgorCisqIFRyYW5zbGF0ZSB0YXNrIGRvZXMgbm90IHJlbW92ZSB0b2tlbnMgd2hlbiBhIGtleSBpcyBub3QgZm91bmQuCisgIEl0IGxvZ3MgYSB2ZXJib3NlIG1lc3NhZ2UuICBCdWd6aWxsYSBSZXBvcnQgMTM5MzYuCisKKyogSW5jb3JyZWN0IHRhc2sgbmFtZSB3aXRoIGludmFsaWQgImphdmFjIiB0YXNrIGFmdGVyIGEgInByZXNldGRlZiIuCisgIEJ1Z3ppbGxhIHJlcG9ydHMgMzEzODkgYW5kIDI5NDk5LgorCisqIDxtYW5pZmVzdD4gd2FzIG5vdCBwcmludGluZyB3YXJuaW5ncyBhYm91dCBpbnZhbGlkIG1hbmlmZXN0IGVsZW1lbnRzLgorICBCdWd6aWxsYSByZXBvcnQgMzIxOTAuCisKKyogPHJlcGxhY2U+IGdvdCBvdXQgb2YgbWVtb3J5IG9uIGxhcmdlIGZpbGVzIChwYXJ0IG9mIHJlcG9ydCAzMjU2NikuCisgIDxyZXBsYWNlPiBjYW4gbm93IGhhbmRsZSBmaWxlcyBhcyBsb25nIGFzIHRoZXJlIGlzIGVub3VnaCBkaXNrIHNwYWNlCisgIGF2YWlsYWJsZS4KKworKiBDb21tYW5kbGluZS5kZXNjcmliZUNvbW1hbmQoKSBtZXRob2RzIHdvdWxkIGF0dGVtcHQgdG8gZGVzY3JpYmUKKyAgYXJndW1lbnRzIGV2ZW4gd2hlbiBub25lLCBvdGhlciB0aGFuIHRoZSBleGVjdXRhYmxlIG5hbWUsIHdlcmUgcHJlc2VudC4KKworKiBDcmVhdGUgc2lnbmphcidzIGhlbHBlciBFeGVjVGFzayBpbnN0YW5jZSBkaXJlY3RseSByYXRoZXIgdGhhbiBieQorICB0eXBlZGVmIGRpc2NvdmVyeSBtZWNoYW5pc21zLiBCdWd6aWxsYSByZXBvcnQgMzM0MzMuCisKKyogRmlsZVV0aWxzLnJlc29sdmVGaWxlKCkgcHJvbWlzZWQgdG8gcmV0dXJuIGFic29sdXRlIGZpbGVzIGJ1dAorICBkaWQgbm90IGFsd2F5cyBkbyBzby4KKworKiA8ZnRwPiBmYWlsZWQgdG8gcmV0cmlldmUgYSBmaWxlIHdoZW4gdGhlIHBhdGggdG93YXJkcyB0aGUgZmlsZSBjb250YWluZWQKKyAgYW4gZWxlbWVudCBzdGFydGluZyB3aXRoIC4gQnVnemlsbGEgcmVwb3J0IDMzNzcwLgorCisqICI8cm1pYz4gYWx3YXlzIGNvbXBpbGVzIG9uIEphdmExLjUiIGJ1Z3ppbGxhIHJlcG9ydD0zMzg2Mi4gRml4ZWQgZGVmYXVsdAorICBzdHViIHZlcnNpb24gdG8gYWx3YXlzIGJlICJjb21wYXQiLCBldmVuIG9uIEphdmExLjUrLgorCisqIFRoZSAuTkVUIGNvbXBpbGF0aW9uIHRhc2tzIGZhaWxlZCBpZiBmaWxlbmFtZXMgZ2l2ZW4gYXMgcmVmZXJlbmNlcworICBjb250YWluZWQgc3BhY2VzLiAgQnVnemlsbGEgUmVwb3J0IDI3MTcwLgorCisqIFNRTCB0YXNrIHdvdWxkIHRyeSBhY2Nlc3MgcmVzdWx0IHNldHMgb2Ygc3RhdGVtZW50cyB0aGF0IGRpZG4ndAorICByZXR1cm4gYW55LCBjYXVzaW5nIHByb2JsZW1zIHdpdGggSW5mb3JtaXggSURTIDkuMiBhbmQgSUJNIERCMiA4LjEKKyAgRml4UGFrIDYgKG9yIGxhdGVyKS4gQnVnemlsbGEgUmVwb3J0cyAyNzE2MiBhbmQgMjk5NTQuCisKKyogVGFzay5pbml0KCkgd2FzIGNhbGxlZCB0d2ljZSBmb3IgbW9zdCB0YXNrcy4gIEJ1Z3ppbGxhIFJlcG9ydCAzNDQxMS4KKworKiBKYXZhVGVzdCB0ZXN0Y2FzZXMgc29tZXRpbWVzIGZhaWwgb24gd2luZG93cy4gQnVnemlsbGEgUmVwb3J0IDM0NTAyLgorCisqIFRhcmdldHMgd2l0aCBpZGVudGljYWwgbmFtZSB3b3JrIGluIGltcG9ydGVkIHByb2plY3QuIEJ1Z3ppbGxhIFJlcG9ydCAzNDU2Ni4KKworKiBEZW11eE91dHB1dFN0cmVhbSBub3cgdXNlcyBhIFdlYWtIYXNoTWFwIHRvIHN0b3JlIHRoZSB0aHJlYWQtc3RyZWFtIG1hcHBpbmcsCisgIHRvIGF2b2lkIGhvbGRpbmcgb24gdG8gdGhyZWFkIHJlZmVyZW5jZXMgYWZ0ZXIgdGhleSB0ZXJtaW5hdGUuCisKKyogPHhtbHZhbGlkYXRlPiBhbmQgPHNjaGVtYXZhbGlkYXRlPiBjcmVhdGUgYSBuZXcgcGFyc2VyIGZvciBldmVyeSBmaWxlIGluIGEKKyAgZmlsZXNldCwgYW5kIHNvIHZhbGlkYXRlIG11bHRpcGxlIGZpbGVzIHByb3Blcmx5LiBCdWd6aWxsYSBSZXBvcnQgMzI3OTEuCisKKyogPHRhcj4gLyA8dW50YXI+IG5vdyBhY2NlcHRzIGZpbGVzIHVwdG8gOEdCLCA8dGFyPiBnaXZlcyBhbiBlcnJvciBpZiBsYXJnZXIKKyAgZmlsZXMgYXJlIHRvIGJlIGluY2x1ZGVkLiBUaGlzIGlzIHRoZSBQT1NJWCBzaXplIGxpbWl0LgorCisqIDxqdW5pdHJlcG9ydD4gcmVtb3ZlZCBsaW5lLWJyZWFrcyBmcm9tIHN0YWNrLXRyYWNlcy4gIEJ1Z3ppbGxhCisgIFJlcG9ydCAzNDk2My4KKworKiBPZmYtYnktb25lIGVycm9yIGluIGVudmlyb25tZW50IHNldHVwIGZvciBleGVjdXRpb24gdW5kZXIgT3BlblZNUyBmaXhlZC4KKworKiBCdWd6aWxsYSByZXBvcnQgMzYxNzE6IC1ub2NsYXNzcGF0aCBjcmFzaGVzIGFudCBpZiBubyBzeXN0ZW0KKyAgY2xhc3NwYXRoIGlzIHNldC4KKworKiA8cHZjcz4gdXNlZCB3cm9uZyBzd2l0Y2ggZm9yIHJldHJpZXZpbmcgcmV2aXNpb25zIGJ5IGxhYmVsLgorICBCdWd6aWxsYSBSZXBvcnQgMzYzNTkuCisKKyogPHNzaGV4ZWM+IGNsb3NlZCBTeXN0ZW0ub3V0LCBkaXNhYmxpbmcgb3V0cHV0IG9uIHNlY29uZCBhbmQgc3Vic2VxdWVudAorICBpbnZvY2F0aW9ucy4gIEJ1Z3ppbGxhIHJlcG9ydCAzNjMwMi4KKworKiA8Y3ZzY2hhbmdlbG9nPiB3YXMgY3Jhc2hpbmcgd2l0aCBDVlMgdmVyc2lvbnMgPj0gMS4xMi54IGR1ZSB0byBjaGFuZ2UgaW4KKyAgdGhlIGRhdGUgZm9ybWF0LiBCdWd6aWxsYSByZXBvcnQgMzA5NjIuCisKKyogVGhlIHNhbWUgSW50cm9zcGVjdGlvbkhlbHBlciBpbnN0YW5jZSB3YXMgY29udGludW91c2x5IGFkZGVkIGFzIGEgbGlzdGVuZXIKKyAgdG8gcHJvamVjdC4gQnVnemlsbGEgcmVwb3J0IDM3MTg0LgorCisqIEZpbGVVdGlscy50b1VSSSgpIHdhcyBub3QgZW5jb2Rpbmcgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgdG8gQVNDSUksCisgIGNhdXNpbmcgaW1wb3NzaWJpbGl0eSB0byBwcm9jZXNzIFhNTCBlbnRpdGllcyByZWZlcmVuY2VkIGJ5IFhNTAorICBkb2N1bWVudHMgaW4gbm9uIEFTQ0lJIHBhdGhzLiBCdWd6aWxsYSByZXBvcnQgMzczNDguCisKKyogPiAxIHNzaCBpbnZvY2F0aW9ucyB0byBhIGdpdmVuIGhvc3Qgd291bGQgZmFpbC4gQnVnemlsbGEgcmVwb3J0IDM2MjA3LgorCisqIEVtYWlsVGFzayB3YXMgZWF0aW5nIFNNVFAgZXJyb3IgbWVzc2FnZXMuIEJ1Z3ppbGxhIHJlcG9ydCAzNzU0Ny4KKworKiBQcm9wZXJ0eVNldCBBUEkgc2V0TWFwcGVyKC4uLikgZGlkbid0IHByb3Blcmx5IHNldCB1cCB0aGUgTWFwcGVyLgorICBCdWd6aWxsYSByZXBvcnQgMzc3NjAuCisKKyogUHJvcGVyIHJldHVybiBjb2RlIGZvciBhbnQuYmF0LiBCdWd6aWxsYSByZXBvcnQgMTM2NTUuCisKKyogUHJvamVjdCBub3Qgc2V0IG9uIENoYWluUmVhZGVySGVscGVycyB1c2VkIGJ5IHRoZSBSZWRpcmVjdG9yLgorICBCdWd6aWxsYSByZXBvcnQgMzc5NTguCisKKyogQ29weSB0YXNrIHdvdWxkIGZhaWwgb24gbG9ja2VkIChvciBvdGhlcndpc2UgdW5jb3B5YWJsZSkgZmlsZXMgZXZlbiBpZgorICBmYWlsb25lcnJvciBzZXQgdG8gZmFsc2UuIEJ1Z3ppbGxhIHJlcG9ydCAzODE3NS4KKworKiA8anVuaXQ+IHRhc2sgZGlkIG5vdCBwcmludCBhbGwgdGhlIFRlc3QgbmFtZXMgd2hlbiB1c2luZyBmb3JrbW9kZT0nb25jZScuCisgIEJ1Z3ppbGxhIHJlcG9ydCAzNzQyNi4KKworKiA8YXZhaWxhYmxlPiBjb3VsZCBsZWFrIHJlc291cmNlcywgQnVnemlsbGEgUmVwb3J0IDM4MjYwLgorCisqIFJlZGlyZWN0b3IgY2FsbGVkIFRocmVhZC5zbGVlcCBpbiBhIHN5bmNocm9uaXplZCBibG9jay4gQnVnemlsbGEKKyAgcmVwb3J0IDM3NzY3LgorCisqIENDVW5sb2NrJ3Mgb2Jqc2VsZWN0IGF0dHJpYnV0ZSBjb3VsZCBleGhpYml0IHVucHJlZGljdGFibGUgYmVoYXZpb3I7CisgIHN0YW5kYXJkaXplZCBpbXByb3Blcmx5IGluY2x1ZGVkIG9ianNlbGVjdCBhbmQgb2Jqc2VsIHByb3BlcnR5IGFjY2Vzc29ycyB0bworICBkZWxlZ2F0ZSB0byB0aGUgaW5oZXJpdGVkIG9ialNlbGVjdCBwcm9wZXJ0eSBhY2Nlc3Nvci4gQnVnemlsbGEgcmVwb3J0IDM3NzY2LgorCisqIDx1bnppcD4gYW5kIDx1bnRhcj4gbm93IGNvcnJlY3RseSBtZXJnZSBtdWx0aXBsZSBuZXN0ZWQgcGF0dGVybnNldHMuCisgIEJ1Z3ppbGxhIFJlcG9ydCAzODk3My4KKworKiBPbiBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW1zLCBhIDxtb3ZlPiB0byBjaGFuZ2UgZmlsZW5hbWUgY2FzZQorICBlcnJvbmVvdXNseSBkZWxldGVkIHRoZSAiZGVzdGluYXRpb24iIGZpbGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVuYW1lCisgIHRoZSBzb3VyY2UgZmlsZS4gIEJ1Z3ppbGxhIDM3NzAxLgorCisqIDxzY3A+IGNhbiBub3cgaGFuZGxlIHVyaXMgd2l0aCBAcyBvdGhlciB0aGFuIHRoZSBmaW5hbCBvbmUgZGVub3RpbmcgdGhlCisgIGRvbWFpbi4gIEJ1Z3ppbGxhIDM4MDgyLgorCisqIElmIHRoZSBjbGFzcyBpbnZva2VkIGJ5IHRoZSA8amF2YT4gdGFzayB0aHJldyBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCisgIHRoaXMgd2FzIG1pc2ludGVycHJldGVkIGFzIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXRzZWxmIG5vdCBiZWluZyBmb3VuZC4KKworKiA8ZWNob3Byb3BlcnRpZXM+IHNldFByZWZpeCBqYXZhZG9jIGNsYWltZWQgbnVsbCBvciBlbXB0eSBwcmVmaXggd291bGQgYmUKKyAgaWdub3JlZDsgaW5zdGVhZCBhbiBlcnJvciB3YXMgdGhyb3duLiAgQnVnemlsbGEgcmVwb3J0IDM5OTU0LgorCisqIDxnZXQ+IHdvdWxkIGZldGNoIGZpbGVzIHRoYXQgd2VyZSB1cCB0byBkYXRlLCBiZWNhdXNlIGl0IHVzZWQgPiBpbiBhCisgIHJlbW90ZS9sb2NhbCB0aW1lc3RhbXAgY29tcGFyaXNvbiwgbm90ID49LiBCdWd6aWxsYSAzNTYwNy4KKworKiA8eHNsdD4gcGFzc2VzIHRoZSBjdXJyZW50IGZpbGUgKG5hbWUgKyBkaXJlY3RvcnkpIHRvIHRoZQorICBzdHlsZXNoZWV0L3RyYW5zZm9ybWF0aW9uLiAgeHNsLXBhcmFtZXRlciBuYW1lIGlzIGNvbmZpZ3VyYWJsZS4KKyAgQnVnemlsbGEgcmVwb3J0IDIxMDQyLgorCisqIFRoZSA8emlwPiBBUEkgYWxsb3dlZCBjcmVhdGlvbiBvZiBkaXJlY3RvcmllcyBpbiBmaWxlLW9ubHkgYXJjaGl2ZXM7IGEKKyAgaGFiaXR1YWwgb2ZmZW5kZXIgd2FzIHRoZSBzdWJjbGFzc2VkIDxqYXI+LCB3aGljaCBpbmNsdWRlZCBNRVRBLUlORi8gaW4KKyAgdGhlIGRlc3RpbmF0aW9uIGZpbGUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGZpbGVzb25seSB3YXMgc2V0IHRvIHRydWUuCisKKyogPHJtaWM+IGhhcyBhIG5ldyBhZGFwdGVyLCB4bmV3LCB0byB1c2UgdGhlIC1YTmV3IGJhY2sgZW5kIG9uIGphdmExLjUrLgorICBCeSBmb3JraW5nIHJtaWMsIHRoaXMgd29ya3Mgb24gamF2YTEuNisuIEJ1Z3ppbGxhIHJlcG9ydCAzODczMi4KKworKiBDb3B5IG9mIFVua25vd25FbGVtZW50IGluIG1hY3JvaW5zdGFuY2Ugd2FzIG5vdCByZWN1cnNpdmUuCisgIEJ1Z3ppbGxhIHJlcG9ydCA0MDIzOC4KKworKiBNaXhpbmcgb2YgYWRkIGFuZCBhZGRDb25maWd1cmVkIG1ldGhvZHMgaW4gTWFwcGVyL0NoYWluZWRNYXBwZXIKKyAgY2F1c2VzIGluY29ycmVjdCBjaGFpbmluZy4gQnVnemlsbGEgcmVwb3J0IDQwMjI4LgorCitPdGhlciBjaGFuZ2VzOgorLS0tLS0tLS0tLS0tLS0KKworKiBXYXJuIHVzZXIgd2hlbiBhIHJlZmVyZW5jZSBpbiB0aGUgZm9ybSAiJHtyZWZpZH0iIGNhbm5vdCBiZSByZXNvbHZlZCBhcyB0aGlzCisgIGlzIGEgc2lnbiB0aGV5IHByb2JhYmx5IG1lYW50ICJyZWZpZCIgKG1pc3VzZSBvZiBwcm9wZXJ0eSBleHBhbnNpb24gc3ludGF4KS4KKworKiBBZGQgZHRkIHRvIGphdmFkb2MgZm9yIGp1bml0LgorICBCdWd6aWxsYSA0MDc1NC4KKworKiBBZGQgcXVpZXQgYXR0cmlidXRlIHRvIGxvYWRmaWxlL3Jlc291cmNlLgorICBCdWd6aWxsYSAzODI0OS4KKworKiBNYWtlIExvY2F0b3IjZnJvbVVSSSBhbHNvIGFwcGVuZCB0aGUgZHJpdmUgbGV0dGVyIHdoZW4gcnVubmluZyB1bmRlciBXaW5kb3dzCisgIHdpdGggSkRLIDEuMyBvciAxLjIuCisKKyogRG8gbm90IHVwcGVyY2FzZSB0aGUgZHJpdmUgbGV0dGVycyBzeXN0ZW1hdGljYWxseSBpbiBGaWxlVXRpbHMjbm9ybWFsaXplLgorCisqIEphdmEgNSBlbnVtZXJhdGlvbnMgbWF5IG5vdyBiZSB1c2VkIGFzIHZhbHVlcyBpbiBYTUwgYXR0cmlidXRlcyBpbiBwbGFjZSBvZgorICBFbnVtZXJhdGVkQXR0cmlidXRlLiBCdWd6aWxsYSA0MTA1OC4KKworKiBDcmVhdGUgYSBwb20gZmlsZSBmb3IgYW50LXRlc3R1dGlsIGFuZCBhZGQgYW50LXRlc3R1dGlsLmphciB0byB0aGUgYW50CisgIGRpc3RyaWJ1dGlvbi4gQnVnemlsbGEgNDA5ODAuCisKKyogUm9sbCBiYWNrIGF1dG9tYXRpYyBwcm94eSBlbmFibGluZyBvbiBKYXZhIDEuNS4gSXQgYnJva2UgdGhpbmdzIGxpa2UKKyAgT3JhY2xlIEpEQkMgZHJpdmVycywgYW5kIEFudCBpdHNlbGYgb24gSUJNJ3MgSlZNIG9uIEFJWCwgYW5kIGRpZG50CisgIHNlZW0gdG8gd29yayB0byB3ZWxsIHRoZSByZXN0IG9mIHRoZSB0aW1lLgorICBUbyBlbmFibGUgdGhlIGZlYXR1cmUsIHVzZSB0aGUgLWF1dG9wcm94eSBjb21tYW5kIGxpbmUgb3B0aW9uLgorCisqIFVwZ3JhZGVkIFhNTCBBUEkgYW5kIHBhcnNlciB0byBYZXJjZXMgMi44LjEKKworKiBBIGNvZGUgcmV2aWV3IG9mIHNvbWUgdGhyZWFkZWQgbG9naWMgaGFzIHRpZ2h0ZW5lZCB1cCB0aGUgc3luY2hyb25pemF0aW9uCisgIG9mIFdhdGNoZG9nLCBFeGVjdXRlV2F0Y2hkb2cgYW5kIEV4ZWN1dGVKYXZhLCB3aGljaCBjb3VsZCByZWR1Y2UgdGhlIG9jY3VyZW5jZQorICBvZiByYWNlIGNvbmRpdGlvbnMgaGVyZSwgZXNwZWNpYWxseSBvbiBKYXZhMS41Ky4KKworKiBBbGxvdyBicm9rZW4gcmVmZXJlbmNlIGJ1aWxkIGZpbGVzLiBUaGUgZGVmZXIgcmVmZXJlbmNlIHByb2Nlc3Npbmcgd291bGQKKyAgYnJlYWsgdG9vIG1hbnkgZmlsZXMgLSBzbyBhbGxvdyB0aGVtIHdpdGggYSB3YXJuaW5nLgorCisqIFJlbW92ZWQgZGVwZW5kZW5jeSBvbiBzdW4ubWlzYy5VVUVuY29kZXIgZm9yIFVVTWFpbGVyLgorCisqIEFkZGVkIHJlZ2V4IGF0dHJpYnV0ZSB0byB0aGUgZWNob3Byb3BlcnRpZXMgdGFzay4KKyAgQnVnemlsbGEgNDAwMTkuCisKKyogPHdhcj4gdGFzayBub3cgYWxsb3dzIHlvdSB0byBvbWl0IHRoZSB3ZWIueG1sIGZpbGUuIGFzIHRoaXMgaXMgb3B0aW9uYWwKKyAgaW4gdGhlIHNlcnZsZXQgMi41IGFuZCBKYXZhIEVFIDUgQVBJcy4gc2V0IG5lZWR4bWxmaWxlPSJmYWxzZSIgdG8KKyAgYXZvaWQgYSBtaXNzaW5nIHdlYi54bWwgZmlsZSBmcm9tIGhhbHRpbmcgdGhlIGJ1aWxkLgorCisqIERpYWdub3N0aWNzIGNhdGNoZXMgYW5kIGxvZ3Mgc2VjdXJpdHkgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBzeXN0ZW0gcHJvcGVydGllcy4KKworKiA8amF2YWRvYz4gdXNlZXh0ZXJuYWxmaWxlIG5vdyBhcHBsaWVzIHRvIGFsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgIG9mIGphdmFkb2MuIEJ1Z3ppbGxhIHJlcG9ydCA0MDg1Mi4KKworKiBqYXZhZG9jL3RhZ0BkZXNjcmlwdGlvbiBpcyBub3cgc2V0IHRvIHRoZSBuYW1lIGlmIGRlc2NyaXB0aW9uIGlzCisgIG5vdCBzcGVjaWZpZWQuIEJ1Z3ppbGwgcmVwb3J0IDMyOTI3LgorCisqIFNvbWUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLCBpbmNsdWRpbmcgQnVnemlsbGEgcmVwb3J0IDI1Nzc4LgorCisqIEFkZCA8bWF0Y2hlcz4gY29uZGl0aW9uLiBCdWd6aWxsYSByZXBvcnQgMjg4ODMuCisKKyogRXh0ZW5kaW5nIEpBUi1UYXNrIGZvciBTUEkuIEJ1Z3ppbGxhIHJlcG9ydCAzMTUyMC4KKworKiBBZGRlZCA8dG9rZW5zPiByZXNvdXJjZSBjb2xsZWN0aW9uIGZvciBjb252ZW5pZW50IGNyZWF0aW9uIG9mIHN0cmluZworICByZXNvdXJjZXMgZnJvbSBvdGhlciByZXNvdXJjZXMnIGNvbnRlbnQuIEluc3BpcmVkIGJ5IEJ1Z3ppbGxhIDQwNTA0LgorCisqIEFkZGVkIDxjb21wYXJlPiByZXNvdXJjZSBzZWxlY3RvciB0byBzZWxlY3QgcmVzb3VyY2VzIGJhc2VkIG9uIHRoZQorICByZXN1bHRzIG9mIHRoZWlyIGNvbXBhcmlzb24gdG8gb3RoZXIgcmVzb3VyY2VzLgorCisqIEFkZGVkIG91dHB1dHRvZm9ybWF0dGVycyBhdHRyaWJ1dGUgdG8gPGp1bml0PiB0byBhbGxvdyBzdXBwcmVzc2lvbgorICBvZiBub2lzZXkgdGVzdHMuIEJ1Z3ppbGxhIHJlcG9ydCAxMjgxNy4KKworKiBMb2cgbGV2ZWwgb2YgbWVzc2FnZSAnT3ZlcnJpZGluZyBwcmV2aW91cyBkZWZpbml0aW9uIG9mIHJlZmVyZW5jZSB0bycKKyAgc2V0IHRvIFZlcmJvc2UuIEJ1Z3ppbGxhIHJlcG9ydCAxNzI0MC4KKworKiBBZGRlZCBzZXRiZWFucyBhdHRyaWJ1dGUgdG8gPHNjcmlwdD4gdG8gYWxsb3cgPHNjcmlwdD4ncyB0byBiZQorICBydW4gd2l0aG91dCByZWZlcmVuY2luZyBhbGwgcmVmZXJlbmNlcy4KKyAgQnVnemlsbGEgcmVwb3J0IDM3Njg4LgorCisqIEFkZGVkIGNsYXNzcGF0aCBhdHRyaWJ1dGUgYW5kIG5lc3RlZCBlbGVtZW50IHRvIDxzY3JpcHQ+IHRvIGFsbG93CisgIHRoZSBsYW5ndWFnZSBqYXJzIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgc2NyaXB0LgorICBCdWd6aWxsYSByZXBvcnQgMjk2NzYuCisKKyogVHJpbSB0aGUgZHJpdmVyIGF0dHJpYnV0ZSBvbiB0aGUgPHNxbD4gdGFzay4gQnVnemlsbGEgcmVwb3J0IDIxMjI4LgorCisqIEFsbG93IChqYXIpIGZpbGVzIGFzIHdlbGwgYXMgZGlyZWN0b3JpZXMgdG8gYmUgZ2l2ZW4gdG8gamRlcGVuZC4KKyAgQnVnemlsbGEgcmVwb3J0IDI4ODY1LgorCisqIENvbnZlcnQgU3BsYXNoVGFzayB0byB1c2UgTk9UIHN1biBpbnRlcm5hbCBjbGFzc2VzLgorICBCdWd6aWxsYSByZXBvcnQgMzU2MTkuCisKKyogTWFkZSBQYXR0ZXJuU2V0I2hhc1BhdHRlcm5zIHB1YmxpYyB0byBhbGxvdyBjdXN0b20gZmlsZXNldHMgYWNjZXNzLgorICBCdWd6aWxsYSByZXBvcnQgMzY3NzIuCisKKyogQWRkZWQgc2VhcmNocGFyZW50cyBhdHRyaWJ1dGUgdG8gPGF2YWlsYWJsZT4uIEJ1Z3ppbGxhIHJlcG9ydCAzOTU0OS4KKworKiBUYXNrcyB0aGF0IGRvbid0IGV4dGVuZCBBbnQncyBUYXNrIGNsYXNzIHdpbGwgbm93IGdldCB0aGUgYnVpbGQgZmlsZQorICBsb2NhdGlvbiByZWZsZWN0ZWQgaW50byBhIG1ldGhvZCBvZiB0aGUgc2lnbmF0dXJlIHZvaWQgc2V0TG9jYXRpb24oTG9jYXRpb24pCisgIC0gaWYgc3VjaCBhIG1ldGhvZCBleGlzdHMuCisKKyogUmVtb3ZlIG5lZWRsZXNzIHN5bmNocm9uaXphdGlvbiBpbiBEaXJlY3RvcnlTY2FubmVyLgorICBCdWd6aWxsYSByZXBvcnQgNDAyMzcuCisKKyogSW1wcm92ZWQgcmVjdXJzaW9uIGRldGVjdGlvbiBmb3IgbGluZXMgd2l0aCBtdWx0aXBsZSBtYXRjaGVzIG9mIHNhbWUgdG9rZW4KKyAgb24gYSBzaW5nbGUgbGluZS4gIEJ1Z3ppbGxhIHJlcG9ydCAzODQ1Ni4KKworKiBUYXNrIHdpbGwgbm93IGxvZyBjb3JyZWN0bHkgZXZlbiBpZiBubyBwcm9qZWN0IGlzIHNldC4KKyAgQnVnemlsbGEgcmVwb3J0IDM4NDU4LgorCisqIFVzZSBhbHRlcm5hdGl2ZSBuYW1lcyBmb3IgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW4gamF2YWMuIEJ1Z3ppbGxhCisgIFJlcG9ydCAzNzU0Ni4KKworKiBUaGUgUmVmZXJlbmNlIGNsYXNzIG5vdyBoYXMgYSBwcm9qZWN0IGZpZWxkIHRoYXQgd2lsbCBnZXQKKyAgdXNlZCAoaWYgc2V0KSBpbiBwcmVmZXJlbmNlIHRvIHRoZSBwYXNzZWQgaW4gcHJvamVjdCwgd2hlbgorICBkZXJlZmVyZW5jaW5nIHRoZSByZWZlcmVuY2UuIEJ1Z3ppbGxhIFJlcG9ydCAyNTc3Ny4KKworKiBPbiBET1MgYW5kIE5ldHdhcmUsIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCBhIGRyaXZlIGxldHRlcgorICBhbmQgZm9sbG93ZWQgYnkgYSBjb2xvbiBidXQgd2l0aCBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yIGZvbGxvd2luZworICB0aGUgY29sb24gYXJlIG5vIGxvbmdlciAoaW5jb3JyZWN0bHkpIGFjY2VwdGVkIGFzIGFic29sdXRlIHBhdGhuYW1lcworICBieSBGaWxlVXRpbHMubm9ybWFsaXplKCkgYW5kIEZpbGVVdGlscy5pc0Fic29sdXRlUGF0aCgpLiAgTmV0d2FyZQorICB2b2x1bWVzIGNhbiBzdGlsbCBiZSBzcGVjaWZpZWQgd2l0aG91dCBhbiBpbnRlcnZlbmluZyBzZXBhcmF0b3IuCisgIFVOQyBwYXRobmFtZXMgb24gV2luZG93cyBtdXN0IGluY2x1ZGUgYSBzZXJ2ZXIgYW5kIHNoYXJlIG5hbWUsIGkuZS4KKyAgIlxcYVxiIiB0byBiZSBjb25zaWRlcmVkIHZhbGlkIGFic29sdXRlIHBhdGhzLgorCisqIEEgYnVnIGluIFNRTEV4ZWMgd291bGQgcHJldmVudCB0aGUgZXhlY3V0aW9uIG9mIHRyYWlsaW5nLAorICBub24tc2VtaWNvbG9uLWRlbGltaXRlZCBzdGF0ZW1lbnRzLiAgQnVnemlsbGEgUmVwb3J0IDM3NzY0LgorCisqIElucHV0SGFuZGxlciBpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdyBjYWxsIElucHV0UmVxdWVzdC5nZXREZWZhdWx0VmFsdWUoKQorICBpZiB0aGV5IHdpc2guIFRoZSBkZWZhdWx0IGhhbmRsZXIgdXNlcyB0aGlzIGFsc28uIEJ1Z3ppbGxhIHJlcG9ydCAyODYyMS4KKworKiBUb29rIGluIGJ1Z3ppbGxhIHJlcG9ydCAzOTMyMCwgIlNpbXBsZSBjb2RlIGNsZWFudXBzIgorCisqIEltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIEdOVSBDbGFzc3BhdGggYW5kIGphdmEgdmVyc2lvbnMgcHJpb3IgdG8KKyAgMS41LiBCdWd6aWxsYSAzOTAyNy4KKworKiAke2FudC5jb3JlLmxpYn0gbWF5IG5vdyBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlCisgIEFudCBjbGFzc2VzLCBmb3IgaW5zdGFuY2UgdXNlZnVsIHdoZW4gY29tcGlsaW5nIHRhc2tzLgorCisqIE1pbm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBCdWd6aWxsYSByZXBvcnQgMzc3NzcKKworKiBOZXcgdGFzayA8bWFuaWZlc3RjbGFzc3BhdGg+IGNvbnZlcnRzIGEgcGF0aCBpbnRvIGEgcHJvcGVydHkKKyAgc3VpdGFibGUgYXMgdGhlIHZhbHVlIGZvciBhIG1hbmlmZXN0J3MgQ2xhc3MtUGF0aCBhdHRyaWJ1dGUuCisKKyogRml4ZWQgcmVmZXJlbmNlcyB0byBvYnNvbGV0ZWQgQ1ZTIHdlYiBzaXRlLiBCdWd6aWxsYSBSZXBvcnQgMzY4NTQuCisKKyogTG9nIGZpbmUtZ3JhaW5lZCBldmVudHMgYXQgdmVyYm9zZSBsZXZlbCBmcm9tIEpVbml0LiBCdWd6aWxsYSByZXBvcnQgMzE4ODUuCisKKyogPFdzZGxUb0RvdG5ldD4gYW5kIDxzdHlsZT4gYXJlIG5vdyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIDx3c2RsdG9kb3RuZXQ+IGFuZAorICA8eHNsdD4sIHJlc3BlY3RpdmVseS4gQnVnemlsbGEgcmVwb3J0IDI1ODMyLgorCisqIDxlY2hvcHJvcGVydGllcz4gbm93IChhbHBoYW51bWVyaWNhbGx5KSBzb3J0cyB0aGUgcHJvcGVydHkgbGlzdAorICBiZWZvcmUgZWNob2luZy4gQnVnemlsbGEgcmVwb3J0IDE4OTc2LgorCisqIEEgbmV3IGJhc2UgY2xhc3MgRGlzcGF0Y2hUYXNrIGhhcyBiZWVuIGFkZGVkIHRvIGZhY2lsaXRhdGUgZWxlZ2FudAorICBjcmVhdGlvbiBvZiB0YXNrcyB3aXRoIG11bHRpcGxlIGFjdGlvbnMuCisKKyogTWFqb3IgcmV2aXNpb24gb2YgPHdzZGx0b2RvdG5ldD4uIFN1cHBvcnRzIG1vbm8gd3NkbCBhbmQgdGhlIG1pY3Jvc29mdAorICB3c2RsIHJ1biBvbiBtb25vLCBhcyB3ZWxsIGFzIG1vc3Qgb2YgdGhlIC5ORVQgV1NFMi4wIG9wdGlvbnMuIEV4dHJhCisgIHNjaGVtYXMgKGZpbGVzIG9yIHVybHMpIGNhbiBiZSBuYW1lZCBpbiB0aGUgPHNjaGVtYT4gZWxlbWVudC4KKyAgQ29tcGlsZXJzIGNhbiBiZSBzZWxlY3RlZCB1c2luZyB0aGUgY29tcGlsZXIgYXR0cmlidXRlLCB3aGljaCBkZWZhdWx0cworICB0byAibWljcm9zb2Z0IiBvbiB3aW5kb3dzLCBhbmQgIm1vbm8iIG9uIGV2ZXJ5dGhpbmcgZWxzZS4KKworKiBJdCBpcyBub3cgcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgcGF0dGVybiBjcmVhdGVkL3BhcnNlZCBieSA8Y2hlY2tzdW0+LgorICBCdWd6aWxsYSBSZXBvcnQgMTY1MzkuCisKKyogQWRkZWQgYSBuZXcgImZhaWxhbGwiIHZhbHVlIGZvciB0aGUgb25lcnJvciBhdHRyaWJ1dGUgb2YgPHR5cGVkZWY+LgorICBCdWd6aWxsYSByZXBvcnQgMzE2ODUuCisKKyogdW56aXAvdW53YXIvdW5qYXIvdW50YXIgbm93IHN1cHBvcnRzIGEgbmVzdGVkIG1hcHBlciwgd2hpY2ggbGV0cyB5b3UgdW56aXAKKyAgaW4gdXNlZnVsIHdheXMuCisKKyogSnVuaXQgdGFzayAtLSBkaXNwbGF5IHN1aXRlIGZpcnN0LgorICBCdWd6aWxsYSByZXBvcnQgMzE5NjIuCisKKyogQWRkZWQgaXNTaWduZWQgY29uZGl0aW9uIGFuZCBzaWduZWRzZWxlY3RvciBzZWxlY3RvcgorICBCdWd6aWxsYSByZXBvcnQgMzIxMjYuCisKKyogQWRkZWQgcHJlc2VydmVMYXN0TW9kaWZpZWQgYXR0cmlidXRlIHRvIHNpZ25qYXIgdGFzay4KKyAgQnVnemlsbGEgcmVwb3J0IDMwOTg3LgorCisqIEFkZGVkIDxzY3JpcHRjb25kaXRpb24+IGNvbmRpdGlvbiwgZm9yIGlubGluZSBzY3JpcHRlZCBjb25kaXRpb25zCisKKyogQWRkZWQgPHhvcj4gY29uZGl0aW9uIGZvciBleGNsdXNpdmUtb3IgY29tYmluaW5nIG9mIG5lc3RlZCBjb25kaXRpb25zLgorCisqIEFkZGVkIDxzY3JpcHRzZWxlY3Rvcj4gc2VsZWN0b3IgZm9yIHNjcmlwdGVkIGZpbGUgc2VsZWN0aW9uCisKKyogYW50IC1kaWFnbm9zdGljcyBsaXN0cyBjb250ZW50cyBvZiAke3VzZXIuaG9tZX0vLmFudC9saWIgLCBhbmQKKyAgY2hlY2tzIHRoYXQgdGhlIGphdmEuaW8udG1wZGlyIGRpcmVjdG9yeSBleGlzdHMgYW5kIGlzIHdyaXRlYWJsZS4KKworKiBtYWlsIHRhc2sgYWNjZXB0cyBuZXN0ZWQgaGVhZGVyIGVsZW1lbnQuICBCdWd6aWxsYSByZXBvcnQgMjQ3MTMuCisKKyogemlwL2phci93YXIvZWFyIHN1cHBvcnRzIGxldmVsIGF0dHJpYnV0ZSBmb3IgZGVmbGF0ZSBjb21wcmVzc2lvbiBsZXZlbC4KKyAgQnVnemlsbGEgcmVwb3J0IDI1NTEzLgorCisqIEFkZGVkIGxvZ2lucHV0c3RyaW5nIGF0dHJpYnV0ZSB0byB0aGUgcmVkaXJlY3RvciB0eXBlLgorCisqIFRpZ2h0ZW4gc2VjdXJpdHkgYnkgc2VuZGluZyBzdG9yZXBhc3MgYW5kIGtleXBhc3MgdG8gc2lnbmphcgorICB2aWEgdGhlIGlucHV0IHN0cmVhbSBvZiB0aGUgZm9ya2VkIHByb2Nlc3MuCisKKyogTmV3IHRhc2sgPHNjaGVtYXZhbGlkYXRlPiBleHRlbmRzIDx4bWx2YWxpZGF0ZT4gd2l0aCBleHRyYSBzdXBwb3J0CisgIGZvciBYTUwgU2NoZW1hIChYU0QpIGZpbGVzLgorCisqIDxmaXhjcmxmPiBzdXBwb3J0cyBhIGZpbGUgYXR0cmlidXRlIGZvciBlYXN5IGZpeHVwIG9mIGEgc2luZ2xlIGZpbGUuCisKKyogTmV3IGNvbmRpdGlvbiA8cGFyc2Vyc3VwcG9ydHM+IHdoaWNoIGNhbiBsb29rIGZvciBYTUwgcGFyc2VyIGZlYXR1cmUgb3IKKyAgcHJvcGVydHkgc3VwcG9ydCBpbiB0aGUgcGFyc2VyIEFudCBpcyB1c2luZy4KKworKiBmaXhjcmxmIGNhbiBiZSB1c2VkIGluIGEgZmlsdGVyY2hhaW4uCisKKyogPHN5bmM+IGhhcyBhIG5ldyBuZXN0ZWQgZWxlbWVudCA8cHJlc2VydmVJblRhcmdldD4gdGhhdCBjYW4gYmUgdXNlZAorICB0byBwcm90ZWN0IGV4dHJhLWNvbnRlbnQgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkuICBCdWd6aWxsYSBSZXBvcnQKKyAgMjE4MzIuCisKKyogPHNpZ25qYXI+IG5vdyBzdXBwb3J0czoKKyAgLW5lc3RlZCBmaWxlc2V0cyBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBqYXIgYXR0cmlidXRlCisgIC1hIGRlc3REaXIgYXR0cmlidXRlIHdpdGggdGhlIGFwcHJvcHJpYXRlIGRlcGVuZGVuY3kgbG9naWMsIHdoaWNoCisgICBjYW4gYmUgdXNlZCB3aXRoIHRoZSBqYXIgYXR0cmlidXRlIG9yIG5lc3RlZCBmaWxlc2V0cworICAtYSBtYXBwZXIgdG8gcGVybWl0IGZpbGVuYW1lIHJlbWFwcGluZyBvbiBzaWduaW5nCisgIC10c2F1cmwgYW5kIHRzYWNlcnQgYXR0cmlidXRlcyBmb3IgdGltZXN0YW1wZWQgSkFSIHNpZ25pbmcKKyAgLW5lc3RlZCA8c3lzcHJvcGVydHk+IGVsZW1lbnRzLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgcHJveHkgc2V0dXAKKyAgYW5kIHRoZSBsaWtlCisKKyogVGhlIGxpbmVjb250YWlucyBhbmQgbGluZWNvbnRhaW5zcmVnZXhwIGZpbHRlcnJlYWRlcnMgbm93IHN1cHBvcnQgYQorICBuZWdhdGUgYXR0cmlidXRlIHRvIHNlbGVjdCBsaW5lcyAtbm90LSBjb250YWluaW5nIHNwZWNpZmllZCB0ZXh0LgorICBCdWd6aWxsYSBSZXBvcnQgMzQzNzQuCisKKyogPG9zPiBjb25kaXRpb24gYWRkcyAid2lubnQiIGFzIGEgZmFtaWx5IHdoaWNoIGNhbiBiZSB0ZXN0ZWQuIFRoaXMgaXMKKyAgYWxsIHdpbmRvd3MgcGxhdGZvcm1zIG90aGVyIHRoYW4gdGhlIFdpbjl4IGxpbmUgb3IgV2luZG93cyBDRS4KKworKiA8ZXhlYz4gKGFuZCBoZW5jZSwgPGFwcGx5PiBhbmQgYW55IG90aGVyIGRlcml2ZWQgY2xhc3NlcykgaGF2ZSBhbiBPc0ZhbWlseQorICBhdHRyaWJ1dGUsIHdoaWNoIGNhbiByZXN0cmljdCBleGVjdXRpb24gdG8gYSBzaW5nbGUgT1MgZmFtaWx5LgorCisqIEFkZGVkICJiYWNrdHJhY2UiIGF0dHJpYnV0ZSB0byBtYWNyb2RlZi4gQnVnemlsbGEgcmVwb3J0IDI3MjE5LgorCisqIEFudCBtYWluIHByb3ZpZGVzIHNvbWUgZGlhZ25vc3RpY3MgaWYgaXQgZXZlciBzZWVzIGEgLWNwIG9yIC1saWIgb3B0aW9uLAorICBhcyB0aGlzIGlzIGluZGljYXRpdmUgb2YgYSBzY3JpcHQgbWlzbWF0Y2guIEJ1Z3ppbGxhIHJlcG9ydCAzNDg2MAorCisqIDxqdW5pdHJlcG9ydD4gcHJpbnRzIGEgc3BlY2lhbCBtZXNzYWdlIGlmIHN1cHBsaWVkIGFuIGVtcHR5IFhNTCBGaWxlLiBUaGlzCisgIGNhbiBiZSBjYXVzZWQgYnkgdGhlIHRlc3QgSlZNIGV4aXRpbmcgZHVyaW5nIGEgdGVzdCwgZWl0aGVyIHZpYSBhCisgIFN5c3RlbS5leGl0KCkgY2FsbCBvciBhIEpWTSBjcmFzaC4KKworKiBQcm9qZWN0IG5hbWUgaXMgbm93IHVzZWQgZm9yICphbGwqIHRhcmdldHMgc28gb25lIGNhbiB3cml0ZSBjb25zaXN0ZW50IGltcG9ydAorICBidWlsZCBmaWxlcy4gQnVnemlsbGEgcmVwb3J0IDI4NDQ0LgorCisqIE5ldyBjb25kaXRpb24gPHR5cGVmb3VuZD4gdGhhdCBjYW4gYmUgdXNlZCB0byBwcm9iZSBmb3IgdGhlIGRlY2xhcmF0aW9uCisgIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBhIHRhc2ssIHR5cGUsIHByZXNldCwgbWFjcm8sIHNjcmlwdGRlZiwgd2hhdGV2ZXIuCisgIEFzIGl0IHRlc3RzIGZvciB0aGUgaW1wbGVtZW50YXRpb24sIGl0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGZvciBvcHRpb25hbAorICB0YXNrcyBiZWluZyBhdmFpbGFibGUuCisKKyogQ2hlY2sgZm9yIDEuNS4qIEFudCBtYWluIGNsYXNzLiAod2VibG9naWMuamFyIGluIGNsYXNzcGF0aCByZXBvcnRzKQorCisqIE5ldyBjb25kaXRpb24gPGlzZmFpbHVyZT4gdGhhdCB0ZXN0cyB0aGUgcmV0dXJuLWNvZGUgb2YgYW4gZXhlY3V0YWJsZS4gVGhpcworICBjb250YWlucyBwbGF0Zm9ybS1zcGVjaWZpYyBsb2dpYyBhbmQgaXMgYmV0dGVyIHRoYW4gY29tcGFyaW5nIHRoZSByZXN1bHQgd2l0aAorICAiMCIuCisKKyogQWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciBSZXNvdXJjZSBDb2xsZWN0aW9ucywgaW5jbHVkaW5nIHRoZQorICByZXNvdXJjZWNvdW50IHRhc2suCisKKyogcHJvcGVydHkgYXR0cmlidXRlIG9mIHBhdGhjb252ZXJ0IGlzIG5vdyBvcHRpb25hbC4gSWYgb21pdHRlZCB0aGUKKyAgcmVzdWx0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nLgorCisqIE5ldyBtYXBwZXIsIDxzY3JpcHRtYXBwZXI+LCBzdXBwb3J0cyBzY3JpcHRlZCBtYXBwaW5nIG9mIHNvdXJjZSBmaWxlcy9zdHJpbmdzCisgIHRvIGRlc3RpbmF0aW9uIHN0cmluZ3MuCisKKyogQWRkIHRoZSBlY2hveG1sIHRhc2suIFRoaXMgd2lsbCBlY2hvIG5lc3RlZCBYTUwgdG8gYSBmaWxlLCB3aXRoCisgIHRoZSBub3JtYWwgPD94bWwgPz4gcHJvY2Vzc29yIGluc3RydWN0aW9uLiBVVEYtOCBlbmNvZGluZyBvbmx5OyBuby1uYW1lc3BhY2UKKyAgc3VwcG9ydC4KKworKiBUcnkgdG8gbWFrZSBzdWJwcm9qZWN0cyBvZiBjdXN0b20gUHJvamVjdCBzdWJjbGFzc2VzIGluc3RhbmNlcyBvZiB0aGUKKyAgc2FtZSB0eXBlLiBCdWd6aWxsYSByZXBvcnQgMTc5MDEuCisKKyogPHNzaD4gYW5kIDxzY3A+IHN1cHBvcnQga2V5Ym9hcmQtaW50ZXJhY3RpdmUgYXV0aGVudGljYXRpb24gbm93LgorCisqIDxqYXZhZG9jPiBub3cgc3VwcG9ydHMgLWJyZWFraXRlcmF0b3IgZm9yIGN1c3RvbSBkb2NsZXRzIGlmIEFudCBpcworICBydW5uaW5nIG9uIEpTRSA1LjAgb3IgaGlnaGVyLiAgQnVnemlsbGEgUmVwb3J0OiAzNDU4MC4KKworKiBOZXcgbG9nZ2VyLCBUaW1lc3RhbXBlZExvZ2dlciwgdGhhdCBwcmludHMgdGhlIHdhbGwgdGltZSB0aGF0IGEgYnVpbGQKKyAgZmluaXNoZWQvZmFpbGVkLiBVc2Ugd2l0aAorICAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLlRpbWVzdGFtcGVkTG9nZ2VyCisKKyogPGp1bml0cmVwb3J0PiBub3cgZ2VuZXJhdGVzIHBhZ2VzIGFsbHRlc3RzLWVycm9ycy5odG1sIGFuZAorICBhbGx0ZXN0cy1mYWlscy5odG1sLCB0aGF0IGxpc3Qgb25seSB0aGUgZXJyb3JzIGFuZCBmYWlsdXJlcywgcmVzcGVjdGl2ZWx5LgorICBCdWd6aWxsYSBSZXBvcnQ6IDM2MjI2CisKKyogTmV3IHRhc2sgPG1ha2V1cmw+IHRoYXQgY2FuIHR1cm4gYSBmaWxlIHJlZmVyZW5jZSBpbnRvIGFuIGFic29sdXRlIGZpbGU6Ly8KKyAgdXJsOyBhbmQgbmVzdGVkIGZpbGVzZXRzL3BhdGhzIGludG8gYSAoc3BhY2UsIGNvbW1hLCB3aGF0ZXZlcikgc2VwYXJhdGVkCisgIGxpc3Qgb2YgVVJMcy4gVXNlZnVsIGZvciBSTUkgY2xhc3NwYXRoIHNldHVwLCBhbW9uZ3N0IG90aGVyIHRoaW5ncy4KKworKiA8eHNsdD4gbm93IGFjY2VwdHMgbmVzdGVkIEZpbGVOYW1lTWFwcGVycyBlLmcuIDxnbG9ibWFwcGVyPi4KKyAgQnVnemlsbGEgcmVwb3J0IDM3NjA0LgorCisqIE5ldyB0YXNrIDxsb2FkcmVzb3VyY2U+IHRoYXQgYWNjb21wYW5pZXMgPGxvYWRmaWxlPiBmb3Igbm9uIGZpbGUgcmVzb3VyY2VzLgorCisqIDxlY2hvPiBub3cgc3VwcG9ydHMgYW4gZW5jb2Rpbmcgd2hlbiBzYXZpbmcgdG8gYSBmaWxlLgorCisqIE5ldyBHcmVlZHlJbnB1dEhhbmRsZXIgYWRkZWQuCisKKyogQWRkIHRleHRmaWxlIGF0dHJpYnV0ZSB0byB0aGUgPGZpbGVzbWF0Y2g+IGNvbmRpdGlvbi4gV2hlbiB0cnVlLCB0aGUgdGV4dAorICBjb250ZW50cyBvZiB0aGUgdHdvIGZpbGVzIGFyZSBjb21wYXJlZCwgaWdub3JpbmcgbGluZSBlbmRpbmcgZGlmZmVyZW5jZXMuCisKKyogTmV3IDxyZXNvdXJjZXNtYXRjaD4gY29uZGl0aW9uLgorCisqIEFkZGVkIHRoZSBvbm1pc3NpbmdmaWx0ZXJzZmlsZSBhdHRyaWJ1dGUgdG8gZmlsdGVyc2V0LiBCdWd6aWxsYSByZXBvcnQgMTk4NDUuCisKKyogQWRkZWQgdGhlIGlubGluZSBoYW5kbGVyIGVsZW1lbnQgdG8gdGhlIGlucHV0IHRhc2suCisKKyogPHNxbD4gc3VwcG9ydHMgcHJvcGVydHkgZXhwYW5zaW9uIGlmIHlvdSBzZXQgdGhlIGV4cGFuZFByb3BlcnRpZXMKKyAgYXR0cmlidXRlLiBCeSBkZWZhdWx0IGl0IGRvZXMgbm90IGV4cGFuZCBwcm9wZXJ0aWVzLCBzb21ldGhpbmcgd2UKKyAgZGFyZSBub3QgY2hhbmdlIGZvciBmZWFyIG9mIGJyZWFraW5nIGNvbXBsZXggU1FMIG9wZXJhdGlvbnMgaW4KKyAgZXhpc3RpbmcgZmlsZXMuCisKKyogPGphdmFkb2M+J3MgcGFja2FnZW5hbWVzIGF0dHJpYnV0ZSBpcyBub3cgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIi4KKworKiA8amF2YWM+J3Mgc291cmNlIGFuZCB0YXJnZXQgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIDxqYXZhZG9jPidzIHNvdXJjZQorICBhdHRyaWJ1dGUgd2lsbCByZWFkIGRlZmF1bHQgdmFsdWVzIGZyb20gdGhlIHByb3BlcnRpZXMKKyAgYW50LmJ1aWxkLmphdmFjLnNvdXJjZSBhbmQgYW50LmJ1aWxkLmphdmFjLnRhcmdldC4KKworKiBIYW5kbGluZyBvZiAnICcsICcjJyBpbiBDTEFTU1BBVEggYW5kICcjJyBpbiAtbGliIChjYW5ub3QgdXNlICcgJworICBpbiAtbGliIG9uIFVOSVggYXQgdGhlIG1vbWVudCkuIEJ1Z3ppbGxhIFJlcG9ydCAzOTI5NS4KKworKiA8c2NwPiBub3cgb3B0aW9uYWxseSBzdXBwb3J0cyB0aGUgc2Z0cCBwcm90b2NvbC4gIEJ1Z3ppbGxhIFJlcG9ydCAzOTM3My4KKworKiBSZXNvdXJjZXMgY2FuIG5vdyBiZSB1c2VkIHRvIGluZGljYXRlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3R5bGVzaGVldCB0byB1c2UKKyAgaW4gPHhzbHQ+LiBCdWd6aWxsYSBSZXBvcnQgMzk0MDcuCisKKyogTmV3IDxhbnR2ZXJzaW9uPiBjb25kaXRpb24uIEJ1Z3ppbGxhIHJlcG9ydCAzMjgwNC4KKworKiBSZXBsYWNlVG9rZW5zIHNob3VsZCBhbGxvdyBwcm9wZXJ0aWVzIGZpbGVzLiBCdWd6aWxsYSByZXBvcnQgMzk2ODguCisKKyogRlRQIEFjY291bnQgY291bGQgbm90IGJlIHNwZWNpZmllZCBpbiBhbnQgRlRQIHRhc2suIEJ1Z3ppbGxhIHJlcG9ydCAzOTcyMC4KKworKiBNaW5vciBwZXJmb3JtYW5jZSB1cGRhdGVzLiBCdWd6aWxsYSByZXBvcnQgMzk1NjUuCisKKyogTmV3IGRlbGV0ZW9uZXhpdCBhdHRyaWJ1dGUgZm9yIHRoZSA8dGVtcGZpbGU+IHRhc2suIEJ1Z3ppbGxhIHJlcG9ydCAzOTg0Mi4KKyAgUmVtZW1iZXIgdGhhdCB0aGUgZXhpdCBvZiB0aGUgSlZNIGNhbiBiZSBhIGxvbmcgdGltZSBjb21pbmcsCisgIGVzcGVjaWFsbHkgdW5kZXIgYW4gSURFLiBEb24ndCByZWx5IG9uIHRoaXMgYmVpbmcgY2FsbGVkLgorCisqIDxzY3JpcHRkZWY+LWNyZWF0ZWQgc2NyaXB0cyBoYXZlIHN1cHBvcnQgZm9yIG5lc3RlZCB0ZXh0LiBBbGwgdGV4dAorICBwYXNzZWQgdG8gYSBzY3JpcHRlZCB0YXNrIGNhbiBiZSBhY2Nlc3NlZCB2aWEgc2VsZi50ZXh0LgorCisqIDxmaXhjcmxmPiBub3cgc3VwcG9ydHMgYW4gb3V0cHV0ZW5jb2RpbmcgYXR0cmlidXRlLiAgQnVnemlsbGEgcmVwb3J0IDM5Njk3LgorCisqIDxqdW5pdHJlcG9ydD4gbm93IHN1cHBvcnRzIG5lc3RlZCBYU0wgcGFyYW1ldGVycy4gQnVnemlsbGEgcmVwb3J0IDM5NzA4LgorCisqIDxqYXZhY2M+IGhhcyBhIGpka3ZlcnNpb24gYXR0cmlidXRlIHRvIHBhc3MgdGhlIGRlc2lyZWQgSkRLIHZlcnNpb24KKyAgZG93biB0byBqYXZhY2MuICBCdWd6aWxsYSByZXBvcnQgMzg3MTUuCisKKyogPGN2cz4gcHJpbnRzIHBhc3NmaWxlIGluZm8gYXQgLXZlcmJvc2UgbGV2ZWwgaW5zdGVhZCBvZiAtaW5mby4gQnVnemlsbGEKKyAgcmVwb3J0IDM1MjY4CisKKyogV2hlbiA8amF2YWM+IGNhbid0IGZpbmQgdGhlIGNvbXBpbGVyIGNsYXNzLCBpdCBwcmludHMgb3V0IGphdmEuaG9tZSBmb3IKKyAgaW1tZWRpYXRlIGRpYWdub3N0aWNzCisKKyogQW50IGxhdW5jaGVyIG5vdyBzdXBwb3J0cyBhIC1tYWluIGF0dHJpYnV0ZSBzbyB0aGF0IHlvdSBjYW4gc3BlY2lmeQorICBhbiBleHRlbnNpb24gY2xhc3MgdG8gdGhlIGJ1aWx0IGluIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4KKyAgY2xhc3MuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBBbnRNYWluCisKK0NoYW5nZXMgZnJvbSBBbnQgMS42LjQgdG8gQW50IDEuNi41Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDaGFuZ2VzIHRoYXQgY291bGQgYnJlYWsgb2xkZXIgZW52aXJvbm1lbnRzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRml4ZWQgYnVnczoKKy0tLS0tLS0tLS0tCisKKyogPG1vdmU+IHdhcyB1bmFibGUgdG8gcmVwbGFjZSBleGlzdGluZyBmaWxlcyBvciB3cml0ZSBpbnRvCisgIGV4aXN0aW5nIGRpcmVjdG9yaWVzLiAgQnVnemlsbGEgcmVwb3J0IDM0OTYyLgorCisqIDxtYWNyb2RlZj4gd2l0aCByZWRlZmluZWQgZGVmYXVsdCB2YWx1ZXMgd2FzIGluY29ycmVjdC4gKEZpeCBmb3IKKyAgIDMxMjE1IGhhZCBhIGJ1ZykuIEJ1Z3ppbGxhIHJlcG9ydCAzNTEwOS4KKworKiA8amF2YWRvYz4gd2lsbCBjb252ZXJ0IGJhY2tzbGFzaGVzIHRvIGZvcndhcmRzbGFzaGVzIHdoZW4gZ2VuZXJhdGluZyBmaWxlCisgIGxpc3QgYnkgdXNlZXh0ZXJuYWxmaWxlLiBCdWd6aWxsYSByZXBvcnQgMjc4MTQuCisKK0NoYW5nZXMgZnJvbSBBbnQgMS42LjMgdG8gQW50IDEuNi40Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDaGFuZ2VzIHRoYXQgY291bGQgYnJlYWsgb2xkZXIgZW52aXJvbm1lbnRzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogPGZ0cD4gdGFzayBoYXMgaGFkIGEgbnVtYmVyIG9mIGNoYW5nZXMuICBVcHRvZGF0ZSBjYWxjdWxhdGlvbiBwcmV2aW91c2x5CisgIGRpZCBub3QgY2FsbCBhIGZpbGUgdXB0b2RhdGUgaWYgdGhlIHNvdXJjZSB0aW1lc3RhbXAgYW5kIHRoZSBkZXN0aW5hdGlvbgorICB0aW1lc3RhbXAgd2VyZSBlcXVhbC4gQnVnemlsbGEgcmVwb3J0IDM0OTQxLiAgQW55IHNjcmlwdCB0aGF0IGF0dGVtcHRlZAorICB0byBjb21wZW5zYXRlIGZvciB0aGlzIGJ5IHVzaW5nIHRoZSB0aW1lZGlmZm1pbGxpcyBhdHRyaWJ1dGUgbWlnaHQgbmVlZAorICB0byBiZSB0d2Vha2VkLgorCisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisqIFN1biBqYXZhaCBmYWlsZWQgd2l0aCBqYXZhLmxhbmcuTm9DbGFzc0RlZkZvdW5kRXJyb3IuCisgIEJ1Z3ppbGxhIHJlcG9ydCAzNDY4MS4KKworKiBEaXJlY3RvcnlTY2FubmVyLnNsb3dTY2FuKCkgd2FzIGJyb2tlbi4gQnVnemlsbGEgcmVwb3J0IDM0NzIyLgorCisqIERpcmVjdG9yeVNjYW5uZXIuc2NhbigpIGNvdWxkIHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gb24KKyAgY2FzZS1pbnNlbnNpdGl2ZSBmaWxlc3lzdGVtcyAocmVhZCBXaW5kb3dzIG9yIE1hY09TIFgpLgorCisqIEdldCB3L2F1dGhlbnRpY2F0aW9uIGZhaWxlZCB3aXRoIEFycmF5T3V0T2ZCb3VuZHNFeGNlcHRpb25zLgorICBCdWd6aWxsYSByZXBvcnQgMzQ3MzQuCisKKyogR3JhbnVsYXJpdHkgYXR0cmlidXRlIGZvciA8c3luYz4gdGFzayB3YXMgdW5kb2N1bWVudGVkLgorICBCdWd6aWxsYSByZXBvcnQgMzQ4NzEuCisKKyogPHVuemlwPiBhbmQgPHVudGFyPiBjb3VsZCBsZWF2ZSBmaWxlIGhhbmRsZXMgb3BlbiBvbiBpbnZhbGlkCisgIGFyY2hpdmVzLiAgQnVnemlsbGEgcmVwb3J0IDM0ODkzLgorCisqIHByb3BlcnR5c2V0IHRocmV3IE5QRSB3aXRoIG5lc3RlZCwgbWFwcGVkIHByb3BlcnR5c2V0cy4KKworT3RoZXIgY2hhbmdlczoKKy0tLS0tLS0tLS0tLS0tCisKKyogQW50WE1MQ29udGV4dC5zZXRDdXJyZW50VGFyZ2V0cygpIGlzIG5vdyBwdWJsaWMuIEJ1Z3ppbGxhIHJlcG9ydCAzNDY4MC4KKworQ2hhbmdlcyBmcm9tIEFudCAxLjYuMiB0byBBbnQgMS42LjMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFRoZSBzdWJhbnQgdGFzayB1c2VkIHRoZSBjYW5vbmljYWwgdmVyc2lvbiBvZiBhIGZpbGUgcGF0aC4gVGhpcworICBoYXMgYmVlbiBjaGFuZ2VkIHRvIHVzZSB0aGUgYWJzb2x1dGUgcGF0aC4gQnVnemlsbGEgMzA0MzguCisKKyogVGFyIG5vdyB3cml0ZXMgdHdvIEVPRiBibG9ja3MgcmF0aGVyIHRoYW4gb25lLgorICBCdWd6aWxsYSByZXBvcnQgMjg3NzYKKworKiBUaGUgUmVmZXJlbmNlIG9iamVjdCBub3cgaGFzIGEgcHJvamVjdCBmaWVsZCB3aGljaCBpdCB1c2VzIGluIHByZWZlcmVuY2UKKyAgdG8gdGhlIHByb2plY3QgcGFzc2VkIGluLiBUaGlzIGFsbG93cyBjb21wb3NpdGUgcmVmZXJlbmNlcyB0byBiZQorICBoYW5kbGVkIHRvIG5lc3RlZCBwcm9qZWN0cy4KKyAgQnVnemlsbGEgcmVwb3J0IDI1Nzc3CisKKyogPGp1bml0PiB3aXRoIGZpbHRlcnRyYWNlPSJ0cnVlIiB3aWxsIG5vdyBhbHNvIHN3YWxsb3cgbGluZXMgZm9yIHRoZQorICBzdW4ucmVmbGVjdCBwYWNrYWdlLiAgSWYgeW91IG5lZWQgdG8gc2VlIHRoZW0gaW4geW91ciBzdGFjayB0cmFjZSwKKyAgeW91IG11c3Qgc2V0IGZpbHRlcnRyYWNlIHRvIGZhbHNlLgorICBCdWd6aWxsYSBSZXBvcnQgMjI3NTgKKworKiBUaGUgamlrZXMgY29tcGlsZXIgYWRhcHRlciBub3cgc3VwcG9ydHMgLWJvb3RjbGFzc3BhdGgsIC1leHRkaXJzIGFuZAorICAtc291cmNlcGF0aCBhbmQgYWxzbyB1c2VzIHRoZSBzYW1lIGxvZ2ljIGZvciBkZWJ1ZyBmbGFncyBhcyBqYXZhYy4KKyAgVGhpcyBtZWFucywgdGhlIGppa2VzIGNvbXBpbGVyIGFkYXB0ZXIgbm93IHJlcXVpcmVzIEppa2VzIDEuMTUgb3IgbGF0ZXIuCisgIEJ1Z3ppbGxhIFJlcG9ydHMgMjU4NjgsIDI2NDA0IGFuZCAzMjYwOS4KKworKiBUaGUgZ2NqIGNvbXBpbGVyIGFkYXB0ZXIgdXNlZCB0byBpbmNsdWRlIHRoZSBKYXZhIHJ1bnRpbWUgY2xhc3NlcworICBldmVuIGlmIGluY2x1ZGVKYXZhUnVudGltZSB3YXMgc2V0IHRvIGZhbHNlLCB1bmxlc3MgdGhlCisgIGJvb3RjbGFzc3BhdGggaGFzIGJlZW4gc3BlY2lmaWVkIGFzIHdlbGwuICBJdCB3aWxsIG5vdyBhbHdheXMgYWRoZXJlCisgIHRvIGluY2x1ZGVKYXZhUnVudGltZSwgeW91IG1heSBuZWVkIHRvIHNldCBpdCB0byB0cnVlIGV4cGxpY2l0bHkgbm93CisgIGlmIHlvdSByZWxpZWQgb24gdGhlIG9sZCBiZWhhdmlvci4KKworT3RoZXIgY2hhbmdlczoKKy0tLS0tLS0tLS0tLS0tCisKKyogPGphdmFkb2M+IGNhbiBub3cgdGFrZSBhbiBhdHRyaWJ1dGUgJ2V4ZWN1dGFibGUnLiBCdWd6aWxsYSByZXBvcnQgMzA2MDYuCisKKyogTmV3IGF0dHJpYnV0ZSBpZ25vcmVjb250ZW50cyBmb3IgPGRpZmZlcmVudD4gc2VsZWN0b3IKKworKiBKYXZhZG9jIGZpeGVzIGZvciBMb2NhdGlvbiwgUHJvamVjdCwgYW5kIFJ1bnRpbWVDb25maWd1cmFibGUKKyAgQnVnemlsbGEgMzAxNjAuCisKKyogRW5hYmxlIHRvIGNob29zZSB0aGUgcmVnZXhwIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc3lzdGVtIHByb3BlcnR5LgorICBCdWd6aWxsYSBSZXBvcnQgMTUzOTAuCisKKyogRXhwb3NlIG9iamVjdHMgYW5kIG1ldGhvZHMgaW4gSW50cm9zcGVjdGlvbkhlbHBlci4gQnVnemlsbGEgUmVwb3J0IDMwNzk0LgorCisqIEFsbG93IGZpbGUgYXR0cmlidXRlIG9mIDxtb3ZlPiB0byByZW5hbWUgYSBkaXJlY3RvcnkuCisgIEJ1Z3ppbGxhIFJlcG9ydCAyMjg2My4KKworKiBBZGQgeG1sY2F0YWxvZyBuZXN0ZWQgZWxlbWVudCB0byBYbWxQcm9wZXJ0eS4gQnVnemlsbGEgcmVwb3J0IDI3MDUzLgorCisqIE5ldyBhdHRyaWJ1dGUgYWx3YXlzbG9nIGZvciA8cmVkaXJlY3Rvcj4gdHlwZS4KKworKiBBZGRlZCA8dGFyZ2V0PiBuZXN0ZWQgZWxlbWVudHMgdG8gPGFudD4gYW5kIDxhbnRjYWxsPiB0byBhbGxvdworICBzcGVjaWZpY2F0aW9uIG9mIG11bHRpcGxlIHN1Yi1idWlsZCB0YXJnZXRzLCB3aGljaCBhcmUgZXhlY3V0ZWQKKyAgd2l0aCBhIHNpbmdsZSBkZXBlbmRlbmN5IGFuYWx5c2lzLgorCisqIFJlZmFjdG9yZWQgVGFyZ2V0IGludm9jYXRpb24gaW50byBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvcgorICBpbXBsZW1lbnRhdGlvbnMuICBCdWd6aWxsYSBSZXBvcnRzIDIxNDIxLCAyOTI0OC4KKworKiA8cm1pYz4gbm93IGFsc28gc3VwcG9ydHMgS2FmZmUncyBybWljIHZlcnNpb24gc2hpcHBpbmcgd2l0aCBLYWZmZQorICAxLjEuMiBhbmQgYWJvdmUuCisKKyogYWRkZWQgY2FzZXNlbnNpdGl2ZSBhdHRyaWJ1dGUgdG8gPGdsb2JtYXBwZXI+IGFuZCA8cmVnZXhwbWFwcGVyPgorICBCdWd6aWxsYSByZXBvcnQgMTY2ODYKKworKiBhZGRlZCBoYW5kbGVkaXJzZXAgYXR0cmlidXRlIHRvIDxnbG9ibWFwcGVyPiBhbmQgPHJlZ2V4cG1hcHBlcj4KKyAgQnVnemlsbGEgcmVwb3J0IDMyNDg3CisKKyogYWRkZWQgYSBuZXcgbWFwcGVyIDxmaWx0ZXJtYXBwZXI+CisKKyogV2hlbiBhIEJ1aWxkTGlzdGVuZXIgdHJpZWQgdG8gYWNjZXNzIFN5c3RlbS5lcnIgb3IgU3lzdGVtLm91dCwgQW50CisgIHdvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiAtIHRoaXMgaGFzIGJlZW4gY2hhbmdlZC4gIEFudCBub3cKKyAgc2lsZW50bHkgaWdub3JlcyB0aGUgbWVzc2FnZS4gIEJ1aWxkTGlzdGVuZXJzIHN0aWxsIHNob3VsZCBhdm9pZAorICBhY2Nlc3NpbmcgZWl0aGVyIHN0cmVhbS4KKworKiBBZGRlZCBhIGNvbW1lbnQgYXR0cmlidXRlIHRvIHRoZSB6aXAgdGFzay4KKyAgQnVnemlsbGEgcmVwb3J0IDIyNzkzLgorCisqIE92ZXJsb2FkZWQgRmlsZVV0aWxzLmNyZWF0ZU5ld0ZpbGUgd2l0aCBhIGJvb2xlYW4gbWtkaXJzIGF0dHJpYnV0ZQorICB0byBjcmVhdGUgbm9uZXhpc3RlbnQgcGFyZW50IGRpcmVjdG9yaWVzLgorCisqIDxhcHBseT4gaGFzIGEgbmV3ICJmb3JjZSIgYXR0cmlidXRlIHRoYXQsIHdoZW4gdHJ1ZSwgZGlzYWJsZXMKKyAgY2hlY2tpbmcgb2YgdGFyZ2V0IGZpbGVzLgorCisqIE1hZGUgdGhlIGRlc3QgYXR0cmlidXRlIG9mIHRoZSBhcHBseSB0YXNrIG9wdGlvbmFsOyBtYXBwZWQgdGFyZ2V0CisgIGZpbGVuYW1lcyB3aWxsIGJlIGludGVycHJldGVkIGFzIGFic29sdXRlIHBhdGhuYW1lcyB3aGVuIGRlc3QgaXMgb21pdHRlZC4KKworKiBDaGFuZ2VkIGRlZmF1bHQgdGVtcGRpciBmb3IgPGphdmFjPiBmcm9tIHVzZXIuZGlyIHRvIGphdmEuaW8udG1wZGlyLgorCisqIEFkZGVkIHNlYXJjaHBhdGggYXR0cmlidXRlIHRvIDxleGVjPiBmb3Igc2VhcmNoaW5nIHBhdGggdmFyaWFibGUocykKKyAgd2hlbiByZXNvbHZlZXhlY3V0YWJsZSA9IHRydWUuCisKKyogQWRkZWQgcmV2aXNpb24gYW5kIHVzZXJpZCBhdHRyaWJ1dGVzIHRvIDxwdmNzPiBkb2N1bWVudGF0aW9uLgorCisqIEFkZGVkIHN1cHBvcnQgdG8gdGhlIHRvdWNoIHRhc2sgZm9yIGEgbWtkaXJzIGF0dHJpYnV0ZSB0byBjcmVhdGUKKyAgbm9uZXhpc3RlbnQgcGFyZW50IGRpcmVjdG9yaWVzIGJlZm9yZSB0b3VjaGluZyBuZXcgZmlsZXMuCisKKyogQWRkZWQgc3VwcG9ydCB0byB0aGUgdG91Y2ggdGFzayBmb3IgYSBwYXR0ZXJuIGF0dHJpYnV0ZSB0byBhbGxvdworICBhbHRlcm5hdGUgZGF0ZXRpbWUgZm9ybWF0cy4KKworKiBBZGRlZCBzdXBwb3J0IHRvIHRoZSB0b3VjaCB0YXNrIHRvIG1hcCB0b3VjaGVkIGZpbGVzIHVzaW5nIGEgbmVzdGVkCisgIG1hcHBlciBlbGVtZW50LgorCisqIEFkZGVkIHN1cHBvcnQgdG8gdGhlIHRvdWNoIHRhc2sgZm9yIGEgdmVyYm9zZSBhdHRyaWJ1dGUgdG8gc3VwcHJlc3MKKyAgbG9nZ2luZyBvZiBuZXcgZmlsZSBjcmVhdGlvbi4KKworKiBiYWQgbGluayBpbiBkb2NzIHRvIHRoZSBlbmhhbmNlbWVudCBwYWdlIGluIGJ1Z3ppbGxhLgorICBCdWd6aWxsYSByZXBvcnQgMzMyNTIuCisKKyogQWRkZWQgbGVuZ3RoIHRhc2sgdG8gZ2V0IHN0cmluZ3MnIGFuZCBmaWxlcycgbGVuZ3Rocy4KKworKiA8bmF0aXZlMmFzY2lpPiBhbmQgPGphdmFoPiBub3cgYWxzbyBzdXBwb3J0IEthZmZlJ3MgdmVyc2lvbnMuCisKKyogUmVjdXJzaXZlIHRva2VuIGV4cGFuc2lvbiBpbiBhIGZpbHRlcnNldCBjYW4gbm93IGJlIGRpc2FibGVkIGJ5CisgIHNldHRpbmcgaXRzIHJlY3Vyc2UgYXR0cmlidXRlIHRvIGZhbHNlLgorCisqIFBhdGhjb252ZXJ0IG5vIGxvbmdlciByZXF1aXJlcyB0aGF0IG9uZSBvZiAodGFyZ2V0b3N8cGF0aHNlcHxkaXJzZXApCisgIGJlIHNldDsgcGxhdGZvcm0gZGVmYXVsdHMgYXJlIHVzZWQgd2hlbiB0aGlzIGlzIHRoZSBjYXNlLgorCisqIEFkZGVkIHByZXNlcnZlbGFzdG1vZGlmaWVkIGF0dHJpYnV0ZSB0byBmaXhjcmxmIHRhc2suIEJ1Z3ppbGxhIDI1NzcwLgorCisqIEFkZGVkIGlzZmlsZXNlbGVjdGVkIGNvbmRpdGlvbi4KKworKiBBZGRlZCB2ZXJib3NlPSJ0cnVlfGZhbHNlIiBhdHRyaWJ1dGUgdG8gPHN1YmFudD4uIFdoZW4gdmVyYm9zZSBpcyBlbmFibGVkLAorICB0aGUgZGlyZWN0b3J5IG5hbWUgaXMgbG9nZ2VkIG9uIGVudHJ5IGFuZCBleGl0IG9mIHRoZSBzdWItYnVpbGQuCisgIEJ1Z3ppbGxhIDMzNzg3LgorCisqIEFkZGVkIC1ub3VzZXJsaWIgb3B0aW9uIHRvIGFsbG93IHJ1bm5pbmcgYW50IHdpdGhvdXQgYXV0b21hdGljYWxseSBsb2FkaW5nCisgIHVwICR7dXNlci5ob21lfS8ubGliL2FudC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBjb21waWxpbmcgYW50LCBhbmQgYW50bGlicy4KKyAgTW9kaWZpZWQgdGhlIGJ1aWxkLnNoIGFuZCBidWlsZC5iYXQgdG8gdXNlIHRoZSBvcHRpb24uCisKKyogQWRkZWQgLW5vY2xhc3NwYXRoIG9wdGlvbiB0byBhbGxvdyBydW5uaW5nIGFudCBXSVRIT1VUIHVzaW5nIENMQVNTUEFUSCBlbnYKKyAgdmFyaWFibGUuIE1vZGlmaWVkIGFudC5iYXQgdG8gZG8gdGhpcyBzbyB0aGF0ICVDTEFTU1BBVEglIGlzIG5vdCBsb29rZWQgYXQuCisKKyogQWRkIGVsc2UgYXR0cmlidXRlIHRvIHRoZSBjb25kaXRpb24gdGFzaywgd2hpY2ggc3BlY2lmaWVzIGFuCisgIG9wdGlvbmFsIGFsdGVybmF0ZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvIGlmIHRoZSBuZXN0ZWQKKyAgY29uZGl0aW9uIGV2YWx1YXRlcyB0byBmYWxzZS4gQnVnemlsbGEgcmVwb3J0IDMzMDc0LgorCisqIEFudCBnZW5lcmF0ZWQgamFyIGZpbGVzIHNob3VsZCBub3cgYmUgZGV0ZWN0ZWQgYXMgamFyIGZpbGVzIGJ5CisgIFNvbGFyaXMuICBCdWd6aWxsYSBSZXBvcnQgMzI2NDkuCisKKyogPHJleGVjPiB3aXRoIGEgc2luZ2xlIGNvbW1hbmQgc2hvdWxkIG5vdyB3b3JrIHdpdGggdW51c2FsIGxvZ2luCisgIGRpYWxvZ3Mgd2l0aG91dCBzcGVjaWFsIHJlYWQvd3JpdGUgcGFpcnMuICBCdWd6aWxsYSBSZXBvcnQgMjY2MzIuCisKKyogPGNzYz4ncyBleHRyYW9wdGlvbnMgY2FuIG5vdyBjb250YWluIG11bHRpcGxlIGFyZ3VtZW50cy4KKyAgQnVnemlsbGEgUmVwb3J0IDIzNTk5LgorCisqIDxtYWNyb2RlZj4gd2l0aCBkZWZhdWx0IHZhbHVlcyBzZXQgYnkgcHJvcGVydGllcyB3b3VsZCBiZQorICBzZWVuIGFzIG5ldyBkZWZpbml0aW9ucyB3aGVuIGNhbGxlZCB0d2ljZSB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0aWVzLgorICBUaGlzIHdhcyBjb25mdXNpbmcgc28gdGhlIGRlZmluaXRpb25zIGFyZSBub3cgdHJlYXRlZCBhcyBzaW1pbGFyLgorICBCdWd6aWxsYSBSZXBvcnQgMzEyMTUuCisKKyogPGphdmFkb2M+IGhhcyBhIG5ldyBhdHRyaWJ1dGUgImluY2x1ZGVub3NvdXJjZXBhY2thZ2VzIiB0aGF0IGNhbiBiZQorICB1c2VkIHRvIGRvY3VtZW50IHBhY2thZ2VzIHRoYXQgZG9uJ3QgaG9sZCBzb3VyY2UgZmlsZXMgYnV0IGEKKyAgcGFja2FnZS5odG1sIGZpbGUuICBCdWd6aWxsYSBSZXBvcnQgMjUzMzkuCisKKyogPHJwbT4gaGFzIG5ldyBhdHRyaWJ1dGVzIGZhaWxvbmVycm9yIGFuZCBxdWlldC4KKworKiBBZGRlZCB0d28gdHV0b3JpYWxzCisgIC0gYmVnaW5uZXI6IGludHJvZHVjdGlvbiBpbnRvIEFudAorICAtIHRhc2sgZGV2ZWxvcGVyczogdXNpbmcgcGF0aCwgZmlsZXNldCBldGMKKworKiBhIG51bWJlciBvZiBuZXcgYXR0cmlidXRlcyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGhhbmRsZSBub24tc3RhbmRhcmQKKyAgc2VydmVyIGxpc3RpbmcgZm9ybWF0cyBhbmQgdGltZSB6b25lIGRpZmZlcmVuY2VzIGhhdmUgYmVlbiBhZGRlZCBpbgorICB0aGUgPGZ0cD4gdGFzay4KKworCitGaXhlZCBidWdzOgorLS0tLS0tLS0tLS0KKworKiBEbyBub3QgcGFzcyBvbiBUaHJlYWREZWF0aCB3aGVuIGhhbHRpbmcgPGphdmEgZm9yaz0iZmFsc2UiPi4gQnVnemlsbGEKKyAgMzI5NDEuCisKKyogS2lsbGluZyBhIHRocmVhZCBydW5uaW5nIDxqYXZhIGZvcms9InRydWUiPiAoZS5nLiBmcm9tIGFuIElERSkgd291bGQKKyAgbm90IHN0b3AgdGhlIGZvcmtlZCBwcm9jZXNzLiBCdWd6aWxsYSAzMTkyOC4KKworKiBQcm9ncmFtcyBydW4gd2l0aCA8amF2YSBmb3JrPSJ0cnVlIj4gY2FuIG5vdyBhY2NlcHQgc3RhbmRhcmQgaW5wdXQKKyAgZnJvbSB0aGUgQW50IGNvbnNvbGUuICAoUHJvZ3JhbXMgcnVuIHdpdGggPGphdmEgZm9yaz0iZmFsc2UiPiBjb3VsZAorICBhbHJlYWR5IGRvIHNvLikgIEJ1Z3ppbGxhIDI0OTE4LgorCisqIEFic3RyYWN0Q3ZzVGFzayBwcmVtYXR1cmVseSBjbG9zZWQgaXRzIG91dHB1dFN0cmVhbSBhbmQgZXJyb3JTdHJlYW0uCisgIEJ1Z3ppbGxhIDMwMDk3LgorCisqIEltcG9zc2libGUgdG8gdXNlIGltcGxpY2l0IGNsYXNzcGF0aCBmb3IgPHRhc2tkZWY+CisgIHdoZW4gQW50IGNvcmUgbG9hZGVyICE9IEphdmEgYXBwbGljYXRpb24gbG9hZGVyIGFuZAorICBQYXRoLnN5c3RlbUNsYXNzUGF0aCB0YWtlbiBmcm9tICR7amF2YS5jbGFzcy5wYXRofSBCdWd6aWxsYSAzMDE2MS4KKworKiBNYWNyb0luc3RhbmNlIGRpZCBub3QgY2xlYW4gdXAgbmVzdGVkIGVsZW1lbnRzIGNvcnJlY3RseSBpbiB0aGUgZXhlY3V0ZQorICBtZXRob2QsIGNhdXNpbmcgbXVsdGlwbGUgdXNlIG9mIHRoZSBzYW1lIG1hY3JvIGluc3RhbmNlIHdpdGggbmVzdGVkCisgIGVsZW1lbnRzIHRvIGZhaWwuCisKKyogY2hlY2tzdW0gZmlsZWV4dCBwcm9wZXJ0eSBkb2Mgd3JvbmcuIEJ1Z3ppbGxhIDMwNzg3LgorCisqIEZUUCB0YXNrLCBnZXRUaW1lRGlmZiBtZXRob2Qgd2FzIHJldHVybmluZyB3cm9uZyB2YWx1ZS4gQnVnemlsbGEgMzA1OTUuCisKKyogbWFrZSBzdXJlIHRoYXQgWmlwIGFuZCBpdHMgZGVyaXZhdGVzIGNhbGwgdGhlIGNyZWF0ZUVtcHR5WmlwIG1ldGhvZCB3aGVuCisgdGhlcmUgYXJlIG5vIHJlc291cmNlcyB0byB6aXAvamFyLy4uLgorCisqIFppcCB0YXNrIHdhcyBub3QgemlwcGluZyB3aGVuIG9ubHkgZW1wdHkgZGlyZWN0b3JpZXMgd2VyZSBmb3VuZC4KKyAgQnVnemlsbGEgMzAzNjUuCisKKyogSmFyIHRhc2sgd2FzIG5vdCBpbmNsdWRpbmcgbWFuaWZlc3QgZmlsZXMgd2hlbiBkdXBsaWNhdGU9InByZXNlcnZlIiB3YXMKKyAgY2hvc2VuLiBCdWd6aWxsYSAzMjgwMi4KKworKiBhbnQuYmF0IHdhcyBtaXNzaW5nIHJ1bkFudE5vQ2xhc3NwYXRoIGxhYmVsIGZvciBnb3RvLgorICBCdWd6aWxsYSAzNDUxMC4KKworKiBDbGFzc3BhdGggd2FzIHRyZWF0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIC1saWIgb3B0aW9ucy4gQnVnemlsbGEgMjgwNDYuCisKKyogTWFudWFsIHBhZ2UgZm9yIGN2c3ZlcnNpb24gY29udGFpbmVkIGluY29ycmVjdCBhdHRyaWJ1dGVzIGFuZCBkaWQgbm90CisgIHNheSBzaW5jZSAxLjYuMS4gQnVnemlsbGEgMzE0MDguCisKKyogVHlwbyBpbiBkZWZpbml0aW9uIG9mIDxjdnN2ZXJzaW9uPiB0YXNrIGNhdXNpbmcgaXQgbm90IHRvIGJlIGRlZmluZWQuCisgIEJ1Z3ppbGxhIDMxNDAzLgorCisqIEV4ZWN1dGlvbiBvZiB0b3AgbGV2ZWwgdGFza3MgaW4gaW1wb3J0ZWQgZmlsZXMgZ2V0IGRlbGF5ZWQgYnkgdGFyZ2V0cy4KKyAgQnVnemlsbGEgcmVwb3J0IDMxNDg3LgorCisqIEV4ZWNUYXNrIGV4ZWN1dGVzIGNoZWNrQ29uZmlndXJhdGlvbigpIGV2ZW4gdGhvdWdoIG9zIGRvZXMgbm90IG1hdGNoLgorICBCdWd6aWxsYSByZXBvcnQgMzE4MDUuCisKKyogQ29uY2F0IHRhc2sgaW5zdGFuY2UgY291bGQgbm90IGJlIHJ1biB0d2ljZS4KKyAgQnVnemlsbGEgcmVwb3J0IDMxODE0LgorCisqIE5QRSB1c2luZyBYbWxMb2dnZXIgYW5kIGFudGxpYi4KKyAgQnVnemlsbGEgcmVwb3J0IDMxODQwLgorCisqIFByb3BlcnRpZXMucHJvcGVydHlOYW1lcygpIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgLmtleXMoKS4KKyAgQnVnemlsbGEgcmVwb3J0IDI3MjYxLgorCisqIFRhcmdldCBsb2NhdGlvbiBpcyBub3Qgc2V0IGZvciBkZWZhdWx0IHRhcmdldC4KKyAgQnVnemlsbGEgcmVwb3J0IDMyMjY3LgorCisqIEluY29ycmVjdCBjbGFzc2xvYWRlciBwYXJlbnQgaW4ganVuaXR0YXNrIHdoZW4gdXNpbmcgd2l0aAorICBhbnQtanVuaXQuamFyIGFuZCBqdW5pdC5qYXIgbm90IGluIHRoZSBwcm9qZWN0IGNsYXNzbG9hZGVyLiBCdWd6aWxsYQorICByZXBvcnQgMjg0NzQuCisKKyogZ2V0UmVzb3VyY2VzKCkgb24gdGhlIGNsYXNzbG9hZGVyIHJldHVybmVkIGJ5IENsYXNzcGF0aFV0aWxzIHdvdWxkCisgIHNlZSBlYWNoIHJlc291cmNlIHR3aWNlIC0gaWYgdGhlIHJlc291cmNlIGlzIGluIHRoZSBwcm9qZWN0CisgIGNsYXNzcGF0aCBhbmQgaWYgdGhlIGNsYXNzbG9hZGVyIGlzIHJlcXVlc3RlZCB3aXRoIGEgbnVsbCBwYXRoLgorCisqIFhNTFZhbGlkYXRlIHVzZWQgVVJMI2dldEZpbGUgcmF0aGVyIHRoYW4gdGhlIGFudCBtZXRob2QgRmlsZVV0aWxzI2Zyb21VUkkKKyAgQnVnemlsbGEgcmVwb3J0IDMyNTA4CisKKyogZml4ZWQgUmVnZXhwLU1hcHBlciBkb2NzIHdoaWNoIGdhdmUgb3V0ZGF0ZWQgaW5zdHJ1Y3Rpb25zIChvcHRpb25hbC5qYXIpCisgIEJ1Z3ppbGxhIHJlcG9ydCAyODU4NAorCisqIDxzY3A+IHVzaW5nIDxmaWxlc2V0PiBkaWRuJ3Qgd29yayB3aXRoIE9wZW5TU0ggMy45IGFuZCBsYXRlci4KKyAgQnVnemlsbGEgcmVwb3J0IDMxOTM5CisKKyogPHNldHByb3h5PiBmYWlsZWQgdG8gc2V0IHVzZXIvcGFzc3dvcmQgb24gc29tZSBKREtzLgorICBCdWd6aWxsYSByZXBvcnQgMzI2NjcKKworKiB1bnRhciB3b3VsZCBnbyBpbnRvIGluZmluaXRlIGxvb3AgZm9yIHNvbWUgaW52YWxpZCB0YXIgZmlsZXMuCisgIEJ1Z3ppbGxhIHJlcG9ydCAyOTg3NworCisqIGZvcmtlZCA8amF2YWM+IHdvbid0IHBhc3MgLXNvdXJjZSB0byBhIEpESyAxLjEgb3IgMS4yIGphdmFjIGFueW1vcmUuCisgIEJ1Z3ppbGxhIHJlcG9ydCAzMjk0OAorCisqIHByb3BlcnR5c2V0IHJlZmVyZW5jZXMgZGlkIG5vdCBoYW5kbGUgbmVzdGVkIHByb3BlcnR5c2V0IHJlZmVyZW5jZXMuCisKKyogb2F0YS50eXBlcy5EZXNjcmlwdGlvbi5nZXREZXNjcmlwdGlvbihQcm9qZWN0KSB3b3VsZCB0aHJvdyBhCisgIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdGhlICJhbnQudGFyZ2V0cyIgcmVmZXJlbmNlIHdhcyB1bnNldC4KKworKiBXcmFwcGVyIHNjcmlwdHMgZGlkIG5vdCBkZXRlY3QgV0lOTlQgdmFsdWUgb2YgZHluYW1pYyBPUyBlbnZpcm9ubWVudAorICB2YXJpYWJsZSB3aGVuIGxvZ2dlZCBpbnRvIHdvcmtzdGF0aW9ucyB1c2luZyBOb3ZlbGwgYXV0aGVudGljYXRpb24uCisgIEJ1Z3ppbGxhIFJlcG9ydCAzMDM2Ni4KKworKiBEZXBlbmRTY2FubmVyLmdldFJlc291cmNlKCkgYWx3YXlzIHJldHVybmVkIG5vbmV4aXN0ZW50IHJlc291cmNlcywKKyAgZXZlbiB3aGVuIHRoZSByZXNvdXJjZSBhY3R1YWxseSBleGlzdGVkLiAgQnVnemlsbGEgUmVwb3J0IDMwNTU4LgorCisqIDxhcHBseT4gd2FzIGJyb2tlbiB3aXRoIGNsYXNzZmlsZXNldHMuICBCdWd6aWxsYSBSZXBvcnQgMzA1NjcuCisKKyogPGF2YWlsYWJsZT4gcmV0dXJuZWQgZmFsc2UgcG9zaXRpdmVzIHdoZW4gY2hlY2tpbmcgYSBmaWxlCisgIHBhc3NlZCBpbiB3aXRoIHRoZSBjdXJyZW50IGJhc2VkaXIgbGVhZGluZyB0d2ljZToKKyAgZS5nLiAke2Jhc2VkaXJ9JHtmaWxlLnNlcGFyYXRvcn0ke2Jhc2VkaXJ9JHtmaWxlLnNlcGFyYXRvcn1mb28gLgorCisqIFRoZSBmaXJzdCBmaWxlIG9wZW4gdGhhdCB0b29rIHBsYWNlIHdoZW4gdXNpbmcgaW5wdXQgZmlsZXMgd2l0aCB0aGUKKyAgPGV4ZWM+LCA8YXBwbHk+LCBvciA8amF2YT4gdGFza3Mgd2FzIGFsd2F5cyBsb2dnZWQgdG8gU3lzdGVtLm91dAorICBpbnN0ZWFkIG9mIHRvIHRoZSBtYW5hZ2luZyBUYXNrLgorCisqIDx0ZWxuZXQ+IGFuZCA8cmV4ZWM+IHdvdWxkIHRyeSB0byBkaXNjb25uZWN0IGZyb20gc2VydmVycyB0aGV5IG5ldmVyCisgIGNvbm5ldGNlZCB0bywgcG90ZW50aWFsbHkgbGVhZGluZyB0byBleGNlcHRpb25zIGluIGNvbW1vbnMtbmV0LgorICBCdWd6aWxsYSBSZXBvcnQgMzM2MTguCisKKyogPHppcD4gd291bGQgZHJvcCBmaWxlcyBtYXRjaGVkIGJ5IGRlZmF1bHRleGNsdWRlcyBkdXJpbmcgdXBkYXRlcy4KKyAgQnVnemlsbGEgUmVwb3J0IDMzNDEyLgorCisqIDx6aXA+IGNvdWxkbid0IHN0b3JlIGZpbGVzIHdpdGggc2l6ZSBiZXR3ZWVuIDJHQiBhbmQgNEdCICh0aGUKKyAgdXBwZXIgbGltaXQgc2V0IGJ5IHRoZSBaSVAgZm9ybWF0IGl0c2VsZikuICBCdWd6aWxsYSBSZXBvcnQgMzMzMTAuCisKKyogTlBFIHdoZW4gd2hlbiA8cHJlc2V0ZGVmPiB0cmllcyB0byBjb25maWd1cmUgYSB0YXNrIHRoYXQKKyAgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gQnVnemlsbGEgUmVwb3J0IDMzNjg5LgorCisqIDxqYXZhYyBkZWJ1Zz0iZmFsc2UiPiBjcmVhdGVkIGFuIGludmFsaWQgY29tbWFuZCBsaW5lIHdoZW4gcnVubmluZworICB0aGUgU3ltYW50ZWMgSmF2YSBjb21waWxlci4KKworKiBHZXQgd2l0aCB1c2V0aW1lc3RhbXAgZGlkIG5vdCB3b3JrIG9uIEphdmEgMS4yLgorCisqIEdldCB3aXRoIHVzZXRpbWVzdGFtcCBkaWQgbm90IHdvcmsgd2hlbiBsb2NhbCB0aW1lc3RhbXAgcm91Z2hseSA+PSBub3cuCisKKyogVGhlIGZyYW1lZCBKVW5pdCByZXBvcnQgbm93IGhhbmRsZXMgbXVsdGlwbGUgcmVwb3J0cyBmb3IgdGhlIHNhbWUKKyAgdGVzdGNhc2UgcHJvcGVybHkuICBCdWd6aWxsYSBSZXBvcnQgMzI3NDUuCisKKyogPGNhYj4gZGlkbid0IHdvcmsgZm9yIGZpbGVzIHdpdGggc3BhY2VzIGluIHRoZWlyIG5hbWVzIG9uIFdpbmRvd3MuCisgIEJ1Z3ppbGxhIFJlcG9ydCAxNzE4Mi4KKworKiBUaGUgVkFKIHRhc2tzIGNvdWxkIGZhaWwgaWYgdGhlIHByb2plY3QgbmFtZSBjb250YWluZWQgY2hhcmFjdGVycworICB0aGF0IG5lZWQgdG8gZ2V0IFVSTCBlbmNvZGVkLiAgQnVnemlsbGEgUmVwb3J0IDIzMzIyLgorCisqIFRhcklucHV0U3RyZWFtI3JlYWQoKSB3YXNuJ3QgaW1wbGVtZW50ZWQgY29ycmVjdGx5LiAgQnVnemlsbGEgUmVwb3J0CisgIDM0MDk3LgorCisqIDx4c2x0PiBmYWlsZWQgdG8gcHJvY2VzcyBmaWxlLWhpZXJhcmNoaWVzIG9mIG1vcmUgdGhhbiBvbmUgbGV2ZWwgaWYKKyAgc2NhbmluY2x1ZGVkZGlyZWN0b3JpZXMgd2FzIHRydWUuICBCdWd6aWxsYSBSZXBvcnQgMjQ4NjYuCisKKyogZm9ya21vZGU9InBlckJhdGNoIiBvciAib25jZSIgd291bGQgaWdub3JlIGV4dGVuc2lvbiBhdHRyaWJ1dGVzIHRoYXQKKyAgaGFkIGJlZW4gc3BlY2lmaWVkIGZvciA8Zm9ybWF0dGVyPnMuICBCdWd6aWxsYSBSZXBvcnQgMzI5NzMuCisKKyogVGhlIHJlZmlkIGF0dHJpYnV0ZSBvZiB0aGUgSS9PIHJlZGlyZWN0b3Igd2FzIG5vdCBmdW5jdGlvbmFsLgorCitDaGFuZ2VzIGZyb20gQW50IDEuNi4xIHRvIEFudCAxLjYuMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogVGhlIGltcG9ydCB0YXNrIHVzZWQgdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgZmlsZSBwYXRoLiBUaGlzCisgIGhhcyBiZWVuIGNoYW5nZWQgdG8gdXNlIHRoZSBhYnNvbHV0ZSBwYXRoLiBCdWd6aWxsYSAyODUwNS4KKworKiBhbnQteGFsYW4yLmphciBoYXMgYmVlbiByZW1vdmVkIHNpbmNlIHRoZSBvbmx5IGNsYXNzIGNvbnRhaW5lZCBpbiBpdAorICBkaWRuJ3QgZGVwZW5kIG9uIFhhbGFuLUogMiBhdCBhbGwuICBJdHMgc29sZSBkZXBlbmRlbmN5IGhhcyBhbHdheXMKKyAgYmVlbiBUcmFYIGFuZCBzbyBpdCBoYXMgYmVlbiBtZXJnZWQgaW50byBhbnQtdHJheC5qYXIuCisKKyogQWxsIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRhc2tzIGFyZSBub3cgd3JhcHBlZCBpbiBhIGJ1aWxkZXhjZXB0aW9uCisgIGdpdmluZyB0aGUgbG9jYXRpb24gaW4gdGhlIGJ1aWxkZmlsZSBvZiB0aGUgdGFzay4KKworKiBOZXN0ZWQgZWxlbWVudHMgZm9yIG5hbWVzcGFjZWQgdGFza3MgYW5kIHR5cGVzIG1heSBiZWxvbmcgdG8gdGhlCisgIEFudCBkZWZhdWx0IG5hbWVzcGFjZSBhcyB3ZWxsIGFzIHRoZSB0YXNrJ3Mgb3IgdHlwZSdzIG5hbWVzcGFjZS4KKworKiA8anVuaXRyZXBvcnQ+IHdpbGwgdmVyeSBsaWtlbHkgbm8gbG9uZ2VyIHdvcmsgd2l0aCBYYWxhbi1KIDEuCisKKyAgTm90ZSB0aGF0IFhhbGFuLUogMSBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciBhIHZlcnkgbG9uZyB0aW1lIGFuZCB3ZQorICBoaWdobHkgcmVjb21tZW5kIHRoYXQgeW91IHVwZ3JhZGUuCisKKyAgSWYgeW91IHJlYWxseSBuZWVkIHRvIGNvbnRpbnVlIHVzaW5nIFhhbGFuLUogMSwgcGxlYXNlIGNvcHkgdGhlCisgIGp1bml0LWZyYW1lcy14YWxhbjEueHNsIGZyb20gdGhlIGRpc3RyaWJ1dGlvbidzIGV0YyBkaXJlY3RvcnkgYXMKKyAganVuaXQtZnJhbWVzLnhzbCBpbnRvIGEgbmV3IGRpcmVjdG9yeSBhbmQgdXNlIHRoZSB0YXNrJ3Mgc3R5bGVkaXIKKyAgYXR0cmlidXRlIHRvIHBvaW50IHRvLiAgVGhpcyBpcyB0aGUgbGFzdCB2ZXJzaW9uIG9mIHRoZSBYU0xUCisgIHN0eWxlc2hlZXQgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggWGFsYW4tSiAxLgorCitGaXhlZCBidWdzOgorLS0tLS0tLS0tLS0KKworKiBlbGltaW5hdGUgbWVtb3J5IGxlYWsgaW4gQW50Q2xhc3NMb2FkZXIuIEJ1Z3ppbGxhIFJlcG9ydCA4Njg5LgorCisqIHN1YmFudCBoYWx0b25mYWlsdXJlPWZhbHNlIGRpZCBub3QgY2F0Y2ggYWxsIGZhaWx1cmVzLiBCdWd6aWxsYSBSZXBvcnQgMjcwMDcuCisKKyogbWFjcm9kZWYgQEAgZXNjYXBpbmcgd2FzIGJyb2tlbi4gIEJ1Z3ppbGxhIFJlcG9ydCAyNzA2OS4KKworKiBNYWNyb0RlZiBkaWQgbm90IGFsbG93IGF0dHJpYnV0ZXMgbmFtZWQgJ2Rlc2NyaXB0aW9uJy4gQnVnemlsbGEgUmVwb3J0IDI3MTc1LgorCisqIFRocm93IGJ1aWxkIGV4Y2VwdGlvbiBpZiBuYW1lIGF0dHJpYnV0ZSBtaXNzaW5nIGZyb20gcGF0dGVybnNldCNOYW1lRW50cnkuCisgIEJ1Z3ppbGxhIFJlcG9ydCAyNTk4Mi4KKworKiBUaHJvdyBidWlsZCBleGNlcHRpb24gaWYgdGFyZ2V0IHJlcGVhdGVkIGluIGJ1aWxkIGZpbGUsIGJ1dCBhbGxvdyB0YXJnZXRzCisgIHRvIGJlIHJlcGVhdGVkIGluIGltcG9ydGVkIGZpbGVzLgorCisqIDxhcHBseT4gZGlkbid0IGNvbXBhcmUgdGltZXN0YW1wcyBvZiBzb3VyY2UgYW5kIHRhcmdldGZpbGVzIHdoZW4KKyAgdXNpbmcgYSBuZXN0ZWQgPGZpbGVsaXN0Pi4gIEJ1Z3ppbGxhIFJlcG9ydCAyNjk4NS4KKworKiB0YWdkaWZmLnhtbCB3YXMgYnJva2VuIGluIGFudCAxLjYuMS4gQnVnemlsbGEgUmVwb3J0IDI3MDU3LgorCisqIGlmIHRoZSBiYXNlZGlyIGNvbnRhaW5lZCAuLiBvciAuIGRpcnMsIGFuZCB0aGUgYnVpbGQgZmlsZSBuYW1lIGNvbnRhaW5lZAorICAuLiBvciAuLCB0aGUgYmFzZWRpciB3YXMgc2V0IGluY29ycmVjdGx5LiBCdWd6aWxsYSBSZXBvcnQgMjY3NjUuCisKKyogcmVncmVzc2lvbiBmcm9tIGFudCAxLjUsIGV4ZWMgdGFzayBvdXRwdXR0ZWQgdHdvIHJlZHVuZGFudCB0cmFpbGluZyBuZXdsaW5lcy4KKyAgQnVnemlsbGEgUmVwb3J0IDI3NTQ2LgorCisqIE5QRSB3aGVuIHJ1bm5pbmcgY29tbW9ucyBsaXN0ZW5lci4gQnVnemlsbGEgUmVwb3J0IDI3MzczLgorCisqIDxqYXZhPiBzd2FsbG93ZWQgdGhlIHN0YWNrIHRyYWNlIG9mIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZQorICBleGVjdXRlZCBwcm9ncmFtIGlmIHJ1biBpbiB0aGUgc2FtZSBWTS4KKworKiAtcHJvamVjdGhlbHAgc3dhbGxvd2VkIChjb25maWd1cmF0aW9uKSBlcnJvcnMgc2lsZW50bHkuCisgIEJ1Z3ppbGxhIHJlcG9ydCAyNzczMi4KKworKiBmaWx0ZXJzZXQgdXNlZCBieSBmaWx0ZXJ0YXNrIGRvZXNuJ3QgcmVzcGVjdCBsb2dsZXZlbC4gQnVnemlsbGEgUmVwb3J0IDI3NTY4LgorCisqIHdyb25nIGNvbXBhcmUgdXNlZCBpbiBQcm9qZWN0Q29tcG9uZW50IGZvciBsb2dnaW5nLiBCdWd6aWxsYSBSZXBvcnQgMjgwNzAuCisKKyogZmFpbE9uQW55IGF0dHJpYnV0ZSBmb3IgPHBhcmFsbGVsPiB3YXMgYnJva2VuLiBCdWd6aWxsYSBSZXBvcnQgMjgxMjIuCisKKyogSWYgPGphdmFjPiB1c2VzIGdjaiBhbmQgYW55IG9mIHRoZSBuZXN0ZWQgPGNvbXBpbGVyYXJnPnMgaW1wbGllcworICBjb21waWxhdGlvbiB0byBuYXRpdmUgY29kZSAobGlrZSAtbyBvciAtLW1haW4pLCBBbnQgd2lsbCBub3QgcGFzcworICB0aGUgLUMgc3dpdGNoIHRvIGdjai4gIFRoaXMgbWVhbnMgeW91IGNhbiBub3cgY29tcGlsZSB0byBuYXRpdmUgY29kZQorICB3aXRoIGdjaiB3aGljaCBoYXMgYmVlbiBpbXBvc3NpYmxlIGluIEFudCA8IDEuNi4yLgorCisqIDxpbXBvcnQgb3B0aW9uYWw9ImZhbHNlIj4gYW5kIDxpbXBvcnQgb3B0aW9uYWw9InRydWUiPgorICBiZWhhdmVkIGlkZW50aWNhbGx5LgorCisqIDx4c2x0PiBub3cgc2V0cyB0aGUgY29udGV4dCBjbGFzc2xvYWRlciBpZiB5b3UndmUgc3BlY2lmaWVkIGEgbmVzdGVkCisgIDxjbGFzc3BhdGg+LiAgQnVnemlsbGEgUmVwb3J0IDI0ODAyLgorCisqIDx6aXA+IGFuZCBmcmllbmRzIHdvdWxkIGRlbGV0ZSB0aGUgb3JpZ2luYWwgZmlsZSB3aGVuIHRyeWluZyB0byB1cGRhdGUKKyAgYSByZWFkLW9ubHkgYXJjaGl2ZS4gIEJ1Z3ppbGxhIFJlcG9ydCAyODQxOS4KKworKiA8anVuaXQ+IGFuZCA8YXNzZXJ0aW9ucz4gYXJlIHdvcmtpbmcgdG9nZXRoZXIuIEJ1Z3ppbGxhIHJlcG9ydCAyNzIxOAorCisqIEFudENsYXNzTG9hZGVyI2dldFJlc291cmNlIGNvdWxkIHJldHVybiBpbnZhbGlkIFVSTHMuICBCdWd6aWxsYQorICBSZXBvcnQgMjgwNjAuCisKKyogQW50IGZhaWxlZCB0byBsb2NhdGUgdG9vbHMuamFyIGlmIHRoZSBqcmUgZGlyZWN0b3J5IG5hbWUgd2Fzbid0IGFsbAorICBsb3dlcmNhc2UuICBCdWd6aWxsYSBSZXBvcnQgMjU3OTguCisKKyogUmVkaXJlY3RvciBleGhpYml0ZWQgaW5jb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggcmVnYXJkIHRvIHNwbGl0CisgIG91dHB1dC4gIFdoZW4gc2VudCB0byBmaWxlIG9ubHksIGZpbGVzIHdvdWxkIGJlIGNyZWF0ZWQgaW4gYWxsCisgIGNhc2VzOyB3aGVuIHNwbGl0IGZpbGUtcHJvcGVydHksIGZpbGVzIHdlcmUgb25seSBjcmVhdGVkIGlmCisgIHdyaXRlcyB3ZXJlIHBlcmZvcm1lZC4KKworKiBmaXhlZCBjYXNlIGhhbmRsaW5nIG9mIHNjcmlwdGRlZiBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cy4KKworKiBVTkMgcGF0aG5hbWVzIGRpZCBub3Qgd29yayBmb3IgQU5UX0hPTUUgb3IgLWxpYiBsb2NhdGlvbnMgb24gV2luZG93cy4KKyAgQnVnemlsbGEgcmVwb3J0IDI3OTIyLgorCisqIHJlcGxhY2VzdHJpbmcgdG9rZW5maWx0ZXIgb25seSByZXBsYWNlZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZS4KKworKiBBbnRMaWtlVGFza3NBdFRvcExldmVsVGVzdCBmYWlsZWQgb24gY3lnd2luLgorCisqIEkvTy1pbnRlbnNpdmUgcHJvY2Vzc2VzIGh1bmcgd2hlbiBleGVjdXRlZCB2aWEgPGV4ZWMgc3Bhd249InRydWUiPi4KKyAgQnVnemlsbGEgcmVwb3J0cyAyMzg5My8yNjg1Mi4KKworKiBKRGVwZW5kVGFzayBkaWQgbm90IGNsb3NlIGFuIG91dHB1dCBmaWxlLiBCdWd6aWxsYSBSZXBvcnQgMjg1NTcuCisKKyogVXNpbmcgPG1hY3JvZGVmPiBjb3VsZCBicmVhayBYbWxMb2dnZXIuIEJ1Z3ppbGxhIFJlcG9ydCAyODk5My4KKworKiA8Z2Vua2V5PiBubyBsb25nZXIgcmVxdWlyZXMga2V5dG9vbCB0byBiZSBpbiB5b3VyIFBBVEguICBCdWd6aWxsYQorICBSZXBvcnQgMjkzODIuCisKKyogPHN5bWxpbms+IGNvdWxkIGNyZWF0ZSBjeWNsaWMgbGlua3MuICBCdWd6aWxsYSBSZXBvcnQgMjUxODEuCisKKyogPHppcCB3aGVuZW1wdHk9InNraXAiPiBkaWRuJ3Qgd29yayBpbiBhIGNvbW1vbiBzaXR1YXRpb24uICBCdWd6aWxsYQorICBSZXBvcnQgMjI4NjUuCisKKyogPHNjcD4gbm93IHByb3Blcmx5IGhhbmRsZXMgcmVtb3RlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIHNwYWNlcworICBpbiB0aGVpciBuYW1lcy4gIEJ1Z3ppbGxhIFJlcG9ydCAyNjA5Ny4KKworKiA8c2NwPiBub3cgaGFzIChsb2NhbHxyZW1vdGUpdG9maWxlIGF0dHJpYnV0ZXMgdG8gcmVuYW1lIGZpbGVzIG9uIHRoZQorICBmbHkuICBCdWd6aWxsYSBSZXBvcnQgMjY3NTguCisKKyogPHRlbG5ldD4gYW5kIDxyZXhlYz4gZGlkbid0IGNsb3NlIHRoZSBzZXNzaW9uLiAgQnVnemlsbGEgUmVwb3J0IDI1OTM1LgorCisqIDxzdWJhbnQ+IGFuZCBYbWxMb2dnZXIgZGlkbid0IHBsYXkgbmljbGV5IHRvZ2V0aGVyLgorCitPdGhlciBjaGFuZ2VzOgorLS0tLS0tLS0tLS0tLS0KKyogZG9jIGZpeCBjb25jZXJuaW5nIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZ0cCB0YXNrCisgIEJ1Z3ppbGxhIFJlcG9ydCAyOTMzNC4KKworKiA8eG1sdmFsaWRhdGU+IGhhcyBub3cgYSBwcm9wZXJ0eSBuZXN0ZWQgZWxlbWVudCwKKyAgYWxsb3dpbmcgdG8gc2V0IHN0cmluZyBwcm9wZXJ0aWVzIGZvciB0aGUgcGFyc2VyCisgIEJ1Z3ppbGxhIFJlcG9ydCAyMzM5NS4KKworKiBEb2NzIGZpeGVzIGZvciB4bWx2YWxpZGF0ZS5odG1sLCBqYXZhZG9jLmh0bWwsIHN0YXJ0ZWFtLgorICBCdWd6aWxsYSBSZXBvcnRzIDI3MDkyLCAyNzI4NCwgMjc1NTQuCisKKyogPHBhdGhjb252ZXJ0PiBub3cgYWNjZXB0cyBuZXN0ZWQgPG1hcHBlcj5zLiAgQnVnemlsbGEgUmVwb3J0IDI2MzY0LgorCisqIFNoaXBwZWQgWE1MIHBhcnNlciBpcyBub3cgWGVyY2VzLUogMi42LjIuCisKKyogQWRkZWQgbmVzdGVkIGZpbGUgZWxlbWVudCB0byBmaWxlbGlzdC4KKworKiBzcGVsbGluZyBmaXhlcywgb2NjdXJyZWQuIEJ1Z3ppbGxhIFJlcG9ydCAyNzI4Mi4KKworKiBhZGQgdWlkIGFuZCBnaWQgdG8gdGFyZmlsZXNldC4gQnVnemlsbGEgUmVwb3J0IDE5MTIwLgorCisqIDxzY3A+IGhhcyBhIHZlcmJvc2UgYXR0cmlidXRlIHRvIGdldCBzb21lIGZlZWRiYWNrIGR1cmluZyB0aGUKKyAgdHJhbnNmZXIgYW5kIG5ldyBbbG9jYWx8cmVtb3RlXVtGaWxlfFRvZGlyXSBhbHRlcm5hdGl2ZXMgdG8gZmlsZSBhbmQKKyAgdG9kaXIgdGhhdCBleHBsaWNpdGx5IHN0YXRlIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zZmVyLgorCisqIFRoZSBPUy8yIHdyYXBwZXIgc2NyaXB0cyBoYXZlIGJlZW4gYWRhcHRlZCB0byB1c2UgdGhlIG5ldyBsYXVuY2hlci4KKyAgQnVnemlsbGEgUmVwb3J0IDI4MjI2LgorCisqIDxzc2hleGVjPiBub3cgYWxzbyBjYXB0dXJlcyBzdGRlcnIgb3V0cHV0LiAgQnVnemlsbGEgUmVwb3J0IDI4MzQ5LgorCisqIDx4c2x0PiBub3cgc3VwcG9ydHMgYSBuZXN0ZWQgPG1hcHBlcj4uICBCdWd6aWxsYSBSZXBvcnQgMTEyNDkuCisKKyogPHRvdWNoPiBoYXMgZmlsZWxpc3Qgc3VwcG9ydC4KKworKiA8bmljZT4gdGFzayBsZXRzIHlvdSBzZXQgdGhlIHByaW9yaXR5IG9mIHRoZSBjdXJyZW50IHRocmVhZDsgbm9uLWZvcmtpbmcKKyAgPGphdmE+IGNvZGUgd2lsbCBpbmhlcml0IHRoaXMgcHJpb3JpdHkgaW4gdGhlaXIgbWFpbiB0aHJlYWQuCisKKyogTmV3IGF0dHJpYnV0ZSAibmVnYXRlIiBvbiA8cHJvcGVydHlzZXQ+IHRvIGludmVydCBzZWxlY3Rpb24gY3JpdGVyaWEuCisKKyogVGFyZ2V0IG5vdyBzdXBwb3J0cyBhIExvY2F0aW9uIG1lbWJlci4gIEJ1Z3ppbGxhIFJlcG9ydCAyODU5OS4KKworKiBOZXcgInBhdHRlcm4iIGF0dHJpYnV0ZSBmb3IgPGRhdGU+IHNlbGVjdG9yLgorCisqIDxqdW5pdD4gaGFzIGEgbmV3IGZvcmttb2RlIGF0dHJpYnV0ZSB0aGF0IGNvbnRyb2xzIHRoZSBudW1iZXIgb2YKKyAgSmF2YSBWTXMgdGhhdCBnZXQgY3JlYXRlZCB3aGVuIGZvcmtpbmcgdGVzdHMuICBUaGlzIGFsbG93cyB5b3UgdG8KKyAgcnVuIGFsbCB0ZXN0cyBpbiBhIHNpbmdsZSBmb3JrZWQgSlZNIHJlZHVjaW5nIHRoZSBvdmVyaGVhZCBvZiBWTQorICBjcmVhdGlvbiBhIGxvdC4gIEJ1Z3ppbGxhIFJlcG9ydCAyNDY5Ny4KKworKiA8amFyPiBjYW4gbm93IG9wdGlvbmFsbHkgY3JlYXRlIGFuIGluZGV4IGZvciBqYXJzIGRpZmZlcmVudCB0aGFuIHRoZQorICBvbmUgaXQgY3VycmVudGx5IGJ1aWxkcyBhcyB3ZWxsLiAgU2VlIHRoZSBuZXcgPGluZGV4amFycz4gZWxlbWVudAorICBmb3IgZGV0YWlscy4gIEJ1Z3ppbGxhIFJlcG9ydCAxNDI1NS4KKworKiBQZXJtaXQgYnVpbGRpbmcgdW5kZXIgSkRLIDEuNS4gQnVnemlsbGEgUmVwb3J0IDI4OTk2LgorCisqIG1pbm9yIEphdmFkb2MgY2hhbmdlcy4gQnVnemlsbGEgUmVwb3J0IDI4OTk4LgorCisqIE1pc2MuIGNvcnJlY3Rpb25zIGluIFNpZ25KYXIuamF2YS4gQnVnemlsbGEgUmVwb3J0IDI4OTk5LgorCisqIFJlbW92ZSByZWR1bmRhbnQgPGhyPiBmcm9tIGphdmFoLmh0bWwuIEJ1Z3ppbGxhIFJlcG9ydCAyODk5NS4KKworKiBJZ25vcmUgYnVpbHQgZGlzdHJpYnV0aW9ucy4gQnVnemlsbGEgUmVwb3J0IDI4OTk3LgorCisqIEEgbmV3IHJvdW5kdXAgYXR0cmlidXRlIG9uIDx6aXA+IGFuZCByZWxhdGVkIHRhc2sgY2FuIGJlIHVzZWQgdG8KKyAgY29udHJvbCB3aGV0aGVyIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyBpbnNpZGUgdGhlIGFyY2hpdmUgd2lsbAorICBiZSByb3VuZGVkIHVwIG9yIGRvd24gKHNpbmNlIHppcHMgb25seSBzdG9yZSBtb2RpZmljYXRpb24gdGltZXMgd2l0aAorICBhIGdyYW51bGFyaXR5IG9mIHR3byBzZWNvbmRzKS4gIFRoZSBkZWZhdWx0IHJlbWFpbnMgdG8gcm91bmQgdXAuCisgIEJ1Z3ppbGxhIFJlcG9ydCAxNzkzNC4KKworKiBBIGJpbmFyeSBvcHRpb24gaGFzIGJlZW4gYWRkZWQgdG8gPGNvbmNhdD4uIEJ1Z3ppbGxhIFJlcG9ydCAyNjMxMi4KKworKiBBZGRlZCBEeW5hbWljQ29uZmlndXJhdG9yTlMsIGFuIG5hbWVzcGFjZSBhd2FyZSB2ZXJzaW9uIG9mCisgIER5bmFtaWNDb25maWd1cmF0b3IuIEJ1Z3ppbGxhIFJlcG9ydCAyODQzNi4KKworKiBBZGQgaW1wbGljaXQgbmVzdGVkIGVsZW1lbnQgdG8gPG1hY3JvZGVmPi4gQnVnemlsbGEgUmVwb3J0IDI1NjMzLgorCisqIEFkZCBkZWxldGVvbmV4aXQgYXR0cmlidXRlIHRvIDxkZWxldGU+LgorCisqIEFkZGVkIFRhcmdldC5nZXRJZi9Vbmxlc3MoKS4gIEJ1Z3ppbGxhIFJlcG9ydCAyOTMyMC4KKworKiA8ZmFpbD4gaGFzIGEgc3RhdHVzIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhc3MgYW4gZXhpdAorICBzdGF0dXMgYmFjayB0byB0aGUgY29tbWFuZCBsaW5lLgorCisqIDxmYWlsPiBhY2NlcHRzIGEgbmVzdGVkIDxjb25kaXRpb24+LgorCisqIDxsb2FkcHJvcGVydGllcz4gc3VwcG9ydHMgbG9hZGluZyBmcm9tIGEgcmVzb3VyY2UuCisgIEJ1Z3ppbGxhIFJlcG9ydCAyODM0MC4KKworKiBOZXN0ZWQgZmlsZSBtYXBwZXJzIGFuZCBhIGNvbnRhaW5lciBtYXBwZXIgaW1wbGVtZW50YXRpb24gaGF2ZSBiZWVuCisgIGludHJvZHVjZWQuICBBZGRpdGlvbmFsbHksIHRoZSA8bWFwcGVyPiBlbGVtZW50IG5vdyBhY2NlcHRzICJkZWZpbmVkIgorICBuZXN0ZWQgRmlsZU5hbWVNYXBwZXIgaW1wbGVtZW50YXRpb25zIGRpcmVjdGx5LCBhbGxvd2luZyBhIHVzYWdlCisgIGNvbXBhcmFibGUgdG8gdGhvc2Ugb2YgPGNvbmRpdGlvbj4sIDxmaWx0ZXI+LCBhbmQgPHNlbGVjdG9yPi4KKworKiBOZXcgPHJlZGlyZWN0b3I+IHR5cGUgaW50cm9kdWNlZCB0byBwcm92aWRlIGV4dHJlbWUgSS9PIGZsZXhpYmlsaXR5LgorICBJbml0aWFsIHN1cHBvcnQgZm9yIDxleGVjPiwgPGFwcGx5PiwgYW5kIDxqYXZhPiB0YXNrcy4KKworKiA8YXBwbHk+IGhhcyBhIG5ldyBpZ25vcmVtaXNzaW5nIGF0dHJpYnV0ZSAoZGVmYXVsdCB0cnVlIGZvciBCQykKKyAgd2hpY2ggd2lsbCBhbGxvdyBub25leGlzdGVudCBmaWxlcyBzcGVjaWZpZWQgdmlhIDxmaWxlbGlzdD5zIHRvCisgIGJlIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZS4gIEJ1Z3ppbGxhIFJlcG9ydCAyOTU4NS4KKworKiA8anVuaXRyZXBvcnQ+IG5vdyBhbHNvIHdvcmtzIHdpdGggWGFsYW4gWFNMVEMgYW5kL29yIEpESyAxLjUuCisgIEJ1Z3ppbGxhIFJlcG9ydCAyNzU0MS4KKworKiA8anNwYz4gZG9lc24ndCB3b3JrIHByb3Blcmx5IHdpdGggVG9tY2F0IDUueC4gIFdlJ3ZlIGltcGxlbWVudGVkIGEKKyAgd29yay1hcm91bmQgYnV0IGRvbid0IGludGVuZCB0byBzdXBwb3J0IGZ1dHVyZSBjaGFuZ2VzIGluIFRvbWNhdAorICA1LnguICBQbGVhc2UgdXNlIHRoZSBqc3BjIHRhc2sgdGhhdCBzaGlwcyB3aXRoIFRvbWNhdCBpbnN0ZWFkIG9mCisgIEFudCdzLgorCitDaGFuZ2VzIGZyb20gQW50IDEuNi4wIHRvIEFudCAxLjYuMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIExpY2Vuc2UgaXMgbm93IEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMAorICBzZWUgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorCitGaXhlZCBidWdzOgorLS0tLS0tLS0tLS0KKyogUmVtb3ZlIGEgcmVjdXJzaXZlIHRlbXBsYXRlIGNhbGwgaW4gdGhlIGp1bml0IHhzbHMgdGhhdCBjb3VsZCB0cmlnZ2VyIGEgc3RhY2sKKyAgb3ZlcmZsb3cuIEl0IG5vdyB1c2VzIFhhbGFuIGV4dGVuc2lvbnMgdG8gY2FsbCBhIEphdmEgY2xhc3MgZGlyZWN0bHkuCisgIEJ1Z3ppbGxhIFJlcG9ydCAxOTMwMQorCisqIEZpeCBzcHVyaW91cyBpbmZpbml0ZSBsb29wIGRldGVjdGlvbiBmb3IgZmlsdGVycyAoaW50cm9kdWNlZCBpbiBhbnQgMS42LjApLgorICBCdWd6aWxsYSBSZXBvcnQgMjMxNTQuCisKKyogRml4IGhhbmRsaW5nIG9mIGRlZmF1bHQgYW50IG5hbWVzcGFjZSBmb3IgbmVzdGVkIGVsZW1lbnRzLgorCisqIEZpeCBqYm9zcyBlbGVtZW50IG9mIGVqYiB0YXNrIChpbnRyb2R1Y2VkIGluIGFudCAxLjYuMCkuCisKKyogPHdoaWNocmVzb3VyY2U+IGZhaWxlZCB0byBsb2FkIGNsYXNzZXMgY29ycmVjdGx5LgorCisqIEFudCBjb3VsZCBmYWlsIHRvIHN0YXJ0IHdpdGggYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZgorICBBTlRfSE9NRS9saWIvYW50LWxhdW5jaGVyLmphciB3YXMgcGFydCBvZiB0aGUgc3lzdGVtIENMQVNTUEFUSC4KKworKiBwcmVzZXRkZWYnZWQgdHlwZXMgZGlkIG5vdCB3b3JrIHdpdGggdGhlIGFudC10eXBlIGF0dHJpYnV0ZQorCisqIGZpeGVkIGNhc2UgaGFuZGxpbmcgb2YgbWFjcm9kZWYgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMuIEJ1Z3ppbGxhCisgIFJlcG9ydHMgMjU2ODcgYW5kIDI2MjI1LgorCisqIDxqYXZhPiBpZ25vcmVkIHRoZSBhcHBlbmQgYXR0cmlidXRlLCBCdWd6aWxsYSBSZXBvcnQgMjYxMzcuCisKKyogVGhlIGdjaiBjb21waWxlciBhZGFwdGVyIGZvciA8amF2YWM+IGZhaWxlZCBpZiB0aGUgZGVzdGluYXRpb24KKyAgZGlyZWN0b3J5IGRpZG4ndCBleGlzdC4gIEJ1Z3ppbGxhIFJlcG9ydCAyNTg1Ni4KKworKiBBbnQgbm93IGZhaWxzIHdpdGggYSBtb3JlIHVzZWZ1bCBtZXNzYWdlIGlmIGEgbmV3IHByb2Nlc3Mgd2lsbCBiZQorICBmb3JrZWQgaW4gYSBkaXJlY3RvcnkgYW5kIHRoYXQgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QuCisKKyogPHNwbGFzaD4gdXNlZCB0byBicmVhayB0aGUgYnVpbGQgb24gbm9uLUdVSSBlbnZpcm9ubWVudHMuICBCdWd6aWxsYQorICByZXBvcnQgMTE0ODIuCisKKyogQW50IDEuNi4wIGNhbm5vdCBydW4gYnVpbGQgc2NyaXB0cyBpbiBkaXJlY3RvcmllcyB3aXRoIG5vbi1BU0NJSSBuYW1lcy4KKyAgQnVnemlsbGEgUmVwb3J0IDI2NjQyLgorCitPdGhlciBjaGFuZ2VzOgorLS0tLS0tLS0tLS0tLS0KKyogU2hpcHBlZCBYTUwgcGFyc2VyIGlzIG5vdyBYZXJjZXMtSiAyLjYuMQorCisqIFRyYW5zbGF0ZSB0YXNrIGxvZ3MgYSBkZWJ1ZyBtZXNzYWdlIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBmaWxlcworICB0aGF0IGl0IHByb2Nlc3NlZC4gIEJ1Z3ppbGxhIFJlcG9ydCAxMzkzOC4KKworKiA8Zml4Y3JsZj4gaGFzIGEgbmV3IGF0dHJpYnV0ZSAtIGZpeGxhc3QuIEJ1Z3ppbGxhIFJlcG9ydCAyMzI2Mi4KKworKiA8cDRzdWJtaXQ+IGhhcyAyIG5ldyBhdHRyaWJ1dGVzLCBuZWVkc3Jlc29sdmVwcm9wZXJ0eSBhbmQgY2hhbmdlcHJvcGVydHkuCisgIEJ1Z3ppbGxhIFJlcG9ydCAyNTcxMS4KKworKiBhZGQgZGVzY3JpcHRpb24gYXR0cmlidXRlcyB0byBtYWNyb2RlZiBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cy4KKyAgQnVnemlsbGEgUmVwb3J0IDI0NzExLgorCisqIEV4dGVuZGluZyBDbGVhckNhc2UgVGFza3MgOgorIC0gQWRkZWQgYW4gZXh0cmEgb3B0aW9uIHRvICdmYWlsb25lcnInIHRvIGVhY2ggQ2xlYXJDYXNlIHRhc2svY29tbWFuZC4KKyAtIEV4dGVuZGVkIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNjY2hlY2tvdXQuIEl0IGNhbiBjaGVjayAobm90Y28pIHRvIHNlZSBpZgorICB0aGUgZGVzaXJlZCBlbGVtZW50IGlzIGFscmVhZHkgY2hlY2tlZCBvdXQgdG8gdGhlIGN1cnJlbnQgdmlldy4gVGh1cyBpdAorICAgd29uJ3QgYXR0ZW1wdCB0byBjaGVjayBpdCBvdXQgYWdhaW4uCisgLSBBZGRlZCB0aHJlZSBuZXcgQ2xlYXJDYXNlIGNvbW1hbmRzOiBjY21rYXR0ciwgY2Nta2RpciwgY2Nta2VsZW0KKyAgQnVnemlsbGEgUmVwb3J0IDI2MjUzLgorCisqIGFkZGVkIG5lc3RlZCB0ZXh0IHN1cHBvcnQgdG8gPG1hY3JvZGVmPgorCisqIGFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgSmF2YSAxLjUuICBKYXZhIDEuNSBpcyBub3cgY29ycmVjdGx5CisgIGRldGVjdGVkIGJ5IEFudCBhbmQgdHJlYXRlZCBqdXN0IGxpa2UgSmF2YSAxLjQuICBZb3UgY2FuIG5vdyBzcGVjaWZ5CisgIHNvdXJjZT0iMS41IiBpbiB0aGUgPGphdmFjPiB0YXNrLgorCisqIGNyZWF0ZWQgbmV3IHRhc2sgPGN2c3ZlcnNpb24+CisKKyogYWRkZWQgc3VwcG9ydCBmb3IgYnJhbmNoIGxvZ2dpbmcgdmlhIHRoZSB0YWcgYXR0cmlidXRlIGluIDxjdnNjaGFuZ2Vsb2c+CisgIEJ1Z3ppbGxhIFJlcG9ydCAxMzUxMC4KKworKiBhZGRlZCBzdXBwb3J0IHRoZSBncm9vdnkgbGFuZ3VhZ2UgaW4gdGhlIHNjcmlwdCBhbmQgc2NyaXB0ZGVmIHRhc2tzCisKK0NoYW5nZXMgZnJvbSBBbnQgMS41LjQgdG8gQW50IDEuNi4wCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDaGFuZ2VzIHRoYXQgY291bGQgYnJlYWsgb2xkZXIgZW52aXJvbm1lbnRzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBUaGlzIHZlcnNpb24gb2YgQW50IGNhbiBub3QgYmUgYnVpbHQgd2l0aCBKREsgMS4xIGFuZCByZXF1aXJlcyBhdAorICBsZWFzdCBKYXZhIDEuMiBhdCBydW50aW1lIGFzIHdlbGwuICBDb21waWxpbmcgZm9yIGEgMS4xIHRhcmdldCBpcworICBzdGlsbCBzdXBwb3J0ZWQuCisKKyogVGFyZ2V0cyBjYW5ub3QgaGF2ZSB0aGUgZW1wdHkgc3RyaW5nIGFzIHRoZWlyIG5hbWUgYW55IGxvbmdlci4KKworKiBhbnQuamFyJ3MgbWFuaWZlc3QgZG9lcyBubyBsb25nZXIgaW5jbHVkZSBhIENsYXNzLVBhdGggZW50cnksIHNvIGl0CisgIGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBydW4gQW50IHZpYSAiamF2YSAtamFyIGFudC5qYXIiIHdpdGhvdXQKKyAgbWFudWFsbHkgYWx0ZXJpbmcgdGhlIENMQVNTUEFUSC4gIEluc3RlYWQgb2YgdGhhdCBhIGZpbGUKKyAgYW50LWJvb3RzdHJhcC5qYXIgaXMgaW5jbHVkZWQgaW4gdGhlIGV0YyBkaXJlY3Rvcnkgb2YgdGhlIGJpbmFyeQorICBkaXN0cmlidXRpb24sIGNvcHkgdGhpcyB0byB0aGUgbGliIGRpcmVjdG9yeSBhbmQgdXNlCisgICJqYXZhIC1qYXIgYW50LWJvb3RzdHJhcC5qYXIiIGluc3RlYWQgaWYgeW91IHdhbnQgdG8gcnVuIEFudCB3aXRob3V0CisgIHRoZSB3cmFwcGVyIHNjcmlwdCAobm90IHJlY29tbWVuZGVkKS4KKworKiBUaGUgPHNjcmlwdD4gdGFzayBub3cgcmVxdWlyZXMgQXBhY2hlIEJTRiBpbnN0ZWFkIG9mIHRoZSBvbGRlciBJQk0KKyAgdmVyc2lvbi4gIFNlZSA8aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YvPgorCisqIDx4bWxwcm9wZXJ0eT4gd2lsbCBubyBsb25nZXIgZmFpbCBpZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQgZG9lc24ndCBleGlzdC4KKworKiBYTUwgbmFtZXNwYWNlcyBhcmUgbm93IGVuYWJsZWQgaW4gdGhlIFhNTCBwYXJzZXIsIG1lYW5pbmcgWE1MIG5hbWVzcGFjZQorICBkZWNsYXJhdGlvbnMgbm8gbG9uZ2VyIGNhdXNlIGVycm9ycy4gSG93ZXZlciB0YXNrIG5hbWVzIGNvbnRhaW5pbmcgY29sb25zCisgIHdpbGwgY2F1c2UgZXJyb3JzIHVubGVzcyB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHVyaS4KKworKiBUaGUgPGZ0cD4gYW5kIDx0ZWxuZXQ+IHRhc2tzIG5vdyByZXF1aXJlIEpha2FydGEgQ29tbW9ucyBOZXQgaW5zdGVhZAorICBvZiB0aGUgb2xkZXIgT1JPIE5ldGNvbXBvbmVudHMgdmVyc2lvbi4gIFNlZQorICA8aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL25ldC9pbmRleC5odG1sPi4KKworKiA8aW5wdXQ+IHdpbGwgbm8gbG9uZ2VyIHByb21wdCB0aGUgdXNlciBhbmQgd2FpdCBmb3IgaW5wdXQgaWYgdGhlCisgIGFkZHByb3BlcnR5IGF0dHJpYnV0ZSBpcyBzZXQgdG8gYSBwcm9wZXJ0eSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4KKyAgZGVmaW5lZCBpbiB0aGUgcHJvamVjdC4gIElmIHlvdSByZWx5IG9uIHRoZSB0YXNrIHdhaXRpbmcgZm9yIGlucHV0LAorICBkb24ndCB1c2UgdGhlIGFkZHByb3BlcnR5IGF0dHJpYnV0ZS4KKworKiBUaGUgQ2xhc3MtUGF0aCBhdHRyaWJ1dGUgaW4gbWFuaWZlc3RzIHdpbGwgbm8gbG9uZ2VyIG1lcmdlIHRoZQorICBlbnRyaWVzIG9mIGFsbCBtYW5pZmVzdHMgZm91bmQsIGJ1dCB3aWxsIGJlIHRyZWF0ZWQgbGlrZSBhbGwgb3RoZXIKKyAgbWFuaWZlc3QgYXR0cmlidXRlcyAtIHRoZSBtb3N0IHJlY2VudCBhdHRyaWJ1dGUocykgd2lsbCBiZSB1c2VkLgorCisqIE5ldyBMYXVuY2ggbWVjaGFuaXNtIGltcGxlbWVudGVkLiBUaGlzIG1vdmVzIHNvbWUgZnVuY3Rpb25hbGl0eSBmcm9tCisgIHRoZSBiYXRjaCBmaWxlcyAvIHNoZWxsIHNjcmlwdHMgaW50byBKYXZhLiBUaGlzIHJlbW92ZXMgZW52aXJvbm1lbnQKKyAgbGltaXRhdGlvbnMsIGZvciBjb21tYW5kIGlzc3VlcywgZGlyZWN0b3J5IGRlcHRoIGlzc3VlcyBvbiBXaW5kb3dzLiBBbHNvCisgIGFsbG93cyBhIHBlci11c2VyIGxpYnJhcnkgbG9jYXRpb24gdG8gYmUgdXNlZCBpZiB0aGUgbWFpbiBBbnQgaW5zdGFsbAorICBpcyBsb2NrZWQgZG93bi4KKworKiBUaGUgRW50cnkgbmVzdGVkIGVsZW1lbnQgb2YgUHJvcGVydHlGaWxlIHdpbGwgbm90IGFueSBtb3JlIGhhdmUgaXRzIHZhbHVlCisgIGF0dHJpYnV0ZSAoYWN0dWFsbHkgaW5jcmVtZW50KSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGVudHJ5CisgIGFmdGVyIGV4ZWN1dGlvbi4KKworKiBPdXRwdXQgc3RvcmVkIGZyb20gYSA8amF2YT4gb3IgPGV4ZWM+IHRhc2sgaXMgbm93IGV4YWN0bHkgYXMgZ2VuZXJhdGVkLiBObworICBjb252ZXJzaW9uIHRvIHBsYXRmb3JtIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgaXMgcGVyZm9ybWVkLgorCisqIDx0cmFuc2xhdGU+IHdpbGwgbm93IHByZXNlcnZlIGxpbmUgZW5kaW5ncy4KKworKiA8ZnRwPiBmb2xsb3dzeW1saW5rcz0iZmFsc2UiIGluIG5lc3RlZCBmaWxlc2V0IGRlZmluaXRpb25zIGlzIGV4cGxpY2l0bHkKKyAgcmVxdWlyZWQgaW4gb3JkZXIgdG8gZXhjbHVkZSByZW1vdGUgc3ltYm9saWMgbGlua3MgKHdoZW4gZG9pbmcgYSBnZXQsIGNobW9kLAorICBkZWxldGUsIHJtZGlyKS4KKworKiBUaGUgdmFsdWVzIG9mIHRoZSBDb3B5I2ZpbGVDb3B5TWFwIHZhcmlhYmxlIGhhcyBjaGFuZ2VkIGZyb20gU3RyaW5nIHRvCisgIFN0cmluZ1tdLiAoSW4gamF2YSAxLjUgdGVybXMgaXQgd2FzIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gYW5kCisgIGlzIG5vdyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmdbXT4pLiBUaGlzIHdpbGwgYWZmZWN0IHRoaXJkIHBhcnR5IGNvZGUKKyAgdGhhdCBleHRlbmQgQ29weSBhbmQgb3ZlcnJpZGUgQ29weSNkb0ZpbGVPcGVyYXRpb25zLgorCisqIDxsb2FkcHJvcGVydGllcz4gZGlkbid0IGV4cGFuZCBwcm9wZXJ0aWVzIHdoaWxlIDxwcm9wZXJ0eSBmaWxlPSIuLi4iLz4KKyAgZG9lcywgc28gdGhleSB3ZXJlIG5vdCBlcXVpdmFsZW50LiAgVGhpcyBoYXMgYmVlbiBmaXhlZCwgd2hpY2ggbWVhbnMKKyAgdGhhdCBwcm9wZXRyaWVzIG1heSBnZXQgZXhwYW5kZWQgdHdpY2UgaWYgeW91IHVzZSBhbgorICA8ZXhwYW5kcHJvcGVydGllcz4gZmlsdGVycmVhZGVyLiAgQnVnemlsbGEgUmVwb3J0IDE3NzgyLgorCisqIFVzZXIgZGVmaW5lZCB0YXNrcyBhbmQgdHlwZWRlZnMgYXJlIG5vdyBoYW5kbGVkIGludGVybmFsbHkgaW4gdGhlCisgIHNhbWUgd2F5IGFzIHByZWRlZmluZWQgdGFza3MgYW5kIHR5cGVkZWZzLiBBbHNvIHRhc2tzIGFuZCB0eXBlZGVmcworICBhcmUgcmVzb2x2ZWQgYXQgYSBsYXRlciBzdGFnZS4gVGhpcyBjYXVzZXMgc29tZQorICBkaWZmZXJlbmNlcyBlc3BlY2lhbGx5IGZvciB1c2VyIGRlZmluZWQgdGFzayBjb250YWluZXJzLgorCisqIDxjaGVja3N1bT4gbG9nIG1lc3NhZ2UgIkNhbGN1bGF0aW5nIGNoZWNrc3VtIC4uLiIgaGFzIGJlZW4gZGVncmFkZWQKKyAgZnJvbSBJTkZPIHRvIFZFUkJPU0UuCisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorKiBGaWx0ZXIgcmVhZGVycyB3ZXJlIG5vdCBoYW5kbGluZyBsaW5lIGVuZGluZ3MgcHJvcGVybHkuICBCdWd6aWxsYQorICBSZXBvcnQgMTg0NzYuCisKKyogRmlsdGVyc2V0cyB3ZXJlIGFsc28gbm90IGhhbmRsaW5nIGxpbmUgZW5kaW5ncyBwcm9wZXJseS4KKworKiBFeHBhbmQgdGFza3MgZGlkIG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQgd2l0aCBQYXR0ZXJuU2V0cy4KKworKiA8cHJvcGVydHkgZW52aXJvbm1lbnQ9Li4uIC8+IG5vdyB3b3JrcyBvbiBPUy80MDAuCisKKyogPGNhYj4gY291bGQgaGFuZyBsaXN0Y2FiIG9uIGxhcmdlIDxmaWxlc2V0PnMuCisKKyogVGhlIHN0YXJ0ZWFtIHN0Y2hlY2tvdXQsIHN0Y2hlY2tpbiB0YXNrcyBub3cgY29ycmVjdGx5IGNvbXB1dGUKKyAgc3RhdHVzIG9mIGZpbGVzIGFnYWluc3Qgd2hhdGV2ZXIgbG9jYWwgdHJlZSB0aGV5IGFyZSBydW4gYWdhaW5zdAorICBhbmQsIG9wdGlvbmFsbHksIHdpbGwgbm90IHByb2Nlc3MgYSBmaWxlIGlmIGl0IGlzIGN1cnJlbnQuCisgIFByZXZpb3VzbHkgeW91IGhhZCB0byBwcm9jZXNzIGV2ZXJ5dGhpbmcgdW5sZXNzIHlvdSByYW4gYWdhaW5zdCB0aGUKKyAgZGVmYXVsdCBmb2xkZXIgd2hpY2ggd2Fzbid0IHRoZSBub3JtYWwgdXNlLWNhc2UgZm9yIGFudC1zdGFydGVhbS4KKyAgVGhlIHN0bGlzdCB0YXNrIG5vdyBzaW1pbGFybHkgZGlzcGxheXMgdGhhdCBzdGF0dXMgY29ycmVjdGx5IG1ha2luZworICBpdCBhIG1vcmUgZ2VuZXJhbGx5IHVzZWZ1bCB0b29sLgorCisqIGVudGl0eSBpbmNsdWRlcyB3b3VsZCBjYXVzZSBleGNlcHRpb25zIGlmIHBhdGggbmFtZXMgaW5jbHVkZWQgc3BhY2VzLgorCisqIGFkZENvbmZpZ3VyZWRYWFggd291bGQgbm90IHdvcmsgZm9yIFRhc2tBZGFwdGVyIHdyYXBwZWQgdGFza3MKKworKiBGaXggPGlsYXNtPiBvdXRwdXRmaWxlIHRlc3Rpbmcgc28gdGhhdCB0aGUgb3V0cHV0IGZpbGUgZG9lcyBub3QgbmVlZAorICB0byBleGlzdCBiZWZvcmVoYW5kLgorCisqIEFudCB3aWxsIG5vdyBleGl0IHdpdGggYSByZXR1cm4gY29kZSBvZiAxIGlmIGl0IGVuY291bnRlcnMgcHJvYmxlbXMKKyAgd2l0aCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKworKiBDbGFzc0xvYWRlciBjcmVhdGlvbiBjaGFuZ2VzIHRvIHVzZSBhIGZhY3RvcnkgbWV0aG9kIGluIFByb2plY3QuIEEgbmV3CisgIGNsYXNzIEFudENsYXNzTG9hZGVyMiBpbXBsZW1lbnRlZCBmb3IgMS4yKyBzcGVjaWZpYyBmZWF0dXJlcyBpbmNsdWRpbmcKKyAgUGFja2FnZSBpbmZvcm1hdGlvbiBhbmQgYWRkaXRpb24gb2YgY2xhc3NlcyBzcGVjaWZpZWQgaW4gdGhlIENsYXNzLVBhdGgKKyAgZWxlbWVudCBvZiBhIEphcidzIG1hbmlmZXN0LgorCisqIEl0IGlzIG5vdyBwb3NzaWJsZSBpbiA8ZXhlYz4gdG8gcmVzb2x2ZSB0aGUgZXhlY3V0YWJsZSB0byBhIHByb2plY3QKKyAgYmFzZWRpciBvciBleGVjdXRpb24gZGlyIHJlbGF0aXZlIGV4ZWN1dGFibGUuIFRoZSByZXNvbHZlRXhlY3V0YWJsZQorICBtdXN0IGJlIHVzZWQgdG8gcGljayB1cCBzdWNoIGV4ZWN1dGFibGVzLgorCisqIHNwbGFzaCBzY3JlZW4gd291bGRuJ3QgZGlzYXBwZWFyIHdoZW4gYnVpbGQgd2FzIGZpbmlzaGVkLgorCisqIDxleGVjPiBvdXRwdXQgYW5kIGVycm9yIHN0cmVhbXMgY2FuIG5vdyBiZSByZWRpcmVjdGVkIGluZGVwZW5kZW50bHkKKyAgdG8gZWl0aGVyIGEgcHJvcGVydHkgb3IgYSBmaWxlIChvciBib3RoKQorCisqIFRhckVudHJ5J3MgRmlsZS1hcmcgY29uc3RydWN0b3Igd291bGQgZmFpbCB3aXRoIGEKKyAgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBvbiBhbGwgT1NlcyB3aGVyZSBvcy5uYW1lIGlzIHNob3J0ZXIKKyAgdGhhbiBzZXZlbiBjaGFyYWN0ZXJzLiAgQnVnemlsbGEgUmVwb3J0IDE4MTA1LgorCisqIDxjb3B5PiBhbmQgPG1vdmU+J3MgZmFpbG9uZXJyb3IgZGlkbid0IGFwcGx5IHRvIGZpbGVzZXRzIHBvaW50aW5nIHRvCisgIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4gIEJ1Z3ppbGxhIFJlcG9ydCAxODQxNC4KKworKiBUaGUgPHN0cmlwamF2YWNvbW1lbnRzPiBmaWx0ZXIgc29tZXRpbWVzIHJlbW92ZWQgcGFydHMgb2Ygc3RyaW5nCisgIGNvbnN0YW50cy4gIEJ1Z3ppbGxhIFJlcG9ydCAxNzQ0MS4KKworKiA8YW50bHI+IHdpbGwgbm93IHJlY29tcGlsZSB5b3VyIGdyYW1tYXIgaWYgdGhlIHN1cGVyZ3JhbW1hciBoYXMKKyAgY2hhbmdlZC4gIEJ1Z3ppbGxhIFJlcG9ydCAxMjY5MS4KKworKiA8cHJvcGVydHkgZW52PiB3aWxsIG5vdyB3b3JrIG9uIFVuaWNlcyB3aXRoIC9iaW4vZW52IGluc3RlYWQgb2YKKyAgL3Vzci9iaW4vZW52LiAgQnVnemlsbGEgUmVwb3J0IDE3NjQyLgorCisqIDxqYXIgaW5kZXg9Im9uIj4gY291bGQgaW5jbHVkZSBtdWx0aXBsZSBpbmRleCBsaXN0cy4gIEJ1Z3ppbGxhIDEwMjYyLgorCisqIFRoZSBpbmRleCBjcmVhdGVkIGJ5IDxqYXI+IGRpZG4ndCBjb25mb3JtIHRvIHRoZSBzcGVjIGFzIGl0IGRpZG4ndAorICBpbmNsdWRlIHRoZSB0b3AtbGV2ZWwgZW50cmllcy4gIEJ1Z3ppbGxhIFJlcG9ydCAxNjk3Mi4KKworKiA8dGFyPiBhbmQgPHppcD4gZGlkbid0IGhvbm9yIHRoZSBkZWZhdWx0ZXhjbHVkZXMgYXR0cmlidXRlIGZvciB0aGUKKyAgaW1wbGljaXQgZmlsZXNldC4gIEJ1Z3ppbGxhIFJlcG9ydCAxODYzNy4KKworKiBUaGUgPHJlcGxhY2V0b2tlbnM+IGZpbHRlciB3b3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHRva2VuJ3MKKyAgdmFsdWUgd2FzIGFuIGVtcHR5IHN0cmluZy4gIEJ1Z3ppbGxhIFJlcG9ydCAxODYyNS4KKworKiBQZXJmb3JjZSB0YXNrcyByZWx5aW5nIG9uIG91dHB1dCBmcm9tIHRoZSBzZXJ2ZXIgc3VjaCBhcyA8cDRjaGFuZ2U+CisgIGFuZCA8cDRsYWJlbD4gd2VyZSBoYW5naW5nLiBCdWd6aWxsYSBSZXBvcnRzIDE4MTI5IGFuZCAxODk1Ni4KKworKiBJbXByb3ZlIGV4Y2VwdGlvbiBhbmQgbG9nZ2luZyBiZWhhdmlvciBvZiBQZXJmb3JjZSB0YXNrcy4KKyAgQnVnemlsbGEgcmVwb3J0IDE4MTU0LgorCisqIGJ1aWxkLnNoIGluc3RhbGwgaGFkIGEgcHJvYmxlbSBvbiBjeWd3aW4gKHdpdGggUkVBTEFOVEhPTUUpLgorICBCdWd6aWxsYSBSZXBvcnQgMTcyNTcKKworKiA8cmVwbGFjZXJlZ2V4cD4gZGlkbid0IHdvcmsgZm9yIG11bHRpLWJ5dGUgZW5jb2RpbmdzIGlmIGJ5bGluZSB3YXMgZmFsc2UuCisgIEJ1Z3ppbGxhIFJlcG9ydCAxOTE4Ny4KKworKiA8cmVwbGFjZXJlZ2V4cD4gd2FzIGFsdGVyaW5nIHVubmVjZXNzYXJpbHkgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZGlyZWN0b3JpZXMKKyAgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gcHJvY2VzcworICBCdWd6aWxsYSBSZXBvcnQgMjI1NDEuCisKKyogZmlsZSBuYW1lcyB0aGF0IGluY2x1ZGUgc3BhY2VzIG5lZWQgdG8gYmUgcXVvdGVkIGluc2lkZSB0aGUgQGFyZ2ZpbGUKKyAgYXJndW1lbnQgdXNpbmcgZm9ya2VkIDxqYXZhYz4gYW5kIChhbGwgSkRLUykuICBCdWd6aWxsYSBSZXBvcnQgMTA0OTkuCisgIE5CIDogYSBmaXJzdCBjb3JyZWN0aW9uIHdhcyBvbmx5IGludHJvZHVjaW5nIHF1b3RlcyBmb3IgSkRLIDEuNAorICBJdCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHF1b3RlIGZvciBhbGwgZXh0ZXJuYWwgY29tcGlsZXJzIHdoZW4gcGF0aHMKKyAgY29udGFpbiBzcGFjZXMuCisgIEFsc28gdGhlIGJhY2tzbGFzaGVzIG5lZWQgdG8gYmUgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlcworICBCdWd6aWxsYSBSZXBvcnQgMTc2ODMuCisKKyogU2V0dGluZyBmaWxlc29ubHkgdG8gdHJ1ZSBpbiA8emlwPiBhbmQgcmVsYXRlZCB0YXNrcyB3b3VsZCBjYXVzZSB0aGUKKyAgYXJjaGl2ZXMgdG8gYmUgYWx3YXlzIHJlY3JlYXRlZC4gIEJ1Z3ppbGxhIFJlcG9ydCAxOTQ0OS4KKworKiBmaWxlIG5hbWVzIHRoYXQgaW5jbHVkZSBzcGFjZXMgbmVlZCB0byBiZSBxdW90ZWQgaW5zaWRlIHRoZSBAYXJnZmlsZQorICBhcmd1bWVudCB1c2luZyA8amF2YWRvYz4gYW5kIEpESyAxLjQuICBCdWd6aWxsYSBSZXBvcnQgMTY4NzEuCisKKyogPGp1bml0PiBkaWRuJ3Qgd29yayB3aXRoIGN1c3RvbSBmb3JtYXR0ZXJzIHRoYXQgd2VyZSBvbmx5IGF2YWlsYWJsZQorICBvbiB0aGUgdXNlciBzcGVjaWZpZWQgY2xhc3NwYXRoIHdoZW4gYSB0aW1lb3V0IG9jY3VycmVkLiAgQnVnemlsbGEKKyAgUmVwb3J0IDE5OTUzLgorCisqIDxkaWZmZXJlbnQ+IHNlbGVjdG9yIDogbWFrZSBpZ25vcmVGaWxlVGltZXMgZWZmZWN0aXZlbHkgZGVmYXVsdCB0byB0cnVlCisgIGFuZCBmaXggYSBidWcgaW4gdGhlIGNvbXBhcmlzb24gb2YgdGltZXN0YW1wcy4gQnVnemlsbGEgUmVwb3J0IDIwMjA1LgorCisqIDxkaWZmZXJlbnQ+IHNlbGVjdG9yIGNhbiBub3cgYmUgbmVzdGVkIGRpcmVjdGx5IHVuZGVyIGEgZmlsZXNldAorICBCdWd6aWxsYSBSZXBvcnQgMjAyMjAuCisKKyogPGN2c3RhZ2RpZmY+IGhhZCBhIHByb2JsZW0gd2l0aCAiZGQtTU0teXkgaGg6bW06c3MiIGZvcm1hdHMKKyAgQnVnemlsbGEgUmVwb3J0IDE1OTk1LgorCisqIDxjdnN0YWdkaWZmPiBjdnNyb290IGFuZCBwYWNrYWdlIGF0dHJpYnV0ZXMgYWRkZWQgdG8gdGhlIHJvb3QKKyAgZWxlbWVudCB0YWdkaWZmIG9mIHRoZSB4bWwgb3V0cHV0CisgIEJ1Z3ppbGxhIFJlcG9ydCAxNjA4MS4KKworKiA8Y3ZzdGFnZGlmZj4gaGFkIGEgcHJvYmxlbSB3aXRoIGFsaWFzZWQgbW9kdWxlcyBhbmQgd2l0aCByZXF1ZXN0cyBmb3IKKyAgbXVsdGlwbGUgbW9kdWxlcy4gQnVnemlsbGEgUmVwb3J0cyAyMTM3MyBhbmQgMjI4NzcuCisKKyogPGN2c3RhZ2RpZmY+IGNvdWxkIG5vdCBwYXJzZSBwcm9wZXJseSB0aGUgcmV2aXNpb24gbnVtYmVyIG9mIG5ldyBmaWxlcyB3aXRoCisgIENWUyAxLjExLjkgb3IgaGlnaGVyLiBCdWd6aWxsYSBSZXBvcnQgMjQ0MDYuCisKKyogPGZpeGNybGY+IG1ha2UgZml4Y3JsZiBjcmVhdGUgaXRzIHRlbXBvcmFyeSBmaWxlcyBpbiB0aGUgZGVmYXVsdCBkaXJlY3RvcnkKKyAgb2YgRmlsZVV0aWxzI2NyZWF0ZVRlbXBGaWxlIGluc3RlYWQgb2YgdGhlIGRlc3RpbmF0aW9uIGRpciBvZiBmaXhjcmxmLgorICBCdWd6aWxsYSBSZXBvcnQgMjA4NzAuCisKKyogPGVqYmphcj4gaW1wbGVtZW50YXRpb24gZm9yIEJvcmxhbmQuCisgIFByZXZlbnQgdGhlIHRhc2sgZnJvbSBiZWluZyBibG9ja2VkIGJ5IGVycm9yIG1lc3NhZ2VzIGNvbWluZyBmcm9tIGphdmEyaWlvcC4KKyAgQnVnemlsbGEgUmVwb3J0IDE5Mzg1LgorCisqIDx1bnppcD4ncyBhbmQgPHVudGFyPidzIG5lc3RlZCBwYXR0ZXJuc2V0cyBkaWRuJ3Qgd29yayBhcyBkb2N1bWVudGVkCisgIHdoZW4gdGhlIHBhdHRlcm4gZW5kZWQgaW4gYSBzbGFzaCBvciBiYWNrc2xhc2guICBCdWd6aWxsYSBSZXBvcnQgMjA5NjkuCisKKyogPGZpeGNybGY+IHdpbGwgbm93IGNyZWF0ZSB0aGUgcGFyZW50IGRpcmVjdG9yaWVzIGZvciB0aGUgZGVzdGluYXRpb24KKyAgZmlsZXMgaWYgbmVjZXNzYXJ5LiAgQnVnemlsbGEgUmVwb3J0IDIwODQwLgorCisqIDx4bWxwcm9wZXJ0eT4gbm93IGhhbmRsZXMgQ0RBVEEgc2VjdGlvbnMuIEJ1Z1ppbGxhIFJlcG9ydCAxNzE5NQorCisqIDx0cmFuc2xhdGU+IG5vdyB0cmFuc2xhdGUgdG9rZW5zIHRoYXQgYXJlIHBsYWNlZCBjbG9zZSB0b2dldGhlci4KKyAgQnVnemlsbGEgUmVwb3J0IDE3Mjk3CisKKyogTmVzdGVkIHdlYnNwaGVyZSBlbGVtZW50IGZvciBlamJqYXIgZG9lcyBub3Qgc3VwcG9ydCBzcGFjZXMgaW4gZmlsZSBuYW1lLgorICBCdWd6aWxsYSBSZXBvcnQgMjEyOTgKKworKiBEb24ndCBtdWx0aXBseSBDbGFzcy1QYXRoIGF0dHJpYnV0ZXMgd2hlbiB1cGRhdGluZyBqYXJzLiAgQnVnemlsbGEKKyAgUmVwb3J0IDIxMTcwLgorCisqIERvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIChpbmNyZW1lbnQpIGF0dHJpYnV0ZSBvZiBQcm9wZXJ0eUZpbGUgbmVzdGVkCisgIEVudHJ5IGVsZW1lbnQuIEJ1Z3ppbGxhIFJlcG9ydCAyMTUwNS4KKworKiBQcmV2ZW50IHN5c3Byb3BlcnRpZXMgd2l0aCBubyBrZXkgb3Igbm8gdmFsdWUgZnJvbSBiZWluZyBhZGRlZCBpbiA8anVuaXQ+LgorICBCdWd6aWxsYSBSZXBvcnQgMjE2ODQuCisKKyogQWxsb3cgcmVmZXJlbmNlcyB0byBiZSBwcm9wZXJseSBpbmhlcml0ZWQgdmlhIGFudGNhbGwKKyAgQnVnemlsbGEgUmVwb3J0IDIxNzI0LgorCisqIGZ0cCBjaG1vZCBmYWlsZWQgd2hlbiB0aGUgcmVtb3RlIHN5c3RlbSB3YXMgVU5JWCBhbmQgbG9jYWwgc3lzdGVtIFdpbmRvd3MKKyAgQnVnemlsbGEgUmVwb3J0IDIxODY1LgorCisqIGZ0cCBwdXQgd2l0aCBjaG1vZCBmYWlsZWQgd2hlbiB0aGUgcmVtb3RlIHN5c3RlbSB3YXMgVU5JWCBhbmQgbG9jYWwgc3lzdGVtCisgIFdpbmRvd3MuIEJ1Z3ppbGxhIFJlcG9ydCAyMzE0My4KKworKiBmdHAgZGlkIG5vdCBzZXQgdGhlIGFzY2lpIG1vZGUgZXhwbGljaXR5LCBjYXVzaW5nIHByb2JsZW1zIHdpdGggZnRwIHNlcnZlcnMKKyAgaGF2aW5nIGJpbmFyeSBhcyBkZWZhdWx0CisKKyogZnRwIHdhcyBub3QgYWJsZSB0byBkb3dubG9hZCBmaWxlcyB3aGVuIHRoZXkgd2VyZSBwb2ludGVkIHRvIGJ5IHN5bWJvbGljCisgIGxpbmtzLiBCdWd6aWxsYSBSZXBvcnQgMTQwNjMuCisKKyogZnRwIGlzIGFibGUgdG8gZG93bmxvYWQgYWxzbyBkaXJlY3RvcmllcyBwb2ludGVkIHRvIGJ5IHN5bWJvbGljIGxpbmtzLgorCisqIHJlcGxhY2Ugd291bGQgY2hhbmdlIFxyXG4gaW50byBcclxyXG4gdW5kZXIgV2luZG93cy4KKworKiBqdW5pdHJlcG9ydCB3aXRoIGZyYW1lcyBkaWQgbm90IGRpc3BsYXkgYSBsaW5rIGZvciBjbGFzc2VzIHdpdGhvdXQgYSBwYWNrYWdlCisgIG9yIGluIHRoZSB0b3AgcGFja2FnZS4KKyAgQnVnemlsbGEgUmVwb3J0IDIxOTE1LgorCisqIFByb2plY3QudG9Cb29sZWFuKFN0cmluZykgbm93IGhhbmRsZXMgbnVsbCBhcyBhcmd1bWVudCBhbmQgZG9lcyBub3QgdGhyb3cgYQorICBOdWxsUG9pbnRlckV4Y2VwdGlvbiBhbnkgbW9yZS4KKworKiBUaGUgc29ja2V0IGNvbmRpdGlvbiB3aWxsIG5vdyBjbG9zZSB0aGUgc29ja2V0IGNyZWF0ZWQgdG8gdGVzdC4KKyAgQnVnemlsbGEgUmVwb3J0IDIzMDQwLgorCisqIDxqdW5pdCBpbmNsdWRlYW50cnVudGltZT0idHJ1ZSIgZm9yaz0idHJ1ZSI+IHJlcGxhY2VkIHRoZSBDTEFTU1BBVEggaW5zdGVhZAorICBvZiBhZGRpbmcgdG8gaXQuICBCdWd6aWxsYSBSZXBvcnQgMTQ5NzEuCisKKyogPHNwbGFzaD4gY291bGQgZmFpbCBvbiBKVk1zIHRoYXQgdXNlIG51bGwgdG8gaW5kaWNhdGUgdGhlIHN5c3RlbSBjbGFzc2xvYWRlci4KKyAgQnVnemlsbGEgUmVwb3J0IDIzMzIwLgorCisqIDx4bWxjYXRhbG9nPnMgb25seSB3b3JrZWQgd2hlbiBkZWZpbmVkIGluc2lkZSBvZiB0YXNrcy4gIEJ1Z3ppbGxhCisgIFJlcG9ydCAyMDk2NS4KKworKiA8Y3NjPiBhbmQgc2libGluZ3MgKDx2YmM+IDxqc2hhcnBjPikgaGFuZGxlIGxhcmdlIGZpbGVzZXRzIGJ5CithdXRvbWF0aWMgdXNlIG9mIHJlc3BvbnNlIGZpbGVzLiAgQnVnemlsbGEgcmVwb3J0ICMxOTYzMAorCitPdGhlciBjaGFuZ2VzOgorLS0tLS0tLS0tLS0tLS0KKworKiBTaGlwcGVkIFhNTCBwYXJzZXIgaXMgbm93IFhlcmNlcyAyLjYuMAorCisqIEFsbCB0YXNrcyBjYW4gYmUgdXNlZCBvdXRzaWRlIG9mIDx0YXJnZXQ+cy4gIE5vdGUgdGhhdCBzb21lIHRhc2tzCisgIHdpbGwgbm90IHdvcmsgYXQgYWxsIG91dHNpZGUgb2YgdGFyZ2V0cyBhcyB0aGV5IHdvdWxkIGNhdXNlIGluZmluaXRlCisgIGxvb3BzICg8YW50Y2FsbD4gYXMgd2VsbCBhcyA8YW50PiBhbmQgPHN1YmFudD4gaWYgdGhleSBpbnZva2UgdGhlCisgIGN1cnJlbnQgYnVpbGQgZmlsZSkuCisKKyogU2l4IG5ldyBDbGVhcmNhc2UgdGFza3MgYWRkZWQuCisKKyogQSBuZXcgZmlsdGVyIHJlYWRlciBuYW1lbHkgdG9rZW5maWx0ZXIgaGFzIGJlZW4gYWRkZWQuICBCdWd6aWxsYQorICBSZXBvcnQgMTgzMTIuCisKKyogQSBuZXcgYXR0cmlidXRlIG5hbWVkIHNraXAgaXMgYWRkZWQgdG8gdGhlIFRhaWxGaWx0ZXIgYW5kCisgIEhlYWRGaWx0ZXIgZmlsdGVyIHJlYWRlcnMuCisKKyogVGhlIGZpbGVzZXRtYW5pZmVzdCBhdHRyaWJ1dGUgb2YgPGphcj4gaGFzIGJlZW4gcmVlbmFibGVkLgorCisqIFRoZSBzdGFydCBhbmQgZW5kIHRva2VucyBmb3IgPHRyYW5zbGF0ZT4gbWF5IG5vdyBiZSBsb25nZXIgdGhhbiBhCisgIHNpbmdsZSBjaGFyYWN0ZXIuCisKKyogPHNldHByb3h5PiBsZXRzIHlvdSBzZXQgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgcHJveGllcyB0aGF0CisgIHdhbnQgYXV0aGVudGljYXRpb24KKworKiA8bG9hZHByb3BlcnRpZXM+IGhhcyBhIG5ldyBlbmNvZGluZyBhdHRyaWJ1dGUuCisKKyogPGVjaG9wcm9wZXJ0aWVzPiBjYW4gbm93IGNyZWF0ZSBYTUwgb3V0cHV0LgorCisqIDxlY2hvcHJvcGVydGllcz4gaGFzIGEgbmV3IHNyY2ZpbGUgYXR0cmlidXRlIHRoYXQgY2FuIG1ha2UgaXQgcmVhZAorICBwcm9wZXJ0aWVzIGZpbGVzIGFuZCBvdXRwdXQgdGhlbSBpbnN0ZWFkIG9mIEFudCdzIHByb3BlcnRpZXMuCisKKyogPGZpbHRlcnNldD4gd2lsbCBub3cgcmVzb2x2ZSBmaWx0ZXJzIHJlY3Vyc2l2ZWx5LgorCisqIDxpbnB1dD4gaGFzIGEgbmV3IGF0dHJpYnV0ZSB0aGF0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUuCisKKyogQWRkZWQgPGltYWdlPiB0YXNrIChyZXF1aXJlcyBKQUkpLgorCisqIDxpbWFnZT4gdGFzayBoYXMgbm93IHByb3BvcnRpb25zIGF0dHJpYnV0ZSBpbiB0aGUgPHNjYWxlLz4gbmVzdGVkIGVsZW1lbnQKKyAgaW5zdGVhZCBvZiBrZWVwcHJvcG9ydGlvbnMgKGJyaW5naW5nIGluIG1vcmUgZnVuY3Rpb25hbGl0eSkKKworKiBOZXcgY29uZGl0aW9uIDxpc3JlZmVyZW5jZT4KKworKiA8ZnRwPiBub3cgaGFzIGEgcHJlc2VydmVsYXN0bW9kaWZpZWQgYXR0cmlidXRlIHRvIHByZXNlcnZlIHRoZQorICB0aW1lc3RhbXAgb2YgYSBkb3dubG9hZGVkIGZpbGUuCisKKyogbmV3IHJtZGlyIGFjdGlvbiBmb3IgPGZ0cD4gdGhhdCByZW1vdmVzIGRpcmVjdG9yaWVzIGZyb20gYSBmaWxlc2V0LgorCisqIDxmdHA+IGhhcyBhdHRyaWJ1dGVzIHRpbWVkaWZmYXV0byBhbmQgdGltZWRpZmZtaWxsaXMgdG8gdXNlIHRvZ2V0aGVyCisgIHdpdGggdGhlIG5ld2VyIGF0dHJpYnV0ZSB0byB0ZWxsIGFudCB0byB0YWtlIGludG8gYWNjb3VudCBhIHRpbWUgZGlmZmVyZW5jZQorICBiZXR3ZWVuIGNsaWVudCBhbmQgcmVtb3RlIHNpZGUuCisgIEJ1Z3ppbGxhIFJlcG9ydCAxOTM1OC4KKworKiA8ZnRwPiBoYXMgYmVlbiBvcHRpbWl6ZWQgdG8gZ28gZGlyZWN0bHkgdG8gdGhlIGluY2x1ZGUgcGF0dGVybnMuCisgIFRoaXMgcmVkdWNlcyBzY2FubmluZyB0aW1lIHVuZGVyIFVOSVggd2hlbiBmb2xsb3dzeW1saW5rcz0idHJ1ZSIKKyAgYW5kIGNhc2VzZW5zaXRpdmU9InRydWUiICh0aGUgZGVmYXVsdCkKKyAgQnVnemlsbGEgUmVwb3J0IDIwMTAzLgorCisqIFRoZSBTT1MgYW5kIFZTUyB0YXNrcyB3aWxsIG5vIGxvbmdlciB1bmNvbmRpdGlvbmFsbHkgcHJlcGVuZCBhICQgdG8KKyAgdnNzcGF0aCBvciBwcm9qZWN0cGF0aC4KKworKiBPUy80MDAgbm93IGdldHMgZGV0ZWN0ZWQgYnkgdGhlIG9zIGNvbmRpdGlvbi4KKworKiA8YXJnPiBoYXMgYSBuZXcgYXR0cmlidXRlIHBhdGhyZWYgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UKKyAgcHJldmlvdXNseSBkZWZpbmVkIHBhdGhzLgorCisqIDx4bWxwcm9wZXJ0eT4gaGFzIGJlZW4gaW1wcm92ZWQsIHlvdSBjYW4gbm93IGV4cGFuZCAke3Byb3BlcnRpZXN9LAorICBkZWZpbmUgaWRzIG9yIHBhdGhzIGFuZCB1c2UgQW50J3MgbG9jYXRpb24gbWFnaWMgZm9yIGZpbGVuYW1lIHJlc29sdXRpb25zCisgIGluIHRoZSBYTUwgZmlsZS4KKworKiA8eG1sY2F0YWxvZz4gd2lsbCBub3cgc3VwcG9ydCBleHRlcm5hbCBjYXRhbG9ncyBhY2NvcmRpbmcgdG8gdGhlCisgIE9BU0lTICJPcGVuIENhdGFsb2ciIHN0YW5kYXJkIC0gaWYgcmVzb2x2ZXIuamFyIChuZXdlciB0aGFuIHZlcnNpb24KKyAgMS4wKSBmcm9tIEFwYWNoZSdzIHhtbC1jb21tb25zIGlzIGluIHlvdXIgQ0xBU1NQQVRILgorCisqIFN0YXJ0ZWFtIHRhc2tzIG5vdyBoYXZlIHN1cHBvcnQgZm9yIHJldmlzaW9uIGxhYmVscyBhbmQgYnVpbGQgbGFiZWxzLgorICBDaGVja291dHMgbm93IGhhdmUgdGhlIG9wdGlvbiBvZiB1c2luZyByZXBvc2l0b3J5IHRpbWVzdGFtcHMsIGluc3RlYWQKKyAgb2YgY3VycmVudC4KKworKiBuZXcgdGFzayA8c3ltbGluaz4gdGhhdCBjcmVhdGVzIGFuZCBtYWludGFpbnMgc3ltYm9saWMgbGlua3MuCisKKyogbmV3IHRhc2tzIDxjaG93bj4gYW5kIDxjaGdycD4gd2hpY2ggYXJlIHdyYXBwZXJzIG9mIHRoZSBVbml4IGNvbW1hbmRzLgorCisqIG5ldyB0YXNrIDxhdHRyaWI+IHRvIGNoYW5nZSBmaWxlIGF0dHJpYnV0ZXMgb24gV2luZG93cyBzeXN0ZW1zLgorCisqIDxzdHlsZT4gaGFzIGEgbmV3IGF0dHJpYnV0ZSByZWxvYWRzdHlsZXNoZWV0IHRvIHdvcmsgYXJvdW5kIGEKKyAgYnVnIGluIHdpZGVzcHJlYWQgWGFsYW4gdmVyc2lvbnMuCisKKyogPHRhcmZpbGVzZXQ+IGhhcyBhIG5ldyBkaXJtb2RlIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHRoZSBwZXJtaXNzaW9ucworICBmb3IgZGlyZWN0b3JpZXMuCisKKyogPGZpeGNybGY+J3MgZW9sIGF0dHJpYnV0ZSBub3cgYWxzbyB1bmRlcnN0YW5kcyAibWFjIiwgInVuaXgiIGFuZCAiZG9zIi4KKworKiA8Y2xhc3NmaWxlc2V0PiBub3cgcGlja3MgdXAgZGVwZW5kZW5jaWVzIG9mIHRoZSBmb3JtIE15Q2xhc3MuY2xhc3MuIFRoaXMKKyAgd29ya3MgZm9yIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgU3VuIGphdmEgY29tcGlsZXIuIEl0IG1heSBub3Qgd29yayBmb3IKKyAgYWxsIGNvbXBpbGVycy4KKworKiBhIG5ldyBhdHRyaWJ1dGUgImdsb2JhbG9wdHMiIGNhbiBiZSBhZGRlZCB0byBhbGwgUGVyZm9yY2UgdGFza3MuCisgIFlvdSBjYW4gcHV0IGluIGl0IGFsbCB0aGUgc3RyaW5ncyBkZXNjcmliZWQgYnkgcDQgaGVscCB1c2FnZS4gUmVmZXIgdG8KKyAgdGhlIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyogbmV3IFBlcmZvcmNlIHRhc2tzIDxwNGludGVncmF0ZT4gLCA8cDRyZXNvbHZlPiwgYW5kIDxwNGxhYmVsc3luYz4KKworKiA8cDRzdWJtaXQ+IHdpbGwgY2hhbmdlIHRoZSBwcm9wZXJ0eSBwNC5jaGFuZ2UgaWYgdGhlIFBlcmZvcmNlIHNlcnZlcgorICByZW51bWJlcnMgdGhlIGNoYW5nZSBsaXN0LgorICBJdCB3aWxsIHNldCB0aGUgcHJvcGVydHkgcDQubmVlZHNyZXNvbHZlIGlmIHRoZSBzdWJtaXQgZmFpbHMsCisgIGFuZCB0aGUgbWVzc2FnZSBzYXlzIHRoYXQgZmlsZShzKSBuZWVkIHRvIGJlIHJlc29sdmVkLgorCisqIDxyZXBsYWNlcmVnZXhwPiBub3cgaGFzIGFuIG9wdGlvbmFsIGVuY29kaW5nIGF0dHJpYnV0ZSB0byBzdXBwb3J0CisgIHJlcGxhY2luZyBpbiBmaWxlcyB0aGF0IGFyZSBpbiBhIGRpZmZlcmVudCBlbmNvZGluZyB0aGFuIHRoZQorICBwbGF0Zm9ybSdzIGRlZmF1bHQuCisKKyogVGhlIDxleGVjPiB0YXNrIG1heSBub3cgaGF2ZSBpdHMgaW5wdXQgcmVkaXJlY3RlZCBmcm9tIGVpdGhlciBhIGZpbGUKKyAgb3IgYSBzdHJpbmcgZnJvbSB0aGUgYnVpbGQgZmlsZS4gVGhlIGVycm9yIG91dHB1dCBjYW4gYmUgc2VwYXJhdGVkCisgIHRvIGEgZGlmZmVyZW50IGZpbGUgd2hlbiBvdXR1dCBpcyByZWRpcmVjdGVkLiBzdGFuZGFyZCBlcnJvciBtYXkgYmUKKyAgbG9nZ2VkIHRvIHRoZSBBbnQgbG9nIHdoZW4gcmVkaXJlY3Rpbmcgb3V0cHV0IHRvIGEgZmlsZQorCisqIFRoZSA8amF2YT4gdGFzayBhbHNvIHN1cHBvcnRzIHRoZSBpbnB1dCByZWRpcmVjdGlvbiBhbmQgc2VwYXJhdGUKKyAgZXJyb3Igc3RyZWFtcyBpbnRyb2R1Y2VkIHRvIHRoZSA8ZXhlYz4gdGFzay4gSW4gYWRkaXRpb24sIGl0IGlzIG5vdworICBwb3NzaWJsZSB0byBzYXZlIHRoZSBvdXRwdXQgaW50byBhIHByb3BlcnR5IGZvciB1c2Ugd2l0aGluIHRoZSBidWlsZAorICBmaWxlIGFzIHdhcyBwb3NzaWJsZSB3aXRoIDxleGVjPiBpbiBBbnQgMS41CisKKyogVGhlIDxqYXZhZG9jPiB0YXNrIDx0YWc+IHN1YmVsZW1lbnQgaGFzIGJlZW4gZW5oYW5jZWQgdG8gYWxsb3cgZmlsZXMKKyAgd2l0aCB0YWcgbWFwcGluZ3MgdG8gYmUgdXNlZC4KKworKiBOZXcgdGFza3M6IDxzY3A+IHN1cHBvcnRzIGZpbGUgdHJhbnNmZXJzLCA8c3NoZXhlYz4gZXhlY3V0ZXMgYQorICBjb21tYW5kIG92ZXIgU1NILiAgVGhleSByZXF1aXJlIGpzY2gsIGEgQlNEIGxpY2Vuc2VkIFNTSCBsaWJyYXJ5IHRoYXQKKyAgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly93d3cuamNyYWZ0LmNvbS9qc2NoL2luZGV4Lmh0bWwKKworKiBOZXcgZmlsdGVycmVhZGVyIDxlc2NhcGV1bmljb2RlLz4uCisKKyogU3VwcG9ydCBmb3IgSFAncyBOb25TdG9wIEtlcm5lbCAoVGFuZGVtKSBPUyBoYXMgYmVlbiBhZGRlZC4KKworKiA8Y2FiPidzIGJhc2VkaXIgYXR0cmlidXRlIGlzIG5vdyBvcHRpb25hbCBpZiB5b3Ugc3BlY2lmeSBuZXN0ZWQKKyAgZmlsZXNldHMuICBCdWd6aWxsYSBSZXBvcnQgMTgwNDYuCisKKyogTmV3IHRhc2sgPHN5bmM+IHRoYXQgc3luY2hyb25pemVzIHR3byBkaXJlY3RvcnkgdHJlZXMuCisKKyogPGFwcGx5PiBoYXMgbmV3IGZvcndhcmRzbGFzaCBhdHRyaWJ1dGUgdGhhdCBjYW4gZm9yY2UgZmlsZW5hbWVzIHRvCisgIHVzZSBmb3J3YXJkIHNsYXNoZXMgKC8pIGFzIGZpbGUgc2VwYXJhdG9ycyBldmVuIG9uIHBsYXRmb3JtcyB3aXRoIGEKKyAgZGlmZmVyZW50IHNlcGFyYXRvci4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJ1biBjZXJ0YWluCisgIHBvcnRlZCBVbml4IHRvb2xzLgorCisqIENvcHkgaGFzIGEgbmV3IG91dHB1dGVuY29kaW5nIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoYW5nZQorICB0aGUgZW5jb2Rpbmcgd2hpbGUgY29weWluZyBmaWxlcy4gIEJ1Z3ppbGxhIFJlcG9ydCAxODIxNy4KKworKiBUaGUgeG1sIGZvcm1hdHRlciBmb3IgSlVuaXQgd2lsbCBub3cgaG9ub3IgdGVzdCBjYXNlIG5hbWVzIHNldCB3aXRoCisgIHNldE5hbWUuICBCdWd6aWxsYSBSZXBvcnQgMTcwNDAuCisKKyogSlVuaXQgbm93IGhhcyBhbiBhdHRyaWJ1dGUgcmVsb2FkaW5nLCB3aGljaCwgd2hlbiBzZXQgdG8gZmFsc2UsCisgIG1ha2VzIHRoZSB0YXNrIHJldXNlIHRoZSBzYW1lIGNsYXNzIGxvYWRlciBmb3IgYSBzZXJpZXMgb2YgdGVzdHMuCisKKyogPGNvbmNhdD4gbm93IHN1cHBvcnRzIGZpbHRlcmluZyBhbmQgY2FuIGNoZWNrIHRpbWVzdGFtcHMgYmVmb3JlCisgIG92ZXJyaWRpbmcgYSBmaWxlLiAgQnVnemlsbGEgUmVwb3J0IDE4MTY2LgorCisqIDxqdW5pdD4gaGFzIGEgbmV3IGF0dHJpYnV0ZSB0ZW1wZGlyIHRoYXQgY29udHJvbHMgdGhlIHBsYWNlbWVudCBvZgorICB0ZW1wb3JhcnkgZmlsZXMuICBCdWd6aWxsYSBSZXBvcnQgMTU0NTQuCisKKyogPGpkZXBlbmQ+IG5vdyBzdXBwb3J0cyBhIG5ldyBuZXN0ZWQgZWxlbWVudCA8Y2xhc3Nlc3BhdGg+IHdoaWNoIGlzCisgIHRoZSBzYW1lIGFzIDxzb3VyY2VzcGF0aD4gYnV0IHBvaW50IHRvIGNvbXBpbGVkIGNsYXNzZXMgKHRoZQorICBwcmVmZXJlZCBtb2RlIG9mIG9wZXJhdGlvbiBmb3IgSkRlcGVuZCA+IDIuNSkuICBBZGRpdGlvbmFsbHksIG5lc3RlZAorICA8ZXhjbHVkZT4gZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8gZXhjbHVkZSBjZXJ0YWluIHBhY2thZ2VzIGZyb20KKyAgYmVpbmcgcGFyc2VkLiAgQnVnemlsbGEgUmVwb3J0IDE3MTM0LgorCisqIFRoZSBKUHJvYmUgdGFza3Mgbm93IGFsc28gd29yayB3aXRoIEpQcm9iZSA0LnguICBCdWd6aWxsYSBSZXBvcnQgMTQ4NDkuCisKKyogPGphdmFjYz4gYW5kIDxqanRyZWU+IHdpbGwgbm93IGF1dG9kZXRlY3QgSmF2YUNDIDMueCBhbmQgY2FuIHVzZSBpdC4KKworKiA8c3FsPiBoYXMgYSBuZXcgYXR0cmlidXRlIHRvIGNvbnRyb2wgZXNjYXBlIHByb2Nlc3NpbmcuCisKKyogPHNxbD4gaXMgYWJsZSB0byBkaXNwbGF5IHByb3Blcmx5IHNldmVyYWwgcmVzdWx0c2V0cyBpZiB5b3UgYXJlCisgIHJ1bm5pbmcgYSBjb21wb3VuZCBzcWwgc3RhdGVtZW50LiBCdWd6aWxsYSBSZXBvcnQgMjE1OTQuCisKKyogQSBuZXcgPGNvbnRhaW5zcmVnZXhwPiBzZWxlY3RvciBoYXMgYmVlbiBhZGRlZCwgdGhhdCBzZWxlY3RzIGZpbGVzCisgIGlmIHRoZWlyIGNvbnRlbnQgbWF0Y2hlcyBhIGNlcnRhaW4gcmVndWxhciBleHByZXNzaW9uLgorCisqIDxhbnRscj4ncyBkZWJ1ZyBhdHRyaWJ1dGUgaGFzIGJlZW4gZW5hYmxlZC4gIEJ1Z3ppbGxhIFJlcG9ydCAxOTA1MS4KKworKiA8bWFpbD4gaGFzIGEgbmV3IGF0dHJpYnV0ZSBjaGFyc2V0LiBCdWd6aWxsYSBSZXBvcnQgMTU0MzQuCisKKyogPG1haWw+IGhhcyBuZXcgYXR0cmlidXRlcyB1c2VyIGFuZCBwYXNzd29yZCBmb3IgU01UUCBhdXRoLgorICBtYWlsbG9nZ2VyIGNhbiBhbHNvIHVzZSB0aGlzLgorICBUaGUgaW1wbGVtZW50YXRpb24gb25seSB3b3JrcyB3aXRoIEphdmFNYWlsIChlbmNvZGluZz0iTUlNRSIpLgorICBJbXBsZW1lbnRhdGlvbiB3aXRoIHBsYWluIG1haWwgcmVtYWlucyB0byBkby4KKyAgQnVnemlsbGEgUmVwb3J0IDU5NjkuCisKKyogPG1haWw+IGFuZCBtYWlsbG9nZXIgc3VwcG9ydCBTTVRQIG92ZXIgVExTL1NTTAorICBCdWd6aWxsYSBSZXBvcnQgMTkxODAuCisKKyogPG1haWw+IHRoZSBhdHRyaWJ1dGVzIGZyb20sIHJlcGx5dG8gLHRvbGlzdCwgY2NsaXN0LCBiY2NsaXN0CisgIGNhbiBub3cgY29udGFpbiBlbWFpbCBhZGRyZXNzZXMgb2YgdGhlIGZvcm0gbmFtZSA8YWRkcmVzc0B4eXouY29tPgorICBvciAobmFtZSkgYWRkcmVzc0B4eXouY29tCisgIEJ1Z3ppbGxhIFJlcG9ydCAyMjQ3NC4KKworKiA8bWFpbD4gKHZlcnNpb24gUGxhaW5NYWlsKQorICBwcmV2ZW50IGJsYW5rIGhlYWRlcnMgZnJvbSBiZWluZyBzZW50LAorICBtYWtlIHRoZSBvcmRlciBvZiB0aGUgaGVhZGVycyBvZiBwbGFpbiBtYWlsIG1lc3NhZ2VzIHByZWRpY3RhYmxlCisgIEJ1Z3ppbGxhIFJlcG9ydCAyMjA4OC4KKworKiA8emlwZmlsZXNldD4gY2FuIG5vdyBiZSBkZWZpbmVkIGluIHRoZSBtYWluIGJvZHkgb2YgYSBwcm9qZWN0CisgIGFuZCByZWZlcnJlZCB0byB3aXRoIHJlZmlkPSJ4eXoiLiBCdWd6aWxsYSBSZXBvcnQgMTcwMDcuCisKKyogQSB3cmFwcGVyIHNjcmlwdCBmb3IgT1MvMiBoYXMgYmVlbiBhZGRlZC4KKworKiA8dW56aXA+IHdpbGwgbm93IGRldGVjdCBhbmQgc3VjY2Vzc2Z1bGx5IGV4dHJhY3Qgc2VsZi1leHRyYWN0aW5nCisgIGFyY2hpdmVzLiAgQnVnemlsbGEgUmVwb3J0IDE2MjEzLgorCisqIDxzdGNoZWNrb3V0PiBoYXMgYSBuZXcgYXR0cmlidXRlICJjb252ZXJ0ZW9sIiB0aGF0IGNhbiBiZSB1c2VkIHRvCisgIGNvbnRyb2wgdGhlIGF1dG9tYXRpYyBsaW5lLWVuZCBjb252ZXJzaW9uIHBlcmZvcm1lZCBvbiBBU0NJSSBmaWxlcy4KKyAgQnVnemlsbGEgUmVwb3J0IDE4ODg0LgorCisqIFVzZXJzIGNhbiBub3cgbW9kaWZ5IHRoZSBsaXN0IG9mIGRlZmF1bHQgZXhjbHVkZXMgdXNpbmcgdGhlIG5ldworICBkZWZhdWx0ZXhjbHVkZXMgdGFzay4gIEJ1Z3ppbGxhIFJlcG9ydCAxMjcwMC4KKworKiBUaGVyZSBpcyBhIG5ldyBkYXRhIHR5cGUgPHByb3BlcnR5c2V0PiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbGxlY3QKKyAgcHJvcGVydGllcy4gIEl0IGlzIHN1cHBvcnRlZCBieSA8YW50PiwgPGFudGNhbGw+LCA8c3ViYW50PiwgPGphdmE+LAorICA8ZWNob3Byb3BlcnRpZXM+IGFuZCA8anVuaXQ+LgorCisqIDxjb25jYXQ+IGNhbiBub3cgY29udHJvbCB0aGUgZW5jb2Rpbmcgb2YgdGhlIG91dHB1dCBhcyB3ZWxsIGFuZCBvcHRpb25hbGx5CisgIGFkZCBuZXctbGluZSBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQgb2YgZmlsZXMgdGhhdCBnZXQgY29uY2F0ZW5hdGVkIGJ1dAorICBkb24ndCBlbmQgaW4gbmV3bGluZXMuICBCdWd6aWxsYSBSZXBvcnQgMTI1MTEuCisKKyogPHJwbT4gd2lsbCBkZXRlY3QgdGhlIHJwbWJ1aWxkIGV4ZWN1dGFibGUgb2YgUmVkSGF0IDguMCBhbmQgbmV3ZXIKKyAgYW5kIHVzZSB0aGF0IGlmIGl0IGlzIG9uIHlvdXIgUEFUSC4gIEJ1Z3ppbGxhIFJlcG9ydCAxNDY1MC4KKworKiBBIG5ldyB0YXNrIDxyZXhlYz4gaGFzIGJlZW4gYWRkZWQgdGhhdCByZXF1aXJlcyBjb21tb25zLW5ldCB0byB3b3JrLgorICBCdWd6aWxsYSBSZXBvcnQgMTk1NDEuCisKKyogPGphdmFkb2M+IG5vdyBzdXBwb3J0cyBhIG5lc3RlZCA8YXJnPiBlbGVtZW50IGluIGFkZGl0aW9uIHRvIHRoZQorICBhZGRpdGlvbmFscGFyYW1zIGF0dHJpYnV0ZS4KKworKiBZb3UgY2FuIG5vdyBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIHN0YW5kYXJkIHRhZ3MgaW4gPGphdmFkb2M+IHZpYQorICA8dGFnPiBlbGVtZW50cyAtIHlvdSBtdXN0IG5vdCB1c2UgdGhlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlbS4KKyAgQnVnemlsbGEgUmVwb3J0IDE4OTEyLgorCisqIDxqYXZhZG9jPiBub3cgc3VwcG9ydHMgdGhlIC1ub3F1YWxpZmllciBzd2l0Y2guICBCdWd6aWxsYSBSZXBvcnQgMTkyODguCisKKyogPGphdmFjPidzIGV4ZWN1dGFibGUgYXR0cmlidXRlIGNhbiBub3cgYWxzbyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlCisgIGV4ZWN1dGFibGUgZm9yIGppa2VzLCBqdmMsIHNqIG9yIGdjai4gIEJ1Z3ppbGxhIFJlcG9ydCAxMzgxNC4KKworKiA8amF2YWM+IGhhcyBhIG5ldyBhdHRyaWJ1dGUgdGVtcGRpciB0aGF0IGNhbiBjb250cm9sIHRoZSBwbGFjZW1lbnQKKyAgb2YgdGVtcG9yYXJ5IGZpbGVzLiAgQnVnemlsbGEgUmVwb3J0IDE5NzY1LgorCisqIEEgbmV3IG1hZ2ljIHByb3BlcnR5IGJ1aWxkLmNvbXBpbGVyLmp2Yy5leHRlbnNpb25zIGhhcyBiZWVuIGFkZGVkCisgIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHVybiBvZiBNaWNyb3NvZnQgZXh0ZW5zaW9ucyB3aGlsZSB1c2luZyB0aGUganZjCisgIGNvbXBpbGVyLiAgQnVnemlsbGEgUmVwb3J0IDE5ODI2LgorCisqIFlvdSBjYW4gbm93IGxpbWl0IHRoZSBwYXJhbGxlbGlzbSBvZiA8YXBwbHk+IGFuZCA8Y2htb2Q+IGJ5IHVzaW5nIHRoZSBuZXcKKyAgbWF4cGFyYWxsZWwgYXR0cmlidXRlLgorCisqIFdpdGggdGhlIG5ldyBhZGRzb3VyY2VmaWxlIGF0dHJpYnV0ZSwgeW91IGNhbiBtYWtlIDxhcHBseT4gb21taXQgdGhlCisgIHNvdXJjZSBmaWxlIG5hbWVzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gIEJ1Z3ppbGxhIFJlcG9ydCAxMzY1NC4KKworKiA8YXBwbHk+IGFuZCA8Y2htb2Q+IG5vdyBzdXBwb3J0IG5lc3RlZCA8ZmlsZWxpc3Q+cyBhcyB3ZWxsIGFzIDxkaXJzZXQ+cy4KKyAgQnVnemlsbGEgUmVwb3J0cyAxNTkyOSBhbmQgMjA2ODcuCisKKyogPGFwcGx5PiBhbmQgPGNobW9kPiB3aWxsIGRpc3BsYXkgYSBzdW1tYXJ5IGlmIHlvdSBzZXQgdGhlIG5ldworICB2ZXJib3NlIGF0dHJpYnV0ZSB0byB0cnVlLiAgQnVnemlsbGEgUmVwb3J0IDE5ODgzLgorCisqIDxjb3B5Pi88bW92ZT4ncyBmYWlsb25lcnJvciBhdHRyaWJ1dGUgY2FuIG5vdyBhbHNvIGJlIHVzZWQgdG8KKyAgY29udGludWUgdGhlIGJ1aWxkIGlmIGFuIEkvTyBlcnJvciBjYXVzZWQgYSBwcm9ibGVtLiAgQnVnemlsbGEKKyAgUmVwb3J0IDEyOTk5LgorCisqIG5ldyBzZWxlY3RvciA8dHlwZS8+IGFsbG93aW5nIHRvIHNlbGVjdCBvbmx5IGZpbGVzIG9yIG9ubHkgZGlyZWN0b3JpZXMuCisgIEJ1Z3ppbGxhIFJlcG9ydCAyMDIyMi4KKworKiA8amF2YT4gYW5kIDxqdW5pdD4gbm93IHN1cHBvcnQgYSBuZXN0ZWQgPGJvb3RjbGFzc3BhdGg+IGVsZW1lbnQgdGhhdAorICB3aWxsIGJlIGlnbm9yZWQgaWYgbm90IGZvcmtpbmcgYSBuZXcgVk0uCisKKyogPGp1bml0PidzIG5lc3RlZCA8Zm9ybWF0dGVyPiBlbGVtZW50cyBub3cgc3VwcG9ydCBpZi91bmxlc3MgY2xhdXNlcy4KKworKiA8ZWpiamFyPgorICBjbXB2ZXJzaW9uIGF0dHJpYnV0ZSBhZGRlZAorICBqYm9zcyBlbGVtZW50IHdpbGwgbG9vayBmb3IgamJvc3NjbXAtamRiYy54bWwgZGVzY3JpcHRvcgorICBpZiBlamJqYXIgaGFzIGNtcHZlcnNpb249IjIuMCIgc2V0CisgIEJ1Z3ppbGxhIFJlcG9ydHMgMTQ3MDcgYW5kIDE0NzA5LgorCisqIDxwdmNzPiBjb25maWcgYXR0cmlidXRlIGFkZGVkIHRvIHNldCB0aGUgbG9jYXRpb24gb2YgYSBzcGVjaWZpYyBQVkNTCisgIC5jZmcgZmlsZQorICBCdWd6aWxsYSBSZXBvcnQgOTc1MgorCisqIDxtYXBwZXI+IGhhcyBhbiAidW5wYWNrYWdlIiBtYXBwZXIKKyAgQnVnemlsbGEgUmVwb3J0IDE4OTA4CisKKyogQWRkZWQgPHNjcmlwdGRlZj4gdGFzayBhbGxvd2luZyB0YXNrcyB0byBiZSBkZWZpbmVkIHVzaW5nIGFueSBCU0Ytc3VwcG9ydGVkCisgIHNjcmlwdGluZyBsYW5ndWFnZS4KKworKiA8dG91Y2g+J3MgZGF0ZXRpbWUgYXR0cmlidXRlIGNhbiBub3cgYWNjZXB0IHRpbWUgd2l0aCBhIGdyYW51bGFyaXR5CisgIG9mIHNlY29uZHMgYXMgd2VsbC4gIEJ1Z3ppbGxhIFJlcG9ydCAyMTAxNC4KKworKiA8Y2hlY2tzdW0+IGhhcyB0d28gbmV3IHByb3BlcnRpZXM6IHRvdGFscHJvcGVydHkgYW5kIHRvZGlyLgorCisqIEZpbGVVdGlscyNjcmVhdGVUZW1wRmlsZSB3aWxsIG5vdyBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZQorICBkaXJlY3RvcnkgcG9pbnRlZCB0byBieSB0aGUgcHJvcGVydHkgamF2YS5pby50bXBkaXIKKworKiA8dW56aXA+IGFuZCBmcmllbmRzIG5vdyBzdXBwb3J0cyBhbiBvcHRpb25hbCBlbmNvZGluZyBhdHRyaWJ1dGUgdG8KKyAgZW5hYmxlIGl0IHRvIGV4cGFuZCBhcmNoaXZlcyBjcmVhdGVkIHdpdGggZmlsZW5hbWVzIHVzaW5nIGFuIGVuY29kaW5nCisgIG90aGVyIHRoYW4gVVRGOC4gIEJ1Z3ppbGxhIFJlcG9ydCAxMDUwNC4KKworKiA8cGF0Y2g+IGhhcyBhIG5ldyBhdHRyaWJ1dGUgZGVzdGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBuZXcKKyAgZmlsZSBpbnN0ZWFkIG9mIHBhdGNoaW5nIGZpbGVzIGluIHBsYWNlLgorCisqIE9wZW5WTVMgaXMgZGV0ZWN0ZWQgYXMgYSB2YWxpZCBPUyBmYW1pbHkuCisKKyogRGlyZWN0b3J5U2Nhbm5lciBoYXMgYmVlbiBvcHRpbWl6ZWQgZm9yIGNhc2VzIHdoZXJlIGluY2x1ZGUgcGF0dGVybnMgZG8gbm90CisgIHN0YXJ0IHdpdGggd2lsZGNhcmRzLiAgQnVnemlsbGEgUmVwb3J0IDIwMTAzLgorCisqIERpcmVjdG9yeVNjYW5uZXIgYmVnaW5zIHRvIGJlIG9wdGltaXplZCBub3QgdG8gc2NhbiBleGNsdWRlZCBkaXJlY3Rvcmllcy4KKyAgQnVnemlsbGEgUmVwb3J0IDIxOTQxLgorCisqIEFkZGVkIGtlZXAtZ29pbmcgZmVhdHVyZS4gQnVnemlsbGEgUmVwb3J0IDIxMTQ0CisKKyogVGhlIGFyY2hpdmVzIGdlbmVyYXRlZCBieSA8emlwPiBhbmQgZnJpZW5kcyB3aWxsIG5vdyBjb250YWluIENSQyBhbmQKKyAgc2l6ZSBpbmZvcm1hdGlvbiBpbiB0aGUgImxvY2FsIGZpbGUgaGVhZGVyIiwgdGhlcmVieSBwcm92aWRpbmcgdGhpcworICBpbmZvcm1hdGlvbiB0byBhcHBsaWNhdGlvbnMgdGhhdCByZWFkIHRoZSBhcmNoaXZlcyB1c2luZworICBqYXZhLnV0aWwuWmlwSW5wdXRTdHJlYW0uICBCdWd6aWxsYSBSZXBvcnQgMTkxOTUuCisKKyogPGNvcHk+IGFuZCA8bW92ZT4gY2FuIG5vdyBoYW5kbGUgbWFwcGVycyB0aGF0IHJldHVybiBtdWx0aXBsZQorICBtYXBwaW5ncyBwZXIgc291cmNlIHBhdGguIFRoaXMgYmVoYXZpb3VyIGlzIGVuYWJsZWQgYnkgdXNpbmcKKyAgYW4gZW5hYmxlbXVsdGlwbGVtYXBwaW5nIGF0dHJpYnV0ZS4gQnVnemlsbGEgUmVwb3J0IDIxMzIwLgorCisqIDxleGVjPiB3aWxsIG5vdyB3b3JrIG9uIE9wZW5WTVMgKHBsZWFzZSByZWFkIHRoZSBub3RlcyBpbgorICA8ZXhlYz4ncyBtYW51YWwgcGFnZSkuICBCdWd6aWxsYSBSZXBvcnQgMjE4NzcuCisKKyogPGV4ZWM+IHdpbGwgbm93IGhhdmUgYSBuZXcgYXR0cmlidXRlIHNwYXduIChkZWZhdWx0IGZhbHNlKS4KKyAgSWYgc2V0IHRvIHRydWUsIHRoZSBwcm9jZXNzIHdpbGwgYmUgc3Bhd25lZC4gQnVnemlsbGEgUmVwb3J0IDU5MDcuCisKKyogPGphdmE+IHdpbGwgbm93IGhhdmUgYSBuZXcgYXR0cmlidXRlIHNwYXduIChkZWZhdWx0IGZhbHNlKS4KKyAgSWYgc2V0IHRvIHRydWUsIHRoZSBwcm9jZXNzIHdpbGwgYmUgc3Bhd25lZC4gQnVnemlsbGEgUmVwb3J0IDU5MDcuCisKKyogPHBhcmFsbGVsPiBub3cgc3VwcG9ydHMgYSB0aW1lb3V0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlY292ZXIKKyAgZnJvbSBkZWFkbG9ja3MsIGV0YyBpbiB0aGUgcGFyYWxsZWwgdGhyZWFkcy4gPHBhcmFsbGVsPiBhbHNvCisgIG5vdyBzdXBwb3J0cyBhIDxkYWVtb25zPiBuZXN0ZWQgZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0bworICBydW4gdGFza3MgaW4gZGFlbW9uIHRocmVhZHMgd2hpY2ggdGhlIHBhcmFsbGVsIHRhc2sgd2lsbCBub3QKKyAgd2FpdCBmb3IgYmVmb3JlIGNvbXBsZXRpbmcuIEEgbmV3IGF0dHJpYnV0ZSBmYWlsb25hbnkgd2lsbCBjYXVzZQorICA8cGFyYWxsZWw+IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbnkgdGhyZWFkIGZhaWxzIHdpdGhvdXQKKyAgd2FpdGluZyBmb3IgYWxsIG90aGVyIHRocmVhZHMgdG8gY29tcGxldGUuCisKKyogPHppcD4gYW5kIGZyaWVuZHMgd2lsbCBjb25zdW1lIGZhciBsZXNzIG1lbW9yeSB0aGFuIHRoZXkgdXNlZCB0bworICB3aGVuIHJ1biB3aXRoIGNvbXByZXNzPSJmYWxzZSIuICBCdWd6aWxsYSBSZXBvcnQgMjE4OTkuCisKKyogPGlmLz4gYW5kIDx1bmxlc3MvPiBhdHRyaWJ1dGVzIGFkZGVkIHRvIDxwYXJhbS8+IGVsZW1lbnQgb2YgPHN0eWxlPgorICAgQnVnemlsbGEgUmVwb3J0IDIyMDQ0CisKKyogPHppcD4gYW5kIGZyaWVuZHMgaGF2ZSBhIG5ldyBhdHRyaWJ1dGUgImtlZXBjb21wcmVzc2lvbiIgdGhhdCBjYW4gYmUKKyAgdXNlZCB0byBpbmNyZW1lbnRhbGx5IGJ1aWxkIGFuIGFyY2hpdmUgbWl4aW5nIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZAorICBlbnRyaWVzLgorCisqIDxqdW5pdD4ncyBYTUwgZm9ybWF0dGVyIGFkZHMgYSBuZXcgY2xhc3NuYW1lIGF0dHJpYnV0ZSB0byB0aGUgPHRlc3RjYXNlPgorICBlbGVtZW50cy4KKworKiBuZXcgPHBlcm1pc3Npb25zPiB0eXBlIGFkZCBwZXJtaXNzaW9uIGhhbmRsaW5nIHRvIHRoZSBjb2RlCisgIHRoaXMgdHlwZSBjYW4gYmUgbmVzdGVkIGluIHRoZSA8amF2YT4gYW5kIDxqdW5pdD4gdGFza3MuCisgIEJ1Z3ppbGxhIFJlcG9ydCAyMjUzMy4KKworKiBhZGRpdGlvbmFsIHNob3J0Y3V0cyBmb3IgYW50IG9wdGlvbnMgKC1kIC0tPiAtZGVidWcsIC1lIC0tPiAtZW1hY3MsCisgIC1oIC0tPiAtaGVscCwgLXAgLS0+IC1wcm9qZWN0aGVscCwgLXMgLS0+IC1maW5kKS4KKworKiBuZXcgc2VsZWN0b3IgPG1vZGlmaWVkPi4gImNhY2hlIiB3YXMgcmVuYW1lZCB0byAibW9kaWZpZWQiLgorICBCdWd6aWxsYSBSZXBvcnQgMjA0NzQuCisKKyogPHN0Y2hlY2tvdXQ+IGFuZCA8c3RsaXN0PiBoYXZlIGEgbmV3IGFzb2ZkYXRlIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZQorICB1c2VkIHRvIGNoZWNrb3V0L2xpc3QgZmlsZXMgYmFzZWQgb24gYSBkYXRlIGluc3RlYWQgb2YgYSBsYWJlbC4KKyAgQnVnemlsbGEgUmVwb3J0IDIwNTc4LgorCisqIE5ldyBmaWx0ZXIgPGNvbmNhdGZpbHRlcj4uIEFkZHMgdGhlIGNvbnRlbnQgb2YgZmlsZSBhdCB0aGUgYmVnaW5uaW5nCisgIG9yIGVuZCBvZiBhIGZpbGUuIERpc2N1c3Npb24gc3RhcnRlZCBhdAorICBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWFudC11c2VyJm09MTA2MzY2NzkxMjI4NTg1Jnc9MgorCisqIE5ldyB0YXNrIDxpbXBvcnQ+CisKKyogTmV3IHRhc2sgPG1hY3JvZGVmPgorCisqIE5ldyB0YXNrIDxwcmVzZXRkZWY+CisKKyogQW50IGxpYnJhcmllcyB0aGF0IGNhbiBtYWtlIHVzZSBvZiBuYW1lc3BhY2VzIHRvIGF2b2lkIG5hbWUKKyAgY2xhc2hlcyBvZiBjdXN0b20gdGFza3MKKworKiA8amF2YT4gYW5kIDxqdW5pdD4gbm93IHN1cHBvcnQgPGFzc2VydGlvbnM+LCB3aGljaCBsZXQgeW91IGVuYWJsZQorICBhbmQgZGlzYWJsZSBKYXZhMS40IGFzc2VydGlvbnMgb24gYSBwYWNrYWdlIG9yIGNsYXNzIGJhc2lzLiBUaGVzZQorICBvbmx5IHdvcmsgd2hlbiBmb3JrPXRydWUsIGN1cnJlbnRseS4KKworKiAuTkVUIHRhc2tzIGV4cGFuZGVkIHdpdGggVkIgc3VwcG9ydCA8dmJjPiBhbmQgSiMsIHZpYSA8anNoYXJwPiwKKyAgPGltcG9ydHR5cGVsaWI+IGFuZCA8aWxhc20+LiA8Y3NjPiBzdXBwb3J0cyBuZXN0ZWQgPHNyYz4gdHlwZXMsCisgIDxkZWZpbmVzPiBmb3IgKHBvdGVudGlhbGx5IGNvbmRpdGlvbmFsKSBkZWZpbml0aW9ucywgPHJlZmVyZW5jZT4KKyAgZmlsZXNldHMgZm9yIHJlZmVyZW5jZXMuIFRoZSBleGVjdXRhYmxlIGF0dHJpYnV0ZSBsZXRzIHlvdSBzd2l0Y2ggdG8KKyAgbW9ubyBvciBvdGhlciBpbXBsZW1lbnRhdGlvbnMgLTxjc2M+IGhhcyBiZWVuIHRlc3RlZCB3aXRoIE1vbm8gb24KKyAgTGludXggYW5kIE9TWC4KKworCitDaGFuZ2VzIGZyb20gQW50IDEuNS4zIHRvIEFudCAxLjUuNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogSWYgdGhlIFZpc3VhbCBBZ2UgdGFza3MgdXNlZCB0byB3b3JrIGZvciB5b3UsIHRoZXkgbWF5IHN0b3AgZG9pbmcgc28KKyAgbm93IC0gYW5kIHdlJ2QgbGlrZSB0byBrbm93IGFib3V0IGl0LiAgVGhlIGN1cnJlbnQgc2V0IG9mIHRhc2tzIGlzCisgIHN1cHBvc2VkIHRvIHdvcmsgd2l0aCBhbnkgdmVyc2lvbiBvZiBWQUogc3RhcnRpbmcgd2l0aCAzLjAuCisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisqIFRoZSBWaXN1YWwgQWdlIGZvciBKYXZhIHRhc2tzIGRpZG4ndCB3b3JrIChhdCBsZWFzdCBmb3IgdmVyc2lvbnMgMy4wCisgIGFuZCBoaWdoZXIpLiAgQnVnemlsbGEgUmVwb3J0IDEwMDE2LgorCisqIFVSTC1lbmNvZGluZyBpbiA8dmFqKnBvcnQ+IGRpZG4ndCB3b3JrIHByb3Blcmx5LgorCisqIFZBSlJlbW90ZVV0aWwgY2FsbGVkIGdldEFic29sdXRlUGF0aCBpbnN0ZWFkIG9mIGdldFBhdGgKKyAgY2F1c2luZyBwcm9ibGVtcyB3aGVuIHVzaW5nIGEgV2luZG93cyBWQUogc2VydmVyIGZyb20gYSBVTklYIHNlcnZlci4KKyAgQnVnemlsbGEgUmVwb3J0IDIwNDU3LgorCisqIFZBSkltcG9ydCB0YXNrIGZhaWxlZCB3aXRoIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdXNpbmcgRGlyZWN0b3J5U2Nhbm5lci4KKyAgQnVnemlsbGEgUmVwb3J0IDIyMDgwLgorCitPdGhlciBjaGFuZ2VzOgorLS0tLS0tLS0tLS0tLS0KKworKiBTaGlwcGVkIFhNTCBwYXJzZXIgaXMgbm93IFhlcmNlcyAyLjUuMAorCisqIDxqYXZhaD4gd2lsbCBpbnZva2Ugb2xkamF2YWggb24gSkRLIDEuNC4yLiAgQnVnemlsbGEgUmVwb3J0IDE4NjY3LgorCisqIFRoZSBWQUogdGFza3Mgbm93IHN1cHBvcnQgYSBoYWx0b25mYWlsdXJlIGF0dHJpYnV0ZSB0byBjb25kaXRpb25hbGx5CisgIGtlZXAgYnVpbGRpbmcgZXZlbiBpZiB0aGV5IGZhaWwuCisKKyogSXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSB0aGUgbGF0ZXN0ICh2ZXJzaW9uZWQgb3IgdW52ZXJzaW9uZWQpIGVkaXRpb24KKyAgaW4gPHZhamxvYWQ+IGJ5IHVzaW5nIHNwZWNpYWwgd2lsZGNhcmQgY2hhcmFjdGVycy4gIEFsc28gZml4ZXMKKyAgQnVnemlsbGEgUmVwb3J0IDIyMzYuCisKK0NoYW5nZXMgZnJvbSBBbnQgMS41LjIgdG8gQW50IDEuNS4zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDaGFuZ2VzIHRoYXQgY291bGQgYnJlYWsgb2xkZXIgZW52aXJvbm1lbnRzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBUaGUgPHppcD4gdGFzayBhbmQgZnJpZW5kcyBoYXZlIGFnYWluIGNoYW5nZWQgYSBtZXRob2Qgc2lnbmF0dXJlCisgIChzb3JyeSwgd2FzIG5lY2Vzc2FyeSB0byBmaXggYnVnIDE3NzgwKS4gIFRoZSByZXR1cm4gdHlwZSBvZgorICBnZXRSZXNvdXJjZXNUb0FkZCBoYXMgY2hhbmdlZC4KKworRml4ZWQgYnVnczoKKy0tLS0tLS0tLS0tCisKKyogPHppcGZpbGVzZXQ+J3MgZmlsZW1vZGUgd291bGQgZ2V0IGlnbm9yZWQgYW5kIHRoZSBkaXJtb2RlIHdhcyB1c2VkCisgIGZvciB0aGUgaW5jbHVkZWQgZmlsZXMgYXMgd2VsbC4gIEFzIGEgc2lkZSBlZmZlY3QsIFdpblpJUCB3YXMgdW5hYmxlCisgIHRvIGV4dHJhY3Qgb3IgZGlzcGxheSB0aGUgZmlsZXMsIHNvIHRoZXkgc2VlbWVkIHRvIGJlIG1pc3NpbmcgZnJvbQorICB0aGUgYXJjaGl2ZS4gIEJ1Z3ppbGxhIFJlcG9ydCAxNzY0OC4KKworKiA8ZnRwPiBjb3VsZCB1c2UgdGhlIHdyb25nIHBhdGggc2VwYXJhdG9yIHdoZW4gdHJ5aW5nIHRvIGNoYW5nZSB0aGUKKyAgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5LiAgQnVnemlsbGEgUmVwb3J0IDE3NzM1LgorCisqIDxqYXIgdXBkYXRlPSJ0cnVlIj4gd291bGQgbG9vc2UgYWxsIG9yaWdpbmFsIGZpbGVzIGlmIHlvdSBkaWRuJ3QKKyAgc3BlY2lmeSBhbnkgbmVzdGVkIDwoemlwKWZpbGVzZXQ+cyBhbmQgdGhlIG1hbmlmZXN0IGhhZCBjaGFuZ2VkLgorICBCdWd6aWxsYSBSZXBvcnQgMTc3ODAuCisKKyogSWYgeW91IHVzZWQgYSB2YWx1ZSBzdGFydGluZyB3aXRoIFwgb24gV2luZG93cyBmb3IgdGhlIGFwcHhtbAorICBhdHRyaWJ1dGUgb2YgPGVhcj4gb3IgdGhlIHdlYnhtbCBhdHRyaWJ1dGUgb2YgPHdhcj4sIGl0IHdvdWxkIGJlCisgIGlnbm9yZWQuICBCdWd6aWxsYSBSZXBvcnQgMTc4NzEuCisKKyogQW50IHdpbGwgbm8gbG9uZ2VyIGltcGxpY2l0bHkgYWRkIFN1bidzIHJ0LmphciBpbiA8amF2YWM+IHdoZW4geW91CisgIHVzZSBqdmMgYW5kIGRvbid0IHNwZWNpZnkgYSBib290Y2xhc3NwYXRoLiAgQnVnemlsbGEgUmVwb3J0IDE4MDU1LgorCisqIFRoZSBwcmVmaXggYXR0cmlidXRlIG9mIDx6aXBmaWxlc2V0PiB3b3VsZCBub3QgZ2VuZXJhdGUgZGlyZWN0b3J5CisgIGVudHJpZXMgZm9yIHRoZSBwcmVmaXggaXRzZWxmLiAgQnVnemlsbGEgUmVwb3J0IDE4NDAzLgorCisqIHN0YXJ0ZWFtIGNoZWNrb3V0IGNhbiBub3cgaGFuZGxlIGRlbGV0ZWQgbGFiZWxzLiAgQnVnemlsbGEgUmVwb3J0IDE3NjQ2LgorCisqIFRoZSBVbml4IHdyYXBwZXIgc2NyaXB0IGZhaWxlZCBpZiB5b3UgaW52b2tlZCBpdCBhcyBhIHJlbGF0aXZlCisgIHN5bWxpbmsgYW5kIEFOVF9IT01FIGhhcyBub3QgYmVlbiBzZXQuICBCdWd6aWxsYSBSZXBvcnQgMTc3MjEuCisKK090aGVyIENoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorKiBBZGRlZCBhYmlsaXR5IHRvIHNwZWNpZnkgbWFuaWZlc3QgZW5jb2RpbmcgZm9yIHRoZSA8amFyPiBhbmQKKyAgPG1hbmlmZXN0PiB0YXNrcworCitDaGFuZ2VzIGZyb20gQW50IDEuNS4xIHRvIEFudCAxLjUuMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBBTlRfT1BUUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3cgYXBwbGllZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisgIEphdmEgY29tbWFuZCBsaW5lLCBhbGxvd2luZyBwb3NpdGlvbiBzcGVjaWZpYyBwYXJhbWV0ZXJzIG9mIHNvbWUKKyAgSlZNcywgc3VjaCBhcyAtY2xhc3NpYyB0byBiZSBzcGVjaWZpZWQuCisKKyogWmlwU2Nhbm5lciNnZXRJbmNsdWRlZEZpbGVzIHdpbGwgbm93IHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIFppcEVudHJpZXMKKyAgdGhhdCBoYXZlIGJlZW4gbWF0Y2hlZCBpbnN0ZWFkIG9mIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlLgorCisqIFRoZSA8emlwPiB0YXNrIGFuZCBmcmllbmRzIGhhdmUgYmVlbiBoZWF2aWx5IG1vZGlmaWVkLCBhbG1vc3QgZXZlcnkKKyAgbWV0aG9kIHNpZ25hdHVyZSBvZiB0aGUgWmlwIGNsYXNzIGhhcyBjaGFuZ2VkLiAgSWYgeW91IGhhdmUgc3ViY2xhc3NlZAorICBaaXAgKG9yIG9uZSBvZiBpdHMgc3ViY2xhc3NlcyksIHlvdXIgY2xhc3Mgd2lsbCBtb3N0IGxpa2VseSBub3QKKyAgY29tcGlsZSBhZ2FpbnN0IHRoZSBjdXJyZW50IGNvZGUgYmFzZS4gIElmIGl0IHN0aWxsIGNvbXBpbGVzLCBpdCB3aWxsCisgIHByb2JhYmx5IG5vdCB3b3JrIGFzIGluIEFudCAxLjUuMS4KKworRml4ZWQgYnVnczoKKy0tLS0tLS0tLS0tCisqIDx0cmFuc2xhdGU+IHdhcyBub3QgaWdub3JpbmcgY29tbWVudCBsaW5lcy4KKworKiA8bWFuaWZlc3Q+IHdvdWxkbid0IHVwZGF0ZSBhbiBleGlzdGluZyBtYW5pZmVzdCBpZiBvbmx5IGFuIGF0dHJpYnV0ZQorICBvZiBhbiBleGlzdGluZyBzZWN0aW9uIGNoYW5nZWQuCisKKyogYW50LmJhdCBub3cgc3VwcG9ydHMgdGhlIEFOVF9BUkdTIGFuZCBKQVZBQ01EIGVudmlyb25tZW50IHZhcmlhYmxlcworICBhZ2FpbiAobGlrZSBBbnQgMS41IGRpZCkuCisKKyogVGhlICJwbGFpbiIgPGp1bml0PiA8Zm9ybWF0dGVyPiBjb3VsZCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uCisgIGlmIGFuIGVycm9yIG9jY3VycmVkIGluIHNldFVwLgorCisqIDxqdW5pdD4gd2lsbCBub3cgcHJvZHVjZSBvdXRwdXQgd2hlbiBhIHRlc3QgdGltZXMgb3V0IGFzIHdlbGwuCisKKyogPHJlcGxhY2U+IHdvdWxkIGNvdW50IHNvbWUgaW50ZXJuYWwgY2hhcmFjdGVyIHJlcGxhY2VtZW50cyB3aGVuCisgIHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIHJlcGxhY2VkIHRva2Vucy4KKworKiA8Y29uY2F0PiB3b3VsZCBjYXVzZSBhbiBleGNlcHRpb24gaWYgYSA8ZmlsZWxpc3Q+IHBvaW50ZWQgdG8gZmlsZXMKKyAgdGhhdCBkbyBub3QgZXhpc3QuCisKKyogPGphdmFkb2M+IHdpbGwgbm93IHBhc3MgLXNvdXJjZSB0byBjdXN0b20gZG9jbGV0cyBhcyB3ZWxsLgorCisqIDxjdnN0YWdkaWZmPiB3b3VsZCB0aHJvdyBhIE51bGxQb2ludEV4Y2VwdGlvbiBpZiB0aGVyZSBoYWQgYmVlbiBubworICBkaWZmZXJlbmNlcy4KKworKiA8Y3ZzY2hhbmdlbG9nPiBjb3VsZCBtaXNzIHRvZGF5J3MgY2hhbmdlcy4KKworKiA8Y29uY2F0PiBjb3VsZCBhcHBlbmQgbmV3bGluZSBjaGFyYWN0ZXJzIGJldHdlZW4gY29uY2F0ZW5hdGVkIGZpbGVzLgorCisqIDx4bWx2YWxpZGF0ZT4gaWdub3JlZCB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIG9mIHRoZSBmaWxlcyB0bworICB2YWxpZGF0ZS4KKworKiB0aGUgZXJyb3JzYmVnaW5hdCBhdHRyaWJ1dGUgb2YgdGhlIDxodHRwPiBjb25kaXRpb24gZGlkbid0IHdvcmsuCisKKyogQW50IHdpbGwgdHJ5IHRvIGZvcmNlIGxvYWRpbmcgb2YgY2VydGFpbiBwYWNrYWdlcyBsaWtlIGNvbS5zdW4uKgorICBmcm9tIHRoZSBzeXN0ZW0gY2xhc3Nsb2FkZXIuICBUaGUgcGFja2FnZXMgYXJlIGRldGVybWluZWQgYnkgdGhlCisgIHZlcnNpb24gb2YgdGhlIEpWTSBydW5uaW5nIEFudC4KKworKiBBbnQgZGlkbid0IGZpbmQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIG9uIElCTSdzIEpESyAxLjQgZm9yIExpbnV4LgorCisqIHJhbmRvbSBjb21wb25lbnQgb2YgdGVtcG9yYXJ5IGZpbGVzIGlzIG5vdyBhbHdheXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLgorCisqIEFudCBjb3VsZCBpbmNvcnJlY3RseSB0cnkgdG8gdXNlIHRoZSAxLjQgcmVnZXhwIGltcGxlbWVudGF0aW9uIGV2ZW4KKyAgaWYgaXQgaXNuJ3QgYXZhaWxhYmxlIGlmIHlvdSBydW4gdGhlIEpWTSB3aXRoIC1YdmVyaWZ5Om5vbmUuCisKKyogQW50IHdvdWxkIGRpZSB3aXRoIGFuIGV4Y2VwdGlvbiBpZiB5b3UgdXNlZCBuZXN0ZWQgPHJlZmVyZW5jZT4KKyAgZWxlbWVudHMgaW4gQW50IGFuZCB0aGUgcmVmaWQgYXR0cmlidXRlIGRpZG4ndCBwb2ludCB0byBhbiBleGlzdGluZworICBwcm9qZWN0IHJlZmVyZW5jZS4KKworKiBUaGUgPGdldD4gdGFzayBjYW4gbm93IGJlIGNvbXBpbGVkIChhbmQgQW50IHRodXMgYm9vdHN0cmFwcGVkKSB1c2luZworICBLYWZmZWUuCisKKyogYnVpbGQuc3lzY2xhc3NwYXRoIHdpbGwgbm93IGJlIGhvbm9yZWQgYnkgbW9yZSB0YXNrcy4KKworKiBUaGUgc2lnbmphciBrZXlzdG9yZSBhdHRyaWJ1dGUgaGFzIGJlZW4gcmV2ZXJ0ZWQgdG8gYSBTdHJpbmcgYWxsb3dpbmcKKyAgaXQgdG8gb25jZSBhZ2FpbiBhY2NlcHQgVVJMcy4gVGhpcyBzaG91bGQgbm90IGFmZmVjdCBjdXJyZW50IEZpbGUgYmFzZWQgdXNhZ2UKKyAgdW5sZXNzIHlvdSBhcmUgZXh0ZW5kaW5nIHRoZSBTaWduamFyIHRhc2suCisKKyogPGphciB1cGRhdGU9InRydWUiPiB3b3VsZCByZW1vdmUgdGhlIG9yaWdpbmFsIG1hbmlmZXN0LgorCisqIGZpeCB1cCBmb2xkZXIgY3JlYXRpb24gaW4gUFZDUyB0YXNrCisKKyogPHRhcj4ncyB1cC10by1kYXRlIGNoZWNrIGRpZG4ndCB3b3JrIGZvciBuZXN0ZWQgPCh0YXIpZmlsZXNldD5zLgorCisqIENvcnJlY3RlZCBhIHByb2JsZW0gaW4gWE1MTG9nZ2VyIHdoZXJlIGl0IHdvdWxkIG5vdCBhc3NvY2lhdGVkCisgIG1lc3NhZ2VzIHdpdGggYSB0YXNrZGVmJ2QgdGFzaworCisqIDx1cHRvZGF0ZT4gbm93IHdvcmtzIHdoZW4gdXNpbmcgYXR0cmlidXRlcyAoaS5lLiBub3QgZmlsZXNldHMpIGFuZCBwb2ludGluZworICB0byB0aGUgc2FtZSBmaWxlCisKKyogSmF2YSB0YXNrIChhbmQgb3V0cHV0IHN5c3RlbSkgbm93IHN0b3JlcyBvdXRwdXQgd2hpY2ggZG9vcyBub3QgZW5kCisgIHdpdGggYSBsaW5lIGZlZWQuCisKKyogc3BsYXNoIHNjcmVlbiB3b3VsZG4ndCBkaXNhcHBlYXIgd2hlbiBidWlsZCB3YXMgZmluaXNoZWQuCisKKyogPGV4ZWM+IG5vdyBzdXBwb3J0cyBPUy8yLgorCisqIDx6aXA+IGFuZCBmcmllbmRzIHdvdWxkIG9ubHkgdXBkYXRlL3JlY3JlYXRlIGV4aXN0aW5nIGFyY2hpdmVzIGlmCisgIHRoZSBmaWxlcyB0byBhZGQvdXBkYXRlIGhhdmUgYmVlbiBuZXdlciB0aGFuIHRoZSBhcmNoaXZlLgorCisqIDxqYXZhZG9jPidzIDxsaW5rPiBlbGVtZW50IGNvdWxkIGZhaWwgZm9yIG9mZmxpbmU9InRydWUiIG9uIHNvbWUgSkRLcy4KKworT3RoZXIgY2hhbmdlczoKKy0tLS0tLS0tLS0tLS0tCisKKyogTWFpbExvZ2dlciBub3cgc2V0cyB0aGUgRGF0ZSBoZWFkZXIgY29ycmVjdGx5LgorCisqIFNoaXBwZWQgWE1MIHBhcnNlciBpcyBub3cgWGVyY2VzIDIuMy4wCisKKyogc2lnbmphciBub3cgYWNjZXB0cyBhIG1heG1lbW9yeSBhdHRyaWJ1dGUgdG8gYWxsb3cgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhlCisgIGphcnNpZ25lciB0b29sIHRvIGJlIHNwZWNpZmllZC4gVGhlIGphcnNpZ25lciBmcm9tIHRoZSBKREsncyBKQVZBX0hPTUUgYmluCisgIGRpciBpcyBub3cgdXNlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgamFyc2lnbmVyIG9uIHRoZSBwYXRoLgorCisqICoqLy5EU19TdG9yZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IHBhdHRlcm4gZXhjbHVkZXMuCisKKyogVGhlIENyZWF0ZWQtQnkgaGVhZGVyIGluIHRoZSBkZWZhdWx0IG1hbmlmZXN0IG5vdyBjb250YWlucyB0aGUgSlZNCisgIHZlbmRvciBhbmQgdmVyc2lvbiBhY2NvcmRpbmcgdG8gdGhlIGphciBzcGVjaWZpY2F0aW9uLiBBIG5ldyBoZWFkZXIsCisgIEFudC1WZXJzaW9uIHByb3ZpZGVzIHRoZSBBbnQgdmVyc2lvbiB1c2VkIHRvIGNyZWF0ZSB0aGUgamFyLgorCisqIDx6aXA+IGNhbiBub3cgc3RvcmUgVW5peCBwZXJtaXNzaW9ucyBpbiBhIHdheSB0aGF0IGNhbiBiZQorICByZWNvbnN0cnVjdGVkIGJ5IEluZm8tWmlwJ3MgdW56aXAgY29tbWFuZC4KKworQ2hhbmdlcyBmcm9tIEFudCAxLjUuMUJldGExIHRvIDEuNS4xCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRml4ZWQgYnVnczoKKy0tLS0tLS0tLS0tCisKKyogPHRzdGFtcD4ncyBwcmVmaXggYXR0cmlidXRlIGZhaWxlZCB0byBhcHBseSB0byBuZXN0ZWQgPGZvcm1hdD4gZWxlbWVudHMuCisKKyogPGp1bml0cmVwb3J0PiBjcmVhdGVkIGFuIGVtcHR5IGp1bml0LW5vZnJhbWVzLmh0bWwgaWYgbm8gZm9ybWF0IGhhZAorICBiZWVuIHNwZWNpZmllZC4KKworKiA8YmFzZW5hbWU+IHdvdWxkIHJlbW92ZSBtb3JlIHRoYW4gaXQgc2hvdWxkIGlmIHRoZSBmaWxlIG5hbWUKKyAgY29udGFpbmVkIG1vcmUgdGhhbiBvbmUgZG90LgorCisqIDxmaWx0ZXJzZXQ+cyBuZXN0ZWQgaW50byA8ZmlsdGVyc2V0PnMgZGlkbid0IHdvcmsuCisKK090aGVyIGNoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorCisqIFNoaXBwZWQgWE1MIHBhcnNlciBpcyBub3cgWGVyY2VzIDIuMi4wCisKKyogRmlsZXNldHMgbm93IHN1cHBvcnQgYSAnZmlsZScgYXR0cmlidXRlLCBhbGxvd2luZyBhIHNpbmdsZS1maWxlCisgIGZpbGVzZXQgdG8gYmUgY29uc3RydWN0ZWQgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSBpdHMgcGFyZW50CisgIGRpcmVjdG9yeSBzZXBhcmF0ZWx5LgorCisqIDxqdW5pdD4gd2lsbCBub3cgcmV0dXJuIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvIGdldE5hbWUgaW5zdGVhZCBvZgorICAidW5rbm93biIgZm9yIFRlc3QgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QgZXh0ZW5kIFRlc3RDYXNlIGJ1dCBoYXZlCisgIGEgcHVibGljIFN0cmluZyBnZXROYW1lKCkgbWV0aG9kLgorCitDaGFuZ2VzIGZyb20gQW50IDEuNSB0byAxLjUuMUJldGExCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorKiBEYXRlL3RpbWUgaW4gQ3ZzQ2hhbmdlTG9nIHdhcyBpbiBsb2NhbCB0aW1lem9uZSBhbmQgMTIgaG91ciBmb3JtYXQgbGVhZGluZworICB0byBhIHByb2JsZW0gd2hlbiBzb3J0aW5nIGJ5IHRpbWUuIEl0IGlzIG5vdyBVVEMgKEdNVCkgYW5kIGluIDI0LWhvdXIKKyAgZm9ybWF0IGFzIHBlciBjdnMgJ3NwZWNpZmljYXRpb25zJy4KKworKiBDdnNUYWdEaWZmIG5vdyBzdXBwb3J0cyBhbXBlcnNhbmQgbW9kdWxlcyBvciBtb2R1bGVzIHRoYXQgaGF2ZSBhIGRpZmZlcmVudAorICByb290IGRpcmVjdG9yeSB0aGFuIHRoZWlyIG5hbWUuCisKKyogRWpiSmFyIHRocmV3IE5QRXMgZm9yIHRoZSBXZWJzcGhlcmUgZWxlbWVudC4gVGhlIHByb3BlcnR5ICd3ZWJzcGhlcmUuaG9tZScKKyAgd2FzIG5vdCBkb2N1bWVudGVkLgorCisqIE1haWwgZXhhbXBsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiB3YXMgbm90IGNvcnJlY3QuCisKKyogQ2hlY2tzdW0gd2FzIGJyb2tlbiBpbiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgorICAodXNpbmcgdmVyaWZ5cHJvcGVydHkgT1IgaW4gYSBjb25kaXRpb24pIEFORCB1c2luZyBmaWxlc2V0cworICB3aXRoIG11bHRpcGxlIGZpbGVzLgorCisqIFRoZSBFeHBhbmRQcm9wZXJ0aWVzIGZpbHRlciB0aHJldyBOUEVzIHdoZW4gZGVmaW5lZCB1c2luZworICB0aGUgPGZpbHRlcnJlYWRlcj4gZm9ybWF0LgorCisqIFRoZSBzaCB3cmFwcGVyIHNjcmlwdCBkaWRuJ3Qgd29yayB1bmRlciBDeWd3aW4gaWYgQU5UX0hPTUUgd2Fzbid0CisgIHNldCB3aXRoIGEgVW5peCBzdHlsZSBmaWxlbmFtZS4KKworKiBUaGUgc2ggd3JhcHBlciBzY3JpcHQgY291bGQgZmFpbCBpZiB5b3Ugc3RhcnRlZCBBbnQgZnJvbSBhIGRpcmVjdG9yeQorICB3aXRoIHdoaXRlc3BhY2UgaW4gaXRzIG5hbWUuCisKKyogYW50IC1kaWFnbm9zdGljcyB3YXMgbm90IHdvcmtpbmcgcHJvcGVybHkgd2hlbiB0aGUgdGFzayBkZXBlbmRlbmN5CisgIHdhcyBtaXNzaW5nIGFuZCB3YXMganVzdCBwcmludGluZyB0aGUgbWlzc2luZyBkZXBlbmRlbmN5LgorCisqIElmIGEgdGFzayBnb3QgcmVkZWZpbmVkIHZpYSA8dGFza2RlZj4sIGl0IGxvc3QgaXRzIGNoaWxkIGVsZW1lbnRzLgorCisqIDxwcm9wZXJ0eT4ncyBjbGFzc3BhdGhyZWYgYXR0cmlidXRlIHdhcyBicm9rZW4uCisKKyogPGFyZyBsaW5lPSInJyIgLz4gd291bGQgcmVzdWx0IGluIG5vIGNvbW1hbmQgbGluZSBhcmd1bWVudCwgd2lsbCBub3cKKyAgYmUgYSBzaW5nbGUgZW1wdHkgYXJndW1lbnQuICBVc2UgPGFyZyB2YWx1ZT0iJyciLz4gaWYgeW91IG5lZWQgdGhlCisgIHF1b3RlcyBsaXRlcmFsbHkuCisKKyogPHJlcGxhY2VyZWdleHA+IGNvdWxkIGFwcGVuZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgdGhlCisgIGZpbGUuCisKK090aGVyIGNoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorCisqIEFwcGVuZGl4IEUgb2YgSmF2YSBEZXZlbG9wbWVudCB3aXRoIEFudCAoTG91Z2hyYW4vSGF0Y2hlcikgd2FzCisgIGNvbnRyaWJ1dGVkIHRvIHRoZSBkb2NzLgorCisqIDxhdmFpbGFibGU+IHdpbGwgb25seSBwcmludCBkZXByZWNyYXRpb24gd2FybmluZ3MgaWYgaXQgaXMgYWN0dWFsbHkKKyAgdXNlZCB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuCisKK0NoYW5nZXMgZnJvbSBBbnQgMS41YmV0YTMgdG8gQW50IDEuNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFRoZSBmaWxlc2V0bWFuaWZlc3QgYXR0cmlidXRlIGFkZGVkIHRvIDxqYXI+IGFmdGVyIHRoZSAxLjQuMQorICByZWxlYXNlIGhhcyBiZWVuIHJlbW92ZWQgZm9yIG5vdy4gIFRoaXMgY2hhbmdlIG1heSBhZmZlY3Qgb25seQorICB0aGUgMS41QmV0YS8xLjZBbHBoYSB1c2Vycy4gIEFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIGFkZCB0aGlzCisgIGZlYXR1cmUgYmFjayBpbnRvIEFudCAxLjYuCisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisqIDx6aXA+IGFuZCBmcmllbmRzIHdvdWxkIGFsd2F5cyB1cGRhdGUgZXhpc3RpbmcgYXJjaGl2ZSBpZiB5b3Ugc2V0CisgIHRoZSB1cGRhdGUgYXR0cmlidXRlIHRvIHRydWUuCisKKyogVG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMsIDxwYXRoY29udmVydD4KKyAgd2lsbCBvbmNlIGFnYWluIHNldCB0aGUgcHJvcGVydHksIGV2ZW4gaWYgdGhlIHJlc3VsdCBpcyB0aGUgZW1wdHkKKyAgc3RyaW5nLCB1bmxlc3MgdGhlIG5ldyAnc2V0b25lbXB0eScgYXR0cmlidXRlIGlzIHNldCB0byBmYWxzZXxub3xvZmYKKyAgKGRlZmF1bHQgaXMgInRydWUiKS4KKworKiBUaGUgbWFuaWZlc3QgdGFzayB3b3VsZCBjcmFzaCBYbWxMb2dnZXIKKworT3RoZXIgY2hhbmdlczoKKy0tLS0tLS0tLS0tLS0tCisKKyogYWRkZWQgKiovLnN2biBhbmQgKiovLnN2bi8qKiB0byB0aGUgZGVmYXVsdCBleGNsdWRlcworCitDaGFuZ2VzIGZyb20gQW50IDEuNWJldGEyIHRvIEFudCAxLjViZXRhMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogPHB2Y3M+IGRlZmF1bHQgZmlsZW5hbWVmb3JtYXQgaGFzIGJlZW4gZGlmZmVyZW50IGZyb20gQW50IDEuNC4xLgorICBOb3cgaXQgaXMgZGlmZmVyZW50IGZyb20gMS41YmV0YTEgYW5kIDEuNWJldGEyLgorCisqIDxwYXRoY29udmVydD4gd29uJ3Qgc2V0IHRoZSBwcm9wZXJ0eSBpZiB0aGUgcmVzdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuCisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisqIDxhdmFpbGFibGU+IGNvdWxkIGZhaWwgdG8gZmluZCBmaWxlcyBvciBkaXJlY3RvcmllcyB0aGF0IGhhcHBlbiB0bworICBzdGFydCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBidXQgYXJlIG5vdCBjaGlsZHJlbiBvZgorICB0aGUgYmFzZWRpci4KKworKiBOZXN0ZWQgPHByb3BlcnR5PidzIGluc2lkZSA8YW50PiBjYW4gbm93IGJlIG92ZXJyaWRlbiBieSBzdWJzZXF1ZW50CisgIDxhbnQ+IGFuZCA8YW50Y2FsbD4gdGFza3MuCisKKyogPHhzbHQ+J3Mgb3V0cHV0dHlwZSBhdHRyaWJ1dGUgd291bGRuJ3QgZG8gYW55dGhpbmcuCisKKyogPGxpbmVjb250YWlucz4gZmlsdGVycmVhZGVyIGNvdWxkIHN3YWxsb3cgbGluZXMuCisKKyogPHNlcXVlbnRpYWw+IHVzZWQgdG8gY29uZmlndXJlIHRoZSB0YXNrcyAoc2V0IHRoZWlyIGF0dHJpYnV0ZXMpCisgIGJlZm9yZSB0aGUgZmlyc3QgdGFzayBoYXMgYmVlbiBleGVjdXRlZC4gIFRoaXMgbWVhbnMgdGhhdCBwcm9wZXJ0aWVzCisgIHRoYXQgaGF2ZSBiZWVuIHNldCBieSBuZXN0ZWQgdGFzayBzZWVtZWQgdG8gYmUgdW5zZXQgZm9yIHRoZSBvdGhlcgorICB0YXNrcyBpbiB0aGUgc2FtZSA8c2VxdWVudGlhbD4gZWxlbWVudC4KKworKiA8amF2YWM+J3Mgc291cmNlcGF0aCBzZXR0aW5nIGhhcyBiZWVuIGlnbm9yZWQgYnkgc29tZSBjb21waWxlcgorICBpbXBsZW1lbnRhdGlvbnMuCisKKyogPGphdmFkb2M+J3MgcGFja2FnZWxpc3QgYXR0cmlidXRlIGRpZG4ndCB3b3JrLgorCisqIHRoZSBwbGFpbiBtYWlsZXIgd291bGQgYWx3YXlzIHVzZSBwb3J0IDI1IGluIDxtYWlsPi4KKworKiBBbnQncyBkZWZhdWx0IGxvZ2dlciBjb3VsZCBzd2FsbG93IGVtcHR5IGxpbmVzLgorCisqIGVqYmphcidzIGlQbGFuZXQgbmVzdGVkIGVsZW1lbnQgbm93IGNhbiBwcm9jZXNzIG11bHRpcGxlIGRlc2NyaXB0b3JzLgorCisqIElQbGFuZXRFamJjIHdhcyBsb29raW5nIGluIHRoZSB3cm9uZyBwbGFjZSBmb3IgZm91ciBpaW9wIGZpbGVzLgorCisqIDxqYXZhYz4gd291bGQgcGFzcyB0aGUgLXNvdXJjZSBzd2l0Y2ggdG8gSkRLIDEuMydzIGphdmFjLCBldmVuCisgIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgaXQuCisKK090aGVyIGNoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorCisqIDxjaGVja3N1bT4gbm93IHVzZXMgYSBidWZmZXIgKG9mIGNvbmZpZ3VyYWJsZSBzaXplKS4KKworKiBUaGUgIlRyeWluZyB0byBvdmVycmlkZSB0YXNrIGRlZmluaXRpb24iIHdhcm5pbmcgaGFzIGJlZW4gZGVncmFkZWQKKyAgdG8gdmVyYm9zZSBsZXZlbCBpZiB0aGUgdHdvIHRhc2sgZGVmaW5pdGlvbnMgb25seSBkaWZmZXIgaW4gdGhlIGNsYXNzCisgIGxvYWRlciBpbnN0YW5jZSB0aGF0IGhhcyBsb2FkZWQgdGhlIGRlZmluaXRpb24uCisKKyogQWRkIGEganZtYXJncyB0byB0aGUgZWpiamFyJ3Mgd2VibG9naWMgZWxlbWVudCB0byBhbGxvdyBhZGRpdGlvbmFsCisgIGFyZ3VtZW50cyB0byBiZSBwcm92aWRlZCB0byB0aGUgVk0gcnVubmlnbiBlamJjLiBEb2N1bWVudCB0aGUKKyAganZtZGVidWdsZXZlbCBhdHRyaWJ1dGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQKKyAgaW50ZXJmYWNlIGNsYXNzZXNzIGJlaW5nIGZvdW5kIG9uIHRoZSBjbGFzc3BhdGguIERvY3VtZW50IHRoZSBuZXcKKyAgPHN5c3Byb3BlcnR5PiBlbGVtZW50IHdoaWNoIGFsbG93cyBKVk0gcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLgorICBBZGRlZCBhbiBvdXRwdXRkaXIgYXR0cmlidXRlIHRvIGFsbG93IHRoZSBkZXN0aW5hdGlvbiB0byBiZSBhCisgIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBleHBsb2RlZCBqYXIgaXMgd3JpdHRlbi4KKworKiBlamJqYXIgbm93IHN1cHBvcnRzIEJvcmxhbmQgRW50ZXJwcmlzZSBTZXJ2ZXIgNSBhbmQgSm9uYXMgMi41CisKK0NoYW5nZXMgZnJvbSBBbnQgMS41YmV0YTEgdG8gQW50IDEuNWJldGEyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDaGFuZ2VzIHRoYXQgY291bGQgYnJlYWsgb2xkZXIgZW52aXJvbm1lbnRzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBQcm9wZXJ0aWVzIHdpbGwgbm93IGJlIGV4cGFuZGVkIGluIG1haWwgbWVzc2FnZSBib2RpZXMuICBUaGlzIG1lYW5zCisgIHRoYXQgb25lICQgc2lnbiB3aWxsIGJlIHN0cmlwcGVkIGlmIHlvdXIgbWFpbCBtZXNzYWdlIGNvbnRhaW5zIHRoZSB0ZXh0ICQkLgorCisqIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4cGFuZCBubyBsb25nZXIgZXh0ZW5kcyBNYXRjaGluZ1Rhc2suCisKKyogQXZhaWxhYmxlI3NldEZpbGUgbm93IGFnYWluIHVzZXMgYSBGaWxlIGFyZ3VtZW50IGFzIGl0IGRpZCBpbiAxLjQsCisgIHRoaXMgbWF5IGJyZWFrIGVudmlyb25tZW50cyB0aGF0IGhhdmUgYmVlbiBhZGFwdGVkIHRvIHRoZSBTdHJpbmcKKyAgYXJndW1lbnQgdmVyc2lvbiBwcmVzZW50IGluIDEuNWJldGExLgorCitGaXhlZCBidWdzOgorLS0tLS0tLS0tLS0KKyogV2hlbiA8bW92ZT4gYXR0ZW1wdHMgYSByZW5hbWUsIGl0IGRlbGV0ZXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUsIGlmIGl0CisgIGV4aXN0cywgYmVmb3JlIHJlbmFtaW5nIHRoZSBzb3VyY2UgZmlsZS4gIEhvd2V2ZXIsIDxtb3ZlPiB3YXMgbm90CisgIGNoZWNraW5nIGlmIHRoZSBkZXN0aW5hdGlvbiBmaWxlIHdhcyBhY3R1YWxseSBhIGRpcmVjdG9yeSBiZWZvcmUKKyAgdHJ5aW5nIHRvIGRlbGV0ZSBpdC4KKworKiBNYWtlIENWUyBUYXNrcyB0byB3b3JrIHVuZGVyIEN5Z3dpbi4KKworKiBGaXggTGluZUNvbnRhaW5zIHRvIGhhbmRsZSBodWdlIGZpbGVzIGVsZWdhbnRseSB3aXRob3V0IGNhdXNpbmcKKyAgU3RhY2sgT3ZlcmZsb3dzLgorCisqIGlmIHlvdSBhc2sgZm9yIHRoZSAiY2xhc3NpYyIgY29tcGlsZXIgb24gSmF2YTEuNCwgeW91IGdldCB1cGdyYWRlZCB0bworICAibW9kZXJuIiBiZWNhdXNlIHRoZXJlIGlzIG5vIGNsYXNzaWMgY29tcGlsZXIgYW55IG1vcmUuCisKKyogdGhlIDxodHRwPiBjb25kaXRpb24gd2FzIHZpZXdpbmcgNDA0ICdub3QgZm91bmQnIGV4Y2VwdGlvbnMgYXMgc3VjY2Vzcy4gTm93CisgIGl0IGRlZmF1bHRzIHRvIHZpZXdpbmcgYW55IHJlc3BvbnNlID49NDAwIGFzIGFuIGVycm9yLCBhbmQgaGFzIGFuCisgIGVycm9yc0JlZ2luQXQgYXR0cmlidXRlIHlvdSBjYW4gdXNlIGlmIHlvdSB3YW50IGEgaGlnaGVyIG9yIGxvd2VyIHZhbHVlLgorCisqIDxnZXQ+IHRocm93cyBhIGJ1aWxkIGV4Y2VwdGlvbiBvbiBhbiBodHRwIGF1dGhvcml6YXRpb24gZXJyb3IsIHVubGVzcyB5b3UKKyAgaGF2ZSBzZXQgaWdub3JlZXJyb3JzIHRvIHRydWUuCisKKyogPHdzZGx0b2RvdG5ldD4gd2FzIHNwZWx0IGluIFdpbnRlbCBjYXNlOiA8V3NkbFRvRG90bmV0Pi4gSXQgaXMgbm93IGxvd2VyCisgIGNhc2UsIHRob3VnaCB0aGUgb2xkIHNwZWxsaW5nIGlzIHJldGFpbmVkIGZvciBhbnlvbmUgd2hvIHVzZWQgaXQuCisKKyogTWVyZ2luZyBvZiBNYW5pZmVzdHMgaW4gamFyIG5vdyB3b3JrcyBhcyBkb2N1bWVudGVkLgorCisqIHBhdGhzIHRoYXQgaGF2ZSBiZWVuIHNlcGFyYXRlZCBieSBjb2xvbnMgd291bGQgYmUgaW5jb3JyZWN0bHkgcGFyc2VkCisgIG9uIE5ldFdhcmUuCisKKyogcnVuYW50LnBsIG5vdyBzdXBwb3J0cyBOZXRXYXJlLgorCisqIDx0ZW1wZmlsZT4gYW5kIDxzZXRwcm94eT4gdGFza3Mgd2VyZSBpbiBiZXRhMSwgYnV0IG5vdCBkZWZpbmVkIGJ5CisgIGRlZmF1bHQ7IFRoZXkgbm93IGFyZS4gPHRlbXBmaWxlPiBmaWxscyBhIHByb3BlcnR5IHdpdGggdGhlIG5hbWUgb2YgYQorICB0ZW1wb3JhcnkgZmlsZTsgPHNldHByb3h5PiBsZXRzIHlvdSBzZXQgdGhlIEpWTSdzIGh0dHAsIGZ0cCBhbmQgc29ja3MgcHJveHkKKyAgc2V0dGluZ3MuCisKKyogPGF2YWlsYWJsZSBjbGFzc25hbWU9ImZvbyIgaWdub3Jlc3lzdGVtY2xhc3Nlcz0idHJ1ZSI+IGZhaWxlZCBmb3IKKyAgSkRLIDEuMSBhbmQgMS4yLCBldmVuIGlmIHRoZSBjbGFzcyBjb3VsZCBiZSBmb3VuZCBvbiB0aGUKKyAgdXNlci1zcGVjaWZpZWQgY2xhc3NwYXRoLgorCisqIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0uLi4gLz4gbm93IHdvcmtzIG9uIHovT1MuCisKKyogZm9ya2VkIDxqYXZhYz4gZmFpbGVkIGZvciB0aGUgd3JvbmcgcmVhc29uIG9uIEpESyAxLjEgLSBBbnQgd291bGQKKyAgdXNlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gaG9sZCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRvIGNvbXBpbGUgdW5kZXIKKyAgc29tZSBjb25kaXRvbnMsIGJ1dCAxLjEgZG9lc24ndCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gIEFudCB3aWxsIG5vCisgIGxvbmdlciB0cnkgdGhpcywgYnV0IHlvdSBtYXkgcnVuIGludG8gcHJvYmxlbXMgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZQorICBjb21tYW5kIGxpbmUgbm93LgorCisqIHRoZSByZWZpZCBhdHRyaWJ1dGUgZm9yIDxwcm9wZXJ0eT5zIG5lc3RlZCBpbnRvIDxhbnQ+IG9yIDxwYXJhbT5zCisgIG5lc3RlZCBpbnRvIDxhbnRjYWxsPiBkaWRuJ3Qgd29yay4KKworKiA8cmVwbGFjZXJlZ2V4cD4gZGlkbid0IHdvcmsgZm9yIG5lc3RlZCA8ZmlsZXNldD5zLgorCisqIDxqYXZhZG9jPiBkcm9wcGVkIHNvdXJjZXBhdGggZW50cmllcyBpZiBubyAiaW50ZXJlc3RpbmciIC5qYXZhCisgIHNvdXJjZSBmaWxlcyAgY291bGQgYmUgZm91bmQgYmVsb3cgdGhlbS4gIFRoaXMgaGFzIGJlZW4gYmFja3dhcmRzCisgIGluY29tcGF0aWJsZSBhbmQgY2F1c2VkIHByb2JsZW1zIHdpdGggY3VzdG9tIGRvY2xldHMgbGlrZSB4ZG9jbGV0LgorCisqIFVzaW5nIHRoZSBkb2NsZXQsIGRvY2xldHBhdGggb3IgZG9jbGV0cGF0aHJlZiBhdHRyaWJ1dGVzIG9mCisgIDxqYXZhZG9jPiBtYXkgaGF2ZSBjYXVzZWQgTnVsbFBvaW50ZXJFeGNlcHRpb25zLgorCisqIG5lc3RlZCA8ZmlsZXNldHM+IG9mIDxqYXZhZG9jPiB3b3VsZCBpbmNsdWRlIHRvbyBtdWNoLgorCisqIDxkZXBlbmRzZXQ+IHdpbGwgbm8gbG9uZ2VyIGNob2tlIG9uIDx0YXJnZXRmaWxlc2V0PnMgdGhhdCBwb2ludCB0bworICBub24tZXhpc3RpbmcgZGlyZWN0b3JpZXMuCisKKyogPHBhdGNoPiBkaWRuJ3Qgd29yayBhdCBhbGwuCisKKyogPHJlcGxhY2U+IGFuZCA8cmVwbGFjZXJlZ2V4cD4gbm93IGZhaWwgaWYgdGhlIGZpbGUgdGhleSBhcmUgd29ya2luZworICBvbiBpcyBsb2NrZWQuCisKKyogPGphdmFkb2M+IHdvdWxkIHBpY2sgdXAgdGhlIHdyb25nIGV4ZWN1dGFibGUgaW4gdGhlIGNvbWJpbmF0aW9uIEpESworICAxLjIgYW5kIEFJWC4KKworT3RoZXIgY2hhbmdlczoKKy0tLS0tLS0tLS0tLS0tCisKKyogei9PUyBub3cgZ2V0cyBkZXRlY3RlZCBieSB0aGUgb3MgY29uZGl0aW9uLgorCisqIDxmaWxlc2V0PiBhbmQgPGRpcnNldD4gbm93IGhhdmUgYW4gb3B0aW9uYWwgZm9sbG93c3ltbGluayBhdHRyaWJ1dGUKKyAgdGhhdCBjYW4gcHJldmVudCBBbnQgZnJvbSBmb2xsb3dpbmcgc3ltYm9saWMgbGlua3Mgb24gc29tZSBwbGF0Zm9ybXMuCisKKyogQmVhblNoZWxsIGlzIG5vdyBzdXBwb3J0ZWQgaW4gdGhlIDxzY3JpcHQ+IHRhc2suCisKKyogPGVqYmphcj4gdW5kZXIgV2VibG9naWMgYXR0ZW1wdHMgdG8gdXNlIHRoZSBlamJjMjAgY29tcGlsZXIgZm9yIDIuMCBiZWFucworICBiYXNlZCBvbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yJ3MgRFREIHJlZmVyZW5jZS4gVW5kZXIgd2VibG9naWMgNy4wMCBCZXRhCisgIHRoaXMgZWpiYyBjbGFzcyBoYXMgYmVlbiBkZXByZWNhdGVkLiBUbyBhdm9pZCB0aGUgZGVwcmVjYXRpb24gd2FybmluZyB1c2UKKyAgZWpiY2NsYXNzPSJ3ZWJsb2dpYy5lamJjIi4KKworKiA8ZWpiamFyPiB3aWxsIGFkZCBhIG1hbmlmZXN0IHRvIHRoZSBnZW5lcmF0ZWQgamFyIGJhc2VkIG9uIHRoZSBuYW1pbmcKKyAgY29udmVudGlvbiBpbiB1c2UuIFRoaXMgb3ZlcnJpZGVzIHRoZSBtYW5pZmVzdCBzcGVjaWZpZWQgaW4gdGhlCisgIDxlamJqYXI+IGF0dHJpYnV0ZQorCisKK0NoYW5nZXMgZnJvbSBBbnQgMS40LjEgdG8gMS41YmV0YTEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogSW1wb3J0YW50OiBTaW5nbGUgJCBzaWducyBhcmUgbm8gbG9uZ2VyIHNpbGVudGx5IHN0cmlwcGVkIQorICBCZWZvcmUgeW91IHBhbmljIHRoYXQgd2UgaGF2ZSBicm9rZW4gYWxsIHlvdXIgYnVpbGQgZmlsZXMsIHdlIGhhdmUga2VwdAorICB0aGUgb2xkICIkJCIgLT4gIiQiIGJlaGF2aW91ci4gU28gb25seSBidWlsZCBmaWxlcyB3aGljaCBhY2NpZGVudGFsbHkgaGFkCisgIGEgJCBzaWduIGluIGEgc3RyaW5nIHRoYXQgd2FzIGJlaW5nIHNpbGVudGx5IHN0cmlwcGVkIG1heSBicmVhay4KKyAgV2UgYWRkZWQgdGhpcyBmaXggdG8gc3RvcCBuZXdiaWUgY29uZnVzaW9uOyBpZiB5b3Ugd2FudCB0byB3cml0ZSBhCisgIGJ1aWxkIGZpbGUgd2hpY2ggd29ya3Mgb24gYW50IHZlcnNpb25zIDEuNC4xIG9yIGVhcmxpZXIsIHN0YXkgd2l0aAorICB0aGUgZG91YmxlICQkIHNpZ24gcnVsZS4KKworKiBQcm9qZWN0LmdldEJ1aWxkTGlzdGVuZXJzIG5vdyByZXR1cm5zIGEgY2xvbmUgb2YgdGhlIGxpc3RlbmVyCisgIGxpc3QuIENoYW5nZXMgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBub3QgYWZmZWN0IHRoZSBsaXN0ZW5lcnMKKyAgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSBQcm9qZWN0LiBJdCBhbHNvIG1lYW5zIHRoYXQgaXQgaXMgc2FmZSB0bworICBpdGVyYXRlIG92ZXIgdGhlIHJldHVybmVkIGxpc3QgaWYgbGlzdGVuZXJzIGFyZSBhZGRlZCBvciByZW1vdmVkCisgIGR1cmluZyB0aGUgdHJhdmVyc2FsLgorCisqIDxwdmNzPiBkZWZhdWx0IGZpbGVuYW1lZm9ybWF0IGhhcyBiZWVuIGRpZmZlcmVudCBmcm9tIEFudCAxLjQuMS4KKworKiBTb21lIG1lc3NhZ2VzIHRoYXQgYXJlIHByaW50ZWQgZHVyaW5nIHN0YXJ0dXAgd2lsbCBub3QgYmUKKyAgd3JpdHRlbiB0byB0aGUgbG9nZmlsZSBzcGVjaWZpZWQgdmlhIC1sb2dmaWxlIGFzIHRoZXkgbWlnaHQgZGVzdHJveQorICB0aGUgZm9ybWF0IG9mIHRoZSBmaWxlIGZvciBzcGVjaWFsIEJ1aWxkTG9nZ2VycyAobGlrZSBYbWxMb2dnZXIpLgorCisqIFRoZSBmaWxlc2V0bWFuaWZlc3QgYXR0cmlidXRlIGFkZGVkIHRvIDxqYXI+IGFmdGVyIHRoZSAxLjQuMQorICByZWxlYXNlIGhhcyBiZWVuIHJlbW92ZWQgZm9yIG5vdy4gIFRoaXMgY2hhbmdlIG1heSBhZmZlY3Qgb25seQorICB0aGUgMS41QmV0YS8xLjZBbHBoYSB1c2Vycy4gIEFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIGFkZCB0aGlzCisgIGZlYXR1cmUgYmFjayBpbnRvIEFudCAxLjYuCisqIFNoaXBwZWQgWE1MIHBhcnNlciBpcyBub3cgWGVyY2VzIDIuMC4xIGFsb25nIHdpdGggdGhlIFhNTCBQYXJzZXIgQVBJcy4KKyAgWE1MIFBhcnNlciBBUElzIGlzIGEgc2VwYXJhdGUgamFyIHRoYXQgY29udGFpbnMgdGhlIG5lY2Vzc2FyeQorICBKQVhQL0RPTS9TQVggY2xhc3Nlcy4KKworKiA8dGVsbmV0PiB3YXMgZml4ZWQgdG8gZXhwYW5kIHByb3BlcnRpZXMgaW5zaWRlIG5lc3RlZCA8cmVhZD4gYW5kCisgIDx3cml0ZT4gZWxlbWVudHM7IGJlZm9yZSB0aGlzIG9ubHkgaGFwcGVuZWQgd2hlbiB5b3UgYXNzaWduZWQgdGhlIHRleHQKKyAgdG8gdGhlIHN0cmluZyBhdHRyaWJ1dGUuIElmIHlvdSBoYWQgJCBzaWducyBpbiB0aGUgc3RyaW5nLCB0aGV5IG1heQorICBuZWVkIGVzY2FwaW5nLgorCisqIHRoZSBSZWdleHBNYXRjaGVyIGludGVyZmFjZSBoYXMgYmVlbiBleHRlbmRlZCB0byBzdXBwb3J0IGNhc2UKKyAgaW5zZW5zaXRpdmUgbWF0Y2hlcyBhbmQgb3RoZXIgb3B0aW9ucyAtIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgb2YKKyAgdGhpcyBpbnRlcmZhY2Ugd29uJ3Qgd29yayBhbnkgbG9uZ2VyLiAgV2UgcmVjb21tZW5kIHRvIHVzZSB0aGUgbmV3CisgIFJlZ2V4cCBpbnRlcmZhY2UgdGhhdCBhbHNvIHN1cHBvcnRzIHN1YnN0aXR1dGlvbiBpbnN0ZWFkIG9mIHRoZQorICBSZWdleHBNYXRjaGVyIGludGVyZmFjZSBpbiB0aGUgZnV0dXJlLgorCisqIDxnemlwPiB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB5b3VyIHNyYyBhdHRyaWJ1dGUgcG9pbnRzIHRvIGEgZGlyZWN0b3J5LgorCisqIFVuamFyLCBVbnppcCBhbmQgVW53YXIgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIFNyYyBhdHRyaWJ1dGUKKyAgcmVwcmVzZW50cyBhIGRpcmVjdG9yeS4gIFN1cHBvcnQgZm9yIG5lc3RlZCBmaWxlc2V0cyBpcyBwcm92aWRlZAorICBpbnN0ZWFkLgorCisqIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBvdmVyd3JpdGUgYSBwcm9wZXJ0eSB1c2luZyB0YXNrcyBsaWtlCisgIDxjb25kaXRpb24+LCA8ZXhlYz4sIDxwYXRoY29udmVydD4sIG9yIDx0c3RhbXA+LiBJbiBzb21lIGV4Y2VwdGlvbmFsCisgIGNhc2VzIGl0IHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nIGlmIHlvdSBhdHRlbXB0IHRvIG92ZXJ3cml0ZSBhbgorICBleGlzdGluZyBwcm9wZXJ0eS4KKworKiBUYXNrd3JpdGVycyBwbGVhc2Ugbm90ZTogV2hlbmV2ZXIgdGFza3MgaGFkIGFueSBvdmVybG9hZGVkIHNldCogbWV0aG9kcywKKyAgQW50J3MgaW50cm9zcGVjdGlvbiBtZWNoYW5pc20gd291bGQgc2VsZWN0IHRoZSBsYXN0IG92ZXJsb2FkZWQgbWV0aG9kCisgIHByb3ZpZGVkIHRvIGl0IGJ5IHRoZSBKYXZhIFJ1bnRpbWUuICBBIG1vZGlmaWNhdGlvbiBoYXMgbm93IGJlZW4gbWFkZSBzdWNoCisgIHRoYXQgd2hlbiB0aGUgSmF2YSBSdW50aW1lIHByb3ZpZGVzIGEgbWV0aG9kIHdpdGggYSBTdHJpbmcgYXMgaXRzIGFyZ3VtZW50LAorICBhIGNoZWNrIGlzIG1hZGUgdG8gc2VlIGlmIHRoZXJlIGlzIGFub3RoZXIgb3ZlcmxvYWRlZCBtZXRob2QgdGhhdCB0YWtlcyBpbgorICBzb21lIG90aGVyIHR5cGUgb2YgYXJndW1lbnQuICBJZiB0aGVyZSBpcyBvbmUgc3VjaCBtZXRob2QsIHRoZW4gdGhlIG1ldGhvZAorICB0aGF0IHRha2VzIGluIFN0cmluZyBhcyBhbiBhcmd1bWVudCBpcyBub3Qgc2VsZWN0ZWQgYnkgdGhlIEludHJvc3BlY3Rvci4KKworKiBUaGUgcGF0dGVybiBkZWZpbml0aW9uICoqLy5fKiBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBEZWZhdWx0CisgIEV4Y2x1ZGVzIGxpc3QuCisKKyogPHByb3BlcnR5ZmlsZT4ncyA8ZW50cnk+IGVsZW1lbnQgd2FzIG1vZGlmaWVkIHRvIHJlbW92ZSAibmV2ZXIiIGFzIGEgdmFsdWUKKyAgYXMgaXRzIGJlaGF2aW9yIHdhcyB1bmRvY3VtZW50ZWQgYW5kIGZsYWtleS4KKworKiBUaGUgLXByb2plY3RoZWxwIGZsYWcgbm93IG9ubHkgcHJpbnRzIG91dCB0YXJnZXRzIHRoYXQgaW5jbHVkZSB0aGUKKyAgJ2Rlc2NyaXB0aW9uJyBhdHRyaWJ1dGUsIHVubGVzcyB0aGUgLXZlcmJvc2Ugb3IgLWRlYnVnIGZsYWcgaXMgaW5jbHVkZWQKKyAgb24gdGhlIEFudCBjb21tYW5kIGxpbmUuCisKKyogQW50J3MgdGVzdGNhc2VzIG5vdyByZXF1aXJlIEpVbml0IDMuNyBvciBhYm92ZSwgYXMgdGhleSBub3cgdXNlIHRoZSBuZXcKKyAgYXNzZXJ0VHJ1ZSBtZXRob2QgaW5zdGVhZCBvZiBhc3NlcnQuCisKKyogSWYgdGhlICdvdXRwdXQnIGF0dHJpYnV0ZSBvZiA8YW50PiBpcyBzZXQgdG8gYSBzaW1wbGUgZmlsZW5hbWUgb3IgYQorICByZWxhdGl2ZSBwYXRoLCB0aGUgZmlsZSBpcyBjcmVhdGVkIHJlbGF0aXZlIHRvICR7YmFzZWRpcn0sIG5vdCAke3VzZXIuZGlyfS4KKworKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYnVpbGQuY29tcGlsZXIgaXMgbm93IGphdmFjMS54IHdpdGggeAorICBkZXBlbmRpbmcgb24gdGhlIEpESyB0aGF0IGlzIHJ1bm5pbmcgQW50IGluc3RlYWQgb2YgY2xhc3NpYy9tb2Rlcm4uCisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisqIDxhdmFpbGFibGU+IGNvdWxkIGZhaWwgdG8gZmluZCBmaWxlcyBvciBkaXJlY3RvcmllcyB0aGF0IGhhcHBlbiB0bworICBzdGFydCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBidXQgYXJlIG5vdCBjaGlsZHJlbiBvZgorICB0aGUgYmFzZWRpci4KKworKiBOZXN0ZWQgPHByb3BlcnR5PidzIGluc2lkZSA8YW50PiBjYW4gbm93IGJlIG92ZXJyaWRlbiBieSBzdWJzZXF1ZW50CisgIDxhbnQ+IGFuZCA8YW50Y2FsbD4gdGFza3MuCisKKyogPHhzbHQ+J3Mgb3V0cHV0dHlwZSBhdHRyaWJ1dGUgd291bGRuJ3QgZG8gYW55dGhpbmcuCisKKyogPGxpbmVjb250YWlucz4gZmlsdGVycmVhZGVyIGNvdWxkIHN3YWxsb3cgbGluZXMuCisKKyogPHNlcXVlbnRpYWw+IHVzZWQgdG8gY29uZmlndXJlIHRoZSB0YXNrcyAoc2V0IHRoZWlyIGF0dHJpYnV0ZXMpCisgIGJlZm9yZSB0aGUgZmlyc3QgdGFzayBoYXMgYmVlbiBleGVjdXRlZC4gIFRoaXMgbWVhbnMgdGhhdCBwcm9wZXJ0aWVzCisgIHRoYXQgaGF2ZSBiZWVuIHNldCBieSBuZXN0ZWQgdGFzayBzZWVtZWQgdG8gYmUgdW5zZXQgZm9yIHRoZSBvdGhlcgorICB0YXNrcyBpbiB0aGUgc2FtZSA8c2VxdWVudGlhbD4gZWxlbWVudC4KKworKiA8amF2YWM+J3Mgc291cmNlcGF0aCBzZXR0aW5nIGhhcyBiZWVuIGlnbm9yZWQgYnkgc29tZSBjb21waWxlcgorICBpbXBsZW1lbnRhdGlvbnMuCisKKyogPGphdmFkb2M+J3MgcGFja2FnZWxpc3QgYXR0cmlidXRlIGRpZG4ndCB3b3JrLgorCisqIHRoZSBwbGFpbiBtYWlsZXIgd291bGQgYWx3YXlzIHVzZSBwb3J0IDI1IGluIDxtYWlsPi4KKworKiBBbnQncyBkZWZhdWx0IGxvZ2dlciBjb3VsZCBzd2FsbG93IGVtcHR5IGxpbmVzLgorCisqIGVqYmphcidzIGlQbGFuZXQgbmVzdGVkIGVsZW1lbnQgbm93IGNhbiBwcm9jZXNzIG11bHRpcGxlIGRlc2NyaXB0b3JzLgorCisqIElQbGFuZXRFamJjIHdhcyBsb29raW5nIGluIHRoZSB3cm9uZyBwbGFjZSBmb3IgZm91ciBpaW9wIGZpbGVzLgorCisqIDxqYXZhYz4gd291bGQgcGFzcyB0aGUgLXNvdXJjZSBzd2l0Y2ggdG8gSkRLIDEuMydzIGphdmFjLCBldmVuCisgIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgaXQuCisKKyogPHppcD4gYW5kIGZyaWVuZHMgd291bGQgYWx3YXlzIHVwZGF0ZSBleGlzdGluZyBhcmNoaXZlIGlmIHlvdSBzZXQKKyAgdGhlIHVwZGF0ZSBhdHRyaWJ1dGUgdG8gdHJ1ZS4KKworKiBUbyBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucywgPHBhdGhjb252ZXJ0PgorICB3aWxsIG9uY2UgYWdhaW4gc2V0IHRoZSBwcm9wZXJ0eSwgZXZlbiBpZiB0aGUgcmVzdWx0IGlzIHRoZSBlbXB0eQorICBzdHJpbmcsIHVubGVzcyB0aGUgbmV3ICdzZXRvbmVtcHR5JyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGZhbHNlfG5vfG9mZgorICAoZGVmYXVsdCBpcyAidHJ1ZSIpLgorCisqIFRoZSBtYW5pZmVzdCB0YXNrIHdvdWxkIGNyYXNoIFhtbExvZ2dlcgorCisqIEEgYnVnIGV4aXN0ZWQgdGhhdCBwcmV2ZW50ZWQgZ2VuZXJhdGVkIGxvZyBmaWxlcyBmcm9tIGJlaW5nIGRlbGV0ZWQgYXMKKyAgcGFydCBvZiB0aGUgYnVpbGQgcHJvY2VzcyBpdHNlbGYuICBUaGlzIGhhcyBub3cgYmVlbiBmaXhlZC4KKworKiBGaXhlZCBidWcgd2hlcmUgPG1vdmU+IGlnbm9yZWQgPGZpbHRlcnNldD5zLgorCisqIEFudCB3b3JrcyBwcm9wZXJseSB3aXRoIHRoZSBjb21iaW5hdGlvbiBvZiBKYXZhMS40L1dpbmRvd3NYUC4KKworKiBGaXhlZCBidWcgd2hlcmUgPGphdmE+IHVzZWQgdG8gc29tZXRpbWVzIGludm9rZSBjbGFzcyBjb25zdHJ1Y3RvcnMgdHdpY2UuCisKKyogRml4ZWQgYnVnIHdpdGggNE5UIHNoZWxsIHN1cHBvcnQuCisKKyogRml4ZWQgYnVnIHdoZXJlIGFudCB3b3VsZCBub3QgcGVyZm9ybSBmdHAgd2l0aG91dCByZW1vdGVkaXIgYmVpbmcKKyAgc3BlY2lmaWVkIGV2ZW4gdGhvdWdoIHRoaXMgd2FzIG5vdCBtYW5kYXRvcnkuCisKKyogRml4ZWQgYnVnIHdoZXJlIGFudCB3b3VsZCBub3QgY29weSBzeXN0ZW0gcHJvcGVydGllcyBpbnRvIG5ldyBQcm9qZWN0CisgIGluIGFudC9hbnRjYWxsIHRhc2tzIHdoZW4gaW5oZXJpdGFsbD0iZmFsc2UiIGlzIHNldC4KKworKiA8cHJvcGVydHlmaWxlPiB3b3VsZCBub3QgY2xvc2UgdGhlIG9yaWdpbmFsIHByb3BlcnR5IGZpbGUuCisKKyogPGFudD4gd2lsbCBubyBsb25nZXIgb3ZlcnJpZGUgYSBzdWJidWlsZCdzIGJhc2VkaXIgd2l0aCBpbmhlcml0YWxsPSJ0cnVlIi4KKworKiBGaXhlZCBwcm9ibGVtIHdpdGggdGhlIGJ1aWx0LWluIDxqdW5pdD4gZm9ybWF0dGVycyB3aGljaCBhc3N1bWVkCisgIHRoYXQgb25seSBvbmUgdGVzdCBjb3VsZCBiZSBydW5uaW5nIGF0IHRoZSBzYW1lIHRpbWUgLSB0aGlzIGlzIG5vdAorICBuZWNlc3NhcmlseSB0cnVlLCBzZWUganVuaXQuZXh0ZW5zaW9ucy5BY3RpdmVUZXN0U3VpdGUuCisKKyogPGphcj4ncyB3aGVuRW1wdHkgYXR0cmlidXRlIGlzIHVzZWxlc3MgYXMgSkFScyBhcmUgbmV2ZXIgZW1wdHksIHRoZXkKKyAgY29udGFpbiBhdCBsZWFzdCBhIG1hbmlmZXN0IGZpbGUsIHRoZXJlZm9yZSBpdCB3aWxsIG5vdyBwcmludCBhCisgIHdhcm5pbmcgYW5kIGRvIG5vdGhpbmcuCisKKyogPHR5cGVkZWY+IGhhc24ndCBiZWVuIGFsbCB0aGF0IHVzZWZ1bCBhcyBpdCBjb3VsZG4ndCBiZSB1c2VkIG91dHNpZGUKKyAgb2YgdGFyZ2V0cyAoaXQgY2FuIG5vdykgYW5kIG5lc3RlZCAidW5rbm93biIgZWxlbWVudHMgaGF2ZSBhbHdheXMKKyAgYmVlbiBjb25zaWRlcmVkIHRvIGJlIHRhc2tzIChjaGFuZ2VkIGFzIHdlbGwpLgorCisqIDxmaXhjcmxmPiB3b3VsZCBmYWlsIGZvciBmaWxlcyB0aGF0IGNvbnRhaW5lZCBsaW5lcyBsb25nZXIgdGhhbiA4a0IuCisKKyogU29tZSBqdW5pdCBmb3JtYXR0ZXJzIGluY29ycmVjdGx5IGFzc3VtZWQgdGhhdCBhbGwgdGVzdGNhc2VzIHdvdWxkCisgIGluaGVyaXQgZnJvbSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuCisKKyogPGZpeGNybGY+IGRyb3BwZWQgdGhlIGZpcnN0IGNoYXJhY3RlcnMgZnJvbSBNYWMgZmlsZXMuCisKK090aGVyIGNoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorCisqIDxjaGVja3N1bT4gbm93IHVzZXMgYSBidWZmZXIgKG9mIGNvbmZpZ3VyYWJsZSBzaXplKS4KKworKiBUaGUgIlRyeWluZyB0byBvdmVycmlkZSB0YXNrIGRlZmluaXRpb24iIHdhcm5pbmcgaGFzIGJlZW4gZGVncmFkZWQKKyAgdG8gdmVyYm9zZSBsZXZlbCBpZiB0aGUgdHdvIHRhc2sgZGVmaW5pdGlvbnMgb25seSBkaWZmZXIgaW4gdGhlIGNsYXNzCisgIGxvYWRlciBpbnN0YW5jZSB0aGF0IGhhcyBsb2FkZWQgdGhlIGRlZmluaXRpb24uCisKKyogQWRkIGEganZtYXJncyB0byB0aGUgZWpiamFyJ3Mgd2VibG9naWMgZWxlbWVudCB0byBhbGxvdyBhZGRpdGlvbmFsCisgIGFyZ3VtZW50cyB0byBiZSBwcm92aWRlZCB0byB0aGUgVk0gcnVubmlnbiBlamJjLiBEb2N1bWVudCB0aGUKKyAganZtZGVidWdsZXZlbCBhdHRyaWJ1dGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQKKyAgaW50ZXJmYWNlIGNsYXNzZXNzIGJlaW5nIGZvdW5kIG9uIHRoZSBjbGFzc3BhdGguIERvY3VtZW50IHRoZSBuZXcKKyAgPHN5c3Byb3BlcnR5PiBlbGVtZW50IHdoaWNoIGFsbG93cyBKVk0gcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLgorICBBZGRlZCBhbiBvdXRwdXRkaXIgYXR0cmlidXRlIHRvIGFsbG93IHRoZSBkZXN0aW5hdGlvbiB0byBiZSBhCisgIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBleHBsb2RlZCBqYXIgaXMgd3JpdHRlbi4KKworKiBlamJqYXIgbm93IHN1cHBvcnRzIEJvcmxhbmQgRW50ZXJwcmlzZSBTZXJ2ZXIgNSBhbmQgSm9uYXMgMi41CisKKyogYWRkZWQgKiovLnN2biBhbmQgKiovLnN2bi8qKiB0byB0aGUgZGVmYXVsdCBleGNsdWRlcy4KKworKiBTZWxlY3RvciBFbGVtZW50cyBub3cgcHJvdmlkZSBhIHdheSB0byBjcmVhdGUgZmlsZXNldHMgYmFzZWQgb24KKyAgc29waGlzdGljYXRlZCBzZWxlY3Rpb24gY3JpdGVyaWEuCisKKyogR3ppcCBhbmQgQnppcDIgZmlsZXMgY2FuIG5vdyBiZSBjb25zdHJ1Y3RlZCBpbiB0aGUgZmx5IHdoZW4gdXNpbmcKKyAgdGhlIHRhciB0YXNrIHdpdGhvdXQgaGF2aW5nIHRvIGNyZWF0ZSB0aGUgaW50ZXJtZWRpYXRlIHRhciBmaWxlIG9uCisgIGRpc2suICBUaGUgVW50YXIgdGFzayBjYW4gYWxzbyB1bnRhciBHWmlwIGFuZCBCWmlwMiBmaWxlcyBvbiB0aGUgZmx5CisgIHdpdGhvdXQgY3JlYXRpbmcgdGhlIGludGVybWVkaWF0ZSB0YXIgZmlsZS4KKworKiBOZXcgb3B0aW9uYWwgdHlwZSwgPGNsYXNzZmlsZXNldD4gYWRkZWQuCisKKyogPGVqYmphcj4gbm93IGFsbG93cyBjb250cm9sIG92ZXIgd2hpY2ggYWRkaXRpb25hbCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCisgIGFyZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIEVKQiBqYXJzLiBBIG5ldyBhdHRyaWJ1dGUgImRlcGVuZGVuY3kiIGNhbiBiZQorICBkZWZpbmVkIHdoaWNoIGNvbnRyb2xzIHdoYXQgY2xhc3NlcyBhcmUgYWRkZWQuIFRoZSBhZGRpdGlvbiBvZiBjbGFzc2VzIG5vdworICB1c2VzIHRoZSBKYWthcnRhLUJDRUwgbGlicmFyeSByYXRoZXIgdGhhbiByZWZsZWN0aW9uLCBtZWFuaW5nIGJlYW4gY2xhc3NlcyBhcmUKKyAgbm8gbG9uZ2VyIGxvYWRlZCBpbnRvIEFudCdzIEpWTS4gVGhlIGRlZmF1bHQgZGVwZW5kZW5jeSBhbmFseXplciBpcyBrbm93biBhcworICB0aGUgYW5jZXN0b3IgYW5hbHl6ZXIuIEl0IHByb3ZpZGVzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB0aGUgMS40LjEgdmVyc2lvbiBvZgorICA8ZWpiamFyPi4gSWYgdGhlIEJDRUwgbGlicmFyeSBpcyBub3QgcHJlc2VudCwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIHN0YXRpbmcKKyAgdGhlIGFuY2VzdG9yIGFuYWx5emVyIGlzIG5vdCBhdmFpbGFibGUuIEluIHRoaXMgY2FzZSA8ZWpiamFyPiB3aWxsIGNvbnRpbnVlCisgIHRvIGZ1bmN0aW9uIGJ1dCB3aWxsIG5vdCBhZGQgc3VwZXIgY2xhc3NlcyB0byB0aGUgamFyLgorCisqIDxhdmFpbGFibGU+IGhhcyBhIG5ldyBhdHRyaWJ1dGUgbmFtZWQgaWdub3JlU3lzdGVtQ2xhc3Nlcy4KKworKiBOZXcgdGFzayA8Y3ZzY2hhbmdlbG9nLz4gZ2VuZXJhdGVzIGFuIFhNTCByZXBvcnQgb2YgY2hhbmdlcyB0aGF0IG9jY3VyCisgIG9uIENWUyByZXBvc2l0b3J5LgorCisqIE5ldyBmaWx0ZXIgcmVhZGVyczogQ2xhc3NDb25zdGFudHMsIEV4cGFuZFByb3BlcnRpZXMsIEhlYWRGaWx0ZXIsCisgIExpbmVDb250YWlucywgTGluZUNvbnRhaW5zUmVnRXhwLCBQcmVmaXhMaW5lcywgUmVwbGFjZVRva2VucywKKyAgU3RyaXBKYXZhQ29tbWVudHMsIFN0cmlwTGluZUJyZWFrcywgU3RyaXBMaW5lQ29tbWVudHMsIFRhYnNUb1NwYWNlcywKKyAgVGFpbEZpbHRlci4KKworKiA8Y29weT4sIDxsb2FkZmlsZT4sIDxsb2FkcHJvcGVydGllcz4sIDxtb3ZlPiBzdXBwb3J0IEZpbHRlckNoYWlucworICBvZiBGaWx0ZXJSZWFkZXJzLgorCisqIE5ldyB0YXNrIDxsb2FkcHJvcGVydGllcz4gdG8gbG9hZCBjb250ZW50cyBvZiBmaWxlIGFzIEFudCBwcm9wZXJ0aWVzLAorICB3aXRoIG5lc3RlZCA8ZmlsdGVyY2hhaW4+IGVsZW1lbnRzLgorCisqIE5ldyB0YXNrIDxsb2FkZmlsZT4gdG8gbG9hZCBhIHdob2xlIGZpbGUgaW50byBhIHByb3BlcnR5LgorCisqIE5ldyB0YXNrIDxlY2hvcHJvcGVydGllcz4gdG8gbGlzdCB5b3VyIGN1cnJlbnQgcHJvcGVydGllcyB0byB0aGUgc2NyZWVuCisgIG9yIGEgZmlsZS4KKworKiBOZXcgdGFza3MgPGJ6aXAyPiBhbmQgPGJ1bnppcDI+IHRvIHBhY2sgYW5kIHVucGFjayBmaWxlcyB1c2luZyB0aGUKKyAgQlppcDIgYWxvZ3JpdGhtLgorCisqIE5ldyB0YXNrcyA8cmVwbGFjZXJlZ2V4cD4sIDxjaGVja3N1bT4sIDx0cmFuc2xhdGU+LCA8d2FpdGZvcj4sCisgIDxtYW5pZmVzdD4sIDx2c3NjcD4sIDx2c3NhZGQ+LCA8dnNzY3JlYXRlPiwgPHNwbGFzaD4sIDxiYXNlbmFtZT4sIDxkaXJuYW1lPiwKKyAgPGNvbmNhdD4sIDxzb3VyY2VvZmZzaXRlPiwgPGphcmxpYi1hdmFpbGFibGU+LCA8amFybGliLWRpc3BsYXk+LAorICA8amFybGliLW1hbmlmZXN0PiwgPGphcmxpYi1yZXNvbHZlPi4KKworKiBBIG5ldyBjb21iaW5lZCA8bWFpbD4gdGFzaywgd2hpY2ggcmVwbGFjZXMgdGhlIG9sZCA8bWFpbD4gYW5kCisgIDxtaW1lbWFpbD4gdGFza3MsIGhhcyBiZWVuIGFkZGVkLiAgVGhlIDxtaW1lbWFpbD4gdGFzaywgYW5kCisgIG9sZCBTZW5kRW1haWwgYW5kIE1pbWVNYWlsIGNsYXNzZXMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQuCisKKyogTWFpbCB0YXNrIGFsbG93cyBzcGVjaWZpY2F0aW9uIG9mIHBvcnQgbnVtYmVyLgorCisqIFVzZXJzIGNhbiBjb250cm9sIHdoYXQgPHppcD4gYW5kIDxqYXI+IG11c3QgZG8gd2hlbiBkdXBsaWNhdGUgZmlsZXMKKyAgYXJlIGZvdW5kLiAgQSBuZXcgZWxlbWVudCA8emlwZ3JvdXBmaWxlc2V0PiBhbGxvd3MgZm9yIG11bHRpcGxlIHppcAorICBmaWxlcyB0byBiZSBtZXJnZWQgaW50byB0aGUgYXJjaGl2ZS4gIEluIGFkZGl0aW9uLCA8amFyPiBhbHNvIGhhcworICBhbm90aGVyIG5ldyBhdHRyaWJ1dGU6IGZpbGVzZXRtYW5pZmVzdC4gIFRoZSBleGlzdGluZyBtYW5pZmVzdAorICBhdHRyaWJ1dGUgb2YgPGphcj4gbm93IGFsc28gYWNjZXB0cyB0aGUgbmFtZSBvZiBhIGphciBhZGRlZCB0aHJvdWdoCisgIGEgZmlsZXNldC4KKworKiBnemlwIG5vdyBjaGVja3MgdGhhdCB0aGUgemlwZmlsZSBpcyBvbGRlciB0aGFuIHRoZSBzb3VyY2UgZmlsZQorICBiZWZvcmUgcmVidWlsZGluZyB0aGUgemlwZmlsZS4KKworKiBUYXJGaWxlc2V0IHRha2VzIGluIHRocmVlIG5ldyBhdHRyaWJ1dGVzIC0gZnVsbHBhdGgsIHByZWZpeAorICBhbmQgcHJlc2VydmVMZWFkaW5nU2xhc2hlcy4KKworKiA8bW92ZT4gYXR0ZW1wdHMgdG8gcmVuYW1lIHRoZSBkaXJlY3RvcnksIGlmIGV2ZXJ5dGhpbmcgaW5zaWRlIGl0IGlzCisgIGluY2x1ZGVkLCBiZWZvcmUgcGVyZm9ybWluZyBmaWxlLWJ5LWZpbGUgbW92ZXMuICBUaGlzIGF0dGVtcHQgd2lsbAorICBiZSBkb25lIG9ubHkgaWYgZmlsdGVyaW5nIGlzIG9mZiBhbmQgaWYgbWFwcGVycyBhcmUgbm90IHVzZWQuICBUaGlzCisgIGlzIGEgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYW5kIHRoZXJlIGlzIG5vIGNoYW5nZSBvdGhlcndpc2UgaW4KKyAgdGhlIGZ1bnRpb25hbGl0eSBvZiB0aGlzIHRhc2suCisKKyogRXhlYyB0YXNrIGhhcyBleHRyYSBhdHRyaWJ1dGUgInJlc3VsdHByb3BlcnR5IiB0byBnZXQgdGhlIHJldHVybiBjb2RlCisgIGludG8gYSBwcm9wZXJ0eS4KKworKiBFeGVjIHRhc2sgcHJpbnRzIGEgbWVzc2FnZSB3aGVuIGEgdGltZWQtb3V0IHByb2Nlc3MgaXMga2lsbGVkLgorCisqIEFkZGVkIG9wdGlvbmFsIGF0dHJpYnV0ZXMgLSBuYW1lLCBhcmNoIGFuZCB2ZXJzaW9uIHRvIHRoZSA8b3M+IHRhc2suCisKKyogVW5qYXIsIFVudGFyLCBVbndhciBhbmQgVW56aXAgbm93IHN1cHBvcnQgcGF0dGVybnNldHMgdG8KKyAgc2VsZWN0IGZpbGVzIGZyb20gYW4gYXJjaGl2ZSBmb3IgZXh0cmFjdGlvbi4gIEZpbGVzZXRzIG1heSBiZQorICB1c2VkIHRvIHNlbGVjdCBhcmNoaXZlZCBmaWxlcyBmb3IgdW5hcmNoaXZhbC4KKworKiBKYXZhYyB0YXNrIGFsbG93cyBkZWJ1ZyBsZXZlbHMgdG8gYmUgc3BlY2lmaWVkLiAgRGVidWcgbGV2ZWxzCisgIHdpbGwgaGF2ZSBhbiBlZmZlY3Qgb25seSB3aGVuIHRoZSBtb2Rlcm4gY29tcGlsZXIgb3IgdGhlCisgIGNsYXNzaWMgY29tcGlsZXIgKHZlcnNpb24gMS4yIGFuZCBoaWdoZXIpIGlzIHVzZWQgYW5kIGRlYnVnZ2luZworICBpcyBlbmFibGVkLgorCisqIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgQ1ZTX1JTSCBpbiB0aGUgPGN2cy8+IHRhc2sKKworKiBUaGUgYXR0cmlidXRlcyB6aXBmaWxlLCBqYXJmaWxlLCB3YXJmaWxlIGFuZCBlYXJmaWxlIChmcm9tIHRoZSBaaXAsCisgIEphciwgV2FyIGFuZCBFYXIgdGFza3MpIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFuZCBzdXBlcnNlZGVkIGJ5IGEKKyAgbmV3IGF0dHJpYnV0ZSAiZGVzdGZpbGUiLgorCisqIEFkZGVkIG5ldyBjb25kaXRpb25zIDxpc3NldD4sIDxjaGVja3N1bT4sIDxodHRwPiwgPHNvY2tldD4sIDxjb250YWlucz4sCisgIDxmaWxlc21hdGNoPi4KKworKiA8dGFza2RlZj4gYW5kIDx0eXBlZGVmPiB3aWxsIG5vdyBlbWl0IGEgd2FybmluZyBpZiBhIHRhc2svdHlwZSBvZgorICB0aGUgZ2l2ZW4gbmFtZSBhbHJlYWR5IGV4aXN0cy4KKworKiBBIG5ldyByZXZpc2lvbiBvZiBWQUogdGFza3M6IFRoZSBtb3N0IGltcG9ydGFudCBuZXcgZmVhdHVyZQorICBpcyB0aGUgYWJpbGl0eSB0byBleGVjdXRlIFZBSiB0YXNrcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYnkKKyAgZXhwbG9pdGluZyB0aGUgUmVtb3RlIFRvb2wgQWNjZXNzIGZlYXR1cmUgb2YgVkFKLgorCisqIEltcHJvdmVkIHN1cHBvcnQgZm9yIE5vdmVsbCBOZXRXYXJlLgorCisqIEFkZGVkIGFuIG9wdGlvbmFsIGVuY29kaW5nIGF0dHJpYnV0ZSB0byA8Zml4Y3JsZj4uCisKKyogPGFwcGx5PiBoYXMgYSBuZXcgYXR0cmlidXRlIHJlbGF0aXZlIHRoYXQgYWxsb3dzIHVzZXJzIHRvIHBhc3MgdGhlCisgIGZpbGVuYW1lcyBhcyByZWxhdGl2ZSBpbnN0ZWFkIG9mIGFic29sdXRlIHBhdGhzIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKyogUmVmZXJlbmNlcyBjYW4gbm93IGJlIGNvcGllZCBpbnRvIHRoZSBjaGlsZCBidWlsZCBieSA8YW50PiBhbmQKKyAgPGFudGNhbGw+IHVzaW5nIG5lc3RlZCA8cmVmZXJlbmNlPiBlbGVtZW50cyBvciB0aGUgbmV3IGluaGVyaXRSZWZzCisgIGF0dHJpYnV0ZS4KKworKiA8ZmFpbD4gbm93IHN1cHBvcnRzIGJ1aWxkcyB0byBmYWlsIGJhc2VkIG9uIGNvbmRpdGlvbnMgdmlhIGlmIGFuZAorICB1bmxlc3MgYXR0cmlidXRlcy4KKworKiBBbnQgbm93IGNvbWVzIHdpdGggdHdvIG5ldyBCdWlsZExvZ2dlciBpbXBsZW1lbnRhdGlvbnMgLSBvbmUgdGhhdAorICBjYW4gc2VuZCBlbWFpbHMgY29udGFpbmluZyBhIGxvZyBvZiB0aGUgYnVpbGQgcHJvY2VzcyAoTWFpbExvZ2dlciksCisgIGFuZCBvbmUgdGhhdCBjb2xvcml6ZXMgdGhlIG91dHB1dCBiYXNlZCBvbiBtZXNzYWdlIGxldmVscywgdXNpbmcKKyAgQU5TSSBjb2xvciBjb2RlIGVzY2FwZSBzZXF1ZW5jZXMgKEFuc2lDb2xvckxvZ2dlcikuCisKKyogQSAicGFja2FnZSIgbWFwcGVyIHR5cGUgaGFzIGJlZW4gYWRkZWQgdG8gYWxsb3cgcGFja2FnZSBkaXJlY3RvcnkKKyAgbmFtZXMgcmVwbGFjZWQgd2l0aCB0aGUgZG90dGVkIGZvcm0uCisKKyogWW91IGNhbiBub3cgc3BlY2lmeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gdGhlIDxqYXZhPiBhbmQgPGp1bml0PiB0YXNrcworICBpZiB0aGUgZm9yayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0IHRvIHRydWUuCisKKyogLXByb3BlcnR5ZmlsZSBjb21tYW5kLWxpbmUgb3B0aW9uIGhhcyBiZWVuIGFkZGVkIHRvIGxvYWQgYW4gZW50aXJlCisgIHByb3BlcnR5IGZpbGUganVzdCBhcyAtRCBwcm9wZXJ0aWVzIGFyZSBkZWNsYXJlZCAoYXMgdXNlciBwcm9wZXJ0aWVzKS4KKyAgLUQgcHJvcGVydGllcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciAtcHJvcGVydHlmaWxlIHNwZWNpZmllZCBvbmVzLgorCisqIFlvdSBjYW4gbm93IHNldCBhbiBBTlRfQVJHUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBob2xkIGFyZ3VtZW50cyB5b3UKKyAgYWx3YXlzIHdhbnQgcGFzc2VkIHRvIHRoZSAnYW50JyBjb21tYW5kIC0tIGZvciBleGFtcGxlLCBpZiB5b3UgYWx3YXlzCisgIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGxvZ2dlciBvciB0aGUgLWZpbmQgZmxhZy4KKworKiA8dHN0YW1wPiBub3cgc3VwcG9ydHMgYSBuZXcgInByZWZpeCIgYXR0cmlidXRlIHRvIHByZWZpeCBwcm9wZXJ0aWVzIHNldC4KKworKiBZb3UgY2FuIG5vdyBzcGVjaWZ5IHRoZSAtc291cmNlcGF0aCBmb3IgPGphdmFjPiBleHBsaWNpdGx5LgorCisqIDxqYXZhYz4gbm93IHN1cHBvcnRzIGEgbmV3ICJsaXN0ZmlsZXMiIGF0dHJpYnV0ZSB0byBsaXN0IHRoZSBzb3VyY2UKKyAgZmlsZXMgaXQncyBoYW5kaW5nIG9mZiB0byB0aGUgY29tcGlsZXIuCisKKyogVGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIGZvciA8amF2YWM+IGNhbiBub3cgYmUgY2hvc2VuIG9uIGEgdGFzayBieQorICB0YXNrIGJhc2lzLiAgVGhlIG5ldyAiY29tcGlsZXIiIGF0dHJpYnV0ZSBvZiA8amF2YWM+IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlCisgIHRoZSB2YWx1ZSBvZiB0aGUgYnVpbGQuY29tcGlsZXIgcHJvcGVydHksIGlmIHNldC4KKworKiA8amF2YWM+IGhhcyBhIG5ldyBuZXN0ZWQgZWxlbWVudCwgPGNvbXBpbGVyYXJnPiwgd2hpY2ggYWxsb3dzIHlvdQorICB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgYXJncyBmb3IgdGhlIHNwZWNpZmljIGNvbXBpbGVyIHlvdSdyZSB1c2luZy4KKworKiA8amF2YWM+J3MgInNvdXJjZSIgYXR0cmlidXRlIGlzIG5vdyBlbmFibGVkIGZvciBqaWtlcyBhcyB3ZWxsLgorCisqIDxwcm9wZXJ0eWZpbGU+J3MgPGVudHJ5PiBub3cgaGFzIGEgJ3VuaXQnIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHRoZQorICBpbmNyZW1lbnQvZGVjcmVtZW50IHVuaXQgb24gZGF0ZSBvcGVyYXRpb25zLgorCisqIDxwcm9wZXJ0eT4gbm93IHN1cHBvcnRzIGEgJ3ByZWZpeCcgYXR0cmlidXRlIHdoZW4gbG9hZGluZyBmcm9tIGEgZmlsZQorICBvciByZXNvdXJjZS4KKworKiBJbiBBbnQgMS40LCBhIGZlYXR1cmUgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIDxqdW5pdD4gdGFzayB0aGF0IHdvdWxkCisgIGFkZCBhbnQuamFyLCBvcHRpb25hbC5qYXIgYW5kIGp1bml0LmphciBpbXBsaWNpdGx5IHRvIHRoZSBjbGFzc3BhdGggLQorICB0aGlzIGZlYXR1cmUgY2FuIG5vdyBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZSBuZXcgaW5jbHVkZWFudHJ1bnRpbWUKKyAgYXR0cmlidXRlIHRvIGZhbHNlLgorCisqIDxzdHlsZT4gYmVoYXZlcyBkaWZmZXJlbnRseSBmcm9tIGFueSBvdGhlciBkaXJlY3RvcnktYmFzZWQgdGFzaywgYXMgaXQKKyAgcHJvY2Vzc2VzIGFsbCBmaWxlcyB0aGF0IGl0IGZpbmRzIGluIGluY2x1ZGVkIGRpcmVjdG9yaWVzIGluCisgIGFkZGl0aW9uIHRvIHRoZSBmaWxlcyBtYXRjaGVkIGJ5IHlvdXIgcGF0dGVybnMuICBUaGVyZSBpcyBub3cgYSBuZXcKKyAgYXR0cmlidXRlLCAnc2NhbmluY2x1ZGVkZGlyZWN0b3JpZXMnLCB0byBzdXBwcmVzcyB0aGlzIGJlaGF2aW9yLgorCisqIDxqYXZhZG9jPiBub3cgc3VwcG9ydHMgYSA8dGFnPiBuZXN0ZWQgZWxlbWVudCB0byBwcm92aWRlIHRoZSAtdGFnIG9wdGlvbgorICB0byB0aGUgc3RhbmRhcmQgSmF2YSAxLjQgZG9jbGV0LiBUaGUgZWxlbWVudCBpcyBpZ25vcmVkIHdoZW4gbm90IHJ1bm5pbmcKKyAgb24gSmF2YSAxLjQuCisKKyogPGZ0cD4gY2FuIG5vdyBjaG1vZCBmaWxlcyBvbiBhIHJlbW90ZSBzZXJ2ZXIgdGhhdCBzdXBwb3J0cworICAic2l0ZSBjaG1vZCIsIGFzIHdlbGwgYXMgc2V0IHRoZSB1bWFzayBiZWZvcmUgdHJhbnNmZXJyaW5nIGZpbGVzLCBpZgorICB0aGUgc2VydmVyIHN1cHBvcnRzICJzaXRlIHVtYXNrIi4KKworKiBOZXcgPHNlcnZlcmRlcGxveT4gIm9wdGlvbmFsIiB0YXNrLgorCisqIDxwYXR0ZXJuc2V0PiBub3cgc3VwcG9ydHMgbmVzdGVkIHBhdHRlcm5zZXRzLgorCisqIFBlcmZvcmNlIHRhc2tzIG5vdyBzdXBwb3J0IGEgImZhaWxvbmVycm9yIiBhdHRyaWJ1dGUgKGRlZmF1bHRzIHRvICJ0cnVlIikuCisKKyogT3BlbiBTb3VyY2UgYXBwbGljYXRpb24gc2VydmVyIEpPbkFTIHN1cHBvcnQ6CisgICAgRUpCIGhvdCBkZXBsb3kgYW5kIGRlcGxveSB3aXRoIDxzZXJ2ZXJkZXBsb3k+IGFuZCA8ZWpiamFyPgorCisqIEFkZGVkIG5ldyBEaXJTZXQgKDxkaXJzZXQ+KSBkYXRhdHlwZS4KKworKiA8cGF0aD4gbm93IHN1cHBvcnRzIG5lc3RlZCA8ZGlyc2V0PiBhbmQgPGZpbGVsaXN0PiBlbGVtZW50cy4KKworKiA8cGF0aGNvbnZlcnQ+IG5vdyBzdXBwb3J0cyBuZXN0ZWQgPGRpcnNldD4gYW5kIDxmaWxlbGlzdD4gZWxlbWVudHMuCisKKyogPHBhdGhjb252ZXJ0PidzICJkaXJzZXAiIGFuZCAicGF0aHNlcCIgYXR0cmlidXRlcyBub3cgYWNjZXB0CisgIG11bHRpLWNoYXJhY3RlciB2YWx1ZXMuCisKKyogPGNvcHk+IHRhc2sgbm93IGhhcyBhICdmYWlsb25lcnJvcicgYXR0cmlidXRlIHRvIGFsbG93IGtlZXAtZ29pbmcKKyAgYmVoYXZpb3VyIHdoZW4gdGhlIGZpbGUgdG8gYmUgY29waWVkIGlzIG5vdCBmb3VuZCAoZGVmYXVsdHMgdG8gInRydWUiKS4KKworKiA8dXB0b2RhdGU+IG5vdyBoYXMgYSAnc3JjZmlsZScgYXR0cmlidXRlIHRvIGFsbG93IHNwZWNpZnlpbmcgYQorICBmdWxsLXBhdGggZmlsZW5hbWUuCisKKyogPGV4ZWM+LCA8c3FsPiBhbmQgPGphdmE+IG5vdyBzdXBwb3J0IGFwcGVuZCBhdHRyaWJ1dGVzIHRvIGFsbG93CisgIGFwcGVuZGluZyB0aGUgb3V0cHV0IHRvIGFuIGV4aXN0aW5nIGZpbGUuCisKKyogPGphdmE+IG5vdyBzdXBwb3J0cyBhIHRpbWVvdXQgYXR0cmlidXRlIGFuYWxvZyB0byA8ZXhlYz4gLSBpdCBpcworICBoaWdobHkgcmVjb21tZW5kZWQgdG8gb25seSB1c2UgaXQgdG9nZXRoZXIgd2l0aCBmb3JrPSJ0cnVlIi4KKworKiA8amF2YWRvYz4gbm93IHN1cHBvcnRzIGEgc291cmNlIGF0dHJpYnV0ZSB0byBlbmFibGUgamF2YWRvYyB0bworICBoYW5kbGUgYXNzZXJ0aW9ucyBwcmVzZW50IGluIEpESyAxLjQgc291cmNlIGNvZGUuCisKKyogPHJlcGxhY2U+IHN1cHBvcnRzIGEgbmV3IHJlcGxhY2VmaWx0ZXJmaWxlIGF0dHJpYnV0ZSB0aGF0CisgIGF1dG9tYXRpY2FsbHkgdHVybnMgYWxsIHByb3BlcnRpZXMgb2YgYSBnaXZlbiBmaWxlIGludG8KKyAgcmVwbGFjZWZpbHRlcnMuCisKKyogQW4gYWxpYXMgb2YgPHhzbHQ+IGhhcyBiZWVuIGFkZGVkIHRvIHJlZmVyIHRvIHRoZSA8c3R5bGU+IHRhc2suCisKKyogVGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIGZvciA8cm1pYz4gY2FuIG5vdyBiZSBjaG9zZW4gb24gYSB0YXNrIGJ5CisgIHRhc2sgYmFzaXMuICBUaGUgbmV3ICJjb21waWxlciIgYXR0cmlidXRlIG9mIDxybWljPiBjYW4gYmUgdXNlZCB0byBvdmVycmlkZQorICB0aGUgdmFsdWUgb2YgdGhlIGJ1aWxkLnJtaWMgcHJvcGVydHksIGlmIHNldC4KKworKiA8cm1pYz4gaGFzIGEgbmV3IG5lc3RlZCBlbGVtZW50LCA8Y29tcGlsZXJhcmc+LCB3aGljaCBhbGxvd3MgeW91CisgIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBhcmdzIGZvciB0aGUgc3BlY2lmaWMgY29tcGlsZXIgeW91J3JlIHVzaW5nLgorCisqIG9yZy5hcGFjaGUudG9vbHMuYW50LlhtbExvZ2dlciBub3cgaXMgYSBCdWlsZExvZ2dlciwgcmF0aGVyIHRoYW4ganVzdAorICBhIEJ1aWxkTGlzdGVuZXIuIEl0IGNhbiBvcGVyYXRlIGluIGVpdGhlciBtb2RlIHN1Y2Nlc3NmdWxseS4KKworKiA8anVuaXQ+IGhhcyBhIG5ldyBhdHRyaWJ1dGUgInNob3dvdXRwdXQiLiAgSWYgc2V0IHRvIHRydWUsIG91dHB1dAorICBnZW5lcmF0ZWQgYnkgdGVzdHMgd2lsbCBiZSBzZW50IHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtIGFzIHdlbGwgYXMKKyAgdG8gdGhlIGZvcm1hdHRlcnMgKGluc3RlYWQgb2Ygc2VuZGluZyBpdCB0byB0aGUgZm9ybWF0dGVycworICBleGNsdXNpdmVseSkuCisKKyogQW50IGhhcyBub3cgYSBwbHVnZ2FibGUgd2F5IHRvIHByb21wdCB1c2VycyBmb3IgaW5wdXQsIHdoaWNoIGlzIHVzZWQKKyAgYnkgdGhlIG5ldyA8aW5wdXQ+IHRhc2suICBJREUgaW50ZWdyYXRvcnMgY2FuIHByb3ZpZGUgYW4KKyAgaW1wbGVtZW50YXRpb24gb2YgdGhlIElucHV0SGFuZGxlciBpbnRlcmZhY2UgdG8gZGVjb3VwbGUgQW50J3MgaW5wdXQKKyAgZnJvbSB0aGUgY29uc29sZS4gIEFuIGltcGxlbWVudGF0aW9uIHRoYXQgZ2V0cyBpdHMgaW5wdXQgZnJvbSBhIGZpbGUKKyAgZm9yIHVuYXR0ZW5kZWQgYnVpbGRzIGlzIHBhcnQgb2YgQW50J3MgZGlzdHJpYnV0aW9uLgorCisgIEZvciBtb3JlIGRldGFpbHMgc2VlIGRvY3MvbWFudWFsL2lucHV0aGFuZGxlci5odG1sLgorCisqIDxwYXRjaD4gaGFzIGEgbmV3IGF0dHJpYnV0ZSB0aGF0IHNlbGVjdHMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0bworICBydW4gdGhlIGNvbW1hbmQuCisKKyogPGphdmFkb2M+IG5vdyBzdXBwb3J0cyB0d28gbmV3IG5lc3RlZCBlbGVtZW50cywgPGZpbGVzZXQ+IGFuZCA8cGFja2FnZXNldD4uCisKKworQ2hhbmdlcyBmcm9tIEFudCAxLjQgdG8gQW50IDEuNC4xCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisqIDxhbnQ+J3MgYW50ZmlsZSBhdHRyaWJ1dGUgd2lsbCBub3cgYWxzbyBiZSBjb25zaWRlcmVkIGFuIGFic29sdXRlIHBhdGggb24KKyAgV2luZG93cyBzeXN0ZW1zLCBpZiBpdCBzdGFydHMgd2l0aCBhIFwgYW5kIG5vIGRyaXZlIHNwZWNpZmllci4KKworKiBUaGUgZnVsbHBhdGggYXR0cmlidXRlIG9mIDx6aXBmaWxlc2V0PiBoYXMgYmVlbiBpZ25vcmVkIGlmIHlvdSB1c2VkCisgIHRoZSBzcmMgYXR0cmlidXRlIGF0IHRoZSBzYW1lIHRpbWUuCisKKyogVGhlIG1hbmlmZXN0IGZpbGUgaXMgbm93IGFsd2F5cyBwbGFjZWQgYXMgdGhlIHNlY29uZCBlbnRyeSAoYWZ0ZXIgL01FVEEtSU5GKQorICBpbiBnZW5lcmF0ZWQgamFycy4gVGhpcyBhbGxvd3MgdGhlIG1hbmlmZXN0IHRvIGJlIHJlYWQgYnkgSmFySW5wdXRTdHJlYW1zCisKKyogRml4ZWQgYnVnIGluIGRlcGVuZCB0YXNrIHdoaWNoIHdvdWxkIGZhaWwgd2l0aCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG5vCisgIGRlcGVuZGVuY3kgY2FjaGUgd2FzIHNwZWNpZmllZC4KKworKiBzcWwgdGFzayBub3cgaGFuZGxlcyBSRU0gc3RhdGVtZW50cyBjb3JyZWN0bHkgc28gdGhhdCBsaW5lcyBzdGFyeWluZyB3aXRoIHJlbQorICBidXQgd2hpY2ggYXJlIG5vdCBjb21tZW50cyBhcmUgYWN0dWFsbHkgcHJvY2Vzc2VkLgorCisqIFhNTExvZ2dlciBub3cgdXNlcyB0aGUgdGFzaydzIG5hbWUgcmF0aGVyIHRoYW4gdGhlIGNsYXNzbmFtZQorCisqIDxtYXBwZXI+cyB3aWxsIG5vdyB3b3JrIGFzIGV4cGVjdGVkIGlmIHRoZSB0byBwYXR0ZXJuIGV4cGFuZHMgdG8gYW4KKyAgYWJzb2x1dGUgcGF0aG5hbWUuCisKKyogPGphdmFjPiBkaWRuJ3QgaWdub3JlIG1lbW9yeSBzZXR0aW5ncyBpbiBub24tZm9yayBtb2RlCisKKyogPGNhYj4gZGlkbid0IHNwbGl0IHRoZSBvcHRpb25zIGF0dHJpYnV0ZSBpbnRvIHNldmVyYWwgY29tbWFuZCBsaW5lCisgIGFyZ3VtZW50cyBjb3JyZWN0bHkuCisKK090aGVyIGNoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorCisqIE5ldyBzb3VyY2UgYXR0cmlidXRlIGZvciA8amF2YWM+IHRvIGVuYWJsZSBhc3NlcnRpb24gaW4gSkRLIDEuNAorCisqIFhtbExvZ2dlciBhbmQgPGFudHN0cnVjdHVyZT4gbm93IGFkZCBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbiB0byB0aGUKKyAgWE1MIGZpbGVzIHRoZXkgZ2VuZXJhdGUuCisKKyogPGZpbGVzZXQ+IGhhcyBhIG5ldyBhdHRyaWJ1dGUgImNhc2VzZW5zaXRpdmUiIHRvIG1ha2UgaXQgbWF0Y2gKKyAgZmlsZW5hbWVzIGluIGEgY2FzZSBpbnNlbnNpdGl2ZSB3YXkgKGlmIHlvdSBzZXQgaXQgdG8gZmFsc2UpIC0gYnkKKyAgZGVmYXVsdCBmaWxlc2V0cyByZW1haW4gY2FzZSBzZW5zaXRpdmUuCisKK0NoYW5nZXMgZnJvbSBBbnQgMS4zIHRvIEFudCAxLjQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIEpVbml0UmVwb3J0IG5vdyB1c2VzIHRoZSB4YWxhbiByZWRpcmVjdCBleHRlbnNpb24gZm9yIG11bHRpLW91dHB1dC4KKyAgV2l0aCBYYWxhbiAxLjIuMiBpdCBmb3JjZXMgdGhlIHVzZSBvZiBic2YuamFyIGluIHRoZSBjbGFzc3BhdGguCisgIChBdmFpbGFibGUgaW4gdGhlIHhhbGFuIGRpc3RyaWJ1dGlvbikuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHN3aXRjaAorICB0byBYYWxhbiAyLnggdGhhdCBkbyBub3QgbmVlZCBpdC4KKworKiBaaXAuc2V0V2hlbmVtcHR5KCkgaGFzIGNoYW5nZWQgaXRzIHNpZ25hdHVyZS4KKworKiA8cm1pYz4gaXMgbm93IGltcGxlbWVudGVkIHVzaW5nIGEgZmFjdG9yeS4gVGhpcyBtYWtlcyBleHRlbmRpbmcKKyAgcm1pYyB0byB1c2UgYSBuZXcgY29tcGlsZXIgYSBsb3QgZWFzaWVyIGJ1dCBtYXkgYnJlYWsgY3VzdG9tCisgIHZlcnNpb25zIG9mIHRoaXMgdGFzayB0aGF0IHJlbHkgb24gdGhlIG9sZCBpbXBsZW1lbnRhdGlvbi4KKworKiBzZXZlcmFsIFppcCBtZXRob2RzIGhhdmUgY2hhbmdlZCB0aGVpciBzaWduYXR1cmUgYXMgd2Ugbm93IHVzZSBhIFppcAorICBwYWNrYWdlIG9mIG91ciBvd24gdGhhdCBoYW5kbGVzIFVuaXggcGVybWlzc2lvbnMgZm9yIGRpcmVjdG9yaWVzLgorICBGdXJ0aGVybW9yZSA8emlwPiB3aWxsIG5vdyB1c2UgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIKKyAgZW5jb2RpbmcgZm9yIGZpbGVuYW1lcyAtIHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBjb21tYW5kIGxpbmUKKyAgWklQIHRvb2xzLCBidXQgY2F1c2VzIHByb2JsZW1zIGlmIHlvdSB0cnkgdG8gb3BlbiB0aGVtIGZyb20gd2l0aGluCisgIEphdmEgYW5kIHlvdXIgZmlsZW5hbWVzIGNvbnRhaW4gbm9uIFVTLUFTQ0lJIGNoYXJhY3RlcnMuIFVzZSB0aGUgbmV3CisgIGVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgdGFzayBhbmQgc2V0IGl0IHRvIFVURjggdG8gZ2V0IHRoZSBvbGQKKyAgYmVoYXZpb3IuCisKKyogVGhlIDxwdmNzPiB0YXNrIGhhcyBiZWVuIG1vdmVkIHRvIGEgcGFja2FnZSBvZiBpdHMgb3duLgorCisqIEpVbml0UmVzdWx0Rm9ybWF0ZXIgaGFzIHR3byBhZGRpdGlvbmFsIG1ldGhvZHMgdGhhdCBtdXN0IGJlCisgIGltcGxlbWVudGVkIGJ5IGN1c3RvbSBmb3JtYXR0ZXJzLgorCisqIEFudCB3aWxsIG5vIGxvbmdlciB1c2UgdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgcGF0aCBpbnRlcm5hbGx5IC0KKyAgdGhpcyBtYXkgeWllbGQgZGlmZmVyZW50IHJlc3VsdHMgb24gZmlsZXN5c3RlbXMgdGhhdCBzdXBwb3J0CisgIHN5bWJvbGljIGxpbmtzLgorCisqIFRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSB4bWwgZm9ybWF0dGVyIGZvciA8anVuaXQ+IGhhcyBjaGFuZ2VkCisgIGFnYWluLCBpdCBkb2Vzbid0IGZvcm1hdCB0aGUgbnVtZXJpYyB2YWx1ZSBpbiB0aGUgdGltZSBhdHRyaWJ1dGUgYW55bW9yZS4KKworKiBQYXR0ZXJuIG1hdGNoaW5nIHJ1bGVzIGhhdmUgY2hhbmdlcyBzbGlnaHRseSwgdGhlIHBhdHRlcm4gZm9vKgorICBkb2Vzbid0IG1hdGNoIGZpbGVzIGNvbnRhaW5lZCBpbiBhIGRpcmVjdG9yeSBuYW1lZCBmb28gLSB1c2UgZm9vLyoKKyAgaW5zdGVhZC4KKworKiA8Zml4Y3JsZj4gd2lsbCBub3QgcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXQgdGhlIGVuZCBvZiBsaW5lcyBhbnltb3JlLgorCisqIFRoZSBDbGFzc2xvYWRlciB1c2FnZSBoYXMgYmVlbiBjaGFuZ2VkIGZvciB0aGUgdGFza2RlZiwgcHJvcGVydHksIGF2YWlsYWJsZQorICBhbmQgc3FsIHRhc2tzIHNvIHRoYXQgaXQgZGVsZWdhdGVzIHRvIHRoZSBwYXJlbnQgY2xhc3Nsb2FkZXIuIFRoaXMgbWF5IGNhdXNlCisgIENsYXNzTm90Rm91bmRFeGNlcHRpb25zIHRvIGJlIHRocm93biBpZiBhIHN5c3RlbSBjbGFzcyBhdHRlbXB0cyB0byBsb2FkIGEKKyAgY2xhc3MgaW4gdGhlIHRhc2tkZWYncyBjbGFzc3BhdGggKHR5cGljYWxseSBmYWN0b3J5IG9iamVjdHMpLgorCisqIEFudCBub3cgYWxsb3dzIG11bHRpdGhyZWFkaW5nIG9mIHRhc2tzIGFuZCB0aGUgY29udGFpbm1lbnQgb2YgdGFza3Mgd2l0aGluCisgIG90aGVyIHRhc2tzLiBUaGlzIGNhbiBicmVhayBjdXN0b21lciBsaXN0ZW5lcnMgd2hpY2ggZG8gbm90IGV4cGVjdCBtZXNzYWdlcworICBmcm9tIGEgdGFzayBiZWZvcmUgdGhlIHByZXZpb3VzIHRhc2sgaGFzIGZpbmlzaGVkLgorCisqIEFudCBub3cgaW5zdGFsbHMgaXRzIG93biBvdXB1dCBzdHJlYW0gaW50byBTeXN0ZW0ub3V0IHRvIHJvdXRlIG91dHB1dCB0byB0aGUKKyAgdGFzayBjdXJyZW50bHkgZXhlY3V0aW5nIG9uIHRoZSBjdXJyZW50IHRocmVhZC4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgYWxsCisgIG91dHB1dCBpcyBub3cgcm91dGVkIGFzIEFudCBtZXNzYWdlIGV2ZW50cy4gQ3VzdG9tZXIgbGlzdGVuZXJzIGFuZCBsb2dnZXJzCisgIHNob3VsZCBub3QgY2FsbCBTeXN0ZW0ub3V0IGF0IGFueSB0aW1lLiBUaGlzIGhhcyBhbHdheXMgYmVlbiB0cnVlIGJ1dCBzdWNoCisgIHVzYWdlIG5vdyB3aWxsIGNhdXNlIHByb2JsZW1zIGR1ZSB0byBwb3NzaWJsZSByZWN1cnNpb24uCisKKyogSW52YWxpZCBtYW5pZmVzdCBmaWxlcyB3aWxsIG5vdyBjYXVzZSBidWlsZCBmYWlsdXJlcyBpbiB0aGUgPGphcj4gdGFzay4KKworKiBBbnQgSW50cm9zcGVjdGlvbiBub3cgbG9va3MgZm9yIG1ldGhvZHMgd2l0aCBtZXRob2QgbmFtZXMgc3RhcnRpbmcgd2l0aAorICBhZGRDb25maWd1cmVkLiBXaGVuIGNhbGxlZCB0aGVzZSBtZXRob2RzIGFyZSBwYXNzZWQgYW4gYXJndW1lbnQgYWZ0ZXIgaXQgaGFzCisgIGJlZW4gY29uZmlndXJlZCBmcm9tIHRoZSBidWlsZCBmaWxlLiBDdXN0b20gdGFza3Mgc3VwcG9ydGluZyBuZXN0ZWQgZWxlbWVudHMKKyAgc3RhcnRpbmcgd2l0aCB0aGUgbmFtZSBjb25maWd1cmVkIHdpbGwgbm8gbG9uZ2VyIGZ1bmN0aW9uLgorCisqIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBKQVZBQ01EIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAgamF2YSBleGVjdXRhYmxlIHRvIEFudCdzIHdyYXBwZXIgc2NyaXB0cyBtdXN0IG5vdCBjb250YWluIGFkZGl0aW9uYWwKKyAgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgYW55IGxvbmdlciAtIHBsZWFzZSB1c2UgdGhlIGVudmlyb25tZW50CisgIHZhcmlhYmxlIEFOVF9PUFRTIGZvciBzdWNoIHBhcmFtZXRlcnMgbm93LgorCisqIEFudCdzIHdyYXBwZXIgc2NyaXB0cyBub3cgcXVvdGUgdGhlIENMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGh1cworICBzdXBwb3J0aW5nIGNsYXNzcGF0aHMgd2hpY2ggcmVmZXIgdG8gZGlyZWN0b3JpZXMgY29udGFpbmluZyBzcGFjZXMuIFRoaXMgbWVhbnMKKyAgdGhhdCB0aGUgQ0xBU1NQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbm5vdCBoYXZlIHF1b3Rlcy4gQW55IHF1b3RlcyBzaG91bGQKKyAgYmUgcmVtb3ZlZC4gVGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQ0xBU1NQQVRIIGVudmlyb25tZW50CisgIHZhcmlhYmxlIGluIG90aGVyIGNvbnRleHRzLgorCisqIEEgZGVsZXRlIHRhc2sgbGlrZQorICA8ZGVsZXRlIGluY2x1ZGVFbXB0eUZpbGVzZXRzPSJ0cnVlIj4KKyAgICA8ZmlsZXNldCBkaXI9InNvbWVkaXIiIC8+CisgIDwvZGVsZXRlPgorICB3aWxsIG5vdyByZW1vdmUgInNvbWVkaXIiIGFzIHdlbGwsIHVubGVzcyB0aGVyZSBhcmUgc3RpbGwgZmlsZXMgbGVmdAorICBpbiBpdCAobWF0Y2hlZCBieSB0aGUgZGVmYXVsdCBleGNsdWRlcykuCisKKyogVGhlIGNvcHkgdGFzayB3aWxsIG5vdyBmYWlsIGlmIHRoZSBmaWxlIHRvIGJlIGNvcGllZCBpcyBub3QgZm91bmQuCisKKyogQW50IHByb3BlcnRpZXMgZGVmaW5lZCBpbiBwcm9wZXJ0aWVzIGZpbGVzIG5vdyBiZWhhdmUgdGhlIHNhbWUgd2F5IGFzCisgIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgYnVpbGQgZmlsZS4gSW4gcGFydGljdWxhciB0aGUgJCBjaGFyYWN0ZXIgbmVlZHMKKyAgdG8gYmUgZXNjYXBlZCBpbiBwcm9wZXJ0eSB2YWx1ZXMgYnkgZG91YmxpbmcgaXQgdG8gJCQuIFNvLCB0byBkZWZpbmUgYQorICBwcm9wZXJ0eSB3aXRoIHRoZSB2YWx1ZSAkaGVsbG8sIHlvdSBuZWVkIHRvIGRlZmluZSBpdCBpbiBhIHByb3BlcnRpZXMgZmlsZQorICBhcworICAgIHRlc3QucHJvcD0kJGhlbGxvCisgIFRoaXMgd2FzIG5vdCB0aGUgY2FzZSBpbiBBbnQgMS4zCisKK090aGVyIGNoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorCisqIE5ldyB0YXNrczogZWFyLCBwNGNvdW50ZXIsIHJlY29yZCwgY3ZzcGFzcywgdnNzY2hlY2tpbiwgdnNzY2hlY2tvdXQsCisgIHR5cGVkZWYsIHNsZWVwLCBtaW1lbWFpbCwgc2V0IG9mIHRhc2tzIGZvciBDb250aW51dXMvU3luZXJneSwgZGVwZW5kc2V0LAorICBjb25kaXRpb24sIG1hdWRpdCwgbW1ldHJpY3MsIGpwY292ZXJhZ2UsIGpwY292cmVwb3J0LCBqcGNvdm1lcmdlCisKKyogQW50IG5vdyB1c2VzIEpBWFAgMS4xCisKKyogcm1pYyBub3cgc3VwcG9ydHMgS2FmZmUncyBhbmQgV2VibG9naWMncyB2ZXJzaW9uIG9mIHJtaWMuCisKKyogbmV3IG1hZ2ljIHByb3BlcnR5IGJ1aWxkLnJtaWMgdG8gY2hvc2UgdGhlIHJtaWMgaW1wbGVtZW50YXRpb24KKworKiA8dGFyPiB3aWxsIG5vdyBhZGQgZW1wdHkgZGlyZWN0b3JpZXMgYXMgd2VsbAorCisqIHlvdSBjYW4gbm93IHNwZWNpZnkgYSBkZXNjcmlwdGlvbiBmb3IgPHA0Y2hhbmdlPgorCisqIDx0b3VjaD4gY2FuIG5vdyB3b3JrIG9uIDxmaWxlc2V0PnMKKworKiA8dXB0b2RhdGU+IG5vdyBzdXBwb3J0cyBhIHZhbHVlIGF0dHJpYnV0ZQorCisqIDxmYWlsPiBzdXBwb3J0cyBuZXN0ZWQgdGV4dAorCisqIDxmaXhjcmxmPiB3b24ndCBvdmVycmlkZSBmaWxlcyB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBjb3JyZWN0CisgICBmb3JtYXQuCisKKyogPHNxbD4gbm93IHN1cHBvcnRzIFJFTSBjb21tZW50cyBhcyB3ZWxsIGFzIC8vIGFuZCAtLQorCisqIDxqYXI+IG5vdyBoYXMgYSBuZXN0ZWQgPG1ldGFpbmY+IGVsZW1lbnQgZm9sbG93aW5nIHRoZSBzYW1lIGlkZWEgYXMKKyAgPHdhcj4ncyA8d2ViaW5mPi4KKworKiA8cHZjcz4gY2FuIG5vdyBoYW5kbGUgbXVsdGlwbGUgcHJvamVjdHMuCisKKyogPGF2YWlsYWJsZT4gbm93IGhhcyBhICJ0eXBlIiBhdHRyaWJ1dGUgeW91IGNhbiB1c2UgaW4gY29uanVuY3Rpb24KKyAgd2l0aCB0aGUgImZpbGUiIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlICJmaWxlIiB5b3UncmUKKyAgbG9va2luZyBmb3IgaXMgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LgorCisqIE5ldyA8anVuaXQ+IGZvcm1hdHRlciBuYW1lZCAiYnJpZWYiCisKKyogPGVqYmphcj4gY2hhbmdlcworICAqIEFkZCBzdXBwb3J0IGZvciBCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciB0byB0aGUgPGVqYmphcj4gdGFzayB1c2luZworICAgIGEgPGJvcmxhbmQ+IG5lc3RlZCBlbGVtZW50LgorICAqIEFkZCBzdXBwb3J0IGZvciBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciB0byB0aGUgPGVqYmphcj4gdGFzay4gQWxzbworICAgIGluY2x1ZGVzIHNvbWUgaVBsYW5ldCB1dGlsaXR5IHRhc2tzCisgICogQWRkIHN1cHBvcnQgZm9yIEpCb3NzIEFwcGxpY2F0aW9uIFNlcnZlciB0byB0aGUgPGVqYmphcj4gdGFzay4KKyAgKiBBZGQgYSBuYW1pbmcgYXR0cmlidXRlIHRvIGNvbnRyb2wgdGhlIG5hbWluZyBzY2hlbWUgdGhhdAorICAgIGVqYmphciB1c2VzIHRvIG5hbWUgdGhlIGdlbmVyYXRlZCBFSkIgamFycy4KKyAgKiBXZWJsb2dpYyBlbGVtZW50IG5vdyBzZXRzIHRoZSBjb21waWxlciBjbGFzcyBmb3IgRUpCIDIuMCBiZWFucworICAqIDxkdGQ+IGVsZW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQgYXQgdGhlIDxlamJqYXI+IGxldmVsIGZvciBidWlsZGluZyBnZW5lcmljCisgICAgYmVhbnMKKyAgKiA8ZHRkPiBlbGVtZW50cyBjYW4gbm93IGJlIFVSTHMKKyAgKiBBbGxvdyB0aGUgbWFuaWZlc3QgdG8gYmUgc3BlY2lmaWVkIGZvciB0aGUgZ2VuZXJhdGVkIGphcnMKKyAgKiBUaGUgd2VibG9naWMgZWxlbWVudCBub3cgc3VwcHJ0cyBhbiBhdHRyaWJ0ZSBub0VKQkMgdG8gc2tpcCB0aGUgcHJvY2Vzc2luZworICAgIG9mIHRoZSBqYXIgYnkgZWpiYy4gVGhlIGVqYmMgc3RlcCB3aWxsIHRoZW4gb2NjdXIgYXQgZGVwbG95bWVudAorICAqIHdlYmxvZ2ljIHdpbGwgdGVsbCBlamJjIHRvIHVzZSBKaWtlcyBjb21waWxlciBpZiBidWlsZC5jb21waWxlciBpcyBzZXQgdG8KKyAgICBqaWtlcy4gSXQgY2FuIGJlIHJlc3RvcmVkIHRvIHRoZSBkZWZhdWx0LCBqYXZhYywgb3BlcmF0aW9uIGlmIGRlc2lyZWQuCisKKyogQWxsb3cgdGhlIDxzcWw+IERlbGltaXRlciB0byBiZSBzZXQgaW4gdGhlIHNvIHRoYXQgT3JhY2xlIHN0b3JlZCBwcm9jcyBtYXkgYmUKKyAgZW50ZXJlZAorCisqIDxleGVjb24+IGFuZCA8YXBwbHk+IGNhbiBub3cgb3B0aW9uYWxseSBza2lwIGVtcHR5IGZpbGVzZXRzLgorCisqIDxqYXZhZG9jPiBoYXMgYSBuZXcgdXNlZXh0ZXJuYWxmaWxlIGF0dHJpYnV0ZSB0aGF0IG1ha2VzIGl0IHVzZSBhCisgIHRlbXBvcmFyeSBmaWxlIGZvciBzb3VyY2VmaWxlIGFuZCBwYWNrYWdlIG5hbWVzIC0gaGVscHMgdG8gZGVmZWF0CisgIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRhdGlvbnMuCisKKyogRGF0YSB0eXBlcyBsaWtlIDxwYXRoPiBjYW4gbm93IGJlIGRlZmluZWQgaW5zaWRlIG9mIDx0YXJnZXQ+cworCisqIHlvdSBjYW4gbm93IHNwZWNpZnkgYSBjbGFzc3BhdGggZm9yIDxzdHlsZT4gLSB0aGUgWFNMWiBwcm9jZXNzb3IKKyAgd2lsbCBiZSBsb2FkZWQgZnJvbSB0aGlzIHBhdGgKKworKiBhZGRlZCBhIGZvcmNlIGF0dHJpYnV0ZSB0byA8c3R5bGU+IHRvIHN1cHBvcnQgZGVwZW5kZW5jaWVzIHRoYXQgdGhlCisgIHRhc2sgY2Fubm90IGRldGVybWluZSBpdHNlbGYgKGRlcGVuZGVuY3kgb24gcGFyYW1ldGVycywgbm90IGZpbGUKKyAgbW9kaWZpY2F0aW9uIHRpbWVzIGZvciBleGFtcGxlKQorCisqIGFkZGVkIHZtbGF1bmNoZXIgYXR0cmlidXRlIHRvIGV4ZWMgdGFza3MuIFRoaXMgZGVmYXVsdHMgdG8gdHJ1ZS4gSWYKKyAgaXQgaXMgc2V0IHRvIGZhbHNlLCB0aGUgVk0ncyBhYmlsaXR5IHRvIGxhdW5jaCBjb21tYW5kcyBpbiBieXBhc3NlZAorICBhbmQgdGhlIE9TIHNoZWxsLCBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgYXV4aWxsYXJ5IGFudFJ1bgorICBzY3JpcHRzIGlzIHVzZWQuCisKKyogcmVnZXhwIG1hcHBlciBub3cgc3VwcG9ydHMgdGhlIGphdmEudXRpbC5yZWdleCBwYWNrYWdlIG9mIEpESyAxLjQuCisKKyogTmV3IGZpbGVzb25seSBhdHRyaWJ1dGUgZm9yIDx6aXA+IGFuZCBmcmllbmRzIHRvIHN1cHByZXNzIGRpcmVjdG9yeQorICBlbnRyaWVzLgorCisqIE5ldyB1cGRhdGUgYXR0cmlidXRlIGZvciA8emlwPiBhbmQgZnJpZW5kcyAtIHVwZGF0ZSBhbiBleGlzdGluZworICBhcmNoaXZlIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLgorCisqIDxhcHBseT4gYW5kIDxleGVjb24+IGhhdmUgYmVlbiBtZXJnZWQgaW50byBhIHNpbmdsZSB0YXNrLgorCisqIGFkZGVkIHZzc3Zlci5zY2MgdG8gdGhlIGRlZmF1bHQgZXhjbHVkZXMKKworKiA8YXZhaWxhYmxlPiBoYXMgYSBuZXcgZmlsZXBhdGggYXR0cmlidXRlL25lc3RlZCBlbGVtZW50IHRoYXQgYWxsb3dzCisgIHlvdSB0b3Agc2VhcmNoIGZvciBhIGZpbGUgaW4gYSBnaXZlbiBwYXRoLgorCisqIDxqdW5pdD4gY2FuIG5vdyBvcHRpb25hbGx5IHNldCBhIHByb3BlcnR5IG9uIHRlc3QgZmFpbHVyZS4KKworKiA8dGFza2RlZj4gY2FuIG5vdyBkZWZpbmUgc2V2ZXJhbCB0YXNrcyBhdCBvbmNlLCByZWFkaW5nIHRoZQorICBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tIGEgcHJvcGVydHkgZmlsZSBvciByZXNvdXJjZS4KKworKiA8dW56aXAvdW5qYXIvdW53YXI+IGFuZCA8dW50YXI+IG5vdyBoYXZlIGFuIG92ZXJ3cml0ZSBhdHRyaWJ1dGUgdGhhdAorICBkZWZhdWx0cyB0byB0cnVlLiAgSWYgc2V0IHRvIGZhbHNlLCBmaWxlcyB0aGF0IGFyZSBuZXdlciB0aGFuIHRoZQorICBmaWxlcyBpbiB0aGUgYXJjaGl2ZSB3aWxsIG5vdCBiZSByZXBsYWNlZC4KKworKiA8cGF0dGVybnNldD4gYW5kIDxmaWxlc2V0PiBub3cgc3VwcG9ydCBuZXN0ZWQgPGluL2V4Y2x1ZGVzZmlsZT4KKyAgZWxlbWVudHMgLSB1c2luZyB0aGVzZSB5b3UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBpbi9leGNsdWRlcyBmaWxlCisgIHBlciA8cGF0dGVybnNldD4uCisKKyogVGhyZWUgbmV3IHN1cHBvcnRlZCBjb21waWxlcnMgZm9yIGphdmFjOiBramMgZm9yIGtvcGksIGdjaiBmb3IgdGhlCisgIGdjYyBmcm9udGVuZCBhbmQgc2ogZm9yIFN5bWFudGVjJ3MgY29tcGlsZXIuCisgIEluIGFkZGl0aW9uIGV4dEphdmFjIG9yIHRoZSBuZXcgZm9yayBhdHRyaWJ1dGUgY2FuIGJlCisgIHVzZWQgdG8gcnVuIHRoZSBKREsncyBqYXZhYyBpbiBhIEpWTSBzZXBhcmF0ZSBmcm9tIEFudC4KKworKiA8Zml4cmxmPiBjYW4gbm93IHdpdGggQ1Igb25seSBsaW5lLWVuZHMgYW5kIGNhbiB1c2UgYW4gYXJiaXRyYXR5CisgIGJldHdlZW4gMiBhbmQgODAuCisKKyogVGhlIC5ORVQgdGFza3MgaGF2ZSBiZWVuIGFkYXB0ZWQgdG8gdGhlIGJldGEyIHJlbGVhc2Ugb2YgdGhlIGZyYW1ld29yay4KKworKiA8bW92ZT4gd2lsbCBub3cgdHJ5IHRvIHJlbmFtZSgpIGZpbGVzIGJlZm9yZSBjb3B5aW5nIHRoZW0gYnl0ZSBieQorICBieXRlIC0gb25seSBpZiBmaWx0ZXJpbmcgaXMgb2YsIG9mIGNvdXJzZS4KKworKiA8YW50PiBhbmQgPGFudGNhbGw+IHRhc2tzIG5vdyBzdXBwb3J0IGEgbmV3IGF0dHJpYnV0ZSBpbmhlcml0QWxsLiBXaGVuIHNldCB0bworICBmYWxzZSwgb25seSB1c2VyIHByb3BlcnRpZXMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSB0YXJnZXQgQW50IGluc3RhbmNlLgorICBUaGlzIGluY2x1ZGVzIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUgYW5kIHByb3BlcnRpZXMgZXhwbGljaXRseQorICBwYXNzZWQKKworKiA8amF2YWRvYz4gbm93IHNraXBzIG9mZiBsaW5lIGxpbmtzIGlmIHRoZSBwYWNrYWdlIGxpc3QgY2Fubm90IGJlIGZvdW5kLgorCisqIDx3bHJ1bj4gbm93IGFsbG93cyB0aGUgc2VjdXJpdHkgcG9saWN5IGZpbGUgdG8gZXhpc3Qgb3V0c2lkZSB0aGUgd2VibG9naWMKKyAgZGlyZWN0b3J5LgorCisqIDxqYXZhPiB0YXNrIHdpbGwgc2V0IHRoZSBUaHJlYWQgY29udGV4dENsYXNzTG9hZGVyIHVuZGVyIEpES3MgMS4yKyB0byB0aGUKKyAgY2xhc3Nsb2FkZXIgZm9yIHRoZSBjbGFzcyBiZWluZyBleGVjdXRlZC4KKworKiBJbnRyb2R1Y2UgdGhlIGNvbmNlcHQgb2YgYSBUYXNrQ29udGFpbmVyIC0gYSB0YXNrIG9yIGVsZW1lbnQgd2hpY2ggY2FuIGNvbnRhaW4KKyAgQW50IFRhc2tzLgorCisqIEFkZCBuZXcgdGFza3MgaW1wbGVtZW50aW5nIHRoZSBUYXNrQ29udGFpbmVyIGludGVyZmFjZSA8cGFyYWxsZWw+IGFuZAorICA8c2VxdWVudGlhbD4gd2hpY2ggYWxsb3cgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHRhc2tzIHRvIGJlIHNwZWNpZmllZC4KKworKiA8ZGVwZW5kPiB0YXNrIHdpbGwgbm93IHRha2UgaW50byBhY2NvdW50IGRlcGVuZGVuY2llcyBvbiBqYXIgZmlsZXMgYW5kIGNsYXNzCisgIGZpbGVzIGZyb20gYSBnaXZlbiBjbGFzc3BhdGguCisKKyogPGphcj4gbWFuaWZlc3QgZW50cmllcyBtYXkgbm93IGJlIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZSBlaXRoZXIKKyAgY29tcGxldGVseSBvciB0byBiZSBtZXJnZWQgd2l0aCBhIG1hbmlmZXN0IGZpbGUuCisKKyogPHRzdGFtcD4gdGFzayBjdXN0b20gZm9ybWF0cyBub3cgc3VwcG9ydCBsb2NhbGVzLgorCisqIEFkZGVkIGEgbGlzdG5lciB3aGljaCB3aWxsIGZvcndhcmQgZXZlbnRzIHRvIExvZzRKLiBUaGUgbG9nNGogY29uZmlndXJhdGlvbgorICBmaWxlIHNob3VsZCBiZSBpbiB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggQW50IGlzIHJ1biBvciBwYXNzZWQgYXMgYSBzeXN0ZW0KKyAgcHJvcGVydHkgdXNpbmcgYSBKVk0gYXJndW1lbnQuCisKKyogSW50cm9kdWNlZCB0aGUgY29uY2VwdCBvZiA8ZmlsdGVyc2V0cz4gdG8gYWxsb3cgZm9yIG1vcmUgY29udHJvbCBpbiB3aGljaAorICBmaWx0ZXJzIGdldCBhcHBsaWVkIGluIGEgPGNvcHk+IG9yIDxtb3ZlPiBvcGVyYXRpb24uCisKKyogQWRkZWQgbm93YXJuIGF0dHJpYnV0ZSB0byBqYXZhYyBhbmQgZGVwcmVjYXRlZCB0aGUgSmlrZXMtbWFnaWMgcHJvcGVydHkKKyAgYnVpbGQuY29tcGlsZXIud2FybmluZ3MuCisKKyogVGhlIDxkZXBlbmQ+IHRhc2sgY2FjaGUgZm9ybWF0IGhhcyBjaGFuZ2VkIGFuZCBhbGwgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpcworICBub3cgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUuCisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisqIFRlc3RjYXNlcyBoYXZlIGJlZW4gbWFkZSBpbmRlcGVuZGVudCBvZiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorCisqIElucHV0IFpJUC1GaWxlcyB3aWxsIGJlIGNsb3NlZCB3aGVuIHVzaW5nIGEgPHppcGZpbGVzZXQ+LgorCisqIHA0IHRhc2tzIG5vdyBkb24ndCBmYWlsIGlmIHVzZXIsIHBvcnQgb3IgY2xpZW50IGhhdmUgYmVlbiBvbWl0dGVkCisgIChhbmQgdGhpcyBpcyBhY2NlcHRhYmxlIGZvciB0aGUgY29udGV4dCBvZiB0aGUgY29tbWFuZCkuCisKKyogPGphdmFoPidzIG91dHB1dGZpbGUgYXR0cmlidXRlIHdpbGwgYmUgcmVzb2x2ZWQgYXMgcmVsYXRpdmUgdG8gdGhlCisgIHByb2plY3RzIGJhc2VkaXIuCisKKyogPGFudHN0cnVjdHVyZT4gc2hvdWxkIGNyZWF0ZSBhIHZhbGlkIERURCBmb3IgcHJvcGVydHlmaWxlLm9wZXJhdGlvbi5lbnRyeQorICBhbmQgb21pdCB0YXNrcyBpdCBmYWlscyB0byBsb2FkLgorCisqIHdvbid0IHRyeSB0byBwYXNzIGEgLWJvb3RjbGFzc3BhdGggZmxhZyB0byBqYXZhYyAxLjEgYW55bW9yZQorCisqIDxzdHlsZT4ncyBzdHlsZSBhdHRyaWJ1dGUgbm8gaGFuZGxlcyBhYnNvbHV0ZSBwYXRocyBjb3JyZWN0bHkuCisKKyogPGRlbGV0ZSBpbmNsdWRlZW1wdHlkaXJzPSJ0cnVlIj4gbm93IGRlbGV0ZXMgbW9yZSB0aGFuIGp1c3QgdGhlIGxlYWYKKyAgZGlyZWN0b3JpZXMuCisKKyogWW91IGNhbiBub3cgc3BlY2lmeSBhIDxmaWxlc2V0PiBmb3IgYSBkaXJlY3RvcnkgdGhhdCBkb2Vzbid0IGV4aXN0IGF0CisgIGRlY2xhcmF0aW9uIHRpbWUgYnV0IHdpbGwgY3JlYXRlZCBiZWZvcmUgdGhlIGZpbGVzZXQgZ2V0cyB1c2VkIGZvciB0aGUKKyAgZmlyc3QgdGltZS4KKworKiBJZiB0aGUgcXVpZXQgYXR0cmlidXRlIGhhcyBiZWVuIHNldCwgPGRlbGV0ZT4gd2lsbCBoYW5kbGUgPGZpbGVzZXQ+cworICB3aXRoIG5vbi1leGlzdGluZyBkaXJlY3RvcmllcyBncmFjZWZ1bGx5LgorCisqIE91dHB1dCB3cml0dGVuIGJ5IHRlc3RjYXNlcyB3aWxsIG5vdyBiZSBjYXB0dXJlZCBieSB0aGUgPGp1bml0PiB0YXNrCisgIGFuZCBwYXNzZWQgdG8gdGhlIGZvcm1hdHRlcnMuCisKKyogUXVvdGUgdGhlIC1ncm91cCBwYXJhbWV0ZXIgdG8gSmF2YWRvYyBhcyBwZXIgdGhlIHNwZWNpZmljYXRpb24KKworKiBJbml0aWFsaXNlIGNsYXNzZXMgd2hlbiBsb2FkZWQgdGhyb3VnaCB0aGUgQW50Q2xhc3NMb2FkZXIgLSB0aGF0IGlzLCBydW4KKyAgc3RhdGljIGluaXRpYWxpemVycworCisqIEltcGxlbWVudCBnZXRSZXNvdXJjZSgpIGFuZCBnZXRSZXNvdXJjZXMoKSBpbiBBbnRDbGFzc0xvYWRlcgorCisqIENyZWF0ZSB0aGUgPGVqYmphcj4gd2VibG9naWMgY29tbWFuZCBsaW5lIGFzIGEgc2V0IG9mIGFyZ3VtZW50cyByYXRoZXIgdGhhbgorICBhcyBhIHNpbmdsZSBsaW5lLiBBdm9pZHMgcHJvYmxlbXMgd2l0aCBwYXRocyB3aGljaCBjb250YWluIHNwYWNlcy4KKworKiA8ZWpiamFyPiBub3cgZmFpbHMgd2hlbiB0aGUgd2VibG9naWMgZWpiYyBjb21waWxlciByZXBvcnRzIGFuIGVycm9yLgorCisqIE1ha2UgdGhlIEFudENsYXNzTG9hZGVyIGxvYWQgcmVzb3VyY2VzIGluIHRoZSBzYW1lIG9yZGVyIGFzIGl0IGN1cnJlbnRseQorICBsb2FkcyBjbGFzc2VzLgorCisqIEhhbmRsZSBjbGFzc3BhdGhzIHdpdGggc3BhY2VzCisKKyogTWFrZSBzdXJlIFhTTFQgcHJvY2Vzc29ycyBjbG9zZSB0aGVpciBvdXRwdXQgZmlsZXMgaW4gPHN0eWxlPi4KKworKiBwZXJmb3JtIHByb3BlciB1cHRvZGF0ZSBjaGVjayBpbiA8cm1pYz4gd2hlbiBjb21waWxpbmcgZm9yIElJT1AuCisKKyogPGpqdHJlZT4ncyB1cHRvZGF0ZSB0ZXN0IHdvcmtzIGV2ZW4gaWYgb3V0cHV0ZGlyZWN0b3J5IGlzIG5vdCB0aGUKKyAgcGFyZW50IGRpciBvZiB0YXJnZXQKKworKiA8Y29weT4gd2lsbCByZW1vdmUgdGFyZ2V0IGZpbGUgKGlmIGl0IGV4aXN0cykgYmVmb3JlIHdyaXRpbmcgdG8gaXQgLQorICB0aGlzIGF2b2lkcyBwcm9ibGVtcyB3aXRoIGxpbmtzIG9uIGZpbGVzeXN0ZW1zIHRoYXQgc3VwcG9ydCB0aGVtLgorCisqIDxmdHA+IG5vdyBwcm9wZXJseSByZWN1cnNlcyByZW1vdGUgZGlyZWN0b3JpZXMuCisKKyogPGZ0cD4gY2xvc2VzIHJlbW90ZSBjb25uZWN0aW9uIHdoZW4gaXQncyBkb25lLgorCisqIDxqdW5pdD4gdHJpZXMgdG8gaW5jbHVkZSBhbGwgbmVjZXNzYXJ5IGNsYXNzZXMgZm9yIHRoZSB0YXNrIGl0c2VsZgorICB0byB0aGUgY2xhc3NwYXRoIHdoZW4gcnVubmluZyBpbiBmb3JrIG1vZGUgLSBkb2Vzbid0IHdvcmsgZm9yIEpESyAxLjEKKworKiA8YXBwbHk+IGFuZCA8ZXhlY29uPiBkbyBub3cgZXhlY3V0ZSB0aGUgY29tbWFuZCBvbmx5IG9uY2UsIGlmIHlvdQorICBzcGVjaWZ5IHRoZSBwYXJhbGxlbCBhdHRyaWJ1dGUgLSBpbnN0ZWFkIG9mIG9uY2UgcGVyIGZpbGVzZXQuCisKKyogZGlyZWN0b3J5IGJhc2VkIHRhc2tzIGFuZCBmaWxlc2V0IGNvdWxkIG1pc3Mgc29tZSBpbmNsdWRlZCBmaWxlcyBpbgorICBkaXJlY3RvcmllcyB0aGF0IGhhdmUgYmVlbiBleGNsdWRlZAorCisqIDxmaXhjcmxmPiBmYWlsZWQgZm9yIGxhcmdlIGZpbGVzLgorCisqIDxtb3ZlPiByZW1vdmVkIGZpbGVzIHlvdSB0cmllZCB0byBtb3ZlIHRvIHRoZW1zZWx2ZXMuCisKKyogPHNxbD4gdGFzayB3aWxsIG5vdCB0cnR5IHRvIHByaW50IHRoZSByZXN1bHQgc2V0IHVubGVzcyB0aGUgcXVlcnkgc3VjY2VlZGVkLgorCisqIEFudCBjbGFzc2xvYWRlciB3aWxsIG5vdyBpZ25vcmUgcGF0aHMgd2hpY2ggYXJlIGludmFsaWQgcmVsYXRpdmUgdG8gdGhlCisgIHByb2plY3QgYmFzZQorCisqIDxlamJqYXI+IHdlYmxvZ2ljIGVsZW1lbnRzIGNoZWNrIGZvciBqYXIgZmlsZSBjaGFuZ2VzIGhhcyBiZWVuIGZpeGVkLgorICBQcmV2aW91c2x5IHNvbWUgY2hhbmdlcyB3b3VsZCBub3QgYmUgaW5jbHVkZWQuCisKKyogcHJvcGVydGllcyBsb2FkZWQgZnJvbSBwcm9wZXJ0aWVzIGZpbGVzIGFyZSBub3cgcmVzb2x2ZWQgaW50ZXJuYWxseS4gVGhpcworICByZW1vdmVzIHRoZSBzcHVyaW91cyB3YXJuaW5ncyBhYm91dCB1c2FnZSBvZiBwcm9wZXJ0aWVzIHdoaWNoIGhhdmUgbm90IGJlZW4KKyAgc2V0LgorCisqIDxqYXI+IHRhc2sgYW5kIGZyaWVuZHMgbm93IHByb2Nlc3MgdGhlIEpBUiBtYW5pZmVzdCB0byBlbnN1cmUgaXQgaXMgdmFsaWQuCisKKyogVGhlIHRhc2sgZmluaXNoZWQgZXZlbnQgbm93IGluY2x1ZGVzIGFueSBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSB0YXNrLgorCisqIDxqYXZhPiB0YXNrIG5vdyBzdXBwb3J0cyBhIGp2bVZlcnNpb24gYXR0cmlidXRlIHNvIHRoYXQgaWYgYW5vdGhlciBKVk0gaXMKKyAgYmVpbmcgdXNlZCwgQW50IGNhbiBkZXRlcm1pbmUgd2hpY2ggb3B0aW9ucyB0byB1c2UgZm9yIGZlYXR1cmVzIHN1Y2ggYXMgdGhlCisgIFZNIG1lbW9yeSBsaW1pdHMKKworCitDaGFuZ2VzIGZyb20gQW50IDEuMiB0byBBbnQgMS4zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEFudCBkb2Vzbid0IHNlYXJjaCBmb3IgdGhlIGJ1aWxkZmlsZSBhbnltb3JlLCB1bmxlc3MgeW91IHVzZSB0aGUgbmV3CisgIC1maW5kIGFyZ3VtZW50LgorCisqIDxwZXJmb3JjZT4gaGFzIGJlZW4gcmVwbGFjZWQgYnkgYSBudW1iZXIgb2YgbmV3IHRhc2tzLgorCisqIDxqYXZhYz4gaXMgbm93IGltcGxlbWVudGVkIHVzaW5nIGEgZmFjdG9yeS4gVGhpcyBtYWtlcyBleHRlbmRpbmcKKyAgamF2YWMgdG8gdXNlIGEgbmV3IGNvbXBpbGVyIGEgbG90IGVhc2llciBidXQgbWF5IGJyZWFrIGN1c3RvbQorICB2ZXJzaW9ucyBvZiB0aGlzIHRhc2sgdGhhdCByZWx5IG9uIHRoZSBvbGQgaW1wbGVtZW50YXRpb24uCisKKyogVGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIHhtbCBmb3JtYXR0ZXIgZm9yIDxqdW5pdD4gaGFzIGNoYW5nZWQgYQorICBsaXR0bGUsIGl0IGRvZXNuJ3QgYXBwZW5kICIgc2VjIiBpbiB0aGUgdGltZSBhdHRyaWJ1dGUgYW55bW9yZS4KKworT3RoZXIgY2hhbmdlczoKKy0tLS0tLS0tLS0tLS0tCisKKyogQSBHVUkgRnJvbnRlbmQ6IEFudGlkb3RlLiBUaGlzIGlzIGN1cnJlbnRseSBpbiBkZXZlbG9wbWVudC4gQXQgdGhpcworICB0aW1lLCB0aGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBBbnQgcmVsZWFzZSwgYWx0aG91Z2ggdGhlIHNvdXJjZSBpcworICBpbmNsdWRlZCBpZiB5b3UgYXJlIGludGVyZXN0ZWQuCisKKyogTmV3IHRhc2tzOiBzdHlsZWJvb2ssIHByb3BlcnR5ZmlsZSwgZGVwZW5kLCBhbnRsciwgdGVsbmV0LCBjc2MsCisgIGlsYXNtLCBhcHBseSwgamF2YWgsIHNldmVyYWwgY2xlYXJjYXNlIHRhc2tzLCBqdW5pdHJlcG9ydCwgc291bmQKKworKiBBZGRlZCBvdXRwdXQgYXR0cmlidXRlIHRvIDxqYXZhPi4KKworKiBBZGRlZCBuZXN0ZWQgemlwZmlsZXNldCBlbGVtZW50IHRvIDx6aXA+CisKKyogQ2hhbmdlZCA8c3FsPiBzbyB0aGF0IHByaW50aW5nIGlzIGF0IHRoZSB0YXNrIGxldmVsIHJhdGhlciB0aGFuCisgIHRoZSBzdGF0ZW1lbnQgbGV2ZWwuCisKKyogamF2YWRvYyB0YXNrIHdpbGwgcGFzcyAtZCBmbGFnIHRvIGFueSBkb2NsZXQgaWYgdGhlIGRlc3REaXIgYXR0cmlidXRlIGlzCisgIGdpdmVuLiBJZiB0aGUgZG9jbGV0IGRvZXMgbm90IGFjY2VwdCB0aGUgLWQgZmxhZyB0aGVuIG9taXQgdGhlIGRlc3RkaXIKKyAgYXR0cmlidXRlLgorCisqIDxjYWI+IGNhbiB3b3JrIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyB3aXRoIHRoZSBoZWxwIG9mIGxpYmNhYmluZXQuCisgIFNlZSBodHRwOi8vdHJpbGwuY2lzLmZvcmRoYW0uZWR1L35iYXJiYWNoYS9jYWJpbmV0X2xpYnJhcnkvLgorCisqIDxmdHA+IG5vdyBzdXBwb3J0cyBwYXNzaXZlIG1vZGUuCisKKyogTmV3IDxtYXBwZXI+IGRhdGEgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCBpbmZsdWVuY2Ugb24gdGhlCisgIHRhcmdldCBmaWxlcyBmb3Igc29tZSB0YXNrcyBsaWtlIDxjb3B5PiBvciBlbmFibGUgbmV3IHR5cGVzIG9mIHRhc2tzCisgIGxpa2UgPGFwcGx5Pi4KKworKiA8ZXhlY29uPiBwcm92aWRlcyBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgY29tbWFuZCBsaW5lIG5vdywgdGhlIG5hbWVzCisgIG9mIHRoZSBzb3VyY2UgZmlsZXMgYXJlIG5vIGxvbmdlciByZXF1aXJlZCB0byBiZSBhdCB0aGUgZW5kIG9mIHRoZQorICBjb21tYW5kLgorCisqIFN0eWxlIHRhc2tzIHdpbGwgbm93IHN1cHBvcnQgVHJhWCBjb21wbGlhbnQgWFNMIHByb2Nlc3NvcnMgaWYgb25lIGlzIHByZXNlbnQKKyAgaW4geW91ciBjbGFzc3BhdGguCisKKyogQWRkZWQgYSBmYWlsb25lcnJvciB0byB0aGUgamF2YWMgdGFzay4gSWYgc2V0IHRvIGZhbHNlLCB0aGUgYnVpbGQgd2lsbAorICBjb250aW51ZSBldmVuIGlmIHRoZXJlIGFyZSBjb21waWxhdGlvbiBlcnJvcnMuCisKKyogQWRkZWQgbmVzdGVkIGZvcm1hdCBlbGVtZW50cyB0byB0aGUgdHN0YW1wIHRhc2sgYWxsb3dpbmcgYWRkaXRpb25hbCB0aW1lCisgIGZvcm1hdHMgdG8gYmUgZGVmaW5lZCBmb3IgYXJiaXRyYXJ5IHByb3BlcnRpZXMuCisKKyogQWRkZWQgY2xhc3NwYXRoIGF0dHJpYnV0ZSBhbmQgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50IHRvIDxwcm9wZXJ0eT4KKyAgdG8gbWFrZSB0aGUgcmVzb3VyY2UgYXR0cmlidXRlIG1vcmUgcG93ZXJmdWwuCisKKyogJHt9IHByb3BlcnR5IGV4cGFuc2lvbiB3aWxsIG5vdyBiZSBwZXJmb3JtZWQgb24gdGhlIHBhdHRlcm5zIHJlYWQKKyAgZnJvbSBmaWxlcyBzcGVjaWZpZWQgYXMgaW5jbHVkZXNmaWxlIG9yIGV4Y2x1ZGVzZmlsZSBhdHRyaWJ1dGVzLgorCisqIFRoZSA8dGFyPiBhbmQgPHVudGFyPiB0YXNrcyBub3cgc3VwcG9ydCBHTlUgZm9ybWF0IGZvciBoYW5kbGluZyBwYXRocworICB3aGljaCBhcmUgZ3JlYXRlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGluIGxlbmd0aC4gSW4gYWRkaXRpb24gdGhlIDx0YXI+CisgIHRhc2sgbm93IHN1cHBvcnRzIG5lc3RlZCBmaWxlc2V0cyB0aHJvdWdoIHdoaWNoIHRoZSBmaWxlIHBlcm1pc3Npb25zCisgIG1heSBiZSBjb250cm9sbGVkLgorCisqIHdscnVuLCB3bHN0b3AgYW5kIGVqYmphciBub3cgc3VwcG9ydCBXZWJsb2dpYyA2LjAKKworKiBUaGUgTVBhc3JlIHRhc2sgaGFzIGJlZW4gdXBkYXRlZCB0byB3b3JrIHdpdGggTVBhcnNlIDIuMAorCisqIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHNpZ25pZmljYW50bHkgdXBkYXRlZC4KKworCitGaXhlZCBidWdzOgorLS0tLS0tLS0tLS0KKworKiA8c2lnbmphcj4gbm8gbG9uZ2VyIHVzZXMgZGVwcmVjYXRlZCBtZXRob2RzLgorCisqIGphdmFkb2MncyBmYWlsb25lcnJvciBhdHRyaWJ1dGUgd29ya3MgYWdhaW4KKworKiBqYXZhZG9jJ3MgYWRkaXRpb25hbHBhcmFtIGF0dHJpYnV0ZSB3aWxsIG5vdyBiZSBzcGxpdCBpbnRvIHNlcGFyYXRlCisgIHBhcmFtZXRlcnMgKG9uIHNwYWNlcykgdG8gYWxsb3cgZm9yIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLgorCisqIENoYW5nZWQgPHNxbD4gdGFzayBzbyB0aGF0IHByaW50aW5nIHJlc3VsdCBzZXRzIHdvcmtzIG9uIE9yYWNsZQorCisqIENoYW5nZXMgdG8gZGRjcmVhdG9yIGFuZCBlamJjIGhlbHBlciB0byByZXNwZWN0IHRoZSBkZXNjcmlwdG9yIGhpZXJhcmNoeQorICBrZXBwZ2VuZXJhdGVkIGluIGVqYmMgY2FuIG5vdyBiZSB0dXJuZWQgb2ZmCisKKyogZWpiamFyIG5vdyBjb3JyZWN0bHkgaWdub3JlcyA8ZWpiLXJlZj4gZWxlbWVudHMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAgQ01QIGZpbGVzIGFyZSBpbmNsdWRlZCBieSBwYXJzaW5nIHRoZSB3ZWJsb2dpYyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmF0aGVyCisgIHRoYW4gcmVseWluZyBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24gdXNlZCBpbiBhbnQgMS4yCisKKyogZWpiamFyIGluY2x1ZGVzIHN1cGVyIGNsYXNzZXMgYW5kIHN1cGVyIGludGVyZmFjZXMgaW50byB0aGUgZ2VuZXJhdGVkIGVqYgorICBqYXIgZmlsZXMuIFRoZSA8c3VwcG9ydD4gbmVzdGVkIGVsZW1lbnQgYWxsb3dzIHN1cHBvcnQgY2xhc3NlcyB0byBiZQorICBpbmNsdWRlZCBpbiB0aGUgRUpCIGphci4gVGhlIHRvcGxpbmsgZWxlbWVudCBzaG91bGQgbm93IGNvcnJlY3RseSBsb2NhdGUKKyAgdGhlIHRvcGxpbmsgZGVzY3JpcHRvci4KKworKiA8dnNzZ2V0PiBub3cgY29ycmVjdGx5IGRlYWxzIHdpdGggc3BhY2VzIGluIGFyZ3VtZW50cworCisqIDxqYXI+IGZhaWxzIGVhcmx5IGlmIGEgZ2l2ZW4gbWFuaWZlc3QgZmlsZSBkb2Vzbid0IGV4aXN0CisKKyogPHJtaWM+IGRvZXNuJ3Qgc2VhcmNoIGZvciB0aGUgX1NrZWwgZmlsZSBhbnltb3JlIHdoZW4gc3R1YnZlcnNpb24gaXMKKyAgc2V0IHRvIDEuMi4KKworKiA8cm1pYz4gdXNlcyB0aGUgdGhlIHNhbWUgY2xhc3NwYXRoIHRvIHZlcmlmeSBhIGNsYXNzIGNhbiBiZSBybWljJ2QKKyAgYXMgaXQgcGFzc2VzIHRvIHRoZSBjb21waWxlci4KKworKiBvcmcuYXBhY2hlLnRvb2xzLm1haWwuTWFpbE1lc3NhZ2UgKGFuZCB0aGVyZWZvcmUgPG1haWw+KSBjYW4gbm93CisgIGhhbmRsZSBTTVRQIHNlcnZlcnMgc2VuZGluZyBtdWx0aSBsaW5lIHJlc3BvbnNlcy4KKworKiBuZXN0ZWQgPGNsYXNzcGF0aD4gZWxlbWVudHMgb2YgPHRhc2tkZWY+IG5vdyB3b3JrIGZvciA8dGFza2RlZj5zIG5vdAorICBuZXN0ZWQgaW50byA8dGFyZ2V0PiBhcyB3ZWxsLgorCisqIDxwcm9wZXJ0eT4gYW5kIDxhdmFpbGFibGU+IHdpbGwgc2VhcmNoIGZvciB0aGUgcmVzb3VyY2UgImZvbyIgaW5zdGVhZAorICBvZiAiL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2ZvbyIgd2hlbiBnaXZlbiBhIHJlbGF0aXZlIHJlc291cmNlCisgIG5hbWUgZm9vLgorCisqIEhhbmRsZSBidWlsZCBmaWxlcyBpbiBkaXJlY3RvcmllcyB3aG9zZSBuYW1lIGNvbnRhaW5lZCBhICIjIiBjaGFyYWN0ZXIKKworKiA8anVuaXQ+IGNhbiBub3cgbG9nIHRvIGZpbGVzIHdob3NlIG5hbWUgY29udGFpbnMgYSBjb21tYSBhcyB3ZWxsLgorCisqIFRoZSBBbnRDbGFzc0xvYWRlciBub3cgcmVmZXJzIHRvIHRoZSBsb2FkZXIgd2hpY2ggbG9hZGVkIGl0LCBhbnkKKyAgcmVxdWVzdHMgaXQgZG9lcyBub3QgaGFuZGxlIGl0c2VsZi4gUHJldmlvdXNseSB0aGVzZSB3ZW50IHRvIHRoZQorICBwcmltb3JkaWFsIGxvYWRlci4KKworQ2hhbmdlcyBmcm9tIEFudCAxLjEgdG8gQW50IDEuMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDaGFuZ2VzIHRoYXQgY291bGQgYnJlYWsgb2xkZXIgZW52aXJvbm1lbnRzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBTZW1hbnRpY3Mgb2YgPHByb3BlcnR5PiBoYXMgY2hhbmdlZCBhZ2FpbiBpbiB0aGUgaG9wZSB0byBiZSBtb3JlCisgIGludHVpdGl2ZS4gJHt9IGV4cGFuc2lvbiBub3cgaGFwcGVucyBhdCBydW50aW1lIGFuZCA8cHJvcGVydHk+IHRhZ3MKKyAgbGl2aW5nIGluc2lkZSBvZiB0YXJnZXRzIG9ubHkgdGFrZSBlZmZlY3QgaWYgdGhleSBhcmUgdmlzaXRlZCBhdAorICBydW50aW1lLgorCisgIEFzIGEgc2lkZSBlZmZlY3Qgb2YgdGhpcyBjaGFuZ2UsIHRhc2sncyBhdHRyaWJ1dGVzIGdldCBzZXQgYXQgcnVudGltZQorICBub3QgYXQgcGFyc2VyIHRpbWUgYXMgd2VsbCwgd2hpY2ggbWlnaHQgY2hhbmdlIHRoZSByZXN1bHRzIG9mCisgIDxzY3JpcHQ+cyBvciBvdGhlciBjdXN0b20gdGFza3MgdGhhdCByZWZlcmVuY2Ugb3RoZXIgdGFza3MgYnkgdGhlaXIgaWQKKyAgYXR0cmlidXRlLgorCisqIGNvcHlpbmcgb2Ygc3VwcG9ydCBmaWxlcyBpbiA8amF2YWM+IGhhcyBiZWVuIHJlbW92ZWQgLSBhcyB3ZWxsIGFzCisgIHRoZSBmaWx0ZXJpbmcgYXR0cmlidXRlLgorCisqIHRoZSA8ZXhwYW5kPiBhbmQgPGtleXN1YnN0PiB0YXNrcyBoYXZlIGJlZW4gcmVtb3ZlZC4KKworKiB0aGUgaWdub3JlIGFuZCBpdGVtcyBhdHRyaWJ1dGVzIG9mIGRpcmVjdG9yeSBiYXNlZCB0YXNrcyBoYXZlIGJlZW4gcmVtb3ZlZC4KKworKiB0aGUgY29tbWFuZCBsaW5lIHN3aXRjaGVzIF9ub3RfIHN0YXJ0aW5nIHdpdGggLSBoYXZlIGJlZW4gcmVtb3ZlZC4KKworKiBQYXRoIGFuZCBFbnVtZXJhdGVkQXR0cmlidXRlIGhhdmUgYmVlbiBtb3ZlZCBmcm9tCisgIG9yZy5hcGFjaGUudG9vbHMuYW50IHRvIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLgorCisqIHRoZSBjbGFzcyBhdHRyaWJ1dGVzIG9mIDxhdmFpbGFibGU+LCA8amF2YT4sIDxybWljPiBhbmQgPHRhc2tkZWY+CisgIGhhdmUgYmVlbiByZW1vdmVkLgorCisqIHRoZSBzcmMgYXR0cmlidXRlIG9mIDxjaG1vZD4gaGFzIGJlZW4gcmVtb3ZlZC4KKworKiA8cGF0Y2g+IGFuZCA8amF2YWRvYz4gaGF2ZSBsb3N0IHNvbWUgb2YgdGhlaXIgYXR0cmlidXRlcy4KKworKiA8amF2YT4gYW5kIDxjdnM+IGhhdmUgbG9zdCBzb21lIHVuZG9jdW1lbnRlZCBhdHRyaWJ1dGVzLgorCisqIHRoZSBVbml4IGFudFJ1biBzY3JpcHQgd291bGQgc2VhcmNoIGZvciBjb21tYW5kLnNoIGluIHRoZSBkaXJlY3RvcnkKKyAgaXQgY2hhbmdlZCB0byBhbmQgaW52b2tlIHRoaXMgaW5zdGVhZCBvZiBjb21tYW5kIGlmIHByZXNlbnQuIFRoaXMKKyAgYmVoYXZpb3IgaGFzIGJlZW4gZHJvcHBlZC4KKworKiA8ZWpiamFyPiB0YXNrIHN5bnRheCBoYXMgYmVlbiBjaGFuZ2VkIHNpZ25pZmljYW50bHkKKworKiA8ZXhlYz4gaXMgbm8gbG9uZ2VyIGltcGxlbWVudGVkIGJ5IG9yZy5hcGFjaGUudG9vbC5hbnQudGFza2RlZnMuRXhlYy4KKyAgQ3VzdG9tIHRhc2tzIHRoYXQgcmVseSBvbiBQcm9qZWN0LmNyZWF0ZVRhc2soImV4ZWMiKSB0byByZXR1cm4gYW4KKyAgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhcmUgZ29pbmcgdG8gZmFpbC4KKworKiBuZXN0ZWQgPGluY2x1ZGU+IGFuZCA8ZXhjbHVkZT4gZWxlbWVudHMgZXhwZWN0IHRoZSB2YWx1ZSBvZiB0aGVpcgorICBuYW1lIGF0dHJpYnV0ZSB0byBiZSBhIHNpbmdsZSBwYXR0ZXJuLCB0aGV5IGRvbid0IGFjY2VwdCBtdWx0aXBsZQorICBwYXR0ZXJucyBhbnltb3JlLiBTcGxpdCB0aGVtIGludG8gbXVsdGlwbGUgZWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZS4KKworKiA8ZGVsZXRlIGRpcj0ic29tZWRpciIgLz4gd2lsbCBub3cgZGVsZXRlIHRoZSBkaXJlY3RvcnkgaXRzZWxmIGFzCisgIHdlbGwgYXMgYWxsIGluY2x1ZGVkIGZpbGVzLiBJZiB5b3UganVzdCB3YW50IHRvIGNsZWFuIG91dCB0aGUKKyAgZGlyZWN0b3J5IGFuZCBrZWVwIHRoZSBlbXB0eSBvbmUsIHVzZSBhIG5lc3RlZCBmaWxlc2V0LgorCitPdGhlciBjaGFuZ2VzOgorLS0tLS0tLS0tLS0tLS0KKworKiBOZXcgdGFza3M6IGFudHN0cnVjdHVyZSwgY2FiLCBleGVjb24sIGZhaWwsIGZ0cCwgZ2Vua2V5LCBqbGluaywKKyAganVuaXQsIHNxbCwgamF2YWNjLCBqanRyZWUsIHN0YXJ0ZWFtLCB3YXIsIHVud2FyLCB1cHRvZGF0ZSwKKyAgbmF0aXZlMmFzY2lpLCBjb3B5LCBtb3ZlLCBtcGFyc2UuCisKKyogY29weWRpciwgY29weWZpbGUsIGRlbHRyZWUgYW5kIHJlbmFtZSBhcmUgbm93IGRlcHJlY2F0ZWQuIFRoZXkKKyAgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBjb3B5LCBkZWxldGUgYW5kIG1vdmUgdGFza3MuCisKKyogPGphdmE+IHVzZXMgYSBDbGFzc0xvYWRlciBvZiBpdHMgb3duIGluIG5vLWZvcmsgbW9kZSBpZiBhIGNsYXNzcGF0aCBpcworICBzcGVjaWZpZWQuCisKKyogPHN0eWxlPiB3aWxsIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHRhcmdldCBkaXJlY3RvcmllcyBhbmQgcmVwcm9jZXNzCisgIGFsbCBmaWxlcyBpZiB0aGUgc3R5bGVzaGVldCBjaGFuZ2VzLgorCisqIE5ldyBkYXRhIHR5cGVzIGZpbGVzZXQgYW5kIHBhdHRlcm5zZXQgLSBleHBlY3RlZCB0byBnZXQgYSBicm9hZGVyIHVzZS4KKyAgVGhleSwgYXMgd2VsbCBhcyBQQVRIIGxpa2Ugc3RydWN0dXJlcywgY2FuIG5vdyBiZSBkZWZpbmVkIG9uIGEgZ2xvYmFsCisgIGxldmVsIGFuZCBsYXRlciBiZSByZWZlcmVuY2VkIGJ5IHRoZWlyIGlkIGF0dHJpYnV0ZS4KKworKiBZb3UgY2FuIHNwZWNpZnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIDxleGVjPi4KKworKiA8Z2V0PiBjYW4gY2hlY2sgd2hldGhlciBhIHJlbW90ZSBmaWxlIGlzIGFjdHVhbGx5IG5ld2VyIHRoYW4gYSBsb2NhbAorICBjb3B5IGJlZm9yZSBpdCBzdGFydHMgYSBkb3dubG9hZCAoSFRUUCBvbmx5KS4KKworKiBBZGRlZCBhIC1sb2dnZXIgb3B0aW9uIHRvIGFsbG93IHRoZSBjbGFzcyB3aGljaCBwZXJmb3JtcyBsb2dnaW5nIHRvIGJlCisgIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisqIEFkZGVkIGEgLWVtYWNzIG9wdGlvbiB0byB0ZWxsIHRoZSBsb2dnZXIgdG8gbGVhdmUgb3V0IHRhc2tuYW1lIGFkb3JubWVudHMKKyAgb24gbG9nIG91dHB1dC4KKworKiA8Y2htb2Q+IHdvcmtzIG9uIGFsbCBmaWxlcyBpbiBwYXJhbGxlbCBhbmQgc3VwcG9ydHMgbXVsdGlwbGUgZmlsZXNldHMuCisKKyogPHJlcGxhY2U+IGNhbiBub3cgdXNlIHRva2VucyBhbmQvb3IgdmFsdWVzIHRoYXQgY3Jvc3MgbGluZSBib3VuZGFyaWVzLgorCisqIGJ1aWxkLmNvbXBpbGVyIHN1cHBvcnRzIG5vdyBqdmMgYXMgd2VsbC4KKworKiBwcm9qZWN0IHNwZWNpZmljIGhlbHAgY2FuIG5vdyBiZSBvYnRhaW5lZCB3aXRoIHRoZSAtcHJvamVjdGhlbHAgb3B0aW9uLgorCisqIEFkZGVkIGEgLWRlYnVnIG9wdGlvbiB0byBtYWtlIC12ZXJib3NlIGxlc3MgdmVyYm9zZSAoYW5kIG1vcmUgdXNlZnVsKQorCisqIEFudCB3aWxsIG5vdyBzZWFyY2ggZm9yIGEgZmlsZSBuYW1lZCBidWlsZC54bWwgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkKKyAgYW5kIGFib3ZlICh0b3dhcmRzIHRoZSByb290IG9mIHRoZSBmaWxlc3lzdGVtKSBpZiB5b3UgZGlkbid0IHNwZWNpZnkKKyAgLWJ1aWxkZmlsZSBhbmQgdGhlcmUgaXMgbm8gYnVpbGQueG1sIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworKiA8ZWNobz4gY2FuIG5vdyB3cml0ZSB0byBhIGZpbGUgYW5kIGFjY2VwdHMgbmVzdGVkIHRleHQuCisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisqIDxjaG1vZD4gZGlkbid0IHdvcmsgd2hlbiB1c2VkIGFzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2suCisKKyogUGF0aCwgQXZhaWxhYmxlLCBQcm9wZXJ0eSBkaWRuJ3QgcmVzb2x2ZSByZWxhdGl2ZSBmaWxlbmFtZXMgd2l0aAorICByZXNwZWN0IHRvIHRoZSBQcm9qZWN0J3MgYmFzZWRpci4KKworKiBQcm9qZWN0IGRpZG4ndCBpbnRlcnByZXQgdGhlIGJhc2VkaXIgYXR0cmlidXRlIGNvcnJlY3RseSBpbiBhbGwKKyAgY2FzZXMuCisKKyogTmVzdGVkIDxzcmM+IGluIDxqYXZhYz4gY2F1c2VkIE51bGxQb2ludGVyRXhjZXB0aW9uLgorCisqIENvcnJ1cHQgWmlwLSBhbmQgSmFyLWZpbGVzIGFyIG5vdyBkZWxldGVkIGlmIHRoZSB0YXNrIGZhaWxzLgorCisqIG1hbnkgbW9yZSBmaXhlcyB3ZSd2ZSBmb3Jnb3R0ZW4gdG8gZG9jdW1lbnQgaGVyZSAuLi4KKworKiBUaGUgcGFja2FnZWxpc3Rsb2MgYXR0cmlidXRlIG9mIDxqYXZhZG9jPidzIDxsaW5rPiBjaGlsZCB3aWxsIGJlCisgIHJlc29sdmVkIGFzIGEgZmlsZSAoaS5lLiBpdCBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8KKyAgYmFzZWRpcikuCmRpZmYgLS1naXQgYS90cnVuay9hbnQucHJvcGVydGllcy5zYW1wbGUgYi90cnVuay9hbnQucHJvcGVydGllcy5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzMGNhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2FudC5wcm9wZXJ0aWVzLnNhbXBsZQpAQCAtMCwwICsxLDI5IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIFRoaXMgZmlsZSBpcyBhIHNhbXBsZSAuYW50LnByb3BlcnRpZXMgZmlsZSB1c2VkIGZvciBidWlsZGluZyBhbnQuCisjIE1vZGlmeSBpdCBmb3IgeW91ciBvd24gbmVlZHMgYW5kIGNvcHkgaXQgdG8gLmFudC5wcm9wZXJ0aWVzIAorIworIyA8LS0gc3RhcnRzIGEgY29tbWVudAorCisjIElmIHlvdSB3YW50ZWQgdG8gdXNlIHRoZSBiZXR0ZXIgdGhhbiBhdmVyYWdlIGppa2VzIGNvbXBpbGVyIHVuY29tbWVudCBuZXh0IGxpbmUKKyMgYnVpbGQuY29tcGlsZXI9amlrZXMKKyMgYnVpbGQuY29tcGlsZXIud2FybmluZ3M9dHJ1ZQorIyBidWlsZC5jb21waWxlci5wZWRhbnRpYz10cnVlCisjIGJ1aWxkLmNvbXBpbGVyLmRlcGVuZD10cnVlCisKKyMgSWYgeW91IHdhbnQgdG8gdXNlIG5vbi1zdGFuZGFyZCBqYXJzIHRoZW4gZWRpdCBmb2xsb3dpbmcgbGluZXMKKyMgamFyLmp1bml0PS9wYXRoL3RvL215L2p1bml0LmphcgorCmRpZmYgLS1naXQgYS90cnVuay9ib290c3RyYXAuYmF0IGIvdHJ1bmsvYm9vdHN0cmFwLmJhdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTg1NTRjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvYm9vdHN0cmFwLmJhdApAQCAtMCwwICsxLDEzNyBAQAorQGVjaG8gb2ZmCisKK1JFTSBZb3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgSkFWQV9IT01FIGlmIGNvbXBpbGluZyB3aXRoIDEuMiBvciBsYXRlci4KKworUkVNICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK1JFTSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCitSRU0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1JFTSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKK1JFTSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK1JFTSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK1JFTQorUkVNICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitSRU0KK1JFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorUkVNICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorUkVNICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1JFTSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorUkVNICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0IE9MREpBVkE9JUpBVkElCitzZXQgT0xESkFWQUM9JUpBVkFDJQorc2V0IEJPT1RPTERDTEFTU1BBVEg9JUNMQVNTUEFUSCUKK3NldCBPTERBTlRIT01FPSVBTlRfSE9NRSUKKworc2V0IEFOVF9IT01FPS4KKworaWYgIiIgPT0gIiVKQVZBJSIgIGlmICIiID09ICIlSkFWQV9IT01FJSIgc2V0IEpBVkE9amF2YQoraWYgIiIgPT0gIiVKQVZBJSIgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IEpBVkE9JUpBVkFfSE9NRSVcYmluXGphdmEKKworaWYgIiIgPT0gIiVKQVZBQyUiIGlmICIiID09ICIlSkFWQV9IT01FJSIgc2V0IEpBVkFDPWphdmFjCitpZiAiIiA9PSAiJUpBVkFDJSIgICAgICAgICAgICAgICAgICAgICAgICBzZXQgSkFWQUM9JUpBVkFfSE9NRSVcYmluXGphdmFjCisKK2VjaG8uCitlY2hvIC4uLiBCb290c3RyYXBwaW5nIEFudCBEaXN0cmlidXRpb24KKworaWYgICAgICIlT1MlIiA9PSAiV2luZG93c19OVCIgaWYgZXhpc3QgYm9vdHN0cmFwXG51bCBybWRpci9zL3EgYm9vdHN0cmFwCitpZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBpZiBleGlzdCBib290c3RyYXBcbnVsIGRlbHRyZWUveSBib290c3RyYXAKK2lmICAgICAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGlmIGV4aXN0IGJ1aWxkXG51bCBybWRpci9zL3EgYnVpbGQKK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGlmIGV4aXN0IGJ1aWxkXG51bCBkZWx0cmVlL3kgYnVpbGQKKworU0VUIExPQ0FMQ0xBU1NQQVRIPWxpYlx4ZXJjZXNJbXBsLmphcjtsaWJceG1sLWFwaXMuamFyCitmb3IgJSVpIGluIChsaWJcb3B0aW9uYWxcKi5qYXIpIGRvIGNhbGwgc3JjXHNjcmlwdFxsY3AuYmF0ICUlaQoraWYgZXhpc3QgIiVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXIiIGNhbGwgc3JjXHNjcmlwdFxsY3AuYmF0ICVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXIKK2lmIGV4aXN0ICIlSkFWQV9IT01FJVxsaWJcY2xhc3Nlcy56aXAiIGNhbGwgc3JjXHNjcmlwdFxsY3AuYmF0ICVKQVZBX0hPTUUlXGxpYlxjbGFzc2VzLnppcAorCitzZXQgVE9PTFM9c3JjXG1haW5cb3JnXGFwYWNoZVx0b29scworc2V0IENMQVNTRElSPWJ1aWxkXGNsYXNzZXMKKworU0VUIENMQVNTUEFUSD0lTE9DQUxDTEFTU1BBVEglOyVDTEFTU0RJUiU7c3JjXG1haW47JUNMQVNTUEFUSCUKKworZWNobyBKQVZBX0hPTUU9JUpBVkFfSE9NRSUKK2VjaG8gSkFWQT0lSkFWQSUKK2VjaG8gSkFWQUM9JUpBVkFDJQorZWNobyBDTEFTU1BBVEg9JUNMQVNTUEFUSCUKKworaWYgICAgICIlT1MlIiA9PSAiV2luZG93c19OVCIgaWYgZXhpc3QgJUNMQVNTRElSJVxudWwgcm1kaXIvcy9xICVDTEFTU0RJUiUKK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGlmIGV4aXN0ICVDTEFTU0RJUiVcbnVsIGRlbHRyZWUveSAlQ0xBU1NESVIlCisKK2lmIG5vdCBleGlzdCBidWlsZFxudWwgbWtkaXIgYnVpbGQKK2lmIG5vdCBleGlzdCBidWlsZFxjbGFzc2VzXG51bCBta2RpciBidWlsZFxjbGFzc2VzCisKK2VjaG8uCitlY2hvIC4uLiBDb21waWxpbmcgQW50IENsYXNzZXMKKworIiVKQVZBQyUiICVCT09USkFWQUNfT1BUUyUgLWQgJUNMQVNTRElSJSAlVE9PTFMlXGJ6aXAyXCouamF2YSAlVE9PTFMlXHRhclwqLmphdmEgJVRPT0xTJVx6aXBcKi5qYXZhICVUT09MUyVcYW50XCouamF2YSAlVE9PTFMlXGFudFx0eXBlc1wqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcKi5qYXZhICVUT09MUyVcYW50XHV0aWxccmVnZXhwXFJlZ2V4cE1hdGNoZXIuamF2YSAlVE9PTFMlXGFudFx1dGlsXHJlZ2V4cFxSZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhICVUT09MUyVcYW50XHRhc2tkZWZzXGNvbmRpdGlvblwqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcY29tcGlsZXJzXCouamF2YSAlVE9PTFMlXGFudFx0eXBlc1xyZXNvdXJjZXNcKi5qYXZhICVUT09MUyVcYW50XHByb3BlcnR5XCouamF2YQorCitpZiBFUlJPUkxFVkVMIDEgZ290byBtYWluZW5kCisKK2VjaG8uCitlY2hvIC4uLiBDb3B5aW5nIFJlcXVpcmVkIEZpbGVzCisKK2NvcHkgJVRPT0xTJVxhbnRcdGFza2RlZnNcKi5wcm9wZXJ0aWVzICVDTEFTU0RJUiVcb3JnXGFwYWNoZVx0b29sc1xhbnRcdGFza2RlZnMKK2NvcHkgJVRPT0xTJVxhbnRcdHlwZXNcKi5wcm9wZXJ0aWVzICVDTEFTU0RJUiVcb3JnXGFwYWNoZVx0b29sc1xhbnRcdHlwZXMKKworZWNoby4KK2VjaG8gLi4uIEJ1aWxkaW5nIEFudCBEaXN0cmlidXRpb24KKworaWYgbm90ICIlT1MlIj09IldpbmRvd3NfTlQiIGdvdG8gd2luOXhTdGFydAorOndpbk5UU3RhcnQKK0BzZXRsb2NhbAorCitSRU0gcGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworcmVtIE5lZWQgdG8gY2hlY2sgaWYgd2UgYXJlIHVzaW5nIHRoZSA0TlQgc2hlbGwuLi4KK2lmICIlZXZhbFsyKzJdIiA9PSAiNCIgZ290byBzZXR1cDROVAorCityZW0gT24gTlQvMksgZ3JhYiBhbGwgYXJndW1lbnRzIGF0IG9uY2UKK3NldCBBTlRfQ01EX0xJTkVfQVJHUz0lKgorZ290byBkb25lU3RhcnQKKworOnNldHVwNE5UCitzZXQgQU5UX0NNRF9MSU5FX0FSR1M9JSQKK2dvdG8gZG9uZVN0YXJ0CisKKzp3aW45eFN0YXJ0CityZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBUaGlzIGxvb3AgYWxsb3dzIGZvciBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mCityZW0gYWdydW1lbnRzICh1cCB0byB0aGUgY29tbWFuZCBsaW5lIGxpbWl0LCBhbnl3YXkpLgorCitzZXQgQU5UX0NNRF9MSU5FX0FSR1M9CisKKzpzZXR1cEFyZ3MKK2lmICUxYT09YSBnb3RvIGRvbmVTdGFydAorc2V0IEFOVF9DTURfTElORV9BUkdTPSVBTlRfQ01EX0xJTkVfQVJHUyUgJTEKK3NoaWZ0Citnb3RvIHNldHVwQXJncworCis6ZG9uZVN0YXJ0CityZW0gVGhpcyBsYWJlbCBwcm92aWRlcyBhIHBsYWNlIGZvciB0aGUgYXJndW1lbnQgbGlzdCBsb29wIHRvIGJyZWFrIG91dAorcmVtIGFuZCBmb3IgTlQgaGFuZGxpbmcgdG8gc2tpcCB0by4KKworIiVKQVZBJSIgJUFOVF9PUFRTJSBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluIC1lbWFjcyAlQU5UX0NNRF9MSU5FX0FSR1MlIGJvb3RzdHJhcAorCitzZXQgQU5UX0NNRF9MSU5FX0FSR1M9CitpZiBub3QgIiVPUyUiPT0iV2luZG93c19OVCIgZ290byBtYWluRW5kCis6d2luTlRlbmQKK0BlbmRsb2NhbAorCis6bWFpbkVuZAorCitlY2hvLgorZWNobyAuLi4gQ2xlYW5pbmcgVXAgQnVpbGQgRGlyZWN0b3JpZXMKKworaWYgICAgICIlT1MlIiA9PSAiV2luZG93c19OVCIgaWYgZXhpc3QgJUNMQVNTRElSJVxudWwgcm1kaXIvcy9xICVDTEFTU0RJUiUKK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGlmIGV4aXN0ICVDTEFTU0RJUiVcbnVsIGRlbHRyZWUveSAlQ0xBU1NESVIlCisKK2VjaG8uCitlY2hvIC4uLiBEb25lIEJvb3RzdHJhcHBpbmcgQW50IERpc3RyaWJ1dGlvbgorCitzZXQgSkFWQT0lT0xESkFWQSUKK3NldCBKQVZBQz0lT0xESkFWQUMlCitzZXQgQ0xBU1NQQVRIPSVCT09UT0xEQ0xBU1NQQVRIJQorc2V0IEFOVF9IT01FPSVPTERBTlRIT01FJQorc2V0IE9MREpBVkE9CitzZXQgT0xESkFWQUM9CitzZXQgQk9PVE9MRENMQVNTUEFUSD0KK3NldCBMT0NBTENMQVNTUEFUSD0KK3NldCBPTERBTlRIT01FPQorc2V0IFRPT0xTPQpkaWZmIC0tZ2l0IGEvdHJ1bmsvYm9vdHN0cmFwLnNoIGIvdHJ1bmsvYm9vdHN0cmFwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIyZTU1MGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9ib290c3RyYXAuc2gKQEAgLTAsMCArMSwxNjkgQEAKKyMhL2Jpbi9zaAorCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydC4gICR2YXIgX211c3RfIGJlIHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KK2N5Z3dpbj1mYWxzZTsKK2Rhcndpbj1mYWxzZTsKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiopIGN5Z3dpbj10cnVlIDs7CisgIERhcndpbiopIGRhcndpbj10cnVlCisgICAgICAgICAgIGlmIFsgLXogIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgICAgICAgICAgSkFWQV9IT01FPS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvSG9tZQorICAgICAgICAgICBmaQorICAgICAgICAgICA7OworZXNhYworCisjIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKK2lmICRjeWd3aW4gOyB0aGVuCisgIFsgLW4gIiRKQVZBX0hPTUUiIF0gJiYKKyAgICBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKKyAgWyAtbiAiJENMQVNTUEFUSCIgXSAmJgorICAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkQ0xBU1NQQVRIImAKK2ZpCisKKyMgWW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IEpBVkFfSE9NRSBpZiBjb21waWxpbmcgd2l0aCAxLjIgb3IgbGF0ZXIuCisKK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgIGlmIFsgLWYgIiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphciIgXSA7IHRoZW4KKyAgICBDTEFTU1BBVEg9JENMQVNTUEFUSDokSkFWQV9IT01FL2xpYi90b29scy5qYXIKKyAgZmkKKworICBpZiBbIC1mICIkSkFWQV9IT01FL2xpYi9jbGFzc2VzLnppcCIgXSA7IHRoZW4KKyAgICBDTEFTU1BBVEg9JENMQVNTUEFUSDokSkFWQV9IT01FL2xpYi9jbGFzc2VzLnppcAorICBmaQorZWxzZQorICBlY2hvICJXYXJuaW5nOiBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldC4iCisgIGVjaG8gIiAgSWYgYnVpbGQgZmFpbHMgYmVjYXVzZSBzdW4uKiBjbGFzc2VzIGNvdWxkIG5vdCBiZSBmb3VuZCIKKyAgZWNobyAiICB5b3Ugd2lsbCBuZWVkIHRvIHNldCB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIgorICBlY2hvICIgIHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGphdmEuIgorZmkKKworIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlczoKKyMgSkFWQV9IT01FL2pyZS9zaCBmb3IgamF2YSBhbmQgcm1pZAorIyBKQVZBX0hPTUUvc2ggZm9yIGphdmFjIGFuZCBybWljCitpZiBbIC16ICIkSkFWQUMiIF0gOyB0aGVuCisgIGlmIFsgLW4gIiRKQVZBX0hPTUUiICBdIDsgdGhlbgorICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvc2gvamF2YWMiIF0gOyB0aGVuCisgICAgICBKQVZBQz0ke0pBVkFfSE9NRX0vc2gvamF2YWM7CisgICAgZWxzZQorICAgICAgSkFWQUM9JHtKQVZBX0hPTUV9L2Jpbi9qYXZhYzsKKyAgICBmaQorICBlbHNlCisgICAgSkFWQUM9amF2YWMKKyAgZmkKK2ZpCitpZiBbIC16ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgaWYgWyAtbiAiJEpBVkFfSE9NRSIgIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgIEpBVkFDTUQ9JEpBVkFfSE9NRS9qcmUvc2gvamF2YQorICAgIGVsc2UKKyAgICAgIEpBVkFDTUQ9JEpBVkFfSE9NRS9iaW4vamF2YQorICAgIGZpCisgIGVsc2UKKyAgICBKQVZBQ01EPWphdmEKKyAgZmkKK2ZpCisKK2lmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgIGVjaG8gIkVycm9yOiBKQVZBX0hPTUUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LiIKKyAgZWNobyAiICBXZSBjYW5ub3QgZXhlY3V0ZSAkSkFWQUNNRCIKKyAgZXhpdAorZmkKKworQU5UX0hPTUU9LgorZXhwb3J0IEFOVF9IT01FCisKK2VjaG8gLi4uIEJvb3RzdHJhcHBpbmcgQW50IERpc3RyaWJ1dGlvbgorCitpZiBbIC1kICJib290c3RyYXAiIF0gOyB0aGVuCisgIHJtIC1yIGJvb3RzdHJhcAorZmkKKworaWYgWyAtZCAiYnVpbGQiIF0gOyB0aGVuCisgIHJtIC1yIGJ1aWxkCitmaQorCitDTEFTU1BBVEg9bGliL3hlcmNlc0ltcGwuamFyOmxpYi94bWwtYXBpcy5qYXI6JHtDTEFTU1BBVEh9CisKK0RJUkxJQlM9bGliL29wdGlvbmFsLyouamFyCitmb3IgaSBpbiAke0RJUkxJQlN9CitkbworICAgICMgaWYgdGhlIGRpcmVjdG9yeSBpcyBlbXB0eSwgdGhlbiBpdCB3aWxsIHJldHVybiB0aGUgaW5wdXQgc3RyaW5nCisgICAgIyB0aGlzIGlzIHN0dXBpZCwgc28gY2FzZSBmb3IgaXQKKyAgICBpZiBbICIkaSIgIT0gIiR7RElSTElCU30iIF0gOyB0aGVuCisgICAgICAgIENMQVNTUEFUSD0kQ0xBU1NQQVRIOiIkaSIKKyAgICBmaQorZG9uZQorCitUT09MUz1zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzCitDTEFTU0RJUj1idWlsZC9jbGFzc2VzCisKK0NMQVNTUEFUSD0ke0NMQVNTRElSfTpzcmMvbWFpbjoke0NMQVNTUEFUSH0KKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbjsgdGhlbgorICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJENMQVNTUEFUSCJgCitmaQorCitleHBvcnQgQ0xBU1NQQVRICisKK21rZGlyIC1wIGJ1aWxkCitta2RpciAtcCAke0NMQVNTRElSfQorbWtkaXIgLXAgYmluCisKK2VjaG8gLi4uIENvbXBpbGluZyBBbnQgQ2xhc3NlcworCisiJHtKQVZBQ30iICRCT09USkFWQUNfT1BUUyAtZCAke0NMQVNTRElSfSAke1RPT0xTfS9iemlwMi8qLmphdmEgJHtUT09MU30vdGFyLyouamF2YSAke1RPT0xTfS96aXAvKi5qYXZhIFwKKyAgICAke1RPT0xTfS9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlci5qYXZhIFwKKyAgICAke1RPT0xTfS9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlckZhY3RvcnkuamF2YSBcCisgICAgJHtUT09MU30vYW50L3Byb3BlcnR5LyouamF2YSBcCisgICAgJHtUT09MU30vYW50L3R5cGVzLyouamF2YSBcCisgICAgJHtUT09MU30vYW50L3R5cGVzL3Jlc291cmNlcy8qLmphdmEgXAorICAgICR7VE9PTFN9L2FudC8qLmphdmEgJHtUT09MU30vYW50L3Rhc2tkZWZzLyouamF2YSBcCisgICAgJHtUT09MU30vYW50L3Rhc2tkZWZzL2NvbXBpbGVycy8qLmphdmEgXAorICAgICR7VE9PTFN9L2FudC90YXNrZGVmcy9jb25kaXRpb24vKi5qYXZhCityZXQ9JD8KK2lmIFsgJHJldCAhPSAwIF07IHRoZW4KKyAgZWNobyAuLi4gRmFpbGVkIGNvbXBpbGluZyBBbnQgY2xhc3NlcyAhCisgIGV4aXQgJHJldAorZmkKKworZWNobyAuLi4gQ29weWluZyBSZXF1aXJlZCBGaWxlcworCitjcCBzcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIFwKKyAgICAke0NMQVNTRElSfS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcworY3Agc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdHMucHJvcGVydGllcyBcCisgICAgJHtDTEFTU0RJUn0vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMKK2NwIHNyYy9zY3JpcHQvYW50UnVuIGJpbgorY2htb2QgK3ggYmluL2FudFJ1bgorCitlY2hvIC4uLiBCdWlsZGluZyBBbnQgRGlzdHJpYnV0aW9uCisKKyIke0pBVkFDTUR9IiAtY2xhc3NwYXRoICIke0NMQVNTUEFUSH0iIC1EYW50LmhvbWU9LiAkQU5UX09QVFMgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbiAtZW1hY3MgIiRAIiBib290c3RyYXAKK3JldD0kPworaWYgWyAkcmV0ICE9IDAgXTsgdGhlbgorICBlY2hvIC4uLiBGYWlsZWQgQnVpbGRpbmcgQW50IERpc3RyaWJ1dGlvbiAhCisgIGV4aXQgJHJldAorZmkKKworCitlY2hvIC4uLiBDbGVhbmluZyBVcCBCdWlsZCBEaXJlY3RvcmllcworCitybSAtcmYgJHtDTEFTU0RJUn0KK3JtIC1yZiBiaW4KKworZWNobyAuLi4gRG9uZSBCb290c3RyYXBwaW5nIEFudCBEaXN0cmlidXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9idWlsZC5iYXQgYi90cnVuay9idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGYxYTUyZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2J1aWxkLmJhdApAQCAtMCwwICsxLDQwIEBACitAZWNobyBvZmYKKworUkVNICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK1JFTSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCitSRU0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1JFTSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKK1JFTSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK1JFTSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK1JFTSAKK1JFTSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorUkVNIAorUkVNICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitSRU0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitSRU0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorUkVNICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitSRU0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgUkVBTF9BTlRfSE9NRT0lQU5UX0hPTUUlCitzZXQgQU5UX0hPTUU9JX5kcDBcYm9vdHN0cmFwCitpZiBleGlzdCBib290c3RyYXBcbGliXGFudC5qYXIgaWYgZXhpc3QgYm9vdHN0cmFwXGJpblxhbnQuYmF0IGlmIGV4aXN0IGJvb3RzdHJhcFxiaW5cbGNwLmJhdCBpZiBleGlzdCBib290c3RyYXBcYmluXGFudFJ1bi5iYXQgZ290byBydW5BbnQKK2NhbGwgYm9vdHN0cmFwLmJhdAoraWYgZXhpc3QgYm9vdHN0cmFwXGxpYlxhbnQuamFyIGlmIGV4aXN0IGJvb3RzdHJhcFxiaW5cYW50LmJhdCBpZiBleGlzdCBib290c3RyYXBcYmluXGxjcC5iYXQgaWYgZXhpc3QgYm9vdHN0cmFwXGJpblxhbnRSdW4uYmF0IGdvdG8gcnVuQW50CitlY2hvIEJvb3RzdHJhcCBGQUlMRUQKK1JFTSBzZXQgdGhlIGVycm9yIGNvZGUKK2NvbG9yIDAwCitnb3RvIGNsZWFudXAKKworOnJ1bkFudAoraWYgbm90ICIlUkVBTF9BTlRfSE9NRSUiID09ICIiIGdvdG8gaW5zdGFsbF9hbnQKK2NhbGwgYm9vdHN0cmFwXGJpblxhbnQuYmF0IC1saWIgbGliL29wdGlvbmFsICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5Citnb3RvIGNsZWFudXAKKworOmluc3RhbGxfYW50CitjYWxsIGJvb3RzdHJhcFxiaW5cYW50LmJhdCAtbm91c2VybGliIC1saWIgbGliL29wdGlvbmFsIC1EYW50Lmluc3RhbGw9IiVSRUFMX0FOVF9IT01FJSIgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKKworcmVtIGNsZWFuIHVwCis6Y2xlYW51cAorc2V0IEFOVF9IT01FPSVSRUFMX0FOVF9IT01FJQorc2V0IFJFQUxfQU5UX0hPTUU9CisKZGlmZiAtLWdpdCBhL3RydW5rL2J1aWxkLnNoIGIvdHJ1bmsvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDgwNTYyZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2J1aWxkLnNoCkBAIC0wLDAgKzEsNTcgQEAKKyMhL2Jpbi9zaAorCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydC4gICR2YXIgX211c3RfIGJlIHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KK2N5Z3dpbj1mYWxzZTsKK2Rhcndpbj1mYWxzZTsKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiopIGN5Z3dpbj10cnVlIDs7CisgIERhcndpbiopIGRhcndpbj10cnVlCisgICAgICAgICAgIGlmIFsgLXogIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgICAgICAgICAgSkFWQV9IT01FPS9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvSG9tZQorICAgICAgICAgICBmaQorICAgICAgICAgICA7OworZXNhYworCitSRUFMQU5USE9NRT0kQU5UX0hPTUUKK2lmIFsgLXogIiRQV0QiIF07IHRoZW4KKyAgICBBTlRfSE9NRT0uL2Jvb3RzdHJhcAorZWxzZQorICAgIEFOVF9IT01FPSIkUFdEIi9ib290c3RyYXAKK2ZpCitleHBvcnQgQU5UX0hPTUUKKworaWYgdGVzdCAhIC1mIGJvb3RzdHJhcC9saWIvYW50LmphciAtbyAgISAteCBib290c3RyYXAvYmluL2FudCAtbyAhIC14IGJvb3RzdHJhcC9iaW4vYW50UnVuIDsgdGhlbgorICAvYmluL3NoIC4vYm9vdHN0cmFwLnNoCitmaQorCitpZiB0ZXN0ICEgLWYgYm9vdHN0cmFwL2xpYi9hbnQuamFyIC1vICAhIC14IGJvb3RzdHJhcC9iaW4vYW50IC1vICEgLXggYm9vdHN0cmFwL2Jpbi9hbnRSdW4gOyB0aGVuCisgIGVjaG8gQm9vdHN0cmFwIEZBSUxFRAorICBleGl0IDEKK2ZpCisKK2lmIFsgIiRSRUFMQU5USE9NRSIgIT0gIiIgXSA7IHRoZW4KKyAgaWYgJGN5Z3dpbjsgdGhlbgorICAgICBSRUFMQU5USE9NRT1gY3lncGF0aCAtLXdpbmRvd3MgIiRSRUFMQU5USE9NRSJgCisgIGZpCisgIEFOVF9JTlNUQUxMPSItRGFudC5pbnN0YWxsPSRSRUFMQU5USE9NRSIKK2Vsc2UKKyAgQU5UX0lOU1RBTEw9Ii1lbWFjcyIKK2ZpCisKK2Jvb3RzdHJhcC9iaW4vYW50IC1ub3VzZXJsaWIgLWxpYiBsaWIvb3B0aW9uYWwgIiRBTlRfSU5TVEFMTCIgJCoKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvYnVpbGQueG1sIGIvdHJ1bmsvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGZmZmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9idWlsZC54bWwKQEAgLTAsMCArMSwxOTg0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKworPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iYXBhY2hlLWFudCIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+CisKKyAgPCEtLSBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgd2l0aG91dCBlZGl0aW5nIHRoaXMgZmlsZQorICAgICAgIChhbmQgd2l0aG91dCB0eXBpbmcgLUQgb24gZWFjaCBpbnZvY2F0aW9uKSAtLT4KKyAgPHByb3BlcnR5IGZpbGU9Ii5hbnQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9Ly5hbnQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgorCisKKyAgPCEtLQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIFNldCB0aGUgcHJvcGVydGllcyB0aGF0IGNvbnRyb2wgbmFtZXMgYW5kIHZlcnNpb25zCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtLT4KKyAgPHByb3BlcnR5IG5hbWU9Ik5hbWUiIHZhbHVlPSJBcGFjaGUgQW50Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJuYW1lIiB2YWx1ZT0iYW50Ii8+CisgIDwhLS0gdGhpcyBpcyB0aGUgZ3JvdXBJZCBvZiBhbnQgaW4gdGhlIE1hdmVuIHJlcG9zaXRvcnkgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJncm91cGlkIiB2YWx1ZT0ib3JnLmFwYWNoZS5hbnQiLz4KKyAgPHByb3BlcnR5IG5hbWU9InByb2plY3QudmVyc2lvbiIgdmFsdWU9IjEuOC4wYWxwaGEiLz4KKyAgPCEtLSBwb20udmVyc2lvbiBpcyB1c2VkIHdoZW4gZG9pbmcgYSBkaXN0cmlidXRpb24gYW5kIG11c3QgbWF0Y2ggd2l0aCB3aGF0IGlzIGNoZWNrZWQgaW4gdW5kZXIgc3JjL2V0Yy9wb21zIC0tPgorICA8cHJvcGVydHkgbmFtZT0icG9tLnZlcnNpb24iIHZhbHVlPSIxLjguMC1TTkFQU0hPVCIvPgorICA8cHJvcGVydHkgbmFtZT0ibWFuaWZlc3QtdmVyc2lvbiIgdmFsdWU9IjEuOC4wIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJib290c3RyYXAuamFyIiB2YWx1ZT0iYW50LWJvb3RzdHJhcC5qYXIiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYW50LnBhY2thZ2UiIHZhbHVlPSJvcmcvYXBhY2hlL3Rvb2xzL2FudCIvPgorICA8cHJvcGVydHkgbmFtZT0idGFza2RlZnMucGFja2FnZSIgdmFsdWU9IiR7YW50LnBhY2thZ2V9L3Rhc2tkZWZzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb25kaXRpb24ucGFja2FnZSIgdmFsdWU9IiR7dGFza2RlZnMucGFja2FnZX0vY29uZGl0aW9uIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25hbC5wYWNrYWdlIiB2YWx1ZT0iJHt0YXNrZGVmcy5wYWNrYWdlfS9vcHRpb25hbCIvPgorICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uYWwuY29uZGl0aW9uLnBhY2thZ2UiIHZhbHVlPSIke29wdGlvbmFsLnBhY2thZ2V9L2NvbmRpdGlvbiIvPgorICA8cHJvcGVydHkgbmFtZT0idHlwZS5wYWNrYWdlIiB2YWx1ZT0iJHthbnQucGFja2FnZX0vdHlwZXMiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbmFsLnR5cGUucGFja2FnZSIgdmFsdWU9IiR7dHlwZS5wYWNrYWdlfS9vcHRpb25hbCIvPgorICA8cHJvcGVydHkgbmFtZT0iYXBhY2hlLnJlc29sdmVyLnR5cGUucGFja2FnZSIgdmFsdWU9IiR7YW50LnBhY2thZ2V9L3R5cGVzL3Jlc29sdmVyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ1dGlsLnBhY2thZ2UiIHZhbHVlPSIke2FudC5wYWNrYWdlfS91dGlsIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJyZWdleHAucGFja2FnZSIgdmFsdWU9IiR7dXRpbC5wYWNrYWdlfS9yZWdleHAiLz4KKworICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uYWwuamFycy5wcmVmaXgiIHZhbHVlPSJhbnQiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbmFsLmphcnMud2hlbm1hbmlmZXN0b25seSIgdmFsdWU9InNraXAiLz4KKworICA8IS0tCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgU2V0IHRoZSBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhlIHNvdXJjZSB0cmVlCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmEuZGlyIiB2YWx1ZT0iJHtzcmMuZGlyfS9tYWluIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzY3JpcHQuZGlyIiB2YWx1ZT0iJHtzcmMuZGlyfS9zY3JpcHQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIHZhbHVlPSJsaWIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRvY3MuZGlyIiB2YWx1ZT0iZG9jcyIvPgorICA8cHJvcGVydHkgbmFtZT0iZXRjLmRpciIgdmFsdWU9IiR7c3JjLmRpcn0vZXRjIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuanVuaXQiIHZhbHVlPSIke3NyYy5kaXJ9L3Rlc3RzL2p1bml0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuYW50dW5pdCIgdmFsdWU9IiR7c3JjLmRpcn0vdGVzdHMvYW50dW5pdCIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdHMuZXRjLmRpciIgdmFsdWU9IiR7c3JjLmRpcn0vZXRjL3Rlc3RjYXNlcyIvPgorICA8cHJvcGVydHkgbmFtZT0ibWFuaWZlc3QiIHZhbHVlPSIke3NyYy5kaXJ9L2V0Yy9tYW5pZmVzdCIvPgorICA8cHJvcGVydHkgbmFtZT0icmVzb3VyY2UuZGlyIiB2YWx1ZT0iJHtzcmMuZGlyfS9yZXNvdXJjZXMiLz4KKworICA8IS0tCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgU2V0IHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgYnVpbGQgYXJlYQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJidWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0iYm9vdHN0cmFwLmRpciIgdmFsdWU9ImJvb3RzdHJhcCIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIHZhbHVlPSIke2J1aWxkLmRpcn0vbGliIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5qYXZhZG9jcyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9qYXZhZG9jcyIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudGVzdHMiIHZhbHVlPSIke2J1aWxkLmRpcn0vdGVzdGNhc2VzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50ZXN0cy5qYXZhZG9jcyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9qYXZhZG9jcy50ZXN0LyIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuanVuaXQueG1sIiBsb2NhdGlvbj0iJHtidWlsZC50ZXN0c30veG1sIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJhbnR1bml0LnhtbCIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9hbnR1bml0L3htbCIvPgorICA8cHJvcGVydHkgbmFtZT0iYW50dW5pdC5yZXBvcnRzIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2FudHVuaXQvcmVwb3J0cyIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuanVuaXQucmVwb3J0cyIgbG9jYXRpb249IiR7YnVpbGQudGVzdHN9L3JlcG9ydHMiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0LnRtcCIgdmFsdWU9IiR7YnVpbGQuZGlyfS9vcHRpb25hbC5tYW5pZmVzdCIvPgorICA8IS0tIHRoZSBhYnNvbHV0ZSBwYXRoIC0tPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudGVzdHMudmFsdWUiIGxvY2F0aW9uPSIke2J1aWxkLnRlc3RzfSIvPgorCisgIDwhLS0KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBTZXQgdGhlIHByb3BlcnRpZXMgdGhhdCBjb250cm9sIHZhcmlvdXMgYnVpbGQgb3B0aW9ucworICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZWJ1ZyIgdmFsdWU9InRydWUiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNobW9kLmZhaWwiIHZhbHVlPSJ0cnVlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjaG1vZC5tYXhwYXJhbGxlbCIgdmFsdWU9IjI1MCIvPgorICA8cHJvcGVydHkgbmFtZT0iZGVwcmVjYXRpb24iIHZhbHVlPSJmYWxzZSIvPgorICA8cHJvcGVydHkgbmFtZT0ib3B0aW1pemUiIHZhbHVlPSJ0cnVlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhYy50YXJnZXQiIHZhbHVlPSIxLjIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFjLnNvdXJjZSIgdmFsdWU9IjEuMiIvPgorICA8cHJvcGVydHkgbmFtZT0ianVuaXQuZm9yayIgdmFsdWU9ImZhbHNlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5maWx0ZXJ0cmFjZSIgdmFsdWU9Im9mZiIvPgorICA8cHJvcGVydHkgbmFtZT0ianVuaXQuc3VtbWFyeSIgdmFsdWU9Im5vIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmhhbHRvbmZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgorICA8cHJvcGVydHkgbmFtZT0ianVuaXQuZm9ya21vZGUiIHZhbHVlPSJvbmNlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ1bmZpbHRlcmVkLmZpbGVzIiB2YWx1ZT0iKiovKi5naWYsKiovKi5qcGcsKiovKi5pY28sKiovKi5wZGYsKiovKi56aXAiLz4KKyAgPHByb3BlcnR5IG5hbWU9Imp1bml0LmNvbGxlY3Rvci5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vZmFpbGluZ1Rlc3RzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5jb2xsZWN0b3IuY2xhc3MiIHZhbHVlPSJGYWlsZWRUZXN0cyIvPgorCisgIDwhLS0KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBTZXQgdGhlIHBhdGhzIHVzZWQgaW4gdGhlIGJ1aWxkCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtLT4KKyAgPHBhdGggaWQ9ImNsYXNzcGF0aCI+CisgIDwvcGF0aD4KKworICA8cGF0aCBpZD0idGVzdHMtY2xhc3NwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlc30iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdHN9Ii8+CisgICAgPCEtLQorICAgICAgICBpbmNsdWRlIHRoZSB0ZXN0IHNvdXJjZSBhbmQgdGVzdCBkYXRhIGRpcnMKKyAgICAgICAgc28gdGhhdCB3ZSBjYW4gcGljayByZXNvdXJjZXMgdmlhIGdldFJlc291cmNlKEFzU3RyZWFtKQorICAgICAtLT4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c3JjLmp1bml0fSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0cy5ldGMuZGlyfSIvPgorICAgIDxwYXRoIHJlZmlkPSJjbGFzc3BhdGgiLz4KKyAgPC9wYXRoPgorCisgIDwhLS0gdHVybiB0aGlzIHBhdGggaW50byBhIHN0cmluZyB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIHRlc3RzIC0tPgorICA8cHJvcGVydHkgbmFtZT0idGVzdHMtY2xhc3NwYXRoLnZhbHVlIgorICAgIHJlZmlkPSJ0ZXN0cy1jbGFzc3BhdGgiLz4KKworICA8IS0tCisgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICBTZXQgdXAgcHJvcGVydGllcyBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBhcmVhCisgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIC0tPgorICA8cHJvcGVydHkgbmFtZT0iZGlzdC5uYW1lIiB2YWx1ZT0iYXBhY2hlLSR7bmFtZX0tJHtwcm9qZWN0LnZlcnNpb259Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmJhc2UiIHZhbHVlPSJkaXN0cmlidXRpb24iLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRpc3QuYmFzZS5zb3VyY2UiIHZhbHVlPSIke2Rpc3QuYmFzZX0vc291cmNlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmJhc2UuYmluYXJpZXMiIHZhbHVlPSIke2Rpc3QuYmFzZX0vYmluYXJpZXMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRpc3QuZGlyIiB2YWx1ZT0iZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0iZGlzdC5iaW4iIHZhbHVlPSIke2Rpc3QuZGlyfS9iaW4iLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRpc3QubGliIiB2YWx1ZT0iJHtkaXN0LmRpcn0vbGliIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRvY3MiIHZhbHVlPSIke2Rpc3QuZGlyfS9kb2NzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmV0YyIgdmFsdWU9IiR7ZGlzdC5kaXJ9L2V0YyIvPgorICA8cHJvcGVydHkgbmFtZT0iZGlzdC5qYXZhZG9jcyIgdmFsdWU9IiR7ZGlzdC5kaXJ9L2RvY3MvbWFudWFsL2FwaSIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlzdC5kaXIiIHZhbHVlPSJkaXN0LXNyYyIvPgorICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpc3Quc3JjIiB2YWx1ZT0iJHtzcmMuZGlzdC5kaXJ9L3NyYyIvPgorICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpc3QuZG9jcyIgdmFsdWU9IiR7c3JjLmRpc3QuZGlyfS9kb2NzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlzdC5saWIiIHZhbHVlPSIke3NyYy5kaXN0LmRpcn0vbGliIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImphdmEtcmVwb3NpdG9yeS5kaXIiIHZhbHVlPSJqYXZhLXJlcG9zaXRvcnkvJHtncm91cGlkfSIvPgorICA8cHJvcGVydHkgbmFtZT0iamF2YS1yZXBvc2l0b3J5LmphcnMuZGlyIiB2YWx1ZT0iJHtqYXZhLXJlcG9zaXRvcnkuZGlyfS9qYXJzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLXJlcG9zaXRvcnkucG9tcy5kaXIiIHZhbHVlPSIke2phdmEtcmVwb3NpdG9yeS5kaXJ9L3BvbXMiLz4KKworICA8IS0tCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgU2V0IHVwIHNlbGVjdG9ycyB0byBiZSB1c2VkIGJ5IGphdmFjLCBqdW5pdCBhbmQgamFyIHRvIGV4Y2x1ZGUKKyAgICAgICAgIGZpbGVzIHRoYXQgaGF2ZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLS0+CisgIDwhLS0gZGVwZW5kcyBvbiBKREsgdmVyc2lvbiAtLT4KKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5qZGsxLjMrIj4KKyAgICA8b3I+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHthbnQucGFja2FnZX0vdGFza2RlZnMvVGVzdFByb2Nlc3MqIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9leHRlbnNpb24vKioiLz4KKyAgICA8L29yPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuamRrMS40KyI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7cmVnZXhwLnBhY2thZ2V9L0pkazE0UmVnZXhwKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7YW50LnBhY2thZ2V9L3R5cGVzL0Fzc2VydGlvbnNUZXN0LmphdmEiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke2FudC5wYWNrYWdlfS9sYXVuY2gvTG9jYXRvclRlc3QqIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmpkazEuNSsiPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke3Rhc2tkZWZzLnBhY2thZ2V9L0FwdFRlc3QqIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHt1dGlsLnBhY2thZ2V9L2phdmExNS8qIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8IS0tIEthZmZlIGhhcyBzb21lIEpESyAxLjUgZmVhdHVyZXMgaW5jbHVkaW5nIGphdmEubGFuZy5SZWFkYWJsZSwKKyAgICAgICBidXQgbm90IGFsbCBvZiB0aGVtIC0tPgorICA8c2VsZWN0b3IgaWQ9Im5vdC5pbi5rYWZmZSI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7Y29uZGl0aW9uLnBhY2thZ2V9L0lzUmVhY2hhYmxlKiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPCEtLSBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyAtLT4KKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy50cmF4Ij4KKyAgICA8b3I+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9UcmFYTGlhaXNvbioiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1hzbHRUZXN0KiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7dHlwZS5wYWNrYWdlfS9YTUxDYXRhbG9nQnVpbGRGaWxlVGVzdCoiLz4KKyAgICA8L29yPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuYXBhY2hlLXJlc29sdmVyIj4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHthcGFjaGUucmVzb2x2ZXIudHlwZS5wYWNrYWdlfS8qKiIvPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuanVuaXQiPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2p1bml0LyoqIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5hcGFjaGUtcmVnZXhwIj4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHtyZWdleHAucGFja2FnZX0vSmFrYXJ0YVJlZ2V4cCoiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmFwYWNoZS1vcm8iPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke3JlZ2V4cC5wYWNrYWdlfS9KYWthcnRhT3JvKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vcGVyZm9yY2UvKiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5hcGFjaGUtYmNlbCI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7YW50LnBhY2thZ2V9L2ZpbHRlcnMvdXRpbC9KYXZhQ2xhc3NIZWxwZXIqIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHt1dGlsLnBhY2thZ2V9L2RlcGVuZC9iY2VsLyoiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnR5cGUucGFja2FnZX0vZGVwZW5kL0NsYXNzRmlsZVNldFRlc3QqIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmFwYWNoZS1sb2c0aiI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7YW50LnBhY2thZ2V9L2xpc3RlbmVyL0xvZzRqTGlzdGVuZXIqIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5jb21tb25zLWxvZ2dpbmciPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke2FudC5wYWNrYWdlfS9saXN0ZW5lci9Db21tb25zTG9nZ2luZ0xpc3RlbmVyKiIvPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuYXBhY2hlLWJzZiI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7dXRpbC5wYWNrYWdlfS9TY3JpcHRSdW5uZXIuKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7dXRpbC5wYWNrYWdlfS9vcHRpb25hbC9TY3JpcHRSdW5uZXIqIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLnN0eWxlYm9vayI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vU3R5bGVCb29rKiIvPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuamF2YW1haWwiPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke2FudC5wYWNrYWdlfS90YXNrZGVmcy9lbWFpbC9NaW1lTWFpbGVyKiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5uZXRyZXh4Ij4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9OZXRSZXh4QyoiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmNvbW1vbnMtbmV0Ij4KKyAgICA8b3I+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9uZXQvRlRQKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vbmV0L1JFeGVjKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vbmV0L1RlbG5ldFRhc2sqIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmFudGxyIj4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9BTlRMUioiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmptZiI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc291bmQvKiIvPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuamFpIj4KKyAgICA8b3I+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9pbWFnZS8qIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC50eXBlLnBhY2thZ2V9L2ltYWdlLyoiLz4KKyAgICA8L29yPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuamRlcGVuZCI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vamRlcGVuZC8qIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5zd2luZyI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc3BsYXNoLyoiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmpzY2giPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3NzaC8qIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJhbnQubGF1bmNoZXIiPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke2FudC5wYWNrYWdlfS9sYXVuY2gvKiovKiIvPgorICA8L3NlbGVjdG9yPgorCisgIDxwYXR0ZXJuc2V0IGlkPSJvbmxpbmV0ZXN0cyI+CisgICAgPGV4Y2x1ZGUgbmFtZT0iKiovR2V0VGVzdC5qYXZhIiBpZj0ib2ZmbGluZSIvPgorICA8L3BhdHRlcm5zZXQ+CisKKyAgPHBhdHRlcm5zZXQgaWQ9InRlc3RzdGhhdGZhaWwiPgorICAgIDwhLS0gUHJvcGVydHkgJ3J1bi5mYWlsaW5nLnRlc3RzJyBzaG91bGQgZm9yY2UgQW50IHRvIHJ1biB0aGVzZSB0ZXN0cy4gLS0+CisgICAgPCEtLSBCZWNhdXNlIHRoZSB3aG9sZSBwYXR0ZXJuc2V0IGNhbiBub3QgYmUgZXhjbHVkZWQsIHlvdSBoYXZlIHRvIGFkZCAtLT4KKyAgICA8IS0tIGFuIHVubGVzcy1hdHRyaWJ1dGUgb24gZWFjaCBleGNsdWRlLWVsZW1lbnQuICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDxleGNsdWRlIHVubGVzcz0icnVuLmZhaWxpbmcudGVzdHMiIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vQmVhblNoZWxsU2NyaXB0VGVzdC5qYXZhIi8+CisgICAgPGV4Y2x1ZGUgdW5sZXNzPSJydW4uZmFpbGluZy50ZXN0cyIgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9qZGVwZW5kL0pEZXBlbmRUZXN0LmphdmEiLz4KKyAgICA8ZXhjbHVkZSB1bmxlc3M9InJ1bi5mYWlsaW5nLnRlc3RzIiBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L0RvdG5ldFRlc3QuamF2YSIvPgorICAgIDxleGNsdWRlIHVubGVzcz0icnVuLmZhaWxpbmcudGVzdHMiIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vV3NkbFRvRG90bmV0VGVzdC5qYXZhIi8+CisgIDwvcGF0dGVybnNldD4KKworICA8IS0tdGVzdHMgdGhhdCBuZWVkIGFuIFhNTCBTY2hlbWEtc3VwcG9ydGluZyBwYXJzZXIgdG8gd29yay0tPgorICA8c2VsZWN0b3IgaWQ9Im5lZWRzLnhtbHNjaGVtYSI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vU2NoZW1hVmFsaWRhdGVUZXN0LioiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1htbFZhbGlkYXRlVGVzdC4qIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8IS0tCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgU2V0IHVwIGEgcGF0dGVybnNldHMgdGhhdCBtYXRjaGVzIHRoZSBwYXJ0cyBvZiBvdXIgSlVuaXQgdGVzdHN1aXRlCisgICAgICAgICB0aGF0IG1heSBiZSB1c2VmdWwgZm9yIHRhc2sgZGV2ZWxvcGVycy4KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0tPgorICA8cGF0dGVybnNldCBpZD0idXNlZnVsLnRlc3RzIj4KKyAgICA8aW5jbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS9CdWlsZEZpbGVUZXN0KiIvPgorICAgIDxpbmNsdWRlIG5hbWU9IiR7cmVnZXhwLnBhY2thZ2V9L1JlZ2V4cE1hdGNoZXJUZXN0KiIvPgorICAgIDxpbmNsdWRlIG5hbWU9IiR7cmVnZXhwLnBhY2thZ2V9L1JlZ2V4cFRlc3QqIi8+CisgICAgPGluY2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdCoiLz4KKyAgICA8aW5jbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS90eXBlcy9BYnN0cmFjdEZpbGVTZXRUZXN0KiIvPgorICA8L3BhdHRlcm5zZXQ+CisKKyAgPCEtLQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIFNldCB1cCBhIHBhdHRlcm5zZXRzIHRoYXQgbWF0Y2hlcyB0aGUgcGFydHMgb2Ygb3VyIHNpdGUgdGhhdAorICAgICAgICAgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtLT4KKyAgPHBhdHRlcm5zZXQgaWQ9InNpdGUuZXhjbHVkZXMiPgorICAgIDxleGNsdWRlIG5hbWU9ImJpbmRvd25sb2FkLmh0bWwiLz4KKyAgICA8ZXhjbHVkZSBuYW1lPSJzcmNkb3dubG9hZC5odG1sIi8+CisgICAgPGV4Y2x1ZGUgbmFtZT0iKi5jZ2kiLz4KKyAgPC9wYXR0ZXJuc2V0PgorCisgIDwhLS0KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBDaGVjayB0byBzZWUgd2hhdCBvcHRpb25hbCBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLS0+CisgIDx0YXJnZXQgbmFtZT0iY2hlY2tfZm9yX29wdGlvbmFsX3BhY2thZ2VzIj4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjMrIiBjbGFzc25hbWU9ImphdmEubGFuZy5TdHJpY3RNYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrMS40KyIgY2xhc3NuYW1lPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrMS41KyIgY2xhc3NuYW1lPSJqYXZhLm5ldC5Qcm94eSIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkazEuNisiIGNsYXNzbmFtZT0iamF2YS51dGlsLlNlcnZpY2VMb2FkZXIiLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJrYWZmZSIgY2xhc3NuYW1lPSJrYWZmZS51dGlsLk5vdEltcGxlbWVudGVkIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYnNmLnByZXNlbnQiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYnNmLkJTRk1hbmFnZXIiCisgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Im5ldHJleHgucHJlc2VudCIKKyAgICAgIGNsYXNzbmFtZT0ibmV0cmV4eC5sYW5nLlJleHgiCisgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRyYXgucHJlc2VudCIKKyAgICAgIGNsYXNzbmFtZT0iamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idHJheC5pbXBsLnByZXNlbnQiPgorICAgICAgPG9yPgorICAgICAgICA8YW5kPgorICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiLz4KKyAgICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iJHtqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeX0iCisgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgICAgICA8L2FuZD4KKyAgICAgICAgPGF2YWlsYWJsZSByZXNvdXJjZT0iTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXBhY2hlLnJlc29sdmVyLnByZXNlbnQiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUueG1sLnJlc29sdmVyLnRvb2xzLkNhdGFsb2dSZXNvbHZlciIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ieGFsYW4yLnByZXNlbnQiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJJbXBsIgorICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqdW5pdC5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UiCisgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFudHVuaXQucHJlc2VudCIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5hbnQuYW50dW5pdC5BbnRVbml0IgorICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJjb21tb25zLm5ldC5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnQiCisgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFudGxyLnByZXNlbnQiIAorICAgICAgY2xhc3NuYW1lPSJhbnRsci5Ub29sIiAKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ic3R5bGVib29rLnByZXNlbnQiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuc3R5bGVib29rLkVuZ2luZSIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXBhY2hlLnJlZ2V4cC5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnJlZ2V4cC5SRSIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXBhY2hlLm9yby5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4LlBlcmw1TWF0Y2hlciIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iam1mLnByZXNlbnQiCisgICAgICBjbGFzc25hbWU9ImphdmF4LnNvdW5kLnNhbXBsZWQuQ2xpcCIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamFpLnByZXNlbnQiCisgICAgICBjbGFzc25hbWU9ImphdmF4Lm1lZGlhLmphaS5KQUkiCisgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkZXBlbmQucHJlc2VudCIKKyAgICAgIGNsYXNzbmFtZT0iamRlcGVuZC5mcmFtZXdvcmsuSkRlcGVuZCIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibG9nNGoucHJlc2VudCIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXIiCisgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImNvbW1vbnMubG9nZ2luZy5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5IgorICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ4YWxhbi5lbnZjaGVjayIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LkVudmlyb25tZW50Q2hlY2siCisgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9IndoaWNoLnByZXNlbnQiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuZW52LldoaWNoIgorICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKworICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InhlcmNlcy5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlciIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYmNlbC5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmJjZWwuQ29uc3RhbnRzIgorICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImphdmFtYWlsLmNvbXBsZXRlIj4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC5tYWlsLlRyYW5zcG9ydCIKKyAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzb21lLnJlZ2V4cC5zdXBwb3J0Ij4KKyAgICAgIDxvcj4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJqZGsxLjQrIi8+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYXBhY2hlLnJlZ2V4cC5wcmVzZW50Ii8+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYXBhY2hlLm9yby5wcmVzZW50Ii8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGVzdHMuYW5kLmFudC5zaGFyZS5jbGFzc2xvYWRlciI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqdW5pdC5mb3JrfSIgYXJnMj0idHJ1ZSIvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YnVpbGQuc3lzY2xhc3NwYXRofSIgYXJnMj0ib25seSIvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9InN1bi50b29scy5wcmVzZW50Ij4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJzdW4udG9vbHMubmF0aXZlMmFzY2lpLk1haW4iLz4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMuamF2YWguTWFpbiIvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0cy5hcmUub24uc3lzdGVtLmNsYXNzcGF0aCI+CisgICAgICA8b3I+CisgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KKyAgICAgICAgICA8aW50ZXJzZWN0PgorICAgICAgICAgICAgPHBhdGggcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICAgICAgICAgICAgPGZpbGUgZmlsZT0iJHtidWlsZC50ZXN0c30iIC8+CisgICAgICAgICAgPC9pbnRlcnNlY3Q+CisgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHtqdW5pdC5mb3JrfSIvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDxlY2hvIGxldmVsPSJ2ZXJib3NlIj4gdGVzdHMuYXJlLm9uLnN5c3RlbS5jbGFzc3BhdGg9JHt0ZXN0cy5hcmUub24uc3lzdGVtLmNsYXNzcGF0aH08L2VjaG8+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXNwZXIucHJlc2VudCI+CisgICAgICA8YW5kPgorICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuQ29tcGlsZXIiLz4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbiIvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzd2luZy5wcmVzZW50Ij4KKyAgICAgIDxvcj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImthZmZlIi8+CisgICAgICAgIDwvbm90PgorICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXguc3dpbmcuSW1hZ2VJY29uIgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPCEtLSBodHRwIGNsaWVudCBuZWVkcyBjb21tb25zIGxvZ2dpbmcgLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYXBhY2hlLWh0dHBjbGllbnQucHJlc2VudCI+CisgICAgICA8YW5kPgorICAgICAgICA8YXZhaWxhYmxlCisgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ2xpZW50IgorICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iY29tbW9ucy5sb2dnaW5nLnByZXNlbnQiLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0id3NkbC5mb3VuZCI+CisgICAgICA8b3I+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0id3NkbCIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9Ii8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0id3NkbC5leGUiIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IndzZGwuZXhlIiBmaWxlcGF0aD0iJHtlbnYuUGF0aH0iLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8gbGV2ZWw9InZlcmJvc2UiPiB3c2RsLmZvdW5kPSR7d3NkbC5mb3VuZH08L2VjaG8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY3NjLmZvdW5kIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJtY3MiIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9ImNzYyIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9Ii8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iY3NjLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9Ii8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iY3NjLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBhdGh9Ii8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvIGxldmVsPSJ2ZXJib3NlIj4gY3NjLmZvdW5kPSR7Y3NjLmZvdW5kfTwvZWNobz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJkb3RuZXRhcHBzLmZvdW5kIj4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iY3NjLmZvdW5kIi8+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0id3NkbC5mb3VuZCIvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8gbGV2ZWw9InZlcmJvc2UiPiBkb3RuZXRhcHBzLmZvdW5kPSR7ZG90bmV0YXBwcy5mb3VuZH08L2VjaG8+CisKKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJyaGluby5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJvcmcubW96aWxsYS5qYXZhc2NyaXB0LlNjcmlwdGFibGUiCisgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImJlYW5zaGVsbC5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJic2guU3RyaW5nVXRpbCIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ieGVyY2VzMS5wcmVzZW50IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhlcmNlcy5mcmFtZXdvcmsuWE1MUGFyc2VyIgorICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqc2NoLnByZXNlbnQiCisgICAgICBjbGFzc25hbWU9ImNvbS5qY3JhZnQuanNjaC5TZXNzaW9uIgorICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0iY2xhc3NpYyI+CisgICAgICA8bm90PgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImpkazEuMysiLz4KKyAgICAgIDwvbm90PgorICAgIDwvY29uZGl0aW9uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9Im1vZGVybiIvPgorCisgICAgPCEtLWNoZWNrIGZvciBYU0Qgc3VwcG9ydCBpbiB0aGUgcGFyc2VyLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ieG1sc2NoZW1hLnByZXNlbnQiPgorICAgICAgPG9yPgorICAgICAgICA8cGFyc2Vyc3VwcG9ydHMKKyAgICAgICAgICBmZWF0dXJlPSJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLz4KKyAgICAgICAgPHBhcnNlcnN1cHBvcnRzCisgICAgICAgICAgZmVhdHVyZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4cC9wcm9wZXJ0aWVzL3NjaGVtYVNvdXJjZSIvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBQcmVwYXJlIHRoZSBidWlsZAorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLS0+CisgIDx0YXJnZXQgbmFtZT0icHJlcGFyZSI+CisgICAgPHRzdGFtcD4KKyAgICAgIDxmb3JtYXQgcHJvcGVydHk9InllYXIiIHBhdHRlcm49Inl5eXkiLz4KKyAgICA8L3RzdGFtcD4KKyAgICA8ZmlsdGVyY2hhaW4gaWQ9ImFudC5maWx0ZXJzIj4KKyAgICAgICA8ZXhwYW5kcHJvcGVydGllcy8+CisgICAgPC9maWx0ZXJjaGFpbj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIEJ1aWxkIHRoZSBjb2RlCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZCIKKyAgICBkZXBlbmRzPSJwcmVwYXJlLCBjaGVja19mb3Jfb3B0aW9uYWxfcGFja2FnZXMiCisgICAgZGVzY3JpcHRpb249Ii0tPiBjb21waWxlcyB0aGUgc291cmNlIGNvZGUiPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KKworICAgIDxqYXZhYyBzcmNkaXI9IiR7amF2YS5kaXJ9IgorICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKKyAgICAgIHRhcmdldD0iJHtqYXZhYy50YXJnZXR9IgorICAgICAgc291cmNlPSIke2phdmFjLnNvdXJjZX0iCisgICAgICBvcHRpbWl6ZT0iJHtvcHRpbWl6ZX0iPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIi8+CisKKyAgICAgIDxzZWxlY3RvciBpZD0iY29uZGl0aW9uYWwtcGF0dGVybnMiPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamRrMS4zKyIgdW5sZXNzPSJqZGsxLjMrIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmpkazEuNCsiIHVubGVzcz0iamRrMS40KyIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qZGsxLjUrIiB1bmxlc3M9ImpkazEuNSsiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibm90LmluLmthZmZlIiBpZj0ia2FmZmUiLz4KKworICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy50cmF4IiB1bmxlc3M9InRyYXgucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtcmVzb2x2ZXIiIHVubGVzcz0iYXBhY2hlLnJlc29sdmVyLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuanVuaXQiIHVubGVzcz0ianVuaXQucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtcmVnZXhwIgorICAgICAgICAgICAgICB1bmxlc3M9ImFwYWNoZS5yZWdleHAucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtb3JvIiB1bmxlc3M9ImFwYWNoZS5vcm8ucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtYmNlbCIgdW5sZXNzPSJiY2VsLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYXBhY2hlLWxvZzRqIiB1bmxlc3M9ImxvZzRqLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuY29tbW9ucy1sb2dnaW5nIgorICAgICAgICAgICAgICB1bmxlc3M9ImNvbW1vbnMubG9nZ2luZy5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS1ic2YiIHVubGVzcz0iYnNmLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuc3R5bGVib29rIiB1bmxlc3M9InN0eWxlYm9vay5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmphdmFtYWlsIiB1bmxlc3M9ImphdmFtYWlsLmNvbXBsZXRlIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLm5ldHJleHgiIHVubGVzcz0ibmV0cmV4eC5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmNvbW1vbnMtbmV0IiB1bmxlc3M9ImNvbW1vbnMubmV0LnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYW50bHIiIHVubGVzcz0iYW50bHIucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qbWYiIHVubGVzcz0iam1mLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamFpIiB1bmxlc3M9ImphaS5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmpkZXBlbmQiIHVubGVzcz0iamRlcGVuZC5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnN3aW5nIiB1bmxlc3M9InN3aW5nLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuanNjaCIgdW5sZXNzPSJqc2NoLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMueG1sc2NoZW1hIiB1bmxlc3M9InhtbHNjaGVtYS5wcmVzZW50Ii8+CisgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L3NlbGVjdG9yPgorICAgIDwvamF2YWM+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YS5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZHRkIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7cmVzb3VyY2UuZGlyfSIgLz4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIgZW5jb2Rpbmc9IlVURi04Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhLmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi92ZXJzaW9uLnR4dCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9kZWZhdWx0TWFuaWZlc3QubWYiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxmaWx0ZXJjaGFpbiByZWZpZD0iYW50LmZpbHRlcnMiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS8ke29wdGlvbmFsLnBhY2thZ2V9L2p1bml0L3hzbCI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZXRjLmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1mcmFtZXMueHNsIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Imp1bml0LW5vZnJhbWVzLnhzbCIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIENyZWF0ZSB0aGUgYWxsIG9mIHRoZSBBcGFjaGUgQW50IGphcnMKKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0tPgorICA8dGFyZ2V0IG5hbWU9ImphcnMiCisgICAgZGVwZW5kcz0iYnVpbGQiCisgICAgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIHRoZSBBcGFjaGUgQW50IGphcnMiPgorCisgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlyfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UueGVyY2VzIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UuZG9tIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0Uuc2F4Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRSIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqIiB0bz0iKi50eHQiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSBmaWxlPSIke21hbmlmZXN0fSIgdG9maWxlPSIke21hbmlmZXN0LnRtcH0iLz4KKyAgICA8bWFuaWZlc3QgZmlsZT0iJHttYW5pZmVzdC50bXB9Ij4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vIj4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJFeHRlbnNpb24tbmFtZSIKKyAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJTcGVjaWZpY2F0aW9uLVRpdGxlIgorICAgICAgICAgIHZhbHVlPSJBcGFjaGUgQW50Ii8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1WZXJzaW9uIgorICAgICAgICAgIHZhbHVlPSIke21hbmlmZXN0LXZlcnNpb259Ii8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1WZW5kb3IiCisgICAgICAgICAgdmFsdWU9IkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVGl0bGUiCisgICAgICAgICAgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50Ii8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIKKyAgICAgICAgICB2YWx1ZT0iJHttYW5pZmVzdC12ZXJzaW9ufSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlbmRvciIKKyAgICAgICAgICB2YWx1ZT0iQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iLz4KKyAgICAgIDwvc2VjdGlvbj4KKyAgICA8L21hbmlmZXN0PgorCisgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5saWJ9LyR7bmFtZX0tbGF1bmNoZXIuamFyIgorICAgICAgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgIHdoZW5tYW5pZmVzdG9ubHk9ImZhaWwiPgorICAgICAgPHNlbGVjdG9yIHJlZmlkPSJhbnQubGF1bmNoZXIiLz4KKyAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJNYWluLUNsYXNzIiB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyIi8+CisgICAgICA8L21hbmlmZXN0PgorICAgIDwvamFyPgorCisgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5saWJ9LyR7bmFtZX0uamFyIgorICAgICAgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgIG1hbmlmZXN0PSIke21hbmlmZXN0fSIKKyAgICAgIHdoZW5tYW5pZmVzdG9ubHk9ImZhaWwiPgorICAgICAgPG5vdD4KKyAgICAgICAgPHNlbGVjdG9yIGlkPSJub24tY29yZSI+CisgICAgICAgICAgPG9yPgorICAgICAgICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vKioiLz4KKyAgICAgICAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnR5cGUucGFja2FnZX0vKioiLz4KKyAgICAgICAgICAgIDxmaWxlbmFtZSBuYW1lPSIke3V0aWwucGFja2FnZX0vZGVwZW5kLyoqIi8+CisgICAgICAgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHt1dGlsLnBhY2thZ2V9L29wdGlvbmFsLyoqIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS1sb2c0aiIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5jb21tb25zLWxvZ2dpbmciLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYXBhY2hlLWJjZWwiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYXBhY2hlLWJzZiIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtcmVnZXhwIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS1yZXNvbHZlciIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtb3JvIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmpkazEuNCsiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamRrMS41KyIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qYXZhbWFpbCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJhbnQubGF1bmNoZXIiLz4KKyAgICAgICAgICA8L29yPgorICAgICAgICA8L3NlbGVjdG9yPgorICAgICAgPC9ub3Q+CisgICAgICA8bWV0YWluZiBkaXI9IiR7YnVpbGQuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiLz4KKyAgICAgIDwvbWV0YWluZj4KKworICAgICAgPG1hbmlmZXN0PgorICAgICAgICA8c2VjdGlvbiBuYW1lPSIke2FudC5wYWNrYWdlfS8iPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iRXh0ZW5zaW9uLW5hbWUiCisgICAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQiLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNwZWNpZmljYXRpb24tVGl0bGUiCisgICAgICAgICAgICB2YWx1ZT0iQXBhY2hlIEFudCIvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1WZXJzaW9uIgorICAgICAgICAgICAgdmFsdWU9IiR7bWFuaWZlc3QtdmVyc2lvbn0iLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNwZWNpZmljYXRpb24tVmVuZG9yIgorICAgICAgICAgICAgdmFsdWU9IkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIi8+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1UaXRsZSIKKyAgICAgICAgICAgIHZhbHVlPSJvcmcuYXBhY2hlLnRvb2xzLmFudCIvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIKKyAgICAgICAgICAgIHZhbHVlPSIke21hbmlmZXN0LXZlcnNpb259Ii8+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1WZW5kb3IiCisgICAgICAgICAgICB2YWx1ZT0iQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iLz4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgPC9tYW5pZmVzdD4KKworICAgICAgPGZpbGVzZXQgZGlyPSIke2RvY3MuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDxqYXIgZGVzdGZpbGU9IiR7YnVpbGQubGlifS8ke2Jvb3RzdHJhcC5qYXJ9IgorICAgICAgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgIG1hbmlmZXN0PSIke21hbmlmZXN0fSIKKyAgICAgIHdoZW5tYW5pZmVzdG9ubHk9ImZhaWwiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iJHthbnQucGFja2FnZX0vTWFpbi5jbGFzcyIvPgorICAgICAgPG1ldGFpbmYgZGlyPSIke2J1aWxkLmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0Ii8+CisgICAgICA8L21ldGFpbmY+CisgICAgICA8bWFuaWZlc3Q+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQ2xhc3MtUGF0aCIKKyAgICAgICAgICB2YWx1ZT0iYW50LmphciB4bWwtYXBpcy5qYXIgeGVyY2VzSW1wbC5qYXIgeGFsYW4uamFyIi8+CisgICAgICA8L21hbmlmZXN0PgorICAgIDwvamFyPgorCisgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5saWJ9L2FudC1ub2RlcHMuamFyIgorICAgICAgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgIG1hbmlmZXN0PSIke21hbmlmZXN0LnRtcH0iCisgICAgICB3aGVubWFuaWZlc3Rvbmx5PSIke29wdGlvbmFsLmphcnMud2hlbm1hbmlmZXN0b25seX0iPgorICAgICAgPGFuZD4KKyAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJub24tY29yZSIvPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0iYW50LmxhdW5jaGVyIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnRyYXgiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYXBhY2hlLXJlc29sdmVyIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmp1bml0Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS1yZWdleHAiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYXBhY2hlLW9ybyIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtYmNlbCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtbG9nNGoiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuY29tbW9ucy1sb2dnaW5nIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS1ic2YiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuc3R5bGVib29rIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmphdmFtYWlsIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLm5ldHJleHgiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuY29tbW9ucy1uZXQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYW50bHIiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuam1mIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmphaSIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qZGVwZW5kIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnN3aW5nIi8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmpzY2giLz4KKyAgICAgICAgICA8L29yPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvYW5kPgorICAgICAgPG1ldGFpbmYgZGlyPSIke2J1aWxkLmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnR4dCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0Ii8+CisgICAgICA8L21ldGFpbmY+CisgICAgPC9qYXI+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0ib3B0aW9uYWwtamFyIj4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwIi8+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5saWJ9LyR7b3B0aW9uYWwuamFycy5wcmVmaXh9LUB7ZGVwfS5qYXIiCisgICAgICAgICAgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgICAgICBtYW5pZmVzdD0iJHttYW5pZmVzdC50bXB9IgorICAgICAgICAgIHdoZW5tYW5pZmVzdG9ubHk9IiR7b3B0aW9uYWwuamFycy53aGVubWFuaWZlc3Rvbmx5fSI+CisgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5Ae2RlcH0iLz4KKyAgICAgICAgPC9qYXI+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxvcHRpb25hbC1qYXIgZGVwPSJ0cmF4Ii8+CisgICAgPG9wdGlvbmFsLWphciBkZXA9ImFwYWNoZS1yZXNvbHZlciIvPgorICAgIDxvcHRpb25hbC1qYXIgZGVwPSJqdW5pdCIvPgorICAgIDxvcHRpb25hbC1qYXIgZGVwPSJhcGFjaGUtcmVnZXhwIi8+CisgICAgPG9wdGlvbmFsLWphciBkZXA9ImFwYWNoZS1vcm8iLz4KKyAgICA8b3B0aW9uYWwtamFyIGRlcD0iYXBhY2hlLWJjZWwiLz4KKyAgICA8b3B0aW9uYWwtamFyIGRlcD0iYXBhY2hlLWxvZzRqIi8+CisgICAgPG9wdGlvbmFsLWphciBkZXA9ImNvbW1vbnMtbG9nZ2luZyIvPgorICAgIDxvcHRpb25hbC1qYXIgZGVwPSJhcGFjaGUtYnNmIi8+CisgICAgPG9wdGlvbmFsLWphciBkZXA9InN0eWxlYm9vayIvPgorICAgIDxvcHRpb25hbC1qYXIgZGVwPSJqYXZhbWFpbCIvPgorICAgIDxvcHRpb25hbC1qYXIgZGVwPSJuZXRyZXh4Ii8+CisgICAgPG9wdGlvbmFsLWphciBkZXA9ImNvbW1vbnMtbmV0Ii8+CisgICAgPG9wdGlvbmFsLWphciBkZXA9ImFudGxyIi8+CisgICAgPG9wdGlvbmFsLWphciBkZXA9ImptZiIvPgorICAgIDxvcHRpb25hbC1qYXIgZGVwPSJqYWkiLz4KKyAgICA8b3B0aW9uYWwtamFyIGRlcD0ic3dpbmciLz4KKyAgICA8b3B0aW9uYWwtamFyIGRlcD0ianNjaCIvPgorICAgIDxvcHRpb25hbC1qYXIgZGVwPSJqZGVwZW5kIi8+CisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSAgIENyZWF0ZXMgamFyIG9mIHRlc3QgdXRpbGl0eSBjbGFzc2VzIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QtamFyIgorICAgIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiCisgICAgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIHRoZSBBcGFjaGUgQW50IFRlc3QgVXRpbGl0aWVzIGphciI+CisKKyAgICA8ZmFpbCB1bmxlc3M9Imp1bml0LnByZXNlbnQiPgorICAgICAgV2UgY2Fubm90IGJ1aWxkIHRoZSB0ZXN0IGphciB1bmxlc3MgSlVuaXQgaXMgcHJlc2VudCwKKyAgICAgIGFzIEpVbml0IGlzIG5lZWRlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNsYXNzZXMuCisgICAgPC9mYWlsPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7YnVpbGQubGlifS8ke25hbWV9LXRlc3R1dGlsLmphciIKKyAgICAgIGJhc2VkaXI9IiR7YnVpbGQudGVzdHN9Ij4KKyAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJ1c2VmdWwudGVzdHMiLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIENyZWF0ZSB0aGUgZXNzZW50aWFsIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBydW4gQXBhY2hlIEFudAorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1saXRlIgorICAgIGRlcGVuZHM9ImphcnMsdGVzdC1qYXIiCisgICAgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIGEgbWluaW11bSBkaXN0cmlidXRpb24gdG8gcnVuIEFwYWNoZSBBbnQiPgorCisgICAgPG1rZGlyIGRpcj0iJHtkaXN0LmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2Rpc3QuYmlufSIvPgorICAgIDxta2RpciBkaXI9IiR7ZGlzdC5saWJ9Ii8+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmxpYn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYn0iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2Jvb3RzdHJhcC5qYXJ9Ii8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5saWJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouemlwIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPGNvcHkgdG9kaXI9IiR7ZGlzdC5iaW59Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzY3JpcHQuZGlyfSIvPgorICAgIDwvY29weT4KKworICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtkaXN0LmJpbn0iIGVvbD0iZG9zIiBpbmNsdWRlcz0iKi5iYXQsKi5jbWQiLz4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7ZGlzdC5iaW59IiBlb2w9InVuaXgiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iYW50Ii8+CisgICAgICA8aW5jbHVkZSBuYW1lPSJhbnRSdW4iLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioucGwiLz4KKyAgICA8L2ZpeGNybGY+CisKKyAgICA8Y2htb2QgcGVybT0idWdvK3J4IiBkaXI9IiR7ZGlzdC5kaXJ9IiB0eXBlPSJkaXIiIGluY2x1ZGVzPSIqKiIKKyAgICAgIGZhaWxvbmVycm9yPSIke2NobW9kLmZhaWx9Ii8+CisgICAgPGNobW9kIHBlcm09InVnbytyIiBkaXI9IiR7ZGlzdC5kaXJ9IiB0eXBlPSJmaWxlIiBpbmNsdWRlcz0iKioiCisgICAgICBmYWlsb25lcnJvcj0iJHtjaG1vZC5mYWlsfSIgbWF4cGFyYWxsZWw9IiR7Y2htb2QubWF4cGFyYWxsZWx9Ii8+CisgICAgPGNobW9kIHBlcm09InVnbyt4IiB0eXBlPSJmaWxlIiBmYWlsb25lcnJvcj0iJHtjaG1vZC5mYWlsfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC5iaW59Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovYW50Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL2FudFJ1biIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnBsIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHkiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NobW9kPgorCisgIDwvdGFyZ2V0PgorCisgIDwhLS0KKyAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgIENyZWF0ZSB0aGUgY29tcGxldGUgZGlzdHJpYnV0aW9uCisgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlc2NyaXB0aW9uPSItLT4gY3JlYXRlcyBhIGNvbXBsZXRlIGRpc3RyaWJ1dGlvbiI+CisgICAgPGFudGNhbGwgaW5oZXJpdEFsbD0iZmFsc2UiIHRhcmdldD0iaW50ZXJuYWxfZGlzdCI+CisgICAgICA8cGFyYW0gbmFtZT0iZGlzdC5kaXIiIHZhbHVlPSIke2Rpc3QubmFtZX0iLz4KKyAgICA8L2FudGNhbGw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGlzdF9qYXZhZG9jcyIgZGVwZW5kcz0iamF2YWRvY3MiPgorICAgIDxta2RpciBkaXI9IiR7ZGlzdC5qYXZhZG9jc30iLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmphdmFkb2NzfSIgb3ZlcndyaXRlPSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5qYXZhZG9jc30iLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJpbnRlcm5hbF9kaXN0IiBkZXBlbmRzPSJkaXN0LWxpdGUsZGlzdF9qYXZhZG9jcyI+CisgICAgPG1rZGlyIGRpcj0iJHtkaXN0LmRvY3N9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtkaXN0LmV0Y30iLz4KKworICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QubGlifSIgZmlsZT0iJHtsaWIuZGlyfS9SRUFETUUiLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmxpYn0iIGZpbGU9IiR7bGliLmRpcn0vbGlicmFyaWVzLnByb3BlcnRpZXMiLz4KKworICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QubGlifSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfS9ldGMvcG9tcyI+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqL3BvbS54bWwiLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8bWFwcGVyIHR5cGU9InJlZ2V4cCIgZnJvbT0iXiguKilbL1xcXXBvbS54bWwiIHRvPSJcMS0ke3Byb2plY3QudmVyc2lvbn0ucG9tIi8+CisgICAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgICAgIDx0b2tlbmZpbHRlcj4KKyAgICAgICAgICAgICAgICA8cmVwbGFjZXJlZ2V4IHBhdHRlcm49IiR7cG9tLnZlcnNpb259IiByZXBsYWNlPSIke3Byb2plY3QudmVyc2lvbn0iLz4KKyAgICAgICAgICAgIDwvdG9rZW5maWx0ZXI+CisgICAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QubGlifSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfS9ldGMvcG9tcyI+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwb20ueG1sIi8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSJwb20ueG1sIiB0bz0iYW50LXBhcmVudC0ke3Byb2plY3QudmVyc2lvbn0ucG9tIi8+CisgICAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgICAgIDx0b2tlbmZpbHRlcj4KKyAgICAgICAgICAgICAgICA8cmVwbGFjZXJlZ2V4IHBhdHRlcm49IiR7cG9tLnZlcnNpb259IiByZXBsYWNlPSIke3Byb2plY3QudmVyc2lvbn0iLz4KKyAgICAgICAgICAgIDwvdG9rZW5maWx0ZXI+CisgICAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICAgIDxjaGVja3N1bSBhbGdvcml0aG09Im1kNSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0LmxpYn0iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5wb20iLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgIDwvY2hlY2tzdW0+CisgICAgPGNoZWNrc3VtIGFsZ29yaXRobT0ic2hhMSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0LmxpYn0iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5wb20iLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgIDwvY2hlY2tzdW0+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmRvY3N9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkb2NzLmRpcn0iIGV4Y2x1ZGVzPSIke3VuZmlsdGVyZWQuZmlsZXN9Ij4KKyAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9InNpdGUuZXhjbHVkZXMiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxmaWx0ZXJjaGFpbiByZWZpZD0iYW50LmZpbHRlcnMiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmRvY3N9IiBmaWx0ZXJpbmc9ImZhbHNlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkb2NzLmRpcn0iIGluY2x1ZGVzPSIke3VuZmlsdGVyZWQuZmlsZXN9Ij4KKyAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9InNpdGUuZXhjbHVkZXMiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iUkVBRE1FIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IklOU1RBTEwiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnhlcmNlcyIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLmRvbSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLnNheCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iVE9ETyIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJXSEFUU05FVyIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJLRVlTIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImZldGNoLnhtbCIvPgorCTxpbmNsdWRlIG5hbWU9ImdldC1tMi54bWwiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8Y2htb2QgcGVybT0idWdvK3J4IiBkaXI9IiR7ZGlzdC5kaXJ9IiB0eXBlPSJkaXIiIGluY2x1ZGVzPSIqKiIKKyAgICAgIGZhaWxvbmVycm9yPSIke2NobW9kLmZhaWx9Ii8+CisgICAgPGNobW9kIHBlcm09InVnbytyIiBkaXI9IiR7ZGlzdC5kaXJ9IiB0eXBlPSJmaWxlIiBpbmNsdWRlcz0iKioiCisgICAgICBmYWlsb25lcnJvcj0iJHtjaG1vZC5mYWlsfSIgbWF4cGFyYWxsZWw9IiR7Y2htb2QubWF4cGFyYWxsZWx9Ii8+CisgICAgPGNobW9kIHBlcm09InVnbyt4IiB0eXBlPSJmaWxlIiBmYWlsb25lcnJvcj0iJHtjaG1vZC5mYWlsfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC5iaW59Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovYW50Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL2FudFJ1biIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnBsIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHkiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NobW9kPgorCisgICAgPCEtLSBwdWJsaXNoIHNvbWUgdXNlZnVsIHN0eWxlc2hlZXRzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2Rpc3QuZXRjfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZXRjLmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1mcmFtZXMueHNsIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Imp1bml0LW5vZnJhbWVzLnhzbCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1mcmFtZXMteGFsYW4xLnhzbCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb3ZlcmFnZS1mcmFtZXMueHNsIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im1hdWRpdC1mcmFtZXMueHNsIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im1tZXRyaWNzLWZyYW1lcy54c2wiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY2hhbmdlbG9nLnhzbCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJqZGVwZW5kLnhzbCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJqZGVwZW5kLWZyYW1lcy54c2wiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY2hlY2tzdHlsZS8qLnhzbCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJsb2cueHNsIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9InRhZ2RpZmYueHNsIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQubGlifSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7Ym9vdHN0cmFwLmphcn0iLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgVGFyZ2V0IHRvIGNyZWF0ZSBib290c3RyYXAgYnVpbGQKKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0tPgorICA8dGFyZ2V0IG5hbWU9ImJvb3RzdHJhcCIgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIGEgYm9vdHN0cmFwIGJ1aWxkIj4KKyAgICA8YW50Y2FsbCBpbmhlcml0QWxsPSJmYWxzZSIgdGFyZ2V0PSJkaXN0LWxpdGUiPgorICAgICAgPHBhcmFtIG5hbWU9ImRpc3QuZGlyIiB2YWx1ZT0iJHtib290c3RyYXAuZGlyfSIvPgorICAgIDwvYW50Y2FsbD4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgQ3JlYXRlIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtLT4KKyAgPHRhcmdldCBuYW1lPSJzcmMtZGlzdCIKKyAgICBkZXNjcmlwdGlvbj0iLS0+IGNyZWF0ZXMgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIj4KKworICAgIDxta2RpciBkaXI9IiR7c3JjLmRpc3QuZGlyfSIvPgorCisgICAgPGNvcHkgdG9kaXI9IiR7c3JjLmRpc3QubGlifSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLnppcCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJSRUFETUUiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ibGlicmFyaWVzLnByb3BlcnRpZXMiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtzcmMuZGlzdC5zcmN9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIvPgorICAgIDwvY29weT4KKworICAgIDxjb3B5IHRvZGlyPSIke3NyYy5kaXN0LmRvY3N9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkb2NzLmRpcn0iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJtYW51YWwvYXBpLyoqIi8+CisgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJzaXRlLmV4Y2x1ZGVzIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPGNvcHkgdG9kaXI9IiR7c3JjLmRpc3QuZGlyfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJSRUFETUUiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iSU5TVEFMTCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJMSUNFTlNFIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UueGVyY2VzIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UuZG9tIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0Uuc2F4Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJUT0RPIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IldIQVRTTkVXIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IktFWVMiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iYnVpbGQuYmF0Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImJ1aWxkLnNoIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImJvb3RzdHJhcC5iYXQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iYm9vdHN0cmFwLnNoIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJmZXRjaC54bWwiLz4KKwk8aW5jbHVkZSBuYW1lPSJnZXQtbTIueG1sIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPGZpeGNybGYgc3JjZGlyPSIke3NyYy5kaXN0LmRpcn0iIGVvbD0iZG9zIiBpbmNsdWRlcz0iKi5iYXQsKi5jbWQiLz4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7c3JjLmRpc3QuZGlyfSIgZW9sPSJ1bml4Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouc2giLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucGwiLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqL2FudCIvPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKiovYW50UnVuIi8+CisgICAgPC9maXhjcmxmPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtzcmMuZGlzdC5kaXJ9Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHt0ZXN0cy5ldGMuZGlyfS90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms/LmphdmEiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9IiR7dGVzdHMuZXRjLmRpcn0vdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rPy5qYXZhIi8+CisgICAgPC9maXhjcmxmPgorCisgICAgPGNobW9kIHBlcm09InVnbyt4IiBkaXI9IiR7c3JjLmRpc3QuZGlyfSIgdHlwZT0iZGlyIgorICAgICAgZmFpbG9uZXJyb3I9IiR7Y2htb2QuZmFpbH0iLz4KKyAgICA8Y2htb2QgcGVybT0idWdvK3IiIGRpcj0iJHtzcmMuZGlzdC5kaXJ9IiBmYWlsb25lcnJvcj0iJHtjaG1vZC5mYWlsfSIvPgorICAgIDxjaG1vZCBwZXJtPSJ1Z28reCIgZmFpbG9uZXJyb3I9IiR7Y2htb2QuZmFpbH0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXN0LmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8uc2giLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovLnBsIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLy5weSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9hbnQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovYW50UnVuIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jaG1vZD4KKworICA8L3RhcmdldD4KKworICA8IS0tCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgQ3JlYXRlIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtLT4KKyAgPHRhcmdldCBuYW1lPSJtYWluX2Rpc3RyaWJ1dGlvbiIKKyAgICBkZXNjcmlwdGlvbj0iLS0+IGNyZWF0ZXMgdGhlIHppcCBhbmQgdGFyIGRpc3RyaWJ1dGlvbnMiPgorICAgIDxkZWxldGUgZGlyPSIke2Rpc3QuYmFzZX0iLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0Lm5hbWV9Ii8+CisgICAgPGRlbGV0ZSBkaXI9IiR7amF2YS1yZXBvc2l0b3J5LmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2Rpc3QuYmFzZX0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2Rpc3QuYmFzZS5zb3VyY2V9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtkaXN0LmJhc2UuYmluYXJpZXN9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXZhLXJlcG9zaXRvcnkuamFycy5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXZhLXJlcG9zaXRvcnkucG9tcy5kaXJ9Ii8+CisgICAgPGFudGNhbGwgaW5oZXJpdEFsbD0iZmFsc2UiIHRhcmdldD0iaW50ZXJuYWxfZGlzdCI+CisgICAgICA8cGFyYW0gbmFtZT0iZGlzdC5kaXIiIHZhbHVlPSIke2Rpc3QubmFtZX0iLz4KKyAgICA8L2FudGNhbGw+CisgICAgPHppcCBkZXN0ZmlsZT0iJHtkaXN0LmJhc2UuYmluYXJpZXN9LyR7ZGlzdC5uYW1lfS1iaW4uemlwIj4KKyAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtkaXN0Lm5hbWV9Ly4uIiBmaWxlbW9kZT0iNzU1Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jpbi9hbnQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jpbi9hbnRSdW4iLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jpbi8qLnBsIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlzdC5uYW1lfS9iaW4vKi5weSIvPgorICAgICAgPC96aXBmaWxlc2V0PgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3QubmFtZX0vLi4iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vKioiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jpbi9hbnQiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jpbi9hbnRSdW4iLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jpbi8qLnBsIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7ZGlzdC5uYW1lfS9iaW4vKi5weSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvemlwPgorICAgIDx0YXIgbG9uZ2ZpbGU9ImdudSIKKyAgICAgIGRlc3RmaWxlPSIke2Rpc3QuYmFzZS5iaW5hcmllc30vJHtkaXN0Lm5hbWV9LWJpbi50YXIiPgorICAgICAgPCEtLSByZW1vdmVzIHJlZHVuZGFudCBkZWZpbml0aW9uIG9mIHBlcm1pc3Npb25zLCBidXQgc2VlbXMgdG8KKyAgICAgICAgICAgZHJvcCBkaXJzIChhbmQgdG8gYmUgc2xvdykKKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHtkaXN0LmJhc2UuYmluYXJpZXN9LyR7ZGlzdC5uYW1lfS1iaW4uemlwIi8+CisgICAgICAtLT4KKyAgICAgIDx0YXJmaWxlc2V0IGRpcj0iJHtkaXN0Lm5hbWV9Ly4uIiBtb2RlPSI3NTUiIHVzZXJuYW1lPSJhbnQiIGdyb3VwPSJhbnQiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluL2FudCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluL2FudFJ1biIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluLyoucGwiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jpbi8qLnB5Ii8+CisgICAgICA8L3RhcmZpbGVzZXQ+CisgICAgICA8dGFyZmlsZXNldCBkaXI9IiR7ZGlzdC5uYW1lfS8uLiIgdXNlcm5hbWU9ImFudCIgZ3JvdXA9ImFudCI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlzdC5uYW1lfS8qKiIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluL2FudCIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluL2FudFJ1biIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYmluLyoucGwiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jpbi8qLnB5Ii8+CisgICAgICA8L3RhcmZpbGVzZXQ+CisgICAgPC90YXI+CisgICAgPGd6aXAgZGVzdGZpbGU9IiR7ZGlzdC5iYXNlLmJpbmFyaWVzfS8ke2Rpc3QubmFtZX0tYmluLnRhci5neiIKKyAgICAgIHNyYz0iJHtkaXN0LmJhc2UuYmluYXJpZXN9LyR7ZGlzdC5uYW1lfS1iaW4udGFyIi8+CisgICAgPGJ6aXAyIGRlc3RmaWxlPSIke2Rpc3QuYmFzZS5iaW5hcmllc30vJHtkaXN0Lm5hbWV9LWJpbi50YXIuYnoyIgorICAgICAgc3JjPSIke2Rpc3QuYmFzZS5iaW5hcmllc30vJHtkaXN0Lm5hbWV9LWJpbi50YXIiLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7ZGlzdC5iYXNlLmJpbmFyaWVzfS8ke2Rpc3QubmFtZX0tYmluLnRhciIvPgorCisgICAgPGNvcHkgdG9kaXI9IiR7amF2YS1yZXBvc2l0b3J5LmphcnMuZGlyfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC5uYW1lfS9saWIiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJhbnQqLmphciIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqLmphciIgdG89IiotJHtwcm9qZWN0LnZlcnNpb259LmphciIvPgorICAgIDwvY29weT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXZhLXJlcG9zaXRvcnkucG9tcy5kaXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0Lm5hbWV9L2xpYiI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioucG9tIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Iiouc2hhMSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLm1kNSIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPG1hcHBlcj4KKyAgICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqLnBvbSIgdG89IioucG9tIi8+CisgICAgICAgIDxtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5wb20uc2hhMSIgdG89IioucG9tLnNoYTEiLz4KKyAgICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqLnBvbS5tZDUiIHRvPSIqLnBvbS5tZDUiLz4KKyAgICAgIDwvbWFwcGVyPgorICAgIDwvY29weT4KKyAgICA8Y2hlY2tzdW0gZmlsZWV4dD0iLm1kNSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YS1yZXBvc2l0b3J5LmphcnMuZGlyfSIgaW5jbHVkZXM9Iioke3Byb2plY3QudmVyc2lvbn0uamFyIi8+CisgICAgPC9jaGVja3N1bT4KKyAgICA8Y2hlY2tzdW0gZmlsZWV4dD0iLnNoYTEiIGFsZ29yaXRobT0iU0hBIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhLXJlcG9zaXRvcnkuamFycy5kaXJ9IiBpbmNsdWRlcz0iKiR7cHJvamVjdC52ZXJzaW9ufS5qYXIiLz4KKyAgICA8L2NoZWNrc3VtPgorICAgIDxkZWxldGUgZGlyPSIke2Rpc3QubmFtZX0iLz4KKyAgICA8Y2hlY2tzdW0gZmlsZWV4dD0iLm1kNSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC5iYXNlLmJpbmFyaWVzfS8iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLyouYXNjIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLyoubWQ1Ii8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jaGVja3N1bT4KKyAgICA8Y2hlY2tzdW0gZmlsZWV4dD0iLnNoYTEiIGFsZ29yaXRobT0iU0hBIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0LmJhc2UuYmluYXJpZXN9LyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5hc2MiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5tZDUiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NoZWNrc3VtPgorCisgICAgPGFudGNhbGwgaW5oZXJpdEFsbD0iZmFsc2UiIHRhcmdldD0ic3JjLWRpc3QiPgorICAgICAgPHBhcmFtIG5hbWU9InNyYy5kaXN0LmRpciIgdmFsdWU9IiR7ZGlzdC5uYW1lfSIvPgorICAgIDwvYW50Y2FsbD4KKyAgICA8emlwIGRlc3RmaWxlPSIke2Rpc3QuYmFzZS5zb3VyY2V9LyR7ZGlzdC5uYW1lfS1zcmMuemlwIj4KKyAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtkaXN0Lm5hbWV9Ly4uIiBmaWxlbW9kZT0iNzU1Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jvb3RzdHJhcC5zaCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYnVpbGQuc2giLz4KKyAgICAgIDwvemlwZmlsZXNldD4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0Lm5hbWV9Ly4uIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9LyoqIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7ZGlzdC5uYW1lfS9ib290c3RyYXAuc2giLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2J1aWxkLnNoIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC96aXA+CisgICAgPHRhciBsb25nZmlsZT0iZ251IgorICAgICAgZGVzdGZpbGU9IiR7ZGlzdC5iYXNlLnNvdXJjZX0vJHtkaXN0Lm5hbWV9LXNyYy50YXIiPgorICAgICAgPCEtLQorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke2Rpc3QuYmFzZS5zb3VyY2V9LyR7ZGlzdC5uYW1lfS1zcmMuemlwIi8+CisgICAgICAtLT4KKyAgICAgIDx0YXJmaWxlc2V0IGRpcj0iJHtkaXN0Lm5hbWV9Ly4uIiBtb2RlPSI3NTUiIHVzZXJuYW1lPSJhbnQiIGdyb3VwPSJhbnQiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYm9vdHN0cmFwLnNoIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlzdC5uYW1lfS9idWlsZC5zaCIvPgorICAgICAgPC90YXJmaWxlc2V0PgorICAgICAgPHRhcmZpbGVzZXQgZGlyPSIke2Rpc3QubmFtZX0vLi4iIHVzZXJuYW1lPSJhbnQiIGdyb3VwPSJhbnQiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vKioiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtkaXN0Lm5hbWV9L2Jvb3RzdHJhcC5zaCIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2Rpc3QubmFtZX0vYnVpbGQuc2giLz4KKyAgICAgIDwvdGFyZmlsZXNldD4KKyAgICA8L3Rhcj4KKyAgICA8Z3ppcCBkZXN0ZmlsZT0iJHtkaXN0LmJhc2Uuc291cmNlfS8ke2Rpc3QubmFtZX0tc3JjLnRhci5neiIKKyAgICAgIHNyYz0iJHtkaXN0LmJhc2Uuc291cmNlfS8ke2Rpc3QubmFtZX0tc3JjLnRhciIvPgorICAgIDxiemlwMiBkZXN0ZmlsZT0iJHtkaXN0LmJhc2Uuc291cmNlfS8ke2Rpc3QubmFtZX0tc3JjLnRhci5iejIiCisgICAgICBzcmM9IiR7ZGlzdC5iYXNlLnNvdXJjZX0vJHtkaXN0Lm5hbWV9LXNyYy50YXIiLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7ZGlzdC5iYXNlLnNvdXJjZX0vJHtkaXN0Lm5hbWV9LXNyYy50YXIiLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0Lm5hbWV9Ii8+CisgICAgPGNoZWNrc3VtIGZpbGVleHQ9Ii5tZDUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3QuYmFzZS5zb3VyY2V9LyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5hc2MiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5tZDUiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NoZWNrc3VtPgorICAgIDxjaGVja3N1bSBmaWxlZXh0PSIuc2hhMSIgYWxnb3JpdGhtPSJTSEEiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3QuYmFzZS5zb3VyY2V9LyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5hc2MiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5tZDUiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NoZWNrc3VtPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3RyaWJ1dGlvbiIgZGVwZW5kcz0ibWFpbl9kaXN0cmlidXRpb24iCisgICAgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIHRoZSBmdWxsIEFwYWNoZSBBbnQgZGlzdHJpYnV0aW9uIj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIFVwbG9hZCB0aGUgZGlzdHJpYnV0aW9uIHRvIGN2cy5hcGFjaGUub3JnIGZvciBmaW5hbCByZWxlYXNlcworICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLS0+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0LXVwbG9hZCIgPgorICAgIDxmYWlsIHVubGVzcz0iYXBhY2hlLnVzZXIiIG1lc3NhZ2U9InNldCBhIHByb3BlcnR5IGFwYWNoZS51c2VyIHdpdGggeW91ciBhcGFjaGUgdXNlciIvPgorICAgIDxmYWlsIHVubGVzcz0ic3NoLnBhc3NwaHJhc2UiIG1lc3NhZ2U9InNldCBhIHByb3BlcnR5IHdpdGggeW91ciBzc2ggcGFzc3BocmFzZSIvPgorICAgIDxmYWlsIHVubGVzcz0ic3NoLmtleWZpbGUiIG1lc3NhZ2U9InNldCBhIHByb3BlcnR5IHdpdGggeW91ciBzc2gga2V5ZmlsZSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzc2gua25vd25ob3N0cyIgbG9jYXRpb249IiR7dXNlci5ob21lfS8uc3NoL2tub3duX2hvc3RzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzc2guaG9zdCIgdmFsdWU9ImN2cy5hcGFjaGUub3JnIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNzaC52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3NoLmJhc2UuZGlyZWN0b3J5IiB2YWx1ZT0iL3d3dy93d3cuYXBhY2hlLm9yZy9kaXN0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InNzaC5kaXN0LmRpcmVjdG9yeSIgdmFsdWU9IiR7c3NoLmJhc2UuZGlyZWN0b3J5fS9hbnQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3NoLmphdmEtcmVwb3NpdG9yeS5kaXJlY3RvcnkiIHZhbHVlPSIvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTEtaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5L2FudCIvPgorICAgIDxlY2hvID4KKyAgICAgIFVwbG9hZGluZyBBbnQgdmVyc2lvbiAke3Byb2plY3QudmVyc2lvbn0KKyAgICAgIHRvIGhvc3QgJHtzc2guaG9zdH0gYXMgJHthcGFjaGUudXNlcn0KKyAgICAgIGRpc3RyaWJ1dGlvbiB0byAke3NzaC5kaXN0LmRpcmVjdG9yeX0KKyAgICAgIEpBUiBmaWxlcyB0byAke3NzaC5qYXZhLXJlcG9zaXRvcnkuZGlyZWN0b3J5fS9qYXJzCisgICAgICBQT00gZmlsZXMgdG8gJHtzc2guamF2YS1yZXBvc2l0b3J5LmRpcmVjdG9yeX0vcG9tcworICAgICAgS25vd24gaG9zdHMgPSAke3NzaC5rbm93bmhvc3RzfQorICAgIDwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBjcmVhdGUgdGhlIGRpcmVjdG9yaWVzIGlmIGFic2VudC0tPgorICA8dGFyZ2V0IG5hbWU9InNzaC1ta2RpcnMiCisgICAgZGVwZW5kcz0iaW5pdC11cGxvYWQiPgorICAgIDxzc2hleGVjIHVzZXJuYW1lPSIke2FwYWNoZS51c2VyfSIgaG9zdD0iJHtzc2guaG9zdH0iCisgICAgICBrZXlmaWxlPSIke3NzaC5rZXlmaWxlfSIgcGFzc3BocmFzZT0iJHtzc2gucGFzc3BocmFzZX0iCisgICAgICBrbm93bmhvc3RzPSIke3NzaC5rbm93bmhvc3RzfSIKKyAgICAgIGNvbW1hbmQ9Im1rZGlyIC1wICR7c3NoLmRpc3QuZGlyZWN0b3J5fSIgLz4KKyAgICA8c3NoZXhlYyB1c2VybmFtZT0iJHthcGFjaGUudXNlcn0iIGhvc3Q9IiR7c3NoLmhvc3R9IgorICAgICAga2V5ZmlsZT0iJHtzc2gua2V5ZmlsZX0iIHBhc3NwaHJhc2U9IiR7c3NoLnBhc3NwaHJhc2V9IgorICAgICAga25vd25ob3N0cz0iJHtzc2gua25vd25ob3N0c30iCisgICAgICBjb21tYW5kPSJta2RpciAtcCAke3NzaC5qYXZhLXJlcG9zaXRvcnkuZGlyZWN0b3J5fS9qYXJzIi8+CisgICAgPHNzaGV4ZWMgdXNlcm5hbWU9IiR7YXBhY2hlLnVzZXJ9IiBob3N0PSIke3NzaC5ob3N0fSIKKyAgICAgIGtleWZpbGU9IiR7c3NoLmtleWZpbGV9IiBwYXNzcGhyYXNlPSIke3NzaC5wYXNzcGhyYXNlfSIKKyAgICAgIGtub3duaG9zdHM9IiR7c3NoLmtub3duaG9zdHN9IgorICAgICAgY29tbWFuZD0ibWtkaXIgLXAgJHtzc2guamF2YS1yZXBvc2l0b3J5LmRpcmVjdG9yeX0vcG9tcyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InVwbG9hZCIgZGVzY3JpcHRpb249Ii0tPiB1cGxvYWRzIHRoZSBkaXN0cmlidXRpb24iCisgICAgICBkZXBlbmRzPSJpbml0LXVwbG9hZCxzc2gtbWtkaXJzIj4KKyAgICA8c2NwIHRvZGlyPSIke2FwYWNoZS51c2VyfUAke3NzaC5ob3N0fToke3NzaC5kaXN0LmRpcmVjdG9yeX0iCisgICAgICBrZXlmaWxlPSIke3NzaC5rZXlmaWxlfSIgcGFzc3BocmFzZT0iJHtzc2gucGFzc3BocmFzZX0iCisgICAgICBrbm93bmhvc3RzPSIke3NzaC5rbm93bmhvc3RzfSIKKyAgICAgIHZlcmJvc2U9IiR7c3NoLnZlcmJvc2V9IiA+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdC5iYXNlfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoke3Byb2plY3QudmVyc2lvbn0qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgIDwvc2NwPgorICAgIDxzY3AgdG9kaXI9IiR7YXBhY2hlLnVzZXJ9QCR7c3NoLmhvc3R9OiR7c3NoLmphdmEtcmVwb3NpdG9yeS5kaXJlY3Rvcnl9IgorICAgICAga2V5ZmlsZT0iJHtzc2gua2V5ZmlsZX0iIHBhc3NwaHJhc2U9IiR7c3NoLnBhc3NwaHJhc2V9IgorICAgICAga25vd25ob3N0cz0iJHtzc2gua25vd25ob3N0c30iCisgICAgICB2ZXJib3NlPSIke3NzaC52ZXJib3NlfSI+CisgICAgICA8ZmlsZXNldCBkaXI9ImphdmEtcmVwb3NpdG9yeS9hbnQiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLyoke3Byb2plY3QudmVyc2lvbn0qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgIDwvc2NwPgorICA8L3RhcmdldD4KKworICA8IS0tCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgQ2xlYW5zIHVwIGJ1aWxkIGFuZCBkaXN0cmlidXRpb24gZGlyZWN0b3JpZXMKKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIgorICAgIGRlc2NyaXB0aW9uPSItLT4gY2xlYW5zIHVwIGJ1aWxkIGFuZCBkaXN0IGRpcmVjdG9yaWVzIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdC5iYXNlfSIvPgorICAgIDxkZWxldGUgZGlyPSIke2Rpc3QuZGlyfSIvPgorICAgIDxkZWxldGU+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqKi8qfiIgZGVmYXVsdGV4Y2x1ZGVzPSJubyIvPgorICAgIDwvZGVsZXRlPgorICA8L3RhcmdldD4KKworICA8IS0tCisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgQ2xlYW5zIGV2ZXJ5dGhpbmcKKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbGNsZWFuIgorICAgIGRlcGVuZHM9ImNsZWFuIgorICAgIGRlc2NyaXB0aW9uPSItLT4gY2xlYW5zIHVwIGV2ZXJ5dGhpbmciPgorICAgIDxkZWxldGUgZmlsZT0iJHtib290c3RyYXAuZGlyfS9iaW4vYW50UnVuIi8+CisgICAgPGRlbGV0ZSBmaWxlPSIke2Jvb3RzdHJhcC5kaXJ9L2Jpbi9hbnRSdW4uYmF0Ii8+CisgICAgPGRlbGV0ZSBmaWxlPSIke2Jvb3RzdHJhcC5kaXJ9L2Jpbi8qLnBsIi8+CisgICAgPGRlbGV0ZSBmaWxlPSIke2Jvb3RzdHJhcC5kaXJ9L2Jpbi8qLnB5Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBJbnN0YWxscyBBcGFjaGUgQW50CisgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtLT4KKyAgPHRhcmdldCBuYW1lPSJpbnN0YWxsIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSJZb3UgbXVzdCBzZXQgdGhlIHByb3BlcnR5IGFudC5pbnN0YWxsPS93aGVyZS90by9pbnN0YWxsIiB1bmxlc3M9ImFudC5pbnN0YWxsIi8+CisgICAgPGFudGNhbGwgaW5oZXJpdEFsbD0iZmFsc2UiIHRhcmdldD0iaW50ZXJuYWxfZGlzdCI+CisgICAgICA8cGFyYW0gbmFtZT0iZGlzdC5kaXIiIHZhbHVlPSIke2FudC5pbnN0YWxsfSIvPgorICAgIDwvYW50Y2FsbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLWxpdGUiPgorICAgIDxmYWlsIG1lc3NhZ2U9IllvdSBtdXN0IHNldCB0aGUgcHJvcGVydHkgYW50Lmluc3RhbGw9L3doZXJlL3RvL2luc3RhbGwiIHVubGVzcz0iYW50Lmluc3RhbGwiLz4KKyAgICA8YW50Y2FsbCBpbmhlcml0QWxsPSJmYWxzZSIgdGFyZ2V0PSJkaXN0LWxpdGUiPgorICAgICAgPHBhcmFtIG5hbWU9ImRpc3QuZGlyIiB2YWx1ZT0iJHthbnQuaW5zdGFsbH0iLz4KKyAgICA8L2FudGNhbGw+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBDcmVhdGVzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbgorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvY19jaGVjayI+CisgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJqYXZhZG9jLm5vdHJlcXVpcmVkIgorICAgICAgdGFyZ2V0ZmlsZT0iJHtidWlsZC5qYXZhZG9jc30vcGFja2FnZXMuaHRtbCI+CisgICAgICA8c3JjZmlsZXMgZGlyPSIke2phdmEuZGlyfSIgaW5jbHVkZXM9IioqLyouamF2YSIvPgorICAgIDwvdXB0b2RhdGU+CisgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJ0ZXN0cy5qYXZhZG9jLm5vdHJlcXVpcmVkIgorICAgICAgdGFyZ2V0ZmlsZT0iJHtidWlsZC50ZXN0cy5qYXZhZG9jc30vcGFja2FnZXMuaHRtbCI+CisgICAgICA8c3JjZmlsZXMgZGlyPSIke3NyYy5qdW5pdH0iPgorICAgICAgICA8cGF0dGVybnNldCByZWZpZD0idXNlZnVsLnRlc3RzIi8+CisgICAgICA8L3NyY2ZpbGVzPgorICAgIDwvdXB0b2RhdGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iamF2YWRvY3MiIGRlcGVuZHM9InByZXBhcmUsIGphdmFkb2NfY2hlY2siCisgICAgdW5sZXNzPSJqYXZhZG9jLm5vdHJlcXVpcmVkIgorICAgIGRlc2NyaXB0aW9uPSItLT4gY3JlYXRlcyB0aGUgQVBJIGRvY3VtZW50YXRpb24iPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQuamF2YWRvY3N9Ii8+CisgICAgPGphdmFkb2MgdXNlZXh0ZXJuYWxmaWxlPSJ5ZXMiCisgICAgICBkZXN0ZGlyPSIke2J1aWxkLmphdmFkb2NzfSIKKyAgICAgIGF1dGhvcj0idHJ1ZSIKKyAgICAgIHZlcnNpb249InRydWUiCisgICAgICBsb2NhbGU9ImVuIgorICAgICAgd2luZG93dGl0bGU9IiR7TmFtZX0gQVBJIgorICAgICAgZG9jdGl0bGU9IiR7TmFtZX0iCisgICAgICB2ZXJib3NlPSIke2phdmFkb2MudmVyYm9zZX0iPgorCisgICAgICA8cGFja2FnZXNldCBkaXI9IiR7amF2YS5kaXJ9Ii8+CisKKyAgICAgIDwhLS0gaGlkZSBzb21lIG1ldGEgaW5mb3JtYXRpb24gZm9yIGphdmFkb2MgLS0+CisgICAgICA8dGFnIG5hbWU9InRvZG8iIGRlc2NyaXB0aW9uPSJUbyBkbzoiIHNjb3BlPSJhbGwiLz4KKyAgICAgIDx0YWcgbmFtZT0iYW50LnRhc2siIGVuYWJsZWQ9ImZhbHNlIiBkZXNjcmlwdGlvbj0iVGFzazoiIHNjb3BlPSJ0eXBlcyIvPgorICAgICAgPHRhZyBuYW1lPSJhbnQuZGF0YXR5cGUiIGVuYWJsZWQ9ImZhbHNlIiBkZXNjcmlwdGlvbj0iRGF0YSB0eXBlOiIgc2NvcGU9InR5cGVzIi8+CisgICAgICA8dGFnIG5hbWU9ImFudC5hdHRyaWJ1dGUiIGVuYWJsZWQ9ImZhbHNlIiBkZXNjcmlwdGlvbj0iQXR0cmlidXRlOiIgc2NvcGU9InR5cGVzIi8+CisgICAgICA8dGFnIG5hbWU9ImFudC5hdHRyaWJ1dGUuZ3JvdXAiIGVuYWJsZWQ9ImZhbHNlIiBkZXNjcmlwdGlvbj0iQXR0cmlidXRlIGdyb3VwOiIgc2NvcGU9InR5cGVzIi8+CisgICAgICA8dGFnIG5hbWU9ImFudC5lbGVtZW50IiBlbmFibGVkPSJmYWxzZSIgZGVzY3JpcHRpb249Ik5lc3RlZCBlbGVtZW50OiIgc2NvcGU9InR5cGVzIi8+CisgICAgICA8Z3JvdXAgdGl0bGU9IkFwYWNoZSBBbnQgQ29yZSIgcGFja2FnZXM9Im9yZy5hcGFjaGUudG9vbHMuYW50KiIvPgorICAgICAgPGdyb3VwIHRpdGxlPSJDb3JlIFRhc2tzIiBwYWNrYWdlcz0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMqIi8+CisgICAgICA8Z3JvdXAgdGl0bGU9IkNvcmUgVHlwZXMiIHBhY2thZ2VzPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcyoiLz4KKyAgICAgIDxncm91cCB0aXRsZT0iT3B0aW9uYWwgVGFza3MiIHBhY2thZ2VzPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbCoiLz4KKyAgICAgIDxncm91cCB0aXRsZT0iT3B0aW9uYWwgVHlwZXMiIHBhY2thZ2VzPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbCoiLz4KKyAgICAgIDxncm91cCB0aXRsZT0iQW50IFV0aWxpdGllcyIgcGFja2FnZXM9Im9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwqIi8+CisKKyAgICA8L2phdmFkb2M+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1qYXZhZG9jcyIgZGVwZW5kcz0icHJlcGFyZSwgamF2YWRvY19jaGVjayIKKyAgICB1bmxlc3M9InRlc3RzLmphdmFkb2Mubm90cmVxdWlyZWQiCisgICAgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgdGVzdCB1dGlsaXRpZXMiPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQudGVzdHMuamF2YWRvY3N9Ii8+CisgICAgPGphdmFkb2MgdXNlZXh0ZXJuYWxmaWxlPSJ5ZXMiCisgICAgICBkZXN0ZGlyPSIke2J1aWxkLnRlc3RzLmphdmFkb2NzfSIKKyAgICAgIGF1dGhvcj0idHJ1ZSIKKyAgICAgIHZlcnNpb249InRydWUiCisgICAgICBsb2NhbGU9ImVuIgorICAgICAgd2luZG93dGl0bGU9IiR7TmFtZX0gVGVzdCBVdGlsaXRpZXMiCisgICAgICBkb2N0aXRsZT0iJHtOYW1lfSI+CisKKyAgICAgIDwhLS0gaGlkZSBzb21lIG1ldGEgaW5mb3JtYXRpb24gZm9yIGphdmFkb2MgLS0+CisgICAgICA8dGFnIG5hbWU9InByZSIgZGVzY3JpcHRpb249IlByZWNvbmRpdGlvbjoiIHNjb3BlPSJhbGwiLz4KKworICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5qdW5pdH0iPgorICAgICAgICA8cGF0dGVybnNldCByZWZpZD0idXNlZnVsLnRlc3RzIi8+CisgICAgICA8L2ZpbGVzZXQ+CisKKyAgICA8L2phdmFkb2M+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBDb21waWxlIHRlc3RjYXNlcworICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLS0+CisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyIgZGVwZW5kcz0iYnVpbGQiIGlmPSJqdW5pdC5wcmVzZW50Ij4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRlc3RzfSIvPgorCisgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuanVuaXR9IgorICAgICAgZGVzdGRpcj0iJHtidWlsZC50ZXN0c30iCisgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICB0YXJnZXQ9IiR7amF2YWMudGFyZ2V0fSIKKyAgICAgIHNvdXJjZT0iJHtqYXZhYy5zb3VyY2V9IgorICAgICAgZGVwcmVjYXRpb249IiR7ZGVwcmVjYXRpb259Ij4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RzLWNsYXNzcGF0aCIvPgorCisgICAgICA8c2VsZWN0b3IgcmVmaWQ9ImNvbmRpdGlvbmFsLXBhdHRlcm5zIi8+CisgICAgPC9qYXZhYz4KKworICAgIDwhLS0gVXNlZCBieSBBbnRsaWJUZXN0LnRlc3RBbnRsaWJSZXNvdXJjZTogLS0+CisgICAgPGphciBqYXJmaWxlPSIke2J1aWxkLnRlc3RzfS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy90ZXN0Mi1hbnRsaWIuamFyIj4KKyAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJFeHRlbnNpb24tbmFtZSIKKyAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJTcGVjaWZpY2F0aW9uLVRpdGxlIgorICAgICAgICAgIHZhbHVlPSJBcGFjaGUgQW50Ii8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1WZXJzaW9uIgorICAgICAgICAgIHZhbHVlPSIke21hbmlmZXN0LXZlcnNpb259Ii8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1WZW5kb3IiCisgICAgICAgICAgdmFsdWU9IkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVGl0bGUiCisgICAgICAgICAgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50Ii8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIKKyAgICAgICAgICB2YWx1ZT0iJHttYW5pZmVzdC12ZXJzaW9ufSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlbmRvciIKKyAgICAgICAgICB2YWx1ZT0iQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iLz4KKyAgICAgIDwvbWFuaWZlc3Q+CisgICAgICA8emlwZmlsZXNldCBkaXI9IiR7dGVzdHMuZXRjLmRpcn0iIGZ1bGxwYXRoPSJ0YXNrZGVmcy90ZXN0LmFudGxpYi54bWwiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0YXNrZGVmcy90ZXN0Mi5hbnRsaWIueG1sIi8+CisgICAgICA8L3ppcGZpbGVzZXQ+CisgICAgPC9qYXI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZHVtcC1pbmZvIiBkZXBlbmRzPSJkdW1wLXN5cy1wcm9wZXJ0aWVzLHJ1bi13aGljaCIvPgorCisgIDx0YXJnZXQgbmFtZT0iZHVtcC1zeXMtcHJvcGVydGllcyIgdW5sZXNzPSJ3aGljaC5wcmVzZW50IgorICAgIGRlcGVuZHM9InhtbC1jaGVjayI+CisgICAgPGVjaG8gbWVzc2FnZT0iamF2YS52bS5pbmZvPSR7amF2YS52bS5pbmZvfSIvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImphdmEudm0ubmFtZT0ke2phdmEudm0ubmFtZX0iLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqYXZhLnZtLnZlbmRvcj0ke2phdmEudm0udmVuZG9yfSIvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImphdmEudm0udmVyc2lvbj0ke2phdmEudm0udmVyc2lvbn0iLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJvcy5hcmNoPSR7b3MuYXJjaH0iLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJvcy5uYW1lPSR7b3MubmFtZX0iLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJvcy52ZXJzaW9uPSR7b3MudmVyc2lvbn0iLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJmaWxlLmVuY29kaW5nPSR7ZmlsZS5lbmNvZGluZ30iLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJ1c2VyLmxhbmd1YWdlPSR7dXNlci5sYW5ndWFnZX0iLz4KKyAgCTxlY2hvIG1lc3NhZ2U9ImFudC52ZXJzaW9uPSR7YW50LnZlcnNpb259Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gaGVscGVyIGNsYXNzIGZyb20gWGFsYW4yIHRvIGNoZWNrIGZvciBqYXIgdmVyc2lvbmluZyBvZiB4bWwveHNsIHByb2Nlc3NvcnMgLS0+CisgIDx0YXJnZXQgbmFtZT0ieG1sLWNoZWNrIiBkZXBlbmRzPSJjaGVja19mb3Jfb3B0aW9uYWxfcGFja2FnZXMiCisgICAgaWY9InhhbGFuLmVudmNoZWNrIiB1bmxlc3M9IndoaWNoLnByZXNlbnQiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LkVudmlyb25tZW50Q2hlY2siLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJydW4td2hpY2giIGRlcGVuZHM9ImNoZWNrX2Zvcl9vcHRpb25hbF9wYWNrYWdlcyIKKyAgICBpZj0id2hpY2gucHJlc2VudCI+CisgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmVudi5XaGljaCIgdGFza25hbWU9IndoaWNoIi8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gdGVzdCB0byBzZWUgaWYgd2UgYXJlIG9ubGluZSBvciBub3QuIGNhbiB0YWtlIGEgd2hpbGUgd2hlbiB3ZSBhcmUgb2ZmIGxpbmUsIHNvCisgICAgc2V0dGluZyB0aGUgcHJvcGVydHkgaXMgYSBnb29kIHNob3J0Y3V0LS0+CisgIDx0YXJnZXQgbmFtZT0icHJvYmUtb2ZmbGluZSI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ib2ZmbGluZSI+CisgICAgICA8b3I+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0ib2ZmbGluZSIvPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxodHRwIHVybD0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8gbGV2ZWw9InZlcmJvc2UiPiBvZmZsaW5lPSR7b2ZmbGluZX08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBSdW4gdGVzdGNhc2UKKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0tPgorCisgIDx0YXJnZXQgbmFtZT0iY2hlY2stZmFpbGVkIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0cy5mYWlsZWQiPgorICAgICAgPG9yPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9Imp1bml0LmZhaWxlZCIgLz4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJhbnR1bml0LmZhaWxlZCIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249Ii0tPiBydW4gdW5pdCB0ZXN0cyBhbmQgcmVwb3J0cyIKKyAgICAgICAgICBkZXBlbmRzPSJkdW1wLWluZm8sanVuaXQtcmVwb3J0LGFudHVuaXQtcmVwb3J0LGNoZWNrLWZhaWxlZCI+CisgICAgPGZhaWwgaWY9InRlc3RzLmZhaWxlZCIgdW5sZXNzPSJpZ25vcmUudGVzdHMuZmFpbGVkIj5Vbml0IHRlc3RzIGZhaWxlZDsKK3NlZSAke2J1aWxkLmp1bml0LnJlcG9ydHN9IC8gJHthbnR1bml0LnJlcG9ydHN9CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJ1bi10ZXN0cyIgZGVwZW5kcz0iZHVtcC1pbmZvLGp1bml0LXRlc3RzLGFudHVuaXQtdGVzdHMsY2hlY2stZmFpbGVkIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gcnVuIHVuaXQgdGVzdHMgd2l0aG91dCByZXBvcnRzIj4KKyAgICA8ZmFpbCBpZj0idGVzdHMuZmFpbGVkIiBtZXNzYWdlPSJVbml0IHRlc3RzIGZhaWxlZCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWluaXQiIGRlcGVuZHM9InByb2JlLW9mZmxpbmUsY2hlY2tfZm9yX29wdGlvbmFsX3BhY2thZ2VzIj4KKyAgICA8bWFjcm9kZWYgbmFtZT0idGVzdC1qdW5pdCI+CisgICAgICA8ZWxlbWVudCBuYW1lPSJqdW5pdC1uZXN0ZWQiIGltcGxpY2l0PSJ0cnVlIiAvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDwhLS0gRGVsZXRlICdvbGQnIGNvbGxlY3RvciBjbGFzc2VzIC0tPgorICAgICAgICA8ZGVsZXRlIGZhaWxvbmVycm9yPSJmYWxzZSI+CisgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2p1bml0LmNvbGxlY3Rvci5kaXJ9IiBpbmNsdWRlcz0iJHtqdW5pdC5jb2xsZWN0b3IuY2xhc3N9Ki5jbGFzcyIvPgorICAgICAgICA8L2RlbGV0ZT4KKyAgICAgICAgPCEtLSBjb21waWxlIHRoZSBGYWlsZWRUZXN0cyBjbGFzcyBpZiBwcmVzZW50IC0tPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LmNvbGxlY3Rvci5kaXJ9Ii8+CisgICAgICAgIDxqYXZhYyBzcmNkaXI9IiR7anVuaXQuY29sbGVjdG9yLmRpcn0iIGRlc3RkaXI9IiR7anVuaXQuY29sbGVjdG9yLmRpcn0iPgorICAgICAgICAgIDxjbGFzc3BhdGggaWQ9ImZhaWx1cmUuY3AiPgorICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXN9Ii8+CisgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdHN9Ii8+CisgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDwvamF2YWM+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtqdW5pdC5jb2xsZWN0b3IuZGlyfS8ke2p1bml0LmNvbGxlY3Rvci5jbGFzc30uY2xhc3MiCisgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Imhhc0ZhaWxpbmdUZXN0cyIvPgorICAgICAgICA8IS0tIHJ1biB0aGUgdGVzdHMgLS0+CisgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuanVuaXQueG1sfSIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3QuanVuaXQudm1hcmdzIiB2YWx1ZT0iIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuanVuaXQuZmFpbHVyZUNvbGxlY3RvciIKKyAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2p1bml0LmNvbGxlY3Rvci5kaXJ9LyR7anVuaXQuY29sbGVjdG9yLmNsYXNzfSIvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnN1bW1hcnl9IgorICAgICAgICAgICAgICAgaGFsdG9uZmFpbHVyZT0iJHt0ZXN0LmhhbHRvbmZhaWx1cmV9IgorICAgICAgICAgICAgICAgZm9yaz0iJHtqdW5pdC5mb3JrfSIKKyAgICAgICAgICAgICAgIGZvcmttb2RlPSIke2p1bml0LmZvcmttb2RlfSIKKyAgICAgICAgICAgICAgIGZhaWx1cmVwcm9wZXJ0eT0ianVuaXQuZmFpbGVkIgorICAgICAgICAgICAgICAgZXJyb3Jwcm9wZXJ0eT0ianVuaXQuZmFpbGVkIgorICAgICAgICAgICAgICAgZmlsdGVydHJhY2U9IiR7anVuaXQuZmlsdGVydHJhY2V9Ij4KKyAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJhbnQuaG9tZSIgdmFsdWU9IiR7YW50LmhvbWV9Ii8+CisgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdHMiIGZpbGU9IiR7YnVpbGQudGVzdHN9Ii8+CisgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdHMudmFsdWUiIHZhbHVlPSIke2J1aWxkLnRlc3RzLnZhbHVlfSIvPgorICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9Im9mZmxpbmUiIHZhbHVlPSIke29mZmxpbmV9Ii8+CisgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0idGVzdHMtY2xhc3NwYXRoLnZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0cy1jbGFzc3BhdGgudmFsdWV9Ii8+CisgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0icm9vdCIgZmlsZT0iJHtiYXNlZGlyfSIvPgorICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0iJHtidWlsZC5jb21waWxlcn0iLz4KKyAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJ0ZXN0cy5hbmQuYW50LnNoYXJlLmNsYXNzbG9hZGVyIgorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0cy5hbmQuYW50LnNoYXJlLmNsYXNzbG9hZGVyfSIvPgorICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICA8cGF0aCByZWZpZD0idGVzdHMtY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anVuaXQuY29sbGVjdG9yLmRpcn0iLz4KKyAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJmYWlsdXJlLmNwIi8+CisgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJmYWlsdXJlIiB1c2VmaWxlPSJmYWxzZSIvPgorICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIi8+CisgICAgICAgICAgPGp2bWFyZyBsaW5lPSIke3Rlc3QuanVuaXQudm1hcmdzfSIvPgorICAgICAgICAgIDx0ZXN0IG5hbWU9IiR7anVuaXQuY29sbGVjdG9yLmNsYXNzfSIgaWY9Imhhc0ZhaWxpbmdUZXN0cyIvPgorICAgICAgICAgIAorICAgICAgICAgIDxqdW5pdC1uZXN0ZWQgLz4KKyAgICAgICAgPC9qdW5pdD4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPGZhaWw+InRlc3RjYXNlIiBjYW5ub3QgYmUgc3BlY2lmaWVkIHdpdGggImp1bml0LnRlc3RjYXNlIiBvciAiYW50dW5pdC50ZXN0Y2FzZSIuCisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8YW5kPgorICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0idGVzdGNhc2UiIC8+CisgICAgICAgICAgPG9yPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJhbnR1bml0LnRlc3RjYXNlIiAvPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJqdW5pdC50ZXN0Y2FzZSIgLz4KKyAgICAgICAgICA8L29yPgorICAgICAgICA8L2FuZD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImFudHVuaXQudGVzdGNhc2UiIHZhbHVlPSIke3Rlc3RjYXNlfSI+CisgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7c3JjLmFudHVuaXR9LyR7dGVzdGNhc2V9IiAvPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianVuaXQudGVzdGNhc2UiIHZhbHVlPSIke3Rlc3RjYXNlfSI+CisgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iJHt0ZXN0Y2FzZX0iIGNsYXNzcGF0aHJlZj0idGVzdHMtY2xhc3NwYXRoIiAvPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPGZhaWw+Q2Fubm90IGxvY2F0ZSB0ZXN0ICR7dGVzdGNhc2V9CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8YW5kPgorICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0idGVzdGNhc2UiIC8+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJhbnR1bml0LnRlc3RjYXNlIiAvPgorICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9Imp1bml0LnRlc3RjYXNlIiAvPgorICAgICAgICAgICAgPC9vcj4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9hbmQ+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJydW4uanVuaXQiPgorICAgICAgPGFuZD4KKyAgICAgICAgPG5vdD48ZXF1YWxzIGFyZzE9IiR7dGVzdGNhc2V9IiBhcmcyPSIke2FudHVuaXQudGVzdGNhc2V9IiAvPjwvbm90PgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9Imp1bml0LnByZXNlbnQiIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtzcmMuanVuaXR9IiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqdW5pdC5zaW5nbGUiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJqdW5pdC50ZXN0Y2FzZSIgLz4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJydW4uanVuaXQiIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9Imp1bml0LmJhdGNoIj4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJqdW5pdC50ZXN0Y2FzZSIgLz48L25vdD4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJydW4uanVuaXQiIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9InJ1bi5hbnR1bml0Ij4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxub3Q+PGVxdWFscyBhcmcxPSIke3Rlc3RjYXNlfSIgYXJnMj0iJHtqdW5pdC50ZXN0Y2FzZX0iIC8+PC9ub3Q+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYW50dW5pdC5wcmVzZW50IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7c3JjLmFudHVuaXR9IiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJydW4uYW50dW5pdC5yZXBvcnQiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJydW4uYW50dW5pdCIgLz4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ0cmF4LmltcGwucHJlc2VudCIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0icnVuLmp1bml0LnJlcG9ydCI+CisgICAgICA8YW5kPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9InJ1bi5qdW5pdCIgLz4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ0cmF4LmltcGwucHJlc2VudCIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imp1bml0LXJlcG9ydCIgZGVwZW5kcz0ianVuaXQtdGVzdHMsanVuaXQtcmVwb3J0LW9ubHkiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJqdW5pdC1yZXBvcnQtb25seSIgZGVwZW5kcz0idGVzdC1pbml0IiBpZj0icnVuLmp1bml0LnJlcG9ydCI+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5qdW5pdC5yZXBvcnRzfSIgLz4KKyAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7YnVpbGQuanVuaXQucmVwb3J0c30iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmp1bml0LnhtbH0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJURVNULSoueG1sIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiB0b2Rpcj0iJHtidWlsZC5qdW5pdC5yZXBvcnRzfSIvPgorICAgIDwvanVuaXRyZXBvcnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ianVuaXQtdGVzdHMiIGRlcGVuZHM9Imp1bml0LWJhdGNoLGp1bml0LXNpbmdsZS10ZXN0IiAvPgorCisgIDx0YXJnZXQgbmFtZT0ianVuaXQtYmF0Y2giIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMsdGVzdC1pbml0IgorICAgICAgaWY9Imp1bml0LmJhdGNoIj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5pbmNsdWRlcyIgdmFsdWU9IioqLypUZXN0KiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQuZXhjbHVkZXMiIHZhbHVlPSIiIC8+CisKKyAgICA8dGVzdC1qdW5pdD4KKyAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iYnJpZWYiIHVzZWZpbGU9ImZhbHNlIi8+CisKKyAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7YnVpbGQuanVuaXQueG1sfSIgdW5sZXNzPSJoYXNGYWlsaW5nVGVzdHMiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmp1bml0fSIKKyAgICAgICAgICAgICAgICAgaW5jbHVkZXM9IiR7anVuaXQuaW5jbHVkZXN9IiBleGNsdWRlcz0iJHtqdW5pdC5leGNsdWRlc30iPgorCisgICAgICAgICAgPCEtLSBhYnN0cmFjdCBjbGFzc2VzLCBub3QgdGVzdGNhc2VzIC0tPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7dGFza2RlZnMucGFja2FnZX0vVGFza2RlZnNUZXN0LmphdmEiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS9CdWlsZEZpbGVUZXN0LmphdmEiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke3JlZ2V4cC5wYWNrYWdlfS9SZWdleHBNYXRjaGVyVGVzdC5qYXZhIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtyZWdleHAucGFja2FnZX0vUmVnZXhwVGVzdC5qYXZhIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdC5qYXZhIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHthbnQucGFja2FnZX0vdHlwZXMvQWJzdHJhY3RGaWxlU2V0VGVzdC5qYXZhIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHthbnQucGFja2FnZX0vdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3RvclRlc3QuamF2YSIvPgorCisgICAgICAgICAgPCEtLSBoZWxwZXIgY2xhc3Nlcywgbm90IHRlc3RjYXNlcyAtLT4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvZXhhbXBsZS8qKiIvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7dGFza2RlZnMucGFja2FnZX0vVGFza2RlZlRlc3QqVGFzay5qYXZhIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9qdW5pdC9UZXN0Rm9ybWF0dGVyLmphdmEiLz4KKworICAgICAgICAgIDwhLS0gaW50ZXJhY3RpdmUgdGVzdHMgLS0+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHt0YXNrZGVmcy5wYWNrYWdlfS9UZXN0UHJvY2Vzcy5qYXZhIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9zcGxhc2gvU3BsYXNoU2NyZWVuVGVzdC5qYXZhIi8+CisKKyAgICAgICAgICA8IS0tIG9ubHkgcnVuIHRoZXNlIHRlc3RzIGlmIHRoZWlyIHJlcXVpcmVkIGxpYnJhcmllcyBhcmUKKyAgICAgICAgICAgICAgIGluc3RhbGxlZCAtLT4KKyAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9ImNvbmRpdGlvbmFsLXBhdHRlcm5zIi8+CisKKyAgICAgICAgICA8IS0tIHRlc3RzIGV4Y2x1ZGVkIGlmIHRoZSB0ZXN0IGlzIHJ1biBpbiBvZmZsaW5lIG1vZGUgLS0+CisgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9Im9ubGluZXRlc3RzIi8+CisKKyAgICAgICAgICA8IS0tIGZhaWxpbmcgdGVzdHMgZXhjbHVkZWQgdW5sZXNzIHJ1bi5mYWlsaW5nLnRlc3RzIGlzIHNldCAtLT4KKyAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0idGVzdHN0aGF0ZmFpbCIvPgorCisgICAgICAgICAgPCEtLSBydW50aW1lIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSBjb21waWxlCisgICAgICAgICAgICAgICB0aW1lIGRlcGVuZGVuY2llcyAtLT4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1JlcGxhY2VSZWdFeHBUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InNvbWUucmVnZXhwLnN1cHBvcnQiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNSZWdleHBUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InNvbWUucmVnZXhwLnN1cHBvcnQiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS90eXBlcy9tYXBwZXJzL1JlZ2V4cFBhdHRlcm5NYXBwZXJUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InNvbWUucmVnZXhwLnN1cHBvcnQiLz4KKworICAgICAgICAgIDwhLS0gbmVlZHMgQlNGIHRvIHdvcmsgLS0+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9SaGlubyouamF2YSIKKyAgICAgICAgICAgIHVubGVzcz0iYnNmLnByZXNlbnQiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1JoaW5vKi5qYXZhIgorICAgICAgICAgICAgdW5sZXNzPSJyaGluby5wcmVzZW50Ii8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9zY3JpcHQvKi5qYXZhIgorICAgICAgICAgICAgdW5sZXNzPSJic2YucHJlc2VudCIvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc2NyaXB0LyouamF2YSIKKyAgICAgICAgICAgIHVubGVzcz0icmhpbm8ucHJlc2VudCIvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vQmVhblNoZWxsU2NyaXB0VGVzdC5qYXZhIgorICAgICAgICAgICAgdW5sZXNzPSJic2YucHJlc2VudCIvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vQmVhblNoZWxsU2NyaXB0VGVzdC5qYXZhIgorICAgICAgICAgICAgdW5sZXNzPSJiZWFuc2hlbGwucHJlc2VudCIvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwudHlwZS5wYWNrYWdlfS9TY3JpcHQqLmphdmEiCisgICAgICAgICAgICB1bmxlc3M9ImJzZi5wcmVzZW50Ii8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC50eXBlLnBhY2thZ2V9L1NjcmlwdCouamF2YSIKKyAgICAgICAgICAgIHVubGVzcz0icmhpbm8ucHJlc2VudCIvPgorCisgICAgICAgICAgPCEtLSBmYWlsIGlmIHRlc3RjYXNlcyBjYW4gYmUgbG9hZGVkIGZyb20gdGhlIHN5c3RlbSBjbGFzc2xvYWRlciAtLT4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS9BbnRDbGFzc0xvYWRlckRlbGVnYXRpb25UZXN0LmphdmEiCisgICAgICAgICAgICBpZj0idGVzdHMuYXJlLm9uLnN5c3RlbS5jbGFzc3BhdGgiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2p1bml0L0pVbml0Q2xhc3NMb2FkZXJUZXN0LmphdmEiCisgICAgICAgICAgICBpZj0idGVzdHMuYXJlLm9uLnN5c3RlbS5jbGFzc3BhdGgiLz4KKworICAgICAgICAgIDwhLS0gdGhlc2UgdGVzdHMgbmVlZCB0byBiZSBsb2NhbGlzZWQgYmVmb3JlIGJlaW5nIHJhbj8/Pz8gLS0+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9QdmNzVGVzdC5qYXZhIi8+CisKKyAgICAgICAgICA8IS0tIFRoZXNlIHRlc3RzIG5lZWQgYSBUcmFYIGltcGxlbWVudGF0aW9uIGxpa2UgeGFsYW4yIG9yIHNheG9uIC0tPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vVHJhWExpYWlzb25UZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InRyYXguaW1wbC5wcmVzZW50Ii8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9Yc2x0VGVzdC5qYXZhIgorICAgICAgICAgICAgdW5sZXNzPSJ0cmF4LmltcGwucHJlc2VudCIvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7YW50LnBhY2thZ2V9L3R5cGVzL1hNTENhdGFsb2dCdWlsZEZpbGVUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InRyYXguaW1wbC5wcmVzZW50Ii8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9qdW5pdC9KVW5pdFJlcG9ydFRlc3QuamF2YSIKKyAgICAgICAgICAgIHVubGVzcz0icnVuLmp1bml0cmVwb3J0Ii8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHt0YXNrZGVmcy5wYWNrYWdlfS9TdHlsZVRlc3QuamF2YSIKKyAgICAgICAgICAgIHVubGVzcz0idHJheC5pbXBsLnByZXNlbnQiLz4KKworICAgICAgICAgIDwhLS0gbmVlZHMgeGVyY2VzIHRvIHdvcmsgLS0+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHthbnQucGFja2FnZX0vSW5jbHVkZVRlc3QuamF2YSIKKyAgICAgICAgICAgIHVubGVzcz0ieGVyY2VzMS5wcmVzZW50Ii8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHt0eXBlLnBhY2thZ2V9L3NlbGVjdG9ycy9Nb2RpZmllZFNlbGVjdG9yVGVzdC5qYXZhIgorICAgICAgICAgICAgdW5sZXNzPSJ4ZXJjZXMxLnByZXNlbnQiLz4KKworICAgICAgICAgIDwhLS0gbmVlZHMgcmVzb2x2ZXIuamFyIHRvIHdvcmsgLS0+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9YbWxWYWxpZGF0ZUNhdGFsb2dUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9ImFwYWNoZS5yZXNvbHZlci5wcmVzZW50Ii8+CisKKyAgICAgICAgICA8IS0tIG5lZWRzIGphc3BlcmMgLS0+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9Kc3BjVGVzdC5qYXZhIgorICAgICAgICAgICAgdW5sZXNzPSJqYXNwZXIucHJlc2VudCIvPgorCisgICAgICAgICAgPCEtLSBtaXNjIG9uZW9mZiB0ZXN0cyAtLT4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1dzZGxUb0RvdG5ldFRlc3QuamF2YSIKKyAgICAgICAgICAgIHVubGVzcz0iZG90bmV0YXBwcy5mb3VuZCIvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vRG90bmV0VGVzdC5qYXZhIgorICAgICAgICAgICAgdW5sZXNzPSJkb3RuZXRhcHBzLmZvdW5kIi8+CisKKyAgICAgICAgICA8IS0tICBUaGVzZSB0ZXN0cyBvbmx5IHBhc3NlcyBpZiB0ZXN0Y2FzZXMgYW5kIEFudCBjbGFzc2VzIGhhdmUKKyAgICAgICAgICBiZWVuIGxvYWRlZCBieSB0aGUgc2FtZSBjbGFzc2xvYWRlciAtIHdpbGwgdGhyb3cKKyAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9ucyBvdGhlcndpc2UuICAtLT4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke3Rhc2tkZWZzLnBhY2thZ2V9L1NRTEV4ZWNUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke3Rhc2tkZWZzLnBhY2thZ2V9L2N2c2xpYi9DaGFuZ2VMb2dXcml0ZXJUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke3Rhc2tkZWZzLnBhY2thZ2V9L2N2c2xpYi9DaGFuZ2VMb2dQYXJzZXJUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3Nvcy9TT1NUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3Zzcy9NU1ZTU1Rlc3QuamF2YSIKKyAgICAgICAgICAgIHVubGVzcz0idGVzdHMuYW5kLmFudC5zaGFyZS5jbGFzc2xvYWRlciIvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vVHJhWExpYWlzb25UZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke3Rhc2tkZWZzLnBhY2thZ2V9L1Byb2Nlc3NEZXN0cm95ZXJUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke3Rhc2tkZWZzLnBhY2thZ2V9L1Byb3RlY3RlZEphck1ldGhvZHNUZXN0LmphdmEiCisgICAgICAgICAgICB1bmxlc3M9InRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS9sYXVuY2gvTG9jYXRvclRlc3QuamF2YSIKKyAgICAgICAgICAgIHVubGVzcz0idGVzdHMuYW5kLmFudC5zaGFyZS5jbGFzc2xvYWRlciIvPgorCisgICAgICAgICAgPCEtLSBjYW4gb25seSBydW4gaWYgY3ZzIGlzIGluc3RhbGxlZCBvbiB5b3VyIG1hY2hpbmUKKyAgICAgICAgICAgICAgIGVuYWJsZSBieSBzZXR0aW5nIHRoZSBwcm9wZXJ0eSBoYXZlLmN2cworICAgICAgICAgIC0tPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7dGFza2RlZnMucGFja2FnZX0vQWJzdHJhY3RDdnNUYXNrVGVzdC5qYXZhIgorICAgICAgICAgICAgdW5sZXNzPSJoYXZlLmN2cyIvPgorCisgICAgICAgICAgPCEtLSBuZWVkcyBhIGxvY2FsIGZ0cCBzZXJ2ZXIgYW5kIHRoZSBlbnRyeSBvZiBhIHVzZXIvcGFzc3dvcmQgY29tYmluYXRpb24gLS0+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9uZXQvRlRQVGVzdC5qYXZhIi8+CisKKyAgICAgICAgICA8IS0tIHRlc3QgbmVlZHMgc3BlY2lhbCBzZXR1cCAtLT4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3NzaC9TY3BUZXN0LmphdmEiLz4KKworICAgICAgICAgIDwhLS0gdGVzdCBmYWlscyBpZiBidWlsZC9jbGFzc2VzIGFuZCBhbnQuamFyIGFyZSB1c2luZyB0aGUgc2FtZQorICAgICAgICAgICAgICAgY2xhc3Nsb2FkZXIgIC0tPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7YW50LnBhY2thZ2V9L3V0aWwvQ2xhc3NwYXRoVXRpbHNUZXN0LmphdmEiCisgICAgICAgICAgICBpZj0idGVzdHMuYW5kLmFudC5zaGFyZS5jbGFzc2xvYWRlciIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2JhdGNodGVzdD4KKyAgICA8L3Rlc3QtanVuaXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ianVuaXQtc2luZ2xlLXRlc3QiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMsanVuaXQtc2luZ2xlLXRlc3Qtb25seSIKKyAgICBkZXNjcmlwdGlvbj0iLS0+IHJ1bnMgdGhlIHNpbmdsZSB1bml0IHRlc3QgYXQgJCR7anVuaXQudGVzdGNhc2V9IiAvPgorCisgIDx0YXJnZXQgbmFtZT0ianVuaXQtc2luZ2xlLXRlc3Qtb25seSIgZGVwZW5kcz0idGVzdC1pbml0IiBpZj0ianVuaXQuc2luZ2xlIgorICAgIGRlc2NyaXB0aW9uPSItLT4gcnVucyB0aGUgc2luZ2xlIHVuaXQgdGVzdCBhdCAkJHtqdW5pdC50ZXN0Y2FzZX0gKG5vIGNvbXBpbGUpIj4KKyAgICA8dGVzdC1qdW5pdD4KKyAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIi8+CisgICAgICA8dGVzdCBuYW1lPSIke2p1bml0LnRlc3RjYXNlfSIgdG9kaXI9IiR7YnVpbGQuanVuaXQueG1sfSIvPgorICAgIDwvdGVzdC1qdW5pdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbnRlcmFjdGl2ZS10ZXN0cyIgZGVzY3JpcHRpb249Ii0tPiBydW5zIGludGVyYWN0aXZlIHRlc3RzIgorICAgIGRlcGVuZHM9ImNvbXBpbGUtdGVzdHMiCisgICAgaWY9ImpkazEuMysiPgorICAgIDxqYXZhIGNsYXNzcGF0aHJlZj0idGVzdHMtY2xhc3NwYXRoIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UZXN0UHJvY2VzcyIKKyAgICAgIGZvcms9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbnR1bml0LXRlc3RzIiBkZXBlbmRzPSJkdW1wLWluZm8sYnVpbGQsdGVzdC1pbml0IgorICAgICAgICAgIGlmPSJydW4uYW50dW5pdCIgZGVzY3JpcHRpb249Ii0tPiBydW4gdGhlIGFudHVuaXQgdGVzdHMiPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYW50dW5pdC5pbmNsdWRlcyIgdmFsdWU9IiR7YW50dW5pdC50ZXN0Y2FzZX0iCisgICAgICAgICAgICAgICBlbHNlPSIqKi90ZXN0LnhtbCwqKi8qLXRlc3QueG1sIj4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYW50dW5pdC50ZXN0Y2FzZSIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnR1bml0LmV4Y2x1ZGVzIiB2YWx1ZT0iIiAvPgorCisgICAgPG1rZGlyIGRpcj0iJHthbnR1bml0LnhtbH0iIC8+CisgICAgPGF1OmFudHVuaXQgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0IgorICAgICAgICAgICAgICAgIGZhaWxvbmVycm9yPSJmYWxzZSIgZXJyb3Jwcm9wZXJ0eT0iYW50dW5pdC5mYWlsZWQiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5hbnR1bml0fSIgaW5jbHVkZXM9IiR7YW50dW5pdC5pbmNsdWRlc30iCisgICAgICAgICAgICAgICBleGNsdWRlcz0iJHthbnR1bml0LmV4Y2x1ZGVzfSIgLz4KKyAgICAgIDxhdTpwbGFpbmxpc3RlbmVyIC8+CisgICAgICA8YXU6eG1sbGlzdGVuZXIgdG9kaXI9IiR7YW50dW5pdC54bWx9IiAvPgorICAgIDwvYXU6YW50dW5pdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbnR1bml0LXJlcG9ydCIgZGVwZW5kcz0iYW50dW5pdC10ZXN0cyxhbnR1bml0LXJlcG9ydC1vbmx5IiAvPgorCisgIDx0YXJnZXQgbmFtZT0iYW50dW5pdC1yZXBvcnQtb25seSIgZGVwZW5kcz0idGVzdC1pbml0IiBpZj0icnVuLmFudHVuaXQucmVwb3J0Ij4KKyAgICA8bGVuZ3RoPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2FudHVuaXQueG1sfSIgaW5jbHVkZXM9IlRFU1QtKi54bWwiIC8+CisgICAgPC9sZW5ndGg+CisgICAgPG1rZGlyIGRpcj0iJHthbnR1bml0LnJlcG9ydHN9IiAvPgorICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHthbnR1bml0LnJlcG9ydHN9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHthbnR1bml0LnhtbH0iIGluY2x1ZGVzPSJURVNULSoueG1sIiAvPgorICAgICAgPHJlcG9ydCBzdHlsZWRpcj0iJHtzcmMuYW50dW5pdH0iIGZvcm1hdD0iZnJhbWVzIgorICAgICAgICAgICAgICB0b2Rpcj0iJHthbnR1bml0LnJlcG9ydHN9Ii8+CisgICAgPC9qdW5pdHJlcG9ydD4KKyAgICA8bGVuZ3RoPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2FudHVuaXQueG1sfSIgaW5jbHVkZXM9IlRFU1QtKi54bWwiIC8+CisgICAgPC9sZW5ndGg+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBNYWluIHRhcmdldCAtIHJ1bnMgZGlzdC1saXRlIGJ5IGRlZmF1bHQKKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0tPgorICA8dGFyZ2V0IG5hbWU9Im1haW4iCisgICAgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIGEgbWluaW11bSBkaXN0cmlidXRpb24gaW4gLi9kaXN0IgorICAgIGRlcGVuZHM9ImRpc3QtbGl0ZSIvPgorCisKKyAgPCEtLQorICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgIE1TSSB0YXJnZXQgLSBjcmVhdGVzIGFuIE1TSSBpbnN0YWxsZXIgZmlsZSB3aXRoIHRoZSBoZWxwIG9mCisgICAgICAgICAgICAgICAgICAgICAgdGhlIFdpWCB0b29sc2V0IGFuZCB0aGUgZG90bmV0IEFudGxpYi4KKyAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0tPgorICA8dGFyZ2V0IG5hbWU9Im1zaSIKKyAgICBkZXNjcmlwdGlvbj0iLS0+IGNyZWF0ZXMgYW4gTVNJIGZpbGUgZm9yIEFudCwgcmVxdWlyZXMgV2lYIGFuZCB0aGUgZG90bmV0IEFudGxpYiIKKyAgICBkZXBlbmRzPSJpbnRlcm5hbF9kaXN0IgorICAgIHhtbG5zOmRuPSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuZG90bmV0Ij4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJtc2kuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9Im1zaS5uYW1lIiB2YWx1ZT0iJHtuYW1lfS0ke3Byb2plY3QudmVyc2lvbn0ubXNpIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Im1zaS5maWxlIiB2YWx1ZT0iJHttc2kuZGlyfS8ke21zaS5uYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aXguaG9tZSIgdmFsdWU9IiR7dXNlci5ob21lfS93aXgiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0id2l4b2JqLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS93aXgiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRpci5yZXNvbHZlZCIgbG9jYXRpb249IiR7ZGlzdC5kaXJ9Ii8+CisKKyAgICA8bWtkaXIgZGlyPSIke3dpeG9iai5kaXJ9Ii8+CisKKyAgICA8ZG46d2l4IHRhcmdldD0iJHttc2kuZmlsZX0iCisgICAgICBtb2RlPSJib3RoIiB3aXhIb21lPSIke3dpeC5ob21lfSIgd2l4b2JqRGVzdERpcj0iJHt3aXhvYmouZGlyfSI+CisgICAgICA8c291cmNlcyBkaXI9IiR7ZXRjLmRpcn0iIGluY2x1ZGVzPSIqLnd4cyIvPgorICAgICAgPG1vcmVzb3VyY2VzIGRpcj0iJHtkaXN0LmRpcn0iLz4KKworICAgICAgPGNhbmRsZVBhcmFtZXRlciBuYW1lPSJkaXN0LmRpciIgdmFsdWU9IiR7ZGlzdC5kaXIucmVzb2x2ZWR9Ii8+CisgICAgICA8Y2FuZGxlUGFyYW1ldGVyIG5hbWU9InZlcnNpb24iIHZhbHVlPSIke21hbmlmZXN0LXZlcnNpb259Ii8+CisgICAgPC9kbjp3aXg+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVjay54bWwgYi90cnVuay9jaGVjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjdmZjlmMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2NoZWNrLnhtbApAQCAtMCwwICsxLDEyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJjaGVja3N0eWxlIiBuYW1lPSJDaGVja0FudCI+CisKKyAgPGRlc2NyaXB0aW9uPgorICAgIENoZWNrIEFudHMgY29kZWJhc2UgYWdhaW5zdCBjZXJ0YWluIGNvZGUgc3R5bGVndWlkZSBydWxlcyB1c2luZworICAgIGNoZWNrc3R5bGUgYW5kIHNpbWlhbi4KKworICAgIENoZWNrc3R5bGUgdXNlcyBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSAoQVNUKSBmb3IgZG9pbmcgY2hlY2tzCisgICAgYWdhaW5zdCBqYXZhIHNvdXJjZXMuIEl0IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vY2hlY2tzdHlsZS5zb3VyY2Vmb3JnZS5uZXQvCisgICAgdW5kZXIgR1BMIDIuMSBsaWNlbnNlLgorCisgICAgIlNpbWlhbiAoU2ltaWxhcml0eSBBbmFseXNlcikgaWRlbnRpZmllcyBkdXBsaWNhdGlvbiBpbiBKYXZhLCBDIywgQywKKyAgICBDUFAsIENPQk9MLCBKU1AsIEhUTUwgc291cmNlIGNvZGUgYW5kIGV2ZW4gcGxhaW4gdGV4dCBmaWxlcy4iCisgICAgSXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cucmVkaGlsbGNvbnN1bHRpbmcuY29tLmF1L3Byb2R1Y3RzL3NpbWlhbi8KKyAgICBhbmQgaXMgZm9yIGZyZWUgdXNlIGluIG9wZW4gc291cmNlIHByb2plY3RzLgorCisgICAgU2VlIGV4dGVybmFsIHRhc2sgcGFnZSBhbmQgaG9tZXBhZ2VzIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxpbXBvcnQgZmlsZT0iYnVpbGQueG1sIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb25maWcuZGlyIiBsb2NhdGlvbj0iJHtldGMuZGlyfS9jaGVja3N0eWxlIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImNoZWNrc3R5bGUucmVwb3J0ZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3JlcG9ydHMvY2hlY2tzdHlsZSIvPgorICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdHlsZS5yYXciIGxvY2F0aW9uPSIke2NoZWNrc3R5bGUucmVwb3J0ZGlyfS9yYXcueG1sIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZXNoZWV0Lmh0bWwiIGxvY2F0aW9uPSIke2NvbmZpZy5kaXJ9L2NoZWNrc3R5bGUtZnJhbWVzLnhzbCIvPgorICA8cHJvcGVydHkgbmFtZT0ic3R5bGVzaGVldC50ZXh0IiBsb2NhdGlvbj0iJHtjb25maWcuZGlyfS9jaGVja3N0eWxlLXRleHQueHNsIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZXNoZWV0Lnhkb2MiIGxvY2F0aW9uPSIke2NvbmZpZy5kaXJ9L2NoZWNrc3R5bGUteGRvYy54c2wiLz4KKworICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdHlsZS5iYXNlZGlyIiBsb2NhdGlvbj0iJHtqYXZhLmRpcn0iLz4KKworICA8IS0tIEFudCBDaGVja3N0eWxlIHJlcG9ydCAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InRvY2hlY2siIHZhbHVlPSIqKi8qLmphdmEiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2Muc2NvcGUiIHZhbHVlPSJwdWJsaWMiLz4KKworICA8dGFza2RlZiByZXNvdXJjZT0ic2ltaWFudGFzay5wcm9wZXJ0aWVzIi8+CisgIDx0YXNrZGVmIHJlc291cmNlPSJjaGVja3N0eWxldGFzay5wcm9wZXJ0aWVzIi8+CisKKyAgPHRhcmdldCBuYW1lPSJjaGVja3N0eWxlIiBkZXNjcmlwdGlvbj0iLS0+IGNoZWNrcyBBbnQgY29kZWJhc2UgYWNjb3JkaW5nIHRvICR7Y29uZmlnLmRpcn0vY2hlY2tzdHlsZS1jb25maWciPgorICAgIDxta2RpciBkaXI9IiR7Y2hlY2tzdHlsZS5yZXBvcnRkaXJ9Ii8+CisgICAgPGNoZWNrc3R5bGUgY29uZmlnPSIke2NvbmZpZy5kaXJ9L2NoZWNrc3R5bGUtY29uZmlnIiBmYWlsT25WaW9sYXRpb249ImZhbHNlIj4KKyAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIiB0b0ZpbGU9IiR7Y2hlY2tzdHlsZS5yYXd9Ii8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YS5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHt0b2NoZWNrfSIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9iemlwMi8qLmphdmEiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovQ1ZTUGFzcy5qYXZhIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jaGVja3N0eWxlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imh0bWxyZXBvcnQiIGRlc2NyaXB0aW9uPSItLT4gZ2VuZXJhdGVzIGEgaHRtbCBjaGVja3N0eWxlIHJlcG9ydCI+CisgICAgPG1rZGlyIGRpcj0iJHtjaGVja3N0eWxlLnJlcG9ydGRpcn0iLz4KKyAgICA8eHNsdCBpbj0iJHtjaGVja3N0eWxlLnJhd30iIHN0eWxlPSIke3N0eWxlc2hlZXQuaHRtbH0iCisgICAgICAgICAgIG91dD0iJHtjaGVja3N0eWxlLnJlcG9ydGRpcn0vaHRtbC9vdXRwdXQudHh0Ij4KKyAgICAgIDxwYXJhbSBuYW1lPSJiYXNlZGlyIiBleHByZXNzaW9uPSIke2NoZWNrc3R5bGUuYmFzZWRpcn0iLz4KKyAgICA8L3hzbHQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGV4dHJlcG9ydCIgZGVzY3JpcHRpb249Ii0tPiBnZW5lcmF0ZXMgYSB0ZXh0IGNoZWNrc3R5bGUgcmVwb3J0Ij4KKyAgICA8eHNsdCBpbj0iJHtjaGVja3N0eWxlLnJhd30iIHN0eWxlPSIke3N0eWxlc2hlZXQudGV4dH0iCisgICAgICAgICAgIG91dD0iJHtjaGVja3N0eWxlLnJlcG9ydGRpcn0vcmVwb3J0LnR4dCI+CisgICAgPC94c2x0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRleHRyZXBvcnQtZGlzcGxheSIgZGVwZW5kcz0idGV4dHJlcG9ydCIgZGVzY3JpcHRpb249Ii0tPiBnZW5lcmF0ZXMgYSB0ZXh0IGNoZWNrc3R5bGUgcmVwb3J0IGFuZCBkaXNwbGF5cyBpdCBpbW1lZGlhdGVseSI+CisgICAgICA8bG9hZGZpbGUgcHJvcGVydHk9InJlcG9ydCIgc3JjZmlsZT0iJHtjaGVja3N0eWxlLnJlcG9ydGRpcn0vcmVwb3J0LnR4dCIvPgorICAgICAgPGVjaG8+JHtyZXBvcnR9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Inhkb2NyZXBvcnQiIGRlc2NyaXB0aW9uPSItLT4gZ2VuZXJhdGVzIGEgeGRvYyBjaGVja3N0eWxlIHJlcG9ydCI+CisgICAgPHhzbHQgaW49IiR7Y2hlY2tzdHlsZS5yYXd9IiBzdHlsZT0iJHtzdHlsZXNoZWV0Lnhkb2N9IgorICAgICAgICAgICBvdXQ9IiR7Y2hlY2tzdHlsZS5yZXBvcnRkaXJ9L3hkb2NzL2luZGV4LnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0iYmFzZWRpciIgZXhwcmVzc2lvbj0iJHtjaGVja3N0eWxlLmJhc2VkaXJ9Ii8+CisgICAgPC94c2x0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImR1bXBodG1sIiBkZXBlbmRzPSJjaGVja3N0eWxlLCBodG1scmVwb3J0IiBkZXNjcmlwdGlvbj0iLS0+IHJ1bnMgdGhlIGNoZWNrc3R5bGUgYW5kIGdlbmVyYXRlcyBhIGh0bWwgcmVwb3J0Ii8+CisgIDx0YXJnZXQgbmFtZT0iZHVtcHRleHQiIGRlcGVuZHM9ImNoZWNrc3R5bGUsIHRleHRyZXBvcnQiIGRlc2NyaXB0aW9uPSItLT4gcnVucyB0aGUgY2hlY2tzdHlsZSBhbmQgZGlzcGxheXMgcmVzdWx0IGFzIHRleHQiPgorICAgIDxjb25jYXQ+CisgICAgICA8ZmlsZWxpc3QgZGlyPSIke2NoZWNrc3R5bGUucmVwb3J0ZGlyfSIgZmlsZXM9InJlcG9ydC50eHQiLz4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzaW1pYW5jaGVjayIgZGVzY3JpcHRpb249Ii0tPiBydW5zIHRoZSBjaGVjayBmb3IgZHVwbGljYXRlcyI+CisgICAgPHNpbWlhbj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEuZGlyfSIgLz4KKyAgICA8L3NpbWlhbj4KKyAgPC90YXJnZXQ+CisJCisgIDx0YXJnZXQgbmFtZT0iZml4VFMiIGRlc2NyaXB0aW9uPSItLT4gZml4IGNoZWNrc3R5bGUgZXJyb3JzICdMaW5lIGhhcyB0cmFpbGluZyBzcGFjZXMnIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSJEZWZpbmUgcGF0aCB0byBqYXZhIGZpbGUgJ3BhdGgnIj4KKyAgICAgIDxjb25kaXRpb24+PG5vdD48aXNzZXQgcHJvcGVydHk9InBhdGgiLz48L25vdD48L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgICAgPHJlcGxhY2VyZWdleHAgbWF0Y2g9IlxzKyQiIHJlcGxhY2U9IiIgZmxhZ3M9ImciIGJ5bGluZT0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy9tYWluIiBpbmNsdWRlcz0iJHtwYXRofSIvPgorICAgIDwvcmVwbGFjZXJlZ2V4cD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmaXhUYWIiIGRlc2NyaXB0aW9uPSItLT4gZml4IGNoZWNrc3R5bGUgZXJyb3JzICdMaW5lIGNvbnRhaW5zIFRBQiBzaWduJyI+CisgICAgPGZhaWwgbWVzc2FnZT0iRGVmaW5lIHBhdGggdG8gamF2YSBmaWxlICdwYXRoJyI+CisgICAgICA8Y29uZGl0aW9uPjxub3Q+PGlzc2V0IHByb3BlcnR5PSJwYXRoIi8+PC9ub3Q+PC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICAJPGZpeGNybGYgc3JjZGlyPSJzcmMvbWFpbiIgaW5jbHVkZXM9IiR7cGF0aH0iIGphdmFmaWxlcz0ieWVzIiB0YWI9InJlbW92ZSIgdGFibGVuZ3RoPSI0Ii8+CisgIDwvdGFyZ2V0PgkKKwkKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jb250cmlidXRvcnMueG1sIGIvdHJ1bmsvY29udHJpYnV0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU5ZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvY29udHJpYnV0b3JzLnhtbApAQCAtMCwwICsxLDExNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgY29udHJpYnV0b3JzCitbCis8IUVMRU1FTlQgbmFtZSAoZmlyc3Q/LCBtaWRkbGU/LCBsYXN0KT4KKzwhRUxFTUVOVCBjb250cmlidXRvcnMgKGludHJvZHVjdGlvbiwgbmFtZSspPgorPCFFTEVNRU5UIGZpcnN0ICgjUENEQVRBKT4KKzwhRUxFTUVOVCBpbnRyb2R1Y3Rpb24gKCNQQ0RBVEEpPgorPCFFTEVNRU5UIG1pZGRsZSAoI1BDREFUQSk+Cis8IUVMRU1FTlQgbGFzdCAoI1BDREFUQSk+CitdCis+CisKKzxjb250cmlidXRvcnM+CisgIDxpbnRyb2R1Y3Rpb24+CisgIFRoZXNlIGFyZSBzb21lIG9mIHRoZSBtYW55IHBlb3BsZSB3aG8gaGF2ZSBoZWxwZWQgQW50IGJlY29tZSBzbyBzdWNjZXNzZnVsLgorICA8L2ludHJvZHVjdGlvbj4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkFsZWtzYW5kcjwvZmlyc3Q+CisgICAgPGxhc3Q+SXNodXRpbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QWxleGV5PC9maXJzdD4KKyAgICA8bGFzdD5QYW5jaGVua288L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkFsZXhleTwvZmlyc3Q+CisgICAgPGxhc3Q+U29sb2ZuZW5rbzwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QW5kcmVhczwvZmlyc3Q+CisgICAgPGxhc3Q+QW1lczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QW5kcmV3PC9maXJzdD4KKyAgICA8bGFzdD5FdmVyaXR0PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5BbmRyZXk8L2ZpcnN0PgorICAgIDxsYXN0PlVyYXpvdjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QW5keTwvZmlyc3Q+CisgICAgPGxhc3Q+V29vZDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QW5pbDwvZmlyc3Q+CisgICAgPG1pZGRsZT5LLjwvbWlkZGxlPgorICAgIDxsYXN0PlZpamVuZHJhbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QW5saTwvZmlyc3Q+CisgICAgPGxhc3Q+U2h1bmRpPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5BbnRob255PC9maXJzdD4KKyAgICA8bGFzdD5HcmVlbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QW50b2luZTwvZmlyc3Q+CisgICAgPGxhc3Q+QmF1ZG91eDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QW50b2luZTwvZmlyc3Q+CisgICAgPGxhc3Q+TGV2eS1MYW1iZXJ0PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5BbnRvbjwvZmlyc3Q+CisgICAgPGxhc3Q+TWF6a292b2k8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkFybmF1ZDwvZmlyc3Q+CisgICAgPGxhc3Q+VmFuZHljazwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QXJub3V0PC9maXJzdD4KKyAgICA8bWlkZGxlPkouPC9taWRkbGU+CisgICAgPGxhc3Q+S3VpcGVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Bc2xhazwvZmlyc3Q+CisgICAgPGxhc3Q+SGVsbGVzJiMyNDQ7eTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QXRzdWhpa288L2ZpcnN0PgorICAgIDxsYXN0PllhbWFuYWthPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5BdmlrPC9maXJzdD4KKyAgICA8bGFzdD5TZW5ndXB0YTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QmFsYXpzPC9maXJzdD4KKyAgICA8bGFzdD5GZWplcyAyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5CZW5qYW1pbjwvZmlyc3Q+CisgICAgPGxhc3Q+QnVyZ2VzczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QmVuPC9maXJzdD4KKyAgICA8bGFzdD5HYWxicmFpdGg8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkJlbm9pdDwvZmlyc3Q+CisgICAgPGxhc3Q+TW91c3NhdWQ8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkJlcm5kPC9maXJzdD4KKyAgICA8bGFzdD5EdXRrb3dza2k8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkJyYWQ8L2ZpcnN0PgorICAgIDxsYXN0PkNsYXJrPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5CcmFudDwvZmlyc3Q+CisgICAgPG1pZGRsZT5MYW5nZXI8L21pZGRsZT4KKyAgICA8bGFzdD5HdXJnYW51czwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QnJpYW48L2ZpcnN0PgorICAgIDxsYXN0PkRlaXR0ZTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QnJpYW48L2ZpcnN0PgorICAgIDxsYXN0PkZlbGRlcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+QnJ1Y2U8L2ZpcnN0PgorICAgIDxsYXN0PkF0aGVydG9uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5DaGFybGVzPC9maXJzdD4KKyAgICA8bGFzdD5IdWRhazwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Q2hhcmxpZTwvZmlyc3Q+CisgICAgPGxhc3Q+SHViYmFyZDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Q2hyaXM8L2ZpcnN0PgorICAgIDxsYXN0PlBvdmlyazwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Q2hyaXN0aWFuPC9maXJzdD4KKyAgICA8bGFzdD5Lbm9ycjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Q2hyaXN0b3BoPC9maXJzdD4KKyAgICA8bGFzdD5XaWxoZWxtczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Q2hyaXN0b3BoZTwvZmlyc3Q+CisgICAgPGxhc3Q+TGFib3Vpc3NlPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5DaHJpc3RvcGhlcjwvZmlyc3Q+CisgICAgPG1pZGRsZT5BLjwvbWlkZGxlPgorICAgIDxsYXN0PkxvbmdvPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5DaHJpc3RvcGhlcjwvZmlyc3Q+CisgICAgPGxhc3Q+Q2hhcmxpZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkNvbm9yPC9maXJzdD4KKyAgICA8bGFzdD5NYWNOZWlsbDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Q3JhZWc8L2ZpcnN0PgorICAgIDxsYXN0PlN0cm9uZzwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Q3JhaWc8L2ZpcnN0PgorICAgIDxsYXN0PkNvdHRpbmdoYW08L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkNyYWlnPC9maXJzdD4KKyAgICA8bWlkZGxlPlIuPC9taWRkbGU+CisgICAgPGxhc3Q+TWNDbGFuYWhhbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Q3JhaWc8L2ZpcnN0PgorICAgIDxsYXN0PlJ5YW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkN1cnRpczwvZmlyc3Q+CisgICAgPGxhc3Q+V2hpdGU8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkN5cmlsbGU8L2ZpcnN0PgorICAgIDxsYXN0Pk1vcnZhbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RCdBcmN5PC9maXJzdD4KKyAgICA8bGFzdD5TbWl0aDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RGFsZTwvZmlyc3Q+CisgICAgPGxhc3Q+QW5zb248L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRhbjwvZmlyc3Q+CisgICAgPGxhc3Q+QXJtYnJ1c3Q8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRhbmllbDwvZmlyc3Q+CisgICAgPGxhc3Q+UmliYWduYWM8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRhbmllbDwvZmlyc3Q+CisgICAgPGxhc3Q+U3BpbGtlcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RGFubm88L2ZpcnN0PgorICAgIDxsYXN0PkZlcnJpbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RGF2YW51bTwvZmlyc3Q+CisgICAgPGxhc3Q+U3Jpbml2YXM8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRhdmU8L2ZpcnN0PgorICAgIDxsYXN0PkJyb25kc2VtYTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RGF2ZTwvZmlyc3Q+CisgICAgPGxhc3Q+QnJvc2l1czwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RGF2aWQ8L2ZpcnN0PgorICAgIDxsYXN0PkEuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5EYXZpZDwvZmlyc3Q+CisgICAgPGxhc3Q+Q3Jvc3NsZXk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRhdmlkPC9maXJzdD4KKyAgICA8bGFzdD5HJiMyMjg7cnRuZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRhdmlkPC9maXJzdD4KKyAgICA8bGFzdD5LYXZhbmFnaDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RGF2aWQ8L2ZpcnN0PgorICAgIDxsYXN0Pk1hY2xlYW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRhdmlkPC9maXJzdD4KKyAgICA8bGFzdD5SZWVzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5EZW5pczwvZmlyc3Q+CisgICAgPGxhc3Q+SGVubmVzc3k8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRlcmVrPC9maXJzdD4KKyAgICA8bGFzdD5TbGFnZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRpYW5lPC9maXJzdD4KKyAgICA8bGFzdD5Ib2x0PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5kSW9uPC9maXJzdD4KKyAgICA8bGFzdD5HaWxsYXJkPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Eb21pbmlxdWU8L2ZpcnN0PgorICAgIDxsYXN0PkRldmllbm5lPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Eb25hbDwvZmlyc3Q+CisgICAgPGxhc3Q+UXVpbmxhbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RG9uPC9maXJzdD4KKyAgICA8bGFzdD5CbmFtZW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRvbjwvZmlyc3Q+CisgICAgPGxhc3Q+RmVyZ3Vzb248L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkRvbjwvZmlyc3Q+CisgICAgPGxhc3Q+SmVmZmVyeTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RHJldzwvZmlyc3Q+CisgICAgPGxhc3Q+U3VkZWxsPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5FZHdpbjwvZmlyc3Q+CisgICAgPGxhc3Q+V291ZHQ8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkVsaTwvZmlyc3Q+CisgICAgPGxhc3Q+VHVja2VyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5FbW1hbnVlbDwvZmlyc3Q+CisgICAgPGxhc3Q+Qm91cmc8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkVyaWM8L2ZpcnN0PgorICAgIDxsYXN0Pk9sc2VuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5FcmljPC9maXJzdD4KKyAgICA8bGFzdD5QdWdoPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5FcmlrPC9maXJzdD4KKyAgICA8bGFzdD5IYXRjaGVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5FcmlrPC9maXJzdD4KKyAgICA8bGFzdD5MYW5nZW5iYWNoPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5FcmlrPC9maXJzdD4KKyAgICA8bGFzdD5NZWFkZTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+RXJuc3Q8L2ZpcnN0PgorICAgIDxsYXN0PmRlIEhhYW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkZyYW5rPC9maXJzdD4KKyAgICA8bGFzdD5IYXJuYWNrPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5GcmFuazwvZmlyc3Q+CisgICAgPGxhc3Q+U29tZXJzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5GcmFuazwvZmlyc3Q+CisgICAgPGxhc3Q+WmV5ZGE8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkZyw6lkw6lyaWM8L2ZpcnN0PgorICAgIDxsYXN0PkJvdGhhbXk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkZyZWRlcmljPC9maXJzdD4KKyAgICA8bGFzdD5MYXZpZ25lPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5HYXJ5PC9maXJzdD4KKyAgICA8bWlkZGxlPlMuPC9taWRkbGU+CisgICAgPGxhc3Q+V2VhdmVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5HYXV0YW08L2ZpcnN0PgorICAgIDxsYXN0Pkd1bGlhbmk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pkdlcm88L2ZpcnN0PgorICAgIDxsYXN0PlZlcm1hYXM8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkdlcnJpdDwvZmlyc3Q+CisgICAgPGxhc3Q+Umllc3NlbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+R2xlbm48L2ZpcnN0PgorICAgIDxsYXN0Pk1jQWxsaXN0ZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkdsZW5uPC9maXJzdD4KKyAgICA8bGFzdD5Ud2lnZ3M8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkdyZWc8L2ZpcnN0PgorICAgIDxsYXN0Pk5lbHNvbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SGFyaXNoPC9maXJzdD4KKyAgICA8bGFzdD5QcmFiYW5kaGFtPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5IYXJvb248L2ZpcnN0PgorICAgIDxsYXN0PlJhZmlxdWU8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pkhpcm9ha2k8L2ZpcnN0PgorICAgIDxsYXN0Pk5ha2FtdXJhPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Ib2xnZXI8L2ZpcnN0PgorICAgIDxsYXN0PkVuZ2VsczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SWduYWNpbzwvZmlyc3Q+CisgICAgPGxhc3Q+Q29sb21hPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Jbmdlbm9uc3lhPC9maXJzdD4KKyAgICA8bGFzdD5GcmFuY2U8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkluZ21hcjwvZmlyc3Q+CisgICAgPGxhc3Q+U3RlaW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PklyZW5lPC9maXJzdD4KKyAgICA8bGFzdD5SdXNtYW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pkl2YW48L2ZpcnN0PgorICAgIDxsYXN0Pkl2YW5vdjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmFjazwvZmlyc3Q+CisgICAgPG1pZGRsZT5KLjwvbWlkZGxlPgorICAgIDxsYXN0PldvZWhyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5KYW1lczwvZmlyc3Q+CisgICAgPG1pZGRsZT5EdW5jYW48L21pZGRsZT4KKyAgICA8bGFzdD5EYXZpZHNvbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmFuPC9maXJzdD4KKyAgICA8bGFzdD5NYXQmIzIzMjtybmU8L2xhc3Q+CisgIDwvbmFtZT4KKyAgICA8bmFtZT4KKyAgICAgIDxmaXJzdD5KYW48L2ZpcnN0PgorICAgICAgPGxhc3Q+Q3VtcHM8L2xhc3Q+CisgICAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmFuPC9maXJzdD4KKyAgICA8bGFzdD5NeW5hcmlrPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5KYXNvbjwvZmlyc3Q+CisgICAgPGxhc3Q+SHVudGVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5KYXNvbjwvZmlyc3Q+CisgICAgPGxhc3Q+UGV0dGlzczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmFzb248L2ZpcnN0PgorICAgIDxsYXN0PlNhbHRlcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmFzb248L2ZpcnN0PgorICAgIDxsYXN0PllpcDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmF5PC9maXJzdD4KKyAgICA8bWlkZGxlPkRpY2tvbjwvbWlkZGxlPgorICAgIDxsYXN0PkdsYW52aWxsZTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmF5PC9maXJzdD4KKyAgICA8bGFzdD5QZWNrPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5KYXk8L2ZpcnN0PgorICAgIDxsYXN0PnZhbiBkZXIgTWVlcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SkM8L2ZpcnN0PgorICAgIDxsYXN0Pk1hbm48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pko8L2ZpcnN0PgorICAgIDxsYXN0PkQ8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkplYW4tRnJhbmNvaXM8L2ZpcnN0PgorICAgIDxsYXN0PkJyb3Vzc2VhdTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmVmZjwvZmlyc3Q+CisgICAgPGxhc3Q+R2V0dGxlPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5KZWZmPC9maXJzdD4KKyAgICA8bGFzdD5NYXJ0aW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkplZmY8L2ZpcnN0PgorICAgIDxsYXN0PlR1bGxleTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmVmZjwvZmlyc3Q+CisgICAgPGxhc3Q+VHVybmVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5KZW5lPC9maXJzdD4KKyAgICA8bGFzdD5KYXNwZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkplcmVteTwvZmlyc3Q+CisgICAgPGxhc3Q+TWF3c29uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5KZXJvbWU8L2ZpcnN0PgorICAgIDxsYXN0PkxhY29zdGU8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pkplc3NlPC9maXJzdD4KKyAgICA8bGFzdD5HbGljazwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmVzc2U8L2ZpcnN0PgorICAgIDxsYXN0PlN0b2NrYWxsPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5KaW08L2ZpcnN0PgorICAgIDxsYXN0PkFsbGVyczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Sm9lcmc8L2ZpcnN0PgorICAgIDxsYXN0Pldhc3NtZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkpvbjwvZmlyc3Q+CisgICAgPGxhc3Q+RGlja2luc29uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Kb248L2ZpcnN0PgorICAgIDxtaWRkbGU+Uy48L21pZGRsZT4KKyAgICA8bGFzdD5TdGV2ZW5zPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Kb3NlPC9maXJzdD4KKyAgICA8bWlkZGxlPkFsYmVydG88L21pZGRsZT4KKyAgICA8bGFzdD5GZXJuYW5kZXo8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pkpvc2g8L2ZpcnN0PgorICAgIDxsYXN0Pkx1Y2FzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Kb3NlcGg8L2ZpcnN0PgorICAgIDxsYXN0PldhbHRvbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SnVlcmc8L2ZpcnN0PgorICAgIDxsYXN0Pldhbm5lcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+SnVsaWFuPC9maXJzdD4KKyAgICA8bGFzdD5TaW1wc29uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5KdXN0aW48L2ZpcnN0PgorICAgIDxsYXN0PlZhbGxvbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+S2Vpcm9uPC9maXJzdD4KKyAgICA8bGFzdD5MaWRkbGU8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PktlaXRoPC9maXJzdD4KKyAgICA8bGFzdD5WaXNjbzwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+S2V2aW48L2ZpcnN0PgorICAgIDxsYXN0PkdyZWluZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PktldmluPC9maXJzdD4KKyAgICA8bGFzdD5KYWNrc29uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5LZXZpbjwvZmlyc3Q+CisgICAgPGxhc3Q+Um9zczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+S2V2aW48L2ZpcnN0PgorICAgIDxtaWRkbGU+WjwvbWlkZGxlPgorICAgIDxsYXN0PkdyZXk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pktpcms8L2ZpcnN0PgorICAgIDxsYXN0Pld5bGllPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5LeWxlPC9maXJzdD4KKyAgICA8bGFzdD5BZGFtczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TGFycnk8L2ZpcnN0PgorICAgIDxsYXN0PlNoYXR6ZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkxhcnJ5PC9maXJzdD4KKyAgICA8bGFzdD5TdHJlZXB5PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5MZXM8L2ZpcnN0PgorICAgIDxsYXN0Pkh1Z2hlczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TGV2aTwvZmlyc3Q+CisgICAgPGxhc3Q+Q29vazwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8bGFzdD5sdWNhczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+THVkb3ZpYzwvZmlyc3Q+CisgICAgPGxhc3Q+Q2xhdWRlPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYWdlc2g8L2ZpcnN0PgorICAgIDxsYXN0PlVtYXNhbmthcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWFuZWVzaDwvZmlyc3Q+CisgICAgPGxhc3Q+U2FodTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWFyY2VsPC9maXJzdD4KKyAgICA8bGFzdD5TY2h1dHRlPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXJjdXM8L2ZpcnN0PgorICAgIDxsYXN0PkImYW1wO291bWw7cmdlcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWFyaXVzejwvZmlyc3Q+CisgICAgPGxhc3Q+Tm93b3N0YXdza2k8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hcms8L2ZpcnN0PgorICAgIDxsYXN0PkhlY2tlcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWFyazwvZmlyc3Q+CisgICAgPG1pZGRsZT5SLjwvbWlkZGxlPgorICAgIDxsYXN0PkRpZ2dvcnk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hcnRpam48L2ZpcnN0PgorICAgIDxsYXN0PktydWl0aG9mPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXJ0aW48L2ZpcnN0PgorICAgIDxsYXN0PkxhbmRlcnM8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hcnRpbjwvZmlyc3Q+CisgICAgPGxhc3Q+UG9lc2NobDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWFydGluPC9maXJzdD4KKyAgICA8bGFzdD52YW4gZGVuIEJlbXQ8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hdGhpZXU8L2ZpcnN0PgorICAgIDxsYXN0PkNoYW1wbG9uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXRoaWV1PC9maXJzdD4KKyAgICA8bGFzdD5QZWx0aWVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXR0PC9maXJzdD4KKyAgICA8bGFzdD5BbGJyZWNodDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWF0dDwvZmlyc3Q+CisgICAgPGxhc3Q+QmVuc29uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXR0PC9maXJzdD4KKyAgICA8bGFzdD5CaXNob3A8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hdHQ8L2ZpcnN0PgorICAgIDxsYXN0PkZvZW1tZWw8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hdHQ8L2ZpcnN0PgorICAgIDxsYXN0Pkdyb3NzbzwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWF0dDwvZmlyc3Q+CisgICAgPGxhc3Q+SHVtcGhyZXk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hdHQ8L2ZpcnN0PgorICAgIDxsYXN0PlNtYWxsPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXR0aGV3PC9maXJzdD4KKyAgICA8bGFzdD5IYXd0aG9ybmU8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hdHRoZXc8L2ZpcnN0PgorICAgIDxsYXN0PkluZ2VyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXR0aGV3PC9maXJzdD4KKyAgICA8bWlkZGxlPkt1cGVydXM8L21pZGRsZT4KKyAgICA8bGFzdD5IZXVuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXR0aGV3PC9maXJzdD4KKyAgICA8bGFzdD5XYXRzb248L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1pY2hhZWw8L2ZpcnN0PgorICAgIDxsYXN0PkRhdmV5PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NaWNoYWVsPC9maXJzdD4KKyAgICA8bWlkZGxlPkouPC9taWRkbGU+CisgICAgPGxhc3Q+U2lrb3Jza3k8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1pY2hhZWw8L2ZpcnN0PgorICAgIDxsYXN0Pk1jQ2FsbHVtPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NaWNoYWVsPC9maXJzdD4KKyAgICA8bGFzdD5OZXdjb21iPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NaWNoYWVsPC9maXJzdD4KKyAgICA8bGFzdD5OeWdhcmQ8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1pY2hhZWw8L2ZpcnN0PgorICAgIDxsYXN0PlNhdW5kZXJzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxsYXN0Pk1paGE8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1pa2U8L2ZpcnN0PgorICAgIDxsYXN0PlJvYmVydHM8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGxhc3Q+bW5vd29zdGF3c2tpPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5OaWNrPC9maXJzdD4KKyAgICA8bGFzdD5DaGFsa288L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk5pY2s8L2ZpcnN0PgorICAgIDxsYXN0PkNyb3NzbGV5PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5OaWNrPC9maXJzdD4KKyAgICA8bGFzdD5Gb3J0ZXNjdWU8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk5pY2s8L2ZpcnN0PgorICAgIDxsYXN0PlBlbGxvdzwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Tmljb2xhPC9maXJzdD4KKyAgICA8bGFzdD5LZW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk5pY288L2ZpcnN0PgorICAgIDxsYXN0PlNlZXNzbGU8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk5pZ2VsPC9maXJzdD4KKyAgICA8bGFzdD5NYWduYXk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk9saXZlcjwvZmlyc3Q+CisgICAgPGxhc3Q+TWVya2VsPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5PbGl2ZXI8L2ZpcnN0PgorICAgIDxsYXN0PlJvc3NtdWVsbGVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD4mIzIxNjt5c3RlaW48L2ZpcnN0PgorICAgIDxsYXN0Pkdpc24mIzIyOTtzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5QYXRyaWNrPC9maXJzdD4KKyAgICA8bGFzdD5DLjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UGF0cmljazwvZmlyc3Q+CisgICAgPGxhc3Q+Q2hhbmV6b248L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlBhdHJpY2s8L2ZpcnN0PgorICAgIDxsYXN0Pkd1czwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UGF1bDwvZmlyc3Q+CisgICAgPGxhc3Q+QXVzdGluPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5QYXVsPC9maXJzdD4KKyAgICA8bGFzdD5DaHJpc3RtYW5uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5QYXVsPC9maXJzdD4KKyAgICA8bGFzdD5HYWxicmFpdGg8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlBhdWw8L2ZpcnN0PgorICAgIDxsYXN0Pktpbmc8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlBhdWxvPC9maXJzdD4KKyAgICA8bGFzdD5HYXNwYXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlBldGVyPC9maXJzdD4KKyAgICA8bWlkZGxlPkIuPC9taWRkbGU+CisgICAgPGxhc3Q+V2VzdDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UGV0ZXI8L2ZpcnN0PgorICAgIDxsYXN0PkRvbmFsZDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UGV0ZXI8L2ZpcnN0PgorICAgIDxsYXN0PkRvb3JuYm9zY2g8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlBldGVyPC9maXJzdD4KKyAgICA8bGFzdD5IdWxzdDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UGV0ZXI8L2ZpcnN0PgorICAgIDxsYXN0PlJlaWxseTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UGhpbGxpcDwvZmlyc3Q+CisgICAgPGxhc3Q+V2VsbHM8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlBpZXJyZTwvZmlyc3Q+CisgICAgPGxhc3Q+RGVsaXNsZTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UGllcnJlPC9maXJzdD4KKyAgICA8bGFzdD5EaXR0Z2VuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5SPC9maXJzdD4KKyAgICA8bGFzdD5IYW5kZXJzb248L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJhbWk8L2ZpcnN0PgorICAgIDxsYXN0Pk9qYXJlczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UmFuZHk8L2ZpcnN0PgorICAgIDxsYXN0PldhdGxlcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UmFwaGFlbDwvZmlyc3Q+CisgICAgPGxhc3Q+UGllcnF1aW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJheTwvZmlyc3Q+CisgICAgPGxhc3Q+V2FsZGluPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5SaWNoYXJkPC9maXJzdD4KKyAgICA8bGFzdD5FdmFuczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+UmljazwvZmlyc3Q+CisgICAgPGxhc3Q+QmV0b248L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJvYmVydDwvZmlyc3Q+CisgICAgPGxhc3Q+QW5kZXJzb248L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJvYmVydDwvZmlyc3Q+CisgICAgPGxhc3Q+U2hhdzwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Um9iZXJ0PC9maXJzdD4KKyAgICA8bGFzdD5XYXRraW5zPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Sb2JlcnRvPC9maXJzdD4KKyAgICA8bGFzdD5TY2FyYW11enppPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Sb2JpbjwvZmlyc3Q+CisgICAgPGxhc3Q+R3JlZW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJvYjwvZmlyc3Q+CisgICAgPGxhc3Q+T3hzcHJpbmc8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJvYjwvZmlyc3Q+CisgICAgPGxhc3Q+dmFuIE9vc3RydW08L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJvZ2VyPC9maXJzdD4KKyAgICA8bGFzdD5WYXVnaG48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJvbWFuPC9maXJzdD4KKyAgICA8bGFzdD5JdmFzaGluPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Sb25lbjwvZmlyc3Q+CisgICAgPGxhc3Q+TWFzaGFsPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5SdXNzZWxsPC9maXJzdD4KKyAgICA8bGFzdD5Hb2xkPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TYW08L2ZpcnN0PgorICAgIDxsYXN0PlJ1Ynk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlNjb3R0PC9maXJzdD4KKyAgICA8bGFzdD5DYXJsc29uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TY290dDwvZmlyc3Q+CisgICAgPGxhc3Q+RWxsc3dvcnRoPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TY290dDwvZmlyc3Q+CisgICAgPG1pZGRsZT5NLjwvbWlkZGxlPgorICAgIDxsYXN0PlN0aXJsaW5nPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TZWFuPC9maXJzdD4KKyAgICA8bGFzdD5FZ2FuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TZWFuPC9maXJzdD4KKyAgICA8bWlkZGxlPlAuPC9taWRkbGU+CisgICAgPGxhc3Q+S2FuZTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+U2ViYXN0aWVuPC9maXJzdD4KKyAgICA8bGFzdD5Bcm9kPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TaGlyYXo8L2ZpcnN0PgorICAgIDxsYXN0PkthbmdhPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TZWJhc3RpYW48L2ZpcnN0PgorICAgIDxsYXN0PkthbnRoYTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICAgIDxmaXJzdD5TaW1vbjwvZmlyc3Q+CisgICAgICA8bGFzdD5MYXc8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlN0ZWZhbjwvZmlyc3Q+CisgICAgPGxhc3Q+Qm9kZXdpZzwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+U3RlZmFubzwvZmlyc3Q+CisgICAgPGxhc3Q+TWF6em9jY2hpPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TdGVwaGFuPC9maXJzdD4KKyAgICA8bGFzdD5TdHJpdHRtYXR0ZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlN0ZXBoYW5lPC9maXJzdD4KKyAgICA8bGFzdD5CYWlsbGllejwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8bGFzdD5zdGVwaGFuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TdGVwaGFuPC9maXJzdD4KKyAgICA8bGFzdD5NaWNoZWxzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TdGVwaGVuPC9maXJzdD4KKyAgICA8bGFzdD5DaGluPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TdGV2ZTwvZmlyc3Q+CisgICAgPGxhc3Q+Q29oZW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlN0ZXZlPC9maXJzdD4KKyAgICA8bGFzdD5Mb3VnaHJhbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+U3RldmU8L2ZpcnN0PgorICAgIDxsYXN0Pk1vcmluPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TdGV2ZTwvZmlyc3Q+CisgICAgPGxhc3Q+V2Fkc3dvcnRoPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TdGV2ZW48L2ZpcnN0PgorICAgIDxtaWRkbGU+RS48L21pZGRsZT4KKyAgICA8bGFzdD5OZXd0b248L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlRha2FzaGk8L2ZpcnN0PgorICAgIDxsYXN0Pk9rYW1vdG88L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlRhb3VmaWs8L2ZpcnN0PgorICAgIDxsYXN0PlJvbWRoYW5lPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5UYXJpcTwvZmlyc3Q+CisgICAgPGxhc3Q+TWFzdGVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5UaG9tYXM8L2ZpcnN0PgorICAgIDxsYXN0PkJ1dHo8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlRob21hczwvZmlyc3Q+CisgICAgPGxhc3Q+Q2hyaXN0ZW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlRob21hczwvZmlyc3Q+CisgICAgPGxhc3Q+Q2hyaXN0ZW5zZW48L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlRob21hczwvZmlyc3Q+CisgICAgPGxhc3Q+SGFhczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+VGhvbWFzPC9maXJzdD4KKyAgICA8bGFzdD5RdWFzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5UaW08L2ZpcnN0PgorICAgIDxsYXN0PkRydXJ5PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5UaW08L2ZpcnN0PgorICAgIDxsYXN0PkZlbm5lbGw8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlRpbW90aHk8L2ZpcnN0PgorICAgIDxtaWRkbGU+R2VyYXJkPC9taWRkbGU+CisgICAgPGxhc3Q+RW5kcmVzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5UaW08L2ZpcnN0PgorICAgIDxsYXN0PlN0ZXBoZW5zb248L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlRvbTwvZmlyc3Q+CisgICAgPGxhc3Q+QmFsbDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+VG9tPC9maXJzdD4KKyAgICA8bGFzdD5DdW5uaW5naGFtPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Ub208L2ZpcnN0PgorICAgIDxsYXN0PkRpbW9jazwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+VG9tPC9maXJzdD4KKyAgICA8bGFzdD5FdWdlbGluazwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+VHJlamthejwvZmlyc3Q+CisgICAgPGxhc3Q+WGFvejwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+VWxyaWNoPC9maXJzdD4KKyAgICA8bGFzdD5TY2htaWR0PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5WaWN0b3I8L2ZpcnN0PgorICAgIDxsYXN0PlRvbmk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PldpbGw8L2ZpcnN0PgorICAgIDxsYXN0Pldhbmc8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PldpbGxpYW08L2ZpcnN0PgorICAgIDxsYXN0PkZlcmd1c29uPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Xb2xmPC9maXJzdD4KKyAgICA8bGFzdD5TaWJlcnNraTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+V29sZmdhbmc8L2ZpcnN0PgorICAgIDxsYXN0PkJhZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PldvbGZnYW5nPC9maXJzdD4KKyAgICA8bGFzdD5GcmVjaDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+V29sZmdhbmc8L2ZpcnN0PgorICAgIDxsYXN0Pldlcm5lcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+WGF2aWVyPC9maXJzdD4KKyAgICA8bGFzdD5IYW5pbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+WGF2aWVyPC9maXJzdD4KKyAgICA8bGFzdD5XaXRkb3VjazwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+WW9oYW5uPC9maXJzdD4KKyAgICA8bGFzdD5Sb3Vzc2VsPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5ZdWppPC9maXJzdD4KKyAgICA8bGFzdD5ZYW1hbm88L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pll2ZXM8L2ZpcnN0PgorICAgIDxsYXN0Pk1hcnRpbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+WmFjaDwvZmlyc3Q+CisgICAgPGxhc3Q+R2FybmVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5aZGVuZWs8L2ZpcnN0PgorICAgIDxsYXN0PldhZ25lcjwvbGFzdD4KKyAgPC9uYW1lPgorPC9jb250cmlidXRvcnM+CmRpZmYgLS1naXQgYS90cnVuay9kb2FwX0FudC5yZGYgYi90cnVuay9kb2FwX0FudC5yZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjYmY5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvYXBfQW50LnJkZgpAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyZGY6UkRGIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9ucy9kb2FwIyIgCisgICAgICAgICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIAorICAgICAgICAgeG1sbnM6YXNmZXh0PSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9ucy9hc2ZleHQjIj4KKyAgPFByb2plY3QgcmRmOmFib3V0PSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj4KKyAgICA8Y3JlYXRlZD4yMDA2LTAyLTE3PC9jcmVhdGVkPgorICAgIDxsaWNlbnNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3VzZWZ1bGluYy5jb20vZG9hcC9saWNlbnNlcy9hc2wyMCIgLz4KKyAgICA8bmFtZT5BcGFjaGUgQW50PC9uYW1lPgorICAgIDxob21lcGFnZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZyIgLz4KKyAgICA8YXNmZXh0OnBtYyByZGY6cmVzb3VyY2U9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZyIgLz4KKyAgICA8c2hvcnRkZXNjPkphdmEtYmFzZWQgYnVpbGQgdG9vbDwvc2hvcnRkZXNjPgorICAgIDxkZXNjcmlwdGlvbj5BcGFjaGUgQW50IGlzIGEgSmF2YS1iYXNlZCBidWlsZCB0b29sLiBJbiB0aGVvcnksIGl0IGlzIGtpbmQgb2YgbGlrZSBNYWtlLCBidXQgd2l0aG91dCBNYWtlJ3Mgd3JpbmtsZXMuPC9kZXNjcmlwdGlvbj4KKyAgICA8YnVnLWRhdGFiYXNlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP3Byb2R1Y3Q9QW50IiAvPgorICAgIDxtYWlsaW5nLWxpc3QgcmRmOnJlc291cmNlPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFpbC5odG1sIiAvPgorICAgIDxkb3dubG9hZC1wYWdlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSIgLz4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SmF2YTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvY2F0ZWdvcnkvYnVpbGQtbWFuYWdlbWVudCIgLz4KKyAgICA8cmVsZWFzZT4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgQW50IDEuNy4wPC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDA2LTEyLTEzPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MS43LjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgIDwvcmVsZWFzZT4KKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgIDxTVk5SZXBvc2l0b3J5PgorICAgICAgICA8bG9jYXRpb24gcmRmOnJlc291cmNlPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudCIvPgorICAgICAgICA8YnJvd3NlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudCIvPgorICAgICAgPC9TVk5SZXBvc2l0b3J5PgorICAgIDwvcmVwb3NpdG9yeT4KKyAgPC9Qcm9qZWN0PgorPC9yZGY6UkRGPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy54bWwgYi90cnVuay9kb2NzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTYyZjUxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy54bWwKQEAgLTAsMCArMSwxMDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iYnVpbGQtc2l0ZSIgZGVmYXVsdD0iZG9jcyIgYmFzZWRpcj0iLiI+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEJ1aWxkIGRvY3VtZW50YXRpb24gLSBYRG9jcyBhbmQgSmF2YWRvYy4KKyAgICAgICAgRm9yIGJ1aWxkaW5nIFhEb2NzLCBlZGl0IHhkb2NzLyoqLyoueG1sIGZpcnN0LgorICAgICAgICBJZiAuLi9qYWthcnRhLXNpdGUyIGRvZXMgbm90IGV4aXN0LCBzZXQgLURzaXRlLmRpcj0uLi4gZm9yIGl0LAorICAgICAgICBvciBqdXN0IHVzZSAtRHZlbG9jaXR5LmRpcj0uLi4vdmVsb2NpdHktNC54IGlmIHlvdSBoYXZlIGRvd25sb2FkZWQgVmVsb2NpdHkgc29tZXdoZXJlLgorCisgICAgICAgIFhYWCBmb3Igbm8gYXBwYXJlbnQgcmVhc29uLCB5b3VyIENXRCBtdXN0IGJlIHRoZSBtYWluIEFudCBzb3VyY2UgZGlyLCBvciB0aGlzIHdpbGwgZmFpbDoKKyAgICAgICAgLi4uL2RvY3MueG1sOjY0OiBvcmcuYXBhY2hlLnZlbG9jaXR5LmV4Y2VwdGlvbi5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOiBVbmFibGUgdG8gZmluZCByZXNvdXJjZSAnLi9zaXRlLnZzbCcKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPCEtLSBJbml0aWFsaXphdGlvbiBwcm9wZXJ0aWVzIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0Lm5hbWUiIHZhbHVlPSJhbnQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZG9jcy5zcmMiICAgICBsb2NhdGlvbj0ieGRvY3MiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZG9jcy5kZXN0IiAgICBsb2NhdGlvbj0iZG9jcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LmZpbGUiIHZhbHVlPSJzdHlsZXNoZWV0cy9wcm9qZWN0LnhtbCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVtcGwucGF0aCIgICBsb2NhdGlvbj0ieGRvY3Mvc3R5bGVzaGVldHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InZlbG9jaXR5LnByb3BzIiAgIGxvY2F0aW9uPSIke2RvY3Muc3JjfS92ZWxvY2l0eS5wcm9wZXJ0aWVzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlLnhtbCIgIHZhbHVlPSIqKi8qLnhtbCIgLz4KKworICAgIDx0YXJnZXQgbmFtZT0ic2V0dXAtZXhwbGljaXQtY2xhc3NwYXRoIiBpZj0idmVsb2NpdHkuZGlyIj4KKyAgICAgICAgPHBhdGggaWQ9ImFuYWtpYS5jbGFzc3BhdGgiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3ZlbG9jaXR5LmRpcn0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InZlbG9jaXR5LWRlcC0qLmphciIvPgorICAgICAgICAgICAgICAgIDwhLS0gWFhYIHdoeSBpcyB0aGlzIG5lZWRlZCBzZXBhcmF0ZWx5PyAtLT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJidWlsZC9saWIvamRvbS0qLmphciIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L3BhdGg+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNldHVwLWltcGxpY2l0LWNsYXNzcGF0aCIgdW5sZXNzPSJ2ZWxvY2l0eS5kaXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2l0ZS5kaXIiIGxvY2F0aW9uPSIuLi9qYWthcnRhLXNpdGUyIi8+CisgICAgICAgIDxwYXRoIGlkPSJhbmFraWEuY2xhc3NwYXRoIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzaXRlLmRpcn0vbGliIj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L3BhdGg+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InByZXBhcmUiIGRlcGVuZHM9InNldHVwLWV4cGxpY2l0LWNsYXNzcGF0aCxzZXR1cC1pbXBsaWNpdC1jbGFzc3BhdGgiPgorICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS52ZWxvY2l0eS5hbmFraWEuQW5ha2lhVGFzayIKKyAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0iQW5ha2lhVGFzay5wcmVzZW50Ij4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImFuYWtpYS5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hdmFpbGFibGU+CisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im9ud2luZG93cyI+CisgICAgICAgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIi8+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBkZXBlbmRzPSJwcmVwYXJlIiBuYW1lPSJwcmVwYXJlLWVycm9yIiB1bmxlc3M9IkFuYWtpYVRhc2sucHJlc2VudCI+CisgICAgICAgIDxlY2hvPgorICAgICAgICAgICAgQW5ha2lhVGFzayBpcyBub3QgcHJlc2VudCEgUGxlYXNlIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICAgICB2ZWxvY2l0eS5qYXIgaXMgaW4geW91ciBjbGFzc3BhdGguCisgICAgICAgIDwvZWNobz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iYW5ha2lhIiBpZj0iQW5ha2lhVGFzay5wcmVzZW50IiBkZXBlbmRzPSJwcmVwYXJlLWVycm9yIj4KKyAgICAgICAgPHRhc2tkZWYgbmFtZT0iYW5ha2lhIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudmVsb2NpdHkuYW5ha2lhLkFuYWtpYVRhc2siPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYW5ha2lhLmNsYXNzcGF0aCIvPgorICAgICAgICA8L3Rhc2tkZWY+CisKKyAgICAgICAgPGFuYWtpYSBiYXNlZGlyPSIke2RvY3Muc3JjfSIgZGVzdGRpcj0iJHtkb2NzLmRlc3R9LyIKKyAgICAgICAgICAgICBleHRlbnNpb249Ii5odG1sIiBzdHlsZT0iLi9zaXRlLnZzbCIKKyAgICAgICAgICAgICBwcm9qZWN0RmlsZT0iJHtwcm9qZWN0LmZpbGV9IgorICAgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9zdHlsZXNoZWV0cy8qKiIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iJHtpbmNsdWRlLnhtbH0iCisgICAgICAgICAgICAgbGFzdE1vZGlmaWVkQ2hlY2s9InRydWUiCisgICAgICAgICAgICAgdGVtcGxhdGVQYXRoPSIke3RlbXBsLnBhdGh9IgorICAgICAgICAgICAgIHZlbG9jaXR5UHJvcGVydGllc0ZpbGU9IiR7dmVsb2NpdHkucHJvcHN9Ij4KKyAgICAgICAgPC9hbmFraWE+CisgICAgICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtkb2NzLmRlc3R9IiBpbmNsdWRlcz0iKiovKi5odG1sIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImZpeGNybGYiIGlmPSJvbndpbmRvd3MiPgorICAgICAgICA8Zml4Y3JsZiBzcmNEaXI9IiR7ZG9jcy5kZXN0fSIgZW9sPSJkb3MiIGluY2x1ZGVzPSIqLmh0bWwiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG9jcyIgaWY9IkFuYWtpYVRhc2sucHJlc2VudCIgZGVwZW5kcz0iYW5ha2lhLGZpeGNybGYiIGRlc2NyaXB0aW9uPSJDcmVhdGUgWERvY3MuIj4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImphdmFkb2NzIiBkZXNjcmlwdGlvbj0iQ3JlYXRlIEphdmFkb2MuIj4KKyAgICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9ImRpc3RfamF2YWRvY3MiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGlzdC5qYXZhZG9jcyIgdmFsdWU9IiR7ZG9jcy5kZXN0fS9tYW51YWwvYXBpIiAvPgorICAgICAgPC9hbnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iZG9jcyxqYXZhZG9jcyIgZGVzY3JpcHRpb249IkNyZWF0ZSBib3RoIFhEb2NzIGFuZCBKYXZhZG9jLiIvPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzLy5odGFjY2VzcyBiL3RydW5rL2RvY3MvLmh0YWNjZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTcyY2IKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzLy5odGFjY2VzcwpAQCAtMCwwICsxIEBACitBZGRPdXRwdXRGaWx0ZXIgSU5DTFVERVMgLmh0bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL0xJQ0VOU0UgYi90cnVuay9kb2NzL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMGQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvTElDRU5TRQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICogICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisgKgorICogICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKyAqCisgKiAgIDEuIERlZmluaXRpb25zLgorICoKKyAqICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAqICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisgKgorICogICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisgKgorICogICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgKiAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAqICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAqICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgKiAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgKiAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICogICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorICoKKyAqICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICogICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorICoKKyAqICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgKiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAqICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAqCisgKiAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgKiAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAqICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICogICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisgKgorICogICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICogICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgKiAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICogICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorICoKKyAqICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICogICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgKiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAqICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAqICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgKiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAqICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKyAqCisgKiAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgKiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAqICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgKiAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAqICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgKiAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICogICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgKiAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgKiAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgKiAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgKiAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICogICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICogICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKyAqCisgKiAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgKiAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICogICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKyAqCisgKiAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgKiAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgKiAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICogICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAqICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKyAqCisgKiAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgKiAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgKiAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICogICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAqICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAqICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAqICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICogICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICogICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICogICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgKiAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgKiAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAqICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgKiAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAqCisgKiAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgKiAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICogICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICogICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgKiAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorICoKKyAqICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICogICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisgKgorICogICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAqICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAqICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgKiAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgKiAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisgKgorICogICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAqICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAqICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICogICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgKiAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAqICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgKiAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgKiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAqICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAqICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICogICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICogICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAqICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgKiAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAqICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICogICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorICoKKyAqICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgKiAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICogICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAqICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgKiAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisgKgorICogICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgKiAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICogICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAqICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICogICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICogICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisgKgorICogICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgKiAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAqICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgKiAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorICoKKyAqICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgKiAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAqICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICogICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICogICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgKiAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICogICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAqICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorICoKKyAqICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgKiAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICogICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICogICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICogICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgKiAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICogICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgKiAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAqICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAqICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICogICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgKiAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgKiAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgKiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgKiAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgKiAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgKiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAqICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgKiAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAqICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisgKgorICogICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKyAqCisgKiAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKyAqCisgKiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgKiAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAqICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAqICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAqICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgKiAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAqICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgKiAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKyAqCisgKiAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2FudDIvRnVuY3Rpb25hbFJlcXVpcmVtZW50cy5odG1sIGIvdHJ1bmsvZG9jcy9hbnQyL0Z1bmN0aW9uYWxSZXF1aXJlbWVudHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQ1ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9hbnQyL0Z1bmN0aW9uYWxSZXF1aXJlbWVudHMuaHRtbApAQCAtMCwwICsxLDcwIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgorICA8dGl0bGU+QW50IEZ1bmN0aW9uYWwgUmVxdWlyZW1lbnRzIERvY3VtZW50PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgyPkFudCBGdW5jdGlvbmFsIFJlcXVpcmVtZW50czwvaDI+Cis8aDM+Um9sZXM8L2gzPgorPHA+PGI+VXNlcjogPC9iPnJ1bnMgQW50IHdpdGggYSBjb21wbGV0ZSBidWlsZCBzcGVjaWZpY2F0aW9uIGFuZC9vcgord3JpdGVzIEFudCBidWlsZCBzcGVjaWZpY2F0aW9ucy48L3A+Cis8cD48Yj5UYXNrIERldmVsb3BlcjogPC9iPndyaXRlcy9tb2RpZmllcyBBbnQgdGFza3MuPC9wPgorPHA+PGI+RXh0ZW5zaW9ucyBEZXZlbG9wZXI6IDwvYj5kZXZlbG9wcyBleHRlbnNpb25zIGxpa2UgYSBHVUksIElERSBwbHVnaW4sCisgKHNjcmlwdGluZyBleHRlbnNpb24/KTwvcD4KKzxwPjxiPkNvcmUgRGV2ZWxvcGVyOiA8L2I+d29ya3Mgb24gdGhlIEFudCBjb3JlPC9wPgorPGgzPlJlcXVpcmVtZW50cyBmcm9tIHRoZSBBbnQgVXNlciBwZXJzcGVjdGl2ZTwvaDM+Cis8cD5JdCBzaG91bGQgYmUgZWFzeSB0byB3cml0ZSBhIGJ1aWxkIGZpbGUgZm9yIHNtYWxsIEphdmEgcHJvZ3JhbXMuIEl0IHNob3VsZAorIGJlIHBvc3NpYmxlIHRvIHdyaXRlIGEgYnVpbGQgZmlsZSBzZXQgZm9yIGxhcmdlIEphdmEgc3lzdGVtcy4gTWFpbnRlbmFuY2UKKyBvZiBzdWNoIGEgc2V0IHNob3VsZCBiZSBlYXN5IChlLmcuIG5vIGR1cGxpY2F0aW9uIG9mIGluZm9ybWF0aW9uKS48L3A+Cis8cD5FdmVyeSBidWlsZCBwcm9jZXNzIGNvbnRhaW5zIGRlcGVuZGVuY2llcyAoZS5nLiBpdGVtIEEgbmVlZHMgQiB0byBiZSBhdmFpbGFibGUKKyBiZWZvcmUgaXRzIG93biBidWlsZCBjYW4gc3RhcnQpLiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gc3BlY2lmeSB0aGVzZQorIGRlcGVuZGVuY2llcyBpbiBhIGRlY2xhcmF0aXZlIHdheS48L3A+Cis8cD5TdXBwb3NlIGEgd29ya2luZyBidWlsZCBzcGVjaWZpY2F0aW9uIGZvciBzeXN0ZW0gQSBpcyBhdmFpbGFibGUuIEl0IHNob3VsZAorIGJlIHBvc3NpYmxlIGZvciBzeXN0ZW0gQiB0byBkZWNsYXJlIGRlcGVuZGVuY2llcyB0byA8aT4obW9kdWxlcyBvZj8pPC9pPiBzeXN0ZW0KKyBBIHdpdGhvdXQgdG91Y2hpbmcgdGhlIGJ1aWxkIHNwZWNpZmljYXRpb24gb2YgQS4gQW50IHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZQorIGRlcGVuZGVuY2llcyBiZXR3ZWVuIG1vZHVsZXMgd2hpY2ggZm9ybSBhIERBRy48L3A+Cis8cD5JdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbW9kaWZ5IGRldGFpbHMgb2YgdGhlIGFjdHVhbCBidWlsZCAoZS5nLiBjbGFzc3BhdGgsCisgdXNlZCBjb21waWxlcikgd2l0aG91dCB0aGUgbmVlZCB0byBjaGFuZ2UgdGhlIGJ1aWxkIHNwZWNpZmljYXRpb24uIFRoaXMKKyBmZWF0dXJlIGlzIG5lZWRlZCB3aGVuIHN0YXJ0aW5nIEFudCAoZS5nLiBjb25maWd1cmF0aW9uIHdpdGggY29tbWFuZCBsaW5lCisgcGFyYW1ldGVycykgYW5kIGZvciBhIHN1YnByb2plY3QgYnVpbGQgZHJpdmVuIGJ5IHRoZSBidWlsZCBvZiBhIGRlcGVuZGVudAorIHByb2plY3QuPC9wPgorPHA+T2Z0ZW4gc2ltaWxhciBpdGVtcyBoYXZlIHRvIGJlIGJ1aWx0LiBUaGVyZWZvcmUgaXQgc2hvdWxkIGJlIHBvc3NpYmxlCisgdG8gcHJvdmlkZSBnZW5lcmFsIDxpPih0ZW1wbGF0ZT8pPC9pPiBidWlsZCBzcGVjaWZpY2F0aW9ucywgYW5kIHRvIGRlY2xhcmUgZm9yCisgYSBjb25jcmV0ZSBpdGVtIHRoYXQgaXQgc2hvdWxkIGJlIGJ1aWx0IGFjY29yZGluZyB0byBzdWNoIGEgZ2VuZXJhbCBzcGVjaWZpY2F0aW9uLjwvcD4KKzxwPk9uZSByZXN1bHQgb2YgdGhlIGJ1aWxkIHByb2Nlc3Mgc2hvdWxkIGJlIGEgbG9nIHdoaWNoIHNob3dzIHdoYXQgaGFzIGJlZW4gZG9uZS48L3A+Cis8aDM+UmVxdWlyZW1lbnRzIGZyb20gdGhlIHRhc2sgZGV2ZWxvcGVyIHBlcnNwZWN0aXZlPC9oMz4KKzxwPkEgdGFzayBzaG91bGQgbm90IG5lZWQgdG8ga25vdyB0aGUgc3RydWN0dXJlIG9mIGEgYnVpbGQgc3BlY2lmaWNhdGlvbi4KKyBJdCB3b3VsZCBoYXZlIHRvIHByb3ZpZGUgYW4gaW50ZXJmYWNlIChub3QgbmVjZXNzYXJpbHkgaW4gdGhlIEphdmEgbGFuZ3VhZ2UKKyBzZW5zZSkgZm9yIHRoZSBBbnQgY29yZSB0byBpbnB1dCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcworIGFuZCB0byBleGVjdXRlIHRoZSB0YXNrKS4gVGhlcmUgc2hvdWxkIGJlIGEgc3RhbmRhcmQgZnVuY3Rpb25hbGl0eSB0byBhbGxvdworIGEgdGFzayBkb2luZyBsb2cgb3V0cHV0LjwvcD4KKzxwPkFuIGludGVyZmFjZSAoYWdhaW4gbm90IG5lY2Vzc2FyaWx5IGluIHRoZSBKYXZhIGxhbmd1YWdlIHNlbnNlKSBzaG91bGQKKyBiZSBwcm92aWRlZCB3aGljaCBhbGxvd3MgYSB0YXNrIHRvIGdldCA8aT4oYW5kIHNldD8pPC9pPiBpbmZvcm1hdGlvbiBhYm91dCBpdCdzCisgY29udGV4dCBpbiB0aGUgYnVpbGQgcHJvY2Vzcy48L3A+Cis8aDM+UmVxdWlyZW1lbnRzIGZyb20gdGhlIGV4dGVuc2lvbnMgZGV2ZWxvcGVyIHBlcnNwZWN0aXZlPC9oMz4KKzxwPlRoZSBBbnQgY29yZSBzaG91bGQgYmUgaW5kZXBlbmRlbnQgZnJvbSBhIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorIGJ1aWxkIHNwZWNpZmljYXRpb24uIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjcmVhdGUgYSBzcGVjaWZpY2F0aW9uIHByb2dyYW1tYXRpY2FsbHkKKyAodGhlcmVieSBhbGxvd2luZyB0aGUgaW50cm9kdWN0aW9uIG9mIG5ldyByZXByZXNlbnRhdGlvbnMpLiBUaGUgY29yZSBzaG91bGQKKyBkbyBubyBpbi0gb3Igb3V0cHV0IGl0c2VsZi4gQnVpbGQgZXJyb3JzIHNob3VsZCBhbHdheXMgbGVhZCB0byB0aHJvd2luZworIGFuIEV4Y2VwdGlvbi48L3A+Cis8cD5BY2Nlc3MgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBidWlsZCBzaG91bGQgYmUgYXZhaWxhYmxlLCBhbmQgaXRzIG1vZGlmaWNhdGlvbgorIHBvc3NpYmxlLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9hbnQyL1ZGUy50eHQgYi90cnVuay9kb2NzL2FudDIvVkZTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlmZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9hbnQyL1ZGUy50eHQKQEAgLTAsMCArMSwyNTMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KK0Zyb206ICJBZGFtIE11cmRvY2giIDxhZGFtbXVyZG9jaF9tbEB5YWhvby5jb20+CitTdWJqZWN0OiBSRTogVmlydHVhbCBGaWxlU3lzdGVtIExheWVyCitEYXRlOiBTYXQsIDIyIERlYyAyMDAxIDEyOjA2OjM3ICsxMDAwCisKK0hpLAorCitJJ3ZlIGFsc28gYmVlbiBkb2luZyBhIGJpdCBvZiB3b3JrIG9uIHRoZSBWRlMuICBObyBjb2RlIHlldCAtIGluc3RlYWQsIEkndmUKK2RvbmUgYSBzdXJ2ZXkgb2YgdGhlIEFudCAxIGNvZGUsIHRvIGhlbHAgZ2V0IGEgYmV0dGVyIGlkZWEgb2Ygd2hhdCB3ZSBuZWVkCit0aGUgVkZTIHRvIGFjdHVhbGx5IGRvLgorCitJJ3ZlIHB1dCB0b2dldGhlciBhIHJvdWdoIGxpc3Qgb2YgdGhlIHNvcnQgb2YgZmVhdHVyZXMgdGhlIGN1cnJlbnQgdGFza3MKK3JlcXVpcmUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uICBUaGlzIGxpc3QgaXMgZW50aXJlbHkgZnJvbSB0aGUgdGFzayB3cml0ZXIncworUE9WLiAgSSd2ZSBpZ25vcmVkIHRoZSBidWlsZCBmaWxlIHdyaXRlciBjb21wbGV0ZWx5IC0gdGhvdWdoLCB0aGUgYWN0aW9uCitsaXN0IGlzIGEgZ29vZCBzdW1tYXJ5IG9mIHRoZSBidWlsZCBmaWxlIHdyaXRlcidzIGNvbmNlcm5zLiAgSSd2ZSB0cmllZCB0bworc3RlZXIgY2xlYXIgb2YgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCBpcyBhY3R1YWxseSBnb2luZyB0byBwcm92aWRlIGVhY2gKK2ZlYXR1cmUgdG8gdGhlIHRhc2tzLCBvciB3aGF0IHRoZSBBUEkgd2lsbCBsb29rIGxpa2UgdG8gdGhlIHRhc2tzLgorCitUaGUgZ29hbCBmb3IgZG9pbmcgdXAgdGhpcyBsaXN0LCB3YXMgdG8gaGVscCBpZGVudGlmeSB0aGUgZmVhdHVyZXMgd2Ugd2FudAordG8gc3VwcG9ydCwgYW5kIHRoZSBBUEkgdGhhdCB0aGUgdGFza3Mgd2lsbCB1c2UgdG8gZ2V0IGF0IHRoZW0uICBUaGlzIHNob3VsZAorYmUgbGFyZ2VseSBpbmRlcGVuZGVudCBvZiBob3cgd2UgZGVjaWRlIHRvIHJlcHJlc2VudCB0aGUgZmlsZSBzeXN0ZW0gaW4gdGhlCitidWlsZCBmaWxlcy4gIEluIGFkZGl0aW9uLCBpdCBkb2Vzbid0IG1hdHRlciB0b28gbXVjaCB3aGV0aGVyIHRoZSBsaXN0IGJlbG93CitpcyBjb21wbGV0ZSAoSSdtIHN1cmUgaXQgaXNuJ3QpLCBvciB0aGF0IHRoZSBWRlMgcHJvdmlkZSBldmVyeSBzaW5nbGUgb25lIG9mCit0aGUgZmVhdHVyZXMuICBXaGF0ZXZlciBpdCBkb2Vzbid0IHByb3ZpZGUsIGNhbiBzdGF5IHVwIGluIHRoZSB0YXNrcywgYW5kIGJlCityZWZhY3RvcmVkIGRvd24gbGF0ZXIuCisKK1RoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB3ZSBkbyBhY3R1YWxseSB3YW50IHRvIHB1dCB0b2dldGhlciBhIGZpbGUKK3N5c3RlbSBBUEkuICBJIHRoaW5rIGl0J3MgYSBnb29kIGlkZWEgdG8gYXQgbGVhc3QgcHV0IHRvZ2V0aGVyIHNvbWUKK2ludGVyZmFjZXMsIGV2ZW4gaWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIHN0b2xlbiBmcm9tIHNvbWV3aGVyZSBlbHNlLgorV2l0aG91dCBhIGRvdWJ0LCB0aGUgZmlsZSBzeXN0ZW0gaXMgdGhlIG1vc3Qgd2lkZWx5IHVzZWQgInNlcnZpY2UiIGluIHRoZQorY3VycmVudCBjcm9wIG9mIHRhc2tzLiAgVGhlIEFQSSB0aGF0IHdlIGNob29zZSBoYXMgdG8gaGF2ZSBhIGdvb2Qgc2VtYW50aWMKK21hdGNoIHdpdGggd2hhdCB0aGUgdGFza3MgbmVlZCB0byBkbywgc28gdGhhdCB3cml0aW5nIHRoZSB0YXNrcyBpcyBlYXN5LgorVGhlIEFQSSBhbHNvIGhhcyB0byBiZSBnZW5lcmFsIGVub3VnaCB0byBkZWFsIHdpdGggc3R1ZmYgd2UgaGF2ZW4ndCB0aG91Z2h0CitvZiB5ZXQuICBPbiB0aGF0IG5vdGUsIEkgcGVyc29uYWxseSB0aGluayB0aGF0IEpOREkgbWlnaHQgYmUgYSB0b3VjaCB0b28KK2dlbmVyYWwgZm9yIHdoYXQgd2UgbmVlZC4KKworU28sIHRoZSBmZWF0dXJlcy4gIE5vdGUgdGhhdCBtYW55IG9mIHRoZXNlIHdpbGwgYmUgb3B0aW9uYWwgLSBub3QgZXZlcnkKK2ZlYXR1cmUgd2lsbCBiZSBhdmFpbGFibGUgZm9yIGV2ZXJ5IG5vZGUgaW4gdGhlIGZpbGUgc3lzdGVtLiAgSSd2ZSB1c2VkIHRoZQordGVybSAibm9kZSIgdG8gbWVhbiBib3RoIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4gIEknbSBub3Qgc3VnZ2VzdGluZyB3ZQorYWN0dWFsbHkgY2FsbCB0aGVtICJub2RlcyIgaW4gdGhlIEFQSS4gIEkndmUgdXNlZCB0aGUgdGVybSAicm9vdCBub2RlIiB0bworbWVhbiB0aGUgcm9vdCBvZiBhIGZpbGUgc3lzdGVtLgorCisqIE5hbWluZworCistIExvY2F0ZSBhIG5vZGUgYnkgYWJzb2x1dGUgbmFtZS4KKy0gR2V0IHRoZSBhYnNvbHV0ZSBuYW1lIGZvciBhIG5vZGUuCistIFJlc29sdmUgYSBuYW1lIHRvIGEgbm9kZSwgcmVsYXRpdmUgdG8gc29tZSBiYXNlIG5vZGUgLSBsaWtlCitGaWxlVXRpbHMucmVzb2x2ZUZpbGUoKS4KKy0gR2V0IHRoZSByZWxhdGl2ZSBuYW1lIG9mIGEgbm9kZSwgcmVsYXRpdmUgdG8gc29tZSBiYXNlIG5vZGUuCistIERldGVybWluZSB0aGUgYmFzZSBuYW1lICh3aXRoIGFuZCB3aXRob3V0IHRoZSBleHRlbnNpb24pLCBhbmQgZXh0ZW5zaW9uIG9mCit0aGUgbm9kZS4KKy0gRGVhbCB3aXRoIGZpbGUgc3lzdGVtcyB0aGF0IGFyZSBjYXNlIHNlbnNpdGl2ZSwgYW5kIGNhc2UgaW5zZW50aXRpdmUuCisKKyogUHJvcGVydGllcworCistIERldGVybWluZSB3aGF0IHByb3BlcnRpZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgbm9kZS4KKy0gRGV0ZXJtaW5lIGlmIHRoZSBub2RlIGV4aXN0cy4KKy0gRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG5vZGUgKGZpbGUgdnMuIGRpcmVjdG9yeSwgY291bGQgYmUgImhhcy1jb250ZW50IiB2cworImhhcy1jaGlsZHJlbiIpLgorLSBEZXRlcm1pbmUgaWYgdGhlIG5vZGUgaXMgcmVhZGFibGUuCistIERldGVybWluZSBpZiB0aGUgbm9kZSBpcyB3cml0ZWFibGUuCistIEdldC9zZXQgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBub2RlLiAgVGhpcyBjb3ZlcnMgdGhpbmdzIGxpa2UgY2htb2QgJgorY2hvd24sIG1ha2luZyByZWFkLW9ubHksIG1ha2luZyBleGVjdXRhYmxlLCBldGMuCisKKyogQ29udGVudAorCistIERldGVybWluZSBpZiB0aGUgbm9kZSBjYW4vZG9lcyBoYXZlIGNvbnRlbnQuCistIEdldCB0aGUgc2l6ZSBvZiB0aGUgbm9kZS4KKy0gR2V0L3NldCB0aGUgbGFzdC1tb2RpZmllZCB0aW1lIG9mIHRoZSBub2RlLgorLSBHZXQvc2V0IHRoZSBtaW1lLXR5cGUgb2YgdGhlIG5vZGUuCistIEdldC9zZXQgdGhlIGVuY29kaW5nIG9mIHRoZSBub2RlLgorLSBHZXQgYSBjaGVja3N1bSBvZiB0aGUgbm9kZS4KKy0gR2V0IGNvbnRlbnQgYXMgSW5wdXRTdHJlYW0uCistIEdldCBjb250ZW50IGFzIFJlYWRlci4KKy0gU2V0IGNvbnRlbnQgYXMgYW4gT3V0cHV0U3RyZWFtLgorLSBTZXQgY29udGVudCBhcyBhIFdyaXRlci4KKy0gSW1wbGljaXQgY3JlYXRpb24gb2Ygbm9kZSBhbmQgaXRzIGFuY2VzdG9ycyB3aGVuIGNvbnRlbnQgaXMgd3JpdHRlbi4KKy0gQ29tcGFyZSBub2RlcyBmb3IgZXF1YWxpdHkgKGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wLCBjaGVja3N1bSwgYnl0ZXdpc2UKK2NvbXBhcmUpLgorCisqIEhpZXJhcmNoeQorCistIEdldCB0aGUgcGFyZW50IG5vZGUgb2YgYSBub2RlLgorLSBHZXQgdGhlIGNoaWxkIG5vZGVzIG9mIGEgbm9kZS4KKy0gSXRlcmF0ZSBvdmVyIChvciB2aXNpdCkgdGhlIGRlc2NlbmRhbnRzIG9mIGEgbm9kZS4KKyAgLSBXaXRoIG9yIHdpdGhvdXQgYSBzZWxlY3Rvci4KKyAgLSBJbiB2YXJpb3VzIG9yZGVycyAtIGRlcHRod2lzZSwgZXRjLgorICAtIEJlIGFibGUgdG8gbW9kaWZ5IHRoZSBub2RlcyBkdXJpbmcgdHJhdmVyc2FsLgorCisqIE1vZGlmaWNhdGlvbgorCistIENyZWF0ZSBhIG5ldyBub2RlIG9mIGEgcGFydGljdWxhciB0eXBlLiAgQ3JlYXRlIGFsbCBtaXNzaW5nIGFuY2VzdG9ycy4KKy0gTW92ZSwgY29weSwgZGVsZXRlIGEgbm9kZS4KKyAgLSBBbGwgZGVzY2VuZGFudHMuCisgIC0gT3B0aW9uYWwgc2VsZWN0b3IuIEUuZy4gaWdub3JlIGVtcHR5IGRpcnMsIGlnbm9yZSBkZWZhdWx0IGV4Y2x1ZGVzLCBldGMuCisgIC0gT3B0aW9uYWwgZmlsdGVyLgorCisqIENvbnZlcnNpb24KKworLSBDb252ZXJ0IHRoZSBub2RlIHRvIGEgamF2YS5uZXQuVVJMLgorLSBNYWtlIHRoZSBub2RlIGNvbnRlbnQgYXZhaWxhYmxlIGFzIGEgbG9jYWwgZmlsZSAodG8gaGFuZCBvZmYgdG8gZXh0ZXJuYWwKK2NvbW1hbmRzKS4KKy0gR2V0IHRoZSBPUyBzcGVjaWZpYyAqZmlsZW5hbWUqIGZvciBhIG5vZGUuCistIFJlc29sdmUgYW4gT1Mgc3BlY2lmaWMgKmZpbGVuYW1lKiB0byBhIG5vZGUuCisKKyogRmlsZSBTeXN0ZW0gVHlwZXMKKworLSBMb2NhbCBmaWxlLgorLSBIVFRQLgorLSBGVFAuCistIENsYXNzbG9hZGVyLCB1c2VzIENsYXNzbG9hZGVyLmdldFJlc291cmNlKCkuCistIFRlbXBvcmFyeSBmaWxlcy4KKy0gZXRjIC4uLgorCistIENvbXBvdW5kIGZpbGUgc3lzdGVtLiAgTWFkZSB1cCBvZiBhIGJ1bmNoIG9mIG1vdW50IHBvaW50cy4gIFRoZSBWRlMKK2l0c2VsZi4KKworLSBMYXllcmVkIGZpbGUgc3lzdGVtcyAodGhhdCBzaXQgb24gdG9wIG9mIGFub3RoZXIgZmlsZSBzeXN0ZW0gb3Igbm9kZSk6CisgIC0gemlwLCBiemlwLCBqYXIsIHRhcgorICAtIGZpbHRlcmluZyAtIHRva2VuIHJlcGxhY2VtZW50LCBldGMKKworLSBGYWN0b3JpZXMgZm9yIGNyZWF0aW5nIGFuZCBjb25maWd1cmluZyBmaWxlIHN5c3RlbSByb290IG5vZGVzLgorLSBBYmlsaXR5IHRvIGVhc2lseSBhZGQgbmV3IGZpbGUgc3lzdGVtIGltcGxlbWVudGF0aW9ucy4KKworKiBUYXNrIENvbnRhaW5lcgorCistIEEgbWVjaGFuaXNtIGZvciBhIHRhc2sgdG8gZ2V0IGhvbGQgb2YgdGhlIHByb2plY3QncyByb290IG5vZGUuCisKKy0gQSBtZWNoYW5pc20gdGhhdCBhbGxvd3MgYSB0YXNrIHRvIGNyZWF0ZSBpdHMgb3duIHByaXZhdGUgcm9vdCBub2RlcywKK3dpdGhvdXQgbGV0dGluZyBpdCBtZXNzIHdpdGggdGhlIHByb2plY3QncyBmaWxlIHN5c3RlbSwgb3IgdGhlIGZpbGUgc3lzdGVtcworb2Ygb3RoZXIgdGFza3MuCisKKy0gQSBtZWNoYW5pc20gZm9yIGNsZWFuaW5nIHVwIGFsbCB0aGUgbm9kZSBJbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtLCBSZWFkZXIKK2FuZCBXcml0ZXJzIG9wZW5lZCBieSBhIHRhc2sgZHVyaW5nIGl0cyBleGVjdXRlKCkgbWV0aG9kLiAgQ2xlYW5pbmcgdXAgZmlsZXMKK2lzIG9uZSB0aGluZyB0aGUgY3VycmVudCB0YXNrcyBkb24ndCBkbyB2ZXJ5IHdlbGwgYXQgYWxsLiAgU29tZXRoaW5nIGxpa2UKK3RoaXMgd291bGQgdGFrZSBjYXJlIG9mIGFueXRoaW5nIHRoZSB0YXNrIGRpZCBub3QgZXhwbGljdGx5IGNsb3NlLiAgV291bGQKK2luY2x1ZGUgcm9vdCBub2RlcyBpdCBjcmVhdGVkLgorCisqIE90aGVyIHRoaW5ncworCistIE1heWJlIHNvbWUgd2F5IHRvIGV4cGxpY2l0bHkgY2xvc2UgYSBub2RlIGFuZCByZWxlYXNlIGFsbCByZXNvdXJjZXMgdXNlZAorYnkgaXQuCisKKy0gTWF5YmUgZGV0ZWN0aW9uIG9mIGNvbmN1cnJlbnQgdXBkYXRlcywgaW4gdGhlIGNhc2Ugb2YgcGFyYWxsZWwgdGFza3MuCisKKy0gTmV0YmVhbnMgaGFzIGFuIGV2ZW50IG1vZGVsIGluIGl0cyBWRlMuICBTb21ldGhpbmcgbGlrZSB0aGlzIG1pZ2h0IGJlCit1c2VmdWwgaW4gZGVwZW5kZW5jeSBtYW5hZ2VtZW50LgorCistIG5vZGVzZXRzLiAgVGhlIHJlcGxhY2VtZW50IGZvciwgb3IgZ2VuZXJhbGlzYXRpb24gb2YsIEZpbGVTZXQsIFBhdGgsCitGaWxlTGlzdCwgZXRjCisgIC0gQSBub2Rlc2V0IHRoYXQgY29udGFpbnMgdGhlIGRlc2NlbmRlbnRzIG9mIGEgbm9kZSB0aGF0IG1hdGNoIGEgc2VsZWN0b3IKKyhsaWtlIHRoZSBjdXJyZW50IEZpbGVTZXQgaW1wbGVtZW50YXRpb24pLgorICAtIEEgbm9kZXNldCB0aGF0IGNvbnRhaW5zIGFyYml0cmFyeSBub2Rlcy4KKyAgLSBBbiBhZ2dyZWdhdGluZyBub2Rlc2V0LgorICAtIEN1c3RvbSBub2Rlc2V0IGltcGxlbWVudGF0aW9ucy4KKworLSBSZWltcGxlbWVudCB0aGUgQW50IDEgRmlsZXNldCwgUGF0aCBhbmQgRmlsZWxpc3QgYXMgYWRhcHRvcnMgc2l0dGluZyBvbgordG9wIG9mIHRoZSBWRlMuCisKKy0gQSBjbGFzc2xvYWRlciB0aGF0IGNhbiBsb2FkIGNsYXNzZXMgZnJvbSBhIG5vZGUuCisKKy0gZXRjIC4uCisKK1doYXQncyBtaXNzaW5nPyAgV2hhdCBzaG91bGRuJ3QgYmUgb24gdGhlIGxpc3Q/CisKKworQWRhbQorCis+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tCis+IEZyb206IE1hZ2VzaCBVbWFzYW5rYXIKKz4gU2VudDogU2F0dXJkYXksIDIyIERlY2VtYmVyIDIwMDEgMTA6NDQgQU0KKz4gVG86IGFudC1kZXZAamFrYXJ0YS5hcGFjaGUub3JnCis+IFN1YmplY3Q6IFZpcnR1YWwgRmlsZVN5c3RlbSBMYXllcgorPgorPgorPiBJIGhhdmUgYmVlbiBzcGVuZGluZyBzb21lIHRpbWUgbm93IG9uIHRoZSBWRlMKKz4gbGF5ZXIuLi4gIE5vdGhpbmcgbWFqb3IgdG8gcmVwb3J0IHlldCwgYnV0IEkganVzdCB3YW50ZWQKKz4gdG8gc291bmQgb2ZmIHNvIHRoYXQgaWYgSSBhbSBnb2luZyBkb3duIHRoZSB3cm9uZworPiByb3V0ZSwgSSBjb3JyZWN0IGl0IHJpZ2h0IGF3YXkuCis+Cis+IEkgZXZhbHVhdGVkIGF0IFdlYk5GUywgTmV0QmVhbnNGUyAoTkJGUykgYW5kCis+IEpOREkuCis+Cis+IDEuICBXZWJORlMgc2VlbXMgdG8gYmUgZ29pbmcgbm93aGVyZS4gIEl0IGhhcworPiBiZWVuIGRvcm1hbnQgZm9yIHF1aXRlIHNvbWV0aW1lIG5vdy4gIExpY2Vuc2luZworPiBpcyByaWdpZC4gIFRlY2huaWNhbGx5LCBpdCBkb2Vzbid0IGxvb2sgc28gYmFkIGFzIGl0Cis+IGNsb3NlbHkgcmVwbGljYXRlcyBqYXZhLmlvLkZpbGUncyBBUEkuICBCdXQgdGhlbiwKKz4gdGhhdCByZWFsbHkgZ2l2ZXMgdXMgdmVyeSBsaXR0bGUuCis+Cis+IDIuICBOQkZTIGxvb2tzIE9LLiAgSXQgaGFzIGdvdCBhIGZldyBmaWxlc3lzdGVtcworPiBhbHJlYWR5IGJ1aWx0LiAgVGhlcmUgbWF5IGJlIHNvbWUgbGljZW5zaW5nIGlzc3VlcywKKz4gSSBkb24ndCBrbm93LCBidXQgdGhhdCBzaG91bGRuJ3QgY29uY2VybiB1cyB0b28KKz4gbXVjaCBhcywgYWNjb3JkaW5nIHRvIFBldGVyLCBpdCBpcyBNb3ppbGxhIChJIGhhdmVuJ3QKKz4gcmVhbGx5IGNoZWNrIHRoZSBsaWNlbnNlIG91dCwgc29ycnkpLiAgQnV0LCBhcyBmYXIgYXMgSQorPiBjYW4gc2VlLCBpdCBzZWVtcyB0byBsYWNrIGluIHNvcGhpc3RpY2F0ZWQgQVBJIGZlYXR1cmVzCis+IGxpa2Ugc2VhcmNoaW5nIGJhc2VkIG9uIGF0dHJpYnV0ZXMsIGV0Yy4sIHdoaWNoCis+IHdlIHdpbGwgZGVmaW5pdGVseSBiZSBuZWVkaW5nIGZvciB0aGUgU2VsZWN0b3IgQVBJcy4KKz4KKz4gMy4gIEpOREksIGJ5IGZhciwgYmVhdHMgdGhlIGFib3ZlIHRvLCBpbiBteQorPiBldmFsdWF0aW9uLiAgSXQgaXMgZ2VuZXJpYyBlbm91Z2guICBXZSBkb24ndCBoYXZlCis+IGFueSBsaWNlbnNpbmcgaXNzdWVzLiAgSXQgaGFzIGFsc28gYmVjb21lIHBhcnQgb2YKKz4gdGhlIGNvcmUgSlJFICgxLjQgb253YXJkcykuICBUZWNobmljYWxseSwgaXQgZml0cyB0byBhIFQKKz4gd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgLSB2aXJ0dWFsIGZpbGUgc3lzdGVtIHRoYXQKKz4gcHJvdmlkZXMgc2VhcmNoIGNvbnRyb2xzLCBhY2Nlc3MgYXR0cmlidXRlcywKKz4gdXJsIG1vdW50aW5nLCBldGMuICBGdXJ0aGVybW9yZSwgdGhlcmUncyBiZWVuCis+IHNvbWUgZ3JvdW5kIHdvcmsgYWxyZWFkeSBkb25lIGZvciB1cyBhdCBKYWthcnRhL0FwYWNoZQorPiAoQ2F0YWxpbmEpLiAgSSBoYXZlIHdyaXR0ZW4gYSBTUEkgZm9yIGEgRlRQRmlsZVN5c3RlbQorPiAtIHRob3VnaCBpdCBpcyBpbiBhIHJlYWwgY3J1ZGUgc3RhZ2UgcmlnaHQgbm93LiAgSSBiZWxpZXZlCis+IHRoaXMgaXMgdGhlIHdheSB0byBnbyBiZWNhdXNlIEFudCdzIGNvZGUgd291bGQgYmUKKz4gb3BlcmF0aW5nIGF0IHRoZSAoRGlyKUNvbnRleHQgbGV2ZWwgYW5kIHdlIGNhbiBrZWVwCis+IGFkZGluZyBTUElzIGFzIHdlIG5lZWQgdGhlbS4gIEZ1cnRoZXJtb3JlLAorPiBKTkRJIGhhcyBiZWVuIHN0YWJsZSBmb3IgcXVpdGUgc29tZXRpbWUgbm93IGFuZAorPiB3ZSBjYW4gZGVwZW5kIG9uIGEgd2lkZWx5IHVzZWQgQVBJLgorPgorPiBJIGRvbid0IHRoaW5rIEpOREkgaXMgYSBoZWF2eXdlaWdodCBBUEkgZm9yIG91ciBuZWVkcy4KKz4gSXQgc2VlbXMgdG8gYmUgdGhlIG9ubHkgb25lLCBzbyBmYXIsIHdoaWNoIGVuY29tcGFzc2VzCis+IGF0IHRoZSBBUElQIGxldmVsLCBhbGwgdGhlIG5ldyBmdW5jdGlvbmFsaXRpZXMgdGhhdCB3ZQorPiBkZXNpcmUgdG8gaW50cm9kdWNlLgorPgorPiBMZXQgbWUga25vdyBpZiBteSBhcHByb2FjaCwgc28gZmFyLCB0byBnbyB0aGUgSk5ESQorPiByb3V0ZSBzZWVtcyByZWFzb25hYmxlLgorPgorPiBDaGVlcnMsCis+IE1hZ2VzaAorPgorPgorPgorPgorPiAtLQorPiBUbyB1bnN1YnNjcmliZSwgZS1tYWlsOiAgIDxtYWlsdG86YW50LWRldi11bnN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc+Cis+IEZvciBhZGRpdGlvbmFsIGNvbW1hbmRzLCBlLW1haWw6IDxtYWlsdG86YW50LWRldi1oZWxwQGpha2FydGEuYXBhY2hlLm9yZz4KKworCistLQorVG8gdW5zdWJzY3JpYmUsIGUtbWFpbDogICA8bWFpbHRvOmFudC1kZXYtdW5zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnPgorRm9yIGFkZGl0aW9uYWwgY29tbWFuZHMsIGUtbWFpbDogPG1haWx0bzphbnQtZGV2LWhlbHBAamFrYXJ0YS5hcGFjaGUub3JnPgorCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvYW50Mi9hY3Rpb25saXN0Lmh0bWwgYi90cnVuay9kb2NzL2FudDIvYWN0aW9ubGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzkyYTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2FudDIvYWN0aW9ubGlzdC5odG1sCkBAIC0wLDAgKzEsNDkyIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+PHRpdGxlPkFudDEuOSBBY3Rpb24gTGlzdDwvdGl0bGU+PC9oZWFkPgorICA8Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KKyAgPGNlbnRlcj4KKyAgICA8aDE+QW50MS45IEFjdGlvbiBMaXN0PC9oMT4KKyAgICA8aDI+UHJlY3Vyc29yIHRvIEFudDI8L2gyPgorICAgIDxpPlBldGVyIERvbmFsZCBbPGEgaHJlZj0ibWFpbHRvOnBldGVyIGF0IGFwYWNoZS5vcmciPnBldGVyIGF0IGFwYWNoZS5vcmc8L2E+XTwvaT4KKyAgPC9jZW50ZXI+CisKKyAgPGRpdiBhbGlnbj0iY2VudGVyIj4KKyAgPHRhYmxlIHdpZHRoPSI4MCUiPjx0cj48dGQ+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+CisgICAgICBUaGlzIGRvY3VtZW50IGFpbXMgdG8gY29udGFpbiBhIGxpc3Qgb2YgYWN0aW9ucyB0aGF0IHBlb3BsZSBjYW4gdGFrZQorICAgICAgdG8gcHJvZHVjZSBBbnQxLjkuIEFudDEuOSBpcyBhIHJlZmFjdG9yaW5nIG9mIHRoZSBBbnQxLnggbGluZSBhbmQgYSBqdW1wCisgICAgICBwb2ludCBmb3IgQW50Mi4gU29tZSBjaGFuZ2VzIHdpbGwgYmUgYmFja3BvcnRlZCB0byBBbnQxLnggb3ZlciB0aW1lIHdoZW4gCisgICAgICB0aGV5IGhhdmUgcHJvdmVuIHRoZW1zZWx2ZXMgd2hpbGUgb3RoZXIgY2hhbmdlcyBtYXkgb25seSBiZWNvbWUgYXZhaWxhYmxlCisgICAgICB2aWEgQW50Mi4wLiBBbnQxLjkgaXMgb3VyIG1lbHRpbmcgcG90IHdoZXJlIHdlIGNhbiBleHBlcmltZW50IGFuZCByZWZhY3RvciAKKyAgICAgIHdpdGhvdXQgYSB0aG91Z2h0IHRvIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5IGJ1dCBvbmx5IHRvIHRoZSAicmlnaHQiIHdheSAKKyAgICAgIG9mIGRvaW5nIHRoaW5ncy4KKyAgICA8L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKyAgPC9kaXY+CisKKyAgPGgyPkludHJvZHVjdGlvbjwvaDI+CisKKyAgPGJsb2NrcXVvdGU+CisgICAgPHA+CisgICAgICBUaGlzIGRvY3VtZW50IHdpbGwgbGlzdCBhIGJ1bmNoIG9mIGFjdGlvbnMgdGhhdCB3aWxsIGd1aWRlIHVzIGluIHRoZSBldm9sdXRpb24gCisgICAgICBvZiBBbnQxLnggYW5kIHByb3ZpZGUgYSBzb2xpZCBiYXNpcyBvbiB3aGljaCB0byBsYXVuY2ggQW50Mi4wLiBGZWVsIGZyZWUgdG8gYWRkIHRvIAorICAgICAgdGhpcyBsaXN0IG9mIGFjdGlvbnMgYXMgb3VyIHZpc2lvbiBvZiBBbnQyIHNvbGlkaWZpZXMuIEFzc29jaWF0ZWQgd2l0aCBlYWNoIGFjdGlvbgorICAgICAgaXMgYSBsaXN0IG9mIHZpY3RpbXMgd2hvIGhhdmUgInZvbHVudGVlcmVkIiB0byBoYXZlIGEgZ28gYXQgdGhlIGFjdGlvbiBhbmQgYSBzdGF0dXMuCisgICAgICBUaGUgc3RhdHVzIGp1c3QgdGVsbHMgdXMgd2hlcmUgdGhleSBhcmUgYXQgd2hpbGUgdGhlIHZpY3RpbSBjb2x1bW4gd2lsbCB0ZWxsIHVzIGV4YWN0bHkKKyAgICAgIHdobyBpcyBkb2luZyB3aGF0LiBJdCBpcyBmaW5lIGZvciBhIGdyb3VwIG9mIHBlb3BsZSB0byB3b3JrIG9uIGEgc2luZ2xlIGFyZWEuCisgICAgPC9wPgorICAgIDxiciAvPgorICAgIDxiciAvPgorICAgIDxiciAvPgorICAgIDxkaXYgYWxpZ249ImNlbnRlciI+CisgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iNSIgd2lkdGg9IjgwJSI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiBhbGlnbj0iY2VudGVyIj5BY3Rpb248L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgYWxpZ249ImNlbnRlciI+VmljdGltczwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiBhbGlnbj0iY2VudGVyIj5TdGF0dXM8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiN2ZnMiPkNyZWF0ZSBhIFZpcnR1YWwgRmlsZXN5c3RlbSBsYXllcjwvYT48L3RkPgorICAgICAgICA8dGQ+Tm9uZTwvdGQ+CisgICAgICAgIDx0ZD5Ob3QgU3RhcnRlZDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI25hbWluZyI+Rm9ybWFsaXplIGEgbmFtaW5nIHNjaGVtZSBmb3IgdGFzayBhdHRyaWJ1dGVzL2VsZW1lbnRzPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPk5vdCBTdGFydGVkPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjc2VsZWN0b3IiPkRlc2lnbiBhbmQgaW1wbGVtZW50IHMgU2VsZWN0b3IgQVBJIGZvciBGaWxlc2V0cyBhbmQgb3RoZXIgSXRlbXNldHM8L2E+PC90ZD4KKyAgICAgICAgPHRkPk5vbmU8L3RkPgorICAgICAgICA8dGQ+Tm90IFN0YXJ0ZWQ8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiNjb2xvcmluZyI+RGV2ZWxvcGUgdGhlIGluZnJhc3RydWN0dXJlIGZvciBjb2xvcmluZyAob3IgImVudmlyb25tZW50YWwiIGRlcGVuZGVuY3kgYW5hbHlzaXMpPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPk5vdCBTdGFydGVkPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjc3RydWN0dXJhbCI+RGV2ZWxvcGUgdGhlIGluZnJhc3RydWN0dXJlIGZvciBzdHJ1Y3R1cmFsIGRlcGVuZGVuY3kgYW5hbHlzaXM8L2E+PC90ZD4KKyAgICAgICAgPHRkPk5vbmU8L3RkPgorICAgICAgICA8dGQ+Tm90IFN0YXJ0ZWQ8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiNleGVjIj5SZWZhY3RvciB0aGUgRXhlYyBpbmZyYXN0cnVjdHVyZSBpbnRvIEphdmFCZWFuczwvYT48L3RkPgorICAgICAgICA8dGQ+UGV0ZXIgRG9uYWxkPC90ZD4KKyAgICAgICAgPHRkPjgwJTwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI2phdmEiPlJlZmFjdG9yIHRoZSBKYXZhIGluZnJhc3RydWN0dXJlIGludG8gSmF2YUJlYW5zPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPk5vdCBTdGFydGVkPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjZmFjYWRlIj5EZXNpZ24gYW5kIGltcGxlbWVudCBhIGdlbmVyaWMgc29sdXRpb24gZm9yIGNyZWF0aW5nIFRhc2sgZmFjYWRlczwvYT48L3RkPgorICAgICAgICA8dGQ+Tm9uZTwvdGQ+CisgICAgICAgIDx0ZD5Ob3QgU3RhcnRlZDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI3BhY2thZ2luZyI+U2tldGNoIG91dCBhIGJhc2ljIHdheSBvZiBzZXBhcmF0aW5nIGFsbCB0aGUgdGFza3MgaW50byB0eXBlIGxpYnJhcmllczwvYT48L3RkPgorICAgICAgICA8dGQ+Tm9uZTwvdGQ+CisgICAgICAgIDx0ZD5Ob3QgU3RhcnRlZDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI21hcHBlcmV4dCI+RGVzaWduIGFuZCBpbXBsZW1lbnQgYW4gQVBJIHRoYXQgYWxsb3dzIG1hcHBpbmcgb2YgZmlsZSBhdHRyaWJ1dGVzIGR1cmluZyBjb3B5L21vdmUvZXRjIHRhc2tzPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPk5vdCBTdGFydGVkPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjZmlsdGVycyI+RGVzaWduIGFuZCBpbXBsZW1lbnQgYW4gQVBJIHNvIHRoYXQgRmlsdGVycyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBGaWx0ZXJlZE91dHB1dFN0cmVhbXM8L2E+PC90ZD4KKyAgICAgICAgPHRkPk5vbmU8L3RkPgorICAgICAgICA8dGQ+Tm90IFN0YXJ0ZWQ8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiNjYXRhbG9nIj5EZXNpZ24gYW5kIGltcGxlbWVudCBhIFhNTCAiY2F0YWxvZyIgc28gdGhlIHNuaXBwZXRzIG9mIFhNTCBjYW4gYmUgaW5qZWN0ZWQgYmFzZWQgb24gVVJJIHJhdGhlciB0aGFuIHJlbGF0aXZlIGxvY2F0aW9uPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPk5vdCBTdGFydGVkPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjaTE4biI+TG9vayBhdCB0aGUgZmVhc2FiaWxpdHkgb2YgaTE4bidpbmcgdGFza3MgYW5kIHRoZSBydW50aW1lPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPk5vdCBTdGFydGVkPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjZG9jbyI+V3JpdGUgYSBkb2N1bWVudCBkZXNjcmliaW5nIHRoZSB3YXkgdGhhdCB0YXNrcyBzaG91bGQgYmUgd3JpdHRlbiBpbiBjb250ZXh0IG9mIEFudDI8L2E+PC90ZD4KKyAgICAgICAgPHRkPlBldGVyIERvbmFsZDxiciAvPihwZXRlciBhdCBhcGFjaGUub3JnKTwvdGQ+CisgICAgICAgIDx0ZD5Ob3QgU3RhcnRlZDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI2VtYmVkZG9yIj5EZXNpZ24gYW4gQVBJIHRvIGVtYmVkIEFudCBpbnRvIG90aGVyIGFwcGxpY2F0aW9uczwvYT48L3RkPgorICAgICAgICA8dGQ+Tm9uZTwvdGQ+CisgICAgICAgIDx0ZD5Ob3QgU3RhcnRlZDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI2luZm8iPkRlc2lnbiBhIFR5cGVJbmZvIHN5c3RlbSBzaW1pbGFyIHRvIEJlYW5JbmZvIHRvIGRlc2NyaWJlIFRhc2tzPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPk5vdCBTdGFydGVkPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjYW50ZG9jIj5EZXNpZ24gQW50ZG9jIHRvIGdlbmVyYXRlIG1hbnVhbCBmcm9tIC5qYXZhIGZpbGVzPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Ob25lPC90ZD4KKyAgICAgICAgPHRkPk5vdCBTdGFydGVkPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8L2Rpdj4KKyAgPC9ibG9ja3F1b3RlPgorCisgIDxoMz5WaXJ0dWFsIEZpbGUgU3lzdGVtPC9oMz4KKyAgPGEgbmFtZT0idmZzIiAvPgorICA8YmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRoZXJlIGhhcyBsb25nIGJlZW4gYSByZWNvZ25pdGlvbiB0aGF0IGl0IHdvdWxkIGJlIG5pY2UgaWYgYW50IHN1cHBvcnRlZCBzb21lIAorICAgICAgbm90aW9uIG9mIGEgdmlydHVhbCBmaWxlc3lzdGVtIGxheWVyLiBUaGlzIGxheWVyIHdvdWxkIGFsbG93IHlvdSB0byB0cmVhdCAKKyAgICAgIHJlc291cmNlcyBsb2NhdGVkIGFuZCByZXRyaWV2ZWQgZnJvbSBkaWZmZXJlbnQgbWVjaGFuaXNtcyBpbiBhIHVuaWZvcm0gd2F5LgorICAgICAgRm9yIGluc3RhbmNlIGl0IHdvdWxkIGFsbG93IHRoZSBjb3B5IHRhc2sgdG8gY29weSBmcm9tIGEgaHR0cCBzZXJ2ZXIsIGEgY3ZzIHNlcnZlciwKKyAgICAgIGEgZnRwIHNlcnZlciBvciB0aGUgbG9jYWwgZmlsZXN5c3RlbSB1c2luZyBhIHVuaWZvcm0gbWVjaGFuaXNtLiBTbyBpbnN0ZWFkIG9mCisgICAgICBoYXZpbmcgc2VwYXJhdGUgdGFza3MgdG8gb3BlcmF0ZSBvbiBlYWNoIGRpZmZlcmVudCByZXNvdXJjZSB0eXBlIHdlIHdvdWxkIHVzZQorICAgICAganVzdCBvbmUgdGFzayB0aGF0IHBsdWdnZWQgaW50byBtdWx0aXBsZSBmaWxlc3lzdGVtcy4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBXaGVuIHdlIGFyZSB0YWxraW5nIGFib3V0IGEgdmlydHVhbCBmaWxlc3lzdGVtIG9yIFZGUywgb25lIG9mIHRoZSBjb25jZXJucyB3ZSBtdXN0IAorICAgICAgYWRkcmVzcyBpcyBob3cgdG8gIm5hbWUiIHRoZSByZXNvdXJjZS4gSW4gbW9zdCBjYXNlcyBhIFVSTCBvciBVUkkgc3R5bGUgYWNjZXNzIHdpbGwgCisgICAgICBiZSBzdWZmaWNpZW50IGJ1dCBpbiBvdGhlciBjYXNlcyB3ZSBtYXkgbmVlZCB0byBjb25zaWRlciBvdGhlciBvcHRpb25zLiBTbyAKKyAgICAgICJjdnM6Ly9sb2NhbGhvc3Q6L2hvbWUvY3ZzL2pha2FydGEtYXZhbG9uL1JFQURNRS50eHQ/dmVyc2lvbj0xLjEiLCAKKyAgICAgICJmdHA6Ly9zb21lLnNlcnZlci5jb20vZGlyL2ZpbGUuemlwIiBhbmQgImZpbGU6Ly9DL1dJTkRPV1MvRGVza3RvcC9NeUZpbGUudHh0IgorICAgICAgYXJlIGFsbCBleGFtcGxlcyBvZiByZWZlcnJpbmcgdG8gZGlmZmVyZW50IHJlc291cmNlcy4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBBbm90aGVyIGNvbmNlcm4gdGhhdCBtdXN0IGJlIGFkZHJlc3NlZCBpcyBjYXBhYmlsaXRpZXMgb2YgYm90aCB0aGUgcmVzb3VyY2VzIGFuZAorICAgICAgdGhlIGZpbGVzeXN0ZW0uIEZvciBpbnN0YW5jZSBpdCBpcyBwb3NzaWJsZSB0byBib3RoIHJlYWQgYW5kIHdyaXRlIHRvIHJlc291cmNlcworICAgICAgdXNpbmcgdGhlICJmaWxlIiBwcm90b2NvbCBidXQgb25seSBwb3NzaWJsZSB0byB3cml0ZSByZXNvdXJjZXMgdXNpbmcgIm1haWx0byIuCisgICAgICBUaGUgYWN0IG9mIGNvcHlpbmcgYSBmaWxlIHRvIGEgIm1haWx0byIgdXJsIHdvdWxkIGFjdHVhbGwgcG9zdCB0aGUgZmlsZXMgYXMgCisgICAgICByZXNvdXJjZXMgd2hpbGUgY29weWluZyB0byBhICJmaWxlIiB3b3VsZCBkdXBsaWNhdGUgdGhlIHJlc291cmNlIHNvbWV3aGVyZSBvbiAKKyAgICAgIHRoZSBsb2NhbCBmaWxlc3lzdGVtLiAKKyAgICA8L3A+CisgICAgPHA+CisgICAgICBTbyB3ZSBuZWVkIHRvIGRldGVybWluZSBhIGxpc3Qgb2YgY2FwYWJpbGl0aWVzLiBTb21lIGV4YW1wbGVzIHdvdWxkIGJlICJyZWFkIiwgCisgICAgICAid3JpdGUiLCAibGlzdCIgKGNhbiB5b3UgbGlzdCBkaXJzKSwgInR5cGUiIChjYW4geW91IGdldCBtaW1lIHR5cGUpLCAKKyAgICAgICJhY2Nlc3MgcGVybWlzc2lvbnMiIChjYW4geW91IHRlbGwgaWYgcmVzb3VyY2UgaGFzIHBlcm1pc3Npb25zKSwgCisgICAgICAibW9kaWZ5IHBlcm1pc3Npb25zIiAoY2FuIHlvdSBtb2RpZnkgcGVybWlzc2lvbnMpIGV0Yy4gU29tZSBvZiB0aGVzZSBjYXBhYmlsaXRpZXMKKyAgICAgIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcnRpY3VsYXIgcmVvc3VyY2VzLCB3aGlsZSBvdGhlcnMgbWF5IG5lZWQgdG8gYmUgCisgICAgICBhc3NvY2lhdGVkIHdpdGggYSB3aG9sZSBmaWxlc3lzdGVtL3Byb3RvY29sIChpZSB0aGVyZSBpcyBubyBzdGFuZGFyZCBtZWNoYW5pc20KKyAgICAgIHRvIHBlcmZvcm0gImxpc3QiIG9uIGdlbmVyYWwgImh0dHAiIFVSTHMpLiBUaHVzIGEgbGlzdCBvZiBhbGwgdGhlc2UgY2FwYWJpbGl0aWVzCisgICAgICBhbmQgbWFwcGluZyB0byB2YXJpb3VzIHByb3RvY29scyB3aWxsIG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgTmV4dCB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3VwcG9ydCB0aGUgbm90aW9uIG9mICJtb3VudGluZyIKKyAgICAgIFVSTHMuIEZvciBpbnN0YW5jZSBpZiB3ZSBuZWVkIHRvIGNvcHkgZmlsZXMgZnJvbSBhIEZUUCBzZXJ2ZXIgZG8gd2UgYWxsd2F5cworICAgICAgbmVlZCB0byBzcGVjaWZ5IHRoZSBmdWxsIFVSTCAtIG5vIG1hdHRlciBob3cgY29udm9sdXRlZCBpdCBpcyAoaWUKKyAgICAgICJmdHA6Ly9mcmVkOnNlY3JldEBzb21lLnNlcnZlci5jb206Mjg3NjMvaG9tZS9mcmVkL3Byb2plY3QyL2Rpci9maWxlLnppcCIpCisgICAgICBvciBjYW4gd2UgbW91bnQgdGhpcyBvbiBhIFZGUyBhbmQgYWNjZXNzIGl0IHZpYSB0aGF0IHNob3J0ZXIgdXJsLiBpZSBXZSBjb3VsZCAKKyAgICAgIG1vdW50ICJmdHA6Ly9mcmVkOnNlY3JldEBzb21lLnNlcnZlci5jb206Mjg3NjMvaG9tZS9mcmVkLyIgb250byAidmZzOi9ob21lIiAKKyAgICAgIGFuZCB0aGVuIGp1c3QgYWNjZXNzIHRoZSByZXNvdXJjZXMgdmlhICJ2ZnM6L2hvbWUvcHJvamVjdDIvZGlyL2ZpbGUuemlwIi4KKyAgICAgIFRoaXMgd291bGQgbWFrZSBkZWFsaW5nIHdpdGggbGFyZ2UgdXJscyBlYXNpZXIgYW5kIG1vcmUgdW5pZm9ybS4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBTbyBhZnRlciB3ZSBoYXZlIGRlY2lkZWQgd2hhdCBvdXIgb3B0aW9ucyBhcmUgd2UgbmVlZCB0byBhY3R1YWxseSBnbyBhYm91dAorICAgICAgaW1wbGVtZW50aW5nIHRoZSBzb2x1dGlvbi4gSXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgZXhpc3RpbmcgVkZTIHNvbHV0aW9ucworICAgICAgY291bGQgYmUgcmV1c2VkIHdpdGggbWlub3IgY2hhbmdlcyBhbmQgdGh1cyB3ZSBjb3VsZCBzYXZlIG91cnNlbHZlcyBhIGxvdCBvZiAKKyAgICAgIHdvcmsuIENhbmRpZGF0ZXMgd291bGQgYmUgdGhlIE5ldGJlYW5zIFZGUywgU3VucyBYRmlsZSBBUEkgb3Igb3RoZXIgCisgICAgICBhdmFpbGFibGUgZGlyZWN0b3J5IEFQSXMgKGxpa2UgSk5ESSkuIElmIG5vbmUgb2YgdGhlbSBzdWl0IHRoZW4gd2Ugd2lsbCBuZWVkIAorICAgICAgdG8gd3JpdGUgb3VyIG93biBsYXllci4KKyAgICA8L3A+CisgIDwvYmxvY2txdW90ZT4KKworICA8aDM+TmFtaW5nPC9oMz4KKyAgPGEgbmFtZT0ibmFtaW5nIiAvPgorICA8YmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIEN1cnJlbnRseSBBbnQgaGFzIGEgbWl4dHVyZSBvZiB0YXNrcyBmcm9tIHZhcmlvdXMgc3RhZ2VzIGl0J3MgZXZvbHV0aW9uLCB3aXRoIGRpZmZlcmVudAorICAgICAgYXV0aG9ycyBhbmQgZWFjaCB1dGlsaXppbmcgZGlmZmVyZW50IG5hbWluZyBwYXR0ZXJucy4gU29tZSB0YXNrcyB1c2UgbmFtZXMgc3VjaCBhcworICAgICAgInNyYyIgYW5kICJkZXN0IiB3aGlsZSBvdGhlcnMgdXNlICJmaWxlIiBhbmQgInRvZmlsZSIuIEl0IHdvdWxkIGJlIHByZWZlcnJhYmxlIGlmIAorICAgICAgY29uc2lzdGVudCBuYW1pbmcgcGF0dGVybnMgd2VyZSB1c2VkLiBJdCBpcyByZWNvbWVuZGVkIHRoYXQgd2UgY29tZSB1cCB3aXRoIGEgImJlc3QKKyAgICAgIHByYWN0aWNlcyIgZG9jdW1lbnQgdG8gZG9jdW1lbnQgb3VyIHJlY29tZW5kZWQgbmFtaW5nIHBhdHRlcm5zLgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIEJlZm9yZSB3ZSBjYW4gY29tZSB1cCB3aXRoIHN1Y2ggYSBkb2N1bWVudCB3ZSBuZWVkIHRvIGlkZW50aWZ5IGNvbW1vbiBwYXR0ZXJucyB0aHJvdWdoCisgICAgICBvdXQgdGhlIHRhc2tzLiBTZXZlcmFsIHRhc2tzIGhhdmUgdGhlIG5vdGlvbiBvZiB0cmFuc2Zvcm1pbmcgaW5wdXQgZnJvbSBhICJzb3VyY2UiCisgICAgICB0byBhICJkZXN0aW5hdGlvbiIuIFNvIHdlIHNob3VsZCBoYXZlIGNvbnNpc3RlbnQgbmFtaW5nIHNjaGVtZXMgZm9yIHRoZXNlIGF0dHJpYnV0ZXMgYW5kIAorICAgICAgZWxlbWVudHMuIEFuYWx5c2lzIG9mIGV4aXN0aW5nIHRhc2tzIHdpbGwgbGlrZWx5IGJyaW5nIG91dCBvdGhlciBzaW1pbGFyIHBhdHRlcm5zLiBPbmNlCisgICAgICB3ZSBoYXZlIGlkZW50aWZpZWQgYW5kIGRvY3VtZW50ZWQgdGhlc2Ugc2ltaWxhcml0aWVzIHRoZW4gd2UgY2FuIGVzdGFibGlzaCBjb252ZW50aW9ucy4KKyAgICA8L3A+CisgIDwvYmxvY2txdW90ZT4KKworICA8aDM+U2VsZWN0b3IgQVBJPC9oMz4KKyAgPGEgbmFtZT0ic2VsZWN0b3IiIC8+CisgIDxibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgQ3VycmVudGx5IG91ciBmaWxlc2V0cyBhbGxvdyB1cyB0byBzZWxlY3QgYSBzZXQgb2YgZmlsZXMgYmFzZWQgb24gbmFtZSBwYXR0ZXJucy4KKyAgICAgIEZvciBpbnN0YW5jZSB3ZSBjb3VsZCBjcmVhdGUgYSBzZXQgb2YgYWxsIHRoZSBmaWxlcyB0aGF0IGVuZCB3aXRoICIuamF2YSIuIEhvd2V2ZXIKKyAgICAgIHRoZXJlIGFyZSBjYXNlcyB3aGVuIHlvdSB3aXNoIHRvIHNlbGVjdCBmaWxlcyBiYXNlZCBvbiB0aGVpciBvdGhlciBhdHRyaWJ1dGVzLCBzdWNoIGFzIAorICAgICAgaWYgdGhleSBhcmUgcmVhZCBvbmx5IG9yIGlmIHRoZXkgYXJlIG9sZGVyIHRoYW4gYSBzcGVjaWZpZWQgZGF0ZSBldGMuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgVGhlIHNlbGVjdG9yIEFQSSBpcyBvbmUgc3VjaCBtZWNoYW5pc20gdG8gZG8gdGhpcy4gVGhlIHNlbGVjdG9yIEFQSSB3aWxsIGFsbG93IHlvdSB0byAKKyAgICAgIGJ1aWxkIGZpbGUgc2V0cyBiYXNlZCBvbiBjcml0ZXJpYSBvdGhlciB0aGFuIG5hbWUuIFNvbWUgcG9zc2libGUgY3JpdGVyaWEgd291bGQgYmUKKyAgICA8L3A+CisgICAgPHVsPgorICAgICAgPGxpPklzIHRoZSBmaWxlIHJlYWRhYmxlPzwvbGk+IAorICAgICAgPGxpPklzIHRoZSBmaWxlIHdyaXRlYWJsZT88L2xpPiAKKyAgICAgIDxsaT5XaGF0IGRhdGUgd2FzIHRoZSBmaWxlIG1vZGlmaWVkIG9uPzwvbGk+IAorICAgICAgPGxpPldoYXQgc2l6ZSBpcyB0aGUgZmlsZT88L2xpPiAKKyAgICAgIDxsaT5Eb2VzIHRoZSBjb250ZW50cyBjb250YWluIHRoZSBzdHJpbmcgIm1hZ2ljIj88L2xpPiAKKyAgICA8L3VsPgorICAgIDxwPgorICAgICAgSWYgd2UgZW5kIHVwIHN1cHBvcnRpbmcgYSBWRlMgdGhlbiB3ZSBjb3VsZCBleHBhbmQgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgCisgICAgICBjb25zaWRlcmFibHkuIEEgbW9jayByZXByZXNlbnRhdGlvbiB0aGF0IGhhcyBiZWVuIHByb3Bvc2VkIGJlZm9yZSBpcyB0aGUgZm9sbG93aW5nLiAKKyAgICAgIE9mIGNvdXJzZSB0aGlzIGlzIHN1YmplY3QgdG8gY2hhbmdlIGFzIHNvb24gYXMgc29tZW9uZSB3YW50cyB0byB0YWNrbGUgdGhpcyBhY3Rpb24gOykKKyAgICA8L3A+Cis8cHJlPiAKKyAmbHQ7aW5jbHVkZSZndDsKKyAgICZsdDtzZWxlY3RvciB0eXBlPSJuYW1lIiB2YWx1ZT0iKiovKi5qYXZhIi8mZ3Q7CisgICAmbHQ7c2VsZWN0b3IgdHlwZT0icGVybWlzc2lvbiIgdmFsdWU9InIiLyZndDsKKworICAgJmx0OyEtLSBjb3VsZCBvcHRpb25hbGx5IGJlIGRpcmVjdG9yeS9vciBzb21lIG90aGVyIHN5c3RlbSBzcGVjaWZpYyBmZWF0dXJlcyAtLSZndDsKKyAgICZsdDtzZWxlY3RvciB0eXBlPSJ0eXBlIiB2YWx1ZT0iZmlsZSIvJmd0OyAKKyAgICZsdDtzZWxlY3RvciB0eXBlPSJtb2RpZnktdGltZSIgCisgICAgICAgICAgICAgb3BlcmF0aW9uPSJncmVhdGVyLXRoYW4iIAorICAgICAgICAgICAgIHZhbHVlPSIyOXRoIEZlYiAyMDAzIi8mZ3Q7CisgJmx0Oy9pbmNsdWRlJmd0OworPC9wcmU+CisgIDwvYmxvY2txdW90ZT4KKworICA8aDM+Q29sb3JpbmcgQVBJPC9oMz4KKyAgPGEgbmFtZT0iY29sb3JpbmciIC8+CisgIDxibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgV2hlbiB5b3UgZXhlY3V0ZSBhIHRhc2sgc3VjaCBhcyAiamF2YWMiIHRoZXJlIGlzIHR3byB0eXBlcyBvZiBkZXBlbmRlbmN5IGluZm9ybWF0aW9uCisgICAgICB0aGF0IGlzIGltcG9ydGFudCB0byBhbmFseXplIGJlZm9yZSB3ZSBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byByZWNvbXBpbGUgYSBmaWxlLiBTYXkKKyAgICAgIHdlIGFyZSBjb21waWxpbmcgPGNvZGU+Rm9vLmphdmE8L2NvZGU+LCBpdCBtYXkgZGVwZW5kIG9uIHRoZSA8Y29kZT5CYXIuamF2YTwvY29kZT4KKyAgICAgIGZpbGUuIFdlIGNhbGwgdGhpcyAic3RydWN0dXJhbCIgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiAtIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHNvdXJjZSBmaWxlIAorICAgICAgZGV0ZXJtaW5lcyB3aGF0IG90aGVyIGZpbGVzIGl0IGRlcGVuZCB1cG9uLiBIb3dldmVyIHRoZXJlIGlzIGFsc28gImVudmlyb25tZW50YWwiIAorICAgICAgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4gRm9yIGluc3RhbmNlIGlmIHRoZSA8Y29kZT5Gb28uamF2YTwvY29kZT4gZmlsZSB3YXMgY29tcGlsZWQgd2l0aCAKKyAgICAgIDxjb2RlPmRlYnVnPSJ0cnVlIjwvY29kZT4gbGFzdCBydW4gYW5kIHRoaXMgdGltZSBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoIAorICAgICAgPGNvZGU+ZGVidWc9ImZhbHNlIjwvY29kZT4gdGhlbiBpdCBpcyBvdXQgb2YgZGF0ZSBhbmQgbmVlZHMgdG8gYmUgcmVjb21waWxlZC4gV2UgY2FsbCB0aGlzIAorICAgICAgImVudmlyb25tZW50YWwiIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gImNvbG9yaW5nIi4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBTbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBpbmZyYXN0cnVjdHVyZSB0aGF0IGFsbG93cyB0YXNrcyB0byBtYW5hZ2UgImNvbG9yaW5nIi4gU28gYSB0YXNrCisgICAgICBzaG91bGQgYmUgYWJsZSB0byBhZGQgY29sb3JpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggcmVzb3VyY2UgcHJvY2Vzc2VkLiBXaGVuIHRoZSB0YXNrCisgICAgICBjb21lcyB0byBwcm9jZXNzIHRoZSByZXNvdXJjZSBhZ2FpbiBpdCB3aWxsIGRldGVjdCBpZiB0aGUgY29sb3JpbmcgaGFzIGNoYW5nZWQgYW5kIGlmIGl0CisgICAgICBoYXMgd2lsbCBmb3JjZSBhIHJlY29tcGlsZS4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBBbiBBUEkgZm9yIHN1Y2ggYSBiZWFuIGhhcyB5ZXQgdG8gYmUgZXN0YWJsaXNoZWQgYnV0IGFuIGV4YW1wbGUgQVBJIHdvdWxkIGJlLgorICAgIDwvcD4KKyAgICA8cHJlPgorQ29sb3JpbmdNYW5hZ2VyIGNtID0gLi4uOworY20uYWRkQ29sb3IoICJkZWJ1ZyIsICJ0cnVlIiApOworY20uYWRkQ29sb3IoICJvcHRpbWl6ZSIsICJmYWxzZSIgKTsKK2NtLnNldEZpbGVTZXQoIG15RmlsZVNldCApOworRmlsZVtdIGZpbGVzID0gY20uZ2V0T3V0T2ZEYXRlKCk7CisgICAgPC9wcmU+CisgIDwvYmxvY2txdW90ZT4KKworICA8aDM+U3RydWN0dXJhbCBEZXBlbmRlbmN5IFV0aWxzPC9oMz4KKyAgPGEgbmFtZT0ic3RydWN0dXJhbCIgLz4KKyAgPGJsb2NrcXVvdGU+CisgICAgPHA+CisgICAgICBJbiB0aGUgcHJlc2VudCBhbnQsIGl0IGlzIHJlcXVpcmVkIHRoYXQgZWFjaCB0YXNrIG1hbmFnZSBkZXBlbmRlbmN5IHNlcGFyYXRlbHkuIAorICAgICAgVGhpcyBtYWtlcyBpdCBhIGxvdCBvZiB3b3JrIHRvIGltcGxlbWVudCBldmVuIHNpbXBsZSBkZXBlbmRlbmN5IGNoZWNraW5nLiBUbyB0aGlzCisgICAgICBkYXkgbWFueSBvZiB0aGUgY29yZSB0YXNrcyBkbyBub3QgaW1wbGVtZW50IGl0IGNvcnJlY3RseS4gSSBhbSBzcGVjaWZpY2FsbHkKKyAgICAgIHRhbGtpbmcgYWJvdXQgInN0cnVjdHVyYWwiIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uIFRoZSBtYWluIHJlYXNvbiBpcyB0aGF0IGl0IGlzCisgICAgICBwYWluZnVsIHRvIGltcGxlbWVudC4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBTb21lIHRhc2tzIGRvIG5vIGRlcGVuZGVuY3kgY2hlY2tpbmcgYW5kIHdpbGwgcmVjb21waWxlL3RyYW5zZm9ybS9ldGMgZXZlcnl0aW1lLiAKKyAgICAgIE90aGVycyBtYXkgcGVyZm9ybSBhIHNpbXBsZSBkZXBlbmRlbmN5IGNoZWNraW5nIChpZSBpZiBzb3VyY2UgZmlsZSBpcyBuZXdlciB0aGFuIAorICAgICAgZGVzdGluYXRpb24gZmlsZSB0aGVuIHJlY29tcGlsZSkuIElkZWFsbHkgYSBkZXBlbmRlbmN5IHN5c3RlbSB3b3VsZCBhY3R1YWxseQorICAgICAgY2FsY3VsYXRlIHRoZSBkZXBlbmRlbmNpZXMgY29ycmVjdGx5LiBTbyB3ZSBuZWVkIHRvIGhhdmUgc29tZSBtZWNoYW5pc20gdG8gZGV0ZXJtaW5lCisgICAgICB0aGF0IDxjb2RlPmZvby5jPC9jb2RlPiBhY3R1YWxseSBkZXBlbmRzIHVwb24gPGNvZGU+Zm9vLmg8L2NvZGU+LCA8Y29kZT5iYXIuaDwvY29kZT4gCisgICAgICBhbmQgPGNvZGU+YmF6Lmg8L2NvZGU+LiBBcyB0aGlzIGluZm9ybWF0aW9uIGlzIHBhcnRpY3VsYXIgdG8gZWFjaCBkaWZmZXJlbnQgdGFzaworICAgICAgd2UgbmVlZCB0byBhbGxvdyB0YXNrcyB0byBpbXBsZW1lbnQgdGhpcyBiZWhhdmlvdXIuIFBvc3NpYmx5IGJ5IHN1cHBseWluZyBhbiBpbnRlcmZhY2UKKyAgICAgIG9mIHRoZSBmb3JtOworICAgIDwvcD4KKyAgICA8cHJlPgorcHVibGljIGludGVyZmFjZSBEZXBlbmRlbmN5R2VuZXJhdG9yCit7CisgIEZpbGVbXSBnZW5lcmF0ZURlcGVuZGVuY2llcyggRmlsZSBmaWxlICk7Cit9CisgICAgPC9wcmU+CisgICAgPHA+CisgICAgICBHZW5lcmF0aW5nIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGlzIGEgY29zdGx5IG9wZXJhdGlvbiBhbmQgdGh1cyB3ZSBkbyBub3Qgd2FudCB0bworICAgICAgYmUgZG9pbmcgaXQgZXZlcnl0aW1lIHlvdSBydW4gYW50LiBXZSB3YW50IHRvIGdlbmVyYXRlIGl0IG9uIHRoZSBpbml0aWFsIGJ1aWxkIGFuZCB0aGVuIAorICAgICAgcGVyc2lzdCBzb21ld2hlcmUuIEV2ZXJ5dGltZSBhIGZpbGUgaXMgb3V0IG9mIGRhdGUsIGl0J3MgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiB3b3VsZAorICAgICAgYmUgcmVnZW5lcmF0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgZGVwZW5kZW5jeSBjYWNoZS4gSWRlYWxseSB0aGlzIGNhY2hlIHdvdWxkIGFsc28gc3RvcmUgdGhlCisgICAgICBhYm92ZSBtZW50aW9uZWQgY29sb3JpbmcgaW5mb3JtYXRpb24uIFNvIHRoZSBlbnRyeSBmb3IgPGNvZGU+Zm9vLmM8L2NvZGU+IG1heSBkZWNsYXJlIHRoYXQgCisgICAgICBpdCBpcyBkZXBlbmRlbnQgdXBvbiA8Y29kZT5mb28uaDwvY29kZT4sIDxjb2RlPmJhci5oPC9jb2RlPiBhbmQgPGNvZGU+YmF6Lmg8L2NvZGU+LCBhc3dlbGwgCisgICAgICBhcyBiZWluZyBjb21waWxlZCB3aXRoIC1PMiBmbGFnLiBJZiBhbnkgb2YgdGhlIGRlcGVuZGVuY2llcyBoYXZlIGNoYW5nZWQgb3IgYXJlIG91dCBvZiBkYXRlIAorICAgICAgdGhlbiBmb28uYyB3b3VsZCBuZWVkIHRvIGJlIHJlY29tcGlsZWQuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgQSBwb3NzaWJsZSBBUEkgd291bGQgYmUKKyAgICA8L3A+CisgICAgPHByZT4KK0RlcGVuZGVuY3lNYW5hZ2VyIGRtID0gLi4uOworZG0uc2V0RmlsZVNldCggbXlGaWxlU2V0ICk7CitkbS5zZXREZXBlbmRlbmN5Q2FjaGUoIG15RGVwZW5kZW5jeUNhY2hlRmlsZSApOworRmlsZVtdIGZpbGVzID0gY20uZ2V0T3V0T2ZEYXRlKCk7CisgICAgPC9wcmU+CisgIDwvYmxvY2txdW90ZT4KKworICA8aDM+UmVmYWN0b3IgJmx0O2V4ZWMmZ3Q7IGluZnJhc3RydWN0dXJlIGludG8gQmVhbnM8L2gzPgorICA8YSBuYW1lPSJleGVjIiAvPgorICA8YmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIEV4ZWMgYW5kIGl0cyByZWxhdGVkIGNsYXNzZXMgaGF2ZSBjdXJyZW50bHkgZXZvbHZlZCB0aHJvdWdoIHNldmVyYWwgaXRlcmF0aW9ucyBhbmQgdGh1cworICAgICAgaXQgaXMgbm90IGFzIGNsZWFubHkgZGVzaWduZWQgYW5kIGFzIHJldXNhYmxlIGFzIGl0IGNvdWxkIGJlLiBTb21lb25lIG5lZWRzIHRvIHB1bGwgYXBhcnQKKyAgICAgIGV4ZWMgYW5kIGFuYWx5emUgd2hpY2ggcGFydHMgY2FuIGJlIHR1cm5lZCBpbnRvIEphdmFCZWFucyBhbmQgZGVjb3VwbGUgdGhlbSBmcm9tIHRoZSBBbnQgCisgICAgICBpbmZyYXN0cnVjdHVyZS4gT25jZSB0aGF0IGlzIGRvbmUgaXQgd2lsbCBtYWtlIHRoZXNlIGJlYW5zIG11Y2ggZWFzaWVyIHRvIHJldXNlIGZyb20gb3RoZXIKKyAgICAgIHRhc2tzIHdpdGhvdXQgcmVseWluZyBvbiBnYWluaW5nIGFjY2VzcyB0byB0aGUgb3RoZXIgdGFzayBpbnN0YW5jZS4KKyAgICA8L3A+CisgIDwvYmxvY2txdW90ZT4KKworICA8aDM+UmVmYWN0b3IgJmx0O2phdmEmZ3Q7IGluZnJhc3RydWN0dXJlIGludG8gQmVhbnM8L2gzPgorICA8YSBuYW1lPSJqYXZhIiAvPgorICA8YmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIE11Y2ggbGlrZSBFeGVjIHNob3VsZCBiZSBkZWNvdXBsZWQgZnJvbSBBbnQgcnVudGltZSwgc28gc2hvdWxkIGNsYXNzZXMgdG8gaW1wbGVtZW50IGphdmEgCisgICAgICB0YXNrIGZvciB0aGUgc2FtZSBiZW5lZml0cy4KKyAgICA8L3A+CisgIDwvYmxvY2txdW90ZT4KKworICA8aDM+R2VuZXJpYyBUYXNrIEZhY2FkZXM8L2gzPgorICA8YSBuYW1lPSJmYWNhZGUiIC8+CisgIDxibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgQ3VycmVudGx5IHdlIGhhdmUgYSBmZXcgdGFza3MgdGhhdCBoYXZlIG11bHRpcGxlIGltcGxlbWVudGF0aW9ucy4gRm9yIGluc3RhbmNlIEphdmFjIHRhc2sKKyAgICAgIGNhbiBhY3R1YWxseSBjYWxsIGppa2VzLCBqdmMsIGNsYXNzaWMgamF2YWMgb3IgbW9kZXJuIGphdmFjLiBTaW1pbGFyIHRoaW5ncyB3aWxsIGJlIHNlZW4KKyAgICAgIHdpdGggdGhlIGpzcGMgdGFzayBhbmQgdGhlIGNjIHRhc2sgKGlmIGl0IGV2ZXIgZ2V0cyB3cml0dGVuKS4gV2UgbmVlZCB0byBleGFtaW5lIHRoaXMgCisgICAgICBwYXR0ZXJuIGFuZCBzZWUgaWYgdGhlcmUgaXMgYSB3YXkgdG8gZ2VuZXJhbGl6ZSB0aGlzIGFuZCBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBzdWNoIHRhc2tzLgorICAgIDwvcD4KKyAgPC9ibG9ja3F1b3RlPgorCisgIDxoMz5UYXNrIFBhY2thZ2luZzwvaDM+CisgIDxhIG5hbWU9InBhY2thZ2luZyIgLz4KKyAgPGJsb2NrcXVvdGU+CisgICAgPHA+CisgICAgICBXZSBoYXZlIGFscmVhZHkgZGVjaWRlZCB0aGF0IHdlIGFyZSBnb2luZyB0byBwYWNrYWdlIEFudCB0YXNrcyBpbiBzZXBhcmF0ZSBqYXJzIGFuZAorICAgICAgaGF2ZSBzb21lIHNvcnQgb2YgZGVzY3JpcHRvciB0aGF0IHRvIGRlc2NyaWJlIHRoZSBjb250ZW50cyBvZiB0aGUgamFyLiBIb3dldmVyIHdlIGhhdmUgCisgICAgICBub3QgeWV0IGRlY2lkZWQgaG93IHdlIHdpbGwgYnJlYWsgdXAgdGhlIHRhc2tzLiBEbyB3ZSBicmVhayB1cCB0aGUgdGFza3MgdXAgaW50byAKKyAgICAgIHJlbGF0ZWQgdGFza3Mgb3IgaW50byBncm91cHMgdGhhdCBhciBlbGlrZWx5IHRvIGJlIHVzZWQgdG9nZXRoZXIgb3Igd2hhdD8gQSBwb3NzaWJsZQorICAgICAgYnJlYWtkb3duIHdvdWxkIGJlCisgICAgPC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT5qZGsgdGFza3M6IGphdmFjLCBqYXZhZG9jLCBybWljIGV0YzwvbGk+CisgICAgICA8bGk+dGV4dCB0YXNrczogcmVnZXggcmVwbGFjZSwgZml4Y3JsZiBldGM8L2xpPgorICAgICAgPGxpPnVuaXggdGFza3M6IGNobW9kLCBldGM8L2xpPgorICAgICAgPGxpPmZpbGUgdGFza3M6IGNvcHksIG1vdmUsIGV0YzwvbGk+CisgICAgPC91bD4KKyAgPC9ibG9ja3F1b3RlPgorCisgIDxoMz5NYXBwaW5nIEZpbGUgQXR0cmlidXRlcyBkdXJpbmcgdHJhbnNmb3JtYXRpb248L2gzPgorICA8YSBuYW1lPSJtYXBwZXJleHQiIC8+CisgIDxibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgV2hlbiB3ZSBhcmUgY29weWluZyBmaWxlcyBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyIGl0IGlzIGN1cnJlbnRseSBwb3NzaWJsZQorICAgICAgdG8gcmVuYW1lIHRoZW0gdXNpbmcgYSBtYXBwZXIuIFNvIHdlIGNvdWxkIHJlbmFtZSA8Y29kZT5Gb28uamF2YTwvY29kZT4gdG8gCisgICAgICA8Y29kZT5Gb28uamF2YS5iYWs8L2NvZGU+LiBPbiBvY2Nhc2lvbiBpdCBpcyB1c2VmdWwgdG8gbW9kaWZ5IGZpbGUgYXR0cmlidXRlcworICAgICAgb3RoZXIgdGhhbiBpdHMgbmFtZSBpbiBzdWNoIG9wZXJhdGlvbnMuIFNvIHdlIGNvdWxkIGNvcHkgdGhlIGZpbGVzIHRvIGFub3RoZXIKKyAgICAgIGxvY2F0aW9uIGFuZCBtYWtlIHRoZW0gcmVhZC1vbmx5IGluIG9uZSBvcGVyYXRpb24uCisgICAgPC9wPgorICA8L2Jsb2NrcXVvdGU+CisKKyAgPGgzPkZpbHRlcnMgZXh0ZW5zaW9uczwvaDM+CisgIDxhIG5hbWU9ImZpbHRlcnMiIC8+CisgIDxibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgVGhpcyBpcyBwYXJ0aWFsbHkgcmVsYXRlZCB0byB0aGUgYWJvdmUgYWN0aW9uLiBGaWx0ZXJzIGNvdWxkIGJlIHNlZW4gYXMgYSB3YXkgCisgICAgICB0byBtb2RpZnkgdGhlIGNvbnRlbnQgYXR0cmlidXRlIG9mIGEgZmlsZSBkdXJpbmcgYSBjb3B5L21vdmUuIEl0IHdvdWxkIGJlIAorICAgICAgcHJlZmVycmFibGUgaWYgZmlsdGVyaW5nIGNvdWxkIGJlIGFic3RyYWN0ZWQgdG8gdXNlIDxjb2RlPkZpbHRlcmVkT3V0cHV0U3RyZWFtPC9jb2RlPnMKKyAgICAgIHRvIHBlcmZvcm0gdGhlIGNvbnRlbnQgbW9kaWZpY2F0aW9uLiBUaGF0IHdheSBuZXcgRmlsdGVyIHR5cGVzIGNvdWxkIGJlIGNvbnN0cnVjdGVkCisgICAgICBhbmQgdXNlZCBkdXJpbmcgZmlsZSBjb3B5IChpZSBhbiBleGFtcGxlIHdvdWxkIGJlIGEgUGVybCBGaWx0ZXJPdXRwdXRTdHJlYW0gdGhhdCAKKyAgICAgIGFsbG93ZWQgeW91IHRvIHVzZSBwZXJsIGV4cHJlc3Npb25zIHRvIHRyYW5zZm9ybSBpbnB1dCkuCisgICAgPC9wPgorICA8L2Jsb2NrcXVvdGU+CisKKyAgPGgzPlhNTCBDYXRhbG9nIHRvIGxvYWQgWE1MIEZyYWdtZW50czwvaDM+CisgIDxhIG5hbWU9ImNhdGFsb2ciIC8+CisgIDxibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgV2hlbiBpbmNsdWRpbmcgZnJhZ21lbnRzIG9mIFhNTCB3ZSBhcmUgY3VycmVudGx5IGZvcmNlZCB0byB1c2UgcmVsYXRpdmUgcGF0aHMuCisgICAgICBIb3dldmVyIHRoaXMgaXMgc29tZXRpbWVzIHVuZGVzaXJhYmxlIHdoZW4gYSBzaW5nbGUgZnJhZ21lbnQgbmVlZHMgdG8gYmUgdXNlZAorICAgICAgYWNyb3NzIHNldmVyYWwgcHJvamVjdHMgaW4gc2V2ZXJhbCBkaWZmZXJlbnQgbG9jYXRpb25zLiBJbnN0ZWFkIHdlIGNvdWxkIHVzZQorICAgICAgYSBDYXRhbG9nIHRvIG5hbWUgdGhlIGZyYWdtZW50IGFuZCB0aGVuIGVhY2ggZGV2ZWxvcGVyIHdvdWxkIG9ubHkgbmVlZCB0byBpbnN0YWxsCisgICAgICB0aGUgZnJhZ21lbnQgb25jZSBhbmQgaXQgd291bGQgYmUgYWNjZXNzaWJsZSBmcm9tIGFsbCB0aGUgcHJvamVjdHMuCisgICAgPC9wPgorICA8L2Jsb2NrcXVvdGU+CisKKyAgPGgzPmkxOG4gdGhlIFJ1bnRpbWUgYW5kIHRhc2tzPC9oMz4KKyAgPGEgbmFtZT0iaTE4biIgLz4KKyAgPGJsb2NrcXVvdGU+CisgICAgPHA+CisgICAgICBMb29rIGF0IHRoZSBmZWFzYWJpbGl0eSBvZiBwZXJmb3JtaW5nIGkxOG4gb24gQW50IHJ1bnRpbWUgYW5kIGNvcmUgdGFza3MuIExvb2sgYXQKKyAgICAgIGhvdyBtdWNoIHdvcmsgaXQgd2lsbCBiZSBhbmQgaG93IHVzZWZ1bCBpdCB3b3VsZCBiZS4gTG9vayBhdCB1dGlsaXppbmcgaTE4biBmcm9tIAorICAgICAgZXhpc3RpbmcgcHJvamVjdHMgc3VjaCBhcyBBdmFsb24uCisgICAgPC9wPgorICA8L2Jsb2NrcXVvdGU+CisKKyAgPGgzPkVtYmVkZG9yIEFQSSBmb3IgQW50PC9oMz4KKyAgPGEgbmFtZT0iZW1iZWRkb3IiIC8+CisgIDxibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgSWRlbnRpZnkgZGlmZmVyZW50IGVudmlyb25tZW50cyBpbiB3aGljaCBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gZW1iZWQgQW50IG9yIGFuIEFudC1saWtlIAorICAgICAgdG9vbC4gSWRlbnRpZnkgd2hhdCB0aGVzZSBlbnZpcm9ubWVudHMgYXJlIGxpa2VseSB0byBkZW1hbmQgaW4gdGVybXMgb2YgQVBJIGFuZCBzdXBwb3J0CisgICAgICBhbmQgdGhlbiBkZXNpZ24gYSBzeXN0ZW0gdGhhdCB3b3JrcyBpbiB0aGVzZSBlbnZpcm9ubWVudHMgd2l0aG91dCBjb21wcm9taXNpbmcgYW50cyAKKyAgICAgIGNvcmUgZ29hbCAoaWUgYSBidWlsZCBzeXN0ZW0pLiBTb21lIHN1Z2dlc3Rpb25zIGZvciBzdWNoIGFuIEFQSSBpbmNsdWRlOworICAgIDwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+UGx1Z2dhYmxlIFByb2plY3RCdWlsZGVycyB0byBhbGxvdyBidWlsZGluZyBvZiBwcm9qZWN0IGZyb20gYSB2YXJpZXR5IG9mIHNvdXJjZXMsCisgICAgICAgZmlsZSwgVVJMLCBJbnB1dFN0cmVhbSwgU0FYIGV0YzwvbGk+CisgICAgICA8bGk+UGx1Z2dhYmxlIENsYXNzTG9hZGVyIGFycmFuZ2VtZW50PC9saT4KKyAgICAgIDxsaT5BYmlsaXR5IHRvIHNldCBVc2VyIFByb3BlcnRpZXM8L2xpPgorICAgICAgPGxpPkFiaWxpdHkgdG8gYWRkIFRhc2svRGF0YS9UeXBlIGRlZmluaXRpb25zPC9saT4KKyAgICAgIDxsaT5BYmlsaXR5IHRvIGFkZC9yZW1vdmUgTGlzdGVuZXJzPC9saT4KKyAgICAgIDxsaT5BYmlsaXR5IHRvIGFkZC9yZW1vdmUgTG9nZ2VyczwvbGk+CisgICAgICA8bGk+QWJpbGl0eSB0byBnZXQgbWV0YS1pbmZvcm1hdGlvbiBhYm91dCB0YXJnZXRzIChzdWNoIGFzIG5hbWUgYW5kIGRlc2NyaXB0aW9uKTwvbGk+CisgICAgICA8bGk+VGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhIHRhc2sgYW5kL29yIHRhcmdldHM8L2xpPgorICAgICAgPGxpPlRoZSBhYmlsaXR5IHRvIGFkZCB0YXNrbGliczwvbGk+CisgICAgICA8bGk+VGhlIGFiaWxpdHkgdG8gYWRkIFZGUyBtb3VudCBwb2ludHM8L2xpPgorICAgICAgPGxpPlRoZSBhYmlsaXR5IHRvIG1hbmlwdWxhdGUgUHJvamVjdE1vZGVsIGFuZCBidWlsZCBpdCBmcm9tIEdVSXM8L2xpPgorICAgICAgPGxpPkEgZ2VuZXJhbCB0YXNrIGVuZ2luZSBBUEk8L2xpPgorICAgIDwvdWw+CisgIDwvYmxvY2txdW90ZT4KKworICA8aDM+VHlwZUluZm8gc3lzdGVtPC9oMz4KKyAgPGEgbmFtZT0iaW5mbyIgLz4KKyAgPGJsb2NrcXVvdGU+CisgICAgPHA+CisgICAgICBBZGQgaW4gdGhlIGFiaWxpdHkgdG8gcmVwcmVzZW50IHRhc2tzIHVzaW5nIHNwZWNpZmllZCBtZXRhLWluZm8sIFRoaXMgd291bGQgYWxsb3cgCisgICAgICBnZW5lcmF0aW9uIGFuZCBtYW5pcHVsYXRpb24gb2YgaW5mb3JtYXRpb24gc3VjaCBhcyB3aGF0IGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSwgCisgICAgICB3aGF0IGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQgZXRjLiAKKyAgICA8L3A+CisgIDwvYmxvY2txdW90ZT4KKworICA8aDM+QW50ZG9jPC9oMz4KKyAgPGEgbmFtZT0iYW50ZG9jIiAvPgorICA8YmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRoaXMgaXMgcGFydGlhbGx5IGJhc2VkIG9uIHRoZSBhYm92ZSBUeXBlSW5mbyBzeXN0ZW0uIEl0IGludm9sdmVzIHRoZSBhYmlsaXR5IHRvIAorICAgICAgdGFrZSB0aGUgVHlwZUluZm8gbWFkZSBhdmFpbGFibGUgYW5kIGdlbmVyYXRlIGRvY3VtZW50YXRpb24gZm9yIHRoZSB0YXNrcy4gVGhpcyAKKyAgICAgIHdvdWxkIGFsbG93IG11bHRpcGxlIGZvcm1hdHMgb2YgZG9jdW1lbnRhaXRvbiB0byBiZSBlYXNpbHkgbWFpbnRhaW5lZCBhbmQgcmVkdWNlIAorICAgICAgdGhlIGNoYW5jZSB0aGF0IGRvY3VtZW50YXRpb24gZ2V0cyBvdXQgb2Ygd2hhY2suCisgICAgPC9wPgorICA8L2Jsb2NrcXVvdGU+CisKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9hbnQyL2ZlYXR1cmVzLmh0bWwgYi90cnVuay9kb2NzL2FudDIvZmVhdHVyZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2I4MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9hbnQyL2ZlYXR1cmVzLmh0bWwKQEAgLTAsMCArMSwzODEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgICA8dGl0bGU+QW50MiBmZWF0dXJlIGxpc3Q8L3RpdGxlPgorCisgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAuY29tbWVudCB7CisgICAgICAgICAgQ09MT1I6ICM5MDAwMDA7CisJICBCQUNLR1JPVU5EOiAjZmZhOworICAgICAgICB9CisgICAgICA8L3N0eWxlPgorCisgIDwvaGVhZD4KKworICA8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKworICAgIDxwIGNsYXNzPSJjb21tZW50Ij5JZiBzb21ldGhpbmcgbG9va3MgbGlrZSB0aGlzLCB0aGlzIGlzIGVpdGhlciBhCisgICAgcmVxdWVzdCBmb3IgaW5wdXQgb3IgYSAmcXVvdDtSRVZJU0lUJnF1b3Q7IG1hcmtlciBvciBzaW1pbGFyLjwvcD4KKworICAgIDxoMT5BbnQyIEdvYWxzPC9oMT4KKworICAgIDxwPkV2ZW4gdGhvdWdoIEFudDIgaXMgZXhwZWN0ZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICAgY3VycmVudCBBbnQxIHNlcmllcywgaXQgc3RpbGwgaGFzIHRoZSBzYW1lIGdvYWxzLiBBbnQgaXMgYSBKYXZhCisgICAgYmFzZWQgYnVpbGQgdG9vbCBhbmQgdGhpcyByZW1haW5zIHRoZSBtYWluIGZvY3VzIG9mIGl0LiBUaGUKKyAgICBvcmlnaW5hbCBnb2FscyBvZiBzaW1wbGljaXR5LCB1bmRlcnN0YW5kYWJpbGl0eSBhbmQgZXh0ZW5zaWJpbGl0eQorICAgIHN0aWxsIHN0YW5kIGFuZCBBbnQyIHdpbGwgdHJ5IHRvIGFjaGlldmUgdGhlbSBldmVuIGJldHRlciB0aGFuCisgICAgQW50MSBkb2VzLjwvcD4KKworICAgIDxoMj5TaW1wbGljaXR5IGFuZCBVbmRlcnN0YW5kYWJpbGl0eTwvaDI+CisKKyAgICA8cD5UaGVzZSB0d28gZ29hbHMgYXJlIGNsb3NlbHkgcmVsYXRlZC4gQW50IGJ1aWxkIGZpbGVzIHNoYWxsIGJlCisgICAgZWFzeSB0byByZWFkIGFuZCB1bmRlcnN0YW5kIC0gYXQgdGhlIHNhbWUgdGltZSBpdCBzaG91bGQgYmUgZWFzeQorICAgIHRvIHdyaXRlIGEgY3VzdG9tIEFudCB0YXNrIGFuZCB0byB1c2UgdGhlIHV0aWxpdHkgY2xhc3NlcyB0aGF0CisgICAgQW50MiBwcm92aWRlcy48L3A+CisKKyAgICA8cD5BbnQyIHNoYWxsIGJlIG1vcmUgY29uc2lzdGVudCB0aGFuIEFudDEgaXMgLSB0aGlzIG1lYW5zOjwvcD4KKworICAgIDx1bD4KKworICAgICAgPGxpPmNvcmUgdGFza3Mgd2lsbCB1c2UgdGhlIHNhbWUgYXR0cmlidXRlIG5hbWVzIGZvciBjb21tb24KKyAgICAgIGZ1bmN0aW9uYWxpdHk8L2xpPgorCisgICAgICA8bGk+c2ltaWxhciB0YXNrcyB3aWxsIGJlIHVuaWZpZWQgdG8gdXNlIHNpbWlsYXIgZm9ybXMuPC9saT4KKworICAgICAgPGxpPmRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZQorICAgICAgaGlkZGVuIGJlaGluZCBmYWNhZGUgdGFza3MuPC9saT4KKworICAgICAgPGxpPnByb3BlcnRpZXMgYW5kIGRhdGEgdHlwZXMgd2lsbCBiZSB1bmlmaWVkIHNvIHRoYXQgdGhleSBzaGFyZQorICAgICAgdGhlIHNhbWUgbmFtZXNwYWNlIGFuZCBpbmhlcml0YW5jZSBydWxlcy4gPGkKKyAgICAgIGNsYXNzPSJjb21tZW50Ij5OZWVkIHRvIHRhbGsgYWJvdXQgaG93ICR7fSBleHBhbnNpb24gd29ya3MgZm9yCisgICAgICBmaWxlc2V0cyBhbmQgc28gb24uPC9pPjwvbGk+CisKKyAgICA8L3VsPgorCisgICAgPHA+RnVydGhlcm1vcmUgc29tZSB0aGluZ3Mgd2lsbCBoYXZlIHRvIGJlY29tZSBtb3JlIGV4cGxpY2l0OjwvcD4KKworICAgIDx1bD4KKworICAgICAgPGxpPnJlbW92ZSBhbGwgbWFnaWMgcHJvcGVydGllczwvbGk+CisKKyAgICAgIDxsaT5tYWtlIGJ1aWxkIGZpbGUgd3JpdGVycyBleHBsaWNpdGx5IHN0YXRlIHdoaWNoCisgICAgICBmaWx0ZXJzL2ZpbHRlcnNldHMgYSBjb3B5IHRhc2sgd2lsbCB1c2U8L2xpPgorCisgICAgICA8bGk+YWRkIHNjb3BpbmcgcnVsZXMgZm9yIHByb3BlcnRpZXMgc28gdGhhdCBub3QgYWxsIG9mIHRoZW0KKyAgICAgIHdpbGwgYmUgaW5oZXJpdGVkIGJ5IHN1Yi1idWlsZHMsIG9ubHkgdGhvc2UgdGhhdCBoYXZlIGJlZW4KKyAgICAgIHNwZWNpZmllZCBleHBsaWNpdGx5LiA8aSBjbGFzcz0iY29tbWVudCI+RmlsbCBpbiBkZXRhaWxzIG9uY2UKKyAgICAgIHRoZXkndmUgYmVlbiBzb3J0ZWQgb3V0LjwvaT48L2xpPgorCisgICAgPC91bD4KKworICAgIDxwPlRoZSBmcm9udC1lbmRzIGZvciBBbnQyIHNoYWxsIGJlIHNtYXJ0IGVub3VnaCB0byBhdXRvbWF0aWNhbGx5CisgICAgZGV0ZWN0IHRoZSByZXF1aXJlZCBsaWJyYXJpZXMgKGxpa2UgPGNvZGU+dG9vbHMuamFyPC9jb2RlPiksIHRoZQorICAgIHVzZSBvZiBuYXRpdmUgc2NyaXB0cyBzaGFsbCBiZSBrZXB0IHRvIGEgbWluaW11bS48L3A+CisKKyAgICA8cD5CdWlsZCBmaWxlIHdyaXRlcnMgY2FuIGF0dGFjaCBhIG1lc3NhZ2UgdG8gdGFyZ2V0cyB0aGF0IHdpbGwgYmUKKyAgICBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgaWYgdGhhdCB0YXJnZXQgaXMgZ29pbmcgdG8gYmUgc2tpcHBlZCAoYmFzZWQKKyAgICBvbiB0aGUgaWYvdW5sZXNzIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0KS48L3A+CisKKyAgICA8cD5FdmVuIHRob3VnaCBBbnQgaW5zdGFsbGF0aW9uIGFscmVhZHkgaXMgcXVpdGUgc2ltcGxlIGluIEFudDEKKyAgICAoZXh0cmFjdCB0aGUgYXJjaGl2ZSBhbmQgc2V0IHR3byBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLAorICAgIGFsdGVybmF0aXZlIHdheXMgdG8gaW5zdGFsbCBBbnQgbGlrZSB1c2luZyAKKyAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmF3ZWJzdGFydC8iPldlYnN0YXJ0PC9hPiBvcgorICAgIGEgInNlbGYtZXh0cmFjdGluZyIgSkFSIGZpbGUgd2lsbCBiZSBleHBsb3JlZC48L3A+CisKKyAgICA8aDI+RXh0ZW5zaWJpbGl0eTwvaDI+CisKKyAgICA8cD5BbnQyIGxpa2UgQW50MSB1c2VzIGJ1aWxkIGZpbGVzIHdyaXR0ZW4gaW4gWE1MIGFzIGl0cyBtYWluCisgICAgaW5wdXQsIGJ1dCBpdCB3aWxsIG5vdCBiZSByZXN0cmljdGVkIHRvIGl0LiBUaGUgY29yZSBvZiBBbnQyIHdpbGwKKyAgICB3b3JrIG9uIGFuIG9iamVjdCBtb2RlbCBvZiBQcm9qZWN0L1RhcmdldC9UYXNrIHRoYXQgaXMgaW5kZXBlbmRlbnQKKyAgICBvZiBhbnkgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24uPC9wPiAKKworICAgIDxwPkFzIGFuIGV4dGVuc2lvbiBvZiB0aGUgY3VycmVudCA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+CisgICAgY29uY2VwdCwgdGFza3MgY2FuIGJlIGJ1bmRsZWQgaW50byB0YXNrIGxpYnJhcmllcyAodG9nZXRoZXIgd2l0aAorICAgIGRhdGEgdHlwZXMgYW5kIG90aGVyIHV0aWxpdHkgY2xhc3NlcykuIFRoZXNlIHRhc2sgbGlicmFyaWVzIGFyZQorICAgIHNwZWNpYWwgSkFSIGFyY2hpdmVzIHRoYXQgc29tZWhvdyBkZXNjcmliZSB0aGUgY29udGFpbmVkIHRhc2tzIHRvCisgICAgQW50LiBBbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGtub3cgYWxsIHRhc2tzIGNvbnRhaW5lZCBpbiB0YXNrCisgICAgbGlicmFyaWVzIHRoYXQgaGF2ZSBiZWVuIHBsYWNlZCBpbnRvIGEgc3BlY2lhbCBkaXJlY3RvcnkgLSBpbgorICAgIGFkZGl0aW9uIHRhc2sgbGlicmFyaWVzIGNhbiBiZSByZWZlcmVuY2VkIGFuZCB1c2VkIGluIGEgYnVpbGQgZmlsZQorICAgIGV4cGxpY2l0bHkuIDxpIGNsYXNzPSJjb21tZW50Ij5GaWxsIGluIGRldGFpbHMgb25jZSB0aGV5J3ZlIGJlZW4KKyAgICBzb3J0ZWQgb3V0LjwvaT48L3A+CisKKyAgICA8cD5JdCBoYXMgYmVjb21lIGFwcGFyZW50LCB0aGF0IHNldmVyYWwgJnF1b3Q7YXNwZWN0cyZxdW90OyBvZgorICAgIHRhc2tzIGFyZSBzbyBjb21tb24gdGhhdCB0YXNrIHdyaXRlcnMgZmluZCB0aGVtc2VsdmVzIGR1cGxpY2F0aW5nCisgICAgY29kZSBhbGwgb3ZlciBhZ2FpbiAtIHRoaW5ncyBsaWtlIGNsYXNzcGF0aCBoYW5kbGluZyBvciAmcXVvdDtkbworICAgIHdlIHN0b3AgdGhlIGJ1aWxkIGlmIHRoaXMgdGFzayBmYWlscz8mcXVvdDsgZnVuY3Rpb25hbGl0eSBmb3IKKyAgICBleGFtcGxlLiBBbnQyIHdpbGwgcHJvdmlkZSBhIHdheSB0byBsZXQgdGhlIHVzZXIgYXR0YWNoIGFuCisgICAgJnF1b3Q7YXNwZWN0IGhhbmRsZXImcXVvdDsgdG8gYSBwcm9qZWN0IC0gYWxsIGF0dHJpYnV0ZXMgdGhhdCBsaXZlCisgICAgaW4gYSBjZXJ0YWluIG5hbWVzcGFjZSBhcmUgZ29pbmcgdG8gYmUgcGFzc2VkIHRvIHRoaXMgaGFuZGxlci4gPGkKKyAgICBjbGFzcz0iY29tbWVudCI+TmVlZCB0byB0YWxrIGFib3V0IFRhc2tDb250ZXh0IGhlcmUuPC9pPjwvcD4KKworICAgIDxwPkFudDIgd2lsbCBmYXJtIG91dCBjb21tb24gZnVuY3Rpb25hbGl0eSBmcm9tIHRhc2tzIGludG8gdXRpbGl0eQorICAgIGNsYXNzZXMgc28gdGhhdCB0YXNrIHdyaXRlcnMgY2FuIGJlbmVmaXQgZnJvbSBhIHRlc3RlZCBhbmQgc3RhYmxlCisgICAgZnJhbWV3b3JrIC0gdGhleSBzaG91bGRuJ3QgbmVlZCB0byBkZWFsIHdpdGggZXhpc3RpbmcgdGFza3MKKyAgICBkaXJlY3RseSAobGlrZSBzb21lIHRhc2tzICZxdW90O2FidXNlJnF1b3Q7IHRoZQorICAgIDxjb2RlPiZsdDt0b3VjaCZndDs8L2NvZGU+IHRhc2sgaW4gQW50MSkuPC9wPgorCisgICAgPHA+QW50MiB3aWxsIHByb3ZpZGUgYSB3YXkgdG8gZGVmaW5lIHRhc2tzIHRoYXQgaXRzZWxmIGNhbiBoYXZlCisgICAgdGFza3MgYXMgY2hpbGQgZWxlbWVudHMgd2l0aG91dCBrbm93aW5nIGFsbCBkZWZpbmVkIHRhc2tzIGF0CisgICAgY29tcGlsZSB0aW1lLiAgRGlzY3Vzc2lvbnMgb24gYW50LWRldiB1c3VhbGx5IHRhbGsgYWJvdXQKKyAgICAmcXVvdDtjb250YWluZXIgdGFza3MmcXVvdDsgaW4gdGhpcyBjb250ZXh0LjwvcD4KKworICAgIDxwPlRoZSBvbmx5IHdheSB0byAmcXVvdDtpbmNsdWRlJnF1b3Q7IGNvbW1vbiBYTUwgc25pcHBldHMgc28gZmFyCisgICAgaGFzIGJlZW4gdGhlIHVzYWdlIG9mIGV4dGVybmFsIFNZU1RFTSBlbnRpdGllcywgYSBtZWNoYW5pc20gdGhhdAorICAgIGlzIHRpZWQgdG8gRFREcyBhbmQgZG9lc24ndCBtaXggd2VsbCB3aXRoIGFsdGVybmF0aXZlCisgICAgYXBwcm9hY2hlcyBsaWtlIFhNTCBTY2hlbWEuICBBbnQyIHdpbGwgcHJvdmlkZSBhIGJ1aWx0LWluIGluY2x1ZGUKKyAgICBtZWNoYW5pc20uPC9wPgorCisgICAgPGgxPk5ldy9Nb2RpZmllZCBGZWF0dXJlczwvaDE+CisKKyAgICA8cD5BbnQyIHdpbGwgcnVuIHRoZSBidWlsZCBwcm9jZXNzIGZ1bGx5IGR5bmFtaWNhbGx5LCB3aGljaCBtZWFucworICAgIHRoYXQgdGFzayB3b24ndCBiZSBpbnN0YW50aWF0ZWQgYmVmb3JlIHRoZXkgYXJlIGFjdHVhbGx5IGJlaW5nIHJ1bgorICAgIGFuZCA8Y29kZT4ke308L2NvZGU+IGV4cGFuc2lvbiB3aWxsIHNlZSB0aGUgdmVyeSBsYXRlc3QgdmFsdWUgb2YgYQorICAgIHByb3BlcnR5LiBJdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHJlYXNzaWduIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHZpYQorICAgIGEgYnVpbHQtaW4gdGFzay48L3A+CisKKyAgICA8aDI+Q29tcGF0aWJpbGl0eSB3aXRoIEFudDE8L2gyPgorCisgICAgPHA+QW50MiBpcyBnb2luZyB0byBicmVhayBBbnQxIGluIHNldmVyYWwgd2F5czo8L3A+CisKKyAgICA8dWw+CisKKyAgICAgIDxsaT5UYXNrcyB3cml0dGVuIGZvciBBbnQxIHdvbid0IHdvcmsgaW4gQW50MiBhcyB0aGUgQVBJIG9mCisgICAgICBBbnQncyBjb3JlIGFuZCB0aGUgbmFtZXMgb2YgdXRpbGl0eSBjbGFzc2VzIGFyZSBnb2luZyB0bworICAgICAgY2hhbmdlLiBUaGVyZSB3aWxsIHByb2JhYmx5IGJlIGFkYXB0b3JzIGFuZCB1dGlsaXR5IGNsYXNzZXMgdG8KKyAgICAgIGVhc2UgdGhlIHRyYW5zaXRpb24gZm9yIHRhc2sgd3JpdGVycy48L2xpPgorCisgICAgICA8bGk+QnVpbGQgZmlsZXMgd3JpdHRlbiBmb3IgQW50MSB3aWxsIHByb2JhYmx5IG5vdCBiZSB2YWxpZCBpbgorICAgICAgQW50MiBvciBhdCBsZWFzdCBub3QgeWllbGQgdGhlIHNhbWUgcmVzdWx0cy4gSXQgaXMgZXhwZWN0ZWQgdGhhdAorICAgICAgQW50MiB3aWxsIGNvbWUgd2l0aCBhIHRvb2wgdG8gdHJhbnNsYXRlIEFudDEgYnVpbGQgZmlsZXMgaW50bworICAgICAgZXF1aXZhbGVudCBBbnQyIHZlcnNpb25zPC9saT4KKworICAgICAgPGxpPm1hZ2ljIHByb3BlcnRpZXMgbGlrZSA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gbWF5CisgICAgICBkaXNhcHBlYXIgYW5kIGJlIHJlcGxhY2VkIGJ5IGEgZGlmZmVyZW50IGN1c3RvbWl6YXRpb24KKyAgICAgIGNvbmNlcHQuPC9saT4KKworICAgICAgPGxpPkFudDIgaXMgZ29pbmcgdG8gcmVxdWlyZSBhIEpESyB2ZXJzaW9uIDEuMiBvciBhYm92ZSBhbmQgYQorICAgICAgSkFYUCBjb21wbGlhbnQgcGFyc2VyIHZlcnNpb24gMS4xIG9yIGFib3ZlLjwvbGk+CisKKyAgICAgIDxsaT5JZiB5b3Ugc3BlY2lmeSBtb3JlIHRoYW4gb25lIHRhcmdldCBpbiBhbm90aGVyIHRhcmdldCdzCisgICAgICBkZXBlbmRzIGF0dHJpYnV0ZSwgQW50MSB3aWxsIGV4ZWN1dGUgdGhlc2UgdGFyZ2V0cyBmcm9tIGxlZnQgdG8KKyAgICAgIHJpZ2h0IChhcyBsb25nIGFzIHRoZSBkZXBlbmRlbmN5IHRyZWUgcGVybWl0cyBpdCkgLSBBbnQyIHdpbGwKKyAgICAgIG5vdCBndWFyYW50ZWUgdGhpcyBiZWhhdmlvciBidXQgd2lsbCBhbGxvdyBidWlsZCBmaWxlIHdyaXRlcnMgdG8KKyAgICAgIHNwZWNpZnkgdGhlIG9yZGVyIGV4cGxpY2l0bHkuPC9saT4KKworICAgICAgPGxpPkRlcmVmZXJlbmNpbmcgYSBub24gZXhpc3RlbnQgcHJvcGVydHkgYSB2aWEgJHthfSB3aWxsIHJlc3VsdAorICAgICAgaW4gYSBidWlsZCBmYWlsdXJlLjwvbGk+CisKKyAgICA8L3VsPgorCisgICAgPGgyPlN1cHBvcnQgSW50ZWdyYXRpb24gb2YgQW50IEludG8gT3RoZXIgVG9vbHM8L2gyPgorCisgICAgPHA+QW50MiB3aWxsIGhhdmUgYSBjbGVhciBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIGZyb250LWVuZCB0aGF0IGlzCisgICAgcmVzcG9uc2libGUgZm9yIHVzZXIgaW50ZXJhY3Rpb25zLCB0aGUgb2JqZWN0IG1vZGVsIHRoYXQKKyAgICByZXByZXNlbnRzIHRoZSBwcm9qZWN0IHRvIGJ1aWxkIGFuZCB0aGUgcGFydCBvZiBBbnQgdGhhdCBydW5zIHRoZQorICAgIGJ1aWxkIHByb2Nlc3MgaXRzZWxmIDxpIGNsYXNzPSJjb21tZW50Ij5OYW1lIHRoYXQgVGFza0VuZ2luZSwKKyAgICBQcm9qZWN0RW5naW5lLCBFeGVjdXRpb25FbmdpbmUgb3Igd2hhdD88L2k+LiBUaGlzIHNlcGFyYXRpb24gaXMKKyAgICBleHBlY3RlZCB0byBlYXNlIHRoZSBpbnRlZ3JhdGlvbiBvZiBBbnQgKG9yIHBhcnRzIG9mIGl0KSBpbnRvCisgICAgb3RoZXIgcHJvZHVjdHMuPC9wPgorCisgICAgPHA+QW50MiBpdHNlbGYgd2lsbCBpbmNsdWRlIGEgY29tbWFuZCBsaW5lIGZyb250LWVuZCBhbmQgQW50aWRvdGUKKyAgICB3aWxsIGJlY29tZSB0aGUgR1VJIGZyb250LWVuZCB0byBpdC4gT3RoZXIgZnJvbnQtZW5kcyBsaWtlIGEKKyAgICBzZXJ2bGV0IGZyb250LWVuZCBhcmUgZXhwZWN0ZWQgPGkgY2xhc3M9ImNvbW1lbnQiPm91dHNpZGUgb2YKKyAgICBBbnQncyBjb3JlPC9pPiBhcyB3ZWxsLjwvcD4KKworICAgIDxwPkluIGFkZGl0aW9uIHRvIHRoaXMgc2VwYXJhdGlvbiwgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyBzaG91bGQKKyAgICBoZWxwIHBlb3BsZSB3aG8gd2FudCB0byBpbnRlZ3JhdGUgQW50IGludG8gdGhlaXIgcHJvZHVjdHM6PC9wPgorCisgICAgPHVsPgorCisgICAgICA8bGk+SXQgd2lsbCBiZSBwb3NzaWJsZSB0byBjYW5jZWwgYSBydW5uaW5nIGJ1aWxkIHByb2Nlc3MuPC9saT4KKworICAgICAgPGxpPkFudCB3aWxsIGRldGFjaCBmcm9tIDxjb2RlPlN5c3RlbS5lcnIvLm91dC8uaW48L2NvZGU+CisgICAgICBjb21wbGV0ZWx5IGFuZCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBmcm9udC1lbmQgdmlhIGEgd2VsbCBkZWZpbmVkCisgICAgICBBUEkuICBUaGUgZnJvbnQtZW5kIHdpbGwgaGF2ZSB0byBoYW5kbGUgdXNlciBpbnB1dCBmb3IgdGFza3MKKyAgICAgIHRoYXQgbmVlZCBpdCAodGFza3MgdGhhdCBhc2sgZm9yIGEgcGFzc3dvcmQgZm9yIGV4YW1wbGUpLjwvbGk+CisKKyAgICAgIDxsaT5UYXNrcyB3aWxsIHByb3ZpZGUgc29tZSB3YXkgdG8gaWRlbnRpZnkgdGhlaXIgYXR0cmlidXRlcworICAgICAgZnJvbSB0aGUgb3V0c2lkZS4gPGkgY2xhc3M9ImRlZmF1bHQiPmZpbGwgaW4gZGV0YWlsczwvaT48L2xpPgorCisgICAgPC91bD4KKworICAgIDxoMj5Nb3JlIENvbnRyb2wgZm9yIFVzZXJzIGFuZCBCdWlsZCBGaWxlIFdyaXRlcnM8L2gyPgorCisgICAgPHA+QW50MiB3aWxsIHVzZSBhIDxjb2RlPkJ1aWxkTGlzdGVuZXI8L2NvZGU+IGNvbmNlcHQgc2ltaWxhciB0bworICAgIHRoZSBvbmUgb2YgQW50MSBidXQgbWF5IHByb3ZpZGUgYSByaWNoZXIgc2V0IG9mIGV2ZW50cy4gSXQgd2lsbCBiZQorICAgIHBvc3NpYmxlIHRvIGF0dGFjaCBhbmQgZGV0YWNoIGxpc3RlbmVycyB0byBhIGJ1aWxkIHByb2Nlc3MgZnJvbQorICAgIHdpdGhpbiB0aGUgYnVpbGQgZmlsZSBhbmQgdG8gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiBhdHRhY2hlZAorICAgIGxpc3RlbmVycy48L3A+CisKKyAgICA8cD5JbiBBbnQxIHVzZXJzIGhhdmUgbGl0dGxlIGNvbnRyb2wgb3ZlciBob3cgdGhpbmdzIHdvcmsuICBUaGVyZQorICAgIGFyZSBhIGNvdXBsZSBvZiBtYWdpYyBwcm9wZXJ0aWVzIHRvIG1ha2UgQW50IGNob3NlIGEgcHJlZmVycmVkCisgICAgY29tcGlsZXIgb3IgbW9kaWZ5IHRoZSBDTEFTU1BBVEgsIGJ1dCB0aGV5IGFyZSBiYXJlbHkgZG9jdW1lbnRlZC4KKyAgICBJZiB1c2VycyB3YW50IHRvIHNldCB0aGVzZSBwcm9wZXJ0aWVzIGZvciBldmVyeSBidWlsZCBwcm9jZXNzLAorICAgIHRoZXkgaGF2ZSB0byBsZWFybiB0aGUgdW5kb2N1bWVudGVkIHRyaWNrcyBvZiB0aGUKKyAgICA8Y29kZT5BTlRfT1BUUzwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgdGhlCisgICAgPGNvZGU+fi8uYW50cmM8L2NvZGU+IGZpbGUuPC9wPgorCisgICAgPHA+QW50MiB3aWxsIGhhdmUgYSB3ZWxsIGRlZmluZWQgc3lzdGVtIHRvIHNwZWNpZnkgdXNlcgorICAgIHByZWZlcmVuY2VzLiAgVGhpcyBzeXN0ZW0gd2lsbCBub3Qgb25seSBsZXQgdXNlciBjaG9zZSB0aGVpcgorICAgIGNvbXBpbGVyIGJ1dCBhbHNvIGdpdmUgdGhlbSBhIGNoYW5jZSB0byBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGZvcgorICAgIGF0dHJpYnV0ZXMgKHNheSB5b3UgYWx3YXlzIHdhbnQgdGhlIDxjb2RlPmRlYnVnPC9jb2RlPiBhdHRyaWJ1dGUKKyAgICBvZiB0aGUgPGNvZGU+amF2YWM8L2NvZGU+IHRhc2sgdG8gYmUgdHJ1ZSAtIHVubGVzcyBpdCBoYXMgYmVlbgorICAgIGRpc2FibGVkIGV4cGxpY2l0bHkpLiA8aSBjbGFzcz0iY29tbWVudCI+TmVlZCB0byBnaXZlIGRldGFpbHMgb25jZQorICAgIHRoZXkndmUgYmVlbiBzb3J0ZWQgb3V0LjwvaT48L3A+CisKKyAgICA8aDI+RG9jdW1lbnRhdGlvbiBTeXN0ZW08L2gyPgorCisgICAgPHA+QWxsIHRhc2tzIHdpbGwgYmUgZG9jdW1lbnRlZCBpbiBYTUwgZmlsZXMgdXNpbmcgYSBjb21tb24gRFREIDxpCisgICAgY2xhc3M9ImNvbW1lbnQiPlN0aWxsIG5lZWQgdG8gZGVmaW5lIGl0PC9pPiAtIHRhc2sgbGlicmFyaWVzIGFyZQorICAgIGV4cGVjdGVkIHRvIGluY2x1ZGUgdGhlIGRvY3VtZW50YXRpb24gdXNpbmcgdGhpcyBEVEQgaW5zaWRlIHRoZQorICAgIGxpYnJhcnkgaXRzZWxmLjwvcD4KKworICAgIDxoMj5CZXR0ZXIgU3ViYnVpbGQgSGFuZGxpbmc8L2gyPgorCisgICAgPHAgY2xhc3M9ImNvbW1lbnQiPklzIHRoZXJlIHNvbWV0aGluZyBiZXlvbmQgJnF1b3Q7c2hvdWxkIGJlY29tZQorICAgIGJldHRlciZxdW90OyByaWdodCBub3c/PC9wPgorCisgICAgPGgyPkRhdGEgVHlwZXM8L2gyPgorCisgICAgPHA+QW50MSBzdXBwb3J0cyBhIGxpbWl0ZWQgc2V0IG9mIGRhdGEgdHlwZXMgKGZpbGVzZXQsIHBhdHRlcm5zZXQKKyAgICBhbmQgcGF0aCkgYW5kIGF0IGxlYXN0IHVwIHRvIEFudCAxLjMgaXQgaXMgbm90IHBvc3NpYmxlIHRvCisgICAgcmVnaXN0ZXIgY3VzdG9tIGRhdGEgdHlwZXMgd2l0aG91dCB3cml0aW5nIGEgdGFzayB0aGF0IGRvZXMgdGhpcy4KKyAgICBBbnQyIHdpbGwgcHJvdmlkZSBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBkZWZpbmUgbmV3IGRhdGEKKyAgICB0eXBlcy48L3A+CisKKyAgICA8cD5FeGlzdGluZyBkYXRhLXR5cGVzIHdpbGwgYmUgaW1wcm92ZWQsIHRoZSBmaWxlcyBpbiBhIGZpbGVzZXQKKyAgICBjYW4gYmUgY2hvc2VuIGJhc2VkIG9uIG1vcmUgdGhhbiBqdXN0IHBhdHRlcm4gbWF0Y2hpbmcgZm9yIGV4YW1wbGUKKyAgICAobW9kaWZpY2F0aW9uIHRpbWUgb3IgcGVybWlzc2lvbnMgZm9yIGV4YW1wbGUpLiAgQW50MiB3aWxsIGhhdmUKKyAgICBidWlsdC1pbiB0YXNrcyBmb3Igc2V0IG9wZXJhdGlvbnMuPC9wPgorCisgICAgPHA+RGF0YSB0eXBlcyBhbmQgcHJvcGVydGllcyB3aWxsIHNoYXJlIHRoZSBzYW1lIG5hbWUgc3BhY2UgYW5kCisgICAgZm9sbG93IHRoZSBzYW1lIHNjb3BpbmcgYW5kIHByZWNlZGVuY2UgcnVsZXMuIAorICAgIDxpIGNsYXNzPSJjb21tZW50Ij4ke30gYWdhaW4uPC9pPjwvcD4KKworICAgIDxoMj5NdWx0aS1UaHJlYWRpbmcgb2YgVGFza3MgV2l0aGluIGEgVGFyZ2V0PC9oMj4KKworICAgIDxwPkl0IHdpbGwgYmUgcG9zc2libGUgdG8gcnVuIHNldmVyYWwgdGFza3MgaW4gcGFyYWxsZWwgLSB0aGVzZQorICAgIHRhc2tzIHdpbGwgYmVsb25nIHRvIHRoZSBzYW1lIHRhcmdldCBhbmQgYWxsIHRhc2tzIHdpbGwgYmUgam9pbmVkCisgICAgYXQgdGhlIGVuZCBvZiB0aGUgdGFyZ2V0LjwvcD4KKworICAgIDxoMj5JbnRlcm5hdGlvbmFsaXphdGlvbjwvaDI+CisKKyAgICA8cD5BbnQyIGl0c2VsZiB3aWxsIHByb3ZpZGUgaW50ZXJuYXRpb25hbGl6ZWQgKGVycm9yKSBtZXNzYWdlcyBhbmQKKyAgICBwcm92aWRlIHV0aWxpdHkgY2xhc3NlcyB0byBoZWxwIHRhc2sgd3JpdGVycyB0byBkbyB0aGUgc2FtZS4gIAorICAgIDxpIGNsYXNzPSJjb21tZW50Ij5UaGVzZSB1dGlsaXR5IGNsYXNzZXMgbWF5IHZlcnkgd2VsbCBjb21lIGZyb20gYQorICAgIGRpZmZlcmVudCAoSmFrYXJ0YSkgcHJvamVjdDwvaT4uPC9wPgorCisgICAgPHA+QW50J3MgcHJpbWFyeSBsYW5ndWFnZSBhbmQgdGhlIGxhbmd1YWdlIG9mIHRoZSBidWlsZCBmaWxlCisgICAgd2lsbCBjb250aW51ZSB0byBiZSBFbmdsaXNoLjwvcD4KKworICAgIDxoMT5SZWplY3RlZCBGZWF0dXJlczwvaDE+CisKKyAgICA8cD5UaGlzIGlzIGxpc3QgaXMgbm90IGNvbXBsZXRlLCBpdCBqdXN0IGhpZ2hsaWdodHMgc29tZSBvZiB0aGUKKyAgICByZWplY3RlZCBmZWF0dXJlcyBhbmQgdHJpZXMgdG8gZXhwbGFpbiB3aHkgdGhleSd2ZSBiZWVuCisgICAgcmVqZWN0ZWQuICBUd28gdmVyeSBjb21tb24gcmVhc29ucyB0byByZWplY3Qgc29tZXRoaW5nIHdlcmUsIHRoYXQKKyAgICB0aGUgcmVxdWVzdCBoYXMgYmVlbiB0b28gdmFndWUgb3IgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjb3VsZAorICAgIGFscmVhZHkgYmUgcHJvdmlkZWQgYnkgc29tZSBvdGhlciBhY2NlcHRlZCBuZXcgZmVhdHVyZS48L3A+CisKKyAgICA8cD5Gb3IgYSBjb21wbGV0ZSBsaXN0aW5nIG9mIGFsbCByZXF1ZXN0ZWQgZmVhdHVyZXMsIHNlZSA8YQorICAgIGhyZWY9InJlcXVlc3RlZC1mZWF0dXJlcy5odG1sIj5yZXF1ZXN0ZWQtZmVhdHVyZXMuaHRtbDwvYT4uIFRoZQorICAgIGRpc2N1c3Npb24gb24gYWxsIHRvcGljcyBjYW4gYmUgZm9sbG93ZWQgaW4gdGhlIDxhCisgICAgaHJlZj0iaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1hbnQtZGV2JnI9MSZ3PTIiPmFyY2hpdmVzCisgICAgZm9yIGFudC1kZXY8L2E+IGluIHRocmVhZHMgc3RhcnRpbmcgZnJvbSAyMDAxLTAzLTIxIC0gdGhlIHN1YmplY3QKKyAgICBsaW5lcyBjb250YWluZWQgZWl0aGVyIDxjb2RlPltWT1RFXTwvY29kZT4gb3IKKyAgICA8Y29kZT5bRElTQ108L2NvZGU+LjwvcD4KKworICAgIDxoMj5TaW1wbGUgRmxvdy1Db250cm9sPC9oMj4KKworICAgIDxwPlBlb3BsZSBhc2tpbmcgZm9yIHRoZXNlIGtpbmQgb2YgdGhpbmdzIGhhdmUgb2Z0ZW4gaGVhcmQgdGhlCisgICAgc3RhbmRhcmQgIkFudCBzaGFsbCBub3QgYmVjb21lIHlldCBhbm90aGVyIHNjcmlwdGluZyBsYW5ndWFnZSwgQW50CisgICAgc2hhbGwgbm90IGZhbGwgaW50byB0aGUgc2FtZSB0cmFwcyBtYWtlL1BlcmwgZGlkIC4uLiIgcmVzcG9uc2UKKyAgICBmcm9tIHRoZSBjb21taXR0ZXJzIGFuZCBzb21lIGxvbmctdGVybSBhbnQtZGV2IHBlb3BsZS48L3A+CisKKyAgICA8cD5UaGUgbG9uZyB2ZXJzaW9uIG9mIHRoYXQgYW5zd2VyIGlzOjwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT5UaGVyZSBhcmUgbG90cyBvZiBvcGVuIHNvdXJjZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB0aGVyZSBpcworICAgICAgbm8gbmVlZCB0byBkZWZpbmUgYSBuZXcgb25lLjwvbGk+CisKKyAgICAgIDxsaT5BbnQgaGFzIGJlZW4gY3JlYXRlZCB0byBiZSBhIGJ1aWxkIHRvb2wuICBXaGlsZSB5b3UgY2FuIHVzZQorICAgICAgaXQgZm9yIGEgd2hvbGUgbG90IG9mIG90aGVyIHRoaW5ncywgdGhpcyBpcyBub3QgQW50J3MgcHJpbWFyeQorICAgICAgZm9jdXMgKGFuZCBpdCBzaG91bGRuJ3QgYmUpLiAgTW9zdCB1c2UtY2FzZXMgdGhhdCBhc2sgZm9yCisgICAgICBmbG93LWNvbnRyb2wgYXJlIG91dCBvZiBBbnQncyBzY29wZS48L2xpPgorCisgICAgICA8bGk+QW50IGFscmVhZHkgcHJvdmlkZXMgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbmFsaXR5IGZvciBtYW55CisgICAgICBjb21tb24gc2l0dWF0aW9ucy4gIFRoZSBleGVjb24gYW5kIGFwcGx5IHRhc2tzIGNhbiBiZSB1c2VkIHRvCisgICAgICBpdGVyYXRlIG92ZXIgYSBzZXQgb2YgZmlsZXMgYXMgdGhlIChwbGFuZWQgZm9yIEFudDIpIGphdmFvbiBhbmQKKyAgICAgIGFudG9uIHRhc2tzIHdpbGwgZG8uPC9saT4KKworICAgICAgPGxpPlByb3ZpZGluZyBmbG93LWNvbnRyb2wgaW5zaWRlIEFudCdzIGNvcmUgd291bGQgaW5jcmVhc2UgdGhlCisgICAgICBjb21wbGV4aXR5IG9mIHRoaXMgY29yZS4gIFRoaXMgd291bGQgbWFrZSBpdCBkaWZmaWN1bHQgZm9yIG5ldworICAgICAgY29udHJpYnV0b3JzIHRvIHVuZGVyc3RhbmQgaG93IEFudCB3b3JrcyBhbmQgaW5jcmVhc2UgdGhlCisgICAgICBtYWludGVuYW5jZSBjb3N0IGZvciBBbnQgYXQgdGhlIHNhbWUgdGltZS4gIFRoZSBnb2FsIG9mIHRoZSBBbnQKKyAgICAgIGRldmVsb3BlcnMgaXMgdG8gcHVzaCBhcyBtdWNoIGNvbXBsZXhpdHkgYW5kIGZ1bmN0aW9uYWxpdHkgb3V0CisgICAgICBvZiBBbnQncyBjb3JlIGludG8gdGhlIHRhc2tzIGFzIHBvc3NpYmxlLjwvbGk+CisgICAgPC91bD4KKworICAgIDxwPlRoYXQgYmVpbmcgc2FpZCwgQW50MiB3aWxsIG1ha2UgaXQgZWFzeSB0byB3cml0ZSBpdGVyYXRpb24gb3IKKyAgICBjb25kaXRpb25hbCB0YXNrcyB2aWEgdGhlIG5ldyBjb250YWluZXIgdGFzayBjb25jZXB0LiAgV2UgZXhwZWN0CisgICAgZm9yZWFjaCwgc3dpdGNoIGFuZCBpZiB0YXNrcyB0byBiZSB3cml0dGVuLCBidXQgdGhleSB3aWxsIHByb2JhYmx5CisgICAgbm90IGJlY29tZSBjb3JlIHBhcnRzIG9mIHRoZSBBbnQgZGlzdHJpYnV0aW9uLjwvcD4KKworICAgIDxoMj5BZHZhbmNlZCBDb25kaXRpb25hbHMgZm9yIGlmL3VubGVzcyBBdHRyaWJ1dGVzPC9oMj4KKworICAgIDxwPlRoZSBhcmd1bWVudCBoZXJlIGlzIHRoZSBzYW1lIGFzIGZvciBmbG93LWNvbnRyb2wuICBXZSBhcmUKKyAgICB0YWxraW5nIGFib3V0IGNvbXBsZXhpdHkgdGhhdCBjYW4gYmUgcHVzaGVkIGZyb20gdGhlIGNvcmUgdG8gdGFza3MKKyAgICAtIGFuZCB0aGF0IGlzIHdoYXQgd2lsbCBiZSBkb25lLiAgSW5zdGVhZCBvZiBhZGRpdGlvbmFsIHBvd2VyIGZvcgorICAgIHRoZSBpZi91bmxlc3MgYXR0cmlidXRlcywgQW50MiB3aWxsIGhhdmUgYSBuZXcgdGFzayB0aGF0IGNhbiBzZXQKKyAgICBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2Ygb3RoZXIgcHJvcGVydGllcyBvciBsb2dpY2FsCisgICAgY29tYmluYXRpb25zIG9mIG90aGVyIGNvbmRpdGlvbnMsIHNvbWV0aGluZyBsaWtlIChtYWtpbmcgdXAKKyAgICBzeW50YXgpOjwvcD4KKworPHByZT4KKyZsdDtjb25kaXRpb24gbmFtZT0mcXVvdDtqYXZhbWFpbC1jb21wbGV0ZSZxdW90OyZndDsKKyAgJmx0O2FuZCZndDsKKyAgICAmbHQ7YXZhaWxhYmxlIGNsYXNzPSZxdW90O2phdmF4Lm1haWwuVHJhbnNwb3J0JnF1b3Q7LyZndDsKKyAgICAmbHQ7YXZhaWxhYmxlIGNsYXNzPSZxdW90O2phdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXImcXVvdDsvJmd0OworICAmbHQ7L2FuZCZndDsKKyZsdDsvY29uZGl0aW9uJmd0OworPC9wcmU+CisKKyAgICA8cD53aWxsIGJlY29tZSBwb3NzaWJsZTwvcD4KKworICAgIDxoMj5NdWx0aS1UaHJlYWRlZCBFeGVjdXRpb24gb2YgVGFyZ2V0czwvaDI+CisKKyAgICA8cD5UaGUgZ2VuZXJhbCBmZWVsaW5nIHdhcywgdGhhdCB0aGUgY29tYmluYXRpb24gb2YgdGFyZ2V0CisgICAgZGVwZW5kZW5jaWVzIGFuZCBtdWx0aS10aHJlYWRpbmcgd291bGQgc29vbiBiZWNvbWUgdG9vIGNvbXBsZXgsCisgICAgZXNwZWNpYWxseSBzaW5jZSBBbnQyIHdpbGwgYWxsb3cgcGVvcGxlIHRvIGV4cGxpY2l0bHkgZW5mb3JjZSB0aGUKKyAgICBvcmRlciBpbiB3aGljaCAoaW5kZXBlbmRlbnQpIHRhcmdldHMgd2lsbCBiZSBleGVjdXRlZC48L3A+CisKKyAgICA8cD5UaGlzIGlzc3VlIHdpbGwgYmUgZXhwbG9yZWQgYWdhaW4gbGF0ZXIsIGl0IGhhcyBub3QgYmVlbgorICAgIHJlamVjdGVkIGZvciBhbGwgdGltZSBiZWluZywgYnV0IGl0IGlzIG91dCBvZiBzY29wZSBmb3IKKyAgICBBbnQmbmJzcDsyLjA8L3A+CisKKyAgICA8aDE+SWRlYXMgZm9yIE5ldyBUYXNrcyBhbmQgVG9vbHM8L2gxPgorCisgICAgPHA+UGxlYXNlIHJlZmVyIHRvIDxhCisgICAgaHJlZj0icmVxdWVzdGVkLWZlYXR1cmVzLmh0bWwiPnJlcXVlc3RlZC1mZWF0dXJlcy5odG1sPC9hPiBpbiB0aGUKKyAgICBzZWN0aW9uICZxdW90O0kuIFRoaW5ncyB0aGF0IGRvbid0IGFmZmVjdCB0aGUgY29yZSBidXQgYXJlCisgICAgcmVxdWVzdHMgZm9yIG5ldyB0YXNrcyBvciBlbmhhbmNlbWVudHMgdG8gZXhpc3RpbmcgdGFza3MuJnF1b3Q7CisgICAgZm9yIHRoaXMuPC9wPgorCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvYW50Mi9vcmlnaW5hbC1zcGVjaWZpY2F0aW9uLmh0bWwgYi90cnVuay9kb2NzL2FudDIvb3JpZ2luYWwtc3BlY2lmaWNhdGlvbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTNlOWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2FudDIvb3JpZ2luYWwtc3BlY2lmaWNhdGlvbi5odG1sCkBAIC0wLDAgKzEsMjk0IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiIgInN0cmljdC5kdGQiPgorPEhUTUw+IAorICA8SEVBRD4gCisJIDxUSVRMRT5BbnQgU3BlY2lmaWNhdGlvbiwgdmVyc2lvbiAwLjU8L1RJVExFPiAKKyAgPC9IRUFEPiAKKyAgPEJPRFk+IAorCSA8SDE+QW50IFNwZWNpZmljYXRpb248L0gxPiAKKwkgPFA+VmVyc2lvbiAwLjUgKDIwMDAvMDQvMjApPC9QPiAKKwkgPFA+VGhpcyBkb2N1bWVudCBzcGVjaWZpZXMgdGhlIGJlaGF2aW9yIG9mIEFudC4gQXQgdGhpcyB0aW1lLCB0aGlzIGlzIGEKKwkJd29ya2luZyBkb2N1bWVudCB3aXRoIG5vIGltcGxlbWVudGF0aW9uLiBJdCBpcyBob3BlZCB0aGF0IHRoaXMgc3BlY2lmaWNhdGlvbgorCQl3aWxsIGxlYWQgdG8gYSBzaW1wbGllciBhbmQgbW9yZSBjb25zaXN0ZW50IGltcGxlbWVudGF0aW9uIG9mIEFudC48L1A+IAorCSA8UD5UaGlzIGRvY3VtZW50IGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGFuIGVuZCB1c2VyIG1hbnVhbCBvciB1c2VyCisJCWd1aWRlIHRvIEFudC4gVG8gYWRlcXVhdGx5IGV4cGxhaW4gdGhlIGNvbmNlcHRzIGhlcmVpbiBpbiBhIHdheSBhcHByb3ByaWF0ZSB0bworCQlzdWNoIGEgdXNlIHdvdWxkIHBvdGVudGlhbGx5IGNvbXBsaWNhdGUgdGhpcyBkb2N1bWVudC48L1A+IAorCSA8SDI+RGVzaWduIEdvYWxzPC9IMj4gCisJIDxQPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSBvdmVyYWxsIGRlc2lnbiBnb2FscyBvZiBBbnQ6PC9QPiAKKwkgPFVMPiAKKwkJPExJPlNpbXBsaWNpdHk8L0xJPiAKKwkJPExJPlVuZGVyc3RhbmRhYmlsaXR5PC9MST4gCisJCTxMST5FeHRlbnNpYmlsaXR5PC9MST4gCisJIDwvVUw+IAorCSA8SDM+U2ltcGxpY2l0eTwvSDM+IAorCSA8UD5BbnQgbXVzdCBiZSBzaW1wbGUgdG8gdXNlLiBPZiBjb3Vyc2UsIGFzIHRoZSBkZWZpbml0aW9uIG9mIHNpbXBsZSB2YXJpZXMKKwkJYWNjb3JkaW5nIHRvIHRoZSBhdWRpZW5jZSBvZiB0aGUgcHJvZ3JhbS4gRm9yIEFudCwgc2luY2UgaXQgaXMgYSBidWlsZCB0b29sCisJCWFpbWVkIGF0IHByb2dyYW1tZXJzLCB0aGUgZ29hbCBpcyB0byBiZSBzaW1wbGUgdG8gdXNlIGZvciBhIGNvbXBldGVudAorCQlwcm9ncmFtbWVyLjwvUD4gCisJIDxIMz5VbmRlcnN0YW5kYWJpbGl0eTwvSDM+IAorCSA8UD5BbnQgbXVzdCBiZSBjbGVhcmx5IHVuZGVyc3RhbmRpYmxlIGZvciBhIGZpcnN0IHRpbWUgYXMgd2VsbCBhcyBhIHZldGVyYW4KKwkJdXNlci4gVGhpcyBtZWFucyB0aGF0IGEgbmV3IHVzZXIgc2hvdWxkIGJlIGFibGUgdG8gdXNlIEFudCBjb21mb3J0YWJseSB0aGUKKwkJZmlyc3QgdGltZSBhbmQgdW5kZXJzdGFuZCBob3cgdG8gbW9kaWZ5IGEgYnVpbGQgZmlsZSBieSBsb29raW5nIGF0IGl0LiBBbmQgaXQKKwkJc2hvdWxkIG5vdCByZXF1aXJlIG11Y2ggZXhwZXJpZW5jZSB3aXRoIEFudCB0byB1bmRlcnN0YW5kIGhvdyBpdCB3b3JrcyBhbmQgaG93CisJCXRvIGNvbmZpZ3VyZSBpdCBmb3IgcGFydGljdWxhciBzaXR1dGF0aW9ucy48L1A+IAorCSA8SDM+RXh0ZW5zaWJpbGl0eTwvSDM+IAorCSA8UD5BbnQgbXVzdCBiZSBlYXN5IHRvIGV4dGVuZC4gVGhlIEFQSSB1c2VkIHRvIGV4dGVuZCBBbnQgbXVzdCBiZSBlYXN5IHRvCisJCXVzZSBhbmQgdGhlIHdheSBpbiB3aGljaCB0aGVzZSBleHRlbnNpb25zIGFyZSBsb2NhdGVkIGFuZCB1c2VkIGJ5IHRoZSBjb3JlCisJCXJ1bnRpbWUgc2hvdWxkIGJlIGNsZWFyLjwvUD4gCisJIDxIMj5Db25jZXB0dWFsIE92ZXJ2aWV3PC9IMj4gCisJIDxQPlRoaXMgaXMgYSBjb25jZXB0dWFsIG92ZXJ2aWV3IG9mIHRoZSBjb21wb25lbnRzIHVzZWQgYnkgQW50LiBGdWxsIEFQSXMKKwkJd2lsbCBiZSBkZWZpbmVkIGxhdGVyLjwvUD4gCisJIDxIMz5Qcm9qZWN0PC9IMz4gCisJIDxQPlRoZSBiYXNlIHVuaXQgb2Ygd29yayBpbiBBbnQgaXMgdGhlIDxTVFJPTkc+UHJvamVjdDwvU1RST05HPi4gQSBQcm9qZWN0CisJCWlzIGRlZmluZWQgYnkgYW4gZWRpdGFibGUgdGV4dCBmaWxlIGFuZCBpcyByZXByZXNlbnRlZCBieSBhbiBvYmplY3Qgb2YgdHlwZQorCQk8Q09ERT5vcmcuYXBhY2hlLmFudC5Qcm9qZWN0PC9DT0RFPiBhdCBydW50aW1lLjwvUD4gCisJIDxQPkEgUHJvamVjdCBpcyBhIGNvbGxlY3Rpb24gb2YgPFNUUk9ORz5Qcm9wZXJ0aWVzPC9TVFJPTkc+IGFuZAorCQk8U1RST05HPlRhcmdldHM8L1NUUk9ORz4uPC9QPiAKKwkgPEgzPlByb3BlcnRpZXM8L0gzPiAKKwkgPFA+UHJvcGVydGllcyBhcmUgbXV0YWJsZSBuYW1lLXZhbHVlIHBhaXJzIHRoYXQgYXJlIHNjb3BlZCB0byB0aGUgUHJvamVjdAorCQlhbmQgaGVsZCBpbiBhIHRhYmxlLiBPbmx5IG9uZSBwYWlyIGlzIGFsbG93ZWQgcGVyIG5hbWUuIEl0IGlzIGFudGljaXBhdGVkIHRoYXQKKwkJdGhpcyBkYXRhIHN0cnVjdHVyZSB3b3VsZCBiZSBvZiB0eXBlIDxDT0RFPmphdmEudXRpbC5Qcm9wZXJ0aWVzPC9DT0RFPiBvciBhIHR5cGUgdGhhdCBoYXMgYXBwcm94aW1hdGx5CisJCXRoZSBzYW1lIGNvbnRyYWN0LjwvUD4gCisJIDxQPlByb3BlcnRpZXMgY2FuIGJlIGRlZmluZWQgaW4gYSBoaWVyYXJjaGljYWwgbWFubmVyLiBUaGUgb3JkZXIgb2YKKwkJcHJlY2lkZW5jZSBpbiB0aGlzIGhpZWFyY2h5IGlzOjwvUD4gCisJIDxVTD4gCisJCTxMST5Qcm9wZXJ0aWVzIGRlZmluZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciB2aWEgYSBHVUkgdG9vbDwvTEk+IAorCQk8TEk+UHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSB0ZXh0IGZpbGUgd2hpY2ggZGVmaW5lcyB0aGUgcHJvamVjdC48L0xJPiAKKwkJPExJPlByb3BlcnRpZXMgZGVmaW5lZCBpbiBhIGZpbGUgaW4gdGhlIHVzZXJzIDxDT0RFPnVzZXIuaG9tZTwvQ09ERT4gZGlyZWN0b3J5PC9MST4gCisJCTxMST5Qcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgdGhhdCBjYW4gYmUgc2hhcmVkCisJCSAgYnkgbXVsdGlwbGUgdXNlcnMuPC9MST4gCisJIDwvVUw+IAorCSA8UD5Ob3RlOiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIEFudCBhbGxvd3MgdGhlIFN5c3RlbSBwcm9wZXJ0eSBsaXN0IHRvIGJlCisJCWNvbnN1bHRlZCBmb3IgYSByZXR1cm4gdmFsdWUgaWYgdGhlIHByb3BlcnR5IGxpc3QgZG9lc24ndCBzYXRpc2Z5IHRoZSByZXF1ZXN0ZWQKKwkJcHJvcGVydHkgbmFtZS4gQXMgYWxsIEphdmEgY29kZSBoYXMgYWNjZXNzIHRvIHRoZSBzeXN0ZW0gcHJvcGVydHkgbGlzdCB2aWEgdGhlCisJCTxDT0RFPmphdmEubGFuZy5TeXN0ZW08L0NPREU+IGNsYXNzLCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgY29uc2lkZXJlZCB0byBiZSBjb25mdXNpbmcgYW5kIHRvIGJlCisJCXJlbW92ZWQuPC9QPiAKKwkgPFA+Tm90ZTogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBBbnQgYWxsb3dzIHByb3BlcnR5IHN1YnN0aXR1dGlvbiB0byBiZQorCQlwZXJmb3JtZWQgaW4gdGhlIHByb2plY3QgZmlsZS4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGJlaW5nIHJlbW92ZWQuPC9QPiAKKwkgPEgzPlRhcmdldHM8L0gzPiAKKwkgPFA+VGFyZ2V0cyBhcmUgb3JkZXJlZCBjb2xsZWN0aW9ucyBvZiA8U1RST05HPlRhc2tzPC9TVFJPTkc+LCB1bml0cyBvZiB3b3JrCisJCXRvIGJlIHBlcmZvcm1lZCBpZiBhIFRhcmdldCBpcyBleGVjdXRlZC4gPC9QPiAKKwkgPFA+VGFyZ2V0cyBjYW4gZGVmaW5lIGRlcGVuZGFuY2llcyBvbiBvdGhlciBUYXJnZXRzIHdpdGhpbiB0aGUgUHJvamVjdC4gSWYKKwkJYSBUYXJnZXQgaXMgZGVlbWVkIHRvIGJlIGV4ZWN1dGVkLCBlaXRoZXIgZGlyZWN0bHkgb24gdGhlIGNvbW1hbmQgbGluZSwgb3IgdmlhCisJCWEgZGVwZW5kYW5jeSBmcm9tIHNvbWUgb3RoZXIgVGFyZ2V0LCB0aGVuIGFsbCBvZiBpdHMgZGVwZW5kZW5jaWVzIG11c3QgZmlyc3QgYmUKKwkJZXhlY3V0ZWQuIENpcmN1bGFyIGRlcGVuYW5jaWVzIGFyZSByZXNvbHZlZCBieSBleGFtaW5hdGlvbiBvZiB0aGUgZGVwZW5kYW5jeQorCQlzdGFjayB3aGVuIGEgVGFyZ2V0IGlzIGV2YWx1YXRlZC4gSWYgYSBkZXBlbmRhbmN5IGlzIGFscmVhZHkgb24gdGhlIHN0YWNrIG9mCisJCXRhcmdldHMgdG8gYmUgZXhlY3V0ZWQsIHRoZW4gdGhlIGRlcGVuZGFuY3kgaXMgY29uc2lkZXJlZCB0byBoYXZlIGJlZW4KKwkJc2F0aXNmaWVkLjwvUD4gCisJIDxQPkFmdGVyIGFsbCBkZXBlbmRhbmNpZXMgb2YgYSBUYXJnZXQgaGF2ZSBiZWVuIHNhdGlzZmllZCwgYWxsIG9mIHRoZSBUYXNrcworCQljb250YWluZWQgYnkgdGhlIHRhcmdldCBhcmUgY29uZmlndXJlZCBhbmQgZXhlY3V0ZWQgaW4gc2VxdWVudGlhbCBvcmRlci4gPC9QPiAKKwkgPEgzPlRhc2tzPC9IMz4gCisJIDxQPkEgVGFzayBpcyBhIHVuaXQgb2Ygd29yay4gV2hlbiBhIFRhc2sgaXMgdG8gYmUgZXhlY3V0ZWQsIGFuIGluc3RhbmNlIG9mCisJCXRoZSBjbGFzcyB0aGF0IGRlZmluZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBwYXJ0aWN1bGFyIHRhc2sgc3BlY2lmaWVkIGlzCisJCWluc3RhbnRpYXRlZCBhbmQgdGhlbiBjb25maWd1cmVkLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIDxDT0RFPm9yZy5hcGFjaGUuYW50LlRhc2s8L0NPREU+IGludGVyZmFjZS4KKwkJSXQgaXMgdGhlbiBleGVjdXRlZCBzbyB0aGF0IGl0IG1heSBiZSBhYmxlIHRvIHBlcmZvcm0gaXRzIGZ1bmN0aW9uLiBJdCBpcworCQlpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBvY2N1cnMganVzdCBiZWZvcmUgZXhlY3V0aW9uIG9mIHRoZQorCQl0YXNrLCBhbmQgYWZ0ZXIgZXhlY3V0aW9uIG9mIGFueSBwcmV2aW91cyB0YXNrcywgc28gdGhhdCBjb25maWd1cmF0aW9uCisJCWluZm9ybWF0aW9uIHRoYXQgd2FzIG1vZGlmaWVkIGJ5IGFueSBvdGhlciBUYXNrIGNhbiBiZSBwcm9wZXJseSBzZXQuPC9QPiAKKwkgPFA+V2hlbiBhIFRhc2sgaXMgZXhlY3V0ZWQsIGl0IGlzIHByb3ZpZGVkIGFjY2VzcyB0byB0aGUgb2JqZWN0CisJCXJlcHJlc2VudGluZyB0aGUgUHJvamVjdCBpdCBpcyBydW5uaW5nIGluIGFsbG93aW5nIGl0IHRvIGV4YW1pbmUgdGhlIFByb3BlcnR5CisJCWxpc3Qgb2YgdGhlIHByb2plY3QgYW5kIGFjY2VzcyB0byB2YXJpb3VzIG1ldGhvZHMgbmVlZGVkIHRvIG9wZXJhdGUuPC9QPiAKKwkgPEgyPlRhc2sgSmFyIExheW91dDwvSDI+IAorCSA8UD5UYXNrcyBhcmUgZGVmaW5lZCB3aXRoaW4gSmF2YSBBcmNoaXZlIGZpbGVzLiBUaGUgbmFtZSBvZiB0aGUgSkFSCisJCWRldGVybWluZXMgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlIHRhc2sgaXMga25vd24gYnkgaW4gdGhlIHN5c3RlbS4gRm9yCisJCWV4YW1wbGUsIGlmIGEgVGFzayBKQVIgaXMgbmFtZWQgbXZkaXIuamFyLCB0aGUgdGFzayBpcyBrbm93biB0byB0aGUgc3lzdGVtIGFzCisJCTxDT0RFPiZxdW90O212ZGlyJnF1b3Q7PC9DT0RFPi48L1A+IAorCSA8UD48RU0+UXVlc3Rpb246IFNob3VsZCB3ZSBzYXkgdGhhdCB0YXNrcyBiZWxvbmcgaW4gYSBKQVIgZmlsZSB3aXRoIHRoZQorCQkudHNrIGV4dGVuc2lvbj88L0VNPjwvUD4gCisJIDxQPlRoZSBjbGFzcyB3aXRoaW4gdGhlIEphciBmaWxlIHRoYXQgaW1wbGVtZW50cyB0aGUgPENPREU+b3JnLmFwYWNoZS5hbnQuVGFzazwvQ09ERT4gaW50ZXJmYWNlIGlzCisJCXNwZWNpZmllZCBieSBhIG1hbmlmZXN0IGF0dHJpYnV0ZSBuYW1lZCA8Q09ERT5BbnQtVGFzay1DbGFzczwvQ09ERT4gaW4gdGhlIEphciBtYW5pZmVzdC4gQW4gZXhhbXBsZQorCQltYW5pZmVzdCB3b3VsZCBsb29rIGxpa2U6PC9QPiAKKwkgPFBSRT4gICAgTWFuaWZlc3QtVmVyc2lvbjogMS4wCisgICAgQW50LVRhc2stQ2xhc3M6IG9yZy5hcGFjaGUuYW50LnRhc2suamF2YWMuSmF2YWNUYXNrPC9QUkU+IAorCSA8UD5XaGVuIHRoZSB0YXNrIGlzIHVzZWQgYnkgQW50LCBhIGNsYXNzIGxvYWRlciBpcyBjcmVhdGVkIHRoYXQgcmVhZHMKKwkJY2xhc3NlcyBmcm9tIHRoZSBKQVIgZmlsZS4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlcmUgaXMgbm8gY2hhbmNlIG9mIG5hbWVzcGFjZQorCQljb2xsaXNpb24gaW4gdGhlIGNsYXNzZXMgb2YgdmFyaW91cyB0YXNrIEpBUiBmaWxlcy48L1A+IAorCSA8SDI+SW5zdGFsbGF0aW9uPC9IMj4gCisJIDxQPldoZW4gQW50IGlzIGluc3RhbGxlZCBvbiBhIHVzZXIgc3lzdGVtLCBpdCBpbnN0YWxscyBhIGRpcmVjdG9yeQorCQlzdHJ1Y3R1cmUgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm06PC9QPiAKKwkgPFBSRT4mbHQ7aW5zdGFsbGRpciZndDsvYW50ICAgICAgKHVuaXggc2hlbGwgc2NyaXB0KQorICAgICAgICAgICAgL2FudC5iYXQKKyAgICAgICAgICAgIC9hbnQuamFyCisgICAgICAgICAgICAvYW50LnByb3BlcnRpZXMKKyAgICAgICAgICAgIC90YXNrcy9bdGFzayBqYXIgZmlsZXNdCisgICAgICAgICAgICAvZG9jcy9bZG9jdW1lbnRhdGlvbl0KKyAgICAgICAgICAgIC9SRUFETUU8L1BSRT4gCisJIDxQPk5vdGU6IEN1cnJlbnQgSmFrYXJ0YSBwcmFjdGljZSBpcyB0byBuYW1lIHRoZSBVbml4IHNoZWxsIHNjcmlwdCB3aXRoIGEKKwkJLnNoIGV4dGVuc2lvbi4gVGhpcyBnb2VzIGFnYWluc3QgVW5peCBjb252ZW50aW9ucyBhbmQgaXMgdW5lY2Vzc2FyeS4gVGVzdGluZworCQloYXMgc2hvd24gdGhhdCB0aGUgbGVhdmluZyB0aGUgZXh0ZW5zaW9uIG9mZiBvbiBVbml4IHdpbGwgbm90IGludGVyZmVyZSB3aXRoCisJCXRoZSB3b3JraW5nIG9mIHRoZSBXaW5kb3dzIGJhdGNoIGZpbGUuPC9QPgorCSA8UD5Ob3RlOiBUaGUgYW50LmphciBmaWxlIGhhcyBiZWVuIG1vdmVkIGZyb20gdGhlIGxpYi8gZGlyZWN0b3J5IGFuZCBwbGFjZWQKKwkJYWxvbmdzaWRlIHRoZSBzaGVsbCBzdGFydHVwIHNjcmlwdHMgKHdoaWNoIGhhdmUgYWxzbyBiZWVuIG1vdmVkIG91dCBvZiB0aGUgYmluLworCQlkaXJlY3RvcnkpLiBUaGlzIGlzIGJlY2F1c2Ugb24gd2luZG93cyBwbGF0Zm9ybXMsIHRoZSAuamFyIGZpbGUgaXMgYW4KKwkJZXhlY3V0YWJsZSBmaWxlIG9mIHNvcnRzLjwvUD4gCisJIDxIMz5BbnQgUHJvcGVydGllczwvSDM+IAorCSA8UD5UaGUgPENPREU+YW50LnByb3BlcnRpZXM8L0NPREU+IGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZQorCQlzZXQgYnkgZGVmYXVsdCB3aGVuIGFudCBpcyBydW4uIEluIGFkZGl0aW9uIHRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIHByb3BlcnRpZXMKKwkJdGhhdCBhcmUgdXNlZCBkaXJlY3RseSBieSBhbnQuIEFuIGV4YW1wbGUgb2YgdGhlc2UgcHJvcGVydGllcyBpbiB1c2UgaXM6PC9QPiAKKwkgPFBSRT4gICAgc3lzdGVtLnRhc2tkaXI9dGFza3MvCisgICAgdXNlci50YXNrZGlyPWFudHRhc2tzLzwvUFJFPiAKKwkgPFA+VGhlIDxDT0RFPnN5c3RlbS50YXNrZGlyPC9DT0RFPiBwcm9wZXJ0eSBzZXRzIHdoZXJlIHRoZSBzeXN0ZW0gbG9va3MgZm9yIEphdmEgQVJjaGl2ZSBmaWxlcworCQljb250YWluaW5nIHRhc2tzLiBJZiB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSByZWxhdGl2ZSBwYXRoLCB0aGVuIHRoZSBwYXRoIGlzCisJCXRha2VuIGFzIHJlbGF0aXZlIGZyb20gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuPC9QPiAKKwkgPFA+VGhlIDxDT0RFPnVzZXIudGFza2RpcjwvQ09ERT4gcHJvcGVydHkgZGVmaW5lcyB3aGVyZSB1c2VycyBjYW4gbG9jYXRlIEphdmEgQXJjaGl2ZSBmaWxlcworCQljb250YWluaW5nIHRhc2tzLiBJZiB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSByZWFsdGl2ZSBwYXRoLCB0aGVuIHRoZSBwYXRoIGlzCisJCXRha2VuIGFzIHJlbGF0aXZlIGZyb20gdGhlIHVzZXJzIGhvbWUgZGlyZWN0b3J5IChhcyBkZWZpbmVkIGJ5IHRoZSA8Q09ERT51c2VyLmhvbWU8L0NPREU+CisJCXN5c3RlbSBwcm9wZXJ0eSkuIFRhc2sgSkFSIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHRha2UgcHJlY2VuZGVuY2Ugb2YgdGhvc2UgaW4KKwkJdGhlIHN5c3RlbSBkaXJlY3RvcnkuPC9QPgorCSA8UD5Ob3RlOiA8RU0+SXQgaGFzIGJlZW4gc3VnZ2VzdGVkIHRvIGFkZCBhIHByb3BlcnRpZXMgZmlsZSBob29rIHRvIHRoZQorCQljb21tYW5kIGxpbmUgdG8gcm9sbCBpbiBwcm9wcy4gUGVuZGluZyBpbnZlc3RpZ2F0aW9uLjwvRU0+PC9QPiAKKwkgPEgzPlVzZXIgUHJlZmVyZW5jZXM8L0gzPiAKKwkgPFA+SW4gYWRkaXRpb24gdG8gdGhlIEFudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBhbiA8Q09ERT5hbnQucHJvcGVydGllczwvQ09ERT4gZmlsZSBjYW4gYmUKKwkJbG9jYXRlZCBpbiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5IChhcyBmb3VuZCBieSB0aGUgc3lzdGVtIHByb3BlcnR5IDxDT0RFPnVzZXIuaG9tZTwvQ09ERT4pCisJCXdoaWNoIGNhbiBkZWZpbmUgdXNlciBwcmVmZXJlbmNlcyBzdWNoIGFzIHRoZSBsb2NhdGlvbiBvZiBhIHVzZXIgdGFza3MKKwkJZGlyZWN0b3J5LiBQcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcyBmaWxlIHRha2UgcHJlY2lkZW5jZSBvdmVyIHRob3NlIHNldCBpbgorCQl0aGUgaW5zdGFsbGF0aW9uJ3MgPENPREU+YW50LnByb3BlcnRpZXM8L0NPREU+IGZpbGUuIFN1Y2ggYSBmaWxlIGNvdWxkIGxvb2sgbGlrZTo8L1A+IAorCSA8UFJFPiAgICB1c2VyLnRhc2tkaXI9YW50dGFza3MvCisgICAgamF2YWMuZGVidWc9b2ZmPC9QUkU+IAorCSA8UD5Qcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggPENPREU+JnF1b3Q7c3lzdGVtLiZxdW90OzwvQ09ERT4gaW4gdGhlIHVzZXIncyA8Q09ERT5hbnQucHJvcGVydGllczwvQ09ERT4gZmlsZSBhcmUgbm90CisJCWFsbG93ZWQgYW5kIG11c3QgY2F1c2UgYSB3YXJuaW5nIHRvIGJlIHRocm93bi48L1A+IAorCSA8SDI+UHJvamVjdCBDb25maWd1cmF0aW9uPC9IMj4gCisJIDxQPkFudCdzIFByb2plY3QgdGV4dCBmaWxlIGlzIHN0cnVjdHVyZWQgdXNpbmcgWE1MIGFuZCByZWZsZWN0cyB0aGUKKwkJc3RydWN0dXJlIG9mIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgZGVzY3JpYmVkIGluIHRoZSBDb25jZXB0dWFsIE92ZXJ2aWV3LjwvUD4gCisJIDxQPkEgc2FtcGxlIFByb2plY3QgZmlsZTo8L1A+IAorCSA8UFJFPiZsdDtwcm9qZWN0IG5hbWU9JnF1b3Q7cHJvamVjdG5hbWUmcXVvdDsgZGVmYXVsdHRhcmdldD0mcXVvdDttYWluJnF1b3Q7IHRhc2tkaXI9JnF1b3Q7dGFza3MvJnF1b3Q7Jmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtqYXZhYy5kZWJ1ZyZxdW90OyB2YWx1ZT0mcXVvdDtvbiZxdW90Oy8mZ3Q7CisgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDttYWluJnF1b3Q7Jmd0OworICAgICZsdDt0YXNraW1wbCAuLi4mZ3Q7CisgICAgICAgLi4uCisgICAgJmx0Oy90YXNraW1wbCZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9QUkU+IAorCSA8SDM+VGhlIFByb2plY3QgRWxlbWVudDwvSDM+IAorCSA8UD5UaGUgPENPREU+cHJvamVjdDwvQ09ERT4gZWxlbWVudCBoYXMgdGhlIGZvbGxvd2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzOjwvUD4gCisJIDxVTD4gCisJCTxMST48Q09ERT48U1RST05HPmRlZmF1bHR0YXJnZXQ8L1NUUk9ORz48L0NPREU+IGRlZmluaW5nIHRoZSBkZWZhdWx0IHRhcmdldCB0byBiZSBleGVjdXRlZCBpZiBubyBvdGhlciB0YXJnZXQKKwkJICBpcyBzcGVjaWZpZWQgd2hlbiBBbnQgaXMgcnVuPC9MST4gCisJIDwvVUw+IAorCSA8UD5JdCBhbHNvIGhhcyB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIGFsbG93ZWQgYXR0cmlidXRlczo8L1A+IAorCSA8VUw+IAorCQk8TEk+PENPREU+PENPREU+PFNUUk9ORz5uYW1lPC9TVFJPTkc+PC9DT0RFPjwvQ09ERT4gZGVmaW5pbmcgYSBuYW1lIGZvciB0aGlzIHByb2plY3Q8L0xJPiAKKwkJPExJPjxDT0RFPjxTVFJPTkc+dGFza2RpcjwvU1RST05HPjwvQ09ERT4gZGVmaW5pbmcgYSBkaXJlY3RvcnkgaW4gd2hpY2ggcHJvamVjdCBzcGVjaWZpYyB0YXNrcyBjYW4gYmUKKwkJICBsb2NhdGVkLiBUYXNrcyBpbiB0aGlzIGRpcmVjdG9yeSB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSBpbiB0aGUgZWl0aGVyIHRoZQorCQkgIHVzZXIgdGFza2RpciBvciB0aGUgaW5zdGFsbGF0aW9uIHRhc2tkaXIuPC9MST4gCisJIDwvVUw+IAorCSA8UD5UaGUgZm9sbG93aW5nIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGFzIGNoaWxkcmVuIG9mIHRoZSBwcm9qZWN0CisJCWVsZW1lbnQ6PC9QPiAKKwkgPFVMPiAKKwkJPExJPjxDT0RFPjxTVFJPTkc+cHJvcGVydHk8L1NUUk9ORz48L0NPREU+IGRlZmluaW5nIGEgcHJvcGVydHkgc2NvcGVkIHRvIHRoZSBwcm9qZWN0PC9MST4gCisJCTxMST48Q09ERT48U1RST05HPnRhcmdldDwvU1RST05HPjwvQ09ERT4gZGVmaW5pbmcgYSB0YXJnZXQ8L0xJPgorCSA8L1VMPgorCSA8SDM+VGhlIFByb3BlcnR5IEVsZW1lbnQ8L0gzPgorCSA8UD5hc2RmPC9QPgorCSA8SDM+VGhlIFRhcmdldCBFbGVtZW50PC9IMz4KKwkgPFA+YXNmZDwvUD4gCisJIDxIMj5Db25maWd1cmF0aW9uIG9mIFRhc2tzPC9IMj4gCisJIDxQPlRoZSBUYXNrIHNlY3Rpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBzdHJ1Y3R1cmVkIGFzIHN1Y2g6PC9QPiAKKwkgPFBSRT4gICZsdDtbdGFza25hbWVdIFthdHRuYW1lPXZhbHVlXSBbYXR0bmFtZT12YWx1ZV0uLi5dJmd0OworICAgIFsmbHQ7W2VsZW1lbnRuYW1lXSBbYXR0bmFtZT12YWx1ZV0gLi4uJmd0OyAuLi4gJmx0Oy9bZWxlbWVudG5hbWVdJmd0O10KKyAgJmx0Oy9bdGFza25hbWVdJmd0OzwvUFJFPiAKKwkgPFA+VGhlIHRhc2tuYW1lIGlzIHVzZWQgdG8gZmluZCB0aGUgY2xhc3Mgb2YgdGhlIFRhc2suIE9uY2UgdGhlIGNsYXNzIGhhcworCQliZWVuIGxvY2F0ZWQgYW5kIGFuIGluc3RhbmNlIG9mIGl0IGNyZWF0ZWQsIGFsbCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgVGFzaworCQlhcmUgcmVmbGVjdGVkIGludG8gdGhlIHRhc2sgaW5zdGFuY2UgdXNpbmcgYmVhbiBwYXR0ZXJucy4gRm9yIGV4YW1wbGUsIGlmIGEKKwkJVGFzayBjb250YWlucyBhbiBhdHRyaWJ1dGUgbmFtZWQgJnF1b3Q7ZGlyZWN0b3J5JnF1b3Q7LCB0aGUgbWV0aG9kIG5hbWVkCisJCXNldERpcmVjdG9yeSB3b3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgYXR0cmlidXRlIHZhbHVlIGNhc3QgdG8gdGhlIGFwcHJvcHJpYXRlCisJCXR5cGUgZGVzaXJlZCBieSB0aGUgbWV0aG9kLiA8RU0+KFdoYXQgdG8gZG8gaWYgdGhlIHR5cGUgaXNuJ3QgYSBmaWxlIG9yIGEKKwkJc2ltcGxlIHR5cGUsIGxvb2sgZm9yIHRoZSBjbGFzcyBhbmQgc2VlIGlmIGl0IGhhcyBhIHNldFN0cmluZyBtZXRob2Q/KTwvRU0+PC9QPgorCSAKKwkgPFA+VGV4dCBibG9ja3MgY29udGFpbmVkIGJ5IHRoZSBlbGVtZW50IGFyZSBhZGRlZCB0byB0YXNrIHVzaW5nIGFuIGFkZFRleHQKKwkJbWV0aG9kLiA8RU0+UGxhY2UgYW4gZXhhbXBsZS4uLjwvRU0+PC9QPiAKKwkgPFA+Rm9yIGVhY2ggZWxlbWVudCBjb250YWluZWQgaW4gdGhlIFRhc2sgZGVmaW5pdGlvbiwgYW4gYWRkRWxlbWVudG5hbWUKKwkJbWV0aG9kIGlzIGZvdW5kIG9uIHRoZSB0YXNrLiBUaGUgcGFyYW1ldGVyIHR5cGUgb2YgdGhlIG1ldGhvZCBkZWZpbmVzIGFuIG9iamVjdAorCQl0aGF0IHdpbGwgYmUgbG9hZGVkIGFuZCBpbnN0YW50aWF0ZWQuIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IGFyZQorCQlyZWZsZWN0ZWQgaW50byB0aGUgb2JqZWN0IHVzaW5nIGJlYW4gbWV0aG9kcy4gQW55IHRleHQgaXMgc2V0IHVzaW5nIHRoZSBhZGRUZXh0CisJCW1ldGhvZC4gQW55IGVsZW1lbnRzIGFyZSByZWN1cnNlZCBpbiB0aGUgc2FtZSBmYXNoaW9uLjwvUD4KKwkgPFA+U2VhcmNoIG9yZGVyIG9mIHRhc2tzLi4uLiBwcm9qZWN0L3VzZXIvc3lzdGVtPC9QPiAKKwkgPEgyPkNvbW1hbmQgTGluZTwvSDI+IAorCSA8UD5UaGUgY29tbWFuZCBsaW5lIHV0aWxpdHkgcHJvdmlkZWQgd2l0aCBBbnQgbXVzdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcKKwkJYWxsb3dhYmxlIHN5bnRheDo8L1A+IAorCSA8UD48Q09ERT5hbnQgcHJvamVjdGZpbGUgW3Byb3A9dmFsdWUgW3Byb3A9dmFsdWUuLi5dXSBbdGFyZ2V0XTwvQ09ERT48L1A+CisJIDxQPkludGVybmFsbHksIHRoZSBjb21tYW5kIGxpbmUgc2hlbGwgc2NyaXB0cyBzaG91bGQgY2FsbCB0aGUgPENPREU+b3JnLmFwYWNoZS5hbnQuTWFpbjwvQ09ERT4gY2xhc3MKKwkJd2l0aCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czo8L1A+CisJIDxQUkU+amF2YSAtRGFudC5ob21lPWluc3RhbGxkaXIgb3JnLmFwYWNoZS5hbnQuTWFpbiAkKjwvUFJFPgorCSA8UD5vciBpdHMgZXF1aXZhbGVudCBvbiB0aGUgaG9zdCBwbGF0Zm9ybS4gTm90ZSB0aGF0IHRoZSBhbnQgaW5zdGFsbGF0aW9uCisJCWRpcmVjdG9yeSBpcyBhIFN5c3RlbSBwcm9wZXJ0eS4gVGhlIGFib3ZlIHN5bnRheCByZXN1bHRzIGluIGFudC5ob21lIGJlaW5nCisJCXBsYWNlZCBpbiB0aGUgU3lzdGVtIHByb3BlcnR5IGxpc3QuPC9QPgorCSA8UD5Ob3RlOiA8RU0+T24gdW5peCwgZmluZGluZyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBzY3JpcHQgdGhhdCB3YXMgbGF1bmNoZWQKKwkJaXMgcmVsYXRpdmVseSBlYXN5LiBIb3dldmVyIG9uIFdpbmRvd3MsIEknbSBub3Qgc3VyZSB0aGUgYmVzdCB3YXkgb2YgaGFuZGxpbmcKKwkJdGhpcy48L0VNPjwvUD4gCisJIDxIMj5GaWxlIE5hbWluZyBDb252ZW50aW9uczwvSDI+IAorCSA8UD5GaWxlIG5hbWluZyBpbiBhIGNyb3NzIHBsYXRmb3JtIHRvb2wgaXMgdHJpY2t5LiBGb3IgbWF4aW11bSBwb3J0YWJpbGl0eQorCQlhbmQgdW5kZXJzdGFuZGlibGl0eSBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHByb2plY3QgZmlsZXMgdXNlIHRoZSBmb2xsb3dpbmcKKwkJY29udmVudGlvbnM6PC9QPiAKKwkgPFVMPiAKKwkJPExJPlRoZSAnLycgY2hhcmFjdGVyIGlzIHVzZWQgYXMgYSBkaXJlY3Rvcnkgc2VwZXJhdG9yPC9MST4gCisJCTxMST5UaGUgJzonIGNoYXJhY3RlciBpcyB1c2VkIGFzIGEgcGF0aCBzZXBlcmF0b3I8L0xJPiAKKwkJPExJPk9ubHkgcmVsYXRpdmUgcGF0aHMgYXJlIHVzZWQ8L0xJPiAKKwkgPC9VTD4gCisJIDxQPkhvd2V2ZXIsIHRvIGFsbG93IGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5IGFuZCB0byBhbGxvdyBwcm9qZWN0IGF1dGhvcnMKKwkJdG8gdXNlIGNvbnZlbnRpb25zIHRoYXQgbWFrZSBzZW5zZSBvbiB0aGVpciBuYXRpdmUgcGxhdGZvcm0sIEFudCBhbGxvd3MgZm9yIGEKKwkJcmVwcmVzZW50YXRpb24gb2YgZmlsZSBuYW1lcyB3aGljaCBoYXMgdGhlIGZvbGxvd2luZyBydWxlczo8L1A+IAorCSA8VUw+IAorCQk8TEk+RGlyZWN0b3JpZXMgYXJlIHNlcGVyYXRlZCBieSB0aGUgZm9yd2FyZCBzbGFzaCAoJy8nKSBvciBiYWNrd2FyZHMKKwkJICBzbGFzaCAoJ1wnKSBjaGFyYWN0ZXIuPC9MST4gCisJCTxMST5GaWxlIG5hbWVzIHN0YXJ0aW5nIHdpdGggZWl0aGVyIG9mIHRoZSBhYm92ZSBkaXJlY3Rvcnkgc2VwZXJhdG9ycyBhcmUKKwkJICBjb25zaWRlcmVkIHRvIGJlIGFic29sdXRlIHBhdGhzLjwvTEk+IAorCQk8TEk+T24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgZmlsZSByb290cyAoZS5nLiBXaW5kb3dzKSwgYSBmaWxlCisJCSAgbmFtZSB0aGF0IHN0YXJ0cyB3aXRoIGEgc2luZ2xlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgYSBjb2xvbiAoJzonKQorCQkgIGZvbGxvd2VkIGJ5IGEgZGlyZWN0b3J5IHNlcGVyYXRvciBkZWZpbmVzIGFuIGFic29sdXRlIHBhdGggd2hlcmUgdGhlIGxldHRlcgorCQkgIGNvcnJlc3BvbmRzIHdpdGggYSBkaXJlY3Rvcnkgcm9vdC48L0xJPiAKKwkJPExJPkZpbGUgbmFtZXMgc3RhcnRpbmcgd2l0aCBhbnkgb3RoZXIgY2hhcmFjdGVyIGFyZSBjb25zaWRlcmVkIHRvIGJlCisJCSAgcmVsYXRpdmUgcGF0aHMuIEluIHByb2plY3QgZmlsZXMsIGFsbCByZWxhdGl2ZSBwYXRocyBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8KKwkJICB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBwcm9qZWN0IGZpbGUgaXMgbG9jYXRlZC48L0xJPiAKKwkgPC9VTD4gCisJIDxQPkFic29sdXRlIHBhdGhzIGFyZSBub3QgcmVjb21tZW5kZWQgZm9yIGJ1aWxkIGZpbGVzIGFzIHRoZXkgcmVkdWNlIHRoZQorCQlhYmlsaXR5IHRvIHNoYXJlIGEgcHJvamVjdCBiZXR3ZWVuIHUgc2VycyBvciBtYWNoaW5lcy48L1A+IAorCSA8UD5JbiBzaXR1dGF0aW9ucyB3aGVyZSBhIHNldCBvZiBmaWxlbmFtZXMgbmVlZCB0byBiZSBzcGVjaWZpZWQsIHN1Y2ggYXMKKwkJZGVmaW5pbmcgYSBjbGFzc3BhdGgsIGJvdGggdGhlIGNvbG9uICgnOicpIGFuZHNlbWljb2xvbiAoJzsnKSBhcmUgYWxsb3dhYmxlCisJCWNoYXJhY3RlcnMgdG8gc2VwZXJhdGUgZWFjaCBmaWxlbmFtZS4gVGhlIG9ubHkgY2FzZSB0aGF0IGhhcyB0byBiZQorCQlkaXNhbWJpZ3VhdGVkIGlzIGlmIGEgdXNlciBzcGVjaWZpZXMgcGF0aHMgdGhhdCBjb250YWluIHdpbmRvd3Mgc3R5bGUgYWJzb2x1dGUKKwkJcGF0aHMuIEluIHRoaXMgY2FzZSwgdGhlIGNvbG9uIGlzIG5vdCB0cmVhdGVkIGFzIGEgcGF0aCBzZXBlcmF0b3IgaWYgdGhlCisJCWZvbGxvd2luZyBydWxlcyBhcmUgbWV0OjwvUD4gCisJIDxVTD4gCisJCTxMST5UaGUgY2hhcmFjdGVyIHR3byBwbGFjZXMgYmVmb3JlIHRoZSBjb2xvbiBpcyBlaXRoZXIgb2YgdGhlIGFsbG93YWJsZQorCQkgIHBhdGggc2VwZXJhdG9ycyAoJzonIG9yICc7Jykgb3IgaWYgdGhlIGNvbG9uIGlzIHRoZSBzZWNvbmQgY2hhcmFjdGVyIG9mIHRoZQorCQkgIHN0cmluZy48L0xJPiAKKwkJPExJPlRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjb2xvbiBpcyBhIGFscGhhYmV0aWMgY2hhcmFjdGVyCisJCSAgaW4gdGhlIHJhbmdlIGEteiBvciBBLVouPC9MST4gCisJCTxMST5UaGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb2xvbiBpcyBlaXRoZXIgb2YgdGhlIGFsbG93YWJsZQorCQkgIGRpcmVjdG9yeSBzZXBlcmF0b3JzICgnLycgb3IgJ1wnKS48L0xJPiAKKwkgPC9VTD4gCisJIDxIMj5TY3JpcHRpbmcgTW9kZWw8L0gyPiAKKwkgPFA+U2FtLCBJJ20gbGVhdmluZyB0aGlzIHRvIHlvdS4gPC9QPgorCSA8SDI+UnVudGltZSBSZXF1aXJlbWVudHM8L0gyPgorCSA8UD5UaGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBhcmUgc3lzdGVtIHJlcXVpcmVtZW50cyB0aGF0IEFudCBzaG91bGQgaGF2ZQorCQlpbiBvcmRlciB0byBydW4gY29ycmVjdGx5LiBXZSBzaG91bGQgbm90IGJ1bmRsZSBpbiBhbnkgb2YgdGhlc2UgaW50byB0aGUKKwkJZGlzdHJpYnV0aW9uIG9mIGFudC48L1A+CisJIDxVTD4KKwkJPExJPkpESyAxLjEgb3IgZ3JlYXRlcjwvTEk+CisJCTxMST5BIEpBWFAgY29tcGxpYW50IHBhcnNlciBvbiB0aGUgY2xhc3NwYXRoPC9MST4KKwkgPC9VTD4KKwkgPFA+Tm90ZTogPEVNPldoZW4gcnVubmluZyBvbiBKREsgMS4yIG9yIGdyZWF0ZXIsIHRoZSB0b29scy5qYXIgaXNuJ3Qgb24gdGhlCisJCWNsYXNzcGF0aCBieSBkZWZhdWx0LiBUaGVyZSdzIGEgZmV3IGRpZmZlcmVudCB3YXlzIHdlIGNhbiB0YWtlIGNhcmUgb2YgdGhpcy4KKwkJT25lIGlzIHRvIHB1dCBpdCBvbiB0aGUgY2xhc3NwYXRoIGluIHRoZSBleGVjdXRlIHNjcmlwdCAoSSBkb24ndCBsaWtlIHRoaXMKKwkJb25lKS4gQW5vdGhlciBpcyB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0b29scy5qYXIgYXQgcnVudGltZSBhbmQgcHV0IGl0IG9uIHRoZQorCQljbGFzc3BhdGggb2YgY2xhc3MgbG9hZGVycyB0aGF0IGxvYWQgaW4gdGFzay5qYXJzIHNvIHRoYXQsIGF0IGxlYXN0IGluIHRoZQorCQlzY29wZSBvZiB0aGUgVGFza3MsIHRoZSByZWxldmFudCBjbGFzc2VzIGFyZSB0aGVyZS4gPC9FTT48L1A+CisJIDxQPjwvUD4gCisJIDxQPjwvUD4gPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9hbnQyL3JlcXVlc3RlZC1mZWF0dXJlcy5odG1sIGIvdHJ1bmsvZG9jcy9hbnQyL3JlcXVlc3RlZC1mZWF0dXJlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YWE4YWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2FudDIvcmVxdWVzdGVkLWZlYXR1cmVzLmh0bWwKQEAgLTAsMCArMSwxMTA2IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxib2R5PgorCis8aDI+Cis8Y2VudGVyPlJlcXVlc3RlZCBGZWF0dXJlcyBmb3IgQW50MjwvY2VudGVyPgorPC9oMj4KKworPGg0PgorSS4gVGhpbmdzIHRoYXQgZG9uJ3QgYWZmZWN0IHRoZSBjb3JlIGJ1dCBhcmUgcmVxdWVzdHMgZm9yIG5ldyB0YXNrcyBvcgorZW5oYW5jZW1lbnRzIHRvIGV4aXN0aW5nIHRhc2tzLgorPC9oND4KKworJnF1b3Q7QWNjZXB0ZWQmcXVvdDsgZm9yIGEgdGFzayBkb2Vzbid0IG1lYW4gdGhhdAordGFzayB3aWxsIGJlIGEgY29yZSB0YXNrIChvciBldmVuIGJlIHN1cHBsaWVkIGJ5IGEgdm90ZXIpLCBqdXN0IHRoYXQgaGF2aW5nCitpdCAoYXMgYW4gb3B0aW9uYWwgdGFzaykgd291bGQgYmUgYWNjZXB0YWJsZS4KKzxwPgorCis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5BY2NlcHRlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWRkIGEgbmV3IGRhdGF0eXBlIGZpbHRlcnNldCB0byBncm91cCB0b2tlbi1maWx0ZXJzLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitNYWtlIHVzYWdlIG9mIHBhcnRpY3VsYXIgZmlsdGVycy9maWx0ZXJzZXRzIGV4cGxpY2l0IGluIGNvcHkgdGFza3MuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK01ha2UgZmFjYWRlIHRhc2tzIGZvciB0aGluZ3MgbGlrZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPgorKEppa2VzSW1wbCwgTW9kZXJuSW1wbCwgZXRjLikuCisoT25lIGNhbmRpZGF0ZSBpcyA8Y29kZT4mbHQ7amFyJmd0OzwvY29kZT4sIHdpdGggaW1wbGVtZW50YXRpb25zIGZvcgorYSA8Y29kZT4mbHQ7ZmFzdGphciZndDs8L2NvZGU+LCBmb3IgZXhhbXBsZS4pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1VuaWZ5IG11bHRpcGxlIHNpbWlsYXIgdGFza3MgdG8gdXNlIHNpbWlsYXIgZm9ybXMgKGVnLiwgYWxsIHRoZQorPGNvZGU+Jmx0O2phdmFjYyZndDs8L2NvZGU+LXR5cGUKK3Rvb2xzKS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorT2JmdXNjYXRpbmcgdGFzay4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQmV0dGVyIHNjcmlwdGluZy9ub3RpZmljYXRpb24gc3VwcG9ydCBzbyB0aGUgaG9va3MgYXJlIGF2YWlsYWJsZSB0bworc2VuZCBub3RpZmljYXRpb25zIGF0IGNlcnRhaW4gdGltZXMuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0FkZCBhbiA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFzayB0aGF0IHdpbGwgZmluZCBidWlsZCBmaWxlcyBhY2NvcmRpbmcKK3RvIGEgZmlsZXNldCBhbmQgaW52b2tlIGEgY29tbW9uIHRhcmdldCBpbiB0aGVtLiAoPGNvZGU+Jmx0O2FudG9uJmd0OzwvY29kZT4/KQorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitBZGQgYSBKYXZhQXBwbHkgdGFzayB0aGF0IGV4ZWN1dGVzIGEgZ2l2ZW4gY2xhc3Mgd2l0aCBmaWxlcyBmcm9tIGEKK2ZpbGVzZXQgYXMgYXJndW1lbnRzIChzaW1pbGFyIHRvIDxjb2RlPiZsdDthcHBseSZndDs8L2NvZGU+KS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorSW5jbHVkZSBzb21lIG1vcmUgc29waGlzdGljYXRlZCBsb2dnZXJzIHdpdGggdGhlIEFudCBkaXN0cmlidXRpb24gJiMxNTA7Citlc3BlY2lhbGx5IGZvciBzZW5kaW5nIGVtYWlscy4gTWFrZSB0aGUgZXhpc3Rpbmcgb25lIG1vcmUgZmxleGlibGUKKyhzdHlsZXNoZWV0IHVzZWQgYnkgWG1sTG9nZ2VyKS4gKENvdWxkIGJlIHBhcnQgb2YgdGhlIHNhbWUgbW9kdWxlIHRhc2tzCit3b3VsZCBiZSBkZXZlbG9wZWQgaW4/KQorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitCZXR0ZXIgZG9jcyAoZWcuLCBtb3JlIGV4YW1wbGVzLCB0dXRvcmlhbHMsIGJlZ2lubmVyIGRvY3VtZW50cywgcmVmZXJlbmNlCitzaGVldHMgZm9yIHRhc2tzLCBwcmludGFibGUgdmVyc2lvbiwgZXRjLikuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1JQTSB0YXNrLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitUYXNrIGZvciBzcGxpdHRpbmcgZmlsZXMgKGhlYWQvdGFpbC9zcGxpdC1saWtlIGZ1bmN0aW9uYWxpdHkpLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitUYXNrIHRvIGNyZWF0ZSBYTUkgZnJvbSBKYXZhLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitTb2Nrc2lmaWVkIG5ldHdvcmtpbmcgdGFza3MsIFNTSCB0YXNrcy4KKyhQZXRlciBEb25hbGQgZXhwcmVzc2VkIHNvbWUgbGVnYWwgY29uY2VybnMgdGhhdCBtaWdodCBuZWVkIHRvIGJlIG92ZXJjb21lLCAKK2RlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24uKQorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitBIHJlYWNoYWJsZSB0YXNrIHRoYXQgd29ya3MgbXVjaCBsaWtlIDxjb2RlPiZsdDthdmFpbGFibGUmZ3Q7PC9jb2RlPiwKK2ZvciBuZXR3b3JrIFVSTHMuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1Rhc2sgdG8gZXh0cmFjdCBjbGFzc2VzIGZyb20gYSBqYXItZmlsZSB0aGF0IGEgZ2l2ZW4gY2xhc3MgZGVwZW5kcyBvbi4KKyhCYXNlZCBvbiA8Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT4gb3IgSUJNJ3MgSkFYLCBmb3IgZXhhbXBsZS4pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1VuaWZ5IDxjb2RlPiZsdDthdmFpbGFibGUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3VwdG9kYXRlJmd0OzwvY29kZT4KK2ludG8gYSBtb3JlIGdlbmVyYWwKKzxjb2RlPiZsdDtjb25kaXRpb24mZ3Q7PC9jb2RlPiB0YXNrICYjMTUwOyBzdXBwb3J0Cis8Y29kZT5BTkQ8L2NvZGU+Lzxjb2RlPk9SPC9jb2RlPiBvZgorc2V2ZXJhbCB0ZXN0cyBoZXJlLgorKFdpbGwgbmVlZCBtb3JlIGRpc2N1c3Npb24gYmVjYXVzZSBvZiB2b3RlIGJ5IFBldGVyIERvbmFsZC4pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0pTUC1jb21waWxhdGlvbiB0YXNrLiAoU291bmRzIGxpa2UgYSBjYW5kaWRhdGUgZm9yIGEgZmFjYWRlIHRhc2suKQorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitVUkwtc3BpZGVyIHRhc2sgdGhhdCBjaGVja3MgbGlua3MgZm9yIG1pc3NpbmcgY29udGVudCBvciBzZXJ2ZXIgZXJyb3JzLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5SZWplY3RlZDwvYj4KKzwvZm9udD4KKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK01ha2UgdGhlIGRlZmF1bHQgbG9nZ2VyJ3Mgb3V0cHV0IGNsZWFyLCBpbmZvcm1hdGl2ZSwgYW5kIHRlcnNlLiAoUmVqZWN0b3JzCit0aGluayBpdCBhbHJlYWR5IGlzLikKKzwvYmxvY2txdW90ZT4KKzwvbGk+PC91bD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWRkIGFuIGF0dHJpYnV0ZSB0byA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiB0byByZWFkIGluIGFuIGVudGlyZSBmaWxlCithcyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorTWFrZSBQQVRILWhhbmRsaW5nIGNvbnNpc3RlbnQuIEV2ZXJ5IHRhc2sgdGhhdCBoYXMgYSBQQVRIIGF0dHJpYnV0ZQorbXVzdCBhbHNvIGFjY2VwdCByZWZlcmVuY2VzIHRvIFBBVEhzLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YnI+Cis8aDQ+CitJSS4gR29hbHMgdGhhdCBuZWVkIHRvIGJlIGFic3RyYWN0IHVudGlsIHdlIGdldCBpbnRvIGRlc2lnbgorZGVjaXNpb25zLgorPC9oND4KKworRHVyaW5nIHRoZSBkaXNjdXNzaW9uIGl0IGJlY2FtZSBvYnZpb3VzIHRoYXQgc29tZSB0aGluZ3MgZnJvbSB0aGlzIGxpc3QKK2FyZSBnb2FscyBmb3IgQW50IGFuZCBzb21lIHNob3VsZCBiZSBndWlkZWxpbmVzIGZvciBkZXZlbG9wZXJzLgorVGhlcmVmb3JlLCB0aGVyZSBhcmUgdHdvIGZsYXZvcnMsICZxdW90O0FjY2VwdGVkJnF1b3Q7IGFuZAorJnF1b3Q7QWNjZXB0ZWQgQXMgR3VpZGVsaW5lJnF1b3Q7LgorPHA+CisKKzxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKyZuYnNwOyZuYnNwOzxiPkFjY2VwdGVkPC9iPgorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitQcm92aWRlIGEgY2xlYXIgbWlzc2lvbiBzdGF0ZW1lbnQgZm9yIEFudC4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorTWFpbiBnb2FsczxiPjo8L2I+IHNpbXBsaWNpdHksIHVuZGVyc3RhbmRhYmlsaXR5LCBleHRlbnNpYmlsaXR5LgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitSZW1vdmUgbWFnaWMgcHJvcGVydGllcyBpZiBhdCBhbGwgaHVtYW5seSBwb3NzaWJsZS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorUmVtb3ZlIGFzIG11Y2ggZGVwZW5kZW5jeSBvbiBuYXRpdmUgc2NyaXB0cyBhcyBwb3NzaWJsZS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQ2xlYW4gb2JqZWN0IG1vZGVsIChpZS4sIFByb2plY3QvVGFyZ2V0L1Rhc2spLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitHb29kIGV2ZW50IG1vZGVsIHRvIGludGVncmF0ZSB3ZWxsIHdpdGggSURFL0dVSS9ldGMuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1VzZSBhIGNvbnNpc3RlbnQgbmFtaW5nIHNjaGVtZSBmb3IgYXR0cmlidXRlcyBhY3Jvc3MgYWxsIHRhc2tzLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitLZWVwIGJ1aWxkLWZpbGUgc3ludGF4IGFzIGNvbXBhdGlibGUgdG8gQW50MSBhcyBwb3NzaWJsZQorKGllLiwgZG9uJ3QgYnJlYWsgc29tZXRoaW5nIGp1c3QgYmVjYXVzZSB3ZSBjYW4pLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitLZWVwIHRoZSBpbnRlcmZhY2UgZm9yIHRhc2tzIGFzIHNpbWlsYXIgdG8gdGhhdCBvZiBBbnQxIGFzCitwb3NzaWJsZSAoaWUuLCBkb24ndCBicmVhayBzb21ldGhpbmcganVzdCBiZWNhdXNlIHdlIGNhbikuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0FudCBzaG91bGQgYmUgY2FuY2VsYWJsZS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iLTEiPgorJm5ic3A7Jm5ic3A7PGI+QWNjZXB0ZWQgQXMgR3VpZGVsaW5lPC9iPgorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitObyBjb21taXQgb2YgbmV3IGZlYXR1cmVzIHdpdGhvdXQgZG9jdW1lbnRhdGlvbi4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorTm8gY29tbWl0IG9mIG5ldyBmZWF0dXJlcyB3aXRob3V0IHRlc3QtY2FzZXMuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxicj4KKzxoND4KK0lJSS4gVGhpbmdzIHRoYXQgYXJlIHNpbXBsZSBhbmQgZWFzeSB0byBpbXBsZW1lbnQsIHdoZXJlIHdlIGV4cGVjdCB0aGUKK2NvbW1pdHRlcnMgdG8gYWdyZWUuCis8L2g0PgorCis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5BY2NlcHRlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorTmFtZXNwYWNlIHN1cHBvcnQgc28gZGlmZmVyZW50IGNvbmNlcm5zIGNhbiBvY2N1cHkgZGlmZmVyZW50IG5hbWVzcGFjZXMKK2Zyb20gQW50ICh0aHVzLCBTQVgyL0pBWFAxLjEpLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitKYXZhMgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitSZW1vdmUgYWxsIGRlcHJlY2F0ZWQgbWV0aG9kcywgYXR0cmlidXRlcywgdGFza3MuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0FsbG93IGFsbCBkYXRhdHlwZXMgdG8gYmUgZGVmaW5lZCBhbnl3aGVyZSAoaWUuLCBhcyBjaGlsZHJlbiBvZgorcHJvamVjdCBhcyB3ZWxsIGFzIG9mIHRhcmdldCkuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK01ha2UgcHJvcGVydGllcyBmdWxseSBkeW5hbWljIChpZS4sIGFsbG93IHRoZWlyIHZhbHVlIHRvIGJlIHJlYXNzaWduZWQpLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitVbmlmeSB0aGUgbmFtZXNwYWNlIG9mIGFsbCBkYXRhIHR5cGVzIChpZS4sIHByb3BlcnRpZXMgKyBmaWxlc2V0cyArCitwYXR0ZXJuc2V0cyArIGZpbHRlcnNldHMpLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitBZGQgYSB1c2VyLWRlZmluZWQgbWVzc2FnZSBpZiBhIHRhcmdldCB3aWxsIGJlIHNraXBwZWQgYXMgYQorcmVzdWx0IG9mIHRoZSBzcGVjaWZpZWQgPGNvZGU+aWYvdW5sZXNzPC9jb2RlPi4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWxsb3cgdXNlciBkYXRhdHlwZXMgdG8gYmUgZGVmaW5lZCB2aWEgYSA8Y29kZT4mbHQ7dHlwZWRlZiZndDs8L2NvZGU+CitzaW1pbGFyIHRvIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4uCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxicj4KKzxoND4KK0lWLiBUaGluZ3Mgd2UgcHJvYmFibHkgYWdyZWUgb24gYnV0IG5lZWQgdG8gZGlzY3VzcyB0aGUgZGV0YWlscyBvcgorZGVjaWRlIGJldHdlZW4gc2V2ZXJhbCBwb3NzaWJsZSBvcHRpb25zLgorPC9oND4KKworJnF1b3Q7QWNjZXB0ZWQmcXVvdDsgbWVhbnMgdGhlIGdvYWwvaWRlYSBpcyBmaW5lLCBub3QgdGhhdCBhIGRlY2lzaW9uIG9uIGEKK3BhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gbWFkZS4KKzxwPgorCis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5BY2NlcHRlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorVGhlIGFiaWxpdHkgZm9yIEdVSS9JREUgdG9vbHMgdG8gaW50ZWdyYXRlIGVhc2lseSB3aXRoIG9iamVjdCBtb2RlbAord2l0aG91dCByZWludmVudGluZyB0aGUgd2hlZWwgYW5kIHdyaXRpbmcgdGhlaXIgb3duIHBhcnNlciAod2hpY2gKK0FudGlkb3RlIHdhcyBmb3JjZWQgdG8gZG8pLiAKKyhUd28gc3VnZ2VzdGVkIHNvbHV0aW9ucyB3ZXJlIGFsbG93aW5nIEdVSSBkZXZlbG9wZXJzIHRvIGV4dGVuZAordGhlIG9iamVjdCBtb2RlbCAoaWUuLCBHVUlUYXNrIGV4dGVuZHMgVGFzaykgb3IgdG8gaGF2ZSBUYXNrIGFzIGFuCitpbnRlcmZhY2UgKGllLiwgR1VJVGFzayBpbXBsZW1lbnRzIFRhc2spLiBUaGlzIHdheSwgdGhlIEdVSSB0YXNrcyBjb3VsZAorYmUgVzNDIERPTSBlbGVtZW50cywgaGF2ZSBwcm9wZXJ0eSB2ZXRvZXJzL2xpc3RlbmVycywgZXRjLikKKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorU3VwcG9ydCBmb3IgbnVtZXJvdXMgZnJvbnQtZW5kcyAmIzE1MDsgZnJvbSBjb21tYW5kLWxpbmUgb3ZlciBHVUkgdG8gc2VydmxldHMuCisoQ29yb2xsYXJ5IG9mIHRoZSBhYm92ZT8pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0Z1bGx5IGludGVycHJldGVkIGF0IHJ1bi10aW1lLiAoVGhpcyBhbG1vc3QgcmVxdWlyZXMgc29tZSBmb3JtIG9mCithYnN0cmFjdGlvbi9wcm94eSB0aGF0IHN0YW5kcyBpbiBwbGFjZSBvZiB0YXNrcyB0aWxsIGl0IGlzCitpbnRlcnByZXRlZC4gVGhpcyBjYW4gYmUgaGFzaC10YWJsZXMvc2ltcGxlIERPTS1saWtlIG1vZGVsL3doYXRldmVyLikKKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorUHJvdmlkZSB1dGlsaXR5IGNsYXNzZXMgdG8gYWlkIGluIGJ1aWxkaW5nIHRhc2tzIChpZS4sIGxpa2UKKzxjb2RlPiZsdDt1cHRvZGF0ZSZndDs8L2NvZGU+IGZ1bmN0aW9uYWxpdHkgYWJzdHJhY3RlZCkuCisoTmVlZCB0byBiZWNvbWUgbW9yZSBzcGVjaWZpYyBoZXJlLikKKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorTWFrZSBhbnQtY2FsbCBhIGxvdy1jb3N0IG9wZXJhdGlvbiBzbyBpdCBjYW4gZG8gY2VydGFpbgorb3B0aW9uYWwvdGVtcGxhdGUtbGlrZSBvcGVyYXRpb25zLgorKENvcm9sbGFyeSBvZiAiZnVsbHkgaW50ZXJwcmV0ZWQgYXQgcnVuLXRpbWUiPykKKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWxsb3cgZmFjaWxpdGllcyB0byBidWlsZCBwcm9qZWN0cyBmcm9tIG11bHRpcGxlIHNvdXJjZXMgKGllLiwgQ1NTK1hNTCwKK1hTTFQrWE1MLCBWZWxvY2l0eSt0ZXh0IG9yIGRhdGFiYXNlLCBmcm9tIGluc2lkZSBqYXJzIG9yIG5vcm1hbCAKKzxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZXMsIGV0Yy4pCisoQWxsb3cgdGhlIHByb2plY3QgdHJlZSB0byBiZSBidWlsdCBkeW5hbWljYWxseS4pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK01vdmUgdG8gYSBzeXN0ZW0gdGhhdCBhbGxvd3MgZG9jcyB0byBiZSBnZW5lcmF0ZWQgJiMxNTA7IGRvYyBzbmlwcGV0cworc2hvdWxkIGJlIGluY2x1ZGVkIHdpdGggdGhlIHRhc2tzIHRoZXkgZG9jdW1lbnQuCisoV2hpY2ggRFREPyBXaGljaCB0b29scyBmb3IgZ2VuZXJhdGlvbj8pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0FsbG93IHRhc2tzIHRvIGJlIGxvYWRlZCBmcm9tIGphcnMuIChVc2UKK2VpdGhlciBhbiBYTUwgZmlsZSBpbiA8Y29kZT5UU0stSU5GL3Rhc2tkZWZzLnhtbDwvY29kZT4gb3IgYQorbWFuaWZlc3QgZmlsZS4pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0FsbG93IGRvY3VtZW50YXRpb24gdG8gYmUgc3RvcmVkIGluIDxjb2RlPi50c2s8L2NvZGU+IGphcnMuCisoQ29yb2xsYXJ5IG9mIHRoZSBhYm92ZSB0d28gcG9pbnRzPykKKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorU2VwYXJhdGUgdGFza3MgaW50byA8Y29kZT4udHNrPC9jb2RlPiBqYXJzIHNvbWVob3cuCisoRGVjaWRlIG9uIGNhdGVnb3JpZXMuCitQcm9iYWJseSB2aWEgZnVuY3Rpb24gJiMxNTA7IGllLiwgamF2YSB0YXNrcywgZmlsZSB0YXNrcywgRUpCIHRhc2tzLCBldGMuKQorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitNYWtlIGhhdmluZyBzZXBhcmF0ZSBidWlsZC1maWxlcyBlYXN5ICg8aT4mIzIyNDsgbGE8L2k+IEFudEZhcm0pIGFuZCBpbXBvcnRpbmcgZGlmZmVyZW50Citwcm9qZWN0cyBhIGJyZWV6ZS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorUHJvdmlkZSBzdXBwb3J0IGZvciB1c2VyLWRlZmluZWQgdGFzayBjb25maWd1cmF0aW9ucyAmIzE1MDsgKGllLiwgZ2l2ZQordXNlcnMgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUgZm9yIGF0dHJpYnV0ZXMgKGVnLiwgYWx3YXlzCit1c2UgPGNvZGU+ZGVidWc9InRydWUiPC9jb2RlPiBpbiA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB1bmxlc3MKK3NvbWV0aGluZyBlbHNlIGhhcyBiZWVuIHNwZWNpZmllZCkuIAorKFRocmVlIGlkZWFzIHNvIGZhcjxiPjo8L2I+IGEgQ1NTLWxpa2UgbGFuZ3VhZ2UsCithIDxjb2RlPiZsdDt0YXNrY29uZmlnJmd0OzwvY29kZT4gZWxlbWVudCwgb3IKK3Byb3BlcnRpZXMgZm9sbG93aW5nIGEgc3BlY2lmaWMgbmFtaW5nIHNjaGVtZS4pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1N1cHBvcnQgbW9yZSBjb250cm9sIG92ZXIgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgcGFzc2VkCit0byBzdWJwcm9qZWN0cyAobW9kdWxlcykuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1Rhc2sgdG8gcHJvbXB0IGZvciB1c2VyIGlucHV0LgorKERvZXMgYWZmZWN0IGNvcmUsIGFzIHdlIG5lZWQgYSBtZWFucyB0byByZXF1ZXN0IGlucHV0IGZyb20gdGhlIGZyb250LWVuZC4pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0FkZCBDVlMgbG9naW4gZmVhdHVyZS4KKyhSZXF1aXJlcyBoYW5kbGluZyBvZiB1c2VyIGlucHV0LikKKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorRWFzaWVyIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBHVUksIG1heWJlIHdlYnN0YXJ0IGZyb20gdGhlIGhvbWVwYWdlLgorVGhpcyBpbmNsdWRlcyBhc2tpbmcgdGhlIHVzZXIgd2hldGhlciBoZSB3YW50cyB0byB1c2Ugb3B0aW9uYWwgdGFza3MKK2FuZCBkb3dubG9hZHMgdGhlIHJlcXVpcmVkIGxpYnMsIGF1dG9tYXRpYyB1cGdyYWRlcyBhbmQgc28gb24uCisKK1NlbGYtZXh0cmFjdGluZyBqYXIgaW5zdGFsbGVyPGI+OjwvYj4KKzxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxjb2RlPmphdmEgLWphciBqYWthcnRhLWFudC0xLjMtYmluLmphcjwvY29kZT4KKzxicj4KK1Byb21wdHMgZm9yIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgZXh0cmFjdHMgYXJjaGl2ZSwgZml4ZXMgYWxsIAordGV4dCBmaWxlcyB3aXRoIDxjb2RlPiZsdDtmaXhDUkxGJmd0OzwvY29kZT4gdGFzazxiPjs8L2I+IG9uIFVOSVgsCittYWtlcyBzY3JpcHRzIGV4ZWN1dGFibGUuICAKK0NvdWxkIGFsc28gbW9kaWZ5IGFudCBzY3JpcHRzIHdpdGggdGhlIGxvY2F0aW9uIG9mIDxjb2RlPkFOVF9IT01FPC9jb2RlPi4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorTG9nbyBmb3IgQW50LgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitEZXRhY2ggQW50IGZyb20gPGNvZGU+U3lzdGVtLmVycjwvY29kZT4vPGNvZGU+LmluPC9jb2RlPi88Y29kZT4ub3V0PC9jb2RlPi4KKyhCZXdhcmUgb2YgcHJvYmxlbXMgd2l0aCBzcGF3bmVkIHByb2Nlc3Nlcy4pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0J1aWxkLWZpbGVzIHNob3VsZCBiZSBkZWNsYXJhdGl2ZSBpbiBuYXR1cmUuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKyZuYnNwOyZuYnNwOzxiPlJlamVjdGVkPC9iPgorPC9mb250PgorPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG1vZGlmeSBkZXRhaWxzIG9mIHRoZSBhY3R1YWwgYnVpbGQgKGUuZy4gY2xhc3NwYXRoLAorY29tcGlsZXIgdXNlZCwgZXRjLikgd2l0aG91dCB0aGUgbmVlZCB0byBjaGFuZ2UgdGhlIGJ1aWxkIHNwZWNpZmljYXRpb24uCisoRG8gPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IGFuZCA8Y29kZT5idWlsZC5zeXNjbGFzc3BhdGg8L2NvZGU+Citjb3ZlciBldmVyeXRoaW5nLCBvciBkbyB3ZSBuZWVkIHRvIGFkZCBtb3JlIHN0dWZmIGxpa2UgdGhpcz8pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0JldHRlciBzdWItcHJvamVjdCBoYW5kbGluZworKHdoYXRldmVyIHRoYXQgbWVhbnMgaW4gZGV0YWlsKS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJyPgorPGg0PgorVi4gVGhpbmdzIHdlIHByb2JhYmx5IGRvbid0IGFncmVlIG9uLiAKKzwvaDQ+Cis8aT48Yj5EYXRhdHlwZXM8L2I+PC9pPgorCis8cD4KKzxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKyZuYnNwOyZuYnNwOzxiPkFjY2VwdGVkPC9iPgorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitBbGxvdyA8Y29kZT4mbHQ7aW5jbHVkZSZndDsvJmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgordG8gd29yayB3aXRoIG11bHRpcGxlIGNoYXJhY3RlcmlzdGVyaWNzIG9mIGEgZmlsZQorKGllLiwgaW5jbHVkZSBpbnRvIGZpbGVzZXQgaWYgZmlsZSBpcyByZWFkYWJsZSwgbW9kaWZpZWQgYWZ0ZXIgMjl0aCBvZiBGZWIsCitoYXMgYSBuYW1lIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybiA8Y29kZT4mcXVvdDsqKi8qLmphdmEmcXVvdDs8L2NvZGU+IGFuZAordGhlIHByb3BlcnR5IDxjb2RlPmZvby5wcmVzZW50PC9jb2RlPiBpcyBzZXQuIFNvbWV0aGluZyBzaW1pbGFyIHRvPGI+OjwvYj4KKzxwcmU+CisgICZsdDtpbmNsdWRlJmd0OworICAgICZsdDtpdGVtLWZpbHRlciB0eXBlPSJuYW1lIiB2YWx1ZT0iKiovKi5qYXZhIi8mZ3Q7CisgICAgJmx0O2l0ZW0tZmlsdGVyIHR5cGU9InBlcm1pc3Npb24iIHZhbHVlPSJyIi8mZ3Q7CisgICAgJmx0OyEtLSBjb3VsZCBvcHRpb25hbGx5IGJlIGRpcmVjdG9yeSBvciBzb21lIG90aGVyIHN5c3RlbSBzcGVjaWZpYyBmZWF0dXJlcyAtLSZndDsKKyAgICAmbHQ7aXRlbS1maWx0ZXIgdHlwZT0idHlwZSIgdmFsdWU9ImZpbGUiLyZndDsKKyAgICAmbHQ7aXRlbS1maWx0ZXIgdHlwZT0ibW9kaWZ5LXRpbWUiCisgICAgICAgICAgICAgICAgIG9wZXJhdGlvbj0iZ3JlYXRlci10aGFuIiAKKyAgICAgICAgICAgICAgICAgdmFsdWU9IjI5dGggRmViIDIwMDMiLyZndDsKKyAgJmx0Oy9pbmNsdWRlJmd0OworPC9wcmU+Cis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1Byb3ZpZGUgc3VwcG9ydCBmb3Igbm9uLWhhcmR3aXJlZCAoaWUuLCBsb2FkYWJsZSkgbG93LWxldmVsIAorY29tcG9uZW50cyAobWFwcGVycy9pdGVtc2V0LWZpbHRlcnMvY29udmVydGVycykuIEFsbG93IHRoZW0gdG8gYmUgCitsb2FkZWQgaW4gZWl0aGVyIGdsb2JhbGx5IG9yIHZpYSBhIG5ldyBjbGFzc2xvYWRlci4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorUHJvdmlkZSBzdXBwb3J0IGZvciBub24taGFyZHdpcmVkIChpZS4sIGxvYWRhYmxlKSBjb252ZXJ0ZXJzLgorPGJyPgorUTxiPjo8L2I+IFdoYXQgaXMgYSBjb252ZXJ0ZXI/IElzIHRoaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsPworPGJyPgorQTxiPjo8L2I+IE5vdCBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIGJ1dCBhIHdheSB0byBleHRlbmQgdGhlIGVuZ2luZQordG8gY29udmVydCBtb3JlIGRhdGF0eXBlcy4gQ3VycmVudGx5LCB3ZSBoYXZlIGEgZml4ZWQgc2V0IHRoYXQgaXMgCitleHBhbmRlZCBvbiBvY2Nhc2lvbiAoaWUuLCBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKyBGaWxlKS4gSW5zdGVhZAorb2Ygc3ByZWFkaW5nIGNvbnZlcnRpbmcgY29kZSB0aHJvdWdob3V0IHRoZSB0YXNrcywgaXQgY2FuIGJlIGNlbnRyYWxpemVkIAoraW50byBvbmUgY29tcG9uZW50IGFuZCB1c2VkIGJ5IHRoZSBlbmdpbmUuIFRoaXMgYmVjb21lcyBwYXJ0aWN1bGFybHkgCityZWxldmVudCBpZiB5b3UgYnVpbGQgQW50LWJhc2VkIHRlc3Rpbmcgc3lzdGVtcyBhbmQgdXNlIEFudCBpbiBjZXJ0YWluCit3ZWItcmVsYXRlZCBhcmVhcy4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorU2V0LWFyaXRobWV0aWMgZm9yIGZpbGVzZXQvcGF0dGVybnNldC8qc2V0LgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitJbmhlcml0YW5jZSBvZiBBbnQgcHJvcGVydGllcy9kYXRhdHlwZXMvY29udGV4dC9ldGMuIGluIHByb2plY3QgaGllcmFyY2h5LgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5SZWplY3RlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWxsb3cgbWFwcGVycyB0byBiZSBnZW5lcmljaXplZCBzbyB0aGF0IHBhcnRpY3VsYXIgZmVhdHVyZXMgY2FuIGJlIG1vZGlmaWVkIAorZHVyaW5nIG1hcHBpbmcuIFNvbWV0aGluZyBzaW1pbGFyIHRvPGI+OjwvYj4KKzxwcmU+CisgICZsdDtmaWxlc2V0IC4uLiZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLnNoIi8mZ3Q7CisgICAgJmx0O21hcHBlciB0eXBlPSJ1bml4LXBlcm1pc3Npb25zIiZndDsKKyAgICAgICZsdDtwYXJhbSBuYW1lPSJ1c2VyIiB2YWx1ZT0iYW50Ii8mZ3Q7CisgICAgICAmbHQ7cGFyYW0gbmFtZT0iZ3JvdXAiIHZhbHVlPSJhbnQiLyZndDsKKyAgICAgICZsdDtwYXJhbSBuYW1lPSJtb2QiIHZhbHVlPSI3NTUiLyZndDsKKyAgICAmbHQ7L21hcHBlciZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+Cis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1Byb3ZpZGUgZGF0YXR5cGVzIHRocm91Z2ggcHJvcGVydHkgdGFnIGFuZCByZW1vdmUgbmVlZCBmb3Igc2VwYXJhdGUKK2ZyZWUtc3RhbmRpbmcgZW50aXRpZXMuIFRoYXQgaXM8Yj46PC9iPjxicj4KKzxwcmU+CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJmb28iJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iYmxhaCImZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLyoqLmphdmEiIC8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7L3Byb3BlcnR5Jmd0OworPC9wcmU+Cis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK01ha2UgYWxsIGRhdGF0eXBlcyBpbnRlcmZhY2VzIHRvIGFsbG93IHRoZW0gdG8gYmUgY3VzdG9taXplZCBpbiBtYW55Cit3YXlzLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitJbmhlcml0YW5jZSBiZXR3ZWVuIEFudCBkYXRhdHlwZXMgKGllLiwgZmlsZXNldCBBIGluaGVyaXRzIGZyb20KK2ZpbGVzZXQgQiAoaW5jbHVkZXMgYWxsIGVudHJpZXMgaW4gQSkuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0hvbW9nZW5pemUgbm90aW9uIG9mIFBBVEhzIGFuZCBmaWxlc2V0cy4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGk+PGI+QW50J3MgZ29hbHM8L2I+PC9pPgorCis8cD4KKzxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKyZuYnNwOyZuYnNwOzxiPkFjY2VwdGVkPC9iPgorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitQcm92aWRlIHN1cHBvcnQgZm9yIENKQU4uCis8YnI+CitROiBJbiB3aGF0IHdheT88YnI+CitBOiBQcm9iYWJseSBieSBzdXBwbHlpbmcgYSBzZXQgb2YgdGFza3MgdGhhdCBkb3dubG9hZCB2ZXJzaW9uZWQgCitiaW5hcmllcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBkZXBlbmRlbmNpZXMsIGNhY2hpbmcgdGhlIGRvd25sb2FkcworaW4gYSBrbm93biBwbGFjZSBhbmQgdXBkYXRpbmcgYmluYXJpZXMgd2hlbiByZXF1aXJlZC4KKygmcXVvdDtXaGVuIHJlcXVpcmVkJnF1b3Q7IGJlaW5nIGluZGljYXRlZCBieSBhIGNoYW5nZSBpbiBwcm9wZXJ0eSB2YWx1ZXMpLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5SZWplY3RlZDwvYj4gKGFzIGEgcHJpbWFyeSBnb2FsKQorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitNYWtlIGl0IHBvc3NpYmxlIHRvIHJlLXVzZSB0aGUgdGFzayBlbmdpbmUgZm9yIG90aGVyIHRoaW5ncworKGllLiwgSW5zdGFsbHNoaWVsZC10eXBlIGFwcCwgUGV0ZXIncyBjcm9uLXNlcnZlciwgYW5kIG90aGVyIHRhc2stYmFzZWQKK29wZXJhdGlvbnMpLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8aT48Yj5DbGFzcy1sb2FkaW5nPC9iPjwvaT4KKworPHA+Cis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5SZWplY3RlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorRm9yY2UgcmVzb2x1dGlvbiBvZiBjbGFzc2VzIG9uIGxvYWRpbmcsIHRvIGlkZW50aWZ5IGNsYXNzLWxvYWRlciAKK2lzc3VlcyBlYXJseSAoYXQgbGVhc3QgaW4gZ2xvYmFsIGNsYXNzbG9hZGVyKS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitJZ25vcmUgYW55IGNsYXNzZXMgY29udGFpbmVkIGluIHRoZSBkYW1uZWQgZXh0IGRpcnMgb2YgYQorSlZNICYjMTUwOyBwb3NzaWJseSBieSBsYXVuY2hpbmcgd2l0aCBzb21ldGhpbmcgbGlrZTxiPjo8L2I+Cis8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Y29kZT5qYXIgLURqYXZhLmV4dC5kaXI9Zm9vIC1qYXIgYW50LmphcjwvY29kZT4KKzxicj4KKyhBY2NlcHRlZCBpZiBvcHRpb25hbC4pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGk+PGI+V29ya3NwYWNlL3N1Yi1idWlsZCBpc3N1ZXM8L2I+PC9pPgorCis8cD4KKzxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKyZuYnNwOyZuYnNwOzxiPkFjY2VwdGVkPC9iPgorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitDcmVhdGUgdGhlIGNvbmNlcHQgb2Ygd29ya3NwYWNlIHNvIHRoYXQgcHJvamVjdHMgY2FuIGJlIGJ1aWx0IGluIGEKK0RBRyBhbmQgdGh1cyBlbmFibGUgcHJvamVjdHMgbGlrZSBDYXRhbGluYS9Ub21jYXQgdG8gaGF2ZSBhbiBlYXN5CitidWlsZCBwcm9jZXNzLiBJdCBhbHNvIGhlbHBzIENKQU4gdG8gYSBsZXNzZXIgZGVncmVlIGFuZCB3b3VsZAorcGFydGlhbGx5IHNvbHZlIHRoZSBqYXJzLWluLUNWUyB0aGluZy4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWxsb3cgYSB0YXJnZXQgdG8gZGVwZW5kIG9uIGEgdGFyZ2V0IGluIGFub3RoZXIgYnVpbGQtZmlsZS4gIAorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKyZuYnNwOyZuYnNwOzxiPlJlamVjdGVkPC9iPgorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitQcm9qZWN0IGluaGVyaXRhbmNlLiAoV2hhdCdzIHRoaXM/KQorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitUYXJnZXQgaW5oZXJpdGFuY2UuIFRoYXQgaXMsIHRoZSBhYmlsaXR5IHRvIGluY2x1ZGUgdGFyZ2V0cyBmcm9tIG90aGVyIAorcHJvamVjdCBmaWxlcywgb3ZlcnJpZGluZyB0aGVtIGFzIG5lY2Vzc2FyeSAoc28sIGNhc2NhZGluZyBwcm9qZWN0CitmaWxlcykuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0FkZCBhbiBhdHRyaWJ1dGUgdG8gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+IHRvIGZlZWQgYmFjayB0aGUgZW52aXJvbm1lbnQKKyhwcm9wZXJ0aWVzIGFuZCB0YXNrZGVmcykgZnJvbSB0aGUgY2hpbGQgYnVpbGQgdG8gdGhlIHBhcmVudC4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWxsb3cgYSB0YXJnZXQgdG8gcmVmZXJlbmNlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiBhbm90aGVyIGJ1aWxkLWZpbGUuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGk+PGI+RG9jdW1lbnRhdGlvbiBzeXN0ZW08L2I+PC9pPgorCis8cD4KKzxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKyZuYnNwOyZuYnNwOzxiPkFjY2VwdGVkPC9iPiAod2l0aCBubyBkZWNpc2lvbiBvbiB3aGljaCBzeXN0ZW0gdG8gdXNlKQorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitHZW5lcmF0ZSBkb2NzIGJ5IEFuYWtpYS9YU0xULgorKENvcm9sbGFyeSBvZiAibW92ZSB0byBhIHN5c3RlbSB0aGF0IGFsbG93cyBkb2NzIHRvIGJlIGdlbmVyYXRlZCI/KQorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxpPjxiPlRhc2sgQVBJPC9iPjwvaT4KKworPHA+Cis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5BY2NlcHRlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorVGFza3MgcHJvdmlkZSBzb21lIHdheSB0byBpZGVudGlmeSB0aGVpciBhdHRyaWJ1dGVzIGZyb20gdGhlIG91dHNpZGUuIAorCitQb3NzaWJsZSBzb2x1dGlvbnMgaW5jbHVkZSBhIHNwZWNpYWwgbWV0aG9kIGxpa2UgPGNvZGU+Z2V0UHJvcGVydGllcygpPC9jb2RlPiwKK2FuIGV4dGVybmFsIGRlc2NyaWJpbmcgZmlsZSBzaGlwcGluZyB3aXRoIHRoZSB0YXNrIGNsYXNzIG9yIHNwZWNpYWwKK0phdmFkb2MgY29tbWVudHMgcGFyc2VkIGJ5IGEgY3VzdG9tIGRvY2xldC4gV2hhdGV2ZXIgdGhlIG1ldGhvZCwgaXQKK3Nob3VsZCBub3QgaW1wb3NlIGFueSBjb3N0IG9uIHJ1bi10aW1lLCBhcyBpdCBpcyBvbmx5IHVzZWQgYSBzbWFsbCAKK3BlcmNlbnRhZ2Ugb2YgdGhlIHRpbWUgKGRlc2lnbi10aW1lKS4gIAorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitQcm92aWRlIDxjb2RlPiZxdW90O2ZhaWxvbmVycm9yJnF1b3Q7PC9jb2RlPi1saWtlIGZ1bmN0aW9uYWxpdHkgdG8gYWxsIHRhc2tzLgorKFByb3ZpZGUgdGhpcyBhcyBhbiBhc3BlY3Q/PyBNdWNoIGxpa2UgbG9nZ2luZyBhc3BlY3Qgb3IgY2xhc3Nsb2FkZXIgYXNwZWN0KS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iLTEiPgorJm5ic3A7Jm5ic3A7PGI+UmVqZWN0ZWQ8L2I+Cis8L2ZvbnQ+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1Rhc2tzIHNob3VsZCBoYXZlIGFjY2VzcyB0byBpdHMgb3duIFhNTCByZXByZXNlbnRhdGlvbi4KKzwvYmxvY2txdW90ZT4KKzwvbGk+PC91bD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorVGFzayBsZXZlbCBpZiBhbmQgdW5sZXNzIGF0dHJpYnV0ZXMuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0FsbG93IHRhc2tzIHRvIGZpbmQgb3V0LCB3aGV0aGVyIGFub3RoZXIgdGFzayBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8aT48Yj5Mb2dnaW5nPC9iPjwvaT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWxsb3cgYnVpbGQtZmlsZSB3cml0ZXJzIHRvIG1vZGlmeSBsb2dnaW5nICh2ZXJib3NpdHksIGZvciBleGFtcGxlKQorb24gYSB0YXJnZXQtYnktdGFyZ2V0IG9yIHRhc2stYnktdGFzayBiYXNpcy4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorTWFrZSBsb2dnZXJzIGNvbmZpZ3VyYWJsZSB2aWEgYnVpbGQueG1sLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxpPjxiPk11bHRpLXRocmVhZGluZzwvYj48L2k+CisKKzxwPgorPGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iLTEiPgorJm5ic3A7Jm5ic3A7PGI+QWNjZXB0ZWQ8L2I+Cis8L2ZvbnQ+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK011bHRpLXRocmVhZGVkIGV4ZWN1dGlvbiBvZiB0YXNrcyB3aXRoaW4gdGhlIHNhbWUgdGFyZ2V0LgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5SZWplY3RlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorTXVsdGl0aHJlYWRlZCBleGVjdXRpb24gb2YgdGFyZ2V0cy4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8aT48Yj5Qcm9jZWR1cmFsIHZlcnN1cyBwdXJlbHkgZGVjbGFyYXRpdmU8L2I+PC9pPgorCis8cD4KKzxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKyZuYnNwOyZuYnNwOzxiPlJlamVjdGVkPC9iPgorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitTaW1wbGUgZmxvdy1jb250cm9sICg8Y29kZT5pZi10aGVuLWVsc2U8L2NvZGU+LCA8Y29kZT5mb3I8L2NvZGU+KQorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitUYXJnZXRzIHNob3VsZCBiZSBsaWtlIG1ldGhvZHMsIGluY2x1ZGluZyBhIHJldHVybiB2YWx1ZS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQnVpbGQtZmlsZXMgc2hvdWxkIGJlIHB1cmVseSBkZWNsYXJhdGl2ZS4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPHA+Cis8aT48Yj5Qcm9wZXJ0aWVzPC9iPjwvaT4KKworPHA+Cis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5BY2NlcHRlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWJpbGl0eSB0byBtYW5hZ2Ugc2NvcGluZyBvZiBwcm9wZXJ0aWVzIGluIGdlbmVyYWwKKyhpZS4sIHRhcmdldC9wcm9qZWN0L3dvcmtzcGFjZSkuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGk+PGI+VGVtcGxhdGVzPC9iPjwvaT4KKworPHA+Cis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5SZWplY3RlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHByb3ZpZGUgZ2VuZXJhbC8odGVtcGxhdGU/KSBidWlsZAorc3BlY2lmaWNhdGlvbnMsIGFuZCB0byBkZWNsYXJlLCBmb3IgYSBjb25jcmV0ZSBpdGVtLCB0aGF0IGl0IHNob3VsZCBiZQorYnVpbHQgYWNjb3JkaW5nIHRvIHN1Y2ggYSBnZW5lcmFsIHNwZWNpZmljYXRpb24uCis8L3VsPjwvbGk+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGk+PGI+WE1MIGlzc3VlczwvYj48L2k+CisKKzxwPgorPGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iLTEiPgorJm5ic3A7Jm5ic3A7PGI+QWNjZXB0ZWQ8L2I+Cis8L2ZvbnQ+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0EgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGluY2x1ZGUgYnVpbGQtZmlsZSBmcmFnbWVudHMgJiMxNTA7IHNvbWV0aGluZwordGhhdCBkb2Vzbid0IHVzZSA8Y29kZT5TWVNURU08L2NvZGU+IGVudGl0aWVzIGF0IGFsbCBhbmQgdGhlcmVmb3JlIGlzCitYU2NoZW1hLWZyaWVuZGx5LCBhbGxvd3MgZm9yIHByb3BlcnR5IGV4cGFuc2lvbnMsIGV0Yy4KKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWxsb3cgQW50IHRvIGZhcm0gb3V0IGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIHRoYXQgYXJlIDxpPm5vdDwvaT4KK2luIHRoZSBBbnQgbmFtZXNwYWNlIHRvIG90aGVyIGNvbXBvbmVudHMgKGllLiwgaGFuZCA8Y29kZT5kb2M6PC9jb2RlPiBlbGVtZW50cwordG8gdGhlIERvY3VtZW50YXRpb24gY29tcG9uZW50IG9yIDxjb2RlPmxvZzo8L2NvZGU+IGF0dHJpYnV0ZXMgdG8gdGhlIExvZworcG9saWN5IGNvbXBvbmVudCwgZXRjLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5SZWplY3RlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorTGV0IEFudCBpZ25vcmUgJiMxNTA7IGJ1dCB3YXJuICYjMTUwOyBpZiB1bmtub3duIFhNTCBlbGVtZW50cyBvciBhdHRyaWJ1dGVzCitvY2N1ciBpbiBhIGJ1aWxkLWZpbGUuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGk+PGI+Q29yZSBleHRlbnNpb25zPC9iPjwvaT4KKworPHA+Cis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5BY2NlcHRlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWxsb3cgc2VxdWVuY2UgdG8gYmUgc3BlY2lmaWVkIGluIDxjb2RlPiZxdW90O2RlcGVuZHMmcXVvdDs8L2NvZGU+IGF0dHJpYnV0ZSwKK29yIGVuaGFuY2UgPGNvZGU+Jmx0O2FudGNhbGwmZ3Q7PC9jb2RlPiB0byB3b3JrIHdpdGggY3VycmVudCBsaXN0IG9mIGV4ZWN1dGVkCit0YXJnZXRzLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitQcm92aWRlIGEgd2F5IHRvIGRlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGFyZ2V0cyB0aGF0IGEgZ2l2ZW4gdGFyZ2V0CitkZXBlbmRzIHVwb24gZ2V0IGV4ZWN1dGVkLiAoU2FtZSBhcyBhYm92ZT8pCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1N1cHBvcnQgbmVzdGluZyB0YXNrcyBpbnRvIG90aGVyIGVsZW1lbnRzICYjMTUwOyBub3QganVzdCBhcyBjaGlsZHJlbiBvZgordGFyZ2V0ICYjMTUwOyBhcyBwcm9wb3NlZCBieSBUaG9tYXMgQ2hyaXN0ZW4gaW4KKzxhIGhyZWYgaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1hbnQtZGV2Jm09OTgxMzA2NTU4MTIwMTAmdz0yPgoraGlzIG1haWwgbWVzc2FnZTwvYT4uCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0RlZmluZSB0YXNrIGNvbnRleHRzIHRoYXQgZGVmaW5lIHZhcmlvdXMgY29tbW9uIGFzcGVjdHMgKGxvZ2dpbmcsCitmYWlsdXJlIGhhbmRsaW5nLCBldGMuKSwgYW5kIGFzc2lnbiB0aGVtIHRvIHRhc2tzLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5SZWplY3RlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorQWxsb3cgbmFtZWQgdGFza3MgdG8gYmUgZGVmaW5lZCBieSA8Y29kZT4mbHQ7c2NyaXB0Jmd0OzwvY29kZT4gZWxlbWVudHMuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1NwZWNpZnkgYW4gT25GYWlsIHRhc2sgb3IgdGFyZ2V0IHRoYXQgcnVucyBpbiBjYXNlIG9mIGEgYnVpbGQKK2ZhaWx1cmUuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK01ha2UgPGNvZGU+aWYvdW5sZXNzPC9jb2RlPiBhdHRyaWJ1dGVzIGNoZWNrIGZvciB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSwgbm90Citvbmx5IGl0cyBleGlzdGFuY2UuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0NoZWNrIGZvciBtb3JlIHRoYW4gb25lIGNvbmRpdGlvbiBpbiA8Y29kZT5pZi91bmxlc3M8L2NvZGU+IGF0dHJpYnV0ZXMuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGk+PGI+T3JnYW5pemF0aW9uPC9iPjwvaT4KKworPHA+Cis8Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMSI+CismbmJzcDsmbmJzcDs8Yj5SZWplY3RlZDwvYj4KKzwvZm9udD4KKworPGJsb2NrcXVvdGU+Cis8dWw+PGxpPgorU2VwYXJhdGUgQ1ZTZXMgYW5kIGNvZGUgaGllcmFyY2hpZXMgZm9yPGI+OjwvYj4KKzwvbGk+PC91bD4KKzx1bCB0eXBlPSJjaXJjbGUiPgorPGxpPnRhc2sgZW5naW5lIFtvcmcuYXBhY2hlLnRhc2suKl08L2xpPgorPGxpPnByb2plY3QgZW5naW5lIChpZS4sIG1vZGVsIG9mIHRhcmdldHMvcHJvamVjdHMvd29ya3NwYWNlcykgKworc3VwcG9ydC91dGlsaXR5IGNsYXNzZXMgW29yZy5hcGFjaGUuYW50LipdPC9saT4KKzxsaT5jb3JlIHRhc2tzIChpZS4sIHRhc2tzIHN1cHBvcnRlZCBieSBBbnQgY29udHJpYnV0b3JzKSBbb3JnLmFwYWNoZS4/Pz9dPC9saT4KKzwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorPGk+PGI+TWlzY2VsbGFuZW91czwvYj48L2k+CisKKzxwPgorPGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgc2l6ZT0iLTEiPgorJm5ic3A7Jm5ic3A7PGI+QWNjZXB0ZWQ8L2I+Cis8L2ZvbnQ+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK0ludGVybmF0aW9uYWxpemF0aW9uLgorPC9saT48L3VsPgorPC9ibG9ja3F1b3RlPgorCis8cD4KKzxoND4KK1ZJLiBUaGluZ3MgdGhhdCB3ZXJlIHN1Ym1pdHRlZCBsYXRlCis8L2g0PgorCis8cD4KKzxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0xIj4KKyZuYnNwOyZuYnNwOzxiPlJlamVjdGVkPC9iPgorPC9mb250PgorCis8YmxvY2txdW90ZT4KKzx1bD48bGk+CitJbnRlZ3JhdGlvbiBvZiB0aGUgPGNvZGU+Jmx0O2RlcGVuZCZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPgordGFza3MuCis8L2xpPjwvdWw+Cis8L2Jsb2NrcXVvdGU+CisKKzxibG9ja3F1b3RlPgorPHVsPjxsaT4KK1JlY3Vyc2l2ZSBwcm9wZXJ0eSByZXNvbHV0aW9uIChpZS4sIHJlc29sdmluZyA8Y29kZT4ke2Rpc3QuJHtuYW1lfS5kaXJ9PC9jb2RlPikKKzwvbGk+PC91bD4KKzwvYmxvY2txdW90ZT4KKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2FudDIvcmVxdWVzdGVkLWZlYXR1cmVzLnR4dCBiL3RydW5rL2RvY3MvYW50Mi9yZXF1ZXN0ZWQtZmVhdHVyZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOGQ4NTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2FudDIvcmVxdWVzdGVkLWZlYXR1cmVzLnR4dApAQCAtMCwwICsxLDc4MiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorU3RhdHVzOgorPT09PT09PQorCitUaGUgY29tbWl0dGVycyBoYXZlIGNhc3Qgdm90ZXMgb24gYWxsIGl0ZW1zIChleGNlcHQgdGhvc2UgdGhhdCBjYW1lIGluCit0b28gbGF0ZSkgYW5kIHRoZSByZXN1bHRzIGFyZSBsaXN0ZWQgYmVsb3cgLSB0aGUgbmV4dCBzdGVwIHdpbGwgYmUgYQorZGVzaWduIHBoYXNlLgorCitUaGlzIGxpc3Qgb2YgaXRlbXMgd2lsbCBiZSBzdW1tYXJpemVkIGludG8gYW4gQW50MiBzcGVjaWZpY2F0aW9uIHNvb24uCisKK0kuIFRoaW5ncyB0aGF0IGRvbid0IGFmZmVjdCB0aGUgY29yZSBidXQgYXJlIHJlcXVlc3RzIGZvciBuZXcgdGFza3Mgb3IKK2VuaGFuY2VtZW50cyBvZiBleGlzdGluZyB0YXNrcy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW0FDQ0VQVEVEXSBmb3IgYSB0YXNrIGRvZXNuJ3QgbWVhbiB0aGF0IHRhc2sgd2lsbCBiZSBjb3JlIHRhc2tzIChvcgorZXZlbiBiZSBzdXBwbGllZCBieSBhIHZvdGVyKSwganVzdCB0aGF0IGhhdmluZyB0aGVtIChhcyBvcHRpb25hbAordGFza3MpIHdvdWxkIGJlIGFjY2VwdGFibGUuCisKKyogQWRkIGEgbmV3IGRhdGF0eXBlIGZpbHRlcnNldCB0byBncm91cCB0b2tlbi1maWx0ZXJzIAorCisgIFtBQ0NFUFRFRF0KKworKiBtYWtlIHVzYWdlIG9mIHBhcnRpY3VsYXIgZmlsdGVycy9maWx0ZXJzZXRzIGV4cGxpY2l0IGluIGNvcHkgdGFza3MKKworICBbQUNDRVBURURdCisKKyogbWFrZSBmYWNhZGUgdGFza3MgZm9yIHRoaW5ncyBsaWtlIGphdmFjIChKaWtlc0ltcGwsIE1vZGVybkltcGwgZXRjKQorCisgIE9uZSBjYW5kaWRhdGUgaXMgamFyIHdpdGggaW1wbGVtZW50YXRpb25zIGZvciBmYXN0amFyCisgIGZvciBleGFtcGxlLgorCisgIFtBQ0NFUFRFRF0KKworKiB1bmlmeSBtdWx0aXBsZSBzaW1pbGFyIHRhc2tzIHRvIHVzZSBzaW1pbGFyIGZvcm1zIChpZSBhbGwgdGhlIGphdmFjYworICB0eXBlIHRvb2xzKQorCisgIFtBQ0NFUFRFRF0KKworKiBPYmZ1c2NhdGluZyB0YXNrCisKKyAgW0FDQ0VQVEVEXQorCisqIEFkZCBhbiA8YW50PiB0YXNrIHRoYXQgd2lsbCBmaW5kIGJ1aWxkIGZpbGVzIGFjY29yZGluZyB0byBhIGZpbGVzZXQKKyAgYW5kIGludm9rZXMgYSBjb21tb24gdGFyZ2V0IGluIHRoZW0uCisKKyAgPGFudG9uPj8KKworICBbd2lsbCBuZWVkIG1vcmUgZGlzY3Vzc2lvbiBiZWNhdXNlIG9mIHZvdGVzIGJ5IFBldGVyIERvbmFsZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGVmYW4gQm9kZXdpZ10KKworICBbZmluYWxseSBBQ0NFUFRFRF0KKworKiBBZGQgYSBKYXZhQXBwbHkgdGFzayB0aGF0IGV4ZWN1dGVzIGEgZ2l2ZW4gY2xhc3Mgd2l0aCBmaWxlcyBmcm9tIGEKKyAgZmlsZXNldCBhcyBhcmd1bWVudHMgLSBzaW1pbGFyIHRvIDxhcHBseT4uCisKKyAgW3dpbGwgbmVlZCBtb3JlIGRpc2N1c3Npb24gYmVjYXVzZSBvZiB2b3RlcyBieSBQZXRlciBEb25hbGQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RlZmFuIEJvZGV3aWddCisKKyAgW2ZpbmFsbHkgQUNDRVBURURdCisKKyogSW5jbHVkZSBzb21lIG1vcmUgc29waGlzdGljYXRlZCBsb2dnZXJzIHdpdGggdGhlIEFudCBkaXN0cmlidXRpb24gLQorICBlc3BlY2lhbGx5IGZvciBzZW5kaW5nIGVtYWlscy4gTWFrZSB0aGUgZXhpc3Rpbmcgb25lIG1vcmUgZmxleGlibGUKKyAgKHN0eWxlc2hlZXQgdXNlZCBieSBYbWxMb2dnZXIpLgorCisgIENvdWxkIGJlIHBhcnQgb2YgdGhlIHNhbWUgbW9kdWxlIHRhc2tzIHdvdWxkIGJlIGRldmVsb3BlZCBpbj8KKworICBbd2lsbCBuZWVkIG1vcmUgZGlzY3Vzc2lvbiBiZWNhdXNlIG9mIHZvdGUgYnkgQ29ub3IgTWFjTmVpbGxdCisKKyAgW2ZpbmFsbHkgQUNDRVBURURdCisKKyogbWFrZSB0aGUgZGVmYXVsdCBsb2dnZXIncyBvdXRwdXQgY2xlYXIsIGluZm9ybWF0aXZlLCBhbmQgdGVyc2UuCisKKyAgQWN0dWFsbHksIHRoaXMgaXMgYSBsaXR0bGUgYml0IGFic3RyYWN0LCBidXQgZG9lc24ndCBhcHBseSB0byB0aGUKKyAgY29yZSBlaXRoZXIuCisKKyAgW3dpbGwgbmVlZCBtb3JlIGRpc2N1c3Npb24gYmVjYXVzZSBvZiB2b3RlIGJ5IENvbm9yIE1hY05laWxsXQorCisgIFtSRUpFQ1RFRCAtIHZldG9lcyBieSBDb25vdCBNYWNOZWlsbCBhbmQgU3RlZmFuIEJvZGV3aWddCisKKyogQmV0dGVyIGRvY3MuCisKKyAgTW9yZSBleGFtcGxlcy4gVHV0b3JpYWxzLCBiZWdpbm5lciBkb2N1bWVudHMsIHJlZmVyZW5jZSBzaGVldHMgZm9yCisgIHRhc2tzLCBwcmludGFibGUgdmVyc2lvbi4KKworICBbQUNDRVBURURdCisKKyogUlBNIHRhc2suCisKKyAgW0FDQ0VQVEVEXQorCisqIGFkZCBhbiBhdHRyaWJ1dGUgdG8gPHByb3BlcnR5PiB0byByZWFkIGluIGFuIGVudGlyZSBmaWxlIGFzIHRoZQorICB2YWx1ZSBvZiBhIHByb3BlcnR5LgorCisgIFt3aWxsIG5lZWQgbW9yZSBkaXNjdXNzaW9uIGJlY2F1c2Ugb2Ygdm90ZSBieSBQZXRlciBEb25hbGRdCisKKyAgW1JFSkVDVEVEIC0gdmV0byBieSBQZXRlciBEb25hbGRdCisKKyogVGFzayBmb3Igc3BsaXR0aW5nIGZpbGVzIChoZWFkL3RhaWwvc3BsaXQgbGlrZSBmdW5jdGlvbmFsaXR5KS4KKworICBbQUNDRVBURURdCisKKyogVGFzayB0byBjcmVhdGUgWE1JIGZyb20gSmF2YS4KKworICBbQUNDRVBURURdCisKKyogc29ja3NpZmllZCBuZXR3b3JraW5nIHRhc2tzLCBTU0ggdGFza3MuCisKKyAgW1BldGVyIERvbmFsZCBleHByZXNzZWQgc29tZSBsZWdhbCBjb25jZXJucyB0aGF0IG1pZ2h0IGJlIG92ZXJjb21lLCAKKyAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uXQorCisqIGEgcmVhY2hhYmxlIHRhc2sgdGhhdCB3b3JrcyBtdWNoIGxpa2UgYXZhaWxhYmxlIGZvciBuZXR3b3JrIFVSTHMuCisKKyAgW0FDQ0VQVEVEXQorCisqIG1ha2UgUEFUSCBoYW5kbGluZyBjb25zaXN0ZW50LiBFdmVyeSB0YXNrIHRoYXQgaGFzIGEgUEFUSCBhdHRyaWJ1dGUKKyAgbXVzdCBhbHNvIGFjY2VwdCByZWZlcmVuY2VzIHRvIFBBVEhzLgorCisgIFt3aWxsIG5lZWQgbW9yZSBkaXNjdXNzaW9uIGJlY2F1c2Ugb2Ygdm90ZSBieSBTdGVmYW4gQm9kZXdpZ10KKworICBbUkVKRUNURUQgLSB2ZXRvZXMgYnkgQ29ub3IgTWFjTmVpbGwsIEdsZW5uIE1jQWxsaXN0ZXIgYW5kIFN0ZWZhbiBCb2Rld2lnXQorCisqIFRhc2sgdG8gZXh0cmFjdCBjbGFzc2VzIGZyb20gYSBKQVIgZmlsZSB0aGF0IGEgZ2l2ZW4gY2xhc3MgZGVwZW5kcworICBvbi4KKworICBCYXNlZCBvbiA8ZGVwZW5kPiBvciBJQk0ncyBKQVggZm9yIGV4YW1wbGUuCisKKyAgW0FDQ0VQVEVEXQorCisqIFVuaWZ5IDxhdmFpbGFibGU+IGFuZCA8dXB0b2RhdGU+IGludG8gYSBtb3JlIGdlbmVyYWwgPGNvbmRpdGlvbj4KKyAgdGFzaywgc3VwcG9ydCBBTkQvT1Igb2Ygc2V2ZXJhbCB0ZXN0cyBoZXJlLgorCisgIFt3aWxsIG5lZWQgbW9yZSBkaXNjdXNzaW9uIGJlY2F1c2Ugb2Ygdm90ZSBieSBQZXRlciBEb25hbGRdCisKKyoganNwLWNvbXBpbGF0aW9uIHRhc2sKKworICBTb3VuZHMgbGlrZSBhIGNhbmRpZGF0ZSBmb3IgYSBmYWNhZGUgdGFzay4KKworICBbQUNDRVBURURdCisKKyogVVJMLXNwaWRlciB0YXNrIHRoYXQgY2hlY2tzIGxpbmtzIGZvciBtaXNzaW5nIGNvbnRlbnQgb3Igc2VydmVyIGVycm9ycworCisgIFtBQ0NFUFRFRF0KKworSUkuIEFic3RyYWN0IGdvYWxzIHRoYXQgbmVlZCB0byBiZSBhYnN0cmFjdCB1bnRpbCB3ZSBnZXQgaW50byBkZXNpZ24KK2RlY2lzaW9ucy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRHVyaW5nIGRpc2N1c3Npb24gaXQgYmVjYW1lIG9idmlvdXMsIHRoYXQgc29tZSB0aGluZ3MgZnJvbSB0aGlzIGxpc3QKK2FyZSBnb2FscyBmb3IgQW50IGFuZCBzb21lIHNob3VsZCBiZSBndWlkZWxpbmVzIGZvciBkZXZlbG9wZXJzLAordGhlcmVmb3JlIHRoZXJlIGFyZSB0d28gZmxhdm9ycywgW0FDQ0VQVEVEXSBhbmQgW0FDQ0VQVEVEIEFTIEdVSURFTElORV0uCisKKyogUHJvdmlkZSBhIGNsZWFyIG1pc3Npb24gc3RhdGVtZW50IGZvciBBbnQuCisKKyAgW0FDQ0VQVEVEXQorCisqIE1haW4gZ29hbHM6IFNpbXBsaWNpdHksIFVuZGVyc3RhbmRhYmlsaXR5LCBFeHRlbnNpYmlsaXR5CisKKyAgW0FDQ0VQVEVEXQorCisqIHJlbW92ZSBtYWdpYyBwcm9wZXJ0aWVzIGlmIGF0IGFsbCBodW1hbmx5IHBvc3NpYmxlCisKKyAgW0FDQ0VQVEVEXQorCisqIHJlbW92ZSBhcyBtdWNoIGRlcGVuZGVuY3kgb24gbmF0aXZlIHNjcmlwdHMgYXMgcG9zc2libGUuCisKKyAgW0FDQ0VQVEVEXQorCisqIGNsZWFuIG9iamVjdCBtb2RlbCAoaWUgUHJvamVjdC9UYXJnZXQvVGFzaykKKworICBbQUNDRVBURURdCisKKyogZ29vZCBldmVudCBtb2RlbCB0byBpbnRlZ3JhdGUgd2VsbCB3aXRoIElERS9HVUkvd2hhdGV2ZXIKKworICBbQUNDRVBURURdCisKKyogdXNlIGEgY29uc2lzdGVudCBuYW1pbmcgc2NoZW1lIGZvciBhdHRyaWJ1dGVzIGFjcm9zcyBhbGwgdGFza3MKKworICBbQUNDRVBURURdCisKKyoga2VlcCBidWlsZCBmaWxlIHN5bnRheCBhcyBjb21wYXRpYmxlIHRvIEFudDEgYXMgcG9zc2libGUgLQorICBpLmUuIGRvbid0IGJyZWFrIHNvbWV0aGluZyBqdXN0IGJlY2F1c2Ugd2UgY2FuLgorCisgIFtBQ0NFUFRFRF0KKworKiBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIFRhc2tzIGFzIHNpbWlsYXIgdG8gdGhlIG9uZSBvZiBBbnQxIGFzCisgIHBvc3NpYmxlIC0gaS5lLiBkb24ndCBicmVhayBzb21ldGhpbmcganVzdCBiZWNhdXNlIHdlIGNhbi4KKworICBbQUNDRVBURURdCisKKyogQW50IHNob3VsZCBiZSBjYW5jZWxhYmxlCisKKyAgW0FDQ0VQVEVEXQorCisqIG5vIGNvbW1pdCBvZiBuZXcgZmVhdHVyZXMgd2l0aG91dCBkb2N1bWVudGF0aW9uCisKKyAgW0FDQ0VQVEVEIEFTIEdVSURFTElORV0KKworKiBubyBjb21taXQgb2YgbmV3IGZlYXR1cmVzIHdpdGhvdXQgdGVzdGNhc2VzCisKKyAgW0FDQ0VQVEVEIEFTIEdVSURFTElORV0KKworSUlJLiBUaGluZ3MgdGhhdCBhcmUgc2ltcGxlLCBlYXN5IHRvIGltcGxlbWVudCwgd2hlcmUgd2UgZXhwZWN0IHRoZQorY29tbWl0dGVycyB0byBhZ3JlZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqIG5hbWVzcGFjZSBzdXBwb3J0IHNvIGRpZmZlcmVudCBjb25jZXJucyBjYW4gb2NjdXB5IGRpZmZlcmVudCBuYW1lc3BhY2VzCisgIGZyb20gYW50ICh0aHVzIFNBWDIvSkFYUDEuMSkKKworICBbQUNDRVBURURdCisKKyogSmF2YTIKKworICBbQUNDRVBURURdCisKKyogcmVtb3ZlIGFsbCBkZXByZWNhdGVkIG1ldGhvZHMsIGF0dHJpYnV0ZXMsIHRhc2tzCisKKyAgW0FDQ0VQVEVEXQorCisqIGFsbG93IGFsbCBkYXRhdHlwZXMgdG8gYmUgZGVmaW5lZCBhbnl3aGVyZSAtIGkuZS4gYXMgY2hpbGRyZW4gb2YKKyAgcHJvamVjdCBhcyB3ZWxsIGFzIG9mIHRhcmdldC4KKworICBbQUNDRVBURURdCisKKyogbWFrZSBwcm9wZXJ0aWVzIGZ1bGx5IGR5bmFtaWMsIGkuZS4gYWxsb3cgdGhlaXIgdmFsdWUgdG8gYmUgcmVhc3NpZ25lZAorCisgIFt3aWxsIG5lZWQgbW9yZSBkaXNjdXNzaW9uIGJlY2F1c2Ugb2Ygdm90ZSBieSBHbGVubiBNY0FsbGlzdGVyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ub3IgTWFjTmVpbGxdCisKKyAgW2ZpbmFsbHkgQUNDRVBURURdCisKKyogdW5pZnkgdGhlIG5hbWVzcGFjZSBvZiBhbGwgZGF0YSB0eXBlcyAoaWUgcHJvcGVydGllcyArIGZpbGVzZXRzICsKKyAgcGF0dGVybnNldCArIGZpbHRlcnNldHMpLgorCisgIFtBQ0NFUFRFRF0KKworKiBhZGQgYSB1c2VyIGRlZmluZWQgbWVzc2FnZSBpZiBhIHRhcmdldCB3aWxsIGJlIHNraXBwZWQgYmVjYXVzZSB0aGUKKyAgaWYvdW5sZXNzIGF0dHJpYnV0ZSBzYXlzIHNvLgorCisgIFtBQ0NFUFRFRF0KKworKiBhbGxvdyB1c2VyLWRhdGF0eXBlcyB0byBiZSBkZWZpbmVkIHZpYSBhIDx0eXBlZGVmPiBzaW1pbGFyIHRvIDx0YXNrZGVmPi4KKworICBbQUNDRVBURURdCisKK0lWLiBUaGluZ3Mgd2UgcHJvYmFibHkgYWdyZWUgdXBvbiBidXQgbmVlZCB0byBkaXNjdXNzIHRoZSBkZXRhaWxzIG9yCitkZWNpZGUgYmV0d2VlbiBzZXZlcmFsIHBvc3NpYmxlIG9wdGlvbnMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tBQ0NFUFRFRF0gbWVhbnMsIHRoZSBnb2FsL2lkZWEgaXMgZmluZSwgbm90IHRoYXQgYSBkZWNpc3Npb24gb24gYQorcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBtYWRlLgorCisqIFRoZSBhYmlsaXR5IGZvciBHVUkvSURFIHRvb2xzIHRvIGludGVncmF0ZSBlYXNpbHkgd2l0aCBvYmplY3QgbW9kZWwKKyAgd2l0aG91dCByZWludmVudGluZyB0aGUgd2hlZWwgYW5kIHdyaXRpbmcgdGhlaXIgb3duIHBhcnNlciAod2hpY2gKKyAgYW50aWRvdGUgd2FzIGZvcmNlZCB0byBkbykuIAorCisgIFR3byBzdWdnZXN0ZWQgc29sdXRpb25zIHdlcmUgYWxsb3dpbmcgR1VJIGRldmVsb3BlcnMgdG8gZXh0ZW5kCisgIG9iamVjdCBtb2RlbCAoaWUgR1VJVGFzayBleHRlbmRzIFRhc2spIG9yIHRvIGhhdmUgVGFzayBhcyBpbnRlcmZhY2UKKyAgKGllIEdVSVRhc2sgaW1wbGVtZW50cyBUYXNrKS4gVGhpcyB3YXkgdGhlIEdVSSB0YXNrcyBjb3VsZCBiZSBXM0MKKyAgRE9NIEVsZW1lbnRzLCBoYXZlIHByb3BlcnR5IHZldG9lcnMvbGlzdGVuZXJzIGV0Yy4KKworICBbQUNDRVBURURdCisKKyogc3VwcG9ydCBmb3IgbnVtZXJvdXMgZnJvbnRlbmRzIC0gZnJvbSBjb21tYW5kIGxpbmUgb3ZlciBHVUkgdG8gc2VydmxldHMKKworICBjb3JvbGxhcnkgb2YgdGhlIGFib3ZlPworCisgIFtBQ0NFUFRFRF0KKworKiBGdWxseSBpbnRlcnByZXRlZCBhdCBydW50aW1lLiBUaGlzIGFsbW9zdCByZXF1aXJlcyBzb21lIGZvcm0gb2YKKyAgYWJzdHJhY3Rpb24vcHJveHkgdGhhdCBzdGFuZHMgaW4gcGxhY2Ugb2YgdGFza3MgdGlsbCBpdCBpcworICBpbnRlcnByZXRlZC4gIFRoaXMgY2FuIGJlIGhhc2h0YWJsZXMvc2ltcGxlIGRvbS1saWtlIG1vZGVsL3doYXRldmVyCisKKyAgW0FDQ0VQVEVEXQorCisqIHByb3ZpZGUgdXRpbGl0eSBjbGFzc2VzIHRvIGFpZCBpbiBidWlsZGluZyB0YXNrcy4gaWUgbGlrZSB1cC10by1kYXRlCisgIGZ1bmN0aW9uYWxpdHkgYWJzdHJhY3RlZAorCisgIE5lZWQgdG8gYmVjb21lIG1vcmUgc3BlY2lmaWMgaGVyZS4KKworICBbQUNDRVBURURdCisKKyogbWFrZSBhbnQtY2FsbCBhIGxvdyBjb3N0IG9wZXJhdGlvbnMgc28gaXQgY2FuIGNlcnRhaW4KKyAgb3B0aW9uYWwvdGVtcGxhdGUtbGlrZSBvcGVyYXRpb25zCisKKyAgY29yb2xsYXJ5IG9mICJmdWxseSBpbnRlcnByZXRlZCBhdCBydW50aW1lIj8KKworICBbQUNDRVBURURdCisKKyogYWxsb3cgZmFjaWxpdGllcyB0byBidWlsZCBwcm9qZWN0cyBmcm9tIG11bHRpcGxlIHNvdXJjZXMuIGllIENTUyt4bWwKKyAgb3IgWFNMVCsgWE1MIG9yIFZlbG9jaXR5K3RleHQgb3IgZGF0YWJhc2Ugb3IgZnJvbSBpbnNpZGUgamFycyBvciBub3JtYWwgCisgIGJ1aWxkLnhtbHMgZXRjLgorCisgIGFsbG93IHRoZSBwcm9qZWN0IHRyZWUgdG8gYmUgYnVpbHQgZHluYW1pY2FsbHkuCisKKyAgW0FDQ0VQVEVEXQorCisqIG1vdmUgdG8gYSBzeXN0ZW0gdGhhdCBhbGxvd3MgZG9jcyB0byBiZSBnZW5lcmF0ZWQgLSBkb2Mgc25pcHBldHMKKyAgc2hvdWxkIGJlIGluY2x1ZGVkIHdpdGggdGhlIHRhc2tzIHRoZXkgZG9jdW1lbnQuCisKKyAgV2hpY2ggRFREPyBXaGljaCB0b29scyBmb3IgZ2VuZXJhdGlvbj8KKworICBbQUNDRVBURURdCisKKyogYWxsb3cgdGFza3MgdG8gYmUgbG9hZGVkIGZyb20gamFycy4gdGFza3Mgc2hvdWxkIGJlIGluZGljYXRlZCBieQorICBlaXRoZXIgeG1sIGZpbGUgaW4gVFNLLUlORi90YXNrZGVmcy54bWwgb3IgbWFuaWZlc3QgZmlsZS4KKworICBbQUNDRVBURURdCisKKyogYWxsb3cgZG9jdW1lbnRhdGlvbiB0byBiZSBzdG9yZWQgaW4gLnRzayBqYXJzCisKKyAgY29yb2xsYXJ5IG9mIHRoZSB0d28gcG9pbnRzIGFib3ZlPworCisgIFtBQ0NFUFRFRF0KKworKiBiZXR0ZXIgc2NyaXB0aW5nL25vdGlmaWNhdGlvbiBzdXBwb3J0IHNvIHRoZSBob29rcyBhcmUgYXZhaWxhYmxlIHRvCisgIHNlbmQgbm90aWZpY2F0aW9ucyBhdCBjZXJ0YWluIHRpbWVzLgorCisgIFdoaWNoIGhvb2tzIGFuZCB3aGVyZT8KKworICBbd2lsbCBuZWVkIG1vcmUgZGlzY3Vzc2lvbiBiZWNhdXNlIG9mIHZvdGUgYnkgUGV0ZXIgRG9uYWxkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltZW9uIEZpdGNoXQorCisgIFtSRUpFQ1RFRCAtIHZldG9lcyBieSBDb25vciBNYWNOZWlsbCwgUGV0ZXIgRG9uYWxkIGFuZCBTaW1lb24gRml0Y2hdCisKKyogc2VwYXJhdGUgdGFza3MgaW50byAudHNrIGphcnMgc29tZWhvdy4gKFByb2JhYmx5IHZpYSBmdW5jdGlvbiAtIGllCisgIGphdmEgdGFza3MsIGZpbGUgdGFza3MsIGVqYiB0YXNrcykuCisKKyAgRGVjaWRlIG9uIGNhdGVnb3JpZXMuCisKKyAgW3dpbGwgbmVlZCBtb3JlIGRpc2N1c3Npb24gYmVjYXVzZSBvZiB2b3RlIGJ5IENvbm9yIE1hY05laWxsXQorCisgIFtmaW5hbGx5IEFDQ0VQVEVEXQorCisqIG1ha2Ugc2VwYXJhdGUgYnVpbGQgZmlsZXMgZWFzeSAoYWxhIEFudEZhcm0pIGFuZCBpbXBvcnRpbmcgZGlmZmVyZW50CisgIHByb2plY3RzIGEgYnJlZXplCisKKyAgW0FDQ0VQVEVEXQorCisqIHByb3ZpZGUgc3VwcG9ydCBmb3IgdXNlciBkZWZpbmVkIHRhc2sgY29uZmlndXJhdGlvbnMgLSBpLmUuIGdpdmUKKyAgdXNlcnMgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUgZm9yIGF0dHJpYnV0ZXMgKGFsd2F5cworICB1c2UgZGVidWc9InRydWUiIGluIDxqYXZhYz4gdW5sZXNzIHNvbWV0aGluZyBlbHNlIGhhcyBiZWVuCisgIHNwZWNpZmllZCkuIAorCisgIFRocmVlIGlkZWFzIHNvIGZhcjogYSBDU1MgbGlrZSBsYW5ndWFnZSwgYSA8dGFza2NvbmZpZz4gZWxlbWVudCwKKyAgcHJvcGVydGllcyBmb2xsb3dpbmcgYSBzcGVjaWZpYyBuYW1pbmcgc2NoZW1lLgorCisgIFtBQ0NFUFRFRF0KKworKiBzdXBwb3J0IG1vcmUgY29udHJvbCBvdmVyIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHBhc3NlZAorICB0byBzdWJwcm9qZWN0cyAobW9kdWxlcykKKworICBbQUNDRVBURURdCisKKyogQXNrIGZvciBhIG5ldyBDVlMgbW9kdWxlIGZvciBBbnQgdGFza3MuCisKKyAgV2UgbmVlZCB0byBkZWZpbmUgcnVsZXMgZm9yIHRoaXMgdG8gd29yayAtIG1heWJlIHRoZSBydWxlcyBwcm9wb3NlZAorICBmb3IgdGhlIGNvbW1vbnMgcHJvamVjdCBjb3VsZCBnaXZlIHVzIGEgc3RhcnQuCisKKyAgW3dpbGwgbmVlZCBtb3JlIGRpc2N1c3Npb24gYmVjYXVzZSBvZiB2b3RlIGJ5IENvbm9yIE1hY05laWxsXQorCisgIFtSRUpFQ1RFRCAtIHZldG9lcyBieSBDb25vciBNYWNOZWlsbCBhbmQgR2xlbm4gTWNBbGxpc3Rlcl0KKworKiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbW9kaWZ5IGRldGFpbHMgb2YgdGhlIGFjdHVhbCBidWlsZCAoZS5nLiBjbGFzc3BhdGgsCisgIHVzZWQgY29tcGlsZXIpIHdpdGhvdXQgdGhlIG5lZWQgdG8gY2hhbmdlIHRoZSBidWlsZCBzcGVjaWZpY2F0aW9uLgorCisgIERvIGJ1aWxkLmNvbXBpbGVyIGFuZCBidWlsZC5zeXNjbGFzc3BhdGggY292ZXIgZXZlcnl0aGluZyBvciBkbyB3ZQorICBuZWVkIHRvIGFkZCBtb3JlIHN0dWZmIGxpa2UgdGhpcz8KKworICBbd2lsbCBuZWVkIG1vcmUgZGlzY3Vzc2lvbiBiZWNhdXNlIG9mIHZvdGUgYnkgQ29ub3IgTWFjTmVpbGxdCisKKyAgW1JFSkVDVEVEIC0gdmV0byBieSBDb25vciBNYWNOZWlsbF0KKworKiBUYXNrIHRvIHByb21wdCBmb3IgdXNlciBpbnB1dC4KKworICBEb2VzIGFmZmVjdCBjb3JlIGFzIHdlIG5lZWQgYSBtZWFucyB0byByZXF1ZXN0IGlucHV0IGZyb20gdGhlIEZyb250ZW5kLgorCisgIFtBQ0NFUFRFRF0KKworKiBBZGQgY3ZzIGxvZ2luIGZlYXR1cmUuCisKKyAgUmVxdWlyZXMgaGFuZGxpbmcgb2YgdXNlciBpbnB1dC4KKworICBbQUNDRVBURURdCisKKyogRWFzaWVyIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBHVUkgLSBtYXliZSB3ZWJzdGFydCBmcm9tIHRoZSBob21lcGFnZS4KKworICBUaGlzIGluY2x1ZGVzIGFza2luZyB0aGUgdXNlciB3aGV0aGVyIGhlIHdhbnRzIHRvIHVzZSBvcHRpb25hbCB0YXNrcworICBhbmQgZG93bmxvYWRzIHRoZSByZXF1aXJlZCBsaWJzLiBBdXRvbWF0aWMgdXBncmFkZXMgYW5kIHNvIG9uLgorCisgIFNlbGYtZXh0cmFjdGluZyBqYXIgaW5zdGFsbGVyOiBqYXZhIC1qYXIgamFrYXJ0YS1hbnQtMS4zLWJpbi5qYXIuIAorICBQcm9tcHRzIGZvciBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGV4dHJhY3RzIGFyY2hpdmUsIGZpeGVzIGFsbCAKKyAgdGV4dCBmaWxlcyB3aXRoIGZpeENSTEYgdGFzazsgb24gVU5JWCwgbWFrZXMgc2NyaXB0cyBleGVjdXRhYmxlLiAgCisgIENvdWxkIGFsc28gbW9kaWZ5IGFudCBzY3JpcHRzIHdpdGggdGhlIGxvY2F0aW9uIG9mIEFOVF9IT01FLgorCisgIFtBQ0NFUFRFRF0KKworKiBMb2dvIGZvciBBbnQuCisKKyAgW0FDQ0VQVEVEXQorCisqIGRldGFjaCBBbnQgZnJvbSBTeXN0ZW0uZXJyLy5pbi8ub3V0LgorCisgIEJld2FyZSBvZiBwcm9ibGVtcyB3aXRoIHNwYXduZWQgcHJvY2Vzc2VzLgorCisgIFtBQ0NFUFRFRF0KKworKiBiZXR0ZXIgc3VicHJvamVjdCBoYW5kbGluZworCisgIFdoYXRldmVyIHRoYXQgbWVhbnMgaW4gZGV0YWlsLgorCisgIFt3aWxsIG5lZWQgbW9yZSBkaXNjdXNzaW9uIGJlY2F1c2Ugb2Ygdm90ZSBieSBDb25vciBNYWNOZWlsbF0KKworICBbUkVKRUNURUQgLSB2ZXRvZXMgYnkgQ29ub3IgTWFjTmVpbGwgYW5kIFN0ZWZhbiBCb2Rld2lnXQorCisqIGJ1aWxkIGZpbGVzIHNob3VsZCBiZSBkZWNsYXJhdGl2ZSBpbiBuYXR1cmUKKworICBbQUNDRVBURURdCisKK1YuIFRoaW5ncyB3ZSBwcm9iYWJseSBkb24ndCBhZ3JlZSBvbi4gCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tESVNDXSBEYXRhdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0KKworICogQWxsb3cgbWFwcGVycyB0byBiZSBnZW5lcmljaXNlZCBzbyB0aGF0IHBhcnRpY3VsYXIgZmVhdHVyZXMgY2FuIGJlIG1vZGlmaWVkIAorIGR1cmluZyBtYXBwaW5nLiBTb21ldGhpbmcgc2ltaWxhciB0byAKKyAKKyA8ZmlsZXNldCAuLi4+CisgICA8aW5jbHVkZSBuYW1lPSIqLnNoIi8+CisgICA8bWFwcGVyIHR5cGU9InVuaXgtcGVybWlzc2lvbnMiPgorICAgICA8cGFyYW0gbmFtZT0idXNlciIgdmFsdWU9ImFudCIvPgorICAgICA8cGFyYW0gbmFtZT0iZ3JvdXAiIHZhbHVlPSJhbnQiLz4KKyAgICAgPHBhcmFtIG5hbWU9Im1vZCIgdmFsdWU9Ijc1NSIvPgorICAgPC9tYXBwZXI+CisgPC9maWxlc2V0PgorCisgW1JFSkVDVEVEIC0gdmV0b2VzIGJ5IFN0ZWZhbiBCb2Rld2lnIGFuZCBDb25vciBNYWNOZWlsbCwgbm90IGVub3VnaAorICAgICAgICAgICAgIHBvc2l0aXZlIHZvdGVzIGFueXdheS5dCisKKyAqIEFsbG93IGluY2x1ZGUvZXhjbHVkZSB0b3cgd29yayB3aXRoIG11bHRpcGxlIGNoYXJhY3RlcmlzdGVyaWNzIG9mIGEgZmlsZS4KKyBpZSBpbmNsdWRlIGludG8gZmlsZXNldCBpZiBmaWxlIGlzIHJlYWRhYmxlLCBtb2RpZmllZCBhZnRlciAyOXRoIG9mIEZlYiwKKyBoYXMgYSBuYW1lIHRoYXQgbWF0Y2hlcyBwYXR0ZXIgIioqLyouamF2YSIgYW5kIHRoZSBwcm9wZXJ0eSAiZm9vLnByZXNlbnQiCisgaXMgc2V0LiBTb21ldGhpbmcgc2ltaWxhciB0byAKKyAKKyA8aW5jbHVkZT4KKyAgIDxpdGVtLWZpbHRlciB0eXBlPSJuYW1lIiB2YWx1ZT0iKiovKi5qYXZhIi8+CisgICA8aXRlbS1maWx0ZXIgdHlwZT0icGVybWlzc2lvbiIgdmFsdWU9InIiLz4KKworICAgPCEtLSBjb3VsZCBvcHRpb25hbGx5IGJlIGRpcmVjdG9yeS9vciBzb21lIG90aGVyIHN5c3RlbSBzcGVjaWZpYyBmZWF0dXJlcyAtLT4KKyAgIDxpdGVtLWZpbHRlciB0eXBlPSJ0eXBlIiB2YWx1ZT0iZmlsZSIvPiAKKyAgIDxpdGVtLWZpbHRlciB0eXBlPSJtb2RpZnktdGltZSIgCisgICAgICAgICAgICAgICAgb3BlcmF0aW9uPSJncmVhdGVyLXRoYW4iIAorICAgICAgICAgICAgICAgIHZhbHVlPSIyOXRoIEZlYiAyMDAzIi8+CisgPC9pbmNsdWRlPgorCisgW0FDQ0VQVEVEXQorCisqIHByb3ZpZGUgZGF0YXR5cGVzIHRocm91Z2ggcHJvcGVydHkgdGFnIGFuZCByZW1vdmUgbmVlZCBmb3Igc2VwYXJhdGUgZnJlZQorICBzdGFuZGluZyBlbnRpdGllcy4gaWUKKyAgPHByb3BlcnR5IG5hbWU9ImZvbyI+CisgICAgPGZpbGVzZXQgZGlyPSJibGFoIj4KKyAgICAgPGluY2x1ZGUgbmFtZT0iKi8qKi5qYXZhIiAvPgorICAgIDwvZmlsZXNldD4KKyAgPC9wcm9wZXJ0eT4KKworICBbUkVKRUNURUQgLSBvbmx5IG9uZSArMSB2b3RlXQorCisqIHByb3ZpZGUgc3VwcG9ydCBmb3Igbm9uLWhhcmR3aXJlZCAoaWUgbG9hZGFibGUpIGxvdy1sZXZlbCAKKyBjb21wb25lbnRzIChtYXBwZXJzL2l0ZW1zZXQtZmlsdGVycy9jb252ZXJ0ZXJzKS4gQWxsb3cgdGhlbSB0byBiZSAKKyBsb2FkZWQgaW4gZWl0aGVyIGdsb2JhbCBvciBhIG5ldyBjbGFzc2xvYWRlci4KKworICBbQUNDRVBURURdCisKKyogcHJvdmlkZSBzdXBwb3J0IGZvciBub24taGFyZHdpcmVkIChpZSBsb2FkYWJsZSkgY29udmVydGVycy4KKworICBROiBXaGF0IGlzIGEgY29udmVydGVyPyBJcyB0aGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbD8KKyAgQTogTm90IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBidXQgYSB3YXkgdG8gZXh0ZW5kIHRoZSBlbmdpbmUKKyAgdG8gY29udmVydCBtb3JlIGRhdGEgdHlwZXMuIEN1cnJlbnRseSB3ZSBoYXZlIGZpeGVkIHNldCB0aGF0IGlzIAorICBleHBhbmRlZCBvbiBvY2Nhc2lvbiAoaWUgaW5jbHVkZXMgcHJpbWl0aXZlIHR5cGVzICsgRmlsZSkuIEluc3RlYWQKKyAgb2Ygc3ByZWFkaW5nIGNvbnZlcnRpbmcgY29kZSB0aHJvdWdoIG91dCB0YXNrcyBpdCBjYW4gYmUgY2VudHJhbGl6ZWQgCisgIGludG8gb25lIGNvbXBvbmVudCBhbmQgdXNlZCBieSBlbmdpbmUuIFRoaXMgYmVjb21lcyBwYXJ0aWN1bGFybHkgCisgIHJlbGV2ZW50IGlmIHlvdSBidWlsZCBhbnQgYmFzZWQgdGVzdGluZyBzeXN0ZW1zIGFuZCB1c2UgYW50IGluIGNlcnRhaW4KKyAgd2ViLXJlbGF0ZWQgYXJlYXMuCisKKyAgW0FDQ0VQVEVEXQorCisqIE1ha2UgYWxsIGRhdGF0eXBlcyBpbnRlcmZhY2VzIHRvIGFsbG93IHRoZW0gdG8gYmUgY3VzdG9taXplZCBpbiBtYW55CisgIHdheXMuCisKKyAgW1JFSkVDVEVEIC0gdmV0b2VzIGJ5IENvbm9yIE1hY05laWxsLCBQZXRlciBEb25hbGQgYW5kIFN0ZWZhbiBCb2Rld2lnXQorCisqIFNldCBhcml0aG1ldGljIGZvciBmaWxlc2V0L3BhdHRlcm5zZXQvKnNldAorCisgIFtBQ0NFUFRFRF0KKworKiBpbmhlcml0YW5jZSBvZiBhbnQgcHJvcGVydGllcy9kYXRhdHlwZXMvY29udGV4dCBldGMgaW4gcHJvamVjdCBoaWVyYXJjaHkKKworICBbQUNDRVBURURdCisKKyogaW5oZXJpdGFuY2Ugb2YgYmV0d2VlbiBhbnQgZGF0YXR5cGVzLiBpZSBmaWxlc2V0IEEgaW5oZXJpdHMgZnJvbSBmaWxlc2V0IEIgKGluY2x1ZGVzIAorICBhbGwgZW50cmllcyBpbiBBKS4KKworICBbUkVKRUNURUQgLSB2ZXRvZXMgYnkgQ29ub3IgTWFjTmVpbGwsIFBldGVyIERvbmFsZCBhbmQgU3RlZmFuIEJvZGV3aWddCisKKyogSG9tb2dlbml6ZSBub3Rpb24gb2YgUEFUSHMgYW5kIGZpbGVzZXRzLgorCisgIFtSRUpFQ1RFRCAtIHZldG9lcyBieSBDb25vciBNYWNOZWlsbCwgUGV0ZXIgRG9uYWxkIGFuZCBTdGVmYW4gQm9kZXdpZ10KKworW0RJU0NdIEFudCdzIGdvYWxzCistLS0tLS0tLS0tLS0tLS0tLS0KKworKiBtYWtlIGl0IHBvc3NpYmxlIHRvIHJldXNlIHRhc2tlbmdpbmUgZm9yIG90aGVyIHRoaW5ncy4gaWUKKyAgSW5zdGFsbHNoaWVsZCB0eXBlIGFwcCwgUGV0ZXIncyBjcm9uLXNlcnZlciBhbmQgb3RoZXIgdGFzayBiYXNlZAorICBvcGVyYXRpb25zLiAKKworICBbUkVKRUNURUQgYXMgYSBwcmltYXJ5IGdvYWwgLSBvbmx5IHR3byArMSB2b3Rlc10KKworKiBwcm92aWRlIHN1cHBvcnQgZm9yIENKQU4KKworICBROiBJbiB3aGF0IHdheT8KKyAgQTogUHJvYmFibHkgYnkgc3VwcGx5aW5nIGEgc2V0IG9mIHRhc2tzIHRoYXQgZG93bmxvYWQgdmVyc2lvbmVkIAorICBiaW5hcmllcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBkZXBlbmRlbmNpZXMsIGNhY2hpbmcgdGhlIGRvd25sb2FkcworICBpbiBhIGtub3duIHBsYWNlIGFuZCB1cGRhdGluZyBiaW5hcmllcyB3aGVuIHJlcXVpcmVkLiAoIldoZW4gcmVxdWlyZWQiCisgIGJlaW5nIGluZGljYXRlZCBieSBhIGNoYW5nZSBpbiBwcm9wZXJ0eSB2YWx1ZXMpLgorCisgIFtSRUpFQ1RFRCBhcyBwYXJ0IG9mIEFudCdzIGNvcmUgLSB2ZXRvIGJ5IENvbm9yIE1hY05laWxsLCBubyBzaW5nbGUgKzFdCisKK1tESVNDXSBjbGFzcyBsb2FkaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBmb3JjZSByZXNvbHV0aW9uIG9mIGNsYXNzZXMgb24gbG9hZGluZyB0byBpZGVudGlmeSBjbGFzc2xvYWRlciAKKyBpc3N1ZXMgZWFybHkuIChBdCBsZWFzdCBpbiBnbG9iYWwgY2xhc3Nsb2FkZXIpLgorCisgIFtSRUpFQ1RFRCAtIG9ubHkgb25lICsxIHZvdGVdCisKKyogSWdub3JlIGFueSBjbGFzc2VzIGNvbnRhaW5lZCBpbiB0aGUgZGFtbmVkIGV4dCBkaXJzIG9mIGEgSlZNIC0gcG9zc2libHkgYnkgbGF1bmNoaW5nCisgIHdpdGggc29tZXRoaW5nIGxpa2UgamFyIC1EamF2YS5leHQuZGlyPWZvbyAtamFyIGFudC5qYXIKKworICBbUkVKRUNURUQgLSB2ZXRvZXMgYnkgQ29ub3IgTWFjTmVpbGwsIEdsZW5uIE1jQWxsaXN0ZXIgYW5kIFN0ZWZhbgorICAgICAgICAgICAgICBCb2Rld2lnLCBBQ0NFUFRFRCBpZiBvcHRpb25hbF0KKworCitbRElTQ10gd29ya3NwYWNlL3N1YmJ1aWxkIGlzc3VlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBjcmVhdGUgdGhlIGNvbmNlcHQgb2Ygd29ya3NwYWNlIHNvIHRoYXQgcHJvamVjdHMgY2FuIGJlIGJ1aWx0IGluIGEKKyAgREFHIGFuZCB0aHVzIGVuYWJsZSBwcm9qZWN0cyBsaWtlIGNhdGFsaW5hL3RvbWNhdCB0byBoYXZlIGFuIGVhc3kKKyAgYnVpbGQgcHJvY2Vzcy4gSXQgYWxzbyBoZWxwcyBDSkFOIHRvIGEgbGVzc2VyIGRlZ3JlZSBhbmQgd291bGQKKyAgcGFydGlhbGx5IHNvbHZlIHRoZSBKQVJzIGluIENWUyB0aGluZy4KKworICBbQUNDRVBURURdCisKKyogUHJvamVjdCBpbmhlcml0YW5jZQorCisgIFdoYXQncyB0aGlzPworCisgIFtSRUpFQ1RFRCAtIHZldG9lcyBieSBDb25vciBNYWNOZWlsbCwgUGV0ZXIgRG9uYWxkIGFuZCBTdGVmYW4gQm9kZXdpZ10KKworKiBUYXJnZXQgaW5oZXJpdGFuY2UuIGllIFRoZSBhYmlsaXR5IHRvIGluY2x1ZGUgdGFyZ2V0cyBmcm9tIG90aGVyIAorICBwcm9qZWN0IGZpbGVzIG92ZXJpZGluaW5nIHRoZW0gYXMgbmVjZXNzYXJ5IChzbyBjYXNjYWRpbmcgcHJvamVjdAorICBmaWxlcykuCisKKyAgW1JFSkVDVEVEIC0gdmV0b2VzIGJ5IENvbm9yIE1hY05laWxsLCBQZXRlciBEb25hbGQgYW5kIFN0ZWZhbiBCb2Rld2lnXQorCisqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gPGFudD4gdG8gZmVlZCBiYWNrIHRoZSBlbnZpcm9ubWVudCAocHJvcGVydGllcyBhbmQKKyAgdGFza2RlZnMpIGZyb20gdGhlIGNoaWxkIGJ1aWxkIHRvIHRoZSBwYXJlbnQuCisKKyAgW1JFSkVDVEVEIC0gdmV0b2VzIGJ5IENvbm9yIE1hY05laWxsLCBQZXRlciBEb25hbGQsIFNpbWVvbiBGaXRjaCBhbmQKKyAgICAgICAgICAgICAgU3RlZmFuIEJvZGV3aWddCisKKyogQWxsb3cgYSB0YXJnZXQgdG8gZGVwZW5kIG9uIGEgdGFyZ2V0IHdoaWNoIGlzIGluIGFub3RoZXIgYnVpbGRmaWxlLiAgCisKKyAgW0FDQ0VQVEVEXQorCisqIEFsbG93IGEgdGFyZ2V0IHRvIHJlZmVyZW5jZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gYW5vdGhlciBidWlsZGZpbGUuCisKKyAgW1JFSkVDVEVEIC0gb25seSBvbmUgKzEgdm90ZV0KKworW0RJU0NdIGRvY3VtZW50YXRpb24gc3lzdGVtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBnZW5lcmF0ZSBkb2NzIGJ5IGFuYWtpYS9YU0xUCisKKyAgQ29yb2xsYXJ5IG9mICJtb3ZlIHRvIGEgc3lzdGVtIHRoYXQgYWxsb3dzIGRvY3MgdG8gYmUgZ2VuZXJhdGVkIj8KKworICBbQUNDRVBURUQgLSB3aXRoIG5vIGRlY2lzaW9uIG9uIHdoaWNoIHN5c3RlbSB0byB1c2VdCisKK1tESVNDXSBUYXNrIEFQSQorLS0tLS0tLS0tLS0tLS0tCisKKyogdGFza3MgcHJvdmlkZSBzb21lIHdheSB0byBpZGVudGlmeSB0aGVpciBhdHRyaWJ1dGVzIGZyb20gdGhlCisgIG91dHNpZGUuIAorCisgIFBvc3NpYmxlIHNvbHV0aW9ucyBpbmNsdWRlIGEgc3BlY2lhbCBtZXRob2QgbGlrZSBnZXRQcm9wZXJ0aWVzKCksIGFuCisgIGV4dGVybmFsIGRlc2NyaWJpbmcgZmlsZSBzaGlwcGluZyB3aXRoIHRoZSB0YXNrIGNsYXNzIG9yIHNwZWNpYWwKKyAgamF2YWRvYyBjb21tZW50cyBwYXJzZWQgYnkgYSBjdXN0b20gZG9jbGV0LiBXaGF0ZXZlciB0aGUgbWV0aG9kIGl0CisgIHNob3VsZCBub3QgaW1wb3NlIGFueSBjb3N0IG9uIHJ1bnRpbWUgYXMgaXQgaXMgb25seSB1c2VkIGEgc21hbGwgCisgIHByb3BvcnRpb24gb2YgdGhlIHRpbWUgKGRlc2lnbi10aW1lKS4gIAorCisgIFtBQ0NFUFRFRF0KKworKiB0YXNrcyBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gaXRzIG93biBYTUwgcmVwcmVzZW50YXRpb24uCisKKyAgW1JFSkVDVEVEIC0gdmV0b2VzIGJ5IENocmlzdG9waCBXaWxoZWxtcywgQ29ub3IgTWFjTmVpbGwgYW5kIFNpbWVvbiBGaXRjaF0KKworKiBUYXNrIGxldmVsIGlmIGFuZCB1bmxlc3MgYXR0cmlidXRlcy4KKworICBbUkVKRUNURUQgLSBubyBzaW5nbGUgKzEgdm90ZV0KKworKiBBbGxvdyB0YXNrcyB0byBmaW5kIG91dCwgd2hldGhlciBhbm90aGVyIHRhc2sgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisKKyAgW1JFSkVDVEVEIC0gdmV0b2VzIGJ5IENvbm9yIE1hY05laWxsLCBHbGVubiBNY0FsbGlzdGVyLCBQZXRlciBEb25hbGQKKyAgICAgICAgICAgICAgYW5kIFN0ZWZhbiBCb2Rld2lnXQorCisqIHByb3ZpZGUgZmFpbG9uZXJyb3IgbGlrZSBmdW5jdGlvbmFsaXR5IHRvIGFsbCB0YXNrcy4gKFByb3ZpZGUgdGhpcyBhcyBhbiBhc3BlY3Q/PworICBtdWNoIGxpa2UgbG9nZ2luZyBhc3BlY3Qgb3IgY2xhc3Nsb2FkZXIgYXNwZWN0KS4KKworICBbQUNDRVBURURdCisKK1tESVNDXSBsb2dnaW5nCistLS0tLS0tLS0tLS0tLQorCisqIGFsbG93IGJ1aWxkIGZpbGUgd3JpdGVycyB0byBtb2RpZnkgbG9nZ2luZyAodmVyYm9zaXR5IGZvciBleGFtcGxlKQorICBvbiBhIHRhcmdldCBieSB0YXJnZXQgb3IgdGFzayBieSB0YXNrIGJhc2lzLgorCisgIFtBQ0NFUFRFRF0KKworKiBNYWtlIGxvZ2dlcnMgY29uZmlndXJhYmxlIHZpYSBidWlsZC54bWwuCisKKyAgW0FDQ0VQVEVEXQorCitbRElTQ10gbXVsdGl0aHJhZGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBNdWx0aXRocmVhZGVkIGV4ZWN1dGlvbiBvZiB0YXNrcyB3aXRoaW4gdGhlIHNhbWUgdGFyZ2V0LgorCisgIFtBQ0NFUFRFRF0KKworKiBNdWx0aXRocmVhZGVkIGV4ZWN1dGlvbiBvZiB0YXJnZXRzLgorCisgIFtSRUpFQ1RFRCAtIHZldG9lcyBieSBDb25vciBNYWNOZWlsbCwgR2xlbm4gTWNBbGxpc3RlciBhbmQgU3RlZmFuIEJvZGV3aWddCisKK1tESVNDXSBwcm9jZWR1cmFsIHZlcnN1cyBwdXJlbHkgZGVjbGFyYXRpdmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBTaW1wbGUgZmxvdyBjb250cm9sIChpZi10aGVuLWVsc2UsIGZvcikKKworICBbUkVKRUNURUQgLSB2ZXRvZXMgYnkgQ29ub3IgTWFjTmVpbGwsIEdsZW5uIE1jQWxsaXN0ZXIsIFBldGVyIERvbmFsZAorICAgICAgICAgICAgICBhbmQgU3RlZmFuIEJvZGV3aWddCisKKyogdGFyZ2V0cyBzaG91bGQgYmUgbGlrZSBtZXRob2RzIGluY2x1ZGluZyBhIHJldHVybiB2YWx1ZQorCisgIFtSRUpFQ1RFRCAtIHZldG9lcyBieSBDb25vciBNYWNOZWlsbCwgR2xlbm4gTWNBbGxpc3RlciwgUGV0ZXIgRG9uYWxkLAorICAgICAgICAgICAgICBTaW1lb24gRml0Y2ggYW5kIFN0ZWZhbiBCb2Rld2lnXQorCisqIGJ1aWxkIGZpbGVzIHNob3VsZCBiZSBwdXJlbHkgZGVjbGFyYXRpdmUKKworICBbUkVKRUNURUQgLSB2ZXRvIGJ5IFN0ZWZhbiBCb2Rld2lnXQorCitbRElTQ10gUHJvcGVydGllcworLS0tLS0tLS0tLS0tLS0tLS0KKworKiBBYmlsaXR5IHRvIG1hbmFnZSBzY29wcGluZyBvZiBwcm9wZXJ0aWVzIGluIGdlbmVyYWwgKGllIHRhcmdldC9wcm9qZWN0L3dvcmtzcGFjZSkuCisKKyAgW0FDQ0VQVEVEXQorCitbRElTQ10gVGVtcGxhdGVzCistLS0tLS0tLS0tLS0tLS0tCisKKyogaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHByb3ZpZGUgZ2VuZXJhbCAvKHRlbXBsYXRlPykvIGJ1aWxkCisgIHNwZWNpZmljYXRpb25zLCBhbmQgdG8gZGVjbGFyZSBmb3IgYSBjb25jcmV0ZSBpdGVtIHRoYXQgaXQgc2hvdWxkIGJlCisgIGJ1aWx0IGFjY29yZGluZyB0byBzdWNoIGEgZ2VuZXJhbCBzcGVjaWZpY2F0aW9uLgorCisgIFtSRUpFQ1RFRCAtIHZldG9lcyBieSBDb25vciBNYWNOZWlsbCwgR2xlbm4gTWNBbGxpc3RlciwgUGV0ZXIgRG9uYWxkCisgICAgICAgICAgICAgIGFuZCBTdGVmYW4gQm9kZXdpZ10KKworW0RJU0NdIFhNTCBpc3N1ZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaW5jbHVkZSBidWlsZC1maWxlIGZyYWdtZW50cyAtIHNvbWV0aGluZworICB0aGF0IGRvZXNuJ3QgdXNlIFNZU1RFTSBlbnRpdGllcyBhdCBhbGwgYW5kIHRoZXJlZm9yZSBpcyBYU2NoZW1hCisgIGZyaWVuZGx5LCBhbGxvd3MgZm9yIHByb3BlcnR5IGV4cGFuc2lvbnMgLi4uCisKKyAgW0FDQ0VQVEVEXQorCisqIExldCBBbnQgaWdub3JlIC0gYnV0IHdhcm4gLSBpZiB1bmtub3duIFhNTCBlbGVtZW50cyBvciBhdHRyaWJ1dGVzCisgIG9jY3VyIGluIGEgYnVpbGQgZmlsZS4KKworICBbUkVKRUNURUQgLSB2ZXRvZXMgYnkgQ29ub3IgTWFjTmVpbGwsIEdsZW5uIE1jQWxsaXN0ZXIsIFBldGVyIERvbmFsZAorICAgICAgICAgICAgICBhbmQgU3RlZmFuIEJvZGV3aWddCisKKyogQWxsb3cgYW50IHRvIGZhcm0gb3V0IGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIHRoYXQgYXJlIE5PVCBpbiB0aGUgYW50IAorICBuYW1lc3BhY2UgdG8gb3RoZXIgY29tcG9uZW50cy4gaWUgaGFuZCBkb2M6IGVsZW1lbnRzIHRvIHRoZSBEb2N1bWVudGF0aW9uCisgIGNvbXBvbmVudCBvciBsb2c6IGF0dHJpYnV0ZXMgdG8gTG9nIHBvbGljeSBjb21wb25lbnQgZXRjCisKKyAgW0FDQ0VQVEVEXQorCitbRElTQ10gY29yZSBleHRlbnNpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQWxsb3cgbmFtZWQgdGFza3MgdG8gYmUgZGVmaW5lZCBieSA8c2NyaXB0PiBlbGVtZW50cy4KKworICBbUkVKRUNURUQgLSBvbmx5IG9uZSArMSB2b3RlXQorCisqIHNwZWNpZnkgYW4gb25mYWlsIHRhc2sgb3IgdGFyZ2V0IHRoYXQgcnVucyBpbiBjYXNlIG9mIGEgYnVpbGQKKyAgZmFpbHVyZS4KKworICBbUkVKRUNURUQgLSB2ZXRvZXMgYnkgR2xlbm4gTWNBbGxpc3RlciwgUGV0ZXIgRG9uYWxkIGFuZCBTdGVmYW4gQm9kZXdpZ10KKworKiBhbGxvdyBzZXF1ZW5jZSB0byBiZSBzcGVjaWZpZWQgaW4gZGVwZW5kcyBhdHRyaWJ1dGUgb3IgZW5oYW5jZQorICBhbnRjYWxsIHRvIHdvcmsgd2l0aCBjdXJyZW50IGxpc3Qgb2YgZXhlY3V0ZWQgdGFyZ2V0cworCisgIFtBQ0NFUFRFRF0KKworKiBTdXBwb3J0IG5lc3RpbmcgdGFza3MgaW50byBvdGhlciBlbGVtZW50cyAtIG5vdCBqdXN0IGFzIGNoaWxkcmVuIG9mCisgIHRhcmdldCAtIGFzIHByb3Bvc2VkIGJ5IFRob21hcyBDaHJpc3RlbiBpbgorICA8aHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1hbnQtZGV2Jm09OTgxMzA2NTU4MTIwMTAmdz0yPi4KKworICBbQUNDRVBURURdCisKKyogTWFrZSBpZi91bmxlc3MgYXR0cmlidXRlcyB0byBjaGVjayBmb3IgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHksIG5vdAorICBvbmx5IGl0cyBleGlzdGFuY2UuCisKKyAgW1JFSkVDVEVEIC0gdmV0b2VzIGJ5IEdsZW5uIE1jQWxsaXN0ZXIgYW5kIFN0ZWZhbiBCb2Rld2lnXQorCisqIGNoZWNrIGZvciBtb3JlIHRoYW4gb25lIGNvbmRpdGlvbiBpbiBpZi91bmxlc3MgYXR0cmlidXRlcy4KKworICBbUkVKRUNURUQgLSB2ZXRvZXMgYnkgR2xlbm4gTWNBbGxpc3RlciwgUGV0ZXIgRG9uYWxkIGFuZCBTdGVmYW4gQm9kZXdpZ10KKworKiBwcm92aWRlIGEgd2F5IHRvIGRlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGFyZ2V0cyBhIGdpdmVuIHRhcmdldAorICBkZXBlbmRzIHVwb24gZ2V0IGV4ZWN1dGVkLgorCisgIFtBQ0NFUFRFRF0KKworKiBkZWZpbmUgdGFzayBjb250ZXh0cyB0aGF0IGRlZmluZSB2YXJpb3VzIGNvbW1vbiBhc3BlY3RzIChsb2dnaW5nLAorICBmYWlsdXJlIGhhbmRsaW5nIC4uLikgYW5kIGFzc2lnbiB0aGVtIHRvIHRhc2tzLgorCisgIFtBQ0NFUFRFRF0KKworW0RJU0NdIG9yZ2FuaXphdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIHNlcGFyYXRlIENWU2VzIGFuZCBjb2RlIGhpZXJhcmNoaWVzIGZvcgorICAtIHRhc2sgZW5naW5lIFsgb3JnLmFwYWNoZS50YXNrLiogXQorICAtIHByb2plY3QgZW5naW5lIChpZSBtb2RlbCBvZiB0YXJnZXRzL3Byb2plY3RzL3dvcmtzcGFjZXMpICsgc3VwcG9ydC91dGlsaXR5IGNsYXNzZXMgCisgICAgWyBvcmcuYXBhY2hlLmFudC4qIF0KKyAgLSBjb3JlIHRhc2tzIChpZSB0YXNrcyBzdXBwb3J0ZWQgYnkgYW50IGNvbnRyaWJ1dG9ycykgWyBvcmcuYXBhY2hlLj8/PyBdCisKKyAgW1JFSkVDVEVEIC0gdmV0b2VzIGJ5IENvbm9yIE1hY05laWxsIGFuZCBHbGVubiBNY0FsbGlzdGVyXQorCitbRElTQ10gbWlzYworLS0tLS0tLS0tLS0KKworKiBpbnRlcm5hdGlvbmFsaXphdGlvbgorCisgIFtBQ0NFUFRFRF0KKworVkkuIGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gc3VibWl0dGVkIHRvbyBsYXRlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKiBJbnRlZ3JhdGlvbiBvZiB0aGUgZGVwZW5kcyB0YXNrIGFuZCBqYXZhYyB0YXNrcworCisgIFtSRUpFQ1RFRCAtIG9ubHkgdHdvICsxIHZvdGVzXQorCisqIHJlY3Vyc2l2ZSBwcm9wZXJ0eSByZXNvbHV0aW9uKCBpZSByZXNvbHZpbmcgJHtkaXN0LiR7bmFtZX0uZGlyfSApCisKKyAgW1JFSkVDVEVEIC0gdmV0byBieSBQZXRlciBEb25hbGRdCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2FudF9pbl9hbmdlci5odG1sIGIvdHJ1bmsvZG9jcy9hbnRfaW5fYW5nZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQ0YjAxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9hbnRfaW5fYW5nZXIuaHRtbApAQCAtMCwwICsxLDExMTUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorPHRpdGxlPgorICAgIEFudCBpbiBBbmdlcgorPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCI+Cis8aDEgYWxpZ249ImNlbnRlciI+QW50IGluIEFuZ2VyOgorPC9oMT4KKzxoMiBhbGlnbj0iY2VudGVyIj4KKyAgICAgICAgVXNpbmcgQXBhY2hlIEFudCBpbiBhIFByb2R1Y3Rpb24gRGV2ZWxvcG1lbnQgU3lzdGVtCis8L2gyPgorCis8aDQgIGFsaWduPSJjZW50ZXIiPgorU3RldmUgTG91Z2hyYW48YnI+CitMYXN0IHVwZGF0ZWQgMjAwNS0wMy0xNgorPC9oND4KKworPGEgbmFtZT0iaW50cm9kdWN0aW9uIj4KKworPGgyPkludHJvZHVjdGlvbjwvaDI+Cis8L2E+CisKKzxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFwYWNoZSBBbnQ8L2E+CisgY2FuIGJlIGFuIGludmFsdWFibGUgdG9vbCBpbiBhIHRlYW0gZGV2ZWxvcG1lbnQgcHJvY2VzcyAtIG9yIGl0IGNhbgorYmUgeWV0IGFub3RoZXIgc291cmNlIG9mIHByb2JsZW1zIGluIHRoYXQgb25nb2luZyBjcmlzZXMgd2UgY2FsbAorZGV2ZWxvcG1lbnQgLiBUaGlzCitkb2N1bWVudCBjb250YWlucyBzb21lIHN0cmF0ZWdpZXMgYW5kIHRhY3RpY3MgZm9yIG1ha2luZyB0aGUgbW9zdCBvZgorQW50LiBJdCBpcyBtb2RlcmF0ZWx5IGZyaXZvbG91cyBpbiBwbGFjZXMsIGFuZCBsYWNrcyBhbG1vc3QgYW55IGFjdHVhbAorZXhhbXBsZXMgb2YgQW50IFhNTC4gVGhlIGxhY2sgb2YgZXhhbXBsZXMgaXMgZW50aXJlbHkgZGVsaWJlcmF0ZSAtIGl0CitrZWVwcyBkb2N1bWVudCBtYWludGVuYW5jZSBjb3N0cyBkb3duLiBNb3N0IG9mIHRoZSBjb25jZXB0cyBjb3ZlcmVkCitkb24ndCBuZWVkIHRoZSBkZXRhaWwgcHJvdmlkZWQgYnkgWE1MIHJlcHJlc2VudGF0aW9ucywgYXMgaXQgaXMgdGhlIHByb2Nlc3NlcyB3ZQorYXJlIGNvbmNlcm5lZCBhYm91dCwgbm90IHRoZSBzeW50YXguIEZpbmFsbHksIHBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoZQorY29tbWVudHMgaGVyZSBhcmUgb25seSBzdWdnZXN0aW9ucyB3aGljaCBuZWVkIHRvIGJlIGN1c3RvbWlzZWQgdG8gbWVldAoreW91ciBvd24gbmVlZHMsIG5vdCBzdHJpY3QgcnVsZXMgYWJvdXQgd2hhdCBzaG91bGQgYW5kIHNob3VsZCBub3QgYmUKK2RvbmUuCisKKzxwPgorRmlyc3RseSwgaGVyZSBhcmUgc29tZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgcHJvamVjdHMgd2hpY2ggdGhpcworZG9jdW1lbnQgY292ZXJzOgorPHVsPgorPGxpPiBQcmV0dHkgbXVjaCBwdXJlIEphdmEsIG1heWJlIHdpdGggc29tZSBsZWdhY3kgY3J1ZnQgb24gdGhlIGVkZ2VzLgorCis8bGk+IFRlYW0gZWZmb3J0cywgdXN1YWxseSB3aXRoIHRoZSBwZXR1bGFudCBwcmltYS1kb25uYXMgYWxsIHVzIEphdmEKK3Byb2dyYW1tZXJzIGJlY29tZSBvbmNlIHdlIHJlYWxpc2UgaG93IG11Y2ggaW4gZGVtYW5kIHdlIGFyZS4KKworPGxpPiBBIGZhaXJseSBkaXN0cmlidXRlZCBkZXZlbG9wbWVudCB0ZWFtIC0gc3ByZWFkIGFjcm9zcyBsb2NhdGlvbnMgYW5kCittYXliZSB0aW1lIHpvbmVzLgorCis8bGk+IFNlcGFyYXRlIHN1YiBwcm9qZWN0cyAtIGZyb20gc2VwYXJhdGUgYmVhbnMgaW4gYSBiaWcKK2VudGVycHJpc2UgYXBwbGljYXRpb24gdG8gc2VwYXJhdGUgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMgd2hpY2ggbmVlZCB0bworYmUgdmFndWVseSBhd2FyZSBvZiBlYWNoIG90aGVyLgorCis8bGk+IFNpZ25pZmljYW50IG1pc21hdGNoIGJldHdlZW4gZXhwZWN0YXRpb25zIGFuZCB0aW1lIGF2YWlsYWJsZSB0bworZGVsaXZlci4gJ0xhc3QgV2VlaycgaXMgdGhlIGlkZWFsIGRlbGl2ZXJ5IGRhdGUgaGFuZGVkIGRvd24gZnJvbSBhYm92ZSwKK2xhdGUgbmV4dCBjZW50dXJ5IHRoZSBkYXRlIGNvbWluZyB1cCBmcm9tIGJlbG93LgorCis8bGk+IEV2ZXJ5b25lIGlzIHN0cnVnZ2xpbmcgdG8ga2VlcCB1cCB3aXRoIHBsYXRmb3JtIGFuZCB0b29sIGV2b2x1dGlvbi4KKworPGxpPiBFeHRlbnNpdmUgdXNlIG9mIGV4dGVybmFsIGxpYnJhcmllcywgYm90aCBvcGVuIGFuZCBjbG9zZWQgc291cmNlLgorPC91bD4KKworV2hhdCB0aGF0IGFsbCBtZWFucyBpcyB0aGF0IHRoZXJlIGlzIG5vIHRpbWUgdG8gc3BlbmQgZ2V0dGluZyB0aGluZ3MKK3JpZ2h0LCB5b3UgZG9uJ3QgaGF2ZSB0aGF0IHRpZ2h0IGNvbnRyb2wgb24gaG93IHRoZSByZXN0IG9mIHRoZSB0ZWFtCit3b3JrcyBhbmQgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MgaXMgb2Z0ZW4gbW9yZSBvbmUgb2YgY2hhb3MgbWluaW1pc2F0aW9uCit0aGFuIGFueXRoaW5nIGVsc2UuIFRoZSByb2xlIG9mIEFudCBpbiBzdWNoIHByb2plY3RzIGlzIHRvIGVuc3VyZSB0aGF0Cit0aGUgYnVpbGQsIHRlc3QgYW5kIGRlcGxveSBwcm9jZXNzZXMgcnVuIHNtb290aGx5LCBsZWF2aW5nIHlvdSB3aXRoIGFsbAordGhlIG90aGVyIHByb2JsZW1zLgorCis8YSBuYW1lPSJjb3JlIj4KKzxoMj5Db3JlIFByYWN0aWNlczwvaDI+Cis8L2E+Cis8aDM+CitDbGFyaWZ5IHdoYXQgeW91IHdhbnQgQW50IHRvIGRvPC9oMz4KKworQW50IGlzIG5vdCBhIHNpbHZlciBidWxsZXQuIEl0IGlzIGp1c3QgYW5vdGhlciBydXN0eSBidWxsZXQgaW4gdGhlIGFybW9yeSBvZgorZGV2ZWxvcG1lbnQgdG9vbHMgYXZhaWxhYmxlIGF0IHlvdXIgZGlzcG9zYWwuIEl0cyBwcmltYXJ5IHB1cnBvc2UgaXMgdG8KK2FjY2VsZXJhdGUgdGhlIGNvbnN0cnVjdGlvbiBhbmQgZGVwbG95bWVudCBvZiBKYXZhIHByb2plY3RzLiBZb3UgY291bGQgY2VydGFpbmx5CitleHRlbmQgQW50IHRvIGRvIGFueXRoaW5nIEphdmEgbWFrZXMgcG9zc2libGU6IGl0IGlzIGVhc3kgdG8gaW1hZ2luZSB3cml0aW5nIGFuCitpbWFnZSBwcm9jZXNzaW5nIHRhc2sgdG8gaGVscCBpbiB3ZWIgc2l0ZSBkZXBsb3ltZW50IGJ5IHNocmlua2luZyBhbmQKK3JlY29tcHJlc3NpbmcganBlZyBmaWxlcywgZm9yIGV4YW1wbGUuIEJ1dCB0aGF0IHdvdWxkIGJlIHB1c2hpbmcgdGhlIGJvdW5kYXJ5IG9mCit3aGF0IEFudCBpcyByZWFsbHkgaW50ZW5kZWQgdG8gZG8gLSBzbyBzaG91bGQgYmUgY29uc2lkZXJlZCB3aXRoIGNhcmUuCisKKzxwPgorQW50IGlzIGFsc28gYSBncmVhdCBhZGp1bmN0IHRvIGFuIElERTsgYSB3YXkgb2YgZG9pbmcgYWxsIHRoZSBob3VzZWtlZXBpbmcgb2YKK2RlcGxveW1lbnQgYW5kIGZvciBjbGVhbiwgYXV0b21hdGVkIGJ1aWxkcy4gQnV0IGEgZ29vZCBtb2Rlcm4gSURFIGlzIGEKK3Byb2R1Y3Rpdml0eSB0b29sIGluIGl0cyBvd24gcmlnaHQgLSBvbmUgeW91IHNob3VsZCBjb250aW51ZSB0byB1c2UuIEFudAoranVzdCBsZXRzIHlvdSBnaXZlIHRoZSB0ZWFtcyBzb21ld2hhdCBtb3JlIGZyZWVkb20gaW4gSURFIGNob2ljZSAtICZxdW90O3lvdSBjYW4KK3VzZSB3aGF0ZXZlciB5b3Ugd2FudCBpbiBkZXZlbG9wbWVudCwgYnV0IEFudCBmb3IgdGhlIGRlcGxveW1lbnQKK2J1aWxkcyZxdW90OyBOb3cgdGhhdCBtYW55IG1vZGVybiBvcGVuIHNvdXJjZSBhbmQgY29tbWVyY2lhbCBJREVzCitpbmNsdWRlIEFudCBzdXBwb3J0IChpbmNsdWRpbmcgakVkaXQsIEZvcnRlLCBFY2xpcHNlIGFuZCBJREVBKSwKK2RldmVsb3BlcnMgY2FuIHVzZSBhIGdyZWF0IElERSwgd2l0aCBBbnQgcHJvdmlkaW5nIGEgcmlnb3JvdXMgYW5kIHBvcnRhYmxlIAorYnVpbGQgcHJvY2VzcyBpbnRlZ3JhdGVkIGludG8gdGhlIHRvb2wuIAorCis8aDM+CitEZWZpbmUgc3RhbmRhcmQgdGFyZ2V0cworPC9oMz4KKworV2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBzdWIgcHJvamVjdHMsIGRlZmluZSBhIHN0YW5kYXJkIHNldCBvZiB0YXJnZXRzLgorUHJvamVjdHMgd2l0aCBhIHNwbGl0IGJldHdlZW4gaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbiBqYXIgZmlsZXMKK2NvdWxkIGNvbnNpZGVyIDxiPmltcGw8L2I+IGFuZCA8Yj5pbnRmPC9iPiB0YXJnZXRzIC0gd2l0aCBzZXBhcmF0ZQorPGI+ZGVidWctaW1wbDwvYj4gYW5kIDxiPmRlYnVnLWludGY8L2I+IHRhcmdldHMgZm9yIHRoZSBkZWJ1ZyB2ZXJzaW9uLgorQW5kIG9mIGNvdXJzZSwgdGhlIHViaXF1aXRvdXMgPGI+Y2xlYW48L2I+IHRhcmdldC4KKworPHA+CisKK1dpdGggc3RhbmRhcmQgdGFyZ2V0IG5hbWVzLCBpdCBpcyBlYXN5IHRvIGJ1aWxkIGVuY29tcGFzc2luZyBBbnQgYnVpbGQKK2ZpbGVzIHdoaWNoIGp1c3QgaGFuZCBvZmYgdGhlIHdvcmsgdG8gdGhlIGNsYXNzZXMgYmVsb3cgdXNpbmcgdGhlCis8YSBocmVmPSJtYW51YWwvQ29yZVRhc2tzL2FudC5odG1sIj5hbnQ8L2E+Cit0YXNrLiBGb3IgZXhhbXBsZS4gdGhlIGNsZWFuIHRhcmdldCBjb3VsZCBiZSBoYW5kZWQgZG93biB0byB0aGUgPHR0PmludGY8L3R0PiBhbmQKKzx0dD5pbXBsPC90dD4gc3ViZGlyZWN0b3JpZXMgZnJvbSBhIHBhcmVudCBkaXJlY3RvcnkKKworPHByZT4mbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y2xlYW4mcXVvdDsgIGRlcGVuZHM9JnF1b3Q7Y2xlYW4taW50ZiwgY2xlYW4taW1wbCZxdW90OyZndDsKKyZsdDsvdGFyZ2V0Jmd0OworCismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y2xlYW4taW50ZiZxdW90OyAmZ3Q7CisgICAgJmx0O2FudCBkaXI9JnF1b3Q7aW50ZiZxdW90OyB0YXJnZXQ9JnF1b3Q7Y2xlYW4mcXVvdDsgLyZndDsKKyZsdDsvdGFyZ2V0Jmd0OworCismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y2xlYW4taW1wbCZxdW90OyZndDsKKyAgICAmbHQ7YW50IGRpcj0mcXVvdDtpbXBsJnF1b3Q7IHRhcmdldD0mcXVvdDtjbGVhbiZxdW90OyAvJmd0OworJmx0Oy90YXJnZXQmZ3Q7ICA8L3ByZT4KKworSWYgeW91IGdpdmUgdGFyZ2V0cyBhIDx0dD5kZXNjcmlwdGlvbjwvdHQ+IHRhZywgdGhlbiBjYWxsaW5nIDx0dD5hbnQKKy1wcm9qZWN0aGVscDwvdHQ+IHdpbGwgbGlzdCBhbGwgdGFza3Mgd2l0aCB0aGVpciBkZXNjcmlwdGlvbiBhcyAnbWFpbiB0YXJnZXRzJywgYW5kIAorYWxsIHRhc2tzIHdpdGhvdXQgYSBkZXNjcmlwdGlvbiBhcyBzdWJ0YXJnZXRzLiBEZXNjcmliaW5nIGFsbCB5b3VyCitlbnRyeSBwb2ludHMgaXMgdGhlcmVmb3JlIHZlcnkgdXNlZnVsLCBldmVuIGJlZm9yZSBhIHByb2plY3QgYmVjb21lcyBiaWcgYW5kIGNvbXBsaWNhdGVkLgorICAKKzxoMz4KKyAgICBFeHRlbmQgQW50IHRocm91Z2ggbmV3IHRhc2tzCis8L2gzPgorCitJZiBBbnQgZG9lcyBub3QgZG8gd2hhdCB5b3Ugd2FudCwgeW91IGNhbiB1c2UgdGhlCis8YSBocmVmPSJtYW51YWwvQ29yZVRhc2tzL2V4ZWMuaHRtbCI+ZXhlYzwvYT4gYW5kCis8YSBocmVmPSJtYW51YWwvQ29yZVRhc2tzL2phdmEuaHRtbCI+amF2YTwvYT4gdGFza3Mgb3IKKzxhIGhyZWY9Im1hbnVhbC9PcHRpb25hbFRhc2tzL3NjcmlwdC5odG1sIj5pbmxpbmUgc2NyaXB0aW5nPC9hPiB0byBleHRlbmQgaXQuIEluIGEKK3Byb2plY3Qgd2l0aCBtYW55IDx0dD5idWlsZC54bWw8L3R0PiBmaWxlcywgeW91IHNvb24gZmluZCB0aGF0IGhhdmluZyBhIHNpbmdsZQorY2VudHJhbCBwbGFjZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBmdW5jdGlvbmFsaXR5IGtlZXBzIG1haW50ZW5hbmNlCitvdmVyaGVhZCBkb3duLiBJbXBsZW1lbnRpbmcgdGFzayBleHRlbnNpb25zIHRocm91Z2ggSmF2YSBjb2RlIHNlZW1zCitleHRyYSBlZmZvcnQgYXQgZmlyc3QsIGJ1dCBnaXZlcyBleHRyYSBiZW5lZml0czotCisKKzx1bD4KKzxsaT5Dcm9zcyBwbGF0Zm9ybSBzdXBwb3J0IGNhbiBiZSBhZGRlZCBsYXRlciB3aXRob3V0IGNoYW5naW5nIGFueQorPHR0PmJ1aWxkLnhtbDwvdHQ+IGZpbGVzPC9saT4KKworPGxpPlRoZSBjb2RlIGNhbiBiZSBzdWJtaXR0ZWQgdG8gdGhlIEFudCBwcm9qZWN0IGl0c2VsZiwgZm9yIG90aGVyCitwZW9wbGUgdG8gdXNlIGFuZCBtYWludGFpbjwvbGk+CisKKzxsaT5JdCBrZWVwcyB0aGUgYnVpbGQgZmlsZXMgc2ltcGxlcjwvbGk+Cis8L3VsPgorCitJbiBhIHdheSwgaXQgaXMgdGhpcyBkZWNvdXBsaW5nIG9mIGZ1bmN0aW9uYWxpdHksICJ0aGUgdGFza3MiLCBmcm9tCit0aGUgZGVjbGFyYXRpb24gb2YgdXNlLCAidGhlIGJ1aWxkIGZpbGUiLCB0aGF0IGhhcyBoZWxwZWQgQW50IHN1Y2NlZWQuCitJZiB5b3UgaGF2ZSB0byBnZXQgc29tZXRoaW5nIGNvbXBsZXggZG9uZSBpbiBNYWtlIG9yIGFuIElERSwgeW91IGhhdmUgYQoraGFpcnkgbWFrZWZpbGUgdGhhdCBldmVyeW9uZSBpcyBzY2FyZWQgb2YsIG9yIGFuIElERSBjb25maWd1cmF0aW9uIHRoYXQKK2lzIGludmFyaWFibHkgdmVyeSBicml0dGxlLiBCdXQgYW4gQW50IHRhc2sgaXMgcmV1c2FibGUgYW5kIHNoYXJlYWJsZQorYW1vbmcgYWxsIEFudCB1c2Vycy4gTWFueSBvZiB0aGUgY29yZSBhbmQgb3B0aW9uYWwgdGFza3MgaW4gQW50IHRvZGF5LAordGFza3MgeW91IGRvIG9yIHdpbGwgY29tZSB0byBkZXBlbmQgb24sIHdlcmUgd3JpdHRlbiBieSBwZW9wbGUgdHJ5aW5nIHRvCitzb2x2ZSB0aGVpciBvd24gcHJlc3NpbmcgcHJvYmxlbXMuCisKKzxoMz4KK0VtYnJhY2UgQXV0b21hdGVkIFRlc3RpbmcKKzwvaDM+CisKKzxiPihhbHRlcm5hdGl2ZWx5ICJyZWNyaW1pbmF0ZSBlYXJseSwgcmVjcmltaW5hdGUgb2Z0ZW4iKTwvYj4KKzxwPgorQW50IGxldHMgeW91IGNhbGwgPGEgaHJlZj0ibWFudWFsL09wdGlvbmFsVGFza3MvanVuaXQuaHRtbCI+SlVuaXQ8L2E+Cit0YXNrcywgd2hpY2ggdW5pdCB0ZXN0IHRoZSBjb2RlIHlvdXIgdGVhbSBoYXMgd3JpdHRlbi4gQXV0b21hdGVkIHRlc3RpbmcKK21heSBzZWVtIGxpa2UgZXh0cmEgd29yayBhdCBmaXJzdCwgYnV0IEpVbml0IG1ha2VzIHdyaXRpbmcgdW5pdCB0ZXN0cyBzbworZWFzeSB0aGF0IHlvdSBoYXZlIGFsbW9zdCBubyByZWFzb24gbm90IHRvLiBJbnZlc3QgdGhlIHRpbWUgaW4gbGVhcm5pbmcKK2hvdyB0byB1c2UgSlVuaXQsIHdyaXRlIHRoZSB0ZXN0IGNhc2VzLCBhbmQgaW50ZWdyYXRlIHRoZW0gaW4gYSAndGVzdCcKK3RhcmdldCBmcm9tIEFudCBzbyB0aGF0IHlvdXIgZGFpbHkgb3IgaG91cmx5IHRlYW0gYnVpbGQgY2FuIGhhdmUgdGhlCit0ZXN0cyBhcHBsaWVkIGF1dG9tYXRpY2FsbHkuIE9uZSBvZiB0aGUgZnJlZSB0byBkb3dubG9hZCBjaGFwdGVycyBvZgorPGEgaHJlZj0iaHR0cDovL21hbm5pbmcuY29tL2hhdGNoZXIiPkphdmEgRGV2ZWxvcG1lbnQgd2l0aCBBbnQ8L2E+CitzaG93cyB5b3UgaG93IHRvIHVzZSBKVW5pdCBmcm9tIGluc2lkZSBBbnQuICAKKworPHA+CitPbmNlIHlvdSBhZGQgYSB3YXkgdG8gZmV0Y2ggY29kZSBmcm9tIHRoZSBTQ00gc3lzdGVtLCBlaXRoZXIgYXMgYW4gQW50Cit0YXNrLCBpbiBzb21lIHNoZWxsIHNjcmlwdCBvciBiYXRjaCBmaWxlIG9yIHZpYSBzb21lIGNvbnRpbnVvdXMKK2ludGVncmF0aW9uIHRvb2wuIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IGNvZGUgY2FuIGJlIGEgcHVyZSBBbnQgdGFzayBydW4KK29uIGFueSBib3ggZGVkaWNhdGVkIHRvIHRoZSB0YXNrLiBUaGlzIGlzIGlkZWFsIGZvciB2ZXJpZnlpbmcgdGhhdCB0aGUKK2J1aWxkIGFuZCB1bml0IHRlc3RzIHdvcmsgb24gZGlmZmVyZW50IHRhcmdldHMgZnJvbSB0aGUgdXN1YWwKK2RldmVsb3BtZW50IG1hY2hpbmVzLiBGb3IgZXhhbXBsZSwgYSBXaW45NS9KYXZhMS4xIGNvbWJpbmF0aW9uIGNvdWxkIGJlCit1c2VkIGV2ZW4gdGhvdWdoIG5vIGRldmVsb3BlciB3b3VsZCB3aWxsaW5nbHkgdXNlIHRoYXQgY29uZmlndXJhdGlvbgorZ2l2ZW4gdGhlIGNob2ljZS4KKworPHA+CitTeXN0ZW0gdGVzdHMgYXJlIGhhcmRlciB0byBhdXRvbWF0ZSB0aGFuIHVuaXQgdGVzdHMsIGJ1dCBpZiB5b3UgY2FuCit3cml0ZSBqYXZhIGNvZGUgdG8gc3RyZXNzIGxhcmdlIHBvcnRpb25zIG9mIHRoZSBzeXN0ZW0gLSBldmVuIGlmIHRoZSBjb2RlCitjYW4gbm90IHJ1biBhcyBKVW5pdCB0YXNrcyAtIHRoZW4gdGhlIDxhIGhyZWY9ICJtYW51YWwvQ29yZVRhc2tzL2phdmEuaHRtbCI+amF2YTwvYT4KK3Rhc2sgY2FuIGJlIHVzZWQgdG8gaW52b2tlIHRoZW0uIEl0IGlzIGJlc3QgdG8gc3BlY2lmeSB0aGF0IHlvdSB3YW50IGEKK25ldyBKVk0gZm9yIHRoZXNlIHRlc3RzLCBzbyB0aGF0IGEgc2lnbmlmaWNhbnQgY3Jhc2ggZG9lcyBub3QgYnJlYWsgdGhlCitmdWxsIGJ1aWxkLiBUaGUgSnVuaXQgZXh0ZW5zaW9ucyBzdWNoIGFzIAorPGEgaHJlZj0iaHR0cDovL2h0dHB1bml0LnNvdXJjZWZvcmdlLm5ldC8iPkh0dHBVbml0PC9hPiBmb3Igd2ViIHBhZ2VzLCBhbmQgCis8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NhY3R1cy8iPkNhY3R1czwvYT4gZm9yIEoyRUUgYW5kIHNlcnZsZXQgCit0ZXN0aW5nIGhlbHAgdG8gZXhwYW5kIHRoZSB0ZXN0aW5nIGZyYW1ld29yay4gVG8gdGVzdCBwcm9wZXJseSB5b3Ugd2lsbCBzdGlsbAorbmVlZCB0byBpbnZlc3QgYSBsb3Qgb2YgZWZmb3J0IGluIGdldHRpbmcgdGhlc2UgdG8gd29yayB3aXRoIHlvdXIgcHJvamVjdCwgYW5kIAorZGVyaXZpbmcgZ3JlYXQgdW5pdCwgc3lzdGVtIGFuZCByZWdyZXNzaW9uIHRlc3RzIC0gYnV0IHlvdXIgY3VzdG9tZXJzIHdpbGwgbG92ZSAKK3lvdSBmb3Igc2hpcHBpbmcgc29mdHdhcmUgdGhhdCB3b3Jrcy4gICAKKworPGgzPkxlYXJuIHRvIFVzZSBhbmQgbG92ZSB0aGUgYWRkLW9ucyB0byBBbnQ8L2gzPgorVGhlIEFudCBkaXN0cmlidXRpb24gaXMgbm90IHRoZSBsaW1pdCBvZiB0aGUgQW50IHVuaXZlcnNlLCBpdCBpcyBvbmx5Cit0aGUgYmVnaW5uaW5nLiBMb29rIGF0IHRoZSAKKzxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9leHRlcm5hbC5odG1sIj4KK0V4dGVybmFsIFRvb2xzIGFuZCBUYXNrcyBwYWdlCis8L2E+IGZvciBhbiB1cCB0byBkYXRlIGxpc3QuIEhlcmUgYXJlIHNvbWUgb2YgdGhlbSB0aGF0IC4KKworPHVsPgorPGxpPgorPGEgaHJlZj0iaHR0cDovL2NoZWNrc3R5bGUuc291cmNlZm9yZ2UubmV0LyI+Q2hlY2tzdHlsZTwvYT48YnI+CitUaGlzIHRvb2wgYXVkaXRzIHlvdXIgY29kZSBhbmQgZ2VuZXJhdGVzIEhUTUwgcmVwb3J0cyBvZiB3aGVyZXZlciBhbnkKK3N0eWxlIHJ1bGUgZ2V0cyBicm9rZW4uIE5vYm9keSBjYW4gaGlkZSBmcm9tIHRoZSBjb2RlIHBvbGljZSBub3chIHRpcDoKK3N0YXJ0IHVzaW5nIHRoaXMgZWFybHksIHNvIHRoZXJlJ3MgbGVzcyB0byBjb3JyZWN0LjwvbGk+Cis8bGk+Cis8YSBocmVmPSJodHRwOi8vYW50LWNvbnRyaWIuc2YubmV0LyI+QW50LWNvbnRyaWI8L2E+PGJyPgorVGhpcyBzb3VyY2Vmb3JnZSBwcm9qZWN0IGNvbnRhaW5zIGhlbHBlciB0YXNrcyB0aGF0IGFyZSBrZXB0IHNlcGFyYXRlCitmcm9tIGNvcmUgQW50IGZvciBpZGVvbG9naWNhbCBwdXJpdHk7IHRoZSBmb3JlYWNoIGFuZCB0cnljYXRjaCB0YXNrcyBpbgorcGFydGljdWxhci4gVGhlc2UgZ2l2ZSB5b3UgaXRlcmF0aW9uIGFuZCBleHRyYSBlcnJvciBoYW5kbGluZy4gQWxzbyBvbgordGhlIHNpdGUgaXMgdGhlICZsdDtjYyZndDsgdGFzayBzdWl0ZSwgdGhhdCBjb21waWxlIGFuZCBsaW5rIG5hdGl2ZSBjb2RlCitvbiBhIHZhcmlldHkgb2YgcGxhdGZvcm1zLjwvbGk+Cis8bGk+Cis8YSBocmVmPSJodHRwOi8veGRvY2xldC5zb3VyY2Vmb3JnZS5uZXQvIj5YRG9jbGV0PC9hPgorWERvY2xldCBhZGRzIGF0dHJpYnV0ZWQgb3JpZW50ZWQgcHJvZ3JhbW1pbmcgdG8gSmF2YS4gQnkgYWRkaW5nIGphdmFkb2MKK3RhZ3MgdG8geW91ciBjb2RlIHlvdSBjYW4gaGF2ZSBYRG9jbGV0IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgPHR0PndlYi54bWw8L3R0PgorZGVzY3JpcHRvcnMsIHRhZ2xpYiBkZXNjcmlwdG9ycywgRUpCIGludGVyZmFjZXMsIEpNWCBpbnRlcmZhY2UgY2xhc3NlcywKK0Nhc3RvciBYTUwvU1FMIGJpbmRpbmdzLCBhbmQgbWFueSBtb3JlLiBUaGUga2V5IGhlcmUgaXMgdGhhdCBhbGwgdGhvc2UKK2ZpZGRseSBsaXR0bGUgWE1MIGZpbGVzIHlvdSBuZWVkIHRvIGNyZWF0ZSwgYW5kIHRob3NlIGludGVyZmFjZXMgRUpCIGFuZAorSk1YIHJlcXVpcmVzIHRvIGltcGxlbWVudCwgYWxsIGNhbiBiZSBhdXRvZ2VuZXJhdGVkIGZyb20geW91ciBKYXZhCitjb2RlIHdpdGggYSBmZXcgaGVscGVyIGF0dHJpYnV0ZXMuIFRoaXMgcmVkdWNlcworZXJyb3JzIGFuZCBtZWFucyB5b3UgY2FuIGNoYW5nZSB5b3VyIGNvZGUgYW5kIGhhdmUgdGhlIHJlc3Qgb2YgdGhlIGFwcAordGFrZSBpdHMgY3VlIGZyb20gdGhlIHNvdXJjZS4gTmV2ZXIgZG8gRUpCLCBKTVggb3Igd2ViYXBwcyB3aXRob3V0IGl0IQorPC9saT4KKzwvdWw+CisKKzxhIG5hbWU9ImNyb3NzcGxhdGZvcm0iPgorPGgyPgorQ3Jvc3MgUGxhdGZvcm0gQW50Cis8L2gyPgorPC9hPgorQW50IGlzIHRoZSBiZXN0IGZvdW5kYXRpb24gZm9yIGNyb3NzIHBsYXRmb3JtIEphdmEgZGV2ZWxvcG1lbnQgYW5kCit0ZXN0aW5nIHRvIGRhdGUuIEJ1dCBpZiB5b3UgYXJlIG5vdCBwYXlpbmcgYXR0ZW50aW9uLCBpdCBpcyBwb3NzaWJsZSB0bworcHJvZHVjZSBidWlsZCBmaWxlcyB3aGljaCBvbmx5IHdvcmsgb24gb25lIHBsYXRmb3JtIC0gb3IgaW5kZWVkLCBvbmUKK3NpbmdsZSB3b3Jrc3RhdGlvbi4KKworPHA+CitUaGUgY29tbW9uIGJhcnJpZXJzIHRvIGNyb3NzLXBsYXRmb3JtIEFudCBhcmUgdGhlIHVzZSBvZiBjb21tYW5kIGxpbmUKK3Rvb2xzIChleGVjIHRhc2tzKSB3aGljaCBhcmUgbm90IHBvcnRhYmxlLCBwYXRoIGlzc3VlcywgYW5kIGhhcmQgY29kaW5nCitpbiB0aGUgbG9jYXRpb24gb2YgdGhpbmdzLgorCis8aDM+Q29tbWFuZCBMaW5lIGFwcHM6IDxhIGhyZWY9Im1hbnVhbC9Db3JlVGFza3MvZXhlYy5odG1sIj5FeGVjPC9hPiAvCisgPGEgaHJlZj0gIm1hbnVhbC9Db3JlVGFza3MvYXBwbHkuaHRtbCI+QXBwbHk8L2E+PC9oMz4KKworVGhlIHRyb3VibGUgd2l0aCBleHRlcm5hbCBpbnZvY2F0aW9uIGlzIHRoYXQgbm90IGFsbCBmdW5jdGlvbnMgYXJlIGZvdW5kCitjcm9zcyBwbGF0Zm9ybSwgYW5kIHRob3NlIHRoYXQgYXJlIG9mdGVuIGhhdmUgZGlmZmVyZW50IG5hbWVzIC0gRE9TCitkZXNjZW5kYW50cyBvZnRlbiBleHBlY3QgPHR0Pi5leGU8L3R0PiBvciA8dHQ+LmJhdDwvdHQ+IGF0IHRoZSBlbmQgb2YgZmlsZXMuIFRoYXQgY2FuIGJlCitiYWQgaWYgeW91IGV4cGxpY2l0bHkgaW5jbHVkZSB0aGUgZXh0ZW5zaW9uIGluIHRoZSBuYW1pbmcgb2YgdGhlIGNvbW1hbmQKKyhkb24ndCEpLCBnb29kIHdoZW4gaXQgbGV0cyB5b3Uga2VlcCB0aGUgdW5peCBhbmQgRE9TIHZlcnNpb25zIG9mIGFuCitleGVjdXRhYmxlIGluIHRoZSBzYW1lIGJpbiBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3Qgd2l0aG91dCBuYW1lCitjbGFzaGVzIGFyaXNpbmcuCisKKzxwPgorQm90aCB0aGUgY29tbWFuZCBsaW5lIGludm9jYXRpb24gdGFza3MgbGV0IHlvdSBzcGVjaWZ5IHdoaWNoIHBsYXRmb3JtCit5b3Ugd2FudCB0aGUgY29kZSB0byBydW4gb24sIHNvIHlvdSBjb3VsZCB3cml0ZSBkaWZmZXJlbnQgdGFza3MgZm9yIGVhY2gKK3BsYXRmb3JtIHlvdSBhcmUgdGFyZ2V0aW5nLiBBbHRlcm5hdGl2ZWx5LCB0aGUgcGxhdGZvcm0gZGlmZmVyZW5jZXMKK2NvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHNvbWUgZXh0ZXJuYWwgY29kZSB3aGljaCBBbnQgY2FsbHMuIFRoaXMgY2FuIGJlCitzb21lIGNvbXBpbGVkIGRvd24gamF2YSBpbiBhIG5ldyB0YXNrLCBvciBhbiBleHRlcm5hbCBzY3JpcHQgZmlsZS4KKworPGgzPkNyb3NzIHBsYXRmb3JtIHBhdGhzPC9oMz4KKworVW5peCBwYXRocyB1c2UgZm9yd2FyZCBzbGFzaGVzIGJldHdlZW4gZGlyZWN0b3JpZXMgYW5kIGEgY29sb24gdG8KK3NwbGl0IGVudHJpZXMuIFRodXMKKzxpPiIvYmluL2phdmEvbGliL3hlcmNlcy5qYXI6L2Jpbi9qYXZhL2xpYi9hbnQuamFyIjwvaT4gaXMKK2EgcGF0aCBpbiB1bml4LiBJbiBXaW5kb3dzIHRoZSBwYXRoIG11c3QgdXNlIHNlbWljb2xvbiBzZXBhcmF0b3JzLAorY29sb25zIGJlaW5nIHVzZWQgdG8gc3BlY2lmeSBkaXNrIGRyaXZlcywgYW5kIGJhY2tzbGFzaCBzZXBhcmF0b3JzCis8aT4iYzpcYmluXGphdmFcbGliXHhlcmNlcy5qYXI7YzpcYmluXGphdmFcbGliXGFudC5qYXIiPC9pPi4KKzxwPgorVGhpcyBkaWZmZXJlbmNlIGJldHdlZW4gcGxhdGZvcm1zIChpbmRlZWQsIHRoZSB3aG9sZSBqYXZhIGNsYXNzcGF0aAorcGFyYWRpZ20pIGNhbiBjYXVzZSBob3VycyBvZiBmdW4uCisKKzxwPgorQW50IHJlZHVjZXMgcGF0aCBwcm9ibGVtczsgYnV0IGRvZXMgbm90IGVsaW1pbmF0ZSB0aGVtIGVudGlyZWx5LiBZb3UKK25lZWQgdG8gcHV0IGluIHNvbWUgZWZmb3J0IHRvby4gVGhlIHJ1bGVzIGZvciBoYW5kbGluZyBwYXRoIG5hbWVzIGFyZQordGhhdCAnRE9TLWxpa2UgcGF0aG5hbWVzIGFyZSBoYW5kbGVkJywgJ1VuaXggbGlrZSBwYXRocyBhcmUgaGFuZGxlZCcuCitEaXNrIGRyaXZlcyAtJ0M6Jy0gYXJlIGhhbmRsZWQgb24gRE9TLWJhc2VkIGJveGVzLCBidXQgcGxhY2luZyB0aGVtIGluCit0aGUgPHR0PmJ1aWxkLnhtbDwvdHQ+IGZpbGUgcnVpbnMgYWxsIGNoYW5jZXMgb2YgcG9ydGFiaWxpdHkuIFJlbGF0aXZlIGZpbGUgcGF0aHMKK2FyZSBtdWNoIG1vcmUgcG9ydGFibGUuIFNlbWljb2xvbnMgd29yayBhcyBwYXRoIHNlcGFyYXRvcnMgLSBhIGZhY3Qgd2hpY2gKK2lzIHVzZWZ1bCBpZiB5b3VyIEFudCBpbnZvY2F0aW9uIHdyYXBwZXIgaW5jbHVkZXMgYSBsaXN0IG9mIGphcnMgYXMgYQorZGVmaW5lZCBwcm9wZXJ0eSBpbiB0aGUgY29tbWFuZCBsaW5lLiBJbiB0aGUgYnVpbGQgZmlsZXMgeW91IG1heSBmaW5kIGl0CitiZXR0ZXIgdG8gYnVpbGQgYSBjbGFzc3BhdGggYnkgbGlzdGluZyBpbmRpdmlkdWFsIGZpbGVzICh1c2luZyBsb2NhdGlvbj0KK2F0dHJpYnV0ZXMpLCBvciBieSBpbmNsdWRpbmcgYSBmaWxlc2V0IG9mIDx0dD4qLmphcjwvdHQ+IGluIHRoZSBjbGFzc3BhdGgKK2RlZmluaXRpb24uCis8cD4KK1RoZXJlIGlzIGFsc28gdGhlIDxhCitocmVmPSJtYW51YWwvQ29yZVRhc2tzL3BhdGhjb252ZXJ0Lmh0bWwiPlBhdGhDb252ZXJ0PC9hPiB0YXNrIHdoaWNoCitjYW4gcHV0IGEgZnVsbHkgcmVzb2x2ZWQgcGF0aCBpbnRvIGEgcHJvcGVydHkuIFdoeSBkbyB0aGF0PyBCZWNhdXNlIHRoZW4gCit5b3UgY2FuIHVzZSB0aGF0IHBhdGggaW4gb3RoZXIgd2F5cyAtIHN1Y2ggYXMgcGFzcyBpdCBhcyBhIHBhcmFtZXRlciB0byAKK3NvbWUgYXBwbGljYXRpb24geW91IGFyZSBjYWxsaW5nLCBvciB1c2UgdGhlIHJlcGxhY2UgdGFzayB0byBwYXRjaCBpdAoraW50byBhIGxvY2FsaXNlZCBzaGVsbCBzY3JpcHQgb3IgYmF0Y2ggZmlsZS4KKzxwPgorTm90ZSB0aGF0IERPUyBkZXNjZW5kZWQgZmlsZSBzeXN0ZW1zIGFyZSBjYXNlIGluc2Vuc2l0aXZlIChhcGFydCBmcm9tCit0aGUgb2JzY3VyZSBhYmVycmF0aW9uIG9mIHRoZSBXaW5OVCBQT1NJWCBzdWJzeXN0ZW0gcnVuIGFnYWluc3QgTlRGUyksCithbmQgdGhhdCBXaW5kb3dzIHByZXRlbmRzIHRoYXQgYWxsIGZpbGUgZXh0ZW5zaW9ucyB3aXRoIGZvdXIgb3IgbW9yZQorbGV0dGVycyBhcmUgYWxzbyB0aHJlZSBsZXR0ZXIgZXh0ZW5zaW9ucyAodHJ5IDx0dD5ERUxFVEUgKi5qYXY8L3R0PiBpbiB5b3VyIGphdmEKK2RpcmVjdG9yaWVzIHRvIHNlZSBhIGRpc2FzdHJvdXMgZXhhbXBsZSBvZiB0aGlzKS4KKworPHA+CitBbnQncyBwb2xpY3kgb24gY2FzZSBzZW5zaXRpdml0eSBpcyB3aGF0ZXZlciB0aGUgdW5kZXJseWluZyBmaWxlIHN5c3RlbQoraW1wbGVtZW50cywgYW5kIGl0cyBoYW5kbGluZyBvZiBmaWxlIGV4dGVuc2lvbnMgaXMgdGhhdCA8dHQ+Ki5qYXY8L3R0PiBkb2VzIG5vdAorZmluZCBhbnkgPHR0Pi5qYXZhPC90dD4gZmlsZXMuIFRoZSBKYXZhIGNvbXBpbGVyIGlzIG9mIGNvdXJzZSBjYXNlIHNlbnNpdGl2ZSAtIHlvdSBjYW4KK25vdCBoYXZlIGEgY2xhc3MgJ0V4YW1wbGVUaHJlZScgaW1wbGVtZW50ZWQgaW4gImV4YW1wbGV0aHJlZS5qYXZhIi4KKworPHA+CitTb21lIHRhc2tzIG9ubHkgd29yayBvbiBvbmUgcGxhdGZvcm0gLSA8YSBocmVmPSAibWFudWFsL0NvcmVUYXNrcy9jaG1vZC5odG1sIj4KK0NobW9kPC9hPiBiZWluZyBhIGNsYXNzaWMgZXhhbXBsZS4gVGhlc2UgdGFza3MgdXN1YWxseSByZXN1bHQgaW4ganVzdCBhCit3YXJuaW5nIG1lc3NhZ2Ugb24gYW4gdW5zdXBwb3J0ZWQgcGxhdGZvcm0gLSB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0J3MKK3Rhc2tzIHdpbGwgc3RpbGwgYmUgY2FsbGVkLiBPdGhlciB0YXNrcyBkZWdyYWRlIHRoZWlyIGZ1bmN0aW9uYWxpdHkgb24KK3BsYXRmb3JtcyBvciBKYXZhIHZlcnNpb25zLiBJbiBwYXJ0aWN1bGFyLCBhbnkgdGFzayB3aGljaCBhZGp1c3RzIHRoZQordGltZXN0YW1wIG9mIGZpbGVzIGNhbiBub3QgZG8gc28gcHJvcGVybHkgb24gSmF2YSAxLjEuIFRhc2tzIHdoaWNoIGNhbgorZG8gdGhhdCAtIDxhIGhyZWY9Im1hbnVhbC9Db3JlVGFza3MvZ2V0Lmh0bWwiPkdldDwvYT4sIDxhCitocmVmPSJtYW51YWwvQ29yZVRhc2tzL3RvdWNoLmh0bWwiPlRvdWNoPC9hPiBhbmQgPEEgaHJlZj0ibWFudWFsL0NvcmVUYXNrcy91bnppcC5odG1sIj4KK1VuamFyL1Vud2FyL1VuemlwPC9hPiBmb3IgZXhhbXBsZSwgZGVncmFkZSB0aGVpciBmdW5jdGlvbmFsaXR5IG9uCitKYXZhMS4xLCB1c3VhbGx5IHJlc29ydGluZyB0byB0aGUgY3VycmVudCB0aW1lc3RhbXAgaW5zdGVhZC4KKworPHA+CitGaW5hbGx5LCBQZXJsIG1ha2VzIGEgZ29vZCBwbGFjZSB0byB3cmFwIHVwIEphdmEgaW52b2NhdGlvbnMgY3Jvc3MKK3BsYXRmb3JtLCByYXRoZXIgdGhhbiBiYXRjaCBmaWxlcy4gSXQgaXMgaW5jbHVkZWQgaW4gbW9zdCBVbml4CitkaXN0cmlidXRpb25zLCBhbmQgaXMgYSBzaW1wbGUgZG93bmxvYWQgZm9yIDxhIGhyZWY9CisiaHR0cDovL3d3dy5hY3RpdmVzdGF0ZS5jb20vUHJvZHVjdHMvQWN0aXZlUGVybC8iPldpbjMyIHBsYXRmb3JtcyBmcm9tCitBY3RpdmVTdGF0ZTwvYT4uIEEgUGVybCBmaWxlIHdpdGggPHR0Pi5wbDwvdHQ+IGV4dGVuc2lvbiwgdGhlIHVzdWFsIFVuaXgKK3BhdGggdG8gcGVybCBvbiB0aGUgbGluZSAxIGNvbW1lbnQgYW5kIG1hcmtlZCBhcyBleGVjdXRhYmxlIGNhbiBiZSBydW4KK29uIFdpbmRvd3MsIE9TLzIgYW5kIFVuaXggYW5kIGhlbmNlIGNhbGxlZCBmcm9tIEFudCB3aXRob3V0IGlzc3Vlcy4gVGhlCitwZXJsIGNvZGUgY2FuIGJlIGxlZnQgdG8gcmVzb2x2ZSBpdHMgb3duIHBsYXRmb3JtIGlzc3Vlcy4gRG9uJ3QgZm9yZ2V0IHRvCitzZXQgdGhlIGxpbmUgZW5kaW5ncyBvZiB0aGUgZmlsZSB0byB0aGUgYXBwcm9wcmlhdGUgcGxhdGZvcm0gd2hlbiB5b3UKK3JlZGlzdHJpYnV0ZSBQZXJsIGNvZGU7IDxhCitocmVmPSJtYW51YWwvQ29yZVRhc2tzL2ZpeGNybGYuaHRtbCI+Zml4Q1JMRjwvYT4gCitjYW4gZG8gdGhhdCBmb3IgeW91LgorCis8YSBuYW1lPSJ0ZWFtIj4KKzxoMj5UZWFtIERldmVsb3BtZW50IFByb2Nlc3NlczwvaDI+Cis8L2E+CitFdmVuIGlmIGVhY2ggdGVhbSBtZW1iZXIgaXMgYWxsb3dlZCB0aGVpciBjaG9pY2Ugb2YgSURFL2VkaXRvciwgb3IgZXZlbgorT1MsIHlvdSBuZWVkIHRvIHNldCBhIGJhc2VsaW5lIG9mIGZ1bmN0aW9uYWxpdHkgb24gZWFjaCBib3guIEluCitwYXJ0aWN1bGFyLCB0aGUgSkRLcyBhbmQgamFycyBuZWVkIHRvIGJlIGluIHBlcmZlY3Qgc3luYy4gSWRlYWxseSBwaWNrCit0aGUgbGF0ZXN0IHN0YWJsZSBKYXZhL0pESyB2ZXJzaW9uIGF2YWlsYWJsZSBvbiBhbGwgZGV2ZWxvcGVyL3RhcmdldAorc3lzdGVtcyBhbmQgc3RpY2sgd2l0aCBpdCBmb3IgYSB3aGlsZS4gQ29uc2lkZXIgYXNzaWduaW5nIG9uZSBwZXJzb24gdG8KK2JlIHRoZSBjb250YWN0IHBvaW50IGZvciBhbGwgdG9vbHMgY29taW5nIGluIC0gcGFydGljdWxhcmx5IG9wZW4gc291cmNlCit0b29scyB3aGVuIGEgbmV3IGJ1aWxkIGlzIGF2YWlsYWJsZSBvbiBhIG5pZ2h0bHkgYmFzaXMuIFVubGVzcyBuZWVkZWQsCit0aGVzZSB0b29scyBzaG91bGQgb25seSByZWFsbHkgYmUgdXBkYXRlZCBtb250aGx5LCBvciB3aGVuIGEgZm9ybWFsCityZWxlYXNlIGlzIG1hZGUuCisKKzxwPgorQW5vdGhlciBnb29kIHRhY3RpYyBpcyB0byB1c2UgYSB1bmlmaWVkIGRpcmVjdG9yeSB0cmVlLCBhbmQgYWRkIG9uIGV4dHJhCit0b29scyBpbnNpZGUgdGhhdCB0cmVlLiBBbGwgcmVmZXJlbmNlcyBjYW4gYmUgbWFkZSByZWxhdGl2ZSB0byB0aGUgdHJlZS4KK0lmIHRlYW0gbWVtYmVycyBhcmUgZXhwZWN0ZWQgdG8gYWRkIGEgZGlyZWN0b3J5IGluIHRoZSBwcm9qZWN0IHRvIHRoZWlyCitwYXRoLCB0aGVuIGNvbW1hbmQgbGluZSB0b29scyBjYW4gYmUgaW5jbHVkZWQgdGhlcmUgLSBpbmNsdWRpbmcgdGhvc2UKK2ludm9rZWQgYnkgQW50IGV4ZWMgdGFza3MuIFB1dCBldmVyeXRoaW5nIHVuZGVyIHNvdXJjZSBjb2RlIGNvbnRyb2wgYW5kCit5b3UgaGF2ZSBhIG9uZSBzdG9wIHNob3AgZm9yIGdldHRpbmcgYSBidWlsZC9leGVjdXRlIGVudmlyb25tZW50IHB1cmVseQorZnJvbSBDVlMgb3IgeW91ciBlcXVpdmFsZW50LgorCis8YSBuYW1lPSJkZXBsb3lpbmciPgorPGgyPkRlcGxveWluZyB3aXRoIEFudDwvaDI+Cis8L2E+CitPbmUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlbiBBbnQgYW5kIG9sZGVyIHRvb2xzIHN1Y2ggYXMgTWFrZSBpcyB0aGF0IHRoZQorcHJvY2Vzc2VzIGZvciBkZXBsb3lpbmcgSmF2YSB0byByZW1vdGUgc2l0ZXMgYXJlIHJlYXNvbmFibHkgd2VsbAorZXZvbHZlZCBpbiBBbnQuIFRoYXQgaXMgYmVjYXVzZSB3ZSBhbGwgaGF2ZSB0byBkbyBpdCB0aGVzZSBkYXlzLCBzbworbWFueSBwZW9wbGUgaGF2ZSBwdXQgaW4gdGhlIGVmZm9ydCB0byBtYWtlIHRoZSB0YXNrcyBlYXNpZXIuCis8cD4KK0FudCBjYW4gPGEgaHJlZj0ibWFudWFsL0NvcmVUYXNrcy9qYXIuaHRtbCI+SmFyPC9hPiwgPGEgaHJlZj0KKyJtYW51YWwvQ29yZVRhc2tzL3Rhci5odG1sIj5UYXI8L2E+IG9yIDxhCitocmVmPSJtYW51YWwvQ29yZVRhc2tzL3ppcC5odG1sIj5aaXA8L2E+IGZpbGVzIGZvciBkZXBsb3ltZW50LCB3aGlsZSB0aGUKKzxhIGhyZWY9Im1hbnVhbC9Db3JlVGFza3Mvd2FyLmh0bWwiPldhcjwvYT4gdGFzayBleHRlbmRzIHRoZSBqYXIgdGFzaworZm9yIGJldHRlciBzZXJ2bGV0IGRlcGxveW1lbnQuIAorPGEgaHJlZiA9Im1hbnVhbC9PcHRpb25hbFRhc2tzL2psaW5rLmh0bWwiPkpsaW5rPC9hPiBpcyBhCitqYXIgZ2VuZXJhdGlvbiBmaWxlIHdoaWNoIGxldHMgeW91IG1lcmdlIG11bHRpcGxlIHN1YiBqYXJzLiBUaGlzIGlzCitpZGVhbCBmb3IgYSBidWlsZCBwcm9jZXNzIGluIHdoaWNoIHNlcGFyYXRlIGphcnMgYXJlIGdlbmVyYXRlZCBieSBzdWIKK3Byb2plY3RzLCB5ZXQgdGhlIGZpbmFsIG91dHB1dCBpcyBhIG1lcmdlZCBqYXIuIDxhIGhyZWY9CisibWFudWFsL09wdGlvbmFsVGFza3MvY2FiLmh0bWwiPkNhYjwvYT4gY2FuIGJlIHVzZWQgb24gV2luMzIgYm94ZXMgdG8KK2J1aWxkIGEgY2FiIGZpbGUgd2hpY2ggaXMgdXNlZnVsIGlmIHlvdSBzdGlsbCBoYXZlIHRvIHRhcmdldCBJRSBkZXBsb3ltZW50LgorCis8cD4KK1RoZSA8YSBocmVmPSJpbmRleC5odG1sI2Z0cCI+ZnRwPC9hPiB0YXNrIGxldHMgeW91IG1vdmUgc3R1ZmYgdXAgdG8gYQorc2VydmVyLiBCZXdhcmUgb2YgcHV0dGluZyB0aGUgZnRwIHBhc3N3b3JkIGluIHRoZSBidWlsZCBmaWxlIC0gYSBwcm9wZXJ0eQorZmlsZSB3aXRoIHRpZ2h0IGFjY2VzcyBjb250cm9sIGlzIHNsaWdodGx5IGJldHRlci4gVGhlIDxhIGhyZWY9CisibWFudWFsL0NvcmVUYXNrcy9maXhjcmxmLmh0bWwiPkZpeENSTEY8L2E+IHRhc2sgaXMgb2Z0ZW4gYSB1c2VmdWwgaW50ZXJpbSBzdGVwIGlmCit5b3UgbmVlZCB0byB0byBhZGp1c3QgdGhlIGxpbmUgZW5kaW5ncyBvZiBmaWxlcy4gQQorV2ViRGF2IHRhc2sgaGFzIGxvbmcgYmVlbiBkaXNjdXNzZWQsIHdoaWNoIHdvdWxkIHByb3ZpZGUgYSBtb3JlIHNlY3VyZQordXBsb2FkIHRvIHdlYiBzZXJ2ZXJzLCBidXQgaXQgaXMgc3RpbGwgaW4gdGhlIHRvZG8gbGlzdC4gUnVtb3VyIGhhcyBpdAordGhhdCB0aGVyZSBpcyBzdWNoIGEgdGFzayBpbiB0aGUgamFrYXJ0YS1zbGlkZSBsaWJyYXJpZXMuIFdpdGggTWFjT1MgWCwKK0xpbnV4IGFuZCBXaW5kb3dzIFhQIGFsbCBzdXBwb3J0aW5nIFdlYkRBViBmaWxlIHN5c3RlbXMsIHlvdSBtYXkgZXZlbiBiZSBhYmxlCit0byB1c2UgPGEgaHJlZj0ibWFudWFsL0NvcmVUYXNrcy9jb3B5Lmh0bWwiPmNvcHk8L2E+IHRvIGRlcGxveQordGhvdWdoIGEgZmlyZXdhbGwuIAorCis8cD4KK0VKQiBkZXBsb3ltZW50IGlzIGFpZGVkIGJ5IHRoZSA8YSBocmVmPSJtYW51YWwvT3B0aW9uYWxUYXNrcy9lamIuaHRtbCI+ZWpiPC9hPiB0YXNrcywKK3doaWxlIHRoZSAKKzxhCitocmVmPSJtYW51YWwvT3B0aW9uYWxUYXNrcy9zZXJ2ZXJkZXBsb3kuaHRtbCI+c2VydmVyZGVwbG95PC9hPgorc3VpdGUgY2FuIGRlcGxveSB0byBtdWx0aXBsZSBzZXJ2ZXJzLiBUaGUgcG9wdWxhcml0eSBvZiBBbnQgaGFzCitlbmNvdXJhZ2VkIHZlbmRvcnMgdG8gcHJvZHVjZSB0aGVpciBvd24gZGVwbG95bWVudCB0YXNrcyB3aGljaCB0aGV5CityZWRpc3RyaWJ1dGUgd2l0aCB0aGVpciBzZXJ2ZXJzLiBGb3IgZXhhbXBsZSwgdGhlIFRvbWNhdDQuMSBpbnN0YWxsYXRpb24KK2luY2x1ZGVzIHRhc2tzIHRvIGRlcGxveSwgdW5kZXBsb3kgYW5kIHJlbG9hZCB3ZWIgYXBwbGljYXRpb25zLgorCis8cD4KK0ZpbmFsbHksIHRoZXJlIGFyZSBvZiBjb3Vyc2UgdGhlIGZhbGxiYWNrcyBvZiBqdXN0IGNvcHlpbmcgZmlsZXMgdG8gYQorZGVzdGluYXRpb24gdXNpbmcgPGEgaHJlZj0ibWFudWFsL0NvcmVUYXNrcy9jb3B5Lmh0bWwiPkNvcHk8L2E+IGFuZCA8YSBocmVmPSJpbmRleC5odG1sI2NvcHlkaXIiPkNvcHlkaXI8L2E+ICwgb3IganVzdCBzZW5kaW5nIHRoZW0gdG8gYSBwZXJzb24gb3IKK3Byb2Nlc3MgdXNpbmcgPGEgaHJlZj0ibWFudWFsL0NvcmVUYXNrcy9tYWlsLmh0bWwiPk1haWw8L2E+IG9yIHRoZSBhdHRhY2htZW50Cithd2FyZSA8YSBocmVmPSAibWFudWFsL09wdGlvbmFsVGFza3MvbWltZW1haWwuaHRtbCI+TWltZU1haWw8L2E+LgorSW4gb25lIHByb2plY3Qgb3VyIHRlYW0gZXZlbiB1c2VkIEFudCB0byBidWlsZCBDRCBpbWFnZXMgdGhyb3VnaCBhIGJ1aWxkIGZvbGxvd2VkCitieSBhIGxvbmcgc2V0IG9mIENvcHkgdGFza3MsIHdoaWNoIHdvcmtlZCBzdXJwcmlzaW5nbHkgd2VsbCwgY2VydGFpbmx5CitlYXNpZXIgdGhhbiB3aGVuIHdlIG1haWxlZCB0aGVtIHRvIHRoZSBmcmVlIGVtYWlsIHNlcnZpY2Ugb24KK215cmVhbGJveC5jb20sIHRoZW4gcHVsbGVkIHRoZW0gZG93biBmcm9tIHRoZSBmYXIgZW5kJ3Mgd2ViIGJyb3dzZXIsIHdoaWNoIHdlCit3ZXJlIHJ1bm5pbmcgb3ZlciBXaW5OVCByZW1vdGUgZGVza3RvcCBjb25uZWN0aW9uLCB0aGF0IGJlaW5nIHR1bm5lbGVkCit0aHJvdWdoIFNTSC4KKworPGEgbmFtZT0iZGlyZWN0b3JpZXMiPgorPGgyPiBEaXJlY3RvcnkgU3RydWN0dXJlczwvaDI+Cis8L2E+CisKK0hvdyB5b3Ugc3RydWN0dXJlIHlvdXIgZGlyZWN0b3J5IHRyZWUgaXMgdmVyeSBkZXBlbmRlbnQgdXBvbiB0aGUKK3Byb2plY3QuIEhlcmUgYXJlIHNvbWUgZGlyZWN0b3J5IGxheW91dCBwYXR0ZXJucyB3aGljaCBjYW4gYmUgdXNlZCBhcworc3RhcnRpbmcgcG9pbnRzLiBBbGwgdGhlIGpha2FydGEgcHJvamVjdHMgZm9sbG93IGEgcm91Z2hseSBzaW1pbGFyCitzdHlsZSwgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byBuYXZpZ2F0ZSBhcm91bmQgb25lIGZyb20gb25lIHByb2plY3QgdG8KK2Fub3RoZXIsIGFuZCBlYXN5IHRvIGNsZWFuIHVwIHdoZW4gZGVzaXJlZC4gCisKKzxoMz5TaW1wbGUgUHJvamVjdDwvaDM+CisKK1RoZSBwcm9qZWN0IGNvbnRhaW5zIHN1YiBkaXJlY3RvcmllcworPHRhYmxlIHdpZHRoPSIxMDAlIj4KKzx0cj4KKyAgICA8dGQ+PGI+YmluPC9iPgorICAgIDwvdGQ+CisgICAgPHRkPmNvbW1vbiBiaW5hcmllcywgc2NyaXB0cyAtIHB1dCB0aGlzIG9uIHRoZSBwYXRoLgorICAgIDwvdGQ+Cis8L3RyPgorCis8dHI+CisgICAgPHRkPjxiPmJ1aWxkPC9iPgorICAgIDwvdGQ+CisgICAgPHRkPlRoaXMgaXMgdGhlIHRyZWUgZm9yIGJ1aWxkaW5nOyBBbnQgY3JlYXRlcyBpdCBhbmQgY2FuIGVtcHR5IGl0CisgICAgaW4gdGhlICdjbGVhbicgcHJvamVjdC4KKyAgICA8L3RkPgorPC90cj4KKzx0cj4KKyAgICA8dGQ+PGI+ZGlzdDwvYj4KKyAgICA8L3RkPgorICAgIDx0ZD5EaXN0cmlidXRpb24gb3V0cHV0cyBnbyBpbiBoZXJlOyB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQgaW4gQW50CisgICAgYW5kIGNsZWFuIGVtcHRpZXMgaXQgb3V0CisgICAgPC90ZD4KKzwvdHI+Cis8dHI+CisgICAgPHRkPjxiPmRvYzwvYj4KKyAgICA8L3RkPgorICAgIDx0ZD5IYW5kIGNyYWZ0ZWQgZG9jdW1lbnRhdGlvbgorICAgIDwvdGQ+Cis8L3RyPgorPHRyPgorICAgIDx0ZD48Yj5saWI8L2I+CisgICAgPC90ZD4KKyAgICA8dGQ+SW1wb3J0ZWQgSmF2YSBsaWJyYXJpZXMgZ28gaW4gdG8gdGhpcyBkaXJlY3RvcnkKKyAgICA8L3RkPgorPC90cj4KKzx0cj4KKyAgICA8dGQ+PGI+c3JjPC9iPgorICAgIDwvdGQ+CisgICAgPHRkPnNvdXJjZSBnb2VzIGluIHVuZGVyIHRoaXMgdHJlZSA8aT5pbiBhIGhpZXJhcmNoeSB3aGljaCBtYXRjaGVzCisgICAgdGhlIHBhY2thZ2UgbmFtZXM8aT4uIFRoZSBkZXBlbmRlbmN5IHJ1bGVzIG9mICZsdDtqYXZhYyZndDsgcmVxdWlyZXMgdGhpcy4gIAorICAgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworVGhlIGJpbiwgbGliLCBkb2MgYW5kIHNyYyBkaXJlY3RvcmllcyBzaG91bGQgYmUgdW5kZXIgc291cmNlIGNvZGUgY29udHJvbC4KK1NsaWdodCB2YXJpYXRpb25zIGluY2x1ZGUgYW4gZXh0cmEgdHJlZSBvZiBjb250ZW50IHRvIGJlIGluY2x1ZGVkIGluIHRoZQorZGlzdHJpYnV0aW9uIGphcnMgLSBpbmYgZmlsZXMsIGltYWdlcywgZXRjLiBUaGVzZSBjYW4gZ28gdW5kZXIgc291cmNlCit0b28sIHdpdGggYSA8dHQ+bWV0YWRhdGE8L3R0PiBkaXJlY3RvcnkgZm9yIDx0dD53ZWIueG1sPC90dD4gYW5kIHNpbWlsYXIKK21hbmlmZXN0cywgYW5kIGEgPHR0PndlYjwvdHQ+IGZvbGRlciBmb3Igd2ViIGNvbnRlbnQgLSBKU1AsIGh0bWwsIGltYWdlcworYW5kIHNvIG9uLiBLZWVwaW5nIHRoZSBjb250ZW50IGluIHRoaXMgZm9sZGVyIChvciBzdWIgaGllcmFyY2h5KQordG9nZXRoZXIgbWFrZXMgaXQgZWFzaWVyIHRvIHRlc3QgbGlua3MgYmVmb3JlIGRlcGxveW1lbnQuIFRoZSBhY3R1YWwKK3Byb2R1Y3Rpb24gb2YgYSBkZXBsb3ltZW50IGltYWdlLCBzdWNoIGFzIGEgd2FyIGZpbGUsIGNhbiBiZSBsZWZ0IHRvIHRoZQorYXBwcm9wcmlhdGUgQW50IHRhc2s6IHRoZXJlIGlzIG5vIG5lZWQgdG8gY29tcGxldGVseSBtb2RlbCB5b3VyIHNvdXJjZSB0cmVlIAordXBvbiB0aGUgZGVwbG95bWVudCBoaWVyYXJjaHkuIAorPHA+IAorSmF2YWRvYyBvdXRwdXQgY2FuIGJlCitkaXJlY3RlZCB0byBhIDx0dD5kb2MvPC90dD4gZm9sZGVyIGJlbmVhdGggPHR0PmJ1aWxkLzwvdHQ+LCBvciB0byA8dHQ+ZG9jL2phdmFkb2M8L3R0Pi4KKworPGgzPkludGVyZmFjZSBhbmQgSW1wbGVtZW50YXRpb24gc3BsaXQ8L2gzPgorCitJZiB0aGUgaW50ZXJmYWNlIGlzIHNwbGl0IGZyb20gdGhlIGltcGxlbWVudGF0aW9uIGNvZGUgdGhlbiB0aGlzIGNhbiBiZQorc3VwcG9ydGVkIHdpdGggbWlub3IgY2hhbmdlcyBqdXN0IGJ5IGhhdmluZyBhIHNlcGFyYXRlIGJ1aWxkIHBhdGggZm9yCit0aGUgaW50ZXJmYWNlIGRpcmVjdG9yeSAtIG9yIGJldHRlciBzdGlsbCBqdXN0IGluIHRoZSBqYXIgY29uc3RydWN0aW9uOgorb25lIGphciBmb3IgaW50ZXJmYWNlIGFuZCBvbmUgamFyIGZvciBpbXBsZW1lbnRhdGlvbi4KKworPGgzPkxvb3NlbHkgQ291cGxlZCBTdWIgUHJvamVjdHM8L2gzPgorCitJbiB0aGUgbG9vc2VseSBjb3VwbGVkIGFwcHJvYWNoIG11bHRpcGxlIHByb2plY3RzIGNhbiBoYXZlIHRoZWlyIG93bgorY29weSBvZiB0aGUgdHJlZSwgd2l0aCB0aGVpciBvd24gc291cmNlIGNvZGUgYWNjZXNzIHJpZ2h0cy4KK09uZSBkaWZmZXJlbmNlIHRvIGNvbnNpZGVyIGlzIG9ubHkgaGF2aW5nIG9uZSBpbnN0YW5jZSBvZiB0aGUgYmluIGFuZAorbGliIGRpcmVjdG9yaWVzIGFjcm9zcyBhbGwgcHJvamVjdHMuIFRoaXMgaXMgc29tZXRpbWVzIGdvb2QgLSBpdCBoZWxwcwora2VlcCBjb3BpZXMgb2YgeGVyY2VzLmphciBpbiBzeW5jLCBhbmQgc29tZXRpbWVzIGJhZCAtIGl0IGNhbiB1cGRhdGUKK2ZvdW5kYXRpb25hbCBqYXIgZmlsZXMgYmVmb3JlIHVuaXQgdGVzdGluZyBpcyBjb21wbGV0ZS4KKworPHA+CitUbyBzdGlsbCBoYXZlIGEgc2luZ2xlIGJ1aWxkIGFjcm9zcyB0aGUgc3ViIHByb2plY3RzLCB1c2UgcGFyZW50Cis8dHQ+YnVpbGQueG1sPC90dD4gZmlsZXMgd2hpY2ggY2FsbCBkb3duIGludG8gdGhlIHN1YiBwcm9qZWN0cy4KKzxwPgorVGhpcyBzdHlsZSB3b3JrcyB3ZWxsIGlmIGRpZmZlcmVudCB0ZWFtcyBoYXZlIGRpZmZlcmVudCBjb2RlCithY2Nlc3MvY29tbWl0bWVudCByaWdodHMuIFRoZSByaXNrIGlzIHRoYXQgYnkgZ2l2aW5nIGV4dHJhIGxlZXdheSB0byB0aGUKK3N1YiBwcm9qZWN0cywgeW91IGNhbiBlbmQgdXAgd2l0aCBpbmNvbXBhdGlibGUgc291cmNlLCBsaWJyYXJpZXMsIGJ1aWxkCitwcm9jZXNzZXMgYW5kIGp1c3QgaW5jcmVhc2UgeW91ciB3b3JrbG9hZCBhbmQgaW50ZWdyYXRpb24gZ3JpZWYgYWxsIHJvdW5kLgorPHA+CitUaGUgb25seSB3YXkgdG8gcmV0YWluIGNvbnRyb2wgb3ZlciBhIGZhaXJseSBsb29zZWx5IGludGVncmF0ZWQKK2NvbGxlY3Rpb24gb2YgcHJvamVjdHMgaXMgdG8gaGF2ZSBhIGZ1bGx5IGF1dG9tYXRlZCAgYnVpbGQgCithbmQgdGVzdCBwcm9jZXNzIHdoaWNoIHZlcmlmaWVzIHRoYXQgZXZlcnl0aGluZyBpcyBzdGlsbCBjb21wYXRpYmxlLiBTYW0KK1J1YnkgcnVucyBvbmUgZm9yIGFsbCB0aGUgYXBhY2hlIGphdmEgbGlicmFyaWVzIGFuZCBlbWFpbHMgZXZlcnlvbmUgd2hlbgorc29tZXRoaW5nIGJyZWFrczsgeW91ciBvd24gcHJvamVjdCBtYXkgYmUgYWJsZSB0byBtYWtlIHVzZSBvZiAKKzxBIGhyZWY9Imh0dHA6Ly9jcnVpc2Vjb250cm9sLnNvdXJjZWZvcmdlLm5ldC8iPkNydWlzZSBDb250cm9sPC9hPiBmb3IKK2FuIGF1dG9tYXRlZCwgY29udGludW91cywgYmFja2dyb3VuZCBidWlsZCBwcm9jZXNzLiAKKworPGgzPkludGVncmF0ZWQgc3ViIHByb2plY3RzPC9oMz4KKworVGlnaHRseSBjb3VwbGVkIHByb2plY3RzIGhhdmUgYWxsIHRoZSBzb3VyY2UgaW4gdGhlIHNhbWUgdHJlZTsgZGlmZmVyZW50Citwcm9qZWN0cyBvd24gZGlmZmVyZW50IHN1YmRpcmVjdG9yaWVzLiBCdWlsZCBmaWxlcyBjYW4gYmUgbW92ZWQgZG93biB0bwordGhvc2Ugc3ViZGlyZWN0b3JpZXMgKHNheSA8dHQ+c3JjL2NvbS9pc2VyYW4vY29yZTwvdHQ+IGFuZCA8dHQ+c3JjL2NvbS9pc2VyYW4vZXh0cmFzPC90dD4pLAorb3Iga2VwdCBhdCB0aGUgdG9wIC0gd2l0aCBpbmRlcGVuZGVudCBidWlsZCBmaWxlcyBuYW1lZCA8dHQ+Y29yZS54bWw8L3R0PiBhbmQKKzx0dD5leHRyYXMueG1sPC90dD4uCisKKzxwPgorVGhpcyBwcm9qZWN0IHN0eWxlIHdvcmtzIHdlbGwgaWYgZXZlcnlvbmUgdHJ1c3RzIGVhY2ggb3RoZXIgYW5kIHRoZQorc3ViIHByb2plY3RzIGFyZSBub3QgdG9vIGh1Z2Ugb3IgY29tcGxleC4gVGhlIHJpc2sgaXMgdGhhdCBhIHNwbGl0IHRvIGEKK21vcmUgbG9vc2VseSBjb3VwbGVkIGRlc2lnbiB3aWxsIGJlY29tZSBhIHJlcXVpcmVtZW50IGFzIHRoZSBwcm9qZWN0cworcHJvZ3Jlc3MgLSBidXQgYnkgdGhlIHRpbWUgdGhpcyBpcyByZWFsaXNlZCBzY2hlZHVsZSBwcmVzc3VyZSBhbmQKK2ludGVydHdpbmVkIGJ1aWxkIGZpbGVzIG1ha2UgZXhlY3V0aW5nIHRoZSBzcGxpdCB3ZWxsIG5pZ2ggaW1wb3NzaWJsZS4KK0lmIHRoYXQgaGFwcGVucyB0aGVuIGp1c3Qga2VlcCB3aXRoIGl0IHVudGlsIHRoZXJlIGlzIHRoZSB0aW1lIHRvCityZWZhY3RvciB0aGUgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlcy4gCisKKzxhIG5hbWU9ImFudHVwZGF0ZSI+Cis8aDI+CisgICAgQW50IFVwZGF0ZSBQb2xpY2llcworPC9oMj4KKzwvYT4KKworT25jZSB5b3Ugc3RhcnQgdXNpbmcgQW50LCB5b3Ugc2hvdWxkIGhhdmUgYSBwb2xpY3kgb24gd2hlbiBhbmQgaG93IHRoZQordGVhbSB1cGRhdGVzIHRoZWlyIGNvcGllcy4gQSBzaW1wbGUgcG9saWN5IGlzICZxdW90O2V2ZXJ5IG9mZmljaWFsIHJlbGVhc2UKK2FmdGVyIHdoYXRldmVyIGhpZ2ggc3RyZXNzIG1pbGVzdG9uZSBoYXMgcHVzaGVkIGFsbCB1bmltcG9ydGFudCB0YXNrcworKGxpa2Ugc2xlZXAgYW5kIHNlZWluZyBkYXlsaWdodCkgb24gdGhlIGJhY2sgYnVybmVyJnF1b3Q7LiBUaGlzIGluc3VsYXRlcyB5b3UKK2Zyb20gdGhlIGNoYW5nZXMgYW5kIG9jY2FzaW9uYWwgaW5zdGFiaWxpdGllcyB0aGF0IEFudCBnb2VzIHRocm91Z2gKK2R1cmluZyBkZXZlbG9wbWVudC4gSXRzIG1haW4gZGlzYWR2YW50YWdlIGlzIHRoYXQgaXQgaXNvbGF0ZXMgeW91IGZyb20KK3RoZSBuZXcgdGFza3MgYW5kIGZlYXR1cmVzIHRoYXQgQW50IGlzIGNvbnN0YW50bHkgYWRkaW5nLgorCis8cD4KK09mdGVuIGFuIHVwZGF0ZSB3aWxsIHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgPHR0PmJ1aWxkLnhtbDwvdHQ+IGZpbGVzLiBNb3N0CitjaGFuZ2VzIGFyZSBpbnRlbmRlZCB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSwgYnV0IHNvbWV0aW1lcyBhbgoraW5jb21wYXRpYmxlIGNoYW5nZSB0dXJucyBvdXQgdG8gYmUKK25lY2Vzc2FyeS4gVGhhdCBpcyB3aHkgZG9pbmcgdGhlIHVwZGF0ZSBpbiB0aGUgbHVsbCBhZnRlciBhIGJpZworbWlsZXN0b25lIGlzIGltcG9ydGFudC4gSXQgaXMgYWxzbyB3aHkgaW5jbHVkaW5nIDx0dD5hbnQuamFyPC90dD4gYW5kIHJlbGF0ZWQKK2ZpbGVzIGluIHRoZSBDVlMgdHJlZSBoZWxwcyBlbnN1cmUgdGhhdCBvbGQgdmVyc2lvbnMgb2YgeW91ciBzb2Z0d2FyZQorY2FuIGJlIHN0aWxsIGJlIGJ1aWx0LgorCis8cD4KK1RoZSBtb3N0IGFnZ3Jlc3NpdmUgc3RyYXRlZ3kgaXMgdG8gZ2V0IGEgd2Vla2x5IG9yIGRhaWx5IHNuYXBzaG90IG9mIHRoZQorYW50IHNvdXJjZSwgYnVpbGQgaXQgdXAgYW5kIHVzZSBpdC4gVGhpcyBmb3JjZXMgeW91IHRvIHR3ZWFrIHRoZQorPHR0PmJ1aWxkLnhtbDwvdHQ+IGZpbGVzIG1vcmUgcmVndWxhcmx5LCBhcyBuZXcgdGFza3MgYW5kIGF0dHJpYnV0ZXMgY2FuIHRha2UKK3doaWxlIHRvIHN0YWJpbGlzZS4gWW91IHJlYWxseSBoYXZlIHRvIHdhbnQgdGhlIG5ldyBmZWF0dXJlcywgZW5qb3kKK2dyYXR1aXRvdXMgZXh0cmEgd29yayBvciB0YWtlIHBsZWFzdXJlIGluIHVwc2V0dGluZyB5b3VyIGNvbGxlYWd1ZXMgdG8KK3Rha2UgdGhpcyBhcHByb2FjaC4KKworPHA+CitPbmNlIHlvdSBzdGFydCBleHRlbmRpbmcgQW50IHdpdGggbmV3IHRhc2tzLCBpdCBzdWRkZW5seSBiZWNvbWVzIG11Y2gKK21vcmUgdGVtcHRpbmcgdG8gcHVsbCBkb3duIHJlZ3VsYXIgYnVpbGRzLiBUaGUgbW9zdCByZWNlbnQgQW50IGJ1aWxkcworYXJlIGludmFyaWFibHkgdGhlIGJlc3QgcGxhdGZvcm0gZm9yIHdyaXRpbmcgeW91ciBleHRlbnNpb25zLCBhcyB5b3UKK2NhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgcmVndWxhciBlbmhhbmNlbWVudHMgdG8gdGhlIGZvdW5kYXRpb25hbAorY2xhc3Nlcy4gSXQgYWxzbyBwcmV2ZW50cyB5b3UgZnJvbSB3YXN0aW5nIHRpbWUgd29ya2luZyBvbiBzb21ldGhpbmcKK3doaWNoIGhhcyBhbHJlYWR5IGJlZW4gZG9uZS4gQSBuZXdseSBzdWJtaXR0ZWQgdGFzayB0byBkbyBzb21ldGhpbmcKK2NvbXBsZXggc3VjaCBhcyB0YWxrIHRvIEVKQiBlbmdpbmVzLCBTT0FQIHNlcnZlcnMgb3IganVzdCBjb252ZXJ0IGEgdGV4dAorZmlsZSB0byB1cHBlcmNhc2UgbWF5IGJlIGFsbW9zdCBleGFjdGx5IHdoYXQgeW91IG5lZWQgLSBzbyB0YWtlIGl0LAorZW5oYW5jZSBpdCBhbmQgb2ZmZXIgdXAgdGhlIGVuaGFuY2VtZW50cyB0byB0aGUgcmVzdCBvZiB0aGUgd29ybGQuIFRoaXMKK2lzIGNlcnRhaW5seSBiZXR0ZXIgdGhhbiBzdGFydGluZyB3b3JrIG9uIHlvdXIgJ3RleHQgY2FzZSBjb252ZXJ0ZXInCit0YXNrIG9uIEFudCAwLjggaW4gaXNvbGF0aW9uLCBhbm5vdW5jaW5nIGl0cyBleGlzdGVuY2Ugc2l4IG1vbnRocyBsYXRlcgorYW5kIGRpc2NvdmVyaW5nIHRoYXQgaW5zdGVhZCBvZiBhZHVsYXRpb24gYWxsIHlvdSBnZXQgYXJlIGhlbHBmdWwKK3BvaW50ZXJzIHRvIHRoZSBleGlzdGluZyBpbXBsZW1lbnRhdGlvbi4gVGhlIGZpbmFsIGJlbmVmaXQgb2YgYmVpbmcKK2ludm9sdmVkIHdpdGggdGhlIHByb2Nlc3MgaXMgdGhhdCBpdCBtYWtlcyBpdCBlYXNpZXIgZm9yIHlvdXIgdGFza3MgdG8gCitiZSBhZGRlZCB3aXRoIHRoZSBBbnQgQ1ZTIHRyZWUsIGJyaW5naW5nIGZvcndhcmQgdGhlIGRhdGUgd2hlbiBBbnQgaGFzCit0YWtlbiBvbiBhbGwgdGhlIGNoYW5nZXMgeW91IG5lZWRlZCB0byBtYWtlIHRvIGdldCB5b3VyIHByb2plY3QgdG8gd29yay4KK0lmIHRoYXQgaGFwcGVucyB5b3UgY2FuIHJldmVydCB0byBhbiBvZmZpY2lhbCBBbnQgcmVsZWFzZSwgYW5kIGdldCBvbgord2l0aCBhbGwgdGhlIG90aGVyIGNyaXNlcy4gCisKKzxwPgorWW91IHNob3VsZCBhbHNvIGdldCBvbiB0aGUgPGEgaHJlZiA9CisibWFpbHRvOmRldi1zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmciPmRldiBtYWlsaW5nIGxpc3QKKzwvYT4sIGFzIGl0IGlzIHdoZXJlIHRoZSBvdGhlciBkZXZlbG9wZXJzIHBvc3QgdGhlaXIgd29yaywgcHJvYmxlbXMgYW5kCitleHBlcmllbmNlLiBUaGUgdm9sdW1lIGNhbiBiZSBxdWl0ZSBoaWdoOiA0MCsgbWVzc2FnZXMgYSBkYXksIHNvCitjb25zaWRlciByb3V0aW5nIGl0IHRvIGFuIGVtYWlsIGFkZHJlc3MgeW91IGRvbid0IHVzZSBmb3IgbXVjaCBlbHNlLiBBbmQKK2Rvbid0IG1ha2UgZXZlcnlvbmUgb24gdGhlIHRlYW0gc3Vic2NyaWJlOyBpdCBjYW4gYmUgdG9vIG11Y2ggb2YgYQorZGlzdHJhY3Rpb24uCisKKzxhIG5hbWU9Imluc3RhbGwiPgorPGgyPgorSW5zdGFsbGluZyB3aXRoIEFudC4KKzwvaDI+Cis8L2E+CitCZWNhdXNlIEFudCBjYW4gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGNvcHksIHVuemlwIGFuZCBkZWxldGUgZmlsZXMKK2FuZCBtYWtlIGphdmEgYW5kIE9TIGNhbGxzLCBpdCBjYW4gYmUgdXNlZCBmb3Igc2ltcGxlIGluc3RhbGxhdGlvbgordGFza3MuIEZvciBleGFtcGxlLCBhbiBpbnN0YWxsZXIgZm9yIHRvbWNhdCBjb3VsZCBleHRyYWN0IHRoZQorZW52aXJvbm1lbnQgdmFyaWFibGUgPHR0PlRPTUNBVF9IT01FPC90dD4sIHN0b3AgdG9tY2F0IHJ1bm5pbmcsIGFuZCBjb3B5IGEgd2FyCitmaWxlIHRvIDx0dD5UT01DQVRfSE9NRS93ZWJhcHBzPC90dD4uIEl0IGNvdWxkIGV2ZW4gc3RhcnQgdG9tY2F0IGFnYWluLCBidXQgdGhlCitidWlsZCB3b3VsZG4ndCBjb21wbGV0ZSB1bnRpbCB0b21jYXQgZXhpdGVkLCB3aGljaCBpcyBwcm9iYWJseSBub3Qgd2hhdAord2FzIHdhbnRlZC4gCisKKzxwPgorVGhlIGFkdmFudGFnZSBvZiB1c2luZyBBbnQgaXMgZmlyc3RseSB0aGF0IHRoZSBzYW1lIGluc3RhbGwgdGFyZ2V0cworY2FuIGJlIHVzZWQgZnJvbSB5b3VyIGxvY2FsIGJ1aWxkIGZpbGVzICh2aWEgYW4gPHR0PmFudDwvdHQ+IGludm9jYXRpb24KK29mIHRoZSA8dHQ+aW5zdGFsbC54bWw8L3R0PiBmaWxlKSwgYW5kIHNlY29uZGx5IHRoYXQgYSBiYXNpYyBpbnN0YWxsIHRhcmdldCBpcworcXVpdGUgZWFzeSB0byB3cml0ZS4gVGhlIGRpc2FkdmFudGFnZXMgb2YgdGhpcyBhcHByb2FjaCBhcmUgdGhhdCB0aGUKK2Rlc3RpbmF0aW9uIG11c3QgaGF2ZSBhbiB1cCB0byBkYXRlIHZlcnNpb24gb2YgQW50IGNvcnJlY3RseQorcHJlLWluc3RhbGxlZCwgYW5kIEFudCBkb2Vzbid0IGFsbG93IHlvdSB0byBoYW5kbGUgZmFpbHVyZXMgd2VsbCAtIGFuZCBhCitnb29kIGluc3RhbGxlciBpcyBhbGwgYWJvdXQgaGFuZGxpbmcgd2hlbiB0aGluZ3MgZ28gd3JvbmcsIGZyb20gZmlsZXMKK2JlaW5nIGluIHVzZSB0byBqYXIgdmVyc2lvbnMgYmVpbmcgZGlmZmVyZW50LiBUaGlzIG1lYW5zIHRoYXQgQW50IGlzIG5vdAorc3VpdGVkIGZvciBzaHJpbmsgd3JhcHBlZCBzb2Z0d2FyZSwgYnV0IGl0IGRvZXMgd29yayBmb3IgZGVwbG95bWVudCBhbmQKK2luc3RhbGxhdGlvbiB0byB5b3VyIGxvY2FsIHNlcnZlcnMuCisKKzxwPgorT25lIG1ham9yIGJ1aWxkIHByb2plY3QgSSB3YXMgaW52b2x2ZWQgaW4gaGFkIGFuIEFudCBpbnN0YWxsIGJ1aWxkIGZpbGUKK2ZvciB0aGUgYmx1ZXN0b25lIGFwcGxpY2F0aW9uIHNlcnZlciwgd2hpY2ggd291bGQgc2h1dGRvd24gYWxsIGZvdXIKK2luc3RhbmNlcyBvZiB0aGUgYXBwIHNlcnZlciBvbiBhIHNpbmdsZSBtYWNoaW5lLCBjb3B5IHRoZSBuZXcgdmVyc2lvbiBvZgordGhlIHdhciBmaWxlICh3aXRoIGRhdGVzdGFtcCBhbmQgYnVpbGRzdGFtcCkgdG8gYW4gYXJjaGl2ZSBkaXJlY3RvcnksCitjbGVhbiB1cCB0aGUgY3VycmVudCBkZXBsb3llZCB2ZXJzaW9uIG9mIHRoZSB3YXIgYW5kIHRoZW4gaW5zdGFsbCB0aGUKK25ldyB2ZXJzaW9uLiBCZWNhdXNlIGJsdWVzdG9uZSByZXN0YXJ0ZWQgSlZNcyBvbiBkZW1hbmQsIHRoaXMgc2NyaXB0IHdhcworYWxsIHlvdSBuZWVkZWQgZm9yIHdlYiBzZXJ2aWNlIGRlcGxveW1lbnQuIE9uIHRoZSBzeXN0ZW1zIGJlaGluZCB0aGUKK2ZpcmV3YWxsLCB3ZSB1cHBlZCB0aGUgYW50ZSBpbiB0aGUgZGVwbG95bWVudCBwcm9jZXNzIGJ5IHVzaW5nIHRoZSBmdHAKK3Rhc2sgdG8gY29weSBvdXQgdGhlIHdhciBhbmQgYnVpbGQgZmlsZXMsIHRoZW4gdGhlIHRlbG5ldCB0YXNrIHRvCityZW1vdGVseSBpbnZva2UgdGhlIGJ1aWxkIGZpbGUuIFRoZSByZXN1bHQgd2FzIHdlIGhhZCBhdXRvbWF0ZWQKK3JlY29tcGlsZSBhbmQgcmVkZXBsb3kgdG8gbG9jYWwgc2VydmVycyBmcm9tIGluc2lkZSBvdXIgSURFIChKZWRpdCkgb3IKK3RoZSBjb21tYW5kIGxpbmUsIHdoaWNoIHdhcyBzaW1wbHkgaW52YWx1YWJsZS4gSW1hZ2luZSBwcmVzc2luZyBhIGJ1dHRvbgorb24geW91ciBJREUgdG9vbGJhciB0byBidWlsZCwgdW5pdCB0ZXN0LCBkZXBsb3kgYW5kIHRoZW4gZnVuY3Rpb25hbCB0ZXN0Cit5b3VyIHdlYmFwcC4gCisKKzxwPgorT25lIGV4dHJhIHRyaWNrIEkgYWRkZWQgbGF0ZXIgd2FzIGEganVuaXQgdGVzdCBjYXNlIHRvIHJ1biB0aHJvdWdoIHRoZQoraW5zdGFsbCBjaGVjayBsaXN0LiBXaXRoIHRlc3RzIHRvIHZlcmlmeSBhY2Nlc3MgcGVybWlzc2lvbnMgb24gbmV0d29yaworZHJpdmVzLCBhcHByb3hpbWF0ZSBjbG9jayBzeW5jaHJvbmlzYXRpb24gYmV0d2VlbiBzZXJ2ZXJzLCBETlMKK2Z1bmN0aW9uYWxpdHksIGFiaWxpdHkgdG8gc3Bhd24gZXhlY3V0YWJsZXMgYW5kIGFsbCB0aGUgb3RoZXIgdHJvdWJsZQorc3BvdHMsIHRoZSBpbnN0YWxsIHNjcmlwdCBjb3VsZCBhdXRvbWF0aWNhbGx5IGRvIGEgc3lzdGVtIGhlYWx0aCB0ZXN0CitkdXJpbmcgaW5zdGFsbCB0aW1lIGFuZCByZXBvcnQgcHJvYmxlbXMuIFtUaGUgc2FtZSB0ZXN0cyBjb3VsZCBhbHNvIGJlCitpbnZva2VkIGZyb20gYSBKTVggTUJlYW4sIGJ1dCB0aGF0J3MgYW5vdGhlciBzdG9yeV0uIAorCis8cD4KK1NvLCBBbnQgaXMgbm90IGEgc3Vic3RpdHV0ZSBmb3IgYSByZWFsIGluc3RhbGxlciB0b29sLCBleGNlcHQgaW4gdGhlCitzcGVjaWFsIGNhc2Ugb2Ygc2VydmVycyB5b3UgY29udHJvbCwgYnV0IGluIHRoYXQgY29udGV4dCBpdCBkb2VzIGxldAoreW91IGludGVncmF0ZSByZW1vdGUgaW5zdGFsbGF0aW9uIHdpdGggeW91ciBidWlsZC4gCisKKworPGEgbmFtZT0idGlwcyI+Cis8aDI+CitUaXBzIGFuZCBUcmlja3M8L2gyPgorPC9hPgorPGRsPgorPGR0PjxiPgorICAgIGdldAorPC9iPjxkZD4KKworVGhlIDxhIGhyZWY9Im1hbnVhbC9Db3JlVGFza3MvZ2V0Lmh0bWwiPmdldDwvYT4gdGFzayBjYW4gZmV0Y2ggYW55IFVSTCwgc28gYmUgdXNlZAordG8gdHJpZ2dlciByZW1vdGUgc2VydmVyIHNpZGUgY29kZSBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MsIGZyb20gcmVtb3RlCitzZXJ2ZXIgcmVzdGFydHMgdG8gc2VuZGluZyBTTVMvcGFnZXIgbWVzc2FnZXMgdG8gdGhlIGRldmVsb3BlcgorY2VsbHBob25lcy4KKworPGR0PjxiPgoraTE4bgorPC9iPjxkZD4KKworSW50ZXJuYXRpb25hbGlzYXRpb24gaXMgYWx3YXlzIHRyb3VibGUuIEFudCBoZWxwcyBoZXJlIHdpdGggdGhlIDxhIGhyZWY9CisibWFudWFsL09wdGlvbmFsVGFza3MvbmF0aXZlMmFzY2lpLmh0bWwiPm5hdGl2ZTJhc2NpaTwvYT4gdGFzayB3aGljaCBjYW4gZXNjYXBlIG91dCBhbGwgbm9uCithc2NpaSBjaGFyYWN0ZXJzIGludG8gdW5pY29kZS4gWW91IGNhbiB1c2UgdGhpcyB0byB3cml0ZSBqYXZhIGZpbGVzCit3aGljaCBpbmNsdWRlIHN0cmluZ3MgKGFuZCBpbmRlZWQgY29tbWVudHMpIGluIHlvdXIgb3duIG5vbi1BU0NJSQorbGFuZ3VhZ2UgYW5kIHRoZW4gdXNlIG5hdGl2ZTJhc2NpaSB0byBjb252ZXJ0IHRvIGFzY2lpIHByaW9yIHRvIGZlZWRpbmcKK3Rocm91Z2ggamF2YWMuIFRoZSByZXN0IG9mIGkxOG4gYW5kIGwxMm4gaXMgbGVmdCB0byB5b3UuLi4KKworPGR0PjxiPgorVXNlIFByb3BlcnR5IEZpbGVzCis8L2I+PGRkPgorCitVc2UgZXh0ZXJuYWwgcHJvcGVydHkgZmlsZXMgdG8ga2VlcCBwZXItdXNlciBzZXR0aW5ncyBvdXQgdGhlIGJ1aWxkCitmaWxlcyAtIGVzcGVjaWFsbHkgcGFzc3dvcmRzLiBQcm9wZXJ0eSBmaWxlcyBjYW4gYWxzbyBiZSB1c2VkIHRvCitkeW5hbWljYWxseSBzZXQgYSBudW1iZXIgb2YgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgYSBzaW5nbGUKK3Byb3BlcnR5LCBzaW1wbHkgYnkgZHluYW1pY2FsbHkgZ2VuZXJhdGluZyB0aGUgcHJvcGVydHkgZmlsZW5hbWUgZnJvbSB0aGUKK3NvdXJjZSBwcm9wZXJ0eS4gVGhleSBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgc291cmNlIG9mIGNvbnN0YW50cyBhY3Jvc3MKK211bHRpcGxlIGJ1aWxkIGZpbGVzLgorCis8ZHQ+PGI+CitGYXN0ZXIgY29tcGlsZXMgd2l0aCBKaWtlcworPC9iPjxkZD4KKworVGhlIDxhIGhyZWY9Imh0dHA6Ly9qaWtlcy5zb3VyY2Vmb3JnZS5uZXQvIj5qaWtlcyBjb21waWxlcjwvYT4gaXMgdXN1YWxseSBtdWNoCitmYXN0ZXIgdGhhbiBqYXZhYywgZG9lcyBkZXBlbmRlbmN5IGNoZWNraW5nIGFuZCBoYXMgYmV0dGVyIGVycm9yCittZXNzYWdlcyAodXN1YWxseSkuIEdldCBpdC4gVGhlbiBzZXQKKzx0dD5idWlsZC5jb21waWxlcjwvdHQ+IHRvICJqaWtlcyIgZm9yIGl0IHRvIGJlIHVzZWQgaW4geW91ciBidWlsZCBmaWxlcy4KK0RvaW5nIHRoaXMgZXhwbGljaXRseSBpbiB5b3VyIGJ1aWxkIGZpbGVzIGlzIGEgYml0IGR1YmlvdXMgYXMgaXQgcmVxdWlyZXMgdGhlCit3aG9sZSB0ZWFtIChhbmQgc3ViIHByb2plY3RzKSB0byBiZSB1c2luZyBqaWtlcyB0b28gLSBzb21ldGhpbmcgeW91IGNhbiBvbmx5Citjb250cm9sIGluIHNtYWxsLCBjbG9zZWQgc291cmNlIHByb2plY3RzLiBCdXQgaWYgeW91IHNldCAKKzx0dD5BTlRfT1BUUyZuYnNwOz0mbmJzcDstRGJ1aWxkLmNvbXBpbGVyPWppa2VzPC90dD4KK2luIHlvdXIgZW52aXJvbm1lbnQsIHRoZW4gYWxsIHlvdXIgYnVpbGRzIG9uIHlvdXIgc3lzdGVtIHdpbGwgdXNlIAorSmlrZXMgYXV0b21hdGljYWxseSwgd2hpbGUgb3RoZXJzIGNhbiBjaG9vc2UgdGhlaXIgb3duIGNvbXBpbGVyLCBvciBsZXQKK2FudCBjaG9vc2Ugd2hpY2hldmVyIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIEphdmEuICAgCisKKzxkdD48Yj4KKyNpbmNsdWRlIHRhcmdldHMgdG8gc2ltcGxpZnkgbXVsdGkgPHR0PmJ1aWxkLnhtbDwvdHQ+IHByb2plY3RzCis8L2I+PGRkPgorCitZb3UgY2FuIGltcG9ydCBYTUwgZmlsZXMgaW50byBhIGJ1aWxkIGZpbGUgdXNpbmcgdGhlIFhNTCBwYXJzZXIgaXRzZWxmLgorVGhpcyBsZXRzIGEgbXVsdGktcHJvamVjdCBkZXZlbG9wbWVudCBwcm9ncmFtIHNoYXJlIGNvZGUgdGhyb3VnaCByZWZlcmVuY2UsCityYXRoZXIgdGhhbiBjdXQgYW5kIHBhc3RlIHJlLXVzZS4gSXQgYWxzbyBsZXRzIG9uZSBidWlsZCB1cCBhIGZpbGUgb2YKK3N0YW5kYXJkIHRhc2tzIHdoaWNoIGNhbiBiZSByZXVzZWQgb3ZlciB0aW1lLiBCZWNhdXNlIHRoZSBpbXBvcnQKK21lY2hhbmlzbSBpcyBhdCBhIGxldmVsIGJlbG93IHdoaWNoIEFudCBpcyBhd2FyZSwgdHJlYXQgaXQgYXMKK2VxdWl2YWxlbnQgdG8gdGhlICNpbmNsdWRlIG1lY2hhbmlzbSBvZiB0aGUgJ2xlZ2FjeScgbGFuZ3VhZ2VzIEMgYW5kCitDKysuCisKKzxwPgorVGhlcmUgYXJlIHR3byBpbmNsdXNpb24gbWVjaGFuaXNtcywgYW4gdWdseSBvbmUgZm9yIGFsbCBwYXJzZXJzIGFuZCBhCitjbGVhbiBvbmUuIFRoZSB1Z2x5IG1ldGhvZCBpcyB0aGUgb25seSBvbmUgdGhhdCB3YXMgYXZhaWxhYmxlIG9uIEFudDEuNSBhbmQKK2VhcmxpZXI6LQorPHByZT4KKyAgICAmbHQ7IURPQ1RZUEUgcHJvamVjdCBbCisgICAgICAmbHQ7IUVOVElUWSBwcm9wZXJ0aWVzQW5kUGF0aHMgU1lTVEVNICZxdW90O3Byb3BlcnRpZXNBbmRQYXRocy54bWwmcXVvdDsmZ3Q7CisgICAgICAmbHQ7IUVOVElUWSB0YXNrZGVmcyBTWVNURU0gJnF1b3Q7dGFza2RlZnMueG1sJnF1b3Q7Jmd0OworICAgIF0mZ3Q7ICAKKyAgICAKKyAgICAgICAgJmFtcDtwcm9wZXJ0aWVzQW5kUGF0aHM7CisgICAgICAgICZhbXA7dGFza2RlZnM7Cis8L3ByZT4KK1RoZSBjbGVhbmVyIG1ldGhvZCBpbiBBbnQxLjYgaXMgdGhlIDx0dD4mbHQ7aW1wb3J0Jmd0OzwvdHQ+IHRhc2sgdGhhdCBpbXBvcnRzCit3aG9sZSBidWlsZCBmaWxlcyBpbnRvIG90aGVyIHByb2plY3RzLiBUaGUgZW50aXR5IGluY2x1c2lvbiBleGFtcGxlCitjb3VsZCA8aT5hbG1vc3Q8L2k+IGJlIHJlcGxhY2VkIGJ5IHR3byBpbXBvcnQgc3RhdGVtZW50czotCis8cHJlPgorICZsdDtpbXBvcnQgZmlsZT0icHJvcGVydGllc0FuZFBhdGhzLnhtbCImZ3Q7CisgJmx0O2ltcG9ydCBmaWxlPSJ0YXNrZGVmcy54bWwiJmd0OworPC9wcmU+CisKK1dlIHNheSBhbG1vc3QgYXMgdG9wIGxldmVsIGRlY2xhcmF0aW9ucyAocHJvcGVydGllcyBhbmQgdGFza2RlZnMpIAorZG8gbm90IGdldCBpbnNlcnRlZCBpbnRvIHRoZSBYTUwgZmlsZSBleGFjdGx5IHdoZXJlIHRoZSBpbXBvcnQgc3RhdGVtZW50Citnb2VzLCBidXQgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBpbXBvcnQgcHJvY2VzcwordGFrZXMgcGxhY2UgYWZ0ZXIgdGhlIG1haW4gYnVpbGQgZmlsZSBpcyBwYXJzZWQsIGR1cmluZyBleGVjdXRpb24sIHdoZXJlYXMKK1hNTCBlbnRpdHkgZXhwYW5zaW9uIGlzIGhhbmRsZWQgZHVyaW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuCisKKzxwPgorVGhlIDx0dD4mbHQ7aW1wb3J0Jmd0OzwvdHQ+IHRhc2sgZG9lcyBwb3dlcmZ1bCB0aGluZ3MsIHN1Y2ggYXMgbGV0IHlvdSBvdmVycmlkZSB0YXJnZXRzLAorYW5kIHVzZSBhbnQgcHJvcGVydGllcyB0byBuYW1lIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0byBpbXBvcnQuIENvbnN1bHQgdGhlCis8YSBocmVmPSJtYW51YWwvQ29yZVRhc2tzL2ltcG9ydC5odG1sIj5kb2N1bWVudGF0aW9uPC9hPiBmb3IgdGhlIHNwZWNpZmljcyBvZgordGhlc2UgZmVhdHVyZXMuICAKKworPHA+CitCZWZvcmUgeW91IGdvIG92ZXJib2FyZCB3aXRoIHVzaW5nIFhNTCBpbmNsdXNpb24sIG5vdGUgdGhhdCB0aGUKKzx0dD5hbnQ8L3R0PiB0YXNrIGxldHMgeW91IGNhbGwgYW55IHRhcmdldCBpbiBhbnkgb3RoZXIgYnVpbGQKK2ZpbGUgLSB3aXRoIGFsbCB5b3VyIHByb3BlcnR5IHNldHRpbmdzIHByb3BhZ2F0aW5nIGRvd24gdG8gdGhhdCB0YXJnZXQuCitTbyB5b3UgY2FuIGFjdHVhbGx5IGhhdmUgYSBzdWl0ZSBvZiB1dGlsaXR5IHRhcmdldHMKKy0gIjx0dD5kZXBsb3ktdG8tc3RhY2stYTwvdHQ+IiwgIjx0dD5lbWFpbC10by10ZWFtPC90dD4iLCAiPHR0PmNsZWFudXAtaW5zdGFsbGF0aW9uPC90dD4iIHdoaWNoIGNhbgorYmUgY2FsbGVkIGZyb20gYW55IG9mIHlvdXIgbWFpbiBidWlsZCBmaWxlcywgcGVyaGFwcyB3aXRoIHN1YnRseSBjaGFuZ2VkCitwYXJhbWV0ZXJzLiBJbmRlZWQsIGFmdGVyIGEgY291cGxlIG9mIHByb2plY3RzIHlvdSBtYXkgYmUgYWJsZSB0byBjcmVhdGUKK2EgcmUtdXNhYmxlIGNvcmUgYnVpbGQgZmlsZSB3aGljaCBjb250YWlucyB0aGUgY29yZSB0YXJnZXRzIG9mIGEgYmFzaWMKK0phdmEgZGV2ZWxvcG1lbnQgcHJvamVjdCAtIGNvbXBpbGUsIGRlYnVnLCBkZXBsb3kgLSB3aGljaCBwcm9qZWN0IHNwZWNpZmljCitidWlsZCBmaWxlcyBjYWxsIHdpdGggdGhlaXIgb3duIHNldHRpbmdzLiBJZiB5b3UgY2FuIGFjaGlldmUgdGhpcyB0aGVuCit5b3UgYXJlIGRlZmluaXRlbHkgbWFraW5nIHlvdXIgd2F5IHVwIHRoZSBzb2Z0d2FyZSBtYXR1cml0eSBsYWRkZXIuIFdpdGgKK2EgYml0IG9mIHdvcmsgeW91IG1heSBwcm9ncmVzcyBmcm9tIGJlaW5nIGEgU0VJIENNTSBMZXZlbCAwIG9yZ2FuaXNhdGlvbgorJnF1b3Q7SW5kaXZpZHVhbCBIZXJvaWNzIGFyZSBub3QgZW5vdWdoJnF1b3Q7IHRvIFNFSSBDTU0gTGV2ZWwgMSwgJnF1b3Q7UHJvamVjdHMgb25seQorc3VjY2VlZCBkdWUgdG8gaW5kaXZpZHVhbCBoZXJvaWNzJnF1b3Q7CisKKzxwPgorTkIsIDx0dD5hbnQ8L3R0PiBjb3BpZXMgYWxsIHlvdXIgcHJvcGVydGllcyB1bmxlc3MgdGhlCis8aT5pbmhlcml0YWxsPC9pPiBhdHRyaWJ1dGUgaXMgc2V0IHRvIGZhbHNlLiBCZWZvcmUgdGhhdCBhdHRyaWJ1dGUKK2V4aXN0ZWQgeW91IGhhZCB0byBjYXJlZnVsbHkgbmFtZSBhbGwgcHJvcGVydHkgZGVmaW5pdGlvbnMgaW4gYWxsIGJ1aWxkCitmaWxlcyB0byBwcmV2ZW50IHVuaW50ZW50aW9uYWwgb3ZlcndyaXRpbmcgb2YgdGhlIGludm9rZWQgcHJvcGVydHkgYnkKK3RoYXQgb2YgdGhlIGNhbGxlciwgbm93IHlvdSBqdXN0IGhhdmUgdG8gcmVtZW1iZXIgdG8gc2V0Cis8dHQ+aW5oZXJpdGFsbD0iZmFsc2UiPC90dD4gb24gYWxsIHVzZXMgb2YgdGhlICZsdDthbnQmZ3Q7IHRhc2suCisKKyAgICAKKzxkdD48Yj4KK0ltcGxlbWVudCBjb21wbGV4IEFudCBidWlsZHMgdGhyb3VnaCBYU0wKKzwvYj48ZGQ+CisKK1hTTFQgY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgYnVpbGQueG1sIGZpbGVzIGZyb20gYSBzb3VyY2UKK3htbCBmaWxlLCB3aXRoIHRoZSA8YSBocmVmPSJtYW51YWwvQ29yZVRhc2tzL3N0eWxlLmh0bWwiPnhzbHQ8L2E+IHRhc2sgY29udHJvbGxpbmcKK3RoZSB0cmFuc2Zvcm0uIFRoaXMgaXMgdGhlIGN1cnJlbnQgcmVjb21tZW5kZWQgc3RyYXRlZ3kgZm9yIGNyZWF0aW5nCitjb21wbGV4IGJ1aWxkIGZpbGVzIGR5bmFtaWNhbGx5LiBIb3dldmVyLCBpdHMgdXNlIGlzIHN0aWxsIGFwcGFyZW50bHkKK3F1aXRlIHJhcmUgLSB3aGljaCBtZWFucyB5b3Ugd2lsbCBiZSBvbiB0aGUgYmxlZWRpbmcgZWRnZSBvZiB0ZWNobm9sb2d5LgorCisKKzxkdD48Yj4KK0NoYW5nZSB0aGUgaW52b2NhdGlvbiBzY3JpcHRzCis8L2I+PGRkPgorCitCeSB3cml0aW5nIHlvdXIgb3duIGludm9jYXRpb24gc2NyaXB0IC0gdXNpbmcgdGhlIERPUywgVW5peCBvciBQZXJsCitzY3JpcHQgYXMgYSBzdGFydGluZyBwb2ludCAtIHlvdSBjYW4gbW9kaWZ5IEFudCdzIHNldHRpbmdzIGFuZCBiZWhhdmlvciBmb3IgYW4KK2luZGl2aWR1YWwgcHJvamVjdC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIGFuIGFsdGVybmF0ZSB2YXJpYWJsZSB0bworPHR0PkFOVF9IT01FPC90dD4gYXMgdGhlIGJhc2UsIGV4dGVuZCB0aGUgY2xhc3NwYXRoIGRpZmZlcmVudGx5LCBvciBkeW5hbWljYWxseQorY3JlYXRlIGEgbmV3IGNvbW1hbmQgbGluZSBwcm9wZXJ0eSAmcXVvdDs8dHQ+cHJvamVjdC5pbnRlcmZhY2VzPC90dD4mcXVvdDsgZnJvbSBhbGwgPHR0Pi5qYXI8L3R0PgorZmlsZXMgaW4gYW4gaW50ZXJmYWNlcyBkaXJlY3RvcnkuCisKKzxwPgorSGF2aW5nIGEgY3VzdG9tIGludm9jYXRpb24gc2NyaXB0IHdoaWNoIHJ1bnMgb2ZmIGEgQ1ZTIGNvbnRyb2xsZWQKK2xpYnJhcnkgdHJlZSB1bmRlciA8dHQ+UFJPSkVDVF9IT01FPC90dD4gYWxzbyBsZXRzIHlvdSBjb250cm9sIEFudCB2ZXJzaW9ucworYWNyb3NzIHRoZSB0ZWFtIC0gZGV2ZWxvcGVycyBjYW4gaGF2ZSBvdGhlciBjb3BpZXMgb2YgQW50IGlmIHRoZXkgd2FudCwKK2J1dCB0aGUgQ1ZTIHRyZWUgYWx3YXlzIGNvbnRhaW5zIHRoZSBqYXIgc2V0IHVzZWQgdG8gYnVpbGQgeW91ciBwcm9qZWN0LgorCis8cD4KK1lvdSBjYW4gYWxzbyB3cml0ZSB3cmFwcGVyIHNjcmlwdHMgd2hpY2ggaW52b2tlIHRoZSBleGlzdGluZyBBbnQKK3NjcmlwdHMuIFRoaXMgaXMgYW4gZWFzeSB3YXkgdG8gZXh0ZW5kIHRoZW0uIFRoZSB3cmFwcGVyIHNjcmlwdHMgY2FuIGFkZAorZXh0cmEgZGVmaW5pdGlvbnMgYW5kIG5hbWUgZXhwbGljaXQgdGFyZ2V0cywgcmVkZWZpbmUgPHR0PkFOVF9IT01FPC90dD4gYW5kCitnZW5lcmFsbHkgbWFrZSBkZXZlbG9wbWVudCBlYXNpZXIuIE5vdGUgdGhhdCAmcXVvdDthbnQmcXVvdDsgaW4gV2luZG93cyBpcyByZWFsbHkKKyZxdW90O2FudC5iYXQmcXVvdDssIHNvIHNob3VsZCBiZSBpbnZva2VkIGZyb20gYW5vdGhlciBiYXRjaCBmaWxlIHdpdGggYSAiQ0FMTAorYW50IiBzdGF0ZW1lbnQgLSBvdGhlcndpc2UgaXQgbmV2ZXIgcmV0dXJucyB0byB5b3VyIHdyYXBwZXIuCisKKworPGR0PjxiPgorV3JpdGUgYWxsIGNvZGUgc28gdGhhdCBpdCBjYW4gYmUgY2FsbGVkIGZyb20gQW50Cis8L2I+PGRkPgorVGhpcyBzZWVtcyBhIGJpdCBzdHJhbmdlIGFuZCBpZGVhbGlzdGljLCBidXQgd2hhdCBpdCBtZWFucyBpcyB0aGF0IHlvdSBzaG91bGQKK3dyaXRlIGFsbCB5b3VyIGphdmEgY29kZSBhcyBpZiBpdCBtYXkgYmUgY2FsbGVkIGFzIGEgbGlicmFyeSBhdCBzb21lIHBvaW50IGluCitmdXR1cmUuIFNvIGRvIG5vdCBwbGFjZSBjYWxscyB0byA8dHQ+U3lzdGVtLmV4aXQoKTwvdHQ+IGRlZXAgaW4gdGhlIGNvZGUgLSBpZiB5b3UKK3dhbnQgdG8gZXhpdCBhIGZldyBmdW5jdGlvbnMgaW4sIHJhaXNlIGFuIGV4Y2VwdGlvbiBpbnN0ZWFkIGFuZCBoYXZlCis8dHQ+bWFpbigpPC90dD4gZGVhbCB3aXRoIGl0LgorCis8cD4KK01vdmluZyBvbmUgc3RlcCBmdXJ0aGVyLCBjb25zaWRlciBwcm92aW5nIGFuIEFudCBUYXNrIGludGVyZmFjZSB0byB0aGUKK2NvZGUgYXMgYSBzZWNvbmRhcnksIHByaW1hcnkgb3IgZXZlbiBzb2xlIGludGVyZmFjZSB0byB0aGUKK2Z1bmN0aW9uYWxpdHkuIEFudCBhY3R1YWxseSBtYWtlcyBhIGdyZWF0IGJvb3Rsb2FkZXIgZm9yIEphdmEgYXBwcyBhcyBpdAoraGFuZGxlcyBjbGFzc3BhdGggc2V0dXAsIGFuZCB5b3UgY2FuIHJlLXVzZSBhbGwgdGhlIGJ1aWx0IGluIHRhc2tzIGZvcgorcHJlYW1ibGUgYW5kIHBvc3RhbWJsZSB3b3JrLiBTb21lIHByb2plY3RzLCBzdWNoIGFzIAorPGEgaHJlZj0iaHR0cDovL3hkb2NsZXQuc2YubmV0Ij5YRG9jbGV0PC9hPiBvbmx5IHJ1biB1bmRlciBBbnQsIGJlY2F1c2UKK3RoYXQgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGJlLgorCis8ZHQ+PGI+CitVc2UgdGhlIHJlcGxhY2UgdGFzayB0byBwcm9ncmFtbWF0aWMgbW9kaWZ5IHRleHQgZmlsZXMgaW4geW91ciBwcm9qZWN0LiAgCis8L2I+PGRkPgorSW1hZ2luZSB5b3VyIHByb2plY3QgaGFzIHNvbWUgc291cmNlIGZpbGVzIC0gQkFUIGZpbGVzLCBBU1BYIHBhZ2VzKCEpLCBhbnl0aGluZword2hpY2ggbmVlZHMgdG8gYmUgc3RhdGljYWxseSBjdXN0b21pc2VkIGF0IGNvbXBpbGUgdGltZSBmb3IgcGFydGljdWxhcgoraW5zdGFsbGF0aW9ucywgc3VjaCBkcml2ZW4gZnJvbSBzb21lIHByb3BlcnRpZXMgb2YgdGhlIHByb2plY3Qgc3VjaCBhcyBKVk0gb3B0aW9ucywgb3IgdGhlIFVSTAordG8gZGlyZWN0IGVycm9ycyB0b28uIFRoZSByZXBsYWNlIHRhc2sgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IGZpbGVzLCBzdWJzdGl0dXRpbmcgdGV4dCBhbmQgY3JlYXRpbmcKK3ZlcnNpb25zIGN1c3RvbWlzZWQgZm9yIHRoYXQgYnVpbGQgb3IgZGVzdGluYXRpb24uIE9mIGNvdXJzZSwgcGVyLWRlc3RpbmF0aW9uIGN1c3RvbWlzYXRpb24KK3Nob3VsZCBiZSBkZWxheWVkIHVudGlsIGluc3RhbGxhdGlvbiwgYnV0IGlmIHlvdSBhcmUgdXNpbmcgQW50IGZvciB0aGUgcmVtb3RlIGluc3RhbGxhdGlvbgordGhhdCBzdWRkZW5seSBiZWNvbWVzIGZlYXNpYmxlLiAgICAgCisKKzxkdD48Yj4KK1VzZSB0aGUgbWFpbGluZyBsaXN0cworPC9iPjxkZD4KK1RoZXJlIGFyZSB0d28gCis8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFpbC5odG1sIj5tYWlsaW5nIGxpc3RzPC9hPiAKK3JlbGF0ZWQgdG8gQW50LCB1c2VyIGFuZCBkZXZlbG9wZXIuIEFudCB1c2VyIGlzIHdoZXJlIDxpPmFsbDwvaT4KK3F1ZXN0aW9ucyByZWxhdGVkIHRvIHVzaW5nIEFudCBzaG91bGQgZ28uIEluc3RhbGxhdGlvbiwgc3ludGF4LCBjb2RlCitzYW1wbGVzLCBldGMgLSBwb3N0IHlvdXIgcXVlc3Rpb25zIHRoZXJlIG9yIHNlYXJjaCB0aGUgYXJjaGl2ZXMgZm9yIAord2hldGhlciB0aGUgcXVlcnkgaGFzIGJlZW4gcG9zdGVkIGFuZCBhbnN3ZXJlZCBiZWZvcmUuIEFudC1kZXZlbG9wZXIKK2lzIHdoZXJlIEFudCBkZXZlbG9wbWVudCB0YWtlcyBwbGFjZSAtIHNvIGl0IGlzIDxpPm5vdDwvaT4gdGhlIHBsYWNlIHRvCitwb3N0IHRoaW5ncyBsaWtlICZxdW90O0kgZ2V0IGEgY29tcGlsYXRpb24gZXJyb3Igd2hlbiBJIGJ1aWxkIG15IHByb2plY3QmcXVvdDsgb3IKKyZxdW90O2hvdyBkbyBJIG1ha2UgYSB6aXAgZmlsZSZxdW90Oy4gSWYgeW91IGFyZSBhY3R1YWxseSBleHRlbmRpbmcgQW50LCBvbiB0aGUgb3RoZXIKK2hhbmQsIGl0IGlzIHRoZSBpZGVhbCBwbGFjZSB0byBhc2sgcXVlc3Rpb25zIGFib3V0IGhvdyB0byBhZGQgbmV3IHRhc2tzLCBtYWtlCitjaGFuZ2VzIHRvIGV4aXN0aW5nIG9uZXMgLSBhbmQgdG8gcG9zdCB0aGUgcmVzdWx0cyBvZiB5b3VyIHdvcmssIGlmIHlvdSB3YW50IHRoZW0KK2luY29ycG9yYXRlZCBpbnRvIHRoZSBBbnQgc291cmNlIHRyZWUuICAKKzwvZGw+CisKKzxhIG5hbWU9InB1dHRpbmd0b2dldGhlciI+CisgICAgPGgyPgorICAgICAgICBQdXR0aW5nIGl0IGFsbCB0b2dldGhlcgorICAgIDwvaDI+Cis8L2E+CisKK1doYXQgZG9lcyBhbiBBbnQgYnVpbGQgcHJvY2VzcyBsb29rIGxpa2UgaW4gdGhpcyB3b3JsZD8gQXNzdW1pbmcgYQorc2luZ2xlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIHNpbXBsaWNpdHksIHRoZSBidWlsZCBmaWxlCitzaG91bGQgY29udGFpbiBhIG51bWJlciBvZiB0b3AgbGV2ZWwgdGFyZ2V0cworPHVsPgorPGxpPmJ1aWxkIC0gZG8gYW4gKGluY3JlbWVudGFsKSBidWlsZAorPGxpPnRlc3QgLSBydW4gdGhlIGp1bml0IHRlc3RzCis8bGk+Y2xlYW4gLSBjbGVhbiBvdXQgdGhlIG91dHB1dCBkaXJlY3RvcmllcworPGxpPmRlcGxveSAtIHNoaXAgdGhlIGphcnMsIHdhcnMsIHdoYXRldmVyIHRvIHRoZSBleGVjdXRpb24gc3lzdGVtCis8bGk+cHVibGlzaCAtIG91dHB1dCB0aGUgc291cmNlIGFuZCBiaW5hcmllcyB0byBhbnkgZGlzdHJpYnV0aW9uIHNpdGUKKzxsaT5mZXRjaCAtIGdldCB0aGUgbGF0ZXN0IHNvdXJjZSBmcm9tIHRoZSBjdnMgdHJlZQorPGxpPmRvY3MvamF2YWRvY3MgLSBkbyB0aGUgZG9jdW1lbnRhdGlvbgorPGxpPmFsbCAtIGNsZWFuLCBmZXRjaCwgYnVpbGQsIHRlc3QsIGRvY3MsIGRlcGxveQorPGxpPm1haW4gLSB0aGUgZGVmYXVsdCBidWlsZCBwcm9jZXNzICh1c3VhbGx5IGJ1aWxkIG9yIGJ1aWxkICZhbXA7IHRlc3QpCis8L3VsPgorU3ViIHByb2plY3RzICZxdW90O3dlYiZxdW90OywgJnF1b3Q7YmVhbi0xJnF1b3Q7LCAmcXVvdDtiZWFuLTImcXVvdDsgY2FuIGJlIGdpdmVuIHRoZWlyIG93biBidWlsZAorZmlsZXMgLSA8dHQ+d2ViLnhtbDwvdHQ+LCA8dHQ+YmVhbi0xLnhtbDwvdHQ+LCA8dHQ+YmVhbi0yLnhtbDwvdHQ+IC0gd2l0aCB0aGUgc2FtZSBlbnRyeSBwb2ludHMuCitFeHRyYSB0b3BsZXZlbCB0YXNrcyByZWxhdGVkIHRvIGRhdGFiYXNlcywgd2ViIHNpdGUgaW1hZ2VzIGFuZCB0aGUgbGlrZQorc2hvdWxkIGJlIGNvbnNpZGVyZWQgaWYgdGhleSBhcmUgcGFydCBvZiB0aGUgcHJvY2Vzcy4KKworPHA+CitEZWJ1Zy9yZWxlYXNlIHN3aXRjaGluZyBjYW4gYmUgaGFuZGxlZCB3aXRoIHNlcGFyYXRlIGluaXRpYWxpc2F0aW9uCit0YXJnZXRzIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBpbGUgdGFza3Mgd2hpY2ggZGVmaW5lIHRoZSBhcHByb3ByaWF0ZQorcHJvcGVydGllcy4gQW50Y2FsbCBpcyB0aGUgdHJpY2sgaGVyZSwgYXMgaXQgYWxsb3dzIHlvdSB0byBoYXZlIHR3byBwYXRocworb2YgcHJvcGVydHkgaW5pdGlhbGlzYXRpb24gaW4gYSBidWlsZCBmaWxlLiAgIAorCis8cD4KK0ludGVybmFsIHRhcmdldHMgc2hvdWxkIGJlIHVzZWQgdG8gc3RydWN0dXJlIHRoZSBwcm9jZXNzCis8dWw+Cis8bGk+IGluaXQgLSBpbml0aWFsaXNlIHByb3BlcnRpZXMsIGV4dHJhLXRhc2tzLCByZWFkIGluIHBlci11c2VyCitwcm9wZXJ0eSBmaWxlcy4KKzxsaT4gaW5pdC1yZWxlYXNlIC0gaW5pdGlhbGlzZSByZWxlYXNlIHByb3BlcnRpZXMKKzxsaT4gY29tcGlsZSAtIGRvIHRoZSBhY3R1YWwgY29tcGlsYXRpb24KKzxsaT4gbGluay9qYXIgLSBtYWtlIHRoZSBqYXJzIG9yIGVxdWl2YWxlbnQKKzxsaT4gc3RhZ2luZyAtIGFueSBwcmUtZGVwbG95bWVudCBwcm9jZXNzIGluIHdoaWNoIHRoZSBvdXRwdXQgaXMgZHJvcHBlZAorICAgIG9mZiB0aGVuIHRlc3RlZCBiZWZvcmUgYmVpbmcgbW92ZWQgdG8gdGhlIHByb2R1Y3Rpb24gc2l0ZS4KKzwvdWw+CisKK1RoZSBzd2l0Y2hpbmcgYmV0d2VlbiBkZWJ1ZyBhbmQgcmVsZWFzZSBjYW4gYmUgZG9uZSBieSBtYWtpbmcKK2luaXQtcmVsZWFzZSBjb25kaXRpb25hbCBvbiBhIHByb3BlcnR5LCBzdWNoIGFzIDx0dD5yZWxlYXNlLmJ1aWxkPC90dD4gCitiZWluZyBzZXQgOi0KKworPHByZT4mbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7aW5pdC1yZWxlYXNlJnF1b3Q7IGlmPSZxdW90O3JlbGVhc2UuYnVpbGQmcXVvdDsmZ3Q7CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7YnVpbGQuZGVidWdsZXZlbCZxdW90OyB2YWx1ZT0mcXVvdDtsaW5lcyxzb3VyY2UmcXVvdDsvJmd0OyAgICAKKyAgJmx0Oy90YXJnZXQmZ3Q7Cis8L3ByZT4KKworWW91IHRoZW4gaGF2ZSBkZXBlbmRlbnQgdGFyZ2V0cywgc3VjaCBhcyAmcXVvdDtjb21waWxlJnF1b3Q7LCBkZXBlbmQgb24gdGhpcworY29uZGl0aW9uYWwgdGFyZ2V0OyB0aGVyZSB0aGUgJnF1b3Q7ZGVmYXVsdCZxdW90OyBwcm9wZXJ0aWVzIGFyZSBzZXQsIGFuZCB0aGVuIHRoZQorcHJvcGVydHkgaXMgYWN0dWFsbHkgdXNlZC4gQmVjYXVzZSBBbnQgcHJvcGVydGllcyBhcmUgPGk+aW1tdXRhYmxlPC9pPiwKK2lmIHRoZSByZWxlYXNlIHRhcmdldCB3YXMgZXhlY3V0ZWQgaXRzIHNldHRpbmdzIHdpbGwgb3ZlcnJpZGUgdGhlCitkZWZhdWx0IHZhbHVlczoKKworPHByZT4mbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y29tcGlsZSZxdW90OyBkZXBlbmRzPSZxdW90O2luaXQsaW5pdC1yZWxlYXNlJnF1b3Q7Jmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2J1aWxkLmRlYnVnbGV2ZWwmcXVvdDsgdmFsdWU9JnF1b3Q7bGluZXMsdmFycyxzb3VyY2UmcXVvdDsvJmd0OyAKKyAgICAmbHQ7ZWNobyZndDtkZWJ1ZyBsZXZlbD0ke2J1aWxkLmRlYnVnbGV2ZWx9Jmx0Oy9lY2hvJmd0OworICAgICZsdDtqYXZhYyBkZXN0ZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlcy5kaXJ9JnF1b3Q7CisgICAgICAgZGVidWc9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgIGRlYnVnbGV2ZWw9JnF1b3Q7JHtidWlsZC5kZWJ1Z2xldmVsfSZxdW90OworICAgICAgIGluY2x1ZGVBbnRSdW50aW1lPSZxdW90O2ZhbHNlJnF1b3Q7CisgICAgICAgc3JjZGlyPSZxdW90O3NyYyZxdW90OyZndDsKKyAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9JnF1b3Q7Y29tcGlsZS5jbGFzc3BhdGgmcXVvdDsvJmd0OworICAgICZsdDsvamF2YWMmZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworPC9wcmU+CisKK0FzIGEgcmVzdWx0LCB3ZSBub3cgaGF2ZSBhIGJ1aWxkIHdoZXJlIHRoZSByZWxlYXNlIG1vZGUgb25seSBpbmNsdWRlcwordGhlIGZpbGVuYW1lIGFuZCBsaW5lIGRlYnVnIGluZm9ybWF0aW9uICh1c2VmdWwgZm9yIGJ1ZyByZXBvcnRzKSwgd2hpbGUKK3RoZSBkZXZlbG9wbWVudCBzeXN0ZW0gaW5jbHVkZWQgdmFyaWFibGVzIHRvby4gCis8cD4KK0l0IGlzIHVzZWZ1bCB0byBkZWZpbmUgYSBwcm9qZWN0IG5hbWUgcHJvcGVydHkgd2hpY2ggY2FuIGJlIGVjaG9lZCBpbgordGhlIGluaXQgdGFzay4gVGhpcyBsZXRzIHlvdSB3b3JrIG91dCB3aGljaCBBbnQgZmlsZSBpcyBicmVha2luZyBpbiBhCittdWx0aSBmaWxlIGJ1aWxkLgorCis8cD4KK1doYXQgZ29lcyBpbiB0byB0aGUgaW50ZXJuYWwgQW50IHRhc2tzIGRlcGVuZHMgb24geW91ciBvd24gcHJvamVjdHMuIE9uZQordmVyeSBpbXBvcnRhbnQgdGFjdGljIGlzICZxdW90O2tlZXAgcGF0aCByZWRlZmluaXRpb24gZG93biB0aHJvdWdoCityZWZlcmVuY2VzJnF1b3Q7IC0geW91IGNhbiByZXVzZSBwYXRocyBieSBnaXZpbmcgdGhlbSBhbiBJRCBhbmQgdGhlbgorcmVmZXJyaW5nIHRvIHRoZW0gdmlhIHRoZSAmcXVvdDtyZWZpZCZxdW90OyBhdHRyaWJ1dGUgeW91IHNob3VsZCBvbmx5IG5lZWQgdG8KK2RlZmluZSBhIHNoYXJlZCBjbGFzc3BhdGggb25jZSBpbiB0aGUgZmlsZTsgZmlsZXNldHMgY2FuIGJlIHJldXNlZAorc2ltaWxhcmx5LgorCis8cD4KK09uY2UgeW91IGhhdmUgc2V0IHVwIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlcywgYW5kIGRlZmluZWQgdGhlIEFudCB0YXNrcworaXQgaXMgdGltZSB0byBzdGFydCBjb2RpbmcuIEFuIGVhcmx5IHByaW9yaXR5IG11c3QgYmUgdG8gc2V0IHVwIHRoZQorYXV0b21hdGVkIHRlc3QgcHJvY2VzcywgYXMgdGhhdCBub3Qgb25seSBoZWxwcyBlbnN1cmVzIHRoYXQgdGhlIGNvZGUKK3dvcmtzLCBpdCB2ZXJpZmllcyB0aGF0IHRoZSBidWlsZCBwcm9jZXNzIGlzIHdvcmtpbmcuCisKKzxwPgorQW5kIHRoYXQncyBpdC4gVGhlIGJ1aWxkIGZpbGUgc2hvdWxkbid0IG5lZWQgY2hhbmdpbmcgYXMgbmV3IHNvdXJjZQorZmlsZXMgZ2V0IGFkZGVkLCBvbmx5IHdoZW4geW91IHdhbnQgdG8gY2hhbmdlIHRoZSBkZWxpdmVyYWJsZXMgb3IgcGFydAorb2YgdGhlIGJ1aWxkIHByb2Nlc3MuIEF0IHNvbWUgcG9pbnQgeW91IG1heSB3YW50IHRvIG1hc3NpdmVseQorcmVzdHJ1Y3R1cmUgdGhlIGVudGlyZSBidWlsZCBwcm9jZXNzLCByZXN0cnVjdHVyaW5nIHByb2plY3RzIGFuZCB0aGUKK2xpa2UsIGJ1dCBldmVuIHRoZW4gdGhlIGJ1aWxkIGZpbGUgeW91IGhhdmUgc2hvdWxkIGFjdCBhcyBhIGZvdW5kYXRpb24KK2ZvciBhIHNwbGl0IGJ1aWxkIGZpbGUgcHJvY2VzcyAtanVzdCBwdWxsIG91dCB0aGUgY29tbW9uIHByb3BlcnRpZXMgaW50bworYSBwcm9wZXJ0aWVzIGZpbGUgYWxsIGJ1aWxkIGZpbGVzIHJlYWQgaW4sIGtlZXAgdGhlIHRhcmdldCBuYW1lcyB1bmlmaWVkCithbmQga2VlcCBnb2luZyB3aXRoIHRoZSBwcm9qZWN0LiBSZXN0cnVjdHVyaW5nIHRoZSBzb3VyY2UgY29kZSBjb250cm9sCitzeXN0ZW0gaXMgb2Z0ZW4gbXVjaCBoYXJkZXIgd29yay4KKworPGgyPlRoZSBMaW1pdHMgb2YgQW50PC9oMj4KKworQmVmb3JlIHlvdSBzdGFydCBhZG9wdGluZyBBbnQgYXMgdGhlIHNvbGUgbWVjaGFuaXNtIGZvciB0aGUgYnVpbGQKK3Byb2Nlc3MsIHlvdSBuZWVkIHRvIGJlIGF3YXJlIG9mIHdoYXQgaXQgZG9lc24ndCBkby4KKzxwPgorCis8aDM+SXQncyBub3QgYSBzY3JpcHRpbmcgbGFuZ3VhZ2U8L2gzPgorCitBbnQgbGV0cyB5b3UgZGVjbGFyZSB3aGF0IHlvdSB3YW50IGRvbmUsIHdpdGggYSBiaXQgb2YgdGVzdGluZyBvZiB0aGUKK3BsYXRmb3JtIGFuZCBjbGFzcyBsaWJyYXJpZXMgZmlyc3QgdG8gZW5hYmxlIHNvbWUgcGxhdGZvcm0gc3BlY2lmaWMKK2J1aWxkcyB0byB0YWtlIHBsYWNlLiBJdCBkb2VzIG5vdCBsZXQgeW91IHNwZWNpZnkgaG93IHRvIGhhbmRsZSB0aGluZ3MKK2dvaW5nIHdyb25nIChhIGxpc3RlbmVyIGNsYXNzIGNhbiBkbyB0aGF0KSwgb3Igc3VwcG9ydCBjb21wbGV4Citjb25kaXRpb25hbCBzdGF0ZW1lbnRzLgorCis8cD4KK0lmIHlvdXIgYnVpbGQgbmVlZHMgdG8gaGFuZGxlIGV4Y2VwdGlvbnMgdGhlbiBsb29rIGF0IHRoZSBzb3VuZCBsaXN0ZW5lcgorYXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gd3JpdGUgeW91ciBvd24gbGlzdGVuZXIgY2xhc3MuIENvbXBsZXgKK2NvbmRpdGlvbmFsIHN0YXRlbWVudHMgY2FuIGJlIGhhbmRsZWQgYnkgaGF2aW5nIHNvbWV0aGluZyBlbHNlIGRvIHRoZQordGVzdHMgYW5kIHRoZW4gYnVpbGQgdGhlIGFwcHJvcHJpYXRlIEFudCB0YXNrLiBYU0xUIGNhbiBiZSB1c2VkIGZvcgordGhpcy4KKworPGgzPkl0J3Mgbm90IE1ha2U8L2gzPgorCitTb21lIG9mIHRoZSBmZWF0dXJlcyBvZiBtYWtlLCBzcGVjaWZpY2FsbHkgaW5mZXJlbmNlIHJ1bGVzIGFuZAorZGVwZW5kZW5jeSBjaGVja2luZyBhcmUgbm90IGluY2x1ZGVkIGluIEFudC4gVGhhdCdzIGJlY2F1c2UgdGhleSBhcmUKKyZxdW90O2RpZmZlcmVudCZxdW90OyB3YXlzIG9mIGRvaW5nIGEgYnVpbGQuIE1ha2UgcmVxdWlyZXMgeW91IHRvIHN0YXRlCitkZXBlbmRlbmNpZXMgYW5kIHRoZSBidWlsZCBzdGVwcywgQW50IHdhbnRzIHlvdSB0byBzdGF0ZSB0YXNrcyBhbmQgdGhlCitvcmRlciBiZXR3ZWVuIHRoZW0sIHRoZSB0YXNrcyB0aGVtc2VsdmVzIGNhbiBkbyBkZXBlbmRlbmN5IGNoZWNraW5nIG9yCitub3QuIEEgZnVsbCBqYXZhIGJ1aWxkIHVzaW5nIEppa2VzIGlzIHNvIGZhc3QgdGhhdCBkZXBlbmRlbmN5IGNoZWNraW5nCitpcyByZWxhdGl2ZWx5IG1vb3QsIHdoaWxlIG1hbnkgb2YgdGhlIG90aGVyIHRhc2tzIChidXQgbm90IGFsbCksIGNvbXBhcmUKK3RoZSB0aW1lc3RhbXAgb2YgdGhlIHNvdXJjZSBmaWxlIHdpdGggdGhhdCBvZiB0aGUgZGVzdGluYXRpb24gZmlsZQorYmVmb3JlIGFjdGluZy4KKworPGgzPkl0J3Mgbm90IG1lYW50IHRvIGJlIGEgbmljZSBsYW5ndWFnZSBmb3IgaHVtYW5zPC9oMz4KKworWE1MIGlzbid0IGEgbmljZSByZXByZXNlbnRhdGlvbiBvZiBpbmZvcm1hdGlvbiBmb3IgaHVtYW5zLiBJdCdzIGEKK3JlYXNvbmFibGUgcmVwcmVzZW50YXRpb24gZm9yIHByb2dyYW1zLCBhbmQgdGV4dCBlZGl0b3JzIGFuZCBzb3VyY2UgY29kZQorbWFuYWdlbWVudCBzeXN0ZW1zIGNhbiBhbGwgaGFuZGxlIGl0IG5pY2VseS4gQnV0IGEgY29tcGxleCBBbnQgZmlsZSBjYW4KK2dldCB1Z2x5IGJlY2F1c2UgWE1MIGlzIGEgYml0IHVnbHksIGFuZCBhIGNvbXBsZXggYnVpbGQgaXMsIHdlbGwsCitjb21wbGljYXRlZC4gVXNlIFhNTCBjb21tZW50cyBzbyB0aGF0IHRoZSBmaWxlIHlvdSB3cm90ZSBsYXN0IG1vbnRoCitzdGlsbCBtYWtlcyBzZW5zZSB3aGVuIHlvdSBnZXQgYmFjayB0byBpdCwgYW5kIHVzZSBwcm9wZXIgeG1sIGVkaXRvcnMgdG8gZWRpdCB0aGUKK2ZpbGVzIGlmIHlvdSBwcmVmZXIgaXQuIAorCis8aDM+QmlnIHByb2plY3RzIHN0aWxsIGdldCBjb21wbGljYXRlZCBmYXN0PC9oMz4KKworTGFyZ2Ugc29mdHdhcmUgcHJvamVjdHMgY3JlYXRlIHRoZWlyIG93biBjb21wbGV4aXR5LCB3aXRoIGludGVyLWRlcGVuZGVudAorbGlicmFyaWVzLCBsb25nIHRlc3QgY3ljbGVzLCBoYXJkIGRlcGxveW1lbnQgcHJvY2Vzc2VzIGFuZCBhIG11bHRpdHVkZSBvZgorcGVvcGxlIGVhY2ggd29ya2luZyBvbiB0aGVpciBvd24gYml0IG9mIHRoZSBzb2x1dGlvbi4gVGhhdCdzIGV2ZW4gYmVmb3JlCit0aGUgZGVhZGxpbmVzIGxvb20gY2xvc2UsIHRoZSBpbnRlZ3JhdGlvbiBwcm9ibGVtcyBiZWNvbWUgaW5zdXJtb3VudGFibGUsCit3ZWVrZW5kcyBiZWNvbWUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB3ZWVrZGF5cyBpbiB0ZXJtcyBvZiB3b3JrbG9hZCBhbmQgCitoYWxmIHRoZSB0ZWFtIHN0b3BzIHRhbGtpbmcgdG8gdGhlIG90aGVyIGhhbGYuIEFudCBtYXkgc2ltcGxpZnkgdGhlCitidWlsZCBhbmQgdGVzdCBwcm9jZXNzLCBhbmQgY2FuIGVsaW1pbmF0ZSB0aGUgZnVsbCB0aW1lICZxdW90O21ha2VmaWxlIGVuZ2luZWVyJnF1b3Q7Cityb2xlLCBidXQgdGhhdCBkb2Vzbid0IG1lYW4gdGhhdCBzb21lb25lIGNhbiBzdG9wICZxdW90O293bmluZyB0aGUgYnVpbGQmcXVvdDsuIAorQmVpbmcgaW4gY2hhcmdlIG9mIHRoZSBidWlsZCBoYXMgdG8gbWVhbiBtb3JlIHRoYW4gdGhleSB0eXBlICZxdW90Ozx0dD5hbnQgYWxsPC90dD4mcXVvdDsgb24KK3RoZWlyIHN5c3RlbSwgaXQgbWVhbnMgdGhleSBuZWVkIHRvIHNldCB0aGUgc3RhbmRhcmRzIG9mIHdoYXQgYnVpbGQgdG9vbHMgdG8KK3VzZSwgd2hhdCB0aGUgY29tbW9uIHRhcmdldHMsIHdoYXQgcHJvcGVydHkgbmFtZXMgYW5kIGZpbGVzIHNob3VsZCBiZQorYW5kIGdlbmVyYWxseSBvdmVyc2VlIHRoZSBzdWIgcHJvamVjdHMgYnVpbGQgcHJvY2Vzc2VzLiBPbiBhIHNtYWxsIHByb2plY3QsCit5b3UgZG9uJ3QgbmVlZCB0byBkbyB0aGF0IC0gYnV0IHJlbWVtYmVyOiBzbWFsbCBwcm9qZWN0cyBiZWNvbWUgYmlnIHByb2plY3RzCit3aGVuIHlvdSBhcmVuJ3QgbG9va2luZy4gSWYgeW91IHN0YXJ0IG9mZiB3aXRoIGEgbGl0dGxlIGJpdCBvZiBwcm9jZXNzLCB0aGVuCit5b3UgY2FuIHNjYWxlIGl0IGlmIG5lZWRlZC4gSWYgeW91IHN0YXJ0IHdpdGggbm9uZSwgYnkgdGhlIHRpbWUgeW91IG5lZWQgCitpdCB3aWxsIGJlIHRvbyBsYXRlLiAgIAorCis8aDM+WW91IHN0aWxsIG5lZWQgYWxsIHRoZSBvdGhlciBmb3VuZGF0aW9uYWwgYml0cyBvZiBhIHNvZnR3YXJlCitwcm9qZWN0PC9oMz4KKworSWYgeW91IGRvbid0IGhhdmUgYW4gc291cmNlIGNvZGUgbWFuYWdlbWVudCBzeXN0ZW0sIHlvdSBhcmUgZ29pbmcgdG8gZW5kCit1cCBob3NlZC4gSWYgeW91IGRvbid0IGhhdmUgZXZlcnl0aGluZyB1bmRlciBTQ00sIGluY2x1ZGluZyB3ZWIgcGFnZXMsCitkZXBlbmRlbnQgamFycywgaW5zdGFsbGF0aW9uIGZpbGVzLCB5b3UgYXJlIHN0aWxsIGdvaW5nIHRvIGVuZCB1cCBob3NlZCwKK2l0J3MganVzdCBhIHF1ZXN0aW9uIG9mIHdoZW4gaXQncyBnb2luZyB0byBoYXBwZW4uCitDVlMgaXMgZWZmZWN0aXZlbHkgZnJlZSBhbmQgd29ya3Mgd2VsbCB3aXRoIEFudCwgYnV0IFNvdXJjZXNhZmUsIFBlcmZvcmNlLAorQ2xlYXJjYXNlIGFuZCBTdGFyVGVhbSBhbHNvIGhhdmUgQW50IHRhc2tzLiBUaGVzZSB0YXNrcworbGV0IHlvdSBoYXZlIGF1dG8taW5jcmVtZW50aW5nIGJ1aWxkIGNvdW50ZXJzLCBhbmQgYXV0b21hdGVkIGZpbGUKK3VwZGF0ZSBwcm9jZXNzZXMuIAorCis8cD4KK1lvdSBhbHNvIG5lZWQgc29tZSBraW5kIG9mIGNoYW5nZSBjb250cm9sIHByb2Nlc3MsIHRvIHJlc2lzdAordW5jb250cm9sbGVkIGZlYXR1cmUgY3JlZXAuIEJ1Z3ppbGxhIGlzIGEgc2ltcGxlIGFuZCBsb3cgY29zdCB0b29sIGZvcgordGhpcywgdXNpbmcgQW50IGFuZCBhIGNvbnRpbnVvdXMgdGVzdCBwcm9jZXNzIGVuYWJsZXMgYSByYXBpZCBldm9sdXRpb24gb2YgY29kZQordG8gYWRhcHQgdG8gdGhvc2UgY2hhbmdlcyB3aGljaCBhcmUgaW5ldml0YWJsZS4gIAorCis8aDI+RW5kIHBpZWNlPC9oMj4KKworU29mdHdhcmUgZGV2ZWxvcG1lbnQgaXMgbWVhbnQgdG8gYmUgZnVuLiBCZWluZyBpbiB0aGUgbWFlbHN0cm9tIG9mIGEKK3RpZ2h0IHByb2plY3Qgd2l0aCB0aGUgc3RyZXNzIG9mIGludGVncmF0aW9uIGFuZCB0cnlpbmcgdG8gY29kZQorZXZlcnl0aGluZyB1cCBmb3IgYW4gaW5zYW5lIGRlYWRsaW5lIGNhbiBiZSBmdW4gLSBpdCBpcyBjZXJ0YWlubHkKK2V4aGlsYXJhdGluZy4gQWRkaW5nIGEgYml0IG9mIGF1dG9tYXRpb24gdG8gdGhlIHByb2Nlc3MgbWF5IG1ha2UgdGhpbmdzCitsZXNzIGNoYW90aWMsIGFuZCBiaXQgbGVzcyBlbnRlcnRhaW5pbmcsIGJ1dCBpdCBpcyBhIHN0YXJ0IHRvIHB1dHRpbmcKK3lvdSBpbiBjb250cm9sIG9mIHlvdXIgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gWW91IGNhbiBzdGlsbCBoYXZlIGZ1biwgeW91CitzaG91bGQganVzdCBoYXZlIGxlc3MgdG8gd29ycnkgYWJvdXQsIGEgc2hvcnRlciBidWlsZC90ZXN0L2RlcGxveSBjeWNsZQorYW5kIG1vcmUgdGltZSB0byBzcGVuZCBvbiBmZWF0dXJlIGNyZWVwIG9yIGltcG9ydGFudCB0aGluZ3MgbGlrZSBza2lpbmcuCitTbyBnZXQgb3V0IHRoZXJlIGFuZCBoYXZlIGZ1biEKKworPGEgbmFtZT0icmVhZGluZyI+Cis8aDI+RnVydGhlciBSZWFkaW5nPC9oMj4KKzwvYT4KKzx1bD4KKzxsaT4KKzxhCitocmVmPSJodHRwOi8vd3d3Lm1hcnRpbmZvd2xlci5jb20vYXJ0aWNsZXMvY29udGludW91c0ludGVncmF0aW9uLmh0bWwiPgorPGk+Q29udGludW91cyBJbnRlZ3JhdGlvbjwvaT48L2E+OyBNYXJ0aW4gRm93bGVyLiA8YnI+CitBIHBhcGVyIG9uIHVzaW5nIEFudCB3aXRoaW4gYSBzb2Z0d2FyZSBwcm9qZWN0CitydW5uaW5nIGEgY29udGludW91cyBpbnRlZ3JhdGlvbi90ZXN0aW5nIHByb2Nlc3MuCis8bGk+PGk+IFJlZmFjdG9yaW5nPC9pPjsgTWFydGluIEZvd2xlciwgSVNCTjogMDIwMTQ4NTY3MiA8YnI+CisgICAgQ292ZXJzIEpVbml0IGFzIHdlbGwgYXMgdGFjdGljcyBmb3IgbWFraW5nIHNvbWUgaGVhZHdheSB3aXRoIHRoZSBtZXNzIG9mCisgICAgY29kZSB5b3Ugd2lsbCBzb29uIGhhdmUuCisKKzxsaT48YSBocmVmPSJodHRwOi8vbWFubmluZy5jb20vaGF0Y2hlciI+PGk+SmF2YSBEZXZlbG9wbWVudCB3aXRoCitBbnQ8L2k+PC9hPjsKKyAgICBFcmlrIEhhdGNoZXIgYW5kIFN0ZXZlIExvdWdocmFuLiAKKworICAgIAorPGxpPgorPGEgaHJlZj0iaHR0cDovL3d3dy5pc2VyYW4uY29tL1N0ZXZlL3BhcGVycy93aGVuX3dlYl9zZXJ2aWNlc19nb19iYWQuaHRtbCI+CisgICAgPGk+V2hlbiBXZWIgU2VydmljZXMgR28gQmFkPC9pPjwvYT47IFN0ZXZlIExvdWdocmFuLjxicj4KKyAgICBPbmUgb2YgdGhlIHByb2plY3RzIHRoaXMgcGFwZXIgaXMgYmFzZWQgb24uICAgIAorICAgIAorICAgIAorPC91bD4KKworPGEgbmFtZT0iYXV0aG9yIj4KKzxoMz5BYm91dCB0aGUgQXV0aG9yPC9oMz4KKzwvYT4KKworU3RldmUgTG91Z2hyYW4gaXMgYSByZXNlYXJjaCBzY2llbnRpc3QgYXQgYSBjb3Jwb3JhdGUgUiZhbXA7RCBsYWIsCitjdXJyZW50bHkgb24gYSBzYWJiYXRpY2FsIGJ1aWxkaW5nIHByb2R1Y3Rpb24gd2ViIHNlcnZpY2VzIGFnYWluc3QKK2ltcGxhdXNpYmxlIGRlYWRsaW5lcyBmb3IgdGhlIGZ1biBvZiBpdC4gSGUgaXMgYWxzbyBhIGNvbW1pdHRlciBvbgorQXBhY2hlIEFudCBhbmQgQXBhY2hlIEF4aXMsIGFuZCBjby1hdXRob3Igb2YgCis8YSBocmVmPSJodHRwOi8vbWFubmluZy5jb20vaGF0Y2hlciI+PGk+SmF2YSBEZXZlbG9wbWVudCB3aXRoIEFudDwvaT48L2E+LiAKK0hlIHRoaW5rcyB0aGF0IGlmIHlvdSBsaWtlZCB0aGlzIGRvY3VtZW50IHlvdSdsbCBsb3ZlIHRoYXQgYm9vayBiZWNhdXNlCitpdCBkb2Vzbid0IGp1c3QgZXhwbGFpbiBBbnQsIGl0IGdvZXMgaW50byBwcm9jZXNzZXMsIGRlcGxveW1lbnQgYW5kIGJlc3QgcHJhY3RpY2VzCithbmQgb3RoZXIgY29ybmVycyBvZiBzdHVmZiB0aGF0IHJlYWxseSBtYWtlIEFudCB1c2VmdWwuIChJdCB3b3VsZCAKK2hhdmUgYmVlbiBlYXNpZXIgdG8ganVzdCByZWhhc2ggdGhlIG1hbnVhbCwgYnV0IHRoYXQgd291bGRuJ3QgaGF2ZSBiZWVuCitzbyB1c2VmdWwgb3IgYXMgbXVjaCBmdW4pLiAgCisKKzxwPgorRm9yIHF1ZXN0aW9ucyByZWxhdGVkIHRvIHRoaXMgZG9jdW1lbnQsIHVzZSB0aGUgQW50IG1haWxpbmcgbGlzdC4KKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCBiL3RydW5rL2RvY3MvYW50X3Rhc2tfZ3VpZGVsaW5lcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2EyY2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbApAQCAtMCwwICsxLDUwOCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+PGhlYWQ+Cis8dGl0bGU+CitBcGFjaGUgQW50IFRhc2sgRGVzaWduIEd1aWRlbGluZXMKKzwvdGl0bGU+Cis8L2hlYWQ+PGJvZHk+CisKKzxoMT5BcGFjaGUgQW50IFRhc2sgRGVzaWduIEd1aWRlbGluZXM8L2gxPgorCitUaGlzIGRvY3VtZW50IGNvdmVycyBob3cgdG8gd3JpdGUgQW50IHRhc2tzIHRvIGEgc3RhbmRhcmQgcmVxdWlyZWQgdG8gYmUKK2luY29ycG9yYXRlZCBpbnRvIHRoZSBBbnQgZGlzdHJpYnV0aW9uLiBZb3UgbWF5IGZpbmQgaXQgdXNlZnVsIHdoZW4KK3dyaXRpbmcgdGFza3MgZm9yIHBlcnNvbmFsIHVzZSBhcyB0aGUgaXNzdWVzIGl0IGFkZHJlc3NlcyBhcmUgc3RpbGwKK3RoZXJlIGluIHN1Y2ggYSBjYXNlLgorCis8aDI+RG9uJ3QgYnJlYWsgZXhpc3RpbmcgYnVpbGRzPC9oMj4KKworRXZlbiBpZiB5b3UgZmluZCBzb21lIHJlYWxseSBoaWRlb3VzIHByb2JsZW0gd2l0aCBBbnQsIG9uZSB0aGF0IGlzIGVhc3kgdG8gZml4LAoraWYgeW91ciBmaXggYnJlYWtzIGFuIGV4aXN0aW5nIGJ1aWxkIGZpbGUgdGhlbiB3ZSBoYXZlIHByb2JsZW1zLiBNYWtpbmcgc3VyZQordGhhdCBldmVyeSBidWlsZCBmaWxlIG91dCB0aGVyZSBzdGlsbCB3b3JrcyBpcyBvbmUgb2YgdGhlIGdvYWxzIG9mIGFsbCBjaGFuZ2VzLgorQXMgYW4gZXhhbXBsZSBvZiB0aGlzLCBBbnQgMS41IHBhc3NlcyB0aGUgc2luZ2xlIGRvbGxhciBzaWduICZxdW90OyQmcXVvdDsKK3Rocm91Z2ggaW4gc3RyaW5nczsgQW50IDEuNCBhbmQgYmVmb3JlIHdvdWxkIHN0cmlwIGl0LiBUbyBnZXQgdGhpcyBmaXggaW4gd2UKK2ZpcnN0IGhhZCB0byB3cml0ZSB0aGUgdGVzdCBzdWl0ZSB0byBleHBvc2UgY3VycmVudCBiZWhhdmlvdXIsIHRoZW4gY2hhbmdlCitzb21ldGhpbmcgc28gdGhhdCBzaW5nbGUgJnF1b3Q7JCZxdW90OyB3YXMgcGFzc2VkIHRocm91Z2gsIGJ1dCBkb3VibGUKKyZxdW90OyQkJnF1b3Q7IGdvdCBtYXBwZWQgdG8gJnF1b3Q7JCZxdW90OyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisKKzxoMj5Eb24ndCBicmVhayB0aGUgSmF2YSBBUEk8L2gyPgorCitBbnQncyB0YXNrcyBjYW4gYmUgdXNlZCBieSB0aGlyZCBwYXJ0eSBwcm9ncmFtcyBhbmQgdGFza3MuCitXZSBjYW5ub3QgbWFrZSBjaGFuZ2VzIHRoYXQgYnJlYWsgdGhlIEFQSS4gVGhpcyBpbmNsdWRlczoKKzxvbD4KKzxsaT5Nb3ZpbmcgY2xhc3NlcyB3aXRob3V0IGxlYXZpbmcgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSBmYWNhZGUuCis8bGk+RGVsZXRpbmcgY2xhc3Nlcy4KKzxsaT5EZWxldGluZyBtZXRob2RzIG9yIGZpZWxkcywgb3IgcmVkdWNpbmcgdGhlaXIgYWNjZXNzaWJpbGl0eS4KKzxsaT5DaGFuZ2luZyB0aGUgc2lnbmF0dXJlIG9mIGEgPHR0PnNldEF0dHJpYnV0ZShUeXBlKTwvdHQ+IG1ldGhvZC4gSWYgeW91IG5lZWQKK3RvIGFkZCBhIHJlc3RyaWN0aXZlIHR5cGUsIGFkZCBhIG5ldyBhdHRyaWJ1dGUsIGFuZCBwbGFjZSBpdCBpbiB0aGUgc291cmNlCis8aT5hYm92ZTwvaT4gdGhlIG9yaWdpbmFsLiBUaGUgWE1MIG1hcHBlciB3aWxsIGdldCB0aGUgcmVzdHJpY3RlZCB0eXBlLCBvbGQgcHJvZ3JhbXMKK2NhbiBzdGlsbCB1c2UgdGhlIG9sZCB0eXBlLgorPGxpPkRvbid0IGNoYW5nZSBzZW1hbnRpY3MuIEF0IGxlYXN0LCBub3QgZHJhc3RpY2FsbHkuIEFsbCBidWcgZml4ZXMgYXJlCitpbXBsaWNpdCBjaGFuZ2VzIG9mIHNlbWFudGljcywgYWZ0ZXIgYWxsLgorPC9vbD4KKworPGgyPlVzZSBidWlsdCBpbiBoZWxwZXIgY2xhc3NlczwvaDI+CisKK0FudCBpbmNsdWRlcyBoZWxwZXIgdGFza3MgdG8gc2ltcGxpZnkgbXVjaCBvZiB5b3VyIHdvcmsuIEl0IGlzIG11Y2ggYmV0dGVyIHRvCit1c2UgdGhlbSB0aGFuIHJvbGwgeW91ciBvd24sIGZvciBkZXZlbG9wbWVudCwgbWFpbnRlbmFuY2UgYW5kIGNvZGUgc2l6ZSByZWFzb25zLgorCis8aDQ+RXhlY3V0ZTwvaDQ+CisKK0V4ZWN1dGUgd2lsbCBzcGF3biBvZmYgc2VwYXJhdGUgcHJvZ3JhbXMgdW5kZXIgYWxsIHRoZSBwbGF0Zm9ybXMgd2hpY2gKK0FudCBzdXBwb3J0cywgZGVhbGluZyB3aXRoIEphdmEgdmVyc2lvbiBpc3N1ZXMgYXMgd2VsbCBhcyBwbGF0Zm9ybQoraXNzdWVzLiBBbHdheXMgdXNlIHRoaXMgY2xhc3MgdG8gaW52b2tlIG90aGVyIHByb2dyYW1zLgorCis8aDQ+SmF2YSwgRXhlY3V0ZUphdmE8L2g0PgorCitUaGVzZSBjbGFzc2VzIGNhbiBiZSB1c2VkIHRvIHNwYXduIEphdmEgcHJvZ3JhbXMgaW4gYSBzZXBhcmF0ZSBWTSAodGhleQordXNlIGV4ZWN1dGUpIG9yIGluIHRoZSBzYW1lIFZNLS13aXRoIG9yIHdpdGhvdXQgYSBkaWZmZXJlbnQgY2xhc3Nsb2FkZXIuCitXaGVuIGRlcml2aW5nIHRhc2tzIGZyb20gdGhpcywgaXQgb2Z0ZW4gYmVuZWZpdHMgdXNlcnMgdG8gcGVybWl0IHRoZQorY2xhc3NwYXRoIHRvIGJlIHNwZWNpZmllZCwgYW5kIGZvciBmb3JraW5nIHRvIGJlIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZS4KKworPGg0PlByb2plY3QgYW5kIHJlbGF0ZWQgY2xhc3NlczwvaDQ+CisKK1Byb2plY3QsIEZpbGVVdGlscywgSmF2YUVudlV0aWxzIGFsbCBoYXZlIGhlbHBlciBmdW5jdGlvbnMgdG8gZG8gdGhpbmdzIGxpa2UKK3RvdWNoIGEgZmlsZSwgY29weSBhIGZpbGUgYW5kIHRoZSBsaWtlLiBVc2UgdGhlc2UgaW5zdGVhZCBvZiBjb2RpbmcgdGhlbQoreW91cnNlbGYgb3IgdHJ5aW5nIHRvIHVzZSB0YXNrcyB3aGljaCBtYXkgYmUgbGVzcyBzdGFibGUgYW5kIGZpZGRsaWVyIHRvIHVzZS4KKworPGgyPk9iZXkgdGhlIFN1bi9KYXZhIHN0eWxlIGd1aWRlbGluZXM8L2gyPgorCitUaGUgQW50IGNvZGViYXNlIGFpbXMgdG8gaGF2ZSBhIHNpbmdsZSB1bmlmaWVkIGNvZGluZyBzdGFuZGFyZCwgYW5kIHRoYXQKK3N0YW5kYXJkIGlzIHRoZQorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252L2h0bWwvQ29kZUNvbnZUT0MuZG9jLmh0bWwiPgorU3VuIEphdmEgY29kaW5nIGd1aWRlbGluZXMKKzwvYT4KKzxwPgorCitJdCdzIG5vdCB0aGF0IHRoZXkgYXJlIGJldHRlciB0aGFuIGFueSBhbHRlcm5hdGl2ZXMsIGJ1dCB0aGV5IGFyZSBhCitzdGFuZGFyZCBhbmQgdGhleSBhcmUgd2hhdCBpcyBjb25zaXN0ZW50bHkgdXNlZCBpbiB0aGUgcmVzdCBvZiB0aGUKK3Rhc2tzLiBDb2RlIHdpbGwgbm90IGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBkYXRhYmFzZSB1bnRpbCBpdCBjb21wbGllcword2l0aCB0aGVzZS4KKworPHA+CisKK0lmIHlvdSBhcmUgd3JpdGluZyBhIHRhc2sgZm9yIHlvdXIgcGVyc29uYWwgb3Igb3JnYW5pc2F0aW9uYWwgdXNlLCB5b3UKK2FyZSBmcmVlIHRvIHVzZSB3aGF0ZXZlciBzdHlsZSB5b3UgbGlrZS4gQnV0IHVzaW5nIHRoZSBTdW4gSmF2YSBzdHlsZQord2lsbCBoZWxwIHlvdSB0byBiZWNvbWUgY29tZm9ydGFibGUgd2l0aCB0aGUgcmVzdCBvZiB0aGUgQW50IHNvdXJjZSwKK3doaWNoIG1heSBiZSBpbXBvcnRhbnQuCisKKzxwPgorCitPbmUgaW1wb3J0YW50IHJ1bGUgaXMgJ25vIHRhYnMnLiBVc2UgZm91ciBzcGFjZXMgaW5zdGVhZC4gTm90IHR3bywKK25vdCBlaWdodCwgZm91ci4gRXZlbiBpZiB5b3VyIGVkaXRvciBpcyBjb25maWd1cmVkIHRvIGhhdmUgYSB0YWIgb2YgZm91cgorc3BhY2VzLCBsb3RzIG9mIG90aGVycyBhcmVuJ3QuIFNwYWNlcyBoYXZlIG1vcmUgY29uc2lzdGVuY3kgYWNyb3NzCitlZGl0b3JzIGFuZCBwbGF0Zm9ybXMuIFNvbWUgSURFcyAoSkVkaXQpIGNhbiBoaWdobGlnaHQgdGFicywgdG8gc3RvcCB5b3UKK2FjY2lkZW50YWxseSBpbnNlcnRpbmcgdGhlbS4KKzxwPgorVGhlcmUgaXMgYW4gQW50IGJ1aWxkIGZpbGUgY2hlY2sueG1sIGluIHRoZSBtYWluIGFudCBkaXJlY3Rvcnkgd2l0aCBydW5zIAorICA8YSBocmVmPSJodHRwOi8vY2hlY2tzdHlsZS5zb3VyY2Vmb3JnZS5uZXQiPmNoZWNrc3R5bGU8L2E+IG92ZXIKKyAgQW50J3Mgc291cmNlIGNvZGUuCisKKzxoMj5BdHRyaWJ1dGVzIGFuZCBlbGVtZW50czwvaDI+CitVc2UgdGhlIEFudCBpbnRyb3NwZWN0aW9uLWJhc2VkIG1hcHBpbmcgb2YgYXR0cmlidXRlcyBpbnRvIEphdmEgZGF0YXR5cGVzLAorcmF0aGVyIHRoYW4gaW1wbGVtZW50aW5nIGFsbCB5b3VyIGF0dHJpYnV0ZXMgYXMgc2V0Rm9vKFN0cmluZykgYW5kIGRvaW5nCit0aGUgbWFwcGluZyB0byBpbnQsIGJvb2xlYW4gb3IgRmlsZSB5b3Vyc2VsZi4gVGhpcyBzYXZlcyB3b3JrIG9uIHlvdXIgcGFydCwKK2xldHMgSmF2YSBjYWxsZXJzIHVzZSB5b3UgaW4gYSB0eXBlc2FmZSBtYW5uZXIsIGFuZCB3aWxsIGxldCB0aGUgWGRvY3MKK2RvY3VtZW50YXRpb24gZ2VuZXJhdG9yIHdvcmsgb3V0IHdoYXQgdGhlIHBhcmFtZXRlcnMgYXJlLgorCis8cD4KK1RoZSBBbnQgMS54IHRhc2tzIGFyZSB2ZXJ5IGluY29uc2lzdGVudCByZWdhcmRpbmcgbmFtaW5nIG9mIGF0dHJpYnV0ZXMtLXNvbWUKK3Rhc2tzIHVzZSA8dHQ+c291cmNlPC90dD4sIG90aGVycyA8dHQ+c3JjPC90dD4uCitIZXJlIGlzIGEgbGlzdCBvZiBwcmVmZXJyZWQgYXR0cmlidXRlIG5hbWVzOgorPHA+Cis8dGFibGUgY2VsbHBhZGRpbmc9IjUiPgorPHRyPgorPHRkPgorICAgIGZhaWxvbmVycm9yCis8L3RkPgorPHRkPgorICAgIGJvb2xlYW4gdG8gY29udHJvbCB3aGV0aGVyIGZhaWx1cmUgdG8gZXhlY3V0ZSBzaG91bGQgdGhyb3cgYQorICAgIDx0dD5CdWlsZEV4Y2VwdGlvbjwvdHQ+IG9yIGp1c3QgcHJpbnQgYW4gZXJyb3IuCisgICAgUGFyYW1ldGVyIHZhbGlkYXRpb24gZmFpbHVyZXMgc2hvdWxkIGFsd2F5cyB0aHJvdyBhbiBlcnJvciwgcmVnYXJkbGVzcworICAgIG9mIHRoaXMgZmxhZy4KKzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPgorICAgIGRlc3RkaXIKKzwvdGQ+Cis8dGQ+CisgICAgZGVzdGluYXRpb24gZGlyZWN0b3J5IGZvciBvdXRwdXQKKzwvdGQ+Cis8L3RyPgorPHRyPiAgICAKKzx0ZD4KKyAgICBkZXN0ZmlsZQorPC90ZD4KKzx0ZD4KKyAgICBkZXN0aW5hdGlvbiBmaWxlIGZvciBvdXRwdXQKKzwvdGQ+Cis8L3RyPgorPHRyPgorPHRkPgorICAgIHNyY2RpcgorPC90ZD4KKzx0ZD4KKyAgICBzb3VyY2UgZGlyZWN0b3J5Cis8L3RkPgorPC90cj4KKzx0cj4KKzx0ZD4KKyAgICBzcmNmaWxlCis8L3RkPgorPHRkPgorICAgIHNvdXJjZSBmaWxlCis8L3RkPgorPC90cj4KKzwvdGFibGU+Cis8cD4KK1llcywgdGhpcyBpcyBhIHZlcnkgc2hvcnQgbGlzdC4gVHJ5IGFuZCBiZSB2YWd1ZWx5IGNvbnNpc3RlbnQgd2l0aCB0aGUgY29yZQordGFza3MsIGF0IHRoZSB2ZXJ5IGxlYXN0LgorCis8aDI+U3VwcG9ydCBjbGFzc3BhdGhzPC9oMj4KKworVHJ5IGFuZCBtYWtlIGl0IHBvc3NpYmxlIGZvciBwZW9wbGUgdG8gc3VwcGx5IGEgY2xhc3NwYXRoIHRvIHlvdXIgdGFzaywKK2lmIHlvdSBuZWVkIGV4dGVybmFsIGxpYnJhcmllcywgcmF0aGVyIHRoYW4gbWFrZSB0aGVtIGFkZCBldmVyeXRoaW5nIHRvCit0aGUgQU5UX0hPTUUvbGliIGRpcmVjdG9yeS4gVGhpcyBsZXRzIHBlb3BsZSBrZWVwIHRoZSBleHRlcm5hbCBsaWJyYXJpZXMKK2luIHRoZWlyIEFudC1iYXNlZCBwcm9qZWN0LCByYXRoZXIgdGhhbiBmb3JjZSBhbGwgdXNlcnMgdG8gbWFrZSBjaGFuZ2VzCit0byB0aGVpciBBbnQgc3lzdGVtIGNvbmZpZ3VyYXRpb24uCisKKzxoMj5EZXNpZ24gZm9yIGNvbnRyb2xsZWQgcmUtdXNlPC9oMj4KKworS2VlcCBtZW1iZXIgdmFyaWFibGVzIHByaXZhdGUuIElmIHJlYWQgYWNjZXNzIGJ5IHN1YmNsYXNzZXMgaXMgcmVxdWlyZWQsCithZGQgYWNjZXNzb3IgbWV0aG9kcyByYXRoZXIgdGhhbiBjaGFuZ2UgdGhlIGFjY2Vzc2libGl0eSBvZiB0aGUgbWVtYmVyLgorVGhpcyBlbmFibGVzIHN1YmNsYXNzZXMgdG8gYWNjZXNzIHRoZSBjb250ZW50cywgeWV0IHN0aWxsIGJlIGRlY291cGxlZCAKK2Zyb20gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4KKzxwPgorCitUaGUgb3RoZXIgY29tbW9uIHJlLXVzZSBtZWNoYW5pc20gaW4gQW50IGlzIGZvciBvbmUgdGFzayB0byBjcmVhdGUgYW5kCitjb25maWd1cmUgYW5vdGhlci4gVGhpcyBpcyBmYWlybHkgc2ltcGxlLiBUaGVyZSBhcmUgZmFjaWxpdGllcyBhdmFpbGFibGUgaW4KK0FudCdzIEFQSSB0byBoYXZlIHRoZSB0YXNrcyBpbnN0YW50aWF0ZWQgYnkgdGhlaXIgZmFtaWxpYXIgbmFtZXMKKygmcXVvdDtqYXZhJnF1b3Q7LCAmcXVvdDtleGVjJnF1b3Q7LCBldGMuKS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UKKzxiPm5vdDwvYj4gdXNlIHRoaXMgYXBwcm9hY2ggYmVjYXVzZSBvZiB0aGUgZW50aXJlbHkgcmVhbCBwb3NzaWJpbGl0eSB0aGF0IGEKK3VzZXIgaGFzIG92ZXJyaWRkZW4gdGhlIG5hbWUgdG8gcG9pbnQgdG8gYSBkaWZmZXJlbnQgY2xhc3MgZW50aXJlbHkuIFVzZSBkaXJlY3QKK2NvbnN0cnVjdG9yIGNhbGxzIChvciByZWZsZWN0aW9uKSB0byBpbnN0YW50aWF0ZSB5b3VyIHN1YnRhc2suIFNpbmNlIEFudCAxLjYuMywKK3lvdSBjYW4gY2FsbCA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2JpbmRUb093bmVyKCk8L2NvZGU+Cit0byAmcXVvdDttYXNrJnF1b3Q7IGEgaGVscGVyIHRhc2sgYXMgaXRzIHBhcmVudC4KKworPGgyPkRvIHlvdXIgb3duIERlcGVuZGVuY3kgQ2hlY2tpbmc8L2gyPgorCitNYWtlIGhhcyB0aGUgZWRnZSBvdmVyIEFudCBpbiBpdHMgaW50ZWdyYXRlZCBkZXBlbmRlbmN5IGNoZWNraW5nOyB0aGUKK2NvbW1hbmQgbGluZSBhcHBzIG1ha2UgaW52b2tlcyBkb24ndCBuZWVkIHRvIGRvIHRoZWlyIG93biB3b3JrLiBBbnQgdGFza3MKK2RvIGhhdmUgdG8gZG8gdGhlaXIgb3duIGRlcGVuZGVuY3kgd29yaywgYnV0IGlmIHRoaXMgY2FuIGJlIGRvbmUgdGhlbgoraXQgY2FuIGJlIGRvbmUgd2VsbC4gQSBnb29kIGRlcGVuZGVuY3ktYXdhcmUgdGFzayBjYW4gd29yayBvdXQgdGhlIGRlcGVuZGVuY2llcword2l0aG91dCBleHBsaWNpdCBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGluIHRoZSBidWlsZCBmaWxlLCBhbmQgYmUgc21hcnQKK2Vub3VnaCB0byB3b3JrIG91dCB0aGUgcmVhbCBkZXBlbmRlbmNpZXMsIHBlcmhhcHMgdGhyb3VnaCBhIGJpdCBvZiBmaWxlIHBhcnNpbmcuCitUaGUgPHR0PmRlcGVuZHM8L3R0PiB0YXNrIGlzIHRoZSBiZXN0IGV4YW1wbGUgb2YgdGhpcy4gU29tZSBvZiB0aGUgemlwL2phcgordGFza3MgYXJlIHByZXR0eSBnb29kIHRvbywgYXMgdGhleSBjYW4gdXBkYXRlIHRoZSBhcmNoaXZlIHdoZW4gbmVlZGVkLgorTW9zdCB0YXNrcyBqdXN0IGNvbXBhcmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0aW1lc3RhbXBzIGFuZCB3b3JrIGZyb20gdGhlcmUuCitUYXNrcyB3aGljaCBkb24ndCBkbyBhbnkgZGVwZW5kZW5jeSBjaGVja2luZyBkbyBub3QgaGVscCB1c2VycyBhcyBtdWNoIGFzCit0aGV5IGNhbiwgYmVjYXVzZSB0aGVpciBuZWVkbGVzcyB3b3JrIGNhbiB0cmlja2xlIHRocm91Z2ggdGhlIGVudGlyZSBidWlsZCwgdGVzdAorYW5kIGRlcGxveSBwcm9jZXNzLgorCis8aDI+U3VwcG9ydCBKYXZhIDEuMiB0aHJvdWdoIEphdmEgMS41KzwvaDI+CisKK0FudCAxLjUgYW5kIGxvd2VyIHdhcyBkZXNpZ25lZCB0byBzdXBwb3J0IEphdmEgMS4xLiBBbnQgMS42IGFuZCBoaWdoZXIKK2lzIGRlc2lnbmVkIHRvIHN1cHBvcnQgSmF2YSAxLjI6IHRvIGJ1aWxkIG9uIGl0LCB0byBydW4gb24gaXQuIFNvbWV0aW1lcworZnVuY3Rpb25hbGl0eSBvZiB0YXNrcyBoYXZlIHRvIGRlZ3JhZGUgaW4gdGhhdCBlbnZpcm9ubWVudC0tdXN1YWxseSBkdWUgdG8KK2xpYnJhcnkgbGltaXRhdGlvbnM7IHN1Y2ggYmVoYXZpb3VyIGNoYW5nZSBtdXN0IGFsd2F5cyBiZSBub3RlZCBpbiB0aGUKK2RvY3VtZW50YXRpb24uCis8cD4KK1doYXQgaXMgcHJvYmxlbWF0aWMgaXMgY29kZSB3aGljaCBpcyBkZXBlbmRlbnQgb24gSmF2YSAxLjMgZmVhdHVyZXM7CitlLmcuIGphdmEubGFuZy5yZWZsZWN0LlByb3h5LCBvciBKYXZhIDEuNCBmZWF0dXJlczsgZS5nLiBqYXZhLmlvLm5pby4KK0JlIGFsc28gYXdhcmUgb2YgZXh0cmEgbWV0aG9kcyBpbiBvbGRlciBjbGFzc2VzOworZS5nLiBTdHJpbmdCdWZmZXIjYXBwZW5kKFN0cmluZ0J1ZmZlcikuIFRoZXNlIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5CitieSBhbnkgY29kZSBhbmQgc3RpbGwgYmUgYWJsZSB0byBjb21waWxlIGFuZCBydW4gb24gYSBKYXZhIDEuMiBzeXN0ZW0uCitJZiBhIG5ldyBtZXRob2QgaW4gYW4gZXhpc3RpbmcgY2xhc3MgaXMgdG8gYmUgdXNlZCwgaXQgbXVzdCBiZSB1c2VkIHZpYQorcmVmbGVjdGlvbiBhbmQgdGhlIDx0dD5Ob1N1Y2hNZXRob2RFeGNlcHRpb248L3R0PiBoYW5kbGVkIHNvbWVob3cuCis8cD4KK1doYXQgaWYgY29kZSBzaW1wbHkgZG9lcyBub3Qgd29yayBvbiBKYXZhIDEuMj8gSXQgY2FuIGhhcHBlbi4gSXQgd2lsbAorcHJvYmFibHkgYmUgT0sgdG8gaGF2ZSB0aGUgdGFzayBhcyBhbiBvcHRpb25hbCB0YXNrLCB3aXRoIGNvbXBpbGF0aW9uCityZXN0cmljdGVkIHRvIEphdmEgMS4zIG9yIGxhdGVyIHRocm91Z2ggYnVpbGQueG1sIG1vZGlmaWNhdGlvbnMuCitCZXR0ZXIgc3RpbGwsIHVzZSByZWZsZWN0aW9uIHRvIGxpbmsgdG8gdGhlIGNsYXNzZXMgYXQgcnVuIHRpbWUuCis8cD4KK0phdmEgMS40IGFkZHMgYSBuZXcgb3B0aW9uYWwgY2hhbmdlIHRvIHRoZSBsYW5ndWFnZSBpdHNlbGYsIHRoZQorPHR0PmFzc2VydDwvdHQ+IGtleXdvcmQsIHdoaWNoIGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgY29tcGlsZXIgaXMgdG9sZAordG8gY29tcGlsZSAxLjQgdmVyc2lvbiBzb3VyY2UuIENsZWFybHkgd2l0aCB0aGUgMS4yIGNvbXBhdGliaWxpdHkgcmVxdWlyZW1lbnQsCitBbnQgdGFza3MgY2Fubm90IHVzZSB0aGlzIGtleXdvcmQuIFRoZXkgYWxzbyBuZWVkIHRvIG1vdmUgYXdheSBmcm9tCit1c2luZyB0aGUgSlVuaXQgPHR0PmFzc2VydCgpPC90dD4gbWV0aG9kIGFuZCBjYWxsIDx0dD5hc3NlcnRUcnVlKCk8L3R0PgoraW5zdGVhZC4KKzxwPgorSmF2YSAxLjUgYWRkcyB0aGUgPHR0PmVudW08L3R0PiB0eXBlOyBhZ2FpbiwgdGhpcyBtdXN0IG5vdCBiZSB1c2VkLgorCis8aDI+RXhwbGljaXRseSBFeHBhbmQgcHJvcGVydGllcyBpbiBuZXN0ZWQgdGV4dDwvaDI+CisKK0ZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIDx0dD5hZGRUZXh0KFN0cmluZyB0ZXh0KTwvdHQ+IGlzIGNhbGxlZCB0bworc2V0IHRoZSB0YXNrJ3MgbmVzdGVkIHRleHQsIHdpdGhvdXQgYW55IHByb3BlcnR5IGV4cGFuc2lvbiB0YWtpbmcgcGxhY2UuCitDYWxsIDx0dD5Qcm9qZWN0LnJlcGxhY2VQcm9wZXJ0aWVzKCk8L3R0PiB0byBkbyB0aGlzIG1hbnVhbGx5LgorSWYgeW91IGZvcmdldCwgeW91IGNyZWF0ZSBhIHByb2JsZW0gdGhhdCBpcyBpbXBvc3NpYmxlIHRvIGZpeAord2l0aG91dCBicmVha2luZyB1c2VycycgYnVpbGQgZmlsZXMuCisKKzxoMj5SZWZhY3RvcjwvaDI+CisKK0lmIHRoZSBjaGFuZ2VzIG1hZGUgdG8gYSB0YXNrIGFyZSBtYWtpbmcgaXQgdG9vIHVud2llbGR5LCBzcGxpdCBpdCB1cAoraW50byBhIGNsZWFuZXIgZGVzaWduLCByZWZhY3RvciB0aGUgY29kZSBhbmQgc3VibWl0IG5vdCBqdXN0IGZlYXR1cmUKK2NyZWVwIGJ1dCBjbGVhbmVyIHRhc2tzLiBBIGNvbW1vbiBkZXNpZ24gcGF0dGVybiB3aGljaCB0ZW5kcyB0byBvY2N1ciBpbgordGhlIEFudCBwcm9jZXNzIGlzIHRoZSBhZG9wdGlvbiBvZiB0aGUgYWRhcHRlciBwYXR0ZXJuLCBpbiB3aGljaCBhIGJhc2UKK2NsYXNzIChzYXkgSmF2YWMgb3IgUm1pYykgc3RhcnRzIG9mZiBzaW1wbHksIHRoZW4gZ2V0cyBjb252b2x1dGVkIHdpdGgKK3N1cHBvcnQgZm9yIG11bHRpcGxlIGJhY2sgZW5kczogIGphdmFjLCBqaWtlcywganZjLiBBIHJlZmFjdG9yaW5nIHRvCitzcGxpdCB0aGUgcHJvZ3JhbW1hYmxlIGZyb250IGVuZCBmcm9tIHRoZSBjbGFzc2VzIHdoaWNoIHByb3ZpZGUgdGhlIGJhY2sKK2VuZCBjbGVhbnMgdXAgdGhlIGRlc2lnbiBhbmQgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gYWRkIG5ldyBiYWNrIGVuZHMuCitCdXQgdG8gY2FycnkgdGhpcyBvZmYgb25lIG5lZWRzIHRvIGtlZXAgdGhlIGludGVyZmFjZSBhbmQgYmVoYXZpb3VyIG9mCit0aGUgZnJvbnQgZW5kIGlkZW50aWNhbCwgYW5kIHRvIGJlIHN1cmUgdGhhdCBubyBzdWJjbGFzc2VzIGhhdmUgYmVlbgorYWNjZXNzaW5nIGRhdGEgbWVtYmVycyBkaXJlY3RseSwgYmVjYXVzZSB0aGVzZSBkYXRhIG1lbWJlcnMgbWF5IG5vdAorZXhpc3QgaW4gdGhlIHJlZmFjdG9yZWQgZGVzaWduLiBUaGlzIGlzIHdoeSBoYXZpbmcgcHJpdmF0ZSBkYXRhIG1lbWJlcnMKK2lzIHNvIGltcG9ydGFudC4KKworPHA+CisKK09uZSB0aGluZyB3ZSBtdXN0IG5vdCBkbyBpcyBtb3ZlIGV4aXN0aW5nIHRhc2tzIGFyb3VuZCBvciBkZWxldGUgdGhlbS4KK1JlbWVtYmVyIHRoYXQgQW50IGhhcyBhIEphdmEgQVBJIGFzIHdlbGwgYXMgYW4gWE1MIGxhbmd1YWdlLiBXZSBkb24ndCB3YW50Cit0byBicmVhayB0aGF0IEFQSSwgb3IgYW55dGhpbmcgdGhhdCBzdWJjbGFzc2VzIGV4aXN0aW5nIEFudCB0YXNrcy4gV2hlbgorcmVmYWN0b3JpbmcsIHlvdSBuZWVkIHRvIGxlYXZlIGZhY2FkZXMgd2hlcmUgdGhlIG9yaWdpbmFsIGNsYXNzZXMgd2VyZS4gc28KK2V4aXN0aW5nIGNvZGUgZG9lcyBub3QgYnJlYWsuCisKKzxoMj5UZXN0PC9oMj4KKworTG9vayBpbiA8dHQ+YW50L3NyYy90ZXN0Y2FzZXM8L3R0PiBhbmQgeW91IHdpbGwgZmluZCBKVW5pdCB0ZXN0cyBmb3IgdGhlCitzaGlwcGluZyBBbnQgdGFza3MsIHRvIHNlZSBob3cgaXQgaXMgZG9uZSBhbmQgd2hhdCBpcyBleHBlY3RlZCBvZiBhIG5ldwordGFzay4gTW9zdCBvZiB0aGVtIGFyZSBydWRpbWVudGFyeSwgYW5kIG5vIGRvdWJ0IHlvdSBjb3VsZCBkbyBiZXR0ZXIgZm9yCit5b3VyIHRhc2stLWZlZWwgZnJlZSB0byBkbyBzbyEKKworPHA+CisKK0Egd2VsbCB3cml0dGVuIHNldCBvZiB0ZXN0IGNhc2VzIHdpbGwgYnJlYWsgdGhlIEFudCB0YXNrIHdoaWxlIGl0IGlzIGluCitkZXZlbG9wbWVudCwgdW50aWwgdGhlIGNvZGUgaXMgYWN0dWFsbHkgY29tcGxldGUuIEFuZCBldmVyeSBidWcgd2hpY2gKK3N1cmZhY2VzIGxhdGVyIHNob3VsZCBoYXZlIGEgdGVzdCBjYXNlIGFkZGVkIHRvIGRlbW9uc3RyYXRlIHRoZSBwcm9ibGVtLAorYW5kIHRvIGZpeCBpdC4KKworPHA+CisKK1RoZSB0ZXN0IGNhc2VzIGFyZSBhIGdyZWF0IHdheSBvZiB0ZXN0aW5nIHlvdXIgdGFzayBkdXJpbmcgZGV2ZWxvcG1lbnQuCitBIHNpbXBsZSBjYWxsIHRvICdidWlsZCBydW4tdGVzdCcgaW4gdGhlIGFudCBzb3VyY2UgdHJlZSB3aWxsIHJ1biBhbGwgYW50Cit0ZXN0cywgdG8gdmVyaWZ5IHRoYXQgeW91ciBjaGFuZ2VzIGRvbid0IGJyZWFrIGFueXRoaW5nLgorVG8gdGVzdCBhIHNpbmdsZSB0YXNrLCB1c2UgdGhlIG9uZSBzaG90IDxjb2RlPmFudCBydW4tc2luZ2xlLXRlc3QKKy1EdGVzdGNhc2U9JHt0ZXN0bmFtZX08L2NvZGU+IHdoZXJlIDxjb2RlPiR7dGVzdG5hbWV9PC9jb2RlPgoraXMgdGhlIG5hbWUgb2YgeW91ciB0ZXN0IGNsYXNzLgorCis8cD4KKworVGhlIHRlc3QgY2FzZXMgYXJlIGFsc28gdXNlZCBieSB0aGUgY29tbWl0dGVycyB0byB2ZXJpZnkgdGhhdCBjaGFuZ2VzCithbmQgcGF0Y2hlcyBkbyB3aGF0IHRoZXkgc2F5LiBJZiB5b3UndmUgZ290IHRlc3QgY2FzZXMgaXQgaW5jcmVhc2VzIHlvdXIKK2NyZWRpYmlsaXR5IHNpZ25pZmljYW50bHkuIFRvIGJlIHByZWNpc2UsIHdlIGhhdGUgc3VibWlzc2lvbnMgd2l0aG91dAordGVzdCBjYXNlcywgYXMgaXQgbWVhbnMgd2UgaGF2ZSB0byB3cml0ZSB0aGVtIG91cnNlbHZlcy4gVGhpcyBpcworc29tZXRoaW5nIHRoYXQgb25seSBnZXRzIGRvbmUgaWYgd2UgbmVlZCB0aGUgdGFzayBvciBpdCBpcyBwZXJjZWl2ZWQgYXMKK3V0dGVybHkgZXNzZW50aWFsIHRvIG1hbnkgdXNlcnMuCisKKzxwPgorCitSZW1lbWJlciBhbHNvIHRoYXQgQW50IDEueCBpcyBkZXNpZ25lZCB0byBjb21waWxlIGFuZCBydW4gb24gSmF2YSAxLjIsIHNvCit5b3Ugc2hvdWxkIHRlc3Qgb24gSmF2YSAxLjIgYXMgd2VsbCBhcyBhbnkgbGF0ZXIgdmVyc2lvbiB3aGljaCB5b3UgdXNlLgorWW91IG91Z2h0IHRvIGJlIGFibGUgdG8gZG93bmxvYWQgYW4gb2xkIFNESyBmcm9tIFN1biBmb3IgdGhpcyBwdXJwb3NlLgorPHA+CitGaW5hbGx5LCBydW4gYSBmdWxsIDxjb2RlPmJ1aWxkIHRlc3Q8L2NvZGU+IGJlZm9yZSBhbmQgYWZ0ZXIgeW91IHN0YXJ0CitkZXZlbG9waW5nIHlvdXIgcHJvamVjdCwgdG8gbWFrZSBzdXJlIHlvdSBoYXZlbid0IGJyb2tlbiBhbnl0aGluZyBlbHNlIGJ5CithY2NpZGVudC4KKworPGgyPkRvY3VtZW50PC9oMj4KKworV2l0aG91dCBkb2N1bWVudGF0aW9uLCB0aGUgdGFzayBjYW4ndCBiZSB1c2VkLiBTbyByZW1lbWJlciB0byBwcm92aWRlIGEKK3N1Y2NpbmN0IGFuZCBjbGVhciBodG1sIChzb29uLCB4bWwpIHBhZ2UgZGVzY3JpYmluZyB0aGUgdGFzayBpbiBhIHNpbWlsYXIKK3N0eWxlIHRvIHRoYXQgb2YgZXhpc3RpbmcgdGFza3MuIEl0IHNob3VsZCBpbmNsdWRlIGEgbGlzdCBvZiBhdHRyaWJ1dGVzCithbmQgZWxlbWVudHMsIGFuZCBhdCBsZWFzdCBvbmUgd29ya2luZyBleGFtcGxlIG9mIHRoZSB0YXNrLiBNYW55IHVzZXJzCitjdXQgYW5kIHBhc3RlIHRoZSBleGFtcGxlcyBpbnRvIHRoZWlyIGJ1aWxkIGZpbGVzIGFzIGEgc3RhcnRpbmcgcG9pbnQsCitzbyBtYWtlIHRoZSBleGFtcGxlcyBwcmFjdGljYWwgYW5kIHRlc3QgdGhlbSB0b28uCis8cD4KK1lvdSBjYW4gdXNlIHRoZSB4ZG9jcyBzdHVmZiBpbiBwcm9wb3NhbC94ZG9jcyB0byBhdXRvZ2VuZXJhdGUgeW91cgorZG9jdW1lbnRhdGlvbiBwYWdlIGZyb20gdGhlIGphdmFkb2NzIG9mIHRoZSBzb3VyY2U7IHRoaXMgbWFrZXMgbGlmZQorZWFzaWVyIGFuZCB3aWxsIG1ha2UgdGhlIHRyYW5zaXRpb24gdG8gYSBmdWxsIHhkb2NsZXQgZ2VuZXJhdGVkCitkb2N1bWVudGF0aW9uIGJ1aWxkIHByb2Nlc3MgdHJpdmlhbC4KKworPGgyPkxpY2Vuc2luZyBhbmQgQ29weXJpZ2h0PC9oMj4KKworQW55IGNvZGUgc3VibWl0dGVkIHRvIHRoZSBBcGFjaGUgcHJvamVjdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKK0FwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBhbmQgdGhlIGFjdCBvZiBzdWJtaXNzaW9uIG11c3QgYmUgdmlld2VkIGFzCithbiBpbXBsaWNpdCBsaWNlbnNlIG9mIHRoZSBzdWJtaXR0ZWQgY29kZSB0byB0aGUgQXBhY2hlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCis8cD4KK1RoaXMgaXMgaW1wb3J0YW50LgorCis8cD4KKworVGhlIGZhaXJseSBsYWlzc2V6LWZhaXJlIGxpY2Vuc2Ugb2YgQXBhY2hlIGlzIG5vdCBjdXJyZW50bHkgY29uc2lkZXJlZAorY29tcGF0aWJsZSB3aXRoCitlaXRoZXIgdGhlIEdQTCBvciB0aGUgTGVzc2VyIEdQTCBvZiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLS10aGUKK0dudSBwcm9qZWN0LiBUaGVzZSBsaWNlbnNlcyBoYXZlIHN0cmljdGVyIHRlcm1zLCAmcXVvdDtjb3B5bGVmdCZxdW90OywKK3doaWNoIGFyZSBub3QgaW4gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGxpY2Vuc2UuCitUaGlzIHBlcm1pdHMgcGVvcGxlIGFuZCBvcmdhbmlzYXRpb25zIHRvIGJ1aWxkCitjb21tZXJjaWFsIGFuZCBjbG9zZWQgc291cmNlIGFwcGxpY2F0aW9ucyBhdG9wIHRoZSBBcGFjaGUgbGlicmFyaWVzIGFuZCBzb3VyY2UuCisKKzxwPgorCitCZWNhdXNlIHRoZSBHbnUgR1BMIGxpY2Vuc2UgaW1tZWRpYXRlbHkgZXh0ZW5kcyB0byBjb3ZlciBhbnkgbGFyZ2VyCithcHBsaWNhdGlvbiAob3IgbGlicmFyeSwgaW4gdGhlIGNhc2Ugb2YgTEdQTCkgaW50byB3aGljaCBpdCBpcworaW5jb3Jwb3JhdGVkLCB0aGUgQW50IHRlYW0gY2Fubm90IGluY29ycG9yYXRlIGFueSB0YXNrIGJhc2VkIHVwb24gR1BMCitvciBMR1BMIHNvdXJjZSBpbnRvIHRoZSBBbnQgY29kZWJhc2UuIFlvdSBhcmUgZnJlZSB0byBzdWJtaXQgaXQsIGJ1dCBpdAord2lsbCBiZSBwb2xpdGVseSBhbmQgZmlybWx5IHJlamVjdGVkLgorCis8cD4KK0lmIHlvdSBsaW5rIHRvIGEgR1BMIG9yIExHUEwgbGlicmFyeSwgYnkgPGNvZGU+aW1wb3J0PC9jb2RlPiBvcgorcmVmbGVjdGlvbiwgeW91ciB0YXNrIG11c3QgYmUgbGljZW5zZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMuIFNvIHRhc2tzCitsaW5raW5nIHRvIChMKUdQTCBjb2RlIGNhbid0IGdvIGludG8gdGhlIEFwYWNoZSBtYW5hZ2VkIGNvZGViYXNlLgorVGFza3MgY2FsbGluZyBzdWNoIGNvZGUgY2FuIHVzZSB0aGUgJ2V4ZWMnIG9yICdqYXZhJyB0YXNrcyB0byBydW4gdGhlCitwcm9ncmFtcywgYXMgeW91IGFyZSBqdXN0IGV4ZWN1dGluZyB0aGVtIGF0IHRoaXMgcG9pbnQsIG5vdCBsaW5raW5nIHRvCit0aGVtLgorPHA+CitFdmVuIGlmIHdlIGNhbm5vdCBpbmNsdWRlIHlvdXIgdGFzayBpbnRvIHRoZSBBcGFjaGUgY29kZWJhc2UsIHdlIGNhbgorc3RpbGwgcG9pbnQgdG8gd2hlcmUgeW91IGhvc3QgaXQ7IGp1c3Qgc3VibWl0IGEgZGlmZiB0bworeGRvY3MvZXh0ZXJuYWwuaHRtbCBwb2ludGluZyB0byB5b3VyIHRhc2suCis8cD4KK0lmIHlvdXIgdGFzayBsaW5rcyBkaXJlY3RseSB0byBwcm9wcmlldGFyeSBjb2RlLCB3ZSBoYXZlIGEgZGlmZmVyZW50Citwcm9ibGVtOiBpdCBpcyByZWFsbHkgaGFyZCB0byBidWlsZCB0aGUgdGFza3MuIFBsZWFzZSB1c2UgcmVmbGVjdGlvbi4KKworPGgzPkRvbid0IHJlLWludmVudCB0aGUgd2hlZWw8L2gzPgorCitXZSd2ZSBhbGwgZG9uZSBpdDogd3JpdHRlbiBhbmQgc3VibWl0dGVkIGEgdGFzayBvbmx5IHRvIGRpc2NvdmVyIGl0Cit3YXMgYWxyZWFkeSBpbXBsZW1lbnRlZCBpbiBhIHNtYWxsIGNvcm5lciBvZiBhbm90aGVyIHRhc2ssIG9yIGl0IGhhcworYmVlbiBzdWJtaXR0ZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBub3QgY29tbWl0dGVkLiBZb3UgY2FuIGF2b2lkIHRoaXMKK2J5IGJlaW5nIGF3YXJlIG9mIHdoYXQgaXMgaW4gdGhlIGxhdGVzdCBDVlMgdHJlZTsga2VlcCBnZXR0aW5nIHRoZSBkYWlseQorc291cmNlIHVwZGF0ZXMsIGxvb2sgYXQgbWFudWFsIGNoYW5nZXMgYW5kIHN1YnNjcmliZSB0byB0aGUgZGV2CittYWlsaW5nIGxpc3QuCisKKzxwPgorCitJZiB5b3UgYXJlIHRoaW5raW5nIG9mIHdyaXRpbmcgYSB0YXNrLCBwb3N0aW5nIGEgbm90ZSBvbiB5b3VyIHRob3VnaHRzCit0byB0aGUgbGlzdCBjYW4gYmUgaW5mb3JtYXRpdmUtLXlvdSB3aWxsIGdldCBvdGhlciBwZW9wbGVzJyBpbnNpZ2h0cyBhbmQKK21heWJlIHNvbWUgaGFsZi13cml0dGVuIHRhc2sgdG8gZG8gdGhlIGJhc2ljcywgYWxsIHdpdGhvdXQgd3JpdGluZyBhCitsaW5lIG9mIGNvZGUuCisKKzxoMj5TdWJtaXR0aW5nIHRvIEFudDwvaDI+CisKK1RoZSBiYXNpYyBtZWNoYW5pc20gZm9yIHN1Ym1pdHRpbmcgYW4gQW50IHRhc2sgaXMgdG8gbWFpbCBpdCB0byB0aGUKK2RldiBtYWlsaW5nIGxpc3QuIEl0IGhlbHBzIHRvIGJlIG9uIHRoaXMgbGlzdCwgYXMgeW91IHdpbGwgc2VlIG90aGVyCitzdWJtaXNzaW9ucywgYW5kIGFueSBkZWJhdGUgYWJvdXQgeW91ciBvd24gc3VibWlzc2lvbi4KKzxwPgorWW91IG1heSBjcmVhdGUgeW91ciBwYXRjaCBmaWxlIHVzaW5nIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGFwcHJvYWNoZXMKKyh0aGUgY29tbWl0dGVycyByZWNvbW1lbmQgdGhlIGZpcnN0KToKKzxwPgorPHVsPgorPGxpPjxoMz5BcHByb2FjaCAxIC0gVGhlIEFudCBXYXk8L2gzPgorPHA+CitVc2UgQW50IHRvIGdlbmVyYXRlIGEgcGF0Y2ggZmlsZSB0byBBbnQ6Cis8cHJlIGNsYXNzPSJjb2RlIj4KK2FudCAtZiBwYXRjaC54bWwKKzwvcHJlPgorVGhpcyB3aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgcGF0Y2gudGFyLmd6IHRoYXQgd2lsbCBjb250YWluIGEgdW5pZmllZAorZGlmZiBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBhbmQgYWxzbyBpbmNsdWRlIGZpbGVzIHRoYXQgaGF2ZQorYmVlbiBhZGRlZC4gIFJldmlldyB0aGUgZmlsZSBmb3IgY29tcGxldGVuZXNzIGFuZCBjb3JyZWN0bmVzcy4gIFRoaXMgYXBwcm9hY2gKK2lzIHJlY29tbWVuZGVkIGJlY2F1c2UgaXQgc3RhbmRhcmRpemVzIHRoZSB3YXkgaW4gd2hpY2ggcGF0Y2ggZmlsZXMgYXJlCitjb25zdHJ1Y3RlZC4gIEl0IGFsc28gZWxpbWluYXRlcyB0aGUgY2hhbmNlIG9mIHlvdSBtaXNzaW5nIHRvIHN1Ym1pdCBuZXcgZmlsZXMKK3RoYXQgY29uc3RpdHV0ZSBwYXJ0IG9mIHRoZSBwYXRjaC4KKzxwPgorPGxpPjxoMz5BcHByb2FjaCAyIC0gVGhlIE1hbnVhbCBXYXk8L2gzPgorPHA+CitQYXRjaGVzIHRvIGV4aXN0aW5nIGZpbGVzIHNob3VsZCBiZSBnZW5lcmF0ZWQgd2l0aAorPGNvZGU+c3ZuIGRpZmYgLXUgZmlsZW5hbWU8L2NvZGU+CisgYW5kIHNhdmUgdGhlIG91dHB1dCB0byBhIGZpbGUuIElmIHlvdSB3YW50IHRvIGdldAordGhlIGNoYW5nZXMgbWFkZSB0byBtdWx0aXBsZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSAsIGp1c3QgdXNlIDxjb2RlPmN2cworZGlmZiAtdTwvY29kZT4uICBUaGVuLCBUYXIgYW5kIEdaaXAgdGhlIHBhdGNoIGZpbGUgYXMgd2VsbCBhcyBhbnkgbmV3IGZpbGVzCit0aGF0IHlvdSBoYXZlIGFkZGVkLgorPC91bD4KKzxwPgorVGhlIHBhdGNoZXMgc2hvdWxkIGJlIHNlbnQgYXMgYW4gYXR0YWNobWVudCB0byBhIG1lc3NhZ2UgdGl0bGVkIFtQQVRDSF0KK2FuZCBkaXN0aW5jdGl2ZSBvbmUtbGluZSBzdW1tYXJ5IGluIHRoZSBzdWJqZWN0IG9mIHRoZSBwYXRjaC4gVGhlCitmaWxlbmFtZS90YXNrIGFuZCB0aGUgY2hhbmdlIHVzdWFsbHkgc3VmZmljZXMuIEl0J3MgaW1wb3J0YW50IHRvIGluY2x1ZGUKK3RoZSBjaGFuZ2VzIGFzIGFuIGF0dGFjaG1lbnQsIGFzIHRvbyBtYW55IG1haWxlcnMgcmVmb3JtYXQgdGhlIHRleHQKK3Bhc3RlZCBpbiwgd2hpY2ggYnJlYWtzIHRoZSBwYXRjaC4KKzxwPgorVGhlbiB5b3Ugd2FpdCBmb3Igb25lIG9mIHRoZSBjb21taXR0ZXJzIHRvIGNvbW1pdCB0aGUgcGF0Y2gsIGlmIGl0IGlzCitmZWx0IGFwcHJvcHJpYXRlIHRvIGRvIHNvLiBCdWcgZml4ZXMgZ28gaW4gcXVpY2tseSwgb3RoZXIgY2hhbmdlcworb2Z0ZW4gc3BhcmsgYSBiaXQgb2YgZGlzY3Vzc2lvbiBiZWZvcmUgYSAocGVyaGFwcyByZXZpc2VkKSBjb21taXQgaXMKK21hZGUuCis8cD4KKworTmV3IHN1Ym1pc3Npb25zIHNob3VsZCBiZSBwcm9jZWVkZWQgd2l0aCBbU1VCTUlUXS4gVGhlIG1haWxlci1kYWVtb24KK3dpbGwgcmVqZWN0IGFueSBtZXNzYWdlcyBvdmVyIDEwMEtCLCBzbyBhbnkgbGFyZ2UgdXBkYXRlIHNob3VsZCBiZQoremlwcGVkIHVwLiBJZiB5b3VyIHN1Ym1pc3Npb24gaXMgYmlnZ2VyIHRoYW4gdGhhdCwgd2h5IG5vdCBicmVhayBpdCB1cAoraW50byBzZXBhcmF0ZSB0YXNrcy4KKzxwPgorCitXZSBhbHNvIGxpa2Ugc3VibWlzc2lvbnMgdG8gYmUgYWRkZWQgdG8KKzxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS8iPmJ1Z3ppbGxhPC9hPiwgc28gdGhhdCB0aGV5IGRvbnQgZ2V0IGxvc3QuIFBsZWFzZSBzdWJtaXQgdGhlbSBieSBmaXJzdCBmaWxpbmcgdGhlIHJlcG9ydCB3aXRoIGEKK21lYW5pbmdmdWwgbmFtZSwgdGhlbiBhZGRpbmcgZmlsZXMgYXMgYXR0YWNobWVudHMuIFVzZSBDVlMgZGlmZiBmaWxlcworcGxlYXNlIQorPHA+CisKK0lmIHlvdSBoZWFyIG5vdGhpbmcgYWZ0ZXIgYSBjb3VwbGUgb2Ygd2Vla3MsIHJlbWluZCB0aGUgbWFpbGluZyBsaXN0LgorU29tZXRpbWVzIHJlYWxseSBnb29kIHN1Ym1pc3Npb25zIGdldCBsb3N0IGluIHRoZSBub2lzZSBvZiBvdGhlciBpc3N1ZXMuCitUaGlzIGlzIHBhcnRpY3VsYXJseSB0aGUgY2FzZSBqdXN0IHByaW9yIHRvIGEgbmV3IHBvaW50IHJlbGVhc2Ugb2YKK3RoZSBwcm9kdWN0LiBBdCB0aGF0IHRpbWUgYW55dGhpbmcgb3RoZXIgdGhhbiBidWcgZml4ZXMgd2lsbCB0ZW5kCit0byBiZSBuZWdsZWN0ZWQuCisKKzxoMj5DaGVja2xpc3RzPC9oMj4KKworVGhlc2UgYXJlIHRoZSB0aGluZ3MgeW91IHNob3VsZCB2ZXJpZnkgYmVmb3JlIHN1Ym1pdHRpbmcgcGF0Y2hlcyBhbmQgbmV3Cit0YXNrcy4gVGhpbmdzIGRvbid0IGhhdmUgdG8gYmUgcGVyZmVjdDsgaXQgbWF5IHRha2UgYSBjb3VwbGUgb2YKK2l0ZXJhdGlvbnMgYmVmb3JlIGEgcGF0Y2ggb3Igc3VibWlzc2lvbiBpcyBjb21taXR0ZWQsIGFuZCB0aGVzZSBpdGVtcworY2FuIGJlIGFkZHJlc3NlZCBpbiB0aGUgcHJvY2Vzcy4gQnV0IGJ5IHRoZSB0aW1lIHRoZSBjb2RlIGlzIGNvbW1pdHRlZCwKK2V2ZXJ5dGhpbmcgaW5jbHVkaW5nIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBzb21lIHRlc3QgY2FzZXMgd2lsbCBoYXZlCitiZWVuIGRvbmUsIHNvIGdldHRpbmcgdGhlbSBvdXQgdGhlIHdheSB1cCBmcm9udCBjYW4gc2F2ZSB0aW1lLgorVGhlIGNvbW1pdHRlcnMgbG9vayBtb3JlIGZhdm91cmFibHkgb24gcGF0Y2hlcyBhbmQgc3VibWlzc2lvbnMgd2l0aCB0ZXN0CitjYXNlcywgd2hpbGUgZG9jdW1lbnRhdGlvbiBoZWxwcyBzZWxsIHRoZSByZWFzb24gZm9yIGEgdGFzay4KKworPGgzPkNoZWNrbGlzdCBiZWZvcmUgc3VibWl0dGluZyBhIHBhdGNoPC9oMz4KKzx1bD4KKzxsaT5BZGRlZCBjb2RlIGNvbXBsaWVzIHdpdGggc3R5bGUgZ3VpZGVsaW5lcworPGxpPkNvZGUgY29tcGlsZXMgYW5kIHJ1bnMgb24gSmF2YSAxLjIKKzxsaT5OZXcgbWVtYmVyIHZhcmlhYmxlcyBhcmUgcHJpdmF0ZSwgYW5kIHByb3ZpZGUgcHVibGljIGFjY2Vzc29yIG1ldGhvZHMKKwlpZiBhY2Nlc3MgaXMgYWN0dWFsbHkgbmVlZGVkLgorPGxpPkV4aXN0aW5nIHRlc3QgY2FzZXMgc3VjY2VlZC4KKzxsaT5OZXcgdGVzdCBjYXNlcyB3cml0dGVuIGFuZCBzdWNjZWVkLgorPGxpPkRvY3VtZW50YXRpb24gcGFnZSBleHRlbmRlZCBhcyBhcHByb3ByaWF0ZS4KKzxsaT5FeGFtcGxlIHRhc2sgZGVjbGFyYXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIHRlc3RlZC4KKzxsaT5EaWZmIGZpbGVzIGdlbmVyYXRlZCB1c2luZyBzdm4gZGlmZiAtdQorPGxpPk1lc3NhZ2UgdG8gZGV2IGNvbnRhaW5zIFtQQVRDSF0sIHRhc2sgbmFtZSBhbmQgcGF0Y2ggcmVhc29uIGluCitzdWJqZWN0LgorPGxpPk1lc3NhZ2UgYm9keSBjb250YWlucyBhIHJhdGlvbmFsZSBmb3IgdGhlIHBhdGNoLgorPGxpPk1lc3NhZ2UgYXR0YWNobWVudCBjb250YWlucyB0aGUgcGF0Y2ggZmlsZShzKS4KKzwvdWw+CisKKzxoMz5DaGVja2xpc3QgYmVmb3JlIHN1Ym1pdHRpbmcgYSBuZXcgdGFzazwvaDM+Cis8dWw+Cis8bGk+SmF2YSBmaWxlIGJlZ2lucyB3aXRoIEFwYWNoZSBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugc3RhdGVtZW50LgorPGxpPlRhc2sgZG9lcyBub3QgZGVwZW5kIG9uIEdQTCBvciBMR1BMIGNvZGUuCis8bGk+U291cmNlIGNvZGUgY29tcGxpZXMgd2l0aCBzdHlsZSBndWlkZWxpbmVzCis8bGk+Q29kZSBjb21waWxlcyBhbmQgcnVucyBvbiBKYXZhIDEuMgorPGxpPk1lbWJlciB2YXJpYWJsZXMgYXJlIHByaXZhdGUsIGFuZCBwcm92aWRlIHB1YmxpYyBhY2Nlc3NvciBtZXRob2RzCisJaWYgYWNjZXNzIGlzIGFjdHVhbGx5IG5lZWRlZC4KKzxsaT48aT5NYXliZTwvaT4gVGFzayBoYXMgZmFpbG9uZXJyb3IgYXR0cmlidXRlIHRvIGNvbnRyb2wgZmFpbHVyZSBiZWhhdmlvdXIKKzxsaT5OZXcgdGVzdCBjYXNlcyB3cml0dGVuIGFuZCBzdWNjZWVkCis8bGk+RG9jdW1lbnRhdGlvbiBwYWdlIHdyaXR0ZW4KKzxsaT5FeGFtcGxlIHRhc2sgZGVjbGFyYXRpb25zIGluIHRoZSBkb2N1bWVudGF0aW9uIHRlc3RlZC4KKzxsaT5QYXRjaCBmaWxlcyBnZW5lcmF0ZWQgdXNpbmcgc3ZuIGRpZmYgLXUKKzxsaT5wYXRjaCBmaWxlcyBpbmNsdWRlIGEgcGF0Y2ggdG8gZGVmYXVsdHMucHJvcGVydGllcyB0byByZWdpc3RlciB0aGUKK3Rhc2tzCis8bGk+cGF0Y2ggZmlsZXMgaW5jbHVkZSBhIHBhdGNoIHRvIGNvcmV0YXNrbGlzdC5odG1sIG9yCitvcHRpb25hbHRhc2tsaXN0Lmh0bWwgdG8gbGluayB0byB0aGUgbmV3IHRhc2sgcGFnZQorPGxpPk1lc3NhZ2UgdG8gZGV2IGNvbnRhaW5zIFtTVUJNSVRdIGFuZCB0YXNrIG5hbWUgaW4gc3ViamVjdAorPGxpPk1lc3NhZ2UgYm9keSBjb250YWlucyBhIHJhdGlvbmFsZSBmb3IgdGhlIHRhc2sKKzxsaT5NZXNzYWdlIGF0dGFjaG1lbnRzIGNvbnRhaW4gdGhlIHJlcXVpcmVkIGZpbGVzIC1zb3VyY2UsIGRvY3VtZW50YXRpb24sCit0ZXN0IGFuZCBwYXRjaGVzIHppcHBlZCB1cCB0byBlc2NhcGUgdGhlIEhUTUwgZmlsdGVyLgorPC91bD4KKworCis8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9hbnRsaWJzL2FudHVuaXQvaW5kZXguaHRtbCBiL3RydW5rL2RvY3MvYW50bGlicy9hbnR1bml0L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTA0YTBhYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvYW50bGlicy9hbnR1bml0L2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNjYgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIEFudFVuaXQ8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CisgICAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi4vLi4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi4vLi4vaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj48aW1nIGFsdD0iQXBhY2hlIEFudCBsb2dvIiBib3JkZXI9IjAiIHNyYz0iLi4vLi4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJzZWFyY2hjYXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc2l6ZT0iMTUiIGlkPSJxdWVyeSIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4uLy4uL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuLi8uLi9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiI+CisgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNSI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI4IiB3aWR0aD0iOCIgc3JjPSIuLi8uLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj5Ib21lPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL3RhYi1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi4vLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iIzRDNkM4RiI+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPlByb2plY3RzPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlByb2plY3RzCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uL3Byb2plY3RzL2luZGV4Lmh0bWwiPldlbGNvbWU8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BbnQgTGlicmFyaWVzCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uL2FudGxpYnMvaW5kZXguaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uL2FudGxpYnMvY2hhcnRlci5odG1sIj5DaGFydGVyPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uL2FudGxpYnMvcHJvcGVyLmh0bWwiPkFudCBMaWJyYXJpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vYW50bGlicy9zYW5kYm94Lmh0bWwiPlNhbmRib3ggQW50IExpYnJhcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3NyY2Rvd25sb2FkLmNnaSI+U291cmNlIERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5JdnkKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vcHJvamVjdHMvaXZ5Lmh0bWwiPkludHJvZHVjdGlvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5LyI+SG9tZXBhZ2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS9kb3dubG9hZC5jZ2kiPkRpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9pdnkvIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxjZW50ZXI+CisgICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9hZHMvYnV0dG9uYmFyLmh0bWwiIC0tPgorICAgIDwvY2VudGVyPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiBsZWZ0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPkFudFVuaXQ8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudFVuaXQgMS4wIj48L2E+CisgICAgICBBbnRVbml0IDEuMAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+SmFudWFyeSA4LCAyMDA3IC0gQXBhY2hlIEFudFVuaXQgMS4wIEF2YWlsYWJsZTwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwYWNoZSBBbnRVbml0IDEuMCBpcyBub3cgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhcyA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPmJpbmFyeTwvYT4KKyAgICAgIG9yIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3NyY2Rvd25sb2FkLmNnaSI+c291cmNlPC9hPgorICAgICAgcmVsZWFzZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iSWRlYSI+PC9hPgorICAgICAgSWRlYQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Jbml0aWFsbHkgYWxsIHRlc3RzIGZvciBBbnQgdGFza3Mgd2VyZSB3cml0dGVuIGFzIGluZGl2aWR1YWwKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnLyI+SlVuaXQ8L2E+IHRlc3QgY2FzZXMuICBQcmV0dHkKKyAgICAgIHNvb24gaXQgd2FzIGNsZWFyIHRoYXQgbW9zdCB0ZXN0cyBuZWVkZWQgdG8gcGVyZm9ybSBjb21tb24gdGFza3MKKyAgICAgIGxpa2UgcmVhZGluZyBhIGJ1aWxkIGZpbGUsIGluaXRpYWxpemluZyBhIHByb2plY3QgaW5zdGFuY2Ugd2l0aAorICAgICAgaXQgYW5kIGV4ZWN1dGluZyBhIHRhcmdldC4gIEF0IHRoaXMgcG9pbnQgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9jb3JlL3RydW5rL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRGaWxlVGVzdC5qYXZhIj5CdWlsZEZpbGVUZXN0PC9hPgorICAgICAgd2FzIGludmVudGVkLCBhIGJhc2UgY2xhc3MgZm9yIGFsbW9zdCBhbGwgdGFzayB0ZXN0IGNhc2VzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QnVpbGRGaWxlVGVzdCB3b3JrcyBmaW5lIGFuZCBpbiBmYWN0IGhhcyBiZWVuIHBpY2tlZCB1cCBieSA8YSBocmVmPSJodHRwOi8vYW50LWNvbnRyaWIuc2YubmV0LyI+dGhlIEFudC1Db250cmliIFByb2plY3Q8L2E+CisgICAgICBhbmQgb3RoZXJzIGFzIHdlbGwuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5PdmVyIHRpbWUgYSBuZXcgcGF0dGVybiBldm9sdmVkLCBtb3JlIGFuZCBtb3JlIHRlc3RzIG9ubHkKKyAgICAgIGV4ZWN1dGVkIGEgdGFyZ2V0IGFuZCBkaWRuJ3QgY2hlY2sgYW55IGVmZmVjdHMuICBJbnN0ZWFkIHRoYXQKKyAgICAgIHRhcmdldCBjb250YWluZWQgdGhlIGFzc2VydGlvbnMgYXMgYSA8Y29kZT4mbHQ7ZmFpbCZndDs8L2NvZGU+CisgICAgICB0YXNrLiAgVGhpcyBpcyBhbiBleGFtcGxlIHRha2VuIGZyb20gdGhlIGJ1aWxkIGZpbGUgZm9yIHRoZQorICAgICAgQU5UTFIgdGFzayAodXNpbmcgQW50IDEuNyBmZWF0dXJlcyk6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O3Rlc3QzJnF1b3Q7IGRlcGVuZHM9JnF1b3Q7c2V0dXAmcXVvdDsmZ3Q7CisgICAgJmx0O2FudGxyIHRhcmdldD0mcXVvdDthbnRsci5nJnF1b3Q7IG91dHB1dGRpcmVjdG9yeT0mcXVvdDske3RtcC5kaXJ9JnF1b3Q7LyZndDsKKyAgICAmbHQ7ZmFpbCZndDsKKyAgICAgICZsdDtjb25kaXRpb24mZ3Q7CisgICAgICAgICZsdDshLS0gdG8gcHJvdmUgZWFjaCBvZiB0aGVzZSBmaWxlcyBleGlzdHM7CisgICAgICAgICAgICAgQU5UTFIgJmd0Oz0gMi43LjYgbGVhdmVzIGJlaGluZCBuZXcgKC5zbWFwKSBmaWxlcyBhcyB3ZWxsLiAtLSZndDsKKyAgICAgICAgJmx0O3Jlc291cmNlY291bnQgd2hlbj0mcXVvdDtuZSZxdW90OyBjb3VudD0mcXVvdDs1JnF1b3Q7Jmd0OworICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3RtcC5kaXJ9JnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtDYWxjUGFyc2VyVG9rZW5UeXBlcy50eHQmcXVvdDsgLyZndDsKKyAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7Q2FsY1BhcnNlclRva2VuVHlwZXMuamF2YSZxdW90OyAvJmd0OworICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtDYWxjTGV4ZXIuamF2YSZxdW90OyAvJmd0OworICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtDYWxjUGFyc2VyLmphdmEmcXVvdDsgLyZndDsKKyAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7Q2FsY1RyZWVXYWxrZXIuamF2YSZxdW90OyAvJmd0OworICAgICAgICAgICZsdDsvZmlsZXNldCZndDsKKyAgICAgICAgJmx0Oy9yZXNvdXJjZWNvdW50Jmd0OworICAgICAgJmx0Oy9jb25kaXRpb24mZ3Q7CisgICAgJmx0Oy9mYWlsJmd0OworICAmbHQ7L3RhcmdldCZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD53aGVyZSB0aGUgY29ycmVzcG9uZGluZyBKVW5pdCB0ZXN0Y2FzZSBoYXMgYmVlbiByZWR1Y2VkCisgICAgICB0bzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CisuLi4KK3B1YmxpYyBjbGFzcyBBTlRMUlRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLREVGU19ESVIgPSAmcXVvdDtzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci8mcXVvdDs7CisKKyAgICBwdWJsaWMgQU5UTFJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICZxdW90O2FudGxyLnhtbCZxdW90Oyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoJnF1b3Q7Y2xlYW51cCZxdW90Oyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoJnF1b3Q7dGVzdDMmcXVvdDspOworICAgIH0KKy4uLgorfQorPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgYXBwcm9hY2ggaGFzIGEgY291cGxlIG9mIGFkdmFudGFnZXMsIG9uZSBvZiB0aGVtIGlzIHRoYXQKKyAgICAgIGl0IGlzIHZlcnkgZWFzeSB0byB0cmFuc2xhdGUgYW4gZXhhbXBsZSBidWlsZCBmaWxlIGZyb20gYSBidWcKKyAgICAgIHJlcG9ydCBpbnRvIGEgdGVzdCBjYXNlLiAgSWYgeW91IGFzayBhIHVzZXIgZm9yIGEgdGVzdGNhc2UgZm9yIGEKKyAgICAgIGdpdmVuIGJ1ZyBpbiBBbnQsIGhlIG5vdyBkb2Vzbid0IG5lZWQgdG8gdW5kZXJzdGFuZCBKVW5pdCBvciBob3cKKyAgICAgIHRvIGZpdCBhIHRlc3QgaW50byBBbnQncyBleGlzdGluZyB0ZXN0cyBhbnkgbW9yZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudFVuaXQgdGFrZXMgdGhpcyBhcHByb2FjaCB0byB0ZXN0aW5nIGV2ZW4gZnVydGhlciwgaXQKKyAgICAgIHJlbW92ZXMgSlVuaXQgY29tcGxldGVseSBhbmQgaXQgY29tZXMgd2l0aCBhIHNldCBvZiBwcmVkZWZpbmVkCisgICAgICA8Y29kZT4mbHQ7YXNzZXJ0Jmd0OzwvY29kZT4gdGFza3MgaW4gb3JkZXIgdG8gcmV1c2UgY29tbW9uIGtpbmQKKyAgICAgIG9mIGNoZWNrcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkl0IHR1cm5zIG91dCB0aGF0IEFudFVuaXQgbGVuZHMgaXRzZWxmIGFzIGEgc29sdXRpb24gdG8gb3RoZXIKKyAgICAgIHByb2JsZW1zIGFzIHdlbGwuICBUaGUgYXNzZXJ0aW9ucyBhcmUgYW4gZWFzeSB3YXkgdG8gdmFsaWRhdGUgYQorICAgICAgc2V0dXAgYmVmb3JlIGV2ZW4gc3RhcnRpbmcgdGhlIGJ1aWxkIHByb2Nlc3MsIGZvciBleGFtcGxlLgorICAgICAgQW50VW5pdCBjb3VsZCBhbHNvIGJlIHVzZWQgZm9yIGZ1bmN0aW9uYWwgYW5kIGludGVncmF0aW9uIHRlc3RzCisgICAgICBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZiBBbnQgdGFza3MgKGFzc2VydCBjb250ZW50cyBvZiBkYXRhYmFzZXMKKyAgICAgIGFmdGVyIHJ1bm5pbmcgYW4gYXBwbGljYXRpb24sIGFzc2VydCBjb250ZW50cyBvZiBIVFRQIHJlc3BvbnNlcworICAgICAgLi4uKS4gIFRoaXMgaXMgYW4gYXJlYSB0aGF0IHdpbGwgbmVlZCBtb3JlIHJlc2VhcmNoLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJDb25jZXB0cyI+PC9hPgorICAgICAgQ29uY2VwdHMKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iYW50dW5pdCBUYXNrIj48L2E+CisgICAgICAgIGFudHVuaXQgVGFzaworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSAmbHQ7YW50dW5pdCZndDsgdGFzayBkcml2ZXMgdGhlIHRlc3RzIG11Y2ggbGlrZQorICAgICAgICAmbHQ7anVuaXQmZ3Q7IGRvZXMgZm9yIEpVbml0IHRlc3RzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2hlbiBjYWxsZWQgb24gYSBidWlsZCBmaWxlLCB0aGUgdGFzayB3aWxsIHN0YXJ0IGEgbmV3IEFudAorICAgICAgICBwcm9qZWN0IGZvciB0aGF0IGJ1aWxkIGZpbGUgYW5kIHNjYW4gZm9yIHRhcmdldHMgd2l0aCBuYW1lcworICAgICAgICB0aGF0IHN0YXJ0IHdpdGggInRlc3QiLiAgRm9yIGVhY2ggc3VjaCB0YXJnZXQgaXQgdGhlbiB3aWxsPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgPGxpPkV4ZWN1dGUgdGhlIHRhcmdldCBuYW1lZCBzZXRVcCwgaWYgdGhlcmUgaXMgb25lLjwvbGk+CisgICAgICAgICAgPGxpPkV4ZWN1dGUgdGhlIHRhcmdldCBpdHNlbGYgLSBpZiB0aGlzIHRhcmdldCBkZXBlbmRzIG9uCisgICAgICAgICAgb3RoZXIgdGFyZ2V0cyB0aGUgbm9ybWFsIEFudCBydWxlcyBhcHBseSBhbmQgdGhlIGRlcGVuZGVudAorICAgICAgICAgIHRhcmdldHMgYXJlIGV4ZWN1dGVkIGZpcnN0LjwvbGk+CisgICAgICAgICAgPGxpPkV4ZWN1dGUgdGhlIHRhcmdldCBuYW1lcyB0ZWFyRG93biwgaWYgdGhlcmUgaXMgb25lLjwvbGk+CisgICAgICAgIDwvb2w+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQXNzZXJ0aW9ucyI+PC9hPgorICAgICAgICBBc3NlcnRpb25zCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGJhc2UgdGFzayBpcyA8Y29kZT4mbHQ7YXNzZXJ0VHJ1ZSZndDs8L2NvZGU+LiAgSXQKKyAgICAgICAgYWNjZXB0cyBhIHNpbmdsZSBuZXN0ZWQgY29uZGl0aW9uIGFuZCB0aHJvd3MgYSBzdWJjbGFzcyBvZgorICAgICAgICBCdWlsZEV4Y2VwdGlvbiBuYW1lZCBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gaWYgdGhhdAorICAgICAgICBjb25kaXRpb24gZXZhbHVhdGVzIHRvIGZhbHNlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyB0YXNrIGNvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCB1c2luZworICAgICAgICA8Y29kZT4mbHQ7bWFjcm9kZWYmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2ZhaWwmZ3Q7PC9jb2RlPiwKKyAgICAgICAgYnV0IGluIGZhY3QgaXQgaXMgYSAicmVhbCIgdGFzayBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCisgICAgICAgIHRocm93IGEgc3ViY2xhc3Mgb2YgQnVpbGRFeGNlcHRpb24uICBUaGUKKyAgICAgICAgPGNvZGU+Jmx0O2FudHVuaXQmZ3Q7PC9jb2RlPiB0YXNrIGNhdGNoZXMgdGhpcyBleGNlcHRpb24gYW5kCisgICAgICAgIG1hcmtzIHRoZSB0YXJnZXQgYXMgZmFpbGVkLCBhbnkgb3RoZXIgdHlwZSBvZiBFeGNlcHRpb24KKyAgICAgICAgKGluY2x1ZGluZyBvdGhlciBCdWlsZEV4Y2VwdGlvbikgYXJlIHRlc3QgZXJyb3JzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VG9nZXRoZXIgd2l0aCA8Y29kZT4mbHQ7YXNzZXJ0VHJ1ZSZndDs8L2NvZGU+IHRoZXJlIGFyZQorICAgICAgICBtYW55IHByZWRlZmluZWQgYXNzZXJ0aW9ucyBmb3IgY29tbW9uIGNvbmRpdGlvbnMsIG1vc3Qgb2YKKyAgICAgICAgdGhlc2UgYXJlIG9ubHkgbWFjcm9zLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJPdGhlciBUYXNrcyI+PC9hPgorICAgICAgICBPdGhlciBUYXNrcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSA8Y29kZT4mbHQ7bG9nY2FwdHVyZXImZ3Q7PC9jb2RlPiBjYXB0dXJlcyBhbGwgbWVzc2FnZXMKKyAgICAgICAgdGhhdCBwYXNzIEFudCdzIGxvZ2dpbmcgc3lzdGVtIGFuZCBwcm92aWRlcyB0aGVtIHZpYSBhCisgICAgICAgIHJlZmVyZW5jZSBpbnNpZGUgb2YgdGhlIHByb2plY3QuICBJZiB5b3Ugd2FudCB0byBhc3NlcnQKKyAgICAgICAgY2VydGFpbiBsb2cgbWVzc2FnZXMsIHlvdSBuZWVkIHRvIHN0YXJ0IHRoaXMgdGFzayAocHJpb3IgdG8KKyAgICAgICAgeW91ciB0YXJnZXQgdW5kZXIgdGVzdCkgYW5kIHVzZSB0aGUKKyAgICAgICAgPGNvZGU+Jmx0O2Fzc2VydExvZ0NvbnRhaW5zJmd0OzwvY29kZT4gYXNzZXJ0aW9uLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGNvZGU+Jmx0O2V4cGVjdEZhaWx1cmUmZ3Q7PC9jb2RlPiBpcyBhIHRhc2sgY29udGFpbmVyIHRoYXQKKyAgICAgICAgY2F0Y2hlcyBhbnkgQnVpbGRFeGNlcHRpb24gdGhyb3duIGJ5IHRhc2tzIG5lc3RlZCBpbnRvIGl0LiAgSWYKKyAgICAgICAgbm8gZXhjZXB0aW9uIGhhcyBiZWVuIHRocm93biBpdCB3aWxsIGNhdXNlIGEgdGVzdCBmYWlsdXJlIChieQorICAgICAgICB0aHJvd2luZyBhbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24pLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRVbml0TGlzdGVuZXIiPjwvYT4KKyAgICAgICAgQW50VW5pdExpc3RlbmVyCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGFydCBvZiB0aGUgbGlicmFyeSBpcyB0aGUgPGNvZGU+QW50VW5pdExpc3RlbmVyPC9jb2RlPgorICAgICAgICBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byByZWNvcmQgdGVzdCByZXN1bHRzLiAgVGhlCisgICAgICAgICZsdDthbnR1bml0Jmd0OyB0YXNrIGFjY2VwdHMgYXJiaXRyYXJ5IG1hbnkgbGlzdGVuZXJzIGFuZAorICAgICAgICByZWxheXMgdGVzdCByZXN1bHRzIHRvIHRoZW0uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5DdXJyZW50bHkgdHdvIGltcGxlbWVudGF0aW9ucyAtCisgICAgICAgIDxjb2RlPiZsdDtwbGFpbmxpc3RlbmVyJmd0OzwvY29kZT4gYW5kIDxjb2RlPnhtbGxpc3RlbmVyPC9jb2RlPiAKKyAgICAgICAgbW9kZWxsZWQgYWZ0ZXIgdGhlICJwbGFpbiIgYW5kICJ4bWwiCisgICAgICAgIEpVbml0IGxpc3RlbmVycyAtIGFyZSBidW5kbGVkIHdpdGggdGhlIGxpYnJhcnkuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iRXhhbXBsZXMiPjwvYT4KKyAgICAgIEV4YW1wbGVzCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgaXMgYSB3YXkgdG8gdGVzdCB0aGF0IDxjb2RlPiZsdDt0b3VjaCZndDs8L2NvZGU+CisgICAgICBhY3R1YWxseSBjcmVhdGVzIGEgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0OjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CismbHQ7cHJvamVjdCB4bWxuczphdT0mcXVvdDthbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCZxdW90OyZndDsKKyAgJmx0OyEtLSBpcyBjYWxsZWQgcHJpb3IgdG8gdGhlIHRlc3QgLS0mZ3Q7CisgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtzZXRVcCZxdW90OyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtmb28mcXVvdDsgdmFsdWU9JnF1b3Q7Zm9vJnF1b3Q7LyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0OyEtLSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHRlc3QsIGV2ZW4gaWYgdGhhdCBjYXVzZWQgYW4gZXJyb3IgLS0mZ3Q7CisgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDt0ZWFyRG93biZxdW90OyZndDsKKyAgICAmbHQ7ZGVsZXRlIGZpbGU9JnF1b3Q7JHtmb299JnF1b3Q7IHF1aWV0PSZxdW90O3RydWUmcXVvdDsvJmd0OworICAmbHQ7L3RhcmdldCZndDsKKworICAmbHQ7IS0tIHRoZSBhY3R1YWwgdGVzdCBjYXNlIC0tJmd0OworICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7dGVzdFRvdWNoQ3JlYXRlc0ZpbGUmcXVvdDsmZ3Q7CisgICAgJmx0O2F1OmFzc2VydEZpbGVEb2VzbnRFeGlzdCBmaWxlPSZxdW90OyR7Zm9vfSZxdW90Oy8mZ3Q7CisgICAgJmx0O3RvdWNoIGZpbGU9JnF1b3Q7JHtmb299JnF1b3Q7LyZndDsKKyAgICAmbHQ7YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSZxdW90OyR7Zm9vfSZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPldoZW4gcnVubmluZyBhIHRhc2sgbGlrZTwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CisgICAgJmx0O2F1OmFudHVuaXQmZ3Q7CisgICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDt0b3VjaC54bWwmcXVvdDsvJmd0OworICAgICAgJmx0O2F1OnBsYWlubGlzdGVuZXIvJmd0OworICAgICZsdDsvYXU6YW50dW5pdCZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5mcm9tIGEgYnVpbGRmaWxlIG9mIGl0cyBvd24geW91J2xsIGdldCBhIHJlc3VsdCB0aGF0IGxvb2tzIGxpa2U8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorW2F1OmFudHVuaXRdIEJ1aWxkIEZpbGU6IC90bXAvdG91Y2gueG1sCitbYXU6YW50dW5pdF0gVGVzdHMgcnVuOiAxLCBGYWlsdXJlczogMCwgRXJyb3JzOiAwLCBUaW1lIGVsYXBzZWQ6IDAuMjQ5IHNlYworW2F1OmFudHVuaXRdIFRhcmdldDogdGVzdFRvdWNoQ3JlYXRlc0ZpbGUgdG9vayAwLjE4MyBzZWMKKworQlVJTEQgU1VDQ0VTU0ZVTAorVG90YWwgdGltZTogMSBzZWNvbmQKKzwvcHJlPgorICAgICAgICAgICAgICAgIAorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IS0tCisgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoIiAtICIrIkxhc3QgUHVibGlzaGVkOiAiICsgZG9jdW1lbnQubGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgLy8gIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvcD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2FudGxpYnMvYmluZG93bmxvYWQuY2dpIGIvdHJ1bmsvZG9jcy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzI0Zjc2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaQpAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKKyMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKKyMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCitjZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCisvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2FudGxpYnMvYmluZG93bmxvYWQuaHRtbCBiL3RydW5rL2RvY3MvYW50bGlicy9iaW5kb3dubG9hZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZWZhNjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2FudGxpYnMvYmluZG93bmxvYWQuaHRtbApAQCAtMCwwICsxLDMwOSBAQAorCisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgICAgICA8aHRtbCBsYW5nPSJlbiI+CisgICAgPCEtLSBHRU5FUkFURUQgRklMRSwgRE8gTk9UIEVESVQsIEVESVQgVEhFIFhNTCBGSUxFIElOIHhkb2NzIElOU1RFQUQhIC0tPgorICAgIDxoZWFkPgorICAgICAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgICAgICAgIDx0aXRsZT5BcGFjaGUgQW50IC0gQmluYXJ5IERpc3RyaWJ1dGlvbnM8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CisgICAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi4vaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj48aW1nIGFsdD0iQXBhY2hlIEFudCBsb2dvIiBib3JkZXI9IjAiIHNyYz0iLi4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJzZWFyY2hjYXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc2l6ZT0iMTUiIGlkPSJxdWVyeSIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4uL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuLi9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiI+CisgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNSI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI4IiB3aWR0aD0iOCIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj5Ib21lPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYi1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iIzRDNkM4RiI+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPlByb2plY3RzPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlByb2plY3RzCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL3Byb2plY3RzL2luZGV4Lmh0bWwiPldlbGNvbWU8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BbnQgTGlicmFyaWVzCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvaW5kZXguaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvY2hhcnRlci5odG1sIj5DaGFydGVyPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvcHJvcGVyLmh0bWwiPkFudCBMaWJyYXJpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vYW50bGlicy9zYW5kYm94Lmh0bWwiPlNhbmRib3ggQW50IExpYnJhcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VsIj5CaW5hcnkgRGlzdHJpYnV0aW9uczwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkl2eQorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9wcm9qZWN0cy9pdnkuaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pdnkvIj5Ib21lcGFnZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5L2Rvd25sb2FkLmNnaSI+RGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2l2eS8iPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvbWVudS1sZWZ0LmdpZiI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkRvd25sb2FkaW5nIEFudGxpYnMiPjwvYT4KKyAgICAgIERvd25sb2FkaW5nIEFudGxpYnMKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VXNlIHRoZSBsaW5rcyBiZWxvdyB0byBkb3dubG9hZCBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQW50bGlicyBmcm9tCitvbmUgb2Ygb3VyIG1pcnJvcnMuICBJdCBpcyBnb29kIHByYWN0aWNlIHRvCis8YSBocmVmPSJbbG9jYXRpb25dI1ZlcmlmeSBSZWxlYXNlcyI+dmVyaWZ5IHRoZSBpbnRlZ3JpdHk8L2E+CitvZiB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzLCBlc3BlY2lhbGx5IGlmIHlvdSBhcmUgdXNpbmcgb25lIG9mIG91cgorbWlycm9yIHNpdGVzLiAgSW4gb3JkZXIgdG8gZG8gdGhpcyB5b3UgbXVzdCB1c2UgdGhlIHNpZ25hdHVyZXMgZnJvbQorb3VyIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzLyI+bWFpbiBkaXN0cmlidXRpb24KK2RpcmVjdG9yeTwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnRsaWJzIGFyZSBkaXN0cmlidXRlZCBhcyA8Y29kZT56aXA8L2NvZGU+LCA8Y29kZT50YXIuZ3o8L2NvZGU+IGFuZAorPGNvZGU+dGFyLmJ6MjwvY29kZT4gYXJjaGl2ZXMgLSB0aGUgY29udGVudHMgYXJlIHRoZSBzYW1lLiAgUGxlYXNlCitub3RlIHRoYXQgdGhlIDxjb2RlPnRhci4qPC9jb2RlPiBhcmNoaXZlcyBjb250YWluIGZpbGUgbmFtZXMgbG9uZ2VyCit0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBoYXZlIGJlZW4gY3JlYXRlZCB1c2luZyBHTlUgdGFyIGV4dGVuc2lvbnMuCitUaHVzIHRoZXkgbXVzdCBiZSB1bnRhcnJlZCB3aXRoIGEgR05VIGNvbXBhdGlibGUgdmVyc2lvbiBvZgorPGNvZGU+dGFyPC9jb2RlPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdSBkbyBub3Qgc2VlIHRoZSBmaWxlIHlvdSBuZWVkIGluIHRoZSBsaW5rcyBiZWxvdywgcGxlYXNlIHNlZQordGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzLyI+bWFzdGVyIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPiBvciwgcHJlZmVyYWJseSwgaXRzIDxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzLyI+bWlycm9yPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iTWlycm9yIj48L2E+CisgICAgICBNaXJyb3IKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+WW91IGFyZSBjdXJyZW50bHkgdXNpbmcgPGI+W3ByZWZlcnJlZF08L2I+LiAgSWYgeW91IGVuY291bnRlciBhCitwcm9ibGVtIHdpdGggdGhpcyBtaXJyb3IsIHBsZWFzZSBzZWxlY3QgYW5vdGhlciBtaXJyb3IuICBJZiBhbGwKK21pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YKK3RoZSBtaXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPgorT3RoZXIgbWlycm9yczogPHNlbGVjdCBuYW1lPSJQcmVmZXJyZWQiPgorW2lmLWFueSBodHRwXQorICBbZm9yIGh0dHBdPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIj5baHR0cF08L29wdGlvbj5bZW5kXQorW2VuZF0KK1tpZi1hbnkgZnRwXQorICBbZm9yIGZ0cF08b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj5bZW5kXQorW2VuZF0KK1tpZi1hbnkgYmFja3VwXQorICBbZm9yIGJhY2t1cF08b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXQorW2VuZF0KKzwvc2VsZWN0PgorPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSIgLz4KKzwvZm9ybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJDdXJyZW50IEFudGxpYiBSZWxlYXNlcyI+PC9hPgorICAgICAgQ3VycmVudCBBbnRsaWIgUmVsZWFzZXMKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZyI+Cis8ZGl2IGNsYXNzPSJsYWJlbCI+Tm90ZTwvZGl2PgorPGRpdiBjbGFzcz0iY29udGVudCI+VmVyeSByZWNlbnQgcmVsZWFzZXMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsCittaXJyb3JzIGZvciBhIGZldyBkYXlzLjwvZGl2PgorPC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj4KKzxkaXYgY2xhc3M9ImxhYmVsIj5UYXIgZmlsZXMgbWF5IHJlcXVpcmUgZ251IHRhciB0byBleHRyYWN0PC9kaXY+Cis8ZGl2IGNsYXNzPSJjb250ZW50Ij5UYXIgZmlsZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiBjb250YWluIGxvbmcgZmlsZSBuYW1lcywgYW5kIG1heQorIHJlcXVpcmUgZ251IHRhciB0byBkbyB0aGUgZXh0cmFjdGlvbi48L2Rpdj4KKzwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+Cis8bGk+QXBhY2hlIC5ORVQgQW50IExpYnJhcnkgMS4wCis8dWw+Cis8bGk+PGNvZGU+LnppcDwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzL2RvdG5ldC9iaW5hcmllcy9hcGFjaGUtYW50LWRvdG5ldC0xLjAtYmluLnppcCI+YXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi56aXA8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4uemlwLmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvYmluYXJpZXMvYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi56aXAuc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4uemlwLm1kNSI+TUQ1PC9hPl08L2xpPgorCis8bGk+PGNvZGU+LnRhci5nejwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzL2RvdG5ldC9iaW5hcmllcy9hcGFjaGUtYW50LWRvdG5ldC0xLjAtYmluLnRhci5neiI+YXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3o8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmd6LmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvYmluYXJpZXMvYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3ouc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmd6Lm1kNSI+TUQ1PC9hPl08L2xpPgorCis8bGk+PGNvZGU+LnRhci5iejI8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYW50bGlicy9kb3RuZXQvYmluYXJpZXMvYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuYnoyIj5hcGFjaGUtYW50LWRvdG5ldC0xLjAtYmluLnRhci5iejI8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmJ6Mi5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmJ6Mi5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvYmluYXJpZXMvYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuYnoyLm1kNSI+TUQ1PC9hPl08L2xpPgorPC91bD4KKzwvbGk+CisKKzxsaT5BcGFjaGUgQW50VW5pdCAxLjAKKzx1bD4KKzxsaT48Y29kZT4uemlwPC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi56aXAiPmFwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnppcDwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L2JpbmFyaWVzL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnppcC5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi56aXAuc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi56aXAubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmd6PC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi50YXIuZ3oiPmFwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnRhci5nejwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L2JpbmFyaWVzL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnRhci5nei5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi50YXIuZ3ouc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi50YXIuZ3oubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmJ6MjwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzL2FudHVuaXQvYmluYXJpZXMvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1iaW4udGFyLmJ6MiI+YXBhY2hlLWFudC1hbnR1bml0LTEuMC1iaW4udGFyLmJ6MjwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L2JpbmFyaWVzL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnRhci5iejIuYXNjIj5QR1A8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2FudHVuaXQvYmluYXJpZXMvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1iaW4udGFyLmJ6Mi5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L2JpbmFyaWVzL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnRhci5iejIubWQ1Ij5NRDU8L2E+XTwvbGk+Cis8L3VsPgorPC9saT4KKzwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iVmVyaWZ5IFJlbGVhc2VzIj48L2E+CisgICAgICBWZXJpZnkgUmVsZWFzZXMKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SXQgaXMgZXNzZW50aWFsIHRoYXQgeW91IHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkb3dubG9hZGVkCitmaWxlcyB1c2luZyB0aGUgUEdQIHNpZ25hdHVyZSBvciB0aGUgU0hBMSBvciBNRDUgY2hlY2tzdW1zLiAgVGhlCitjaGVja3N1bXMgYXJlIG5vdCBhcyBzdHJvbmcgaW5kaWNhdG9ycyBhcyB0aGUgUEdQIHNpZ25hdHVyZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBQR1Agc2lnbmF0dXJlcyBjYW4gYmUgdmVyaWZpZWQgdXNpbmcgUEdQIG9yIEdQRy4gIEZpcnN0Citkb3dubG9hZCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L0tFWVMiPktFWVM8L2E+CithcyB3ZWxsIGFzIHRoZSA8Y29kZT5hc2M8L2NvZGU+IHNpZ25hdHVyZSBmaWxlIGZvciB0aGUgcGFydGljdWxhcgorZGlzdHJpYnV0aW9uLiAgTWFrZSBzdXJlIHlvdSBnZXQgdGhlc2UgZmlsZXMgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvIj5tYWluIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPiwgcmF0aGVyIHRoYW4gZnJvbSBhIG1pcnJvci4gVGhlbiB2ZXJpZnkgdGhlIHNpZ25hdHVyZXMKK3VzaW5nPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48Y29kZT4KKyUgcGdwayAtYSBLRVlTPGJyIC8+CislIHBncHYgYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3ouYXNjPGJyIC8+Cis8L2NvZGU+Cis8ZW0+b3I8L2VtPjxiciAvPgorPGNvZGU+CislIHBncCAta2EgS0VZUzxiciAvPgorJSBwZ3AgYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3ouYXNjPGJyIC8+Cis8L2NvZGU+Cis8ZW0+b3I8L2VtPjxiciAvPgorPGNvZGU+CislIGdwZyAtLWltcG9ydCBLRVlTPGJyIC8+CislIGdwZyAtLXZlcmlmeSBhcGFjaGUtYW50LWRvdG5ldC0xLjAtYmluLnRhci5nei5hc2MKKzwvY29kZT48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdmVyaWZ5IHRoZSBjaGVja3N1bXMgb24gdGhlIGZpbGVzLiAgVW5peAorcHJvZ3JhbXMgY2FsbGVkIDxjb2RlPm1kNTwvY29kZT4vPGNvZGU+c2hhMTwvY29kZT4gb3IKKzxjb2RlPm1kNXN1bTwvY29kZT4vPGNvZGU+c2hhMXN1bTwvY29kZT4gYXJlIGluY2x1ZGVkIGluIG1hbnkgdW5peAorZGlzdHJpYnV0aW9ucy4gIDxjb2RlPipzdW08L2NvZGU+IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleHR1dGlscy90ZXh0dXRpbHMuaHRtbCI+R05VCitUZXh0dXRpbHM8L2E+LiAgV2luZG93cyB1c2VycyBjYW4gZ2V0IGJpbmFyeSBtZDUgcHJvZ3JhbXMgZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LmZvdXJtaWxhYi5jaC9tZDUvIj5oZXJlPC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS8iPmhlcmU8L2E+LiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zbGF2YXNvZnQuY29tL2ZzdW0vIj5mc3VtPC9hPiBzdXBwb3J0cyBNRDUgYW5kCitTSEExLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2UgaGlnaGx5IHJlY29tbWVuZCB0byB2ZXJpZnkgdGhlIFBHUCBzaWduYXR1cmUsIHRob3VnaC48L3A+CisgICAgICAgICAgICAgICAgCisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgICAgICAgIDxwIGNsYXNzPSJjb3B5cmlnaHQiPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhLS0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC53cml0ZSgiIC0gIisiTGFzdCBQdWJsaXNoZWQ6ICIgKyBkb2N1bWVudC5sYXN0TW9kaWZpZWQpOworICAgICAgICAgICAgICAvLyAgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9wPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvYW50bGlicy9jaGFydGVyLmh0bWwgYi90cnVuay9kb2NzL2FudGxpYnMvY2hhcnRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDczZDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2FudGxpYnMvY2hhcnRlci5odG1sCkBAIC0wLDAgKzEsMzQ1IEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBBbnQgTGlicmFyaWVzIC0gQ2hhcnRlcjwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CisgICAgICAgIDxzY3JpcHQgc3JjPSIuLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIuLi9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgb25zdWJtaXQ9InEudmFsdWUgPSBxdWVyeS52YWx1ZSArICcgc2l0ZTphbnQuYXBhY2hlLm9yZyciIGFjdGlvbj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWFyY2giIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSIjNEM2QzhGIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPjxpbWcgaGVpZ2h0PSIxMCIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InNlYXJjaGNhcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJxIiB0eXBlPSJoaWRkZW4iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICB0aGUgQXBhY2hlIEFudCBzaXRlCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4uL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9Im5vbiBzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNGVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPkhvbWU8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+UHJvamVjdHM8L2I+PC9mb250PjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsdWViYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ibWVudWNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdHMKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vcHJvamVjdHMvaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkFudCBMaWJyYXJpZXMKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vYW50bGlicy9pbmRleC5odG1sIj5JbnRyb2R1Y3Rpb248L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vYW50bGlicy9jaGFydGVyLmh0bWwiPkNoYXJ0ZXI8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vYW50bGlicy9wcm9wZXIuaHRtbCI+QW50IExpYnJhcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL3NhbmRib3guaHRtbCI+U2FuZGJveCBBbnQgTGlicmFyaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkl2eQorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9wcm9qZWN0cy9pdnkuaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pdnkvIj5Ib21lcGFnZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5L2Rvd25sb2FkLmNnaSI+RGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2l2eS8iPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvbWVudS1sZWZ0LmdpZiI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+QW50IExpYnJhcmllcyAtIENoYXJ0ZXI8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkNoYXJ0ZXIiPjwvYT4KKyAgICAgIENoYXJ0ZXIKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QmVsb3cgaXMgdGhlIHRleHQgb2YgdGhlIHByb3Bvc2FsIHRoYXQgaGFzIGJlZW4gYWNjZXB0ZWQgYnkKKyAgICAgIHRoZSBBbnQgUE1DLiAgRnVydGhlciBhbWVuZG1lbnRzIGFyZSBleHBlY3RlZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorUHJvcG9zYWwgdG8gQ3JlYXRlIGEgQW50LUxpYnJhcmllcyBTdWItUHJvamVjdCBpbiBBcGFjaGUgQW50Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKDApIHJhdGlvbmFsZQorCitBbnQgaXRzZWxmIGhhcyBhY2N1bXVsYXRlZCBsb3RzIGFuZCBsb3RzIG9mIHRhc2tzIG92ZXIgdGltZS4gU28gbWFueSwKK3RoYXQgQW50IGRldmVsb3BlcnMgaGF2ZSBiZWNvbWUgcmVsdWN0YW50IHRvIGFkZGluZyBuZXcKK3Rhc2suIEZ1cnRoZXJtb3JlIGFueSBuZXcgdGFzayBpbiBBbnQgd291bGQgYmUgdGllZCB0byBBbnQncyByZWxlYXNlCitzY2hlZHVsZSB3aGljaCBpcyB0b28gc2xvdyBmb3IgYSB0aHJpdmluZywgZnJlc2ggcGllY2Ugb2YgY29kZS4KKworVGhlIHByb3Bvc2FsIGFsbG93cyBBbnQgdGFza3MgYW5kIHR5cGVzIHRvIGJlIGRldmVsb3BlZCB1bmRlciB0aGUgQW50Cit1bWJyZWxsYSBieSBBbnQgZGV2ZWxvcGVycyBidXQgaGF2ZSBtdWNoIHNob3J0ZXIgcmVsZWFzZSBjeWNsZXMgdGhhbgorQW50IGl0c2VsZi4gSW4gYWRkaXRpb24gaXQgd291bGQgbmV3IGNvbW1pdHRlcnMgd2hvIHdvdWxkIGhhdmUgY29tbWl0CithY2Nlc3MgdG8gYSBzaW5nbGUgQW50IGxpYnJhcnkgaW5zdGVhZCBvZiB0aGUgd2hvbGUgb2YgQW50LgorCisoMSkgc2NvcGUgb2YgdGhlIHN1YnByb2plY3QKKworVGhlIHN1YnByb2plY3Qgc2hhbGwgY3JlYXRlIGFuZCBtYWludGFpbiBsaWJyYXJpZXMgb2YgQW50IHRhc2tzIGFuZAordHlwZXMuIEVhY2ggbGlicmFyeSB3aWxsIGJlIG1hbmFnZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBBbnQKK3Byb2plY3QgaXRzZWxmLCB0aGUgUE1DIGlzIHVsdGltYXRlbHkgcmVzcG9uc2libGUgZm9yIGl0LgorCitDb21tb24gSmF2YSBsaWJyYXJpZXMgdGhhdCBvbmx5IGhhcHBlbiB0byBwcm92aWRlIEFudCB0YXNrcyBhcyB3ZWxsCithcmUgb3V0IG9mIHNjb3BlIG9mIHRoZSBzdWJwcm9qZWN0LiBQcm92aWRpbmcgdGhlIHRhc2tzIG9yIHR5cGVzIGhhcwordG8gYmUgdGhlIHByaW1hcnkgZ29hbCBvZiB0aGUgbGlicmFyeS4KKworVG8gZnVydGhlciB0aGlzIGdvYWwsIHRoZSBzdWJwcm9qZWN0IHNoYWxsIGFsc28gaG9zdCBhIHdvcmtwbGFjZSBmb3IKK0FudCBjb21taXR0ZXJzLgorCisoMS41KSBpbnRlcmFjdGlvbiB3aXRoIG90aGVyIHN1YnByb2plY3RzCisKKygxLjUuMSkgdGhlIHNhbmRib3gKKworVGhlIHN1YnByb2plY3Qgd2lsbCBob3N0IGEgU1ZOIHJlcG9zaXRvcnkgYXZhaWxhYmxlIHRvIGFsbCBBbnQKK2NvbW1pdHRlcnMgYXMgYSB3b3JrcGxhY2UgZm9yIG5ldyBBbnQgbGlicmFyaWVzLgorCitCZWZvcmUgYSBsaWJyYXJ5IGNhbiBoYXZlIGEgcHVibGljIHJlbGVhc2UgaXQgaGFzIHRvIGdldCBwcm9tb3RlZCB0bwordGhlICZxdW90O3Byb3BlciZxdW90OyBBbnQgbGlicmFyaWVzIHN1YnByb2plY3QuIFRoaXMgYWxzbyBtZWFucyBpdCBoYXMgdG8gbWF0Y2gKK3RoZSByZXF1aXJlbWVudHMgb2YgYW4gQW50IGxpYnJhcnkgYXMgZGVmaW5lZCBpbiBzZWN0aW9uICg0KSB1bmRlcgorR3VpZGVsaW5lcyBiZWxvdy4KKworVGhlIHN0YXR1cyBvZiBhbnkgbGlicmFyeSBkZXZlbG9wZWQgaW4gdGhlIHNhbmRib3ggc2hhbGwgYmUgcmV2aWV3ZWQKK2FmdGVyIHNpeCBtb250aHMgYW5kIHRoZSBsaWJyYXJ5IGdldHMgZWl0aGVyIHByb21vdGVkIG9yIHJlbW92ZWQgLSBvcgoraXQgaGFzIHRvIGJlIHJlLWV2YWx1YXRlZCBhZnRlciBhbm90aGVyIHNpeCBtb250aHMuCisKKygyKSBpZGVudGlmeSB0aGUgaW5pdGlhbCBzb3VyY2UgZnJvbSB3aGljaCB0aGUgc3VicHJvamVjdCBpcyB0byBiZSBwb3B1bGF0ZWQKKworU29tZSBBbnQgY29tbWl0dGVycyBoYXZlIGRldmVsb3BlZCB0YXNrcyBvciBsaWJyYXJpZXMgaW5zaWRlIG9mIHRoZQorQW50IENWUyBtb2R1bGUgdW5kZXIgdGhlIHByb3Bvc2FsL3NhbmRib3ggZGlyZWN0b3J5LiBDb21taXR0ZXJzIGFyZQorZnJlZSB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGUgbmV3IHNhbmRib3ggc3VicHJvamVjdCBvciByZW1vdmUgdGhlbQorY29tcGxldGVseS4KKworTGlicmFyaWVzIGV4cGVjdGVkIHRvIG1vdmUgdG8gdGhlIHNhbmRib3ggc3VicHJvamVjdCBpbml0aWFsbHkgYXJlCisKKyogdGhlIC5ORVQgdGFza3MgdW5kZXIgcHJvcG9zYWwvc2FuZGJveC9kb3RuZXQKKworKiB0aGUgU3VidmVyc2lvbiBzdXBwb3J0IHRhc2tzIHVuZGVyIHByb3Bvc2FsL3NhbmRib3gvc3ZuCisKKygzKSBpZGVudGlmeSB0aGUgaW5pdGlhbCBBcGFjaGUgcmVzb3VyY2VzIHRvIGJlIGNyZWF0ZWQKKworKDMuMSkgbWFpbGluZyBsaXN0KHMpCisKK05vbmUuIEF0IGxlYXN0IGF0IHRoZSBiZWdpbm5pbmcgd2UgZG9uJ3QgZXhwZWN0IHRvbyBtdWNoIHRyYWZmaWMgYW5kCit0aGUgZXhpc3RpbmcgbWFpbGluZyBsaXN0cyBvZiB0aGUgQW50IHByb2plY3RzIHdpbGwgYmUgdXNlZC4KKworKDMuMikgU1ZOIHJlcG9zaXRvcmllcworCitDcmVhdGUgJmx0O2h0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50LyZndDsKKworRXhwZWN0ZWQgYXJlIHN1Yi1kaXJlY3RvcmllcworCithbnRsaWJzLworICAgfAorICAgLS0tLS0mZ3Q7IHByb3Blci8KKyAgIHwgICAgICAgIHwKKyAgIHwgICAgICAgIC0tLS0tJmd0OyBsaWJyYXJ5MQorICAgfCAgICAgICAgfCAgICAgICAgfAorICAgfCAgICAgICAgfCAgICAgICAgLS0tLS0tLS0tLS0mZ3Q7IHRydW5rCisgICB8ICAgICAgICB8ICAgICAgICAtLS0tLS0tLS0tLSZndDsgdGFncworICAgfCAgICAgICAgfCAgICAgICAgLS0tLS0tLS0tLS0mZ3Q7IGJyYW5jaGVzCisgICB8ICAgICAgICAtLS0tLSZndDsgbGlicmFyeTIKKyAgIHwgICAgICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tJmd0OyB0cnVuaworICAgfCAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0mZ3Q7IHRhZ3MKKyAgIHwgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tJmd0OyBicmFuY2hlcworICAgfAorICAgLS0tLS0mZ3Q7IHNhbmRib3gvCisgICAgICAgICAgICB8CisgICAgICAgICAgICAtLS0tLSZndDsgbGlicmFyeTEKKyAgICAgICAgICAgIHwgICAgICAgIHwKKyAgICAgICAgICAgIHwgICAgICAgIC0tLS0tLS0tLS0tJmd0OyB0cnVuaworICAgICAgICAgICAgfCAgICAgICAgLS0tLS0tLS0tLS0mZ3Q7IHRhZ3MKKyAgICAgICAgICAgIHwgICAgICAgIC0tLS0tLS0tLS0tJmd0OyBicmFuY2hlcworICAgICAgICAgICAgLS0tLS0mZ3Q7IGxpYnJhcnkyCisgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLSZndDsgdHJ1bmsKKyAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tJmd0OyB0YWdzCisgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLSZndDsgYnJhbmNoZXMKKworQW5kIHBvdGVudGlhbGx5IGNvbGxlY3Rpb25zIG9mIGFsbC10cnVua3MgdXNpbmcgc3ZuOmV4dGVybmFsIGFzIHNob3duCitieSB0aGUgY3VycmVudCBKYWthcnRhIENvbW1vbnMgc3RydWN0dXJlLgorCisoMy4zKSBCdWd6aWxsYQorCitOZXcgY29tcG9uZW50cyB1bmRlciBwcm9kdWN0ICZxdW90O0FudCZxdW90OyBmb3IgZWFjaCBuZXcgbGlicmFyeS4KKworKDQpIGlkZW50aWZ5IHRoZSBpbml0aWFsIHNldCBvZiBjb21taXR0ZXJzCisKK0FsbCBjdXJyZW50IEFudCBQTUMgbWVtYmVycyBwbHVzIHRoZSBhY3RpdmUgQW50IGNvbW1pdHRlcnMgd2hvIGFyZSBub3QKK1BNQyBtZW1iZXJzIHlldC4KKworR3VpZGVsaW5lcworLS0tLS0tLS0tLQorCitOb3RlOgorCisqIGlzLCBoYXMsIHdpbGwsIHNoYWxsLCBtdXN0IC0gcmVxdWlyZWQuCisKKyogbWF5LCBzaG91bGQsIGFyZSBlbmNvdXJhZ2VkIC0gb3B0aW9uYWwgYnV0IHJlY29tbWVuZGVkLgorCisoMSkgVGhlIHByaW1hcnkgdW5pdCBvZiByZXVzZSBhbmQgcmVsZWFzZSBpcyB0aGUgQW50IGxpYnJhcnkuCisKKygyKSBUaGUgbGlicmFyeSBpcyBub3QgYSBmcmFtZXdvcmsgb3IgYSBnZW5lcmFsIGxpYnJhcnkgYnV0IGEKKyAgICBjb2xsZWN0aW9uIG9mIEFudCB0YXNrcyBhbmQgdHlwZXMuCisKKygzKSBFYWNoIGxpYnJhcnkgbXVzdCBoYXZlIGEgY2xlYXJseSBkZWZpbmVkIHB1cnBvc2UsIHNjb3BlLCBhbmQgQVBJLgorCisoNCkgRWFjaCBsaWJyYXJ5IGlzIHRyZWF0ZWQgYXMgYSBwcm9kdWN0IGluIGl0cyBvd24gcmlnaHQuCisKKyg0LjEpIEVhY2ggbGlicmFyeSBoYXMgaXRzIG93biBzdGF0dXMgZmlsZSwgcmVsZWFzZSBzY2hlZHVsZSwgdmVyc2lvbgorICAgICAgbnVtYmVyLCBRQSB0ZXN0cywgZG9jdW1lbnRhdGlvbiwgYnVnIGNhdGVnb3J5LCBhbmQgaW5kaXZpZHVhbAorICAgICAgSkFSLgorCisoNC4yKSBFYWNoIGxpYnJhcnkgbXVzdCBjbGVhcmx5IHNwZWNpZnkgYW55IGV4dGVybmFsIGRlcGVuZGVuY2llcywKKyAgICAgIGluY2x1ZGluZyBhbnkgb3RoZXIgbGlicmFyaWVzLCBhbmQgdGhlIGVhcmxpZXN0IEpESyB2ZXJzaW9uCisgICAgICByZXF1aXJlZC4KKworKDQuMykgRWFjaCBsaWJyYXJ5IG11c3QgbWFpbnRhaW4gYSBsaXN0IG9mIGl0cyBhY3RpdmUgY29tbWl0dGVycyBpbgorICAgICAgaXRzIHN0YXR1cyBmaWxlLgorCisoNC40KSBUaGUgbGlicmFyaWVzIHNob3VsZCB1c2UgYSBzdGFuZGFyZCBzY2hlbWUgZm9yIHZlcnNpb25pbmcsIFFBCisgICAgICB0ZXN0cywgYW5kIGRpcmVjdG9yeSBsYXlvdXRzLCBhbmQgYSBjb21tb24gZm9ybWF0IGZvcgorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQgQW50IGJ1aWxkIGZpbGVzLgorCisoNC40KSBFYWNoIGxpYnJhcnkgd2lsbCBiZSBob3N0ZWQgb24gaXRzIG93biBwYWdlIG9uIHRoZSBzdWJwcm9qZWN0CisgICAgICBXZWIgc2l0ZSwgYW5kIHdpbGwgYWxzbyBiZSBpbmRleGVkIGluIGEgbWFzdGVyIGRpcmVjdG9yeS4KKworKDQuNSkgVm9sdW50ZWVycyBiZWNvbWUgY29tbWl0dGVycyB0byB0aGlzIHN1YnByb2plY3QgaW4gdGhlIHNhbWUgd2F5CisgICAgICB0aGV5IGFyZSBlbnRlcmVkIHRvIGFueSBBcGFjaGUgc3VicHJvamVjdC4KKworICAgICAgT25jZSB0aGUgcmVxdWlyZWQgaW5mcmFzdHJ1Y3R1cmUgaXMgaW4gcGxhY2UsIHZvbHVudGVlcnMgbWF5CisgICAgICBiZWNvbWUgY29tbWl0dGVycyBmb3IgYSBzaW5nbGUgQW50IGxpYnJhcnkgb25seS4KKworKDQuNikgTmV3IGxpYnJhcmllcyBtYXkgYmUgcHJvcG9zZWQgdG8gdGhlIEFudCBkZXYgbWFpbGluZyBsaXN0LiBUbyBiZQorICAgICAgYWNjZXB0ZWQsIGEgbGlicmFyeSBwcm9wb3NhbCBtdXN0IHJlY2VpdmUgbWFqb3JpdHkgYXBwcm92YWwgb2YKKyAgICAgIHRoZSBBbnQgUE1DLiBQcm9wb3NhbHMgYXJlIHRvIGlkZW50aWZ5IHRoZSByYXRpb25hbGUgZm9yIHRoZQorICAgICAgbGlicmFyeSwgaXRzIHNjb3BlLCB0aGUgaW5pdGlhbCBzb3VyY2UgZnJvbSB3aGljaCB0aGUgbGlicmFyeSBpcworICAgICAgdG8gYmUgY3JlYXRlZCwgYW5kIHRoZSBpbml0aWFsIHNldCBvZiBjb21taXR0ZXJzLgorCisoNC43KSBBcyBzdGF0ZWQgaW4gdGhlIEFudCBndWlkZWxpbmVzLCBhbiBhY3Rpb24gcmVxdWlyaW5nIG1ham9yaXR5CisgICAgICBhcHByb3ZhbCBtdXN0IHJlY2VpdmUgYXQgbGVhc3QgMyBiaW5kaW5nICsxIHZvdGVzIGFuZCBtb3JlICsxCisgICAgICB2b3RlcyB0aGFuIC0xIHZvdGVzLgorCisoNC44KSBFYWNoIEFudCBsaWJyYXJ5IG5lZWRzIGF0IGxlYXN0IHRocmVlIGNvbW1pdHRlcnMsIGF0IGxlYXN0IG9uZQorICAgICAgb2YgdGhlbSBoYXMgdG8gYmUgYW4gQW50IFBNQyBtZW1iZXIuCisgICAgICA8L3ByZT4KKyAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9hbnRsaWJzL2RvdG5ldC9pbmRleC5odG1sIGIvdHJ1bmsvZG9jcy9hbnRsaWJzL2RvdG5ldC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhMWZmMzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2FudGxpYnMvZG90bmV0L2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzMDkgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIC5ORVQgQW50IExpYnJhcnk8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CisgICAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi4vLi4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi4vLi4vaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj48aW1nIGFsdD0iQXBhY2hlIEFudCBsb2dvIiBib3JkZXI9IjAiIHNyYz0iLi4vLi4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJzZWFyY2hjYXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc2l6ZT0iMTUiIGlkPSJxdWVyeSIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4uLy4uL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuLi8uLi9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiI+CisgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNSI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI4IiB3aWR0aD0iOCIgc3JjPSIuLi8uLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj5Ib21lPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL3RhYi1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi4vLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iIzRDNkM4RiI+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPlByb2plY3RzPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlByb2plY3RzCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uL3Byb2plY3RzL2luZGV4Lmh0bWwiPldlbGNvbWU8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BbnQgTGlicmFyaWVzCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uL2FudGxpYnMvaW5kZXguaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uL2FudGxpYnMvY2hhcnRlci5odG1sIj5DaGFydGVyPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uL2FudGxpYnMvcHJvcGVyLmh0bWwiPkFudCBMaWJyYXJpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vYW50bGlicy9zYW5kYm94Lmh0bWwiPlNhbmRib3ggQW50IExpYnJhcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3NyY2Rvd25sb2FkLmNnaSI+U291cmNlIERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5JdnkKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vcHJvamVjdHMvaXZ5Lmh0bWwiPkludHJvZHVjdGlvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5LyI+SG9tZXBhZ2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS9kb3dubG9hZC5jZ2kiPkRpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9pdnkvIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxjZW50ZXI+CisgICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9hZHMvYnV0dG9uYmFyLmh0bWwiIC0tPgorICAgIDwvY2VudGVyPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiBsZWZ0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPi5ORVQgQW50IExpYnJhcnk8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9Ii5ORVQgQW50IExpYnJhcnkgMS4wIj48L2E+CisgICAgICAuTkVUIEFudCBMaWJyYXJ5IDEuMAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+Tm92ZW1iZXIgNiwgMjAwNiAtIEFwYWNoZSAuTkVUIEFudCBMaWJyYXJ5IDEuMAorICAgICAgQXZhaWxhYmxlPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBhY2hlIC5ORVQgQW50IExpYnJhcnkgMS4wIGlzIG5vdyBhdmFpbGFibGUgZm9yCisgICAgICBkb3dubG9hZCBhcyA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPmJpbmFyeTwvYT4KKyAgICAgIG9yIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3NyY2Rvd25sb2FkLmNnaSI+c291cmNlPC9hPgorICAgICAgcmVsZWFzZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iSWRlYSI+PC9hPgorICAgICAgSWRlYQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGxpYnJhcnkgZG9lc24ndCBzdHJpdmUgdG8gcmVwbGFjZSBOQW50IG9yIE1TQnVpbGQsIGl0cworICAgICAgbWFpbiBwdXJwb3NlIGlzIHRvIGhlbHAgdGhvc2Ugb2YgdXMgd2hvIHdvcmsgb24gcHJvamVjdHMKKyAgICAgIGNyb3NzaW5nIHBsYXRmb3JtIGJvdW5kYXJpZXMuICBXaXRoIHRoaXMgbGlicmFyeSB5b3UgY2FuIHVzZSBBbnQKKyAgICAgIHRvIGJ1aWxkIGFuZCB0ZXN0IHRoZSBKYXZhIGFzIHdlbGwgYXMgdGhlIC5ORVQgcGFydHMgb2YgeW91cgorICAgICAgcHJvamVjdC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgbGlicmFyeSBwcm92aWRlcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUKKyAgICAgIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gdGFzayB0YWlsb3JlZCB0byBydW4gLk5FVCBleGVjdXRhYmxlcy4KKyAgICAgIE9uIFdpbmRvd3MgaXQgd2lsbCBhc3N1bWUgdGhlIE1pY3Jvc29mdCBmcmFtZXdvcmsgaXMgYXJvdW5kIGFuZAorICAgICAgcnVuIHRoZSBleGVjdXRhYmxlIGRpcmVjdGx5LCB3aGlsZSBpdCB3aWxsIGludm9rZSBNb25vIG9uIGFueQorICAgICAgb3RoZXIgcGxhdGZvcm0uICBPZiBjb3Vyc2UgeW91IGNhbiBvdmVycmlkZSB0aGVzZQorICAgICAgYXNzdW1wdGlvbnMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5CYXNlZCBvbiB0aGlzIGEgZmV3IHRhc2tzIHRvIHJ1biB3ZWxsIGtub3duIC5ORVQgdXRpbGl0aWVzCisgICAgICBmcm9tIHdpdGhpbiBBbnQgYXJlIHByb3ZpZGVkLCBuYW1lbHkgdGFza3MgdG8gcnVuIDxhIGhyZWY9Imh0dHA6Ly93d3cubnVuaXQub3JnLyI+TlVuaXQ8L2E+LCA8YSBocmVmPSJodHRwOi8vbmFudC5zZi5uZXQvIj5OQW50PC9hPiwgPGEgaHJlZj0iaHR0cDovL2ZvcnVtcy5taWNyb3NvZnQuY29tL01TRE4vU2hvd0ZvcnVtLmFzcHg/Rm9ydW1JRD0yNyZhbXA7U2l0ZUlEPTEiPk1TQnVpbGQ8L2E+CisgICAgICBhbmQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93aXguc2YubmV0LyI+V2l4PC9hPiB0b29sa2l0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGluaXRpYWwgLk5FVCB0YXNrcyBvZiBBbnQgKGNvbXBpbGVyIHRhc2tzIGZvciBDIywgSiMgYW5kIFZCLk5FVAorICAgICAgZm9yIGV4YW1wbGUpIGhhdmUgYWxzbyBiZWVuIG1vdmVkIHRvIHRoaXMgQW50bGliIGFuZCB3aWxsIHNlZSBmdXJ0aGVyCisgICAgICBkZXZlbG9wbWVudCBoZXJlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJUYXNrcyI+PC9hPgorICAgICAgVGFza3MKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iZG90bmV0ZXhlYyI+PC9hPgorICAgICAgICBkb3RuZXRleGVjCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UnVucyBhIC5ORVQgZXhlY3V0YWJsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0ibnVuaXQiPjwvYT4KKyAgICAgICAgbnVuaXQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5SdW5zIE5Vbml0IHRlc3RzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJuYW50Ij48L2E+CisgICAgICAgIG5hbnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JbnZva2VzIE5BbnQsIGVpdGhlciBvbiBhbiBleHRlcm5hbCBmaWxlIG9yIGEgYnVpbGQgZmlsZQorICAgICAgICBzbmlwcGV0IGNvbnRhaW5lZCBpbnNpZGUgeW91ciBBbnQgYnVpbGQgZmlsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0ibXNidWlsZCI+PC9hPgorICAgICAgICBtc2J1aWxkCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SW52b2tlcyBNU0J1aWxkLCBlaXRoZXIgb24gYW4gZXh0ZXJuYWwgZmlsZSBvciBhIGJ1aWxkIGZpbGUKKyAgICAgICAgc25pcHBldCBjb250YWluZWQgaW5zaWRlIHlvdXIgQW50IGJ1aWxkIGZpbGUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IndpeCI+PC9hPgorICAgICAgICB3aXgKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JbnZva2VzIHRoZSBjYW5kbGUgYW5kIGxpZ2h0IGV4ZWN1dGFibGVzIG9mIHRoZSBXaVggdG9vbGtpdAorICAgICAgICAgIGluIG9yZGVyIHRvIGNyZWF0ZSBNU0kgaW5zdGFsbGVycyBmcm9tIHdpdGhpbiBBbnQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iRXhhbXBsZXMiPjwvYT4KKyAgICAgIEV4YW1wbGVzCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Im5hbnQiPjwvYT4KKyAgICAgICAgbmFudAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O3Byb2plY3QgeG1sbnM6ZG49JnF1b3Q7YW50bGliOm9yZy5hcGFjaGUuYW50LmRvdG5ldCZxdW90OyZndDsKKyAgJmx0O2RuOm5hbnQmZ3Q7CisgICAgJmx0O2J1aWxkJmd0OworICAgICAgJmx0O2VjaG8gbWVzc2FnZT0mcXVvdDtIZWxsbyB3b3JsZCZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9idWlsZCZndDsKKyAgJmx0Oy9kbjpuYW50Jmd0OworJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPnJ1bnMgTkFudCBvbiB0aGUgZW1iZWRkZWQgPGNvZGU+Jmx0O2VjaG8mZ3Q7PC9jb2RlPgorICAgICAgICB0YXNrLCBvdXRwdXQgbG9va3MgbGlrZTwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CitCdWlsZGZpbGU6IHRlc3QueG1sCitbZG46bmFudF0gTkFudCAwLjg1IChCdWlsZCAwLjg1LjE5MzIuMDsgcmMzOyAxNi4wNC4yMDA1KQorW2RuOm5hbnRdIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IEdlcnJ5IFNoYXcKK1tkbjpuYW50XSBodHRwOi8vbmFudC5zb3VyY2Vmb3JnZS5uZXQKK1tkbjpuYW50XSAKK1tkbjpuYW50XSBCdWlsZGZpbGU6IGZpbGU6Ly8vYzovRE9LVU1FfjEvU1RFRkFOfjEuQk9EL0xPS0FMRX4xL1RlbXAvYnVpbGQxMDU4NDUxNTU1LnhtbAorW2RuOm5hbnRdIFRhcmdldCBmcmFtZXdvcms6IE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayAxLjEKK1tkbjpuYW50XSAKK1tkbjpuYW50XSAgICAgIFtlY2hvXSBIZWxsbyB3b3JsZAorW2RuOm5hbnRdIAorW2RuOm5hbnRdIEJVSUxEIFNVQ0NFRURFRAorW2RuOm5hbnRdIAorW2RuOm5hbnRdIFRvdGFsIHRpbWU6IDAuMiBzZWNvbmRzLgorCitCVUlMRCBTVUNDRVNTRlVMCitUb3RhbCB0aW1lOiAyIHNlY29uZHM8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJtc2J1aWxkIj48L2E+CisgICAgICAgIG1zYnVpbGQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDtwcm9qZWN0IHhtbG5zOmRuPSZxdW90O2FudGxpYjpvcmcuYXBhY2hlLmFudC5kb3RuZXQmcXVvdDsmZ3Q7CisgICZsdDtkbjptc2J1aWxkJmd0OworICAgICZsdDtidWlsZCZndDsKKyAgICAgICZsdDtNZXNzYWdlIFRleHQ9JnF1b3Q7SGVsbG8gd29ybGQmcXVvdDsKKyAgICAgICAgeG1sbnM9JnF1b3Q7aHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2J1aWxkJmd0OworICAmbHQ7L2RuOm1zYnVpbGQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPnJ1bnMgTVNCdWlsZCBvbiB0aGUgZW1iZWRkZWQgPGNvZGU+Jmx0O01lc3NhZ2UmZ3Q7PC9jb2RlPgorICAgICAgICB0YXNrLCBvdXRwdXQgbG9va3MgbGlrZTwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CitCdWlsZGZpbGU6IHRlc3QueG1sCitbZG46bXNidWlsZF0gTWljcm9zb2Z0IChSKSBCdWlsZCBFbmdpbmUgVmVyc2lvbiAyLjAuNTA3MjcuNDIKK1tkbjptc2J1aWxkXSBbTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrLCBWZXJzaW9uIDIuMC41MDcyNy40Ml0KK1tkbjptc2J1aWxkXSBDb3B5cmlnaHQgKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDA1LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitbZG46bXNidWlsZF0gQnVpbGQgc3RhcnRlZCAxNS4xMi4yMDA1IDIwOjIxOjU2LgorW2RuOm1zYnVpbGRdIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitbZG46bXNidWlsZF0gUHJvamVjdCAmcXVvdDtjOlxEb2t1bWVudGUgdW5kIEVpbnN0ZWxsdW5nZW5cc3RlZmFuLmJvZGV3aWdcTG9rYWxlIEVpbnN0ZWxsdW5nZW5cVGVtcFxidWlsZDE1NDMzMTAxODUueG1sJnF1b3Q7IChkZWZhdWx0IHRhcmdldHMpOgorCitbZG46bXNidWlsZF0gVGFyZ2V0IGdlbmVyYXRlZC1ieS1hbnQ6CitbZG46bXNidWlsZF0gICAgIEhlbGxvIHdvcmxkCisKK1tkbjptc2J1aWxkXSBCdWlsZCBzdWNjZWVkZWQuCitbZG46bXNidWlsZF0gICAgIDAgV2FybmluZyhzKQorW2RuOm1zYnVpbGRdICAgICAwIEVycm9yKHMpCisKK1tkbjptc2J1aWxkXSBUaW1lIEVsYXBzZWQgMDA6MDA6MDAuMTAKKworQlVJTEQgU1VDQ0VTU0ZVTAorVG90YWwgdGltZTogMCBzZWNvbmRzCis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IS0tCisgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoIiAtICIrIkxhc3QgUHVibGlzaGVkOiAiICsgZG9jdW1lbnQubGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgLy8gIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvcD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2FudGxpYnMvaW5kZXguaHRtbCBiL3RydW5rL2RvY3MvYW50bGlicy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYmY5MzcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2FudGxpYnMvaW5kZXguaHRtbApAQCAtMCwwICsxLDE4OCBAQAorCisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgICAgICA8aHRtbCBsYW5nPSJlbiI+CisgICAgPCEtLSBHRU5FUkFURUQgRklMRSwgRE8gTk9UIEVESVQsIEVESVQgVEhFIFhNTCBGSUxFIElOIHhkb2NzIElOU1RFQUQhIC0tPgorICAgIDxoZWFkPgorICAgICAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgICAgICAgIDx0aXRsZT5BcGFjaGUgQW50IC0gVGhlIEFudCBMaWJyYXJpZXMgU3VicHJvamVjdDwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CisgICAgICAgIDxzY3JpcHQgc3JjPSIuLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIuLi9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgb25zdWJtaXQ9InEudmFsdWUgPSBxdWVyeS52YWx1ZSArICcgc2l0ZTphbnQuYXBhY2hlLm9yZyciIGFjdGlvbj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWFyY2giIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSIjNEM2QzhGIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPjxpbWcgaGVpZ2h0PSIxMCIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InNlYXJjaGNhcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJxIiB0eXBlPSJoaWRkZW4iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICB0aGUgQXBhY2hlIEFudCBzaXRlCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4uL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9Im5vbiBzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNGVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPkhvbWU8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+UHJvamVjdHM8L2I+PC9mb250PjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsdWViYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ibWVudWNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdHMKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vcHJvamVjdHMvaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkFudCBMaWJyYXJpZXMKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vYW50bGlicy9pbmRleC5odG1sIj5JbnRyb2R1Y3Rpb248L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vYW50bGlicy9jaGFydGVyLmh0bWwiPkNoYXJ0ZXI8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vYW50bGlicy9wcm9wZXIuaHRtbCI+QW50IExpYnJhcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL3NhbmRib3guaHRtbCI+U2FuZGJveCBBbnQgTGlicmFyaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkl2eQorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9wcm9qZWN0cy9pdnkuaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pdnkvIj5Ib21lcGFnZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5L2Rvd25sb2FkLmNnaSI+RGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2l2eS8iPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvbWVudS1sZWZ0LmdpZiI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+VGhlIEFudCBMaWJyYXJpZXMgU3VicHJvamVjdDwvaDE+CisgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iVGhlIEFudCBMaWJyYXJpZXMgU3VicHJvamVjdCI+PC9hPgorICAgICAgVGhlIEFudCBMaWJyYXJpZXMgU3VicHJvamVjdAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+QW50IExpYnJhcmllcyAtIG9yIEFudGxpYnMgZm9yIHNob3J0PC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2l0aCBBbnQgMS42LjAgYW5kIHRoZSBhbnQgbGlicmFyaWVzIGNvbmNlcHQgY3JlYXRpbmcKKyAgICAgIGxpYnJhcmllcyBvZiBBbnQgdGFza3MgdGhhdCBhcmUgZWFzeSB0byBnZXQgZHJvcHBlZCBpbnRvIGFuCisgICAgICBleGlzdGluZyBBbnQgaW5zdGFsbGF0aW9uIGhhcyBiZWNvbWUgZmFyIGVhc2llci48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBBbnQgTGlicmFyaWVzIHN1YnByb2plY3Qgd2FzIHN0YXJ0ZWQgYXMgYSBwbGFjZSB0bworICAgICAgZGV2ZWxvcCBzbWFsbCBsaWJyYXJpZXMgb2YgdGFza3MgdGhhdCBjYW4gZ2V0IHJlbGVhc2VkCisgICAgICBpbmRlcGVuZGVudCBvZiBBbnQncyByZWxlYXNlIHNjaGVkdWxlIC0gd2hpY2ggaXMgbmVjZXNzYXJ5IGZvcgorICAgICAgbmFzY2VudCBBbnQgdGFza3Mgc2luY2UgQW50J3Mgb3duIHJlbGVhc2Ugc2NoZWR1bGUgaGFzIGJlY29tZQorICAgICAgcmF0aGVyIHNsb3cgb3ZlciB0aW1lLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIHN1YnByb2plY3QgYWxzbyBvZmZlcnMgYSBzYW5kYm94IGFzIHBsYXlncm91bmQgZm9yIEFudAorICAgICAgY29tbWl0dGVycyB0byB0cnkgbmV3IGlkZWFzIGZvciB0YXNrcy48L3A+CisgICAgICAgICAgICAgICAgCisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgICAgICAgIDxwIGNsYXNzPSJjb3B5cmlnaHQiPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhLS0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC53cml0ZSgiIC0gIisiTGFzdCBQdWJsaXNoZWQ6ICIgKyBkb2N1bWVudC5sYXN0TW9kaWZpZWQpOworICAgICAgICAgICAgICAvLyAgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9wPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvYW50bGlicy9wcm9wZXIuaHRtbCBiL3RydW5rL2RvY3MvYW50bGlicy9wcm9wZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTMxNzMyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9hbnRsaWJzL3Byb3Blci5odG1sCkBAIC0wLDAgKzEsNDIxIEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBBbnQgTGlicmFyaWVzPC90aXRsZT4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAgICAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxwIGNsYXNzPSJuYXZwYXRoIj4KKyAgICAgICAgPHNjcmlwdCBzcmM9Ii4uL2JyZWFkY3J1bWJzLmpzIiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICAgIDwvcD4KKworICAgICAgPGRpdiBjbGFzcz0ibG9nb2JhciI+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBib3JkZXI9IjAiIGFsdD0iQXBhY2hlIEFudCBzaXRlIiBzcmM9Ii4uL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4uL2ltYWdlcy9wcm9qZWN0LWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlYXJjaCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IiM0QzZDOEYiPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGltZyBoZWlnaHQ9IjEwIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJTZWFyY2giIHZhbHVlPSJTZWFyY2giIHR5cGU9InN1Ym1pdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgICAgICAgICAgIHRoZSBBcGFjaGUgQW50IHNpdGUKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi4vaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgorICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0idGFiIGJhciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ibm9uIHNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS40ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iI0IyQzRFMCI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+SG9tZTwvZm9udD48L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYlNlbC1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiM0QzZDOEYiPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj48Yj5Qcm9qZWN0czwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWJTZWwtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0cworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9wcm9qZWN0cy9pbmRleC5odG1sIj5XZWxjb21lPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+QW50IExpYnJhcmllcworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL2luZGV4Lmh0bWwiPkludHJvZHVjdGlvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL2NoYXJ0ZXIuaHRtbCI+Q2hhcnRlcjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VsIj5BbnQgTGlicmFyaWVzPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL3NhbmRib3guaHRtbCI+U2FuZGJveCBBbnQgTGlicmFyaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkl2eQorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9wcm9qZWN0cy9pdnkuaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pdnkvIj5Ib21lcGFnZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5L2Rvd25sb2FkLmNnaSI+RGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2l2eS8iPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvbWVudS1sZWZ0LmdpZiI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+QW50IExpYnJhcmllczwvaDE+CisgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQW50IExpYnJhcmllcyI+PC9hPgorICAgICAgQW50IExpYnJhcmllcworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJhbnR1bml0IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRVbml0IC0gVW5pdCBUZXN0IEZyYW1ld29yayBmb3IgQW50IFRhc2tzIj48L2E+CisgICAgICAgIEFudFVuaXQgLSBVbml0IFRlc3QgRnJhbWV3b3JrIGZvciBBbnQgVGFza3MKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnRVbml0IGJvcnJvd3MgaWRlYXMgZnJvbSBKVW5pdCAzLnggYW5kIHRoZSAmbHQ7anVuaXQmZ3Q7CisgICAgICAgIHRhc2suICBJdCBwcm92aWRlcyBhIHRhc2sgdGhhdCBydW5zIGJ1aWxkIGZpbGVzIGFzIHVuaXQgdGVzdHMKKyAgICAgICAgYXMgd2VsbCBhcyBhIG51bWJlciBvZiBhc3NlcnRpb24gdGFza3MgdG8gc3VwcG9ydCB0aGUKKyAgICAgICAgaWRlYS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRm9ycmVzdFRhYmxlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEhvbWVwYWdlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Ii4vYW50dW5pdC9pbmRleC5odG1sIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9hbnR1bml0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTVk4gVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9hbnRsaWJzL2FudHVuaXQvdHJ1bmsvIj5odHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvYW50bGlicy9hbnR1bml0L3RydW5rLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBWaWV3U1ZOOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvYW50bGlicy9hbnR1bml0L3RydW5rLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9hbnRsaWJzL2FudHVuaXQvdHJ1bmsvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCBjb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjcueAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFkZGVkIHRvIHNhbmRib3g6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMjAwNS0wNC0xNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFByb21vdGVkIGZyb20gc2FuZGJveDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAyMDA1LTExLTIyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGF0ZXN0IFJlbGVhc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS4wIHJlbGVhc2VkIG9uIEphbnVhcnkgOCwgMjAwNworICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJkb3RuZXQiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkRvdE5ldCAtIEltcHJvdmVkIFN1cHBvcnQgZm9yIC5ORVQgcHJvamVjdHMiPjwvYT4KKyAgICAgICAgRG90TmV0IC0gSW1wcm92ZWQgU3VwcG9ydCBmb3IgLk5FVCBwcm9qZWN0cworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlByb3ZpZGVzIGEgc2ltcGxlIGluZnJhc3RydWN0dXJlIHRvIGV4ZWN1dGUgLk5FVAorICAgICAgICBhcHBsaWNhdGlvbnMgZnJvbSB3aXRoaW4gQW50IGZvciBkaWZmZXJlbnQgVk1zIHNvIHRoYXQgdGhlCisgICAgICAgIHVzZXIgZG9lc24ndCBoYXZlIHRvIGNoYW5nZSB0aGUgYnVpbGQgZmlsZSB3aGVuIHNoZSB3YW50cyB0bworICAgICAgICBydW4gTW9ubyBvbiBMaW51eCBhbmQgTWljcm9zb2Z0J3MgVk0gb24gV2luZG93cy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFsc28gY29udGFpbnMgJmx0O25hbnQmZ3Q7LCAmbHQ7bnVuaXQmZ3Q7IGFuZAorICAgICAgICAmbHQ7bXNidWlsZCZndDsgdGFza3MgYW5kIGFuIHVudGVzdGVkICZsdDt3aXgmZ3Q7IHRhc2tzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJGb3JyZXN0VGFibGUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgSG9tZXBhZ2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iLi9kb3RuZXQvaW5kZXguaHRtbCI+aHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvZG90bmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTVk4gVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9hbnRsaWJzL2RvdG5ldC90cnVuay8iPmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9hbnRsaWJzL2RvdG5ldC90cnVuay88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVmlld1NWTjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L2FudGxpYnMvZG90bmV0L3RydW5rLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9hbnRsaWJzL2RvdG5ldC90cnVuay88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IGNvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNy54CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQWRkZWQgdG8gc2FuZGJveDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAyMDA1LTA0LTE1CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgUHJvbW90ZWQgZnJvbSBzYW5kYm94OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDIwMDUtMTEtMjIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMYXRlc3QgUmVsZWFzZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAxLjAgcmVsZWFzZWQgb24gTm92ZW1iZXIgNiwgMjAwNgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJzdm4iIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlNWTiAtIFN1YnZlcnNpb24gU3VwcG9ydCI+PC9hPgorICAgICAgICBTVk4gLSBTdWJ2ZXJzaW9uIFN1cHBvcnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Db250YWlucyB0YXNrcyB0aGF0IGNvcnJlc3BvbmQgdG8gQW50J3MgJmx0O2N2cyZndDssCisgICAgICAgICZsdDtjdnNjaGFuZ2Vsb2cmZ3Q7IGFuZCAmbHQ7Y3ZzdGFnZGlmZiZndDsgdGFza3MuICBSZXF1aXJlcworICAgICAgICBTdWJ2ZXJzaW9uJ3MgY29tbWFuZCBsaW5lIGNsaWVudC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRm9ycmVzdFRhYmxlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEhvbWVwYWdlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Ii4vc3ZuL2luZGV4Lmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3N2bi88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgU1ZOIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvYW50bGlicy9zdm4vdHJ1bmsvIj5odHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvYW50bGlicy9zdm4vdHJ1bmsvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFZpZXdTVk46CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9hbnRsaWJzL3N2bi90cnVuay8iPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvYW50bGlicy9zdm4vdHJ1bmsvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCBjb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjcueAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFkZGVkIHRvIHNhbmRib3g6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMjAwNS0wNC0xNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFByb21vdGVkIGZyb20gc2FuZGJveDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAyMDA1LTExLTIyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGF0ZXN0IFJlbGVhc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTm9uZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IS0tCisgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoIiAtICIrIkxhc3QgUHVibGlzaGVkOiAiICsgZG9jdW1lbnQubGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgLy8gIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvcD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2FudGxpYnMvc2FuZGJveC5odG1sIGIvdHJ1bmsvZG9jcy9hbnRsaWJzL3NhbmRib3guaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI5NTlkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9hbnRsaWJzL3NhbmRib3guaHRtbApAQCAtMCwwICsxLDU0MyBAQAorCisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgICAgICA8aHRtbCBsYW5nPSJlbiI+CisgICAgPCEtLSBHRU5FUkFURUQgRklMRSwgRE8gTk9UIEVESVQsIEVESVQgVEhFIFhNTCBGSUxFIElOIHhkb2NzIElOU1RFQUQhIC0tPgorICAgIDxoZWFkPgorICAgICAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgICAgICAgIDx0aXRsZT5BcGFjaGUgQW50IC0gQW50IExpYnJhcmllcyAtIFRoZSBTYW5kYm94PC90aXRsZT4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAgICAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxwIGNsYXNzPSJuYXZwYXRoIj4KKyAgICAgICAgPHNjcmlwdCBzcmM9Ii4uL2JyZWFkY3J1bWJzLmpzIiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICAgIDwvcD4KKworICAgICAgPGRpdiBjbGFzcz0ibG9nb2JhciI+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBib3JkZXI9IjAiIGFsdD0iQXBhY2hlIEFudCBzaXRlIiBzcmM9Ii4uL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4uL2ltYWdlcy9wcm9qZWN0LWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlYXJjaCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IiM0QzZDOEYiPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGltZyBoZWlnaHQ9IjEwIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJTZWFyY2giIHZhbHVlPSJTZWFyY2giIHR5cGU9InN1Ym1pdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgICAgICAgICAgIHRoZSBBcGFjaGUgQW50IHNpdGUKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi4vaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgorICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0idGFiIGJhciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ibm9uIHNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS40ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iI0IyQzRFMCI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+SG9tZTwvZm9udD48L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYlNlbC1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiM0QzZDOEYiPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj48Yj5Qcm9qZWN0czwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWJTZWwtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0cworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9wcm9qZWN0cy9pbmRleC5odG1sIj5XZWxjb21lPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+QW50IExpYnJhcmllcworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL2luZGV4Lmh0bWwiPkludHJvZHVjdGlvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL2NoYXJ0ZXIuaHRtbCI+Q2hhcnRlcjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL3Byb3Blci5odG1sIj5BbnQgTGlicmFyaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvc2FuZGJveC5odG1sIj5TYW5kYm94IEFudCBMaWJyYXJpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYmluZG93bmxvYWQuY2dpIj5CaW5hcnkgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9zcmNkb3dubG9hZC5jZ2kiPlNvdXJjZSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+SXZ5CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL3Byb2plY3RzL2l2eS5odG1sIj5JbnRyb2R1Y3Rpb248L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS8iPkhvbWVwYWdlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pdnkvZG93bmxvYWQuY2dpIj5EaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvaXZ5LyI+V2lraTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8Y2VudGVyPgorICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIvYWRzL2J1dHRvbmJhci5odG1sIiAtLT4KKyAgICA8L2NlbnRlcj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogbGVmdCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvbWVudS1yaWdodC5naWYiPgorICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImxpZ2h0Ymx1ZWJhciI+Jm5ic3A7PC9kaXY+CisgIDxkaXYgY2xhc3M9Im1haW4iPgorICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKyAgICA8aDEgY2xhc3M9InRpdGxlIj5BbnQgTGlicmFyaWVzIC0gVGhlIFNhbmRib3g8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCBMaWJyYXJpZXMgLSBUaGUgU2FuZGJveCI+PC9hPgorICAgICAgQW50IExpYnJhcmllcyAtIFRoZSBTYW5kYm94CisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBzYW5kYm94IGlzIHRoZSBwbGFjZSB3aGVyZSBuZXcgQW50IExpYnJhcmllcyBzdGFydCB0aGVpcgorICAgICAgbGlmZSwgaXQgaXMgYSBwbGF5Z3JvdW5kIGZvciBBbnQgY29tbWl0dGVycyBhbmQgb3RoZXIKKyAgICAgIGNvbnRyaWJ1dG9ycyB3aG8gZmluZCBjb21taXR0ZXJzIHRvIHNwb25zb3IgdGhlaXIgaWRlYXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgc2FuZGJveCBpcyBubyBkdW1waW5nIGdyb3VuZC4gIElmIGEgU2FuZGJveCBBbnQgTGlicmFyeQorICAgICAgZmFpbHMgdG8gYXR0cmFjdCBpbnRlcmVzdCB3aXRoaW4gYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lLCBpdAorICAgICAgZ2V0cyByZW1vdmVkIGZyb20gdGhlIHNhbmRib3guPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkN1cnJlbnQgU2FuZGJveCBBbnQgTGlicmFyaWVzIj48L2E+CisgICAgICBDdXJyZW50IFNhbmRib3ggQW50IExpYnJhcmllcworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJEZWJpYW4gLSBEZWJpYW4gcmVsYXRlZCB0YXNrcyI+PC9hPgorICAgICAgICBEZWJpYW4gLSBEZWJpYW4gcmVsYXRlZCB0YXNrcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkRlYmlhbiBwcm92aWRlcyB0YXNrcyBmb3IgZ2VuZXJhdGluZyBEZWJpYW4gcGFja2FnZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkZvcnJlc3RUYWJsZSIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTVk4gVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvZGViaWFuL3RydW5rLyI+aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L3NhbmRib3gvYW50bGlicy9kZWJpYW4vdHJ1bmsvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFZpZXdTVk46CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9zYW5kYm94L2FudGxpYnMvZGViaWFuL3RydW5rLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9zYW5kYm94L2FudGxpYnMvZGViaWFuL3RydW5rLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgY29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS43LngKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBZGRlZCB0byBzYW5kYm94OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDIwMDctMDUtMTgKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTcG9uc29yaW5nIENvbW1pdHRlcnMKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBLZXZpbiBKYWNrc29uCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkdlbkRvYyAtIEdlbmVyYXRlIHRoZSBtYW51YWwgZm9yIEFudCBUYXNrcyBmcm9tIHRoZWlyIHNvdXJjZXMiPjwvYT4KKyAgICAgICAgR2VuRG9jIC0gR2VuZXJhdGUgdGhlIG1hbnVhbCBmb3IgQW50IFRhc2tzIGZyb20gdGhlaXIgc291cmNlcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPk1vc3Qgb2YgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBmb3Igd3JpdGluZyB0aGUgbWFudWFsIGlzIGluc2lkZSB0aGUgc291cmNlczogYXR0cmlidXRlcywgbmVzdGVkIGVsZW1lbnRzIChlc3BlY2lhbGx5CisgICAgICAgIGluaGVyaXRlZCBvbmUpLiBHZW5Eb2MgY29sbGVjdHMgdGhlc2UgaW5mb3JtYXRpb24gYW5kIGdlbmVyYXRlcyB0aGUgbWFudWFsIGFzIHhtbCBwYWdlLiBGb2xsb3dpbmcgc3RlcHMgdHJhbnNmb3JtIHRoaXMKKyAgICAgICAgeG1sIGludG8gdGhlIGZpbmFsIGZvcm1hdCAoSFRNTCBpbiB0aGUgZmlyc3Qgc3RlcCwgUERGIG1heSBmb2xsb3cpLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJGb3JyZXN0VGFibGUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgU1ZOIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvZ2VuZG9jLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC9hbnRsaWJzL2dlbmRvYy88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVmlld1NWTjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2FudC9zYW5kYm94L2FudGxpYnMvZ2VuZG9jLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9hbnQvc2FuZGJveC9hbnRsaWJzL2dlbmRvYy88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IGNvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNy54CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQWRkZWQgdG8gc2FuZGJveDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAyMDA1LTA0LTE1CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgU3BvbnNvcmluZyBDb21taXR0ZXJzCisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJIVFRQIC0gdGFza3MgZm9yIGhhbmRsaW5nIEhUVFAgcmVxdWVzdHMiPjwvYT4KKyAgICAgICAgSFRUUCAtIHRhc2tzIGZvciBoYW5kbGluZyBIVFRQIHJlcXVlc3RzCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBhbnRsaWIgY29udGFpbnMgdGFza3MgdG8gbWFrZSB0aGUgYmFzaWMgSFRUUCByZXF1ZXN0czogZ2V0LCBwb3N0LCBoZWFkLCBwdXQsIHdpdGggQmFzaWNhdXRoZW50aWNhdGlvbi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRm9ycmVzdFRhYmxlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFNWTiBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC9hbnRsaWJzL2h0dHAvIj5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvaHR0cC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVmlld1NWTjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2FudC9zYW5kYm94L2FudGxpYnMvaHR0cC8iPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYW50L3NhbmRib3gvYW50bGlicy9odHRwLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgY29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS43LngKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBZGRlZCB0byBzYW5kYm94OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDIwMDYtMDYtMjcKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTcG9uc29yaW5nIENvbW1pdHRlcnMKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJNYW51YWw0RWNsaXBzZSAtIEdlbmVyYXRlIGFuIEVjbGlwc2UgSGVscCBQbHVnSW4gZnJvbSBBbnQncyBtYW51YWwiPjwvYT4KKyAgICAgICAgTWFudWFsNEVjbGlwc2UgLSBHZW5lcmF0ZSBhbiBFY2xpcHNlIEhlbHAgUGx1Z0luIGZyb20gQW50J3MgbWFudWFsCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBBbnRMaWIgcHJvdmlkZXMgdGFza3MgZm9yIGdlbmVyYXRpbmcgYW4gRWNsaXBzZSBIZWxwIFBsdWdJbiBmcm9tIEFudCdzIG1hbnVhbC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRm9ycmVzdFRhYmxlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFNWTiBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC9hbnRsaWJzL21hbnVhbDRlY2xpcHNlLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC9hbnRsaWJzL21hbnVhbDRlY2xpcHNlLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBWaWV3U1ZOOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvc2FuZGJveC9hbnRsaWJzL21hbnVhbDRlY2xpcHNlL3RydW5rLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9zYW5kYm94L2FudGxpYnMvbWFudWFsNGVjbGlwc2UvdHJ1bmsvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCBjb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjcueAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEphdmEgY29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBKYXZhIDEuNSsKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBZGRlZCB0byBzYW5kYm94OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDIwMDctMDMtMDEKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTcG9uc29yaW5nIENvbW1pdHRlcnMKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlByb3BzIC0gYWRkaXRpb25hbCBQcm9wZXJ0eSBSZXNvbHZlciI+PC9hPgorICAgICAgICBQcm9wcyAtIGFkZGl0aW9uYWwgUHJvcGVydHkgUmVzb2x2ZXIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGlzIGEgbGlicmFyeSBvZiBzdXBwbGVtZW50YXJ5IGhhbmRsZXJzIGZvciBBbnQgcHJvcGVydGllcyByZXNvbHV0aW9uLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJGb3JyZXN0VGFibGUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgU1ZOIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC9hbnRsaWJzL3Byb3BzL3RydW5rLyI+aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L3NhbmRib3gvYW50bGlicy9wcm9wcy90cnVuay88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVmlld1NWTjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L3NhbmRib3gvYW50bGlicy9wcm9wcy90cnVuay8iPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvc2FuZGJveC9hbnRsaWJzL3Byb3BzL3RydW5rLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgY29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS44LngKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBZGRlZCB0byBzYW5kYm94OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDIwMDctMDctMjUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTcG9uc29yaW5nIENvbW1pdHRlcnMKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBNYXR0IEJlbnNvbgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJWU1MgLSBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUgVGFza3MiPjwvYT4KKyAgICAgICAgVlNTIC0gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlIFRhc2tzCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBhbnRsaWIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUgU0NNLiBUaGUgb3JpZ2luYWwgdGFza3MgCisgICAgICAgIChvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MpIGhhdmUgYmVlbiBleHBhbmRlZCB1cG9uIGluIHRoaXMgYW50bGliLiAKKyAgICAgICAgU29tZSBmaXhlcyB0byBpc3N1ZXMgaW4gdGhlIG9yaWdpbmFsIHRhc2tzIGhhdmUgYWxzbyBiZWVuIGluY29ycG9yYXRlZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRm9ycmVzdFRhYmxlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFNWTiBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC9hbnRsaWJzL3Zzcy8iPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L3NhbmRib3gvYW50bGlicy92c3MvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFZpZXdTVk46CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9hbnQvc2FuZGJveC9hbnRsaWJzL3Zzcy8iPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYW50L3NhbmRib3gvYW50bGlicy92c3MvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCBjb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjcueAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFkZGVkIHRvIHNhbmRib3g6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMjAwNi0wNC0yNiAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgU3BvbnNvcmluZyBDb21taXR0ZXJzCisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9hbnRsaWJzL3NyY2Rvd25sb2FkLmNnaSBiL3RydW5rL2RvY3MvYW50bGlicy9zcmNkb3dubG9hZC5jZ2kKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDMyNGY3NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvYW50bGlicy9zcmNkb3dubG9hZC5jZ2kKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0CisjICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCisjICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQorY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycworL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9hbnRsaWJzL3NyY2Rvd25sb2FkLmh0bWwgYi90cnVuay9kb2NzL2FudGxpYnMvc3JjZG93bmxvYWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGI5NzAxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9hbnRsaWJzL3NyY2Rvd25sb2FkLmh0bWwKQEAgLTAsMCArMSwzMDkgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIFNvdXJjZSBEaXN0cmlidXRpb25zPC90aXRsZT4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAgICAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxwIGNsYXNzPSJuYXZwYXRoIj4KKyAgICAgICAgPHNjcmlwdCBzcmM9Ii4uL2JyZWFkY3J1bWJzLmpzIiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICAgIDwvcD4KKworICAgICAgPGRpdiBjbGFzcz0ibG9nb2JhciI+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBib3JkZXI9IjAiIGFsdD0iQXBhY2hlIEFudCBzaXRlIiBzcmM9Ii4uL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4uL2ltYWdlcy9wcm9qZWN0LWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlYXJjaCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IiM0QzZDOEYiPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGltZyBoZWlnaHQ9IjEwIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJTZWFyY2giIHZhbHVlPSJTZWFyY2giIHR5cGU9InN1Ym1pdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgICAgICAgICAgIHRoZSBBcGFjaGUgQW50IHNpdGUKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi4vaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgorICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0idGFiIGJhciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ibm9uIHNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS40ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iI0IyQzRFMCI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+SG9tZTwvZm9udD48L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYlNlbC1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiM0QzZDOEYiPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj48Yj5Qcm9qZWN0czwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWJTZWwtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0cworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9wcm9qZWN0cy9pbmRleC5odG1sIj5XZWxjb21lPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+QW50IExpYnJhcmllcworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL2luZGV4Lmh0bWwiPkludHJvZHVjdGlvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL2NoYXJ0ZXIuaHRtbCI+Q2hhcnRlcjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi9hbnRsaWJzL3Byb3Blci5odG1sIj5BbnQgTGlicmFyaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvc2FuZGJveC5odG1sIj5TYW5kYm94IEFudCBMaWJyYXJpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYmluZG93bmxvYWQuY2dpIj5CaW5hcnkgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VsIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5JdnkKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vcHJvamVjdHMvaXZ5Lmh0bWwiPkludHJvZHVjdGlvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5LyI+SG9tZXBhZ2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS9kb3dubG9hZC5jZ2kiPkRpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9pdnkvIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxjZW50ZXI+CisgICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9hZHMvYnV0dG9uYmFyLmh0bWwiIC0tPgorICAgIDwvY2VudGVyPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiBsZWZ0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPlNvdXJjZSBEaXN0cmlidXRpb25zPC9oMT4KKyAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJEb3dubG9hZGluZyBBbnRsaWJzIj48L2E+CisgICAgICBEb3dubG9hZGluZyBBbnRsaWJzCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlVzZSB0aGUgbGlua3MgYmVsb3cgdG8gZG93bmxvYWQgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mIEFudGxpYnMgZnJvbQorb25lIG9mIG91ciBtaXJyb3JzLiAgSXQgaXMgZ29vZCBwcmFjdGljZSB0bworPGEgaHJlZj0iW2xvY2F0aW9uXSNWZXJpZnkgUmVsZWFzZXMiPnZlcmlmeSB0aGUgaW50ZWdyaXR5PC9hPgorb2YgdGhlIGRpc3RyaWJ1dGlvbiBmaWxlcywgZXNwZWNpYWxseSBpZiB5b3UgYXJlIHVzaW5nIG9uZSBvZiBvdXIKK21pcnJvciBzaXRlcy4gIEluIG9yZGVyIHRvIGRvIHRoaXMgeW91IG11c3QgdXNlIHRoZSBzaWduYXR1cmVzIGZyb20KK291ciA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy8iPm1haW4gZGlzdHJpYnV0aW9uCitkaXJlY3Rvcnk8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50bGlicyBhcmUgZGlzdHJpYnV0ZWQgYXMgPGNvZGU+emlwPC9jb2RlPiwgPGNvZGU+dGFyLmd6PC9jb2RlPiBhbmQKKzxjb2RlPnRhci5iejI8L2NvZGU+IGFyY2hpdmVzIC0gdGhlIGNvbnRlbnRzIGFyZSB0aGUgc2FtZS4gIFBsZWFzZQorbm90ZSB0aGF0IHRoZSA8Y29kZT50YXIuKjwvY29kZT4gYXJjaGl2ZXMgY29udGFpbiBmaWxlIG5hbWVzIGxvbmdlcgordGhhbiAxMDAgY2hhcmFjdGVycyBhbmQgaGF2ZSBiZWVuIGNyZWF0ZWQgdXNpbmcgR05VIHRhciBleHRlbnNpb25zLgorVGh1cyB0aGV5IG11c3QgYmUgdW50YXJyZWQgd2l0aCBhIEdOVSBjb21wYXRpYmxlIHZlcnNpb24gb2YKKzxjb2RlPnRhcjwvY29kZT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgZG8gbm90IHNlZSB0aGUgZmlsZSB5b3UgbmVlZCBpbiB0aGUgbGlua3MgYmVsb3csIHBsZWFzZSBzZWUKK3RoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy8iPm1hc3RlciBkaXN0cmlidXRpb24KK2RpcmVjdG9yeTwvYT4gb3IsIHByZWZlcmFibHksIGl0cyA8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYW50bGlicy8iPm1pcnJvcjwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9Ik1pcnJvciI+PC9hPgorICAgICAgTWlycm9yCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPllvdSBhcmUgY3VycmVudGx5IHVzaW5nIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmIHlvdSBlbmNvdW50ZXIgYQorcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiAgSWYgYWxsCittaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUgPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mCit0aGUgbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIj4KK090aGVyIG1pcnJvcnM6IDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj4KK1tpZi1hbnkgaHR0cF0KKyAgW2ZvciBodHRwXTxvcHRpb24gdmFsdWU9IltodHRwXSI+W2h0dHBdPC9vcHRpb24+W2VuZF0KK1tlbmRdCitbaWYtYW55IGZ0cF0KKyAgW2ZvciBmdHBdPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF0KK1tlbmRdCitbaWYtYW55IGJhY2t1cF0KKyAgW2ZvciBiYWNrdXBdPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+W2VuZF0KK1tlbmRdCis8L3NlbGVjdD4KKzxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiIC8+Cis8L2Zvcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQ3VycmVudCBBbnRsaWIgUmVsZWFzZXMiPjwvYT4KKyAgICAgIEN1cnJlbnQgQW50bGliIFJlbGVhc2VzCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmciPgorPGRpdiBjbGFzcz0ibGFiZWwiPk5vdGU8L2Rpdj4KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPlZlcnkgcmVjZW50IHJlbGVhc2VzIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbAorbWlycm9ycyBmb3IgYSBmZXcgZGF5cy48L2Rpdj4KKzwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZyI+Cis8ZGl2IGNsYXNzPSJsYWJlbCI+VGFyIGZpbGVzIG1heSByZXF1aXJlIGdudSB0YXIgdG8gZXh0cmFjdDwvZGl2PgorPGRpdiBjbGFzcz0iY29udGVudCI+VGFyIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gY29udGFpbiBsb25nIGZpbGUgbmFtZXMsIGFuZCBtYXkKKyByZXF1aXJlIGdudSB0YXIgdG8gZG8gdGhlIGV4dHJhY3Rpb24uPC9kaXY+Cis8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorPGxpPkFwYWNoZSAuTkVUIEFudCBMaWJyYXJ5IDEuMAorPHVsPgorPGxpPjxjb2RlPi56aXA8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYW50bGlicy9kb3RuZXQvc291cmNlL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMuemlwIj5hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnppcDwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvc291cmNlL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMuemlwLmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvc291cmNlL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMuemlwLnNoYTEiPlNIQTE8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2RvdG5ldC9zb3VyY2UvYXBhY2hlLWFudC1kb3RuZXQtMS4wLXNyYy56aXAubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmd6PC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnRhci5neiI+YXBhY2hlLWFudC1kb3RuZXQtMS4wLXNyYy50YXIuZ3o8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnRhci5nei5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnRhci5nei5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvc291cmNlL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMudGFyLmd6Lm1kNSI+TUQ1PC9hPl08L2xpPgorCis8bGk+PGNvZGU+LnRhci5iejI8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYW50bGlicy9kb3RuZXQvc291cmNlL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMudGFyLmJ6MiI+YXBhY2hlLWFudC1kb3RuZXQtMS4wLXNyYy50YXIuYnoyPC9hPgorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2RvdG5ldC9zb3VyY2UvYXBhY2hlLWFudC1kb3RuZXQtMS4wLXNyYy50YXIuYnoyLmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvc291cmNlL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMudGFyLmJ6Mi5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvc291cmNlL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMudGFyLmJ6Mi5tZDUiPk1ENTwvYT5dPC9saT4KKzwvdWw+Cis8L2xpPgorCis8bGk+QXBhY2hlIEFudFVuaXQgMS4wCis8dWw+Cis8bGk+PGNvZGU+LnppcDwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzL2FudHVuaXQvc291cmNlL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnppcCI+YXBhY2hlLWFudC1hbnR1bml0LTEuMC1zcmMuemlwPC9hPgorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2FudHVuaXQvc291cmNlL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnppcC5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9zb3VyY2UvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1zcmMuemlwLnNoYTEiPlNIQTE8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2FudHVuaXQvc291cmNlL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnppcC5tZDUiPk1ENTwvYT5dPC9saT4KKworPGxpPjxjb2RlPi50YXIuZ3o8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS9hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy50YXIuZ3oiPmFwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnRhci5nejwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS9hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy50YXIuZ3ouYXNjIj5QR1A8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2FudHVuaXQvc291cmNlL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnRhci5nei5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS9hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy50YXIuZ3oubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmJ6MjwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzL2FudHVuaXQvc291cmNlL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnRhci5iejIiPmFwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnRhci5iejI8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9zb3VyY2UvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1zcmMudGFyLmJ6Mi5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9zb3VyY2UvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1zcmMudGFyLmJ6Mi5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS9hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy50YXIuYnoyLm1kNSI+TUQ1PC9hPl08L2xpPgorPC91bD4KKzwvbGk+Cis8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IlZlcmlmeSBSZWxlYXNlcyI+PC9hPgorICAgICAgVmVyaWZ5IFJlbGVhc2VzCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkl0IGlzIGVzc2VudGlhbCB0aGF0IHlvdSB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZG93bmxvYWRlZAorZmlsZXMgdXNpbmcgdGhlIFBHUCBzaWduYXR1cmUgb3IgdGhlIFNIQTEgb3IgTUQ1IGNoZWNrc3Vtcy4gIFRoZQorY2hlY2tzdW1zIGFyZSBub3QgYXMgc3Ryb25nIGluZGljYXRvcnMgYXMgdGhlIFBHUCBzaWduYXR1cmUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgUEdQIHNpZ25hdHVyZXMgY2FuIGJlIHZlcmlmaWVkIHVzaW5nIFBHUCBvciBHUEcuICBGaXJzdAorZG93bmxvYWQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9LRVlTIj5LRVlTPC9hPgorYXMgd2VsbCBhcyB0aGUgPGNvZGU+YXNjPC9jb2RlPiBzaWduYXR1cmUgZmlsZSBmb3IgdGhlIHBhcnRpY3VsYXIKK2Rpc3RyaWJ1dGlvbi4gIE1ha2Ugc3VyZSB5b3UgZ2V0IHRoZXNlIGZpbGVzIGZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzLyI+bWFpbiBkaXN0cmlidXRpb24KK2RpcmVjdG9yeTwvYT4sIHJhdGhlciB0aGFuIGZyb20gYSBtaXJyb3IuIFRoZW4gdmVyaWZ5IHRoZSBzaWduYXR1cmVzCit1c2luZzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGNvZGU+CislIHBncGsgLWEgS0VZUzxiciAvPgorJSBwZ3B2IGFwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmd6LmFzYzxiciAvPgorPC9jb2RlPgorPGVtPm9yPC9lbT48YnIgLz4KKzxjb2RlPgorJSBwZ3AgLWthIEtFWVM8YnIgLz4KKyUgcGdwIGFwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmd6LmFzYzxiciAvPgorPC9jb2RlPgorPGVtPm9yPC9lbT48YnIgLz4KKzxjb2RlPgorJSBncGcgLS1pbXBvcnQgS0VZUzxiciAvPgorJSBncGcgLS12ZXJpZnkgYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3ouYXNjCis8L2NvZGU+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHZlcmlmeSB0aGUgY2hlY2tzdW1zIG9uIHRoZSBmaWxlcy4gIFVuaXgKK3Byb2dyYW1zIGNhbGxlZCA8Y29kZT5tZDU8L2NvZGU+Lzxjb2RlPnNoYTE8L2NvZGU+IG9yCis8Y29kZT5tZDVzdW08L2NvZGU+Lzxjb2RlPnNoYTFzdW08L2NvZGU+IGFyZSBpbmNsdWRlZCBpbiBtYW55IHVuaXgKK2Rpc3RyaWJ1dGlvbnMuICA8Y29kZT4qc3VtPC9jb2RlPiBpcyBhbHNvIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXh0dXRpbHMvdGV4dHV0aWxzLmh0bWwiPkdOVQorVGV4dHV0aWxzPC9hPi4gIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5mb3VybWlsYWIuY2gvbWQ1LyI+aGVyZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cucGMtdG9vbHMubmV0L3dpbjMyL2ZyZWV3YXJlL2NvbnNvbGUvIj5oZXJlPC9hPi4gIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2xhdmFzb2Z0LmNvbS9mc3VtLyI+ZnN1bTwvYT4gc3VwcG9ydHMgTUQ1IGFuZAorU0hBMS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPldlIGhpZ2hseSByZWNvbW1lbmQgdG8gdmVyaWZ5IHRoZSBQR1Agc2lnbmF0dXJlLCB0aG91Z2guPC9wPgorICAgICAgICAgICAgICAgIAorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IS0tCisgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoIiAtICIrIkxhc3QgUHVibGlzaGVkOiAiICsgZG9jdW1lbnQubGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgLy8gIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvcD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2FudGxpYnMvc3ZuL2luZGV4Lmh0bWwgYi90cnVuay9kb2NzL2FudGxpYnMvc3ZuL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTNkZjMwNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvYW50bGlicy9zdm4vaW5kZXguaHRtbApAQCAtMCwwICsxLDIxNSBAQAorCisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgICAgICA8aHRtbCBsYW5nPSJlbiI+CisgICAgPCEtLSBHRU5FUkFURUQgRklMRSwgRE8gTk9UIEVESVQsIEVESVQgVEhFIFhNTCBGSUxFIElOIHhkb2NzIElOU1RFQUQhIC0tPgorICAgIDxoZWFkPgorICAgICAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgICAgICAgIDx0aXRsZT5BcGFjaGUgQW50IC0gU3VidmVyc2lvbiBBbnQgTGlicmFyeTwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CisgICAgICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuLi8uLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIuLi8uLi9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgb25zdWJtaXQ9InEudmFsdWUgPSBxdWVyeS52YWx1ZSArICcgc2l0ZTphbnQuYXBhY2hlLm9yZyciIGFjdGlvbj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWFyY2giIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSIjNEM2QzhGIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPjxpbWcgaGVpZ2h0PSIxMCIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InNlYXJjaGNhcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJxIiB0eXBlPSJoaWRkZW4iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy9zcGFjZXIuZ2lmIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICB0aGUgQXBhY2hlIEFudCBzaXRlCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi4vLi4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4uLy4uL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4uLy4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9Im5vbiBzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNGVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPkhvbWU8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIuLi8uLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uLy4uL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+UHJvamVjdHM8L2I+PC9mb250PjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsdWViYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ibWVudWNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdHMKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vcHJvamVjdHMvaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkFudCBMaWJyYXJpZXMKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vYW50bGlicy9pbmRleC5odG1sIj5JbnRyb2R1Y3Rpb248L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vYW50bGlicy9jaGFydGVyLmh0bWwiPkNoYXJ0ZXI8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vLi4vYW50bGlicy9wcm9wZXIuaHRtbCI+QW50IExpYnJhcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi8uLi9hbnRsaWJzL3NhbmRib3guaHRtbCI+U2FuZGJveCBBbnQgTGlicmFyaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkl2eQorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi8uLi9wcm9qZWN0cy9pdnkuaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pdnkvIj5Ib21lcGFnZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5L2Rvd25sb2FkLmNnaSI+RGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2l2eS8iPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuLi8uLi9pbWFnZXMvbWVudS1sZWZ0LmdpZiI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vLi4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+U3VidmVyc2lvbiBBbnQgTGlicmFyeTwvaDE+CisgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iSWRlYSI+PC9hPgorICAgICAgSWRlYQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgQW50IGxpYnJhcnkgaXMgdG8gcHJvdmlkZSB0aGUgc2FtZQorICAgICAgbGV2ZWwgb2Ygc3VwcG9ydCB0aGF0IEFudCBwcm92aWRlcyBmb3IgQ1ZTLiAgVGhpcyBtZWFucyB0aGUKKyAgICAgIHRhc2tzIGFyZSB3cmFwcGVycyBvbiB0b3Agb2YgdGhlIGNvbW1hbmQgbGluZSBjbGllbnQgKHJlYWQ6IHlvdQorICAgICAgc3RpbGwgbmVlZCB0byBpbnN0YWxsIGFuIHN2biBjbGllbnQpIGFuZCB0aGVyZSBpcyBub3QgbXVjaCBtb3JlCisgICAgICB0aGFuIHJ1bm5pbmcgdGhlIGV4ZWN1dGFibGUgYW5kIGNyZWF0aW5nIHNvbWUgcmVwb3J0cy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdSBhcmUgbG9va2luZyBmb3IgcHJvamVjdHMgdGhhdCBhaW0gYXQgbW9yZSwgdGhlcmUgYXJlCisgICAgICBiZXR0ZXIgYWx0ZXJuYXRpdmVzLCBmb3IgZXhhbXBsZSA8YSBocmVmPSJodHRwOi8vc3ViY2xpcHNlLnRpZ3Jpcy5vcmcvc3ZuYW50Lmh0bWwiPlN1YmNsaXBzZSdzIEFudAorICAgICAgdGFzazwvYT4gb3IgPGEgaHJlZj0iaHR0cDovL3RtYXRlLm9yZy9zdm4vYW50Lmh0bWwiPkphdmFTVk48L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJUYXNrcyI+PC9hPgorICAgICAgVGFza3MKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0ic3ZuIj48L2E+CisgICAgICAgIHN2bgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgdmVyeSB0aGluIGxheWVyIG9uIHRvcCBvZiB0aGUgY29tbWFuZCBsaW5lIGV4ZWN1dGFibGUsCisgICAgICAgIGNvbXBhcmFibGUgdG8gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvY3ZzLmh0bWwiPnRoZSBDVlMKKyAgICAgICAgdGFzazwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9ImNoYW5nZWxvZyI+PC9hPgorICAgICAgICBjaGFuZ2Vsb2cKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5DcmVhdGVzIGEgbG9nIG9mIGNoYW5nZSBjb21tZW50cyBiZXR3ZWVuIHR3byByZXZpc2lvbnMsCisgICAgICAgIGNvbXBhcmFibGUgdG8gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvY2hhbmdlbG9nLmh0bWwiPkN2c0NoYW5nZUxvZzwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IipkaWZmIj48L2E+CisgICAgICAgICpkaWZmCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGNvZGU+Jmx0O3RhZ2RpZmYmZ3Q7PC9jb2RlPiBjcmVhdGVzIGEgZGlmZmVyZW5jZXMgcmVwb3J0CisgICAgICAgIGZvciB0aGUgY2hhbmdlcyBiZXR3ZWVuIHR3byB0YWdzIG9yIGJyYW5jaGVzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGNvZGU+Jmx0O3JldmlzaW9uZGlmZiZndDs8L2NvZGU+IGNyZWF0ZXMgYSBkaWZmZXJlbmNlcyByZXBvcnQKKyAgICAgICAgZm9yIHRoZSBjaGFuZ2VzIGJldHdlZW4gdHdvIHJldmlzaW9ucy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRvZ2V0aGVyIGNvbXBhcmFibGUgdG8gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvY3ZzdGFnZGlmZi5odG1sIj5DdnNUYWdEaWZmPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJFeGFtcGxlcyI+PC9hPgorICAgICAgRXhhbXBsZXMKKyAgICA8L2gzPgorICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9hbnRuZXdzLmh0bWwgYi90cnVuay9kb2NzL2FudG5ld3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGM0M2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9hbnRuZXdzLmh0bWwKQEAgLTAsMCArMSw1ODQgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIE5ld3M8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IkNvbm9yIE1hY05laWxsIj4KKyAgPG1ldGEgbmFtZT0iZW1haWwiIGNvbnRlbnQ9IiI+CisgICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iU3RlZmFuIEJvZGV3aWciPgorICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0iIj4KKyAgICAgICAgPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJNYWdlc2ggVW1hc2Fua2FyIj4KKyAgPG1ldGEgbmFtZT0iZW1haWwiIGNvbnRlbnQ9IiI+CisgICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iQW50b2luZSBMZXZ5LUxhbWJlcnQiPgorICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0iIj4KKyAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+SG9tZTwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4vcHJvamVjdHMvaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+UHJvamVjdHM8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BcGFjaGUgQW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xpY2Vuc2UuaHRtbCI+TGljZW5zZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VsIj5OZXdzPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2V4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9mYXEuaHRtbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvRnJvbnRQYWdlIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvYmxlbXMuaHRtbCI+SGF2aW5nIFByb2JsZW1zPzwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvd25sb2FkCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9zcmNkb3dubG9hZC5jZ2kiPlNvdXJjZSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+Q29udHJpYnV0aW5nCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFpbC5odG1sIj5NYWlsaW5nIExpc3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vc3ZuLmh0bWwiPlN1YnZlcnNpb24gUmVwb3NpdG9yaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbmlnaHRsaWVzLmh0bWwiPk5pZ2h0bHkgQnVpbGRzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnVncy5odG1sIj5CdWcgRGF0YWJhc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5TcG9uc29yc2hpcAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCI+VGhhbmtzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiPlNwb25zb3JzaGlwPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2NvbnRyaWJ1dGluZy5odG1sIj5Eb25hdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0IE1hbmFnZW1lbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9jb250cmlidXRvcnMuaHRtbCI+Q29udHJpYnV0b3JzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWlzc2lvbi5odG1sIj5BcGFjaGUgQW50IE1pc3Npb248L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9ieWxhd3MuaHRtbCI+UHJvamVjdCBCeWxhd3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9sZWdhbC5odG1sIj5MZWdhbDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8Y2VudGVyPgorICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIvYWRzL2J1dHRvbmJhci5odG1sIiAtLT4KKyAgICA8L2NlbnRlcj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogbGVmdCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+TmV3czwvaDE+CisgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQXBhY2hlIEl2eSBpcyBhbiBBbnQgU3ViLVByb2plY3QgTm93ISI+PC9hPgorICAgICAgQXBhY2hlIEl2eSBpcyBhbiBBbnQgU3ViLVByb2plY3QgTm93IQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+T2N0b2JlciAxMSwgMjAwNyAtIEFwYWNoZSBJdnkgaXMgYW4gQW50IFN1Yi1Qcm9qZWN0IE5vdyE8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcGFjaGUgSXZ5LCAiQSBKYXZhIGJhc2VkIHRvb2wgZm9yIHRyYWNraW5nLCByZXNvbHZpbmcgYW5kCisgICAgbWFuYWdpbmcgcHJvamVjdCBkZXBlbmRlbmNpZXMuIiwganVzdCBmaW5pc2hlZCA8YSBocmVmPSJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvIj5JbmN1YmF0aW9uPC9hPiBhbmQgaGFzIGpvaW5lZAorICAgIHRoZSBBbnQgcHJvamVjdC4gIE1vcmUgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgQW50CisgICAgc2l0ZSBzb29uLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VW50aWwgd2UndmUgZmluaXNoZWQgdGhlIG1pZ3JhdGlvbiwgeW91IGNhbiBsZWFybiBtb3JlIGFib3V0CisgICAgSXZ5IGZyb20gaXRzIDxhIGhyZWY9Imh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9pdnkvIj5JbmN1YmF0b3IKKyAgICB3ZWJzaXRlPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQW50VW5pdCAxLjAiPjwvYT4KKyAgICAgIEFudFVuaXQgMS4wCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5KYW51YXJ5IDgsIDIwMDcgLSBBcGFjaGUgQW50VW5pdCAxLjAgQXZhaWxhYmxlPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBhY2hlIEFudFVuaXQgMS4wIGlzIG5vdyBhdmFpbGFibGUgZm9yIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaSI+ZG93bmxvYWQ8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBBbnQgTGlicmFyeSBjb250YWlucyB0YXNrcyB0byB0ZXN0IEFudCB0YXNrcyB1c2luZyBBbnQKKyAgICBpbnN0ZWFkIG9mIEpVbml0LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSA8YSBocmVmPSJhbnRsaWJzL2FudHVuaXQvIj5BbnRVbml0IGhvbWUgcGFnZTwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCAxLjcuMCI+PC9hPgorICAgICAgQW50IDEuNy4wCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5EZWNlbWJlciAxOSwgMjAwNiAtIEFudCAxLjcuMCBBdmFpbGFibGU8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcGFjaGUgQW50IDEuNy4wIGlzIG5vdyBhdmFpbGFibGUgZm9yIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPmRvd25sb2FkPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiBBbnQgMS43IGludHJvZHVjZXMgYSByZXNvdXJjZSBmcmFtZXdvcmsuIFNvbWUgb2YgdGhlIGNvcmUgYW50IAorICAgIHRhc2tzIHN1Y2ggYXMgJmx0O2NvcHkvJmd0OyBhcmUgbm93IGFibGUgdG8gcHJvY2VzcyBub3Qgb25seSBmaWxlIAorICAgIHN5c3RlbSByZXNvdXJjZXMgYnV0IGFsc28gemlwIGVudHJpZXMsIHRhciBlbnRyaWVzLCBwYXRocywgLi4uIAorICAgIFJlc291cmNlIGNvbGxlY3Rpb25zIGdyb3VwIHJlc291cmNlcywgYW5kIGNhbiBiZSBmdXJ0aGVyIAorICAgIGNvbWJpbmVkIHdpdGggb3BlcmF0b3JzIHN1Y2ggYXMgdW5pb24gYW5kIGludGVyc2VjdGlvbi4gVGhpcyAKKyAgICBjYW4gYmUgZXh0ZW5kZWQgYnkgY3VzdG9tIHJlc291cmNlcyBhbmQgY3VzdG9tIHRhc2tzIHVzaW5nIHJlc291cmNlcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgIEFudCAxLjcgc3RhcnRzIG91dHNvdXJjaW5nIG9mIG9wdGlvbmFsIHRhc2tzIHRvIEFudGxpYnMuIAorICAgIFRoZSAuTkVUIGFudGxpYiBpbiBwcmVwYXJhdGlvbiB3aWxsIHJlcGxhY2UgdGhlIC5ORVQgb3B0aW9uYWwgdGFza3Mgd2hpY2ggc2hpcCBpbiBBbnQuCisgICAgU3VwcG9ydCBmb3IgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gU3VidmVyc2lvbiB3aWxsIGJlIG9ubHkgcHJvdmlkZWQgYXMgYW4gYW50bGliIHRvCisgICAgYmUgcmVsZWFzZWQgc2hvcnRseS4gCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnQgMS43IGZpeGVzIGFsc28gYSBsYXJnZSBudW1iZXIgb2YgYnVncy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudCAxLjcgaGFzIHNvbWUgaW5pdGlhbCBzdXBwb3J0IGZvciBKYXZhNiBmZWF0dXJlcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iLk5FVCBBbnQgTGlicmFyeSAxLjBCZXRhMSI+PC9hPgorICAgICAgLk5FVCBBbnQgTGlicmFyeSAxLjBCZXRhMQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+Tm92ZW1iZXIgNiwgMjAwNiAtIEFwYWNoZSAuTkVUIEFudCBMaWJyYXJ5IDEuMCBBdmFpbGFibGU8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcGFjaGUgLk5FVCBBbnQgTGlicmFyeSAxLjAgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYmluZG93bmxvYWQuY2dpIj5kb3dubG9hZDwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIEFudCBMaWJyYXJ5IGNvbnRhaW5zIHN1cHBvcnQgZm9yIHRvb2xzIGxpa2UgTlVuaXQgYXMgd2VsbAorICAgIGFzIHRoZSAib2xkIC5ORVQgdGFza3Mgb2YgQW50J3MgY29yZS4gIEl0IGhhcyBiZWVuIHRlc3RlZAorICAgIE1pY3Jvc29mdCdzIGZyYW1ld29ya3MgYXMgd2VsbCBhcyBNb25vLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSA8YSBocmVmPSJhbnRsaWJzL2RvdG5ldC8iPkFudGxpYidzCisgICAgaG9tZSBwYWdlPC9hPjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJBbnRVbml0IDEuMEJldGEyIj48L2E+CisgICAgICBBbnRVbml0IDEuMEJldGEyCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5PY3RvYmVyIDI5LCAyMDA2IC0gQXBhY2hlIEFudFVuaXQgMS4wQmV0YTIgQXZhaWxhYmxlPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBhY2hlIEFudFVuaXQgMS4wQmV0YTEgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYmluZG93bmxvYWQuY2dpIj5kb3dubG9hZDwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIEFudCBMaWJyYXJ5IGNvbnRhaW5zIHRhc2tzIHRvIHRlc3QgQW50IHRhc2tzIHVzaW5nIEFudAorICAgIGluc3RlYWQgb2YgSlVuaXQuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIDxhIGhyZWY9ImFudGxpYnMvYW50dW5pdC8iPkFudFVuaXQgaG9tZSBwYWdlPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQW50VW5pdCAxLjBCZXRhMSI+PC9hPgorICAgICAgQW50VW5pdCAxLjBCZXRhMQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+U2VwdGVtYmVyIDIyLCAyMDA2IC0gQXBhY2hlIEFudFVuaXQgMS4wQmV0YTEgQXZhaWxhYmxlPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBhY2hlIEFudFVuaXQgMS4wQmV0YTEgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYmluZG93bmxvYWQuY2dpIj5kb3dubG9hZDwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIEFudCBMaWJyYXJ5IGNvbnRhaW5zIHRhc2tzIHRvIHRlc3QgQW50IHRhc2tzIHVzaW5nIEFudAorICAgIGluc3RlYWQgb2YgSlVuaXQuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIDxhIGhyZWY9ImFudGxpYnMvYW50dW5pdC8iPkFudFVuaXQgaG9tZSBwYWdlPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iLk5FVCBBbnQgTGlicmFyeSAxLjBCZXRhMSI+PC9hPgorICAgICAgLk5FVCBBbnQgTGlicmFyeSAxLjBCZXRhMQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+U2VwdGVtYmVyIDEzLCAyMDA2IC0gQXBhY2hlIC5ORVQgQW50IExpYnJhcnkgMS4wQmV0YTEgQXZhaWxhYmxlPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBhY2hlIC5ORVQgQW50IExpYnJhcnkgMS4wQmV0YTEgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYmluZG93bmxvYWQuY2dpIj5kb3dubG9hZDwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIEFudCBMaWJyYXJ5IGNvbnRhaW5zIHN1cHBvcnQgZm9yIHRvb2xzIGxpa2UgTlVuaXQgYXMgd2VsbAorICAgIGFzIHRoZSAib2xkIC5ORVQgdGFza3Mgb2YgQW50J3MgY29yZS4gIEl0IGhhcyBiZWVuIHRlc3RlZAorICAgIE1pY3Jvc29mdCdzIGZyYW1ld29ya3MgYXMgd2VsbCBhcyBNb25vLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSA8YSBocmVmPSJhbnRsaWJzL2RvdG5ldC8iPkFudGxpYidzCisgICAgaG9tZSBwYWdlPC9hPjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJBbnQgMS42LjUiPjwvYT4KKyAgICAgIEFudCAxLjYuNQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+SnVuZSAyLCAyMDA1IC0gQW50IDEuNi41IEF2YWlsYWJsZTwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwYWNoZSBBbnQgMS42LjUgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+ZG93bmxvYWQ8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBpcyBhIGJ1ZyBmaXggcmVsZWFzZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQW50IDEuNi40Ij48L2E+CisgICAgICBBbnQgMS42LjQKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzPk1heSAxOSwgMjAwNSAtIEFudCAxLjYuNCBBdmFpbGFibGU8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcGFjaGUgQW50IDEuNi40IGlzIG5vdyBhdmFpbGFibGUgZm9yIDxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5kb3dubG9hZDwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGlzIGEgYnVnIGZpeCByZWxlYXNlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJBbnQgMS42LjMiPjwvYT4KKyAgICAgIEFudCAxLjYuMworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+QXByaWwgMjgsIDIwMDUgLSBBbnQgMS42LjMgQXZhaWxhYmxlPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBhY2hlIEFudCAxLjYuMyBpcyBub3cgYXZhaWxhYmxlIGZvciA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyI+ZG93bmxvYWQ8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlcmUgaXMgYSBsYXJnZSBsaXN0IG9mIGZpeGVkIGJ1Z3MgYW5kIGVuaGFuY2VtZW50cy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlNvbWUgb2YgdGhlIGJ1Z3MgYWZmZWN0aW5nIHRoZSBlbWJlZGRlZCB1c2Ugb2YgQW50IGFyZSBmaXhlZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQW50aWRvdGUgUmV0aXJlZCI+PC9hPgorICAgICAgQW50aWRvdGUgUmV0aXJlZAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+QXByaWwgNHRoLCAyMDA1IC0gVGhlIEFwYWNoZSBBbnQgUHJvamVjdCBSZXRpcmVzIEFudGlkb3RlLCB0aGUKKyAgICBBbnQgR1VJPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIEFudGlkb3RlIHN1YnByb2plY3Qgd2FzIG9uY2Ugc3RhcnRlZCB0byBwcm92aWRlIGEgR1VJIGZvcgorICAgIEFudCBhdCBhIHRpbWUgd2hlcmUgSURFIHN1cHBvcnQgZm9yIEFudCB3YXMgZmFyIGZyb20gdXNhYmxlLgorICAgIFVuZm9ydHVuYXRlbHkgaXQgbmV2ZXIgYXR0cmFjdGVkIGEgZGV2ZWxvcGVyIGNvbW11bml0eSBvZiBpdHMKKyAgICBvd24uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BdCB0aGUgc2FtZSB0aW1lIElERSBzdXBwb3J0IGZvciBBbnQgaGFzIGJlY29tZSB1YmlxdWl0b3VzIGJ5CisgICAgbm93IGFuZCB0aGVyZSBpcyBsaXR0bGUgcmVhc29uIHRvIGhhdmUgYSBHVUkganVzdCBmb3IgQW50LiAgVGhpcworICAgIG1ha2VzIGl0IGV2ZW4gbGVzcyBsaWtlbHkgdGhhdCB2b2x1bnRlZXJzIHdpbGwgc3RhcnQgdG8gc3BlbmQgdGltZQorICAgIHdvcmtpbmcgb24gaXQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnRpZG90ZSdzIGRldmVsb3BtZW50IGhhcyBiZWVuIHN0YWxsZWQgZm9yIHllYXJzIG5vdywgZGVzcGl0ZQorICAgIHNvbWUgZWZmb3J0cyB0byByZWp1dmVuYXRlIGl0IGJ5IHNpbmdsZSBkZXZlbG9wZXJzLiAgVGhlcmVmb3JlIHRoZQorICAgIEFudCBkZXZlbG9wZXJzIGhhdmUgY2hvc2VuIHRvIHJldGlyZSBBbnRpZG90ZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudGlkb3RlIHdpbGwgbm8gbG9uZ2VyIGJlIGRldmVsb3BlZCBieSB0aGUgQW50IHByb2plY3Q7IGl0cworICAgIENWUyBtb2R1bGUgd2lsbCBiZSBzaHV0IGRvd24uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gQW50aWRvdGUncyBzb3VyY2VzIHRvIGxlYXJuIGZyb20gb3IKKyAgICBidWlsZCBvbiBpdCwgeW91IGNhbiBmaW5kIHNuYXBzaG90cyBhdCA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2FudC9hbnRpZG90ZS8iPmh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvYW50L2FudGlkb3RlLzwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCAxLjYuMiI+PC9hPgorICAgICAgQW50IDEuNi4yCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5KdWx5IDE2LCAyMDA0IC0gQW50IDEuNi4yIEF2YWlsYWJsZTwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwYWNoZSBBbnQgMS42LjIgYXZhaWxhYmxlIGZvciA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyI+ZG93bmxvYWQ8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+TmVzdGVkIGVsZW1lbnRzIGZvciBuYW1lc3BhY2VkIHRhc2tzIGFuZCB0eXBlcyBtYXkgYmVsb25nIHRvIHRoZQorQW50IGRlZmF1bHQgbmFtZXNwYWNlIGFzIHdlbGwgYXMgdGhlIHRhc2sncyBvciB0eXBlJ3MgbmFtZXNwYWNlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QWxsIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRhc2tzIGFyZSBub3cgd3JhcHBlZCBpbiBhCitidWlsZGV4Y2VwdGlvbiBnaXZpbmcgdGhlIGxvY2F0aW9uIGluIHRoZSBidWlsZGZpbGUgb2YgdGhlIHRhc2suPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnQgMS42LjIgZml4ZXMgYSBsYXJnZSBudW1iZXIgb2YgYnVncyBhbmQgYWRkcyBhIG51bWJlciBvZgorZmVhdHVyZXMgd2hpY2ggd2VyZSBhc2tlZCBmb3IgYnkgdXNlcnMgb24gQnVnemlsbGEuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9Ildpa2kgTWlncmF0aW9uIj48L2E+CisgICAgICBXaWtpIE1pZ3JhdGlvbgorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+RmVicnVhcnkgMjksIDIwMDQ8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgQW50IFdpa2kgcGFnZXMgaGF2ZSBiZWVuIG1pZ3JhdGVkIHRvIHRoZWlyIAorICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvIj5uZXcgaG9tZTwvYT4gb24gdGhlIEFwYWNoZQorICAgICAgV2lraSBmYXJtLgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJBbnQgMS42LjEiPjwvYT4KKyAgICAgIEFudCAxLjYuMQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+RmVicnVhcnkgMTIsIDIwMDQgLSBBbnQgMS42LjEgQXZhaWxhYmxlPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBhY2hlIEFudCAxLjYuMSBpcyBzdGlsbCBhdmFpbGFibGUgZm9yCisgICAgICA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyI+ZG93bmxvYWQ8L2E+LgorICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBBU0YgQm9hcmQgaGFzIGFwcHJvdmVkIHRoZSBuZXcgQXBhY2hlIExpY2Vuc2UgMi4wLgorICAgIEZvciBhIGNvcHkgb2YgdGhhdCBsaWNlbnNlLCBwbGVhc2Ugc2VlCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyI+CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLzwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgQW50IDEuNi4xIHJlbGVhc2UgaXMgZGVsaXZlcmVkIHdpdGggdGhlCisgICAgQXBhY2hlIExpY2Vuc2UgMi4wLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50IDEuNi4xIGZpeGVzIHNldmVyYWwgYnVncywgbW9zdCBub3RhYmx5IHRoZSBoYW5kbGluZworICAgIG9mIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgbmVzdGVkIGVsZW1lbnRzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50IDEuNi4xIGFsc28gaW50cm9kdWNlcyBpbml0aWFsIHN1cHBvcnQgZm9yIGNvbXBpbGluZyB3aXRoCisgICAgSmF2YSAxLjUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCAxLjYuMCI+PC9hPgorICAgICAgQW50IDEuNi4wCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5EZWNlbWJlciAxOCwgMjAwMyAtIEFudCAxLjYuMCBBdmFpbGFibGU8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcGFjaGUgQW50IDEuNi4wIGlzIHN0aWxsIGF2YWlsYWJsZSBmb3IKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5kb3dubG9hZDwvYT4uCisgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXMKKyAgICB3ZSd2ZSBhbHJlYWR5IHNhaWQgaW4gdGhlIGFubm91bmNlbWVudHMgb2YgQW50IDEuNS40LCB0aGlzIHJlbGVhc2UKKyAgICByZXF1aXJlcyBKREsgMS4yIG9yIGxhdGVyIHRvIHJ1bi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudCAxLjYuMCBhZGRzIGEgbG90IG9mIG5ldyBmZWF0dXJlcywgbW9zdCBwcm9taW5lbnRseSBzdXBwb3J0CisgICAgZm9yIFhNTCBuYW1lc3BhY2VzIGFzIHdlbGwgYXMgYSBuZXcgY29uY2VwdCBvZiBBbnQgbGlicmFyaWVzIHRoYXQKKyAgICBtYWtlcyB1c2Ugb2YgbmFtZXNwYWNlcyB0byBhdm9pZCBuYW1lIGNsYXNoZXMgb2YgY3VzdG9tIHRhc2tzLgorICAgIEZvciBhIGxvbmdlciBsaXN0IG9mIGZpeGVkIGJ1Z3MgYW5kIG5ldyBmZWF0dXJlcyBzZWUgdGhlIHJlbGVhc2UKKyAgICBub3Rlcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdSBmaW5kIGFueXRoaW5nIHRoYXQgaGFzbid0IGJlZW4gY292ZXJlZCBpbiB0aGUgbWFudWFsIChJIGJldCB5b3UKK2RpZCkgb3IgY291bGQgYmUgZXhwbGFpbmVkIGJldHRlciwgZmVlbCBmcmVlIHRvIGhlbHAgdXMgb3V0IGluIHRoZQorPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvTmV3QW50RmVhdHVyZXNJbkRldGFpbCI+V2lraTwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCAxLjUuNCI+PC9hPgorICAgICAgQW50IDEuNS40CisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5BdWd1c3QgMTIsIDIwMDMgLSBBbnQgMS41LjQgQXZhaWxhYmxlPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBhY2hlIEFudCAxLjUuNCBpcyBzdGlsbCBhdmFpbGFibGUgZm9yCisgICAgIDxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5kb3dubG9hZDwvYT4uCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGlzIGEgbWlub3IgYnVnZml4IHJlbGVhc2UgdGhhdCBmaXhlcyBhIHByb2JsZW0gd2l0aCB0aGUKKyAgICA8Y29kZT5qYXZhaDwvY29kZT4gdGFzayBvbiBKREsgMS40LjIgYW5kIGEgY291cGxlIG9mIGJ1Z3MgaW4gdGhlCisgICAgVmlzdWFsIEFnZSBmb3IgSmF2YSBpbnRlcmdyYXRpb24gdGFza3MuICBJZiB5b3UgZG9uJ3QgdXNlIGphdmFoIG9yCisgICAgVkFKLCB0aGVyZSBpcyBubyByZWFzb24gdG8gdXBncmFkZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmciPgorICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5Ob3RlPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iY29udGVudCI+QW50IDEuNS40IGlzIHRoZSBsYXN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cworICAgICAgSkRLIDEuMS4gQW50IDEuNi4wIHJlcXVpcmVzIEpESyAxLjIgb3IKKyAgICAgIGxhdGVyLgorICAgIDwvZGl2PgorICAgIDwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkphdmEgUHJvIDIwMDMgUmVhZGVycyBDaG9pY2UgQXdhcmQiPjwvYT4KKyAgICAgIEphdmEgUHJvIDIwMDMgUmVhZGVycyBDaG9pY2UgQXdhcmQKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5mdHBvbmxpbmUuY29tL2phdmFwcm8vIj4KKyAgICAgIDxpbWcgc3R5bGU9InBhZGRpbmc6IDVweCIgc3JjPSJpbWFnZXMvanBfcmN3aW5uZXJfMjAwMy5naWYiIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iODAiIHdpZHRoPSIxMzkiIGFsaWduPSJyaWdodCIgLz48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5KdW5lIDExdGgsIDIwMDM6IEFudCB3aW5zIGEgSmF2YSBQcm8gcmVhZGVycycgY2hvaWNlIGF3YXJkPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICBBbnQgaGFzIHdvbiB0aGUgSmF2YSBQcm8gMjAwMyBSZWFkZXJzJyBDaG9pY2UgQXdhcmQgZm9yIAorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICA8c3Ryb25nPk1vc3QgVmFsdWFibGUgSmF2YSBEZXBsb3ltZW50IFRlY2hub2xvZ3k8L3N0cm9uZz4uCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgIFRoYW5rcyB0byBKYXZhIFBybyBhbmQgYWxsIGl0cyByZWFkZXJzLiBZb3UgY2FuIHJlYWQgYWJvdXQKKyAgICAgIHRoZXNlIAorICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5mdHBvbmxpbmUuY29tL3JlcG9ydHMvamF2YW9uZS8yMDAzL2F3YXJkcy8iPmF3YXJkczwvYT4KKyAgICAgIGF0IHRoZSBKYXZhIFBybyB3ZWJzaXRlLgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJKREogRWRpdG9ycyBDaG9pY2UgQXdhcmQiPjwvYT4KKyAgICAgIEpESiBFZGl0b3JzIENob2ljZSBBd2FyZAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3lzLWNvbi5jb20vamF2YS9hcnRpY2xlMmEuY2ZtP2lkPTIwNTkmYW1wO2NvdW50PTE3MzQmYW1wO3RvdD02JmFtcDtwYWdlPTIiPjxpbWcgc3JjPSJpbWFnZXMvSkRKRWRpdG9yc0Nob2ljZUF3YXJkLmpwZyIgYWx0PSIiIGJvcmRlcj0iMCIgYWxpZ249InJpZ2h0IiAvPjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkp1bmUgMjAwMzogQW50IHdpbnMgSkRKIEVkaXRvcnMnIENob2ljZSBBd2FyZDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorIkFudCBpcyB0aGUgaGFtbWVyIG9mIHRoZSBKYXZhIHdvcmxkOiB3aXRob3V0IGl0LCBjaXZpbGl6YXRpb24gbWlnaHQgaGF2ZSBwcm9ncmVzc2VkLCBidXQgbXVjaCBtb3JlIHNsb3dseSB0aGFuIGl0IGhhcy4gQW50IGlzIG9uZSBvZiB0aGUgbW9zdCB1c2VmdWwgYnVpbGQgdG9vbHMgSSBoYXZlIGV2ZXIgaGFkIHRoZSBwbGVhc3VyZSB0byB1c2UuIiAtIEpvZSBPdHRpbmdlcgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJBbnQga2VlcHMgb24gd2lubmluZyEiPjwvYT4KKyAgICAgIEFudCBrZWVwcyBvbiB3aW5uaW5nIQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vIj48aW1nIHNyYz0iaW1hZ2VzL2p3X2VjX2xvZ29fd2lubmVyMjAwMy5naWYiIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTA4IiB3aWR0aD0iMjUyIiBhbGlnbj0icmlnaHQiIC8+PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+SnVuZSA5dGgsIDIwMDM6IEFudCB3aW5zIHRoZSBKYXZhV29ybGQgRWRpdG9ycycgQ2hvaWNlIEF3YXJkPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgQW50IGhhcyB3b24gdGhlIEphdmFXb3JsZCBFZGl0b3JzJyBDaG9pY2UgQXdhcmQgZm9yCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICA8c3Ryb25nPk1vc3QgVXNlZnVsIEphdmEgQ29tbXVuaXR5LURldmVsb3BlZCBUZWNobm9sb2d5PC9zdHJvbmc+CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICBmb3IgdGhlIHNlY29uZCB0aW1lIGluIGEgcm93ISBSZWFkIHRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamF2YXdvcmxkLmNvbS9qYXZhd29ybGQvanctMDYtMjAwMy9qdy0wNjA5LWVjYS5odG1sIj4gZnVsbCBhcnRpY2xlPC9hPiAtLSBvciBqdW1wIGRpcmVjdGx5IHRvIHRoZSBiaXQgYWJvdXQKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTA2LTIwMDMvanctMDYwOS1lY2EtcDQuaHRtbCI+IG91ciBhd2FyZDwvYT4gPGNvZGU+Oik8L2NvZGU+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCAxLjUuMyI+PC9hPgorICAgICAgQW50IDEuNS4zCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5BcHJpbCA5LCAyMDAzIC0gQW50IDEuNS4zIEF2YWlsYWJsZTwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwYWNoZSBBbnQgMS41LjMgaXMgc3RpbGwgYXZhaWxhYmxlIGZvcgorICAgICA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyI+ZG93bmxvYWQ8L2E+LgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJBbnQgMS41LjIiPjwvYT4KKyAgICAgIEFudCAxLjUuMgorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+TWFyY2ggMywgMjAwMyAtIEFudCAxLjUuMiBBdmFpbGFibGUhPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGZpbmFsIHZlcnNpb24gb2YgQW50IDEuNS4yIGlzIGF2YWlsYWJsZSBmb3IKKyAgICAgPGEgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2FudC8iPmRvd25sb2FkPC9hPi4KKyAgICAgSWYgeW91IGhhdmUgYW55IGZlZWRiYWNrIG9uIHRoaXMgcmVsZWFzZSwgZmVlbCBmcmVlIHRvIGpvaW4gdGhlIAorICAgICBkaXNjdXNzaW9uIG9uIHRoZSBkZXYgYW5kIHVzZXIgbWFpbGluZyBsaXN0cy4KKyAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCBUb3AgTGV2ZWwgUHJvamVjdCI+PC9hPgorICAgICAgQW50IFRvcCBMZXZlbCBQcm9qZWN0CisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5Ob3ZlbWJlciAxOCwgMjAwMjwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBBcGFjaGUgYm9hcmQgPGEgaHJlZj0ibWlzc2lvbi5odG1sIj5jcmVhdGVkPC9hPgorICAgICAgIHRoZSBBcGFjaGUgQW50IHRvcCBsZXZlbCBwcm9qZWN0LiBBbnQgaGFzIG5vdyBtaWdyYXRlZCBmcm9tIHRoZSBKYWthcnRhCisgICAgICAgcHJvamVjdCBpbnRvIGFuIEFwYWNoZSBwcm9qZWN0IG9mIGl0cyBvd24uIFRoaXMgaXMgcHJpbWFyaWx5IGFuCisgICAgICAgb3JnYW5pemF0aW9uYWwgY2hhbmdlIGFuZCB3aWxsIG5vdCBhZmZlY3QgdGhlIHRlY2huaWNhbCBhc3BlY3RzIG9mCisgICAgICAgdGhlIHByb2plY3QuIEFudCByZXRhaW5zIGEgc3Ryb25nIGFzc29jaWF0aW9uIHdpdGggdGhlIEFwYWNoZQorICAgICAgIEpha2FydGEgcHJvamVjdC4gT25lIGVmZmVjdCBvZiB0aGlzIGNoYW5nZSBpcyB0aGF0IHRoZSBBbnQgd2VicGFnZQorICAgICAgIGlzIG5vdyBsb2NhdGVkIGF0IDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L2E+CisgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJBbnQgMS41LjEiPjwvYT4KKyAgICAgIEFudCAxLjUuMQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+T2N0b2JlciAzLCAyMDAyIC0gQW50IDEuNS4xIEF2YWlsYWJsZSAhPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGZpbmFsIHZlcnNpb24gb2YgQW50IDEuNS4xIGlzIHN0aWxsIGF2YWlsYWJsZSBmb3IKKyAgICAgPGEgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2FudC8iPgorICAgICBkb3dubG9hZDwvYT4uIElmIHlvdSBoYXZlIGFueSBmZWVkYmFjayBvbiB0aGlzIHJlbGVhc2UsIGZlZWwgZnJlZSB0byBqb2luIHRoZSAKKyAgICAgZGlzY3Vzc2lvbiBvbiB0aGUgYW50LWRldiBhbmQgYW50LXVzZXIgbWFpbGluZyBsaXN0cy4KKyAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCAxLjUiPjwvYT4KKyAgICAgIEFudCAxLjUKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkp1bHkgMTUsIDIwMDIgLSBGaXggZm9yIEN5Z3dpbiBwcm9ibGVtIGluIHdyYXBwZXIgc2NyaXB0IGF2YWlsYWJsZTwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSB3cmFwcGVyIHNjcmlwdCBvZiBBbnQgMS41IG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBuZXcKKyAgICAgIHZlcnNpb24gZm9yIEN5Z3dpbiB1c2Vycy4gIFNlZSB0aGUgPGEgaHJlZj0iZmFxLmh0bWwjMS41LWN5Z3dpbi1zaCI+RkFRPC9hPiBmb3IgZGV0YWlscy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5KdWx5IDEwLCAyMDAyIC0gQW50IDEuNSBSZWxlYXNlZCE8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgZmluYWwgdmVyc2lvbiBvZiBBbnQgMS41IGlzIG5vdyBhdmFpbGFibGUgZm9yIAorICAgICA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyI+CisgICAgIGRvd25sb2FkPC9hPi4gSWYgeW91IGhhdmUgYW55IGZlZWRiYWNrIG9uIHRoaXMgcmVsZWFzZSwgZmVlbCBmcmVlIHRvIGpvaW4gdGhlIAorICAgICBkaXNjdXNzaW9uIG9uIHRoZSBhbnQtZGV2IGFuZCBhbnQtdXNlciBtYWlsaW5nIGxpc3RzLgorICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQW50IHdpbnMgYWdhaW4hIj48L2E+CisgICAgICBBbnQgd2lucyBhZ2FpbiEKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5zZG1hZ2F6aW5lLmNvbS8iPjxpbWcgc3JjPSJpbWFnZXMvc2RtX3Byb2R1Y3Rpdml0eV9hd2FyZC5naWYiIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTA4IiB3aWR0aD0iMTgxIiBhbGlnbj0icmlnaHQiIC8+PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+QXByIDI5LCAyMDAyOiBBbnQgd2lucyA8ZW0+U29mdHdhcmUgRGV2ZWxvcG1lbnQ8L2VtPiBtYWdhemluZSdzCisgICAgMjAwMiBQcm9kdWN0aXZpdHkgQXdhcmQuPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgQW50IGhhcyBiZWVuIGF3YXJkZWQgYSA8c3Ryb25nPjIwMDIgUHJvZHVjdGl2aXR5IEF3YXJkPC9zdHJvbmc+IGJ5CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5zZG1hZ2F6aW5lLmNvbS8iPjxlbT5Tb2Z0d2FyZSBEZXZlbG9wbWVudDwvZW0+PC9hPgorICAgIG1hZ2F6aW5lLiAgUmVhZCB0aGUKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LnNkbWFnYXppbmUuY29tL2pvbHRzL3ByZXNzX3JlbGVhc2VfNC0yNi0wMi5odG0iPgorICAgIHByZXNzIHJlbGVhc2U8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCB0aGUgZnVsbCBsaXN0IG9mIHdpbm5lcnMuCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCBoYXMgd29uISI+PC9hPgorICAgICAgQW50IGhhcyB3b24hCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamF2YXdvcmxkLmNvbS8iPjxpbWcgc3JjPSJpbWFnZXMvandfZWNfbG9nb193aW5uZXIyMDAyLmdpZiIgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMDgiIHdpZHRoPSIyNTIiIGFsaWduPSJyaWdodCIgLz48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5NYXIgMjYsIDIwMDI6IEFudCB3aW5zIHRoZSBKYXZhV29ybGQgRWRpdG9ycycgQ2hvaWNlCisgICAgQXdhcmQ8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICBBbnQgaGFzIHdvbiB0aGUgSmF2YVdvcmxkIEVkaXRvcnMnIENob2ljZSBBd2FyZCBmb3IKKyAgICA8c3Ryb25nPk1vc3QgVXNlZnVsIEphdmEgQ29tbXVuaXR5LURldmVsb3BlZCBUZWNobm9sb2d5PC9zdHJvbmc+LgorICAgIFJlYWQgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhd29ybGQuY29tL2phdmF3b3JsZC9qdy0wMy0yMDAyL2p3LTAzMjYtYXdhcmRzLmh0bWwgIj4gZnVsbCBhcnRpY2xlPC9hPiAtLSBvciBqdW1wIGRpcmVjdGx5IHRvIHRoZSBiaXQgYWJvdXQKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTAzLTIwMDIvanctMDMyNi1hd2FyZHMtcDMuaHRtbCI+IG91ciBhd2FyZDwvYT4gPGNvZGU+Oik8L2NvZGU+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkphdmEgMS40IFN1cHBvcnQiPjwvYT4KKyAgICAgIEphdmEgMS40IFN1cHBvcnQKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkZlYiAxNSwgMjAwMjogSmF2YSAxLjQgU3VwcG9ydDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgSmF2YSAxLjQgaGFzIG5vdyBiZWVuIHJlbGVhc2VkIGJ5IFN1bi4gVGhlIGxhdGVzdCBBbnQgc291cmNlIHN1cHBvcnRzIAorICAgICAgdGhlIG5ldyA8dHQ+YXNzZXJ0PC90dD4gc3RhdGVtZW50IGluIHRoZSBjb21waWxlciB0YXNrIHZpYSB0aGUgPHR0PnNvdXJjZTwvdHQ+IAorICAgICAgYXR0cmlidXRlLiBJdCBhbHNvIGNvbnRhaW5zIGEgY29tcGF0aWJpbGl0eSBmaXggbmVlZGVkIGZvciBzb21lIGFudCB0YXNrcworICAgICAgb24gSmF2YSAxLjQgb3ZlciBXaW5kb3dzIFhQLiBJZiB5b3UgaGF2ZSBwcm9ibGVtcyBydW5uaW5nIEFudCAxLjQuMSBvbiBXaW5YUC9KYXZhIDEuNCwKKyAgICAgIHBsZWFzZSB1c2UgYSByZWNlbnQgYnVpbGQgb3IgY29tcGlsZSB5b3VyIG93biB2ZXJzaW9uIGZyb20gdGhlIHNvdXJjZSB0cmVlLiAKKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iU2VlIG91ciBuZXcgbG9nbyEiPjwvYT4KKyAgICAgIFNlZSBvdXIgbmV3IGxvZ28hCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5IYXZlIGEgbG9vayBhdCBvdXIgbmV3IGNvb2wgbG9nbyE8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudCAxLjQuMSI+PC9hPgorICAgICAgQW50IDEuNC4xCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMz4xMSBPY3RvYmVyIDIwMDEgQW50IDEuNC4xIHJlbGVhc2VkICE8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5QbGVhc2UgdmlzaXQgdGhlIAorICAgICA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyI+CisgICAgIGRvd25sb2FkIGFyZWE8L2E+LiAKKyAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkJlc3QtUHJhY3RpY2VzIFByb2ZpbGUgb2YgQW50IGF0IFN1bidzIERvdC1Db20gQnVpbGRlciI+PC9hPgorICAgICAgQmVzdC1QcmFjdGljZXMgUHJvZmlsZSBvZiBBbnQgYXQgU3VuJ3MgRG90LUNvbSBCdWlsZGVyCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlN1biBoYXMgcmVsZWFzZWQgYW4gaW50cm9kdWN0b3J5IGFydGljbGUgb24gQW50IG9uIHRoZWlyCisgICAgICBEb3QtQ29tIEJ1aWxkZXIgc2l0ZSBvbiBNYXmgMzCgMjAwMS4gU2VlIDxhIGhyZWY9Imh0dHA6Ly9kY2Iuc3VuLmNvbS9wcmFjdGljZXMvcHJvZmlsZXMvYW50LmpzcCI+aHR0cDovL2RjYi5zdW4uY29tL3ByYWN0aWNlcy9wcm9maWxlcy9hbnQuanNwPC9hPjwvcD4KKyAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9hcHBlbmRpeF9lLnBkZiBiL3RydW5rL2RvY3MvYXBwZW5kaXhfZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlNWFhOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvYXBwZW5kaXhfZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9iaW5kb3dubG9hZC5jZ2kgYi90cnVuay9kb2NzL2JpbmRvd25sb2FkLmNnaQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzI0Zjc2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9iaW5kb3dubG9hZC5jZ2kKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0CisjICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCisjICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQorY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycworL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9iaW5kb3dubG9hZC5odG1sIGIvdHJ1bmsvZG9jcy9iaW5kb3dubG9hZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzVkYmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2JpbmRvd25sb2FkLmh0bWwKQEAgLTAsMCArMSwzNDcgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIEJpbmFyeSBEaXN0cmlidXRpb25zPC90aXRsZT4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CisgICAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+SG9tZTwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4vcHJvamVjdHMvaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+UHJvamVjdHM8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BcGFjaGUgQW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xpY2Vuc2UuaHRtbCI+TGljZW5zZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2FudG5ld3MuaHRtbCI+TmV3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2V4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9mYXEuaHRtbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvRnJvbnRQYWdlIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvYmxlbXMuaHRtbCI+SGF2aW5nIFByb2JsZW1zPzwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvd25sb2FkCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZWwiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkNvbnRyaWJ1dGluZworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21haWwuaHRtbCI+TWFpbGluZyBMaXN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3N2bi5odG1sIj5TdWJ2ZXJzaW9uIFJlcG9zaXRvcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL25pZ2h0bGllcy5odG1sIj5OaWdodGx5IEJ1aWxkczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J1Z3MuaHRtbCI+QnVnIERhdGFiYXNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+U3BvbnNvcnNoaXAKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiPlRoYW5rczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIj5TcG9uc29yc2hpcDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCI+RG9uYXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdCBNYW5hZ2VtZW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vY29udHJpYnV0b3JzLmh0bWwiPkNvbnRyaWJ1dG9yczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21pc3Npb24uaHRtbCI+QXBhY2hlIEFudCBNaXNzaW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnlsYXdzLmh0bWwiPlByb2plY3QgQnlsYXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGVnYWwuaHRtbCI+TGVnYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9oMT4KKyAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJEb3dubG9hZGluZyBBbnQiPjwvYT4KKyAgICAgIERvd25sb2FkaW5nIEFudAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Vc2UgdGhlIGxpbmtzIGJlbG93IHRvIGRvd25sb2FkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBBbnQgZnJvbQorb25lIG9mIG91ciBtaXJyb3JzLiAgSXQgaXMgZ29vZCBwcmFjdGljZSB0bworPGEgaHJlZj0iW2xvY2F0aW9uXSNWZXJpZnkgUmVsZWFzZXMiPnZlcmlmeSB0aGUgaW50ZWdyaXR5PC9hPgorb2YgdGhlIGRpc3RyaWJ1dGlvbiBmaWxlcywgZXNwZWNpYWxseSBpZiB5b3UgYXJlIHVzaW5nIG9uZSBvZiBvdXIKK21pcnJvciBzaXRlcy4gIEluIG9yZGVyIHRvIGRvIHRoaXMgeW91IG11c3QgdXNlIHRoZSBzaWduYXR1cmVzIGZyb20KK291ciA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5tYWluIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudCBpcyBkaXN0cmlidXRlZCBhcyA8Y29kZT56aXA8L2NvZGU+LCA8Y29kZT50YXIuZ3o8L2NvZGU+IGFuZAorPGNvZGU+dGFyLmJ6MjwvY29kZT4gYXJjaGl2ZXMgLSB0aGUgY29udGVudHMgYXJlIHRoZSBzYW1lLiAgUGxlYXNlCitub3RlIHRoYXQgdGhlIDxjb2RlPnRhci4qPC9jb2RlPiBhcmNoaXZlcyBjb250YWluIGZpbGUgbmFtZXMgbG9uZ2VyCit0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBoYXZlIGJlZW4gY3JlYXRlZCB1c2luZyBHTlUgdGFyIGV4dGVuc2lvbnMuCitUaHVzIHRoZXkgbXVzdCBiZSB1bnRhcnJlZCB3aXRoIGEgR05VIGNvbXBhdGlibGUgdmVyc2lvbiBvZgorPGNvZGU+dGFyPC9jb2RlPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkluIGFkZGl0aW9uIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmpwYWNrYWdlLm9yZyI+SlBhY2thZ2UKK3Byb2plY3Q8L2E+IHByb3ZpZGVzIFJQTXMgYXQgdGhlaXIgb3duIGRpc3RyaWJ1dGlvbiBzaXRlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IGRvIG5vdCBzZWUgdGhlIGZpbGUgeW91IG5lZWQgaW4gdGhlIGxpbmtzIGJlbG93LCBwbGVhc2Ugc2VlCit0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50LyI+bWFzdGVyIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPiBvciwgcHJlZmVyYWJseSwgaXRzIDxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC8iPm1pcnJvcjwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9Ik1pcnJvciI+PC9hPgorICAgICAgTWlycm9yCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPllvdSBhcmUgY3VycmVudGx5IHVzaW5nIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmIHlvdSBlbmNvdW50ZXIgYQorcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiAgSWYgYWxsCittaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUgPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mCit0aGUgbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIj4KK090aGVyIG1pcnJvcnM6IDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj4KK1tpZi1hbnkgaHR0cF0KKyAgW2ZvciBodHRwXTxvcHRpb24gdmFsdWU9IltodHRwXSI+W2h0dHBdPC9vcHRpb24+W2VuZF0KK1tlbmRdCitbaWYtYW55IGZ0cF0KKyAgW2ZvciBmdHBdPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF0KK1tlbmRdCitbaWYtYW55IGJhY2t1cF0KKyAgW2ZvciBiYWNrdXBdPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+W2VuZF0KK1tlbmRdCis8L3NlbGVjdD4KKzxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiIC8+Cis8L2Zvcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQ3VycmVudCBSZWxlYXNlIG9mIEFudCI+PC9hPgorICAgICAgQ3VycmVudCBSZWxlYXNlIG9mIEFudAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5DdXJyZW50bHksIEFwYWNoZSBBbnQgMS43LjAgaXMgdGhlIGJlc3QgYXZhaWxhYmxlIHZlcnNpb24sIHNlZSB0aGUKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9SRUFETUUuaHRtbCI+cmVsZWFzZSBub3RlczwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj4KKzxkaXYgY2xhc3M9ImxhYmVsIj5Ob3RlPC9kaXY+Cis8ZGl2IGNsYXNzPSJjb250ZW50Ij5BbnQgMS43LjAgaGFzIGJlZW4gcmVsZWFzZWQgb24gMTktRGVjLTIwMDYgYW5kCittYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgbWlycm9ycyBmb3IgYSBmZXcgZGF5cy48L2Rpdj4KKzwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZyI+Cis8ZGl2IGNsYXNzPSJsYWJlbCI+VGFyIGZpbGVzIG1heSByZXF1aXJlIGdudSB0YXIgdG8gZXh0cmFjdDwvZGl2PgorPGRpdiBjbGFzcz0iY29udGVudCI+VGFyIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gY29udGFpbiBsb25nIGZpbGUgbmFtZXMsIGFuZCBtYXkKKyByZXF1aXJlIGdudSB0YXIgdG8gZG8gdGhlIGV4dHJhY3Rpb24uPC9kaXY+Cis8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorPGxpPjxjb2RlPi56aXA8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4uemlwIj5hcGFjaGUtYW50LTEuNy4wLWJpbi56aXA8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2JpbmFyaWVzL2FwYWNoZS1hbnQtMS43LjAtYmluLnppcC5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2JpbmFyaWVzL2FwYWNoZS1hbnQtMS43LjAtYmluLnppcC5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4uemlwLm1kNSI+TUQ1PC9hPl08L2xpPgorCis8bGk+PGNvZGU+LnRhci5nejwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9iaW5hcmllcy9hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuZ3oiPmFwYWNoZS1hbnQtMS43LjAtYmluLnRhci5nejwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmd6LmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmd6LnNoYTEiPlNIQTE8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9iaW5hcmllcy9hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuZ3oubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmJ6MjwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9iaW5hcmllcy9hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuYnoyIj5hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuYnoyPC9hPgorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9iaW5hcmllcy9hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuYnoyLmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmJ6Mi5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmJ6Mi5tZDUiPk1ENTwvYT5dPC9saT4KKzwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iT2xkIEFudCBSZWxlYXNlcyI+PC9hPgorICAgICAgT2xkIEFudCBSZWxlYXNlcworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5PbGRlciByZWxlYXNlcyBvZiBBbnQgY2FuIGJlIGZvdW5kIDxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvIj5oZXJlPC9hPi4gIFRob3NlCityZWxlYXNlcyBhcmUgb25seSBwcm92aWRlZCBhcyA8Y29kZT56aXA8L2NvZGU+IGFyY2hpdmVzIHRoYXQgY2FuIGJlCitleHRyYWN0ZWQgYnkgPGNvZGU+amFyIHhmIDwvY29kZT48ZW0+YXJjaGl2ZS56aXA8L2VtPiAtIHdlIGhpZ2hseQorcmVjb21tZW5kIHRvIG5vdCB1c2UgdGhvc2UgcmVsZWFzZXMgYnV0IHVwZ3JhZGUgdG8gQW50J3MgPGEgaHJlZj0iW2xvY2F0aW9uXSNDdXJyZW50IFJlbGVhc2Ugb2YgQW50Ij5sYXRlc3Q8L2E+IHJlbGVhc2UuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IlZlcmlmeSBSZWxlYXNlcyI+PC9hPgorICAgICAgVmVyaWZ5IFJlbGVhc2VzCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkl0IGlzIGVzc2VudGlhbCB0aGF0IHlvdSB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZG93bmxvYWRlZAorZmlsZXMgdXNpbmcgdGhlIFBHUCBzaWduYXR1cmUgb3IgdGhlIFNIQTEgb3IgTUQ1IGNoZWNrc3Vtcy4gIFRoZQorY2hlY2tzdW1zIGFyZSBub3QgYXMgc3Ryb25nIGluZGljYXRvcnMgYXMgdGhlIFBHUCBzaWduYXR1cmUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgUEdQIHNpZ25hdHVyZXMgY2FuIGJlIHZlcmlmaWVkIHVzaW5nIFBHUCBvciBHUEcuICBGaXJzdAorZG93bmxvYWQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9LRVlTIj5LRVlTPC9hPgorYXMgd2VsbCBhcyB0aGUgPGNvZGU+YXNjPC9jb2RlPiBzaWduYXR1cmUgZmlsZSBmb3IgdGhlIHBhcnRpY3VsYXIKK2Rpc3RyaWJ1dGlvbi4gIE1ha2Ugc3VyZSB5b3UgZ2V0IHRoZXNlIGZpbGVzIGZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC8iPm1haW4gZGlzdHJpYnV0aW9uCitkaXJlY3Rvcnk8L2E+LCByYXRoZXIgdGhhbiBmcm9tIGEgbWlycm9yLiBUaGVuIHZlcmlmeSB0aGUgc2lnbmF0dXJlcwordXNpbmc8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxjb2RlPgorJSBwZ3BrIC1hIEtFWVM8YnIgLz4KKyUgcGdwdiBhcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuZ3ouYXNjPGJyIC8+Cis8L2NvZGU+Cis8ZW0+b3I8L2VtPjxiciAvPgorPGNvZGU+CislIHBncCAta2EgS0VZUzxiciAvPgorJSBwZ3AgYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmd6LmFzYzxiciAvPgorPC9jb2RlPgorPGVtPm9yPC9lbT48YnIgLz4KKzxjb2RlPgorJSBncGcgLS1pbXBvcnQgS0VZUzxiciAvPgorJSBncGcgLS12ZXJpZnkgYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmd6LmFzYworPC9jb2RlPjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QSBjb21tYW5kIGxpbmUgdmVyc2lvbiBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmdudXBnLm9yZy9kb3dubG9hZC8iPkdudVBHPC9hPiAKK2lzIGFsc28gYXZhaWxhYmxlIGZvciBXaW5kb3dzIHVzZXJzLiAgRm9sbG93IHRoZSAKKzxhIGhyZWY9Imh0dHA6Ly93d3cuZ251cGcub3JnLyhlbikvZG9jdW1lbnRhdGlvbi9mYXFzLmh0bWwjcTQuMTkiPmluc3RydWN0aW9uczwvYT4gCit0byB2ZXJpZnkgdGhlIHBhY2thZ2UuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHZlcmlmeSB0aGUgY2hlY2tzdW1zIG9uIHRoZSBmaWxlcy4gIFVuaXgKK3Byb2dyYW1zIGNhbGxlZCA8Y29kZT5tZDU8L2NvZGU+Lzxjb2RlPnNoYTE8L2NvZGU+IG9yCis8Y29kZT5tZDVzdW08L2NvZGU+Lzxjb2RlPnNoYTFzdW08L2NvZGU+IGFyZSBpbmNsdWRlZCBpbiBtYW55IHVuaXgKK2Rpc3RyaWJ1dGlvbnMuICA8Y29kZT4qc3VtPC9jb2RlPiBpcyBhbHNvIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXh0dXRpbHMvdGV4dHV0aWxzLmh0bWwiPkdOVQorVGV4dHV0aWxzPC9hPi4gIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5mb3VybWlsYWIuY2gvbWQ1LyI+aGVyZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cucGMtdG9vbHMubmV0L3dpbjMyL2ZyZWV3YXJlL2NvbnNvbGUvIj5oZXJlPC9hPi4gIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2xhdmFzb2Z0LmNvbS9mc3VtLyI+ZnN1bTwvYT4gc3VwcG9ydHMgTUQ1IGFuZAorU0hBMS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPldlIGhpZ2hseSByZWNvbW1lbmQgdG8gdmVyaWZ5IHRoZSBQR1Agc2lnbmF0dXJlLCB0aG91Z2guPC9wPgorICAgICAgICAgICAgICAgIAorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IS0tCisgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoIiAtICIrIkxhc3QgUHVibGlzaGVkOiAiICsgZG9jdW1lbnQubGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgLy8gIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvcD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2JyZWFkY3J1bWJzLmpzIGIvdHJ1bmsvZG9jcy9icmVhZGNydW1icy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTE3MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9icmVhZGNydW1icy5qcwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKioKKyAqIFRoaXMgc2NyaXB0LCB3aGVuIGluY2x1ZGVkIGluIGEgaHRtbCBmaWxlLCBidWlsZHMgYSBuZWF0IGJyZWFkY3J1bWIgdHJhaWwKKyAqIGJhc2VkIG9uIGl0cyB1cmwuIFRoYXQgaXMsIGlmIGl0IGRvZXNuJ3QgY29udGFpbnMgYnVncyAoSSdtIHJlbGF0aXZlbHkKKyAqIHN1cmUgaXQgZG9lcykuCisgKgorICogVHlwaWNhbCB1c2FnZToKKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJicmVhZGNydW1icy5qcyI+PC9zY3JpcHQ+CisgKgorICpAYXV0aG9yICAgICA8YSBocmVmPSJtYWlsdG86bGVvc2ltb25zQGFwYWNoZS5vcmciPkxlbyBTaW1vbnM8L2E+IChtYWluIGF1dGhvcikKKyAqQGF1dGhvciAgICAgPGEgaHJlZj0ibWFpbHRvOm5pY29sYWtlbkBhcGFjaGUub3JnIj5OaWNvbGEgS2VuIEJhcm96emk8L2E+IChpbnRlZ3JhdGlvbiBpbiBza2luKQorICpAY3JlYXRlZCAgICBKdWx5IDEyLCAyMDAyCisgKkB2ZXJzaW9uICAgIDEuMAorICovCisKKy8qKgorICogSUUgNSBvbiBNYWMgZG9lc24ndCBrbm93IEFycmF5LnB1c2guCisgKgorICogSW1wbGVtZW50IGl0IC0gY291cnRlc3kgdG8gZnJpdHouCisgKi8KK3ZhciBhYmMJPSBuZXcgQXJyYXkoKTsKK2lmICghYWJjLnB1c2gpIHsKKyAgQXJyYXkucHJvdG90eXBlLnB1c2gJPSBmdW5jdGlvbih3aGF0KXt0aGlzW3RoaXMubGVuZ3RoXT13aGF0fQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlDT05TVEFOVFMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFR3by1kaW1lbnNpb25hbCBhcnJheSBjb250YWluaW5nIGV4dHJhIGNydW1icyB0byBwbGFjZSBhdCB0aGUgZnJvbnQgb2YKKyAqIHRoZSB0cmFpbC4gU3BlY2lmeSBmaXJzdCB0aGUgbmFtZSBvZiB0aGUgY3J1bWIsIHRoZW4gdGhlIFVSSSB0aGF0IGJlbG9uZ3MKKyAqIHRvIGl0LiBZb3UnbGwgbmVlZCB0byBtb2RpZnkgdGhpcyBmb3IgZXZlcnkgZG9tYWluIG9yIHN1YmRvbWFpbiB3aGVyZQorICogeW91IHVzZSB0aGlzIHNjcmlwdCAoeW91IGNhbiBsZWF2ZSBpdCBhcyBhbiBlbXB0eSBhcnJheSBpZiB5b3Ugd2lzaCkKKyAqLwordmFyIFBSRVBSRU5EX0NSVU1CUyA9IG5ldyBBcnJheSgpOworICAgaWYoISgiYXBhY2hlIj09IiIpKXsKKyAgICAgUFJFUFJFTkRfQ1JVTUJTLnB1c2goIG5ldyBBcnJheSggImFwYWNoZSIsICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiApICk7CisgICB9CisgICBpZighKCJ4bWwuYXBhY2hlIj09IiIpKXsKKyAgICAgUFJFUFJFTkRfQ1JVTUJTLnB1c2goIG5ldyBBcnJheSggImFudC5hcGFjaGUiLCAiaHR0cDovL2FudC5hcGFjaGUub3JnLyIgKSApOworICAgfQorICAgaWYoISgiIj09IiIpKXsKKyAgICAgUFJFUFJFTkRfQ1JVTUJTLnB1c2goIG5ldyBBcnJheSggIiIsICIiICkgKTsKKyAgIH0KKworLyoqCisgKiBTdHJpbmcgdG8gaW5jbHVkZSBiZXR3ZWVuIGNydW1iczoKKyAqLwordmFyIERJU1BMQVlfU0VQQVJBVE9SID0gIiAmZ3Q7ICI7CisvKioKKyAqIFN0cmluZyB0byBpbmNsdWRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYWlsCisgKi8KK3ZhciBESVNQTEFZX1BSRVBSRU5EID0gIiI7CisvKioKKyAqIFN0cmluZyB0byBpbmNsdWRlIGF0IHRoZSBlbmQgb2YgdGhlIHRyYWlsCisgKi8KK3ZhciBESVNQTEFZX1BPU1RQUkVORCA9ICIiOworCisvKioKKyAqIENTUyBDbGFzcyB0byB1c2UgZm9yIGEgc2luZ2xlIGNydW1iOgorICovCit2YXIgQ1NTX0NMQVNTX0NSVU1CID0gImJyZWFkY3J1bWIiOworCisvKioKKyAqIENTUyBDbGFzcyB0byB1c2UgZm9yIHRoZSBjb21wbGV0ZSB0cmFpbDoKKyAqLwordmFyIENTU19DTEFTU19UUkFJTCA9ICJicmVhZGNydW1iVHJhaWwiOworCisvKioKKyAqIENTUyBDbGFzcyB0byB1c2UgZm9yIGNydW1iIHNlcGFyYXRvcjoKKyAqLwordmFyIENTU19DTEFTU19TRVBBUkFUT1IgPSAiY3J1bWJTZXBhcmF0b3IiOworCisvKioKKyAqIEFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyBjb21tb24gZmlsZSBleHRlbnNpb25zLiBXZSB1c2UgdGhpcyB0bworICogZGV0ZXJtaW5lIHdoYXQgcGFydCBvZiB0aGUgdXJsIHRvIGlnbm9yZSAoaWYgaXQgY29udGFpbnMgb25lIG9mIHRoZQorICogc3RyaW5nIHNwZWNpZmllZCBoZXJlLCB3ZSBpZ25vcmUgaXQpLgorICovCit2YXIgRklMRV9FWFRFTlNJT05TID0gbmV3IEFycmF5KCAiLmh0bWwiLCAiLmh0bSIsICIuanNwIiwgIi5waHAiLCAiLnBocDMiLCAiLnBocDQiICk7CisKKy8qKgorICogU3RyaW5nIHRoYXQgc2VwYXJhdGVzIHBhcnRzIG9mIHRoZSBicmVhZGNydW1iIHRyYWlsIGZyb20gZWFjaCBvdGhlci4KKyAqIFdoZW4gdGhpcyBpcyBubyBsb25nZXIgYSBzbGFzaCwgSSdtIHN1cmUgSSdsbCBiZSBvbGQgYW5kIGdyZXkuCisgKi8KK3ZhciBQQVRIX1NFUEFSQVRPUiA9ICIvIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJVVRJTElUWSBGVU5DVElPTlMKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoqCisgKiBDYXBpdGFsaXplIGZpcnN0IGxldHRlciBvZiB0aGUgcHJvdmlkZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIG1vZGlmaWVkCisgKiBzdHJpbmcuCisgKi8KK2Z1bmN0aW9uIHNlbnRlbmNlQ2FzZSggc3RyaW5nICkKK3sKKwl2YXIgbG93ZXIgPSBzdHJpbmcudG9Mb3dlckNhc2UoKTsKKwlyZXR1cm4gbG93ZXIuc3Vic3RyKDAsMSkudG9VcHBlckNhc2UoKSArIGxvd2VyLnN1YnN0cigxKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB0aGUgZGlyZWN0b3JpZXMgaW4gdGhlCisgKiBjdXJyZW50IGRvY3VtZW50IFVSTAorICovCitmdW5jdGlvbiBnZXREaXJlY3Rvcmllc0luVVJMKCkKK3sKKwl2YXIgdHJhaWwgPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdCggUEFUSF9TRVBBUkFUT1IgKTsKKworCS8vIGNoZWNrIHdoZXRoZXIgbGFzdCBzZWN0aW9uIGlzIGEgZmlsZSBvciBhIGRpcmVjdG9yeQorCXZhciBsYXN0Y3J1bWIgPSB0cmFpbFt0cmFpbC5sZW5ndGgtMV07CisJZm9yKCB2YXIgaSA9IDA7IGkgPCBGSUxFX0VYVEVOU0lPTlMubGVuZ3RoOyBpKysgKQorCXsKKwkJaWYoIGxhc3RjcnVtYi5pbmRleE9mKCBGSUxFX0VYVEVOU0lPTlNbaV0gKSApCisJCXsKKwkJCS8vIGl0IGlzLCByZW1vdmUgaXQgYW5kIHNlbmQgcmVzdWx0cworCQkJcmV0dXJuIHRyYWlsLnNsaWNlKCAxLCB0cmFpbC5sZW5ndGgtMSApOworCQl9CisJfQorCisJLy8gaXQncyBub3Q7IHNlbmQgdGhlIHRyYWlsIHVubW9kaWZpZWQKKwlyZXR1cm4gdHJhaWwuc2xpY2UoIDEsIHRyYWlsLmxlbmd0aCApOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlCUkVBRENSVU1CIEZVTkNUSU9OQUxJVFkKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoqCisgKiBSZXR1cm4gYSB0d28tZGltZW5zaW9uYWwgYXJyYXkgZGVzY3JpYmluZyB0aGUgYnJlYWRjcnVtYnMgYmFzZWQgb24gdGhlCisgKiBhcnJheSBvZiBkaXJlY3RvcmllcyBwYXNzZWQgaW4uCisgKi8KK2Z1bmN0aW9uIGdldEJyZWFkY3J1bWJzKCBkaXJzICkKK3sKKwl2YXIgcHJlZml4ID0gIi8iOworCXZhciBwb3N0Zml4ID0gIi8iOworCisJLy8gdGhlIGFycmF5IHdlIHdpbGwgcmV0dXJuCisJdmFyIGNydW1icyA9IG5ldyBBcnJheSgpOworCisJaWYoIGRpcnMgIT0gbnVsbCApCisJeworCQlmb3IoIHZhciBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKysgKQorCQl7CisJCQlwcmVmaXggKz0gZGlyc1tpXSArIHBvc3RmaXg7CisJCQljcnVtYnMucHVzaCggbmV3IEFycmF5KCBkaXJzW2ldLCBwcmVmaXggKSApOworCQl9CisJfQorCisJLy8gcHJlcHJlbmQgdGhlIFBSRVBSRU5EX0NSVU1CUworCWlmKFBSRVBSRU5EX0NSVU1CUy5sZW5ndGggPiAwICkKKwl7CisJCXJldHVybiBQUkVQUkVORF9DUlVNQlMuY29uY2F0KCBjcnVtYnMgKTsKKwl9CisKKwlyZXR1cm4gY3J1bWJzOworfQorCisvKioKKyAqIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgc2ltcGxlIHRleHQgYnJlYWRjcnVtYiB0cmFpbCBiYXNlZCBvbiB0aGUKKyAqIHR3by1kaW1lbnNpb25hbCBhcnJheSBwYXNzZWQgaW4uCisgKi8KK2Z1bmN0aW9uIGdldENydW1iVHJhaWwoIGNydW1icyApCit7CisJdmFyIHhodG1sID0gRElTUExBWV9QUkVQUkVORDsKKworCWZvciggdmFyIGkgPSAwOyBpIDwgY3J1bWJzLmxlbmd0aDsgaSsrICkKKwl7CisJCXhodG1sICs9ICc8YSBocmVmPSInICsgY3J1bWJzW2ldWzFdICsgJyIgPic7CisJCXhodG1sICs9IHNlbnRlbmNlQ2FzZSggY3J1bWJzW2ldWzBdICkgKyAnPC9hPic7CisJCWlmKCBpICE9IChjcnVtYnMubGVuZ3RoLTEpICkKKwkJeworCQkJeGh0bWwgKz0gRElTUExBWV9TRVBBUkFUT1I7CisJCX0KKwl9CisKKwl4aHRtbCArPSBESVNQTEFZX1BPU1RQUkVORDsKKworCXJldHVybiB4aHRtbDsKK30KKworLyoqCisgKiBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbiBYSFRNTCBicmVhZGNydW1iIHRyYWlsIGJhc2VkIG9uIHRoZQorICogdHdvLWRpbWVuc2lvbmFsIGFycmF5IHBhc3NlZCBpbi4KKyAqLworZnVuY3Rpb24gZ2V0Q3J1bWJUcmFpbFhIVE1MKCBjcnVtYnMgKQoreworCXZhciB4aHRtbCA9ICc8c3BhbiBjbGFzcz0iJyArIENTU19DTEFTU19UUkFJTCAgKyAnIj4nOworCXhodG1sICs9IERJU1BMQVlfUFJFUFJFTkQ7CisKKwlmb3IoIHZhciBpID0gMDsgaSA8IGNydW1icy5sZW5ndGg7IGkrKyApCisJeworCQl4aHRtbCArPSAnPGEgaHJlZj0iJyArIGNydW1ic1tpXVsxXSArICciIGNsYXNzPSInICsgQ1NTX0NMQVNTX0NSVU1CICsgJyI+JzsKKwkJeGh0bWwgKz0gc2VudGVuY2VDYXNlKCBjcnVtYnNbaV1bMF0gKSArICc8L2E+JzsKKwkJaWYoIGkgIT0gKGNydW1icy5sZW5ndGgtMSkgKQorCQl7CisJCQl4aHRtbCArPSAnPHNwYW4gY2xhc3M9IicgKyBDU1NfQ0xBU1NfU0VQQVJBVE9SICsgJyI+JyArIERJU1BMQVlfU0VQQVJBVE9SICsgJzwvc3Bhbj4nOworCQl9CisJfQorCisJeGh0bWwgKz0gRElTUExBWV9QT1NUUFJFTkQ7CisJeGh0bWwgKz0gJzwvc3Bhbj4nOworCisJcmV0dXJuIHhodG1sOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlQUklOVCBCUkVBRENSVU1CIFRSQUlMCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLy8gY2hlY2sgaWYgd2UncmUgbG9jYWw7IGlmIHNvLCBvbmx5IHByaW50IHRoZSBQUkVQUkVORF9DUlVNQlMKK2lmKCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLnRvTG93ZXJDYXNlKCkuaW5kZXhPZiggImh0dHA6Ly8iICkgPT0gLTEgKQoreworCWRvY3VtZW50LndyaXRlKCBnZXRDcnVtYlRyYWlsKCBnZXRCcmVhZGNydW1icygpICkgKTsKK30KK2Vsc2UKK3sKKwlkb2N1bWVudC53cml0ZSggZ2V0Q3J1bWJUcmFpbCggZ2V0QnJlYWRjcnVtYnMoIGdldERpcmVjdG9yaWVzSW5VUkwoKSApICkgKTsKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9idWdzLmh0bWwgYi90cnVuay9kb2NzL2J1Z3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjk2ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9idWdzLmh0bWwKQEAgLTAsMCArMSwzNzIgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIEJ1ZyBkYXRhYmFzZTwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAgICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iQW50b2luZSBMZXZ5LUxhbWJlcnQiPgorICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0iIj4KKyAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+SG9tZTwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4vcHJvamVjdHMvaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+UHJvamVjdHM8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BcGFjaGUgQW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xpY2Vuc2UuaHRtbCI+TGljZW5zZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2FudG5ld3MuaHRtbCI+TmV3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2V4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9mYXEuaHRtbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvRnJvbnRQYWdlIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvYmxlbXMuaHRtbCI+SGF2aW5nIFByb2JsZW1zPzwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvd25sb2FkCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9zcmNkb3dubG9hZC5jZ2kiPlNvdXJjZSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+Q29udHJpYnV0aW5nCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFpbC5odG1sIj5NYWlsaW5nIExpc3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vc3ZuLmh0bWwiPlN1YnZlcnNpb24gUmVwb3NpdG9yaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbmlnaHRsaWVzLmh0bWwiPk5pZ2h0bHkgQnVpbGRzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnVncy5odG1sIj5CdWcgRGF0YWJhc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5TcG9uc29yc2hpcAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCI+VGhhbmtzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiPlNwb25zb3JzaGlwPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2NvbnRyaWJ1dGluZy5odG1sIj5Eb25hdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0IE1hbmFnZW1lbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9jb250cmlidXRvcnMuaHRtbCI+Q29udHJpYnV0b3JzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWlzc2lvbi5odG1sIj5BcGFjaGUgQW50IE1pc3Npb248L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9ieWxhd3MuaHRtbCI+UHJvamVjdCBCeWxhd3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9sZWdhbC5odG1sIj5MZWdhbDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8Y2VudGVyPgorICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIvYWRzL2J1dHRvbmJhci5odG1sIiAtLT4KKyAgICA8L2NlbnRlcj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogbGVmdCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+QnVnIGRhdGFiYXNlPC9oMT4KKyAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJCdWcgRGF0YWJhc2UiPjwvYT4KKyAgICAgIEJ1ZyBEYXRhYmFzZQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgVGhpcyBwYWdlIGdpdmVzIHlvdSBzb21lIGJvb2ttYXJrcyB0byB1c2UgdGhlIEJ1Z3ppbGxhIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS8iPgorICAgICAgICAgICAgQXBhY2hlIEJ1ZyBEYXRhYmFzZTwvYT4uCisgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICBUaGlzIGxpbmsgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnLyI+aXNzdWVzLmFwYWNoZS5vcmc8L2E+IGNvbm5lY3RzIHlvdQorICAgICAgICAgICB0byB0aGUgY29tcGxldGUgbGlzdCBvZiBBcGFjaGUgQnVnIERhdGFiYXNlIHN5c3RlbXMuCisgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkhhcyBJdCBCZWVuIFJlcG9ydGVkPyI+PC9hPgorICAgICAgICBIYXMgSXQgQmVlbiBSZXBvcnRlZD8KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgIElmIHRoZSBjdXJyZW50IG5pZ2h0bHkgYnVpbGQgZG9lc24ndCByZXNvbHZlIHlvdXIgcHJvYmxlbSwgaXQgaXMKKyAgICAgICAgICAgIHBvc3NpYmxlIHRoYXQgc29tZW9uZSBlbHNlIGhhcyByZXBvcnRlZCB0aGUgaXNzdWUuIEl0IGlzIHRpbWUgdG8KKyAgICAgICAgICAgIGxvb2sgYXQgdGhlIGJ1ZyBkYXRhYmFzZS4gVGhpcyBzeXN0ZW0gaXMgZWFzeSB0byB1c2UsIGFuZCBpdCB3aWxsCisgICAgICAgICAgICBsZXQgeW91IHNlYXJjaCB0aGUgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9VU5DT05GSVJNRUQmYW1wO2J1Z19zdGF0dXM9TkVXJmFtcDtidWdfc3RhdHVzPUFTU0lHTkVEJmFtcDtidWdfc3RhdHVzPVJFT1BFTkVEJmFtcDtlbWFpbDE9JmFtcDtlbWFpbHR5cGUxPXN1YnN0cmluZyZhbXA7ZW1haWxhc3NpZ25lZF90bzE9MSZhbXA7ZW1haWwyPSZhbXA7ZW1haWx0eXBlMj1zdWJzdHJpbmcmYW1wO2VtYWlscmVwb3J0ZXIyPTEmYW1wO2J1Z2lkdHlwZT1pbmNsdWRlJmFtcDtidWdfaWQ9JmFtcDtjaGFuZ2VkaW49JmFtcDt2b3Rlcz0mYW1wO2NoZmllbGRmcm9tPSZhbXA7Y2hmaWVsZHRvPU5vdyZhbXA7Y2hmaWVsZHZhbHVlPSZhbXA7cHJvZHVjdD1BbnQmYW1wO3Nob3J0X2Rlc2M9JmFtcDtzaG9ydF9kZXNjX3R5cGU9c3Vic3RyaW5nJmFtcDtsb25nX2Rlc2M9JmFtcDtsb25nX2Rlc2NfdHlwZT1zdWJzdHJpbmcmYW1wO2J1Z19maWxlX2xvYz0mYW1wO2J1Z19maWxlX2xvY190eXBlPXN1YnN0cmluZyZhbXA7a2V5d29yZHM9JmFtcDtrZXl3b3Jkc190eXBlPWFueXdvcmRzJmFtcDtmaWVsZDAtMC0wPW5vb3AmYW1wO3R5cGUwLTAtMD1ub29wJmFtcDt2YWx1ZTAtMC0wPSZhbXA7b3JkZXI9YnVncy5idWdfaWQiPgorICAgICAgICAgICAgY3VycmVudGx5IG9wZW48L2E+IGFuZCByZXNvbHZlZCBidWdzIHRvIHNlZSBpZiB5b3VyIHByb2JsZW0gaGFzCisgICAgICAgICAgICBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuIElmIHlvdXIgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCwgeW91IGNhbgorICAgICAgICAgICAgc2VlIHdoZXRoZXIgYW55IG9mIHRoZSBkZXZlbG9wZXJzIGhhdmUgY29tbWVudGVkLCBzdWdnZXN0aW5nCisgICAgICAgICAgICB3b3JrYXJvdW5kcywgb3IgdGhlIHJlYXNvbiBmb3IgdGhlIGJ1ZywgZXRjLiBPciB5b3UgbWF5IGhhdmUKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIHRvIGFkZCAoc2VlIGFib3V0IGNyZWF0aW5nIGFuZCBtb2RpZnlpbmcgYnVnIHJlcG9ydHMKKyAgICAgICAgICAgIGJlbG93KSwgaW4gd2hpY2ggY2FzZSwgZ28gcmlnaHQgYWhlYWQgYW5kIGFkZCB0aGUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgeW91IG1heSBqdXN0IHdhbnQKKyAgICAgICAgICAgIHRvIHZvdGUgZm9yIHRoaXMgYnVnLCBhbmQgcGVyaGFwcworICAgICAgICAgICAgYWRkIHlvdXJzZWxmIHRvIHRoZSA8Y29kZT5DQzwvY29kZT4gbGlzdCB0byBmb2xsb3cgdGhlIHByb2dyZXNzCisgICAgICAgICAgICBvZiB0aGlzIGJ1Zy4KKyAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP3F1ZXJ5X2Zvcm1hdD1hZHZhbmNlZCZhbXA7c2hvcnRfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmFtcDtzaG9ydF9kZXNjPSZhbXA7cHJvZHVjdD1BbnQmYW1wO2xvbmdfZGVzY190eXBlPXN1YnN0cmluZyZhbXA7bG9uZ19kZXNjPSZhbXA7YnVnX2ZpbGVfbG9jX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO2J1Z19maWxlX2xvYz0mYW1wO2tleXdvcmRzX3R5cGU9YWxsd29yZHMmYW1wO2tleXdvcmRzPSZhbXA7YnVnX3N0YXR1cz1ORVcmYW1wO2J1Z19zdGF0dXM9QVNTSUdORUQmYW1wO2J1Z19zdGF0dXM9UkVPUEVORUQmYW1wO2VtYWlsYXNzaWduZWRfdG8xPTEmYW1wO2VtYWlsdHlwZTE9c3Vic3RyaW5nJmFtcDtlbWFpbDE9JmFtcDtlbWFpbGFzc2lnbmVkX3RvMj0xJmFtcDtlbWFpbHJlcG9ydGVyMj0xJmFtcDtlbWFpbGNjMj0xJmFtcDtlbWFpbHR5cGUyPXN1YnN0cmluZyZhbXA7ZW1haWwyPSZhbXA7YnVnaWR0eXBlPWluY2x1ZGUmYW1wO2J1Z19pZD0mYW1wO3ZvdGVzPSZhbXA7Y2hmaWVsZGZyb209JmFtcDtjaGZpZWxkdG89Tm93JmFtcDtjaGZpZWxkdmFsdWU9JmFtcDtmaWVsZDAtMC0wPW5vb3AmYW1wO3R5cGUwLTAtMD1ub29wJmFtcDt2YWx1ZTAtMC0wPSI+T3BlbiBBbnQgYnVncyBieSBvcmRlciBvZiBwcmlvcml0eTwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvYnVnbGlzdC5jZ2k/cXVlcnlfZm9ybWF0PWFkdmFuY2VkJmFtcDtzaG9ydF9kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO3Nob3J0X2Rlc2M9JmFtcDtwcm9kdWN0PUFudCZhbXA7bG9uZ19kZXNjX3R5cGU9c3Vic3RyaW5nJmFtcDtsb25nX2Rlc2M9JmFtcDtidWdfZmlsZV9sb2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZhbXA7YnVnX2ZpbGVfbG9jPSZhbXA7a2V5d29yZHNfdHlwZT1hbGx3b3JkcyZhbXA7a2V5d29yZHM9JmFtcDtidWdfc3RhdHVzPU5FVyZhbXA7YnVnX3N0YXR1cz1BU1NJR05FRCZhbXA7YnVnX3N0YXR1cz1SRU9QRU5FRCZhbXA7ZW1haWxhc3NpZ25lZF90bzE9MSZhbXA7ZW1haWx0eXBlMT1zdWJzdHJpbmcmYW1wO2VtYWlsMT0mYW1wO2VtYWlsYXNzaWduZWRfdG8yPTEmYW1wO2VtYWlscmVwb3J0ZXIyPTEmYW1wO2VtYWlsY2MyPTEmYW1wO2VtYWlsdHlwZTI9c3Vic3RyaW5nJmFtcDtlbWFpbDI9JmFtcDtidWdpZHR5cGU9aW5jbHVkZSZhbXA7YnVnX2lkPSZhbXA7dm90ZXM9JmFtcDtjaGZpZWxkZnJvbT0mYW1wO2NoZmllbGR0bz1Ob3cmYW1wO2NoZmllbGR2YWx1ZT0mYW1wO2ZpZWxkMC0wLTA9bm9vcCZhbXA7dHlwZTAtMC0wPW5vb3AmYW1wO3ZhbHVlMC0wLTA9JmFtcDtvcmRlcj1idWdzLnZvdGVzLGJ1Z3MucHJpb3JpdHklMkNidWdzLmJ1Z19zZXZlcml0eSZhbXA7cXVlcnlfYmFzZWRfb249Ij5PcGVuIEFudCBidWdzIGJ5IG51bWJlciBvZiB2b3RlczwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkZpbGluZyBhIEJ1ZyBSZXBvcnQiPjwvYT4KKyAgICAgICAgRmlsaW5nIGEgQnVnIFJlcG9ydAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgUGxlYXNlIHJlYWQgb3VyIGRvY3VtZW50IGFib3V0IDxhIGhyZWY9InByb2JsZW1zLmh0bWwiPnByb2JsZW1zPC9hPgorICAgICAgICAgICAgYmVmb3JlIGRlY2lkaW5nIHRoYXQgdGhlcmUgaXMgYW4gdW5yZXBvcnRlZAorICAgICAgICAgICAgYnVnIGluIEFudC4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgIFlvdSBoYXZlIGEgZmV3IGNob2ljZXMgYXQgdGhpcyBwb2ludC4gWW91IGNhbiBzZW5kCisgICAgICAgICAgICBhbiBlbWFpbCB0byB0aGUgPGNvZGU+dXNlcjwvY29kZT4gbWFpbGluZyBsaXN0CisgICAgICAgICAgICB0byBzZWUgaWYKKyAgICAgICAgICAgIG90aGVycyBoYXZlIGVuY291bnRlcmVkIHlvdXIgaXNzdWUgYW5kIGZpbmQgb3V0IGhvdyB0aGV5IG1heQorICAgICAgICAgICAgaGF2ZSB3b3JrZWQgYXJvdW5kIGl0LiBJZiBhZnRlciBzb21lIGRpc2N1c3Npb24sIHlvdSBmZWVsIGl0CisgICAgICAgICAgICBpcyB0aW1lIHRvIGNyZWF0ZQorICAgICAgICAgICAgYSBidWcgcmVwb3J0LCB0aGlzIGlzIGEgc2ltcGxlIG9wZXJhdGlvbiBpbiB0aGUgYnVnIGRhdGFiYXNlLgorICAgICAgICAgICAgUGxlYXNlIHRyeSB0byBwcm92aWRlIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgcG9zc2libGUgaW4gb3JkZXIKKyAgICAgICAgICAgIHRvIGFzc2lzdCB0aGUgZGV2ZWxvcGVycyBpbiByZXNvbHZpbmcgdGhlIGJ1Zy4gUGxlYXNlIHRyeSB0byBlbnRlcgorICAgICAgICAgICAgY29ycmVjdCB2YWx1ZXMgZm9yIHRoZSB2YXJpb3VzIGlucHV0cyB3aGVuIGNyZWF0aW5nIHRoZSBidWcsIHN1Y2gKKyAgICAgICAgICAgIGFzIHdoaWNoIHZlcnNpb24gb2YgQW50IHlvdSBhcmUgcnVubmluZywgYW5kIG9uIHdoaWNoIHBsYXRmb3JtLAorICAgICAgICAgICAgZXRjLiBPbmNlIHRoZSBidWcgaXMgY3JlYXRlZCwgeW91IGNhbiBhbHNvIGFkZCBhdHRhY2htZW50cyB0bworICAgICAgICAgICAgdGhlIGJ1ZyByZXBvcnQuCisgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgV2hhdCBpbmZvcm1hdGlvbiBzaG91bGQgeW91IGluY2x1ZGUgaW4geW91ciBidWcgcmVwb3J0PyBUaGUKKyAgICAgICAgICAgIGVhc2llc3QgYnVncyB0byBmaXggYXJlIHRob3NlIHRoYXQgYXJlIG1vc3QgZWFzaWx5IHJlcHJvZHVjaWJsZSwKKyAgICAgICAgICAgIHNvIGl0IGlzIHJlYWxseSBoZWxwZnVsIGlmIHlvdSBjYW4gcHJvZHVjZSBhIHNtYWxsIHRlc3QgY2FzZSB0aGF0CisgICAgICAgICAgICBleGhpYml0cyB0aGUgcHJvYmxlbS4gSW4gdGhpcyBjYXNlLCB5b3Ugd291bGQgYXR0YWNoIHRoZSBidWlsZCBmaWxlCisgICAgICAgICAgICBhbmQgYW55IG90aGVyIGZpbGVzIG5lY2Vzc2FyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0sIHByb2JhYmx5CisgICAgICAgICAgICBwYWNrZWQgdG9nZXRoZXIgaW4gYW4gYXJjaGl2ZS4gSWYgeW91IGNhbid0IHByb2R1Y2UgYSB0ZXN0IGNhc2UsCisgICAgICAgICAgICB5b3Ugc2hvdWxkIHRyeSB0byBpbmNsdWRlIGEgc25pcHBldCBmcm9tIHlvdXIgYnVpbGQgZmlsZSBhbmQgdGhlCisgICAgICAgICAgICByZWxldmFudCBzZWN0aW9ucyBmcm9tIHRoZSB2ZXJib3NlIG9yIGRlYnVnIG91dHB1dCBmcm9tIEFudC4gVHJ5CisgICAgICAgICAgICB0byBpbmNsdWRlIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gd2hlcmUgQW50IHN0YXRlcyB0aGUgdmVyc2lvbiwKKyAgICAgICAgICAgIHRoZSBPUyBhbmQgVk0gaW5mb3JtYXRpb24sIGV0Yy4gQXMgZGVidWcgb3V0cHV0IGlzIGxpa2VseSB0byBiZQorICAgICAgICAgICAgdmVyeSBsYXJnZSwgaXQncyBiZXN0IHRvIHJlbW92ZSBhbnkgb3V0cHV0IHRoYXQgaXMgbm90CisgICAgICAgICAgICByZWxldmFudC4gT25jZSB0aGUgYnVnIGlzIGVudGVyZWQgaW50byB0aGUgYnVnIGRhdGFiYXNlLCB5b3UKKyAgICAgICAgICAgIHdpbGwgYmUga2VwdCBpbmZvcm1lZCBieSBlbWFpbCBhYm91dCBwcm9ncmVzcyBvbiB0aGUgYnVnLiBJZgorICAgICAgICAgICAgeW91IHJlY2VpdmUgZW1haWwgYXNraW5nIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBwbGVhc2UgdHJ5IHRvCisgICAgICAgICAgICByZXNwb25kLCBhcyBpdCB3aWxsIGFpZCBpbiB0aGUgcmVzb2x1dGlvbiBvZiB5b3VyIGJ1Zy4KKyAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICBUbyBjcmVhdGUgdGhlIGJ1ZyByZXBvcnQgaGl0IHRoaXMKKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9QW50Ij4KKyAgICAgICAgICAgIGxpbms8L2E+LgorICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFza2luZyBmb3IgYW4gRW5oYW5jZW1lbnQiPjwvYT4KKyAgICAgICAgQXNraW5nIGZvciBhbiBFbmhhbmNlbWVudAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgU29tZXRpbWVzLCB5b3UgbWF5IGZpbmQgdGhhdCBBbnQganVzdCBkb2Vzbid0IGRvIHdoYXQgeW91IG5lZWQgaXQKKyAgICAgICAgICAgIHRvLiBJdCBpc24ndCBhIGJ1ZywgYXMgc3VjaCwgc2luY2UgQW50IGlzIHdvcmtpbmcgdGhlIHdheSBpdCBpcworICAgICAgICAgICAgc3VwcG9zZWQgdG8gd29yay4gUGVyaGFwcyBpdCBpcyBzb21lIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBmb3IKKyAgICAgICAgICAgIGEgdGFzayB0aGF0IGhhc24ndCBiZWVuIHRob3VnaHQgb2YgeWV0LCBvciBtYXliZSBhIGNvbXBsZXRlbHkgbmV3CisgICAgICAgICAgICB0YXNrLiBGb3IgdGhlc2Ugc2l0dWF0aW9ucywgeW91IHdpbGwKKyAgICAgICAgICAgIHdhbnQgdG8gcmFpc2UgYW4gPGk+ZW5oYW5jZW1lbnQgcmVxdWVzdDwvaT4uIEVuaGFuY2VtZW50IHJlcXVlc3RzCisgICAgICAgICAgICBhcmUgbWFuYWdlZCB1c2luZyB0aGUgc2FtZSBBcGFjaGUgQnVnIERhdGFiYXNlIGRlc2NyaWJlZCBhYm92ZS4KKyAgICAgICAgICAgIFRoZXNlIGFyZSBqdXN0IGEgZGlmZmVyZW50IHR5cGUgb2YgYnVnIHJlcG9ydC4gSWYgeW91IGxvb2sgaW4gdGhlCisgICAgICAgICAgICBidWcgZGF0YWJhc2UsIHlvdSB3aWxsIHNlZSB0aGF0IG9uZSBvZiB0aGUgc2V2ZXJpdHkgc2V0dGluZ3MgZm9yCisgICAgICAgICAgICBhIGJ1ZyBpcyAiRW5oYW5jZW1lbnQiLiBKdXN0IGZpbGwgdGhlIGJ1ZyByZXBvcnQgaW4sCisgICAgICAgICAgICBzZXQgdGhlIHNldmVyaXR5IG9mIHRoZSBidWcgdG8gIkVuaGFuY2VtZW50IiwgYW5kCisgICAgICAgICAgICBzdGF0ZSBpbiB0aGUgZGVzY3JpcHRpb24gaG93IHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgQW50IGVuaGFuY2VkLgorICAgICAgICAgICAgQWdhaW4sIHlvdSBzaG91bGQgZmlyc3QgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IGV4aXN0aW5nCisgICAgICAgICAgICBlbmhhbmNtZW50IHJlcXVlc3RzIHRoYXQgY292ZXIgeW91ciBuZWVkcy4gSWYgc28sIGp1c3QgYWRkIHlvdXIKKyAgICAgICAgICAgIHZvdGUgdG8gdGhlc2UuCisgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9lbnRlcl9idWcuY2dpP3Byb2R1Y3Q9QW50JmFtcDtidWdfc2V2ZXJpdHk9ZW5oYW5jZW1lbnQiPgorICAgICAgICAgIENyZWF0ZSBhbiBlbmhhbmNlbWVudCByZXBvcnQ8L2E+CisKKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkZpeGluZyB0aGUgQnVnIj48L2E+CisgICAgICAgIEZpeGluZyB0aGUgQnVnCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICBJZiB5b3UgYXJlbid0IHNhdGlzZmllZCB3aXRoIGp1c3QgZmlsaW5nIGEgYnVnIHJlcG9ydCwgeW91IGNhbgorICAgICAgICAgICAgdHJ5IHRvIGZpbmQgdGhlIGNhdXNlIG9mIHRoZSBwcm9ibGVtIGFuZCBwcm92aWRlIGEgZml4IHlvdXJzZWxmLgorICAgICAgICAgICAgVGhlIGJlc3Qgd2F5IHRvIGRvIHRoYXQgaXMgYnkgd29ya2luZyB3aXRoIHRoZSBsYXRlc3QgY29kZSBmcm9tIFN1YnZlcnNpb24uCisgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHdvcmsgd2l0aCB0aGUgc291cmNlIGNvZGUgYXZhaWxhYmxlIGZyb20gdGhlCisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIj4KKyAgICAgICAgICAgIHNvdXJjZSBkaXN0cmlidXRpb25zPC9hPi4gSWYgeW91CisgICAgICAgICAgICBhcmUgZ29pbmcgdG8gdGFja2xlIHRoZSBwcm9ibGVtIGF0IHRoaXMgbGV2ZWwsIHlvdSBtYXkgd2FudCB0bworICAgICAgICAgICAgZGlzY3VzcyBzb21lIGRldGFpbHMgZmlyc3Qgb24gdGhlIDxjb2RlPmRldjwvY29kZT4KKyAgICAgICAgICAgIG1haWxpbmcgbGlzdC4gT25jZSB5b3UgaGF2ZSBhIGZpeCBmb3IgdGhlIHByb2JsZW0sIHlvdSBtYXkgc3VibWl0CisgICAgICAgICAgICB0aGUgZml4IGFzIGEgPGk+cGF0Y2g8L2k+IHRvIGVpdGhlciB0aGUKKyAgICAgICAgICAgIDxjb2RlPmRldjwvY29kZT4gbWFpbGluZworICAgICAgICAgICAgbGlzdCwgb3IgZW50ZXIgdGhlIGJ1ZyBkYXRhYmFzZSBhcyBkZXNjcmliZWQgYWJvdmUgYW5kIGF0dGFjaCB0aGUKKyAgICAgICAgICAgIHBhdGNoIHRvIHRoZSBidWcgcmVwb3J0LiBVc2luZyB0aGUgYnVnIGRhdGFiYXNlIGhhcyB0aGUgYWR2YW50YWdlCisgICAgICAgICAgICBvZiBiZWluZyBhYmxlIHRvIHRyYWNrIHRoZSBwcm9ncmVzcyBvZiB5b3VyIHBhdGNoLgorICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgIElmIHlvdSBoYXZlIGEgcGF0Y2ggdG8gc3VibWl0IGFuZCBhcmUgc2VuZGluZyBpdCB0byB0aGUKKyAgICAgICAgICAgIDxjb2RlPmRldjwvY29kZT4gbWFpbGluZyBsaXN0LAorICAgICAgICAgICAgcHJlZml4ICJbUEFUQ0hdIgorICAgICAgICAgICAgdG8geW91ciBtZXNzYWdlIHN1YmplY3QgKHRoaXMgaXMgYWxzbyBhIGdvb2QgaWRlYSBmb3IKKyAgICAgICAgICAgIGEgc3ViamVjdCBsaW5lIGluIHRoZSBidWcgZGF0YWJhc2UpLgorICAgICAgICAgICAgUGxlYXNlIGluY2x1ZGUgYW55IHJlbGV2YW50IGJ1ZyBudW1iZXJzLgorICAgICAgICAgICAgUGF0Y2ggZmlsZXMgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCB0aGUgPGNvZGU+LXU8L2NvZGU+CisgICAgICAgICAgICBvcHRpb24gb2YgdGhlCisgICAgICAgICAgICA8Y29kZT5kaWZmPC9jb2RlPiBvciA8Y29kZT5zdm4gZGlmZjwvY29kZT4gY29tbWFuZC4gRm9yCisgICAgICAgICAgICBleGFtcGxlOjxiciAvPjxiciAvPgorICAgICAgICAgICAgPGZvbnQgZmFjZT0idmVyZGFuYSIgc2l6ZT0iLTEiPgorICAgICAgICAgICAgZGlmZiAtdSBKYXZhYy5qYXZhLm9yaWcgSmF2YWMuamF2YSAmZ3Q7IGphdmFjLmRpZmZzPGJyIC8+PGJyIC8+CisgICAgICAgICAgICA8L2ZvbnQ+CisgICAgICAgICAgICBvciwgaWYgeW91IGhhdmUgc291cmNlIGZyb20gU3VidmVyc2lvbjo8YnIgLz48YnIgLz4KKyAgICAgICAgICAgIDxmb250IGZhY2U9InZlcmRhbmEiIHNpemU9Ii0xIj4KKyAgICAgICAgICAgIHN2biBkaWZmIEphdmFjLmphdmEgJmd0OyBqYXZhYy5kaWZmczxiciAvPjxiciAvPgorICAgICAgICAgICAgPC9mb250PgorCisgICAgICAgICAgIE5vdGU6IFlvdSBzaG91bGQgZ2l2ZSB5b3VyIHBhdGNoIGZpbGVzIG1lYW5pbmdmdWwgbmFtZXMuCisgICAgICAgICAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyIGZvciBkZXZlbG9wZXJzIHdobyBuZWVkIHRvIGFwcGx5IGEgbnVtYmVyCisgICAgICAgICAgIG9mIGRpZmZlcmVudCBwYXRjaCBmaWxlcy4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgICAgICAgIDxwIGNsYXNzPSJjb3B5cmlnaHQiPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhLS0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC53cml0ZSgiIC0gIisiTGFzdCBQdWJsaXNoZWQ6ICIgKyBkb2N1bWVudC5sYXN0TW9kaWZpZWQpOworICAgICAgICAgICAgICAvLyAgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9wPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvYnlsYXdzLmh0bWwgYi90cnVuay9kb2NzL2J5bGF3cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NmRiMzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2J5bGF3cy5odG1sCkBAIC0wLDAgKzEsODIzIEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBQcm9qZWN0IEJ5bGF3czwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAgICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iQXBhY2hlIEFudCBQTUMiPgorICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0iIj4KKyAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+SG9tZTwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4vcHJvamVjdHMvaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+UHJvamVjdHM8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BcGFjaGUgQW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xpY2Vuc2UuaHRtbCI+TGljZW5zZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2FudG5ld3MuaHRtbCI+TmV3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2V4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9mYXEuaHRtbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvRnJvbnRQYWdlIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvYmxlbXMuaHRtbCI+SGF2aW5nIFByb2JsZW1zPzwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvd25sb2FkCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9zcmNkb3dubG9hZC5jZ2kiPlNvdXJjZSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+Q29udHJpYnV0aW5nCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFpbC5odG1sIj5NYWlsaW5nIExpc3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vc3ZuLmh0bWwiPlN1YnZlcnNpb24gUmVwb3NpdG9yaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbmlnaHRsaWVzLmh0bWwiPk5pZ2h0bHkgQnVpbGRzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnVncy5odG1sIj5CdWcgRGF0YWJhc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5TcG9uc29yc2hpcAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCI+VGhhbmtzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiPlNwb25zb3JzaGlwPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2NvbnRyaWJ1dGluZy5odG1sIj5Eb25hdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0IE1hbmFnZW1lbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9jb250cmlidXRvcnMuaHRtbCI+Q29udHJpYnV0b3JzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWlzc2lvbi5odG1sIj5BcGFjaGUgQW50IE1pc3Npb248L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+UHJvamVjdCBCeWxhd3M8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGVnYWwuaHRtbCI+TGVnYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPlByb2plY3QgQnlsYXdzPC9oMT4KKyAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJBcGFjaGUgQW50IFByb2plY3QgQnlsYXdzIj48L2E+CisgICAgICBBcGFjaGUgQW50IFByb2plY3QgQnlsYXdzCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgVGhpcyBkb2N1bWVudCBkZWZpbmVzIHRoZSBieWxhd3MgdW5kZXIgd2hpY2ggdGhlIEFwYWNoZSBBbnQgcHJvamVjdAorICAgICAgb3BlcmF0ZXMuIEl0IGRlZmluZXMgdGhlIHJvbGVzIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIHRoZQorICAgICAgcHJvamVjdCwgd2hvIG1heSB2b3RlLCBob3cgdm90aW5nIHdvcmtzLCBob3cgY29uZmxpY3RzIGFyZSByZXNvbHZlZCwKKyAgICAgIGV0Yy4KKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgQW50IGlzIGEgcHJvamVjdCBvZiB0aGUKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uLyI+QXBhY2hlIFNvZnR3YXJlCisgICAgICBGb3VuZGF0aW9uPC9hPi4gIFRoZSBmb3VuZGF0aW9uIGhvbGRzIHRoZSBjb3B5cmlnaHQgb24gQXBhY2hlCisgICAgICBjb2RlIGluY2x1ZGluZyB0aGUgY29kZSBpbiB0aGUgIEFudCBjb2RlYmFzZS4gVGhlCisgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9mYXEuaHRtbCI+Zm91bmRhdGlvbiBGQVE8L2E+CisgICAgICBleHBsYWlucyB0aGUgb3BlcmF0aW9uIGFuZCBiYWNrZ3JvdW5kIG9mIHRoZSBmb3VuZGF0aW9uLgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICBBbnQgaXMgdHlwaWNhbCBvZiBBcGFjaGUgcHJvamVjdHMgaW4gdGhhdCBpdCBvcGVyYXRlcyB1bmRlciBhIHNldCBvZgorICAgICAgcHJpbmNpcGxlcywga25vd24gY29sbGVjdGl2ZWx5IGFzIHRoZSAiQXBhY2hlIFdheSIuIElmIHlvdSBhcmUKKyAgICAgIG5ldyB0byBBcGFjaGUgZGV2ZWxvcG1lbnQsIHBsZWFzZSByZWZlciB0byB0aGUKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZyI+SW5jdWJhdG9yIHByb2plY3Q8L2E+CisgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgQXBhY2hlIHByb2plY3RzIG9wZXJhdGUuIDxiPk5vdGU6PC9iPiB0aGUKKyAgICAgIGluY3ViYXRvciBwcm9qZWN0IGhhcyBvbmx5IGJlZW4gcmVjZW50bHkgc2V0IHVwIGFuZCBkb2VzIG5vdCB5ZXQgZXhwbGFpbgorICAgICAgdGhlIEFwYWNoZSBXYXkgaW4gZ3JlYXQgZGV0YWlsLgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICA8bGk+PGEgaHJlZj0iI1JvbGVzIGFuZCBSZXNwb25zaWJpbGl0aWVzIj5Sb2xlcyBhbmQgUmVzcG9uc2liaWxpdGllczwvYT48L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iI0RlY2lzaW9uIE1ha2luZyI+SG93IGRlY2lzaW9ucyBhcmUgbWFkZTwvYT48L2xpPgorICAgIDwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iUm9sZXMgYW5kIFJlc3BvbnNpYmlsaXRpZXMiPjwvYT4KKyAgICAgIFJvbGVzIGFuZCBSZXNwb25zaWJpbGl0aWVzCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgQXBhY2hlIHByb2plY3RzIGRlZmluZSBhIHNldCBvZiByb2xlcyB3aXRoIGFzc29jaWF0ZWQgcmlnaHRzIGFuZAorICAgICAgcmVzcG9uc2liaWxpdGllcy4gVGhlc2Ugcm9sZXMgZ292ZXJuIHdoYXQgdGFza3MgYW4gaW5kaXZpZHVhbCBtYXkgcGVyZm9ybQorICAgICAgd2l0aGluIHRoZSBwcm9qZWN0LiBUaGUgcm9sZXMgYXJlIGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucworICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9IiNVc2VycyI+VXNlcnM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjRGV2ZWxvcGVycyI+RGV2ZWxvcGVyczwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNDb21taXR0ZXJzIj5Db21taXR0ZXJzPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1Byb2plY3QgTWFuYWdlbWVudCBDb21taXR0ZWUiPgorICAgICAgICBQcm9qZWN0IE1hbmFnZW1lbnQgQ29tbWl0dGVlIChQTUMpPC9hPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJVc2VycyI+PC9hPgorICAgICAgICBVc2VycworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICBUaGUgbW9zdCBpbXBvcnRhbnQgcGFydGljaXBhbnRzIGluIHRoZSBwcm9qZWN0IGFyZSBwZW9wbGUgd2hvIHVzZSBvdXIKKyAgICAgICAgc29mdHdhcmUuIFRoZSBtYWpvcml0eSBvZiBvdXIgZGV2ZWxvcGVycyBzdGFydCBvdXQgYXMgdXNlcnMgYW5kIGd1aWRlCisgICAgICAgIHRoZWlyIGRldmVsb3BtZW50IGVmZm9ydHMgZnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlLgorICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgVXNlcnMgY29udHJpYnV0ZSB0byB0aGUgQXBhY2hlIHByb2plY3RzIGJ5IHByb3ZpZGluZyBmZWVkYmFjayB0bworICAgICAgICBkZXZlbG9wZXJzIGluIHRoZSBmb3JtIG9mIGJ1ZyByZXBvcnRzIGFuZCBmZWF0dXJlIHN1Z2dlc3Rpb25zLiBBcworICAgICAgICB3ZWxsLCB1c2VycyBwYXJ0aWNpcGF0ZSBpbiB0aGUgQXBhY2hlIGNvbW11bml0eSBieSBoZWxwaW5nIG90aGVyIHVzZXJzCisgICAgICAgIG9uIG1haWxpbmcgbGlzdHMgYW5kIHVzZXIgc3VwcG9ydCBmb3J1bXMuCisgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iRGV2ZWxvcGVycyI+PC9hPgorICAgICAgICBEZXZlbG9wZXJzCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgIEFsbCBvZiB0aGUgdm9sdW50ZWVycyB3aG8gYXJlIGNvbnRyaWJ1dGluZyB0aW1lLCBjb2RlLCBkb2N1bWVudGF0aW9uLAorICAgICAgICBvciByZXNvdXJjZXMgdG8gdGhlIEFudCBQcm9qZWN0LiBBIGRldmVsb3BlciB0aGF0IG1ha2VzIHN1c3RhaW5lZCwKKyAgICAgICAgd2VsY29tZSBjb250cmlidXRpb25zIHRvIHRoZSBwcm9qZWN0IG1heSBiZSBpbnZpdGVkIHRvIGJlY29tZSBhCisgICAgICAgIENvbW1pdHRlciwgdGhvdWdoIHRoZSBleGFjdCB0aW1pbmcgb2Ygc3VjaCBpbnZpdGF0aW9ucyBkZXBlbmRzIG9uIG1hbnkKKyAgICAgICAgZmFjdG9ycy4KKyAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJDb21taXR0ZXJzIj48L2E+CisgICAgICAgIENvbW1pdHRlcnMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgVGhlIHByb2plY3QncyBDb21taXR0ZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlIHByb2plY3QncyB0ZWNobmljYWwKKyAgICAgICAgbWFuYWdlbWVudC4gQWxsIGNvbW1pdHRlcnMgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhlIHByb2plY3QncyBzb3VyY2UKKyAgICAgICAgcmVwb3NpdG9yaWVzLiBDb21taXR0ZXJzIG1heSBjYXN0IGJpbmRpbmcgdm90ZXMgb24gYW55IHRlY2huaWNhbAorICAgICAgICBkaXNjdXNzaW9uIHJlZ2FyZGluZyB0aGUgcHJvamVjdC4KKyAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgIENvbW1pdHRlciBhY2Nlc3MgaXMgYnkgaW52aXRhdGlvbiBvbmx5IGFuZCBtdXN0IGJlIGFwcHJvdmVkIGJ5IGxhenkKKyAgICAgICAgY29uc2Vuc3VzIG9mIHRoZSBhY3RpdmUgUE1DIG1lbWJlcnMuIEEgQ29tbWl0dGVyIGlzIGNvbnNpZGVyZWQgZW1lcml0dXMKKyAgICAgICAgYnkgdGhlaXIgb3duIGRlY2xhcmF0aW9uIG9yIGJ5IG5vdCBjb250cmlidXRpbmcgaW4gYW55IGZvcm0gdG8gdGhlCisgICAgICAgIHByb2plY3QgZm9yIG92ZXIgc2l4IG1vbnRocy4gQW4gZW1lcml0dXMgY29tbWl0dGVyIG1heSByZXF1ZXN0CisgICAgICAgIHJlaW5zdGF0ZW1lbnQgb2YgY29tbWl0IGFjY2VzcyBmcm9tIHRoZSBQTUMuIFN1Y2ggcmVpbnN0YXRlbWVudCBpcworICAgICAgICBzdWJqZWN0IHRvIGxhenkgY29uc2Vuc3VzIG9mIGFjdGl2ZSBQTUMgbWVtYmVycy4KKyAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgIENvbW1pdCBhY2Nlc3MgY2FuIGJlIHJldm9rZWQgYnkgYSB1bmFuaW1vdXMgdm90ZSBvZiBhbGwgdGhlIGFjdGl2ZQorICAgICAgICBQTUMgbWVtYmVycyAoZXhjZXB0IHRoZSBjb21taXR0ZXIgaW4gcXVlc3Rpb24gaWYgdGhleSBhcmUgYWxzbyBhIFBNQyBtZW1iZXIpLgorICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgQWxsIEFwYWNoZSBjb21taXR0ZXJzIGFyZSByZXF1aXJlZCB0byBoYXZlIGEgc2lnbmVkIENvbnRyaWJ1dG9yIExpY2Vuc2UKKyAgICAgICAgQWdyZWVtZW50IChDTEEpIG9uIGZpbGUgd2l0aCB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFRoZXJlIGlzIGEKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9jb21taXR0ZXJzLmh0bWwiPkNvbW1pdHRlciBGQVE8L2E+CisgICAgICAgIHdoaWNoIHByb3ZpZGVzIG1vcmUgZGV0YWlscyBvbiB0aGUgcmVxdWlyZW1lbnRzIGZvciBDb21taXR0ZXJzCisgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICBBIGNvbW1pdHRlciB3aG8gbWFrZXMgYSBzdXN0YWluZWQgY29udHJpYnV0aW9uIHRvIHRoZSBwcm9qZWN0IG1heSBiZQorICAgICAgICBpbnZpdGVkIHRvIGJlY29tZSBhIG1lbWJlciBvZiB0aGUgUE1DLiBUaGUgZm9ybSBvZiBjb250cmlidXRpb24gaXMKKyAgICAgICAgbm90IGxpbWl0ZWQgdG8gY29kZS4gSXQgY2FuIGFsc28gaW5jbHVkZSBjb2RlIHJldmlldywgaGVscGluZyBvdXQKKyAgICAgICAgdXNlcnMgb24gdGhlIG1haWxpbmcgbGlzdHMsIGRvY3VtZW50YXRpb24sIGV0Yy4KKyAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJQcm9qZWN0IE1hbmFnZW1lbnQgQ29tbWl0dGVlIj48L2E+CisgICAgICAgIFByb2plY3QgTWFuYWdlbWVudCBDb21taXR0ZWUKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgVGhlIFByb2plY3QgTWFuYWdlbWVudCBDb21taXR0ZWUgKFBNQykgZm9yIEFwYWNoZSBBbnQgd2FzIGNyZWF0ZWQgYnkgYQorICAgICAgICA8YSBocmVmPSJtaXNzaW9uLmh0bWwiPnJlc29sdXRpb248L2E+IG9mIHRoZSBib2FyZCBvZiB0aGUgQXBhY2hlCisgICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb24gb24gMTg8c3VwPnRoPC9zdXA+IE5vdmVtYmVyIDIwMDIuIFRoZSBQTUMgaXMKKyAgICAgICAgcmVzcG9uc2libGUgdG8gdGhlIGJvYXJkIGFuZCB0aGUgQVNGIGZvciB0aGUgbWFuYWdlbWVudCBhbmQgb3ZlcnNpZ2h0CisgICAgICAgIG9mIHRoZSBBcGFjaGUgQW50IGNvZGViYXNlLiBUaGUgcmVzcG9uc2liaWxpdGllcyBvZiB0aGUgUE1DIGluY2x1ZGUKKyAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICA8bGk+RGVjaWRpbmcgd2hhdCBpcyBkaXN0cmlidXRlZCBhcyBwcm9kdWN0cyBvZiB0aGUgQXBhY2hlIEFudCBwcm9qZWN0LgorICAgICAgICAgICAgSW4gcGFydGljdWxhciBhbGwgcmVsZWFzZXMgbXVzdCBiZSBhcHByb3ZlZCBieSB0aGUgUE1DCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT5NYWludGFpbmluZyB0aGUgcHJvamVjdCdzIHNoYXJlZCByZXNvdXJjZXMsIGluY2x1ZGluZyB0aGUgY29kZWJhc2UKKyAgICAgICAgICAgIHJlcG9zaXRvcnksIG1haWxpbmcgbGlzdHMsIHdlYnNpdGVzLgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+U3BlYWtpbmcgb24gYmVoYWxmIG9mIHRoZSBwcm9qZWN0LgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+UmVzb2x2aW5nIGxpY2Vuc2UgZGlzcHV0ZXMgcmVnYXJkaW5nIHByb2R1Y3RzIG9mIHRoZSBwcm9qZWN0CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT5Ob21pbmF0aW5nIG5ldyBQTUMgbWVtYmVycyBhbmQgY29tbWl0dGVycworICAgICAgICA8L2xpPgorICAgICAgICA8bGk+TWFpbnRhaW5pbmcgdGhlc2UgYnlsYXdzIGFuZCBvdGhlciBndWlkZWxpbmVzIG9mIHRoZSBwcm9qZWN0CisgICAgICAgIDwvbGk+CisgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgTWVtYmVyc2hpcCBvZiB0aGUgUE1DIGlzIGJ5IGludml0YXRpb24gb25seSBhbmQgbXVzdCBiZSBhcHByb3ZlZCBieSBhCisgICAgICAgIGxhenkgY29uc2Vuc3VzIG9mIGFjdGl2ZSBQTUMgbWVtYmVycy4gQSBQTUMgbWVtYmVyIGlzIGNvbnNpZGVyZWQKKyAgICAgICAgImVtZXJpdHVzIiBieSB0aGVpciBvd24gZGVjbGFyYXRpb24gb3IgYnkgbm90IGNvbnRyaWJ1dGluZyBpbgorICAgICAgICBhbnkgZm9ybSB0byB0aGUgcHJvamVjdCBmb3Igb3ZlciBzaXggbW9udGhzLiBBbiBlbWVyaXR1cyBtZW1iZXIgbWF5CisgICAgICAgIHJlcXVlc3QgcmVpbnN0YXRlbWVudCB0byB0aGUgUE1DLiBTdWNoIHJlaW5zdGF0ZW1lbnQgaXMgc3ViamVjdCB0byBsYXp5CisgICAgICAgIGNvbnNlbnN1cyBvZiB0aGUgYWN0aXZlIFBNQyBtZW1iZXJzLiBNZW1iZXJzaGlwIG9mIHRoZSBQTUMgY2FuIGJlCisgICAgICAgIHJldm9rZWQgYnkgYW4gdW5hbmltb3VzIHZvdGUgb2YgYWxsIHRoZSBhY3RpdmUgUE1DIG1lbWJlcnMgb3RoZXIgdGhhbgorICAgICAgICB0aGUgbWVtYmVyIGluIHF1ZXN0aW9uLgorICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgVGhlIGNoYWlyIG9mIHRoZSBQTUMgaXMgYXBwb2ludGVkIGJ5IHRoZSBBU0YgYm9hcmQuIFRoZSBjaGFpciBpcyBhbgorICAgICAgICBvZmZpY2UgaG9sZGVyIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoVmljZSBQcmVzaWRlbnQsCisgICAgICAgIEFwYWNoZSBBbnQpIGFuZCBoYXMgcHJpbWFyeSByZXNwb25zaWJpbGl0eSB0byB0aGUgYm9hcmQgZm9yIHRoZQorICAgICAgICBtYW5hZ2VtZW50IG9mIHRoZSBwcm9qZWN0cyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBBbnQgUE1DLiBUaGUgY2hhaXIKKyAgICAgICAgcmVwb3J0cyB0byB0aGUgYm9hcmQgcXVhcnRlcmx5IG9uIGRldmVsb3BtZW50cyB3aXRoaW4gdGhlIEFudCBwcm9qZWN0LgorICAgICAgICBUaGUgUE1DIG1heSBjb25zaWRlciB0aGUgcG9zaXRpb24gb2YgUE1DIGNoYWlyIGFubnVhbGx5IGFuZCBpZgorICAgICAgICBzdXBwb3J0ZWQgYnkgMi8zIE1ham9yaXR5IG1heSByZWNvbW1lbmQgYSBuZXcgY2hhaXIgdG8gdGhlIGJvYXJkLgorICAgICAgICBVbHRpbWF0ZWx5LCBob3dldmVyLCBpdCBpcyB0aGUgYm9hcmQncyByZXNwb25zaWJpbGl0eSB3aG8gaXQgY2hvb3NlcworICAgICAgICB0byBhcHBvaW50IGFzIHRoZSBQTUMgY2hhaXIuCisgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJEZWNpc2lvbiBNYWtpbmciPjwvYT4KKyAgICAgIERlY2lzaW9uIE1ha2luZworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgIFdpdGhpbiB0aGUgQW50IHByb2plY3QsIGRpZmZlcmVudCB0eXBlcyBvZiBkZWNpc2lvbnMgcmVxdWlyZSBkaWZmZXJlbnQKKyAgICAgIGZvcm1zIG9mIGFwcHJvdmFsLiBGb3IgZXhhbXBsZSwgdGhlCisgICAgICA8YSBocmVmPSIjUm9sZXMgYW5kIFJlc3BvbnNpYmlsaXRpZXMiPnByZXZpb3VzIHNlY3Rpb248L2E+IGRlc2NyaWJlcworICAgICAgc2V2ZXJhbCBkZWNpc2lvbnMgd2hpY2ggcmVxdWlyZSAibGF6eSBjb25zZW5zdXMiIGFwcHJvdmFsLiBUaGlzCisgICAgICBzZWN0aW9uIGRlZmluZXMgaG93IHZvdGluZyBpcyBwZXJmb3JtZWQsIHRoZSB0eXBlcyBvZiBhcHByb3ZhbHMsIGFuZCB3aGljaAorICAgICAgdHlwZXMgb2YgZGVjaXNpb24gcmVxdWlyZSB3aGljaCB0eXBlIG9mIGFwcHJvdmFsLgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iVm90aW5nIj48L2E+CisgICAgICAgIFZvdGluZworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICBEZWNpc2lvbnMgcmVnYXJkaW5nIHRoZSBwcm9qZWN0IGFyZSBtYWRlIGJ5IHZvdGVzIG9uIHRoZSBwcmltYXJ5IHByb2plY3QKKyAgICAgICAgZGV2ZWxvcG1lbnQgbWFpbGluZyBsaXN0IChkZXZAYW50LmFwYWNoZS5vcmcpLiBXaGVyZSBuZWNlc3NhcnksCisgICAgICAgIFBNQyB2b3RpbmcgbWF5IHRha2UgcGxhY2Ugb24gdGhlIHByaXZhdGUgQW50IFBNQyBtYWlsaW5nIGxpc3QuCisgICAgICAgIFZvdGVzIGFyZSBjbGVhcmx5IGluZGljYXRlZCBieSBzdWJqZWN0IGxpbmUgc3RhcnRpbmcgd2l0aCBbVk9URV0gb3IKKyAgICAgICAgW1BNQy1WT1RFXS4gVm90ZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgaXRlbXMgZm9yIGFwcHJvdmFsIGFuZCB0aGVzZQorICAgICAgICBzaG91bGQgYmUgY2xlYXJseSBzZXBhcmF0ZWQuIFZvdGluZyBpcyBjYXJyaWVkIG91dCBieSByZXBseWluZyB0byB0aGUKKyAgICAgICAgdm90ZSBtYWlsLiBWb3RpbmcgbWF5IHRha2UgZm91ciBmbGF2b3VycworICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkZvcnJlc3RUYWJsZSIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8c3Ryb25nPisxPC9zdHJvbmc+CisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAiWWVzLCIgIkFncmVlLCIgb3IgInRoZSBhY3Rpb24gc2hvdWxkIGJlCisgICAgICAgICAgICBwZXJmb3JtZWQuIiBJbiBnZW5lcmFsLCB0aGlzIHZvdGUgYWxzbyBpbmRpY2F0ZXMgYSB3aWxsaW5nbmVzcworICAgICAgICAgICAgb24gdGhlIGJlaGFsZiBvZiB0aGUgdm90ZXIgaW4gIm1ha2luZyBpdCBoYXBwZW4iCisgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPHN0cm9uZz4rMDwvc3Ryb25nPgorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgVGhpcyB2b3RlIGluZGljYXRlcyBhIHdpbGxpbmduZXNzIGZvciB0aGUgYWN0aW9uIHVuZGVyCisgICAgICAgICAgICBjb25zaWRlcmF0aW9uIHRvIGdvIGFoZWFkLiBUaGUgdm90ZXIsIGhvd2V2ZXIgd2lsbCBub3QgYmUgYWJsZQorICAgICAgICAgICAgdG8gaGVscC4KKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8c3Ryb25nPi0wPC9zdHJvbmc+CisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICBUaGlzIHZvdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHZvdGVyIGRvZXMgbm90LCBpbiBnZW5lcmFsLCBhZ3JlZSB3aXRoCisgICAgICAgICAgICB0aGUgcHJvcG9zZWQgYWN0aW9uIGJ1dCBpcyBub3QgY29uY2VybmVkIGVub3VnaCB0byBwcmV2ZW50IHRoZQorICAgICAgICAgICAgYWN0aW9uIGdvaW5nIGFoZWFkLgorICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxzdHJvbmc+LTE8L3N0cm9uZz4KKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIFRoaXMgaXMgYSBuZWdhdGl2ZSB2b3RlLiBPbiBpc3N1ZXMgd2hlcmUgY29uc2Vuc3VzIGlzIHJlcXVpcmVkLAorICAgICAgICAgICAgdGhpcyB2b3RlIGNvdW50cyBhcyBhIDxzdHJvbmc+dmV0bzwvc3Ryb25nPi4gQWxsIHZldG9lcyBtdXN0CisgICAgICAgICAgICBjb250YWluIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGUgdmV0byBpcyBhcHByb3ByaWF0ZS4gVmV0b2VzIHdpdGgKKyAgICAgICAgICAgIG5vIGV4cGxhbmF0aW9uIGFyZSB2b2lkLiBJdCBtYXkgYWxzbyBiZSBhcHByb3ByaWF0ZSBmb3IgYSAtMSB2b3RlCisgICAgICAgICAgICB0byBpbmNsdWRlIGFuIGFsdGVybmF0aXZlIGNvdXJzZSBvZiBhY3Rpb24uCisgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgQWxsIHBhcnRpY2lwYW50cyBpbiB0aGUgQW50IHByb2plY3QgYXJlIGVuY291cmFnZWQgdG8gc2hvdyB0aGVpcgorICAgICAgICBhZ3JlZW1lbnQgd2l0aCBvciBhZ2FpbnN0IGEgcGFydGljdWxhciBhY3Rpb24gYnkgdm90aW5nLiBGb3IgdGVjaG5pY2FsCisgICAgICAgIGRlY2lzaW9ucywgb25seSB0aGUgdm90ZXMgb2YgYWN0aXZlIGNvbW1pdHRlcnMgYXJlIGJpbmRpbmcuIE5vbiBiaW5kaW5nCisgICAgICAgIHZvdGVzIGFyZSBzdGlsbCB1c2VmdWwgZm9yIHRob3NlIHdpdGggYmluZGluZyB2b3RlcyB0byB1bmRlcnN0YW5kIHRoZQorICAgICAgICBwZXJjZXB0aW9uIG9mIGFuIGFjdGlvbiBpbiB0aGUgd2lkZXIgQW50IGNvbW11bml0eS4gRm9yIFBNQyBkZWNpc2lvbnMsCisgICAgICAgIG9ubHkgdGhlIHZvdGVzIG9mIFBNQyBtZW1iZXJzIGFyZSBiaW5kaW5nLgorICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgVm90aW5nIGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gY2hhbmdlcyBtYWRlIHRvIHRoZSBBbnQgY29kZWJhc2UuIFRoZXNlCisgICAgICAgIHR5cGljYWxseSB0YWtlIHRoZSBmb3JtIG9mIGEgdmV0byAoLTEpIGluIHJlcGx5IHRvIHRoZSBjb21taXQgbWVzc2FnZQorICAgICAgICBzZW50IHdoZW4gdGhlIGNvbW1pdCBpcyBtYWRlLgorICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFwcHJvdmFscyI+PC9hPgorICAgICAgICBBcHByb3ZhbHMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgVGhlc2UgYXJlIHRoZSB0eXBlcyBvZiBhcHByb3ZhbHMgdGhhdCBjYW4gYmUgc291Z2h0LiBEaWZmZXJlbnQgYWN0aW9ucworICAgICAgICByZXF1aXJlIGRpZmZlcmVudCB0eXBlcyBvZiBhcHByb3ZhbHMKKyAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJGb3JyZXN0VGFibGUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPHN0cm9uZz5Db25zZW5zdXM8L3N0cm9uZz4KKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIEZvciB0aGlzIHRvIHBhc3MsIGFsbCB2b3RlcnMgd2l0aCBiaW5kaW5nIHZvdGVzIG11c3Qgdm90ZSBhbmQgdGhlcmUKKyAgICAgICAgICAgIGNhbiBiZSBubyBiaW5kaW5nIHZldG9lcyAoLTEpLiBDb25zZW5zdXMgdm90ZXMgYXJlIHJhcmVseSByZXF1aXJlZAorICAgICAgICAgICAgZHVlIHRvIHRoZSBpbXByYWN0aWNhbGl0eSBvZiBnZXR0aW5nIGFsbCBlbGlnaWJsZSB2b3RlcnMgdG8gY2FzdCBhCisgICAgICAgICAgICB2b3RlLgorICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxzdHJvbmc+TGF6eSBDb25zZW5zdXM8L3N0cm9uZz4KKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIExhenkgY29uc2Vuc3VzIHJlcXVpcmVzIDMgYmluZGluZyArMSB2b3RlcyBhbmQgbm8gYmluZGluZyB2ZXRvZXMuCisgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPHN0cm9uZz5MYXp5IE1ham9yaXR5PC9zdHJvbmc+CisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICBBIGxhenkgbWFqb3JpdHkgdm90ZSByZXF1aXJlcyAzIGJpbmRpbmcgKzEgdm90ZXMgYW5kIG1vcmUgYmluZGluZyArMQorICAgICAgICAgICAgdm90ZXMgdGhhdCAtMSB2b3Rlcy4KKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8c3Ryb25nPkxhenkgQXBwcm92YWw8L3N0cm9uZz4KKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIEFuIGFjdGlvbiB3aXRoIGxhenkgYXBwcm92YWwgaXMgaW1wbGljaXRseSBhbGxvd2VkIHVubGVzcyBhIC0xIHZvdGUKKyAgICAgICAgICAgIGlzIHJlY2VpdmVkLCBhdCB3aGljaCB0aW1lLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgYWN0aW9uLCBlaXRoZXIKKyAgICAgICAgICAgIGxhenkgbWFqb3JpdHkgb3IgbGF6eSBjb25zZW5zdXMgYXBwcm92YWwgbXVzdCBiZSBvYnRhaW5lZC4KKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8c3Ryb25nPjIvMyBNYWpvcml0eTwvc3Ryb25nPgorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgU29tZSBhY3Rpb25zIHJlcXVpcmUgYSAyLzMgbWFqb3JpdHkgb2YgYWN0aXZlIGNvbW1pdHRlcnMgb3IgUE1DCisgICAgICAgICAgICBtZW1iZXJzIHRvIHBhc3MuIFN1Y2ggYWN0aW9ucyB0eXBpY2FsbHkgYWZmZWN0IHRoZSBmb3VuZGF0aW9uCisgICAgICAgICAgICBvZiB0aGUgcHJvamVjdCAoZS5nLiBhZG9wdGluZyBhIG5ldyBjb2RlYmFzZSB0byByZXBsYWNlIGFuIGV4aXN0aW5nCisgICAgICAgICAgICBwcm9kdWN0KS4gVGhlIGhpZ2hlciB0aHJlc2hvbGQgaXMgZGVzaWduZWQgdG8gZW5zdXJlIHN1Y2ggY2hhbmdlcworICAgICAgICAgICAgYXJlIHN0cm9uZ2x5IHN1cHBvcnRlZC4gVG8gcGFzcyB0aGlzIHZvdGUgcmVxdWlyZXMgYXQgbGVhc3QgMi8zIG9mCisgICAgICAgICAgICBiaW5kaW5nIHZvdGUgaG9sZGVycyB0byB2b3RlICsxCisgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlZldG9lcyI+PC9hPgorICAgICAgICBWZXRvZXMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgQSB2YWxpZCwgYmluZGluZyB2ZXRvIGNhbm5vdCBiZSBvdmVycnVsZWQuIElmIGEgdmV0byBpcyBjYXN0LCBpdCBtdXN0IGJlCisgICAgICAgIGFjY29tcGFuaWVkIGJ5IGEgdmFsaWQgcmVhc29uIGV4cGxhaW5pbmcgdGhlIHJlYXNvbnMgZm9yIHRoZSB2ZXRvLiBUaGUKKyAgICAgICAgdmFsaWRpdHkgb2YgYSB2ZXRvLCBpZiBjaGFsbGVuZ2VkLCBjYW4gYmUgY29uZmlybWVkIGJ5IGFueW9uZSB3aG8gaGFzCisgICAgICAgIGEgYmluZGluZyB2b3RlLiBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5ICBzaWduaWZ5IGFncmVlbWVudCB3aXRoIHRoZQorICAgICAgICB2ZXRvIC0gbWVyZWx5IHRoYXQgdGhlIHZldG8gaXMgdmFsaWQuCisgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICBJZiB5b3UgZGlzYWdyZWUgd2l0aCBhIHZhbGlkIHZldG8sIHlvdSBtdXN0IGxvYmJ5IHRoZSBwZXJzb24gY2FzdGluZworICAgICAgICB0aGUgdmV0byB0byB3aXRoZHJhdyB0aGVpciB2ZXRvLiBJZiBhIHZldG8gaXMgbm90IHdpdGhkcmF3biwgdGhlIGFjdGlvbgorICAgICAgICB0aGF0IGhhcyBiZWVuIHZldG9lZCBtdXN0IGJlIHJldmVyc2VkIGluIGEgdGltZWx5IG1hbm5lci4KKyAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBY3Rpb25zIj48L2E+CisgICAgICAgIEFjdGlvbnMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgdmFyaW91cyBhY3Rpb25zIHdoaWNoIGFyZSB1bmRlcnRha2VuIHdpdGhpbgorICAgICAgICB0aGUgcHJvamVjdCwgdGhlIGNvcnJlc3BvbmRpbmcgYXBwcm92YWwgcmVxdWlyZWQgZm9yIHRoYXQgYWN0aW9uIGFuZAorICAgICAgICB0aG9zZSB3aG8gaGF2ZSBiaW5kaW5nIHZvdGVzIG92ZXIgdGhlIGFjdGlvbi4KKyAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJGb3JyZXN0VGFibGUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQWN0aW9uCisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgRGVzY3JpcHRpb24KKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcHByb3ZhbAorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEJpbmRpbmcgVm90ZXMKKyAgICAgIDwvdGg+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8c3Ryb25nPkNvZGUgQ2hhbmdlPC9zdHJvbmc+CisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICBBIGNoYW5nZSBtYWRlIHRvIGEgY29kZWJhc2Ugb2YgdGhlIHByb2plY3QgYW5kIGNvbW1pdHRlZAorICAgICAgICAgICAgYnkgYSBjb21taXR0ZXIuIFRoaXMgaW5jbHVkZXMgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24sIHdlYnNpdGUKKyAgICAgICAgICAgIGNvbnRlbnQsIGV0Yy4KKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIExhenkgYXBwcm92YWwgYW5kIHRoZW4gbGF6eSBjb25zZW5zdXMuCisgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICBBY3RpdmUgY29tbWl0dGVycy4KKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8c3Ryb25nPlJlbGVhc2UgUGxhbjwvc3Ryb25nPgorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgRGVmaW5lcyB0aGUgdGltZXRhYmxlIGFuZCBhY3Rpb25zIGZvciBhIHJlbGVhc2UuIFRoZSBwbGFuIGFsc28KKyAgICAgICAgICAgIG5vbWluYXRlcyBhIFJlbGVhc2UgTWFuYWdlci4KKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIExhenkgbWFqb3JpdHkKKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIEFjdGl2ZSBjb21taXR0ZXJzCisgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPHN0cm9uZz5Qcm9kdWN0IFJlbGVhc2U8L3N0cm9uZz4KKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIFdoZW4gYSByZWxlYXNlIG9mIG9uZSBvZiB0aGUgcHJvamVjdCdzIHByb2R1Y3RzIGlzIHJlYWR5LCBhIHZvdGUgaXMKKyAgICAgICAgICAgIHJlcXVpcmVkIHRvIGFjY2VwdCB0aGUgcmVsZWFzZSBhcyBhbiBvZmZpY2lhbCByZWxlYXNlIG9mIHRoZQorICAgICAgICAgICAgcHJvamVjdC4KKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIExhenkgTWFqb3JpdHkKKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIEFjdGl2ZSBQTUMgbWVtYmVycworICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxzdHJvbmc+QWRvcHRpb24gb2YgTmV3IENvZGViYXNlPC9zdHJvbmc+CisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgIFdoZW4gdGhlIGNvZGViYXNlIGZvciBhbiBleGlzdGluZywgcmVsZWFzZWQgcHJvZHVjdCBpcyB0byBiZQorICAgICAgICAgICAgcmVwbGFjZWQgd2l0aCBhbiBhbHRlcm5hdGl2ZSBjb2RlYmFzZS4gSWYgc3VjaCBhIHZvdGUgZmFpbHMgdG8KKyAgICAgICAgICAgIGdhaW4gYXBwcm92YWwsIHRoZSBleGlzdGluZyBjb2RlIGJhc2Ugd2lsbCBjb250aW51ZS4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICBUaGlzIGFsc28gY292ZXJzIHRoZSBjcmVhdGlvbiBvZiBuZXcgc3ViLXByb2plY3RzCisgICAgICAgICAgICB3aXRoaW4gdGhlIHByb2plY3QKKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIDIvMyBtYWpvcml0eQorICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgQWN0aXZlIGNvbW1pdHRlcnMKKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8c3Ryb25nPk5ldyBDb21taXR0ZXI8L3N0cm9uZz4KKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIFdoZW4gYSBuZXcgY29tbWl0dGVyIGlzIHByb3Bvc2VkIGZvciB0aGUgcHJvamVjdAorICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgTGF6eSBjb25zZW5zdXMKKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIEFjdGl2ZSBQTUMgbWVtYmVycworICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxzdHJvbmc+TmV3IFBNQyBNZW1iZXI8L3N0cm9uZz4KKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIFdoZW4gYSBjb21taXR0ZXIgaXMgcHJvcG9zZWQgZm9yIHRoZSBQTUMKKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIExhenkgY29uc2Vuc3VzCisgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICBBY3RpdmUgUE1DIG1lbWJlcnMKKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8c3Ryb25nPkNvbW1pdHRlciBSZW1vdmFsPC9zdHJvbmc+CisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICA8cD5XaGVuIHJlbW92YWwgb2YgY29tbWl0IHByaXZpbGVnZXMgaXMgc291Z2h0LjwvcD4KKyAgICAgICAgICAgIDxwPjxiPk5vdGU6IDwvYj4gU3VjaCBhY3Rpb25zIHdpbGwgYWxzbyBiZSByZWZlcnJlZCB0byB0aGUgQVNGCisgICAgICAgICAgICBib2FyZCBieSB0aGUgUE1DIGNoYWlyPC9wPgorICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgQ29uc2Vuc3VzCisgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICBBY3RpdmUgUE1DIG1lbWJlcnMgKGV4Y2x1ZGluZyB0aGUgY29tbWl0dGVyIGluIHF1ZXN0aW9uIGlmIGEKKyAgICAgICAgICAgIG1lbWJlciBvZiB0aGUgUE1DKS4KKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8c3Ryb25nPlBNQyBNZW1iZXIgUmVtb3ZhbDwvc3Ryb25nPgorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgPHA+V2hlbiByZW1vdmFsIG9mIGEgUE1DIG1lbWJlciBpcyBzb3VnaHQuPC9wPgorICAgICAgICAgICAgPHA+PGI+Tm90ZTogPC9iPiBTdWNoIGFjdGlvbnMgd2lsbCBhbHNvIGJlIHJlZmVycmVkIHRvIHRoZQorICAgICAgICAgICAgQVNGIGJvYXJkIGJ5IHRoZSBQTUMgY2hhaXI8L3A+CisgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICBDb25zZW5zdXMKKyAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgIEFjdGl2ZSBQTUMgbWVtYmVycyAoZXhjbHVkaW5nIHRoZSBtZW1iZXIgaW4gcXVlc3Rpb24pLgorICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJWb3RpbmcgVGltZWZyYW1lcyI+PC9hPgorICAgICAgICBWb3RpbmcgVGltZWZyYW1lcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICBWb3RlcyBhcmUgb3BlbiBmb3IgYSBwZXJpb2Qgb2YgMSB3ZWVrIHRvIGFsbG93IGFsbCBhY3RpdmUgdm90ZXJzCisgICAgICAgIHRpbWUgdG8gY29uc2lkZXIgdGhlIHZvdGUuIFZvdGVzIHJlbGF0aW5nIHRvIGNvZGUgY2hhbmdlcyBhcmUgbm90CisgICAgICAgIHN1YmplY3QgdG8gYSBzdHJpY3QgdGltZXRhYmxlIGJ1dCBzaG91bGQgYmUgbWFkZSBhcyB0aW1lbHkgYXMgcG9zc2libGUuCisgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9jb250cmlidXRvcnMuaHRtbCBiL3RydW5rL2RvY3MvY29udHJpYnV0b3JzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5ZmNlOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvY29udHJpYnV0b3JzLmh0bWwKQEAgLTAsMCArMSw1NDMgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIENvbnRyaWJ1dG9yczwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAgICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iQXBhY2hlIEFudCBQTUMiPgorICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0iIj4KKyAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+SG9tZTwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4vcHJvamVjdHMvaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+UHJvamVjdHM8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BcGFjaGUgQW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xpY2Vuc2UuaHRtbCI+TGljZW5zZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2FudG5ld3MuaHRtbCI+TmV3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2V4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9mYXEuaHRtbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvRnJvbnRQYWdlIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvYmxlbXMuaHRtbCI+SGF2aW5nIFByb2JsZW1zPzwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvd25sb2FkCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9zcmNkb3dubG9hZC5jZ2kiPlNvdXJjZSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+Q29udHJpYnV0aW5nCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFpbC5odG1sIj5NYWlsaW5nIExpc3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vc3ZuLmh0bWwiPlN1YnZlcnNpb24gUmVwb3NpdG9yaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbmlnaHRsaWVzLmh0bWwiPk5pZ2h0bHkgQnVpbGRzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnVncy5odG1sIj5CdWcgRGF0YWJhc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5TcG9uc29yc2hpcAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCI+VGhhbmtzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiPlNwb25zb3JzaGlwPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2NvbnRyaWJ1dGluZy5odG1sIj5Eb25hdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0IE1hbmFnZW1lbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+Q29udHJpYnV0b3JzPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21pc3Npb24uaHRtbCI+QXBhY2hlIEFudCBNaXNzaW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnlsYXdzLmh0bWwiPlByb2plY3QgQnlsYXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGVnYWwuaHRtbCI+TGVnYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPkNvbnRyaWJ1dG9yczwvaDE+CisgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iUHJvamVjdCBNYW5hZ2VtZW50IENvbW1pdHRlZSI+PC9hPgorICAgICAgUHJvamVjdCBNYW5hZ2VtZW50IENvbW1pdHRlZQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBY3RpdmUgTWVtYmVycyI+PC9hPgorICAgICAgICBBY3RpdmUgTWVtYmVycworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkJydWNlIEF0aGVydG9uPC9iPiAoYnJ1Y2UgYXQgY2FsbGVuaXNoLmNvbSAtIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2FsbGVuaXNoLmNvbS9+YnJ1Y2UiPmh0dHA6Ly93d3cuY2FsbGVuaXNoLmNvbS9+YnJ1Y2U8L2E+KQorPGJyIC8+CitDdXJyZW50bHkgYSBTeXN0ZW1zIEFyY2hpdGVjdCB3aXRoIEF2dWUgVGVjaG5vbG9naWVzLCBCcnVjZSBoYXMgYmVlbgord29ya2luZyB3aXRoIEphdmEgc2luY2UgdmVyc2lvbiAxLjBhMi4gSGUgYWxzbyBjbGFpbXMgdG8gYmUgb25lIG9mIHRoZSBmaXJzdAorcGVvcGxlIHRvIG1hcmsgdXAgYSBGQVEgd2l0aCBIVE1MLCBmb3IgYSB3ZWIgYnJvd3NlciBvZiB0aGUgZGlzdGFudCBwYXN0CitjYWxsZWQgQ2VsbG8uCisgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPlN0ZXBoYW5lIEJhaWxsaWV6PC9iPjxiciAvPgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5NYXR0IEJlbnNvbjwvYj48YnIgLz4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+U3RlZmFuIEJvZGV3aWc8L2I+IChzdGVmYW4uYm9kZXdpZyBhdCBmcmVlbmV0LmRlIC0KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3RlZmFuLnNhbWFmbG9zdC5kZS8iPmh0dHA6Ly9zdGVmYW4uc2FtYWZsb3N0LmRlLzwvYT4pCis8YnIgLz4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+RG9taW5pcXVlIERldmllbm5lPC9iPiAoZGRldmllbm5lIGF0IGFwYWNoZS5vcmcpCis8YnIgLz4KK0RvbWluaXF1ZSBoYXMgYmVlbiBpbnZvbHZlZCBub24tc3RvcCB3aXRoIHRoZSBBbnQgdXNlciBjb21tdW5pdHkgc2luY2UKK3RoZSAxLjQgZGF5cywgdHJ5aW5nIHdpdGhvdXQgc3VjY2VzcyB0byBhbnN3ZXIgcG9zdHMgYXMgd2VsbCBvciBhcyBvZnRlbgorYXMgRGlhbmUgSG9sdCBhZnRlciBzaGUgbGVmdCB0aGUgdXNlciBsaXN0LiBIZSBpcyBvcGluaW9uYXRlZCwgYWx3YXlzCitzdHJpdmluZyBmb3IgdGhlIGJlc3QgcG9zc2libGUgZGVzaWduLiBXaGlsZSBhdCBMYW5kbWFyayBHcmFwaGljcywgaGUKK2Rlc2lnbmVkIGFuZCBpbXBsZW1lbnRlZCBsYXJnZSBBbnQvQ3BwVGFza3MgYnVpbGRzIGZvciBtaXhlZCBKYXZhL0MrKyBwcm9qZWN0cy4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+RXJpayBIYXRjaGVyPC9iPiAoZWhhdGNoZXIgYXQgYXBhY2hlLm9yZykKKzxiciAvPgorRXJpayBpcyB0aGUgY28tYXV0aG9yIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFubmluZy5jb20vaGF0Y2hlciI+CitKYXZhIERldmVsb3BtZW50IHdpdGggQW50PC9hPiBhbmQgc3BlYWtzIG9uIEFudCBhbmQgb3RoZXIgdG9waWNzIGF0Cis8YSBocmVmPSJodHRwOi8vd3d3Lm5vZmx1ZmZqdXN0c3R1ZmYuY29tIj5ObyBGbHVmZiwgSnVzdCBTdHVmZgorc3ltcG9zaXVtczwvYT4gYXMgd2VsbCBhcyBvdGhlciB2ZW51ZXMuICBFcmlrIGlzIHRoZSBQcmVzaWRlbnQgb2YKKzxhIGhyZWY9Imh0dHA6Ly93d3cuZWhhdGNoZXJzb2x1dGlvbnMuY29tIj5lSGF0Y2hlciBTb2x1dGlvbnMsIEluYzwvYT4uCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPk1hcnRpam4gKEouTS4pIEtydWl0aG9mPC9iPiAoYW50IGF0IGtydWl0aG9mIHhzNGFsbCBubCkKKzxiciAvPgorTWFydGlqbiBLcnVpdGhvZiBpcyBhIHN5c3RlbSBlbmdpbmVlciB3b3JraW5nIHdpdGggYW5kIG9uIEphdmEgcHJvZHVjdHMKK2luIGEgdGVsZWNvbW11bmljYXRpb24gbmV0d29yayBzZXR0aW5nLgorPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5BbnRvaW5lIExldnktTGFtYmVydDwvYj4gKGFudG9pbmUgYXQgYXBhY2hlLm9yZykKKzxiciAvPgorQW50b2luZSBpcyB3b3JraW5nIGFzIGEgc29mdHdhcmUgZW5naW5lZXIgZm9yIAorPGEgaHJlZj0iaHR0cDovL3d3dy5hcmllbHBhcnRuZXJzLmNvbSI+QXJpZWwgUGFydG5lcnM8L2E+LgorSGUgaXMgc3BlY2lhbGl6ZWQgaW4gYnVpbGRzIGFuZCBhdXRvbWF0aW9uIG9mIGRlcGxveW1lbnQgcHJvY2Vzc2VzLgorCisgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPlN0ZXZlIExvdWdocmFuPC9iPjxiciAvPgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5Db25vciBNYWNOZWlsbDwvYj4gKGNvbm9yIGF0IGNvcnRleGVidXNpbmVzcy5jb20uYXUpCis8YnIgLz4KK0Nvbm9yIGlzIGEgc2VuaW9yIGRldmVsb3BlciBhdCBDb3J0ZXggZUJ1c2luZXNzLCB3aGVyZSBoZSBkZXZlbG9wcworSjJFRSBiYXNlZCBzeXN0ZW1zLiBJbiBoaXMgc3BhcmUgdGltZSBoZSBoZWxwcyB3aXRoIHRoZSBkZXZlbG9wbWVudCBvZgordGhlIEFudCBidWlsZCB0b29sLiAgSGUgaXMgYWxzbyBzZXJ2aW5nIGFzIHRoZSBDaGFpcm1hbiBvZiB0aGlzIFBNQy4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisJCQkJPGI+SmFuIE1hdOhybmU8L2I+IChqaG0gYXQgYXBhY2hlLm9yZykKKzxiciAvPgorSmFuIGlzIGNvbnN1bHRhbnQgZm9yIE9PQS9EIGluIHRoZSBjb21wdXRlciBjZW50cmUgb2YgdGhlIGdvdmVybm1lbnQKK29mIE5vcnRocmhpbmUgV2VzdGZhbGlhIC8gR2VybWFueS4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+UGV0ZXIgUmVpbGx5PC9iPjxiciAvPgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5pbnRlcnR3aW5nbHkubmV0LyI+U2FtIFJ1Ynk8L2E+CisgICAgICAgICAgICAgICAgPC9iPgorICAgICAgICAgICAgICAgIChydWJ5cyBhdCB1cy5pYm0uY29tKQorPGJyIC8+CitTYW0gdGFrZXMgYSBwZXJ2ZXJzZSBwbGVhc3VyZSBpbiBpbnRlZ3JhdGluZyBkaXNwYXJhdGUgdGhpbmdzLiAgSGUgaXMKK2EgbWVtYmVyIG9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnBocC5uZXQvY3JlZGl0cy5waHAiPlBIUCBncm91cDwvYT4sIEFwYWNoZQorPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3dob3dlYXJlLmh0bWwiPlhNTCBQTUM8L2E+LCBBcGFjaGUKK3Nwb25zb3IgZm9yIHRoZSA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvc29hcCI+eG1sLXNvYXA8L2E+IHN1YnByb2plY3QKK2FuZCBjb252ZW5lciBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmVjbWEuY2giPkVDTUE8L2E+IFRDMzkgVEczLgorPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5NYWdlc2ggVW1hc2Fua2FyPC9iPiAodW1hZ2VzaCBhdCBhcGFjaGUub3JnKQorPGJyIC8+CitNYWdlc2gsIFByZXNpZGVudCBvZiA8YSBocmVmPSJodHRwOi8vd3d3Lm1ldGFtYWNoc29sdXRpb25zLmNvbSI+TWV0YW1hY2ggU29sdXRpb25zPC9hPiwgCithbiBBdGxhbnRhLWJhc2VkIHRlY2hub2xvZ3ktbWFuYWdlbWVudCBjb25zdWx0YW5jeSwgaGFzIHJlY2VudGx5IGxhdW5jaGVkIAorPGEgaHJlZj0iaHR0cDovL3d3dy53aW5lZGluLmNvbSI+V2luZWRJbi5jb208L2E+IGZvciB3aW5lLWxvdmVycyB0byBwYWlyIGZvb2QgYW5kIHdpbmUuIAorPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5DaHJpc3RvcGggV2lsaGVsbXM8L2I+IChjaHJpc3RvcGgud2lsaGVsbXMgYXQgdC1vbmxpbmUuZGUpCis8YnIgLz4KK0NocmlzdG9waCB3b3JrcyBhcyBzb2Z0d2FyZSBlbmdpbmVlciBhdCB0aGUgd29ybGQncyBiaWdnZXN0IHRyYXZlbCBjb21wYW55Cis8YSBocmVmPSJodHRwOi8vd3d3LnR1aS5jb20iPlRVSTwvYT4uIEhpcyBwYXNzaW9uIGFyZSBhbGwgVUkgcmVsYXRlZCB0aGluZ3Mgc28KK2F0IHRoZSBBbnQtUHJvamVjdCBoZSB0YWtlcyBjYXJlIG9mIEFudGlkb3RlIC0gdGhlIEFudCBHVUkuCisgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICA8Yj5LZXZpbiBKYWNrc29uPC9iPiAoZm9hbWRpbm8gYXQgZ21haWwuY29tKTxiciAvPgorPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkVtZXJpdHVzIE1lbWJlcnMiPjwvYT4KKyAgICAgICAgRW1lcml0dXMgTWVtYmVycworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkphbWVzIER1bmNhbiBEYXZpZHNvbjwvYj4gKGR1bmNhbiBhdCB4MTgwLm5ldCAtIDxhIGhyZWY9Imh0dHA6Ly94MTgwLm5ldC8iPmh0dHA6Ly94MTgwLm5ldC88L2E+KQorPGJyIC8+CisKK0J5IGRheSwgRHVuY2FuIHdvcmtzIGluIHRoZSBPcGVuIFNvdXJjZSBQcm9ncmFtIE9mZmljZSBhdCBTdW4KK01pY3Jvc3lzdGVtcyB3aGVyZSBoZSBoZWxwcyB2YXJpb3VzIE9wZW4gU291cmNlIGVmZm9ydHMgd2l0aGluIFN1bgorImRvIHRoZSByaWdodCB0aGluZyIuIFByZXZpb3VzbHkgYXQgU3VuIGhlIHdhcyByZXNwb25zaWJsZQorZm9yIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9ucyAyLjEgYW5kIDIuMiBhcyB3ZWxsIGFzIHRoZSBKYXZhIEFQSQorZm9yIFhNTCBQYXJzaW5nIDEuMCBhbmQgd2FzIHRoZSBvcmlnaW5hbCBhdXRob3Igb2YgVG9tY2F0IGFuZCBBbnQuIEhlCit3YXMgb25lIG9mIHRoZSByYWJibGUtcm91c2VycyB3aXRoaW4gU3VuIHRoYXQgaGVscGVkIG1ha2UgdGhlIEpha2FydGEKK1Byb2plY3QgYSByZWFsaXR5IGFuZCBzZXJ2ZWQgYXMgdGhlIGZpcnN0IENoYWlybWFuIG9mIHRoZSBKYWthcnRhIFBNQy4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+RGlhbmUgSG9sdDwvYj48YnIgLz4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+RG9uYWxkIExlc2xpZTwvYj48YnIgLz4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+Q29zdGluIE1vbm9sYWNoZTwvYj48YnIgLz4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+Sm9uIFNrZWV0PC9iPjxiciAvPgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQ29tbWl0dGVycyI+PC9hPgorICAgICAgQ29tbWl0dGVycworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBY3RpdmUgQ29tbWl0dGVycyI+PC9hPgorICAgICAgICBBY3RpdmUgQ29tbWl0dGVycworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPlN0ZXZlIENvaGVuPC9iPgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5Kb3NlIEFsYmVydG8gRmVybmFuZGV6PC9iPgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5KZXNzZSBHbGljazwvYj4gKGplc3NlIGRvdCBnbGljayBhdCBzdW4gZG90IGNvbSkKKzxiciAvPgorSmVzc2UgaGFzIGJlZW4gdXNpbmcgSmF2YSBzaW5jZSAxOTk4IGFuZCBqb2luZWQgU3VuIE1pY3Jvc3lzdGVtcyBhcworcGFydCBvZiB0aGUgY29tcGFueSB0aGF0IHByb2R1Y2VkIHRoZSBOZXRCZWFucyBJREUuIEFmdGVyIGRpc2NvdmVyaW5nCitBbnQgaW4gdGhlIDEuMiBkYXlzLCBoZSB3cm90ZSBtb3N0IG9mIE5ldEJlYW5zJyBBbnQgaW50ZWdyYXRpb24uCitSZWNlbnRseSBoZSBoYXMgd29ya2VkIG9uIHRoZSBOZXRCZWFucyA0LjAgcHJvamVjdCBzeXN0ZW0sIGJhc2VkIGhlYXZpbHkKK29uIEFudCBhcyBhIGJ1aWxkIHRvb2wuCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgPGI+QWxleGV5IFNvbG9mbmVua288L2I+ICh0cmVsb255IGF0IGdtYWlsLmNvbSk8YnIgLz4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJFbWVyaXR1cyBDb21taXR0ZXJzIj48L2E+CisgICAgICAgIEVtZXJpdHVzIENvbW1pdHRlcnMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5QcmVzdG9uIEJhbm5pc3RlcjwvYj48YnIgLz4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+TmljayBEYXZpczwvYj48YnIgLz4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+RGFycmVsbCBEZUJvZXI8L2I+PGJyIC8+CisgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPlBldGVyIERvbmFsZDwvYj4gKHBldGVyIGF0IGFwYWNoZS5vcmcpCis8YnIgLz4KKworUGV0ZXIgaXMgYW4gYXZpZCBqYXZhIGRldmVsb3BlciB3aG8gaXMgYWN0aXZlIGluIHRoZQorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hdmFsb24vIj5BdmFsb248L2E+IGFuZAorPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPiBwcm9qZWN0cy4KK0luIGhpcyBzcGFyZSB0aW1lIGhlIGRldmVsb3BzIGEgZGlzdHJpYnV0ZWQgdmlydHVhbCBlbnZpcm9ubWVudAorKGllIG1pbGl0YXJ5IHNpbXVsYXRvciBvciAzRCBnYW1lKSB1c2luZyBqYXZhIHRlY2hub2xvZ2llcy4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+RGFubm8gRmVycmluPC9iPiAoc2hlbW5vbiBhdCB5YWhvby5jb20pCis8YnIgLz4KK0Rhbm5vIGhhcyBiZWVuIHByb2dyYW1taW5nIGluIEphdmEgc2luY2UgU3VtbWVyIDk2LiBEYW5ubyB3cm90ZSBhIEpTUAorZW5naW5lIG9uIGhpcyBvd24gYW5kIHJlbGVhc2VkIGl0IHRoZSB2ZXJ5IHNhbWUgZGF5IEpha2FydGEgd2FzCithbm5vdW5jZWQgYXQgSmF2YU9uZS4gU2luY2UgdGhlbiwgaGUgZGVjaWRlZCB0byBqb2luIHRoZSBKYWthcnRhCitwcm9qZWN0IGluIGEgc3Bpcml0IG9mIGNvLW9wZXJhdGlvbiBvdmVyIGNvbXBldGl0aW9uLgorPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5TaW1lb24gSC5LLiBGaXRjaDwvYj4gKHNpbWVvbi5maXRjaCBhdCBtc2VlZHNvZnQuY29tKQorPGJyIC8+CitTaW1lb24gaXMgb3duZXIgb2YgTXVzdGFyZCBTZWVkIFNvZnR3YXJlLCB3aGljaCBzcGVjaWFsaXplcyBpbiBkZXZlbG9waW5nCitkaXN0cmlidXRlZCBhcHBsaWNhdGlvbnMgYW5kIHVzZXIgaW50ZXJmYWNlcyBmb3IgdGhlIHNjaWVuY2UsIGVuZ2luZWVyaW5nLAorYW5kIHJlc2VhcmNoIG9yaWVudGVkIGNsaWVudHMuIEhlIGlzIHRoZSBsZWFkIGFyY2hpdGVjdCBhbmQgZGV2ZWxvcGVyIGZvcgorQW50aWRvdGUsIHRoZSBHVUkgZm9yIEFudC4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+VGhvbWFzIEhhYXM8L2I+ICh0aGEgYXQgd2hpdGVzdGVpbi5jb20pCis8YnIgLz4KK1RvbSBpcyBpbnRlcmVzdGVkIGluIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIEphdmEgbWlkZGxld2FyZSBhbmQgd29ya2VkIG9uIGFuCitpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSk1TIHNwZWNpZmljYXRpb24uIEF0IFdoaXRlc3RlaW4gVGVjaG5vbG9naWVzIGhlIGlzCit3b3JraW5nIG9uIGJyaW5naW5nIHNvZnR3YXJlIGFnZW50IHRlY2hub2xvZ3kgYW5kIEoyRUUgdG9nZXRoZXIuCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorCisgICAgICAgICAgICAgICAgPGI+SmFzb24gSHVudGVyPC9iPiAoamggYXQgc2VydmxldHMuY29tKQorPGJyIC8+CitKYXNvbiBpcyBhdXRob3Igb2YgIkphdmEgU2VydmxldCBQcm9ncmFtbWluZyIgKE8nUmVpbGx5KSBhbmQgcHVibGlzaGVyCitvZiA8YSBocmVmPSJodHRwOi8vd3d3LnNlcnZsZXRzLmNvbS8iPmh0dHA6Ly93d3cuc2VydmxldHMuY29tLzwvYT4uCitIZSB3b3JrcyBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmNvbGxhYi5uZXQiPkNvbGxhYk5ldDwvYT4uCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkp1c3R5bmEgSG9yd2F0PC9iPiAoaG9yd2F0IGF0IGFwYWNoZS5vcmcpCis8YnIgLz4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+QXJ1biBKYW13YWw8L2I+Cis8YnIgLz4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+QXJub3V0IEouIEt1aXBlcjwvYj4gKGFqa3VpcGVyIGF0IHBsYW5ldC5ubCkKKzxiciAvPgorCitBcm5vdXQgSi4gS3VpcGVyIGlzIGEgSmF2YSBBcmNoaXRlY3Qgd2l0aCB0aGUgU3VuIEphdmEgQ2VudGVyIGF0IFN1bgorTWljcm9zeXN0ZW1zLiBIaXMgbWFpbiBmb2N1cyBpcyB3ZWItcmVsYXRlZCB0ZWNobm9sb2dpZXMgb24gdGhlIEphdmEKK3BsYXRmb3JtIChKMkVFLCBYTUwsIC4uLikuCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPlN0ZWZhbm8gTWF6em9jY2hpPC9iPiAoc3RlZmFubyBhdCBhcGFjaGUub3JnKQorPGJyIC8+CitTdGVmYW5vIGlzIGFkZGljdGVkIHRvIHNvZnR3YXJlIGRlc2lnbiwgSmF2YSBwcm9ncmFtbWluZyBhbmQKK29wZW4gZGV2ZWxvcG1lbnQuIEluIHRoZSBsYXN0IDQgeWVhcnMsIGhlIGhhcyBjb250cmlidXRlZCB3YXkgdG9vIG11Y2gKK3RpbWUgdG8gQXBhY2hlLCBleHBlY2lhbGx5IG9uIEpTZXJ2LCBKTWV0ZXIsIEF2YWxvbiwgSkFNRVMsIEFudCwgQ29jb29uCithbmQgaGVscGluZyB0byBicmluZyBtb3JlIHByb2plY3RzIGludG8gQXBhY2hlLWxhbmQsIHN1Y2ggYXMgRk9QLCBCYXRpaywKK1BPSSBhbmQgWGluZGljZS4gVGhlIHByb2JsZW0gaXMgdGhhdCBoZSdzIHRvbyBwaWNreSB0byBiZSBzYXRpc2ZpZWQgOi0pCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkdsZW5uIE1jQWxsaXN0ZXI8L2I+IChnbGVubiBhdCBzb21hbmV0d29ya3MuY29tKQorPGJyIC8+CitHbGVubiBNY0FsbGlzdGVyIGlzIGEgc29mdHdhcmUgZGV2ZWxvcGVyIGF0IFNPTUEgTmV0d29ya3MsIHdhcyBmb3JtZXJseQordGhlIHNhbWUgYXQgSUJNIChwbHVzIHRlY2ggd3JpdGVyIHBsdXMgYnVpbGQgZ3V5KSwgYW5kIGRvZXMgc29tZSB3cml0aW5nCitvbiB0aGUgc2lkZSBmb3IgdGhlIFZBREQgVGVjaG5pY2FsIEpvdXJuYWwuCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkNyYWlnIE1jQ2xhbmFoYW48L2I+IChDcmFpZy5NY0NsYW5haGFuIGF0IGVuZy5zdW4uY29tKQorPGJyIC8+CitDcmFpZyB3YXMgaW52b2x2ZWQgaW4gdGhlIEFwYWNoZSBKU2VydiBwcm9qZWN0LCBmb2N1c2VkIG9uIGltcGxlbWVudGluZworYSBuZXh0IGdlbmVyYXRpb24gYXJjaGl0ZWN0dXJlIGFuZCBmZWF0dXJlIHNldCBmb3IgdGhlIGNvcmUgc2VydmxldAorZW5naW5lLiAgSGUgaGFzIHJlY2VudGx5IGpvaW5lZCBTdW4gYXMgdGVjaG5pY2FsIGxlYWQgZm9yIHRoZSBzZXJ2bGV0CithbmQgSlNQIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkFkYW0gTXVyZG9jaDwvYj4KKzxiciAvPgorPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5IYXJpc2ggUHJhYmhhbmRoYW08L2I+IChoYXJpc2hwIGF0IG9uZWJveC5jb20pCis8YnIgLz4KK0hhcmlzaCBpcyBhbiBlbmdpbmVlciB3aXRoIHRoZSBKMkVFIHRlYW0gYXQgU3VuLCBwcmltYXJpbHkgcmVzcG9uc2libGUKK2ZvciBpbXBsZW1lbnRpbmcgc2VjdXJpdHkgaW4gdGhlIEoyRUUgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisoUkkpLiBIZSBpbnRlZ3JhdGVkIHZhcmlvdXMgdGVjaG5vbG9naWVzIGluY2x1ZGluZyBzZXJ2bGV0L0pTUAoraW1wbGVtZW50YXRpb25zIGZyb20gVG9tY2F0IGludG8gdGhlIEoyRUUgUkkuIFRoZXNlIGRheXMsIGhlIGhhY2tzIFBIUAorY29kZSBkdXJpbmcgdGhlIGRheS4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+TmljbyBTZWVzc2xlPC9iPjxiciAvPgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5HYWwgU2hhY2hvcjwvYj4gKHNoYWNob3IgYXQgaWwuaWJtLmNvbSkKKzxiciAvPgorR2FsIFNoYWNob3IgaXMgYSByZXNlYXJjaCBzdGFmZiBtZW1iZXIgYXQgSUJNLiBIZSB3cm90ZSBoaXMgZmlyc3QKK1NlcnZsZXQgY29udGFpbmVyIChTZXJ2bGV0RXhwcmVzcykgYXQgdGhlIGJlZ2lubmluZyBvZiAxOTk3LiBMYXRlciBvbgorU2VydmxldEV4cHJlc3MgKGFuZCBHYWwpIG1lcmdlZCBpbnRvIFdlYlNwaGVyZSwgYW5kIEdhbCBwYXJ0aWNpcGF0ZWQKK2luIHRoZSBkZXZlbG9wbWVudCBvZiBXZWJTcGhlcmUgMSwgMiBhbmQgMy4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+Sm9uIFMuIFN0ZXZlbnM8L2I+IChqb24gYXQgY29sbGFiLm5ldCkKKzxiciAvPgorCitKb24gaXMgYSBDby1Gb3VuZGVyIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xlYXJpbmsuY29tLyI+Q2xlYXIgSW5rCitDb3JwPC9hPiBhbmQgcmVjZW50bHkgbGVmdCB0byB3b3JrIG9uIDxhIGhyZWY9Imh0dHA6Ly9zY2FyYWIudGlncmlzLm9yZy8iPlNjYXJhYjwvYT4gYSBuZXh0IGdlbmVyYXRpb24gT3BlbgorU291cmNlIEphdmEgU2VydmxldCBiYXNlZCBJc3N1ZS9CdWcgdHJhY2tpbmcgc3lzdGVtIGZvciA8YSBocmVmPSJodHRwOi8vd3d3LmNvbGxhYi5uZXQvIj5Db2xsYWJOZXQ8L2E+LiBIZSBpcyBhbiBhY3RpdmUgZGV2ZWxvcGVyCitvZiB0aGUgPGEgaHJlZj0iaHR0cDovL2phdmEuYXBhY2hlLm9yZy9qc2Vydi8iPkFwYWNoZSBKU2VydiBTZXJ2bGV0CitFbmdpbmU8L2E+IGZvciB0aGUgQXBhY2hlIFdlYiBTZXJ2ZXIgYW5kIENvLUF1dGhvciBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL2phdmEuYXBhY2hlLm9yZy9lY3MvIj5FbGVtZW50IENvbnN0cnVjdGlvbiBTZXQ8L2E+IGFzCit3ZWxsIGFzIHRoZSB3ZWIgYXBwbGljYXRpb24gZnJhbWV3b3JrLCA8YSBocmVmPSJodHRwOi8vamF2YS5hcGFjaGUub3JnL3R1cmJpbmUvIj5UdXJiaW5lPC9hPi4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+SmVzc2UgU3RvY2thbGw8L2I+PGJyIC8+CisgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkphbWVzIFRvZGQ8L2I+IChqd3RvZGQgYXQgcGFjYmVsbC5uZXQpCis8YnIgLz4KK0phbWVzIGhhcyBkZXZlbG9wZWQgcmVhbCB0aW1lIGN1c3RvbWVyIG9yaWVudGVkIGFwcHMgZm9yIHJvdWdobHkgMTAKK3llYXJzIHRoZSBsYXN0IDUgb2Ygd2hpY2ggaGF2ZSBwcmVkb21pbmF0ZWx5IGJlZW4gZnVsbHkgaW50ZWdyYXRlZCwKK2Zyb250IGFuZCBiYWNrLCBleHRyYU5ldCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggaGF2ZSBiZWVuIGJhc2VkIG9uCitBcGFjaGUsIEphdmEgYW5kIFRjbC4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+QW5pbCBWaWplbmRyYW48L2I+IChha3YgYXQgZW5nLnN1bi5jb20pCis8YnIgLz4KK0FuaWwgVmlqZW5kcmFuIGlzIHRoZSBwcmluY2lwYWwgZGV2ZWxvcGVyIG9mIHRoZSBKU1AgZW5naW5lIGluCitUb21jYXQuIEhlJ3MgZG9uZSBzb21lIHByZXR0eSBzY2FyeSB0aGluZ3MgaW4gaGlzIHBhc3QgbGlmZSAtLQoraW1wbGVtZW50aW5nIHRoZSBDT1JCQSBJREwgdG8gQysrIDIuMCBtYXBwaW5nLCBza3lkaXZpbmcsIElETCB0byBKYXZhCitjb21waWxlcnMsIE9iamVjdCBEYXRhYmFzZXMgKFNJR1NFViwgeW91IGRhIG1hbiEpIGZvciBDKyssIEphdmEgT1JCCithbmQgRUpCIHJ1bnRpbWUgZW52aXJvbm1lbnRzIC0tIGluIHRoYXQgb3JkZXIuCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJMb2dvIj48L2E+CisgICAgICBMb2dvCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudCdzIGxvZ28gaXMgdGhlIHJlc3VsdCBvZiBhIGxvZ28gY29udGVzdCwgaXQgaGFzIGJlZW4KKyAgICAgICAgZGVzaWduZWQgYnk8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPk5pY2sgS2luZzwvYj4KKzxiciAvPgorPC9wPgorICAgICAgICAgICAgICAgIAorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IS0tCisgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoIiAtICIrIkxhc3QgUHVibGlzaGVkOiAiICsgZG9jdW1lbnQubGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgLy8gIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvcD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL2V4dGVybmFsLmh0bWwgYi90cnVuay9kb2NzL2V4dGVybmFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViZTIwMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvZXh0ZXJuYWwuaHRtbApAQCAtMCwwICsxLDczMjIgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIEV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAgICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iU3RlZmFuIEJvZGV3aWciPgorICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0iYm9kZXdpZ0BhcGFjaGUub3JnIj4KKyAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+SG9tZTwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4vcHJvamVjdHMvaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+UHJvamVjdHM8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BcGFjaGUgQW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xpY2Vuc2UuaHRtbCI+TGljZW5zZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2FudG5ld3MuaHRtbCI+TmV3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VsIj5FeHRlcm5hbCBUb29scyBhbmQgVGFza3M8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcmVzb3VyY2VzLmh0bWwiPlJlc291cmNlczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2ZhcS5odG1sIj5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2FudC9Gcm9udFBhZ2UiPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9wcm9ibGVtcy5odG1sIj5IYXZpbmcgUHJvYmxlbXM/PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG93bmxvYWQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL3NyY2Rvd25sb2FkLmNnaSI+U291cmNlIERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Db250cmlidXRpbmcKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYWlsLmh0bWwiPk1haWxpbmcgTGlzdHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9zdm4uaHRtbCI+U3VidmVyc2lvbiBSZXBvc2l0b3JpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9uaWdodGxpZXMuaHRtbCI+TmlnaHRseSBCdWlsZHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9idWdzLmh0bWwiPkJ1ZyBEYXRhYmFzZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlNwb25zb3JzaGlwCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIj5UaGFua3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCI+U3BvbnNvcnNoaXA8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vY29udHJpYnV0aW5nLmh0bWwiPkRvbmF0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlByb2plY3QgTWFuYWdlbWVudAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2NvbnRyaWJ1dG9ycy5odG1sIj5Db250cmlidXRvcnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9taXNzaW9uLmh0bWwiPkFwYWNoZSBBbnQgTWlzc2lvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J5bGF3cy5odG1sIj5Qcm9qZWN0IEJ5bGF3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xlZ2FsLmh0bWwiPkxlZ2FsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxjZW50ZXI+CisgICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9hZHMvYnV0dG9uYmFyLmh0bWwiIC0tPgorICAgIDwvY2VudGVyPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiBsZWZ0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvbWVudS1sZWZ0LmdpZiI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvbWVudS1yaWdodC5naWYiPgorICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImxpZ2h0Ymx1ZWJhciI+Jm5ic3A7PC9kaXY+CisgIDxkaXYgY2xhc3M9Im1haW4iPgorICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKyAgICA8aDEgY2xhc3M9InRpdGxlIj5FeHRlcm5hbCBUb29scyBhbmQgVGFza3M8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrcyI+PC9hPgorICAgICAgRXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgcGFnZSBsaXN0cyBleHRlcm5hbCByZXNvdXJjZXMgZm9yIEFwYWNoZSBBbnQ6IDxhIGhyZWY9IiNUYXNrcyI+VGFza3M8L2E+LCA8YSBocmVmPSIjQ29tcGlsZXIlMjBJbXBsZW1lbnRhdGlvbnMiPkNvbXBpbGVyIEltcGxlbWVudGF0aW9uczwvYT4sCisgICAgICA8YSBocmVmPSIjSURFJTIwYW5kJTIwRWRpdG9yJTIwSW50ZWdyYXRpb24iPklERSBpbnRlZ3JhdGlvbgorICAgICAgdG9vbHM8L2E+LCA8YSBocmVmPSIjU291cmNlJTIwQ29udHJvbCUyMHlzdGVtcyI+U291cmNlIENvbnRyb2wKKyAgICAgIFN5c3RlbXM8L2E+LCBsb2dnZXJzLCB5b3UgbmFtZSBpdC4gSWYgeW91J3ZlIHdyaXR0ZW4KKyAgICAgIHNvbWV0aGluZyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCwgcGxlYXNlIHBvc3QgYWxsIHJlbGV2YW50CisgICAgICBpbmZvcm1hdGlvbiB0byBvbmUgb2YgdGhlIG1haWxpbmcgbGlzdHMuICBGb3IgZGV0YWlscywgc2VlIHRoZQorICAgICAgPGEgaHJlZj0iZmFxLmh0bWwjYWRkaW5nLWV4dGVybmFsLXRhc2tzIj5GQVE8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Tm90aGluZyBsaXN0ZWQgaGVyZSBpcyBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgdGhlIEFudAorICAgICAgZGV2ZWxvcGVycyAodGhlcmVmb3JlICc8aT5leHRlcm5hbDwvaT4gdG9vbHMgYW5kIHRhc2tzJyksCisgICAgICBpZiB5b3UgZW5jb3VudGVyIGFueSBwcm9ibGVtcyB3aXRoIHRoZW0sIHBsZWFzZSB1c2UKKyAgICAgIHRoZSBjb250YWN0IGluZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJUYXNrcyI+PC9hPgorICAgICAgVGFza3MKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQUpDIj48L2E+CisgICAgICAgIEFKQworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXNwZWN0ai8iPkFzcGVjdEo8L2E+IGlzIGFuCisgICAgICAgICAgYXNwZWN0LW9yaWVudGVkIGV4dGVuc2lvbiB0byBKYXZhLiAgVGhpcyB0YXNrIGNvbXBpbGVzIGEKKyAgICAgICAgICBzb3VyY2UgdHJlZSB1c2luZyB0aGUgQXNwZWN0SiBjb21waWxlciAtLSBBSkMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjMKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hc3BlY3RqLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hc3BlY3RqLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXNwZWN0ai8iPnByb2plY3QgbWFpbGluZyBsaXN0czwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFuYWtpYSI+PC9hPgorICAgICAgICBBbmFraWEKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BY3R1YWxseSwgQW5ha2lhIGlzIG1vcmUgdGhhbiBqdXN0IGFuIEFudCB0YXNrLCBpdCBpcyBhIGFuCisgICAgICAgIFhNTCB0cmFuc2Zvcm1hdGlvbiB0b29sIGJhc2VkIG9uIEpET00sIFZlbG9jaXR5IGFuZCBBbnQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjIgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvYW5ha2lhLmh0bWwiPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvYW5ha2lhLmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3NpdGUvbWFpbDIuaHRtbCI+VmVsb2NpdHkgbWFpbGluZyBsaXN0czwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFuZGFyaWVsIj48L2E+CisgICAgICAgIEFuZGFyaWVsCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW5kYXJpZWwgaXMgYSBzZXQgb2YgdGFza3MgZGVzaWduZWQgdG8gaGVscCB0aGUgZ2VuZXJhdGlvbiBvZiBIVE1MCisgICAgICAgIChhbmQgb3RoZXIgbWFya3VwIGxhbmd1YWdlcykgcGFnZXMgZnJvbSBBbnQuIEluY2x1ZGVzIGEgWFBhdGggcHJvY2Vzc29yLAorICAgICAgICBhbiBpbWFnZSBpbmZvcm1hdGlvbiByZXRyaWV2ZXIsIGFuZCBvdGhlcnMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUuNCBhbmQgbmV3ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FuZGFyaWVsLnV3b3Jrcy5uZXQvIj5odHRwOi8vYW5kYXJpZWwudXdvcmtzLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBqb3NlcCBET1QgcmlvIEFUIHV3b3JrcyBET1QgbmV0CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50MlN2ZyI+PC9hPgorICAgICAgICBBbnQyU3ZnCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50MlN2ZyBjcmVhdGVzIGEgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGFuIEFudCBidWlsZCBmaWxlLgorICAgICAgICBUaGUgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIGlzIGluIHRoZSBmb3JtIG9mIGEgU2NhbGFibGUgVmVjdG9yCisgICAgICAgIEdyYXBoaWNzIChTVkcpIGZpbGUgdGhhdCBjYW4gYmUgZGlzcGxheWVkIGluIGEgd2ViIGJyb3dzZXIuIFRoaXMKKyAgICAgICAgc2ltcGxpZmllZCBTVkcgZGVwaWN0aW9uIGhlbHBzIHRoZSBkZXZlbG9wZXIgdW5kZXJzdGFuZCBidWlsZCBmaWxlCisgICAgICAgIHN0cnVjdHVyZSBhbmQgaWRlbnRpZnkgZXh0cmFuZW91cyBvciBtaXNzaW5nIGRlcGVuZGVuY2llcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNi4xIGFuZCBoaWdoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5zcGlyaXRlZHN3LmNvbS9hbnQyc3ZnLyI+aHR0cDovL3d3dy5zcGlyaXRlZHN3LmNvbS9hbnQyc3ZnLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIGxvbmV5ICZsdDthdCZndDsgc3Bpcml0ZWRzdyAmbHQ7ZG90Jmd0OyBjb20KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iYW50NGVjbGlwc2UiPjwvYT4KKyAgICAgICAgYW50NGVjbGlwc2UKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5hbnQ0ZWNsaXBzZSBwcm92aWRlcyBhIHNldCBvZiBBbnQgdGFza3MgdG8gbWFrZSBzZXZlcmFsCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgRWNsaXBzZSBJREUgYXZhaWxhYmxlIGluIEFudAorICAgICAgICAgICAgICAgIGJ1aWxkc2NyaXB0cy4gVGhlIHRhc2tzIGFyZSBhaW1lZCB0byBhdm9pZCByZWR1bmRhbmN5IGJldHdlZW4KKyAgICAgICAgICAgICAgICBFY2xpcHNlIGFuZCBBbnQgY29uZmlndXJhdGlvbnMgaW4gb3JkZXIgdG8gYnVpbGQgc21hbGwgYnV0CisgICAgICAgICAgICAgICAgcG93ZXJmdWwgYnVpbGQgc3lzdGVtcyBmb3IgdGhlIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24KKyAgICAgICAgICAgICAgICBwcm9jZXNzPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYuMSBhbmQgaGlnaGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQ0ZWNsaXBzZS5zZi5uZXQiPmh0dHA6Ly9hbnQ0ZWNsaXBzZS5zZi5uZXQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L21haWwvP2dyb3VwX2lkPTEzNzM3NyI+CisgICAgICAgICAgICAgIGFudDRlY2xpcHNlIHVzZXIgbWFpbGluZyBsaXN0PC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTdW4gUHVibGljIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50Y291bnQiPjwvYT4KKyAgICAgICAgQW50Y291bnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnRjb3VudCBpcyBhIHNldCBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2F0aGVyIHN0YXRpc3RpY3MKKyAgICAgICAgICAgZnJvbSBmaWxlcyBvciByZXNvdXJjZXMuIEl0IGlzIG1haW5seSB1c2VkIGZvciBsb2cgZmlsZXMgYW5hbHlzaXMuCisgICAgICAgICAgIEl0IGFsbG93cyB0bzo8dWw+CisgICAgICAgICAgICAgPGxpPmNvdW50IGlucHV0cyAobGluZXMsIHN0cmluZ3MpPC9saT4KKyAgICAgICAgICAgICA8bGk+Y291bnQgb2NjdXJyZW5jZXMgb2YgZWFjaCBpbnB1dDwvbGk+CisgICAgICAgICAgICAgPGxpPmNhbGN1bGF0ZSBhdmVyYWdlLCBtYXggYW5kIG1pbiB2YWx1ZXMgb2YgZmxvYXRzIGluIGlucHV0PC9saT4KKyAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgQW50Y291bnQgYWxzbyBpbmNsdWRlcyBzb21lIHVzZWZ1bCBmaWx0ZXJzIHRvOjx1bD4KKyAgICAgICAgICAgICA8bGk+c3RvcCBmaWx0ZXJpbmc6IHJlYWQgZXZlcnl0aGluZyBidXQgd3JpdGUgbm90aGluZzwvbGk+CisgICAgICAgICAgICAgPGxpPmVjaG8gaW5wdXQgdG8gdGhlIGNvbnNvbGUgb3IgdG8gYSBmaWxlLiBUaGlzIGFsbG93cyB1c2VycyB0byBjcmVhdGUKKyAgICAgICAgICAgICAgICAgc2V2ZXJhbCBmaWxlcyBhdCBvbmNlPC9saT4KKyAgICAgICAgICAgICA8bGk+c3BsaXQgdGhlIHN0cmVhbSBpbiB0d28gZm9yIHBhcmFsbGVsIHByb2Nlc3Npbmc8L2xpPgorICAgICAgICAgICA8L3VsPgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNi4yIGFuZCBoaWdoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudGNvdW50LnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnRjb3VudC5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudGNvdW50LnNvdXJjZWZvcmdlLm5ldC9jb250YWN0cy5odG1sIj5QYXRyaWNrIE1hcnRpbjwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExHUEwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50RG9jIj48L2E+CisgICAgICAgIEFudERvYworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudERvYyBpcyBhIHRvb2wgdGhhdCBnZW5lcmF0ZXMgSFRNTCBkb2N1bWVudGF0aW9uIGZyb20gQW50CisgICAgICAgIGJ1aWxkZmlsZXM7IHRoZSBnZW5lcmF0ZWQgSFRNTCBpcyBpbnNwaXJlZCBmcm9tIHdoYXQgamF2YWRvYworICAgICAgICB5aWVsZHMuICBBbnREb2NHVUkgb2ZmZXJzIGEgc2ltcGxlIEFudCB0YXJnZXQgbGF1bmNoZXIgbmFtZWQKKyAgICAgICAgQW50RG9jIEdVSS4gQW50IHRhcmdldHMgbWF5IGJlIGxhdW5jaGVkIGZyb20gdGhlIGdlbmVyYXRlZAorICAgICAgICBBbnREb2MgSFRNTCBwYWdlcy4gSW50ZWdyYXRpb24gdG8gdmFyaW91cyBJREVzIGlzIGluCisgICAgICAgIHByb2dyZXNzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50RG9jIGNhbiBiZSBydW4gdmlhIGFuIEFudCB0YXNrLCBBbnREb2MgR1VJIGNhbiBiZSBydW4KKyAgICAgICAgdmlhIGFuIEFudCB0YXNrLCBvciB2aWEgYSBKVk0gbGF1bmNoLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40LjEgYW5kIGhpZ2hlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50ZG9jLmZyZWUuZnIvIj5odHRwOi8vYW50ZG9jLmZyZWUuZnIvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgRWRvdWFyZCBNZXJjaWVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50RG9jbGV0Ij48L2E+CisgICAgICAgIEFudERvY2xldAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudERvY2xldCBpcyBhIHRvb2wgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIG91dCBvZgorICAgICAgICB5b3VyIEFudCBUYXNrcycgc291cmNlIGNvZGUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5JdCBpcyBpbXBsZW1lbnRlZCBhcyBhIEphdmFkb2MgZG9jbGV0LCBhbmQgZ2VuZXJhdGVzIHJlZmVyZW5jZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBkZWxpdmVyYWJsZXMgZnJvbSB0aGUgc291cmNlIGNvZGUgb2YgeW91cgorICAgICAgICBjdXN0b20gQW50IFRhc2tzL1R5cGVzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS42KyAobm90IHRlc3RlZCBvbiBlYXJsaWVyIHZlcnNpb25zKQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50ZG9jbGV0Lm5ldXJvbmluZy5jb20vIj5odHRwOi8vYW50ZG9jbGV0Lm5ldXJvbmluZy5jb20vPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL25ldXJvbmluZy5jb20vIj5GZXJuYW5kbyBEb2JsYWRlejwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdQTAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRlYXRlciI+PC9hPgorICAgICAgICBBbnRlYXRlcgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudGVhdGVyIGlzIGEgc2V0IG9mIEFudCB0YXNrcyBmb3IgdGhlIGZ1bmN0aW9uYWwgdGVzdGluZyBvZiB3ZWJzaXRlcworICAgICAgICAgIGFuZCB3ZWIgc2VydmljZXMgKGZ1bmN0aW9uYWwgdGVzdGluZyBiZWluZzsgaGl0IGEgVVJMIGFuZCBlbnN1cmUgdGhlCisgICAgICAgICAgcmVzcG9uc2UgbWVldHMgY2VydGFpbiBjcml0ZXJpYSkuIENhbiB0ZXN0IEhUVFAgcGFyYW1zLCByZXNwb25zZQorICAgICAgICAgIGNvZGVzLCBYUGF0aCwgcmVnZXhwIGFuZCBSZWxheCBORyBleHByZXNzaW9ucy4gSW5jbHVkZXMgSFRNTCByZXBvcnRpbmcKKyAgICAgICAgICAoYmFzZWQgb24ganVuaXRyZXBvcnQpIGFuZCBhIGhpZXJhcmNoaWNhbCBncm91cGluZyBzeXN0ZW0gZm9yIHF1aWNrbHkKKyAgICAgICAgICBjb25maWd1cmluZyBsYXJnZSB0ZXN0IHNjcmlwdHMuCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41IGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYWZ0LnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hZnQuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vYWZ0LWRldmVsIj5kZXZlbG9wZXIKKyAgICAgICAgICAgICAgICBtYWlsaW5nIGxpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRGb3JtIj48L2E+CisgICAgICAgIEFudEZvcm0KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Qcm92aWRlcyBhIGphdmEvc3dpbmcgZm9ybS1iYXNlZCBpbnB1dCBzY2hlbWUgZm9yCisgICAgICAgIGNvbmZpZ3VyaW5nIGFudCBwcm9wZXJ0aWVzIGFuZCBsYXVuY2hpbmcgYW50IHRhcmdldHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYuMi4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudGZvcm1zLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnRmb3Jtcy5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnJlbmVfZ2hvc2hAeWFob28uY29tIj5SZW7pIEdob3NoPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50bWVyZ2UiPjwvYT4KKyAgICAgICAgQW50bWVyZ2UKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Qcm92aWRlcyBzaW1wbGUgaW5oZXJpdGFuY2UgYmV0d2VlbiBhbnQgZmlsZXM8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVGVzdGVkIHdpdGggMS41LiBTaG91bGQgd29yayB3aXRoIGFsbCB2ZXJzaW9ucy4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5ydXNzZXQub3JnLnVrL2FudG1lcmdlLmh0bWwiPmh0dHA6Ly93d3cucnVzc2V0Lm9yZy51ay9hbnRtZXJnZS5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmFudG1lcmdlQHJ1c3NldC5vcmcudWsiPlBoaWxsaXAgTG9yZDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRvbW9sb2d5Ij48L2E+CisgICAgICAgIEFudG9tb2xvZ3kKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnRvbW9sb2d5IGlzIGFuIGFuYWx5c2lzIHRvb2wgc3VpdGUgZm9yIEFudC4gSXQgaW5jbHVkZXM6PHVsPgorICAgICAgICAgIDxsaT48Yj5TdGF0aXN0aWNzTGlzdGVuZXI8L2I+IC0gYW4gQW50IEJ1aWxkTGlzdGVuZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZ2F0aGVyCisgICAgICAgICAgICAgIHN0YXRpc3RpY3Mgd2hpbGUgYW4gQW50IGJ1aWxkIGlzIGV4ZWN1dGVkLiBTdGF0aXN0aWNzIG9uIHRoZSB0YXJnZXRzCisgICAgICAgICAgICAgIGFuZCB0YXNrcyBleGVjdXRlZCBhcmUgd3JpdHRlbiB0byB0aGUgY29uc29sZSBhZnRlciB0aGUgYnVpbGQgY29tcGxldGVzLiA8L2xpPgorICAgICAgICA8L3VsPjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAgPGk+dW5rbm93bjwvaT4gCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnRvbW9sb2d5LmNvZGVoYXVzLm9yZyI+aHR0cDovL2FudG9tb2xvZ3kuY29kZWhhdXMub3JnPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3hpcmNsZXMuY29kZWhhdXMub3JnL3Byb2plY3RzL2FudG9tb2xvZ3kvbGlzdHMiPmNvbnRhY3QgcGFnZTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBMaWNlbnNlIFYyLjAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50UHJldHR5QnVpbGQiPjwvYT4KKyAgICAgICAgQW50UHJldHR5QnVpbGQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICBBbnQgUHJldHR5IEJ1aWxkIGlzIGEgdG9vbCB0byBlYXNpbHkgc2hvdyBhbmQgcnVuIEFudCBidWlsZGZpbGVzIGRpcmVjdGx5IGZyb20KKyAgICAgICAgd2l0aGluIGEgYnJvd3NlciB3aW5kb3cuIEl0IGNvbnNpc3RzIG9mIGEgc2luZ2xlIFhTTCBmaWxlIHRoYXQgd2lsbCBnZW5lcmF0ZSwKKyAgICAgICAgb24gdGhlIGZseSwgaW4gdGhlIGJyb3dzZXIsIGZyb20gdGhlIC54bWwgYnVpbGRmaWxlLCBhIHByZXR0eSBpbnRlcmZhY2Ugc2hvd2luZworICAgICAgICBwcm9qZWN0IG5hbWUsIGRlc2NyaXB0aW9uLCBwcm9wZXJ0aWVzIGFuZCB0YXJnZXRzLCBldGMuIHNvcnRlZCBvciB1bnNvcnRlZCwKKyAgICAgICAgICBhbGxvd2luZyB0byBsb2FkL21vZGlmeS9hZGQgcHJvcGVydGllcywgcnVuIHRoZSB3aG9sZSBwcm9qZWN0LCBvciBydW4gc2VsZWN0ZWQKKyAgICAgICAgc2V0IG9mIHRhcmdldHMgaW4gYSBzcGVjaWZpYyBvcmRlciwgd2l0aCB0aGUgYWJpbGl0eSB0byBtb2RpZnkgbG9nZ2VyL2xvZ2ZpbGUsCisgICAgICAgIG1vZGUgYW5kIGFkZCBtb3JlIGxpYnMgb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFsbCBBbnQgdmVyc2lvbnMKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudHByZXR0eWJ1aWxkLnNvdXJjZWZvcmdlLm5ldC8iPkFudCBQcmV0dHkgQnVpbGQgSG9tZXBhZ2U8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50cHJldHR5YnVpbGQuc291cmNlZm9yZ2UubmV0Ij5DaGFyYmVsIEJJVEFSPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIExpY2Vuc2UgVjIuMAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRTcGFjZXMiPjwvYT4KKyAgICAgICAgQW50U3BhY2VzCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50U3BhY2VzIHByb3ZpZGVzIEFudCBpbnRlZ3JhdGlvbiB3aXRoIEphdmFTcGFjZXMuIFRoaXMKKyAgICAgICAgYWxsb3dzIHlvdSB0byBjb29yZGluYXRlIEFudCB0YXNrcyB2aWEgSmF2YVNwYWNlcywgcHVsbCBvdXQKKyAgICAgICAgd29yayB1bml0cyBmcm9tIGEgSmF2YVNwYWNlIGZvciBkaXN0cmlidXRlZCBBbnQgdGFza3MgdG8gd29yaworICAgICAgICBvbiwgYW5kIHNvIGZvcnRoLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41IGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vb3BzY29uc3VsdGFuY3kuY29tL3NvZnR3YXJlL2FudHNwYWNlcy8iPmh0dHA6Ly93d3cub29wc2NvbnN1bHRhbmN5LmNvbS9zb2Z0d2FyZS9hbnRzcGFjZXMvPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBhbnRzcGFjZXMgYXQgb29wc2NvbnN1bHRhbmN5LmNvbQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50VGltZXJUYXNrIj48L2E+CisgICAgICAgIEFudFRpbWVyVGFzaworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxhIGhyZWY9Imh0dHA6Ly93d3cuamVja2xlLmRlL2ZyZWVTdHVmZi9BbnRUaW1lclRhc2svaW5kZXguaHRtbCI+VGltZXI8L2E+CisgICAgICAgIGlzIHRhc2sgZm9yIG1lYXN1cmluZyB0aGUgdGltZSBlbGFwc2VkIHRvIGNvbXBsZXRlIG90aGVyCisgICAgICAgIHRhc2tzPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamVja2xlLmRlL2ZyZWVTdHVmZi9BbnRUaW1lclRhc2svaW5kZXguaHRtbCI+aHR0cDovL3d3dy5qZWNrbGUuZGUvZnJlZVN0dWZmL0FudFRpbWVyVGFzay9pbmRleC5odG1sPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bWFyaW9AamVja2xlLmRlIj5tYXJpb0BqZWNrbGUuZGU8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMZXNzZXIgR05VIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFudCBXZWIgU3RhcnQgVGFzayI+PC9hPgorICAgICAgICBBbnQgV2ViIFN0YXJ0IFRhc2sKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnQgV2ViIFN0YXJ0IFRhc2sgaXMgYW4gQW50IHRhc2sgYWxsb3dpbmcgZGV2ZWxvcGVycyB0bworICAgICAgICBwYWNrYWdlIGEgZGVza3RvcCBhcHBsaWNhdGlvbiBhcyBhIFdBUiAoV2ViIEFwcGxpY2F0aW9uCisgICAgICAgIEFyY2hpdmUpIHRvIGJlIGRpc3RyaWJ1dGVkIG92ZXIgdGhlIG5ldCB2aWEgSmF2YSBXZWIgU3RhcnQ8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNSBhbmQgYWJvdmUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC1qbmxwLXdhci5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vYW50LWpubHAtd2FyLnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50WHRyYXMiPjwvYT4KKyAgICAgICAgQW50WHRyYXMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BIGNvbGxlY3Rpb24gb2YgcG93ZXJmdWwgQW50IGV4dGVuc2lvbnMgY29tcG9uZW50cworICAgICAgICBvcmdhbml6ZWQgaW50byBmaXZlIGNhdGVnb3JpZXM6IGZpeHR1cmUtY29udHJvbCwKKyAgICAgICAgZXhlY3V0aW9uLXJ1bGVzLCBmbG93LWNvbnRyb2wsIGZlZWRiYWNrLCBhbmQgaGVscGVycy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNi41CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnR4dHJhcy5zb3VyY2Vmb3JnZS5uZXQvIj5BbnRYdHJhcyBIb21lPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudHh0cmFzLnNvdXJjZWZvcmdlLm5ldCI+U1NNQzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCAyLjEpCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkJ1aWxkIE51bWJlciI+PC9hPgorICAgICAgICBCdWlsZCBOdW1iZXIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4gQnVpbGQgTnVtYmVyIGlzIGEgdG9vbCB0byB0cmFjayBzb2Z0d2FyZSBhcnRpZmFjdHMgc3VjaCBhcyBmaWxlcyBhbmQgYXV0b21hdGljYWxseSBhc3NpZ24KKyAgICAgICAgcHJvcGVyIHZlcnNpb24vYnVpbGQgbnVtYmVycyB0byB0aGVtLiBJdCBlbnN1cmVzIHRoYXQgdHdvIGRpZmZlcmVudCBhcnRpZmFjdHMgd2lsbCBoYXZlIGRpZmZlcmVudAorICAgICAgICB2ZXJzaW9uL2J1aWxkIG51bWJlcnMsIGJ1dCBpZGVudGljYWwgYXJ0aWZhY3RzL2J1aWxkcyB3aWxsIGJlIGFzc2lnbmVkIHRoZSBzYW1lIG51bWJlci4gSXQgZG9lc24ndAorICAgICAgICB0YWtlIHZlcnNpb24gbWFuYWdlbWVudCBhd2F5IGZyb20geW91IGFuZCBkb2Vzbid0IHJlcGxhY2UgeW91ciBidWlsZCBwcm9jZXNzLCBidXQgcmF0aGVyIHBsdWdzCisgICAgICAgIGludG8gdGhlIHByb2Nlc3MgYW5kIGludHJvZHVjZXMgdmVyc2lvbi9idWlsZCBudW1iZXIgZ292ZXJuYW5jZSBieSBkZWZpbmluZyB3aG8gaXMgaW4gY2hhcmdlIG9mCisgICAgICAgIHdoaWNoIHBhcnQgb2YgdmVyc2lvbiBudW1iZXIuIFdpdGggQnVpbGQgTnVtYmVyIHlvdSBhcmUgc3RpbGwgaW4gY2hhcmdlIG9mIHRoZSBoZWFkIG9mIHRoZSB2ZXJzaW9uCisgICAgICAgIG51bWJlci4gRS5nLiB5b3UgbWF5IGRlY2lkZSB0byBoYXZlIDQgbnVtYmVycyBpbiB5b3VyIHZlcnNpb24gKG1ham9yLCBtaW5vciwgaW50ZXJmYWNlLCBpbXBsZW1lbnRhdGlvbikKKyAgICAgICAgYW5kIHlvdSB3YW50IHRvIG1hbmFnZSB0aGUgdHdvIGZpcnN0IG51bWJlcnMgKG1ham9yIGFuZCBtaW5vcikuIEJ1aWxkIE51bWJlciB3aWxsIHRha2UgY2FyZSBvZiB0aGUKKyAgICAgICAgdGVkaXVtIG9mIG1hbmFnaW5nIHRoZSBsYXN0IHR3byBudW1iZXJzIChpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uKS4gPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFRlc3RlZCB3aXRoIEFudCAxLjUuNCBhbmQgMS42LjUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5oYW1tdXJhcGkuYml6L3Byb2R1Y3RzL2J1aWxkbnVtYmVyIj5odHRwOi8vd3d3LmhhbW11cmFwaS5iaXovcHJvZHVjdHMvYnVpbGRudW1iZXI8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmhhbW11cmFwaS5iaXovaGFtbXVyYXBpLWJpei9lZi94bWVudS9jb250YWN0Lmh0bWwiPlByb2plY3QgQ29udGFjdCBQYWdlPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tbWVyY2lhbAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJDaGVja3N0eWxlIj48L2E+CisgICAgICAgIENoZWNrc3R5bGUKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5DaGVja3N0eWxlIGlzIGEgZGV2ZWxvcG1lbnQgdG9vbCB0byBoZWxwIHByb2dyYW1tZXJzIHdyaXRlCisgICAgICAgIEphdmEgY29kZSB0aGF0IGFkaGVyZXMgdG8gYSBjb2Rpbmcgc3RhbmRhcmQuIEl0cyBwdXJwb3NlIGlzIHRvCisgICAgICAgIGF1dG9tYXRlIHRoZSBwcm9jZXNzIG9mIGNoZWNraW5nIEphdmEgY29kZSwgYW5kIHRvIHNwYXJlCisgICAgICAgIGh1bWFucyBvZiB0aGlzIGJvcmluZyAoYnV0IGltcG9ydGFudCkgdGFzay48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNoZWNrc3R5bGUgY2FuIGJlIHJ1biB2aWEgYW4gQW50IHRhc2sgb3IgYSBjb21tYW5kIGxpbmUKKyAgICAgICAgdXRpbGl0eS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNC4xIGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY2hlY2tzdHlsZS5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vY2hlY2tzdHlsZS5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmNoZWNrc3R5bGVAcHVwcHljcmF3bC5jb20iPk9saXZlciBCdXJuPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgU3RhcnRpbmcgd2l0aCByZWxlYXNlIDIuMCB0aGUgbGljZW5zZSBpcyB0aGUgR05VCisgICAgICAgICAgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFByaW9yIHJlbGVhc2VzIHdlcmUgdW5kZXIKKyAgICAgICAgICAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQ2hvd25UYXNrIj48L2E+CisgICAgICAgIENob3duVGFzaworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNob3duVGFzayBpcyBhbiBBbnQgdGFzayB0byBjaGFuZ2Ugb3duZXJzaGlwIG9mIGZpbGVzIG9uCisgICAgICAgIFVuaXguPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjMgYW5kIHVwCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Nob3dudGFzay8iPmh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY2hvd250YXNrLzwvYT4KKyAgICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmNob3dudGFzay11c2Vyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiPldpbGZyZWQgU3ByaW5nZXI8L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkNsZWFuSW1wb3J0cyI+PC9hPgorICAgICAgICBDbGVhbkltcG9ydHMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5SZW1vdmVzIHVubmVlZGVkIGltcG9ydHMuIEZvcm1hdHMgeW91ciBpbXBvcnQKKyAgICAgICAgc2VjdGlvbnMuIEZsYWdzIGFtYmlndW91cyBpbXBvcnRzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS4zIGFuZCB1cAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmNsZWFuaW1wb3J0cy50b21icnVzLm5sIj5odHRwOi8vd3d3LmNsZWFuaW1wb3J0cy50b21icnVzLm5sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmNsZWFuaW1wb3J0c0B0b21icnVzLm5sIj5Ub20gQnJ1czwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkNsb3ZlciI+PC9hPgorICAgICAgICBDbG92ZXIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5DbG92ZXIgaXMgYW4gQW50LWJhc2VkIENvZGUgQ292ZXJhZ2UgdG9vbC4gSXQgY2FuIGJlIHVzZWQKKyAgICAgICAgc2VhbWxlc3NseSB3aXRoIEFudC1iYXNlZCBwcm9qZWN0cy4gSXQgcHJvdmlkZXMgbWV0aG9kLAorICAgICAgICBzdGF0ZW1lbnQsIGFuZCBicmFuY2ggY292ZXJhZ2UgYW5hbHlzaXMsIGFuZCBoYXMgcmljaAorICAgICAgICByZXBvcnRpbmcgaW4gWE1MLCBIVE1MIG9yIHZpYSBhIFN3aW5nIEdVSS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNC4xIG9yIGdyZWF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5jZW5xdWEuY29tL2Nsb3Zlci8iPmh0dHA6Ly93d3cuY2VucXVhLmNvbS9jbG92ZXIvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmNsb3Zlci1zdXBwb3J0QGNlbnF1YS5jb20iPmNsb3Zlci1zdXBwb3J0QGNlbnF1YS5jb208L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21tZXJjaWFsLCBmcmVlIGxpY2Vuc2VzIGF2YWlsYWJsZSBmb3Igb3BlbiBzb3VyY2UKKyAgICAgICAgICAgIHByb2plY3RzLgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJDTVNEZXBsb3kiPjwvYT4KKyAgICAgICAgQ01TRGVwbG95CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGEgaHJlZj0iaHR0cDovL2Ntc2RlcGxveS5zb3VyY2Vmb3JnZS5uZXQiPkNNU0RlcGxveTwvYT4gaXMKKyAgICAgICAgYW4gQXBhY2hlIEFudCBUYXNrIHRvIHN1Ym1pdCBmaWxlcyBhbmQgdGVtcGxhdGVzIHRvIFZpZ25ldHRlCisgICAgICAgIENNUy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNS4xIGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY21zZGVwbG95LnNvdXJjZWZvcmdlLm5ldCI+aHR0cDovL2Ntc2RlcGxveS5zb3VyY2Vmb3JnZS5uZXQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bWFzb2dhdG9AdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5tYXNvZ2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQ29jb29uIFRhc2siPjwvYT4KKyAgICAgICAgQ29jb29uIFRhc2sKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIHRhc2sgYWxsb3dzIHRoZSBnZW5lcmF0aW9uIG9mIHN0YXRpYyB3ZWIgcGFnZXMgYW5kCisgICAgICAgIHNpdGVzIHVzaW5nIEFwYWNoZSBDb2Nvb24gaW4gb2ZmLWxpbmUgbW9kZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkl0IGFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ29jb29uIHRvIGJlCisgICAgICAgIGluY2x1ZGVkIHdpdGhpbiB0aGUgQW50IGJ1aWxkIGZpbGUsIGFuZCBpcyB0aHVzCisgICAgICAgIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgQW50IHByb3BlcnRpZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgdGFzayBzaGFyZXMgaXRzIGNvZGUgd2l0aCB0aGUgQ29jb29uIENvbW1hbmQgTGluZSwgd2hpY2gKKyAgICAgICAgbWVhbnMgdGhhdCB0aGlzIHRhc2sgd2lsbCBpbnN0YW50bHkgdGFrZQorICAgICAgICBhZHZhbnRhZ2Ugb2YgYW55IG5ldyBmdW5jdGlvbmFsaXR5IGFkZGVkIHRoZXJlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41LjMgYW5kIGFib3ZlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jb2Nvb24uYXBhY2hlLm9yZy8yLjEvIj5odHRwOi8vY29jb29uLmFwYWNoZS5vcmcvMi4xLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBEb2N1bWVudGF0aW9uOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jb2Nvb24uYXBhY2hlLm9yZy8yLjEvdXNlcmRvY3Mvb2ZmaWxpbmUvYW50Lmh0bWwiPmh0dHA6Ly9jb2Nvb24uYXBhY2hlLm9yZy8yLjEvdXNlcmRvY3Mvb2ZmbGluZS9hbnQuaHRtbDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzp1c2Vycy5hdC5jb2Nvb24uYXBhY2hlLm9yZyI+dXNlcnMgYXQgY29jb29uLmFwYWNoZS5vcmc8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJDb25maWd1cmUiPjwvYT4KKyAgICAgICAgQ29uZmlndXJlCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UmVjdXJzaXZlIGJ1aWxkIHN1cHBvcnQgKGNhbGwgYW50IG9uIGV2ZXJ5IHBhY2thZ2UgbGV2ZWwsCisgICAgICAgIGFuZCBvbmx5IGJ1aWxkIGZpbGVzIGluIHRoYXQgcGFja2FnZSBvciBpbiB0aGF0IHBhY2thZ2UgYW5kCisgICAgICAgIGV2ZXJ5dGhpbmcgYmVsb3cpIHdpdGggc2VwZXJhdGlvbiBvZiBzb3VyY2UgYW5kIG91dHB1dC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSB0YXNrIGdlbmVyYXRlcyBidWlsZCBmaWxlcyBpbiBhbnkgc3ViZGlyZWN0b3J5IChleGNlcHQKKyAgICAgICAgZm9yIENWUy1kaXJlY3RvcmllcykgZm9yIHlvdS4gT25seSBwbGFjZSBvbmUgYnVpbGQueG1sIGZpbGUgaW4KKyAgICAgICAgdGhlIHRvcCBhbmQgY2FsbCB0YXJnZXQgJ3NldHVwJyBvcgorICAgICAgICAncmVzY2FuJy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuMiBhbmQgMS4zCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZHNkZWxmdC5ubC9+bGVtdmFsL2FudC8iPmh0dHA6Ly93d3cuZHNkZWxmdC5ubC9+bGVtdmFsL2FudC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bGVtdmFsQGRzZGVsZnQubmwiPk0uSi5QLiB2YW4gTGVldXdlbjwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2UgZGVyaXZlZCBmcm9tIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkNWU0dyYWIiPjwvYT4KKyAgICAgICAgQ1ZTR3JhYgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgbGl0dGxlIENWUyBjbGllbnQgdGhhdCBjYW4gYmUgdXNlZnVsIHdoZW4gcGVvcGxlIGFyZQorICAgICAgICBiZWhpbmQgY29ycG9yYXRlIGZpcmV3YWxsIHRoYXQgYmxvY2tzIGFueSBjdnMKKyAgICAgICAgY29tbXVuaWNhdGlvbnMuIEl0IHVzZXMgdGhlIFZpZXdDVlMgd2ViIGludGVyZmFjZSB0byBhY2Nlc3MKKyAgICAgICAgdGhlIENWUyByZXBvc2l0b3J5IHZpYSBzdGFuZGFyZCBodHRwLCBhbmQgZG93bmxvYWRzIGFsbCB0aGUKKyAgICAgICAgZmlsZXMgcHJlc2VudCBpbiBpdC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkl0IHdvcmtzIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciBhcyBhbiBBbnQgdGFzay48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuMyBvciBoaWdoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2N2c2dyYWIuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2N2c2dyYWIuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpjdnNncmFiLXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCI+Q1ZTR3JhYgorICAgICAgICAgICAgdXNlciBtYWlsaW5nIGxpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMR1BMCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkRlcGVuZGVuY2llcyI+PC9hPgorICAgICAgICBEZXBlbmRlbmNpZXMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgZGVwZW5kZW5jaWVzIHRhc2sgbWFuYWdlcyBhIHNldCBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMgd2hpY2gKKyAgICAgICAgICAgIG1heSBiZSBkb3dubG9hZGVkIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSwKKyAgICAgICAgICAgICBzdWNoIGFzIGliaWJsaW8ub3JnLiBVc2VzIGEgbG9jYWwgY2FjaGUgdG8gYXZvaWQgcmVwZWF0ZWQKKyAgICAgICAgICAgIGRvd25sb2Fkcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVGVzdGVkIHdpdGggMS41LjEsIHNob3VsZCB3b3JrIHdpdGggMS40Ky4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5odHRwdW5pdC5vcmcvZG9jL2RlcGVuZGVuY2llcy5odG1sIj5odHRwOi8vd3d3Lmh0dHB1bml0Lm9yZy9kb2MvZGVwZW5kZW5jaWVzLmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86cnVzc2dvbGRAaHR0cHVuaXQub3JnIj5SdXNzZWxsIEdvbGQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBNSVQgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJEZXBlbmRlbmN5IEZpbmRlciI+PC9hPgorICAgICAgICBEZXBlbmRlbmN5IEZpbmRlcgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkRlcGVuZGVuY3kgRmluZGVyIGV4dHJhY3RzIGRlcGVuZGVuY2llcyBhbmQgT08gbWV0cmljcyBmcm9tCisgICAgICAgIEphdmEgY2xhc3MgZmlsZXMgcHJvZHVjZWQgYnkgbW9zdCBKYXZhIGNvbXBpbGVycy4gSXQgY2FuIGNvbXB1dGUKKyAgICAgICAgQVBJIGRpZmZlcmVuY2VzIGJldHdlZW4gdmVyc2lvbnM7ICBubyBzb3VyY2VzIG5lZWRlZC4gSXQgaW5jbHVkZXMKKyAgICAgICAgQW50IHRhc2tzLCB3ZWIsIFN3aW5nLCBhbmQgY29tbWFuZC1saW5lIGludGVyZmFjZXMsIHdpdGggWFNMCisgICAgICAgIHN0eWxlc2hlZXRzIGZvciBmb3JtYXR0aW5nIG91dHB1dC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPllvdSBjYW4gdXNlIGl0IHRvIGV4dHJhY3QgZGVwZW5kZW5jaWVzIGJldHdlZW4gcGFja2FnZXMsIGNsYXNzZXMsCisgICAgICAgIG9yIGV2ZW4gbWV0aG9kcywgb3IgYW55IGNvbWJpbmF0aW9uIHRoZXJlb2YuICBZb3UgY2FuIHVzZSBQZXJsCisgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZmlsdGVyIHRoZSBpbmZvcm1hdGlvbiBhbmQgcGlucG9pbnQgb25seQorICAgICAgICB3aGF0IHlvdSBuZWVkLiAgVGhlcmUgaXMgZXZlbiBhIFdlYiBBcHBsaWNhdGlvbiB2ZXJzaW9uIChXQVIgZmlsZSkKKyAgICAgICAgc28gYSB3aG9sZSBncm91cCBvZiBkZXZlbG9wZXJzIGNhbiBzaGFyZSBhIGNvbW1vbiB2aWV3LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBUZXN0ZWQgd2l0aCAxLjUuMywgc2hvdWxkIHdvcmsgd2l0aCAxLjQrLgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGVwZmluZC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vZGVwZmluZC5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmplYW50ZXNzaWVyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCI+SmVhbiBUZXNzaWVyPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQlNELWxpa2UgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJEb3h5Z2VuIHRhc2siPjwvYT4KKyAgICAgICAgRG94eWdlbiB0YXNrCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlcmUgYXJlIHR3byBBbnQgdGFza3MgZm9yIHJ1bm5pbmcgdGhlIERveHlnZW4KKyAgICAgICAgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjEgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmd3Lm9yZy9wcm9qZWN0cy9qYXZhL2FudC8iPmh0dHA6Ly93d3cuYmd3Lm9yZy9wcm9qZWN0cy9qYXZhL2FudC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bW9ydGlzQHZvaWNlbmV0LmNvbSI+S3lsZSBSLiBCdXJ0b248L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5hbmQ8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNSBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC1kb3h5Z2VuLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnQtZG94eWdlbi5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmFra3VtYXJAdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5LYXJ0aGlrIEEgS3VtYXI8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkRURERvYyI+PC9hPgorICAgICAgICBEVEREb2MKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5EVEREb2MgaXMgaGVyZSB0byBoZWxwIHlvdSB0byBkb2N1bWVudCB5b3VyIERURCdzIGVmZmljaWVudGx5LiBJdCBpcyBhCisgICAgICAgIHN0cmFpZ2h0Zm9yd2FyZCBleHRlbnNpb24gb2YgdGhlIGphdmFkb2MgY29uY2VwdCB0byB0aGUgRFREIGZpbGUgZm9ybWF0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40IGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZHRkZG9jLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9kdGRkb2Muc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvbWFpbC8/Z3JvdXBfaWQ9NTM3MDQiPlByb2plY3QgTWFpbGluZyBMaXN0PC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgWDExIChPcGVuIFNvdXJjZSkKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iRW52R2VuIj48L2E+CisgICAgICAgIEVudkdlbgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmFzaWx2LmNvbS9wc2Qvc29mdHdhcmUiPkVudkdlbjwvYT4gaXMgYW4gQW50IHRhc2sgZm9yIGdlbmVyYXRpbmcgCisgICAgICAgICAgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIGZpbGUgcGFyYW1ldGVyaXplZCBmb3IgZGlmZmVyZW50IGVudmlyb25tZW50cyAoaS5lLiAKKyAgICAgICAgICBkZXZlbG9wbWVudCwgdGVzdCwgYW5kIHByb2R1Y3Rpb24pLiBGaWxlIGdlbmVyYXRpb24gaXMgZG9uZSB1c2luZyAKKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZnJlZW1hcmtlci5vcmcvIj5GcmVlTWFya2VyPC9hPiwgYSB0ZW1wbGF0ZSBlbmdpbmUgd2l0aCBhIGZ1bGwtZmVhdHVyZWQgCisgICAgICAgICAgdGVtcGxhdGluZyBsYW5ndWFnZS4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYuNSBvciBoaWdoZXIgKG5vdCB0ZXN0ZWQgb24gZWFybGllciB2ZXJzaW9ucykKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5iYXNpbHYuY29tL3BzZC9zb2Z0d2FyZSI+aHR0cDovL3d3dy5iYXNpbHYuY29tL3NvZnR3YXJlPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5iYXNpbHYuY29tL3BzZC9zb2Z0d2FyZS9mZWVkYmFjayI+RW52R2VuIEZlZWRiYWNrIFBhZ2U8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHUEwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iRU1NQSI+PC9hPgorICAgICAgICBFTU1BCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+RU1NQSBpcyBhbiBvcGVuLXNvdXJjZSB0b29sa2l0IGZvciBtZWFzdXJpbmcgYW5kIHJlcG9ydGluZworICAgICAgICBKYXZhIGNvZGUgY292ZXJhZ2UuIEVNTUEgZGlzdGluZ3Vpc2hlcyBpdHNlbGYgZnJvbSBvdGhlciB0b29scworICAgICAgICBieSBnb2luZyBhZnRlciBhIHVuaXF1ZSBmZWF0dXJlIGNvbWJpbmF0aW9uOiBzdXBwb3J0IGxhcmdlLXNjYWxlCisgICAgICAgIGVudGVycHJpc2Ugc29mdHdhcmUgZGV2ZWxvcG1lbnQgd2hpbGUga2VlcGluZyBpbmRpdmlkdWFsIGRldmVsb3BlcnMKKyAgICAgICAgd29yayBmYXN0IGFuZCBpdGVyYXRpdmUgYXQgdGhlIHNhbWUgdGltZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNCBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2VtbWEuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2VtbWEuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzplbW1hLXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCI+TWFpbGluZ2xpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21tb24gUHVibGljIExpY2Vuc2UgMS4wCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkZNUFAiPjwvYT4KKyAgICAgICAgRk1QUAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkZNUFAgaXMgYSBnZW5lcmFsLXB1cnBvc2UgdGV4dCBmaWxlIHByZXByb2Nlc3NvciB0b29sIHRoYXQKKyAgICAgICAgdXNlcyBGcmVlTWFya2VyIHRlbXBsYXRlcy4gSXQgaXMgcGFydGljdWxhcmx5IGRlc2lnbmVkIGZvcgorICAgICAgICBIVE1MIHByZXByb2Nlc3NvciwgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIGNvbXBsZXRlIChzdGF0aWMpCisgICAgICAgIGhvbWVwYWdlczogZGlyZWN0b3J5IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIEhUTUwtcywgaW1hZ2UKKyAgICAgICAgZmlsZXMsIGV0Yy4gQnV0IG9mIGNvdXJzZSBpdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBzb3VyY2UKKyAgICAgICAgY29kZSBvciB3aGF0ZXZlciB0ZXh0IGZpbGVzLiBGTVBQIGlzIGV4dGVuZGFibGUgd2l0aCBKYXZhCisgICAgICAgIGNsYXNzZXMgdG8gcHVsbCBkYXRhIGZyb20gYW55IGRhdGEgc291cmNlcyAoWE1MIGZpbGUsCisgICAgICAgIGRhdGFiYXNlLCBldGMuKSBhbmQgZW1iZWQgdGhlIGRhdGEgaW50byB0aGUgZ2VuZXJhdGVkCisgICAgICAgIGZpbGVzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41LjEKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2ZtcHAuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2ZtcHAuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEJTRCBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkdlbkphciI+PC9hPgorICAgICAgICBHZW5KYXIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5CdWlsZHMgYSBKQVIgZmlsZSBiYXNlZCBvbiBjbGFzcyBkZXBlbmRlbmNpZXMgcmF0aGVyIHRoYW4gc2ltcGx5IHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeTwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40IGFscGhhIChidWlsdCBhZnRlciAyMDAxLzA4LzA0KSBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2dlbmphci5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vZ2VuamFyLnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86amVzc2VfZGV2QHlhaG9vLmNvbSI+SmVzc2UgU3RvY2thbGw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkdyYW5kIj48L2E+CisgICAgICAgIEdyYW5kCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+R3JhbmQgaXMgYSBzZXQgb2YgdG9vbHMgdG8gY3JlYXRlIGEgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIEFudCB0YXJnZXQKKyAgICAgICAgICBkZXBlbmRlbmNpZXMuIEl0IHdvcmtzIGJ5IHRha2luZyBhbiBBbnQgYnVpbGQgZmlsZSBhbmQgY3JlYXRpbmcgYSAiZG90IiBmaWxlLiBJdAorICAgICAgICAgIGRpZmZlcnMgZnJvbSB0aGUgZXhpc3RpbmcgdG9vbHMgYnkgcmVseWluZyBvbiB0aGUgQW50IEFQSSByYXRoZXIgdGhhbiBYTUwgcGFyc2luZyB0bworICAgICAgICAgIGdldCB0aGUgZGVwZW5kZW5jaWVzLiBJdCBpbmNsdWRlcyBtYW55IGFkdmFuY2VkIGZlYXR1cmVzIHN1Y2ggYXMgZmlsdGVyaW5nIG9yCisgICAgICAgICAgcmVuZGVyaW5nIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0J3MgbmF0dXJlLiBBbHNvIGZlYXR1cmVzIGEgU1dUIGJhc2VkIEdVSS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNiBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5nZ3Rvb2xzLm5ldC9ncmFuZC8iPmh0dHA6Ly93d3cuZ2d0b29scy5uZXQvZ3JhbmQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ2hyaXN0b3BoZSBMYWJvdWlzc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEJTRCBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkdyZWVibyI+PC9hPgorICAgICAgICBHcmVlYm8KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5HcmVlYm8gaXMgYW4gQW50LXRhc2sgZm9yIGRvd25sb2FkaW5nIGRlcGVuZGVuY3kgZmlsZXMKKyAgICAgICAgKGN1cnJlbnRseSBvbmx5IGphcnMpIGZyb20gYSBuZXR3b3JrIHRvIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSwKKyAgICAgICAgbXVjaCBsaWtlIE1hdmVuLiBJdCBzdXBwb3J0cyBtdWx0aXBsZSBsb2NhbCBhbmQgcmVtb3RlCisgICAgICAgIHJlcG9zaXRvcmllcyB3aXRoIGVpdGhlciBmbGF0IG9yIG1hdmVuLWxpa2Ugc3RydWN0dXJlcy4gSXQgY2FuCisgICAgICAgIHJlYWQgdGhlIGRlcGVuZGVuY3kgbGlzdCBmcm9tIGEgTWF2ZW4gcHJvamVjdCBmaWxlLCBhCisgICAgICAgIG1hdmVuLWxpa2UgZGVwZW5kZW5jeSBmaWxlLCBvciBkaXJlY3RseSBmcm9tIHRoZSBidWlsZC54bWwKKyAgICAgICAgZmlsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZ3JlZWJvLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9ncmVlYm8uc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvbWFpbC8/Z3JvdXBfaWQ9NzM3MzMiPnByb2plY3QgbWFpbGluZyBsaXN0czwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Ikdyb2JvVXRpbHMgQ29kZUNvdmVyYWdlIj48L2E+CisgICAgICAgIEdyb2JvVXRpbHMgQ29kZUNvdmVyYWdlCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIENvZGVDb3ZlcmFnZSBzdWItcHJvamVjdCBvZiBHcm9ib1V0aWxzIHByb3ZpZGVzIGEgMTAwJQorICAgICAgICBwdXJlIEphdmEgY29kZSBjb3ZlcmFnZSB0b29sLiAgSXQgdXNlcyBwcmUtZXhlY3V0aW9uIGNsYXNzIGZpbGUKKyAgICAgICAgcmVjb21waWxhdGlvbiwgYW5kIGdlbmVyYXRlcyBYTUwgZmlsZXMgY29udGFpbmluZyB0aGUgY292ZXJhZ2UKKyAgICAgICAgc3RhdGlzdGljcy4gIEl0IGRvZXMgbm90IHJlcXVpcmUgYW55IGFkdmFuY2VkIFZNIHNldHVwIHRvIGdlbmVyYXRlCisgICAgICAgIGNvdmVyYWdlIG51bWJlcnMuCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41LjEKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2dyb2JvdXRpbHMuc291cmNlZm9yZ2UubmV0L2NvZGVjb3ZlcmFnZS8iPmh0dHA6Ly9ncm9ib3V0aWxzLnNvdXJjZWZvcmdlLm5ldC9jb2RlY292ZXJhZ2UvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9tYWlsLz9ncm91cF9pZD0yMjU5NCI+cHJvamVjdCBtYWlsaW5nIGxpc3RzPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTUlUIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSGFtbXVyYXBpIj48L2E+CisgICAgICAgIEhhbW11cmFwaQorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphdmEgY29kZSByZXZpZXcgdG9vbC4gUGVyZm9ybXMgYXV0b21hdGVkIGNvZGUKKyAgICAgICAgcmV2aWV3LiBDb250YWlucyAxMTEgaW5zcGVjdG9ycyB3aGljaCBjaGVjayBkaWZmZXJlbnQgYXNwZWN0cworICAgICAgICBvZiBjb2RlIHF1YWxpdHkgaW5jbHVkaW5nIGNvZGluZyBzdGFuZGFyZHMsIEVKQiwgdGhyZWFkaW5nLAorICAgICAgICAuLi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVGVzdGVkIHdpdGggQW50IDEuNS54IGFuZCAxLjYuNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmhhbW11cmFwaS5iaXovcHJvZHVjdHMvaGFtbXVyYXBpIj5odHRwOi8vd3d3LmhhbW11cmFwaS5iaXovcHJvZHVjdHMvaGFtbXVyYXBpPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5oYW1tdXJhcGkuYml6L2hhbW11cmFwaS1iaXovZWYveG1lbnUvY29udGFjdC5odG1sIj5Qcm9qZWN0IENvbnRhY3QgUGFnZTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkhlbHBTdHVkaW9BbnQiPjwvYT4KKyAgICAgICAgSGVscFN0dWRpb0FudAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgdGFzayBhbGxvd3MgZm9yIEhlbHBTdHVkaW8gcHJvamVjdHMgdG8gYmUgY3JlYXRlZCB2aWEgQW50LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS42LjAgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9oZWxwc3R1ZGlvYW50LnNvdXJjZWZvcmdlLm5ldCI+aHR0cDovL2hlbHBzdHVkaW9hbnQuc291cmNlZm9yZ2UubmV0PC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSURMRGVwZW5kIj48L2E+CisgICAgICAgIElETERlcGVuZAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPmlkbGRlcGVuZCBpcyBhIHRhc2sgdGhhdCAocmUpZ2VuZXJhdGVzIEphdmEgc291cmNlcyB0byBiZQorICAgICAgICBjcmVhdGVkIGZyb20gQ09SQkEvSURMIGZpbGVzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SXQgcGFyc2VzIHRoZSBJREwgZmlsZSBhbmQgZGV0ZXJtaW5lcyB0aGUgSmF2YSBmaWxlcyB0aGF0CisgICAgICAgIG11c3QgYmUgZ2VuZXJhdGVkLCB0YWtpbmcgaW4gYWNjb3VudCB0aGUgbW9kaWZpY2F0aW9ucyB0aGF0CisgICAgICAgIGNhbiBoYXBwZW4gZHVlIHRvIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLiAgSWYgYW55IG9mIHRoZSBKYXZhCisgICAgICAgIGZpbGVzIGFyZSBtaXNzaW5nIG9yIG9sZGVyIHRoYW4gdGhlIHNvdXJjZSBJREwgc3BlY2lmaWNhdGlvbiwKKyAgICAgICAgaXQgbGF1bmNoZXMgdGhlIHNwZWNpZmllZCBjb21waWxlci4gIFRoZSBjb21waWxlcnMgb2YgT3JiYWN1cywKKyAgICAgICAgSmFjb3JiLCBPcGVuT1JCLCBPcmJpeDJrIGFuZCBTdW4nSkRLIGRpc3RyaWJ1dGlvbnMgYXJlCisgICAgICAgIHN1cHBvcnRlZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRvIHNwZWVkIHVwIHRoZSBwcm9jZXNzIGFuZCBhdm9pZCB1bm5lY2VzYXJ5IHJlLXBhcnNpbmcsIGl0CisgICAgICAgIGtlZXBzIHRoZSBkZXBlbmRlbmNpZXMgaW4gaW50ZXJtZWRpYXRlIGZpbGVzLiAgVGhpcyB0YXNrIGRvZXMKKyAgICAgICAgbm90IGxhdW5jaCB0aGUgamF2YWMgY29tcGlsZXIgYXMgd2VsbCwgdGhhdCBpcywgaXRzIG91dHB1dCBhcmUKKyAgICAgICAgSmF2YSBmaWxlcyBhbmQgbm90IHRoZSBmaW5hbCBieXRlY29kZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNCBvciBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmJ5dGVzbG9vc2VyLmNvbS9pZGxkZXBlbmQvIj5odHRwOi8vd3d3LmJ5dGVzbG9vc2VyLmNvbS9pZGxkZXBlbmQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86Ynl0ZXNsb29zZXJAZ21haWwuY29tIj5ieXRlc2xvb3NlckBnbWFpbC5jb208L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBmcmVlIHNvdXJjZSwgbm8gbGljZW5zZSByZXN0cmljdGlvbnMKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSW1hZ2UiPjwvYT4KKyAgICAgICAgSW1hZ2UKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JbWFnZSB0YXNrIGdlbmVyYXRlcyBhbmQgdHJhbnNmb3JtcyBpbWFnZXMuIEl0IGV4cG9zZXMgdGhlCisgICAgICAgIGltYWdpbmcgY2FwYWJpbGl0eSBhdmFpbGFibGUgaW4gSmF2YTJELCBKYXZhIEFkdmFuY2VkIEltYWdpbmcsCisgICAgICAgIEltYWdlSU8sIGV0Yy4sIGFzIHNldCBvZiBuZXN0ZWQgZWxlbWVudHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5JbWFnZSB0cmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyAicmVzaXplIgorICAgICAgICAoc2NhbGUpLCJvdmVybGF5IiAob25lIGltYWdlIG9uIGFub3RoZXIpLAorICAgICAgICAiYm9yZGVyIiAoYWRkIGEgYm9yZGVyKSwgInRleHQiICh0ZXh0IG9uCisgICAgICAgIGltYWdlKSwgImNyb3AiIChhIHN1Yi1pbWFnZSBvZiBhIGJpZ2dlciBpbWFnZSksCisgICAgICAgICJyb3RhdGUiLCAiZ3JheXNjYWxlIiAoY2hhbmdlIGEgY29sb3IKKyAgICAgICAgaW1hZ2UgdG8gc2hhZGVzIG9mIGdyYXkpLjxiciAvPgorICAgICAgICBOb3cgaXQgc3VwcG9ydHMgdHJhbnNwYXJlbmN5IChtYWtpbmcgaW1hZ2VzIHRyYW5zbHVjZW50KSwgYQorICAgICAgICBiZXN0Zml0IG9wdGlvbiBmb3IgUmVzaXplLCBzaW1wbGUgc3VwcG9ydCBmb3IgaW1hZ2VzIHdpdGhpbgorICAgICAgICBhIHNlY3VyaXR5LWNvbnN0cmFpbnQsIGEgcHJlbGltaW5hcnkgc3VwcG9ydCAoaWYgcGphdG9vbHMuamFyCisgICAgICAgIGlzIGF2YWlsYWJsZSkgZm9yIHNhdmluZyBmaWxlcyBhcyBHSUYgYW5kIHNvbWUgb3RoZXIgZml4ZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5JTVBPUlRBTlQ6IFlvdSB3aWxsIG5lZWQgdGhlIFBNSVcgKFBvb3IgTWFuJ3MgSW1hZ2luZyBXcmFwcGVyKSBqYXIKKyAgICAgICAgZm9yIGFsbCB0aGUgb3BlcmF0aW9ucyBhbmQgdGhlIHBqYXRvb2xzIGphciBmb3IgR0lGIGVuY29kaW5nLyBzYXZpbmcKKyAgICAgICAgc3VwcG9ydC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm11bGxhc3NlcnkuY29tL3NvZnR3YXJlL0FOVC8iPmh0dHA6Ly93d3cubXVsbGFzc2VyeS5jb20vc29mdHdhcmUvQU5ULzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBwbWl3IGphcgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubXVsbGFzc2VyeS5jb20vc29mdHdhcmUvUE1JVy8iPmh0dHA6Ly93d3cubXVsbGFzc2VyeS5jb20vc29mdHdhcmUvUE1JVy88L2E+CisgICAgICAgICAgICAgICAgKFBvb3IgTWFuJ3MgSW1hZ2luZyBXcmFwcGVyKQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIHBqYXRvb2xzIGphcgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZXRla3MuY29tL3BqYS9lbi8iPmh0dHA6Ly93d3cuZXRla3MuY29tL3BqYS9lbi88L2E+CisgICAgICAgICAgICAgICAgKHBqYXRvb2xzIGZvciBHSUYgZW5jb2Rpbmcgc3VwcG9ydCkKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubXVsbGFzc2VyeS5jb20iPkFiZXkgTXVsbGFzc2VyeTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkltcG9ydHNjcnViYmVyIj48L2E+CisgICAgICAgIEltcG9ydHNjcnViYmVyCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UmVtb3ZlcyB1bm5lY2Vzc2FyeSBpbXBvcnQgc3RhdGVtZW50cyBmcm9tIGEgSmF2YSBzb3VyY2UgY29kZSBmaWxlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS4zCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9pbXBvcnRzY3J1YmJlci5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vaW1wb3J0c2NydWJiZXIuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzp0b21jb3BlbGFuZEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiPlRvbSBDb3BlbGFuZDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExHUEwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSW1UYXNrIj48L2E+CisgICAgICAgIEltVGFzaworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkltVGFzayBpcyBhIHRhc2sgdG8gYWxsb3cgb25lIHRvIHNlbmQgYW4gSW5zdGFudAorICAgICAgICBNZXNzYWdlLiBDdXJyZW50bHkgc3VwcG9ydHMgeWFob28hLCBBSU0sIGFuZCBKYWJiZXI8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNSBvciBoaWdoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2ltdGFzay5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vaW10YXNrLnNvdXJjZWZvcmdlLm5ldDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpkamFsbHN0YXJAdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5Kb24gTWFkaXNvbjwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBMR1BMCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkluY2FudG8iPjwvYT4KKyAgICAgICAgSW5jYW50bworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudCB0YXNrcyB0byBwcm92aWRlIHN1cHBvcnQgZm9yIE9yYWNsZSBkYXRhYmFzZSB0b29scworICAgICAgICAoc3VjaCBhcyBTUUwqUGx1cywgSW1wb3J0LCBFeHBvcnQpPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2luY2FudG8uc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2luY2FudG8uc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzphbGV4cmtAdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5BbGV4YW5kZXIgS2FybnN0ZWR0PC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IklzRGlyVmFsaWRhdG9yIj48L2E+CisgICAgICAgIElzRGlyVmFsaWRhdG9yCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBkaXJlY3Rvcnkgc3RydWN0dXJlIGNvbmZvcm1zIHRvCisgICAgICAgIGNlcnRhaW4gcnVsZXMgdGhhdCBhcmUgZGVmaW5lZCB2aWEgbmVzdGVkIGVsZW1lbnRzIG9mIHRoZQorICAgICAgICB0YXNrLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9pc3ZhbGlkYXRvci5zb3VyY2Vmb3JnZS5uZXQvZW4vaXNEaXJWYWxpZGF0b3IuaHRtIj5odHRwOi8vaXN2YWxpZGF0b3Iuc291cmNlZm9yZ2UubmV0L2VuL2lzRGlyVmFsaWRhdG9yLmh0bTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpuZXdzQGluaWdvc2VycmFuby5jb20iPknxaWdvIFNlcnJhbm88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJJdnkiPjwvYT4KKyAgICAgICAgSXZ5CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SXZ5IGlzIGEgc2ltcGxlIHlldCBwb3dlcmZ1bCBkZXBlbmRlbmN5IG1hbmFnZXIgZmVhdHVyaW5nCisgICAgICAgIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24sIGRlcGVuZGVuY2llcyBvZiBkZXBlbmRlbmNpZXMKKyAgICAgICAgbWFuYWdlbWVudCwgbXVsdGlwbGUgcmVwb3NpdG9yaWVzIGluY2x1ZGluZyBpYmlibGlvIGFuZCBoaWdoCisgICAgICAgIHBlcmZvcm1hbmNlICh1c2Ugb2YgYSBsb2NhbCBjYWNoZSkuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDEuNS4xICgxLjYuNSBvciAxLjcuMCByZWNvbW1lbmRlZCkKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL2l2eS8iPmh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9pdnkvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgaXZ5LXVzZXIgKGF0KSBpbmN1YmF0b3IgKGRvdCkgYXBhY2hlIChkb3QpIG9yZyBbVXNlciBNYWlsaW5nbGlzdF0KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkoyTUUgQW50IFRhc2tzIj48L2E+CisgICAgICAgIEoyTUUgQW50IFRhc2tzCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlcmUgYXJlIGRpZmZlcmVudCBzZXRzIG9mIHRhc2tzIHRvIGhlbHAgYnVpbGQgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMm1lLyI+SmF2YSAyIFBsYXRmb3JtLCBNaWNybworICAgICAgICBFZGl0aW9uPC9hPiAoSjJNRSkgYXBwbGljYXRpb25zLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50ZW5uYSI+PC9hPgorICAgICAgICAqKiogQW50ZW5uYSAqKioKKyAgICAgIDwvaDU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnRlbm5hIHByb3ZpZGVzIGEgc2V0IG9mIEFudCB0YXNrcyBzdWl0YWJsZSBmb3IgZGV2ZWxvcGluZworICAgICAgICAgIHdpcmVsZXNzIEphdmEgYXBwbGljYXRpb25zIHRhcmdldGVkIGF0IHRoZSBNb2JpbGUgSW5mb3JtYXRpb24KKyAgICAgICAgICBEZXZpY2UgUHJvZmlsZSAoTUlEUCkuIFdpdGggQW50ZW5uYSwgeW91IGNhbiBjb21waWxlLAorICAgICAgICAgIHByZXZlcmlmeSwgcGFja2FnZSwgb2JmdXNjYXRlLCBhbmQgcnVuIHlvdXIgTUlEUCBhcHBsaWNhdGlvbnMKKyAgICAgICAgICAoYWthIE1JRGxldHMpLCBtYW5pcHVsYXRlIEphdmEgQXBwbGljYXRpb24gRGVzY3JpcHRvciAoSkFEKQorICAgICAgICAgIGZpbGVzLCBhcyB3ZWxsIGFzIGNvbnZlcnQgSkFSIGZpbGVzIHRvIFBSQyBmaWxlcyBkZXNpZ25lZCB0bworICAgICAgICAgIHJ1biBvbiBNSURQIGZvciBQYWxtIE9TLiBEZXBsb3ltZW50IGlzIHN1cHBvcnRlZCB2aWEgYQorICAgICAgICAgIGRlcGxveW1lbnQgdGFzayBhbmQgYSBjb3JyZXNwb25kaW5nIEhUVFAgc2VydmxldCBmb3IKKyAgICAgICAgICBPdmVyLXRoZS1BaXIgKE9UQSkgcHJvdmlzaW9uaW5nLiBBIHNtYWxsIHByZXByb2Nlc3NvciBhbGxvd3MKKyAgICAgICAgICB0byBnZW5lcmF0ZSBkaWZmZXJlbnQgdmFyaWFudHMgb2YgYSBNSURsZXQgZnJvbSBhIHNpbmdsZQorICAgICAgICAgIHNvdXJjZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNC4xIG9yIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnRlbm5hLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnRlbm5hLnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86am9lcmdAcGxldW1hbm4uZGUiPkr2cmcgUGxldW1hbm48L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50aWMiPjwvYT4KKyAgICAgICAgKioqIEFudGljICoqKgorICAgICAgPC9oNT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudGljIGlzIGEgZnJlZWx5IGF2YWlsYWJsZSB0YXNrIGZvciBwYWNrYWdpbmcgSjJNRQorICAgICAgICAgIGFwcGxpY2F0aW9ucy4gSXQgcHJvZHVjZXMgYm90aCB0aGUgSmFyIGFuZCBKYWQgZmlsZXMgaW4gYQorICAgICAgICAgIHNpbmdsZSBzdGVwLiBUaGlzIGFsbG93cyAqYWxsKiBlbnRyaWVzIHRvIGJlIGNvcnJlY2x0eSBzZXQgaW4KKyAgICAgICAgICB0aGUgamFkIGZpbGUsIGluY2x1ZGluZyB0aGUgc2l6ZSBvZiB0aGUgamFyIGZpbGUgdGhhdCBpcworICAgICAgICAgIHByb2R1Y2VkLiBUaGlzIHRhc2sgaGFzIGJlZW4gdXNlZCBhbmQgdGVzdGVkIGV4dGVuc2l2ZWx5IHdpdGgKKyAgICAgICAgICBTdW4ncyBXaXJlbGVzcyBUb29sa2l0IGFuZCBhbHNvIHRoZSBOb2tpYSBTREsgYW5kCisgICAgICAgICAgZW11bGF0b3JzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc21hcnRrZXkuY28udWsvdG9vbHMvYW50aWMvYW50aWMuaHRtbCI+aHR0cDovL3d3dy5zbWFydGtleS5jby51ay90b29scy9hbnRpYy9hbnRpYy5odG1sPC9hPgorICAgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpzdXBwb3J0QHNtYXJ0a2V5LmNvLnVrIj5zbWFydGtleS5jby51azwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkRhdmUncyBKMk1FIFRhc2tzIj48L2E+CisgICAgICAgICoqKiBEYXZlJ3MgSjJNRSBUYXNrcyAqKioKKyAgICAgIDwvaDU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIHNldCBzdXBwb3J0cyBDTERDIGFuZCB0aGUgSyBWaXJ0dWFsIE1hY2hpbmUgKEtWTSk6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjMKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5kcmliaW4ub3JnL2RhdmUvajJtZV9hbnQvIj5odHRwOi8vd3d3LmRyaWJpbi5vcmcvZGF2ZS9qMm1lX2FudC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86ZHJpYkBlbnRlcmFjdC5jb20iPkRhdmUgRHJpYmluPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSjJNRSBQb2xpc2giPjwvYT4KKyAgICAgICAgKioqIEoyTUUgUG9saXNoICoqKgorICAgICAgPC9oNT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkoyTUUgUG9saXNoIGlzIGFuIEFudC1iYXNlZCB0b29sIGZvciB0aGUgY3JlYXRpb24gb2YKKyAgICAgICAgICBNSURQIGFwcGxpY2F0aW9ucy4gSXQgY292ZXJzIHRoZSB3aG9sZSBjaXJjbGUgb2YgcHJlcHJvY2Vzc2luZywgY29tcGlsaW5nLAorICAgICAgICAgIG9iZnVzY2F0aW9uLCBwcmV2ZXJpZnlpbmcsIHBhY2thZ2luZyBhbmQgSkFELWNyZWF0aW9uLiBKMk1FIFBvbGlzaCBpcworICAgICAgICAgIGlkZWFsIGZvciBjcmVhdGluZyBkZXZpY2Ugb3B0aW1pemVkIGFwcGxpY2F0aW9ucyB3aXRoIGl0cyBwb3dlcmZ1bAorICAgICAgICAgIHByZXByb2Nlc3NpbmcgY2FwYWJpbGl0aWVzIGFuZCB0aGUgaW50ZWdyYXRlZCBkZXZpY2UgZGF0YWJhc2UuCisgICAgICAgICAgV2l0aCBKMk1FIFBvbGlzaCBubyBoYXJkY29kZWQgdmFsdWVzIGFyZSBuZWVkZWQgYW5kIHRoZSBwb3J0YWJpbGl0eSBvZiBhbgorICAgICAgICAgIGFwcGxpY2F0aW9uIGlzIG5vdCBzYWNyaWZpY2VkLCBldmVuIHRob3VnaCBoaWdobHkgb3B0aW1pemVkIGFwcGxpY2F0aW9ucyBhcmUKKyAgICAgICAgICBjcmVhdGVkIGZyb20gYSBzaW5nbGUgc291cmNlLgorICAgICAgICAgIDxiciAvPgorICAgICAgICAgIEl0IGNvbnRhaW5zIGEgbG9nZ2luZyBmcmFtZXdvcmsgYW5kIGFuIG9wdGlvbmFsIE1JRFAtY29tcGF0aWJsZSBHVUkKKyAgICAgICAgICB3aGljaCBjYW4gYmUgZGVzaWduZWQgdXNpbmcgdGhlIHdlYi1zdGFuZGFyZCBDU1MuIFdpdGggdGhlIEoyTUUgUG9saXNoIEdVSQorICAgICAgICAgIHlvdSBjYW4gZXZlbiB1c2UgTUlEUC8yLjAgZmVhdHVyZXMgb24gTUlEUC8xLjAgcGhvbmVzLgorICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40LjEgb3IgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qMm1lcG9saXNoLm9yZy8iPmh0dHA6Ly93d3cuajJtZXBvbGlzaC5vcmcvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmoybWVwb2xpc2hAZW5vdWdoLmRlIj5Fbm91Z2ggU29mdHdhcmU8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTsgY29tbWVyY2lhbCBsaWNlbnNlcyBhdmFpbGFibGUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iU3RhbXB5c29mdCdzIEoyTUUgVGFza3MiPjwvYT4KKyAgICAgICAgKioqIFN0YW1weXNvZnQncyBKMk1FIFRhc2tzICoqKgorICAgICAgPC9oNT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFuZCB0aGlzIHNldCB3b3JrcyB3aXRoIHRoZSBKMk1FIFdpcmVsZXNzIFRvb2xraXQgYW5kIE1JRFAKKyAgICAgICAgICBmb3IgUGFsbU9TOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS4zCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3RhbXB5c29mdC5jb20vYW50LyI+aHR0cDovL3d3dy5zdGFtcHlzb2Z0LmNvbS9hbnQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmplY2tlbHNAc3RhbXB5c29mdC5jb20iPkpvc2ggRWNrZWxzPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTUlUIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKYWNzb24iPjwvYT4KKyAgICAgICAgSmFjc29uCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SmFjc29uIGlzIGEgY29uZmlndXJhYmxlIGFuZCBwbHVnYWJsZSB0b29sIChtdWNoIGxpa2UgQW50CisgICAgICAgIGl0c2VsZikgdG8gY3JlYXRlIGZpbHRlcnMgZm9yIHRleHQgKGxpbmUgYmFzZWQpIGZpbGVzIHdpdGhvdXQKKyAgICAgICAgcHJvZ3JhbW1pbmcuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEphY3NvbiBoYXMgYmVlbiB1c2VkIGFuZCB0ZXN0ZWQgd2l0aCAxLjUuMSwgc2hvdWxkCisgICAgICAgICAgICB3b3JrIHdpdGggMS40KworICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vamFjc29uLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9qYWNzb24uc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpqYWNzb24tdXNlckBsaXN0cy5zb3VyY2Vmb3JnZS5kZSI+amFjc29uLXVzZXJAbGlzdHMuc291cmNlZm9yZ2UuZGU8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgTGlicmFyeSBvciBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKYWxvcHkiPjwvYT4KKyAgICAgICAgSmFsb3B5CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW4gQW50IFBsdWctaW4gZm9yIHRoZSBKYXZhIFNvdXJjZSBDb2RlIEZvcm1hdHRlcgorICAgICAgICBKYWxvcHkuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQgKG9yIGhpZ2hlcikKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phbG9weS5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vamFsb3B5LnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vamFsb3B5LnNmLm5ldC9jb250YWN0Lmh0bWwiPmh0dHA6Ly9qYWxvcHkuc2YubmV0L2NvbnRhY3QuaHRtbDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFN0YXJ0aW5nIHdpdGggcmVsZWFzZSAxLjAgQmV0YSA2IHRoZSBsaWNlbnNlIGlzIHRoZQorICAgICAgICAgICAgQlNEIExpY2Vuc2UuICBQcmlvciByZWxlYXNlcyB3ZXJlIHVuZGVyIHRoZSBHTlUgR2VuZXJhbAorICAgICAgICAgICAgUHVibGljIExpY2Vuc2UuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkphckJ1bmRsZXIiPjwvYT4KKyAgICAgICAgSmFyQnVuZGxlcgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphckJ1bmRsZXIgaXMgYSB0YXNrIHRoYXQgZ2VuZXJhdGVzIE1hYyBPUyBYIG5hdGl2ZSBKYXZhCisgICAgICAgIEFwcGxpY2F0aW9uIEJ1bmRsZXMuICBJdCBpcyBmdWxseSBjb25maWd1cmFibGUgYW5kIGNhbiBiZSB1c2VkCisgICAgICAgIHRvIGdlbmVyYXRlIE1hYyBPUyBYIGFwcGxpY2F0aW9uIGJ1bmRsZXMgZnJvbSBhbnkgc3VwcG9ydGVkCisgICAgICAgIEphdmEgcGxhdGZvcm0sIG1ha2luZyBpdCBpZGVhbCBmb3IgdGFyZ2V0aW5nIG11bHRpcGxlCisgICAgICAgIHBsYXRmb3JtcyB3aXRoIG9uZSBidWlsZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNCBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5sb29tY29tLmNvbS9qYXJidW5kbGVyLyI+aHR0cDovL3d3dy5sb29tY29tLmNvbS9qYXJidW5kbGVyLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpzZXRobUBsb29tY29tLmNvbSI+U2V0aCBNb3JhYml0bzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkphclBhdGNoIj48L2E+CisgICAgICAgIEphclBhdGNoCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SmFyUGF0Y2ggaXMgYSB0YXNrIHRoYXQgZ2VuZXJhdGVzIGEgemlwIGZpbGUgcmVzdWx0aW5nIG9mCisgICAgICAgIHRoZSBkaWZmIGJldHdlZW4gdGhlIGNvbnRlbnQgb2YgMiBqYXIgZmlsZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgcmVzdWx0aW5nIGRpZmYgZmlsZSBjYW4gYmUgdXNlIGFzIGEgcGF0Y2ggZm9yIGEKKyAgICAgICAgcHJldmlvdXMgaW5zdGFsbGF0aW9uIChqdXN0IGVuc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQKKyAgICAgICAgcGF0Y2guemlwIGZpbGUgaXMgbG9jYXRlZCBvbiB0aGUgQ0xBU1NQQVRIIGJlZm9yZSB0aGUgcGF0Y2hlZAorICAgICAgICBvbGRKYXIgamFyIGZpbGUpPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZXJzby5jbHViLWludGVybmV0LmZyL3Nqb2JpYy9hbnQvIj5odHRwOi8vcGVyc28uY2x1Yi1pbnRlcm5ldC5mci9zam9iaWMvYW50LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpub3JiZXJ0LmJhcmJvc2FAbGFwb3N0ZS5uZXQiPk5vcmJlcnQgQmFyYm9zYTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExHUEwgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKYXZhKyBQcmVjb21waWxlIFRhc2siPjwvYT4KKyAgICAgICAgSmF2YSsgUHJlY29tcGlsZSBUYXNrCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SmF2YSsgaXMgYW4gb3BlbiBzb3VyY2UgSmF2YSBwcmVwcm9jZXNzb3IgdGhhdCBhZGRzIHRoZXNlCisgICAgICAgIGZlYXR1cmVzIHRvIGFueSBKYXZhIGNvbXBpbGVyOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5NdWx0aS1saW5lIHN0cmluZ3Mgd2l0aCBleGVjdXRhYmxlIGluY2x1c2lvbnMgbGlrZSBQZXJsCisgICAgICAgICAgYW5kIFJ1YnkuIEl0IGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIEpTUCBvciBBU1AgYW5kIHRoZWlyCisgICAgICAgICAgbmVlZCBmb3IgSmF2YSBjb21waWxlcnMgb24gZGVwbG95bWVudCBzZXJ2ZXJzIChhIHNlY3VyaXR5CisgICAgICAgICAgY29uY2Vybikgd2hpbGUgYWRkaW5nIG5vIG92ZXJoZWFkIGluIGVpdGhlciBzcGFjZSBvcgorICAgICAgICAgIHRpbWUuIDwvbGk+CisKKyAgICAgICAgICA8bGk+T3B0aW9uYWxseSBzdXBwb3J0cyBsb2NhbGl6YXRpb24gYnkgc2VncmVnYXRpbmcgSmF2YSsKKyAgICAgICAgICBzdHJpbmdzIGludG8gUmVzb3VyY2VCdW5kbGUgZmlsZXMgd2l0aCBpbnZhcmllbnQga2V5cyBiYXNlZAorICAgICAgICAgIG9uIHRoZSBoYXNoIGNvZGUgb2YgdGhlIHN0cmluZ3MncyB2YWx1ZS4gVGhpcyBpcyBoYW5kbGVkCisgICAgICAgICAgYXV0b21hdGljYWxseSBhbmQgdHJhbnNwYXJlbnRseTsgbm8gaW50ZXJ2ZW50aW9uIGlzCisgICAgICAgICAgcmVxdWlyZWQuPC9saT4KKworICAgICAgICAgIDxsaT5GYXN0LiBOZWdsaWdpYmxlIGltcGFjdCBvbiBidWlsZCB0aW1lcy4gQnkgZGVmYXVsdCwKKyAgICAgICAgICBza2lwcyBpbnB1dHMgd2hvc2Ugb3V0cHV0cyBhcmUgdXAgdG8gZGF0ZSB0byBhdm9pZAorICAgICAgICAgIHRyaWdnZXJpbmcgcmVjb21waWxhdGlvbnMuPC9saT4KKworICAgICAgICAgIDxsaT5QdXJlIEphdmEgY29kZSwgcG9ydGFibGUgdG8gYW55IHBsYXRmb3JtLCB3aXRoCisgICAgICAgICAgZ3JhcGhpY2FsLCBzaGVsbCBhbmQgYW50IGludGVyZmFjZXMuPC9saT4KKworICAgICAgICAgIDxsaT5TaW1wbGUsIGdlbmVyYWwsIHJlY3Vyc2l2ZSwgZGlncmFwaC1kcml2ZW4gc3RyaW5nCisgICAgICAgICAgc3ludGF4LiBEaWdyYXBoIGNoYXJhY3RlcnMgYXJlIHVzZXItc2VsZWN0YWJsZS48L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUuMQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdmlydHVhbHNjaG9vbC5lZHUvamF2YSsvIj5odHRwOi8vdmlydHVhbHNjaG9vbC5lZHUvamF2YSsvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmJjb3hAdmlydHVhbHNjaG9vbC5lZHUiPkJyYWQgQ294PC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQlNELWxpa2UgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKYXZhMkh0bWwiPjwvYT4KKyAgICAgICAgSmF2YTJIdG1sCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdG9vbHMgYm90aCBuYW1lZCBKYXZhMkhUTUwgdGhhdAorICAgICAgICBwcm9jZXNzIEphdmEgc291cmNlIGNvZGUgYW5kIGdlbmVyYXRlIHN5bnRheCBoaWdobGlnaHRlZAorICAgICAgICBkb2N1bWVudGF0aW9uIGZyb20gaXQuICBCb3RoIGluY2x1ZGUgQW50IHRhc2tzIHRvIHJ1bgorICAgICAgICB0aGVtLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SmF2YTJIdG1sIGxpYnJhcnkgZm9yIGNvbnZlcnRpbmcgamF2YSBzb3VyY2UgZmlsZXMKKyAgICAgICAgb3Igc25pcHBsZXRzIHRvIHN5bnRheCBoaWdobGlnaHRlZCBodG1sLCBydGYsIHRleCBhbmQKKyAgICAgICAgb3RoZXJzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41IGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmphdmEyaHRtbC5kZS8iPmh0dHA6Ly93d3cuamF2YTJodG1sLmRlLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpqYXZhMmh0bWxAamF2ZS5kZSI+amF2YTJodG1sQGphdmUuZGU8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SmF2YTJIVE1MIGlzIGEgc2ltcGxlLXRvLXVzZSB0b29sIHdoaWNoIGNvbnZlcnRzIGEgYnVuY2ggb2YKKyAgICAgICAgSmF2YSBTb3VyY2UgQ29kZSBpbnRvIGEgY29sb3VyaXplZCBhbmQgYnJvd3NhYmxlIEhUTUwKKyAgICAgICAgcmVwcmVzZW50YXRpb24uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDEuNS4xIG9ud2FyZHMKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhMmh0bWwuY29tL2phdmEyaHRtbF9hbnRfdGFzay5odG1sIj5odHRwOi8vd3d3LmphdmEyaHRtbC5jb20vamF2YTJodG1sX2FudF90YXNrLmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86c3VwcG9ydEBqYXZhMmh0bWwuY29tIj5zdXBwb3J0QGphdmEyaHRtbC5jb208L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBGcmVlV2FyZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKYXZhbWFrZSI+PC9hPgorICAgICAgICBKYXZhbWFrZQorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgdGFzayB0byBjb21waWxlIEphdmEgc291cmNlcyBhbmQgbWFuYWdlIGNsYXNzIGZpbGUKKyAgICAgICAgZGVwZW5kZW5jaWVzLiBGdW5jdGlvbmFsaXR5IGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBvZiBzdGFuZGFyZAorICAgICAgICBKYXZhYyBhbmQgRGVwZW5kIHRhc2tzIGNvbWJpbmVkLCB3aXRoIGltcHJvdmVkIGRlcGVuZGVuY3kKKyAgICAgICAgY2hlY2tpbmcuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQuMQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmV4cGVyaW1lbnRhbHN0dWZmLmNvbS9UZWNobm9sb2dpZXMvSmF2YU1ha2UvaW5kZXguaHRtbCI+aHR0cDovL3d3dy5leHBlcmltZW50YWxzdHVmZi5jb20vVGVjaG5vbG9naWVzL0phdmFNYWtlL2luZGV4Lmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86TWlraGFpbC5EbWl0cmlldkBlbmcuc3VuLmNvbSI+TWlraGFpbCBEbWl0cmlldjwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEJTRC1saWtlIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iamF2YXJlYyI+PC9hPgorICAgICAgICBqYXZhcmVjCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50IHRhc2tzIHRoYXQgZ2VuZXJhdGUgcmVjb3JkIGNsYXNzZXMgZm9yIFZpc3VhbEFnZSBmb3IKKyAgICAgICAgSmF2YSBmcm9tIENvYm9sIGNvcHkgYm9va3MuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2dsZXplbi5vcmcvamF2YXJlYy8iPmh0dHA6Ly9nbGV6ZW4ub3JnL2phdmFyZWMvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnBnbGV6ZW5AdXMuaWJtLmNvbSI+UGF1bCBHbGV6ZW48L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKQ1NDIj48L2E+CisgICAgICAgIEpDU0MKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5KQ1NDIGlzIGEgSmF2YSBDb2RpbmcgU3RhbmRhcmQgQ2hlY2tlciB3aGljaCBhbHNvIGZlYXR1cmVzCisgICAgICAgIHRoZSBnZW5lcmF0aW9uIG9mIHNvbWUgY29kZSBtZXRyaWNzLiBJdCBpcyBhIGNvbW1hbmQgbGluZSB0b29sCisgICAgICAgIHdpdGggYW4gQW50IHRhc2sgdG8gc2NhbiB3aG9sZSBwYWNrYWdlIHRyZWVzLiBUaGUgcmVzdWx0IGNhbgorICAgICAgICB2aWV3ZWQgaW4gYW4gSmF2YURvYyBzdHlsZSB3ZWIgcGFnZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50ICZndDs9IDEuNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vamNzYy5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vamNzYy5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnJqb2NoYW03MkBuZXRzY2FwZS5uZXQiPlJhbHBoIEpvY2hhbTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkpkaWZmIj48L2E+CisgICAgICAgIEpkaWZmCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QSB0YXNrIHRoYXQgZ2VuZXJhdGVzIGFuIEhUTUwgcmVwb3J0IG9mIGFsbCB0aGUgcGFja2FnZXMsIGNsYXNzZXMsCisgICAgICAgIGNvbnN0cnVjdG9ycywgbWV0aG9kcywgYW5kIGZpZWxkcyB3aGljaCBoYXZlIGJlZW4gcmVtb3ZlZCwgYWRkZWQgb3IKKyAgICAgICAgY2hhbmdlZCBpbiBhbnkgd2F5LCBpbmNsdWRpbmcgdGhlaXIgZG9jdW1lbnRhdGlvbiwgd2hlbiB0d28gQVBJcyBhcmUKKyAgICAgICAgY29tcGFyZWQuIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS42CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmFkaWZmLnNvdXJjZWZvcmdlLm5ldC8iPgorICAgICAgICAgICAgaHR0cDovL2phdmFkaWZmLnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVGFzayBEb2N1bWVudGF0aW9uOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvdmlld2N2cy5weS8qY2hlY2tvdXQqL2phdmFkaWZmL2pkaWZmL2pkaWZmLmh0bWw/cmV2PUhFQUQmYW1wO2NvbnRlbnQtdHlwZT10ZXh0L2h0bWwjSkRpZmZBbnRUYXNrIj4KKyAgICAgICAgICAgIChpbiBDVlMpPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTEdQTAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKRmxleCI+PC9hPgorICAgICAgICBKRmxleAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkpGbGV4IGlzIGEgbGV4aWNhbCBhbmFseXplciBnZW5lcmF0b3IgKGFsc28ga25vd24gYXMKKyAgICAgICAgc2Nhbm5lciBnZW5lcmF0b3IpIGZvciBKYXZhLCB3cml0dGVuIGluIEphdmEuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pmbGV4LmRlLyI+aHR0cDovL2pmbGV4LmRlLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvbWFpbGluZy5odG1sIj5qZmxleC11c2VycyBtYWlsaW5nIGxpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKaW5kZW50VGFzayI+PC9hPgorICAgICAgICBKaW5kZW50VGFzaworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkppbmRlbnRUYXNrIGlzIGEgdmVyeSBzdHJhaWdodGZvcndhcmQgd3JhcHBpbmcgb2YgdGhlCisgICAgICAgIEppbmRlbnQgdG9vbCwgYSB2ZW5kb3IgY29kZSBiZWF1dGlmaWVyLiBJdCBlbmFibGVzIHRvIHVzZQorICAgICAgICBKaW5kZW50IG5hdGl2ZWx5IGZyb20gQW50LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40LjEgYW5kIGhpZ2hlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGhlLmVkb3VhcmQubWVyY2llci5mcmVlLmZyL0ppbmRlbnRfY29udGVudC5waHAiPmh0dHA6Ly90aGUuZWRvdWFyZC5tZXJjaWVyLmZyZWUuZnIvSmluZGVudF9jb250ZW50LnBocDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEVkb3VhcmQgTWVyY2llcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKaW5nIFRhc2siPjwvYT4KKyAgICAgICAgSmluZyBUYXNrCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+IFZhbGlkYXRlcyBYTUwgZmlsZXMgYWdhaW5zdCB0aGUgUkVMQVggTkcgYWx0ZXJuYXRpdmUgdG8gWE1MIFNjaGVtYS4KKyAgICAgICAgVGhlIEppbmcgdGFzayBmb3IgQW50IGFsbG93cyB5b3UgdG8gZWZmaWNpZW50bHkgdmFsaWRhdGUKKyAgICAgICAgbXVsdGlwbGUgZmlsZXMgYWdhaW5zdCBtdWx0aXBsZSBSRUxBWCBORyBwYXR0ZXJucyBhbmQgaW50ZWdyYXRlCisgICAgICAgIFJFTEFYIE5HIHZhbGlkYXRpb24gd2l0aCBvdGhlciBYTUwgcHJvY2Vzc2luZy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNCBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy50aGFpb3BlbnNvdXJjZS5jb20vcmVsYXhuZy9qaW5nLWFudC5odG1sIj4KKyAgICAgICAgICAgIGh0dHA6Ly93d3cudGhhaW9wZW5zb3VyY2UuY29tL3JlbGF4bmcvamluZy1hbnQuaHRtbDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEJTRC1saWtlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9ImpNZXRyYSI+PC9hPgorICAgICAgICBqTWV0cmEKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5qTWV0cmEgaXMgYSB0b29sIGZvciBjb2xsZWN0aW5nIGNvZGUgbWV0cmljcyBhY3Jvc3MgYQorICAgICAgICBwcm9qZWN0IGxpZmVjeWNsZSBhbmQgY29tcGlsaW5nIHRoZSByZXN1bHRzIGludG8KKyAgICAgICAgSmF2YURvYy1zdHlsZWQgZG9jdW1lbnRhdGlvbiB0byBhbmFseXplIHByb2plY3QgbWV0cmljcyBvdmVyCisgICAgICAgIHRpbWUuICBqTWV0cmEgaXMgYmVzdCB1dGlsaXplZCBieSBpbnRlZ3JhdGluZyBpdCB3aXRoIHlvdXIKKyAgICAgICAgcHJvamVjdCdzIHNjaGVkdWxlZCBidWlsZCBwcm9jZXNzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SXQgd29ya3MgZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIHVzaW5nIHNldmVyYWwgcHJvdmlkZWQKKyAgICAgICAgQW50IHRhc2tzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40IGFuZCBoaWdoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuam1ldHJhLmNvbS8iPmh0dHA6Ly93d3cuam1ldHJhLmNvbS88L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJtYWlsdG86dG5ld3RvbkBoeXBlcmNpc2lvbmluYy5jb20iPlIgVG9kZCBOZXd0b24KKyAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21tZXJjaWFsLCBmcmVlIGxpY2Vuc2VzIGZvciBvcGVuIHNvdXJjZSBwcm9qZWN0cyBhbmQKKyAgICAgICAgICAgIGV2YWx1YXRpb25zLgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKTVg0QW50Ij48L2E+CisgICAgICAgIEpNWDRBbnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5KTVg0QW50IHByb3ZpZGVzIHRhc2tzIGZvciBpbnRlZ3JhdGlvbiB3aXRoIEpNWCAoSmF2YSBNYW5hZ2VtZW50CisgICAgICAgIEV4dGVuc2lvbnMpLiBJdCBwcm92aWRlcyB0YXNrcyBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyBhdHRyaWJ1dGVzCisgICAgICAgIG9mIE1CZWFucywgaW52b2tpbmcgdGhlaXIgbWV0aG9kcyBhbmQgbXVjaCBtb3JlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40IGFuZCBoaWdoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qbXg0YW50LnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9qbXg0YW50LnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJtYWlsdG86YmR1ZWNrQHlhaG9vLmNvbSI+QnJpYW4gRHVlY2s8L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKTkkiPjwvYT4KKyAgICAgICAgSk5JCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisKKyAgICAgICAgICBKTkkgaXMgYSBmcmVlIHRvb2xraXQgdGhhdCBtYWtlcyBlYXN5IHdvcmsgb2YKKyAgICAgICAgICBpbnRlZ3JhdGluZyBKYXZhIGFuZCBDIHRocm91Z2ggdGhlIEphdmEgTmF0aXZlCisgICAgICAgICAgSW50ZXJmYWNlIChKTkkpLiBJdCBpbmNsdWRlcyBhIGNvZGUgZ2VuZXJhdG9yIHRoYXQKKyAgICAgICAgICBnZW5lcmF0ZXMgYm90aCBKYXZhICJwcm94eSIgY2xhc3NlcyB0byBhY2Nlc3MgQworICAgICAgICAgICJwZWVyIiBjbGFzc2VzLCBhbmQgQyAicHJveHkiIGNsYXNzZXMgdG8gYWNjZXNzCisgICAgICAgICAgSmF2YSAicGVlciIgY2xhc3NlcyBvciBpbnRlcmZhY2VzLiBJdCBhbHNvCisgICAgICAgICAgaW5jbHVkZXMgYSBjb3JlIGxpYnJhcnkgd2l0aCBhIHNpbXBsaWZpZWQgSlZNCisgICAgICAgICAgaW50ZXJmYWNlIGFzIHdlbGwgYXMgImhlbHBlciIgY2xhc3NlcyB0byBlYXNlCisgICAgICAgICAgd29ya2luZyB3aXRoIHRoZSBKTkkgZGF0YSB0eXBlcy4gVGhlIGNvZGUKKyAgICAgICAgICBnZW5lcmF0aW9uIGlzIGRyaXZlbiBieSBhbiBYTUwgcHJvamVjdCBmaWxlIHRoYXQKKyAgICAgICAgICBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSBhc3Npc3RhbmNlIG9mIHRoZSBHVUkKKyAgICAgICAgICBQcm9qZWN0IE1hbmFnZXIuIFRoZSBjb2RlIGdlbmVyYXRpb24gY2FuIGJlCisgICAgICAgICAgaW52b2tlZCBlaXRoZXIgZnJvbSBBbnQgb3IgZnJvbSB0aGUKKyAgICAgICAgICBHVUkuIEluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBwcmludGFibGUgUERGIFVzZXIKKyAgICAgICAgICBHdWlkZSBhbmQgcGxlbnR5IG9mIGV4YW1wbGVzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qbmlwcC5zZi5uZXQvIj5odHRwOi8vam5pcHAuc2YubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpwdHJld2hlbGxhQHVzZXJzLnNmLm5ldCI+UGhpbGxpcCBFLiBUcmV3aGVsbGE8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgTEdQTAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKUFAiPjwvYT4KKyAgICAgICAgSlBQCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhcHJlcHJvY2Vzc29yLmNvbSI+SlBQPC9hPiBpcyBhIHByZXByb2Nlc3NvciBmb3IgQW50IHN1cHBvcnRpbmcKKyAgICAgICAgICBtYW55IGRpZmZlcmVudCBmaWxlIHR5cGVzIHRoYXQgYWxsb3dzIHlvdSB0byBpbmNsdWRlIC8gZXhjbHVkZSBjb250ZW50cyBiYXNlZCBvbiAKKyAgICAgICAgICBidWlsZC10aW1lIHBhcmFtZXRlcnMuICBJdCBpcyBjb21wbGV0ZWx5IGludmlzaWJsZSB0byBvdGhlciB0b29scyBhbmQgdGFrZXMgdGhlIGhhc3NsZSAKKyAgICAgICAgICBvdXQgb2YgbWFpbnRhaW5pbmcgY3VzdG9taXNlZCBjb2RlIG9yIGNvbnRlbnQuICBJdCBpcyBmcmVlLCBpcyBwcm92aWRlZCBhcyBhbiBBbnQgdGFzaywgCisgICAgICAgICAgYW5kIHZlcnkgc2ltcGxlIHRvIHVzZS4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYuNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmphdmFwcmVwcm9jZXNzb3IuY29tIj5odHRwOi8vd3d3LmphdmFwcmVwcm9jZXNzb3IuY29tPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOi8vaW5mb0BqYXZhcHJlcHJvY2Vzc29yLmNvbSI+aW5mb0BqYXZhcHJlcHJvY2Vzc29yLmNvbTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEZyZWV3YXJlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkpSZWxlYXNlSW5mbyI+PC9hPgorICAgICAgICBKUmVsZWFzZUluZm8KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Tb21ldGltZXMgeW91IGFyZSBpbnRlcmVzdGVkIGF0IHJ1bnRpbWUgdG8gaGF2ZSBpbmZvcm1hdGlvbgorICAgICAgICBmcm9tIGJ1aWxkIHRpbWUuIFRoaXMgbWF5IGJlIHRoZSBidWlsZCBkYXRlLCBhIGJ1aWxkIG51bWJlciBvcgorICAgICAgICB0aGUgdmVyc2lvbi4gIFRoZSBKUmVsZWFzZUluZm8gQW50IFRhc2sgZ2VuZXJhdGVzIGEgamF2YQorICAgICAgICBzb3VyY2UgZmlsZSB3aXRoIGdldHRlciBtZXRob2RzIGZvciBhbnkgZGVzaXJlZCBhbmQgcHJvdmlkZWQKKyAgICAgICAgcHJvcGVydGllcy4gIEZ1cnRoZXJtb3JlLCBpdCBjYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhCisgICAgICAgIHZpZXdlciAod2hpY2ggY2FuIGUuZy4gIGJlIHVzZWQgYXMgbWFpbi1jbGFzcyBpbiBhIGxpYnJhcnkgamFyCisgICAgICAgIGZpbGUpIHRoYXQgc2hvd3MgdGhlIGluY2x1ZGVkIHJlbGVhc2UgaW5mb3JtYXRpb24uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qcmVsZWFzZWluZm8uc291cmNlZm9yZ2UubmV0LyI+SG9tZVBhZ2Ugb24gU291cmNlRm9yZ2U8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2pyZWxlYXNlaW5mby8iPkZvcnVtcy9UcmFja2VyIG9uIFNvdXJjZUZvcmdlPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSlJ1biBBbnQgVGFza3MiPjwvYT4KKyAgICAgICAgSlJ1biBBbnQgVGFza3MKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5KUnVuIDQgU1AxIHNoaXBzIHdpdGggbGliL2pydW4tYW50LXRhc2tzLmphciwgd2hpY2ggZGVmaW5lcworICAgICAgICB0aHJlZSBBbnQgdGFza3M6IGpydW4sIGpydW5hcHAsIGFuZCBqcnVuam14LiAgRG9jdW1lbnRhdGlvbgorICAgICAgICBmb3IgdGhlIHRhc2tzIGNhbiBiZSBmb3VuZCBpbiBKUnVuIHVuZGVyCisgICAgICAgIGRvY3MvYW50L2pydW4uaHRtbC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vdGUgdGhhdCB0aGUgc2VydmljZSBwYWNrIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRvcCBvZiBhbgorICAgICAgICBleGlzdGluZyBKUnVuIDQgaW5zdGFsbGF0aW9uLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40IG9yIGhpZ2hlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZHluYW1pYy5tYWNyb21lZGlhLmNvbS9iaW4vTU0vc29mdHdhcmUvdHJpYWwvaHdzd3JlYy5qc3A/cHJvZHVjdD1qcnVuX3NwIj5odHRwOi8vZHluYW1pYy5tYWNyb21lZGlhLmNvbS9iaW4vTU0vc29mdHdhcmUvdHJpYWwvaHdzd3JlYy5qc3A/cHJvZHVjdD1qcnVuX3NwPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmJkZWl0dGVAbWFjcm9tZWRpYS5jb20iPkJyaWFuIERlaXR0ZTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbW1lcmNpYWwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSlNNaW4gQW50IFRhc2siPjwvYT4KKyAgICAgICAgSlNNaW4gQW50IFRhc2sKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgSlNNaW4gQW50IHRhc2sgY2FuIGJlIHVzZWQgZm9yIHRoZSBhdXRvbWF0ZWQgbWluaWZpY2F0aW9uIG9mIGphdmFzY3JpcHQgZmlsZXMKKyAgICAgICAgICBpbiB5b3VyIGJ1aWxkIGFuZCBkZXBsb3kgcHJvY2Vzc2VzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SlNNaW4gaXMgYSBmaWx0ZXIgd2hpY2ggcmVtb3ZlcyBjb21tZW50cyBhbmQgdW5uZWNlc3Nhcnkgd2hpdGVzcGFjZSBmcm9tIGphdmFzY3JpcHQKKyAgICAgICAgICBmaWxlcy4gSXQgdHlwaWNhbGx5IHJlZHVjZXMgZmlsZXNpemUgYnkgaGFsZiwgcmVzdWx0aW5nIGluIGZhc3RlciBkb3dubG9hZHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYuNSBvciBoaWdoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzbWluLWFudC10YXNrLyI+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzbWluLWFudC10YXNrLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzptYXR0X2F0X21hdHRoYXluZXNfZG90X25ldCI+TS4gSGF5bmVzPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIExpY2Vuc2UgMi4wCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Ikp1ZG9TY3JpcHQgQW50IFRhc2siPjwvYT4KKyAgICAgICAgSnVkb1NjcmlwdCBBbnQgVGFzaworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSAmbHQ7anVkb3NjcmlwdCZndDsgdGFzayBpcyBhbiBlYXN5IHdheSB0byBlbWJlZCBKdWRvU2NyaXB0CisgICAgICAgICAgIGNvZGUgaW4gdGhlIEFudCBidWlsZCBzY3JpcHQuIFRoZSB0YWcgZm9ybWF0IGlzIHF1aXRlIHNpbXBsZS4gWW91IGNhbgorICAgICAgICAgICBlaXRoZXIgZW1iZWQgY29kZSBkaXJlY3RseSwgb3IgY2FuIHNwZWNpZnkgYW4gZXh0ZXJuYWwgSnVkb1NjcmlwdCBwcm9ncmFtCisgICAgICAgICAgIGZpbGUgYXMgdGhlIDxjb2RlPnNyYzwvY29kZT4gYXR0cmlidXRlIHZhbHVlLiBQYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQKKyAgICAgICAgICAgYXMgdGhlIDxjb2RlPnBhcmFtczwvY29kZT4gYXR0cmlidXRlOyB0aGlzIGlzIGFwcGxpY2FibGUgdG8gYm90aCBlbWJlZGRlZAorICAgICAgICAgICBjb2RlIGFuZCBleHRlcm5hbCBmaWxlcy4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUgb3IgaGlnaGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVkb3NjcmlwdC5jb20vYXJ0aWNsZXMvYW50Lmh0bWwiPmh0dHA6Ly93d3cuanVkb3NjcmlwdC5jb20vYXJ0aWNsZXMvYW50Lmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86anVkb3NjcmlwdEBob3RtYWlsLmNvbSI+SmFtZXMgSmlhbmJvIEh1YW5nPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGVzc2VyIEdOVSBQdWJsaWMgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKdXN0NGxvZyBBbnQgVGFzayI+PC9hPgorICAgICAgICBKdXN0NGxvZyBBbnQgVGFzaworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkp1c3Q0bG9nIGlzIGEgYW50IHRhc2sgdG8gb3B0aW1pemUgSlZNIGJ5dGVjb2RlIHdpdGggcmVnYXJkcworICAgICAgICBmb3IgTG9ncyAoIGJlIGl0LCBMb2c0aiwgQXBhY2hlIENvbW1vbnMgb3IgSkRLIDEuNCApCisgICAgICAgIEl0IGRlcGVuZHMgb24gYXBhY2hlIEJDRUwgZm9yIEJ5dGVjb2RlIGVuZ2luZWVyaW5nLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41LjIgb3IgaGlnaGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qdXN0NGxvZy5zb3VyY2Vmb3JnZS5uZXQiPmh0dHA6Ly9qdXN0NGxvZy5zb3VyY2Vmb3JnZS5uZXQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bGJydWFuZEB3YW5hZG9vLmZyIj5MdWNhcyBCcnVhbmQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgTGljZW5zZSAxLjEuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkthbmFwdXRzIj48L2E+CisgICAgICAgIEthbmFwdXRzCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+S2FuYXB1dHMgaXMgYSBwYXJzZXIgZm9yIGphdmEgYmFzZWQgc2NyaXB0aW5nLiBJdCBpcyBhbgorICAgICAgICBpbnRlcnByZXRlciBmb3IgSmF2YS4gV2l0aCBLYW5hcHV0cyB5b3UgY2FuIHVzZSBKYXZhIGFzIGFuCisgICAgICAgIGludGVycHJldGVkIGxhbmd1YWdlOiBubyBtb3JlIGNvbXBpbGF0aW9uLCBlYWNoIGluc3RydWN0aW9uIGlzCisgICAgICAgIGV4ZWN1dGVkIHdoZW4geW91IHdyaXRlIGl0LiAgSXQgaXMgYSBzbWFsbCBwcm9ncmFtbWF0aW9uCisgICAgICAgIGxhbmd1YWdlIHRvIG1ha2Ugc2NyaXB0IGZpbGVzIGFib3ZlIEphdmEuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5LYW5hcHV0cyBBbnQgVGFzayBwcm92aWRlcyBhIHdheSB0byBhZGQgYW55IGtpbmQgb2YKKyAgICAgICAgcHJvZ3JhbW1hdGljIGZlYXR1cmVzIGluIHlvdXIgQW50IHNjcmlwdC4gVGhlIGNvZGUgeW91IGluc2VydAorICAgICAgICBzdGF5cyBPUyBpbmRlcGVuZGVudCAoYmVjYXVzZSBLYW5hcHV0cyB1c2VzIEphdmEpIGFuZCBpcworICAgICAgICBjb21wbGV0ZWx5IGludGVncmF0ZWQgd2l0aCBBbnQgYXMgeW91IGNhbiBnaXZlIEFudCBwcm9wZXJ0aWVzCisgICAgICAgIHRvIHRoZSBLYW5hcHV0cyBjb2RlIGFuZCBnZXQgYmFjayB0aGUgcmVzdWx0cyBpbiBvdGhlcgorICAgICAgICBwcm9wZXJ0aWVzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+TW9yZW92ZXIsIGFzIHlvdSBjYW4gaW52b2tlIGFueSBraW5kIG9mIEphdmEgY29kZSB3aXRoCisgICAgICAgIEthbmFwdXRzLCB5b3UgY2FuIHBvcHVwIHdpbmRvd3MgZnJvbSB5b3VyIEFudCBmaWxlIHRvIGFzayB0aGUKKyAgICAgICAgdXNlciB0byBkbyBhIGNob2ljZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuMiBhbmQgYWJvdmUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cua2FuYXB1dHMub3JnLyI+aHR0cDovL3d3dy5rYW5hcHV0cy5vcmcvPC9hPiA8YnIgLz4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5rYW5hcHV0cy5vcmcvYW50Lmh0bWwiPmh0dHA6Ly93d3cua2FuYXB1dHMub3JnL2FudC5odG1sPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmtmcmFAa2FuYXB1dHMub3JnIj5rZnJhQGthbmFwdXRzLm9yZzwvYT4KKyAgICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgRnJlZXdhcmUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iTGFUZVggVGFzayI+PC9hPgorICAgICAgICBMYVRlWCBUYXNrCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+U2ltcGxlIFRhc2sgdG8gdXNlIChQREYpTGFUZVgsIEJpYlRlWCwgTWFrZWluZGV4IGFuZCBHbG9zc1RlWCB0bworICAgICAgICBjcmVhdGUgeW91ciBkb2N1bWVudGF0aW9uLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS42LjIgYW5kIGFib3ZlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmRva3V0cmFuc2RhdGEuZGUvIj5odHRwOi8vd3d3LmRva3V0cmFuc2RhdGEuZGUvPC9hPjxiciAvPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmRva3V0cmFuc2RhdGEuZGUvYW50X2xhdGV4LyI+aHR0cDovL3d3dy5kb2t1dHJhbnNkYXRhLmRlL2FudF9sYXRleC88L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJtYWlsdG86amFsb21hQGRva3V0cmFuc2RhdGEuZGUiPmphbG9tYUBkb2t1dHJhbnNkYXRhLmRlPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBGcmVld2FyZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJNYWNrZXIiPjwvYT4KKyAgICAgICAgTWFja2VyCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QSBidWlsZC10aW1lIGFyY2hpdGVjdHVyYWwgdGVzdGluZyB0b29sLCBkZXNpZ25lZAorICAgICAgICB0byBtYWludGFpbiBjbGVhbiBsYXllcmluZyAvIHRpZXJpbmcgLyBtb2R1bGFyaXR5LgorICAgICAgICBNYWNrZXIgd29ya3MgYWdhaW5zdCBjb21waWxlZCBjbGFzcyBmaWxlcywgY2hlY2tpbmcKKyAgICAgICAgZGVwZW5kZW5jaWVzIGJldHdlZW4gY2xhc3NlcyBhZ2FpbnN0IGEgc2V0IG9mCisgICAgICAgIHBhdHRlcm4tYmFzZWQgYWNjZXNzIHJ1bGVzIHlvdSBzcGVjaWZ5IGZvciB5b3VyCisgICAgICAgIHByb2plY3QgaW4gYW4gWE1MIHJ1bGVzIGZpbGUuICBNYWNrZXIgZG9lc24ndCBwcmVzdW1lCisgICAgICAgIGFueXRoaW5nIGFib3V0IHlvdXIgYXJjaGl0ZWN0dXJlIC0tIHlvdSB3cml0ZSB0aGUKKyAgICAgICAgcnVsZXMsIGFuZCBNYWNrZXIga2VlcHMgeW91IGhvbmVzdCBhYm91dCB0aGVtLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41IGFuZCBoaWdoZXIgKDEuNCB1bnRlc3RlZCBidXQgbWF5IHdvcmspCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9pbm5pZy5uZXQvbWFja2VyLyI+aHR0cDovL2lubmlnLm5ldC9tYWNrZXIvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2lubmlnLm5ldC9tYWNrZXIvY29udGFjdC5odG1sIj5QYXVsIENhbnRyZWxsPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR05VIEdQTCAyLjAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iTWFrZVJ1blNjcmlwdCI+PC9hPgorICAgICAgICBNYWtlUnVuU2NyaXB0CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+TWFrZVJ1blNjcmlwdCBjcmVhdGVzIGEgcnVuIHNjcmlwdCBmb3IgeW91ciBhcHBsaWNhdGlvbi4gIEV2ZW4gaWYgeW91IGFyZSBkZXZlbG9waW5nIG9uIHdpbmRvd3MsCisgICAgICAgIHlvdSBjYW4gbWFrZSBhIHJ1biBzY3JpcHQgZm9yICpuaXggYW5kIHZpY2UgdmVyc2EuICBJZiB5b3UndmUgdXNlZCB0aGUgYnVpbHQtaW4gamF2YSB0YXNrIGJlZm9yZSwgeW91CisgICAgICAgIGFscmVhZHkga25vdyBob3cgdG8gdXNlIDkwJSBvZiBNYWtlUnVuU2NyaXB0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS43IGFuZCBoaWdoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9tYWtlcnVuc2NyaXB0LyI+aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9tYWtlcnVuc2NyaXB0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvZm9ydW0vP2dyb3VwX2lkPTIxMDIwNCI+TWFrZVJ1blNjcmlwdCBmb3J1bXM8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgMi4wCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Im10eHNsdCI+PC9hPgorICAgICAgICBtdHhzbHQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgbXR4c2x0IChNdWx0aS1YU0xUKSBleHRlbmRzIHRoZSBzdGFuZGFyZCBBbnQgInhzbHQvc3R5bGUiIHRhc2sKKyAgICAgICAgdG8gbWFrZSBpdCBlYXN5IHRvIHVzZSBtdWx0aXBsZSBYU0xUIGVuZ2luZXMgZHVyaW5nIHRoZSBzYW1lIGJ1aWxkLgorICAgICAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVncmVzc2lvbiB0ZXN0aW5nIG9mIFhTTFQgc2NyaXB0cyBhZ2FpbnN0IHNldmVyYWwKKyAgICAgICAgZW5naW5lcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vbXR4c2x0LnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9tdHhzbHQuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzphYmNvYXRlc0B0aGVPZmZpY2UubmV0Ij5BbnRob255IEIuIENvYXRlczwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0ibnNkMkxhVGVYIFRhc2siPjwvYT4KKyAgICAgICAgbnNkMkxhVGVYIFRhc2sKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5TaW1wbGUgVGFzayB0byB1c2UgbnNkMmx0eCB0byBidWlsZCB5b3VyIE5hc3NpLVNobmVpZGVybWFuIGRpYWdyYW1zLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS42LjIgYW5kIGFib3ZlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmRva3V0cmFuc2RhdGEuZGUvIj5odHRwOi8vd3d3LmRva3V0cmFuc2RhdGEuZGUvPC9hPjxiciAvPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmRva3V0cmFuc2RhdGEuZGUvYW50X25zZDJsdHgvIj5odHRwOi8vd3d3LmRva3V0cmFuc2RhdGEuZGUvYW50X25zZDJsdHgvPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmphbG9tYUBkb2t1dHJhbnNkYXRhLmRlIj5qYWxvbWFAZG9rdXRyYW5zZGF0YS5kZTwvYT4KKyAgICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgRnJlZXdhcmUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iTnVyZmx1Z2VsIEFudFNjcmlwdCBWaXN1YWxpemVyIj48L2E+CisgICAgICAgIE51cmZsdWdlbCBBbnRTY3JpcHQgVmlzdWFsaXplcgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBOdXJmbHVnZWwgQW50U2NyaXB0IFZpc3VhbGl6ZXIgdGFrZXMgeW91ciBidWlsZCBmaWxlLAorICAgICAgICBmaW5kcyBhbnkgaW1wb3J0ZWQgYnVpbGQgZmlsZXMsIGFuZCBzaG93cyBhbGwgcmVsYXRpb25zaGlwcworICAgICAgICBiZXR3ZWVuIHRhcmdldHMsIHRhc2tkZWZzLCBtYWNyb2RlZnMsIEFudCBhbmQgQW50Y2FsbHM7IG91dHB1dAorICAgICAgICBvcHRpb25zIGluY2x1ZGUgUERGLCBTVkcsIGFuZCBQTkcuICBNYW55IG9wdGlvbnMgaW5jbHVkaW5nCisgICAgICAgIGdyb3VwaW5nIGJ5IGJ1aWxkIGZpbGUsIGluY2x1c2lvbi9leGNsdXNpb24gb2YgdGFyZ2V0cywKKyAgICAgICAgdGFza2RlZnMsIGltcG9ydHMsIGV0Yy4gIEluc3RhbGxhdGlvbiBpcyB2aWEgSmF2YSBXZWJTdGFydCwgc28KKyAgICAgICAgeW91J2xsIGFsd2F5cyBoYXZlIHRoZSBmcmVzaGVzdCB2ZXJzaW9uIGF2YWlsYWJsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuMSBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5udXJmbHVnZWwuY29tL3dlYnN0YXJ0L0FudFNjcmlwdFZpc3VhbGl6ZXIvIj5odHRwOi8vd3d3Lm51cmZsdWdlbC5jb20vd2Vic3RhcnQvQW50U2NyaXB0VmlzdWFsaXplci88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBkYnVsbGFyZCAmbHQ7YXQmZ3Q7IG51cmZsdWdlbCAmbHQ7ZG90Jmd0OyBjb20gKGVtYWlsCisgICAgICAgICAgICB3aWxsIHJlY2VpdmUgYSBjaGFsbGVuZ2UgdG8gd2VlZCBvdXQgc3BhbSkKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Ik9yYW5nZXZvbHQgQW50IFRhc2tzIj48L2E+CisgICAgICAgIE9yYW5nZXZvbHQgQW50IFRhc2tzCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+T3Jhbmdldm9sdCBBTlQgVGFza3MgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIGZvciBBcGFjaGUKKyAgICAgICAgQW50LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIE9yYW5nZXZvbHQgQW50IFRhc2tzIGNvbGxlY3Rpb25zIHByb3ZpZGVzIGEgYnVuY2ggb2YKKyAgICAgICAgQXBwcGxpY2F0aW9uIERlcGxveW1lbnQgcmVsYXRlZCBUYXNrcyBmcm9tIHdpbmRvd3Mgc3BlY2lmaWMKKyAgICAgICAgdGFza3MgKHJlZ2lzdHJ5IGFjY2VzcywgZXhlY3V0YWJsZSBnZW5lcmF0aW9uKSwgKm5peCBzcGVjaWZpYworICAgICAgICB0YXNrcyAoa2RlL2dub21lIHNob3J0Y3V0IGdlbmVyYXRpb24pIHRvIG1hbnkgdXNlZnVsIHV0aWxpdHkKKyAgICAgICAgdGFza3MgbGlrZSBqbmxwIGdlbmVyYXRpb24uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUgb3IgYWJvdmUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9vdmFudHRhc2tzIj5odHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL292YW50dGFza3M8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86aW5mb0Byb3hlcy5jb20iPmluZm9Acm94ZXMuY29tPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0icGFjayI+PC9hPgorICAgICAgICBwYWNrCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+cGFjayBpcyBhIHRhc2sgdG8gYnVpbGQgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIEpBUiB0byBsaW5rCisgICAgICAgIGFuZCBydW4gb25lIG9yIG1vcmUgY2xhc3Nlcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc2FkdW4tdXRpbC5zb3VyY2Vmb3JnZS5uZXQvcGFjay5odG1sIj5odHRwOi8vc2FkdW4tdXRpbC5zb3VyY2Vmb3JnZS5uZXQvcGFjay5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmNyaXN0aWFub0B4dHJhY3Rvci5jb20iPkNyaXN0aWFubyBTYWR1bjwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJQQ1QiPjwvYT4KKyAgICAgICAgUENUCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UENUIGlzIGEgdGFzayB0byBjb21waWxlIFByb2dyZXNzIGNvZGUsIGFuZCBpbiBhIG1vcmUgZ2VuZXJhbAorICAgICAgICB3YXksIHRvIGRlYWwgd2l0aCBQcm9ncmVzcyBwcm9jZWR1cmVzIGFuZCBkYXRhYmFzZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3BjdC5zb3VyY2Vmb3JnZS5uZXQiPmh0dHA6Ly9wY3Quc291cmNlZm9yZ2UubmV0PC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmp1c3R1c19waGVuaXhAdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5HaWxsZXMgUVVFUlJFVDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbmNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iUGVzdGVyQ2F0IEFudCBUb29sa2l0Ij48L2E+CisgICAgICAgIFBlc3RlckNhdCBBbnQgVG9vbGtpdAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlBlc3RlckNhdCBpcyBhIHdlYiB0ZXN0aW5nIHRvb2wgdGhhdCB3YXMgZGVzaWduZWQgdG8KKyAgICAgICAgICAgcGVyZm9ybSBmdW5jdGlvbmFsIHRlc3RpbmcgZm9yIHdlYiBhcHBsaWNhdGlvbnMuIFRoZSBQZXN0ZXJDYXQKKyAgICAgICAgICAgQW50IFRvb2xraXQgY29udGFpbnMgdGFza3MgdG8gcGxheWJhY2sgdGVzdCBzY3JpcHRzIGFuZCBjcmVhdGUKKyAgICAgICAgICAgSFRNTCByZXBvcnRzLgorICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cucGVzdGVyY2F0LmNvbS8iPmh0dHA6Ly93d3cucGVzdGVyY2F0LmNvbS88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21tZXJjaWFsCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlBNRCI+PC9hPgorICAgICAgICBQTUQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5QTUQgY2hlY2tzIEphdmEgc291cmNlIGNvZGUgZm9yIHVudXNlZCB2YXJpYWJsZXMsCisgICAgICAgIHVubmVjZXNzYXJ5IG9iamVjdCBjcmVhdGlvbiwgZXRjPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQgYW5kIGhpZ2hlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcG1kLnNmLm5ldC8iPmh0dHA6Ly9wbWQuc2YubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzp0Y29wZWxhbmRAYXBhY2hlLm9yZyI+VG9tIENvcGVsYW5kPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJQUmVzIj48L2E+CisgICAgICAgIFBSZXMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5QUmVzIGlzIHNob3J0IGZvciBQcm9wZXJ0eSBSZXNvdXJjZXMgYW5kIHdpbGwgZ2VuZXJhdGUgYSBKYXZhIHNvdXJjZQorICAgICAgICAgICBmaWxlIGZyb20gbmFtZT12YWx1ZSBwYWlyIC5wcm9wZXJ0eSBmaWxlcyB3aGljaCBjYW4gYmUgY29tcGlsZWQgbGlrZSBhbnkKKyAgICAgICAgICAgb3RoZXIgY2xhc3MuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUgYW5kIGxhdGVyIChtYXkgd29yayB3aXRoIGVhcmxpZXIpCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9tc2VyaWVzLnNvdXJjZWZvcmdlLm5ldCI+aHR0cDovL21zZXJpZXMuc291cmNlZm9yZ2UubmV0PC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dlYi51a29ubGluZS5jby51ay9tc2VyaWVzL2NvbnRhY3QuaHRtbCI+TVNlcmllczwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExHUEwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iUHJvR3VhcmQiPjwvYT4KKyAgICAgICAgUHJvR3VhcmQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vcHJvZ3VhcmQuc291cmNlZm9yZ2UubmV0LyI+UHJvR3VhcmQ8L2E+IGlzCisgICAgICAgIGEgZnJlZSBKYXZhIGNsYXNzIGZpbGUgc2hyaW5rZXIgYW5kIG9iZnVzY2F0b3IuICBJdCBjYW4gZGV0ZWN0CisgICAgICAgIGFuZCByZW1vdmUgdW51c2VkIGNsYXNzZXMsIGZpZWxkcywgbWV0aG9kcywgYW5kIGF0dHJpYnV0ZXMuIEl0CisgICAgICAgIGNhbiB0aGVuIHJlbmFtZSB0aGUgcmVtYWluaW5nIGNsYXNzZXMsIGZpZWxkcywgYW5kIG1ldGhvZHMKKyAgICAgICAgdXNpbmcgc2hvcnQgbWVhbmluZ2xlc3MgbmFtZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFRlc3RlZCB3aXRoIDEuNS4gU2hvdWxkIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcHJvZ3VhcmQuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL3Byb2d1YXJkLnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcHJvZ3VhcmQuc291cmNlZm9yZ2UubmV0L2ZlZWRiYWNrLmh0bWwiPkZlZWRiYWNrIFBhZ2U8L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9InByb3BlcnRpZXMyamF2YSI+PC9hPgorICAgICAgICBwcm9wZXJ0aWVzMmphdmEKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Qcm9wZXJ0aWVzMkphdmEgaXMgYW4gQW50IHRhc2sgZm9yIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mCisgICAgICAgIGphdmEgIi5wcm9wZXJ0aWVzIiBmaWxlcyB0byAiLmphdmEiIGZpbGVzIGV4dGVuZGluZyB0aGUKKyAgICAgICAgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNiBvciBhYm92ZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcHJvcGVydGllczJqYXZhLmpheWVmZW0uZGUvIj5odHRwOi8vcHJvcGVydGllczJqYXZhLmpheWVmZW0uZGUvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnByb3BlcnRpZXMyamF2YUBqYXllZmVtLmRlIj5KYW4tRnJpZWRyaWNoIE11dHRlcjwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJQdXJnZSI+PC9hPgorICAgICAgICBQdXJnZQorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlB1cmdlIGRlbGV0ZXMgYWxsIGJ1dCB0aGUgbW9zdCByZWNlbnQgZmV3IGZpbGVzIGZyb20gYSBmaWxlc2V0LgorICAgICAgICBGb3IgZXhhbXBsZTogaWYgeW91IGhhdmUgZ2VuZXJhdGVkIGZpbGVzIChsb2dzLCAuZWFyLCAud2FyLCAuamFyCisgICAgICAgIGV0YykgYWNjdW11bGF0aW5nIGluIGEgZGlyZWN0b3J5LCB0aGUgcHVyZ2UgdGFzayB3aWxsIGFsbG93IHlvdQorICAgICAgICB0byBkZWxldGUgdGhlIG9sZGVyIGZpbGVzLCBrZWVwaW5nIGp1c3QgdGhlIG1vc3QgcmVjZW50IG9uZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQgb3IgYWJvdmUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5kYWxsYXdheS5jb20vYW50LyI+aHR0cDovL3d3dy5kYWxsYXdheS5jb20vYW50LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpwdXJnZUBkYWxsYXdheS5jb20iPlJpY2hhcmQgRGFsbGF3YXk8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMR1BMCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlJlZmFjdG9ySVQiPjwvYT4KKyAgICAgICAgUmVmYWN0b3JJVAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlJlZmFjdG9ySVQgaW5jbHVkZXMgYW4gQW50IHRhc2sgZm9yIG1ldHJpY3MgYW5kIGF1ZGl0cy4KKyAgICAgICAgUmVmYWN0b3JJVCBpcyBhIEphdmEgcmVmYWN0b3JpbmcsIGF1ZGl0IGFuZCBtZXRyaWNzIHRvb2wuCisgICAgICAgIEl0IHBsdWdzIGludG8gbWFqb3IgSmF2YSBJREVzLCBhbHNvIHJ1bnMgc3RhbmQtYWxvbmUgd2l0aAorICAgICAgICBhIEdVSSBhbmQgYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41IGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnJlZmFjdG9yaXQuY29tLyI+aHR0cDovL3d3dy5yZWZhY3Rvcml0LmNvbS88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86c3VwcG9ydEByZWZhY3Rvcml0LmNvbSI+c3VwcG9ydEByZWZhY3Rvcml0LmNvbTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbW1lcmNpYWwuIChGcmVlIGZvciBhY2NyZWRpdGVkIG9wZW4gc291cmNlIHByb2R1Y3RzLCBzZWUKKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cucmVmYWN0b3JpdC5jb20vb3NjIj5odHRwOi8vd3d3LnJlZmFjdG9yaXQuY29tL29zYzwvYT4uKQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJSZWZsZWN0YW50IFRhc2siPjwvYT4KKyAgICAgICAgUmVmbGVjdGFudCBUYXNrCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBpcyBhIHRhc2sgZm9yIHJlZmxlY3Rpb24gaW52b2NhdGlvbiBmcm9tIHdpdGhpbiBhbnQgYnVpbGQgZmlsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNSBvciBhYm92ZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3JlZmxlY3RhbnQvIj5odHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3JlZmxlY3RhbnQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnN2X2FudEBtYWlsLmJnIj5zdl9hbnRAbWFpbC5iZzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJydW5kb2MiPjwvYT4KKyAgICAgICAgcnVuZG9jCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QSB0YXNrIGRlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGUgc2luZ2xlLXNvdXJjaW5nIG9mIHByb2dyYW0KKyAgICAgICAgZG9jdW1lbnRhdGlvbi4gUnVuZG9jIHJlcGxhY2VzIHNwZWNpYWwgY29tbWFuZHMKKyAgICAgICAgKGluIHRoZSBmb3JtYXQgPGk+QEBydW5kb2M6Y29tbWFuZCBwYXJhbTEgcGFyYW0yLi4uQEA8L2k+KSBlbWJlZGRlZAorICAgICAgICB3aXRoaW4gdGV4dCBmaWxlcyB3aXRoIHRoZWlyIG91dHB1dCBpbiBhCisgICAgICAgIHNwZWNpZmllZCBmb3JtYXQuIEN1cnJlbnRseSwgb25seSBEb2Nib29rIGZvcm1hdCBpcyBzdXBwb3J0ZWQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5SdW5kb2Mgd2FzIHdyaXR0ZW4gdG8ga2VlcCBzYW1wbGUgY29kZSBvdXRwdXQgaW4gcHJvZ3JhbQorICAgICAgICBkb2N1bWVudGF0aW9uIHN5bmNocm9uaXplZCB3aXRoIHRoZSBhY3R1YWwgb3V0cHV0CisgICAgICAgIG9mIHRoZSBjdXJyZW50IGNvZGUsIGJ5IHJ1bm5pbmcgdGhlIHJlZmVyZW5jZWQgY29kZSB3aGVuIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGlzIGJ1aWx0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBUZXN0ZWQgd2l0aCAxLjYgIFNob3VsZCB3b3JrIHdpdGggYWxsIHZlcnNpb25zLgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm1hcnRpYW5zb2Z0d2FyZS5jb20vbGFiL2luZGV4Lmh0bWwjcnVuZG9jIj5odHRwOi8vd3d3Lm1hcnRpYW5zb2Z0d2FyZS5jb20vbGFiL2luZGV4Lmh0bWwjcnVuZG9jPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5tYXJ0aWFuc29mdHdhcmUuY29tL2NvbnRhY3QuaHRtbCI+TWFydHkgTGFtYjwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFJldmlzZWQgQlNECisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlNlcmlhbFZlciI+PC9hPgorICAgICAgICBTZXJpYWxWZXIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5TZXJpYWxWZXIgYWRkcyB0aGUgSmF2YSBzZXJpYWx2ZXIgZnVuY3Rpb25hbGl0eSB0byBBcGFjaGUKKyAgICAgICAgQW50LiAgVGhpcyBwcm9qZWN0IGFkZHMgVGFza3MgYW5kIEZpbHRlclJlYWRlcnMgdG8gZ2V0LCB0bworICAgICAgICBpbnNlcnQgYW5kIHRvIG1vZGlmeSB0aGUgc2VyaWFsVmVyc2lvblVJRCBpbiB0aGUgc291cmNlIGNvZGUKKyAgICAgICAgb2YgYSBzZXJpYWxpemFibGUgY2xhc3MuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUuMSBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NlcmlhbHZlci5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vc2VyaWFsdmVyLnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zZXJpYWx2ZXItZGV2ZWxvcG1lbnQiPmRldmVsb3BlciBtYWlsaW5nIGxpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJTaW1pYW4iPjwvYT4KKyAgICAgICAgU2ltaWFuCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+U2ltaWFuIChTaW1pbGFyaXR5IEFuYWx5c2VyKSBpZGVudGlmaWVzIGR1cGxpY2F0aW9uIGluIEphdmEsCisgICAgICAgIEMjLCBDLCBDUFAsIENPQk9MLCBKU1AsIEhUTUwgc291cmNlIGNvZGUgYW5kIGV2ZW4gcGxhaW4gdGV4dCBmaWxlcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNS4xIGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnJlZGhpbGxjb25zdWx0aW5nLmNvbS5hdS9wcm9kdWN0cy9zaW1pYW4vIj4KKyAgICAgICAgICAgIGh0dHA6Ly93d3cucmVkaGlsbGNvbnN1bHRpbmcuY29tLmF1L3Byb2R1Y3RzL3NpbWlhbi88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86c2ltaWFuLXVzZXItc3Vic2NyaWJlQHJlZGhpbGxjb25zdWx0aW5nLmNvbS5hdSI+CisgICAgICAgICAgICBzaW1pYW4tdXNlci1zdWJzY3JpYmVAcmVkaGlsbGNvbnN1bHRpbmcuY29tLmF1IChVc2VyIE1haWxpbmdsaXN0KQorICAgICAgICAgICAgPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tbWVyY2lhbCwgRnJlZSBMaWNlbnNlcyBhdmFpbGFibGUgZm9yIE5vbi1Db21tZXJjaWFsIFByb2plY3RzCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlNtYXJ0QW5hbHl6ZXIiPjwvYT4KKyAgICAgICAgU21hcnRBbmFseXplcgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlBvd2VyZnVsIGFuYWx5c2lzIG9mIGRlcGVuZGVuY2llcyBiZXR3ZWVuIEphdmEgY2xhc3Nlcy4KKyAgICAgICAgT25seSBhZmZlY3RlZCBjbGFzc2VzIHdpbGwgYmUgcmVjb21waWxlZCBhbmQgaXQgY2FuIGJlIHVzZWQKKyAgICAgICAgd2l0aCBhbnkgYnl0ZWNvZGUgY29tcGlsZXIuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBBbnQgdmVyc2lvbiAxLjUuMQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc21hcnRhbmFseXplci5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vc21hcnRhbmFseXplci5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9zbWFydGFuYWx5emVyIj5zdXBwb3J0IGF0IHNvdXJjZWZvcmdlIHByb2plY3QgcGFnZTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIChHUEwpCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9InNuaXAiPjwvYT4KKyAgICAgICAgc25pcAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgdGFzayBkZXNpZ25lZCB0byBoZWxwIHdpdGggdGhlIHNpbmdsZS1zb3VyY2luZyBvZiBwcm9ncmFtIGRvY3VtZW50YXRpb24uCisgICAgICAgIFNuaXAgZXh0cmFjdHMgc25pcHBldHMgb2YgdGV4dCBmcm9tIGZpbGVzLCBwbGFjaW5nIHRoZW0gaW50byBwcm9wZXJ0aWVzIGluIHRoZSBBbnQgcHJvamVjdC4KKyAgICAgICAgVGhlc2UgcHJvcGVydGllcyBjYW4gdGhlbiBiZSB1c2VkIGJ5IGFueSBvdGhlciBBbnQgdGFzaywgYW5kIGFyZSBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4KKyAgICAgICAgcmVmZXJlbmNlZCBieSAmbHQ7ZmlsdGVyJmd0O3Mgd2l0aGluIHRoZSAmbHQ7Y29weSZndDsgdGFzay48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlNuaXAgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiB0byBrZWVwIHNuaXBwZXRzIG9mIHNhbXBsZSBjb2RlIGluIEFQSSBkb2N1bWVudGF0aW9uIHN5bmNocm9uaXplZAorICAgICAgICB3aXRoIHRoZSBhY3R1YWwgc2FtcGxlIGNsYXNzZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFRlc3RlZCB3aXRoIDEuNS4xLiAgU2hvdWxkIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFydGlhbnNvZnR3YXJlLmNvbS9sYWIvaW5kZXguaHRtbCNzbmlwIj5odHRwOi8vd3d3Lm1hcnRpYW5zb2Z0d2FyZS5jb20vbGFiL2luZGV4Lmh0bWwjc25pcDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFydGlhbnNvZnR3YXJlLmNvbS9jb250YWN0Lmh0bWwiPk1hcnR5IExhbWI8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBSZXZpc2VkIEJTRAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJzcGVsbCI+PC9hPgorICAgICAgICBzcGVsbAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlNwZWxsIENoZWNrIGNoZWNrcyB0aGUgc3BlbGxpbmcgb2YgYWxsIGZpbGVzIGluIGEgZGlyZWN0b3J5LiBDb2RlIGlzIGJyb2tlbiBpbnRvCisgICAgICAgIHNpbmdsZSB3b3JkcyBhbmQgY29tcGFyZWQgdG8gYSBkaWN0aW9uYXJ5LiBJZiB0aGUgd29yZHMgYXJlIG5vdCBpbiB0aGUgZGljdGlvbmFyeQorICAgICAgICB0aGV5IGFyZSB3cml0dGVuIHRvIGEgZmlsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgIDwhLS0gSkhNOiBhc2tlZCBSb2IgZm9yIHRoYXQ7IGhlJ2xsIHBpbmcgbWUgaWYgaGUgaXMgYmFjayBhdCBob21lIC0tPiAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3JvYm1heWhldy5jb20vYW50c3BlbGwvYW50c3BlbGx0YXNrLmh0bWwiPmh0dHA6Ly9yb2JtYXloZXcuY29tL2FudHNwZWxsL2FudHNwZWxsdGFzay5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5yb2JtYXloZXcuY29tLyI+Um9iIE1heWhldzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgICA8IS0tIHNhbWUgYXMgYWJvdmUgLS0+IAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJTUUwgQ29tcGlsZXIgKFNRTEMpIj48L2E+CisgICAgICAgIFNRTCBDb21waWxlciAoU1FMQykKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5TUUwgQ29tcGlsZXIgKFNRTEMpIGNvbXBpbGVzIGRhdGFiYXNlIG1ldGFkYXRhIGFuZCBTUUwgc3RhdGVtZW50cyBpbnRvIGRhdGEgYWNjZXNzIGFuZCBkYXRhIHRyYW5zZmVyIGNsYXNzZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFRlc3RlZCB3aXRoIEFudCAxLjUuNCBhbmQgMS42LjUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5oYW1tdXJhcGkuYml6L3Byb2R1Y3RzL3NxbGMiPmh0dHA6Ly93d3cuaGFtbXVyYXBpLmJpei9wcm9kdWN0cy9zcWxjPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5oYW1tdXJhcGkuYml6L2hhbW11cmFwaS1iaXovZWYveG1lbnUvY29udGFjdC5odG1sIj5Qcm9qZWN0IENvbnRhY3QgUGFnZTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExHUEwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iU1FMVW5pdCI+PC9hPgorICAgICAgICBTUUxVbml0CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+U1FMVW5pdCBpcyBhIHJlZ3Jlc3Npb24gYW5kIHVuaXQgdGVzdGluZyBoYXJuZXNzIGZvciB0ZXN0aW5nCisgICAgICAgICBkYXRhYmFzZSBzdG9yZWQgcHJvY2VkdXJlcy4gVGhlIHRlc3Qgc3VpdGUgaXMgd3JpdHRlbiBhcyBhbiBYTUwgZmlsZS4KKyAgICAgICAgIFRoZSBTUUxVbml0IGhhcm5lc3MgaXRzZWxmIGlzIHdyaXR0ZW4gaW4gSmF2YSBhbmQgdXNlcyB0aGUgSlVuaXQgdW5pdAorICAgICAgICAgdGVzdGluZyBmcmFtZXdvcmsgdG8gY29udmVydCB0aGUgWE1MIHRlc3Qgc3BlY2lmaWNhdGlvbnMgdG8gSkRCQyBjYWxscworICAgICAgICAgYW5kIGNvbXBhcmUgdGhlIHJlc3VsdHMgZ2VuZXJhdGVkIGZyb20gdGhlIGNhbGxzIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAgICAgcmVzdWx0cy4gSXQgYWxzbyBwcm92aWRlcyB0aGUgJmx0O3NxbHVuaXQmZ3Q7IHRhc2sgdG8gcnVuIHRoZSB0ZXN0cworICAgICAgICAgZnJvbSBhIGJ1aWxkIHNjcmlwdC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVGVzdGVkIHdpdGggQW50IDEuNgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3FsdW5pdC5zb3VyY2Vmb3JnZS5uZXQiPmh0dHA6Ly9zcWx1bml0LnNvdXJjZWZvcmdlLm5ldDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvZm9ydW0vP2dyb3VwX2lkPTc3ODMyIj5Qcm9qZWN0IGZvcnVtczwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlN0eWxlciI+PC9hPgorICAgICAgICBTdHlsZXIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgc3R5bGVyIHRhc2sgbWFrZXMgdXNlZnVsIGNvbWJpbmF0aW9ucyBvZiBYU0xUIHRyYW5zZm9ybWF0aW9ucworICAgICAgICBlYXN5IHRvIHNwZWNpZnkgaW4gYW4gQW50IGJ1aWxkIGZpbGUuIExpa2UgdGhlIGJ1aWx0LWluIEFudCB0YXNrCisgICAgICAgIHN0eWxlLCBzdHlsZXIgY2FuIGFwcGx5IGEgc2luZ2xlIHRyYW5zZm9ybWF0aW9uIHRvIGEgc2V0IG9mIFhNTCBmaWxlcy4KKyAgICAgICAgQnV0IGl0IGNhbiBhbHNvOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5oYW5kbGUgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb25zLCBpbiBwYXJhbGxlbCBvciBwaXBlbGluZWQuPC9saT4KKyAgICAgICAgICA8bGk+ZW5hYmxlIHRyYW5zZm9ybWF0aW9ucyB0aGF0IHNwbGl0IG9yIG1lcmdlIGZpbGVzPC9saT4KKyAgICAgICAgICA8bGk+cHJvY2VzcyBub24tWE1MIGZpbGVzLCBlc3BlY2lhbGx5IEhUTUwgKGJhc2VkIG9uIEpUaWR5KTwvbGk+CisgICAgICAgICAgPGxpPmFwcGx5IG5vbi1YU0xUIHRyYW5zZm9ybWF0aW9uLCBlc3BlY2lhbGx5ICJyZWd1bGFyCisgICAgICAgICAgZnJhZ21lbnRhdGlvbnMiPC9saT4KKyAgICAgICAgICA8bGk+dXNlIGFueSBjdXN0b20gWE1MUmVhZGVyIG9yIFhNTEZpbHRlciBjbGFzcyB0byBoYW5kbGUgbmV3IGZpbGUKKyAgICAgICAgICBmb3JtYXRzIGFuZCB0cmFuc2Zvcm1hdGlvbiB0ZWNobmlxdWVzLjwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmxhbmdkYWxlLmNvbS5hdS9zdHlsZXIvIj5odHRwOi8vd3d3LmxhbmdkYWxlLmNvbS5hdS9zdHlsZXIvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmFkdkBsYW5nZGFsZS5jb20uYXUiPkFybm9sZCBkZVZvczwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExHUEwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iU3ludGF4Ij48L2E+CisgICAgICAgIFN5bnRheAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRyYW5zZm9ybXMgc291cmNlIGZpbGVzIGludG8gSFRNTCBkb2N1bWVudHMgd2l0aCBzeW50YXgKKyAgICAgICAgaGlnaGxpZ2h0aW5nLiBJdCBjYW4gaGFuZGxlIGEgdmFyaWV0eSBvZiBzb3VyY2UgZmlsZXMKKyAgICAgICAgaW5jbHVkaW5nIEphdmEsIEhUTUwsIEMvQysrLCBTUUwsIGFuZCBKYXZhIHByb3BlcnRpZXMuICBDb2xvcnMKKyAgICAgICAgZm9yIGVsZW1lbnRzIGFyZSBzcGVjaWZpZWQgdXNpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cy4gIFRoZQorICAgICAgICBvdXRwdXQgY2FuIGJlIHRlbXBsYXRlZCBmb3IgZWFzeSBpbnRlZ3JhdGlvbiB3aXRoIGEgc2l0ZSdzCisgICAgICAgIGxvb2sgYW5kIGZlZWwuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL29zdGVybWlsbGVyLm9yZy9zeW50YXgvYW50Lmh0bWwiPmh0dHA6Ly9vc3Rlcm1pbGxlci5vcmcvc3ludGF4L2FudC5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL29zdGVybWlsbGVyLm9yZy9jb250YWN0LnBsP3JlZ2FyZGluZz1TeW50YXgrSGlnaGxpZ2h0aW5nIj5TdGVwaGVuIE9zdGVybWlsbGVyPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iVGVzdFNldEdlbmVyYXRvciI+PC9hPgorICAgICAgICBUZXN0U2V0R2VuZXJhdG9yCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIFRlc3RTZXRHZW5lcmF0b3IgaXMgYW4gYW50IHRhc2sgZm9yIGdlbmVyYXRpbmcgcHJvcGVydHkgZmlsZXMgd2l0aAorICAgICAgICB0ZXN0c2V0cyBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiBTUUwgcXVlcmllcyBhbmQgdmFsaWRhdGlvbiBwbHVnLWlucy4gVmVyeQorICAgICAgICB1c2VmdWxsIHdoZW4gYnVpbGRpbmcgdW5pdCB0ZXN0cyB0aGF0IG1ha2UgdXNlIG9mIGNoYW5naW5nIGRhdGFzZXRzLiBUaGlzCisgICAgICAgIHRhc2sgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBBbnQgU1FMIHRhc2suIEhzcWxkYiBpcyB1c2VkIGZvciBib3RoIHRoZQorICAgICAgICBleGFtcGxlcyBhbmQgdGhlIHVuaXR0ZXN0cy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQU5UIDEuNCAob3IgbGF0ZXIpCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnR0ZXN0c2V0Z2VuLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnR0ZXN0c2V0Z2VuLnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bS5jLmphbnNlbkBwbGFuZXQubmwiPm0uYy5qYW5zZW5AcGxhbmV0Lm5sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR1BMCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlRpZHkgSW1wb3J0cyAoVGltKSI+PC9hPgorICAgICAgICBUaWR5IEltcG9ydHMgKFRpbSkKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaW0gaXMgYSBoYW5keSB1dGlsaXR5IHRoYXQgY2FuIGJlIGV4ZWN1dGVkIG9uIHRoZSBjb21tYW5kCisgICAgICAgIGxpbmUgb3IgdmlhIEFudCB0aGF0IGF1dG9tYXRpY2FsbHkgZm9ybWF0cyB5b3VyIGltcG9ydAorICAgICAgICBkZWNsYXJhdGlvbnMuIFRpbSBpcyBjYXBhYmxlIG9mIHJlbW92aW5nIHVudXNlZCBpbXBvcnRzLAorICAgICAgICBleHBhbmRpbmcgb3IgY29sbGFwc2luZyBpbXBvcnRzIGFuZCBldmVuIG9yZ2FuaXNpbmcgdGhlbSBpbnRvCisgICAgICAgIHByZS1kZXRlcm1pbmVkIGdyb3Vwcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuMyBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5jaGl2ZS5jb20vdGltLmh0bSI+aHR0cDovL3d3dy5jaGl2ZS5jb20vdGltLmh0bTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpzdXBwb3J0QGNoaXZlLmNvbSI+c3VwcG9ydEBjaGl2ZS5jb208L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21tZXJjaWFsCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlRpbmlBbnQiPjwvYT4KKyAgICAgICAgVGluaUFudAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRpbmlBbnQgaXMgYW4gQW50IHRhc2sgdG8gc3VwcG9ydCBidWlsZGluZyBhcHBsaWNhdGlvbnMgZm9yCisgICAgICAgIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmlidXR0b24uY29tL1RJTkkvIj5USU5JPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuMiB0byAxLjQuMQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdGluaWFudC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vdGluaWFudC5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmtlbGx5QGFkMTQ0MC5uZXQiPlNlYW4gS2VsbHk8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBCU0QtbGlrZSBsaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlRyYW5zZm9ybWljYSI+PC9hPgorICAgICAgICBUcmFuc2Zvcm1pY2EKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UcmFuc2Zvcm1pY2EgaXMgYSB2ZXJzYXRpbGUgYW5kIGV4dGVuc2libGUgY29kZSBnZW5lcmF0b3IuCisgICAgICAgICAgIFN1cHBvcnRzIG11bHRpcGxlIHNvdXJjZSBtb2RlbHMgaW5jbHVkaW5nIGRhdGFiYXNlIG1ldGFkYXRhLCBKYXZhIHNvdXJjZSBmaWxlcywgZ3JhbW1hcgorICAgICAgICAgICBmaWxlcyBhbmQgY3VzdG9tIG1vZGVscy4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFRlc3RlZCB3aXRoIEFudCAxLjUueCBhbmQgMS42LjUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5oYW1tdXJhcGkuYml6L3Byb2R1Y3RzL3RyYW5zZm9ybWljYSI+aHR0cDovL3d3dy5oYW1tdXJhcGkuYml6L3Byb2R1Y3RzL3RyYW5zZm9ybWljYTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaGFtbXVyYXBpLmJpei9oYW1tdXJhcGktYml6L2VmL3htZW51L2NvbnRhY3QuaHRtbCI+UHJvamVjdCBDb250YWN0IFBhZ2U8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMR1BMCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlZlbnVzIEFwcGxpY2F0aW9uIFB1Ymxpc2hlcidzIChWYW1wKSBBbnQgVGFzayBTdWl0ZSI+PC9hPgorICAgICAgICBWZW51cyBBcHBsaWNhdGlvbiBQdWJsaXNoZXIncyAoVmFtcCkgQW50IFRhc2sgU3VpdGUKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5WZW51cyBBcHBsaWNhdGlvbiBQdWJsaXNoZXIncyAoVmFtcCkgQW50IFRhc2sgU3VpdGUgYWxsb3dzCisgICAgICAgIHlvdSB0byBzaWduIGFuZCBwYWNrYWdlIHlvdXIgYXBwbGljYXRpb25zIGludG8gcmVsb2NhdGFibGUgV2ViCisgICAgICAgIEFyY2hpdmVzIHRoYXQgeW91IGNhbiBkcm9wIGludG8geW91ciB3ZWIgc2VydmVyIGZvcgorICAgICAgICBzaW5nbGUtY2xpY2sgbGF1bmNoaW5nIHVzaW5nIEphdmEgV2ViIFN0YXJ0IG9yIGludG8gc2luZ2xlCisgICAgICAgIEphdmEgQXJjaGl2ZSBpbnN0YWxsZXJzIHRoYXQgc2VydmUgdXAgdGhlaXIgY29udGVudCB0aHJvdWdoIGEKKyAgICAgICAgYnVpbHQtaW4sIG11bHRpLXRocmVhZGVkLCB1bHRyYSBsaWdodC13ZWlnaHQgd2ViIHNlcnZlci48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuMiBhbmQgMS4zCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS92YW1wMjAxL2FudC5odG1sIj5odHRwOi8vd3d3Lmdlb2NpdGllcy5jb20vdmFtcDIwMS9hbnQuaHRtbDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzp2YW1wMjAxQHlhaG9vLmNvbSI+R2VyYWxkIEJhdWVyPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iVmVyc2lvbl9Ub29sIj48L2E+CisgICAgICAgIFZlcnNpb25fVG9vbAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgdmVyc2lvbmluZyB0b29sIGZvciBBbnQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUuMQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LnJ5YW5ncmllci5jb20vIj5odHRwOi8vYW50LnJ5YW5ncmllci5jb20vPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnZlcnNpb25fdG9vbEByeWFuZ3JpZXIuY29tIj52ZXJzaW9uX3Rvb2xAcnlhbmdyaWVyLmNvbTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEJTRCBsaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlZQUCI+PC9hPgorICAgICAgICBWUFAKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5WUFAgcHJvdmlkZXMgZ2VuZXJhbCBmaWxlIHByZXByb2Nlc3Npbmcgc3VwcG9ydCBiYXNlZCBvbgorICAgICAgICB0aGUgVmVsb2NpdHkgVGVtcGxhdGUgRW5naW5lLiAgVGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBpcworICAgICAgICBwcm92aWRlZCBhcyBhIGZpbHRlciBmb3IgdXNlIHdpdGggdGFza3MgdGhhdCBzdXBwb3J0cyBmaWx0ZXIKKyAgICAgICAgY2hhaW5zLiAgQWxzbyBpbmNsdWRlZCBhcmUgcmVwbGFjZW1lbnQgdGFza3MgZm9yICZsdDtjb3B5Jmd0OyBhbmQKKyAgICAgICAgJmx0O2phdmFjJmd0OyB0aGF0IGludGVncmF0ZSBzdXBwb3J0IGZvciBwcmVwcm9jZXNzaW5nLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAxLjUuMSBhbmQgYWJvdmUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3ZwcC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vdnBwLnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86dnBwLXVzZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0Ij52cHAtdXNlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBCU0QgbGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJXT1Byb2plY3QiPjwvYT4KKyAgICAgICAgV09Qcm9qZWN0CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+V09Qcm9qZWN0IHByb3ZpZGVzIGEgc2V0IG9mIHRvb2xzIHRvIHdvcmsgd2l0aAorICAgICAgICA8YSBocmVmPSJodHRwOi8vd2Vib2JqZWN0cy5jb20vIj5XZWJPYmplY3RzIDUuMTwvYT4KKyAgICAgICAgaW5kZXBlbmRlbnQgZnJvbSBwbGF0Zm9ybSBhbmQgSURFLiBJdCBzaWduaWZpY2FudGx5CisgICAgICAgIGltcHJvdmVzIGRldmVsb3BlciBwcm9kdWN0aXZpdHkKKyAgICAgICAgYW5kIG1ha2VzIGNvbXBsZXggcHJvamVjdCBzdHJ1Y3R1cmVzIG1vcmUgZmxleGlibGUgY29tcGFyZWQgdG8KKyAgICAgICAgdHJhZGl0aW9uYWwgTWFrZWZpbGUtYmFzZWQgYXBwcm9hY2guCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9vYmplY3RzdHlsZS5vcmcvd29wcm9qZWN0LyI+aHR0cDovL29iamVjdHN0eWxlLm9yZy93b3Byb2plY3QvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmFuZHJ1c0BvYmplY3RzdHlsZS5vcmciPkFuZHJ1cyBBZGFtY2hpazwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBsaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IldTRExWYWxpZGF0ZSI+PC9hPgorICAgICAgICBXU0RMVmFsaWRhdGUKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5XU0RMVmFsaWRhdGUgaXMsIGFzIGl0IHNvdW5kcywgYSB0b29sIHRvIHZhbGlkYXRlIFdTREwgZmlsZXMuCisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleHRlY2guY2dpL35jaGVja291dH4vd3N2dC1ob21lL2RvY3MvYXJ0aWNsZXMvd3NkbDIwVmFsaWRhdG9yL3dzZGx2YWxpZGF0ZWFudC5odG1sIj5XU0RMVmFsaWRhdGU8L2E+CisgICAgICAgIGlzIHNpbWlsYXIgaW4gY29uZmlndXJhdGlvbiB0byB0aGUgb3B0aW9uYWwgQW50IHRhc2sgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9PcHRpb25hbFRhc2tzL3htbHZhbGlkYXRlLmh0bWwiPlhNTFZhbGlkYXRlPC9hPi4KKyAgICAgICAgV1NETFZhbGlkYXRlIGNhbiBvcHRpb25hbGx5IHZhbGlkYXRlIGEgV1NETCBkb2N1bWVudCBhZ2FpbnN0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LndzLWkub3JnIj5XUy1JIEJhc2ljIFByb2ZpbGU8L2E+LgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPldTRExWYWxpZGF0ZSBpcyBhdmFpbGFibGUgYXMgYW4gQW50IHRhc2ssIGFuIEVjbGlwc2UgcGx1Zy1pbiBhbmQgYQorICAgICAgICBjb21tYW5kIGxpbmUgdXRpbGl0eS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNSBvciBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzdnQiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd3N2dDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd3N2dCI+UHJvamVjdCBuZXdzZ3JvdXAgYW5kCisgICAgICAgICAgICBtYWlsaW5nIGxpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LTEyNC5pYm0uY29tL2RldmVsb3BlcndvcmtzL29zcy9DUEx2MS4wLmh0bSI+Q29tbW9uIFB1YmxpYworICAgICAgICAgICAgTGljZW5zZSAoQ1BMKTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iWGNsdWRlciI+PC9hPgorICAgICAgICBYY2x1ZGVyCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+eGNsdWRlciBpcyBhbiBYTUwgSW5jbHVzaW9ucyAoWEluY2x1ZGUpIHRhc2sgZm9yIEFwYWNoZSBBbnQuCisgICAgICAgIE9mZmVycyB0aGUgY2hvaWNlIG9mIHVzaW5nIFhlcmNlcyBvciBFbGxpb3R0ZSBSdXN0eSBIYXJvbGQncyBYT00gQVBJLgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNCBvciBsYXRlci4gWEluY2x1ZGUgY29tcGxpYW5jZSBkZXBlbmRzIG9uIHRoZQorICAgICAgICAgICAgdW5kZXJseWluZyBYZXJjZXMgb3IgWE9NIHVzZWQuIFhlcmNlcyAyLjUuMCBhbmQgYWJvdmUgd29ya3MgZmluZSwKKyAgICAgICAgICAgIGJ1dCBwbGVhc2Ugbm90ZSB0aGF0IDIuNi4xIGFuZCAyLjYuMiBwcm9jZXNzZWQgdGhlCisgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAzL1hJbmNsdWRlLCBub3cgb2Jzb2xldGUgYnkKKyAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUgdXNlZCBieSB0aGUgbGF0ZXN0CisgICAgICAgICAgICBDYW5kaWRhdGUgUmVjb21tZW5kYXRpb24gKDEzIEFwcmlsIDIwMDQpLgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMveGNsdWRlciI+aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy94Y2x1ZGVyPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOm1iYXRzaXNAdXNlcnMuc2YubmV0Ij5tYmF0c2lzQHVzZXJzLnNmLm5ldDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBHTlUgTGlicmFyeSBvciBMZXNzZXIKKyAgICAgICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpCisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iWERvY2xldCI+PC9hPgorICAgICAgICBYRG9jbGV0CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+WERvY2xldCBpcyBhbiBleHRlbmRlZCBKYXZhZG9jIERvY2xldCBlbmdpbmUgZm9yIHVzZSBpbiBBbnQuCisgICAgICAgICAgIEl0IGxldHMgeW91IGNyZWF0ZSBjdXN0b20gSmF2YWRvYyBAdGFncyBhbmQgYmFzZWQgb24gdGhvc2UgdGFncworICAgICAgICAgICBnZW5lcmF0ZXMgc291cmNlIGNvZGUgb3Igb3RoZXIgZmlsZXMgKHN1Y2ggYXMgeG1sLWlzaCBkZXBsb3ltZW50CisgICAgICAgICAgIGRlc2NyaXB0b3JzKS4gVGVtcGxhdGVzIGFuZCBtYXRjaGluZyB0YXNrcyBhcmUgcHJvdmlkZWQgdG8gZ2VuZXJhdGUKKyAgICAgICAgICAgRUpCIGFuZCB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KKyAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy94ZG9jbGV0LyI+aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy94ZG9jbGV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEJTRCBsaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlhJbmNsdWRlIj48L2E+CisgICAgICAgIFhJbmNsdWRlCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGEgaHJlZj0iaHR0cDovL3d3dy5qZWNrbGUuZGUvZnJlZVN0dWZmL3hpYS9pbmRleC5odG1sIj5YSW5jbHVkZTwvYT4gaXMKKyAgICAgICAgICBhIFczQyBzdGFuZGFyZGl6ZWQgdm9jYWJ1bGFyeSBmb3IgaW5jbHVkaW5nIGFyYml0cmFyeSB0ZXh0IG9yIFhNTAorICAgICAgICAgIGRvY3VtZW50cyBpbiBvdGhlciBYTUwgZG9jdW1lbnRzLiBUaGlzIHRhc2sgcGVyZm9ybWVzIHRoZSBpbmNsdXNpb24KKyAgICAgICAgICB1c2luZyBhbiBleGlzdGluZyBYSW5jbHVkZSBpbXBsZW1lbnRhdGlvbjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41LjIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamVja2xlLmRlL2ZyZWVTdHVmZi94aWEvaW5kZXguaHRtbCI+aHR0cDovL3d3dy5qZWNrbGUuZGUvZnJlZVN0dWZmL3hpYS9pbmRleC5odG1sPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bWFyaW9AamVja2xlLmRlIj5tYXJpb0BqZWNrbGUuZGU8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMZXNzZXIgR05VIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlhNTCBEaXJlY3RvcnkgTGlzdGluZyBBbnQgVGFzayI+PC9hPgorICAgICAgICBYTUwgRGlyZWN0b3J5IExpc3RpbmcgQW50IFRhc2sKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgWE1MIERpcmVjdG9yeSBMaXN0aW5nIHRhc2sgY2FuIHJlY3Vyc2UgdGhyb3VnaCBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW5kIHByb2R1Y2UgYW4gCisgICAgICAgIFhNTCByZXByZXNlbnRhdGlvbi4gVGhlIHJlc3VsdGluZyBmaWxlIGNhbiB0aGVuIGJlIHRyYW5zZm9ybWVkIGZ1cnRoZXIgd2l0aCBBbnQuIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIFhNTCBvdXRwdXQgaXMgY29uZmlndXJhYmxlIHRocm91Z2ggdmFyaW91cyBvcHRpb25zLiBUaGUgU0FYIHBhcnNpbmcgaXMgZmFzdCBhbmQgaGFzIGEgCisgICAgICAgIGxvdyBtZW1vcnkgZm9vdHByaW50LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS42LjUgb3IgaGlnaGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC94bWwtZGlyLWxpc3RpbmcvIj5odHRwOi8vY29kZS5nb29nbGUuY29tL3AveG1sLWRpci1saXN0aW5nLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzptYXR0X2F0X21hdHRoYXluZXNfZG90X25ldCI+TS4gSGF5bmVzPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIExpY2Vuc2UgMi4wCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlhNTFJlbGVhc2VOb3RlcyAoWFJOKSI+PC9hPgorICAgICAgICBYTUxSZWxlYXNlTm90ZXMgKFhSTikKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGZyYW1ld29yayBpcyBhIHJlbGVhc2Ugbm90ZXMgZnJhbWV3b3JrIHRoYXQgZW5hYmxlcyB0bworICAgICAgICBnZW5lcmF0ZSB0ZXh0dWFsIHJlbGVhc2Ugbm90ZXMgZnJvbSBhbiBYTUwgZmlsZS4gVGhpcyBpcyBhbgorICAgICAgICBvcGVuIGZyYW1ld29yayB0aGF0IGVuYWJsZXMgdG8gaW50ZWdyYXRlIHRoZSBpbmZvcm1hdGlvbgorICAgICAgICBjb21pbmcgZnJvbSBWU0MgYW5kIGJ1ZyB0cmFja2luZyBzb2x1dGlvbnMsIGZvciBpbnN0YW5jZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNSBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3htbHJlbGVhc2Vub3Rlcy5mcmVlLmZyLyI+aHR0cDovL3htbHJlbGVhc2Vub3Rlcy5mcmVlLmZyLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEVkb3VhcmQgTWVyY2llcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iWG1sVGFzayI+PC9hPgorICAgICAgICBYbWxUYXNrCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+WG1sVGFzayBwcm92aWRlcyBhIHNpbXBsZSBtZWFucyB0byBtb2RpZnkgWE1MIGRvY3VtZW50cworICAgICAgICB3aXRob3V0IGhhdmluZyB0byBsZWFybiBYU0xULiBBIHNpbXBsZSBwYXRoIHJlZmVyZW5jZSB0byBhbgorICAgICAgICBYTUwgbm9kZSBzcGVjaWZpZXMgdGhlIG5vZGUgeW91IHdhbnQgdG8gY2hhbmdlLCBhbmQgaG93IHlvdQorICAgICAgICB3YW50IHRvIGFsbG93IFhNTCBpbnNlcnRpb24gYW5kIHJlbW92YWwsIG9yIGF0dHJpYnV0ZQorICAgICAgICBjaGFuZ2VzLiBUaGUgZW1waGFzaXMgaXMgb24gcHJvdmlkaW5nIHRoZSBzaW1wbGVzdCBtZWFucyB0bworICAgICAgICBwZXJmb3JtIGNvbW1vbiBYTUwgcmVwbGFjZW1lbnRzPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub29wc2NvbnN1bHRhbmN5LmNvbS9zb2Z0d2FyZS94bWx0YXNrLyI+aHR0cDovL3d3dy5vb3BzY29uc3VsdGFuY3kuY29tL3NvZnR3YXJlL3htbHRhc2svPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnhtbHRhc2stdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0Ij54bWx0YXNrLXVzZXJzIGF0IGxpc3RzLnNvdXJjZWZvcmdlLm5ldDwvYT4gCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJ5R3VhcmQiPjwvYT4KKyAgICAgICAgeUd1YXJkCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+eUd1YXJkIGlzIGEgZnJlZSBKYXZhKFRNKSBCeXRlY29kZSBPYmZ1c2NhdG9yIFRhc2sgdGhhdAorICAgICAgICBuZWVkcyBubyBleHRlcm5hbCBzY3JpcHQgb3IgcHJvamVjdCBmaWxlcy4gSXQgY2FuIGNvbXBsZXRlbHkKKyAgICAgICAgYmUgY29uZmlndXJlZCBhbmQgcnVuIHRocm91Z2ggdGhlIEFudCBidWlsZCBzY3JpcHQuIFRoZSB0YXNrCisgICAgICAgIHN1cHBvcnRzIG11bHRpcGxlIEphciBmaWxlcyBhdCBvbmNlIGFuZCBtYWtlcyB1c2Ugb2YKKyAgICAgICAgcGF0dGVybnNldHMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gc3BlY2lmeSBlbGVtZW50cywgd2hpY2gKKyAgICAgICAgc2hvdWxkIGJlIGxlZnQgdW5vYmZ1c2NhdGVkLiAgQWRkaXRpb25hbGx5IGl0IGNhbiBiZSB1c2VkIHRvCisgICAgICAgIHByb2R1Y2UgcGF0Y2hlcyBmb3Igb2JmdXNjYXRlZCBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIGFscmVhZHkKKyAgICAgICAgYmVlbiBkZXBsb3llZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNSBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy55d29ya3MuY29tL2VuL3Byb2R1Y3RzX3lndWFyZF9hYm91dC5odG0iPmh0dHA6Ly93d3cueXdvcmtzLmNvbS9lbi9wcm9kdWN0c195Z3VhcmRfYWJvdXQuaHRtPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnlndWFyZEB5d29ya3MuY29tIj55R3VhcmRAeVdvcmtzLmNvbTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpYnJhcnk6IExHUEwsIFRhc2s6IENvbW1lcmNpYWwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iWmVsaXggS2xhc3NNYXN0ZXIiPjwvYT4KKyAgICAgICAgWmVsaXggS2xhc3NNYXN0ZXIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgdGFzayBaS01UYXNrIGFsbG93cyB0aGUgWmVsaXggS2xhc3NNYXN0ZXIgSmF2YSBvYmZ1c2NhdG9yIHRvIGJlIGludGVncmF0ZWQgaW50byBhbiBBbnQgYnVpbGQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQuMSBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy56ZWxpeC5jb20va2xhc3NtYXN0ZXIvZG9jcy9idWlsZFRvb2xBcGkuaHRtbCI+aHR0cDovL3d3dy56ZWxpeC5jb20va2xhc3NtYXN0ZXIvZG9jcy9idWlsZFRvb2xBcGkuaHRtbDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbW1lcmNpYWwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJCdWlsZCBMaXN0ZW5lcnMiPjwvYT4KKyAgICAgIEJ1aWxkIExpc3RlbmVycworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRVdGlsaXR5Ij48L2E+CisgICAgICAgIEFudFV0aWxpdHkKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICBXb25kZXJpbmcgd2h5IHlvdXIgQW50IGJ1aWxkIGlzIHNsb3c/IElzIHlvdXIgY29udGludW91cyBpbnRlZ3JhdGlvbiBzZXJ2ZXIgdGFraW5nIHRvbyAKKyAgICAgICAgICBsb25nIHRvIHByb2R1Y2UgeW91ciBwcm9qZWN0IGJ1aWxkcz8gVGhpcyBwcm9qZWN0IG1heSBoZWxwLiBUaGlzIHByb2plY3QgaW5jbHVkZXMgYSBzbWFsbCAKKyAgICAgICAgICBudW1iZXIgb2YgY2xhc3NlcyBmb3IgdXNlIHdpdGggQW50IHRoYXQgY2FuIGhlbHAgeW91IHRvIGFuYWx5emUgeW91ciBidWlsZCBpbiBhIAorICAgICAgICAgIG5vbi1pbnRydXNpdmUgbWFubmVyLgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwczovL2FudHV0aWxpdHkuZGV2LmphdmEubmV0LyI+aHR0cHM6Ly9hbnR1dGlsaXR5LmRldi5qYXZhLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86ZGdyZWVuQGRldi5qYXZhLm5ldCI+RGF2aWQgR3JlZW48L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkNvbXBpbGVyIEltcGxlbWVudGF0aW9ucyI+PC9hPgorICAgICAgQ29tcGlsZXIgSW1wbGVtZW50YXRpb25zCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkdlbmVyaWNzIChKU1IxNCkgRWFybHktQWNjZXNzIENvbXBpbGVyIEFkYXB0ZXIiPjwvYT4KKyAgICAgICAgR2VuZXJpY3MgKEpTUjE0KSBFYXJseS1BY2Nlc3MgQ29tcGlsZXIgQWRhcHRlcgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgaXMgYW4gQW50IGNvbXBpbGVyLWFkYXB0ZXIgdGhhdCBhbGxvd3MgeW91IHRvIHVzZSB0aGUKKyAgICAgICAgbm9ybWFsIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IHRhc2sgcGx1cyBTdW4ncyBlYXJseS1hY2Nlc3MKKyAgICAgICAgY29tcGlsZXIgdG8gY29tcGlsZSBHZW5lcmljcy1lbmFibGVkIEphdmEgY29kZS4gIChUaGlzIGlzIG9ubHkKKyAgICAgICAgbmVjZXNzYXJ5IHVudGlsIEpESzEuNSBpcyByZWxlYXNlZC4pPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubWFkYmVhbi5jb20vYmxvZy8zLyI+aHR0cDovL3d3dy5tYWRiZWFuLmNvbS9ibG9nLzMvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTWF0dCBRdWFpbCAmbHQ7c3B1ZFthdF1tYWRiZWFuW2RvdF1jb20mZ3Q7CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBQdWJsaWMgRG9tYWluCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Im1pbmlSTUkgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtybWljJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGltcGxlbWVudGF0aW9uIj48L2E+CisgICAgICAgIG1pbmlSTUkgPGNvZGU+Jmx0O3JtaWMmZ3Q7PC9jb2RlPiBpbXBsZW1lbnRhdGlvbgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPm1pbmlSTUkgaXMgYSBmcmVld2FyZSBvcGVuc291cmNlIGxpYnJhcnkgdGhhdCBzZXJ2ZXMgYXMgYQorICAgICAgICBsaWdodHdlaWdodCByZXBsYWNlbWVudCBmb3IgdGhlIG9yaWdpbmFsIGphdmEucm1pIHBhY2thZ2VzIGFuZAorICAgICAgICBpcyBzdWl0YWJsZSBlc3BlY2lhbGx5IGZvciBhcHBsZXRzLiBBbnQgMS40KworICAgICAgICA8Y29kZT4mbHQ7cm1pYyZndDs8L2NvZGU+IGFkYXB0ZXIgaW5jbHVkZWQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS8iPmh0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86UGV0ci5Ub21hbkBwaW5rbmV0LmN6Ij5QZXRyIFRvbWFuPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR251IExlc3NlciBQdWJsaWMgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IklERSBhbmQgRWRpdG9yIEludGVncmF0aW9uIj48L2E+CisgICAgICBJREUgYW5kIEVkaXRvciBJbnRlZ3JhdGlvbgorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRGYXJtIj48L2E+CisgICAgICAgIEFudEZhcm0KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BIHBsdWdpbiB0aGF0IGludGVncmF0ZXMgQW50IGludG8gdGhlIGpFZGl0IGVkaXRvci48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgYnVuZGxlcyBBbnQgMS41CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wbHVnaW5zLmplZGl0Lm9yZy9wbHVnaW5zLz9BbnRGYXJtIj5odHRwOi8vcGx1Z2lucy5qZWRpdC5vcmcvcGx1Z2lucy8/QW50RmFybTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpqZWRpdC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiPmpFZGl0IGRldmVsb3BlcnMgbWFpbGluZ2xpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRSdW5uZXIiPjwvYT4KKyAgICAgICAgQW50UnVubmVyCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW4gT3BlblRvb2wgdGhhdCBpbnRlZ3JhdGVzIEFudCBpbnRvIHRoZSBKQnVpbGRlciBJREUKKyAgICAgICAgKHZlcnNpb24gNSBhbmQgbGF0ZXIpLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS4yIGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50cnVubmVyLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnRydW5uZXIuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpkaXJrLnNjaG5lbGxlQHdlYi5kZSI+RGlyayBTY2huZWxsZTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkNBUGxleCI+PC9hPgorICAgICAgICBDQVBsZXgKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5DQSBQbGV4IGlzIGFuIGFyY2hpdGVjdGVkIFJBRCB0b29sIHRoYXQgY29tYmluZXMgdGhlIHRlY2huaXF1ZXMgb2YKKyAgICAgICAgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50LCBjb2RlIGdlbmVyYXRpb24gYW5kIHBhdHRlcm5zIHRvIGNyZWF0ZQorICAgICAgICBidXNpbmVzcyBhcHBsaWNhdGlvbnMgZm9yIG11bHRpcGxlIHBsYXRmb3JtcywgaW5jbHVkaW5nIEphdmEsIC5ORVQgYW5kCisgICAgICAgIElCTSBTeXN0ZW0gaS4gSW4gaXRzIDYuMCByZWxlYXNlLCBDQSBQbGV4IGluY2x1ZGVzIGludGVncmF0ZWQgc3VwcG9ydAorICAgICAgICBmb3IgYnVpbGRpbmcgZ2VuZXJhdGVkIEphdmEgY29kZSB3aXRoIEFudC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNi41CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLnBsZXhpbmZvLm5ldC9pbmRleC5waHA/dGl0bGU9Q3VzdG9taXppbmdfUGxleF82LjBfQU5UX2J1aWxkcyI+aHR0cDovL3dpa2kucGxleGluZm8ubmV0L2luZGV4LnBocD90aXRsZT1DdXN0b21pemluZ19QbGV4XzYuMF9BTlRfYnVpbGRzPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5jYS5jb20vdXMvcHJvZHVjdHMvcHJvZHVjdC5hc3B4P0lEPTI1OCI+aHR0cDovL3d3dy5jYS5jb20vdXMvcHJvZHVjdHMvcHJvZHVjdC5hc3B4P0lEPTI1ODwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbW1lcmNpYWwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iRWNsaXBzZSI+PC9hPgorICAgICAgICBFY2xpcHNlCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+RWNsaXBzZSBpcyBhIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIHdpdGggQW50IGludGVncmF0aW9uLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgICAgQW50IDEuMyBhbmQgaGlnaGVyIDxiciAvPgorICAgICAgICAgICAgICBCdW5kbGVzIEFudCAxLjYuMiBhcyBvZiBFY2xpcHNlIDMuMC4xICh0ZXN0ZWQgd2l0aCBBbnQgMS41LjQgLSAxLjYuMikgPGJyIC8+CisgICAgICAgICAgICAgIEVjbGlwc2UgMy4yIGJ1bmRsZXMgQW50IDEuNi41IDxiciAvPgorICAgICAgICAgICAgICBFY2xpcHNlIDMuMyBidW5kbGVzIEFudCAxLjcuMCAKKyAgICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9hPgorICAgICAgICAgICAgICBvcgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL35jaGVja291dH4vcGxhdGZvcm0tYW50LWhvbWUvaW5kZXguaHRtbCI+CisgICAgICAgICAgICAgICAgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9+Y2hlY2tvdXR+L3BsYXRmb3JtLWFudC1ob21lL2luZGV4Lmh0bWwKKyAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJuZXdzOi8vbmV3cy5lY2xpcHNlLm9yZy9lY2xpcHNlLnBsYXRmb3JtIj5uZXdzOi8vbmV3cy5lY2xpcHNlLm9yZy9lY2xpcHNlLnBsYXRmb3JtPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkdlbCI+PC9hPgorICAgICAgICBHZWwKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5KYXZhIElERSB3aXRoIHN1cHBvcnQgZm9yIEFudC4gIEdlbCBpcyBhIG5hdGl2ZSBNaWNyb3NvZnQKKyAgICAgICAgV2luZG93cyBzb2Z0d2FyZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNCBhbmQgYWJvdmUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5nZXhwZXJ0cy5jb20vZ2VsLmh0bWwiPmh0dHA6Ly93d3cuZ2V4cGVydHMuY29tL2dlbC5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2dyb3Vwcy55YWhvby5jb20vZ3JvdXAvZ2VsaWRlLyI+UHJvamVjdCBNYWlsaW5nIExpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBGcmVld2FyZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJJbnRlbGxpSiBJREVBIDUuMCI+PC9hPgorICAgICAgICBJbnRlbGxpSiBJREVBIDUuMAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphdmEgSURFIHdpdGggcmVmYWN0b3Jpbmcgc3VwcG9ydCBhbmQgQW50IGludGVncmF0aW9uLgorICAgICAgVGhlIElERSBoYXMgc3BlY2lhbCBlZGl0aW5nIGFuZCBuYXZpZ2F0aW9uIHN1cHBvcnQgZm9yIEFudC4KKyAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBidW5kbGVzIEFudCAxLjYuNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmludGVsbGlqLmNvbS9pZGVhLyI+aHR0cDovL3d3dy5pbnRlbGxpai5jb20vaWRlYS88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86c3VwcG9ydEBpbnRlbGxpai5jb20iPnN1cHBvcnRAaW50ZWxsaWouY29tPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tbWVyY2lhbDsgQWNhZGVtaWMgYW5kIE9wZW5Tb3VyY2UgbGljZW5zZXMgYXZhaWxhYmxlLgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKQnVpbGRlciI+PC9hPgorICAgICAgICBKQnVpbGRlcgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkJvcmxhbmQgSkJ1aWxkZXIKKyAgICAgICAgY29tZXMgd2l0aCBidWlsdC1pbiBBbnQgc3VwcG9ydCwgaW5jbHVkaW5nIGJ1aWxkIGZpbGUgZWRpdGluZy4KKyAgICAgICAgU29tZSB2ZXJzaW9ucyBjb21lIHdpdGggQW50IGRlYnVnZ2luZyBzdXBwb3J0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBCdW5kbGVzIEFudCAxLjYKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5jb2RlZ2Vhci5jb20vZW4vcHJvZHVjdHMvamJ1aWxkZXIiPmh0dHA6Ly93d3cuY29kZWdlYXIuY29tL2VuL3Byb2R1Y3RzL2pidWlsZGVyPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N1cHBvcnQuY29kZWdlYXIuY29tL2VuIj5odHRwOi8vc3VwcG9ydC5jb2RlZ2Vhci5jb20vZW48L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21tZXJjaWFsOyBUdXJibyBKQnVpbGRlciAyMDA3IGlzIGZyZWUuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkpERUUiPjwvYT4KKyAgICAgICAgSkRFRQorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBKYXZhIERldmVsb3BtZW50IEVudmlyb25tZW50IGZvciBFbWFjcyAoSkRFRSkgc3VwcG9ydHMKKyAgICAgICAgQXBhY2hlIEFudCBhcyBvbmUgb2YgdGhyZWUgYnVpbHQtaW4gd2F5cyB0byBidWlsZCB5b3VyCisgICAgICAgIGFwcGxpY2F0aW9ucy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuMiBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pkZWUuc3Vuc2l0ZS5kay8iPmh0dHA6Ly9qZGVlLnN1bnNpdGUuZGsvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmpkZS1zdWJzY3JpYmVAc3Vuc2l0ZS5hdWMuZGsiPkpERUUgTWFpbGluZyBsaXN0LjwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Ik5ldEJlYW5zIj48L2E+CisgICAgICAgIE5ldEJlYW5zCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QSBtb2R1bGUgdGhhdCBpbnRlZ3JhdGVzIEFudCBpbnRvIHRoZSBOZXRCZWFucyBJREUsIGFzIHdlbGwgYXMgZGVyaXZhdGl2ZSBwcm9kdWN0cyBzdWNoIGFzIFN1biBKYXZhCisgICAgICAgIFN0dWRpbyAoZm9ybWVybHkgRm9ydGUgZm9yIEphdmEgYW5kIFN1biBPTkUgU3R1ZGlvKSBhbmQgU3VuIEphdmEgU3R1ZGlvIENyZWF0b3IuCisgICAgICAgIFRoaXMgSURFIHVzZXMgQW50IGFzIGl0cyA8aT5zb2xlPC9pPiBtZWFucyBvZiBidWlsZGluZyBhcHBsaWNhdGlvbnMsCisgICAgICAgIHdpdGggY3VzdG9tIHRhc2tzIGFuZCBhbiBBbnQtYXdhcmUgZWRpdG9yLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBidW5kbGVzIDEuNi41IGZvciBOZXRCZWFucyA1LjAgYW5kIDUuNTsgMS43LjAgZm9yIE5ldEJlYW5zIDYuMAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm5ldGJlYW5zLm9yZy8iPmh0dHA6Ly93d3cubmV0YmVhbnMub3JnLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpuYmRldkBuZXRiZWFucy5vcmciPm5iZGV2QG5ldGJlYW5zLm9yZzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iT3B0aXN0aWMgSURYIEphdmEgSURFIj48L2E+CisgICAgICAgIE9wdGlzdGljIElEWCBKYXZhIElERQorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkphdmEgSURFIHdpdGggZGVlcCBBbnQgaW50ZWdyYXRpb24uIElEWCBpcyBhIG5hdGl2ZSBNaWNyb3NvZnQgV2luZG93cyBwcm9ncmFtLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBidW5kbGVzIEFudCAxLjYKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub3B0aXN0aWMuY29tL2lkeCI+aHR0cDovL29wdGlzdGljLmNvbS9pZHg8L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJtYWlsdG86c3VwcG9ydEBvcHRpc3RpYy5jb20iPnN1cHBvcnRAb3B0aXN0aWMuY29tPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21tZXJjaWFsOyBBY2FkZW1pYyBhbmQgT3BlblNvdXJjZSBsaWNlbnNlcyBhdmFpbGFibGUuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Ik9yYWNsZSBKRGV2ZWxvcGVyIDEwaSI+PC9hPgorICAgICAgICBPcmFjbGUgSkRldmVsb3BlciAxMGkKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5KYXZhIElERSB3aXRoIHN1cHBvcnQgZm9yIEFudC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNS4xCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub3JhY2xlLmNvbS90ZWNobm9sb2d5L3Byb2R1Y3RzL2pkZXYvaW5kZXguaHRtbCI+aHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2hub2xvZ3kvcHJvZHVjdHMvamRldi9pbmRleC5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2ZvcnVtcy5vcmFjbGUuY29tL2ZvcnVtcy9mb3J1bS5qc3BhP2ZvcnVtSUQ9ODMiPkpEZXZlbG9wZXIgRm9ydW08L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21tZXJjaWFsCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlZpcnR1YWwgQW50Ij48L2E+CisgICAgICAgIFZpcnR1YWwgQW50CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgSW5zdGVhZCBvZiBtYW51YWxseSBjcmVhdGluZyBidWlsZCBzY3JpcHRzIGluIFhNTCwgVmlydHVhbCBBbnQgcHJvdmlkZXMgYSBmdWxseSB2aXJ0dWFsIGZpbGUgc3lzdGVtCisgICAgICAgICAgd2hlcmUgeW91IGNhbiBydW4geW91ciB0YXNrcyBpbiByZWFsIHRpbWUgYW5kIHNlZSB0aGUgcmVzdWx0cy4gRXZlcnl0aGluZyB0aGF0IHlvdSBkbyBpcyByZWNvcmRlZCBhbmQKKyAgICAgICAgICB0dXJuZWQgaW50byBhbiBBbnQgYnVpbGQgc2NyaXB0LgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIEFudCAxLjYuNSBvbndhcmRzCisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cucGxhY2lkc3lzdGVtcy5jb20vdmlydHVhbGFudC8iPmh0dHA6Ly93d3cucGxhY2lkc3lzdGVtcy5jb20vdmlydHVhbGFudC88L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJtYWlsdG86c3VwcG9ydEBwbGFjaWRzeXN0ZW1zLmNvbSI+c3VwcG9ydEBwbGFjaWRzeXN0ZW1zLmNvbTwvYT4KKyAgICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tbWVyY2lhbDsgT3BlblNvdXJjZSBsaWNlbnNlcyBhdmFpbGFibGUgdG9vLgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJXZWJTcGhlcmUgU3R1ZGlvIEFwcGxpY2F0aW9uIERldmVsb3BlciI+PC9hPgorICAgICAgICBXZWJTcGhlcmUgU3R1ZGlvIEFwcGxpY2F0aW9uIERldmVsb3BlcgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPldTQUQgZmVhdHVyZXMgQW50IGludGVncmF0ZSBieSB2aXJ0dWUgb2YgYmVpbmcgYnVpbHQgb24gdGhlIEVjbGlwc2UgdG9vbHMgcGxhdGZvcm0uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIGJ1bmRsZXMgQW50IDEuNC4xCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93ZWJzcGhlcmUvIj5odHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvd2Vic3BoZXJlLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcnRpY2xlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVzaW5nIEFudCB3aXRoIFdlYlNwaGVyZSBTdHVkaW8gQXBwbGljYXRpb24gRGV2ZWxvcGVyPHVsPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy0xMjguaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93ZWJzcGhlcmUvbGlicmFyeS90ZWNoYXJ0aWNsZXMvMDIwM19zZWFybGUvc2VhcmxlMS5odG1sIj5QYXJ0IDE8L2E+PC9saT4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvd2Vic3BoZXJlL2xpYnJhcnkvdGVjaGFydGljbGVzLzAyMDNfc2VhcmxlL3NlYXJsZTIuaHRtbCI+UGFydCAyPC9hPjwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL3dlYnNwaGVyZS9saWJyYXJ5L3RlY2hhcnRpY2xlcy8wMjAzX3NlYXJsZS9zZWFybGUzLmh0bWwiPlBhcnQgMzwvYT48L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbW1lcmNpYWwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJTb3VyY2UgQ29udHJvbCBTeXN0ZW1zIj48L2E+CisgICAgICBTb3VyY2UgQ29udHJvbCBTeXN0ZW1zCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZXJlIGFyZSBzZXZlcmFsIGludGVncmF0aW9uIHdpdGggU0NNIHN5c3RlbXMuIFNvbWUgYXJlCisgICAgICA8YSBocmVmPSJtYW51YWwvdGFza3NvdmVydmlldy5odG1sI3NjbSI+YnVpbHQgaW48L2E+LiBCdXQgc29tZSBhcmUgYXZhaWxhYmxlIGFzCisgICAgICBleHRlcm5hbCBsaWJyYXJpZXMuIEhlcmUgYSBsaXN0IG9mIHRhc2sgbGlicmFyaWVzIHdlIGFyZSBhd2FyZSBvZjo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9ImNsZWFyQW50TGliIj48L2E+CisgICAgICAgIGNsZWFyQW50TGliCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBsaWJyYXJ5IGlzIGEgY29sbGVjdGlvbiBvZiAidmFsdWUtYWRkIiBBbnQgdGFza3MgZm9yIGludGVncmF0aW5nIAorICAgICAgICAgSUJNIFJhdGlvbmFsIENsZWFyQ2FzZSB3aXRoIEFwYWNoZSBBbnQuIFRoZSBpbnRlZ3JhdGlvbiBtYWtlcyBmdWxsIHVzZSAKKyAgICAgICAgIG9mIHRoZSBwb3dlciBhbmQgY2FwYWJpbGl0aWVzIG9mIEFudCwgd2l0aCBzdXBwb3J0IGZvciBuZXN0ZWQgZWxlbWVudHMgCisgICAgICAgICAoc3VjaCBhcyBmaWxlc2V0cykgYW5kIGFsc28gc3VwcG9ydHMgY29uZGl0aW9ucy4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIAorICAgICAgICAgdGFza3MgZm9yIGNyZWF0aW5nIFhNTCByZXBvcnRzIG9uIGJvdGggQ2xlYXJDYXNlIGJhc2VsaW5lcyBhbmQgbGFiZWxzIGFzIAorICAgICAgICAgd2VsbCBhcyBhIHRhc2sgZm9yICJzdGFnaW5nIiBDbGVhckNhc2Ugb2JqZWN0cy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEuNi4xIGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY2xlYXJhbnRsaWIuc291cmNlZm9yZ2UubmV0LyI+CisgICAgICAgICAgICBodHRwOi8vY2xlYXJhbnRsaWIuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvZm9ydW0vP2dyb3VwX2lkPTEyMzc2NCI+Rm9ydW08L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlN1cnJvdW5kIFNDTSI+PC9hPgorICAgICAgICBTdXJyb3VuZCBTQ00KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGVzZSBhcmUgdGFza3MgdGhhdCBhbGxvdyB1c2VycyB0byBhY2Nlc3MgU3Vycm91bmQgU0NNCisgICAgICAgICBmdW5jdGlvbmFsaXR5IGZyb20gd2l0aGluIEFudCBidWlsZCBzY3JpcHRzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41IGFuZCBsYXRlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnNlYXBpbmUuY29tL3NjbXJlc291cmNlcy5waHAjaW50ZWdyYXRpb24iPgorICAgICAgICAgICAgU3Vycm91bmQgU0NNIFJlc291cmNlIENlbnRlcjwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpzdXBwb3J0QHNlYXBpbmUuY29tIj5TZWFwaW5lIFN1cHBvcnQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9mYXEuaHRtbCBiL3RydW5rL2RvY3MvZmFxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxOTgxOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvZmFxLmh0bWwKQEAgLTAsMCArMSwyMDg5IEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAgICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iU3RlZmFuIEJvZGV3aWciPgorICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0iYm9kZXdpZ0BhcGFjaGUub3JnIj4KKyAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+SG9tZTwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4vcHJvamVjdHMvaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+UHJvamVjdHM8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BcGFjaGUgQW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xpY2Vuc2UuaHRtbCI+TGljZW5zZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2FudG5ld3MuaHRtbCI+TmV3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2V4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvYW50L0Zyb250UGFnZSI+V2lraTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2JsZW1zLmh0bWwiPkhhdmluZyBQcm9ibGVtcz88L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb3dubG9hZAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYmluZG93bmxvYWQuY2dpIj5CaW5hcnkgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkNvbnRyaWJ1dGluZworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21haWwuaHRtbCI+TWFpbGluZyBMaXN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3N2bi5odG1sIj5TdWJ2ZXJzaW9uIFJlcG9zaXRvcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL25pZ2h0bGllcy5odG1sIj5OaWdodGx5IEJ1aWxkczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J1Z3MuaHRtbCI+QnVnIERhdGFiYXNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+U3BvbnNvcnNoaXAKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiPlRoYW5rczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIj5TcG9uc29yc2hpcDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCI+RG9uYXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdCBNYW5hZ2VtZW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vY29udHJpYnV0b3JzLmh0bWwiPkNvbnRyaWJ1dG9yczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21pc3Npb24uaHRtbCI+QXBhY2hlIEFudCBNaXNzaW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnlsYXdzLmh0bWwiPlByb2plY3QgQnlsYXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGVnYWwuaHRtbCI+TGVnYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9oMT4KKyAgICAKKyAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj5RdWVzdGlvbnM8L2gzPgorICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0idG9jIj5BYm91dCB0aGlzIEZBUTwvaDQ+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2xhdGVzdC12ZXJzaW9uIj4KKyAgV2hlcmUgZG8gSSBmaW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzCisgICAgICAgIGRvY3VtZW50PworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNhZGRpbmctZmFxcyI+CisgIEhvdyBjYW4gSSBjb250cmlidXRlIHRvIHRoaXMgRkFRPworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNjcmVhdGluZy1mYXEiPgorICBIb3cgZG8geW91IGNyZWF0ZSB0aGUgSFRNTCB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgRkFRPworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0idG9jIj5HZW5lcmFsPC9oND4KKyAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjd2hhdC1pcy1hbnQiPgorICBXaGF0IGlzIEFwYWNoZSBBbnQ/CisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2FudC1uYW1lIj4KKyAgV2h5IGRvIHlvdSBjYWxsIGl0IEFudD8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjaGlzdG9yeSI+CisgIFRlbGwgdXMgYSBsaXR0bGUgYml0IGFib3V0IEFudCdzIGhpc3RvcnkuCisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJ0b2MiPkluc3RhbGxhdGlvbjwvaDQ+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI25vLWdudS10YXIiPgorICBJIGdldCBjaGVja3N1bSBlcnJvcnMgd2hlbiBJIHRyeSB0byBleHRyYWN0IHRoZQorICAgICAgPGNvZGU+dGFyLmd6PC9jb2RlPiBkaXN0cmlidXRpb24gZmlsZS4gV2h5PworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNSZWRIYXRfRVNfMyI+CisgIEhvdyBkbyB5b3UgZ2V0IGFudC0xLjYueCAob3IgYW55IHZlcnNpb24gbGF0ZXIgdGhhbgorICAgICAgMS41LjIpIHRvIHdvcmsgb24gb24gUmVkSGF0IEVTIDM/CisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJ0b2MiPkhvdyBkbyBJIC4uLjwvaDQ+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2ltcGxlbWVudC1vcy1zcGVjaWZpYy1jb25maWd1cmF0aW9uIj4KKyAgSG93IGRvIEkgcmVhbGl6ZSBvcy0tc3BlY2lmaWMgY29uZmlndXJhdGlvbnM/CisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2FkZGluZy1leHRlcm5hbC10YXNrcyI+CisgIEhvdyBkbyBJIGFkZCBhbiBleHRlcm5hbCB0YXNrIHRoYXQgSSd2ZSB3cml0dGVuIHRvIHRoZQorICAgICAgcGFnZSAiRXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzIj8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjY3JlYXRlLWV4dGVuc2lvbnMiPgorICBIb3cgZG8gSSBjcmVhdGUgbmV3IHRhc2tzPworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNwYXNzaW5nLWNsaS1hcmdzIj4KKyAgSG93IGRvIEkgcGFzcyBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0byBteQorICAgICAgICBidWlsZCBmaWxlPworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNqaWtlcy1zd2l0Y2hlcyI+CisgIEhvdyBjYW4gSSB1c2UgSmlrZXMtc3BlY2lmaWMgY29tbWFuZC1saW5lCisgICAgICAgIHN3aXRjaGVzPworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNzaGVsbC1yZWRpcmVjdC0xIj4KKyAgSG93IGRvIEkgaW5jbHVkZSBhICZsdDsgY2hhcmFjdGVyIGluIG15IGNvbW1hbmQtbGluZSBhcmd1bWVudHM/CisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3NoZWxsLXJlZGlyZWN0LTIiPgorICBIb3cgZG8gSSByZWRpcmVjdCBzdGFuZGFyZCBpbnB1dCBvciBzdGFuZGFyZCBvdXRwdXQKKyAgICAgICAgaW4gdGhlIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gdGFzaz8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjYmF0Y2gtc2hlbGwtZXhlY3V0ZSI+CisgIEhvdyBkbyBJIGV4ZWN1dGUgYSBiYXRjaCBmaWxlIG9yIHNoZWxsIHNjcmlwdCBmcm9tIEFudD8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjbXVsdGktY29uZGl0aW9ucyI+CisgIEkgd2FudCB0byBleGVjdXRlIGEgcGFydGljdWxhciB0YXJnZXQgb25seSBpZgorICAgICAgICBtdWx0aXBsZSBjb25kaXRpb25zIGFyZSB0cnVlLgorICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNlbmNvZGluZyI+CisgIEhvdyBjYW4gSSBpbmNsdWRlIG5hdGlvbmFsIGNoYXJhY3RlcnMgbGlrZSBHZXJtYW4KKyAgICAgICAgdW1sYXV0cyBpbiBteSBidWlsZCBmaWxlPworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiN1c2UtemlwLWluc3RlYWQtb2YtamFyIj4KKyAgSG93IGRvIEkgdXNlIDxjb2RlPmphcjwvY29kZT4ncyA8Y29kZT5NPC9jb2RlPiBzd2l0Y2g/CisgICAgICBJIGRvbid0IHdhbnQgYSBNQU5JRkVTVC4KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjcHJvcGVydHl2YWx1ZS1hcy1uYW1lLWZvci1wcm9wZXJ0eSI+CisgIEhvdyBjYW4gSSBkbyBzb21ldGhpbmcgbGlrZSA8Y29kZT4mbHQ7cHJvcGVydHkgbmFtZT0icHJvcCIKKyAgICAgIHZhbHVlPSIkeyR7YW5vdGhlcnByb3B9fSIvJmd0OzwvY29kZT4gKGRvdWJsZSBleHBhbmRpbmcgdGhlIHByb3BlcnR5KT8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZGVsZXRlLWRpcmVjdG9yeS1jaGlsZHJlbi1vbmx5Ij4KKyAgSG93IGNhbiBJIGRlbGV0ZSBldmVyeXRoaW5nIGJlbmVhdGggYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSwKKyAgICBwcmVzZXJ2aW5nIHRoZSBkaXJlY3RvcnkgaXRzZWxmPworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0idG9jIj5JdCBkb2Vzbid0IHdvcmsgKGFzIGV4cGVjdGVkKTwvaDQ+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2dlbmVyYWwtYWR2aWNlIj4KKyAgR2VuZXJhbCBBZHZpY2UKKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjYWx3YXlzLXJlY29tcGlsZXMiPgorICBXaHkgZG9lcyBBbnQgYWx3YXlzIHJlY29tcGlsZSBhbGwgbXkgSmF2YSBmaWxlcz8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZGVmYXVsdGV4Y2x1ZGVzIj4KKyAgSSd2ZSB1c2VkIGEgPGNvZGU+Jmx0O2RlbGV0ZSZndDs8L2NvZGU+IHRhc2sgdG8KKyAgICAgIGRlbGV0ZSB1bndhbnRlZCBTb3VyY2VTYWZlIGNvbnRyb2wgZmlsZXMgKENWUyBmaWxlcywgZWRpdG9yCisgICAgICBiYWNrdXAgZmlsZXMsIGV0Yy4pLCBidXQgaXQgZG9lc24ndCBzZWVtIHRvIHdvcms7IHRoZSBmaWxlcworICAgICAgbmV2ZXIgZ2V0IGRlbGV0ZWQuIFdoYXQncyB3cm9uZz8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjc3RvcC1kZXBlbmRlbmN5Ij4KKyAgSSBoYXZlIGEgdGFyZ2V0IEkgd2FudCB0byBza2lwIGlmIGEgcHJvcGVydHkgaXMgc2V0LAorICAgICAgc28gSSBoYXZlIDxjb2RlPnVubGVzcz0icHJvcGVydHkiPC9jb2RlPiBhcyBhbiBhdHRyaWJ1dGUKKyAgICAgIG9mIHRoZSB0YXJnZXQsIGJ1dCBhbGwgdGhlIHRhcmdldHMgdGhpcyB0YXJnZXQKKyAgICAgIGRlcGVuZHMgb24gYXJlIHN0aWxsIGV4ZWN1dGVkLiBXaHk/CisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2luY2x1ZGUtb3JkZXIiPgorICBJbiBteSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LCBJJ3ZlIHB1dCBpbiBhbgorICAgICAgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBvZiBhbGwgZmlsZXMgZm9sbG93ZWQgYnkgYW4KKyAgICAgIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gb2YganVzdCB0aGUgZmlsZXMgSSB3YW50LCBidXQgaXQKKyAgICAgIGlzbid0IGdpdmluZyBtZSBhbnkgZmlsZXMgYXQgYWxsLiBXaGF0J3Mgd3Jvbmc/CisgICAgICAKKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjcHJvcGVydGllcy1ub3QtdHJpbW1lZCI+CisgIDxjb2RlPmFudDwvY29kZT4gZmFpbGVkIHRvIGJ1aWxkIG15IHByb2dyYW0gdmlhIGphdmFjCisgICAgICBldmVuIHdoZW4gSSBwdXQgdGhlIG5lZWRlZCBqYXJzIGluIGFuIGV4dGVybmFsCisgICAgICA8Y29kZT5idWlsZC5wcm9wZXJ0aWVzPC9jb2RlPiBmaWxlIGFuZCByZWZlcmVuY2UgdGhlbSBieQorICAgICAgPGNvZGU+cGF0aGVsZW1lbnQ8L2NvZGU+IG9yIDxjb2RlPmNsYXNzcGF0aCByZWZpZDwvY29kZT4uCisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3dpbnppcC1saWVzIj4KKyAgQW50IGNyZWF0ZXMgV0FSIGZpbGVzIHdpdGggYSBsb3dlci1jYXNlCisgICAgICAgIDxjb2RlPndlYi1pbmY8L2NvZGU+IG9yIEpBUiBmaWxlcyB3aXRoIGEgbG93ZXItY2FzZQorICAgICAgICA8Y29kZT5tZXRhLWluZjwvY29kZT4gZGlyZWN0b3J5LgorICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNOb0NsYXNzRGVmRm91bmRFcnJvciI+CisgIEkgaW5zdGFsbGVkIEFudCAxLjYueCBhbmQgbm93IGdldAorICAgICAgICA8Y29kZT5FeGNlcHRpb24gaW4gdGhyZWFkICJtYWluIiBqYXZhLmxhbmcuTm9DbGFzc0RlZkZvdW5kRXJyb3I6CisgICAgICAgIDwvY29kZT4KKyAgICAgIAorICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNJbnN0YW50aWF0aW9uRXhjZXB0aW9uIj4KKyAgSSBpbnN0YWxsZWQgQW50IDEuNi54IGFuZCBub3cgZ2V0CisgICAgICAgIDxjb2RlPmphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uOiBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluPC9jb2RlPgorICAgICAgCisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI21hbmdsZWQtbWFuaWZlc3QiPgorICAKKyAgICAgICAgV2hlbmV2ZXIgSSB1c2UgdGhlIEFudCBqYXIgb3IgbWFuaWZlc3QgcmVsYXRlZCB0YXNrcywgbG9uZyBsaW5lcyBpbgorICAgICAgICBteSBtYW5pZmVzdCBhcmUgd3JhcHBlZCBhdCA3MCBjaGFyYWN0ZXJzIGFuZCB0aGUgcmVzdWx0aW5nIGphciBkb2VzCisgICAgICAgIG5vdCB3b3JrIGluIG15IGFwcGxpY2F0aW9uIHNlcnZlci4gV2h5IGRvZXMgQW50IGRvIHRoaXM/CisgICAgICAKKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InRvYyI+QW50IGFuZCBJREVzL0VkaXRvcnM8L2g0PgorICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNpbnRlZ3JhdGlvbiI+CisgIElzIEFudCBzdXBwb3J0ZWQgYnkgbXkgSURFL0VkaXRvcj8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZW1hY3MtbW9kZSI+CisgIFdoeSBkb2Vzbid0IChYKUVtYWNzL3ZpL01hY09TIFgncyBwcm9qZWN0IGJ1aWxkZXIKKyAgICAgIGNvcnJlY3RseSBwYXJzZSB0aGUgZXJyb3IgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IEFudD8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InRvYyI+QWR2YW5jZWQgSXNzdWVzPC9oND4KKyAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZHRkIj4KKyAgSXMgdGhlcmUgYSBEVEQgdGhhdCBJIGNhbiB1c2UgdG8gdmFsaWRhdGUgbXkgYnVpbGQKKyAgICAgIGZpbGVzPworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiN4bWwtZW50aXR5LWluY2x1ZGUiPgorICBIb3cgZG8gSSBpbmNsdWRlIGFuIFhNTCBzbmlwcGV0IGluIG15IGJ1aWxkIGZpbGU/CisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI21haWwtbG9nZ2VyIj4KKyAgSG93IGRvIEkgc2VuZCBhbiBlbWFpbCB3aXRoIHRoZSByZXN1bHQgb2YgbXkgYnVpbGQKKyAgICAgICAgcHJvY2Vzcz8KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjbGlzdGVuZXItcHJvcGVydGllcyI+CisgIEhvdyBkbyBJIGdldCBhdCB0aGUgcHJvcGVydGllcyB0aGF0IEFudCB3YXMgcnVubmluZworICAgICAgd2l0aCBmcm9tIGluc2lkZSBCdWlsZExpc3RlbmVyPworICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0idG9jIj5Lbm93biBQcm9ibGVtczwvaDQ+CisgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iIzE3MC1yZXF1aXJlcy1qdW5pdCI+CisgIEFudCAxLjcuMCBkb2Vzbid0IGJ1aWxkIGZyb20gc291cmNlcyB3aXRob3V0CisgICAgICAgIEpVbml0CisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3JlbW92ZS1jciI+CisgICZsdDtjaG1vZCZndDsgb3IgJmx0O2V4ZWMmZ3Q7IGRvZXNuJ3Qgd29yayBpbiBBbnQKKyAgICAgICAgMS4zIG9uIFVuaXgKKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjamF2YWRvYy1jYW5ub3QtZXhlY3V0ZSI+CisgIEphdmFEb2MgZmFpbGVkOiBqYXZhLmlvLklPRXhjZXB0aW9uOiBqYXZhZG9jOiBjYW5ub3QgZXhlY3V0ZQorICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNkZWxlZ2F0aW5nLWNsYXNzbG9hZGVyIj4KKyAgJmx0O3N0eWxlJmd0OyBvciAmbHQ7anVuaXQmZ3Q7IGlnbm9yZXMgbXkKKyAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS41Ij4KKyAgJmx0O3N0eWxlJmd0OyBvciAmbHQ7anVuaXQmZ3Q7IGlnbm9yZXMgbXkKKyAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7IC0gQW50IDEuNS54IHZlcnNpb24KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZGVsZWdhdGluZy1jbGFzc2xvYWRlci0xLjYiPgorICAmbHQ7c3R5bGUmZ3Q7IG9yICZsdDtqdW5pdCZndDsgaWdub3JlcyBteQorICAgICAgJmx0O2NsYXNzcGF0aCZndDsgLSBBbnQgMS42LnggdmVyc2lvbgorICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiN3aW54cC1qZGsxNC1hbnQxNCI+CisgIFdoZW4gcnVubmluZyBBbnQgMS40IG9uIFdpbmRvd3MgWFAgYW5kIEpESyAxLjQsIEkgZ2V0CisgICAgICB2YXJpb3VzIGVycm9ycyB3aGVuIHRyeWluZyB0byA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+LCBmb3JrCisgICAgICA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IG9yIGFjY2VzcyBlbnZpcm9ubWVudAorICAgICAgdmFyaWFibGVzLgorICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiMxLjUtY3lnd2luLXNoIj4KKyAgVGhlIDxjb2RlPmFudDwvY29kZT4gd3JhcHBlciBzY3JpcHQgb2YgQW50IDEuNSBmYWlscworICAgICAgZm9yIEN5Z3dpbiBpZiA8Y29kZT5BTlRfSE9NRTwvY29kZT4gaXMgc2V0IHRvIGEgV2luZG93cyBzdHlsZQorICAgICAgcGF0aC4KKyAgICAgIDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjMS41LjItemlwLWJyb2tlbiI+CisgIDxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPiBpcyBicm9rZW4gaW4gQW50IDEuNS4yLgorICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiN1bmtub3duZWxlbWVudC50YXNrY29udGFpbmVyIj4KKyAgCisgICAgICAgIFdoeSBkbyBteSBjdXN0b20gdGFzayBjb250YWluZXJzIHNlZSBVbmtub3duIEVsZW1lbnRzIGluIEFudCAxLjYKKyAgICAgICAgLSB0aGV5IHdvcmtlZCBpbiBBbnQgMS41PworICAgICAgCisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2phdmEuZXhjZXB0aW9uLnN0YWNrdHJhY2UiPgorICAKKyAgICAgICAgVGhlIHByb2dyYW0gSSBydW4gdmlhICZsdDtqYXZhJmd0OyB0aHJvd3MgYW4gZXhjZXB0aW9uIGJ1dCBJCisgICAgICAgIGNhbid0IHNlZW0gdG8gZ2V0IHRoZSBmdWxsIHN0YWNrIHRyYWNlLgorICAgICAgCisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2p1bml0LW5vLXJ1bnRpbWUteG1sIj4KKyAgCisgICAgICAgIFVzaW5nIGZvcm1hdD0ieG1sIiwgJmx0O2p1bml0Jmd0OyBmYWlscyB3aXRoIGEKKyAgICAgICAgPGNvZGU+Tm9DbGFzc0RlZkZvdW5kRXJyb3I8L2NvZGU+IGlmIGZvcmtlZC4KKyAgICAgIAorICAgICAgPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiN4YWxhbi1qZGsxLjUiPgorICAKKyAgICAgICAgPGNvZGU+Jmx0O2p1bml0cmVwb3J0Jmd0OzwvY29kZT4gZG9lc24ndCB3b3JrIHdpdGggSkRLIDEuNSBidXQKKyAgICAgICAgd29ya2VkIGZpbmUgd2l0aCBKREsgMS40LgorICAgICAgCisgICAgICA8L2E+PC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgCisgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPkFuc3dlcnM8L2gzPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9ImxhdGVzdC12ZXJzaW9uIj48L2E+CisgICAgICBXaGVyZSBkbyBJIGZpbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgZG9jdW1lbnQ/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+VGhlIGxhdGVzdCB2ZXJzaW9uIGNhbiBhbHdheXMgYmUgZm91bmQgYXQgQW50J3MgaG9tZXBhZ2UKKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbDwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9ImFkZGluZy1mYXFzIj48L2E+CisgICAgICBIb3cgY2FuIEkgY29udHJpYnV0ZSB0byB0aGlzIEZBUT8KKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5UaGUgcGFnZSB5b3UgYXJlIGxvb2tpbmcgaXQgaXMgZ2VuZXJhdGVkIGZyb20KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9jb3JlL3RydW5rL3hkb2NzL2ZhcS54bWwiPnRoaXM8L2E+CisgICAgICAgICAgZG9jdW1lbnQuICBJZiB5b3Ugd2FudCB0byBhZGQgYSBuZXcgcXVlc3Rpb24sIHBsZWFzZSBzdWJtaXQKKyAgICAgICAgICBhIHBhdGNoIGFnYWluc3QgdGhpcyBkb2N1bWVudCB0byBvbmUgb2YgQW50J3MgbWFpbGluZyBsaXN0czsKKyAgICAgICAgICBob3BlZnVsbHksIHRoZSBzdHJ1Y3R1cmUgaXMgc2VsZi1leHBsYW5hdG9yeS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgZG9uJ3Qga25vdyBob3cgdG8gY3JlYXRlIGEgcGF0Y2gsIHNlZSB0aGUgcGF0Y2hlcworICAgICAgICAgIHNlY3Rpb24gb2YgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL3NvdXJjZS5odG1sIj50aGlzCisgICAgICAgICAgcGFnZTwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9ImNyZWF0aW5nLWZhcSI+PC9hPgorICAgICAgSG93IGRvIHlvdSBjcmVhdGUgdGhlIEhUTUwgdmVyc2lvbiBvZiB0aGlzCisgICAgICAgIEZBUT8KKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5XZSB1c2UKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy92ZWxvY2l0eS9hbmFraWEuaHRtbCI+QW5ha2lhPC9hPgorICAgICAgICB0byByZW5kZXIgdGhlIEhUTUwgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBYTUwgZmlsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgVmVsb2NpdHkgc3R5bGVzaGVldHMgdXNlZCB0byBwcm9jZXNzIHRoZSBYTUwgZmlsZXMgY2FuCisgICAgICAgIGJlIGZvdW5kIGluIHRoZSA8Y29kZT54ZG9jcy9zdHlsZXNoZWV0czwvY29kZT4gc3ViZGlyZWN0b3J5IG9mCisgICAgICAgIEFudCdzIFNWTiByZXBvc2l0b3J5IC0gdGhlIGJ1aWxkIGZpbGUKKyAgICAgICAgPGNvZGU+ZG9jcy54bWw8L2NvZGU+IGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFudCBTVk4KKyAgICAgICAgbW9kdWxlICh0cnVuaykgaXMgdXNlZCB0byBkcml2ZSBBbmFraWEuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBmaWxlIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSB0aGUKKyAgICAgICAgPGNvZGU+amFrYXJ0YS1zaXRlMjwvY29kZT4gQ1ZTIG1vZHVsZSBjaGVja2VkIG91dCBhcyB3ZWxsLCBidXQKKyAgICAgICAgaWYgeW91IGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb24gZnJvbSBBbmFraWEncyBob21lcGFnZSwgeW91CisgICAgICAgIHNob3VsZCBnZXQgaXQgdG8gd29yayB3aXRob3V0IHRoYXQuICBKdXN0IG1ha2Ugc3VyZSBhbGwKKyAgICAgICAgcmVxdWlyZWQgamFycyBhcmUgaW4gdGhlIHRhc2sncyBjbGFzc3BhdGguPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9IndoYXQtaXMtYW50Ij48L2E+CisgICAgICBXaGF0IGlzIEFwYWNoZSBBbnQ/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+IEFudCBpcyBhIEphdmEtYmFzZWQgYnVpbGQgdG9vbC4gSW4gdGhlb3J5LCBpdCBpcyBraW5kIG9mCisgICAgICAgIGxpa2UgTWFrZSwgd2l0aG91dCBNYWtlJ3Mgd3JpbmtsZXMgYW5kIHdpdGggdGhlIGZ1bGwKKyAgICAgICAgcG9ydGFiaWxpdHkgb2YgcHVyZSBKYXZhIGNvZGUuPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9ImFudC1uYW1lIj48L2E+CisgICAgICBXaHkgZG8geW91IGNhbGwgaXQgQW50PworICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPkFjY29yZGluZyB0byBBbnQncyBvcmlnaW5hbCBhdXRob3IsIEphbWVzIER1bmNhbgorICAgICAgICBEYXZpZHNvbiwgdGhlIG5hbWUgaXMgYW4gYWNyb255bSBmb3IgIkFub3RoZXIgTmVhdAorICAgICAgICBUb29sIi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5MYXRlciBleHBsYW5hdGlvbnMgZ28gYWxvbmcgdGhlIGxpbmVzIG9mICJhbnRzCisgICAgICAgIGRvIGFuIGV4dHJlbWVseSBnb29kIGpvYiBhdCBidWlsZGluZyB0aGluZ3MiLCBvcgorICAgICAgICAiYW50cyBhcmUgdmVyeSBzbWFsbCBhbmQgY2FuIGNhcnJ5IGEgd2VpZ2h0IGRvemVucyBvZiB0aW1lcworICAgICAgICB0aGVpciBvd24iIC0gZGVzY3JpYmluZyB3aGF0IEFudCBpcyBpbnRlbmRlZCB0bworICAgICAgICBiZS48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iaGlzdG9yeSI+PC9hPgorICAgICAgVGVsbCB1cyBhIGxpdHRsZSBiaXQgYWJvdXQgQW50J3MgaGlzdG9yeS4KKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5Jbml0aWFsbHksIEFudCB3YXMgcGFydCBvZiB0aGUgVG9tY2F0IGNvZGUgYmFzZSwgd2hlbiBpdCB3YXMKKyAgICAgICAgZG9uYXRlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEl0IHdhcworICAgICAgICBjcmVhdGVkIGJ5IEphbWVzIER1bmNhbiBEYXZpZHNvbiwgd2hvIGlzIGFsc28gdGhlIG9yaWdpbmFsCisgICAgICAgIGF1dGhvciBvZiBUb21jYXQuIEFudCB3YXMgdGhlcmUgdG8gYnVpbGQgVG9tY2F0LCBub3RoaW5nCisgICAgICAgIGVsc2UuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+U29vbiB0aGVyZWFmdGVyLCBzZXZlcmFsIG9wZW4gc291cmNlIEphdmEgcHJvamVjdHMgcmVhbGl6ZWQKKyAgICAgICAgdGhhdCBBbnQgY291bGQgc29sdmUgdGhlIHByb2JsZW1zIHRoZXkgaGFkIHdpdGggTWFrZWZpbGVzLgorICAgICAgICBTdGFydGluZyB3aXRoIHRoZSBwcm9qZWN0cyBob3N0ZWQgYXQgSmFrYXJ0YSBhbmQgdGhlIG9sZCBKYXZhCisgICAgICAgIEFwYWNoZSBwcm9qZWN0LCBBbnQgc3ByZWFkIGxpa2UgYSB2aXJ1cyBhbmQgaXMgbm93IHRoZSBidWlsZAorICAgICAgICB0b29sIG9mIGNob2ljZSBmb3IgYSBsb3Qgb2YgcHJvamVjdHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SW4gSmFudWFyeSAyMDAwLCBBbnQgd2FzIG1vdmVkIHRvIGEgc2VwYXJhdGUgQ1ZTIG1vZHVsZSBhbmQKKyAgICAgICAgd2FzIHByb21vdGVkIHRvIGEgcHJvamVjdCBvZiBpdHMgb3duLCBpbmRlcGVuZGVudCBvZgorICAgICAgICBUb21jYXQsIGFuZCBiZWNhbWUgQXBhY2hlIEFudC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgZmlyc3QgdmVyc2lvbiBvZiBBbnQgdGhhdCB3YXMgZXhwb3NlZCB0byBhIGxhcmdlciBhdWRpZW5jZQorICAgICAgICB3YXMgdGhlIG9uZSB0aGF0IHNoaXBwZWQgd2l0aCBUb21jYXQncyAzLjEgcmVsZWFzZSBvbiAxOSBBcHJpbAorICAgICAgICAyMDAwLiAgVGhpcyB2ZXJzaW9uIGhhcyBsYXRlciBiZWVuIHJlZmVycmVkIHRvIGFzIEFudAorICAgICAgICAwLjMuMS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgZmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZSBvZiBBbnQgYXMgYSBzdGFuZC1hbG9uZSBwcm9kdWN0IHdhcworICAgICAgICBBbnQgMS4xLCByZWxlYXNlZCBvbiAxOSBKdWx5IDIwMDAuICBUaGUgY29tcGxldGUgcmVsZWFzZQorICAgICAgICBoaXN0b3J5OjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRm9ycmVzdFRhYmxlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCBWZXJzaW9uCisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgUmVsZWFzZSBEYXRlCisgICAgICA8L3RoPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS4xCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMTkgSnVseSAyMDAwCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS4yCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMjQgT2N0b2JlciAyMDAwCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS4zCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMyBNYXJjaCAyMDAxCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS40CisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMyBTZXB0ZW1iZXIgMjAwMQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDEuNC4xCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMTEgT2N0b2JlciAyMDAxCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS41CisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMTAgSnVseSAyMDAyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS41LjEKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAzIE9jdG9iZXIgMjAwMgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDEuNS4yCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMyBNYXJjaCAyMDAzCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS41LjMKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA5IEFwcmlsIDIwMDMKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAxLjUuNAorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDEyIEF1Z3VzdCAyMDAzCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS42LjAKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAxOCBEZWNlbWJlciAyMDAzCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS42LjEKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAxMiBGZWJydWFyeSAyMDA0CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS42LjIKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAxNiBKdWx5IDIwMDQKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAxLjYuMworICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDI4IEFwcmlsIDIwMDUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAxLjYuNAorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDE5IE1heSAyMDA1CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS42LjUKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAyIEp1bmUgMjAwNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDEuNy4wCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMTkgRGVjZW1iZXIgMjAwNgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJuby1nbnUtdGFyIj48L2E+CisgICAgICBJIGdldCBjaGVja3N1bSBlcnJvcnMgd2hlbiBJIHRyeSB0byBleHRyYWN0IHRoZQorICAgICAgPGNvZGU+dGFyLmd6PC9jb2RlPiBkaXN0cmlidXRpb24gZmlsZS4gV2h5PworICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPkFudCdzIGRpc3RyaWJ1dGlvbiBjb250YWlucyBmaWxlIG5hbWVzIHRoYXQgYXJlIGxvbmdlcgorICAgICAgICB0aGFuIDEwMCBjaGFyYWN0ZXJzLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzdGFuZGFyZAorICAgICAgICB0YXIgZmlsZSBmb3JtYXQuIFNldmVyYWwgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiB0YXIgdXNlCisgICAgICAgIGRpZmZlcmVudCBhbmQgaW5jb21wYXRpYmxlIHdheXMgdG8gd29yayBhcm91bmQgdGhpcworICAgICAgICByZXN0cmljdGlvbi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnQncyAmbHQ7dGFyJmd0OyB0YXNrIGNhbiBjcmVhdGUgdGFyIGFyY2hpdmVzIHRoYXQgdXNlCisgICAgICAgIHRoZSBHTlUgdGFyIGV4dGVuc2lvbiwgYW5kIHRoaXMgaGFzIGJlZW4gdXNlZCB3aGVuIHB1dHRpbmcKKyAgICAgICAgdG9nZXRoZXIgdGhlIGRpc3RyaWJ1dGlvbi4gSWYgeW91IGFyZSB1c2luZyBhIGRpZmZlcmVudAorICAgICAgICB2ZXJzaW9uIG9mIHRhciAoZm9yIGV4YW1wbGUsIHRoZSBvbmUgc2hpcHBpbmcgd2l0aCBTb2xhcmlzKSwKKyAgICAgICAgeW91IGNhbm5vdCB1c2UgaXQgdG8gZXh0cmFjdCB0aGUgYXJjaGl2ZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgc29sdXRpb24gaXMgdG8gZWl0aGVyIGluc3RhbGwgR05VIHRhciwgd2hpY2ggY2FuIGJlCisgICAgICAgIGZvdW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90YXIvdGFyLmh0bWwiPmhlcmU8L2E+LAorICAgICAgICBvciB1c2UgdGhlIHppcCBhcmNoaXZlIGluc3RlYWQgKHlvdSBjYW4gZXh0cmFjdCBpdCB1c2luZworICAgICAgICA8Y29kZT5qYXIgeGY8L2NvZGU+KS48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iUmVkSGF0X0VTXzMiPjwvYT4KKyAgICAgIEhvdyBkbyB5b3UgZ2V0IGFudC0xLjYueCAob3IgYW55IHZlcnNpb24gbGF0ZXIgdGhhbgorICAgICAgMS41LjIpIHRvIHdvcmsgb24gb24gUmVkSGF0IEVTIDM/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+UmVkaGF0IEVTIDMuMCBjb21lcyBpbnN0YWxsZWQgd2l0aCBhbnQgMS41LjIuIEV2ZW4gaWYgeW91CisgICAgICAgIGhhdmUgeW91ciBQQVRIIGFuZCBBTlRfSE9NRSB2YXJpYWJsZXMgc2V0IGNvcnJlY3RseSB0byBhIGxhdGVyCisgICAgICAgIHZlcnNpb24gb2YgYW50LCB5b3Ugd2lsbCBhbHdheXMgYmUgZm9yY2VkIHRvIHVzZSB0aGUKKyAgICAgICAgcHJlaW5zdGFsbGVkIHZlcnNpb24uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VG8gdXNlIGEgbGF0ZXIgdmVyc2lvbiBvZiBhbnQgb24gdGhpcyBPUyB5b3UgY291bGQgZG8gdGhlCisgICAgICAgIGZvbGxvd2luZzo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyQgYW50IC12ZXJzaW9uCitBcGFjaGUgQW50IHZlcnNpb24gMS41LjItMjMgY29tcGlsZWQgb24gTm92ZW1iZXIgMTIgMjAwMworJCBzdSAtCisjIHJwbSAtZSBhbnQgYW50LWxpYnMKKyMgZXhpdAorJCBoYXNoIC1yCiskIGFudCAtdmVyc2lvbgorQXBhY2hlIEFudCB2ZXJzaW9uIDEuNi4yIGNvbXBpbGVkIG9uIEp1bHkgMTYgMjAwNAorPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iaW1wbGVtZW50LW9zLXNwZWNpZmljLWNvbmZpZ3VyYXRpb24iPjwvYT4KKyAgICAgIEhvdyBkbyBJIHJlYWxpemUgb3MtLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zPworICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb3JlIGlkZWEgaXMgdXNpbmcgcHJvcGVydHkgZmlsZXMgd2hpY2ggbmFtZSBhY2NvcmRzIHRvIHRoZQorICAgICAgICBvcy1uYW1lLiBUaGVuIHNpbXBseSB1c2UgdGhlIGJ1aWxkLWluIHByb3BlcnR5IDx0dD5vcy5uYW1lPC90dD4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIGJldHRlciB1c2UgeW91IHNob3VsZCBhbHNvIHByb3ZpZGUgYSBmaWxlIHdpdGggZGVmYXVsIHZhbHVlcy4KKyAgICAgICAgQnV0IGJlIGNhcmVmdWwgd2l0aCB0aGUgY29ycmVjdCBvcy1uYW1lcy4gRm9yIHRlc3Qgc2ltcGx5ICZsdDtlY2hvJmd0OworICAgICAgICB0aGUgJHtvcy5uYW1lfSBvbiBhbGwgbWFjaGluZXMgYW5kIHlvdSBjYW4gYmUgc3VyZSB0byB1c2UgdGhlIHJpZ2h0CisgICAgICAgIGZpbGUgbmFtZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CisgICAgICAgICAgJmx0O3Byb3BlcnR5IGZpbGU9JnF1b3Q7JHtvcy5uYW1lfS5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKyAgICAgICAgICAmbHQ7cHJvcGVydHkgZmlsZT0mcXVvdDtkZWZhdWx0LnByb3BlcnRpZXMmcXVvdDsvJmd0OworPC9wcmU+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iYWRkaW5nLWV4dGVybmFsLXRhc2tzIj48L2E+CisgICAgICBIb3cgZG8gSSBhZGQgYW4gZXh0ZXJuYWwgdGFzayB0aGF0IEkndmUgd3JpdHRlbiB0byB0aGUKKyAgICAgIHBhZ2UgIkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrcyI/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+Sm9pbiBhbmQgcG9zdCBhIG1lc3NhZ2UgdG8gdGhlIGRldiBvciB1c2VyIG1haWxpbmcKKyAgICAgICAgbGlzdCAob25lIGxpc3QgaXMgZW5vdWdoKSwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgaW5mb3JtYXRpb246PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT50aGUgbmFtZSBvZiB0aGUgdGFzay90b29sPC9saT4KKyAgICAgICAgICA8bGk+YSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFzay90b29sPC9saT4KKyAgICAgICAgICA8bGk+YSBDb21wYXRpYmlsaXR5OiBlbnRyeSBzdGF0aW5nIHdpdGggd2hpY2ggdmVyc2lvbihzKSBvZgorICAgICAgICAgIEFudCB0aGUgdG9vbC90YXNrIGlzIGNvbXBhdGlibGUgdG88L2xpPgorICAgICAgICAgIDxsaT5hIFVSTDogZW50cnkgbGlua2luZyB0byB0aGUgbWFpbiBwYWdlIG9mIHRoZSB0b29sL3Rhc2s8L2xpPgorICAgICAgICAgIDxsaT5hIENvbnRhY3Q6IGVudHJ5IGNvbnRhaW5pbmcgdGhlIGVtYWlsIGFkZHJlc3Mgb3IgdGhlIFVSTAorICAgICAgICAgIG9mIGEgd2VicGFnZSBmb3IgdGhlIHBlcnNvbiBvciBsaXN0IHRvIGNvbnRhY3QgZm9yIGlzc3VlcworICAgICAgICAgIHJlbGF0ZWQgdG8gdGhlIHRvb2wvdGFzay4gIDxzdHJvbmc+Tm90ZSB0aGF0IHdlJ2xsIGFkZCBhCisgICAgICAgICAgbGluayBvbiB0aGUgcGFnZSwgc28gYW55IGVtYWlsIGFkZHJlc3MgYWRkZWQgdGhlcmUgaXMgbm90CisgICAgICAgICAgb2JmdXNjYXRlZCBhbmQgY2FuIChhbmQgcHJvYmFibHkgd2lsbCkgYmUgYWJ1c2VkIGJ5IHJvYm90cworICAgICAgICAgIGhhcnZlc3Rpbmcgd2Vic2l0ZXMgZm9yIGFkZHJlc3NlcyB0byBzcGFtLjwvc3Ryb25nPjwvbGk+CisgICAgICAgICAgPGxpPmEgTGljZW5zZTogZW50cnkgY29udGFpbmluZyB0aGUgdHlwZSBvZiBsaWNlbnNlIGZvciB0aGUKKyAgICAgICAgICB0b29sL3Rhc2s8L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIHByZWZlcnJlZCBmb3JtYXQgZm9yIHRoaXMgaW5mb3JtYXRpb24gaXMgYSBwYXRjaCB0byA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9jb3JlL3RydW5rL3hkb2NzL2V4dGVybmFsLnhtbCI+dGhpczwvYT4KKyAgICAgICAgZG9jdW1lbnQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IGhhdmUgd3JpdHRlbiBzb21ldGhpbmcgYmlnZ2VyIHRoYW4gYSAnc2ltcGxlIHBsdWdpbicgdG8gQW50IGl0CisgICAgICAgIG1heSBiZSBiZXR0ZXIgdG8gYWRkIHRoZSBsaW5rIHRvIDxhIGhyZWY9InByb2plY3RzLmh0bWwiPnByb2plY3RzLmh0bWw8L2E+LgorICAgICAgICBUaGUgcHJvY2VkdXJlIHRvIGFkZCBpdCBpcyB0aGUgc2FtZS4gVGhlIGZpbGUgdG8gcGF0Y2ggaXMgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvY29yZS90cnVuay94ZG9jcy9wcm9qZWN0cy54bWwiPnRoaXM8L2E+CisgICAgICAgIGRvY3VtZW50LiBUaGUgc3ludGF4IG9mIHRoYXQgZmlsZSBpcyB0aGUgc2FtZS48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iY3JlYXRlLWV4dGVuc2lvbnMiPjwvYT4KKyAgICAgIEhvdyBkbyBJIGNyZWF0ZSBuZXcgdGFza3M/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+QXBhcnQgZnJvbSBhIGxvdCBvZiBpbmZvcm1hdGlvbiBvbiB1c2luZyBBbnQsIHRoZQorICAgICAgICA8YSBocmVmPSJtYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPiBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uCisgICAgICAgIG9uIGhvdyB0byBleHRlbmQgQW50IHdpdGggbmV3IHRhc2tzLiBUaGlzIGluZm9ybWF0aW9uCisgICAgICAgIGNhbiBiZSBmb3VuZCB1bmRlciAiRGV2ZWxvcGluZyB3aXRoIEFudCIuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q2hhbmNlcyBhcmUgdGhhdCBzb21lb25lIGVsc2UgYWxyZWFkeSBjcmVhdGVkIHRoZSB0YXNrIHlvdQorICAgICAgICB3YW50IHRvIGNyZWF0ZSwgaXQgbWF5IGJlIHdpc2UgdG8gc2VlCisgICAgICAgIDxhIGhyZWY9ImV4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4gYW5kCisgICAgICAgIDxhIGhyZWY9InByb2plY3RzLmh0bWwiPlJlbGF0ZWQgUHJvamVjdHM8L2E+IGZpcnN0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJwYXNzaW5nLWNsaS1hcmdzIj48L2E+CisgICAgICBIb3cgZG8gSSBwYXNzIHBhcmFtZXRlcnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHRvIG15CisgICAgICAgIGJ1aWxkIGZpbGU/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+VXNlIHByb3BlcnRpZXMuIFVzaW5nIDxjb2RlPmFudAorICAgICAgICAtRDxlbT5uYW1lPC9lbT49PGVtPnZhbHVlPC9lbT48L2NvZGU+IGxldHMgeW91IGRlZmluZSB2YWx1ZXMgZm9yCisgICAgICAgIHByb3BlcnRpZXMgb24gdGhlIEFudCBjb21tYW5kIGxpbmUuIFRoZXNlIHByb3BlcnRpZXMgY2FuIHRoZW4gYmUKKyAgICAgICAgdXNlZCB3aXRoaW4geW91ciBidWlsZCBmaWxlIGFzCisgICAgICAgIGFueSBub3JtYWwgcHJvcGVydHk6IDxjb2RlPiR7PGVtPm5hbWU8L2VtPn08L2NvZGU+IHdpbGwgcHV0IGluCisgICAgICAgIDxjb2RlPjxlbT52YWx1ZTwvZW0+PC9jb2RlPi48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iamlrZXMtc3dpdGNoZXMiPjwvYT4KKyAgICAgIEhvdyBjYW4gSSB1c2UgSmlrZXMtc3BlY2lmaWMgY29tbWFuZC1saW5lCisgICAgICAgIHN3aXRjaGVzPworICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPkEgY291cGxlIG9mIHN3aXRjaGVzIGFyZSBzdXBwb3J0ZWQgdmlhICJtYWdpYyIKKyAgICAgICAgICBwcm9wZXJ0aWVzOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRm9ycmVzdFRhYmxlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIHN3aXRjaAorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIHByb3BlcnR5CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgZGVmYXVsdAorICAgICAgPC90aD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgICtFCisgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgYnVpbGQuY29tcGlsZXIuZW1hY3MKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBmYWxzZSA9PSBub3Qgc2V0CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgK1AKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBidWlsZC5jb21waWxlci5wZWRhbnRpYworICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIGZhbHNlID09IG5vdCBzZXQKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICArRgorICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIGJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQKKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBmYWxzZSA9PSBub3Qgc2V0CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPHN0cm9uZz4oT25seSBmb3IgQW50ICZsdDsgMS40OyByZXBsYWNlZCBieSB0aGUKKyAgICAgICAgICAgICAgICA8Y29kZT48c3Ryb25nPm5vd2Fybjwvc3Ryb25nPjwvY29kZT4KKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPjxzdHJvbmc+Jmx0O2phdmFjJmd0Ozwvc3Ryb25nPjwvY29kZT4KKyAgICAgICAgICAgICAgICB0YXNrIGFmdGVyIHRoYXQuKTwvc3Ryb25nPjxiciAvPi1ub3dhcm4KKyAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBidWlsZC5jb21waWxlci53YXJuaW5ncworICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIHRydWUgPT0gbm90IHNldAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPldpdGggQW50ICZndDs9IDEuNSwgeW91IGNhbiBhbHNvIHVzZSBuZXN0ZWQKKyAgICAgICAgICA8Y29kZT4mbHQ7Y29tcGlsZXJhcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cyB3aXRoIHRoZQorICAgICAgICAgIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IHRhc2suPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9InNoZWxsLXJlZGlyZWN0LTEiPjwvYT4KKyAgICAgIEhvdyBkbyBJIGluY2x1ZGUgYSAmbHQ7IGNoYXJhY3RlciBpbiBteSBjb21tYW5kLWxpbmUgYXJndW1lbnRzPworICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPlRoZSBzaG9ydCBhbnN3ZXIgaXMgIlVzZTogPGNvZGU+JmFtcDtsdDs8L2NvZGU+Ii48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgbG9uZyBhbnN3ZXIgaXMgdGhhdCB0aGlzIHByb2JhYmx5IHdvbid0IGRvIHdoYXQgeW91CisgICAgICAgIHdhbnQgYW55d2F5IChzZWUgPGEgaHJlZj0iI3NoZWxsLXJlZGlyZWN0LTIiPnRoZSBuZXh0CisgICAgICAgIHNlY3Rpb248L2E+KS48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0ic2hlbGwtcmVkaXJlY3QtMiI+PC9hPgorICAgICAgSG93IGRvIEkgcmVkaXJlY3Qgc3RhbmRhcmQgaW5wdXQgb3Igc3RhbmRhcmQgb3V0cHV0CisgICAgICAgIGluIHRoZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRhc2s/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+U2F5IHlvdSB3YW50IHRvIHJlZGlyZWN0IHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtIG9mIHRoZQorICAgICAgICA8Y29kZT5tNDwvY29kZT4gY29tbWFuZCB0byB3cml0ZSB0byBhIGZpbGUsIHNvbWV0aGluZworICAgICAgICBsaWtlOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorc2hlbGwtcHJvbXB0Jmd0OyBtNCBmb28ubTQgJmd0OyBmb28KKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+YW5kIHRyeSB0byB0cmFuc2xhdGUgaXQgaW50bzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O2V4ZWMgZXhlY3V0YWJsZT0mcXVvdDttNCZxdW90OyZndDsKKyAgJmx0O2FyZyB2YWx1ZT0mcXVvdDtmb28ubTQmcXVvdDsvJmd0OworICAmbHQ7YXJnIHZhbHVlPSZxdW90OyZhbXA7Z3Q7JnF1b3Q7LyZndDsKKyAgJmx0O2FyZyB2YWx1ZT0mcXVvdDtmb28mcXVvdDsvJmd0OworJmx0Oy9leGVjJmd0OworPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIHdpbGwgbm90IGRvIHdoYXQgeW91IGV4cGVjdC4gIFRoZSBvdXRwdXQgcmVkaXJlY3Rpb24gaXMKKyAgICAgICAgcGVyZm9ybWVkIGJ5IHlvdXIgc2hlbGwsIG5vdCB0aGUgY29tbWFuZCBpdHNlbGYsIHNvIHRoaXMKKyAgICAgICAgc2hvdWxkIHJlYWQ6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CismbHQ7ZXhlYyBleGVjdXRhYmxlPSZxdW90Oy9iaW4vc2gmcXVvdDsmZ3Q7CisgICZsdDthcmcgdmFsdWU9JnF1b3Q7LWMmcXVvdDsgLyZndDsKKyAgJmx0O2FyZyB2YWx1ZT0mcXVvdDttNCBmb28ubTQgJmFtcDtndDsgZm9vJnF1b3Q7IC8mZ3Q7CismbHQ7L2V4ZWMmZ3Q7Cis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vdGUgdGhhdCB5b3UgbXVzdCB1c2UgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBhdHRyaWJ1dGUgb2YKKyAgICAgICAgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGluIHRoZSBsYXN0IGVsZW1lbnQsIGluIG9yZGVyIHRvIGhhdmUKKyAgICAgICAgdGhlIGNvbW1hbmQgcGFzc2VkIGFzIGEgc2luZ2xlLCBxdW90ZWQgYXJndW1lbnQuIEFsdGVybmF0aXZlbHksCisgICAgICAgIHlvdSBjYW4gdXNlOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O2V4ZWMgZXhlY3V0YWJsZT0mcXVvdDsvYmluL3NoJnF1b3Q7Jmd0OworICAmbHQ7YXJnIGxpbmU9Jy1jICZxdW90O200IGZvby5tNCAmYW1wO2d0OyBmb28mcXVvdDsnLyZndDsKKyZsdDsvZXhlYyZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+Tm90ZSB0aGUgZG91YmxlLXF1b3RlcyBuZXN0ZWQgaW5zaWRlIHRoZSBzaW5nbGUtcXVvdGVzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJiYXRjaC1zaGVsbC1leGVjdXRlIj48L2E+CisgICAgICBIb3cgZG8gSSBleGVjdXRlIGEgYmF0Y2ggZmlsZSBvciBzaGVsbCBzY3JpcHQgZnJvbSBBbnQ/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+T24gbmF0aXZlIFVuaXggc3lzdGVtcywgeW91IHNob3VsZCBiZSBhYmxlIHRvIHJ1biBzaGVsbCBzY3JpcHRzCisgICAgICAgICAgIGRpcmVjdGx5LiBPbiBzeXN0ZW1zIHJ1bm5pbmcgYSBVbml4LXR5cGUgc2hlbGwgKGZvciBleGFtcGxlLCBDeWd3aW4KKyAgICAgICAgICAgb24gV2luZG93cykgZXhlY3V0ZSB0aGUgKGNvbW1hbmQpIHNoZWxsIGluc3RlYWQgLSA8Y29kZT5jbWQ8L2NvZGU+CisgICAgICAgICAgIGZvciBiYXRjaCBmaWxlcywgPGNvZGU+c2g8L2NvZGU+IGZvciBzaGVsbCBzY3JpcHRzIC0gdGhlbiBwYXNzIHRoZQorICAgICAgICAgICBiYXRjaCBmaWxlIG9yIHNoZWxsIHNjcmlwdCAocGx1cyBhbnkgYXJndW1lbnRzIHRvIHRoZSBzY3JpcHQpCisgICAgICAgICAgIGFzIGEgc2luZ2xlIGNvbW1hbmQsIHVzaW5nIHRoZSA8Y29kZT4vYzwvY29kZT4gb3IKKyAgICAgICAgICAgPGNvZGU+LWM8L2NvZGU+IHN3aXRjaCwgcmVzcGVjdGl2ZWx5LiBTZWUKKyAgICAgICAgICAgPGEgaHJlZj0iI3NoZWxsLXJlZGlyZWN0LTIiPnRoZSBhYm92ZSBzZWN0aW9uPC9hPgorICAgICAgICAgICBmb3IgZXhhbXBsZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRhc2tzCisgICAgICAgICAgIGV4ZWN1dGluZyA8Y29kZT5zaDwvY29kZT4uIEZvciBiYXRjaCBmaWxlcywgdXNlIHNvbWV0aGluZyBsaWtlOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O2V4ZWMgZGlyPSZxdW90Oy4mcXVvdDsgZXhlY3V0YWJsZT0mcXVvdDtjbWQmcXVvdDsgb3M9JnF1b3Q7V2luZG93cyBOVCZxdW90OyZndDsKKyAgJmx0O2FyZyBsaW5lPSZxdW90Oy9jIHRlc3QuYmF0JnF1b3Q7LyZndDsKKyZsdDsvZXhlYyZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9Im11bHRpLWNvbmRpdGlvbnMiPjwvYT4KKyAgICAgIEkgd2FudCB0byBleGVjdXRlIGEgcGFydGljdWxhciB0YXJnZXQgb25seSBpZgorICAgICAgICBtdWx0aXBsZSBjb25kaXRpb25zIGFyZSB0cnVlLgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPlRoZXJlIGFyZSBhY3R1YWxseSBzZXZlcmFsIGFuc3dlcnMgdG8gdGhpcyBxdWVzdGlvbi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgaGF2ZSBvbmx5IG9uZSBzZXQgYW5kIG9uZSB1bnNldCBwcm9wZXJ0eSB0byB0ZXN0LAorICAgICAgICB5b3UgY2FuIHNwZWNpZnkgYm90aCBhbiA8Y29kZT5pZjwvY29kZT4gYW5kIGFuIDxjb2RlPnVubGVzczwvY29kZT4KKyAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgdGFyZ2V0LCBhbmQgdGhleSB3aWxsIGFjdCBhcyBpZiB0aGV5CisgICAgICAgIGFyZSAiYW5kZWQiIHRvZ2V0aGVyLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdSBhcmUgdXNpbmcgYSB2ZXJzaW9uIG9mIEFudCAxLjMgb3IgZWFybGllciwgdGhlCisgICAgICAgIHdheSB0byB3b3JrIHdpdGggYWxsIG90aGVyIGNhc2VzIGlzIHRvIGNoYWluIHRhcmdldHMgdG9nZXRoZXIKKyAgICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBzdGF0ZSB5b3Ugd2FudCB0byB0ZXN0IGZvci48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UbyBzZWUgaG93IHRoaXMgd29ya3MsIGFzc3VtZSB5b3UgaGF2ZSB0aHJlZSBwcm9wZXJ0aWVzOgorICAgICAgICA8Y29kZT5wcm9wMTwvY29kZT4sIDxjb2RlPnByb3AyPC9jb2RlPiwgYW5kIDxjb2RlPnByb3AzPC9jb2RlPi4KKyAgICAgICAgWW91IHdhbnQgdG8gdGVzdCB0aGF0IDxjb2RlPnByb3AxPC9jb2RlPiBhbmQgPGNvZGU+cHJvcDI8L2NvZGU+CisgICAgICAgIGFyZSBzZXQsIGFuZCB0aGF0IDxjb2RlPnByb3AzPC9jb2RlPiBpcyBub3QuIElmIHRoZSBjb25kaXRpb24KKyAgICAgICAgaG9sZHMgdHJ1ZSB5b3Ugd2FudCB0byBlY2hvICJ5ZXMiLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhlcmUgaXMgdGhlIGltcGxlbWVudGF0aW9uIGluIEFudCAxLjMgYW5kIGVhcmxpZXI6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y29uZCZxdW90OyBkZXBlbmRzPSZxdW90O2NvbmQtaWYmcXVvdDsvJmd0OworCismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y29uZC1pZiZxdW90OyBpZj0mcXVvdDtwcm9wMSZxdW90OyZndDsKKyAgJmx0O2FudGNhbGwgdGFyZ2V0PSZxdW90O2NvbmQtaWYtMiZxdW90Oy8mZ3Q7CismbHQ7L3RhcmdldCZndDsKKworJmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbmQtaWYtMiZxdW90OyBpZj0mcXVvdDtwcm9wMiZxdW90OyZndDsKKyAgJmx0O2FudGNhbGwgdGFyZ2V0PSZxdW90O2NvbmQtaWYtMyZxdW90Oy8mZ3Q7CismbHQ7L3RhcmdldCZndDsKKworJmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbmQtaWYtMyZxdW90OyB1bmxlc3M9JnF1b3Q7cHJvcDMmcXVvdDsmZ3Q7CisgICZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7eWVzJnF1b3Q7LyZndDsKKyZsdDsvdGFyZ2V0Jmd0OworPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Ob3RlOiA8Y29kZT4mbHQ7YW50Y2FsbCZndDs8L2NvZGU+IHRhc2tzIGRvIDxlbT5ub3Q8L2VtPiBwYXNzCisgICAgICAgIHByb3BlcnR5IGNoYW5nZXMgYmFjayB1cCB0byB0aGUgZW52aXJvbm1lbnQgdGhleSB3ZXJlIGNhbGxlZAorICAgICAgICBmcm9tLCBzbyB5b3Ugd291bGRuJ3QgYmUgYWJsZSB0bywgZm9yIGV4YW1wbGUsIHNldCBhCisgICAgICAgIDxjb2RlPnJlc3VsdDwvY29kZT4gcHJvcGVydHkgaW4gdGhlIDxjb2RlPmNvbmQtaWYtMzwvY29kZT4gdGFyZ2V0LAorICAgICAgICB0aGVuIGRvCisgICAgICAgIDxjb2RlPiZsdDtlY2hvIG1lc3NhZ2U9InJlc3VsdCBpcyAke3Jlc3VsdH0iLyZndDs8L2NvZGU+CisgICAgICAgIGluIHRoZSA8Y29kZT5jb25kPC9jb2RlPiB0YXJnZXQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS40LCB5b3UgY2FuIHVzZSB0aGUKKyAgICAgICAgPGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+IHRhc2suPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y29uZCZxdW90OyBkZXBlbmRzPSZxdW90O2NvbmQtaWYsY29uZC1lbHNlJnF1b3Q7LyZndDsKKworJmx0O3RhcmdldCBuYW1lPSZxdW90O2NoZWNrLWNvbmQmcXVvdDsmZ3Q7CisgICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7Y29uZC1pcy10cnVlJnF1b3Q7Jmd0OworICAgICZsdDthbmQmZ3Q7CisgICAgICAmbHQ7bm90Jmd0OworICAgICAgICAmbHQ7ZXF1YWxzIGFyZzE9JnF1b3Q7JHtwcm9wMX0mcXVvdDsgYXJnMj0mcXVvdDskJHtwcm9wMX0mcXVvdDsgLyZndDsKKyAgICAgICZsdDsvbm90Jmd0OworICAgICAgJmx0O25vdCZndDsKKyAgICAgICAgJmx0O2VxdWFscyBhcmcxPSZxdW90OyR7cHJvcDJ9JnF1b3Q7IGFyZzI9JnF1b3Q7JCR7cHJvcDJ9JnF1b3Q7IC8mZ3Q7CisgICAgICAmbHQ7L25vdCZndDsKKyAgICAgICZsdDtlcXVhbHMgYXJnMT0mcXVvdDske3Byb3AzfSZxdW90OyBhcmcyPSZxdW90OyQke3Byb3AzfSZxdW90OyAvJmd0OworICAgICZsdDsvYW5kJmd0OworICAmbHQ7L2NvbmRpdGlvbiZndDsKKyZsdDsvdGFyZ2V0Jmd0OworCismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Y29uZC1pZiZxdW90OyBkZXBlbmRzPSZxdW90O2NoZWNrLWNvbmQmcXVvdDsgaWY9JnF1b3Q7Y29uZC1pcy10cnVlJnF1b3Q7Jmd0OworICAmbHQ7ZWNobyBtZXNzYWdlPSZxdW90O3llcyZxdW90Oy8mZ3Q7CismbHQ7L3RhcmdldCZndDsKKworJmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbmQtZWxzZSZxdW90OyBkZXBlbmRzPSZxdW90O2NoZWNrLWNvbmQmcXVvdDsgdW5sZXNzPSZxdW90O2NvbmQtaXMtdHJ1ZSZxdW90OyZndDsKKyAgJmx0O2VjaG8gbWVzc2FnZT0mcXVvdDtubyZxdW90Oy8mZ3Q7CismbHQ7L3RhcmdldCZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyB2ZXJzaW9uIHRha2VzIGFkdmFudGFnZSBvZiB0d28gdGhpbmdzOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+SWYgYSBwcm9wZXJ0eSA8Y29kZT5hPC9jb2RlPiBoYXMgbm90IGJlZW4gc2V0LAorICAgICAgICAgIDxjb2RlPiR7YX08L2NvZGU+IHdpbGwgZXZhbHVhdGUgdG8gPGNvZGU+JHthfTwvY29kZT4uPC9saT4KKworICAgICAgICAgIDxsaT5UbyBnZXQgYSBsaXRlcmFsIDxjb2RlPiQ8L2NvZGU+IGluIEFudCwgeW91IGhhdmUgdG8KKyAgICAgICAgICBlc2NhcGUgaXQgd2l0aCBhbm90aGVyIDxjb2RlPiQ8L2NvZGU+IC0gdGhpcyB3aWxsIGFsc28gYnJlYWsKKyAgICAgICAgICB0aGUgc3BlY2lhbCB0cmVhdG1lbnQgb2YgdGhlIDxjb2RlPiR7PC9jb2RlPiBzZXF1ZW5jZS48L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QmVjYXVzZSB0ZXN0aW5nIGZvciBhIGxpdGVyYWwgPGNvZGU+JHtwcm9wZXJ0eX08L2NvZGU+IHN0cmluZworICAgICAgICBpc24ndCBhbGwgdGhhdCByZWFkYWJsZSBvciBlYXN5IHRvIHVuZGVyc3RhbmQsCisgICAgICAgIHBvc3QtMS40LjEgQW50IGludHJvZHVjZXMgdGhlIDxjb2RlPiZsdDtpc3NldCZndDs8L2NvZGU+IGVsZW1lbnQKKyAgICAgICAgdG8gdGhlIDxjb2RlPiZsdDtjb25kaXRpb24mZ3Q7PC9jb2RlPiB0YXNrLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhlcmUgaXMgdGhlIHByZXZpb3VzIGV4YW1wbGUgZG9uZSB1c2luZworICAgICAgICA8Y29kZT4mbHQ7aXNzZXQmZ3Q7PC9jb2RlPjo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDt0YXJnZXQgbmFtZT0mcXVvdDtjaGVjay1jb25kJnF1b3Q7Jmd0OworICAmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSZxdW90O2NvbmQtaXMtdHJ1ZSZxdW90OyZndDsKKyAgICAmbHQ7YW5kJmd0OworICAgICAgJmx0O2lzc2V0IHByb3BlcnR5PSZxdW90O3Byb3AxJnF1b3Q7LyZndDsKKyAgICAgICZsdDtpc3NldCBwcm9wZXJ0eT0mcXVvdDtwcm9wMiZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7bm90Jmd0OworICAgICAgICAmbHQ7aXNzZXQgcHJvcGVydHk9JnF1b3Q7cHJvcDMmcXVvdDsvJmd0OworICAgICAgJmx0Oy9ub3QmZ3Q7CisgICAgJmx0Oy9hbmQmZ3Q7CisgICZsdDsvY29uZGl0aW9uJmd0OworJmx0Oy90YXJnZXQmZ3Q7Cis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBsYXN0IG9wdGlvbiBpcyB0byB1c2UgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgdG8gc2V0IHRoZQorICAgICAgICBwcm9wZXJ0aWVzLiBUaGlzIGNhbiBiZSBwYXJ0aWN1bGFybHkgaGFuZHkgd2hlbiB5b3UgbmVlZCBtdWNoCisgICAgICAgIGZpbmVyIGNvbnRyb2wgdGhhbiB0aGUgc2ltcGxlIGNvbmRpdGlvbnMgc2hvd24gaGVyZSBidXQsIG9mCisgICAgICAgIGNvdXJzZSwgY29tZXMgd2l0aCB0aGUgb3ZlcmhlYWQgb2YgYWRkaW5nIEpBUiBmaWxlcyB0byBzdXBwb3J0CisgICAgICAgIHRoZSBsYW5ndWFnZSwgdG8gc2F5IG5vdGhpbmcgb2YgdGhlIGFkZGVkIG1haW50ZW5hbmNlIGluIHJlcXVpcmluZworICAgICAgICB0d28gbGFuZ3VhZ2VzIHRvIGltcGxlbWVudCBhIHNpbmdsZSBzeXN0ZW0uIFNlZSB0aGUKKyAgICAgICAgPGEgaHJlZj0ibWFudWFsL09wdGlvbmFsVGFza3Mvc2NyaXB0Lmh0bWwiPgorICAgICAgICA8Y29kZT4mbHQ7c2NyaXB0Jmd0OzwvY29kZT4gdGFzayBkb2N1bWVudGF0aW9uPC9hPiBmb3IgbW9yZQorICAgICAgICBkZXRhaWxzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJlbmNvZGluZyI+PC9hPgorICAgICAgSG93IGNhbiBJIGluY2x1ZGUgbmF0aW9uYWwgY2hhcmFjdGVycyBsaWtlIEdlcm1hbgorICAgICAgICB1bWxhdXRzIGluIG15IGJ1aWxkIGZpbGU/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+WW91IG5lZWQgdG8gdGVsbCB0aGUgWE1MIHBhcnNlciB3aGljaCBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgICAgeW91ciBidWlsZCBmaWxlIHVzZXMsIHRoaXMgaXMgZG9uZSBpbnNpZGUgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLXhtbC0yMDAwMTAwNiNzZWMtcHJvbG9nLWR0ZCI+WE1MCisgICAgICAgIGRlY2xhcmF0aW9uPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5CeSBkZWZhdWx0IHRoZSBwYXJzZXIgYXNzdW1lcyB5b3UgYXJlIHVzaW5nIHRoZSBVVEYtOAorICAgICAgICBlbmNvZGluZyBpbnN0ZWFkIG9mIHlvdXIgcGxhdGZvcm0ncyBkZWZhdWx0LiAgRm9yIG1vc3QgV2VzdGVybgorICAgICAgICBFdXJvcGVhbiBjb3VudHJpZXMgeW91IHNob3VsZCBzZXQgdGhlIGVuY29kaW5nIHRvCisgICAgICAgIDxjb2RlPklTTy04ODU5LTE8L2NvZGU+LiAgVG8gZG8gc28sIG1ha2UgdGhlIHZlcnkgZmlyc3QgbGluZQorICAgICAgICBvZiB5b3UgYnVpbGQgZmlsZSByZWFkIGxpa2U8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0lTTy04ODU5LTEmcXVvdDsgPyZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9InVzZS16aXAtaW5zdGVhZC1vZi1qYXIiPjwvYT4KKyAgICAgIEhvdyBkbyBJIHVzZSA8Y29kZT5qYXI8L2NvZGU+J3MgPGNvZGU+TTwvY29kZT4gc3dpdGNoPworICAgICAgSSBkb24ndCB3YW50IGEgTUFOSUZFU1QuCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+QSBKQVIgYXJjaGl2ZSBpcyBhIFpJUCBmaWxlLCBzbyBpZiB5b3UgZG9uJ3Qgd2FudCBhCisgICAgICAgIE1BTklGRVNUIHlvdSBjYW4gc2ltcGx5IHVzZSA8Y29kZT4mbHQ7emlwJmd0OzwvY29kZT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91ciBmaWxlIG5hbWVzIGNvbnRhaW4gbmF0aW9uYWwgY2hhcmFjdGVycyB5b3Ugc2hvdWxkCisgICAgICAgIGtub3cgdGhhdCBTdW4ncyA8Y29kZT5qYXI8L2NvZGU+IHV0aWxpdHkgbGlrZSBBbnQncworICAgICAgICA8Y29kZT4mbHQ7amFyJmd0OzwvY29kZT4gdXNlcyBVVEYtOCB0byBlbmNvZGUgdGhlaXIgbmFtZXMgd2hpbGUKKyAgICAgICAgPGNvZGU+Jmx0O3ppcCZndDs8L2NvZGU+IHVzZXMgeW91ciBwbGF0Zm9ybXMgZGVmYXVsdCBlbmNvZGluZy4KKyAgICAgICAgVXNlIHRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgb2YgPGNvZGU+Jmx0O3ppcCZndDs8L2NvZGU+IGlmCisgICAgICAgIG5lY2Vzc2FyeS48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0icHJvcGVydHl2YWx1ZS1hcy1uYW1lLWZvci1wcm9wZXJ0eSI+PC9hPgorICAgICAgSG93IGNhbiBJIGRvIHNvbWV0aGluZyBsaWtlIDxjb2RlPiZsdDtwcm9wZXJ0eSBuYW1lPSJwcm9wIgorICAgICAgdmFsdWU9IiR7JHthbm90aGVycHJvcH19Ii8mZ3Q7PC9jb2RlPiAoZG91YmxlIGV4cGFuZGluZyB0aGUgcHJvcGVydHkpPworICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPldpdGhvdXQgYW55IGV4dGVybmFsIGhlbHAgeW91IGNhbiBub3QuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2l0aCAmbHQ7c2NyaXB0LyZndDssIHdoaWNoIG5lZWRzIGV4dGVybmFsIGxpYnJhcmllcywgeW91IGNhbiBkbzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O3NjcmlwdCBsYW5ndWFnZT0mcXVvdDtqYXZhc2NyaXB0JnF1b3Q7Jmd0OworICAgIHByb3BuYW1lID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgmcXVvdDthbm90aGVycHJvcCZxdW90Oyk7CisgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgmcXVvdDtwcm9wJnF1b3Q7LCBwcm9wbmFtZSk7CismbHQ7L3NjcmlwdCZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2l0aCBBbnRDb250cmliIChleHRlcm5hbCB0YXNrIGxpYnJhcnkpIHlvdSBjYW4gZG8gPGNvZGU+CisgICAgICAgICAmbHQ7cHJvcGVydHljb3B5IG5hbWU9InByb3AiIGZyb209IiR7YW5vdGhlcnByb3B9Ii8mZ3Q7PC9jb2RlPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5XaXRoIEFudCAxLjYgeW91IGNhbiBzaW11bGF0ZSB0aGUgQW50Q29udHJpYnMgJmx0O3Byb3BlcnR5Y29weSZndDsKKyAgICAgICAgIGFuZCBhdm9pZCB0aGUgbmVlZCBvZiBhbiBleHRlcm5hbCBsaWJyYXJ5OjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O21hY3JvZGVmIG5hbWU9JnF1b3Q7cHJvcGVydHljb3B5JnF1b3Q7Jmd0OworICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7bmFtZSZxdW90Oy8mZ3Q7CisgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtmcm9tJnF1b3Q7LyZndDsKKyAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7QHtuYW1lfSZxdW90OyB2YWx1ZT0mcXVvdDske0B7ZnJvbX19JnF1b3Q7LyZndDsKKyAgJmx0Oy9zZXF1ZW50aWFsJmd0OworJmx0Oy9tYWNyb2RlZiZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9ImRlbGV0ZS1kaXJlY3RvcnktY2hpbGRyZW4tb25seSI+PC9hPgorICAgICAgSG93IGNhbiBJIGRlbGV0ZSBldmVyeXRoaW5nIGJlbmVhdGggYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSwKKyAgICBwcmVzZXJ2aW5nIHRoZSBkaXJlY3RvcnkgaXRzZWxmPworICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPk1vc3QgdXNlcnMgd2hvIGdvIGRvd24gdGhpcyBwYXRoIGhhdmUgbm8gcHJvYmxlbSBmaWd1cmluZyBvdXQgdGhhdAorICA8Y29kZT4mbHQ7ZGVsZXRlIGluY2x1ZGVlbXB0eWRpcnM9InRydWUiIC8mZ3Q7PC9jb2RlPiB3aWxsIGhlbHAgdGhlbS4gIFRoZQorICBzZWVtaW5nbHkgdHJpY2t5IHBhcnQgaXMgcHJlc2VydmluZyB0aGUgYmFzZSBkaXJlY3RvcnkgaXRzZWxmLAorICB3aGljaCBBbnQgaW5jbHVkZXMgaW4gdGhlIGRpcmVjdG9yeSBzY2FuLiBGb3J0dW5hdGVseSB0aGUgYW5zd2VyIGlzIHNpbXBsZToKKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O2RlbGV0ZSBpbmNsdWRlZW1wdHlkaXJzPSZxdW90O3RydWUmcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtkaXJ0b2tlZXAmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKiZxdW90OyAvJmd0OworJmx0Oy9kZWxldGUmZ3Q7Cis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJnZW5lcmFsLWFkdmljZSI+PC9hPgorICAgICAgR2VuZXJhbCBBZHZpY2UKKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5UaGVyZSBhcmUgbWFueSByZWFzb25zIHdoeSBBbnQgZG9lc24ndCBiZWhhdmUgYXMKKyAgICAgICAgZXhwZWN0ZWQsIG5vdCBhbGwgb2YgdGhlbSBhcmUgZHVlIHRvIEFudCBidWdzLiAgU2VlIG91ciA8YSBocmVmPSJwcm9ibGVtcy5odG1sIj5IYXZpbmcgUHJvYmxlbXM/PC9hPiBwYWdlIGZvciBoaW50cyB0aGF0CisgICAgICAgIG1heSBoZWxwIHBpbm5pbmcgZG93biB0aGUgcmVhc29ucyBmb3IgeW91ciBwcm9ibGVtLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJhbHdheXMtcmVjb21waWxlcyI+PC9hPgorICAgICAgV2h5IGRvZXMgQW50IGFsd2F5cyByZWNvbXBpbGUgYWxsIG15IEphdmEgZmlsZXM/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+SW4gb3JkZXIgdG8gZmluZCBvdXQgd2hpY2ggZmlsZXMgc2hvdWxkIGJlIGNvbXBpbGVkLCBBbnQKKyAgICAgICAgY29tcGFyZXMgdGhlIHRpbWVzdGFtcHMgb2YgdGhlIHNvdXJjZSBmaWxlcyB0byB0aG9zZSBvZiB0aGUKKyAgICAgICAgcmVzdWx0aW5nIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMuICBPcGVuaW5nIGFsbCBzb3VyY2UgZmlsZXMKKyAgICAgICAgdG8gZmluZCBvdXQgd2hpY2ggcGFja2FnZSB0aGV5IGJlbG9uZyB0byB3b3VsZCBiZSB2ZXJ5CisgICAgICAgIGluZWZmaWNpZW50LiBJbnN0ZWFkLCBBbnQgZXhwZWN0cyB5b3UgdG8gcGxhY2UgeW91cgorICAgICAgICBzb3VyY2UgZmlsZXMgaW4gYSBkaXJlY3RvcnkgaGllcmFyY2h5IHRoYXQgbWlycm9ycyB5b3VyCisgICAgICAgIHBhY2thZ2UgaGllcmFyY2h5IGFuZCB0byBwb2ludCBBbnQgdG8gdGhlIHJvb3Qgb2YgdGhpcworICAgICAgICBkaXJlY3RvcnkgdHJlZSB3aXRoIHRoZSA8Y29kZT5zcmNkaXI8L2NvZGU+IGF0dHJpYnV0ZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5TYXkgeW91IGhhdmUgPGNvZGU+Jmx0O2phdmFjIHNyY2Rpcj0ic3JjIgorICAgICAgICBkZXN0ZGlyPSJkZXN0Ii8mZ3Q7PC9jb2RlPi4gIElmIEFudCBmaW5kcyBhIGZpbGUKKyAgICAgICAgPGNvZGU+c3JjL2EvYi9DLmphdmE8L2NvZGU+LCBpdCBleHBlY3RzIGl0IHRvIGJlIGluIHBhY2thZ2UKKyAgICAgICAgPGNvZGU+YS5iPC9jb2RlPiBzbyB0aGF0IHRoZSByZXN1bHRpbmcgPGNvZGU+LmNsYXNzPC9jb2RlPgorICAgICAgICBmaWxlIGlzIGdvaW5nIHRvIGJlIDxjb2RlPmRlc3QvYS9iL0MuY2xhc3M8L2NvZGU+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdXIgc291cmNlLXRyZWUgZGlyZWN0b3J5IHN0cnVjdHVyZSBkb2VzIG5vdCBtYXRjaCB5b3VyCisgICAgICAgIHBhY2thZ2Ugc3RydWN0dXJlLCBBbnQncyBoZXVyaXN0aWMgd29uJ3Qgd29yaywgYW5kCisgICAgICAgIGl0IHdpbGwgcmVjb21waWxlIGNsYXNzZXMgdGhhdCBhcmUgdXAtdG8tZGF0ZS4gIEFudCBpcyBub3QgdGhlCisgICAgICAgIG9ubHkgdG9vbCB0aGF0IGV4cGVjdHMgYSBzb3VyY2UtdHJlZSBsYXlvdXQgbGlrZSB0aGlzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdSBoYXZlIEphdmEgc291cmNlIGZpbGVzIHRoYXQgYXJlbid0IGRlY2xhcmVkIHRvCisgICAgICAgIGJlIHBhcnQgb2YgYW55IHBhY2thZ2UsIHlvdSBjYW4gc3RpbGwgdXNlIHRoZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPgorICAgICAgICB0YXNrIHRvIGNvbXBpbGUgdGhlc2UgZmlsZXMgY29ycmVjdGx5IC0ganVzdCBzZXQgdGhlCisgICAgICAgIDxjb2RlPnNyY2RpcjwvY29kZT4gYW5kIDxjb2RlPmRlc3RkaXI8L2NvZGU+IGF0dHJpYnV0ZXMgdG8KKyAgICAgICAgdGhlIGFjdHVhbCBkaXJlY3RvcnkgdGhlIHNvdXJjZQorICAgICAgICBmaWxlcyBsaXZlIGluIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBjbGFzcyBmaWxlcyBzaG91bGQgZ28gaW50bywKKyAgICAgICAgcmVzcGVjdGl2ZWx5LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJkZWZhdWx0ZXhjbHVkZXMiPjwvYT4KKyAgICAgIEkndmUgdXNlZCBhIDxjb2RlPiZsdDtkZWxldGUmZ3Q7PC9jb2RlPiB0YXNrIHRvCisgICAgICBkZWxldGUgdW53YW50ZWQgU291cmNlU2FmZSBjb250cm9sIGZpbGVzIChDVlMgZmlsZXMsIGVkaXRvcgorICAgICAgYmFja3VwIGZpbGVzLCBldGMuKSwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrOyB0aGUgZmlsZXMKKyAgICAgIG5ldmVyIGdldCBkZWxldGVkLiBXaGF0J3Mgd3Jvbmc/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+VGhpcyBpcyBwcm9iYWJseSBoYXBwZW5pbmcgYmVjYXVzZSwgYnkgZGVmYXVsdCwgQW50IGV4Y2x1ZGVzCisgICAgICAgIFNvdXJjZVNhZmUgY29udHJvbCBmaWxlcyAoPGNvZGU+dnNzdmVyLnNjYzwvY29kZT4pIGFuZCBjZXJ0YWluIG90aGVyCisgICAgICAgIGZpbGVzIGZyb20gRmlsZVNldHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SGVyZSdzIHdoYXQgeW91IHByb2JhYmx5IGRpZDo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDtkZWxldGUmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2J1aWxkLnNyY30mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovdnNzdmVyLnNjYyZxdW90Oy8mZ3Q7CismbHQ7L2RlbGV0ZSZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+WW91IG5lZWQgdG8gc3dpdGNoIG9mZiB0aGUgZGVmYXVsdCBleGNsdXNpb25zLAorICAgICAgICAgICBhbmQgaXQgd2lsbCB3b3JrOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O2RlbGV0ZSZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7YnVpbGQuc3JjfSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi92c3N2ZXIuc2NjJnF1b3Q7CisgICAgICAgICAgIGRlZmF1bHRleGNsdWRlcz0mcXVvdDtubyZxdW90Oy8mZ3Q7CismbHQ7L2RlbGV0ZSZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIGEgY29tcGxldGUgbGlzdGluZyBvZiB0aGUgcGF0dGVybnMgdGhhdCBhcmUgZXhjbHVkZWQKKyAgICAgICAgYnkgZGVmYXVsdCwgc2VlIDxhIGhyZWY9Im1hbnVhbC9kaXJ0YXNrcy5odG1sI2RlZmF1bHRleGNsdWRlcyI+dGhlIHVzZXIKKyAgICAgICAgbWFudWFsPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0ic3RvcC1kZXBlbmRlbmN5Ij48L2E+CisgICAgICBJIGhhdmUgYSB0YXJnZXQgSSB3YW50IHRvIHNraXAgaWYgYSBwcm9wZXJ0eSBpcyBzZXQsCisgICAgICBzbyBJIGhhdmUgPGNvZGU+dW5sZXNzPSJwcm9wZXJ0eSI8L2NvZGU+IGFzIGFuIGF0dHJpYnV0ZQorICAgICAgb2YgdGhlIHRhcmdldCwgYnV0IGFsbCB0aGUgdGFyZ2V0cyB0aGlzIHRhcmdldAorICAgICAgZGVwZW5kcyBvbiBhcmUgc3RpbGwgZXhlY3V0ZWQuIFdoeT8KKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5UaGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgaXMgZ2VuZXJhdGVkIGJ5IEFudCBiZWZvcmUgYW55IG9mIHRoZQorICAgICAgICB0YXJnZXRzIGFyZSBydW4uIFRoaXMgYWxsb3dzIGRlcGVuZGVudCB0YXJnZXRzLCBzdWNoIGFzIGFuCisgICAgICAgIDxjb2RlPmluaXQ8L2NvZGU+IHRhcmdldCwgdG8gc2V0IHByb3BlcnRpZXMgdGhhdCBjYW4gY29udHJvbCB0aGUKKyAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgdGFyZ2V0cyBoaWdoZXIgaW4gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIFRoaXMKKyAgICAgICAgICAgICAgaXMgYSBnb29kIHRoaW5nLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkhvd2V2ZXIsIHdoZW4geW91ciBkZXBlbmRlbmNpZXMgYnJlYWsgZG93biB0aGUKKyAgICAgICAgaGlnaGVyLWxldmVsIHRhc2sKKyAgICAgICAgaW50byBzZXZlcmFsIHNtYWxsZXIgc3RlcHMsIHRoaXMgYmVoYXZpb3VyIGJlY29tZXMKKyAgICAgICAgY291bnRlci1pbnR1aXRpdmUuIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBzb2x1dGlvbnMgYXZhaWxhYmxlOgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgPGxpPlB1dCB0aGUgc2FtZSBjb25kaXRpb24gb24gZWFjaCBvZiB0aGUgZGVwZW5kZW50IHRhcmdldHMuPC9saT4KKworICAgICAgICAgIDxsaT5FeGVjdXRlIHRoZSBzdGVwcyB1c2luZyA8Y29kZT4mbHQ7YW50Y2FsbCZndDs8L2NvZGU+LAorICAgICAgICAgIGluc3RlYWQgb2Ygc3BlY2lmeWluZyB0aGVtIGluc2lkZSB0aGUgPGNvZGU+ZGVwZW5kczwvY29kZT4KKyAgICAgICAgICBhdHRyaWJ1dGUuPC9saT4KKyAgICAgICAgPC9vbD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJpbmNsdWRlLW9yZGVyIj48L2E+CisgICAgICBJbiBteSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LCBJJ3ZlIHB1dCBpbiBhbgorICAgICAgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBvZiBhbGwgZmlsZXMgZm9sbG93ZWQgYnkgYW4KKyAgICAgIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gb2YganVzdCB0aGUgZmlsZXMgSSB3YW50LCBidXQgaXQKKyAgICAgIGlzbid0IGdpdmluZyBtZSBhbnkgZmlsZXMgYXQgYWxsLiBXaGF0J3Mgd3Jvbmc/CisgICAgICAKKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5UaGUgb3JkZXIgb2YgdGhlIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gYW5kCisgICAgICAgIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gdGFncyB3aXRoaW4gYSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+CisgICAgICAgIGlzIGlnbm9yZWQgd2hlbiB0aGUgRmlsZVNldCBpcyBjcmVhdGVkLiBJbnN0ZWFkLCBhbGwgb2YgdGhlCisgICAgICAgIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIHByb2Nlc3NlZCB0b2dldGhlciwKKyAgICAgICAgZm9sbG93ZWQgYnkgYWxsIG9mIHRoZSA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+CisgICAgICAgIGVsZW1lbnRzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KKyAgICAgICAgZWxlbWVudHMgb25seSBhcHBseSB0byB0aGUgZmlsZSBsaXN0IHByb2R1Y2VkIGJ5IHRoZQorICAgICAgICA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRvIGdldCB0aGUgZmlsZXMgeW91IHdhbnQsIGZvY3VzIG9uIGp1c3QgdGhlCisgICAgICAgIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gcGF0dGVybnMgdGhhdCB3b3VsZCBiZSBuZWNlc3NhcnkKKyAgICAgICAgdG8gZ2V0IHRoZW0uIElmIHlvdSBmaW5kIHlvdSBuZWVkIHRvIHRyaW0gdGhlIGxpc3QgdGhhdCB0aGUKKyAgICAgICAgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBwcm9kdWNlLCB0aGVuIHVzZQorICAgICAgICA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJwcm9wZXJ0aWVzLW5vdC10cmltbWVkIj48L2E+CisgICAgICA8Y29kZT5hbnQ8L2NvZGU+IGZhaWxlZCB0byBidWlsZCBteSBwcm9ncmFtIHZpYSBqYXZhYworICAgICAgZXZlbiB3aGVuIEkgcHV0IHRoZSBuZWVkZWQgamFycyBpbiBhbiBleHRlcm5hbAorICAgICAgPGNvZGU+YnVpbGQucHJvcGVydGllczwvY29kZT4gZmlsZSBhbmQgcmVmZXJlbmNlIHRoZW0gYnkKKyAgICAgIDxjb2RlPnBhdGhlbGVtZW50PC9jb2RlPiBvciA8Y29kZT5jbGFzc3BhdGggcmVmaWQ8L2NvZGU+LgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPldoZW4gPGNvZGU+YW50PC9jb2RlPiBsb2FkcyBwcm9wZXJ0aWVzIGZyb20gYW4gZXh0ZXJuYWwKKyAgICAgICAgZmlsZSBpdCBkb2Vzbid0IHRvdWNoIHRoZSB2YWx1ZSBvZiBwcm9wZXJ0aWVzLCB0cmFpbGluZyBibGFua3MKKyAgICAgICAgd2lsbCBub3QgYmUgdHJpbW1lZCBmb3IgZXhhbXBsZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB0aGUgdmFsdWUgcmVwcmVzZW50cyBhIGZpbGUgcGF0aCwgbGlrZSBhIGphciBuZWVkZWQgdG8KKyAgICAgICAgY29tcGlsZSwgdGhlIHRhc2sgd2hpY2ggcmVxdWlyZXMgdGhlIHZhbHVlLCBqYXZhYyBmb3IgZXhhbXBsZQorICAgICAgICB3b3VsZCBmYWlsIHRvIGNvbXBpbGUgc2luY2UgaXQgY2FuJ3QgZmluZCB0aGUgZmlsZSBkdWUgdG8KKyAgICAgICAgdHJhaWxpbmcgc3BhY2VzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJ3aW56aXAtbGllcyI+PC9hPgorICAgICAgQW50IGNyZWF0ZXMgV0FSIGZpbGVzIHdpdGggYSBsb3dlci1jYXNlCisgICAgICAgIDxjb2RlPndlYi1pbmY8L2NvZGU+IG9yIEpBUiBmaWxlcyB3aXRoIGEgbG93ZXItY2FzZQorICAgICAgICA8Y29kZT5tZXRhLWluZjwvY29kZT4gZGlyZWN0b3J5LgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPk5vIGl0IGRvZXNuJ3QuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+WW91IG1heSBoYXZlIHNlZW4gdGhlc2UgbG93ZXItY2FzZSBkaXJlY3RvcnkgbmFtZXMgaW4KKyAgICAgICAgV2luWklQLCBidXQgV2luWklQIGlzIHRyeWluZyB0byBiZSBoZWxwZnVsIChhbmQgZmFpbHMpLiAgSWYKKyAgICAgICAgV2luWklQIGVuY291bnRlcnMgYSBmaWxlbmFtZSB0aGF0IGlzIGFsbCB1cHBlci1jYXNlLCBpdAorICAgICAgICBhc3N1bWVzIGl0IGhhcyBjb21lIGZyb20gYW4gb2xkIERPUyBib3ggYW5kIGNoYW5nZXMgdGhlIGNhc2UgdG8KKyAgICAgICAgYWxsIGxvd2VyLWNhc2UgZm9yIHlvdS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgZXh0cmFjdCAob3IganVzdCBjaGVjaykgdGhlIGFyY2hpdmUgd2l0aCBqYXIsIHlvdQorICAgICAgICB3aWxsIHNlZSB0aGF0IHRoZSBuYW1lcyBoYXZlIHRoZSBjb3JyZWN0IGNhc2UuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2l0aCBXaW5aSVAgKHZlcnNpb24gOC4xIGF0IGxlYXN0KSwgdGhpcyBjYW4gYmUgY29ycmVjdGVkIGluIHRoZQorICAgICAgICBjb25maWd1cmF0aW9uLiAgSW4gdGhlIE9wdGlvbnMvQ29uZmlndXJhdGlvbiBtZW51LCBpbiB0aGUgVmlldyB0YWIsIEdlbmVyYWwKKyAgICAgICAgc2VjdGlvbiwgY2hlY2sgdGhlICJBbGxvdyBhbGwgdXBwZXIgY2FzZSBmaWxlcyBuYW1lcyIgYm94LiAgVGhlIE1FVEEtSU5GIGFuZAorICAgICAgICBXRUItSU5GIHdpbGwgbG9vayBjb3JyZWN0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJOb0NsYXNzRGVmRm91bmRFcnJvciI+PC9hPgorICAgICAgSSBpbnN0YWxsZWQgQW50IDEuNi54IGFuZCBub3cgZ2V0CisgICAgICAgIDxjb2RlPkV4Y2VwdGlvbiBpbiB0aHJlYWQgIm1haW4iIGphdmEubGFuZy5Ob0NsYXNzRGVmRm91bmRFcnJvcjoKKyAgICAgICAgPC9jb2RlPgorICAgICAgCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgVGhlIGNhdXNlIG9mIHRoaXMgaXMgdGhhdCB0aGVyZSBpcyBhbiBvbGQgdmVyc2lvbiBvZiBhbnQgc29tZXdoZXJlIGluIHRoZQorICAgICAgICAgIGNsYXNzIHBhdGggb3IgY29uZmlndXJhdGlvbi4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgQSB2ZXJzaW9uIG9mIHRoaXMgcHJvYmxlbSBoYXBwZW5zIHdpdGggamFycyB0aGF0IGFyZSBpbiB0aGUgY2xhc3NwYXRoCisgICAgICAgICAgdGhhdCBpbmNsdWRlIGFuIGVtYmVkZGVkIGNvcHkgb2YgYW50IGNsYXNzZXMuCisgICAgICAgICAgQW4gZXhhbXBsZSBvZiB0aGlzIGlzIHNvbWUgY29waWVzIG9mIHdlYmxvZ2ljLmphci4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgIE9uZSBjYW4gY2hlY2sgaWYgdGhpcyBpcyB0aGUgY2FzZSBieSBkb2luZyAob24gdW5peC9zaCk6CisgICAgICAgIDxjb2RlPjxwcmU+CisgICAgICAgIHVuc2V0IENMQVNTUEFUSAorICAgICAgICBhbnQgLXZlcnNpb24KKyAgICAgICAgPC9wcmU+CisgICAgICAgIDwvY29kZT4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9Ikluc3RhbnRpYXRpb25FeGNlcHRpb24iPjwvYT4KKyAgICAgIEkgaW5zdGFsbGVkIEFudCAxLjYueCBhbmQgbm93IGdldAorICAgICAgICA8Y29kZT5qYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjogb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbjwvY29kZT4KKyAgICAgIAorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgIFRoZSBjYXVzZSBvZiB0aGlzIGlzIHRoYXQgdGhlcmUgaXMgYW4gb2xkIHZlcnNpb24gb2YgYW50IHNvbWV3aGVyZSBpbiB0aGUKKyAgICAgICAgICBjbGFzcyBwYXRoIG9yIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgIEEgdmVyc2lvbiBvZiB0aGlzIHByb2JsZW0gbWF5IGJlIHNlZW4gb24gc29tZSBsaW51eCBzeXN0ZW1zLgorICAgICAgICAgIFNvbWUgbGludXggc3lzdGVtcyAoRmVkb3JhIENvcmUgMiBmb3IgZXhhbXBsZSksIGNvbWVzIHdpdGggYSB2ZXJzaW9uCisgICAgICAgICAgb2YgYW50IHByZS1pbnN0YWxsZWQuIFRoZXJlIGlzIGEgY29uZmlndXJhdGlvbiBmaWxlIGNhbGxlZAorICAgICAgICAgIDxjb2RlPi9ldGMvYW50LmNvbmY8L2NvZGU+IHdoaWNoIGlmIHByZXNlbnQsIHRoZSBhbnQgc2hlbGwKKyAgICAgICAgICBzY3JpcHQgd2lsbCAnZG90JyBpbmNsdWRlLiBPbiBGZWRvcmEgQ29yZSAyLCB0aGUgL2V0Yy9hbnQuY29uZgorICAgICAgICAgIGZpbGUgcmVzZXRzIHRoZSA8Y29kZT5BTlRfSE9NRTwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8KKyAgICAgICAgICA8Y29kZT4vdXNyL3NoYXJlL2FudDwvY29kZT4uIFRoaXMgY2F1c2VzIHRoZSBwcm9ibGVtIHRoYXQKKyAgICAgICAgICBhbiBvbGQgdmVyc2lvbiBvZiBhbnQgKDEuNS54IGluIHRoaXMgY2F1c2UpIHdpbGwgYmUgdXNlZAorICAgICAgICAgIHdpdGggYSBuZXcgdmVyc2lvbiBvZiB0aGUgYW50IHNjcmlwdCBmaWxlLgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICBPbmUgY2FuIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGNhc2UgYnkgZG9pbmcKKyAgICAgICAgICA8Y29kZT5hbnQgLS1ub2NvbmZpZyAtdmVyc2lvbjwvY29kZT4uCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJtYW5nbGVkLW1hbmlmZXN0Ij48L2E+CisgICAgICAKKyAgICAgICAgV2hlbmV2ZXIgSSB1c2UgdGhlIEFudCBqYXIgb3IgbWFuaWZlc3QgcmVsYXRlZCB0YXNrcywgbG9uZyBsaW5lcyBpbgorICAgICAgICBteSBtYW5pZmVzdCBhcmUgd3JhcHBlZCBhdCA3MCBjaGFyYWN0ZXJzIGFuZCB0aGUgcmVzdWx0aW5nIGphciBkb2VzCisgICAgICAgIG5vdCB3b3JrIGluIG15IGFwcGxpY2F0aW9uIHNlcnZlci4gV2h5IGRvZXMgQW50IGRvIHRoaXM/CisgICAgICAKKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICBBbnQgaW1wbGVtZW50cyB0aGUgSmF2YQorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2d1aWRlL2phci9qYXIuaHRtbCI+SmFyCisgICAgICAgICAgZmlsZSBzcGVjaWZpY2F0aW9uPC9hPi4gUGxlYXNlIHJlZmVyIHRvIHRoZSBub3RlcyBzZWN0aW9uIHdoZXJlIGl0CisgICAgICAgICAgZGlzY3Vzc2VzIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBsZW5ndGggb2YgYSBsaW5lIGFuZCB0aGUgY29uY2VwdCBvZgorICAgICAgICAgIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXJzLgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICBJZiBhIGphciBmaWxlIHByb2R1Y2VkIGJ5IEFudCBkb2VzIG5vdCB3b3JrIGluIHlvdXIgYXBwc2VydmVyLCBhbmQKKyAgICAgICAgICB0aGF0IGZhaWx1cmUgaXMgZHVlIHRvIHRoZSB3cmFwcGVkIG1hbmlmZXN0LCB0aGVuIHlvdSBuZWVkCisgICAgICAgICAgdG8gY29uc3VsdCB5b3VyIGFwcHNlcnZlciBwcm92aWRlciwgYXMgaXQgaXMgYSBidWcgaW4gdGhlaXIKKyAgICAgICAgICBhcHBzZXJ2ZXIuIEZhciBtb3JlIGxpa2VseSwgaG93ZXZlciwgaXMgYSBwcm9ibGVtIGluIHlvdXIKKyAgICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHlvdXIgY2xhc3NwYXRoLiBJdCBpcyBub3QgQW50J3Mgd3JhcHBpbmcgb2YgeW91cgorICAgICAgICAgIGNsYXNzcGF0aCB0aGF0IGlzIHRoZSBwcm9ibGVtLgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICBEbyBub3QgcmFpc2UgYSBidWcgYWJvdXQgdGhpcyBpc3N1ZSB1bnRpbCB5b3UgaGF2ZSBjaGVja2VkIHRvIGVuc3VyZQorICAgICAgICAgIHRoYXQgdGhlIHByb2JsZW0gaXMgbm90IGR1ZSB0byB5b3VyIGNsYXNzcGF0aCBzcGVjaWZpY2F0aW9uLgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iaW50ZWdyYXRpb24iPjwvYT4KKyAgICAgIElzIEFudCBzdXBwb3J0ZWQgYnkgbXkgSURFL0VkaXRvcj8KKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5TZWUgdGhlIDxhIGhyZWY9ImV4dGVybmFsLmh0bWwjSURFIGFuZCBFZGl0b3IgSW50ZWdyYXRpb24iPnNlY3Rpb24KKyAgICAgICAgb24gSURFIGludGVncmF0aW9uPC9hPiBvbiBvdXIgRXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzIHBhZ2UuPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9ImVtYWNzLW1vZGUiPjwvYT4KKyAgICAgIFdoeSBkb2Vzbid0IChYKUVtYWNzL3ZpL01hY09TIFgncyBwcm9qZWN0IGJ1aWxkZXIKKyAgICAgIGNvcnJlY3RseSBwYXJzZSB0aGUgZXJyb3IgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IEFudD8KKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5BbnQgYWRkcyBhICJiYW5uZXIiIHdpdGggdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgdGFzayBpbiBmcm9udCBvZiBhbGwgbG9nZ2luZyBtZXNzYWdlcyAtIGFuZCB0aGVyZSBhcmUgbm8gYnVpbHQtaW4KKyAgICAgICAgcmVndWxhciBleHByZXNzaW9ucyBpbiB5b3VyIGVkaXRvciB0aGF0IHdvdWxkIGFjY291bnQgZm9yCisgICAgICAgIHRoaXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+WW91IGNhbiBkaXNhYmxlIHRoaXMgYmFubmVyIGJ5IGludm9raW5nIEFudCB3aXRoIHRoZQorICAgICAgICA8Y29kZT4tZW1hY3M8L2NvZGU+IHN3aXRjaC4gIFRvIG1ha2UgQW50IGF1dG9kZXRlY3QKKyAgICAgICAgRW1hY3MnIGNvbXBpbGUgbW9kZSwgcHV0IHRoaXMgaW50byB5b3VyCisgICAgICAgIDxjb2RlPi5hbnRyYzwvY29kZT4gKGNvbnRyaWJ1dGVkIGJ5IFZpbGxlIFNreXR05CkuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CisjIERldGVjdCAoWClFbWFjcyBjb21waWxlIG1vZGUKK2lmIFsgJnF1b3Q7JEVNQUNTJnF1b3Q7ID0gJnF1b3Q7dCZxdW90OyBdIDsgdGhlbgorICBBTlRfQVJHUz0mcXVvdDskQU5UX0FSR1MgLWVtYWNzJnF1b3Q7CisgIEFOVF9PUFRTPSZxdW90OyRBTlRfT1BUUyAtRGJ1aWxkLmNvbXBpbGVyLmVtYWNzPXRydWUmcXVvdDsKK2ZpCis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgc25pcHBldCB0byB5b3VyCisgICAgICAgIDxjb2RlPi5lbWFjczwvY29kZT4gdG8gbWFrZSBFbWFjcyB1bmRlcnN0YW5kIEFudCdzCisgICAgICAgIG91dHB1dC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyhyZXF1aXJlICdjb21waWxlKQorKHNldHEgY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwLWFsaXN0CisgIChhcHBlbmQgKGxpc3QKKyAgICAgOzsgd29ya3MgZm9yIGppa2VzCisgICAgICcoJnF1b3Q7Xlxccy0qXFxbW15dXSpcXF1cXHMtKlxcKC4rXFwpOlxcKFswLTldK1xcKTpcXChbMC05XStcXCk6WzAtOV0rOlswLTldKzomcXVvdDsgMSAyIDMpCisgICAgIDs7IHdvcmtzIGZvciBqYXZhYworICAgICAnKCZxdW90O15cXHMtKlxcW1teXV0qXFxdXFxzLSpcXCguK1xcKTpcXChbMC05XStcXCk6JnF1b3Q7IDEgMikpCisgIGNvbXBpbGF0aW9uLWVycm9yLXJlZ2V4cC1hbGlzdCkpCis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPllldCBhbm90aGVyIGFsdGVybmF0aXZlIHRoYXQgcHJlc2VydmVzIG1vc3Qgb2YgQW50J3MKKyAgICAgICAgZm9ybWF0dGluZyBpcyB0byBwaXBlIEFudCdzIG91dHB1dCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgUGVybAorICAgICAgICBzY3JpcHQgYnkgRGlyay1XaWxsZW0gdmFuIEd1bGlrOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorIyEvdXNyL2Jpbi9wZXJsCisjCisjIE1heSAyMDAxIGRpcmt4QGFwYWNoZS5vcmcgLSByZW1vdmUgYW55CisjIFtmb29dIGxpbmVzIGZyb20gdGhlIG91dHB1dDsga2VlcGluZworIyBzcGFjaW5nIG1vcmUgb3IgbGVzcyB0aGVyZS4KKyMKKyR8PTE7Cit3aGlsZSgmbHQ7U1RESU4mZ3Q7KSB7CisgICAgICAgIGlmIChzL14oXHMrKVxbKFx3KylcXS8vKSB7CisgICAgICAgICAgICAgICAgaWYgKCQyIG5lICRsYXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAmcXVvdDskMVxbJDJcXSZxdW90OzsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzID0gJyAnIHggbGVuZ3RoKCQyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJnF1b3Q7JDEgJHMgJnF1b3Q7OworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgJGxhc3QgPSAkMjsKKyAgICAgICAgfTsKKyAgICAgICAgcHJpbnQ7Cit9OworPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iZHRkIj48L2E+CisgICAgICBJcyB0aGVyZSBhIERURCB0aGF0IEkgY2FuIHVzZSB0byB2YWxpZGF0ZSBteSBidWlsZAorICAgICAgZmlsZXM/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+QW4gaW5jb21wbGV0ZSBEVEQgY2FuIGJlIGNyZWF0ZWQgYnkgdGhlCisgICAgICAgICAgPGNvZGU+Jmx0O2FudHN0cnVjdHVyZSZndDs8L2NvZGU+IHRhc2sgLSBidXQgdGhpcyBvbmUKKyAgICAgICAgICBoYXMgYSBmZXcgcHJvYmxlbXM6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPkl0IGRvZXNuJ3Qga25vdyBhYm91dCByZXF1aXJlZCBhdHRyaWJ1dGVzLiAgT25seQorICAgICAgICAgICAgbWFudWFsIHR3ZWFraW5nIG9mIHRoaXMgZmlsZSBjYW4gaGVscCBoZXJlLjwvbGk+CisKKyAgICAgICAgICAgIDxsaT5JdCBpcyBub3QgY29tcGxldGUgLSBpZiB5b3UgYWRkIG5ldyB0YXNrcyB2aWEKKyAgICAgICAgICAgIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gaXQgd29uJ3Qga25vdyBhYm91dCBpdC4gIFNlZQorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5zZHYuZnIvcGFnZXMvY2FzYS9odG1sL2FudC1kdGQuZW4uaHRtbCI+dGhpcworICAgICAgICAgICAgcGFnZTwvYT4gYnkgTWljaGVsIENhc2FiaWFuY2EgZm9yIGEgc29sdXRpb24gdG8gdGhpcworICAgICAgICAgICAgcHJvYmxlbS4gIE5vdGUgdGhhdCB0aGUgRFREIHlvdSBjYW4gZG93bmxvYWQgYXQgdGhpcyBwYWdlCisgICAgICAgICAgICBpcyBiYXNlZCBvbiBBbnQgMC4zLjEuPC9saT4KKworICAgICAgICAgICAgPGxpPkl0IG1heSBldmVuIGJlIGFuIGludmFsaWQgRFRELiAgQXMgQW50IGFsbG93cyB0YXNrcworICAgICAgICAgICAgd3JpdGVycyB0byBkZWZpbmUgYXJiaXRyYXJ5IGVsZW1lbnRzLCBuYW1lIGNvbGxpc2lvbnMgd2lsbAorICAgICAgICAgICAgaGFwcGVuIHF1aXRlIGZyZXF1ZW50bHkgLSBpZiB5b3VyIHZlcnNpb24gb2YgQW50IGNvbnRhaW5zCisgICAgICAgICAgICB0aGUgb3B0aW9uYWwgPGNvZGU+Jmx0O3Rlc3QmZ3Q7PC9jb2RlPiBhbmQKKyAgICAgICAgICAgIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IHRhc2tzLCB0aGVyZSBhcmUgdHdvIFhNTAorICAgICAgICAgICAgZWxlbWVudHMgbmFtZWQgPGNvZGU+dGVzdDwvY29kZT4gKHRoZSB0YXNrIGFuZCB0aGUgbmVzdGVkIGNoaWxkCisgICAgICAgICAgICBlbGVtZW50IG9mIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+KSB3aXRoIGRpZmZlcmVudCBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGxpc3RzLiAgVGhpcyBwcm9ibGVtIGNhbm5vdCBiZSBzb2x2ZWQ7IERURHMgZG9uJ3QgZ2l2ZSBhCisgICAgICAgICAgICBzeW50YXggcmljaCBlbm91Z2ggdG8gc3VwcG9ydCB0aGlzLjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJ4bWwtZW50aXR5LWluY2x1ZGUiPjwvYT4KKyAgICAgIEhvdyBkbyBJIGluY2x1ZGUgYW4gWE1MIHNuaXBwZXQgaW4gbXkgYnVpbGQgZmlsZT8KKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5Zb3UgY2FuIHVzZSBYTUwncyB3YXkgb2YgaW5jbHVkaW5nIGV4dGVybmFsIGZpbGVzIGFuZCBsZXQKKyAgICAgICAgdGhlIHBhcnNlciBkbyB0aGUgam9iIGZvciBBbnQ6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CismbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90Oz8mZ3Q7CisKKyZsdDshRE9DVFlQRSBwcm9qZWN0IFsKKyAgICAgICAmbHQ7IUVOVElUWSBjb21tb24gU1lTVEVNICZxdW90O2NvbW1vbi54bWwmcXVvdDsmZ3Q7CitdJmd0OworCismbHQ7cHJvamVjdCBuYW1lPSZxdW90O3Rlc3QmcXVvdDsgZGVmYXVsdD0mcXVvdDt0ZXN0JnF1b3Q7IGJhc2VkaXI9JnF1b3Q7LiZxdW90OyZndDsKKworICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7c2V0dXAmcXVvdDsmZ3Q7CisgICAgLi4uCisgICZsdDsvdGFyZ2V0Jmd0OworCisgICZhbXA7Y29tbW9uOworCisgIC4uLgorCismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPndpbGwgbGl0ZXJhbGx5IGluY2x1ZGUgdGhlIGNvbnRlbnRzIG9mIDxjb2RlPmNvbW1vbi54bWw8L2NvZGU+IHdoZXJlCisgICAgICAgIHlvdSd2ZSBwbGFjZWQgdGhlIDxjb2RlPiZhbXA7Y29tbW9uOzwvY29kZT4gZW50aXR5LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPihUaGUgZmlsZW5hbWUgPGNvZGU+Y29tbW9uLnhtbDwvY29kZT4gaW4gdGhpcyBleGFtcGxlIGlzIHJlc29sdmVkCisgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjb250YWluaW5nIFhNTCBmaWxlIGJ5IHRoZSBYTUwgcGFyc2VyLiBZb3UgbWF5IGFsc28gdXNlCisgICAgICAgIGFuIGFic29sdXRlIDxjb2RlPmZpbGU6PC9jb2RlPiBwcm90b2NvbCBVUkkuKTwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkluIGNvbWJpbmF0aW9uIHdpdGggYSBEVEQsIHRoaXMgd291bGQgbG9vayBsaWtlIHRoaXM6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CismbHQ7IURPQ1RZUEUgcHJvamVjdCBQVUJMSUMgJnF1b3Q7LS8vQU5ULy9EVEQgcHJvamVjdC8vRU4mcXVvdDsgJnF1b3Q7YW50LmR0ZCZxdW90OyBbCisgICAmbHQ7IUVOVElUWSBpbmNsdWRlIFNZU1RFTSAmcXVvdDtoZWFkZXIueG1sJnF1b3Q7Jmd0OworXSZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS42LCB0aGVyZSBpcyBhIG5ldworICAgICAgICA8Y29kZT4mbHQ7aW1wb3J0Jmd0OzwvY29kZT4gdGFzayB0aGF0IGNhbiAoYWxzbykgYmUgdXNlZCB0bworICAgICAgICBpbmNsdWRlIGJ1aWxkIGZpbGUgZnJhZ21lbnRzLiAgVW5saWtlIHRoZSBzbmlwcGV0cyB1c2VkIHdpdGgKKyAgICAgICAgZW50aXR5IGluY2x1ZGVzLCB0aGUgcmVmZXJlbmNlZCBmaWxlcyBoYXZlIHRvIGJlIGNvbXBsZXRlIEFudAorICAgICAgICBidWlsZCBmaWxlcywgdGhvdWdoLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBleGFtcGxlIGFib3ZlIHdvdWxkIGJlY29tZTo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7PyZndDsKKyZsdDtwcm9qZWN0IG5hbWU9JnF1b3Q7dGVzdCZxdW90OyBkZWZhdWx0PSZxdW90O3Rlc3QmcXVvdDsgYmFzZWRpcj0mcXVvdDsuJnF1b3Q7Jmd0OworCisgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtzZXR1cCZxdW90OyZndDsKKyAgICAuLi4KKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O2ltcG9ydCBmaWxlPSZxdW90Oy4vY29tbW9uLnhtbCZxdW90Oy8mZ3Q7CisKKyAgLi4uCisKKyZsdDsvcHJvamVjdCZndDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VW5saWtlIGVudGl0eSBpbmNsdWRlcywgPGNvZGU+Jmx0O2ltcG9ydCZndDs8L2NvZGU+IHdpbGwKKyAgICAgICAgbGV0IHlvdSB1c2UgQW50IHByb3BlcnRpZXMgaW4gdGhlIGZpbGUgbmFtZS48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0ibWFpbC1sb2dnZXIiPjwvYT4KKyAgICAgIEhvdyBkbyBJIHNlbmQgYW4gZW1haWwgd2l0aCB0aGUgcmVzdWx0IG9mIG15IGJ1aWxkCisgICAgICAgIHByb2Nlc3M/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IGFyZSB1c2luZyBhIG5pZ2h0bHkgYnVpbGQgb2YgQW50IDEuNSBhZnRlcgorICAgICAgICAyMDAxLTEyLTE0LCB5b3UgY2FuIHVzZSB0aGUgYnVpbHQtaW4gTWFpbExvZ2dlcjo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyAgICAgICAgIGFudCAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLk1haWxMb2dnZXIKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+U2VlIHRoZSA8YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9jb3JlL3RydW5rL2RvY3MvbWFudWFsL2xpc3RlbmVycy5odG1sIj5MaXN0ZW5lcnMKKyAgICAgICAgJmFtcDsgTG9nZ2VyczwvYT4gZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgcHJvcGVydGllcworICAgICAgICByZXF1aXJlZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Gb3Igb2xkZXIgdmVyc2lvbnMgb2YgQW50LCB5b3UgY2FuIHVzZSBhIGN1c3RvbQorICAgICAgICBCdWlsZExpc3RlbmVyIHRoYXQgc2VuZHMgb3V0IGFuIGVtYWlsCisgICAgICAgIGluIHRoZSBidWlsZEZpbmlzaGVkKCkgbWV0aG9kLiAgV2lsbCBHbG96ZXIKKyAgICAgICAgJmx0O3dpbGwuZ2xvemVyQGpkYS5jb20mZ3Q7IGhhcyB3cml0dGVuIHN1Y2ggYSBsaXN0ZW5lciBiYXNlZAorICAgICAgICBvbiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFtYWlsLyI+SmF2YU1haWw8L2E+LgorICAgICAgICBUaGUgc291cmNlIGlzOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgoraW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5tYWlsLio7CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CisKKy8qKgorICogQSBzaW1wbGUgbGlzdGVuZXIgdGhhdCB3YWl0cyBmb3IgYSBidWlsZCB0byBmaW5pc2ggYW5kIHNlbmRzIGFuIGVtYWlsCisgKiBvZiB0aGUgcmVzdWx0cy4gIFRoZSBzZXR0aW5ncyBhcmUgc3RvcmVkIGluICZxdW90O21vbml0b3IucHJvcGVydGllcyZxdW90OyBhbmQKKyAqIGFyZSBmYWlybHkgc2VsZiBleHBsYW5hdG9yeS4KKyAqCisgKiBAYXV0aG9yICAgICAgV2lsbCBHbG96ZXIKKyAqIEB2ZXJzaW9uICAgICAxLjA1YSAwOS8wNi8yMDAwCisgKi8KK3B1YmxpYyBjbGFzcyBCdWlsZE1vbml0b3IgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKKyAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBCdWlsZE1vbml0b3IuCisgICAgICovCisgICAgcHVibGljIEJ1aWxkTW9uaXRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCZxdW90O21vbml0b3IucHJvcGVydGllcyZxdW90Oyk7CisgICAgICAgIHByb3BzLmxvYWQoaXMpOworICAgICAgICBpcy5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIHN0YXR1cyBvZiB0aGUgYnVpbGQgYW5kIHRoZSBhY3Rpb25zIHRvIGZvbGxvdywgbm93IHRoYXQKKyAgICAgKiB0aGUgYnVpbGQgaGFzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBlICAgICAgIEV2ZW50IGRlc2NyaWJpbmcgdGhlIGJ1aWxkIHN0YXR1cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZSkgeworICAgICAgICBUaHJvd2FibGUgdGggPSBlLmdldEV4Y2VwdGlvbigpOworICAgICAgICBTdHJpbmcgc3RhdHVzID0gKHRoICE9IG51bGwpID8gJnF1b3Q7ZmFpbGVkJnF1b3Q7IDogJnF1b3Q7c3VjY2VlZGVkJnF1b3Q7OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gJnF1b3Q7YnVpbGQuJnF1b3Q7ICsgc3RhdHVzOworICAgICAgICAgICAgaWYgKHByb3BzLmdldFByb3BlcnR5KGtleSArICZxdW90Oy5ub3RpZnkmcXVvdDspLmVxdWFsc0lnbm9yZUNhc2UoJnF1b3Q7ZmFsc2UmcXVvdDspKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gU2Vzc2lvbi5nZXREZWZhdWx0SW5zdGFuY2UocHJvcHMsIG51bGwpOworCisgICAgICAgICAgICBNaW1lTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1pbWVNZXNzYWdlKHNlc3Npb24pOworICAgICAgICAgICAgbWVzc2FnZS5hZGRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZS5UTywgcGFyc2VBZGRyZXNzZXMoCisgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoa2V5ICsgJnF1b3Q7LmVtYWlsLnRvJnF1b3Q7KSkpOworICAgICAgICAgICAgbWVzc2FnZS5zZXRTdWJqZWN0KHByb3BzLmdldFByb3BlcnR5KGtleSArICZxdW90Oy5lbWFpbC5zdWJqZWN0JnF1b3Q7KSk7CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKAorICAgICAgICAgICAgICAgIHByb3BzLmdldFByb3BlcnR5KCZxdW90O2J1aWxkLmxvZyZxdW90OykpKTsKKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBici5yZWFkTGluZSgpOworICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN3LndyaXRlKGxpbmUpOworICAgICAgICAgICAgICAgIHN3LndyaXRlKCZxdW90O1xuJnF1b3Q7KTsKKyAgICAgICAgICAgICAgICBsaW5lID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyLmNsb3NlKCk7CisKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0VGV4dChzdy50b1N0cmluZygpLCAmcXVvdDtVVEYtOCZxdW90Oyk7CisgICAgICAgICAgICBzdy5jbG9zZSgpOworCisgICAgICAgICAgICBUcmFuc3BvcnQgdHJhbnNwb3J0ID0gc2Vzc2lvbi5nZXRUcmFuc3BvcnQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5jb25uZWN0KCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuc2VuZChtZXNzYWdlKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigmcXVvdDtCdWlsZE1vbml0b3IgZmFpbGVkIHRvIHNlbmQgZW1haWwhJnF1b3Q7KTsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBpbnRlcm5ldCBlbWFpbCBhZGRyZXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgcyAgICAgICBUaGUgbGlzdCBvZiBhZGRyZXNzZXMuCisgICAgICogQHJldHVybiAgICAgIEFycmF5IG9mIEFkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWRkcmVzc1tdIHBhcnNlQWRkcmVzc2VzKFN0cmluZyBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAmcXVvdDssJnF1b3Q7KTsKKyAgICAgICAgQWRkcmVzc1tdIGFkZHJzID0gbmV3IEFkZHJlc3Nbc3QuY291bnRUb2tlbnMoKV07CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBhZGRycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkcnNbaV0gPSBuZXcgSW50ZXJuZXRBZGRyZXNzKHN0Lm5leHRUb2tlbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRkcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGUpIHsKKyAgICB9Cit9Cis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPldpdGggYSA8Y29kZT5tb25pdG9yLnByb3BlcnRpZXM8L2NvZGU+IGxpa2UgdGhpczo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyMgY29uZmlndXJhdGlvbiBmb3IgYnVpbGQgbW9uaXRvcgorCittYWlsLnRyYW5zcG9ydC5wcm90b2NvbD1zbXRwCittYWlsLnNtdHAuaG9zdD0mbHQ7aG9zdCZndDsKK21haWwuZnJvbT1XaWxsIEdsb3plciAmbHQ7d2lsbC5nbG96ZXJAamRhLmNvbSZndDsKKworYnVpbGQubG9nPWJ1aWxkLmxvZworCitidWlsZC5mYWlsZWQubm90aWZ5PXRydWUKK2J1aWxkLmZhaWxlZC5lbWFpbC50bz13aWxsLmdsb3plckBqZGEuY29tCitidWlsZC5mYWlsZWQuZW1haWwuc3ViamVjdD1OaWdodGx5IGJ1aWxkIGZhaWxlZCEKKworYnVpbGQuc3VjY2VlZGVkLm5vdGlmeT10cnVlCitidWlsZC5zdWNjZWVkZWQuZW1haWwudG89d2lsbC5nbG96ZXJAamRhLmNvbQorYnVpbGQuc3VjY2VlZGVkLmVtYWlsLnN1YmplY3Q9TmlnaHRseSBidWlsZCBzdWNjZWVkZWQhCis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxjb2RlPm1vbml0b3IucHJvcGVydGllczwvY29kZT4gc2hvdWxkIGJlIHBsYWNlZCByaWdodCBuZXh0CisgICAgICAgIHRvIHlvdXIgY29tcGlsZWQgPGNvZGU+QnVpbGRNb25pdG9yLmNsYXNzPC9jb2RlPi4gIFRvIHVzZSBpdCwKKyAgICAgICAgaW52b2tlIEFudCBsaWtlOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorYW50IC1saXN0ZW5lciBCdWlsZE1vbml0b3IgLWxvZ2ZpbGUgYnVpbGQubG9nCis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPk1ha2Ugc3VyZSB0aGF0IDxjb2RlPm1haWwuamFyPC9jb2RlPiBmcm9tIEphdmFNYWlsIGFuZAorICAgICAgICA8Y29kZT5hY3RpdmF0aW9uLmphcjwvY29kZT4gZnJvbSB0aGUKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhYmVhbnMvZ2xhc2dvdy9qYWYuaHRtbCI+SmF2YQorICAgICAgICBCZWFucyBBY3RpdmF0aW9uIEZyYW1ld29yazwvYT4gYXJlIGluIHlvdXIgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPi48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0ibGlzdGVuZXItcHJvcGVydGllcyI+PC9hPgorICAgICAgSG93IGRvIEkgZ2V0IGF0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgQW50IHdhcyBydW5uaW5nCisgICAgICB3aXRoIGZyb20gaW5zaWRlIEJ1aWxkTGlzdGVuZXI/CisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+WW91IGNhbiBnZXQgYXQgYSBoYXNodGFibGUgd2l0aCBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCBBbnQKKyAgICAgICAgaGFzIGJlZW4gdXNpbmcgdGhyb3VnaCB0aGUgQnVpbGRFdmVudCBwYXJhbWV0ZXIuIEZvcgorICAgICAgICBleGFtcGxlOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGUpIHsKKyAgICBIYXNodGFibGUgdGFibGUgPSBlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgU3RyaW5nIGJ1aWxkcGF0aCA9IChTdHJpbmcpdGFibGUuZ2V0KCZxdW90O2J1aWxkLnBhdGgmcXVvdDspOworICAgIC4uLgorfQorPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGlzIG1vcmUgYWNjdXJhdGUgdGhhbiBqdXN0IHJlYWRpbmcgdGhlIHNhbWUgcHJvcGVydHkKKyAgICAgICAgZmlsZXMgdGhhdCB5b3VyIHByb2plY3QgZG9lcywgc2luY2UgaXQgd2lsbCBnaXZlIHRoZSBjb3JyZWN0CisgICAgICAgIHJlc3VsdHMgZm9yIHByb3BlcnRpZXMgdGhhdCB3ZXJlIHNwZWNpZmllZCBvbiB0aGUgQW50IGNvbW1hbmQgbGluZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iMTcwLXJlcXVpcmVzLWp1bml0Ij48L2E+CisgICAgICBBbnQgMS43LjAgZG9lc24ndCBidWlsZCBmcm9tIHNvdXJjZXMgd2l0aG91dAorICAgICAgICBKVW5pdAorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPldoZW4gYnVpbGRpbmcgQW50IDEuNy4wIGZyb20gdGhlIHNvdXJjZSByZWxlYXNlIHdpdGhvdXQKKyAgICAgICAganVuaXQuamFyIHRoZSBidWlsZCBmYWlscyB3aXRoIHRoZSBtZXNzYWdlICJXZSBjYW5ub3QgYnVpbGQKKyAgICAgICAgdGhlIHRlc3QgamFyIHVubGVzcyBKVW5pdCBpcyBwcmVzZW50Ii48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5XaXRoIEFudCAxLjcuMCB3ZSd2ZSBzdGFydGVkIHRvIGFkZCBhbnQtdGVzdHV0aWwuamFyIGFzCisgICAgICAgIHBhcnQgb2YgdGhlIGRpc3RyaWJ1dGlvbiBhbmQgdGhpcyBjYXVzZXMgYSBoYXJkIGRlcGVuZGVuY3kgb24KKyAgICAgICAgSlVuaXQgLSBhdCBsZWFzdCBpbiB2ZXJzaW9uIDEuNy4wLiAgVW5mb3J0dW5hdGVseSB0aGUKKyAgICAgICAgaW5zdGFsbGF0aW9uIGRvY3MgZG9uJ3Qgc2F5IHNvLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZXJlIGFyZSB0d28gd29ya2Fyb3VuZHM6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9sPgorCisgICAgICAgICAgPGxpPkFkZCBqdW5pdC5qYXIgdG8geW91ciBDTEFTU1BBVEggd2hlbiBidWlsZGluZyBBbnQuPC9saT4KKworICAgICAgICAgIDxsaT5DaGFuZ2UgQW50J3MgYnVpbGRmaWxlIGFuZCByZW1vdmUgdGVzdC1qYXIgZnJvbSB0aGUKKyAgICAgICAgICBkZXBlbmRzIGxpc3Qgb2YgdGhlIGRpc3QtbGl0ZSB0YXJnZXQuPC9saT4KKworICAgICAgICA8L29sPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9InJlbW92ZS1jciI+PC9hPgorICAgICAgJmx0O2NobW9kJmd0OyBvciAmbHQ7ZXhlYyZndDsgZG9lc24ndCB3b3JrIGluIEFudAorICAgICAgICAxLjMgb24gVW5peAorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPlRoZSA8Y29kZT5hbnRSdW48L2NvZGU+IHNjcmlwdCBpbiA8Y29kZT5BTlRfSE9NRS9iaW48L2NvZGU+CisgICAgICAgIGhhcyBET1MgaW5zdGVhZCBvZiBVbml4IGxpbmUgZW5kaW5nczsgeW91IG11c3QgcmVtb3ZlIHRoZQorICAgICAgICBjYXJyaWFnZS1yZXR1cm4gY2hhcmFjdGVycyBmcm9tIHRoaXMgZmlsZS4gIFRoaXMgY2FuIGJlIGRvbmUgYnkKKyAgICAgICAgdXNpbmcgQW50J3MgPGNvZGU+Jmx0O2ZpeGNybGYmZ3Q7PC9jb2RlPiB0YXNrCisgICAgICAgIG9yIHNvbWV0aGluZyBsaWtlOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgordHIgLWQgJ1xyJyAmbHQ7ICRBTlRfSE9NRS9iaW4vYW50UnVuICZndDsgL3RtcC9mb28KK212IC90bXAvZm9vICRBTlRfSE9NRS9iaW4vYW50UnVuCis8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJqYXZhZG9jLWNhbm5vdC1leGVjdXRlIj48L2E+CisgICAgICBKYXZhRG9jIGZhaWxlZDogamF2YS5pby5JT0V4Y2VwdGlvbjogamF2YWRvYzogY2Fubm90IGV4ZWN1dGUKKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5UaGVyZSBpcyBhIGJ1ZyBpbiB0aGUgU29sYXJpcyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgdGhlIEpESyAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MjMwMzk5Lmh0bWwiPmh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MjMwMzk5Lmh0bWw8L2E+KS4KKyAgICAgICAgVGhpcyBhbHNvIGFwcGVhcnMgdG8gYmUgdHJ1ZSB1bmRlciBMaW51eC4gTW92aW5nIHRoZSBKREsgdG8KKyAgICAgICAgdGhlIGZyb250IG9mIHRoZSBQQVRIIGZpeGVzIHRoZSBwcm9ibGVtLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJkZWxlZ2F0aW5nLWNsYXNzbG9hZGVyIj48L2E+CisgICAgICAmbHQ7c3R5bGUmZ3Q7IG9yICZsdDtqdW5pdCZndDsgaWdub3JlcyBteQorICAgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICA8L3A+CisgICAgICAgICAgICAgICAgICA8cD5TdGFydGluZyB3aXRoIEFudCAxLjcuMCwgJmx0O2p1bml0Jmd0OyB3aWxsIGhvbm9yIHlvdXIKKyAgICAgICAgbmVzdGVkICZsdDtjbGFzc3BhdGgmZ3Q7LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZXNlIHRhc2tzIGRvbid0IGlnbm9yZSB5b3VyIGNsYXNzcGF0aCBzZXR0aW5nLCB5b3UKKyAgICAgICAgYXJlIGZhY2luZyBhIGNvbW1vbiBwcm9ibGVtIHdpdGggZGVsZWdhdGluZyBjbGFzc2xvYWRlcnMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBxdWVzdGlvbiBjb2xsZWN0cyBhIGNvbW1vbiB0eXBlIG9mIHByb2JsZW06IEEgdGFzaworICAgICAgICBuZWVkcyBhbiBleHRlcm5hbCBsaWJyYXJ5IGFuZCBpdCBoYXMgYSBuZXN0ZWQgY2xhc3NwYXRoCisgICAgICAgIGVsZW1lbnQgc28gdGhhdCB5b3UgY2FuIHBvaW50IGl0IHRvIHRoaXMgZXh0ZXJuYWwgbGlicmFyeSwgYnV0CisgICAgICAgIHRoYXQgZG9lc24ndCB3b3JrIHVubGVzcyB5b3UgcHV0IHRoZSBleHRlcm5hbCBsaWJyYXJ5CisgICAgICAgIGludG8gdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gb3IgcGxhY2UgaXQgaW4KKyAgICAgICAgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5Tb21lIGJhY2tncm91bmQgaXMgbmVjZXNzYXJ5IGJlZm9yZSB3ZSBjYW4gZGlzY3VzcworICAgICAgICBzb2x1dGlvbnMgZm9yIDxhIGhyZWY9IiNkZWxlZ2F0aW5nLWNsYXNzbG9hZGVyLTEuNSI+QW50CisgICAgICAgIDEuNS54PC9hPiBhbmQgPGEgaHJlZj0iI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS42Ij5BbnQKKyAgICAgICAgMS42Lng8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPldoZW4geW91IHNwZWNpZnkgYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGluCisgICAgICAgIEFudCwgQW50IGNyZWF0ZXMgYSBuZXcgY2xhc3MgbG9hZGVyIHRoYXQgdXNlcyB0aGUgcGF0aCB5b3UKKyAgICAgICAgaGF2ZSBzcGVjaWZpZWQuICBJdCB0aGVuIHRyaWVzIHRvIGxvYWQgYWRkaXRpb25hbCBjbGFzc2VzIGZyb20KKyAgICAgICAgdGhpcyBjbGFzc2xvYWRlci48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JbiBtb3N0IGNhc2VzIC0gZm9yIGV4YW1wbGUgdXNpbmcgJmx0O3N0eWxlJmd0OyBvcgorICAgICAgICAmbHQ7anVuaXQmZ3Q7IC0gQW50IGRvZXNuJ3QgbG9hZCB0aGUgZXh0ZXJuYWwgbGlicmFyeQorICAgICAgICBkaXJlY3RseSwgaXQgaXMgdGhlIGxvYWRlZCBjbGFzcyB0aGF0IGRvZXMgc28uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SW4gdGhlIGNhc2Ugb2YgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gaXQgaXMgdGhlIHRhc2sKKyAgICAgICAgaW1wbGVtZW50YXRpb24gaXRzZWxmIGFuZCBpbiB0aGUgY2FzZSBvZgorICAgICAgICA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPiBpdCBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRMaWFpc29uPC9jb2RlPgorICAgICAgICBjbGFzcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD48ZW0+QXMgb2YgQW50IDEuNzwvZW0+IDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IG5vIGxvbmdlcgorICAgICAgICByZXF1aXJlcyB5b3UgdG8gaGF2ZSA8Y29kZT5qdW5pdC5qYXI8L2NvZGU+IGluIEFudCdzIHN0YXJ0dXAKKyAgICAgICAgY2xhc3NwYXRoIGV2ZW4gaWYgPGNvZGU+YW50LWp1bml0LmphcjwvY29kZT4gaXMgcHJlc2VudCB0aGVyZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnQncyBjbGFzcyBsb2FkZXIgaW1wbGVtZW50YXRpb24gdXNlcyBKYXZhJ3MKKyAgICAgICAgZGVsZWdhdGlvbiBtb2RlbCwgc2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2FwaS9qYXZhL2xhbmcvQ2xhc3NMb2FkZXIuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvYXBpL2phdmEvbGFuZy9DbGFzc0xvYWRlci5odG1sPC9hPgorICAgICAgICB0aGUgcGFyYWdyYXBoPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJsb2NrcXVvdGU+VGhlIDxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPiBjbGFzcyB1c2VzIGEKKyAgICAgICAgZGVsZWdhdGlvbiBtb2RlbCB0byBzZWFyY2ggZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy4gRWFjaAorICAgICAgICBpbnN0YW5jZSBvZiA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4gaGFzIGFuIGFzc29jaWF0ZWQgcGFyZW50CisgICAgICAgIGNsYXNzIGxvYWRlci4gIFdoZW4gY2FsbGVkIHVwb24gdG8gZmluZCBhIGNsYXNzIG9yIHJlc291cmNlLCBhCisgICAgICAgIDxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPiBpbnN0YW5jZSB3aWxsIGRlbGVnYXRlIHRoZSBzZWFyY2ggZm9yCisgICAgICAgIHRoZSBjbGFzcyBvciByZXNvdXJjZSB0byBpdHMgcGFyZW50IGNsYXNzIGxvYWRlciBiZWZvcmUKKyAgICAgICAgYXR0ZW1wdGluZyB0byBmaW5kIHRoZSBjbGFzcyBvciByZXNvdXJjZSBpdHNlbGYuIFRoZSB2aXJ0dWFsCisgICAgICAgIG1hY2hpbmUncyBidWlsdC1pbiBjbGFzcyBsb2FkZXIsIGNhbGxlZCB0aGUgYm9vdHN0cmFwCisgICAgICAgIGNsYXNzIGxvYWRlciwgZG9lcyBub3QgaXRzZWxmIGhhdmUgYSBwYXJlbnQgYnV0IG1heSBzZXJ2ZSBhcworICAgICAgICB0aGUgcGFyZW50IG9mIGEgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+CisgICAgICAgIGluc3RhbmNlLjwvYmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBwb3NzaWJsZSBzb2x1dGlvbnMgZGVwZW5kIG9uIHRoZSB2ZXJzaW9uIG9mIEFudCB5b3UKKyAgICAgICAgdXNlLCBzZWUgdGhlIG5leHQgc2VjdGlvbnMuPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9ImRlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS41Ij48L2E+CisgICAgICAmbHQ7c3R5bGUmZ3Q7IG9yICZsdDtqdW5pdCZndDsgaWdub3JlcyBteQorICAgICAgJmx0O2NsYXNzcGF0aCZndDsgLSBBbnQgMS41LnggdmVyc2lvbgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPlBsZWFzZSByZWFkIDxhIGhyZWY9IiNkZWxlZ2F0aW5nLWNsYXNzbG9hZGVyIj50aGUgcHJldmlvdXMKKyAgICAgICAgZW50cnk8L2E+IGJlZm9yZSB5b3UgZ28gYWhlYWQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+Rmlyc3Qgb2YgYWxsIGxldCdzIHN0YXRlIHRoYXQgQW50J3Mgd3JhcHBlciBzY3JpcHQKKyAgICAgICAgKDxjb2RlPmFudDwvY29kZT4gb3IgPGNvZGU+YW50LmJhdDwvY29kZT4pIGFkZHMgYWxsCisgICAgICAgIDxjb2RlPi5qYXI8L2NvZGU+IGZpbGVzIGZyb20gPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPiB0bworICAgICAgICA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LCB0aGVyZWZvcmUgImluCisgICAgICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4iIHNoYWxsIG1lYW4gImVpdGhlciBpbiB5b3VyCisgICAgICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgb3IKKyAgICAgICAgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPiIgZm9yIHRoZSByZXN0IG9mIHRoaXMKKyAgICAgICAgYW5zd2VyLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSByb290IG9mIHRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIGNsYXNzIHRoYXQgbmVlZHMgdGhlCisgICAgICAgIGV4dGVybmFsIGxpYnJhcnkgaXMgb24gdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+TGV0J3Mgc2VlIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBsb2FkIHRoZSAmbHQ7anVuaXQmZ3Q7CisgICAgICAgIHRhc2suICBBbnQncyBjbGFzcyBsb2FkZXIgd2lsbCBjb25zdWx0IHRoZQorICAgICAgICBib290c3RyYXAgY2xhc3MgbG9hZGVyIGZpcnN0LCB3aGljaCB0cmllcyB0byBsb2FkIGNsYXNzZXMgZnJvbQorICAgICAgICA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LiAgVGhlIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIKKyAgICAgICAgZG9lc24ndCBrbm93IGFueXRoaW5nIGFib3V0IEFudCdzIGNsYXNzIGxvYWRlciBvcgorICAgICAgICBldmVuIHRoZSBwYXRoIHlvdSBoYXZlIHNwZWNpZmllZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB0aGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlciBjYW4gbG9hZCB0aGUgY2xhc3MgQW50IGhhcworICAgICAgICBhc2tlZCBpdCB0byBsb2FkICh3aGljaCBpdCBjYW4gaWYgPGNvZGU+b3B0aW9uYWwuamFyPC9jb2RlPiBpcworICAgICAgICBwYXJ0IG9mIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4pLCB0aGlzIGNsYXNzIHdpbGwgdHJ5IHRvIGxvYWQKKyAgICAgICAgdGhlIGV4dGVybmFsIGxpYnJhcnkgZnJvbSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGFzIHdlbGwgLSBpdAorICAgICAgICBkb2Vzbid0IGtub3cgYW55dGhpbmcgZWxzZSAtIGFuZCB3aWxsIG5vdCBmaW5kIGl0IHVubGVzcworICAgICAgICB0aGUgbGlicmFyeSBpcyBpbiA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGFzIHdlbGwuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VG8gc29sdmUgdGhpcywgeW91IGhhdmUgdHdvIG1ham9yIG9wdGlvbnM6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9sPgorICAgICAgICAgIDxsaT5wdXQgYWxsIGV4dGVybmFsIGxpYnJhcmllcyB5b3UgbmVlZCBpbgorICAgICAgICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gYXMgd2VsbCB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50LAorICAgICAgICAgIG90aGVyd2lzZSB5b3Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGlzIEZBUSBlbnRyeS48L2xpPgorCisgICAgICAgICAgPGxpPnJlbW92ZSB0aGUgY2xhc3MgdGhhdCBsb2FkcyB0aGUgZXh0ZXJuYWwgbGlicmFyeSBmcm9tCisgICAgICAgICAgdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4uPC9saT4KKyAgICAgICAgPC9vbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIHJlbW92ZQorICAgICAgICA8Y29kZT5vcHRpb25hbC5qYXI8L2NvZGU+IGZyb20gPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPi4gIElmCisgICAgICAgIHlvdSBkbyBzbywgeW91IHdpbGwgaGF2ZSB0byA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IGFsbAorICAgICAgICBvcHRpb25hbCB0YXNrcyBhbmQgdXNlIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4KKyAgICAgICAgZWxlbWVudHMgaW4gdGhlIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gdGFza3MgdGhhdCBwb2ludAorICAgICAgICB0byB0aGUgbmV3IGxvY2F0aW9uIG9mIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4uICBBbHNvLAorICAgICAgICBkb24ndCBmb3JnZXQgdG8gYWRkIHRoZSBuZXcgbG9jYXRpb24gb2YKKyAgICAgICAgPGNvZGU+b3B0aW9uYWwuamFyPC9jb2RlPiB0byB0aGUKKyAgICAgICAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IG9mIHlvdXIKKyAgICAgICAgPGNvZGU+Jmx0O3N0eWxlJmd0OzwvY29kZT4gb3IgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4KKyAgICAgICAgdGFzay48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3Ugd2FudCB0byBhdm9pZCB0byA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IGFsbAorICAgICAgICBvcHRpb25hbCB0YXNrcyB5b3UgbmVlZCwgdGhlIG9ubHkgb3RoZXIgb3B0aW9uIGlzIHRvIHJlbW92ZQorICAgICAgICB0aGUgY2xhc3NlcyB0aGF0IHNob3VsZCBub3QgYmUgbG9hZGVkIHZpYSB0aGUgYm9vdHN0cmFwIGNsYXNzCisgICAgICAgIGxvYWRlciBmcm9tIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4gYW5kIHB1dCB0aGVtIGludG8gYQorICAgICAgICBzZXBhcmF0ZSBhcmNoaXZlLiBBZGQgdGhpcyBzZXBhcmF0ZSBhcmNoaXZlIHRvIHRoZQorICAgICAgICA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gb2YgeW91cgorICAgICAgICA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB0YXNrCisgICAgICAgIC0gYW5kIG1ha2Ugc3VyZSB0aGUgc2VwYXJhdGUgYXJjaGl2ZSBpcyBub3QgaW4KKyAgICAgICAgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JbiB0aGUgY2FzZSBvZiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB5b3UnZCBoYXZlCisgICAgICAgIHRvIHJlbW92ZSBhbGwgY2xhc3NlcyB0aGF0IGFyZSBpbiB0aGUKKyAgICAgICAgPGNvZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQ8L2NvZGU+CisgICAgICAgIGRpcmVjdG9yeSwgaW4gdGhlIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IGNhc2UgaXQgaXMgb25lIG9mCisgICAgICAgIHRoZSA8Y29kZT4qTGlhaXNvbjwvY29kZT4gY2xhc3NlcyBpbgorICAgICAgICA8Y29kZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbDwvY29kZT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IHVzZSB0aGUgb3B0aW9uIHRvIGJyZWFrIHVwIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4KKyAgICAgICAgZm9yIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IG9yIHJlbW92ZQorICAgICAgICA8Y29kZT5hbnQtanVuaXQuamFyPC9jb2RlPiwgeW91IHN0aWxsIGhhdmUgdG8gdXNlIGEKKyAgICAgICAgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiB3aXRoIGEgbmVzdGVkCisgICAgICAgIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiB0byBkZWZpbmUgdGhlIGp1bml0IHRhc2suPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9ImRlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS42Ij48L2E+CisgICAgICAmbHQ7c3R5bGUmZ3Q7IG9yICZsdDtqdW5pdCZndDsgaWdub3JlcyBteQorICAgICAgJmx0O2NsYXNzcGF0aCZndDsgLSBBbnQgMS42LnggdmVyc2lvbgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPlBsZWFzZSByZWFkIDxhIGhyZWY9IiNkZWxlZ2F0aW5nLWNsYXNzbG9hZGVyIj50aGUgZ2VuZXJhbAorICAgICAgICBlbnRyeTwvYT4gYmVmb3JlIHlvdSBnbyBhaGVhZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgd3JhcHBlciBzY3JpcHQgb2YgQW50IDEuNi54IG5vIGxvbmdlciBhZGRzIHRoZSBjb250ZW50cworICAgICAgICBvZiA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+IHRvIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4sCisgICAgICAgIGluc3RlYWQgQW50IHdpbGwgY3JlYXRlIGEgY2xhc3Nsb2FkZXIgb24gdG9wIG9mIHRoZSBib290c3RyYXAKKyAgICAgICAgY2xhc3Nsb2FkZXIgLSBsZXQncyBjYWxsIGl0IHRoZSBjb3JlbG9hZGVyIGZvciB0aGUgcmVzdCBvZgorICAgICAgICB0aGlzIGFuc3dlciAtIHdoaWNoIGhvbGRzIHRoZSBjb250ZW50cyBvZgorICAgICAgICA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+LiAgQW50J3MgY29yZSBhbmQgaXRzIHRhc2tzIHdpbGwgYmUKKyAgICAgICAgbG9hZGVkIHRocm91Z2ggdGhpcyBjbGFzc2xvYWRlciBhbmQgbm90IHRoZSBib290c3RyYXAKKyAgICAgICAgY2xhc3Nsb2FkZXIuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBjYXVzZXMgc29tZSBzbWFsbCBidXQgbm90YWJsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIEFudAorICAgICAgICAxLjUueCBhbmQgMS42LnguICBNb3N0IGltcG9ydGFudGx5LCBhIHRoaXJkLXBhcnR5IHRhc2sgdGhhdCBpcworICAgICAgICBwYXJ0IG9mIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gd2lsbCBubyBsb25nZXIgd29yayBpbiBBbnQKKyAgICAgICAgMS42Lnggc2luY2UgdGhlIHRhc2sgbm93IGNhbid0IGZpbmQgQW50J3MgY2xhc3Nlcy4gIEluIGEgc2Vuc2UKKyAgICAgICAgdGhpcyBpcyB0aGUgc2FtZSBwcm9ibGVtIHRoaXMgZW50cnkgaXMgYWJvdXQsIG9ubHkKKyAgICAgICAgPGNvZGU+YW50LmphcjwvY29kZT4gaGFzIGJlY29tZSB0aGUgZXh0ZXJuYWwgbGlicmFyeSBpbgorICAgICAgICBxdWVzdGlvbiBub3cuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBjb3JlbG9hZGVyIGFsc28gaG9sZHMgdGhlIGNvbnRlbnRzIG9mCisgICAgICAgIDxjb2RlPn4vLmFudC9saWI8L2NvZGU+IGFuZCBhbnkgZmlsZSBvciBkaXJlY3RvcnkgdGhhdCBoYXMKKyAgICAgICAgYmVlbiBzcGVjaWZpZWQgdXNpbmcgQW50J3MgPGNvZGU+LWxpYjwvY29kZT4gY29tbWFuZCBsaW5lCisgICAgICAgIGFyZ3VtZW50LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkxldCdzIHNlZSB3aGF0IGhhcHBlbnMgd2hlbiB5b3UgbG9hZCB0aGUgJmx0O2p1bml0Jmd0OworICAgICAgICB0YXNrLiAgQW50J3MgY2xhc3MgbG9hZGVyIHdpbGwgY29uc3VsdCB0aGUgYm9vdHN0cmFwCisgICAgICAgIGNsYXNzIGxvYWRlciBmaXJzdCwgd2hpY2ggdHJpZXMgdG8gbG9hZCBjbGFzc2VzIGZyb20KKyAgICAgICAgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPi4gIFRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyCisgICAgICAgIGRvZXNuJ3Qga25vdyBhbnl0aGluZyBhYm91dCBBbnQncyBjbGFzcyBsb2FkZXIgb3IKKyAgICAgICAgZXZlbiB0aGUgcGF0aCB5b3UgaGF2ZSBzcGVjaWZpZWQuICBJZiBpdCBmYWlscyB0byBmaW5kIHRoZQorICAgICAgICBjbGFzcyB1c2luZyB0aGUgYm9vdHN0cmFwIGNsYXNzbG9hZGVyIGl0IHdpbGwgdHJ5IHRoZQorICAgICAgICBjb3JlbG9hZGVyIG5leHQuICBBZ2FpbiwgdGhlIGNvcmVsb2FkZXIgZG9lc24ndCBrbm93IGFueXRoaW5nCisgICAgICAgIGFib3V0IHlvdXIgcGF0aC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB0aGUgY29yZWxvYWRlciBjYW4gbG9hZCB0aGUgY2xhc3MgQW50IGhhcyBhc2tlZCBpdCB0bworICAgICAgICBsb2FkICh3aGljaCBpdCBjYW4gaWYgPGNvZGU+YW50LWp1bml0LmphcjwvY29kZT4gaXMgaW4KKyAgICAgICAgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPiksIHRoaXMgY2xhc3Mgd2lsbCB0cnkgdG8gbG9hZCB0aGUKKyAgICAgICAgZXh0ZXJuYWwgbGlicmFyeSBmcm9tIGNvcmVsb2FkZXIgYXMgd2VsbCAtIGl0IGRvZXNuJ3QKKyAgICAgICAga25vdyBhbnl0aGluZyBlbHNlIC0gYW5kIHdpbGwgbm90IGZpbmQgaXQgdW5sZXNzIHRoZSBsaWJyYXJ5CisgICAgICAgIGlzIGluIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gb3IgdGhlIGNvcmVsb2FkZXIgYXMgd2VsbC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UbyBzb2x2ZSB0aGlzLCB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIG1ham9yIG9wdGlvbnM6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9sPgorICAgICAgICAgIDxsaT5wdXQgYWxsIGV4dGVybmFsIGxpYnJhcmllcyB5b3UgbmVlZCBpbgorICAgICAgICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gYXMgd2VsbCB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50LAorICAgICAgICAgIG90aGVyd2lzZSB5b3Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGlzIEZBUSBlbnRyeS48L2xpPgorCisgICAgICAgICAgPGxpPnB1dCBhbGwgZXh0ZXJuYWwgbGlicmFyaWVzIHlvdSBuZWVkIGluCisgICAgICAgICAgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPiBvciA8Y29kZT4uYW50L2xpYjwvY29kZT4uICBUaGlzCisgICAgICAgICAgcHJvYmFibHkgc3RpbGwgaXNuJ3Qgd2hhdCB5b3Ugd2FudCwgYnV0IHlvdSBtaWdodCByZWNvbnNpZGVyCisgICAgICAgICAgdGhlIDxjb2RlPi5hbnQvbGliPC9jb2RlPiBvcHRpb24uPC9saT4KKworICAgICAgICAgIDxsaT5BbHdheXMgc3RhcnQgQW50IHdpdGggdGhlIDxjb2RlPi1saWI8L2NvZGU+IGNvbW1hbmQgbGluZQorICAgICAgICAgIHN3aXRjaCBhbmQgcG9pbnQgdG8geW91ciBleHRlcm5hbCBsaWJyYXJpZXMgKG9yIHRoZQorICAgICAgICAgIGRpcmVjdG9yaWVzIGhvbGRpbmcgdGhlbSkuPC9saT4KKworICAgICAgICAgIDxsaT5yZW1vdmUgdGhlIGNsYXNzIHRoYXQgbG9hZHMgdGhlIGV4dGVybmFsIGxpYnJhcnkgZnJvbQorICAgICAgICAgIHRoZSBjb3JlbG9hZGVyLjwvbGk+CisgICAgICAgIDwvb2w+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JbiBBbnQgMS42IDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4gaGFzIGJlZW4gc3BsaXQgaW50bworICAgICAgICBtdWx0aXBsZSBqYXJzLCBlYWNoIG9uZSBjb250YWluaW5nIGNsYXNzZXMgd2l0aCB0aGUgc2FtZQorICAgICAgICBkZXBlbmRlbmNpZXMgb24gZXh0ZXJuYWwgbGlicmFyaWVzLiAgWW91IGNhbiBtb3ZlIHRoZQorICAgICAgICAib2ZmZW5kaW5nIiBqYXIgb3V0IG9mIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4uICBGb3IgdGhlCisgICAgICAgIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IHRhc2sgaXQgd291bGQgYmUKKyAgICAgICAgPGNvZGU+YW50LWp1bml0LmphcjwvY29kZT4gYW5kIGZvciA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPgorICAgICAgICBpdCB3b3VsZCBiZSA8Y29kZT5hbnQtdHJheC5qYXI8L2NvZGU+CisgICAgICAgIG9yIDxjb2RlPmFudC14c2xwLmphcjwvY29kZT4gLSAKKyAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSBwcm9jZXNzb3IgeW91IHVzZS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgZG8gc28sIHlvdSB3aWxsIGhhdmUgdG8gPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPgorICAgICAgICBhbGwgb3B0aW9uYWwgdGFza3MgdGhhdCBuZWVkIHRoZSBleHRlcm5hbCBsaWJyYXJ5IGFuZCB1c2UKKyAgICAgICAgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiB0YXNrcyB0aGF0IHBvaW50IHRvIHRoZSBuZXcKKyAgICAgICAgbG9jYXRpb24gb2YgPGNvZGU+YW50LSouamFyPC9jb2RlPi4gIEFsc28sIGRvbid0IGZvcmdldAorICAgICAgICB0byBhZGQgdGhlIG5ldyBsb2NhdGlvbiBvZiA8Y29kZT5hbnQtKi5qYXI8L2NvZGU+IHRvIHRoZQorICAgICAgICA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gb2YgeW91cgorICAgICAgICA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPgorICAgICAgICB0YXNrLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkZvciBleGFtcGxlPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CisgICAgJmx0O3Rhc2tkZWYgbmFtZT0mcXVvdDtqdW5pdCZxdW90OworICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUYXNrJnF1b3Q7Jmd0OworICAgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O0hPTUUtT0YvanVuaXQuamFyJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O05FVy1IT01FLU9GL2FudC1qdW5pdC5qYXImcXVvdDsvJmd0OworICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CisgICAgJmx0Oy90YXNrZGVmJmd0OworPC9wcmU+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0id2lueHAtamRrMTQtYW50MTQiPjwvYT4KKyAgICAgIFdoZW4gcnVubmluZyBBbnQgMS40IG9uIFdpbmRvd3MgWFAgYW5kIEpESyAxLjQsIEkgZ2V0CisgICAgICB2YXJpb3VzIGVycm9ycyB3aGVuIHRyeWluZyB0byA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+LCBmb3JrCisgICAgICA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IG9yIGFjY2VzcyBlbnZpcm9ubWVudAorICAgICAgdmFyaWFibGVzLgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPkFudCAmbHQ7IDEuNSBkb2Vzbid0IHJlY29nbml6ZSBXaW5kb3dzIFhQIGFzIGEgZmxhdm9yCisgICAgICAgIG9mIFdpbmRvd3MgdGhhdCBydW5zIDxjb2RlPkNNRC5FWEU8L2NvZGU+IGluc3RlYWQgb2YKKyAgICAgICAgPGNvZGU+Q09NTUFORC5DT008L2NvZGU+LiAgSkRLIDEuMyB3aWxsIHRlbGwgQW50IHRoYXQgV2luZG93cworICAgICAgICBYUCBpcyBXaW5kb3dzIDIwMDAgc28gdGhlIHByb2JsZW0gZG9lc24ndCBzaG93IHVwCisgICAgICAgIHRoZXJlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwYXJ0IGZyb20gdXBncmFkaW5nIHRvIEFudCAxLjUgb3IgYmV0dGVyLCBzZXR0aW5nIHRoZQorICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Y29kZT5BTlRfT1BUUzwvY29kZT4gdG8KKyAgICAgICAgPGNvZGU+LURvcy5uYW1lPVdpbmRvd3NfTlQ8L2NvZGU+IHByaW9yIHRvIGludm9raW5nIEFudCBoYXMKKyAgICAgICAgYmVlbiBjb25maXJtZWQgYXMgYSB3b3JrYXJvdW5kLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSIxLjUtY3lnd2luLXNoIj48L2E+CisgICAgICBUaGUgPGNvZGU+YW50PC9jb2RlPiB3cmFwcGVyIHNjcmlwdCBvZiBBbnQgMS41IGZhaWxzCisgICAgICBmb3IgQ3lnd2luIGlmIDxjb2RlPkFOVF9IT01FPC9jb2RlPiBpcyBzZXQgdG8gYSBXaW5kb3dzIHN0eWxlCisgICAgICBwYXRoLgorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPlRoaXMgcHJvYmxlbSBoYXMgYmVlbiByZXBvcnRlZCBvbmx5IGhvdXJzIGFmdGVyIEFudCAxLjUgaGFzCisgICAgICAgIGJlZW4gcmVsZWFzZWQsIHNlZSA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEwNjY0Ij5CdWcKKyAgICAgICAgMTA2NjQ8L2E+IGFuZCBhbGwgaXRzIGR1cGxpY2F0ZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QSBmaXhlZCB2ZXJzaW9uIG9mIHRoZSB3cmFwcGVyIHNjcmlwdCBjYW4gYmUgZm91bmQgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL29sZC1yZWxlYXNlcy92MS41L2VycmF0YS8iPmhlcmU8L2E+LgorICAgICAgICBTaW1wbHkgcmVwbGFjZSB5b3VyIHNjcmlwdCB3aXRoIHRoaXMgdmVyc2lvbi48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iMS41LjItemlwLWJyb2tlbiI+PC9hPgorICAgICAgPGNvZGU+Jmx0O3ppcCZndDs8L2NvZGU+IGlzIGJyb2tlbiBpbiBBbnQgMS41LjIuCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+WWVzLCBpdCBpcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgcHJvYmxlbSByZXBvcnRlZCBieSBtb3N0IHBlb3BsZSAtIHNlZSA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3NjQ4Ij5CdWcKKyAgICAgICAgMTc2NDg8L2E+IGFuZCBhbGwgaXRzIGR1cGxpY2F0ZXMgLSBpcyB0aGF0IEFudCBjcmVhdGVzCisgICAgICAgIGFyY2hpdmVzIHRoYXQgYSBwYXJ0aWFsbHkgdW5yZWFkYWJsZSBieSBXaW5aSVAuICBMdWNraWx5CisgICAgICAgIDxjb2RlPmphcjwvY29kZT4gZGVhbHMgd2l0aCB0aGUgYXJjaGl2ZXMgYW5kIHNvIHRoZSBnZW5lcmF0ZWQKKyAgICAgICAgamFycy93YXJzL2VhcnMgd2lsbCBtb3N0IGxpa2VseSB3b3JrIGZvciB5b3UgYW55d2F5LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZXJlIGFyZSBhZGRpdGlvbmFsIHByb2JsZW1zLCBzZWUgYnVncyA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3NzgwIj5CdWcKKyAgICAgICAgMTc3ODA8L2E+LCA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3ODcxIj5CdWcKKyAgICAgICAgMTc4NzE8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE4NDAzIj5CdWcKKyAgICAgICAgMTg0MDM8L2E+LiAgQWxsIG9mIHRoZW0gYXJlIHN1cHBvc2VkIHRvIGJlIGZpeGVkIHdpdGggQW50CisgICAgICAgIDEuNS4zIChhbmQgb25seSAxODQwMyBzaG91bGQgZXhpc3QgaW4gMS41LjNiZXRhMSkuPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9InVua25vd25lbGVtZW50LnRhc2tjb250YWluZXIiPjwvYT4KKyAgICAgIAorICAgICAgICBXaHkgZG8gbXkgY3VzdG9tIHRhc2sgY29udGFpbmVycyBzZWUgVW5rbm93biBFbGVtZW50cyBpbiBBbnQgMS42CisgICAgICAgIC0gdGhleSB3b3JrZWQgaW4gQW50IDEuNT8KKyAgICAgIAorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgIFRoZSBvYmplY3RzIGFkZGVkIGluIFRhc2tDb250YWluZXIuYWRkVGFzayhUYXNrIHRhc2spCisgICAgICAgICAgaGF2ZSBjaGFuZ2VkIGZyb20gIFRhc2tzIHRvIFVua25vd25FbGVtZW50cy4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgVGhlcmUgd2FzIGEgbnVtYmVyIG9mIHZhbGlkIHJlYXNvbnMgZm9yIHRoaXMgY2hhbmdlLiBCdXQgdGhlIGJhY2t3YXJkCisgICAgICAgICAgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3ZXJlIG5vdCBub3RpY2VkIHVudGlsIGFmdGVyIEFudCAxLjYuMCB3YXMKKyAgICAgICAgICByZWxlYXNlZC4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgWW91ciBjb250YWluZXIgY2xhc3Mgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIGNoZWNrIGlmIHRoZSBUYXNrCisgICAgICAgICAgaXMgYW4gVW5rbm93bkVsZW1lbnQgYW5kIGNhbGwgcGVyZm9ybSBvbiBpdCB0bworICAgICAgICAgIGNvbnZlcnQgaXQgdG8gYSBUYXNrIGFuZCB0byBleGVjdXRlIGl0LgorICAgICAgICAgIChzZWUgYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TZXF1ZW50aWFsKQorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICBJZiB5b3Ugd2FudCB0byBkbyBtb3JlIHByb2Nlc3Npbmcgb24gdGhlIHRhc2ssCisgICAgICAgICAgeW91IG5lZWQgdG8gdXNlIHRoZSB0ZWNobmlxdWVzIGluIGFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50bGliI2V4ZWN1dGUoKQorICAgICAgICAgIFRoaXMgZG9lcyBtYWtlIHVzZSBvZiBvbmUgMS42IG1ldGhvZCBjYWxsIChVRSNnZXRSZWFsT2JqZWN0KCkpLAorICAgICAgICAgIHlvdSBuZWVkIHRvIHVzZSBVRSNnZXRUYXNrKCkgaW5zdGVhZCAtIHRoaXMgd2lsbAorICAgICAgICAgIHJldHVybiBudWxsIGZvciBub24gdGFza3MgKHR5cGVzIGxpa2UgZmlsZXNldCBpZD14KS4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgU28uLiBpdGVyYXRlIG92ZXIgdGhlIHRhc2tzLCBpZiB0aGV5IGFyZSBVRXMsIGNvbnZlcnQgdGhlbSB0bworICAgICAgICAgIHRhc2tzLCB1c2luZyBVRSNtYXliZUNvbmZpZ3VyZSBhbmQgVUUjZ2V0VGFzaygpCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YXNrcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgVGFzayB0ID0gKFRhc2spIGkubmV4dCgpOworICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFVua25vd25FbGVtZW50KSB7CisgICAgICAgICAgICAgICgoVW5rbm93bkVsZW1lbnQpIHQpLm1heWJlQ29uZmlndXJlKCk7CisgICAgICAgICAgICAgIHQgPSAoKFVua25vd25FbGVtZW50KSB0KS5nZXRUYXNrKCk7CisgICAgICAgICAgICAgIGlmICh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgICAgLy8gLi4uLiBvcmlnaW5hbCBDdXN0b20gY29kZQorICAgICAgICB9CisgICAgICAgIDwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgVGhpcyBhcHByb2FjaCBzaG91bGQgd29yayBmb3IgYW50MS41IGFuZCBhbnQxLjYuCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9ImZhcSI+CisgICAgICA8YSBuYW1lPSJqYXZhLmV4Y2VwdGlvbi5zdGFja3RyYWNlIj48L2E+CisgICAgICAKKyAgICAgICAgVGhlIHByb2dyYW0gSSBydW4gdmlhICZsdDtqYXZhJmd0OyB0aHJvd3MgYW4gZXhjZXB0aW9uIGJ1dCBJCisgICAgICAgIGNhbid0IHNlZW0gdG8gZ2V0IHRoZSBmdWxsIHN0YWNrIHRyYWNlLgorICAgICAgCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+VGhpcyBpcyBhIGtub3cgYnVnIHRoYXQgaGFzIGJlZW4gZml4ZWQgYWZ0ZXIgdGhlIHJlbGVhc2Ugb2YKKyAgICAgICAgQW50IDEuNi4xLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFzIGEgd29ya2Fyb3VuZCwgcnVuIHlvdXIgJmx0O2phdmEmZ3Q7IHRhc2sgd2l0aAorICAgICAgICA8Y29kZT5mb3JrPSJ0cnVlIjwvY29kZT4gYW5kIEFudCB3aWxsIGRpc3BsYXkgdGhlIGZ1bGwKKyAgICAgICAgdHJhY2UuPC9wPgorICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZmFxIj4KKyAgICAgIDxhIG5hbWU9Imp1bml0LW5vLXJ1bnRpbWUteG1sIj48L2E+CisgICAgICAKKyAgICAgICAgVXNpbmcgZm9ybWF0PSJ4bWwiLCAmbHQ7anVuaXQmZ3Q7IGZhaWxzIHdpdGggYQorICAgICAgICA8Y29kZT5Ob0NsYXNzRGVmRm91bmRFcnJvcjwvY29kZT4gaWYgZm9ya2VkLgorICAgICAgCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+VGhlIFhNTCBmb3JtYXR0ZXIgbmVlZHMgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0RPTS8iPkRPTSBjbGFzc2VzPC9hPiB0byB3b3JrLiAgSWYgeW91CisgICAgICAgIGFyZSB1c2luZyBKREsgMS40IG9yIGxhdGVyIHRoZXkgYXJlIGluY2x1ZGVkIHdpdGggeW91ciBKYXZhCisgICAgICAgIFJ1bnRpbWUgYW5kIHRoaXMgcHJvYmxlbSB3b24ndCBvY2N1ci4gIElmIHlvdSBhcmUgcnVubmluZyBKREsKKyAgICAgICAgMS4zIG9yIGVhcmxpZXIsIHRoZSBET00gY2xhc3NlcyBoYXZlIHRvIGJlIG9uIHlvdXIKKyAgICAgICAgJmx0O2p1bml0Jmd0OyB0YXNrJ3MgJmx0O2NsYXNzcGF0aCZndDsuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UHJpb3IgdG8gQW50IDEuNi4wIEFudCB3b3VsZCBpbmNsdWRlIHRoZSBET00gY2xhc3NlcyBmcm9tCisgICAgICAgIHRoZSBYTUwgcGFyc2VyIHRoYXQgaXMgdXNlZCBieSBBbnQgaXRzZWxmIGlmIHlvdSBzZXQgdGhlCisgICAgICAgIGluY2x1ZGVBbnRSdW50aW1lIGF0dHJpYnV0ZSB0byB0cnVlICh0aGUgZGVmYXVsdCkuICBXaXRoIEFudAorICAgICAgICAxLjYuMCB0aGlzIGhhcyBiZWVuIGNoYW5nZWQgYXMgdGhpcyBiZWhhdmlvciBtYWRlIGl0CisgICAgICAgIGltcG9zc2libGUgdG8gdXNlIGEgZGlmZmVyZW50IFhNTCBwYXJzZXIgaW4geW91ciB0ZXN0cy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgdG8gdGFrZSBjYXJlIG9mIHRoZSBET00gY2xhc3NlcworICAgICAgICBleHBsaWNpdGx5IHN0YXJ0aW5nIHdpdGggQW50IDEuNi4wLiAgSWYgeW91IGRvbid0IG5lZWQgdG8gc2V0CisgICAgICAgIHVwIGEgZGlmZmVyZW50IFhNTCBwYXJzZXIgZm9yIHlvdXIgdGVzdHMsIHRoZSBlYXNpZXN0IHNvbHV0aW9uCisgICAgICAgIGlzIHRvIGFkZDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHthbnQuaG9tZX0vbGliL3htbC1hcGlzLmphcjoke2FudC5ob21lfS9saWIveGVyY2VzSW1wbC5qYXImcXVvdDsvJmd0OworPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD50byB5b3VyIHRhc2sncyAmbHQ7Y2xhc3NwYXRoJmd0Oy48L3A+CisgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0ieGFsYW4tamRrMS41Ij48L2E+CisgICAgICAKKyAgICAgICAgPGNvZGU+Jmx0O2p1bml0cmVwb3J0Jmd0OzwvY29kZT4gZG9lc24ndCB3b3JrIHdpdGggSkRLIDEuNSBidXQKKyAgICAgICAgd29ya2VkIGZpbmUgd2l0aCBKREsgMS40LgorICAgICAgCisgICAgPC9wPgorICAgICAgICAgICAgICAgICAgPHA+V2hpbGUgSkRLIDEuNC54IGNvbnRhaW5zIGEgdmVyc2lvbiBvZiBYYWxhbi1KIDIsIEpESyAxLjUKKyAgICAgICAgKGFuZCBsYXRlcj8pIGhhdmUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2NvbXBhdGliaWxpdHkuaHRtbCM0OTU5NzgzIj5tb3ZlZAorICAgICAgICB0byBYU0xUQzwvYT4uICBTaW5jZSB0aGlzIHRhc2sgdXNlcyBYYWxhbidzIHJlZGlyZWN0CisgICAgICAgIGV4dGVuc2lvbnMgZm9yIGl0cyBpbnRlcm5hbCBzdHlsZXNoZWV0LCBBbnQgcHJpb3IgdG8gMS42LjIgZGlkbid0IHN1cHBvcnQKKyAgICAgICAgWFNMVEMuICBUaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgdG8gaW5zdGFsbCA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai8iPlhhbGFuLUogMjwvYT4gaW4gb3JkZXIKKyAgICAgICAgdG8gdXNlIHRoaXMgdGFzayB3aXRoIEpESyAxLjUgaW4gb2xkZXIgdmVyc2lvbnMgb2YgQW50LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlN0YXJ0aW5nIHdpdGggQW50IDEuNi4yIDxjb2RlPiZsdDtqdW5pdHJlcG9ydCZndDs8L2NvZGU+CisgICAgICAgIHN1cHBvcnRzIEpESyAxLjUuPC9wPgorICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9mYXZpY29uLmljbyBiL3RydW5rL2RvY3MvZmF2aWNvbi5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxYmNmNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvZmF2aWNvbi5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvSkRKRWRpdG9yc0Nob2ljZUF3YXJkLmpwZyBiL3RydW5rL2RvY3MvaW1hZ2VzL0pESkVkaXRvcnNDaG9pY2VBd2FyZC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjYjk5OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL0pESkVkaXRvcnNDaG9pY2VBd2FyZC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvYW50X2xvZ28uaWNvIGIvdHJ1bmsvZG9jcy9pbWFnZXMvYW50X2xvZ28uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmMyNTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2ltYWdlcy9hbnRfbG9nby5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmIGIvdHJ1bmsvZG9jcy9pbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OTM2M2IKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2ltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvYW50X2xvZ29fbWVkaXVtLmdpZiBiL3RydW5rL2RvY3MvaW1hZ2VzL2FudF9sb2dvX21lZGl1bS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiYzA3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL2FudF9sb2dvX21lZGl1bS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvYW50X2xvZ29fc21hbGwuZ2lmIGIvdHJ1bmsvZG9jcy9pbWFnZXMvYW50X2xvZ29fc21hbGwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDgwYzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2ltYWdlcy9hbnRfbG9nb19zbWFsbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvYmV0YS5wbmcgYi90cnVuay9kb2NzL2ltYWdlcy9iZXRhLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjRhNzVkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9pbWFnZXMvYmV0YS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvY3VycmVudC5naWYgYi90cnVuay9kb2NzL2ltYWdlcy9jdXJyZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjBmNjRmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9pbWFnZXMvY3VycmVudC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvZ3JvdXAtbG9nby5naWYgYi90cnVuay9kb2NzL2ltYWdlcy9ncm91cC1sb2dvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTU3ZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9pbWFnZXMvZ3JvdXAtbG9nby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvanBfcmN3aW5uZXJfMjAwMy5naWYgYi90cnVuay9kb2NzL2ltYWdlcy9qcF9yY3dpbm5lcl8yMDAzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2Q4MzEzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9pbWFnZXMvanBfcmN3aW5uZXJfMjAwMy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvandfZWNfbG9nb193aW5uZXIyMDAyLmdpZiBiL3RydW5rL2RvY3MvaW1hZ2VzL2p3X2VjX2xvZ29fd2lubmVyMjAwMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0YjExNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL2p3X2VjX2xvZ29fd2lubmVyMjAwMi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvandfZWNfbG9nb193aW5uZXIyMDAzLmdpZiBiL3RydW5rL2RvY3MvaW1hZ2VzL2p3X2VjX2xvZ29fd2lubmVyMjAwMy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiYjQyMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL2p3X2VjX2xvZ29fd2lubmVyMjAwMy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvbGFiZWwuZ2lmIGIvdHJ1bmsvZG9jcy9pbWFnZXMvbGFiZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGNiNTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2ltYWdlcy9sYWJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvbWVudS1sZWZ0LmdpZiBiL3RydW5rL2RvY3MvaW1hZ2VzL21lbnUtbGVmdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhOTA0NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL21lbnUtbGVmdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvbWVudS1yaWdodC5naWYgYi90cnVuay9kb2NzL2ltYWdlcy9tZW51LXJpZ2h0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzljMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9pbWFnZXMvbWVudS1yaWdodC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvcGFnZS5naWYgYi90cnVuay9kb2NzL2ltYWdlcy9wYWdlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGIzOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9pbWFnZXMvcGFnZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvcHJpbnRlci5naWYgYi90cnVuay9kb2NzL2ltYWdlcy9wcmludGVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDIxMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9pbWFnZXMvcHJpbnRlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiBiL3RydW5rL2RvY3MvaW1hZ2VzL3Byb2plY3QtbG9nby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5Y2Q3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL3Byb2plY3QtbG9nby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvc2RtX3Byb2R1Y3Rpdml0eV9hd2FyZC5naWYgYi90cnVuay9kb2NzL2ltYWdlcy9zZG1fcHJvZHVjdGl2aXR5X2F3YXJkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDc2YWEwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9pbWFnZXMvc2RtX3Byb2R1Y3Rpdml0eV9hd2FyZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIGIvdHJ1bmsvZG9jcy9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjA0NDYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiBiL3RydW5rL2RvY3MvaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwNTU3MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvc3BhY2VyLmdpZiBiL3RydW5rL2RvY3MvaW1hZ2VzL3NwYWNlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkNDJlOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL3NwYWNlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvdGFiLWxlZnQuZ2lmIGIvdHJ1bmsvZG9jcy9pbWFnZXMvdGFiLWxlZnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZmQ3NTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2ltYWdlcy90YWItbGVmdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvdGFiLXJpZ2h0LmdpZiBiL3RydW5rL2RvY3MvaW1hZ2VzL3RhYi1yaWdodC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwM2E4NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL3RhYi1yaWdodC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIGIvdHJ1bmsvZG9jcy9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YWJjNGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2ltYWdlcy90YWJTZWwtbGVmdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiBiL3RydW5rL2RvY3MvaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxZjc0YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9pbmRleC5odG1sIGIvdHJ1bmsvZG9jcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGI4YzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNDIgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIFdlbGNvbWU8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IkNvbm9yIE1hY05laWxsIj4KKyAgPG1ldGEgbmFtZT0iZW1haWwiIGNvbnRlbnQ9IiI+CisgICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iU3RlZmFuIEJvZGV3aWciPgorICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0ic3RlZmFuLmJvZGV3aWdAZnJlZW5ldC5kZSI+CisgICAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxwIGNsYXNzPSJuYXZwYXRoIj4KKyAgICAgICAgPHNjcmlwdCBzcmM9Ii4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIuL2ltYWdlcy9wcm9qZWN0LWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlYXJjaCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IiM0QzZDOEYiPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGltZyBoZWlnaHQ9IjEwIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InNlYXJjaGNhcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJxIiB0eXBlPSJoaWRkZW4iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJTZWFyY2giIHZhbHVlPSJTZWFyY2giIHR5cGU9InN1Ym1pdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgICAgICAgICAgIHRoZSBBcGFjaGUgQW50IHNpdGUKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiI+CisgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iIzRDNkM4RiI+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPkhvbWU8L2I+PC9mb250PjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ibm9uIHNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS40ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuL3Byb2plY3RzL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPlByb2plY3RzPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsdWViYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ibWVudWNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+QXBhY2hlIEFudAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VsIj5XZWxjb21lPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xpY2Vuc2UuaHRtbCI+TGljZW5zZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2FudG5ld3MuaHRtbCI+TmV3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2V4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9mYXEuaHRtbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvRnJvbnRQYWdlIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvYmxlbXMuaHRtbCI+SGF2aW5nIFByb2JsZW1zPzwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvd25sb2FkCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9zcmNkb3dubG9hZC5jZ2kiPlNvdXJjZSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+Q29udHJpYnV0aW5nCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFpbC5odG1sIj5NYWlsaW5nIExpc3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vc3ZuLmh0bWwiPlN1YnZlcnNpb24gUmVwb3NpdG9yaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbmlnaHRsaWVzLmh0bWwiPk5pZ2h0bHkgQnVpbGRzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnVncy5odG1sIj5CdWcgRGF0YWJhc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5TcG9uc29yc2hpcAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCI+VGhhbmtzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiPlNwb25zb3JzaGlwPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2NvbnRyaWJ1dGluZy5odG1sIj5Eb25hdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0IE1hbmFnZW1lbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9jb250cmlidXRvcnMuaHRtbCI+Q29udHJpYnV0b3JzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWlzc2lvbi5odG1sIj5BcGFjaGUgQW50IE1pc3Npb248L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9ieWxhd3MuaHRtbCI+UHJvamVjdCBCeWxhd3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9sZWdhbC5odG1sIj5MZWdhbDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8Y2VudGVyPgorICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIvYWRzL2J1dHRvbmJhci5odG1sIiAtLT4KKyAgICA8L2NlbnRlcj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogbGVmdCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+V2VsY29tZTwvaDE+CisgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQXBhY2hlIEl2eSBpcyBhbiBBbnQgU3ViLVByb2plY3QgTm93ISI+PC9hPgorICAgICAgQXBhY2hlIEl2eSBpcyBhbiBBbnQgU3ViLVByb2plY3QgTm93IQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+T2N0b2JlciAxMSwgMjAwNyAtIEFwYWNoZSBJdnkgaXMgYW4gQW50IFN1Yi1Qcm9qZWN0IE5vdyE8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcGFjaGUgSXZ5LCAiQSBKYXZhIGJhc2VkIHRvb2wgZm9yIHRyYWNraW5nLCByZXNvbHZpbmcgYW5kCisgICAgbWFuYWdpbmcgcHJvamVjdCBkZXBlbmRlbmNpZXMuIiwganVzdCBmaW5pc2hlZCA8YSBocmVmPSJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvIj5JbmN1YmF0aW9uPC9hPiBhbmQgaGFzIGpvaW5lZAorICAgIHRoZSBBbnQgcHJvamVjdC4gIE1vcmUgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgQW50CisgICAgc2l0ZSBzb29uLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VW50aWwgd2UndmUgZmluaXNoZWQgdGhlIG1pZ3JhdGlvbiwgeW91IGNhbiBsZWFybiBtb3JlIGFib3V0CisgICAgSXZ5IGZyb20gaXRzIDxhIGhyZWY9Imh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZy9pdnkvIj5JbmN1YmF0b3IKKyAgICB3ZWJzaXRlPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQW50IDEuNy4wIj48L2E+CisgICAgICBBbnQgMS43LjAKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkRlY2VtYmVyIDE5LCAyMDA2IC0gQW50IDEuNy4wIEF2YWlsYWJsZTwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwYWNoZSBBbnQgMS43LjAgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+ZG93bmxvYWQ8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50IDEuNyBpbnRyb2R1Y2VzIGEgcmVzb3VyY2UgZnJhbWV3b3JrLiBTb21lIG9mIHRoZSBjb3JlIGFudCAKKyAgICB0YXNrcyBzdWNoIGFzICZsdDtjb3B5LyZndDsgYXJlIG5vdyBhYmxlIHRvIHByb2Nlc3Mgbm90IG9ubHkgZmlsZSAKKyAgICBzeXN0ZW0gcmVzb3VyY2VzIGJ1dCBhbHNvIHppcCBlbnRyaWVzLCB0YXIgZW50cmllcywgcGF0aHMsIC4uLiAKKyAgICBSZXNvdXJjZSBjb2xsZWN0aW9ucyBncm91cCByZXNvdXJjZXMsIGFuZCBjYW4gYmUgZnVydGhlciAKKyAgICBjb21iaW5lZCB3aXRoIG9wZXJhdG9ycyBzdWNoIGFzIHVuaW9uIGFuZCBpbnRlcnNlY3Rpb24uIFRoaXMgCisgICAgY2FuIGJlIGV4dGVuZGVkIGJ5IGN1c3RvbSByZXNvdXJjZXMgYW5kIGN1c3RvbSB0YXNrcyB1c2luZyByZXNvdXJjZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICBBbnQgMS43IHN0YXJ0cyBvdXRzb3VyY2luZyBvZiBvcHRpb25hbCB0YXNrcyB0byBBbnRsaWJzLiAKKyAgICBUaGUgLk5FVCBhbnRsaWIgaW4gcHJlcGFyYXRpb24gd2lsbCByZXBsYWNlIHRoZSAuTkVUIG9wdGlvbmFsIHRhc2tzIHdoaWNoIHNoaXAgaW4gQW50LgorICAgIFN1cHBvcnQgZm9yIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIFN1YnZlcnNpb24gd2lsbCBiZSBvbmx5IHByb3ZpZGVkIGFzIGFuIGFudGxpYiB0bworICAgIGJlIHJlbGVhc2VkIHNob3J0bHkuIAorICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50IDEuNyBmaXhlcyBhbHNvIGEgbGFyZ2UgbnVtYmVyIG9mIGJ1Z3MuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnQgMS43IGhhcyBzb21lIGluaXRpYWwgc3VwcG9ydCBmb3IgSmF2YTYgZmVhdHVyZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFudFVuaXQgMS4wIj48L2E+CisgICAgICBBbnRVbml0IDEuMAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+SmFudWFyeSA4LCAyMDA3IC0gQXBhY2hlIEFudFVuaXQgMS4wIEF2YWlsYWJsZTwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwYWNoZSBBbnRVbml0IDEuMCBpcyBub3cgYXZhaWxhYmxlIGZvciA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPmRvd25sb2FkPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgQW50IExpYnJhcnkgY29udGFpbnMgdGFza3MgdG8gdGVzdCBBbnQgdGFza3MgdXNpbmcgQW50CisgICAgaW5zdGVhZCBvZiBKVW5pdC4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgPGEgaHJlZj0iYW50bGlicy9hbnR1bml0LyI+QW50VW5pdCBob21lIHBhZ2U8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSIuTkVUIEFudCBMaWJyYXJ5IDEuMCI+PC9hPgorICAgICAgLk5FVCBBbnQgTGlicmFyeSAxLjAKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzPk5vdmVtYmVyIDYsIDIwMDYgLSBBcGFjaGUgLk5FVCBBbnQgTGlicmFyeSAxLjAgQXZhaWxhYmxlPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBhY2hlIC5ORVQgQW50IExpYnJhcnkgMS4wIGlzIG5vdyBhdmFpbGFibGUgZm9yIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaSI+ZG93bmxvYWQ8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBBbnQgTGlicmFyeSBjb250YWlucyBzdXBwb3J0IGZvciB0b29scyBsaWtlIE5Vbml0IGFzIHdlbGwKKyAgICBhcyB0aGUgIm9sZCAuTkVUIHRhc2tzIG9mIEFudCdzIGNvcmUuICBJdCBoYXMgYmVlbiB0ZXN0ZWQKKyAgICBNaWNyb3NvZnQncyBmcmFtZXdvcmtzIGFzIHdlbGwgYXMgTW9uby48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgPGEgaHJlZj0iYW50bGlicy9kb3RuZXQvIj5BbnRsaWIncworICAgIGhvbWUgcGFnZTwvYT48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQXBhY2hlIEFudCI+PC9hPgorICAgICAgQXBhY2hlIEFudAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KK0FwYWNoZSBBbnQgaXMgYSBKYXZhLWJhc2VkIGJ1aWxkIHRvb2wuIEluIHRoZW9yeSwgaXQgaXMga2luZCBvZiBsaWtlCitNYWtlLCBidXQgd2l0aG91dCBNYWtlJ3Mgd3JpbmtsZXMuCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorV2h5IGFub3RoZXIgYnVpbGQgdG9vbCB3aGVuIHRoZXJlIGlzIGFscmVhZHkgPGVtPm1ha2U8L2VtPiwgPGVtPmdudW1ha2U8L2VtPiwKKzxlbT5ubWFrZTwvZW0+LCA8ZW0+amFtPC9lbT4sIGFuZAorb3RoZXJzPyBCZWNhdXNlIGFsbCB0aG9zZSB0b29scyBoYXZlIGxpbWl0YXRpb25zIHRoYXQgQW50J3Mgb3JpZ2luYWwgYXV0aG9yCitjb3VsZG4ndCBsaXZlIHdpdGggd2hlbiBkZXZlbG9waW5nIHNvZnR3YXJlIGFjcm9zcyBtdWx0aXBsZSBwbGF0Zm9ybXMuIE1ha2UtbGlrZQordG9vbHMgYXJlIGluaGVyZW50bHkgc2hlbGwtYmFzZWQgLS0gdGhleSBldmFsdWF0ZSBhIHNldCBvZiBkZXBlbmRlbmNpZXMsIHRoZW4KK2V4ZWN1dGUgY29tbWFuZHMgbm90IHVubGlrZSB3aGF0IHlvdSB3b3VsZCBpc3N1ZSBpbiBhIHNoZWxsLiBUaGlzIG1lYW5zIHRoYXQgeW91CitjYW4gZWFzaWx5IGV4dGVuZCB0aGVzZSB0b29scyBieSB1c2luZyBvciB3cml0aW5nIGFueSBwcm9ncmFtIGZvciB0aGUgT1MgdGhhdAoreW91IGFyZSB3b3JraW5nIG9uLiBIb3dldmVyLCB0aGlzIGFsc28gbWVhbnMgdGhhdCB5b3UgbGltaXQgeW91cnNlbGYgdG8gdGhlIE9TLAorb3IgYXQgbGVhc3QgdGhlIE9TIHR5cGUgc3VjaCBhcyBVbml4LCB0aGF0IHlvdSBhcmUgd29ya2luZyBvbi4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CitNYWtlZmlsZXMgYXJlIGluaGVyZW50bHkgZXZpbCBhcyB3ZWxsLiBBbnlib2R5IHdobyBoYXMgd29ya2VkIG9uIHRoZW0gZm9yIGFueQordGltZSBoYXMgcnVuIGludG8gdGhlIGRyZWFkZWQgdGFiIHByb2JsZW0uICJJcyBteSBjb21tYW5kIG5vdCBleGVjdXRpbmcKK2JlY2F1c2UgSSBoYXZlIGEgc3BhY2UgaW4gZnJvbnQgb2YgbXkgdGFiISEhIiBzYWlkIHRoZSBvcmlnaW5hbCBhdXRob3Igb2YKK0FudCB3YXkgdG9vIG1hbnkgdGltZXMuIFRvb2xzIGxpa2UgSmFtIHRvb2sgY2FyZSBvZiB0aGlzIHRvIGEgZ3JlYXQgZGVncmVlLCBidXQKK3N0aWxsIGhhdmUgeWV0IGFub3RoZXIgZm9ybWF0IHRvIHVzZSBhbmQgcmVtZW1iZXIuCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorQW50IGlzIGRpZmZlcmVudC4gSW5zdGVhZCBvZiBhIG1vZGVsIHdoZXJlIGl0IGlzIGV4dGVuZGVkIHdpdGggc2hlbGwtYmFzZWQKK2NvbW1hbmRzLCBBbnQgaXMgZXh0ZW5kZWQgdXNpbmcgSmF2YSBjbGFzc2VzLiBJbnN0ZWFkIG9mIHdyaXRpbmcgc2hlbGwgY29tbWFuZHMsCit0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgWE1MLWJhc2VkLCBjYWxsaW5nIG91dCBhIHRhcmdldCB0cmVlIHdoZXJlIHZhcmlvdXMKK3Rhc2tzIGdldCBleGVjdXRlZC4gRWFjaCB0YXNrIGlzIHJ1biBieSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgcGFydGljdWxhcgorVGFzayBpbnRlcmZhY2UuCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorR3JhbnRlZCwgdGhpcyByZW1vdmVzIHNvbWUgb2YgdGhlIGV4cHJlc3NpdmUgcG93ZXIgdGhhdCBpcyBpbmhlcmVudCBieSBiZWluZworYWJsZSB0byBjb25zdHJ1Y3QgYSBzaGVsbCBjb21tYW5kIHN1Y2ggYXMKKzxjb2RlPmBmaW5kIC4gLW5hbWUgZm9vIC1leGVjIHJtIHt9YDwvY29kZT4sIGJ1dCBpdAorZ2l2ZXMgeW91IHRoZSBhYmlsaXR5IHRvIGJlIGNyb3NzIHBsYXRmb3JtIC0tIHRvIHdvcmsgYW55d2hlcmUgYW5kIGV2ZXJ5d2hlcmUuCitBbmQgaGV5LCBpZiB5b3UgcmVhbGx5IG5lZWQgdG8gZXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQsIEFudCBoYXMgYW4KKzxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gdGFzayB0aGF0CithbGxvd3MgZGlmZmVyZW50IGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIGJhc2VkIG9uIHRoZSBPUyB0aGF0IGl0IGlzIGV4ZWN1dGluZworb24uCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iRG9jdW1lbnRhdGlvbiI+PC9hPgorICAgICAgRG9jdW1lbnRhdGlvbgorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KK1lvdSBjYW4gdmlldyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgcmVsZWFzZSAoQXBhY2hlIEFudCAxLjcuMCkKKzxhIGhyZWY9Im1hbnVhbC9pbmRleC5odG1sIj5vbmxpbmU8L2E+Cis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorQ29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uIGlzIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgYW5kIGJpbmFyeSBkaXN0cmlidXRpb25zLgorPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkdldCBJbnZvbHZlZCI+PC9hPgorICAgICAgR2V0IEludm9sdmVkCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKzxsaT48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2dldGludm9sdmVkL2dldGludm9sdmVkaW5kZXguaHRtbCI+R2V0IEludm9sdmVkPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0ibWFpbC5odG1sIj5Kb2luIE1haWxpbmcgTGlzdHM8L2E+PC9saT4KKzxsaT48YSBocmVmPSJodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWFudC1kZXYmYW1wO3I9MSZhbXA7dz0yIj5TZWFyY2ggdGhlIERldiBNYWlsaW5nIExpc3Q8L2E+Cis8L2xpPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YW50LXVzZXImYW1wO3I9MSZhbXA7dz0yIj5TZWFyY2ggdGhlIFVzZXIgTWFpbGluZyBMaXN0PC9hPgorPC9saT4KKzwvdWw+CisgICAgICAgICAgICAgICAgCisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgICAgICAgIDxwIGNsYXNzPSJjb3B5cmlnaHQiPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhLS0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC53cml0ZSgiIC0gIisiTGFzdCBQdWJsaXNoZWQ6ICIgKyBkb2N1bWVudC5sYXN0TW9kaWZpZWQpOworICAgICAgICAgICAgICAvLyAgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9wPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbGVnYWwuaHRtbCBiL3RydW5rL2RvY3MvbGVnYWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTI5MGFmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9sZWdhbC5odG1sCkBAIC0wLDAgKzEsMjM4IEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBMZWdhbDwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAgICAgICAgIDxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iSm9uIFMuIFN0ZXZlbnMiPgorICA8bWV0YSBuYW1lPSJlbWFpbCIgY29udGVudD0iam9uQGxhdGNoa2V5LmNvbSI+CisgICAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxwIGNsYXNzPSJuYXZwYXRoIj4KKyAgICAgICAgPHNjcmlwdCBzcmM9Ii4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIuL2ltYWdlcy9wcm9qZWN0LWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlYXJjaCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IiM0QzZDOEYiPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGltZyBoZWlnaHQ9IjEwIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InNlYXJjaGNhcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJxIiB0eXBlPSJoaWRkZW4iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJTZWFyY2giIHZhbHVlPSJTZWFyY2giIHR5cGU9InN1Ym1pdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgICAgICAgICAgIHRoZSBBcGFjaGUgQW50IHNpdGUKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiI+CisgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iIzRDNkM4RiI+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPkhvbWU8L2I+PC9mb250PjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ibm9uIHNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS40ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuL3Byb2plY3RzL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPlByb2plY3RzPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsdWViYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ibWVudWNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+QXBhY2hlIEFudAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2luZGV4Lmh0bWwiPldlbGNvbWU8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9saWNlbnNlLmh0bWwiPkxpY2Vuc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9hbnRuZXdzLmh0bWwiPk5ld3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb2N1bWVudGF0aW9uCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFudWFsL2luZGV4Lmh0bWwiPk1hbnVhbDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2plY3RzLmh0bWwiPlJlbGF0ZWQgUHJvamVjdHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9leHRlcm5hbC5odG1sIj5FeHRlcm5hbCBUb29scyBhbmQgVGFza3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9yZXNvdXJjZXMuaHRtbCI+UmVzb3VyY2VzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vZmFxLmh0bWwiPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvYW50L0Zyb250UGFnZSI+V2lraTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2JsZW1zLmh0bWwiPkhhdmluZyBQcm9ibGVtcz88L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb3dubG9hZAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYmluZG93bmxvYWQuY2dpIj5CaW5hcnkgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkNvbnRyaWJ1dGluZworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21haWwuaHRtbCI+TWFpbGluZyBMaXN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3N2bi5odG1sIj5TdWJ2ZXJzaW9uIFJlcG9zaXRvcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL25pZ2h0bGllcy5odG1sIj5OaWdodGx5IEJ1aWxkczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J1Z3MuaHRtbCI+QnVnIERhdGFiYXNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+U3BvbnNvcnNoaXAKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiPlRoYW5rczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIj5TcG9uc29yc2hpcDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCI+RG9uYXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdCBNYW5hZ2VtZW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vY29udHJpYnV0b3JzLmh0bWwiPkNvbnRyaWJ1dG9yczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21pc3Npb24uaHRtbCI+QXBhY2hlIEFudCBNaXNzaW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnlsYXdzLmh0bWwiPlByb2plY3QgQnlsYXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZWwiPkxlZ2FsPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8Y2VudGVyPgorICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIvYWRzL2J1dHRvbmJhci5odG1sIiAtLT4KKyAgICA8L2NlbnRlcj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogbGVmdCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+TGVnYWw8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkxlZ2FsIFN0dWZmIFRoZXkgTWFrZSBVcyBTYXkiPjwvYT4KKyAgICAgIExlZ2FsIFN0dWZmIFRoZXkgTWFrZSBVcyBTYXkKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QWxsIG1hdGVyaWFsIG9uIHRoaXMgd2Vic2l0ZSBpcyBDb3B5cmlnaHQgqSAxOTk5LTIwMDgsCisgICAgICBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5TdW4sIFN1biBNaWNyb3N5c3RlbXMsIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgV2ViCisgICAgICBEZXZlbG9wbWVudCBLaXQsIGFuZCBKYXZhU2VydmVyIFBhZ2VzIGFyZSB0cmFkZW1hcmtzIG9yCisgICAgICByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBVTklYIGlzIGEKKyAgICAgIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZCBvdGhlciBjb3VudHJpZXMsCisgICAgICBleGNsdXNpdmVseSBsaWNlbnNlZCB0aHJvdWdoIFgvT3BlbiBDb21wYW55LCBMdGQuICBXaW5kb3dzLAorICAgICAgV2luZG93c05ULCBhbmQgV2luMzIgYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBNaWNyb3NvZnQKKyAgICAgIENvcnAuIEFsbCBvdGhlciBwcm9kdWN0IG5hbWVzIG1lbnRpb25lZCBoZXJlaW4gYW5kIHRocm91Z2hvdXQKKyAgICAgIHRoZSBlbnRpcmUgd2ViIHNpdGUgYXJlIHRyYWRlbWFya3Mgb2YgdGhlaXIgcmVzcGVjdGl2ZQorICAgICAgb3duZXJzLjwvcD4KKyAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9saWNlbnNlLmh0bWwgYi90cnVuay9kb2NzL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFlMmZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw1MTIgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIExpY2Vuc2U8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiI+CisgIDxtZXRhIG5hbWU9ImVtYWlsIiBjb250ZW50PSIiPgorICAgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CisgICAgICAgIDxzY3JpcHQgc3JjPSIuL2JyZWFkY3J1bWJzLmpzIiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICAgIDwvcD4KKworICAgICAgPGRpdiBjbGFzcz0ibG9nb2JhciI+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBib3JkZXI9IjAiIGFsdD0iQXBhY2hlIEFudCBzaXRlIiBzcmM9Ii4vaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj48aW1nIGFsdD0iQXBhY2hlIEFudCBsb2dvIiBib3JkZXI9IjAiIHNyYz0iLi9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgb25zdWJtaXQ9InEudmFsdWUgPSBxdWVyeS52YWx1ZSArICcgc2l0ZTphbnQuYXBhY2hlLm9yZyciIGFjdGlvbj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWFyY2giIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSIjNEM2QzhGIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPjxpbWcgaGVpZ2h0PSIxMCIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJzZWFyY2hjYXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc2l6ZT0iMTUiIGlkPSJxdWVyeSIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICB0aGUgQXBhY2hlIEFudCBzaXRlCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgorICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0idGFiIGJhciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiM0QzZDOEYiPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj48Yj5Ib21lPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNSI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI4IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9Im5vbiBzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNGVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iI0IyQzRFMCI+PGEgaHJlZj0iLi9wcm9qZWN0cy9pbmRleC5odG1sIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj5Qcm9qZWN0czwvZm9udD48L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkFwYWNoZSBBbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9pbmRleC5odG1sIj5XZWxjb21lPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZWwiPkxpY2Vuc2U8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYW50bmV3cy5odG1sIj5OZXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG9jdW1lbnRhdGlvbgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21hbnVhbC9pbmRleC5odG1sIj5NYW51YWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9wcm9qZWN0cy5odG1sIj5SZWxhdGVkIFByb2plY3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vZXh0ZXJuYWwuaHRtbCI+RXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcmVzb3VyY2VzLmh0bWwiPlJlc291cmNlczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2ZhcS5odG1sIj5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2FudC9Gcm9udFBhZ2UiPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9wcm9ibGVtcy5odG1sIj5IYXZpbmcgUHJvYmxlbXM/PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG93bmxvYWQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL3NyY2Rvd25sb2FkLmNnaSI+U291cmNlIERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Db250cmlidXRpbmcKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYWlsLmh0bWwiPk1haWxpbmcgTGlzdHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9zdm4uaHRtbCI+U3VidmVyc2lvbiBSZXBvc2l0b3JpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9uaWdodGxpZXMuaHRtbCI+TmlnaHRseSBCdWlsZHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9idWdzLmh0bWwiPkJ1ZyBEYXRhYmFzZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlNwb25zb3JzaGlwCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIj5UaGFua3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCI+U3BvbnNvcnNoaXA8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vY29udHJpYnV0aW5nLmh0bWwiPkRvbmF0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlByb2plY3QgTWFuYWdlbWVudAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2NvbnRyaWJ1dG9ycy5odG1sIj5Db250cmlidXRvcnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9taXNzaW9uLmh0bWwiPkFwYWNoZSBBbnQgTWlzc2lvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J5bGF3cy5odG1sIj5Qcm9qZWN0IEJ5bGF3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xlZ2FsLmh0bWwiPkxlZ2FsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxjZW50ZXI+CisgICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9hZHMvYnV0dG9uYmFyLmh0bWwiIC0tPgorICAgIDwvY2VudGVyPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiBsZWZ0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvbWVudS1sZWZ0LmdpZiI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvbWVudS1yaWdodC5naWYiPgorICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImxpZ2h0Ymx1ZWJhciI+Jm5ic3A7PC9kaXY+CisgIDxkaXYgY2xhc3M9Im1haW4iPgorICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKyAgICA8aDEgY2xhc3M9InRpdGxlIj5MaWNlbnNlPC9oMT4KKyAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgVmVyc2lvbiAyLjAiPjwvYT4KKyAgICAgIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSBWZXJzaW9uIDIuMAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgVmVyc2lvbiAyLjAgYXBwbGllcyAKKyAgICB0byBhbGwgcmVsZWFzZXMgb2YgQW50IHN0YXJ0aW5nIHdpdGggYW50IDEuNi4xPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4vKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKyAqCisgKiAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorICoKKyAqICAgMS4gRGVmaW5pdGlvbnMuCisgKgorICogICAgICAmcXVvdDtMaWNlbnNlJnF1b3Q7IHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAqICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisgKgorICogICAgICAmcXVvdDtMaWNlbnNvciZxdW90OyBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorICoKKyAqICAgICAgJnF1b3Q7TGVnYWwgRW50aXR5JnF1b3Q7IHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAqICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICogICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICogICAgICAmcXVvdDtjb250cm9sJnF1b3Q7IG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgKiAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgKiAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICogICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorICoKKyAqICAgICAgJnF1b3Q7WW91JnF1b3Q7IChvciAmcXVvdDtZb3VyJnF1b3Q7KSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgKiAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisgKgorICogICAgICAmcXVvdDtTb3VyY2UmcXVvdDsgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgKiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAqICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAqCisgKiAgICAgICZxdW90O09iamVjdCZxdW90OyBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgKiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAqICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorICoKKyAqICAgICAgJnF1b3Q7V29yayZxdW90OyBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgKiAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAqICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgKiAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisgKgorICogICAgICAmcXVvdDtEZXJpdmF0aXZlIFdvcmtzJnF1b3Q7IHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICogICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgKiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAqICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAqICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgKiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAqICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKyAqCisgKiAgICAgICZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgKiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgKiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgJnF1b3Q7c3VibWl0dGVkJnF1b3Q7CisgKiAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAqICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAqICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAqICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAqICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgKiAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgKiAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICZxdW90O05vdCBhIENvbnRyaWJ1dGlvbi4mcXVvdDsKKyAqCisgKiAgICAgICZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAqICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisgKgorICogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAqICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgKiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisgKgorICogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAqICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAqICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgKiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgKiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgKiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAqICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAqICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAqICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAqICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAqICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKyAqCisgKiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAqICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorICoKKyAqICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgKiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgKiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorICoKKyAqICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgJnF1b3Q7Tk9USUNFJnF1b3Q7IHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICogICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICogICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgKiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAqICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICogICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAqICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAqICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICogICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICogICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgKiAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgKiAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICogICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAqICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICogICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgKiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisgKgorICogICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAqICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgKiAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICogICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAqICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKyAqCisgKiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAqICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgKiAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICogICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgKiAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgKiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKyAqCisgKiAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAqICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICogICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAqICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisgKgorICogICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAqICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICogICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsCisgKiAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICogICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICogICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgKiAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICogICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAqICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorICoKKyAqICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgKiAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICogICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICogICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICogICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgKiAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICogICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgKiAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAqICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAqICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICogICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgKiAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgKiAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgKiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgKiAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgKiAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgKiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAqICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgKiAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAqICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisgKgorICogICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKyAqCisgKiAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKyAqCisgKiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgKiAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICZxdW90O1tdJnF1b3Q7CisgKiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgKiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgKiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgKiAgICAgIHNhbWUgJnF1b3Q7cHJpbnRlZCBwYWdlJnF1b3Q7IGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAqICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorICoKKyAqICAgQ29weXJpZ2h0IFt5eXl5XSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICZxdW90O0xpY2Vuc2UmcXVvdDspOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAgICA8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WW91IGNhbiBkb3dubG9hZCB0aGUgb3JpZ2luYWwgbGljZW5zZSBmaWxlIDxhIGhyZWY9Ii4vTElDRU5TRSIgdGFyZ2V0PSJfbmV3Ij5oZXJlLjwvYT48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBMaWNlbnNlIGlzIGFjY29tcGFuaWVkIGJ5IGEgTk9USUNFPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgID09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgQW50IGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQorICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KKworICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGFsc28gc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IDoKKyAgICAgLSB0aGUgVzNDIGNvbnNvcnRpdW0gKGh0dHA6Ly93d3cudzNjLm9yZykgLAorICAgICAtIHRoZSBTQVggcHJvamVjdCAoaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZykKKworICAgUGxlYXNlIHJlYWQgdGhlIGRpZmZlcmVudCBMSUNFTlNFIGZpbGVzIHByZXNlbnQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mCisgICB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgVGhlIG5hbWVzICZxdW90O0FudCZxdW90OyBhbmQgICZxdW90O0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJnF1b3Q7ICBtdXN0IG5vdCBiZSB1c2VkIHRvCisgICBlbmRvcnNlICBvciBwcm9tb3RlICBwcm9kdWN0cyBkZXJpdmVkICBmcm9tIHRoaXMgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3IKKyAgIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAgIGFwYWNoZUBhcGFjaGUub3JnLgorPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSI+PC9hPgorICAgICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4gVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSwgYXBwbGllcyB0byBhbGwgdmVyc2lvbnMgb2YgdXAgdG8gYW50IDEuNi4wIGluY2x1ZGVkLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+LyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgICAgIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAorICogICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwKKyAqICAgIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhLQorICogdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2YgIHNvdXJjZSBjb2RlIG11c3QgIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmIGFueSwgbXVzdAorICogICAgaW5jbHVkZSAgdGhlIGZvbGxvd2luZyAgYWNrbm93bGVkZ21lbnQ6ICAmcXVvdDtUaGlzIHByb2R1Y3QgaW5jbHVkZXMgIHNvZnR3YXJlCisgKiAgICBkZXZlbG9wZWQgIGJ5IHRoZSAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4mcXVvdDsKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzICBhY2tub3dsZWRnbWVudCBtYXkgIGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLCAgaWYKKyAqICAgIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKiAKKyAqIDQuIFRoZSBuYW1lcyAmcXVvdDtBbnQmcXVvdDsgYW5kICAmcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90OyAgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSAgb3IgcHJvbW90ZSAgcHJvZHVjdHMgZGVyaXZlZCAgZnJvbSB0aGlzICBzb2Z0d2FyZSB3aXRob3V0ICBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCisgKiAKKyAqIDUuIFByb2R1Y3RzICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90ICBiZSBjYWxsZWQgJnF1b3Q7QXBhY2hlJnF1b3Q7LCBub3IgbWF5CisgKiAgICAmcXVvdDtBcGFjaGUmcXVvdDsgYXBwZWFyICBpbiB0aGVpciBuYW1lLCAgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gIG9mIHRoZQorICogICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyAqIEZJVE5FU1MgIEZPUiBBIFBBUlRJQ1VMQVIgIFBVUlBPU0UgQVJFICBESVNDTEFJTUVELiAgSU4gTk8gIEVWRU5UIFNIQUxMICBUSEUKKyAqIEFQQUNIRSBTT0ZUV0FSRSAgRk9VTkRBVElPTiAgT1IgSVRTIENPTlRSSUJVVE9SUyAgQkUgTElBQkxFIEZPUiAgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMICBEQU1BR0VTIChJTkNMVS0KKyAqIERJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqIE9GIFVTRSwgREFUQSwgT1IgIFBST0ZJVFM7IE9SIEJVU0lORVNTICBJTlRFUlJVUFRJT04pICBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSAgVEhFT1JZIE9GIExJQUJJTElUWSwgIFdIRVRIRVIgIElOIENPTlRSQUNULCAgU1RSSUNUIExJQUJJTElUWSwgIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgIE5FR0xJR0VOQ0UgT1IgIE9USEVSV0lTRSkgQVJJU0lORyBJTiAgQU5ZIFdBWSBPVVQgT0YgVEhFICBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgIGJ5IG1hbnkgaW5kaXZpZHVhbHMKKyAqIG9uIGJlaGFsZiBvZiB0aGUgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUgIGluZm9ybWF0aW9uICBvbiB0aGUgCisgKiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZSAmbHQ7aHR0cDovL3d3dy5hcGFjaGUub3JnLyZndDsuCisgKgorICovCis8L3ByZT4KKyAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYWlsLmh0bWwgYi90cnVuay9kb2NzL21haWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzg2N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYWlsLmh0bWwKQEAgLTAsMCArMSwzMzEgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIE1haWxpbmcgTGlzdHM8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IkFwYWNoZSBBbnQgUE1DIj4KKyAgPG1ldGEgbmFtZT0iZW1haWwiIGNvbnRlbnQ9IiI+CisgICAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxwIGNsYXNzPSJuYXZwYXRoIj4KKyAgICAgICAgPHNjcmlwdCBzcmM9Ii4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIuL2ltYWdlcy9wcm9qZWN0LWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlYXJjaCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IiM0QzZDOEYiPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGltZyBoZWlnaHQ9IjEwIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InNlYXJjaGNhcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJxIiB0eXBlPSJoaWRkZW4iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJTZWFyY2giIHZhbHVlPSJTZWFyY2giIHR5cGU9InN1Ym1pdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgICAgICAgICAgIHRoZSBBcGFjaGUgQW50IHNpdGUKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiI+CisgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iIzRDNkM4RiI+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPkhvbWU8L2I+PC9mb250PjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ibm9uIHNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS40ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuL3Byb2plY3RzL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPlByb2plY3RzPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsdWViYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ibWVudWNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+QXBhY2hlIEFudAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2luZGV4Lmh0bWwiPldlbGNvbWU8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9saWNlbnNlLmh0bWwiPkxpY2Vuc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9hbnRuZXdzLmh0bWwiPk5ld3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb2N1bWVudGF0aW9uCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFudWFsL2luZGV4Lmh0bWwiPk1hbnVhbDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2plY3RzLmh0bWwiPlJlbGF0ZWQgUHJvamVjdHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9leHRlcm5hbC5odG1sIj5FeHRlcm5hbCBUb29scyBhbmQgVGFza3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9yZXNvdXJjZXMuaHRtbCI+UmVzb3VyY2VzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vZmFxLmh0bWwiPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvYW50L0Zyb250UGFnZSI+V2lraTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2JsZW1zLmh0bWwiPkhhdmluZyBQcm9ibGVtcz88L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb3dubG9hZAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYmluZG93bmxvYWQuY2dpIj5CaW5hcnkgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkNvbnRyaWJ1dGluZworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VsIj5NYWlsaW5nIExpc3RzPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3N2bi5odG1sIj5TdWJ2ZXJzaW9uIFJlcG9zaXRvcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL25pZ2h0bGllcy5odG1sIj5OaWdodGx5IEJ1aWxkczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J1Z3MuaHRtbCI+QnVnIERhdGFiYXNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+U3BvbnNvcnNoaXAKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiPlRoYW5rczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIj5TcG9uc29yc2hpcDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCI+RG9uYXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdCBNYW5hZ2VtZW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vY29udHJpYnV0b3JzLmh0bWwiPkNvbnRyaWJ1dG9yczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21pc3Npb24uaHRtbCI+QXBhY2hlIEFudCBNaXNzaW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnlsYXdzLmh0bWwiPlByb2plY3QgQnlsYXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGVnYWwuaHRtbCI+TGVnYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPk1haWxpbmcgTGlzdHM8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9Ik1haWxpbmcgTGlzdHMiPjwvYT4KKyAgICAgIE1haWxpbmcgTGlzdHMKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGxlYXNlIHJlYWQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9tYWlsLmh0bWwiPmd1aWRlbGluZXMgb2YKKyAgICAgIHRoZSBKYWthcnRhIFByb2plY3Q8L2E+IGJlZm9yZSBzdWJzY3JpYmluZyBhbmQgcG9zdGluZyB0byBhbnkgb2YKKyAgICAgIHRoZSBsaXN0cyBiZWxvdy4gIFRoZXkgYXBwbHkgdG8gQW50J3MgbGlzdHMgYXMgd2VsbC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSB1c2VyIGFuZCBkZXYgbGlzdCBhcmUgc3Vic2NyaWJlciBvbmx5IGxpc3RzLCB0aGlzIG1lYW5zCisgICAgICB5b3UgaGF2ZSB0byBzdWJzY3JpYmUgYmVmb3JlIHlvdSBjYW4gcG9zdCB0byB0aGUgbGlzdC4gIFBsZWFzZQorICAgICAgbm90ZSB0aGF0IGFueSBIVE1MIHBhcnRzIHNlbnQgdG8gdGhlIGxpc3RzIHdpbGwgYmUgcmVtb3ZlZCBieSBvdXIKKyAgICAgIG1haWxpbmcgbGlzdCBzb2Z0d2FyZSAtIHlvdSBzaG91bGRuJ3QgYmUgc2VuZGluZyBIVE1MIG1haWxzCisgICAgICBhbnl3YXkuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UbyBzdWJzY3JpYmUgdG8gYSBtYWlsaW5nbGlzdCB1c2UgdGhlIGxpbmtzIGJlbG93LiBJbiB5b3VyIGZpcnN0IGVtYWlsIHlvdSB3aWxsIGdldCBzb21lCisgICAgICBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggdGhlIGxpc3QgbWFuYWdlciA8YSBocmVmPSJodHRwOi8vd3d3LmV6bWxtLm9yZy8iPkVaTUxNPC9hPi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlVzZXIgTGlzdDogdXNlckBhbnQuYXBhY2hlLm9yZyI+PC9hPgorICAgICAgICBVc2VyIExpc3Q6IHVzZXJAYW50LmFwYWNoZS5vcmcKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICA8Yj5NZWRpdW0gVHJhZmZpYzwvYj4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86dXNlci1zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmciPlN1YnNjcmliZTwvYT4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86dXNlci11bnN1YnNjcmliZUBhbnQuYXBhY2hlLm9yZyI+VW5zdWJzY3JpYmU8L2E+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9hbnQtdXNlci8iPkFTRiBBcmNoaXZlPC9hPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YW50LXVzZXImYW1wO3I9MSZhbXA7dz0yIj5UaGlyZCBQYXJ0eSBBcmNoaXZlPC9hPgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgbGlzdCBpcyBmb3IgZGV2ZWxvcGVycyB0aGF0IGFyZSB1c2luZyBBbnQgaW4gdGhlaXIgb3duCisgICAgICAgIHByb2plY3RzIHRvIGFzayBxdWVzdGlvbnMsIHNoYXJlIGtub3dsZWRnZSwgYW5kIGRpc2N1c3MgaXNzdWVzCisgICAgICAgIHJlbGF0ZWQgdG8gdXNpbmcgQW50IGFzIGEgYnVpbGQgdG9vbC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSXZ5IFVzZXIgTGlzdDogaXZ5LXVzZXJAYW50LmFwYWNoZS5vcmciPjwvYT4KKyAgICAgICAgSXZ5IFVzZXIgTGlzdDogaXZ5LXVzZXJAYW50LmFwYWNoZS5vcmcKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICA8Yj5NZWRpdW0gVHJhZmZpYzwvYj4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86aXZ5LXVzZXItc3Vic2NyaWJlQGFudC5hcGFjaGUub3JnIj5TdWJzY3JpYmU8L2E+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOml2eS11c2VyLXVuc3Vic2NyaWJlQGFudC5hcGFjaGUub3JnIj5VbnN1YnNjcmliZTwvYT4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2FudC1pdnktdXNlci8iPkFTRiBBcmNoaXZlPC9hPgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgbGlzdCBpcyBmb3IgZGV2ZWxvcGVycyB0aGF0IGFyZSB1c2luZyBJdnkgb3IgSXZ5REUgaW4KKyAgICAgICAgdGhlaXIgb3duIHByb2plY3RzIHRvIGFzayBxdWVzdGlvbnMsIHNoYXJlIGtub3dsZWRnZSwgYW5kCisgICAgICAgIGRpc2N1c3MgaXNzdWVzIHJlbGF0ZWQgdG8gdXNpbmcgSXZ5IHdpdGggb3Igd2l0aG91dCBBbnQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkRldmVsb3BlciBMaXN0OiBkZXZAYW50LmFwYWNoZS5vcmciPjwvYT4KKyAgICAgICAgRGV2ZWxvcGVyIExpc3Q6IGRldkBhbnQuYXBhY2hlLm9yZworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgIDxiPk1lZGl1bSBUcmFmZmljPC9iPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpkZXYtc3Vic2NyaWJlQGFudC5hcGFjaGUub3JnIj5TdWJzY3JpYmU8L2E+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmRldi11bnN1YnNjcmliZUBhbnQuYXBhY2hlLm9yZyI+VW5zdWJzY3JpYmU8L2E+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9hbnQtZGV2LyI+QVNGIEFyY2hpdmU8L2E+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1hbnQtZGV2JmFtcDtyPTEmYW1wO3c9MiI+VGhpcmQgUGFydHkgQXJjaGl2ZTwvYT4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGlzIHRoZSBsaXN0IHdoZXJlIHBhcnRpY2lwYXRpbmcgZGV2ZWxvcGVycyBvZiB0aGUgQW50CisgICAgICAgIGJ1aWxkIHRvb2wsIEl2eSBvciB0aGUgQW50IGxpYnJhcmllcyBkZXZlbG9wZWQgYnkgdGhlIEFudCB0ZWFtCisgICAgICAgIG1lZXQgYW5kIGRpc2N1c3MgaXNzdWVzLCBjb2RlIGNoYW5nZXMvYWRkaXRpb25zLCBldGMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Ik5vdGlmaWNhdGlvbnMgTGlzdDogbm90aWZpY2F0aW9uc0BhbnQuYXBhY2hlLm9yZyI+PC9hPgorICAgICAgICBOb3RpZmljYXRpb25zIExpc3Q6IG5vdGlmaWNhdGlvbnNAYW50LmFwYWNoZS5vcmcKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICA8Yj5NZWRpdW0gVHJhZmZpYzwvYj4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bm90aWZpY2F0aW9ucy1zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmciPlN1YnNjcmliZTwvYT4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bm90aWZpY2F0aW9ucy11bnN1YnNjcmliZUBhbnQuYXBhY2hlLm9yZyI+VW5zdWJzY3JpYmU8L2E+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9hbnQtbm90aWZpY2F0aW9ucy8iPkFTRiBBcmNoaXZlPC9hPgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlN1YnNjcmliZXJzIHRvIHRoaXMgbGlzdCBnZXQgbm90aWNlcyBvZiBlYWNoIGFuZCBldmVyeQorICAgICAgICBjb2RlIGNoYW5nZSwgYnVpbGQgcmVzdWx0cywgdGVzdGluZyBub3RpY2VzLCBldGMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkhvdyB0byB1bnN1YnNjcmliZSB5b3VyIG9sZCBlbWFpbCBhZGRyZXNzIj48L2E+CisgICAgICAgIEhvdyB0byB1bnN1YnNjcmliZSB5b3VyIG9sZCBlbWFpbCBhZGRyZXNzCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgIEZpcnN0LCBmaW5kIG91dCB0aGUgcGFydGljdWxhciBlbWFpbCBhZHJlc3MgdG8gd2hpY2ggZXptbG0gaXMgc2VuZGluZy4KKyAgICAgICAgVGhlIGVtYWlsIGhlYWRlcnMgYXJlIHZpc2libGUgaW4gTWljcm9zb2Z0IE91dGxvb2sgdmlhIHRoZSBtZXNzYWdlcyBtZW51CisgICAgICAgICJWaWV3IHwgT3B0aW9ucyIuCisgICAgICAgIDxwcmU+CisgICAgICAgIE1pY3Jvc29mdCBNYWlsIEludGVybmV0IEhlYWRlcnMgVmVyc2lvbiAyLjAKKyAgICAgICAgLi4uCisgICAgICAgIExpc3QtVW5zdWJzY3JpYmU6ICZsdDttYWlsdG86dXNlci11bnN1YnNjcmliZUBhbnQuYXBhY2hlLm9yZyZndDsKKyAgICAgICAgTGlzdC1IZWxwOiAmbHQ7bWFpbHRvOnVzZXItaGVscEBhbnQuYXBhY2hlLm9yZyZndDsKKyAgICAgICAgTGlzdC1Qb3N0OiAmbHQ7bWFpbHRvOnVzZXJAYW50LmFwYWNoZS5vcmcmZ3Q7CisgICAgICAgIExpc3QtSWQ6ICJBbnQgVXNlcnMgTGlzdCIgJmx0O3VzZXIuYW50LmFwYWNoZS5vcmcmZ3Q7CisgICAgICAgIFJlcGx5LVRvOiAiQW50IFVzZXJzIExpc3QiICZsdDt1c2VyQGFudC5hcGFjaGUub3JnJmd0OworICAgICAgICBEZWxpdmVyZWQtVG86IG1haWxpbmcgbGlzdCB1c2VyQGFudC5hcGFjaGUub3JnCisgICAgICAgIC4uLgorICAgICAgICBSZXR1cm4tUGF0aDogdXNlci1yZXR1cm4tMTIzNDUtPGk+am9obj1ob3N0LmRvbWFpbjwvaT5AYW50LmFwYWNoZS5vcmcKKyAgICAgICAgLi4uCisgICAgICAgIDwvcHJlPgorICAgICAgICBUaGUgPGk+UmV0dXJuLVBhdGg8L2k+IGhlYWRlciBjb250YWlucyB0aGUgZW1haWwgYWRkcmVzcyB3aGljaCBpcyBzdWJzY3JpYmVkLiAKKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4gVG8gc3RvcCBzdWJzY3JpcHRpb24gZm9yIHRoZSBhZGRyZXNzIGpvaG5AaG9zdC5kb21haW4gLCBzZW5kIGFuIGVtYWlsIHRvIDxwcmU+ZGV2LXVuc3Vic2NyaWJlLWpvaG49aG9zdC5kb21haW5AYW50LmFwYWNoZS5vcmc8L3ByZT4KKyAgICAgICAgICBvciB0byAgPHByZT51c2VyLXVuc3Vic2NyaWJlLWpvaG49aG9zdC5kb21haW5AYW50LmFwYWNoZS5vcmc8L3ByZT4uCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFyY2hpdmVzIj48L2E+CisgICAgICBBcmNoaXZlcworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGVzZSBsaXN0cyBhcmUgYXJjaGl2ZWQgYXQ8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC8iPkxpc3QgSW5kZXggb24gbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnPC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLyI+RnVsbCBtYm94IGFyY2hpdmVzIG9mIGFsbCBsaXN0czwvYT48L2xpPgorICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLyI+TWFpbGluZyBsaXN0IEFyY2hpdmVzPC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9uZXdzLmdtYW5lLm9yZy9nbWFuZS5jb21wLmpha2FydGEuYW50LmRldmVsLyI+QW50IERldmVsb3BlciBMaXN0IG9uIGdtYW5lPC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9uZXdzLmdtYW5lLm9yZy9nbWFuZS5jb21wLmpha2FydGEuYW50LnVzZXIvIj5BbnQgVXNlciBMaXN0IG9uIGdtYW5lPC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cubmFiYmxlLmNvbS9BbnQtLS1EZXYtZjEwOC5odG1sIj5BbnQgRGV2ZWxvcGVyIExpc3Qgb24gbmFiYmxlPC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cubmFiYmxlLmNvbS9BbnQtLS1Vc2Vycy1mMTA3Lmh0bWwiPkFudCBVc2VyIExpc3Qgb24gbmFiYmxlPC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9hbnQubWFya21haWwub3JnLyI+TWFpbGluZyBMaXN0IEFyY2hpdmUgYXQgTWFya01haWw8L2E+PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2FudC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2FudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjM1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvYW50Lmh0bWwKQEAgLTAsMCArMSwyOTcgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+QW50IFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImFudCI+QW50PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorCis8cD5SdW5zIEFudCBvbiBhIHN1cHBsaWVkIGJ1aWxkZmlsZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBidWlsZAorc3VicHJvamVjdHMuICA8c3Ryb25nPlRoaXMgdGFzayBtdXN0IG5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYQorPGNvZGU+dGFyZ2V0PC9jb2RlPiBpZiBpdCBpbnZva2VzIHRoZSBzYW1lIGJ1aWxkIGZpbGUgaXQgaXMgcGFydAorb2YuPC9zdHJvbmc+PC9wPgorCis8cD5XaGVuIHRoZSA8aT5hbnRmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgb21pdHRlZCwgdGhlIGZpbGUgJnF1b3Q7YnVpbGQueG1sJnF1b3Q7CitpbiB0aGUgc3VwcGxpZWQgZGlyZWN0b3J5ICg8aT5kaXI8L2k+IGF0dHJpYnV0ZSkgaXMgdXNlZC48L3A+Cis8cD5JZiBubyB0YXJnZXQgYXR0cmlidXRlIGlzIHN1cHBsaWVkLCB0aGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIG5ldyBwcm9qZWN0IGlzCit1c2VkLjwvcD4KKzxwPkJ5IGRlZmF1bHQsIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBwcm9qZWN0IHdpbGwgYmUKK2F2YWlsYWJsZSBpbiB0aGUgbmV3IHByb2plY3QuICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNldCB0aGUKKzxpPmluaGVyaXRBbGw8L2k+IGF0dHJpYnV0ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIG9ubHkKKyZxdW90O3VzZXImcXVvdDsgcHJvcGVydGllcyAoaS5lLiwgdGhvc2UgcGFzc2VkIG9uIHRoZSBjb21tYW5kLWxpbmUpCit3aWxsIGJlIHBhc3NlZCB0byB0aGUgbmV3IHByb2plY3QuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHNldCBvZgorcHJvcGVydGllcyBwYXNzZWQgdG8gdGhlIG5ldyBwcm9qZWN0IHdpbGwgb3ZlcnJpZGUgdGhlIHByb3BlcnRpZXMgdGhhdAorYXJlIHNldCBpbiB0aGUgbmV3IHByb2plY3QgKFNlZSBhbHNvIHRoZSA8YQoraHJlZj0icHJvcGVydHkuaHRtbCI+cHJvcGVydHkgdGFzazwvYT4pLjwvcD4KKworPHA+WW91IGNhbiBhbHNvIHNldCBwcm9wZXJ0aWVzIGluIHRoZSBuZXcgcHJvamVjdCBmcm9tIHRoZSBvbGQgcHJvamVjdAorYnkgdXNpbmcgbmVzdGVkIHByb3BlcnR5IHRhZ3MuIFRoZXNlIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBwYXNzZWQKK3RvIHRoZSBuZXcgcHJvamVjdCBhbmQgYW55IHByb2plY3QgY3JlYXRlZCBpbiB0aGF0IHByb2plY3QKK3JlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgPGk+aW5oZXJpdEFsbDwvaT4uICBUaGlzIGFsbG93cyB5b3UgdG8KK3BhcmFtZXRlcml6ZSB5b3VyIHN1YnByb2plY3RzLiAgUHJvcGVydGllcyBkZWZpbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUKK2Nhbm5vdCBiZSBvdmVycmlkZGVuIGJ5IG5lc3RlZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisKKzxwPlJlZmVyZW5jZXMgdG8gZGF0YSB0eXBlcyBjYW4gYWxzbyBiZSBwYXNzZWQgdG8gdGhlIG5ldyBwcm9qZWN0LCBidXQKK2J5IGRlZmF1bHQgdGhleSBhcmUgbm90LiAgSWYgeW91IHNldCB0aGUgaW5oZXJpdHJlZnMgYXR0cmlidXRlIHRvCit0cnVlLCBhbGwgcmVmZXJlbmNlcyB3aWxsIGJlIGNvcGllZCwgYnV0IHRoZXkgd2lsbCBub3Qgb3ZlcnJpZGUKK3JlZmVyZW5jZXMgZGVmaW5lZCBpbiB0aGUgbmV3IHByb2plY3QuPC9wPgorCis8cD5OZXN0ZWQgPGEgaHJlZj0iI3JlZmVyZW5jZSI+PGk+PGNvZGU+Jmx0O3JlZmVyZW5jZSZndDs8L2NvZGU+PC9pPjwvYT4gZWxlbWVudHMKK2NhbiBhbHNvIGJlIHVzZWQgdG8gY29weSByZWZlcmVuY2VzIGZyb20gdGhlIGNhbGxpbmcgcHJvamVjdCB0byB0aGUKK25ldyBwcm9qZWN0LCBvcHRpb25hbGx5IHVuZGVyIGEgZGlmZmVyZW50IGlkLiAgUmVmZXJlbmNlcyB0YWtlbiBmcm9tCituZXN0ZWQgZWxlbWVudHMgd2lsbCBvdmVycmlkZSBleGlzdGluZyByZWZlcmVuY2VzIHRoYXQgaGF2ZSBiZWVuCitkZWZpbmVkIG91dHNpZGUgb2YgdGFyZ2V0cyBpbiB0aGUgbmV3IHByb2plY3QgLSBidXQgbm90IHRob3NlIGRlZmluZWQKK2luc2lkZSBvZiB0YXJnZXRzLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YW50ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYnVpbGRmaWxlIHRvIHVzZS4gRGVmYXVsdHMgdG8KKyAgICAgICZxdW90O2J1aWxkLnhtbCZxdW90Oy4gIFRoaXMgZmlsZSBpcyBleHBlY3RlZCB0byBiZSBhIGZpbGVuYW1lCisgICAgICByZWxhdGl2ZSB0byB0aGUgZGlyIGF0dHJpYnV0ZSBnaXZlbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPgorICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IHRvIHVzZSBhcyBhIGJhc2VkaXIgZm9yIHRoZSBuZXcgQW50IHByb2plY3QuCisgICAgICBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBwcm9qZWN0J3MgYmFzZWRpciwgdW5sZXNzCisgICAgICBpbmhlcml0YWxsIGhhcyBiZWVuIHNldCB0byBmYWxzZSwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0CisgICAgICBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4gIFRoaXMgd2lsbCBvdmVycmlkZSB0aGUgYmFzZWRpcgorICAgICAgc2V0dGluZyBvZiB0aGUgY2FsbGVkIHByb2plY3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSB0YXJnZXQgb2YgdGhlIG5ldyBBbnQgcHJvamVjdCB0aGF0IHNob3VsZCBiZSBleGVjdXRlZC4KKyAgICAgIERlZmF1bHRzIHRvIHRoZSBuZXcgcHJvamVjdCdzIGRlZmF1bHQgdGFyZ2V0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5GaWxlbmFtZSB0byB3cml0ZSB0aGUgYW50IG91dHB1dCB0by4gIFRoaXMgaXMKKyAgICByZWxhdGl2ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGRpciBhdHRyaWJ1dGUgaWYgaXQgaGFzIGJlZW4gc2V0IG9yCisgICAgdG8gdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IHByb2plY3Qgb3RoZXJ3aXNlLgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluaGVyaXRBbGw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlCisgICAgICBuZXcgQW50IHByb2plY3QuICBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmhlcml0UmVmczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiA8Y29kZT50cnVlPC9jb2RlPiwgcGFzcyBhbGwgcmVmZXJlbmNlcyB0byB0aGUKKyAgICAgIG5ldyBBbnQgcHJvamVjdC4gIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND5wcm9wZXJ0eTwvaDQ+Cis8cD5TZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSA8YSBocmVmPSJwcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eQordGFzazwvYT4uIDxicj4KK1RoZXNlIHByb3BlcnRpZXMgYmVjb21lIGVxdWl2YWxlbnQgdG8gcHJvcGVydGllcyB5b3UgZGVmaW5lIG9uCit0aGUgY29tbWFuZCBsaW5lLiBUaGVzZSBhcmUgc3BlY2lhbCBwcm9wZXJ0aWVzIGFuZCB0aGV5IHdpbGwgYWx3YXlzIGdldCBwYXNzZWQKK2Rvd24sIGV2ZW4gdGhyb3VnaCBhZGRpdGlvbmFsIDxjb2RlPiZsdDsqYW50KiZndDs8L2NvZGU+IHRhc2tzIHdpdGggaW5oZXJpdGFsbCBzZXQgdG8KK2ZhbHNlIChzZWUgYWJvdmUpLiA8YnI+CitOb3RlIHRoYXQgdGhlIDxjb2RlPnJlZmlkPC9jb2RlPiBhdHRyaWJ1dGUgcG9pbnRzIHRvIGEKK3JlZmVyZW5jZSBpbiB0aGUgY2FsbGluZyBwcm9qZWN0LCBub3QgaW4gdGhlIG5ldyBvbmUuPC9wPgorCis8aDQ+PGEgbmFtZT0icmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+PC9oND4KKzxwPlVzZWQgdG8gY2hvb3NlIHJlZmVyZW5jZXMgdGhhdCBzaGFsbCBiZSBjb3BpZWQgaW50byB0aGUgbmV3IHByb2plY3QsCitvcHRpb25hbGx5IGNoYW5naW5nIHRoZWlyIGlkLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmaWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGlkIG9mIHRoZSByZWZlcmVuY2UgaW4gdGhlIGNhbGxpbmcgcHJvamVjdC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9yZWZpZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgaWQgb2YgdGhlIHJlZmVyZW5jZSBpbiB0aGUgbmV3IHByb2plY3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgcmVmaWQuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5wcm9wZXJ0eXNldDwvaDQ+CisKKzxwPllvdSBjYW4gc3BlY2lmeSBhIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBuZXcKK3Byb2plY3Qgd2l0aCA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL3Byb3BlcnR5c2V0Lmh0bWwiPnByb3BlcnR5c2V0PC9hPnMuPC9wPgorCis8cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvcD4KKworPGg0PnRhcmdldDwvaDQ+CisKKzxwPllvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB0YXJnZXRzIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7dGFyZ2V0Jmd0OzwvY29kZT4gZWxlbWVudHMKK2luc3RlYWQgb2YgdXNpbmcgdGhlIHRhcmdldCBhdHRyaWJ1dGUuICBUaGVzZSB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlmCitBbnQgaGFkIGJlZW4gaW52b2tlZCB3aXRoIGEgc2luZ2xlIHRhcmdldCB3aG9zZSBkZXBlbmRlbmNpZXMgYXJlIHRoZQordGFyZ2V0cyBzbyBzcGVjaWZpZWQsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgY2FsbGVkIHRhcmdldC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD48ZW0+c2luY2UgQW50IDEuNi4zPC9lbT4uPC9wPgorCis8aDM+QmFzZWRpciBvZiB0aGUgbmV3IHByb2plY3Q8L2gzPgorCis8cD5UaGUgYmFzZWRpciB2YWx1ZSBvZiB0aGUgbmV3IHByb2plY3QgaXMgYWZmZWN0ZWQgYnkgdGhlIHR3bworYXR0cmlidXRlcyBkaXIgYW5kIGluaGVyaXRhbGwsIHNlZSB0aGUgZm9sbG93aW5nIHRhYmxlIGZvcgorZGV0YWlsczo8L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPmRpciBhdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPmluaGVyaXRBbGwgYXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5uZXcgcHJvamVjdCdzIGJhc2VkaXI8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgcHJvdmlkZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHJ1ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZSBvZiBkaXIgYXR0cmlidXRlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgcHJvdmlkZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFsc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgb2YgZGlyIGF0dHJpYnV0ZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm9taXR0ZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHJ1ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyIG9mIGNhbGxpbmcgcHJvamVjdCAodGhlIG9uZSB3aG9zZSBidWlsZAorICAgICAgICBmaWxlIGNvbnRhaW5zIHRoZSA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFzaykuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b21pdHRlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWxzZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyIGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+Jmx0O3Byb2plY3QmZ3Q7PC9jb2RlPiBlbGVtZW50CisgICAgICAgIG9mIHRoZSBuZXcgcHJvamVjdDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthbnQgYW50ZmlsZT0mcXVvdDtzdWJwcm9qZWN0L3N1YmJ1aWxkLnhtbCZxdW90OyB0YXJnZXQ9JnF1b3Q7Y29tcGlsZSZxdW90Oy8mZ3Q7CisKKyZsdDthbnQgZGlyPSZxdW90O3N1YnByb2plY3QmcXVvdDsvJmd0OworCismbHQ7YW50IGFudGZpbGU9JnF1b3Q7c3VicHJvamVjdC9wcm9wZXJ0eV9iYXNlZF9zdWJidWlsZC54bWwmcXVvdDsmZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O3BhcmFtMSZxdW90OyB2YWx1ZT0mcXVvdDt2ZXJzaW9uIDEueCZxdW90Oy8mZ3Q7CisgICZsdDtwcm9wZXJ0eSBmaWxlPSZxdW90O2NvbmZpZy9zdWJwcm9qZWN0L2RlZmF1bHQucHJvcGVydGllcyZxdW90Oy8mZ3Q7CismbHQ7L2FudCZndDsKKworJmx0O2FudCBpbmhlcml0QWxsPSZxdW90O2ZhbHNlJnF1b3Q7IGFudGZpbGU9JnF1b3Q7c3VicHJvamVjdC9zdWJidWlsZC54bWwmcXVvdDsmZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O291dHB1dC50eXBlJnF1b3Q7IHZhbHVlPSZxdW90O2h0bWwmcXVvdDsvJmd0OworJmx0Oy9hbnQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPlRoZXNlIGxpbmVzIGludm9rZSB0aGUgc2FtZSBidWlsZCBmaWxlOjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7YW50IGFudGZpbGU9JnF1b3Q7c3ViMS9zdWIyL2J1aWxkLnhtbCZxdW90OyAvJmd0OworJmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YjIvYnVpbGQueG1sJnF1b3Q7IGRpcj0mcXVvdDtzdWIxJnF1b3Q7IC8mZ3Q7CismbHQ7YW50IGFudGZpbGU9JnF1b3Q7YnVpbGQueG1sJnF1b3Q7IGRpcj0mcXVvdDtzdWIxL3N1YjImcXVvdDsgLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+VGhlIGJ1aWxkIGZpbGUgb2YgdGhlIGNhbGxpbmcgcHJvamVjdCBkZWZpbmVzIHNvbWUKKzxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4gZWxlbWVudHMgbGlrZSB0aGlzOjwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtwYXRoIGlkPSJwYXRoMSImZ3Q7CisgICAgLi4uCismbHQ7L3BhdGgmZ3Q7CismbHQ7cGF0aCBpZD0icGF0aDIiJmd0OworICAgIC4uLgorJmx0Oy9wYXRoJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5hbmQgdGhlIGNhbGxlZCBidWlsZCBmaWxlICg8Y29kZT5zdWJidWlsZC54bWw8L2NvZGU+KSBhbHNvIGRlZmluZXMKK2EgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiB3aXRoIHRoZSBpZCA8Y29kZT5wYXRoMTwvY29kZT4sIGJ1dAorPGNvZGU+cGF0aDI8L2NvZGU+IGlzIG5vdCBkZWZpbmVkOjwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthbnQgYW50ZmlsZT0mcXVvdDtzdWJidWlsZC54bWwmcXVvdDsgaW5oZXJpdHJlZnM9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPndpbGwgbm90IG92ZXJyaWRlIDxjb2RlPnN1YmJ1aWxkPC9jb2RlPidzIGRlZmluaXRpb24gb2YKKzxjb2RlPnBhdGgxPC9jb2RlPiwgYnV0IG1ha2UgdGhlIHBhcmVudCdzIGRlZmluaXRpb24gb2YKKzxjb2RlPnBhdGgyPC9jb2RlPiBhdmFpbGFibGUgaW4gdGhlIHN1YmJ1aWxkLjwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthbnQgYW50ZmlsZT0mcXVvdDtzdWJidWlsZC54bWwmcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5hcyB3ZWxsIGFzPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YmJ1aWxkLnhtbCZxdW90OyBpbmhlcml0cmVmcz0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPndpbGwgbmVpdGhlciBvdmVycmlkZSA8Y29kZT5wYXRoMTwvY29kZT4gbm9yIGNvcHkKKzxjb2RlPnBhdGgyPC9jb2RlPi48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7YW50IGFudGZpbGU9JnF1b3Q7c3ViYnVpbGQueG1sJnF1b3Q7IGluaGVyaXRyZWZzPSZxdW90O2ZhbHNlJnF1b3Q7Jmd0OworICAmbHQ7cmVmZXJlbmNlIHJlZmlkPSZxdW90O3BhdGgxJnF1b3Q7LyZndDsKKyZsdDsvYW50Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD53aWxsIG92ZXJyaWRlIDxjb2RlPnN1YmJ1aWxkPC9jb2RlPidzIGRlZmluaXRpb24gb2YKKzxjb2RlPnBhdGgxPC9jb2RlPi48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7YW50IGFudGZpbGU9JnF1b3Q7c3ViYnVpbGQueG1sJnF1b3Q7IGluaGVyaXRyZWZzPSZxdW90O2ZhbHNlJnF1b3Q7Jmd0OworICAmbHQ7cmVmZXJlbmNlIHJlZmlkPSZxdW90O3BhdGgxJnF1b3Q7IHRvcmVmaWQ9JnF1b3Q7cGF0aDImcXVvdDsvJmd0OworJmx0Oy9hbnQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPndpbGwgY29weSB0aGUgcGFyZW50J3MgZGVmaW5pdGlvbiBvZiA8Y29kZT5wYXRoMTwvY29kZT4gaW50byB0aGUKK25ldyBwcm9qZWN0IHVzaW5nIHRoZSBpZCA8Y29kZT5wYXRoMjwvY29kZT4uPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2FudGNhbGwuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9hbnRjYWxsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmZTMzMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9hbnRjYWxsLmh0bWwKQEAgLTAsMCArMSwxOTEgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+QW50Q2FsbCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJhbnRjYWxsIj5BbnRDYWxsPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorCis8cD5DYWxsIGFub3RoZXIgdGFyZ2V0IHdpdGhpbiB0aGUgc2FtZSBidWlsZGZpbGUgb3B0aW9uYWxseQorc3BlY2lmeWluZyBzb21lIHByb3BlcnRpZXMgKHBhcmFtcyBpbiB0aGlzIGNvbnRleHQpLiAgPHN0cm9uZz5UaGlzCit0YXNrIG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiBhIDxjb2RlPnRhcmdldDwvY29kZT4uPC9zdHJvbmc+PC9wPgorCis8cD5CeSBkZWZhdWx0LCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdCB3aWxsIGJlCithdmFpbGFibGUgaW4gdGhlIG5ldyBwcm9qZWN0LiAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4KK3NldCB0aGUgPGk+aW5oZXJpdEFsbDwvaT4gYXR0cmlidXRlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgb25seQorJnF1b3Q7dXNlciZxdW90OyBwcm9wZXJ0aWVzIChpLmUuLCB0aG9zZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQtbGluZSkKK3dpbGwgYmUgcGFzc2VkIHRvIHRoZSBuZXcgcHJvamVjdC4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2V0IG9mCitwcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgbmV3IHByb2plY3Qgd2lsbCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyB0aGF0CithcmUgc2V0IGluIHRoZSBuZXcgcHJvamVjdCAoU2VlIGFsc28gdGhlIDxhIGhyZWY9InByb3BlcnR5Lmh0bWwiPnByb3BlcnR5IHRhc2s8L2E+KS48L3A+Cis8cD5Zb3UgY2FuIGFsc28gc2V0IHByb3BlcnRpZXMgaW4gdGhlIG5ldyBwcm9qZWN0IGZyb20gdGhlIG9sZCBwcm9qZWN0CitieSB1c2luZyBuZXN0ZWQgcGFyYW0gdGFncy4gVGhlc2UgcHJvcGVydGllcyBhcmUgYWx3YXlzIHBhc3NlZAordG8gdGhlIG5ldyBwcm9qZWN0IGFuZCBhbnkgcHJvamVjdCBjcmVhdGVkIGluIHRoYXQgcHJvamVjdAorcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiA8aT5pbmhlcml0QWxsPC9pPi4gIFRoaXMgYWxsb3dzIHlvdSB0bworcGFyYW1ldGVyaXplIHlvdXIgc3VicHJvamVjdHMuICBQcm9wZXJ0aWVzIGRlZmluZWQgb24gdGhlIGNvbW1hbmQgbGluZQorY2FuIG5vdCBiZSBvdmVycmlkZGVuIGJ5IG5lc3RlZCA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisKKzxwPk5lc3RlZCA8YSBocmVmPSIjcmVmZXJlbmNlIj48aT48Y29kZT4mbHQ7cmVmZXJlbmNlJmd0PC9jb2RlPjs8L2k+PC9hPiBlbGVtZW50cyBjYW4KK2JlIHVzZWQgdG8gY29weSByZWZlcmVuY2VzIGZyb20gdGhlIGNhbGxpbmcgcHJvamVjdCB0byB0aGUgbmV3Citwcm9qZWN0LCBvcHRpb25hbGx5IHVuZGVyIGEgZGlmZmVyZW50IGlkLiAgUmVmZXJlbmNlcyB0YWtlbiBmcm9tCituZXN0ZWQgZWxlbWVudHMgd2lsbCBvdmVycmlkZSBleGlzdGluZyByZWZlcmVuY2VzIHRoYXQgaGF2ZSBiZWVuCitkZWZpbmVkIG91dHNpZGUgb2YgdGFyZ2V0cyBpbiB0aGUgbmV3IHByb2plY3QgLSBidXQgbm90IHRob3NlIGRlZmluZWQKK2luc2lkZSBvZiB0YXJnZXRzLjwvcD4KKworPHA+CitXaGVuIGEgdGFyZ2V0IGlzIGludm9rZWQgYnkgYW50Y2FsbCwgYWxsIG9mIGl0cyBkZXBlbmRlbnQgdGFyZ2V0cyB3aWxsCithbHNvIGJlIGNhbGxlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW55IG5ldyBwYXJhbWV0ZXJzLiBGb3IgZXhhbXBsZS4gaWYKK3RoZSB0YXJnZXQgJnF1b3Q7ZG9Tb21ldGhpbmdFbHNlJnF1b3Q7IGRlcGVuZGVkIG9uIHRoZSB0YXJnZXQgJnF1b3Q7aW5pdCZxdW90OywgdGhlbiB0aGUKKzxpPmFudGNhbGw8L2k+IG9mICZxdW90O2RvU29tZXRoaW5nRWxzZSZxdW90OyB3aWxsIGNhbGwgJnF1b3Q7aW5pdCZxdW90OyBkdXJpbmcgdGhlIGNhbGwuCitPZiBjb3Vyc2UsIGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIGFudGNhbGwgdGFzayBvciBpbmhlcml0ZWQgZnJvbSB0aGUgY2FsbGluZyB0YXJnZXQKK3dpbGwgYmUgZml4ZWQgYW5kIG5vdCBvdmVycmlkYWJsZSBpbiB0aGUgaW5pdCB0YXNrLS1vciBpbmRlZWQgaW4gdGhlICZxdW90O2RvU29tZXRoaW5nRWxzZSZxdW90OyB0YXNrLgorPC9wPgorCis8cD5JZiB0aGUgYnVpbGQgZmlsZSBjaGFuZ2VzIGFmdGVyIHlvdSd2ZSBzdGFydGVkIHRoZSBidWlsZCwgdGhlCitiZWhhdmlvciBvZiB0aGlzIHRhc2sgaXMgdW5kZWZpbmVkLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB0YXJnZXQgdG8gZXhlY3V0ZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5oZXJpdEFsbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiA8Y29kZT50cnVlPC9jb2RlPiwgcGFzcyBhbGwgcHJvcGVydGllcyB0byB0aGUgbmV3IEFudAorICAgIHByb2plY3QuICBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmhlcml0UmVmczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiA8Y29kZT50cnVlPC9jb2RlPiwgcGFzcyBhbGwgcmVmZXJlbmNlcyB0byB0aGUKKyAgICAgIG5ldyBBbnQgcHJvamVjdC4gIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPk5vdGUgb24gPGNvZGU+aW5oZXJpdFJlZnM8L2NvZGU+PC9oMz4KKworPHA+PGNvZGU+Jmx0O2FudGNhbGwmZ3Q7PC9jb2RlPiB3aWxsIG5vdCBvdmVycmlkZSBleGlzdGluZyByZWZlcmVuY2VzLAorZXZlbiBpZiB5b3Ugc2V0IDxjb2RlPmluaGVyaXRSZWZzPC9jb2RlPiB0byB0cnVlLiAgQXMgdGhlIGNhbGxlZCBidWlsZAorZmlsZXMgaXMgdGhlIHNhbWUgYnVpbGQgZmlsZSBhcyB0aGUgY2FsbGluZyBvbmUsIHRoaXMgbWVhbnMgaXQgd2lsbAorbm90IG92ZXJyaWRlIGFueSByZWZlcmVuY2Ugc2V0IHZpYSBhbiA8Y29kZT5pZDwvY29kZT4gYXR0cmlidXRlIGF0CithbGwuICBUaGUgb25seSByZWZlcmVuY2VzIHRoYXQgY2FuIGJlIGluaGVyaXRlZCBieSB0aGUgY2hpbGQgcHJvamVjdAorYXJlIHRob3NlIGRlZmluZWQgYnkgbmVzdGVkIDxjb2RlPiZsdDtyZWZlcmVuY2UmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvcgorcmVmZXJlbmNlcyBkZWZpbmVkIGJ5IHRhc2tzIGRpcmVjdGx5IChub3QgdXNpbmcgdGhlIDxjb2RlPmlkPC9jb2RlPgorYXR0cmlidXRlKS48L3A+CisKKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0PnBhcmFtPC9oND4KKzxwPlNwZWNpZmllcyB0aGUgcHJvcGVydGllcyB0byBzZXQgYmVmb3JlIHJ1bm5pbmcgdGhlIHNwZWNpZmllZCB0YXJnZXQuIFNlZSA8YQoraHJlZj0icHJvcGVydHkuaHRtbCI+cHJvcGVydHk8L2E+IGZvciB1c2FnZSBndWlkZWxpbmVzLjxicj4KK1RoZXNlIHByb3BlcnRpZXMgYmVjb21lIGVxdWl2YWxlbnQgdG8gcHJvcGVydGllcyB5b3UgZGVmaW5lIG9uCit0aGUgY29tbWFuZCBsaW5lLiBUaGVzZSBhcmUgc3BlY2lhbCBwcm9wZXJ0aWVzIGFuZCB0aGV5IHdpbGwgYWx3YXlzIGdldCBwYXNzZWQKK2Rvd24sIGV2ZW4gdGhyb3VnaCBhZGRpdGlvbmFsIDxjb2RlPiZsdDsqYW50KiZndDs8L2NvZGU+IHRhc2tzIHdpdGggaW5oZXJpdGFsbCBzZXQgdG8KK2ZhbHNlIChzZWUgYWJvdmUpLgorPC9wPgorCis8aDQ+PGEgbmFtZT0icmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+PC9oND4KKzxwPlVzZWQgdG8gY2hvb3NlIHJlZmVyZW5jZXMgdGhhdCBzaGFsbCBiZSBjb3BpZWQgaW50byB0aGUgbmV3IHByb2plY3QsCitvcHRpb25hbGx5IGNoYW5naW5nIHRoZWlyIGlkLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmaWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGlkIG9mIHRoZSByZWZlcmVuY2UgaW4gdGhlIGNhbGxpbmcgcHJvamVjdC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9yZWZpZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgaWQgb2YgdGhlIHJlZmVyZW5jZSBpbiB0aGUgbmV3IHByb2plY3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgcmVmaWQuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5wcm9wZXJ0eXNldDwvaDQ+CisKKzxwPllvdSBjYW4gc3BlY2lmeSBhIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBuZXcKK3Byb2plY3Qgd2l0aCA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL3Byb3BlcnR5c2V0Lmh0bWwiPnByb3BlcnR5c2V0PC9hPnMuPC9wPgorCis8cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvcD4KKworPGg0PnRhcmdldDwvaDQ+CisKKzxwPllvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB0YXJnZXRzIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7dGFyZ2V0Jmd0OzwvY29kZT4gZWxlbWVudHMKK2luc3RlYWQgb2YgdXNpbmcgdGhlIHRhcmdldCBhdHRyaWJ1dGUuICBUaGVzZSB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlmCitBbnQgaGFkIGJlZW4gaW52b2tlZCB3aXRoIGEgc2luZ2xlIHRhcmdldCB3aG9zZSBkZXBlbmRlbmNpZXMgYXJlIHRoZQordGFyZ2V0cyBzbyBzcGVjaWZpZWQsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgY2FsbGVkIHRhcmdldC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD48ZW0+c2luY2UgQW50IDEuNi4zPC9lbT4uPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDt0YXJnZXQgbmFtZT0mcXVvdDtkZWZhdWx0JnF1b3Q7Jmd0OworICAmbHQ7YW50Y2FsbCB0YXJnZXQ9JnF1b3Q7ZG9Tb21ldGhpbmdFbHNlJnF1b3Q7Jmd0OworICAgICZsdDtwYXJhbSBuYW1lPSZxdW90O3BhcmFtMSZxdW90OyB2YWx1ZT0mcXVvdDt2YWx1ZSZxdW90Oy8mZ3Q7CisgICZsdDsvYW50Y2FsbCZndDsKKyZsdDsvdGFyZ2V0Jmd0OworCismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7ZG9Tb21ldGhpbmdFbHNlJnF1b3Q7Jmd0OworICAmbHQ7ZWNobyBtZXNzYWdlPSZxdW90O3BhcmFtMT0ke3BhcmFtMX0mcXVvdDsvJmd0OworJmx0Oy90YXJnZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5XaWxsIHJ1biB0aGUgdGFyZ2V0ICdkb1NvbWV0aGluZ0Vsc2UnIGFuZCBlY2hvICdwYXJhbTE9dmFsdWUnLjwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthbnRjYWxsIC4uLiAmZ3Q7CisgICZsdDtyZWZlcmVuY2UgcmVmaWQ9JnF1b3Q7cGF0aDEmcXVvdDsgdG9yZWZpZD0mcXVvdDtwYXRoMiZxdW90Oy8mZ3Q7CismbHQ7L2FudGNhbGwmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPndpbGwgY29weSB0aGUgcGFyZW50J3MgZGVmaW5pdGlvbiBvZiA8Y29kZT5wYXRoMTwvY29kZT4gaW50byB0aGUKK25ldyBwcm9qZWN0IHVzaW5nIHRoZSBpZCA8Y29kZT5wYXRoMjwvY29kZT4uPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2FudHN0cnVjdHVyZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2FudHN0cnVjdHVyZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MmNiMjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvYW50c3RydWN0dXJlLmh0bWwKQEAgLTAsMCArMSwxMDAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+QW50U3RydWN0dXJlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImFudHN0cnVjdHVyZSI+QW50U3RydWN0dXJlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPiAKKworPHA+R2VuZXJhdGVzIGFuIERURCBmb3IgQW50IGJ1aWxkZmlsZXMgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24KK2Fib3V0IGFsbCB0YXNrcyBjdXJyZW50bHkga25vd24gdG8gQW50LjwvcD4KKworPHA+QWN0dWFsbHkgdGhlIERURCB3aWxsIG5vdCBiZSBhIHJlYWwgRFREIGZvciBidWlsZGZpbGVzIHNpbmNlIEFudCdzCit1c2FnZSBvZiBYTUwgY2Fubm90IGJlIGNhcHR1cmVkIHdpdGggYSBEVEQuICBTZXZlcmFsIGVsZW1lbnRzIGluIEFudAorY2FuIGhhdmUgZGlmZmVyZW50IGF0dHJpYnV0ZSBsaXN0cyBkZXBlbmRpbmcgb24gdGhlIGVsZW1lbnQgdGhhdAorY29udGFpbnMgdGhlbS4gICZxdW90O2ZhaWwmcXVvdDsgZm9yIGV4YW1wbGUgY2FuIGJlIDxhCitocmVmPSJmYWlsLmh0bWwiPnRoZSB0YXNrPC9hPiBvciB0aGUgbmVzdGVkIGNoaWxkIGVsZW1lbnQgb2YgdGhlIDxhCitocmVmPSIuLi9PcHRpb25hbFRhc2tzL3NvdW5kLmh0bWwiPnNvdW5kPC9hPiB0YXNrLiAgRG9uJ3QgY29uc2lkZXIgdGhlCitnZW5lcmF0ZWQgRFREIHNvbWV0aGluZyB0byByZWx5IHVwb24uPC9wPgorCis8cD5BbHNvIG5vdGUgdGhhdCB0aGUgRFREIGdlbmVyYXRlZCBieSB0aGlzIHRhc2sgaXMgaW5jb21wbGV0ZSwgeW91IGNhbgorYWx3YXlzIGFkZCBYTUwgZW50aXRpZXMgdXNpbmcgPGEKK2hyZWY9InRhc2tkZWYuaHRtbCI+PGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPjwvYT4gb3IgPGEKK2hyZWY9InR5cGVkZWYuaHRtbCI+PGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7PC9jb2RlPjwvYT4uIFNlZSA8YQoraHJlZj0iaHR0cDovL3d3dy5zZHYuZnIvcGFnZXMvY2FzYS9odG1sL2FudC1kdGQuZW4uaHRtbCIKK3RhcmdldD0iX3RvcCI+aGVyZTwvYT4gZm9yIGEgd2F5IHRvIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtLjwvcD4KKzxwPlRoaXMgdGFzayBkb2Vzbid0IGtub3cgYWJvdXQgcmVxdWlyZWQgYXR0cmlidXRlcywgYWxsIHdpbGwgYmUKK2xpc3RlZCBhcyA8Y29kZT4jSU1QTElFRDwvY29kZT4uPC9wPgorCis8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+IGN1c3RvbSBzdHJ1Y3R1cmUgcHJpbnRlcnMgY2FuIGJlIHVzZWQKK2luc3RlYWQgb2YgdGhlIG9uZSB0aGF0IGVtaXRzIGEgRFRELiAgSW4gb3JkZXIgdG8gcGx1ZyBpbiB5b3VyIG93bgorc3RydWN0dXJlLCB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIGludGVyZmFjZQorPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50U3RydWN0dXJlLlN0cnVjdHVyZVByaW50ZXI8L2NvZGU+CithbmQgPGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7IHlvdXIgY2xhc3MgYW5kIHVzZSB0aGUgbmV3IHR5cGUgYXMgYSBuZXN0ZWQKK2VsZW1lbnQgb2YgdGhpcyB0YXNrIC0gc2VlIHRoZSBleGFtcGxlIGJlbG93LjwvY29kZT4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGUgdG8gd3JpdGUgdGhlIERURCB0by48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthbnRzdHJ1Y3R1cmUgb3V0cHV0PSZxdW90O3Byb2plY3QuZHRkJnF1b3Q7IC8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPjxiPkVtaXR0aW5nIHlvdXIgb3duIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGEgRFREPC9iPjwvcD4KKworPHA+Rmlyc3QgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoZSBpbnRlcmZhY2U8L3A+CisKKzxwcmU+CitwYWNrYWdlIG9yZy5leGFtcGxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFudFN0cnVjdHVyZTsKK3B1YmxpYyBjbGFzcyBNeVByaW50ZXIgaW1wbGVtZW50cyBBbnRTdHJ1Y3R1cmUuU3RydWN0dXJlUHJpbnRlciB7CisgICAgLi4uCit9Cis8L3ByZT4KKworPHA+YW5kIHRoZW4gdXNlIGl0IHZpYSB0eXBlZGVmPC9wPgorCis8cHJlPgorICAmbHQ7dHlwZWRlZiBuYW1lPSJteXByaW50ZXIiIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuTXlQcmludGVyIiAvJmd0OworICAmbHQ7YW50c3RydWN0dXJlIG91dHB1dD0icHJvamVjdC5teSImZ3Q7CisgICAgJmx0O215cHJpbnRlciAvJmd0OworICAmbHQ7L2FudHN0cnVjdHVyZSZndDsKKzwvcHJlPgorCis8cD5Zb3VyIG93biBTdHJ1Y3R1cmVQcmludGVyIGNhbiBhY2NlcHQgYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzCitqdXN0IGxpa2UgYW55IG90aGVyIEFudCB0eXBlIG9yIHRhc2suPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvYW50dmVyc2lvbi5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2FudHZlcnNpb24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ2Y2QxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2FudHZlcnNpb24uaHRtbApAQCAtMCwwICsxLDk1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkFudHZlcnNpb24gVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iYW50dmVyc2lvbiI+QW50dmVyc2lvbjwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPgorU3RvcmVzIHRoZSBBbnQgdmVyc2lvbiAod2hlbiB1c2VkIGFzIHRhc2spIG9yIGNoZWNrcyBmb3IgYSBzcGVjaWZpYyBBbnQgdmVyc2lvbiAKKyh3aGVuIHVzZWQgYXMgY29uZGl0aW9uKS4KKzxiPlNpbmNlIEFudCAxLjcuMDwvYj4KKzwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQgKFRhc2spPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZCAoQ29uZGl0aW9uKTwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hdGxlYXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBhdCBsZWFzdC4KKyAgICAgIFRoZSBmb3JtYXQgaXMgbWFqb3IubWlub3IucG9pbnQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHJvd3NwYW49IjIiIGFsaWduPSJjZW50ZXIiPk9uZSBvZiB0aGVzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGFjdGx5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBhbnQgaXMgZXhhY3RseS4KKyAgICAgIFRoZSBmb3JtYXQgaXMgPHR0Pm1ham9yLm1pbm9yLnBvaW50PC90dD4uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIChpZ25vcmVkKTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7YW50dmVyc2lvbiBwcm9wZXJ0eT0mcXVvdDthbnR2ZXJzaW9uJnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPlN0b3JlcyB0aGUgY3VycmVudCBBbnQgdmVyc2lvbiBpbiB0aGUgcHJvcGVydHkgPGk+YW50dmVyc2lvbjwvaT4uPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2FudHZlcnNpb24gcHJvcGVydHk9JnF1b3Q7YW50dmVyc2lvbiZxdW90OyBhdGxlYXN0PSZxdW90OzEuNiZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5TdG9yZXMgdGhlIEFudCB2ZXJzaW9uIGluIHRoZSBwcm9wZXJ0eSA8aT5hbnR2ZXJzaW9uPC9pPiBpZiB0aGUgY3VycmVudCBBbnQgdmVyc2lvbiBpcyAxLjYuMAorb3IgaGlnaGVyLiBPdGhlcndpc2UgdGhlIHByb3BlcnR5IHJlbWFpbnMgdW5zZXQuPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2FudHZlcnNpb24gcHJvcGVydHk9JnF1b3Q7YW50LWlzLWV4YWN0LTcmcXVvdDsgZXhhY3RseT0mcXVvdDsxLjcuMCZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5TZXRzIHRoZSBwcm9wZXJ0eSA8aT5hbnQtaXMtZXhhY3QtNzwvaT4gaWYgQW50IDEuNy4wIGlzIHJ1bm5pbmcuIE5laXRoZXIgMS42LjUgbm9yIDEuNy4wCit3b3VsZCBtYXRjaC48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSZxdW90O0FudDE3aXNPbmxpbmUmcXVvdDsmZ3Q7CisgICZsdDthbmQmZ3Q7CisgICAgJmx0O2FudHZlcnNpb24gZXhhY3RseT0mcXVvdDsxLjcuMCZxdW90Oy8mZ3Q7CisgICAgJmx0O2h0dHAgdXJsPSZxdW90O2h0dHA6Ly9hbnQuYXBhY2hlLm9yZyZxdW90Oy8mZ3Q7CisgICZsdDsvYW5kJmd0OworJmx0Oy9jb25kaXRpb24mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5TZXRzIDxpPkFudDE3aXNPbmxpbmU8L2k+IGlmIEFudCAxLjcuMCBpcyBydW5uaW5nIGFuZCBjYW4gZ2V0IGEgbm9uLWVycm9yLXJlc3BvbnNlIGZyb20KK3RoZSBBbnQgaG9tZXBhZ2UuPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvYXBwbHkuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9hcHBseS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTQ5NTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvYXBwbHkuaHRtbApAQCAtMCwwICsxLDQ0OSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CisgIDx0aXRsZT5BcHBseSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJhcHBseSI+QXBwbHkvPGk+RXhlY09uPC9pPjwvYT48L2gyPgorPHA+PGk+VGhlIG5hbWUgPGNvZGU+ZXhlY29uPC9jb2RlPiBpcyBkZXByZWNhdGVkIGFuZCBvbmx5IGtlcHQgZm9yIGJhY2t3YXJkcworY29tcGF0aWJpbGl0eS48L2k+PC9wPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkV4ZWN1dGVzIGEgc3lzdGVtIGNvbW1hbmQuIFdoZW4gdGhlIDxpPm9zPC9pPiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGVuCit0aGUgY29tbWFuZCBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gQW50IGlzIHJ1biBvbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBvcGVyYXRpbmcKK3N5c3RlbXMuPC9wPgorCis8cD5UaGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIG9mIGEgbnVtYmVyIG9mIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT5zCismbmRhc2g7IGluY2x1ZGluZyBidXQgbm90IHJlc3RyaWN0ZWQgdG8KKyA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMsCisgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2RpcnNldC5odG1sIj5EaXJTZXQ8L2E+cworICg8ZW0+c2luY2UmbmJzcDtBbnQmbmJzcDsxLjY8L2VtPikgb3IKKyA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCI+RmlsZUxpc3Q8L2E+cworICg8ZW0+c2luY2UmbmJzcDtBbnQmbmJzcDsxLjY8L2VtPikKKyZuZGFzaDsKKyBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byB0aGUgc3lzdGVtIGNvbW1hbmQuPC9wPgorPHA+SWYgeW91IHNwZWNpZnkgYSBuZXN0ZWQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL21hcHBlci5odG1sIj5tYXBwZXI8L2E+LAordGhlIHRpbWVzdGFtcCBvZiBlYWNoIHNvdXJjZSBmaWxlIGlzIGNvbXBhcmVkIHRvIHRoZSB0aW1lc3RhbXAgb2YgYQordGFyZ2V0IGZpbGUgd2hpY2ggaXMgZGVmaW5lZCBieSB0aGUgbmVzdGVkIG1hcHBlciBlbGVtZW50IGFuZCBzZWFyY2hlZAorZm9yIGluIHRoZSBnaXZlbiA8aT5kZXN0PC9pPiwgaWYgc3BlY2lmaWVkLjwvcD4KKzxwPkF0IGxlYXN0IG9uZSBmaWxlc2V0IG9yIGZpbGVsaXN0IGlzIHJlcXVpcmVkLAorYW5kIHlvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgbWFwcGVyLjwvcD4KKworPHA+Tm90ZSB0aGF0IHlvdSBjYW5ub3QgaW50ZXJhY3Qgd2l0aCB0aGUgZm9ya2VkIHByb2dyYW0sIHRoZSBvbmx5IHdheQordG8gc2VuZCBpbnB1dCB0byBpdCBpcyB2aWEgdGhlIGlucHV0IGFuZCBpbnB1dHN0cmluZyBhdHRyaWJ1dGVzLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhlY3V0YWJsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgY29tbWFuZCB0byBleGVjdXRlIHdpdGhvdXQgYW55IGNvbW1hbmQgbGluZQorICAgICAgYXJndW1lbnRzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbW1hbmQgaXMgZXhwZWN0ZWQgdG8gcGxhY2UKKyAgICB0YXJnZXQgZmlsZXMgd2hlbiBpdCBpcyBleGVjdXRlZC4gVGhpcyBhdHRyaWJ1dGUgaXMgdmFsaWQgb25seSB3aGVuIHVzZWQKKyAgICBpbiBjb25qdW5jdGlvbiB3aXRoIGEgbmVzdGVkIG1hcHBlcjsgaWYgb21pdHRlZCwgdGhlIHRhcmdldCBmaWxlbmFtZXMKKyAgICByZXR1cm5lZCBieSB0aGUgbWFwcGVyIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYWJzb2x1dGUgcGF0aHMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3Bhd248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciBvciBub3QgeW91IHdhbnQgdGhlIGNvbW1hbmRzIHRvIGJlIHNwYXduZWQuPGJyPgorICAgIElmIHlvdSBzcGF3biBhIGNvbW1hbmQsIGl0cyBvdXRwdXQgd2lsbCBub3QgYmUgbG9nZ2VkIGJ5IGFudC48YnI+CisgICAgVGhlIGlucHV0LCBvdXRwdXQsIGVycm9yLCBhbmQgcmVzdWx0IHByb3BlcnR5IHNldHRpbmdzIGFyZSBub3QgYWN0aXZlIHdoZW4gc3Bhd25pbmcgYSBwcm9jZXNzLjxicj4KKyAgICA8ZW0+c2luY2UmbmJzcDtBbnQmbmJzcDsxLjY8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21tYW5kIHNob3VsZCBiZSBleGVjdXRlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZWxhdGl2ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRoZSBmaWxlbmFtZXMgc2hvdWxkIGJlIHBhc3NlZCBvbiB0aGUKKyAgICAgIGNvbW1hbmQgbGluZSBhcyByZWxhdGl2ZSBwYXRobmFtZXMgKHJlbGF0aXZlIHRvIHRoZSBiYXNlIGRpcmVjdG9yeQorICAgICAgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXNldC9saXN0IGZvciBzb3VyY2UgZmlsZXMgb3IgdGhlCisgICAgICA8aT5kZXN0PC9pPiBhdHRyaWJ1dGUgZm9yIHRhcmdldCBmaWxlcykuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcndhcmRzbGFzaDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRoZSBmaWxlIG5hbWVzIHNob3VsZCBiZSBwYXNzZWQKKyAgICAgIHdpdGggZm9yd2FyZCBzbGFzaGVzIGV2ZW4gaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVxdWlyZXMgb3RoZXIKKyAgICAgIGZpbGUgc2VwYXJhdG9yLiBUaGUgb3B0aW9uIGlzIGlnbm9yZWQgaWYgdGhlIHN5c3RlbSBmaWxlIHNlcGFyYXRvcgorICAgICAgaXMgYSBmb3J3YXJkIHNsYXNoLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5saXN0IG9mIE9wZXJhdGluZyBTeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZQorICAgICAgZXhlY3V0ZWQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3NmYW1pbHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T1MgZmFtaWx5IGFzIHVzZWQgaW4gdGhlICZsdDtvcyZndDsgY29uZGl0aW9uLgorICAgIDxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgdG8gd2hpY2ggdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZAorICAgIHNob3VsZCBiZSByZWRpcmVjdGVkLiAgSWYgdGhlIGVycm9yIHN0cmVhbSBpcyBub3QgYWxzbyByZWRpcmVjdGVkCisgICAgdG8gYSBmaWxlIG9yIHByb3BlcnR5LCBpdCB3aWxsIGFwcGVhciBpbiB0aGlzIG91dHB1dC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlCisgICAgY29tbWFuZCBzaG91bGQgYmUgcmVkaXJlY3RlZC4gIDxlbT5zaW5jZSZuYnNwO0FudCZuYnNwOzEuNjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bG9nRXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB3aGVuIHlvdSB3aXNoIHRvIHNlZSBlcnJvcgorICAgIG91dHB1dCBpbiBBbnQncyBsb2cgYW5kIHlvdSBhcmUgcmVkaXJlY3Rpbmcgb3V0cHV0IHRvIGEKKyAgICBmaWxlL3Byb3BlcnR5LiBUaGUgZXJyb3Igb3V0cHV0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQKKyAgICBmaWxlL3Byb3BlcnR5LiBJZiB5b3UgcmVkaXJlY3QgZXJyb3Igd2l0aCB0aGUgJnF1b3Q7ZXJyb3ImcXVvdDsgb3IKKyAgICAmcXVvdDtlcnJvclByb3BlcnR5JnF1b3Q7IGF0dHJpYnV0ZXMsIHRoaXMgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAgICA8ZW0+c2luY2UmbmJzcDtBbnQmbmJzcDsxLjY8L2VtPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlCisgICAgICBhbiBleGlzdGluZyBmaWxlLiAgSWYgeW91IHNldCBwYXJhbGxlbCB0byBmYWxzZSwgeW91IHdpbGwgcHJvYmFibHkKKyAgICAgIHdhbnQgdG8gc2V0IHRoaXMgb25lIHRvIHRydWUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dHByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIG91dHB1dCBvZiB0aGUKKyAgICBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuICBVbmxlc3MgdGhlIGVycm9yIHN0cmVhbSBpcyByZWRpcmVjdGVkCisgICAgdG8gYSBzZXBhcmF0ZSBmaWxlIG9yIHN0cmVhbSwgdGhpcyBwcm9wZXJ0eSB3aWxsIGluY2x1ZGUgdGhlIGVycm9yCisgICAgb3V0cHV0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9ycHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlCisgICAgICBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuICA8ZW0+c2luY2UmbmJzcDtBbnQmbmJzcDsxLjY8L2VtPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlucHV0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZmlsZSBmcm9tIHdoaWNoIHRoZSBleGVjdXRlZCBjb21tYW5kJ3Mgc3RhbmRhcmQKKyAgICBpbnB1dCBpcyB0YWtlbi4gVGhpcyBhdHRyaWJ1dGUgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlCisgICAgaW5wdXRzdHJpbmcgYXR0cmlidXRlLiAgPGVtPnNpbmNlJm5ic3A7QW50Jm5ic3A7MS42PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dHN0cmluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIHN0cmluZyB3aGljaCBzZXJ2ZXMgYXMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlCisgICAgZXhlY3V0ZWQgY29tbWFuZC4gVGhpcyBhdHRyaWJ1dGUgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlCisgICAgaW5wdXQgYXR0cmlidXRlLiAgPGVtPnNpbmNlJm5ic3A7QW50Jm5ic3A7MS42PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXN1bHRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZQorICAgICAgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gT25seSBvZiBpbnRlcmVzdCBpZgorICAgICAgZmFpbG9uZXJyb3I9ZmFsc2UuIElmIHlvdSBzZXQgcGFyYWxsZWwgdG8gZmFsc2UsIG9ubHkgdGhlIHJlc3VsdAorICAgICAgb2YgdGhlIGZpcnN0IGV4ZWN1dGlvbiB3aWxsIGJlIHN0b3JlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aW1lb3V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGNvbW1hbmQgaWYgaXQgZG9lc24ndCBmaW5pc2ggd2l0aGluIHRoZQorICAgICAgc3BlY2lmaWVkIHRpbWUgKGdpdmVuIGluIG1pbGxpc2Vjb25kcykuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYQorICAgICAgcmV0dXJuY29kZSBvdGhlciB0aGFuIDAuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbGlmZXhlY3V0aW9uZmFpbHM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGQgaWYgd2UgY2FuJ3Qgc3RhcnQgdGhlIHByb2dyYW0uCisgICAgICBEZWZhdWx0cyB0byB0cnVlLiA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5za2lwZW1wdHlmaWxlc2V0czwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Eb24ndCBydW4gdGhlIGNvbW1hbmQsIGlmIG5vIHNvdXJjZSBmaWxlcyBoYXZlCisgICAgICBiZWVuIGZvdW5kIG9yIGFyZSBuZXdlciB0aGFuIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGFyZ2V0CisgICAgICBmaWxlcy4gIERlc3BpdGUgaXRzIG5hbWUsIHRoaXMgYXR0cmlidXRlIGFwcGxpZXMgdG8gZmlsZWxpc3RzIGFzCisgICAgICB3ZWxsLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXJhbGxlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5SdW4gdGhlIGNvbW1hbmQgb25seSBvbmNlLCBhcHBlbmRpbmcgYWxsIGZpbGVzIGFzCisgICAgICBhcmd1bWVudHMuIElmIGZhbHNlLCBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgb25jZSBmb3IgZXZlcnkgZmlsZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmFsc2U8L2k+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5PbmUgb2YgPGk+ZmlsZTwvaT4sIDxpPmRpcjwvaT4gb3IKKyAgICAgIDxpPmJvdGg8L2k+LiBJZiBzZXQgdG8gPGk+ZmlsZTwvaT4sIG9ubHkgdGhlIG5hbWVzIG9mIHBsYWluCisgICAgICBmaWxlcyB3aWxsIGJlIHNlbnQgdG8gdGhlIGNvbW1hbmQuIElmIHNldCB0byA8aT5kaXI8L2k+LCBvbmx5CisgICAgICB0aGUgbmFtZXMgb2YgZGlyZWN0b3JpZXMgYXJlIGNvbnNpZGVyZWQuPGJyPgorICAgICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgdHlwZSBhdHRyaWJ1dGUgZG9lcyBub3QgYXBwbHkgdG8KKyAgICAgIG5lc3RlZCA8aT5kaXJzZXQ8L2k+cyAtIDxpPmRpcnNldDwvaT5zIGFsd2F5cyBpbXBsaWNpdGx5CisgICAgICBhc3N1bWUgdHlwZSB0byBiZSA8aT5kaXI8L2k+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5maWxlPC9pPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5ld2Vudmlyb25tZW50PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBwcm9wYWdhdGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3IGVudmlyb25tZW50CisgICAgICB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmFsc2U8L2k+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dm1sYXVuY2hlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5SdW4gY29tbWFuZCB1c2luZyB0aGUgSmF2YSBWTSdzIGV4ZWN1dGlvbiBmYWNpbGl0aWVzCisgICAgICAgIHdoZXJlIGF2YWlsYWJsZS4gSWYgc2V0IHRvIGZhbHNlIHRoZSB1bmRlcmx5aW5nIE9TJ3Mgc2hlbGwsCisgICAgICAgIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIHRoZSBhbnRSdW4gc2NyaXB0cywgd2lsbCBiZSB1c2VkLgorICAgICAgICBVbmRlciBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGlzIGdpdmVzIGFjY2VzcyB0byBmYWNpbGl0aWVzCisgICAgICAgIG5vdCBub3JtYWxseSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgVk0gaW5jbHVkaW5nLCB1bmRlciBXaW5kb3dzLAorICAgICAgICBiZWluZyBhYmxlIHRvIGV4ZWN1dGUgc2NyaXB0cywgcmF0aGVyIHRoYW4gdGhlaXIgYXNzb2NpYXRlZAorICAgICAgICBpbnRlcnByZXRlci4gIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlCisgICAgICAgIGV4ZWN1dGFibGUgYXMgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgdGhlCisgICAgICAgIGRpciBhdHRyaWJ1dGUsIGl0IG1heSBiZWNvbWUgbmVjZXNzYXJ5IHRvIHNldCB2bWxhdW5jaGVyIHRvCisgICAgICAgIGZhbHNlIGFzIHdlbGwuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPnRydWU8L2k+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVzb2x2ZUV4ZWN1dGFibGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgbmFtZSBvZiB0aGUKKyAgICBleGVjdXRhYmxlIGlmIHJlc29sdmVkIGZpcnN0bHkgYWdhaW5zdCB0aGUgcHJvamVjdCBiYXNlZGlyIGFuZCBpZgorICAgIHRoYXQgZG9lcyBub3QgZXhpc3QsIGFnYWluc3QgdGhlIGV4ZWN1dGlvbiBkaXJlY3RvcnkgaWYKKyAgICBzcGVjaWZpZWQuIE9uIFVuaXggc3lzdGVtcywgaWYgeW91IG9ubHkgd2FudCB0byBhbGxvdyBleGVjdXRpb24gb2YKKyAgICBjb21tYW5kcyBpbiB0aGUgdXNlcidzIHBhdGgsIHNldCB0aGlzIHRvIGZhbHNlLgorICAgIDxlbT5zaW5jZSZuYnNwO0FudCZuYnNwOzEuNjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1heHBhcmFsbGVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkxpbWl0IHRoZSBhbW91bnQgb2YgcGFyYWxsZWxpc20gYnkgcGFzc2luZyBhdAorICAgICAgbW9zdCB0aGlzIG1hbnkgc291cmNlZmlsZXMgYXQgb25jZS4gIFNldCBpdCB0byAmbHQ7PSAwIGZvcgorICAgICAgdW5saW1pdGVkLiA8ZW0+U2luY2UmbmJzcDtBbnQmbmJzcDsxLjYuPC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIHVubGltaXRlZCBieSBkZWZhdWx0PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YWRkc291cmNlZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHNvdXJjZSBmaWxlIG5hbWVzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUKKyAgICAgIGNvbW1hbmQgYXV0b21hdGljYWxseS4gPGVtPlNpbmNlJm5ic3A7QW50Jm5ic3A7MS42LjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPnRydWU8L2k+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIHByaW50IGEgc3VtbWFyeSBhZnRlciBleGVjdXRpb24gb3Igbm90LgorICAgICAgPGVtPlNpbmNlJm5ic3A7QW50Jm5ic3A7MS42LjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IDxpPmZhbHNlPC9pPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZW1pc3Npbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBpZ25vcmUgbm9uZXhpc3RlbnQgZmlsZXMgc3BlY2lmaWVkCisgICAgICB2aWEgZmlsZWxpc3RzLiAgPGVtPlNpbmNlJm5ic3A7QW50Jm5ic3A7MS42LjIuPC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGk+dHJ1ZTwvaT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGJ5cGFzcyB0aW1lc3RhbXAgY29tcGFyaXNvbnMKKyAgICAgIGZvciB0YXJnZXQgZmlsZXMuICA8ZW0+U2luY2UmbmJzcDtBbnQmbmJzcDsxLjYuMy48L2VtPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0PmZpbGVzZXQ8L2g0PgorPHA+WW91IGNhbiB1c2UgYW55IG51bWJlciBvZiBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgorZWxlbWVudHMgdG8gZGVmaW5lIHRoZSBmaWxlcyBmb3IgdGhpcyB0YXNrIGFuZCByZWZlciB0bworPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPnMgZGVmaW5lZCBlbHNld2hlcmUuPC9wPgorPGg0PmZpbGVsaXN0PC9oND4KKzxwPjxlbT5TaW5jZSZuYnNwO0FudCZuYnNwOzEuNjwvZW0+PC9wPgorPHA+WW91IGNhbiB1c2UgYW55IG51bWJlciBvZiBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4KK2VsZW1lbnRzIHRvIGRlZmluZSB0aGUgZmlsZXMgZm9yIHRoaXMgdGFzayBhbmQgcmVmZXIgdG8KKzxjb2RlPiZsdDtmaWxlbGlzdCZndDs8L2NvZGU+cyBkZWZpbmVkIGVsc2V3aGVyZS48L3A+Cis8aDQ+ZGlyc2V0PC9oND4KKzxwPjxlbT5TaW5jZSZuYnNwO0FudCZuYnNwOzEuNjwvZW0+PC9wPgorPHA+WW91IGNhbiB1c2UgYW55IG51bWJlciBvZiBuZXN0ZWQgPGNvZGU+Jmx0O2RpcnNldCZndDs8L2NvZGU+CitlbGVtZW50cyB0byBkZWZpbmUgdGhlIGRpcmVjdG9yaWVzIGZvciB0aGlzIHRhc2sgYW5kIHJlZmVyIHRvCis8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT5zIGRlZmluZWQgZWxzZXdoZXJlLjwvcD4KKworPGg0PkFueSBvdGhlciA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UKK0NvbGxlY3Rpb248L2E+PC9oND4KKzxwPjxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3A+Cis8cD5Zb3UgY2FuIHVzZSBhbnkgbnVtYmVyIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9ucy48L3A+CisKKzxoND5tYXBwZXI8L2g0PgorPHA+QSBzaW5nbGUgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGZpbGVzIHJlbGF0aXZlCit0byB0aGUgPGNvZGU+ZGVzdDwvY29kZT4gYXR0cmlidXRlIGZvciBkZXBlbmRlbmN5IGNoZWNraW5nLiBJZiB0aGUKKzxjb2RlPmRlc3Q8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGFzIGEgYmFzZSBkaXJlY3RvcnkKK2ZvciByZXNvbHZpbmcgcmVsYXRpdmUgcGF0aG5hbWVzIHJldHVybmVkIGJ5IHRoZSBtYXBwZXIuIEF0IGxlYXN0IG9uZQorPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7ZmlsZWxpc3QmZ3Q7PC9jb2RlPiBpcyByZXF1aXJlZC48L3A+Cis8aDQ+YXJnPC9oND4KKzxwPkNvbW1hbmQgbGluZSBhcmd1bWVudHMgc2hvdWxkIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQKKzxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gU2VlIDxhCitocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZCBsaW5lIGFyZ3VtZW50czwvYT4uPC9wPgorPGg0PnNyY2ZpbGU8L2g0PgorPHA+QnkgZGVmYXVsdCB0aGUgZmlsZSBuYW1lcyBvZiB0aGUgc291cmNlIGZpbGVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlCitlbmQgb2YgdGhlIGNvbW1hbmQgbGluZSAodW5sZXNzIHlvdSBzZXQgYWRkc291cmNlZmlsZSB0bworPGNvZGU+ZmFsc2U8L2NvZGU+KS4gSWYgeW91IG5lZWQgdG8gcGxhY2UgaXQgc29tZXdoZXJlIGRpZmZlcmVudCwKK3VzZSBhIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZSZndDs8L2NvZGU+IGVsZW1lbnQgYmV0d2VlbiB5b3VyCis8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gZWxlbWVudHMgdG8gbWFyayB0aGUgaW5zZXJ0aW9uIHBvaW50LjwvcD4KKzxoND50YXJnZXRmaWxlPC9oND4KKzxwPjxjb2RlPiZsdDt0YXJnZXRmaWxlJmd0OzwvY29kZT4gaXMgc2ltaWxhciB0bworPGNvZGU+Jmx0O3NyY2ZpbGUmZ3Q7PC9jb2RlPiBhbmQgbWFya3MgdGhlIHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQKK2ZpbGVuYW1lIG9uIHRoZSBjb21tYW5kIGxpbmUuIElmIG9taXR0ZWQsIHRoZSB0YXJnZXQgZmlsZW5hbWVzIHdpbGwKK25vdCBiZSBhZGRlZCB0byB0aGUgY29tbWFuZCBsaW5lIGF0IGFsbC4gVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlCitzcGVjaWZpZWQgaWYgeW91IGFsc28gZGVmaW5lIGEgbmVzdGVkIG1hcHBlci48L3A+Cis8aDQ+ZW52PC9oND4KKzxwPkl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlCitzeXN0ZW0gY29tbWFuZCB2aWEgbmVzdGVkIDxjb2RlPiZsdDtlbnYmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gU2VlIHRoZQorZGVzY3JpcHRpb24gaW4gdGhlIHNlY3Rpb24gYWJvdXQgPGEgaHJlZj0iZXhlYy5odG1sI2VudiI+ZXhlYzwvYT48L3A+Cis8aDQ+cmVkaXJlY3RvcjwvaDQ+Cis8aT48Yj5TaW5jZSZuYnNwO0FudCZuYnNwOzEuNi4yPC9iPjwvaT4KKzxwPkEgbmVzdGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZWRpcmVjdG9yLmh0bWwiPkkvTyBSZWRpcmVjdG9yPC9hPgorY2FuIGJlIHNwZWNpZmllZC4gICZsdDthcHBseSZndDsncyBiZWhhdmlvciBpcyBsaWtlIHRoYXQgb2YKKzxhIGhyZWY9ImV4ZWMuaHRtbCNyZWRpcmVjdG9yIj5leGVjPC9hPiB3aXRoIHJlZ2FyZCB0bworcmVkaXJlY3RvcnMsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0LCBpbiBub24tPGk+cGFyYWxsZWw8L2k+IG1vZGUsCitmaWxlIG1hcHBpbmcgd2lsbCB0YWtlIHBsYWNlIHdpdGggZWFjaCBpdGVyYXRpb24uICBUaGlzIGdyYW50cyB0aGUKK3VzZXIgdGhlIGNhcGFjaXR5IHRvIHJlY2VpdmUgaW5wdXQgZnJvbSwgYW5kIHNlbmQgb3V0cHV0IHRvLCBkaWZmZXJlbnQKK2ZpbGVzIGZvciBlYWNoIHNvdXJjZWZpbGUuCis8L3A+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthcHBseSBleGVjdXRhYmxlPSZxdW90O2xzJnF1b3Q7Jmd0OworICAmbHQ7YXJnIHZhbHVlPSZxdW90Oy1sJnF1b3Q7LyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90Oy90bXAmcXVvdDsmZ3Q7CisgICAgJmx0O3BhdHRlcm5zZXQmZ3Q7CisgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqLyoudHh0JnF1b3Q7LyZndDsKKyAgICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7CisgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0O2ZpbGVzZXQgcmVmaWQ9JnF1b3Q7b3RoZXIuZmlsZXMmcXVvdDsvJmd0OworJmx0Oy9hcHBseSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmludm9rZXMgPGNvZGU+bHMgLWw8L2NvZGU+LCBhZGRpbmcgdGhlIGFic29sdXRlIGZpbGVuYW1lcyBvZiBhbGwKK2ZpbGVzIGJlbG93IDxjb2RlPi90bXA8L2NvZGU+IG5vdCBlbmRpbmcgaW4gPGNvZGU+LnR4dDwvY29kZT4gYW5kIGFsbAorZmlsZXMgb2YgdGhlIEZpbGVTZXQgd2l0aCA8Y29kZT5pZDwvY29kZT4gPGNvZGU+b3RoZXIuZmlsZXM8L2NvZGU+IHRvCit0aGUgY29tbWFuZCBsaW5lLjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7YXBwbHkgZXhlY3V0YWJsZT0mcXVvdDtzb21lY29tbWFuZCZxdW90OyBwYXJhbGxlbD0mcXVvdDtmYWxzZSZxdW90OyZndDsKKyAgJmx0O2FyZyB2YWx1ZT0mcXVvdDthcmcxJnF1b3Q7LyZndDsKKyAgJmx0O3NyY2ZpbGUvJmd0OworICAmbHQ7YXJnIHZhbHVlPSZxdW90O2FyZzImcXVvdDsvJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7L3RtcCZxdW90Oy8mZ3Q7CismbHQ7L2FwcGx5Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+aW52b2tlcyA8Y29kZT5zb21lY29tbWFuZCBhcmcxIFNPVVJDRUZJTEVOQU1FIGFyZzI8L2NvZGU+IGZvciBlYWNoCitmaWxlIGluIDxjb2RlPi90bXA8L2NvZGU+IHJlcGxhY2luZyBTT1VSQ0VGSUxFTkFNRSB3aXRoIHRoZSBhYnNvbHV0ZQorZmlsZW5hbWUgb2YgZWFjaCBmaWxlIGluIHR1cm4uIElmIDxjb2RlPnBhcmFsbGVsPC9jb2RlPiBoYWQgYmVlbiBzZXQKK3RvIHRydWUsIFNPVVJDRUZJTEVOQU1FIHdvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFic29sdXRlIGZpbGVuYW1lcworb2YgYWxsIGZpbGVzIHNlcGFyYXRlZCBieSBzcGFjZXMuPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthcHBseSBleGVjdXRhYmxlPSZxdW90O2NjJnF1b3Q7IGRlc3Q9JnF1b3Q7c3JjL0MmcXVvdDsgcGFyYWxsZWw9JnF1b3Q7ZmFsc2UmcXVvdDsmZ3Q7CisgICZsdDthcmcgdmFsdWU9JnF1b3Q7LWMmcXVvdDsvJmd0OworICAmbHQ7YXJnIHZhbHVlPSZxdW90Oy1vJnF1b3Q7LyZndDsKKyAgJmx0O3RhcmdldGZpbGUvJmd0OworICAmbHQ7c3JjZmlsZS8mZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmMvQyZxdW90OyBpbmNsdWRlcz0mcXVvdDsqLmMmcXVvdDsvJmd0OworICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7Z2xvYiZxdW90OyBmcm9tPSZxdW90OyouYyZxdW90OyB0bz0mcXVvdDsqLm8mcXVvdDsvJmd0OworJmx0Oy9hcHBseSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmludm9rZXMgPGNvZGU+Y2MgLWMgLW8gVEFSR0VURklMRSBTT1VSQ0VGSUxFPC9jb2RlPiBmb3IgZWFjaAorPGNvZGU+LmM8L2NvZGU+IGZpbGUgdGhhdCBpcyBuZXdlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCis8Y29kZT4ubzwvY29kZT4sIHJlcGxhY2luZyBUQVJHRVRGSUxFIHdpdGggdGhlIGFic29sdXRlIGZpbGVuYW1lIG9mCit0aGUgPGNvZGU+Lm88L2NvZGU+IGFuZCBTT1VSQ0VGSUxFIHdpdGggdGhlIGFic29sdXRlIG5hbWUgb2YgdGhlCis8Y29kZT4uYzwvY29kZT4gZmlsZS48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O21hcHBlciBpZD0mcXVvdDtvdXQmcXVvdDsgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7CisgICAgICAgICAgIGZyb209JnF1b3Q7c3JjJHtmaWxlLnNlcGFyYXRvcn0qLmZpbGUmcXVvdDsKKyAgICAgICAgICAgdG89JnF1b3Q7ZGVzdCR7ZmlsZS5zZXBhcmF0b3J9Ki5vdXQmcXVvdDsvJmd0OworCismbHQ7YXBwbHkgZXhlY3V0YWJsZT0mcXVvdDtwcm9jZXNzZmlsZSZxdW90OyBkZXN0PSZxdW90O2Rlc3QmcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmMmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7Ki5maWxlJnF1b3Q7LyZndDsKKyAgJmx0O21hcHBlciByZWZpZD0mcXVvdDtvdXQmcXVvdDsvJmd0OworICAmbHQ7cmVkaXJlY3RvciZndDsKKyAgICAmbHQ7b3V0cHV0bWFwcGVyIHJlZmlkPSZxdW90O291dCZxdW90Oy8mZ3Q7CisgICZsdDsvcmVkaXJlY3RvciZndDsKKyZsdDsvYXBwbHkmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CitBcHBsaWVzIHRoZSBmaWN0aXRpb3VzICZxdW90O3Byb2Nlc3NmaWxlJnF1b3Q7IGV4ZWN1dGFibGUgdG8gYWxsCitmaWxlcyBtYXRjaGluZyA8Y29kZT4qLmZpbGU8L2NvZGU+IGluIHRoZSA8Y29kZT5zcmM8L2NvZGU+IGRpcmVjdG9yeS4KK1RoZSA8Y29kZT5vdXQ8L2NvZGU+IDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBoYXMgYmVlbiBzZXQgdXAgdG8gbWFwCis8Y29kZT4qLmZpbGU8L2NvZGU+IHRvIDxjb2RlPioub3V0PC9jb2RlPiwgdGhlbiB0aGlzIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPgoraXMgdXNlZCB0byBzcGVjaWZ5IDxjb2RlPnRhcmdldGZpbGU8L2NvZGU+cyBmb3IgdGhpcyAmbHQ7YXBwbHkmZ3Q7Cit0YXNrLiAgQSByZWZlcmVuY2UgdG8gPGNvZGU+b3V0PC9jb2RlPiBpcyB0aGVuIHVzZWQgYXMgYW4KKzxjb2RlPiZsdDtvdXRwdXRtYXBwZXImZ3Q7PC9jb2RlPiBuZXN0ZWQgaW4gYSA8Y29kZT4mbHQ7cmVkaXJlY3RvciZndDs8L2NvZGU+LCB3aGljaCBpbiB0dXJuIGlzCituZXN0ZWQgYmVuZWF0aCB0aGlzIDxjb2RlPiZsdDthcHBseSZndDs8L2NvZGU+IGluc3RhbmNlLiAgVGhpcyBhbGxvd3MgdXMgdG8gcGVyZm9ybQorZGVwZW5kZW5jeSBjaGVja2luZyBhZ2FpbnN0IG91dHB1dCBmaWxlcy0tdGhlIHRhcmdldCBmaWxlcyBpbiB0aGlzIGNhc2UuCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2FwcGx5IGV4ZWN1dGFibGU9ImxzIiBwYXJhbGxlbD0idHJ1ZSIKKyAgICAgICBmb3JjZT0idHJ1ZSIgZGVzdD0iJHtiYXNlZGlyfSIgYXBwZW5kPSJ0cnVlIiB0eXBlPSJib3RoIiZndDsKKyAgJmx0O3BhdGgmZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7ZW52LlBBVEh9Ii8mZ3Q7CisgICZsdDsvcGF0aCZndDsKKyAgJmx0O2lkZW50aXR5bWFwcGVyLyZndDsKKyZsdDsvYXBwbHkmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CitBcHBsaWVzIHRoZSAibHMiIGV4ZWN1dGFibGUgdG8gYWxsIGRpcmVjdG9yaWVzIGluIHRoZSBQQVRILCBlZmZlY3RpdmVseQorbGlzdGluZyBhbGwgZXhlY3V0YWJsZXMgdGhhdCBhcmUgYXZhaWxhYmxlIG9uIHRoZSBQQVRILgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2FwcGx5IGV4ZWN1dGFibGU9ImpzbWluIiBhZGRzb3VyY2VmaWxlPSJmYWxzZSImZ3Q7CisgICAgJmx0OyEtLSBDb2xsZWN0IHRoZSBKUy1maWxlcyAtLSZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9InNyYyIgaW5jbHVkZXM9IiouanMiLyZndDsKKyAgICAmbHQ7cmVkaXJlY3RvciZndDsKKyAgICAgICAgJmx0OyEtLSByZWRpcmVjdCBTVERJTjsgZmlsZXNldCBjb2xsZWN0cyByZWxhdGl2ZSB0byBpdHMgZGlyLCBidXQgd2UgbmVlZCAtLSZndDsKKyAgICAgICAgJmx0OyEtLSByZWxhdGl2ZSB0byBiYXNlZGlyIC0tJmd0OworICAgICAgICAmbHQ7aW5wdXRtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKiIgdG89InNyYy8qIi8mZ3Q7CisgICAgICAgICZsdDshLS0gcmVkaXJlY3QgU1RET1VUIHRvIGZpbGUgaW4gZGVzdC1kaXIgLS0mZ3Q7CisgICAgICAgICZsdDtvdXRwdXRtYXBwZXIgaWQ9Im91dCIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5qcyIgdG89ImRlc3QvKi5qcyIvJmd0OworICAgICZsdDsvcmVkaXJlY3RvciZndDsKKyZsdDsvYXBwbHkmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CitDb252ZXJzaW9uIG9mIHRoZSBjb21tYW5kIDxjb2RlPmpzbWluICZsdDsgc3JjL2EuanMgJmd0OyBkZXN0L2EuanM8L2NvZGU+IGJ1dCBmb3IKK2FsbCBmaWxlcyBpbiB0aGUgc3JjLWRpcmVjdG9yeS4gQmVjYXVzZSB0aGUgZmlsZW5hbWUgaXRzZWxmIHNob3VsZCBub3QgYmUgcGFzc2VkCit0byB0aGUgPGNvZGU+anNtaW48L2NvZGU+IHByb2dyYW0sIHRoZSA8Y29kZT5hZGRzb3VyY2VmaWxlPC9jb2RlPiBpcyBzZXQgdG8KKzxjb2RlPmZhbHNlPC9jb2RlPi4KKworCisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9hcHQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9hcHQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTNjYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2FwdC5odG1sCkBAIC0wLDAgKzEsMTgzIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCBsYW5nPSJlbi11cyI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5BcHQgVGFzazwvdGl0bGU+PC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9IkFwdCI+QXB0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+UnVucyB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgdG9vbCAoYXB0KSwgYW5kIHRoZW4gb3B0aW9uYWxseSBjb21waWxlcworICAgdGhlIG9yaWdpbmFsIGNvZGUsIGFuZCBhbnkgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlLiBUaGlzIHRhc2sgcmVxdWlyZXMgSmF2YSAxLjUuCisgICBJdCBtYXkgd29yayBvbiBsYXRlciB2ZXJzaW9ucywgYnV0IHRoaXMgY2Fubm90IGJlIGNvbmZpcm1lZCB1bnRpbCB0aG9zZQorICAgdmVyc2lvbnMgc2hpcC4gQmUgYWR2aXNlZCB0aGF0IHRoZSBBcHQgdG9vbCBkb2VzIGFwcGVhciB0byBiZSBhbiB1bnN0YWJsZQorICAgcGFydCBvZiB0aGUgSkRLIGZyYW1ld29yaywgc28gbWF5IGNoYW5nZSByYWRpY2FsbHkgaW4gZnV0dXJlIHZlcnNpb25zLiAKKyAgIEluIHBhcnRpY3VsYXIgaXQgaXMgbGlrZWx5IHRvIGJlIG9ic29sZXRlIGluIEpESyA2LCB3aGljaCBjYW4gcnVuIGFubm90YXRpb24KKyAgIHByb2Nlc3NvcnMgYXMgcGFydCBvZiBqYXZhYy4KKyAgIElmIHRoZSAmbHQ7YXB0Jmd0OyB0YXNrIGRvZXMgYnJlYWsgd2hlbiB1cGdyYWRpbmcgSlZNLCBwbGVhc2UKKyAgIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgQW50IHRoYXQgdHJhY2tzCisgICBhbnkgY2hhbmdlcy48L3A+CisKKworPHA+VGhpcyB0YXNrIGluaGVyaXRzIGZyb20gdGhlIDxhIGhyZWY9ImphdmFjLmh0bWwiPkphdmFjIFRhc2s8L2E+LCBhbmQgdGh1cworICAgc3VwcG9ydHMgbmVhcmx5IGFsbCBvZiB0aGUgc2FtZSBhdHRyaWJ1dGVzLCBhbmQgc3ViZWxlbWVudHMuICAKKyAgIFRoZXJlIGlzIG9uZSBzcGVjaWFsIGNhc2UsIHRoZSA8dHQ+Zm9yazwvdHQ+IGF0dHJpYnV0ZSwgd2hpY2ggaXMgcHJlc2VudAorICAgYnV0IHdoaWNoIGNhbiBvbmx5IGJlIHNldCB0byA8dHQ+dHJ1ZTwvdHQ+LiBUaGF0IGlzLCBhcHQgb25seSB3b3JrcyBhcworICAgYSBmb3JrZWQgcHJvY2Vzcy4KKyA8L3A+CisgPHA+CisgICBJbiBhZGRpdGlvbiwgaXQgc3VwcG9ydHMKKyAgIHRoZSBmb2xsb3dpbmcgYWRkaXRpb24gaXRlbXM6PC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dGJvZHk+PHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcGlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BZnRlciBydW5uaW5nIHRoZSBBcHQsIHNob3VsZCB0aGUgY29kZSBiZSBjb21waWxlZC4gIChzZWUgdGhlCisgICAgICAgICAgICAgICAgICAgICA8Y29kZT4tbm9jb21waWxlPC9jb2RlPiBmbGFnIG9uIHRoZSBBcHQgZXhlY3V0YWJsZSk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhY3Rvcnk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIEFubm90YXRpb25Qcm9jZXNzRmFjdG9yeSB0byBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgICB0byBjb25zdHJ1Y3QgYW5ub3RhdGlvbiBwcm9jZXNzb3JzLiAgVGhpcyByZXByZXNlbnRzIHRoZSA8Y29kZT4tZmFjdG9yeTwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbGluZSBmbGFnIG9mIHRoZSBBcHQgZXhlY3V0YWJsZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWN0b3J5cGF0aHJlZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmVmZXJlbmNlIGlkIG9mIHRoZSBwYXRoIHVzZWQgdG8gZmluZCB0aGUgY2xhc3NlcyBuZWVkZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSAoYW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmFjdG9yeSBpdHNlbGYpLgorICAgICAgICAgICAgICAgICAgICAgVGhpcyByZXByZXNlbnRzIHRoZSA8Y29kZT4tZmFjdG9yeXBhdGg8L2NvZGU+IGZsYWcgb24gdGhlIEFwdCBleGVjdXRhYmxlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByZXByb2Nlc3NkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB1c2VkIGZvciBwcmVwcm9jZXNzaW5nLiAgVGhpcyBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIHdpbGwgYmUgcGxhY2UuICBUaGlzIHJlcHJlc2VudHMgdGhlIDxjb2RlPi1zPC9jb2RlPiBmbGFnIG9uCisgICAgICAgICAgICAgICAgICAgICB0aGUgQXB0IGV4ZWN1dGFibGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGJvZHk+PC90YWJsZT4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKworPGg0PmZhY3RvcnlwYXRoPC9oND4KKworPHA+WW91IGNhbiBzcGVjaWZ5IHRoZSBwYXRoIHVzZWQgdG8gZmluZCB0aGUgY2xhc3NlcyBuZWVkZWQgYnkgdGhlIEFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5CisgICBhdCBydW50aW1lLCB1c2luZyB0aGlzIGVsZW1lbnQuICBJdCBpcyByZXByZXNlbnRzIGFzIGEgZ2VuZXJpYyBwYXRoIGxpa2Ugc3RydWN0dXJlLiAgVGhpcworICAgcmVwcmVzZW50cyB0aGUgPGNvZGU+LWZhY3RvcnlwYXRoPC9jb2RlPiBmbGFnIG9uIHRoZSBBcHQgZXhlY3V0YWJsZS48L3A+CisKKworPGg0Pm9wdGlvbjwvaDQ+CisKKzxwPlVzZWQgdG8gcmVwcmVzZW50IGEgZ2VuZXJpYyBvcHRpb24gdG8gcGFzcyB0byBBcHQuICBUaGlzIHJlcHJlc2VudHMgdGhlIDxjb2RlPi1BPC9jb2RlPiBmbGFnIG9uIHRoZQorICAgQXB0IGV4ZWN1dGFibGUuICBZb3UgY2FuIHNwZWNpZnkgemVybyBvciBtb3JlIDxjb2RlPiZsdDtvcHRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGJvZHk+PHRyPgorICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMiUiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3OCUiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwJSI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5UaGUgbmFtZSBvZiB0aGUgb3B0aW9uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+VGhlIHZhbHVlIHRvIHNldCB0aGUgb3B0aW9uIHRvPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLjwvdGQ+CisgIDwvdHI+Cis8L3Rib2R5PjwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2FwdCBzcmNkaXI9IiR7c3JjfSIKKyAgICAgZGVzdGRpcj0iJHtidWlsZH0iCisgICAgIGNsYXNzcGF0aD0ieHl6LmphciIKKyAgICAgZGVidWc9Im9uIgorICAgICBjb21waWxlPSJ0cnVlIgorICAgICBmYWN0b3J5PSJjb20ubXljb20uTXlBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSIKKyAgICAgZmFjdG9yeXBhdGhyZWY9Im15LmZhY3RvcnlwYXRoLmlkIgorICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSImZ3Q7CismbHQ7L2FwdCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KK2RpcmVjdG9yeSwgYW5kIHN0b3JlcwordGhlIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuCitUaGUgY2xhc3NwYXRoIHVzZWQgaW5jbHVkZXMgPGNvZGU+eHl6LmphcjwvY29kZT4sIGFuZCBjb21waWxpbmcgd2l0aAorZGVidWcgaW5mb3JtYXRpb24gaXMgb24uICBJdCBhbHNvIGZvcmNlcyB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIHRvCitiZSBjb21waWxlZC4gIFRoZSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgd2lsbCBiZSBwbGFjZWQgaW4KKzxjb2RlPiR7cHJlcHJvY2Vzcy5kaXJ9PC9jb2RlPiBkaXJlY3RvcnksIHVzaW5nIHRoZSBjbGFzcworPGNvZGU+Y29tLm15Y29tLk15QW5ub3RhdGlvblByb2Nlc3NvckZhY3Rvcnk8L2NvZGU+IHRvIHN1cHBseQorQW5ub3RhdGlvblByb2Nlc3NvciBpbnN0YW5jZXMuPC9wPgorCisKKzxoMz5Ob3RlczwvaDM+CisKKzxwPgorVGhlIGluaGVyaXRlZCAiZm9yayIgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQ7IHBsZWFzZSBkbyBub3QgY2hhbmdlIGl0LgorPC9wPgorCis8cD4KK1RoZSBpbmhlcml0ZWQgImNvbXBpbGVyIiBhdHRyaWJ1dGUgaXMgaWdub3JlZCwgYXMgaXQgaXMgZm9yY2VkIHRvIHVzZSB0aGUgQXB0IGNvbXBpbGVyCis8L3A+CisKKzxwPlVzaW5nIHRoZSBBcHQgY29tcGlsZXIgd2l0aCB0aGUgImNvbXBpbGUiIG9wdGlvbiBzZXQgdG8gInRydWUiCisgICBmb3JjZXMgeW91IHRvIHVzZSBTdW4ncyBBcHQgY29tcGlsZXIsIHdoaWNoIHdpbGwgdXNlIHRoZSBKREsncyBKYXZhYyBjb21waWxlci4KKyAgIElmIHlvdSB3aXNoIHRvIHVzZSBhbm90aGVyIGNvbXBpbGVyLCB5b3Ugd2lsbCBmaXJzdCBuZWVkIHJ1biB0aGUgQXB0IHByb2Nlc3NvcgorICAgd2l0aCB0aGUgImNvbXBpbGUiIGZsYWcgc2V0IHRvICJmYWxzZSIsIGFuZCB0aGVuIHVzZSBhCisgICA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrIHRvIGNvbXBpbGUgZmlyc3QgeW91ciBvcmlnaW5hbCBzb3VyY2UgY29kZSwgYW5kIHRoZW4gdGhlCisgICBnZW5lcmF0ZWQgc291cmNlIGNvZGU6PC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2FwdCBzcmNkaXI9IiR7c3JjfSIKKyAgICAgZGVzdGRpcj0iJHtidWlsZH0iCisgICAgIGNsYXNzcGF0aD0ieHl6LmphciIKKyAgICAgZGVidWc9InRydWUiCisgICAgIGNvbXBpbGU9ImZhbHNlIgorICAgICBmYWN0b3J5PSJjb20ubXljb20uTXlBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSIKKyAgICAgZmFjdG9yeXBhdGhyZWY9Im15LmZhY3RvcnlwYXRoLmlkIgorICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSImZ3Q7CismbHQ7L2FwdCZndDsKKworJmx0O2phdmFjIHNyY2Rpcj0iJHtzcmN9IgorICAgICAgIGRlc3RkaXI9IiR7YnVpbGR9IgorICAgICAgIGNsYXNzcGF0aD0ieHl6LmphciIKKyAgICAgICBkZWJ1Zz0ib24iLyZndDsKKworJmx0O2phdmFjIHNyY2Rpcj0iJHtwcmVwcm9jZXNzLmRpcn0iCisgICAgICAgZGVzdGRpcj0iJHtidWlsZH0iCisgICAgICAgY2xhc3NwYXRoPSJ4eXouamFyIgorICAgICAgIGRlYnVnPSJ0cnVlIi8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK1RoaXMgbWF5IGludm9sdmUgbW9yZSBidWlsZCBmaWxlIGNvZGluZywgYnV0IHRoZSBzcGVlZHVwIGdhaW5lZCBmcm9tIHN3aXRjaGluZwordG8gamlrZXMgbWF5IGp1c3RpZnkgdGhlIGVmZm9ydC4KKzxwPgorPC9wPgorCis8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2F2YWlsYWJsZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2F2YWlsYWJsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNGExNzEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvYXZhaWxhYmxlLmh0bWwKQEAgLTAsMCArMSwxNjAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+QXZhaWxhYmxlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImF2YWlsYWJsZSI+QXZhaWxhYmxlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+U2V0cyBhIHByb3BlcnR5IGlmIGEgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuIFRoaXMgcmVzb3VyY2UgY2FuIGJlIGEKK2ZpbGUsIGEgZGlyZWN0b3J5LCBhIGNsYXNzIGluIHRoZSBjbGFzc3BhdGgsIG9yIGEgSlZNIHN5c3RlbSByZXNvdXJjZS48L3A+Cis8cD5JZiB0aGUgcmVzb3VyY2UgaXMgcHJlc2VudCwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCB0byB0cnVlIGJ5CitkZWZhdWx0OyBvdGhlcndpc2UsIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LiBZb3UgY2FuIHNldCB0aGUgdmFsdWUgdG8KK3NvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJ5IHNwZWNpZnlpbmcgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgorPHA+Tm9ybWFsbHksIHRoaXMgdGFzayBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWZ1bCB0byBhdm9pZCB0YXJnZXQKK2V4ZWN1dGlvbiBkZXBlbmRpbmcgb24gc3lzdGVtIHBhcmFtZXRlcnMuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8uIERlZmF1bHRzIHRvICZxdW90O3RydWUmcXVvdDsuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzcyB0byBsb29rIGZvciBpbiB0aGUgY2xhc3NwYXRoLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIzIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIGxvb2sgZm9yLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlc291cmNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSByZXNvdXJjZSB0byBsb29rIGZvciBpbiB0aGUgSlZNLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgPGNvZGU+Y2xhc3NuYW1lPC9jb2RlPiBvciA8Y29kZT5yZXNvdXJjZTwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXBhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCA8Y29kZT5maWxlPC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50eXBlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB0eXBlIG9mIDxjb2RlPmZpbGU8L2NvZGU+IHRvIGxvb2sgZm9yLCBlaXRoZXIgYSBkaXJlY3RvcnkgKDxjb2RlPnR5cGU9JnF1b3Q7ZGlyJnF1b3Q7PC9jb2RlPikgb3IgYSBmaWxlCisgICAgICAoPGNvZGU+dHlwZT0mcXVvdDtmaWxlJnF1b3Q7PC9jb2RlPikuIElmIG5vdCBzZXQsIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpZiB0aGUgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmZpbGU8L2NvZGU+CisgICAgICBhdHRyaWJ1dGUgZXhpc3RzIGFzIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3Jlc3lzdGVtY2xhc3NlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZ25vcmUgQW50J3MgcnVudGltZSBjbGFzc2VzLCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQKKyAgICAgIGNsYXNzcGF0aC4gIE9ubHkgYWZmZWN0cyB0aGUgImNsYXNzbmFtZSIgYXR0cmlidXRlLiAgRGVmYXVsdHMgdG8gJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZWFyY2hwYXJlbnRzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgY29udGFpbnMgdGhlIGJlaGF2aW91ciBvZiB0aGUgImZpbGUiIHR5cGUuCisgICAgICBJZiB0cnVlLCB0aGUgYXZhaWxhYmxlIHRhc2sgd2lsbCwgd2hlbgorICAgICAgc2VhcmNoaW5nIGZvciBhIGZpbGUsIHNlYXJjaCBub3Qgb25seSB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ1dAorICAgICAgd2lsbCBhbHNvIHNlYXJjaCB0aGUgcGFyZW50IGRpcmVjdG9yaWVzIG9mIHRob3NlCisgICAgICBzcGVjaWZpZWQuCisgICAgICBJZiBmYWxzZSwgb25seSB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIHdpbGwgYmUgc2VhcmNoZWQuCisgICAgICBEZWZhdWx0cyB0byAiZmFsc2UiLgorICAgICAgPGVtPlNpbmNlIEFudCAxLjc8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8aDQ+Y2xhc3NwYXRoPC9oND4KKzxwPjxjb2RlPkF2YWlsYWJsZTwvY29kZT4ncyA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGF0dHJpYnV0ZSBpcyBhIDxhCitocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmU8L2E+IGFuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIGEgbmVzdGVkCis8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudC48L3A+Cis8aDQ+ZmlsZXBhdGg8L2g0PgorPHA+PGNvZGU+QXZhaWxhYmxlPC9jb2RlPidzIDxjb2RlPmZpbGVwYXRoPC9jb2RlPiBhdHRyaWJ1dGUgaXMgYSA8YQoraHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZAorPGNvZGU+Jmx0O2ZpbGVwYXRoJmd0OzwvY29kZT4gZWxlbWVudC48L3A+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthdmFpbGFibGUgY2xhc3NuYW1lPSZxdW90O29yZy53aGF0ZXZlci5NeWNsYXNzJnF1b3Q7IHByb3BlcnR5PSZxdW90O015Y2xhc3MucHJlc2VudCZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5zZXRzIHRoZSA8Y29kZT5NeWNsYXNzLnByZXNlbnQ8L2NvZGU+IHByb3BlcnR5IHRvIHRoZSB2YWx1ZSAmcXVvdDt0cnVlJnF1b3Q7CitpZiB0aGUgY2xhc3MgPGNvZGU+b3JnLndoYXRldmVyLk15Y2xhc3M8L2NvZGU+IGlzIGZvdW5kIGluIEFudCdzIGNsYXNzcGF0aC48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7amF4cC5qYXImcXVvdDsgdmFsdWU9JnF1b3Q7Li9saWIvamF4cDExL2pheHAuamFyJnF1b3Q7LyZndDsKKyZsdDthdmFpbGFibGUgZmlsZT0mcXVvdDske2pheHAuamFyfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDtqYXhwLmphci5wcmVzZW50JnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPnNldHMgdGhlIDxjb2RlPmpheHAuamFyLnByZXNlbnQ8L2NvZGU+IHByb3BlcnR5IHRvIHRoZSB2YWx1ZSAmcXVvdDt0cnVlJnF1b3Q7CitpZiB0aGUgZmlsZSA8Y29kZT4uL2xpYi9qYXhwMTEvamF4cC5qYXI8L2NvZGU+IGlzIGZvdW5kLjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7YXZhaWxhYmxlIGZpbGU9JnF1b3Q7L3Vzci9sb2NhbC9saWImcXVvdDsgdHlwZT0mcXVvdDtkaXImcXVvdDsKKyAgICAgICAgICAgcHJvcGVydHk9JnF1b3Q7bG9jYWwubGliLnByZXNlbnQmcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+c2V0cyB0aGUgPGNvZGU+bG9jYWwubGliLnByZXNlbnQ8L2NvZGU+IHByb3BlcnR5IHRvIHRoZSB2YWx1ZSAmcXVvdDt0cnVlJnF1b3Q7CitpZiB0aGUgZGlyZWN0b3J5IDxjb2RlPi91c3IvbG9jYWwvbGliPC9jb2RlPiBpcyBmb3VuZC48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorLi4uaW4gcHJvamVjdCAuLi4KKyZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2pheHAuamFyJnF1b3Q7IHZhbHVlPSZxdW90Oy4vbGliL2pheHAxMS9qYXhwLmphciZxdW90Oy8mZ3Q7CismbHQ7cGF0aCBpZD0mcXVvdDtqYXhwJnF1b3Q7IGxvY2F0aW9uPSZxdW90OyR7amF4cC5qYXJ9JnF1b3Q7LyZndDsKKy4uLmluIHRhcmdldCAuLi4KKyZsdDthdmFpbGFibGUgY2xhc3NuYW1lPSZxdW90O2phdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXImcXVvdDsKKyAgICAgICAgICAgY2xhc3NwYXRocmVmPSZxdW90O2pheHAmcXVvdDsgcHJvcGVydHk9JnF1b3Q7amF4cDExLnByZXNlbnQmcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+c2V0cyB0aGUgPGNvZGU+amF4cDExLnByZXNlbnQ8L2NvZGU+IHByb3BlcnR5IHRvIHRoZSB2YWx1ZSAmcXVvdDt0cnVlJnF1b3Q7CitpZiB0aGUgY2xhc3MgPGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjwvY29kZT4gaXMgZm91bmQgaW4gdGhlIGNsYXNzcGF0aCByZWZlcmVuY2VkIGJ5IDxjb2RlPmpheHA8L2NvZGU+IChpbiB0aGlzIGNhc2UsIDxjb2RlPi4vbGliL2pheHAxMS9qYXhwLmphcjwvY29kZT4pLgorPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthdmFpbGFibGUgcHJvcGVydHk9JnF1b3Q7aGF2ZS5leHRyYXMmcXVvdDsgcmVzb3VyY2U9JnF1b3Q7ZXh0cmF0YXNrcy5wcm9wZXJ0aWVzJnF1b3Q7Jmd0OworICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDsvdXNyL2xvY2FsL2FudC9leHRyYS5qYXImcXVvdDsgLyZndDsKKyZuYnNwOyZuYnNwOyZsdDsvY2xhc3NwYXRoJmd0OworJmx0Oy9hdmFpbGFibGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5zZXRzIHRoZSA8Y29kZT5oYXZlLmV4dHJhczwvY29kZT4gcHJvcGVydHkgdG8gdGhlIHZhbHVlICZxdW90O3RydWUmcXVvdDsKK2lmIHRoZSByZXNvdXJjZS1maWxlIDxjb2RlPmV4dHJhdGFza3MucHJvcGVydGllczwvY29kZT4gaXMgZm91bmQuCis8L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvYmFzZW5hbWUuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9iYXNlbmFtZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MjJkOGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvYmFzZW5hbWUuaHRtbApAQCAtMCwwICsxLDkyIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkJhc2VuYW1lIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImVjaG8iPkJhc2VuYW1lPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+CitUYXNrIHRvIGRldGVybWluZSB0aGUgYmFzZW5hbWUgb2YgYSBzcGVjaWZpZWQgZmlsZSwgb3B0aW9uYWxseSBtaW51cyBhCitzcGVjaWZpZWQgc3VmZml4LgorPC9wPgorPHA+CitXaGVuIHRoaXMgdGFzayBleGVjdXRlcywgaXQgd2lsbCBzZXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB0byB0aGUKK3ZhbHVlIG9mIHRoZSBsYXN0IHBhdGggZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuIElmIDxjb2RlPmZpbGU8L2NvZGU+IGlzIGEKK2RpcmVjdG9yeSwgdGhlIGJhc2VuYW1lIHdpbGwgYmUgdGhlIGxhc3QgZGlyZWN0b3J5IGVsZW1lbnQuIElmCis8Y29kZT5maWxlPC9jb2RlPiBpcyBhIGZ1bGwtcGF0aCwgcmVsYXRpdmUtcGF0aCwgb3Igc2ltcGxlIGZpbGVuYW1lLAordGhlIGJhc2VuYW1lIHdpbGwgYmUgdGhlIHNpbXBsZSBmaWxlIG5hbWUsIHdpdGhvdXQgYW55IGRpcmVjdG9yeSBlbGVtZW50cy4KKzwvcD4KKzxwPiAKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhdGggdG8gdGFrZSB0aGUgYmFzZW5hbWUgb2YuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN1ZmZpeDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc3VmZml4IHRvIHJlbW92ZSBmcm9tIHRoZSByZXN1bHRpbmcgYmFzZW5hbWUKKyAgICAgIChzcGVjaWZpZWQgZWl0aGVyIHdpdGggb3Igd2l0aG91dCB0aGUgJnF1b3Q7PGNvZGU+LjwvY29kZT4mcXVvdDspLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtiYXNlbmFtZSBwcm9wZXJ0eT0mcXVvdDtqYXIuZmlsZW5hbWUmcXVvdDsgZmlsZT0mcXVvdDske2xpYi5qYXJmaWxlfSZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cit3aWxsIHNldCA8Y29kZT5qYXIuZmlsZW5hbWU8L2NvZGU+IHRvCis8Y29kZT5teWphci5qYXI8L2NvZGU+LCBpZiA8Y29kZT5saWIuamFyZmlsZTwvY29kZT4gaXMgZGVmaW5lZCBhcyBlaXRoZXIgYQorZnVsbC1wYXRoIGZpbGVuYW1lIChlZy4sIDxjb2RlPi91c3IvbG9jYWwvbGliL215amFyLmphcjwvY29kZT4pLAorYSByZWxhdGl2ZS1wYXRoIGZpbGVuYW1lIChlZy4sIDxjb2RlPmxpYi9teWphci5qYXI8L2NvZGU+KSwKK29yIGEgc2ltcGxlIGZpbGVuYW1lIChlZy4sIDxjb2RlPm15amFyLmphcjwvY29kZT4pLgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtiYXNlbmFtZSBwcm9wZXJ0eT0mcXVvdDtjbWRuYW1lJnF1b3Q7IGZpbGU9JnF1b3Q7RDovdXNyL2xvY2FsL2Zvby5leGUmcXVvdDsKKyAgICAgICAgICBzdWZmaXg9JnF1b3Q7LmV4ZSZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cit3aWxsIHNldCA8Y29kZT5jbWRuYW1lPC9jb2RlPiB0byA8Y29kZT5mb288L2NvZGU+LgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtwcm9wZXJ0eSBlbnZpcm9ubWVudD0mcXVvdDtlbnYmcXVvdDsvJmd0OworJmx0O2Jhc2VuYW1lIHByb3BlcnR5PSZxdW90O3RlbXAuZGlybmFtZSZxdW90OyBmaWxlPSZxdW90OyR7ZW52LlRFTVB9JnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKword2lsbCBzZXQgPGNvZGU+dGVtcC5kaXJuYW1lPC9jb2RlPiB0byB0aGUgbGFzdCBkaXJlY3RvcnkgZWxlbWVudCBvZgordGhlIHBhdGggZGVmaW5lZCBmb3IgdGhlIDxjb2RlPlRFTVA8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLjwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2J1aWxkbnVtYmVyLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvYnVpbGRudW1iZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFlNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2J1aWxkbnVtYmVyLmh0bWwKQEAgLTAsMCArMSw3NCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5CdWlsZE51bWJlciBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJidWlsZG51bWJlciI+QnVpbGROdW1iZXI8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5UaGlzIGlzIGEgYmFzaWMgdGFzayB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNrIGJ1aWxkIG51bWJlcnMuPC9wPgorPHA+SXQgd2lsbCBmaXJzdCBhdHRlbXB0IHRvIHJlYWQgYSBidWlsZCBudW1iZXIgZnJvbSBhIGZpbGUgKGJ5IGRlZmF1bHQsCis8Y29kZT5idWlsZC5udW1iZXI8L2NvZGU+IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSksIHRoZW4KK3NldCB0aGUgcHJvcGVydHkgPGNvZGU+YnVpbGQubnVtYmVyPC9jb2RlPiB0byB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZCBpbgorKG9yIHRvIDxjb2RlPjA8L2NvZGU+LCBpZiBubyBzdWNoIHZhbHVlKS4gSXQgd2lsbCB0aGVuIGluY3JlbWVudCB0aGUKK251bWJlciBieSBvbmUgYW5kIHdyaXRlIGl0IGJhY2sgb3V0IHRvIHRoZSBmaWxlLgorKFNlZSB0aGUKKzxhIGhyZWY9Ii4uL09wdGlvbmFsVGFza3MvcHJvcGVydHlmaWxlLmh0bWwiPlByb3BlcnR5RmlsZTwvYT4gdGFzaworaWYgeW91IG5lZWQgZmluZXIgY29udHJvbCBvdmVyIHRoaW5ncyBzdWNoIGFzIHRoZSBwcm9wZXJ0eSBuYW1lIG9yCit0aGUgbnVtYmVyIGZvcm1hdC4pCis8L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgdG8gcmVhZCBhbmQgd3JpdGUgdGhlIGJ1aWxkIG51bWJlciBmcm9tL3RvLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdHMgdG8gJnF1b3Q7YnVpbGQubnVtYmVyJnF1b3Q7PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2J1aWxkbnVtYmVyLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+UmVhZCwgaW5jcmVtZW50LCBhbmQgd3JpdGUgYSBidWlsZCBudW1iZXIgdG8gdGhlIGRlZmF1bHQgZmlsZSwKKzxjb2RlPmJ1aWxkLm51bWJlcjwvY29kZT4uPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2J1aWxkbnVtYmVyIGZpbGU9JnF1b3Q7bXlidWlsZC5udW1iZXImcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5SZWFkLCBpbmNyZW1lbnQsIGFuZCB3cml0ZSBhIGJ1aWxkIG51bWJlciB0byB0aGUgZmlsZQorPGNvZGU+bXlidWlsZC5udW1iZXI8L2NvZGU+LjwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NoYW5nZWxvZy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NoYW5nZWxvZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YThmNTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY2hhbmdlbG9nLmh0bWwKQEAgLTAsMCArMSwyNDQgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Q2hhbmdlTG9nIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImNoYW5nZWxvZyI+Q3ZzQ2hhbmdlTG9nPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+R2VuZXJhdGVzIGFuIFhNTC1mb3JtYXR0ZWQgcmVwb3J0IGZpbGUgb2YgdGhlIGNoYW5nZSBsb2dzIHJlY29yZGVkIGluIGEKKzxhIGhyZWY9Imh0dHA6Ly93d3cubm9uZ251Lm9yZy9jdnMvIiB0YXJnZXQ9Il90b3AiPkNWUzwvYT4gcmVwb3NpdG9yeS4gPC9wPgorPHA+PGI+SW1wb3J0YW50OjwvYj4gVGhpcyB0YXNrIG5lZWRzICJjdnMiIG9uIHRoZSBwYXRoLiBJZiBpdCBpc24ndCwgeW91IHdpbGwgZ2V0CithbiBlcnJvciAoc3VjaCBhcyBlcnJvciAyIG9uIHdpbmRvd3MpLiBJZiA8Y29kZT4mbHQ7Y3ZzJmd0OzwvY29kZT4gZG9lc24ndCB3b3JrLCB0cnkgdG8gZXhlY3V0ZSBjdnMuZXhlCitmcm9tIHRoZSBjb21tYW5kIGxpbmUgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkgaW4gd2hpY2ggeW91IGFyZSB3b3JraW5nLgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBjb2xzcGFuPSIzIj5BdHRyaWJ1dGVzIGZyb20gcGFyZW50IEN2cyB0YXNrIHdoaWNoIGFyZSBtZWFuaW5nZnVsIGhlcmU8YnI+CisgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUm9vdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgPGNvZGU+Q1ZTUk9PVDwvY29kZT4gdmFyaWFibGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUnNoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8Y29kZT5DVlNfUlNIPC9jb2RlPiB2YXJpYWJsZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYWNrYWdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBwYWNrYWdlL21vZHVsZSB0byBjaGVjayBvdXQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Qb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgcG9ydCAyNDAxLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3NmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlBhc3N3b3JkIGZpbGUgdG8gcmVhZCBwYXNzd29yZHMgZnJvbS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgZmlsZSA8Y29kZT5+Ly5jdnNwYXNzPC9jb2RlPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYQorICAgICAgcmV0dXJuIGNvZGUgb3RoZXIgdGhhbiA8Y29kZT4wPC9jb2RlPi4gRGVmYXVsdHMgdG8gZmFsc2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50YWc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cXVlcnkgdGhlIGNoYW5nZWxvZyBmb3IgYSBzcGVjaWZpYyBicmFuY2guPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBjb2xzcGFuPSIzIj5TcGVjaWZpYyBhdHRyaWJ1dGVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBydW4gdGhlIENWUyA8ZW0+bG9nPC9lbT4KKyAgICAgY29tbWFuZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHRzIHRvICR7YmFzZWRpcn0uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgaW4gd2hpY2ggdG8gd3JpdGUgdGhlIGNoYW5nZSBsb2cgcmVwb3J0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2Vyc2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIG5hbWUtdmFsdWUgcGFpcnMgbWFwcGluZworICAgICB1c2VyIElEcyBhbmQgbmFtZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcmVwb3J0IGluIHBsYWNlIG9mCisgICAgIHRoZSB1c2VyIElELjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRheXNpbnBhc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgbnVtYmVyIG9mIGRheXMgaW50byB0aGUgcGFzdCBmb3Igd2hpY2ggdGhlCisgICAgIGNoYW5nZSBsb2cgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHJldHJpZXZlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdGFydDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZWFybGllc3QgZGF0ZSBmcm9tIHdoaWNoIGNoYW5nZSBsb2dzIGFyZSB0byBiZQorICAgICBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbGF0ZXN0IGRhdGUgdG8gd2hpY2ggY2hhbmdlIGxvZ3MgYXJlIHRvIGJlCisgICAgIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0PjxhIG5hbWU9InVzZXIiPnVzZXI8L2E+PC9oND4KKzxwPlRoZSBuZXN0ZWQgPGNvZGU+Jmx0O3VzZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhCittYXBwaW5nIGJldHdlZW4gYSB1c2VyIElEIGFzIGl0IGFwcGVhcnMgb24gdGhlIENWUyBzZXJ2ZXIgYW5kIGEgbmFtZSB0bworaW5jbHVkZSBpbiB0aGUgZm9ybWF0dGVkIHJlcG9ydC4KK0FueXRpbWUgdGhlIHNwZWNpZmllZCB1c2VyIElEIGhhcyBtYWRlIGEgY2hhbmdlIGluIHRoZSByZXBvc2l0b3J5LCB0aGUKKzxjb2RlPiZsdDthdXRob3ImZ3Q7PC9jb2RlPiB0YWcgaW4gdGhlIHJlcG9ydCBmaWxlIHdpbGwgaW5jbHVkZQordGhlIG5hbWUgc3BlY2lmaWVkIGluIDxjb2RlPmRpc3BsYXluYW1lPC9jb2RlPiByYXRoZXIgdGhhbiB0aGUgdXNlciBJRC4KKzwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlzcGxheW5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgdG8gYmUgdXNlZCBpbiB0aGUgQ1ZTIGNoYW5nZSBsb2cgcmVwb3J0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2VyaWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHVzZXJpZCBvZiB0aGUgcGVyc29uIGFzIGl0IGV4aXN0cyBvbiB0aGUgQ1ZTIHNlcnZlci4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7Y3ZzY2hhbmdlbG9nIGRpcj0mcXVvdDtkdmUvbmV0d29yayZxdW90OworICAgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O2NoYW5nZWxvZy54bWwmcXVvdDsKKyAgLyZndDs8L3ByZT4KKworPHA+R2VuZXJhdGVzIGEgY2hhbmdlIGxvZyByZXBvcnQgZm9yIGFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlCit1bmRlciB0aGUgPGNvZGU+ZHZlL25ldHdvcms8L2NvZGU+IGRpcmVjdG9yeS4KK0l0IHdyaXRlcyB0aGVzZSBjaGFuZ2VzIGludG8gdGhlIGZpbGUgPGNvZGU+Y2hhbmdlbG9nLnhtbDwvY29kZT4uPC9wPgorCis8cHJlPiAgJmx0O2N2c2NoYW5nZWxvZyBkaXI9JnF1b3Q7ZHZlL25ldHdvcmsmcXVvdDsKKyAgICAgICAgICAgICAgICBkZXN0ZmlsZT0mcXVvdDtjaGFuZ2Vsb2cueG1sJnF1b3Q7CisgICAgICAgICAgICAgICAgZGF5c2lucGFzdD0mcXVvdDsxMCZxdW90OworICAvJmd0OzwvcHJlPgorCis8cD5HZW5lcmF0ZXMgYSBjaGFuZ2UgbG9nIHJlcG9ydCBmb3IgYW55IGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUKK3VuZGVyIHRoZSA8Y29kZT5kdmUvbmV0d29yazwvY29kZT4gZGlyZWN0b3J5IGluIHRoZSBwYXN0IDEwIGRheXMuCitJdCB3cml0ZXMgdGhlc2UgY2hhbmdlcyBpbnRvIHRoZSBmaWxlIDxjb2RlPmNoYW5nZWxvZy54bWw8L2NvZGU+LjwvcD4KKworPHByZT4gICZsdDtjdnNjaGFuZ2Vsb2cgZGlyPSZxdW90O2R2ZS9uZXR3b3JrJnF1b3Q7CisgICAgICAgICAgICAgICAgZGVzdGZpbGU9JnF1b3Q7Y2hhbmdlbG9nLnhtbCZxdW90OworICAgICAgICAgICAgICAgIHN0YXJ0PSZxdW90OzIwIEZlYiAyMDAyJnF1b3Q7CisgICAgICAgICAgICAgICAgZW5kPSZxdW90OzIwIE1hciAyMDAyJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+CisKKzxwPkdlbmVyYXRlcyBhIGNoYW5nZSBsb2cgcmVwb3J0IGZvciBhbnkgY2hhbmdlcyB0aGF0IHdlcmUgbWFkZQorYmV0d2VlbiBGZWJydWFyeSAyMCwgMjAwMiBhbmQgTWFyY2ggMjAsIDIwMDIKK3VuZGVyIHRoZSA8Y29kZT5kdmUvbmV0d29yazwvY29kZT4gZGlyZWN0b3J5LgorSXQgd3JpdGVzIHRoZXNlIGNoYW5nZXMgaW50byB0aGUgZmlsZSA8Y29kZT5jaGFuZ2Vsb2cueG1sPC9jb2RlPi48L3A+CisKKzxwcmU+ICAmbHQ7Y3ZzY2hhbmdlbG9nIGRpcj0mcXVvdDtkdmUvbmV0d29yayZxdW90OworICAgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O2NoYW5nZWxvZy54bWwmcXVvdDsKKyAgICAgICAgICAgICAgICBzdGFydD0mcXVvdDsyMCBGZWIgMjAwMiZxdW90OworICAvJmd0OzwvcHJlPgorCis8cD5HZW5lcmF0ZXMgYSBjaGFuZ2UgbG9nIHJlcG9ydCBmb3IgYW55IGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUKK2FmdGVyIEZlYnJ1YXJ5IDIwLCAyMDAyIHVuZGVyIHRoZSA8Y29kZT5kdmUvbmV0d29yazwvY29kZT4gZGlyZWN0b3J5LgorSXQgd3JpdGVzIHRoZXNlIGNoYW5nZXMgaW50byB0aGUgZmlsZSA8Y29kZT5jaGFuZ2Vsb2cueG1sPC9jb2RlPi48L3A+CisKKzxwcmU+ICAmbHQ7Y3ZzY2hhbmdlbG9nIGRpcj0mcXVvdDtkdmUvbmV0d29yayZxdW90OworICAgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O2NoYW5nZWxvZy54bWwmcXVvdDsmZ3Q7CisgICAgICAgJmx0O3VzZXIgZGlzcGxheW5hbWU9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7IHVzZXJpZD0mcXVvdDtkb25hbGRwJnF1b3Q7LyZndDsKKyAgJmx0Oy9jdnNjaGFuZ2Vsb2cmZ3Q7PC9wcmU+CisKKzxwPkdlbmVyYXRlcyBhIGNoYW5nZSBsb2cgcmVwb3J0IGZvciBhbGwgdGhlIGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUKK3VuZGVyIHRoZSA8Y29kZT5kdmUvbmV0d29yazwvY29kZT4gZGlyZWN0b3J5LCBzdWJzdGl0dXRpbmcgdGhlIG5hbWUKKyZxdW90O1BldGVyIERvbmFsZCZxdW90OyBpbiB0aGUgPGNvZGU+Jmx0O2F1dGhvciZndDs8L2NvZGU+IHRhZ3MKK2FueXRpbWUgaXQgZW5jb3VudGVycyBhIGNoYW5nZSBtYWRlIGJ5IHRoZSB1c2VyIElEICZxdW90O2RvbmFsZHAmcXVvdDsuCitJdCB3cml0ZXMgdGhlc2UgY2hhbmdlcyBpbnRvIHRoZSBmaWxlIDxjb2RlPmNoYW5nZWxvZy54bWw8L2NvZGU+LjwvcD4KKworPHA+R2VuZXJhdGVzIGEgY2hhbmdlIGxvZyByZXBvcnQgb24gdGhlIDxjb2RlPkFOVF8xNl9CUkFOQ0g8L2NvZGU+LjwvcD4KKzxwcmU+CisgJmx0O2N2c2NoYW5nZWxvZyBkaXI9JnF1b3Q7YzovZGV2L2FzZi9hbnQuaGVhZCZxdW90OyBwYXNzZmlsZT0mcXVvdDtjOi9ob21lL215c2VsZi8uY3ZzcGFzcyZxdW90OworICAgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O2NoYW5nZWxvZ2FudC54bWwmcXVvdDsgdGFnPSZxdW90O0FOVF8xNl9CUkFOQ0gmcXVvdDsvJmd0OworPC9wcmU+Cis8aDQ+R2VuZXJhdGUgUmVwb3J0PC9oND4KKzxwPkFudCBpbmNsdWRlcyBhIGJhc2ljIFhTTFQgc3R5bGVzaGVldCB0aGF0IHlvdSBjYW4gdXNlIHRvIGdlbmVyYXRlIAorYSBIVE1MIHJlcG9ydCBiYXNlZCBvbiB0aGUgeG1sIG91dHB1dC4gVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzCitob3cgdG8gZ2VuZXJhdGUgYSBIVE1MIHJlcG9ydCBmcm9tIHRoZSBYTUwgcmVwb3J0LjwvcD4KKworPHByZT4KKyAgICAgICAgJmx0O3N0eWxlIGluPSJjaGFuZ2Vsb2cueG1sIiAKKyAgICAgICAgICAgICAgIG91dD0iY2hhbmdlbG9nLmh0bWwiIAorICAgICAgICAgICAgICAgc3R5bGU9IiR7YW50LmhvbWV9L2V0Yy9jaGFuZ2Vsb2cueHNsIiZndDsKKyAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0idGl0bGUiIGV4cHJlc3Npb249IkFudCBDaGFuZ2VMb2ciLyZndDsKKyAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0ibW9kdWxlIiBleHByZXNzaW9uPSJhbnQiLyZndDsKKyAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0iY3Zzd2ViIiBleHByZXNzaW9uPSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy8iLyZndDsKKyAgICAgICAgJmx0Oy9zdHlsZSZndDsKKzwvcHJlPgorCis8aDQ+U2FtcGxlIE91dHB1dDwvaDQ+Cis8cHJlPgorJmx0O2NoYW5nZWxvZyZndDsKKyAgJmx0O2VudHJ5Jmd0OworICAgICZsdDtkYXRlJmd0OzIwMDItMDMtMDYmbHQ7L2RhdGUmZ3Q7CisgICAgJmx0O3RpbWUmZ3Q7MTI6MDAmbHQ7L3RpbWUmZ3Q7CisgICAgJmx0O2F1dGhvciZndDtQZXRlciBEb25hbGQmbHQ7L2F1dGhvciZndDsKKyAgICAmbHQ7ZmlsZSZndDsKKyAgICAgICZsdDtuYW1lJmd0O29yZy9hcGFjaGUvbXlybWlkb24vYnVpbGQvQW50bGliRGVzY3JpcHRvclRhc2suamF2YSZsdDsvbmFtZSZndDsKKyAgICAgICZsdDtyZXZpc2lvbiZndDsxLjMmbHQ7L3JldmlzaW9uJmd0OworICAgICAgJmx0O3ByZXZyZXZpc2lvbiZndDsxLjImbHQ7L3ByZXZyZXZpc2lvbiZndDsKKyAgICAmbHQ7L2ZpbGUmZ3Q7CisgICAgJmx0O21zZyZndDsmbHQ7IVtDREFUQVtVc2UgVVJMcyBkaXJlY3RseSByYXRoZXIgdGhhbiBnbyB2aWEgYSBGaWxlLgorCitUaGlzIGFsbG93cyB0ZW1wbGF0ZXMgdG8gYmUgc3RvcmVkIGluc2lkZSBqYXJdXSZndDsmbHQ7L21zZyZndDsKKyAgJmx0Oy9lbnRyeSZndDsKKyZsdDsvY2hhbmdlbG9nJmd0OworPC9wcmU+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jaGVja3N1bS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NoZWNrc3VtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwNDIxMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jaGVja3N1bS5odG1sCkBAIC0wLDAgKzEsMjYxIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkNoZWNrc3VtIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImNoZWNrc3VtIj5DaGVja3N1bTwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPgorR2VuZXJhdGVzIGNoZWNrc3VtIGZvciBmaWxlcy4gIFRoaXMgdGFzayBjYW4gYWxzbyBiZSB1c2VkIHRvCitwZXJmb3JtIGNoZWNrc3VtIHZlcmlmaWNhdGlvbnMuCis8L3A+CisKKzxwPk5vdGUgdGhhdCBtYW55IHBvcHVsYXIgbWVzc2FnZSBkaWdlc3QgZnVuY3Rpb25zIC0gaW5jbHVkaW5nIE1ENSBhbmQKK1NIQS0xIC0gaGF2ZSBiZWVuIGJyb2tlbiByZWNlbnRseS4gIElmIHlvdSBhcmUgZ29pbmcgdG8gdXNlIHRoZSB0YXNrCit0byBjcmVhdGUgY2hlY2tzdW1zIHVzZWQgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgc2VjdXJpdHkgaXMKK2ltcG9ydGFudCwgcGxlYXNlIHRha2Ugc29tZSB0aW1lIHRvIGludmVzdGlnYXRlIHRoZSBhbGdvcml0aG1zIG9mZmVyZWQKK2J5IHlvdXIgSkNFIHByb3ZpZGVyLiAgTm90ZSBhbHNvIHRoYXQgc29tZSBKQ0UgcHJvdmlkZXJzIGxpa2UgdGhlIG9uZQorYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5ib3VuY3ljYXN0bGUub3JnLyI+VGhlIExlZ2lvbiBvZiB0aGUgQm91bmN5CitDYXN0bGU8L2E+LCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dudS1jcnlwdG8vIj5HTlUKK3Byb2plY3Q8L2E+IG9yIDxhCitocmVmPSJodHRwOi8vamNlLmlhaWsudHVncmF6LmF0L3Byb2R1Y3RzLzAxX2pjZS9pbmRleC5waHAiPnRoZQorVGVjaG5pY2FsIFVuaXZlcnNpdHkgR3JhejwvYT4gb2ZmZXIgbW9yZSBkaWdlc3QgYWxnb3JpdGhtcyB0aGFuIHRob3NlCitidWlsdC1pbiBpbnRvIHlvdXIgSkRLLjwvcD4KKworPHA+CitXYXJuaW5nOiB0aGUgY2FzZSBvZiB0aGUgZXh0ZW5zaW9uIGlzIHRoYXQgb2YgdGhlIGFsZ29yaXRobSB1c2VkLgorSWYgeW91IGFzayBmb3IgIlNIQTEiLCB5b3UgZ2V0IGEgLlNIQTEgZXh0ZW5zaW9uOyBpZiB5b3UgYXNrIGZvciAic2hhMSIsIHlvdQorZ2V0IGEgZmlsZSBlbmRpbmcgaW4gLnNoYTEuIFRoZSBKYXZhIENyeXB0byBFbmdpbmVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlCitpbiBtYXRjaGluZyBhbGdvcml0aG1zLCBzbyBjaG9vc2UgYSBuYW1lIHRvIG1hdGNoIHlvdXIgZGVzaXJlZCBvdXRwdXQgZXh0ZW5zaW9uLAorb3Igc2V0IHRoZSA8dHQ+ZmlsZWV4dDwvdHQ+IGF0dHJpYnV0ZS4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBnZW5lcmF0ZSBjaGVja3N1bSBmb3IuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk9uZSBvZiBlaXRoZXIgPHZhcj5maWxlPC92YXI+IG9yCisgICAgYXQgbGVhc3Qgb25lIG5lc3RlZCAoZmlsZXN5c3RlbS1vbmx5KSByZXNvdXJjZSBjb2xsZWN0aW9uLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRvZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSByb290IGRpcmVjdG9yeSB3aGVyZSBjaGVja3N1bXMgc2hvdWxkIGJlIHdyaXR0ZW4uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLiBJZiBub3Qgc3BlY2lmaWVkLCBjaGVja3N1bSBmaWxlcworICAgICAgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZXMgdGhlbXNlbHZlcy4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hbGdvcml0aG08L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBhbGdvcml0aG0gdG8gYmUgdXNlZCB0bworICAgICAgY29tcHV0ZSB0aGUgY2hlY2tzdW0uIERlZmF1bHRzIHRvICZxdW90O01ENSZxdW90Oy4KKyAgICAgIE90aGVyIHBvcHVsYXIgYWxnb3JpdGhtcyBsaWtlICZxdW90O1NIQSZxdW90OyBtYXkgYmUgdXNlZAorICAgICAgYXMgd2VsbC4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcm92aWRlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIHByb3ZpZGVyIG9mIHRoZSBhbGdvcml0aG0uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZWV4dDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZ2VuZXJhdGVkIGNoZWNrc3VtIGZpbGUncyBuYW1lIHdpbGwgYmUgdGhlCisgICAgb3JpZ2luYWwgZmlsZW5hbWUgd2l0aCB0aGUgZmlsZWV4dCBhZGRlZCB0byBpdC4KKyAgICBEZWZhdWx0cyB0byBhICIuIiBhbmQgdGhlIGFsZ29yaXRobSBuYW1lIGJlaW5nIHVzZWQuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBhdHRyaWJ1dGUgY2FuIG1lYW4gdHdvIGRpZmZlcmVudCB0aGluZ3MsIGl0CisgICAgZGVwZW5kcyBvbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIHZlcmlmeXByb3BlcnR5IGF0dHJpYnV0ZS48YnI+CisgICAgPGI+SWYgeW91IGRvbid0IHNldCB0aGUgdmVyaWZ5cHJvcGVydHkgYXR0cmlidXRlPC9iPiwgcHJvcGVydHkKKyAgICBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNldCB3aXRoIHRoZSBnZW5lcmF0ZWQKKyAgICBjaGVja3N1bSB2YWx1ZS48YnI+CisgICAgPGI+SWYgeW91IHNldCB0aGUgdmVyaWZ5cHJvcGVydHkgYXR0cmlidXRlPC9iPiwgcHJvcGVydHkgc3BlY2lmaWVzCisgICAgdGhlIGNoZWNrc3VtIHlvdSBleHBlY3QgdG8gYmUgZ2VuZXJhdGVkICh0aGUgY2hlY2tzdW0gaXRzZWxmLCBub3QKKyAgICBhIG5hbWUgb2YgYSBwcm9wZXJ0eSBjb250YWluaW5nIHRoZSBjaGVja3N1bSkuPGJyPgorICAgIFRoaXMgY2Fubm90IGJlIHNwZWNpZmllZCB3aGVuIGZpbGVleHQgaXMgYmVpbmcgdXNlZCBvciB3aGVuIHRoZQorICAgIG51bWJlciBvZiBmaWxlcyBmb3Igd2hpY2ggY2hlY2tzdW1zIGlzIHRvIGJlIGdlbmVyYXRlZCBpcyBncmVhdGVyCisgICAgdGhhbiAxLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBwYXR0ZXJuIHRvIHVzZSBhcyBhIHBhdHRlcm4KKyAgICBzdWl0YWJsZSBmb3IgPGEKKyAgICBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS90ZXh0L01lc3NhZ2VGb3JtYXQuaHRtbCI+TWVzc2FnZUZvcm1hdDwvYT4KKyAgICB3aGVyZSA8Y29kZT57MH08L2NvZGU+IGlzIHJlcGxhY2VkIHdpdGggdGhlIGNoZWNrc3VtIGFuZAorICAgIDxjb2RlPnsxfTwvY29kZT4gd2l0aCB0aGUgZmlsZSBuYW1lLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHQgaXMgJnF1b3Q7ezB9JnF1b3Q7LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcm1hdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIHBhdHRlcm4gdG8gdXNlIGFzIG9uZSBvZiBhCisgICAgd2VsbC1rbm93biBmb3JtYXQuICBTdXBwb3J0ZWQgdmFsdWVzIGFyZSAKKyAgICAgIDx0YWJsZSBib3JkZXI9IjEiPgorICAgICAgPHRyPgorICAgICAgICA8dGg+bmFtZTwvdGg+CisgICAgICAgIDx0aD5wYXR0ZXJuPC90aD4KKyAgICAgICAgPHRoPmRlc2NyaXB0aW9uPC90aD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5DSEVDS1NVTSA8L3RkPgorICAgICAgICA8dGQ+PHR0PnswfTwvdHQ+PC90ZD4KKyAgICAgICAgPHRkPm9ubHkgdGhlIGNoZWNrc3VtIGl0c2VsZiA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPk1ENVNVTSA8L3RkPgorICAgICAgICA8dGQ+PHR0PnswfSAqezF9PC90dD48L3RkPgorICAgICAgICA8dGQ+dGhlIGZvcm1hdCBvZiBHTlUgdGV4dHV0aWxzIG1kNXN1bTwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+U1ZGIDwvdGQ+CisgICAgICAgIDx0ZD48dHQ+TUQ1ICh7MX0pID0gezB9PC90dD48L3RkPgorICAgICAgICA8dGQ+dGhlIGZvcm1hdCBvZiBCU0RzIG1kNSBjb21tYW5kIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0IGlzICZxdW90O0NIRUNLU1VNJnF1b3Q7LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRvdGFscHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgc3BlY2lmaWVkLCB0aGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKKyAgICAgIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgaG9sZCBhIGNoZWNrc3VtIG9mIGFsbCB0aGUgY2hlY2tzdW1zIGFuZAorICAgICAgZmlsZSBwYXRocy4gVGhlIGluZGl2aWR1YWwgY2hlY2tzdW1zIGFuZCB0aGUgcmVsYXRpdmUgcGF0aHMgdG8gdGhlIGZpbGVzCisgICAgICB3aXRoaW4gdGhlIHJlc291cmNlIGNvbGxlY3Rpb25zIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgd2lsbCBiZSB1c2VkIHRvCisgICAgICBjb21wdXRlIHRoaXMgY2hlY2tzdW0uIChUaGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBwYXRocyB3aWxsIGJlCisgICAgICBjb252ZXJ0ZWQgdG8gJy8nIGJlZm9yZSBjb21wdXRhdGlvbiB0byBlbnN1cmUgcGxhdGZvcm0gcG9ydGFiaWxpdHkpLgorICAgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlb3ZlcndyaXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbgorICAgICAgZmlsZXMgYXJlIG5ld2VyLiBEZWZhdWx0cyB0byAmcXVvdDtubyZxdW90Oy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJpZnlwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNldAorICAgIHdpdGggJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDtmYWxzZSZxdW90OyBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyCisgICAgdGhlIGdlbmVyYXRlZCBjaGVja3N1bSBtYXRjaGVzIHRoZSBleGlzdGluZyBjaGVja3N1bS4gIFdoZW4KKyAgICB0aGlzIGlzIHNldCwgdGhlIGdlbmVyYXRlZCBjaGVja3N1bSBpcyBub3Qgd3JpdHRlbiB0byBhIGZpbGUgb3IKKyAgICBwcm9wZXJ0eSwgYnV0IHJhdGhlciwgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgb3IgcHJvcGVydHkgaXMgdXNlZCB0bworICAgIGNoZWNrIGFnYWluc3QgdGhlIGdlbmVyYXRlZCBjaGVja3N1bS4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVhZGJ1ZmZlcnNpemU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAoaW4gYnl0ZXMpIHRvIHVzZSB3aGVuCisgICAgcmVhZGluZyBhIGZpbGUuIERlZmF1bHRzIHRvICZxdW90OzgxOTImcXVvdDsgLSB5b3UgbWF5IGdldCBhCisgICAgYmV0dGVyIHBlcmZvcm1hbmNlIG9uIGJpZyBmaWxlcyBpZiB5b3UgaW5jcmVhc2UgdGhpcyB2YWx1ZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+cmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+CisgPHA+CisgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIGNvbGxlY3Rpb25zPC9hPiBhcmUKKyB1c2VkIHRvIHNlbGVjdCBmaWxlcyBmb3Igd2hpY2ggY2hlY2tzdW1zIHNob3VsZCBiZSBnZW5lcmF0ZWQuCisgPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHA+PGI+RXhhbXBsZSAxPC9iPjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+Jmx0O2NoZWNrc3VtIGZpbGU9JnF1b3Q7Zm9vLmJhciZxdW90Oy8mZ3Q7PC9wcmU+PC9ibG9ja3F1b3RlPgorR2VuZXJhdGVzIGEgTUQ1IGNoZWNrc3VtIGZvciBmb28uYmFyIGFuZCBzdG9yZXMgdGhlIGNoZWNrc3VtIGluIHRoZSBkZXN0aW5hdGlvbiBmaWxlCitmb28uYmFyLk1ENS4gIGZvby5iYXIuTUQ1IGlzIG92ZXJ3cml0dGVuIG9ubHkgaWYgZm9vLmJhciBpcyBuZXdlciB0aGFuIGl0c2VsZi4KKworPHA+PGI+RXhhbXBsZSAyPC9iPjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+Jmx0O2NoZWNrc3VtIGZpbGU9JnF1b3Q7Zm9vLmJhciZxdW90OyBmb3JjZU92ZXJ3cml0ZT0mcXVvdDt5ZXMmcXVvdDsvJmd0OzwvcHJlPjwvYmxvY2txdW90ZT4KK0dlbmVyYXRlcyBhIE1ENSBjaGVja3N1bSBmb3IgZm9vLmJhciBhbmQgc3RvcmVzIHRoZSBjaGVja3N1bSBpbiBmb28uYmFyLk1ENS4KK0lmIGZvby5iYXIuTUQ1IGFscmVhZHkgZXhpc3RzLCBpdCBpcyBvdmVyd3JpdHRlbi4KKworPHA+PGI+RXhhbXBsZSAzPC9iPjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+Jmx0O2NoZWNrc3VtIGZpbGU9JnF1b3Q7Zm9vLmJhciZxdW90OyBwcm9wZXJ0eT0mcXVvdDtmb29iYXJNRDUmcXVvdDsvJmd0OzwvcHJlPjwvYmxvY2txdW90ZT4KK0dlbmVyYXRlcyBhIE1ENSBjaGVja3N1bSBmb3IgZm9vLmJhciBhbmQgc3RvcmVzIGl0IGluIHRoZSBQcm9qZWN0IFByb3BlcnR5IGZvb2Jhck1ENS4KKworPHA+PGI+RXhhbXBsZSA0PC9iPjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+Jmx0O2NoZWNrc3VtIGZpbGU9JnF1b3Q7Zm9vLmJhciZxdW90OyB2ZXJpZnlQcm9wZXJ0eT0mcXVvdDtpc01ENW9rJnF1b3Q7LyZndDs8L3ByZT48L2Jsb2NrcXVvdGU+CitHZW5lcmF0ZXMgYSBNRDUgY2hlY2tzdW0gZm9yIGZvby5iYXIsIGNvbXBhcmVzIGl0IGFnYWluc3QgZm9vLmJhci5NRDUgYW5kIHNldHMKK2lzTUQ1b2sgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UsIGRlcGVuZGluZyB1cG9uIHRoZSByZXN1bHQuCisKKzxwPjxiPkV4YW1wbGUgNTwvYj48L3A+Cis8YmxvY2txdW90ZT48cHJlPiZsdDtjaGVja3N1bSBmaWxlPSZxdW90O2Zvby5iYXImcXVvdDsgYWxnb3JpdGhtPSZxdW90O1NIQSZxdW90OyBmaWxlZXh0PSZxdW90O2FzYyZxdW90Oy8mZ3Q7PC9wcmU+PC9ibG9ja3F1b3RlPgorR2VuZXJhdGVzIGEgU0hBIGNoZWNrc3VtIGZvciBmb28uYmFyIGFuZCBzdG9yZXMgdGhlIGNoZWNrc3VtIGluIHRoZSBkZXN0aW5hdGlvbiBmaWxlCitmb28uYmFyLmFzYy4gIGZvby5iYXIuYXNjIGlzIG92ZXJ3cml0dGVuIG9ubHkgaWYgZm9vLmJhciBpcyBuZXdlciB0aGFuIGl0c2VsZi4KKworPHA+PGI+RXhhbXBsZSA2PC9iPjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y2hlY2tzdW0gZmlsZT0mcXVvdDtmb28uYmFyJnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7bWQ1fSZxdW90OyB2ZXJpZnlQcm9wZXJ0eT0mcXVvdDtpc0VxdWFsJnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KK0dlbmVyYXRlcyBhIE1ENSBjaGVja3N1bSBmb3IgZm9vLmJhciwgY29tcGFyZXMgaXQgYWdhaW5zdCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5CittZDUsIGFuZCBzZXRzIGlzRXF1YWwgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UsIGRlcGVuZGluZyB1cG9uIHRoZSByZXN1bHQuCisKKzxwPjxiPkV4YW1wbGUgNzwvYj48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2NoZWNrc3VtJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2ZvbyomcXVvdDsvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L2NoZWNrc3VtJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorV29ya3MganVzdCBsaWtlIEV4YW1wbGUgMSwgYnV0IGdlbmVyYXRlcyBhIC5NRDUgZmlsZSBmb3IgZXZlcnkgZmlsZSB0aGF0IGJlZ2lucyB3aXRoIHRoZSBuYW1lIGZvby4KKworPHA+PGI+RXhhbXBsZSA4PC9iPjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSZxdW90O2lzQ2hlY2tzdW1FcXVhbCZxdW90OyZndDsKKyAgJmx0O2NoZWNrc3VtJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7Jmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtmb28uYmFyJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDsvY2hlY2tzdW0mZ3Q7CismbHQ7L2NvbmRpdGlvbiZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KK1dvcmtzIGxpa2UgRXhhbXBsZSA0LCBidXQgb25seSBzZXRzIGlzQ2hlY2tzdW1FcXVhbCB0byB0cnVlLCBpZiB0aGUKK2NoZWNrc3VtIG1hdGNoZXMgLSBpdCB3aWxsIG5ldmVyIGJlIHNldCB0byBmYWxzZS4gIFRoaXMgZXhhbXBsZQorZGVtb25zdHJhdGVzIHVzZSB3aXRoIHRoZSBDb25kaXRpb24gdGFzay4KKworCis8aDM+Tm90ZTo8L2gzPgorV2hlbiB3b3JraW5nIHdpdGggbW9yZSB0aGFuIG9uZSBmaWxlLCBpZiBjb25kaXRpb24gYW5kL29yIHZlcmlmeXByb3BlcnR5IGlzIHVzZWQsCit0aGUgcmVzdWx0IHdpbGwgYmUgdHJ1ZSBvbmx5IGlmIHRoZSBjaGVja3N1bXMgbWF0Y2hlZCBjb3JyZWN0bHkgZm9yIGFsbCBmaWxlcyBiZWluZworY29uc2lkZXJlZC4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NobW9kLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY2htb2QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDEyYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NobW9kLmh0bWwKQEAgLTAsMCArMSwyMDMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Q2htb2QgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iY2htb2QiPkNobW9kPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+Q2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUgc3BlY2lmaWVkCitkaXJlY3Rvcmllcy4gUmlnaHQgbm93IGl0IGhhcyBlZmZlY3Qgb25seSB1bmRlciBVbml4IG9yIE5vblN0b3AgS2VybmVsIChUYW5kZW0pLgorVGhlIHBlcm1pc3Npb25zIGFyZSBhbHNvIFVOSVggc3R5bGUsIGxpa2UgdGhlIGFyZ3VtZW50IGZvciB0aGUgY2htb2QgY29tbWFuZC48L3A+Cis8cD5TZWUgdGhlIHNlY3Rpb24gb24gPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQKK3Rhc2tzPC9hPiwgb24gaG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvCit3cml0ZSBwYXR0ZXJucy48L3A+CisKKzxwPlRoaXMgdGFzayBob2xkcyBhbiBpbXBsaWNpdCA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kIHN1cHBvcnRzIGFsbCBvZgorRmlsZVNldCdzIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cyBkaXJlY3RseS4gTW9yZSBzZXRzIGNhbiBiZQorc3BlY2lmaWVkIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IG9yCis8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4gKDxlbT5zaW5jZSBBbnQgMS42PC9lbT4pIGVsZW1lbnRzLiA8L3A+CisKKzxwPlN0YXJ0aW5nIHdpdGggQW50IDEuNiwgdGhpcyB0YXNrIGFsc28gc3VwcG9ydHMgbmVzdGVkIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCI+ZmlsZWxpc3Q8L2E+cy48L3A+CisKKzxwPlN0YXJ0aW5nIHdpdGggQW50IDEuNywgdGhpcyB0YXNrIHN1cHBvcnRzIGFyYml0cmFyeSA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+cworYXMgbmVzdGVkIGVsZW1lbnRzLjwvcD4KKworPHA+QnkgZGVmYXVsdCB0aGlzIHRhc2sgd2lsbCB1c2UgYSBzaW5nbGUgaW52b2NhdGlvbiBvZiB0aGUgdW5kZXJseWluZworY2htb2QgY29tbWFuZC4gIElmIHlvdSBhcmUgd29ya2luZyBvbiBhIGxhcmdlIG51bWJlciBvZiBmaWxlcyB0aGlzIG1heQorcmVzdWx0IGluIGEgY29tbWFuZCBsaW5lIHRoYXQgaXMgdG9vIGxvbmcgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KK0lmIHlvdSBlbmNvdW50ZXIgc3VjaCBwcm9ibGVtcywgeW91IHNob3VsZCBzZXQgdGhlIG1heHBhcmFsbGVsCithdHRyaWJ1dGUgb2YgdGhpcyB0YXNrIHRvIGEgbm9uLXplcm8gdmFsdWUuICBUaGUgbnVtYmVyIHRvIHVzZSBoaWdobHkKK2RlcGVuZHMgb24gdGhlIGxlbmd0aCBvZiB5b3VyIGZpbGUgbmFtZXMgKHRoZSBkZXB0aCBvZiB5b3VyIGRpcmVjdG9yeQordHJlZSkgYW5kIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwgc28geW91J2xsIGhhdmUgdG8gZXhwZXJpbWVudCBhCitsaXR0bGUuICBQT1NJWCByZWNvbW1lbmRzIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIG9mIGF0IGxlYXN0IDQwOTYKK2NoYXJhY3RlcnMsIHRoaXMgbWF5IGdpdmUgeW91IGFuIGFwcHJveGltYXRpb24gZm9yIHRoZSBudW1iZXIgeW91Citjb3VsZCB1c2UgYXMgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlc2UgZXhwZXJpbWVudHMuPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmaWxlIG9yIHNpbmdsZSBkaXJlY3Rvcnkgb2Ygd2hpY2ggdGhlIHBlcm1pc3Npb25zIAorICAgICAgbXVzdCBiZSBjaGFuZ2VkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB2YWxpZ249Im1pZGRsZSIgcm93c3Bhbj0iMiI+ZXhhY3RseSBvbmUgb2YgdGhlIHR3byBvciBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQvbGlzdCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IHdoaWNoIGhvbGRzIHRoZSBmaWxlcyB3aG9zZSBwZXJtaXNzaW9ucyAKKyAgICAgIG11c3QgYmUgY2hhbmdlZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wZXJtPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuZXcgcGVybWlzc2lvbnMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90CisgICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFyYWxsZWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvY2VzcyBhbGwgc3BlY2lmaWVkIGZpbGVzIHVzaW5nIGEgc2luZ2xlCisgICAgICA8Y29kZT5jaG1vZDwvY29kZT4gY29tbWFuZC4gRGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50eXBlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk9uZSBvZiA8aT5maWxlPC9pPiwgPGk+ZGlyPC9pPiBvcgorICAgICAgPGk+Ym90aDwvaT4uIElmIHNldCB0byA8aT5maWxlPC9pPiwgb25seSB0aGUgcGVybWlzc2lvbnMgb2YKKyAgICAgIHBsYWluIGZpbGVzIGFyZSBnb2luZyB0byBiZSBjaGFuZ2VkLiBJZiBzZXQgdG8gPGk+ZGlyPC9pPiwgb25seQorICAgICAgdGhlIGRpcmVjdG9yaWVzIGFyZSBjb25zaWRlcmVkLjxicj4KKyAgICAgIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIHR5cGUgYXR0cmlidXRlIGRvZXMgbm90IGFwcGx5IHRvCisgICAgICBuZXN0ZWQgPGk+ZGlyc2V0PC9pPnMgLSA8aT5kaXJzZXQ8L2k+cyBhbHdheXMgaW1wbGljaXRseQorICAgICAgYXNzdW1lIHR5cGUgdG8gYmUgPGk+ZGlyPC9pPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmlsZTwvaT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYXhwYXJhbGxlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5MaW1pdCB0aGUgYW1vdW50IG9mIHBhcmFsbGVsaXNtIGJ5IHBhc3NpbmcgYXQKKyAgICAgIG1vc3QgdGhpcyBtYW55IHNvdXJjZWZpbGVzIGF0IG9uY2UuICBTZXQgaXQgdG8gJmx0Oz0gMCBmb3IKKyAgICAgIHVubGltaXRlZC4gIERlZmF1bHRzIHRvIHVubGltaXRlZC4gIDxlbT5TaW5jZSBBbnQgMS42LjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIHByaW50IGEgc3VtbWFyeSBhZnRlciBleGVjdXRpb24gb3Igbm90LgorICAgICAgRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LiAgPGVtPlNpbmNlIEFudCAxLjYuPC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+CisgIDxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y2htb2QgZmlsZT0mcXVvdDske2Rpc3R9L3N0YXJ0LnNoJnF1b3Q7IHBlcm09JnF1b3Q7dWdvK3J4JnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPm1ha2VzIHRoZSAmcXVvdDtzdGFydC5zaCZxdW90OyBmaWxlIHJlYWRhYmxlIGFuZCBleGVjdXRhYmxlIGZvciBhbnlvbmUgb24gYQorVU5JWCBzeXN0ZW0uPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtjaG1vZCBmaWxlPSZxdW90OyR7ZGlzdH0vc3RhcnQuc2gmcXVvdDsgcGVybT0mcXVvdDs3MDAmcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+bWFrZXMgdGhlICZxdW90O3N0YXJ0LnNoJnF1b3Q7IGZpbGUgcmVhZGFibGUsIHdyaXRhYmxlIGFuZCBleGVjdXRhYmxlIG9ubHkgZm9yIHRoZSBvd25lciBvbiBhCitVTklYIHN5c3RlbS48L3A+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7Y2htb2QgZGlyPSZxdW90OyR7ZGlzdH0vYmluJnF1b3Q7IHBlcm09JnF1b3Q7dWdvK3J4JnF1b3Q7IAorICAgICAgIGluY2x1ZGVzPSZxdW90OyoqLyouc2gmcXVvdDsvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5tYWtlcyBhbGwgJnF1b3Q7LnNoJnF1b3Q7IGZpbGVzIGJlbG93IDxjb2RlPiR7ZGlzdH0vYmluPC9jb2RlPgorcmVhZGFibGUgYW5kIGV4ZWN1dGFibGUgZm9yIGFueW9uZSBvbiBhIFVOSVggc3lzdGVtLjwvcD4KKzxibG9ja3F1b3RlPgorPHByZT4KKyZsdDtjaG1vZCBwZXJtPSZxdW90O2crdyZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NoYXJlZC9zb3VyY2VzMSZxdW90OyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqL3RyaWFsLyoqJnF1b3Q7LyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7ZmlsZXNldCByZWZpZD0mcXVvdDtvdGhlci5zaGFyZWQuc291cmNlcyZxdW90Oy8mZ3Q7CismbHQ7L2NobW9kJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5tYWtlcyBhbGwgZmlsZXMgYmVsb3cgPGNvZGU+c2hhcmVkL3NvdXJjZXMxPC9jb2RlPiAoZXhjZXB0IHRob3NlCitiZWxvdyBhbnkgZGlyZWN0b3J5IG5hbWVkIHRyaWFsKSB3cml0YWJsZSBmb3IgbWVtYmVycyBvZiB0aGUgc2FtZQorZ3JvdXAgb24gYSBVTklYIHN5c3RlbS4gSW4gYWRkaXRpb24gYWxsIGZpbGVzIGJlbG9uZ2luZyB0byBhIEZpbGVTZXQKK3dpdGggPGNvZGU+aWQ8L2NvZGU+IDxjb2RlPm90aGVyLnNoYXJlZC5zb3VyY2VzPC9jb2RlPiBnZXQgdGhlIHNhbWUKK3Blcm1pc3Npb25zLjwvcD4KKworPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2NobW9kIHBlcm09JnF1b3Q7Z28tcnd4JnF1b3Q7IHR5cGU9JnF1b3Q7ZmlsZSZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90Oy93ZWImcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmNnaSZxdW90Oy8mZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLm9sZCZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0O2RpcnNldCBkaXI9JnF1b3Q7L3dlYiZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqL3ByaXZhdGVfKiZxdW90Oy8mZ3Q7CisgICZsdDsvZGlyc2V0Jmd0OworJmx0Oy9jaG1vZCZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD5rZWVwcyBub24tb3duZXJzIGZyb20gdG91Y2hpbmcgY2dpIHNjcmlwdHMsIGZpbGVzIHdpdGggYSA8Y29kZT4ub2xkPC9jb2RlPgorZXh0ZW5zaW9uIG9yIGRpcmVjdG9yaWVzIGJlZ2lubmluZyB3aXRoIDxjb2RlPnByaXZhdGVfPC9jb2RlPi4gQSBkaXJlY3RvcnkgCitlbmRpbmcgaW4gPGNvZGU+Lm9sZDwvY29kZT4gb3IgYSBmaWxlIGJlZ2lubmluZyB3aXRoIHByaXZhdGVfIHdvdWxkIHJlbWFpbgordW5hZmZlY3RlZC48L3A+CisKKworICA8aDM+Tm90ZSBvbiBtYXhwYXJhbGxlbCBhdHRyaWJ1dGU8L2gzPgorICA8cD4KKyAgICBTb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb2YgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQKKyAgICBhIGNvbW1hbmQgbGluZSBtYXkgY29udGFpbi4gCisgICAgVGhpcyBtYXhpbXVtIGxpbWl0IHZhcmllcyBmcm9tIHNoZWxsIHRvIHNoZWxsIGFuZCBmcm9tIG9wZXJhdGluZworICAgIHN5c3RlbSB0byBvcGVyYXRpbmcgc3lzdGVtLgorICAgIElmIG9uZSBoYXMgYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgdG8gY2hhbmdlIG1vZGUgb24sIGNvbnNpZGVyCisgICAgdXNpbmcgdGhlIDxlbT5tYXhwYXJhbGxlbDwvZW0+IGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGUKKyAgICB3aGVuIHVzaW5nIEFJWCBhbmQgdGhlIGxpbWl0IGlzIHJlYWNoZWQsIHRoZSBzeXN0ZW0gcmVzcG9uZHMKKyAgICB3aXRoIGEgd2FybmluZzogIldhcm5pbmc6IAorICAgIFVOSVhQcm9jZXNzLmZvcmtBbmRFeGVjIG5hdGl2ZSBlcnJvcjogVGhlIHBhcmFtZXRlciBvciBlbnZpcm9ubWVudCBsaXN0cworICAgIGFyZSB0b28gbG9uZyIuIEEgdmFsdWUgb2YgYWJvdXQgMzAwIHNlZW1zIHRvIHJlc3VsdCBpbiBhCisgICAgY29tbWFuZCBsaW5lIHRoYXQgaXMgYWNjZXB0YWJsZS4KKyAgPC9wPgorPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29tbW9uLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29tbW9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhMzQxOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jb21tb24uaHRtbApAQCAtMCwwICsxLDU5IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkNvbW1vbjwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iamF2YWMiPkNvbW1vbiBBdHRyaWJ1dGVzIG9mIGFsbCBUYXNrczwvYT48L2gyPgorPHA+QWxsIHRhc2tzIHNoYXJlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsIGNhbiBiZQorICAgICAgIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgdGFzayBpbiBzY3JpcHRzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRhc2tuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSAtIHdpbGwKKyAgICAgIHNob3cgdXAgaW4gdGhlIGxvZ2dpbmcgb3V0cHV0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc2NyaXB0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlJvb20gZm9yIHlvdXIgY29tbWVudHM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NvbXBvbmVudGRlZi5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NvbXBvbmVudGRlZi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODJmYzEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29tcG9uZW50ZGVmLmh0bWwKQEAgLTAsMCArMSw2MiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Db21wb25lbnRkZWYgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iY29tcG9uZW50ZGVmIj5jb21wb25lbnRkZWY8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisgIDxwPgorICAgIEFkZHMgYSBjb21wb25lbnQgZGVmaW5pbmF0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgQSBjb21wZW5lbnQgZGVmaW5pdGlvbiBpcyB0aGUgc2FtZSBhcyBhCisgICAgPGEgaHJlZj0idHlwZWRlZi5odG1sIj50eXBlZGVmPC9hPiBleGNlcHQ6CisgIDwvcD4KKyAgICA8b2w+CisgICAgICA8bGk+CisgICAgICAgIHRoYXQgaXQgY2FuIG9ubHkgYmUgdXNlZCBpbiBvdGhlciB0eXBlcyBvciB0YXNrcyB0aGF0CisgICAgICAgIGFjY2VwdCBjb21wb25lbnRzIChieSBoYXZpbmcgYW4gPGk+YWRkKCk8L2k+IG1ldGhvZCkuCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBtdWx0aXBsZSBjb21wb25lbnRzIG1heSBoYXZlIHRoZSBzYW1lIG5hbWUsIHByb3ZpZGVkIHRoZW0KKyAgICAgICAgaW1wbGVtZW50IGRpZmZlcmVudCBpbnRlcmZhY2VzLgorICAgICAgPC9saT4KKyAgICA8L29sPgorICA8cD4KKyAgICBUaGUgcHVycG9zZSBvZiB0aGlzIGl0IGFsbG93IGludGVybmFsIGFudCBkZWZpbml0aW9ucyB0byBiZQorICAgIGJlIG1hZGUgZm9yIHRhZ3MgbGlrZSAiYW5kIiBvciAib3IiLgorICA8L3A+CisKKyAgPGgzPkV4YW1wbGVzPC9oMz4KKworPHByZT4gJmx0O2NvbXBvbmVudGRlZiBuYW1lPSJvciIgb25lcnJvcj0iaWdub3JlIgorICAgIGNsYXNzbmFtZT0iY29tLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9ucy5PciIvJmd0OworICAmbHQ7Y29tcG9uZW50ZGVmIG5hbWU9Im9yIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJjb20uYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLk9yIi8mZ3Q7PC9wcmU+CisgIDxwPgorICAgIGRlZmluZXMgdHdvIGNvbXBvbmVudHMgd2l0aCB0aGUgc2FtZSBuYW1lICJvciIsIG9uZSBpcyBhIGNvbmRpdGlvbgorICAgIChzZWUgPGEgaHJlZj0iY29uZGl0aW9ucy5odG1sIj5jb25kaXRpb25zPC9hPikgYW5kIG9uZSBpcyAKKyAgICBhIHNlbGVjdG9yIChzZWUgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3NlbGVjdG9ycy5odG1sIj5zZWxlY3RvcnM8L2E+KS4KKyAgPC9wPgorPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29uY2F0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29uY2F0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0YWI2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jb25jYXQuaHRtbApAQCAtMCwwICsxLDMwMCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKyAgICA8aGVhZD4KKyAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Q29uY2F0PC90aXRsZT4KKyAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKworICAgICAgPGgyPjxhIG5hbWU9IkNvbmNhdCI+Q29uY2F0PC9hPjwvaDI+CisKKyAgICAgIDxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKyAgICAgIDxwPgorICAgICAgICBDb25jYXRlbmF0ZXMgb25lIG9yIG1vcmUgCisgICAgICAgIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+cworICAgICAgICB0byBhIHNpbmdsZSBmaWxlIG9yIHRvIHRoZSBjb25zb2xlLiBUaGUgZGVzdGluYXRpb24KKyAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICA8L3A+CisKKyAgICAgIDxwPjxzdHJvbmc+U2luY2UgQW50IDEuNy4xPC9zdHJvbmc+LCB0aGlzIHRhc2sgY2FuIGJlIHVzZWQgYXMgYQorICAgICAgICA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT4KKyAgICAgICAgdGhhdCB3aWxsIHJldHVybiBleGFjdGx5IG9uZSAKKyAgICAgICAgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4uCisgICAgICA8L3A+CisKKyAgICAgIDxwPgorICAgICAgICA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+CitSZXNvdXJjZSBDb2xsZWN0aW9uPC9hPnMgYXJlIHVzZWQgdG8KKyAgICAgICAgc2VsZWN0IHdoaWNoIHJlc291cmNlcyBhcmUgdG8gYmUgY29uY2F0ZW5hdGVkLiBUaGVyZSBpcyBubworICAgICAgICBzaW5ndWxhciBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBhIHNpbmdsZSByZXNvdXJjZSB0byBjYXQuCisgICAgICA8L3A+CisKKyAgICAgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KKworICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKworICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIGZpbGUgZm9yIHRoZSBjb25jYXRlbmF0ZWQgc3RyZWFtLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkIHRoZSBjb25zb2xlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4KKyAgICAgICAgICAgIE5vCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5hcHBlbmQ8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5ICdkZXN0ZmlsZScKKyAgICAgICAgICAgIHNob3VsZCBiZSBhcHBlbmRlZC4gRGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDsuCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yY2U8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5ICdkZXN0ZmlsZScKKyAgICAgICAgICAgIHNob3VsZCBiZSB3cml0dGVuIHRvIGV2ZW4gaWYgaXQgaXMgbmV3ZXIgdGhhbiBhbGwgc291cmNlIGZpbGVzLgorICAgICAgICAgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi4KKyAgICAgICAgICAgIERlZmF1bHRzIHRvICZxdW90O3llcyZxdW90Oy4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBlbmNvZGluZyBmb3IgdGhlIGlucHV0IGZpbGVzLiBQbGVhc2Ugc2VlIDxhCisgICAgICAgICAgICBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj4KKyAgICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+CisgICAgICAgICAgICBmb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcy4gRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MKKyAgICAgICAgICAgIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dGVuY29kaW5nPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgVGhlIGVuY29kaW5nIHRvIHVzZSB3aGVuIHdyaXRpbmcgdGhlIG91dHB1dCBmaWxlCisgICAgICAgICAgICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LgorICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSBlbmNvZGluZyBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGlmIGdpdmVuIG9yIHRoZSBkZWZhdWx0IEpWTSBlbmNvZGluZyBvdGhlcndpc2UuCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Zml4bGFzdGxpbmU8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBjaGVjayBpZgorICAgICAgICAgICAgZWFjaCBmaWxlIGNvbmNhdGVuYXRlZCBpcyB0ZXJtaW5hdGVkIGJ5CisgICAgICAgICAgICBhIG5ldyBsaW5lLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyAmcXVvdDt5ZXMmcXVvdDsKKyAgICAgICAgICAgIGEgbmV3IGxpbmUgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgc3RyZWFtIGlmCisgICAgICAgICAgICB0aGUgZmlsZSBkaWQgbm90IGVuZCBpbiBhIG5ldyBsaW5lLgorICAgICAgICAgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi4KKyAgICAgICAgICAgIERlZmF1bHRzIHRvICZxdW90O25vJnF1b3Q7LgorICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgZG9lcyBub3QgYXBwbHkgdG8gZW1iZWRkZWQgdGV4dC4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5lb2w8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgICBTcGVjaWZpZXMgd2hhdCB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyIGFyZQorICAgICAgICAgICAgZm9yIHVzZSBieSB0aGUgZml4bGFzdGxpbmUgYXR0cmlidXRlLgorICAgICAgICAgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPgorICAgICAgICAgICAgVmFsaWQgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IGFyZToKKyAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpPmNyOiBhIHNpbmdsZSBDUjwvbGk+CisgICAgICAgICAgICAgIDxsaT5sZjogYSBzaW5nbGUgTEY8L2xpPgorICAgICAgICAgICAgICA8bGk+Y3JsZjogdGhlIHBhaXIgQ1JMRjwvbGk+CisgICAgICAgICAgICAgIDxsaT5tYWM6IGEgc2luZ2xlIENSPC9saT4KKyAgICAgICAgICAgICAgPGxpPnVuaXg6IGEgc2luZ2xlIExGPC9saT4KKyAgICAgICAgICAgICAgPGxpPmRvczogdGhlIHBhaXIgQ1JMRjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgcGxhdGZvcm0gZGVwZW5kZW50LgorICAgICAgICAgICAgRm9yIFVuaXggcGxhdGZvcm1zLCB0aGUgZGVmYXVsdCBpcyAmcXVvdDtsZiZxdW90Oy4KKyAgICAgICAgICAgIEZvciBET1MgYmFzZWQgc3lzdGVtcyAoaW5jbHVkaW5nIFdpbmRvd3MpLAorICAgICAgICAgICAgdGhlIGRlZmF1bHQgaXMgJnF1b3Q7Y3JsZiZxdW90Oy4KKyAgICAgICAgICAgIEZvciBNYWMgT1MsIHRoZSBkZWZhdWx0IGlzICZxdW90O2NyJnF1b3Q7LgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmJpbmFyeTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPgorICAgICAgICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUsIHRoZSB0YXNrIGNvbmNhdGVuYXRlcyB0aGUgZmlsZXMKKyAgICAgICAgICAgIGluIGEgYnl0ZSBieSBieXRlIGZhc2hpb24uIElmIHRoaXMgYXR0cmlidXRlIGlzIGZhbHNlLCBjb25jYXQgd2lsbAorICAgICAgICAgICAgbm90IG5vcm1hbGx5IHdvcmsgZm9yIGJpbmFyeSBmaWxlcyBkdWUgdG8gY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICAgICAgICBpc3N1ZXMuCisgICAgICAgICAgICBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGRlc3RmaWxlIGF0dHJpYnV0ZSBtdXN0IGJlCisgICAgICAgICAgICBzZXQsIGFuZCB0aGUgdGFzayBjYW5ub3QgdXNlZCBuZXN0ZWQgdGV4dC4KKyAgICAgICAgICAgIEFsc28gdGhlIGF0dHJpYnV0ZXMgZW5jb2RpbmcsIG91dHB1dGVuY29kaW5nLCBmaWxlbGFzdGxpbmUKKyAgICAgICAgICAgIGNhbm5vdCBiZSB1c2VkLgorICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgPC90YWJsZT4KKworICAgICAgPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisgICAgICAgIDxoND5SZXNvdXJjZSBDb2xsZWN0aW9uPC9oND4KKyAgICAgICAgPHA+PGVtPnNpbmNlIEFudCAxLjc8L2VtPi48L3A+CisKKyAgICAgIDxwPgorICAgICAgICBBbnkgb2YgdGhlIHZhcmlvdXMgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPgorICAgICAgICBSZXNvdXJjZSBDb2xsZWN0aW9uPC9hPiB0eXBlcyBjYW4gc3BlY2lmeSB0aGUgcmVzb3VyY2VzIHRvIGJlCisgICAgICAgIGNvbmNhdGVuYXRlZC4KKyAgICAgIDwvcD4KKworICAgICAgPGg0PmZpbHRlcmNoYWluPC9oND4KKyAgICAgICAgPHA+PGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3A+CisgICAgICA8cD5UaGUgY29uY2F0IHRhc2sgc3VwcG9ydHMgbmVzdGVkCisgICAgICAgIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWx0ZXJjaGFpbi5odG1sIj4gRmlsdGVyQ2hhaW48L2E+cy48L3A+CisKKyAgICAgIDxoND5oZWFkZXIsIGZvb3RlcjwvaDQ+CisgICAgICAgIDxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC9wPgorICAgICAgPHA+VXNlZCB0byBwcmVwZW5kIG9yIHBvc3RwZW5kIHRleHQgaW50byB0aGUgY29uY2F0ZW5hdGVkIHN0cmVhbS48L3A+CisgICAgICA8cD5UaGUgdGV4dCBtYXkgYmUgaW4tbGluZSBvciBiZSBpbiBhIGZpbGUuPC9wPgorICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsdGVyaW5nPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgV2hldGhlciB0byBmaWx0ZXIgdGhlIHRleHQgcHJvdmlkZWQgYnkgdGhpcyBzdWIgZWxlbWVudCwKKyAgICAgICAgICAgIGRlZmF1bHQgaXMgInllcyIuCisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbiA9ICJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIGZpbGUgdG8gcGxhY2UgYXQgdGhlIGhlYWQgb3IgdGFpbCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdGVuYXRlZCB0ZXh0LgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ24gPSAiY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnRyaW08L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byB0cmltIHRoZSB2YWx1ZSwgZGVmYXVsdCBpcyAibm8iPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduID0gImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj50cmltbGVhZGluZzwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgIFdoZXRoZXIgdG8gdHJpbSBsZWFkaW5nIHdoaXRlIHNwYWNlIG9uIGVhY2ggbGluZSwgZGVmYXVsdCBpcyAibm8iCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduID0gImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KKworICAgICAgPGgzPkV4YW1wbGVzPC9oMz4KKworICAgICAgPHA+PGI+Q29uY2F0ZW5hdGUgYSBzdHJpbmcgdG8gYSBmaWxlOjwvYj48L3A+CisKKyAgICAgIDxwcmU+CisgICZsdDtjb25jYXQgZGVzdGZpbGU9JnF1b3Q7UkVBRE1FJnF1b3Q7Jmd0O0hlbGxvLCBXb3JsZCEmbHQ7L2NvbmNhdCZndDsKKyAgICAgIDwvcHJlPgorCisgICAgICA8cD48Yj5Db25jYXRlbmF0ZSBhIHNlcmllcyBvZiBmaWxlcyB0byB0aGUgY29uc29sZTo8L2I+PC9wPgorCisgICAgICA8cHJlPgorICAmbHQ7Y29uY2F0Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDttZXNzYWdlcyZxdW90OyBpbmNsdWRlcz0mcXVvdDsqaW1wb3J0YW50KiZxdW90Oy8mZ3Q7CisgICZsdDsvY29uY2F0Jmd0OworICAgICAgPC9wcmU+CisKKyAgICAgIDxwPjxiPkNvbmNhdGVuYXRlIGEgc2luZ2xlIGZpbGUsIGFwcGVuZGluZyBpZiB0aGUgZGVzdGluYXRpb24gZmlsZSBleGlzdHM6PC9iPjwvcD4KKworICAgICAgPHByZT4KKyAgJmx0O2NvbmNhdCBkZXN0ZmlsZT0mcXVvdDtOT1RFUyZxdW90OyBhcHBlbmQ9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZWxpc3QgZGlyPSZxdW90O25vdGVzJnF1b3Q7IGZpbGVzPSZxdW90O25vdGUudHh0JnF1b3Q7LyZndDsKKyAgJmx0Oy9jb25jYXQmZ3Q7CisgICAgICA8L3ByZT4KKworICAgICAgPHA+PGI+Q29uY2F0ZW5hdGUgYSBzZXJpZXMgb2YgZmlsZXMsIHVwZGF0ZSB0aGUgZGVzdGluYXRpb24KKyAgICAgIGZpbGUgb25seSBpZiBpcyBvbGRlciB0aGF0IGFsbCB0aGUgc291cmNlIGZpbGVzOjwvYj48L3A+CisKKyAgICAgIDxwcmU+CisgICZsdDtjb25jYXQgZGVzdGZpbGU9JnF1b3Q7JHtkb2Nib29rLmRpcn0vYWxsLXNlY3Rpb25zLnhtbCZxdW90OworICAgICAgICAgIGZvcmNlPSZxdW90O25vJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlbGlzdCBkaXI9JnF1b3Q7JHtkb2Nib29rLmRpcn0vc2VjdGlvbnMmcXVvdDsKKyAgICAgICAgIGZpbGVzPSZxdW90O2ludHJvZHVjdGlvbi54bWwsb3ZlcnZpZXcueG1sJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtkb2Nib29rLmRpcn0mcXVvdDsKKyAgICAgICAgIGluY2x1ZGVzPSZxdW90O3NlY3Rpb25zLyoueG1sJnF1b3Q7CisgICAgICAgICBleGNsdWRlcz0mcXVvdDtpbnRyb2R1Y3Rpb24ueG1sLG92ZXJ2aWV3LnhtbCZxdW90Oy8mZ3Q7CisgICZsdDsvY29uY2F0Jmd0OworICAgICAgPC9wcmU+CisKKyAgICAgIDxwPjxiPkNvbmNhdGVuYXRlIGEgc2VyaWVzIG9mIGZpbGVzLCBleHBhbmRpbmcgYW50IHByb3BlcnRpZXM8L2I+PC9wPgorICAgICAgICA8cHJlPgorICAgJmx0O2NvbmNhdCBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L3N1YnMiJmd0OworICAgICAgJmx0O3BhdGgmZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IioueG1sIi8mZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQueG1sIi8mZ3Q7CisgICAgICAmbHQ7L3BhdGgmZ3Q7CisgICAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgICAgICZsdDtleHBhbmRwcm9wZXJ0aWVzLyZndDsKKyAgICAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CisgICAmbHQ7L2NvbmNhdCZndDsKKyAgICAgICAgPC9wcmU+CisKKyAgICAgIDxwPjxiPkZpbHRlciB0aGUgbGluZXMgY29udGFpbmluZyBwcm9qZWN0IGZyb20gYnVpbGQueG1sIGFuZCBvdXRwdXQKKyAgICAgICAgICAgdGhlbSB0byByZXBvcnQub3V0cHV0LCBwcmVwZW5kaW5nIHdpdGggYSBoZWFkZXI8L2I+PC9wPgorICAgICAgICA8cHJlPgorICAgJmx0O2NvbmNhdCBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L3JlcG9ydC5vdXRwdXQiJmd0OworICAgICAgJmx0O2hlYWRlciBmaWx0ZXJpbmc9Im5vIiB0cmltbGVhZGluZz0ieWVzIiZndDsKKyAgICAgICAgICBMaW5lcyB0aGF0IGNvbnRhaW4gcHJvamVjdAorICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAmbHQ7L2hlYWRlciZndDsKKyAgICAgICZsdDtwYXRoIHBhdGg9ImJ1aWxkLnhtbCIvJmd0OworICAgICAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICAgICAgJmx0O2xpbmVjb250YWlucyZndDsKKyAgICAgICAgICAgJmx0O2NvbnRhaW5zIHZhbHVlPSJwcm9qZWN0Ii8mZ3Q7CisgICAgICAgICAmbHQ7L2xpbmVjb250YWlucyZndDsKKyAgICAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CisgICAmbHQ7L2NvbmNhdCZndDsKKyAgICAgICAgPC9wcmU+CisKKyAgICAgIDxwPjxiPkNvbmNhdGVuYXRlIGEgbnVtYmVyIG9mIGJpbmFyeSBmaWxlcy48L2I+PC9wPgorICAgICAgICA8cHJlPgorICAgJmx0O2NvbmNhdCBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L2Rpc3QuYmluIiBiaW5hcnk9InllcyImZ3Q7CisgICAgICZsdDtmaWxlc2V0IGZpbGU9IiR7c3JjLmRpcn0vc2NyaXB0cy9kaXN0LnNoIiAvJmd0OworICAgICAmbHQ7ZmlsZXNldCBmaWxlPSIke2J1aWxkLmRpcn0vZGlzdC50YXIuYnoyIiAvJmd0OworICAgJmx0Oy9jb25jYXQmZ3Q7CisgICAgICAgIDwvcHJlPgorCisgICAgICAKKworICAgIDwvYm9keT4KKworICA8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29uZGl0aW9uLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29uZGl0aW9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5MmY2ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jb25kaXRpb24uaHRtbApAQCAtMCwwICsxLDExMCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Db25kaXRpb24gVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iQ29uZGl0aW9uIj5Db25kaXRpb248L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5TZXRzIGEgcHJvcGVydHkgaWYgYSBjZXJ0YWluIGNvbmRpdGlvbiBob2xkcyB0cnVlIC0gdGhpcyBpcyBhCitnZW5lcmFsaXphdGlvbiBvZiA8YSBocmVmPSJhdmFpbGFibGUuaHRtbCI+QXZhaWxhYmxlPC9hPiBhbmQgPGEKK2hyZWY9InVwdG9kYXRlLmh0bWwiPlVwdG9kYXRlPC9hPi48L3A+Cis8cD5JZiB0aGUgY29uZGl0aW9uIGhvbGRzIHRydWUsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSBieQorZGVmYXVsdDsgb3RoZXJ3aXNlLCB0aGUgcHJvcGVydHkgaXMgbm90IHNldC4gWW91IGNhbiBzZXQgdGhlIHZhbHVlIHRvCitzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBieSBzcGVjaWZ5aW5nIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4KK2F0dHJpYnV0ZS48L3A+Cis8cD5Db25kaXRpb25zIGFyZSBzcGVjaWZpZWQgYXMgPGEgaHJlZj0iI25lc3RlZCI+bmVzdGVkIGVsZW1lbnRzPC9hPiwKK3lvdSBtdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgY29uZGl0aW9uLjwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvLiBEZWZhdWx0cyB0bworICAgICAgJnF1b3Q7dHJ1ZSZxdW90Oy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lbHNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvIGlmIHRoZSBjb25kaXRpb24KKyAgICAgIGV2YWx1YXRlcyB0byA8aT5mYWxzZTwvaT4uIEJ5IGRlZmF1bHQgdGhlIHByb3BlcnR5IHdpbGwgcmVtYWluIHVuc2V0LgorICAgICAgPGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+PGEgbmFtZT0ibmVzdGVkIj5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2E+PC9oMz4KKzxwPkFsbCBjb25kaXRpb25zIHRvIHRlc3QgYXJlIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHMsIGZvciBhCitjb21wbGV0ZSBsaXN0IHNlZSA8YSBocmVmPSJjb25kaXRpb25zLmh0bWwiPmhlcmU8L2E+LjwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+CisgICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7amF2YW1haWwuY29tcGxldGUmcXVvdDsmZ3Q7CisgICAgJmx0O2FuZCZndDsKKyAgICAgICZsdDthdmFpbGFibGUgY2xhc3NuYW1lPSZxdW90O2phdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXImcXVvdDsvJmd0OworICAgICAgJmx0O2F2YWlsYWJsZSBjbGFzc25hbWU9JnF1b3Q7amF2YXgubWFpbC5UcmFuc3BvcnQmcXVvdDsvJmd0OworICAgICZsdDsvYW5kJmd0OworICAmbHQ7L2NvbmRpdGlvbiZndDsKKzwvcHJlPgorPHA+c2V0cyB0aGUgcHJvcGVydHkgPGNvZGU+amF2YW1haWwuY29tcGxldGU8L2NvZGU+IGlmIGJvdGggdGhlCitKYXZhQmVhbnMgQWN0aXZhdGlvbiBGcmFtZXdvcmsgYW5kIEphdmFNYWlsIGFyZSBhdmFpbGFibGUgaW4gdGhlCitjbGFzc3BhdGguPC9wPgorCis8cHJlPgorICAmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSZxdW90O2lzTWFjT3NCdXROb3RNYWNPc1gmcXVvdDsmZ3Q7CisgICAgJmx0O2FuZCZndDsKKyAgICAgICZsdDtvcyBmYW1pbHk9JnF1b3Q7bWFjJnF1b3Q7LyZndDsKKworICAgICAgJmx0O25vdCZndDsKKyAgICAgICAgJmx0O29zIGZhbWlseT0mcXVvdDt1bml4JnF1b3Q7LyZndDsKKworICAgICAgJmx0Oy9ub3QmZ3Q7CisgICAgJmx0Oy9hbmQmZ3Q7CisgICZsdDsvY29uZGl0aW9uJmd0OworPC9wcmU+Cis8cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5pc01hY09zQnV0Tm90TWFjT3NYPC9jb2RlPiBpZiB0aGUgY3VycmVudAorb3BlcmF0aW5nIHN5c3RlbSBpcyBNYWNPUywgYnV0IG5vdCBNYWNPUyBYIC0gd2hpY2ggQW50IGNvbnNpZGVycyB0byBiZQoraW4gdGhlIFVuaXggZmFtaWx5IGFzIHdlbGwuPC9wPgorCis8cHJlPgorICAmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSZxdW90O2lzU3VuT1NvblNwYXJjJnF1b3Q7Jmd0OworICAgICZsdDtvcyBuYW1lPSZxdW90O1N1bk9TJnF1b3Q7IGFyY2g9JnF1b3Q7c3BhcmMmcXVvdDsvJmd0OworCisgICZsdDsvY29uZGl0aW9uJmd0OworPC9wcmU+Cis8cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5pc1N1bk9Tb25TcGFyYzwvY29kZT4gaWYgdGhlIGN1cnJlbnQKK29wZXJhdGluZyBzeXN0ZW0gaXMgU3VuT1MgYW5kIGlmIGl0IGlzIHJ1bm5pbmcgb24gYSBzcGFyYyBhcmNoaXRlY3R1cmUuPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NvbmRpdGlvbnMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jb25kaXRpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1ZjY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jb25kaXRpb25zLmh0bWwKQEAgLTAsMCArMSw5NjggQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Q29uZGl0aW9ucyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJDb25kaXRpb25zIj5Db25kaXRpb25zPC9hPjwvaDI+CisgIDxwPkNvbmRpdGlvbnMgYXJlIG5lc3RlZCBlbGVtZW50cyBvZiB0aGUgCis8YSBocmVmPSJjb25kaXRpb24uaHRtbCI+PGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+PC9hPiBhbmQKKzxhIGhyZWY9IndhaXRmb3IuaHRtbCI+PGNvZGU+Jmx0O3dhaXRmb3ImZ3Q7PC9jb2RlPjwvYT4gdGFza3MuCisgICAgVGhlcmUgYXJlIGNvcmUgY29uZGl0aW9ucyBhbmQgY3VzdG9tIGNvbmRpdGlvbnMuIEN1c3RvbQorICAgIGNvbmRpdGlvbnMgYXJlIGRlc2NyaWJlZCBpbgorICAgIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9jdXN0b20tcHJvZ3JhbW1pbmcuaHRtbCNjdXN0b21jb25kaXRpb25zIj4KKyAgICAgIEN1c3RvbSBDb25kaXRpb25zPC9hPi4KKyAgICBDb3JlIENvbmRpdGlvbnMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKyAgPC9wPgorICA8aDM+PGEgbmFtZT0iY29yZWNvbmRpdGlvbnMiPkNvcmUgQ29uZGl0aW9uczwvYT48L2gzPgorCis8cD5UaGVzZSBhcmUgdGhlIG5lc3RlZCBlbGVtZW50cyB0aGF0IGNhbiBiZSB1c2VkIGFzIGNvbmRpdGlvbnMgaW4gdGhlCis8YSBocmVmPSJjb25kaXRpb24uaHRtbCI+PGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+PC9hPiBhbmQKKzxhIGhyZWY9IndhaXRmb3IuaHRtbCI+PGNvZGU+Jmx0O3dhaXRmb3ImZ3Q7PC9jb2RlPjwvYT4gdGFza3MuPC9wPgorCis8aDQ+bm90PC9oND4KKzxwPlRoZSA8Y29kZT4mbHQ7bm90Jmd0OzwvY29kZT4gZWxlbWVudCBleHBlY3RzIGV4YWN0bHkgb25lIG90aGVyCitjb25kaXRpb24gdG8gYmUgbmVzdGVkIGludG8gdGhpcyBlbGVtZW50LCBuZWdhdGluZyB0aGUgcmVzdWx0IG9mIHRoZQorY29uZGl0aW9uLiAgSXQgZG9lc24ndCBoYXZlIGFueSBhdHRyaWJ1dGVzIGFuZCBhY2NlcHRzIGFsbCBuZXN0ZWQKK2VsZW1lbnRzIG9mIHRoZSBjb25kaXRpb24gdGFzayBhcyBuZXN0ZWQgZWxlbWVudHMgYXMgd2VsbC48L3A+CisKKzxoND5hbmQ8L2g0PiA8cD4KK1RoZSA8Y29kZT4mbHQ7YW5kJmd0OzwvY29kZT4gZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGF0dHJpYnV0ZXMgYW5kCithY2NlcHRzIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgY29uZGl0aW9ucyBhcyBuZXN0ZWQgZWxlbWVudHMgLSBhbGwKK25lc3RlZCBlbGVtZW50cyBvZiB0aGUgY29uZGl0aW9uIHRhc2sgYXJlIHN1cHBvcnRlZC4gIFRoaXMgY29uZGl0aW9uCitpcyB0cnVlIGlmIGFsbCBvZiBpdHMgY29udGFpbmVkIGNvbmRpdGlvbnMgYXJlLCBjb25kaXRpb25zIHdpbGwgYmUKK2V2YWx1YXRlZCBpbiB0aGUgb3JkZXIgdGhleSBoYXZlIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBidWlsZCBmaWxlLjwvcD4KKzxwPlRoZSA8Y29kZT4mbHQ7YW5kJmd0OzwvY29kZT4gY29uZGl0aW9uIGhhcyB0aGUgc2FtZSBzaG9ydGN1dAorc2VtYW50aWNzIGFzIHRoZSBKYXZhICZhbXA7JmFtcDsgb3BlcmF0b3IsIGFzIHNvb24gYXMgb25lIG9mIHRoZQorbmVzdGVkIGNvbmRpdGlvbnMgaXMgZmFsc2UsIG5vIG90aGVyIGNvbmRpdGlvbiB3aWxsIGJlIGV2YWx1YXRlZC48L3A+CisKKzxoND5vcjwvaDQ+IDxwPgorVGhlIDxjb2RlPiZsdDtvciZndDs8L2NvZGU+IGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBhdHRyaWJ1dGVzIGFuZAorYWNjZXB0cyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGNvbmRpdGlvbnMgYXMgbmVzdGVkIGVsZW1lbnRzIC0gYWxsCituZXN0ZWQgZWxlbWVudHMgb2YgdGhlIGNvbmRpdGlvbiB0YXNrIGFyZSBzdXBwb3J0ZWQuICBUaGlzIGNvbmRpdGlvbgoraXMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgaXRzIGNvbnRhaW5lZCBjb25kaXRpb25zIGlzLCBjb25kaXRpb25zCit3aWxsIGJlIGV2YWx1YXRlZCBpbiB0aGUgb3JkZXIgdGhleSBoYXZlIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBidWlsZAorZmlsZS48L3A+IDxwPlRoZSA8Y29kZT4mbHQ7b3ImZ3Q7PC9jb2RlPiBjb25kaXRpb24gaGFzIHRoZSBzYW1lCitzaG9ydGN1dCBzZW1hbnRpY3MgYXMgdGhlIEphdmEgfHwgb3BlcmF0b3IsIGFzIHNvb24gYXMgb25lIG9mIHRoZQorbmVzdGVkIGNvbmRpdGlvbnMgaXMgdHJ1ZSwgbm8gb3RoZXIgY29uZGl0aW9uIHdpbGwgYmUgZXZhbHVhdGVkLjwvcD4KKworPGg0PnhvcjwvaDQ+Cis8cD5UaGUgPGNvZGU+Jmx0O3hvciZndDs8L2NvZGU+IGVsZW1lbnQgcGVyZm9ybXMgYW4gZXhjbHVzaXZlCitvciBvbiBhbGwgbmVzdGVkIGVsZW1lbnRzLCBzaW1pbGFyIHRvIHRoZSA8Y29kZT5ePC9jb2RlPiBvcGVyYXRvcgoraW4gSmF2YS4gSXQgb25seSBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiBhbiBvZGQgbnVtYmVyIG9mIG5lc3RlZCBjb25kaXRpb25zCithcmUgdHJ1ZS4gVGhlcmUgaXMgbm8gc2hvcnRjdXR0aW5nIG9mIGV2YWx1YXRpb24sIHVubGlrZSB0aGUgPGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O29yJmd0OzwvY29kZT4gdGVzdHMuCitJdCBkb2Vzbid0IGhhdmUgYW55IGF0dHJpYnV0ZXMgYW5kIGFjY2VwdHMgYWxsIG5lc3RlZAorZWxlbWVudHMgb2YgdGhlIGNvbmRpdGlvbiB0YXNrIGFzIG5lc3RlZCBlbGVtZW50cyBhcyB3ZWxsLjwvcD4KKworPGg0PmF2YWlsYWJsZTwvaDQ+Cis8cD5UaGlzIGNvbmRpdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIDxhCitocmVmPSJhdmFpbGFibGUuaHRtbCI+QXZhaWxhYmxlPC9hPiB0YXNrLCBhbGwgYXR0cmlidXRlcyBhbmQgbmVzdGVkCitlbGVtZW50cyBvZiB0aGF0IHRhc2sgYXJlIHN1cHBvcnRlZCwgdGhlIHByb3BlcnR5IGFuZCB2YWx1ZSBhdHRyaWJ1dGVzCithcmUgcmVkdW5kYW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuPC9wPgorCis8aDQ+dXB0b2RhdGU8L2g0PgorPHA+VGhpcyBjb25kaXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA8YQoraHJlZj0idXB0b2RhdGUuaHRtbCI+VXB0b2RhdGU8L2E+IHRhc2ssIGFsbCBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQKK2VsZW1lbnRzIG9mIHRoYXQgdGFzayBhcmUgc3VwcG9ydGVkLCB0aGUgcHJvcGVydHkgYW5kIHZhbHVlIGF0dHJpYnV0ZXMKK2FyZSByZWR1bmRhbnQgYW5kIHdpbGwgYmUgaWdub3JlZC48L3A+CisKKzxoND5vczwvaDQ+Cis8cD5UZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBvZiBhIGdpdmVuIHR5cGUuICBFYWNoCitkZWZpbmVkIGF0dHJpYnV0ZSBpcyB0ZXN0ZWQgYW5kIHRoZSByZXN1bHQgaXMgdHJ1ZSBvbmx5IGlmIDxpPmFsbDwvaT4KK3RoZSB0ZXN0cyBzdWNjZWVkLgorPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFtaWx5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGZhbWlseSB0byBleHBlY3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBleHBlY3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YXJjaDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGV4cGVjdC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJzaW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2ZXJzaW9uIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGV4cGVjdC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPlN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmYW1pbHkgYXR0cmlidXRlIGFyZToKKzx1bD4KKyAgPGxpPndpbmRvd3MgKGZvciBhbGwgdmVyc2lvbnMgb2YgTWljcm9zb2Z0IFdpbmRvd3MpPC9saT4KKyAgPGxpPmRvcyAoZm9yIGFsbCBNaWNyb3NvZnQgRE9TIGJhc2VkIG9wZXJhdGluZyBzeXN0ZW1zIGluY2x1ZGluZworICAgIE1pY3Jvc29mdCBXaW5kb3dzIGFuZCBPUy8yKTwvbGk+CisgIDxsaT5tYWMgKGZvciBhbGwgQXBwbGUgTWFjaW50b3NoIHN5c3RlbXMpPC9saT4KKyAgPGxpPnVuaXggKGZvciBhbGwgVW5peCBhbmQgVW5peC1saWtlIG9wZXJhdGluZyBzeXN0ZW1zKTwvbGk+CisgIDxsaT5uZXR3YXJlIChmb3IgTm92ZWxsIE5ldFdhcmUpPC9saT4KKyAgPGxpPm9zLzIgKGZvciBPUy8yKTwvbGk+CisgIDxsaT50YW5kZW0gKGZvciBIUCdzIE5vblN0b3AgS2VybmVsIC0gZm9ybWVybHkgVGFuZGVtKTwvbGk+CisgIDxsaT53aW45eCBmb3IgTWljcm9zb2Z0IFdpbmRvd3MgOTUgYW5kIDk4LCBNRSBhbmQgQ0U8L2xpPgorICA8bGk+d2lubnQgZm9yIE1pY3Jvc29mdCBXaW5kb3dzIE5ULWJhc2VkIHN5c3RlbXMsIGluY2x1ZGluZyBXaW5kb3dzIDIwMDAsIFhQIGFuZAorICAgICAgc3VjY2Vzc29yczwvbGk+CisgIDxsaT56L29zIGZvciB6L09TIGFuZCBPUy8zOTA8L2xpPgorICA8bGk+b3MvNDAwIGZvciBPUy80MDA8L2xpPgorICA8bGk+b3BlbnZtcyBmb3IgT3BlblZNUzwvbGk+Cis8L3VsPgorCis8aDQ+ZXF1YWxzPC9oND4KKzxwPlRlc3RzIHdoZXRoZXIgdGhlIHR3byBnaXZlbiBTdHJpbmdzIGFyZSBpZGVudGljYWw8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hcmcxPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkZpcnN0IHN0cmluZyB0byB0ZXN0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hcmcyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNlY29uZCBzdHJpbmcgdG8gdGVzdC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5QZXJmb3JtIGEgY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNpb24uICBEZWZhdWx0IGlzCisgICAgICAgIHRydWUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHJpbTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UcmltIHdoaXRlc3BhY2UgZnJvbSBhcmd1bWVudHMgYmVmb3JlIGNvbXBhcmluZworICAgICAgICB0aGVtLiAgRGVmYXVsdCBpcyBmYWxzZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0Pmlzc2V0PC9oND4KKzxwPlRlc3Qgd2hldGhlciBhIGdpdmVuIHByb3BlcnR5IGhhcyBiZWVuIHNldCBpbiB0aGlzIHByb2plY3QuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHRlc3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+Y2hlY2tzdW08L2g0PgorPHA+VGhpcyBjb25kaXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA8YSBocmVmPSJjaGVja3N1bS5odG1sIj5DaGVja3N1bTwvYT4KK3Rhc2ssIGFsbCBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgb2YgdGhhdCB0YXNrIGFyZSBzdXBwb3J0ZWQsCit0aGUgcHJvcGVydHkgYW5kIG92ZXJ3cml0ZSBhdHRyaWJ1dGVzIGFyZSByZWR1bmRhbnQgYW5kIHdpbGwgYmUKK2lnbm9yZWQuPC9wPgorCis8aDQ+aHR0cDwvaDQ+Cis8cD5UaGUgPGNvZGU+aHR0cDwvY29kZT4gY29uZGl0aW9uIGNoZWNrcyBmb3IgYSB2YWxpZCByZXNwb25zZSBmcm9tIGEKK3dlYiBzZXJ2ZXIgb2YgdGhlIHNwZWNpZmllZCB1cmwuIEJ5IGRlZmF1bHQsIEhUVFAgcmVzcG9uc2VzIGVycm9ycworb2YgNDAwIG9yIGdyZWF0ZXIgYXJlIHZpZXdlZCBhcyBpbnZhbGlkLjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVybDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZnVsbCBVUkwgb2YgdGhlIHBhZ2UgdG8gcmVxdWVzdC4gVGhlIHdlYiBzZXJ2ZXIgbXVzdAorICAgICAgcmV0dXJuIGEgc3RhdHVzIGNvZGUgYmVsb3cgdGhlIHZhbHVlIG9mIDx0dD5lcnJvcnNCZWdpbkF0PC90dD48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3JzQmVnaW5BdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbG93ZXN0IEhUVFAgcmVzcG9uc2UgY29kZSB0aGF0IHNpZ25hbHMgYW4gZXJyb3I7CisgICAgYnkgZGVmYXVsdCAnNDAwJzsgc2VydmVyIGVycm9ycywgbm90LWF1dGhvcml6ZWQsIG5vdC1mb3VuZCBhbmQgdGhlIGxpa2UKKyAgICBhcmUgZGV0ZWN0ZWQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+c29ja2V0PC9oND4KKzxwPlRoZSA8Y29kZT5zb2NrZXQ8L2NvZGU+IGNvbmRpdGlvbiBjaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYQorVENQL0lQIGxpc3RlbmVyIGF0IHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC48L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZXJ2ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIEROUyBuYW1lIG9yIElQIGFkZHJlc3Mgb2YgdGhlIHNlcnZlci48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcG9ydCBudW1iZXIgdG8gY29ubmVjdCB0by48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5maWxlc21hdGNoPC9oND4KKzxwPlRlc3QgdHdvIGZpbGVzIGZvciBtYXRjaGluZy4gTm9uZXhpc3RlbmNlIG9mIG9uZSBmaWxlIHJlc3VsdHMgaW4gImZhbHNlIiwKK2FsdGhvdWdoIGlmIG5laXRoZXIgZXhpc3RzIHRoZXkgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaW4gdGVybXMgb2YgY29udGVudC4KK1RoaXMgdGVzdCBkb2VzIGEgYnl0ZSBmb3IgYnl0ZSBjb21wYXJpc2lvbiwgc28gdGVzdCB0aW1lIHNjYWxlcyB3aXRoCitieXRlIHNpemUuIE5COiBpZiB0aGUgZmlsZXMgYXJlIGRpZmZlcmVudCBzaXplcywgb25lIG9mIHRoZW0gaXMgbWlzc2luZworb3IgdGhlIGZpbGVuYW1lcyBtYXRjaCB0aGUgYW5zd2VyIGlzIHNvIG9idmlvdXMgdGhlIGRldGFpbGVkIHRlc3QgaXMgb21pdHRlZC4KKworPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTE8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Rmlyc3QgZmlsZSB0byB0ZXN0PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2Vjb25kIGZpbGUgdG8gdGVzdDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRleHRmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaWdub3JlIGxpbmUgZW5kaW5ncworICAgICAgICB3aGVuIGNvbXBhcmluZyBmaWxlczsgZGVmYXVsdHMgdG8gPGk+ZmFsc2U8L2k+LCB3aGlsZQorICAgICAgICA8aT50cnVlPC9pPiB0cmlnZ2VycyBhIGJpbmFyeSBjb21wYXJpc29uLiA8Yj5TaW5jZSBBbnQgMS43PC9iPgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5jb250YWluczwvaDQ+Cis8cD5UZXN0cyB3aGV0aGVyIGEgc3RyaW5nIGNvbnRhaW5zIGFub3RoZXIgb25lLjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN0cmluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc3RyaW5nIHRvIHNlYXJjaCBpbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3Vic3RyaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5QZXJmb3JtIGEgY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNpb24uICBEZWZhdWx0IGlzCisgICAgICAgIHRydWUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5pc3RydWU8L2g0PgorPHA+VGVzdHMgd2hldGhlciBhIHN0cmluZyBlcXVhbHMgYW55IG9mIHRoZSBhbnQgZGVmaW5pdGlvbnMgb2YgdHJ1ZSwKK3RoYXQgaXMgInRydWUiLCJ5ZXMiLCBvciAib24iPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgdG8gdGVzdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7aXN0cnVlIHZhbHVlPSZxdW90OyR7c29tZXByb3BlcnR5fSZxdW90Oy8mZ3Q7CismbHQ7aXN0cnVlIHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPGg0PmlzZmFsc2U8L2g0PgorPHA+VGVzdHMgd2hldGhlciBhIHN0cmluZyBpcyBub3QgdHJ1ZSwgdGhlIG5lZ2F0aW9uIG9mICZsdDtpc3RydWUmZ3Q7Cis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZSB0byB0ZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtpc2ZhbHNlIHZhbHVlPSZxdW90OyR7c29tZXByb3BlcnR5fSZxdW90Oy8mZ3Q7CismbHQ7aXNmYWxzZSB2YWx1ZT0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxoND5pc3JlZmVyZW5jZTwvaDQ+CisKKzxwPlRlc3Qgd2hldGhlciBhIGdpdmVuIHJlZmVyZW5jZSBoYXMgYmVlbiBkZWZpbmVkIGluIHRoaXMgcHJvamVjdCBhbmQKKy0gb3B0aW9uYWxseSAtIGlzIG9mIGFuIGV4cGVjdGVkIHR5cGUuPC9wPgorCis8cD5UaGlzIGNvbmRpdGlvbiBoYXMgYmVlbiBhZGRlZCBpbiBBcGFjaGUgQW50IDEuNi48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlZmlkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpZCBvZiB0aGUgcmVmZXJlbmNlIHRvIHRlc3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiB0aGUgZGF0YSB0eXBlIG9yIHRhc2sgdGhpcyByZWZlcmVuY2UgaXMKKyAgICAgICBleHBlY3RlZCB0byBiZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKyAgPGg0Pmlzc2lnbmVkPC9oND4KKyAgPHA+CisgICAgVGVzdCB3aGV0aGVyIGEgamFyZmlsZSBpcyBzaWduZWQuCisgICAgSWYgdGhlIG5hbWUgb2YgdGhlCisgICAgc2lnbmF0dXJlIGlzIHBhc3NlZCwgdGhlIGZpbGUgaXMgY2hlY2tlZCBmb3IgcHJlc2VuY2Ugb2YgdGhhdAorICAgIHBhcnRpY3VsYXIgc2lnbmF0dXJlOyBvdGhlcndpc2UgdGhlIGZpbGUgaXMgY2hlY2tlZCBmb3IgdGhlCisgICAgZXhpc3RlbmNlIG9mIGFueSBzaWduYXR1cmUuIEl0IGRvZXMgbm90IHBlcmZvcm0gcmlnb3JvdXMKKyAgICBzaWduYXR1cmUgdmFsaWRhdGlvbjsgaXQgb25seSBsb29rcyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgc2lnbmF0dXJlLgorICA8L3A+CisgIDxwPgorICAgIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBBcGFjaGUgQW50IDEuNy4KKyAgPC9wPgorICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgVGhlIGphcmZpbGUgdGhhdCBpcyB0byBiZSB0ZXN0ZWQgZm9yIHRoZSBwcmVzZW5jZQorICAgICAgb2YgYSBzaWduYXR1cmUuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+IFRoZSBzaWduYXR1cmUgbmFtZSB0byBjaGVjayBmb3IuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPC90YWJsZT4KKyAgPGg0PmlzZmlsZXNlbGVjdGVkPC9oND4KKyAgPHA+CisgICAgVGVzdCB3aGV0aGVyIGEgZmlsZSBwYXNzZXMgYW4gZW1iZWRkZWQKKyAgICA8YSBocmVmPSIuLi9Db3JlVHlwZXMvc2VsZWN0b3JzLmh0bWwiPnNlbGVjdG9yPC9hPi4KKyAgPC9wPgorICA8cD4KKyAgICBUaGlzIGNvbmRpdGlvbiB3YXMgYWRkZWQgaW4gQXBhY2hlIEFudCAxLjYuMy4KKyAgPC9wPgorICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgVGhlIGZpbGUgdG8gY2hlY2sgaWYgaXMgcGFzc2VzIHRoZSBlbWJlZGRlZCBzZWxlY3Rvci4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgdG8gdXNlIGZvciBuYW1lIGJhc2VkIHNlbGVjdG9ycy4gSXQgdGhpcyBpcyBub3Qgc2V0LAorICAgICAgdGhlIHByb2plY3QncyBiYXNlZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8L3RhYmxlPgorICA8cD4KKyAgICBFeGFtcGxlIHVzYWdlOgorICA8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2lzZmlsZXNlbGVjdGVkIGZpbGU9ImEueG1sIiZndDsKKyAgJmx0O2RhdGUgZGF0ZXRpbWU9IjA2LzI4LzIwMDAgMjowMiBwbSIgd2hlbj0iZXF1YWwiLyZndDsKKyZsdDsvaXNmaWxlc2VsZWN0ZWQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8aDQ+dHlwZWZvdW5kPC9oND4KKworPHA+VGVzdCB3aGV0aGVyIGEgZ2l2ZW4gdHlwZSBpcyBkZWZpbmVkLCBhbmQgdGhhdAoraXRzIGltcGxlbWVudGF0aW9uIGNsYXNzIGNhbiBiZSBsb2FkZWQuIFR5cGVzIGluY2x1ZGUKK3Rhc2tzLCBkYXRhdHlwZXMsIHNjcmlwdGRlZnMsIG1hY3JvZGVmcyBhbmQgcHJlc2V0ZGVmcy48L3A+CisKKzxwPlRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBBcGFjaGUgQW50IDEuNy48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZSBvZiB0aGUgdHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51cmk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGUgdXJpIHRoYXQgdGhpcyB0eXBlIGxpdmVzIGluLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCisgIDxwPgorICAgIEV4YW1wbGUgdXNhZ2VzOgorICA8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3R5cGVmb3VuZCBuYW1lPSJqdW5pdCIvJmd0OworJmx0O3R5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgbmFtZT0iYXJ0aWZhY3QiLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPGg0PnNjcmlwdGNvbmRpdGlvbjwvaDQ+CisKKzxwPkV2YWx1YXRlIGEgY29uZGl0aW9uIGJhc2VkIG9uIGEgc2NyaXB0IGluIGFueQorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YiIHRhcmdldD0iX3RvcCI+QXBhY2hlIEJTRjwvYT4KKyAgb3IKKyAgPGEgaHJlZj0iaHR0cHM6Ly9zY3JpcHRpbmcuZGV2LmphdmEubmV0Ij5KU1IgMjIzPC9hPgorc3VwcG9ydGVkIGxhbmd1YWdlLgorPC9wPgorPHA+CitTZWUgdGhlIDxhIGhyZWY9Ii4uL09wdGlvbmFsVGFza3Mvc2NyaXB0Lmh0bWwiPlNjcmlwdDwvYT4gdGFzayBmb3IKK2FuIGV4cGxhbmF0aW9uIG9mIHNjcmlwdHMgYW5kIGRlcGVuZGVuY2llcy4KKzwvcD4KKworPHA+VGhpcyBjb25kaXRpb24gd2FzIGFkZGVkIGluIEFwYWNoZSBBbnQgMS43LjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGFuZ3VhZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2NyaXB0IGxhbmd1YWdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmFnZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGUgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyIHRvIHVzZS4KKyAgICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vT3B0aW9uYWxUYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCisgICAgICBmb3IgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdCBpcyAiYXV0byI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0IGJvb2xlYW4gdmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLWRlZmF1bHQgaXMgImZhbHNlIjwvdGQ+CisgIDwvdHI+ICAKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVuYW1lIG9mIHNjcmlwdCBzb3VyY2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZXRiZWFuczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRvIGhhdmUgYWxsIHByb3BlcnRpZXMsIHJlZmVyZW5jZXMgYW5kIHRhcmdldHMgYXMKKyAgICAgIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIHNjcmlwdC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgInRydWUiLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIFRoZSBjbGFzc3BhdGggdG8gcGFzcyBpbnRvIHRoZSBzY3JpcHQuCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhCisgICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDU+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oNT4KKzxoNj5jbGFzc3BhdGg8L2g2PgorICA8cD4KKyAgICBTZWUgdGhlIDxhIGhyZWY9Ii4uL09wdGlvbmFsVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzaworICAgIGZvciB1c2luZyB0aGlzIG5lc3RlZCBlbGVtZW50LgorICA8L3A+Cis8aDU+RGVzY3JpcHRpb248L2g1PgorPHA+CitUaGUgc2NyaXB0IHN1cHBvcnRzIHNjcmlwdCBsYW5ndWFnZSBpbmxpbmUsIHRoaXMgc2NyaXB0IGhhcyBhY2Nlc3MgdG8gdGhlCitzYW1lIGJlYW5zIGFzIHRoZSA8Y29kZT4mbHQ7c2NyaXB0Jmd0OzwvY29kZT4gdGFzaywgYW5kIHRvIHRoZSA8Y29kZT5zZWxmPC9jb2RlPiBiZWFuLAord2hpY2ggcmVmZXJzIGJhY2sgdG8gdGhlIGNvbmRpdGlvbiBpdHNlbGYuIElmIHRoZSBzY3JpcHQgZXZhbHVhdGVzIHRvIGEgYm9vbGVhbiByZXN1bHQsCit0aGlzIGlzIHRoZSByZXN1bHQgb2YgdGhlIGNvbmRpdGlvbidzIGV2YWx1YXRpb24gKDxlbT5zaW5jZSBBbnQgMS43LjE8L2VtPikuCitBbHRlcm5hdGl2ZWx5LCA8Y29kZT5zZWxmLnZhbHVlPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGV2YWx1YXRpb24gcmVzdWx0LgorPC9wPgorPHA+CitFeGFtcGxlOgorPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtzY3JpcHRjb25kaXRpb24gbGFuZ3VhZ2U9JnF1b3Q7amF2YXNjcmlwdCZxdW90OworICAgICAgICB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAgIHNlbGYuc2V0VmFsdWUoZmFsc2UpOworJmx0Oy9zY3JpcHRjb25kaXRpb24mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK1NldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbmRpdGlvbiB0byB0cnVlLCB0aGVuIGluIHRoZSBzY3JpcHQsIAorc2V0cyB0aGUgdmFsdWUgdG8gZmFsc2UuIFRoaXMgY29uZGl0aW9uIGFsd2F5cyBldmFsdWF0ZXMgdG8gImZhbHNlIgorCis8aDQ+cGFyc2Vyc3VwcG9ydHM8L2g0PgorCis8cD5UZXN0cyB3aGV0aGVyIEFudCdzIFhNTCBwYXJzZXIgc3VwcG9ydHMgYSBnaXZlbgorZmVhdHVyZSBvciBwcm9wZXJ0eSwgYXMgcGVyIHRoZSBTQVgvSkFYUCBzcGVjaWZpY2F0aW9ucywgYnkKK2F0dGVtcHRpbmcgdG8gc2V0IHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0eS9mZWF0dXJlLzwvcD4KKworPHA+VGhpcyBjb25kaXRpb24gd2FzIGFkZGVkIGluIEFwYWNoZSBBbnQgMS43LjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHkgdG8gc2V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm9uZSBvZiBwcm9wZXJ0eSBvciBmZWF0dXJlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmVhdHVyZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mZWF0dXJlIHRvIHNldDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5vbmUgb2YgcHJvcGVydHkgb3IgZmVhdHVyZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN0cmluZyAocHJvcGVydHkpIG9yIGJvb2xlYW4gKGZlYXR1cmUpPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPkZvciBwcm9wZXJ0eSB0ZXN0cywgYnV0IG5vdCBmb3IgZmVhdHVyZSB0ZXN0czwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O3BhcnNlcnN1cHBvcnRzIGZlYXR1cmU9Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIi8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CitDaGVjayBmb3IgbmFtZXNwYWNlIHN1cHBvcnQuIEFsbCBTQVgyIHBhcnNlcnMgc2hvdWxkIGhhdmUgdGhpcy4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7b3ImZ3Q7CisgICZsdDtwYXJzZXJzdXBwb3J0cworICAgIGZlYXR1cmU9Imh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIvJmd0OworICAmbHQ7cGFyc2Vyc3VwcG9ydHMKKyAgICBmZWF0dXJlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hU291cmNlIi8mZ3Q7CismbHQ7L29yJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCitDaGVjayBmb3IgWE1MIFNjaGVtYSBzdXBwb3J0LgorCis8cHJlPgorJmx0O3BhcnNlcnN1cHBvcnRzCisgIHByb3BlcnR5PSJodHRwOi8vYXBhY2hlLm9yZy94bWwvcHJvcGVydGllcy9zY2hlbWEvZXh0ZXJuYWwtbm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIKKyAgdmFsdWU9ImRvY3VtZW50LnhzZCIvJmd0OworPC9wcmU+CisKK0NoZWNrIGZvciBYZXJjZXMtc3BlY2lmaWMgZGVmaW5pdGlvbiBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIG5vIG5hbWVzcGFjZSBzY2hlbWEuCisKKzxoND5pc3JlYWNoYWJsZTwvaDQ+CisKKzxwPlVzZXMgSmF2YTEuNSsgbmV0d29ya2luZyBBUElzIHRvIHByb2JlIGZvciBhIChyZW1vdGUpIHN5c3RlbSBiZWluZworcmVhY2hhYmxlLiBFeGFjdGx5IHdoYXQgcHJvYmUgbWVjaGFuaXNtcyBhcmUgdXNlZCBpcyBhbiBpbXBsZW1lbnRhdGlvbgorZmVhdHVyZSBvZiB0aGUgSlZNLiBUaGV5IG1heSBpbmNsdWRlIElDTVAgInBpbmciIHBhY2tldHMsIFVEUCBvciBUQ1AgY29ubmVjdGlvbnMKK3RvIHBvcnQgNyAiZWNobyBzZXJ2aWNlIiBvciBvdGhlciBtZWFucy4gT24gSmF2YTEuNCBhbmQgZWFybGllciwgYmVpbmcgYWJsZQordG8gcmVzb2x2ZSB0aGUgaG9zdG5hbWUgaXMgY29uc2lkZXJlZCBzdWNjZXNzLiBUaGlzIG1lYW5zIHRoYXQgaWYgRE5TIGlzIG5vdAord29ya2luZyBvciBhIFVSTC9ob3N0bmFtZSBpcyBiYWQsIHRoZSB0ZXN0IHdpbGwgZmFpbCwgYnV0IG90aGVyd2lzZSBzdWNjZWVkCitldmVuIGlmIHRoZSByZW1vdGUgaG9zdCBpcyBhY3R1YWxseSBhYnNlbnQuCisKKzwvcD4KKzxwPgorVGhpcyBjb25kaXRpb24gdHVybnMgdW5rbm93biBob3N0IGV4Y2VwdGlvbnMgaW50byBmYWxzZSBjb25kaXRpb25zLiBUaGlzIGlzCitiZWNhdXNlIG9uIGEgbGFwdG9wLCBETlMgaXMgb25lIG9mIHRoZSBmaXJzdCBzZXJ2aWNlcyB3aGVuIHRoZSBuZXR3b3JrIGdvZXM7IHlvdQorYXJlIGltcGxpY2l0bHkgb2ZmbGluZS4KKzwvcD4KKzxwPgorIElmIGEgVVJMIGlzIHN1cHBsaWVkIGluc3RlYWQgb2YgYSBob3N0LCB0aGUgaG9zdG5hbWUgaXMgZXh0cmFjdGVkCisgYW5kIHVzZWQgaW4gdGhlIHRlc3QgLSBhbGwgb3RoZXIgcGFydHMgb2YgdGhlIFVSTCBhcmUgZGlzY2FyZGVkLgorPC9wPgorPHA+CitUaGUgdGVzdCBtYXkgbm90IHdvcmsgdGhyb3VnaCBmaXJld2FsbHMsIHRoYXQgaXMsIHNvbWV0aGluZyBtYXkgYmUgcmVhY2hhYmxlCit1c2luZyBhIHByb3RvY29sIHN1Y2ggYXMgSFRUUCwgd2hpbGUgdGhlIGxvd2VyIGxldmVsIElDTVAgcGFja2V0cyBnZXQgZHJvcHBlZAorb24gdGhlIGZsb29yLiBTaW1pbGFybHksIGEgaG9zdCBtYXkgZGV0ZWN0ZWQgYXMgcmVhY2hhYmxlIHdpdGggSUNNUCwgYnV0Citub3QgcmVhY2hhYmxlIG9uIG90aGVyIHBvcnRzIChpLmUuIHBvcnQgODApLCBiZWNhdXNlIG9mIGZpcmV3YWxscy4KKzwvcD4KKzxwPgorCitUaGlzIGNvbmRpdGlvbiB3YXMgYWRkZWQgaW4gQXBhY2hlIEFudCAxLjcuPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ob3N0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmhvc3QgdG8gY2hlY2sgZm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm9uZSBvZiB1cmwgb3IgaG9zdDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVybDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5VUkwgY29udGFpbmluZyBob3N0bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5vbmUgb2YgdXJsIG9yIGhvc3Q8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aW1lb3V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVvdXQgaW4gc2Vjb25kczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubywgZGVmYXVsdCBpcyAzMHM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtjb25kaXRpb24gcHJvcGVydHk9Im9mZmxpbmUiJmd0OworICAmbHQ7aXNyZWFjaGFibGUgdXJsPSJodHRwOi8vaWJpYmxpby5vcmcvbWF2ZW4vIiAvJmd0OworJmx0Oy9jb25kaXRpb24mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPgorUHJvYmUgZm9yIHRoZSBtYXZlbiByZXBvc2l0b3J5IGJlaW5nIHJlYWNoYWJsZS4KKzwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtjb25kaXRpb24gcHJvcGVydHk9Im9mZmxpbmUiJmd0OworICAmbHQ7aXNyZWFjaGFibGUgaG9zdD0iaWJpYmxpby5vcmciIHRpbWVvdXQ9IjEwIiAvJmd0OworJmx0Oy9jb25kaXRpb24mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPgorUHJvYmUgZm9yIHRoZSBtYXZlbiByZXBvc2l0b3J5IGJlaW5nIHJlYWNoYWJsZSB1c2luZyB0aGUgaG9zdG5hbWUsIHRlbiBzZWNvbmQgdGltZW91dC4uCis8L3A+CisKKzxoND5sZW5ndGg8L2g0PgorPHA+VGhpcyBjb25kaXRpb24gaXMgYSBmYWNldCBvZiB0aGUgPGEgaHJlZj0ibGVuZ3RoLmh0bWwiPkxlbmd0aDwvYT4gdGFzay4KKyAgSXQgaXMgdXNlZCB0byB0ZXN0IHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgb3Igb25lIG9yIG1vcmUgZmlsZXMuCisgIDxiPlNpbmNlIEFudCAxLjYuMzwvYj4KKzwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtsZW5ndGggc3RyaW5nPSIgZm9vICIgdHJpbT0idHJ1ZSIgbGVuZ3RoPSIzIiAvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+VmVyaWZ5IGEgc3RyaW5nIGlzIG9mIGEgY2VydGFpbiBsZW5ndGguPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xlbmd0aCBmaWxlPSZxdW90O2ZvbyZxdW90OyB3aGVuPSZxdW90O2dyZWF0ZXImcXVvdDsgbGVuZ3RoPSZxdW90OzAmcXVvdDsgLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPlZlcmlmeSB0aGF0IGZpbGUgPGk+Zm9vPC9pPiBpcyBub3QgZW1wdHkuPC9wPgorCis8aDQ+aXNmYWlsdXJlPC9oND4KKworPHA+VGVzdCB0aGUgcmV0dXJuIGNvZGUgb2YgYW4gZXhlY3V0YWJsZSAoc2VlIHRoZQorPGEgaHJlZj0iZXhlYy5odG1sIj5FeGVjPC9hPiB0YXNrKSBmb3IgZmFpbHVyZS4gPGI+U2luY2UgQW50IDEuNzwvYj48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvZGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJldHVybiBjb2RlIHRvIHRlc3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+cmVzb3VyY2Vjb3VudDwvaDQ+Cis8cD5UaGlzIGNvbmRpdGlvbiBpcyBhIGZhY2V0IG9mIHRoZQorICA8YSBocmVmPSJyZXNvdXJjZWNvdW50Lmh0bWwiPlJlc291cmNlQ291bnQ8L2E+IHRhc2suCisgIEl0IGlzIHVzZWQgdG8gdGVzdCB0aGUgc2l6ZSBvZiBhIAorICA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbjwvYT4uCisgIDxiPlNpbmNlIEFudCAxLjc8L2I+Cis8L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7cmVzb3VyY2Vjb3VudCByZWZpZD0mcXVvdDtteXJlc291cmNlY29sbGVjdGlvbiZxdW90OyB3aGVuPSZxdW90O2dyZWF0ZXImcXVvdDsgY291bnQ9JnF1b3Q7MCZxdW90OyAvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+VmVyaWZ5IHRoYXQgYSByZXNvdXJjZSBjb2xsZWN0aW9uIGlzIG5vdCBlbXB0eS48L3A+CisKKzxoND5yZXNvdXJjZXNtYXRjaDwvaDQ+Cis8cD5UZXN0IHJlc291cmNlcyBmb3IgbWF0Y2hpbmcuIE5vbmV4aXN0ZW5jZSBvZiBvbmUgb3IgbW9yZSByZXNvdXJjZXMgcmVzdWx0cyBpbgorImZhbHNlIiwgYWx0aG91Z2ggaWYgbm9uZSBleGlzdHMgdGhleSBhcmUgY29uc2lkZXJlZCBlcXVhbCBpbiB0ZXJtcyBvZiBjb250ZW50LgorQnkgZGVmYXVsdCB0aGlzIHRlc3QgZG9lcyBhIGJ5dGUgZm9yIGJ5dGUgY29tcGFyaXNpb24sIHNvIHRlc3QgdGltZSBzY2FsZXMgd2l0aAorYnl0ZSBzaXplLiBOQjogaWYgdGhlIGZpbGVzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIG9uZSBvZiB0aGVtIGlzIG1pc3NpbmcKK29yIHRoZSBmaWxlbmFtZXMgbWF0Y2ggdGhlIGFuc3dlciBpcyBzbyBvYnZpb3VzIHRoZSBkZXRhaWxlZCB0ZXN0IGlzIG9taXR0ZWQuCitUaGUgcmVzb3VyY2VzIHRvIGNoZWNrIGFyZSBzcGVjaWZpZWQgYXMgbmVzdGVkCis8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+LAorbWVhbmluZyB0aGF0IG1vcmUgdGhhbiB0d28gcmVzb3VyY2VzIGNhbiBiZSBjaGVja2VkOyBpbiB0aGlzIGNhc2UgYWxsIHJlc291cmNlcworbXVzdCBtYXRjaC4gPGI+U2luY2UgQW50IDEuNzwvYj4KKzwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFzdGV4dDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGlnbm9yZSBsaW5lIGVuZGluZ3MKKyAgICAgICAgd2hlbiBjb21wYXJpbmcgcmVzb3VyY2UgY29udGVudDsgZGVmYXVsdHMgdG8gPGk+ZmFsc2U8L2k+LAorICAgICAgICB3aGlsZSA8aT50cnVlPC9pPiB0cmlnZ2VycyBhIGJpbmFyeSBjb21wYXJpc29uLgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5oYXNtZXRob2Q8L2g0PgorCis8cD4gVGVzdHMgZm9yIGEgY2xhc3MgaGF2aW5nIGEgbWV0aG9kIG9yIGZpZWxkLiBJZiB0aGUgY2xhc3MgaXMgbm90IGZvdW5kIAorICAgIG9yIGZhaWxzIHRvIGxvYWQsIHRoZSBidWlsZCBmYWlscy4gCisgICAgCisgICAgPGI+U2luY2UgQW50IDEuNzwvYj4KKzwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzbmFtZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZSBvZiB0aGUgY2xhc3MgdG8gbG9hZDwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj55ZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZpZWxkPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIGEgZmllbGQgdG8gbG9vayBmb3I8L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+b25lIG9mIGZpZWxkIG9yIG1ldGhvZDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWV0aG9kPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIGEgbWV0aG9kIHRvIGxvb2sgZm9yPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPm9uZSBvZiBmaWVsZCBvciBtZXRob2Q8L3RkPgorICAgIDwvdHI+CisgICAgCisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZVN5c3RlbUNsYXNzZXM8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNob3VsZCBzeXN0ZW0gY2xhc3NlcyBiZSBpZ25vcmVkPzwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObyAtZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5hIGNsYXNzIHBhdGg8L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmZXJlbmNlIHRvIGEgY2xhc3MgcGF0aDwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKzxwPgorICAgIFRoZXJlIGlzIGFsc28gYSBuZXN0ZWQgJmx0O2NsYXNzcGF0aCZndDsgZWxlbWVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSAKKyAgICBhIGNsYXNzcGF0aC4KKzwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7aGFzbWV0aG9kIGNsYXNzbmFtZT0iamF2YS51dGlsLkFycmF5TGlzdCIgbWV0aG9kPSJ0cmltVG9TaXplIiAgLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+TG9va3MgZm9yIHRoZSBtZXRob2QgdHJpbVRvU2l6ZSBpbiB0aGUgQXJyYXlMaXN0IGNsYXNzLjwvcD4KKworPGg0Pm1hdGNoZXM8L2g0PgorCis8cD4KKyAgVGVzdCBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcmVndWxhcgorICBleHByZXNzaW9uIHBhdHRlcm4uCisgIDxiPlNpbmNlIEFudCAxLjc8L2I+PC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdHJpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0cmluZyB0byB0ZXN0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB1c2VkIHRvIHRlc3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIHRoZXJlIGlzIGEgbmVzdGVkCisgICAgICA8Y29kZT4mbHQ7cmVnZXhwJmd0OzwvY29kZT4gZWxlbWVudC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jYXNlc2Vuc2l0aXZlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlBlcmZvcm0gYSBjYXNlIHNlbnNpdGl2ZSBtYXRjaC4gIERlZmF1bHQgaXMKKyAgICAgICAgdHJ1ZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tdWx0aWxpbmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBQZXJmb3JtIGEgbXVsdGkgbGluZSBtYXRjaC4KKyAgICAgIERlZmF1bHQgaXMgZmFsc2UuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2luZ2xlbGluZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIFRoaXMgYWxsb3dzICcuJyB0byBtYXRjaCBuZXcgbGluZXMuCisgICAgICBTaW5nbGVMaW5lIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIG11bHRpbGluZSwgU2luZ2xlTGluZSBpcyBhIHBlcmwKKyAgICAgIHJlZ2V4IHRlcm0sIGl0IGNvcnJlc3BvbmRzIHRvIGRvdGFsbCBpbiBqYXZhIHJlZ2V4LgorICAgICAgRGVmYXVsdCBpcyBmYWxzZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworICA8cD4KKyAgICBUaGVyZSBpcyBhbHNvIGFuIG9wdGlvbmFsICZsdDtyZWdleHAmZ3Q7IGVsZW1lbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyAgICBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbnN0ZWFkIG9mIHRoZSAicGF0dGVybiIgYXR0cmlidXRlLgorICAgIFNlZSA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVnZXhwLmh0bWwiPlJlZ2V4cCBUeXBlPC9hPiBmb3IgdGhlIGRlc2NyaXB0aW9uCisgICAgb2YgdGhlIG5lc3RlZCBlbGVtZW50IHJlZ2V4cCBhbmQgb2YKKyAgICB0aGUgY2hvaWNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbi4KKyAgPC9wPgorICA8cD4KKyAgICBBbiBleGFtcGxlOgorICA8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0ibGVnYWwtcGFzc3dvcmQiJmd0OworICAmbHQ7bWF0Y2hlcyBwYXR0ZXJuPSJbMS05XSIgc3RyaW5nPSIke3VzZXItaW5wdXR9Ii8mZ3Q7CismbHQ7L2NvbmRpdGlvbiZndDsKKyZsdDtmYWlsIG1lc3NhZ2U9IllvdXIgcGFzc3dvcmQgc2hvdWxkIGF0IGxlYXN0IGNvbnRhaW4gb25lIG51bWJlciIKKyAgICAgIHVubGVzcz0ibGVnYWwtcGFzc3dvcmQiLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKyAgPHA+CisgICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNldHMgdGhlIHByb3BlcnR5ICJvayIgaWYKKyAgICB0aGUgcHJvcGVydHkgImlucHV0IiBpcyB0aHJlZSBjaGFyYWN0ZXJzIGxvbmcsIHN0YXJ0aW5nCisgICAgd2l0aCAnYScgYW5kIGVuZGluZyB3aXRoICdiJy4KKyAgPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtjb25kaXRpb24gcHJvcGVydHk9Im9rIiZndDsKKyAgJmx0O21hdGNoZXMgc3RyaW5nPSIke2lucHV0fSIgcGF0dGVybj0iXmEuYiQiLyZndDsKKyZsdDsvY29uZGl0aW9uJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorICA8cD4KKyAgICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYSByZWZlcmVuY2UgcmVndWxhciBleHByZXNzaW9uIGZvcgorICAgIG1hdGNoaW5nIGRhdGVzIGFuZCB0aGVuIHVzZXMgYW50dW5pdCB0byBjaGVjayBpZiB0aGUKKyAgICBwcm9wZXJ0eSAidG9kYXkiIGlzIGluIHRoZSBjb3JyZWN0IGZvcm1hdDoKKyAgPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtyZWdleHAgaWQ9ImRhdGUucGF0dGVybiIgcGF0dGVybj0iXlswMTIzXVxkLVswMV1cZC1bMTJdXGRcZFxkJCIvJmd0OworCismbHQ7YXU6YXNzZXJ0VHJ1ZSB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiJmd0OworICAmbHQ7bWF0Y2hlcyBzdHJpbmc9IiR7dG9kYXl9IiZndDsKKyAgICAmbHQ7cmVnZXhwIHJlZmlkPSJkYXRlLnBhdHRlcm4iLyZndDsKKyAgJmx0Oy9tYXRjaGVzJmd0OworJmx0Oy9hdTphc3NlcnRUcnVlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorICA8cD4KKyAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIHVzZSBvZiB0aGUgc2luZ2xlbGluZSBhbmQgdGhlIGNhc2VzZW5zaXRpdmUKKyAgICBmbGFncy4KKyAgPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthdTphc3NlcnRUcnVlJmd0OworICAmbHQ7bWF0Y2hlcyBzdHJpbmc9IkFCJHtsaW5lLnNlcGFyYXRvcn1DIiBwYXR0ZXJuPSJeYWIuKkMkIgorICAgICAgICAgICBjYXNlc2Vuc2l0aXZlPSJmYWxzZSIKKyAgICAgICAgICAgc2luZ2xlbGluZT0idHJ1ZSIvJmd0OworJmx0Oy9hdTphc3NlcnRUcnVlJmd0OworJmx0O2F1OmFzc2VydEZhbHNlJmd0OworICAmbHQ7bWF0Y2hlcyBzdHJpbmc9IkFCJHtsaW5lLnNlcGFyYXRvcn1DIiBwYXR0ZXJuPSJeYWIuKkMkIgorICAgICAgICAgICBjYXNlc2Vuc2l0aXZlPSJmYWxzZSIKKyAgICAgICAgICAgc2luZ2xlbGluZT0iZmFsc2UiLyZndDsKKyZsdDsvYXU6YXNzZXJ0RmFsc2UmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8aDQ+YW50dmVyc2lvbjwvaDQ+Cis8cD5UaGlzIGNvbmRpdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIDxhCitocmVmPSJhbnR2ZXJzaW9uLmh0bWwiPkFudHZlcnNpb248L2E+IHRhc2ssIGFsbCBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQsIHRoZSBwcm9wZXJ0eSBhdHRyaWJ1dGUKK2lzIHJlZHVuZGFudCBhbmQgd2lsbCBiZSBpZ25vcmVkLjwvcD4KKworCis8aDQ+aGFzZnJlZXNwYWNlPC9oND4KKworPHA+CisgIFRlc3RzIGEgcGFydGl0aW9uIHRvIHNlZSBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UuCisgIDxiPlNpbmNlIEFudCAxLjcuMDwvYj48L3A+CisgIDxwPk5lZWRlZCBhdHRyaWJ1dGUgY2FuIGJlIHNwZWNpZmllZCB1c2luZyBzdGFuZGFyZCBjb21wdXRpbmcgdGVybXM6PGJyLz4KKyAgICA8dWw+CisgICAgICA8bGk+SyA6IEtpbG9ieXRlcyAoMTAyNCBieXRlcyk8L2xpPgorICAgICAgPGxpPk0gOiBNZWdhYnl0ZXMgKDEwMjQgSyk8L2xpPgorICAgICAgPGxpPkcgOiBHaWdhYnl0ZXMgKDEwMjQgTSk8L2xpPgorICAgICAgPGxpPlQgOiBUZXJhYnl0ZXMgKDEwMjQgRyk8L2xpPgorICAgICAgPGxpPlAgOiBQZXRhYnl0ZXMgKDEwMjQgVCk8L2xpPgorICAgIDwvdWw+CisgIDwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFydGl0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXJ0aXRpb24gb3IgZmlsZXN5c3RlbSB0byBjaGVjayBmb3IgZnJlZXNwYWNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5lZWRlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYW1vdW50IG9mIGZyZWVzcGFjZSBuZWVkZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorICA8cD4KKyAgICBBbiBleGFtcGxlOgorICA8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2hhc2ZyZWVzcGFjZSBwYXJ0aXRpb249ImM6IiBuZWVkZWQ9IjEwME0iLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jb3B5Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29weS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTViNGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29weS5odG1sCkBAIC0wLDAgKzEsMzQwIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkNvcHkgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iY29weSI+Q29weTwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkNvcGllcyBhIGZpbGUgb3IgcmVzb3VyY2UgY29sbGVjdGlvbiB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeS4gIEJ5IGRlZmF1bHQsIGZpbGVzIGFyZQorb25seSBjb3BpZWQgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUsCitvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGRvZXMgbm90IGV4aXN0LiAgSG93ZXZlciwgeW91IGNhbiBleHBsaWNpdGx5CitvdmVyd3JpdGUgZmlsZXMgd2l0aCB0aGUgPGNvZGU+b3ZlcndyaXRlPC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgorCis8cD48YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UKK0NvbGxlY3Rpb248L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QgYSBncm91cCBvZiBmaWxlcyB0byBjb3B5LiAgVG8gdXNlIGEKK3Jlc291cmNlIGNvbGxlY3Rpb24sIHRoZSA8Y29kZT50b2RpcjwvY29kZT4gYXR0cmlidXRlIG11c3QgYmUgc2V0LjwvcD4KKworPHA+Cis8c3Ryb25nPk5vdGU6IDwvc3Ryb25nPklmIHlvdSBlbXBsb3kgZmlsdGVycyBpbiB5b3VyIGNvcHkgb3BlcmF0aW9uLAoreW91IHNob3VsZCBsaW1pdCB0aGUgY29weSB0byB0ZXh0IGZpbGVzLiBCaW5hcnkgZmlsZXMgd2lsbCBiZSBjb3JydXB0ZWQKK2J5IHRoZSBjb3B5IG9wZXJhdGlvbi4KK1RoaXMgYXBwbGllcyB3aGV0aGVyIHRoZSBmaWx0ZXJzIGFyZSBpbXBsaWNpdGx5IGRlZmluZWQgYnkgdGhlCis8YSBocmVmPSJmaWx0ZXIuaHRtbCI+ZmlsdGVyPC9hPiB0YXNrIG9yIGV4cGxpY2l0bHkgcHJvdmlkZWQgdG8gdGhlIGNvcHkKK29wZXJhdGlvbiBhcyA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsdGVyc2V0Lmh0bWwiPmZpbHRlcnNldHM8L2E+LgorICA8ZW0+U2VlIDxhIGhyZWY9IiNlbmNvZGluZyI+ZW5jb2Rpbmcgbm90ZTwvYT48L2VtPi4KKzwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgdG8gY29weS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICByZXNvdXJjZSBjb2xsZWN0aW9uIGVsZW1lbnQgaXMgdXNlZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZWxhc3Rtb2RpZmllZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5HaXZlIHRoZSBjb3BpZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZAorICAgICAgdGltZSBhcyB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIGNvcHkgdG8uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPldpdGggdGhlIDxjb2RlPmZpbGU8L2NvZGU+CisgICAgICBhdHRyaWJ1dGUsIGVpdGhlciA8Y29kZT50b2ZpbGU8L2NvZGU+IG9yIDxjb2RlPnRvZGlyPC9jb2RlPiBjYW4gYmUgdXNlZC4KKyAgICAgIFdpdGggbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gZWxlbWVudHMsIGlmIHRoZSBudW1iZXIgb2YgaW5jbHVkZWQgZmlsZXMKKyAgICAgIGlzIGdyZWF0ZXIgdGhhbiAxLCBvciBpZiBvbmx5IHRoZSA8Y29kZT5kaXI8L2NvZGU+IGF0dHJpYnV0ZSBpcworICAgICAgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LCBvciBpZiB0aGUKKyAgICAgIDxjb2RlPmZpbGU8L2NvZGU+IGF0dHJpYnV0ZSBpcyBhbHNvIHNwZWNpZmllZCwgdGhlbiBvbmx5CisgICAgICA8Y29kZT50b2RpcjwvY29kZT4gaXMgYWxsb3dlZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50b2RpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IHRvIGNvcHkgdG8uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3ZlcndyaXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbgorICAgICAgZmlsZXMgYXJlIG5ld2VyLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsdGVyaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyB1c2luZyB0aGUgZ2xvYmFsCisgICAgICBidWlsZC1maWxlIGZpbHRlcnMgc2hvdWxkIHRha2UgcGxhY2UgZHVyaW5nIHRoZSBjb3B5LgorICAgICAgPGVtPk5vdGU8L2VtPjogTmVzdGVkIDxjb2RlPiZsdDtmaWx0ZXJzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cyB3aWxsCisgICAgICBhbHdheXMgYmUgdXNlZCwgZXZlbiBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCBvciBpdHMgdmFsdWUgaXMKKyAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiAoPGNvZGU+bm88L2NvZGU+LCBvciA8Y29kZT5vZmY8L2NvZGU+KS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZsYXR0ZW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SWdub3JlIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgZmlsZXMsCisgICAgICBhbmQgY29weSBhbGwgZmlsZXMgaW50byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieSB0aGUgPGNvZGU+dG9kaXI8L2NvZGU+CisgICAgICBhdHRyaWJ1dGUuICBOb3RlIHRoYXQgeW91IGNhbiBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBieSB1c2luZyBhCisgICAgICA8YSBocmVmPSIuLi9Db3JlVHlwZXMvbWFwcGVyLmh0bWwjZmxhdHRlbi1tYXBwZXIiPmZsYXR0ZW4gbWFwcGVyPC9hPi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVFbXB0eURpcnM8L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvcHkgYW55IGVtcHR5IGRpcmVjdG9yaWVzIGluY2x1ZGVkIGluIHRoZSBGaWxlU2V0KHMpLgorICAgICA8L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byB0cnVlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5JZiBmYWxzZSwgbG9nIGEgd2FybmluZyBtZXNzYWdlLCBidXQgZG8gbm90IHN0b3AgdGhlCisgICAgICAgYnVpbGQsIHdoZW4gdGhlIGZpbGUgdG8gY29weSBkb2VzIG5vdCBleGlzdCBvciBvbmUgb2YgdGhlIG5lc3RlZAorICAgICAgIGZpbGVzZXRzIHBvaW50cyB0byBhIGRpcmVjdG9yeSB0aGF0IGRvZXNuJ3QgZXhpc3Qgb3IgYW4gZXJyb3Igb2NjdXJzCisgICAgICAgd2hpbGUgY29weWluZy4KKyAgICAgPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5Mb2cgdGhlIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGNvcGllZC48L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZW5jb2RpbmcgdG8gYXNzdW1lIHdoZW4gZmlsdGVyLWNvcHlpbmcgdGhlCisgICAgZmlsZXMuIDxlbT5zaW5jZSBBbnQgMS41PC9lbT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBlbmNvZGluZzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dGVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiB3cml0aW5nIHRoZSBmaWxlcy4KKyAgICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSBlbmNvZGluZworICAgIGF0dHJpYnV0ZSBpZiBnaXZlbiBvciB0aGUgZGVmYXVsdCBKVk0gZW5jb2Rpbmcgb3RoZXJ3aXNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuYWJsZW11bHRpcGxlbWFwcGluZ3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBJZiB0cnVlIHRoZSB0YXNrIHdpbGwgcHJvY2VzcyB0byBhbGwgdGhlIG1hcHBpbmdzIGZvciBhCisgICAgICBnaXZlbiBzb3VyY2UgcGF0aC4gSWYgZmFsc2UgdGhlIHRhc2sgd2lsbCBvbmx5IHByb2Nlc3MKKyAgICAgIHRoZSBmaXJzdCBmaWxlIG9yIGRpcmVjdG9yeS4gVGhpcyBhdHRyaWJ1dGUgaXMgb25seSByZWxldmFudAorICAgICAgaWYgdGhlcmUgaXMgYSBtYXBwZXIgc3ViZWxlbWVudC4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ncmFudWxhcml0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gZ2l2ZSBiZWZvcmUKKyAgICBkZWNpZGluZyBhIGZpbGUgaXMgb3V0IG9mIGRhdGUuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugbm90IGV2ZXJ5CisgICAgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgdHJhY2tpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUKKyAgICBtaWxsaXNlY29uZCBsZXZlbC4gRGVmYXVsdCBpcyAxIHNlY29uZCwgb3IgMiBzZWNvbmRzIG9uIERPUworICAgIHN5c3RlbXMuICBUaGlzIGNhbiBhbHNvIGJlIHVzZWZ1bCBpZiBzb3VyY2UgYW5kIHRhcmdldCBmaWxlcyBsaXZlCisgICAgb24gc2VwYXJhdGUgbWFjaGluZXMgd2l0aCBjbG9ja3MgYmVpbmcgb3V0IG9mIHN5bmMuICA8ZW0+c2luY2UgQW50CisgICAgMS42LjI8L2VtPi48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+ZmlsZXNldCBvciBhbnkgb3RoZXIgcmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+Cis8cD48YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UKK0NvbGxlY3Rpb248L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QgZ3JvdXBzIG9mIGZpbGVzIHRvIGNvcHkuICBUbyB1c2UgYQorcmVzb3VyY2UgY29sbGVjdGlvbiwgdGhlIDxjb2RlPnRvZGlyPC9jb2RlPiBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuPC9wPgorPHA+UHJpb3IgdG8gQW50IDEuNyBvbmx5IDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gaGFzIGJlZW4KK3N1cHBvcnRlZCBhcyBhIG5lc3RlZCBlbGVtZW50LjwvcD4KKworPGg0Pm1hcHBlcjwvaDQ+CisgPHA+WW91IGNhbiBkZWZpbmUgZmlsZW5hbWUgdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIGEgbmVzdGVkIDxhCisgaHJlZj0iLi4vQ29yZVR5cGVzL21hcHBlci5odG1sIj5tYXBwZXI8L2E+IGVsZW1lbnQuIFRoZSBkZWZhdWx0IG1hcHBlciB1c2VkIGJ5CisgPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiBpcyB0aGUgPGEKKyBocmVmPSIuLi9Db3JlVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyIj5pZGVudGl0eSBtYXBwZXI8L2E+LjwvcD4KKyAgPHA+CisgICAgPGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+LAorICAgIG9uZSBjYW4gdXNlIGEgZmlsZW5hbWVtYXBwZXIgdHlwZSBpbiBwbGFjZSBvZiB0aGUgbWFwcGVyIGVsZW1lbnQuCisgIDwvcD4KKworPHA+Tm90ZSB0aGF0IHRoZSBzb3VyY2UgbmFtZSBoYW5kZWQgdG8gdGhlIG1hcHBlciBkZXBlbmRzIG9uIHRoZQorcmVzb3VyY2UgY29sbGVjdGlvbiB5b3UgdXNlLiAgSWYgeW91IHVzZSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+CitvciBhbnkgb3RoZXIgY29sbGVjdGlvbiB0aGF0IHByb3ZpZGVzIGEgYmFzZSBkaXJlY3RvcnksIHRoZSBuYW1lCitwYXNzZWQgdG8gdGhlIG1hcHBlciB3aWxsIGJlIGEgcmVsYXRpdmUgZmlsZW5hbWUsIHJlbGF0aXZlIHRvIHRoZSBiYXNlCitkaXJlY3RvcnkuICBJbiBhbnkgb3RoZXIgY2FzZSB0aGUgYWJzb2x1dGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSB3aWxsCitiZSB1c2VkLjwvcD4KKworPGg0PmZpbHRlcnNldDwvaDQ+CisgPHA+PGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbHRlcnNldC5odG1sIj5GaWx0ZXJTZXQ8L2E+cyBhcmUgdXNlZCB0byByZXBsYWNlCit0b2tlbnMgaW4gZmlsZXMgdGhhdCBhcmUgY29waWVkLgorIFRvIHVzZSBhIEZpbHRlclNldCwgdXNlIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbHRlcnNldCZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgorCis8aDQ+ZmlsdGVyY2hhaW48L2g0PgorPHA+VGhlIENvcHkgdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPgorRmlsdGVyQ2hhaW48L2E+cy48L3A+CisKKzxwPgorSWYgPGNvZGU+Jmx0O2ZpbHRlcnNldCZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgdXNlZCBpbnNpZGUgdGhlCitzYW1lIDxjb2RlPiZsdDtjb3B5Jmd0OzwvY29kZT4gdGFzaywgYWxsIDxjb2RlPiZsdDtmaWx0ZXJjaGFpbiZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBwcm9jZXNzZWQgZmlyc3QKK2ZvbGxvd2VkIGJ5IDxjb2RlPiZsdDtmaWx0ZXJzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy4KKzwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwPjxiPkNvcHkgYSBzaW5nbGUgZmlsZTwvYj48L3A+Cis8cHJlPgorICAmbHQ7Y29weSBmaWxlPSZxdW90O215ZmlsZS50eHQmcXVvdDsgdG9maWxlPSZxdW90O215Y29weS50eHQmcXVvdDsvJmd0OworPC9wcmU+Cis8cD48Yj5Db3B5IGEgc2luZ2xlIGZpbGUgdG8gYSBkaXJlY3Rvcnk8L2I+PC9wPgorPHByZT4KKyAgJmx0O2NvcHkgZmlsZT0mcXVvdDtteWZpbGUudHh0JnF1b3Q7IHRvZGlyPSZxdW90Oy4uL3NvbWUvb3RoZXIvZGlyJnF1b3Q7LyZndDsKKzwvcHJlPgorPHA+PGI+Q29weSBhIGRpcmVjdG9yeSB0byBhbm90aGVyIGRpcmVjdG9yeTwvYj48L3A+Cis8cHJlPgorICAmbHQ7Y29weSB0b2Rpcj0mcXVvdDsuLi9uZXcvZGlyJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7LyZndDsKKyAgJmx0Oy9jb3B5Jmd0OworPC9wcmU+Cis8cD48Yj5Db3B5IGEgc2V0IG9mIGZpbGVzIHRvIGEgZGlyZWN0b3J5PC9iPjwvcD4KKzxwcmU+CisgICZsdDtjb3B5IHRvZGlyPSZxdW90Oy4uL2Rlc3QvZGlyJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7Jmd0OworICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0Oy9jb3B5Jmd0OworCisgICZsdDtjb3B5IHRvZGlyPSZxdW90Oy4uL2Rlc3QvZGlyJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7IGV4Y2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CisgICZsdDsvY29weSZndDsKKzwvcHJlPgorPHA+PGI+Q29weSBhIHNldCBvZiBmaWxlcyB0byBhIGRpcmVjdG9yeSwgYXBwZW5kaW5nCis8Y29kZT4uYmFrPC9jb2RlPiB0byB0aGUgZmlsZSBuYW1lIG9uIHRoZSBmbHk8L2I+PC9wPgorPHByZT4KKyAgJmx0O2NvcHkgdG9kaXI9JnF1b3Q7Li4vYmFja3VwL2RpciZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjX2RpciZxdW90Oy8mZ3Q7CisgICAgJmx0O2dsb2JtYXBwZXIgZnJvbT0mcXVvdDsqJnF1b3Q7IHRvPSZxdW90OyouYmFrJnF1b3Q7LyZndDsKKyAgJmx0Oy9jb3B5Jmd0OworPC9wcmU+CisKKzxwPjxiPkNvcHkgYSBzZXQgb2YgZmlsZXMgdG8gYSBkaXJlY3RvcnksIHJlcGxhY2luZyBAVElUTEVAIHdpdGggRm9vIEJhcgoraW4gYWxsIGZpbGVzLjwvYj48L3A+Cis8cHJlPgorICAmbHQ7Y29weSB0b2Rpcj0mcXVvdDsuLi9iYWNrdXAvZGlyJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZmlsdGVyc2V0Jmd0OworICAgICAgJmx0O2ZpbHRlciB0b2tlbj0mcXVvdDtUSVRMRSZxdW90OyB2YWx1ZT0mcXVvdDtGb28gQmFyJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbHRlcnNldCZndDsKKyAgJmx0Oy9jb3B5Jmd0OworPC9wcmU+CisKKzxwPjxiPkNvbGxlY3QgYWxsIGl0ZW1zIGZyb20gdGhlIGN1cnJlbnQgQ0xBU1NQQVRIIHNldHRpbmcgaW50byBhCitkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGZsYXR0ZW5pbmcgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuPC9iPjwvcD4KKzxwcmU+CisgICZsdDtjb3B5IHRvZGlyPSZxdW90O2Rlc3QmcXVvdDsgZmxhdHRlbj0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAgICZsdDtwYXRoJmd0OworICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqYXZhLmNsYXNzLnBhdGh9JnF1b3Q7LyZndDsKKyAgICAmbHQ7L3BhdGgmZ3Q7CisgICZsdDsvY29weSZndDsKKzwvcHJlPgorCis8cD48Yj5Db3BpZXMgc29tZSByZXNvdXJjZXMgdG8gYSBnaXZlbiBkaXJlY3RvcnkuPC9iPjwvcD4KKzxwcmU+CisgICZsdDtjb3B5IHRvZGlyPSZxdW90O2Rlc3QmcXVvdDsgZmxhdHRlbj0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAgICZsdDtyZXNvdXJjZXMmZ3Q7CisgICAgICAmbHQ7ZmlsZSBmaWxlPSZxdW90O3NyY19kaXIvZmlsZTEudHh0JnF1b3Q7LyZndDsKKyAgICAgICZsdDt1cmwgdXJsPSZxdW90O2h0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3Jlc291cmNlcyZndDsKKyAgJmx0Oy9jb3B5Jmd0OworPC9wcmU+CisKKzxwPjxiPkNvcGllcyB0aGUgdHdvIG5ld2VzdCByZXNvdXJjZXMgaW50byBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS48L2I+PC9wPgorPHByZT4KKyAgJmx0O2NvcHkgdG9kaXI9JnF1b3Q7ZGVzdCZxdW90OyBmbGF0dGVuPSZxdW90O3RydWUmcXVvdDsmZ3Q7CisgICAgJmx0O2ZpcnN0IGNvdW50PSZxdW90OzImcXVvdDsmZ3Q7CisgICAgICAmbHQ7c29ydCZndDsKKyAgICAgICAgJmx0O2RhdGUgeG1sbnM9JnF1b3Q7YW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycyZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDtyZXNvdXJjZXMmZ3Q7CisgICAgICAgICAgJmx0O2ZpbGUgZmlsZT0mcXVvdDtzcmNfZGlyL2ZpbGUxLnR4dCZxdW90Oy8mZ3Q7CisgICAgICAgICAgJmx0O2ZpbGUgZmlsZT0mcXVvdDtzcmNfZGlyL2ZpbGUyLnR4dCZxdW90Oy8mZ3Q7CisgICAgICAgICAgJmx0O2ZpbGUgZmlsZT0mcXVvdDtzcmNfZGlyL2ZpbGUzLnR4dCZxdW90Oy8mZ3Q7CisgICAgICAgICAgJmx0O3VybCB1cmw9JnF1b3Q7aHR0cDovL2FudC5hcGFjaGUub3JnL2luZGV4Lmh0bWwmcXVvdDsvJmd0OworICAgICAgICAmbHQ7L3Jlc291cmNlcyZndDsKKyAgICAgICZsdDsvc29ydCZndDsKKyAgICAmbHQ7L2ZpcnN0Jmd0OworICAmbHQ7L2NvcHkmZ3Q7Cis8L3ByZT4KKworCis8cD48c3Ryb25nPlVuaXggTm90ZTo8L3N0cm9uZz4gRmlsZSBwZXJtaXNzaW9ucyBhcmUgbm90IHJldGFpbmVkIHdoZW4gZmlsZXMKK2FyZSBjb3BpZWQ7IHRoZXkgZW5kIHVwIHdpdGggdGhlIGRlZmF1bHQgPGNvZGU+VU1BU0s8L2NvZGU+IHBlcm1pc3Npb25zCitpbnN0ZWFkLiBUaGlzCitpcyBjYXVzZWQgYnkgdGhlIGxhY2sgb2YgYW55IG1lYW5zIHRvIHF1ZXJ5IG9yIHNldCBmaWxlIHBlcm1pc3Npb25zIGluIHRoZQorY3VycmVudCBKYXZhIHJ1bnRpbWVzLiBJZiB5b3UgbmVlZCBhIHBlcm1pc3Npb24tcHJlc2VydmluZyBjb3B5IGZ1bmN0aW9uLAordXNlIDxjb2RlPiZsdDtleGVjIGV4ZWN1dGFibGU9ImNwIiAuLi4gJmd0OzwvY29kZT4gaW5zdGVhZC4KKzwvcD4KKworPHA+PHN0cm9uZz5XaW5kb3dzIE5vdGU6PC9zdHJvbmc+IElmIHlvdSBjb3B5IGEgZmlsZSB0byBhIGRpcmVjdG9yeQord2hlcmUgdGhhdCBmaWxlIGFscmVhZHkgZXhpc3RzLCBidXQgd2l0aCBkaWZmZXJlbnQgY2FzaW5nLAordGhlIGNvcGllZCBmaWxlIHRha2VzIG9uIHRoZSBjYXNlIG9mIHRoZSBvcmlnaW5hbC4gVGhlIHdvcmthcm91bmQgaXMgdG8KKzxhIGhyZWY9ImRlbGV0ZS5odG1sIj5kZWxldGU8L2E+Cit0aGUgZmlsZSBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGJlZm9yZSB5b3UgY29weSBpdC4KKzwvcD4KKyAgPHA+CisgICAgPHN0cm9uZz48YSBuYW1lPSJlbmNvZGluZyI+SW1wb3J0YW50IEVuY29kaW5nIE5vdGU6PC9hPjwvc3Ryb25nPgorICAgIFRoZSByZWFzb24gdGhhdCBiaW5hcnkgZmlsZXMgd2hlbiBmaWx0ZXJlZCBnZXQgY29ycnVwdGVkIGlzIHRoYXQKKyAgICBmaWx0ZXJpbmcgaW52b2x2ZXMgcmVhZGluZyBpbiB0aGUgZmlsZSB1c2luZyBhIFJlYWRlciBjbGFzcy4gVGhpcworICAgIGhhcyBhbiBlbmNvZGluZyBzcGVjaWZpbmcgaG93IGZpbGVzIGFyZSBlbmNvZGVkLiBUaGVyZSBhcmUgYSBudW1iZXIKKyAgICBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgZW5jb2RpbmcgLSBVVEYtOCwgVVRGLTE2LCBDcDEyNTIsIElTTy04ODU5LTEsCisgICAgVVMtQVNDSUkgYW5kIChsb3RzKSBvdGhlcnMuIE9uIFdpbmRvd3MgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nCisgICAgaXMgQ3AxMjUyLCBvbiBVbml4IGl0IGlzIHVzdWFsbHkgVVRGLTguIEZvciBib3RoIG9mIHRoZXNlIGVuY29kaW5nCisgICAgdGhlcmUgYXJlIGlsbGVnYWwgYnl0ZSBzZXF1ZW5jZXMgKG1vcmUgaW4gVVRGLTggdGhhbiBmb3IgQ3AxMjUyKS4KKyAgPC9wPgorICA8cD4KKyAgICBIb3cgdGhlIFJlYWRlciBjbGFzcyBkZWFscyB3aXRoIHRoZXNlIGlsbGVnYWwgc2VxdWVuY2VzIGlzIHVwIHRvIHRoZQorICAgIGltcGxlbWVudGF0aW9uCisgICAgb2YgdGhlIGNoYXJhY3RlciBkZWNvZGVyLiBUaGUgY3VycmVudCBTdW4gSmF2YSBpbXBsZW1lbmF0aW9uIGlzIHRvCisgICAgbWFwIHRoZW0gdG8gbGVnYWwgY2hhcmFjdGVycy4gUHJldmlvdXMgU3VuIEphdmEgKDEuMyBhbmQgbG93ZXIpIHRocmV3CisgICAgYSBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbi4gSUJNIEphdmEgMS40IGFsc28gdGhvd3MgdGhpcyBleGNlcHRpb24uCisgICAgSXQgaXMgdGhlIG1hcHBpbmcgb2YgdGhlIGNoYXJhY3RlcnMgdGhhdCBjYXVzZSB0aGUgY29ycnVwdGlvbi4KKyAgPC9wPgorICA8cD4KKyAgICBPbiBVbml4LCB3aGVyZSB0aGUgZGVmYXVsdCBpcyBub3JtYWxseSBVVEYtOCwgdGhpcyBpcyBhIDxlbT5iaWc8L2VtPgorICAgIHByb2JsZW0sIGFzIGl0IGlzIGVhc3kgdG8gZWRpdCBhIGZpbGUgdG8gY29udGFpbiBub24gVVMgQXNjaWkgY2hhcmFjdGVycworICAgIGZyb20gSVNPLTg4NTktMSwgZm9yIGV4YW1wbGUgdGhlIERhbmlzaCBvZSBjaGFyYWN0ZXIuIFdoZW4gdGhpcyBpcworICAgIGNvcGllZCAod2l0aCBmaWx0ZXJpbmcpIGJ5IEFudCwgdGhlIGNoYXJhY3RlciBnZXQgY29udmVydGVkIHRvIGEKKyAgICBxdWVzdGlvbiBtYXJrIChvciBzb21lIHN1Y2ggdGhpbmcpLgorICA8L3A+CisgIDxwPgorICAgIFRoZXJlIGlzIG5vdCBtdWNoIHRoYXQgQW50IGNhbiBkby4gSXQgY2Fubm90IGZpZ3VyZSBvdXQgd2hpY2gKKyAgICBmaWxlcyBhcmUgYmluYXJ5IC0gYSBVVEYtOCB2ZXJzaW9uIG9mIEtvcmVhbiB3aWxsIGhhdmUgbG90cyBvZgorICAgIGJ5dGVzIHdpdGggdGhlIHRvcCBiaXQgc2V0LiBJdCBpcyBub3QgaW5mb3JtZWQgYWJvdXQgaWxsZWdhbAorICAgIGNoYXJhY3RlciBzZXF1ZW5jZXMgYnkgY3VycmVudCBTdW4gSmF2YSBpbXBsZW1lbnRpb25zLgorICA8L3A+CisgIDxwPgorICAgIE9uZSB0cmljayBmb3IgZmlsdGVyaW5nIGNvbnRhaW5pbmcgb25seSBVUy1BU0NJSSBpcyB0bworICAgIHVzZSB0aGUgSVNPLTg4NTktMSBlbmNvZGluZy4gVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGNvbnRhaW4KKyAgICBpbGxlZ2FsIGNoYXJhY3RlciBzZXF1ZW5jZXMsIGFuZCB0aGUgbG93ZXIgNyBiaXRzIGFyZSBVUy1BU0NJSS4KKyAgICBBbm90aGVyIHRyaWNrIGlzIHRvIGNoYW5nZSB0aGUgTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZSBmcm9tCisgICAgc29tZXRoaW5nIGxpa2UgInVzLnV0ZjgiIHRvICJ1cyIuCisgIDwvcD4KKyAgICAKKworCisKKzwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29weWRpci5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NvcHlkaXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQ5MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2NvcHlkaXIuaHRtbApAQCAtMCwwICsxLDEzNiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Db3B5ZGlyIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImNvcHlkaXIiPkNvcHlkaXI8L2E+PC9oMj4KKzxoMz48aT5EZXByZWNhdGVkPC9pPjwvaDM+Cis8cD48aT5UaGlzIHRhc2sgaGFzIGJlZW4gZGVwcmVjYXRlZC4gIFVzZSB0aGUgQ29weSB0YXNrIGluc3RlYWQuPC9pPjwvcD4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5Db3BpZXMgYSBkaXJlY3RvcnkgdHJlZSBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLjwvcD4KKzxwPkl0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGNvcGllZC4gVGhpcyBjYW4gYmUKK2RvbmUgd2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+LCA8aT5pbmNsdWRlc2ZpbGU8L2k+LCA8aT5leGNsdWRlczwvaT4sIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYW5kIDxpPmRlZmF1bHRleGNsdWRlczwvaT4KK2F0dHJpYnV0ZXMuIFdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiBvciA8aT5pbmNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8KK2hhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZSA8aT5leGNsdWRlPC9pPiBvciA8aT5leGNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKK3RoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKK2ZpbmFsbHkgd2l0aCB0aGUgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQord2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uIDxhCitocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUKK2luY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuPC9wPgorPHA+VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZAorc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgorKDxjb2RlPmRpcjwvY29kZT4gYmVjb21lcyA8Y29kZT5zcmM8L2NvZGU+KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKKzxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gYW5kCis8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IHRvIGNvcHkuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSB0byBjb3B5IHRvLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCisgICAgICBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCisgICAgICB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QKKyAgICAgICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWx0ZXJpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCB0YWtlIHBsYWNlIGR1cmluZworICAgICAgdGhlIGNvcHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mbGF0dGVuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHNvdXJjZSBkaXJlY3RvcnksCisgICAgICBjb3B5IGFsbCBmaWxlcyBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeSwgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5kZXN0PC9jb2RlPgorICAgICAgYXR0cmlidXRlIChkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPikuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yY2VvdmVyd3JpdGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uCisgICAgICBmaWxlcyBhcmUgbmV3ZXIgKGRlZmF1bHQgaXMgZmFsc2UpLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7Y29weWRpciBzcmM9JnF1b3Q7JHtzcmN9L3Jlc291cmNlcyZxdW90OworICAgICAgICAgICBkZXN0PSZxdW90OyR7ZGlzdH0mcXVvdDsKKyAgLyZndDs8L3ByZT4KKzxwPmNvcGllcyB0aGUgZGlyZWN0b3J5IDxjb2RlPiR7c3JjfS9yZXNvdXJjZXM8L2NvZGU+IHRvIDxjb2RlPiR7ZGlzdH08L2NvZGU+LjwvcD4KKzxwcmU+ICAmbHQ7Y29weWRpciBzcmM9JnF1b3Q7JHtzcmN9L3Jlc291cmNlcyZxdW90OworICAgICAgICAgICBkZXN0PSZxdW90OyR7ZGlzdH0mcXVvdDsKKyAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7CisgICAgICAgICAgIGV4Y2x1ZGVzPSZxdW90OyoqL1Rlc3QuamF2YSZxdW90OworICAvJmd0OzwvcHJlPgorPHA+Y29waWVzIHRoZSBkaXJlY3RvcnkgPGNvZGU+JHtzcmN9L3Jlc291cmNlczwvY29kZT4gdG8gPGNvZGU+JHtkaXN0fTwvY29kZT4KK3JlY3Vyc2l2ZWx5LiBBbGwgamF2YSBmaWxlcyBhcmUgY29waWVkLCBleGNlcHQgZm9yIGZpbGVzIHdpdGggdGhlIG5hbWUgPGNvZGU+VGVzdC5qYXZhPC9jb2RlPi48L3A+Cis8cHJlPiAgJmx0O2NvcHlkaXIgc3JjPSZxdW90OyR7c3JjfS9yZXNvdXJjZXMmcXVvdDsKKyAgICAgICAgICAgZGVzdD0mcXVvdDske2Rpc3R9JnF1b3Q7CisgICAgICAgICAgIGluY2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90OworICAgICAgICAgICBleGNsdWRlcz0mcXVvdDtteXBhY2thZ2UvdGVzdC8qKiZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD5jb3BpZXMgdGhlIGRpcmVjdG9yeSA8Y29kZT4ke3NyY30vcmVzb3VyY2VzPC9jb2RlPiB0byA8Y29kZT4ke2Rpc3R9PC9jb2RlPgorcmVjdXJzaXZlbHkuIEFsbCBqYXZhIGZpbGVzIGFyZSBjb3BpZWQsIGV4Y2VwdCBmb3IgdGhlIGZpbGVzIHVuZGVyIHRoZSA8Y29kZT5teXBhY2thZ2UvdGVzdDwvY29kZT4KK2RpcmVjdG9yeS48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29weWZpbGUuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jb3B5ZmlsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDRhN2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY29weWZpbGUuaHRtbApAQCAtMCwwICsxLDczIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkNvcHlmaWxlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImNvcHlmaWxlIj5Db3B5ZmlsZTwvYT48L2gyPgorPGgzPjxpPkRlcHJlY2F0ZWQ8L2k+PC9oMz4KKzxwPjxpPlRoaXMgdGFzayBoYXMgYmVlbiBkZXByZWNhdGVkLiAgVXNlIHRoZSBDb3B5IHRhc2sgaW5zdGVhZC48L2k+PC9wPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkNvcGllcyBhIGZpbGUgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gVGhlIGZpbGUgaXMgb25seSBjb3BpZWQgaWYKK3RoZSBzb3VyY2UgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBkZXN0aW5hdGlvbiBmaWxlLCBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlCitkb2VzIG5vdCBleGlzdC48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHRvIGNvcHkuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIHRvIGNvcHkgdG8uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbHRlcmluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhY2UgZHVyaW5nCisgICAgICB0aGUgY29weTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlb3ZlcndyaXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbgorICAgICAgZmlsZXMgYXJlIG5ld2VyIChkZWZhdWx0IGlzIGZhbHNlKS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKyAgPHA+PGNvZGU+Jmx0O2NvcHlmaWxlIHNyYz0mcXVvdDt0ZXN0LmphdmEmcXVvdDsgZGVzdD0mcXVvdDtzdWJkaXIvdGVzdC5qYXZhJnF1b3Q7LyZndDs8L2NvZGU+PC9wPgorICA8cD48Y29kZT4mbHQ7Y29weWZpbGUgc3JjPSZxdW90OyR7c3JjfS9pbmRleC5odG1sJnF1b3Q7IGRlc3Q9JnF1b3Q7JHtkaXN0fS9oZWxwL2luZGV4Lmh0bWwmcXVvdDsvJmd0OzwvY29kZT48L3A+Cis8L2Jsb2NrcXVvdGU+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY3ZzLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY3ZzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwOWIwMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jdnMuaHRtbApAQCAtMCwwICsxLDIwMCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CisgIDx0aXRsZT5DVlMgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iY3ZzIj5DdnM8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5IYW5kbGVzIHBhY2thZ2VzL21vZHVsZXMgcmV0cmlldmVkIGZyb20gYQorPGEgaHJlZj0iaHR0cDovL3d3dy5ub25nbnUub3JnL2N2cy8iIHRhcmdldD0iX3RvcCI+Q1ZTPC9hPiByZXBvc2l0b3J5LjwvcD4KKzxwPjxiPkltcG9ydGFudDo8L2I+IFRoaXMgdGFzayBuZWVkcyAmcXVvdDs8Y29kZT5jdnM8L2NvZGU+JnF1b3Q7IG9uIHRoZSBwYXRoLiBJZiBpdCBpc24ndCwgeW91IHdpbGwgZ2V0CithbiBlcnJvciAoc3VjaCBhcyBlcnJvciA8Y29kZT4yPC9jb2RlPiBvbiB3aW5kb3dzKS4gSWYgPGNvZGU+Jmx0O2N2cyZndDs8L2NvZGU+IGRvZXNuJ3Qgd29yaywgdHJ5IHRvIGV4ZWN1dGUgPGNvZGU+Y3ZzLmV4ZTwvY29kZT4KK2Zyb20gdGhlIGNvbW1hbmQgbGluZSBpbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgYXJlIHdvcmtpbmcuCisKKzxwPjxiPkNWU05UIE5vdGU8L2I+OiBDVlNOVCBwcmVmZXJzIHVzZXJzIHRvIHN0b3JlIHRoZSBwYXNzd29yZHMKK2luc2lkZSB0aGUgcmVnaXN0cnkuICBJZiB0aGUgPGEgaHJlZj0iY3ZzcGFzcy5odG1sIj5jdnNwYXNzIHRhc2s8L2E+CithbmQgdGhlIHBhc3NmaWxlIGF0dHJpYnV0ZSBkb24ndCBzZWVtIHRvIHdvcmsgZm9yIHlvdSwgdGhlIG1vc3QgbGlrZWx5CityZWFzb24gaXMgdGhhdCBDVlNOVCBpZ25vcmVzIHlvdXIgLmN2c3Bhc3MgZmlsZSBjb21wbGV0ZWx5LiAgU2VlIDxhCitocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTIxNjU3I2M1Ij5idWcKK3ppbGxhIHJlcG9ydCAyMTY1NzwvYT4gZm9yIHJlY29tbWVuZGVkIHdvcmthcm91bmRzLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWFuZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgQ1ZTIGNvbW1hbmQgdG8gZXhlY3V0ZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7Y2hlY2tvdXQmcXVvdDsuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3Npb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IC0gaWYgc2V0CisgICAgdG8gdHJ1ZSwgdGhpcyBpcyB0aGUgc2FtZSBhcyA8Y29kZT5jb21wcmVzc2lvbmxldmVsPSZxdW90OzMmcXVvdDs8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLiBEZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21wcmVzc2lvbmxldmVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgbnVtYmVyIGJldHdlZW4gMSBhbmQgOSAoY29ycmVzcG9uZGluZyB0bworICAgIHBvc3NpYmxlIHZhbHVlcyBmb3IgQ1ZTJyA8Y29kZT4teiM8L2NvZGU+IGFyZ3VtZW50KS4gQW55CisgICAgb3RoZXIgdmFsdWUgaXMgdHJlYXRlZCBhcyA8Y29kZT5jb21wcmVzc2lvbj0mcXVvdDtmYWxzZSZxdW90OzwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uIERlZmF1bHRzIHRvIG5vIGNvbXByZXNzaW9uLjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUm9vdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgPGNvZGU+Q1ZTUk9PVDwvY29kZT4gdmFyaWFibGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUnNoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8Y29kZT5DVlNfUlNIPC9jb2RlPiB2YXJpYWJsZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNoZWNrZWQgb3V0IGZpbGVzIHNob3VsZAorICAgIGJlIHBsYWNlZC4gIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIENWUydzIDxjb2RlPi1kPC9jb2RlPiBjb21tYW5kIGxpbmUKKyAgICBzd2l0Y2ggYXMgQW50IHdpbGwgbmV2ZXIgc2hvcnRlbiBwYXRobmFtZXMgdG8gYXZvaWQgZW1wdHkKKyAgICBkaXJlY3Rvcmllcy48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgcHJvamVjdCdzIGJhc2VkaXIuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFja2FnZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcGFja2FnZS9tb2R1bGUgdG8gY2hlY2sgb3V0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRhZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgdGFnIG9mIHRoZSBwYWNrYWdlL21vZHVsZSB0byBjaGVjayBvdXQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGF0ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Vc2UgdGhlIG1vc3QgcmVjZW50IHJldmlzaW9uIG5vIGxhdGVyIHRoYW4gdGhlIGdpdmVuIGRhdGU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5xdWlldDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdXBwcmVzcyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLiBUaGlzIGlzIHRoZSBzYW1lIGFzIDxjb2RlPi1xPC9jb2RlPiBvbiB0aGUgY29tbWFuZCBsaW5lLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDtmYWxzZSZxdW90OzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlYWxseXF1aWV0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN1cHByZXNzIGFsbCBtZXNzYWdlcy4gVGhpcyBpcyB0aGUgc2FtZSBhcworICAgICAgPGNvZGU+LVE8L2NvZGU+IG9uIHRoZSBjb21tYW5kIGxpbmUuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDtmYWxzZSZxdW90OzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5vZXhlYzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXBvcnQgb25seSwgZG9uJ3QgY2hhbmdlIGFueSBmaWxlcy48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgdG8gJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBvdXRwdXQgdG8gQU5UIExvZyBhcyA8Y29kZT5NU0dfSU5GTzwvY29kZT4uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIGVycm9yIGZyb20gdGhlIGNvbW1hbmQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGVycm9yIHRvIEFOVCBMb2cgYXMgPGNvZGU+TVNHX1dBUk48L2NvZGU+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRvIGFwcGVuZCBvdXRwdXQvZXJyb3Igd2hlbiByZWRpcmVjdGluZyB0byBhIGZpbGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IHRvICZxdW90O2ZhbHNlJnF1b3Q7LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBvcnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UG9ydCB1c2VkIGJ5IENWUyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IHBvcnQgPGNvZGU+MjQwMTwvY29kZT4uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UGFzc3dvcmQgZmlsZSB0byByZWFkIHBhc3N3b3JkcyBmcm9tLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBmaWxlIDxjb2RlPn4vLmN2c3Bhc3M8L2NvZGU+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCisgICAgICByZXR1cm4gY29kZSBvdGhlciB0aGFuIDxjb2RlPjA8L2NvZGU+LiBEZWZhdWx0cyB0byAmcXVvdDtmYWxzZSZxdW90OzwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7Y3ZzIGN2c1Jvb3Q9JnF1b3Q7OnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMmcXVvdDsKKyAgICAgICBwYWNrYWdlPSZxdW90O2FudCZxdW90OworICAgICAgIGRlc3Q9JnF1b3Q7JHt3cy5kaXJ9JnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD5jaGVja3Mgb3V0IHRoZSBwYWNrYWdlL21vZHVsZSAmcXVvdDthbnQmcXVvdDsgZnJvbSB0aGUgQ1ZTCityZXBvc2l0b3J5IHBvaW50ZWQgdG8gYnkgdGhlIDxjb2RlPmN2c1Jvb3Q8L2NvZGU+IGF0dHJpYnV0ZSwgYW5kIHN0b3JlcyB0aGUgZmlsZXMgaW4gJnF1b3Q7PGNvZGU+JHt3cy5kaXJ9PC9jb2RlPiZxdW90Oy48L3A+Cis8cHJlPiAgJmx0O2N2cyBkZXN0PSZxdW90OyR7d3MuZGlyfSZxdW90OyBjb21tYW5kPSZxdW90O3VwZGF0ZSZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD51cGRhdGVzIHRoZSBwYWNrYWdlL21vZHVsZSB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gY2hlY2tlZCBvdXQgaW50bworJnF1b3Q7PGNvZGU+JHt3cy5kaXJ9PC9jb2RlPiZxdW90Oy48L3A+CisKKzxwcmU+ICAmbHQ7Y3ZzIGNvbW1hbmQ9JnF1b3Q7LXEgZGlmZiAtdSAtTiZxdW90OyBvdXRwdXQ9JnF1b3Q7cGF0Y2gudHh0JnF1b3Q7LyZndDs8L3ByZT4KKworPHA+c2lsZW50bHkgKDxjb2RlPi1xPC9jb2RlPikgY3JlYXRlcyBhIGZpbGUgY2FsbGVkIDxjb2RlPnBhdGNoLnR4dDwvY29kZT4gd2hpY2ggY29udGFpbnMgYSB1bmlmaWVkICg8Y29kZT4tdTwvY29kZT4pIGRpZmYgd2hpY2ggaW5jbHVkZXMgbmV3IGZpbGVzIGFkZGVkIHZpYSAmcXVvdDtjdnMgYWRkJnF1b3Q7ICg8Y29kZT4tTjwvY29kZT4pIGFuZCBjYW4gYmUgdXNlZCBhcyBpbnB1dCB0byBwYXRjaC4KK1RoZSBlcXVpdmFsZW50LCB1c2luZyAgPGNvZGU+Jmx0O2NvbW1hbmRsaW5lJmd0OzwvY29kZT4gZWxlbWVudHMsIGlzOgorPC9wPgorPHByZT4KKyZsdDtjdnMgb3V0cHV0PSZxdW90O3BhdGNoJnF1b3Q7Jmd0OworICAgICZsdDtjb21tYW5kbGluZSZndDsKKyAgICAgICAgJmx0O2FyZ3VtZW50IHZhbHVlPSZxdW90Oy1xJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O2FyZ3VtZW50IHZhbHVlPSZxdW90O2RpZmYmcXVvdDsvJmd0OworICAgICAgICAmbHQ7YXJndW1lbnQgdmFsdWU9JnF1b3Q7LXUmcXVvdDsvJmd0OworICAgICAgICAmbHQ7YXJndW1lbnQgdmFsdWU9JnF1b3Q7LU4mcXVvdDsvJmd0OworICAgICZsdDsvY29tbWFuZGxpbmUmZ3Q7CismbHQ7L2N2cyZndDsKKzwvcHJlPgorb3I6Cis8cHJlPgorJmx0O2N2cyBvdXRwdXQ9JnF1b3Q7cGF0Y2gmcXVvdDsmZ3Q7CisgICAgJmx0O2NvbW1hbmRsaW5lJmd0OworICAgICAgICAmbHQ7YXJndW1lbnQgbGluZT0mcXVvdDstcSBkaWZmIC11IC1OJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2NvbW1hbmRsaW5lJmd0OworJmx0Oy9jdnMmZ3Q7Cis8L3ByZT4KKzxwPgorWW91IG1heSBpbmNsdWRlIGFzIG1hbnkgPGNvZGU+Jmx0O2NvbW1hbmRsaW5lJmd0OzwvY29kZT4gZWxlbWVudHMgYXMgeW91IGxpa2UuIAorRWFjaCB3aWxsIGluaGVyaXQgdGhlIDxjb2RlPmZhaWxvbmVycm9yPC9jb2RlPiwgPGNvZGU+Y29tcHJlc3Npb248L2NvZGU+LCBhbmQgb3RoZXIgJnF1b3Q7Z2xvYmFsJnF1b3Q7IHBhcmFtZXRlcnMKK2Zyb20gdGhlIDxjb2RlPiZsdDtjdnMmZ3Q7PC9jb2RlPiBlbGVtZW50LgorPC9wPgorCisKKzxwcmU+ICAmbHQ7Y3ZzIGNvbW1hbmQ9JnF1b3Q7dXBkYXRlIC1BIC1kJnF1b3Q7LyZndDs8L3ByZT4KKzxwPlVwZGF0ZXMgZnJvbSB0aGUgaGVhZCBvZiByZXBvc2l0b3J5IGlnbm9yaW5nIHN0aWNreSBiaXRzICg8Y29kZT4tQTwvY29kZT4pIGFuZCBjcmVhdGluZyBhbnkgbmV3IGRpcmVjdG9yaWVzIGFzIG5lY2Vzc2FyeSAoPGNvZGU+LWQ8L2NvZGU+KS48L3A+Cis8cD5Ob3RlOiB0aGUgdGV4dCBvZiB0aGUgY29tbWFuZCBpcyBwYXNzZWQgdG8gY3ZzICZxdW90O2FzLWlzJnF1b3Q7IHNvIGFueSBjdnMgb3B0aW9ucyBzaG91bGQgYXBwZWFyCitiZWZvcmUgdGhlIGNvbW1hbmQsIGFuZCBhbnkgY29tbWFuZCBvcHRpb25zIHNob3VsZCBhcHBlYXIgYWZ0ZXIgdGhlIGNvbW1hbmQgYXMgaW4gdGhlIGRpZmYgZXhhbXBsZQorYWJvdmUuIFNlZSA8YSBocmVmPSJodHRwOi8veGltYmlvdC5jb20vY3ZzL3dpa2kvaW5kZXgucGhwP3RpdGxlPUNhdGVnb3J5OlVzZXJfRG9jdW1lbnRhdGlvbiIgdGFyZ2V0PSJfdG9wIj50aGUgY3ZzIG1hbnVhbDwvYT4gZm9yIGRldGFpbHMsCitzcGVjaWZpY2FsbHkgdGhlIDxhIGhyZWY9Imh0dHA6Ly94aW1iaW90LmNvbS9jdnMvd2lraS9pbmRleC5waHA/dGl0bGU9Q1ZTLS1Db25jdXJyZW50X1ZlcnNpb25zX1N5c3RlbV92MS4xMi4xMi4xOl9HdWlkZV90b19DVlNfY29tbWFuZHMjU0VDMTE2IiB0YXJnZXQ9Il90b3AiPkd1aWRlIHRvIENWUyBjb21tYW5kczwvYT48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY3ZzcGFzcy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2N2c3Bhc3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODVkZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2N2c3Bhc3MuaHRtbApAQCAtMCwwICsxLDcwIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkNWU1Bhc3MgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iY3ZzIj5jdnNwYXNzPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+QWRkcyBlbnRyaWVzIHRvIGEgLmN2c3Bhc3MgZmlsZS4gQWRkaW5nIGVudHJpZXMgdG8gdGhpcyBmaWxlIGhhcyB0aGUgc2FtZSBhZmZlY3QgYXMgYSBjdnMgbG9naW4gY29tbWFuZC48L3A+CisKKzxwPjxiPkNWU05UIE5vdGU8L2I+OiBDVlNOVCBwcmVmZXJzIHVzZXJzIHRvIHN0b3JlIHRoZSBwYXNzd29yZHMKK2luc2lkZSB0aGUgcmVnaXN0cnkuICBJZiB0aGUgdGFzayBkb2Vzbid0IHNlZW0gdG8gd29yayBmb3IgeW91LCB0aGUKK21vc3QgbGlrZWx5IHJlYXNvbiBpcyB0aGF0IENWU05UIGlnbm9yZXMgeW91ciAuY3ZzcGFzcyBmaWxlCitjb21wbGV0ZWx5LiAgU2VlIDxhCitocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTIxNjU3I2M1Ij5idWcKK3ppbGxhIHJlcG9ydCAyMTY1NzwvYT4gZm9yIHJlY29tbWVuZGVkIHdvcmthcm91bmRzLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y3Zzcm9vdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgQ1ZTIHJlcG9zaXRvcnkgdG8gYWRkIGFuIGVudHJ5IGZvci48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UGFzc3dvcmQgdG8gYmUgYWRkZWQgdG8gdGhlIHBhc3N3b3JkIGZpbGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3NmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlBhc3N3b3JkIGZpbGUgdG8gYWRkIHRoZSBlbnRyeSB0by48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGNvZGU+fi8uY3ZzcGFzczwvY29kZT4uPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4gICZsdDtjdnNwYXNzIGN2c3Jvb3Q9JnF1b3Q7OnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMmcXVvdDsKKyAgICAgICBwYXNzd29yZD0mcXVvdDthbm9uY3ZzJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD5BZGRzIGFuIGVudHJ5IGludG8gdGhlIH4vLmN2c3Bhc3MgcGFzc3dvcmQgZmlsZS48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvY3ZzdGFnZGlmZi5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2N2c3RhZ2RpZmYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzhhOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2N2c3RhZ2RpZmYuaHRtbApAQCAtMCwwICsxLDIwNiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Q3ZzVGFnRGlmZiBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgyPjxhIG5hbWU9ImN2c3RhZ2RpZmYiPkN2c1RhZ0RpZmY8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5HZW5lcmF0ZXMgYW4gWE1MLWZvcm1hdHRlZCByZXBvcnQgZmlsZSBvZiB0aGUgY2hhbmdlcyBiZXR3ZWVuIHR3byB0YWdzIG9yIGRhdGVzIHJlY29yZGVkIGluIGEKKzxhIGhyZWY9Imh0dHA6Ly93d3cubm9uZ251Lm9yZy9jdnMvIiB0YXJnZXQ9Il90b3AiPkNWUzwvYT4gcmVwb3NpdG9yeS4gPC9wPgorPHA+PGI+SW1wb3J0YW50OjwvYj4gVGhpcyB0YXNrIG5lZWRzICJjdnMiIG9uIHRoZSBwYXRoLiBJZiBpdCBpc24ndCwgeW91IHdpbGwgZ2V0CithbiBlcnJvciAoc3VjaCBhcyBlcnJvciAyIG9uIHdpbmRvd3MpLiBJZiA8Y29kZT4mbHQ7Y3ZzJmd0OzwvY29kZT4gZG9lc24ndCB3b3JrLCB0cnkgdG8gZXhlY3V0ZSA8Y29kZT5jdnMuZXhlPC9jb2RlPgorZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBhcmUgd29ya2luZy4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN0YXJ0VGFnPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlYXJsaWVzdCB0YWcgZnJvbSB3aGljaCBkaWZmcyBhcmUgdG8gYmUKKyAgICAgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iMiI+ZXhhY3RseSBvbmUgb2YgdGhlIHR3by48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdGFydERhdGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGVhcmxpZXN0IGRhdGUgZnJvbSB3aGljaCBkaWZmcyBhcmUgdG8gYmUKKyAgICAgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC48YnI+CisgICAgIGFjY2VwdHMgYWxsIGZvcm1hdHMgYWNjZXB0ZWQgYnkgdGhlIGN2cyBjb21tYW5kIGZvciAtRCBkYXRlX3NwZWMgYXJndW1lbnRzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5kVGFnPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsYXRlc3QgdGFnIGZyb20gd2hpY2ggZGlmZnMgYXJlIHRvIGJlCisgICAgIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHJvd3NwYW49IjIiPmV4YWN0bHkgb25lIG9mIHRoZSB0d28uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5kRGF0ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbGF0ZXN0IGRhdGUgZnJvbSB3aGljaCBkaWZmcyBhcmUgdG8gYmUKKyAgICAgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC48YnI+CisgICAgIGFjY2VwdHMgYWxsIGZvcm1hdHMgYWNjZXB0ZWQgYnkgdGhlIGN2cyBjb21tYW5kIGZvciAtRCBkYXRlX3NwZWMgYXJndW1lbnRzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgaW4gd2hpY2ggdG8gd3JpdGUgdGhlIGRpZmYgcmVwb3J0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPlBhcmFtZXRlcnMgaW5oZXJpdGVkIGZyb20gdGhlIDxjb2RlPmN2czwvY29kZT4gdGFzazwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21wcmVzc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT50cnVlPC9jb2RlPiwgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB0aGUgbnVtYmVyIDEtOSAoY29ycmVzcG9uZGluZyB0byBwb3NzaWJsZSB2YWx1ZXMgZm9yIENWUyA8Y29kZT4teiM8L2NvZGU+IGFyZ3VtZW50KS4gQW55IG90aGVyIHZhbHVlIGlzIHRyZWF0ZWQgYXMgZmFsc2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uIERlZmF1bHRzIHRvIG5vIGNvbXByZXNzaW9uLiBpZiBwYXNzZWQgPGNvZGU+dHJ1ZTwvY29kZT4sIGxldmVsIDMgY29tcHJlc3Npb24gaXMgYXNzdW1lZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jdnNSb290PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBDVlNST09UIHZhcmlhYmxlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmN2c1JzaDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgQ1ZTX1JTSCB2YXJpYWJsZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYWNrYWdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBwYWNrYWdlL21vZHVsZSB0byBhbmFseXplLjxicj4KKyAgICBTaW5jZSBhbnQgMS42CisgICAgbXVsdGlwbGUgcGFja2FnZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcyBhcmUgcG9zc2libGUuCisgICAgYWxpYXNlcyBjb3JyZXNwb25kaW5nIHRvIGRpZmZlcmVudCBtb2R1bGVzIGFyZSBhbHNvIHBvc3NpYmxlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnF1aWV0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Qb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgcG9ydCAyNDAxLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3NmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlBhc3N3b3JkIGZpbGUgdG8gcmVhZCBwYXNzd29yZHMgZnJvbS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgZmlsZSA8Y29kZT5+Ly5jdnNwYXNzPC9jb2RlPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCisgICAgICByZXR1cm5jb2RlIG90aGVyIHRoYW4gMC4gRGVmYXVsdHMgdG8gZmFsc2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7Y3ZzdGFnZGlmZiBjdnNSb290PSZxdW90Ozpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljJnF1b3Q7CisgICAgICAgICAgICAgICAgZGVzdGZpbGU9JnF1b3Q7dGFnZGlmZi54bWwmcXVvdDsKKyAgICAgICAgICAgICAgICBwYWNrYWdlPSZxdW90O2FudCZxdW90OworICAgICAgICAgICAgICAgIHN0YXJ0VGFnPSZxdW90O0FOVF8xNCZxdW90OworICAgICAgICAgICAgICAgIGVuZFRhZz0mcXVvdDtBTlRfMTQxJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+CisKKzxwPkdlbmVyYXRlcyBhIHRhZ2RpZmYgcmVwb3J0IGZvciBhbGwgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZQoraW4gdGhlIDxjb2RlPmFudDwvY29kZT4gbW9kdWxlIGJldHdlZW4gdGhlIHRhZ3MgPGNvZGU+QU5UXzE0PC9jb2RlPiBhbmQgPGNvZGU+QU5UXzE0MTwvY29kZT4uCitJdCB3cml0ZXMgdGhlc2UgY2hhbmdlcyBpbnRvIHRoZSBmaWxlIDxjb2RlPnRhZ2RpZmYueG1sPC9jb2RlPi48L3A+CisKKzxwcmU+ICAmbHQ7Y3ZzdGFnZGlmZgorICAgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O3RhZ2RpZmYueG1sJnF1b3Q7CisgICAgICAgICAgICAgICAgcGFja2FnZT0mcXVvdDthbnQmcXVvdDsKKyAgICAgICAgICAgICAgICBzdGFydERhdGU9JnF1b3Q7MjAwMi0wMS0wMSZxdW90OworICAgICAgICAgICAgICAgIGVuZERhdGU9JnF1b3Q7MjAwMi0zMS0wMSZxdW90OworICAvJmd0OzwvcHJlPgorCis8cD5HZW5lcmF0ZXMgYSB0YWdkaWZmIHJlcG9ydCBmb3IgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUKK2luIHRoZSA8Y29kZT5hbnQ8L2NvZGU+IG1vZHVsZSBpbiBqYW51YXJ5IDIwMDIuIEluIHRoaXMgZXhhbXBsZSA8Y29kZT5jdnNSb290PC9jb2RlPgoraGFzIG5vdCBiZWVuIHNldC4gVGhlIGN1cnJlbnQgPGNvZGU+Y3ZzUm9vdDwvY29kZT4gd2lsbCBiZSB1c2VkIChhc3N1bWluZyB0aGUgYnVpbGQgaXMgc3RhcnRlZAorZnJvbSBhIGZvbGRlciBzdG9yZWQgaW4gPGNvZGU+Y3ZzPC9jb2RlPi4KK0l0IHdyaXRlcyB0aGVzZSBjaGFuZ2VzIGludG8gdGhlIGZpbGUgPGNvZGU+dGFnZGlmZi54bWw8L2NvZGU+LjwvcD4KKworPHByZT4gICZsdDtjdnN0YWdkaWZmCisgICAgICAgICAgICAgICAgZGVzdGZpbGU9JnF1b3Q7dGFnZGlmZi54bWwmcXVvdDsKKyAgICAgICAgICAgICAgICBwYWNrYWdlPSZxdW90O2FudCBqYWthcnRhLWd1bXAmcXVvdDsKKyAgICAgICAgICAgICAgICBzdGFydERhdGU9JnF1b3Q7MjAwMy0wMS0wMSZxdW90OworICAgICAgICAgICAgICAgIGVuZERhdGU9JnF1b3Q7MjAwMy0zMS0wMSZxdW90OworICAvJmd0OzwvcHJlPgorCis8cD5HZW5lcmF0ZXMgYSB0YWdkaWZmIHJlcG9ydCBmb3IgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUKK2luIHRoZSA8Y29kZT5hbnQ8L2NvZGU+IGFuZCA8Y29kZT5qYWthcnRhLWd1bXA8L2NvZGU+IG1vZHVsZXMgaW4gamFudWFyeSAyMDAzLgorSW4gdGhpcyBleGFtcGxlIDxjb2RlPmN2c1Jvb3Q8L2NvZGU+CitoYXMgbm90IGJlZW4gc2V0LiBUaGUgY3VycmVudCA8Y29kZT5jdnNSb290PC9jb2RlPiB3aWxsIGJlIHVzZWQgKGFzc3VtaW5nIHRoZSBidWlsZCBpcyBzdGFydGVkCitmcm9tIGEgZm9sZGVyIHN0b3JlZCBpbiA8Y29kZT5jdnM8L2NvZGU+LgorSXQgd3JpdGVzIHRoZXNlIGNoYW5nZXMgaW50byB0aGUgZmlsZSA8Y29kZT50YWdkaWZmLnhtbDwvY29kZT4uPC9wPgorCis8aDQ+R2VuZXJhdGUgUmVwb3J0PC9oND4KKzxwPkFudCBpbmNsdWRlcyBhIGJhc2ljIFhTTFQgc3R5bGVzaGVldCB0aGF0IHlvdSBjYW4gdXNlIHRvIGdlbmVyYXRlIAorYSBIVE1MIHJlcG9ydCBiYXNlZCBvbiB0aGUgeG1sIG91dHB1dC4gVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzCitob3cgdG8gZ2VuZXJhdGUgYSBIVE1MIHJlcG9ydCBmcm9tIHRoZSBYTUwgcmVwb3J0LjwvcD4KKworPHByZT4KKyAgICAgICAgJmx0O3N0eWxlIGluPSJ0YWdkaWZmLnhtbCIgCisgICAgICAgICAgICAgICBvdXQ9InRhZ2RpZmYuaHRtbCIgCisgICAgICAgICAgICAgICBzdHlsZT0iJHthbnQuaG9tZX0vZXRjL3RhZ2RpZmYueHNsIiZndDsKKyAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0idGl0bGUiIGV4cHJlc3Npb249IkFudCBEaWZmIi8mZ3Q7CisgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9Im1vZHVsZSIgZXhwcmVzc2lvbj0iYW50Ii8mZ3Q7CisgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImN2c3dlYiIgZXhwcmVzc2lvbj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMvIi8mZ3Q7CisgICAgICAgICZsdDsvc3R5bGUmZ3Q7Cis8L3ByZT4KKworPGg0Pk91dHB1dDwvaDQ+Cis8cD4KK1RoZSBjdnNyb290IGFuZCBwYWNrYWdlIGF0dHJpYnV0ZXMgb2YgdGhlIHRhZ2RpZmYgZWxlbWVudCBhcmUgbmV3IGluIGFudCAxLjYuPGJyPgorTm90ZXMgb24gZW50cnkgYXR0cmlidXRlcyA6Cis8dGFibGUgYm9yZGVyPSIxIj4KKzx0cj48dGg+QXR0cmlidXRlPC90aD48dGg+Q29tbWVudDwvdGg+PC90cj4KKzx0cj48dGQ+bmFtZTwvdGQ+PHRkPndoZW4gcmVwb3J0aW5nIG9uIG9uZSBwYWNrYWdlLCB0aGUgcGFja2FnZSBuYW1lIGlzIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0PC90ZD48L3RyPgorPHRyPjx0ZD5yZXZpc2lvbjwvdGQ+PHRkPnN1cHBsaWVkIGZvciBmaWxlcyB3aGljaCBleGlzdCBhdCB0aGUgZW5kIG9mIHRoZSByZXBvcnRpbmcgcGVyaW9kPC90ZD48L3RyPgorPHRyPjx0ZD5wcmV2cmV2aXNpb248L3RkPjx0ZD5zdXBwbGllZCBmb3IgZmlsZXMgd2hpY2ggZXhpc3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVwb3J0aW5nIHBlcmlvZC48YnI+CitPbGQgQ1ZTIHNlcnZlcnMgZG8gbm90IHN1cHBseSBpdCBmb3IgZGVsZXRlZCBmaWxlcy4gQ1ZTIDEuMTIuMiBzdXBwbGllcyBpdC48L3RkPjwvdHI+Cis8L3RhYmxlPgorPC9wPgorPHByZT4KKyZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsKKyZsdDt0YWdkaWZmIHN0YXJ0VGFnPSZxdW90O0FOVF8xNCZxdW90OyBlbmRUYWc9JnF1b3Q7QU5UXzE0MSZxdW90OyAKK2N2c3Jvb3Q9JnF1b3Q7OnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMmcXVvdDsgcGFja2FnZT0mcXVvdDthbnQmcXVvdDsmZ3Q7CisgICZsdDtlbnRyeSZndDsKKyAgICAmbHQ7ZmlsZSZndDsKKyAgICAgICZsdDtuYW1lJmd0O3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RpcmVjdG9yeVNjYW5uZXIuamF2YSZsdDsvbmFtZSZndDsKKyAgICAgICZsdDtyZXZpc2lvbiZndDsxLjE1LjIuMSZsdDsvcmV2aXNpb24mZ3Q7CisgICAgICAmbHQ7cHJldnJldmlzaW9uJmd0OzEuMTUmbHQ7L3ByZXZyZXZpc2lvbiZndDsKKyAgICAmbHQ7L2ZpbGUmZ3Q7CisgICZsdDsvZW50cnkmZ3Q7CismbHQ7L3RhZ2RpZmYmZ3Q7Cis8L3ByZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2N2c3ZlcnNpb24uaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jdnN2ZXJzaW9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmNTVhZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9jdnN2ZXJzaW9uLmh0bWwKQEAgLTAsMCArMSwxMDggQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorICA8dGl0bGU+Q1ZTVmVyc2lvbiBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJjdnMiPkN2c1ZlcnNpb248L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD4KK1RoaXMgdGFzayBhbGxvd3MgdG8gcmV0cmlldmUgYSBDVlMgY2xpZW50IGFuZCBzZXJ2ZXIgdmVyc2lvbi4KKyAgPGk+U2luY2UgQW50IDEuNi4xLjwvaT4KKzwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgY29sc3Bhbj0iMyI+QXR0cmlidXRlcyBmcm9tIHBhcmVudCBDdnMgdGFzayB3aGljaCBhcmUgbWVhbmluZ2Z1bCBoZXJlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUm9vdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgPGNvZGU+Q1ZTUk9PVDwvY29kZT4gdmFyaWFibGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUnNoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8Y29kZT5DVlNfUlNIPC9jb2RlPiB2YXJpYWJsZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjaGVja2VkIG91dCB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIHByb2plY3QncyBiYXNlZGlyLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhY2thZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHBhY2thZ2UvbW9kdWxlIHRvIGNoZWNrIG91dC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wb3J0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlBvcnQgdXNlZCBieSBDVlMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBwb3J0IDI0MDEuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UGFzc3dvcmQgZmlsZSB0byByZWFkIHBhc3N3b3JkcyBmcm9tLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBmaWxlIH4vLmN2c3Bhc3MuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEKKyAgICAgIHJldHVybiBjb2RlIG90aGVyIHRoYW4gPGNvZGU+MDwvY29kZT4uIERlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBjb2xzcGFuPSIzIj5TcGVjaWZpYyBhdHRyaWJ1dGVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xpZW50dmVyc2lvbnByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYSBwcm9wZXJ0eSB3aGVyZSB0aGUgY3ZzY2xpZW50IHZlcnNpb24KKyAgICAgIHNob3VsZCBiZSBzdG9yZWQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZXJ2ZXJ2ZXJzaW9ucHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiBhIHByb3BlcnR5IHdoZXJlIHRoZSBjdnMgc2VydmVyIHZlcnNpb24KKyAgICAgIHNob3VsZCBiZSBzdG9yZWQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiAgJmx0O2N2c3ZlcnNpb24gY3ZzUm9vdD0mcXVvdDs6cHNlcnZlcjphbm9uY3ZzQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyZxdW90OworICAgICAgIHBhc3NmaWxlPSZxdW90Oy9ob21lL215c2VsZi8uY3ZzcGFzcyZxdW90OworICAgICAgIHNlcnZlcnZlcnNpb25wcm9wZXJ0eT0mcXVvdDthcGFjaGVjdnN2ZXJzaW9uJnF1b3Q7CisgICAgICAgY2xpZW50dmVyc2lvbnByb3BlcnR5PSZxdW90O2xvY2FsY3ZzdmVyc2lvbiZxdW90OworICAvJmd0OzwvcHJlPgorPHA+ZmluZHMgb3V0IHRoZSBjdnMgY2xpZW50IGFuZCBzZXJ2ZXIgdmVyc2lvbnMgYW5kIHN0b3JlcyB0aGUgdmVyc2lvbnMgaW4gdGhlCitwcm9wZXJ0aWVzIGNhbGxlZCBhcGFjaGVjdnN2ZXJzaW9uIGFuZCBsb2NhbGN2c3ZlcnNpb248L3A+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kZWZhdWx0ZXhjbHVkZXMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kZWZhdWx0ZXhjbHVkZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU3NzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2RlZmF1bHRleGNsdWRlcy5odG1sCkBAIC0wLDAgKzEsMTA3IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkRlZmF1bHRFeGNsdWRlcyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJlY2hvIj5EZWZhdWx0RXhjbHVkZXM8L2E+PC9oMj4KKworPHA+PGVtPnNpbmNlIEFudCAxLjY8L2VtPjwvcD4KKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkFsdGVycyB0aGUgZGVmYXVsdCBleGNsdWRlcyBmb3IgYWxsIHN1YnNlcXVlbnQgcHJvY2Vzc2luZyBpbiB0aGUKK2J1aWxkLCBhbmQgcHJpbnRzIG91dCB0aGUgY3VycmVudCBkZWZhdWx0IGV4Y2x1ZGVzIGlmIGRlc2lyZWQuCisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVjaG88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciBvciBub3QgdG8gcHJpbnQgb3V0IHRoZSBkZWZhdWx0IGV4Y2x1ZGVzLihkZWZhdWx0cyB0byBmYWxzZSk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+YXR0cmlidXRlICJ0cnVlIiByZXF1aXJlZCBpZiBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgYXR0cmlidXRlIHNwZWNpZmllZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Z28gYmFjayB0byBoYXJkIHdpcmVkIGRlZmF1bHQgZXhjbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+YXR0cmlidXRlICJ0cnVlIiByZXF1aXJlZCBpZiBubworICAgIGlmIG5vIG90aGVyIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hZGQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHBhdHRlcm4gdG8gYWRkIHRvIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPmlmIG5vIG90aGVyIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZW1vdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBmcm9tIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPmlmIG5vIG90aGVyIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQ8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKworPHA+UHJpbnQgb3V0IHRoZSBkZWZhdWx0IGV4Y2x1ZGVzPC9wPgorCis8cHJlPiAgJmx0O2RlZmF1bHRleGNsdWRlcyBlY2hvPSZxdW90O3RydWUmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5QcmludCBvdXQgdGhlIGRlZmF1bHQgZXhjbHVkZXMgYW5kIGV4Y2x1ZGUgYWxsICouYmFrIGZpbGVzIGluCis8c3Ryb25nPmFsbDwvc3Ryb25nPiBmdXJ0aGVyIHByb2Nlc3Npbmc8L3A+CisKKzxwcmU+ICAmbHQ7ZGVmYXVsdGV4Y2x1ZGVzIGVjaG89JnF1b3Q7dHJ1ZSZxdW90OyBhZGQ9JnF1b3Q7KiovKi5iYWsmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5TaWxlbnRseSBhbGxvdyBzZXZlcmFsIGZpbGVzZXQgYmFzZWQgdGFza3MgdG8gb3BlcmF0ZSBvbiBlbWFjcworYmFja3VwIGZpbGVzIGFuZCB0aGVuIHJlc3RvcmUgbm9ybWFsIGJlaGF2aW9yPC9wPgorCis8cHJlPgorICAmbHQ7ZGVmYXVsdGV4Y2x1ZGVzIHJlbW92ZT0mcXVvdDsqKi8qfiZxdW90Oy8mZ3Q7CisKKyAgKGRvIHNldmVyYWwgZmlsZXNldCBiYXNlZCB0YXNrcyBoZXJlKQorCisgICZsdDtkZWZhdWx0ZXhjbHVkZXMgZGVmYXVsdD0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKKzwvcHJlPgorCis8aDM+Tm90ZXM8L2gzPgorQnkgZGVmYXVsdCB0aGUgcGF0dGVybiA8dHQ+KiovLnN2bjwvdHQ+IGFuZCA8dHQ+KiovLnN2bi8qKjwvdHQ+IGFyZSBzZXQgYXMgZGVmYXVsdCAKK2V4Y2x1ZGVzLiBXaXRoIHZlcnNpb24gMS4zIFN1YnZlcnNpb24gc3VwcG9ydHMgdGhlIAorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9zdWJ2ZXJzaW9uLnRpZ3Jpcy5vcmcvc3ZuXzEuM19yZWxlYXNlbm90ZXMuaHRtbCI+JnF1b3Q7X3N2biBoYWNrJnF1b3Q7PC9hPi4KK1RoYXQgbWVhbnMsIHRoYXQgdGhlIHN2bi1saWJyYXJpZXMgZXZhbHVhdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCB1c2UgPGk+LnN2bjwvaT4gCitvciA8aT5fc3ZuPC9pPiBkaXJlY3RvcnkgcmVnYXJkaW5nIHRvIHRoYXQgdmFsdWUuIFdlIGhhZCBjaG9zZW4gbm90IHRvIGV2YWx1YXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0bworZ2V0IGEgbW9yZSByZWxpYWJsZSBidWlsZC4gSW5zdGVhZCB5b3UgaGF2ZSB0byBjaGFuZ2UgdGhlIHNldHRpbmdzIGJ5IHlvdXJzZWxmIGJ5IGNoYW5naW5nCit0aGUgZXhjbHVkZSBwYXR0ZXJuczoKKzxwcmU+CisgICZsdDtkZWZhdWx0ZXhjbHVkZXMgcmVtb3ZlPSZxdW90OyoqLy5zdm4mcXVvdDsvJmd0OworICAmbHQ7ZGVmYXVsdGV4Y2x1ZGVzIHJlbW92ZT0mcXVvdDsqKi8uc3ZuLyoqJnF1b3Q7LyZndDsKKyAgJmx0O2RlZmF1bHRleGNsdWRlcyBhZGQ9JnF1b3Q7KiovX3N2biZxdW90Oy8mZ3Q7CisgICZsdDtkZWZhdWx0ZXhjbHVkZXMgYWRkPSZxdW90OyoqL19zdm4vKiomcXVvdDsvJmd0OworPC9wcmU+CisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kZWxldGUuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kZWxldGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDUyNzdhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2RlbGV0ZS5odG1sCkBAIC0wLDAgKzEsMTk2IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkRlbGV0ZSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJkZWxldGUiPkRlbGV0ZTwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkRlbGV0ZXMgYSBzaW5nbGUgZmlsZSwgYSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIGZpbGVzIGFuZAorc3ViZGlyZWN0b3JpZXMsIG9yIGEgc2V0IG9mIGZpbGVzIHNwZWNpZmllZCBieSBvbmUgb3IgbW9yZQorPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb248L2E+cy4KK1RoZSBsaXRlcmFsIGltcGxpY2F0aW9uIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gaXMgdGhhdAorZGlyZWN0b3JpZXMgYXJlIG5vdCBpbmNsdWRlZDsgaG93ZXZlciB0aGUgcmVtb3ZhbCBvZiBlbXB0eSBkaXJlY3RvcmllcyBjYW4KK2JlIHRyaWdnZXJlZCB3aGVuIHVzaW5nIG5lc3RlZCBmaWxlc2V0cyBieSBzZXR0aW5nIHRoZQorPGNvZGU+aW5jbHVkZUVtcHR5RGlyczwvY29kZT4gYXR0cmlidXRlIHRvIDxpPnRydWU8L2k+LiBOb3RlIHRoYXQgdGhpcworYXR0cmlidXRlIGlzIG1lYW5pbmdsZXNzIGluIHRoZSBjb250ZXh0IG9mIGFueSBvZiB0aGUgdmFyaW91cyByZXNvdXJjZQorY29sbGVjdGlvbiB0eXBlcyB0aGF0IDxpPmRvPC9pPiBpbmNsdWRlIGRpcmVjdG9yaWVzLCBidXQgdGhhdCBubyBhdHRlbXB0Cit3aWxsIGJlIG1hZGUgdG8gZGVsZXRlIG5vbi1lbXB0eSBkaXJlY3RvcmllcyBpbiBhbnkgY2FzZS48L3A+Cis8cD4KK0lmIHlvdSB1c2UgdGhpcyB0YXNrIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgY3JlYXRlZCBieSBlZGl0b3JzCithbmQgaXQgZG9lc24ndCBzZWVtIHRvIHdvcmssIHJlYWQgdXAgb24gdGhlCis8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RlZmF1bHRleGNsdWRlcyI+ZGVmYXVsdCBleGNsdXNpb24gc2V0PC9hPgoraW4gPHN0cm9uZz5EaXJlY3RvcnktYmFzZWQgVGFza3M8L3N0cm9uZz4sIGFuZCBzZWUgdGhlCis8Y29kZT5kZWZhdWx0ZXhjbHVkZXM8L2NvZGU+IGF0dHJpYnV0ZSBiZWxvdy4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBkZWxldGUsIHNwZWNpZmllZCBhcyBlaXRoZXIgdGhlIHNpbXBsZQorICAgICBmaWxlbmFtZSAoaWYgdGhlIGZpbGUgZXhpc3RzIGluIHRoZSBjdXJyZW50IGJhc2UgZGlyZWN0b3J5KSwgYQorICAgICByZWxhdGl2ZS1wYXRoIGZpbGVuYW1lLCBvciBhIGZ1bGwtcGF0aCBmaWxlbmFtZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgcm93c3Bhbj0iMiI+QXQgbGVhc3Qgb25lIG9mIHRoZSB0d28sCisgICAgIHVubGVzcyBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMgYXJlIHNwZWNpZmllZAorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB0byBkZWxldGUsIGluY2x1ZGluZyBhbGwgaXRzIGZpbGVzIGFuZAorICAgICBzdWJkaXJlY3Rvcmllcy48YnI+CisgICAgIDxiPk5vdGU6PC9iPiA8Y29kZT5kaXI8L2NvZGU+IGlzIDxlbT5ub3Q8L2VtPiB1c2VkCisgICAgIHRvIHNwZWNpZnkgYSBkaXJlY3RvcnkgbmFtZSBmb3IgPGNvZGU+ZmlsZTwvY29kZT47IDxjb2RlPmZpbGU8L2NvZGU+CisgICAgIGFuZCA8Y29kZT5kaXI8L2NvZGU+IGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyLjxicj4KKyAgICAgPGI+V0FSTklORzo8L2I+IERvIDxiPm5vdDwvYj4gc2V0IDxjb2RlPmRpcjwvY29kZT4gdG8KKyAgICAgPGNvZGU+JnF1b3Q7LiZxdW90OzwvY29kZT4sIDxjb2RlPiZxdW90OyR7YmFzZWRpcn0mcXVvdDs8L2NvZGU+LAorICAgICBvciB0aGUgZnVsbC1wYXRobmFtZSBlcXVpdmFsZW50IHVubGVzcyB5b3UgdHJ1bHkgPGVtPmludGVuZDwvZW0+IHRvCisgICAgIHJlY3Vyc2l2ZWx5IHJlbW92ZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGJhc2UgZGlyZWN0b3J5CisgICAgIChhbmQgdGhlIGJhc2UgZGlyZWN0b3J5IGl0c2VsZiwgaWYgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgd29ya2luZworICAgICBkaXJlY3RvcnkpLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBzaG93IHRoZSBuYW1lIG9mIGVhY2ggZGVsZXRlZCBmaWxlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDtmYWxzZSZxdW90OzwvaT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5xdWlldDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiB0aGUgc3BlY2lmaWVkIGZpbGUgb3IgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LAorICAgICBkbyBub3QgZGlzcGxheSBhIGRpYWdub3N0aWMgbWVzc2FnZSAodW5sZXNzIEFudAorICAgICBoYXMgYmVlbiBpbnZva2VkIHdpdGggdGhlIDxjb2RlPi12ZXJib3NlPC9jb2RlPiBvcgorICAgICA8Y29kZT4tZGVidWc8L2NvZGU+IHN3aXRjaGVzKSBvciBtb2RpZnkgdGhlIGV4aXQgc3RhdHVzIHRvCisgICAgIHJlZmxlY3QgYW4gZXJyb3IuCisgICAgIFdoZW4gc2V0IHRvICZxdW90O3RydWUmcXVvdDssIGlmIGEgZmlsZSBvciBkaXJlY3RvcnkgY2Fubm90IGJlIGRlbGV0ZWQsCisgICAgIG5vIGVycm9yIGlzIHJlcG9ydGVkLiBUaGlzIHNldHRpbmcgZW11bGF0ZXMgdGhlCisgICAgIDxjb2RlPi1mPC9jb2RlPiBvcHRpb24gdG8gdGhlIFVuaXggPGVtPnJtPC9lbT4gY29tbWFuZC4KKyAgICAgU2V0dGluZyB0aGlzIHRvICZxdW90O3RydWUmcXVvdDsgaW1wbGllcyBzZXR0aW5nCisgICAgIDxjb2RlPmZhaWxvbmVycm9yPC9jb2RlPiB0byAmcXVvdDtmYWxzZSZxdW90Oy4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db250cm9scyB3aGV0aGVyIGFuIGVycm9yIChzdWNoIGFzIGEgZmFpbHVyZSB0bworICAgIGRlbGV0ZSBhIGZpbGUpIHN0b3BzIHRoZSBidWlsZCBvciBpcyBtZXJlbHkgcmVwb3J0ZWQgdG8gdGhlIHNjcmVlbi4KKyAgICBPbmx5IHJlbGV2YW50IGlmIDxjb2RlPnF1aWV0PC9jb2RlPiBpcyAmcXVvdDtmYWxzZSZxdW90Oy48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7dHJ1ZSZxdW90OzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVlbXB0eWRpcnM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBkZWxldGUgZW1wdHkgZGlyZWN0b3JpZXMKKyAgICAgICAgICAgICAgICAgICAgIHdoZW4gdXNpbmcgZmlsZXNldHMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGVtPkRlcHJlY2F0ZWQuPC9lbT4gIFVzZSByZXNvdXJjZSBjb2xsZWN0aW9ucy4KKyAgICAgIENvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZgorICAgICAgZmlsZXMgdGhhdCBtdXN0IGJlIGRlbGV0ZWQuIEFsbCBmaWxlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeQorICAgICAgc3BlY2lmaWVkIGluIDxjb2RlPmRpcjwvY29kZT4uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxlbT5EZXByZWNhdGVkLjwvZW0+ICBVc2UgcmVzb3VyY2UgY29sbGVjdGlvbnMuCisgICAgICBUaGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZgorICAgICAgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48ZW0+RGVwcmVjYXRlZC48L2VtPiAgVXNlIHJlc291cmNlIGNvbGxlY3Rpb25zLgorICAgICAgQ29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mCisgICAgICBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZGVsZXRpb24gbGlzdC4KKyAgICAgIEFsbCBmaWxlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgaW4gPGNvZGU+ZGlyPC9jb2RlPi4KKyAgICAgIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGVtPkRlcHJlY2F0ZWQuPC9lbT4gIFVzZSByZXNvdXJjZSBjb2xsZWN0aW9ucy4KKyAgICAgIFRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mCisgICAgICB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxlbT5EZXByZWNhdGVkLjwvZW0+ICBVc2UgcmVzb3VyY2UgY29sbGVjdGlvbnMuCisgICAgICBXaGV0aGVyIHRvIHVzZSA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RlZmF1bHRleGNsdWRlcyI+CisgICAgICBkZWZhdWx0IGV4Y2x1ZGVzLjwvYT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7dHJ1ZSZxdW90OzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlbGV0ZW9uZXhpdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSBGaWxlI2RlbGV0ZU9uRXhpdCgpIGlmIHRoZXJlIGlzIGEKKyAgICAgIGZhaWx1cmUgdG8gZGVsZXRlIGEgZmlsZSwgdGhpcyBjYXVzZXMgdGhlIGp2bSB0byBhdHRlbXB0CisgICAgICB0byBkZWxldGUgdGhlIGZpbGUgd2hlbiB0aGUganZtIHByb2Nlc3MgaXMgdGVybWluYXRpbmcuCisgICAgICA8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7ZGVsZXRlIGZpbGU9JnF1b3Q7L2xpYi9hbnQuamFyJnF1b3Q7LyZndDs8L3ByZT4KKzxwPmRlbGV0ZXMgdGhlIGZpbGUgPGNvZGU+L2xpYi9hbnQuamFyPC9jb2RlPi48L3A+Cis8cHJlPiAgJmx0O2RlbGV0ZSBkaXI9JnF1b3Q7bGliJnF1b3Q7LyZndDs8L3ByZT4KKzxwPmRlbGV0ZXMgdGhlIDxjb2RlPmxpYjwvY29kZT4gZGlyZWN0b3J5LCBpbmNsdWRpbmcgYWxsIGZpbGVzCithbmQgc3ViZGlyZWN0b3JpZXMgb2YgPGNvZGU+bGliPC9jb2RlPi48L3A+CisKKzxwcmU+ICAmbHQ7ZGVsZXRlJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouYmFrJnF1b3Q7LyZndDsKKyAgJmx0Oy9kZWxldGUmZ3Q7Cis8L3ByZT4KKzxwPmRlbGV0ZXMgYWxsIGZpbGVzIHdpdGggdGhlIGV4dGVuc2lvbiA8Y29kZT4uYmFrPC9jb2RlPiBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorYW5kIGFueSBzdWJkaXJlY3Rvcmllcy48L3A+CisKKzxwcmU+ICAmbHQ7ZGVsZXRlIGluY2x1ZGVFbXB0eURpcnM9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7YnVpbGQmcXVvdDsvJmd0OworICAmbHQ7L2RlbGV0ZSZndDsKKzwvcHJlPgorPHA+ZGVsZXRlcyBhbGwgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG9mIDxjb2RlPmJ1aWxkPC9jb2RlPiwgaW5jbHVkaW5nCis8Y29kZT5idWlsZDwvY29kZT4gaXRzZWxmLjwvcD4KKworPHByZT4gICZsdDtkZWxldGUgaW5jbHVkZWVtcHR5ZGlycz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtidWlsZCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qJnF1b3Q7LyZndDsKKyAgJmx0Oy9kZWxldGUmZ3Q7Cis8L3ByZT4KKzxwPmRlbGV0ZXMgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBvZiA8Y29kZT5idWlsZDwvY29kZT4sIHdpdGhvdXQKKzxjb2RlPmJ1aWxkPC9jb2RlPiBpdHNlbGYuPC9wPgorCis8cHJlPiAgJmx0O2RlbGV0ZSBpbmNsdWRlZW1wdHlkaXJzPSZxdW90O3RydWUmcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyYyZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8uc3ZuJnF1b3Q7IGRlZmF1bHRleGNsdWRlcz0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7CisgICZsdDsvZGVsZXRlJmd0OworPC9wcmU+Cis8cD5kZWxldGVzIHRoZSBzdWJ2ZXJzaW9uIG1ldGFkYXRhIGRpcmVjdG9yaWVzIHVuZGVyIDxjb2RlPnNyYzwvY29kZT4uIEJlY2F1c2UgPGNvZGU+LnN2bjwvY29kZT4KK2lzIG9uIG9mIHRoZSA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RlZmF1bHRleGNsdWRlcyI+ZGVmYXVsdCBleGNsdWRlczwvYT4geW91IGhhdmUgdG8gdXNlIHRoZSAKKzxjb2RlPmRlZmF1bHRleGNsdWRlczwvY29kZT4gZmxhZywgb3RoZXJ3aXNlIEFudCB3b250IGRlbGV0ZSB0aGVzZSBkaXJlY3RvcmllcyBhbmQgdGhlIGZpbGVzIGluIGl0LjwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kZWx0cmVlLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvZGVsdHJlZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YWRmNGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvZGVsdHJlZS5odG1sCkBAIC0wLDAgKzEsNTYgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+RGVsdHJlZSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJkZWx0cmVlIj5EZWx0cmVlPC9hPjwvaDI+Cis8aDM+PGk+RGVwcmVjYXRlZDwvaT48L2gzPgorPHA+PGk+VGhpcyB0YXNrIGhhcyBiZWVuIGRlcHJlY2F0ZWQuICBVc2UgdGhlIERlbGV0ZSB0YXNrIGluc3RlYWQuPC9pPjwvcD4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5EZWxldGVzIGEgZGlyZWN0b3J5IHdpdGggYWxsIGl0cyBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3RvcnkgdG8gZGVsZXRlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiAgJmx0O2RlbHRyZWUgZGlyPSZxdW90O2Rpc3QmcXVvdDsvJmd0OzwvcHJlPgorPHA+ZGVsZXRlcyB0aGUgZGlyZWN0b3J5IDxjb2RlPmRpc3Q8L2NvZGU+LCBpbmNsdWRpbmcgaXRzIGZpbGVzIGFuZAorc3ViZGlyZWN0b3JpZXMuPC9wPgorPHByZT4gICZsdDtkZWx0cmVlIGRpcj0mcXVvdDske2Rpc3R9JnF1b3Q7LyZndDs8L3ByZT4KKzxwPmRlbGV0ZXMgdGhlIGRpcmVjdG9yeSA8Y29kZT4ke2Rpc3R9PC9jb2RlPiwgaW5jbHVkaW5nIGl0cyBmaWxlcyBhbmQKK3N1YmRpcmVjdG9yaWVzLjwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kZXBlbmRzZXQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kZXBlbmRzZXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkwMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2RlcGVuZHNldC5odG1sCkBAIC0wLDAgKzEsMTYxIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkRlcGVuZFNldCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj5EZXBlbmRTZXQ8L2gyPgorCitBIHRhc2sgdG8gbWFuYWdlIGFyYml0cmFyeSBkZXBlbmRlbmNpZXMgYmV0d2VlbiByZXNvdXJjZXMuCisKKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKzxwPgorVGhlIGRlcGVuZHNldCB0YXNrIGNvbXBhcmVzIGEgc2V0IG9mIHNvdXJjZXMgd2l0aCBhIHNldCBvZiB0YXJnZXQKK2ZpbGVzLiAgSWYgYW55IG9mIHRoZSBzb3VyY2VzIGhhcyBiZWVuIG1vZGlmaWVkIG1vcmUgcmVjZW50bHkgdGhhbgorYW55IG9mIHRoZSB0YXJnZXQgZmlsZXMsIGFsbCBvZiB0aGUgdGFyZ2V0IGZpbGVzIGFyZSByZW1vdmVkLgorPC9wPgorPHA+CitTb3VyY2VzIGFuZCB0YXJnZXQgZmlsZXMgYXJlIHNwZWNpZmllZCB2aWEgbmVzdGVkCis8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT5zOworc291cmNlcyBjYW4gYmUgcmVzb3VyY2VzIG9mIGFueSB0eXBlLCB3aGlsZSB0YXJnZXRzIGFyZSByZXN0cmljdGVkIHRvIGZpbGVzCitvbmx5LiBBdCBsZWFzdCBvbmUgc2V0IG9mIHNvdXJjZXMgYW5kIG9uZSBzZXQgb2YgdGFyZ2V0cyBpcyByZXF1aXJlZC4KKzwvcD4KKzxwPgorVXNlIGEgRmlsZVNldCB3aGVuIHlvdSB3YW50IHRvIHVzZSB3aWxkY2FyZCBpbmNsdWRlIG9yIGV4Y2x1ZGUKK3BhdHRlcm5zIGFuZCBkb24ndCBjYXJlIGFib3V0IG1pc3NpbmcgZmlsZXMuICBVc2UgYSBGaWxlTGlzdCB3aGVuIHlvdQord2FudCB0byBjb25zaWRlciB0aGUgbm9uLWV4aXN0ZW5jZSBvZiBhIGZpbGUgYXMgaWYgaXQgd2VyZSBvdXQgb2YKK2RhdGUuICBJZiB0aGVyZSBhcmUgYW55IG5vbi1leGlzdGluZyBmaWxlcyBpbiBhbnkgc291cmNlIG9yIHRhcmdldAorRmlsZUxpc3QsIGFsbCB0YXJnZXQgZmlsZXMgd2lsbCBiZSByZW1vdmVkLgorPC9wPgorPHA+CitEZXBlbmRTZXQgaXMgdXNlZnVsIHRvIGNhcHR1cmUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBvciBjYW5ub3QgYmUKK2RldGVybWluZWQgYWxnb3JpdGhtaWNhbGx5LiAgRm9yIGV4YW1wbGUsIHRoZSA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPiB0YXNrIG9ubHkKK2NvbXBhcmVzIHRoZSBzb3VyY2UgWE1MIGZpbGUgYW5kIFhTTFQgc3R5bGVzaGVldCBhZ2FpbnN0IHRoZSB0YXJnZXQKK2ZpbGUgdG8gZGV0ZXJtaW5lZCB3aGV0aGVyIHRvIHJlc3R5bGUgdGhlIHNvdXJjZS4gIFVzaW5nIGRlcGVuZHNldCB5b3UKK2NhbiBleHRlbmQgdGhpcyBkZXBlbmRlbmN5IGNoZWNraW5nIHRvIGluY2x1ZGUgYSBEVEQgb3IgWFNEIGZpbGUgYXMKK3dlbGwgYXMgb3RoZXIgc3R5bGVzaGVldHMgaW1wb3J0ZWQgYnkgdGhlIG1haW4gc3R5bGVzaGVldC4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorCis8cD4KKyhub25lKQorPC9wPgorCis8aDM+UGFyYW1ldGVycyBTcGVjaWZpZWQgYXMgTmVzdGVkIEVsZW1lbnRzPC9oMz4KKworPGg0PnNvdXJjZXM8L2g0PgorCis8cD5UaGUgPGNvZGU+Jmx0O3NvdXJjZXMmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIGEKKzxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCN1bmlvbiI+VW5pb248L2E+IGludG8gd2hpY2gKK2FyYml0cmFyeSByZXNvdXJjZSBjb2xsZWN0aW9ucyBjYW4gYmUgbmVzdGVkLiA8Yj5TaW5jZSBBbnQgMS43PC9iPgorPC9wPgorCis8aDQ+c3JjZmlsZXNldDwvaDQ+CisKKzxwPgorVGhlIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZXNldCZndDs8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzIGEgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiBBbGwgZmlsZXMgaW5jbHVkZWQgaW4KK3RoaXMgZmlsZXNldCB3aWxsIGJlIGNvbXBhcmVkIGFnYWluc3QgYWxsIGZpbGVzIGluY2x1ZGVkIGluIGFsbCBvZiB0aGUKKzxjb2RlPiZsdDt0YXJnZXRmaWxlc2V0Jmd0OzwvY29kZT4gZmlsZXNldHMgYW5kIDxjb2RlPiZsdDt0YXJnZXRmaWxlbGlzdCZndDs8L2NvZGU+CitmaWxlbGlzdHMuICBNdWx0aXBsZSA8Y29kZT4mbHQ7c3JjZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzIG1heSBiZSBzcGVjaWZpZWQuCis8L3A+CisKKzxoND5zcmNmaWxlbGlzdDwvaDQ+CisKKzxwPgorVGhlIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZWxpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCI+RmlsZUxpc3Q8L2E+LiBBbGwgZmlsZXMgaW5jbHVkZWQgaW4KK3RoaXMgZmlsZWxpc3Qgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IGFsbCBmaWxlcyBpbmNsdWRlZCBpbiBhbGwgb2YgdGhlIAorPGNvZGU+Jmx0O3RhcmdldGZpbGVzZXQmZ3Q7PC9jb2RlPiBmaWxlc2V0cyBhbmQgPGNvZGU+Jmx0O3RhcmdldGZpbGVsaXN0Jmd0OzwvY29kZT4KK2ZpbGVsaXN0cy4gIE11bHRpcGxlIDxjb2RlPiZsdDtzcmNmaWxlbGlzdCZndDs8L2NvZGU+IGZpbGVsaXN0cyBtYXkgYmUgc3BlY2lmaWVkLgorPC9wPgorCis8aDQ+dGFyZ2V0czwvaDQ+CisKKzxwPlRoZSA8Y29kZT4mbHQ7dGFyZ2V0cyZndDs8L2NvZGU+IGVsZW1lbnQgaXMgYQorPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QYXRoPC9hPiBhbmQgdGh1cyBjYW4KK2luY2x1ZGUgYW55IGZpbGVzeXN0ZW0tYmFzZWQgcmVzb3VyY2UuIDxiPlNpbmNlIEFudCAxLjc8L2I+Cis8L3A+CisKKzxoND50YXJnZXRmaWxlc2V0PC9oND4KKworPHA+CitUaGUgbmVzdGVkIDxjb2RlPiZsdDt0YXJnZXRmaWxlc2V0Jmd0OzwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMgYSA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uICBBbGwgZmlsZXMgaW5jbHVkZWQgaW4KK3RoaXMgZmlsZXNldCB3aWxsIGJlIGNvbXBhcmVkIGFnYWluc3QgYWxsIGZpbGVzIGluY2x1ZGVkIGluIGFsbCBvZiB0aGUKKzxjb2RlPiZsdDtzcmNmaWxlc2V0Jmd0OzwvY29kZT4gZmlsZXNldHMgYW5kIDxjb2RlPiZsdDtzb3VyY2VmaWxlbGlzdCZndDs8L2NvZGU+CitmaWxlbGlzdHMsIGFuZCBpZiBhbnkgYXJlIG9sZGVyLCB0aGV5IGFyZSBhbGwgZGVsZXRlZC4KK011bHRpcGxlIDxjb2RlPiZsdDt0YXJnZXRmaWxlc2V0Jmd0OzwvY29kZT4gZmlsZXNldHMgbWF5IGJlIHNwZWNpZmllZC4KKzwvcD4KKworPGg0PnRhcmdldGZpbGVsaXN0PC9oND4KKworPHA+CitUaGUgbmVzdGVkIDxjb2RlPiZsdDt0YXJnZXRmaWxlbGlzdCZndDs8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzIGEgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9maWxlbGlzdC5odG1sIj5GaWxlTGlzdDwvYT4uICBBbGwgZmlsZXMgaW5jbHVkZWQgaW4KK3RoaXMgZmlsZWxpc3Qgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IGFsbCBmaWxlcyBpbmNsdWRlZCBpbiBhbGwgb2YgdGhlCis8Y29kZT4mbHQ7c3JjZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzIGFuZCA8Y29kZT4mbHQ7c291cmNlZmlsZWxpc3QmZ3Q7PC9jb2RlPgorZmlsZWxpc3RzLCBhbmQgaWYgYW55IGFyZSBvbGRlciwgdGhleSBhcmUgYWxsIGRlbGV0ZWQuCitNdWx0aXBsZSA8Y29kZT4mbHQ7dGFyZ2V0ZmlsZWxpc3QmZ3Q7PC9jb2RlPiBmaWxlbGlzdHMgbWF5IGJlIHNwZWNpZmllZC4KKzwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPiA8cHJlPgorICAgICZsdDtkZXBlbmRzZXQmZ3Q7CisgICAgICAgJmx0O3NyY2ZpbGVsaXN0CisgICAgICAgICAgIGRpciAgID0gJnF1b3Q7JHtkdGQuZGlyfSZxdW90OworICAgICAgICAgICBmaWxlcyA9ICZxdW90O3BhcGVyLmR0ZCxjb21tb24uZHRkJnF1b3Q7LyZndDsKKyAgICAgICAmbHQ7c3JjZmlsZWxpc3QKKyAgICAgICAgICAgZGlyICAgPSAmcXVvdDske3hzbC5kaXJ9JnF1b3Q7CisgICAgICAgICAgIGZpbGVzID0gJnF1b3Q7Y29tbW9uLnhzbCZxdW90Oy8mZ3Q7CisgICAgICAgJmx0O3NyY2ZpbGVsaXN0CisgICAgICAgICAgIGRpciAgID0gJnF1b3Q7JHtiYXNlZGlyfSZxdW90OworICAgICAgICAgICBmaWxlcyA9ICZxdW90O2J1aWxkLnhtbCZxdW90Oy8mZ3Q7CisgICAgICAgJmx0O3RhcmdldGZpbGVzZXQKKyAgICAgICAgICAgZGlyICAgICAgPSAmcXVvdDske291dHB1dC5kaXJ9JnF1b3Q7CisgICAgICAgICAgIGluY2x1ZGVzID0gJnF1b3Q7KiovKi5odG1sJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2RlcGVuZHNldCZndDsgIDwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD4gCitJbiB0aGlzIGV4YW1wbGUgZGVyaXZlZCBIVE1MIGZpbGVzIGluIHRoZSAke291dHB1dC5kaXJ9IGRpcmVjdG9yeSAKK3dpbGwgYmUgcmVtb3ZlZCBpZiBhbnkgYXJlIG91dC1vZi1kYXRlIHdpdGggcmVzcGVjdCB0bzo8L3A+Cis8b2w+Cis8bGk+dGhlIERURCBvZiB0aGVpciBzb3VyY2UgWE1MIGZpbGVzPC9saT4KKzxsaT5hIGNvbW1vbiBEVEQgKGltcG9ydGVkIGJ5IHRoZSBtYWluIERURCk8L2xpPgorPGxpPmEgc3Vib3JkaW5hdGUgWFNMVCBzdHlsZXNoZWV0IChpbXBvcnRlZCBieSB0aGUgbWFpbiBzdHlsZXNoZWV0KSwgb3I8L2xpPgorPGxpPnRoZSBidWlsZGZpbGU8L2xpPgorPC9vbD4KKworPHA+CitJZiBhbnkgb2YgdGhlIHNvdXJjZXMgaW4gdGhlIGFib3ZlIGV4YW1wbGUgZG9lcyBub3QgZXhpc3QsIGFsbAordGFyZ2V0IGZpbGVzIHdpbGwgYWxzbyBiZSByZW1vdmVkLiAgVG8gaWdub3JlIG1pc3Npbmcgc291cmNlcyBpbnN0ZWFkLAordXNlIGZpbGVzZXRzIGluc3RlYWQgb2YgZmlsZWxpc3RzIGZvciB0aGUgc291cmNlcy4KKzwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kaWFnbm9zdGljcy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2RpYWdub3N0aWNzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyZGE2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kaWFnbm9zdGljcy5odG1sCkBAIC0wLDAgKzEsNDkgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+RGlhZ25vc3RpY3MgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iZGlhZ25vc3RpY3MiPkRpYWdub3N0aWNzPC9hPjwvaDI+Cis8aDM+RGlhZ25vc3RpY3M8L2gzPgorPHA+CitSdW5zIEFudCdzIDxjb2RlPi1kaWFnbm9zdGljczwvY29kZT4gY29kZSBpbnNpZGUgQW50IGl0c2VsZi4gVGhpcyBpcyBnb29kIGZvciAKK2RlYnVnZ2luZyBBbnQncyBjb25maWd1cmF0aW9uIHVuZGVyIGFuIElERS4gCis8Yj5TaW5jZSBBbnQgMS43LjA8L2I+Cis8L3A+CisKKworPGgzPkV4YW1wbGVzPC9oMz4KKworPHByZT4KKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImRpYWdub3N0aWNzIiBkZXNjcmlwdGlvbj0iZGlhZ25vc3RpY3MiJmd0OworICAgICAgICAmbHQ7ZGlhZ25vc3RpY3MvJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworPC9wcmU+Cis8cD4KKyAgICBQcmludHMgb3V0IHRoZSBjdXJyZW50IGRpYWdub3N0aWNzIGR1bXAuCis8L3A+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2Rpcm5hbWUuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kaXJuYW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyMjdiNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9kaXJuYW1lLmh0bWwKQEAgLTAsMCArMSw3NCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5EaXJuYW1lIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImVjaG8iPkRpcm5hbWU8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD4KK1Rhc2sgdG8gZGV0ZXJtaW5lIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIHNwZWNpZmllZCBmaWxlLgorPC9wPgorPHA+IAorV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdG8gdGhlCit2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgKG9yIGRpcmVjdG9yeSkgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLAordGhlIGxhc3QgcGF0aCBlbGVtZW50LiBJZiB0aGUgc3BlY2lmaWVkIGZpbGUgaXMgYSBwYXRoIHRoYXQgZW5kcyBpbiBhCitmaWxlbmFtZSwgdGhlIGZpbGVuYW1lIHdpbGwgYmUgZHJvcHBlZC4gSWYgdGhlIHNwZWNpZmllZCBmaWxlIGlzIGp1c3QKK2EgZmlsZW5hbWUsIHRoZSBkaXJlY3Rvcnkgd2lsbCBiZSB0aGUgY3VycmVudCBkaXJlY3RvcnkuCis8L3A+CisgIDxwPgorICAgIDxlbT5Ob3RlOjwvZW0+IFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBVTklYIGRpcm5hbWUgY29tbWFuZCwgd2hpY2ggaXMKKyAgICBkZWZpbmVkIGFzICJzdHJpcCBub24tZGlyZWN0b3J5IHN1ZmZpeCBmcm9tIGZpbGVuYW1lIi4gJmx0O2Rpcm5hbWUmZ3Q7CisgICAgZGV0ZXJtaW5lcyB0aGUgZnVsbCBkaXJlY3RvcnkgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuCisgIDwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhdGggdG8gdGFrZSB0aGUgZGlybmFtZSBvZi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiAgJmx0O2Rpcm5hbWUgcHJvcGVydHk9JnF1b3Q7YW50ZmlsZS5kaXImcXVvdDsgZmlsZT0mcXVvdDske2FudC5maWxlfSZxdW90Oy8mZ3Q7PC9wcmU+Cit3aWxsIHNldCA8Y29kZT5hbnRmaWxlLmRpcjwvY29kZT4gdG8gdGhlIGRpcmVjdG9yeSBwYXRoIGZvcgorPGNvZGU+JHthbnQuZmlsZX08L2NvZGU+LgorPHByZT4gICZsdDtkaXJuYW1lIHByb3BlcnR5PSZxdW90O2Zvby5kaXJuYW1lJnF1b3Q7IGZpbGU9JnF1b3Q7Zm9vLnR4dCZxdW90Oy8mZ3Q7PC9wcmU+Cit3aWxsIHNldCA8Y29kZT5mb28uZGlybmFtZTwvY29kZT4gdG8gdGhlIHByb2plY3QncyBiYXNlZGlyLjwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2Vhci5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2Vhci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNWI2YmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvZWFyLmh0bWwKQEAgLTAsMCArMSwyMTMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+RUFSIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImVhciI+RWFyPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+QW4gZXh0ZW5zaW9uIG9mIHRoZSA8YSBocmVmPSJqYXIuaHRtbCI+SmFyPC9hPiB0YXNrIHdpdGggc3BlY2lhbAordHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBhcmNoaXZlLjwvcD4KKzxwPihUaGUgRWFyIHRhc2sgaXMgYSBzaG9ydGN1dCBmb3Igc3BlY2lmeWluZyB0aGUgcGFydGljdWxhciBsYXlvdXQgb2YgYSBFQVIgZmlsZS4gCitUaGUgc2FtZSB0aGluZyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSA8aT5wcmVmaXg8L2k+IGFuZCA8aT5mdWxscGF0aDwvaT4KK2F0dHJpYnV0ZXMgb2YgemlwZmlsZXNldHMgaW4gYSBaaXAgb3IgSmFyIHRhc2suKTwvcD4KKzxwPlRoZSBleHRlbmRlZCB6aXBmaWxlc2V0IGVsZW1lbnQgZnJvbSB0aGUgemlwIHRhc2sgKHdpdGggYXR0cmlidXRlcyA8aT5wcmVmaXg8L2k+LCA8aT5mdWxscGF0aDwvaT4sIGFuZCA8aT5zcmM8L2k+KSBpcyBhdmFpbGFibGUgaW4gdGhlIEVhciB0YXNrLjwvcD4KKworPHA+PGI+UGxlYXNlIG5vdGUgdGhhdCB0aGUgemlwIGZvcm1hdCBhbGxvd3MgbXVsdGlwbGUgZmlsZXMgb2YgdGhlIHNhbWUKK2Z1bGx5LXF1YWxpZmllZCBuYW1lIHRvIGV4aXN0IHdpdGhpbiBhIHNpbmdsZSBhcmNoaXZlLiAgVGhpcyBoYXMgYmVlbgorZG9jdW1lbnRlZCBhcyBjYXVzaW5nIHZhcmlvdXMgcHJvYmxlbXMgZm9yIHVuc3VzcGVjdGluZyB1c2Vycy4gIElmIHlvdSB3aXNoCit0byBhdm9pZCB0aGlzIGJlaGF2aW9yIHlvdSBtdXN0IHNldCB0aGUgPGNvZGU+ZHVwbGljYXRlPC9jb2RlPiBhdHRyaWJ1dGUKK3RvIGEgdmFsdWUgb3RoZXIgdGhhbiBpdHMgZGVmYXVsdCwgPGNvZGU+JnF1b3Q7YWRkJnF1b3Q7PC9jb2RlPi48L2I+PC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgRUFSIGZpbGUgdG8gY3JlYXRlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hcHB4bWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byB1c2UgKE1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCkuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIHVwZGF0ZSBpcyBzZXQgdG8gdHJ1ZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGphciB0aGUgZmlsZXMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Tm90IG9ubHkgc3RvcmUgZGF0YSBidXQgYWxzbyBjb21wcmVzcyB0aGVtLAorICAgIGRlZmF1bHRzIHRvIHRydWUuICBVbmxlc3MgeW91IHNldCB0aGUgPGVtPmtlZXBjb21wcmVzc2lvbjwvZW0+CisgICAgYXR0cmlidXRlIHRvIGZhbHNlLCB0aGlzIHdpbGwgYXBwbHkgdG8gdGhlIGVudGlyZSBhcmNoaXZlLCBub3QKKyAgICBvbmx5IHRoZSBmaWxlcyB5b3UndmUgYWRkZWQgd2hpbGUgdXBkYXRpbmcuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+a2VlcGNvbXByZXNzaW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkZvciBlbnRyaWVzIGNvbWluZyBmcm9tIGV4aXN0aW5nIGFyY2hpdmVzIChsaWtlCisgICAgbmVzdGVkIDxlbT56aXBmaWxlc2V0PC9lbT5zIG9yIHdoaWxlIHVwZGF0aW5nIHRoZSBhcmNoaXZlKSwga2VlcAorICAgIHRoZSBjb21wcmVzc2lvbiBhcyBpdCBoYXMgYmVlbiBvcmlnaW5hbGx5IGluc3RlYWQgb2YgdXNpbmcgdGhlCisgICAgPGVtPmNvbXByZXNzPC9lbT4gYXR0cmlidXRlLiAgRGVmYXVsdHMgZmFsc2UuICA8ZW0+U2luY2UgQW50CisgICAgMS42PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzCisgICAgICBpbnNpZGUgdGhlIGFyY2hpdmUuICBEZWZhdWx0cyB0byBVVEY4LiA8c3Ryb25nPkl0IGlzIG5vdAorICAgICAgcmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYXMgdGhlIGNyZWF0ZWQgYXJjaGl2ZSB3aWxsIG1vc3QKKyAgICAgIGxpa2VseSBiZSB1bnJlYWRhYmxlIGZvciBKYXZhIG90aGVyd2lzZS48L3N0cm9uZz48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlc29ubHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcmUgb25seSBmaWxlIGVudHJpZXMsIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90CisgICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWFuaWZlc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG1hbmlmZXN0IGZpbGUgdG8gdXNlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVzZXRtYW5pZmVzdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iZWhhdmlvciB3aGVuIGEgTWFuaWZlc3QgaXMgZm91bmQgaW4gYSB6aXBmaWxlc2V0IG9yIHppcGdyb3VwZmlsZXNldCBmaWxlIGlzIGZvdW5kLiAgVmFsaWQgdmFsdWVzIGFyZSAmcXVvdDtza2lwJnF1b3Q7LCAmcXVvdDttZXJnZSZxdW90OywgYW5kICZxdW90O21lcmdld2l0aG91dG1haW4mcXVvdDsuICAmcXVvdDttZXJnZSZxdW90OyB3aWxsIG1lcmdlIGFsbCBvZiB0aGUgbWFuaWZlc3RzIHRvZ2V0aGVyLCBhbmQgbWVyZ2UgdGhpcyBpbnRvIGFueSBvdGhlciBzcGVjaWZpZWQgbWFuaWZlc3RzLiAgJnF1b3Q7bWVyZ2V3aXRob3V0bWFpbiZxdW90OyBtZXJnZXMgZXZlcnl0aGluZyBidXQgdGhlIE1haW4gc2VjdGlvbiBvZiB0aGUgbWFuaWZlc3RzLiAgRGVmYXVsdCB2YWx1ZSBpcyAmcXVvdDtza2lwJnF1b3Q7LgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPndoZW5tYW5pZmVzdG9ubHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YmVoYXZpb3Igd2hlbiBubyBmaWxlcyBtYXRjaC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7ZmFpbCZxdW90OywgJnF1b3Q7c2tpcCZxdW90OywgYW5kICZxdW90O2NyZWF0ZSZxdW90Oy4gIERlZmF1bHQgaXMgJnF1b3Q7Y3JlYXRlJnF1b3Q7LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmlmZXN0ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGVuY29kaW5nIHVzZWQgdG8gcmVhZCB0aGUgSkFSIG1hbmlmZXN0LCB3aGVuIGEgbWFuaWZlc3QgZmlsZSBpcyBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0gZW5jb2RpbmcuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kZXg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciB0byBjcmVhdGUgYW4gPEEKKyAgICBIUkVGPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvamFyL2phci5odG1sI0pBUiUyMEluZGV4Ij5pbmRleAorICAgIGxpc3Q8L0E+IHRvIHNwZWVkIHVwIGNsYXNzbG9hZGluZy4gIFRoaXMgaXMgYSBKREsgMS4zKyBzcGVjaWZpYworICAgIGZlYXR1cmUuICBVbmxlc3MgeW91IHNwZWNpZnkgYWRkaXRpb25hbCBqYXJzIHdpdGggbmVzdGVkIDxhCisgICAgaHJlZj0iI2luZGV4amFycyI+PGNvZGU+aW5kZXhqYXJzPC9jb2RlPjwvYT4gZWxlbWVudHMsIG9ubHkgdGhlCisgICAgY29udGVudHMgb2YgdGhpcyBqYXIgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgaW5kZXguICBEZWZhdWx0cyB0bworICAgIGZhbHNlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVwZGF0ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciB0byB1cGRhdGUgb3Igb3ZlcndyaXRlCisgICAgICB0aGUgZGVzdGluYXRpb24gZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gIERlZmF1bHQgaXMgJnF1b3Q7ZmFsc2UmcXVvdDsuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZHVwbGljYXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJlaGF2aW9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDtwcmVzZXJ2ZSZxdW90OywgYW5kICZxdW90O2ZhaWwmcXVvdDsuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAmcXVvdDthZGQmcXVvdDsuICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yb3VuZHVwPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpbGwgYmUKKyAgICByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVyIG9mIHNlY29uZHMuPGJyPgorICAgIFppcCBhcmNoaXZlcyBzdG9yZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aXRoIGEgZ3JhbnVsYXJpdHkgb2YKKyAgICB0d28gc2Vjb25kcywgc28gdGhlIHRpbWVzIHdpbGwgZWl0aGVyIGJlIHJvdW5kZWQgdXAgb3IgZG93bi4gIElmCisgICAgeW91IHJvdW5kIGRvd24sIHRoZSBhcmNoaXZlIHdpbGwgYWx3YXlzIHNlZW0gb3V0LW9mLWRhdGUgd2hlbiB5b3UKKyAgICByZXJ1biB0aGUgdGFzaywgc28gdGhlIGRlZmF1bHQgaXMgdG8gcm91bmQgdXAuICBSb3VuZGluZyB1cCBtYXkKKyAgICBsZWFkIHRvIGEgZGlmZmVyZW50IHR5cGUgb2YgcHJvYmxlbXMgbGlrZSBKU1BzIGluc2lkZSBhIHdlYgorICAgIGFyY2hpdmUgdGhhdCBzZWVtIHRvIGJlIHNsaWdodGx5IG1vcmUgcmVjZW50IHRoYW4gcHJlY29tcGlsZWQKKyAgICBwYWdlcywgcmVuZGVyaW5nIHByZWNvbXBpbGF0aW9uIHVzZWxlc3MuPGJyPgorICAgIERlZmF1bHRzIHRvIHRydWUuICA8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sZXZlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Ob24tZGVmYXVsdCBsZXZlbCBhdCB3aGljaCBmaWxlIGNvbXByZXNzaW9uIHNob3VsZCBiZQorICAgIHBlcmZvcm1lZC4gVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAobm8gY29tcHJlc3Npb24vZmFzdGVzdCkgdG8gOQorICAgIChtYXhpbXVtIGNvbXByZXNzaW9uL3Nsb3dlc3QpLiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5OZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+bWV0YWluZjwvaDQ+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPm1ldGFpbmY8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzIGEgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiBBbGwgZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyBmaWxlc2V0IHdpbGwKK2VuZCB1cCBpbiB0aGUgPGNvZGU+TUVUQS1JTkY8L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUgZWFyIGZpbGUuIElmIHRoaXMKK2ZpbGVzZXQgaW5jbHVkZXMgYSBmaWxlIG5hbWVkIDxjb2RlPk1BTklGRVNULk1GPC9jb2RlPiwgdGhlIGZpbGUgaXMKK2lnbm9yZWQgYW5kIHlvdSB3aWxsIGdldCBhIHdhcm5pbmcuPC9wPgorCis8aDQ+bWFuaWZlc3QsIGluZGV4amFycywgc2VydmljZTwvaDQ+CitUaGVzZSBhcmUgaW5oZXJpdGVkIGZyb20gPGEgaHJlZj0iamFyLmh0bWwiPiZsdDtqYXImZ3Q7PC9hPgorCis8aDI+RXhhbXBsZTwvaDI+Cis8cHJlPgorICAgICZsdDtlYXIgZGVzdGZpbGU9JnF1b3Q7JHtidWlsZC5kaXJ9L215YXBwLmVhciZxdW90OyBhcHB4bWw9JnF1b3Q7JHtzcmMuZGlyfS9tZXRhZGF0YS9hcHBsaWNhdGlvbi54bWwmcXVvdDsmZ3Q7CisgICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtidWlsZC5kaXJ9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyouamFyLCoud2FyJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2VhciZndDsKKzwvcHJlPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvZWNoby5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2VjaG8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWRlZTYyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2VjaG8uaHRtbApAQCAtMCwwICsxLDE4MCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5FY2hvIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImVjaG8iPkVjaG88L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5FY2hvZXMgYSBtZXNzYWdlIHRvIHRoZSBjdXJyZW50IGxvZ2dlcnMgYW5kIGxpc3RlbmVycyB3aGljaAorbWVhbnMgPHR0PlN5c3RlbS5vdXQ8L3R0PiB1bmxlc3Mgb3ZlcnJpZGRlbi4gQSA8dHQ+bGV2ZWw8L3R0PgorY2FuIGJlIHNwZWNpZmllZCwgd2hpY2ggY29udHJvbHMgYXQgd2hhdCBsb2dnaW5nIGxldmVsIHRoZSBtZXNzYWdlIGlzCitmaWx0ZXJlZCBhdC4KKzxwPgorVGhlIHRhc2sgY2FuIGFsc28gZWNobyB0byBhIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIG9wdGlvbiB0byBhcHBlbmQgcmF0aGVyCit0aGFuIG92ZXJ3cml0ZSB0aGUgZmlsZSBpcyBhdmFpbGFibGUsIGFuZCB0aGUgPHR0PmxldmVsPC90dD4gb3B0aW9uIGlzCitpZ25vcmVkPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbWVzc2FnZSB0byBlY2hvLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby4gIFRleHQgbWF5IGFsc28gYmUgaW5jbHVkZWQgaW4gYQorICAgICAgY2hhcmFjdGVyIHNlY3Rpb24gd2l0aGluIHRoaXMgZWxlbWVudC4gIElmIG5laXRoZXIgaXMgaW5jbHVkZWQgYSAKKyAgICAgIGJsYW5rIGxpbmUgd2lsbCBiZSBlbWl0dGVkIGluIHRoZSBvdXRwdXQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSB0byB3cml0ZSB0aGUgbWVzc2FnZSB0by48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hcHBlbmQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QXBwZW5kIHRvIGFuIGV4aXN0aW5nIGZpbGUgKG9yCisgICAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9pby9GaWxlV3JpdGVyLmh0bWwjRmlsZVdyaXRlcihqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKSIgdGFyZ2V0PSJfYmxhbmsiPgorICAgICAgb3BlbiBhIG5ldyBmaWxlIC8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGU8L2E+KT8KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0IGlzIGZhbHNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxldmVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbnRyb2wgdGhlIGxldmVsIGF0IHdoaWNoIHRoaXMgbWVzc2FnZSBpcyByZXBvcnRlZC4KKyAgICAgICAgICAgIE9uZSBvZiAiZXJyb3IiLCAid2FybmluZyIsICJpbmZvIiwgInZlcmJvc2UiLCAiZGVidWciIChkZWNyZWFzaW5nIG9yZGVyKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHQgaXMgIndhcm5pbmciLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nIHRvIHVzZSwgZGVmYXVsdCBpcyAiIjsgdGhlIGxvY2FsIHN5c3RlbSBlbmNvZGluZy4gPGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7SGVsbG8sIHdvcmxkJnF1b3Q7LyZndDsKKzwvcHJlPgorPHByZT4KKyZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7RW1iZWQgYSBsaW5lIGJyZWFrOiR7bGluZS5zZXBhcmF0b3J9JnF1b3Q7LyZndDsKKzwvcHJlPgorPHByZT4KKyZsdDtlY2hvJmd0O0VtYmVkIGFub3RoZXI6JHtsaW5lLnNlcGFyYXRvcn0mbHQ7L2VjaG8mZ3Q7Cis8L3ByZT4KKzxwcmU+CismbHQ7ZWNobyZndDtUaGlzIGlzIGEgbG9uZ2VyIG1lc3NhZ2Ugc3RyZXRjaGluZyBvdmVyCit0d28gbGluZXMuCismbHQ7L2VjaG8mZ3Q7Cis8L3ByZT4KKzxwcmU+CismbHQ7ZWNobyZndDsKK1RoaXMgaXMgYSBsb25nZXIgbWVzc2FnZSBzdHJldGNoaW5nIG92ZXIKK3RocmVlIGxpbmVzOyB0aGUgZmlyc3QgbGluZSBpcyBhIGJsYW5rCismbHQ7L2VjaG8mZ3Q7Cis8L3ByZT4KK1RoZSBuZXdsaW5lIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgJmx0O2VjaG8mZ3Q7IHRhZyB3aWxsIGJlIHBhcnQgb2YgdGhlIG91dHB1dC48YnI+CitOZXdsaW5lcyBpbiBjaGFyYWN0ZXIgZGF0YSB3aXRoaW4gdGhlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCBhcmUgbm90IGRpc2NhcmRlZCBieSBYTUwgcGFyc2Vycy48YnI+CitTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMteG1sLTIwMDQwMjA0LyNzZWMtbGluZS1lbmRzIj4KK1czQyBSZWNvbW1lbmRhdGlvbiAwNCBGZWJydWFyeSAyMDA0IC8gRW5kIG9mIExpbmUgaGFuZGxpbmcKKzwvYT4gZm9yIG1vcmUgZGV0YWlscy4KKworPHByZT4mbHQ7ZWNobyBtZXNzYWdlPSZxdW90O0RlbGV0aW5nIGRyaXZlIEM6JnF1b3Q7IGxldmVsPSZxdW90O2RlYnVnJnF1b3Q7LyZndDs8L3ByZT4KK0EgbWVzc2FnZSB3aGljaCBvbmx5IGFwcGVhcnMgaW4gPHR0Pi1kZWJ1ZzwvdHQ+IG1vZGUuCis8cHJlPiZsdDtlY2hvIGxldmVsPSZxdW90O2Vycm9yJnF1b3Q7Jmd0OworSW1taW5lbnQgZmFpbHVyZSBpbiB0aGUgYW50aW1hdHRlciBjb250YWlubWVudCBmYWNpbGl0eS4KK1BsZWFzZSB3aXRoZHJhdyB0byBzYWZlIGxvY2F0aW9uIGF0IGxlYXN0IDUwa20gYXdheS4KKyZsdDsvZWNobyZndDsKKzwvcHJlPgorQSBtZXNzYWdlIHdoaWNoIGFwcGVhcnMgZXZlbiBpbiA8dHQ+LXF1aWV0PC90dD4gbW9kZS4KKworPHByZT4mbHQ7ZWNobyBmaWxlPSJydW5uZXIuY3NoIiBhcHBlbmQ9ImZhbHNlIiZndDsjXCEvYmluL3Rjc2gKK2phdmEtMS4zLjEgLW14MTAyNG0gJHtwcm9qZWN0LmVudHJ5cG9pbnR9ICQkKgorJmx0Oy9lY2hvJmd0OzwvcHJlPgorR2VuZXJhdGUgYSBzaGVsbCBzY3JpcHQgYnkgZWNob2luZyB0byBhIGZpbGUuCitOb3RlIHRoZSB1c2Ugb2YgYSBkb3VibGUgJCBzeW1ib2wgdG8gc3RvcCBBbnQKK2ZpbHRlcmluZyBvdXQgdGhlIHNpbmdsZSAkIGR1cmluZyB2YXJpYWJsZSBleHBhbnNpb24KKworPHA+RGVwZW5kaW5nIG9uIHRoZSBsb2dsZXZlbCBBbnQgcnVucywgbWVzc2FnZXMgYXJlIHByaW50IG91dCBvciBzaWxlbnRseQoraWdub3JlZDoKKzx0YWJsZT4KKzx0cj4KKyAgPHRoPkFudC1TdGF0ZW1lbnQ8L3RoPgorICA8dGg+LXF1aWV0LCAtcTwvdGg+CisgIDx0aD48aT5ubyBzdGF0ZW1lbnQ8L3RoPgorICA8dGg+LXZlcmJvc2UsIC12PC90aD4KKyAgPHRoPi1kZWJ1ZywgLWQ8L3RoPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+Jmx0O2VjaG8gbWVzc2FnZT0iVGhpcyBpcyBlcnJvciBtZXNzYWdlLiIgbGV2ZWw9ImVycm9yIiAvJmd0OzwvcHJlPjwvdGQ+CisgIDx0ZCBhbGlnbj0iY2VudGVyIj5vazwvdGQ+CisgIDx0ZCBhbGlnbj0iY2VudGVyIj5vazwvdGQ+CisgIDx0ZCBhbGlnbj0iY2VudGVyIj5vazwvdGQ+CisgIDx0ZCBhbGlnbj0iY2VudGVyIj5vazwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT4mbHQ7ZWNobyBtZXNzYWdlPSJUaGlzIGlzIHdhcm5pbmcgbWVzc2FnZS4iIC8mZ3Q7PC9wcmU+PC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPiZsdDtlY2hvIG1lc3NhZ2U9IlRoaXMgaXMgd2FybmluZyBtZXNzYWdlLiIgbGV2ZWw9Indhcm5pbmciIC8mZ3Q7PC9wcmU+PC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPiZsdDtlY2hvIG1lc3NhZ2U9IlRoaXMgaXMgaW5mbyBtZXNzYWdlLiIgbGV2ZWw9ImluZm8iIC8mZ3Q7PC9wcmU+PC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm5vdCBsb2dnZWQ8L3RkPgorICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgorICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgorICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+Jmx0O2VjaG8gbWVzc2FnZT0iVGhpcyBpcyB2ZXJib3NlIG1lc3NhZ2UuIiBsZXZlbD0idmVyYm9zZSIgLyZndDs8L3ByZT48L3RkPgorICA8dGQgYWxpZ249ImNlbnRlciI+bm90IGxvZ2dlZDwvdGQ+CisgIDx0ZCBhbGlnbj0iY2VudGVyIj5ub3QgbG9nZ2VkPC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPiZsdDtlY2hvIG1lc3NhZ2U9IlRoaXMgaXMgZGVidWcgbWVzc2FnZS4iIGxldmVsPSJkZWJ1ZyIgLyZndDs8L3ByZT48L3RkPgorICA8dGQgYWxpZ249ImNlbnRlciI+bm90IGxvZ2dlZDwvdGQ+CisgIDx0ZCBhbGlnbj0iY2VudGVyIj5ub3QgbG9nZ2VkPC90ZD4KKyAgPHRkIGFsaWduPSJjZW50ZXIiPm5vdCBsb2dnZWQ8L3RkPgorICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKworCisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvZWNob3htbC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2VjaG94bWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mM2RkYWYxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2VjaG94bWwuaHRtbApAQCAtMCwwICsxLDY1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkVjaG9YTUwgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+RWNob1hNTDwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+RWNobyBuZXN0ZWQgWE1MIHRvIHRoZSBjb25zb2xlIG9yIGEgZmlsZS4gPGI+U2luY2UgQW50IDEuNzwvYj48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIHJlY2VpdmUgdGhlIFhNTC4gSWYgb21pdHRlZCBuZXN0ZWQKKyAgICAgIFhNTCB3aWxsIGJlIGVjaG9lZCB0byB0aGUgbG9nLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGFwcGVuZCA8Y29kZT5maWxlPC9jb2RlPiwgaWYgc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CitOZXN0ZWQgWE1MIGNvbnRlbnQgaXMgcmVxdWlyZWQuCisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiZsdDtlY2hveG1sIGZpbGU9JnF1b3Q7c3ViYnVpbGQueG1sJnF1b3Q7Jmd0OworICAmbHQ7cHJvamVjdCBkZWZhdWx0PSZxdW90O2ZvbyZxdW90OyZndDsKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Zm9vJnF1b3Q7Jmd0OworICAgICAgJmx0O2VjaG8mZ3Q7Zm9vJmx0Oy9lY2hvJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworICAmbHQ7L3Byb2plY3QmZ3Q7CismbHQ7L2VjaG94bWwmZ3Q7Cis8L3ByZT4KKzxwPkNyZWF0ZXMgYW4gQW50IGJ1aWxkZmlsZSwgPGNvZGU+c3ViYnVpbGQueG1sPC9jb2RlPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2V4ZWMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9leGVjLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmNzMyOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9leGVjLmh0bWwKQEAgLTAsMCArMSw0MzEgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorICA8dGl0bGU+RXhlYyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJleGVjIj5FeGVjPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+RXhlY3V0ZXMgYSBzeXN0ZW0gY29tbWFuZC4gV2hlbiB0aGUgPGk+b3M8L2k+IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZW4KK3RoZSBjb21tYW5kIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBBbnQgaXMgcnVuIG9uIG9uZSBvZiB0aGUgc3BlY2lmaWVkIG9wZXJhdGluZworc3lzdGVtcy48L3A+CisKKzxwPk5vdGUgdGhhdCB5b3UgY2Fubm90IGludGVyYWN0IHdpdGggdGhlIGZvcmtlZCBwcm9ncmFtLCB0aGUgb25seSB3YXkKK3RvIHNlbmQgaW5wdXQgdG8gaXQgaXMgdmlhIHRoZSBpbnB1dCBhbmQgaW5wdXRzdHJpbmcgYXR0cmlidXRlcy4gQWxzbyBub3RlIHRoYXQKK3NpbmNlIEFudCAxLjYsIGFueSBhdHRlbXB0IHRvIHJlYWQgaW5wdXQgaW4gdGhlIGZvcmtlZCBwcm9ncmFtIHdpbGwgcmVjZWl2ZSBhbgorRU9GICgtMSkuIFRoaXMgaXMgYSBjaGFuZ2UgZnJvbSBBbnQgMS41LCB3aGVyZSBzdWNoIGFuIGF0dGVtcHQgd291bGQgYmxvY2suPC9wPgorCisKKworPGg0PldpbmRvd3MgVXNlcnM8L2g0PgorPHA+VGhlIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gdGFzayBkZWxlZ2F0ZXMgdG8gPGNvZGU+UnVudGltZS5leGVjPC9jb2RlPiB3aGljaCBpbiB0dXJuCithcHBhcmVudGx5IGNhbGxzIDxhIGhyZWY9Imh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvZGxscHJvYy9iYXNlL2NyZWF0ZXByb2Nlc3MuYXNwIj4KKzxjb2RlPjo6Q3JlYXRlUHJvY2VzczwvY29kZT48L2E+LiBJdCBpcyB0aGUgbGF0dGVyIFdpbjMyIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcwordGhlIGV4YWN0IHNlbWFudGljcyBvZiB0aGUgY2FsbC4gSW4gcGFydGljdWxhciwgaWYgeW91IGRvIG5vdCBwdXQgYSBmaWxlIGV4dGVuc2lvbgorb24gdGhlIGV4ZWN1dGFibGUsIG9ubHkgIi5FWEUiIGZpbGVzIGFyZSBsb29rZWQgZm9yLCBub3QgIi5DT00iLCAiLkNNRCIgb3Igb3RoZXIgZmlsZQordHlwZXMgbGlzdGVkIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQQVRIRVhULiBUaGF0IGlzIG9ubHkgdXNlZCBieSB0aGUgc2hlbGwuCis8L3A+CisgIDxwPgorICAgIE5vdGUgdGhhdCA8ZW0+LmJhdDwvZW0+IGZpbGVzIGNhbm5vdCBpbiBnZW5lcmFsIGJ5IGV4ZWN1dGVkIGRpcmVjdGx5LgorICAgIE9uZSBub3JtYWxseSBuZWVkcyB0byBleGVjdXRlIHRoZSBjb21tYW5kIHNoZWxsIGV4ZWN1dGFibGUgPGNvZGU+Y21kPC9jb2RlPgorICAgIHVzaW5nIHRoZSA8Y29kZT4vYzwvY29kZT4gc3dpdGNoLgorICA8L3A+CisgIDxibG9ja3F1b3RlPgorPHByZT4KKyZsdDt0YXJnZXQgbmFtZT0iaGVscCImZ3Q7CisgICZsdDtleGVjIGV4ZWN1dGFibGU9ImNtZCImZ3Q7CisgICAgJmx0O2FyZyB2YWx1ZT0iL2MiLyZndDsKKyAgICAmbHQ7YXJnIHZhbHVlPSJhbnQuYmF0Ii8mZ3Q7CisgICAgJmx0O2FyZyB2YWx1ZT0iLXAiLyZndDsKKyAgJmx0Oy9leGVjJmd0OworJmx0Oy90YXJnZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxoND5DeWd3aW4gVXNlcnM8L2g0PgorPHA+VGhlIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gdGFzayB3aWxsIG5vdCB1bmRlcnN0YW5kIHBhdGhzIHN1Y2ggYXMgL2Jpbi9zaAorZm9yIHRoZSBleGVjdXRhYmxlIHBhcmFtZXRlci4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgSmF2YSBWTSBpbiB3aGljaCBBbnQgaXMKK3J1bm5pbmcgaXMgYSBzdGFuZGFyZCBXaW5kb3dzIGV4ZWN1dGFibGUgYW5kIGlzIG5vdCBhd2FyZSBvZiB0aGUgQ3lnd2luCitlbnZpcm9ubWVudCAoaS5lLiwgZG9lc24ndCBsb2FkIDxjb2RlPmN5Z3dpbjEuZGxsPC9jb2RlPikuICBUaGUgb25seQord29yay1hcm91bmQgZm9yIHRoaXMgaXMgdG8gY29tcGlsZSBhIEpWTSB1bmRlciBDeWd3aW4gKGF0IHlvdXIgb3duIHJpc2spLgorU2VlIGZvciBpbnN0YW5jZSAKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlLzYvZG9jcy9idWlsZC9SRUFETUUtYnVpbGRzLmh0bWwjY3lnd2luIj4KK3N1biBqZGsgNiBidWlsZCBpbnN0cnVjdGlvbnMgZm9yIGN5Z3dpbjwvYT4uCis8L3A+CisKKzxoND5PcGVuVk1TIFVzZXJzPC9oND4KKzxwPlRoZSBjb21tYW5kIHNwZWNpZmllZCB1c2luZyA8Y29kZT5leGVjdXRhYmxlPC9jb2RlPiBhbmQKKzxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpcyBleGVjdXRlZCBleGFjdGx5IGFzIHNwZWNpZmllZAoraW5zaWRlIGEgdGVtcG9yYXJ5IERDTCBzY3JpcHQuICBUaGlzIGhhcyBzb21lIGltcGxpY2F0aW9uczoKKzx1bD4KKzxsaT5wYXRocyBoYXZlIHRvIGJlIHdyaXR0ZW4gaW4gVk1TIHN0eWxlPC9saT4KKzxsaT5pZiB5b3VyIDxjb2RlPmV4ZWN1dGFibGU8L2NvZGU+IHBvaW50cyB0byBhIERDTCBzY3JpcHQgcmVtZW1iZXIgdG8KK3ByZWZpeCBpdCB3aXRoIGFuIDxjb2RlPkA8L2NvZGU+LXNpZ24KKyhlLmcuIDxjb2RlPmV4ZWN1dGFibGU9IkBbRk9PXUJBUi5DT00iPC9jb2RlPiksIGp1c3QgYXMgeW91IHdvdWxkIGluIGEKK0RDTCBzY3JpcHQ8L2xpPgorPC91bD4KK0ZvciA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRvIHdvcmsgaW4gYW4gZW52aXJvbm1lbnQgd2l0aCBhIEphdmEgVk0KK29sZGVyIHRoYW4gdmVyc2lvbiAxLjQuMS0yIGl0IGlzIGFsc28gPGk+cmVxdWlyZWQ8L2k+IHRoYXQgdGhlIGxvZ2ljYWwKKzxjb2RlPkpBVkEkRk9SS19TVVBQT1JUX0NIRElSPC9jb2RlPiBpcyBzZXQgdG8gPGNvZGU+VFJVRTwvY29kZT4gaW4KK3RoZSBqb2IgdGFibGUgKHNlZSB0aGUgPGk+SkRLIFJlbGVhc2UgTm90ZXM8L2k+KS48L3A+CisKKzxwPlBsZWFzZSBub3RlIHRoYXQgdGhlIEphdmEgVk0gcHJvdmlkZWQgYnkgSFAgZG9lc24ndCBmb2xsb3cgT3BlblZNUycKK2NvbnZlbnRpb25zIG9mIGV4aXQgY29kZXMuICBJZiB5b3UgcnVuIGEgSmF2YSBWTSB3aXRoIHRoaXMgdGFzaywgdGhlCit0YXNrIG1heSBmYWxzZWx5IGNsYWltIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgKG9yIHNpbGVudGx5IGlnbm9yZSBhbgorZXJyb3IpLiAgRG9uJ3QgdXNlIHRoaXMgdGFzayB0byBydW4gPGNvZGU+SkFWQS5FWEU8L2NvZGU+LCB1c2UgYQorPGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPiB0YXNrIHdpdGggdGhlIDxjb2RlPmZvcms8L2NvZGU+IGF0dHJpYnV0ZQorc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGluc3RlYWQgYXMgdGhpcyB0YXNrIHdpbGwgZm9sbG93IHRoZSBWTSdzCitpbnRlcnByZXRhdGlvbiBvZiBleGl0IGNvZGVzLjwvcD4KKworPGg0PlJlZEhhdCBTLzM5MCBVc2VyczwvaDQ+CisKKzxwPkl0IGhhcyBiZWVuIDxhCitocmVmPSJodHRwOi8vbGlzdHNlcnYudWFyay5lZHUvc2NyaXB0cy93YS5leGU/QTE9aW5kMDQwNCZMPXZtZXNhLWwjMzMiPnJlcG9ydGVkCitvbiB0aGUgVk1FU0EtTElTVFNFUlY8L2E+IHRoYXQgc2hlbGwgc2NyaXB0cyBpbnZva2VkIHZpYSB0aGUgQW50IEV4ZWMKK3Rhc2sgbXVzdCBoYXZlIHRoZWlyIGludGVycHJldGVyIHNwZWNpZmllZCwgaS5lLiwgdGhlIHNjcmlwdHMgbXVzdAorc3RhcnQgd2l0aCBzb21ldGhpbmcgbGlrZToKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorIyEvYmluL2Jhc2gKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitvciB0aGUgdGFzayB3aWxsIGZhaWwgYXMgZm9sbG93czoKKworPGJsb2NrcXVvdGU+Cis8cHJlPgorW2V4ZWNdIFdhcm5pbmc6IFVOSVhQcm9jZXNzLmZvcmtBbmRFeGVjIG5hdGl2ZSBlcnJvcjogRXhlYyBmb3JtYXQgZXJyb3IKK1tleGVjXSBSZXN1bHQ6IDI1NQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hbmQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSB3aXRoIGFsbCBjb21tYW5kIGxpbmUKKyAgICAgIGFyZ3VtZW50cy4gPGI+ZGVwcmVjYXRlZCwgdXNlIGV4ZWN1dGFibGUgYW5kIG5lc3RlZAorICAgICAgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGVsZW1lbnRzIGluc3RlYWQ8L2I+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZSB0d28uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhlY3V0YWJsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgY29tbWFuZCB0byBleGVjdXRlIHdpdGhvdXQgYW55IGNvbW1hbmQgbGluZQorICAgICAgYXJndW1lbnRzLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21tYW5kIHNob3VsZCBiZSBleGVjdXRlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5saXN0IG9mIE9wZXJhdGluZyBTeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZQorICAgICAgZXhlY3V0ZWQuIElmIHRoZSBjdXJyZW50IE9TJ3MgbmFtZSBpcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LCB0aGUgY29tbWFuZCB3aWxsCisgICAgICBiZSBleGVjdXRlZC4gVGhlIE9TJ3MgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBKYXZhIFZpcnR1YWwgbWFjaGluZSBhbmQgaXMgc2V0CisgICAgICBpbiB0aGUgJnF1b3Q7b3MubmFtZSZxdW90OyBzeXN0ZW0gcHJvcGVydHkuCisgICAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vc2ZhbWlseTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5PUyBmYW1pbHkgYXMgdXNlZCBpbiB0aGUgJmx0O29zJmd0OyBjb25kaXRpb24uCisgICAgPGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNwYXduPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRoZSBjb21tYW5kIHRvIGJlIHNwYXduZWQ8YnI+CisgICAgRGVmYXVsdCBpcyBmYWxzZS48YnI+CisgICAgSWYgeW91IHNwYXduIGEgY29tbWFuZCwgaXRzIG91dHB1dCB3aWxsIG5vdCBiZSBsb2dnZWQgYnkgYW50Ljxicj4KKyAgICBUaGUgaW5wdXQsIG91dHB1dCwgZXJyb3IsIGFuZCByZXN1bHQgcHJvcGVydHkgc2V0dGluZ3MgYXJlIG5vdCBhY3RpdmUgd2hlbiBzcGF3bmluZyBhIHByb2Nlc3MuPGJyPgorICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiBhIGZpbGUgdG8gd2hpY2ggdG8gd3JpdGUgdGhlIG91dHB1dC4gSWYgdGhlIGVycm9yIHN0cmVhbQorICAgICAgaXMgbm90IGFsc28gcmVkaXJlY3RlZCB0byBhIGZpbGUgb3IgcHJvcGVydHksIGl0IHdpbGwgYXBwZWFyIGluIHRoaXMgb3V0cHV0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIHdoaWNoIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUKKyAgICBjb21tYW5kIHNob3VsZCBiZSByZWRpcmVjdGVkLiAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxvZ0Vycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgd2hlbiB5b3Ugd2lzaCB0byBzZWUgZXJyb3Igb3V0cHV0IGluIEFudCdzCisgICAgICAgICAgICAgICAgICAgICBsb2cgYW5kIHlvdSBhcmUgcmVkaXJlY3Rpbmcgb3V0cHV0IHRvIGEgZmlsZS9wcm9wZXJ0eS4gVGhlIGVycm9yCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlL3Byb3BlcnR5LiBJZiB5b3UKKyAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0IGVycm9yIHdpdGggdGhlICZxdW90O2Vycm9yJnF1b3Q7IG9yICZxdW90O2Vycm9yUHJvcGVydHkmcXVvdDsKKyAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsIHRoaXMgd2lsbCBoYXZlIG5vIGVmZmVjdC4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hcHBlbmQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBvdXRwdXQgYW5kIGVycm9yIGZpbGVzIHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdHRlbi4KKyAgICBEZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlCisgICAgICBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIFVubGVzcyB0aGUgZXJyb3Igc3RyZWFtIGlzIHJlZGlyZWN0ZWQgdG8gYSBzZXBhcmF0ZQorICAgICAgZmlsZSBvciBzdHJlYW0sIHRoaXMgcHJvcGVydHkgd2lsbCBpbmNsdWRlIHRoZSBlcnJvciBvdXRwdXQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3Jwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUKKyAgICAgIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIGZpbGUgZnJvbSB3aGljaCB0aGUgZXhlY3V0ZWQgY29tbWFuZCdzIHN0YW5kYXJkIGlucHV0CisgICAgICAgICAgICAgICAgICAgICBpcyB0YWtlbi4gVGhpcyBhdHRyaWJ1dGUgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICBpbnB1dHN0cmluZyBhdHRyaWJ1dGUuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5wdXRzdHJpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QSBzdHJpbmcgd2hpY2ggc2VydmVzIGFzIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgY29tbWFuZC4gVGhpcyBhdHRyaWJ1dGUgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICBpbnB1dCBhdHRyaWJ1dGUuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVzdWx0cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlCisgICAgICBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIE9ubHkgb2YgaW50ZXJlc3QgaWYgZmFpbG9uZXJyb3I9ZmFsc2UuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGltZW91dDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBjb21tYW5kIGlmIGl0IGRvZXNuJ3QgZmluaXNoIHdpdGhpbiB0aGUKKyAgICAgIHNwZWNpZmllZCB0aW1lIChnaXZlbiBpbiBtaWxsaXNlY29uZHMpLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEKKyAgICAgIHJldHVybiBjb2RlIHNpZ25hbGluZyBmYWlsdXJlLiBEZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsaWZleGVjdXRpb25mYWlsczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZCBpZiB3ZSBjYW4ndCBzdGFydCB0aGUgcHJvZ3JhbS4KKyAgICAgIERlZmF1bHRzIHRvIHRydWUuIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+ICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uZXdlbnZpcm9ubWVudDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgcHJvcGFnYXRlIG9sZCBlbnZpcm9ubWVudCB3aGVuIG5ldyBlbnZpcm9ubWVudAorICAgICAgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZtbGF1bmNoZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UnVuIGNvbW1hbmQgdXNpbmcgdGhlIEphdmEgVk0ncyBleGVjdXRpb24gZmFjaWxpdGllcworICAgICAgICB3aGVyZSBhdmFpbGFibGUuIElmIHNldCB0byBmYWxzZSB0aGUgdW5kZXJseWluZyBPUydzIHNoZWxsLAorICAgICAgICBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgYW50UnVuIHNjcmlwdHMsIHdpbGwgYmUgdXNlZC4KKyAgICAgICAgVW5kZXIgc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgdGhpcyBnaXZlcyBhY2Nlc3MgdG8gZmFjaWxpdGllcworICAgICAgICBub3Qgbm9ybWFsbHkgYXZhaWxhYmxlIHRocm91Z2ggdGhlIFZNIGluY2x1ZGluZywgdW5kZXIgV2luZG93cywKKyAgICAgICAgYmVpbmcgYWJsZSB0byBleGVjdXRlIHNjcmlwdHMsIHJhdGhlciB0aGFuIHRoZWlyIGFzc29jaWF0ZWQKKyAgICAgICAgaW50ZXJwcmV0ZXIuICBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZQorICAgICAgICBleGVjdXRhYmxlIGFzIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5IHRoZQorICAgICAgICBkaXIgYXR0cmlidXRlLCBpdCBtYXkgYmVjb21lIG5lY2Vzc2FyeSB0byBzZXQgdm1sYXVuY2hlciB0bworICAgICAgICBmYWxzZSBhcyB3ZWxsLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT50cnVlPC9pPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlc29sdmVleGVjdXRhYmxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgdHJ1ZSwgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUKKyAgICAgICAgICAgICAgICAgICAgIGlzIHJlc29sdmVkIGZpcnN0bHkgYWdhaW5zdCB0aGUgcHJvamVjdCBiYXNlZGlyIGFuZAorICAgICAgICAgICAgICAgICAgICAgaWYgdGhhdCBkb2VzIG5vdCBleGlzdCwgYWdhaW5zdCB0aGUgZXhlY3V0aW9uCisgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgaWYgc3BlY2lmaWVkLiBPbiBVbml4IHN5c3RlbXMsIGlmIHlvdSBvbmx5CisgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGFsbG93IGV4ZWN1dGlvbiBvZiBjb21tYW5kcyBpbiB0aGUgdXNlcidzIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICBzZXQgdGhpcyB0byBmYWxzZS4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmFsc2U8L2k+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2VhcmNocGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGVuIHRoaXMgYXR0cmlidXRlIGlzIHRydWUsIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsCisgICAgICAgICAgICAgICAgICAgICBiZSBzZWFyY2hlZCB3aGVuIHJlc29sdmluZyB0aGUgbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBleGVjdXRhYmxlLiA8ZW0+c2luY2UgQW50IDEuNi4zPC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmFsc2U8L2k+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2V4ZWMgZGlyPSZxdW90OyR7c3JjfSZxdW90OyBleGVjdXRhYmxlPSZxdW90O2NtZC5leGUmcXVvdDsgb3M9JnF1b3Q7V2luZG93cyAyMDAwJnF1b3Q7IG91dHB1dD0mcXVvdDtkaXIudHh0JnF1b3Q7Jmd0OworICAmbHQ7YXJnIGxpbmU9JnF1b3Q7L2MgZGlyJnF1b3Q7LyZndDsKKyZsdDsvZXhlYyZndDs8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0PmFyZzwvaDQ+Cis8cD5Db21tYW5kIGxpbmUgYXJndW1lbnRzIHNob3VsZCBiZSBzcGVjaWZpZWQgYXMgbmVzdGVkCis8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gZWxlbWVudHMuIFNlZSA8YQoraHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQgbGluZSBhcmd1bWVudHM8L2E+LjwvcD4KKzxoND48YSBuYW1lPSJlbnYiPmVudjwvYT48L2g0PgorPHA+SXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUKK3N5c3RlbSBjb21tYW5kIHZpYSBuZXN0ZWQgPGNvZGU+Jmx0O2VudiZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtleTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgIDxici8+CisgICAgICA8ZW0+Tm90ZTogKFNpbmNlIEFudCAxLjcpPC9lbT4KKyAgICAgIEZvciB3aW5kb3dzLCB0aGUgbmFtZSBpcyBjYXNlLWluc2Vuc2l0aXZlLgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbGl0ZXJhbCB2YWx1ZSBmb3IgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjMiPkV4YWN0bHkgb25lIG9mIHRoZXNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZhbHVlIGZvciBhIFBBVEggbGlrZSBlbnZpcm9ubWVudAorICAgICAgdmFyaWFibGUuIFlvdSBjYW4gdXNlIDsgb3IgOiBhcyBwYXRoIHNlcGFyYXRvcnMgYW5kIEFudCB3aWxsCisgICAgICBjb252ZXJ0IGl0IHRvIHRoZSBwbGF0Zm9ybSdzIGxvY2FsIGNvbnZlbnRpb25zLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZhbHVlIGZvciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuIFdpbGwgYmUKKyAgICAgIHJlcGxhY2VkIGJ5IHRoZSBhYnNvbHV0ZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSBieSBBbnQuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8YSBuYW1lPSJyZWRpcmVjdG9yIj48aDQ+cmVkaXJlY3RvcjwvaDQ+PC9hPgorPGk+PGI+U2luY2UgQW50IDEuNi4yPC9iPjwvaT4KKzxwPkEgbmVzdGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZWRpcmVjdG9yLmh0bWwiPkkvTyBSZWRpcmVjdG9yPC9hPgorY2FuIGJlIHNwZWNpZmllZC4gIEluIGdlbmVyYWwsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWRpcmVjdG9yIGJlaGF2ZQorYXMgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcyBhdmFpbGFibGUgYXQgdGhlIHRhc2sgbGV2ZWwuICBUaGUgbW9zdAorbm90YWJsZSBwZWN1bGlhcml0eSBzdGVtcyBmcm9tIHRoZSByZXRlbnRpb24gb2YgdGhlICZsdDtleGVjJmd0OworYXR0cmlidXRlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBBbnkgZmlsZSBtYXBwaW5nIGlzIGRvbmUKK3VzaW5nIGEgPENPREU+bnVsbDwvQ09ERT4gc291cmNlZmlsZTsgdGhlcmVmb3JlIG5vdCBhbGwKKzxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCI+TWFwcGVyPC9hPiB0eXBlcyB3aWxsIHJldHVybgorcmVzdWx0cy4gIFdoZW4gbm8gcmVzdWx0cyBhcmUgcmV0dXJuZWQsIHJlZGlyZWN0aW9uIHNwZWNpZmljYXRpb25zCit3aWxsIGZhbGwgYmFjayB0byB0aGUgdGFzayBsZXZlbCBhdHRyaWJ1dGVzLiAgSW4gcHJhY3RpY2UgdGhpcyBtZWFucyB0aGF0CitkZWZhdWx0cyBjYW4gYmUgc3BlY2lmaWVkIGZvciBpbnB1dCwgb3V0cHV0LCBhbmQgZXJyb3Igb3V0cHV0IGZpbGVzLgorPC9wPgorPGgzPkVycm9ycyBhbmQgcmV0dXJuIGNvZGVzPC9oMz4KK0J5IGRlZmF1bHQgdGhlIHJldHVybiBjb2RlIG9mIGEgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiBpcyBpZ25vcmVkOyB3aGVuIHlvdSBzZXQKKzxjb2RlPmZhaWxvbmVycm9yPSJ0cnVlIjwvY29kZT4gdGhlbiBhbnkgcmV0dXJuIGNvZGUgc2lnbmFsaW5nIGZhaWx1cmUKKyhPUyBzcGVjaWZpYykgY2F1c2VzIHRoZSBidWlsZCB0byBmYWlsLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNldAorPGNvZGU+cmVzdWx0cHJvcGVydHk8L2NvZGU+IHRvIHRoZSBuYW1lIG9mIGEgcHJvcGVydHkgYW5kIGhhdmUgaXQgYXNzaWduZWQgdG8KK3RoZSByZXN1bHQgY29kZSAoYmFycmluZyBpbW11dGFiaWxpdHksIG9mIGNvdXJzZSkuCis8cD4KK0lmIHRoZSBhdHRlbXB0IHRvIHN0YXJ0IHRoZSBwcm9ncmFtIGZhaWxzIHdpdGggYW4gT1MgZGVwZW5kZW50IGVycm9yIGNvZGUsCit0aGVuIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gaGFsdHMgdGhlIGJ1aWxkIHVubGVzcyA8Y29kZT5mYWlsaWZleGVjdXRpb25mYWlsczwvY29kZT4KK2lzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4uIFlvdSBjYW4gdXNlIHRoYXQgdG8gcnVuIGEgcHJvZ3JhbSBpZiBpdCBleGlzdHMsIGJ1dAorb3RoZXJ3aXNlIGRvIG5vdGhpbmcuCis8cD4KK1doYXQgZG8gdGhvc2UgZXJyb3IgY29kZXMgbWVhbj8gV2VsbCwgdGhleSBhcmUgT1MgZGVwZW5kZW50LiBPbiBXaW5kb3dzCitib3hlcyB5b3UgaGF2ZSB0byBsb29rIGF0Cis8YSBocmVmPSJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL2RlYnVnL2Jhc2Uvc3lzdGVtX2Vycm9yX2NvZGVzX18wLTQ5OV8uYXNwIj4KK3RoZSBkb2N1bWVudGF0aW9uPC9hPjsgZXJyb3IgY29kZSAyIG1lYW5zICdubyBzdWNoIHByb2dyYW0nLCB3aGljaCB1c3VhbGx5IG1lYW5zCitpdCBpcyBub3Qgb24gdGhlIHBhdGguIEFueSB0aW1lIHlvdSBzZWUgc3VjaCBhbiBlcnJvciBmcm9tIGFueSBBbnQgdGFzaywgaXQgaXMKK3VzdWFsbHkgbm90IGFuIEFudCBidWcsIGJ1dCBzb21lIGNvbmZpZ3VyYXRpb24gcHJvYmxlbSBvbiB5b3VyIG1hY2hpbmUuCisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2V4ZWMgZXhlY3V0YWJsZT0mcXVvdDtlbWFjcyZxdW90OyZndDsKKyAgJmx0O2VudiBrZXk9JnF1b3Q7RElTUExBWSZxdW90OyB2YWx1ZT0mcXVvdDs6MS4wJnF1b3Q7LyZndDsKKyZsdDsvZXhlYyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPnN0YXJ0cyA8Y29kZT5lbWFjczwvY29kZT4gb24gZGlzcGxheSAxIG9mIHRoZSBYIFdpbmRvdyBTeXN0ZW0uPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Byb3BlcnR5IGVudmlyb25tZW50PSZxdW90O2VudiZxdW90Oy8mZ3Q7CismbHQ7ZXhlYyAuLi4gJmd0OworICAmbHQ7ZW52IGtleT0mcXVvdDtQQVRIJnF1b3Q7IHBhdGg9JnF1b3Q7JHtlbnYuUEFUSH06JHtiYXNlZGlyfS9iaW4mcXVvdDsvJmd0OworJmx0Oy9leGVjJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+YWRkcyA8Y29kZT4ke2Jhc2VkaXJ9L2JpbjwvY29kZT4gdG8gdGhlIDxjb2RlPlBBVEg8L2NvZGU+IG9mIHRoZQorc3lzdGVtIGNvbW1hbmQuPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Byb3BlcnR5IG5hbWU9ImJyb3dzZXIiIGxvY2F0aW9uPSJDOi9Qcm9ncmFtIEZpbGVzL0ludGVybmV0IEV4cGxvcmVyL2lleHBsb3JlLmV4ZSIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9ImZpbGUiIGxvY2F0aW9uPSJhbnQvZG9jcy9tYW51YWwvaW5kZXguaHRtbCIvJmd0OworCismbHQ7ZXhlYyBleGVjdXRhYmxlPSIke2Jyb3dzZXJ9IiBzcGF3bj0idHJ1ZSImZ3Q7CisgICAgJmx0O2FyZyB2YWx1ZT0iJHtmaWxlfSIvJmd0OworJmx0Oy9leGVjJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+U3RhcnRzIHRoZSA8aT4ke2Jyb3dzZXJ9PC9pPiB3aXRoIHRoZSBzcGVjaWZpZWQgPGk+JHtmaWxlfTwvaT4gYW5kIGVuZCB0aGUKK0FudCBwcm9jZXNzLiBUaGUgYnJvd3NlciB3aWxsIHJlbWFpbi48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZXhlYyBleGVjdXRhYmxlPSZxdW90O2NhdCZxdW90OyZndDsKKyAgICAmbHQ7cmVkaXJlY3RvciBvdXRwdXRwcm9wZXJ0eT0mcXVvdDtyZWRpcmVjdG9yLm91dCZxdW90OworICAgICAgICAgICAgICAgIGVycm9ycHJvcGVydHk9JnF1b3Q7cmVkaXJlY3Rvci5lcnImcXVvdDsKKyAgICAgICAgICAgICAgICBpbnB1dHN0cmluZz0mcXVvdDtibGFoIGJlZm9yZSBibGFoJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7aW5wdXRmaWx0ZXJjaGFpbiZndDsKKyAgICAgICAgICAgICZsdDtyZXBsYWNlc3RyaW5nIGZyb209JnF1b3Q7YmVmb3JlJnF1b3Q7IHRvPSZxdW90O2FmdGVyJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0Oy9pbnB1dGZpbHRlcmNoYWluJmd0OworICAgICAgICAmbHQ7b3V0cHV0bWFwcGVyIHR5cGU9JnF1b3Q7bWVyZ2UmcXVvdDsgdG89JnF1b3Q7cmVkaXJlY3Rvci5vdXQmcXVvdDsvJmd0OworICAgICAgICAmbHQ7ZXJyb3JtYXBwZXIgdHlwZT0mcXVvdDttZXJnZSZxdW90OyB0bz0mcXVvdDtyZWRpcmVjdG9yLmVyciZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9yZWRpcmVjdG9yJmd0OworJmx0Oy9leGVjJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCitTZW5kcyB0aGUgc3RyaW5nICZxdW90O2JsYWggYmVmb3JlIGJsYWgmcXVvdDsgdG8gdGhlICZxdW90O2NhdCZxdW90OyBleGVjdXRhYmxlLAordXNpbmcgYW4gPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPiZsdDtpbnB1dGZpbHRlcmNoYWluJmd0OzwvYT4KK3RvIHJlcGxhY2UgJnF1b3Q7YmVmb3JlJnF1b3Q7IHdpdGggJnF1b3Q7YWZ0ZXImcXVvdDsgb24gdGhlIHdheSBpbi4KK091dHB1dCBpcyBzZW50IHRvIHRoZSBmaWxlICZxdW90O3JlZGlyZWN0b3Iub3V0JnF1b3Q7IGFuZCBzdG9yZWQKK2luIGEgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZS4gIFNpbWlsYXJseSwgZXJyb3Igb3V0cHV0IGlzIHNlbnQgdG8KK2EgZmlsZSBhbmQgYSBwcm9wZXJ0eSwgYm90aCBuYW1lZCAmcXVvdDtyZWRpcmVjdG9yLmVyciZxdW90Oy4KKworCis8cD48Yj5Ob3RlOjwvYj4gZG8gbm90IHRyeSB0byBzcGVjaWZ5IGFyZ3VtZW50cyB1c2luZworYSBzaW1wbGUgYXJnLWVsZW1lbnQgYW5kIHNlcGFyYXRlIHRoZW0gYnkgc3BhY2VzLiBUaGlzIHJlc3VsdHMgaW4KK29ubHkgYSBzaW5nbGUgYXJndW1lbnQgY29udGFpbmluZyB0aGUgZW50aXJlIHN0cmluZy48L3A+Cis8cD4KKzxiPlRpbWVvdXRzOiA8L2I+IElmIGEgdGltZW91dCBpcyBzcGVjaWZpZWQsIHdoZW4gaXQgaXMgcmVhY2hlZCB0aGUKK3N1YiBwcm9jZXNzIGlzIGtpbGxlZCBhbmQgYSBtZXNzYWdlIHByaW50ZWQgdG8gdGhlIGxvZy4gVGhlIHJldHVybgordmFsdWUgb2YgdGhlIGV4ZWN1dGlvbiB3aWxsIGJlICItMSIsIHdoaWNoIHdpbGwgaGFsdCB0aGUgYnVpbGQgaWYKKzx0dD5mYWlsb25lcnJvcj10cnVlPC90dD4sIGJ1dCBiZSBpZ25vcmVkIG90aGVyd2lzZS4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2ZhaWwuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9mYWlsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViMTc0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9mYWlsLmh0bWwKQEAgLTAsMCArMSwxNDMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+RmFpbCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJmYWlsIj5GYWlsPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+RXhpdHMgdGhlIGN1cnJlbnQgYnVpbGQgKGp1c3QgdGhyb3dpbmcgYSBCdWlsZEV4Y2VwdGlvbiksIG9wdGlvbmFsbHkgcHJpbnRpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Cis8cD5UaGUgbWVzc2FnZSBvZiB0aGUgRXhjZXB0aW9uIGNhbiBiZSBzZXQgdmlhIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZQorb3IgY2hhcmFjdGVyIGRhdGEgbmVzdGVkIGludG8gdGhlIGVsZW1lbnQuPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tZXNzYWdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgbWVzc2FnZSBnaXZpbmcgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB3aHkgdGhlIGJ1aWxkIGV4aXRlZDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk9ubHkgZmFpbCBpZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGV4aXN0cworICAgICAgaW4gdGhlIGN1cnJlbnQgcHJvamVjdDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IGZhaWwgaWYgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBkb2Vzbid0CisgICAgICBleGlzdCBpbiB0aGUgY3VycmVudCBwcm9qZWN0PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3RhdHVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkV4aXQgdXNpbmcgdGhlIHNwZWNpZmllZCBzdGF0dXMgY29kZTsKKyAgICAgIGFzc3VtaW5nIHRoZSBnZW5lcmF0ZWQgRXhjZXB0aW9uIGlzIG5vdCBjYXVnaHQsIHRoZQorICAgICAgSlZNIHdpbGwgZXhpdCB3aXRoIHRoaXMgc3RhdHVzLiA8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxwPkFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSA8aT5pZjwvaT4vPGk+dW5sZXNzPC9pPiBhdHRyaWJ1dGVzLAorICBjb25kaXRpb25hbCBmYWlsdXJlIGNhbiBiZSBhY2hpZXZlZCB1c2luZyBhIHNpbmdsZSBuZXN0ZWQKKyAgPGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQsIHdoaWNoIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lCisgIGNvcmUgb3IgY3VzdG9tIGNvbmRpdGlvbi4gIEZvciBpbmZvcm1hdGlvbiBhYm91dCBjb25kaXRpb25zLCBzZWUKKyAgPGEgaHJlZj0iY29uZGl0aW9ucy5odG1sIj5oZXJlPC9hPi48YnI+PGI+U2luY2UgQW50IDEuNi4yPC9iPgorPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorCis8cHJlPiAgJmx0O2ZhaWwvJmd0OzwvcHJlPgorPHA+d2lsbCBleGl0IHRoZSBjdXJyZW50IGJ1aWxkIHdpdGggbm8gZnVydGhlciBpbmZvcm1hdGlvbiBnaXZlbi48L3A+Cis8cHJlPgorQlVJTEQgRkFJTEVECisKK2J1aWxkLnhtbDo0OiBObyBtZXNzYWdlCis8L3ByZT4KKworPHByZT4gICZsdDtmYWlsIG1lc3NhZ2U9JnF1b3Q7U29tZXRoaW5nIHdyb25nIGhlcmUuJnF1b3Q7LyZndDs8L3ByZT4KKzxwPndpbGwgZXhpdCB0aGUgY3VycmVudCBidWlsZCBhbmQgcHJpbnQgc29tZXRoaW5nCisgIGxpa2UgdGhlIGZvbGxvd2luZyB0byB3aGVyZXZlciB5b3VyIG91dHB1dCBnb2VzOgorPC9wPgorPHByZT4KK0JVSUxEIEZBSUxFRAorCitidWlsZC54bWw6NDogU29tZXRoaW5nIHdyb25nIGhlcmUuCis8L3ByZT4KKworPHByZT4gICZsdDtmYWlsJmd0O1NvbWV0aGluZyB3cm9uZyBoZXJlLiZsdDsvZmFpbCZndDs8L3ByZT4KKzxwPndpbGwgZ2l2ZSB0aGUgc2FtZSByZXN1bHQgYXMgYWJvdmUuPC9wPgorCis8cHJlPiAgJmx0O2ZhaWwgdW5sZXNzPSZxdW90O3RoaXNkb2Vzbm90ZXhpc3QmcXVvdDsvJmd0OzwvcHJlPgorPHA+d2lsbCBleGl0IHRoZSBjdXJyZW50IGJ1aWxkIGFuZCBwcmludCBzb21ldGhpbmcKKyAgbGlrZSB0aGUgZm9sbG93aW5nIHRvIHdoZXJldmVyIHlvdXIgb3V0cHV0IGdvZXM6Cis8L3A+Cis8cHJlPgorQlVJTEQgRkFJTEVECisKK2J1aWxkLnhtbDoyOiB1bmxlc3M9dGhpc2RvZXNub3RleGlzdAorPC9wcmU+CisKK1VzaW5nIGEgY29uZGl0aW9uIHRvIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0OgorCis8cHJlPgorICAmbHQ7ZmFpbCZndDsKKyAgICAgJmx0O2NvbmRpdGlvbiZndDsKKyAgICAgICAmbHQ7bm90Jmd0OworICAgICAgICAgJmx0O2lzc2V0IHByb3BlcnR5PSZxdW90O3RoaXNkb2Vzbm90ZXhpc3QmcXVvdDsvJmd0OworICAgICAgICZsdDsvbm90Jmd0OworICAgICAmbHQ7L2NvbmRpdGlvbiZndDsKKyAgICZsdDsvZmFpbCZndDsKKzwvcHJlPgorCis8cD5PdXRwdXQ6PC9wPgorPHByZT4KK0JVSUxEIEZBSUxFRAorCitidWlsZC54bWw6MjogY29uZGl0aW9uIHNhdGlzZmllZAorPC9wcmU+CisKKzxwcmU+CismbHQ7ZmFpbCBtZXNzYWdlPSZxdW90O0ZpbGVzIGFyZSBtaXNzaW5nLiZxdW90OyZndDsKKyAgICAmbHQ7Y29uZGl0aW9uJmd0OworICAgICAgICAmbHQ7bm90Jmd0OworICAgICAgICAgICAgJmx0O3Jlc291cmNlY291bnQgY291bnQ9JnF1b3Q7MiZxdW90OyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBpZD0mcXVvdDtmcyZxdW90OyBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDtvbmUudHh0LHR3by50eHQmcXVvdDsvJmd0OworICAgICAgICAgICAgJmx0Oy9yZXNvdXJjZWNvdW50Jmd0OworICAgICAgICAmbHQ7L25vdCZndDsKKyAgICAmbHQ7L2NvbmRpdGlvbiZndDsKKyZsdDsvZmFpbCZndDsKKzwvcHJlPgorPHA+V2lsbCBjaGVjayB0aGF0IGJvdGggZmlsZXMgPGk+b25lLnR4dDwvaT4gYW5kIDxpPnR3by50eHQ8L2k+IGFyZSBwcmVzZW50IG90aGVyd2lzZSB0aGUgYnVpbGQKK3dpbGwgZmFpbC48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2ZpbHRlci5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2ZpbHRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YmE4OGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvZmlsdGVyLmh0bWwKQEAgLTAsMCArMSw3OSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5GaWx0ZXIgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iZmlsdGVyIj5GaWx0ZXI8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5TZXRzIGEgdG9rZW4gZmlsdGVyIGZvciB0aGlzIHByb2plY3Qgb3IgcmVhZCBtdWx0aXBsZSB0b2tlbiBmaWx0ZXIgZnJvbQorYW4gaW5wdXQgZmlsZSBhbmQgc2V0cyB0aGVzZSBhcyBmaWx0ZXJzLgorVG9rZW4gZmlsdGVycyBhcmUgdXNlZCBieSBhbGwgdGFza3MgdGhhdCBwZXJmb3JtIGZpbGUgY29weWluZyBvcGVyYXRpb25zCit0aHJvdWdoIHRoZSBQcm9qZWN0IGNvbW1vZGl0eSBtZXRob2RzLiBTZWUgdGhlIHdhcm5pbmcKKzxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjZmlsdGVycyI+PGVtPmhlcmU8L2VtPjwvYT4gYmVmb3JlIHVzaW5nLjwvcD4KKzxwPk5vdGUgMTogdGhlIHRva2VuIHN0cmluZyBtdXN0IG5vdCBjb250YWluIHRoZSBzZXBhcmF0b3JzIGNoYXJzIChAKS48YnI+CitOb3RlIDI6IEVpdGhlciB0b2tlbiBhbmQgdmFsdWUgYXR0cmlidXRlcyBtdXN0IGJlIHByb3ZpZGVkLCBvciBvbmx5IHRoZQorZmlsdGVyc2ZpbGUgYXR0cmlidXRlLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9rZW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHRva2VuIHN0cmluZyB3aXRob3V0IEA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzKjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBzdHJpbmcgdGhhdCBzaG91bGQgYmUgcHV0IHRvIHJlcGxhY2UgdGhlIHRva2VuIHdoZW4gdGhlIAorICAgICAgZmlsZSBpcyBjb3BpZWQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzKjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbHRlcnNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIGZyb20gd2hpY2ggdGhlIGZpbHRlcnMgbXVzdCBiZSByZWFkLiBUaGlzIGZpbGUgbXVzdCBiZSBhIGZvcm1hdHRlZCBhcyBhIHByb3BlcnR5IGZpbGUuIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMqPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD4qIHNlZSBub3RlcyAxIGFuZCAyIGFib3ZlIHBhcmFtZXRlcnMgdGFibGUuPC9wPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7ZmlsdGVyIHRva2VuPSZxdW90O3llYXImcXVvdDsgdmFsdWU9JnF1b3Q7MjAwMCZxdW90Oy8mZ3Q7CisgICZsdDtjb3B5IHRvZGlyPSZxdW90OyR7ZGVzdC5kaXJ9JnF1b3Q7IGZpbHRlcmluZz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3NyYy5kaXJ9JnF1b3Q7LyZndDsKKyAgJmx0Oy9jb3B5Jmd0OzwvcHJlPiAKKzxwPndpbGwgY29weSByZWN1cnNpdmVseSBhbGwgdGhlIGZpbGVzIGZyb20gdGhlIDxpPnNyYy5kaXI8L2k+IGRpcmVjdG9yeSBpbnRvCit0aGUgPGk+ZGVzdC5kaXI8L2k+IGRpcmVjdG9yeSByZXBsYWNpbmcgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nIDxpPkB5ZWFyQDwvaT4KK3dpdGggPGk+MjAwMC48L2k+PC9wPgorPHByZT4gICZsdDtmaWx0ZXIgZmlsdGVyc2ZpbGU9JnF1b3Q7ZGVwbG95X2Vudi5wcm9wZXJ0aWVzJnF1b3Q7LyZndDs8L3ByZT4KK3dpbGwgcmVhZCBhbGwgcHJvcGVydHkgZW50cmllcyBmcm9tIHRoZSA8aT5kZXBsb3lfZW52LnByb3BlcnRpZXM8L2k+IGZpbGUKK2FuZCBzZXQgdGhlc2UgYXMgZmlsdGVycy4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2ZpeGNybGYuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9maXhjcmxmLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmMTZmZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9maXhjcmxmLmh0bWwKQEAgLTAsMCArMSwzMjcgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Rml4Q1JMRiBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJmaXhjcmxmIj5GaXhDUkxGPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorICA8cD4KKyAgICBBZGp1c3RzIGEgdGV4dCBmaWxlIHRvIGxvY2FsIGNvbnZlbnRpb25zLgorICA8L3A+CisKKyAgPHA+CisgICAgVGhlIHNldCBvZiBmaWxlcyB0byBiZSBhZGp1c3RlZCBjYW4gYmUgcmVmaW5lZCB3aXRoIHRoZQorICAgIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LAorICAgIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYW5kIDxpPmRlZmF1bHRleGNsdWRlczwvaT4KKyAgICBhdHRyaWJ1dGVzLiBQYXR0ZXJucyBwcm92aWRlZCB0aHJvdWdoIHRoZSA8aT5pbmNsdWRlczwvaT4gb3IKKyAgICA8aT5pbmNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZXMgc3BlY2lmeSBmaWxlcyB0byBiZQorICAgIGluY2x1ZGVkLiBQYXR0ZXJucyBwcm92aWRlZCB0aHJvdWdoIHRoZSA8aT5leGNsdWRlPC9pPiBvcgorICAgIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIHNwZWNpZnkgZmlsZXMgdG8gYmUKKyAgICBleGNsdWRlZC4gQWRkaXRpb25hbGx5LCBkZWZhdWx0IGV4Y2x1c2lvbnMgY2FuIGJlIHNwZWNpZmllZCB3aXRoCisgICAgdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLiBTZWUgdGhlIHNlY3Rpb24gb24gPGEKKyAgICBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeS1iYXNlZAorICAgIHRhc2tzPC9hPiwgZm9yIGRldGFpbHMgb2YgZmlsZSBpbmNsdXNpb24vZXhjbHVzaW9uIHBhdHRlcm5zCisgICAgYW5kIHRoZWlyIHVzYWdlLgorICA8L3A+CisKKyAgPHA+CisgICAgVGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0CisgICAgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCisgICAgc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgorICAgICg8Y29kZT5kaXI8L2NvZGU+IGJlY29tZXMgPGNvZGU+c3JjZGlyPC9jb2RlPikgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCisgICAgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKKyAgICA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLgorICA8L3A+CisKKyAgPHA+CisgICAgVGhlIG91dHB1dCBmaWxlIGlzIG9ubHkgd3JpdHRlbiBpZiBpdCBpcyBhIG5ldyBmaWxlLCBvciBpZiBpdAorICAgIGRpZmZlcnMgZnJvbSB0aGUgZXhpc3RpbmcgZmlsZS4gIFRoaXMgcHJldmVudHMgc3B1cmlvdXMKKyAgICByZWJ1aWxkcyBiYXNlZCBvbiB1bmNoYW5nZWQgZmlsZXMgd2hpY2ggaGF2ZSBiZWVuIHJlZ2VuZXJhdGVkCisgICAgYnkgdGhpcyB0YXNrLgorICA8L3A+CisKKyAgPHA+CisgICAgU2luY2UgPGI+QW50IDEuNzwvYj4sIHRoaXMgdGFzayBjYW4gYmUgdXNlZCBpbiBhCisgICAgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPmZpbHRlcmNoYWluPC9hPi4KKyAgPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiBjb2xzcGFuPSIyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIj48Yj5BcyBUYXNrPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIj48Yj5BcyBGaWx0ZXI8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjRGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXJlIHRvIGZpbmQgdGhlIGZpbGVzIHRvIGJlIGZpeGVkIHVwLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5PbmUgb2YgdGhlc2U8L3RkPgorICAgIDx0ZCBiZ2NvbG9yPSIjQ0NDQ0NDIj4mbmJzcDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYSBzaW5nbGUgZmlsZSB0byBmaXguIDxiPlNpbmNlIEFudCAxLjc8L2I+PC90ZD4KKyAgICA8dGQgYmdjb2xvcj0iI0NDQ0NDQyI+Jm5ic3A7PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdERpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGVyZSB0byBwbGFjZSB0aGUgY29ycmVjdGVkIGZpbGVzLiAgRGVmYXVsdHMgdG8KKyAgICAgIHNyY0RpciAocmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBmaWxlKS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCBiZ2NvbG9yPSIjQ0NDQ0NDIj4mbmJzcDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCisgICAgICBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgYmdjb2xvcj0iI0NDQ0NDQyI+Jm5ic3A7PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPiZuYnNwOzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgYmdjb2xvcj0iI0NDQ0NDQyI+Jm5ic3A7PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPiZuYnNwOzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdAorICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPiZuYnNwOzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZXMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGVuY29kaW5nLjwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPiZuYnNwOzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dGVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiB3cml0aW5nIHRoZSBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgIDxiPlNpbmNlIEFudCAxLjc8L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZW5jb2RpbmcgYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPiZuYnNwOzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByZXNlcnZlbGFzdG1vZGlmaWVkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxhc3QgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgIGRhdGUgb2Ygc291cmNlIGZpbGVzLiA8Yj5TaW5jZSBBbnQgMS42LjM8L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHQgaXMgPGk+ZmFsc2U8L2k+PC90ZD4KKyAgICA8dGQgYmdjb2xvcj0iI0NDQ0NDQyI+Jm5ic3A7PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW9sPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgU3BlY2lmaWVzIGhvdyBlbmQtb2YtbGluZSAoRU9MKSBjaGFyYWN0ZXJzIGFyZSB0byBiZQorICAgICAgaGFuZGxlZC4gIFRoZSBFT0wgY2hhcmFjdGVycyBhcmUgQ1IsIExGIGFuZCB0aGUgcGFpciBDUkxGLgorICAgICAgVmFsaWQgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IGFyZToKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPmFzaXM6IGxlYXZlIEVPTCBjaGFyYWN0ZXJzIGFsb25lPC9saT4KKyAgICAgICAgPGxpPmNyOiBjb252ZXJ0IGFsbCBFT0xzIHRvIGEgc2luZ2xlIENSPC9saT4KKyAgICAgICAgPGxpPmxmOiBjb252ZXJ0IGFsbCBFT0xzIHRvIGEgc2luZ2xlIExGPC9saT4KKyAgICAgICAgPGxpPmNybGY6IGNvbnZlcnQgYWxsIEVPTHMgdG8gdGhlIHBhaXIgQ1JMRjwvbGk+CisgICAgICAgIDxsaT5tYWM6IGNvbnZlcnQgYWxsIEVPTHMgdG8gYSBzaW5nbGUgQ1I8L2xpPgorICAgICAgICA8bGk+dW5peDogY29udmVydCBhbGwgRU9McyB0byBhIHNpbmdsZSBMRjwvbGk+CisgICAgICAgIDxsaT5kb3M6IGNvbnZlcnQgYWxsIEVPTHMgdG8gdGhlIHBhaXIgQ1JMRjwvbGk+CisgICAgICA8L3VsPgorICAgICAgRGVmYXVsdCBpcyBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gb24gd2hpY2ggeW91IGFyZSBydW5uaW5nIHRoaXMgdGFzay4KKyAgICAgIEZvciBVbml4IHBsYXRmb3JtcyAoaW5jbHVkaW5nIE1hYyBPUyBYKSwgdGhlIGRlZmF1bHQgaXMgJnF1b3Q7bGYmcXVvdDsuCisgICAgICBGb3IgRE9TLWJhc2VkIHN5c3RlbXMgKGluY2x1ZGluZyBXaW5kb3dzKSwgdGhlIGRlZmF1bHQgaXMKKyAgICAgICZxdW90O2NybGYmcXVvdDsuCisgICAgICBGb3IgTWFjIGVudmlyb25tZW50cyBvdGhlciB0aGFuIE9TIFgsIHRoZSBkZWZhdWx0IGlzICZxdW90O2NyJnF1b3Q7LgorICAgICAgPHA+CisgICAgICAgIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIHNwZWNpZnlpbmcgRU9MLiAgVGhlCisgICAgICAgICZxdW90OzxpPjxiPmNyPC9iPjwvaT4mcXVvdDsgYXR0cmlidXRlIChzZWUgYmVsb3cpIGlzCisgICAgICAgIG5vdyBkZXByZWNhdGVkLgorICAgICAgPC9wPgorICAgICAgPHA+CisgICAgICAgIDxpPk4uQi48L2k+OiBPbmUgc3BlY2lhbCBjYXNlIGlzIHJlY29nbml6ZWQuIFRoZSB0aHJlZQorICAgICAgICBjaGFyYWN0ZXJzIENSLUNSLUxGIGFyZSByZWdhcmRlZCBhcyBhIHNpbmdsZSBFT0wuCisgICAgICAgIFVubGVzcyB0aGlzIHByb3BlcnR5IGlzIHNwZWNpZmllZCBhcyAmcXVvdDthc2lzJnF1b3Q7LAorICAgICAgICB0aGlzIHNlcXVlbmNlIHdpbGwgYmUgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCBFT0wKKyAgICAgICAgdHlwZS4KKyAgICAgIDwvcD4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMiI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIDxpPjxiPkRlcHJlY2F0ZWQuPC9iPjwvaT4gU3BlY2lmaWVzIGhvdyBDUiBjaGFyYWN0ZXJzIGFyZQorICAgICAgdG8gYmUgaGFuZGxlZCBhdCBlbmQtb2YtbGluZSAoRU9MKS4gIFZhbGlkIHZhbHVlcyBmb3IgdGhpcworICAgICAgcHJvcGVydHkgYXJlOgorICAgICAgPHVsPgorICAgICAgICA8bGk+YXNpczogbGVhdmUgRU9MIGNoYXJhY3RlcnMgYWxvbmUuPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIGFkZDogYWRkIGEgQ1IgYmVmb3JlIGFueSBzaW5nbGUgTEYgY2hhcmFjdGVycy4gVGhlCisgICAgICAgICAgaW50ZW50IGlzIHRvIGNvbnZlcnQgYWxsIEVPTHMgdG8gdGhlIHBhaXIgQ1JMRi4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIHJlbW92ZTogcmVtb3ZlIGFsbCBDUnMgZnJvbSB0aGUgZmlsZS4gIFRoZSBpbnRlbnQgaXMKKyAgICAgICAgICB0byBjb252ZXJ0IGFsbCBFT0xzIHRvIGEgc2luZ2xlIExGLgorICAgICAgICA8L2xpPgorICAgICAgPC91bD4KKyAgICAgIERlZmF1bHQgaXMgYmFzZWQgb24gdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHlvdSBhcmUgcnVubmluZworICAgICAgdGhpcyB0YXNrLiAgRm9yIFVuaXggcGxhdGZvcm1zLCB0aGUgZGVmYXVsdCBpcyAmcXVvdDtyZW1vdmUmcXVvdDsuCisgICAgICBGb3IgRE9TIGJhc2VkIHN5c3RlbXMgKGluY2x1ZGluZyBXaW5kb3dzKSwgdGhlIGRlZmF1bHQgaXMKKyAgICAgICZxdW90O2FkZCZxdW90Oy4KKyAgICAgIDxwPgorICAgICAgICA8aT5OLkIuPC9pPjogT25lIHNwZWNpYWwgY2FzZSBpcyByZWNvZ25pemVkLiBUaGUgdGhyZWUKKyAgICAgICAgY2hhcmFjdGVycyBDUi1DUi1MRiBhcmUgcmVnYXJkZWQgYXMgYSBzaW5nbGUgRU9MLgorICAgICAgICBVbmxlc3MgdGhpcyBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQgYXMgJnF1b3Q7YXNpcyZxdW90OywKKyAgICAgICAgdGhpcyBzZXF1ZW5jZSB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgRU9MCisgICAgICAgIHR5cGUuCisgICAgICA8L3A+CisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+amF2YWZpbGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgVXNlZCBvbmx5IGluIGFzc29jaWF0aW9uIHdpdGggdGhlCisgICAgICAmcXVvdDs8aT48Yj50YWI8L2I+PC9pPiZxdW90OyBhdHRyaWJ1dGUgKHNlZSBiZWxvdyksIHRoaXMKKyAgICAgIGJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlc2V0IGlzIGEgc2V0CisgICAgICBvZiBqYXZhIHNvdXJjZSBmaWxlcworICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHRzIHRvCisgICAgICAmcXVvdDtubyZxdW90Oy4gIFNlZSBub3RlcyBpbiBzZWN0aW9uIG9uICZxdW90O3RhYiZxdW90Oy4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMiI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50YWI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIGhvdyB0YWIgY2hhcmFjdGVycyBhcmUgdG8gYmUgaGFuZGxlZC4gIFZhbGlkCisgICAgICB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgYXJlOgorICAgICAgPHVsPgorICAgICAgPGxpPmFkZDogY29udmVydCBzZXF1ZW5jZXMgb2Ygc3BhY2VzIHdoaWNoIHNwYW4gYSB0YWIgc3RvcCB0byB0YWJzPC9saT4KKyAgICAgIDxsaT5hc2lzOiBsZWF2ZSB0YWIgYW5kIHNwYWNlIGNoYXJhY3RlcnMgYWxvbmU8L2xpPgorICAgICAgPGxpPnJlbW92ZTogY29udmVydCB0YWJzIHRvIHNwYWNlczwvbGk+CisgICAgICA8L3VsPgorICAgICAgRGVmYXVsdCBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgJnF1b3Q7YXNpcyZxdW90Oy4KKyAgICAgIDxwPgorICAgICAgICA8aT5OLkIuPC9pPjogV2hlbiB0aGUgYXR0cmlidXRlCisgICAgICAgICZxdW90OzxpPjxiPmphdmFmaWxlczwvYj48L2k+JnF1b3Q7IChzZWUgYWJvdmUpIGlzCisgICAgICAgICZxdW90O3RydWUmcXVvdDssIGxpdGVyYWwgVEFCIGNoYXJhY3RlcnMgb2NjdXJyaW5nCisgICAgICAgIHdpdGhpbiBKYXZhIHN0cmluZyBvciBjaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSBuZXZlcgorICAgICAgICBtb2RpZmllZC4gIFRoaXMgZnVuY3Rpb25hbGl0eSBhbHNvIHJlcXVpcmVzIHRoZQorICAgICAgICByZWNvZ25pdGlvbiBvZiBKYXZhLXN0eWxlIGNvbW1lbnRzLgorICAgICAgPC9wPgorICAgICAgPHA+CisgIAk8aT5OLkIuPC9pPjogVGhlcmUgaXMgYW4gaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gdGhpcworICAJYW5kIHRoZSBwcmV2aW91cyB2ZXJzaW9uIGluIHRoZSBoYW5kbGluZyBvZiB3aGl0ZQorICAJc3BhY2UgYXQgdGhlIGVuZCBvZiBsaW5lcy4gIFRoaXMgdmVyc2lvbiBkb2VzCisgIAk8aT48Yj5ub3Q8L2I+PC9pPiByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBvbiBsaW5lcy4KKyAgICAgIDwvcD4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMiI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50YWJsZW5ndGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VEFCIGNoYXJhY3RlciBpbnRlcnZhbC4gVmFsaWQgdmFsdWVzIGFyZSBiZXR3ZWVuCisgICAgICAyIGFuZCA4MCBpbmNsdXNpdmUuICBUaGUgZGVmYXVsdCBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgOC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMiI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lb2Y8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIGhvdyBET1MgZW5kIG9mIGZpbGUgKGNvbnRyb2wtWikgY2hhcmFjdGVycyBhcmUKKyAgICAgIHRvIGJlIGhhbmRsZWQuICBWYWxpZCB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgYXJlOgorICAgICAgPHVsPgorICAgICAgPGxpPmFkZDogZW5zdXJlIHRoYXQgdGhlcmUgaXMgYW4gRU9GIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlPC9saT4KKyAgICAgIDxsaT5hc2lzOiBsZWF2ZSBFT0YgY2hhcmFjdGVycyBhbG9uZTwvbGk+CisgICAgICA8bGk+cmVtb3ZlOiByZW1vdmUgYW55IEVPRiBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZDwvbGk+CisgICAgICA8L3VsPgorICAgICAgRGVmYXVsdCBpcyBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gb24gd2hpY2ggeW91IGFyZSBydW5uaW5nIHRoaXMgdGFzay4KKyAgICAgIEZvciBVbml4IHBsYXRmb3JtcywgdGhlIGRlZmF1bHQgaXMgcmVtb3ZlLiAgRm9yIERPUyBiYXNlZCBzeXN0ZW1zCisgICAgICAoaW5jbHVkaW5nIFdpbmRvd3MpLCB0aGUgZGVmYXVsdCBpcyBhc2lzLgorICAgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zml4bGFzdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGFkZCBhIG1pc3NpbmcgRU9MIHRvIHRoZSBsYXN0IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgIG9mIGEgcHJvY2Vzc2VkIGZpbGUuIDxiPlNpbmNlIEFudCAxLjYuMTwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIyIj5ObzsgZGVmYXVsdCBpcyA8aT50cnVlPC9pPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+Jmx0O2ZpeGNybGYgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLnNoJnF1b3Q7CisgICAgICAgICBlb2w9JnF1b3Q7bGYmcXVvdDsgZW9mPSZxdW90O3JlbW92ZSZxdW90OyAvJmd0OzwvcHJlPgorPHA+UmVwbGFjZXMgRU9McyB3aXRoIExGIGNoYXJhY3RlcnMgYW5kIHJlbW92ZXMgZW9mIGNoYXJhY3RlcnMgZnJvbQorICB0aGUgc2hlbGwgc2NyaXB0cy4gIFRhYnMgYW5kIHNwYWNlcyBhcmUgbGVmdCBhcyBpcy48L3A+Cis8cHJlPiZsdDtmaXhjcmxmIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICAgIGluY2x1ZGVzPSZxdW90OyoqLyouYmF0JnF1b3Q7IGVvbD0mcXVvdDtjcmxmJnF1b3Q7IC8mZ3Q7PC9wcmU+Cis8cD5SZXBsYWNlcyBhbGwgRU9McyB3aXRoIGNyLWxmIHBhaXJzIGluIHRoZSBiYXRjaCBmaWxlcy4KKyAgVGFicyBhbmQgc3BhY2VzIGFyZSBsZWZ0IGFzIGlzLgorICBFT0YgY2hhcmFjdGVycyBhcmUgbGVmdCBhbG9uZSBpZiBydW4gb24KKyAgRE9TIHN5c3RlbXMsIGFuZCBhcmUgcmVtb3ZlZCBpZiBydW4gb24gVW5peCBzeXN0ZW1zLjwvcD4KKzxwcmU+Jmx0O2ZpeGNybGYgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovTWFrZWZpbGUmcXVvdDsgdGFiPSZxdW90O2FkZCZxdW90OyAvJmd0OzwvcHJlPgorPHA+U2V0cyBFT0xzIGFjY29yZGluZyB0byBsb2NhbCBPUyBjb252ZW50aW9ucywgYW5kCisgIGNvbnZlcnRzIHNlcXVlbmNlcyBvZiBzcGFjZXMgYW5kIHRhYnMgdG8gdGhlIG1pbmltYWwgc2V0IG9mIHNwYWNlcyBhbmQKKyAgdGFicyB3aGljaCB3aWxsIG1haW50YWluIHNwYWNpbmcgd2l0aGluIHRoZSBsaW5lLiAgVGFicyBhcmUKKyAgc2V0IGF0IDggY2hhcmFjdGVyIGludGVydmFscy4gIEVPRiBjaGFyYWN0ZXJzIGFyZSBsZWZ0IGFsb25lIGlmCisgIHJ1biBvbiBET1Mgc3lzdGVtcywgYW5kIGFyZSByZW1vdmVkIGlmIHJ1biBvbiBVbml4IHN5c3RlbXMuCisgIE1hbnkgdmVyc2lvbnMgb2YgbWFrZSByZXF1aXJlIHRhYnMgcHJpb3IgdG8gY29tbWFuZHMuPC9wPgorICA8cHJlPiZsdDtmaXhjcmxmIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7CisgICAgICAgICB0YWI9JnF1b3Q7cmVtb3ZlJnF1b3Q7IHRhYmxlbmd0aD0mcXVvdDszJnF1b3Q7CisgICAgICAgICBlb2w9JnF1b3Q7bGYmcXVvdDsgamF2YWZpbGVzPSZxdW90O3llcyZxdW90OyAvJmd0OzwvcHJlPgorPHA+CisgIENvbnZlcnRzIGFsbCBFT0xzIGluIHRoZSBpbmNsdWRlZCBqYXZhIHNvdXJjZSBmaWxlcyB0byBhCisgIHNpbmdsZSBMRi4gIFJlcGxhY2UgYWxsIFRBQiBjaGFyYWN0ZXJzIGV4Y2VwdCB0aG9zZSBpbiBzdHJpbmcKKyAgb3IgY2hhcmFjdGVyIGNvbnN0YW50cyB3aXRoIHNwYWNlcywgYXNzdW1pbmcgYSB0YWIgd2lkdGggb2YgMy4KKyAgSWYgcnVuIG9uIGEgdW5peCBzeXN0ZW0sIGFueSBDVFJMLVogRU9GIGNoYXJhY3RlcnMgYXQgdGhlIGVuZAorICBvZiB0aGUgZmlsZSBhcmUgcmVtb3ZlZC4gIE9uIERPUy9XaW5kb3dzLCBhbnkgc3VjaCBFT0YKKyAgY2hhcmFjdGVycyB3aWxsIGJlIGxlZnQgdW50b3VjaGVkLgorPC9wPgorPHByZT4mbHQ7Zml4Y3JsZiBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7CisgICAgICAgICBpbmNsdWRlcz0mcXVvdDsqKi9SRUFETUUqJnF1b3Q7IHRhYj0mcXVvdDtyZW1vdmUmcXVvdDsgLyZndDs8L3ByZT4KKzxwPlNldHMgRU9McyBhY2NvcmRpbmcgdG8gbG9jYWwgT1MgY29udmVudGlvbnMsIGFuZAorICBjb252ZXJ0cyBhbGwgdGFicyB0byBzcGFjZXMsIGFzc3VtaW5nIGEgdGFiIHdpZHRoIG9mIDguCisgIEVPRiBjaGFyYWN0ZXJzIGFyZSBsZWZ0IGFsb25lIGlmIHJ1biBvbgorICBET1Mgc3lzdGVtcywgYW5kIGFyZSByZW1vdmVkIGlmIHJ1biBvbiBVbml4IHN5c3RlbXMuCisgIFlvdSBuZXZlciBrbm93IHdoYXQgZWRpdG9yIGEgdXNlciB3aWxsIHVzZSB0byBicm93c2UgUkVBRE1Fcy48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2dlbmtleS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2dlbmtleS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTU5YzIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvZ2Vua2V5Lmh0bWwKQEAgLTAsMCArMSwxMjUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+R2VuS2V5IFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImdlbmtleSI+R2VuS2V5PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+R2VuZXJhdGVzIGEga2V5IGluIGEga2V5c3RvcmUuIDwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YWxpYXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGFsaWFzIHRvIGFkZCB1bmRlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3RvcmVwYXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkIGZvciBrZXlzdG9yZSBpbnRlZ3JpdHkuIE11c3QKKwliZSBhdCBsZWFzdCA2IGNoYXJhY3RlcnMgbG9uZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5c3RvcmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5c3RvcmUgbG9jYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdG9yZXR5cGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5c3RvcmUgdHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtleXBhc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQgZm9yIHByaXZhdGUga2V5IChpZiBkaWZmZXJlbnQpPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2lnYWxnPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBhbGdvcml0aG0gdG8gdXNlIGluIHNpZ25pbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5rZXlhbGc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIG5hbWUtdmFsdWUgcGFpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+KHRydWUgfCBmYWxzZSkgdmVyYm9zZSBvdXRwdXQgd2hlbiBzaWduaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZG5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBmb3IgZW50aXR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcyBpZiBkbmFtZSBlbGVtZW50IHVuc3BlY2lmaWVkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsaWRpdHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+KGludGVnZXIpIGluZGljYXRlcyBob3cgbWFueSBkYXlzIGNlcnRpZmljYXRlIGlzIHZhbGlkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5c2l6ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4oaW50ZWdlcikgaW5kaWNhdGVzIHRoZSBzaXplIG9mIGtleSBnZW5lcmF0ZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+QWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNwZWNpZnkgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBieSBjcmVhdGluZyBhCitzdWItZWxlbWVudCBuYW1lZCBkbmFtZSBhbmQgcG9wdWxhdGluZyBpdCB3aXRoIHBhcmFtIGVsZW1lbnRzIHRoYXQKK2hhdmUgYSBuYW1lIGFuZCBhIHZhbHVlLiBXaGVuIHVzaW5nIHRoZSBzdWJlbGVtZW50IGl0IGlzIGF1dG9tYXRpY2FsbHkKK2VuY29kZWQgcHJvcGVybHkgYW5kIGNvbW1hcyAoJnF1b3Q7PGNvZGU+LDwvY29kZT4mcXVvdDspIGFyZSByZXBsYWNlZAord2l0aCAmcXVvdDs8Y29kZT5cLDwvY29kZT4mcXVvdDsuPC9wPgorCis8cD5UaGUgZm9sbG93aW5nIHR3byBleGFtcGxlcyBhcmUgaWRlbnRpY2FsOiA8L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2dlbmtleSBhbGlhcz0mcXVvdDthcGFjaGUtZ3JvdXAmcXVvdDsgc3RvcmVwYXNzPSZxdW90O3NlY3JldCZxdW90OyAKKyAgZG5hbWU9JnF1b3Q7Q049QW50IEdyb3VwLCBPVT1KYWthcnRhIERpdmlzaW9uLCBPPUFwYWNoZS5vcmcsIEM9VVMmcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8YmxvY2txdW90ZT4KKyAgPHByZT4KKyZsdDtnZW5rZXkgYWxpYXM9JnF1b3Q7YXBhY2hlLWdyb3VwJnF1b3Q7IHN0b3JlcGFzcz0mcXVvdDtzZWNyZXQmcXVvdDsgJmd0OworICAmbHQ7ZG5hbWUmZ3Q7CisgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7Q04mcXVvdDsgdmFsdWU9JnF1b3Q7QW50IEdyb3VwJnF1b3Q7LyZndDsKKyAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtPVSZxdW90OyB2YWx1ZT0mcXVvdDtKYWthcnRhIERpdmlzaW9uJnF1b3Q7LyZndDsKKyAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtPJnF1b3Q7ICB2YWx1ZT0mcXVvdDtBcGFjaGUuT3JnJnF1b3Q7LyZndDsKKyAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtDJnF1b3Q7ICB2YWx1ZT0mcXVvdDtVUyZxdW90Oy8mZ3Q7CisgICZsdDsvZG5hbWUmZ3Q7CismbHQ7L2dlbmtleSZndDs8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9nZXQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9nZXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjk5MjljCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2dldC5odG1sCkBAIC0wLDAgKzEsMTI1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkdldCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJnZXQiPkdldDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkdldHMgYSBmaWxlIGZyb20gYSBVUkwuIFdoZW4gdGhlIHZlcmJvc2Ugb3B0aW9uIGlzICZxdW90O29uJnF1b3Q7LCB0aGlzIHRhc2sKK2Rpc3BsYXlzIGEgJy4nIGZvciBldmVyeSAxMDAgS2IgcmV0cmlldmVkLiBBbnkgVVJMIHNjaGVtYSBzdXBwb3J0ZWQgYnkKK3RoZSBydW50aW1lIGlzIHZhbGlkIGhlcmUsIGluY2x1ZGluZyBodHRwOiwgZnRwOiBhbmQgamFyOjsgCitodHRwczogaXMgb25seSB2YWxpZCBpZiB0aGUgYXBwcm9wcmlhdGUgc3VwcG9ydCBpcyBhZGRlZCB0byB0aGUgcHJlLTEuNCBKYXZhCitydW50aW1lcy4gCisgCis8L3A+CitUaGUgPGk+dXNldGltZXN0YW1wPC9pPiBvcHRpb24gZW5hYmxlcyB5b3UgdG8gY29udHJvbCBkb3dubG9hZHMgc28gdGhhdCB0aGUgcmVtb3RlIGZpbGUgaXMKK29ubHkgZmV0Y2hlZCBpZiBuZXdlciB0aGFuIHRoZSBsb2NhbCBjb3B5LiBJZiB0aGVyZSBpcyBubyBsb2NhbCBjb3B5LCB0aGUgZG93bmxvYWQgYWx3YXlzIHRha2VzIAorcGxhY2UuIFdoZW4gYSBmaWxlIGlzIGRvd25sb2FkZWQsIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGRvd25sb2FkZWQgZmlsZSBpcyBzZXQgdG8gdGhlIHJlbW90ZSB0aW1lc3RhbXAsCitpZiAgdGhlIEpWTSBpcyBKYXZhMS4yIG9yIGxhdGVyLiAKK05COiBUaGlzIHRpbWVzdGFtcCBmYWNpbGl0eSBvbmx5IHdvcmtzIG9uIGRvd25sb2FkcyB1c2luZyB0aGUgSFRUUCBwcm90b2NvbC4gCis8cD4KK0EgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGNhbiBiZSBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgYmFzaWMgJ3NsaWdodGx5IGVuY29kZWQKK3BsYWluIHRleHQnIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQuIFRoaXMgaXMgb25seSBzZWN1cmUgb3ZlciBhbiBIVFRQUyBsaW5rLgorPC9wPgorPHA+Cis8Yj5Qcm94aWVzPC9iPi4gU2luY2UgQW50MS43LCBBbnQgcnVubmluZyBvbiBKYXZhMS41IG9yIGxhdGVyIGRlZmF1bHRzIHRvIAorICAgIDxhIGhyZWY9Ii4uL3Byb3h5Lmh0bWwiPnVzaW5nCisgICAgdGhlIHByb3h5IHNldHRpbmdzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtPC9hPi4gVGhlcmUgaXMgYWxzbyB0aGUgIAorIDxhIGhyZWY9Ii4uL09wdGlvbmFsVGFza3Mvc2V0cHJveHkuaHRtbCI+Jmx0O3NldHByb3h5Jmd0OzwvYT4gdGFzayBmb3IKKyAgICBlYXJsaWVyIEphdmEgdmVyc2lvbnMuIFdpdGggcHJveGllcyB0dXJuZWQgb24sIDxjb2RlPiZsdDtnZXQmZ3Q7PC9jb2RlPiByZXF1ZXN0cyBhZ2FpbnN0CisgICAgbG9jYWxob3N0IG1heSBub3Qgd29yayBhcyBleHBlY3RlZCwgaWYgdGhlIHJlcXVlc3QgaXMgcmVsYXllZCB0byB0aGUgcHJveHkuCisgICAgVGhlIDxjb2RlPi1ub3Byb3h5PC9jb2RlPiBvcHRpb24gY2FuIGJlIHVzZWQgdG8gdHVybiB0aGlzIGZlYXR1cmUgb2ZmLgorPC9wPgorIAorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBVUkwgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBhIGZpbGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgd2hlcmUgdG8gc3RvcmUgdGhlIHJldHJpZXZlZCBmaWxlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNob3cgdmVyYm9zZSBwcm9ncmVzcyBpbmZvcm1hdGlvbiAoJnF1b3Q7b24mcXVvdDsvJnF1b3Q7b2ZmJnF1b3Q7KS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgImZhbHNlIjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZWVycm9yczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Mb2cgZXJyb3JzIGJ1dCBkb24ndCB0cmVhdCBhcyBmYXRhbC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgImZhbHNlIjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXRpbWVzdGFtcDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb25kaXRpb25hbGx5IGRvd25sb2FkIGEgZmlsZSBiYXNlZCBvbiB0aGUgdGltZXN0YW1wIG9mIHRoZQorICAgIGxvY2FsIGNvcHkuIEhUVFAgb25seTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCAiZmFsc2UiPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcm5hbWUgZm9yICdCQVNJQycgaHR0cCBhdXRoZW50aWNhdGlvbjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5pZiBwYXNzd29yZCBpcyBzZXQ8L3RkPgorICA8L3RyPiAgCisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkOiByZXF1aXJlZCA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+aWYgdXNlcm5hbWUgaXMgc2V0PC90ZD4KKyAgPC90cj4gIAorCis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7Z2V0IHNyYz0mcXVvdDtodHRwOi8vYW50LmFwYWNoZS5vcmcvJnF1b3Q7IGRlc3Q9JnF1b3Q7aGVscC9pbmRleC5odG1sJnF1b3Q7LyZndDs8L3ByZT4KKzxwPkdldHMgdGhlIGluZGV4IHBhZ2Ugb2YgaHR0cDovL2FudC5hcGFjaGUub3JnLywgYW5kIHN0b3JlcyBpdCBpbiB0aGUgZmlsZSA8Y29kZT5oZWxwL2luZGV4Lmh0bWw8L2NvZGU+LjwvcD4KKworPHByZT4gICZsdDtnZXQgc3JjPSZxdW90O2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9LRVlTJnF1b3Q7IAorICAgIGRlc3Q9JnF1b3Q7S0VZUyZxdW90OyAKKyAgICB2ZXJib3NlPSZxdW90O3RydWUmcXVvdDsKKyAgICB1c2V0aW1lc3RhbXA9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD4KK0dldHMgdGhlIFBHUCBrZXlzIG9mIEFudCdzIChjdXJyZW50IGFuZCBwYXN0KSByZWxlYXNlIG1hbmFnZXJzLCBpZiB0aGUgbG9jYWwgY29weQoraXMgbWlzc2luZyBvciBvdXQgb2YgZGF0ZS4gVXNlcyB0aGUgdmVyYm9zZSBvcHRpb24gCitmb3IgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uCis8L3A+CisKKzxwcmU+ICAmbHQ7Z2V0IHNyYz0mcXVvdDtodHRwczovL2luc2VjdXJlLWJhbmsub3JnL3N0YXRlbWVudC91c2VyPTEyMTQmcXVvdDsgCisgICAgZGVzdD0mcXVvdDtzdGF0ZW1lbnQuaHRtbCZxdW90OyAKKyAgICB1c2VybmFtZT0iMTIxNCI7CisgICAgcGFzc3dvcmQ9InNlY3JldCIvJmd0OzwvcHJlPgorPHA+CitGZXRjaGVzIHNvbWUgZmlsZSBmcm9tIGEgc2VydmVyIHdpdGggYWNjZXNzIGNvbnRyb2wuIEJlY2F1c2UgaHR0cHMgaXMgYmVpbmcgdXNlZCB0aGUKK2ZhY3QgdGhhdCBiYXNpYyBhdXRoIHNlbmRzIHBhc3N3b3JkcyBpbiBwbGFpbnRleHQgaXMgbW9vdC4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9ndW56aXAuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9ndW56aXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmUyY2YyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2d1bnppcC5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+R1VuWmlwIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KK1RoaXMgZG9jdW1lbnQncyBuZXcgaG9tZSBpcyA8QSBIUkVGPSJ1bnBhY2suaHRtbCI+aGVyZTwvQT4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2d6aXAuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9nemlwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1NGQzMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9nemlwLmh0bWwKQEAgLTAsMCArMSwyOSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5HWmlwIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KK1RoaXMgZG9jdW1lbnQncyBuZXcgaG9tZSBpcyA8QSBIUkVGPSJwYWNrLmh0bWwiPmhlcmU8L0E+Cis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9pbXBvcnQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9pbXBvcnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDU0MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2ltcG9ydC5odG1sCkBAIC0wLDAgKzEsMTcyIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKyAgPHRpdGxlPkltcG9ydCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorICA8aDI+PGEgbmFtZT0iaW1wb3J0Ij5JbXBvcnQ8L2E+PC9oMj4KKyAgPGgzPkRlc2NyaXB0aW9uPC9oMz4KKyAgPHA+CisgICAgSW1wb3J0cyBhbm90aGVyIGJ1aWxkIGZpbGUgaW50byB0aGUgY3VycmVudCBwcm9qZWN0LgorICA8L3A+CisgIDxwPgorICAgIE9uIGV4ZWN1dGlvbiBpdCB3aWxsIHJlYWQgYW5vdGhlciBBbnQgZmlsZSBpbnRvCisgICAgdGhlIHNhbWUgUHJvamVjdC4gVGhpcyBtZWFucyB0aGF0IGl0IGJhc2ljYWxseSB3b3JrcyBsaWtlIHRoZSAKKyAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwjeG1sLWVudGl0eS1pbmNsdWRlIj5FbnRpdHkKKyAgICAgIEluY2x1ZGVzIGFzIGV4cGxhaW5lZCBpbiB0aGUgQW50IEZBUTwvYT4sIGFzIGlmIHRoZSBpbXBvcnRlZCBmaWxlIHdhcworICAgIGNvbnRhaW5lZCBpbiB0aGUgaW1wb3J0aW5nIGZpbGUsIG1pbnVzIHRoZSB0b3AgPGNvZGU+Jmx0O3Byb2plY3QmZ3Q7PC9jb2RlPgorICAgIHRhZy4KKyAgPC9wPgorICA8cD4KKyAgICBUaGUgaW1wb3J0IHRhc2sgbWF5IG9ubHkgYmUgdXNlZCBhcyBhIHRvcC1sZXZlbCB0YXNrLiBUaGlzIG1lYW5zIHRoYXQKKyAgICBpdCBtYXkgbm90IGJlIHVzZWQgaW4gYSB0YXJnZXQuCisgIDwvcD4KKyAgPHA+CitUaGVyZSBhcmUgdHdvIGZ1cnRoZXIgZnVuY3Rpb25hbCBhc3BlY3RzIHRoYXQgcGVydGFpbiB0byB0aGlzIHRhc2sgYW5kCit0aGF0IGFyZSBub3QgcG9zc2libGUgd2l0aCBlbnRpdHkgaW5jbHVkZXM6Cis8dWw+CisgIDxsaT50YXJnZXQgb3ZlcnJpZGluZzwvbGk+CisgIDxsaT5zcGVjaWFsIHByb3BlcnRpZXM8L2xpPgorPC91bD4KKyAgPC9wPgorPGg0PlRhcmdldCBvdmVycmlkaW5nPC9oND4KKworPHA+SWYgYSB0YXJnZXQgaW4gdGhlIG1haW4gZmlsZSBpcyBhbHNvIHByZXNlbnQgaW4gYXQgbGVhc3Qgb25lIG9mIHRoZQoraW1wb3J0ZWQgZmlsZXMsIHRoZSBvbmUgZnJvbSB0aGUgbWFpbiBmaWxlIHRha2VzIHByZWNlZGVuY2UuPC9wPgorCis8cD5TbyBpZiBJIGltcG9ydCBmb3IgZXhhbXBsZSBhIDxpPmRvY3NidWlsZC54bWw8L2k+IGZpbGUgbmFtZWQgPGI+YnVpbGRkb2NzPC9iPiwKK3RoYXQgY29udGFpbnMgYSAmcXVvdDs8Yj5kb2NzPC9iPiZxdW90OyB0YXJnZXQsIEkgY2FuIHJlZGVmaW5lIGl0IGluIG15IG1haW4KK2J1aWxkZmlsZSBhbmQgdGhhdCBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSBjYWxsZWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0bwora2VlcCB0aGUgc2FtZSB0YXJnZXQgbmFtZSwgc28gdGhhdCB0aGUgb3ZlcnJpZGluZyB0YXJnZXQgaXMgc3RpbGwgY2FsbGVkCitieSBhbnkgb3RoZXIgdGFyZ2V0cy0taW4gZWl0aGVyIHRoZSBtYWluIG9yIGltcG9ydGVkIGJ1aWxkZmlsZShzKS0tZm9yIHdoaWNoCitpdCBpcyBhIGRlcGVuZGVuY3ksIHdpdGggYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uIFRoZSB0YXJnZXQgZnJvbSA8aT5kb2NzYnVpbGQueG1sPC9pPiBpcworbWFkZSBhdmFpbGFibGUgYnkgdGhlIG5hbWUgJnF1b3Q7PGI+YnVpbGRkb2NzPC9iPjxiPi5kb2NzPC9iPiZxdW90Oy4KK1RoaXMgZW5hYmxlcyB0aGUgbmV3IGltcGxlbWVudGF0aW9uIHRvIGNhbGwgdGhlIG9sZCB0YXJnZXQsIHRodXMKKzxpPmVuaGFuY2luZzwvaT4gaXQgd2l0aCB0YXNrcyBjYWxsZWQgYmVmb3JlIG9yIGFmdGVyIGl0LjwvcD4KKworPGg0PlNwZWNpYWwgUHJvcGVydGllczwvaDQ+CisKKzxwPkltcG9ydGVkIGZpbGVzIGFyZSB0cmVhdGVkIGFzIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlIG1haW4KK2J1aWxkZmlsZS4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHVuZGVyc3RhbmQsIGJ1dCBpdCBtYWtlcyBpdCBpbXBvc3NpYmxlCitmb3IgdGhlbSB0byByZWZlcmVuY2UgZmlsZXMgYW5kIHJlc291cmNlcyByZWxhdGl2ZSB0byB0aGVpciBwYXRoLgorQmVjYXVzZSBvZiB0aGlzLCBmb3IgZXZlcnkgaW1wb3J0ZWQgZmlsZSwgQW50IGFkZHMgYSBwcm9wZXJ0eSB0aGF0Citjb250YWlucyB0aGUgcGF0aCB0byB0aGUgaW1wb3J0ZWQgYnVpbGRmaWxlLiBXaXRoIHRoaXMgcGF0aCwgdGhlCitpbXBvcnRlZCBidWlsZGZpbGUgY2FuIGtlZXAgcmVzb3VyY2VzIGFuZCBiZSBhYmxlIHRvIHJlZmVyZW5jZSB0aGVtCityZWxhdGl2ZSB0byBpdHMgcG9zaXRpb24uPC9wPgorCis8cD5TbyBpZiBJIGltcG9ydCBmb3IgZXhhbXBsZSBhIDxpPmRvY3NidWlsZC54bWw8L2k+IGZpbGUgbmFtZWQgPGI+YnVpbGRkb2NzPC9iPiwKK0kgY2FuIGdldCBpdHMgcGF0aCBhcyA8Yj5hbnQuZmlsZS5idWlsZGRvY3M8L2I+LCBzaW1pbGFybHkgdG8gdGhlIDxiPmFudC5maWxlPC9iPgorcHJvcGVydHkgb2YgdGhlIG1haW4gYnVpbGRmaWxlLjwvcD4KKworPHA+Tm90ZSB0aGF0ICZxdW90O2J1aWxkZG9jcyZxdW90OyBpcyBub3QgdGhlIGZpbGVuYW1lLCBidXQgdGhlIG5hbWUgYXR0cmlidXRlCitwcmVzZW50IGluIHRoZSBpbXBvcnRlZCBwcm9qZWN0IHRhZy48L3A+CisgIDxwPgorICAgIElmIGltcG9ydCBmaWxlIGRvZXMgbm90IGhhdmUgYSBuYW1lIGF0dHJpYnV0ZSwgdGhlIGFudC5maWxlLnByb2plY3RuYW1lCisgICAgcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0LgorICA8L3A+CisKKzxoND5SZXNvbHZpbmcgZmlsZXMgYWdhaW5zdCB0aGUgaW1wb3J0ZWQgZmlsZTwvaDQ+CisKKzxwPlN1cHBvc2UgeW91ciBtYWluIGJ1aWxkIGZpbGUgY2FsbGVkIDxjb2RlPmltcG9ydGluZy54bWw8L2NvZGU+CitpbXBvcnRzIGEgYnVpbGQgZmlsZSA8Y29kZT5pbXBvcnRlZC54bWw8L2NvZGU+LCBsb2NhdGVkIGFueXdoZXJlIG9uCit0aGUgZmlsZSBzeXN0ZW0sIGFuZCA8Y29kZT5pbXBvcnRlZC54bWw8L2NvZGU+IHJlYWRzIGEgc2V0IG9mCitwcm9wZXJ0aWVzIGZyb20gPGNvZGU+aW1wb3J0ZWQucHJvcGVydGllczwvY29kZT46PC9wPgorCis8cHJlPiZsdDshLS0gaW1wb3J0aW5nLnhtbCAtLSZndDsKKyZsdDtwcm9qZWN0IG5hbWU9ImltcG9ydGluZyIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iLi4uIiZndDsKKyZuYnNwOyAmbHQ7aW1wb3J0IGZpbGU9IiR7cGF0aF90b19pbXBvcnRlZH0vaW1wb3J0ZWQueG1sIi8mZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7CisKKyZsdDshLS0gaW1wb3J0ZWQueG1sIC0tJmd0OworJmx0O3Byb2plY3QgbmFtZT0iaW1wb3J0ZWQiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Ii4uLiImZ3Q7CismbmJzcDsgJmx0O3Byb3BlcnR5IGZpbGU9ImltcG9ydGVkLnByb3BlcnRpZXMiLyZndDsKKyZsdDsvcHJvamVjdCZndDsKKzwvcHJlPgorCis8cD5UaGlzIHNuaXBwZXQgaG93ZXZlciB3aWxsIHJlc29sdmUgPGNvZGU+aW1wb3J0ZWQucHJvcGVydGllczwvY29kZT4KK2FnYWluc3QgdGhlIGJhc2VkaXIgb2YgPGNvZGU+aW1wb3J0aW5nLnhtbDwvY29kZT4sIGJlY2F1c2UgdGhlIGJhc2VkaXIKK29mIDxjb2RlPmltcG9ydGVkLnhtbDwvY29kZT4gaXMgaWdub3JlZCBieSBBbnQuIFRoZSByaWdodCB3YXkgdG8gdXNlCis8Y29kZT5pbXBvcnRlZC5wcm9wZXJ0aWVzPC9jb2RlPiBpczo8L3A+CisKKzxwcmU+CismbHQ7IS0tIGltcG9ydGVkLnhtbCAtLSZndDsKKyZsdDtwcm9qZWN0IG5hbWU9ImltcG9ydGVkIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSIuLi4iJmd0OworJm5ic3A7ICZsdDtkaXJuYW1lIHByb3BlcnR5PSJpbXBvcnRlZC5iYXNlZGlyIiBmaWxlPSIke2FudC5maWxlLmltcG9ydGVkfSIvJmd0OworJm5ic3A7ICZsdDtwcm9wZXJ0eSBmaWxlPSIke2ltcG9ydGVkLmJhc2VkaXJ9L2ltcG9ydGVkLnByb3BlcnRpZXMiLyZndDsKKyZsdDsvcHJvamVjdCZndDsKKzwvcHJlPgorCis8cD5BcyBleHBsYWluZWQgYWJvdmUgPGNvZGU+JHthbnQuZmlsZS5pbXBvcnRlZH08L2NvZGU+IHN0b3JlcyB0aGUKK3BhdGggb2YgdGhlIGJ1aWxkIHNjcmlwdCwgdGhhdCBkZWZpbmVzIHRoZSBwcm9qZWN0IGNhbGxlZAorPGNvZGU+aW1wb3J0ZWQ8L2NvZGU+LCAoaW4gc2hvcnQgaXQgc3RvcmVzIHRoZSBwYXRoIHRvCis8Y29kZT5pbXBvcnRlZC54bWw8L2NvZGU+KSBhbmQgPGEKK2hyZWY9ImRpcm5hbWUuaHRtbCI+PGNvZGU+Jmx0O2Rpcm5hbWUmZ3Q7PC9jb2RlPjwvYT4gdGFrZXMgaXRzCitkaXJlY3RvcnkuIFRoaXMgdGVjaG5pcXVlIGFsc28gYWxsb3dzIDxjb2RlPmltcG9ydGVkLnhtbDwvY29kZT4gdG8gYmUKK3VzZWQgYXMgYSBzdGFuZGFsb25lIGZpbGUgKHdpdGhvdXQgYmVpbmcgaW1wb3J0ZWQgaW4gb3RoZXIKK3Byb2plY3QpLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICBmaWxlCisgICAgICA8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgVGhlIGZpbGUgdG8gaW1wb3J0LiBJZiB0aGlzIGlzIGEgcmVsYXRpdmUgZmlsZSBuYW1lLCB0aGUgZmlsZSBuYW1lIHdpbGwgYmUgcmVzb2x2ZWQKKyAgICAgICAgcmVsYXRpdmUgdG8gdGhlIDxpPmltcG9ydGluZzwvaT4gZmlsZS4gPGI+Tm90ZTwvYj4sIHRoaXMgaXMgdW5saWtlIG1vc3Qgb3RoZXIKKyAgICAgICAgYW50IGZpbGUgYXR0cmlidXRlcywgd2hlcmUgcmVsYXRpdmUgZmlsZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvICR7YmFzZWRpcn0uCisgICAgICA8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgb3B0aW9uYWwKKyAgICAgIDwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICBJZiB0cnVlLCBkbyBub3Qgc3RvcCB0aGUgYnVpbGQgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsCisgICAgICAgIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICA8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiZuYnNwOyAmbHQ7aW1wb3J0IGZpbGU9JnF1b3Q7Li4vY29tbW9uLXRhcmdldHMueG1sJnF1b3Q7LyZndDsKKzwvcHJlPgorCis8cD5JbXBvcnRzIHRhcmdldHMgZnJvbSB0aGUgY29tbW9uLXRhcmdldHMueG1sIGZpbGUgdGhhdCBpcyBpbiBhIHBhcmVudAorZGlyZWN0b3J5LjwvcD4KKworPHByZT4mbmJzcDsgJmx0O2ltcG9ydCBmaWxlPSZxdW90OyR7ZGVwbG95LXBsYXRmb3JtfS54bWwmcXVvdDsvJmd0OworPC9wcmU+CisKKzxwPkltcG9ydHMgdGhlIHByb2plY3QgZGVmaW5lZCBieSB0aGUgcHJvcGVydHkgZGVwbG95LXBsYXRmb3JtPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9pbnB1dC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2lucHV0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3MWZhMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9pbnB1dC5odG1sCkBAIC0wLDAgKzEsMTk1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPklucHV0IFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImlucHV0Ij5JbnB1dDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworPHA+QWxsb3dzIHVzZXIgaW50ZXJhY3Rpb24gZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIGJ5IHByb21wdGluZyBmb3IKK2lucHV0LiAgVG8gZG8gc28sIGl0IHVzZXMgdGhlIGNvbmZpZ3VyZWQgCis8YSBocmVmPSIuLi9pbnB1dGhhbmRsZXIuaHRtbCI+SW5wdXRIYW5kbGVyPC9hPi48L3A+CisKKzxwPlRoZSBwcm9tcHQgY2FuIGJlIHNldCB2aWEgdGhlIG1lc3NhZ2UgYXR0cmlidXRlIG9yIGFzIGNoYXJhY3RlcgorZGF0YSBuZXN0ZWQgaW50byB0aGUgZWxlbWVudC48L3A+CisKKzxwPk9wdGlvbmFsbHkgYSBzZXQgb2YgdmFsaWQgaW5wdXQgYXJndW1lbnRzIGNhbiBiZSBkZWZpbmVkIHZpYSB0aGUKK3ZhbGlkYXJncyBhdHRyaWJ1dGUuIElucHV0IHRhc2sgd2lsbCBub3QgYWNjZXB0IGEgdmFsdWUgdGhhdCBkb2Vzbid0IG1hdGNoCitvbmUgb2YgdGhlIHByZWRlZmluZWQuPC9wPgorCis8cD5PcHRpb25hbGx5IGEgcHJvcGVydHkgY2FuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgdmFsdWUgZW50ZXJlZCBieSB0aGUKK3VzZXIuIFRoaXMgcHJvcGVydHkgY2FuIHRoZW4gYmUgdXNlZCBkdXJpbmcgdGhlIGZvbGxvd2luZyBidWlsZAorcnVuLiBJbnB1dCBiZWhhdmVzIGFjY29yZGluZyB0byA8YSBocmVmPSJwcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eQordGFzazwvYT4gd2hpY2ggbWVhbnMgdGhhdCBleGlzdGluZyBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBvdmVycmlkZW4uCitTaW5jZSBBbnQgMS42LCA8Y29kZT4mbHQ7aW5wdXQmZ3Q7PC9jb2RlPiB3aWxsIG5vdCBwcm9tcHQgZm9yIGlucHV0IGlmCithIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgYnkgdGhlIHRhc2sgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHNldCBpbiB0aGUKK3Byb2plY3QgKGFuZCB0aGUgdGFzayB3b3VsZG4ndCBoYXZlIGFueSBlZmZlY3QpLjwvcD4KKworPHA+QSByZWd1bGFyIGNvbXBsYWludCBhYm91dCB0aGlzIHRhc2sgaXMgdGhhdCBpdCBlY2hvZXMgY2hhcmFjdGVycyB0byB0aGUKK2NvbnNvbGUsIHRoaXMgaXMgYSBjcml0aWNhbCBzZWN1cml0eSBkZWZlY3QsIHdlIG11c3QgZml4IGl0IGltbWVkaWF0ZWx5LCBldGMsIGV0Yy4KK1dlIGtub3cgaXQgbGVhdmVzIHNvbWV0aGluZyB0byBiZSBkZXNpcmVkLCBidXQgdGhlIHByb2JsZW0gaXMgSmF2YSwgbm90IEFudC4KK1RoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIHRvIHN0b3AgdGhlIGNvbnNvbGUgZWNob2luZy4gPC9wPgorCis8cD4KK0lERSBiZWhhdmlvdXIgZGVwZW5kcyB1cG9uIHRoZSBJREU6IHNvbWUgaGFuZyB3YWl0aW5nIGZvciBpbnB1dCwgc29tZSBsZXQgeW91Cit0eXBlIGl0IGluLiBGb3IgdGhpcyBzaXR1YXRpb24sIHBsYWNlIHRoZSBwYXNzd29yZCBpbiBhIChzZWN1cmVkKSBwcm9wZXJ0eQorZmlsZSBhbmQgbG9hZCBpbiBiZWZvcmUgdGhlIGlucHV0IHRhc2suPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tZXNzYWdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBNZXNzYWdlIHdoaWNoIGdldHMgZGlzcGxheWVkIHRvIHRoZSB1c2VyCisgICAgZHVyaW5nIHRoZSBidWlsZCBydW4uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsaWRhcmdzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hIHNlcGFyYXRlZCBTdHJpbmcgY29udGFpbmluZyB2YWxpZCBpbnB1dAorICAgIGFyZ3VtZW50cy4gSWYgc2V0LCBpbnB1dCB0YXNrIHdpbGwgcmVqZWN0IGFueSBpbnB1dCBub3QgZGVmaW5lZAorICAgIGhlcmUuICBWYWxpZGFyZ3MgYXJlIGNvbXBhcmVkIGNhc2Ugc2Vuc2l0aXZlLiBJZiB5b3Ugd2FudCAnYScgYW5kCisgICAgJ0EnIHRvIGJlIGFjY2VwdGVkIHlvdSB3aWxsIG5lZWQgdG8gZGVmaW5lIGJvdGggYXJndW1lbnRzIHdpdGhpbgorICAgIHZhbGlkYXJncy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hZGRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIGJlIGNyZWF0ZWQgZnJvbQorICAgIGlucHV0LiBCZWhhdmlvdXIgaXMgZXF1YWwgdG8gPGEgaHJlZj0icHJvcGVydHkuaHRtbCI+cHJvcGVydHkKKyAgICB0YXNrPC9hPiB3aGljaCBtZWFucyB0aGF0IGV4aXN0aW5nIHByb3BlcnRpZXMgY2Fubm90IGJlCisgICAgb3ZlcnJpZGRlbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUKKyAgICBjcmVhdGVkIGZyb20gaW5wdXQuICBQcm9wZXJ0eSB2YWx1ZSB3aWxsIGJlIHNldCB0byBkZWZhdWx0IGlmIG5vCisgICAgaW5wdXQgaXMgcmVjZWl2ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBTcGVjaWZpZWQgYXMgTmVzdGVkIEVsZW1lbnRzPC9oMz4KKzxoND5IYW5kbGVyPC9oND4KKzxwPlNpbmNlIDxiPkFudCAxLjc8L2I+LCBhIG5lc3RlZCAmbHQ7aGFuZGxlciZndDsgZWxlbWVudCBjYW4gYmUgdXNlZCB0bworc3BlY2lmeSBhbiBJbnB1dEhhbmRsZXIsIHNvIHRoYXQgZGlmZmVyZW50IElucHV0SGFuZGxlcnMgbWF5IGJlIHVzZWQKK2Ftb25nIGRpZmZlcmVudCBJbnB1dCB0YXNrcy4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vbmUgb2YgImRlZmF1bHQiLCJwcm9wZXJ0eWZpbGUiLCBvciAiZ3JlZWR5Ii4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iMyI+T25lIG9mIHRoZXNlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmaWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UmVmZXJlbmNlIHRvIGFuIDxjb2RlPklucHV0SGFuZGxlcjwvY29kZT4KKyAgICAgICAgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIHByb2plY3QuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGFuIDxjb2RlPklucHV0SGFuZGxlcjwvY29kZT4gc3ViY2xhc3MuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlIHdpdGggPGk+Y2xhc3NuYW1lPC9pPi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJlZmlkIG9mIGEgY2xhc3NwYXRoIHRvIHVzZSB3aXRoIDxpPmNsYXNzbmFtZTwvaT4uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bG9hZGVycmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSByZWZpZCBvZiBhIGNsYXNzbG9hZGVyIHRvIHVzZSB3aXRoIDxpPmNsYXNzbmFtZTwvaT4uCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8YnIgLz4KK1RoZSBjbGFzc3BhdGggY2FuIGFsc28gYmUgc3BlY2lmaWVkIGJ5IG1lYW5zIG9mIG9uZSBvciBtb3JlIG5lc3RlZAorJmx0O2NsYXNzcGF0aCZndDsgZWxlbWVudHMuPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4gICZsdDtpbnB1dC8mZ3Q7PC9wcmU+Cis8cD5XaWxsIHBhdXNlIHRoZSBidWlsZCBydW4gdW50aWwgcmV0dXJuIGtleSBpcyBwcmVzc2VkIHdoZW4gdXNpbmcgdGhlCis8YSBocmVmPSIuLi9pbnB1dGhhbmRsZXIuaHRtbCNkZWZhdWx0aGFuZGxlciI+ZGVmYXVsdAorSW5wdXRIYW5kbGVyPC9hPiwgdGhlIGNvbmNyZXRlIGJlaGF2aW9yIGlzIGRlZmluZWQgYnkgdGhlIElucHV0SGFuZGxlcgoraW1wbGVtZW50YXRpb24geW91IHVzZS48L3A+Cis8cHJlPiAgJmx0O2lucHV0Jmd0O1ByZXNzIFJldHVybiBrZXkgdG8gY29udGludWUuLi4mbHQ7L2lucHV0Jmd0OzwvcHJlPgorPHA+V2lsbCBkaXNwbGF5IHRoZSBtZXNzYWdlICZxdW90O1ByZXNzIFJldHVybiBrZXkgdG8KK2NvbnRpbnVlLi4uJnF1b3Q7IGFuZCBwYXVzZSB0aGUgYnVpbGQgcnVuIHVudGlsIHJldHVybiBrZXkgaXMgcHJlc3NlZAorKGFnYWluLCB0aGUgY29uY3JldGUgYmVoYXZpb3IgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KS48L3A+Cis8cHJlPiAgJmx0O2lucHV0CisgICAgbWVzc2FnZT0mcXVvdDtQcmVzcyBSZXR1cm4ga2V5IHRvIGNvbnRpbnVlLi4uJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD5XaWxsIGRpc3BsYXkgdGhlIG1lc3NhZ2UgJnF1b3Q7UHJlc3MgUmV0dXJuIGtleSB0bworY29udGludWUuLi4mcXVvdDsgYW5kIHBhdXNlIHRoZSBidWlsZCBydW4gdW50aWwgcmV0dXJuIGtleSBpcyBwcmVzc2VkCisoc2VlIGFib3ZlKS48L3A+Cis8cHJlPgorICAmbHQ7aW5wdXQKKyAgICBtZXNzYWdlPSZxdW90O0FsbCBkYXRhIGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSBEQiBjb250aW51ZSAoeS9uKT8mcXVvdDsKKyAgICB2YWxpZGFyZ3M9JnF1b3Q7eSxuJnF1b3Q7CisgICAgYWRkcHJvcGVydHk9JnF1b3Q7ZG8uZGVsZXRlJnF1b3Q7CisgIC8mZ3Q7CisgICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7ZG8uYWJvcnQmcXVvdDsmZ3Q7CisgICAgJmx0O2VxdWFscyBhcmcxPSZxdW90O24mcXVvdDsgYXJnMj0mcXVvdDske2RvLmRlbGV0ZX0mcXVvdDsvJmd0OworICAmbHQ7L2NvbmRpdGlvbiZndDsKKyAgJmx0O2ZhaWwgaWY9JnF1b3Q7ZG8uYWJvcnQmcXVvdDsmZ3Q7QnVpbGQgYWJvcnRlZCBieSB1c2VyLiZsdDsvZmFpbCZndDsKKzwvcHJlPgorPHA+V2lsbCBkaXNwbGF5IHRoZSBtZXNzYWdlICZxdW90O0FsbCBkYXRhIGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbQorREIgY29udGludWUgKHkvbik/JnF1b3Q7IGFuZCByZXF1aXJlICd5JyB0byBjb250aW51ZSBidWlsZCBvciAnbicgdG8KK2V4aXQgYnVpbGQgd2l0aCBmb2xsb3dpbmcgbWVzc2FnZSAmcXVvdDtCdWlsZCBhYm9ydGVkIGJ5Cit1c2VyLiZxdW90Oy48L3A+Cis8cHJlPiAgJmx0O2lucHV0CisgICAgbWVzc2FnZT0mcXVvdDtQbGVhc2UgZW50ZXIgZGItdXNlcm5hbWU6JnF1b3Q7CisgICAgYWRkcHJvcGVydHk9JnF1b3Q7ZGIudXNlciZxdW90OworICAvJmd0OzwvcHJlPgorPHA+V2lsbCBkaXNwbGF5IHRoZSBtZXNzYWdlICZxdW90O1BsZWFzZSBlbnRlciBkYi11c2VybmFtZTomcXVvdDsgYW5kIHNldCB0aGUKK3Byb3BlcnR5IDxjb2RlPmRiLnVzZXI8L2NvZGU+IHRvIHRoZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSB1c2VyLjwvcD4KKworPHByZT4gICZsdDtpbnB1dAorICAgIG1lc3NhZ2U9JnF1b3Q7UGxlYXNlIGVudGVyIGRiLXVzZXJuYW1lOiZxdW90OworICAgIGFkZHByb3BlcnR5PSZxdW90O2RiLnVzZXImcXVvdDsKKyAgICBkZWZhdWx0dmFsdWU9JnF1b3Q7U2NvdHQtVGlnZXImcXVvdDsKKyAgLyZndDs8L3ByZT4KKzxwPlNhbWUgYXMgYWJvdmUsIGJ1dCB3aWxsIHNldCA8Y29kZT5kYi51c2VyPC9jb2RlPiB0byB0aGUgdmFsdWUKKzxpPlNjb3R0LSBUaWdlcjwvaT4gaWYgdGhlIHVzZXIgZW50ZXJzIG5vIHZhbHVlIChzaW1wbHkgdHlwZXMKKyZsdDtyZXR1cm4mZ3Q7KS48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2phci5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2phci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzA4MTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvamFyLmh0bWwKQEAgLTAsMCArMSw0NDEgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SmFyIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImphciI+SmFyPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+SmFycyBhIHNldCBvZiBmaWxlcy48L3A+Cis8cD5UaGUgPGk+YmFzZWRpcjwvaT4gYXR0cmlidXRlIGlzIHRoZSByZWZlcmVuY2UgZGlyZWN0b3J5IGZyb20gd2hlcmUgdG8gamFyLjwvcD4KKzxwPk5vdGUgdGhhdCBmaWxlIHBlcm1pc3Npb25zIHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgcmVzdWx0aW5nIGphcmZpbGUuPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgamFycmVkLiBUaGlzIGNhbiBiZQorZG9uZSB3aXRoIHRoZSA8aT5pbmNsdWRlczwvaT4sIDxpPmluY2x1ZGVzZmlsZTwvaT4sIDxpPmV4Y2x1ZGVzPC9pPiwgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhbmQgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPgorYXR0cmlidXRlcy4gV2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+IG9yIDxpPmluY2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0bworaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDxpPmV4Y2x1ZGU8L2k+IG9yIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeQordGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuIFRoaXMgaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZAorZmluYWxseSB3aXRoIHRoZSA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91Cit3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24gb24gPGEKK2hyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy48L3A+Cis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCitzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+CisoPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPmJhc2VkaXI8L2NvZGU+KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKKzxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gYW5kCis8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPllvdSBjYW4gYWxzbyB1c2UgbmVzdGVkIGZpbGUgc2V0cyBmb3IgbW9yZSBmbGV4aWJpbGl0eSwgYW5kIHNwZWNpZnkKK211bHRpcGxlIG9uZXMgdG8gbWVyZ2UgdG9nZXRoZXIgZGlmZmVyZW50IHRyZWVzIG9mIGZpbGVzIGludG8gb25lIEpBUi4KK1RoZSBleHRlbmRlZCBmaWxlc2V0IGFuZCBncm91cGZpbGVzZXQgY2hpbGQgZWxlbWVudHMgZnJvbSB0aGUgemlwIHRhc2sgYXJlCithbHNvIGF2YWlsYWJsZSBpbiB0aGUgamFyIHRhc2suCitTZWUgdGhlIDxhIGhyZWY9InppcC5odG1sIj5aaXA8L2E+IHRhc2sgZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMuPC9wPgorPHA+SWYgdGhlIG1hbmlmZXN0IGlzIG9taXR0ZWQsIGEgc2ltcGxlIG9uZSB3aWxsIGJlIHN1cHBsaWVkIGJ5IEFudC48L3A+CisKKzxwPlRoZSA8Y29kZT51cGRhdGU8L2NvZGU+IHBhcmFtZXRlciBjb250cm9scyB3aGF0IGhhcHBlbnMgaWYgdGhlIEpBUgorZmlsZSBhbHJlYWR5IGV4aXN0cy4gV2hlbiBzZXQgdG8gPGNvZGU+eWVzPC9jb2RlPiwgdGhlIEpBUiBmaWxlIGlzCit1cGRhdGVkIHdpdGggdGhlIGZpbGVzIHNwZWNpZmllZC4gV2hlbiBzZXQgdG8gPGNvZGU+bm88L2NvZGU+ICh0aGUKK2RlZmF1bHQpIHRoZSBKQVIgZmlsZSBpcyBvdmVyd3JpdHRlbi4gQW4gZXhhbXBsZSB1c2Ugb2YgdGhpcyBpcworcHJvdmlkZWQgaW4gdGhlIDxhIGhyZWY9InppcC5odG1sIj5aaXAgdGFzayBkb2N1bWVudGF0aW9uPC9hPi4gIFBsZWFzZQorbm90ZSB0aGF0IFpJUCBmaWxlcyBzdG9yZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aXRoIGEgZ3JhbnVsYXJpdHkKK29mIHR3byBzZWNvbmRzLiAgSWYgYSBmaWxlIGlzIGxlc3MgdGhhbiB0d28gc2Vjb25kcyBuZXdlciB0aGFuIHRoZQorZW50cnkgaW4gdGhlIGFyY2hpdmUsIEFudCB3aWxsIG5vdCBjb25zaWRlciBpdCBuZXdlci48L3A+CisKKzxwPlRoZSA8Y29kZT53aGVubWFuaWZlc3Rvbmx5PC9jb2RlPiBwYXJhbWV0ZXIgY29udHJvbHMgd2hhdCBoYXBwZW5zIHdoZW4gbm8KK2ZpbGVzLCBhcGFydCBmcm9tIHRoZSBtYW5pZmVzdCBmaWxlLCBvciBuZXN0ZWQgc2VydmljZXMsIG1hdGNoLgorSWYgPGNvZGU+c2tpcDwvY29kZT4sIHRoZSBKQVIgaXMgbm90IGNyZWF0ZWQgYW5kIGEgd2FybmluZyBpcyBpc3N1ZWQuCitJZiA8Y29kZT5mYWlsPC9jb2RlPiwgdGhlIEpBUiBpcyBub3QgY3JlYXRlZCBhbmQgdGhlIGJ1aWxkIGlzIGhhbHRlZCB3aXRoIGFuIGVycm9yLgorSWYgPGNvZGU+Y3JlYXRlPC9jb2RlPiwgKGRlZmF1bHQpIGFuIGVtcHR5IEpBUiBmaWxlIChvbmx5IGNvbnRhaW5pbmcgYSBtYW5pZmVzdCBhbmQgc2VydmljZXMpCitpcyBjcmVhdGVkLjwvcD4KKworPHA+KFRoZSBKYXIgdGFzayBpcyBhIHNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIHRoZSBtYW5pZmVzdCBmaWxlIG9mIGEgSkFSIGZpbGUuCitUaGUgc2FtZSB0aGluZyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSA8aT5mdWxscGF0aDwvaT4KK2F0dHJpYnV0ZSBvZiBhIHppcGZpbGVzZXQgaW4gYSBaaXAgdGFzay4gVGhlIG9uZSBkaWZmZXJlbmNlIGlzIHRoYXQgaWYgdGhlCis8aT5tYW5pZmVzdDwvaT4gYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBKYXIgdGFzayB3aWxsCitpbmNsdWRlIGFuIGVtcHR5IG9uZSBmb3IgeW91Lik8L3A+CisKKzxwPk1hbmlmZXN0cyBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSBKYXIgdGFzayBhY2NvcmRpbmcgdG8gdGhlCis8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2phci9qYXIuaHRtbCI+SmFyIGZpbGUgc3BlY2lmaWNhdGlvbi48L2E+CitOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCB0aGlzIG1heSByZXN1bHQgaW4gbWFuaWZlc3QgbGluZXMgZ3JlYXRlciB0aGFuIDcyIGJ5dGVzCitiZWluZyB3cmFwcGVkIGFuZCBjb250aW51ZWQgb24gdGhlIG5leHQgbGluZS48L3A+CisKKzxwPlRoZSBKYXIgdGFzayBjaGVja3Mgd2hldGhlciB5b3Ugc3BlY2lmaWVkIHBhY2thZ2UgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIHRoZQorPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS92ZXJzaW9uaW5nL3NwZWMvVmVyc2lvbmluZ1NwZWNpZmljYXRpb24uaHRtbCNQYWNrYWdlVmVyc2lvbmluZyI+Cit2ZXJzaW9uaW5nIHNwZWNpZmljYXRpb248L2E+LjwvcD4KKworPHA+PGI+UGxlYXNlIG5vdGUgdGhhdCB0aGUgemlwIGZvcm1hdCBhbGxvd3MgbXVsdGlwbGUgZmlsZXMgb2YgdGhlIHNhbWUKK2Z1bGx5LXF1YWxpZmllZCBuYW1lIHRvIGV4aXN0IHdpdGhpbiBhIHNpbmdsZSBhcmNoaXZlLiBUaGlzIGhhcyBiZWVuCitkb2N1bWVudGVkIGFzIGNhdXNpbmcgdmFyaW91cyBwcm9ibGVtcyBmb3IgdW5zdXNwZWN0aW5nIHVzZXJzLiBJZiB5b3Ugd2lzaAordG8gYXZvaWQgdGhpcyBiZWhhdmlvciB5b3UgbXVzdCBzZXQgdGhlIDxjb2RlPmR1cGxpY2F0ZTwvY29kZT4gYXR0cmlidXRlCit0byBhIHZhbHVlIG90aGVyIHRoYW4gaXRzIGRlZmF1bHQsIDxjb2RlPiJhZGQiPC9jb2RlPi48L2I+PC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgSkFSIGZpbGUgdG8gY3JlYXRlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBqYXIgdGhlIGZpbGVzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXByZXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5vdCBvbmx5IHN0b3JlIGRhdGEgYnV0IGFsc28gY29tcHJlc3MgdGhlbSwKKyAgICBkZWZhdWx0cyB0byB0cnVlLiAgVW5sZXNzIHlvdSBzZXQgdGhlIDxlbT5rZWVwY29tcHJlc3Npb248L2VtPgorICAgIGF0dHJpYnV0ZSB0byBmYWxzZSwgdGhpcyB3aWxsIGFwcGx5IHRvIHRoZSBlbnRpcmUgYXJjaGl2ZSwgbm90CisgICAgb25seSB0aGUgZmlsZXMgeW91J3ZlIGFkZGVkIHdoaWxlIHVwZGF0aW5nLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXBjb21wcmVzc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Gb3IgZW50cmllcyBjb21pbmcgZnJvbSBleGlzdGluZyBhcmNoaXZlcyAobGlrZQorICAgIG5lc3RlZCA8ZW0+emlwZmlsZXNldDwvZW0+cyBvciB3aGlsZSB1cGRhdGluZyB0aGUgYXJjaGl2ZSksIGtlZXAKKyAgICB0aGUgY29tcHJlc3Npb24gYXMgaXQgaGFzIGJlZW4gb3JpZ2luYWxseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQorICAgIDxlbT5jb21wcmVzczwvZW0+IGF0dHJpYnV0ZS4gIERlZmF1bHRzIGZhbHNlLiAgPGVtPlNpbmNlIEFudAorICAgIDEuNjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcworICAgICAgaW5zaWRlIHRoZSBhcmNoaXZlLiAgRGVmYXVsdHMgdG8gVVRGOC4gPHN0cm9uZz5JdCBpcyBub3QKKyAgICAgIHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGlzIHZhbHVlIGFzIHRoZSBjcmVhdGVkIGFyY2hpdmUgd2lsbCBtb3N0CisgICAgICBsaWtlbHkgYmUgdW5yZWFkYWJsZSBmb3IgSmF2YSBvdGhlcndpc2UuPC9zdHJvbmc+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXNvbmx5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3JlIG9ubHkgZmlsZSBlbnRyaWVzLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCisgICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCisgICAgICBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdAorICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmlmZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS4gIFRoaXMgY2FuIGJlIGVpdGhlciB0aGUgbG9jYXRpb24gb2YgYSBtYW5pZmVzdCwgb3IgdGhlIG5hbWUgb2YgYSBqYXIgYWRkZWQgdGhyb3VnaCBhIGZpbGVzZXQuICBJZiBpdHMgdGhlIG5hbWUgb2YgYW4gYWRkZWQgamFyLCB0aGUgdGFzayBleHBlY3RzIHRoZSBtYW5pZmVzdCB0byBiZSBpbiB0aGUgamFyIGF0IE1FVEEtSU5GL01BTklGRVNULk1GPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXNldG1hbmlmZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJlaGF2aW9yIHdoZW4gYSBNYW5pZmVzdCBpcyBmb3VuZCBpbiBhIHppcGZpbGVzZXQgb3IgemlwZ3JvdXBmaWxlc2V0IGZpbGUgaXMgZm91bmQuICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O3NraXAmcXVvdDssICZxdW90O21lcmdlJnF1b3Q7LCBhbmQgJnF1b3Q7bWVyZ2V3aXRob3V0bWFpbiZxdW90Oy4gICZxdW90O21lcmdlJnF1b3Q7IHdpbGwgbWVyZ2UgYWxsIG9mIHRoZSBtYW5pZmVzdHMgdG9nZXRoZXIsIGFuZCBtZXJnZSB0aGlzIGludG8gYW55IG90aGVyIHNwZWNpZmllZCBtYW5pZmVzdHMuICAmcXVvdDttZXJnZXdpdGhvdXRtYWluJnF1b3Q7IG1lcmdlcyBldmVyeXRoaW5nIGJ1dCB0aGUgTWFpbiBzZWN0aW9uIG9mIHRoZSBtYW5pZmVzdHMuICBEZWZhdWx0IHZhbHVlIGlzICZxdW90O3NraXAmcXVvdDsuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXBkYXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIHRvIHVwZGF0ZSBvciBvdmVyd3JpdGUKKyAgICAgIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLiAgRGVmYXVsdCBpcyAmcXVvdDtmYWxzZSZxdW90Oy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj53aGVubWFuaWZlc3Rvbmx5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJlaGF2aW9yIHdoZW4gbm8gZmlsZXMgbWF0Y2guICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2ZhaWwmcXVvdDssICZxdW90O3NraXAmcXVvdDssIGFuZCAmcXVvdDtjcmVhdGUmcXVvdDsuICBEZWZhdWx0IGlzICZxdW90O2NyZWF0ZSZxdW90Oy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kdXBsaWNhdGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YmVoYXZpb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGZvdW5kLiAgVmFsaWQgdmFsdWVzIGFyZSAmcXVvdDthZGQmcXVvdDssICZxdW90O3ByZXNlcnZlJnF1b3Q7LCBhbmQgJnF1b3Q7ZmFpbCZxdW90Oy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzICZxdW90O2FkZCZxdW90Oy4gIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGV4PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgdG8gY3JlYXRlIGFuIDxBCisgICAgSFJFRj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2phci9qYXIuaHRtbCNKQVIlMjBJbmRleCI+aW5kZXgKKyAgICBsaXN0PC9BPiB0byBzcGVlZCB1cCBjbGFzc2xvYWRpbmcuICBUaGlzIGlzIGEgSkRLIDEuMysgc3BlY2lmaWMKKyAgICBmZWF0dXJlLiAgVW5sZXNzIHlvdSBzcGVjaWZ5IGFkZGl0aW9uYWwgamFycyB3aXRoIG5lc3RlZCA8YQorICAgIGhyZWY9IiNpbmRleGphcnMiPjxjb2RlPmluZGV4amFyczwvY29kZT48L2E+IGVsZW1lbnRzLCBvbmx5IHRoZQorICAgIGNvbnRlbnRzIG9mIHRoaXMgamFyIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGluZGV4LiAgRGVmYXVsdHMgdG8KKyAgICBmYWxzZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYW5pZmVzdGVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyB1c2VkIHRvIHJlYWQgdGhlIEpBUiBtYW5pZmVzdCwgd2hlbiBhIG1hbmlmZXN0IGZpbGUgaXMgc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtIGVuY29kaW5nLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJvdW5kdXA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2lsbCBiZQorICAgIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgZXZlbiBudW1iZXIgb2Ygc2Vjb25kcy48YnI+CisgICAgWmlwIGFyY2hpdmVzIHN0b3JlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpdGggYSBncmFudWxhcml0eSBvZgorICAgIHR3byBzZWNvbmRzLCBzbyB0aGUgdGltZXMgd2lsbCBlaXRoZXIgYmUgcm91bmRlZCB1cCBvciBkb3duLiAgSWYKKyAgICB5b3Ugcm91bmQgZG93biwgdGhlIGFyY2hpdmUgd2lsbCBhbHdheXMgc2VlbSBvdXQtb2YtZGF0ZSB3aGVuIHlvdQorICAgIHJlcnVuIHRoZSB0YXNrLCBzbyB0aGUgZGVmYXVsdCBpcyB0byByb3VuZCB1cC4gIFJvdW5kaW5nIHVwIG1heQorICAgIGxlYWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBvZiBwcm9ibGVtcyBsaWtlIEpTUHMgaW5zaWRlIGEgd2ViCisgICAgYXJjaGl2ZSB0aGF0IHNlZW0gdG8gYmUgc2xpZ2h0bHkgbW9yZSByZWNlbnQgdGhhbiBwcmVjb21waWxlZAorICAgIHBhZ2VzLCByZW5kZXJpbmcgcHJlY29tcGlsYXRpb24gdXNlbGVzcy48YnI+CisgICAgRGVmYXVsdHMgdG8gdHJ1ZS4gIDxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxldmVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5vbi1kZWZhdWx0IGxldmVsIGF0IHdoaWNoIGZpbGUgY29tcHJlc3Npb24gc2hvdWxkIGJlCisgICAgcGVyZm9ybWVkLiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChubyBjb21wcmVzc2lvbi9mYXN0ZXN0KSB0byA5CisgICAgKG1heGltdW0gY29tcHJlc3Npb24vc2xvd2VzdCkuIDxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdHJpY3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q29uZmlndXJlcyBob3cgdG8gaGFuZGxlIGJyZWFrcyBvZiB0aGUgcGFja2FnaW5nIHZlcnNpb24KKyAgICBzcGVjaWZpY2F0aW9uOiA8dWw+CisgICAgPGxpPjxiPmZhaWw8L2I+ID0gdGhyb3dzIGEgQnVpbGRFeGNlcHRpb248L2xpPgorICAgIDxsaT48Yj53YXJuPC9iPiA9IGxvZ3MgYSBtZXNzYWdlIG9uIHdhcm4gbGV2ZWw8L2xpPgorICAgIDxsaT48Yj5pZ25vcmU8L2I+ID0gbG9ncyBhIG1lc3NhZ2Ugb24gdmVyYm9zZSBsZXZlbCAoZGVmYXVsdCk8L2xpPgorICAgIDwvdWw+CisgICAgPGVtPlNpbmNlIEFudCAxLjcuMTwvZW0+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byA8dHQ+aWdub3JlPC90dD4uIDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5tZXRhaW5mPC9oND4KKzxwPlRoZSBuZXN0ZWQgPGNvZGU+bWV0YWluZjwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMgYSA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbAorZW5kIHVwIGluIHRoZSA8Y29kZT5NRVRBLUlORjwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZSBqYXIgZmlsZS4gSWYgdGhpcworZmlsZXNldCBpbmNsdWRlcyBhIGZpbGUgbmFtZWQgPGNvZGU+TUFOSUZFU1QuTUY8L2NvZGU+LCB0aGUgZmlsZSBpcworaWdub3JlZCBhbmQgeW91IHdpbGwgZ2V0IGEgd2FybmluZy48L3A+CisKKzxoND5tYW5pZmVzdDwvaDQ+Cis8cD5UaGUgbWFuaWZlc3QgbmVzdGVkIGVsZW1lbnQgYWxsb3dzIHRoZSBtYW5pZmVzdCBmb3IgdGhlIEphciBmaWxlIHRvCitiZSBwcm92aWRlZCBpbmxpbmUgaW4gdGhlIGJ1aWxkIGZpbGUgcmF0aGVyIHRoYW4gaW4gYW4gZXh0ZXJuYWwKK2ZpbGUuIFRoaXMgZWxlbWVudCBpcyBpZGVudGljYWwgdG8gdGhlCis8YSBocmVmPSJtYW5pZmVzdC5odG1sIj5tYW5pZmVzdDwvYT4gdGFzaywgYnV0IHRoZSBmaWxlIGFuZCBtb2RlCithdHRyaWJ1dGVzIG11c3QgYmUgb21pdHRlZC48L3A+Cis8cD4KK0lmIGJvdGggYW4gaW5saW5lIG1hbmlmZXN0IGFuZCBhbiBleHRlcm5hbCBmaWxlIGFyZSBib3RoIHNwZWNpZmllZCwgdGhlCittYW5pZmVzdHMgYXJlIG1lcmdlZC4KKzwvcD4KKworPHA+V2hlbiB1c2luZyBpbmxpbmUgbWFuaWZlc3RzLCB0aGUgSmFyIHRhc2sgd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBtYW5pZmVzdAorY29udGVudHMgaGF2ZSBjaGFuZ2VkIChpLmUuIHRoZSBtYW5pZmVzdCBhcyBzcGVjaWZpZWQgaXMgZGlmZmVyZW50IGluIGFueSB3YXkKK2Zyb20gdGhlIG1hbmlmZXN0IHRoYXQgZXhpc3RzIGluIHRoZSBKYXIsIGlmIGl0IGV4aXN0cy4KK0lmIHRoZSBtYW5pZmVzdCB2YWx1ZXMgaGF2ZSBjaGFuZ2VkIHRoZSBqYXIgd2lsbCBiZSB1cGRhdGVkIG9yIHJlYnVpbHQsIGFzCithcHByb3ByaWF0ZS4KKzwvcD4KKworPGEgbmFtZT0iaW5kZXhqYXJzIj48aDQ+aW5kZXhqYXJzPC9oND48L2E+CisKKzxwPjxlbT5zaW5jZSBhbnQgMS42LjI8L2VtPjwvcD4KKworPHA+VGhlIG5lc3RlZCA8Y29kZT5pbmRleGphcnM8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzIGEgPGEKK2hyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4uICBJdHMgY29udGVudCBpcworY29tcGxldGVseSBpZ25vcmVkIHVubGVzcyB5b3Ugc2V0IHRoZSBpbmRleCBhdHRyaWJ1dGUgb2YgdGhlIHRhc2sgdG8KK3RydWUuPC9wPgorCis8cD5UaGUgaW5kZXggY3JlYXRlZCBieSB0aGlzIHRhc2sgd2lsbCBjb250YWluIGluZGljZXMgZm9yIHRoZQorYXJjaGl2ZXMgY29udGFpbmVkIGluIHRoaXMgcGF0aCwgdGhlIG5hbWVzIHVzZWQgZm9yIHRoZSBhcmNoaXZlcworZGVwZW5kIG9uIHlvdXIgbWFuaWZlc3Q6PC9wPgorPHVsPgorICA8bGk+SWYgdGhlIGdlbmVyYXRlZCBqYXIncyBtYW5pZmVzdCBjb250YWlucyBubyBDbGFzcy1QYXRoCisgIGF0dHJpYnV0ZSwgdGhlIGZpbGUgbmFtZSB3aXRob3V0IGFueSBsZWFkaW5nIGRpcmVjdG9yeSBwYXRoIHdpbGwgYmUKKyAgdXNlZCBhbmQgYWxsIHBhcnRzIG9mIHRoZSBwYXRoIHdpbGwgZ2V0IGluZGV4ZWQuPC9saT4KKyAgPGxpPklmIHRoZSBtYW5pZmVzdCBjb250YWlucyBhIENsYXNzLVBhdGggYXR0cmlidXRlLCB0aGlzIHRhc2sgd2lsbAorICB0cnkgdG8gZ3Vlc3Mgd2hpY2ggcGFydCBvZiB0aGUgQ2xhc3MtUGF0aCBiZWxvbmdzIHRvIGEgZ2l2ZW4KKyAgYXJjaGl2ZS4gIElmIGl0IGNhbm5vdCBndWVzcyBhIG5hbWUsIHRoZSBhcmNoaXZlIHdpbGwgYmUgc2tpcHBlZCwKKyAgb3RoZXJ3aXNlIHRoZSBuYW1lIGxpc3RlZCBpbnNpZGUgdGhlIENsYXNzLVBhdGggYXR0cmlidXRlIHdpbGwgYmUKKyAgdXNlZC48L2xpPgorPC91bD4KKworPHA+VGhpcyB0YXNrIHdpbGwgbm90IGNyZWF0ZSBhbnkgaW5kZXggZW50cmllcyBmb3IgYXJjaGl2ZXMgdGhhdCBhcmUKK2VtcHR5IG9yIG9ubHkgY29udGFpbiBmaWxlcyBpbnNpZGUgdGhlIE1FVEEtSU5GIGRpcmVjdG9yeS48L3A+Cis8YSBuYW1lPSJzZXJ2aWNlIj48aDQ+c2VydmljZTwvaDQ+PC9hPgorCis8cD48ZW0+c2luY2UgYW50IDEuNy4wPC9lbT48L3A+CisKKzxwPgorICBUaGUgbmVzdGVkIDxjb2RlPnNlcnZpY2U8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzIGEgc2VydmljZS4KKyAgU2VydmljZXMgYXJlIGRlc2NyaWJlZCBieQorICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9qYXIvamFyLmh0bWwjU2VydmljZSUyMFByb3ZpZGVyIj5odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9qYXIvamFyLmh0bWwjU2VydmljZSUyMFByb3ZpZGVyPC9hPi4KKyAgVGhlIGFwcHJvYWNoIGlzIHRvIGhhdmUgcHJvdmlkZXJzIEpBUnMgaW5jbHVkZSBmaWxlcyBuYW1lZCBieSB0aGUgc2VydmljZQorICBwcm92aWRlZCwgZm9yIGV4YW1wbGUsCisgIE1FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVGYWN0b3J5CisgIHdoaWNoIGNhbiBpbmNsdWRlIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWVzLCBvbmUgcGVyIGxpbmUgKHVzdWFsbHkganVzdCBvbmUgcGVyIEpBUikuCisKKyAgVGhlIG5hbWUgb2YgdGhlCisgIHNlcnZpY2UgaXMgc2V0IGJ5IHRoZSAidHlwZSIgYXR0cmlidXRlLiBUaGUgY2xhc3NuYW1lIGltcGxlbWVudGluZworICB0aGUgc2VydmljZSBpcyB0aGUgdGhlICJwcm92aWRlciIgYXR0cmlidXRlLCBvciBpdCBvbmUgd2FudHMgdG8KKyAgc3BlY2lmeSBhIG51bWJlciBvZiBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoZSBzZXJ2aWNlLCBieQorICAicHJvdmlkZXIiIG5lc3RlZCBlbGVtZW50cy4KKzwvcD4KKzxwPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgc2VydmljZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvdmlkZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGUgY2xhc3NuYW1lIG9mIHRoZSBjbGFzcyBpbXBsZW1lbmluZyB0aGUgc2VydmljZS4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgdGhlcmUgaXMgYSBuZXN0ZWQKKyAgICAgIDxjb2RlPiZsdDtwcm92aWRlciZndDs8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisgIDxwPgorICAgIFRoZSBwcm92aWRlciBjbGFzc25hbWUgaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgInByb3ZpZGVyIiBhdHRyaWJ1dGUsIG9yCisgICAgYnkgYSBuZXN0ZWQgJmx0O3Byb3ZpZGVyJmd0OyBlbGVtZW50LCB3aGljaCBoYXMgYSBzaW5nbGUgImNsYXNzbmFtZSIgYXR0cmlidXRlLgorICAgIElmIGEgSkFSIGZpbGUgaGFzIG1vcmUgdGhhdCBvbmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UsIGEgbnVtYmVyIG9mCisgICAgbmVzdGVkICZsdDtwcm92aWRlciZndDsgZWxlbWVudHMgbWF5IGJlIHVzZWQuCisgIDwvcD4KKyAgCisgIAorPGgzPkV4YW1wbGVzPC9oMz4KKworPHByZT4gICZsdDtqYXIgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9saWIvYXBwLmphciZxdW90OyBiYXNlZGlyPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsvJmd0OzwvcHJlPgorPHA+amFycyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+IGRpcmVjdG9yeSBpbnRvIGEgZmlsZQorY2FsbGVkIDxjb2RlPmFwcC5qYXI8L2NvZGU+IGluIHRoZSA8Y29kZT4ke2Rpc3R9L2xpYjwvY29kZT4gZGlyZWN0b3J5LjwvcD4KKworPHByZT4gICZsdDtqYXIgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9saWIvYXBwLmphciZxdW90OworICAgICAgIGJhc2VkaXI9JnF1b3Q7JHtidWlsZH0vY2xhc3NlcyZxdW90OworICAgICAgIGV4Y2x1ZGVzPSZxdW90OyoqL1Rlc3QuY2xhc3MmcXVvdDsKKyAgLyZndDs8L3ByZT4KKzxwPmphcnMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT4ke2J1aWxkfS9jbGFzc2VzPC9jb2RlPiBkaXJlY3RvcnkgaW50byBhIGZpbGUKK2NhbGxlZCA8Y29kZT5hcHAuamFyPC9jb2RlPiBpbiB0aGUgPGNvZGU+JHtkaXN0fS9saWI8L2NvZGU+IGRpcmVjdG9yeS4gRmlsZXMKK3dpdGggdGhlIG5hbWUgPGNvZGU+VGVzdC5jbGFzczwvY29kZT4gYXJlIGV4Y2x1ZGVkLjwvcD4KKworPHByZT4gICZsdDtqYXIgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9saWIvYXBwLmphciZxdW90OworICAgICAgIGJhc2VkaXI9JnF1b3Q7JHtidWlsZH0vY2xhc3NlcyZxdW90OworICAgICAgIGluY2x1ZGVzPSZxdW90O215cGFja2FnZS90ZXN0LyoqJnF1b3Q7CisgICAgICAgZXhjbHVkZXM9JnF1b3Q7KiovVGVzdC5jbGFzcyZxdW90OworICAvJmd0OzwvcHJlPgorPHA+amFycyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+IGRpcmVjdG9yeSBpbnRvIGEgZmlsZQorY2FsbGVkIDxjb2RlPmFwcC5qYXI8L2NvZGU+IGluIHRoZSA8Y29kZT4ke2Rpc3R9L2xpYjwvY29kZT4gZGlyZWN0b3J5LiBPbmx5CitmaWxlcyB1bmRlciB0aGUgZGlyZWN0b3J5IDxjb2RlPm15cGFja2FnZS90ZXN0PC9jb2RlPiBhcmUgdXNlZCwgYW5kIGZpbGVzIHdpdGgKK3RoZSBuYW1lIDxjb2RlPlRlc3QuY2xhc3M8L2NvZGU+IGFyZSBleGNsdWRlZC48L3A+CisKKzxwcmU+ICAmbHQ7amFyIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbGliL2FwcC5qYXImcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsKKyAgICAgICAgICAgICBleGNsdWRlcz0mcXVvdDsqKi9UZXN0LmNsYXNzJnF1b3Q7CisgICAgLyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzcmN9L3Jlc291cmNlcyZxdW90Oy8mZ3Q7CisgICZsdDsvamFyJmd0OzwvcHJlPgorPHA+amFycyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+IGRpcmVjdG9yeSBhbmQgYWxzbworaW4gdGhlIDxjb2RlPiR7c3JjfS9yZXNvdXJjZXM8L2NvZGU+IGRpcmVjdG9yeSB0b2dldGhlciBpbnRvIGEgZmlsZQorY2FsbGVkIDxjb2RlPmFwcC5qYXI8L2NvZGU+IGluIHRoZSA8Y29kZT4ke2Rpc3R9L2xpYjwvY29kZT4gZGlyZWN0b3J5LgorRmlsZXMgd2l0aCB0aGUgbmFtZSA8Y29kZT5UZXN0LmNsYXNzPC9jb2RlPiBhcmUgZXhjbHVkZWQuCitJZiB0aGVyZSBhcmUgZmlsZXMgc3VjaCBhcyA8Y29kZT4ke2J1aWxkfS9jbGFzc2VzL215cGFja2FnZS9NeUNsYXNzLmNsYXNzPC9jb2RlPgorYW5kIDxjb2RlPiR7c3JjfS9yZXNvdXJjZXMvbXlwYWNrYWdlL2ltYWdlLmdpZjwvY29kZT4sIHRoZXkgd2lsbCBhcHBlYXIKK2luIHRoZSBzYW1lIGRpcmVjdG9yeSBpbiB0aGUgSkFSIChhbmQgdGh1cyBiZSBjb25zaWRlcmVkIGluIHRoZSBzYW1lIHBhY2thZ2UKK2J5IEphdmEpLjwvcD4KKworPHByZT4gICZsdDtqYXIgZGVzdGZpbGU9JnF1b3Q7dGVzdC5qYXImcXVvdDsgYmFzZWRpcj0mcXVvdDsuJnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7YnVpbGQmcXVvdDsvJmd0OworICAgICZsdDttYW5pZmVzdCZndDsKKyAgICAgICZsdDshLS0gV2hvIGlzIGJ1aWxkaW5nIHRoaXMgamFyPyAtLSZndDsKKyAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtCdWlsdC1CeSZxdW90OyB2YWx1ZT0mcXVvdDske3VzZXIubmFtZX0mcXVvdDsvJmd0OworICAgICAgJmx0OyEtLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3JhbSBpdHNlbGYgLS0mZ3Q7CisgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb24tVmVuZG9yJnF1b3Q7IHZhbHVlPSZxdW90O0FDTUUgaW5jLiZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb24tVGl0bGUmcXVvdDsgdmFsdWU9JnF1b3Q7R3JlYXRQcm9kdWN0JnF1b3Q7LyZndDsKKyAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtJbXBsZW1lbnRhdGlvbi1WZXJzaW9uJnF1b3Q7IHZhbHVlPSZxdW90OzEuMC4wYmV0YTImcXVvdDsvJmd0OworICAgICAgJmx0OyEtLSBkZXRhaWxzIC0tJmd0OworICAgICAgJmx0O3NlY3Rpb24gbmFtZT0mcXVvdDtjb21tb24vY2xhc3MxLmNsYXNzJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7U2VhbGVkJnF1b3Q7IHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKKyAgICAgICZsdDsvc2VjdGlvbiZndDsKKyAgICAmbHQ7L21hbmlmZXN0Jmd0OworICAmbHQ7L2phciZndDs8L3ByZT4KKzxwPgorVGhpcyBpcyBhbiBleGFtcGxlIG9mIGFuIGlubGluZSBtYW5pZmVzdCBzcGVjaWZpY2F0aW9uIGluY2x1ZGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgYnVpbGQKK3Byb2dyYW0gKEltcGxlbWVudGF0aW9uLVZlcnNpb24pLiBOb3RlIHRoYXQgdGhlIEJ1aWx0LUJ5IGF0dHJpYnV0ZSB3aWxsIHRha2UgdGhlIHZhbHVlIG9mIHRoZSBBbnQgCitwcm9wZXJ0eSAke3VzZXIubmFtZX0uIFRoZSBtYW5pZmVzdCBwcm9kdWNlZCBieSB0aGUgYWJvdmUgd291bGQgbG9vayBsaWtlIHRoaXM6Cis8L3A+Cis8cHJlPjxjb2RlPk1hbmlmZXN0LVZlcnNpb246IDEuMAorQnVpbHQtQnk6IGNvbm9yCitJbXBsZW1lbnRhdGlvbi1WZW5kb3I6IEFDTUUgaW5jLgorSW1wbGVtZW50YXRpb24tVGl0bGU6IEdyZWF0UHJvZHVjdAorSW1wbGVtZW50YXRpb24tVmVyc2lvbjogMS4wLjBiZXRhMgorQ3JlYXRlZC1CeTogQXBhY2hlIEFudCAxLjcuMAorCitOYW1lOiBjb21tb24vTXlDbGFzcy5jbGFzcworU2VhbGVkOiBmYWxzZTwvY29kZT48L3ByZT4KKworCis8cD4KKyAgVGhlIGZvbGxvd2luZyBzaG93cyBob3cgdG8gY3JlYXRlIGEgamFyIGZpbGUgc3BlY2lmaW5nIGEgc2VydmljZQorICB3aXRoIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKREs2IHNjcmlwdGluZyBpbnRlcmZhY2U6Cis8L3A+Cis8YmxvY2txdW90ZT48cHJlPiZsdDtqYXIgamFyZmlsZT0icGlua3kuamFyIiZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzIi8mZ3Q7CisgICZsdDtzZXJ2aWNlIHR5cGU9ImphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVGYWN0b3J5IgorICAgICAgICAgICBwcm92aWRlcj0ib3JnLmFjbWUuUGlua3lMYW5ndWFnZSIvJmd0OworJmx0Oy9qYXImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPgorICBUaGUgZm9sbG93aW5nIHNob3dzIGhvdyB0byBjcmVhdGUgYSBqYXIgZmlsZSBzcGVjaWZpbmcgYSBzZXJ2aWNlCisgIHdpdGggdHdvIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgSkRLNiBzY3JpcHRpbmcgaW50ZXJmYWNlOgorPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtqYXIgamFyZmlsZT0icGlua3lhbmRicmFpbi5qYXIiJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9ImNsYXNzZXMiLyZndDsKKyAgJmx0O3NlcnZpY2UgdHlwZT0iamF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZUZhY3RvcnkiJmd0OworICAgICZsdDtwcm92aWRlciBjbGFzc25hbWU9Im9yZy5hY21lLlBpbmt5TGFuZ3VhZ2UiLyZndDsKKyAgICAmbHQ7cHJvdmlkZXIgY2xhc3NuYW1lPSJvcmcuYWNtZS5CcmFpbkxhbmd1YWdlIi8mZ3Q7CisgICZsdDsvc2VydmljZSZndDsKKyZsdDsvamFyJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2phdmEuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9qYXZhLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0NmQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9qYXZhLmh0bWwKQEAgLTAsMCArMSwzOTUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SmF2YSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJqYXZhIj5KYXZhPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+RXhlY3V0ZXMgYSBKYXZhIGNsYXNzIHdpdGhpbiB0aGUgcnVubmluZyAoQW50KSBWTSBvciBmb3JrcyBhbm90aGVyIFZNIGlmCitzcGVjaWZpZWQuPC9wPgorPHA+CitJZiBvZGQgdGhpbmdzIGdvIHdyb25nIHdoZW4geW91IHJ1biB0aGlzIHRhc2ssIHNldCBmb3JrPSJ0cnVlIiB0byB1c2UgYSBuZXcKK0pWTS4KKworPHA+QXMgb2YgQW50IDEuNi4zLCB5b3UgY2FuIGludGVyYWN0IHdpdGggYSBmb3JrZWQgVk0sIGFzIHdlbGwgYXMKK3NlbmRpbmcgaW5wdXQgdG8gaXQgdmlhIHRoZSA8Y29kZT5pbnB1dDwvY29kZT4gYW5kIDxjb2RlPmlucHV0c3RyaW5nPC9jb2RlPgorYXR0cmlidXRlcy48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzbmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgSmF2YSBjbGFzcyB0byBleGVjdXRlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5FaXRoZXIgPHR0PmphcjwvdHQ+IG9yIDx0dD5jbGFzc25hbWU8L3R0PjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmphcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbG9jYXRpb24gb2YgdGhlIGphciBmaWxlIHRvIGV4ZWN1dGUgKG11c3QgaGF2ZSBhCisgICAgTWFpbi1DbGFzcyBlbnRyeSBpbiB0aGUgbWFuaWZlc3QpLiBGb3JrIG11c3QgYmUgc2V0IHRvIHRydWUgaWYgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQuCisgICAgU2VlIG5vdGVzIGJlbG93IGZvciBtb3JlIGRldGFpbHMuCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPkVpdGhlciA8dHQ+amFyPC90dD4gb3IgPHR0PmNsYXNzbmFtZTwvdHQ+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YXJnczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYXJndW1lbnRzIGZvciB0aGUgY2xhc3MgdGhhdCBpcworICAgICAgZXhlY3V0ZWQuIDxiPmRlcHJlY2F0ZWQsIHVzZSBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+CisgICAgICBlbGVtZW50cyBpbnN0ZWFkLjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzcGF0aCB0byB1c2UuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyA8YQorICAgICAgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JrPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlmIGVuYWJsZWQgdHJpZ2dlcnMgdGhlIGNsYXNzIGV4ZWN1dGlvbiBpbiBhbm90aGVyIFZNCisgICAgICAoZGlzYWJsZWQgYnkgZGVmYXVsdCk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcGF3bjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZiBlbmFibGVkIGFsbG93cyB0byBzdGFydCBhIHByb2Nlc3Mgd2hpY2ggd2lsbCBvdXRsaXZlIGFudC48YnI+CisgICAgUmVxdWlyZXMgZm9yaz10cnVlLCBhbmQgbm90IGNvbXBhdGlibGUKKyAgICB3aXRoIHRpbWVvdXQsIGlucHV0LCBvdXRwdXQsIGVycm9yLCByZXN1bHQgYXR0cmlidXRlcy48YnI+CisgICAgICAoZGlzYWJsZWQgYnkgZGVmYXVsdCk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5qdm08L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNvbW1hbmQgdXNlZCB0byBpbnZva2UgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLAorICAgICAgZGVmYXVsdCBpcyAnamF2YScuICBUaGUgY29tbWFuZCBpcyByZXNvbHZlZCBieSBqYXZhLmxhbmcuUnVudGltZS5leGVjKCkuCisgICAgICBJZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQuCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+anZtYXJnczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGZvcmtlZCBWTSAoaWdub3JlZAorICAgICAgaWYgZm9yayBpcyBkaXNhYmxlZCkuIDxiPmRlcHJlY2F0ZWQsIHVzZSBuZXN0ZWQKKyAgICAgIDxjb2RlPiZsdDtqdm1hcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbnN0ZWFkLjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TWF4IGFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgdG8gdGhlIGZvcmtlZCBWTQorICAgICAgKGlnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZCk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCisgICAgICByZXR1cm5jb2RlIG90aGVyIHRoYW4gMC4gRGVmYXVsdCBpcyAiZmFsc2UiIChzZWUgPGEgaHJlZj0iI2ZhaWxvbmVycm9yIj5ub3RlPC9hPik8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXN1bHRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUKKyAgICAgIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gT25seSBvZiBpbnRlcmVzdCBpZiBmYWlsb25lcnJvcj1mYWxzZQorICAgICAgYW5kIGlmIGZvcms9dHJ1ZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIFZNIGluLiAgKGlnbm9yZWQgaWYKKyAgICAgIGZvcmsgaXMgZGlzYWJsZWQpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYSBmaWxlIHRvIHdoaWNoIHRvIHdyaXRlIHRoZSBvdXRwdXQuIElmIHRoZSBlcnJvciBzdHJlYW0KKyAgICAgIGlzIG5vdCBhbHNvIHJlZGlyZWN0ZWQgdG8gYSBmaWxlIG9yIHByb3BlcnR5LCBpdCB3aWxsIGFwcGVhciBpbiB0aGlzIG91dHB1dC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlCisgICAgICByZWRpcmVjdGVkLiA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2dFcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHdoZW4geW91IHdpc2ggdG8gc2VlIGVycm9yIG91dHB1dCBpbiBBbnQncworICAgICAgICAgICAgICAgICAgICAgbG9nIGFuZCB5b3UgYXJlIHJlZGlyZWN0aW5nIG91dHB1dCB0byBhIGZpbGUvcHJvcGVydHkuIFRoZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS9wcm9wZXJ0eS4gSWYgeW91CisgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCBlcnJvciB3aXRoIHRoZSAmcXVvdDtlcnJvciZxdW90OyBvciAmcXVvdDtlcnJvclByb3BlcnR5JnF1b3Q7CisgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLCB0aGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YXBwZW5kPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgb3V0cHV0IGFuZCBlcnJvciBmaWxlcyBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXR0ZW4uCisgICAgRGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgb3V0cHV0IG9mIHRoZQorICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBVbmxlc3MgdGhlIGVycm9yIHN0cmVhbSBpcyByZWRpcmVjdGVkIHRvIGEgc2VwYXJhdGUKKyAgICAgIGZpbGUgb3Igc3RyZWFtLCB0aGlzIHByb3BlcnR5IHdpbGwgaW5jbHVkZSB0aGUgZXJyb3Igb3V0cHV0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9ycHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlCisgICAgICBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5wdXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmaWxlIGZyb20gd2hpY2ggdGhlIGV4ZWN1dGVkIGNvbW1hbmQncyBzdGFuZGFyZCBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgaXMgdGFrZW4uIFRoaXMgYXR0cmlidXRlIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgaW5wdXRzdHJpbmcgYXR0cmlidXRlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIHRvIHRha2Ugc3RhbmRhcmQgaW5wdXQgZnJvbSBjb25zb2xlCisgICAgICAgICh1bmxlc3MgPGNvZGU+c3Bhd249InRydWUiPC9jb2RlPik8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dHN0cmluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIHN0cmluZyB3aGljaCBzZXJ2ZXMgYXMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBjb21tYW5kLiBUaGlzIGF0dHJpYnV0ZSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0IGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgdG8gdGFrZSBzdGFuZGFyZCBpbnB1dCBmcm9tIGNvbnNvbGUKKyAgICAgICAgKHVubGVzcyA8Y29kZT5zcGF3bj0idHJ1ZSI8L2NvZGU+KTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5ld2Vudmlyb25tZW50PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBwcm9wYWdhdGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3CisgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC4gRGVmYXVsdCBpcyAmcXVvdDtmYWxzZSZxdW90OworICAgICAgKGlnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZCkuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGltZW91dDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBjb21tYW5kIGlmIGl0IGRvZXNuJ3QgZmluaXNoIHdpdGhpbiB0aGUKKyAgICBzcGVjaWZpZWQgdGltZSAoZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzKS4gIDxzdHJvbmc+SXQgaXMgaGlnaGx5CisgICAgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IGlmIGZvcmsgaXMgZW5hYmxlZC48L3N0cm9uZz48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbG9uZXZtPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHNldCB0byB0cnVlLCB0aGVuIGFsbCBzeXN0ZW0gcHJvcGVydGllcworICAgICAgYW5kIHRoZSBib290Y2xhc3NwYXRoIG9mIHRoZSBmb3JrZWQgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgd2lsbCBiZQorICAgICAgdGhlIHNhbWUgYXMgdGhvc2Ugb2YgdGhlIEphdmEgVk0gcnVubmluZyBBbnQuICBEZWZhdWx0IGlzCisgICAgICAmcXVvdDtmYWxzZSZxdW90OyAoaWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkKS4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0PmFyZyBhbmQganZtYXJnPC9oND4KKzxwPlVzZSBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4KK2VsZW1lbnRzIHRvIHNwZWNpZnkgYXJndW1lbnRzIGZvciB0aGUgSmF2YSBjbGFzcyBhbmQgdGhlIGZvcmtlZCBWTSByZXNwZWN0aXZlbHkuCitTZWUgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQgbGluZSBhcmd1bWVudHM8L2E+LjwvcD4KKzxoND5zeXNwcm9wZXJ0eTwvaDQ+Cis8cD5Vc2UgbmVzdGVkIDxjb2RlPiZsdDtzeXNwcm9wZXJ0eSZndDs8L2NvZGU+CitlbGVtZW50cyB0byBzcGVjaWZ5IHN5c3RlbSBwcm9wZXJ0aWVzIHJlcXVpcmVkIGJ5IHRoZSBjbGFzcy4KK1RoZXNlIHByb3BlcnRpZXMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgVk0gZHVyaW5nIHRoZSBleGVjdXRpb24KK29mIHRoZSBjbGFzcyAoZWl0aGVyIEFOVCdzIFZNIG9yIHRoZSBmb3JrZWQgVk0pLiBUaGUgYXR0cmlidXRlcworZm9yIHRoaXMgZWxlbWVudCBhcmUgdGhlIHNhbWUgYXMgZm9yIDxhIGhyZWY9ImV4ZWMuaHRtbCNlbnYiPmVudmlyb25tZW50Cit2YXJpYWJsZXM8L2E+LjwvcD4KKworPGg0PnN5c3Byb3BlcnR5c2V0PC9oND4KKworPHA+WW91IGNhbiBzcGVjaWZ5IGEgc2V0IG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBhcyBzeXN0ZW0gcHJvcGVydGllcword2l0aCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+c3lzcHJvcGVydHlzZXQ8L2E+cy48L3A+CisKKzxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC9wPgorCis8aDQ+Y2xhc3NwYXRoPC9oND4KKzxwPjxjb2RlPkphdmE8L2NvZGU+J3MgPGk+Y2xhc3NwYXRoPC9pPiBhdHRyaWJ1dGUgaXMgYSA8YQoraHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRIIGxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZAorPGk+Y2xhc3NwYXRoPC9pPiBlbGVtZW50LjwvcD4KKworPGg0PmJvb3RjbGFzc3BhdGg8L2g0PgorCis8cD5UaGUgbG9jYXRpb24gb2YgYm9vdHN0cmFwIGNsYXNzIGZpbGVzIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhpcworPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRIIGxpa2Ugc3RydWN0dXJlPC9hPiAtIHdpbGwgYmUgaWdub3JlZAoraWYgPGk+Zm9yazwvaT4gaXMgbm90IDxjb2RlPnRydWU8L2NvZGU+IG9yIHRoZSB0YXJnZXQgVk0gZG9lc24ndAorc3VwcG9ydCBpdCAoaS5lLiBKYXZhIDEuMSkuPC9wPgorCis8cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvcD4KKworPGg0PmVudjwvaDQ+Cis8cD5JdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZQorZm9ya2VkIFZNIHZpYSBuZXN0ZWQgPGk+ZW52PC9pPiBlbGVtZW50cy4gU2VlIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUKK3NlY3Rpb24gYWJvdXQgPGEgaHJlZj0iZXhlYy5odG1sI2VudiI+ZXhlYzwvYT48L3A+Cis8cD5TZXR0aW5ncyB3aWxsIGJlIGlnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZC48L3A+CisKKzxoND5wZXJtaXNzaW9uczwvaDQ+Cis8cD5TZWN1cml0eSBwZXJtaXNzaW9ucyBjYW4gYmUgcmV2b2tlZCBhbmQgZ3JhbnRlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKK2NsYXNzIHZpYSBhIG5lc3RlZCA8aT5wZXJtaXNzaW9uczwvaT4gZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlCitzZWUgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Blcm1pc3Npb25zLmh0bWwiPnBlcm1pc3Npb25zPC9hPjwvcD4KKzxwPldoZW4gdGhlIHBlcm1pc3Npb24gUnVudGltZVBlcm1pc3Npb24gZXhpdFZNIGhhcyBub3QgYmVlbiBncmFudGVkIChvciBoYXMKK2JlZW4gcmV2b2tlZCkgdGhlIFN5c3RlbS5leGl0KCkgY2FsbCB3aWxsIGJlIGludGVyY2VwdGVkCithbmQgdHJlYXRlZCBsaWtlIGluZGljYXRlZCBpbiA8aT5mYWlsb25lcnJvcjwvaT4uPC9wPgorPHA+Tm90ZTo8YnI+CitJZiB5b3UgZG8gbm90IHNwZWNpZnkgcGVybWlzc2lvbnMsCithIHNldCBvZiBkZWZhdWx0IHBlcm1pc3Npb25zIHdpbGwgYmUgYWRkZWQgdG8geW91ciBKYXZhIGludm9jYXRpb24gdG8gbWFrZQorc3VyZSB0aGF0IHRoZSBhbnQgcnVuIHdpbGwgY29udGludWUgb3IgdGVybWluYXRlZCBhcyBpbmRpY2F0ZWQgYnkKKzxpPmZhaWxvbmVycm9yPC9pPi4gQWxsIHBlcm1pc3Npb25zIG5vdCBncmFudGVkIHBlciBkZWZhdWx0IHdpbGwgYmUKK2NoZWNrZWQgYnkgd2hhdGV2ZXIgc2VjdXJpdHkgbWFuYWdlciB3YXMgYWxyZWFkeSBpbiBwbGFjZS4gZXhpdFZNIHdpbGwgYmUKK2Rpc2FsbG93ZWQuCis8L3A+Cis8cD5TZXR0aW5ncyB3aWxsIGJlIGlnbm9yZWQgaWYgZm9yayBpcyBlbmFibGVkLjwvcD4KKworPHA+PGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3A+CisKKzxoND5hc3NlcnRpb25zPC9oND4KKworPHA+WW91IGNhbiBjb250cm9sIGVuYWJsZW1lbnQgb2YgSmF2YSAxLjQgYXNzZXJ0aW9ucyB3aXRoIGFuCis8YSBocmVmPSIuLi9Db3JlVHlwZXMvYXNzZXJ0aW9ucy5odG1sIj48dHQ+Jmx0O2Fzc2VydGlvbnMmZ3Q7PC90dD48L2E+CitzdWJlbGVtZW50LjwvcD4KKworPHA+QXNzZXJ0aW9uIHN0YXRlbWVudHMgYXJlIGN1cnJlbnRseSBpZ25vcmVkIGluIG5vbi1mb3JrZWQgbW9kZS48L3A+CisKKzxwPjxlbT5zaW5jZSBBbnQgMS42LjwvZW0+PC9wPgorCis8YSBuYW1lPSJyZWRpcmVjdG9yIj48aDQ+cmVkaXJlY3RvcjwvaDQ+PC9hPgorPGk+PGI+U2luY2UgQW50IDEuNi4yPC9iPjwvaT4KKzxwPkEgbmVzdGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZWRpcmVjdG9yLmh0bWwiPkkvTyBSZWRpcmVjdG9yPC9hPgorY2FuIGJlIHNwZWNpZmllZC4gIEluIGdlbmVyYWwsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWRpcmVjdG9yIGJlaGF2ZQorYXMgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcyBhdmFpbGFibGUgYXQgdGhlIHRhc2sgbGV2ZWwuICBUaGUgbW9zdAorbm90YWJsZSBwZWN1bGlhcml0eSBzdGVtcyBmcm9tIHRoZSByZXRlbnRpb24gb2YgdGhlIDxjb2RlPiZsdDtqYXZhJmd0OzwvY29kZT4KK2F0dHJpYnV0ZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgQW55IGZpbGUgbWFwcGluZyBpcyBkb25lCit1c2luZyBhIDxDT0RFPm51bGw8L0NPREU+IHNvdXJjZWZpbGU7IHRoZXJlZm9yZSBub3QgYWxsCis8YSBocmVmPSIuLi9Db3JlVHlwZXMvbWFwcGVyLmh0bWwiPk1hcHBlcjwvYT4gdHlwZXMgd2lsbCByZXR1cm4KK3Jlc3VsdHMuICBXaGVuIG5vIHJlc3VsdHMgYXJlIHJldHVybmVkLCByZWRpcmVjdGlvbiBzcGVjaWZpY2F0aW9ucword2lsbCBmYWxsIGJhY2sgdG8gdGhlIHRhc2sgbGV2ZWwgYXR0cmlidXRlcy4gIEluIHByYWN0aWNlIHRoaXMgbWVhbnMgdGhhdAorZGVmYXVsdHMgY2FuIGJlIHNwZWNpZmllZCBmb3IgaW5wdXQsIG91dHB1dCwgYW5kIGVycm9yIG91dHB1dCBmaWxlcy4KKzwvcD4KKzxoMz5FcnJvcnMgYW5kIHJldHVybiBjb2RlczwvaDM+CitCeSBkZWZhdWx0IHRoZSByZXR1cm4gY29kZSBvZiBhIDxjb2RlPiZsdDtqYXZhJmd0OzwvY29kZT4gaXMgaWdub3JlZC4KK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gc2V0IDxjb2RlPnJlc3VsdHByb3BlcnR5PC9jb2RlPiB0byB0aGUgbmFtZQorb2YgYSBwcm9wZXJ0eSBhbmQgaGF2ZSBpdCBhc3NpZ25lZCB0byB0aGUgcmVzdWx0IGNvZGUgKGJhcnJpbmcgaW1tdXRhYmlsaXR5LAorb2YgY291cnNlKS4KK1doZW4geW91IHNldCA8Y29kZT5mYWlsb25lcnJvcj0idHJ1ZSI8L2NvZGU+LCB0aGUgb25seSBwb3NzaWJsZSB2YWx1ZSBmb3IKKzxjb2RlPnJlc3VsdHByb3BlcnR5PC9jb2RlPiBpcyAwLiBBbnkgbm9uLXplcm8gcmVzcG9uc2UgaXMgdHJlYXRlZCBhcyBhbgorZXJyb3IgYW5kIHdvdWxkIG1lYW4gdGhlIGJ1aWxkIGV4aXRzLgorPHA+IFNpbWlsYXJseSwgaWYgPGNvZGU+ZmFpbG9uZXJyb3I9ImZhbHNlIjwvY29kZT4gYW5kIDxjb2RlPmZvcms9ImZhbHNlIjwvY29kZT4KKywgdGhlbiA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IDxiPm11c3Q8L2I+IHJldHVybiAwIG90aGVyd2lzZSB0aGUgYnVpbGQgd2lsbAorZXhpdCwgYXMgdGhlIGNsYXNzIHdhcyBydW4gYnkgdGhlIGJ1aWxkIEpWTS48L3A+CisKKzxoMz5KQVIgZmlsZSBleGVjdXRpb248L2gzPgorCis8cD5UaGUgcGFyYW1ldGVyIG9mIHRoZSA8dHQ+amFyPC90dD4gYXR0cmlidXRlIGlzIG9mIHR5cGUgPHR0PkZpbGU8L3R0PjsKK3RoYXQgaXMsIHRoZSBwYXJhbWV0ZXIgaXMgcmVzb2x2ZWQgdG8gYW4gYWJzb2x1dGUgZmlsZSByZWxhdGl2ZSB0byB0aGUKK2Jhc2UgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0LCA8aT5ub3Q8L2k+IHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIEphdmEKK3Rhc2sgaXMgcnVuLiBJZiB5b3UgbmVlZCB0byBsb2NhdGUgYSBKQVIgZmlsZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5Cit0aGUgdGFzayB3aWxsIGJlIHJ1biBpbiwgeW91IG5lZWQgdG8gZXhwbGljaXRseSBjcmVhdGUgdGhlIGZ1bGwgcGF0aAordG8gdGhlIEpBUiBmaWxlLjwvcD4KKzxwPldoZW4gdXNpbmcgdGhlIDx0dD5qYXI8L3R0PiBhdHRyaWJ1dGUsIGFsbCBjbGFzc3BhdGggc2V0dGluZ3MgYXJlIAoraWdub3JlZCBhY2NvcmRpbmcgdG8gPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvdG9vbGRvY3Mvd2luZG93cy9qYXZhLmh0bWwjLWphciI+U3VuJ3MKK3NwZWNpZmljYXRpb248L2E+LiAKKworCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyAgICAgICAmbHQ7amF2YSBjbGFzc25hbWU9JnF1b3Q7dGVzdC5NYWluJnF1b3Q7Jmd0OworICAgICAgICAgJmx0O2FyZyB2YWx1ZT0mcXVvdDstaCZxdW90Oy8mZ3Q7CisgICAgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7ZGlzdC90ZXN0LmphciZxdW90Oy8mZ3Q7CisgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7amF2YS5jbGFzcy5wYXRofSZxdW90Oy8mZ3Q7CisgICAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAgICAmbHQ7L2phdmEmZ3Q7Cis8L3ByZT4KK1J1biBhIGNsYXNzIGluIHRoaXMgSlZNIHdpdGggYSBuZXcgamFyIG9uIHRoZSBjbGFzc3BhdGgKKworPHByZT4KKyAgICAgICAmbHQ7amF2YSBqYXI9JnF1b3Q7ZGlzdC90ZXN0LmphciZxdW90OworICAgICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSIKKyAgICAgICAgICAgbWF4bWVtb3J5PSIxMjhtIgorICAgICAgICAgICAmZ3Q7CisgICAgICAgICAmbHQ7YXJnIHZhbHVlPSZxdW90Oy1oJnF1b3Q7LyZndDsKKyAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDtkaXN0L3Rlc3QuamFyJnF1b3Q7LyZndDsKKyAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqYXZhLmNsYXNzLnBhdGh9JnF1b3Q7LyZndDsKKyAgICAgICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAgICAgICZsdDsvamF2YSZndDsKKzwvcHJlPgorUnVuIHRoZSBKQVIgdGVzdC5qYXIgaW4gdGhpcyBwcm9qZWN0J3MgZGlzdC9saWIgZGlyZWN0b3J5LgordXNpbmcgdGhlIG1hbmlmZXN0IHN1cHBsaWVkIGVudHJ5IHBvaW50LCBmb3JraW5nIChhcyByZXF1aXJlZCksCithbmQgd2l0aCBhIG1heGltdW0gbWVtb3J5IG9mIDEyOE1CLiBBbnkgbm9uIHplcm8gcmV0dXJuIGNvZGUgYnJlYWtzIHRoZSBidWlsZC4KKworPHByZT4KKyAgICAgICAmbHQ7amF2YQorICAgICAgICAgICBkaXI9IiR7ZXhlYy5kaXJ9IgorICAgICAgICAgICBqYXI9JnF1b3Q7JHtleGVjLmRpcn0vZGlzdC90ZXN0LmphciZxdW90OworICAgICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSIKKyAgICAgICAgICAgbWF4bWVtb3J5PSIxMjhtIgorICAgICAgICAgICAmZ3Q7CisgICAgICAgICAmbHQ7YXJnIHZhbHVlPSZxdW90Oy1oJnF1b3Q7LyZndDsKKyAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDtkaXN0L3Rlc3QuamFyJnF1b3Q7LyZndDsKKyAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqYXZhLmNsYXNzLnBhdGh9JnF1b3Q7LyZndDsKKyAgICAgICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAgICAgICZsdDsvamF2YSZndDsKKzwvcHJlPgorUnVuIHRoZSBKQVIgZGlzdC90ZXN0LmphciByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5Cis8dHQ+JHtleGVjLmRpcn08L3R0PiwgdGhpcyBiZWluZyB0aGUgc2FtZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgSlZNCitpcyB0byBzdGFydCB1cC4KKworPHByZT4gICZsdDtqYXZhIGNsYXNzbmFtZT0mcXVvdDt0ZXN0Lk1haW4mcXVvdDsvJmd0OzwvcHJlPgorUnVucyBhIGdpdmVuIGNsYXNzIHdpdGggdGhlIGN1cnJlbnQgY2xhc3NwYXRoLgorCis8cHJlPgorICAmbHQ7amF2YSBjbGFzc25hbWU9JnF1b3Q7dGVzdC5NYWluJnF1b3Q7CisgICAgICAgIGZvcms9JnF1b3Q7eWVzJnF1b3Q7ICZndDsKKyAgICAmbHQ7c3lzcHJvcGVydHkga2V5PSZxdW90O0RFQlVHJnF1b3Q7IHZhbHVlPSZxdW90O3RydWUmcXVvdDsvJmd0OworICAgICZsdDthcmcgdmFsdWU9JnF1b3Q7LWgmcXVvdDsvJmd0OworICAgICZsdDtqdm1hcmcgdmFsdWU9JnF1b3Q7LVhydW5ocHJvZjpjcHU9c2FtcGxlcyxmaWxlPWxvZy50eHQsZGVwdGg9MyZxdW90Oy8mZ3Q7CisgICZsdDsvamF2YSZndDsKKzwvcHJlPgorQWRkIHN5c3RlbSBwcm9wZXJ0aWVzIGFuZCBKVk0tcHJvcGVydGllcyB0byB0aGUgSlZNIGFzIGluCis8Y29kZT5qYXZhID0iLVhydW5ocHJvZjpjcHU9c2FtcGxlcyxmaWxlPWxvZy50eHQsZGVwdGg9MyAtRERFQlVHPXRydWUgdGVzdC5NYWluPC9jb2RlPgorCis8cHJlPiAgJmx0O2phdmEgY2xhc3NuYW1lPSZxdW90O1Nob3dKYXZhVmVyc2lvbiZxdW90OyBjbGFzc3BhdGg9JnF1b3Q7LiZxdW90OworICAgICAgICBqdm09JnF1b3Q7cGF0aC10by1qYXZhMTQtaG9tZS9iaW4vamF2YSZxdW90OyBmb3JrPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgdGFza25hbWU9JnF1b3Q7amF2YTEuNCZxdW90OyAmZ3Q7Cis8L3ByZT4KK1VzZSBhIGdpdmVuIEphdmEgaW1wbGVtZW50YXRpb24gKGFub3RoZXIgdGhlIG9uZSBBbnQgaXMgY3VycmVudGx5IHVzaW5nKSB0byBydW4gdGhlIGNsYXNzLgorRm9yIGRvY3VtZW50YXRpb24gaW4gdGhlIGxvZyA8Y29kZT50YXNrbmFtZTwvY29kZT4gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIDxjb2RlPltqYXZhXTwvY29kZT4KK2xvZy1wcmVmaXggdG8gPGNvZGU+W2phdmExLjRdPC9jb2RlPi4KKworCis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IHlvdSBjYW4gbm90IHNwZWNpZnkgdGhlIChoaWdobHkgZGVwcmVjYXRlZCkgTVNKVk0sICJqdmlldy5leGUiIGFzIHRoZQorSlZNLCBhcyBpdCB0YWtlcyBkaWZmZXJlbnQgcGFyYW1ldGVycyBmb3Igb3RoZXIgSlZNcywKK1RoYXQgSlZNIGNhbiBiZSBzdGFydGVkIGZyb20gPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiBpZiByZXF1aXJlZC48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2phdmFjLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvamF2YWMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDVmOWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2phdmFjLmh0bWwKQEAgLTAsMCArMSw3OTYgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIGxhbmc9ImVuLXVzIj4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkphdmFjIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImphdmFjIj5KYXZhYzwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkNvbXBpbGVzIGEgSmF2YSBzb3VyY2UgdHJlZS48L3A+Cis8cD5UaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2lsbCBiZSByZWN1cnNpdmVseSBzY2FubmVkIGZvciBKYXZhCitzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4gT25seSBKYXZhIGZpbGVzIHRoYXQgaGF2ZSBubyBjb3JyZXNwb25kaW5nCis8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGUKK29yIHdoZXJlIHRoZSBjbGFzcyBmaWxlIGlzIG9sZGVyIHRoYW4gdGhlCis8Y29kZT4uamF2YTwvY29kZT4gZmlsZSB3aWxsIGJlIGNvbXBpbGVkLjwvcD4KKzxwPk5vdGU6IEFudCB1c2VzIG9ubHkgdGhlIG5hbWVzIG9mIHRoZSBzb3VyY2UgYW5kIGNsYXNzIGZpbGVzIHRvIGZpbmQKK3RoZSBjbGFzc2VzIHRoYXQgbmVlZCBhIHJlYnVpbGQuIEl0IHdpbGwgbm90IHNjYW4gdGhlIHNvdXJjZSBhbmQgdGhlcmVmb3JlCit3aWxsIGhhdmUgbm8ga25vd2xlZGdlIGFib3V0IG5lc3RlZCBjbGFzc2VzLCBjbGFzc2VzIHRoYXQgYXJlIG5hbWVkIGRpZmZlcmVudAorZnJvbSB0aGUgc291cmNlIGZpbGUsIGFuZCBzbyBvbi4gU2VlIHRoZQorPGEgaHJlZj0iLi4vT3B0aW9uYWxUYXNrcy9kZXBlbmQuaHRtbCI+PGNvZGU+Jmx0O2RlcGVuZCZndDs8L2NvZGU+PC9hPiB0YXNrCitmb3IgZGVwZW5kZW5jeSBjaGVja2luZyBiYXNlZCBvbiBvdGhlciB0aGFuIGp1c3QKK2V4aXN0ZW5jZS9tb2RpZmljYXRpb24gdGltZXMuPC9wPgorPHA+V2hlbiB0aGUgc291cmNlIGZpbGVzIGFyZSBwYXJ0IG9mIGEgcGFja2FnZSwgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YKK3RoZSBzb3VyY2UgdHJlZSBzaG91bGQgZm9sbG93IHRoZSBwYWNrYWdlCitoaWVyYXJjaHkuPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgY29tcGlsZWQuCitUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiwgPGNvZGU+aW5jbHVkZXNmaWxlPC9jb2RlPiwKKzxjb2RlPmV4Y2x1ZGVzPC9jb2RlPiwgYW5kIDxjb2RlPmV4Y2x1ZGVzZmlsZTwvY29kZT4KK2F0dHJpYnV0ZXMuIFdpdGggdGhlIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiBvcgorPGNvZGU+aW5jbHVkZXNmaWxlPC9jb2RlPiBhdHRyaWJ1dGUsIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0bworaGF2ZSBpbmNsdWRlZC4KK1RoZSA8Y29kZT5leGNsdWRlPC9jb2RlPiBvciA8Y29kZT5leGNsdWRlc2ZpbGU8L2NvZGU+IGF0dHJpYnV0ZSBpcyB1c2VkCit0byBzcGVjaWZ5Cit0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gSW4gYm90aCBjYXNlcywgdGhlIGxpc3Qgb2YgZmlsZXMKK2NhbiBiZSBzcGVjaWZpZWQgYnkgZWl0aGVyIHRoZSBmaWxlbmFtZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeShzKSBzcGVjaWZpZWQKK2luIHRoZSA8Y29kZT5zcmNkaXI8L2NvZGU+IGF0dHJpYnV0ZSBvciBuZXN0ZWQgPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+CitlbGVtZW50KHMpLCBvciBieSB1c2luZyB3aWxkY2FyZCBwYXR0ZXJucy4gU2VlIHRoZSBzZWN0aW9uIG9uCis8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeS1iYXNlZCB0YXNrczwvYT4sCitmb3IgaW5mb3JtYXRpb24gb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSB3aWxkY2FyZCBwYXR0ZXJucy48L3A+Cis8cD5JdCBpcyBwb3NzaWJsZSB0byB1c2UgZGlmZmVyZW50IGNvbXBpbGVycy4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGJ5CitlaXRoZXIgc2V0dGluZyB0aGUgZ2xvYmFsIDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBwcm9wZXJ0eSwgd2hpY2ggd2lsbAorYWZmZWN0IGFsbCA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrcyB0aHJvdWdob3V0IHRoZSBidWlsZCwgb3IgYnkKK3NldHRpbmcgdGhlIDxjb2RlPmNvbXBpbGVyPC9jb2RlPiBhdHRyaWJ1dGUsIHNwZWNpZmljIHRvIHRoZSBjdXJyZW50Cis8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrLgorPGEgbmFtZT0iY29tcGlsZXJ2YWx1ZXMiPlZhbGlkIHZhbHVlcyBmb3IgZWl0aGVyIHRoZQorPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5IG9yIHRoZSA8Y29kZT5jb21waWxlcjwvY29kZT4KK2F0dHJpYnV0ZSBhcmU6PC9hPjwvcD4KKzx1bD4KKyAgPGxpPjxjb2RlPmNsYXNzaWM8L2NvZGU+ICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgSkRLIDEuMS8xLjIpICZuZGFzaDsKKyAgICAgIDxjb2RlPmphdmFjMS4xPC9jb2RlPiBhbmQKKyAgICAgIDxjb2RlPmphdmFjMS4yPC9jb2RlPiBjYW4gYmUgdXNlZCBhcyBhbGlhc2VzLjwvbGk+CisgIDxsaT48Y29kZT5tb2Rlcm48L2NvZGU+ICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgSkRLIDEuMy8xLjQvMS41LzEuNikgJm5kYXNoOworICAgICAgPGNvZGU+amF2YWMxLjM8L2NvZGU+IGFuZAorICAgICAgPGNvZGU+amF2YWMxLjQ8L2NvZGU+IGFuZAorICAgICAgPGNvZGU+amF2YWMxLjU8L2NvZGU+IGFuZAorICAgICAgPGNvZGU+amF2YWMxLjY8L2NvZGU+IGNhbiBiZSB1c2VkIGFzIGFsaWFzZXMuPC9saT4KKyAgPGxpPjxjb2RlPmppa2VzPC9jb2RlPiAodGhlIDxhCisgICAgaHJlZj0iaHR0cDovL2ppa2VzLnNvdXJjZWZvcmdlLm5ldC8iIHRhcmdldD0iX3RvcCI+SmlrZXM8L2E+CisgICAgY29tcGlsZXIpLjwvbGk+CisgIDxsaT48Y29kZT5qdmM8L2NvZGU+ICh0aGUgQ29tbWFuZC1MaW5lIENvbXBpbGVyIGZyb20gTWljcm9zb2Z0J3MgU0RLCisgICAgICBmb3IgSmF2YSAvIFZpc3VhbCBKKyspICZuZGFzaDsgPGNvZGU+bWljcm9zb2Z0PC9jb2RlPiBjYW4gYmUgdXNlZAorICAgICAgYXMgYW4gYWxpYXMuPC9saT4KKyAgPGxpPjxjb2RlPmtqYzwvY29kZT4gKHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmRtcy5hdC9rb3BpLyIgdGFyZ2V0PSJfdG9wIj5rb3BpPC9hPgorICAgIGNvbXBpbGVyKS48L2xpPgorICA8bGk+PGNvZGU+Z2NqPC9jb2RlPiAodGhlIGdjaiBjb21waWxlciBmcm9tIGdjYykuPC9saT4KKyAgPGxpPjxjb2RlPnNqPC9jb2RlPiAoU3ltYW50ZWMgamF2YSBjb21waWxlcikgJm5kYXNoOworICAgICAgPGNvZGU+c3ltYW50ZWM8L2NvZGU+IGNhbiBiZSB1c2VkIGFzIGFuIGFsaWFzLjwvbGk+CisgIDxsaT48Y29kZT5leHRKYXZhYzwvY29kZT4gKHJ1biBlaXRoZXIgbW9kZXJuIG9yIGNsYXNzaWMgaW4gYSBKVk0gb2YKKyAgICAgIGl0cyBvd24pLjwvbGk+Cis8L3VsPgorPHA+VGhlIGRlZmF1bHQgaXMgPGNvZGU+amF2YWMxLng8L2NvZGU+IHdpdGggPGNvZGU+eDwvY29kZT4gZGVwZW5kaW5nCitvbiB0aGUgSkRLIHZlcnNpb24geW91IHVzZSB3aGlsZSB5b3UgYXJlIHJ1bm5pbmcgQW50LgorSWYgeW91IHdpc2ggdG8gdXNlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGludGVyZmFjZSB0aGFuIHRob3NlCitzdXBwbGllZCwgeW91IGNhbiB3cml0ZSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgQ29tcGlsZXJBZGFwdGVyIGludGVyZmFjZQorKDxjb2RlPnBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzPC9jb2RlPikuIFN1cHBseSB0aGUgZnVsbAorY2xhc3NuYW1lIGluIHRoZSA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHkgb3IgdGhlCis8Y29kZT5jb21waWxlcjwvY29kZT4gYXR0cmlidXRlLgorPC9wPgorPHA+VGhlIGZvcmsgYXR0cmlidXRlIG92ZXJyaWRlcyB0aGUgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5CitvciA8Y29kZT5jb21waWxlcjwvY29kZT4gYXR0cmlidXRlIHNldHRpbmcgYW5kCitleHBlY3RzIGEgSkRLMS4xIG9yIGhpZ2hlciB0byBiZSBzZXQgaW4gPGNvZGU+SkFWQV9IT01FPC9jb2RlPi4KKzwvcD4KKzxwPllvdSBjYW4gYWxzbyB1c2UgdGhlIDxjb2RlPmNvbXBpbGVyPC9jb2RlPiBhdHRyaWJ1dGUgdG8gdGVsbCBBbnQKK3doaWNoIEpESyB2ZXJzaW9uIGl0IHNoYWxsIGFzc3VtZSB3aGVuIGl0IHB1dHMgdG9nZXRoZXIgdGhlIGNvbW1hbmQKK2xpbmUgc3dpdGNoZXMgLSBldmVuIGlmIHlvdSBzZXQgPGNvZGU+Zm9yaz0mcXVvdDt0cnVlJnF1b3Q7PC9jb2RlPi4KK1RoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJ1biB0aGUgY29tcGlsZXIgb2YgSkRLIDEuMSB3aGlsZSB5b3UKK2N1cnJlbnQgSkRLIGlzIDEuMisuICBJZiB5b3UgdXNlCis8Y29kZT5jb21waWxlcj0mcXVvdDtqYXZhYzEuMSZxdW90OzwvY29kZT4gYW5kIChmb3IgZXhhbXBsZSkKKzxjb2RlPmRlcGVuZD0mcXVvdDt0cnVlJnF1b3Q7PC9jb2RlPiBBbnQgd2lsbCB1c2UgdGhlIGNvbW1hbmQgbGluZQorc3dpdGNoIDxjb2RlPi1kZXBlbmQ8L2NvZGU+IGluc3RlYWQgb2YgPGNvZGU+LVhkZXBlbmQ8L2NvZGU+LjwvcD4KKzxwPlRoaXMgdGFzayB3aWxsIGRyb3AgYWxsIGVudHJpZXMgdGhhdCBwb2ludCB0byBub24tZXhpc3RlbnQKK2ZpbGVzL2RpcmVjdG9yaWVzIGZyb20gdGhlIGNsYXNzcGF0aCBpdCBwYXNzZXMgdG8gdGhlIGNvbXBpbGVyLjwvcD4KKzxwPjxzdHJvbmc+V2luZG93cyBOb3RlOjwvc3Ryb25nPldoZW4gdGhlIG1vZGVybiBjb21waWxlciBpcyB1c2VkCitpbiB1bmZvcmtlZCBtb2RlIG9uIFdpbmRvd3MsIGl0IGxvY2tzIHVwIHRoZSBmaWxlcyBwcmVzZW50IGluIHRoZQorY2xhc3NwYXRoIG9mIHRoZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrLCBhbmQgZG9lcyBub3QgcmVsZWFzZSB0aGVtLgorVGhlIHNpZGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBkZWxldGUgb3IgbW92ZQordGhvc2UgZmlsZXMgbGF0ZXIgb24gaW4gdGhlIGJ1aWxkLiAgVGhlIHdvcmthcm91bmQgaXMgdG8gZm9yayB3aGVuCitpbnZva2luZyB0aGUgY29tcGlsZXIuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkxvY2F0aW9uIG9mIHRoZSBqYXZhIGZpbGVzLiAoU2VlIHRoZQorICAgICA8YSBocmVmPSIjc3JjZGlybm90ZSI+bm90ZTwvYT4gYmVsb3cuKTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBuZXN0ZWQgPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBwcmVzZW50LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TG9jYXRpb24gdG8gc3RvcmUgdGhlIGNsYXNzIGZpbGVzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBmaWxlcyAobWF5IGJlIHNwZWNpZmllZCB1c2luZworICAgICAgd2lsZGNhcmQgcGF0dGVybnMpIHRoYXQgbXVzdCBiZQorICAgICAgaW5jbHVkZWQ7IGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGZpbGVzIHRvCisgICAgICBpbmNsdWRlIChtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIHdpbGRjYXJkIHBhdHRlcm5zKS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZXMgKG1heSBiZSBzcGVjaWZpZWQgdXNpbmcKKyAgICAgIHdpbGRjYXJkIHBhdHRlcm5zKSB0aGF0IG11c3QgYmUgZXhjbHVkZWQ7IG5vIGZpbGVzIChleGNlcHQgZGVmYXVsdAorICAgICAgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBmaWxlcyB0bworICAgICAgZXhjbHVkZSAobWF5IGJlIHNwZWNpZmllZCB1c2luZyB3aWxkY2FyZCBwYXR0ZXJucykuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZXBhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHNvdXJjZXBhdGggdG8gdXNlOyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgdGhlIHNyY2RpciBhdHRyaWJ1dGUgKG9yIG5lc3RlZCA8Y29kZT4mbHQ7c3JjJmd0OzwvY29kZT4gZWxlbWVudHMpLgorICAgICAgICBUbyBzdXBwcmVzcyB0aGUgc291cmNlcGF0aCBzd2l0Y2gsIHVzZSA8Y29kZT5zb3VyY2VwYXRoPSZxdW90OyZxdW90OzwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Ym9vdGNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIExvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlcy4gKFNlZSA8YSBocmVmPSIjYm9vdHN0cmFwIj5iZWxvdzwvYT4KKyAgICAgIGZvciB1c2luZyB0aGUgLVggYW5kIC1KLVggcGFyYW1ldGVycyBmb3Igc3BlY2lmaW5nCisgICAgICB0aGUgYm9vdHN0cmFwIGNsYXNzcGF0aCkuCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhCisgICAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZXBhdGhyZWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHNvdXJjZXBhdGggdG8gdXNlLCBnaXZlbiBhcyBhCisgICAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJvb3RjbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TG9jYXRpb24gb2YgYm9vdHN0cmFwIGNsYXNzIGZpbGVzLCBnaXZlbiBhcyBhCisgICAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4dGRpcnM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TG9jYXRpb24gb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RW5jb2Rpbmcgb2Ygc291cmNlIGZpbGVzLiAoTm90ZTogZ2NqIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAgdGhpcyBvcHRpb24geWV0Lik8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ub3dhcm48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIDxjb2RlPi1ub3dhcm48L2NvZGU+IHN3aXRjaAorICAgICAgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXI7IGRlZmF1bHRzIHRvIDxjb2RlPm9mZjwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoCisgICAgZGVidWcgaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIDxjb2RlPm9mZjwvY29kZT4uICBJZiBzZXQgdG8KKyAgICA8Y29kZT5vZmY8L2NvZGU+LCA8Y29kZT4tZzpub25lPC9jb2RlPiB3aWxsIGJlIHBhc3NlZCBvbiB0aGUKKyAgICBjb21tYW5kIGxpbmUgZm9yIGNvbXBpbGVycyB0aGF0IHN1cHBvcnQgaXQgKGZvciBvdGhlciBjb21waWxlcnMsIG5vCisgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdpbGwgYmUgdXNlZCkuICBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCisgICAgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5kZWJ1Z2xldmVsPC9jb2RlPiBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB0aGUKKyAgICBjb21tYW5kIGxpbmUgYXJndW1lbnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWdsZXZlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5LZXl3b3JkIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIDxjb2RlPi1nPC9jb2RlPgorICAgICAgY29tbWFuZC1saW5lIHN3aXRjaC4gIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0CisgICAgICA8Y29kZT5tb2Rlcm48L2NvZGU+LCA8Y29kZT5jbGFzc2ljKHZlciAmZ3Q7PSAxLjIpPC9jb2RlPiBhbmQgPGNvZGU+amlrZXM8L2NvZGU+LgorICAgICAgTGVnYWwgdmFsdWVzIGFyZSA8Y29kZT5ub25lPC9jb2RlPiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZQorICAgICAgZm9sbG93aW5nIGtleXdvcmRzOgorICAgICAgPGNvZGU+bGluZXM8L2NvZGU+LCA8Y29kZT52YXJzPC9jb2RlPiwgYW5kIDxjb2RlPnNvdXJjZTwvY29kZT4uCisgICAgICBJZiA8Y29kZT5kZWJ1Z2xldmVsPC9jb2RlPiBpcyBub3Qgc3BlY2lmaWVkLCBieSBkZWZhdWx0LAorICAgICAgbm90aGluZyB3aWxsIGJlCisgICAgICBhcHBlbmRlZCB0byA8Y29kZT4tZzwvY29kZT4uICBJZiA8Y29kZT5kZWJ1ZzwvY29kZT4gaXMgbm90IHR1cm5lZCBvbiwKKyAgICAgIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgaWdub3JlZC4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vcHRpbWl6ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIEluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aAorICAgICAgb3B0aW1pemF0aW9uOyBkZWZhdWx0cyB0byA8Y29kZT5vZmY8L2NvZGU+LiA8c3Ryb25nPk5vdGU8L3N0cm9uZz4KKyAgICAgIHRoYXQgdGhpcyBmbGFnIGlzIGp1c3QgaWdub3JlZCBieSBTdW4ncyA8Y29kZT5qYXZhYzwvY29kZT4gc3RhcnRpbmcKKyAgICAgIHdpdGggSkRLIDEuMyAoc2luY2UgY29tcGlsZS10aW1lIG9wdGltaXphdGlvbiBpcyB1bm5lY2Vzc2FyeSkuCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVwcmVjYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoCisgICAgICBkZXByZWNhdGlvbiBpbmZvcm1hdGlvbjsgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50YXJnZXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+R2VuZXJhdGUgY2xhc3MgZmlsZXMgZm9yIHNwZWNpZmljIFZNIHZlcnNpb24KKyAgICAoZS5nLiwgPGNvZGU+MS4xPC9jb2RlPiBvciA8Y29kZT4xLjI8L2NvZGU+KS4gPGI+Tm90ZSB0aGF0IHRoZQorICAgIGRlZmF1bHQgdmFsdWUgZGVwZW5kcyBvbiB0aGUgSlZNIHRoYXQgaXMgcnVubmluZyBBbnQuICBJbgorICAgIHBhcnRpY3VsYXIsIGlmIHlvdSB1c2UgSkRLIDEuNCsgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIHdpbGwgbm90IGJlCisgICAgdXNhYmxlIGZvciBhIDEuMSBKYXZhIFZNIHVubGVzcyB5b3UgZXhwbGljaXRseSBzZXQgdGhpcyBhdHRyaWJ1dGUKKyAgICB0byB0aGUgdmFsdWUgMS4xICh3aGljaCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgSkRLIDEuMSB0bworICAgIDEuMykuICBXZSBoaWdobHkgcmVjb21tZW5kIHRvIGFsd2F5cyBzcGVjaWZ5IHRoaXMKKyAgICBhdHRyaWJ1dGUuPC9iPjxicj4KKyAgICBBIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBwcm92aWRlZCB1c2luZyB0aGUgbWFnaWMKKyAgICA8YQorICAgIGhyZWY9Ii4uL2phdmFjcHJvcHMuaHRtbCN0YXJnZXQiPjxjb2RlPmFudC5idWlsZC5qYXZhYy50YXJnZXQ8L2NvZGU+PC9hPgorICAgIHByb3BlcnR5LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QXNrcyB0aGUgY29tcGlsZXIgZm9yIHZlcmJvc2Ugb3V0cHV0OyBkZWZhdWx0cyB0bworICAgICAgPGNvZGU+bm88L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlcGVuZDwvdGQ+IDx0ZCB2YWxpZ249InRvcCI+RW5hYmxlcyBkZXBlbmRlbmN5LXRyYWNraW5nCisgICAgICBmb3IgY29tcGlsZXJzIHRoYXQgc3VwcG9ydCB0aGlzICg8Y29kZT5qaWtlczwvY29kZT4gYW5kCisgICAgICA8Y29kZT5jbGFzc2ljPC9jb2RlPikuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUFudFJ1bnRpbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBpbmNsdWRlIHRoZSBBbnQgcnVuLXRpbWUgbGlicmFyaWVzIGluIHRoZQorICAgICAgY2xhc3NwYXRoOyBkZWZhdWx0cyB0byA8Y29kZT55ZXM8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVKYXZhUnVudGltZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGRlZmF1bHQgcnVuLXRpbWUKKyAgICAgIGxpYnJhcmllcyBmcm9tIHRoZSBleGVjdXRpbmcgVk0gaW4gdGhlIGNsYXNzcGF0aDsKKyAgICAgIGRlZmF1bHRzIHRvIDxjb2RlPm5vPC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JrPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gZXhlY3V0ZSA8Y29kZT5qYXZhYzwvY29kZT4gdXNpbmcgdGhlCisgICAgICBKREsgY29tcGlsZXIgZXh0ZXJuYWxseTsgZGVmYXVsdHMgdG8gPGNvZGU+bm88L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4ZWN1dGFibGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tcGxldGUgcGF0aCB0byB0aGUgPGNvZGU+amF2YWM8L2NvZGU+CisgICAgICBleGVjdXRhYmxlIHRvIHVzZSBpbiBjYXNlIG9mIDxjb2RlPmZvcms9JnF1b3Q7eWVzJnF1b3Q7PC9jb2RlPi4KKyAgICAgIERlZmF1bHRzIHRvIHRoZSBjb21waWxlciBvZiB0aGUgSmF2YSB2ZXJzaW9uIHRoYXQgaXMgY3VycmVudGx5CisgICAgICBydW5uaW5nIEFudC4gIElnbm9yZWQgaWYgPGNvZGU+Zm9yaz0mcXVvdDtubyZxdW90OzwvY29kZT4uPGJyPgorICAgICAgU2luY2UgQW50IDEuNiB0aGlzIGF0dHJpYnV0ZSBjYW4gYWxzbyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlCisgICAgICBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIHdoZW4gdXNpbmcgamlrZXMsIGp2YywgZ2NqIG9yIHNqLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1lbW9yeUluaXRpYWxTaXplPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbml0aWFsIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCisgICAgICBpZiA8Y29kZT5qYXZhYzwvY29kZT4gaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0cworICAgICAgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLgorICAgICAgKEV4YW1wbGVzOiA8Y29kZT44Mzg4NjA4MDwvY29kZT4sIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yCisgICAgICA8Y29kZT44MG08L2NvZGU+KTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1lbW9yeU1heGltdW1TaXplPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCisgICAgICBpZiA8Y29kZT5qYXZhYzwvY29kZT4gaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0cworICAgICAgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLgorICAgICAgKEV4YW1wbGVzOiA8Y29kZT44Mzg4NjA4MDwvY29kZT4sIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yCisgICAgICA8Y29kZT44MG08L2NvZGU+KTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIGNvbXBpbGF0aW9uIGVycm9ycworICAgICAgICB3aWxsIGZhaWwgdGhlIGJ1aWxkOyBkZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvclByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgVGhlIHByb3BlcnR5IHRvIHNldCAodG8gdGhlIHZhbHVlICJ0cnVlIikgaWYgY29tcGlsYXRpb24gZmFpbHMuCisgICAgICA8ZW0+U2luY2UgQW50IDEuNy4xPC9lbT4uCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c291cmNlPC90ZD4KKworICAgIDx0ZCB2YWxpZ249InRvcCI+VmFsdWUgb2YgdGhlIDxjb2RlPi1zb3VyY2U8L2NvZGU+IGNvbW1hbmQtbGluZQorICAgIHN3aXRjaDsgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgcHJpb3IgdG8KKyAgICA8Y29kZT5qYXZhYzEuNDwvY29kZT4gKG9yIDxjb2RlPm1vZGVybjwvY29kZT4gd2hlbiBBbnQgaXMgbm90CisgICAgcnVubmluZyBpbiBhIDEuMyBWTSkgYW5kIDxjb2RlPmppa2VzPC9jb2RlPi48YnI+IElmIHlvdSB1c2UgdGhpcworICAgIGF0dHJpYnV0ZSB0b2dldGhlciB3aXRoIDxjb2RlPmppa2VzPC9jb2RlPiwgeW91IG11c3QgbWFrZSBzdXJlCisgICAgdGhhdCB5b3VyIHZlcnNpb24gb2YgamlrZXMgc3VwcG9ydHMgdGhlIDxjb2RlPi1zb3VyY2U8L2NvZGU+CisgICAgc3dpdGNoLiAgQnkgZGVmYXVsdCwgbm8gPGNvZGU+LXNvdXJjZTwvY29kZT4gYXJndW1lbnQgd2lsbCBiZSB1c2VkCisgICAgYXQgYWxsLjxicj4KKyAgICA8Yj5Ob3RlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgZGVwZW5kcyBvbiB0aGUgSlZNIHRoYXQgaXMgcnVubmluZworICAgIEFudC4gIFdlIGhpZ2hseSByZWNvbW1lbmQgdG8gYWx3YXlzIHNwZWNpZnkgdGhpcworICAgIGF0dHJpYnV0ZS48L2I+PGJyPgorICAgIEEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHByb3ZpZGVkIHVzaW5nIHRoZSBtYWdpYworICAgIDxhCisgICAgaHJlZj0iLi4vamF2YWNwcm9wcy5odG1sI3NvdXJjZSI+PGNvZGU+YW50LmJ1aWxkLmphdmFjLnNvdXJjZTwvY29kZT48L2E+CisgICAgcHJvcGVydHkuPC90ZD4KKworICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLgorICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIHZhbHVlIG9mIHRoZQorICAgICAgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5LCBpZiBzZXQsIHdpbGwgYmUgdXNlZC4KKyAgICAgIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgY29tcGlsZXIgZm9yIHRoZSBjdXJyZW50IFZNIHdpbGwgYmUgdXNlZC4KKyAgICAgIChTZWUgdGhlIGFib3ZlIDxhIGhyZWY9IiNjb21waWxlcnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQKKyAgICAgIGNvbXBpbGVycy4pPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGlzdGZpbGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHRoZSBzb3VyY2UgZmlsZXMgdG8gYmUgY29tcGlsZWQgd2lsbAorICAgICAgYmUgbGlzdGVkOyBkZWZhdWx0cyB0byA8Y29kZT5ubzwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGVtcGRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGVyZSBBbnQgc2hvdWxkIHBsYWNlIHRlbXBvcmFyeSBmaWxlcy4KKyAgICAgIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSB0YXNrIGlzIGZvcmtlZCBhbmQgdGhlCisgICAgICBjb21tYW5kIGxpbmUgYXJncyBsZW5ndGggZXhjZWVkcyA0ay4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPgorICAgICAgTm87IGRlZmF1bHQgaXMgPGk+amF2YS5pby50bXBkaXI8L2k+LgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVwZGF0ZWRQcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIFRoZSBwcm9wZXJ0eSB0byBzZXQgKHRvIHRoZSB2YWx1ZSAidHJ1ZSIpIAorICAgICAgaWYgY29tcGlsYXRpb24gaGFzIHRha2VuIHBsYWNlCisgICAgICBhbmQgaGFzIGJlZW4gc3VjY2Vzc2Z1bC4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS43LjE8L2VtPi4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlRGVzdENsYXNzZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250cm9scyB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlCisgICAgICBkZXN0aW5hdGlvbiBjbGFzc2VzIGRpcmVjdG9yeSBpbiB0aGUgY2xhc3NwYXRoCisgICAgICBnaXZlbiB0byB0aGUgY29tcGlsZXIuCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGlzICJ0cnVlIiBhbmQgdGhpcworICAgICAgbWVhbnMgdGhhdCBwcmV2aW91c2x5IGNvbXBpbGVkIGNsYXNzZXMgYXJlIG9uCisgICAgICB0aGUgY2xhc3NwYXRoIGZvciB0aGUgY29tcGlsZXIuIFRoaXMgbWVhbnMgdGhhdCAiZ3JlZWR5IiBjb21waWxlcnMKKyAgICAgIHdpbGwgbm90IHJlY29tcGlsZSBkZXBlbmRhbnQgY2xhc3NlcyB0aGF0IGFyZSBhbHJlYWR5IGNvbXBpbGVkLgorICAgICAgSW4gZ2VuZXJhbCB0aGlzIGlzIGEgZ29vZCB0aGluZyBhcyBpdCBzdG9wcyB0aGUgY29tcGlsZXIKKyAgICAgIGZvciBkb2luZyB1bm5lY2Vzc2FyeSB3b3JrLiBIb3dldmVyLCBmb3Igc29tZSBlZGdlIGNhc2VzLAorICAgICAgaW52b2x2aW5nIGdlbmVyaWNzLCB0aGUgamF2YWMgY29tcGlsZXIKKyAgICAgIG5lZWRzIHRvIGNvbXBpbGUgdGhlIGRlcGVuZGFudCBjbGFzc2VzIHRvIGdldCB0aGUgZ2VuZXJpY3MKKyAgICAgIGluZm9ybWF0aW9uLiBPbmUgZXhhbXBsZSBpcyBkb2N1bWVudGVkIGluIHRoZSBidWcgcmVwb3J0OgorICAgICAgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MDc3NiI+CisgICAgICAgIEJ1ZyA0MDc3NiAtIGEgcHJvYmxlbSBjb21waWxpbmcgYSBKYXZhIDUgcHJvamVjdCB3aXRoIGdlbmVyaWNzPC9hPi4KKyAgICAgIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byAiZmFsc2UiIHdpbGwgY2F1c2UgdGhlIGNvbXBpbGVyCisgICAgICB0byByZWNvbXBpbGUgZGVwZW5kZW50IGNsYXNzZXMuCisgICAgICA8ZW0+U2luY2UgQW50IDEuNy4xPC9lbT4uCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vIC0gZGVmYXVsdCBpcyAidHJ1ZSI8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCitzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+CisoPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPnNyY2RpcjwvY29kZT4pIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAorPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKKzxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorPGg0Pjxjb2RlPnNyYzwvY29kZT4sIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4sIDxjb2RlPnNvdXJjZXBhdGg8L2NvZGU+LAorPGNvZGU+Ym9vdGNsYXNzcGF0aDwvY29kZT4gYW5kIDxjb2RlPmV4dGRpcnM8L2NvZGU+PC9oND4KKzxwPjxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+J3MgPGNvZGU+c3JjZGlyPC9jb2RlPiwgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiwKKzxjb2RlPnNvdXJjZXBhdGg8L2NvZGU+LCA8Y29kZT5ib290Y2xhc3NwYXRoPC9jb2RlPiwgYW5kCis8Y29kZT5leHRkaXJzPC9jb2RlPiBhdHRyaWJ1dGVzIGFyZQorPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlczwvYT4KK2FuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIG5lc3RlZAorPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+LAorPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+LAorPGNvZGU+Jmx0O3NvdXJjZXBhdGgmZ3Q7PC9jb2RlPiwKKzxjb2RlPiZsdDtib290Y2xhc3NwYXRoJmd0OzwvY29kZT4gYW5kCis8Y29kZT4mbHQ7ZXh0ZGlycyZndDs8L2NvZGU+IGVsZW1lbnRzLCByZXNwZWN0aXZlbHkuPC9wPgorCis8aDQ+Y29tcGlsZXJhcmc8L2g0PgorCis8cD5Zb3UgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgY29tcGlsZXIKK3dpdGggbmVzdGVkIDxjb2RlPiZsdDtjb21waWxlcmFyZyZndDs8L2NvZGU+IGVsZW1lbnRzLiAgVGhlc2UgZWxlbWVudHMKK2FyZSBzcGVjaWZpZWQgbGlrZSA8YSBocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZC1saW5lCitBcmd1bWVudHM8L2E+IGJ1dCBoYXZlIGFuIGFkZGl0aW9uYWwgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8KK2VuYWJsZSBhcmd1bWVudHMgb25seSBpZiBhIGdpdmVuIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHdpbGwgYmUKK3VzZWQuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjQiPlNlZQorICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSI0Ij5FeGFjdGx5IG9uZSBvZiB0aGVzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5saW5lPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGg8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+CisgICAgPHRkPk9ubHkgcGFzcyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IGlmIHRoZSBjaG9zZW4KKyAgICAgIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIG1hdGNoZXMgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLgorICAgICAgTGVnYWwgdmFsdWVzIGFyZSB0aGUKKyAgICAgIHNhbWUgYXMgdGhvc2UgaW4gdGhlIGFib3ZlIDxhIGhyZWY9IiNjb21waWxlcnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQKKyAgICAgIGNvbXBpbGVycy4pPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgICAgY2xhc3NwYXRoPSZxdW90O3h5ei5qYXImcXVvdDsKKyAgICAgICAgIGRlYnVnPSZxdW90O29uJnF1b3Q7CisgICAgICAgICBzb3VyY2U9JnF1b3Q7MS40JnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD5jb21waWxlcyBhbGwgPGNvZGU+LmphdmE8L2NvZGU+IGZpbGVzIHVuZGVyIHRoZSA8Y29kZT4ke3NyY308L2NvZGU+CitkaXJlY3RvcnksIGFuZCBzdG9yZXMKK3RoZSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIGluIHRoZSA8Y29kZT4ke2J1aWxkfTwvY29kZT4gZGlyZWN0b3J5LgorVGhlIGNsYXNzcGF0aCB1c2VkIGluY2x1ZGVzIDxjb2RlPnh5ei5qYXI8L2NvZGU+LCBhbmQgY29tcGlsaW5nIHdpdGgKK2RlYnVnIGluZm9ybWF0aW9uIGlzIG9uLiBUaGUgc291cmNlIGxldmVsIGlzIDEuNCwKK3NvIHlvdSBjYW4gdXNlIDxjb2RlPmFzc2VydDwvY29kZT4gc3RhdGVtZW50cy48L3A+CisKKzxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgICAgZm9yaz0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICBzb3VyY2U9JnF1b3Q7MS4yJnF1b3Q7CisgICAgICAgICB0YXJnZXQ9JnF1b3Q7MS4yJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD5jb21waWxlcyBhbGwgPGNvZGU+LmphdmE8L2NvZGU+IGZpbGVzIHVuZGVyIHRoZSA8Y29kZT4ke3NyY308L2NvZGU+CitkaXJlY3RvcnksIGFuZCBzdG9yZXMgdGhlIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgaW4gdGhlCis8Y29kZT4ke2J1aWxkfTwvY29kZT4gZGlyZWN0b3J5LiAgVGhpcyB3aWxsIGZvcmsgb2ZmIHRoZSBqYXZhYworY29tcGlsZXIgdXNpbmcgdGhlIGRlZmF1bHQgPGNvZGU+amF2YWM8L2NvZGU+IGV4ZWN1dGFibGUuCitUaGUgc291cmNlIGxldmVsIGlzIDEuMiAoc2ltaWxhciB0byAxLjEgb3IgMS4zKSBhbmQKK3RoZSBjbGFzcyBmaWxlcyBzaG91bGQgYmUgcnVubmFibGUgdW5kZXIgSkRLIDEuMisgYXMgd2VsbC48L3A+CisKKzxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgICAgZm9yaz0mcXVvdDtqYXZhJCRqYXZhYy5leGUmcXVvdDsKKyAgICAgICAgIHNvdXJjZT0mcXVvdDsxLjUmcXVvdDsKKyAgLyZndDs8L3ByZT4KKzxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KK2RpcmVjdG9yeSwgYW5kIHN0b3JlcyB0aGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUKKzxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuICBUaGlzIHdpbGwgZm9yayBvZmYgdGhlIGphdmFjCitjb21waWxlciwgdXNpbmcgdGhlIGV4ZWN1dGFibGUgbmFtZWQgPGNvZGU+amF2YSRqYXZhYy5leGU8L2NvZGU+LiAgTm90ZQordGhhdCB0aGUgPGNvZGU+JDwvY29kZT4gc2lnbiBuZWVkcyB0byBiZSBlc2NhcGVkIGJ5IGEgc2Vjb25kIG9uZS4KK1RoZSBzb3VyY2UgbGV2ZWwgaXMgMS41LCBzbyB5b3UgY2FuIHVzZSBnZW5lcmljcy48L3A+CisKKzxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxLyoqLG15cGFja2FnZS9wMi8qKiZxdW90OworICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlLyoqJnF1b3Q7CisgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7eHl6LmphciZxdW90OworICAgICAgICAgZGVidWc9JnF1b3Q7b24mcXVvdDsKKyAgLyZndDs8L3ByZT4KKzxwPmNvbXBpbGVzIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcyB1bmRlciB0aGUgPGNvZGU+JHtzcmN9PC9jb2RlPgorZGlyZWN0b3J5LCBhbmQgc3RvcmVzIHRoZQorPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUgPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4KK1RoZSBjbGFzc3BhdGggdXNlZCBpbmNsdWRlcyA8Y29kZT54eXouamFyPC9jb2RlPiwgYW5kIGRlYnVnIGluZm9ybWF0aW9uIGlzIG9uLgorT25seSBmaWxlcyB1bmRlciA8Y29kZT5teXBhY2thZ2UvcDE8L2NvZGU+IGFuZCA8Y29kZT5teXBhY2thZ2UvcDI8L2NvZGU+IGFyZQordXNlZC4gQWxsIGZpbGVzIGluIGFuZCBiZWxvdyB0aGUgPGNvZGU+bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlPC9jb2RlPgorZGlyZWN0b3J5IGFyZSBleGNsdWRlZCBmcm9tIGNvbXBpbGF0aW9uLgorWW91IGRpZG4ndCBzcGVjaWZ5IGEgc291cmNlIG9yIHRhcmdldCBsZXZlbCwKK3NvIHRoZSBhY3R1YWwgdmFsdWVzIHVzZWQgd2lsbCBkZXBlbmQgb24gd2hpY2ggSkRLIHlvdSByYW4gQW50IHdpdGguPC9wPgorCis8cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY306JHtzcmMyfSZxdW90OworICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxLyoqLG15cGFja2FnZS9wMi8qKiZxdW90OworICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlLyoqJnF1b3Q7CisgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7eHl6LmphciZxdW90OworICAgICAgICAgZGVidWc9JnF1b3Q7b24mcXVvdDsKKyAgLyZndDs8L3ByZT4KKworPHA+aXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUsIHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgc2Vjb25kCitzb3VyY2UgcGF0aCwgZGVmaW5lZCBieQordGhlIHByb3BlcnR5IDxjb2RlPnNyYzI8L2NvZGU+LiBUaGlzIGNhbiBhbHNvIGJlIHJlcHJlc2VudGVkIHVzaW5nIG5lc3RlZAorPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IGVsZW1lbnRzIGFzIGZvbGxvd3M6PC9wPgorCis8cHJlPiAgJmx0O2phdmFjIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDt4eXouamFyJnF1b3Q7CisgICAgICAgICBkZWJ1Zz0mcXVvdDtvbiZxdW90OyZndDsKKyAgICAmbHQ7c3JjIHBhdGg9JnF1b3Q7JHtzcmN9JnF1b3Q7LyZndDsKKyAgICAmbHQ7c3JjIHBhdGg9JnF1b3Q7JHtzcmMyfSZxdW90Oy8mZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtteXBhY2thZ2UvcDEvKiomcXVvdDsvJmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7bXlwYWNrYWdlL3AyLyoqJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O215cGFja2FnZS9wMS90ZXN0cGFja2FnZS8qKiZxdW90Oy8mZ3Q7CisgICZsdDsvamF2YWMmZ3Q7PC9wcmU+CisKKzxwPklmIHlvdSB3YW50IHRvIHJ1biB0aGUgamF2YWMgY29tcGlsZXIgb2YgYSBkaWZmZXJlbnQgSkRLLCB5b3UKK3Nob3VsZCB0ZWxsIEFudCwgd2hlcmUgdG8gZmluZCB0aGUgY29tcGlsZXIgYW5kIHdoaWNoIHZlcnNpb24gb2YgSkRLCit5b3Ugd2lsbCBiZSB1c2luZyBzbyBpdCBjYW4gY2hvb3NlIHRoZSBjb3JyZWN0IGNvbW1hbmQgbGluZSBzd2l0Y2hlcy4KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBleGVjdXRlcyBhIEpESyAxLjEgamF2YWMgaW4gYSBuZXcgcHJvY2VzcyBhbmQKK3VzZXMgdGhlIGNvcnJlY3QgY29tbWFuZCBsaW5lIHN3aXRjaGVzIGV2ZW4gd2hlbiBBbnQgaXMgcnVubmluZyBpbiBhCitKYXZhIFZNIG9mIGEgZGlmZmVyZW50IHZlcnNpb246PC9wPgorCis8cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICAgIGZvcms9JnF1b3Q7eWVzJnF1b3Q7CisgICAgICAgICBleGVjdXRhYmxlPSZxdW90Oy9vcHQvamF2YS9qZGsxLjEvYmluL2phdmFjJnF1b3Q7CisgICAgICAgICBjb21waWxlcj0mcXVvdDtqYXZhYzEuMSZxdW90OworICAvJmd0OzwvcHJlPgorCis8cD48YSBuYW1lPSJzcmNkaXJub3RlIj48Yj5Ob3RlOjwvYj48L2E+CitJZiB5b3Ugd2lzaCB0byBjb21waWxlIG9ubHkgc291cmNlIGZpbGVzIGxvY2F0ZWQgaW4gY2VydGFpbiBwYWNrYWdlcyBiZWxvdyBhCitjb21tb24gcm9vdCwgdXNlIHRoZSA8Y29kZT5pbmNsdWRlPC9jb2RlPi88Y29kZT5leGNsdWRlPC9jb2RlPiBhdHRyaWJ1dGVzCitvciA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+Lzxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnRzCit0byBmaWx0ZXIgZm9yIHRoZXNlIHBhY2thZ2VzLiBEbyBub3QgaW5jbHVkZSBwYXJ0IG9mIHlvdXIgcGFja2FnZSBzdHJ1Y3R1cmUKK2luIHRoZSA8Y29kZT5zcmNkaXI8L2NvZGU+IGF0dHJpYnV0ZQorKG9yIG5lc3RlZCA8Y29kZT4mbHQ7c3JjJmd0OzwvY29kZT4gZWxlbWVudHMpLCBvciBBbnQgd2lsbCByZWNvbXBpbGUgeW91cgorc291cmNlIGZpbGVzIGV2ZXJ5IHRpbWUgeW91IHJ1biB5b3VyIGNvbXBpbGUgdGFyZ2V0LiBTZWUgdGhlCis8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwjYWx3YXlzLXJlY29tcGlsZXMiPkFudCBGQVE8L2E+Citmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+CisKKzxwPgorSWYgeW91IHdpc2ggdG8gY29tcGlsZSBvbmx5IGZpbGVzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFuZCBkaXNhYmxlCitqYXZhYydzIGRlZmF1bHQgc2VhcmNoaW5nIG1lY2hhbmlzbSB0aGVuIHlvdSBjYW4gdW5zZXQgdGhlIHNvdXJjZXBhdGgKK2F0dHJpYnV0ZToKKzxwcmU+ICAmbHQ7amF2YWMgc291cmNlcGF0aD0mcXVvdDsmcXVvdDsgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OyAmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8mZ3Q7CisgICAgJmx0O2V4Y2x1ZGUgbmFtZT0iKiovRXhhbXBsZS5qYXZhIi8mZ3Q7CisgICZsdDsvamF2YWMmZ3Q7PC9wcmU+CitUaGF0IHdheSB0aGUgamF2YWMgd2lsbCBjb21waWxlIGFsbCBqYXZhIHNvdXJjZSBmaWxlcyB1bmRlciAmcXVvdDske3NyY30mcXVvdDsKK2RpcmVjdG9yeSBidXQgc2tpcCB0aGUgZXhhbXBsZXMuIFRoZSBjb21waWxlciB3aWxsIGV2ZW4gcHJvZHVjZSBlcnJvcnMgaWYgc29tZSBvZgordGhlIG5vbi1leGFtcGxlIGZpbGVzIHJlZmVycyB0byB0aGVtLgorPC9wPgorCis8cD4KK0lmIHlvdSB3aXNoIHRvIGNvbXBpbGUgd2l0aCBhIHNwZWNpYWwgSkRLIChhbm90aGVyIHRoYW4gdGhlIG9uZSBBbnQgaXMgY3VycmVudGx5IHVzaW5nKSwKK3NldCB0aGUgPGNvZGU+ZXhlY3V0YWJsZTwvY29kZT4gYW5kIDxjb2RlPmZvcms8L2NvZGU+IGF0dHJpYnV0ZS4gVXNpbmcgPGNvZGU+dGFza25hbWU8L2NvZGU+Citjb3VsZCBzaG93IGluIHRoZSBsb2csIHRoYXQgdGhlc2Ugc2V0dGluZ3MgYXJlIGZpeC4KKzxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyZxdW90OyAKKyAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JnF1b3Q7CisgICAgICAgICBleGVjdXRhYmxlPSZxdW90O3BhdGgtdG8tamF2YTE0LWhvbWUvYmluL2phdmFjJnF1b3Q7IAorICAgICAgICAgZm9yaz0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICB0YXNrbmFtZT0mcXVvdDtqYXZhYzEuNCZxdW90OyAvJmd0OzwvcHJlPgorPC9wPgorCisKKzxwPjxiPk5vdGU6PC9iPiBJZiB5b3UgYXJlIHVzaW5nIEFudCBvbiBXaW5kb3dzIGFuZCBhIG5ldyBET1Mgd2luZG93IHBvcHMgdXAKK2ZvciBldmVyeSB1c2Ugb2YgYW4gZXh0ZXJuYWwgY29tcGlsZXIsIHRoaXMgbWF5IGJlIGEgcHJvYmxlbSBvZiB0aGUgSkRLIHlvdSBhcmUKK3VzaW5nLiAgVGhpcyBwcm9ibGVtIG1heSBvY2N1ciB3aXRoIGFsbCBKREtzICZsdDsgMS4yLjwvcD4KKworCis8cD4KK0lmIHlvdSB3YW50IHRvIGFjdGl2YXRlIG90aGVyIGNvbXBpbGVyIG9wdGlvbnMgbGlrZSA8aT5saW50PC9pPiB5b3UgY291bGQgdXNlCit0aGUgPHR0PiZsdDtjb21waWxlcmFyZyZndDs8L3R0PiBlbGVtZW50OgorPHByZT4gICZsdDtqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iCisgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKKyAgICAgICAgIGNsYXNzcGF0aHJlZj0ibGlicmFyaWVzIiZndDsKKyAgICAmbHQ7Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludCIvJmd0OworICAmbHQ7L2phdmFjJmd0OyA8L3ByZT4KKzwvcD4gIAorCisKKzxoMz5KaWtlcyBOb3RlczwvaDM+CisKKzxwPllvdSBuZWVkIEppa2VzIDEuMTUgb3IgbGF0ZXIuPC9wPgorCis8cD5KaWtlcyBzdXBwb3J0cyBzb21lIGV4dHJhIG9wdGlvbnMsIHdoaWNoIGNhbiBiZSBzZXQgYmUgZGVmaW5pbmcKK3RoZSBwcm9wZXJ0aWVzIHNob3duIGJlbG93IHByaW9yIHRvIGludm9raW5nIHRoZSB0YXNrLiBUaGUgc2V0dGluZworZm9yIGVhY2ggcHJvcGVydHkgd2lsbCBiZSBpbiBhZmZlY3QgZm9yIGFsbCA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPgordGFza3MgdGhyb3VnaG91dCB0aGUgYnVpbGQuCitUaGUgQW50IGRldmVsb3BlcnMgYXJlIGF3YXJlIHRoYXQKK3RoaXMgaXMgdWdseSBhbmQgaW5mbGV4aWJsZSAmbmRhc2g7IGV4cGVjdCBhIGJldHRlciBzb2x1dGlvbiBpbiB0aGUgZnV0dXJlLgorQWxsIHRoZSBvcHRpb25zIGFyZSBib29sZWFuLCBhbmQgbXVzdCBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gb3IKKzxjb2RlPnllczwvY29kZT4gdG8gYmUKK2ludGVycHJldGVkIGFzIGFueXRoaW5nIG90aGVyIHRoYW4gZmFsc2UuIEJ5IGRlZmF1bHQsCis8Y29kZT5idWlsZC5jb21waWxlci53YXJuaW5nczwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCit3aGlsZSBhbGwgb3RoZXJzIGFyZSA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Qcm9wZXJ0eTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPkRlZmF1bHQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisJYnVpbGQuY29tcGlsZXIuZW1hY3MKKwk8L3RkPgorCTx0ZCB2YWxpZ249InRvcCI+CisJRW5hYmxlIGVtYWNzLWNvbXBhdGlibGUgZXJyb3IgbWVzc2FnZXMuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorCTxjb2RlPmZhbHNlPC9jb2RlPgorCTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorCWJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQKKwk8L3RkPgorCTx0ZCB2YWxpZ249InRvcCI+CisJRW5hYmxlIGZ1bGwgZGVwZW5kZW5jeSBjaGVja2luZzsgc2VlPGJyPgorCXRoZSA8Y29kZT4rRjwvY29kZT4gc3dpdGNoIGluIHRoZSBKaWtlcyBtYW51YWwuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorCTxjb2RlPmZhbHNlPC9jb2RlPgorCTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorCWJ1aWxkLmNvbXBpbGVyLnBlZGFudGljCisJPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiPgorCUVuYWJsZSBwZWRhbnRpYyB3YXJuaW5ncy4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisJPGNvZGU+ZmFsc2U8L2NvZGU+CisJPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisJYnVpbGQuY29tcGlsZXIud2FybmluZ3M8YnI+CisgICAgICAgIDxzdHJvbmc+RGVwcmVjYXRlZDwvc3Ryb25nPi4gVXNlCisgIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+J3MgPGNvZGU+bm93YXJuPC9jb2RlPgorICBhdHRyaWJ1dGUgaW5zdGVhZC4KKwk8L3RkPgorCTx0ZCB2YWxpZ249InRvcCI+CisJRG9uJ3QgZGlzYWJsZSB3YXJuaW5nIG1lc3NhZ2VzLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKwk8Y29kZT50cnVlPC9jb2RlPgorCTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+SnZjIE5vdGVzPC9oMz4KKworPHA+SnZjIHdpbGwgZW5hYmxlIE1pY3Jvc29mdCBleHRlbnNpb25zIHVubGVzcyB5b3Ugc2V0IHRoZSBwcm9wZXJ0eQorPGNvZGU+YnVpbGQuY29tcGlsZXIuanZjLmV4dGVuc2lvbnM8L2NvZGU+IHRvIGZhbHNlIGJlZm9yZSBpbnZva2luZworPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4uPC9wPgorCis8aDM+PGEgbmFtZT0iYm9vdHN0cmFwIj5Cb290c3RyYXAgT3B0aW9uczwvaDM+Cis8cD4KKyAgVGhlIFN1biBqYXZhYyBjb21waWxlciBoYXMgYSA8ZW0+Ym9vdGNsYXNzcGF0aDwvZW0+IGNvbW1hbmQKKyAgbGluZSBvcHRpb24gLSB0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSAiYm9vdGNsYXNzcGF0aCIgYXR0cmlidXRlL2VsZW1lbnQKKyAgb2YgdGhlICZsdDtqYXZhYyZndDsgdGFzay4gVGhlIFN1biBjb21waWxlciBhbHNvIGFsbG93cyBtb3JlCisgIGNvbnRyb2wgb3ZlciB0aGUgYm9vdCBjbGFzc3BhdGggdXNpbmcgdGhlIC1YIGFuZCAtSi1YIGF0dHJpYnV0ZXMuCisgIE9uZSBjYW4gc2V0IHRoZXNlIGJ5IHVzaW5nIHRoZSAmbHQ7Y29tcGlsZXJhcmcmZ3Q7LiBTaW5jZSBBbnQgMS42LjAsCisgIHRoZXJlIGlzIGEgc2hvcnRjdXQgdG8gY29udmVydCBwYXRoIHJlZmVyZW5jZXMgdG8gc3RyaW5ncyB0aGF0CisgIGNhbiBieSB1c2VkIGluIGFuIE9TIGluZGVwZW5kZW50IGZhc2hpb24gKHNlZQorICA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGhzaG9ydGN1dCI+cGF0aHNob3J0Y3V0PC9hPikuIEZvciBleGFtcGxlOgorPC9wPgorPHByZT4KKyAgJmx0O3BhdGggaWQ9ImxpYi5wYXRoLnJlZiImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJsaWIiIGluY2x1ZGVzPSIqLmphciIvJmd0OworICAmbHQ7L3BhdGgmZ3Q7CisgICZsdDtqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iY2xhc3NlcyImZ3Q7CisgICAgJmx0O2NvbXBpbGVyYXJnIGFyZz0iLVhib290c3RyYXAvcDoke3RvU3RyaW5nOmxpYi5wYXRoLnJlZn0iLyZndDsKKyAgJmx0Oy9qYXZhYyZndDsKKzwvcHJlPgorCisgIAorPC9wPgorCis8aDM+T3BlbkpESyBOb3RlczwvaDM+Cis8cD4KKyAgVGhlIDxhIGhyZWY9Imh0dHBzOi8vb3Blbmpkay5kZXYuamF2YS5uZXQvIj5vcGVuamRrPC9hPgorICBwcm9qZWN0IGhhcyBwcm92aWRlZCB0aGUgamF2YWMKKyAgPGEgaHJlZj0iaHR0cHM6Ly9vcGVuamRrLmRldi5qYXZhLm5ldC9jb21waWxlci8iPmNvbXBpbGVyPC9hPgorICBhcyBhbiBvcGVuc291cmNlIHByb2plY3QuIFRoZSBvdXRwdXQgb2YgdGhpcyBwcm9qZWN0IGlzIGEKKyAgPGNvZGU+amF2YWMuamFyPC9jb2RlPiB3aGljaCBjb250YWlucyB0aGUgamF2YWMgY29tcGlsZXIuCisgIFRoaXMgY29tcGlsZXIgbWF5IGJlIHVzZWQgd2l0aCB0aGUgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzayB3aXRoCisgIHRoZSB1c2Ugb2YgYSAiLVhib290c3RyYXBjbGFzcy9wIiBqYXZhIGFyZ3VtZW50LiBUaGUgYXJndW1lbnQgbmVlZHMKKyAgdG8gYmUgZ2l2ZW4gdG8gdGhlIHJ1bnRpbWUgc3lzdGVtIG9mIHRoZSBqYXZhYyBleGVjdXRhYmxlLCBzbyBpdCBuZWVkcworICB0byBiZSBwcmVwZW5kZWQgd2l0aCBhICItSiIuIEZvciBleGFtcGxlOgorCis8YmxvY2txdW90ZT48cHJlPgorICAmbHQ7cHJvcGVydHkgbmFtZT0icGF0Y2hlZC5qYXZhYy5qYXIiCisgICAgICAgICAgICBsb2NhdGlvbj0iJHtteS5wYXRjaGVkLmNvbXBpbGVyfS9kaXN0L2xpYi9qYXZhYy5qYXIiLyZndDsKKworICAmbHQ7cHJlc2V0ZGVmIG5hbWU9InBhdGNoZWQuamF2YWMiJmd0OworICAgICZsdDtqYXZhYyBmb3JrPSJ5ZXMiJmd0OworICAgICAgJmx0O2NvbXBpbGVyYXJnIHZhbHVlPSItSi1YYm9vdGNsYXNzcGF0aC9wOiR7cGF0Y2hlZC5qYXZhYy5qYXJ9Ii8mZ3Q7CisgICAgJmx0Oy9qYXZhYyZndDsKKyAgJmx0Oy9wcmVzZXRkZWYmZ3Q7CisKKworICAmbHQ7cGF0Y2hlZC5qYXZhYyBzcmNkaXI9InNyYy9qYXZhIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzIgorICAgICAgICAgICAgICAgICBkZWJ1Zz0ieWVzIi8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKyAgPGgzPk5vdGUgb24gcGFja2FnZS1pbmZvLmphdmE8L2gzPgorICA8cD4KKyAgICA8Y29kZT5wYWNrYWdlLWluZm8uamF2YTwvY29kZT4gZmlsZXMgd2VyZSBpbnRyb2R1Y2VkIGluIEphdmE1IHRvCisgICAgYWxsb3cgcGFja2FnZSBsZXZlbCBhbm5vdGF0aW9ucy4gT24gY29tcGlsYXRpb24sIGlmIHRoZSBqYXZhIGZpbGUKKyAgICBkb2VzIG5vdCBjb250YWluIHJ1bnRpbWUgYW5ub3RhdGlvbnMsIHRoZXJlIHdpbGwgYmUgbm8gLmNsYXNzIGZpbGUKKyAgICBmb3IgdGhlIGphdmEgZmlsZS4gVXAgdG8gPGI+QW50IDEuNy4xPC9iPiwgd2hlbiB0aGUgJmx0O2phdmFjJmd0OworICAgIHRhc2sgaXMgcnVuIGFnYWluLCB0aGUKKyAgICB0YXNrIHdpbGwgdHJ5IHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UtaW5mbyBqYXZhIGZpbGVzIGFnYWluLgorICA8L3A+CisgIDxwPgorICAgIEluIDxiPkFudCAxLjcuMTwvYj4gdGhlIHBhY2thZ2UtaW5mby5qYXZhIHdpbGwgb25seSBiZSBjb21waWxlZCBpZjoKKyAgICA8b2w+CisgICAgICA8bGk+CisgICAgICAgIElmIGEgPGNvZGU+cGFja2FnZS1pbmZvLmNsYXNzPC9jb2RlPiBmaWxlIGV4aXN0cyBhbmQgaXMgb2xkZXIgdGhhbgorICAgICAgICB0aGUgPGNvZGU+cGFja2FnZS1pbmZvLmphdmE8L2NvZGU+IGZpbGUuCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICBJZiB0aGUgZGlyZWN0b3J5IGZvciB0aGUgCisgICAgICAgIDxjb2RlPnBhY2thZ2UtaW5mby5jbGFzczwvY29kZT4gZmlsZSBkb2VzIG5vdCBleGlzdC4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIElmIHRoZSBkaXJlY3RvcnkgZm9yIHRoZQorICAgICAgICA8Y29kZT5wYWNrYWdlLWluZm8uY2xhc3M8L2NvZGU+IGZpbGUgZXhpc3RzLCBhbmQgaGFzIGFuIG9sZGVyCisgICAgICAgIG1vZGlmaWNhdGlvbiB0aW1lIHRoYW4gdGhlCisgICAgICAgIHRoZSA8Y29kZT5wYWNrYWdlLWluZm8uamF2YTwvY29kZT4gZmlsZS4gSW4gdGhpcyBjYXNlCisgICAgICAgICZsdDtqYXZhYyZndDsgd2lsbCB0b3VjaCB0aGUgY29ycmVzcG9uZGluZyAuY2xhc3MgZGlyZWN0b3J5CisgICAgICAgIG9uIHN1Y2Nlc3NmdWwgY29tcGlsYXRpb24uCisgICAgICA8L2xpPgorICAgIDwvb2w+CisgIDwvcD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2phdmFkb2MuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9qYXZhZG9jLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyNzgxZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9qYXZhZG9jLmh0bWwKQEAgLTAsMCArMSw4NTAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SmF2YWRvYyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJqYXZhZG9jIj5KYXZhZG9jLzxpPkphdmFkb2MyPC9pPjwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkdlbmVyYXRlcyBjb2RlIGRvY3VtZW50YXRpb24gdXNpbmcgdGhlIGphdmFkb2MgdG9vbC48L3A+Cis8cD5UaGUgc291cmNlIGRpcmVjdG9yeSB3aWxsIGJlIHJlY3Vyc2l2ZWx5IHNjYW5uZWQgZm9yIEphdmEgc291cmNlIGZpbGVzIHRvIHByb2Nlc3MKK2J1dCBvbmx5IHRob3NlIG1hdGNoaW5nIHRoZSBpbmNsdXNpb24gcnVsZXMsIGFuZCBub3QgbWF0Y2hpbmcgdGhlIGV4Y2x1c2lvbnMgcnVsZXMKK3dpbGwgYmUgcGFzc2VkIHRvIHRoZSBqYXZhZG9jIHRvb2wuIFRoaXMKK2FsbG93cyB3aWxkY2FyZHMgdG8gYmUgdXNlZCB0byBjaG9vc2UgYmV0d2VlbiBwYWNrYWdlIG5hbWVzLCByZWR1Y2luZyB2ZXJib3NpdHkKK2FuZCBtYW5hZ2VtZW50IGNvc3RzIG92ZXIgdGltZS4gVGhpcyB0YXNrLCBob3dldmVyLCBoYXMgbm8gbm90aW9uIG9mCismcXVvdDtjaGFuZ2VkJnF1b3Q7IGZpbGVzLCB1bmxpa2UgdGhlIDxhIGhyZWY9ImphdmFjLmh0bWwiPmphdmFjPC9hPiB0YXNrLiBUaGlzIG1lYW5zCithbGwgcGFja2FnZXMgd2lsbCBiZSBwcm9jZXNzZWQgZWFjaCB0aW1lIHRoaXMgdGFzayBpcyBydW4uIEluIGdlbmVyYWwsIGhvd2V2ZXIsCit0aGlzIHRhc2sgaXMgdXNlZCBtdWNoIGxlc3MgZnJlcXVlbnRseS48L3A+Cis8cD5UaGlzIHRhc2sgd29ya3Mgc2VhbWxlc3NseSBiZXR3ZWVuIGRpZmZlcmVudCBqYXZhZG9jIHZlcnNpb25zICgxLjIgYW5kIDEuNCksCit3aXRoIHRoZSBvYnZpb3VzIHJlc3RyaWN0aW9uIHRoYXQgdGhlIDEuNCBhdHRyaWJ1dGVzCit3aWxsIGJlIGlnbm9yZWQgaWYgcnVuIGluIGEgMS4yIFZNLjwvcD4KKzxwPk5PVEU6IHNpbmNlIGphdmFkb2MgY2FsbHMgU3lzdGVtLmV4aXQoKSwgamF2YWRvYyBjYW5ub3QgYmUgcnVuIGluc2lkZSB0aGUKK3NhbWUgVk0gYXMgQW50IHdpdGhvdXQgYnJlYWtpbmcgZnVuY3Rpb25hbGl0eS4gRm9yIHRoaXMgcmVhc29uLCB0aGlzIHRhc2sKK2Fsd2F5cyBmb3JrcyB0aGUgVk0uIFRoaXMgb3ZlcmhlYWQgaXMgbm90IHNpZ25pZmljYW50IHNpbmNlIGphdmFkb2MgaXMgbm9ybWFsbHkgYSBoZWF2eQorYXBwbGljYXRpb24gYW5kIHdpbGwgYmUgY2FsbGVkIGluZnJlcXVlbnRseS48L3A+Cis8cD5OT1RFOiB0aGUgcGFja2FnZWxpc3QgYXR0cmlidXRlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbGlzdCBvZiBwYWNrYWdlcyB0bworZG9jdW1lbnQgb3V0c2lkZSBvZiB0aGUgQW50IGZpbGUuIEl0J3MgYSBtdWNoIGJldHRlciBwcmFjdGljZSB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcKK2luc2lkZSB0aGUgPGNvZGU+YnVpbGQueG1sPC9jb2RlPiBmaWxlLiBUaGlzIG9wdGlvbiB3YXMgYWRkZWQgaW4gb3JkZXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8KK21pZ3JhdGUgZnJvbSByZWd1bGFyIG1ha2VmaWxlcywgd2hlcmUgeW91IHdvdWxkIHVzZSB0aGlzIG9wdGlvbiBvZiBqYXZhZG9jLgorVGhlIHBhY2thZ2VzIGxpc3RlZCBpbiBwYWNrYWdlbGlzdCBhcmUgbm90IGNoZWNrZWQsIHNvIHRoZSB0YXNrIHBlcmZvcm1zIGV2ZW4KK2lmIHNvbWUgcGFja2FnZXMgYXJlIG1pc3Npbmcgb3IgYnJva2VuLiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IHdpc2ggdG8gY29udmVydCBmcm9tCithbiBleGlzdGluZyBtYWtlZmlsZS4gT25jZSB0aGluZ3MgYXJlIHJ1bm5pbmcgeW91IHNob3VsZCB0aGVuIHN3aXRjaCB0byB0aGUgcmVndWxhcgorbm90YXRpb24uIDwvcD4KKworPHA+PGk+PGI+REVQUkVDQVRJT046PC9iPiB0aGUgamF2YWRvYzIgdGFzayBzaW1wbHkgcG9pbnRzIHRvIHRoZSBqYXZhZG9jIHRhc2sgYW5kIGl0J3MKK3RoZXJlIGZvciBiYWNrIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gU2luY2UgdGhpcyB0YXNrIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUKK3ZlcnNpb25zLCB5b3UgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXNlIDxhIGhyZWY9ImphdmFkb2MuaHRtbCI+amF2YWRvYzwvYT4KK2luc3RlYWQuPC9pPjwvcD4KKworPHA+SW4gdGhlIHRhYmxlIGJlbG93LCAxLjIgbWVhbnMgYXZhaWxhYmxlIGlmIHlvdXIgY3VycmVudCBKYXZhIFZNIGlzCithIDEuMiBWTSAoYnV0IG5vdCAxLjMgb3IgbGF0ZXIpLCAxLjQrIGZvciBhbnkgVk0gb2YgYXQgbGVhc3QgdmVyc2lvbiAxLjQsIG90aGVyd2lzZQorYW55IFZNIG9mIGF0IGxlYXN0IHZlcnNpb24gMS4yIGlzIGFjY2VwdGFibGUuIEpESyAxLjEgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK0lmIHlvdSBzcGVjaWZ5IHRoZSA8Y29kZT5leGVjdXRhYmxlPC9jb2RlPiBhdHRyaWJ1dGUgaXQgaXMgdXAgdG8geW91Cit0byBlbnN1cmUgdGhhdCB0aGlzIGNvbW1hbmQgc3VwcG9ydHMgdGhlIGF0dHJpYnV0ZXMgeW91IHdpc2ggdG8gdXNlLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+QXZhaWxhYmlsaXR5PC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2VwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgd2hlcmUgdG8gZmluZCBzb3VyY2UgZmlsZXM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMyI+QXQgbGVhc3Qgb25lIG9mIHRoZSB0aHJlZSBvciBuZXN0ZWQKKyAgICA8Y29kZT4mbHQ7c291cmNlcGF0aCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IG9yCisgICAgPGNvZGU+Jmx0O3BhY2thZ2VzZXQmZ3Q7PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZXBhdGhyZWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSB3aGVyZSB0byBmaW5kIHNvdXJjZSBmaWxlcyBieSA8YQorICAgICAgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c291cmNlZmlsZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc291cmNlIGZpbGVzIC0tIHNlZSBhbHNvCisgICAgdGhlIG5lc3RlZCA8Y29kZT5zb3VyY2U8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RGVzdGluYXRpb24gZGlyZWN0b3J5IGZvciBvdXRwdXQgZmlsZXM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgdW5sZXNzIGEgZG9jbGV0IGhhcyBiZWVuIHNwZWNpZmllZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TWF4IGFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgdG8gdGhlIGphdmFkb2MgVk08L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFja2FnZW5hbWVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHBhY2thZ2UgZmlsZXMgKHdpdGggdGVybWluYXRpbmcKKyAgICAgIHdpbGRjYXJkKSAtLSBzZWUgYWxzbyB0aGUgbmVzdGVkIDxjb2RlPnBhY2thZ2U8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhY2thZ2VMaXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSBwYWNrYWdlcyB0byBwcm9jZXNzPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdXNlciBjbGFzcyBmaWxlczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Cb290Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJyaWRlIGxvY2F0aW9uIG9mIGNsYXNzIGZpbGVzIGxvYWRlZCBieSB0aGUgYm9vdHN0cmFwCisgICAgICBjbGFzcyBsb2FkZXI8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgd2hlcmUgdG8gZmluZCB1c2VyIGNsYXNzIGZpbGVzIGJ5IDxhCisgICAgICBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ib290Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJyaWRlIGxvY2F0aW9uIG9mIGNsYXNzIGZpbGVzIGxvYWRlZCBieSB0aGUKKyAgICAgIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIgYnkgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEKKyAgICAgIFBBVEggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkV4dGRpcnM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T3ZlcnJpZGUgbG9jYXRpb24gb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T3ZlcnZpZXc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UmVhZCBvdmVydmlldyBkb2N1bWVudGF0aW9uIGZyb20gSFRNTCBmaWxlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFjY2VzczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BY2Nlc3MgbW9kZTogb25lIG9mIDxjb2RlPnB1YmxpYzwvY29kZT4sIDxjb2RlPnByb3RlY3RlZDwvY29kZT4sCisgICAgICAgICAgICAgICAgICAgICA8Y29kZT5wYWNrYWdlPC9jb2RlPiwgb3IgPGNvZGU+cHJpdmF0ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vIChkZWZhdWx0IDxjb2RlPnByb3RlY3RlZDwvY29kZT4pPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UHVibGljPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNob3cgb25seSBwdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVyczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Qcm90ZWN0ZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2hvdyBwcm90ZWN0ZWQvcHVibGljIGNsYXNzZXMgYW5kIG1lbWJlcnMgKGRlZmF1bHQpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlBhY2thZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2hvdyBwYWNrYWdlL3Byb3RlY3RlZC9wdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVyczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Qcml2YXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNob3cgYWxsIGNsYXNzZXMgYW5kIG1lbWJlcnM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T2xkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkdlbmVyYXRlIG91dHB1dCB1c2luZyBKREsgMS4xIGVtdWxhdGluZyBkb2NsZXQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+MS4yPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VmVyYm9zZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5PdXRwdXQgbWVzc2FnZXMgYWJvdXQgd2hhdCBKYXZhZG9jIGlzIGRvaW5nPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkxvY2FsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NhbGUgdG8gYmUgdXNlZCwgZS5nLiBlbl9VUyBvciBlbl9VU19XSU48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U291cmNlIGZpbGUgZW5jb2RpbmcgbmFtZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5WZXJzaW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkluY2x1ZGUgQHZlcnNpb24gcGFyYWdyYXBoczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Vc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q3JlYXRlIGNsYXNzIGFuZCBwYWNrYWdlIHVzYWdlIHBhZ2VzPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkF1dGhvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JbmNsdWRlIEBhdXRob3IgcGFyYWdyYXBoczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGxpdGluZGV4PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwbGl0IGluZGV4IGludG8gb25lIGZpbGUgcGVyIGxldHRlcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaW5kb3d0aXRsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Ccm93c2VyIHdpbmRvdyB0aXRsZSBmb3IgdGhlIGRvY3VtZW50YXRpb24gKHRleHQpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRvY3RpdGxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkluY2x1ZGUgdGl0bGUgZm9yIHRoZSBwYWNrYWdlIGluZGV4KGZpcnN0KSBwYWdlIChodG1sLWNvZGUpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkhlYWRlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JbmNsdWRlIGhlYWRlciB0ZXh0IGZvciBlYWNoIHBhZ2UgKGh0bWwtY29kZSk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Rm9vdGVyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkluY2x1ZGUgZm9vdGVyIHRleHQgZm9yIGVhY2ggcGFnZSAoaHRtbC1jb2RlKTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ib3R0b208L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5jbHVkZSBib3R0b20gdGV4dCBmb3IgZWFjaCBwYWdlIChodG1sLWNvZGUpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxpbms8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q3JlYXRlIGxpbmtzIHRvIGphdmFkb2Mgb3V0cHV0IGF0IHRoZSBnaXZlbiBVUkwKKyAgICAtLSBzZWUgYWxzbyB0aGUgbmVzdGVkIDxjb2RlPmxpbms8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxpbmtvZmZsaW5lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkxpbmsgdG8gZG9jcyBhdCA8Y29kZT4mbHQ7dXJsJmd0OzwvY29kZT4gdXNpbmcgcGFja2FnZSBsaXN0IGF0CisgICAgPGNvZGU+Jmx0O3VybDImZ3Q7PC9jb2RlPiAtIHNlcGFyYXRlIHRoZSBVUkxzIGJ5IHVzaW5nIGEgc3BhY2UgY2hhcmFjdGVyIC0tIHNlZQorICAgIGFsc28gdGhlIG5lc3RlZCA8Y29kZT5saW5rPC9jb2RlPiBlbGVtZW50LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ncm91cDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Hcm91cCBzcGVjaWZpZWQgcGFja2FnZXMgdG9nZXRoZXIgaW4gb3ZlcnZpZXcKKyAgICBwYWdlLiAgVGhlIGZvcm1hdCBpcyBhcyBkZXNjcmliZWQgPGEKKyAgICBocmVmPSIjZ3JvdXBhdHRyaWJ1dGUiPmJlbG93PC9hPiAtLSBzZWUgYWxzbyB0aGUgbmVzdGVkCisgICAgPGNvZGU+Z3JvdXA8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5vZGVwcmVjYXRlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgaW5jbHVkZSBAZGVwcmVjYXRlZCBpbmZvcm1hdGlvbjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ub2RlcHJlY2F0ZWRsaXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBnZW5lcmF0ZSBkZXByZWNhdGVkIGxpc3Q8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bm90cmVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBnZW5lcmF0ZSBjbGFzcyBoaWVyYXJjaHk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bm9pbmRleDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgZ2VuZXJhdGUgaW5kZXg8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bm9oZWxwPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBnZW5lcmF0ZSBoZWxwIGxpbms8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bm9uYXZiYXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RG8gbm90IGdlbmVyYXRlIG5hdmlnYXRpb24gYmFyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNlcmlhbHdhcm48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+R2VuZXJhdGUgd2FybmluZyBhYm91dCBAc2VyaWFsIHRhZzwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5oZWxwZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIEhUTUwgaGVscCBmaWxlIHRvIHVzZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdHlsZXNoZWV0ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIENTUyBzdHlsZXNoZWV0IHRvIHVzZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jaGFyc2V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNoYXJzZXQgZm9yIGNyb3NzLXBsYXRmb3JtIHZpZXdpbmcgb2YgZ2VuZXJhdGVkCisgICAgICBkb2N1bWVudGF0aW9uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRvY2VuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk91dHB1dCBmaWxlIGVuY29kaW5nIG5hbWU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZG9jbGV0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgY2xhc3MgZmlsZSB0aGF0IHN0YXJ0cyB0aGUgZG9jbGV0CisgICAgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudGF0aW9uIC0tIHNlZSBhbHNvIHRoZSBuZXN0ZWQKKyAgICA8Y29kZT5kb2NsZXQ8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRvY2xldHBhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBkb2NsZXQgY2xhc3MgZmlsZSB0aGF0IGlzIHNwZWNpZmllZCB3aXRoIHRoZSAtZG9jbGV0IG9wdGlvbi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZG9jbGV0cGF0aHJlZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIGRvY2xldCBjbGFzcyBmaWxlIHRoYXQKKyAgICAgIGlzIHNwZWNpZmllZCB3aXRoIHRoZSAtZG9jbGV0IG9wdGlvbiBieSA8YQorICAgICAgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YWRkaXRpb25hbHBhcmFtPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkxldHMgeW91IGFkZCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIGphdmFkb2MKKyAgICBjb21tYW5kIGxpbmUuIFVzZWZ1bCBmb3IgZG9jbGV0cy4gUGFyYW1ldGVycyBjb250YWluaW5nIHNwYWNlcworICAgIG5lZWQgdG8gYmUgcXVvdGVkIHVzaW5nICZhbXA7cXVvdDsgLS0gc2VlIGFsc28gdGhlIG5lc3RlZAorICAgIDxjb2RlPmFyZzwvY29kZT4gZWxlbWVudC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYQorICAgICAgcmV0dXJuY29kZSBvdGhlciB0aGFuIDAuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVwYWNrYWdlbmFtZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZXMgeW91IGRvbid0IHdhbnQKKyAgICAgIGRvY3MgZm9yIC0tIHNlZSBhbHNvIHRoZSBuZXN0ZWQgPGNvZGU+ZXhjbHVkZXBhY2thZ2U8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkCisgICAgICAoPGNvZGU+eWVzPC9jb2RlPiB8IDxjb2RlPm5vPC9jb2RlPik7IGRlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2VleHRlcm5hbGZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNvdXJjZWZpbGUgbmFtZSBzcGVjaWZpZWQKKyAgICAgIGluIHNyY2ZpbGVzIG9yIGFzIG5lc3RlZCBzb3VyY2UgZWxlbWVudHMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYQorICAgICAgdGVtcG9yYXJ5IGZpbGUgdG8gbWFrZSB0aGUgY29tbWFuZCBsaW5lIHNob3J0ZXIuIEFsc28gYXBwbGllcyB0bworICAgICAgdGhlIHBhY2thZ2UgbmFtZXMgc3BlY2lmaWVkIHZpYSB0aGUgcGFja2FnZW5hbWVzIGF0dHJpYnV0ZSBvcgorICAgICAgbmVzdGVkIHBhY2thZ2UgZWxlbWVudHMuPGVtPlNpbmNlIEFudCAxLjcuMDwvZW0+LCBhbHNvIGFwcGxpZXMKKyAgICAgIHRvIGFsbCB0aGUgb3RoZXIgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgICAgICAoPGNvZGU+eWVzPC9jb2RlPiB8IDxjb2RlPm5vPC9jb2RlPikuIERlZmF1bHQgaXMgbm8uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5OZWNlc3NhcnkgdG8gZW5hYmxlIGphdmFkb2MgdG8gaGFuZGxlIGFzc2VydGlvbnMKKyAgICBwcmVzZW50IGluIEoyU0UgdiAxLjQgc291cmNlIGNvZGUuIFNldCB0aGlzIHRvICZxdW90OzEuNCZxdW90OyB0bworICAgIGRvY3VtZW50cyBjb2RlIHRoYXQgY29tcGlsZXMgdXNpbmcgPGNvZGU+JnF1b3Q7amF2YWMgLXNvdXJjZQorICAgIDEuNCZxdW90OzwvY29kZT4uPGJyPgorICAgIEEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHByb3ZpZGVkIHVzaW5nIHRoZSBtYWdpYworICAgIDxhCisgICAgaHJlZj0iLi4vamF2YWNwcm9wcy5odG1sI3NvdXJjZSI+PGNvZGU+YW50LmJ1aWxkLmphdmFjLnNvdXJjZTwvY29kZT48L2E+CisgICAgcHJvcGVydHkuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjEuNCs8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5saW5rc291cmNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkdlbmVyYXRlIGh5cGVybGlua3MgdG8gc291cmNlIGZpbGVzLgorICAgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi4KKyAgICAgICg8Y29kZT55ZXM8L2NvZGU+IHwgPGNvZGU+bm88L2NvZGU+KS4gRGVmYXVsdCBpcyBuby48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+MS40KzwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJyZWFraXRlcmF0b3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VXNlIHRoZSBuZXcgYnJlYWtpdGVyYXRvciBhbGdvcml0aG0uCisgICAgICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LgorICAgICAgKDxjb2RlPnllczwvY29kZT4gfCA8Y29kZT5ubzwvY29kZT4pLiBEZWZhdWx0IGlzIG5vLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj4xLjQrPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bm9xdWFsaWZpZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RW5hYmxlcyB0aGUgPGNvZGU+LW5vcXVhbGlmaWVyPC9jb2RlPiBhcmd1bWVudCAtCisgICAgICBtdXN0IGJlIDxjb2RlPmFsbDwvY29kZT4gb3IgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlcy4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjEuNCs8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlbm9zb3VyY2VwYWNrYWdlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiBzZXQgdG8gdHJ1ZSwgcGFja2FnZXMgdGhhdCBkb24ndCBjb250YWluIEphdmEKKyAgICAgIHNvdXJjZSBidXQgYSBwYWNrYWdlLmh0bWwgd2lsbCBnZXQgZG9jdW1lbnRlZCBhcyB3ZWxsLgorICAgICAgPGVtPnNpbmNlIEFudCAxLjYuMzwvZW0+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4ZWN1dGFibGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSBhIHBhcnRpY3VsYXIgPGNvZGU+amF2YWRvYzwvY29kZT4gZXhlY3V0YWJsZQorICAgICAgdG8gdXNlIGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0IGJpbmFyeSAoZm91bmQgaW4gdGhlIHNhbWUgSkRLIGFzIEFudCBpcyBydW5uaW5nIGluKS4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS42LjM8L2VtPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND48YSBuYW1lPSJncm91cGF0dHJpYnV0ZSI+Rm9ybWF0IG9mIHRoZSBncm91cCBhdHRyaWJ1dGU8L2E+PC9oND4KKzxwPlRoZSBhcmd1bWVudHMgYXJlIGNvbW1hLWRlbGltaXRlZC4gRWFjaCBzaW5nbGUgYXJndW1lbnQgaXMgMgorc3BhY2UtZGVsaW1pdGVkIHN0cmluZ3MsIHdoZXJlIHRoZSBmaXJzdCBvbmUgaXMgdGhlIGdyb3VwJ3MgdGl0bGUgYW5kCit0aGUgc2Vjb25kIG9uZSBhIGNvbG9uIGRlbGltaXRlZCBsaXN0IG9mIHBhY2thZ2VzLjwvcD4KKzxwPklmIHlvdSBuZWVkIHRvIHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBncm91cCwgb3IgYSBncm91cCB3aG9zZSB0aXRsZQorY29udGFpbnMgYSBjb21tYSBvciBhIHNwYWNlIGNoYXJhY3RlciwgdXNpbmcgPGEKK2hyZWY9IiNncm91cGVsZW1lbnQiPm5lc3RlZCBncm91cCBlbGVtZW50czwvYT4gaXMgaGlnaGx5CityZWNvbW1lbmRlZC48L3A+Cis8cD5FLmcuOjwvcD4KKzxwcmU+ICAgIGdyb3VwPSZxdW90O1hTTFRfUGFja2FnZXMgb3JnLmFwYWNoZS54YWxhbi54c2x0KixYUGF0aF9QYWNrYWdlcyBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoKiZxdW90OzwvcHJlPgorCis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPGg0PnBhY2thZ2VzZXQ8L2g0PgorCis8cD5BIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9kaXJzZXQuaHRtbCI+RGlyU2V0PC9hPi4gIEFsbCBtYXRjaGVkCitkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gSmF2YSBzb3VyY2UgZmlsZXMgd2lsbCBiZSBwYXNzZWQgdG8gamF2YWRvYworYXMgcGFja2FnZSBuYW1lcy4gIFBhY2thZ2UgbmFtZXMgYXJlIGNyZWF0ZWQgZnJvbSB0aGUgZGlyZWN0b3J5IG5hbWVzCitieSB0cmFuc2xhdGluZyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpbnRvIGRvdHMuICBBbnQgYXNzdW1lcyB0aGUKK2Jhc2UgZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlc2V0IHBvaW50cyB0byB0aGUgcm9vdCBvZiBhIHBhY2thZ2UKK2hpZXJhcmNoeS48L3A+CisKKzxwPlRoZSA8Y29kZT5wYWNrYWdlbmFtZXM8L2NvZGU+LCA8Y29kZT5leGNsdWRlcGFja2FnZW5hbWVzPC9jb2RlPiBhbmQKKzxjb2RlPmRlZmF1bHRleGNsdWRlczwvY29kZT4gYXR0cmlidXRlcyBvZiB0aGUgdGFzayBoYXZlIG5vIGVmZmVjdCBvbgordGhlIG5lc3RlZCA8Y29kZT4mbHQ7cGFja2FnZXNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKworPGg0PmZpbGVzZXQ8L2g0PgorCis8cD5BIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiAgQWxsIG1hdGNoZWQKK2ZpbGVzIHdpbGwgYmUgcGFzc2VkIHRvIGphdmFkb2MgYXMgc291cmNlIGZpbGVzLiAgQW50IHdpbGwKK2F1dG9tYXRpY2FsbHkgYWRkIHRoZSBpbmNsdWRlIHBhdHRlcm4gPGNvZGU+KiovKi5qYXZhPC9jb2RlPiAoYW5kCis8Y29kZT4qKi9wYWNrYWdlLmh0bWw8L2NvZGU+IGlmIGluY2x1ZGVub3NvdXJjZXBhY2thZ2VzIGlzIHRydWUpIHRvCit0aGVzZSBmaWxlc2V0cy48L3A+CisKKzxwPk5lc3RlZCBmaWxlc2V0cyBjYW4gYmUgdXNlZCB0byBkb2N1bWVudCBzb3VyY2VzIHRoYXQgYXJlIGluIHRoZQorZGVmYXVsdCBwYWNrYWdlIG9yIGlmIHlvdSB3YW50IHRvIGV4Y2x1ZGUgY2VydGFpbiBmaWxlcyBmcm9tCitkb2N1bWVudGF0aW9uLiAgSWYgeW91IHdhbnQgdG8gZG9jdW1lbnQgYWxsIHNvdXJjZSBmaWxlcyBhbmQgZG9uJ3QgdXNlCit0aGUgZGVmYXVsdCBwYWNrYWdlLCBwYWNrYWdlc2V0cyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIGFzIHRoaXMKK2luY3JlYXNlcyBqYXZhZG9jcyBwZXJmb3JtYW5jZS48L3A+CisKKzxwPlRoZSA8Y29kZT5wYWNrYWdlbmFtZXM8L2NvZGU+LCA8Y29kZT5leGNsdWRlcGFja2FnZW5hbWVzPC9jb2RlPiBhbmQKKzxjb2RlPmRlZmF1bHRleGNsdWRlczwvY29kZT4gYXR0cmlidXRlcyBvZiB0aGUgdGFzayBoYXZlIG5vIGVmZmVjdCBvbgordGhlIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKworPGg0PnNvdXJjZWZpbGVzPC9oND4KKworPHA+QSBjb250YWluZXIgZm9yIGFyYml0cmFyeSBmaWxlIHN5c3RlbSBiYXNlZCA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlCitjb2xsZWN0aW9uczwvYT4uICBBbGwgZmlsZXMgY29udGFpbmVkIGluIGFueSBvZiB0aGUgbmVzdGVkIGNvbGxlY3Rpb25zCisodGhpcyBpbmNsdWRlcyBuZXN0ZWQgZmlsZXNldHMsIGZpbGVsaXN0cyBvciBwYXRocykgd2lsbCBiZSBwYXNzZWQgdG8KK2phdmFkb2MgYXMgc291cmNlIGZpbGVzLjwvcD4KKworPGg0PnBhY2thZ2U8L2g0PgorPHA+U2FtZSBhcyBvbmUgZW50cnkgaW4gdGhlIGxpc3QgZ2l2ZW4gYnkgPGNvZGU+cGFja2FnZW5hbWVzPC9jb2RlPi48L3A+CisKKzxoNT5QYXJhbWV0ZXJzPC9oNT4KKzx0YWJsZSB3aWR0aD0iOTAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhY2thZ2UgbmFtZSAobWF5IGJlIGEgd2lsZGNhcmQpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+ZXhjbHVkZXBhY2thZ2U8L2g0PgorPHA+U2FtZSBhcyBvbmUgZW50cnkgaW4gdGhlIGxpc3QgZ2l2ZW4gYnkgPGNvZGU+ZXhjbHVkZXBhY2thZ2VuYW1lczwvY29kZT4uPC9wPgorCis8aDU+UGFyYW1ldGVyczwvaDU+CitTYW1lIGFzIGZvciA8Y29kZT5wYWNrYWdlPC9jb2RlPi4KKworPGg0PnNvdXJjZTwvaDQ+Cis8cD5TYW1lIGFzIG9uZSBlbnRyeSBpbiB0aGUgbGlzdCBnaXZlbiBieSA8Y29kZT5zb3VyY2VmaWxlczwvY29kZT4uPC9wPgorCis8aDU+UGFyYW1ldGVyczwvaDU+Cis8dGFibGUgd2lkdGg9IjkwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzb3VyY2UgZmlsZSB0byBkb2N1bWVudDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0PmRvY3RpdGxlPC9oND4KKworPHA+U2FtZSBhcyB0aGUgPGNvZGU+ZG9jdGl0bGU8L2NvZGU+IGF0dHJpYnV0ZSwgYnV0IHlvdSBjYW4gbmVzdCB0ZXh0CitpbnNpZGUgdGhlIGVsZW1lbnQgdGhpcyB3YXkuPC9wPgorCis8aDQ+aGVhZGVyPC9oND4KKworPHA+U2ltaWxhciB0byA8Y29kZT4mbHQ7ZG9jdGl0bGUmZ3Q7PC9jb2RlPi48L3A+CisKKzxoND5mb290ZXI8L2g0PgorCis8cD5TaW1pbGFyIHRvIDxjb2RlPiZsdDtkb2N0aXRsZSZndDs8L2NvZGU+LjwvcD4KKworPGg0PmJvdHRvbTwvaDQ+CisKKzxwPlNpbWlsYXIgdG8gPGNvZGU+Jmx0O2RvY3RpdGxlJmd0OzwvY29kZT4uPC9wPgorCis8aDQ+bGluazwvaDQ+Cis8cD5DcmVhdGUgbGluayB0byBqYXZhZG9jIG91dHB1dCBhdCB0aGUgZ2l2ZW4gVVJMLiBUaGlzIHBlcmZvcm1zIHRoZQorc2FtZSByb2xlIGFzIHRoZSBsaW5rIGFuZCBsaW5rb2ZmbGluZSBhdHRyaWJ1dGVzLiBZb3UgY2FuIHVzZSBlaXRoZXIKK3N5bnRheCAob3IgYm90aCBhdCBvbmNlKSwgYnV0IHdpdGggdGhlIG5lc3RlZCBlbGVtZW50cyB5b3UgY2FuIGVhc2lseQorc3BlY2lmeSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGUgYXJndW1lbnRzLjwvcD4KKworPGg1PlBhcmFtZXRlcnM8L2g1PgorPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aHJlZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgVVJMIGZvciB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiB5b3Ugd2lzaAorICAgIHRvIGxpbmsgdG8uICBUaGlzIGNhbiBiZSBhbiBhYnNvbHV0ZSBVUkwsIG9yIGEgcmVsYXRpdmUgZmlsZQorICAgIG5hbWUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm9mZmxpbmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VHJ1ZSBpZiB0aGlzIGxpbmsgaXMgbm90IGF2YWlsYWJsZSBvbmxpbmUgYXQgdGhlIHRpbWUgb2YKKyAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50YXRpb248L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYWNrYWdlbGlzdExvYzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbG9jYXRpb24gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwYWNrYWdlLWxpc3QgZmlsZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk9ubHkgaWYgdGhlIG9mZmxpbmUgYXR0cmlidXRlIGlzIHRydWU8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvbHZlTGluazwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiB0aGUgbGluayBhdHRyaWJ1dGUgaXMgYSByZWxhdGl2ZSBmaWxlIG5hbWUsCisgICAgQW50IHdpbGwgZmlyc3QgdHJ5IHRvIGxvY2F0ZSB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudAorICAgIHByb2plY3QncyBiYXNlZGlyIGFuZCBpZiBpdCBmaW5kcyBhIGZpbGUgdGhlcmUgdXNlIGFuIGFic29sdXRlIFVSTAorICAgIGZvciB0aGUgbGluayBhdHRyaWJ1dGUsIG90aGVyd2lzZSBpdCB3aWxsIHBhc3MgdGhlIGZpbGUgbmFtZQorICAgIHZlcmJhdGltIHRvIHRoZSBqYXZhZG9jIGNvbW1hbmQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIGZhbHNlLjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+PGEgbmFtZT0iZ3JvdXBlbGVtZW50Ij5ncm91cDwvYT48L2g0PgorPHA+U2VwYXJhdGVzIHBhY2thZ2VzIG9uIHRoZSBvdmVydmlldyBwYWdlIGludG8gd2hhdGV2ZXIgZ3JvdXBzIHlvdQorc3BlY2lmeSwgb25lIGdyb3VwIHBlciB0YWJsZS4gVGhpcyBwZXJmb3JtcyB0aGUgc2FtZSByb2xlIGFzIHRoZSBncm91cAorYXR0cmlidXRlLiBZb3UgY2FuIHVzZSBlaXRoZXIgc3ludGF4IChvciBib3RoIGF0IG9uY2UpLCBidXQgd2l0aCB0aGUKK25lc3RlZCBlbGVtZW50cyB5b3UgY2FuIGVhc2lseSBzcGVjaWZ5IG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZQorYXJndW1lbnRzLjwvcD4KKworPGg1PlBhcmFtZXRlcnM8L2g1PgorPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGl0bGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGl0bGUgb2YgdGhlIGdyb3VwPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgdW5sZXNzIG5lc3RlZCA8Y29kZT4mbHQ7dGl0bGUmZ3Q7PC9jb2RlPiBnaXZlbjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhY2thZ2VzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkxpc3Qgb2YgcGFja2FnZXMgdG8gaW5jbHVkZSBpbiB0aGF0IGdyb3VwLiBNdWx0aXBsZSBwYWNrYWdlcyBhcmUgc2VwYXJhdGVkIHdpdGggJzonLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBuZXN0ZWQgPGNvZGU+Jmx0O3BhY2thZ2UmZ3Q7PC9jb2RlPnMgZ2l2ZW48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+VGhlIHRpdGxlIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBuZXN0ZWQgPGNvZGU+Jmx0O3RpdGxlJmd0OzwvY29kZT4gZWxlbWVudAord2l0aCB0ZXh0IGNvbnRlbnRzLCBhbmQgdGhlIHBhY2thZ2VzIG1heSBiZSBsaXN0ZWQgd2l0aCBuZXN0ZWQKKzxjb2RlPiZsdDtwYWNrYWdlJmd0OzwvY29kZT4gZWxlbWVudHMgYXMgZm9yIHRoZSBtYWluIHRhc2suPC9wPgorCis8aDQ+ZG9jbGV0PC9oND4KKzxwPlRoZSBkb2NsZXQgbmVzdGVkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkb2NsZXQgdGhhdCBqYXZhZG9jIHdpbGwKK3VzZSB0byBwcm9jZXNzIHRoZSBpbnB1dCBzb3VyY2UgZmlsZXMuIEEgbnVtYmVyIG9mIHRoZSBzdGFuZGFyZCBqYXZhZG9jIGFyZ3VtZW50cworYXJlIGFjdHVhbGx5IGFyZ3VtZW50cyBvZiB0aGUgc3RhbmRhcmQgZG9jbGV0LiBJZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGluIHRoZSBqYXZhZG9jCit0YXNrJ3MgYXR0cmlidXRlcywgdGhleSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZG9jbGV0IHNwZWNpZmllZCBpbiB0aGUKKzxjb2RlPiZsdDtkb2NsZXQmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudC4gU3VjaCBhdHRyaWJ1dGVzIHNob3VsZCBvbmx5IGJlIHNwZWNpZmllZCwKK3RoZXJlZm9yZSwgaWYgdGhleSBjYW4gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIGRvY2xldCBpbiB1c2UuPC9wPgorCis8cD5JZiB0aGUgZG9jbGV0IHJlcXVpcmVzIGFkZGl0aW9uYWwgcGFyYW1ldGVycywgdGhlc2UgY2FuIGJlIHNwZWNpZmllZCB3aXRoCis8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiBlbGVtZW50cyB3aXRoaW4gdGhlIDxjb2RlPiZsdDtkb2NsZXQmZ3Q7PC9jb2RlPgorZWxlbWVudC4gVGhlc2UgcGFyYW1ldGVycyBhcmUgcmVzdHJpY3RlZCB0byBzaW1wbGUgc3RyaW5ncy4gQW4gZXhhbXBsZSB1c2FnZQorb2YgdGhlIGRvY2xldCBlbGVtZW50IGlzIHNob3duIGJlbG93OjwvcD4KKworPHByZT4gICZsdDtqYXZhZG9jIC4uLiAmZ3Q7CisgICAgICZsdDtkb2NsZXQgbmFtZT0mcXVvdDt0aGVEb2NsZXQmcXVvdDsKKyAgICAgICAgICAgICBwYXRoPSZxdW90O3BhdGgvdG8vdGhlRG9jbGV0JnF1b3Q7Jmd0OworICAgICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDstZm9vJnF1b3Q7IHZhbHVlPSZxdW90O2Zvb3ZhbHVlJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7LWJhciZxdW90OyB2YWx1ZT0mcXVvdDtiYXJ2YWx1ZSZxdW90Oy8mZ3Q7CisgICAgICZsdDsvZG9jbGV0Jmd0OworICAmbHQ7L2phdmFkb2MmZ3Q7Cis8L3ByZT4KKworPGg0PjxhIG5hbWU9InRhZ2VsZW1lbnQiPnRhZzwvYT48L2g0PgorCis8cD5UaGUgdGFnIG5lc3RlZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSBjdXN0b20gdGFncy4gVGhpcyBvcHRpb24KK2lzIG9ubHkgYXZhaWxhYmxlIHdpdGggSmF2YSAxLjQuPC9wPgorCis8cD5JZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgc3RhbmRhcmQgdGFnIHVzaW5nIGEgbmVzdGVkIHRhZyBlbGVtZW50CitiZWNhdXNlIHlvdSB3YW50IHRvIGRldGVybWluZSB0aGUgb3JkZXIgdGhlIHRhZ3MgYXJlIG91dHB1dCwgeW91IG11c3QKK25vdCBzZXQgdGhlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZSBmb3IgdGhvc2UgdGFncy48L3A+CisKKzxoNT5QYXJhbWV0ZXJzPC9oNT4KKzx0YWJsZSB3aWR0aD0iOTAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiB0aGUgdGFnIChlLmcuIDxjb2RlPnRvZG88L2NvZGU+KTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyB0aGUgPGNvZGU+ZGlyPC9jb2RlPiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc2NyaXB0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRlc2NyaXB0aW9uIGZvciB0YWcgKGUuZy4gPGNvZGU+VG8gZG86PC9jb2RlPik8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+CisgICAgICBObywgdGhlIGphdmFkb2MgZXhlY3V0YWJsZSB3aWxsIHBpY2sgYSBkZWZhdWx0IGlmIHRoaXMgaXMgbm90IHNwZWNpZmllZC4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lbmFibGVkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgb3Igbm90IHRoZSB0YWcgaXMgZW5hYmxlZCAoZGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4pPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2NvcGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2NvcGUgZm9yIHRoZSB0YWcgLSB0aGUgZWxlbWVudHMgaW4gd2hpY2ggaXQgY2FuIGJlIHVzZWQuIFRoaXMKKyAgICBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNvbWUgb2YgdGhlIGVsZW1lbnRzOiA8Y29kZT5vdmVydmlldzwvY29kZT4sCisgICAgPGNvZGU+cGFja2FnZXM8L2NvZGU+LCA8Y29kZT50eXBlczwvY29kZT4sIDxjb2RlPmNvbnN0cnVjdG9yczwvY29kZT4sCisgICAgPGNvZGU+bWV0aG9kczwvY29kZT4sIDxjb2RlPmZpZWxkczwvY29kZT4gb3IgdGhlIGRlZmF1bHQsIDxjb2RlPmFsbDwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhpcyBlbGVtZW50IHdpbGwgYmVoYXZlIGFzIGFuIGltcGxpY2l0CisgICAgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4uIFRoZSBmaWxlcyBpbmNsdWRlZCBieSB0aGlzIGZpbGVzZXQgc2hvdWxkCisgICAgY29udGFpbiBlYWNoIHRhZyBkZWZpbml0aW9uIG9uIGEgc2VwYXJhdGUgbGluZSwgYXMgZGVzY3JpYmVkIGluIHRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL3Rvb2xkb2NzL3dpbmRvd3MvamF2YWRvYy5odG1sI3RhZyI+SmF2YWRvYyByZWZlcmVuY2UgZ3VpZGU8L2E+OgorICAgIDxwcmU+ZWpiLmJlYW46dDpYRG9jbGV0IEVKQiBUYWcKK3RvZG86YTpUbyBEbzwvcHJlPgorICAgICAgPGI+Tm90ZTo8L2I+IFRoZSAgSmF2YWRvYyByZWZlcmVuY2UgcXVpZGUgaGFzIGRvdWJsZSBxdW90ZXMgYXJvdW5kCit0aGUgZGVzY3JpcHRpb24gcGFydCBvZiB0aGUgZGVmaW5pdGlvbi4gVGhpcyB3aWxsIG5vdCB3b3JrIHdoZW4gdXNlZCBpbgorYSBmaWxlLCBhcyB0aGUgZGVmaW5pdGlvbiBpcyBxdW90ZWQgYWdhaW4gd2hlbiBnaXZlbiB0bwordGhlIGphdmFkb2MgcHJvZ3JhbS4KKyAgICA8YnIvPgorICAgICAgPGI+Tm90ZTo8L2I+IElmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgYWxsIHRoZSBvdGhlciBhdHRyaWJ1dGVzIGluIHRoaXMKKyAgICBlbGVtZW50IHdpbGwgYmUgaWdub3JlZC4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0PjxhIG5hbWU9InRhZ2xldGVsZW1lbnQiPnRhZ2xldDwvYT48L2g0PgorPHA+VGhlIHRhZ2xldCBuZXN0ZWQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgY3VzdG9tIHRhZ2xldHMuIFRoaXMgb3B0aW9uIGlzCitvbmx5IGF2YWlsYWJsZSB3aXRoIEphdmEgMS40LjwvcD4KKworPGg1PlBhcmFtZXRlcnM8L2g1PgorPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgdGFnbGV0IGNsYXNzCisgICAgICAgICAgICAgIChlLmcuIDxjb2RlPmNvbS5zdW4udG9vbHMuZG9jbGV0cy5Ub0RvVGFnbGV0PC9jb2RlPik8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIHBhdGggc3BlY2lmeWluZyB0aGUgc2VhcmNoIHBhdGggZm9yIHRoZSB0YWdsZXQgY2xhc3MKKyAgICAgICAgICAgIChlLmcuIDxjb2RlPi9ob21lL3RhZ2xldHM8L2NvZGU+KS4KKyAgICAgICAgICAgIFRoZSBwYXRoIG1heSBhbHNvIGJlIHNwZWNpZmllZCBieSBhIG5lc3RlZCA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGVsZW1lbnQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0PnNvdXJjZXBhdGgsIGNsYXNzcGF0aCBhbmQgYm9vdGNsYXNzcGF0aDwvaDQ+Cis8cD48Y29kZT5KYXZhZG9jPC9jb2RlPidzIDxpPnNvdXJjZXBhdGg8L2k+LCA8aT5jbGFzc3BhdGg8L2k+IGFuZAorPGk+Ym9vdGNsYXNzcGF0aDwvaT4gYXR0cmlidXRlcyBhcmUgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRIIGxpa2UKK3N0cnVjdHVyZTwvYT4gYW5kIGNhbiBhbHNvIGJlIHNldCB2aWEgbmVzdGVkIDxpPnNvdXJjZXBhdGg8L2k+LAorPGk+Y2xhc3NwYXRoPC9pPiBhbmQgPGk+Ym9vdGNsYXNzcGF0aDwvaT4gZWxlbWVudHMKK3Jlc3BlY3RpdmVseS48L3A+CisKKzxoND5hcmc8L2g0PgorCis8cD5Vc2UgbmVzdGVkIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiB0byBzcGVjaWZ5IGFkZGl0aW9uYWwKK2FyZ3VtZW50cy4gIFNlZSA8YSBocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZCBsaW5lCithcmd1bWVudHM8L2E+LiA8ZW0+U2luY2UgQW50IDEuNjwvZW0+PC9wPgorCis8aDM+RXhhbXBsZTwvaDM+Cis8cHJlPiAgJmx0O2phdmFkb2MgcGFja2FnZW5hbWVzPSZxdW90O2NvbS5kdW1teS50ZXN0LiomcXVvdDsKKyAgICAgICAgICAgc291cmNlcGF0aD0mcXVvdDtzcmMmcXVvdDsKKyAgICAgICAgICAgZXhjbHVkZXBhY2thZ2VuYW1lcz0mcXVvdDtjb20uZHVtbXkudGVzdC5kb2MtZmlsZXMuKiZxdW90OworICAgICAgICAgICBkZWZhdWx0ZXhjbHVkZXM9JnF1b3Q7eWVzJnF1b3Q7CisgICAgICAgICAgIGRlc3RkaXI9JnF1b3Q7ZG9jcy9hcGkmcXVvdDsKKyAgICAgICAgICAgYXV0aG9yPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgdmVyc2lvbj0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgIHVzZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgIHdpbmRvd3RpdGxlPSZxdW90O1Rlc3QgQVBJJnF1b3Q7Jmd0OworICAgICZsdDtkb2N0aXRsZSZndDsmbHQ7IVtDREFUQVsmbHQ7aDEmZ3Q7VGVzdCZsdDsvaDEmZ3Q7XV0mZ3Q7Jmx0Oy9kb2N0aXRsZSZndDsKKyAgICAmbHQ7Ym90dG9tJmd0OyZsdDshW0NEQVRBWyZsdDtpJmd0O0NvcHlyaWdodCAmYW1wOyMxNjk7IDIwMDAgRHVtbXkgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4mbHQ7L2kmZ3Q7XV0mZ3Q7Jmx0Oy9ib3R0b20mZ3Q7CisgICAgJmx0O3RhZyBuYW1lPSZxdW90O3RvZG8mcXVvdDsgc2NvcGU9JnF1b3Q7YWxsJnF1b3Q7IGRlc2NyaXB0aW9uPSZxdW90O1RvIGRvOiZxdW90Oy8mZ3Q7CisgICAgJmx0O2dyb3VwIHRpdGxlPSZxdW90O0dyb3VwIDEgUGFja2FnZXMmcXVvdDsgcGFja2FnZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuYSomcXVvdDsvJmd0OworICAgICZsdDtncm91cCB0aXRsZT0mcXVvdDtHcm91cCAyIFBhY2thZ2VzJnF1b3Q7IHBhY2thZ2VzPSZxdW90O2NvbS5kdW1teS50ZXN0LmIqOmNvbS5kdW1teS50ZXN0LmMqJnF1b3Q7LyZndDsKKyAgICAmbHQ7bGluayBvZmZsaW5lPSZxdW90O3RydWUmcXVvdDsgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9hcGkvJnF1b3Q7IHBhY2thZ2VsaXN0TG9jPSZxdW90O0M6XHRtcCZxdW90Oy8mZ3Q7CisgICAgJmx0O2xpbmsgaHJlZj0mcXVvdDtodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvcHJvZHVjdHMveG1sL2RvY3MvYXBpLyZxdW90Oy8mZ3Q7CisgICZsdC9qYXZhZG9jJmd0OzwvcHJlPgorCis8cD5pcyB0aGUgc2FtZSBhczwvcD4KKworPHByZT4gICZsdDtqYXZhZG9jCisgICAgICAgICAgIGRlc3RkaXI9JnF1b3Q7ZG9jcy9hcGkmcXVvdDsKKyAgICAgICAgICAgYXV0aG9yPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgdmVyc2lvbj0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgIHVzZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgIHdpbmRvd3RpdGxlPSZxdW90O1Rlc3QgQVBJJnF1b3Q7Jmd0OworCisgICAgJmx0O3BhY2thZ2VzZXQgZGlyPSZxdW90O3NyYyZxdW90OyBkZWZhdWx0ZXhjbHVkZXM9JnF1b3Q7eWVzJnF1b3Q7Jmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtjb20vZHVtbXkvdGVzdC8qKiZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O2NvbS9kdW1teS90ZXN0L2RvYy1maWxlcy8qKiZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9wYWNrYWdlc2V0Jmd0OworCisgICAgJmx0O2RvY3RpdGxlJmd0OyZsdDshW0NEQVRBWyZsdDtoMSZndDtUZXN0Jmx0Oy9oMSZndDtdXSZndDsmbHQ7L2RvY3RpdGxlJmd0OworICAgICZsdDtib3R0b20mZ3Q7Jmx0OyFbQ0RBVEFbJmx0O2kmZ3Q7Q29weXJpZ2h0ICZhbXA7IzE2OTsgMjAwMCBEdW1teSBDb3JwLiBBbGwgUmlnaHRzIFJlc2VydmVkLiZsdDsvaSZndDtdXSZndDsmbHQ7L2JvdHRvbSZndDsKKyAgICAmbHQ7dGFnIG5hbWU9JnF1b3Q7dG9kbyZxdW90OyBzY29wZT0mcXVvdDthbGwmcXVvdDsgZGVzY3JpcHRpb249JnF1b3Q7VG8gZG86JnF1b3Q7LyZndDsKKyAgICAmbHQ7Z3JvdXAgdGl0bGU9JnF1b3Q7R3JvdXAgMSBQYWNrYWdlcyZxdW90OyBwYWNrYWdlcz0mcXVvdDtjb20uZHVtbXkudGVzdC5hKiZxdW90Oy8mZ3Q7CisgICAgJmx0O2dyb3VwIHRpdGxlPSZxdW90O0dyb3VwIDIgUGFja2FnZXMmcXVvdDsgcGFja2FnZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuYio6Y29tLmR1bW15LnRlc3QuYyomcXVvdDsvJmd0OworICAgICZsdDtsaW5rIG9mZmxpbmU9JnF1b3Q7dHJ1ZSZxdW90OyBocmVmPSZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2FwaS8mcXVvdDsgcGFja2FnZWxpc3RMb2M9JnF1b3Q7QzpcdG1wJnF1b3Q7LyZndDsKKyAgICAmbHQ7bGluayBocmVmPSZxdW90O2h0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9wcm9kdWN0cy94bWwvZG9jcy9hcGkvJnF1b3Q7LyZndDsKKyAgJmx0L2phdmFkb2MmZ3Q7PC9wcmU+CisKKzxwPm9yPC9wPgorCis8cHJlPiAgJmx0O2phdmFkb2MKKyAgICAgICAgICAgZGVzdGRpcj0mcXVvdDtkb2NzL2FwaSZxdW90OworICAgICAgICAgICBhdXRob3I9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgICB2ZXJzaW9uPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgdXNlPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgd2luZG93dGl0bGU9JnF1b3Q7VGVzdCBBUEkmcXVvdDsmZ3Q7CisKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjJnF1b3Q7IGRlZmF1bHRleGNsdWRlcz0mcXVvdDt5ZXMmcXVvdDsmZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2NvbS9kdW1teS90ZXN0LyoqJnF1b3Q7LyZndDsKKyAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7Y29tL2R1bW15L3Rlc3QvZG9jLWZpbGVzLyoqJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisKKyAgICAmbHQ7ZG9jdGl0bGUmZ3Q7Jmx0OyFbQ0RBVEFbJmx0O2gxJmd0O1Rlc3QmbHQ7L2gxJmd0O11dJmd0OyZsdDsvZG9jdGl0bGUmZ3Q7CisgICAgJmx0O2JvdHRvbSZndDsmbHQ7IVtDREFUQVsmbHQ7aSZndDtDb3B5cmlnaHQgJmFtcDsjMTY5OyAyMDAwIER1bW15IENvcnAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJmx0Oy9pJmd0O11dJmd0OyZsdDsvYm90dG9tJmd0OworICAgICZsdDt0YWcgbmFtZT0mcXVvdDt0b2RvJnF1b3Q7IHNjb3BlPSZxdW90O2FsbCZxdW90OyBkZXNjcmlwdGlvbj0mcXVvdDtUbyBkbzomcXVvdDsvJmd0OworICAgICZsdDtncm91cCB0aXRsZT0mcXVvdDtHcm91cCAxIFBhY2thZ2VzJnF1b3Q7IHBhY2thZ2VzPSZxdW90O2NvbS5kdW1teS50ZXN0LmEqJnF1b3Q7LyZndDsKKyAgICAmbHQ7Z3JvdXAgdGl0bGU9JnF1b3Q7R3JvdXAgMiBQYWNrYWdlcyZxdW90OyBwYWNrYWdlcz0mcXVvdDtjb20uZHVtbXkudGVzdC5iKjpjb20uZHVtbXkudGVzdC5jKiZxdW90Oy8mZ3Q7CisgICAgJmx0O2xpbmsgb2ZmbGluZT0mcXVvdDt0cnVlJnF1b3Q7IGhyZWY9JnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvYXBpLyZxdW90OyBwYWNrYWdlbGlzdExvYz0mcXVvdDtDOlx0bXAmcXVvdDsvJmd0OworICAgICZsdDtsaW5rIGhyZWY9JnF1b3Q7aHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL3Byb2R1Y3RzL3htbC9kb2NzL2FwaS8mcXVvdDsvJmd0OworICAmbHQvamF2YWRvYyZndDs8L3ByZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2xlbmd0aC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2xlbmd0aC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmZDMyYWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbGVuZ3RoLmh0bWwKQEAgLTAsMCArMSwxMjAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+TGVuZ3RoIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPkxlbmd0aDwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+RGlzcGxheSBvciBzZXQgYSBwcm9wZXJ0eSBjb250YWluaW5nIGxlbmd0aCBpbmZvcm1hdGlvbiBmb3IKKyAgIGEgc3RyaW5nLCBhIGZpbGUsIG9yIG9uZSBvciBtb3JlIG5lc3RlZAorICAgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+cy4KKyAgIENhbiBhbHNvIGJlIHVzZWQgYXMgYSBjb25kaXRpb24uIDxiPlNpbmNlIEFudCAxLjYuMzwvYj48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJvcGVydHkgdG8gc2V0LiAgSWYgb21pdHRlZAorICAgICAgdGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gdG8gdGhlIGxvZy4gSWdub3JlZCB3aGVuCisgICAgICBwcm9jZXNzaW5nIGFzIGEgY29uZGl0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2luZ2xlIGZpbGUgd2hvc2UgbGVuZ3RoIHRvIHJlcG9ydC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+T25lIG9mIHRoZXNlLAorICAgICAgb3Igb25lIG9yIG1vcmUgbmVzdGVkIGZpbGVzZXRzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3RyaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdHJpbmcgd2hvc2UgbGVuZ3RoIHRvIHJlcG9ydC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tb2RlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkZpbGUgbGVuZ3RoIG1vZGU7IHdoZW4gJnF1b3Q7YWxsJnF1b3Q7IHRoZSByZXN1bHRpbmcKKyAgICAgIHZhbHVlIGlzIHRoZSBzdW0gb2YgYWxsIGluY2x1ZGVkIHJlc291cmNlcycgbGVuZ3Roczsgd2hlbiAmcXVvdDtlYWNoJnF1b3Q7CisgICAgICB0aGUgdGFzayBvdXRwdXRzIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBsZW5ndGggb2YgZWFjaCBpbmNsdWRlZCByZXNvdXJjZSwKKyAgICAgIG9uZSBwZXIgbGluZS4gSWdub3JlZCB3aGVuIHByb2Nlc3NpbmcgYXMgYSBjb25kaXRpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGlzICZxdW90O2FsbCZxdW90OzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRyaW08L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byB0cmltIHdoZW4gb3BlcmF0aW5nIG9uIGEgc3RyaW5nLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzsgb25seSB2YWxpZCB3aGVuIHN0cmluZyBpcyBzZXQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sZW5ndGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tcGFyaXNvbiBsZW5ndGggZm9yIHByb2Nlc3NpbmcgYXMgYSBjb25kaXRpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgaW4gY29uZGl0aW9uIG1vZGU8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj53aGVuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbXBhcmlzb24gdHlwZTogImVxdWFsIiwgImVxIiwgImdyZWF0ZXIiLCAiZ3QiLCAibGVzcyIsCisgICAgICAibHQiLCAiZ2UiIChncmVhdGVyIG9yIGVxdWFsKSwgIm5lIiAobm90IGVxdWFsKSwgImxlIiAobGVzcyBvciBlcXVhbCkKKyAgICAgIGZvciB1c2Ugd2hlbiBvcGVyYXRpbmcgYXMgYSBjb25kaXRpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGlzICJlcXVhbCI8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND5SZXNvdXJjZSBDb2xsZWN0aW9uczwvaDQ+Cis8cD5Zb3UgY2FuIGluY2x1ZGUgcmVzb3VyY2VzIHZpYSBuZXN0ZWQKKyAgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+cy48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwcmU+Jmx0O2xlbmd0aCBzdHJpbmc9JnF1b3Q7Zm9vJnF1b3Q7IHByb3BlcnR5PSZxdW90O2xlbmd0aC5mb28mcXVvdDsgLyZndDsKKzwvcHJlPgorPHA+U3RvcmVzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAmcXVvdDtmb28mcXVvdDsgaW4gdGhlIHByb3BlcnR5IG5hbWVkCis8aT5sZW5ndGguZm9vPC9pPi48L3A+CisKKzxwcmU+Jmx0O2xlbmd0aCBmaWxlPSZxdW90O2JhciZxdW90OyBwcm9wZXJ0eT0mcXVvdDtsZW5ndGguYmFyJnF1b3Q7IC8mZ3Q7Cis8L3ByZT4KKzxwPlN0b3JlcyB0aGUgbGVuZ3RoIG9mIGZpbGUgJnF1b3Q7YmFyJnF1b3Q7IGluIHRoZSBwcm9wZXJ0eSBuYW1lZAorPGk+bGVuZ3RoLmJhcjwvaT4uPC9wPgorCis8cHJlPgorJmx0O2xlbmd0aCBwcm9wZXJ0eT0mcXVvdDtsZW5ndGgmcXVvdDsgbW9kZT0mcXVvdDtlYWNoJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7IGluY2x1ZGVzPSZxdW90O2ZvbyxiYXImcXVvdDsvJmd0OworJmx0Oy9sZW5ndGgmZ3Q7Cis8L3ByZT4KKzxwPldyaXRlcyB0aGUgZmlsZSBwYXRocyBvZiA8aT5mb288L2k+IGFuZCA8aT5iYXI8L2k+IGFuZCB0aGVpciBsZW5ndGggaW50byAKK3RoZSBwcm9wZXJ0eSA8aT5sZW5ndGg8L2k+LjwvcD4KKworPHByZT4KKyZsdDtsZW5ndGggcHJvcGVydHk9JnF1b3Q7bGVuZ3RoJnF1b3Q7IG1vZGU9JnF1b3Q7YWxsJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7IGluY2x1ZGVzPSZxdW90O2ZvbyxiYXImcXVvdDsvJmd0OworJmx0Oy9sZW5ndGgmZ3Q7Cis8L3ByZT4KKzxwPkFkZHMgdGhlIGxlbmd0aCBvZiA8aT5mb288L2k+IGFuZCA8aT5iYXI8L2k+IGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBwcm9wZXJ0eSA8aT5sZW5ndGg8L2k+LjwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9sb2FkZmlsZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2xvYWRmaWxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiZWZiYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9sb2FkZmlsZS5odG1sCkBAIC0wLDAgKzEsMTMzIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Mb2FkRmlsZSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKworPGgyPjxhIG5hbWU9ImxvYWRmaWxlIj5Mb2FkRmlsZTwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPgorU3BlY2lhbGl6YXRpb24gb2YgPGEgaHJlZj0ibG9hZHJlc291cmNlLmh0bWwiPmxvYWRyZXNvdXJjZTwvYT4gdGhhdAord29ya3Mgb24gZmlsZXMgZXhjbHVzaXZlbHkgYW5kIHByb3ZpZGVzIGEgc3JjRmlsZSBhdHRyaWJ1dGUgZm9yCitjb252ZW5pZW5jZS4gIFVubGVzcyBhbiBlbmNvZGluZyBpcyBzcGVjaWZpZWQsIHRoZSBlbmNvZGluZyBvZiB0aGUKK2N1cnJlbnQgbG9jYWxlIGlzIHVzZWQuCis8L3A+Cis8cD5JZiB0aGUgcmVzb3VyY2UgY29udGVudCBpcyBlbXB0eSAobWF5YmUgYWZ0ZXIgcHJvY2Vzc2luZyBhIGZpbHRlcmNoYWluKSAKK3RoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LjwvcD4KKworCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNGaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZSBmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5IHRvIHNhdmUgdG88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2RpbmcgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaGFsdCB0aGUgYnVpbGQgb24gZmFpbHVyZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAidHJ1ZSI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5xdWlldDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgZGlzcGxheSBhIGRpYWdub3N0aWMgbWVzc2FnZSAodW5sZXNzIEFudCBoYXMgYmVlbiAKKyAgICBpbnZva2VkIHdpdGggdGhlIDxjb2RlPi12ZXJib3NlPC9jb2RlPiBvciA8Y29kZT4tZGVidWc8L2NvZGU+CisgICAgc3dpdGNoZXMpIG9yIG1vZGlmeSB0aGUgZXhpdCBzdGF0dXMgdG8gcmVmbGVjdCBhbiBlcnJvci4gU2V0dGluZyB0aGlzIHRvIAorICAgICJ0cnVlIiBpbXBsaWVzIHNldHRpbmcgZmFpbG9uZXJyb3IgdG8gImZhbHNlIi4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS43LjAuPC9lbT4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgImZhbHNlIjwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+Cis8cD4KK1RoZSBMb2FkRmlsZSB0YXNrIHN1cHBvcnRzIG5lc3RlZCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+CitGaWx0ZXJDaGFpbjwvYT5zLgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4gICAgJmx0O2xvYWRmaWxlIHByb3BlcnR5PSJtZXNzYWdlIgorICAgICAgc3JjRmlsZT0ibWVzc2FnZS50eHQiLyZndDsKKzwvcHJlPgorTG9hZCBmaWxlIG1lc3NhZ2UudHh0IGludG8gcHJvcGVydHkgIm1lc3NhZ2UiOyBhbiA8dHQ+Jmx0O2VjaG8mZ3Q7PC90dD4KK2NhbiBwcmludCB0aGlzLiAgVGhpcyBpcyBpZGVudGljYWwgdG8KKzxwcmU+ICAgICZsdDtsb2FkcmVzb3VyY2UgcHJvcGVydHk9Im1lc3NhZ2UiJmd0OworICAgICAgICZsdDtmaWxlIGZpbGU9Im1lc3NhZ2UudHh0Ii8mZ3Q7CisgICAgJmx0Oy9sb2FkcmVzb3VyY2UmZ3Q7Cis8L3ByZT4KKzwvcD4KKworPHByZT4gICAgJmx0O2xvYWRmaWxlIHByb3BlcnR5PSJlbmNvZGVkLWZpbGUiCisgICAgICBzcmNGaWxlPSJsb2FkZmlsZS54bWwiCisgICAgICBlbmNvZGluZz0iSVNPLTg4NTktMSIvJmd0OworPC9wcmU+CitMb2FkIGEgZmlsZSB1c2luZyB0aGUgbGF0aW4tMSBlbmNvZGluZworCis8cHJlPiAgICAmbHQ7bG9hZGZpbGUKKyAgICAgIHByb3BlcnR5PSJvcHRpb25hbC52YWx1ZSIKKyAgICAgIHNyY0ZpbGU9Im9wdGlvbmFsLnR4dCIKKyAgICAgIGZhaWxvbmVycm9yPSJmYWxzZSIvJmd0OworPC9wcmU+CitMb2FkIGEgZmlsZSwgZG9uJ3QgZmFpbCBpZiBpdCBpcyBtaXNzaW5nIChhIG1lc3NhZ2UgaXMgcHJpbnRlZCwgdGhvdWdoKQorCis8cHJlPiAgICAmbHQ7bG9hZGZpbGUKKyAgICAgIHByb3BlcnR5PSJtYWlsLnJlY2lwaWVudHMiCisgICAgICBzcmNGaWxlPSJyZWNpcGllbnRsaXN0LnR4dCImZ3Q7CisgICAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgICAgICZsdDs8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCNzdHJpcGxpbmVicmVha3MiPnN0cmlwbGluZWJyZWFrczwvYT4vJmd0OworICAgICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7L2xvYWRmaWxlJmd0OworPC9wcmU+CitMb2FkIGEgcHJvcGVydHkgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgZm9yIGFub3RoZXIgdGFzayAoaW4gdGhpcyBjYXNlIG1haWwpLAorbWVyZ2luZyBsaW5lcyB0byBlbnN1cmUgdGhpcyBoYXBwZW5zLgorCis8cHJlPiAgICAmbHQ7bG9hZGZpbGUKKyAgICAgIHByb3BlcnR5PSJzeXN0ZW0uY29uZmlndXJhdGlvbi54bWwiCisgICAgICBzcmNGaWxlPSJjb25maWd1cmF0aW9uLnhtbCImZ3Q7CisgICAgICAgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAgICAgICAmbHQ7PGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbHRlcmNoYWluLmh0bWwjZXhwYW5kcHJvcGVydGllcyI+ZXhwYW5kcHJvcGVydGllczwvYT4vJmd0OworICAgICAgICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworICAgICZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT4KK0xvYWQgYW4gWE1MIGZpbGUgaW50byBhIHByb3BlcnR5LCBleHBhbmRpbmcgYWxsIHByb3BlcnRpZXMgZGVjbGFyZWQKK2luIHRoZSBmaWxlIGluIHRoZSBwcm9jZXNzLgorCisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9sb2FkcHJvcGVydGllcy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2xvYWRwcm9wZXJ0aWVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyNTNjMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9sb2FkcHJvcGVydGllcy5odG1sCkBAIC0wLDAgKzEsMTI3IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Mb2FkUHJvcGVydGllcyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKworPGgyPjxhIG5hbWU9ImxvYWRwcm9wZXJ0aWVzIj5Mb2FkUHJvcGVydGllczwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPgorTG9hZCBhIGZpbGUncyBjb250ZW50cyBhcyBBbnQgcHJvcGVydGllcy4gIFRoaXMgaXMgZXF1aXZhbGVudAordG8gPGNvZGU+Jmx0O3Byb3BlcnR5IGZpbGV8cmVzb3VyY2U9JnF1b3Q7Li4uJnF1b3Q7LyZndDs8L2NvZGU+IGV4Y2VwdCB0aGF0IGl0CitzdXBwb3J0cyBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbHRlcmNoYWluJmd0OzwvY29kZT4gZWxlbWVudHMuCitBbHNvIGlmIHRoZSBmaWxlIGlzIG1pc3NpbmcsIHRoZSBidWlsZCBpcyBoYWx0ZWQgd2l0aCBhbiBlcnJvciwgcmF0aGVyCit0aGFuIGEgd2FybmluZyBiZWluZyBwcmludGVkLgorPC9wPgorCis8cD5JZiB5b3Ugd2FudCB0byBzaW11bGF0ZSA8YSBocmVmPSJwcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eTwvYT4ncworcHJlZml4IGF0dHJpYnV0ZSwgcGxlYXNlIHVzZSA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL2ZpbHRlcmNoYWluLmh0bWwjcHJlZml4bGluZXMiPnByZWZpeGxpbmVzPC9hPgorZmlsdGVyLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjRmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2UgZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIiBhbGlnbj0iY2VudGVyIj5PbmUgb2YgdGhlc2Ugb3IgYQorICAgICAgICAgIG5lc3RlZCByZXNvdXJjZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlc291cmNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2RpbmcgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2UsCisgICAgICBnaXZlbiBhcyA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4KKyAgICAgIHRvIGEgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiBkZWZpbmVkIGVsc2V3aGVyZS4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+YW55IDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHNpbmdsZSBlbGVtZW50CityZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KKworPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIHVzZWQgYXMgc3JjLiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC9wPgorCis8aDQ+PGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPjwvaDQ+CisKKzxoND5jbGFzc3BhdGg8L2g0PgorCis8cD5mb3IgdXNlIHdpdGggdGhlIDxpPnJlc291cmNlPC9pPiBhdHRyaWJ1dGUuPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4gICAgJmx0O2xvYWRwcm9wZXJ0aWVzIHNyY0ZpbGU9ImZpbGUucHJvcGVydGllcyIvJmd0OworPC9wcmU+CitvcgorPHByZT4KKyAgICAmbHQ7bG9hZHByb3BlcnRpZXMmZ3Q7CisgICAgICAmbHQ7ZmlsZSBmaWxlPSJmaWxlLnByb3BlcnRpZXMiLyZndDsKKyAgICAmbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OworPC9wcmU+CitMb2FkIGNvbnRlbnRzIG9mIGZpbGUucHJvcGVydGllcyBhcyBBbnQgcHJvcGVydGllcy4KKworPHByZT4gICAgJmx0O2xvYWRwcm9wZXJ0aWVzIHNyY0ZpbGU9ImZpbGUucHJvcGVydGllcyImZ3Q7CisgICAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgICAgICZsdDs8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCNsaW5lY29udGFpbnMiPmxpbmVjb250YWluczwvYT4mZ3Q7CisgICAgICAgICAgJmx0O2NvbnRhaW5zIHZhbHVlPSZxdW90O2ltcG9ydC4mcXVvdDsvJmd0OworICAgICAgICAmbHQ7L2xpbmVjb250YWlucyZndDsKKyAgICAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0Oy9sb2FkcHJvcGVydGllcyZndDsKKzwvcHJlPgorUmVhZCB0aGUgbGluZXMgdGhhdCBjb250YWluIHRoZSBzdHJpbmcgJnF1b3Q7aW1wb3J0LiZxdW90OworZnJvbSB0aGUgZmlsZSAmcXVvdDtmaWxlLnByb3BlcnRpZXMmcXVvdDsgYW5kIGxvYWQgdGhlbSBhcworQW50IHByb3BlcnRpZXMuCisKKzxwcmU+CisgICAgJmx0O2xvYWRwcm9wZXJ0aWVzJmd0OworICAgICAgJmx0OzxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCNnemlwcmVzb3VyY2UiPmd6aXByZXNvdXJjZTwvYT4mZ3Q7CisgICAgICAgICZsdDs8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjdXJsIj51cmw8L2E+IHVybD0iaHR0cDovL2V4YW1wbGUub3JnL3VybC5wcm9wZXJ0aWVzLmd6Ii8mZ3Q7CisgICAgICAmbHQ7L2d6aXByZXNvdXJjZSZndDsKKyAgICAmbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OworPC9wcmU+CitMb2FkIGNvbnRlbnRzIG9mIGh0dHA6Ly9leGFtcGxlLm9yZy91cmwucHJvcGVydGllcy5neiwgdW5jb21wcmVzcyBpdAorb24gdGhlIGZseSBhbmQgbG9hZCB0aGUgY29udGVudHMgYXMgQW50IHByb3BlcnRpZXMuCisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9sb2FkcmVzb3VyY2UuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9sb2FkcmVzb3VyY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmM1ZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2xvYWRyZXNvdXJjZS5odG1sCkBAIC0wLDAgKzEsOTAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkxvYWRSZXNvdXJjZSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKworPGgyPjxhIG5hbWU9ImxvYWRyZXNvdXJjZSI+TG9hZFJlc291cmNlPC9hPjwvaDI+CisKKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+CisKKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD4KK0xvYWQgYSB0ZXh0IHJlc291cmNlIGludG8gYSBzaW5nbGUgcHJvcGVydHkuIFVubGVzcyBhbiBlbmNvZGluZyBpcworc3BlY2lmaWVkLCB0aGUgZW5jb2Rpbmcgb2YgdGhlIGN1cnJlbnQgbG9jYWxlIGlzIHVzZWQuICBSZXNvdXJjZXMgdG8KK2xvYWQgYXJlIHNwZWNpZmllZCBhcyBuZXN0ZWQgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IGVsZW1lbnRzIG9yIHNpbmdsZQorZWxlbWVudCByZXNvdXJjZSBjb2xsZWN0aW9ucy4gSWYgdGhlIHJlc291cmNlIGNvbnRlbnQgaXMgZW1wdHkgKG1heWJlIGFmdGVyCitwcm9jZXNzaW5nIGEgZmlsdGVyY2hhaW4pIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LgorPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eSB0byBzYXZlIHRvPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIHJlc291cmNlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBoYWx0IHRoZSBidWlsZCBvbiBmYWlsdXJlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICJ0cnVlIjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnF1aWV0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBkaXNwbGF5IGEgZGlhZ25vc3RpYyBtZXNzYWdlICh1bmxlc3MgQW50IGhhcyBiZWVuIAorICAgIGludm9rZWQgd2l0aCB0aGUgPGNvZGU+LXZlcmJvc2U8L2NvZGU+IG9yIDxjb2RlPi1kZWJ1ZzwvY29kZT4KKyAgICBzd2l0Y2hlcykgb3IgbW9kaWZ5IHRoZSBleGl0IHN0YXR1cyB0byByZWZsZWN0IGFuIGVycm9yLiBTZXR0aW5nIHRoaXMgdG8gCisgICAgInRydWUiIGltcGxpZXMgc2V0dGluZyBmYWlsb25lcnJvciB0byAiZmFsc2UiLgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAiZmFsc2UiPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD4KK1RoZSBMb2FkUmVzb3VyY2UgdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPgorRmlsdGVyQ2hhaW48L2E+cy4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+CismbHQ7bG9hZHJlc291cmNlIHByb3BlcnR5PSJob21lcGFnZSImZ3Q7CisgICZsdDt1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvJmd0OworJmx0Oy9sb2FkcmVzb3VyY2UmZ3Q7Cis8L3ByZT4KK0xvYWQgdGhlIGVudHJ5IHBvaW50IG9mIEFudCdzIGhvbWVwYWdlIGludG8gcHJvcGVydHkgImhvbWVwYWdlIjsgYW4KKzx0dD4mbHQ7ZWNobyZndDs8L3R0PiBjYW4gcHJpbnQgdGhpcy4KKworPHA+Rm9yIG1vcmUgZXhhbXBsZXMgc2VlIHRoZSA8YSBocmVmPSJsb2FkZmlsZS5odG1sIj5sb2FkZmlsZTwvYT4gdGFzay48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbWFjcm9kZWYuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9tYWNyb2RlZi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDliOWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbWFjcm9kZWYuaHRtbApAQCAtMCwwICsxLDM3NiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPjwvbWV0YT4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorICAgIDx0aXRsZT5NYWNyb0RlZiBUYXNrPC90aXRsZT4KKyAgPC9oZWFkPgorCisgIDxib2R5PgorCisgICAgPGgyPjxhIG5hbWU9Im1hY3JvZGVmIj5NYWNyb0RlZjwvYT48L2gyPgorICAgIDxoMz5EZXNjcmlwdGlvbjwvaDM+CisgICAgPHA+CisgICAgICBUaGlzIGRlZmluZXMgYSBuZXcgdGFzayB1c2luZyBhIDxjb2RlPiZsdDtzZXF1ZW50aWFsJmd0OzwvY29kZT4KKyAgICAgIG5lc3RlZCB0YXNrIGFzIGEgdGVtcGxhdGUuIE5lc3RlZCBlbGVtZW50cyA8Y29kZT4mbHQ7YXR0cmlidXRlJmd0OzwvY29kZT4gYW5kCisgICAgICA8Y29kZT4mbHQ7ZWxlbWVudCZndDs8L2NvZGU+IGFyZSB1c2VkIHRvIHNwZWNpZnkgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgb2YKKyAgICAgIHRoZSBuZXcgdGFzay4gVGhlc2UgZ2V0IHN1YnN0aXR1dGVkIGludG8gdGhlIDxjb2RlPiZsdDtzZXF1ZW50aWFsJmd0OzwvY29kZT4KKyAgICAgIHRhc2sgd2hlbiB0aGUgbmV3IHRhc2sgaXMgcnVuLgorICAgIDwvcD4KKyAgICA8aDM+Tm90ZTwvaDM+CisgICAgPHA+CisgICAgICBZb3UgY2FuIGFsc28gdXNlIDxpPnByaW9yIGRlZmluZWQ8L2k+IGF0dHJpYnV0ZXMgZm9yIGRlZmF1bHQtdmFsdWVzIGluCisgICAgICBvdGhlciBhdHRyaWJ1dGVzLiBTZWUgdGhlIGV4YW1wbGVzLgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4KKyAgICA8L3A+CisgICAgPGgzPlBhcmFtZXRlcnM8L2gzPgorICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgbmV3IGRlZmluaXRpb24uPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj51cmk8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgIFRoZSB1cmkgdGhhdCB0aGlzIGRlZmluaXRpb24gc2hvdWxkIGxpdmUgaW4uCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdGlvbjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFjcm9kZWYKKyAgICAgICAgICAoZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgb25seSkuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5iYWNrdHJhY2U8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgIFRoaXMgY29udHJvbHMgdGhlIGVycm9yIHRyYWNlYmFjayBpZiB0aGV5IGlzIGFuCisgICAgICAgICAgZXJyb3IgZGV0ZWN0ZWQgd2hlbiBydW5uaW5nIHRoZSBtYWNyby4gSWYgdGhpcyBpcworICAgICAgICAgIHNldCB0byB0cnVlLCB0aGVyZSB3aWxsIGJlIGFuIGVycm9yIHRyYWNrYmFjaywgaWYgZmFsc2UKKyAgICAgICAgICB0aGVyZSB3aWxsIG5vdCBiZSBvbmUuIDxlbT5TaW5jZSBBbnQgMS43PC9lbT4uCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHQgPGVtPnRydWU8L2VtPjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgICAgICA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKyAgICA8aDQ+YXR0cmlidXRlPC9oND4KKyAgICA8cD4KKyAgICAgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyB0YXNrLiBUaGUgdmFsdWVzCisgICAgICBvZiB0aGUgYXR0cmlidXRlcyBnZXQgc3Vic3RpdHV0ZWQgaW50byB0aGUgdGVtcGxhdGVkIHRhc2suCisgICAgICBUaGUgYXR0cmlidXRlcyB3aWxsIGJlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgdW5sZXNzIGEgZGVmYXVsdAorICAgICAgdmFsdWUgaGFzIGJlZW4gc2V0LgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHBsYWNlZCBpbiB0aGUgYm9keSBvZiB0aGUgdGVtcGxhdGVkCisgICAgICB0YXNrIHVzaW5nIGEgbm90YXRpb24gc2ltaWxhciB0byB0aGUgYW50IHByb3BlcnR5IG5vdGF0aW9uCisgICAgICAtIEB7YXR0cmlidXRlIG5hbWV9LiAoTWF5IGJlIHJlbWVtYmVyZWQgYXMgInB1dCB0aGUgc3Vic3RpdHV0aW9uCisgICAgICBBVCB0aGlzIGxvY2F0aW9uIikuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgVGhlIGVzY2FwZSBzZXF1ZW5jZSBAQCBpcyB1c2VkIHRvIGVzY2FwZSBALiBUaGlzIGFsbG93cyBAe3h9IHRvIGJlCisgICAgICBwbGFjZWQgaW4gdGhlIHRleHQgd2l0aG91dCBzdWJzdGl0dXRpb24gb2YgeCBieSB1c2luZyBAQHt4fS4KKyAgICAgIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlICQkIGVzY2FwZSBzZXF1ZW5jZSBmb3IgcHJvcGVydGllcy4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBUaGUgY2FzZSBvZiB0aGUgYXR0cmlidXRlIGlzIGlnbm9yZWQsIHNvIEB7bXlBdHRyaWJ1dGV9IGlzIHRyZWF0ZWQgdGhlCisgICAgICBzYW1lIGFzIEB7TXlBdHRyaWJ1dGV9LgorICAgIDwvcD4KKyAgICA8aDM+UGFyYW1ldGVyczwvaDM+CisgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBuZXcgYXR0cmlidXRlPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzY3JpcHRpb248L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgIFRoaXMgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlLgorICAgICAgICAgIDxlbT5zaW5jZSBhbnQgMS42LjE8L2VtPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8aDQ+ZWxlbWVudDwvaDQ+CisgICAgPHA+CisgICAgICBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgb2YgdGhlIG5ldyB0YXNrLgorICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoZSBuZXN0ZWQgZWxlbWVudHMgb2YgdGhlIHRhc2sgaW5zdGFuY2UKKyAgICAgIGFyZSBwbGFjZWQgaW4gdGhlIHRlbXBsYXRlZCB0YXNrIGF0IHRoZSB0YWcgbmFtZS4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBUaGUgY2FzZSBvZiB0aGUgZWxlbWVudCBuYW1lIGlzIGlnbm9yZWQuCisgICAgPC9wPgorICAgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQ8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm9wdGlvbmFsPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICBJZiB0cnVlIHRoaXMgbmVzdGVkIGVsZW1lbnQgaXMgb3B0aW9uYWwuIERlZmF1bHQgaXMKKyAgICAgICAgICBmYWxzZSAtIGkuZSB0aGUgbmVzdGVkIGVsZW1lbnQgaXMgcmVxdWlyZWQgaW4KKyAgICAgICAgICB0aGUgbmV3IHRhc2suCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbXBsaWNpdDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgSWYgdHJ1ZSB0aGlzIG5lc3RlZCBlbGVtZW50IGlzIGltcGxpY2l0LiBUaGlzIG1lYW5zIHRoYXQKKyAgICAgICAgICBhbnkgbmVzdGVkIGVsZW1lbnRzIG9mIHRoZSBtYWNyb2RlZiBpbnN0YW5jZSB3aWxsIGJlIHBsYWNlZAorICAgICAgICAgIGluIHRoZSBlbGVtZW50IGluZGljYXRlZCBieSB0aGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQuCisgICAgICAgICAgVGhlcmUgY2FuIG9ubHkgYmUgb25lIGVsZW1lbnQgaWYgYW4gZWxlbWVudCBpcyBpbXBsaWNpdC4KKyAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gPGVtPnNpbmNlIGFudCAxLjYuMjwvZW0+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdGlvbjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgVGhpcyBjb250YWlucyBhIGRlc2NyaXB0aW9uCisgICAgICAgICAgaW5mb3JtaW5nIHRoZSB1c2VyIHdoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50IGFyZSBleHBlY3RlZCB0byBiZS4KKyAgICAgICAgICA8ZW0+c2luY2UgYW50IDEuNi4xPC9lbT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgICAgPGg0PnRleHQ8L2g0PgorICAgIDxwPgorICAgICAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHRyZWF0bWVudCBvZiB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBtYWNybyBpbnZvY2F0aW9uLgorICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBwcmVzZW50LCB0aGVuIGFueSBuZXN0ZWQgdGV4dCBpbiB0aGUgbWFjcm8gaW52b2NhdGlvbgorICAgICAgd2lsbCBiZSBhbiBlcnJvci4gSWYgdGhlIHRleHQgZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBuYW1lCisgICAgICBiZWNvbWVzIGFuIGF0dHJpYnV0ZSB0aGF0IGdldHMgc2V0IHRvIHRoZSBuZXN0ZWQgdGV4dCBvZiB0aGUgbWFjcm8gaW52b2NhdGlvbi4KKyAgICAgIDxlbT5TaW5jZSBhbnQgMS42LjEuPC9lbT4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBUaGUgY2FzZSBvZiB0aGUgdGV4dCBuYW1lIGlzIGlnbm9yZWQuCisgICAgPC9wPgorICAgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHRleHQgYXR0cmlidXRlPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5vcHRpb25hbDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgSWYgdHJ1ZSBuZXN0ZWQgdGV4dCBpbiB0aGUgbWFjcm8gaXMgb3B0aW9uYWwsIGRlZmF1bHQgaXMgImZhbHNlIi4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnRyaW08L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgIElmIHRydWUsIHRoZSBuZXN0ZWQgdGV4dCBpcyB0cmltbWVkIG9mIHdoaXRlIHNwYWNlLAorICAgICAgICAgIGRlZmF1bHQgaXMgImZhbHNlIi4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc2NyaXB0aW9uPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICBUaGlzIGNvbnRhaW5zIGEgZGVzY3JpcHRpb24KKyAgICAgICAgICBpbmZvcm1pbmcgdGhlIHVzZXIgd2hhdCB0aGUgbmVzdGVkIHRleHQgb2YgdGhlIG1hY3JvIGlzIGV4cGVjdGVkCisgICAgICAgICAgdG8gYmUuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPGgzPkV4YW1wbGVzPC9oMz4KKyAgICA8cD4KKyAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVkIGEgdGFzayBjYWxsZWQgdGVzdGluZyBhbmQKKyAgICAgIHJ1bnMgaXQuCisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorPHByZSBjbGFzcz1jb2RlPgorJmx0O21hY3JvZGVmIG5hbWU9InRlc3RpbmciJmd0OworICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJ2IiBkZWZhdWx0PSJOT1QgU0VUIi8mZ3Q7CisgICAmbHQ7ZWxlbWVudCBuYW1lPSJzb21lLXRhc2tzIiBvcHRpb25hbD0ieWVzIi8mZ3Q7CisgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICZsdDtlY2hvJmd0O3YgaXMgQHt2fSZsdDsvZWNobyZndDsKKyAgICAgICZsdDtzb21lLXRhc2tzLyZndDsKKyAgICZsdDsvc2VxdWVudGlhbCZndDsKKyZsdDsvbWFjcm9kZWYmZ3Q7CisKKyZsdDt0ZXN0aW5nIHY9IlRoaXMgaXMgdiImZ3Q7CisgICAmbHQ7c29tZS10YXNrcyZndDsKKyAgICAgICZsdDtlY2hvJmd0O3RoaXMgaXMgYSB0ZXN0Jmx0Oy9lY2hvJmd0OworICAgJmx0Oy9zb21lLXRhc2tzJmd0OworJmx0Oy90ZXN0aW5nJmd0OworPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgVGhlIGZvbGxvd2luZyBmcmFnbWVudCBkZWZpbmVzIGEgdGFzayBjYWxsZWQgPGNvZGU+Jmx0O2NhbGwtY2MmZ3Q7PC9jb2RlPiB3aGljaAorICAgICAgdGFrZSB0aGUgYXR0cmlidXRlcyAidGFyZ2V0IiwgImxpbmsiIGFuZCAidGFyZ2V0LmRpciIgYW5kIHRoZQorICAgICAgbmVzdGVkIGVsZW1lbnQgImNjLWVsZW1lbnRzIi4gVGhlIGJvZHkgb2YgdGhlIHRhc2sKKyAgICAgIHVzZXMgdGhlIDxjb2RlPiZsdDtjYyZndDs8L2NvZGU+IHRhc2sgZnJvbSB0aGUKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQtY29udHJpYi5zb3VyY2Vmb3JnZS5uZXQvIj5hbnQtY29udHJpYjwvYT4gcHJvamVjdC4KKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+Cis8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDttYWNyb2RlZiBuYW1lPSJjYWxsLWNjIiZndDsKKyAgICZsdDthdHRyaWJ1dGUgbmFtZT0idGFyZ2V0Ii8mZ3Q7CisgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImxpbmsiLyZndDsKKyAgICZsdDthdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LmRpciIvJmd0OworICAgJmx0O2VsZW1lbnQgbmFtZT0iY2MtZWxlbWVudHMiLyZndDsKKyAgICZsdDtzZXF1ZW50aWFsJmd0OworICAgICAgJmx0O21rZGlyIGRpcj0iJHtvYmouZGlyfS9Ae3RhcmdldH0iLyZndDsKKyAgICAgICZsdDtta2RpciBkaXI9IkB7dGFyZ2V0LmRpcn0iLyZndDsKKyAgICAgICAgICZsdDtjYyBsaW5rPSJAe2xpbmt9IiBvYmpkaXI9IiR7b2JqLmRpcn0vQHt0YXJnZXR9IgorICAgICAgICAgICAgIG91dGZpbGU9IkB7dGFyZ2V0LmRpcn0vQHt0YXJnZXR9IiZndDsKKyAgICAgICAgICAgICZsdDtjb21waWxlciByZWZpZD0iY29tcGlsZXIub3B0aW9ucyIvJmd0OworICAgICAgICAgICAgJmx0O2NjLWVsZW1lbnRzLyZndDsKKyAgICAgICAgICZsdDsvY2MmZ3Q7CisgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CismbHQ7L21hY3JvZGVmJmd0OworPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgVGhpcyB0aGVuIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorPHByZSBjbGFzcz0iY29kZSI+CismbHQ7Y2FsbC1jYyB0YXJnZXQ9InVuaXR0ZXN0cyIgbGluaz0iZXhlY3V0YWJsZSIKKyAgICAgICAgIHRhcmdldC5kaXI9IiR7YnVpbGQuYmluLmRpcn0iJmd0OworICAgJmx0O2NjLWVsZW1lbnRzJmd0OworICAgICAgJmx0O2luY2x1ZGVwYXRoIGxvY2F0aW9uPSIke2dlbi5kaXJ9Ii8mZ3Q7CisgICAgICAmbHQ7aW5jbHVkZXBhdGggbG9jYXRpb249InRlc3QiLyZndDsKKyAgICAgICZsdDtmaWxlc2V0IGRpcj0idGVzdC91bml0dGVzdCIgaW5jbHVkZXMgPSAiKiovKi5jcHAiLyZndDsKKyAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtnZW4uZGlyfSIgaW5jbHVkZXMgPSAiKi5jcHAiLyZndDsKKyAgICAgICZsdDtsaW5rZXIgcmVmaWQ9Imxpbmtlci1saWJzIi8mZ3Q7CisgICAmbHQ7L2NjLWVsZW1lbnRzJmd0OworJmx0Oy9jYWxsLWNjJmd0OworPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgVGhlIGZvbGxvd2luZyBmcmFnbWVudCBzaG93cyAmbHQ7Y2FsbC1jYyZndDssIGJ1dCB0aGlzIHRpbWUKKyAgICAgIHVzaW5nIGFuIGltcGxpY2l0IGVsZW1lbnQgYW5kIHdpdGggdGhlIGxpbmsgYW5kIHRhcmdldC5kaXIgYXJndW1lbnRzCisgICAgICBoYXZpbmcgZGVmYXVsdCB2YWx1ZXMuCisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorPHByZSBjbGFzcz0iY29kZSI+CismbHQ7bWFjcm9kZWYgbmFtZT0iY2FsbC1jYyImZ3Q7CisgICAmbHQ7YXR0cmlidXRlIG5hbWU9InRhcmdldCIvJmd0OworICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJsaW5rIiBkZWZhdWx0PSJleGVjdXRhYmxlIi8mZ3Q7CisgICAmbHQ7YXR0cmlidXRlIG5hbWU9InRhcmdldC5kaXIiIGRlZmF1bHQ9IiR7YnVpbGQuYmluLmRpcn0iLyZndDsKKyAgICZsdDtlbGVtZW50IG5hbWU9ImNjLWVsZW1lbnRzIiBpbXBsaWNpdD0ieWVzIi8mZ3Q7CisgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICZsdDtta2RpciBkaXI9IiR7b2JqLmRpcn0vQHt0YXJnZXR9Ii8mZ3Q7CisgICAgICAmbHQ7bWtkaXIgZGlyPSJAe3RhcmdldC5kaXJ9Ii8mZ3Q7CisgICAgICAgICAmbHQ7Y2MgbGluaz0iQHtsaW5rfSIgb2JqZGlyPSIke29iai5kaXJ9L0B7dGFyZ2V0fSIKKyAgICAgICAgICAgICBvdXRmaWxlPSJAe3RhcmdldC5kaXJ9L0B7dGFyZ2V0fSImZ3Q7CisgICAgICAgICAgICAmbHQ7Y29tcGlsZXIgcmVmaWQ9ImNvbXBpbGVyLm9wdGlvbnMiLyZndDsKKyAgICAgICAgICAgICZsdDtjYy1lbGVtZW50cy8mZ3Q7CisgICAgICAgICAmbHQ7L2NjJmd0OworICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworJmx0Oy9tYWNyb2RlZiZndDsKKzwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRoaXMgdGhlbiBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzLCBub3RlIHRoYXQgJmx0O2NjLWVsZW1lbnRzJmd0OworICAgICAgaXMgbm90IHNwZWNpZmllZC4KKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+Cis8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDtjYWxsLWNjIHRhcmdldD0idW5pdHRlc3RzIi8mZ3Q7CisgICAmbHQ7aW5jbHVkZXBhdGggbG9jYXRpb249IiR7Z2VuLmRpcn0iLyZndDsKKyAgICZsdDtpbmNsdWRlcGF0aCBsb2NhdGlvbj0idGVzdCIvJmd0OworICAgJmx0O2ZpbGVzZXQgZGlyPSJ0ZXN0L3VuaXR0ZXN0IiBpbmNsdWRlcyA9ICIqKi8qLmNwcCIvJmd0OworICAgJmx0O2ZpbGVzZXQgZGlyPSIke2dlbi5kaXJ9IiBpbmNsdWRlcyA9ICIqLmNwcCIvJmd0OworICAgJmx0O2xpbmtlciByZWZpZD0ibGlua2VyLWxpYnMiLyZndDsKKyZsdDsvY2FsbC1jYyZndDsKKzwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIHVzZSBvZiB0aGUgPGNvZGU+dGV4dDwvY29kZT4gZWxlbWVudC4KKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+Cis8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDttYWNyb2RlZiBuYW1lPSJlY2hvdGVzdCImZ3Q7CisgICAmbHQ7dGV4dCBuYW1lPSJ0ZXh0Ii8mZ3Q7CisgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICZsdDtlY2hvJmd0O0B7dGV4dH0mbHQ7L2VjaG8mZ3Q7CisgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CismbHQ7L21hY3JvZGVmJmd0OworJmx0O2VjaG90ZXN0Jmd0OworICAgSGVsbG8gd29ybGQKKyZsdDsvZWNob3Rlc3QmZ3Q7Cis8L3ByZT4KKyAgICA8L2Jsb2NrcXVvdGU+CisgICAgPHA+CisgICAgICBUaGUgZm9sbG93aW5nIHVzZXMgYSBwcmlvciBkZWZpbmVkIGF0dHJpYnV0ZSBmb3Igc2V0dGluZyB0aGUKKyAgICAgIGRlZmF1bHQgdmFsdWUgb2YgYW5vdGhlci4gVGhlIG91dHB1dCB3b3VsZCBiZQorICAgICAgPHR0Pm9uZT10ZXN0IHR3bz10ZXN0PC90dD4uIElmIHlvdSBjaGFuZ2UgdGhlIG9yZGVyIG9mIGxpbmVzCisgICAgICAqMSBhbmQgKjIgdGhlIG91dHB1dCB3b3VsZCBiZSA8dHQ+b25lPXRlc3QgdHdvPUB7b25lfTwvdHQ+LAorICAgICAgYmVjYXVzZSB3aGlsZSBwcm9jZXNzaW5nIHRoZSA8aT50d288L2k+LWxpbmUgdGhlIHZhbHVlIGZvcgorICAgICAgPGk+b25lPC9pPiBpcyBub3Qgc2V0LgorICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O21hY3JvZGVmIG5hbWU9InRlc3QiJmd0OworICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJvbmUiLyZndDsgICAgICAgICAgICAgICAgICAgICA8Yj4qMTwvYj4KKyAgICZsdDthdHRyaWJ1dGUgbmFtZT0idHdvIiBkZWZhdWx0PSJAe29uZX0iLyZndDsgICAgPGI+KjI8L2I+CisgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICZsdDtlY2hvJmd0O29uZT1Ae29uZX0gICB0d289QHt0d299Jmx0Oy9lY2hvJmd0OworICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworJmx0Oy9tYWNyb2RlZiZndDsKKyZsdDt0ZXN0IG9uZT0idGVzdCIvJmd0OworPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9tYWlsLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbWFpbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODE5MDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbWFpbC5odG1sCkBAIC0wLDAgKzEsMzI0IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPk1haWwgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ibWFpbCI+TWFpbDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKyAgPHA+CisgICAgQSB0YXNrIHRvIHNlbmQgU01UUCBlbWFpbC4KKyAgPC9wPgorICA8cD4KKyAgICBUaGlzIHRhc2sgY2FuIHNlbmQgbWFpbCB1c2luZyBlaXRoZXIgcGxhaW4KKyAgICB0ZXh0LCBVVSBlbmNvZGluZywgb3IgTUlNRSBmb3JtYXQgbWFpbCwgZGVwZW5kaW5nIG9uIHdoYXQgaXMgYXZhaWxhYmxlLgorICA8L3A+CisgIDxwPgorICAgIFNNVFAgYXV0aCBhbmQgU1NML1RMUyByZXF1aXJlIEphdmFNYWlsIGFuZCBhcmUgb25seSBhdmFpbGFibGUgaW4gTUlNRSBmb3JtYXQuCisgIDwvcD4KKyAgPHA+CisgICAgQXR0YWNobWVudHMgbWF5IGJlIHNlbnQgdXNpbmcgbmVzdGVkCisgICAgPGNvZGU+Jmx0O2F0dGFjaG1lbnRzJmd0OzwvY29kZT4gZWxlbWVudHMsIHdoaWNoIGFyZSA8YQorICAgIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZXM8L2E+LiAgVGhpcyBtZWFucworICAgIGFueSBmaWxlc3lzdGVtIGJhc2VkIDxhCisgICAgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gb3IgcmVzb3VyY2UKKyAgICBjb2xsZWN0aW9uIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvIGF0dGFjaG1lbnRzLiAgUHJpb3IgdG8gQW50IDEuNworICAgIG9ubHkgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBoYXMgYmVlbiBzdXBwb3J0ZWQgYXMgYSBuZXN0ZWQKKyAgICBlbGVtZW50LCB5b3UgY2FuIHN0aWxsIHVzZSB0aGlzIGRpcmVjdGx5IHdpdGhvdXQgYW4KKyAgICA8Y29kZT4mbHQ7YXR0YWNobWVudHMmZ3Q7PC9jb2RlPiBjb250YWluZXIuCisgIDwvcD4KKyAgPHA+CisgICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIHRhc2sgbWF5IGRlcGVuZCBvbiBleHRlcm5hbCBsaWJyYXJpZXMKKyAgICB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIEFudCBkaXN0cmlidXRpb24uIAorICAgIFNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+CisgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgIDwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZnJvbTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5FbWFpbCBhZGRyZXNzIG9mIHNlbmRlci48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+RWl0aGVyIGEgPGNvZGU+ZnJvbTwvY29kZT4gYXR0cmlidXRlLCBvciBhIDxjb2RlPiZsdDtmcm9tJmd0OzwvY29kZT4KKyAgICBlbGVtZW50LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlcGx5dG88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UmVwbHl0byBlbWFpbCBhZGRyZXNzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRvbGlzdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWNpcGllbnRzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiByb3dzcGFuPSIzIj5BdCBsZWFzdCBvbmUgb2YgdGhlc2UsIG9yIHRoZQorICAgICAgIGVxdWl2YWxlbnQgZWxlbWVudHMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2NsaXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlY2lwaWVudHMgdG8gY2FyYm9uIGNvcHk8L3RkPgorICAgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJjY2xpc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVjaXBpZW50cyB0byBibGluZCBjYXJib24gY29weQorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1lc3NhZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TWVzc2FnZSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSBlbWFpbC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgcm93c3Bhbj0iMiI+T25lIG9mIHRoZXNlIG9yIGEKKyAgICA8Y29kZT4mbHQ7bWVzc2FnZSZndDs8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZWZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RmlsZSB0byBzZW5kIGFzIHRoZSBib2R5IG9mIHRoZSBlbWFpbC4gUHJvcGVydHkKKyAgICB2YWx1ZXMgaW4gdGhlIGZpbGUgd2lsbCBiZSBleHBhbmRlZC48L3RkPgorICA8L3RyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5tZXNzYWdlbWltZXR5cGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgbWVzc2FnZS4gIFRoZSBkZWZhdWx0IGlzCisgICAgPGNvZGU+dGV4dC9wbGFpbjwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RmlsZXMgdG8gc2VuZCBhcyBhdHRhY2htZW50cyB0byB0aGUgZW1haWwuICBTZXBhcmF0ZSBtdWx0aXBsZQorICAgIGZpbGUgbmFtZXMgdXNpbmcgYSBjb21tYSBvciBzcGFjZS4gIFlvdSBjYW4gYWxzbyB1c2UgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgorICAgIGVsZW1lbnRzIHRvIHNwZWNpZnkgZmlsZXMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGhhbHQgdGhlIGJ1aWxkIG9uCisgICAgYW55IGVycm9yLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVmaWxlbmFtZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5jbHVkZSBmaWxlbmFtZShzKSBiZWZvcmUgZmlsZSBjb250ZW50cy4KKyAgICBWYWxpZCBvbmx5IHdoZW4gdGhlIDxjb2RlPnBsYWluPC9jb2RlPiBlbmNvZGluZyBpcyB1c2VkLiAgVGhlIGRlZmF1bHQKKyAgICB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWFpbGhvc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SG9zdCBuYW1lIG9mIHRoZSBTTVRQIHNlcnZlci4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgPGNvZGU+bG9jYWxob3N0PC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYWlscG9ydDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UQ1AgcG9ydCBvZiB0aGUgU01UUCBzZXJ2ZXIuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyNS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2VyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXIgbmFtZSBmb3IgU01UUCBhdXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJjZW50ZXIiPlllcywgaWYgU01UUCBhdXRoIGlzIHJlcXVpcmVkIG9uIHlvdXIgU01UUCBzZXJ2ZXI8YnI+PC9icj4KKyAgICB0aGUgZW1haWwgbWVzc2FnZSB3aWxsIGJlIHRoZW4gc2VudCB1c2luZyBNaW1lIGFuZCByZXF1aXJlcyBKYXZhTWFpbDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkIGZvciBTTVRQIGF1dGg8L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciI+WWVzLCBpZiBTTVRQIGF1dGggaXMgcmVxdWlyZWQgb24geW91ciBTTVRQIHNlcnZlcjxicj48L2JyPgorICAgIHRoZSBlbWFpbCBtZXNzYWdlIHdpbGwgYmUgdGhlbiBzZW50IHVzaW5nIE1pbWUgYW5kIHJlcXVpcmVzIEphdmFNYWlsPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3NsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiJ0cnVlIiwgIm9uIiBvciAieWVzIiBhY2NlcHRlZCBoZXJlPGJyPjwvYnI+CisgICAgaW5kaWNhdGVzIHdoZXRoZXIgeW91IG5lZWQgVExTL1NTTDwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgY29udGVudCBvZiB0aGUgZW1haWwuCisgICAgVmFsdWVzIGFyZSA8Y29kZT5taW1lPC9jb2RlPiwgPGNvZGU+dXU8L2NvZGU+LCA8Y29kZT5wbGFpbjwvY29kZT4sIG9yCisgICAgICA8Y29kZT5hdXRvPC9jb2RlPi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmF1dG88L2NvZGU+LgorICAgICAgPGNvZGU+dXU8L2NvZGU+IG9yIDxjb2RlPnBsYWluPC9jb2RlPiBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBTTVRQIGF1dGg8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jaGFyc2V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNoYXJhY3RlciBzZXQgb2YgdGhlIGVtYWlsLjxicj4KKyAgICBZb3UgY2FuIGFsc28gc2V0IHRoZSBjaGFyc2V0IGluIHRoZSBtZXNzYWdlIG5lc3RlZCBlbGVtZW50Ljxicj4KKyAgICBUaGVzZSBvcHRpb25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3ViamVjdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5FbWFpbCBzdWJqZWN0IGxpbmUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5Ob3RlIHJlZ2FyZGluZyB0aGUgYXR0cmlidXRlcyBjb250YWluaW5nIGVtYWlsIGFkZHJlc3NlczwvaDM+CitTaW5jZSBBbnQgMS42LCB0aGUgYXR0cmlidXRlcyBmcm9tLCByZXBseXRvLCB0b2xpc3QsIGNjbGlzdCwgYmNjbGlzdAorY2FuIGNvbnRhaW4gZW1haWwgYWRkcmVzc2VzIG9mIHRoZSBmb3JtIDoKKzx1bD4KKzxsaT5hZGRyZXNzQHh5ei5jb208L2xpPgorPGxpPm5hbWUgJmx0O2FkZHJlc3NAeHl6LmNvbSZndDs8L2xpPgorPGxpPiZsdDthZGRyZXNzQHh5ei5jb20mZ3Q7IG5hbWU8L2xpPgorPGxpPihuYW1lKSBhZGRyZXNzQHh5ei5jb208L2xpPgorPGxpPmFkZHJlc3NAeHl6LmNvbSAobmFtZSk8L2xpPgorPC91bD4KKzxwPllvdSBuZWVkIHRvIGVudGVyIHRoZSBhbmdsZSBicmFja2V0cyBhcyBYTUwgZW50aXRpZXMKKzxjb2RlPiZhbXA7Z3Q7PC9jb2RlPiBhbmQgPGNvZGU+JmFtcDtsdDs8L2NvZGU+LjwvcD4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND50byAvIGNjIC8gYmNjIC8gZnJvbS8gcmVwbHl0byA8L2g0PgorPHA+QWRkcyBhbiBlbWFpbCBhZGRyZXNzIGVsZW1lbnQuICBJdCB0YWtlcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorCis8dGFibGUgd2lkdGg9IjYwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBhZGRyZXNzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFkZHJlc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGVtYWlsIGFkZHJlc3MuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+bWVzc2FnZTwvaDQ+CisKKzxwPlNwZWNpZmllcyB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBlbWFpbCBib2R5LiAgSXQgdGFrZXMgdGhlIGZvbGxvd2luZworYXR0cmlidXRlczo8L3A+CisKKzx0YWJsZSB3aWR0aD0iNjAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byB1c2UgYXMgdGhlIG1lc3NhZ2UuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWltZXR5cGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNvbnRlbnQgdHlwZSB0byB1c2UgZm9yIHRoZSBtZXNzYWdlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNoYXJzZXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q2hhcmFjdGVyIHNldCBvZiB0aGUgbWVzc2FnZTxicj4KKyAgICBZb3UgY2FuIGFsc28gc2V0IHRoZSBjaGFyc2V0IGFzIGF0dHJpYnV0ZSBvZiB0aGUgZW5jbG9zaW5nIG1haWwgdGFzay48YnI+CisgICAgVGhlc2Ugb3B0aW9ucyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5JZiB0aGUgPGNvZGU+c3JjPC9jb2RlPiBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0ZXh0IGNhbiBiZSBhZGRlZAoraW5zaWRlIHRoZSA8Y29kZT4mbHQ7bWVzc2FnZSZndDs8L2NvZGU+IGVsZW1lbnQuIFByb3BlcnR5IGV4cGFuc2lvbiB3aWxsIG9jY3VyCitpbiB0aGUgbWVzc2FnZSwgd2hldGhlciBpdCBpcyBzcGVjaWZpZWQgYXMgYW4gZXh0ZXJuYWwgZmlsZSBvciBhcyB0ZXh0IHdpdGhpbgordGhlIDxjb2RlPiZsdDttZXNzYWdlJmd0OzwvY29kZT4gZWxlbWVudC48L3A+CisKKzxoND5oZWFkZXI8L2g0PgorPHA+PHN0cm9uZz5TaW5jZSBBbnQgMS43PC9zdHJvbmc+LCBhcmJpdHJhcnkgbWFpbCBoZWFkZXJzIGNhbiBiZSBhZGRlZCBieQorICBzcGVjaWZ5aW5nIHRoZXNlIGF0dHJpYnV0ZXMgb24gb25lIG9yIG1vcmUgbmVzdGVkIGhlYWRlciBlbGVtZW50czo8L3A+CisKKzx0YWJsZSB3aWR0aD0iNjAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFpbCBoZWFkZXIuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhpcyBtYWlsIGhlYWRlci48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPkl0IGlzIHBlcm1pc3NpYmxlIHRvIGR1cGxpY2F0ZSB0aGUgbmFtZSBhdHRyaWJ1dGUgYW1vbmdzdCBtdWx0aXBsZSBoZWFkZXJzLgorPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O21haWwgZnJvbT0mcXVvdDttZSZxdW90OworICAgICAgdG9saXN0PSZxdW90O3lvdSZxdW90OworICAgICAgc3ViamVjdD0mcXVvdDtSZXN1bHRzIG9mIG5pZ2h0bHkgYnVpbGQmcXVvdDsKKyAgICAgIGZpbGVzPSZxdW90O2J1aWxkLmxvZyZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPlNlbmRzIGFuIGVtYWlsIGZyb20gPGk+bWU8L2k+IHRvIDxpPnlvdTwvaT4gd2l0aCBhIHN1YmplY3Qgb2YKKzxpPlJlc3VsdHMgb2YgbmlnaHRseSBidWlsZDwvaT4gYW5kIGluY2x1ZGVzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQorPGk+YnVpbGQubG9nPC9pPiBpbiB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bWFpbCBtYWlsaG9zdD0mcXVvdDtzbXRwLm15aXNwLmNvbSZxdW90OyBtYWlscG9ydD0mcXVvdDsxMDI1JnF1b3Q7IHN1YmplY3Q9JnF1b3Q7VGVzdCBidWlsZCZxdW90OyZndDsKKyAgJmx0O2Zyb20gYWRkcmVzcz0mcXVvdDtjb25maWdAbXlpc3AuY29tJnF1b3Q7LyZndDsKKyAgJmx0O3JlcGx5dG8gYWRkcmVzcz0mcXVvdDttZUBteWlzcC5jb20mcXVvdDsvJmd0OworICAmbHQ7dG8gYWRkcmVzcz0mcXVvdDthbGxAeHl6LmNvbSZxdW90Oy8mZ3Q7CisgICZsdDttZXNzYWdlJmd0O1RoZSAke2J1aWxkbmFtZX0gbmlnaHRseSBidWlsZCBoYXMgY29tcGxldGVkJmx0Oy9tZXNzYWdlJmd0OworICAmbHQ7YXR0YWNobWVudHMmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2Rpc3QmcXVvdDsmZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouemlwJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDsvYXR0YWNobWVudHMmZ3Q7CismbHQ7L21haWwmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPlNlbmRzIGFuIGVNYWlsIGZyb20gPGk+Y29uZmlnQG15aXNwLmNvbTwvaT4gdG8gPGk+YWxsQHh5ei5jb208L2k+IHdpdGggYSBzdWJqZWN0IG9mCis8aT5UZXN0IEJ1aWxkPC9pPi4gUmVwbGllcyB0byB0aGlzIGVtYWlsIHdpbGwgZ28gdG8gPGk+bWVAbXlpc3AuY29tPC9pPi4KK0FueSB6aXAgZmlsZXMgZnJvbSB0aGUgZGlzdCBkaXJlY3RvcnkgYXJlIGF0dGFjaGVkLiZuYnNwOyBUaGUKK3Rhc2sgd2lsbCBhdHRlbXB0IHRvIHVzZSBKYXZhTWFpbCBhbmQgZmFsbCBiYWNrIHRvIFVVIGVuY29kaW5nIG9yIG5vIGVuY29kaW5nIGluCit0aGF0IG9yZGVyIGRlcGVuZGluZyBvbiB3aGF0IHN1cHBvcnQgY2xhc3NlcyBhcmUgYXZhaWxhYmxlLiA8Y29kZT4ke2J1aWxkbmFtZX08L2NvZGU+Cit3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIDxjb2RlPmJ1aWxkbmFtZTwvY29kZT4gcHJvcGVydHkncyB2YWx1ZS48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtsaW5lMiZxdW90OyB2YWx1ZT0mcXVvdDtzb21lX2ludGVybmF0aW9uYWxfbWVzc2FnZSZxdW90Oy8mZ3Q7CismbHQ7ZWNobyBtZXNzYWdlPSZxdW90OyR7bGluZTJ9JnF1b3Q7LyZndDsKKworJmx0O21haWwgbWFpbGhvc3Q9JnF1b3Q7c29tZWhvc3RAeHl6LmNvbSZxdW90OyBtYWlscG9ydD0mcXVvdDsyNSZxdW90OyBzdWJqZWN0PSZxdW90O1Rlc3QgYnVpbGQmcXVvdDsgIGNoYXJzZXQ9JnF1b3Q7dXRmLTgmcXVvdDsmZ3Q7CisgICZsdDtmcm9tIGFkZHJlc3M9JnF1b3Q7bWVAbXlpc3QuY29tJnF1b3Q7LyZndDsKKyAgJmx0O3RvIGFkZHJlc3M9JnF1b3Q7YWxsQHh5ei5jb20mcXVvdDsvJmd0OworICAmbHQ7bWVzc2FnZSZndDtzb21lIGludGVybmF0aW9uYWwgdGV4dDoke2xpbmUyfSZsdDsvbWVzc2FnZSZndDsKKyZsdDsvbWFpbCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+U2VuZHMgYW4gZU1haWwgZnJvbSA8aT5tZUBteWlzcC5jb208L2k+IHRvIDxpPmFsbEB4eXouY29tPC9pPiB3aXRoIGEgc3ViamVjdCBvZgorPGk+VGVzdCBCdWlsZDwvaT4sIHRoZSBtZXNzYWdlIGJvZHkgYmVpbmcgY29kZWQgaW4gVVRGLTgKKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9tYWtldXJsLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbWFrZXVybC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjYzZTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbWFrZXVybC5odG1sCkBAIC0wLDAgKzEsMjM2IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgCis8aHRtbD4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDx0aXRsZT5NYWtldXJsCisgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiM1MjVENzYiCisgICAgICBhbGluaz0iIzUyNUQ3NiIgdmxpbms9IiM1MjVENzYiPgorCis8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjQiPgorCisgIDwhLS0gUEFHRSBIRUFERVIgLS0+CisgIDx0cj4KKyAgICA8dGQ+CisgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICA8Zm9udCBzaXplPSIrMyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48c3Ryb25nPk1ha2V1cmwKKyBUYXNrPC9zdHJvbmc+PC9mb250PgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgPCEtLSBQUk9KRUNUIExPR08gLS0+CisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj4KKyAgICAgICAgICAgICAgPGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiIGFsaWduPSJyaWdodCIgYWx0PSJBcGFjaGUgQW50IiBib3JkZXI9IjAiLz4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICA8L3RkPgorICAgICAgPC90cj48L3RhYmxlPgorICAgIDwvdGQ+CisgIDwvdHI+CisKKyAgPCEtLSBTVEFSVCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KKyAgPHRyPgorICAgIDx0ZCAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKworICAgICAgICAgIDwhLS0gQXBwbHlpbmcgdGFzay9sb25nLWRlc2NyaXB0aW9uIC0tPgorICAgIDwhLS0gU3RhcnQgRGVzY3JpcHRpb24gLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0iZGVzY3JpcHRpb24iPgorICAgICAgICAgIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorVGhpcyB0YXNrIHRha2VzIG9uZSBvciBtb3JlIGZpbGVuYW1lcyBhbmQgdHVybnMgdGhlbSBpbnRvIFVSTHMsIHdoaWNoIGl0IHRoZW4gYXNzaWducyB0byBhIHByb3BlcnR5LgorVXNlZnVsIHdoZW4gc2V0dGluZyB1cCBSTUkgb3IgSk5MUCBjb2RlYmFzZXMsIGZvciBleGFtcGxlLgorTmVzdGVkIGZpbGVzZXRzIGFyZSBzdXBwb3J0ZWQ7IGlmIHByZXNlbnQsIHRoZXNlIGFyZSB0dXJuZWQgaW50byB0aGUgVVJMcyB3aXRoIHRoZSBzdXBwbGllZCBzZXBhcmF0b3IgYmV0d2VlbiB0aGVtIChkZWZhdWx0OiBzcGFjZSkuCis8cC8+Cis8cD5FeGFtcGxlczo8L3A+Cis8cHJlPgorJmx0O21ha2V1cmwgZmlsZT0iJHt1c2VyLmhvbWV9Ly5tMi9yZXBvc2l0b3J5IiBwcm9wZXJ0eT0ibTIucmVwb3NpdG9yeS51cmwiLyZndDsKKzwvcHJlPgorU2V0cyB0aGUgcHJvcGVydHkgPGNvZGU+bTIucmVwb3NpdG9yeS51cmw8L2NvZGU+IHRvIHRoZSBmaWxlOiBVUkwgb2YgdGhlIGxvY2FsIE1hdmVuMiByZXBvc2l0b3J5LgorPHByZT4KKyZsdDttYWtldXJsIHByb3BlcnR5PSJjb2RlYmFzZSImZ3Q7Jmx0O2ZpbGVzZXQgZGlyPSJsaWIgaW5jbHVkZXM9IiouamFyIi8mZ3Q7Jmx0Oy9tYWtldXJsJmd0OworPC9wcmU+CitTZXQgdGhlIHByb3BlcnR5IDxjb2RlPmNvZGViYXNlPC9jb2RlPiB0byB0aGUgdGhyZWUgVVJMcyBvZiB0aGUgZmlsZXMgcHJvdmlkZWQgYXMgbmVzdGVkIGVsZW1lbnRzLgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRGVzY3JpcHRpb24gLS0+CisKKyA8IS0tIElnbm9yZSAtLT4KKworCisKKyAgICA8IS0tIFN0YXJ0IEF0dHJpYnV0ZXMgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImF0dHJpYnV0ZXMiPgorICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVyczwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+QXR0cmlidXRlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlR5cGU8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+UmVxdWlyZW1lbnQ8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAorICAgIAorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm5hbWUgb2YgYSBmaWxlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIGEgVVJMPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm9wdGlvbmFsLCBpZiBhIG5lc3RlZCBmaWxlc2V0IG9yIHBhdGggaXMgc3VwcGxpZWQ8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5wcm9wZXJ0eTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgdG8gdGhlIFVSTDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnJlcXVpcmVkPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c2VwYXJhdG9yPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c2VwYXJhdG9yIGZvciB0aGUgbXVsdGktVVJMIG9wdGlvbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm9wdGlvbmFsPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+dmFsaWRhdGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj52YWxpZGF0ZSB0aGF0IGV2ZXJ5IG5hbWVkIGZpbGUgZXhpc3RzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm9wdGlvbmFsOyBkZWZhdWx0OiB0cnVlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisKKworICAgICAgICA8L3RhYmxlPgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgQXR0cmlidXRlcyAtLT4KKworICAgIDwhLS0gU3RhcnQgRWxlbWVudHMgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0iZWxlbWVudHMiPgorICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVycyBhcyBuZXN0ZWQgZWxlbWVudHM8L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+ZmlsZXNldDwvc3Ryb25nPiAob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBBIGZpbGVzZXQgb2YgSkFSIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIFVSTCBsaXN0LCBlYWNoIHNlcGFyYXRlZCBieSB0aGUgc2VwYXJhdG9yLgorIDwhLS0gSWdub3JlIC0tPgorIDwhLS0gSWdub3JlIC0tPgorCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnQgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzgyOERBNiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiIHNpemU9Ii0xIj4KKyAgICAgICAgICA8c3Ryb25nPnBhdGg8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgpPC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgQWRkIGEgcGF0aCB0byB0aGUgVVJMLiBBbGwgZWxlbWVudHMgaW4gdGhlIHBhdGggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gaW5kaXZpZHVhbCBVUkwgZW50cmllcy4KKyA8IS0tIElnbm9yZSAtLT4KKyA8IS0tIElnbm9yZSAtLT4KKworICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEVsZW1lbnQgLS0+CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEVsZW1lbnRzIC0tPgorCisKKyAgICA8L3RkPgorICA8L3RyPgorICA8IS0tIEVORCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KKworPC90YWJsZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL21hbmlmZXN0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbWFuaWZlc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGNmMTgwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL21hbmlmZXN0Lmh0bWwKQEAgLTAsMCArMSwxNzYgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+TWFuaWZlc3QgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ibWFuaWZlc3QiPk1hbmlmZXN0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+Q3JlYXRlcyBhIG1hbmlmZXN0IGZpbGUuPC9wPgorCis8cD5UaGlzIHRhc2sgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYSBNYW5pZmVzdCBmaWxlLCBvcHRpb25hbGx5CityZXBsYWNpbmcgb3IgdXBkYXRpbmcgYW4gZXhpc3RpbmcgZmlsZS48L3A+CisKKworCis8cD5NYW5pZmVzdHMgYXJlIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlIAorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvamFyL2phci5odG1sIj5KYXIKK2ZpbGUgc3BlY2lmaWNhdGlvbi48L2E+LiBTcGVjaWZpY2FsbHksIGEgbWFuaWZlc3QgZWxlbWVudCBjb25zaXN0cyBvZgorYSBzZXQgb2YgYXR0cmlidXRlcyBhbmQgc2VjdGlvbnMuIFRoZXNlIHNlY3Rpb25zIGluIHR1cm4gbWF5IGNvbnRhaW4KK2F0dHJpYnV0ZXMuIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IHRoaXMgbWF5IHJlc3VsdCBpbiBtYW5pZmVzdCBsaW5lcworZ3JlYXRlciB0aGFuIDcyIGJ5dGVzIGJlaW5nIHdyYXBwZWQgYW5kIGNvbnRpbnVlZCBvbiB0aGUgbmV4dAorbGluZS48L3A+CisKKzxwPgorICBUaGUgQW50IHRlYW0gcmVndWxhcmx5IGdldHMgY29tcGxhaW50cyB0aGF0IHRoaXMgdGFzayBpbiBnZW5lcmF0aW5nIGludmFsaWQKKyAgbWFuaWZlc3RzLiBCeSBhbmQgbGFyZ2UsIHRoaXMgaXMgbm90IHRoZSBjYXNlOiB3ZSBiZWxpZXZlIHRoYXQgd2UgYXJlIGZvbGxvd2luZworICB0aGUgc3BlY2lmaWNhdGlvbiB0byB0aGUgbGV0dGVyLiBUaGUgdXN1YWwgcHJvYmxlbSBpcyB0aGF0IHNvbWUgdGhpcmQgcGFydHkKKyAgbWFuaWZlc3QgcmVhZGVyIGlzIG5vdCBmb2xsb3dpbmcgdGhlIHNhbWUgc3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIHRoZXkgdGhpbmsKKyAgdGhleSBzaG91bGQ7IHdlIGNhbm5vdCBnZW5lcmF0ZSBpbnZhbGlkIG1hbmlmZXN0IGZpbGVzIGp1c3QgYmVjYXVzZSBvbmUKKyAgc2luZ2xlIGFwcGxpY2F0aW9uIGlzIGJyb2tlbi4gSjJNRSBydW50aW1lcyBhcHBlYXIgdG8gYmUgcGFydGljdWxhcmx5IHRyb3VibGVzb21lLgorPC9wPgorCis8cD4KKyAgSWYgeW91IGZpbmQgdGhhdCBBbnQgZ2VuZXJhdGVzIG1hbmlmZXN0cyBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIHJ1bnRpbWUsIHRha2UKKyAgYSBtYW5pZmVzdCBpdCBoYXMgYnVpbHQsIGZpeCBpdCB1cCBob3dldmVyIHlvdSBuZWVkIGFuZCBzd2l0Y2ggdG8gdXNpbmcgdGhlICZsdDt6aXAmZ3QKKyAgdGFzayB0byBjcmVhdGUgdGhlIEpBUiwgZmVlZGluZyBpbiB0aGUgaGFuZC1jcmFmdGVkIG1hbmlmZXN0LgorPC9wPgorCisKKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbWFuaWZlc3QtZmlsZSB0byBjcmVhdGUvdXBkYXRlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tb2RlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk9uZSBvZiAidXBkYXRlIiBvciAicmVwbGFjZSIsIGRlZmF1bHQgaXMgInJlcGxhY2UiLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyB1c2VkIHRvIHJlYWQgdGhlIGV4aXN0aW5nIG1hbmlmZXN0IHdoZW4gdXBkYXRpbmcuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBVVEYtOCBlbmNvZGluZy48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPk5lc3RlZCBlbGVtZW50czwvaDM+Cis8aDQ+PGEgbmFtZT0iYXR0cmlidXRlIj5hdHRyaWJ1dGU8L2E+PC9oND4KKzxwPk9uZSBhdHRyaWJ1dGUgZm9yIHRoZSBtYW5pZmVzdCBmaWxlLiAgVGhvc2UgYXR0cmlidXRlcyB0aGF0IGFyZQorbm90IG5lc3RlZCBpbnRvIGEgc2VjdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSAiTWFpbiIgc2VjdGlvbi48L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIDxicj4KKyAgICAgICAgbXVzdCBtYXRjaCB0aGUgcmVnZXhwIDx0dD5bQS1aYS16MC05XVtBLVphLXowLTktX10qPC90dD4uCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworCis8aDQ+c2VjdGlvbjwvaDQ+Cis8cD5BIG1hbmlmZXN0IHNlY3Rpb24gLSB5b3UgY2FuIG5lc3QgPGEKK2hyZWY9IiNhdHRyaWJ1dGUiPmF0dHJpYnV0ZTwvYT4gZWxlbWVudHMgaW50byBzZWN0aW9ucy48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBpZiBvbWl0dGVkIGl0IHdpbGwgYmUgYXNzdW1lZAorICAgICAgIHRvIGJlIHRoZSBtYWluIHNlY3Rpb24uPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwcmU+CisgICZsdDttYW5pZmVzdCBmaWxlPSZxdW90O01BTklGRVNULk1GJnF1b3Q7Jmd0OworICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtCdWlsdC1CeSZxdW90OyB2YWx1ZT0mcXVvdDske3VzZXIubmFtZX0mcXVvdDsvJmd0OworICAgICZsdDtzZWN0aW9uIG5hbWU9JnF1b3Q7Y29tbW9uJnF1b3Q7Jmd0OworICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O1NwZWNpZmljYXRpb24tVGl0bGUmcXVvdDsgdmFsdWU9JnF1b3Q7RXhhbXBsZSZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7U3BlY2lmaWNhdGlvbi1WZXJzaW9uJnF1b3Q7IHZhbHVlPSZxdW90OyR7dmVyc2lvbn0mcXVvdDsvJmd0OworICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O1NwZWNpZmljYXRpb24tVmVuZG9yJnF1b3Q7IHZhbHVlPSZxdW90O0V4YW1wbGUgT3JnYW5pemF0aW9uJnF1b3Q7LyZndDsKKyAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtJbXBsZW1lbnRhdGlvbi1UaXRsZSZxdW90OyB2YWx1ZT0mcXVvdDtjb21tb24mcXVvdDsvJmd0OworICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O0ltcGxlbWVudGF0aW9uLVZlcnNpb24mcXVvdDsgdmFsdWU9JnF1b3Q7JHt2ZXJzaW9ufSAke1RPREFZfSZxdW90Oy8mZ3Q7IAorICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O0ltcGxlbWVudGF0aW9uLVZlbmRvciZxdW90OyB2YWx1ZT0mcXVvdDtFeGFtcGxlIENvcnAuJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3NlY3Rpb24mZ3Q7CisgICAgJmx0O3NlY3Rpb24gbmFtZT0mcXVvdDtjb21tb24vY2xhc3MxLmNsYXNzJnF1b3Q7Jmd0OworICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O1NlYWxlZCZxdW90OyB2YWx1ZT0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9zZWN0aW9uJmd0OworICAmbHQ7L21hbmlmZXN0Jmd0OworPC9wcmU+CisKKzxwPkNyZWF0ZXMgb3IgcmVwbGFjZXMgdGhlIGZpbGUgTUFOSUZFU1QuTUYuICBOb3RlIHRoYXQgdGhlIEJ1aWx0LUJ5CithdHRyaWJ1dGUgd2lsbCB0YWtlIHRoZSB2YWx1ZSBvZiB0aGUgQW50IHByb3BlcnR5ICR7dXNlci5uYW1lfS4gIFRoZQorc2FtZSBpcyB0cnVlIGZvciB0aGUgJHt2ZXJzaW9ufSBhbmQgJHtUT0RBWX0gcHJvcGVydGllcy4gIFRoaXMgZXhhbXBsZQorcHJvZHVjZXMgYSBNQU5JRkVTVC5NRiB0aGF0IGNvbnRhaW5zIAorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvdmVyc2lvbmluZy8iPnBhY2thZ2UKK3ZlcnNpb24gaWRlbnRpZmljYXRpb248L2E+IGZvciB0aGUgcGFja2FnZSA8Y29kZT5jb21tb248L2NvZGU+LjwvcD4KKworPHA+VGhlIG1hbmlmZXN0IHByb2R1Y2VkIGJ5IHRoZSBhYm92ZSB3b3VsZCBsb29rIGxpa2UgdGhpczo8L3A+CisKKzxwcmU+PGNvZGU+TWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdWlsdC1CeTogYm9kZXdpZworQ3JlYXRlZC1CeTogQXBhY2hlIEFudCAxLjcKKworTmFtZTogY29tbW9uCitTcGVjaWZpY2F0aW9uLVRpdGxlOiBFeGFtcGxlCitTcGVjaWZpY2F0aW9uLVZlbmRvcjogRXhhbXBsZSBPcmdhbml6YXRpb24KK0ltcGxlbWVudGF0aW9uLVZlbmRvcjogRXhhbXBsZSBDb3JwLgorU3BlY2lmaWNhdGlvbi1WZXJzaW9uOiAxLjIKK0ltcGxlbWVudGF0aW9uLVZlcnNpb246IDEuMiBGZWJydWFyeSAxOSAyMDA2CitJbXBsZW1lbnRhdGlvbi1UaXRsZTogY29tbW9uCisKK05hbWU6IGNvbW1vbi9jbGFzczEuY2xhc3MKK1NlYWxlZDogZmFsc2UKKworPC9jb2RlPjwvcHJlPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL21hbmlmZXN0Y2xhc3NwYXRoLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbWFuaWZlc3RjbGFzc3BhdGguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDY1YWFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL21hbmlmZXN0Y2xhc3NwYXRoLmh0bWwKQEAgLTAsMCArMSwxMTIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+TWFuaWZlc3RDbGFzc1BhdGggVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ibWFuaWZlc3RjbGFzc3BhdGgiPk1hbmlmZXN0Y2xhc3NwYXRoPC9hPjwvaDI+CisKKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5Db252ZXJ0cyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UGF0aDwvYT4gaW50byBhIHByb3BlcnR5Cit3aG9zZSB2YWx1ZSBpcyBhcHByb3ByaWF0ZSBmb3IgYSA8YSBocmVmPSJtYW5pZmVzdC5odG1sIj5NYW5pZmVzdDwvYT4ncworPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4gYXR0cmlidXRlLjwvcD4KKworPHA+VGhpcyB0YXNrIGlzIG9mdGVuIHVzZWQgdG8gd29yayBhcm91bmQgY29tbWFuZCBsaW5lIGxpbWl0YXRpb25zIG9uIFdpbmRvd3MKK3doZW4gdXNpbmcgdmVyeSBsb25nIGNsYXNzIHBhdGhzIHdoZW4gbGF1bmNoaW5nIGFuIGFwcGxpY2F0aW9uLiBUaGUgbG9uZyBjbGFzcworcGF0aCBub3JtYWxseSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBpcyByZXBsYWNlZCBieSBhIHNpbmdsZSAocG9zc2libHkKK2VtcHR5KSBqYXIgZmlsZSB3aGljaCBhbiBpbi1tYW5pZmVzdCBDbGFzcy1QYXRoIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBsaXN0cworYWxsIHRoZSBqYXIgYW5kIHppcCBmaWxlcyB0aGUgY2xhc3MgcGF0aCBzaG91bGQgY29udGFpbi4gVGhlIGZpbGVzIHJlZmVyZW5jZWQKK2Zyb20gdGhpcyBhdHRyaWJ1dGUgbXVzdCBiZSBmb3VuZCByZWxhdGl2ZWx5IHRvIHRoZSBqYXIgZmlsZSBpdHNlbGYsIHVzdWFsbHkKK2luIHRoZSBzYW1lIGRpcmVjdG9yeS4gVGhlIEphdmEgVk0gYXV0b21pY2FsbHkgdXNlcyBhbGwgZmlsZSBlbnRyaWVzIGxpc3RlZAoraW4gdGhlIENsYXNzLVBhdGggYXR0cmlidXRlcyBvZiBhIGphciB0byBsb2NhdGUvbG9hZCBjbGFzc2VzLiBOb3RlIHRob3VnaCB0aGF0CitpdCBzaWxlbnRseSBpZ25vcmVzIGVudHJpZXMgZm9yIHdoaWNoIGl0IGNhbm5vdCBmaW5kIGFueSBjb3JyZXNwb25kaW5nIGZpbGUuPC9wPgorCis8cD5Ob3RlIHRoYXQgdGhlIHByb3BlcnR5IHZhbHVlIGNyZWF0ZWQgbWF5IGJlIGxvbmdlciB0aGFuIGEgbWFuaWZlc3QncyBtYXhpbXVtCis3MiBjaGFyYWN0ZXJzIHBlciBsaW5lLCBidXQgd2lsbCBiZSBwcm9wZXJseSB3cmFwcGVkIGFzIHBlciB0aGUgSmFyCitzcGVjaWZpY2F0aW9uIGJ5IHRoZSA8Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPiBlbGVtZW50LCB3aGVyZSB0aGUKK2RlZmluZWQgcHJvcGVydHkgaXMgcmUtcmVmZXJlbmNlZC48L3A+CisKKzxwPjxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuIFRoaXMgcHJvcGVydHkgbXVzdAorICAgICAgICAgICAgICAgICAgICAgbm90IGFscmVhZHkgYmUgc2V0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5qYXJmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgdGhlIGZpbGVuYW1lIGZvciB0aGUgSmFyIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgbWFuaWZlc3QgdGhhdCB3aWxsCisgICAgICB1c2UgdGhlIHByb3BlcnR5IHRoaXMgdGFzayB3aWxsIHNldC4gVGhpcyBmaWxlIG5lZWQgbm90IGV4aXN0IHlldCwKKyAgICAgIGJ1dCBpdHMgcGFyZW50IGRpcmVjdG9yeSBtdXN0IGV4aXN0LgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYXhQYXJlbnRMZXZlbHM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFyZW50IGRpcmVjdG9yaWVzIG9uZSBpcyBhbGxvd2VkIHRvIHRyYXZlcnNlCisgICAgICB0byBuYXZpZ2F0ZSBmcm9tIHRoZSBqYXIgZmlsZSB0byB0aGUgcGF0aCBlbnRyeS4gUHV0IGRpZmZlcmVudGx5LCB0aGUKKyAgICAgIG1heGltdW0gbnVtYmVyIG9mIC4uIHdoaWNoIGlzIGFsbG93ZWQgaW4gdGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUKKyAgICAgIGphciBmaWxlIHRvIGEgZ2l2ZW4gY2xhc3MgcGF0aCBlbnR5LiBTcGVjaWZ5IDAgdG8gZW5mb3JjZSBhIHBhdGgKKyAgICAgIGVudHJ5IHRvIGJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSAob3Igb25lIG9mIGl0cyBzdWItZGlyZWN0b3JpZXMpCisgICAgICBhcyB0aGUgamFyIGZpbGUgaXRzZWxmLiAgRGVmYXVsdHMgdG8gMiBsZXZlbHMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0PmNsYXNzcGF0aDwvaDQ+Cis8cD5BIDxhIGhyZWY9Ii4uL3VzaW5nI3BhdGguaHRtbCI+UGF0aC1saWtlPC9hPiBlbGVtZW50LCB3aGljaCBjYW4gYmUKK2RlZmluZWQgaW4tcGxhY2UsIG9yIHJlZmVyIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZSB1c2luZyB0aGUKKzxjb2RlPiZsdDtjbGFzc3BhdGggcmVmaWQ9IjxlbT5wYXRoaWQ8L2VtPiIgLyZndDs8L2NvZGU+IHN5bnRheC4KK1RoaXMgY2xhc3NwYXRoIG11c3Qgbm90IGJlIGVtcHR5LCBhbmQgaXMgcmVxdWlyZWQuPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPGRpdiBpZD0iZXhhbXBsZTEiPgorICA8YmxvY2txdW90ZT48cHJlPgorICAgICZsdDttYW5pZmVzdGNsYXNzcGF0aCBwcm9wZXJ0eT0iamFyLmNsYXNzcGF0aCIKKyAgICAgICAgICAgICAgICAgICAgICAgamFyZmlsZT0iYnVpbGQvYWNtZS5qYXIiJmd0OworICAgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIiAvJmd0OworICAgICZsdDsvbWFuaWZlc3RjbGFzc3BhdGgmZ3Q7CisgIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgPHA+QXNzdW1pbmcgYSBwYXRoIG9mIGlkICJjbGFzc3BhdGgiIHdhcyBhbHJlYWR5IGRlZmluZWQsIGNvbnZlcnQgdGhpcworICBwYXRoIHJlbGF0aXZlbHkgdG8gdGhlIGJ1aWxkLyBkaXJlY3RvcnkgdGhhdCB3aWxsIGNvbnRhaW4gYWNtZS5qYXIsIHdoaWNoCisgIGNhbiBsYXRlciBiZSBjcmVhdGVkIHdpdGggPGNvZGU+Jmx0O2phciZndDs8L2NvZGU+IHdpdGggYSBuZXN0ZWQgCisgIDxjb2RlPiZsdDttYW5pZmVzdCZndDs8L2NvZGU+IGVsZW1lbnQgdGhhdCBsaXN0cyBhbgorICA8Y29kZT4mbHQ7YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiIHZhbHVlPSIke2phci5jbGFzc3BhdGh9IiAvJmd0OzwvY29kZT4uCisgIDwvcD4KKzwvZGl2PgorCisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL21rZGlyLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbWtkaXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk0NWMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL21rZGlyLmh0bWwKQEAgLTAsMCArMSw1MiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Na2RpciBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJta2RpciI+TWtkaXI8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5DcmVhdGVzIGEgZGlyZWN0b3J5LiBBbHNvIG5vbi1leGlzdGVudCBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQsIHdoZW4KK25lY2Vzc2FyeS4gRG9lcyBub3RoaW5nIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdC48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSB0byBjcmVhdGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+Jmx0O21rZGlyIGRpcj0mcXVvdDske2Rpc3R9JnF1b3Q7LyZndDs8L3ByZT4KKzxwPmNyZWF0ZXMgYSBkaXJlY3RvcnkgPGNvZGU+JHtkaXN0fTwvY29kZT4uPC9wPgorPHByZT4mbHQ7bWtkaXIgZGlyPSZxdW90OyR7ZGlzdH0vbGliJnF1b3Q7LyZndDs8L3ByZT4KKzxwPmNyZWF0ZXMgYSBkaXJlY3RvcnkgPGNvZGU+JHtkaXN0fS9saWI8L2NvZGU+LjwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbW92ZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL21vdmUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjgxMTYyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL21vdmUuaHRtbApAQCAtMCwwICsxLDIzMCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Nb3ZlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9Im1vdmUiPk1vdmU8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5Nb3ZlcyBhIGZpbGUgdG8gYSBuZXcgZmlsZSBvciBkaXJlY3RvcnksIG9yIGNvbGxlY3Rpb25zIG9mIGZpbGVzIHRvCithIG5ldyBkaXJlY3RvcnkuICBCeSBkZWZhdWx0LCB0aGUKK2Rlc3RpbmF0aW9uIGZpbGUgaXMgb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuICBXaGVuIDx2YXI+b3ZlcndyaXRlPC92YXI+IGlzCit0dXJuZWQgb2ZmLCB0aGVuIGZpbGVzIGFyZSBvbmx5IG1vdmVkIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBuZXdlciB0aGFuCit0aGUgZGVzdGluYXRpb24gZmlsZSwgb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdC48L3A+CisKKzxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZQorQ29sbGVjdGlvbjwvYT5zIGFyZSB1c2VkIHRvIHNlbGVjdCBhIGdyb3VwIG9mIGZpbGVzIHRvIG1vdmUuICBPbmx5CitmaWxlIHN5c3RlbSBiYXNlZCByZXNvdXJjZSBjb2xsZWN0aW9ucyBhcmUgc3VwcG9ydGVkLCB0aGlzIGluY2x1ZGVzIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPnMsIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCI+ZmlsZWxpc3Q8L2E+IGFuZCA8YQoraHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoPC9hPi4gIFByaW9yIHRvIEFudCAxLjcgb25seQorPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBoYXMgYmVlbiBzdXBwb3J0ZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC4KK1RvIHVzZSBhIHJlc291cmNlIGNvbGxlY3Rpb24sIHRoZSA8Y29kZT50b2RpcjwvY29kZT4gYXR0cmlidXRlIG11c3QgYmUKK3NldC48L3A+CisKKzxwPjxiPlNpbmNlIEFudCAxLjYuMzwvYj4sIHRoZSA8aT5maWxlPC9pPiBhdHRyaWJ1dGUgbWF5IGJlIHVzZWQgdG8gbW92ZQorKHJlbmFtZSkgYW4gZW50aXJlIGRpcmVjdG9yeS4gIElmIDxpPnRvZmlsZTwvaT4gZGVub3RlcyBhbiBleGlzdGluZyBmaWxlLCBvcgordGhlcmUgaXMgYSBkaXJlY3RvcnkgYnkgdGhlIHNhbWUgbmFtZSBpbiA8aT50b2RpcjwvaT4sIHRoZSBhY3Rpb24gd2lsbCBmYWlsLgorPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gbW92ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5PbmUgb2YgPHZhcj5maWxlPC92YXI+IG9yCisgICAgIGF0IGxlYXN0IG9uZSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlc2VydmVsYXN0bW9kaWZpZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+R2l2ZSB0aGUgbW92ZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZAorICAgICAgdGltZSBhcyB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLgorICAgICAgKDxlbT5Ob3RlPC9lbT46IElnbm9yZWQgb24gSmF2YSAxLjEpPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50b2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgdG8gbW92ZSB0bzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5XaXRoIHRoZSA8dmFyPmZpbGU8L3Zhcj4gYXR0cmlidXRlLAorICAgIGVpdGhlciA8dmFyPnRvZmlsZTwvdmFyPiBvciA8dmFyPnRvZGlyPC92YXI+IGNhbiBiZSB1c2VkLiAgV2l0aCBuZXN0ZWQgZmlsZXNldHMsCisgICAgaWYgdGhlIGZpbGVzZXQgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMSBvciBpZiB0aGUgb25seSBlbnRyeSBpbiB0aGUgZmlsZXNldCBpcyBhCisgICAgZGlyZWN0b3J5IG9yIGlmIHRoZSA8dmFyPmZpbGU8L3Zhcj4gYXR0cmlidXRlIGlzIGFscmVhZHkgc3BlY2lmaWVkLCBvbmx5CisgICAgPHZhcj50b2RpcjwvdmFyPiBpcyBhbGxvd2VkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSB0byBtb3ZlIHRvPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3ZlcndyaXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbgorICAgICAgZmlsZXMgYXJlIG5ld2VyIChkZWZhdWx0IGlzICZxdW90O3RydWUmcXVvdDspPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsdGVyaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyBzaG91bGQgdGFrZSBwbGFjZSBkdXJpbmcKKyAgICAgIHRoZSBtb3ZlLiAgU2VlIHRoZSA8YSBocmVmPSJmaWx0ZXIuaHRtbCI+ZmlsdGVyPC9hPiB0YXNrIGZvciBhIGRlc2NyaXB0aW9uIG9mCisgICAgICBob3cgZmlsdGVycyB3b3JrLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZsYXR0ZW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2Ygc291cmNlIGRpcmVjdG9yeSwKKyAgICAgIGNvcHkgYWxsIGZpbGVzIGludG8gYSBzaW5nbGUgZGlyZWN0b3J5LCBzcGVjaWZpZWQgYnkgdGhlIDx2YXI+dG9kaXI8L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZSAoZGVmYXVsdCBpcyAmcXVvdDtmYWxzZSZxdW90OykuTm90ZSB0aGF0IHlvdSBjYW4gYWNoaWV2ZSB0aGUKKyAgICAgIHNhbWUgZWZmZWN0IGJ5IHVzaW5nIGEgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL21hcHBlci5odG1sI2ZsYXR0ZW4tbWFwcGVyIj5mbGF0dGVuIG1hcHBlcjwvYT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlRW1wdHlEaXJzPC90ZD4KKwkgPHRkIHZhbGlnbj0idG9wIj5Db3B5IGVtcHR5IGRpcmVjdG9yaWVzIGluY2x1ZGVkIHdpdGggdGhlIG5lc3RlZCBGaWxlU2V0KHMpLgorCSAgIERlZmF1bHRzIHRvICZxdW90O3llcyZxdW90Oy48L3RkPgorCSA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiPklmIGZhbHNlLCBsb2cgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBkbyBub3Qgc3RvcCB0aGUKKyAgICAgICBidWlsZCwgd2hlbiB0aGUgZmlsZSB0byBjb3B5IGRvZXMgbm90IGV4aXN0IG9yIG9uZSBvZiB0aGUgbmVzdGVkCisgICAgICAgZmlsZXNldHMgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IHRoYXQgZG9lc24ndCBleGlzdCBvciBhbiBlcnJvciBvY2N1cnMKKyAgICAgICB3aGlsZSBtb3ZpbmcuCisgICAgIDwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCI+TG9nIHRoZSBmaWxlcyB0aGF0IGFyZSBiZWluZyBtb3ZlZC48L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZW5jb2RpbmcgdG8gYXNzdW1lIHdoZW4gZmlsdGVyLWNvcHlpbmcgdGhlCisgICAgZmlsZXMuIDxlbT5zaW5jZSBBbnQgMS41PC9lbT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBlbmNvZGluZzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dGVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiB3cml0aW5nIHRoZSBmaWxlcy4KKyAgICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSBlbmNvZGluZworICAgIGF0dHJpYnV0ZSBpZiBnaXZlbiBvciB0aGUgZGVmYXVsdCBKVk0gZW5jb2Rpbmcgb3RoZXJ3aXNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuYWJsZW11bHRpcGxlbWFwcGluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIElmIHRydWUgdGhlIHRhc2sgd2lsbCBwcm9jZXNzIHRvIGFsbCB0aGUgbWFwcGluZ3MgZm9yIGEKKyAgICAgIGdpdmVuIHNvdXJjZSBwYXRoLiBJZiBmYWxzZSB0aGUgdGFzayB3aWxsIG9ubHkgcHJvY2VzcworICAgICAgdGhlIGZpcnN0IGZpbGUgb3IgZGlyZWN0b3J5LiBUaGlzIGF0dHJpYnV0ZSBpcyBvbmx5IHJlbGV2YW50CisgICAgICBpZiB0aGVyZSBpcyBhIG1hcHBlciBzdWJlbGVtZW50LgorICAgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmdyYW51bGFyaXR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byBnaXZlIGJlZm9yZQorICAgIGRlY2lkaW5nIGEgZmlsZSBpcyBvdXQgb2YgZGF0ZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBub3QgZXZlcnkKKyAgICBmaWxlIHN5c3RlbSBzdXBwb3J0cyB0cmFja2luZyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIHRvIHRoZQorICAgIG1pbGxpc2Vjb25kIGxldmVsLiBEZWZhdWx0IGlzIDAgbWlsbGlzZWNvbmRzLCBvciAyIHNlY29uZHMgb24gRE9TCisgICAgc3lzdGVtcy4gIFRoaXMgY2FuIGFsc28gYmUgdXNlZnVsIGlmIHNvdXJjZSBhbmQgdGFyZ2V0IGZpbGVzIGxpdmUKKyAgICBvbiBzZXBhcmF0ZSBtYWNoaW5lcyB3aXRoIGNsb2NrcyBiZWluZyBvdXQgb2Ygc3luYy4gIDxlbT5zaW5jZSBBbnQKKyAgICAxLjY8L2VtPi48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0Pm1hcHBlcjwvaDQ+Cis8cD5Zb3UgY2FuIGRlZmluZSBmaWxlIG5hbWUgdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIGEgbmVzdGVkIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvbWFwcGVyLmh0bWwiPm1hcHBlcjwvYT4gZWxlbWVudC4gVGhlIGRlZmF1bHQgbWFwcGVyIHVzZWQgYnkKKzxjb2RlPiZsdDttb3ZlJmd0OzwvY29kZT4gaXMgdGhlIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyIj5pZGVudGl0eTwvYT4uPC9wPgorPHA+Tm90ZSB0aGF0IHRoZSBzb3VyY2UgbmFtZSBoYW5kZWQgdG8gdGhlIG1hcHBlciBkZXBlbmRzIG9uIHRoZQorcmVzb3VyY2UgY29sbGVjdGlvbiB5b3UgdXNlLiAgSWYgeW91IHVzZSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+CitvciBhbnkgb3RoZXIgY29sbGVjdGlvbiB0aGF0IHByb3ZpZGVzIGEgYmFzZSBkaXJlY3RvcnksIHRoZSBuYW1lCitwYXNzZWQgdG8gdGhlIG1hcHBlciB3aWxsIGJlIGEgcmVsYXRpdmUgZmlsZW5hbWUsIHJlbGF0aXZlIHRvIHRoZSBiYXNlCitkaXJlY3RvcnkuICBJbiBhbnkgb3RoZXIgY2FzZSB0aGUgYWJzb2x1dGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSB3aWxsCitiZSB1c2VkLjwvcD4KKzxoND5maWx0ZXJjaGFpbjwvaDQ+Cis8cD5UaGUgTW92ZSB0YXNrIHN1cHBvcnRzIG5lc3RlZCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+CitGaWx0ZXJDaGFpbjwvYT5zLjwvcD4KKworPHA+CitJZiA8Y29kZT4mbHQ7ZmlsdGVyc2V0Jmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtmaWx0ZXJjaGFpbiZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSB1c2VkIGluc2lkZSB0aGUKK3NhbWUgPGNvZGU+Jmx0O21vdmUmZ3Q7PC9jb2RlPiB0YXNrLCBhbGwgPGNvZGU+Jmx0O2ZpbHRlcmNoYWluJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIHByb2Nlc3NlZCBmaXJzdAorZm9sbG93ZWQgYnkgPGNvZGU+Jmx0O2ZpbHRlcnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLgorPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHA+PGI+TW92ZSBhIHNpbmdsZSBmaWxlIChyZW5hbWUgYSBmaWxlKTwvYj48L3A+Cis8cHJlPgorICAmbHQ7bW92ZSBmaWxlPSZxdW90O2ZpbGUub3JpZyZxdW90OyB0b2ZpbGU9JnF1b3Q7ZmlsZS5tb3ZlZCZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzxwPjxiPk1vdmUgYSBzaW5nbGUgZmlsZSB0byBhIGRpcmVjdG9yeTwvYj48L3A+Cis8cHJlPgorICAmbHQ7bW92ZSBmaWxlPSZxdW90O2ZpbGUub3JpZyZxdW90OyB0b2Rpcj0mcXVvdDtkaXIvdG8vbW92ZS90byZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzxwPjxiPk1vdmUgYSBkaXJlY3RvcnkgdG8gYSBuZXcgZGlyZWN0b3J5PC9iPjwvcD4KKzxwcmU+CisgICZsdDttb3ZlIHRvZGlyPSZxdW90O25ldy9kaXIvdG8vbW92ZS90byZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjL2RpciZxdW90Oy8mZ3Q7CisgICZsdDsvbW92ZSZndDsKKzwvcHJlPgorICA8aT5vciwgc2luY2UgQW50IDEuNi4zOjwvaT4KKzxwcmU+CisgICZsdDttb3ZlIGZpbGU9JnF1b3Q7c3JjL2RpciZxdW90OyB0b2ZpbGU9JnF1b3Q7bmV3L2Rpci90by9tb3ZlL3RvJnF1b3Q7LyZndDsKKzwvcHJlPgorPHA+PGI+TW92ZSBhIHNldCBvZiBmaWxlcyB0byBhIG5ldyBkaXJlY3Rvcnk8L2I+PC9wPgorPHByZT4KKyAgJmx0O21vdmUgdG9kaXI9JnF1b3Q7c29tZS9uZXcvZGlyJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtteS9zcmMvZGlyJnF1b3Q7Jmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphciZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqL2FudC5qYXImcXVvdDsvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0Oy9tb3ZlJmd0OworPC9wcmU+Cis8cD48Yj5Nb3ZlIGEgbGlzdCBvZiBmaWxlcyB0byBhIG5ldyBkaXJlY3Rvcnk8L2I+PC9wPgorPHByZT4KKyAgJmx0O21vdmUgdG9kaXI9JnF1b3Q7c29tZS9uZXcvZGlyJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlbGlzdCBkaXI9JnF1b3Q7bXkvc3JjL2RpciZxdW90OyZndDsKKyAgICAgICZsdDtmaWxlIG5hbWU9ImZpbGUxLnR4dCIvJmd0OworICAgICAgJmx0O2ZpbGUgbmFtZT0iZmlsZTIudHh0Ii8mZ3Q7CisgICAgJmx0Oy9maWxlbGlzdCZndDsKKyAgJmx0Oy9tb3ZlJmd0OworPC9wcmU+Cis8cD48Yj5BcHBlbmQgPGNvZGU+JnF1b3Q7LmJhayZxdW90OzwvY29kZT4gdG8gdGhlIG5hbWVzIG9mIGFsbCBmaWxlcworaW4gYSBkaXJlY3RvcnkuPC9iPjwvcD4KKzxwcmU+CisgICZsdDttb3ZlIHRvZGlyPSZxdW90O215L3NyYy9kaXImcXVvdDsgaW5jbHVkZWVtcHR5ZGlycz0mcXVvdDtmYWxzZSZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7bXkvc3JjL2RpciZxdW90OyZndDsKKyAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7KiovKi5iYWsmcXVvdDsvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyAgICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7Z2xvYiZxdW90OyBmcm9tPSZxdW90OyomcXVvdDsgdG89JnF1b3Q7Ki5iYWsmcXVvdDsvJmd0OworICAmbHQ7L21vdmUmZ3Q7Cis8L3ByZT4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9uaWNlLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbmljZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzBlYWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvbmljZS5odG1sCkBAIC0wLDAgKzEsNzAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+TmljZSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJlY2hvIj5OaWNlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+UHJvdmlkZSAibmljZS1uZXNzIiB0byB0aGUgY3VycmVudCB0aHJlYWQKKyAgIGFuZC9vciBxdWVyeSB0aGUgY3VycmVudCB2YWx1ZS48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jdXJyZW50cHJpb3JpdHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdob3NlIHZhbHVlIHNob3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIHRoZSBjdXJyZW50ICZxdW90O25pY2UtbmVzcyZxdW90OyBsZXZlbC4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uZXdwcmlvcml0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgdmFsdWUgdG8gd2hpY2ggdGhlCisgICAgICAgICAgICAgICAgICAgICAmcXVvdDtuaWNlLW5lc3MmcXVvdDsgbGV2ZWwgc2hvdWxkIGJlIHNldC4KKyAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgYSB2YWxpZCBKYXZhIFRocmVhZCBwcmlvcml0eS4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiAgICZsdDtuaWNlIG5ld3ByaW9yaXR5PSZxdW90OzEwJnF1b3Q7LyZndDs8L3ByZT4KK1NldCB0aGUgVGhyZWFkIHByaW9yaXR5IHRvIDEwIChoaWdoZXN0KS4KKzxwcmU+ICAgJmx0O25pY2UgY3VycmVudHByaW9yaXR5PSZxdW90O3ByaW9yaXR5JnF1b3Q7LyZndDs8L3ByZT4KK1N0b3JlIHRoZSBjdXJyZW50IFRocmVhZCBwcmlvcml0eSBpbiB0aGUgdXNlciBwcm9wZXJ0eSAicHJpb3JpdHkiLgorPHByZT4KKyAgICZsdDtuaWNlIGN1cnJlbnRwcmlvcml0eT0mcXVvdDtjdXJyZW50cHJpb3JpdHkmcXVvdDsgbmV3cHJpb3JpdHk9JnF1b3Q7MSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzxwPlNldCB0aGUgY3VycmVudCBUaHJlYWQgcHJpb3JpdHkgdG8gMSAobG93ZXN0KSwgc3RvcmluZyB0aGUgb3JpZ2luYWwKK3ByaW9yaXR5IGluIHRoZSB1c2VyIHByb3BlcnR5ICJjdXJyZW50cHJpb3JpdHkiLiAgVGhpcworY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwcmlvcml0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBsYXRlci4KKzwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9wYWNrLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcGFjay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNmQ2NzAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcGFjay5odG1sCkBAIC0wLDAgKzEsNzYgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+R1ppcC9CWmlwMiBUYXNrczwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0icGFjayI+R1ppcC9CWmlwMjwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlBhY2tzIGEgcmVzb3VyY2UgdXNpbmcgdGhlIEdaaXAgb3IgQlppcDIgYWxnb3JpdGhtLgorVGhlIG91dHB1dCBmaWxlIGlzIG9ubHkgZ2VuZXJhdGVkIGlmIGl0IGRvZXNuJ3QgZXhpc3Qgb3IgdGhlIHNvdXJjZQorcmVzb3VyY2UgaXMgbmV3ZXIuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmaWxlIHRvIGd6aXAvYnppcC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzLCBvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkZXN0aW5hdGlvbiBmaWxlIHRvIGNyZWF0ZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3by48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj56aXBmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8aT5kZXByZWNhdGVkPC9pPiBvbGQgbmFtZSBvZiBkZXN0ZmlsZS48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoND5hbnkgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gb3Igc2luZ2xlIGVsZW1lbnQKK3Jlc291cmNlIGNvbGxlY3Rpb248L2g0PgorCis8cD5UaGUgc3BlY2lmaWVkIHJlc291cmNlIHdpbGwgYmUgdXNlZCBhcyBzcmMuIDxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2d6aXAgc3JjPSZxdW90O3Rlc3QudGFyJnF1b3Q7IGRlc3RmaWxlPSZxdW90O3Rlc3QudGFyLmd6JnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7YnppcDIgc3JjPSZxdW90O3Rlc3QudGFyJnF1b3Q7IGRlc3RmaWxlPSZxdW90O3Rlc3QudGFyLmJ6MiZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2d6aXAgZGVzdGZpbGU9JnF1b3Q7YXJjaGl2ZS50YXIuZ3omcXVvdDsmZ3Q7CisgICZsdDt1cmwgdXJsPSJodHRwOi8vZXhhbXBsZS5vcmcvYXJjaGl2ZS50YXIiLyZndDsKKyZsdDsvZ3ppcCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmRvd25sb2FkcyA8aT5odHRwOi8vZXhhbXBsZS5vcmcvYXJjaGl2ZS50YXI8L2k+IGFuZCBjb21wcmVzc2VzIGl0Cit0byA8aT5hcmNoaXZlLnRhci5nejwvaT4gaW4gdGhlIHByb2plY3QncyBiYXNlZGlyIG9uIHRoZSBmbHkuPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9wYXJhbGxlbC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3BhcmFsbGVsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5YTY3NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9wYXJhbGxlbC5odG1sCkBAIC0wLDAgKzEsMjM2IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlBhcmFsbGVsIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPlBhcmFsbGVsPC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD4KKyAgICBFeGVjdXRlcyBuZXN0ZWQgdGFza3MgaW4gcGFyYWxsZWwgd2l0aCBubyBndWFyYW50ZWVzIG9mIHRocmVhZCBzYWZldHkuCisgICAgRXZlcnkgdGFzayB3aWxsIHJ1biBpbiBpdHMgb3duIHRocmVhZCwgd2l0aCB0aGUgbGlrZWxpaG9vZCBvZiAKKyAgICBjb25jdXJyZW5jeSBwcm9ibGVtcyBzY2FsaW5nIHdpdGggdGhlIG51bWJlciBvZiBDUFVzIG9uIHRoZSBob3N0IHN5c3RlbS4KKzwvcD4KKzxwPjxiPldhcm5pbmc6PC9iPiBXaGlsZSB0aGUgQW50IGNvcmUgaXMgYmVsaWV2ZWQgdG8gYmUgdGhyZWFkIHNhZmUsIG5vIHN1Y2ggCisgICAgZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB0YXNrcywgd2hpY2ggYXJlIG5vdCB0ZXN0ZWQgZm9yIHRocmVhZCBzYWZldHkgZHVyaW5nCisgICAgQW50J3MgdGVzdCBwcm9jZXNzLiAKKyAgICBUaGlyZCBwYXJ0eSB0YXNrcyBtYXkgb3IgbWF5IG5vdCBiZSB0aHJlYWQgc2FmZSwgYW5kIHNvbWUgb2YgQW50J3MgY29yZSB0YXNrcywgc3VjaCBhcworICAgIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IGFyZSBkZWZpbml0ZWx5IG5vdCByZS1lbnRyYW50LiBUaGlzIGlzIGJlY2F1c2UgdGhleSB1c2UgbGlicmFyaWVzIHRoYXQKKyAgICB3ZXJlIG5ldmVyIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gYSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50LgorPC9wPgorPHA+CisgICAgVGhlIHByaW1hcnkgdXNlIGNhc2UgZm9yIDxjb2RlPiZsdDtwYXJhbGxlbCZndDs8L2NvZGU+IGlzIHRvIHJ1biBleHRlcm5hbCBwcm9ncmFtcworICAgIHN1Y2ggYXMgYW4gYXBwbGljYXRpb24gc2VydmVyLCBhbmQgdGhlIEpVbml0IG9yIFRlc3RORyB0ZXN0IHN1aXRlcyBhdCB0aGUKKyAgICBzYW1lIHRpbWUuIEFueW9uZSB0cnlpbmcgdG8gcnVuIGxhcmdlIEFudCB0YXNrIHNlcXVlbmNlcyBpbiBwYXJhbGxlbCwgc3VjaAorICAgIGFzIGphdmFkb2MgYW5kIGphdmFjIGF0IHRoZSBzYW1lIHRpbWUsIGlzIGltcGxpY2l0bHkgdGFraW5nIG9uIHRoZSB0YXNrCisgICAgb2YgaWRlbnRpZnlpbmcgYW5kIGZpeGluZyBhbGwgY29uY3VycmVuY3kgYnVncyB0aGUgdGFza3MgdGhhdCB0aGV5IHJ1bi4KKyAgICAKKzwvcD4KKzxwPgorICAgIEFjY29yZGluZ2x5LCB3aGlsZSB0aGlzIHRhc2sgaGFzIHVzZXMsIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGFkdmFuY2VkCisgICAgdGFzayB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBjZXJ0YWluIGJhdGNoLXByb2Nlc3Npbmcgb3IgdGVzdGluZyBzaXR1YXRpb25zLAorICAgIHJhdGhlciB0aGFuIGFuIGVhc3kgdHJpY2sgdG8gc3BlZWQgdXAgYnVpbGQgdGltZXMgb24gYSBtdWx0aXdheSBDUFUuIAorPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aHJlYWRDb3VudDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5NYXhpbXVtIG51bWJlcnMgb2YgdGhyZWFkIHRvIHVzZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aHJlYWRzUGVyUHJvY2Vzc29yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIHBlciBhdmFpbGFibGUgcHJvY2Vzc29yCisoSmF2YSAxLjQrKTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmZXJzIHRvIHRocmVhZENvdW50PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGltZW91dDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5OdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSBleGVjdXRpb24gaXMgdGVybWluYXRlZDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmFueTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiBhbnkgb2YgdGhlIG5lc3RlZCB0YXNrcyBmYWlscywgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIGNvbXBsZXRlcworICAgICAgICAgICAgICAgICAgICAgYXQgdGhhdCBwb2ludCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSBvdGhlciB0YXNrcyB0byBjb21wbGV0ZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wb2xsSW50ZXJ2YWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q3VycmVudGx5IGhhcyBubyBlZmZlY3Q8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgMTAwMDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5QYXJhbGxlbCB0YXNrcyBoYXZlIGEgbnVtYmVyIG9mIHVzZXMgaW4gYW4gQW50IGJ1aWxkIGZpbGUgaW5jbHVkaW5nOjwvcD4KKzx1bD4KKzxsaT5UYWtpbmcgYWR2YW50YWdlIG9mIGF2YWlsYWJsZSBwcm9jZXNzaW5nIHJlc291cmNlcyB0byBleGVjdXRlIGV4dGVybmFsCisgcHJvZ3JhbXMgc2ltdWx0YW5lb3VzbHkuPC9saT4KKzxsaT5UZXN0aW5nIHNlcnZlcnMsIHdoZXJlIHRoZSBzZXJ2ZXIgY2FuIGJlIHJ1biBpbiBvbmUgdGhyZWFkIGFuZCB0aGUgdGVzdAoraGFybmVzcyBpcyBydW4gaW4gYW5vdGhlciB0aHJlYWQuPC9saT4KKzwvdWw+CisKKzxwPkFueSB2YWxpZCBBbnQgdGFzayBtYXkgYmUgZW1iZWRkZWQgd2l0aGluIGEKK3BhcmFsbGVsIHRhc2ssIGluY2x1ZGluZyBvdGhlciBwYXJhbGxlbCB0YXNrcywgdGhvdWdoIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0Cit0aGUgdGFza3Mgd2lsbCBiZSB0aHJlYWQgc2FmZSBpbiBzdWNoIGFuIGVudmlyb25tZW50LjwvcD4KKworPHA+V2hpbGUgdGhlIHRhc2tzIHdpdGhpbiB0aGUgcGFyYWxsZWwgdGFzayBhcmUgYmVpbmcgcnVuLCB0aGUgbWFpbgordGhyZWFkIHdpbGwgYmUgYmxvY2tlZCB3YWl0aW5nIGZvciBhbGwgdGhlIGNoaWxkIHRocmVhZHMgdG8gY29tcGxldGUuIElmCitleGVjdXRpb24gaXMgdGVybWluYXRlZCBieSBhIHRpbWVvdXQgb3IgYSBuZXN0ZWQgdGFzayBmYWlsdXJlIHdoZW4gdGhlCis8Y29kZT5mYWlsb25hbnk8L2NvZGU+CitmbGFnIGlzIHNldCwgdGhlIHBhcmFsbGVsIHRhc2sgd2lsbCBjb21wbGV0ZSB3aXRob3V0IHdhaXRpbmcgZm9yIG90aGVyIG5lc3RlZAordGFza3MgdG8gY29tcGxldGUgaW4gb3RoZXIgdGhyZWFkcy4KKzwvcD4KKworPHA+SWYgYW55IG9mIHRoZSB0YXNrcyB3aXRoaW4gdGhlIDxjb2RlPiZsdDtwYXJhbGxlbCZndDs8L2NvZGU+IHRhc2sgZmFpbHMgYW5kIGZhaWxvbmFueSBpcworbm90IHNldCwgdGhlIHJlbWFpbmluZyB0YXNrcyBpbiBvdGhlciB0aHJlYWRzIHdpbGwgY29udGludWUgdG8gcnVuIHVudGlsCithbGwgdGhyZWFkcyBoYXZlIGNvbXBsZXRlZC4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBwYXJhbGxlbCB0YXNrIHdpbGwgYWxzbyBmYWlsLjwvcD4KKworPHA+VGhlIHBhcmFsbGVsIHRhc2sgbWF5IGJlIGNvbWJpbmVkIHdpdGggdGhlIDxhIGhyZWY9InNlcXVlbnRpYWwuaHRtbCI+CitzZXF1ZW50aWFsPC9hPiB0YXNrIHRvIGRlZmluZSBzZXF1ZW5jZXMgb2YgdGFza3MgdG8gYmUgZXhlY3V0ZWQgb24gZWFjaCB0aHJlYWQKK3dpdGhpbiB0aGUgcGFyYWxsZWwgYmxvY2s8L3A+CisKKzxwPlRoZSA8Y29kZT50aHJlYWRDb3VudDwvY29kZT4gYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHBsYWNlIGEgbWF4aW11bSBudW1iZXIgb2YgYXZhaWxhYmxlCit0aHJlYWRzIGZvciB0aGUgZXhlY3V0aW9uLiAgV2hlbiBub3QgcHJlc2VudCBhbGwgY2hpbGQgdGFza3Mgd2lsbCBiZSBleGVjdXRlZCBhdAorb25jZS4gIFdoZW4gcHJlc2VudCB0aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50bHkgZXhlY3V0aW5nIHRhc2tzIHdpbGwKK25vdCBleGNlZWQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHNwZWNpZmllZC4gIEZ1cnRoZXJtb3JlLCBlYWNoIHRhc2sgd2lsbCBiZQorc3RhcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZ2l2ZW4uICBCdXQgbm8gZ3VhcmFudGVlIGlzIG1hZGUgYXMgdG8gdGhlIHNwZWVkCitvZiBleGVjdXRpb24gb3IgdGhlIG9yZGVyIG9mIGNvbXBsZXRpb24gb2YgdGhlIHRhc2tzLCBvbmx5IHRoYXQgZWFjaCB3aWxsIGJlCitzdGFydGVkIGJlZm9yZSB0aGUgbmV4dC48cD4KKworPHA+SWYgeW91IGFyZSB1c2luZyBKYXZhIDEuNCBvciBsYXRlciB5b3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT50aHJlYWRzUGVyUHJvY2Vzc29yPC9jb2RlPgorYW5kIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHRocmVhZHMgd2lsbCBiZSB0aGUgc3RhdGVkIG11bHRpcGxlIG9mIHRoZSBudW1iZXIgb2YKK3Byb2Nlc3NvcnMgKHRoZXJlIGlzIG5vIGFmZmluaXR5IHRvIGEgcGFydGljdWxhciBwcm9jZXNzb3IgaG93ZXZlcikuICBUaGlzIHdpbGwKK292ZXJyaWRlIHRoZSB2YWx1ZSBpbiA8Y29kZT50aHJlYWRDb3VudDwvY29kZT4uICBJZiA8Y29kZT50aHJlYWRzUGVyUHJvY2Vzc29yPC9jb2RlPgoraXMgc3BlY2lmaWVkIG9uIGFueSBvbGRlciBKVk0sIHRoZW4gdGhlIHZhbHVlIGluIDxjb2RlPnRocmVhZENvdW50PC9jb2RlPiB3aWxsIGJlIHVzZWQgYXMgaXMuPC9wPgorCis8cD5XaGVuIHVzaW5nIDxjb2RlPnRocmVhZENvdW50PC9jb2RlPiBhbmQgIDxjb2RlPnRocmVhZHNQZXJQcm9jZXNzb3I8L2NvZGU+IAorICAgIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IHRoZSBidWlsZCBkb2VzIG5vdCBkZWFkbG9jay4gIAorICAgIFRoaXMgY2FuIGJlIGNhdXNlZCBieSB0YXNrcyBzdWNoIGFzIDxjb2RlPndhaXRmb3I8L2NvZGU+CisgICAgdGFraW5nIHVwIGFsbCBhdmFpbGFibGUgdGhyZWFkcyBiZWZvcmUgdGhlIHRhc2tzIHRoYXQgd291bGQgdW5sb2NrIHRoZSAKKyAgICA8Y29kZT53YWl0Zm9yPC9jb2RlPgord291bGQgb2NjdXIuICBUaGlzIGlzIG5vdCBhIHJlcGxhY2VtZW50IGZvciBKYXZhIExhbmd1YWdlIGxldmVsIHRocmVhZAorc2VtYW50aWNzIGFuZCBpcyBiZXN0IHVzZWQgZm9yICJlbWJhcmFzc2luZ2x5IHBhcmFsbGVsIiB0YXNrcy48L3A+CisKKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND5kYWVtb25zPC9oND4KKzxwPgorVGhlIHBhcmFsbGVsIHRhc2sgc3VwcG9ydHMgYSA8Y29kZT4mbHQ7ZGFlbW9ucyZndDs8L2NvZGU+IG5lc3RlZCBlbGVtZW50LiBUaGlzIGlzIGEgbGlzdCBvZiB0YXNrcword2hpY2ggYXJlIHRvIGJlIHJ1biBpbiBwYXJhbGxlbCBkYWVtb24gdGhyZWFkcy4gVGhlIHBhcmFsbGVsIHRhc2sgd2lsbCBub3Qgd2FpdCBmb3IKK3RoZXNlIHRhc2tzIHRvIGNvbXBsZXRlLiBCZWluZyBkYWVtb24gdGhyZWFkcywgaG93ZXZlciwgdGhleSB3aWxsIG5vdCBwcmV2ZW50IEFudCBmcm9tCitjb21wbGV0aW5nLCB3aGVyZXVwb24gdGhlIHRocmVhZHMgYXJlIHRlcm1pbmF0ZWQuIEZhaWx1cmVzIGluIGRhZW1vbiB0aHJlYWRzIHdoaWNoCitvY2N1ciBiZWZvcmUgdGhlIHBhcmFsbGVsIHRhc2sgaXRzZWxmIGZpbmlzaGVzIHdpbGwgYmUgcmVwb3J0ZWQgYW5kIGNhbiBjYXVzZQorcGFyYWxsZWwgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLiBGYWlsdXJlcyB3aGljaCBvY2N1ciBhZnRlciBwYXJhbGxlbCBoYXMgY29tcGxldGVkIGFyZSBub3QKK3JlcG9ydGVkLgorPC9wPgorCis8cD5EYWVtb24gdGFza3MgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBzdGFydCB0ZXN0IHNlcnZlcnMgd2hpY2ggbWlnaHQgbm90IGJlIGVhc2lseQordGVybWluYXRlZCBmcm9tIEFudC4gQnkgdXNpbmcgPGNvZGU+Jmx0O2RhZW1vbnMmZ3Q7PC9jb2RlPiBzdWNoIHNlcnZlcnMgZG8gbm90IGhhbHQgdGhlIGJ1aWxkLgorPC9wPgorCisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPgorJmx0O3BhcmFsbGVsJmd0OworICAmbHQ7d2xydW4gLi4uICZndDsKKyAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgJmx0O3NsZWVwIHNlY29uZHM9JnF1b3Q7MzAmcXVvdDsvJmd0OworICAgICZsdDtqdW5pdCBmb3JrPSJ0cnVlIiBmb3JrbW9kZT0ib25jZSIgLi4uICZndDsKKyAgICAmbHQ7d2xzdG9wLyZndDsKKyAgJmx0Oy9zZXF1ZW50aWFsJmd0OworJmx0Oy9wYXJhbGxlbCZndDsKKzwvcHJlPgorPHA+VGhpcyBleGFtcGxlIHJlcHJlc2VudHMgYSB0eXBpY2FsIHBhdHRlcm4gZm9yIHRlc3RpbmcgYSBzZXJ2ZXIgYXBwbGljYXRpb24uCitJbiBvbmUgdGhyZWFkIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCAodGhlIDxjb2RlPiZsdDt3bHJ1biZndDs8L2NvZGU+IHRhc2spLiAKK1RoZSBvdGhlciB0aHJlYWQgY29uc2lzdHMKK29mIGEgdGhyZWUgdGFza3Mgd2hpY2ggYXJlIHBlcmZvcm1lZCBpbiBzZXF1ZW5jZS4gVGhlIDxjb2RlPiZsdDtzbGVlcCZndDs8L2NvZGU+IHRhc2sgaXMgdXNlZCB0bworZ2l2ZSB0aGUgc2VydmVyIHRpbWUgdG8gY29tZSB1cC4gQW5vdGhlciB0YXNrIHdoaWNoIGlzIGNhcGFibGUgb2YgdmFsaWRhdGluZwordGhhdCB0aGUgc2VydmVyIGlzIGF2YWlsYWJsZSBjb3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSA8Y29kZT4mbHQ7c2xlZXAmZ3Q7PC9jb2RlPiB0YXNrLiBUaGUKKzxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IHRlc3QgaGFybmVzcyB0aGVuIHJ1bnMsIGFnYWluIGluIGl0cyBvd24gSlZNLiBPbmNlIHRoZSB0ZXN0cyBhcmUgY29tcGxldGUsIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZAorKHVzaW5nIDxjb2RlPiZsdDt3bHN0b3AmZ3Q7PC9jb2RlPiBpbiB0aGlzIGV4YW1wbGUpLCBhbGxvd2luZyBib3RoIHRocmVhZHMgdG8gY29tcGxldGUuIFRoZQorPGNvZGU+Jmx0O3BhcmFsbGVsJmd0OzwvY29kZT4gdGFzayB3aWxsIGFsc28gY29tcGxldGUgYXQgdGhpcyB0aW1lIGFuZCB0aGUgYnVpbGQgd2lsbCB0aGVuCitjb250aW51ZS48L3A+CisKKzxwcmU+CismbHQ7cGFyYWxsZWwmZ3Q7CisgICZsdDtqYXZhYyBmb3JrPSJ0cnVlIi4uLiZndDsgJmx0OyEtLSBjb21waWxlciBzZXJ2bGV0IGNvZGUgLS0mZ3Q7CisgICZsdDt3bGpzcGMgLi4uJmd0OyAmbHQ7IS0tIHByZWNvbXBpbGUgSlNQcyAtLSZndDsKKyZsdDsvcGFyYWxsZWwmZ3Q7Cis8L3ByZT4KKworPHA+VGhpcyBleGFtcGxlIHNob3dzIHR3byBpbmRlcGVuZGVudCB0YXNrcyBiZWluZyBydW4gdG8gYWNoaWV2ZSBiZXR0ZXIKK3Jlc291cmNlIHV0aWxpemF0aW9uIGR1cmluZyB0aGUgYnVpbGQuIEluIHRoaXMgaW5zdGFuY2UsIHNvbWUgc2VydmxldHMgYXJlIGJlaW5nCitjb21waWxlZCBpbiBvbmUgdGhlYWQgYW5kIGEgc2V0IG9mIEpTUHMgaXMgYmVpbmcgcHJlY29tcGlsZWQgaW4gYW5vdGhlci4gRGV2ZWxvcGVycworbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgdGhlIHR3byB0YXNrcyBhcmUgaW5kZXBlbmRlbnQsIGJvdGggaW4KK3Rlcm1zIG9mIHRoZWlyIGRlcGVuZGVuY2llcyBhbmQgaW4gdGVybXMgb2YgdGhlaXIgcG90ZW50aWFsIGludGVyYWN0aW9ucyBpbgorQW50J3MgZXh0ZXJuYWwgZW52aXJvbm1lbnQuIEhlcmUgd2Ugc2V0IDxjb2RlPmZvcms9InRydWUiPC9jb2RlPiBmb3IgdGhlIAorPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzaywgc28gdGhhdCBpdCBydW5zIGluIGEgbmV3IHByb2Nlc3M7IAoraWYgdGhlIDxjb2RlPiZsdDt3bGpzcGMmZ3Q7PC9jb2RlPiB0YXNrIHVzZWQgdGhlIGphdmFjIGNvbXBpbGVyIGluLVZNCisoaXQgbWF5KSwgY29uY3VycmVuY3kgcHJvYmxlbXMgbWF5IGFyaXNlLgorPC9wPgorCis8dGFza2RlZiBuYW1lPSIiCis8cHJlPgorICZsdDttYWNyb2RlZiBuYW1lPSJkYnB1cmdlIiZndDsKKyAgICAmbHQ7YXR0cmlidXRlIGZpbGU9ImZpbGUiLyZndDsKKyAgICZsdDtzZXF1ZW50aWFsJmd0OworICAgICAgJmx0O2phdmEgamFyPSJ1dGlscy9kYnB1cmdlLmphciIgZm9yaz0idHJ1ZSIgJmd0OworICAgICAgICAmbHQ7YXJnIGZpbGU9IkB7ZmlsZX0gLyZndDsKKyAgICAgICZsdDsvamF2YSZndDsKKyAgICZsdDsvc2VxdWVudGlhbCZndDsKKyZsdDsvbWFjcm9kZWYmZ3Q7CisgICAgCismbHQ7cGFyYWxsZWwgdGhyZWFkQ291bnQ9JzQnJmd0OworICAmbHQ7ZGJwdXJnZSBmaWxlPSJkYi9vbmUiIC8mZ3Q7CisgICZsdDtkYnB1cmdlIGZpbGU9ImRiL3R3byIgLyZndDsKKyAgJmx0O2RicHVyZ2UgZmlsZT0iZGIvdGhyZWUiIC8mZ3Q7CisgICZsdDtkYnB1cmdlIGZpbGU9ImRiL2ZvdXIiIC8mZ3Q7CisgICZsdDtkYnB1cmdlIGZpbGU9ImRiL2ZpdmUiIC8mZ3Q7CisgICZsdDtkYnB1cmdlIGZpbGU9ImRiL3NpeCIgLyZndDsKKyAgJmx0O2RicHVyZ2UgZmlsZT0iZGIvc2V2ZW4iIC8mZ3Q7CisgICZsdDtkYnB1cmdlIGZpbGU9ImRiL2VpZ2h0IiAvJmd0OworICAmbHQ7IS0tIHJlcGVhdGVkIGFib3V0IDQwIHRpbWVzIC0tJmd0OworJmx0Oy9wYXJhbGxlbCZndDsKKzwvcHJlPgorCis8cD5UaGlzIGV4YW1wbGUgcmVwcmVzZW50cyBhIHR5cGljYWwgbmVlZCBmb3IgdXNlIG9mIHRoZSB0aHJlYWRDb3VudCBhbmQKK3RocmVhZHNQZXJQcm9jZXNzb3IgYXR0cmlidXRlcy4gIFNwaW5uaW5nIHVwIGFsbCA0MCBvZiB0aG9zZSB0YXNrcyBjb3VsZCBjcmlwcGxlCit0aGUgc3lzdGVtIGZvciBtZW1vcnkgYW5kIENQVSB0aW1lLiAgQnkgbGltaXRpbmcgdGhlIG51bWJlciBvZgorY29uY3VycmVudCBleGVjdXRpb25zIHlvdSBjYW4gcmVkdWNlIGNvbnRlbnRpb24gZm9yIENQVSwgbWVtb3J5IGFuZCBkaXNrIElPLCAKK2FuZCBzbyBhY3R1YWxseSBmaW5pc2ggZmFzdGVyLiAgVGhpcyBpcyBhbHNvIGEgZ29vZAorY2FuZGlkaWF0ZSBmb3IgdXNlIG9mIHRocmVhZENvdW50IChhbmQgcG9zc2libHkgdGhyZWFkc1BlclByb2Nlc3NvcikgYmVjYXVzZQorZWFjaCB0YXNrIGlzIGluZGVwZW5kZW50IChldmVyeSBuZXcgSlZNIGlzIGZvcmtlZCkgYW5kIGhhcyBubyBkZXBlbmRlbmNpZXMgb24KK3RoZSBvdGhlciB0YXNrcy48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcGF0Y2guaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9wYXRjaC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YmViMmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcGF0Y2guaHRtbApAQCAtMCwwICsxLDEwNCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5QYXRjaCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJwYXRjaCI+UGF0Y2g8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5BcHBsaWVzIGEgZGlmZiBmaWxlIHRvIG9yaWdpbmFscy4gOyByZXF1aXJlcyAicGF0Y2giIHRvIGJlCisgb24gdGhlIGV4ZWN1dGlvbiBwYXRoLiAgPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0Y2hmaWxlPC90ZD4gCisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSB0aGF0IGluY2x1ZGVzIHRoZSBkaWZmIG91dHB1dDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vcmlnaW5hbGZpbGU8L3RkPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmaWxlIHRvIHBhdGNoPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCB0cmllcyB0byBndWVzcyBpdCBmcm9tIHRoZSBkaWZmIAorICAgICAgZmlsZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4gCisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSB0byBzZW5kIHRoZSBvdXRwdXQgdG8gaW5zdGVhZCBvZgorICAgICAgcGF0Y2hpbmcgdGhlIGZpbGUocykgaW4gcGxhY2UuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJhY2t1cHM8L3RkPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPktlZXAgYmFja3VwcyBvZiB0aGUgdW5wYXRjaGVkIGZpbGVzPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cXVpZXQ8L3RkPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPldvcmsgc2lsZW50bHkgdW5sZXNzIGFuIGVycm9yIG9jY3VyczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJldmVyc2U8L3RkPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPkFzc3VtZSBwYXRjaCB3YXMgY3JlYXRlZCB3aXRoIG9sZCBhbmQgbmV3IGZpbGVzIAorICAgICAgc3dhcHBlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmV3aGl0ZXNwYWNlPC90ZD4gCisgICAgPHRkIHZhbGlnbj0idG9wIj5JZ25vcmUgd2hpdGVzcGFjZSBkaWZmZXJlbmNlcy48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdHJpcDwvdGQ+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RyaXAgdGhlIHNtYWxsZXN0IHByZWZpeCBjb250YWluaW5nIDxpPm51bTwvaT4gbGVhZGluZyAKKyAgICAgIHNsYXNoZXMgZnJvbSBmaWxlbmFtZXMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4gCisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHJ1biB0aGUgcGF0Y2ggY29tbWFuZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgdGhlIHByb2plY3QncyBiYXNlZGlyLjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7cGF0Y2ggcGF0Y2hmaWxlPSZxdW90O21vZHVsZS4xLjAtMS4xLnBhdGNoJnF1b3Q7LyZndDs8L3ByZT4KKzxwPmFwcGxpZXMgdGhlIGRpZmYgaW5jbHVkZWQgaW4gPGk+bW9kdWxlLjEuMC0xLjEucGF0Y2g8L2k+IHRvIHRoZQorZmlsZXMgaW4gYmFzZSBkaXJlY3RvcnkgZ3Vlc3NpbmcgdGhlIGZpbGVuYW1lKHMpIGZyb20gdGhlIGRpZmYgb3V0cHV0LjwvcD4KKzxwcmU+ICAmbHQ7cGF0Y2ggcGF0Y2hmaWxlPSZxdW90O21vZHVsZS4xLjAtMS4xLnBhdGNoJnF1b3Q7IHN0cmlwPSZxdW90OzEmcXVvdDsvJmd0OzwvcHJlPgorPHA+bGlrZSBhYm92ZSBidXQgb25lIGxlYWRpbmcgZGlyZWN0b3J5IHBhcnQgd2lsbCBiZSByZW1vdmVkLiBpLmUuIGlmCit0aGUgZGlmZiBvdXRwdXQgbG9va2VkIGxpa2U8L3A+Cis8cHJlPgorLS0tIGEvbW9kMS4wL0EJTW9uIEp1biAgNSAxNzoyODo0MSAyMDAwCisrKysgYS9tb2QxLjEvQQlNb24gSnVuICA1IDE3OjI4OjQ5IDIwMDAKKzwvcHJlPiAKK3RoZSBsZWFkaW5nIDxpPmEvPC9pPiB3aWxsIGJlIHN0cmlwcGVkLgorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3BhdGhjb252ZXJ0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcGF0aGNvbnZlcnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTc5NjNjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3BhdGhjb252ZXJ0Lmh0bWwKQEAgLTAsMCArMSwyMTggQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UGF0aENvbnZlcnQgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0icGF0aGNvbnZlcnQiPlBhdGhjb252ZXJ0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+Q29udmVydHMgbmVzdGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj4KK1Jlc291cmNlQ29sbGVjdGlvbjwvYT5zLCBvciBhIHJlZmVyZW5jZSB0byBqdXN0IG9uZSwgaW50byBhIHBhdGgKK2Zvcm0gZm9yIGEgcGFydGljdWxhciBwbGF0Zm9ybSwgb3B0aW9uYWxseSBzdG9yaW5nIHRoZSByZXN1bHQgaW50bworYSBnaXZlbiBwcm9wZXJ0eS4gSXQgY2FuIGFsc28gYmUgdXNlZCB3aGVuIHlvdSBuZWVkCit0byBjb252ZXJ0IGEgUmVzb3VyY2UgQ29sbGVjdGlvbiBpbnRvIGEgbGlzdCwgc2VwYXJhdGVkIGJ5IGEgZ2l2ZW4KK2NoYXJhY3Rlciwgc3VjaCBhcyBhIGNvbW1hIG9yIHNwYWNlLCBvciwgY29udmVyc2VseSwgZS5nLiB0byBjb252ZXJ0IGEgbGlzdAorb2YgZmlsZXMgaW4gYSBGaWxlTGlzdCBpbnRvIGEgcGF0aC4KKzwvcD4KKzxwPk5lc3RlZCA8Y29kZT4mbHQ7bWFwJmd0OzwvY29kZT4gZWxlbWVudHMgY2FuIGJlIHNwZWNpZmllZCB0byBtYXAgV2luZG93cworZHJpdmUgbGV0dGVycyB0byBVbml4IHBhdGhzLCBhbmQgdmljZS12ZXJzYS48L3A+Cis8cD5Nb3JlIGNvbXBsZXggdHJhbnNmb3JtYXRpb25zIGNhbiBiZSBhY2hpZXZlZCB1c2luZyBhIG5lc3RlZAorPGEgaHJlZj0iLi4vQ29yZVR5cGVzL21hcHBlci5odG1sIj48Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT48L2E+Cisoc2luY2UgQW50IDEuNi4yKS4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0b3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgIFRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiAgTXVzdCBiZSBvbmUgb2YgJ3VuaXgnLCAnd2luZG93cycsIAorICAgICAgICAnbmV0d2FyZScsICd0YW5kZW0nIG9yICdvcy8yJy4KKyAgICAgICAgVGhpcyBpcyBhIHNob3J0aGFuZCBtZWNoYW5pc20gZm9yIHNwZWNpZnlpbmcgYm90aAorICAgICAgICA8Y29kZT5wYXRoc2VwPC9jb2RlPiBhbmQgPGNvZGU+ZGlyc2VwPC9jb2RlPgorICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcnNlcDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICBUaGUgY2hhcmFjdGVyKHMpIHRvIHVzZSBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpbiB0aGUKKyAgICAgICBnZW5lcmF0ZWQgcGF0aHMuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBjdXJyZW50IEpWTSA8dHQ+RmlsZS5zZXBhcmF0b3I8L3R0PjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGhzZXA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgVGhlIGNoYXJhY3RlcihzKSB0byB1c2UgYXMgdGhlIHBhdGgtZWxlbWVudCBzZXBhcmF0b3IgaW4gdGhlCisgICAgICAgZ2VuZXJhdGVkIHBhdGhzLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gY3VycmVudCBKVk0gPHR0PkZpbGUucGF0aFNlcGFyYXRvcjwvdHQ+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBjb252ZXJ0ZWQgcGF0aC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIHJlc3VsdCB3aWxsIGJlIGxvZ2dlZCBpZiB1bnNldDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlZmlkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoYXQgdG8gY29udmVydCwgZ2l2ZW4gYXMgYQorICAgICAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYQorICAgICAgICA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LAorICAgICAgICA8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4sIG9yIDxjb2RlPiZsdDtmaWxlbGlzdCZndDs8L2NvZGU+CisgICAgICAgIGRlZmluZWQgZWxzZXdoZXJlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBpZiBvbWl0dGVkLCBhIG5lc3RlZAorICAgICAgICA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGVsZW1lbnQgbXVzdCBiZSBzdXBwbGllZC48L3RkPgorICA8L3RyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2V0b25lbXB0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TaG91bGQgdGhlIHByb3BlcnR5IGJlIHNldCwgZXZlbiBpZiB0aGUgcmVzdWx0CisgICAgICBpcyB0aGUgZW1wdHkgc3RyaW5nPworICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHQgaXMgJnF1b3Q7dHJ1ZSZxdW90Oy4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5tYXA8L2g0PgorPHA+U3BlY2lmaWVzIHRoZSBtYXBwaW5nIG9mIHBhdGggcHJlZml4ZXMgYmV0d2VlbiBVbml4IGFuZCBXaW5kb3dzLjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZyb208L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGUgcHJlZml4IHRvIG1hdGNoLiAgTm90ZSB0aGF0IHRoaXMgdmFsdWUgaXMgY2FzZS1pbnNlbnNpdGl2ZSB3aGVuCisgICAgICB0aGUgYnVpbGQgaXMgcnVubmluZyBvbiBhIFdpbmRvd3MgcGxhdGZvcm0gYW5kIGNhc2Utc2Vuc2l0aXZlIAorICAgICAgd2hlbiBydW5uaW5nIG9uIGEgVW5peCBwbGF0Zm9ybS4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPiwgb24gV2luZG93cyB0aGlzIHZhbHVlIGlzIGFsc28gaW5zZW5zaXRpdmUKKyAgICAgIHRvIHRoZSBzbGFzaCBzdHlsZSB1c2VkIGZvciBkaXJlY3Rvcmllcywgb25lIGNhbiB1c2UgJy8nIG9yICdcJy4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJlcGxhY2VtZW50IHRleHQgdG8gdXNlIHdoZW4gPGNvZGU+ZnJvbTwvY29kZT4gaXMgbWF0Y2hlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPkVhY2ggbWFwIGVsZW1lbnQgc3BlY2lmaWVzIGEgc2luZ2xlIHJlcGxhY2VtZW50IG1hcCB0byBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50cyBvZgorICAgdGhlIHBhdGggYmVpbmcgcHJvY2Vzc2VkLiAgSWYgbm8gbWFwIGVudHJpZXMgYXJlIHNwZWNpZmllZCwgdGhlbiBubyBwYXRoIHByZWZpeCBtYXBwaW5nCisgICBpcyBwZXJmb3JtZWQuCis8L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoZSBtYXAgZWxlbWVudHMgYXJlIGFwcGxpZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCwKK2FuZCBvbmx5IHRoZSBmaXJzdCBtYXRjaGluZyBtYXAgZWxlbWVudCBpcyBhcHBsaWVkLiAgU28sIHRoZSBvcmRlcmluZyBvZgoreW91ciBtYXAgZWxlbWVudHMgY2FuIGJlIGltcG9ydGFudCwgaWYgYW55IDxjb2RlPmZyb208L2NvZGU+IHZhbHVlcyBhcmUKK3ByZWZpeGVzIG9mIG90aGVyIDxjb2RlPmZyb208L2NvZGU+IHZhbHVlcy48L2k+Cis8L3A+ICAgCis8aDQ+UmVzb3VyY2UgQ29sbGVjdGlvbnM8L2g0PgorPHA+SWYgdGhlIDxjb2RlPnJlZmlkPC9jb2RlPiBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBvbmUgb3IgbW9yZQorICAgbmVzdGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZQorQ29sbGVjdGlvbjwvYT5zIG11c3QgYmUgc3VwcGxpZWQuPC9wPgorPGg0Pm1hcHBlcjwvaDQ+Cis8cD5BIHNpbmdsZSBuZXN0ZWQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL21hcHBlci5odG1sIj4KKzxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudCBjYW4gYmUgc3BlY2lmaWVkCit0byBwZXJmb3JtIGFueSBvZiB2YXJpb3VzIGZpbGVuYW1lIHRyYW5zZm9ybWF0aW9ucyAoc2luY2UgQW50IDEuNi4yKS4KKzwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwPkluIHRoZSBleGFtcGxlcyBiZWxvdywgYXNzdW1lIHRoYXQgdGhlIDxjb2RlPiR7d2wuaG9tZX08L2NvZGU+IHByb3BlcnR5CitoYXMgdGhlIHZhbHVlCis8Y29kZT5kOlx3ZWJsb2dpYzwvY29kZT4sIGFuZCA8Y29kZT4ke3dsLmhvbWUudW5peH08L2NvZGU+IGhhcyB0aGUgdmFsdWUKKzxjb2RlPi93ZWJsb2dpYzwvY29kZT4uPC9wPgorPGg0PkV4YW1wbGUgMTwvaDQ+Cis8cHJlPgorICAgICZsdDtwYXRoIGlkPSJ3bC5wYXRoIiZndDsKKyAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDske3dsLmhvbWV9L2xpYi93ZWJsb2dpY2F1eC5qYXImcXVvdDsvJmd0OworICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90OyR7d2wuaG9tZX0vY2xhc3NlcyZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7JHt3bC5ob21lfS9tc3NxbHNlcnZlcjQvY2xhc3NlcyZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7Yzpcd2lubnRcU3lzdGVtMzImcXVvdDsvJmd0OworICAgICZsdDsvcGF0aCZndDsKKyAgICAKKyAgICAmbHQ7cGF0aGNvbnZlcnQgdGFyZ2V0b3M9JnF1b3Q7dW5peCZxdW90OyBwcm9wZXJ0eT0mcXVvdDt3bC5wYXRoLnVuaXgmcXVvdDsgcmVmaWQ9JnF1b3Q7d2wucGF0aCZxdW90OyZndDsKKyAgICAgICZsdDttYXAgZnJvbT0mcXVvdDske3dsLmhvbWV9JnF1b3Q7IHRvPSZxdW90OyR7d2wuaG9tZS51bml4fSZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7bWFwIGZyb209JnF1b3Q7YzomcXVvdDsgdG89JnF1b3Q7JnF1b3Q7LyZndDsKKyAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OworPC9wcmU+Cis8cD4gd2lsbCBnZW5lcmF0ZSB0aGUgcGF0aCBzaG93biBiZWxvdworYW5kIHN0b3JlIGl0IGluIHRoZSBwcm9wZXJ0eSBuYW1lZCA8Y29kZT53bC5wYXRoLnVuaXg8L2NvZGU+LgorPC9wPiAgIAorPHByZT4KKy93ZWJsb2dpYy9saWIvd2VibG9naWNhdXguamFyOi93ZWJsb2dpYy9jbGFzc2VzOi93ZWJsb2dpYy9tc3NxbHNlcnZlcjQvY2xhc3NlczovV0lOTlQvU1lTVEVNMzIKKzwvcHJlPgorCis8aDQ+RXhhbXBsZSAyPC9oND4KK0dpdmVuIGEgRmlsZUxpc3QgZGVmaW5lZCBhczoKKzxwcmU+CisgICZsdDtmaWxlbGlzdCBpZD0mcXVvdDtjdXN0b21fdGFza3MuamFycyZxdW90OworICAgICAgICBkaXI9JnF1b3Q7JHtlbnYuSE9NRX0vYW50L2xpYiZxdW90OworICAgICAgICBmaWxlcz0mcXVvdDtuamF2YWMuamFyLHhwcm9wZXJ0eS5qYXImcXVvdDsvJmd0OworPC9wcmU+Cit0aGVuOgorPHByZT4KKyAgICAmbHQ7cGF0aGNvbnZlcnQgdGFyZ2V0b3M9JnF1b3Q7dW5peCZxdW90OyBwcm9wZXJ0eT0mcXVvdDtjdXN0b21fdGFza3MuamFycyZxdW90OyByZWZpZD0mcXVvdDtjdXN0b21fdGFza3MuamFycyZxdW90OyZndDsKKyAgICAgICZsdDttYXAgZnJvbT0mcXVvdDske2Vudi5IT01FfSZxdW90OyB0bz0mcXVvdDsvdXNyL2xvY2FsJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OworPC9wcmU+Cit3aWxsIGNvbnZlcnQgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gdGhlIGZvbGxvd2luZyBVbml4IHBhdGg6Cis8cHJlPgorL3Vzci9sb2NhbC9hbnQvbGliL25qYXZhYy5qYXI6L3Vzci9sb2NhbC9hbnQvbGliL3hwcm9wZXJ0eS5qYXIKKzwvcHJlPgorCis8aDQ+RXhhbXBsZSAzPC9oND4KKzxwcmU+CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7c3JjLmRpcn0mcXVvdDsgaWQ9JnF1b3Q7c3JjLmZpbGVzJnF1b3Q7Jmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyAgCisgICAgJmx0O3BhdGhjb252ZXJ0IHBhdGhzZXA9JnF1b3Q7LCZxdW90OyBwcm9wZXJ0eT0mcXVvdDtqYXZhZmlsZXMmcXVvdDsgcmVmaWQ9JnF1b3Q7c3JjLmZpbGVzJnF1b3Q7LyZndDsKKzwvcHJlPgorPHA+VGhpcyBleGFtcGxlIHRha2VzIHRoZSBzZXQgb2YgZmlsZXMgZGV0ZXJtaW5lZCBieSB0aGUgZmlsZXNldCAoYWxsIGZpbGVzIGVuZGluZworaW4gPHR0Pi5qYXZhPC90dD4pLCBqb2lucyB0aGVtIHRvZ2V0aGVyIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZCBwbGFjZXMgdGhlIHJlc3VsdGluZworbGlzdCBpbnRvIHRoZSBwcm9wZXJ0eSA8dHQ+amF2YWZpbGVzPC90dD4uICBUaGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpcyBub3Qgc3BlY2lmaWVkLCBzbworaXQgZGVmYXVsdHMgdG8gdGhlIGFwcHJvcHJpYXRlIGNoYXJhY3RlciBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBTdWNoIGEgbGlzdCBjb3VsZAordGhlbiBiZSB1c2VkIGluIGFub3RoZXIgdGFzaywgbGlrZSA8dHQ+amF2YWRvYzwvdHQ+LCB0aGF0IHJlcXVpcmVzIGEgY29tbWEgc2VwYXJhdGVkCitsaXN0IG9mIGZpbGVzLgorPC9wPgorPGg0PkV4YW1wbGUgNDwvaDQ+Cis8cHJlPgorICAgICZsdDtwYXRoY29udmVydCBwcm9wZXJ0eT0icHJvcCIgZGlyc2VwPSJ8IiZndDsKKyAgICAgICZsdDttYXAgZnJvbT0iJHtiYXNlZGlyfS9hYmMvIiB0bz0nJy8mZ3Q7CisgICAgICAmbHQ7cGF0aCBsb2NhdGlvbj0iYWJjL2RlZi9naGkiLyZndDsKKyAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OworPC9wcmU+CisgIDxwPgorICAgIFRoaXMgZXhhbXBsZSBzZXRzIHRoZSBwcm9wZXJ0eSAicHJvcCIgdG8gImRlZnxnaGkiIG9uCisgICAgV2luZG93cyBhbmQgb24gVW5peC4KKyAgPC9wPgorPC9ib2R5PgorPC9odG1sPgorCisgCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcHJlc2V0ZGVmLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcHJlc2V0ZGVmLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2YzU5NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9wcmVzZXRkZWYuaHRtbApAQCAtMCwwICsxLDE4NCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisgIAorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+PC9tZXRhPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UHJlU2V0RGVmIFRhc2s8L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICA8IS0tCisgICAgICAgICAgIC5jb2RlIHsgYmFja2dyb3VuZDogI0VGRUZFRjsgbWFyZ2luLXRvcDogfQorICAgICAgICAgICAtLT4KKyAgICA8L3N0eWxlPgorICA8L2hlYWQ+CisgIAorICA8Ym9keT4KKyAgICAKKyAgICA8aDI+PGEgbmFtZT0icHJlc2V0ZGVmIj5QcmVTZXREZWY8L2E+PC9oMj4KKyAgICA8aDM+RGVzY3JpcHRpb248L2gzPgorICAgIDxwPgorICAgICAgVGhlIHByZXNldCBkZWZpbml0aW9uIGdlbmVyYXRlcyBhIG5ldyBkZWZpbml0aW9uCisgICAgICBiYXNlZCBvbiBhIGN1cnJlbnQgZGVmaW5pdGlvbiB3aXRoIHNvbWUgYXR0cmlidXRlcworICAgICAgb3IgZWxlbWVudHMgcHJlc2V0LgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBUaGUgcmVzb2x1dGlvbiBvZiBwcm9wZXJ0aWVzIGluIGFueSBvZiB0aGUgYXR0cmlidXRlcyBvcgorICAgICAgbmVzdGVkIHRleHQgdGFrZXMgcGxhY2Ugd2l0aCB0aGUgZGVmaW5pdGlvbiBpcyB1c2VkIGFuZCA8ZW0+bm90PC9lbT4KKyAgICAgIHdoZW4gdGhlIHByZXNldCBkZWZpbml0aW9uIGlzIGRlZmluZWQuCisgICAgPC9wPgorICAgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIG5ldyBkZWZpbml0aW9uPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj51cmk8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgIFRoZSB1cmkgdGhhdCB0aGlzIGRlZmluaXRpb24gc2hvdWxkIGxpdmUgaW4uCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorICAgIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorICAgIDxoND5hbm90aGVyIHR5cGUgd2l0aCBhdHRyaWJ1dGVzIG9yIGVsZW1lbnRzIHNldDwvaDQ+CisgICAgPHA+VGhlIDxjb2RlPiZsdDtwcmVzZXRkZWYmZ3Q7PC9jb2RlPiB0YXNrIHRha2VzIG9uZSBuZXN0ZWQgZWxlbWVudCBhcyBhIHBhcmFtZXRlci4KKyAgICAgIFRoaXMgbmVzdGVkIGVsZW1lbnQgY2FuIGJlIGFueSBvdGhlciB0eXBlIG9yIHRhc2suIFRoZSBhdHRyaWJ1dGVzCisgICAgICBhbmQgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGJlIHByZXNldCBhcmUgcGxhY2VkIGhlcmUuCisgICAgPC9wPgorICAgIAorICAgIDxoMz5FeGFtcGxlczwvaDM+CisgICAgICBUaGUgZm9sbG93aW5nIGZyYWdtZW50IGRlZmluZXMgYSBqYXZhYyB0YXNrIHdpdGggdGhlIGRlYnVnLCBkZXByZWNhdGlvbgorICAgICAgc3JjZGlyIGFuZCBkZXN0ZGlyCisgICAgICBhdHRyaWJ1dGVzIHNldC4gSXQgYWxzbyBoYXMgYSBzcmMgZWxlbWVudCB0byBzb3VyY2UgZmlsZXMgZnJvbSBhIGdlbmVyYXRlZAorICAgICAgZGlyZWN0b3J5LgorICAgIDxibG9ja3F1b3RlPgorPHByZSBjbGFzcz0iY29kZSI+CismbHQ7cHJlc2V0ZGVmIG5hbWU9Im15LmphdmFjIiZndDsKKyAgICZsdDtqYXZhYyBkZWJ1Zz0iJHtkZWJ1Z30iIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKKyAgICAgICAgICBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiZndDsKKyAgICAgICZsdDtzcmMgcGF0aD0iJHtnZW4uZGlyfSIvJmd0OworICAgJmx0Oy9qYXZhYyZndDsKKyZsdDsvcHJlc2V0ZGVmJmd0OworPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgICAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhIG5vcm1hbCBqYXZhYyB0YXNrIC0gZXhhbXBsZToKKyAgICA8YmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O215LmphdmFjLyZndDsKKzwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICAgIFRoZSBhdHRyaWJ1dGVzIHNwZWNpZmllZCBpbiB0aGUgcHJlc2V0IHRhc2sgbWF5IGJlIG92ZXJyaWRkZW4gLSBpLmUuCisgICAgICB0aGV5IG1heSBiZSBzZWVuIGFzIG9wdGlvbmFsIGF0dHJpYnV0ZXMgLSBleGFtcGxlOgorICAgIDxibG9ja3F1b3RlPgorPHByZSBjbGFzcz0iY29kZSI+CismbHQ7bXkuamF2YWMgc3JjZGlyPSIke3Rlc3Quc3JjfSIgZGVwcmVjYXRpb249Im5vIi8mZ3Q7Cis8L3ByZT4KKyAgICA8L2Jsb2NrcXVvdGU+CisgICAgICBPbmUgbWF5IHB1dCBhIHByZXNldGRlZiBkZWZpbml0aW9uIGluIGFuIGFudGxpYi4KKyAgICAgIEZvciBleGFtcGxlIHN1cHBvc2UgdGhlIGphciBmaWxlIGFudGdvb2RpZXMuamFyIGhhcworICAgICAgdGhlIGFudGxpYi54bWwgYXMgZm9sbG93czoKKyAgICA8YmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O2FudGxpYiZndDsKKyAgICZsdDt0YXNrZGVmIHJlc291cmNlPSJjb20vYWNtZS9hbnRnb29kaWVzL3Rhc2tzLnByb3BlcnRpZXMiLyZndDsKKyAgICZsdDshLS0gSW1wbGVtZW50IHRoZSBjb21tb24gdXNlIG9mIHRoZSBqYXZhYyBjb21tYW5kIC0tJmd0OworICAgJmx0O3ByZXNldGRlZiBuYW1lPSJqYXZhYyImZ3Q7CisgICAgICAmbHQ7amF2YWMgZGVwcmVjYXRpb249IiR7ZGVwcmVjYXRpb259IiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgICAgc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImNsYXNzZXMiLyZndDsKKyAgICZsdDsvcHJlc2V0ZGVmJmd0OworJmx0Oy9hbnRsaWImZ3Q7Cis8L3ByZT4KKyAgICA8L2Jsb2NrcXVvdGU+CisgICAgICBPbmUgbWF5IHRoZW4gdXNlIHRoaXMgaW4gYSBidWlsZCBmaWxlIGFzIGZvbGxvd3M6CisgICAgPGJsb2NrcXVvdGU+Cis8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDtwcm9qZWN0IGRlZmF1bHQ9ImV4YW1wbGUiIHhtbG5zOmFudGdvb2RpZXM9ImFudGxpYjpjb20uYWNtZS5hbnRnb29kaWVzIiZndDsKKyAgICZsdDt0YXJnZXQgbmFtZT0iZXhhbXBsZSImZ3Q7CisgICAgICAmbHQ7IS0tIENvbXBpbGUgc291cmNlIC0tJmd0OworICAgICAgJmx0O2FudGdvb2RpZXM6amF2YWMgc3JjZGlyPSJzcmMvbWFpbiIvJmd0OworICAgICAgJmx0OyEtLSBDb21waWxlIHRlc3QgY29kZSAtLSZndDsKKyAgICAgICZsdDthbnRnb29kaWVzOmphdmFjIHNyY2Rpcj0ic3JjL3Rlc3QiLyZndDsKKyAgICZsdDsvdGFyZ2V0Jmd0OworJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGV2YWx1YXRpb24gb2YgcHJvcGVydGllcyB3aGVuIHRoZQorICAgICAgZGVmaW5pdGlvbiBpcyB1c2VkOgorICAgIDwvcD4KKyAgICAgPGJsb2NrcXVvdGU+Cis8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDt0YXJnZXQgbmFtZT0iZGVmaW5lYW5kY2FsbCImZ3Q7CisgICAmbHQ7cHJlc2V0ZGVmIG5hbWU9InNob3dtZXNzYWdlIiZndDsKKyAgICAgICZsdDtlY2hvJmd0O21lc3NhZ2UgaXMgJyR7bWVzc2FnZX0nJmx0Oy9lY2hvJmd0OworICAgJmx0Oy9wcmVzZXRkZWYmZ3Q7CisgICAmbHQ7c2hvd21lc3NhZ2UvJmd0OworICAgJmx0O3Byb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJNZXNzYWdlIDEiLyZndDsKKyAgICZsdDtzaG93bWVzc2FnZS8mZ3Q7CisgICAmbHQ7YW50Y2FsbCB0YXJnZXQ9ImNhbGxlZCImZ3Q7CisgICAgICAmbHQ7cGFyYW0gbmFtZT0ibWVzc2FnZSIgdmFsdWU9Ik1lc3NhZ2UgMiIvJmd0OworICAgJmx0Oy9hbnRjYWxsJmd0OworJmx0Oy90YXJnZXQmZ3Q7CismbHQ7dGFyZ2V0IG5hbWU9ImNhbGxlZCImZ3Q7CisgICAmbHQ7c2hvd21lc3NhZ2UvJmd0OworJmx0Oy90YXJnZXQmZ3Q7Cis8L3ByZT4KKyAgICAgPC9ibG9ja3F1b3RlPgorICAgICA8cD4KKyAgICAgICAgVGhlIGNvbW1hbmQgYW50IGRlZmluZWFuZGNhbGwgcmVzdWx0cyBpbiB0aGUgb3V0cHV0OgorICAgICA8L3A+CisgICAgIDxibG9ja3F1b3RlPgorPHByZSBjbGFzcz0iY29kZSI+CitkZWZpbmVhbmRjYWxsOgorW3Nob3dtZXNzYWdlXSBtZXNzYWdlIGlzICcke21lc3NhZ2V9JworW3Nob3dtZXNzYWdlXSBtZXNzYWdlIGlzICdNZXNzYWdlIDEnCisKK2NhbGxlZDoKK1tzaG93bWVzc2FnZV0gbWVzc2FnZSBpcyAnTWVzc2FnZSAyJworPC9wcmU+CisgICAgIDwvYmxvY2txdW90ZT4KKzxwPgorSXQgaXMgcG9zc2libGUgdG8gdXNlIGEgdHJpY2sgdG8gZXZhbHVhdGUgcHJvcGVydGllcyB3aGVuIHRoZSBkZWZpbml0aW9uIGlzCis8ZW0+bWFkZTwvZW0+IHJhdGhlciB0aGFuIHVzZWQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgZG8gbm90IGV4cGVjdCBzb21lCitwcm9wZXJ0aWVzIHRvIGJlIGF2YWlsYWJsZSBpbiBjaGlsZCBidWlsZHMgcnVuIHdpdGgKKzxjb2RlPiZsdDthbnQgLi4uIGluaGVyaXRhbGw9ImZhbHNlIiZndDs8L2NvZGU+OgorPC9wPgorPGJsb2NrcXVvdGU+PHByZSBjbGFzcz0iY29kZSI+CismbHQ7bWFjcm9kZWYgbmFtZT0ic2hvd21lc3NhZ2UtcHJlc2V0ZGVmIiZndDsKKyAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJtZXNzYWdldmFsIi8mZ3Q7CisgICZsdDtwcmVzZXRkZWYgbmFtZT0ic2hvd21lc3NhZ2UiJmd0OworICAgICZsdDtlY2hvJmd0O21lc3NhZ2UgaXMgJ0B7bWVzc2FnZXZhbH0nJmx0Oy9lY2hvJmd0OworICAmbHQ7L3ByZXNldGRlZiZndDsKKyZsdDsvbWFjcm9kZWYmZ3Q7CismbHQ7c2hvd21lc3NhZ2UtcHJlc2V0ZGVmIG1lc3NhZ2V2YWw9IiR7bWVzc2FnZX0iLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICA8aHI+PC9ocj4KKyAgICAKKyAgPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcHJvcGVydHkuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9wcm9wZXJ0eS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YjI1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcHJvcGVydHkuaHRtbApAQCAtMCwwICsxLDI3MiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Qcm9wZXJ0eSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJwcm9wZXJ0eSI+UHJvcGVydHk8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5TZXRzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwcm9wZXJ0aWVzIj5wcm9wZXJ0eTwvYT4KKyhieSBuYW1lIGFuZCB2YWx1ZSksIG9yIHNldCBvZiBwcm9wZXJ0aWVzIChmcm9tIGZpbGUgb3IKK3Jlc291cmNlKSBpbiB0aGUgcHJvamVjdC4gIFByb3BlcnRpZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLjwvcD4KKyBQcm9wZXJ0aWVzIGFyZSBpbW11dGFibGU6IHdob2V2ZXIgc2V0cyBhIHByb3BlcnR5IGZpcnN0IGZyZWV6ZXMgaXQgZm9yIHRoZQorIHJlc3Qgb2YgdGhlIGJ1aWxkOyB0aGV5IGFyZSBtb3N0IGRlZmluaXRlbHkgbm90IHZhcmlhYmxlcy4KKzxwPlRoZXJlIGFyZSBzaXggd2F5cyB0byBzZXQgcHJvcGVydGllczo8L3A+Cis8dWw+CisgIDxsaT5CeSBzdXBwbHlpbmcgYm90aCB0aGUgPGk+bmFtZTwvaT4gYW5kIDxpPnZhbHVlPC9pPiBhdHRyaWJ1dGUuPC9saT4KKyAgPGxpPkJ5IHN1cHBseWluZyBib3RoIHRoZSA8aT5uYW1lPC9pPiBhbmQgPGk+cmVmaWQ8L2k+IGF0dHJpYnV0ZS48L2xpPgorICA8bGk+Qnkgc2V0dGluZyB0aGUgPGk+ZmlsZTwvaT4gYXR0cmlidXRlIHdpdGggdGhlIGZpbGVuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgIGZpbGUgdG8gbG9hZC4gVGhpcyBwcm9wZXJ0eSBmaWxlIGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlIGZpbGUgdXNlZAorICAgIGluIHRoZSBjbGFzcyBqYXZhLnV0aWwuUHJvcGVydGllcywgd2l0aCB0aGUgc2FtZSBydWxlcyBhYm91dCBob3cKKyAgICBub24tSVNPODg1OS0xIGNoYXJhY3RlcnMgbXVzdCBiZSBlc2NhcGVkLjwvbGk+CisgIDxsaT5CeSBzZXR0aW5nIHRoZSA8aT51cmw8L2k+IGF0dHJpYnV0ZSB3aXRoIHRoZSB1cmwgZnJvbSB3aGljaCB0byBsb2FkIHRoZQorICAgIHByb3BlcnRpZXMuIFRoaXMgdXJsIG11c3QgYmUgZGlyZWN0ZWQgdG8gYSBmaWxlIHRoYXQgaGFzIHRoZSBmb3JtYXQgYXMgZGVmaW5lZAorICAgIGJ5IHRoZSBmaWxlIHVzZWQgaW4gdGhlIGNsYXNzIGphdmEudXRpbC5Qcm9wZXJ0aWVzLjwvbGk+CisgIDxsaT5CeSBzZXR0aW5nIHRoZSA8aT5yZXNvdXJjZTwvaT4gYXR0cmlidXRlIHdpdGggdGhlIHJlc291cmNlIG5hbWUgb2YgdGhlCisgICAgcHJvcGVydHkgZmlsZSB0byBsb2FkLiBBIHJlc291cmNlIGlzIGEgcHJvcGVydHkgZmlsZSBvbiB0aGUgY3VycmVudAorICAgIGNsYXNzcGF0aCwgb3Igb24gdGhlIHNwZWNpZmllZCBjbGFzc3BhdGguPC9saT4KKyAgPGxpPkJ5IHNldHRpbmcgdGhlIDxpPmVudmlyb25tZW50PC9pPiBhdHRyaWJ1dGUgd2l0aCBhIHByZWZpeCB0byB1c2UuCisgICAgUHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQgZm9yIGV2ZXJ5IGVudmlyb25tZW50IHZhcmlhYmxlIGJ5CisgICAgcHJlZml4aW5nIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBhIHBlcmlvZCB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuPC9saT4KKzwvdWw+Cis8cD5BbHRob3VnaCBjb21iaW5hdGlvbnMgb2YgdGhlc2Ugd2F5cyBhcmUgcG9zc2libGUsIG9ubHkgb25lIHNob3VsZCBiZSB1c2VkCithdCBhIHRpbWUuIFByb2JsZW1zIG1pZ2h0IG9jY3VyIHdpdGggdGhlIG9yZGVyIGluIHdoaWNoIHByb3BlcnRpZXMgYXJlIHNldCwgZm9yCitpbnN0YW5jZS48L3A+Cis8cD5UaGUgdmFsdWUgcGFydCBvZiB0aGUgcHJvcGVydGllcyBiZWluZyBzZXQsIG1pZ2h0IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlcgorcHJvcGVydGllcy4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgdGhlc2UgcHJvcGVydGllcyBhcmUgc2V0LgorVGhpcyBhbHNvIGhvbGRzIGZvciBwcm9wZXJ0aWVzIGxvYWRlZCBmcm9tIGEgcHJvcGVydHkgZmlsZS48L3A+Cis8cD5BIGxpc3Qgb2YgcHJlZGVmaW5lZCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3VuZCA8YQoraHJlZj0iLi4vdXNpbmcuaHRtbCNidWlsdC1pbi1wcm9wcyI+aGVyZTwvYT4uPC9wPgorPHA+U2luY2UgQW50IDEuNy4xIGl0IGlzIHBvc3NpYmxlIHRvIGxvYWQgcHJvcGVydGllcyBkZWZpbmVkIGluIHhtbAorYWNjb3JkaW5nIHRvIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3Byb3BlcnRpZXMuZHRkIj5TdW5zIERURDwvYT4sCitpZiBKYXZhNSsgaXMgcHJlc2VudC4gRm9yIHRoaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHJlc291cmNlIG9yIHVybCBoYXMgCit0byBlbmQgd2l0aCA8dHQ+LnhtbDwvdHQ+LjwvcD4KKworPGg0Pk9wZW5WTVMgVXNlcnM8L2g0PgorPHA+V2l0aCB0aGUgPGNvZGU+ZW52aXJvbm1lbnQ8L2NvZGU+IGF0dHJpYnV0ZSB0aGlzIHRhc2sgd2lsbCBsb2FkIGFsbCBkZWZpbmVkCitsb2dpY2FscyBvbiBhbiBPcGVuVk1TIHN5c3RlbS4gIExvZ2ljYWxzIHdpdGggbXVsdGlwbGUgZXF1aXZhbGVuY2UgbmFtZXMgZ2V0CittYXBwZWQgdG8gYSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGFsbCBlcXVpdmFsZW5jZQorbmFtZXMuICBJZiBhIGxvZ2ljYWwgaXMgZGVmaW5lZCBpbiBtdWx0aXBsZSB0YWJsZXMsIG9ubHkgdGhlIG1vc3QgbG9jYWwKK2RlZmluaXRpb24gaXMgYXZhaWxhYmxlICh0aGUgdGFibGUgcHJpb3JpdHkgb3JkZXIgYmVpbmcgUFJPQ0VTUywgSk9CLCBHUk9VUCwKK1NZU1RFTSkuCis8L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIzIj5PbmUgb2YgdGhlc2UsIHdoZW4gdXNpbmcgdGhlCisgICAgICAgbmFtZSBhdHRyaWJ1dGU8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhdGlvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBwcm9wZXJ0eSB0byB0aGUgYWJzb2x1dGUgZmlsZW5hbWUgb2YgdGhlCisgICAgICBnaXZlbiBmaWxlLiBJZiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgYW4gYWJzb2x1dGUgcGF0aCwgaXQKKyAgICAgIGlzIGxlZnQgdW5jaGFuZ2VkICh3aXRoIC8gYW5kIFwgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8gdGhlCisgICAgICBjdXJyZW50IHBsYXRmb3JtcyBjb252ZW50aW9ucykuIE90aGVyd2lzZSBpdCBpcyB0YWtlbiBhcyBhIHBhdGgKKyAgICAgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBhbmQgZXhwYW5kZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmaWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5SZWZlcmVuY2U8L2E+IHRvIGFuIG9iamVjdAorICAgICAgZGVmaW5lZCBlbHNld2hlcmUuIE9ubHkgeWllbGRzIHJlYXNvbmFibGUgcmVzdWx0cyBmb3IgcmVmZXJlbmNlcworICAgICAgdG8gPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRIIGxpa2Ugc3RydWN0dXJlczwvYT4gb3IgcHJvcGVydGllcy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvdXJjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCByZXNvdXJjZSBjb250YWluaW5nCisgICAgICBwcm9wZXJ0aWVzIHNldHRpbmdzIGluIHByb3BlcnRpZXMgZmlsZSBmb3JtYXQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjQiPk9uZSBvZiB0aGVzZSwgd2hlbgorICAgICAgPGI+bm90PC9iPiB1c2luZyB0aGUgbmFtZSBhdHRyaWJ1dGU8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvcGVydGllcyBmaWxlIHRvIGxvYWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXJsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmEgdXJsIGNvbnRhaW5pbmcgcHJvcGVydGllcy1mb3JtYXQgc2V0dGluZ3MuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW52aXJvbm1lbnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHByZWZpeCB0byB1c2Ugd2hlbiByZXRyaWV2aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGh1cworICAgIGlmIHlvdSBzcGVjaWZ5IGVudmlyb25tZW50PSZxdW90O215ZW52JnF1b3Q7IHlvdSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIE9TLXNwZWNpZmljCisgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIHZpYSBwcm9wZXJ0eSBuYW1lcyAmcXVvdDtteWVudi5QQVRIJnF1b3Q7IG9yCisgICAgJnF1b3Q7bXllbnYuVEVSTSZxdW90Oy4gTm90ZSB0aGF0IGlmIHlvdSBzdXBwbHkgYSBwcm9wZXJ0eSBuYW1lIHdpdGggYSBmaW5hbAorICAgICZxdW90Oy4mcXVvdDsgaXQgd2lsbCBub3QgYmUgZG91YmxlZDsgaS5lLiBlbnZpcm9ubWVudD0mcXVvdDtteWVudi4mcXVvdDsgd2lsbCBzdGlsbAorICAgIGFsbG93IGFjY2VzcyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhyb3VnaCAmcXVvdDtteWVudi5QQVRIJnF1b3Q7IGFuZAorICAgICZxdW90O215ZW52LlRFUk0mcXVvdDsuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZAorICAgIG9uIDxhIGhyZWY9IiNub3Rlcy1lbnYiPnNlbGVjdCBwbGF0Zm9ybXM8L2E+LiBGZWVsIGZyZWUgdG8gc2VuZCBwYXRjaGVzIHRvIGluY3JlYXNlIHRoZQorICAgIG51bWJlciBvZiBwbGF0Zm9ybXMgb24gd2hpY2ggdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHN1cHBvcnRlZCA7KS48YnI+CisgICAgTm90ZSBhbHNvIHRoYXQgcHJvcGVydGllcyBhcmUgY2FzZS1zZW5zaXRpdmUsIGV2ZW4gaWYgdGhlCisgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBhcmUgbm90OyBlLmcuIFdpbmRvd3MgMjAwMCdzCisgICAgc3lzdGVtIHBhdGggdmFyaWFibGUgaXMgc2V0IHRvIGFuIEFudCBwcm9wZXJ0eSBuYW1lZCAiZW52LlBhdGgiCisgICAgcmF0aGVyIHRoYW4gImVudi5QQVRIIi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2UuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLAorICAgICAgZ2l2ZW4gYXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiBkZWZpbmVkCisgICAgICBlbHNld2hlcmUuLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByZWZpeDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5QcmVmaXggdG8gYXBwbHkgdG8gcHJvcGVydGllcyBsb2FkZWQgdXNpbmcgPGNvZGU+ZmlsZTwvY29kZT4sCisgICAgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LCBvciA8Y29kZT51cmw8L2NvZGU+LgorICAgICAgQSAiLiIgaXMgYXBwZW5kZWQgdG8gdGhlIHByZWZpeCBpZiBub3Qgc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8aDQ+Y2xhc3NwYXRoPC9oND4KKzxwPjxjb2RlPlByb3BlcnR5PC9jb2RlPidzIDxpPmNsYXNzcGF0aDwvaT4gYXR0cmlidXRlIGlzIGEgPGEKK2hyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4gYW5kIGNhbiBhbHNvIGJlIHNldCB2aWEgYSBuZXN0ZWQKKzxpPmNsYXNzcGF0aDwvaT4gZWxlbWVudC48L3A+Cis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4gICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2Zvby5kaXN0JnF1b3Q7IHZhbHVlPSZxdW90O2Rpc3QmcXVvdDsvJmd0OzwvcHJlPgorPHA+c2V0cyB0aGUgcHJvcGVydHkgPGNvZGU+Zm9vLmRpc3Q8L2NvZGU+IHRvIHRoZSB2YWx1ZSAmcXVvdDtkaXN0JnF1b3Q7LjwvcD4KKzxwcmU+ICAmbHQ7cHJvcGVydHkgZmlsZT0mcXVvdDtmb28ucHJvcGVydGllcyZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD5yZWFkcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gYSBmaWxlIGNhbGxlZCAmcXVvdDtmb28ucHJvcGVydGllcyZxdW90Oy48L3A+Cis8cHJlPiAgJmx0O3Byb3BlcnR5IHVybD0mcXVvdDtodHRwOi8vd3d3Lm15c2l0ZS5jb20vYmxhL3Byb3BzL2Zvby5wcm9wZXJ0aWVzJnF1b3Q7LyZndDs8L3ByZT4KKzxwPnJlYWRzIGEgc2V0IG9mIHByb3BlcnRpZXMgZnJvbSB0aGUgYWRkcmVzcyAmcXVvdDtodHRwOi8vd3d3Lm15c2l0ZS5jb20vYmxhL3Byb3BzL2Zvby5wcm9wZXJ0aWVzJnF1b3Q7LjwvcD4KKzxwcmU+ICAmbHQ7cHJvcGVydHkgcmVzb3VyY2U9JnF1b3Q7Zm9vLnByb3BlcnRpZXMmcXVvdDsvJmd0OzwvcHJlPgorPHA+cmVhZHMgYSBzZXQgb2YgcHJvcGVydGllcyBmcm9tIGEgcmVzb3VyY2UgY2FsbGVkICZxdW90O2Zvby5wcm9wZXJ0aWVzJnF1b3Q7LjwvcD4KKzxwPk5vdGUgdGhhdCB5b3UgY2FuIHJlZmVyZW5jZSBhIGdsb2JhbCBwcm9wZXJ0aWVzIGZpbGUgZm9yIGFsbCBvZiB5b3VyIEFudAorYnVpbGRzIHVzaW5nIHRoZSBmb2xsb3dpbmc6PC9wPgorPHByZT4gICZsdDtwcm9wZXJ0eSBmaWxlPSZxdW90OyR7dXNlci5ob21lfS8uYW50LWdsb2JhbC5wcm9wZXJ0aWVzJnF1b3Q7LyZndDs8L3ByZT4KKzxwPnNpbmNlIHRoZSAmcXVvdDt1c2VyLmhvbWUmcXVvdDsgcHJvcGVydHkgaXMgZGVmaW5lZCBieSB0aGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmUKK3RvIGJlIHlvdXIgaG9tZSBkaXJlY3RvcnkuICBXaGVyZSB0aGUgJnF1b3Q7dXNlci5ob21lJnF1b3Q7IHByb3BlcnR5IHJlc29sdmVzIHRvIGluCit0aGUgZmlsZSBzeXN0ZW0gZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB2ZXJzaW9uIGFuZCB0aGUgSlZNIGltcGxlbWVudGF0aW9uLgorT24gVW5peCBiYXNlZCBzeXN0ZW1zLCB0aGlzIHdpbGwgbWFwIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuIE9uIG1vZGVybiBXaW5kb3dzCit2YXJpYW50cywgdGhpcyB3aWxsIG1vc3QgbGlrZWx5IHJlc29sdmUgdG8gdGhlIHVzZXIncyBkaXJlY3RvcnkgaW4gdGhlICZxdW90O0RvY3VtZW50cworYW5kIFNldHRpbmdzJnF1b3Q7IGZvbGRlci4gT2xkZXIgd2luZG93cyB2YXJpYW50cyBzdWNoIGFzIFdpbmRvd3MgOTgvTUUgYXJlIGxlc3MKK3ByZWRpY3RhYmxlLCBhcyBhcmUgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbS9KVk0gY29tYmluYXRpb25zLjwvcD4KKworPHByZT4KKyAgJmx0O3Byb3BlcnR5IGVudmlyb25tZW50PSZxdW90O2VudiZxdW90Oy8mZ3Q7CisgICZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7TnVtYmVyIG9mIFByb2Nlc3NvcnMgPSAke2Vudi5OVU1CRVJfT0ZfUFJPQ0VTU09SU30mcXVvdDsvJmd0OworICAmbHQ7ZWNobyBtZXNzYWdlPSZxdW90O0FOVF9IT01FIGlzIHNldCB0byA9ICR7ZW52LkFOVF9IT01FfSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzxwPnJlYWRzIHRoZSBzeXN0ZW0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzdG9yZXMgdGhlbSBpbiBwcm9wZXJ0aWVzLCBwcmVmaXhlZCB3aXRoICZxdW90O2VudiZxdW90Oy4KK05vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgb24gPGVtPnNlbGVjdDwvZW0+IG9wZXJhdGluZyBzeXN0ZW1zLgorVHdvIG9mIHRoZSB2YWx1ZXMgYXJlIHNob3duIGJlaW5nIGVjaG9lZC4KKzwvcD4KKworPGgzPlByb3BlcnR5IEZpbGVzPC9oMz4KKworQXMgc3RhdGVkLCB0aGlzIHRhc2sgd2lsbCBsb2FkIGluIGEgcHJvcGVydGllcyBmaWxlIHN0b3JlZCBpbiB0aGUgZmlsZQorc3lzdGVtLCBvciBhcyBhIHJlc291cmNlIG9uIGEgY2xhc3NwYXRoLiBIZXJlIGFyZSBzb21lIGludGVyZXN0aW5nIGZhY3RzCithYm91dCB0aGlzIGZlYXR1cmUKKzxvbD4KKzxsaT5JZiB0aGUgZmlsZSBpcyBub3QgdGhlcmUsIG5vdGhpbmcgaXMgcHJpbnRlZCBleGNlcHQgYXQgLXZlcmJvc2UgbG9nCitsZXZlbC4gVGhpcyBsZXRzIHlvdSBoYXZlIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGV2ZXJ5Citwcm9qZWN0LCB0aGF0IHRlYW0gbWVtYmVycyBjYW4gY3VzdG9taXplLgorPGxpPlRoZSBydWxlcyBmb3IgdGhpcyBmb3JtYXQgYXJlIGxhaWQgZG93bgorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0aWVzLmh0bWwjbG9hZChqYXZhLmlvLklucHV0U3RyZWFtKSI+YnkgU3VuPC9hPi4KK1RoaXMgbWFrZXMgaXQgaGFyZCBmb3IgVGVhbSBBbnQgdG8gZmllbGQgYnVnIHJlcG9ydHMgYWJvdXQgaXQuCis8bGk+VHJhaWxpbmcgc3BhY2VzIGFyZSBub3Qgc3RyaXBwZWQuIEl0IG1heSBoYXZlIGJlZW4gd2hhdCB5b3Ugd2FudGVkLgorPGxpPldhbnQgdW51c3VhbCBjaGFyYWN0ZXJzPyBFc2NhcGUgdGhlbSBcdTA0NTYgb3IgXCIgc3R5bGUuCis8bGk+QW50IFByb3BlcnRpZXMgYXJlIGV4cGFuZGVkIGluIHRoZSBmaWxlLgorPC9vbD4KK0luLWZpbGUgcHJvcGVydHkgZXhwYW5zaW9uIGlzIHZlcnkgY29vbC4gTGVhcm4gdG8gdXNlIGl0LgorPHA+CitFeGFtcGxlOgorPHByZT4KK2J1aWxkLmNvbXBpbGVyPWppa2VzCitkZXBsb3kuc2VydmVyPWx1Y2t5CitkZXBsb3kucG9ydD04MDgwCitkZXBsb3kudXJsPWh0dHA6Ly8ke2RlcGxveS5zZXJ2ZXJ9OiR7ZGVwbG95LnBvcnR9LworPC9wcmU+CisKKworPGEgbmFtZT0ibm90ZXMtZW52Ij48L2E+Cis8aDM+Tm90ZXMgYWJvdXQgZW52aXJvbm1lbnQgdmFyaWFibGVzPC9oMz4KKzxwPgorICBBbnQgcnVucyBvbiBKYXZhIDEuMiB0aGVyZWZvcmUgaXQgY2FudCB1c2UgSmF2YTUgZmVhdHVyZXMgZm9yIGFjY2Vzc2luZyBlbnZpcm9ubWVudAorICB2YXJpYWJsZXMuIFNvIGl0IHN0YXJ0cyBhIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2VzcyB3aGljaCBwcmludHMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcywKKyAgYW5hbHl6ZXMgdGhlIG91dHB1dCBhbmQgY3JlYXRlcyB0aGUgcHJvcGVydGllcy4gPGJyPgorICBUaGVyZSBhcmUgY29tbWFuZHMgZm9yIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW5nIHN5c3RlbXMgaW1wbGVtZW50ZWQgaW4KKyAgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9hbnQvY29yZS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlLmphdmE/dmlldz1tYXJrdXAiPgorICBFeGVjdXRlLmphdmE8L2E+IChtZXRob2QgPHR0PmdldFByb2NFbnZDb21tYW5kKCk8L3R0Pik6CisgIDx0YWJsZT4KKyAgICA8dHI+CisgICAgICA8dGg+T1M8L3RoPgorICAgICAgPHRoPmNvbW1hbmQ8L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPiBvcy8yIDwvdGQ+CisgICAgICA8dGQ+IGNtZCAvYyBzZXQgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCBjb2xzcGFuPSIyIj4gd2luZG93cyA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPiAqIHdpbjl4IDwvdGQ+CisgICAgICA8dGQ+IGNvbW1hbmQuY29tIC9jIHNldCA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPiAqIG90aGVyIDwvdGQ+CisgICAgICA8dGQ+IGNtZCAvYyBzZXQgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD4gei9vcyA8L3RkPgorICAgICAgPHRkPiAvYmluL2VudiA8Yj5PUjwvYj4gL3Vzci9iaW4vZW52IDxiPk9SPC9iPiBlbnYgICA8aT4oZGVwZW5kaW5nIG9uIHJlYWQgcmlnaHRzKTwvaT4gPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD4gdW5peCA8L3RkPgorICAgICAgPHRkPiAvYmluL2VudiA8Yj5PUjwvYj4gL3Vzci9iaW4vZW52IDxiPk9SPC9iPiBlbnYgICA8aT4oZGVwZW5kaW5nIG9uIHJlYWQgcmlnaHRzKTwvaT4gPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD4gbmV0d2FyZSA8L3RkPgorICAgICAgPHRkPiBlbnYgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD4gb3MvNDAwIDwvdGQ+CisgICAgICA8dGQ+IGVudiA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPiBvcGVudm1zIDwvdGQ+CisgICAgICA8dGQ+IHNob3cgbG9naWNhbCA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+Cis8L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9yZWNvcmRlci5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3JlY29yZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiZWRlMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9yZWNvcmRlci5odG1sCkBAIC0wLDAgKzEsMTcyIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlJlY29yZGVyIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImxvZyI+UmVjb3JkPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+QSByZWNvcmRlciBpcyBhIGxpc3RlbmVyIHRvIHRoZSBjdXJyZW50IGJ1aWxkIHByb2Nlc3MgdGhhdCByZWNvcmRzIHRoZQorb3V0cHV0IHRvIGEgZmlsZS48L3A+CisKKzxwPlNldmVyYWwgcmVjb3JkZXJzIGNhbiBleGlzdCBhdCB0aGUgc2FtZSB0aW1lLiAgRWFjaCByZWNvcmRlciBpcworYXNzb2NpYXRlZCB3aXRoIGEgZmlsZS4gIFRoZSBmaWxlbmFtZSBpcyB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yCit0aGUgcmVjb3JkZXJzLiAgVGhlIGZpcnN0IGNhbGwgdG8gdGhlIHJlY29yZGVyIHRhc2sgd2l0aCBhbiB1bnVzZWQgZmlsZW5hbWUKK3dpbGwgY3JlYXRlIGEgcmVjb3JkZXIgKHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkKSBhbmQgYWRkIGl0IHRvIHRoZQorbGlzdGVuZXJzIG9mIHRoZSBidWlsZC4gIEFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSByZWNvcmRlciB0YXNrIHVzaW5nCit0aGlzIGZpbGVuYW1lIHdpbGwgbW9kaWZ5IHRoYXQgcmVjb3JkZXJzIHN0YXRlIChyZWNvcmRpbmcgb3Igbm90KSBvciBvdGhlcgorcHJvcGVydGllcyAobGlrZSBsb2dnaW5nIGxldmVsKS48L3A+CisKKzxwPlNvbWUgdGVjaG5pY2FsIGlzc3VlczogdGhlIGZpbGUncyBwcmludCBzdHJlYW0gaXMgZmx1c2hlZCBmb3IgJnF1b3Q7ZmluaXNoZWQmcXVvdDsKK2V2ZW50cyAoYnVpbGRGaW5pc2hlZCwgdGFyZ2V0RmluaXNoZWQgYW5kIHRhc2tGaW5pc2hlZCksIGFuZCBpcyBjbG9zZWQgb24KK2EgYnVpbGRGaW5pc2hlZCBldmVudC48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhpcyBsb2dnZXIgaXMgYXNzb2NpYXRlZCB3aXRoLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIj55ZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hY3Rpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyB0ZWxscyB0aGUgbG9nZ2VyIHdoYXQgdG8gZG86IHNob3VsZCBpdCBzdGFydAorICAgIHJlY29yZGluZyBvciBzdG9wPyAgVGhlIGZpcnN0IHRpbWUgdGhhdCB0aGUgcmVjb3JkZXIgdGFzayBpcyBjYWxsZWQgZm9yCisgICAgdGhpcyBsb2dmaWxlLCBhbmQgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoZSBkZWZhdWx0CisgICAgZm9yIHRoaXMgYXR0cmlidXRlIGlzICZxdW90O3N0YXJ0JnF1b3Q7LiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHByb3ZpZGVkIG9uCisgICAgc3Vic2VxdWVudCBjYWxscywgdGhlbiB0aGUgc3RhdGUgcmVtYWlucyBhcyBwcmV2aW91cy4KKyAgICBbVmFsdWVzID0ge3N0YXJ0fHN0b3B9LCBEZWZhdWx0ID0gbm8gc3RhdGUgY2hhbmdlXTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TaG91bGQgdGhlIHJlY29yZGVyIGFwcGVuZCB0byBhIGZpbGUsIG9yIGNyZWF0ZSBhIG5ldworICAgIG9uZT8gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgdGhlIGZpcnN0IHRpbWUgdGhpcyB0YXNrIGlzIGNhbGxlZCBmb3IKKyAgICB0aGlzIGZpbGUuICBbVmFsdWVzID0ge3llc3xub30sIERlZmF1bHQ9bm9dPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW1hY3Ntb2RlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlJlbW92ZXMgPGNvZGU+W3Rhc2tdPC9jb2RlPiBiYW5uZXJzIGxpa2UgQW50J3MKKyAgICA8Y29kZT4tZW1hY3M8L2NvZGU+IGNvbW1hbmQgbGluZSBzd2l0Y2ggaWYgc2V0IHRvCisgICAgPGVtPnRydWU8L2VtPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+bm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2dsZXZlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BdCB3aGF0IGxvZ2dpbmcgbGV2ZWwgc2hvdWxkIHRoaXMgcmVjb3JkZXIgaW5zdGFuY2UKKyAgICByZWNvcmQgdG8/ICBUaGlzIGlzIG5vdCBhIG9uY2Ugb25seSBwYXJhbWV0ZXIgKGxpa2UgPGNvZGU+YXBwZW5kPC9jb2RlPgorICAgIGlzKSAtLSB5b3UgY2FuIGluY3JlYXNlIG9yIGRlY3JlYXNlIHRoZSBsb2dnaW5nIGxldmVsIGFzIHRoZSBidWlsZCBwcm9jZXNzCisgICAgY29udGludWVzLiAgW1ZhbHVlcz0ge2Vycm9yfHdhcm58aW5mb3x2ZXJib3NlfGRlYnVnfSwgRGVmYXVsdCA9IG5vIGNoYW5nZV0KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+bm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwPlRoZSBmb2xsb3dpbmcgYnVpbGQueG1sIHNuaXBwZXQgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSByZWNvcmRlcgordG8gcmVjb3JkIGp1c3QgdGhlIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IHRhc2s6PC9wPgorPHByZT4KKyAgICAuLi4KKyAgICAmbHQ7Y29tcGlsZSAmZ3Q7CisgICAgICAgICZsdDtyZWNvcmQgbmFtZT0mcXVvdDtsb2cudHh0JnF1b3Q7IGFjdGlvbj0mcXVvdDtzdGFydCZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDtqYXZhYyAuLi4KKyAgICAgICAgJmx0O3JlY29yZCBuYW1lPSZxdW90O2xvZy50eHQmcXVvdDsgYWN0aW9uPSZxdW90O3N0b3AmcXVvdDsvJmd0OworICAgICZsdDtjb21waWxlLyZndDsKKyAgICAuLi4KKzwvcHJlPgorCis8cD5UaGUgZm9sbG93aW5nIHR3byBjYWxscyB0byA8Y29kZT4mbHQ7cmVjb3JkJmd0OzwvY29kZT4gc2V0IHVwIHR3bworcmVjb3JkZXJzOiBvbmUgdG8gZmlsZSAmcXVvdDtyZWNvcmRzLXNpbXBsZS5sb2cmcXVvdDsgYXQgbG9nZ2luZyBsZXZlbCA8Y29kZT5pbmZvPC9jb2RlPgorKHRoZSBkZWZhdWx0KSBhbmQgb25lIHRvIGZpbGUgJnF1b3Q7SVNPLmxvZyZxdW90OyB1c2luZyBsb2dnaW5nIGxldmVsIG9mCis8Y29kZT52ZXJib3NlPC9jb2RlPi48L3A+Cis8cHJlPgorICAgIC4uLgorICAgICZsdDtyZWNvcmQgbmFtZT0mcXVvdDtyZWNvcmRzLXNpbXBsZS5sb2cmcXVvdDsvJmd0OworICAgICZsdDtyZWNvcmQgbmFtZT0mcXVvdDtJU08ubG9nJnF1b3Q7IGxvZ2xldmVsPSZxdW90O3ZlcmJvc2UmcXVvdDsvJmd0OworICAgIC4uLgorPC9wcmU+CisKKzxoMz5Ob3RlczwvaDM+Cis8cD5UaGVyZSBpcyBzb21lIGZ1bmN0aW9uYWxpdHkgdGhhdCBJIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byBhZGQgaW4gdGhlCitmdXR1cmUuICBUaGV5IGluY2x1ZGUgdGhpbmdzIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5saXN0ZW5lcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIGNsYXNzbmFtZSBvZiBhIGJ1aWxkIGxpc3RlbmVyIHRvIHVzZSBmcm9tIHRoaXMgcG9pbnQKKyAgICBvbiBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGxpc3RlbmVyLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGV0YXJnZXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgcm93c3Bhbj0yPkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0cyB0byBhdXRvbWF0aWNhbGx5CisgICAgcmVjb3JkLiAgSWYgdGhpcyB2YWx1ZSBpcyAmcXVvdDthbGwmcXVvdDssIHRoZW4gYWxsIHRhcmdldHMgYXJlIHJlY29yZGVkLgorICAgIFtEZWZhdWx0ID0gYWxsXTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGV0YXJnZXQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRldGFzazwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiByb3dzcGFuPTI+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXNrIHRvIGF1dG9tYXRpY2FsbHkKKyAgICByZWNvcmQgb3Igbm90LiAgVGhpcyBjb3VsZCBiZSBkaWZmaWN1bHQgYXMgaXQgY291bGQgY29uZmxpY3Qgd2l0aCB0aGUKKyAgICA8Y29kZT5pbmNsdWRldGFyZ2V0L2V4Y2x1ZGV0YXJnZXQ8L2NvZGU+LiAgKGUuZy46CisgICAgPGNvZGU+aW5jbHVkZXRhcmdldD0mcXVvdDtjb21waWxlJnF1b3Q7IGV4bGN1ZGV0YXNrPSZxdW90O2phdmFjJnF1b3Q7PC9jb2RlPiwgd2hhdCBzaG91bGQKKyAgICBoYXBwZW4/KTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGV0YXNrPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YWN0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFkZCBncmVhdGVyIGZsZXhpYmlsaXR5IHRvIHRoZSBhY3Rpb24gYXR0cmlidXRlLiAgVGhpbmdzCisgICAgbGlrZSA8Y29kZT5jbG9zZTwvY29kZT4gdG8gY2xvc2UgdGhlIHByaW50IHN0cmVhbS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9yZW5hbWUuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9yZW5hbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzBmYmUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3JlbmFtZS5odG1sCkBAIC0wLDAgKzEsNjQgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UmVuYW1lIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InJlbmFtZSI+UmVuYW1lPC9hPjwvaDI+Cis8aDM+PGk+RGVwcmVjYXRlZDwvaT48L2gzPgorPHA+PGk+VGhpcyB0YXNrIGhhcyBiZWVuIGRlcHJlY2F0ZWQuICBVc2UgdGhlIE1vdmUgdGFzayBpbnN0ZWFkLjwvaT48L3A+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+UmVuYW1lcyBhIGdpdmVuIGZpbGUuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGUgdG8gcmVuYW1lLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5ldyBuYW1lIG9mIHRoZSBmaWxlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXBsYWNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkVuYWJsZSByZXBsYWNpbmcgb2YgZXhpc3RpbmcgZmlsZSAoZGVmYXVsdDogb24pLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7cmVuYW1lIHNyYz0mcXVvdDtmb28uamFyJnF1b3Q7IGRlc3Q9JnF1b3Q7JHtuYW1lfS0ke3ZlcnNpb259LmphciZxdW90Oy8mZ3Q7PC9wcmU+IAorPHA+UmVuYW1lcyB0aGUgZmlsZSA8Y29kZT5mb28uamFyPC9jb2RlPiB0byA8Y29kZT4ke25hbWV9LSR7dmVyc2lvbn0uamFyPC9jb2RlPiAoYXNzdW1pbmcgPGNvZGU+bmFtZTwvY29kZT4KKyBhbmQgPGNvZGU+dmVyc2lvbjwvY29kZT4gYmVpbmcgcHJlZGVmaW5lZCBwcm9wZXJ0aWVzKS4gSWYgYSBmaWxlIG5hbWVkIDxjb2RlPiR7bmFtZX0tJHt2ZXJzaW9ufS5qYXI8L2NvZGU+CisgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmVtb3ZlZCBwcmlvciB0byByZW5hbWluZyA8Y29kZT5mb28uamFyPC9jb2RlPi48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcmVwbGFjZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3JlcGxhY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDA4MjNlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3JlcGxhY2UuaHRtbApAQCAtMCwwICsxLDIwNSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5SZXBsYWNlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InJlcGxhY2UiPlJlcGxhY2U8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5SZXBsYWNlIGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2sgZm9yIHJlcGxhY2luZyB0aGUgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nIAoraW4gc2VsZWN0ZWQgZmlsZS48L3A+Cis8cD5JZiB5b3Ugd2FudCB0byByZXBsYWNlIGEgdGV4dCB0aGF0IGNyb3NzZXMgbGluZSBib3VuZGFyaWVzLCB5b3UKK211c3QgdXNlIGEgbmVzdGVkIDxjb2RlPiZsdDtyZXBsYWNldG9rZW4mZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KKworPHA+VGhlIG91dHB1dCBmaWxlIGlzIG9ubHkgd3JpdHRlbiBpZiBpdCBkaWZmZXJzIGZyb20gdGhlIGV4aXN0aW5nCitmaWxlLiAgVGhpcyBwcmV2ZW50cyBzcHVyaW91cyByZWJ1aWxkcyBiYXNlZCBvbiB1bmNoYW5nZWQgZmlsZXMgd2hpY2gKK2hhdmUgYmVlbiByZWdlbmVyYXRlZCBieSB0aGlzIHRhc2suPC9wPiAKKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlIGZvciB3aGljaCB0aGUgdG9rZW4gc2hvdWxkIGJlIHJlcGxhY2VkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZSB0d28uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSB0byB1c2Ugd2hlbiByZXBsYWNpbmcgYSB0b2tlbiBpbiAKKyAgICAgIG11bHRpcGxlIGZpbGVzLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZXMgdXBvbiB3aGljaCByZXBsYWNlIG9wZXJhdGVzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gZW5jb2Rpbmc8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50b2tlbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgdG9rZW4gd2hpY2ggbXVzdCBiZSByZXBsYWNlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICA8Y29kZT5yZXBsYWNldG9rZW48L2NvZGU+IGVsZW1lbnQgb3IgdGhlIHJlcGxhY2VmaWx0ZXJmaWxlCisgICAgYXR0cmlidXRlIGlzIHVzZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHRva2VuLiBXaGVuIG9taXR0ZWQsIGFuIGVtcHR5IHN0cmluZworICAgICAgKCZxdW90OyZxdW90OykgaXMgdXNlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdW1tYXJ5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIGEgc3VtbWFyeSBvZiB0aGUgcmVwbGFjZSBvcGVyYXRpb24gCisgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgcHJvZHVjZWQsIGRldGFpbGluZyBob3cgbWFueSB0b2tlbiBvY2N1cnJlbmNlcyAKKyAgICAgICAgICAgICAgICAgICAgIGFuZCBmaWxlcyB3ZXJlIHByb2Nlc3NlZAorICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBieSBkZWZhdWx0IG5vIHN1bW1hcnkgaXMgcHJvZHVjZWQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eUZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsaWQgcHJvcGVydHkgZmlsZSBmcm9tIHdoaWNoIHByb3BlcnRpZXMgc3BlY2lmaWVkIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7cmVwbGFjZWZpbHRlciZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBkcmF3bi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzIG9ubHkgaWYgPGk+cHJvcGVydHk8L2k+IGF0dHJpYnV0ZSBvZiA8Y29kZT4mbHQ7cmVwbGFjZWZpbHRlciZndDs8L2NvZGU+IGlzIHVzZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVwbGFjZWZpbHRlcmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsaWQgcHJvcGVydHkgZmlsZS4gIEVhY2ggcHJvcGVydHkgd2lsbCBiZQorICAgIHRyZWF0ZWQgYXMgYSByZXBsYWNlZmlsdGVyIHdoZXJlIDxjb2RlPnRva2VuPC9jb2RlPiBpcyB0aGUgbmFtZSBvZgorICAgIHRoZSBwcm9wZXJ0eSBhbmQgPGNvZGU+dmFsdWU8L2NvZGU+IGlzIHRoZSBwcm9wZXJ0aWVzIHZhbHVlLgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90CisgICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4gICZsdDtyZXBsYWNlIGZpbGU9JnF1b3Q7JHtzcmN9L2luZGV4Lmh0bWwmcXVvdDsgdG9rZW49JnF1b3Q7QEBAJnF1b3Q7IHZhbHVlPSZxdW90O3dvbWJhdCZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD5yZXBsYWNlcyBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nICZxdW90O0BAQCZxdW90OyB3aXRoIHRoZSBzdHJpbmcKKyZxdW90O3dvbWJhdCZxdW90OywgaW4gdGhlIGZpbGUgPGNvZGU+JHtzcmN9L2luZGV4Lmh0bWw8L2NvZGU+LjwvcD4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPHA+VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZAorc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBhcyB3ZWxsIGFzIHRoZQorbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gYW5kCis8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPklmIGVpdGhlciB0aGUgdGV4dCB5b3Ugd2FudCB0byByZXBsYWNlIG9yIHRoZSByZXBsYWNlbWVudCB0ZXh0Citjcm9zcyBsaW5lIGJvdW5kYXJpZXMsIHlvdSBjYW4gdXNlIG5lc3RlZCBlbGVtZW50cyB0byBzcGVjaWZ5Cit0aGVtLjwvcD4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3JlcGxhY2UgZGlyPSZxdW90OyR7c3JjfSZxdW90OyB2YWx1ZT0mcXVvdDt3b21iYXQmcXVvdDsmZ3Q7CisgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5odG1sJnF1b3Q7LyZndDsKKyAgJmx0O3JlcGxhY2V0b2tlbiZndDsmbHQ7IVtDREFUQVttdWx0aSBsaW5lCit0b2tlbl1dJmd0OyZsdDsvcmVwbGFjZXRva2VuJmd0OworJmx0Oy9yZXBsYWNlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+cmVwbGFjZXMgb2NjdXJyZW5jZXMgb2YgdGhlIHN0cmluZyAmcXVvdDttdWx0aQorbGluZTxpPlxuPC9pPnRva2VuJnF1b3Q7IHdpdGggdGhlIHN0cmluZyAmcXVvdDt3b21iYXQmcXVvdDssIGluIGFsbAorSFRNTCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPiR7c3JjfTwvY29kZT4uV2hlcmUgPGk+XG48L2k+IGlzCit0aGUgcGxhdGZvcm0gc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IuPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtyZXBsYWNlIGZpbGU9JnF1b3Q7JHtzcmN9L2luZGV4Lmh0bWwmcXVvdDsmZ3Q7CisgICZsdDtyZXBsYWNldG9rZW4mZ3Q7Jmx0OyFbQ0RBVEFbdHdvIGxpbmUKK3Rva2VuXV0mZ3Q7Jmx0Oy9yZXBsYWNldG9rZW4mZ3Q7CisgICZsdDtyZXBsYWNldmFsdWUmZ3Q7Jmx0OyFbQ0RBVEFbdHdvIGxpbmUKK3Rva2VuXV0mZ3Q7Jmx0Oy9yZXBsYWNldmFsdWUmZ3Q7CismbHQ7L3JlcGxhY2UmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8aDQ+cmVwbGFjZWZpbHRlcjwvaDQ+Cis8cD5JbiBhZGRpdGlvbiB0byBhbGxvd2luZyBmb3IgbXVsdGlwbGUgcmVwbGFjZW1lbnRzLCBvcHRpb25hbCBuZXN0ZWQgPGNvZGU+Jmx0O3JlcGxhY2VmaWx0ZXImZ3Q7PC9jb2RlPiBlbGVtZW50cyBhbGxvdyByZXBsYWNlbWVudCB2YWx1ZXMgdG8gYmUgZXh0cmFjdGVkIGZyb20gYSBwcm9wZXJ0eSBmaWxlLiBUaGUgbmFtZSBvZiB0aGlzIGZpbGUgaXMgc3BlY2lmaWVkIHVzaW5nIHRoZSA8Y29kZT4mbHQ7cmVwbGFjZSZndDs8L2NvZGU+IGF0dHJpYnV0ZSA8aT5wcm9wZXJ0eUZpbGU8L2k+LgorPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9rZW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmVwbGFjZW1lbnQgc3RyaW5nLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkVpdGhlciBtYXkgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguIEJvdGggY2FuIGJlIG9taXR0ZWQsIGlmIGRlc2lyZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiB0aGUgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgdG8gc2VydmUgYXMgdGhlIHJlcGxhY2VtZW50IHZhbHVlLjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+SWYgbmVpdGhlciA8aT52YWx1ZTwvaT4gbm9yIDxpPnByb3BlcnR5PC9pPiBpcyB1c2VkLCB0aGUgdmFsdWUgcHJvdmlkZWQgdXNpbmcgdGhlIDxjb2RlPiZsdDtyZXBsYWNlJmd0OzwvY29kZT4gYXR0cmlidXRlIDxpPnZhbHVlPC9pPiBhbmQvb3IgdGhlIDxjb2RlPiZsdDtyZXBsYWNldmFsdWUmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQuIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgdXNpbmcgZWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMsIHRoZSB0b2tlbiBpcyByZXBsYWNlZCB3aXRoIGFuIGVtcHR5IHN0cmluZy4KKzwvcD4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3JlcGxhY2UgCisgICAgZmlsZT0mcXVvdDtjb25maWd1cmUuc2gmcXVvdDsKKyAgICB2YWx1ZT0mcXVvdDtkZWZhdWx0dmFsdWUmcXVvdDsKKyAgICBwcm9wZXJ0eUZpbGU9JnF1b3Q7c291cmNlL25hbWUucHJvcGVydGllcyZxdW90OyZndDsKKyAgJmx0O3JlcGxhY2VmaWx0ZXIgCisgICAgdG9rZW49JnF1b3Q7QHRva2VuMUAmcXVvdDsvJmd0OworICAmbHQ7cmVwbGFjZWZpbHRlciAKKyAgICB0b2tlbj0mcXVvdDtAdG9rZW4yQCZxdW90OyAKKyAgICB2YWx1ZT0mcXVvdDt2YWx1ZTImcXVvdDsvJmd0OworICAmbHQ7cmVwbGFjZWZpbHRlciAKKyAgICB0b2tlbj0mcXVvdDtAdG9rZW4zQCZxdW90OyAKKyAgICBwcm9wZXJ0eT0mcXVvdDtwcm9wZXJ0eS5rZXkmcXVvdDsvJmd0OworJmx0Oy9yZXBsYWNlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+SW4gZmlsZSA8Y29kZT5jb25maWd1cmUuc2g8L2NvZGU+LCByZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgJnF1b3Q7QHRva2VuMUAmcXVvdDsgd2l0aCAmcXVvdDtkZWZhdWx0dmFsdWUmcXVvdDssIGFsbCBpbnN0YW5jZXMgb2YgJnF1b3Q7QHRva2VuMkAmcXVvdDsgd2l0aCAmcXVvdDt2YWx1ZTImcXVvdDssIGFuZCBhbGwgaW5zdGFuY2VzIG9mICZxdW90O0B0b2tlbjNAJnF1b3Q7IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAmcXVvdDtwcm9wZXJ0eS5rZXkmcXVvdDssIGFzIGl0IGFwcGVhcnMgaW4gcHJvcGVydHkgZmlsZSA8Y29kZT5zcmMvbmFtZS5wcm9wZXJ0aWVzPC9jb2RlPi48L3A+Cis8cD48Yj5Ob3RlOjwvYj4gSXQgaXMgcG9zc2libGUgdG8gdXNlIGVpdGhlciB0aGUgPGk+dG9rZW48L2k+Lzxjb2RlPiZsdDtyZXBsYWNldG9rZW4mZ3Q7PC9jb2RlPiBhbmQgPGk+dmFsdWU8L2k+Lzxjb2RlPiZsdDtyZXBsYWNldmFsdWUmZ3Q7PC9jb2RlPiBhdHRyaWJ1dGVzL2VsZW1lbnRzLCB0aGUgbmVzdGVkIHJlcGxhY2VmaWx0ZXIgZWxlbWVudHMsIG9yIGJvdGggaW4gdGhlIHNhbWUgb3BlcmF0aW9uLgorPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3Jlc291cmNlY291bnQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9yZXNvdXJjZWNvdW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzBmYjU3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9yZXNvdXJjZWNvdW50Lmh0bWwKQEAgLTAsMCArMSw4MiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5SZXNvdXJjZUNvdW50IFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPlJlc291cmNlQ291bnQ8L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkRpc3BsYXkgb3Igc2V0IGEgcHJvcGVydHkgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBhIG5lc3RlZAorICAgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+LgorICAgQ2FuIGFsc28gYmUgdXNlZCBhcyBhIGNvbmRpdGlvbi4gPGI+U2luY2UgQW50IDEuNzwvYj48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJvcGVydHkgdG8gc2V0LiBJZiBvbWl0dGVkIHRoZSByZXN1bHRzIGFyZSB3cml0dGVuCisgICAgICB0byB0aGUgbG9nLiBJZ25vcmVkIHdoZW4gcHJvY2Vzc2luZyBhcyBhIGNvbmRpdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZWZpZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPgorICAgICAgdG8gYSBSZXNvdXJjZSBDb2xsZWN0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4KKyAgICAgIFllcywgdW5sZXNzIGEgbmVzdGVkIFJlc291cmNlIENvbGxlY3Rpb24gaXMgc3VwcGxpZWQKKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb3VudDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db21wYXJpc29uIGNvdW50IGZvciBwcm9jZXNzaW5nIGFzIGEgY29uZGl0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIGluIGNvbmRpdGlvbiBtb2RlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db21wYXJpc29uIHR5cGU6ICJlcXVhbCIsICJlcSIsICJncmVhdGVyIiwgImd0IiwgImxlc3MiLAorICAgICAgImx0IiwgImdlIiAoZ3JlYXRlciBvciBlcXVhbCksICJuZSIgKG5vdCBlcXVhbCksICJsZSIgKGxlc3Mgb3IgZXF1YWwpCisgICAgICBmb3IgdXNlIHdoZW4gb3BlcmF0aW5nIGFzIGEgY29uZGl0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyAiZXF1YWwiPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5SZXNvdXJjZSBDb2xsZWN0aW9uPC9oND4KKzxwPkEgc2luZ2xlCisgIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZSBDb2xsZWN0aW9uPC9hPgorc2hvdWxkIGJlIHNwZWNpZmllZCB2aWEgYSBuZXN0ZWQgZWxlbWVudCBvciB0aGUgPGNvZGU+cmVmaWQ8L2NvZGU+IGF0dHJpYnV0ZS4KKzwvcD4KKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiZsdDtyZXNvdXJjZWNvdW50IHByb3BlcnR5PSZxdW90O2NvdW50LmZvbyZxdW90OyZndDsKKyAgJmx0O2ZpbGVsaXN0IGRpcj0mcXVvdDsuJnF1b3Q7IGZpbGVzPSZxdW90O2ZvbyxiYXImcXVvdDsgLyZndDsKKyZsdDsvcmVzb3VyY2Vjb3VudCZndDsKKzwvcHJlPgorPHA+U3RvcmVzIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGluIHRoZSBzcGVjaWZpZWQgZmlsZWxpc3QgKHR3bykKK2luIHRoZSBwcm9wZXJ0eSBuYW1lZCA8aT5jb3VudC5mb288L2k+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcmV0cnkuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9yZXRyeS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDgyOWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvcmV0cnkuaHRtbApAQCAtMCwwICsxLDU1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlJldHJ5IFRhc2s8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDI+UmV0cnk8L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlJldHJ5IGlzIGEgY29udGFpbmVyIHdoaWNoIGV4ZWN1dGVzIGEgc2luZ2xlIG5lc3RlZCB0YXNrIHVudGlsIGVpdGhlcjogdGhlcmUgaXMgbm8gZmFpbHVyZTsgb3I6CitpdHMgPGVtPnJldHJ5Y291bnQ8L2VtPiBoYXMgYmVlbiBleGNlZWRlZC4gSWYgdGhpcyBoYXBwZW5zIGEgQnVpbGRFeGNlcHRpb24gaXMgdGhyb3duLgorPGVtPlNpbmNlIEFudCAxLjcuMTwvZW0+PC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJldHJ5Y291bnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bnVtYmVyIG9mIHRpbWVzIHRvIGF0dGVtcHQgdG8gZXhlY3V0ZSB0aGUgbmVzdGVkIHRhc2s8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD5BbnkgdmFsaWQgQW50IHRhc2sgbWF5IGJlIGVtYmVkZGVkIHdpdGhpbiB0aGUgcmV0cnkgdGFzay48L3A+CisKKzxoMz5FeGFtcGxlPC9oMz4KKzxwcmU+CismbHQ7cmV0cnkgcmV0cnljb3VudD0iMyImZ3Q7CisgICZsdDtnZXQgc3JjPSJodHRwOi8vd3d3LnVucmVsaWFibGUtc2VydmVyLmNvbS91bnJlbGlhYmxlLnRhci5neiIgCisgICAgICAgZGVzdD0iL2hvbWUvcmV0cnkvdW5yZWxpYWJsZS50YXIuZ3oiIC8mZ3Q7CismbHQ7L3JldHJ5Jmd0OworPC9wcmU+Cis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSA8Y29kZT4mbHQ7cmV0cnkmZ3Q7PC9jb2RlPiB0byB3cmFwIGEgdGFzayB3aGljaCBtdXN0IGludGVyYWN0IHdpdGggYW4gdW5yZWxpYWJsZSBuZXR3b3JrIHJlc291cmNlLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9ybWljLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvcm1pYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmRhMzUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvcm1pYy5odG1sCkBAIC0wLDAgKzEsMjcyIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlJtaWMgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0icm1pYyI+Um1pYzwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlJ1bnMgdGhlIHJtaWMgY29tcGlsZXIgZm9yIGEgY2VydGFpbiBjbGFzcy48L3A+Cis8cD5SbWljIGNhbiBiZSBydW4gb24gYSBzaW5nbGUgY2xhc3MgKGFzIHNwZWNpZmllZCB3aXRoIHRoZSBjbGFzc25hbWUKK2F0dHJpYnV0ZSkgb3IgYSBudW1iZXIgb2YgY2xhc3NlcyBhdCBvbmNlIChhbGwgY2xhc3NlcyBiZWxvdyBiYXNlIHRoYXQKK2FyZSBuZWl0aGVyIF9TdHViIG5vciBfU2tlbCBjbGFzc2VzKS4gIElmIHlvdSB3YW50IHRvIHJtaWMgYSBzaW5nbGUKK2NsYXNzIGFuZCB0aGlzIGNsYXNzIGlzIGEgY2xhc3MgbmVzdGVkIGludG8gYW5vdGhlciBjbGFzcywgeW91IGhhdmUgdG8KK3NwZWNpZnkgdGhlIGNsYXNzbmFtZSBpbiB0aGUgZm9ybSA8Y29kZT5PdXRlciQkSW5uZXI8L2NvZGU+IGluc3RlYWQgb2YKKzxjb2RlPk91dGVyLklubmVyPC9jb2RlPi48L3A+Cis8cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBybWljZWQuIFRoaXMgY2FuIGJlCitkb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+CithdHRyaWJ1dGVzLiBXaXRoIHRoZSA8aT5pbmNsdWRlczwvaT4gb3IgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCitoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Cit0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCitmaW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKK3dhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiA8YQoraHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCitpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLjwvcD4KKzxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiBhbmQKK3N1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4KKyg8Y29kZT5kaXI8L2NvZGU+IGJlY29tZXMgPGNvZGU+YmFzZTwvY29kZT4pIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAorPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKKzxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBjb21waWxlcnMuIFRoaXMgY2FuIGJlIHNlbGVjdGVkCit3aXRoIHRoZSAmcXVvdDtidWlsZC5ybWljJnF1b3Q7IHByb3BlcnR5IG9yIHRoZSA8Y29kZT5jb21waWxlcjwvY29kZT4KK2F0dHJpYnV0ZS4KKzxhIG5hbWU9ImNvbXBpbGVydmFsdWVzIj5IZXJlIGFyZSB0aGUgY2hvaWNlczwvYT46PC9wPgorPHVsPgorICA8bGk+ZGVmYXVsdCAtdGhlIGRlZmF1bHQgY29tcGlsZXIgKGthZmZlIG9yIHN1bikgZm9yIHRoZSBwbGF0Zm9ybS4KKyAgPGxpPnN1biAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIHRoZSBKREspPC9saT4KKyAgPGxpPmthZmZlICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5rYWZmZS5vcmciIHRhcmdldD0iX3RvcCI+S2FmZmU8L2E+KTwvbGk+CisgIDxsaT53ZWJsb2dpYzwvbGk+CisgIDxsaT5mb3JraW5nIC0gdGhlIHN1biBjb21waWxlciBmb3JrZWQgaW50byBhIHNlcGFyYXRlIHByb2Nlc3MgKHNpbmNlIEFudCAxLjcpPC9saT4KKyAgPGxpPnhuZXcgLSB0aGUgc3VuIGNvbXBpbGVyIGZvcmtlZCBpbnRvIGEgc2VwYXJhdGUgcHJvY2VzcywKKyAgICAgIHdpdGggdGhlIC1YbmV3IG9wdGlvbiAoc2luY2UgQW50IDEuNykuCisgICAgICBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byB1c2UgLVhuZXc8L2xpPgorICAgIDxsaT4gIiIgKGVtcHR5IHN0cmluZykuIFRoaXMgaGFzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBub3Qgc2V0dGluZyB0aGUgY29tcGlsZXIgYXR0cmlidXRlLgorICAgIEZpcnN0IHRoZSB2YWx1ZSBvZiA8dHQ+YnVpbGQucm1pYzwvdHQ+IGlzIHVzZWQgaWYgZGVmaW5lZCwgYW5kIGlmIG5vdCwgdGhlIGRlZmF1bHQKKyAgICBmb3IgdGhlIHBsYXRmb3JtIGlzIGNob3Nlbi4gSWYgYnVpbGQucm1pYyBpcyBzZXQgdG8gdGhpcywgeW91IGdldCB0aGUgZGVmYXVsdC4KKworPC91bD4KKworPHA+VGhlIDxhIGhyZWY9Imh0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS8iPm1pbmlSTUk8L2E+Citwcm9qZWN0IGNvbnRhaW5zIGEgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgdGFzayBhcyB3ZWxsLAorcGxlYXNlIGNvbnN1bHQgbWluaVJNSSdzIGRvY3VtZW50YXRpb24gdG8gbGVhcm4gaG93IHRvIHVzZSBpdC48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21waWxlZCBmaWxlcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzcyBmb3Igd2hpY2ggdG8gcnVuIDxjb2RlPnJtaWM8L2NvZGU+LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbHRlcmluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhY2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2ViYXNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlBhc3MgdGhlICZxdW90Oy1rZWVwZ2VuZXJhdGVkJnF1b3Q7IGZsYWcgdG8gcm1pYyBhbmQKKyBtb3ZlIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGUgdG8gdGhlIGdpdmVuIHNvdXJjZWJhc2UgZGlyZWN0b3J5LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN0dWJ2ZXJzaW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgdGhlIEpESyB2ZXJzaW9uIGZvciB0aGUgZ2VuZXJhdGVkIHN0dWIgY29kZS4KKyBTcGVjaWZ5ICZxdW90OzEuMSZxdW90OyB0byBwYXNzIHRoZSAmcXVvdDstdjEuMSZxdW90OyBvcHRpb24gdG8gcm1pYywKKyAiMS4yIiBmb3IgLXYxMiwgY29tcGF0IGZvciAtdmNvbXBhdC4gPGJyPgorICAgICAgICBTaW5jZSBBbnQxLjcsIGlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHZlcnNpb24sIGFuZCBkbyBub3QgYXNrCisgICAgICAgIGZvciBpaW9wIG9yIGlkbCBmaWxlcywgImNvbXBhdCIgaXMgc2VsZWN0ZWQuCisgCisgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0PSJjb21wYXQiPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlIGR1cmluZyBjb21waWxhdGlvbjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSBkdXJpbmcgY29tcGlsYXRpb24sIGdpdmVuIGFzIDxhCisgICAgICBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90CisgICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyaWZ5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNoZWNrIHRoYXQgY2xhc3NlcyBpbXBsZW1lbnQgUmVtb3RlIGJlZm9yZSBoYW5kaW5nIHRoZW0gCisgICAgICAgIHRvIHJtaWMgKGRlZmF1bHQgaXMgZmFsc2UpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWlvcDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgdGhhdCBwb3J0YWJsZSAoUk1JL0lJT1ApIHN0dWJzIHNob3VsZCBiZSBnZW5lcmF0ZWQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5paW9wb3B0czwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgSUlPUCBjbGFzcyBnZW5lcmF0aW9uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWRsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB0aGF0IElETCBvdXRwdXQgZmlsZXMgc2hvdWxkIGJlIGdlbmVyYXRlZDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlkbG9wdHM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIElETCBmaWxlIGdlbmVyYXRpb248L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1ZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5nZW5lcmF0ZSBkZWJ1ZyBpbmZvIChwYXNzZXMgLWcgdG8gcm1pYykuIERlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVBbnRSdW50aW1lPC90ZD4gCisgICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRvIGluY2x1ZGUgdGhlIEFudCBydW4tdGltZSBsaWJyYXJpZXM7CisgICAgICBkZWZhdWx0cyB0byA8Y29kZT55ZXM8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVKYXZhUnVudGltZTwvdGQ+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciB0byBpbmNsdWRlIHRoZSBkZWZhdWx0IHJ1bi10aW1lCisgICAgICBsaWJyYXJpZXMgZnJvbSB0aGUgZXhlY3V0aW5nIFZNOyBkZWZhdWx0cyB0byA8Y29kZT5ubzwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXh0ZGlyczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhdGlvbiBvZiBpbnN0YWxsZWQgZXh0ZW5zaW9ucy48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLgorICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIHZhbHVlIG9mIHRoZQorICAgICAgPGNvZGU+YnVpbGQucm1pYzwvY29kZT4gcHJvcGVydHksIGlmIHNldCwgd2lsbCBiZSB1c2VkLgorICAgICAgT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgVk0gd2lsbCBiZSB1c2VkLgorICAgICAgKFNlZSB0aGUgYWJvdmUgPGEgaHJlZj0iI2NvbXBpbGVydmFsdWVzIj5saXN0PC9hPiBvZiB2YWxpZAorICAgICAgY29tcGlsZXJzLik8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0PmNsYXNzcGF0aCBhbmQgZXh0ZGlyczwvaDQ+Cis8cD48Y29kZT5SbWljPC9jb2RlPidzIDxpPmNsYXNzcGF0aDwvaT4gYW5kIDxpPmV4dGRpcnM8L2k+IGF0dHJpYnV0ZXMgYXJlIDxhCitocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZSBzdHJ1Y3R1cmU8L2E+IGFuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIGEgbmVzdGVkCis8aT5jbGFzc3BhdGg8L2k+IGFuZCA8aT5leHRkaXJzPC9pPiBlbGVtZW50cy48L3A+CisKKzxoND5jb21waWxlcmFyZzwvaDQ+CisKKzxwPllvdSBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjb21waWxlcgord2l0aCBuZXN0ZWQgPGNvZGU+Jmx0O2NvbXBpbGVyYXJnJmd0OzwvY29kZT4gZWxlbWVudHMuICBUaGVzZSBlbGVtZW50cworYXJlIHNwZWNpZmllZCBsaWtlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUKK0FyZ3VtZW50czwvYT4gYnV0IGhhdmUgYW4gYWRkaXRpb25hbCBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCB0bworZW5hYmxlIGFyZ3VtZW50cyBvbmx5IGlmIGEgZ2l2ZW4gY29tcGlsZXIgaW1wbGVtZW50YXRpb24gd2lsbCBiZQordXNlZC48L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iNCI+U2VlCisgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjQiPkV4YWN0bHkgb25lIG9mIHRoZXNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxpbmU8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0aDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXBpbGVyPC90ZD4KKyAgICA8dGQ+T25seSBwYXNzIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQgaWYgdGhlIGNob3NlbgorICAgICAgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICBMZWdhbCB2YWx1ZXMgYXJlIHRoZQorICAgICAgc2FtZSBhcyB0aG9zZSBpbiB0aGUgYWJvdmUgPGEgaHJlZj0iI2NvbXBpbGVydmFsdWVzIj5saXN0PC9hPiBvZiB2YWxpZAorICAgICAgY29tcGlsZXJzLik8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4gICZsdDtybWljIGNsYXNzbmFtZT0mcXVvdDtjb20ueHl6LkZvb0JhciZxdW90OyBiYXNlPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsvJmd0OzwvcHJlPgorPHA+cnVucyB0aGUgcm1pYyBjb21waWxlciBmb3IgdGhlIGNsYXNzIDxjb2RlPmNvbS54eXouRm9vQmFyPC9jb2RlPi4gVGhlCitjb21waWxlZCBmaWxlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+LjwvcD4KKzxwcmU+ICAmbHQ7cm1pYyBiYXNlPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovUmVtb3RlKi5jbGFzcyZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD5ydW5zIHRoZSBybWljIGNvbXBpbGVyIGZvciBhbGwgY2xhc3NlcyB3aXRoIDxjb2RlPi5jbGFzczwvY29kZT4KK2ZpbGVzIGJlbG93IDxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+IHdob3NlIGNsYXNzbmFtZSBzdGFydHMgd2l0aAorPGk+UmVtb3RlPC9pPi4gVGhlIGNvbXBpbGVkIGZpbGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBkaXJlY3RvcnkKKzxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+LjwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3NlcXVlbnRpYWwuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9zZXF1ZW50aWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2NTNmZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9zZXF1ZW50aWFsLmh0bWwKQEAgLTAsMCArMSw1NSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5TZXF1ZW50aWFsIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPlNlcXVlbnRpYWw8L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlNlcXVlbnRpYWwgaXMgYSBjb250YWluZXIgdGFzayAtIGl0IGNhbiBjb250YWluIG90aGVyIEFudCB0YXNrcy4gVGhlIG5lc3RlZCAKK3Rhc2tzIGFyZSBzaW1wbHkgZXhlY3V0ZWQgaW4gc2VxdWVuY2UuIFNlcXVlbnRpYWwncyBwcmltYXJ5IHVzZSBpcyB0byBzdXBwb3J0IAordGhlIHNlcXVlbnRpYWwgZXhlY3V0aW9uIG9mIGEgc3Vic2V0IG9mIHRhc2tzIHdpdGhpbiB0aGUgCis8YSBocmVmPSJwYXJhbGxlbC5odG1sIj5wYXJhbGxlbDwvYT4gdGFzazwvcD4KKworPHA+VGhlIHNlcXVlbnRpYWwgdGFzayBoYXMgbm8gYXR0cmlidXRlcyBhbmQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbmVzdGVkIAorZWxlbWVudHMgYXBhcnQgZnJvbSBBbnQgdGFza3MuIEFueSB2YWxpZCBBbnQgdGFzayBtYXkgYmUgZW1iZWRkZWQgd2l0aGluIHRoZSAKK3NlcXVlbnRpYWwgdGFzay48L3A+CisKKzxoMz5FeGFtcGxlPC9oMz4KKzxwcmU+CismbHQ7cGFyYWxsZWwmZ3Q7CisgICZsdDt3bHJ1biAuLi4gJmd0OworICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAmbHQ7c2xlZXAgc2Vjb25kcz0mcXVvdDszMCZxdW90Oy8mZ3Q7CisgICAgJmx0O2p1bml0IC4uLiAmZ3Q7CisgICAgJmx0O3dsc3RvcC8mZ3Q7CisgICZsdDsvc2VxdWVudGlhbCZndDsKKyZsdDsvcGFyYWxsZWwmZ3Q7Cis8L3ByZT4KKzxwPlRoaXMgZXhhbXBsZSBzaG93cyBob3cgdGhlIHNlcXVlbnRpYWwgdGFzayBpcyB1c2VkIHRvIGV4ZWN1dGUgdGhyZWUgdGFza3MgaW4KK3NlcXVlbmNlLCB3aGlsZSBhbm90aGVyIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIDwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9zaWduamFyLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvc2lnbmphci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMDlkNmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvc2lnbmphci5odG1sCkBAIC0wLDAgKzEsMjM1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlNpZ25KYXIgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ic2lnbmphciI+U2lnbkphcjwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlNpZ25zIEpBUiBmaWxlcyB3aXRoIHRoZSA8dHQ+amFyc2lnbmVyPC90dD4gY29tbWFuZCBsaW5lIHRvb2wuIAorSXQgd2lsbCB0YWtlIGEgbmFtZWQgZmlsZSBpbiB0aGUgPHR0PmphcjwvdHQ+IGF0dHJpYnV0ZSwgYW5kIGFuIG9wdGlvbmFsCis8dHQ+ZGVzdERpcjwvdHQ+IG9yIDx0dD5zaWduZWRKYXI8L3R0PiBhdHRyaWJ1dGUuIE5lc3RlZCBwYXRocyBhcmUgYWxzbworc3VwcG9ydGVkOyBoZXJlIG9ubHkgYW4gKG9wdGlvbmFsKSA8dHQ+ZGVzdERpcjwvdHQ+IGlzIGFsbG93ZWQuIElmIGEgZGVzdGluYXRpb24KK2RpcmVjdG9yeSBvciBleHBsaWNpdCBKQVIgZmlsZSBuYW1lIGlzIG5vdCBwcm92aWRlZCwgSkFScyBhcmUgc2lnbmVkIGluIHBsYWNlLgorPC9wPgorPHA+CitEZXBlbmRlbmN5IHJ1bGVzCis8L3A+Cis8dWw+Cis8bGk+Tm9uZXhpc3RlbnQgZGVzdGluYXRpb24gSkFScyBhcmUgY3JlYXRlZC9zaWduZWQ8L2xpPgorPGxpPk91dCBvZiBkYXRlIGRlc3RpbmF0aW9uIEpBUnMgYXJlIGNyZWF0ZWQvc2lnbmVkPC9saT4KKzxsaT5JZiBhIGRlc3RpbmF0aW9uIGZpbGUgYW5kIGEgc291cmNlIGZpbGUgYXJlIHRoZSBzYW1lLAorYW5kIDx0dD5sYXp5PC90dD4gaXMgdHJ1ZSwgdGhlIEpBUiBpcyBvbmx5IHNpZ25lZCBpZiBpdCBkb2VzIG5vdCAKK2NvbnRhaW4gYSBzaWduYXR1cmUgYnkgdGhpcyBhbGlhcy48L2xpPgorPGxpPklmIGEgZGVzdGluYXRpb24gZmlsZSBhbmQgYSBzb3VyY2UgZmlsZSBhcmUgdGhlIHNhbWUsCithbmQgPHR0Pmxhenk8L3R0PiBpcyBmYWxzZSwgdGhlIEpBUiBpcyBzaWduZWQuPC9saT4gCis8L3VsPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5qYXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGphciBmaWxlIHRvIHNpZ248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgbmVzdGVkIHBhdGhzIGhhdmUKKyAgICAgIGJlZW4gdXNlZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hbGlhczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYWxpYXMgdG8gc2lnbiB1bmRlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3RvcmVwYXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkIGZvciBrZXlzdG9yZSBpbnRlZ3JpdHkuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5rZXlzdG9yZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5rZXlzdG9yZSBsb2NhdGlvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN0b3JldHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5rZXlzdG9yZSB0eXBlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5cGFzczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkgKGlmIGRpZmZlcmVudCk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zaWdmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWUgb2YgLlNGLy5EU0EgZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNpZ25lZGphcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIHNpZ25lZCBKQVIgZmlsZS4gVGhpcyBjYW4gb25seSBiZSBzZXQgd2hlbiAKKyAgICB0aGUgPHR0PmphcjwvdHQ+IGF0dHJpYnV0ZSBpcyBzZXQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+KHRydWUgfCBmYWxzZSkgdmVyYm9zZSBvdXRwdXQgd2hlbiBzaWduaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGZhbHNlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW50ZXJuYWxzZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4odHJ1ZSB8IGZhbHNlKSBpbmNsdWRlIHRoZSAuU0YgZmlsZSBpbnNpZGUgdGhlIHNpZ25hdHVyZQorYmxvY2s8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHQgZmFsc2U8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZWN0aW9uc29ubHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+KHRydWUgfCBmYWxzZSkgZG9uJ3QgY29tcHV0ZSBoYXNoIG9mIGVudGlyZSBtYW5pZmVzdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBmYWxzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxhenk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhZyB0byBjb250cm9sIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIGEgc2lnbmF0dXJlCisgIGZpbGUgbWVhbnMgYSBKQVIgaXMgc2lnbmVkLiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSB0YXJnZXQgSkFSIG1hdGNoZXMKKyAgdGhlIHNvdXJjZSBKQVI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHQgZmFsc2U8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIG1lbW9yeSB0aGUgamFyc2lnbmVyIFZNIHdpbGwgdXNlLiBTcGVjaWZpZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICBzdHlsZSBvZiBzdGFuZGFyZCBqYXZhIG1lbW9yeSBzcGVjcyAoZS5nLiAxMjhtID0gMTI4IE1CeXRlcyk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZWxhc3Rtb2RpZmllZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5HaXZlIHRoZSBzaWduZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZAorICAgICAgdGltZSBhcyB0aGUgb3JpZ2luYWwgamFyIGZpbGVzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBmYWxzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50c2F1cmw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VVJMIGZvciBhIHRpbWVzdGFtcCBhdXRob3JpdHkgZm9yIHRpbWVzdGFtcGVkCisgICAgSkFSIGZpbGVzIGluIEphdmExLjUrPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHNhY2VydDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hbGlhcyBpbiB0aGUga2V5c3RvcmUgZm9yIGEgdGltZXN0YW1wIGF1dGhvcml0eSBmb3IgCisgICAgdGltZXN0YW1wZWQgSkFSIGZpbGVzIGluIEphdmExLjUrPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgCis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0aCBvZiBKQVIgZmlsZXMgdG8gc2lnbi4gPGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVzZXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXNldCBvZiBKQVIgZmlsZXMgdG8gc2lnbi4gPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWFwcGVyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgbWFwcGVyIHRvIHJlbmFtZSBqYXIgZmlsZXMgZHVyaW5nIHNpZ25pbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGFuZCBvbmx5IG9uZSBjYW4gYmUgc3VwcGxpZWQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zeXNwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5KVk0gc3lzdGVtIHByb3BlcnRpZXMsIHdpdGggdGhlIHN5bnRheCBvZiBBbnQKKyAgICA8YSBocmVmPSJleGVjLmh0bWwjZW52Ij5lbnZpcm9ubWVudCB2YXJpYWJsZXM8L2E+IDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgYW5kIG9ubHkgb25lIGNhbiBiZSBzdXBwbGllZDwvdGQ+CisgIDwvdHI+CisgPC90YWJsZT4KKworCis8aDM+RXhhbXBsZXM8L2gzPgorICA8YmxvY2txdW90ZT48cHJlPgorJmx0O3NpZ25qYXIgamFyPSZxdW90OyR7ZGlzdH0vbGliL2FudC5qYXImcXVvdDsKK2FsaWFzPSZxdW90O2FwYWNoZS1ncm91cCZxdW90OyBzdG9yZXBhc3M9JnF1b3Q7c2VjcmV0JnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPgorICBzaWducyB0aGUgYW50LmphciB3aXRoIGFsaWFzICZxdW90O2FwYWNoZS1ncm91cCZxdW90OyBhY2Nlc3NpbmcgdGhlCisgIGtleXN0b3JlIGFuZCBwcml2YXRlIGtleSB2aWEgJnF1b3Q7c2VjcmV0JnF1b3Q7IHBhc3N3b3JkLgorPC9wPgorICA8YmxvY2txdW90ZT48cHJlPgorJmx0O3NpZ25qYXIgZGVzdERpcj0ic2lnbmVkIgorICAgIGFsaWFzPSJ0ZXN0b25seSIga2V5c3RvcmU9InRlc3RrZXlzdG9yZSIKKyAgICBzdG9yZXBhc3M9ImFwYWNoZWFudCIKKyAgICBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSImZ3Q7CisgICZsdDtwYXRoJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iZGlzdCIgaW5jbHVkZXM9IioqLyouamFyIiAvJmd0OworICAmbHQ7L3BhdGgmZ3Q7CisgICZsdDtmbGF0dGVubWFwcGVyIC8mZ3Q7CismbHQ7L3NpZ25qYXImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD4KK1NpZ24gYWxsIEpBUiBmaWxlcyBtYXRjaGluZyB0aGUgZGlzdC8qKi8qLmphciBwYXR0ZXJuLCBjb3B5aW5nIHRoZW0gdG8gdGhlCitkaXJlY3RvcnkgInNpZ25lZCIgYWZ0ZXJ3YXJkcy4gVGhlIGZsYXR0ZW4gbWFwcGVyIG1lYW5zIHRoYXQgdGhleSB3aWxsCithbGwgYmUgY29waWVkIHRvIHRoaXMgZGlyZWN0b3J5LCBub3QgdG8gc3ViZGlyZWN0b3JpZXMuCisKKzwvcD4KKyAgPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtzaWduamFyCisgICAgYWxpYXM9InRlc3Rvbmx5IiBrZXlzdG9yZT0idGVzdGtleXN0b3JlIgorICAgIHN0b3JlcGFzcz0iYXBhY2hlYW50IgorICAgIGxhenk9InRydWUiCisgICAgJmd0OworICAmbHQ7cGF0aCZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9ImRpc3QiIGluY2x1ZGVzPSIqKi8qLmphciIgLyZndDsKKyAgJmx0Oy9wYXRoJmd0OworJmx0Oy9zaWduamFyJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+CitTaWduIGFsbCB0aGUgSkFSIGZpbGVzIGluIGRpc3QvKiovKi5qYXIgPGk+aW4tc2l0dTwvaT4uIExhenkgc2lnbmluZyBpcyB1c2VkLAorc28gdGhlIGZpbGVzIHdpbGwgb25seSBiZSBzaWduZWQgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgc2lnbmVkLgorPC9wPgorPGgzPkFib3V0IHRpbWVzdGFtcCBzaWduaW5nPC9oMz4KKworPHA+CitUaW1lc3RhbXBlZCBKQVIgZmlsZXMgYXJlIGEgbmV3IGZlYXR1cmUgaW4gSmF2YTEuNTsgYSBmZWF0dXJlIHN1cHBvcnRlZCBpbiBBbnQgc2luY2UKK0FudCAxLjcuIEFudCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBwcm94eSBzZXR1cCBmb3IgdGhpcyBzaW5naW5nIHByb2Nlc3MsIGFuZAordGhlIHdob2xlIFRTQSBmZWF0dXJlIGlzIG5vdCB0ZXN0ZWQgeWV0LiBGdXJ0aGVybW9yZSwgdGhlIAorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvdGltZS1vZi1zaWduaW5nLWJldGExLmh0bWwiPgorb2ZmaWNpYWwgVFNBIGRvY3VtZW50YXRpb248L2E+Cit3YXJucyB0aGF0IHRoZSBBUEkgaXMgc3ViamVjdCB0byBjaGFuZ2UuIElmIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YSBjaGFuZ2VzIHRoZQorQVBJLCBBbnQgd2lsbCBicmVhay4gSXQgbWF5IGJlIHBvc3NpYmxlIHRvIGhpZGUgY2hhbmdlcyBpZiBhbmQgd2hlbiB0aGV5IG9jY3VyLAorYnV0IHRoaXMgY2FuIG5vdCBiZSBndWFyYW50ZWVkLiAKKzwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3NsZWVwLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvc2xlZXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDgyN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3NsZWVwLmh0bWwKQEAgLTAsMCArMSw4NSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5TbGVlcCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJzbGVlcCI+U2xlZXA8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD4gQSB0YXNrIGZvciBzbGVlcGluZyBhIHNob3J0IHBlcmlvZCBvZiB0aW1lLCB1c2VmdWwgd2hlbiBhIGJ1aWxkIG9yIGRlcGxveW1lbnQgCisgIHByb2Nlc3MgcmVxdWlyZXMgYW4gaW50ZXJ2YWwgYmV0d2VlbiB0YXNrcy48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4gCisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+aG91cnM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aG91cnMgdG8gdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1pbnV0ZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+IG1pbnV0ZXMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNlY29uZHM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+bWlsbGlzZWNvbmRzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1pbGxpc2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhZyBjb250cm9sbGluZyB3aGV0aGVyIHRvIGJyZWFrIHRoZSBidWlsZCBvbiBhbiBlcnJvci4gCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD5UaGUgc2xlZXAgdGltZSBpcyB0aGUgc3VtIG9mIHNwZWNpZmllZCB2YWx1ZXMsIGhvdXJzLCBtaW51dGVzIHNlY29uZHMgYW5kIG1pbGxpc2Vjb25kcy4gCisgIEEgbmVnYXRpdmUgdmFsdWUgY2FuIGJlIHN1cHBsaWVkIHRvIGFueSBvZiB0aGVtIHByb3ZpZGVkIHRoZSB0b3RhbCBzbGVlcCB0aW1lIAorICBpcyBwb3NpdGl2ZTwvcD4KKzxwPk5vdGUgdGhhdCBzbGVlcCB0aW1lcyBhcmUgYWx3YXlzIGhpbnRzIHRvIGJlIGludGVycHJlZCBieSB0aGUgT1MgaG93IGl0IGZlZWxzIAorICAtIHNtYWxsIHRpbWVzIG1heSBlaXRoZXIgYmUgaWdub3JlZCBvciByb3VuZGVkIHVwIHRvIGEgbWluaW11bSB0aW1lc2xpY2UuIE5vdGUgCisgIGFsc28gdGhhdCB0aGUgc3lzdGVtIGNsb2NrcyBvZnRlbiBoYXZlIGEgZmFpcmx5IGxvdyBncmFudWxhcml0eSB0b28sIHdoaWNoIGNvbXBsaWNhdGVzIAorICBtZWFzdXJpbmcgaG93IGxvbmcgYSBzbGVlcCBhY3R1YWxseSB0b29rLjwvcD4KKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiAgICZsdDtzbGVlcCBtaWxsaXNlY29uZHM9JnF1b3Q7MTAmcXVvdDsvJmd0OzwvcHJlPgorU2xlZXAgZm9yIGFib3V0IDEwIG1TLiAKKzxwcmU+ICAgJmx0O3NsZWVwIHNlY29uZHM9JnF1b3Q7MiZxdW90Oy8mZ3Q7PC9wcmU+CitTbGVlcCBmb3IgYWJvdXQgMiBzZWNvbmRzLiAKKzxwcmU+ICAgJmx0O3NsZWVwIGhvdXJzPSZxdW90OzEmcXVvdDsgbWludXRlcz0mcXVvdDstNTkmcXVvdDsgc2Vjb25kcz0mcXVvdDstNTgmcXVvdDsvJmd0OzwvcHJlPgorPHA+U2xlZXAgZm9yIG9uZSBob3VyIGxlc3MgNTk6NTgsIG9yIHR3byBzZWNvbmRzIGFnYWluIDwvcD4KKzxwcmU+ICAgJmx0O3NsZWVwLyZndDs8L3ByZT4KK1NsZWVwIGZvciBubyB0aW1lIGF0IGFsbC4gVGhpcyBtYXkgeWllbGQgdGhlIENQVSB0aW1lIHRvIGFub3RoZXIgdGhyZWFkIG9yIHByb2Nlc3MuIAorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3NxbC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3NxbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MGM0MjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvc3FsLmh0bWwKQEAgLTAsMCArMSwzODcgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlNRTCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDI+PGEgbmFtZT0ic3FsIj5TcWw8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5FeGVjdXRlcyBhIHNlcmllcyBvZiBTUUwgc3RhdGVtZW50cyB2aWEgSkRCQyB0byBhIGRhdGFiYXNlLiBTdGF0ZW1lbnRzIGNhbiAKK2VpdGhlciBiZSByZWFkIGluIGZyb20gYSB0ZXh0IGZpbGUgdXNpbmcgdGhlIDxpPnNyYzwvaT4gYXR0cmlidXRlIG9yIGZyb20gCitiZXR3ZWVuIHRoZSBlbmNsb3NpbmcgU1FMIHRhZ3MuPC9wPgorCis8cD5NdWx0aXBsZSBzdGF0ZW1lbnRzIGNhbiBiZSBwcm92aWRlZCwgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgKG9yIHRoZSAKK2RlZmluZWQgPGk+ZGVsaW1pdGVyPC9pPikuIEluZGl2aWR1YWwgbGluZXMgd2l0aGluIHRoZSBzdGF0ZW1lbnRzIGNhbiBiZSAKK2NvbW1lbnRlZCB1c2luZyBlaXRoZXIgLS0sIC8vIG9yIFJFTSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuPC9wPgorCis8cD5UaGUgPGk+YXV0b2NvbW1pdDwvaT4gYXR0cmlidXRlIHNwZWNpZmllcyB3aGV0aGVyIGF1dG8tY29tbWl0IHNob3VsZCBiZSAKK3R1cm5lZCBvbiBvciBvZmYgd2hpbHN0IGV4ZWN1dGluZyB0aGUgc3RhdGVtZW50cy4gSWYgYXV0by1jb21taXQgaXMgdHVybmVkIAorb24gZWFjaCBzdGF0ZW1lbnQgd2lsbCBiZSBleGVjdXRlZCBhbmQgY29tbWl0dGVkLiBJZiBpdCBpcyB0dXJuZWQgb2ZmIHRoZSAKK3N0YXRlbWVudHMgd2lsbCBhbGwgYmUgZXhlY3V0ZWQgYXMgb25lIHRyYW5zYWN0aW9uLjwvcD4KKworPHA+VGhlIDxpPm9uZXJyb3I8L2k+IGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRvIHByb2NlZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgCitkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBvbmUgb2YgdGhlIHN0YXRlbWVudHMuIAorVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6IDxiPmNvbnRpbnVlPC9iPiBleGVjdXRpb24sIG9ubHkgc2hvdyB0aGUgZXJyb3I7Cis8Yj5zdG9wPC9iPiBleGVjdXRpb24gYW5kIGNvbW1pdCB0cmFuc2FjdGlvbjsKK2FuZCA8Yj5hYm9ydDwvYj4gZXhlY3V0aW9uIGFuZCB0cmFuc2FjdGlvbiBhbmQgZmFpbCB0YXNrLjwvcD4KKworPHA+Cis8Yj5Qcm94aWVzPC9iPi4gU29tZSBKREJDIGRyaXZlcnMgKGluY2x1ZGluZyB0aGUgT3JhY2xlIHRoaW4gZHJpdmVyKSwgCisgICAgdXNlIHRoZSBKVk0ncyBwcm94eSBzZXR0aW5ncyB0byByb3V0ZSB0aGVpciBKREJDIG9wZXJhdGlvbnMgdG8gdGhlIGRhdGFiYXNlLgorICAgIFNpbmNlIEFudDEuNywgQW50IHJ1bm5pbmcgb24gSmF2YTEuNSBvciBsYXRlciBkZWZhdWx0cyB0byAKKyAgICA8YSBocmVmPSIuLi9wcm94eS5odG1sIj51c2luZworICAgIHRoZSBwcm94eSBzZXR0aW5ncyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbTwvYT4uIAorICAgIEFjY29yZGluZ2x5LCB0aGUgT1MgcHJveHkgc2V0dGluZ3MgbmVlZCB0byBiZSB2YWxpZCwgb3IgQW50J3MgcHJveHkKKyAgICBzdXBwb3J0IGRpc2FibGVkIHdpdGggPGNvZGU+LW5vcHJveHk8L2NvZGU+IG9wdGlvbi4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmRyaXZlcjwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+Q2xhc3MgbmFtZSBvZiB0aGUgamRiYyBkcml2ZXI8L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPlllczwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPnVybDwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+RGF0YWJhc2UgY29ubmVjdGlvbiB1cmw8L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPlllczwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPnVzZXJpZDwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+RGF0YWJhc2UgdXNlciBuYW1lPC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5wYXNzd29yZDwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+RGF0YWJhc2UgcGFzc3dvcmQ8L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPlllczwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+RmlsZSBjb250YWluaW5nIFNRTCBzdGF0ZW1lbnRzPC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBzdGF0ZW1lbnRzIGVuY2xvc2VkIHdpdGhpbiB0YWdzPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgorICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZXMgY29udGFpbmluZyBTUUwgc3RhdGVtZW50czwvdGQ+CisgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGVuY29kaW5nPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+ZGVsaW1pdGVyPC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5TdHJpbmcgdGhhdCBzZXBhcmF0ZXMgU1FMIHN0YXRlbWVudHM8L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICZxdW90OzsmcXVvdDs8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5hdXRvY29tbWl0PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5BdXRvIGNvbW1pdCBmbGFnIGZvciBkYXRhYmFzZSBjb25uZWN0aW9uIChkZWZhdWx0IGZhbHNlKTwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5wcmludDwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+UHJpbnQgcmVzdWx0IHNldHMgZnJvbSB0aGUgc3RhdGVtZW50cyAoZGVmYXVsdCBmYWxzZSk8L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+c2hvd2hlYWRlcnM8L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPlByaW50IGhlYWRlcnMgZm9yIHJlc3VsdCBzZXRzIGZyb20gdGhlIHN0YXRlbWVudHMgKGRlZmF1bHQgdHJ1ZSk8L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICZxdW90O3RydWUmcXVvdDs8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5zaG93dHJhaWxlcnM8L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPlByaW50IHRyYWlsZXIgZm9yIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIChkZWZhdWx0IHRydWUpPC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDt0cnVlJnF1b3Q7PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+b3V0cHV0PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5PdXRwdXQgZmlsZSBmb3IgcmVzdWx0IHNldHMgKGRlZmF1bHRzIHRvIFN5c3RlbS5vdXQpPC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObyAocHJpbnQgdG8gU3lzdGVtLm91dCBieSBkZWZhdWx0KTwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hcHBlbmQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0ZQorICAgIGFuIGV4aXN0aW5nIGZpbGUuICBEZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+Q2xhc3NwYXRoIHVzZWQgdG8gbG9hZCBkcml2ZXI8L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vICh1c2Ugc3lzdGVtIGNsYXNzcGF0aCk8L3RkPgorPC90cj4KKyAgPHRyPgorICAgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObyAodXNlIHN5c3RlbSBjbGFzc3BhdGgpPC90ZD4KKyAgPC90cj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5vbmVycm9yPC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5BY3Rpb24gdG8gcGVyZm9ybSB3aGVuIHN0YXRlbWVudCBmYWlsczogY29udGludWUsIHN0b3AsIGFib3J0PC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDthYm9ydCZxdW90OzwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPnJkYm1zPC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5FeGVjdXRlIHRhc2sgb25seSBpZiB0aGlzIHJkYm1zPC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObyAobm8gcmVzdHJpY3Rpb24pPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+dmVyc2lvbjwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+RXhlY3V0ZSB0YXNrIG9ubHkgaWYgcmRibXMgdmVyc2lvbiBtYXRjaDwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKG5vIHJlc3RyaWN0aW9uKTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmNhY2hpbmc8L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPlNob3VsZCB0aGUgdGFzayBjYWNoZSBsb2FkZXJzIGFuZCB0aGUgZHJpdmVyPzwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQ9dHJ1ZSk8L3RkPgorPC90cj4KKworPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmRlbGltaXRlcnR5cGU8L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkNvbnRyb2wgd2hldGhlciB0aGUgZGVsaW1pdGVyIHdpbGwgb25seSBiZSByZWNvZ25pemVkIG9uIGEgbGluZSBieSBpdHNlbGYuPGJyPgorICAgIENhbiBiZSAibm9ybWFsIiAtYW55d2hlcmUgb24gdGhlIGxpbmUsIG9yICJyb3ciLCBtZWFuaW5nIGl0IG11c3QgYmUgb24gYSBsaW5lIGJ5IGl0c2VsZjwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQ6bm9ybWFsKTwvdGQ+Cis8L3RyPgorCis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+a2VlcGZvcm1hdDwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+Q29udHJvbCB3aGV0aGVyIHRoZSBmb3JtYXQgb2YgdGhlIHNxbCB3aWxsIGJlIHByZXNlcnZlZC48YnI+CisgICAgVXNlZnVsIHdoZW4gbG9hZGluZyBwYWNrYWdlcyBhbmQgcHJvY2VkdXJlcy4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObyAoZGVmYXVsdD1mYWxzZSk8L3RkPgorPC90cj4KKworPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmVzY2FwZXByb2Nlc3Npbmc8L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkNvbnRyb2wgd2hldGhlciB0aGUgSmF2YSBzdGF0ZW1lbnQKKyAgICBvYmplY3Qgd2lsbCBwZXJmb3JtIGVzY2FwZSBzdWJzdGl0dXRpb24uPGJyPgorICAgIFNlZSA8YQorICAgIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3NxbC9TdGF0ZW1lbnQuaHRtbCNzZXRFc2NhcGVQcm9jZXNzaW5nKGJvb2xlYW4pIj5TdGF0ZW1lbnQncworICAgIEFQSSBkb2NzPC9hPiBmb3IgZGV0YWlscy4gIDxlbT5TaW5jZSBBbnQgMS42PC9lbT4uCisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQ9dHJ1ZSk8L3RkPgorPC90cj4KKworPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmV4cGFuZHByb3BlcnRpZXM8L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPlNldCB0byB0cnVlIHRvIHR1cm4gb24gcHJvcGVydHkgZXhwYW5zaW9uIGluCisgIG5lc3RlZCBTUUwsIGlubGluZSBpbiB0aGUgdGFzayBvciBuZXN0ZWQgdHJhbnNhY3Rpb25zLiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+LgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vIChkZWZhdWx0PXRydWUpPC90ZD4KKzwvdHI+CisKKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5yYXdibG9iczwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+SWYgdHJ1ZSwgd2lsbCB3cml0ZSByYXcgc3RyZWFtcyByYXRoZXIgdGhhbiBoZXggZW5jb2Rpbmcgd2hlbgorICAgIHByaW50aW5nIEJMT0IgcmVzdWx0cy4gPGVtPlNpbmNlIEFudCAxLjcuMTwvZW0+LjwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgPGVtPmZhbHNlPC9lbT48L3RkPgorPC90cj4KKworPC90YWJsZT4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8aDQ+dHJhbnNhY3Rpb248L2g0PgorPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7dHJhbnNhY3Rpb24mZ3Q7PC9jb2RlPiAKK2VsZW1lbnRzIHRvIHNwZWNpZnkgbXVsdGlwbGUgYmxvY2tzIG9mIGNvbW1hbmRzIHRvIHRoZSBleGVjdXRlZAorZXhlY3V0ZWQgaW4gdGhlIHNhbWUgY29ubmVjdGlvbiBidXQgZGlmZmVyZW50IHRyYW5zYWN0aW9ucy4gVGhpcworaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBmaWxlcyB0byBleGVjdXRlCitvbiB0aGUgc2FtZSBzY2hlbWEuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkZpbGUgY29udGFpbmluZyBTUUwgc3RhdGVtZW50czwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIHVubGVzcyBzdGF0ZW1lbnRzIGVuY2xvc2VkIHdpdGhpbiB0YWdzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD5UaGUgPGNvZGU+Jmx0O3RyYW5zYWN0aW9uJmd0OzwvY29kZT4gZWxlbWVudCBzdXBwb3J0cyBhbnkgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHNpbmdsZSBlbGVtZW50CityZXNvdXJjZSBjb2xsZWN0aW9uIGFzIG5lc3RlZCBlbGVtZW50IHRvIHNwZWNpZnkgdGhlIHJlc291cmNlCitjb250YWluaW5nIHRoZSBTUUwgc3RhdGVtZW50cy48L3A+CisKKzxoND5hbnkgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gb3IgcmVzb3VyY2UKK2NvbGxlY3Rpb248L2g0PgorCis8cD5Zb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgc291cmNlcyB2aWEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24KK2VsZW1lbnRzLiAgRWFjaCByZXNvdXJjZSBvZiB0aGUgY29sbGVjdGlvbiB3aWxsIGJlIHJ1biBpbiBhCit0cmFuc2FjdGlvbiBvZiBpdHMgb3duLiAgUHJpb3IgdG8gQW50IDEuNyBvbmx5IGZpbGVzZXRzIHdlcmUKK3N1cHBvcnRlZC4gIFVzZSBhIHNvcnQgcmVzb3VyY2UgY29sbGVjdGlvbiB0byBnZXQgYSBwcmVkaWN0YWJsZSBvcmRlcgorb2YgdHJhbnNhY3Rpb25zLiA8L3A+CisKKzxoND5jbGFzc3BhdGg8L2g0PgorPHA+PGNvZGU+U3FsPC9jb2RlPidzIDxlbT5jbGFzc3BhdGg8L2VtPiBhdHRyaWJ1dGUgaXMgYSA8YQoraHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRIIGxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZAorPGVtPmNsYXNzcGF0aDwvZW0+IGVsZW1lbnQuIEl0IGlzIHVzZWQgdG8gbG9hZCB0aGUgSkRCQyBjbGFzc2VzLjwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPjxwcmU+Jmx0O3NxbAorICAgIGRyaXZlcj0mcXVvdDtvcmcuZGF0YWJhc2UuamRiY0RyaXZlciZxdW90OworICAgIHVybD0mcXVvdDtqZGJjOmRhdGFiYXNlLXVybCZxdW90OworICAgIHVzZXJpZD0mcXVvdDtzYSZxdW90OworICAgIHBhc3N3b3JkPSZxdW90O3Bhc3MmcXVvdDsKKyAgICBzcmM9JnF1b3Q7ZGF0YS5zcWwmcXVvdDsKKy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPkNvbm5lY3RzIHRvIHRoZSBkYXRhYmFzZSBnaXZlbiBpbiA8aT51cmw8L2k+IGFzIHRoZSBzYSB1c2VyIHVzaW5nIHRoZSAKK29yZy5kYXRhYmFzZS5qZGJjRHJpdmVyIGFuZCBleGVjdXRlcyB0aGUgU1FMIHN0YXRlbWVudHMgY29udGFpbmVkIHdpdGhpbiAKK3RoZSBmaWxlIGRhdGEuc3FsPC9wPgorCis8YmxvY2txdW90ZT48cHJlPiZsdDtzcWwKKyAgICBkcml2ZXI9JnF1b3Q7b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXImcXVvdDsKKyAgICB1cmw9JnF1b3Q7amRiYzpkYXRhYmFzZS11cmwmcXVvdDsKKyAgICB1c2VyaWQ9JnF1b3Q7c2EmcXVvdDsKKyAgICBwYXNzd29yZD0mcXVvdDtwYXNzJnF1b3Q7CisgICAgJmd0OworaW5zZXJ0CitpbnRvIHRhYmxlIHNvbWVfdGFibGUKK3ZhbHVlcygxLDIsMyw0KTsKKwordHJ1bmNhdGUgdGFibGUgc29tZV9vdGhlcl90YWJsZTsKKyZsdDsvc3FsJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5Db25uZWN0cyB0byB0aGUgZGF0YWJhc2UgZ2l2ZW4gaW4gPGk+dXJsPC9pPiBhcyB0aGUgc2EKKyB1c2VyIHVzaW5nIHRoZSBvcmcuZGF0YWJhc2UuamRiY0RyaXZlciBhbmQgZXhlY3V0ZXMgdGhlIHR3byBTUUwgc3RhdGVtZW50cyAKKyBpbnNlcnRpbmcgZGF0YSBpbnRvIHNvbWVfdGFibGUgYW5kIHRydW5jYXRpbmcgc29tZV9vdGhlcl90YWJsZS4gQW50IFByb3BlcnRpZXMKKyBpbiB0aGUgbmVzdGVkIHRleHQgd2lsbCBub3QgYmUgZXhwYW5kZWQuPC9wPgorCis8cD5Ob3RlIHRoYXQgeW91IG1heSB3YW50IHRvIGVuY2xvc2UgeW91ciBzdGF0ZW1lbnRzIGluCis8Y29kZT4mbHQ7IVtDREFUQVs8L2NvZGU+IC4uLiA8Y29kZT5dXSZndDs8L2NvZGU+IHNlY3Rpb25zIHNvIHlvdSBkb24ndAorbmVlZCB0byBlc2NhcGUgPGNvZGU+Jmx0OzwvY29kZT4sIDxjb2RlPiZndDs8L2NvZGU+IDxjb2RlPiZhbXA7PC9jb2RlPgorb3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzLiBGb3IgZXhhbXBsZTo8L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+Jmx0O3NxbAorICAgIGRyaXZlcj0mcXVvdDtvcmcuZGF0YWJhc2UuamRiY0RyaXZlciZxdW90OworICAgIHVybD0mcXVvdDtqZGJjOmRhdGFiYXNlLXVybCZxdW90OworICAgIHVzZXJpZD0mcXVvdDtzYSZxdW90OworICAgIHBhc3N3b3JkPSZxdW90O3Bhc3MmcXVvdDsKKyAgICAmZ3Q7Jmx0OyFbQ0RBVEFbCisKK3VwZGF0ZSBzb21lX3RhYmxlIHNldCBjb2x1bW4xID0gY29sdW1uMSArIDEgd2hlcmUgY29sdW1uMiAmbHQ7IDQyOworCitdXSZndDsmbHQ7L3NxbCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworVGhlIGZvbGxvd2luZyBjb21tYW5kIHR1cm5zIHByb3BlcnR5IGV4cGFuc2lvbiBpbiBuZXN0ZWQgdGV4dCBvbiAoaXQgaXMgb2ZmIHB1cmVseSBmb3IgYmFja3dhcmRzCitjb21wYXRpYmlsaXR5KSwgdGhlbiBjcmVhdGVzIGEgbmV3IHVzZXIgaW4gdGhlIEhTUUxEQiBkYXRhYmFzZSB1c2luZyBBbnQgcHJvcGVydGllcy4gCisKKzxibG9ja3F1b3RlPjxwcmU+Jmx0O3NxbAorICAgIGRyaXZlcj0ib3JnLmhzcWxkYi5qZGJjRHJpdmVyIjsKKyAgICB1cmw9ImpkYmM6aHNxbGRiOmZpbGU6JHtkYXRhYmFzZS5kaXJ9IgorICAgIHVzZXJpZD0ic2EiCisgICAgcGFzc3dvcmQ9IiIKKyAgICBleHBhbmRQcm9wZXJ0aWVzPSJ0cnVlIgorICAgICZndDsKKyAgJmx0O3RyYW5zYWN0aW9uJmd0OworICAgIENSRUFURSBVU0VSICR7bmV3dXNlcn0gUEFTU1dPUkQgJHtuZXdwYXNzd29yZH0KKyAgJmx0Oy90cmFuc2FjdGlvbiZndDsKKyZsdDsvc3FsJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisKKzxwPlRoZSBmb2xsb3dpbmcgY29ubmVjdHMgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGluIHVybCBhcyB0aGUgc2EgdXNlciB1c2luZyAKK3RoZSBvcmcuZGF0YWJhc2UuamRiY0RyaXZlciBhbmQgZXhlY3V0ZXMgdGhlIFNRTCBzdGF0ZW1lbnRzIGNvbnRhaW5lZCB3aXRoaW4gCit0aGUgZmlsZXMgZGF0YTEuc3FsLCBkYXRhMi5zcWwgYW5kIGRhdGEzLnNxbCBhbmQgdGhlbiBleGVjdXRlcyB0aGUgdHJ1bmNhdGUgCitvcGVyYXRpb24gb24gPGk+c29tZV9vdGhlcl90YWJsZTwvaT4uPC9wPgorCis8YmxvY2txdW90ZT48cHJlPiZsdDtzcWwKKyAgICBkcml2ZXI9JnF1b3Q7b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXImcXVvdDsKKyAgICB1cmw9JnF1b3Q7amRiYzpkYXRhYmFzZS11cmwmcXVvdDsKKyAgICB1c2VyaWQ9JnF1b3Q7c2EmcXVvdDsKKyAgICBwYXNzd29yZD0mcXVvdDtwYXNzJnF1b3Q7ICZndDsKKyAgJmx0O3RyYW5zYWN0aW9uICBzcmM9JnF1b3Q7ZGF0YTEuc3FsJnF1b3Q7LyZndDsKKyAgJmx0O3RyYW5zYWN0aW9uICBzcmM9JnF1b3Q7ZGF0YTIuc3FsJnF1b3Q7LyZndDsKKyAgJmx0O3RyYW5zYWN0aW9uICBzcmM9JnF1b3Q7ZGF0YTMuc3FsJnF1b3Q7LyZndDsKKyAgJmx0O3RyYW5zYWN0aW9uJmd0OworICAgIHRydW5jYXRlIHRhYmxlIHNvbWVfb3RoZXJfdGFibGU7CisgICZsdDsvdHJhbnNhY3Rpb24mZ3Q7CismbHQ7L3NxbCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIGRvZXMgdGhlIHNhbWUgYXMgKGFuZCBtYXkgZXhlY3V0ZSBhZGRpdGlvbmFsCitTUUwgZmlsZXMgaWYgdGhlcmUgYXJlIG1vcmUgZmlsZXMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4KKzxjb2RlPmRhdGEqLnNxbDwvY29kZT4pIGJ1dCBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGRhdGExLnNxbCB3aWxsIGJlCitydW4gYmVmb3JlIDxjb2RlPmRhdGEyLnNxbDwvY29kZT4uPC9wPgorCis8YmxvY2txdW90ZT48cHJlPiZsdDtzcWwKKyAgICBkcml2ZXI9JnF1b3Q7b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXImcXVvdDsKKyAgICB1cmw9JnF1b3Q7amRiYzpkYXRhYmFzZS11cmwmcXVvdDsKKyAgICB1c2VyaWQ9JnF1b3Q7c2EmcXVvdDsKKyAgICBwYXNzd29yZD0mcXVvdDtwYXNzJnF1b3Q7Jmd0OworICAmbHQ7cGF0aCZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7ZGF0YSouc3FsJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDtwYXRoJmd0OworICAmbHQ7dHJhbnNhY3Rpb24mZ3Q7CisgICAgdHJ1bmNhdGUgdGFibGUgc29tZV9vdGhlcl90YWJsZTsKKyAgJmx0Oy90cmFuc2FjdGlvbiZndDsKKyZsdDsvc3FsJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5UaGUgZm9sbG93aW5nIGNvbm5lY3RzIHRvIHRoZSBkYXRhYmFzZSBnaXZlbiBpbiB1cmwgYXMgdGhlIHNhIHVzZXIgdXNpbmcgdGhlIAorb3JnLmRhdGFiYXNlLmpkYmNEcml2ZXIgYW5kIGV4ZWN1dGVzIHRoZSBTUUwgc3RhdGVtZW50cyBjb250YWluZWQgd2l0aGluIHRoZSAKK2ZpbGUgZGF0YS5zcWwsIHdpdGggb3V0cHV0IHBpcGVkIHRvIG91dHB1dGZpbGUudHh0LCBzZWFyY2hpbmcgL3NvbWUvamRiYy5qYXIgCithcyB3ZWxsIGFzIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIGZvciB0aGUgZHJpdmVyIGNsYXNzLjwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4mbHQ7c3FsCisgICAgZHJpdmVyPSZxdW90O29yZy5kYXRhYmFzZS5qZGJjRHJpdmVyJnF1b3Q7CisgICAgdXJsPSZxdW90O2pkYmM6ZGF0YWJhc2UtdXJsJnF1b3Q7CisgICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7CisgICAgcGFzc3dvcmQ9JnF1b3Q7cGFzcyZxdW90OworICAgIHNyYz0mcXVvdDtkYXRhLnNxbCZxdW90OworICAgIHByaW50PSZxdW90O3llcyZxdW90OworICAgIG91dHB1dD0mcXVvdDtvdXRwdXRmaWxlLnR4dCZxdW90OworICAgICZndDsKKyZsdDtjbGFzc3BhdGgmZ3Q7CisJJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90Oy9zb21lL2pkYmMuamFyJnF1b3Q7LyZndDsKKyZsdDsvY2xhc3NwYXRoJmd0OworJmx0Oy9zcWwmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPlRoZSBmb2xsb3dpbmcgd2lsbCBvbmx5IGV4ZWN1dGUgaWYgdGhlIFJEQk1TIGlzICZxdW90O29yYWNsZSZxdW90OyBhbmQgdGhlIHZlcnNpb24gCitzdGFydHMgd2l0aCAmcXVvdDs4LjEuJnF1b3Q7PC9wPgorCis8YmxvY2txdW90ZT48cHJlPiZsdDtzcWwKKyAgICBkcml2ZXI9JnF1b3Q7b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXImcXVvdDsKKyAgICB1cmw9JnF1b3Q7amRiYzpkYXRhYmFzZS11cmwmcXVvdDsKKyAgICB1c2VyaWQ9JnF1b3Q7c2EmcXVvdDsKKyAgICBwYXNzd29yZD0mcXVvdDtwYXNzJnF1b3Q7CisgICAgc3JjPSZxdW90O2RhdGEuc3FsJnF1b3Q7CisgICAgcmRibXM9JnF1b3Q7b3JhY2xlJnF1b3Q7CisgICAgdmVyc2lvbj0mcXVvdDs4LjEuJnF1b3Q7CisgICAgJmd0OworaW5zZXJ0CitpbnRvIHRhYmxlIHNvbWVfdGFibGUKK3ZhbHVlcygxLDIsMyw0KTsKKwordHJ1bmNhdGUgdGFibGUgc29tZV9vdGhlcl90YWJsZTsKKyZsdDsvc3FsJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9zdHlsZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3N0eWxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5NjFhMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy9zdHlsZS5odG1sCkBAIC0wLDAgKzEsNDg1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlhTTFQgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ic3R5bGUiPlhTTFQ8L2E+PC9oMj4KKzxwPjxlbT5UaGUgbmFtZSA8Y29kZT5zdHlsZTwvY29kZT4gaXMgYSBkZXByZWNhdGVkIG5hbWUgZm9yIHRoZSBzYW1lIHRhc2suPC9lbT48L3A+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+UHJvY2VzcyBhIHNldCBvZiBkb2N1bWVudHMgdmlhIFhTTFQuPC9wPgorPHA+VGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIHZpZXdzIG9mIFhNTCBiYXNlZCBkb2N1bWVudGF0aW9uLAorb3IgZm9yIGdlbmVyYXRpbmcgY29kZS48L3A+Cis8cD48Yj5Ob3RlOjwvYj4gSWYgeW91IGFyZSB1c2luZyBKREsgMS40IG9yIGhpZ2hlciwgdGhpcyB0YXNrIGRvZXMgbm90IHJlcXVpcmUgZXh0ZXJuYWwgbGlicmFyaWVzCitub3Qgc3VwcGxpZWQgaW4gdGhlIEFudCBkaXN0cmlidXRpb24uIEhvd2V2ZXIsIG9mdGVuIHRoZSBidWlsdCBpbiBYU0wgZW5naW5lIGlzIG5vdCBhcyB1cAordG8gZGF0ZSBhcyBhIGZyZXNoIGRvd25sb2FkLCBzbyBhbiB1cGRhdGUgaXMgc3RpbGwgaGlnaGx5IHJlY29tbWVuZGVkLgorU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcHJvY2Vzc2VkLiBUaGlzIGNhbiBiZQorZG9uZSB3aXRoIHRoZSA8aT5pbmNsdWRlczwvaT4sIDxpPmluY2x1ZGVzZmlsZTwvaT4sIDxpPmV4Y2x1ZGVzPC9pPiwgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhbmQgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPgorYXR0cmlidXRlcy4gV2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+IG9yIDxpPmluY2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0bworaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDxpPmV4Y2x1ZGU8L2k+IG9yIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeQordGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuIFRoaXMgaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZAorZmluYWxseSB3aXRoIHRoZSA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91Cit3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24gb24gPGEKK2hyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy48L3A+Cis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kIHN1cHBvcnRzIGFsbAorICBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDxjb2RlPmRpcjwvY29kZT4gYmVjb21lcyA8Y29kZT5iYXNlZGlyPC9jb2RlPikKKyAgYXMgd2VsbCBhcyB0aGUgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KKyAgYW5kIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorCis8cD48Yj5Ob3RlPC9iPjogVW5saWtlIG90aGVyIHNpbWlsYXIgdGFza3MsIHRoaXMgdGFzayB0cmVhdHMKK2RpcmVjdG9yaWVzIHRoYXQgaGF2ZSBiZWVuIG1hdGNoZWQgYnkgdGhlIGluY2x1ZGUvZXhjbHVkZSBwYXR0ZXJucyBvZgordGhlIGltcGxpY2l0IGZpbGVzZXQgaW4gYSBzcGVjaWFsIHdheS4gIEl0IHdpbGwgYXBwbHkgdGhlIHN0eWxlc2hlZXRzCit0byBhbGwgZmlsZXMgY29udGFpbiBpbiB0aGVtIGFzIHdlbGwuICBTaW5jZSB0aGUgZGVmYXVsdCBpbmNsdWRlCitwYXR0ZXJuIGlzIDxjb2RlPioqPC9jb2RlPiB0aGlzIG1lYW5zIGl0IHdpbGwgYXBwbHkgdGhlIHN0eWxlc2hlZXQgdG8KK2FsbCBmaWxlcy4gIElmIHlvdSBzcGVjaWZ5IGFuIGV4Y2x1ZGVzIHBhdHRlcm4sIGl0IG1heSBzdGlsbCB3b3JrIG9uCit0aGUgZmlsZXMgbWF0Y2hlZCBieSB0aG9zZSBwYXR0ZXJucyBiZWNhdXNlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGhhcworYmVlbiBtYXRjaGVkLiAgSWYgdGhpcyBiZWhhdmlvciBpcyBub3Qgd2hhdCB5b3Ugd2FudCwgc2V0IHRoZQorc2NhbmluY2x1ZGVkaXJlY3RvcmllcyBhdHRyaWJ1dGUgdG8gZmFsc2UuPC9wPgorCis8cD5TdGFydGluZyB3aXRoIEFudCAxLjcgdGhpcyB0YXNrIHN1cHBvcnRzIG5lc3RlZCA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb248L2E+cworaW4gYWRkaXRpb24gdG8gKG9yIGluc3RlYWQgb2YsIGRlcGVuZGluZyBvbiB0aGUgdXNlSW1wbGljaXRGaWxlc2V0CithdHRyaWJ1dGUpIHRoZSBpbXBsaWNpdCBmaWxlc2V0IGZvcm1lZCBieSB0aGlzIHRhc2suPC9wPgorCis8cD5UaGlzIHRhc2sgc3VwcG9ydHMgdGhlIHVzZSBvZiBhIG5lc3RlZCA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiBlbGVtZW50IHdoaWNoIGlzIHVzZWQgdG8gcGFzcyB2YWx1ZXMKKyAgdG8gYW4gPGNvZGU+Jmx0O3hzbDpwYXJhbSZndDs8L2NvZGU+IGRlY2xhcmF0aW9uLjwvcD4KKzxwPlRoaXMgdGFzayBzdXBwb3J0cyB0aGUgdXNlIG9mIGEgbmVzdGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy94bWxjYXRhbG9nLmh0bWwiPnhtbGNhdGFsb2c8L2E+CitlbGVtZW50IHdoaWNoIGlzIHVzZWQgdG8gcGVyZm9ybSBFbnRpdHkgYW5kIFVSSSByZXNvbHV0aW9uLjwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlcmUgdG8gZmluZCB0aGUgc291cmNlIFhNTCBmaWxlLCBkZWZhdWx0IGlzIHRoZQorICAgICAgcHJvamVjdCdzIGJhc2VkaXIuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaXJlY3RvcnkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdHMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgdW5sZXNzIGluIGFuZCBvdXQgaGF2ZSBiZWVuCisgICAgICBzcGVjaWZpZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc2lyZWQgZmlsZSBleHRlbnNpb24gdG8gYmUgdXNlZCBmb3IgdGhlIHRhcmdldHMuIElmIG5vdAorICAgICAgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyAmcXVvdDsuaHRtbCZxdW90Oy4gIFdpbGwgYmUgaWdub3JlZCBpZgorICAgICAgYSBuZXN0ZWQgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGhhcyBiZWVuIHNwZWNpZmllZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdHlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIHRoZSBzdHlsZXNoZWV0IHRvIHVzZSAtIGdpdmVuIGVpdGhlciByZWxhdGl2ZQorICAgICAgdG8gdGhlIHByb2plY3QncyBiYXNlZGlyIG9yIGFzIGFuIGFic29sdXRlIHBhdGguPGJyLz4KKyAgICAgIDxici8+CisgICAgICBBbHRlcm5hdGl2ZWx5LCBhIG5lc3RlZCBlbGVtZW50IHdoaWNoIGFudCBjYW4gaW50ZXJwcmV0IGFzIGEgcmVzb3VyY2UKKyAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHdoZXJlIHRvIGZpbmQgdGhlIHN0eWxlc2hlZXQ8YnIvPgorICAgICAgPGVtPmRlcHJlY2F0ZWQgdmFyaWF0aW9uIDo8L2VtPiA8YnIvPgorICAgICAgSWYgdGhlIHN0eWxlc2hlZXQgY2Fubm90IGJlIGZvdW5kLCBhbmQgaWYgeW91IGhhdmUgc3BlY2lmaWVkIHRoZQorICAgICAgYXR0cmlidXRlIGJhc2VkaXIgZm9yIHRoZSB0YXNrLCBhbnQgd2lsbCBhc3N1bWUgdGhhdCB0aGUgc3R5bGUKKyAgICAgIGF0dHJpYnV0ZSBpcyByZWxhdGl2ZSB0byB0aGUgYmFzZWRpciBvZiB0aGUgdGFzay4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGlmIHRoZSBsb2NhdGlvbiBvZgorICAgICAgICB0aGUgc3R5bGVzaGVldCBpcyBzcGVjaWZpZWQgdXNpbmcgYSBuZXN0ZWQgJmx0O3N0eWxlJmd0OyBlbGVtZW50PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCB0aGUgWFNMVAorICAgICAgcHJvY2Vzc29yLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgY2xhc3NwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgPGEKKyAgICAgIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yY2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UmVjcmVhdGUgdGFyZ2V0IGZpbGVzLCBldmVuIGlmIHRoZXkgYXJlIG5ld2VyCisgICAgICB0aGFuIHRoZWlyIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzIG9yIHRoZSBzdHlsZXNoZWV0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb2Nlc3NvcjwvdGQ+CisKKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWUgb2YgdGhlIFhTTFQgcHJvY2Vzc29yIHRvIHVzZS4KKyAgICAgIFBlcm1pc3NpYmxlIHZhbHVlIGlzIDo8dWw+CisgICAgICA8bGk+JnF1b3Q7dHJheCZxdW90OyBmb3IgYSBUcmFYIGNvbXBsaWFudCBwcm9jZXNzb3IgKGllIEpBWFAgaW50ZXJmYWNlCisgICAgICBpbXBsZW1lbnRhdGlvbiBzdWNoIGFzIFhhbGFuIDIgb3IgU2F4b24pPC9saT48L3VsPgorICAgICAgRGVmYXVsdHMgdG8gdHJheC4KKyAgICAgIDxici8+CisgICAgICBTdXBwb3J0IGZvciB4YWxhbjEgaGFzIGJlZW4gcmVtb3ZlZCBpbiBhbnQgMS43LgorICAgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC4KKyAgICAgIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUKKyAgICAgIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuCisgICAgICBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZQorICAgICAgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90CisgICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3BlY2lmaWVzIGEgc2luZ2xlIFhNTCBkb2N1bWVudCB0byBiZSBzdHlsZWQuIFNob3VsZCBiZSB1c2VkCisgICAgICB3aXRoIHRoZSBvdXQgYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm91dDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcGVjaWZpZXMgdGhlIG91dHB1dCBuYW1lIGZvciB0aGUgc3R5bGVkIHJlc3VsdCBmcm9tIHRoZQorICAgICAgaW4gYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNjYW5pbmNsdWRlZGRpcmVjdG9yaWVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklmIGFueSBkaXJlY3RvcmllcyBhcmUgbWF0Y2hlZCBieSB0aGUKKyAgICAgIGluY2x1ZGVzL2V4Y2x1ZGVzIHBhdHRlcm5zLCB0cnkgdG8gdHJhbnNmb3JtIGFsbCBmaWxlcyBpbiB0aGVzZQorICAgICAgZGlyZWN0b3JpZXMuICBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVsb2Fkc3R5bGVzaGVldDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db250cm9sIHdoZXRoZXIgdGhlIHN0eWxlc2hlZXQgdHJhbnNmb3JtZXIgaXMgY3JlYXRlZAorICAgIGFuZXcgZm9yIGV2ZXJ5IHRyYW5zZm9ybSBvcGVydGFpb24uIElmIHlvdSBzZXQgdGhpcyB0byB0cnVlLCBwZXJmb3JtYW5jZSBtYXkKKyAgICBzdWZmZXIsIGJ1dCB5b3UgbWF5IHdvcmsgYXJvdW5kIGEgYnVnIGluIGNlcnRhaW4gWGFsYW4tSiB2ZXJzaW9ucy4KKyAgICBEZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4gIDxlbT5TaW5jZSBBbnQgMS41LjI8L2VtPi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2VJbXBsaWNpdEZpbGVzZXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGUgaW1wbGljaXQgZmlsZXNldCBmb3JtZWQgYnkgdGhpcyB0YXNrCisgICAgc2hhbGwgYmUgdXNlZC4gIElmIHlvdSBzZXQgdGhpcyB0byBmYWxzZSB5b3UgbXVzdCB1c2UgbmVzdGVkCisgICAgcmVzb3VyY2UgY29sbGVjdGlvbnMgLSBvciB0aGUgaW4gYXR0cmlidXRlLCBpbiB3aGljaCBjYXNlIHRoaXMKKyAgICBhdHRyaWJ1dGUgaGFzIG5vIGltcGFjdCBhbnl3YXkuICBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgIDxlbT5TaW5jZSBBbnQgMS43PC9lbT4uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZW5hbWVwYXJhbWV0ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIGEgeHNsIHBhcmFtZXRlciBmb3IgYWNjZXNzaW5nIHRoZSBuYW1lCisgICAgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzc2VkIGZpbGUuIElmIG5vdCBzZXQsIHRoZSBmaWxlIG5hbWUgaXMgbm90CisgICAgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICA8ZW0+U2luY2UgQW50IDEuNzwvZW0+LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVkaXJwYXJhbWV0ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIGEgeHNsIHBhcmFtZXRlciBmb3IgYWNjZXNzaW5nIHRoZSBkaXJlY3RvcnkKKyAgICBvZiB0aGUgY3VycmVudCBwcm9jZXNzZWQgZmlsZS4gRm9yIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhCisgICAgdmFsdWUgb2YgJy4nIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICBJZiBub3Qgc2V0LCB0aGUgZGlyZWN0b3J5IGlzIG5vdCBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWF0aW9uLiAKKyAgICA8ZW0+U2luY2UgQW50IDEuNzwvZW0+LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND5hbnkgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlCitjb2xsZWN0aW9uPC9hPjwvaDQ+CisKKzxwPjxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3A+CisKKzxwPlVzZSByZXNvdXJjZSBjb2xsZWN0aW9ucyB0byBzcGVjaWZ5IHJlc291cmNlcyB0aGF0IHRoZSBzdHlsZXNoZWV0CitzaG91bGQgYmUgYXBwbGllZCB0by4gIFVzZSBhIG5lc3RlZCBtYXBwZXIgYW5kIHRoZSB0YXNrJ3MgZGVzdGRpcgorYXR0cmlidXRlIHRvIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlcy48L3A+CisKKzxoND5jbGFzc3BhdGg8L2g0PgorPHA+VGhlIGNsYXNzcGF0aCB0byBsb2FkIHRoZSBwcm9jZXNzb3IgZnJvbSBjYW4gYmUgc3BlY2lmaWVkIHZpYSBhCituZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+LCBhcyB3ZWxsIC0gdGhhdCBpcywgYQorPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoPC9hPi1saWtlIHN0cnVjdHVyZS48L3A+CisKKzxoND54bWxjYXRhbG9nPC9oND4KKzxwPlRoZSA8YSBocmVmPSIuLi9Db3JlVHlwZXMveG1sY2F0YWxvZy5odG1sIj54bWxjYXRhbG9nPC9hPgorZWxlbWVudCBpcyB1c2VkIHRvIHBlcmZvcm0gRW50aXR5IGFuZCBVUkkgcmVzb2x1dGlvbi48L3A+CisKKzxoND5wYXJhbTwvaDQ+Cis8cD5QYXJhbSBpcyB1c2VkIHRvIHBhc3MgYSBwYXJhbWV0ZXIgdG8gdGhlIFhTTCBzdHlsZXNoZWV0LjwvcD4KKzxibG9ja3F1b3RlPgorPGg0PlBhcmFtZXRlcnM8L2g0PgorPHRhYmxlIHdpZHRoPSI2MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIHRoZSBYU0wgcGFyYW1ldGVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4cHJlc3Npb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGV4dCB2YWx1ZSB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFyYW0uPGJyPgorICAgIFdhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIGJlIGFuIFhTTCBleHByZXNzaW9uLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcGFyYW0gd2lsbCBvbmx5IHBhc3NlZCBpZiB0aGlzIHByb3BlcnR5IGlzIHNldC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51bmxlc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhcmFtIHdpbGwgb25seSBwYXNzZWQgdW5sZXNzIHRoaXMgcHJvcGVydHkgaXMgc2V0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+Cis8L2Jsb2NrcXVvdGU+CisKKzxoND5vdXRwdXRwcm9wZXJ0eSAoJ3RyYXgnIHByb2Nlc3NvcnMgb25seSk8L2g0PgorPHA+VXNlZCB0byBzcGVjaWZ5IGhvdyB5b3Ugd2lzaCB0aGUgcmVzdWx0IHRyZWUgdG8gYmUgb3V0cHV0CithcyBzcGVjaWZpZWQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjb3V0cHV0Ij4KK1hTTFQgc3BlY2lmaWNhdGlvbnM8L2E+LgorPGJsb2NrcXVvdGU+Cis8aDQ+UGFyYW1ldGVyczwvaDQ+Cis8dGFibGUgd2lkdGg9IjYwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgdGhlIHByb3BlcnR5PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlIG9mIHRoZSBwcm9wZXJ0eS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8L2Jsb2NrcXVvdGU+CisKKzxoND5mYWN0b3J5ICgndHJheCcgcHJvY2Vzc29ycyBvbmx5KTwvaDQ+CitVc2VkIHRvIHNwZWNpZnkgZmFjdG9yeSBzZXR0aW5ncy4KKzxibG9ja3F1b3RlPgorPGg0PlBhcmFtZXRlcnM8L2g0PgorPHRhYmxlIHdpZHRoPSI2MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZQorICAgIHRyYW5zZm9ybWVyIGZhY3RvcnkgdG8gdXNlLiBGb3IgZXhhbXBsZQorICAgICAgPHR0Pm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGw8L3R0PgorICAgICAgIG9yIDx0dD5vcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnRyYXguVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDwvdHQ+CisgICAgICAgb3IgPHR0Pm5ldC5zZi5zYXhvbi5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsPC90dD4uLi4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uIERlZmF1bHRzIHRvIHRoZSBKQVhQIGxvb2t1cCBtZWNoYW5pc20uPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5hdHRyaWJ1dGUgPC9oND4KKzxwPlVzZWQgdG8gc3BlY2lmeSBzZXR0aW5ncyBvZiB0aGUgcHJvY2Vzc29yIGZhY3RvcnkuCitUaGUgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGVudGlyZWx5IHByb2Nlc3NvciBzcGVjaWZpYworc28geW91IG11c3QgYmUgYXdhcmUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIGZpZ3VyZSB0aGVtIG91dC4KK1JlYWQgdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBwcm9jZXNzb3IuCitGb3IgZXhhbXBsZSwgaW4gWGFsYW4gMi54OgorPHVsPgorPGxpPmh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9vcHRpbWl6ZSAoYm9vbGVhbik8L2xpPgorPGxpPmh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9pbmNyZW1lbnRhbCAoYm9vbGVhbik8L2xpPgorPGxpPi4uLjwvbGk+Cis8L3VsPgorQW5kIGluIFNheG9uIDcueDoKKzx1bD4KKzxsaT5odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvYWxsb3ctZXh0ZXJuYWwtZnVuY3Rpb25zIChib29sZWFuKTwvbGk+Cis8bGk+aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3RpbWluZyAoYm9vbGVhbik8L2xpPgorPGxpPmh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS90cmFjZUxpc3RlbmVyIChzdHJpbmcpPC9saT4KKzxsaT5odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvdHJlZU1vZGVsIChpbnRlZ2VyKTwvbGk+Cis8bGk+aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL2xpbmVudW1iZXJpbmcgKGludGVnZXIpPC9saT4KKzxsaT4uLi48L2xpPgorPC91bD4KKzxibG9ja3F1b3RlPgorPGg0PlBhcmFtZXRlcnM8L2g0PgorPHRhYmxlIHdpZHRoPSI2MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIHRoZSBhdHRyaWJ1dGU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8L2Jsb2NrcXVvdGU+Cis8L2Jsb2NrcXVvdGU+Cis8aDQ+bWFwcGVyPC9oND4KKworPHA+PGVtPnNpbmNlIEFudCAxLjYuMjwvZW0+PC9wPgorCis8cD5Zb3UgY2FuIGRlZmluZSBmaWxlbmFtZSB0cmFuc2Zvcm1hdGlvbnMgYnkgdXNpbmcgYSBuZXN0ZWQgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBlbGVtZW50LiBUaGUgZGVmYXVsdCBtYXBwZXIKK3VzZWQgYnkgPGNvZGU+Jmx0O3hzbHQmZ3Q7PC9jb2RlPiByZW1vdmVzIHRoZSBmaWxlIGV4dGVuc2lvbiBmcm9tIHRoZQorc291cmNlIGZpbGUgYW5kIGFkZHMgdGhlIGV4dGVuc2lvbiBzcGVjaWZpZWQgdmlhIHRoZSBleHRlbnNpb24KK2F0dHJpYnV0ZS48L3A+CisKKzxoND5zdHlsZTwvaDQ+CisKKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+CisKKzxwPlRoZSBuZXN0ZWQgc3R5bGUgZWxlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHlvdXIgc3R5bGVzaGVldCBpbiB0ZXJtcworb2YgQW50J3MgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gdHlwZXMuICBXaXRoCit0aGlzIGVsZW1lbnQsIHRoZSBzdHlsZXNoZWV0IHNob3VsZCBiZSBzcGVjaWZpZWQgYXMgYSBuZXN0ZWQgcmVzb3VyY2Ugb3IKK3NpbmdsZS1lbGVtZW50IGNvbGxlY3Rpb24uICBBbHRlcm5hdGl2ZWx5LCB1c2UgdGhlIDxjb2RlPnJlZmlkPC9jb2RlPiB0bworc3BlY2lmeSB0aGUgcmVzb3VyY2Ugb3IgY29sbGVjdGlvbiBhcyBhIHJlZmVyZW5jZS48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKyAgPHByZT4KKyZsdDt4c2x0IGJhc2VkaXI9JnF1b3Q7ZG9jJnF1b3Q7IGRlc3RkaXI9JnF1b3Q7YnVpbGQvZG9jJnF1b3Q7CisgICAgICAgZXh0ZW5zaW9uPSZxdW90Oy5odG1sJnF1b3Q7IHN0eWxlPSZxdW90O3N0eWxlL2FwYWNoZS54c2wmcXVvdDsvJmd0OzwvcHJlPgorICA8aDQ+VXNpbmcgYW4geG1sY2F0YWxvZzwvaDQ+CisgIDxwcmU+CismbHQ7eHNsdCBiYXNlZGlyPSZxdW90O2RvYyZxdW90OyBkZXN0ZGlyPSZxdW90O2J1aWxkL2RvYyZxdW90OworICAgICAgZXh0ZW5zaW9uPSZxdW90Oy5odG1sJnF1b3Q7IHN0eWxlPSZxdW90O3N0eWxlL2FwYWNoZS54c2wmcXVvdDsmZ3Q7CisgICZsdDt4bWxjYXRhbG9nIHJlZmlkPSZxdW90O215Y2F0YWxvZyZxdW90Oy8mZ3Q7CismbHQ7L3hzbHQmZ3Q7CisKKyZsdDt4c2x0IGJhc2VkaXI9JnF1b3Q7ZG9jJnF1b3Q7IGRlc3RkaXI9JnF1b3Q7YnVpbGQvZG9jJnF1b3Q7CisgICBleHRlbnNpb249JnF1b3Q7Lmh0bWwmcXVvdDsgc3R5bGU9JnF1b3Q7c3R5bGUvYXBhY2hlLnhzbCZxdW90OyZndDsKKyAgICZsdDt4bWxjYXRhbG9nJmd0OworICAgICAgICZsdDtkdGQKKyAgICAgICAgIHB1YmxpY0lkPSZxdW90Oy0vL0FyaWVsUGFydG5lcnMvL0RURCBYTUwgQXJ0aWNsZSBWMS4wLy9FTiZxdW90OworICAgICAgICAgbG9jYXRpb249JnF1b3Q7Y29tL2FyaWVscGFydG5lcnMva25vd2xlZGdlYmFzZS9kdGQvYXJ0aWNsZS5kdGQmcXVvdDsvJmd0OworICAgJmx0Oy94bWxjYXRhbG9nJmd0OworJmx0Oy94c2x0Jmd0OworPC9wcmU+CisgIDxoND5Vc2luZyBYU0wgcGFyYW1ldGVyczwvaDQ+Cis8cHJlPgorJmx0O3hzbHQgYmFzZWRpcj0mcXVvdDtkb2MmcXVvdDsgZGVzdGRpcj0mcXVvdDtidWlsZC9kb2MmcXVvdDsKKyAgICAgIGV4dGVuc2lvbj0mcXVvdDsuaHRtbCZxdW90OyBzdHlsZT0mcXVvdDtzdHlsZS9hcGFjaGUueHNsJnF1b3Q7Jmd0OworICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtkYXRlJnF1b3Q7IGV4cHJlc3Npb249JnF1b3Q7MDctMDEtMjAwMCZxdW90Oy8mZ3Q7CismbHQ7L3hzbHQmZ3Q7PC9wcmU+CisKKyAgPHA+VGhlbiBpZiB5b3UgZGVjbGFyZSBhIGdsb2JhbCBwYXJhbWV0ZXIgJnF1b3Q7ZGF0ZSZxdW90OyB3aXRoIHRoZSB0b3AtbGV2ZWwKKyAgZWxlbWVudCAmbHQ7eHNsOnBhcmFtIG5hbWU9JnF1b3Q7ZGF0ZSZxdW90Oy8mZ3Q7LCB0aGUgdmFyaWFibGUKKyAgPGNvZGU+JGRhdGU8L2NvZGU+IHdpbGwgc3Vic2VxdWVudGx5IGhhdmUgdGhlIHZhbHVlIDA3LTAxLTIwMDAuCisgIDwvcD4KKworICA8aDQ+VXNpbmcgb3V0cHV0IHByb3BlcnRpZXM8L2g0PgorPHByZT4KKyZsdDt4c2x0IGluPSZxdW90O2RvYy54bWwmcXVvdDsgb3V0PSZxdW90O2J1aWxkL2RvYy9vdXRwdXQueG1sJnF1b3Q7CisgICAgICBzdHlsZT0mcXVvdDtzdHlsZS9hcGFjaGUueHNsJnF1b3Q7Jmd0OworICAmbHQ7b3V0cHV0cHJvcGVydHkgbmFtZT0mcXVvdDttZXRob2QmcXVvdDsgdmFsdWU9JnF1b3Q7eG1sJnF1b3Q7LyZndDsKKyAgJmx0O291dHB1dHByb3BlcnR5IG5hbWU9JnF1b3Q7c3RhbmRhbG9uZSZxdW90OyB2YWx1ZT0mcXVvdDt5ZXMmcXVvdDsvJmd0OworICAmbHQ7b3V0cHV0cHJvcGVydHkgbmFtZT0mcXVvdDtlbmNvZGluZyZxdW90OyB2YWx1ZT0mcXVvdDtpc284ODU5XzEmcXVvdDsvJmd0OworICAmbHQ7b3V0cHV0cHJvcGVydHkgbmFtZT0mcXVvdDtpbmRlbnQmcXVvdDsgdmFsdWU9JnF1b3Q7eWVzJnF1b3Q7LyZndDsKKyZsdDsveHNsdCZndDsKKzwvcHJlPgorCisgIDxoND5Vc2luZyBmYWN0b3J5IHNldHRpbmdzPC9oND4KKzxwcmU+CismbHQ7eHNsdCBpbj0mcXVvdDtkb2MueG1sJnF1b3Q7IG91dD0mcXVvdDtidWlsZC9kb2Mvb3V0cHV0LnhtbCZxdW90OworICAgICAgc3R5bGU9JnF1b3Q7c3R5bGUvYXBhY2hlLnhzbCZxdW90OyZndDsKKyAgJmx0O2ZhY3RvcnkgbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsJnF1b3Q7Jmd0OworICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4vZmVhdHVyZXMvb3B0aW1pemUmcXVvdDsgdmFsdWU9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7CisgICZsdDsvZmFjdG9yeSZndDsKKyZsdDsveHNsdCZndDs8L3ByZT4KKworICA8aDQ+VXNpbmcgYSBtYXBwZXI8L2g0PgorPHByZT4KKyZsdDt4c2x0IGJhc2VkaXI9JnF1b3Q7aW4mcXVvdDsgZGVzdGRpcj0mcXVvdDtvdXQmcXVvdDsKKyAgICAgIHN0eWxlPSZxdW90O3N0eWxlL2FwYWNoZS54c2wmcXVvdDsmZ3Q7CisgICZsdDttYXBwZXIgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7IGZyb209JnF1b3Q7Ki54bWwuZW4mcXVvdDsgdG89JnF1b3Q7Ki5odG1sLmVuJnF1b3Q7LyZndDsKKyZsdDsveHNsdCZndDs8L3ByZT4KKworICA8aDQ+VXNpbmcgYSBuZXN0ZWQgcmVzb3VyY2UgdG8gZGVmaW5lIHRoZSBzdHlsZXNoZWV0PC9oND4KKyAgICA8cHJlPgorJmx0O3hzbHQgaW49ImRhdGEueG1sIiBvdXQ9IiR7b3V0LmRpcn0vb3V0LnhtbCImZ3Q7CisgICAgJmx0O3N0eWxlJmd0OworICAgICAgICAmbHQ7dXJsIHVybD0iJHtwcmludFBhcmFtcy54c2wudXJsfSIvJmd0OworICAgICZsdDsvc3R5bGUmZ3Q7CisgICAgJmx0O3BhcmFtIG5hbWU9InNldCIgZXhwcmVzc2lvbj0idmFsdWUiLyZndDsKKyZsdDsveHNsdCZndDs8L3ByZT4KKworICA8aDQ+UHJpbnQgdGhlIGN1cnJlbnQgcHJvY2Vzc2VkIGZpbGUgbmFtZTwvaDQ+Cis8cHJlPgorJmx0O3Byb2plY3QmZ3Q7CisgICZsdDt4c2x0IHN0eWxlPSZxdW90O3ByaW50RmlsZW5hbWUueHNsJnF1b3Q7IGRlc3RkaXI9JnF1b3Q7b3V0JnF1b3Q7IGJhc2VkaXI9JnF1b3Q7aW4mcXVvdDsgZXh0ZW5zaW9uPSZxdW90Oy50eHQmcXVvdDsKKyAgICAgICAgZmlsZW5hbWVwYXJhbWV0ZXI9JnF1b3Q7ZmlsZW5hbWUmcXVvdDsKKyAgICAgICAgZmlsZWRpcnBhcmFtZXRlcj0mcXVvdDtmaWxlZGlyJnF1b3Q7CisgIC8mZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7CisKKyZsdDt4c2w6c3R5bGVzaGVldAorICB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OworICB4bWxuczp4c2w9JnF1b3Q7aHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJnF1b3Q7Jmd0OworCisgICAgJmx0O3hzbDpwYXJhbSBuYW1lPSZxdW90O2ZpbGVuYW1lJnF1b3Q7Jmd0OyZsdDsveHNsOnBhcmFtJmd0OworICAgICZsdDt4c2w6cGFyYW0gbmFtZT0mcXVvdDtmaWxlZGlyJnF1b3Q7Jmd0Oy4mbHQ7L3hzbDpwYXJhbSZndDsKKworJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0mcXVvdDsvJnF1b3Q7Jmd0OworICBDdXJyZW50IGZpbGUgaXMgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9JnF1b3Q7JGZpbGVuYW1lJnF1b3Q7LyZndDsgaW4gZGlyZWN0b3J5ICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSZxdW90OyRmaWxlZGlyJnF1b3Q7LyZndDsuCismbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKKworJmx0Oy94c2w6c3R5bGVzaGVldCZndDsKKzwvcHJlPgorCis8L2Jsb2NrcXVvdGU+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3N1YmFudC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3N1YmFudC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NjUyZjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvc3ViYW50Lmh0bWwKQEAgLTAsMCArMSw1OTggQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8dGl0bGU+U3ViYW50CisgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiM1MjVENzYiCisgICAgICBhbGluaz0iIzUyNUQ3NiIgdmxpbms9IiM1MjVENzYiPgorCis8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjQiPgorCisgIDwhLS0gUEFHRSBIRUFERVIgLS0+CisgIDx0cj4KKyAgICA8dGQ+CisgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICA8Zm9udCBzaXplPSIrMyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48c3Ryb25nPlN1YmFudAorIFRhc2s8L3N0cm9uZz48L2ZvbnQ+CisgICAgICAgICAgICA8YnI+PGZvbnQgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5DYWxscyBhIGdpdmVuIHRhcmdldCBmb3IgYWxsIGRlZmluZWQgc3ViLWJ1aWxkcy48L2ZvbnQ+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8IS0tIFBST0pFQ1QgTE9HTyAtLT4KKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPgorICAgICAgICAgICAgICA8aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2FudF9sb2dvX2xhcmdlLmdpZiIgYWxpZ249InJpZ2h0IiBhbHQ9IkFwYWNoZSBBbnQiIGJvcmRlcj0iMCI+CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+PC90YWJsZT4KKyAgICA8L3RkPgorICA8L3RyPgorCisgIDwhLS0gU1RBUlQgUklHSFQgU0lERSBNQUlOIEJPRFkgLS0+CisgIDx0cj4KKyAgICA8dGQgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisKKyAgICAgICAgICA8IS0tIEFwcGx5aW5nIHRhc2svZGVzY3JpcHRpb24gLS0+CisgICAgPCEtLSBTdGFydCBEZXNjcmlwdGlvbiAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJkZXNjcmlwdGlvbiI+CisgICAgICAgICAgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Cis8cD4KKyAgICAgICAgICAgIENhbGxzIGEgZ2l2ZW4gdGFyZ2V0IGZvciBhbGwgZGVmaW5lZCBzdWItYnVpbGRzLgorICAgICAgICAgICAgVGhpcyBpcyBhbiBleHRlbnNpb24KKyAgICAgICAgICAgIG9mIGFudCBmb3IgYnVsayBwcm9qZWN0IGV4ZWN1dGlvbi4KKworICAgICAgICAgICAgPHN0cm9uZz5UaGlzIHRhc2sgbXVzdCBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEKKyAgICAgICAgICAgICAgICA8Y29kZT50YXJnZXQ8L2NvZGU+IGlmIGl0IGludm9rZXMgdGhlIHNhbWUgYnVpbGQgZmlsZSBpdCBpcworICAgICAgICAgICAgICAgIHBhcnQgb2YuPC9zdHJvbmc+CisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvcD4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDwhLS0gU3Vic2VjdGlvbiBoZWFkaW5nIC0tPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9IlVzZSB3aXRoIGRpcmVjdG9yaWVzIj4KKyAgICAgICAgICA8c3Ryb25nPlVzZSB3aXRoIGRpcmVjdG9yaWVzPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDwhLS0gU3Vic2VjdGlvbiBib2R5IC0tPgorICAgICAgPHRyPjx0ZD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgc3ViYW50IGNhbiBiZSB1c2VkIHdpdGggZGlyZWN0b3J5IHNldHMgdG8gZXhlY3V0ZSBhIGJ1aWxkIGZyb20gZGlmZmVyZW50IGRpcmVjdG9yaWVzLgorICAgICAgICAgICAgICAgIDIgZGlmZmVyZW50IG9wdGlvbnMgYXJlIG9mZmVyZWQgOgorICAgICAgICAgICAgPC9wPgorPHVsPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgdG8gcnVuIHRoZSBzYW1lIGJ1aWxkIGZpbGUgPGNvZGU+L3NvbWVwYXRoL290aGVycGF0aC9teWJ1aWxkLnhtbDwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgd2l0aCBkaWZmZXJlbnQgYmFzZSBkaXJlY3RvcmllcywgdXNlIHRoZSBnZW5lcmljYW50ZmlsZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5pZiB5b3Ugd2FudCB0byBydW4gPGNvZGU+ZGlyZWN0b3J5MS9teWJ1aWxkLnhtbDwvY29kZT4sIDxjb2RlPmRpcmVjdG9yeTIvbXlidWlsZC54bWw8L2NvZGU+LCA8Y29kZT4uLi4uPC9jb2RlPiwKKyAgICAgICAgICAgICAgICAgICAgdXNlIHRoZSBhbnRmaWxlIGF0dHJpYnV0ZS4gVGhlIHN1YmFudCB0YXNrIGRvZXMgbm90IHNldCB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHlvdSBpbiB0aGlzIGNhc2UsIGJlY2F1c2UgeW91IGNhbiBzcGVjaWZ5IGl0IGluIGVhY2ggYnVpbGQgZmlsZS4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC91bD4KKworICAgICAgPC90ZD48L3RyPgorICAgIDwvdGFibGU+CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIERlc2NyaXB0aW9uIC0tPgorCisgPCEtLSBJZ25vcmUgLS0+CisKKworCisgICAgPCEtLSBTdGFydCBBdHRyaWJ1dGVzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJhdHRyaWJ1dGVzIj4KKyAgICAgICAgICA8c3Ryb25nPlBhcmFtZXRlcnM8L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgPHRhYmxlPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkF0dHJpYnV0ZTwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5UeXBlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlJlcXVpcmVtZW50PC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPgorCisgICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+CisgICAgICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmFudGZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5CdWlsZCBmaWxlIG5hbWUsIHRvIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIGRpcmVjdG9yaWVzLjxicj4gRGVmYXVsdHMgdG8gImJ1aWxkLnhtbCIuPGJyPiBJZiA8Y29kZT5nZW5lcmljYW50ZmlsZTwvY29kZT4gaXMgc2V0LCB0aGlzIGF0dHJpYnV0ZSBpcyBpZ25vcmVkLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgcm93c3Bhbj0iMTAiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5PcHRpb25hbDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJ1aWxkcGF0aDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldCB0aGUgYnVpbGRwYXRoIHRvIGJlIHVzZWQgdG8gZmluZCBzdWItcHJvamVjdHMuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+UGF0aDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJ1aWxkcGF0aHJlZjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkJ1aWxkcGF0aCB0byB1c2UsIGJ5IHJlZmVyZW5jZS48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5SZWZlcmVuY2U8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5mYWlsb25lcnJvcjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldHMgd2hldGhlciB0byBmYWlsIHdpdGggYSBidWlsZCBleGNlcHRpb24gb24gZXJyb3IsIG9yIGdvIG9uLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5nZW5lcmljYW50ZmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkJ1aWxkIGZpbGUgcGF0aCwgdG8gdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggZGlyZWN0b3JpZXMuPGJyPiBVc2UgPGNvZGU+Z2VuZXJpY2FudGZpbGU8L2NvZGU+LCBpbiBvcmRlciB0byBydW4gdGhlIHNhbWUgYnVpbGQgZmlsZSB3aXRoIGRpZmZlcmVudCBiYXNlZGlycy48YnI+IElmIHRoaXMgYXR0cmlidXRlIGlzIHNldCwgPGNvZGU+YW50ZmlsZTwvY29kZT4gaXMgaWdub3JlZC48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+aW5oZXJpdGFsbDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIgorICAgICAgICAgICAgICAgICAgICAgICAgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5Db3JyZXNwb25kcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+J3MKKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmluaGVyaXRhbGw8L2NvZGU+IGF0dHJpYnV0ZSBidXQgZGVmYXVsdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIGZhbHNlIGluIHRoaXMgdGFzay4uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmluaGVyaXRyZWZzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Q29ycmVzcG9uZHMgdG8gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+J3MgPGNvZGU+aW5oZXJpdHJlZnM8L2NvZGU+IGF0dHJpYnV0ZS48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+b3V0cHV0PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Q29ycmVzcG9uZHMgdG8gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+J3MgPGNvZGU+b3V0cHV0PC9jb2RlPiBhdHRyaWJ1dGUuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+dGFyZ2V0PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisKKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj52ZXJib3NlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+CisgICAgICAgICAgICBFbmFibGUvIGRpc2FibGUgbG9nIG1lc3NhZ2VzIHNob3dpbmcgd2hlbiBlYWNoIHN1Yi1idWlsZCBwYXRoIGlzIGVudGVyZWQvIGV4aXRlZC4KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKworCisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBBdHRyaWJ1dGVzIC0tPgorCisgICAgPCEtLSBTdGFydCBFbGVtZW50cyAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJlbGVtZW50cyI+CisgICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzIGFzIG5lc3RlZCBlbGVtZW50czwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgPCEtLSBTdGFydCBFbGVtZW50IC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM4MjhEQTYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIiBzaXplPSItMSI+CisgICAgICAgICAgPHN0cm9uZz5hbnkgZmlsZXN5c3RlbSBiYXNlZCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbjwvYT48L3N0cm9uZz48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBUaGlzIGluY2x1ZGVzIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sCisgICAgICAgIDxjb2RlPiZsdDtkaXJzZXQmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4KKyAgICAgICAgd2hpY2ggYXJlIHRoZSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMgc3VwcG9ydGVkIHByaW9yCisgICAgICAgIHRvIEFudCAxLjcuCisgPCEtLSBJZ25vcmUgLS0+CisgPCEtLSBJZ25vcmUgLS0+CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+ZGlyc2V0PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EaXJTZXQpPC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgQWRkcyBhIGRpcmVjdG9yeSBzZXQgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguIDxwPiA8ZW0+Tm90ZSB0aGF0IHRoZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHNvIGlmIG9yZGVyIGlzIHNpZ25pZmljYW50LCBvbmUgc2hvdWxkIHVzZSBhIGZpbGUgbGlzdCBpbnN0ZWFkITwvZW0+CisgPCEtLSBJZ25vcmUgLS0+CisgPCEtLSBJZ25vcmUgLS0+CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+ZmlsZWxpc3Q8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVMaXN0KTwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIEFkZHMgYW4gb3JkZXJlZCBmaWxlIGxpc3QgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguIDxwPiA8ZW0+Tm90ZSB0aGF0IGNvbnRyYXJ5IHRvIGZpbGUgYW5kIGRpcmVjdG9yeSBzZXRzLCBmaWxlIGxpc3RzIGNhbiByZWZlcmVuY2Ugbm9uLWV4aXN0ZW50IGZpbGVzIG9yIGRpcmVjdG9yaWVzITwvZW0+CisgPCEtLSBJZ25vcmUgLS0+CisgPCEtLSBJZ25vcmUgLS0+CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+ZmlsZXNldDwvc3Ryb25nPiAob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBBZGRzIGEgZmlsZSBzZXQgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguIDxwPiA8ZW0+Tm90ZSB0aGF0IHRoZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHNvIGlmIG9yZGVyIGlzIHNpZ25pZmljYW50LCBvbmUgc2hvdWxkIHVzZSBhIGZpbGUgbGlzdCBpbnN0ZWFkITwvZW0+CisgPCEtLSBJZ25vcmUgLS0+CisgPCEtLSBJZ25vcmUgLS0+CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+cHJvcGVydHk8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlByb3BlcnR5KTwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIENvcnJlc3BvbmRzIHRvIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPidzIG5lc3RlZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50LgorIDwhLS0gSWdub3JlIC0tPgorIDwhLS0gSWdub3JlIC0tPgorCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnQgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzgyOERBNiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiIHNpemU9Ii0xIj4KKyAgICAgICAgICA8c3Ryb25nPnByb3BlcnR5c2V0PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Qcm9wZXJ0eVNldCk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBDb3JyZXNwb25kcyB0byA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4ncyBuZXN0ZWQgPGNvZGU+Jmx0O3Byb3BlcnR5c2V0Jmd0OzwvY29kZT4gZWxlbWVudC4KKyA8IS0tIElnbm9yZSAtLT4KKyA8IS0tIElnbm9yZSAtLT4KKworICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEVsZW1lbnQgLS0+CisgICAgPCEtLSBTdGFydCBFbGVtZW50IC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM4MjhEQTYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIiBzaXplPSItMSI+CisgICAgICAgICAgPHN0cm9uZz5idWlsZHBhdGg8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgpPC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgQ3JlYXRlcyBhIG5lc3RlZCBidWlsZCBwYXRoLCBhbmQgYWRkIGl0IHRvIHRoZSBpbXBsaWNpdCBidWlsZCBwYXRoLgorIDwhLS0gSWdub3JlIC0tPgorIDwhLS0gSWdub3JlIC0tPgorCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnQgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzgyOERBNiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiIHNpemU9Ii0xIj4KKyAgICAgICAgICA8c3Ryb25nPmJ1aWxkcGF0aGVsZW1lbnQ8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGguUGF0aEVsZW1lbnQpPC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgQ3JlYXRlcyBhIG5lc3RlZCA8Y29kZT4mbHQ7YnVpbGRwYXRoZWxlbWVudCZndDs8L2NvZGU+LCBhbmQgYWRkIGl0IHRvIHRoZSBpbXBsaWNpdCBidWlsZCBwYXRoLgorIDwhLS0gSWdub3JlIC0tPgorIDwhLS0gSWdub3JlIC0tPgorCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KKworCisKKworPCEtLSBtYW51YWxseSB3cml0dGVuIC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+dGFyZ2V0PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQuVGFyZ2V0RWxlbWVudCk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgdGFyZ2V0cyB1c2luZyBuZXN0ZWQgPGNvZGU+Jmx0O3RhcmdldCZndDs8L2NvZGU+IGVsZW1lbnRzCisgICAgICAgIGluc3RlYWQgb2YgdXNpbmcgdGhlIHRhcmdldCBhdHRyaWJ1dGUuICBUaGVzZSB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlmCisgICAgICAgIEFudCBoYWQgYmVlbiBpbnZva2VkIHdpdGggYSBzaW5nbGUgdGFyZ2V0IHdob3NlIGRlcGVuZGVuY2llcyBhcmUgdGhlCisgICAgICAgIHRhcmdldHMgc28gc3BlY2lmaWVkLCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLgorIDwhLS0gSWdub3JlIC0tPgorIDwhLS0gSWdub3JlIC0tPgorICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgY2FsbGVkIHRhcmdldC48L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgIDwvdGFibGU+CisgICAgICA8cD48ZW0+c2luY2UgQW50IDEuNzwvZW0+LjwvcD4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorPCEtLSBtYW51YWxseSB3cml0dGVuIGVuZCAtLT4KKworICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudHMgLS0+CisKKworCisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImV4YW1wbGVzIj4KKyAgICAgICAgICA8c3Ryb25nPkV4YW1wbGVzPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZSBzdHlsZT0iIj4KKyAgICAgICAgPHByZT4KKyAgICAgICAgJmx0O3Byb2plY3QgbmFtZT0ic3ViYW50IiBkZWZhdWx0PSJzdWJhbnQxIiZndDsKKyAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJzdWJhbnQuYnVpbGQiLyZndDsKKyAgICAgICAgICAgICZsdDt0YXJnZXQgbmFtZT0ic3ViYW50MSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3N1YmFudCB0YXJnZXQ9IiImZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJzdWJhbnQxLmJ1aWxkIi8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJub3Qub3ZlcmxvYWRlZCIgdmFsdWU9Im5vdC5vdmVybG9hZGVkIi8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IiovYnVpbGQueG1sIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9zdWJhbnQmZ3Q7CisgICAgICAgICAgICAmbHQ7L3RhcmdldCZndDsKKyAgICAgICAgJmx0Oy9wcm9qZWN0Jmd0OworICAgICAgICA8L3ByZT4KKzxwPgorICAgICAgICAgICAgdGhpcyBzbmlwcGV0IGJ1aWxkIGZpbGUgd2lsbCBydW4gYW50IGluIGVhY2ggc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIHdoZXJlIGEgZmlsZSBjYWxsZWQgYnVpbGQueG1sIGNhbiBiZSBmb3VuZC4KKyAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBidWlsZC5kaXIgd2lsbCBoYXZlIHRoZSB2YWx1ZSBzdWJhbnQxLmJ1aWxkIGluIHRoZSBhbnQgcHJvamVjdHMgY2FsbGVkIGJ5IHN1YmFudC4KKyAgICAgICAgPC9wPgorPHByZT4KKyAgICAgICAgICAmbHQ7c3ViYW50IHRhcmdldD0iIiZndDsKKyAgICAgICAgICAgICAgJmx0O3Byb3BlcnR5c2V0Jmd0OworICAgICAgICAgICAgICAgICAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0idG9wbGV2ZWwiLyZndDsKKyAgICAgICAgICAgICAgICAgICZsdDttYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iZm9vKiIgdG89ImJhcioiLyZndDsKKyAgICAgICAgICAgICAgJmx0Oy9wcm9wZXJ0eXNldCZndDsKKyAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iKi9idWlsZC54bWwiLyZndDsKKyAgICAgICAgICAmbHQ7L3N1YmFudCZndDsKKyAgICAgICAgPC9wcmU+Cis8cD4KKyAgICAgICAgICAgIHRoaXMgc25pcHBldCBidWlsZCBmaWxlIHdpbGwgcnVuIGFudCBpbiBlYWNoIHN1YmRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBkaXJlY3RvcnksCisgICAgICAgICAgICB3aGVyZSBhIGZpbGUgY2FsbGVkIGJ1aWxkLnhtbCBjYW4gYmUgZm91bmQuCisgICAgICAgICAgICBBbGwgcHJvcGVydGllcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoICJmb28iIGFyZSBwYXNzZWQsIHRoZWlyIG5hbWVzIGFyZSBjaGFuZ2VkIHRvIHN0YXJ0IHdpdGggImJhciIgaW5zdGVhZAorICAgICAgICA8L3A+Cis8cHJlPgorICAgICAgICAgICZsdDtzdWJhbnQgdGFyZ2V0PSJjb21waWxlIiBnZW5lcmljYW50ZmlsZT0iL29wdC9wcm9qZWN0L2J1aWxkMS54bWwiJmd0OworICAgICAgICAgICAgICAmbHQ7ZGlyc2V0IGRpcj0iLiIgaW5jbHVkZXM9InByb2plY3RzKiIvJmd0OworICAgICAgICAgICZsdDsvc3ViYW50Jmd0OworICAgICAgICA8L3ByZT4KKzxwPgorICAgICAgICAgICAgYXNzdW1pbmcgdGhlIHN1YmRpcnMgb2YgdGhlIHByb2plY3QgZGlyIGFyZSBjYWxsZWQgcHJvamVjdHMxLCBwcm9qZWN0czIsIHByb2plY3RzMworICAgICAgICAgICAgdGhpcyBzbmlwcGV0IHdpbGwgZXhlY3V0ZSB0aGUgY29tcGlsZSB0YXJnZXQgb2YgL29wdC9wcm9qZWN0L2J1aWxkMS54bWwsCisgICAgICAgICAgICBzZXR0aW5nIHRoZSBiYXNlZGlyIHRvIHByb2plY3RzMSwgcHJvamVjdHMyLCBwcm9qZWN0czMKKyAgICAgICAgPC9wPgorCisgICAgICAgIDwhLS0gbWFudWFsbHkgd3JpdHRlbiAtLT4KKyAgICAgICAgPHA+Tm93IGEgbGl0dGxlIG1vcmUgY29tcGxleCAtIGJ1dCB1c2VmdWwgLSBzY2VuYXJpby4gQXNzdW1lIHRoYXQgd2UgaGF2ZQorICAgICAgICBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOjwvcD4KKyAgICAgICAgPHByZT4KKyAgICAgICAgcm9vdAorICAgICAgICAgIHwgIGNvbW1vbi54bWwKKyAgICAgICAgICB8ICBidWlsZC54bWwKKyAgICAgICAgICB8CisgICAgICAgICAgKy0tIG1vZHVsZXMKKyAgICAgICAgICAgICAgICArLS0gbW9kQQorICAgICAgICAgICAgICAgIHwgICAgICstLSBzcmMKKyAgICAgICAgICAgICAgICArLS0gbW9kQgorICAgICAgICAgICAgICAgICAgICAgICstLSBzcmMKKworICAgICAgICA8dT48Yj5jb21tb24ueG1sOjwvYj48L3U+PGJyPgorICAgICAgICAmbHQ7cHJvamVjdCZndDsKKyAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiAgICAgIHZhbHVlPSJzcmMiLyZndDsKKyAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiICAgIHZhbHVlPSJidWlsZCIvJmd0OworICAgICAgICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiAgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8mZ3Q7CisKKyAgICAgICAgICAgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O21rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIvJmd0OworICAgICAgICAgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAgICAgICAgICZsdDshLS0gbW9yZSB0YXJnZXRzIC0tJmd0OworICAgICAgICAmbHQ7L3Byb2plY3QmZ3Q7CisKKyAgICAgICAgPHU+PGI+YnVpbGQueG1sOjwvYj48L3U+PGJyPgorICAgICAgICAmbHQ7cHJvamVjdCZndDsKKworICAgICAgICAgICAgJmx0O21hY3JvZGVmIG5hbWU9Iml0ZXJhdGUiJmd0OworICAgICAgICAgICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0idGFyZ2V0Ii8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtzdWJhbnQgdGFyZ2V0PSJAe3RhcmdldH0iJmd0OworICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJtb2R1bGVzIiBpbmNsdWRlcz0iKi9idWlsZC54bWwiLyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0Oy9zdWJhbnQmZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworICAgICAgICAgICAgJmx0Oy9tYWNyb2RlZiZndDsKKworCisgICAgICAgICAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiJmd0OworICAgICAgICAgICAgICAgICZsdDtpdGVyYXRlIHRhcmdldD0iY29tcGlsZSIvJmd0OworICAgICAgICAgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAgICAgICAgICZsdDshLS0gbW9yZSB0YXJnZXRzIC0tJmd0OworICAgICAgICAmbHQ7L3Byb2plY3QmZ3Q7CisKKyAgICAgICAgPHU+PGI+bW9kdWxlcy9tb2RBL2J1aWxkLnhtbDo8L2I+PC91Pjxicj4KKyAgICAgICAgJmx0O3Byb2plY3QgbmFtZT0ibW9kQSImZ3Q7CisgICAgICAgICAgICAmbHQ7aW1wb3J0IGZpbGU9Ii4uLy4uL2NvbW1vbi54bWwiLyZndDsKKyAgICAgICAgJmx0Oy9wcm9qZWN0Jmd0OworICAgICAgICA8L3ByZT4KKworICAgICAgICA8cD5UaGlzIHJlc3VsdHMgaW4gdmVyeSBzbWFsbCBidWlsZGZpbGVzIGluIHRoZSBtb2R1bGVzLCBtYWludGFpbmFibGUKKyAgICAgICAgYnVpbGRmaWxlIChjb21tb24ueG1sKSBhbmQgYSBjbGVhciBwcm9qZWN0IHN0cnVjdHVyZS4gQWRkaXRpb25hbGx5CisgICAgICAgIHRoZSByb290IGJ1aWxkZmlsZSBpcyBjYXBhYmxlIHRvIHJ1biB0aGUgd2hvbGUgYnVpbGQgb3ZlciBhbGwKKyAgICAgICAgbW9kdWxlcy4KKyAgICAgICAgPC9wPgorCisgICAgICAgIDxwcmU+CisgICAgICAgICZsdDtzdWJhbnQgZmFpbG9uZXJyb3I9ImZhbHNlIiZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IioqL2J1aWxkLnhtbCIgZXhjbHVkZXM9ImJ1aWxkLnhtbCIvJmd0OworICAgICAgICAgICAgJmx0O3RhcmdldCBuYW1lPSJjbGVhbiIvJmd0OworICAgICAgICAgICAgJmx0O3RhcmdldCBuYW1lPSJidWlsZCIvJmd0OworICAgICAgICAmbHQ7L3N1YmFudCZndDsKKyAgICAgICAgPC9wcmU+CisKKyAgICAgICAgPHA+RG9lcyBhICZxdW90O2NsZWFuIGJ1aWxkJnF1b3Q7IGZvciBlYWNoIHN1YnByb2plY3QuPC9wPgorICAgICAgICA8cD48Yj5IaW50OjwvYj4gYmVjYXVzZSBidWlsZGZpbGVzIGFyZSBwbGFpbiB4bWwsIHlvdSBjb3VsZCBnZW5lcmF0ZSB0aGUKKyAgICAgICAgbWFzdGVyYnVpbGRmaWxlIGZyb20gdGhlIGNvbW1vbiBidWlsZGZpbGUgYnkgdXNpbmcgYSBYU0xUIHRyYW5zZm9ybWF0aW9uOgorICAgICAgICA8L3A+CisKKyAgICAgICAgPHByZT4KKyAgICAgICAgJmx0O3hzbHQgaW49JnF1b3Q7Y29tbW9uLnhtbCZxdW90OworICAgICAgICAgICAgICBvdXQ9JnF1b3Q7bWFzdGVyLnhtbCZxdW90OworICAgICAgICAgICAgICBzdHlsZT0mcXVvdDske2FudC5ob21lfS9ldGMvY29tbW9uMm1hc3Rlci54c2wmcXVvdDsKKyAgICAgICAgLyZndDsKKyAgICAgICAgPC9wcmU+CisKKyAgICAgICAgPCEtLSBtYW51YWxseSB3cml0dGVuIC0tPgorCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKworICAgIDwvdGQ+CisgIDwvdHI+CisgIDwhLS0gRU5EIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorCis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvc3luYy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3N5bmMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM0OTcxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3N5bmMuaHRtbApAQCAtMCwwICsxLDEzNyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5TeW5jIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImdldCI+U3luYzwvYT48L2gyPgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvcD4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKzxwPlN5bmNocm9uaXplIGEgdGFyZ2V0IGRpcmVjdG9yeSBmcm9tIHRoZSBmaWxlcyBkZWZpbmVkIGluIG9uZSBvcgorbW9yZSA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT5zLjwvcD4KKworPHA+QW55IGZpbGUgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkgdGhhdCBoYXMgbm90IGJlZW4gbWF0Y2hlZCBieSBhdAorbGVhc3Qgb25lIG9mIHRoZSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMgZ2V0cyByZW1vdmVkLiAgSS5lLiBpZiB5b3UgZXhjbHVkZSBhCitmaWxlIGluIHlvdXIgc291cmNlcyBhbmQgYSBmaWxlIG9mIHRoYXQgbmFtZSBpcyBwcmVzZW50IGluIHRoZSB0YXJnZXQKK2RpciwgaXQgd2lsbCBnZXQgcmVtb3ZlZCBmcm9tIHRoZSB0YXJnZXQuPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50b2RpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzeW5jIHdpdGggdGhlIHJlc291cmNlIGNvbGxlY3Rpb25zPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+ICAKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3ZlcndyaXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbgorICAgICAgZmlsZXMgYXJlIG5ld2VyLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUVtcHR5RGlyczwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29weSBhbnkgZW1wdHkgZGlyZWN0b3JpZXMgaW5jbHVkZWQgaW4gdGhlIHJlc291cmNlIGNvbGxlY3Rpb24ocykuCisgICAgIDwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5JZiBpcyBzZXQgdG8gZmFsc2UsIGxvZyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGRvIG5vdCBzdG9wIHRoZSBidWlsZCwKKyAgICAgICB3aGVuIG9uZSBvZiB0aGUgbmVzdGVkIGZpbGVzZXRzIHBvaW50cyB0byBhIGRpcmVjdG9yeSB0aGF0CisgICAgICAgZG9lc24ndCBleGlzdC4KKyAgICAgPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5Mb2cgdGhlIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGNvcGllZC48L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ncmFudWxhcml0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gZ2l2ZSBiZWZvcmUKKyAgICBkZWNpZGluZyBhIGZpbGUgaXMgb3V0IG9mIGRhdGUuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugbm90IGV2ZXJ5CisgICAgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgdHJhY2tpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUKKyAgICBtaWxsaXNlY29uZCBsZXZlbC4gRGVmYXVsdCBpcyAwIG1pbGxpc2Vjb25kcywgb3IgMiBzZWNvbmRzIG9uIERPUworICAgIHN5c3RlbXMuICBUaGlzIGNhbiBhbHNvIGJlIHVzZWZ1bCBpZiBzb3VyY2UgYW5kIHRhcmdldCBmaWxlcyBsaXZlCisgICAgb24gc2VwYXJhdGUgbWFjaGluZXMgd2l0aCBjbG9ja3MgYmVpbmcgb3V0IG9mIHN5bmMuICA8ZW0+c2luY2UgQW50CisgICAgMS42LjI8L2VtPi48L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPGg0PmZpbGVzZXQgb3IgYW55IG90aGVyIHJlc291cmNlIGNvbGxlY3Rpb248L2g0PgorPHA+PGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlCitDb2xsZWN0aW9uPC9hPnMgYXJlIHVzZWQgdG8gc2VsZWN0IGdyb3VwcyBvZiBmaWxlcyB0byBjb3B5LiAgVG8gdXNlIGEKK3Jlc291cmNlIGNvbGxlY3Rpb24sIHRoZSA8Y29kZT50b2RpcjwvY29kZT4gYXR0cmlidXRlIG11c3QgYmUgc2V0LjwvcD4KKzxwPlByaW9yIHRvIEFudCAxLjcgb25seSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGhhcyBiZWVuCitzdXBwb3J0ZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC48L3A+CisKKzxoND5wcmVzZXJ2ZUluVGFyZ2V0PC9oND4KKworPHA+U3BlY2lmaWVzIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIGtlcHQgaW4gdGhlIHRhcmdldAorZGlyZWN0b3J5IGV2ZW4gaWYgdGhleSBhcmUgbm90IHByZXNlbnQgaW4gb25lIG9mIHRoZSBzb3VyY2UKK2RpcmVjdG9yaWVzLjwvcD4KKworPHA+VGhpcyBuZXN0ZWQgZWxlbWVudCBpcyBsaWtlIGEgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QKK3N1cHBvcnQgdGhlIGRpciBhdHRyaWJ1dGUgYW5kIHRoZSB1c2VkZWZhdWx0ZXhjbHVkZXMgYXR0cmlidXRlCitkZWZhdWx0cyB0byBmYWxzZS48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7c3luYyB0b2Rpcj0mcXVvdDtzaXRlJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7Z2VuZXJhdGVkLXNpdGUmcXVvdDsvJmd0OworJmx0Oy9zeW5jJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+b3ZlcndyaXRlcyBhbGwgZmlsZXMgaW4gPGVtPnNpdGU8L2VtPiB3aXRoIG5ld2VyIGZpbGVzIGZyb20KKzxlbT5nZW5lcmF0ZWQtc2l0ZTwvZW0+LCBkZWxldGVzIGZpbGVzIGZyb20gPGVtPnNpdGU8L2VtPiB0aGF0IGFyZSBub3QKK3ByZXNlbnQgaW4gPGVtPmdlbmVyYXRlZC1zaXRlPC9lbT4uPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O3N5bmMgdG9kaXI9JnF1b3Q7c2l0ZSZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2dlbmVyYXRlZC1zaXRlJnF1b3Q7LyZndDsKKyAgJmx0O3ByZXNlcnZlaW50YXJnZXQmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi9DVlMvKiomcXVvdDsvJmd0OworICAmbHQ7L3ByZXNlcnZlaW50YXJnZXQmZ3Q7CismbHQ7L3N5bmMmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5vdmVyd3JpdGVzIGFsbCBmaWxlcyBpbiA8ZW0+c2l0ZTwvZW0+IHdpdGggbmV3ZXIgZmlsZXMgZnJvbQorPGVtPmdlbmVyYXRlZC1zaXRlPC9lbT4sIGRlbGV0ZXMgZmlsZXMgZnJvbSA8ZW0+c2l0ZTwvZW0+IHRoYXQgYXJlIG5vdAorcHJlc2VudCBpbiA8ZW0+Z2VuZXJhdGVkLXNpdGU8L2VtPiBidXQga2VlcHMgYWxsIGZpbGVzIGluIGFueQorPGVtPkNWUzwvZW0+IHN1Yi1kaXJlY3RvcnkuPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdGFyLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdGFyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlYThiMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy90YXIuaHRtbApAQCAtMCwwICsxLDI1MCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5UYXIgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0idGFyIj5UYXI8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5DcmVhdGVzIGEgdGFyIGFyY2hpdmUuPC9wPgorPHA+VGhlIDxpPmJhc2VkaXI8L2k+IGF0dHJpYnV0ZSBpcyB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRvIHRhci48L3A+Cis8cD5UaGlzIHRhc2sgaXMgYSA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrPC9hPgorYW5kLCBhcyBzdWNoLCBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlc2V0PC9hPi4gVGhpcworZGVmaW5lcyB3aGljaCBmaWxlcywgcmVsYXRpdmUgdG8gdGhlIDxpPmJhc2VkaXI8L2k+LCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorYXJjaGl2ZS4gVGhlIHRhciB0YXNrIHN1cHBvcnRzIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBGaWxlc2V0IHRvIHJlZmluZSB0aGUKK3NldCBvZiBmaWxlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgaW1wbGljaXQgZmlsZXNldC48L3A+CisKKzxwPkluIGFkZGl0aW9uIHRvIHRoZSBpbXBsaWNpdCBmaWxlc2V0LCB0aGUgdGFyIHRhc2sgc3VwcG9ydHMgbmVzdGVkCisgICAgICByZXNvdXJjZSBjb2xsZWN0aW9ucyBhbmQgYSBzcGVjaWFsIGZvcm0gb2YgZmlsZXNldHMuIFRoZXNlCitmaWxlc2V0cyBhcmUgZXh0ZW5kZWQgdG8gYWxsb3cgY29udHJvbCBvdmVyIHRoZSBhY2Nlc3MgbW9kZSwgdXNlcm5hbWUgYW5kIGdyb3VwbmFtZQordG8gYmUgYXBwbGllZCB0byB0aGUgdGFyIGVudHJpZXMuIFRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiBwcmVwYXJpbmcgYXJjaGl2ZXMgZm9yCitVbml4IHN5c3RlbXMgd2hlcmUgc29tZSBmaWxlcyBuZWVkIHRvIGhhdmUgZXhlY3V0ZSBwZXJtaXNzaW9uLjwvcD4KKworPHA+RWFybHkgdmVyc2lvbnMgb2YgdGFyIGRpZCBub3Qgc3VwcG9ydCBwYXRoIGxlbmd0aHMgZ3JlYXRlciB0aGFuIDEwMAorY2hhcmFjdGVycy4gTW9kZXJuIHZlcnNpb25zIG9mIHRhciBkbyBzbywgYnV0IGluIGluY29tcGF0aWJsZSB3YXlzLgorVGhlIGJlaGF2aW91ciBvZiB0aGUgdGFyIHRhc2sgd2hlbiBpdCBlbmNvdW50ZXJzIHN1Y2ggcGF0aHMgaXMKK2NvbnRyb2xsZWQgYnkgdGhlIDxpPmxvbmdmaWxlPC9pPiBhdHRyaWJ1dGUuCitJZiB0aGUgbG9uZ2ZpbGUgYXR0cmlidXRlIGlzIHNldCB0byA8Y29kZT5mYWlsPC9jb2RlPiwgYW55IGxvbmcgcGF0aHMgd2lsbAorY2F1c2UgdGhlIHRhciB0YXNrIHRvIGZhaWwuICBJZiB0aGUgbG9uZ2ZpbGUgYXR0cmlidXRlIGlzIHNldCB0bworPGNvZGU+dHJ1bmNhdGU8L2NvZGU+LCBhbnkgbG9uZyBwYXRocyB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgMTAwIGNoYXJhY3RlcgorbWF4aW11bSBsZW5ndGggcHJpb3IgdG8gYWRkaW5nIHRvIHRoZSBhcmNoaXZlLiBJZiB0aGUgdmFsdWUgb2YgdGhlIGxvbmdmaWxlCithdHRyaWJ1dGUgaXMgc2V0IHRvIDxjb2RlPm9taXQ8L2NvZGU+IHRoZW4gZmlsZXMgY29udGFpbmluZyBsb25nIHBhdGhzIHdpbGwgYmUKK29taXR0ZWQgZnJvbSB0aGUgYXJjaGl2ZS4gIEVpdGhlciBvcHRpb24gZW5zdXJlcyB0aGF0IHRoZSBhcmNoaXZlIGNhbiBiZQordW50YXJyZWQgYnkgYW55IGNvbXBsaWFudCB2ZXJzaW9uIG9mIHRhci4gSWYgdGhlIGxvc3Mgb2YgcGF0aCBvciBmaWxlCitpbmZvcm1hdGlvbiBpcyBub3QgYWNjZXB0YWJsZSwgYW5kIGl0IHJhcmVseSBpcywgbG9uZ2ZpbGUgbWF5IGJlIHNldCB0byB0aGUKK3ZhbHVlIDxjb2RlPmdudTwvY29kZT4uIFRoZSB0YXIgdGFzayB3aWxsIHRoZW4gcHJvZHVjZSBhIEdOVSB0YXIgZmlsZSB3aGljaAorY2FuIGhhdmUgYXJiaXRyYXJ5IGxlbmd0aCBwYXRocy4gTm90ZSBob3dldmVyLCB0aGF0IHRoZSByZXN1bHRpbmcgYXJjaGl2ZSB3aWxsCitvbmx5IGJlIGFibGUgdG8gYmUgdW50YXJyZWQgd2l0aCBHTlUgdGFyLiAgVGhlIGRlZmF1bHQgZm9yIHRoZSBsb25nZmlsZQorYXR0cmlidXRlIGlzIDxjb2RlPndhcm48L2NvZGU+IHdoaWNoIGJlaGF2ZXMganVzdCBsaWtlIHRoZSBnbnUgb3B0aW9uIGV4Y2VwdAordGhhdCBpdCBwcm9kdWNlcyBhIHdhcm5pbmcgZm9yIGVhY2ggZmlsZSBwYXRoIGVuY291bnRlcmVkIHRoYXQgZG9lcyBub3QgbWF0Y2gKK3RoZSBsaW1pdC48L3A+CisKKzxwPlRoaXMgdGFzayBjYW4gcGVyZm9ybSBjb21wcmVzc2lvbiBieSBzZXR0aW5nIHRoZSBjb21wcmVzc2lvbiBhdHRyaWJ1dGUgdG8gImd6aXAiCitvciAiYnppcDIiLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHRhci1maWxlIHRvIGNyZWF0ZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gdGFyIHRoZSBmaWxlcy48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb25nZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EZXRlcm1pbmVzIGhvdyBsb25nIGZpbGVzICgmZ3Q7MTAwIGNoYXJzKSBhcmUgdG8gYmUKKyAgICAgICBoYW5kbGVkLiAgQWxsb3dhYmxlIHZhbHVlcyBhcmUgJnF1b3Q7dHJ1bmNhdGUmcXVvdDssICZxdW90O2ZhaWwmcXVvdDssCisgICAgICAgJnF1b3Q7d2FybiZxdW90OywgJnF1b3Q7b21pdCZxdW90OyBhbmQgJnF1b3Q7Z251JnF1b3Q7LiAgRGVmYXVsdCBpcworICAgICAgICZxdW90O3dhcm4mcXVvdDsuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90CisgICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3Npb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3Npb24gbWV0aG9kLiAgQWxsb3dhYmxlIHZhbHVlcyBhcmUgCisgICAgICAgJnF1b3Q7bm9uZSZxdW90OywgJnF1b3Q7Z3ppcCZxdW90OyBhbmQgJnF1b3Q7YnppcDImcXVvdDsuICBEZWZhdWx0IGlzCisgICAgICAgJnF1b3Q7bm9uZSZxdW90Oy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+CisKK1RoZSB0YXIgdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy90YXJmaWxlc2V0Lmh0bWwiPnRhcmZpbGVzZXQ8L2E+IGVsZW1lbnRzLiBUaGVzZSBhcmUKK2V4dGVuZGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXRzPC9hPiB3aGljaCwKK2luIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBlbGVtZW50cywgc3VwcG9ydCBvbmUgYWRkaXRpb25hbAorYXR0cmlidXRlcworCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZUxlYWRpbmdTbGFzaGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIGxlYWRpbmcgYC8ncyBzaG91bGQKKyAgICBiZSBwcmVzZXJ2ZWQgaW4gdGhlIGZpbGUgbmFtZXMuIERlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+YW55IG90aGVyIHJlc291cmNlIGNvbGxlY3Rpb248L2g0PgorPHA+PGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlCitDb2xsZWN0aW9uPC9hPnMgYXJlIHVzZWQgdG8gc2VsZWN0IGdyb3VwcyBvZiBmaWxlcyB0byBhcmNoaXZlLjwvcD4KKzxwPlByaW9yIHRvIEFudCAxLjcgb25seSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGhhcyBiZWVuCitzdXBwb3J0ZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPgorJmx0O3RhciBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC50YXImcXVvdDsgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7LyZndDsKKyZsdDtnemlwIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnRhci5neiZxdW90OyBzcmM9JnF1b3Q7JHtkaXN0fS9tYW51YWwudGFyJnF1b3Q7LyZndDs8L3ByZT4KKzxwPnRhcnMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50byBhIGZpbGUgY2FsbGVkIDxjb2RlPm1hbnVhbC50YXI8L2NvZGU+CitpbiB0aGUgPGNvZGU+JHtkaXN0fTwvY29kZT4gIGRpcmVjdG9yeSwgdGhlbiBhcHBsaWVzIHRoZSBnemlwIHRhc2sgdG8gY29tcHJlc3MKK2l0LjwvcD4KKworPHByZT4KKyZsdDt0YXIgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwudGFyJnF1b3Q7CisgICAgIGJhc2VkaXI9JnF1b3Q7aHRkb2NzL21hbnVhbCZxdW90OworICAgICBleGNsdWRlcz0mcXVvdDtteWRvY3MvKiosICoqL3RvZG8uaHRtbCZxdW90OworLyZndDs8L3ByZT4KKzxwPnRhcnMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50byBhIGZpbGUgY2FsbGVkIDxjb2RlPm1hbnVhbC50YXI8L2NvZGU+CitpbiB0aGUgPGNvZGU+JHtkaXN0fTwvY29kZT4gZGlyZWN0b3J5LiBGaWxlcyBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPm15ZG9jczwvY29kZT4sCitvciBmaWxlcyB3aXRoIHRoZSBuYW1lIDxjb2RlPnRvZG8uaHRtbDwvY29kZT4gYXJlIGV4Y2x1ZGVkLjwvcD4KKworPHByZT4KKyZsdDt0YXIgZGVzdGZpbGU9JnF1b3Q7JHtiYXNlZGlyfS9kb2NzLnRhciZxdW90OyZndDsKKyAgJmx0O3RhcmZpbGVzZXQgZGlyPSZxdW90OyR7ZGlyLnNyY30vZG9jcyZxdW90OworICAgICAgICAgICAgICBmdWxscGF0aD0mcXVvdDsvdXNyL2RvYy9hbnQvUkVBRE1FJnF1b3Q7CisgICAgICAgICAgICAgIHByZXNlcnZlTGVhZGluZ1NsYXNoZXM9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O3JlYWRtZS50eHQmcXVvdDsvJmd0OworICAmbHQ7L3RhcmZpbGVzZXQmZ3Q7CisgICZsdDt0YXJmaWxlc2V0IGRpcj0mcXVvdDske2Rpci5zcmN9L2RvY3MmcXVvdDsKKyAgICAgICAgICAgICAgcHJlZml4PSZxdW90Oy91c3IvZG9jL2FudCZxdW90OworICAgICAgICAgICAgICBwcmVzZXJ2ZUxlYWRpbmdTbGFzaGVzPSZxdW90O3RydWUmcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqLmh0bWwmcXVvdDsvJmd0OworICAmbHQ7L3RhcmZpbGVzZXQmZ3Q7CismbHQ7L3RhciZndDs8L3ByZT4KKzxwPgorICBXcml0ZXMgdGhlIGZpbGUgPGNvZGU+ZG9jcy9yZWFkbWUudHh0PC9jb2RlPiBhcworICA8Y29kZT4vdXNyL2RvYy9hbnQvUkVBRE1FPC9jb2RlPiBpbnRvIHRoZSBhcmNoaXZlLiBBbGwKKyAgPGNvZGU+Ki5odG1sPC9jb2RlPiBmaWxlcyBpbiB0aGUgPGNvZGU+ZG9jczwvY29kZT4gZGlyZWN0b3J5IGFyZQorICBwcmVmaXhlZCBieSA8Y29kZT4vdXNyL2RvYy9hbnQ8L2NvZGU+LCBzbyBmb3IgZXhhbXBsZQorICA8Y29kZT5kb2NzL2luZGV4Lmh0bWw8L2NvZGU+IGlzIHdyaXR0ZW4gYXMKKyAgPGNvZGU+L3Vzci9kb2MvYW50L2luZGV4Lmh0bWw8L2NvZGU+IHRvIHRoZSBhcmNoaXZlLgorPC9wPgorCis8cHJlPgorJmx0O3RhciBsb25nZmlsZT0mcXVvdDtnbnUmcXVvdDsKKyAgICAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyJnF1b3Q7Jmd0OworICAmbHQ7dGFyZmlsZXNldCBkaXI9JnF1b3Q7JHtkaXN0Lm5hbWV9Ly4uJnF1b3Q7IG1vZGU9JnF1b3Q7NzU1JnF1b3Q7IHVzZXJuYW1lPSZxdW90O2FudCZxdW90OyBncm91cD0mcXVvdDthbnQmcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDske2Rpc3QubmFtZX0vYm9vdHN0cmFwLnNoJnF1b3Q7LyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyR7ZGlzdC5uYW1lfS9idWlsZC5zaCZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZmlsZXNldCZndDsKKyAgJmx0O3RhcmZpbGVzZXQgZGlyPSZxdW90OyR7ZGlzdC5uYW1lfS8uLiZxdW90OyB1c2VybmFtZT0mcXVvdDthbnQmcXVvdDsgZ3JvdXA9JnF1b3Q7YW50JnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7JHtkaXN0Lm5hbWV9LyoqJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyR7ZGlzdC5uYW1lfS9ib290c3RyYXAuc2gmcXVvdDsvJmd0OworICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7JHtkaXN0Lm5hbWV9L2J1aWxkLnNoJnF1b3Q7LyZndDsKKyAgJmx0Oy90YXJmaWxlc2V0Jmd0OworJmx0Oy90YXImZ3Q7Cis8L3ByZT4KKzxwPlRoaXMgZXhhbXBsZSBzaG93cyBidWlsZGluZyBhIHRhciB3aGljaCB1c2VzIHRoZSBHTlUgZXh0ZW5zaW9ucyBmb3IgbG9uZyBwYXRocyBhbmQKK3doZXJlIHNvbWUgZmlsZXMgbmVlZCB0byBiZSBtYXJrZWQgYXMgZXhlY3V0YWJsZSAobW9kZSA3NTUpCithbmQgdGhlIHJlc3QgYXJlIHVzZSB0aGUgZGVmYXVsdCBtb2RlIChyZWFkLXdyaXRlIGJ5IG93bmVyKS4gVGhlIGZpcnN0CitmaWxlc2V0IHNlbGVjdHMganVzdCB0aGUgZXhlY3V0YWJsZSBmaWxlcy4gVGhlIHNlY29uZCBmaWxlc2V0IG11c3QgZXhjbHVkZQordGhlIGV4ZWN1dGFibGUgZmlsZXMgYW5kIGluY2x1ZGUgYWxsIG90aGVycy4gPC9wPgorCisKKworPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gVGhlIHRhciB0YXNrIGRvZXMgbm90IGVuc3VyZSB0aGF0IGEgZmlsZSBpcyBvbmx5IHNlbGVjdGVkCitieSBvbmUgcmVzb3VyY2UgY29sbGVjdGlvbi4gSWYgdGhlIHNhbWUgZmlsZSBpcyBzZWxlY3RlZCBieSBtb3JlIHRoYW4gb25lIGNvbGxlY3Rpb24sIGl0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCit0YXIgZmlsZSB0d2ljZSwgd2l0aCB0aGUgc2FtZSBwYXRoLjwvcD4KKworPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgcGF0dGVybnMgaW4gdGhlIGluY2x1ZGUgYW5kIGV4Y2x1ZGUKK2VsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpcgorYXR0cmlidXRlIGFzIHdpdGggYWxsIG90aGVyIGZpbGVzZXRzLiAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsCis8Y29kZT4ke2Rpc3QubmFtZX08L2NvZGU+IGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLCBidXQgYSBzaW1wbGUgbmFtZQorb2YgYSBkaXJlY3RvcnksIHNvIDxjb2RlPiR7ZGlzdC5uYW1lfTwvY29kZT4gaXMgYSB2YWxpZCBwYXRoIHJlbGF0aXZlCit0byA8Y29kZT4ke2Rpc3QubmFtZX0vLi48L2NvZGU+LjwvcD4KKworCis8cHJlPgorJmx0O3RhciBkZXN0ZmlsZT0icmVsZWFzZS50YXIuZ3oiIGNvbXByZXNzaW9uPSJnemlwIiZndDsKKyAgJmx0O3ppcGZpbGVzZXQgc3JjPSJyZWxlYXNlLnppcCIvJmd0OworJmx0Oy90YXImZ3Q7Cis8L3ByZT4KKzxwPlJlLXBhY2thZ2VzIGEgWklQIGFyY2hpdmUgYXMgYSBHWmlwIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUuICBJZgorVW5peCBmaWxlIHBlcm1pc3Npb25zIGhhdmUgYmVlbiBzdG9yZWQgYXMgcGFydCBvZiB0aGUgWklQIGZpbGUsIHRoZXkKK3dpbGwgYmUgcmV0YWluZWQgaW4gdGhlIHJlc3VsdGluZyB0YXIgYXJjaGl2ZS48L3A+CisKKworPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgorICBQbGVhc2Ugbm90ZSB0aGUgdGFyIHRhc2sgY3JlYXRlcyBhIHRhciBmaWxlLCBpdCBkb2VzIG5vdCBhcHBlbmQgCisgIHRvIGFuIGV4aXN0aW5nIHRhciBmaWxlLiBUaGUgZXhpc3RpbmcgdGFyIGZpbGUgaXMgcmVwbGFjZWQgaW5zdGVhZC4KKyAgQXMgd2l0aCBtb3N0IHRhc2tzIGluIEFudCwgdGhlIHRhc2sgb25seSB0YWtlcyBhY3Rpb24gaWYgdGhlIG91dHB1dAorICBmaWxlICh0aGUgdGFyIGZpbGUgaW4gdGhpcyBjYXNlKSBpcyBvbGRlciB0aGFuIHRoZSBpbnB1dCBmaWxlcywgb3IKKyAgaWYgdGhlIG91dHB1dCBmaWxlIGRvZXMgbm90IGV4aXN0LgorPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy90YXNrZGVmLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdGFza2RlZi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjcwYWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdGFza2RlZi5odG1sCkBAIC0wLDAgKzEsNDMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+VGFza0RlZiBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJ0YXNrZGVmIj5UYXNrZGVmPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorICA8cD5BZGRzIGEgdGFzayBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QsIHN1Y2ggdGhhdCB0aGlzIG5ldyB0YXNrIGNhbiBiZQorICAgIHVzZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC48L3A+CisgIDxwPlRoaXMgdGFzayBpcyBhIGZvcm0gb2YgPGEgaHJlZj0idHlwZWRlZi5odG1sIj5UeXBlZGVmPC9hPiB3aXRoIHRoZQorICAgIGF0dHJpYnV0ZXMgImFkYXB0ZXIiIGFuZCAiYWRhcHR0byIgc2V0IHRvIHRoZSB2YWx1ZXMgCisgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tBZGFwdGVyIiBhbmQgIm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2siCisgICAgcmVzcGVjdGl2ZWx5LgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7dGFza2RlZiBuYW1lPSZxdW90O215amF2YWRvYyZxdW90OyBjbGFzc25hbWU9JnF1b3Q7Y29tLm15ZG9tYWluLkphdmFkb2NUYXNrJnF1b3Q7LyZndDs8L3ByZT4KKzxwPm1ha2VzIGEgdGFzayBjYWxsZWQgPGNvZGU+bXlqYXZhZG9jPC9jb2RlPiBhdmFpbGFibGUgdG8gQW50LiBUaGUgY2xhc3MgPGNvZGU+Y29tLm15ZG9tYWluLkphdmFkb2NUYXNrPC9jb2RlPgoraW1wbGVtZW50cyB0aGUgdGFzay48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdGVtcGZpbGUuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy90ZW1wZmlsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjU1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdGVtcGZpbGUuaHRtbApAQCAtMCwwICsxLDIzMSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgIAorPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8dGl0bGU+VGVtcGZpbGUKKyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzUyNUQ3NiIKKyAgICAgIGFsaW5rPSIjNTI1RDc2IiB2bGluaz0iIzUyNUQ3NiI+CisKKzx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+CisKKyAgPCEtLSBQQUdFIEhFQURFUiAtLT4KKyAgPHRyPgorICAgIDx0ZD4KKyAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgIDxmb250IHNpemU9IiszIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxzdHJvbmc+VGVtcGZpbGUKKyBUYXNrPC9zdHJvbmc+PC9mb250PgorICAgICAgICAgICAgPGJyPjxmb250IGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+VGhpcyB0YXNrIHNldHMgYSBwcm9wZXJ0eSB0byB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlLjwvZm9udD4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDwhLS0gUFJPSkVDVCBMT0dPIC0tPgorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+CisgICAgICAgICAgICAgIDxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmIiBhbGlnbj0icmlnaHQiIGFsdD0iQXBhY2hlIEFudCIgYm9yZGVyPSIwIj4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICA8L3RkPgorICAgICAgPC90cj48L3RhYmxlPgorICAgIDwvdGQ+CisgIDwvdHI+CisKKyAgPCEtLSBTVEFSVCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KKyAgPHRyPgorICAgIDx0ZCAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKworICAgICAgICAgIDwhLS0gQXBwbHlpbmcgdGFzay9sb25nLWRlc2NyaXB0aW9uIC0tPgorICAgIDwhLS0gU3RhcnQgRGVzY3JpcHRpb24gLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0iZGVzY3JpcHRpb24iPgorICAgICAgICAgIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorCisgICAgICAgICAgVGhpcyB0YXNrIHNldHMgYSBwcm9wZXJ0eSB0byB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlLgorICAgICAgICAgIFVubGlrZSA8Y29kZT5qYXZhLmlvLkZpbGUuY3JlYXRlVGVtcEZpbGU8L2NvZGU+LAorICAgICAgICAgIHRoaXMgdGFzayBkb2VzIG5vdCBhY3R1YWxseSBjcmVhdGUgdGhlIHRlbXBvcmFyeSBmaWxlLCBidXQgaXQgZG9lcyBndWFyYW50ZWUgdGhhdCB0aGUKKyAgICAgICAgICBmaWxlIGRpZCBub3QgZXhpc3Qgd2hlbiB0aGUgdGFzayB3YXMgZXhlY3V0ZWQuCisKKyAgICAgICAgICA8cD5FeGFtcGxlczoKKworICAgICAgICAgIDxwcmU+Jmx0O3RlbXBmaWxlIHByb3BlcnR5PSJ0ZW1wLmZpbGUiLyZndDs8L3ByZT4KKworICAgICAgICAgIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlCisKKyAgICAgICAgICA8cHJlPiZsdDt0ZW1wZmlsZSBwcm9wZXJ0eT0idGVtcC5maWxlIiBzdWZmaXg9Ii54bWwiLyZndDs8L3ByZT4KKworICAgICAgICAgIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHdpdGggdGhlIDxjb2RlPi54bWw8L2NvZGU+IHN1ZmZpeAorCisgICAgICAgICAgPHByZT4mbHQ7dGVtcGZpbGUgcHJvcGVydHk9InRlbXAuZmlsZSIgZGVzdERpcj0iYnVpbGQiLyZndDs8L3ByZT4KKworICAgICAgICAgIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSA8Y29kZT5idWlsZDwvY29kZT4gc3ViZGlyZWN0b3J5CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIERlc2NyaXB0aW9uIC0tPgorCisgPCEtLSBJZ25vcmUgLS0+CisKKworCisgICAgPCEtLSBTdGFydCBBdHRyaWJ1dGVzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJhdHRyaWJ1dGVzIj4KKyAgICAgICAgICA8c3Ryb25nPlBhcmFtZXRlcnM8L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgPHRhYmxlPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkF0dHJpYnV0ZTwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5UeXBlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlJlcXVpcmVtZW50PC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+cHJvcGVydHk8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXRzIHRoZSBwcm9wZXJ0eSB5b3Ugd2lzaCB0byBhc3NpZ24gdGhlIHRlbXBvcmFyeSBmaWxlIHRvLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgcm93c3Bhbj0iMSI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlJlcXVpcmVkPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisKKyAgICA8IS0tIEF0dHJpYnV0ZSBHcm91cCAtLT4gICAgCisgICAgICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmRlc3RkaXI8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIElmIG5vdCBzZXQsIHRoZSBiYXNlZGlyIGRpcmVjdG9yeSBpcyB1c2VkIGluc3RlYWQuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgcm93c3Bhbj0iNSI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPk9wdGlvbmFsPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+cHJlZml4PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0cyB0aGUgb3B0aW9uYWwgcHJlZml4IHN0cmluZyBmb3IgdGhlIHRlbXAgZmlsZS48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zdWZmaXg8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXRzIHRoZSBvcHRpb25hbCBzdWZmaXggc3RyaW5nIGZvciB0aGUgdGVtcCBmaWxlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmRlbGV0ZW9uZXhpdDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPldoZXRoZXIgdGhlIHRlbXAgZmlsZSB3aWxsIGJlIG1hcmtlZCBmb3IgZGVsZXRpb24gb24gbm9ybWFsIGV4aXQgb2YgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIChldmVuIHRob3VnaCB0aGUgZmlsZSBtYXkgbmV2ZXIgYmUgY3JlYXRlZCk7IGRlZmF1bHQgPGVtPmZhbHNlPC9lbT4uIDxzdHJvbmc+U2luY2UgQW50IDEuNzwvc3Ryb25nPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5jcmVhdGVmaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+V2hldGhlciB0aGUgdGVtcCBmaWxlIHNob3VsZCBiZSBjcmVhdGVkIGJ5IHRoaXMgdGFzazsgZGVmYXVsdCA8ZW0+ZmFsc2U8L2VtPi48c3Ryb25nPlNpbmNlIEFudCAxLjg8L3N0cm9uZz48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisKKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEF0dHJpYnV0ZXMgLS0+CisKKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnRzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImVsZW1lbnRzIj4KKyAgICAgICAgICA8c3Ryb25nPlBhcmFtZXRlcnMgYXMgbmVzdGVkIGVsZW1lbnRzPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKworICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudHMgLS0+CisKKworICAgIDwvdGQ+CisgIDwvdHI+CisgIDwhLS0gRU5EIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorCis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdG91Y2guaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy90b3VjaC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZmRlM2IKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdG91Y2guaHRtbApAQCAtMCwwICsxLDE0NSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Ub3VjaCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJ0b3VjaCI+VG91Y2g8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKzxwPkNoYW5nZXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgcmVzb3VyY2UgYW5kIHBvc3NpYmx5IGNyZWF0ZXMgaXQKK2F0IHRoZSBzYW1lIHRpbWUuIEluIGFkZGl0aW9uIHRvIHdvcmtpbmcgd2l0aCBhIHNpbmdsZSBmaWxlLCB0aGlzIFRhc2sKK2NhbiBhbHNvIHdvcmsgb24gPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlLmh0bWwiPnJlc291cmNlczwvYT4gYW5kCityZXNvdXJjZSBjb2xsZWN0aW9ucyAod2hpY2ggYWxzbyBpbmNsdWRlcyBkaXJlY3RvcmllcykuICBQcmlvciB0byBBbnQKKzEuNyBvbmx5IEZpbGVTZXQgb3IgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVsaXN0Lmh0bWwiPkZpbGVsaXN0PC9hPgorKHNpbmNlIEFudCAxLjYpIGhhdmUgYmVlbiBzdXBwb3J0ZWQuPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBmaWxlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Vbmxlc3MgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50CisgICAgICAgaGFzIGJlZW4gc3BlY2lmaWVkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1pbGxpczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIG5ldyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZQorICAgICAgIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBKYW4gMSAxOTcwLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5Oby0tZGF0ZXRpbWUgdGFrZXMKKyAgICAgICBwcmVjZWRlbmNlLCBob3dldmVyIGlmIGJvdGggYXJlIG9taXR0ZWQgdGhlIGN1cnJlbnQgdGltZSBpcyBhc3N1bWVkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRhdGV0aW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgbmV3IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBmaWxlLiBUaGUgCisgICAgICAgc3BlY2lhbCB2YWx1ZSAmcXVvdDtub3cmcXVvdDsgaW5kaWNhdGVzIHRoZSBjdXJyZW50IHRpbWUgCisgICAgICAgKG5vdyBzdXBwb3J0ZWQgc2luY2UgQW50IDEuOCkuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TaW1wbGVEYXRlRm9ybWF0LWNvbXBhdGlibGUgcGF0dGVybiBzdHJpbmcuCisgICAgICAgRGVmYXVsdHMgdG8gTU0vREQvWVlZWSBISDpNTSBBTV9vcl9QTSBvciBNTS9ERC9ZWVlZIEhIOk1NOlNTIEFNX29yX1BNLgorICAgICAgIDxiPlNpbmNlIEFudCAxLjYuMzwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ta2RpcnM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBjcmVhdGUgbm9uZXhpc3RlbnQgcGFyZW50CisgICAgICAgZGlyZWN0b3JpZXMgd2hlbiB0b3VjaGluZyBuZXcgZmlsZXMuIDxiPlNpbmNlIEFudCAxLjYuMzwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+ZmFsc2U8L2k+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBsb2cgdGhlIGNyZWF0aW9uIG9mIG5ldyBmaWxlcy4KKyAgICAgICA8Yj5TaW5jZSBBbnQgMS42LjM8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDxpPnRydWU8L2k+LjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8aDQ+YW55IHJlc291cmNlIGNvbGxlY3Rpb248L2g0PgorCis8cD5Zb3UgY2FuIHVzZSBhbnkgbnVtYmVyIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGVsZW1lbnRzIHRvCitkZWZpbmUgdGhlIHJlc291cmNlcyBmb3IgdGhpcyB0YXNrIGFuZCByZWZlciB0byByZXNvdXJjZXMgZGVmaW5lZAorZWxzZXdoZXJlLiAgPGI+Tm90ZTo8L2I+IHJlc291cmNlcyBwYXNzZWQgdG8gdGhpcyB0YXNrIG11c3QgaW1wbGVtZW50Cit0aGUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlRvdWNoYWJsZTwvY29kZT4KK2ludGVyZmFjZSwgdGhpcyBpcyB0cnVlIGZvciBhbGwgZmlsZXN5c3RlbS1iYXNlZCByZXNvdXJjZXMgbGlrZSB0aG9zZQorcmV0dXJuZWQgYnkgcGF0aCwgZmlsZXNldCBvdCBmaWxlbGlzdC48L3A+CisKKzxwPkZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBkaXJlY3RvcmllcyBtYXRjaGVkIGJ5IG5lc3RlZCBmaWxlc2V0cword2lsbCBiZSAidG91Y2hlZCIgYXMgd2VsbCwgdXNlIGEgJmx0O3R5cGUmZ3Q7IHNlbGVjdG9yIHRvIHN1cHByZXNzCit0aGlzLiAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gZmlsZXNldHMgbmVzdGVkIGludG8gdGhlIHRhc2sgZGlyZWN0bHksCitub3QgdG8gZmlsZXNldHMgbmVzdGVkIGludG8gYSBwYXRoIG9yIGFueSBvdGhlciByZXNvdXJjZQorY29sbGVjdGlvbi48L3A+CisKKzxoND5tYXBwZXI8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjYuMyw8L2VtPiBhIG5lc3RlZCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvbWFwcGVyLmh0bWwiPgorICAgIG1hcHBlcjwvYT4gY2FuIGJlIHNwZWNpZmllZC4gIEZpbGVzIHNwZWNpZmllZCB2aWEgbmVzdGVkCisgICAgPGNvZGU+ZmlsZXNldDwvY29kZT5zLCA8Y29kZT5maWxlbGlzdDwvY29kZT5zLCBvciB0aGUgPGNvZGU+ZmlsZTwvY29kZT4KKyAgICBhdHRyaWJ1dGUgYXJlIG1hcHBlZCB1c2luZyB0aGUgc3BlY2lmaWVkIG1hcHBlci4gIEZvciBlYWNoIGZpbGUgbWFwcGVkLAorICAgIHRoZSByZXN1bHRpbmcgZmlsZXMgYXJlIHRvdWNoZWQuIElmIG5vIHRpbWUgaGFzIGJlZW4gc3BlY2lmaWVkIGFuZAorICAgIHRoZSBvcmlnaW5hbCBmaWxlIGV4aXN0cyBpdHMgdGltZXN0YW1wIHdpbGwgYmUgdXNlZC4KKyAgICBJZiBubyB0aW1lIGhhcyBiZWVuIHNwZWNpZmllZCBhbmQgdGhlIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QgdGhlIAorICAgIGN1cnJlbnQgdGltZSBpcyB1c2VkLiBTaW5jZSBBbnQgMS44IHRoZSB0YXNrIHNldHRpbmdzICg8Y29kZT5taWxsaXM8L2NvZGU+LAorICAgIGFuZCA8Y29kZT5kYXRldGltZTwvY29kZT4pIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGUgdGltZXN0YW1wIG9mIHRoZSBvcmlnaW5hbAorICAgIGZpbGUuPC9wPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7dG91Y2ggZmlsZT0mcXVvdDtteWZpbGUmcXVvdDsvJmd0OzwvcHJlPgorPHA+Y3JlYXRlcyA8Y29kZT5teWZpbGU8L2NvZGU+IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGNoYW5nZXMgdGhlCittb2RpZmljYXRpb24gdGltZSB0byB0aGUgY3VycmVudCB0aW1lLjwvcD4KKzxwcmU+ICAmbHQ7dG91Y2ggZmlsZT0mcXVvdDtteWZpbGUmcXVvdDsgZGF0ZXRpbWU9JnF1b3Q7MDYvMjgvMjAwMCAyOjAyIHBtJnF1b3Q7LyZndDs8L3ByZT4KKzxwPmNyZWF0ZXMgPGNvZGU+bXlmaWxlPC9jb2RlPiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBjaGFuZ2VzIHRoZQorbW9kaWZpY2F0aW9uIHRpbWUgdG8gSnVuLCAyOCAyMDAwIDI6MDIgcG0gKDE0OjAyIGZvciB0aG9zZSB1c2VkIHRvIDI0Citob3VyIHRpbWVzKS48L3A+Cis8cHJlPiAgJmx0O3RvdWNoIGRhdGV0aW1lPSZxdW90OzA5LzEwLzE5NzQgNDozMCBwbSZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjX2RpciZxdW90Oy8mZ3Q7CisgICZsdDsvdG91Y2gmZ3Q7PC9wcmU+Cis8cD5jaGFuZ2VzIHRoZSBtb2RpZmljYXRpb24gdGltZSB0byBPY3QsIDA5IDE5NzQgNDozMCBwbSBvZiBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIAorICBmb3VuZCBpbiA8Y29kZT5zcmNfZGlyPC9jb2RlPi4gPC9wPgorPHByZT4gICZsdDt0b3VjaCBmaWxlPSZxdW90O215ZmlsZSZxdW90OyBkYXRldGltZT0mcXVvdDswNi8yOC8yMDAwIDI6MDI6MTcgcG0mcXVvdDsvJmd0OzwvcHJlPgorPHA+Y3JlYXRlcyA8Y29kZT5teWZpbGU8L2NvZGU+IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGNoYW5nZXMgdGhlCittb2RpZmljYXRpb24gdGltZSB0byBKdW4sIDI4IDIwMDAgMjowMjoxNyBwbSAoMTQ6MDI6MTcgZm9yIHRob3NlIHVzZWQgdG8gMjQKK2hvdXIgdGltZXMpLCBpZiB0aGUgZmlsZXN5c3RlbSBhbGxvd3MgYSBwcmVjaXNpb24gb2Ygb25lIHNlY29uZCAtIGEKK3RpbWUgY2xvc2UgdG8gaXQgb3RoZXJ3aXNlLjwvcD4KKzxwcmU+ICAmbHQ7dG91Y2ggZmlsZT0mcXVvdDtmb28mcXVvdDsmZ3Q7CisgICAgJmx0O21hcHBlciB0eXBlPSZxdW90O2dsb2ImcXVvdDsgZnJvbT0mcXVvdDtmb28mcXVvdDsgdG89JnF1b3Q7YmFyJnF1b3Q7IC8mZ3Q7CisgICZsdDsvdG91Y2gmZ3Q7Cis8L3ByZT4KKzxwPmNyZWF0ZXMgPGNvZGU+YmFyPC9jb2RlPiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBjaGFuZ2VzIHRoZQorbW9kaWZpY2F0aW9uIHRpbWUgdG8gdGhhdCBvZiA8Y29kZT5mb288L2NvZGU+LjwvcD4KKworPHByZT4gICZsdDt0b3VjaCBmaWxlPSZxdW90O2ZvbyZxdW90OyBkYXRldGltZT0mcXVvdDtub3cmcXVvdDsmZ3Q7CisgICAgJmx0O21hcHBlciB0eXBlPSZxdW90O3JlZ2V4cCZxdW90OyBmcm9tPSZxdW90O15zcmMoLiopXC5qYXZhJnF1b3Q7IHRvPSZxdW90O3NoYWRvd1wxLmVtcHR5JnF1b3Q7IC8mZ3Q7CisgICZsdDsvdG91Y2gmZ3Q7Cis8L3ByZT4KKzxwPmNyZWF0ZXMgZmlsZXMgaW4gdGhlIDxjb2RlPnNoYWRvdzwvY29kZT4gZGlyZWN0b3J5IGZvciBldmVyeSBqYXZhIGZpbGUgaW4gdGhlCisgICA8Y29kZT5zcmM8L2NvZGU+IGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBjaGFuZ2VzIHRoZSBtb2RpZmljYXRpb24KKyAgIHRpbWUgb2YgdGhvc2UgZmlsZXMgdG8gdGhlIGN1cnJlbnQgdGltZS48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3RydW5jYXRlLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdHJ1bmNhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk4NTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3RydW5jYXRlLmh0bWwKQEAgLTAsMCArMSwxMDkgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+VHJ1bmNhdGUgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0idG91Y2giPlRydW5jYXRlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorCis8cD5TZXQgdGhlIGxlbmd0aCBvZiBvbmUgb3IgbW9yZSBmaWxlcywgYXMgdGhlIGludGVybWl0dGVudGx5IGF2YWlsYWJsZQorPGNvZGU+dHJ1bmNhdGU8L2NvZGU+IFVuaXggdXRpbGl0eS9mdW5jdGlvbi4gSW4gYWRkaXRpb24gdG8gd29ya2luZyB3aXRoCithIHNpbmdsZSBmaWxlLCB0aGlzIFRhc2sgY2FuIGFsc28gd29yayBvbgorPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlLmh0bWwiPnJlc291cmNlczwvYT4gYW5kIHJlc291cmNlIGNvbGxlY3Rpb25zLgorPHN0cm9uZz5TaW5jZSBBbnQgMS43LjE8L3N0cm9uZz4uCis8L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGZpbGUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlVubGVzcyBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGVsZW1lbnQKKyAgICAgICBoYXMgYmVlbiBzcGVjaWZpZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGVuZ3RoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgbmV3IGZpbGUgbGVuZ3RoIChpbiBieXRlcykgdG8gc2V0LgorICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBzdWZmaXhlcyBhcmUgc3VwcG9ydGVkOgorICAgICAgPHVsPgorICAgICAgICA8bGk+SyA6IEtpbG9ieXRlcyAoMTAyNCBieXRlcyk8L2xpPgorICAgICAgICA8bGk+TSA6IE1lZ2FieXRlcyAoMTAyNCBLKTwvbGk+CisgICAgICAgIDxsaT5HIDogR2lnYWJ5dGVzICgxMDI0IE0pPC9saT4KKyAgICAgICAgPGxpPlQgOiBUZXJhYnl0ZXMgKDEwMjQgRyk8L2xpPgorICAgICAgICA8bGk+UCA6IFBldGFieXRlcyAoMTAyNCBUKTwvbGk+CisgICAgICA8L3VsPgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5BdCBtb3N0IG9uZSBvZiB0aGVzZS4KKyAgICAgIE9taXR0aW5nIGJvdGggaW1wbGllcyA8Y29kZT5sZW5ndGg9IjAiPC9jb2RlPi4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hZGp1c3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgIChhbmQgcG9zaXRpdmUvbmVnYXRpdmUgZGlyZWN0aW9uKQorICAgICAgYnkgd2hpY2ggdG8gYWRqdXN0IGZpbGUgbGVuZ3Rocy4gIFRoZSBzYW1lIHN1ZmZpeGVzIGFyZSBzdXBwb3J0ZWQKKyAgICAgIGZvciB0aGlzIGF0dHJpYnV0ZSBhcyBmb3IgdGhlIDxjb2RlPmxlbmd0aDwvY29kZT4gYXR0cmlidXRlLgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNyZWF0ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNyZWF0ZSBub25leGlzdGVudCBmaWxlcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT4uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWtkaXJzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY3JlYXRlIG5vbmV4aXN0ZW50IHBhcmVudAorICAgICAgIGRpcmVjdG9yaWVzIHdoZW4gY3JlYXRpbmcgbmV3IGZpbGVzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCA8aT5mYWxzZTwvaT4uPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5hbnkgcmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+CisKKzxwPllvdSBjYW4gdXNlIGFueSBudW1iZXIgb2YgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gZWxlbWVudHMgdG8KK2RlZmluZSB0aGUgcmVzb3VyY2VzIGZvciB0aGlzIHRhc2sgYW5kIHJlZmVyIHRvIHJlc291cmNlcyBkZWZpbmVkCitlbHNld2hlcmUuICA8Yj5Ob3RlOjwvYj4gcmVzb3VyY2VzIHBhc3NlZCB0byB0aGlzIHRhc2sgYXJlIGV4cGVjdGVkCit0byBiZSBmaWxlc3lzdGVtLWJhc2VkLjwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKworPHByZT4gICZsdDt0cnVuY2F0ZSBmaWxlPSJmb28iIC8mZ3Q7PC9wcmU+Cis8cD5TZXRzIHRoZSBsZW5ndGggb2YgZmlsZSA8Y29kZT5mb288L2NvZGU+IHRvIHplcm8uPC9wPgorCis8cHJlPiAgJmx0O3RydW5jYXRlIGZpbGU9ImZvbyIgbGVuZ3RoPSIxSyIgLyZndDs8L3ByZT4KKzxwPlNldHMgdGhlIGxlbmd0aCBvZiBmaWxlIDxjb2RlPmZvbzwvY29kZT4gdG8gMSBraWxvYnl0ZSAoMTAyNCBieXRlcykuPC9wPgorCis8cHJlPiAgJmx0O3RydW5jYXRlIGZpbGU9ImZvbyIgYWRqdXN0PSIxSyIgLyZndDs8L3ByZT4KKzxwPkFkanVzdHMgdGhlIGxlbmd0aCBvZiBmaWxlIDxjb2RlPmZvbzwvY29kZT4gdXB3YXJkIGJ5IDEga2lsb2J5dGUuPC9wPgorCis8cHJlPiAgJmx0O3RydW5jYXRlIGZpbGU9ImZvbyIgYWRqdXN0PSItMU0iIC8mZ3Q7PC9wcmU+Cis8cD5BZGp1c3RzIHRoZSBsZW5ndGggb2YgZmlsZSA8Y29kZT5mb288L2NvZGU+IGRvd253YXJkIGJ5IDEgbWVnYWJ5dGUuPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdHN0YW1wLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdHN0YW1wLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxNTE2YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy90c3RhbXAuaHRtbApAQCAtMCwwICsxLDE2MSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5UU3RhbXAgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0idHN0YW1wIj5Uc3RhbXA8L2E+PC9oMj4KKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlNldHMgdGhlIDxjb2RlPkRTVEFNUDwvY29kZT4sIDxjb2RlPlRTVEFNUDwvY29kZT4sIGFuZCA8Y29kZT5UT0RBWTwvY29kZT4KK3Byb3BlcnRpZXMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4gQnkgZGVmYXVsdCwKK3RoZSA8Y29kZT5EU1RBTVA8L2NvZGU+IHByb3BlcnR5IGlzIGluIHRoZQorZm9ybWF0ICZxdW90O3l5eXlNTWRkJnF1b3Q7LCA8Y29kZT5UU1RBTVA8L2NvZGU+IGlzIGluIHRoZQorZm9ybWF0ICZxdW90O2hobW0mcXVvdDssIGFuZCA8Y29kZT5UT0RBWTwvY29kZT4gaXMgaW4gdGhlCitmb3JtYXQgJnF1b3Q7TU1NTSBkZCB5eXl5JnF1b3Q7LiBVc2UgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7Zm9ybWF0Jmd0OzwvY29kZT4gZWxlbWVudAordG8gc3BlY2lmeSBhIGRpZmZlcmVudCBmb3JtYXQuPC9wPgorCis8cD5UaGVzZSBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIGluIHRoZSBidWlsZC1maWxlLCBmb3IgaW5zdGFuY2UsIHRvIGNyZWF0ZQordGltZS1zdGFtcGVkIGZpbGVuYW1lcywgb3IgdXNlZCB0byByZXBsYWNlIHBsYWNlaG9sZGVyIHRhZ3MgaW5zaWRlIGRvY3VtZW50cwordG8gaW5kaWNhdGUsIGZvciBleGFtcGxlLCB0aGUgcmVsZWFzZSBkYXRlLiBUaGUgYmVzdCBwbGFjZSBmb3IgdGhpcyB0YXNrIGlzCitwcm9iYWJseSBpbiBhbiBpbml0aWFsaXphdGlvbiB0YXJnZXQuPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UHJlZml4IHVzZWQgZm9yIGFsbCBwcm9wZXJ0aWVzIHNldC4gVGhlIGRlZmF1bHQgaXMgbm8gcHJlZml4LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+TmVzdGVkIEVsZW1lbnRzPC9oMz4KK1RoZSBUc3RhbXAgdGFzayBzdXBwb3J0cyBhIDxjb2RlPiZsdDtmb3JtYXQmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudCB0aGF0CithbGxvd3MgYSBwcm9wZXJ0eSB0byBiZSBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbiBhIGdpdmVuIGZvcm1hdC4KK1RoZSBkYXRlL3RpbWUgcGF0dGVybnMgYXJlIGFzIGRlZmluZWQgaW4gdGhlIEphdmEKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3RleHQvU2ltcGxlRGF0ZUZvcm1hdC5odG1sIj5TaW1wbGVEYXRlRm9ybWF0PC9hPiBjbGFzcy4KK1RoZSBmb3JtYXQgZWxlbWVudCBhbHNvIGFsbG93cyBvZmZzZXRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHRpbWUgdG8gZ2VuZXJhdGUgZGlmZmVyZW50IHRpbWUgdmFsdWVzLgorPGJyPjxicj4KKzx0YWJsZSB3aWR0aD0iNjAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICBUaGUgcHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgZGF0ZS90aW1lIHN0cmluZyBpbiB0aGUgZ2l2ZW4gcGF0dGVybi4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGF0ZS90aW1lIHBhdHRlcm4gdG8gYmUgdXNlZC4gVGhlIHZhbHVlcyBhcmUgYXMgZGVmaW5lZCBieSB0aGUgSmF2YSBTaW1wbGVEYXRlRm9ybWF0IGNsYXNzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aW1lem9uZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdGltZXpvbmUgdG8gdXNlIGZvciBkaXNwbGF5aW5nIHRpbWUuIFRoZSB2YWx1ZXMgYXJlIGFzIGRlZmluZWQgYnkgdGhlIEphdmEgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9UaW1lWm9uZS5odG1sIj5UaW1lWm9uZTwvYT4gY2xhc3MuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b2Zmc2V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1lcmljIG9mZnNldCB0byB0aGUgY3VycmVudCB0aW1lPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dW5pdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdW5pdCBvZiB0aGUgb2Zmc2V0IHRvIGJlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgIFZhbGlkIFZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5taWxsaXNlY29uZDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+c2Vjb25kPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5taW51dGU8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPmhvdXI8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPmRheTwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+d2VlazwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+bW9udGg8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPnllYXI8L2xpPgorICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGxvY2FsZSB1c2VkIHRvIGNyZWF0ZSBkYXRlL3RpbWUgc3RyaW5nLiBUaGUgZ2VuZXJhbAorICAgICAgZm9ybSBpcyAmcXVvdDtsYW5ndWFnZSwgY291bnRyeSwgdmFyaWFudCZxdW90OyBidXQgZWl0aGVyIHZhcmlhbnQgb3IgdmFyaWFudCBhbmQKKyAgICAgIGNvdW50cnkgbWF5IGJlIG9taXR0ZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBkb2N1bWVudGF0aW9uCisgICAgICBmb3IgdGhlCisgICAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvYXBpL2phdmEvdXRpbC9Mb2NhbGUuaHRtbCI+TG9jYWxlPC9hPgorICAgICAgY2xhc3MuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwcmU+CisgICZsdDt0c3RhbXAvJmd0OworPC9wcmU+CisKKzxwPgorc2V0cyB0aGUgc3RhbmRhcmQgPGNvZGU+RFNUQU1QPC9jb2RlPiwgPGNvZGU+VFNUQU1QPC9jb2RlPiwKK2FuZCA8Y29kZT5UT0RBWTwvY29kZT4gcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gdGhlIGRlZmF1bHQgZm9ybWF0cy48L3A+Cis8cHJlPgorICAmbHQ7dHN0YW1wJmd0OworICAgICZsdDtmb3JtYXQgcHJvcGVydHk9JnF1b3Q7VE9EQVlfVUsmcXVvdDsgcGF0dGVybj0mcXVvdDtkLU1NTU0teXl5eSZxdW90OyBsb2NhbGU9JnF1b3Q7ZW4sVUsmcXVvdDsvJmd0OworICAmbHQ7L3RzdGFtcCZndDsKKzwvcHJlPgorPHA+CitzZXRzIHRoZSBzdGFuZGFyZCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhlIHByb3BlcnR5Cis8Y29kZT5UT0RBWV9VSzwvY29kZT4gd2l0aCB0aGUgZGF0ZS90aW1lIHBhdHRlcm4gJnF1b3Q7ZC1NTU1NLXl5eXkmcXVvdDsKK3VzaW5nIEVuZ2xpc2ggbG9jYWxlIChlZy4gMjEtTWF5LTIwMDEpLjwvcD4KKworPHByZT4KKyAgJmx0O3RzdGFtcCZndDsKKyAgICAgICZsdDtmb3JtYXQgcHJvcGVydHk9JnF1b3Q7dG91Y2gudGltZSZxdW90OyBwYXR0ZXJuPSZxdW90O01NL2RkL3l5eXkgaGg6bW0gYWEmcXVvdDsKKyAgICAgICAgICAgICAgb2Zmc2V0PSZxdW90Oy01JnF1b3Q7IHVuaXQ9JnF1b3Q7aG91ciZxdW90Oy8mZ3Q7CisgICZsdDsvdHN0YW1wJmd0OworPC9wcmU+Cis8cD4KK0NyZWF0ZXMgYSB0aW1lc3RhbXAsIGluIHRoZSBwcm9wZXJ0eSB0b3VjaC50aW1lLCA1IGhvdXJzIGJlZm9yZSB0aGUgY3VycmVudCB0aW1lLiBUaGUgZm9ybWF0IGluIHRoaXMgZXhhbXBsZQoraXMgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHRoZSA8Y29kZT4mbHQ7dG91Y2gmZ3Q7PC9jb2RlPiB0YXNrLiBUaGUgc3RhbmRhcmQgcHJvcGVydGllcyBhcmUgc2V0IGFsc28uPC9wPgorCis8cHJlPgorICAmbHQ7dHN0YW1wIHByZWZpeD0ic3RhcnQiLyZndDsKKzwvcHJlPgorPHA+CitTZXRzIHRocmVlIHByb3BlcnRpZXMgd2l0aCB0aGUgc3RhbmRhcmQgZm9ybWF0cywgcHJlZml4ZWQgd2l0aCAic3RhcnQuIjoKKzxjb2RlPnN0YXJ0LkRTVEFNUDwvY29kZT4sIDxjb2RlPnN0YXJ0LlRTVEFNUDwvY29kZT4sIGFuZCA8Y29kZT5zdGFydC5UT0RBWTwvY29kZT4uPC9wPgorCisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdHlwZWRlZi5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3R5cGVkZWYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY2OWZjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3R5cGVkZWYuaHRtbApAQCAtMCwwICsxLDI0MSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5UeXBlZGVmIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InR5cGVkZWYiPlR5cGVkZWY8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisgIDxwPgorICAgIEFkZHMgYSB0YXNrIG9yIGEgZGF0YSB0eXBlIGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdAorICAgIHN1Y2ggdGhhdCB0aGlzIG5ldyB0eXBlIG9yIHRhc2sgY2FuIGJlIHVzZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgPC9wPgorICA8cD4KKyAgICBBIFRhc2sgaXMgYW55IGNsYXNzIHRoYXQgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrIG9yCisgICAgY2FuIGJlIGFkYXB0ZWQgYXMgYSBUYXNrIHVzaW5nIGFuIGFkYXB0ZXIgY2xhc3MuCisgIDwvcD4KKyAgPHA+CisgICAgRGF0YSB0eXBlcyBhcmUgdGhpbmdzIGxpa2UgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoczwvYT4gb3IKKyAgICA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5maWxlc2V0czwvYT4gdGhhdCBjYW4gYmUgZGVmaW5lZCBhdAorICAgIHRoZSBwcm9qZWN0IGxldmVsIGFuZCByZWZlcmVuY2VkIHZpYSB0aGVpciBJRCBhdHRyaWJ1dGUuCisgICAgQ3VzdG9tIGRhdGEgdHlwZXMgdXN1YWxseSBuZWVkIGN1c3RvbSB0YXNrcyB0byBwdXQgdGhlbSB0byBnb29kIHVzZS4KKyAgPC9wPgorICA8cD4KKyAgICBUd28gYXR0cmlidXRlcyBhcmUgbmVlZGVkIHRvIG1ha2UgYSBkZWZpbml0aW9uOiB0aGUgbmFtZSB0aGF0CisgICAgaWRlbnRpZmllcyB0aGlzIGRhdGEgdHlwZSB1bmlxdWVseSwgYW5kIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgKGluY2x1ZGluZyBpdHMgcGFja2FnZSBuYW1lKSB0aGF0IGltcGxlbWVudHMgdGhpcyB0eXBlLgorICA8L3A+CisgIDxwPgorICAgIFlvdSBjYW4gYWxzbyBkZWZpbmUgYSBncm91cCBvZiBkZWZpbml0aW9ucyBhdCBvbmNlIHVzaW5nIHRoZSBmaWxlIG9yCisgICAgcmVzb3VyY2UgYXR0cmlidXRlcy4gIFRoZXNlIGF0dHJpYnV0ZXMgcG9pbnQgdG8gZmlsZXMgaW4gdGhlIGZvcm1hdCBvZgorICAgIEphdmEgcHJvcGVydHkgZmlsZXMgb3IgYW4geG1sIGZvcm1hdC4KKyAgPC9wPgorICA8cD4KKyAgICBGb3IgcHJvcGVydHkgZmlsZXMgZWFjaCBsaW5lIGRlZmluZXMgYSBzaW5nbGUgZGF0YSB0eXBlIGluIHRoZQorICAgIGZvcm1hdDo8L3A+CisgIDxwcmU+CisgICAgdHlwZW5hbWU9ZnVsbHkucXVhbGlmaWVkLmphdmEuY2xhc3NuYW1lCisgIDwvcHJlPgorICAgIAorICA8cD4KKyAgICBUaGUgeG1sIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlCisgICAgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2FudGxpYi5odG1sIj5BbnRsaWI8L2E+IHNlY3Rpb24uCisgIDwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgZGF0YSB0eXBlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIHRoZSBmaWxlIG9yIHJlc291cmNlIHR5cGUKKyAgICAgIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNwZWNpZmllZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc25hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZ1bGwgY2xhc3MgbmFtZSBpbXBsZW1lbnRpbmcgdGhlIGRhdGEgdHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIHVubGVzcyBmaWxlIG9yIHJlc291cmNlCisgICAgICBoYXZlIGJlZW4gc3BlY2lmaWVkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiB0aGUgZmlsZSB0byBsb2FkIGRlZmluaXRpb25zIGZyb20uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVzb3VyY2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBOYW1lIG9mIHRoZSByZXNvdXJjZSB0byBsb2FkIGRlZmluaXRpb25zIGZyb20uCisgICAgICBJZiBtdWx0aXBsZSByZXNvdXJjZXMgYnkgdGhpcyBuYW1lIGFyZSBmb3VuZCBhbG9uZyB0aGUgY2xhc3NwYXRoLAorICAgICAgYW5kIHRoZSBmb3JtYXQgaXMgInByb3BlcnRpZXMiLCB0aGUgZmlyc3QgcmVzb3VyY2Ugd2lsbCBiZSBsb2FkZWQ7CisgICAgICBvdGhlcndpc2UgYWxsIHN1Y2ggcmVzb3VyY2VzIHdpbGwgYmUgbG9hZGVkLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcm1hdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZm9ybWF0IG9mIHRoZSBmaWxlIG9yIHJlc291cmNlLiBUaGUgdmFsdWVzCisgICAgICBhcmUgInByb3BlcnRpZXMiIG9yICJ4bWwiLiBJZiB0aGUgdmFsdWUgaXMgInByb3BlcnRpZXMiIHRoZSBmaWxlL3Jlc291cmNlCisgICAgICBpcyBhIHByb3BlcnR5IGZpbGUgY29udGFpbnMgbmFtZSB0byBjbGFzc25hbWUgcGFpcnMuIElmIHRoZSB2YWx1ZQorICAgICAgaXMgInhtbCIsIHRoZSBmaWxlL3Jlc291cmNlIGlzIGFuIHhtbCBmaWxlL3Jlc291cmNlIHN0cnVjdHVyZWQgYWNjb3JkaW5nCisgICAgICB0byA8YSBocmVmPSIuLi9Db3JlVHlwZXMvYW50bGliLmh0bWwiPkFudGxpYjwvYT4uCisgICAgICBUaGUgZGVmYXVsdCBpcyAicHJvcGVydGllcyIgdW5sZXNzIHRoZSBmaWxlL3Jlc291cmNlIG5hbWUgZW5kcyB3aXRoCisgICAgICAiLnhtbCIsIGluIHdoaWNoIGNhc2UgdGhlIGZvcm1hdCBhdHRyaWJ1dGUgd2lsbCBoYXZlIHRoZSB2YWx1ZSAieG1sIi4KKyAgICAgIDxiPnNpbmNlIEFudCAxLjY8L2I+CisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4gPHRkIHZhbGlnbj0idG9wIj50aGUgY2xhc3NwYXRoIHRvCisgICAgICB1c2Ugd2hlbiBsb29raW5nIHVwIDxjb2RlPmNsYXNzbmFtZTwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCA8Y29kZT5jbGFzc25hbWU8L2NvZGU+LgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxvYWRlclJlZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgbG9hZGVyIHRoYXQgaXMKKyAgICAgIHVzZWQgdG8gbG9hZCB0aGUgY2xhc3MsIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNwZWNpZmllZCBjbGFzc3BhdGguIFVzZQorICAgICAgdGhpcyB0byBhbGxvdyBtdWx0aXBsZSB0YXNrcy90eXBlcyB0byBiZSBsb2FkZWQgd2l0aCB0aGUgc2FtZSBsb2FkZXIsCisgICAgICBzbyB0aGV5IGNhbiBjYWxsIGVhY2ggb3RoZXIuIDxiPnNpbmNlIEFudCAxLjU8L2I+IDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGFjdGlvbiB0byB0YWtlIGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgaW4gZGVmaW5pbmcgdGhlCisgICAgICB0eXBlLiBUaGUgdmFsdWVzIGFyZSA8aT5mYWlsPC9pPjogY2F1c2UgYSBidWlsZCBleGNlcHRpb247IDxpPnJlcG9ydDwvaT46CisgICAgICBvdXRwdXQgYSB3YXJuaW5nLCBidXQgY29udGludWU7IDxpPmlnbm9yZTwvaT46IGRvIG5vdGhpbmcuCisgICAgICA8Yj5zaW5jZSBBbnQgMS42PC9iPgorICAgICAgQW4gYWRkaXRpb25hbCB2YWx1ZSBpcyA8aT5mYWlsYWxsPC9pPjogY2F1c2UgYWxsIGJlaGF2aW9yIG9mIGZhaWwsCisgICAgICBhcyB3ZWxsIGFzIGEgYnVpbGQgZXhjZXB0aW9uIGZvciB0aGUgcmVzb3VyY2Ugb3IgZmlsZSBhdHRyaWJ1dGUKKyAgICAgIGlmIHRoZSByZXNvdXJjZSBvciBmaWxlIGlzIG5vdCBmb3VuZC4gPGI+c2luY2UgQW50IDEuNzwvYj4KKyAgICAgIFRoZSBkZWZhdWx0IGlzIDxpPmZhaWw8L2k+LgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFkYXB0ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QSBjbGFzcyB0aGF0IGlzIHVzZWQgdG8gYWRhcHQgdGhlIGRlZmluZWQgY2xhc3MgdG8KKyAgICAgIGFub3RoZXIgaW50ZXJmYWNlL2NsYXNzLiBUaGUgYWRhcHRlciBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlCisgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQuVHlwZUFkYXB0ZXIiLiBUaGUgYWRhcHRlciBjbGFzcyB3aWxsIGJlIHVzZWQKKyAgICAgIHRvIHdyYXAgdGhlIGRlZmluZWQgY2xhc3MgdW5sZXNzIHRoZSBkZWZpbmVkIGNsYXNzIGltcGxlbWVudHMvZXh0ZW5kcworICAgICAgdGhlIGNsYXNzIGRlZmluZWQgYnkgdGhlIGF0dHJpYnV0ZSAiYWRhcHR0byIuCisgICAgICBJZiAiYWRhcHR0byIgaXMgbm90IHNldCwgdGhlIGRlZmluZWQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgd3JhcHBlZC4KKyAgICAgIDxiPnNpbmNlIEFudCAxLjY8L2I+CisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YWRhcHR0bzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisgICAgICBhZGFwdGVyIGF0dHJpYnV0ZS4KKyAgICAgIElmIHRoZSBkZWZpbmVkIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudC9leHRlbmQgdGhlIGludGVyZmFjZS9jbGFzcworICAgICAgc3BlY2lmaWVkIGJ5IHRoaXMgYXR0cmlidXRlLCB0aGUgYWRhcHRvciBjbGFzcyB3aWxsIGJlIHVzZWQKKyAgICAgIHRvIHdyYXAgdGhlIGNsYXNzLiA8Yj5zaW5jZSBBbnQgMS42PC9iPgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVyaTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIFRoZSB1cmkgdGhhdCB0aGlzIGRlZmluaXRpb24gc2hvdWxkIGxpdmUgaW4uCisgICAgICA8Yj5zaW5jZSBBbnQgMS42PC9iPgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorICA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKyAgPGg0PmNsYXNzcGF0aDwvaDQ+CisgIDxwPjxjb2RlPlR5cGVkZWY8L2NvZGU+J3MgPGk+Y2xhc3NwYXRoPC9pPiBhdHRyaWJ1dGUgaXMgYSAKKyAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmU8L2E+IGFuZCBjYW4gYWxzbyBiZSBzZXQKKyAgICB2aWEgYSBuZXN0ZWQgPGk+Y2xhc3NwYXRoPC9pPiBlbGVtZW50LjwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKyAgVGhlIGZvbGxvd2luZyBmcmFnbWVudCBkZWZpbmVzIGRlZmluZSBhIHR5cGUgY2FsbGVkIDxpPnVybHNldDwvaT4uCisgIDxwcmU+CisgICAgJmx0O3R5cGVkZWYgbmFtZT0idXJsc2V0IiBjbGFzc25hbWU9ImNvbS5teWRvbWFpbi5VUkxTZXQiLyZndDsgPC9wcmU+CisgIFRoZSBkYXRhIHR5cGUgaXMgbm93IGF2YWlsYWJsZSB0byBBbnQuIFRoZQorICBjbGFzcyA8Y29kZT5jb20ubXlkb21haW4uVVJMU2V0PC9jb2RlPiBpbXBsZW1lbnRzIHRoaXMgdHlwZS48L3A+CisKKworICA8cD4KKyAgICBBc3N1bWluZyBhIGNsYXNzIDxpPm9yZy5hY21lLmFudC5SdW5uYWJsZUFkYXB0ZXI8L2k+IHRoYXQKKyAgICBleHRlbmRzIFRhc2sgYW5kIGltcGxlbWVudHMgPGk+b3JnLmFwYWNoZS50b29scy5hbnQuVHlwZUFkYXB0ZXI8L2k+LAorICAgIGFuZCBpbiB0aGUgZXhlY3V0ZSBtZXRob2QgaW52b2tlcyA8aT5ydW48L2k+IG9uIHRoZSBwcm94aWVkIG9iamVjdCwKKyAgICBvbmUgbWF5IHVzZSBhIFJ1bm5hYmxlIGNsYXNzIGFzIGFuIEFudCB0YXNrLiBUaGUgZm9sbG93aW5nIGZyYWdtZW50CisgICAgZGVmaW5lcyBhIHRhc2sgY2FsbGVkIDxpPnJ1bmNsb2NrPC9pPi4KKyAgPC9wPgorICA8cHJlPgorICAgICZsdDt0eXBlZGVmIG5hbWU9InJ1bmNsb2NrIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLmFjbWUuYW50LlJ1bkNsb2NrIgorICAgICAgICAgICAgIGFkYXB0ZXI9Im9yZy5hY21lLmFudC5SdW5uYWJsZUFkYXB0ZXIiLyZndDsKKyAgPC9wcmU+CisKKworICA8cD4KKyAgICBUaGUgZm9sbG93aW5nIGZyYWdtZW50IHNob3dzIHRoZSB1c2Ugb2YgdGhlIGNsYXNzcGF0aHJlZiBhbmQKKyAgICBsb2FkZXJyZWYgdG8gbG9hZCB1cCB0d28gZGVmaW5pdGlvbnMuCisgIDwvcD4KKyAgPHByZT4KKyAgICAmbHQ7cGF0aCBpZD0ibGliLnBhdGgiJmd0OworICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJsaWIiIGluY2x1ZGVzPSJsaWIvKi5qYXIiLyZndDsKKyAgICAmbHQ7L3BhdGgmZ3Q7CisKKyAgICAmbHQ7dHlwZWRlZiBuYW1lPSJmaWx0ZXIxIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFjbWUuZmlsdGVycy5GaWx0ZXIxIgorICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0ibGliLnBhdGgiCisgICAgICAgICAgICAgbG9hZGVycmVmPSJsaWIucGF0aC5sb2FkZXIiCisgICAgICAgICAgICAgLyZndDsKKyAgICAmbHQ7dHlwZWRlZiBuYW1lPSJmaWx0ZXIyIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFjbWUuZmlsdGVycy5GaWx0ZXIyIgorICAgICAgICAgICAgIGxvYWRlcnJlZj0ibGliLnBhdGgubG9hZGVyIgorICAgICAgICAgICAgIC8mZ3Q7CisgIDwvcHJlPgorICAKKyAgCisgIDxwPgorICAgIElmIHlvdSB3YW50IHRvIGxvYWQgYW4gYW50bGliIGludG8gYSBzcGVjaWFsIHhtbC1uYW1lc3BhY2UsIHRoZSA8dHQ+dXJpPC90dD4gYXR0cmlidXRlCisgICAgaXMgaW1wb3J0YW50OgorICA8L3A+CisgIDxwcmU+CisgICZsdDtwcm9qZWN0IHhtbG5zOmFudGNvbnRyaWI9ImFudGxpYjpuZXQuc2YuYW50Y29udHJpYiImZ3Q7CisgICAgICZsdDt0YXNrZGVmIHVyaT0iYW50bGliOm5ldC5zZi5hbnRjb250cmliIgorICAgICAgICAgICAgICByZXNvdXJjZT0ibmV0L3NmL2FudGNvbnRyaWIvYW50bGliLnhtbCIKKyAgICAgICAgICAgICAgY2xhc3NwYXRoPSJwYXRoL3RvL2FudC1jb250cmliLmphciIvJmd0OworICA8L3ByZT4KKyAgICAgICAgICAgIAorICAKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy91bnBhY2suaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy91bnBhY2suaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBiZDcyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3VucGFjay5odG1sCkBAIC0wLDAgKzEsMTE3IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkdVbnppcC9CVW56aXAyIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InVucGFjayI+R1VuemlwL0JVbnppcDI8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5FeHBhbmRzIGEgcmVzb3VyY2UgcGFja2VkIHVzaW5nIEdaaXAgb3IgQlppcDIuPC9wPgorCis8cD5JZiA8aT5kZXN0PC9pPiBpcyBhIGRpcmVjdG9yeSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gZmlsZSBpcwordGhlIHNhbWUgYXMgPGk+c3JjPC9pPiAod2l0aCB0aGUgJnF1b3Q7Lmd6JnF1b3Q7IG9yICZxdW90Oy5iejImcXVvdDsKK2V4dGVuc2lvbiByZW1vdmVkIGlmIHByZXNlbnQpLiBJZiA8aT5kZXN0PC9pPiBpcyBvbWl0dGVkLCB0aGUgcGFyZW50CitkaXIgb2YgPGk+c3JjPC9pPiBpcyB0YWtlbi4gVGhlIGZpbGUgaXMgb25seSBleHBhbmRlZCBpZiB0aGUgc291cmNlCityZXNvdXJjZSBpcyBuZXdlciB0aGFuIHRoZSBkZXN0aW5hdGlvbiBmaWxlLCBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlCitkb2VzIG5vdCBleGlzdC48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSB0byBleHBhbmQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgb3IgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkZXN0aW5hdGlvbiBmaWxlIG9yIGRpcmVjdG9yeS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+YW55IDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHNpbmdsZSBlbGVtZW50CityZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KKworPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIHVzZWQgYXMgc3JjLjwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7Z3VuemlwIHNyYz0mcXVvdDt0ZXN0LnRhci5neiZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5leHBhbmRzIDxpPnRlc3QudGFyLmd6PC9pPiB0byA8aT50ZXN0LnRhcjwvaT48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2J1bnppcDIgc3JjPSZxdW90O3Rlc3QudGFyLmJ6MiZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5leHBhbmRzIDxpPnRlc3QudGFyLmJ6MjwvaT4gdG8gPGk+dGVzdC50YXI8L2k+PC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtndW56aXAgc3JjPSZxdW90O3Rlc3QudGFyLmd6JnF1b3Q7IGRlc3Q9JnF1b3Q7dGVzdDIudGFyJnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmV4cGFuZHMgPGk+dGVzdC50YXIuZ3o8L2k+IHRvIDxpPnRlc3QyLnRhcjwvaT48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2d1bnppcCBzcmM9JnF1b3Q7dGVzdC50YXIuZ3omcXVvdDsgZGVzdD0mcXVvdDtzdWJkaXImcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+ZXhwYW5kcyA8aT50ZXN0LnRhci5nejwvaT4gdG8gPGk+c3ViZGlyL3Rlc3QudGFyPC9pPiAoYXNzdW1pbmcKK3N1YmRpciBpcyBhIGRpcmVjdG9yeSkuPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtndW56aXAgZGVzdD0mcXVvdDsuJnF1b3Q7Jmd0OworICAmbHQ7dXJsIHVybD0iaHR0cDovL2V4YW1wbGUub3JnL2FyY2hpdmUudGFyLmd6Ii8mZ3Q7CismbHQ7L2d1bnppcCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmRvd25sb2FkcyA8aT5odHRwOi8vZXhhbXBsZS5vcmcvYXJjaGl2ZS50YXIuZ3o8L2k+IGFuZCBleHBhbmRzIGl0Cit0byA8aT5hcmNoaXZlLnRhcjwvaT4gaW4gdGhlIHByb2plY3QncyBiYXNlZGlyIG9uIHRoZSBmbHkuPC9wPgorCis8aDM+UmVsYXRlZCB0YXNrczwvaDM+CisKKzxwcmU+CismbHQ7Z3VuemlwIHNyYz0ic29tZS1hcmNoaXZlLmd6IiBkZXN0PSJzb21lLWRlc3QtZGlyIi8mZ3Q7Cis8L3ByZT4KKworaXMgaWRlbnRpY2FsIHRvCisKKzxwcmU+CismbHQ7Y29weSB0b2Rpcj0ic29tZS1kZXN0LWRpciImZ3Q7CisgICZsdDtnemlwcmVzb3VyY2UmZ3Q7CisgICAgJmx0O2ZpbGUgZmlsZT0ic29tZS1hcmNoaXZlLmd6Ii8mZ3Q7CisgICZsdDsvZ3ppcHJlc291cmNlJmd0OworICAmbHQ7bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IiouZ3oiIHRvPSIqIi8mZ3Q7CismbHQ7L2NvcHkmZ3Q7Cis8L3ByZT4KKworPHA+VGhlIHNhbWUgaXMgYWxzbyB0cnVlIGZvciA8Y29kZT4mbHQ7YnVuemlwMiZndDs8L2NvZGU+IGFuZAorPGNvZGU+Jmx0O2J6aXAycmVzb3VyY2UmZ3Q7PC9jb2RlPi4gIDxjb2RlPiZsdDtjb3B5Jmd0OzwvY29kZT4gb2ZmZXJzCithZGRpdGlvbmFsIGZlYXR1cmVzIGxpa2UgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9maWx0ZXJjaGFpbnMuaHRtbCI+ZmlsdGVyaW5nIGZpbGVzPC9hPiBvbiB0aGUgZmx5LAorYWxsb3dpbmcgYSBmaWxlIHRvIGJlIG1hcHBlZCB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMsIHByZXNlcnZpbmcgdGhlCitsYXN0IG1vZGlmaWVkIHRpbWUgb3IgYSBjb25maWd1cmFibGUgZmlsZSBzeXN0ZW0gdGltZXN0YW1wCitncmFudWxhcml0eS48L3A+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdW50YXIuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy91bnRhci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWYyOGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MvdW50YXIuaHRtbApAQCAtMCwwICsxLDM1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlVudGFyIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InVudGFyIj5VbnRhcjwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlVudGFycyBhIHRhcmZpbGUuPC9wPgorCitUaGlzIGRvY3VtZW50IGhhcyBtb3ZlZCA8QSBIUkVGPSJ1bnppcC5odG1sIj5oZXJlPC9BPgorCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy91bnppcC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3VuemlwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzOTVlMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy91bnppcC5odG1sCkBAIC0wLDAgKzEsMTc4IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlVuemlwIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InVuemlwIj5Vbmphci9VbnRhci9Vbndhci9VbnppcDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlVuemlwcyBhIHppcC0sIHdhci0sIG9yIGphciBmaWxlLjwvcD4KKzxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwiPlBhdHRlcm5TZXQ8L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QgZmlsZXMgdG8gZXh0cmFjdAorPEk+ZnJvbTwvST4gdGhlIGFyY2hpdmUuICBJZiBubyBwYXR0ZXJuc2V0IGlzIHVzZWQsIGFsbCBmaWxlcyBhcmUgZXh0cmFjdGVkLgorPC9wPgorCis8cD48YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UKK0NvbGxlY3Rpb248L2E+cyBtYXkgYmUgdXNlZCB0byBzZWxlY3QgYXJjaGl2ZWQgZmlsZXMgdG8gcGVyZm9ybQordW5hcmNoaXZhbCB1cG9uLiAgT25seSBmaWxlIHN5c3RlbSBiYXNlZCByZXNvdXJjZSBjb2xsZWN0aW9ucyBhcmUKK3N1cHBvcnRlZCBieSBVbmphci9Vbndhci9VbnppcCwgdGhpcyBpbmNsdWRlcyA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4sIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCI+ZmlsZWxpc3Q8L2E+LCA8YQoraHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoPC9hPiwgYW5kIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjZmlsZXMiPmZpbGVzPC9hPi4KK1VudGFyIHN1cHBvcnRzIGFyYml0cmFyeSByZXNvdXJjZSBjb2xsZWN0aW9ucy4KK1ByaW9yIHRvIEFudCAxLjcgb25seSBmaWxlc2V0IGhhcyBiZWVuIHN1cHBvcnRlZCBhcyBhIG5lc3RlZCBlbGVtZW50LjwvcD4KKworPHA+WW91IGNhbiBkZWZpbmUgZmlsZW5hbWUgdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIGEgbmVzdGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBlbGVtZW50LiAgVGhlIGRlZmF1bHQgbWFwcGVyIGlzIHRoZQorPGEgaHJlZj0iLi4vQ29yZVR5cGVzL21hcHBlci5odG1sI2lkZW50aXR5LW1hcHBlciI+aWRlbnRpdHkgbWFwcGVyPC9hPi4KKzwvcD4KKzxwPkZpbGUgcGVybWlzc2lvbnMgd2lsbCBub3QgYmUgcmVzdG9yZWQgb24gZXh0cmFjdGVkIGZpbGVzLjwvcD4KKzxwPlRoZSB1bnRhciB0YXNrIHJlY29nbml6ZXMgdGhlIGxvbmcgcGF0aG5hbWUgZW50cmllcyB1c2VkIGJ5IEdOVSB0YXIuPHA+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YXJjaGl2ZSBmaWxlIHRvIGV4cGFuZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzLCBpZiBmaWxlc2V0cyBhcmUgbm90IHVzZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgdGhlIGV4cGFuZGVkIGZpbGVzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdmVyd3JpdGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T3ZlcndyaXRlIGZpbGVzLCBldmVuIGlmIHRoZXkgYXJlIG5ld2VyIHRoYW4gdGhlCisgICAgICBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gdGhlIGFyY2hpdmUgKHRydWUgb3IgZmFsc2UsIGRlZmF1bHQgaXMKKyAgICAgIHRydWUpLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXByZXNzaW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPk5vdGU6PC9iPiBUaGlzIGF0dHJpYnV0ZSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IKKyAgICB0aGUgPGNvZGU+dW50YXI8L2NvZGU+IHRhc2suPGJyPgorICAgIGNvbXByZXNzaW9uIG1ldGhvZC4gIEFsbG93YWJsZSB2YWx1ZXMgYXJlICZxdW90O25vbmUmcXVvdDssCisgICAgJnF1b3Q7Z3ppcCZxdW90OyBhbmQgJnF1b3Q7YnppcDImcXVvdDsuICBEZWZhdWx0IGlzCisgICAgJnF1b3Q7bm9uZSZxdW90Oy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Ob3RlOjwvYj4gVGhpcyBhdHRyaWJ1dGUgaXMgbm90IGF2YWlsYWJsZSBmb3IKKyAgICB0aGUgPGNvZGU+dW50YXI8L2NvZGU+IHRhc2suPGJyPgorICAgIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdGhhdCBoYXMgYmVlbiB1c2VkIGZvciBmaWxlbmFtZXMKKyAgICBpbnNpZGUgdGhlIHppcCBmaWxlLiAgRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlIDxhCisgICAgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uPGJyPgorICAgIERlZmF1bHRzIHRvICZxdW90O1VURjgmcXVvdDssIHVzZSB0aGUgbWFnaWMgdmFsdWUKKyAgICA8Y29kZT5uYXRpdmUtZW5jb2Rpbmc8L2NvZGU+IGZvciB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlcgorICAgIGVuY29kaW5nLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyZsdDt1bnppcCBzcmM9JnF1b3Q7JHt0b21jYXRfc3JjfS90b29scy1zcmMuemlwJnF1b3Q7IGRlc3Q9JnF1b3Q7JHt0b29scy5ob21lfSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzxwPgorPHByZT4KKyZsdDtndW56aXAgc3JjPSZxdW90O3Rvb2xzLnRhci5neiZxdW90Oy8mZ3Q7CismbHQ7dW50YXIgc3JjPSZxdW90O3Rvb2xzLnRhciZxdW90OyBkZXN0PSZxdW90OyR7dG9vbHMuaG9tZX0mcXVvdDsvJmd0OworPC9wcmU+Cis8cHJlPgorJmx0O3VuemlwIHNyYz0mcXVvdDske3RvbWNhdF9zcmN9L3Rvb2xzLXNyYy56aXAmcXVvdDsKKyAgICAgICBkZXN0PSZxdW90OyR7dG9vbHMuaG9tZX0mcXVvdDsmZ3Q7CisgICAgJmx0O3BhdHRlcm5zZXQmZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi9UZXN0Ki5qYXZhJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7CismbHQ7L3VuemlwJmd0OworPC9wcmU+Cis8cD4KKzxwcmU+CismbHQ7dW56aXAgZGVzdD0mcXVvdDske3Rvb2xzLmhvbWV9JnF1b3Q7Jmd0OworICAgICZsdDtwYXR0ZXJuc2V0Jmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7KiovVGVzdCouamF2YSZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9wYXR0ZXJuc2V0Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouemlwJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi90bXAqLnppcCZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy91bnppcCZndDsKKzwvcHJlPgorPHA+Cis8cHJlPgorJmx0O3VuemlwIHNyYz0mcXVvdDthcGFjaGUtYW50LWJpbi56aXAmcXVvdDsgZGVzdD0mcXVvdDske3Rvb2xzLmhvbWV9JnF1b3Q7Jmd0OworICAgICZsdDtwYXR0ZXJuc2V0Jmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2FwYWNoZS1hbnQvbGliL2FudC5qYXImcXVvdDsvJmd0OworICAgICZsdDsvcGF0dGVybnNldCZndDsKKyAgICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7ZmxhdHRlbiZxdW90Oy8mZ3Q7CismbHQ7L3VuemlwJmd0OworPC9wcmU+CisKKzxoMz5SZWxhdGVkIHRhc2tzPC9oMz4KKworPHByZT4KKyZsdDt1bnppcCBzcmM9InNvbWUtYXJjaGl2ZSIgZGVzdD0ic29tZS1kaXIiJmd0OworICAmbHQ7cGF0dGVybnNldCZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSJzb21lLXBhdHRlcm4iLyZndDsKKyAgJmx0Oy9wYXR0ZXJuc2V0Jmd0OworICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7c29tZS1tYXBwZXImcXVvdDsvJmd0OworJmx0Oy91bnppcCZndDsKKzwvcHJlPgorCitpcyBpZGVudGljYWwgdG8KKworPHByZT4KKyZsdDtjb3B5IHRvZGlyPSJzb21lLWRpciIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiJmd0OworICAmbHQ7emlwZmlsZXNldCBzcmM9InNvbWUtYXJjaGl2ZSImZ3Q7CisgICAgJmx0O3BhdHRlcm5zZXQmZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJzb21lLXBhdHRlcm4iLyZndDsKKyAgICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7CisgICZsdDsvemlwZmlsZXNldCZndDsKKyAgJmx0O21hcHBlciB0eXBlPSZxdW90O3NvbWUtbWFwcGVyJnF1b3Q7LyZndDsKKyZsdDsvY29weSZndDsKKzwvcHJlPgorCis8cD5UaGUgc2FtZSBpcyBhbHNvIHRydWUgZm9yIDxjb2RlPiZsdDt1bnRhciZndDs8L2NvZGU+IGFuZAorPGNvZGU+Jmx0O3RhcmZpbGVzZXQmZ3Q7PC9jb2RlPi4gIDxjb2RlPiZsdDtjb3B5Jmd0OzwvY29kZT4gb2ZmZXJzCithZGRpdGlvbmFsIGZlYXR1cmVzIGxpa2UgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPmZpbHRlcmluZyBmaWxlczwvYT4gb24gdGhlIGZseSwKK2FsbG93aW5nIGEgZmlsZSB0byBiZSBtYXBwZWQgdG8gbXVsdGlwbGUgZGVzdGluYXRpb25zIG9yIGEKK2NvbmZpZ3VyYWJsZSBmaWxlIHN5c3RlbSB0aW1lc3RhbXAgZ3JhbnVsYXJpdHkuPC9wPgorCis8cHJlPiZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7bmV3LmphciZxdW90OyZndDsKKyAgJmx0O3ppcGZpbGVzZXQgc3JjPSZxdW90O29sZC5qYXImcXVvdDsmZ3Q7CisgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDtkby9ub3QvaW5jbHVkZS90aGlzL2NsYXNzJnF1b3Q7LyZndDsKKyAgJmx0Oy96aXBmaWxlc2V0Jmd0OworJmx0Oy96aXAmZ3Q7Cis8L3ByZT4KKzxwPiZxdW90O0RlbGV0ZXMmcXVvdDsgZmlsZXMgZnJvbSBhIHppcGZpbGUuPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy91cHRvZGF0ZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3VwdG9kYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjOTVhYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy91cHRvZGF0ZS5odG1sCkBAIC0wLDAgKzEsMTcxIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlVwdG9kYXRlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InVwdG9kYXRlIj5VcHRvZGF0ZTwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlNldHMgYSBwcm9wZXJ0eSBpZiBhIHRhcmdldCBmaWxlIG9yIHNldCBvZiB0YXJnZXQgZmlsZXMgaXMgbW9yZSB1cC10by1kYXRlCit0aGFuIGEgc291cmNlIGZpbGUgb3Igc2V0IG9mIHNvdXJjZSBmaWxlcy4gQSBzaW5nbGUgc291cmNlIGZpbGUgaXMgc3BlY2lmaWVkCit1c2luZyB0aGUgPGNvZGU+c3JjZmlsZTwvY29kZT4gYXR0cmlidXRlLiBBIHNldCBvZiBzb3VyY2UgZmlsZXMgaXMgc3BlY2lmaWVkCit1c2luZyB0aGUgbmVzdGVkIDxjb2RlPiZsdDtzcmNmaWxlcyZndDs8L2NvZGU+CitlbGVtZW50cy4gVGhlc2UgYXJlIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cywKK3doZXJlYXMgbXVsdGlwbGUgdGFyZ2V0IGZpbGVzIGFyZSBzcGVjaWZpZWQgdXNpbmcgYSBuZXN0ZWQKKzxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCI+PGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+PC9hPiBlbGVtZW50LjwvcD4KKzxwPkJ5IGRlZmF1bHQsIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmCit0aGUgdGltZXN0YW1wIG9mIHRoZSBzb3VyY2UgZmlsZShzKSBpcyBub3QgbW9yZSByZWNlbnQgdGhhbiB0aGUgdGltZXN0YW1wIG9mCit0aGUgY29ycmVzcG9uZGluZyB0YXJnZXQgZmlsZShzKS4gWW91IGNhbiBzZXQgdGhlIHZhbHVlIHRvIHNvbWV0aGluZyBvdGhlcgordGhhbiB0aGUgZGVmYXVsdCBieSBzcGVjaWZ5aW5nIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gYXR0cmlidXRlLjwvcD4KKzxwPklmIGEgPGNvZGU+Jmx0O3NyY2ZpbGVzJmd0OzwvY29kZT4gZWxlbWVudCBpcyB1c2VkLCB3aXRob3V0IGFsc28gc3BlY2lmeWluZworYSA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gZWxlbWVudCwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gdXNlIGEKKzxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCNtZXJnZS1tYXBwZXIiPm1lcmdlIG1hcHBlcjwvYT4sIHdpdGggdGhlCis8Y29kZT50bzwvY29kZT4gYXR0cmlidXRlIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlCis8Y29kZT50YXJnZXRmaWxlPC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgorPHA+Tm9ybWFsbHksIHRoaXMgdGFzayBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWZ1bCB0byBhdm9pZAordGFyZ2V0IGV4ZWN1dGlvbiBkZXBlbmRpbmcgb24gdGhlIHJlbGF0aXZlIGFnZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGVzLjwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBjaGVjayBhZ2FpbnN0IHRoZSB0YXJnZXQgZmlsZShzKS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICA8Y29kZT4mbHQ7c3JjZmlsZXMmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7c3JjcmVzb3VyY2VzJmd0OzwvY29kZT4KKyAgICBlbGVtZW50IGlzIHByZXNlbnQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSBmb3Igd2hpY2ggd2Ugd2FudCB0byBkZXRlcm1pbmUgdGhlIHN0YXR1cy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICAgIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHByZXNlbnQuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0PjxhIG5hbWU9InNyY2ZpbGVzIj5zcmNmaWxlczwvYT48L2g0PgorPHA+VGhlIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZXMmZ3Q7PC9jb2RlPiBlbGVtZW50IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhCitzZXQgb2YgZmlsZXMgdG8gY2hlY2sgYWdhaW5zdCB0aGUgdGFyZ2V0IGZpbGUocykuPC9wPgorCis8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFlvdSBjYW4gc3BlY2lmeSBlaXRoZXIgdGhlIDxjb2RlPnNyY2ZpbGU8L2NvZGU+CithdHRyaWJ1dGUgb3IgbmVzdGVkIDxjb2RlPiZsdDtzcmNmaWxlcyZndDs8L2NvZGU+IGVsZW1lbnRzLCBidXQgbm90IGJvdGguCisKKzxoND48YSBuYW1lPSJzcmNyZXNvdXJjZXMiPnNyY3Jlc291cmNlczwvYT48L2g0PgorPHA+VGhlIG5lc3RlZCA8Y29kZT4mbHQ7c3JjcmVzb3VyY2VzJmd0OzwvY29kZT4gZWxlbWVudCBpcyBhIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjdW5pb24iPnVuaW9uPC9hPiBhbmQgYWxsb3dzIHlvdSB0bworc3BlY2lmeSBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRvIGNoZWNrIGFnYWluc3QgdGhlIHRhcmdldCBmaWxlKHMpLgorPGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvcD4KKworPGg0PjxhIG5hbWU9Im1hcHBlciI+bWFwcGVyPC9hPjwvaDQ+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGFsbG93cyB5b3UgdG8gc3BlY2lmeQorYSBzZXQgb2YgdGFyZ2V0IGZpbGVzIHRvIGNoZWNrIGZvciBiZWluZyB1cC10by1kYXRlIHdpdGggcmVzcGVjdCB0byBhCitzZXQgb2Ygc291cmNlIGZpbGVzLjwvcD4KKyAgIDxwPgorICAgICAgVGhlIG1hcHBlciAidG8iIGF0dHJpYnV0ZSBpcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGZpbGUsIG9yIHRvCisgICAgICB0aGUgImRpciIgYXR0cmlidXRlIG9mIHRoZSBuZXN0ZWQgc3JjZmlsZXMgZWxlbWVudC4KKyAgIDwvcD4KKyAgPHA+CisgICAgPGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+LAorICAgIG9uZSBjYW4gdXNlIGEgZmlsZW5hbWVtYXBwZXIgdHlwZSBpbiBwbGFjZSBvZiB0aGUgbWFwcGVyIGVsZW1lbnQuCisgIDwvcD4KKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiAgJmx0O3VwdG9kYXRlIHByb3BlcnR5PSZxdW90O3htbEJ1aWxkLm5vdFJlcXVpcmVkJnF1b3Q7IHRhcmdldGZpbGU9JnF1b3Q7JHtkZXBsb3l9XHhtbENsYXNzZXMuamFyJnF1b3Q7ICZndDsKKyAgICAmbHQ7c3JjZmlsZXMgZGlyPSAmcXVvdDske3NyY30veG1sJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouZHRkJnF1b3Q7LyZndDsKKyAgJmx0Oy91cHRvZGF0ZSZndDs8L3ByZT4KKzxwPnNldHMgdGhlIHByb3BlcnR5IDxjb2RlPnhtbEJ1aWxkLm5vdFJlcXVpcmVkPC9jb2RlPiB0byA8Y29kZT50cnVlPC9jb2RlPgoraWYgdGhlIDxjb2RlPiR7ZGVwbG95fS94bWxDbGFzc2VzLmphcjwvY29kZT4gZmlsZSBpcyBtb3JlIHVwLXRvLWRhdGUgdGhhbgorYW55IG9mIHRoZSBEVEQgZmlsZXMgaW4gdGhlIDxjb2RlPiR7c3JjfS94bWw8L2NvZGU+IGRpcmVjdG9yeS48L3A+Cis8cD5UaGlzIGNhbiBiZSB3cml0dGVuIGFzOjwvcD4KKzxwcmU+ICAmbHQ7dXB0b2RhdGUgcHJvcGVydHk9JnF1b3Q7eG1sQnVpbGQubm90UmVxdWlyZWQmcXVvdDsmZ3Q7CisgICAgJmx0O3NyY2ZpbGVzIGRpcj0gJnF1b3Q7JHtzcmN9L3htbCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmR0ZCZxdW90Oy8mZ3Q7CisgICAgJmx0O21hcHBlciB0eXBlPSZxdW90O21lcmdlJnF1b3Q7IHRvPSZxdW90OyR7ZGVwbG95fVx4bWxDbGFzc2VzLmphciZxdW90Oy8mZ3Q7CisgICZsdDsvdXB0b2RhdGUmZ3Q7PC9wcmU+CithcyB3ZWxsLgorCitUaGUgPGNvZGU+eG1sQnVpbGQubm90UmVxdWlyZWQ8L2NvZGU+IHByb3BlcnR5IGNhbiB0aGVuIGJlIHVzZWQgaW4gYQorPGNvZGU+Jmx0O3RhcmdldCZndDs8L2NvZGU+IHRhZydzIDxjb2RlPnVubGVzczwvY29kZT4gYXR0cmlidXRlIHRvCitjb25kaXRpb25hbGx5IHJ1biB0aGF0IHRhcmdldC4gRm9yIGV4YW1wbGUsIHJ1bm5pbmcgdGhlIGZvbGxvd2luZyB0YXJnZXQ6PC9wPgorPHByZT4KKyZsdDt0YXJnZXQgbmFtZT0mcXVvdDt4bWxCdWlsZCZxdW90OyBkZXBlbmRzPSZxdW90O2Noa1htbEJ1aWxkJnF1b3Q7IHVubGVzcz0mcXVvdDt4bWxCdWlsZC5ub3RSZXF1aXJlZCZxdW90OyZndDsKKyAgLi4uCismbHQ7L3RhcmdldCZndDsKKzwvcHJlPgord2lsbCBmaXJzdCBydW4gdGhlIDxjb2RlPmNoa1htbEJ1aWxkPC9jb2RlPiB0YXJnZXQsIHdoaWNoIGNvbnRhaW5zCit0aGUgPGNvZGU+Jmx0O3VwdG9kYXRlJmd0OzwvY29kZT4gdGFzayB0aGF0IGRldGVybWluZXMgd2hldGhlcgorPGNvZGU+eG1sQnVpbGQubm90UmVxdWlyZWQ8L2NvZGU+IGdldHMgc2V0LiBUaGUgcHJvcGVydHkgbmFtZWQgaW4KK3RoZSA8Y29kZT51bmxlc3M8L2NvZGU+IGF0dHJpYnV0ZSBpcyB0aGVuIGNoZWNrZWQgZm9yIGJlaW5nIHNldC9ub3Qgc2V0LgorSWYgaXQgZGlkIGdldCBzZXQgKGllLiwgdGhlIGphciBmaWxlIGlzIHVwLXRvLWRhdGUpLAordGhlbiB0aGUgPGNvZGU+eG1sQnVpbGQ8L2NvZGU+IHRhcmdldCB3b24ndCBiZSBydW4uCis8L3A+CisKKzxwPiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBzaW5nbGUgc291cmNlIGZpbGUgYmVpbmcgY2hlY2tlZAorYWdhaW5zdCBhIHNpbmdsZSB0YXJnZXQgZmlsZTo8L3A+Cis8cHJlPiAgJmx0O3VwdG9kYXRlIHByb3BlcnR5PSZxdW90O2lzVXBUb0RhdGUmcXVvdDsKKyAgICAgICAgICAgIHNyY2ZpbGU9JnF1b3Q7L3Vzci9sb2NhbC9iaW4vdGVzdGl0JnF1b3Q7CisgICAgICAgICAgICB0YXJnZXRmaWxlPSZxdW90OyR7YnVpbGR9Ly5mbGFnZmlsZSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzxwPnNldHMgdGhlIHByb3BlcnR5IDxjb2RlPmlzVXBUb0RhdGU8L2NvZGU+IHRvIDxjb2RlPnRydWU8L2NvZGU+CitpZiA8Y29kZT4vdXNyL2xvY2FsL2Jpbi90ZXN0aXQ8L2NvZGU+IGlzIG5vdCBuZXdlciB0aGFuCis8Y29kZT4ke2J1aWxkfS8uZmxhZ2ZpbGU8L2NvZGU+LjwvcD4KKzwvcD4KKyAgPHA+CisgICAgVGhlIGZvbGxvd2luZyBzaG93cyB1c2FnZSBvZiBhIHJlbGF0aXZlIG1hcHBlci4KKyAgPC9wPgorICA8cHJlPgorICAgICZsdDt1cHRvZGF0ZSBwcm9wZXJ0eT0iY2hlY2tVcHRvZGF0ZS51cHRvZGF0ZSImZ3Q7CisgICAgICAmbHQ7c3JjZmlsZXMgZGlyPSJzcmMiIGluY2x1ZGVzPSIqIi8mZ3Q7CisgICAgICAmbHQ7bWFwcGVyIHR5cGU9Im1lcmdlIiB0bz0iLi4vZGVzdC9vdXRwdXQuZG9uZSIvJmd0OworICAgICZsdDsvdXB0b2RhdGUmZ3Q7CisgICAgJmx0O2VjaG8gbWVzc2FnZT0iY2hlY2tVcHRvZGF0ZSByZXN1bHQ6ICR7Y2hlY2tVcHRvZGF0ZS51cHRvZGF0ZX0iLyZndDsKKyAgPC9wcmU+CisgIDxwPgorICAgIFRoZSBwcmV2aW91cyBleGFtcGxlIGNhbiBiZSBhIGJpdCBjb25mdXNpbmcsIHNvIGl0IG1heSBiZSBiZXR0ZXIgdG8KKyAgICB1c2UgYWJzb2x1dGUgcGF0aHM6CisgIDwvcD4KKyAgPHByZT4KKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIGxvY2F0aW9uPSJkZXN0Ii8mZ3Q7CisgICAgJmx0O3VwdG9kYXRlIHByb3BlcnR5PSJjaGVja1VwdG9kYXRlLnVwdG9kYXRlIiZndDsKKyAgICAgICZsdDtzcmNmaWxlcyBkaXI9InNyYyIgaW5jbHVkZXM9IioiLyZndDsKKyAgICAgICZsdDttYXBwZXIgdHlwZT0ibWVyZ2UiIHRvPSIke2Rlc3QuZGlyfS9vdXRwdXQuZG9uZSIvJmd0OworICAgICZsdDsvdXB0b2RhdGUmZ3Q7CisgIDwvcHJlPgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvd2FpdGZvci5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3dhaXRmb3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGZmOGVkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3dhaXRmb3IuaHRtbApAQCAtMCwwICsxLDEzMyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5XYWl0Rm9yIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPldhaXRmb3I8L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkJsb2NrcyBleGVjdXRpb24gdW50aWwgYSBzZXQgb2Ygc3BlY2lmaWVkIGNvbmRpdGlvbnMgYmVjb21lIHRydWUuIFRoaXMgaXMgaW50ZW5kZWQKKyAgdG8gYmUgdXNlZCB3aXRoIHRoZSA8YSBocmVmPSJwYXJhbGxlbC5odG1sIj5wYXJhbGxlbDwvYT4gdGFzayB0bworICBzeW5jaHJvbml6ZSBhIHNldCBvZiBwcm9jZXNzZXMuPC9wPgorPHA+VGhlIGNvbmRpdGlvbnMgdG8gd2FpdCBmb3IgYXJlIGRlZmluZWQgaW4gPGEgaHJlZj0id2FpdGZvci5odG1sI25lc3RlZCI+bmVzdGVkIGVsZW1lbnRzPC9hPiwKK2lmIG11bHRpcGxlIGNvbmRpdGlvbnMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgdGFzayB3aWxsIHdhaXQgdW50aWwgYWxsIGNvbmRpdGlvbnMgYXJlIHRydWUuLjwvcD4KKzxwPjwvcD4KKzxwPklmIGJvdGggbWF4d2FpdCBhbmQgbWF4d2FpdHVuaXQgYXJlIG5vdCBzcGVjaWZpZWQsIHRoZSBtYXh3YWl0IGlzIDMgbWludXRlcyAoMTgwMDAwIG1pbGxpc2Vjb25kcykuPC9wPgorPHA+SWYgdGhlIDxjb2RlPnRpbWVvdXRwcm9wZXJ0eTwvY29kZT4gYXR0cmlidXRlIGhhcyBiZWVuIHNldCwgYQorcHJvcGVydHkgb2YgdGhhdCBuYW1lIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGUgY29uZGl0aW9uIGRpZG4ndCBjb21lCit0cnVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4d2FpdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhbGwgdGhlIHJlcXVpcmVkIGNvbmRpdGlvbnMKKyAgICAgIHRvIGJlY29tZSB0cnVlIGJlZm9yZSBmYWlsaW5nIHRoZSB0YXNrLiBEZWZhdWx0cyB0byAxODAwMDAgbWF4d2FpdHVuaXRzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1heHdhaXR1bml0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1bml0IG9mIHRpbWUgdGhhdCBtdXN0IGJlIHVzZWQgdG8gaW50ZXJwcmV0IHRoZSB2YWx1ZSBvZiB0aGUKKyAgICBtYXh3YWl0IGF0dHJpYnV0ZS4gIERlZmF1bHRzIHRvIG1pbGxpc2Vjb25kLgorICAgICAgICAgICAgICAgICAgICAgVmFsaWQgVmFsdWVzIGFyZQorICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPm1pbGxpc2Vjb25kPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5zZWNvbmQ8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPm1pbnV0ZTwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+aG91cjwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+ZGF5PC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT53ZWVrPC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jaGVja2V2ZXJ5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGJldHdlZW4gZWFjaCB0ZXN0IG9mIHRoZSBjb25kaXRpb25zLgorICAgICAgRGVmYXVsdHMgdG8gNTAwIGNoZWNrZXZlcnl1bml0cy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jaGVja2V2ZXJ5dW5pdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdW5pdCBvZiB0aW1lIHRoYXQgbXVzdCBiZSB1c2VkIHRvIGludGVycHJldCB0aGUgdmFsdWUgb2YgdGhlCisgICAgY2hlY2tldmVyeSBhdHRyaWJ1dGUuICBEZWZhdWx0cyB0byBtaWxsaXNlY29uZC4KKyAgICAgICAgICAgICAgICAgICAgIFZhbGlkIFZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5taWxsaXNlY29uZDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+c2Vjb25kPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5taW51dGU8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPmhvdXI8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPmRheTwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+d2VlazwvbGk+CisgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVvdXRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IGlmIG1heHdhaXQgaGFzCisgICAgICBiZWVuIGV4Y2VlZGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPjxhIG5hbWU9Im5lc3RlZCI+TmVzdGVkIEVsZW1lbnRzPC9hPjwvaDM+CisKKzxwPlRoZSBhdmFpbGFibGUgY29uZGl0aW9ucyB0aGF0IHNhdGlzZnkgdGhlCis8Y29kZT4mbHQ7d2FpdGZvciZndDs8L2NvZGU+IHRhc2sgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGZvciB0aGUKKzxhIGhyZWY9ImNvbmRpdGlvbi5odG1sIj48Y29kZT4mbHQ7Y29uZGl0aW9uJmd0OzwvY29kZT48L2E+IHRhc2suIFNlZQorPGEgaHJlZj0iY29uZGl0aW9ucy5odG1sIj5oZXJlPC9hPiBmb3IgdGhlIGZ1bGwgbGlzdC48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3dhaXRmb3IgbWF4d2FpdD0iMzAiIG1heHdhaXR1bml0PSJzZWNvbmQiJmd0OworICAgICAgICAmbHQ7YXZhaWxhYmxlIGZpbGU9ImVycm9ycy5sb2ciLyZndDsKKyZsdDsvd2FpdGZvciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPndhaXRzIHVwIHRvIDMwIHNlY29uZHMgZm9yIGEgZmlsZSBjYWxsZWQgZXJyb3JzLmxvZyB0byBhcHBlYXIuPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDt3YWl0Zm9yIG1heHdhaXQ9IjMiIG1heHdhaXR1bml0PSJtaW51dGUiIGNoZWNrZXZlcnk9IjUwMCImZ3Q7CisgICAgICAgICZsdDtodHRwIHVybD0iaHR0cDovL2xvY2FsaG9zdC9teWFwcC9pbmRleC5odG1sIi8mZ3Q7CismbHQ7L3dhaXRmb3ImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD53YWl0cyB1cCB0byAzIG1pbnV0ZXMgKGFuZCBjaGVja3MgZXZlcnkgNTAwIG1pbGxpc2Vjb25kcykgZm9yIGEgd2ViIHNlcnZlciBvbiBsb2NhbGhvc3QKKyAgdG8gc2VydmUgdXAgdGhlIHNwZWNpZmllZCBVUkwuPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDt3YWl0Zm9yIG1heHdhaXQ9IjEwIiBtYXh3YWl0dW5pdD0ic2Vjb25kIiZndDsKKyAgICAgICAgJmx0O2FuZCZndDsKKyAgICAgICAgICAgICZsdDtzb2NrZXQgc2VydmVyPSJkYnNlcnZlciIgcG9ydD0iMTUyMSIvJmd0OworICAgICAgICAgICAgJmx0O2h0dHAgdXJsPSJodHRwOi8vd2Vic2VydmVyL215cGFnZS5odG1sIi8mZ3Q7CisgICAgICAgICZsdDsvYW5kJmd0OworJmx0Oy93YWl0Zm9yJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+d2FpdHMgdXAgdG8gMTAgc2Vjb25kcyBmb3IgYSBzZXJ2ZXIgb24gdGhlIGRic2VydmVyIG1hY2hpbmUgdG8gYmVnaW4gbGlzdGVuaW5nCisgIG9uIHBvcnQgMTUyMSBhbmQgZm9yIHRoZSBodHRwOi8vd2Vic2VydmVyL215cGFnZS5odG1sIHdlYiBwYWdlCisgIHRvIGJlY29tZSBhdmFpbGFibGUuPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3dhci5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3dhci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmI1YTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvd2FyLmh0bWwKQEAgLTAsMCArMSwyOTAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+V0FSIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9IndhciI+V2FyPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+QW4gZXh0ZW5zaW9uIG9mIHRoZSA8YSBocmVmPSJqYXIuaHRtbCI+SmFyPC9hPiB0YXNrIHdpdGggc3BlY2lhbAordHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gdGhlCis8Y29kZT5XRUItSU5GL2xpYjwvY29kZT4sIDxjb2RlPldFQi1JTkYvY2xhc3NlczwvY29kZT4gb3IKKzxjb2RlPldFQi1JTkY8L2NvZGU+IGRpcmVjdG9yaWVzIG9mIHRoZSBXZWIgQXBwbGljYXRpb24gQXJjaGl2ZS48L3A+Cis8cD4oVGhlIFdhciB0YXNrIGlzIGEgc2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgdGhlIHBhcnRpY3VsYXIgbGF5b3V0IG9mIGEgV0FSIGZpbGUuCitUaGUgc2FtZSB0aGluZyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSA8aT5wcmVmaXg8L2k+IGFuZCA8aT5mdWxscGF0aDwvaT4KK2F0dHJpYnV0ZXMgb2YgemlwZmlsZXNldHMgaW4gYSBaaXAgb3IgSmFyIHRhc2suKTwvcD4KKzxwPlRoZSBleHRlbmRlZCB6aXBmaWxlc2V0IGVsZW1lbnQgZnJvbSB0aGUgemlwIHRhc2sKKyAgICAod2l0aCBhdHRyaWJ1dGVzIDxpPnByZWZpeDwvaT4sIDxpPmZ1bGxwYXRoPC9pPiwgYW5kIDxpPnNyYzwvaT4pCisgICAgaXMgYXZhaWxhYmxlIGluIHRoZSBXYXIgdGFzay4gVGhlIHRhc2sgaXMgYWxzbyByZXNvdXJjZS1lbmFibGVkCisgICAgYW5kIHdpbGwgYWRkIG5lc3RlZCByZXNvdXJjZXMgYW5kIHJlc291cmNlIGNvbGxlY3Rpb25zIHRvIHRoZSBhcmNoaXZlLjwvcD4KKworPHA+CisgICAgQmVmb3JlIFNlcnZsZXQgQVBJIDIuNS9KYXZhIEVFIDUsIGEgV0VCLUlORi93ZWIueG1sIGZpbGUgd2FzIG1hbmRhdG9yeSBpbiBhCisgICAgV0FSIGZpbGUsIHNvIHRoaXMgdGFzayBmYWlsZWQgaWYgdGhlIDxjb2RlPndlYnhtbDwvY29kZT4gYXR0cmlidXRlIHdhcyBtaXNzaW5nLgorICAgIEFzIHRoZSB3ZWIueG1sIGZpbGUgaXMgbm93IG9wdGlvbmFsLCB0aGUgPGNvZGU+d2VieG1sPC9jb2RlPiBhdHRyaWJ1dGUgbWF5IG5vdworICAgIGJlIG1hZGUgb3B0aW9uYWwuIEhvd2V2ZXIsIGFzIG1vc3QgcmVhbCB3ZWIgYXBwbGljYXRpb25zIGRvIG5lZWQgYSB3ZWIueG1sIGZpbGUsCisgICAgaXQgaXMgbm90IG9wdGlvbmFsIGJ5IGRlZmF1bHQuIFRoZSB0YXNrIHdpbGwgZmFpbCBpZiB0aGUgZmlsZSBpcyBub3QKKyAgICBpbmNsdWRlZCwgdW5sZXNzIHRoZSA8Y29kZT5uZWVkeG1sZmlsZTwvY29kZT4gYXR0cmlidXRlCisgICAgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LiBUaGUgdGFzaworICAgIHdpbGwgd2FybiBpZiBtb3JlIHRoYW4gb25lIHdlYi54bWwgZmlsZSBpcyBhZGRlZCB0byB0aGUgSkFSICAKKyAgICB0aHJvdWdoIHRoZSBmaWxlc2V0cy4KKzwvcD4KKworCis8cD48Yj5QbGVhc2Ugbm90ZSB0aGF0IHRoZSBaaXAgZm9ybWF0IGFsbG93cyBtdWx0aXBsZSBmaWxlcyBvZiB0aGUgc2FtZQorZnVsbHktcXVhbGlmaWVkIG5hbWUgdG8gZXhpc3Qgd2l0aGluIGEgc2luZ2xlIGFyY2hpdmUuICBUaGlzIGhhcyBiZWVuCitkb2N1bWVudGVkIGFzIGNhdXNpbmcgdmFyaW91cyBwcm9ibGVtcyBmb3IgdW5zdXNwZWN0aW5nIHVzZXJzLiAgSWYgeW91IHdpc2gKK3RvIGF2b2lkIHRoaXMgYmVoYXZpb3IgeW91IG11c3Qgc2V0IHRoZSA8Y29kZT5kdXBsaWNhdGU8L2NvZGU+IGF0dHJpYnV0ZQordG8gYSB2YWx1ZSBvdGhlciB0aGFuIGl0cyBkZWZhdWx0LCA8Y29kZT4mcXVvdDthZGQmcXVvdDs8L2NvZGU+LjwvYj48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBXQVIgZmlsZSB0byBjcmVhdGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZSB0d28uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2FyZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48aT5EZXByZWNhdGVkPC9pPiBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZQorICAgIC11c2UgPHR0PmRlc3RmaWxlPC90dD4gaW5zdGVhZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj53ZWJ4bWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHNlcnZsZXQgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIHRvIHVzZSAoV0VCLUlORi93ZWIueG1sKS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgPHR0Pm5lZWR4bWxmaWxlPC90dD4gaXMgdHJ1ZSwKKyAgICB0aGUgZmlsZSBpcyBwdWxsZWQgaW4gdmlhIGEgbmVzdGVkIGZpbGVzZXQsIG9yIGFuIGV4aXN0aW5nIFdBUiBmaWxlIGlzCisgICAgYmVpbmcgdXBkYXRlZC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uZWVkeG1sZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5GbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZSB3ZWIueG1sIGZpbGUgaXMgbmVlZGVkLgorICAgICAgICBJPWl0IHNob3VsZCBiZSBzZXQgdG8gZmFsc2Ugd2hlbiBnZW5lcmF0aW5nCisgICAgICAgIHNlcnZsZXQgMi41KyBXQVIgZmlsZXMgd2l0aG91dCBhIHdlYi54bWwgZmlsZS4KKyAgICAgICAgPGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObyAtZGVmYXVsdCAidHJ1ZSI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBqYXIgdGhlIGZpbGVzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXByZXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5vdCBvbmx5IHN0b3JlIGRhdGEgYnV0IGFsc28gY29tcHJlc3MgdGhlbSwKKyAgICBkZWZhdWx0cyB0byB0cnVlLiAgVW5sZXNzIHlvdSBzZXQgdGhlIDxlbT5rZWVwY29tcHJlc3Npb248L2VtPgorICAgIGF0dHJpYnV0ZSB0byBmYWxzZSwgdGhpcyB3aWxsIGFwcGx5IHRvIHRoZSBlbnRpcmUgYXJjaGl2ZSwgbm90CisgICAgb25seSB0aGUgZmlsZXMgeW91J3ZlIGFkZGVkIHdoaWxlIHVwZGF0aW5nLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXBjb21wcmVzc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Gb3IgZW50cmllcyBjb21pbmcgZnJvbSBleGlzdGluZyBhcmNoaXZlcyAobGlrZQorICAgIG5lc3RlZCA8ZW0+emlwZmlsZXNldDwvZW0+cyBvciB3aGlsZSB1cGRhdGluZyB0aGUgYXJjaGl2ZSksIGtlZXAKKyAgICB0aGUgY29tcHJlc3Npb24gYXMgaXQgaGFzIGJlZW4gb3JpZ2luYWxseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQorICAgIDxlbT5jb21wcmVzczwvZW0+IGF0dHJpYnV0ZS4gIERlZmF1bHRzIGZhbHNlLiAgPGVtPlNpbmNlIEFudAorICAgIDEuNjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcworICAgICAgaW5zaWRlIHRoZSBhcmNoaXZlLiAgRGVmYXVsdHMgdG8gVVRGOC4gPHN0cm9uZz5JdCBpcyBub3QKKyAgICAgIHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGlzIHZhbHVlIGFzIHRoZSBjcmVhdGVkIGFyY2hpdmUgd2lsbCBtb3N0CisgICAgICBsaWtlbHkgYmUgdW5yZWFkYWJsZSBmb3IgSmF2YSBvdGhlcndpc2UuPC9zdHJvbmc+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXNvbmx5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3JlIG9ubHkgZmlsZSBlbnRyaWVzLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCisgICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCisgICAgICBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdAorICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmlmZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlc2V0bWFuaWZlc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YmVoYXZpb3Igd2hlbiBhIE1hbmlmZXN0IGlzIGZvdW5kIGluIGEgemlwZmlsZXNldCBvciB6aXBncm91cGZpbGVzZXQgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7c2tpcCZxdW90OywgJnF1b3Q7bWVyZ2UmcXVvdDssIGFuZCAmcXVvdDttZXJnZXdpdGhvdXRtYWluJnF1b3Q7LiAgJnF1b3Q7bWVyZ2UmcXVvdDsgd2lsbCBtZXJnZSBhbGwgb2YgdGhlIG1hbmlmZXN0cyB0b2dldGhlciwgYW5kIG1lcmdlIHRoaXMgaW50byBhbnkgb3RoZXIgc3BlY2lmaWVkIG1hbmlmZXN0cy4gICZxdW90O21lcmdld2l0aG91dG1haW4mcXVvdDsgbWVyZ2VzIGV2ZXJ5dGhpbmcgYnV0IHRoZSBNYWluIHNlY3Rpb24gb2YgdGhlIG1hbmlmZXN0cy4gIERlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7c2tpcCZxdW90Oy4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj53aGVubWFuaWZlc3Rvbmx5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJlaGF2aW9yIHdoZW4gbm8gZmlsZXMgbWF0Y2guICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2ZhaWwmcXVvdDssICZxdW90O3NraXAmcXVvdDssIGFuZCAmcXVvdDtjcmVhdGUmcXVvdDsuICBEZWZhdWx0IGlzICZxdW90O2NyZWF0ZSZxdW90Oy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51cGRhdGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgdG8gdXBkYXRlIG9yIG92ZXJ3cml0ZQorICAgICAgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuICBEZWZhdWx0IGlzICZxdW90O2ZhbHNlJnF1b3Q7LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmR1cGxpY2F0ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iZWhhdmlvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgZm91bmQuICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2FkZCZxdW90OywgJnF1b3Q7cHJlc2VydmUmcXVvdDssIGFuZCAmcXVvdDtmYWlsJnF1b3Q7LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7YWRkJnF1b3Q7LiAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cm91bmR1cDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aWxsIGJlCisgICAgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBldmVuIG51bWJlciBvZiBzZWNvbmRzLjxicj4KKyAgICBaaXAgYXJjaGl2ZXMgc3RvcmUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2l0aCBhIGdyYW51bGFyaXR5IG9mCisgICAgdHdvIHNlY29uZHMsIHNvIHRoZSB0aW1lcyB3aWxsIGVpdGhlciBiZSByb3VuZGVkIHVwIG9yIGRvd24uICBJZgorICAgIHlvdSByb3VuZCBkb3duLCB0aGUgYXJjaGl2ZSB3aWxsIGFsd2F5cyBzZWVtIG91dC1vZi1kYXRlIHdoZW4geW91CisgICAgcmVydW4gdGhlIHRhc2ssIHNvIHRoZSBkZWZhdWx0IGlzIHRvIHJvdW5kIHVwLiAgUm91bmRpbmcgdXAgbWF5CisgICAgbGVhZCB0byBhIGRpZmZlcmVudCB0eXBlIG9mIHByb2JsZW1zIGxpa2UgSlNQcyBpbnNpZGUgYSB3ZWIKKyAgICBhcmNoaXZlIHRoYXQgc2VlbSB0byBiZSBzbGlnaHRseSBtb3JlIHJlY2VudCB0aGFuIHByZWNvbXBpbGVkCisgICAgcGFnZXMsIHJlbmRlcmluZyBwcmVjb21waWxhdGlvbiB1c2VsZXNzLjxicj4KKyAgICBEZWZhdWx0cyB0byB0cnVlLiAgPGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGV2ZWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Tm9uLWRlZmF1bHQgbGV2ZWwgYXQgd2hpY2ggZmlsZSBjb21wcmVzc2lvbiBzaG91bGQgYmUKKyAgICBwZXJmb3JtZWQuIFZhbGlkIHZhbHVlcyByYW5nZSBmcm9tIDAgKG5vIGNvbXByZXNzaW9uL2Zhc3Rlc3QpIHRvIDkKKyAgICAobWF4aW11bSBjb21wcmVzc2lvbi9zbG93ZXN0KS4gPGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPGg0PmxpYjwvaDQ+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPmxpYjwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMgYSA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbAorZW5kIHVwIGluIHRoZSA8Y29kZT5XRUItSU5GL2xpYjwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZSB3YXIgZmlsZS48L3A+CisKKzxoND5jbGFzc2VzPC9oND4KKzxwPlRoZSBuZXN0ZWQgPGNvZGU+Y2xhc3NlczwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMgYSA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbAorZW5kIHVwIGluIHRoZSA8Y29kZT5XRUItSU5GL2NsYXNzZXM8L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUgd2FyIGZpbGUuPC9wPgorCis8aDQ+d2ViaW5mPC9oND4KKzxwPlRoZSBuZXN0ZWQgPGNvZGU+d2ViaW5mPC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPi4gQWxsIGZpbGVzIGluY2x1ZGVkIGluIHRoaXMgZmlsZXNldCB3aWxsCitlbmQgdXAgaW4gdGhlIDxjb2RlPldFQi1JTkY8L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUgd2FyIGZpbGUuIElmIHRoaXMKK2ZpbGVzZXQgaW5jbHVkZXMgYSBmaWxlIG5hbWVkIDxjb2RlPndlYi54bWw8L2NvZGU+LCB0aGUgZmlsZSBpcworaWdub3JlZCBhbmQgeW91IHdpbGwgZ2V0IGEgd2FybmluZy48L3A+CisKKzxoND5tZXRhaW5mPC9oND4KKzxwPlRoZSBuZXN0ZWQgPGNvZGU+bWV0YWluZjwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMgYSA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbAorZW5kIHVwIGluIHRoZSA8Y29kZT5NRVRBLUlORjwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZSB3YXIgZmlsZS4gSWYgdGhpcworZmlsZXNldCBpbmNsdWRlcyBhIGZpbGUgbmFtZWQgPGNvZGU+TUFOSUZFU1QuTUY8L2NvZGU+LCB0aGUgZmlsZSBpcworaWdub3JlZCBhbmQgeW91IHdpbGwgZ2V0IGEgd2FybmluZy48L3A+CisKKzxoND5tYW5pZmVzdCwgaW5kZXhqYXJzLCBzZXJ2aWNlPC9oND4KK1RoZXNlIGFyZSBpbmhlcml0ZWQgZnJvbSA8YSBocmVmPSJqYXIuaHRtbCI+Jmx0O2phciZndDs8L2E+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPkFzc3VtZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpbiB0aGUgcHJvamVjdCdzIGJhc2UgZGlyZWN0b3J5OjwvcD4KKzxwcmU+Cit0aGlyZHBhcnR5L2xpYnMvamRiYzEuamFyCit0aGlyZHBhcnR5L2xpYnMvamRiYzIuamFyCitidWlsZC9tYWluL2NvbS9teWNvL215YXBwL1NlcnZsZXQuY2xhc3MKK3NyYy9tZXRhZGF0YS9teWFwcC54bWwKK3NyYy9odG1sL215YXBwL2luZGV4Lmh0bWwKK3NyYy9qc3AvbXlhcHAvZnJvbnQuanNwCitzcmMvZ3JhcGhpY3MvaW1hZ2VzL2dpZnMvc21hbGwvbG9nby5naWYKK3NyYy9ncmFwaGljcy9pbWFnZXMvZ2lmcy9sYXJnZS9sb2dvLmdpZgorPC9wcmU+Cit0aGVuIHRoZSB3YXIgZmlsZSA8Y29kZT5teWFwcC53YXI8L2NvZGU+IGNyZWF0ZWQgd2l0aAorPHByZT4KKyZsdDt3YXIgZGVzdGZpbGU9JnF1b3Q7bXlhcHAud2FyJnF1b3Q7IHdlYnhtbD0mcXVvdDtzcmMvbWV0YWRhdGEvbXlhcHAueG1sJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjL2h0bWwvbXlhcHAmcXVvdDsvJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjL2pzcC9teWFwcCZxdW90Oy8mZ3Q7CisgICZsdDtsaWIgZGlyPSZxdW90O3RoaXJkcGFydHkvbGlicyZxdW90OyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O2pkYmMxLmphciZxdW90Oy8mZ3Q7CisgICZsdDsvbGliJmd0OworICAmbHQ7Y2xhc3NlcyBkaXI9JnF1b3Q7YnVpbGQvbWFpbiZxdW90Oy8mZ3Q7CisgICZsdDt6aXBmaWxlc2V0IGRpcj0mcXVvdDtzcmMvZ3JhcGhpY3MvaW1hZ2VzL2dpZnMmcXVvdDsKKyAgICAgICAgICAgICAgcHJlZml4PSZxdW90O2ltYWdlcyZxdW90Oy8mZ3Q7CismbHQ7L3dhciZndDsKKzwvcHJlPgord2lsbCBjb25zaXN0IG9mCis8cHJlPgorV0VCLUlORi93ZWIueG1sCitXRUItSU5GL2xpYi9qZGJjMi5qYXIKK1dFQi1JTkYvY2xhc3Nlcy9jb20vbXljby9teWFwcC9TZXJ2bGV0LmNsYXNzCitNRVRBLUlORi9NQU5JRkVTVC5NRgoraW5kZXguaHRtbAorZnJvbnQuanNwCitpbWFnZXMvc21hbGwvbG9nby5naWYKK2ltYWdlcy9sYXJnZS9sb2dvLmdpZgorPC9wcmU+Cit1c2luZyBBbnQncyBkZWZhdWx0IG1hbmlmZXN0IGZpbGUuIFRoZSBjb250ZW50IG9mCis8Y29kZT5XRUItSU5GL3dlYi54bWw8L2NvZGU+IGlzIGlkZW50aWNhbCB0bworPGNvZGU+c3JjL21ldGFkYXRhL215YXBwLnhtbDwvY29kZT4uCisKKzxwPldlIHJlZ3VsYXJ5IHJlY2VpdmUgYnVnIHJlcG9ydHMgdGhhdCB0aGlzIHRhc2sgaXMgY3JlYXRpbmcgdGhlIFdFQi1JTkYKK2RpcmVjdG9yeSwgYW5kIHRodXMgaXQgaXMgb3VyIGZhdWx0IHlvdXIgd2ViYXBwIGRvZXNuJ3Qgd29yay4gVGhlIGNhdXNlCitvZiB0aGVzZSBjb21wbGFpbnRzIGxpZXMgaW4gV2luWmlwLCB3aGljaCB0dXJucyBhbiBhbGwgdXBwZXItY2FzZQorZGlyZWN0b3J5IGludG8gYW4gYWxsIGxvd2VyIGNhc2Ugb25lIGluIGEgZml0IG9mIGhlbHBmdWxuZXNzLiBQbGVhc2UgY2hlY2sgdGhhdAorPGNvZGU+amFyIHh2ZiB5b3Vyd2ViYXBwLndhcjwvY29kZT4gc2hvd3MgdGhlIHNhbWUgYmVoYXZpb3VyIGJlZm9yZSBmaWxpbmcgYW5vdGhlcgorcmVwb3J0Ljxici8+CitXaW56aXAgaGFzIGFuIG9wdGlvbiBhbGxvd2luZyBhbGwgdXBwZXJjYXNlIG5hbWVzICh3aGljaCBpcyBvZmYgYnkgZGVmYXVsdCEpLiAgSXQgY2FuIGJlIGVuYWJsZWQgYnk6CitNZW51ICJPcHRpb25zIiAtPiAiQ29uZmlndXJhdGlvbiIsICAiVmlldyIgcHJvcGVydHkvdGFiIHBhZ2UsIHRoZW4gIkdlbmVyYWwiIGdyb3VwIGJveCBoYXMgYW4gb3B0aW9uIGNhbGxlZCAiQWxsb3cgYWxsIHVwcGVyY2FzZSBmaWxlIG5hbWVzIi4KKzwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy93aGljaHJlc291cmNlLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvd2hpY2hyZXNvdXJjZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZTYyZTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3Mvd2hpY2hyZXNvdXJjZS5odG1sCkBAIC0wLDAgKzEsMTIwIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgCis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKyAgICAgICAgPHRpdGxlPldoaWNocmVzb3VyY2UgVGFzazwvdGl0bGU+CisgICAgICA8L2xpbms+CisgICAgPC9tZXRhPgorICA8L2hlYWQ+CisKKworICA8Ym9keT4KKyAgICA8aDI+PGEgbmFtZT0id2hpY2hyZXNvdXJjZSI+V2hpY2hyZXNvdXJjZTwvYT48L2gyPgorICAgIDxoMz5EZXNjcmlwdGlvbjwvaDM+CisgICAgPHA+CisgICAgICBGaW5kIGEgY2xhc3Mgb3IgcmVzb3VyY2Ugb24gdGhlIHN1cHBsaWVkIGNsYXNzcGF0aCwgb3IgdGhlCisgICAgICBzeXN0ZW0gY2xhc3NwYXRoIGlmIG5vbmUgaXMgc3VwcGxpZWQuCisgICAgICBUaGUgbmFtZWQgcHJvcGVydHkgaXMgc2V0IGlmIHRoZSBpdGVtIGNhbiBiZSBmb3VuZC4KKyAgICAgIEZvciBleGFtcGxlOgorICAgIDwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CisgICZsdDt3aGljaHJlc291cmNlIHJlc291cmNlPSIvbG9nNGoucHJvcGVydGllcyIgcHJvcGVydHk9ImxvZzRqLnVybCIgJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgIFRoZSBwcm9wZXJ0eSB0byBmaWxsIHdpdGggdGhlIFVSTCBvZiB0aGUgcmVzb3VyY2Ugb2YgY2xhc3MuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3M8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBsb29rIGZvci4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGVzZS48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvdXJjZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGxvb2sgZm9yLgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgIFRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCA8Y29kZT5jbGFzczwvY29kZT4KKyAgICAgICAgICBvciA8Y29kZT5yZXNvdXJjZTwvY29kZT4uCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgIFRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhCisgICAgICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+CisgICAgICAgICAgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAgICAgIDxlbT5TaW5jZSBBbnQgMS43LjEuPC9lbT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgICAgPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisgICAgPGg0PmNsYXNzcGF0aDwvaDQ+CisgICAgPHA+CisgICAgICA8Y29kZT5XaGljaHJlc291cmNlPC9jb2RlPidzIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4gYXR0cmlidXRlIGlzIGEKKyAgICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZTwvYT4gYW5kIGNhbiBhbHNvIGJlCisgICAgICBzZXQgdmlhIGEgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50LgorICAgIDwvcD4KKyAgICA8aDM+RXhhbXBsZXM8L2gzPgorICAgIDxwPgorICAgICAgVGhlIGZvbGxvd2luZyBzaG93cyB1c2luZyBhIGNsYXNzcGF0aCByZWZlcmVuY2UuCisgICAgPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyAgJmx0O3BhdGggaWQ9ImJzZi5jbGFzc3BhdGgiJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iJHt1c2VyLmhvbWV9L2xhbmcvYnNmIiBpbmNsdWRlcz0iKi5qYXIiLyZndDsKKyAgJmx0Oy9wYXRoJmd0OworICAmbHQ7d2hpY2hyZXNvdXJjZSBwcm9wZXJ0eT0iYnNmLmNsYXNzLmxvY2F0aW9uIgorICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5ic2YuQlNGTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJic2YuY2xhc3NwYXRoIi8mZ3Q7CisgICZsdDtlY2hvJmd0OyR7YnNmLmNsYXNzLmxvY2F0aW9ufSZsdDsvZWNobyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRoZSBmb2xsb3dpbmcgc2hvd3MgdXNpbmcgYSBuZXN0ZWQgY2xhc3NwYXRoLgorICAgIDwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CisgICZsdDt3aGljaHJlc291cmNlCisgICAgcHJvcGVydHk9ImFudC1jb250cmliLmFudGxpYi5sb2NhdGlvbiIKKyAgICByZXNvdXJjZT0ibmV0L3NmL2FudGNvbnRyaWIvYW50bGliLnhtbCImZ3Q7CisgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICZsdDtwYXRoIHBhdGg9ImY6L3Rlc3RpbmcvYW50LWNvbnRyaWIvdGFyZ2V0L2FudC1jb250cmliLmphciIvJmd0OworICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAmbHQ7L3doaWNocmVzb3VyY2UmZ3Q7CisgICZsdDtlY2hvJmd0OyR7YW50LWNvbnRyaWIuYW50bGliLmxvY2F0aW9ufSZsdDsvZWNobyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3htbHByb3BlcnR5Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVGFza3MveG1scHJvcGVydHkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmI5OTBlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3htbHByb3BlcnR5Lmh0bWwKQEAgLTAsMCArMSwyODkgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlhtbFByb3BlcnR5IFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InhtbHByb3BlcnR5Ij5YbWxQcm9wZXJ0eTwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPgorTG9hZHMgcHJvcGVydHkgdmFsdWVzIGZyb20gYSB3ZWxsLWZvcm1lZCB4bWwgZmlsZS4gVGhlcmUgYXJlIG5vIG90aGVyIHJlc3RyaWN0aW9ucwordGhhbiAid2VsbC1mb3JtZWQiLiBZb3UgY2FuIGNob29zZSB0aGUgbGF5b3V0IHlvdSB3YW50LiBGb3IgZXhhbXBsZSB0aGlzIFhNTCBwcm9wZXJ0eSBmaWxlOgorPHByZT4KKyAgJmx0O3Jvb3QmZ3Q7CisgICAgJmx0O3Byb3BlcnRpZXMmZ3Q7CisgICAgICAmbHQ7Zm9vJmd0O2JhciZsdDsvZm9vJmd0OworICAgICZsdDsvcHJvcGVydGllcyZndDsKKyAgJmx0Oy9yb290Jmd0OworPC9wcmU+CitpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gdGhpcyBKYXZhIHByb3BlcnR5IGZpbGU6Cis8cHJlPgorICByb290LnByb3BlcnRpZXMuZm9vID0gYmFyCis8L3ByZT4KKworPHA+CitCeSBkZWZhdWx0LCB0aGlzIGxvYWQKK2RvZXMgPGVtPm5vPC9lbT4gcHJvY2Vzc2luZyBvZiB0aGUgaW5wdXQuICBJbiBwYXJ0aWN1bGFyLCB1bmxpa2UgdGhlCis8YSBocmVmPSJwcm9wZXJ0eS5odG1sIj5Qcm9wZXJ0eSB0YXNrPC9hPiwgcHJvcGVydHkgcmVmZXJlbmNlcworKGkuZS4sIDxzYW1wPiR7Zm9vfTwvc2FtcD4pIGFyZSBub3QgcmVzb2x2ZWQuCis8cD4KKzxhIG5hbWU9InNlbWFudGljQXR0cmlidXRlcyI+Cis8aDM+U2VtYW50aWMgQXR0cmlidXRlczwvaDM+Cis8L2E+CitJbnB1dCBwcm9jZXNzaW5nIGNhbiBiZSBlbmFibGVkIGJ5IHVzaW5nIHRoZSA8Yj5zZW1hbnRpY0F0dHJpYnV0ZXM8L2I+CithdHRyaWJ1dGUuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gPGk+dHJ1ZTwvaT4gKGl0cyBkZWZhdWx0IGlzCis8aT5mYWxzZTwvaT4pLCB0aGUgZm9sbG93aW5nIHByb2Nlc3Npbmcgb2NjdXJzIGFzIHRoZSBpbnB1dCBYTUwgZmlsZQoraXMgbG9hZGVkOgorPHVsPgorICA8bGk+UHJvcGVydHkgcmVmZXJlbmNlcyBhcmUgcmVzb2x2ZWQuPC9saT4KKyAgPGxpPlRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseToKKyAgICA8dWw+CisgICAgICA8bGk+PGI+aWQ8L2I+OiBUaGUgcHJvcGVydHkgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpZCB2YWx1ZS48L2xpPgorICAgICAgPGxpPjxiPmxvY2F0aW9uPC9iPjogVGhlIHByb3BlcnR5IGlzIHRyZWF0ZWQgYXMgYSBmaWxlIGxvY2F0aW9uPC9saT4KKyAgICAgIDxsaT48Yj5yZWZpZDwvYj46IFRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZQorICAgICAgICAgIHJlZmVyZW5jZWQgcHJvcGVydHkuPC9saT4KKyAgICAgIDxsaT48Yj52YWx1ZTwvYj46IFRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlIHZhbHVlIGluZGljYXRlZC48L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT48YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBhdGgtbGlrZSBTdHJ1Y3R1cmVzPC9hPiBjYW4gYmUgZGVmaW5lZAorICAgICAgYnkgdXNlIG9mIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgICA8dWw+CisgICAgICA8bGk+PGI+cGF0aGlkPC9iPjogVGhlIGdpdmVuIGlkIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBwYXRoLiAgVGhlCisgICAgICAgICAgbmVzdGVkIFhNTCB0YWcgbmFtZSBpcyBpZ25vcmVkLiAgQ2hpbGQgZWxlbWVudHMgY2FuIGJlIHVzZWQKKyAgICAgICAgICAoWE1MIHRhZyBuYW1lcyBhcmUgaWdub3JlZCkgdG8gaWRlbnRpZnkgZWxlbWVudHMgb2YgdGhlIHBhdGguPC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorPC91bD4KKzxwPgorRm9yIGV4YW1wbGUsIHdpdGggc2VtYW50aWMgYXR0cmlidXRlIHByb2Nlc3NpbmcgZW5hYmxlZCwgdGhpcyBYTUwgcHJvcGVydHkKK2ZpbGU6Cis8cHJlPgorICAmbHQ7cm9vdCZndDsKKyAgICAmbHQ7cHJvcGVydGllcyZndDsKKyAgICAgICZsdDtmb28gbG9jYXRpb249ImJhciIvJmd0OworICAgICAgJmx0O3F1dXgmZ3Q7JHtyb290LnByb3BlcnRpZXMuZm9vfSZsdDsvcXV1eCZndDsKKyAgICAmbHQ7L3Byb3BlcnRpZXMmZ3Q7CisgICZsdDsvcm9vdCZndDsKKzwvcHJlPgoraXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnRzIGluIGEgYnVpbGQueG1sIGZpbGU6Cis8cHJlPgorICAmbHQ7cHJvcGVydHkgbmFtZT0icm9vdC5wcm9wZXJ0aWVzLmZvbyIgbG9jYXRpb249ImJhciIvJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0icm9vdC5wcm9wZXJ0aWVzLnF1dXgiIHZhbHVlPSIke3Jvb3QucHJvcGVydGllcy5mb299Ii8mZ3Q7Cis8L3ByZT4KKworPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBYTUwgZmlsZSB0byBwYXJzZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCBvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByZWZpeDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJlZml4IHRvIHByZXBlbmQgdG8gZWFjaCBwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXBSb290PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPktlZXAgdGhlIHhtbCByb290IHRhZyBhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGZpcnN0IHZhbHVlIGluIHRoZSBwcm9wZXJ0eSBuYW1lLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyA8aT50cnVlPC9pPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWxpZGF0ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5WYWxpZGF0ZSB0aGUgaW5wdXQgZmlsZSAoZS5nLiBieSBhIERURCkuIE90aGVyd2lzZSB0aGUgWE1MIG11c3Qgb25seSBiZSB3ZWxsLWZvcm1lZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmFsc2U8L2k+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbGxhcHNlQXR0cmlidXRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UcmVhdCBhdHRyaWJ1dGVzIGFzIG5lc3RlZCBlbGVtZW50cy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmFsc2U8L2k+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNlbWFudGljQXR0cmlidXRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5FbmFibGUgc3BlY2lhbCBoYW5kbGluZyBvZiBjZXJ0YWluIGF0dHJpYnV0ZSBuYW1lcy4KKyAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgPGEgaHJlZj0iI3NlbWFudGljQXR0cmlidXRlcyI+U2VtYW50aWMgQXR0cmlidXRlczwvYT4KKyAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlU2VtYW50aWNBdHRyaWJ1dGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5jbHVkZSB0aGUgc2VtYW50aWMgYXR0cmlidXRlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIHByb3BlcnR5IG5hbWUuICBJZ25vcmVkIGlmCisgICAgICAgICAgICAgICAgICAgICA8aT5zZW1hbnRpY0F0dHJpYnV0ZXM8L2k+IGlzIG5vdCBzZXQgdG8gPGk+dHJ1ZTwvaT4uCisgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9IiNzZW1hbnRpY0F0dHJpYnV0ZXMiPlNlbWFudGljIEF0dHJpYnV0ZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT4uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cm9vdERpcmVjdG9yeTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IHRvIHVzZSBmb3IgcmVzb2x2aW5nIGZpbGUgcmVmZXJlbmNlcy4gSWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgaWYgPGk+c2VtYW50aWNBdHRyaWJ1dGVzPC9pPiBpcyBub3Qgc2V0IHRvIDxpPnRydWU8L2k+LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyA8aT4ke2Jhc2VkaXJ9PC9pPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWxpbWl0ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RGVsaW1pdGVyIGZvciBzcGxpdHRpbmcgbXVsdGlwbGUgdmFsdWVzLjxicj48aT5zaW5jZSBBbnQgMS43LjE8L2k+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBjb21tYTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+PGEgbmFtZT0ibmVzdGVkIj5OZXN0ZWQgRWxlbWVudHM8L2E+PC9oMz4KKzxoND54bWxjYXRhbG9nPC9oND4KKzxwPlRoZSA8YSBocmVmPSIuLi9Db3JlVHlwZXMveG1sY2F0YWxvZy5odG1sIj48dHQ+Jmx0O3htbGNhdGFsb2cmZ3Q7PC90dD48L2E+CitlbGVtZW50IGlzIHVzZWQgdG8gcGVyZm9ybSBlbnRpdHkgcmVzb2x1dGlvbi48L3A+CisKKzxoND5hbnkgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gb3Igc2luZ2xlIGVsZW1lbnQKK3Jlc291cmNlIGNvbGxlY3Rpb248L2g0PgorCis8cD5UaGUgc3BlY2lmaWVkIHJlc291cmNlIHdpbGwgYmUgdXNlZCBhcyBpbnB1dC48L3A+CisKKzxhIG5hbWU9ImV4YW1wbGVzIj4KKzxoMz5FeGFtcGxlczwvaDM+Cis8L2E+CisKKzxoND5Ob24tc2VtYW50aWMgQXR0cmlidXRlczwvaDQ+CisKKzxwPkhlcmUgaXMgYW4gZXhhbXBsZSB4bWwgZmlsZSB0aGF0IGRvZXMgbm90IGhhdmUgYW55IHNlbWFudGljIGF0dHJpYnV0ZXMuPC9wPgorCis8cHJlPgorICAgJmx0O3Jvb3QtdGFnIG15YXR0cj0idHJ1ZSImZ3Q7CisgICAgJmx0O2lubmVyLXRhZyBzb21lYXR0cj0idmFsIiZndDtUZXh0Jmx0Oy9pbm5lci10YWcmZ3Q7CisgICAgJmx0O2EyJmd0OyZsdDthMyZndDsmbHQ7YTQmZ3Q7ZmFsc2UmbHQ7L2E0Jmd0OyZsdDsvYTMmZ3Q7Jmx0Oy9hMiZndDsKKyAgICZsdDsvcm9vdC10YWcmZ3Q7Cis8L3ByZT4KKworPGg1PmRlZmF1bHQgbG9hZGluZzwvaDU+Cis8cD5UaGlzIGVudHJ5IGluIGEgYnVpbGQgZmlsZToKKzxwcmU+ICAgJmx0O3htbHByb3BlcnR5IGZpbGU9InNvbWVmaWxlLnhtbCIvJmd0OzwvcHJlPgoraXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Cis8cHJlPgorICAgcm9vdC10YWcobXlhdHRyKT10cnVlCisgICByb290LXRhZy5pbm5lci10YWc9VGV4dAorICAgcm9vdC10YWcuaW5uZXItdGFnKHNvbWVhdHRyKT12YWwKKyAgIHJvb3QtdGFnLmEyLmEzLmE0PWZhbHNlCis8L3ByZT4KKworPGg1PmNvbGxhcHNlQXR0cmlidXRlcz1mYWxzZTwvaDU+Cis8cD5UaGlzIGVudHJ5IGluIGEgYnVpbGQgZmlsZToKKzxwcmU+ICAgJmx0O3htbHByb3BlcnR5IGZpbGU9InNvbWVmaWxlLnhtbCIgY29sbGFwc2VBdHRyaWJ1dGVzPSJ0cnVlIi8mZ3Q7PC9wcmU+CitpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKzxwcmU+CisgICByb290LXRhZy5teWF0dHI9dHJ1ZQorICAgcm9vdC10YWcuaW5uZXItdGFnPVRleHQKKyAgIHJvb3QtdGFnLmlubmVyLXRhZy5zb21lYXR0PXZhbAorICAgcm9vdC10YWcuYTIuYTMuYTQ9ZmFsc2UKKzwvcHJlPgorCis8aDU+a2VlcFJvb3Q9ZmFsc2U8L2g1PgorPHA+VGhpcyBlbnRyeSBpbiBhIGJ1aWxkIGZpbGU6Cis8cHJlPiAgICZsdDt4bWxwcm9wZXJ0eSBmaWxlPSJzb21lZmlsZS54bWwiIGtlZXBSb290PSJmYWxzZSIvJmd0OzwvcHJlPgoraXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Cis8cHJlPgorICAgaW5uZXItdGFnPVRleHQKKyAgIGlubmVyLXRhZyhzb21lYXR0cik9dmFsCisgICBhMi5hMy5hND1mYWxzZQorPC9wcmU+CisKKzxoND5TZW1hbnRpYyBBdHRyaWJ1dGVzPC9oND4KKworPHA+SGVyZSBpcyBhbiBleGFtcGxlIHhtbCBmaWxlIHRoYXQgaGFzIHNlbWFudGljIGF0dHJpYnV0ZXMuPC9wPgorPHByZT4KKyAgJmx0O3Jvb3QtdGFnJmd0OworICAgICZsdDt2ZXJzaW9uIHZhbHVlPSIwLjAuMSIvJmd0OworICAgICZsdDtidWlsZCBmb2xkZXI9ImJ1aWxkIiZndDsKKyAgICAgICZsdDtjbGFzc2VzIGlkPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZC5mb2xkZXJ9L2NsYXNzZXMiLyZndDsKKyAgICAgICZsdDtyZWZlcmVuY2UgcmVmaWQ9ImJ1aWxkLmNsYXNzZXMiLyZndDsKKyAgICAmbHQ7L2J1aWxkJmd0OworICAgICZsdDtjb21waWxlJmd0OworICAgICAgJmx0O2NsYXNzcGF0aCBwYXRoaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIiZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXN9Ii8mZ3Q7CisgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7L2NvbXBpbGUmZ3Q7CisgICAgJmx0O3J1bi10aW1lJmd0OworICAgICAgJmx0O2phcnMmZ3Q7Ki5qYXImbHQ7L2phcnMmZ3Q7CisgICAgICAmbHQ7Y2xhc3NwYXRoIHBhdGhpZD0icnVuLXRpbWUuY2xhc3NwYXRoIiZndDsKKyAgICAgICAgJmx0O3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8mZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke3J1bi10aW1lLmphcnN9Ii8mZ3Q7CisgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7L3J1bi10aW1lJmd0OworICAmbHQ7L3Jvb3QtdGFnJmd0OworPC9wcmU+CisKKzxoNT5kZWZhdWx0IGxvYWRpbmcgKHNlbWFudGljQXR0cmlidXRlcz10cnVlKTwvaDU+Cis8cD5UaGlzIGVudHJ5IGluIGEgYnVpbGQgZmlsZToKKzxwcmU+ICAgJmx0O3htbHByb3BlcnR5IGZpbGU9InNvbWVmaWxlLnhtbCIKKyAgICAgICAgICAgICAgICBzZW1hbnRpY0F0dHJpYnV0ZXM9InRydWUiLyZndDs8L3ByZT4KK2lzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBlbnRyaWVzIGluIGEgYnVpbGQgZmlsZToKKzxwcmU+CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iMC4wLjEiLyZndDsKKyAgJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmZvbGRlciIgdmFsdWU9ImJ1aWxkIi8mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZC5mb2xkZXJ9L2NsYXNzZXMiIGlkPSJidWlsZC5jbGFzc2VzIi8mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZWZlcmVuY2UiIHJlZmlkPSJidWlsZC5jbGFzc2VzIi8mZ3Q7CisKKyAgJmx0O3Byb3BlcnR5IG5hbWU9InJ1bi10aW1lLmphcnMiIHZhbHVlPSIqLmphci8mZ3Q7CisKKyAgJmx0O2NsYXNzcGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIvJmd0OworICAmbHQ7L2NsYXNzcGF0aCZndDsKKworICAmbHQ7Y2xhc3NwYXRoIGlkPSJydW4tdGltZS5jbGFzc3BhdGgiJmd0OworICAgICZsdDtwYXRoIHJlZmlkPSJjb21waWxlLmNsYXNzcGF0aCIvJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke3J1bi10aW1lLmphcnN9Ii8mZ3Q7CisgICZsdDsvY2xhc3NwYXRoJmd0OworPC9wcmU+CisKKzxoNT5pbmNsdWRlU2VtYW50aWNBdHRyaWJ1dGU9InRydWUiPC9oNT4KKzxwPlRoaXMgZW50cnkgaW4gYSBidWlsZCBmaWxlOgorPHByZT4gICAmbHQ7eG1scHJvcGVydHkgZmlsZT0ic29tZWZpbGUueG1sIgorICAgICAgICAgICAgICAgIHNlbWFudGljQXR0cmlidXRlcz0idHJ1ZSIKKyAgICAgICAgICAgICAgICBpbmNsdWRlU2VtYW50aWNBdHRyaWJ1dGU9InRydWUiLyZndDsKKzwvcHJlPgoraXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGVudHJpZXMgaW4gYSBidWlsZCBmaWxlOgorPHByZT4KKyAgJmx0O3Byb3BlcnR5IG5hbWU9InZlcnNpb24udmFsdWUiIHZhbHVlPSIwLjAuMSIvJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuZm9sZGVyIiB2YWx1ZT0iYnVpbGQiLyZndDsKKyAgJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMubG9jYXRpb24iIGxvY2F0aW9uPSIke2J1aWxkLmZvbGRlcn0vY2xhc3NlcyIvJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQucmVmZXJlbmNlLnJlZmlkIiByZWZpZD0iYnVpbGQubG9jYXRpb24iLyZndDsKKworICAmbHQ7cHJvcGVydHkgbmFtZT0icnVuLXRpbWUuamFycyIgdmFsdWU9IiouamFyLyZndDsKKworICAmbHQ7Y2xhc3NwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCImZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXN9Ii8mZ3Q7CisgICZsdDsvY2xhc3NwYXRoJmd0OworCisgICZsdDtjbGFzc3BhdGggaWQ9InJ1bi10aW1lLmNsYXNzcGF0aCImZ3Q7CisgICAgJmx0O3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8mZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7cnVuLXRpbWUuamFyc30iLyZndDsKKyAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Cis8L3ByZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy96aXAuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUYXNrcy96aXAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTNlZDljCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVRhc2tzL3ppcC5odG1sCkBAIC0wLDAgKzEsMzA0IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlppcCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJ6aXAiPlppcDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkNyZWF0ZXMgYSB6aXBmaWxlLjwvcD4KKzxwPlRoZSA8aT5iYXNlZGlyPC9pPiBhdHRyaWJ1dGUgaXMgdGhlIHJlZmVyZW5jZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0byB6aXAuPC9wPgorPHA+Tm90ZSB0aGF0IGZpbGUgcGVybWlzc2lvbnMgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSByZXN1bHRpbmcgemlwZmlsZS48L3A+Cis8cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyB6aXBwZWQuIFRoaXMgY2FuIGJlCitkb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+CithdHRyaWJ1dGVzLiBXaXRoIHRoZSA8aT5pbmNsdWRlczwvaT4gb3IgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCitoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Cit0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCitmaW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKK3dhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiA8YQoraHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCitpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiA8L3A+Cis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCitzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+CisoPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPmJhc2VkaXI8L2NvZGU+KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKKzxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gYW5kCis8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPk9yLCB5b3UgbWF5IHBsYWNlIHdpdGhpbiBpdCBuZXN0ZWQgZmlsZSBzZXRzLCBvciByZWZlcmVuY2VzIHRvIGZpbGUgc2V0cy4KK0luIHRoaXMgY2FzZSA8Y29kZT5iYXNlZGlyPC9jb2RlPiBpcyBvcHRpb25hbDsgdGhlIGltcGxpY2l0IGZpbGUgc2V0IGlzIDxpPm9ubHkgdXNlZDwvaT4KK2lmIDxjb2RlPmJhc2VkaXI8L2NvZGU+IGlzIHNldC4gWW91IG1heSB1c2UgYW55IG1peHR1cmUgb2YgdGhlIGltcGxpY2l0IGZpbGUgc2V0Cisod2l0aCA8Y29kZT5iYXNlZGlyPC9jb2RlPiBzZXQsIGFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIGxpa2UgPGNvZGU+aW5jbHVkZXM8L2NvZGU+CithbmQgb3B0aW9uYWwgc3ViZWxlbWVudHMgbGlrZSA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+KTsgZXhwbGljaXQgbmVzdGVkCis8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGVsZW1lbnRzIHNvIGxvbmcgYXMgYXQgbGVhc3Qgb25lIGZpbGVzZXQgdG90YWwgaXMgc3BlY2lmaWVkLiBUaGUgWklQIGZpbGUgd2lsbAorb25seSByZWZsZWN0IHRoZSByZWxhdGl2ZSBwYXRocyBvZiBmaWxlcyA8aT53aXRoaW48L2k+IGVhY2ggZmlsZXNldC4gVGhlIFppcCB0YXNrIGFuZCBpdHMgZGVyaXZhdGl2ZXMga25vdyBhIHNwZWNpYWwgZm9ybSBvZiBhIGZpbGVzZXQgbmFtZWQgemlwZmlsZXNldCB0aGF0IGhhcyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKGRlc2NyaWJlZCBiZWxvdykuIDwvcD4KKzxwPlRoZSBaaXAgdGFzayBhbHNvIHN1cHBvcnRzIHRoZSBtZXJnaW5nIG9mIG11bHRpcGxlIHppcCBmaWxlcyBpbnRvIHRoZSB6aXAgZmlsZS4gCitUaGlzIGlzIHBvc3NpYmxlIHRocm91Z2ggZWl0aGVyIHRoZSA8aT5zcmM8L2k+IGF0dHJpYnV0ZSBvZiBhbnkgbmVzdGVkIGZpbGVzZXRzIAorb3IgYnkgdXNpbmcgdGhlIHNwZWNpYWwgbmVzdGVkIGZpbGVzZXQgPGk+emlwZ3JvdXBmaWxlc2V0PC9pPi48L3A+CisKKzxwPlRoZSA8Y29kZT51cGRhdGU8L2NvZGU+IHBhcmFtZXRlciBjb250cm9scyB3aGF0IGhhcHBlbnMgaWYgdGhlIFpJUAorZmlsZSBhbHJlYWR5IGV4aXN0cy4gV2hlbiBzZXQgdG8gPGNvZGU+eWVzPC9jb2RlPiwgdGhlIFpJUCBmaWxlIGlzCit1cGRhdGVkIHdpdGggdGhlIGZpbGVzIHNwZWNpZmllZC4gKE5ldyBmaWxlcyBhcmUgYWRkZWQ7IG9sZCBmaWxlcyBhcmUKK3JlcGxhY2VkIHdpdGggdGhlIG5ldyB2ZXJzaW9ucy4pIFdoZW4gc2V0IHRvIDxjb2RlPm5vPC9jb2RlPiAodGhlCitkZWZhdWx0KSB0aGUgWklQIGZpbGUgaXMgb3ZlcndyaXR0ZW4gaWYgYW55IG9mIHRoZSBmaWxlcyB0aGF0IHdvdWxkIGJlCithZGRlZCB0byB0aGUgYXJjaGl2ZSBhcmUgbmV3ZXIgdGhhbiB0aGUgZW50cmllcyBpbnNpZGUgdGhlIGFyY2hpdmUuCitQbGVhc2Ugbm90ZSB0aGF0IFpJUCBmaWxlcyBzdG9yZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aXRoIGEKK2dyYW51bGFyaXR5IG9mIHR3byBzZWNvbmRzLiAgSWYgYSBmaWxlIGlzIGxlc3MgdGhhbiB0d28gc2Vjb25kcyBuZXdlcgordGhhbiB0aGUgZW50cnkgaW4gdGhlIGFyY2hpdmUsIEFudCB3aWxsIG5vdCBjb25zaWRlciBpdCBuZXdlci48L3A+CisKKzxwPlRoZSA8Y29kZT53aGVuZW1wdHk8L2NvZGU+IHBhcmFtZXRlciBjb250cm9scyB3aGF0IGhhcHBlbnMgd2hlbiBubyBmaWxlcyBtYXRjaC4KK0lmIDxjb2RlPnNraXA8L2NvZGU+ICh0aGUgZGVmYXVsdCksIHRoZSBaSVAgaXMgbm90IGNyZWF0ZWQgYW5kIGEgd2FybmluZyBpcyBpc3N1ZWQuCitJZiA8Y29kZT5mYWlsPC9jb2RlPiwgdGhlIFpJUCBpcyBub3QgY3JlYXRlZCBhbmQgdGhlIGJ1aWxkIGlzIGhhbHRlZCB3aXRoIGFuIGVycm9yLgorSWYgPGNvZGU+Y3JlYXRlPC9jb2RlPiwgYW4gZW1wdHkgWklQIGZpbGUgKGV4cGxpY2l0bHkgemVybyBlbnRyaWVzKSBpcyBjcmVhdGVkLAord2hpY2ggc2hvdWxkIGJlIHJlY29nbml6ZWQgYXMgc3VjaCBieSBjb21wbGlhbnQgWklQIG1hbmlwdWxhdGlvbiB0b29scy48L3A+Cis8cD5UaGlzIHRhc2sgd2lsbCBub3cgdXNlIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nCitmb3IgZmlsZW5hbWVzIC0gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGNvbW1hbmQgbGluZSBaSVAgdG9vbHMsCitidXQgY2F1c2VzIHByb2JsZW1zIGlmIHlvdSB0cnkgdG8gb3BlbiB0aGVtIGZyb20gd2l0aGluIEphdmEgYW5kIHlvdXIKK2ZpbGVuYW1lcyBjb250YWluIG5vbiBVUy1BU0NJSSBjaGFyYWN0ZXJzLiBVc2UgdGhlIGVuY29kaW5nIGF0dHJpYnV0ZQorYW5kIHNldCBpdCB0byBVVEY4IHRvIGNyZWF0ZSB6aXAgZmlsZXMgdGhhdCBjYW4gc2FmZWx5IGJlIHJlYWQgYnkKK0phdmEuPC9wPgorCis8cD5TdGFydGluZyB3aXRoIEFudCAxLjUuMiwgPGNvZGU+Jmx0O3ppcCZndDs8L2NvZGU+IGNhbiBzdG9yZSBVbml4IHBlcm1pc3Npb25zCitpbnNpZGUgdGhlIGFyY2hpdmUgKHNlZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZW1vZGUgYW5kIGRpcm1vZGUKK2F0dHJpYnV0ZXMgZm9yIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy96aXBmaWxlc2V0Lmh0bWwiPiZsdDt6aXBmaWxlc2V0Jmd0OzwvYT4pLgorVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyBwb3J0YWJsZSB3YXkgdG8gc3RvcmUgdGhlc2UgcGVybWlzc2lvbnMuCitBbnQgdXNlcyB0aGUgYWxnb3JpdGhtIHVzZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvLXppcC5vcmciPkluZm8tWmlwJ3M8L2E+CitpbXBsZW1lbnRhdGlvbiBvZiB0aGUgemlwIGFuZCB1bnppcCBjb21tYW5kcyAtIHRoZXNlIGFyZSB0aGUgZGVmYXVsdAordmVyc2lvbnMgb2YgemlwIGFuZCB1bnppcCBmb3IgbWFueSBVbml4IGFuZCBVbml4LWxpa2Ugc3lzdGVtcy48L3A+CisKKzxwPjxiPlBsZWFzZSBub3RlIHRoYXQgdGhlIHppcCBmb3JtYXQgYWxsb3dzIG11bHRpcGxlIGZpbGVzIG9mIHRoZSBzYW1lCitmdWxseS1xdWFsaWZpZWQgbmFtZSB0byBleGlzdCB3aXRoaW4gYSBzaW5nbGUgYXJjaGl2ZS4gIFRoaXMgaGFzIGJlZW4KK2RvY3VtZW50ZWQgYXMgY2F1c2luZyB2YXJpb3VzIHByb2JsZW1zIGZvciB1bnN1c3BlY3RpbmcgdXNlcnMuICBJZiB5b3Ugd2lzaAordG8gYXZvaWQgdGhpcyBiZWhhdmlvciB5b3UgbXVzdCBzZXQgdGhlIDxjb2RlPmR1cGxpY2F0ZTwvY29kZT4gYXR0cmlidXRlCit0byBhIHZhbHVlIG90aGVyIHRoYW4gaXRzIGRlZmF1bHQsIDxjb2RlPiZxdW90O2FkZCZxdW90OzwvY29kZT4uPC9iPjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHppcC1maWxlIHRvIGNyZWF0ZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3by48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj56aXBmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8aT5kZXByZWNhdGVkPC9pPiBvbGQgbmFtZSBvZiBkZXN0ZmlsZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byB6aXAgdGhlIGZpbGVzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXByZXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5vdCBvbmx5IHN0b3JlIGRhdGEgYnV0IGFsc28gY29tcHJlc3MgdGhlbSwKKyAgICBkZWZhdWx0cyB0byB0cnVlLiAgVW5sZXNzIHlvdSBzZXQgdGhlIDxlbT5rZWVwY29tcHJlc3Npb248L2VtPgorICAgIGF0dHJpYnV0ZSB0byBmYWxzZSwgdGhpcyB3aWxsIGFwcGx5IHRvIHRoZSBlbnRpcmUgYXJjaGl2ZSwgbm90CisgICAgb25seSB0aGUgZmlsZXMgeW91J3ZlIGFkZGVkIHdoaWxlIHVwZGF0aW5nLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXBjb21wcmVzc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Gb3IgZW50cmllcyBjb21pbmcgZnJvbSBleGlzdGluZyBhcmNoaXZlcyAobGlrZQorICAgIG5lc3RlZCA8ZW0+emlwZmlsZXNldDwvZW0+cyBvciB3aGlsZSB1cGRhdGluZyB0aGUgYXJjaGl2ZSksIGtlZXAKKyAgICB0aGUgY29tcHJlc3Npb24gYXMgaXQgaGFzIGJlZW4gb3JpZ2luYWxseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQorICAgIDxlbT5jb21wcmVzczwvZW0+IGF0dHJpYnV0ZS4gIERlZmF1bHRzIGZhbHNlLiAgPGVtPlNpbmNlIEFudAorICAgIDEuNjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcworICAgIGluc2lkZSB0aGUgemlwIGZpbGUuICBGb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgPGEKKyAgICBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sPC9hPi4KKyAgICBEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlc29ubHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcmUgb25seSBmaWxlIGVudHJpZXMsIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90CisgICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXBkYXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIHRvIHVwZGF0ZSBvciBvdmVyd3JpdGUKKyAgICAgIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzLiAgRGVmYXVsdCBpcyAmcXVvdDtmYWxzZSZxdW90Oy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj53aGVuZW1wdHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YmVoYXZpb3Igd2hlbiBubyBmaWxlcyBtYXRjaC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7ZmFpbCZxdW90OywgJnF1b3Q7c2tpcCZxdW90OywgYW5kICZxdW90O2NyZWF0ZSZxdW90Oy4gIERlZmF1bHQgaXMgJnF1b3Q7c2tpcCZxdW90Oy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kdXBsaWNhdGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YmVoYXZpb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGZvdW5kLiAgVmFsaWQgdmFsdWVzIGFyZSAmcXVvdDthZGQmcXVvdDssICZxdW90O3ByZXNlcnZlJnF1b3Q7LCBhbmQgJnF1b3Q7ZmFpbCZxdW90Oy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7YWRkJnF1b3Q7LiAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cm91bmR1cDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aWxsIGJlCisgICAgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBldmVuIG51bWJlciBvZiBzZWNvbmRzLjxicj4KKyAgICBaaXAgYXJjaGl2ZXMgc3RvcmUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2l0aCBhIGdyYW51bGFyaXR5IG9mCisgICAgdHdvIHNlY29uZHMsIHNvIHRoZSB0aW1lcyB3aWxsIGVpdGhlciBiZSByb3VuZGVkIHVwIG9yIGRvd24uICBJZgorICAgIHlvdSByb3VuZCBkb3duLCB0aGUgYXJjaGl2ZSB3aWxsIGFsd2F5cyBzZWVtIG91dC1vZi1kYXRlIHdoZW4geW91CisgICAgcmVydW4gdGhlIHRhc2ssIHNvIHRoZSBkZWZhdWx0IGlzIHRvIHJvdW5kIHVwLiAgUm91bmRpbmcgdXAgbWF5CisgICAgbGVhZCB0byBhIGRpZmZlcmVudCB0eXBlIG9mIHByb2JsZW1zIGxpa2UgSlNQcyBpbnNpZGUgYSB3ZWIKKyAgICBhcmNoaXZlIHRoYXQgc2VlbSB0byBiZSBzbGlnaHRseSBtb3JlIHJlY2VudCB0aGFuIHByZWNvbXBpbGVkCisgICAgcGFnZXMsIHJlbmRlcmluZyBwcmVjb21waWxhdGlvbiB1c2VsZXNzLjxicj4KKyAgICBEZWZhdWx0cyB0byB0cnVlLiAgPGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWVudDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tZW50IHRvIHN0b3JlIGluIHRoZSBhcmNoaXZlLiA8ZW0+U2luY2UgQW50IDEuNi4zPC9lbT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sZXZlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Ob24tZGVmYXVsdCBsZXZlbCBhdCB3aGljaCBmaWxlIGNvbXByZXNzaW9uIHNob3VsZCBiZQorICAgIHBlcmZvcm1lZC4gVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAobm8gY29tcHJlc3Npb24vZmFzdGVzdCkgdG8gOQorICAgIChtYXhpbXVtIGNvbXByZXNzaW9uL3Nsb3dlc3QpLiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPGg0PmFueSByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KKzxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZQorQ29sbGVjdGlvbjwvYT5zIGFyZSB1c2VkIHRvIHNlbGVjdCBncm91cHMgb2YgZmlsZXMgdG8gYXJjaGl2ZS48L3A+Cis8cD5QcmlvciB0byBBbnQgMS43IG9ubHkgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBhbmQKKzxjb2RlPiZsdDt6aXBmaWxlc2V0Jmd0OzwvY29kZT4gaGF2ZSBiZWVuIHN1cHBvcnRlZCBhcyBuZXN0ZWQgZWxlbWVudHMuPC9wPgorCis8YSBuYW1lPSJ6aXBncm91cGZpbGVzZXQiIC8+Cis8aDQ+emlwZ3JvdXBmaWxlc2V0PC9oND4KKzxwPkEgPGNvZGU+Jmx0O3ppcGdyb3VwZmlsZXNldCZndDs8L2NvZGU+IGFsbG93cyBmb3IgbXVsdGlwbGUgemlwIGZpbGVzIHRvIGJlIAorbWVyZ2VkIGludG8gdGhlIGFyY2hpdmUuIEVhY2ggZmlsZSBmb3VuZCBpbiB0aGlzIGZpbGVzZXQgaXMgYWRkZWQgdG8gdGhlIGFyY2hpdmUgCit0aGUgc2FtZSB3YXkgdGhhdCA8aT56aXBmaWxlc2V0IHNyYzwvaT4gZmlsZXMgYXJlIGFkZGVkLjwvcD4KKworCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4gICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7CisgICAgICAgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD56aXBzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5IGludG8gYSBmaWxlIGNhbGxlZCA8Y29kZT5tYW51YWwuemlwPC9jb2RlPgoraW4gdGhlIDxjb2RlPiR7ZGlzdH08L2NvZGU+IGRpcmVjdG9yeS48L3A+Cis8cHJlPiAgJmx0O3ppcCBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC56aXAmcXVvdDsKKyAgICAgICBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsKKyAgICAgICB1cGRhdGU9JnF1b3Q7dHJ1ZSZxdW90OworICAvJmd0OzwvcHJlPgorPHA+emlwcyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeSBpbnRvIGEgZmlsZSBjYWxsZWQgPGNvZGU+bWFudWFsLnppcDwvY29kZT4KK2luIHRoZSA8Y29kZT4ke2Rpc3R9PC9jb2RlPiBkaXJlY3RvcnkuIElmIDxjb2RlPm1hbnVhbC56aXA8L2NvZGU+Citkb2Vzbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkOyBvdGhlcndpc2UgaXQgaXMgdXBkYXRlZCB3aXRoIHRoZQorbmV3L2NoYW5nZWQgZmlsZXMuPC9wPgorPHByZT4gICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7CisgICAgICAgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7CisgICAgICAgZXhjbHVkZXM9JnF1b3Q7bXlkb2NzLyoqLCAqKi90b2RvLmh0bWwmcXVvdDsKKyAgLyZndDs8L3ByZT4KKzxwPnppcHMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkuIEZpbGVzIGluIHRoZSBkaXJlY3RvcnkgPGNvZGU+bXlkb2NzPC9jb2RlPiwKK29yIGZpbGVzIHdpdGggdGhlIG5hbWUgPGNvZGU+dG9kby5odG1sPC9jb2RlPiBhcmUgZXhjbHVkZWQuPC9wPgorPHByZT4gICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7CisgICAgICAgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7CisgICAgICAgaW5jbHVkZXM9JnF1b3Q7YXBpLyoqLyouaHRtbCZxdW90OworICAgICAgIGV4Y2x1ZGVzPSZxdW90OyoqL3RvZG8uaHRtbCZxdW90OworICAvJmd0OzwvcHJlPgorPHA+emlwcyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeS4gT25seSBodG1sIGZpbGVzIHVuZGVyIHRoZSBkaXJlY3RvcnkgPGNvZGU+YXBpPC9jb2RlPgorYXJlIHppcHBlZCwgYW5kIGZpbGVzIHdpdGggdGhlIG5hbWUgPGNvZGU+dG9kby5odG1sPC9jb2RlPiBhcmUgZXhjbHVkZWQuPC9wPgorPHByZT4gICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDtDaGFuZ2VMb2cudHh0JnF1b3Q7LyZndDsKKyAgJmx0Oy96aXAmZ3Q7PC9wcmU+Cis8cD56aXBzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5LCBhbmQgYWxzbyBhZGRzIHRoZSBmaWxlIDxjb2RlPkNoYW5nZUxvZy50eHQ8L2NvZGU+IGluIHRoZQorY3VycmVudCBkaXJlY3RvcnkuIDxjb2RlPkNoYW5nZUxvZy50eHQ8L2NvZGU+IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRvcCBvZiB0aGUgWklQIGZpbGUsIGp1c3QgYXMgaWYKK2l0IGhhZCBiZWVuIGxvY2F0ZWQgYXQgPGNvZGU+aHRkb2NzL21hbnVhbC9DaGFuZ2VMb2cudHh0PC9jb2RlPi48L3A+Cis8cHJlPiAgJmx0O3ppcCBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC56aXAmcXVvdDsmZ3Q7CisgICAgJmx0O3ppcGZpbGVzZXQgZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsgcHJlZml4PSZxdW90O2RvY3MvdXNlci1ndWlkZSZxdW90Oy8mZ3Q7CisgICAgJmx0O3ppcGZpbGVzZXQgZGlyPSZxdW90Oy4mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7Q2hhbmdlTG9nMjcudHh0JnF1b3Q7IGZ1bGxwYXRoPSZxdW90O2RvY3MvQ2hhbmdlTG9nLnR4dCZxdW90Oy8mZ3Q7CisgICAgJmx0O3ppcGZpbGVzZXQgc3JjPSZxdW90O2V4YW1wbGVzLnppcCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmh0bWwmcXVvdDsgcHJlZml4PSZxdW90O2RvY3MvZXhhbXBsZXMmcXVvdDsvJmd0OworICAmbHQ7L3ppcCZndDs8L3ByZT4KKzxwPnppcHMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50byB0aGUgPGNvZGU+ZG9jcy91c2VyLWd1aWRlPC9jb2RlPiBkaXJlY3RvcnkKK2luIHRoZSBhcmNoaXZlLCBhZGRzIHRoZSBmaWxlIDxjb2RlPkNoYW5nZUxvZzI3LnR4dDwvY29kZT4gaW4gdGhlCitjdXJyZW50IGRpcmVjdG9yeSBhcyA8Y29kZT5kb2NzL0NoYW5nZUxvZy50eHQ8L2NvZGU+LCBhbmQgaW5jbHVkZXMgYWxsIHRoZSBodG1sIGZpbGVzIGluIDxjb2RlPmV4YW1wbGVzLnppcDwvY29kZT4gCit1bmRlciA8Y29kZT5kb2NzL2V4YW1wbGVzPC9jb2RlPi4gIFRoZSBhcmNoaXZlIG1pZ2h0IGVuZCB1cCBjb250YWluaW5nIHRoZSBmaWxlczo8L3A+Cis8cHJlPiAgICBkb2NzL3VzZXItZ3VpZGUvaHRtbC9pbmRleC5odG1sCisgICAgZG9jcy9DaGFuZ2VMb2cudHh0CisgICAgZG9jcy9leGFtcGxlcy9pbmRleC5odG1sCis8L3ByZT4KKzxwPgorVGhlIGNvZGUKKzxwcmU+CisgICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7Jmd0OworICAgICZsdDt6aXBmaWxlc2V0IGRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7IHByZWZpeD0mcXVvdDtkb2NzL3VzZXItZ3VpZGUmcXVvdDsvJmd0OworICAgICZsdDt6aXBncm91cGZpbGVzZXQgZGlyPSZxdW90Oy4mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7ZXhhbXBsZXMqLnppcCZxdW90Oy8mZ3Q7CisgICZsdDsvemlwJmd0OworPC9wcmU+Cis8cD4KKzxwPnppcHMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50byB0aGUgPGNvZGU+ZG9jcy91c2VyLWd1aWRlPC9jb2RlPiBkaXJlY3RvcnkgaW4gdGhlIGFyY2hpdmUgYW5kIGluY2x1ZGVzIGFsbCB0aGUgZmlsZXMgaW4gYW55IGZpbGUgdGhhdCBtYWNoZXMgPGNvZGU+ZXhhbXBsZXMqLnppcDwvY29kZT4sIHN1Y2ggYXMgYWxsIGZpbGVzIHdpdGhpbiA8Y29kZT5leGFtcGxlczEuemlwPC9jb2RlPiBvciA8Y29kZT5leGFtcGxlc19mb3JfYnJpYW4uemlwPC9jb2RlPi4KKworPHByZT4KKyZsdDt6aXAgZGVzdD0icmVsZWFzZS56aXAiJmd0OworICAmbHQ7dGFyZmlsZXNldCBzcmM9InJlbGVhc2UudGFyIi8mZ3Q7CismbHQ7L3ppcCZndDsKKzwvcHJlPgorCis8cD5SZS1wYWNrYWdlcyBhIFRBUiBhcmNoaXZlIGFzIGEgWklQIGFyY2hpdmUuICBJZiBVbml4IGZpbGUKK3Blcm1pc3Npb25zIGhhdmUgYmVlbiBzdG9yZWQgYXMgcGFydCBvZiB0aGUgVEFSIGZpbGUsIHRoZXkgd2lsbCBiZQorcmV0YWluZWQgaW4gdGhlIHJlc3VsdGluZyBaSVAgYXJjaGl2ZS48L3A+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9hbnRsaWIuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9hbnRsaWIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTEyOGEwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL2FudGxpYi5odG1sCkBAIC0wLDAgKzEsMjY3IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+PC9tZXRhPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+QW50TGliPC90aXRsZT4KKyAgPC9oZWFkPgorCisgIDxib2R5PgorICAgIDxoMj48YSBuYW1lPSJhbnRsaWIiPkFudGxpYjwvYT48L2gyPgorCisKKyAgICA8aDM+RGVzY3JpcHRpb248L2gzPgorICAgIDxwPgorICAgICAgQW4gYW50bGliIGZpbGUgaXMgYW4geG1sIGZpbGUgd2l0aCBhIHJvb3QgZWxlbWVudCBvZiAiYW50bGliIi4KKyAgICAgIEFudGxpYidzIGVsZW1lbnRzIGFyZSBhbnQgZGVmaW5pdGlvbiB0YXNrcyAtIGxpa2UKKyAgICAgIAorICAgICAgYW5kIDxhIGhyZWY9Ii4uL0NvcmVUYXNrcy90YXNrZGVmLmh0bWwiPlRhc2tkZWY8L2E+LAorICAgICAgb3IgYW55IGFudCB0YXNrIHRoYXQgZXh0ZW5kcworICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50bGliRGVmaW5pdGlvbjwvY29kZT4uCisgICAgPC9wPgorICAgIDxwPgorICAgICAgICBUaGUgY3VycmVudCBzZXQgb2YgZGVjbGFyYXRpb25zIGJ1bmRsZWQgd2l0aCBBbnQgdGhhdCBkbyB0aGlzIGFyZToKKyAgICA8L3A+CisgICAgICAgIDxvbD4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9Db3JlVGFza3MvdHlwZWRlZi5odG1sIj5UeXBlZGVmPC9hPgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9Db3JlVGFza3MvdGFza2RlZi5odG1sIj5UYXNrZGVmPC9hPgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9Db3JlVGFza3MvbWFjcm9kZWYuaHRtbCI+TWFjcm9kZWY8L2E+CisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL0NvcmVUYXNrcy9wcmVzZXRkZWYuaHRtbCI+UHJlc2V0ZGVmPC9hPgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9PcHRpb25hbFRhc2tzL3NjcmlwdGRlZi5odG1sIj5TY3JpcHRkZWY8L2E+CisgICAgICAgICAgICA8L2xpPgorICAgICAgICA8L29sPgorICAgIDxwPgorICAgICAgQSBncm91cCBvZiB0YXNrcyBhbmQgdHlwZXMgbWF5IGJlIGRlZmluZWQgdG9nZXRoZXIgaW4gYW4gYW50bGliCisgICAgICBmaWxlLiBGb3IgZXhhbXBsZSB0aGUgZmlsZSA8aT5zYW1wbGUueG1sPC9pPiBjb250YWlucyB0aGUgZm9sbG93aW5nOgorICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwcmU+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKKyZsdDthbnRsaWImZ3Q7CisgICAmbHQ7dHlwZWRlZiBuYW1lPSJpZiIgY2xhc3NuYW1lPSJvcmcuYWNtZS5hbnQuSWYiLyZndDsKKyAgICZsdDt0eXBlZGVmIG5hbWU9InNjcmlwdHBhdGhtYXBwZXIiCisgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hY21lLmFudC5TY3JpcHRQYXRoTWFwcGVyIgorICAgICAgICAgICAgb25lcnJvcj0iaWdub3JlIi8mZ3Q7CisgICAmbHQ7bWFjcm9kZWYgbmFtZT0icHJpbnQiJmd0OworICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJmaWxlIi8mZ3Q7CisgICAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgICZsdDtjb25jYXQgdGFza25hbWU9InByaW50IiZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IkB7ZmlsZX0iLyZndDsKKyAgICAgICAgICZsdDsvY29uY2F0Jmd0OworICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworICAgJmx0Oy9tYWNyb2RlZiZndDsKKyZsdDsvYW50bGliJmd0OworICAgICAgPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgSXQgZGVmaW5lcyB0d28gdHlwZXMgb3IgdGFza3MsIDxpPmlmPC9pPiBhbmQgPGk+c2NyaXB0cGF0aG1hcHBlcjwvaT4uCisgICAgICBUaGlzIGFudGxpYiBmaWxlIG1heSBiZSB1c2VkIGluIGEgYnVpbGQgc2NyaXB0IGFzIGZvbGxvd3M6CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHByZT4KKyZsdDt0eXBlZGVmIGZpbGU9InNhbXBsZS54bWwiLyZndDsKKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRoZSBvdGhlciBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gbWF5IGJlIHVzZWQgYXMgd2VsbC4KKyAgICAgIEZvciBleGFtcGxlLCBhc3N1bWluZyB0aGF0IHRoZSA8aT5zYW1wbGUueG1sPC9pPiBpcyBpbiBhIGphcgorICAgICAgZmlsZSA8aT5zYW1wbGUuamFyPC9pPiBhbHNvIGNvbnRhaW5pbmcgdGhlIGNsYXNzZXMsIHRoZQorICAgICAgZm9sbG93aW5nIGJ1aWxkIGZyYWdtZW50IHdpbGwgZGVmaW5lIHRoZSA8aT5pZjwvaT4gYW5kIDxpPnNjcmlwdHBhdGhtYXBwZXI8L2k+CisgICAgICB0YXNrcy90eXBlcyBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgbmFtZXNwYWNlIHVyaSA8aT5zYW1wbGVzOi9hY21lLm9yZzwvaT4uCisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHByZT4KKyZsdDt0eXBlZGVmIHJlc291cmNlPSJvcmcvYWNtZS9hbnQvc2FtcGxlLnhtbCIKKyAgICAgICAgIHVyaT0ic2FtcGxlczovYWNtZS5vcmciLyZndDsKKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRoZSBkZWZpbml0aW9ucyBtYXkgdGhlbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHByZT4KKyZsdDtzYW1wbGU6aWYgdmFsdWV0cnVlPSIke3Byb3BzfSIgeG1sbnM6c2FtcGxlPSJzYW1wbGVzOi9hY21lLm9yZyImZ3Q7CisgICAmbHQ7c2FtcGxlOnNjcmlwdHBhdGhtYXBwZXIgbGFuZ3VhZ2U9ImJlYW5zaGVsbCImZ3Q7CisgICAgICBzb21lIGJlYW4gc2hlbGwKKyAgICZsdDsvc2FtcGxlOnNjcmlwdHBhdGhtYXBwZXImZ3Q7CismbHQ7L3NhbXBsZTppZiZndDsKKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKworCisgICAgPGgzPjxhIG5hbWU9ImFudGxpYm5hbWVzcGFjZSI+QW50bGliIG5hbWVzcGFjZTwvYT48L2gzPgorICAgIDxwPgorICAgICAgVGhlIG5hbWUgc3BhY2UgVVJJcyB3aXRoIHRoZSBwYXR0ZXJuIDxiPmFudGxpYjo8aT5qYXZhIHBhY2thZ2U8L2k+PC9iPgorICAgICAgYXJlIGdpdmVuIHNwZWNpYWwgdHJlYXRtZW50LgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIFdoZW4gYW50IGVuY291bnRlcnMgYSBlbGVtZW50IHdpdGggYSBuYW1lc3BhY2UgVVJJIHdpdGggdGhpcyBwYXR0ZXJuLCBpdAorICAgICAgd2lsbCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSByZXNvdXJjZSBvZiB0aGUgbmFtZSA8aT5hbnRsaWIueG1sPC9pPiBpbgorICAgICAgdGhlIHBhY2thZ2UgZGlyZWN0b3J5IGluIHRoZSBkZWZhdWx0IGNsYXNzcGF0aC4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBGb3IgZXhhbXBsZSwgYXNzdW1pbmcgdGhhdCB0aGUgZmlsZSA8aT5hbnRjb250cmliLmphcjwvaT4gaGFzIGJlZW4gcGxhY2VkCisgICAgICBpbiB0aGUgZGlyZWN0b3J5IDxpPiR7YW50LmhvbWV9L2xpYjwvaT4gYW5kIGl0IGNvbnRhaW5zIHRoZSByZXNvdXJjZQorICAgICAgPGk+bmV0L3NmL2FudGNvbnRyaWIvYW50bGliLnhtbDwvaT4gd2hpY2ggaGFzIGFsbCBhbnRjb250cmliJ3MgZGVmaW5pdGlvbnMKKyAgICAgIGRlZmluZWQsIHRoZSBmb2xsb3dpbmcgYnVpbGQgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgbG9hZCB0aGUgYW50Y29udHJpYgorICAgICAgZGVmaW5pdGlvbnMgYXQgbG9jYXRpb24gPGk+SEVSRTwvaT46CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHByZT4KKyZsdDtwcm9qZWN0IGRlZmF1bHQ9ImRlbGV0ZXRlc3QiIHhtbG5zOmFudGNvbnRyaWI9ImFudGxpYjpuZXQuc2YuYW50Y29udHJpYiImZ3Q7CisgICAmbHQ7bWFjcm9kZWYgbmFtZT0ic2hvd2RpciImZ3Q7CisgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImRpciIvJmd0OworICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgICAgICAmbHQ7YW50Y29udHJpYjpzaGVsbHNjcmlwdCBzaGVsbD0iYmFzaCImZ3Q7ICAmbHQ7IS0tIEhFUkUgLS0mZ3Q7CisgICAgICAgICAgICBscyAtUmwgQHtkaXJ9CisgICAgICAgICAmbHQ7L2FudGNvbnRyaWI6c2hlbGxzY3JpcHQmZ3Q7CisgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CisgICAmbHQ7L21hY3JvZGVmJmd0OworCisgICAmbHQ7dGFyZ2V0IG5hbWU9ImRlbGV0ZXRlc3QiJmd0OworICAgICAgJmx0O2RlbGV0ZSBkaXI9ImEiIHF1aWV0PSJ5ZXMiLyZndDsKKyAgICAgICZsdDtta2RpciBkaXI9ImEvYiIvJmd0OworICAgICAgJmx0O3RvdWNoIGZpbGU9ImEvYS50eHQiLyZndDsKKyAgICAgICZsdDt0b3VjaCBmaWxlPSJhL2IvYi50eHQiLyZndDsKKyAgICAgICZsdDtkZWxldGUmZ3Q7CisgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9ImEiLyZndDsKKyAgICAgICZsdDsvZGVsZXRlJmd0OworICAgICAgJmx0O3Nob3dkaXIgZGlyPSJhIi8mZ3Q7CisgICAmbHQ7L3RhcmdldCZndDsKKyZsdDsvcHJvamVjdCZndDsKKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSByZXNvdXJjZSBpcyBpbiB0aGUgZGVmYXVsdCBjbGFzc3BhdGgKKyAgICAgIG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBBbnQuPC9wPgorICAgIDwvcD4KKworCisJPGgzPjxhIG5hbWU9ImxvYWRGcm9tSW5zaWRlIj5Mb2FkIGFudGxpYiBmcm9tIGluc2lkZSBvZiB0aGUgYnVpbGRmaWxlPC9hPjwvaDM+CisJPHA+CisJICBJZiB5b3Ugd2FudCB0byBzZXBlcmF0ZSB0aGUgYW50bGliIGZyb20geW91ciBsb2NhbCBBbnQgaW5zdGFsbGF0aW9uLCBlLmcuIGJlY2F1c2UgeW91IAorCSAgd2FudCB0byBob2xkIHRoYXQgamFyIGluIHlvdXIgcHJvamVjdHMgU0NNIHN5c3RlbSwgeW91IGhhdmUgdG8gc3BlY2lmeSBhIGNsYXNzcGF0aCwgc28gCisJICB0aGF0IEFudCBjb3VsZCBmaW5kIHRoYXQgamFyLiBUaGUgYmVzdCBzb2x1dGlvbiBpcyBsb2FkaW5nIHRoZSBhbnRsaWIgd2l0aCA8dHQ+Jmx0O3Rhc2tkZWYmZ3Q7PC90dD4uCisJPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHByZT4KKyZsdDtwcm9qZWN0IHhtbG5zOjxmb250IGNvbG9yPSJncmVlbiI+YW50Y29udHJpYjwvZm9udD49Ijxmb250IGNvbG9yPSJyZWQiPmFudGxpYjpuZXQuc2YuYW50Y29udHJpYjwvZm9udD4iJmd0OworICAgJmx0O3Rhc2tkZWYgdXJpPSI8Zm9udCBjb2xvcj0icmVkIj5hbnRsaWI6bmV0LnNmLmFudGNvbnRyaWI8L2ZvbnQ+IgorICAgICAgICAgICAgcmVzb3VyY2U9Im5ldC9zZi9hbnRjb250cmliL2FudGxpYi54bWwiCisgICAgICAgICAgICBjbGFzc3BhdGg9InBhdGgvdG8vYW50LWNvbnRyaWIuamFyIi8mZ3Q7CisgICAKKyAgICZsdDt0YXJnZXQgbmFtZT0iaXRlcmF0ZSImZ3Q7CisgICAgICAmbHQ7PGZvbnQgY29sb3I9ImdyZWVuIj5hbnRjb250cmliPC9mb250Pjpmb3IgcGFyYW09ImZpbGUiJmd0OworICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIuIi8mZ3Q7CisgICAgICAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgICAgICZsdDtlY2hvIG1lc3NhZ2U9Ii0gQHtmaWxlfSIvJmd0OworICAgICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworICAgICAgJmx0Oy9hbnRjb250cmliOmZvciZndDsKKyAgICZsdDsvdGFyZ2V0Jmd0OworJmx0Oy9wcm9qZWN0Jmd0OworICAgICAgPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorCisJCisJCisKKyAgICA8aDM+PGEgbmFtZT0iY3VycmVudG5hbWVzcGFjZSI+Q3VycmVudCBuYW1lc3BhY2U8L2E+PC9oMz4KKyAgICA8cD4KKyAgICAgIERlZmluaXRpb25zIGRlZmluZWQgaW4gYW50bGlicyBtYXkgYmUgdXNlZCBpbiBhbnRsaWJzLiBIb3dldmVyCisgICAgICB0aGUgbmFtZXNwYWNlIHRoYXQgZGVmaW5pdGlvbnMgYXJlIHBsYWNlZCBpbiBhcmUgZGVwZW5kZW50IG9uCisgICAgICB0aGUgPGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7PC9jb2RlPiB0aGF0IHVzZXMgdGhlIGFudGxpYi4gVG8gZGVhbCB3aXRoIHRoaXMKKyAgICAgIHByb2JsZW0sIHRoZSBkZWZpbml0aW9ucyBhcmUgcGxhY2VkIGluIHRoZSBuYW1lcGFjZSBVUkkgPGk+YW50OmN1cnJlbnQ8L2k+CisgICAgICBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBhbnRsaWIgZXhlY3V0aW9uLgorICAgICAgRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBhbnRsaWIgZGVmaW5lcyB0aGUgdGFzayA8Y29kZT4mbHQ7aWYmZ3Q7PC9jb2RlPiwgdGhlCisgICAgICB0eXBlIDxjb2RlPiZsdDtpc2FsbG93ZWQmZ3Q7PC9jb2RlPiBhbmQgYSBtYWNybworICAgICAgPGNvZGU+Jmx0O2lmYWxsb3dlZCZndDs8L2NvZGU+IHRoYXQgbWFrZXMgdXNlIG9mIHRoZSB0YXNrIGFuZCB0eXBlOgorICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwcmU+CismbHQ7YW50bGliIHhtbG5zOmN1cnJlbnQ9ImFudDpjdXJyZW50IiZndDsKKyAgICZsdDt0YXNrZGVmIG5hbWU9ImlmIiBjbGFzc25hbWU9Im9yZy5hY21lLmFudC5JZiIvJmd0OworICAgJmx0O3R5cGVkZWYgbmFtZT0iaXNhbGxvd2VkIiBjbGFzc25hbWU9Im9yZy5hY21lLmFudC5Jc2FsbG93ZWQiLyZndDsKKyAgICZsdDttYWNyb2RlZiBuYW1lPSJpZmFsbG93ZWQiJmd0OworICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJhY3Rpb24iLyZndDsKKyAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRvIi8mZ3Q7CisgICAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgICZsdDtjdXJyZW50OmlmJmd0OworICAgICAgICAgICAgJmx0O2N1cnJlbnQ6aXNhbGxvd2VkIHRlc3Q9IkB7YWN0aW9ufSIvJmd0OworICAgICAgICAgICAgJmx0O2N1cnJlbnQ6dGhlbiZndDsKKyAgICAgICAgICAgICAgICZsdDtkby8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2N1cnJlbnQ6dGhlbiZndDsKKyAgICAgICAgICZsdDsvY3VycmVudDppZiZndDsKKyAgICAgICZsdDsvc2VxdWVudGlhbCZndDsKKyAgICZsdDsvbWFjcm9kZWYmZ3Q7CismbHQ7L2FudGxpYiZndDsKKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKworCisgICAgPGgzPk90aGVyIGV4YW1wbGVzIGFuZCBjb21tZW50czwvaDM+CisgICAgPHA+CisgICAgICBBbnRsaWJzIG1heSBtYWtlIHVzZSBvZiBvdGhlciBhbnRsaWJzLgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIEFzIHRoZSBuYW1lcyBkZWZpbmVkIGluIHRoZSBhbnRsaWIgYXJlIGluIHRoZSBuYW1lc3BhY2UgdXJpIGFzCisgICAgICBzcGVjaWZpZWQgYnkgdGhlIGNhbGxpbmcgPGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7PC9jb2RlPiBvciBieSBhdXRvbWF0aWMgZWxlbWVudAorICAgICAgcmVzb2x1dGlvbiwgb25lIG1heSByZXVzZSBuYW1lcyBmcm9tIGNvcmUgYW50IHR5cGVzIGFuZCB0YXNrcywKKyAgICAgIHByb3ZpZGVkIHRoZSBjYWxsZXIgdXNlcyBhIG5hbWVzcGFjZSB1cmkuIEZvciBleGFtcGxlLCB0aGUKKyAgICAgIGZvbGxvd2luZyBhbnRsaWIgbWF5IGJlIHVzZWQgdG8gZGVmaW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzCisgICAgICB0YXNrczoKKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cHJlPgorJmx0O2FudGxpYiB4bWxuczphbnRjb250cmliPSJhbnRsaWI6bmV0LnNmLmFudGNvbnRyaWIiJmd0OworICAgJmx0O3ByZXNldGRlZiBuYW1lPSJqYXZhYyImZ3Q7CisgICAgICAmbHQ7amF2YWMgZGVwcmVjYXRpb249IiR7ZGVwcmVjYXRpb259IgorICAgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIvJmd0OworICAgJmx0Oy9wcmVzZXRkZWYmZ3Q7CisgICAmbHQ7cHJlc2V0ZGVmIG5hbWU9ImRlbGV0ZSImZ3Q7CisgICAgICAmbHQ7ZGVsZXRlIHF1aWV0PSJ5ZXMiLyZndDsKKyAgICZsdDsvcHJlc2V0ZGVmJmd0OworICAgJmx0O3ByZXNldGRlZiBuYW1lPSJzaGVsbHNjcmlwdCImZ3Q7CisgICAgICAmbHQ7YW50Y29udHJpYjpzaGVsbHNjcmlwdCBzaGVsbD0iYmFzaCIvJmd0OworICAgJmx0Oy9wcmVzZXRkZWYmZ3Q7CismbHQ7L2FudGxpYiZndDsKKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRoaXMgbWF5IGJlIHVzZWQgYXMgZm9sbG93czoKKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cHJlPgorJmx0O3Byb2plY3QgeG1sbnM6bG9jYWw9ImxvY2FscHJlc2V0cyImZ3Q7CisgICAmbHQ7dHlwZWRlZiBmaWxlPSJsb2NhbHByZXNldHMueG1sIiB1cmk9ImxvY2FscHJlc2V0cyIvJmd0OworICAgJmx0O2xvY2FsOnNoZWxsc2NyaXB0Jmd0OworICAgICAgZWNobyAiaGVsbG8gd29ybGQiCisgICAmbHQ7L2xvY2FsOnNoZWxsc2NyaXB0Jmd0OworJmx0Oy9wcm9qZWN0Jmd0OworICAgICAgPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIAorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL2Fzc2VydGlvbnMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9hc3NlcnRpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxMTdkYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9hc3NlcnRpb25zLmh0bWwKQEAgLTAsMCArMSwyMDggQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+QXNzZXJ0aW9ucyB0eXBlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJhc3NlcnRpb25zIj5Bc3NlcnRpb25zPC9hPjwvaDI+Cis8cD4KK1RoZSA8dHQ+YXNzZXJ0aW9uczwvdHQ+IHR5cGUgZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgSmF2YSAxLjQgYXNzZXJ0aW9ucyBmZWF0dXJlLAorb24gYSB3aG9sZSBKYXZhIHByb2dyYW0sIG9yIGNvbXBvbmVudHMgb2YgYSBwcm9ncmFtLiBJdCBjYW4gYmUgdXNlZAoraW4gPGEgaHJlZj0iLi4vQ29yZVRhc2tzL2phdmEuaHRtbCI+PGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPjwvYT4gYW5kCis8YSBocmVmPSIuLi9PcHRpb25hbFRhc2tzL2p1bml0Lmh0bWwiPjxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+PC9hPiB0byBhZGQgZXh0cmEgdmFsaWRhdGlvbiB0byBjb2RlLiAgCisKKzxwPgorQXNzZXJ0aW9ucyBhcmUgY292ZXJlZCBpbiB0aGUgCis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9ndWlkZS9sYW5nL2Fzc2VydC5odG1sIj5KMlNESyAxLjQgZG9jdW1lbnRhdGlvbjwvYT4sCithbmQgdGhlCis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL2Fzc2VydC1zcGVjLmh0bWwiPkphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbjwvYT4uCisKKzxwPgorVGhlIGtleSBwb2ludHMgdG8gbm90ZSBhcmUgdGhhdCBhIDx0dD5qYXZhLmxhbmcuQXNzZXJ0aW9uRXJyb3I8L3R0PgoraXMgdGhyb3duIHdoZW4gYW4gYXNzZXJ0aW9uIGZhaWxzLCBhbmQgdGhhdCB0aGUgZmFjaWxpdHkgaXMgb25seSBhdmFpbGFibGUgCitvbiBKYXZhIDEuNCBhbmQgbGF0ZXIuIFRvIGVuYWJsZSBhc3NlcnRpb25zIG9uZSBtdXN0IHNldCA8dHQ+c291cmNlPSIxLjQiPC90dD4KKyhvciBsYXRlcikgaW4gPHR0PiZsdDtqYXZhYyZndDs8L3R0PiB3aGVuIHRoZSBzb3VyY2UgaXMgYmVpbmcgY29tcGlsZWQsIGFuZAordGhhdCB0aGUgY29kZSBtdXN0IGNvbnRhaW4gPHR0PmFzc2VydDwvdHQ+IHN0YXRlbWVudHMgdG8gYmUgdGVzdGVkLiBUaGUKK3Jlc3VsdCBvZiBzdWNoIGFuIGFjdGlvbiBpcyBjb2RlIHRoYXQgbmVpdGhlciBjb21waWxlcyBvciBydW5zIG9uIGVhcmxpZXIKK3ZlcnNpb25zIG9mIEphdmEuIEZvciB0aGlzIHJlYXNvbiBBbnQgaXRzZWxmIGN1cnJlbnRseSBjb250YWlucyBubyBhc3NlcnRpb25zLgorPHA+CisKK1doZW4gYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZCAob3IgZGlzYWJsZWQpIGluIGEgdGFzayB0aHJvdWdoIG5lc3RlZCAKK2Fzc2VydGlvbnMgZWxlbWVudHMsIHRoZSBjbGFzcyBsb2FkZXIgb3IgY29tbWFuZCBsaW5lIGlzIG1vZGlmaWVkIHdpdGggdGhlIAorYXBwcm9wcmlhdGUgb3B0aW9ucy4gVGhpcyBtZWFucyB0aGF0IHRoZSBKVk0gZXhlY3V0ZWQgbXVzdCBiZSBhIEphdmEgMS40CitvciBsYXRlciBKVk0sIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUuIEF0dGVtcHRpbmcgdG8KK2VuYWJsZSBhc3NlcnRpb25zIG9uIGVhcmxpZXIgVk1zIHdpbGwgcmVzdWx0IGluIGFuICJVbnJlY29nbml6ZWQgb3B0aW9uIiAKK2Vycm9yIGFuZCB0aGUgSlZNIHdpbGwgbm90IHN0YXJ0LiAgCisKKzxwPgorPGg0PkF0dHJpYnV0ZXM8L2g0PgorPHA+CisKKworPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5hYmxlU3lzdGVtQXNzZXJ0aW9uczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5GbGFnIHRvIHR1cm4gc3lzdGVtIGFzc2VydGlvbnMgb24gb3Igb2ZmLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyAidW5zcGVjaWZpZWQiPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD4KK1doZW4gc3lzdGVtIGFzc2VydGlvbnMgaGF2ZSBiZWVuIG5laXRoZXIgZW5hYmxlZCBub3IgZGlzYWJsZWQsIHRoZW4KK3RoZSBKVk0gaXMgbm90IGdpdmVuIGFueSBhc3NlcnRpb24gaW5mb3JtYXRpb24gLSB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgdGhlCisgY3VycmVudCBKVk1zIGlzIHRvIGRpc2FibGUgc3lzdGVtIGFzc2VydGlvbnMuIAorPHA+CitOb3RlIGFsc28gdGhhdCB0aGVyZSBpcyBubyBhcHBhcmVudCBkb2N1bWVudGF0aW9uIGZvciB3aGF0IHBhcnRzIG9mIHRoZQorSlJFIGNvbWUgd2l0aCB1c2VmdWwgYXNzZXJ0aW9ucy4KKworPGgzPk5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND5lbmFibGU8L2g0PgorPHA+CitFbmFibGUgYXNzZXJ0aW9ucyBpbiBwb3J0aW9ucyBvZiBjb2RlLgorSWYgbmVpdGhlciBhIHBhY2thZ2Ugbm9yIGNsYXNzIGlzIHNwZWNpZmllZCwgYXNzZXJ0aW9ucyBhcmUgdHVybmVkIG9uIGluIDxpPmFsbDwvaT4gKHVzZXIpIGNvZGUuCis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGNsYXNzIG9uIHdoaWNoIHRvIGVuYWJsZSBhc3NlcnRpb25zLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhY2thZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgVGhlIG5hbWUgb2YgYSBwYWNrYWdlIGluIHdoaWNoIHRvIGVuYWJsZSBhc3NlcnRpb25zIG9uIGFsbCBjbGFzc2VzLiAoSW5jbHVkZXMgc3VicGFja2FnZXMuKQorICAgIFVzZSAiPHR0Pi4uLjwvdHQ+IiBmb3IgdGhlIGFub255bW91cyBwYWNrYWdlLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+ZGlzYWJsZTwvaDQ+Cis8cD4KK0Rpc2FibGUgYXNzZXJ0aW9ucyBpbiBwb3J0aW9ucyBvZiBjb2RlLgorCis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGNsYXNzIG9uIHdoaWNoIHRvIGRpc2FibGUgYXNzZXJ0aW9ucy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYWNrYWdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgIFRoZSBuYW1lIG9mIGEgcGFja2FnZSBpbiB3aGljaCB0byBkaXNhYmxlIGFzc2VydGlvbnMgb24gYWxsIGNsYXNzZXMuIChJbmNsdWRlcyBzdWJwYWNrYWdlcy4pCisgICAgVXNlICI8dHQ+Li4uPC90dD4iIGZvciB0aGUgYW5vbnltb3VzIHBhY2thZ2UuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD4KKworQmVjYXVzZSBhc3NlcnRpb25zIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LCBpdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGRpc2FibGUKK2Fzc2VydGlvbnMgd2hlcmUgdGhleSBoYXZlIGJlZW4gZW5hYmxlZCBpbiBhIHBhcmVudCBwYWNrYWdlLgorCisKKzxoND5FeGFtcGxlczwvaDQ+CisKKzxoNT5FeGFtcGxlOiBlbmFibGUgYXNzZXJ0aW9ucyBpbiBhbGwgdXNlciBjbGFzc2VzPC9oNT4KKworQWxsIGNsYXNzZXMgbm90IGluIHRoZSBKUkUgKGkuZS4gYWxsIG5vbi1zeXN0ZW0gY2xhc3Nlcykgd2lsbCBoYXZlIGFzc2VydGlvbnMgdHVybmVkIG9uLgorPHByZT4KKyZsdDthc3NlcnRpb25zJmd0OworICAmbHQ7ZW5hYmxlLyZndDsKKyZsdDsvYXNzZXJ0aW9ucyZndDsKKzwvcHJlPgorCis8aDU+RXhhbXBsZTogZW5hYmxlIGEgc2luZ2xlIGNsYXNzPC9oNT4KKworRW5hYmxlIGFzc2VydGlvbnMgaW4gYSBjbGFzcyBjYWxsZWQgVGVzdAorPHByZT4KKyZsdDthc3NlcnRpb25zJmd0OworICAmbHQ7ZW5hYmxlIGNsYXNzPSJUZXN0Ii8mZ3Q7CismbHQ7L2Fzc2VydGlvbnMmZ3Q7Cis8L3ByZT4KKworPGg1PkV4YW1wbGU6IGVuYWJsZSBhIHBhY2thZ2U8L2g1PgorCitFbmFibGUgYXNzZXJ0aW9ucyBpbiB0aGUgPHR0Pm9yZy5hcGFjaGU8L3R0PiBwYWNrYWdlCithbmQgYWxsIHBhY2thZ2VzIHN0YXJ0aW5nIHdpdGggdGhlIDx0dD5vcmcuYXBhY2hlLjwvdHQ+IHByZWZpeAorPHByZT4KKyZsdDthc3NlcnRpb25zJmd0OworICAmbHQ7ZW5hYmxlIHBhY2thZ2U9Im9yZy5hcGFjaGUiLyZndDsKKyZsdDsvYXNzZXJ0aW9ucyZndDsKKzwvcHJlPgorCis8aDU+RXhhbXBsZTogU3lzdGVtIGFzc2VydGlvbnM8L2g1PgorCitFeGFtcGxlOiBlbmFibGUgc3lzdGVtIGFzc2VydGlvbnMgYW5kIGFzc2VydGlvbnMgaW4gYWxsIDx0dD5vcmcuYXBhY2hlPC90dD4gcGFja2FnZXMgZXhjZXB0Citmb3IgQW50IChidXQgaW5jbHVkaW5nIDx0dD5vcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluPC90dD4pCis8cHJlPgorJmx0O2Fzc2VydGlvbnMgZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucz0idHJ1ZSImZ3Q7CisgICZsdDtlbmFibGUgcGFja2FnZT0ib3JnLmFwYWNoZSIvJmd0OworICAmbHQ7ZGlzYWJsZSBwYWNrYWdlPSJvcmcuYXBhY2hlLnRvb2xzLmFudCIvJmd0OworICAmbHQ7ZW5hYmxlIGNsYXNzPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluIi8mZ3Q7CismbHQ7L2Fzc2VydGlvbnMmZ3Q7Cis8L3ByZT4KKworPGg1PkV4YW1wbGU6IGRpc2FibGVkIGFuZCBhbm9ueW1vdXMgcGFja2FnZSBhc3NlcnRpb25zPC9oNT4KKworRGlzYWJsZSBzeXN0ZW0gYXNzZXJ0aW9uczsgZW5hYmxlIHRob3NlIGluIHRoZSBhbm9ueW1vdXMgcGFja2FnZQorPHByZT4KKyZsdDthc3NlcnRpb25zIGVuYWJsZVN5c3RlbUFzc2VydGlvbnM9ImZhbHNlIiZndDsKKyAgJmx0O2VuYWJsZSBwYWNrYWdlPSIuLi4iLyZndDsKKyZsdDsvYXNzZXJ0aW9ucyZndDsKKzwvcHJlPgorCisKKzxoNT5FeGFtcGxlOiByZWZlcmVuY2VkIGFzc2VydGlvbnM8L2g1PgorCitUaGlzIHR5cGUgaXMgYSBkYXRhdHlwZSwgc28geW91IGNhbiBkZWNsYXJlIGFzc2VydGlvbnMgYW5kIHVzZSB0aGVtIGxhdGVyCisKKzxwcmU+CismbHQ7YXNzZXJ0aW9ucyBpZD0icHJvamVjdC5hc3NlcnRpb25zIiZndDsKKyAgJmx0O2VuYWJsZSBwYWNrYWdlPSJvcmcuYXBhY2hlLnRlc3QiLyZndDsKKyZsdDsvYXNzZXJ0aW9ucyZndDsKKworJmx0O2Fzc2VydGlvbnMgcmVmaWQ9InByb2plY3QuYXNzZXJ0aW9ucyIvJmd0OworPC9wcmU+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL2N1c3RvbS1wcm9ncmFtbWluZy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL2N1c3RvbS1wcm9ncmFtbWluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjk0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvY3VzdG9tLXByb2dyYW1taW5nLmh0bWwKQEAgLTAsMCArMSw0MTUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+PC9tZXRhPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5DdXN0b20gQ29tcG9uZW50czwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgyPkN1c3RvbSBDb21wb25lbnRzPC9oMj4KKyAgICA8aDM+T3ZlcnZpZXc8L2gzPgorICAgIDxwPgorICAgICAgQ3VzdG9tIGNvbXBvbmVudHMgYXJlIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgZmlsdGVycyBhbmQgb3RoZXIKKyAgICAgIG9iamVjdHMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIGFudCBjb3JlLgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIEluIEFudCAxLjYgY3VzdG9tIGNvbmRpdGlvbnMsIHNlbGVjdG9ycyBhbmQgZmlsdGVycyBoYXMKKyAgICAgIGJlZW4gb3ZlcmhhdWxlZC4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBJdCBpcyBub3cgcG9zc2libGUgdG8gZGVmaW5lIGN1c3RvbSBjb25kaXRpb25zLCBzZWxlY3RvcnMgYW5kIGZpbHRlcnMKKyAgICAgIHRoYXQgYmVoYXZlIGxpa2UgQW50IENvcmUgY29tcG9uZW50cy4KKyAgICAgIFRoaXMgaXMgYWNoaWV2ZWQgYnkgYWxsb3dpbmcgZGF0YXR5cGVzIGRlZmluZWQgaW4gYnVpbGQgc2NyaXB0cworICAgICAgdG8gYmUgdXNlZCBhcyBjdXN0b20gY29tcG9uZW50cyBpZiB0aGUgY2xhc3Mgb2YgdGhlIGRhdGF0eXBlCisgICAgICBpcyBjb21wYXRpYmxlLCBvciBoYXMgYmVlbiBhZGFwdGVkIGJ5IGFuIGFkYXB0ZXIgY2xhc3MuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgVGhlIG9sZCBtZXRob2RzIG9mIGRlZmluaW5nIGN1c3RvbSBjb21wb25lbnRzIGFyZSBzdGlsbCBzdXBwb3J0ZWQuCisgICAgPC9wPgorICAgIDxoMz5EZWZpbml0aW9uIGFuZCB1c2U8L2gzPgorICAgIDxwPgorICAgICAgQSBjdXN0b20gY29tcG9uZW50IGlzIGEgbm9ybWFsIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgcGFydGljdWxhcgorICAgICAgaW50ZXJmYWNlIG9yIGV4dGVuZHMgYSAgcGFydGljdWxhciBjbGFzcywgb3IgaGFzIGJlZW4gYWRhcHRlZCB0byB0aGUKKyAgICAgIGludGVyZmFjZSBvciBjbGFzcy4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBJdCBpcyBleGFjdGx5IGxpa2Ugd3JpdGluZyBhCisgICAgICA8YSBocmVmPSIuLi9kZXZlbG9wLmh0bWwjd3JpdGluZ293bnRhc2siPmN1c3RvbSB0YXNrPC9hPi4KKyAgICAgIE9uZSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cyBieSB3cml0aW5nIDxpPnNldHRlcjwvaT4KKyAgICAgIG1ldGhvZHMgYW5kIDxpPmFkZDwvaT4gbWV0aG9kcy4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBBZnRlciB0aGUgY2xhc3MgaGFzIGJlZW4gd3JpdHRlbiwgaXQgaXMgYWRkZWQgdG8gdGhlIGFudCBzeXN0ZW0KKyAgICAgIGJ5IHVzaW5nIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4uCisgICAgPC9wPgorICAgIDxoMz48YSBuYW1lPSJjdXN0b21jb25kaXRpb25zIj5DdXN0b20gQ29uZGl0aW9uczwvYT48L2gzPgorICAgIDxwPgorICAgICAgQ3VzdG9tIGNvbmRpdGlvbnMgYXJlIGRhdGF0eXBlcyB0aGF0IGltcGxlbWVudAorICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbjwvY29kZT4uCisgICAgICBGb3IgZXhhbXBsZSBhIGN1c3RvbSBjb25kaXRpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYQorICAgICAgc3RyaW5nIGlzIGFsbCB1cHBlciBjYXNlIGNvdWxkIGJlIHdyaXR0ZW4gYXM6CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHByZT4KK3BhY2thZ2UgY29tLm15ZG9tYWluOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbjsKKworcHVibGljIGNsYXNzIEFsbFVwcGVyQ2FzZUNvbmRpdGlvbiBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAvLyBUaGUgc2V0dGVyIGZvciB0aGUgInZhbHVlIiBhdHRyaWJ1dGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8vIFRoaXMgbWV0aG9kIGV2YWx1YXRlcyB0aGUgY29uZGl0aW9uCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidmFsdWUgYXR0cmlidXRlIGlzIG5vdCBzZXQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKS5lcXVhbHModmFsdWUpOworICAgfQorfQorICAgICAgPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorCisgICAgPHA+CisgICAgICAgIEFkZGluZyB0aGUgY29uZGl0aW9uIHRvIHRoZSBzeXN0ZW0gaXMgYWNoaWV2ZWQgYXMgZm9sbG93czoKKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cHJlPgorJmx0O3R5cGVkZWYKKyAgICBuYW1lPSJhbGx1cHBlcmNhc2UiCisgICAgY2xhc3NuYW1lPSJjb20ubXlkb21haW4uQWxsVXBwZXJDYXNlQ29uZGl0aW9uIgorICAgIGNsYXNzcGF0aD0iJHtteWRvbWFpbi5jbGFzc2VzfSIvJmd0OworICAgICAgPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgVGhpcyBjb25kaXRpb24gY2FuIG5vdyBiZSB1c2VkIHdoZXJldmVyIGEgQ29yZSBBbnQgY29uZGl0aW9uCisgICAgICBpcyB1c2VkLgorICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwcmU+CismbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSJhbGx1cHBlciImZ3Q7CisgICAmbHQ7YWxsdXBwZXJjYXNlIHZhbHVlPSJUSElTIElTIEFMTCBVUFBFUiBDQVNFIi8mZ3Q7CismbHQ7L2NvbmRpdGlvbiZndDsKKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICA8aDM+PGEgbmFtZT0iY3VzdG9tc2VsZWN0b3JzIj5DdXN0b20gU2VsZWN0b3JzPC9hPjwvaDM+CisgICAgPHA+CisgICAgICBDdXN0b20gc2VsZWN0b3JzIGFyZSBkYXRhdHlwZXMgdGhhdCBpbXBsZW1lbnQKKyAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I8L2NvZGU+LgorICAgIDwvcD4KKyAgICA8cD5UaGVyZSBpcyBvbmx5IG9uZSBtZXRob2QgcmVxdWlyZWQuCisgICAgICA8Y29kZT5wdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLAorICAgICAgICBGaWxlIGZpbGUpPC9jb2RlPi4KKyAgICAgIEl0IHJldHVybnMgdHJ1ZQorICAgICAgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgc2hvdWxkIGJlCisgICAgICBzZWxlY3RlZCBvciBub3QuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgQW4gZXhhbXBsZSBvZiBhIGN1c3RvbSBzZWxlY3Rpb24gdGhhdCBzZWxlY3RzIGZpbGVuYW1lcyBlbmRpbmcKKyAgICAgIGluICIuamF2YSIgd291bGQgYmU6CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHByZT4KK3BhY2thZ2UgY29tLm15ZG9tYWluOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZVNlbGVjdG9yOworcHVibGljIGNsYXNzIEphdmFTZWxlY3RvciBpbXBsZW1lbnRzIEZpbGVTZWxlY3RvciB7CisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmKSB7CisgICAgICAgcmV0dXJuIGZpbGVuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIik7CisgICAgfQorfQorICAgICAgPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgQWRkaW5nIHRoZSBzZWxlY3RvciB0byB0aGUgc3lzdGVtIGlzIGFjaGlldmVkIGFzIGZvbGxvd3M6CisgICAgPC9wPgorICAgIDxibG9ja3F1b3RlPgorICAgICAgPHByZT4KKyZsdDt0eXBlZGVmCisgICAgbmFtZT0iamF2YXNlbGVjdG9yIgorICAgIGNsYXNzbmFtZT0iY29tLm15ZG9tYWluLkphdmFTZWxlY3RvciIKKyAgICBjbGFzc3BhdGg9IiR7bXlkb21haW4uY2xhc3Nlc30iLyZndDsKKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICAgICAgPHA+CisgICAgICBUaGlzIHNlbGVjdG9yIGNhbiBub3cgYmUgdXNlZCB3aGVyZXZlciBhIENvcmUgQW50IHNlbGVjdG9yCisgICAgICBpcyB1c2VkLCBmb3IgZXhhbXBsZToKKyAgICA8L3A+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8cHJlPgorJmx0O2NvcHkgdG9kaXI9InRvIiZndDsKKyAgICZsdDtmaWxlc2V0IGRpcj0ic3JjIiZndDsKKyAgICAgICZsdDtqYXZhc2VsZWN0b3IvJmd0OworICAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9jb3B5Jmd0OworICAgICAgPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorCisgICAgICA8cD4KKyAgICAgICAgT25lIG1heSB1c2UKKyAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvcjwvY29kZT4sCisgICAgICAgIGEgY29udmVuaWVuY2UgY2xhc3MgdGhhdCBwcm92aWRlcyByZWFzb25hYmxlIGRlZmF1bHQKKyAgICAgICAgYmVoYXZpb3VyLgorICAgICAgICBJdCBoYXMgc29tZSBwcmVkZWZpbmVkIGJlaGF2aW91cnMgeW91IGNhbiB0YWtlIGFkdmFudGFnZQorICAgICAgICBvZi4gQW55IHRpbWUgeW91IGVuY291bnRlciBhIHByb2JsZW0gd2hlbiBzZXR0aW5nIGF0dHJpYnV0ZXMgb3IKKyAgICAgICAgYWRkaW5nIHRhZ3MsIHlvdSBjYW4gY2FsbCBzZXRFcnJvcihTdHJpbmcgZXJybXNnKSBhbmQgdGhlIGNsYXNzCisgICAgICAgIHdpbGwga25vdyB0aGF0IHRoZXJlIGlzIGEgcHJvYmxlbS4gVGhlbiwgYXQgdGhlIHRvcCBvZiB5b3VyCisgICAgICAgIDxjb2RlPmlzU2VsZWN0ZWQoKTwvY29kZT4gbWV0aG9kIGNhbGwgPGNvZGU+dmFsaWRhdGUoKTwvY29kZT4gYW5kCisgICAgICAgIGEgQnVpbGRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gd2l0aCB0aGUgY29udGVudHMgb2YgeW91ciBlcnJvcgorICAgICAgICBtZXNzYWdlLiBUaGUgPGNvZGU+dmFsaWRhdGUoKTwvY29kZT4gbWV0aG9kIGFsc28gZ2l2ZXMgeW91IGEKKyAgICAgICAgbGFzdCBjaGFuY2UgdG8gY2hlY2sgeW91ciBzZXR0aW5ncyBmb3IgY29uc2lzdGVuY3kgYmVjYXVzZSBpdAorICAgICAgICBjYWxscyA8Y29kZT52ZXJpZnlTZXR0aW5ncygpPC9jb2RlPi4gT3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kCisgICAgICAgIGNhbGwgPGNvZGU+c2V0RXJyb3IoKTwvY29kZT4gd2l0aGluIGl0IGlmIHlvdSBkZXRlY3QgYW55CisgICAgICAgIHByb2JsZW1zIGluIGhvdyB5b3VyIHNlbGVjdG9yIGlzIHNldCB1cC4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBUbyB3cml0ZSBjdXN0b20gc2VsZWN0b3IgY29udGFpbmVycyBvbmUgc2hvdWxkIGV4dGVuZAorICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvckNvbnRhaW5lcjwvY29kZT4uCisgICAgICBJbXBsZW1lbnQgdGhlCisgICAgICA8Y29kZT5wdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZURpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpPC9jb2RlPgorICAgICAgbWV0aG9kIHRvIGRvIHRoZSByaWdodCB0aGluZy4gQ2hhbmNlcyBhcmUgeW91J2xsIHdhbnQgdG8gaXRlcmF0ZQorICAgICAgb3ZlciB0aGUgc2VsZWN0b3JzIHVuZGVyIHlvdSwgc28gdXNlCisgICAgICA8Y29kZT5zZWxlY3RvckVsZW1lbnRzKCk8L2NvZGU+IHRvIGdldCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgZG8KKyAgICAgIHRoYXQuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgRm9yIGV4YW1wbGUgdG8gY3JlYXRlIGEgc2VsZWN0b3IgY29udGFpbmVyIHRoYXQgd2lsbCBzZWxlY3QgZmlsZXMKKyAgICAgIGlmIGEgY2VydGFpbiBudW1iZXIgb2YgY29udGFpbmVkIHNlbGVjdG9ycyBzZWxlY3QsIG9uZSBjb3VsZCB3cml0ZQorICAgICAgYSBzZWxlY3RvciBhcyBmb2xsb3dzOgorICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwcmU+CitwdWJsaWMgY2xhc3MgTWF0Y2hOdW1iZXJTZWxlY3RvcnMgZXh0ZW5kcyBCYXNlU2VsZWN0b3JDb250YWluZXIgeworICAgIHByaXZhdGUgaW50IG51bWJlciA9IC0xOworICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihpbnQgbnVtYmVyKSB7CisgICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlTZXR0aW5ncygpIHsKKyAgICAgICAgaWYgKG51bWJlciAmbHQ7IDApIHsKKyAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOdW1iZXIgYXR0cmlidXRlIHNob3VsZCBiZSBzZXQiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZURpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgaW50IG51bWJlclNlbGVjdGVkID0gMDsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gc2VsZWN0b3JFbGVtZW50cygpOyBlLmhhc05leHRFbGVtZW50KCk7KSB7CisgICAgICAgICAgICBGaWxlU2VsZWN0b3IgcyA9IChGaWxlU2VsZWN0b3IpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChzLmlzU2VsZWN0ZWQoYmFzZURpciwgZmlsZW5hbWUsIGZpbGUpKSB7CisgICAgICAgICAgICAgICAgbnVtYmVyU2VsZWN0ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVtYmVyU2VsZWN0ZWQgPT0gbnVtYmVyOworICAgIH0KK30KKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgICA8cD4KKyAgICAgIFRvIGRlZmluZSBhbmQgdXNlIHRoaXMgc2VsZWN0b3Igb25lIGNvdWxkIGRvOgorICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwcmU+CismbHQ7dHlwZWRlZiBuYW1lPSJudW1iZXJzZWxlY3RlZCIKKyAgICAgICAgIGNsYXNzbmFtZT0iY29tLm15ZG9tYWluLk1hdGNoTnVtYmVyU2VsZWN0b3JzIi8mZ3Q7CisuLi4KKyZsdDtmaWxlc2V0IGRpcj0iJHtzcmMucGF0aH0iJmd0OworICAgJmx0O251bWJlcnNlbGVjdGVkIG51bWJlcj0iMiImZ3Q7CisgICAgICAmbHQ7Y29udGFpbnMgdGV4dD0ic2NyaXB0IiBjYXNlc2Vuc2l0aXZlPSJubyIvJmd0OworICAgICAgJmx0O3NpemUgdmFsdWU9IjQiIHVuaXRzPSJLaSIgd2hlbj0ibW9yZSIvJmd0OworICAgICAgJmx0O2phdmFzZWxlY3Rvci8mZ3Q7CisgICAmbHQ7L251bWJlcnNlbGVjdGVkJmd0OworJmx0Oy9maWxlc2V0Jmd0OworICAgICAgPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgPGk+VGhlIGN1c3RvbSBzZWxlY3RvcjwvaT4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBUaGUgY3VzdG9tIHNlbGVjdG9yIHdhcyB0aGUgcHJlIGFudCAxLjYgd2F5IG9mIGRlZmluaW5nIGN1c3RvbSBzZWxlY3RvcnMuCisgICAgICBUaGlzIG1ldGhvZCBpcyBzdGlsbCBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgPC9wPgorICAgIDxwPllvdSBjYW4gd3JpdGUgeW91ciBvd24gc2VsZWN0b3JzIGFuZCB1c2UgdGhlbSB3aXRoaW4gdGhlIHNlbGVjdG9yCisgICAgICBjb250YWluZXJzIGJ5IHNwZWNpZnlpbmcgdGhlbSB3aXRoaW4gdGhlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiB0YWcuPC9wPgorCisgICAgICAgIDxwPlRvIGNyZWF0ZSBhIG5ldyBDdXN0b20gU2VsZWN0b3IsIHlvdSBoYXZlIHRvIGNyZWF0ZSBhIGNsYXNzIHRoYXQKKyAgICAgICAgaW1wbGVtZW50cworICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRXh0ZW5kRmlsZVNlbGVjdG9yPC9jb2RlPi4KKyAgICAgICAgVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoYXQgaXMgdGhyb3VnaCB0aGUgY29udmVuaWVuY2UgYmFzZSBjbGFzcworICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZUV4dGVuZFNlbGVjdG9yPC9jb2RlPiwKKyAgICAgICAgd2hpY2ggcHJvdmlkZXMgYWxsIG9mIHRoZSBtZXRob2RzIGZvciBzdXBwb3J0aW5nCisgICAgICAgIDxjb2RlPiZsdDtwYXJhbSZndDs8L2NvZGU+IHRhZ3MuIEZpcnN0LCBvdmVycmlkZSB0aGUKKyAgICAgICAgPGNvZGU+aXNTZWxlY3RlZCgpPC9jb2RlPiBtZXRob2QsIGFuZCBvcHRpb25hbGx5IHRoZQorICAgICAgICA8Y29kZT52ZXJpZnlTZXR0aW5ncygpPC9jb2RlPiBtZXRob2QuIElmIHlvdXIgY3VzdG9tCisgICAgICAgIHNlbGVjdG9yIHJlcXVpcmVzIHBhcmFtZXRlcnMgdG8gYmUgc2V0LCB5b3UgY2FuIGFsc28gb3ZlcnJpZGUKKyAgICAgICAgdGhlIDxjb2RlPnNldFBhcmFtZXRlcnMoKTwvY29kZT4gbWV0aG9kIGFuZCBpbnRlcnByZXQgdGhlCisgICAgICAgIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIGluIGFueSB3YXkgeW91IGxpa2UuIFNldmVyYWwgb2YgdGhlCisgICAgICAgIGNvcmUgc2VsZWN0b3JzIGRlbW9uc3RyYXRlIGhvdyB0byBkbyB0aGF0IGJlY2F1c2UgdGhleSBjYW4KKyAgICAgICAgYWxzbyBiZSB1c2VkIGFzIGN1c3RvbSBzZWxlY3RvcnMuPC9wPgorCisKKyAgICA8cD5PbmNlIHRoYXQgaXMgd3JpdHRlbiwgeW91IGluY2x1ZGUgaXQgaW4geW91ciBidWlsZCBmaWxlIGJ5IHVzaW5nCisgICAgICB0aGUgPGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+IHRhZy4KKyAgICA8L3A+CisKKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB5b3VyIGNsYXNzIHRoYXQgaW1wbGVtZW50cworICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I8L2NvZGU+LgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UgaW4gb3JkZXIgdG8gbG9hZCB0aGUKKyAgICAgICAgICBjdXN0b20gc2VsZWN0b3IgY2xhc3MuIElmIG5laXRoZXIgdGhpcyBjbGFzc3BhdGggbm9yIHRoZQorICAgICAgICAgIGNsYXNzcGF0aHJlZiBhcmUgc3BlY2lmaWVkLCB0aGUgY2xhc3Mgd2lsbCBiZQorICAgICAgICAgIGxvYWRlZCBmcm9tIHRoZSBjbGFzc3BhdGggdGhhdCBBbnQgdXNlcy4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggcHJldmlvdXNseQorICAgICAgICAgIGRlZmluZWQuIElmIG5laXRoZXIgdGhpcyByZWZlcmVuY2Ugbm9yIHRoZQorICAgICAgICAgIGNsYXNzcGF0aCBhYm92ZSBhcmUgc3BlY2lmaWVkLCB0aGUgY2xhc3Mgd2lsbCBiZQorICAgICAgICAgIGxvYWRlZCBmcm9tIHRoZSBjbGFzc3BhdGggdGhhdCBBbnQgdXNlcy4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8cD5IZXJlIGlzIGhvdyB5b3UgdXNlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiB0bworICAgICAgdXNlIHlvdXIgY2xhc3MgYXMgYSBzZWxlY3RvcjoKKyAgICA8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSIke215ZGlyfSIgaW5jbHVkZXM9IioqLyoiJmd0OworICAgICZsdDtjdXN0b20gY2xhc3NuYW1lPSJjb20ubXlkb21haW4uTXlTZWxlY3RvciImZ3Q7CisgICAgICAgICZsdDtwYXJhbSBuYW1lPSJteWF0dHJpYnV0ZSIgdmFsdWU9Im15dmFsdWUiLyZndDsKKyAgICAmbHQ7L2N1c3RvbSZndDsKKyZsdDsvZmlsZXNldCZndDsKKyAgICAgIDwvcHJlPjwvYmxvY2txdW90ZT4KKworCisgICAgPHA+VGhlIGNvcmUgc2VsZWN0b3JzIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBhcyBjdXN0b20gc2VsZWN0b3JzCisgICAgICBhcmU8L3A+CisKKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjY29udGFpbnNzZWxlY3QiPkNvbnRhaW5zIFNlbGVjdG9yPC9hPiB3aXRoCisgICAgICAgIGNsYXNzbmFtZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQ29udGFpbnNTZWxlY3RvcjwvY29kZT4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjZGF0ZXNlbGVjdCI+RGF0ZSBTZWxlY3RvcjwvYT4gd2l0aAorICAgICAgICBjbGFzc25hbWUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRhdGVTZWxlY3RvcjwvY29kZT4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjZGVwdGhzZWxlY3QiPkRlcHRoIFNlbGVjdG9yPC9hPiB3aXRoCisgICAgICAgIGNsYXNzbmFtZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGVwdGhTZWxlY3RvcjwvY29kZT4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjZmlsZW5hbWVzZWxlY3QiPkZpbGVuYW1lIFNlbGVjdG9yPC9hPiB3aXRoCisgICAgICAgIGNsYXNzbmFtZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZW5hbWVTZWxlY3RvcjwvY29kZT4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjc2l6ZXNlbGVjdCI+U2l6ZSBTZWxlY3RvcjwvYT4gd2l0aAorICAgICAgICBjbGFzc25hbWUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNpemVTZWxlY3RvcjwvY29kZT4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKworICAgIDxwPkhlcmUgaXMgdGhlIGV4YW1wbGUgZnJvbSB0aGUgRGVwdGggU2VsZWN0b3Igc2VjdGlvbiByZXdyaXR0ZW4KKyAgICB0byB1c2UgdGhlIHNlbGVjdG9yIHRocm91Z2ggPGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+LjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsZXNldCBkaXI9IiR7ZG9jLnBhdGh9IiBpbmNsdWRlcz0iKiovKiImZ3Q7CisgICAgJmx0O2N1c3RvbSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EZXB0aFNlbGVjdG9yIiZndDsKKyAgICAgICAgJmx0O3BhcmFtIG5hbWU9Im1heCIgdmFsdWU9IjEiLyZndDsKKyAgICAmbHQ7L2N1c3RvbSZndDsKKyZsdDsvZmlsZXNldCZndDsKKyAgICAgIDwvcHJlPjwvYmxvY2txdW90ZT4KKworICAgIDxwPlNlbGVjdHMgYWxsIGZpbGVzIGluIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgb25lIGRpcmVjdG9yeSBiZWxvdworICAgICAgdGhhdC48L3A+CisKKyAgICA8aDM+PGEgbmFtZT0iZmlsdGVycmVhZGVycyI+Q3VzdG9tIEZpbHRlciBSZWFkZXJzPC9hPjwvaDM+CisgICAgPHA+CisgICAgICBDdXN0b20gZmlsdGVyIHJlYWRlcnMgc2VsZWN0b3JzIGFyZSBkYXRhdHlwZXMgdGhhdCBpbXBsZW1lbnQKKyAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLmZpbHRlcnMuQ2hhaW5hYmxlUmVhZGVyPC9jb2RlPi4KKyAgICA8L3A+CisgICAgPHA+VGhlcmUgaXMgb25seSBvbmUgbWV0aG9kIHJlcXVpcmVkLgorICAgICAgPGNvZGU+UmVhZGVyIGNoYWluKFJlYWRlciByZWFkZXIpPC9jb2RlPi4KKyAgICAgIFRoaXMgcmV0dXJucyBhIHJlYWRlciB0aGF0IGZpbHRlcnMgaW5wdXQgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICByZWFkZXIuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgRm9yIGV4YW1wbGUgYSBmaWx0ZXJyZWFkZXIgdGhhdCByZW1vdmVzIGV2ZXJ5IHNlY29uZCBjaGFyYWN0ZXIKKyAgICAgIGNvdWxkIGJlOgorICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwcmU+CitwdWJsaWMgY2xhc3MgUmVtb3ZlT2RkQ2hhcmFjdGVycyBpbXBsZW1lbnRzIENoYWluYWJsZVJlYWRlciB7CisgICBwdWJsaWMgUmVhZGVyIGNoYWluKFJlYWRlciByZWFkZXIpIHsKKyAgICAgIHJldHVybiBuZXcgQmFzZUZpbHRlclJlYWRlcihyZWFkZXIpIHsKKyAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBpbi5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgaWYgKChjb3VudCAlIDIpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorICAgICAgPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorICAgIDxwPgorICAgICAgRm9yIGxpbmUgb3JpZW50ZWQgZmlsdGVycyBpdCBtYXkgYmUgZWFzaWVyIHRvIGV4dGVuZAorICAgICAgPGNvZGU+Q2hhaW5hYmxlRmlsdGVyUmVhZGVyPC9jb2RlPiBhbiBpbm5lciBjbGFzcyBvZgorICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5Ub2tlbkZpbHRlcjwvY29kZT4uCisgICAgPC9wPgorICAgIDxwPgorICAgICAgRm9yIGV4YW1wbGUgYSBmaWx0ZXIgdGhhdCBhcHBlbmRzIHRoZSBsaW5lIG51bWJlciBjb3VsZCBiZQorICAgIDwvcD4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxwcmU+CitwdWJsaWMgY2xhc3MgQWRkTGluZU51bWJlciBleHRlbmRzIENoYWluYWJsZVJlYWRlckZpbHRlciB7CisgICBwcml2YXRlIHZvaWQgbGluZU51bWJlciA9IDA7CisgICBwdWJsaWMgU3RyaW5nIGZpbHRlcihTdHJpbmcgc3RyaW5nKSB7CisgICAgICBsaW5lTnVtYmVyKys7CisgICAgICByZXR1cm4gIiIgKyBsaW5lTnVtYmVyICsgIlx0IiArIHN0cmluZzsKKyAgIH0KK30KKyAgICAgIDwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKworCisgICAgPGhyPjwvaHI+CisgIDwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL2Rlc2NyaXB0aW9uLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvZGVzY3JpcHRpb24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk0MmJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL2Rlc2NyaXB0aW9uLmh0bWwKQEAgLTAsMCArMSw0NiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJkZXNjcmlwdGlvbiI+RGVzY3JpcHRpb248L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5BbGxvd3MgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2plY3QgdG8gYmUgc3BlY2lmaWVkIHRoYXQKK3dpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBvZiB0aGUgPGNvZGU+YW50ICYjeDIwMTE7cHJvamVjdGhlbHA8L2NvZGU+Citjb21tYW5kLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHA+KG5vbmUpPC9wPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAKKyZsdDtkZXNjcmlwdGlvbiZndDsKK1RoaXMgYnVpbGRmaWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIEZvbyBzdWJwcm9qZWN0IHdpdGhpbiAKK3RoZSBsYXJnZSwgY29tcGxleCBCYXIgcHJvamVjdC4KKyZsdDsvZGVzY3JpcHRpb24mZ3Q7Cis8L3ByZT4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9kaXJzZXQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9kaXJzZXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWZlMzEzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL2RpcnNldC5odG1sCkBAIC0wLDAgKzEsMTM5IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkRpclNldCBUeXBlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJkaXJzZXQiPkRpclNldDwvYT48L2gyPgorPHA+QSBEaXJTZXQgaXMgYSBncm91cCBvZiBkaXJlY3Rvcmllcy4gVGhlc2UgZGlyZWN0b3JpZXMgY2FuIGJlIGZvdW5kIGluIGEKK2RpcmVjdG9yeSB0cmVlIHN0YXJ0aW5nIGluIGEgYmFzZSBkaXJlY3RvcnkgYW5kIGFyZSBtYXRjaGVkIGJ5CitwYXR0ZXJucyB0YWtlbiBmcm9tIGEgbnVtYmVyIG9mIDxhIGhyZWY9InBhdHRlcm5zZXQuaHRtbCI+UGF0dGVyblNldHM8L2E+CithbmQgPGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwiPlNlbGVjdG9yczwvYT4uCis8L3A+Cis8cD5QYXR0ZXJuU2V0cyBjYW4gYmUgc3BlY2lmaWVkIGFzIG5lc3RlZAorPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gSW4gYWRkaXRpb24sIERpclNldCBob2xkcworYW4gaW1wbGljaXQgUGF0dGVyblNldCBhbmQgc3VwcG9ydHMgdGhlIG5lc3RlZAorPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2luY2x1ZGVzZmlsZSZndDs8L2NvZGU+LAorPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2V4Y2x1ZGVzZmlsZSZndDs8L2NvZGU+CitlbGVtZW50cyBvZiA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGRpcmVjdGx5LCBhcyB3ZWxsIGFzCis8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+J3MgYXR0cmlidXRlcy48L3A+Cis8cD5TZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBhcyBuZXN0ZWQgZWxlbWVudHMgd2l0aGluIHRoZSBEaXJTZXQuCitJZiBhbnkgb2YgdGhlIHNlbGVjdG9ycyB3aXRoaW4gdGhlIERpclNldCBkbyBub3Qgc2VsZWN0IHRoZSBkaXJlY3RvcnksIGl0CitpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBEaXJTZXQuIFRoaXMgbWFrZXMgYSBEaXJTZXQKK2VxdWl2YWxlbnQgdG8gYW4gPGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+IHNlbGVjdG9yIGNvbnRhaW5lci48L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJvb3Qgb2YgdGhlIGRpcmVjdG9yeSB0cmVlIG9mIHRoaXMgRGlyU2V0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIGNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBkaXJlY3RvcmllcyB0aGF0CisgICAgIG11c3QgYmUgaW5jbHVkZWQ7IGFsbCBkaXJlY3RvcmllcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIGNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBkaXJlY3RvcmllcyB0aGF0CisgICAgIG11c3QgYmUgZXhjbHVkZWQ7IG5vIGRpcmVjdG9yaWVzIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZTsgZWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHdoZXRoZXIgY2FzZS1zZW5zaXRpdml0eSBzaG91bGQgYmUgYXBwbGllZAorICAgICAoPGNvZGU+dHJ1ZTwvY29kZT58PGNvZGU+eWVzPC9jb2RlPnw8Y29kZT5vbjwvY29kZT4gb3IKKyAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+fDxjb2RlPm5vPC9jb2RlPnw8Y29kZT5vZmY8L2NvZGU+KS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9sbG93c3ltbGlua3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2hhbGwgc3ltYm9saWMgbGlua3MgYmUgZm9sbG93ZWQ/IERlZmF1bHRzIHRvCisgICAgICB0cnVlLiBTZWUgPGEgaHJlZj0iZmlsZXNldC5odG1sI3N5bWxpbmsiPmZpbGVzZXQncyBkb2N1bWVudGF0aW9uPC9hPi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0PkV4YW1wbGVzPC9oND4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtkaXJzZXQgZGlyPSZxdW90OyR7YnVpbGQuZGlyfSZxdW90OyZndDsKKyAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDthcHBzLyoqL2NsYXNzZXMmcXVvdDsvJmd0OworICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O2FwcHMvKiovKlRlc3QqJnF1b3Q7LyZndDsKKyZsdDsvZGlyc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+R3JvdXBzIGFsbCBkaXJlY3RvcmllcyBuYW1lZCA8Y29kZT5jbGFzc2VzPC9jb2RlPiBmb3VuZCB1bmRlciB0aGUKKzxjb2RlPmFwcHM8L2NvZGU+IHN1YmRpcmVjdG9yeSBvZiA8Y29kZT4ke2J1aWxkLmRpcn08L2NvZGU+LCBleGNlcHQgdGhvc2UKK3RoYXQgaGF2ZSB0aGUgdGV4dCA8Y29kZT5UZXN0PC9jb2RlPiBpbiB0aGVpciBuYW1lLjwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtkaXJzZXQgZGlyPSZxdW90OyR7YnVpbGQuZGlyfSZxdW90OyZndDsKKyAgJmx0O3BhdHRlcm5zZXQgaWQ9JnF1b3Q7bm9uLnRlc3QuY2xhc3NlcyZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2FwcHMvKiovY2xhc3NlcyZxdW90Oy8mZ3Q7CisgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDthcHBzLyoqLypUZXN0KiZxdW90Oy8mZ3Q7CisgICZsdDsvcGF0dGVybnNldCZndDsKKyZsdDsvZGlyc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+R3JvdXBzIHRoZSBzYW1lIGRpcmVjdG9yaWVzIGFzIHRoZSBhYm92ZSBleGFtcGxlLCBidXQgYWxzbyBlc3RhYmxpc2hlcworYSBQYXR0ZXJuU2V0IHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb3RoZXIKKzxjb2RlPiZsdDtkaXJzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cywgcm9vdGVkIGF0IGEgZGlmZmVyZW50IGRpcmVjdG9yeS48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZGlyc2V0IGRpcj0mcXVvdDske2RlYnVnX2J1aWxkLmRpcn0mcXVvdDsmZ3Q7CisgICZsdDtwYXR0ZXJuc2V0IHJlZmlkPSZxdW90O25vbi50ZXN0LmNsYXNzZXMmcXVvdDsvJmd0OworJmx0Oy9kaXJzZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5Hcm91cHMgYWxsIGRpcmVjdG9yaWVzIGluIGRpcmVjdG9yeSA8Y29kZT4ke2RlYnVnX2J1aWxkLmRpcn08L2NvZGU+LAordXNpbmcgdGhlIHNhbWUgcGF0dGVybnMgYXMgdGhlIGFib3ZlIGV4YW1wbGUuPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2RpcnNldCBpZD0mcXVvdDtkaXJzZXQmcXVvdDsgZGlyPSZxdW90OyR7d29ya2luZ2Rpcn0mcXVvdDsmZ3Q7CisgICAmbHQ7cHJlc2VudCB0YXJnZXRkaXI9JnF1b3Q7JHt3b3JraW5nZGlyfSZxdW90OyZndDsKKyAgICAgICAgJmx0O21hcHBlciB0eXBlPSZxdW90O2dsb2ImcXVvdDsgZnJvbT0mcXVvdDsqJnF1b3Q7IHRvPSZxdW90OyovJHttYXJrZXJmaWxlfSZxdW90OyAvJmd0OworICAgJmx0Oy9wcmVzZW50Jmd0OworJmx0Oy9kaXJzZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5TZWxlY3RzIGFsbCBkaXJlY3RvcmllcyBzb21ld2hlcmUgdW5kZXIgPGNvZGU+JHt3b3JraW5nZGlyfTwvY29kZT4KK3doaWNoIGNvbnRhaW4gYSA8Y29kZT4ke21hcmtlcmZpbGV9PC9jb2RlPi48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9maWxlbGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWUzNmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbApAQCAtMCwwICsxLDEyMCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5GaWxlTGlzdCBUeXBlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJmaWxlbGlzdCI+RmlsZUxpc3Q8L2E+PC9oMj4gCisKKzxwPkZpbGVMaXN0cyBhcmUgZXhwbGljaXRseSBuYW1lZCBsaXN0cyBvZiBmaWxlcy4gIFdoZXJlYXMgRmlsZVNldHMKK2FjdCBhcyBmaWx0ZXJzLCByZXR1cm5pbmcgb25seSB0aG9zZSBmaWxlcyB0aGF0IGV4aXN0IGluIHRoZSBmaWxlCitzeXN0ZW0gYW5kIG1hdGNoIHNwZWNpZmllZCBwYXR0ZXJucywgRmlsZUxpc3RzIGFyZSB1c2VmdWwgZm9yCitzcGVjaWZ5aW5nIGZpbGVzIHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3QuICBNdWx0aXBsZSBmaWxlcyBhcmUKK3NwZWNpZmllZCBhcyBhIGxpc3Qgb2YgZmlsZXMsIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LAord2l0aCBubyBzdXBwb3J0IGZvciB3aWxkY2FyZCBleHBhbnNpb24gKGZpbGVuYW1lcyB3aXRoIHdpbGRjYXJkcyB3aWxsIGJlCitpbmNsdWRlZCBpbiB0aGUgbGlzdCB1bmNoYW5nZWQpLgorRmlsZUxpc3RzIGNhbiBhcHBlYXIgaW5zaWRlIHRhc2tzIHRoYXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUgb3IgYXMgc3RhbmQtYWxvbmUKK3R5cGVzLgorPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGlzIEZpbGVMaXN0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbGlzdCBvZiBmaWxlIG5hbWVzLiBUaGlzIGlzIGEgbGlzdCBvZgorICAgIGZpbGUgbmFtZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSwgb3IgYnkgY29tbWFzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4KKyAgICAgIFllcywgdW5sZXNzIHRoZXJlIGlzIGEgbmVzdGVkIGZpbGUgZWxlbWVudDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorICA8aDQ+TmVzdGVkIEVsZW1lbnQ6IGZpbGU8L2g0PgorICA8cD4KKyAgICBUaGlzIHJlcHJlc2VudHMgYSBmaWxlIG5hbWUuIFRoZSBuZXN0ZWQgZWxlbWVudCBhbGxvd3MgZmlsZW5hbWVzIGNvbnRhaW5pbmcKKyAgICB3aGl0ZSBzcGFjZSBhbmQgY29tbWFzLgorICA8L3A+CisgIDxwPjxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPjwvcD4KKyAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGZpbGUuPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4gIAorPGg0PkV4YW1wbGVzPC9oND4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsZWxpc3QgCisgICAgaWQ9JnF1b3Q7ZG9jZmlsZXMmcXVvdDsgCisgICAgZGlyPSZxdW90OyR7ZG9jLnNyY30mcXVvdDsKKyAgICBmaWxlcz0mcXVvdDtmb28ueG1sLGJhci54bWwmcXVvdDsvJmd0OyAKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+VGhlIGZpbGVzIDxjb2RlPiR7ZG9jLnNyY30vZm9vLnhtbDwvY29kZT4gYW5kCis8Y29kZT4ke2RvYy5zcmN9L2Jhci54bWw8L2NvZGU+LiAgTm90ZSB0aGF0IHRoZXNlIGZpbGVzIG1heSBub3QgKHlldCkKK2FjdHVhbGx5IGV4aXN0LgorPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVsaXN0IAorICAgIGlkPSZxdW90O2RvY2ZpbGVzJnF1b3Q7IAorICAgIGRpcj0mcXVvdDske2RvYy5zcmN9JnF1b3Q7CisgICAgZmlsZXM9JnF1b3Q7Zm9vLnhtbAorICAgICAgICAgICBiYXIueG1sJnF1b3Q7LyZndDsgCis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPlNhbWUgZmlsZXMgYXMgdGhlIGV4YW1wbGUgYWJvdmUuPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVsaXN0IHJlZmlkPSZxdW90O2RvY2ZpbGVzJnF1b3Q7LyZndDsgCis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPlNhbWUgZmlsZXMgYXMgdGhlIGV4YW1wbGUgYWJvdmUuPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVsaXN0IAorICAgIGlkPSZxdW90O2RvY2ZpbGVzJnF1b3Q7IAorICAgIGRpcj0mcXVvdDske2RvYy5zcmN9JnF1b3Q7Jmd0OworICAgICZsdDtmaWxlIG5hbWU9ImZvby54bWwiLyZndDsKKyAgICAmbHQ7ZmlsZSBuYW1lPSJiYXIueG1sIi8mZ3Q7CismbHQ7L2ZpbGVsaXN0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5TYW1lIGZpbGVzIGFzIHRoZSBleGFtcGxlIGFib3ZlLjwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0OWYyYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwKQEAgLTAsMCArMSwxODMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+RmlsZVNldCBUeXBlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJmaWxlc2V0Ij5GaWxlU2V0PC9hPjwvaDI+Cis8cD5BIEZpbGVTZXQgaXMgYSBncm91cCBvZiBmaWxlcy4gVGhlc2UgZmlsZXMgY2FuIGJlIGZvdW5kIGluIGEKK2RpcmVjdG9yeSB0cmVlIHN0YXJ0aW5nIGluIGEgYmFzZSBkaXJlY3RvcnkgYW5kIGFyZSBtYXRjaGVkIGJ5CitwYXR0ZXJucyB0YWtlbiBmcm9tIGEgbnVtYmVyIG9mIDxhCitocmVmPSJwYXR0ZXJuc2V0Lmh0bWwiPlBhdHRlcm5TZXRzPC9hPiBhbmQKKzxhIGhyZWY9InNlbGVjdG9ycy5odG1sIj5TZWxlY3RvcnM8L2E+LgorPHA+UGF0dGVyblNldHMgY2FuIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQKKzxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuIEluIGFkZGl0aW9uLCBGaWxlU2V0IGhvbGRzCithbiBpbXBsaWNpdCBQYXR0ZXJuU2V0IGFuZCBzdXBwb3J0cyB0aGUgbmVzdGVkCis8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7aW5jbHVkZXNmaWxlJmd0OzwvY29kZT4sCis8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZXhjbHVkZXNmaWxlJmd0OzwvY29kZT4KK2VsZW1lbnRzIG9mIFBhdHRlcm5TZXQgZGlyZWN0bHksIGFzIHdlbGwgYXMgUGF0dGVyblNldCdzCithdHRyaWJ1dGVzLjwvcD4KKzxwPlNlbGVjdG9ycyBhcmUgYXZhaWxhYmxlIGFzIG5lc3RlZCBlbGVtZW50cyB3aXRoaW4gdGhlIEZpbGVTZXQuCitJZiBhbnkgb2YgdGhlIHNlbGVjdG9ycyB3aXRoaW4gdGhlIEZpbGVTZXQgZG8gbm90IHNlbGVjdCB0aGUgZmlsZSwgdGhlCitmaWxlIGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIEZpbGVTZXQuIFRoaXMgbWFrZXMgYSBGaWxlU2V0CitlcXVpdmFsZW50IHRvIGFuIDxjb2RlPiZsdDthbmQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBjb250YWluZXIuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSByb290IG9mIHRoZSBkaXJlY3RvcnkgdHJlZSBvZiB0aGlzIEZpbGVTZXQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkVpdGhlciBkaXIgb3IgZmlsZSBtdXN0IGJlIHNwZWNpZmllZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgYSBzaW5nbGUtZmlsZSBmaWxlc2V0PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGVmYXVsdGV4Y2x1ZGVzIj5kZWZhdWx0IGV4Y2x1ZGVzPC9hPiBzaG91bGQgYmUgdXNlZCBvciBub3QKKyAgICAgICg8Y29kZT55ZXMgfCBubzwvY29kZT4pOyBkZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCisgICAgICBpbmNsdWRlZDsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZTsgZWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkOyBubyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZTsgZWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TXVzdCB0aGUgaW5jbHVkZSBhbmQgZXhjbHVkZSBwYXR0ZXJucyBiZSB0cmVhdGVkIGluIGEgY2FzZSBzZW5zaXRpdmUgd2F5PworICAgICAgICBEZWZhdWx0cyB0byB0cnVlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvbGxvd3N5bWxpbmtzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNoYWxsIHN5bWJvbGljIGxpbmtzIGJlIGZvbGxvd2VkPyBEZWZhdWx0cyB0bworICAgICAgdHJ1ZS4gU2VlIHRoZSBub3RlIDxhIGhyZWY9IiNzeW1saW5rIj5iZWxvdzwvYT4uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3Jvbm1pc3NpbmdkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBTcGVjaWZ5IHdoYXQgaGFwcGVucyBpZiB0aGUgYmFzZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCisgICAgICBJZiB0cnVlIGEgYnVpbGQgZXJyb3Igd2lsbCBoYXBwZW4sIGlmIGZhbHNlLCB0aGUgZmlsZXNldAorICAgICAgd2lsbCBiZSBpZ25vcmVkL2VtcHR5LgorICAgICAgRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS43LjEgKGRlZmF1bHQgaXMgdHJ1ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgICAgICByZWFzb25zLik8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD48YSBuYW1lPSJzeW1saW5rIj48Yj5Ob3RlPC9iPjwvYT46IEFsbCBmaWxlcy9kaXJlY3RvcmllcyBmb3Igd2hpY2gKK3RoZSBjYW5vbmljYWwgcGF0aCBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgcGF0aCBhcmUgY29uc2lkZXJlZCBzeW1ib2xpYworbGlua3MuICBPbiBVbml4IHN5c3RlbXMgdGhpcyB1c3VhbGx5IG1lYW5zIHRoZSBmaWxlIHJlYWxseSBpcyBhCitzeW1ib2xpYyBsaW5rIGJ1dCBpdCBtYXkgbGVhZCB0byBmYWxzZSByZXN1bHRzIG9uIG90aGVyCitwbGF0Zm9ybXMuPC9wPgorCis8aDQ+RXhhbXBsZXM8L2g0PgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3NlcnZlci5zcmN9JnF1b3Q7IGNhc2VzZW5zaXRpdmU9JnF1b3Q7eWVzJnF1b3Q7Jmd0OworICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CisgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7KiovKlRlc3QqJnF1b3Q7LyZndDsKKyZsdDsvZmlsZXNldCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPkdyb3VwcyBhbGwgZmlsZXMgaW4gZGlyZWN0b3J5IDxjb2RlPiR7c2VydmVyLnNyY308L2NvZGU+IHRoYXQgYXJlIEphdmEKK3NvdXJjZSBmaWxlcyBhbmQgZG9uJ3QgaGF2ZSB0aGUgdGV4dCA8Y29kZT5UZXN0PC9jb2RlPiBpbiB0aGVpcgorbmFtZS48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzZXJ2ZXIuc3JjfSZxdW90OyBjYXNlc2Vuc2l0aXZlPSZxdW90O3llcyZxdW90OyZndDsKKyAgJmx0O3BhdHRlcm5zZXQgaWQ9JnF1b3Q7bm9uLnRlc3Quc291cmNlcyZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CisgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qVGVzdComcXVvdDsvJmd0OworICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7CismbHQ7L2ZpbGVzZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5Hcm91cHMgdGhlIHNhbWUgZmlsZXMgYXMgdGhlIGFib3ZlIGV4YW1wbGUsIGJ1dCBhbHNvIGVzdGFibGlzaGVzCithIFBhdHRlcm5TZXQgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvdGhlcgorPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cywgcm9vdGVkIGF0IGEgZGlmZmVyZW50IGRpcmVjdG9yeS48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtjbGllbnQuc3JjfSZxdW90OyAmZ3Q7CisgICZsdDtwYXR0ZXJuc2V0IHJlZmlkPSZxdW90O25vbi50ZXN0LnNvdXJjZXMmcXVvdDsvJmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+R3JvdXBzIGFsbCBmaWxlcyBpbiBkaXJlY3RvcnkgPGNvZGU+JHtjbGllbnQuc3JjfTwvY29kZT4sIHVzaW5nIHRoZQorc2FtZSBwYXR0ZXJucyBhcyB0aGUgYWJvdmUgZXhhbXBsZS48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzZXJ2ZXIuc3JjfSZxdW90OyBjYXNlc2Vuc2l0aXZlPSZxdW90O3llcyZxdW90OyZndDsKKyAgJmx0O2ZpbGVuYW1lIG5hbWU9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7LyZndDsKKyAgJmx0O2ZpbGVuYW1lIG5hbWU9JnF1b3Q7KiovKlRlc3QqJnF1b3Q7IG5lZ2F0ZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKKyZsdDsvZmlsZXNldCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPkdyb3VwcyB0aGUgc2FtZSBmaWxlcyBhcyB0aGUgdG9wIGV4YW1wbGUsIGJ1dCB1c2luZyB0aGUKKzxjb2RlPiZsdDtmaWxlbmFtZSZndDs8L2NvZGU+IHNlbGVjdG9yLjwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3NlcnZlci5zcmN9JnF1b3Q7IGNhc2VzZW5zaXRpdmU9JnF1b3Q7eWVzJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZW5hbWUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OworICAmbHQ7bm90Jmd0OworICAgICZsdDtmaWxlbmFtZSBuYW1lPSZxdW90OyoqLypUZXN0KiZxdW90Oy8mZ3Q7CisgICZsdDsvbm90Jmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+R3JvdXBzIHRoZSBzYW1lIGZpbGVzIGFzIHRoZSBwcmV2aW91cyBleGFtcGxlIHVzaW5nIGEgY29tYmluYXRpb24gb2YgdGhlCis8Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPiBzZWxlY3RvciBhbmQgdGhlIDxjb2RlPiZsdDtub3QmZ3Q7PC9jb2RlPgorc2VsZWN0b3IgY29udGFpbmVyLjwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWxlc2V0IGRpcj0ic3JjIiBpbmNsdWRlcz0ibWFpbi8iIC8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5TZWxlY3RzIGFsbCBmaWxlcyBpbiA8aT5zcmMvbWFpbjwvaT4gKGUuZy4gPGk+c3JjL21haW4vRm9vLmphdmE8L2k+IG9yIAorPGk+c3JjL21haW4vYXBwbGljYXRpb24vQmFyLmphdmE8L2k+KS48L3A+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9maWx0ZXJjaGFpbi5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL2ZpbHRlcmNoYWluLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhODYxMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9maWx0ZXJjaGFpbi5odG1sCkBAIC0wLDAgKzEsMTQ5MSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5GaWx0ZXJDaGFpbnMgYW5kIEZpbHRlclJlYWRlcnM8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPkZpbHRlckNoYWlucyBhbmQgRmlsdGVyUmVhZGVyczwvaDI+CitDb25zaWRlciB0aGUgZmxleGliaWxpdHkgb2YgVW5peCBwaXBlcy4gIElmIHlvdSB3YW50ZWQsCitmb3IgZXhhbXBsZSwgdG8gY29weSBqdXN0IHRob3NlIGxpbmVzIHRoYXQgY29udGFpbmVkIHRoZQorc3RyaW5nIGJsZWUgZnJvbSB0aGUgZmlyc3QgMTAgbGluZXMgb2YgYSB0ZXh0IGZpbGUgJ2ZvbycKKyg8ZW0+eW91IHdvdWxkbid0IHdhbnQgdG8gZmlsdGVyIGEgYmluYXJ5IGZpbGU8L2VtPikKK3RvIGEgZmlsZSAnYmFyJywgeW91IHdvdWxkIGRvIHNvbWV0aGluZyBsaWtlOjxwPgorPGNvZGU+CitjYXQgZm9vfGhlYWQgLW4xMHxncmVwIGJsZWUgJmd0OyBiYXIKKzwvY29kZT48cD4KK0FudCB3YXMgbm90IGZsZXhpYmxlIGVub3VnaC4gIFRoZXJlIHdhcyBubyB3YXkgZm9yIHRoZQorPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiB0YXNrIHRvIGRvIHNvbWV0aGluZyBzaW1pbGFyLiAgSWYgeW91IHdhbnRlZAordGhlIDxjb2RlPiZsdDtjb3B5Jmd0OzwvY29kZT4gdGFzayB0byBnZXQgdGhlIGZpcnN0IDEwIGxpbmVzLCB5b3Ugd291bGQgaGF2ZQoraGFkIHRvIGNyZWF0ZSBzcGVjaWFsIGF0dHJpYnV0ZXM6PHA+Cis8Y29kZT4KKyZsdDtjb3B5IGZpbGU9JnF1b3Q7Zm9vJnF1b3Q7IHRvZmlsZT0mcXVvdDtiYXImcXVvdDsgaGVhZD0mcXVvdDsxMCZxdW90OyBjb250YWlucz0mcXVvdDtibGVlJnF1b3Q7LyZndDsKKzwvY29kZT48cD4KK1RoZSBvYnZpb3VzIHByb2JsZW0gdGh1cyBzdXJmYWNlZDogQW50IHRhc2tzIHdvdWxkIG5vdCBiZSBhYmxlCit0byBhY2NvbW1vZGF0ZSBzdWNoIGRhdGEgdHJhbnNmb3JtYXRpb24gYXR0cmlidXRlcyBhcyB0aGV5IHdvdWxkCitiZSBlbmRsZXNzLiAgVGhlIHRhc2sgd291bGQgYWxzbyBub3Qga25vdyBpbiB3aGljaCBvcmRlciB0aGVzZQorYXR0cmlidXRlcyB3ZXJlIHRvIGJlIGludGVycHJldGVkLiAgVGhhdCBpcywgbXVzdCB0aGUgdGFzayBleGVjdXRlIHRoZQorY29udGFpbnMgYXR0cmlidXRlIGZpcnN0IGFuZCB0aGVuIHRoZSBoZWFkIGF0dHJpYnV0ZSBvciB2aWNlLXZlcnNhPworV2hhdCBBbnQgdGFza3MgbmVlZGVkIHdhcyBhIG1lY2hhbmlzbSB0byBhbGxvdyBwbHVnZ2FibGUgZmlsdGVyIChkYXRhCit0cmFuc2Zvcm1lcikgY2hhaW5zLiAgQW50IHdvdWxkIHByb3ZpZGUgYSBmZXcgZmlsdGVycyBmb3Igd2hpY2ggdGhlcmUKK2hhdmUgYmVlbiByZXBlYXRlZCByZXF1ZXN0cy4gIFVzZXJzIHdpdGggc3BlY2lhbCBmaWx0ZXJpbmcgbmVlZHMKK3dvdWxkIGJlIGFibGUgdG8gZWFzaWx5IHdyaXRlIHRoZWlyIG93biBhbmQgcGx1ZyB0aGVtIGluLjxwPgorCitUaGUgc29sdXRpb24gd2FzIHRvIHJlZmFjdG9yIGRhdGEgdHJhbnNmb3JtYXRpb24gb3JpZW50ZWQKK3Rhc2tzIHRvIHN1cHBvcnQgRmlsdGVyQ2hhaW5zLiAgQSBGaWx0ZXJDaGFpbiBpcyBhIGdyb3VwIG9mCitvcmRlcmVkIEZpbHRlclJlYWRlcnMuICBVc2VycyBjYW4gZGVmaW5lIHRoZWlyIG93biBGaWx0ZXJSZWFkZXJzCitieSBqdXN0IGV4dGVuZGluZyB0aGUgamF2YS5pby5GaWx0ZXJSZWFkZXIgY2xhc3MuICBTdWNoIGN1c3RvbQorRmlsdGVyUmVhZGVycyBjYW4gYmUgZWFzaWx5IHBsdWdnZWQgaW4gYXMgbmVzdGVkIGVsZW1lbnRzIG9mCis8Y29kZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7PC9jb2RlPiBieSB1c2luZyA8Y29kZT4mbHQ7ZmlsdGVycmVhZGVyJmd0OzwvY29kZT4gZWxlbWVudHMuCis8cD4KK0V4YW1wbGU6Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2NvcHkgZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyB0b2ZpbGU9JnF1b3Q7JHtkZXN0LmZpbGV9JnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7eW91ci5leHRlbnNpb24ub2YuamF2YS5pby5GaWx0ZXJSZWFkZXImcXVvdDsmZ3Q7CisgICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtmb28mcXVvdDsgdmFsdWU9JnF1b3Q7YmFyJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbHRlcnJlYWRlciZndDsKKyAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDthbm90aGVyLmV4dGVuc2lvbi5vZi5qYXZhLmlvLkZpbHRlclJlYWRlciZxdW90OyZndDsKKyAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke2NsYXNzcGF0aH0iLyZndDsKKyAgICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7YmxhaCZxdW90OyB2YWx1ZT0mcXVvdDtibGVlJnF1b3Q7LyZndDsKKyAgICAgICZsdDtwYXJhbSB0eXBlPSZxdW90O2FicmEmcXVvdDsgdmFsdWU9JnF1b3Q7Y2FkYWJyYSZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2NvcHkmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK0FudCBwcm92aWRlcyBzb21lIGJ1aWx0LWluIGZpbHRlciByZWFkZXJzLiAgVGhlc2UgZmlsdGVyIHJlYWRlcnMKK2NhbiBhbHNvIGJlIGRlY2xhcmVkIHVzaW5nIGEgc3ludGF4IHNpbWlsYXIgdG8gdGhlIGFib3ZlIHN5bnRheC4KK0hvd2V2ZXIsIHRoZXkgY2FuIGJlIGRlY2xhcmVkIHVzaW5nIHNvbWUgc2ltcGxlciBzeW50YXggYWxzby48cD4KK0V4YW1wbGU6Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7c3JjLmZpbGUuaGVhZCZxdW90OyZndDsKKyAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtoZWFkZmlsdGVyIGxpbmVzPSZxdW90OzE1JnF1b3Q7LyZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CitpcyBlcXVpdmFsZW50IHRvOgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90O3NyYy5maWxlLmhlYWQmcXVvdDsmZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkhlYWRGaWx0ZXImcXVvdDsmZ3Q7CisgICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtsaW5lcyZxdW90OyB2YWx1ZT0mcXVvdDsxNSZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2xvYWRmaWxlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCitUaGUgZm9sbG93aW5nIGJ1aWx0LWluIHRhc2tzIHN1cHBvcnQgbmVzdGVkIDxjb2RlPiZsdDtmaWx0ZXJjaGFpbiZndDs8L2NvZGU+IGVsZW1lbnRzLjxicj4KKzxhIGhyZWY9Ii4uL0NvcmVUYXNrcy9jb25jYXQuaHRtbCI+Q29uY2F0PC9hPiw8YnI+Cis8YSBocmVmPSIuLi9Db3JlVGFza3MvY29weS5odG1sIj5Db3B5PC9hPiw8YnI+Cis8YSBocmVmPSIuLi9Db3JlVGFza3MvbG9hZGZpbGUuaHRtbCI+TG9hZEZpbGU8L2E+LDxicj4KKzxhIGhyZWY9Ii4uL0NvcmVUYXNrcy9sb2FkcHJvcGVydGllcy5odG1sIj5Mb2FkUHJvcGVydGllczwvYT4sPGJyPgorPGEgaHJlZj0iLi4vQ29yZVRhc2tzL21vdmUuaHRtbCI+TW92ZTwvYT48YnI+PGJyPgorCitBIEZpbHRlckNoYWluIGlzIGZvcm1lZCBieSBkZWZpbmluZyB6ZXJvIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZworbmVzdGVkIGVsZW1lbnRzLjxicj4KKzxhIGhyZWY9IiNmaWx0ZXJyZWFkZXIiPkZpbHRlclJlYWRlcjwvYT48YnI+Cis8YSBocmVmPSIjY2xhc3Njb25zdGFudHMiPkNsYXNzQ29uc3RhbnRzPC9hPjxicj4KKzxhIGhyZWY9IiNlc2NhcGV1bmljb2RlIj5Fc2NhcGVVbmljb2RlPC9hPjxicj4KKzxhIGhyZWY9IiNleHBhbmRwcm9wZXJ0aWVzIj5FeHBhbmRQcm9wZXJ0aWVzPC9hPjxicj4KKzxhIGhyZWY9IiNoZWFkZmlsdGVyIj5IZWFkRmlsdGVyPC9hPjxicj4KKzxhIGhyZWY9IiNsaW5lY29udGFpbnMiPkxpbmVDb250YWluczwvYT48YnI+Cis8YSBocmVmPSIjbGluZWNvbnRhaW5zcmVnZXhwIj5MaW5lQ29udGFpbnNSZWdFeHA8L2E+PGJyPgorPGEgaHJlZj0iI3ByZWZpeGxpbmVzIj5QcmVmaXhMaW5lczwvYT48YnI+Cis8YSBocmVmPSIjcmVwbGFjZXRva2VucyI+UmVwbGFjZVRva2VuczwvYT48YnI+Cis8YSBocmVmPSIjc3RyaXBqYXZhY29tbWVudHMiPlN0cmlwSmF2YUNvbW1lbnRzPC9hPjxicj4KKzxhIGhyZWY9IiNzdHJpcGxpbmVicmVha3MiPlN0cmlwTGluZUJyZWFrczwvYT48YnI+Cis8YSBocmVmPSIjc3RyaXBsaW5lY29tbWVudHMiPlN0cmlwTGluZUNvbW1lbnRzPC9hPjxicj4KKzxhIGhyZWY9IiN0YWJzdG9zcGFjZXMiPlRhYnNUb1NwYWNlczwvYT48YnI+Cis8YSBocmVmPSIjdGFpbGZpbHRlciI+VGFpbEZpbHRlcjwvYT48YnI+Cis8YSBocmVmPSIjZGVsZXRlY2hhcmFjdGVycyI+RGVsZXRlQ2hhcmFjdGVyczwvYT48YnI+Cis8YSBocmVmPSIjY29uY2F0ZmlsdGVyIj5Db25jYXRGaWx0ZXI8L2E+PGJyPgorPGEgaHJlZj0iI3Rva2VuZmlsdGVyIj5Ub2tlbkZpbHRlcjwvYT48YnI+Cis8YSBocmVmPSIuLi9Db3JlVGFza3MvZml4Y3JsZi5odG1sIj5GaXhDUkxGPC9hPjxicj4KKworPGgzPjxhIG5hbWU9ImZpbHRlcnJlYWRlciI+RmlsdGVyUmVhZGVyPC9hPjwvaDM+CisKK1RoZSBmaWx0ZXJyZWFkZXIgZWxlbWVudCBpcyB0aGUgZ2VuZXJpYyB3YXkgdG8KK2RlZmluZSBhIGZpbHRlci4gIFVzZXIgZGVmaW5lZCBmaWx0ZXIgZWxlbWVudHMgYXJlCitkZWZpbmVkIGluIHRoZSBidWlsZCBmaWxlIHVzaW5nIHRoaXMuICBQbGVhc2Ugbm90ZSB0aGF0CitidWlsdCBpbiBmaWx0ZXIgcmVhZGVycyBjYW4gYWxzbyBiZSBkZWZpbmVkIHVzaW5nIHRoaXMKK3N5bnRheC4KKworQSBGaWx0ZXJSZWFkZXIgZWxlbWVudCBtdXN0IGJlIHN1cHBsaWVkIHdpdGggYSBjbGFzcyBuYW1lIGFzCithbiBhdHRyaWJ1dGUgdmFsdWUuICBUaGUgY2xhc3MgcmVzb2x2ZWQgYnkgdGhpcyBuYW1lIG11c3QKK2V4dGVuZCBqYXZhLmlvLkZpbHRlclJlYWRlci4gIElmIHRoZSBjdXN0b20gZmlsdGVyIHJlYWRlcgorbmVlZHMgdG8gYmUgcGFyYW1ldGVyaXplZCwgaXQgbXVzdCBpbXBsZW1lbnQKK29yZy5hcGFjaGUudG9vbHMudHlwZS5QYXJhbWV0ZXJpemFibGUuCisKKzx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD5jbGFzc25hbWU8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPlRoZSBjbGFzcyBuYW1lIG9mIHRoZSBmaWx0ZXIgcmVhZGVyLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPgorPGg0Pk5lc3RlZCBFbGVtZW50czo8L2g0PgorPGNvZGU+Jmx0O2ZpbHRlcnJlYWRlciZndDs8L2NvZGU+IHN1cHBvcnRzIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4KK2FzIG5lc3RlZCBlbGVtZW50cy4gIEVhY2ggPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4gZWxlbWVudCBtYXkgdGFrZSBpbiB0aGUgZm9sbG93aW5nCithdHRyaWJ1dGVzIC0gbmFtZSwgdHlwZSBhbmQgdmFsdWUuCis8cD4KK1RoZSBmb2xsb3dpbmcgRmlsdGVyUmVhZGVycyBhcmUgc3VwcGxpZWQgd2l0aCB0aGUgZGVmYXVsdAorZGlzdHJpYnV0aW9uLgorCis8aDM+PGEgbmFtZT0iY2xhc3Njb25zdGFudHMiPkNsYXNzQ29uc3RhbnRzPC9hPjwvaDM+Cis8cD4KKyAgVGhpcyBmaWx0ZXJzIGJhc2ljIGNvbnN0YW50cyBkZWZpbmVkIGluIGEgSmF2YSBDbGFzcywKKyAgYW5kIG91dHB1dHMgdGhlbSBpbiBsaW5lcyBjb21wb3NlZCBvZiB0aGUgZm9ybWF0IDxpPm5hbWU8L2k+PTxpPnZhbHVlPC9pPi4KKyAgVGhpcyBmaWx0ZXIgdXNlcyB0aGUgPGVtPmJjZWw8L2VtPiBsaWJyYXJ5IHRvIHVuZGVyc3RhbmQgdGhlIEphdmEgQ2xhc3MgZmlsZS4KKyAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4uCis8cD4KKyAgPHA+CisgICAgPGVtPjxiPkltcG9ydGFudDo8L2I+PC9lbT4KKyAgICBUaGlzIGZpbHRlciBpcyBkaWZmZXJlbnQgZnJvbSBtb3N0IG9mIHRoZSBvdGhlciBmaWx0ZXJzLgorICAgIE1vc3Qgb2YgdGhlIGZpbHRlcnMgb3BlcmF0ZSBvbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuCisgICAgVGhpcyBmaWx0ZXIgb3BlcmF0ZXMgb24gdGhlIHNlcXVlbmNlIG9mIGJ5dGVzIHRoYXQgbWFrZXMgdXAKKyAgICBhIGNsYXNzLiBIb3dldmVyIHRoZSBieXRlcyBhcnJpdmUgdG8gdGhlIGZpbHRlciBhcyBhIHNlcXVlbmNlCisgICAgb2YgY2hhcmFjdGVycy4gVGhpcyBtZWFucyB0aGF0IG9uZSBtdXN0IGJlIGNhcmVmdWwgb24gdGhlCisgICAgY2hvaWNlIG9mIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UuIE1vc3QgZW5jb2RpbmcgbG9zZSBpbmZvcm1hdGlvbgorICAgIG9uIGNvbnZlcnNpb24gZnJvbSBhbiBhcmJpdGFyeSBzZXF1ZW5jZSBvZiBieXRlcyB0byBjaGFyYWN0ZXJzCisgICAgYW5kIGJhY2sgYWdhaW4gdG8gYnl0ZXMuIEluIHBhcnRpY3VsYXIgdGhlIHVzdWFsIGRlZmF1bHQKKyAgICBjaGFyYWN0ZXIgZW5jb2RpbmdzIChDUDE1MiBhbmQgVVRGLTgpIGRvLgorICAgIEZvciB0aGlzIHJlYXNvbiwgPGVtPnNpbmNlIEFudCAxLjc8L2VtPiwgdGhlIGNoYXJhY3RlcgorICAgIGVuY29kaW5nIDxiPklTTy04ODU5LTE8L2I+IGlzIHVzZWQgdG8gY29udmVydCBmcm9tIGNoYXJhY3RlcnMgYmFjayB0bworICAgIGJ5dGVzLCBzbyBvbmUgPGI+aGFzPC9iPiB0byB1c2UgdGhpcyBlbmNvZGluZyBmb3IgcmVhZGluZyB0aGUgamF2YQorICAgIGNsYXNzIGZpbGUuCis8aDQ+RXhhbXBsZTo8L2g0PgorCitUaGlzIGxvYWRzIHRoZSBiYXNpYyBjb25zdGFudHMgZGVmaW5lZCBpbiBhIEphdmEgY2xhc3MgYXMgQW50IHByb3BlcnRpZXMuCisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bG9hZHByb3BlcnRpZXMgc3JjZmlsZT0iZm9vLmNsYXNzIiBlbmNvZGluZz0iSVNPLTg4NTktMSImZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7Y2xhc3Njb25zdGFudHMvJmd0OworICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9sb2FkcHJvcGVydGllcyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworVGhpcyBsb2FkcyB0aGUgY29uc3RhbnRzIGZyb20gYSBKYXZhIGNsYXNzIGZpbGUgYXMgQW50IHByb3BlcnRpZXMsCitwcmVwZW5kaW5nIHRoZSBuYW1lcyB3aXRoIGEgcHJlZml4LgorCisgICAgPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtsb2FkcHJvcGVydGllcyBzcmNmaWxlPSJidWlsZC9jbGFzc2VzL29yZy9hY21lL2Jhci5jbGFzcyIKKyAgICAgICAgICAgICAgICBlbmNvZGluZz0iSVNPLTg4NTktMSImZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7Y2xhc3Njb25zdGFudHMvJmd0OworICAgICZsdDtwcmVmaXhsaW5lcyBwcmVmaXg9ImluaS4iLyZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZHByb3BlcnRpZXMmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8aDM+PGEgbmFtZT0iZXNjYXBldW5pY29kZSI+RXNjYXBlVW5pY29kZTwvYT48L2gzPgorPHA+CitUaGlzIGZpbHRlciBjb252ZXJ0cyBpdHMgaW5wdXQgYnkgY2hhbmdpbmcgYWxsIG5vbiBVUy1BU0NJSSBjaGFyYWN0ZXJzCitpbnRvIHRoZWlyIGVxdWl2YWxlbnQgdW5pY29kZSBlc2NhcGUgYmFja3NsYXNoIHUgcGx1cyA0IGRpZ2l0cy48L3A+CisKKzxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3A+CisKKzxoND5FeGFtcGxlOjwvaDQ+CisKK1RoaXMgbG9hZHMgdGhlIGJhc2ljIGNvbnN0YW50cyBkZWZpbmVkIGluIGEgSmF2YSBjbGFzcyBhcyBBbnQgcHJvcGVydGllcy4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bG9hZHByb3BlcnRpZXMgc3JjZmlsZT0mcXVvdDtub25fYXNjaWlfcHJvcGVydHkucHJvcGVydGllcyZxdW90OyZndDsKKyAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuRXNjYXBlVW5pY29kZSZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCitDb252ZW5pZW5jZSBtZXRob2Q6Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xvYWRwcm9wZXJ0aWVzIHNyY2ZpbGU9JnF1b3Q7bm9uX2FzY2lpX3Byb3BlcnR5LnByb3BlcnRpZXMmcXVvdDsmZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7ZXNjYXBldW5pY29kZS8mZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8aDM+PGEgbmFtZT0iZXhwYW5kcHJvcGVydGllcyI+RXhwYW5kUHJvcGVydGllczwvYT48L2gzPgorPHA+CitJZiB0aGUgZGF0YSBjb250YWlucyBkYXRhIHRoYXQgcmVwcmVzZW50cyBBbnQKK3Byb3BlcnRpZXMgKG9mIHRoZSBmb3JtICR7Li4ufSksIHRoYXQgaXMgc3Vic3RpdHV0ZWQKK3dpdGggdGhlIHByb3BlcnR5J3MgYWN0dWFsIHZhbHVlLgorPHA+Cis8aDQ+RXhhbXBsZTo8L2g0PgorCitUaGlzIHJlc3VsdHMgaW4gdGhlIHByb3BlcnR5IG1vZGlmaWVkbWVzc2FnZSBob2xkaW5nIHRoZSB2YWx1ZQorJnF1b3Q7QWxsIHRoZXNlIG1vbWVudHMgd2lsbCBiZSBsb3N0IGluIHRpbWUsIGxpa2UgdGVhcmRyb3BzIGluIHRoZSByYWluJnF1b3Q7Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2VjaG8KKyAgbWVzc2FnZT0mcXVvdDtBbGwgdGhlc2UgbW9tZW50cyB3aWxsIGJlIGxvc3QgaW4gdGltZSwgbGlrZSB0ZWFyZHJvcHMgaW4gdGhlICR7d2VhdGhlcn0mcXVvdDsKKyAgZmlsZT0mcXVvdDtsb2FkZmlsZTEudG1wJnF1b3Q7CisgIC8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDt3ZWF0aGVyJnF1b3Q7IHZhbHVlPSZxdW90O3JhaW4mcXVvdDsvJmd0OworJmx0O2xvYWRmaWxlIHByb3BlcnR5PSZxdW90O21vZGlmaWVkbWVzc2FnZSZxdW90OyBzcmNGaWxlPSZxdW90O2xvYWRmaWxlMS50bXAmcXVvdDsmZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkV4cGFuZFByb3BlcnRpZXMmcXVvdDsvJmd0OworICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9sb2FkZmlsZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworQ29udmVuaWVuY2UgbWV0aG9kOgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtlY2hvCisgIG1lc3NhZ2U9JnF1b3Q7QWxsIHRoZXNlIG1vbWVudHMgd2lsbCBiZSBsb3N0IGluIHRpbWUsIGxpa2UgdGVhcmRyb3BzIGluIHRoZSAke3dlYXRoZXJ9JnF1b3Q7CisgIGZpbGU9JnF1b3Q7bG9hZGZpbGUxLnRtcCZxdW90OworICAvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7d2VhdGhlciZxdW90OyB2YWx1ZT0mcXVvdDtyYWluJnF1b3Q7LyZndDsKKyZsdDtsb2FkZmlsZSBwcm9wZXJ0eT0mcXVvdDttb2RpZmllZG1lc3NhZ2UmcXVvdDsgc3JjRmlsZT0mcXVvdDtsb2FkZmlsZTEudG1wJnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2V4cGFuZHByb3BlcnRpZXMvJmd0OworICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9sb2FkZmlsZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPGgzPjxhIG5hbWU9ImhlYWRmaWx0ZXIiPkhlYWRGaWx0ZXI8L2E+PC9oMz4KKworVGhpcyBmaWx0ZXIgcmVhZHMgdGhlIGZpcnN0IGZldyBsaW5lcyBmcm9tIHRoZSBkYXRhIHN1cHBsaWVkIHRvIGl0LgorCis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIE5hbWU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVmFsdWU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+bGluZXM8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk51bWJlciBvZiBsaW5lcyB0byBiZSByZWFkLgorICAgIERlZmF1bHRzIHRvICZxdW90OzEwJnF1b3Q7IDxicj4gQSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyB0aGF0IGFsbCBsaW5lcyBhcmUKKyAgICBwYXNzZWQgKHVzZWZ1bCB3aXRoIDxpPnNraXA8L2k+KTwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+c2tpcDwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+TnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNraXBwZWQgKGZyb20gdGhlIGJlZ2lubmluZykuCisgICAgRGVmYXVsdHMgdG8gJnF1b3Q7MCZxdW90OzwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPgorPGg0PkV4YW1wbGU6PC9oND4KKworVGhpcyBzdG9yZXMgdGhlIGZpcnN0IDE1IGxpbmVzIG9mIHRoZSBzdXBwbGllZCBkYXRhIGluIHRoZSBwcm9wZXJ0eSBzcmMuZmlsZS5oZWFkCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7c3JjLmZpbGUuaGVhZCZxdW90OyZndDsKKyAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuSGVhZEZpbHRlciZxdW90OyZndDsKKyAgICAgICZsdDtwYXJhbSBuYW1lPSZxdW90O2xpbmVzJnF1b3Q7IHZhbHVlPSZxdW90OzE1JnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbHRlcnJlYWRlciZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK0NvbnZlbmllbmNlIG1ldGhvZDoKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDtzcmMuZmlsZS5oZWFkJnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2hlYWRmaWx0ZXIgbGluZXM9JnF1b3Q7MTUmcXVvdDsvJmd0OworICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9sb2FkZmlsZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworVGhpcyBzdG9yZXMgdGhlIGZpcnN0IDE1IGxpbmVzLCBza2lwcGluZyB0aGUgZmlyc3QgMiBsaW5lcywgb2YgdGhlIHN1cHBsaWVkIGRhdGEKK2luIHRoZSBwcm9wZXJ0eSBzcmMuZmlsZS5oZWFkLiAoTWVhbnM6IGxpbmVzIDMtMTcpCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7c3JjLmZpbGUuaGVhZCZxdW90OyZndDsKKyAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtoZWFkZmlsdGVyIGxpbmVzPSZxdW90OzE1JnF1b3Q7IHNraXA9JnF1b3Q7MiZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2xvYWRmaWxlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCitTZWUgdGhlIHRlc3RjYXNlcyBmb3IgbW9yZSBleGFtcGxlcyAoPGk+c3JjXGV0Y1x0ZXN0Y2FzZXNcZmlsdGVyc1xoZWFkLXRhaWwueG1sPC9pPiBpbiB0aGUKK3NvdXJjZSBkaXN0cmlidXRpb24pLgorCis8aDM+PGEgbmFtZT0ibGluZWNvbnRhaW5zIj5MaW5lQ29udGFpbnM8L2E+PC9oMz4KKworVGhpcyBmaWx0ZXIgaW5jbHVkZXMgb25seSB0aG9zZSBsaW5lcyB0aGF0IGNvbnRhaW4gYWxsIHRoZSB1c2VyLXNwZWNpZmllZAorc3RyaW5ncy4KKworPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBUeXBlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFZhbHVlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmNvbnRhaW5zPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5TdWJzdHJpbmcgdG8gYmUgc2VhcmNoZWQgZm9yLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPm5lZ2F0ZTwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+V2hldGhlciB0byBzZWxlY3QKKyAgICAgIDxpPm5vbi08L2k+bWF0Y2hpbmcgbGluZXMgb25seS4gPGI+U2luY2UgQW50IDEuNzwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD4KKzxoND5FeGFtcGxlOjwvaDQ+CisKK1RoaXMgd2lsbCBpbmNsdWRlIG9ubHkgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIDxjb2RlPmZvbzwvY29kZT4gYW5kCis8Y29kZT5iYXI8L2NvZGU+LgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuTGluZUNvbnRhaW5zJnF1b3Q7Jmd0OworICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb250YWlucyZxdW90OyB2YWx1ZT0mcXVvdDtmb28mcXVvdDsvJmd0OworICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb250YWlucyZxdW90OyB2YWx1ZT0mcXVvdDtiYXImcXVvdDsvJmd0OworJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK0NvbnZlbmllbmNlIG1ldGhvZDoKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bGluZWNvbnRhaW5zJmd0OworICAmbHQ7Y29udGFpbnMgdmFsdWU9JnF1b3Q7Zm9vJnF1b3Q7LyZndDsKKyAgJmx0O2NvbnRhaW5zIHZhbHVlPSZxdW90O2JhciZxdW90Oy8mZ3Q7CismbHQ7L2xpbmVjb250YWlucyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworTmVnYXRpb246Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5MaW5lQ29udGFpbnMmcXVvdDsmZ3Q7CisgICZsdDtwYXJhbSB0eXBlPSZxdW90O25lZ2F0ZSZxdW90OyB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKKyAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7Y29udGFpbnMmcXVvdDsgdmFsdWU9JnF1b3Q7Zm9vJnF1b3Q7LyZndDsKKyAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7Y29udGFpbnMmcXVvdDsgdmFsdWU9JnF1b3Q7YmFyJnF1b3Q7LyZndDsKKyZsdDsvZmlsdGVycmVhZGVyJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPGk+b3I8L2k+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xpbmVjb250YWlucyBuZWdhdGU9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKKyAgJmx0O2NvbnRhaW5zIHZhbHVlPSZxdW90O2ZvbyZxdW90Oy8mZ3Q7CisgICZsdDtjb250YWlucyB2YWx1ZT0mcXVvdDtiYXImcXVvdDsvJmd0OworJmx0Oy9saW5lY29udGFpbnMmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxoMz48YSBuYW1lPSJsaW5lY29udGFpbnNyZWdleHAiPkxpbmVDb250YWluc1JlZ0V4cDwvYT48L2gzPgorCitGaWx0ZXIgd2hpY2ggaW5jbHVkZXMgb25seSB0aG9zZSBsaW5lcyB0aGF0IGNvbnRhaW4gdGhlIHVzZXItc3BlY2lmaWVkCityZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgc3RyaW5ncy4KKworPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBUeXBlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFZhbHVlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPnJlZ2V4cDwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+UmVndWxhciBleHByZXNzaW9uIHRvIGJlIHNlYXJjaGVkIGZvci48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD5uZWdhdGU8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPldoZXRoZXIgdG8gc2VsZWN0CisgICAgICA8aT5ub24tPC9pPm1hdGNoaW5nIGxpbmVzIG9ubHkuIDxiPlNpbmNlIEFudCAxLjc8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCitTZWUgPGEgaHJlZj0icmVnZXhwLmh0bWwiPlJlZ2V4cCBUeXBlPC9hPiBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXN0ZWQgZWxlbWVudCByZWdleHAgYW5kIG9mCit0aGUgY2hvaWNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbi4KKzxoND5FeGFtcGxlOjwvaDQ+CisKK1RoaXMgd2lsbCBmZXRjaCBhbGwgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIHRoZSBwYXR0ZXJuIDxjb2RlPmZvbzwvY29kZT4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkxpbmVDb250YWluc1JlZ0V4cCZxdW90OyZndDsKKyAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7cmVnZXhwJnF1b3Q7IHZhbHVlPSZxdW90O2ZvbyomcXVvdDsvJmd0OworJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK0NvbnZlbmllbmNlIG1ldGhvZDoKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bGluZWNvbnRhaW5zcmVnZXhwJmd0OworICAmbHQ7cmVnZXhwIHBhdHRlcm49JnF1b3Q7Zm9vKiZxdW90Oy8mZ3Q7CismbHQ7L2xpbmVjb250YWluc3JlZ2V4cCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworTmVnYXRpb246Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5MaW5lQ29udGFpbnNSZWdFeHAmcXVvdDsmZ3Q7CisgICZsdDtwYXJhbSB0eXBlPSZxdW90O25lZ2F0ZSZxdW90OyB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKKyAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7cmVnZXhwJnF1b3Q7IHZhbHVlPSZxdW90O2ZvbyomcXVvdDsvJmd0OworJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8aT5vcjwvaT4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bGluZWNvbnRhaW5zcmVnZXhwIG5lZ2F0ZT0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAmbHQ7cmVnZXhwIHBhdHRlcm49JnF1b3Q7Zm9vKiZxdW90Oy8mZ3Q7CismbHQ7L2xpbmVjb250YWluc3JlZ2V4cCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPGgzPjxhIG5hbWU9InByZWZpeGxpbmVzIj5QcmVmaXhMaW5lczwvYT48L2gzPgorCitBdHRhY2hlcyBhIHByZWZpeCB0byBldmVyeSBsaW5lLgorCis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIE5hbWU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVmFsdWU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+cHJlZml4PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5QcmVmaXggdG8gYmUgYXR0YWNoZWQgdG8gbGluZXMuPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPgorPGg0PkV4YW1wbGU6PC9oND4KKworVGhpcyB3aWxsIGF0dGFjaCB0aGUgcHJlZml4IDxjb2RlPkZvbzwvY29kZT4gdG8gYWxsIGxpbmVzLgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuUHJlZml4TGluZXMmcXVvdDsmZ3Q7CisgICZsdDtwYXJhbSBuYW1lPSZxdW90O3ByZWZpeCZxdW90OyB2YWx1ZT0mcXVvdDtGb28mcXVvdDsvJmd0OworJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK0NvbnZlbmllbmNlIG1ldGhvZDoKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7cHJlZml4bGluZXMgcHJlZml4PSZxdW90O0ZvbyZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxoMz48YSBuYW1lPSJyZXBsYWNldG9rZW5zIj5SZXBsYWNlVG9rZW5zPC9hPjwvaDM+CisKK1RoaXMgZmlsdGVyIHJlYWRlciByZXBsYWNlcyBhbGwgc3RyaW5ncyB0aGF0IGFyZQorc2FuZHdpY2hlZCBiZXR3ZWVuIGJlZ2ludG9rZW4gYW5kIGVuZHRva2VuIHdpdGgKK3VzZXIgZGVmaW5lZCB2YWx1ZXMuCisKKzx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVHlwZTwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBOYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFZhbHVlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPnRva2VuY2hhcjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+YmVnaW50b2tlbjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+Q2hhcmFjdGVyIG1hcmtpbmcgdGhlCisgICAgYmVnaW5uaW5nIG9mIGEgdG9rZW4uICBEZWZhdWx0cyB0byBAPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD50b2tlbmNoYXI8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPmVuZHRva2VuPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD5DaGFyYWN0ZXIgbWFya2luZyB0aGUKKyAgICBlbmQgb2YgYSB0b2tlbi4gIERlZmF1bHRzIHRvIEA8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPnRva2VuPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD5Vc2VyIGRlZmluZWQgU3RyaW5nLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+VXNlciBkZWZpbmVkIHNlYXJjaCBTdHJpbmcuPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+cHJvcGVydGllc2ZpbGU8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPk5vdCBhcHBsaWNhYmxlLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+UHJvcGVydGllcyBmaWxlIHRvIHRha2UgdG9rZW5zIGZyb20uPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+CisKKzxoND5FeGFtcGxlOjwvaDQ+CisKK1RoaXMgcmVwbGFjZXMgb2NjdXJyZW5jZXMgb2YgdGhlIHN0cmluZyAmIzY0O0RBVEUmIzY0OyBpbiB0aGUgZGF0YQord2l0aCB0b2RheSdzIGRhdGUgYW5kIHN0b3JlcyBpdCBpbiB0aGUgcHJvcGVydHkgJHtzcmMuZmlsZS5yZXBsYWNlZH0KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7dHN0YW1wLyZndDsKKyZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUucmVwbGFjZWR9JnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5SZXBsYWNlVG9rZW5zJnF1b3Q7Jmd0OworICAgICAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7dG9rZW4mcXVvdDsgbmFtZT0mcXVvdDtEQVRFJnF1b3Q7IHZhbHVlPSZxdW90OyR7VE9EQVl9JnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbHRlcnJlYWRlciZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK0NvbnZlbmllbmNlIG1ldGhvZDoKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7dHN0YW1wLyZndDsKKyZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUucmVwbGFjZWR9JnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O3JlcGxhY2V0b2tlbnMmZ3Q7CisgICAgICAmbHQ7dG9rZW4ga2V5PSZxdW90O0RBVEUmcXVvdDsgdmFsdWU9JnF1b3Q7JHtUT0RBWX0mcXVvdDsvJmd0OworICAgICZsdDsvcmVwbGFjZXRva2VucyZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK1RoaXMgd2lsbCB0cmVhdCBlYWNoIHByb3BlcnRpZXMgZmlsZSBlbnRyeSBpbiBzYW1wbGUucHJvcGVydGllcyBhcyBhIHRva2VuL2tleSBwYWlyIDoKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDske3NyYy5maWxlLnJlcGxhY2VkfSZxdW90OyZndDsKKyAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuUmVwbGFjZVRva2VucyZxdW90OyZndDsKKyAgICAgICZsdDtwYXJhbSB0eXBlPSZxdW90O3Byb3BlcnRpZXNmaWxlJnF1b3Q7IHZhbHVlPSZxdW90O3NhbXBsZS5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbHRlcnJlYWRlciZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7CismbHQ7L2ZpbHRlcmNoYWluJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8aDM+PGEgbmFtZT0ic3RyaXBqYXZhY29tbWVudHMiPlN0cmlwSmF2YUNvbW1lbnRzPC9hPjwvaDM+CisKK1RoaXMgZmlsdGVyIHJlYWRlciBzdHJpcHMgYXdheSBjb21tZW50cyBmcm9tIHRoZSBkYXRhLAordXNpbmcgSmF2YSBzeW50YXggZ3VpZGVsaW5lcy4gIFRoaXMgZmlsdGVyIGRvZXMgbm90Cit0YWtlIGluIGFueSBwYXJhbWV0ZXJzLgorPHA+Cis8aDQ+RXhhbXBsZTo8L2g0PgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtqYXZhLnNyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDske2phdmEuc3JjLmZpbGUubm9jb21tZW50c30mcXVvdDsmZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlN0cmlwSmF2YUNvbW1lbnRzJnF1b3Q7LyZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK0NvbnZlbmllbmNlIG1ldGhvZDoKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske2phdmEuc3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7amF2YS5zcmMuZmlsZS5ub2NvbW1lbnRzfSZxdW90OyZndDsKKyAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtzdHJpcGphdmFjb21tZW50cy8mZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2xvYWRmaWxlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8aDM+PGEgbmFtZT0ic3RyaXBsaW5lYnJlYWtzIj5TdHJpcExpbmVCcmVha3M8L2E+PC9oMz4KKworVGhpcyBmaWx0ZXIgcmVhZGVyIHN0cmlwcyBhd2F5IHNwZWNpZmljIGNoYXJhY3RlcnMKK2Zyb20gdGhlIGRhdGEgc3VwcGxpZWQgdG8gaXQuCisKKzx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgTmFtZTwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBWYWx1ZTwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD5saW5lYnJlYWtzPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5DaGFyYWN0ZXJzIHRoYXQgYXJlIHRvCisgICAgYmUgc3RyaXBwZWQgb3V0LiAgRGVmYXVsdHMgdG8gJnF1b3Q7XHJcbiZxdW90OzwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPgorPGg0PkV4YW1wbGVzOjwvaDQ+CisKK1RoaXMgc3RyaXBzIHRoZSAnXHInIGFuZCAnXG4nIGNoYXJhY3RlcnMuCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5jb250ZW50c30mcXVvdDsmZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlN0cmlwTGluZUJyZWFrcyZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2xvYWRmaWxlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCitDb252ZW5pZW5jZSBtZXRob2Q6Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5jb250ZW50c30mcXVvdDsmZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7c3RyaXBsaW5lYnJlYWtzLyZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK1RoaXMgdHJlYXRzIHRoZSAnKCcgYW5kICcpJyBjaGFyYWN0ZXJzIGFzIGxpbmUgYnJlYWsgY2hhcmFjdGVycyBhbmQKK3N0cmlwcyB0aGVtLgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUuY29udGVudHN9JnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5TdHJpcExpbmVCcmVha3MmcXVvdDsmZ3Q7CisgICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtsaW5lYnJlYWtzJnF1b3Q7IHZhbHVlPSZxdW90OygpJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbHRlcnJlYWRlciZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxoMz48YSBuYW1lPSJzdHJpcGxpbmVjb21tZW50cyI+U3RyaXBMaW5lQ29tbWVudHM8L2E+PC9oMz4KKworVGhpcyBmaWx0ZXIgcmVtb3ZlcyBhbGwgdGhvc2UgbGluZXMgdGhhdCBiZWdpbiB3aXRoIHN0cmluZ3MKK3RoYXQgcmVwcmVzZW50IGNvbW1lbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKworPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBUeXBlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFZhbHVlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmNvbW1lbnQ8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlN0cmluZ3MgdGhhdCBpZGVudGlmeSBhIGxpbmUgYXMgYSBjb21tZW50CisgICAgd2hlbiB0aGV5IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPgorPGg0PkV4YW1wbGVzOjwvaDQ+CisKK1RoaXMgcmVtb3ZlcyBhbGwgbGluZXMgdGhhdCBiZWdpbiB3aXRoICMsIC0tLCBSRU0sIHJlbSBhbmQgLy8KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlN0cmlwTGluZUNvbW1lbnRzJnF1b3Q7Jmd0OworICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb21tZW50JnF1b3Q7IHZhbHVlPSZxdW90OyMmcXVvdDsvJmd0OworICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb21tZW50JnF1b3Q7IHZhbHVlPSZxdW90Oy0tJnF1b3Q7LyZndDsKKyAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7Y29tbWVudCZxdW90OyB2YWx1ZT0mcXVvdDtSRU0gJnF1b3Q7LyZndDsKKyAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7Y29tbWVudCZxdW90OyB2YWx1ZT0mcXVvdDtyZW0gJnF1b3Q7LyZndDsKKyAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7Y29tbWVudCZxdW90OyB2YWx1ZT0mcXVvdDsvLyZxdW90Oy8mZ3Q7CismbHQ7L2ZpbHRlcnJlYWRlciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworQ29udmVuaWVuY2UgbWV0aG9kOgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtzdHJpcGxpbmVjb21tZW50cyZndDsKKyAgJmx0O2NvbW1lbnQgdmFsdWU9JnF1b3Q7IyZxdW90Oy8mZ3Q7CisgICZsdDtjb21tZW50IHZhbHVlPSZxdW90Oy0tJnF1b3Q7LyZndDsKKyAgJmx0O2NvbW1lbnQgdmFsdWU9JnF1b3Q7UkVNICZxdW90Oy8mZ3Q7CisgICZsdDtjb21tZW50IHZhbHVlPSZxdW90O3JlbSAmcXVvdDsvJmd0OworICAmbHQ7Y29tbWVudCB2YWx1ZT0mcXVvdDsvLyZxdW90Oy8mZ3Q7CismbHQ7L3N0cmlwbGluZWNvbW1lbnRzJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8aDM+PGEgbmFtZT0idGFic3Rvc3BhY2VzIj5UYWJzVG9TcGFjZXM8L2E+PC9oMz4KKworVGhpcyBmaWx0ZXIgcmVwbGFjZXMgdGFicyB3aXRoIHNwYWNlcworCis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIE5hbWU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVmFsdWU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+dGFibGVuZ3RoPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5EZWZhdWx0cyB0byAmcXVvdDs4JnF1b3Q7PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+Cis8aDQ+RXhhbXBsZXM6PC9oND4KKworVGhpcyByZXBsYWNlcyB0YWJzIGluICR7c3JjLmZpbGV9IHdpdGggc3BhY2VzLgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUubm90YWJ9JnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5UYWJzVG9TcGFjZXMmcXVvdDsvJmd0OworICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9sb2FkZmlsZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworQ29udmVuaWVuY2UgbWV0aG9kOgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUubm90YWJ9JnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O3RhYnN0b3NwYWNlcy8mZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2xvYWRmaWxlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8aDM+PGEgbmFtZT0idGFpbGZpbHRlciI+VGFpbEZpbHRlcjwvYT48L2gzPgorCitUaGlzIGZpbHRlciByZWFkcyB0aGUgbGFzdCBmZXcgbGluZXMgZnJvbSB0aGUgZGF0YSBzdXBwbGllZCB0byBpdC4KKworPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBOYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFZhbHVlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmxpbmVzPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5OdW1iZXIgb2YgbGluZXMgdG8gYmUgcmVhZC4KKyAgICBEZWZhdWx0cyB0byAmcXVvdDsxMCZxdW90OyA8YnI+IEEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgdGhhdCBhbGwgbGluZXMgYXJlCisgICAgcGFzc2VkICh1c2VmdWwgd2l0aCA8aT5za2lwPC9pPik8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPnNraXA8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk51bWJlciBvZiBsaW5lcyB0byBiZSBza2lwcGVkIChmcm9tIHRoZSBlbmQpLgorICAgIERlZmF1bHRzIHRvICZxdW90OzAmcXVvdDsgPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+CisKKzxoND5CYWNrZ3JvdW5kOjwvaDQ+CitXaXRoIEhlYWRGaWx0ZXIgYW5kIFRhaWxGaWx0ZXIgeW91IGNhbiBleHRyYWN0IGVhY2ggcGFydCBvZiBhIHRleHQgZmlsZSB5b3Ugd2FudC4KK1RoaXMgZ3JhcGhpYyBzaG93cyB0aGUgZGVwZW5kZW5jaWVzOgorCis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorPHRyPgorIDx0aD4gQ29udGVudCA8L3RoPgorIDx0aD48L3RoPgorIDx0aD48L3RoPgorIDx0aD48L3RoPgorIDx0aD4gRmlsdGVyIDwvdGg+Cis8L3RyPgorPHRyPgorIDx0ZD4gTGluZSAxIDwvdGQ+CisgPHRkIHJvd3NwYW49IjIiIGJnY29sb3I9IiNDMEMwQzAiPiZuYnNwOzwvdGQ+CisgPHRkIHJvd3NwYW49IjkiIGJnY29sb3I9IiNGRjAwRkYiPiZuYnNwOzwvdGQ+CisgPHRkIHJvd3NwYW49IjQiPiZuYnNwOzwvdGQ+CisgPHRkIHJvd3NwYW49IjExIj4KKyAgICA8dGFibGU+CisgICAgPHRyPgorICAgICA8dGQgYmdjb2xvcj0iI0MwQzBDMCI+Jm5ic3A7PC90ZD4KKyAgICAgPHRkPjxwcmU+Jmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtoZWFkZmlsdGVyIGxpbmVzPSIyIi8mZ3Q7CismbHQ7L2ZpbHRlcmNoYWluJmd0OzwvcHJlPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgIDx0ZCBiZ2NvbG9yPSIjRkYwMEZGIj4mbmJzcDs8L3RkPgorICAgICA8dGQ+PHByZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O3RhaWxmaWx0ZXIgbGluZXM9Ii0xIiBza2lwPSIyIi8mZ3Q7CismbHQ7L2ZpbHRlcmNoYWluJmd0OzwvcHJlPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgIDx0ZCBiZ2NvbG9yPSIjMDA4MDAwIj4mbmJzcDs8L3RkPgorICAgICA8dGQ+PHByZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2hlYWRmaWx0ZXIgbGluZXM9Ii0xIiBza2lwPSIyIi8mZ3Q7CismbHQ7L2ZpbHRlcmNoYWluJmd0OzwvcHJlPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgIDx0ZCBiZ2NvbG9yPSIjMDAwMEZGIj4mbmJzcDs8L3RkPgorICAgICA8dGQ+PHByZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2hlYWRmaWx0ZXIgbGluZXM9Ii0xIiBza2lwPSIyIi8mZ3Q7CisgICAgJmx0O3RhaWxmaWx0ZXIgbGluZXM9Ii0xIiBza2lwPSIyIi8mZ3Q7CismbHQ7L2ZpbHRlcmNoYWluJmd0OzwvcHJlPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgIDx0ZCBiZ2NvbG9yPSIjMDBGRjAwIj4mbmJzcDs8L3RkPgorICAgICA8dGQ+PHByZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O3RhaWxmaWx0ZXIgbGluZXM9IjIiLyZndDsKKyZsdDsvZmlsdGVyY2hhaW4mZ3Q7PC9wcmU+PC90ZD4KKyAgICA8L3RyPgorICAgIDwvdGFibGU+CisgPC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPiBMaW5lIDIgPC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPiBMaW5lIDMgPC90ZD4KKyA8dGQgcm93c3Bhbj0iOSIgYmdjb2xvcj0iIzAwODAwMCI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPiBMaW5lIDQgPC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPiBMaW5lIDUgPC90ZD4KKyA8dGQgcm93c3Bhbj0iMyIgYmdjb2xvcj0iIzAwMDBGRiI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPiBMaW5lcyAuLi4gPC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPiBMaW5lIDk1IDwvdGQ+Cis8L3RyPgorPHRyPgorIDx0ZD4gTGluZSA5NiA8L3RkPgorIDx0ZCByb3dzcGFuPSI0Ij4mbmJzcDs8L3RkPgorPC90cj4KKzx0cj4KKyA8dGQ+IExpbmUgOTcgPC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPiBMaW5lIDk4IDwvdGQ+CisgPHRkIHJvd3NwYW49IjIiIGJnY29sb3I9IiMwMEZGMDAiPiZuYnNwOzwvdGQ+Cis8L3RyPgorPHRyPgorIDx0ZD4gTGluZSA5OSA8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKworCis8aDQ+RXhhbXBsZXM6PC9oND4KKworVGhpcyBzdG9yZXMgdGhlIGxhc3QgMTUgbGluZXMgb2YgdGhlIHN1cHBsaWVkIGRhdGEgaW4gdGhlIHByb3BlcnR5ICR7c3JjLmZpbGUudGFpbH0KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDske3NyYy5maWxlLnRhaWx9JnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5UYWlsRmlsdGVyJnF1b3Q7Jmd0OworICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7bGluZXMmcXVvdDsgdmFsdWU9JnF1b3Q7MTUmcXVvdDsvJmd0OworICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OworICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9sb2FkZmlsZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworQ29udmVuaWVuY2UgbWV0aG9kOgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUudGFpbH0mcXVvdDsmZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7dGFpbGZpbHRlciBsaW5lcz0mcXVvdDsxNSZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2xvYWRmaWxlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisKK1RoaXMgc3RvcmVzIHRoZSBsYXN0IDUgbGluZXMgb2YgdGhlIGZpcnN0IDE1IGxpbmVzIG9mIHRoZSBzdXBwbGllZAorZGF0YSBpbiB0aGUgcHJvcGVydHkgJHtzcmMuZmlsZS5taWR9Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5taWR9JnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5IZWFkRmlsdGVyJnF1b3Q7Jmd0OworICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7bGluZXMmcXVvdDsgdmFsdWU9JnF1b3Q7MTUmcXVvdDsvJmd0OworICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OworICAgICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuVGFpbEZpbHRlciZxdW90OyZndDsKKyAgICAgICZsdDtwYXJhbSBuYW1lPSZxdW90O2xpbmVzJnF1b3Q7IHZhbHVlPSZxdW90OzUmcXVvdDsvJmd0OworICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OworICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9sb2FkZmlsZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworQ29udmVuaWVuY2UgbWV0aG9kOgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUubWlkfSZxdW90OyZndDsKKyAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtoZWFkZmlsdGVyIGxpbmVzPSZxdW90OzE1JnF1b3Q7LyZndDsKKyAgICAmbHQ7dGFpbGZpbHRlciBsaW5lcz0mcXVvdDs1JnF1b3Q7LyZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKworVGhpcyBzdG9yZXMgdGhlIGxhc3QgMTAgbGluZXMsIHNraXBwaW5nIHRoZSBsYXN0IDIgbGluZXMsIG9mIHRoZSBzdXBwbGllZCBkYXRhCitpbiB0aGUgcHJvcGVydHkgc3JjLmZpbGUuaGVhZC4gKE1lYW5zOiBpZiBzdXBwbGllZCBkYXRhIGNvbnRhaW5zIDYwIGxpbmVzLAorbGluZXMgNDktNTggYXJlIGV4dHJhY3RlZCkKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDtzcmMuZmlsZS5oZWFkJnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O3RhaWxmaWx0ZXIgbGluZXM9JnF1b3Q7MTAmcXVvdDsgc2tpcD0mcXVvdDsyJnF1b3Q7LyZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxoMz48YSBuYW1lPSJkZWxldGVjaGFyYWN0ZXJzIj5EZWxldGVDaGFyYWN0ZXJzPC9hPjwvaDM+CisKKyAgPHA+VGhpcyBmaWx0ZXIgZGVsZXRlcyBzcGVjaWZpZWQgY2hhcmFjdGVycy48L3A+CisgIDxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3A+CisgIDxwPlRoaXMgZmlsdGVyIGlzIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBjb252ZW5pZW5jZSBmb3JtLjwvcD4KKworPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBOYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFZhbHVlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmNoYXJzPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD4KKyAgICAgIFRoZSBjaGFyYWN0ZXJzIHRvIGRlbGV0ZS4gVGhpcyBhdHRyaWJ1dGUgaXMKKyAgICAgIDxhIGhyZWY9IiNiYWNrc2xhc2giPmJhY2tzbGFzaCBlbmFibGVkPC9hPi4KKyAgICA8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+Cis8aDQ+RXhhbXBsZXM6PC9oND4KKworRGVsZXRlIHRhYnMgYW5kIHJldHVybnMgZnJvbSB0aGUgZGF0YS4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZGVsZXRlY2hhcmFjdGVycyBjaGFycz0iXHRcciIvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8aDM+PGEgbmFtZT0iY29uY2F0ZmlsdGVyIj5Db25jYXRGaWx0ZXI8L2E+PC9oMz4KKyAgPHA+VGhpcyBmaWx0ZXIgcHJlcGVuZHMgb3IgYXBwZW5kcyB0aGUgY29udGVudCBmaWxlIHRvIHRoZSBmaWx0ZXJlZCBmaWxlcy48L3A+CisgIDxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3A+Cis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIE5hbWU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVmFsdWU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+cHJlcGVuZDwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+CisgICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB3aGljaCBjb250ZW50IHNob3VsZCBiZSBwcmVwZW5kZWQgdG8gdGhlIGZpbGUuCisgICAgPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD5hcHBlbmQ8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPgorICAgICAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hpY2ggY29udGVudCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIGZpbGUuCisgICAgPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+CisKKzxoND5FeGFtcGxlczo8L2g0PgorCitEbyBub3RoaW5nOgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7Y29uY2F0ZmlsdGVyLyZndDsKKyZsdDsvZmlsdGVyY2hhaW4mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK0FkZHMgYSBsaWNlbnNlIHRleHQgYmVmb3JlIGVhY2ggamF2YSBzb3VyY2U6Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtjb25jYXRmaWx0ZXIgcHJlcGVuZD0iYXBhY2hlLWxpY2Vuc2UtamF2YS50eHQiLyZndDsKKyZsdDsvZmlsdGVyY2hhaW4mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKworCis8aDM+PGEgbmFtZT0idG9rZW5maWx0ZXIiPlRva2VuRmlsdGVyPC9hPjwvaDM+CitUaGlzIGZpbHRlciB0b2tlbml6ZXMgdGhlIGlucHV0c3RyZWFtIGludG8gc3RyaW5ncyBhbmQgcGFzc2VzIHRoZXNlCitzdHJpbmdzIHRvIGZpbHRlcnMgb2Ygc3RyaW5ncy4gVW5saWtlIHRoZSBvdGhlciBmaWx0ZXJyZWFkZXJzLCB0aGlzIGRvZXMKK25vdCBzdXBwb3J0IHBhcmFtcywgb25seSBjb252ZW5pZW5jZSBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZC4KK1RoZSB0b2tlbml6ZXIgYW5kIHRoZSBzdHJpbmcgZmlsdGVycyBhcmUgZGVmaW5lZCBieSBuZXN0ZWQgZWxlbWVudHMuCis8cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+PC9wPgorPHA+CitPbmx5IG9uZSB0b2tlbml6ZXIgZWxlbWVudCBtYXkgYmUgdXNlZCwgdGhlIExpbmVUb2tlbml6ZXIgaXMgdGhlCitkZWZhdWx0IGlmIG5vbmUgYXJlIHNwZWNpZmllZC4gIEEgdG9rZW5pemVyCitzcGxpdHMgdGhlIGlucHV0IGludG8gdG9rZW4gc3RyaW5ncyBhbmQgdHJhaWxpbmcgZGVsaW1pdGVyIHN0cmluZ3MuCis8cD4KK1RoZXJlIG1heSBiZSB6ZXJvIG9yIG1vcmUgc3RyaW5nIGZpbHRlcnMuIEEgc3RyaW5nIGZpbHRlciBwcm9jZXNzZXMKK2EgdG9rZW4gYW5kIGVpdGhlciByZXR1cm5zIGEgc3RyaW5nIG9yIGEgbnVsbC4KK0l0IHRoZSBzdHJpbmcgaXMgbm90IG51bGwgaXQgaXMgcGFzc2VkIHRvIHRoZSBuZXh0IGZpbHRlci4gVGhpcworcHJvY2VlZHMgdW50aWwgYWxsIHRoZSBmaWx0ZXJzIGFyZSBjYWxsZWQuCitJZiBhIHN0cmluZyBpcyByZXR1cm5lZCBhZnRlciBhbGwgdGhlIGZpbHRlcnMsIHRoZSBzdHJpbmcgaXMKK291dHB1dHMgd2l0aCBpdHMgYXNzb2NpYXRlZCB0b2tlbiBkZWxpbWl0aWVyCisoaWYgb25lIGlzIHByZXNlbnQpLgorVGhlIHRyYWlsaW5nIGRlbGltaXRlciBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgPGk+ZGVsaW1PdXRwdXQ8L2k+CithdHRyaWJ1dGUuCis8cD4KKzxhIG5hbWU9ImJhY2tzbGFzaCI+PGVtPmJsYWNrc2xhc2ggaW50ZXJwcmV0YXRpb248L2VtPjwvYT4KK0EgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgKGluY2x1ZGluZyA8aT5kZWxpbU91dHB1dDwvaT4pIGludGVycHJldAorYmFja3NsYXNoIGVzY2FwZXMuIFRoZSBmb2xsb3dpbmcgYXJlIHVuZGVyc3Rvb2Q6IFxuLCBcciwgXGYsIFx0CithbmQgXFwuCisKKworPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmRlbGltT3V0cHV0PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD4KKyAgICAgVGhpcyBvdmVycmlkZXMgdGhlIHRva2VuZGVsaW1pdGVyCisgICAgICAgIHJldHVybmVkIGJ5IHRoZSB0b2tlbml6ZXIgaWYgaXQgaXMgbm90IGVtcHR5LiBUaGlzCisgICAgIGF0dHJpYnV0ZSBpcyBiYWNrc2xhc2ggZW5hYmxlZC4KKzwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPgorCisgICAgVGhlIGZvbGxvd2luZyB0b2tlbml6ZXJzIGFyZSBwcm92aWRlZCBieSB0aGUgZGVmYXVsdCBkaXN0cmlidXRpb24uCisgICAgPHA+CisgICAgICAgIDxhIGhyZWY9IiNsaW5ldG9rZW5pemVyIj5MaW5lVG9rZW5pemVyPC9hPjxicj4KKyAgICAgICAgPGEgaHJlZj0iI2ZpbGV0b2tlbml6ZXIiPkZpbGVUb2tlbml6ZXI8L2E+PGJyPgorICAgICAgICA8YSBocmVmPSIjc3RyaW5ndG9rZW5pemVyIj5TdHJpbmdUb2tlbml6ZXI8L2E+PGJyPgorICAgIDwvcD4KKworICAgIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGZpbHRlcnMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBkZWZhdWx0IGRpc3RyaWJ1dGlvbi4KKyAgICA8cD4KKyAgICAgICAgPGEgaHJlZj0iI3JlcGxhY2VzdHJpbmciPlJlcGxhY2VTdHJpbmc8L2E+PGJyPgorICAgICAgICA8YSBocmVmPSIjY29udGFpbnNzdHJpbmciPkNvbnRhaW5zU3RyaW5nPC9hPjxicj4KKyAgICAgICAgPGEgaHJlZj0iI3JlcGxhY2VyZWdleCI+UmVwbGFjZVJlZ2V4PC9hPjxicj4KKyAgICAgICAgPGEgaHJlZj0iI2NvbnRhaW5zcmVnZXgiPkNvbnRhaW5zUmVnZXg8L2E+PGJyPgorICAgICAgICA8YSBocmVmPSIjdHJpbSI+VHJpbTwvYT48YnI+CisgICAgICAgIDxhIGhyZWY9IiNpZ25vcmVibGFuayI+SWdub3JlQmxhbms8L2E+PGJyPgorICAgICAgICA8YSBocmVmPSIjZmlsdGVyZGVsZXRlY2hhcmFjdGVycyI+RGVsZXRlQ2hhcmFjdGVyczwvYT48YnI+CisgICAgPC9wPgorCisgICAgVGhlIGZvbGxvd2luZyBzdHJpbmcgZmlsdGVycyBhcmUgcHJvdmlkZWQgYnkgdGhlIG9wdGlvbmFsIGRpc3RyaWJ1dGlvbi4KKyAgICA8cD4KKyAgICAgICAgPGEgaHJlZj0iI3NjcmlwdGZpbHRlciI+U2NyaXB0RmlsdGVyPC9hPjxicj4KKyAgICA8L3A+CisKK1NvbWUgb2YgdGhlIGZpbHRlcnMgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgZmlsdGVyIGNoYWluLiBJbiB0aGlzCitjYXNlIGEgdG9rZW5maWx0ZXIgaXMgY3JlYXRlZCBpbXBsaWNpdGx5LiBBbiBleHRyYSBhdHRyaWJ1dGUgImJ5bGluZSIKK2lzIGFkZGVkIHRvIHRoZSBmaWx0ZXIgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBhIGxpbmV0b2tlbml6ZXIKKyhieWxpbmU9InRydWUiKSBvciBhIGZpbGV0b2tlbml6ZXIgKGJ5bGluZT0iZmFsc2UiKS4gVGhlIGRlZmF1bHQKK2lzICJ0cnVlIi4KKzxwPgorCis8cD48Yj48ZW0+PGEgbmFtZT0ibGluZXRva2VuaXplciI+TGluZVRva2VuaXplcjwvYT48L2VtPjwvYj48L3A+CitUaGlzIHRva2VuaXplciBzcGxpdHMgdGhlIGlucHV0IGludG8gbGluZXMuCitUaGUgdG9rZW5pemVyIGRlbGltaXRzIGxpbmVzCitieSAiXHIiLCAiXG4iIG9yICJcclxuIi4KK1RoaXMgaXMgdGhlIGRlZmF1bHQgdG9rZW5pemVyLgorPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmluY2x1ZGVEZWxpbXM8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPgorICAgICAgSW5jbHVkZSB0aGUgbGluZSBlbmRpbmdzIGluIHRoZSB0b2tlbi4KKyAgICAgIERlZmF1bHQgaXMgZmFsc2UuCisgICAgPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg0PkV4YW1wbGVzOjwvaDQ+CisKK0NvbnZlcnQgaW5wdXQgY3VycmVudCBsaW5lIGVuZGluZ3MgdG8gdW5peCBzdHlsZSBsaW5lIGVuZGluZ3MuCis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Rva2VuZmlsdGVyIGRlbGltb3V0cHV0PSZxdW90O1xuJnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworCitSZW1vdmUgYmxhbmsgbGluZXMuCis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Rva2VuZmlsdGVyJmd0OworICAgICZsdDtpZ25vcmVibGFuay8mZ3Q7CismbHQ7L3Rva2VuZmlsdGVyJmd0OworCis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPjxiPjxlbT48YSBuYW1lPSJmaWxldG9rZW5pemVyIj5GaWxlVG9rZW5pemVyPC9hPjwvZW0+PC9iPjwvcD4KK1RoaXMgdG9rZW5pemVyIHRyZWF0cyA8Yj5hbGw8L2I+IHRoZSBpbnB1dCBhcyBhIHRva2VuLiBTbyBiZQorY2FyZWZ1bCBub3QgdG8gdXNlIHRoaXMgb24gdmVyeSBsYXJnZSBpbnB1dC4KKzxoND5FeGFtcGxlczo8L2g0PgorCitSZXBsYWNlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHBhY2thZ2Ugd2l0aCAvL3BhY2thZ2UuCis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Rva2VuZmlsdGVyJmd0OworICAgICAgJmx0O2ZpbGV0b2tlbml6ZXIvJmd0OworICAgICAgJmx0O3JlcGxhY2VyZWdleCBwYXR0ZXJuPSIoW1xuXHJdK1sgXHRdKnxeWyBcdF0qKXBhY2thZ2UiCisgICAgICAgICAgICAgICAgICAgIGZsYWdzPSJzIgorICAgICAgICAgICAgICAgICAgICByZXBsYWNlPSJcMS8vcGFja2FnZSIvJmd0OworJmx0Oy90b2tlbmZpbHRlciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+PGI+PGVtPjxhIG5hbWU9InN0cmluZ3Rva2VuaXplciI+U3RyaW5nVG9rZW5pemVyPC9hPjwvZW0+PC9iPjwvcD4KK1RoaXMgdG9rZW5pemVyIGlzIGJhc2VkIG9uIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIuCitJdCBzcGxpdHMgdXAgdGhlIGlucHV0IGludG8gc3RyaW5ncyBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2UsIG9yCitieSBhIHNwZWNpZmllZCBsaXN0IG9mIGRlbGltaXRpbmcgY2hhcmFjdGVycy4KK0lmIHRoZSBzdHJlYW0gc3RhcnRzIHdpdGggZGVsaW1pdGVyIGNoYXJhY3RlcnMsIHRoZSBmaXJzdAordG9rZW4gd2lsbCBiZSB0aGUgZW1wdHkgc3RyaW5nICh1bmxlc3MgdGhlIDxpPmRlbGltc2FyZXRva2VuczwvaT4KK2F0dHJpYnV0ZSBpcyB1c2VkKS4KKworPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmRlbGltczwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+VGhlIGRlbGltaXRlciBjaGFyYWN0ZXJzLiBXaGl0ZSBzcGFjZQorICAgICAgaXMgdXNlZCBpZiB0aGlzIGlzIG5vdCBzZXQuIChXaGl0ZSBzcGFjZSBpcyBkZWZpbmVkCisgICAgICBpbiB0aGlzIGNhc2UgYnkgamF2YS5sYW5nLkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoKSkuCisgICAgPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlbGltc2FyZXRva2VuczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiB0aGlzIGlzIHRydWUsCisgICAgICBlYWNoIGRlbGltaXRlciBjaGFyYWN0ZXIgaXMgcmV0dXJuZWQgYXMgYSB0b2tlbi4KKyAgICAgIERlZmF1bHQgaXMgZmFsc2UuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3VwcHJlc3NkZWxpbXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBJZiB0aGlzIGlzIHRydWUsIGRlbGltaXRlcnMgYXJlIG5vdCByZXR1cm5lZC4KKyAgICAgIERlZmF1bHQgaXMgZmFsc2UuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmluY2x1ZGVEZWxpbXM8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPgorICAgICAgSW5jbHVkZSB0aGUgZGVsaW1pdGVycyBpbiB0aGUgdG9rZW4uCisgICAgICBEZWZhdWx0IGlzIGZhbHNlLgorICAgIDwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0PkV4YW1wbGVzOjwvaDQ+CisKK1N1cnJvdW5kIGVhY2ggbm9uIHNwYWNlIHRva2VuIHdpdGggYSAiW10iLgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Rva2VuZmlsdGVyJmd0OworICAgICZsdDtzdHJpbmd0b2tlbml6ZXIvJmd0OworICAgICZsdDtyZXBsYWNlcmVnZXggcGF0dGVybj0iKC4rKSIgcmVwbGFjZT0iW1wxXSIvJmd0OworJmx0Oy90b2tlbmZpbHRlciZndDsKKworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD48Yj48ZW0+PGEgbmFtZT0icmVwbGFjZXN0cmluZyI+UmVwbGFjZVN0cmluZzwvYT48L2VtPjwvYj48L3A+CitUaGlzIGlzIGEgc2ltcGxlIGZpbHRlciB0byByZXBsYWNlIHN0cmluZ3MuCitUaGlzIGZpbHRlciBtYXkgYmUgdXNlZCBkaXJlY3RseSB3aXRoaW4gYSBmaWx0ZXJjaGFpbi4KKworPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmZyb208L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPlRoZSBzdHJpbmcgdGhhdCBtdXN0IGJlIHJlcGxhY2VkLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHJlcGxhY2VkIHN0cmluZy4gV2hlbiBvbWl0dGVkCisgICAgICBhbiBlbXB0eSBzdHJpbmcgaXMgdXNlZC4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0PkV4YW1wbGVzOjwvaDQ+CisKK1JlcGxhY2UgInN1biIgd2l0aCAibW9vbiIuCisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7dG9rZW5maWx0ZXImZ3Q7CisgICAgJmx0O3JlcGxhY2VzdHJpbmcgZnJvbT0ic3VuIiB0bz0ibW9vbiIvJmd0OworJmx0Oy90b2tlbmZpbHRlciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+PGI+PGVtPjxhIG5hbWU9ImNvbnRhaW5zc3RyaW5nIj5Db250YWluc1N0cmluZzwvYT48L2VtPjwvYj48L3A+CitUaGlzIGlzIGEgc2ltcGxlIGZpbHRlciB0byBmaWx0ZXIgdG9rZW5zIHRoYXQgY29udGFpbnMKK2Egc3BlY2lmaWVkIHN0cmluZy4KKworPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmNvbnRhaW5zPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD5UaGUgc3RyaW5nIHRoYXQgdGhlIHRva2VuIG11c3QgY29udGFpbi48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+RXhhbXBsZXM6PC9oND4KKworSW5jbHVkZSBvbmx5IGxpbmVzIHRoYXQgY29udGFpbiAiZm9vIjsKKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDt0b2tlbmZpbHRlciZndDsKKyAgICAmbHQ7Y29udGFpbnNzdHJpbmcgY29udGFpbnM9ImZvbyIvJmd0OworJmx0Oy90b2tlbmZpbHRlciZndDsKKworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD48Yj48ZW0+PGEgbmFtZT0icmVwbGFjZXJlZ2V4Ij5SZXBsYWNlUmVnZXg8L2E+PC9lbT48L2I+PC9wPgorVGhpcyBzdHJpbmcgZmlsdGVyIHJlcGxhY2VzIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCitUaGlzIGZpbHRlciBtYXkgYmUgdXNlZCBkaXJlY3RseSB3aXRoaW4gYSBmaWx0ZXJjaGFpbi4KKzxwPgorIFNlZSA8YSBocmVmPSJyZWdleHAuaHRtbCNpbXBsZW1lbnRhdGlvbiI+UmVnZXhwIFR5cGU8L2E+Citjb25jZXJuaW5nIHRoZSBjaG9pY2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uLgorPC9wPgorCis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+cGF0dGVybjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGluCisgICAgICB0aGUgdG9rZW4uPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+cmVwbGFjZTwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+VGhlIHN1YnN0aXR1dGlvbiBwYXR0ZXJuIHRvIHJlcGxhY2UgdGhlIG1hdGNoZWQKKyAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbi4gV2hlbiBvbWl0dGVkIGFuIGVtcHR5IHN0cmluZyBpcyB1c2VkLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+ZmxhZ3M8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPlNlZQorPGEgaHJlZj0iLi4vT3B0aW9uYWxUYXNrcy9yZXBsYWNlcmVnZXhwLmh0bWwiPlJlcGxhY2VSZWdleHA8L2E+Citmb3IgYW4gZXhwbGFuYXRpb24gb2YgcmVnZXggZmxhZ3MuPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg0PkV4YW1wbGVzOjwvaDQ+CisKK1JlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mICJoZWxsbyIgd2l0aCAid29ybGQiLCBpZ25vcmluZyBjYXNlLgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Rva2VuZmlsdGVyJmd0OworICAgICZsdDtyZXBsYWNlcmVnZXggcGF0dGVybj0iaGVsbG8iIHJlcGxhY2U9IndvcmxkIiBmbGFncz0iZ2kiLyZndDsKKyZsdDsvdG9rZW5maWx0ZXImZ3Q7CisKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+PGI+PGVtPjxhIG5hbWU9ImNvbnRhaW5zcmVnZXgiPkNvbnRhaW5zUmVnZXg8L2E+PC9lbT48L2I+PC9wPgorVGhpcyBmaWx0ZXJzIHN0cmluZ3MgdGhhdCBtYXRjaCByZWd1bGFyIGV4cHJlc3Npb25zLgorVGhlIGZpbHRlciBtYXkgb3B0aW9uYWxseSByZXBsYWNlIHRoZSBtYXRjaGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KK1RoaXMgZmlsdGVyIG1heSBiZSB1c2VkIGRpcmVjdGx5IHdpdGhpbiBhIGZpbHRlcmNoYWluLgorPHA+CitTZWUKKzxhIGhyZWY9InJlZ2V4cC5odG1sI2ltcGxlbWVudGF0aW9uIj5SZWdleHAgVHlwZTwvYT4KK2NvbmNlcm5pbmcgdGhlIGNob2ljZSBvZiByZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24uCis8L3A+Cis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+cGF0dGVybjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGluCisgICAgICB0aGUgdG9rZW4uPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+cmVwbGFjZTwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+VGhlIHN1YnN0aXR1dGlvbiBwYXR0ZXJuIHRvIHJlcGxhY2UgdGhlIG1hdGNoZWQKKyAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbi4gV2hlbiBvbWl0dGVkIHRoZSBvcmlnbmFsIHRva2VuIGlzIHJldHVybmVkLgorICAgIDwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+ZmxhZ3M8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPlNlZQorPGEgaHJlZj0iLi4vT3B0aW9uYWxUYXNrcy9yZXBsYWNlcmVnZXhwLmh0bWwiPlJlcGxhY2VSZWdleHA8L2E+Citmb3IgYW4gZXhwbGFuYXRpb24gb2YgcmVnZXggZmxhZ3MuPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+RXhhbXBsZXM6PC9oND4KKworRmlsdGVyIGxpbmVzIHRoYXQgY29udGFpbiAiaGVsbG8iIG9yICJ3b3JsZCIsIGlnbm9yaW5nIGNhc2UuCisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7dG9rZW5maWx0ZXImZ3Q7CisgICAgJmx0O2NvbnRhaW5zcmVnZXggcGF0dGVybj0iKGhlbGxvfHdvcmxkKSIgZmxhZ3M9ImkiLyZndDsKKyZsdDsvdG9rZW5maWx0ZXImZ3Q7CisKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworVGhpcyBleGFtcGxlIHJlcGxhY2VzIGxpbmVzIGxpa2UgIlNVSVRFKFRlc3RTdWl0ZSwgYml0cyk7IiB3aXRoCisidm9pZCByZWdpc3Rlcl9iaXRzKCk7IiBhbmQgcmVtb3ZlcyBvdGhlciBsaW5lcy4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDt0b2tlbmZpbHRlciZndDsKKyAgICAmbHQ7Y29udGFpbnNyZWdleAorICAgICAgICBwYXR0ZXJuPSJeICpTVUlURVwoLiosXHMqKC4qKVxzKlwpLioiCisgICAgICAgIHJlcGxhY2U9InZvaWQgcmVnaXN0ZXJfXDEoKTsiLyZndDsKKyZsdDsvdG9rZW5maWx0ZXImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPjxiPjxlbT48YSBuYW1lPSJ0cmltIj5UcmltPC9hPjwvZW0+PC9iPjwvcD4KK1RoaXMgZmlsdGVyIHRyaW1zIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3RhcnQgYW5kIGVuZCBvZgordG9rZW5zLgorVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgZmlsdGVyY2hhaW4uCis8cD48Yj48ZW0+PGEgbmFtZT0iaWdub3JlYmxhbmsiPklnbm9yZUJsYW5rPC9hPjwvZW0+PC9iPjwvcD4KK1RoaXMgZmlsdGVyIHJlbW92ZXMgZW1wdHkgdG9rZW5zLgorVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgZmlsdGVyY2hhaW4uCis8cD48Yj48ZW0+PGEgbmFtZT0iZmlsdGVyZGVsZXRlY2hhcmFjdGVycyI+RGVsZXRlQ2hhcmFjdGVyczwvYT48L2VtPjwvYj48L3A+CitUaGlzIGZpbHRlciBkZWxldGVzIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gdG9rZW5zLgorCis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+Y2hhcnM8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPlRoZSBjaGFyYWN0ZXJzIHRvIGRlbGV0ZS4gVGhpcyBhdHRyaWJ1dGUKKyAgICAgIGlzIGJhY2tzbGFzaCBlbmFibGVkLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5FeGFtcGxlczo8L2g0PgorCitEZWxldGUgdGFicyBmcm9tIGxpbmVzLCB0cmltIHRoZSBsaW5lcyBhbmQgcmVtb3ZlcyBlbXB0eSBsaW5lcy4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDt0b2tlbmZpbHRlciZndDsKKyAgICAmbHQ7ZGVsZXRlY2hhcmFjdGVycyBjaGFycz0iXHQiLyZndDsKKyAgICAmbHQ7dHJpbS8mZ3Q7CisgICAgJmx0O2lnbm9yZWJsYW5rLyZndDsKKyZsdDsvdG9rZW5maWx0ZXImZ3Q7CisKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+PGI+PGVtPjxhIG5hbWU9InNjcmlwdGZpbHRlciI+U2NyaXB0RmlsdGVyPC9hPjwvZW0+PC9iPjwvcD4KK1RoaXMgaXMgYW4gb3B0aW9uYWwgZmlsdGVyIHRoYXQgZXhlY3V0ZXMgYSBzY3JpcHQgaW4gYQorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YiIHRhcmdldD0iX3RvcCI+QXBhY2hlIEJTRjwvYT4KKyAgb3IKKyAgPGEgaHJlZj0iaHR0cHM6Ly9zY3JpcHRpbmcuZGV2LmphdmEubmV0Ij5KU1IgMjIzPC9hPgorc3VwcG9ydGVkIGxhbmd1YWdlLjwvcD4KK1NlZSB0aGUgPGEgaHJlZj0iLi4vT3B0aW9uYWxUYXNrcy9zY3JpcHQuaHRtbCI+U2NyaXB0PC9hPiB0YXNrIGZvcgorYW4gZXhwbGFuYXRpb24gb2Ygc2NyaXB0cyBhbmQgZGVwZW5kZW5jaWVzLgorPC9wPgorPHA+CitUaGUgc2NyaXB0IGlzIHByb3ZpZGVkIHdpdGggYW4gb2JqZWN0IDxpPnNlbGY8L2k+IHRoYXQgaGFzCitnZXRUb2tlbigpIGFuZCBzZXRUb2tlbihTdHJpbmcpIG1ldGhvZHMuCitUaGUgZ2V0VG9rZW4oKSBtZXRob2QgcmV0dXJucyB0aGUgY3VycmVudCB0b2tlbi4gVGhlIHNldFRva2VuKFN0cmluZykKK21ldGhvZCByZXBsYWNlcyB0aGUgY3VycmVudCB0b2tlbi4KKzwvcD4KKworVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgZmlsdGVyY2hhaW4uPHA+Cis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+bGFuZ3VhZ2U8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPiBUaGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhlIHNjcmlwdCBpcyB3cml0dGVuIGluLgorTXVzdCBiZSBhIHN1cHBvcnRlZCBBcGFjaGUgQlNGIG9yIEpTUiAyMjMgbGFuZ3VhZ2U8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmFnZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGUgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyIHRvIHVzZS4KKyAgICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vT3B0aW9uYWxUYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCisgICAgICBmb3IgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdCBpcyAiYXV0byI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+c3JjPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD5UaGUgbG9jYXRpb24gb2YgdGhlIHNjcmlwdCBhcyBhIGZpbGUsIGlmIG5vdCBpbmxpbmUKKyAgICA8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2V0YmVhbnM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciB0byBoYXZlIGFsbCBwcm9wZXJ0aWVzLCByZWZlcmVuY2VzIGFuZCB0YXJnZXRzIGFzCisgICAgICBnbG9iYWwgdmFyaWFibGVzIGluIHRoZSBzY3JpcHQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzICJ0cnVlIi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGUgY2xhc3NwYXRoIHRvIHBhc3MgaW50byB0aGUgc2NyaXB0LgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgYQorICAgICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorICA8cD4KKyAgICBUaGlzIGZpbHRlciBjYW4gdGFrZSBhIG5lc3RlZCAmbHQ7Y2xhc3NwYXRoJmd0OyBlbGVtZW50LgorICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vT3B0aW9uYWxUYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCisgICAgb24gaG93IHRvIHVzZSB0aGlzIGVsZW1lbnQuCisgIDwvcD4KKzxoND5FeGFtcGxlczo8L2g0PgorCitDb252ZXJ0IHRvIHVwcGVyY2FzZToKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7dG9rZW5maWx0ZXImZ3Q7CisgICAgJmx0O3NjcmlwdGZpbHRlciBsYW5ndWFnZT0iamF2YXNjcmlwdCImZ3Q7CisgICAgICAgIHNlbGYuc2V0VG9rZW4oc2VsZi5nZXRUb2tlbigpLnRvVXBwZXJDYXNlKCkpOworICAgICZsdDsvc2NyaXB0ZmlsdGVyJmd0OworJmx0Oy90b2tlbmZpbHRlciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworUmVtb3ZlIGxpbmVzIGNvbnRhaW5pbmcgdGhlIHN0cmluZyAiYmFkIiB3aGlsZQorY29weWluZyB0ZXh0IGZpbGVzOgorICA8YmxvY2txdW90ZT4KKyAgICA8cHJlPgorJmx0O2NvcHkgdG9kaXI9ImRpc3QiJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9InNyYyIgaW5jbHVkZXM9IioqLyoudHh0Ii8mZ3Q7CisgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAmbHQ7c2NyaXB0ZmlsdGVyIGxhbmd1YWdlPSJiZWFuc2hlbGwiJmd0OworICAgICAgICBpZiAoc2VsZi5nZXRUb2tlbigpLmluZGV4T2YoImJhZCIpICE9IC0xKSB7CisgICAgICAgICAgICBzZWxmLnNldFRva2VuKG51bGwpOworICAgICAgICB9CisgICAgJmx0Oy9zY3JpcHRmaWx0ZXImZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2NvcHkmZ3Q7CisgICAgPC9wcmU+CisgIDwvYmxvY2txdW90ZT4KKworPGg0PkN1c3RvbSB0b2tlbml6ZXJzIGFuZCBzdHJpbmcgZmlsdGVyczwvaDQ+CisKK0N1c3RvbSBzdHJpbmcgZmlsdGVycyBhbmQgdG9rZW5pemVycyBtYXkgYmUgcGx1Z2dlZCBpbiBieQorZXh0ZW5kaW5nIHRoZSBpbnRlcmZhY2VzIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuVG9rZW5GaWx0ZXIuRmlsdGVyCithbmQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Ub2tlbml6ZXIgcmVzcGVjdGx5LgorCitUaGV5IGFyZSBkZWZpbmVkIHRoZSBidWlsZCBmaWxlIHVzaW5nIDxjb2RlPiZsdDt0eXBlZGVmLyZndDs8L2NvZGU+LiBGb3IKK2V4YW1wbGUgYSBzdHJpbmcgZmlsdGVyIHRoYXQgY2FwaXRhbGl6ZXMgd29yZHMgbWF5IGJlIGRlY2xhcmVkIGFzOgorPGJsb2NrcXVvdGU+PHByZT4KK3BhY2thZ2UgbXkuY3VzdG9tYW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuVG9rZW5GaWx0ZXI7CisKK3B1YmxpYyBjbGFzcyBDYXBpdGFsaXplCisgICAgaW1wbGVtZW50cyBUb2tlbkZpbHRlci5GaWx0ZXIKK3sKKyAgICBwdWJsaWMgU3RyaW5nIGZpbHRlcihTdHJpbmcgdG9rZW4pIHsKKyAgICAgICAgaWYgKHRva2VuLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIHJldHVybiB0b2tlbi5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArCisgICAgICAgICAgICAgICAgdG9rZW4uc3Vic3RyaW5nKDEpOworICAgfQorfQorPC9wcmU+PC9ibG9ja3F1b3RlPgorCitUaGlzIG1heSBiZSB1c2VkIGFzIGZvbGxvd3M6Cis8YmxvY2txdW90ZT48cHJlPgorICAmbHQ7dHlwZWRlZiB0eXBlPSJjYXBpdGFsaXplIiBjbGFzc25hbWU9Im15LmN1c3RvbWFudC5DYXBpdGFsaXplIgorICAgICAgICAgICBjbGFzc3BhdGg9Im15LmN1c3RvbWFudC5wYXRoIi8mZ3Q7CisgICZsdDtjb3B5IGZpbGU9ImlucHV0IiB0b2ZpbGU9Im91dHB1dCImZ3Q7CisgICAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICAgJmx0O3Rva2VuZmlsdGVyJmd0OworICAgICAgICAmbHQ7c3RyaW5ndG9rZW5pemVyLyZndDsKKyAgICAgICAgJmx0O2NhcGl0YWxpemUvJmd0OworICAgICAgJmx0Oy90b2tlbmZpbHRlciZndDsKKyAgICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworICAmbHQ7L2NvcHkmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvZmlsdGVyc2V0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvZmlsdGVyc2V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4YjQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9maWx0ZXJzZXQuaHRtbApAQCAtMCwwICsxLDE4MSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5GaWx0ZXJTZXQgVHlwZTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgyPjxhIG5hbWU9ImZpbHRlcnNldCI+RmlsdGVyU2V0PC9hPjwvaDI+CisKKzxwPkZpbHRlclNldHMgYXJlIGdyb3VwcyBvZiBmaWx0ZXJzLiBGaWx0ZXJzIGNhbiBiZSBkZWZpbmVkIGFzIHRva2VuLXZhbHVlCitwYWlycyAKK29yIGJlIHJlYWQgaW4gZnJvbSBhIGZpbGUuIEZpbHRlclNldHMgY2FuIGFwcGVhciBpbnNpZGUgdGFza3MgdGhhdCBzdXBwb3J0IHRoaXMgCitmZWF0dXJlIG9yIGF0IHRoZSBzYW1lIGxldmVsIGFzIDxjb2RlPiZsdDt0YXJnZXQmZ3Q7PC9jb2RlPiAtIGkuZS4sIGFzCitjaGlsZHJlbiBvZiAKKzxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4uPC9wPgorCis8cD5GaWx0ZXJTZXRzIHN1cHBvcnQgdGhlIDxjb2RlPmlkPC9jb2RlPiBhbmQgPGNvZGU+cmVmaWQ8L2NvZGU+CithdHRyaWJ1dGVzLiAgWW91IGNhbiBkZWZpbmUgYSBGaWx0ZXJTZXQgd2l0aCBhbiA8Y29kZT5pZDwvY29kZT4KK2F0dHJpYnV0ZSBhbmQgdGhlbiByZWZlciB0byB0aGF0IGRlZmluaXRpb24gZnJvbSBhbm90aGVyIEZpbHRlclNldAord2l0aCBhIDxjb2RlPnJlZmlkPC9jb2RlPiBhdHRyaWJ1dGUuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG5lc3QKK2ZpbHRlcnNldHMgaW50byBmaWx0ZXJzZXRzIHRvIGdldCBhIHNldCB1bmlvbiBvZiB0aGUgY29udGFpbmVkCitmaWx0ZXJzLjwvcD4KKworPHA+SW4gYWRkaXRpb24sIEZpbHRlclNldHMgY2FuIHNwZWNpZnkKKzxjb2RlPmJlZ2ludG9rZW48L2NvZGU+IGFuZC9vciAKKzxjb2RlPmVuZHRva2VuPC9jb2RlPiBhdHRyaWJ1dGVzIHRvIGRlZmluZSB3aGF0IHRvIG1hdGNoLjwvcD4KKzxwPkZpbHRlcnNldHMgYXJlIHVzZWQgZm9yIGRvaW5nIAorcmVwbGFjZW1lbnRzIGluIHRhc2tzIHN1Y2ggYXMgPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiwgZXRjLjwvcD4KKworPHA+Cis8c3Ryb25nPk5vdGU6IDwvc3Ryb25nPldoZW4gYSBmaWx0ZXJzZXQgaXMgdXNlZCBpbiBhbiBvcGVyYXRpb24sIHRoZSBmaWxlcyBhcmUgCitwcm9jZXNzZWQgaW4gdGV4dCBtb2RlIGFuZCB0aGUgZmlsdGVycyBhcHBsaWVkIGxpbmUgYnkgbGluZS4gVGhpcyBtZWFucyB0aGF0Cit0aGUgY29weSBvcGVyYXRpb25zIHdpbGwgdHlwaWNhbGx5IGNvcnJ1cHQgYmluYXJ5IGZpbGVzLiBXaGVuIGFwcGx5aW5nIGZpbHRlcnMKK3lvdSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIHNldCBvZiBmaWxlcyBiZWluZyBmaWx0ZXJlZCBhcmUgYWxsIHRleHQgZmlsZXMuCis8L3A+CisKKzxoMj5GaWx0ZXJzZXQ8L2gyPgorCis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5EZWZhdWx0PC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmJlZ2ludG9rZW48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPlRoZSBzdHJpbmcgbWFya2luZyB0aGUgYmVnaW5uaW5nIG9mIGEgdG9rZW4gKGVnLiwKKyAgICAgIDxjb2RlPiYjNjQ7REFURSYjNjQ7PC9jb2RlPikuPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD5APC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD5lbmR0b2tlbjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+VGhlIHN0cmluZyBtYXJraW5nIHRoZSBlbmQgb2YgYSB0b2tlbiAoZWcuLAorICAgICAgPGNvZGU+JiM2NDtEQVRFJiM2NDs8L2NvZGU+KS48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPkA8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPmZpbHRlcnNmaWxlPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD5TcGVjaWZ5IGEgc2luZ2xlIGZpbHRlcnNmaWxlLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGk+bm9uZTwvaT48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPnJlY3Vyc2U8L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wPkluZGljYXRlcyB3aGV0aGVyIHRoZSByZXBsYWNlbWVudCB0ZXh0IG9mIHRva2VucworICAgICAgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBtb3JlIHRva2Vucy4gPGI+U2luY2UgQW50IDEuNi4zPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGk+dHJ1ZTwvaT48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPm9ubWlzc2luZ2ZpbHRlcnNmaWxlPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD5JbmRpY2F0ZSBiZWhhdmlvciB3aGVuIGEgbm9uZXhpc3RlbnQgPGk+ZmlsdGVyc2ZpbGU8L2k+CisgICAgICBpcyBzcGVjaWZpZWQuICBPbmUgb2YgImZhaWwiLCAid2FybiIsICJpZ25vcmUiLiA8Yj5TaW5jZSBBbnQgMS43PC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+ImZhaWwiPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDI+RmlsdGVyPC9oMj4KKzx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdkFsaWduPXRvcD50b2tlbjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+VGhlIHRva2VuIHRvIHJlcGxhY2UgKGVnLiwgPGNvZGU+JiM2NDtEQVRFJiM2NDs8L2NvZGU+KTwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2QWxpZ249dG9wPnZhbHVlPC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcD5UaGUgdmFsdWUgdG8gcmVwbGFjZSBpdCB3aXRoCisgICAgIChlZy4sIDxjb2RlPlRodXJzZGF5LCBBcHJpbCAyNiwgMjAwMTwvY29kZT4pLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMj5GaWx0ZXJzZmlsZTwvaDI+Cis8dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZBbGlnbj10b3A+ZmlsZTwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3A+QSBwcm9wZXJ0aWVzIGZpbGUgb2YgCisgICAgICBuYW1lLXZhbHVlIHBhaXJzIGZyb20gd2hpY2ggdG8gbG9hZCB0aGUgdG9rZW5zLjwvdGQ+CisgICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5FeGFtcGxlczwvaDQ+CisKKzxwPllvdSBhcmUgY29weWluZyB0aGUgPGNvZGU+dmVyc2lvbi50eHQ8L2NvZGU+IGZpbGUgdG8gdGhlIDxjb2RlPmRpc3Q8L2NvZGU+CitkaXJlY3RvcnkgZnJvbSB0aGUgPGNvZGU+YnVpbGQ8L2NvZGU+IGRpcmVjdG9yeSAKK2J1dCB3aXNoIHRvIHJlcGxhY2UgdGhlIHRva2VuIDxjb2RlPiYjNjQ7REFURSYjNjQ7PC9jb2RlPiB3aXRoIHRvZGF5J3MgZGF0ZS48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2NvcHkgZmlsZT0mcXVvdDske2J1aWxkLmRpcn0vdmVyc2lvbi50eHQmcXVvdDsgdG9GaWxlPSZxdW90OyR7ZGlzdC5kaXJ9L3ZlcnNpb24udHh0JnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyc2V0Jmd0OworICAgICZsdDtmaWx0ZXIgdG9rZW49JnF1b3Q7REFURSZxdW90OyB2YWx1ZT0mcXVvdDske1RPREFZfSZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsdGVyc2V0Jmd0OworJmx0Oy9jb3B5Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5Zb3UgYXJlIGNvcHlpbmcgdGhlIDxjb2RlPnZlcnNpb24udHh0PC9jb2RlPiBmaWxlIHRvIHRoZSA8Y29kZT5kaXN0PC9jb2RlPgorZGlyZWN0b3J5IGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeSAKK2J1dCB3aXNoIHRvIHJlcGxhY2UgdGhlIHRva2VuIDxjb2RlPiVEQVRFKjwvY29kZT4gd2l0aCB0b2RheSdzIGRhdGUuPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtjb3B5IGZpbGU9JnF1b3Q7JHtidWlsZC5kaXJ9L3ZlcnNpb24udHh0JnF1b3Q7IHRvRmlsZT0mcXVvdDske2Rpc3QuZGlyfS92ZXJzaW9uLnR4dCZxdW90OyZndDsKKyAgJmx0O2ZpbHRlcnNldCBiZWdpbnRva2VuPSZxdW90OyUmcXVvdDsgZW5kdG9rZW49JnF1b3Q7KiZxdW90OyZndDsKKyAgICAmbHQ7ZmlsdGVyIHRva2VuPSZxdW90O0RBVEUmcXVvdDsgdmFsdWU9JnF1b3Q7JHtUT0RBWX0mcXVvdDsvJmd0OworICAmbHQ7L2ZpbHRlcnNldCZndDsKKyZsdDsvY29weSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+Q29weSBhbGwgdGhlIGRvY3MgYnV0IGNoYW5nZSBhbGwgZGF0ZXMgYW5kIGFwcHJvcHJpYXRlIG5vdGljZXMgYXMgc3RvcmVkIGluIGEgZmlsZS48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2NvcHkgdG9EaXI9JnF1b3Q7JHtkaXN0LmRpcn0vZG9jcyZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7YnVpbGQuZGlyfS9kb2NzJnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5odG1sJnF1b3Q7Jmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDtmaWx0ZXJzZXQgYmVnaW50b2tlbj0mcXVvdDslJnF1b3Q7IGVuZHRva2VuPSZxdW90OyomcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbHRlcnNmaWxlIGZpbGU9JnF1b3Q7JHt1c2VyLmRpcn0vZGlzdC5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKyAgJmx0Oy9maWx0ZXJzZXQmZ3Q7CismbHQ7L2NvcHkmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPkRlZmluZSBhIEZpbHRlclNldCBhbmQgcmVmZXJlbmNlIGl0IGxhdGVyLjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsdGVyc2V0IGlkPSZxdW90O215RmlsdGVyU2V0JnF1b3Q7IGJlZ2ludG9rZW49JnF1b3Q7JSZxdW90OyBlbmR0b2tlbj0mcXVvdDsqJnF1b3Q7Jmd0OworICAmbHQ7ZmlsdGVyIHRva2VuPSZxdW90O0RBVEUmcXVvdDsgdmFsdWU9JnF1b3Q7JHtUT0RBWX0mcXVvdDsvJmd0OworJmx0Oy9maWx0ZXJzZXQmZ3Q7CisKKyZsdDtjb3B5IGZpbGU9JnF1b3Q7JHtidWlsZC5kaXJ9L3ZlcnNpb24udHh0JnF1b3Q7IHRvRmlsZT0mcXVvdDske2Rpc3QuZGlyfS92ZXJzaW9uLnR4dCZxdW90OyZndDsKKyAgJmx0O2ZpbHRlcnNldCByZWZpZD0mcXVvdDtteUZpbHRlclNldCZxdW90Oy8mZ3Q7CismbHQ7L2NvcHkmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL21hcHBlci5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL21hcHBlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNGMxZWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvbWFwcGVyLmh0bWwKQEAgLTAsMCArMSw4ODggQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+TWFwcGVyIFR5cGU8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9Im1hcHBlciI+TWFwcGluZyBGaWxlIE5hbWVzPC9hPjwvaDI+Cis8cD5Tb21lIHRhc2tzIHRha2Ugc291cmNlIGZpbGVzIGFuZCBjcmVhdGUgdGFyZ2V0IGZpbGVzLiBEZXBlbmRpbmcgb24KK3RoZSB0YXNrLCBpdCBtYXkgYmUgcXVpdGUgb2J2aW91cyB3aGljaCBuYW1lIGEgdGFyZ2V0IGZpbGUgd2lsbCBoYXZlCisodXNpbmcgPGEgaHJlZj0iLi4vQ29yZVRhc2tzL2phdmFjLmh0bWwiPmphdmFjPC9hPiwgeW91IGtub3cgdGhlcmUgd2lsbCBiZQorPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBmb3IgeW91ciA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMpIC0gaW4KK290aGVyIGNhc2VzIHlvdSBtYXkgd2FudCB0byBzcGVjaWZ5IHRoZSB0YXJnZXQgZmlsZXMsIGVpdGhlciB0byBoZWxwCitBbnQgb3IgdG8gZ2V0IGFuIGV4dHJhIGJpdCBvZiBmdW5jdGlvbmFsaXR5LjwvcD4KKzxwPldoaWxlIHNvdXJjZSBmaWxlcyBhcmUgdXN1YWxseSBzcGVjaWZpZWQgYXMgPGEKK2hyZWY9ImZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT5zLCB5b3UgZG9uJ3Qgc3BlY2lmeSB0YXJnZXQgZmlsZXMgZGlyZWN0bHkgLQoraW5zdGVhZCwgeW91IHRlbGwgQW50IGhvdyB0byBmaW5kIHRoZSB0YXJnZXQgZmlsZShzKSBmb3Igb25lIHNvdXJjZSBmaWxlLiBBbgoraW5zdGFuY2Ugb2YgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjwvY29kZT4gaXMKK3Jlc3BvbnNpYmxlIGZvciB0aGlzLiBJdCBjb25zdHJ1Y3RzIHRhcmdldCBmaWxlIG5hbWVzIGJhc2VkIG9uIHJ1bGVzCit0aGF0IGNhbiBiZSBwYXJhbWV0ZXJpemVkIHdpdGggPGNvZGU+ZnJvbTwvY29kZT4gYW5kIDxjb2RlPnRvPC9jb2RlPgorYXR0cmlidXRlcyAtIHRoZSBleGFjdCBtZWFuaW5nIG9mIHdoaWNoIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC48L3A+Cis8cD5UaGVzZSBpbnN0YW5jZXMgYXJlIGRlZmluZWQgaW4gPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnRzCit3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50eXBlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNwZWNpZmllcyBvbmUgb2YgdGhlIGJ1aWx0LWluIGltcGxlbWVudGF0aW9ucy48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc25hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3BlY2lmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBieSBjbGFzcyBuYW1lLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAKKyAgICAgIDxjb2RlPmNsYXNzbmFtZTwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyA8YQorICAgICAgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mcm9tPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8Y29kZT5mcm9tPC9jb2RlPiBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbgorICAgICAgaW1wbGVtZW50YXRpb24uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPkRlcGVuZHMgb24gaW1wbGVtZW50YXRpb24uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIDxjb2RlPnRvPC9jb2RlPiBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbgorICAgICAgaW1wbGVtZW50YXRpb24uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPkRlcGVuZHMgb24gaW1wbGVtZW50YXRpb24uPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD5Ob3RlIHRoYXQgQW50IHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgY29udmVydCAvIG9yIFwgY2hhcmFjdGVycyBpbgordGhlIDxjb2RlPnRvPC9jb2RlPiBhbmQgPGNvZGU+ZnJvbTwvY29kZT4gYXR0cmlidXRlcyB0byB0aGUgY29ycmVjdAorZGlyZWN0b3J5IHNlcGFyYXRvciBvZiB5b3VyIGN1cnJlbnQgcGxhdGZvcm0uICBJZiB5b3UgbmVlZCB0byBzcGVjaWZ5Cit0aGlzIHNlcGFyYXRvciwgdXNlIDxjb2RlPiR7ZmlsZS5zZXBhcmF0b3J9PC9jb2RlPiBpbnN0ZWFkLgorICBGb3IgdGhlIHJlZ2V4cG1hcHBlciwgPGNvZGU+JHtmaWxlLnNlcGFyYXRvcn08L2NvZGU+IHdpbGwgbm90IHdvcmssCithcyBvbiB3aW5kb3dzIGl0IGlzIHRoZSAnXCcgY2hhcmFjdGVyLCBhbmQgdGhpcyBpcyBhbiBlc2NhcGUgY2hhcmFjdGVyCitmb3IgcmVndWxhciBleHByZXNzaW9ucywgb25lIHNob3VsZCB1c2UgdGhlIDxjb2RlPmhhbmRsZWRpcnNlcDwvY29kZT4gYXR0cmlidXRlCitpbnN0ZWFkLgorPC9wPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8cD5UaGUgY2xhc3NwYXRoIGNhbiBiZSBzcGVjaWZpZWQgdmlhIGEgbmVzdGVkCis8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4sIGFzIHdlbGwgLSB0aGF0IGlzLAorYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGg8L2E+LWxpa2Ugc3RydWN0dXJlLjwvcD4KKzxwPjxiPlNpbmNlIEFudCAxLjYuMiw8L2I+IG5lc3RlZCBGaWxlIE1hcHBlcnMgY2FuCitiZSBzdXBwbGllZCB2aWEgZWl0aGVyIDxDT0RFPiZsdDttYXBwZXImZ3Q7PC9DT0RFPiBlbGVtZW50cyBvcgorPGEgaHJlZj0iLi4vQ29yZVRhc2tzL3R5cGVkZWYuaHRtbCI+PGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7PC9jb2RlPjwvYT4nZAoraW1wbGVtZW50YXRpb25zIG9mIDxDT0RFPm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI8L0NPREU+LgorSWYgbmVzdGVkIEZpbGUgTWFwcGVycyBhcmUgc3BlY2lmaWVkIGJ5IGVpdGhlciBtZWFucywgdGhlIG1hcHBlciB3aWxsIGJlCitpbXBsaWNpdGx5IGNvbmZpZ3VyZWQgYXMgYSA8YSBocmVmPSIjY29tcG9zaXRlLW1hcHBlciI+Y29tcG9zaXRlIG1hcHBlcjwvYT4uCis8L3A+Cis8aHI+Cis8aDM+VGhlIGJ1aWx0LWluIG1hcHBlciB0eXBlcyBhcmU6PC9oMz4KKzxwPkFsbCBidWlsdC1pbiBtYXBwZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZS48L3A+Cis8cD48Yj5BcyBvZiBBbnQgMS42LjIsPC9iPiBlYWNoIG9mIHRoZSBidWlsdC1pbiBtYXBwZXIgaW1wbGVtZW50YXRpb24KKyAgdHlwZXMgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZSB1c2luZyBhIHNwZWNpZmljIHRhZ25hbWUuIFRoaXMgbWFrZXMgaXQKKyAgcG9zc2libGUgZm9yIGZpbGVuYW1lIG1hcHBlcnMgdG8gc3VwcG9ydCBhdHRyaWJ1dGVzIGluIGFkZGl0aW9uIHRvCisgIHRoZSBnZW5lcmFsbHkgYXZhaWxhYmxlIDxpPnRvPC9pPiBhbmQgPGk+ZnJvbTwvaT4uPGJyPgorICBUaGUgPGNvZGU+Jmx0O21hcHBlciB0eXBlfGNsYXNzbmFtZT0mcXVvdDsuLi4mcXVvdDsmZ3Q7PC9jb2RlPiB1c2FnZQorICBmb3JtIHJlbWFpbnMgdmFsaWQgZm9yIHJlYXNvbnMgb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eS48L3A+CisKKyAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICAgICAgICAgSWRlbnRpdHkgTWFwcGVyICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKworPGg0PjxhIG5hbWU9ImlkZW50aXR5LW1hcHBlciI+aWRlbnRpdHk8L2E+PC9oND4KKzxwPlRoZSB0YXJnZXQgZmlsZSBuYW1lIGlzIGlkZW50aWNhbCB0byB0aGUgc291cmNlIGZpbGUgbmFtZS4gQm90aAorPGNvZGU+dG88L2NvZGU+IGFuZCA8Y29kZT5mcm9tPC9jb2RlPiB3aWxsIGJlIGlnbm9yZWQuPC9wPgorPGI+RXhhbXBsZXM6PC9iPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDttYXBwZXIgdHlwZT0mcXVvdDtpZGVudGl0eSZxdW90Oy8mZ3Q7CismbHQ7aWRlbnRpdHltYXBwZXIvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZTwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9CLmphdmE8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Q2xhc3Nlcy9kaXIvZGlyMi9BLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCisgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAgICAgICAgIEZsYXR0ZW4gTWFwcGVyICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKzxoND48YSBuYW1lPSJmbGF0dGVuLW1hcHBlciI+ZmxhdHRlbjwvYT48L2g0PgorPHA+VGhlIHRhcmdldCBmaWxlIG5hbWUgaXMgaWRlbnRpY2FsIHRvIHRoZSBzb3VyY2UgZmlsZSBuYW1lLCB3aXRoIGFsbAorbGVhZGluZyBkaXJlY3RvcnkgaW5mb3JtYXRpb24gc3RyaXBwZWQgb2ZmLiBCb3RoIDxjb2RlPnRvPC9jb2RlPiBhbmQKKzxjb2RlPmZyb208L2NvZGU+IHdpbGwgYmUgaWdub3JlZC48L3A+Cis8Yj5FeGFtcGxlczo8L2I+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O21hcHBlciB0eXBlPSZxdW90O2ZsYXR0ZW4mcXVvdDsvJmd0OworJmx0O2ZsYXR0ZW5tYXBwZXIvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZTwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Qi5qYXZhPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5BLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKyAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICAgICAgICAgTWVyZ2UgTWFwcGVyICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKworPGg0PjxhIG5hbWU9Im1lcmdlLW1hcHBlciI+bWVyZ2U8L2E+PC9oND4KKzxwPlRoZSB0YXJnZXQgZmlsZSBuYW1lIHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lLCBhcyBkZWZpbmVkIGJ5Cis8Y29kZT50bzwvY29kZT4gLSA8Y29kZT5mcm9tPC9jb2RlPiB3aWxsIGJlIGlnbm9yZWQuPC9wPgorPGg1PkV4YW1wbGVzOjwvaDU+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O21hcHBlciB0eXBlPSZxdW90O21lcmdlJnF1b3Q7IHRvPSZxdW90O2FyY2hpdmUudGFyJnF1b3Q7LyZndDsKKyZsdDttZXJnZW1hcHBlciB0bz0mcXVvdDthcmNoaXZlLnRhciZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+YXJjaGl2ZS50YXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9CLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmFyY2hpdmUudGFyPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+YXJjaGl2ZS50YXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Q2xhc3Nlcy9kaXIvZGlyMi9BLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmFyY2hpdmUudGFyPC9jb2RlPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCisgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAgICAgICAgICBHbG9iIE1hcHBlciAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKzxoND48YSBuYW1lPSJnbG9iLW1hcHBlciI+Z2xvYjwvYT48L2g0PgorPHA+Qm90aCA8Y29kZT50bzwvY29kZT4gYW5kIDxjb2RlPmZyb208L2NvZGU+IGRlZmluZSBwYXR0ZXJucyB0aGF0IG1heQorY29udGFpbiBhdCBtb3N0IG9uZSA8Y29kZT4qPC9jb2RlPi4gRm9yIGVhY2ggc291cmNlIGZpbGUgdGhhdCBtYXRjaGVzCit0aGUgPGNvZGU+ZnJvbTwvY29kZT4gcGF0dGVybiwgYSB0YXJnZXQgZmlsZSBuYW1lIHdpbGwgYmUgY29uc3RydWN0ZWQKK2Zyb20gdGhlIDxjb2RlPnRvPC9jb2RlPiBwYXR0ZXJuIGJ5IHN1YnN0aXR1dGluZyB0aGUgPGNvZGU+KjwvY29kZT4gaW4KK3RoZSA8Y29kZT50bzwvY29kZT4gcGF0dGVybiB3aXRoIHRoZSB0ZXh0IHRoYXQgbWF0Y2hlcyB0aGUKKzxjb2RlPio8L2NvZGU+IGluIHRoZSA8Y29kZT5mcm9tPC9jb2RlPiBwYXR0ZXJuLiBTb3VyY2UgZmlsZSBuYW1lcwordGhhdCBkb24ndCBtYXRjaCB0aGUgPGNvZGU+ZnJvbTwvY29kZT4gcGF0dGVybiB3aWxsIGJlIGlnbm9yZWQuPC9wPgorPGI+RXhhbXBsZXM6PC9iPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDttYXBwZXIgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7IGZyb209JnF1b3Q7Ki5qYXZhJnF1b3Q7IHRvPSZxdW90OyouamF2YS5iYWsmcXVvdDsvJmd0OworJmx0O2dsb2JtYXBwZXIgZnJvbT0mcXVvdDsqLmphdmEmcXVvdDsgdG89JnF1b3Q7Ki5qYXZhLmJhayZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+QS5qYXZhLmJhazwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9CLmphdmEuYmFrPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVkPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O21hcHBlciB0eXBlPSZxdW90O2dsb2ImcXVvdDsgZnJvbT0mcXVvdDtDKmllcyZxdW90OyB0bz0mcXVvdDtRKnkmcXVvdDsvJmd0OworJmx0O2dsb2JtYXBwZXIgZnJvbT0mcXVvdDtDKmllcyZxdW90OyB0bz0mcXVvdDtRKnkmcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZTwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZWQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+US5wcm9wZXJ0eTwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+UWxhc3Nlcy9kaXIvZGlyMi9BLnByb3BlcnR5PC9jb2RlPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorICA8cD4KKyAgICBUaGUgZ2xvYm1hcHBlciBtYXBwZXIgY2FuIHRha2UgdGhlIGZvbGxvd2luZyBleHRyYSBhdHRyaWJ1dGVzLgorICA8L3A+CisgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICBJZiB0aGlzIGlzIGZhbHNlLCB0aGUgbWFwcGVyIHdpbGwgaWdub3JlIGNhc2Ugd2hlbiBtYXRjaGluZyB0aGUgZ2xvYiBwYXR0ZXJuLgorICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgdHJ1ZSBvciBmYWxzZSwgdGhlIGRlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS42LjMuPC9lbT4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+aGFuZGxlZGlyc2VwPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgIElmIHRoaXMgaXMgc3BlY2lmaWVkLCB0aGUgbWFwcGVyIHdpbGwgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5vcm1hbAorICAgICAgICBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3RlcnMgLSBcIGFuZCAvLgorICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgdHJ1ZSBvciBmYWxzZSwgdGhlIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHVzZWZ1bCBmb3IgY3Jvc3MtcGxhdGZvcm0gYnVpbGQgZmlsZXMuCisgICAgICAgIDxlbT5TaW5jZSBBbnQgMS42LjMuPC9lbT4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgICAgPHA+CisgICAgICBBbiBleGFtcGxlOgorICAgIDwvcD4KKyAgICA8cHJlPgorICAgICAgJmx0O3BhdGhjb252ZXJ0IHByb3BlcnR5PSJ4IiB0YXJnZXRvcz0idW5peCImZ3Q7CisgICAgICAgICZsdDtwYXRoIHBhdGg9IkFqLkphdmEiLyZndDsKKyAgICAgICAgJmx0O21hcHBlciZndDsKKyAgICAgICAgJmx0O2NoYWluZWRtYXBwZXImZ3Q7CisgICAgICAgICAgJmx0O2ZsYXR0ZW5tYXBwZXIvJmd0OworICAgICAgICAgICZsdDtnbG9ibWFwcGVyIGZyb209ImEqLmphdmEiIHRvPSIqLmphdmEuYmFrIiBjYXNlc2Vuc2l0aXZlPSJubyIvJmd0OworICAgICAgICAmbHQ7L2NoYWluZWRtYXBwZXImZ3Q7CisgICAgICAgICZsdDsvbWFwcGVyJmd0OworICAgICAgJmx0Oy9wYXRoY29udmVydCZndDsKKyAgICAgICZsdDtlY2hvJmd0O3ggaXMgJHt4fSZsdDsvZWNobyZndDsKKyAgICA8L3ByZT4KKyAgICA8cD4KKyAgICAgIHdpbGwgb3V0cHV0ICJ4IGlzIGouamF2YS5iYWsiLgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIGFuZAorICAgIDwvcD4KKyAgICA8cHJlPgorICAgICAgJmx0O3BhdGhjb252ZXJ0IHByb3BlcnR5PSJ4IiB0YXJnZXRvcz0idW5peCImZ3Q7CisgICAgICAgICZsdDtwYXRoIHBhdGg9ImQvZS9mL2ouamF2YSIvJmd0OworICAgICAgICAmbHQ7bWFwcGVyJmd0OworICAgICAgICAgICZsdDtnbG9ibWFwcGVyIGZyb209IiR7YmFzZWRpcn1cZC9lXCoiIHRvPSIqIiBpZ25vcmVkaXJjaGFyPSJ5ZXMiLyZndDsKKyAgICAgICAgJmx0Oy9tYXBwZXImZ3Q7CisgICAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OworICAgICAgJmx0O2VjaG8mZ3Q7eCBpcyAke3h9Jmx0Oy9lY2hvJmd0OworICAgIDwvcHJlPgorICAgIDxwPgorICAgICAgd2lsbCBvdXRwdXQgInggaXMgZi9qLmphdmEiLgorICAgIDwvcD4KKworCisgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAgICAgICAgIFJlZ0V4cCBNYXBwZXIgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKzxoND48YSBuYW1lPSJyZWdleHAtbWFwcGVyIj5yZWdleHA8L2E+PC9oND4KKzxwPkJvdGggPGNvZGU+dG88L2NvZGU+IGFuZCA8Y29kZT5mcm9tPC9jb2RlPiBkZWZpbmUgcmVndWxhcgorZXhwcmVzc2lvbnMuIElmIHRoZSBzb3VyY2UgZmlsZSBuYW1lIG1hdGNoZXMgdGhlIDxjb2RlPmZyb208L2NvZGU+CitwYXR0ZXJuLCB0aGUgdGFyZ2V0IGZpbGUgbmFtZSB3aWxsIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlCis8Y29kZT50bzwvY29kZT4gcGF0dGVybiwgdXNpbmcgPGNvZGU+XDA8L2NvZGU+IHRvIDxjb2RlPlw5PC9jb2RlPiBhcworYmFjay1yZWZlcmVuY2VzIGZvciB0aGUgZnVsbAorbWF0Y2ggKDxjb2RlPlwwPC9jb2RlPikgb3IgdGhlIG1hdGNoZXMgb2YgdGhlIHN1YmV4cHJlc3Npb25zIGluCitwYXJlbnRoZXNlcy4KK1NvdXJjZQorZmlsZXMgbm90IG1hdGNoaW5nIHRoZSA8Y29kZT5mcm9tPC9jb2RlPiBwYXR0ZXJuIHdpbGwgYmUgaWdub3JlZC48L3A+Cis8cD5Ob3RlIHRoYXQgeW91IG5lZWQgdG8gZXNjYXBlIGEgZG9sbGFyLXNpZ24gKDxjb2RlPiQ8L2NvZGU+KSB3aXRoCithbm90aGVyIGRvbGxhci1zaWduIGluIEFudC48L3A+Cis8cD5UaGUgcmVnZXhwIG1hcHBlciBuZWVkcyBhIHN1cHBvcnRpbmcgbGlicmFyeSBhbmQgYW4gaW1wbGVtZW50YXRpb24KK29mIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cE1hdGNoZXI8L2NvZGU+IHRoYXQKK2hpZGVzIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGxpYnJhcnkuIEFudCBjb21lcyB3aXRoIGltcGxlbWVudGF0aW9ucyBmb3IKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQvZG9jcy9hcGkvamF2YS91dGlsL3JlZ2V4L3BhY2thZ2Utc3VtbWFyeS5odG1sIiAgdGFyZ2V0PSJfdG9wIj50aGUgamF2YS51dGlsLnJlZ2V4IHBhY2thZ2Ugb2YgSkRLIDEuNCBvciBoaWdoZXI8L2E+LAorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvIiB0YXJnZXQ9Il90b3AiPmpha2FydGEtcmVnZXhwPC9hPiBhbmQgPGEKK2hyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvb3JvLyIgdGFyZ2V0PSJfdG9wIj5qYWthcnRhLU9STzwvYT4uIElmIHlvdSBjb21waWxlCitmcm9tIHNvdXJjZXMgYW5kIHBsYW4gdG8gdXNlIG9uZSBvZiB0aGVtLCBtYWtlIHN1cmUgdGhlIGxpYnJhcmllcyBhcmUKK2luIHlvdXIgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPi4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIDxhCitocmVmPSJodHRwOi8vd3d3LmNhY2FzLm9yZy9+d2VzL2phdmEvIiB0YXJnZXQ9Il90b3AiPmdudS5yZWdleHA8L2E+IG9yIDxhCitocmVmPSJodHRwOi8vd3d3LmNyb2NvZGlsZS5vcmcvfnN0cy9SZXgvIiB0YXJnZXQ9Il90b3AiPmdudS5yZXg8L2E+IHdpdGggQW50LCBzZWUgPGEKK2hyZWY9Imh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YW50LWRldiZtPTk3NTUwNzUzODEzNDgxJnc9MiIgdGFyZ2V0PSJfdG9wIj50aGlzPC9hPgorYXJ0aWNsZS48L3A+Cis8cD5UaGlzIG1lYW5zLCB5b3UgbmVlZCBvbmUgb2YgdGhlIHN1cHBvcnRlZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgbGlicmFyaWVzIDxzdHJvbmc+YW5kPC9zdHJvbmc+CisgIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPmFudC1bamFrYXJ0YS1vcm8sIGpha2FydGEtcmVnZXhwLCBhcGFjaGUtb3JvLCBhcGFjaGUtcmVnZXhwfS5qYXI8L2NvZGU+Citmcm9tIHRoZSBBbnQgcmVsZWFzZSB5b3UgYXJlIHVzaW5nLgorTWFrZSBzdXJlLCBib3RoIHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIHNhbWUKK2NsYXNzcGF0aCwgdGhhdCBpcyBlaXRoZXIgcHV0IHRoZW0gaW50byB5b3VyIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4sCis8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+IGRpcmVjdG9yeSBvciBhIG5lc3RlZAorPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQgb2YgdGhlIG1hcHBlciAtIHlvdSBjYW5ub3QgaGF2ZQorPGNvZGU+YW50LVtqYWthcnRhLW9ybywgamFrYXJ0YS1yZWdleHAsIGFwYWNoZS1vcm8sIGFwYWNoZS1yZWdleHBdLmphcjwvY29kZT4gaW4gPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPgorIGFuZCB0aGUgbGlicmFyeQoraW4gYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+LjwvcD4KKzxwPkFudCB3aWxsIGNob29zZSB0aGUgcmVndWxhci1leHByZXNzaW9uIGxpYnJhcnkgYmFzZWQgb24gdGhlCitmb2xsb3dpbmcgYWxnb3JpdGhtOjwvcD4KKzx1bD4KKzxsaT5JZiB0aGUgc3lzdGVtIHByb3BlcnR5Cis8Y29kZT5hbnQucmVnZXhwLm1hdGNoZXJpbXBsPC9jb2RlPiBoYXMgYmVlbiBzZXQsIGl0IGlzIHRha2VuIGFzIHRoZQorbmFtZSBvZiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nCis8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyPC9jb2RlPiB0aGF0CitzaG91bGQgYmUgdXNlZC48L2xpPgorPGxpPklmIGl0IGhhcyBub3QgYmVlbiBzZXQsIGZpcnN0IHRyeSB0aGUgSkRLIDEuNCBjbGFzc2VzLCB0aGVuCitqYWthcnRhLU9STyBhbmQgZmluYWxseSB0cnkgamFrYXJ0YS1yZWdleHAuPC9saT4KKzwvdWw+CisKKzxiPkV4YW1wbGVzOjwvYj4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7cmVnZXhwJnF1b3Q7IGZyb209JnF1b3Q7XiguKilcLmphdmEkJCZxdW90OyB0bz0mcXVvdDtcMS5qYXZhLmJhayZxdW90Oy8mZ3Q7CismbHQ7cmVnZXhwbWFwcGVyIGZyb209JnF1b3Q7XiguKilcLmphdmEkJCZxdW90OyB0bz0mcXVvdDtcMS5qYXZhLmJhayZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+QS5qYXZhLmJhazwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9CLmphdmEuYmFrPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVkPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O21hcHBlciB0eXBlPSZxdW90O3JlZ2V4cCZxdW90OyBmcm9tPSZxdW90O14oLiopLyhbXi9dKykvKFteL10qKSQkJnF1b3Q7IHRvPSZxdW90O1wxL1wyL1wyLVwzJnF1b3Q7LyZndDsKKyZsdDtyZWdleHBtYXBwZXIgZnJvbT0mcXVvdDteKC4qKS8oW14vXSspLyhbXi9dKikkJCZxdW90OyB0bz0mcXVvdDtcMS9cMi9cMi1cMyZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28vYmFyL2Jhci1CLmphdmE8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Q2xhc3Nlcy9kaXIvZGlyMi9BLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvZGlyMi1BLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O21hcHBlciB0eXBlPSJyZWdleHAiIGZyb209Il4oLiopXC4oLiopJCQiIHRvPSJcMi5cMSIvJmd0OworJmx0O3JlZ2V4cG1hcHBlciBmcm9tPSJeKC4qKVwuKC4qKSQkJiIgdG89IlwyLlwxIi8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+amF2YS5BPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5qYXZhLmZvby9iYXIvQjwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPnByb3BlcnRpZXMuQzwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+cHJvcGVydGllcy5DbGFzc2VzL2Rpci9kaXIyL0E8L2NvZGU+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O21hcHBlciB0eXBlPSJyZWdleHAiIGZyb209Il4oLio/KShcJCRbXi9cXFwuXSopP1wuY2xhc3MkJCIgdG89IlwxLmphdmEiLyZndDsKKyZsdDtyZWdleHBtYXBwZXIgZnJvbT0iXiguKj8pKFwkJFteL1xcXC5dKik/XC5jbGFzcyQkIiB0bz0iXDEuamF2YSIvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZTwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DbGFzc0xvYWRlci5jbGFzczwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Q2xhc3NMb2FkZXIuamF2YTwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5qYXZhL2xhbmcvQ2xhc3NMb2FkZXIuY2xhc3M8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmphdmEvbGFuZy9DbGFzc0xvYWRlci5qYXZhPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmphdmFcbGFuZ1xDbGFzc0xvYWRlciQxLmNsYXNzPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5qYXZhXGxhbmdcQ2xhc3NMb2FkZXIuamF2YTwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5qYXZhL2xhbmcvQ2xhc3NMb2FkZXIkZm9vJDEuY2xhc3M8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmphdmEvbGFuZy9DbGFzc0xvYWRlci5qYXZhPC9jb2RlPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorICA8cD4KKyAgICBUaGUgcmVnZXhwbWFwcGVyIG1hcHBlciBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIGV4dHJhIGF0dHJpYnV0ZXMuCisgIDwvcD4KKyAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5jYXNlc2Vuc2l0aXZlPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgIElmIHRoaXMgaXMgZmFsc2UsIHRoZSBtYXBwZXIgd2lsbCBpZ25vcmUgY2FzZSB3aGVuIG1hdGNoaW5nIHRoZSBwYXR0ZXJuLgorICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgdHJ1ZSBvciBmYWxzZSwgdGhlIGRlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS42LjMuPC9lbT4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+aGFuZGxlZGlyc2VwPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgIElmIHRoaXMgaXMgc3BlY2lmaWVkLCB0aGUgbWFwcGVyIHdpbGwgdHJlYXQgYSBcIGNoYXJhY3RlciBpbiBhIGZpbGVuYW1lCisgICAgICAgIGFzIGEgLyBmb3IgdGhlIHB1cnBvc2VzIG9mIG1hdGNoaW5nLgorICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgdHJ1ZSBvciBmYWxzZSwgdGhlIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHVzZWZ1bCBmb3IgY3Jvc3MtcGxhdGZvcm0gYnVpbGQgZmlsZXMuCisgICAgICAgIDxlbT5TaW5jZSBBbnQgMS42LjMuPC9lbT4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgICAgPHA+CisgICAgICBBbiBleGFtcGxlOgorICAgIDwvcD4KKyAgICA8cHJlPgorICAgICAgJmx0O3BhdGhjb252ZXJ0IHByb3BlcnR5PSJ4IiB0YXJnZXRvcz0idW5peCImZ3Q7CisgICAgICAgICZsdDtwYXRoIHBhdGg9IkFqLkphdmEiLyZndDsKKyAgICAgICAgJmx0O2NoYWluZWRtYXBwZXImZ3Q7CisgICAgICAgICAgJmx0O2ZsYXR0ZW5tYXBwZXIvJmd0OworICAgICAgICAgICZsdDtyZWdleHBtYXBwZXIgZnJvbT0iYSguKilcLmphdmEiIHRvPSJcMS5qYXZhLmJhayIgY2FzZXNlbnNpdGl2ZT0ibm8iLyZndDsKKyAgICAgICAgJmx0Oy9jaGFpbmVkbWFwcGVyJmd0OworICAgICAgJmx0Oy9wYXRoY29udmVydCZndDsKKyAgICAgICZsdDtlY2hvJmd0O3ggaXMgJHt4fSZsdDsvZWNobyZndDsKKyAgICA8L3ByZT4KKyAgICA8cD4KKyAgICAgIHdpbGwgb3V0cHV0ICJ4IGlzIGouamF2YS5iYWsiLgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIGFuZAorICAgIDwvcD4KKyAgICA8cHJlPgorICAgICZsdDtwYXRoY29udmVydCBwcm9wZXJ0eT0iaGQucHJvcCIgdGFyZ2V0b3M9IndpbmRvd3MiJmd0OworICAgICAgJmx0O3BhdGggcGF0aD0iZFxlL2Zcai5qYXZhIi8mZ3Q7CisgICAgICAmbHQ7Y2hhaW5lZG1hcHBlciZndDsKKyAgICAgICAgJmx0O3JlZ2V4cG1hcHBlciBmcm9tPSIke2Jhc2VkaXJ9L2QvZS8oLiopIiB0bz0iXDEiIGhhbmRsZWRpcnNlcD0ieWVzIi8mZ3Q7CisgICAgICAmbHQ7L2NoYWluZWRtYXBwZXImZ3Q7CisgICAgJmx0Oy9wYXRoY29udmVydCZndDsKKyAgICA8L3ByZT4KKyAgICA8cD4KKyAgICAgIHdpbGwgc2V0IDxjb2RlPmhkLnByb3A8L2NvZGU+IHRvICJmXGouamF2YSIuCisgICAgPC9wPgorCisgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAgICAgICAgIFBhY2thZ2UgTWFwcGVyICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKzxoND48YSBuYW1lPSJwYWNrYWdlLW1hcHBlciI+cGFja2FnZTwvYT48L2g0PgorPHA+U2hhcmluZyB0aGUgc2FtZSBzeW50YXggYXMgdGhlIDxhIGhyZWY9IiNnbG9iLW1hcHBlciI+Z2xvYiBtYXBwZXI8L2E+LAordGhlIHBhY2thZ2UgbWFwcGVyIHJlcGxhY2VzCitkaXJlY3Rvcnkgc2VwYXJhdG9ycyBmb3VuZCBpbiB0aGUgbWF0Y2hlZCBzb3VyY2UgcGF0dGVybiB3aXRoIGRvdHMgaW4gdGhlIHRhcmdldAorcGF0dGVybiBwbGFjZWhvbGRlci4gVGhpcyBtYXBwZXIgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBpbiBjb21iaW5hdGlvbgord2l0aCA8Y29kZT4mbHQ7dXB0b2RhdGUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gb3V0cHV0LjwvcD4KKzxiPkV4YW1wbGU6PC9iPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDttYXBwZXIgdHlwZT0icGFja2FnZSIgZnJvbT0iKlRlc3QuamF2YSIgdG89IlRFU1QtKlRlc3QueG1sIi8mZ3Q7CismbHQ7cGFja2FnZW1hcHBlciBmcm9tPSIqVGVzdC5qYXZhIiB0bz0iVEVTVC0qVGVzdC54bWwiLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlNvdXJjZSBmaWxlIG5hbWU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlRhcmdldCBmaWxlIG5hbWU8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QYWNrYWdlTWFwcGVyVGVzdC5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5URVNULW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUGFja2FnZU1hcHBlclRlc3QueG1sPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSGVscGVyLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZWQ8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgICAgICAgVW5wYWNrYWdlIE1hcHBlciAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCis8aDQ+PGEgbmFtZT0idW5wYWNrYWdlLW1hcHBlciI+dW5wYWNrYWdlIChzaW5jZSBBbnQgMS42LjApPC9hPjwvaDQ+CisgIDxwPlRoaXMgbWFwcGVyIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSA8YSBocmVmPSIjcGFja2FnZS1tYXBwZXIiPnBhY2thZ2U8L2E+IG1hcHBlci4KKyAgICBJdCByZXBsYWNlcyB0aGUgZG90cyBpbiBhIHBhY2thZ2UgbmFtZSB3aXRoIGRpcmVjdG9yeSBzZXBhcmF0b3JzLiBUaGlzCisgICAgaXMgdXNlZnVsIGZvciBtYXRjaGluZyBYTUwgZm9ybWF0dGVyIHJlc3VsdHMgYWdhaW5zdCB0aGVpciBKVW5pdCB0ZXN0CisgICAgdGVzdCBjYXNlcy4gVGhlIG1hcHBlciBzaGFyZXMgdGhlIHNhbXBsZSBzeW50YXgKKyAgICBhcyB0aGUgPGEgaHJlZj0iI2dsb2ItbWFwcGVyIj5nbG9iIG1hcHBlcjwvYT4uCisgIDwvcD4KKzxiPkV4YW1wbGU6PC9iPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDttYXBwZXIgdHlwZT0idW5wYWNrYWdlIiBmcm9tPSJURVNULSpUZXN0LnhtbCIgdG89IiR7dGVzdC5zcmMuZGlyfS8qVGVzdC5qYXZhIiZndDsKKyZsdDt1bnBhY2thZ2VtYXBwZXIgZnJvbT0iVEVTVC0qVGVzdC54bWwiIHRvPSIke3Rlc3Quc3JjLmRpcn0vKlRlc3QuamF2YSImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPlRFU1Qtb3JnLmFjbWUuQWNtZVRlc3QueG1sPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT4ke3Rlc3Quc3JjLmRpcn0vb3JnL2FjbWUvQWNtZVRlc3QuamF2YTwvY29kZT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgICAgICAgQ29tcG9zaXRlIE1hcHBlciAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCis8aDQ+PGEgbmFtZT0iY29tcG9zaXRlLW1hcHBlciI+Y29tcG9zaXRlIChzaW5jZSBBbnQgMS42LjIpPC9hPjwvaDQ+CisgIDxwPlRoaXMgbWFwcGVyIGltcGxlbWVudGF0aW9uIGNhbiBjb250YWluIG11bHRpcGxlIG5lc3RlZCBtYXBwZXJzLgorICAgIEZpbGUgbWFwcGluZyBpcyBwZXJmb3JtZWQgYnkgcGFzc2luZyB0aGUgc291cmNlIGZpbGVuYW1lIHRvIGVhY2ggbmVzdGVkCisgICAgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGluIHR1cm4sIHJldHVybmluZyBhbGwgcmVzdWx0cy4KKyAgICBUaGUgPGk+dG88L2k+IGFuZCA8aT5mcm9tPC9pPiBhdHRyaWJ1dGVzIGFyZSBpZ25vcmVkLjwvcD4KKzxiPkV4YW1wbGVzOjwvYj4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y29tcG9zaXRlbWFwcGVyJmd0OworICAmbHQ7aWRlbnRpdHltYXBwZXIvJmd0OworICAmbHQ7cGFja2FnZW1hcHBlciBmcm9tPSIqLmphdmEiIHRvPSIqIi8mZ3Q7CismbHQ7L2NvbXBvc2l0ZW1hcHBlciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlNvdXJjZSBmaWxlIG5hbWU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlRhcmdldCBmaWxlIG5hbWVzPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPjxjb2RlPmZvby9iYXIvQS5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28vYmFyL0EuamF2YTwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28uYmFyLkE8L2NvZGU+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisgIDxwPlRoZSBjb21wb3NpdGUgbWFwcGVyIGhhcyBubyBjb3JyZXNwb25kaW5nCisgICAgPGNvZGU+Jmx0O21hcHBlciA8Yj50eXBlPC9iPiZndDs8L2NvZGU+IGF0dHJpYnV0ZS4KKyAgPC9wPgorCisgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAgICAgICAgQ2hhaW5lZCBNYXBwZXIgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKzxoND48YSBuYW1lPSJjaGFpbmVkLW1hcHBlciI+Y2hhaW5lZCAoc2luY2UgQW50IDEuNi4yKTwvYT48L2g0PgorICA8cD5UaGlzIG1hcHBlciBpbXBsZW1lbnRhdGlvbiBjYW4gY29udGFpbiBtdWx0aXBsZSBuZXN0ZWQgbWFwcGVycy4KKyAgICBGaWxlIG1hcHBpbmcgaXMgcGVyZm9ybWVkIGJ5IHBhc3NpbmcgdGhlIHNvdXJjZSBmaWxlbmFtZSB0byB0aGUgZmlyc3QKKyAgICBuZXN0ZWQgbWFwcGVyLCBpdHMgcmVzdWx0cyB0byB0aGUgc2Vjb25kLCBhbmQgc28gb24uICBUaGUgdGFyZ2V0IGZpbGVuYW1lcworICAgIGdlbmVyYXRlZCBieSB0aGUgbGFzdCBuZXN0ZWQgbWFwcGVyIGNvbXByaXNlIHRoZSB1bHRpbWF0ZSByZXN1bHRzIG9mIHRoZQorICAgIG1hcHBpbmcgb3BlcmF0aW9uLiAgVGhlIDxpPnRvPC9pPiBhbmQgPGk+ZnJvbTwvaT4gYXR0cmlidXRlcyBhcmUgaWdub3JlZC48L3A+Cis8Yj5FeGFtcGxlczo8L2I+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2NoYWluZWRtYXBwZXImZ3Q7CisgICZsdDtmbGF0dGVubWFwcGVyLyZndDsKKyAgJmx0O2dsb2JtYXBwZXIgZnJvbT0iKiIgdG89Im5ldy9wYXRoLyoiLyZndDsKKyAgJmx0O21hcHBlciZndDsKKyAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0iKjEiLyZndDsKKyAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0iKjIiLyZndDsKKyAgJmx0Oy9tYXBwZXImZ3Q7CismbHQ7L2NoYWluZWRtYXBwZXImZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lczwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj48Y29kZT5mb28vYmFyL0EuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+bmV3L3BhdGgvQS5qYXZhMTwvY29kZT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5uZXcvcGF0aC9BLmphdmEyPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPjxjb2RlPmJvby9mYXIvQi5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5uZXcvcGF0aC9CLmphdmExPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPm5ldy9wYXRoL0IuamF2YTI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisgIDxwPlRoZSBjaGFpbmVkIG1hcHBlciBoYXMgbm8gY29ycmVzcG9uZGluZworICAgIDxjb2RlPiZsdDttYXBwZXIgPGI+dHlwZTwvYj4mZ3Q7PC9jb2RlPiBhdHRyaWJ1dGUuCisgIDwvcD4KKworICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgICAgICAgICBGaWx0ZXIgTWFwcGVyICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCis8aDQ+PGEgbmFtZT0iZmlsdGVyLW1hcHBlciI+ZmlsdGVybWFwcGVyIChzaW5jZSBBbnQgMS42LjMpPC9hPjwvaDQ+CisgICAgPHA+CisgICAgICBUaGlzIG1hcHBlciBpbXBsZW1lbnRhdGlvbiBhcHBsaWVzIGEgPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCI+ZmlsdGVyY2hhaW48L2E+CisgICAgICB0byB0aGUgc291cmNlIGZpbGUgbmFtZS4KKyAgICA8L3A+Cis8Yj5FeGFtcGxlczo8L2I+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbHRlcm1hcHBlciZndDsKKyAgJmx0O3JlcGxhY2VzdHJpbmcgZnJvbT0iXCIgdG89Ii8iLyZndDsKKyZsdDsvZmlsdGVybWFwcGVyJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lczwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIj48Y29kZT5mb29cYmFyXEEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9BLmphdmE8L2NvZGU+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbHRlcm1hcHBlciZndDsKKyAgJmx0O3NjcmlwdGZpbHRlciBsYW5ndWFnZT0iYmVhbnNoZWxsIiZndDsKKyAgICBzZWxmLnNldFRva2VuKHNlbGYuZ2V0VG9rZW4oKS50b1VwcGVyQ2FzZSgpKTsKKyAgJmx0Oy9zY3JpcHRmaWx0ZXImZ3Q7CismbHQ7L2ZpbHRlcm1hcHBlciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZXM8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciI+PGNvZGU+Zm9vXGJhclxBLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkZPT1xCQVJcQS5KQVZBPC9jb2RlPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCisgIDxwPlRoZSBmaWx0ZXJtYXBwZXIgaGFzIG5vIGNvcnJlc3BvbmRpbmcKKyAgICA8Y29kZT4mbHQ7bWFwcGVyIDxiPnR5cGU8L2I+Jmd0OzwvY29kZT4gYXR0cmlidXRlLgorICA8L3A+CisKKyAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICAgICAgICAgU2NyaXB0IE1hcHBlciAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKworPGg0PjxhIG5hbWU9InNjcmlwdC1tYXBwZXIiPnNjcmlwdG1hcHBlciAoc2luY2UgQW50IDEuNyk8L2E+PC9oND4KKzxwPgorVGhpcyBtYXBwZXIgZXhlY3V0ZXMgYSBzY3JpcHQgd3JpdHRlbiBpbiA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2JzZiIgdGFyZ2V0PSJfdG9wIj5BcGFjaGUgQlNGPC9hPgorb3IKKyAgPGEgaHJlZj0iaHR0cHM6Ly9zY3JpcHRpbmcuZGV2LmphdmEubmV0Ij5KU1IgMjIzPC9hPgorc3VwcG9ydGVkIGxhbmd1YWdlLCBvbmNlIHBlciBmaWxlIHRvIG1hcC48L3A+CitUaGUgc2NyaXB0IGNhbiBiZSBkZWNsYXJlZCBpbmxpbmUgb3IgaW4gYSBzcGVjaWZpZWQgZmlsZS4KKzwvcD4KKzxwPgorU2VlIHRoZSA8YSBocmVmPSIuLi9PcHRpb25hbFRhc2tzL3NjcmlwdC5odG1sIj5TY3JpcHQ8L2E+IHRhc2sgZm9yCithbiBleHBsYW5hdGlvbiBvZiBzY3JpcHRzIGFuZCBkZXBlbmRlbmNpZXMuCis8L3A+CisKKyAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5sYW5ndWFnZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICBTY3JpcHRpbmcgbGFuZ3VhZ2UKKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmFnZXI8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgVGhlIHNjcmlwdCBlbmdpbmUgbWFuYWdlciB0byB1c2UuCisgICAgICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vT3B0aW9uYWxUYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCisgICAgICAgIGZvciB1c2luZyB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdCBpcyAiYXV0byI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgRmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQKKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+c2V0YmVhbnM8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRvIGhhdmUgYWxsIHByb3BlcnRpZXMsIHJlZmVyZW5jZXMgYW5kIHRhcmdldHMgYXMKKyAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgc2NyaXB0LjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzICJ0cnVlIi48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgVGhlIGNsYXNzcGF0aCB0byBwYXNzIGludG8gdGhlIHNjcmlwdC4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEKKyAgICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgIDxwPgorICAgIFRoaXMgZmlsZW5hbWUgbWFwcGVyIGNhbiB0YWtlIGEgbmVzdGVkICZsdDtjbGFzc3BhdGgmZ3Q7IGVsZW1lbnQuCisgICAgU2VlIHRoZSA8YSBocmVmPSIuLi9PcHRpb25hbFRhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2sKKyAgICBvbiBob3cgdG8gdXNlIHRoaXMgZWxlbWVudC4KKyAgPC9wPgorCis8cD4KKyAgPGI+RXhhbXBsZTo8L2I+Cis8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3NjcmlwdG1hcHBlciBsYW5ndWFnZT0iamF2YXNjcmlwdCImZ3Q7CisgIHNlbGYuYWRkTWFwcGVkTmFtZShzb3VyY2UudG9VcHBlckNhc2UoKSk7CisgIHNlbGYuYWRkTWFwcGVkTmFtZShzb3VyY2UudG9Mb3dlckNhc2UoKSk7CismbHQ7L3NjcmlwdG1hcHBlciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZXM8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+PGNvZGU+Zm9vXGJhclxBLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkZPT1xCQVJcQS5KQVZBPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvb1xiYXJcYS5qYXZhPC9jb2RlPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD4KK1RvIHVzZSB0aGlzIG1hcHBlciwgdGhlIHNjcmlwdHMgbmVlZCBhY2Nlc3MgdG8gdGhlIHNvdXJjZSBmaWxlLAorYW5kIHRoZSBhYmlsaXR5IHRvIHJldHVybiBtdWx0aXBsZSBtYXBwaW5ncy4gSGVyZSBhcmUgdGhlIHJlbGV2YW50IGJlYW5zIGFuZAordGhlaXIgbWV0aG9kcy4gVGhlIHNjcmlwdCBpcyBjYWxsZWQgb25jZSBmb3IgZXZlcnkgc291cmNlIGZpbGUsIHdpdGggdGhlCitsaXN0IG9mIG1hcHBlZCBuYW1lcyByZXNldCBhZnRlciBldmVyeSBpbnZvY2F0aW9uLgorCisgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5TY3JpcHQgYmVhbjwvYj48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5zb3VyY2U6IFN0cmluZzwvY29kZT48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgVGhlIGZpbGUvcGF0aCB0byBtYXAKKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPnNlbGY8L2NvZGU+PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgIHRoZSBzY3JpcHRtYXBwZXIgaXRzZWxmCisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5zZWxmLmFkZE1hcHBlZE5hbWUoU3RyaW5nIG5hbWUpPC9jb2RlPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICBBZGQgYSBuZXcgbWFwcGluZworICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+c2VsZi5jbGVhcigpPC9jb2RlPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICBSZXNldCB0aGUgbGlzdCBvZiBmaWxlcy4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgIDxwPlRoZSBzY3JpcHRtYXBwZXIgaGFzIG5vIGNvcnJlc3BvbmRpbmcKKyAgICA8Y29kZT4mbHQ7bWFwcGVyIDxiPnR5cGU8L2I+Jmd0OzwvY29kZT4gYXR0cmlidXRlLgorICA8L3A+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvbmFtZXNwYWNlLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvbmFtZXNwYWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4NDI0NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9uYW1lc3BhY2UuaHRtbApAQCAtMCwwICsxLDIyMCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0bWw+PGhlYWQ+PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5YbWxOYW1lc3BhY2VTdXBwb3J0PC90aXRsZT48L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMj48YSBuYW1lPSJuYW1lc3BhY2UiPlhNTCBOYW1lc3BhY2UgU3VwcG9ydDwvYT48L2gyPgorICAgIEFudCAxLjYgaW50cm9kdWNlcyBzdXBwb3J0IGZvciBYTUwgbmFtZXNwYWNlcy4gCisgICAgPGgzPkhpc3Rvcnk8L2gzPgorICAgIAorICAgIDxwPgorICAgICAgQWxsIHJlbGVhc2VzIG9mIEFudCBwcmlvciB0byBBbnQgMS42IGRvIG5vdCBzdXBwb3J0IFhNTCBuYW1lc3BhY2VzLgorICAgICAgTm8gc3VwcG9ydCBiYXNpY2FsbHkgaW1wbGllcyB0d28gdGhpbmdzIGhlcmU6CisgICAgPC9wPgorICAgIDx1bD4KKyAgICAgIDxsaT4gRWxlbWVudCBuYW1lcyBjb3JyZXNwb25kIHRvIHRoZSAicW5hbWUiIG9mIHRoZSB0YWdzLCB3aGljaCBpcworICAgICAgICB1c3VhbGx5IHRoZSBzYW1lIGFzIHRoZSBsb2NhbCBuYW1lLiBCdXQgaWYgdGhlIGJ1aWxkIGZpbGUgd3JpdGVyIHVzZXMKKyAgICAgICAgY29sb25zIGluIG5hbWVzIG9mIGRlZmluZWQgdGFza3MvdHlwZXMsIHRob3NlIGJlY29tZSBwYXJ0IG9mIHRoZQorICAgICAgICBlbGVtZW50IG5hbWUuIFR1cm5pbmcgb24gbmFtZXNwYWNlIHN1cHBvcnQgZ2l2ZXMgY29sb24tc2VwYXJhdGVkCisgICAgICAgIHByZWZpeGVzIGluIHRhZyBuYW1lcyBhIHNwZWNpYWwgbWVhbmluZywgYW5kIHRodXMgYnVpbGQgZmlsZXMgdXNpbmcKKyAgICAgICAgY29sb25zIGluIHVzZXItZGVmaW5lZCB0YXNrcyBhbmQgdHlwZXMgd2lsbCBicmVhay4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+IEF0dHJpYnV0ZXMgd2l0aCB0aGUgbmFtZXMgJ3htbG5zJyBhbmQgJ3htbG5zOjxjb2RlPiZsdDtwcmVmaXgmZ3Q7PC9jb2RlPicKKyAgICAgICAgYXJlIG5vdCB0cmVhdGVkIHNwZWNpYWxseSwgd2hpY2ggbWVhbnMgdGhhdCBjdXN0b20gdGFza3MgYW5kIHR5cGVzIGhhdmUKKyAgICAgICAgYWN0dWFsbHkgYmVlbiBhYmxlIHRvIHVzZSBzdWNoIGF0dHJpYnV0ZXMgYXMgcGFyYW1ldGVyIG5hbWVzLiBBZ2FpbiwKKyAgICAgICAgc3VjaCB0YXNrcy90eXBlcyBhcmUgZ29pbmcgdG8gYnJlYWsgd2hlbiBuYW1lc3BhY2Ugc3VwcG9ydCBpcyBlbmFibGVkCisgICAgICAgIG9uIHRoZSBwYXJzZXIuCisgICAgICA8L2xpPgorICAgIDwvdWw+CisgICAgPHA+VXNlIG9mIGNvbG9ucyBpbiBlbGVtZW50IG5hbWVzIGhhcyBiZWVuIGRpc2NvdXJhZ2VkIGluIHRoZSBwYXN0LAorICAgICAgYW5kIHVzaW5nIGFueSBhdHRyaWJ1dGUgc3RhcnRpbmcgd2l0aCAieG1sIiBpcyBhY3R1YWxseSBzdHJvbmdseQorICAgICAgZGlzY291cmFnZWQgYnkgdGhlIFhNTCBzcGVjIHRvIHJlc2VydmUgc3VjaCBuYW1lcyBmb3IgZnV0dXJlIHVzZS4KKyAgICA8L3A+CisgICAgPGgzPk1vdGl2YXRpb248L2gzPgorCisgICAgPHA+SW4gYnVpbGQgZmlsZXMgdXNpbmcgYSBsb3Qgb2YgY3VzdG9tIGFuZCB0aGlyZC1wYXJ0eSB0YXNrcywgaXQgaXMKKyAgICAgIGVhc3kgdG8gZ2V0IGludG8gbmFtZSBjb25mbGljdHMuIFdoZW4gaW5kaXZpZHVhbCB0eXBlcyBhcmUgZGVmaW5lZCwgdGhlCisgICAgICBidWlsZCBmaWxlIHdyaXRlciBjYW4gZG8gc29tZSBuYW1lc3BhY2luZyBtYW51YWxseSAoZm9yIGV4YW1wbGUsIHVzaW5nCisgICAgICAidG9tY2F0LWRlcGxveSIgaW5zdGVhZCBvZiBqdXN0ICJkZXBsb3kiKS4gQnV0IHdoZW4gZGVmaW5pbmcgd2hvbGUKKyAgICAgIGxpYnJhcmllcyBvZiB0eXBlcyB1c2luZyB0aGUgPGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7PC9jb2RlPiAncmVzb3VyY2UnIGF0dHJpYnV0ZSwgdGhlCisgICAgICBidWlsZCBmaWxlIHdyaXRlciBoYXMgbm8gY2hhbmNlIHRvIG92ZXJyaWRlIG9yIGV2ZW4gcHJlZml4IHRoZSBuYW1lcworICAgICAgc3VwcGxpZWQgYnkgdGhlIGxpYnJhcnkuIDwvcD4KKyAgICA8aDM+QXNzaWduaW5nIE5hbWVzcGFjZXM8L2gzPgorCisgICAgPHA+CisgICAgICBBZGRpbmcgYSAncHJlZml4JyBhdHRyaWJ1dGUgdG8gPGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7PC9jb2RlPiBtaWdodCBoYXZlIGJlZW4gZW5vdWdoLAorICAgICAgYnV0IFhNTCBhbHJlYWR5IGhhcyBhIHdlbGwta25vd24gbWV0aG9kIGZvciBuYW1lc3BhY2luZy4gVGh1cywgaW5zdGVhZAorICAgICAgb2YgYWRkaW5nIGEgJ3ByZWZpeCcgYXR0cmlidXRlLCB0aGUgPGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPgorICAgICAgdGFza3MgZ2V0IGEgJ3VyaScgYXR0cmlidXRlLCB3aGljaCBzdG9yZXMgdGhlIFVSSSBvZiB0aGUgWE1MIG5hbWVzcGFjZQorICAgICAgd2l0aCB3aGljaCB0aGUgdHlwZSBzaG91bGQgYmUgYXNzb2NpYXRlZDoKKyAgICA8L3A+PHByZT4gJmx0O3R5cGVkZWYgcmVzb3VyY2U9Im9yZy9leGFtcGxlL3Rhc2tzLnByb3BlcnRpZXMiIHVyaT0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIj5odHRwOi8vZXhhbXBsZS5vcmcvdGFza3M8L2E+Ii8mZ3Q7CisgJmx0O215OnRhc2sgeG1sbnM6bXk9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyI+aHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzPC9hPiImZ3Q7CisgICAgLi4uCisgJmx0Oy9teTp0YXNrJmd0OworPC9wcmU+CisgICAgPHA+QXMgdGhlIGFib3ZlIGV4YW1wbGUgZGVtb25zdHJhdGVzLCB0aGUgbmFtZXNwYWNlIFVSSSBuZWVkcyB0byBiZQorICAgICAgc3BlY2lmaWVkIGF0IGxlYXN0IHR3aWNlOiBvbmUgdGltZSBhcyB0aGUgdmFsdWUgb2YgdGhlICd1cmknIGF0dHJpYnV0ZSwKKyAgICAgIGFuZCBhbm90aGVyIHRpbWUgdG8gYWN0dWFsbHkgbWFwIHRoZSBuYW1lc3BhY2UgdG8gb2NjdXJyZW5jZXMgb2YKKyAgICAgIGVsZW1lbnRzIGZyb20gdGhhdCBuYW1lc3BhY2UsIGJ5IHVzaW5nIHRoZSAneG1sbnMnIGF0dHJpYnV0ZS4gVGhpcworICAgICAgbWFwcGluZyBjYW4gaGFwcGVuIGF0IGFueSBsZXZlbCBpbiB0aGUgYnVpbGQgZmlsZToKKyAgICA8L3A+PHByZT4gJmx0O3Byb2plY3QgbmFtZT0idGVzdCIgeG1sbnM6bXk9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyI+aHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzPC9hPiImZ3Q7IAorICAgJmx0O3R5cGVkZWYgcmVzb3VyY2U9Im9yZy9leGFtcGxlL3Rhc2tzLnByb3BlcnRpZXMiIHVyaT0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIj5odHRwOi8vZXhhbXBsZS5vcmcvdGFza3M8L2E+Ii8mZ3Q7CisgICAmbHQ7bXk6dGFzayZndDsKKyAgICAgLi4uCisgICAmbHQ7L215OnRhc2smZ3Q7CisgJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+CisgICAgPHA+CisgICAgICBVc2Ugb2YgYSBuYW1lc3BhY2UgcHJlZml4IGlzIG9mIGNvdXJzZSBvcHRpb25hbC4gVGhlcmVmb3JlCisgICAgICB0aGUgZXhhbXBsZSBjb3VsZCBhbHNvIGxvb2sgbGlrZSB0aGlzOgorICAgIDwvcD48cHJlPiAmbHQ7cHJvamVjdCBuYW1lPSJ0ZXN0IiZndDsgCisgICAmbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvdGFza3MucHJvcGVydGllcyIgdXJpPSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iLyZndDsKKyAgICZsdDt0YXNrIHhtbG5zPSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iJmd0OworICAgICAuLi4KKyAgICZsdDsvdGFzayZndDsKKyAmbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT4KKyAgICA8cD4KKyAgICAgIEhlcmUsIHRoZSBuYW1lc3BhY2UgaXMgc2V0IGFzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgdGhlIDxjb2RlPiZsdDt0YXNrJmd0OzwvY29kZT4KKyAgICAgIGVsZW1lbnQgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMuCisgICAgPC9wPgorICAgIDxoMz5EZWZhdWx0IG5hbWVzcGFjZTwvaDM+CisgICAgPHA+CisgICAgICBUaGUgZGVmYXVsdCBuYW1lc3BhY2UgdXNlZCBieSBBbnQgaXMgImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudCIuCisgICAgPC9wPgorICAgIDxwcmU+CismbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvdGFza3MucHJvcGVydGllcyIgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQiLyZndDsKKyZsdDt0YXNrJmd0OworICAgICAgLi4uLgorJmx0Oy90YXNrJmd0OworICAgIDwvcHJlPgorCisgICAgIAorCisgICAgPGgzPk5hbWVzcGFjZXMgYW5kIE5lc3RlZCBFbGVtZW50czwvaDM+CisKKyAgICA8cD4KKyAgICAgIEFsbW9zdCBhbHdheXMgaW4gQW50IDEuNiwgZWxlbWVudHMgbmVzdGVkIGluc2lkZSBhIG5hbWVzcGFjZWQKKyAgICAgIGVsZW1lbnQgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlaXIgcGFyZW50LiBTbyBpZiAndGFzaycgaW4gdGhlCisgICAgICBleGFtcGxlIGFib3ZlIGFsbG93ZWQgYSBuZXN0ZWQgJ2NvbmZpZycgZWxlbWVudCwgdGhlIGJ1aWxkIGZpbGUgc25pcHBldAorICAgICAgd291bGQgbG9vayBsaWtlIHRoaXM6CisgICAgPC9wPjxwcmU+ICZsdDt0eXBlZGVmIHJlc291cmNlPSJvcmcvZXhhbXBsZS90YXNrcy5wcm9wZXJ0aWVzIiB1cmk9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyI+aHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzPC9hPiIvJmd0OworICZsdDtteTp0YXNrIHhtbG5zOm15PSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iJmd0OworICAgJmx0O215OmNvbmZpZyBhPSJmb28iIGI9ImJhciIvJmd0OworICAgLi4uCisgJmx0Oy9teTp0YXNrJmd0OworPC9wcmU+CisgICAgPHA+SWYgdGhlIGVsZW1lbnQgYWxsb3dzIG9yIHJlcXVpcmVzIGEgbG90IG9mIG5lc3RlZCBlbGVtZW50cywgdGhlCisgICAgICBwcmVmaXggbmVlZHMgdG8gYmUgdXNlZCBmb3IgZXZlcnkgbmVzdGVkIGVsZW1lbnQuIE1ha2luZyB0aGUgbmFtZXNwYWNlCisgICAgICB0aGUgZGVmYXVsdCBjYW4gcmVkdWNlIHRoZSB2ZXJib3NpdHkgb2YgdGhlIHNjcmlwdDoKKyAgICA8L3A+PHByZT4gJmx0O3R5cGVkZWYgcmVzb3VyY2U9Im9yZy9leGFtcGxlL3Rhc2tzLnByb3BlcnRpZXMiIHVyaT0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIj5odHRwOi8vZXhhbXBsZS5vcmcvdGFza3M8L2E+Ii8mZ3Q7CisgICAgICAgICAgJmx0O3Rhc2sgeG1sbnM9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyI+aHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzPC9hPiImZ3Q7CisgICAgICAgICAgJmx0O2NvbmZpZyBhPSJmb28iIGI9ImJhciIvJmd0OworICAgLi4uCisgICAgICAgICAgJmx0Oy90YXNrJmd0OworICAgICAgICA8L3ByZT4KKyAgICA8cD4KKyAgICAgIEZyb20gQW50IDEuNi4yLCBlbGVtZW50cyBuZXN0ZWQgaW5zaWRlIGEgbmFtZXNwYWNlZCBlbGVtZW50IG1heSBhbHNvIGJlCisgICAgICBpbiBBbnQncyBkZWZhdWx0IG5hbWVzcGFjZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgaXMgbm93IGFsbG93ZWQ6CisgICAgPC9wPgorICAgIDwvcD48cHJlPiAmbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvdGFza3MucHJvcGVydGllcyIKKyAgIHVyaT0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIj5odHRwOi8vZXhhbXBsZS5vcmcvdGFza3M8L2E+Ii8mZ3Q7CisgJmx0O215OnRhc2sgeG1sbnM6bXk9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyI+aHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzPC9hPiImZ3Q7CisgICAmbHQ7Y29uZmlnIGE9ImZvbyIgYj0iYmFyIi8mZ3Q7CisgICAuLi4KKyAmbHQ7L215OnRhc2smZ3Q7Cis8L3ByZT4KKyAgICAgIAorICAgIDxoMz5OYW1lc3BhY2VzIGFuZCBBdHRyaWJ1dGVzPC9oMz4KKworICAgIDxwPgorICAgICAgQXR0cmlidXRlcyBhcmUgb25seSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZWxlbWVudCB0aGV5IGJlbG9uZyB0byBpZjoKKyAgICA8L3A+CisgICAgPHVsPgorICAgICAgPGxpPiB0aGV5IGhhdmUgbm8gbmFtZXNwYWNlIChub3RlIHRoYXQgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGRvZXMgKm5vdCogYXBwbHkgdG8gYXR0cmlidXRlcykKKyAgICAgIDwvbGk+CisgICAgICA8bGk+IHRoZXkgYXJlIGluIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgZWxlbWVudCB0aGV5IGJlbG9uZyB0bworICAgICAgPC9saT4KKyAgICA8L3VsPgorICAgIDxwPgorICAgICAgT3RoZXIgYXR0cmlidXRlcyBhcmUgc2ltcGx5IGlnbm9yZWQuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgVGhpcyBtZWFucyB0aGF0IGJvdGg6CisgICAgPC9wPgorICAgIDxwPgorICAgIDwvcD48cHJlPiAmbHQ7bXk6dGFzayB4bWxuczpteT0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIj5odHRwOi8vZXhhbXBsZS5vcmcvdGFza3M8L2E+IiZndDsKKyAgICZsdDtteTpjb25maWcgYT0iZm9vIiBiPSJiYXIiLyZndDsKKyAgIC4uLgorICZsdDsvbXk6dGFzayZndDsKKzwvcHJlPgorICAgIDxwPgorICAgICAgYW5kCisgICAgPC9wPgorICAgIDxwcmU+ICZsdDtteTp0YXNrIHhtbG5zOm15PSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iJmd0OworICAgJmx0O215OmNvbmZpZyBteTphPSJmb28iIG15OmI9ImJhciIvJmd0OworICAgLi4uCisgJmx0Oy9teTp0YXNrJmd0OworPC9wcmU+CisgICAgPHA+CisgICAgICByZXN1bHQgaW4gdGhlIHBhcmFtZXRlcnMgImEiIGFuZCAiYiIgYmVpbmcgdXNlZCBhcyBwYXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZSB0aGUgbmVzdGVkICJjb25maWciIGVsZW1lbnQuCisgICAgPC9wPgorICAgIDxwPkl0IGFsc28gbWVhbnMgdGhhdCB5b3UgY2FuIHVzZSBhdHRyaWJ1dGVzIGZyb20gb3RoZXIgbmFtZXNwYWNlcworICAgICAgdG8gbWFya3VwIHRoZSBidWlsZCBmaWxlIHdpdGggZXh0cmEgbWV0YWRhdGEsIHN1Y2ggYXMgUkRGIGFuZAorICAgICAgWE1MLVNjaGVtYSAod2hldGhlciB0aGF0J3MgYSBnb29kIHRoaW5nIG9yIG5vdCkuIFRoZSBzYW1lIGlzIG5vdCB0cnVlCisgICAgICBmb3IgZWxlbWVudHMgZnJvbSB1bmtub3duIG5hbWVzcGFjZXMsIHdoaWNoIHJlc3VsdCBpbiBhIGVycm9yLgorICAgIDwvcD4KKyAgICA8aDM+TWl4aW5nIEVsZW1lbnRzIGZyb20gRGlmZmVyZW50IE5hbWVzcGFjZXM8L2gzPgorCisgICAgPHA+Tm93IGNvbWVzIHRoZSBkaWZmaWN1bHQgcGFydDogZWxlbWVudHMgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBjYW4KKyAgICAgIGJlIHdvdmVuIHRvZ2V0aGVyIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcy4gVGhpcyBoYXMgYSBsb3QgdG8gZG8KKyAgICAgIHdpdGggdGhlIEFudCAxLjYKKyAgICAgIDxhIGhyZWY9Ii4uL2RldmVsb3AuaHRtbCNuZXN0ZWR0eXBlIj5hZGQgdHlwZSBpbnRyb3NwZWN0aW9uIHJ1bGVzPC9hPjoKKyAgICAgIEFudCB0eXBlcyBhbmQgdGFza3MgYXJlIG5vdyBmcmVlIHRvIGFjY2VwdCBhcmJyaXRyYXJ5IG5hbWVkIHR5cGVzIGFzCisgICAgICBuZXN0ZWQgZWxlbWVudHMsIGFzIGxvbmcgYXMgdGhlIGNvbmNyZXRlIHR5cGUgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlCisgICAgICBleHBlY3RlZCBieSB0aGUgdGFzay90eXBlLiBUaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgZm9yIHRoaXMgaXMgdGhlCisgICAgICA8Y29kZT4mbHQ7Y29uZGl0aW9uJmd0OzwvY29kZT4gdGFzaywgd2hpY2ggc3VwcG9ydHMgdmFyaW91cyBuZXN0ZWQgY29uZGl0aW9ucywgYWxsCisgICAgICBvZiB3aGljaCBleHRlbmQgdGhlIGludGVyZmFjZSA8dHQ+Q29uZGl0aW9uPC90dD4uIFRvIGludGVncmF0ZSBhCisgICAgICBjdXN0b20gY29uZGl0aW9uIGluIEFudCwgeW91IGNhbiBub3cgc2ltcGx5IDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gdGhlCisgICAgICBjb25kaXRpb24sIGFuZCB0aGVuIHVzZSBpdCBhbnl3aGVyZSBuZXN0ZWQgY29uZGl0aW9ucyBhcmUgYWxsb3dlZAorICAgICAgKGFzc3VtaW5nIHRoZSBjb250YWluaW5nIGVsZW1lbnQgaGFzIGEgZ2VuZXJpYyA8dHQ+YWRkKENvbmRpdGlvbik8L3R0PiBvciA8dHQ+YWRkQ29uZmlndXJlZChDb25kaXRpb24pPC90dD4gbWV0aG9kKToKKzwvcD48cHJlPiAmbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvY29uZGl0aW9ucy5wcm9wZXJ0aWVzIiB1cmk9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy9jb25kaXRpb25zIj5odHRwOi8vZXhhbXBsZS5vcmcvY29uZGl0aW9uczwvYT4iLyZndDsKKyAmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSJwcm9wIiB4bWxucz0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL2NvbmRpdGlvbnMiPmh0dHA6Ly9leGFtcGxlLm9yZy9jb25kaXRpb25zPC9hPiImZ3Q7CisgICAmbHQ7YW5kJmd0OworICAgICAmbHQ7YXZhaWxhYmxlIGZpbGU9ImJsYS50eHQiLyZndDsKKyAgICAgJmx0O215OmNvbmRpdGlvbiBhPSJmb28iLyZndDsKKyAgICZsdDsvYW5kJmd0OworICZsdDsvY29uZGl0aW9uJmd0OworPC9wcmU+CisgICAgPHA+CisgICAgICBJbiBBbnQgMS42LCB0aGlzIGZlYXR1cmUgY2Fubm90IGJlIHVzZWQgYXMgbXVjaCBhcyB3ZSdkIGFsbCBsaWtlIHRvOiBhCisgICAgICBsb3Qgb2YgY29kZSBoYXMgbm90IHlldCBiZWVuIGFkYXB0ZWQgdG8gdGhlIG5ldyBpbnRyb3NwZWN0aW9uIHJ1bGVzLAorICAgICAgYW5kIGVsZW1lbnRzIGxpa2UgQW50J3MgYnVpbHQtaW4gY29uZGl0aW9ucyBhbmQgc2VsZWN0b3JzIGFyZSBub3QKKyAgICAgIHJlYWxseSB0eXBlcyBpbiAxLjYuIFRoaXMgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlIGluIEFudCAxLjcuCisgICAgPC9wPgorICAgIDxoMz5OYW1lc3BhY2VzIGFuZCBBbnRsaWI8L2gzPgorCisgICAgPHA+CisgICAgICBUaGUgbmV3IDxhIGhyZWY9ImFudGxpYi5odG1sIj5BbnRMaWI8L2E+CisgICAgICBmZWF0dXJlIGlzIGFsc28gdmVyeSBtdWNoIGludGVncmF0ZWQgd2l0aCB0aGUgbmFtZXNwYWNlIHN1cHBvcnQgaW4gQW50CisgICAgICAxLjYuIEJhc2ljYWxseSwgeW91IGNhbiAiaW1wb3J0IiBBbnRsaWJzIHNpbXBseSBieSB1c2luZyBhIHNwZWNpYWwKKyAgICAgIHNjaGVtZSBmb3IgdGhlIG5hbWVzcGFjZSBVUkk6IHRoZSA8dHQ+YW50bGliPC90dD4gc2NoZW1lLCB3aGljaCBleHBlY3RzIHRoZSBwYWNrYWdlIG5hbWUgaW4gd2hpY2ggYSBzcGVjaWFsIDx0dD5hbnRsaWIueG1sPC90dD4gZmlsZSBpcyBsb2NhdGVkLgorICAgIDwvcD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL3BhdHRlcm5zZXQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5MmNhZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwKQEAgLTAsMCArMSwxODkgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UGF0dGVyblNldCBUeXBlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJwYXR0ZXJuc2V0Ij5QYXR0ZXJuU2V0PC9hPjwvaDI+Cis8cD48YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI3BhdHRlcm5zIj5QYXR0ZXJuczwvYT4gY2FuIGJlIGdyb3VwZWQgdG8KK3NldHMgYW5kIGxhdGVyIGJlIHJlZmVyZW5jZWQgYnkgdGhlaXIgPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZS4gVGhleQorYXJlIGRlZmluZWQgdmlhIGEgPGNvZGU+cGF0dGVybnNldDwvY29kZT4gZWxlbWVudCwgd2hpY2ggY2FuIGFwcGVhcgorbmVzdGVkIGludG8gYSA8YSBocmVmPSJmaWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IG9yIGEgZGlyZWN0b3J5LWJhc2VkCit0YXNrIHRoYXQgY29uc3RpdHV0ZXMgYW4gaW1wbGljaXQgRmlsZVNldC4gSW4gYWRkaXRpb24sCis8Y29kZT5wYXR0ZXJuc2V0PC9jb2RlPnMgY2FuIGJlIGRlZmluZWQgYXMgYSBzdGFuZCBhbG9uZSBlbGVtZW50IGF0Cit0aGUgc2FtZSBsZXZlbCBhcyA8Y29kZT50YXJnZXQ8L2NvZGU+ICYjMTUxOyBpLmUuLCBhcyBjaGlsZHJlbiBvZgorPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgd2VsbCBhcyBhcyBjaGlsZHJlbiBvZgorPGNvZGU+dGFyZ2V0PC9jb2RlPi48L3A+IDxwPlBhdHRlcm5zIGNhbiBiZSBzcGVjaWZpZWQgYnkgbmVzdGVkCis8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCBvciA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGVsZW1lbnRzCitvciB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCisgICAgICBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZTsgZWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuLiBZb3UgY2FuIHNwZWNpZnkgbW9yZSB0aGFuIG9uZQorICAgICAgaW5jbHVkZSBmaWxlIGJ5IHVzaW5nIGEgbmVzdGVkIGluY2x1ZGVzZmlsZSBlbGVtZW50cy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCisgICAgICBleGNsdWRlZDsgbm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi4gWW91IGNhbiBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUKKyAgICAgIGV4Y2x1ZGUgZmlsZSBieSB1c2luZyBhIG5lc3RlZCBleGNsdWRlc2ZpbGUgZWxlbWVudHMuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND48Y29kZT5pbmNsdWRlPC9jb2RlPiBhbmQgPGNvZGU+ZXhjbHVkZTwvY29kZT48L2g0PgorPHA+RWFjaCBzdWNoIGVsZW1lbnQgZGVmaW5lcyBhIHNpbmdsZSBwYXR0ZXJuIGZvciBmaWxlcyB0byBpbmNsdWRlIG9yCitleGNsdWRlLjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjcGF0dGVybnMiPnBhdHRlcm48L2E+CisgICAgICB0byBpbi9leGNsdWRlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IHVzZSB0aGlzIHBhdHRlcm4gaWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzIHNldC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51bmxlc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSB1c2UgdGhpcyBwYXR0ZXJuIGlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcworICAgICAgIDxiPm5vdDwvYj4gc2V0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg0Pjxjb2RlPmluY2x1ZGVzZmlsZTwvY29kZT4gYW5kIDxjb2RlPmV4Y2x1ZGVzZmlsZTwvY29kZT48L2g0PgorPHA+SWYgeW91IHdhbnQgdG8gbGlzdCB0aGUgZmlsZXMgdG8gaW5jbHVkZSBvciBleGNsdWRlIGV4dGVybmFsIHRvCit5b3VyIGJ1aWxkIGZpbGUsIHlvdSBzaG91bGQgdXNlIHRoZSBpbmNsdWRlc2ZpbGUvZXhjbHVkZXNmaWxlCithdHRyaWJ1dGVzIG9yIGVsZW1lbnRzLiAgVXNpbmcgdGhlIGF0dHJpYnV0ZSwgeW91IGNhbiBvbmx5IHNwZWNpZnkgYQorc2luZ2xlIGZpbGUgb2YgZWFjaCB0eXBlLCB3aGlsZSB0aGUgbmVzdGVkIGVsZW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQKK21vcmUgdGhhbiBvbmNlIC0gdGhlIG5lc3RlZCBlbGVtZW50cyBhbHNvIHN1cHBvcnQgaWYvdW5sZXNzIGF0dHJpYnV0ZXMKK3lvdSBjYW4gdXNlIHRvIHRlc3QgdGhlIGV4aXN0YW5jZSBvZiBhIHByb3BlcnR5LjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIGZpbGUgaG9sZGluZyB0aGUgcGF0dGVybnMgdG8KKyAgICAgIGluL2V4Y2x1ZGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk9ubHkgcmVhZCB0aGlzIGZpbGUgaWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzIHNldC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51bmxlc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSByZWFkIHRoaXMgZmlsZSBpZiB0aGUgbmFtZWQgcHJvcGVydHkgaXMKKyAgICAgIDxiPm5vdDwvYj4gc2V0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg0Pjxjb2RlPnBhdHRlcm5zZXQ8L2NvZGU+PC9oND4KKzxwPlBhdHRlcm5zZXRzIG1heSBiZSBuZXN0ZWQgd2l0aGluIG9uZSBhbm90aGVyLCBhZGRpbmcgdGhlIG5lc3RlZAorcGF0dGVybnMgdG8gdGhlIHBhcmVudCBwYXR0ZXJuc2V0LjwvcD4KKzxoND48Y29kZT5pbnZlcnQ8L2NvZGU+PC9oND4KKzxwPkEgbmVzdGVkIHBhdHRlcm5zZXQgY2FuIGJlIGludmVydGVkIHVzaW5nIHRoZSA8Y29kZT4mbHQ7aW52ZXJ0Jmd0OzwvY29kZT4KK2VsZW1lbnQuIDxlbT5TaW5jZSBBbnQgMS43LjE8L2VtPjwvcD4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3BhdHRlcm5zZXQgaWQ9JnF1b3Q7bm9uLnRlc3Quc291cmNlcyZxdW90OyZndDsKKyAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OworICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqLypUZXN0KiZxdW90Oy8mZ3Q7CismbHQ7L3BhdHRlcm5zZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5CdWlsZHMgYSBzZXQgb2YgcGF0dGVybnMgdGhhdCBtYXRjaGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMKK3RoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHRleHQgPGNvZGU+VGVzdDwvY29kZT4gaW4gdGhlaXIgbmFtZS4gVGhpcyBzZXQKK2NhbiBiZSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVycmVkPC9hPiB0byB2aWEKKzxjb2RlPiZsdDtwYXR0ZXJuc2V0IHJlZmlkPSZxdW90O25vbi50ZXN0LnNvdXJjZXMmcXVvdDsvJmd0OzwvY29kZT4sCitieSB0YXNrcyB0aGF0IHN1cHBvcnQgdGhpcyBmZWF0dXJlLCBvciBieSBGaWxlU2V0cy48L3A+Cis8cD5Ob3RlIHRoYXQgd2hpbGUgdGhlIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiBhbmQKKzxjb2RlPmV4Y2x1ZGVzPC9jb2RlPiBhdHRyaWJ1dGVzIGFjY2VwdAorbXVsdGlwbGUgZWxlbWVudHMgc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciBzcGFjZXMsIHRoZSBuZXN0ZWQKKzxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gZWxlbWVudHMgZXhwZWN0IHRoZWlyIG5hbWUKK2F0dHJpYnV0ZSB0byBob2xkIGEgc2luZ2xlIHBhdHRlcm4uPC9wPgorPHA+VGhlIG5lc3RlZCBlbGVtZW50cyBhbGxvdyB5b3UgdG8gdXNlIGlmIGFuZCB1bmxlc3MgYXJndW1lbnRzIHRvCitzcGVjaWZ5IHRoYXQgdGhlIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiBhIHByb3BlcnR5IGlzIHNldCwgb3IKK3RoYXQgaXQgc2hvdWxkIGJlIHVzZWQgb25seSBpZiBhIHByb3BlcnR5IGlzIG5vdCBzZXQuPC9wPgorPHA+Rm9yIGV4YW1wbGU8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3BhdHRlcm5zZXQgaWQ9JnF1b3Q7c291cmNlcyZxdW90OyZndDsKKyAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtzdGQvKiovKi5qYXZhJnF1b3Q7LyZndDsKKyAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtwcm9mLyoqLyouamF2YSZxdW90OyBpZj0mcXVvdDtwcm9mZXNzaW9uYWwmcXVvdDsvJmd0OworICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqLypUZXN0KiZxdW90Oy8mZ3Q7CismbHQ7L3BhdHRlcm5zZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD53aWxsIG9ubHkgaW5jbHVkZSB0aGUgZmlsZXMgaW4gdGhlIHN1Yi1kaXJlY3RvcnkgPGVtPnByb2Y8L2VtPiBpZiB0aGUgcHJvcGVydHkKKzxlbT5wcm9mZXNzaW9uYWw8L2VtPiBpcyBzZXQgdG8gc29tZSB2YWx1ZS48L3A+Cis8cD5UaGUgdHdvIHNldHM8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3BhdHRlcm5zZXQgaW5jbHVkZXNmaWxlPSZxdW90O3NvbWUtZmlsZSZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5hbmQ8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3BhdHRlcm5zZXQmZ3Q7CisgICZsdDtpbmNsdWRlc2ZpbGUgbmFtZT0mcXVvdDtzb21lLWZpbGUmcXVvdDsvJmd0OyAKKyZsdDtwYXR0ZXJuc2V0LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmFyZSBpZGVudGljYWwuICBUaGUgaW5jbHVkZSBwYXR0ZXJucyB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgZmlsZQorPGNvZGU+c29tZS1maWxlPC9jb2RlPiwgb25lIHBhdHRlcm4gcGVyIGxpbmUuPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtwYXR0ZXJuc2V0Jmd0OworICAmbHQ7aW5jbHVkZXNmaWxlIG5hbWU9JnF1b3Q7c29tZS1maWxlJnF1b3Q7LyZndDsgCisgICZsdDtpbmNsdWRlc2ZpbGUgbmFtZT0mcXVvdDske3NvbWUtb3RoZXItZmlsZX0mcXVvdDsgCisgICAgICAgICAgICAgICAgaWY9JnF1b3Q7c29tZS1vdGhlci1maWxlJnF1b3Q7CisgIC8mZ3Q7IAorJmx0O3BhdHRlcm5zZXQvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+d2lsbCBhbHNvIHJlYWQgaW5jbHVkZSBwYXR0ZXJucyBmcm9tIHRoZSBmaWxlIHRoZSBwcm9wZXJ0eQorPGNvZGU+c29tZS1vdGhlci1maWxlPC9jb2RlPiBwb2ludHMgdG8sIGlmIGEgcHJvcGVydHkgb2YgdGhhdCBuYW1lIGhhcworYmVlbiBkZWZpbmVkLjwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9wZXJtaXNzaW9ucy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL3Blcm1pc3Npb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiZTBmMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9wZXJtaXNzaW9ucy5odG1sCkBAIC0wLDAgKzEsMTY0IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlBlcm1pc3Npb25zIHR5cGU8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InBlcm1pc3Npb25zIj5QZXJtaXNzaW9uczwvYT48L2gyPgorPHA+CitQZXJtaXNzaW9ucyByZXByZXNlbnRzIGEgc2V0IG9mIHNlY3VyaXR5IHBlcm1pc3Npb25zIGdyYW50ZWQgb3IgcmV2b2tlZCB0bworYSBzcGVjaWZpYyBwYXJ0IGNvZGUgZXhlY3V0ZWQgaW4gdGhlIEpWTSB3aGVyZSBhbnQgaXMgcnVubmluZyBpbi4KK1RoZSBhY3R1YWwgUGVybWlzc2lvbnMgYXJlIHNwZWNpZmllZCB2aWEgYSBzZXQgb2YgbmVzdGVkIHBlcm1pc3Npb24gaXRlbXMgZWl0aGVyCis8Y29kZT4mbHQ7Z3JhbnQmZ3Q7PC9jb2RlPmVkIG9yIDxjb2RlPiZsdDtyZXZva2UmZ3Q7PC9jb2RlPmQuPC9wPgorPHA+CitJbiB0aGUgYmFzZSBzaXR1YXRpb24gYSA8YSBocmVmPSIjYmFzZXNldCI+YmFzZSBzZXQ8L2E+IG9mIHBlcm1pc3Npb25zIGdyYW50ZWQuIAorRXh0cmEgcGVybWlzc2lvbnMgY2FuIGJlCitncmFudGVkLiBBIGdyYW50ZWQgcGVybWlzc2lvbiBjYW4gYmUgb3ZlcnJ1bGVkIGJ5IHJldm9raW5nIGEgcGVybWlzc2lvbi4KK1RoZSBzZWN1cml0eSBtYW5hZ2VyIGluc3RhbGxlZCBieSB0aGUgcGVybWlzc2lvbnMgd2lsbCB0aHJvdyBhbiAKKzxjb2RlPlNlY3VyaXR5RXhjZXB0aW9uPC9jb2RlPiBpZgordGhlIGNvZGUgc3ViamVjdCB0byB0aGVzZSBwZXJtaXNzaW9ucyB0cnkgdG8gdXNlIGFuIHBlcm1pc3Npb24gdGhhdCBoYXMgbm90IGJlZW4gCitncmFudGVkIG9yIHRoYXQgaGFzIGJlZW4gcmV2b2tlZC48L3A+Cis8aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5ncmFudDwvaDQ+Cis8cD4KK0luZGljYXRlcyBhIHNwZWNpZmljIHBlcm1pc3Npb24gaXMgYWx3YXlzIGdyYW50ZWQuIEl0cyBhdHRyaWJ1dGVzIGluZGljYXRlIHdoaWNoIAorcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBQZXJtaXNzaW9uIGNsYXNzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBQZXJtaXNzaW9uLiBUaGUgYWN0dWFsIGNvbnRlbnRzIGRlcGVuZHMgb24gdGhlCisgICAgUGVybWlzc2lvbiBjbGFzcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hY3Rpb25zPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBhY3Rpb25zIGFsbG93ZWQuIFRoZSBhY3R1YWwgY29udGVudHMgZGVwZW5kIG9uIHRoZSAKKyAgICBQZXJtaXNzaW9uIGNsYXNzIGFuZCBuYW1lLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+CitJbXBsaWVkIHBlcm1pc3Npb25zIGFyZSBncmFudGVkLgorPC9wPgorPHA+CitQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgUGVybWlzc2lvbiBjbGFzc2VzIG1heSBhY3R1YWxseSBuZWVkIGEgbmFtZSBhbmQgLyBvciBhY3Rpb25zIGluIG9yZGVyIHRvIGZ1bmN0aW9uIHByb3Blcmx5LiBUaGUgbmFtZSBhbmQgYWN0aW9ucyBhcmUgcGFyc2VkIGJ5IHRoZSBhY3R1YWwKK1Blcm1pc3Npb24gY2xhc3MuCis8L3A+Cis8aDQ+cmV2b2tlPC9oND4KKzxwPgorSW5kaWNhdGVzIGEgc3BlY2lmaWMgcGVybWlzc2lvbiBpcyByZXZva2VkLjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgUGVybWlzc2lvbiBjbGFzcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgUGVybWlzc2lvbi4gVGhlIGFjdHVhbCBjb250ZW50cyBkZXBlbmRzIG9uIHRoZQorICAgIFBlcm1pc3Npb24gY2xhc3MuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YWN0aW9uczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYWN0aW9ucyBhbGxvd2VkLiBUaGUgYWN0dWFsIGNvbnRlbnRzIGRlcGVuZCBvbiB0aGUgCisgICAgUGVybWlzc2lvbiBjbGFzcyBhbmQgbmFtZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPgorSW1wbGllZCBwZXJtaXNzaW9ucyBhcmUgbm90IHJlc29sdmVkIGFuZCB0aGVyZWZvcmUgYWxzbyBub3QgcmV2b2tlZC4KKzwvcD4KKzxwPgorVGhlIG5hbWUgY2FuIGhhbmRsZSB0aGUgKiB3aWxkY2FyZCBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lLCBpbiB3aGljaCBjYXNlIGFsbCAKK3Blcm1pc3Npb25zIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3Mgb2Ygd2hpY2ggdGhlIG5hbWUgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisoZXhjbHVkaW5nIHRoZSAqKSBhcmUgcmV2b2tlZC4gTm90ZSB0aGF0IHRoZSAtIHdpbGRjYXJkIG9mdGVuIHN1cHBvcnRlZCBieSB0aGUKK2dyYW50ZWQgcHJvcGVydGllcyBpcyBub3Qgc3VwcG9ydGVkLgorSWYgdGhlIG5hbWUgaXMgbGVmdCBlbXB0eSBhbGwgbmFtZXMgbWF0Y2gsIGFuZCBhcmUgcmV2b2tlZC4KK0lmIHRoZSBhY3Rpb25zIGFyZSBsZWZ0IGVtcHR5IGFsbCBhY3Rpb25zIG1hdGNoLCBhbmQgYXJlIHJldm9rZWQuCis8L3A+Cis8aDM+PGEgbmFtZT0iYmFzZXNldCI+QmFzZSBzZXQ8L2E+PC9oMz4KK0EgcGVybWlzc2lvbnMgc2V0IGltcGxpY3RseSBjb250YWlucyB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb25zOgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtncmFudCBjbGFzcz0mcXVvdDtqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uJnF1b3Q7IG5hbWU9JnF1b3Q7bG9jYWxob3N0OjEwMjQtJnF1b3Q7IGFjdGlvbnM9JnF1b3Q7bGlzdGVuJnF1b3Q7Jmd0OworJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtqYXZhLnZlcnNpb24mcXVvdDsgYWN0aW9ucz0mcXVvdDtyZWFkJnF1b3Q7Jmd0OworJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtqYXZhLnZlbmRvciZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CismbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O2phdmEudmVuZG9yLnVybCZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CismbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O2phdmEuY2xhc3MudmVyc2lvbiZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CismbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O29zLm5hbWUmcXVvdDsgYWN0aW9ucz0mcXVvdDtyZWFkJnF1b3Q7Jmd0OworJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtvcy52ZXJzaW9uJnF1b3Q7IGFjdGlvbnM9JnF1b3Q7cmVhZCZxdW90OyZndDsKKyZsdDtncmFudCBjbGFzcz0mcXVvdDtqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uJnF1b3Q7IG5hbWU9JnF1b3Q7b3MuYXJjaCZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CismbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O2ZpbGUuZW5jb2RpbmcmcXVvdDsgYWN0aW9ucz0mcXVvdDtyZWFkJnF1b3Q7Jmd0OworJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtmaWxlLnNlcGFyYXRvciZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CismbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O3BhdGguc2VwYXJhdG9yJnF1b3Q7IGFjdGlvbnM9JnF1b3Q7cmVhZCZxdW90OyZndDsKKyZsdDtncmFudCBjbGFzcz0mcXVvdDtqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uJnF1b3Q7IG5hbWU9JnF1b3Q7bGluZS5zZXBhcmF0b3ImcXVvdDsgYWN0aW9ucz0mcXVvdDtyZWFkJnF1b3Q7Jmd0OworJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CismbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O2phdmEuc3BlY2lmaWNhdGlvbi52ZW5kb3ImcXVvdDsgYWN0aW9ucz0mcXVvdDtyZWFkJnF1b3Q7Jmd0OworJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtqYXZhLnNwZWNpZmljYXRpb24ubmFtZSZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CismbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O2phdmEudm0uc3BlY2lmaWNhdGlvbi52ZXJzaW9uJnF1b3Q7IGFjdGlvbnM9JnF1b3Q7cmVhZCZxdW90OyZndDsKKyZsdDtncmFudCBjbGFzcz0mcXVvdDtqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uJnF1b3Q7IG5hbWU9JnF1b3Q7amF2YS52bS5zcGVjaWZpY2F0aW9uLnZlbmRvciZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CismbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O2phdmEudm0uc3BlY2lmaWNhdGlvbi5uYW1lJnF1b3Q7IGFjdGlvbnM9JnF1b3Q7cmVhZCZxdW90OyZndDsKKyZsdDtncmFudCBjbGFzcz0mcXVvdDtqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uJnF1b3Q7IG5hbWU9JnF1b3Q7amF2YS52bS52ZXJzaW9uJnF1b3Q7IGFjdGlvbnM9JnF1b3Q7cmVhZCZxdW90OyZndDsKKyZsdDtncmFudCBjbGFzcz0mcXVvdDtqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uJnF1b3Q7IG5hbWU9JnF1b3Q7amF2YS52bS52ZW5kb3ImcXVvdDsgYWN0aW9ucz0mcXVvdDtyZWFkJnF1b3Q7Jmd0OworJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtqYXZhLnZtLm5hbWUmcXVvdDsgYWN0aW9ucz0mcXVvdDtyZWFkJnF1b3Q7Jmd0OworPC9ibG9ja3F1b3RlPjwvcHJlPgorVGhlc2UgcGVybWlzc2lvbnMgY2FuIGJlIHJldm9rZWQgdmlhIDxjb2RlPiZsdDtyZXZva2UmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpZiBuZWNlc3NhcnkuCisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Blcm1pc3Npb25zJmd0OworICAmbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uJnF1b3Q7LyZndDsKKyAgJmx0O3Jldm9rZSBjbGFzcz0mcXVvdDtqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uJnF1b3Q7LyZndDsKKyZsdDsvcGVybWlzc2lvbnMmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD4KK0dyYW50cyBhbGwgcGVybWlzc2lvbnMgdG8gdGhlIGNvZGUgZXhjZXB0IGZvciB0aG9zZSBoYW5kbGluZyBQcm9wZXJ0aWVzLgorPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtwZXJtaXNzaW9ucyZndDsKKyAgJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEubmV0LlNvY2tldFBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtmb28uYmFyLmNvbSZxdW90OyBhY3Rpb249JnF1b3Q7Y29ubmVjdCZxdW90Oy8mZ3Q7CisgICZsdDtncmFudCBjbGFzcz0mcXVvdDtqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uJnF1b3Q7IG5hbWU9JnF1b3Q7dXNlci5ob21lJnF1b3Q7IGFjdGlvbj0mcXVvdDtyZWFkLHdyaXRlJnF1b3Q7LyZndDsKKyZsdDsvcGVybWlzc2lvbnMmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD4KK0dyYW50cyB0aGUgYmFzZSBzZXQgb2YgcGVybWlzc2lvbnMgd2l0aCB0aGUgYWRkaXRpb24gb2YgYSBTb2NrZXRQZXJtaXNzaW9uIHRvIGNvbm5lY3QKK3RvIGZvby5iYXIuY29tIGFuZCB0aGUgcGVybWlzc2lvbiB0byByZWFkIGFuZCB3cml0ZSB0aGUgdXNlci5ob21lIHN5c3RlbSBwcm9wZXJ0eS4KKzwvcD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL3Byb3BlcnR5c2V0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvcHJvcGVydHlzZXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU3NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL3Byb3BlcnR5c2V0Lmh0bWwKQEAgLTAsMCArMSwxNDMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UHJvcGVydHlTZXQgVHlwZTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0icHJvcGVydHlzZXQiPlByb3BlcnR5U2V0PC9hPjwvaDI+Cis8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+PC9wPgorCis8cD5Hcm91cHMgYSBzZXQgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGJ5IHJlZmVyZW5jZSBpbiBhIHRhc2sgdGhhdAorc3VwcG9ydHMgdGhpcy48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmR5bmFtaWM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byByZWV2YWx1YXRlIHRoZSBzZXQgZXZlcnl0aW1lIHRoZSBzZXQKKyAgICAgIGlzIHVzZWQuICBEZWZhdWx0IGlzICZxdW90Ozxjb2RlPnRydWU8L2NvZGU+JnF1b3Q7LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5lZ2F0ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIG5lZ2F0ZSByZXN1bHRzLiBJZgorICAgICAgJnF1b3Q7PGNvZGU+dHJ1ZTwvY29kZT4mcXVvdDssIGFsbCBwcm9wZXJ0aWVzIDxpPm5vdDwvaT4KKyAgICAgIHNlbGVjdGVkIGJ5IG5lc3RlZCBlbGVtZW50cyB3aWxsIGJlIHJldHVybmVkLiBEZWZhdWx0IGlzCisgICAgICAmcXVvdDs8Y29kZT5mYWxzZTwvY29kZT4mcXVvdDsuIDxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND5wcm9wZXJ0eXJlZjwvaDQ+CisKKzxwPlNlbGVjdHMgcHJvcGVydGllcyBmcm9tIHRoZSBjdXJyZW50IHByb2plY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCitzZXQuPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNlbGVjdCB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iNCI+RXhhY3RseSBvbmUgb2YgdGhlc2UuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlZml4PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNlbGVjdCB0aGUgcHJvcGVydGllcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIHRoZQorICAgICAgZ2l2ZW4gc3RyaW5nLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlZ2V4PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNlbGVjdCB0aGUgcHJvcGVydGllcyB0aGF0IG1hdGNoIHRoZSBnaXZlbgorICAgICAgcmVndWxhciBleHByZXNzaW9uLiAgU2ltaWxhciB0byA8YQorICAgICAgaHJlZj0ibWFwcGVyLmh0bWwjcmVnZXhwLW1hcHBlciI+cmVnZXhwIHR5cGUgbWFwcGVyczwvYT4sIHRoaXMKKyAgICAgIHJlcXVpcmVzIGEgc3VwcG9ydGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaWJyYXJ5LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1aWx0aW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2VsZWN0cyBhIGJ1aWx0aW4gc2V0IG9mIHByb3BlcnRpZXMuICBWYWxpZAorICAgICAgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmUgPGNvZGU+YWxsPC9jb2RlPiBmb3IgYWxsIEFudAorICAgICAgcHJvcGVydGllcywgPGNvZGU+c3lzdGVtPC9jb2RlPiBmb3IgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGFuZAorICAgICAgPGNvZGU+Y29tbWFuZGxpbmU8L2NvZGU+IGZvciBhbGwgcHJvcGVydGllcyBzcGVjaWZpZWQgb24gdGhlCisgICAgICBjb21tYW5kIGxpbmUgd2hlbiBpbnZva2luZyBBbnQgKHBsdXMgYSBudW1iZXIgb2Ygc3BlY2lhbAorICAgICAgaW50ZXJuYWwgQW50IHByb3BlcnRpZXMpLjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+cHJvcGVydHlzZXQ8L2g0PgorCis8cD5BIDxjb2RlPnByb3BlcnR5c2V0PC9jb2RlPiBjYW4gYmUgdXNlZCBhcyB0aGUgc2V0IHVuaW9uIG9mIG1vcmUKKzxjb2RlPnByb3BlcnR5c2V0PC9jb2RlPnMuPC9wPgorCis8cD5Gb3IgZXhhbXBsZTo8L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7cHJvcGVydHlzZXQgaWQ9JnF1b3Q7cHJvcGVydGllcy1zdGFydGluZy13aXRoLWZvbyZxdW90OyZndDsKKyAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0mcXVvdDtmb28mcXVvdDsvJmd0OworJmx0Oy9wcm9wZXJ0eXNldCZndDsKKyZsdDtwcm9wZXJ0eXNldCBpZD0mcXVvdDtwcm9wZXJ0aWVzLXN0YXJ0aW5nLXdpdGgtYmFyJnF1b3Q7Jmd0OworICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSZxdW90O2JhciZxdW90Oy8mZ3Q7CismbHQ7L3Byb3BlcnR5c2V0Jmd0OworJmx0O3Byb3BlcnR5c2V0IGlkPSZxdW90O215LXNldCZxdW90OyZndDsKKyAgJmx0O3Byb3BlcnR5c2V0IHJlZmlkPSZxdW90O3Byb3BlcnRpZXMtc3RhcnRpbmctd2l0aC1mb28mcXVvdDsvJmd0OworICAmbHQ7cHJvcGVydHlzZXQgcmVmaWQ9JnF1b3Q7cHJvcGVydGllcy1zdGFydGluZy13aXRoLWJhciZxdW90Oy8mZ3Q7CismbHQ7L3Byb3BlcnR5c2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5jb2xsZWN0cyBhbGwgcHJvcGVydGllcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGVpdGhlcgorJnF1b3Q7Zm9vJnF1b3Q7IG9yICZxdW90O2JhciZxdW90OyBpbiB0aGUgc2V0IG5hbWVkCismcXVvdDtteS1zZXQmcXVvdDsuPC9wPgorCis8aDQ+bWFwcGVyPC9oND4KKworPHA+QSA8YSBocmVmPSJtYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiAtIGF0IG1heGltdW0gb25lIG1hcHBlciBjYW4gYmUKK3NwZWNpZmllZC4gIFRoZSBtYXBwZXIgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIG5hbWVzIG9mIHRoZSBwcm9wZXJ0eQora2V5cywgZm9yIGV4YW1wbGU6CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7cHJvcGVydHlzZXQgaWQ9JnF1b3Q7cHJvcGVydGllcy1zdGFydGluZy13aXRoLWZvbyZxdW90OyZndDsKKyAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0mcXVvdDtmb28mcXVvdDsvJmd0OworICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7Z2xvYiZxdW90OyBmcm9tPSZxdW90O2ZvbyomcXVvdDsgdG89JnF1b3Q7YmFyKiZxdW90Oy8mZ3Q7CismbHQ7L3Byb3BlcnR5c2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5jb2xsZWN0cyBhbGwgcHJvcGVydGllcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoICZxdW90O2ZvbyZxdW90OywgYnV0CitjaGFuZ2VzIHRoZSBuYW1lcyB0byBzdGFydCB3aXRoICZxdW90O2JhciZxdW90OyBpbnN0ZWFkLjwvcD4KKworPHA+SWYgc3VwcGxpZWQsIHRoZSBuZXN0ZWQgbWFwcGVyIHdpbGwgYmUgYXBwbGllZAorc3Vic2VxdWVudCB0byBhbnkgbmVnYXRpb24gb2YgbWF0Y2hlZCBwcm9wZXJ0aWVzLjwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL3JlZGlyZWN0b3IuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9yZWRpcmVjdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkZDkyNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9yZWRpcmVjdG9yLmh0bWwKQEAgLTAsMCArMSwxODMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UmVkaXJlY3RvciBUeXBlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJyZWRpcmVjdG9yIj5JL08gcmVkaXJlY3Rpb248L2E+PC9oMj4KKzxwPkZvciBtYW55IHRhc2tzLCBpbnB1dCBhbmQgb3V0cHV0IGNhbiBiZSBkZWZpbmVkIGluIGEgZmFpcmx5CitzdHJhaWdodGZvcndhcmQgZmFzaGlvbi4gIFRoZSA8YSBocmVmPSIuLi9Db3JlVGFza3MvZXhlYy5odG1sIj5leGVjPC9hPgordGFzaywgdXNlZCB0byBleGVjdXRlIGFuIGV4dGVybmFsIHByb2Nlc3MsIHN0YW5kcyBhcyBhIHZlcnkKK2Jhc2ljIGV4YW1wbGUuICBUaGUgZXhlY3V0ZWQgcHJvY2VzcyBtYXkgYWNjZXB0IGlucHV0LCBwcm9kdWNlCitvdXRwdXQsIG9yIGRvIGVpdGhlciBvciBib3RoIGRlcGVuZGluZyB1cG9uIHZhcmlvdXMgY2lyY3Vtc3RhbmNlcy4KK091dHB1dCBtYXkgYmUgY2xhc3NpZmllZCBhcyAmcXVvdDtvdXRwdXQmcXVvdDsgb3IgYXMgJnF1b3Q7ZXJyb3IKK291dHB1dC4mcXVvdDsgIFRoZSA8Y29kZT4mbHQ7cmVkaXJlY3RvciZndDs8L2NvZGU+IHR5cGUgcHJvdmlkZXMgYSBjb25jcmV0ZSBtZWFucworb2YgcmVkaXJlY3RpbmcgaW5wdXQgYW5kIG91dHB1dCBmZWF0dXJpbmcgdGhlIHVzZSBvZgorPGEgaHJlZj0iLi9tYXBwZXIuaHRtbCI+RmlsZSBNYXBwZXI8L2E+cyB0byBzcGVjaWZ5Citzb3VyY2UgKGlucHV0KSBhbmQgZGVzdGluYXRpb24gKG91dHB1dC9lcnJvcikgZmlsZXMuICA8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT4KKzxwPlRoZSA8Y29kZT4mbHQ7cmVkaXJlY3RvciZndDs8L2NvZGU+IGVsZW1lbnQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYSBmaWxlIHRvIHdoaWNoIG91dHB1dCBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgIElmIHRoZSBlcnJvciBzdHJlYW0gaXMgbm90IGFsc28gcmVkaXJlY3RlZCB0byBhIGZpbGUgb3IgcHJvcGVydHksCisgICAgICBpdCB3aWxsIGFwcGVhciBpbiB0aGlzIG91dHB1dC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlCisgICAgICBjb21tYW5kIHNob3VsZCBiZSByZWRpcmVjdGVkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxvZ0Vycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgd2hlbiB5b3Ugd2lzaCB0byBzZWUKKyAgICAgIGVycm9yIG91dHB1dCBpbiBBbnQncyBsb2cgYW5kIHlvdSBhcmUgcmVkaXJlY3Rpbmcgb3V0cHV0IHRvCisgICAgICBhIGZpbGUvcHJvcGVydHkuIFRoZSBlcnJvciBvdXRwdXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4KKyAgICAgIHRoZSBvdXRwdXQgZmlsZS9wcm9wZXJ0eS4gSWYgeW91IHJlZGlyZWN0IGVycm9yIHdpdGggdGhlCisgICAgICA8aT5lcnJvcjwvaT4gb3IgPGk+ZXJyb3JQcm9wZXJ0eTwvaT4gYXR0cmlidXRlcywgdGhpcyB3aWxsCisgICAgICBoYXZlIG5vIGVmZmVjdC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hcHBlbmQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBvdXRwdXQgYW5kIGVycm9yIGZpbGVzIHNob3VsZCBiZQorICAgICAgYXBwZW5kZWQgdG8gcmF0aGVyIHRoYW4gb3ZlcndyaXR0ZW4uIERlZmF1bHRzIHRvCisgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y3JlYXRlZW1wdHlmaWxlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIG91dHB1dCBhbmQgZXJyb3IgZmlsZXMgc2hvdWxkIGJlCisgICAgICBjcmVhdGVkIGV2ZW4gd2hlbiBlbXB0eS4gIERlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dHByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIG91dHB1dCBvZiB0aGUKKyAgICAgIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gVW5sZXNzIHRoZSBlcnJvciBzdHJlYW0gaXMgcmVkaXJlY3RlZAorICAgICAgdG8gYSBzZXBhcmF0ZSBmaWxlIG9yIHN0cmVhbSwgdGhpcyBwcm9wZXJ0eSB3aWxsIGluY2x1ZGUgdGhlCisgICAgICBlcnJvciBvdXRwdXQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3Jwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBzdGFuZGFyZCBlcnJvcgorICAgICAgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIGZpbGUgZnJvbSB3aGljaCB0aGUgZXhlY3V0ZWQgY29tbWFuZCdzIHN0YW5kYXJkIGlucHV0CisgICAgICBpcyB0YWtlbi4gVGhpcyBhdHRyaWJ1dGUgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlCisgICAgICA8aT5pbnB1dHN0cmluZzwvaT4gYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlucHV0c3RyaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgc3RyaW5nIHdoaWNoIHNlcnZlcyBhcyB0aGUgaW5wdXQgc3RyZWFtIGZvciB0aGUKKyAgICAgIGV4ZWN1dGVkIGNvbW1hbmQuIFRoaXMgYXR0cmlidXRlIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZQorICAgICAgPGk+aW5wdXQ8L2k+IGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dGVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbnB1dCBlbmNvZGluZy48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXRlbmNvZGluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgb3V0cHV0IGVuY29kaW5nLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9yZW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGVycm9yIGVuY29kaW5nLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFsd2F5c2xvZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BbHdheXMgc2VuZCB0byB0aGUgbG9nIGluIGFkZGl0aW9uIHRvCisgICAgICAgIGFueSBvdGhlciBkZXN0aW5hdGlvbi4gPGk+U2luY2UgQW50IDEuNi4zPC9pPi4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bG9naW5wdXRzdHJpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q29udHJvbHMgdGhlIGRpc3BsYXkgb2YgPGk+aW5wdXRzdHJpbmc8L2k+J3MgdmFsdWUgaW4KKyAgICAgICAgbG9nIG1lc3NhZ2VzLiBTZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IHdoZW4gc2VuZGluZyBzZW5zaXRpdmUgZGF0YQorICAgICAgICAoZS5nLiBwYXNzd29yZHMpIHRvIGV4dGVybmFsIHByb2Nlc3Nlcy4gPGk+U2luY2UgQW50IDEuNi4zPC9pPi4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0PmlucHV0bWFwcGVyPC9oND4KKzxwPkEgc2luZ2xlIDxhIGhyZWY9Ii4vbWFwcGVyLmh0bWwiPkZpbGUgTWFwcGVyPC9hPiB1c2VkIHRvIHJlZGlyZWN0IHByb2Nlc3MKK2lucHV0LiAgTXVsdGlwbGUgbWFwcGluZyByZXN1bHRzIHNob3VsZCBjb25jYXRlbmF0ZSBhbGwgbWFwcGVkIGZpbGVzIGFzIGlucHV0LgorTWFwcGluZyB3aWxsIG9yZGluYXJpbHkgYmUgcGVyZm9ybWVkIG9uIGEgdGFzay1zcGVjaWZpZWQgc291cmNlZmlsZTsKK2NvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGluZGl2aWR1YWwgdGFzayBmb3IgbW9yZSBkZXRhaWxzLgorQSBuZXN0ZWQgPGNvZGU+Jmx0O2lucHV0bWFwcGVyJmd0OzwvY29kZT4gaXMgbm90IGNvbXBhdGlibGUgd2l0aCBlaXRoZXIgb2YgdGhlCis8aT5pbnB1dDwvaT4gb3IgPGk+aW5wdXRzdHJpbmc8L2k+IGF0dHJpYnV0ZXMuPC9wPgorPGg0Pm91dHB1dG1hcHBlcjwvaDQ+Cis8cD5BIHNpbmdsZSA8YSBocmVmPSIuL21hcHBlci5odG1sIj5GaWxlIE1hcHBlcjwvYT4gdXNlZCB0byByZWRpcmVjdCBwcm9jZXNzCitvdXRwdXQuICBNYXBwaW5nIHdpbGwgb3JkaW5hcmlseSBiZSBwZXJmb3JtZWQgb24gYSB0YXNrLXNwZWNpZmllZCBzb3VyY2VmaWxlOworY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgaW5kaXZpZHVhbCB0YXNrIGZvciBtb3JlIGRldGFpbHMuCitBIG5lc3RlZCA8Y29kZT4mbHQ7b3V0cHV0bWFwcGVyJmd0OzwvY29kZT4gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUKKzxpPm91dHB1dDwvaT4gYXR0cmlidXRlLjwvcD4KKzxoND5lcnJvcm1hcHBlcjwvaDQ+Cis8cD5BIHNpbmdsZSA8YSBocmVmPSIuL21hcHBlci5odG1sIj5GaWxlIE1hcHBlcjwvYT4gdXNlZCB0byByZWRpcmVjdCBlcnJvcgorb3V0cHV0LiAgTWFwcGluZyB3aWxsIG9yZGluYXJpbHkgYmUgcGVyZm9ybWVkIG9uIGEgdGFzay1zcGVjaWZpZWQgc291cmNlZmlsZTsKK2NvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGluZGl2aWR1YWwgdGFzayBmb3IgbW9yZSBkZXRhaWxzLgorQSBuZXN0ZWQgPGNvZGU+Jmx0O2Vycm9ybWFwcGVyJmd0OzwvY29kZT4gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUKKzxpPmVycm9yPC9pPiBhdHRyaWJ1dGUuPC9wPgorPGg0PmlucHV0ZmlsdGVyY2hhaW48L2g0PgorPHA+QSA8YSBocmVmPSIuL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPiBjYW4gYmUKK2FwcGxpZWQgdG8gdGhlIHByb2Nlc3MgaW5wdXQuPC9wPgorPGg0Pm91dHB1dGZpbHRlcmNoYWluPC9oND4KKzxwPkEgPGEgaHJlZj0iLi9maWx0ZXJjaGFpbi5odG1sIj5GaWx0ZXJDaGFpbjwvYT4gY2FuIGJlCithcHBsaWVkIHRvIHRoZSBwcm9jZXNzIG91dHB1dC48L3A+Cis8aDQ+ZXJyb3JmaWx0ZXJjaGFpbjwvaDQ+Cis8cD5BIDxhIGhyZWY9Ii4vZmlsdGVyY2hhaW4uaHRtbCI+RmlsdGVyQ2hhaW48L2E+IGNhbiBiZQorYXBwbGllZCB0byB0aGUgZXJyb3Igb3V0cHV0LjwvcD4KKzxoMz5Vc2FnZTwvaDM+CitUYXNrcyBrbm93biB0byBzdXBwb3J0IEkvTyByZWRpcmVjdGlvbjoKKzx1bD4KKzxsaT48YSBocmVmPSIuLi9Db3JlVGFza3MvZXhlYy5odG1sIj5FeGVjPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iLi4vQ29yZVRhc2tzL2FwcGx5Lmh0bWwiPkFwcGx5PC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iLi4vQ29yZVRhc2tzL2phdmEuaHRtbCI+SmF2YTwvYT48L2xpPgorPC91bD4KKzxwPlRoZSBleHBlY3RlZCBiZWhhdmlvciBvZiBhIDxjb2RlPiZsdDtyZWRpcmVjdG9yJmd0OzwvY29kZT4gaXMgdG8gYSBncmVhdCBkZWdyZWUKK2RlcGVuZGVudCBvbiB0aGUgc3VwcG9ydGluZyB0YXNrLiAgQW55IHBvc3NpYmxlIHBvaW50cyBvZiBjb25mdXNpb24KK3Nob3VsZCBiZSBub3RlZCBhdCB0aGUgdGFzayBsZXZlbC48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvcmVnZXhwLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvcmVnZXhwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5ZjdhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9yZWdleHAuaHRtbApAQCAtMCwwICsxLDExMiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5SZWdleHAgVHlwZTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0icmVnZXhwIj5SZWdleHA8L2E+PC9oMj4KKzxwPgorUmVnZXhwIHJlcHJlc2VudHMgYSByZWd1bGFyIGV4cHJlc3Npb24uCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+PHByZT4KKyAgICAgJmx0O3JlZ2V4cCBpZD0ibXlyZWdleHAiIHBhdHRlcm49ImFscGhhKC4rKWJldGEiLyZndDs8YnI+Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD4KK0RlZmluZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGxhdGVyIHVzZSB3aXRoIGlkIG15cmVnZXhwLgorPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyAgICAgJmx0O3JlZ2V4cCByZWZpZD0ibXlyZWdleHAiLyZndDs8YnI+Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD4KK1VzZSB0aGUgcmVndWxhciBleHByZXNzaW9uIHdpdGggaWQgbXlyZWdleHAuCis8L3A+Cis8aDM+PGEgbmFtZT0iaW1wbGVtZW50YXRpb24iPkNob2ljZSBvZiByZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb248L2E+PC9oMz4KKzxwPgorQW50IGNvbWVzIHdpdGgKK3dyYXBwZXJzIGZvcgorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC9kb2NzL2FwaS9qYXZhL3V0aWwvcmVnZXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+dGhlIGphdmEudXRpbC5yZWdleCBwYWNrYWdlIG9mIEpESyAxLjQ8L2E+LAorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvIiB0YXJnZXQ9Il90b3AiPmpha2FydGEtcmVnZXhwPC9hPgorYW5kIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvb3JvLyIgdGFyZ2V0PSJfdG9wIj5qYWthcnRhLU9STzwvYT4sCitTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPmluc3RhbGxhdGlvbiBkZXBlbmRlbmNpZXM8L2E+CisgY29uY2VybmluZyB0aGUgc3VwcG9ydGluZyBsaWJyYXJpZXMuPC9wPgorPHA+CitUaGUgcHJvcGVydHkgPGNvZGU+YW50LnJlZ2V4cC5yZWdleHBpbXBsPC9jb2RlPiBnb3Zlcm5zIHdoaWNoIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNob3Nlbi4KK1Bvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBhcmUgOgorPHVsPgorPGxpPgorb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmRrMTRSZWdleHBSZWdleHAKKzwvbGk+Cis8bGk+CitvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhT3JvUmVnZXhwCis8L2xpPgorPGxpPgorb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmFrYXJ0YVJlZ2V4cFJlZ2V4cAorPC9saT4KKzwvdWw+CitJdCBjYW4gYWxzbyBiZSBhbm90aGVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwPC9jb2RlPi4KK0lmIDxjb2RlPmFudC5yZWdleHAucmVnZXhwaW1wbDwvY29kZT4gaXMgbm90IGRlZmluZWQsIGFudCBjaGVja3MgaW4gdGhlIG9yZGVyIEpkazE0UmVnZXhwLCBKYWthcnRhT3JvUmVnZXhwLAorIEpha2FydGFSZWdleHAgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbGlicmFyeS4gVGhlIGZpcnN0IG9mIHRoZXNlIDMgd2hpY2ggaXMgZm91bmQgd2lsbCBiZSB1c2VkLjwvcD4KKzxwPgorVGhlcmUgYXJlIGNyb3NzLXBsYXRmb3JtIGlzc3VlcyBmb3IgbWF0Y2hlcyByZWxhdGVkIHRvIGxpbmUgdGVybWluYXRvci4KK0ZvciBleGFtcGxlIGlmIHlvdSB1c2UgJCB0byBhbmNob3IgeW91ciByZWd1bGFyIGV4cHJlc3Npb24gb24gdGhlIGVuZCBvZiBhIGxpbmUKK3RoZSByZXN1bHRzIG1pZ2h0IGJlIHZlcnkgZGlmZmVyZW50IGRlcGVuZGluZyBvbiBib3RoIHlvdXIgcGxhdGZvcm0gYW5kIHRoZSByZWd1bGFyCitleHByZXNzaW9uIGxpYnJhcnkgeW91IHVzZS4gSXQgaXMgJ2hpZ2hseSByZWNvbW1lbmRlZCcgdGhhdCB5b3UgdGVzdCB5b3VyIHBhdHRlcm4gb24KK2JvdGggVW5peCBhbmQgV2luZG93cyBwbGF0Zm9ybXMgYmVmb3JlIHlvdSByZWx5IG9uIGl0LgorPHVsPgorICAgIDxsaT5KYWthcnRhIE9ybyBkZWZpbmVzIGEgbGluZSB0ZXJtaW5hdG9yIGFzICdcbicgYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCBQZXJsLjwvbGk+CisgICAgPGxpPkpha2FydGEgUmVnRXhwIHVzZXMgYSBzeXN0ZW0tZGVwZW5kYW50IGxpbmUgdGVybWluYXRvci48L2xpPgorICAgIDxsaT5KREsgMS40IHVzZXMgJ1xuJywgJ1xyXG4nLCAnXHUwMDg1JywgJ1x1MjAyOCcsICdcdTIwMjknIGFzIGEgZGVmYXVsdAorICAgIGJ1dCBpcyBjb25maWd1cmVkIGluIHRoZSB3cmFwcGVyIHRvIHVzZSBvbmx5ICdcbicgKFVOSVhfTElORSk8L2xpPgorPC91bD4KKzxlbT5XZSA8Yj5zdHJvbmdseTwvYj4gcmVjb21tZW5kIHRoYXQgeW91IHVzZSBKYWthcnRhIE9yby48L2VtPgorPC9wPgorPGgzPlVzYWdlPC9oMz4KK1RoZSBmb2xsb3dpbmcgdGFza3MgYW5kIHR5cGVzIHVzZSB0aGUgUmVnZXhwIHR5cGUgOgorPHVsPgorPGxpPjxhIGhyZWY9Ii4uL09wdGlvbmFsVGFza3MvcmVwbGFjZXJlZ2V4cC5odG1sIj5SZXBsYWNlUmVnRXhwIHRhc2s8L2E+PC9saT4KKzxsaT48YSBocmVmPSJmaWx0ZXJjaGFpbi5odG1sI2xpbmVjb250YWluc3JlZ2V4cCI+TGluZUNvbnRhaW5zUmVnZXhwIGZpbHRlcjwvYT48L2xpPgorPC91bD4KKzxwPgorVGhlc2Ugc3RyaW5nIGZpbHRlcnMgYWxzbyB1c2UgdGhlIG1lY2hhbmlzbSBvZiByZWdleHAgdG8gY2hvb3NlIGEgcmVndWxhciBleHByZXNzaW9uIGltcGxlbWVudGF0aW9uIDoKKzwvcD4KKzx1bD4KKzxsaT48YSBocmVmPSJmaWx0ZXJjaGFpbi5odG1sI2NvbnRhaW5zcmVnZXgiPkNvbnRhaW5zUmVnZXggc3RyaW5nIGZpbHRlcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9ImZpbHRlcmNoYWluLmh0bWwjcmVwbGFjZXJlZ2V4Ij5SZXBsYWNlUmVnZXggc3RyaW5nIGZpbHRlcjwvYT48L2xpPgorPC91bD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNWJjMmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwKQEAgLTAsMCArMSw5ODMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UmVzb3VyY2VzIGFuZCBSZXNvdXJjZSBDb2xsZWN0aW9uczwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0icmVzb3VyY2UiPlJlc291cmNlczwvYT48L2gyPgorPHA+CitBIGZpbGUtbGlrZSBlbnRpdHkgY2FuIGJlIGFic3RyYWN0ZWQgdG8gdGhlIGNvbmNlcHQgb2YgYSA8aT5yZXNvdXJjZTwvaT4uCitJbiBhZGRpdGlvbiB0byBwcm92aWRpbmcgYWNjZXNzIHRvIGZpbGUtbGlrZSBhdHRyaWJ1dGVzLCBhIHJlc291cmNlCitpbXBsZW1lbnRhdGlvbiBzaG91bGQsIHdoZW4gcG9zc2libGUsIHByb3ZpZGUgdGhlIG1lYW5zIHRvIHJlYWQgY29udGVudAorZnJvbSBhbmQvb3Igd3JpdGUgY29udGVudCB0byB0aGUgdW5kZXJseWluZyBlbnRpdHkuIEFsdGhvdWdoIHRoZSByZXNvdXJjZQorY29uY2VwdCB3YXMgaW50cm9kdWNlZCBpbiA8aT5BbnQgMS41LjI8L2k+LCByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSBmb3IKK2V4cGxpY2l0IHVzZSBiZWdpbm5pbmcgaW4gPGI+QW50IDEuNzwvYj4uCis8L3A+CisKKzxoMz5UaGUgYnVpbHQtaW4gcmVzb3VyY2UgdHlwZXMgYXJlOjwvaDM+CisKKzx1bD4KKyAgPGxpPjxhIGhyZWY9IiNiYXNpYyI+cmVzb3VyY2U8L2E+IC0gYSBiYXNpYyByZXNvdXJjZS48L2xpPgorICA8bGk+PGEgaHJlZj0iI2J6aXAycmVzb3VyY2UiPmJ6aXAycmVzb3VyY2U8L2E+IC0gYSBCWmlwMiBjb21wcmVzc2VkIHJlc291cmNlLjwvbGk+CisgIDxsaT48YSBocmVmPSIjZmlsZSI+ZmlsZTwvYT4gLSBhIGZpbGUuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNnemlwcmVzb3VyY2UiPmd6aXByZXNvdXJjZTwvYT4gLSBhIEdaaXAgY29tcHJlc3NlZCByZXNvdXJjZS48L2xpPgorICA8bGk+PGEgaHJlZj0iI2phdmFyZXNvdXJjZSI+amF2YXJlc291cmNlPC9hPiAtIGEgcmVzb3VyY2UgbG9hZGFibGUKKyAgICAgICAgdmlhIGEgSmF2YSBjbGFzc2xvYWRlci48L2xpPgorICA8bGk+PGEgaHJlZj0iI3Byb3BlcnR5cmVzb3VyY2UiPnByb3BlcnR5cmVzb3VyY2U8L2E+IC0gYW4gQW50IHByb3BlcnR5LjwvbGk+CisgIDxsaT48YSBocmVmPSIjc3RyaW5nIj5zdHJpbmc8L2E+IC0gYSB0ZXh0IHN0cmluZy48L2xpPgorICA8bGk+PGEgaHJlZj0iI3RhcmVudHJ5Ij50YXJlbnRyeTwvYT4gLSBhbiBlbnRyeSBpbiBhIHRhciBmaWxlLjwvbGk+CisgIDxsaT48YSBocmVmPSIjdXJsIj51cmw8L2E+IC0gYSBVUkwuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiN6aXBlbnRyeSI+emlwZW50cnk8L2E+IC0gYW4gZW50cnkgaW4gYSB6aXAgZmlsZS48L2xpPgorPC91bD4KKworPGg0PjxhIG5hbWU9ImJhc2ljIj5yZXNvdXJjZTwvYT48L2g0PgorCis8cD5BIGJhc2ljIHJlc291cmNlLiBPdGhlciByZXNvdXJjZSB0eXBlcyBkZXJpdmUgZnJvbSB0aGlzIGJhc2ljCit0eXBlOyBhcyBzdWNoIGFsbCBpdHMgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlLCB0aG91Z2ggaW4gbW9zdCBjYXNlcworaXJyZWxldmFudCBhdHRyaWJ1dGVzIHdpbGwgYmUgaWdub3JlZC4gVGhpcyBhbmQgYWxsIHJlc291cmNlCitpbXBsZW1lbnRhdGlvbnMgYXJlIGFsc28gdXNhYmxlIGFzIHNpbmdsZS1lbGVtZW50Cis8YSBocmVmPSIjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbnM8L2E+LgorPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGlzdHM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGlzIHJlc291cmNlIGV4aXN0czwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxhc3Rtb2RpZmllZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGlzIHJlc291cmNlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyZWN0b3J5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhpcyByZXNvdXJjZSBpcyBkaXJlY3RvcnktbGlrZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCA8aT5mYWxzZTwvaT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zaXplPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzaXplIG9mIHRoaXMgcmVzb3VyY2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0PjxhIG5hbWU9ImZpbGUiPmZpbGU8L2E+PC9oND4KKworPHA+UmVwcmVzZW50cyBhIGZpbGUgYWNjZXNzaWJsZSB2aWEgbG9jYWwgZmlsZXN5c3RlbSBjb252ZW50aW9ucy48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhpcyByZXNvdXJjZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGlzIHJlc291cmNlLiAgV2hlbiB0aGlzCisgICAgICBhdHRyaWJ1dGUgaXMgc2V0LCBhdHRlbXB0cyB0byBhY2Nlc3MgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlCisgICAgICB3aWxsIHlpZWxkIGEgcGF0aCByZWxhdGl2ZSB0byB0aGlzIGxvY2F0aW9uLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+PGEgbmFtZT0iamF2YXJlc291cmNlIj5qYXZhcmVzb3VyY2U8L2E+PC9oND4KKworPHA+UmVwcmVzZW50cyBhIHJlc291cmNlIGxvYWRhYmxlIHZpYSBhIEphdmEgY2xhc3Nsb2FkZXIuPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZSwKKyAgICAgIGdpdmVuIGFzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPgorICAgICAgdG8gYSA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGRlZmluZWQgZWxzZXdoZXJlLi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2FkZXJSZWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIGxvYWRlciB0aGF0IGlzCisgICAgICB1c2VkIHRvIGxvYWQgdGhlIHJlc291cmNlLCBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5UaGUgY2xhc3NwYXRoIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQgY2xhc3NwYXRoIGVsZW1lbnQsCit3aGVyZSA8Yj4mbHQ7Y2xhc3NwYXRoJmd0OzwvYj4gaXMgYSA8YQoraHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPi48L3A+CisKKzxoND48YSBuYW1lPSJ6aXBlbnRyeSI+emlwZW50cnk8L2E+PC9oND4KKworPHA+UmVwcmVzZW50cyBhbiBlbnRyeSBpbiBhIFpJUCBhcmNoaXZlLiAgVGhlIGFyY2hpdmUgY2FuIGJlIHNwZWNpZmllZAordXNpbmcgdGhlIGFyY2hpdmUgYXR0cmlidXRlIG9yIGEgbmVzdGVkIHNpbmdsZS1lbGVtZW50IHJlc291cmNlCitjb2xsZWN0aW9uLiAgPGNvZGU+emlwZW50cnk8L2NvZGU+IG9ubHkgc3VwcG9ydHMgZmlsZSBzeXN0ZW0gcmVzb3VyY2VzCithcyBuZXN0ZWQgZWxlbWVudHMuPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj56aXBmaWxlIG9yIGl0cyBhbGlhcyBuYW1lIGFyY2hpdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHppcCBmaWxlIGNvbnRhaW5pbmcgdGhpcyByZXNvdXJjZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBhIG5lc3RlZCByZXNvdXJjZQorICAgIGNvbGxlY3Rpb24gaGFzIGJlZW4gc3BlY2lmaWVkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGFyY2hpdmVkIHJlc291cmNlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyBvZiB0aGUgemlwZmlsZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsKKyAgICAgIHBsYXRmb3JtIGRlZmF1bHQgdXNlZCBpZiB1bnNwZWNpZmllZDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+PGEgbmFtZT0idGFyZW50cnkiPnRhcmVudHJ5PC9hPjwvaDQ+CisKKzxwPlJlcHJlc2VudHMgYW4gZW50cnkgaW4gYSBUQVIgYXJjaGl2ZS4gIFRoZSBhcmNoaXZlIGNhbiBiZSBzcGVjaWZpZWQKK3VzaW5nIHRoZSBhcmNoaXZlIGF0dHJpYnV0ZSBvciBhIG5lc3RlZCBzaW5nbGUtZWxlbWVudCByZXNvdXJjZQorY29sbGVjdGlvbi48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFyY2hpdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHRhciBhcmNoaXZlIGNvbnRhaW5pbmcgdGhpcyByZXNvdXJjZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBhIG5lc3RlZCByZXNvdXJjZQorICAgIGNvbGxlY3Rpb24gaGFzIGJlZW4gc3BlY2lmaWVkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGFyY2hpdmVkIHJlc291cmNlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+PGEgbmFtZT0iZ3ppcHJlc291cmNlIj5nemlwcmVzb3VyY2U8L2E+PC9oND4KKworPHA+VGhpcyBpcyBub3QgYSBzdGFuZC1hbG9uZSByZXNvdXJjZSwgYnV0IGEgd3JhcHBlciBhcm91bmQgYW5vdGhlcgorcmVzb3VyY2UgcHJvdmlkaW5nIGNvbXByZXNzaW9uIG9mIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzIG9uIHRoZSBmbHkuCitBIHNpbmdsZSBlbGVtZW50IHJlc291cmNlIGNvbGxlY3Rpb24gbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBuZXN0ZWQKK2VsZW1lbnQuPC9wPgorCis8aDQ+PGEgbmFtZT0iYnppcDJyZXNvdXJjZSI+YnppcDJyZXNvdXJjZTwvYT48L2g0PgorCis8cD5UaGlzIGlzIG5vdCBhIHN0YW5kLWFsb25lIHJlc291cmNlLCBidXQgYSB3cmFwcGVyIGFyb3VuZCBhbm90aGVyCityZXNvdXJjZSBwcm92aWRpbmcgY29tcHJlc3Npb24gb2YgdGhlIHJlc291cmNlJ3MgY29udGVudHMgb24gdGhlIGZseS4KK0Egc2luZ2xlIGVsZW1lbnQgcmVzb3VyY2UgY29sbGVjdGlvbiBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIG5lc3RlZAorZWxlbWVudC48L3A+CisKKzxoND48YSBuYW1lPSJ1cmwiPnVybDwvYT48L2g0PgorCis8cD5SZXByZXNlbnRzIGEgVVJMLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXJsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1cmwgdG8gZXhwb3NlPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMyIgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPkV4YWN0bHkgb25lIG9mIHRoZXNlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBleHBvc2UgYXMgYSBmaWxlOiB1cmw8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0PjxhIG5hbWU9InN0cmluZyI+c3RyaW5nPC9hPjwvaDQ+CisKKzxwPlJlcHJlc2VudHMgYSBKYXZhIFN0cmluZy4gSXQgY2FuIGJlIHdyaXR0ZW4gdG8sIGJ1dCBvbmx5IG9uY2UsIGFmdGVyIHdoaWNoCitpdCB3aWxsIGJlIGFuIGVycm9yIHRvIHdyaXRlIHRvIGFnYWluLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZhbHVlIG9mIHRoaXMgcmVzb3VyY2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+VGhlIHJlc291cmNlIGFsc28gc3VwcG9ydHMgbmVzdGVkIHRleHQsIHdoaWNoIGNhbiBvbmx5IGJlIHN1cHBsaWVkIGlmIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gYXR0cmlidXRlIGlzIHVuc2V0OgorICA8L3A+Cis8cHJlPgorICAmbHQ7c3RyaW5nPgorICAgICAgICBzZWxmLmxvZygiQW50IHZlcnNpb24gPSR7YW50LnZlcnNpb259Iik7CisgICZsdDsvc3RyaW5nPgorPC9wcmU+CisgICAgCis8L3A+CisKKzxoND48YSBuYW1lPSJwcm9wZXJ0eXJlc291cmNlIj5wcm9wZXJ0eXJlc291cmNlPC9hPjwvaDQ+CisKKzxwPlJlcHJlc2VudHMgYW4gQW50IHByb3BlcnR5LjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJvcGVydHkgbmFtZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGhyPgorPGgyPjxhIG5hbWU9ImNvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb25zPC9hPjwvaDI+Cis8cD4KK0EgUmVzb3VyY2UgQ29sbGVjdGlvbiBpcyBhbiBhYnN0cmFjdGlvbiBvZiBhbiBlbnRpdHkgdGhhdCBncm91cHMKK3RvZ2V0aGVyIGEgbnVtYmVyIG9mIDxhIGhyZWY9IiNyZXNvdXJjZSI+cmVzb3VyY2VzPC9hPi4gU2V2ZXJhbCBvZgorQW50J3MgImxlZ2FjeSIgZGF0YXR5cGVzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBiZWhhdmUgYXMgUmVzb3VyY2UgQ29sbGVjdGlvbnM6Cis8dWw+CisgIDxsaT48YSBocmVmPSJmaWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+LAorICAgIDxhIGhyZWY9ImRpcnNldC5odG1sIj5kaXJzZXQ8L2E+LAorICAgIDxhIGhyZWY9ImZpbGVsaXN0Lmh0bWwiPmZpbGVsaXN0PC9hPiwgYW5kCisgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoPC9hPgorICAgIChhbmQgZGVyaXZhdGl2ZSB0eXBlcykgZXhwb3NlIDxhIGhyZWY9IiNmaWxlIj5maWxlPC9hPiByZXNvdXJjZXMKKyAgPC9saT4KKyAgPGxpPjxhIGhyZWY9InppcGZpbGVzZXQuaHRtbCI+dGFyZmlsZXNldDwvYT4KKyAgICBjYW4gZXhwb3NlIDxhIGhyZWY9IiNmaWxlIj5maWxlPC9hPiBvciA8YSBocmVmPSIjdGFyZW50cnkiPnRhcmVudHJ5PC9hPgorICAgIHJlc291cmNlcyBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbgorICA8L2xpPgorICA8bGk+PGEgaHJlZj0iemlwZmlsZXNldC5odG1sIj56aXBmaWxlc2V0PC9hPgorICAgIGNhbiBleHBvc2UgPGEgaHJlZj0iI2ZpbGUiPmZpbGU8L2E+IG9yIDxhIGhyZWY9IiN6aXBlbnRyeSI+emlwZW50cnk8L2E+CisgICAgcmVzb3VyY2VzIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uCisgIDwvbGk+CisgIDxsaT48YSBocmVmPSJwcm9wZXJ0eXNldC5odG1sIj5wcm9wZXJ0eXNldDwvYT4KKyAgICBleHBvc2VzIDxhIGhyZWY9IiNwcm9wZXJ0eSI+cHJvcGVydHk8L2E+IHJlc291cmNlcworICA8L2xpPgorPC91bD4KKzwvcD4KKzxwPlN0cmFuZ2VseSwgc29tZSB0YXNrcyBjYW4gZXZlbiBsZWdpdGltYXRlbHkgYmVoYXZlIGFzIHJlc291cmNlIGNvbGxlY3Rpb25zOgorPHVsPgorICA8bGk+PGEgaHJlZj0iLi4vQ29yZVRhc2tzL2NvbmNhdC5odG1sIj5jb25jYXQ8L2E+CisgICAgZXhwb3NlcyBhIGNvbmNhdGVuYXRlZCByZXNvdXJjZSwgYW5kIGFkZHMgZS5nLgorICAgIDxhIGhyZWY9Ii4uL2ZpbHRlcmNoYWluLmh0bWwiPmZpbHRlcmluZzwvYT4KKyAgICB0byBBbnQncyByZXNvdXJjZS1yZWxhdGVkIGNhcGFiaWxpdGllcy4KKyAgPC9saT4KKzwvdWw+Cis8L3A+Cis8aDM+VGhlIGFkZGl0aW9uYWwgYnVpbHQtaW4gcmVzb3VyY2UgY29sbGVjdGlvbnMgYXJlOjwvaDM+Cis8dWw+CisgIDxsaT48YSBocmVmPSIjcmVzb3VyY2VzIj5yZXNvdXJjZXM8L2E+IC0gZ2VuZXJpYyByZXNvdXJjZSBjb2xsZWN0aW9uPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNmaWxlcyI+ZmlsZXM8L2E+IC0gY29sbGVjdGlvbiBvZiBmaWxlcyBzaW1pbGFyIHRvCisgICAgPGEgaHJlZj0iZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjcmVzdHJpY3QiPnJlc3RyaWN0PC9hPiAtIHJlc3RyaWN0IGEgcmVzb3VyY2UgY29sbGVjdGlvbgorICAgIHRvIGluY2x1ZGUgb25seSByZXNvdXJjZXMgbWVldGluZyBzcGVjaWZpZWQgY3JpdGVyaWE8L2xpPgorICA8bGk+PGEgaHJlZj0iI3NvcnQiPnNvcnQ8L2E+IC0gc29ydGVkIHJlc291cmNlIGNvbGxlY3Rpb248L2xpPgorICA8bGk+PGEgaHJlZj0iI2ZpcnN0Ij5maXJzdDwvYT4gLSBmaXJzdCA8aT5uPC9pPiByZXNvdXJjZXMgZnJvbSBhCisgICAgbmVzdGVkIGNvbGxlY3Rpb248L2xpPgorICA8bGk+PGEgaHJlZj0iI2xhc3QiPmxhc3Q8L2E+IC0gbGFzdCA8aT5uPC9pPiByZXNvdXJjZXMgZnJvbSBhCisgICAgbmVzdGVkIGNvbGxlY3Rpb248L2xpPgorICA8bGk+PGEgaHJlZj0iI3Rva2VucyI+dG9rZW5zPC9hPiAtIDxhIGhyZWY9IiNzdHJpbmciPnN0cmluZzwvYT4gdG9rZW5zCisgICAgZ2F0aGVyZWQgZnJvbSBhIG5lc3RlZCBjb2xsZWN0aW9uPC9saT4KKyAgPGxpPjxhIGhyZWY9IiN1bmlvbiI+dW5pb248L2E+IC0gc2V0IHVuaW9uIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uczwvbGk+CisgIDxsaT48YSBocmVmPSIjaW50ZXJzZWN0Ij5pbnRlcnNlY3Q8L2E+IC0gc2V0IGludGVyc2VjdGlvbgorICAgIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uczwvbGk+CisgIDxsaT48YSBocmVmPSIjZGlmZmVyZW5jZSI+ZGlmZmVyZW5jZTwvYT4gLSBzZXQgZGlmZmVyZW5jZQorICAgIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uczwvbGk+Cis8L3VsPgorPGg0PjxhIG5hbWU9InJlc291cmNlcyI+cmVzb3VyY2VzPC9hPjwvaDQ+Cis8cD5BIGdlbmVyaWMgcmVzb3VyY2UgY29sbGVjdGlvbiwgZGVzaWduZWQgZm9yIHVzZSB3aXRoCisgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlczwvYT4uCisgIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkLXBhcnR5IEFudCB0YXNrIGdlbmVyYXRlcyBhIFJlc291cmNlIENvbGxlY3Rpb24KKyAgb2YgYW4gdW5rbm93biB0eXBlLCBpdCBjYW4gc3RpbGwgYmUgYWNjZXNzZWQgdmlhIGEKKyAgPGNvZGU+Jmx0O3Jlc291cmNlcyZndDs8L2NvZGU+IGNvbGxlY3Rpb24uIFRoZSBzZWNvbmRhcnkgdXNlIG9mIHRoaXMKKyAgY29sbGVjdGlvbiB0eXBlIGlzIGFzIGEgY29udGFpbmVyIG9mIG90aGVyIHJlc291cmNlIGNvbGxlY3Rpb25zLAorICBwcmVzZXJ2aW5nIHRoZSBvcmRlciBvZiBuZXN0ZWQgY29sbGVjdGlvbnMgYXMgd2VsbCBhcworICBkdXBsaWNhdGUgcmVzb3VyY2VzIChjb250cmFzdCB3aXRoIDxhIGhyZWY9IiN1bmlvbiI+dW5pb248L2E+KS4KKzwvcD4KKworPGg0PjxhIG5hbWU9ImZpbGVzIj5maWxlczwvYT48L2g0PgorPHA+QSBncm91cCBvZiBmaWxlcy4gVGhlc2UgZmlsZXMgYXJlIG1hdGNoZWQgYnkgPGI+YWJzb2x1dGU8L2I+IHBhdHRlcm5zCisgIHRha2VuIGZyb20gYSBudW1iZXIgb2YgPGEgaHJlZj0icGF0dGVybnNldC5odG1sIj5QYXR0ZXJuU2V0czwvYT4uCisgIFRoZXNlIGNhbiBiZSBzcGVjaWZpZWQgYXMgbmVzdGVkIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4KKyAgZWxlbWVudHMuIEluIGFkZGl0aW9uLCA8Y29kZT4mbHQ7ZmlsZXMmZ3Q7PC9jb2RlPiBob2xkcyBhbiBpbXBsaWNpdAorICBQYXR0ZXJuU2V0IGFuZCBzdXBwb3J0cyB0aGUgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sCisgIDxjb2RlPiZsdDtpbmNsdWRlc2ZpbGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgorICBhbmQgPGNvZGU+Jmx0O2V4Y2x1ZGVzZmlsZSZndDs8L2NvZGU+IGVsZW1lbnRzIG9mIFBhdHRlcm5TZXQgZGlyZWN0bHksCisgIGFzIHdlbGwgYXMgUGF0dGVyblNldCdzIGF0dHJpYnV0ZXMuCis8L3A+Cis8cD48YSBocmVmPSJzZWxlY3RvcnMuaHRtbCI+RmlsZSBTZWxlY3RvcnM8L2E+IGFyZSBhdmFpbGFibGUgYXMgbmVzdGVkCisgIGVsZW1lbnRzLiBBIGZpbGUgbXVzdCBiZSBzZWxlY3RlZCBieSBhbGwgc2VsZWN0b3JzIGluIG9yZGVyIHRvIGJlIGluY2x1ZGVkOworICA8Y29kZT4mbHQ7ZmlsZXMmZ3Q7PC9jb2RlPiBpcyB0aHVzIGVxdWl2YWxlbnQgdG8gYW4KKyAgPGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+IGZpbGUgc2VsZWN0b3IgY29udGFpbmVyLgorPC9wPgorPHA+PGI+TW9yZSBzaW1wbHkgcHV0PC9iPiwgdGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gYQorICA8YSBocmVmPSJmaWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+IHdpdGggbm8gYmFzZSBkaXJlY3RvcnkuCisgIDxiPlBsZWFzZSBub3RlPC9iPiB0aGF0IHdpdGhvdXQgYSBiYXNlIGRpcmVjdG9yeSwKKyAgZmlsZXN5c3RlbSBzY2FubmluZyBpcyBiYXNlZCBlbnRpcmVseSBvbiBpbmNsdWRlIGFuZCBleGNsdWRlIHBhdHRlcm5zLgorICBBIDxhIGhyZWY9InNlbGVjdG9ycy5odG1sI2ZpbGVuYW1lc2VsZWN0Ij5maWxlbmFtZTwvYT4gKG9yIGFueSkKKyAgc2VsZWN0b3IgY2FuIDxpPm9ubHk8L2k+IGluZmx1ZW5jZSB0aGUgc2Nhbm5pbmcgcHJvY2VzcyA8aT5hZnRlcjwvaT4KKyAgdGhlIGZpbGUgaGFzIGJlZW4gaW5jbHVkZWQgYmFzZWQgb24gcGF0dGVybi1iYXNlZCBzZWxlY3Rpb24uCis8L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucworICAgICAgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiPkF0IGxlYXN0IG9uZSBvZiB0aGVzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMKKyAgICAgIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBub25lCisgICAgICAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMgd2hlbiB0cnVlKTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlcgorICAgICAgPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkZWZhdWx0ZXhjbHVkZXMiPmRlZmF1bHQgZXhjbHVkZXM8L2E+CisgICAgICBzaG91bGQgYmUgdXNlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBwYXR0ZXJucyBhcmUgY2FzZS1zZW5zaXRpdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb2xsb3dzeW1saW5rczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGZvbGxvdyBzeW1ib2xpYyBsaW5rcworICAgICAgKHNlZSBub3RlIDxhIGhyZWY9IiNzeW1saW5rIj5iZWxvdzwvYT4pPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDxpPnRydWU8L2k+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPjxhIG5hbWU9InN5bWxpbmsiPjxiPk5vdGU8L2I+PC9hPjogQWxsIGZpbGVzL2RpcmVjdG9yaWVzIGZvciB3aGljaAordGhlIGNhbm9uaWNhbCBwYXRoIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBwYXRoIGFyZSBjb25zaWRlcmVkIHN5bWJvbGljCitsaW5rcy4gIE9uIFVuaXggc3lzdGVtcyB0aGlzIHVzdWFsbHkgbWVhbnMgdGhlIGZpbGUgcmVhbGx5IGlzIGEKK3N5bWJvbGljIGxpbmsgYnV0IGl0IG1heSBsZWFkIHRvIGZhbHNlIHJlc3VsdHMgb24gb3RoZXIKK3BsYXRmb3Jtcy4KKzwvcD4KKworPGg0PjxhIG5hbWU9InJlc3RyaWN0Ij5yZXN0cmljdDwvYT48L2g0PgorPHA+UmVzdHJpY3RzIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gdXNpbmcgcmVzb3VyY2Ugc2VsZWN0b3JzOgorPGJsb2NrcXVvdGU+CisgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FjaGU8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNhY2hlIHJlc3VsdHM7IGRpc2FibGluZworICAgICAgICBtYXkgc2VyaW91c2x5IGltcGFjdCBwZXJmb3JtYW5jZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDxpPnRydWU8L2k+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICA8aDQ+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oND4KKyAgPHA+QSBzaW5nbGUgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZC48L3A+CisgIDxwPk5lc3RlZCByZXNvdXJjZSBzZWxlY3RvcnMgYXJlIHVzZWQgdG8gIm5hcnJvdyBkb3duIiB0aGUgaW5jbHVkZWQKKyAgICByZXNvdXJjZXMuIFRoZXNlIGFyZSBwYXR0ZXJuZWQgYWZ0ZXIgPGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwiPmZpbGUKKyAgICBzZWxlY3RvcnM8L2E+IGJ1dCBhcmUsIHVuc3VycHJpc2luZ2x5LCB0YXJnZXRlZCB0byByZXNvdXJjZXMuCisgICAgU2V2ZXJhbCBidWlsdC1pbiByZXNvdXJjZSBzZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgaW50ZXJuYWwKKyAgICA8YSBocmVmPSJhbnRsaWIuaHRtbCI+YW50bGliPC9hPgorICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnM8L2NvZGU+OgorICA8L3A+CisKKyAgPHVsPgorICAgIDxsaT48YSBocmVmPSIjcnNlbC5uYW1lIj5uYW1lPC9hPiAtIHNlbGVjdCByZXNvdXJjZXMgYnkgbmFtZS48L2xpPgorICAgIDxsaT48YSBocmVmPSIjcnNlbC5leGlzdHMiPmV4aXN0czwvYT4gLSBzZWxlY3QgZXhpc3RpbmcgcmVzb3VyY2VzLjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyc2VsLmRhdGUiPmRhdGU8L2E+IC0gc2VsZWN0IHJlc291cmNlcyBieSBkYXRlLjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyc2VsLnR5cGUiPnR5cGU8L2E+IC0gc2VsZWN0IHJlc291cmNlcyBieSB0eXBlLjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyc2VsLnNpemUiPnNpemU8L2E+IC0gc2VsZWN0IHJlc291cmNlcyBieSBzaXplLjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyc2VsLmluc3RhbmNlb2YiPmluc3RhbmNlb2Y8L2E+CisgICAgICAtIHNlbGVjdCByZXNvdXJjZXMgYnkgY2xhc3Mgb3IgQW50IGRhdGF0eXBlLjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyc2VsLmFuZCI+YW5kPC9hPiAtICJhbmQiIG5lc3RlZCByZXNvdXJjZSBzZWxlY3RvcnMuPC9saT4KKyAgICA8bGk+PGEgaHJlZj0iI3JzZWwub3IiPm9yPC9hPiAtICJvciIgbmVzdGVkIHJlc291cmNlIHNlbGVjdG9ycy48L2xpPgorICAgIDxsaT48YSBocmVmPSIjcnNlbC5ub3QiPm5vdDwvYT4gLSAibm90IiBhIG5lc3RlZCByZXNvdXJjZSBzZWxlY3Rvci48L2xpPgorICAgIDxsaT48YSBocmVmPSIjcnNlbC5ub25lIj5ub25lPC9hPgorICAgICAgLSBzZWxlY3QgcmVzb3VyY2VzIHNlbGVjdGVkIGJ5IG5vIG5lc3RlZCByZXNvdXJjZSBzZWxlY3RvcnMuPC9saT4KKyAgICA8bGk+PGEgaHJlZj0iI3JzZWwubWFqb3JpdHkiPm1ham9yaXR5PC9hPiAtIHNlbGVjdCByZXNvdXJjZXMgc2VsZWN0ZWQKKyAgICAgIGJ5IGEgbWFqb3JpdHkgb2YgbmVzdGVkIHJlc291cmNlIHNlbGVjdG9ycy48L2xpPgorICAgIDxsaT48YSBocmVmPSJzZWxlY3RvcnMuaHRtbCNtb2RpZmllZCI+bW9kaWZpZWQ8L2E+IC0gc2VsZWN0IHJlc291cmNlcyB3aGljaAorICAgICAgY29udGVudCBoYXMgY2hhbmdlZC48L2xpPgorICAgIDxsaT48YSBocmVmPSJzZWxlY3RvcnMuaHRtbCNjb250YWluc3NlbGVjdCI+Y29udGFpbnM8L2E+IC0gc2VsZWN0IHJlc291cmNlcyAKKyAgICAgIGNvbnRhaW5pbmcgYSBwYXJ0aWN1bGFyIHRleHQgc3RyaW5nLjwvbGk+CisgICAgPGxpPjxhIGhyZWY9InNlbGVjdG9ycy5odG1sI3JlZ2V4cHNlbGVjdCI+Y29udGFpbnNyZWdleHA8L2E+IC0gc2VsZWN0CisgICAgICByZXNvdXJjZXMgd2hvc2UgY29udGVudHMgbWF0Y2ggYSBwYXJ0aWN1bGFyIHJlZ3VsYXIgZXhwcmVzc2lvbi48L2xpPgorICAgIDxsaT48YSBocmVmPSIjcnNlbC5jb21wYXJlIj5jb21wYXJlPC9hPiAtIHNlbGVjdCByZXNvdXJjZXMKKyAgICAgIGJhc2VkIG9uIGNvbXBhcmlzb24gdG8gb3RoZXIgcmVzb3VyY2VzLjwvbGk+CisgIDwvdWw+CisKKyAgPGg0PjxhIG5hbWU9InJzZWwubmFtZSI+bmFtZTwvYT48L2g0PgorICA8cD5TZWxlY3RzIHJlc291cmNlcyBieSBuYW1lLjwvcD4KKyAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgcGF0dGVybiB0byB0ZXN0PC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgbmFtZSBjb21wYXJpc29ucyBhcmUgY2FzZS1zZW5zaXRpdmU8L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDQ+PGEgbmFtZT0icnNlbC5leGlzdHMiPmV4aXN0czwvYT48L2g0PgorICA8cD5TZWxlY3RzIGV4aXN0aW5nIHJlc291cmNlcy48L3A+CisKKyAgPGg0PjxhIG5hbWU9InJzZWwuZGF0ZSI+ZGF0ZTwvYT48L2g0PgorICA8cD5TZWxlY3RzIHJlc291cmNlcyBieSBkYXRlLjwvcD4KKyAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5taWxsaXM8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tcGFyaXNvbiBkYXRlL3RpbWUgaW4gbXMgc2luY2UgSmFudWFyeSAxLCAxOTcwPC90ZD4KKyAgICAgIDx0ZCByb3dzcGFuPSIyIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+T25lIG9mIHRoZXNlPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGF0ZXRpbWU8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZm9ybWF0dGVkIGNvbXBhcmlzb24gZGF0ZS90aW1lPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0dGVybjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNpbXBsZURhdGVGb3JtYXQtY29tcGF0aWJsZSBwYXR0ZXJuCisgICAgICAgIGZvciB1c2Ugd2l0aCB0aGUgPGNvZGU+ZGF0ZXRpbWU8L2NvZGU+IGF0dHJpYnV0ZTwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPgorICAgICAgICBObywgZGVmYXVsdCBpcyAiTU0vREQvWVlZWSBISDpNTSBBTV9vcl9QTSI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5ncmFudWxhcml0eTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byB1c2Ugd2hlbgorICAgICAgICBjb21wYXJpbmcgZmlsZSBtb2RpZmljYXRpb24gdGltZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugbm90CisgICAgICAgIGV2ZXJ5IGZpbGUgc3lzdGVtIHN1cHBvcnRzIHRyYWNraW5nIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgdG8KKyAgICAgICAgdGhlIG1pbGxpc2Vjb25kIGxldmVsLjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IHZhcmllcyBieSBwbGF0Zm9ybToKKyAgICAgICAgRkFUIGZpbGVzeXN0ZW1zID0gMiBzZWM7IFVuaXggPSAxIHNlYzsgTlRGUyA9IDEgbXMuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlbjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPk9uZSBvZiAiYmVmb3JlIiwgImFmdGVyIiwgImVxdWFsIjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICJlcXVhbCI8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGg0PjxhIG5hbWU9InJzZWwudHlwZSI+dHlwZTwvYT48L2g0PgorICA8cD5TZWxlY3RzIHJlc291cmNlcyBieSB0eXBlIChmaWxlIG9yIGRpcmVjdG9yeSkuPC9wPgorICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5PbmUgb2YgImZpbGUiLCAiZGlyIjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDQ+PGEgbmFtZT0icnNlbC5zaXplIj5zaXplPC9hPjwvaDQ+CisgIDxwPlNlbGVjdHMgcmVzb3VyY2VzIGJ5IHNpemUuPC9wPgorICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNpemU8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc2l6ZSB0byBjb21wYXJlPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlbjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPk9uZSBvZiAiZXF1YWwiLCAiZXEiLCAiZ3JlYXRlciIsICJndCIsICJsZXNzIiwgImx0IiwKKyAgICAgICAgImdlIiAoZ3JlYXRlciBvciBlcXVhbCksICJuZSIgKG5vdCBlcXVhbCksICJsZSIgKGxlc3Mgb3IgZXF1YWwpPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgImVxdWFsIjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDQ+PGEgbmFtZT0icnNlbC5pbnN0YW5jZW9mIj5pbnN0YW5jZW9mPC9hPjwvaDQ+CisgIDxwPlNlbGVjdHMgcmVzb3VyY2VzIGJ5IHR5cGUuPC9wPgorICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzIG9mIHdoaWNoIHRoZSByZXNvdXJjZSBtdXN0IGJlIGFuIGluc3RhbmNlPC90ZD4KKyAgICAgIDx0ZCByb3dzcGFuPSIyIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+T25lIG9mIHRoZXNlPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBBbnQgdHlwZSB0aGF0IG11c3QKKyAgICAgICAgYmUgYXNzaWduYWJsZSBmcm9tIHRoZSByZXNvdXJjZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPnVyaTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1cmkgaW4gd2hpY2ggPGk+dHlwZTwvaT4gbXVzdCBiZSBkZWZpbmVkPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGg0PjxhIG5hbWU9InJzZWwuYW5kIj5hbmQ8L2E+PC9oND4KKyAgPHA+U2VsZWN0cyBhIHJlc291cmNlIGlmIGl0IGlzIHNlbGVjdGVkIGJ5IGFsbCBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzLjwvcD4KKworICA8aDQ+PGEgbmFtZT0icnNlbC5vciI+b3I8L2E+PC9oND4KKyAgPHA+U2VsZWN0cyBhIHJlc291cmNlIGlmIGl0IGlzIHNlbGVjdGVkCisgICAgYnkgYXQgbGVhc3Qgb25lIG5lc3RlZCByZXNvdXJjZSBzZWxlY3Rvci48L3A+CisKKyAgPGg0PjxhIG5hbWU9InJzZWwubm90Ij5ub3Q8L2E+PC9oND4KKyAgPHA+TmVnYXRlcyB0aGUgc2VsZWN0aW9uIHJlc3VsdCBvZiB0aGUgc2luZ2xlCisgICAgbmVzdGVkIHJlc291cmNlIHNlbGVjdG9yIGFsbG93ZWQuPC9wPgorCisgIDxoND48YSBuYW1lPSJyc2VsLm5vbmUiPm5vbmU8L2E+PC9oND4KKyAgPHA+U2VsZWN0cyBhIHJlc291cmNlIGlmIGl0IGlzIHNlbGVjdGVkCisgICAgYnkgbm8gbmVzdGVkIHJlc291cmNlIHNlbGVjdG9ycy48L3A+CisKKyAgPGg0PjxhIG5hbWU9InJzZWwubWFqb3JpdHkiPm1ham9yaXR5PC9hPjwvaDQ+CisgIDxwPlNlbGVjdHMgYSByZXNvdXJjZSBpZiBpdCBpcyBzZWxlY3RlZAorICAgIGJ5IHRoZSBtYWpvcml0eSBvZiBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzLjwvcD4KKyAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5hbGxvd3RpZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgYSB0aWUgKHdoZW4gdGhlcmUgaXMgYW4gZXZlbiBudW1iZXIKKyAgICAgICAgb2YgbmVzdGVkIHJlc291cmNlIHNlbGVjdG9ycykgaXMgY29uc2lkZXJlZCBhIG1ham9yaXR5PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGg0PjxhIG5hbWU9InJzZWwuY29tcGFyZSI+Y29tcGFyZTwvYT48L2g0PgorICA8cD5TZWxlY3RzIGEgcmVzb3VyY2UgYmFzZWQgb24gaXRzIGNvbXBhcmlzb24gdG8gb25lIG9yIG1vcmUgImNvbnRyb2wiCisgICAgIHJlc291cmNlcyB1c2luZyBuZXN0ZWQgPGEgaHJlZj0iI3JjbXAiPnJlc291cmNlIGNvbXBhcmF0b3JzPC9hPi48L3A+CisgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlbjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbXBhcmlzb24gKCJlcXVhbCIvImVxIiwgImdyZWF0ZXIiLyJndCIsICJsZXNzIi8ibHQiLAorICAgICAgICAibGUiIChsZXNzIG9yIGVxdWFsKSwgImdlIiAoZ3JlYXRlciBvciBlcXVhbCksICJuZSIgKG5vdCBlcXVhbCkuPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgImVxdWFsIjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmFnYWluc3Q8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5RdWFudGlmaWVyICgiYWxsIi8iZWFjaCIvImV2ZXJ5IiwgImFueSIvInNvbWUiLAorICAgICAgICAoZXhhY3RseSkgIm9uZSIsICJtb3N0Ii8ibWFqb3JpdHkiLCAibm9uZSIuPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgImFsbCI8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgIDxoND5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g0PgorICA8cD5UaGUgcmVzb3VyY2VzIGFnYWluc3Qgd2hpY2ggY29tcGFyaXNvbnMgd2lsbCBiZSBtYWRlIG11c3QgYmUgc3BlY2lmaWVkCisgICAgdXNpbmcgdGhlIG5lc3RlZCAmbHQ7Y29udHJvbCZndDsgZWxlbWVudCwgd2hpY2ggZGVub3RlcyBhCisgICAgPGEgaHJlZj0iI3Jlc291cmNlcyI+cmVzb3VyY2VzPC9hPiBjb2xsZWN0aW9uLjwvcD4KKyAgPGg0PkV4YW1wbGVzPC9oND4KKyAgPHA+QXNzdW1pbmcgdGhlIG5hbWVzcGFjZSBzZXR0aW5ncworPHByZT48Y29kZT4gIHJzZWw9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIgorICByY21wPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzIgorPC9jb2RlPjwvcHJlPjwvcD4KKyAgPHByZT4KKyZsdDtyZXN0cmljdCZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSJzcmMiIGluY2x1ZGVzPSJhLGIsYyxkLGUsZixnIiAvJmd0OworICAmbHQ7cnNlbDpjb21wYXJlIHdoZW49ImxlIiBhZ2FpbnN0PSJhbGwiJmd0OworICAgICZsdDtjb250cm9sJmd0OworICAgICAgJmx0O3Jlc291cmNlIG5hbWU9ImQiIC8mZ3Q7CisgICAgJmx0Oy9jb250cm9sJmd0OworICAgICZsdDtyY21wOm5hbWUgLyZndDsKKyAgJmx0Oy9yc2VsOmNvbXBhcmUmZ3Q7CismbHQ7L3Jlc3RyaWN0Jmd0OworICA8L3ByZT4KKyAgPHA+U2VsZWN0cyBmaWxlcyBhLCBiLCBjLCBhbmQgZC48L3A+CisgIDxwcmU+CisgICAgJmx0O3Byb2plY3QgcnNlbD0mcXVvdDthbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyZxdW90OyZndDsKKyAgICAgICAgJmx0O21hY3JvZGVmIG5hbWU9JnF1b3Q7Y29weUZyb21QYXRoJnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O3RvZGlyJnF1b3Q7LyZndDsKKyAgICAgICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtyZWZpZCZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSZxdW90O25lc3RlZC1yZXNvdXJjZS1zZWxlY3RvcnMmcXVvdDsgb3B0aW9uYWw9JnF1b3Q7eWVzJnF1b3Q7IGltcGxpY2l0PSZxdW90O3RydWUmcXVvdDsvJmd0OworICAgICAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O21rZGlyIGRpcj0mcXVvdDtAe3RvZGlyfSZxdW90OyB0YXNrbmFtZT0mcXVvdDtjb3B5RnJvbVBhdGgmcXVvdDsvJmd0OworICAgICAgICAgICAgICAgICZsdDtjb3B5IHRvZGlyPSZxdW90O0B7dG9kaXJ9JnF1b3Q7IHRhc2tuYW1lPSZxdW90O2NvcHlGcm9tUGF0aCZxdW90OyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3Jlc3RyaWN0Jmd0OworICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3BhdGggcmVmaWQ9JnF1b3Q7QHtyZWZpZH0mcXVvdDsvJmd0OworICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3JzZWw6b3ImZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O25lc3RlZC1yZXNvdXJjZS1zZWxlY3RvcnMvJmd0OworICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy9yc2VsOm9yJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7L3Jlc3RyaWN0Jmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7ZmxhdHRlbm1hcHBlci8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9jb3B5Jmd0OworICAgICAgICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworICAgICAgICAmbHQ7L21hY3JvZGVmJmd0OworICAgICAgICAmbHQ7Y29weUZyb21QYXRoIHJlZmlkPSZxdW90O2NsYXNzcGF0aCZxdW90OyB0b2Rpcj0mcXVvdDt0b2RpciZxdW90OyZndDsKKyAgICAgICAgICAgICZsdDtyc2VsOm5hbWUgbmFtZT0mcXVvdDtsb2c0ai5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKyAgICAgICAgICAgICZsdDtyc2VsOm5hbWUgbmFtZT0mcXVvdDtkZWZhdWx0LnByb3BlcnRpZXMmcXVvdDsvJmd0OworICAgICAgICAmbHQ7L2NvcHlGcm9tUGF0aCZndDsKKyAgICAgJmx0Oy9wcm9qZWN0Jmd0OworICA8L3ByZT4KKyAgPHA+Q3JlYXRlcyB0aGUgPHR0PnRvZGlyPC90dD4gZGlyZWN0b3J5IGFuZCBjb3BpZXMgKGlmIHByZXNlbnQpIHRoZQorICAgICBmaWxlcyA8dHQ+bG9nNGoucHJvcGVydGllczwvdHQ+IGFuZCA8dHQ+ZGVmYXVsdC5wcm9wZXJ0aWVzPC90dD4KKyAgICAgZnJvbSB0aGUgQ2xhc3NwYXRoIChhbHJlYWR5IHVzZWQgd2hpbGUgY29tcGlsaW5nKS4KKyAgPC9wPgorCis8L2Jsb2NrcXVvdGU+CisKKzxoND48YSBuYW1lPSJzb3J0Ij5zb3J0PC9hPjwvaDQ+CisKKzxwPlNvcnRzIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSByZXNvdXJjZXMnCisgICBuYXR1cmFsIG9yZGVyLCBvciBieSBvbmUgb3IgbW9yZSBuZXN0ZWQgPGEgaHJlZj0iI3JjbXAiPnJlc291cmNlCisgICBjb21wYXJhdG9yczwvYT46PC9wPgorPGJsb2NrcXVvdGU+CisgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FjaGU8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNhY2hlIHJlc3VsdHM7IGRpc2FibGluZworICAgICAgICBtYXkgc2VyaW91c2x5IGltcGFjdCBwZXJmb3JtYW5jZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDxpPnRydWU8L2k+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICA8aDQ+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oND4KKyAgPHA+QSBzaW5nbGUgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZC48L3A+CisgIDxwPlRoZSBzb3J0IGNhbiBiZSBjb250cm9sbGVkIGFuZCBjdXN0b21pemVkIGJ5IHNwZWNpZnlpbmcgb25lIG9yIG1vcmUKKyAgICByZXNvdXJjZSBjb21wYXJhdG9ycy4gUmVzb3VyY2VzIGNhbiBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvIG11bHRpcGxlCisgICAgY3JpdGVyaWE7IHRoZSBmaXJzdCBzcGVjaWZpZWQgaXMgdGhlICJvdXRlcm1vc3QiLCB3aGlsZSB0aGUgbGFzdAorICAgIHNwZWNpZmllZCBpcyB0aGUgImlubmVybW9zdCIuIFNldmVyYWwgYnVpbHQtaW4gcmVzb3VyY2UgY29tcGFyYXRvcnMKKyAgICBhcmUgYXZhaWxhYmxlIGluIHRoZSBpbnRlcm5hbCA8YSBocmVmPSJhbnRsaWIuaHRtbCI+YW50bGliPC9hPgorICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9yczwvY29kZT46CisgIDwvcD4KKyAgPGg0PjxhIG5hbWU9InJjbXAiPlJlc291cmNlIENvbXBhcmF0b3JzOjwvYT48L2g0PgorICA8dWw+CisgICAgPGxpPjxhIGhyZWY9IiNyY21wLm5hbWUiPm5hbWU8L2E+IC0gc29ydCByZXNvdXJjZXMgYnkgbmFtZTwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyY21wLmV4aXN0cyI+ZXhpc3RzPC9hPiAtIHNvcnQgcmVzb3VyY2VzIGJ5IGV4aXN0ZW5jZTwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyY21wLmRhdGUiPmRhdGU8L2E+IC0gc29ydCByZXNvdXJjZXMgYnkgZGF0ZTwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyY21wLnR5cGUiPnR5cGU8L2E+IC0gc29ydCByZXNvdXJjZXMgYnkgdHlwZTwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyY21wLnNpemUiPnNpemU8L2E+IC0gc29ydCByZXNvdXJjZXMgYnkgc2l6ZTwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyY21wLmNvbnRlbnQiPmNvbnRlbnQ8L2E+IC0gc29ydCByZXNvdXJjZXMgYnkgY29udGVudDwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNyY21wLnJldmVyc2UiPnJldmVyc2U8L2E+IC0gcmV2ZXJzZSB0aGUgbmF0dXJhbCBzb3J0IG9yZGVyLAorICAgICAgb3IgdGhhdCBvZiBhIHNpbmdsZSBuZXN0ZWQgcmVzb3VyY2UgY29tcGFyYXRvcjwvbGk+CisgIDwvdWw+CisKKyAgPGg0PjxhIG5hbWU9InJjbXAubmFtZSI+bmFtZTwvYT48L2g0PgorICA8cD5Tb3J0IHJlc291cmNlcyBieSBuYW1lLjwvcD4KKworICA8aDQ+PGEgbmFtZT0icmNtcC5leGlzdHMiPmV4aXN0czwvYT48L2g0PgorICA8cD5Tb3J0IHJlc291cmNlcyBieSBleGlzdGVuY2UuCisgICAgTm90IGV4aXN0aW5nIGlzIGNvbnNpZGVyZWQgImxlc3MgdGhhbiIgZXhpc3RpbmcuPC9wPgorCisgIDxoND48YSBuYW1lPSJyY21wLmRhdGUiPmRhdGU8L2E+PC9oND4KKyAgPHA+U29ydCByZXNvdXJjZXMgYnkgZGF0ZS48L3A+CisKKyAgPGg0PjxhIG5hbWU9InJjbXAudHlwZSI+dHlwZTwvYT48L2g0PgorICA8cD5Tb3J0IHJlc291cmNlcyBieSB0eXBlIChmaWxlIG9yIGRpcmVjdG9yeSkuCisgICAgQmVjYXVzZSBkaXJlY3RvcmllcyBjb250YWluIGZpbGVzLCB0aGV5IGFyZSBjb25zaWRlcmVkICJncmVhdGVyIi48L3A+CisKKyAgPGg0PjxhIG5hbWU9InJjbXAuc2l6ZSI+c2l6ZTwvYT48L2g0PgorICA8cD5Tb3J0IHJlc291cmNlcyBieSBzaXplLjwvcD4KKworICA8aDQ+PGEgbmFtZT0icmNtcC5jb250ZW50Ij5jb250ZW50PC9hPjwvaDQ+CisgIDxwPlNvcnQgcmVzb3VyY2VzIGJ5IGNvbnRlbnQuPC9wPgorICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmJpbmFyeTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgY29udGVudCBzaG91bGQgYmUgY29tcGFyZWQgaW4gYmluYXJ5IG1vZGUuCisgICAgICAgIElmIDxpPmZhbHNlPGk+LCBjb250ZW50IHdpbGwgYmUgY29tcGFyZWQgd2l0aG91dCByZWdhcmQgdG8KKyAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgbGluZS1lbmRpbmcgY29udmVudGlvbnMuPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGg0PjxhIG5hbWU9InJjbXAucmV2ZXJzZSI+cmV2ZXJzZTwvYT48L2g0PgorICA8cD5SZXZlcnNlIHRoZSBuYXR1cmFsIHNvcnQgb3JkZXIsIG9yIHRoYXQgb2YgYSBzaW5nbGUgbmVzdGVkIGNvbXBhcmF0b3IuPC9wPgorCisgIDxoND5FeGFtcGxlczwvaDQ+CisgIDxwcmU+CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7ZW9sJnF1b3Q7IHZhbHVlPSZxdW90OyR7bGluZS5zZXBhcmF0b3J9JnF1b3Q7IC8mZ3Q7CisgICAgJmx0O3BhdGhjb252ZXJ0IHByb3BlcnR5PSZxdW90O3NvcnRlZCZxdW90OyBwYXRoc2VwPSZxdW90OyR7ZW9sfSZxdW90OyZndDsKKyAgICAgICZsdDtzb3J0Jmd0OworICAgICAgICAmbHQ7dG9rZW5zJmd0OworICAgICAgICAgICZsdDtzdHJpbmcgdmFsdWU9JnF1b3Q7Zm9vIGJhciBldGMgYmF6JnF1b3Q7IC8mZ3Q7CisgICAgICAgICAgJmx0O3N0cmluZ3Rva2VuaXplciAvJmd0OworICAgICAgICAmbHQ7L3Rva2VucyZndDsKKyAgICAgICZsdDsvc29ydCZndDsKKyAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OzwvcHJlPgorICA8cD5UaGUgcmVzb3VyY2Ugb2YgdHlwZSBzdHJpbmcgJnF1b3Q7Zm9vIGJhciBldGMgYmF6JnF1b3Q7IGlzIHNwbGl0IGludG8gZm91ciB0b2tlbnMgYnkgCisgIHRoZSBzdHJpbmd0b2tlbml6ZXIuIFRoZXNlIHRva2VucyBhcmUgc29ydGVkIGFuZCB0aGVyZSA8aT5zb3J0ZWQ8L2k+IGdldHMgdGhlIHZhbHVlCisgIG9mICZxdW90O2JhciBiYXogZXRjIGZvbyZxdW90Oy48L3A+CisgIAorICA8cHJlPgorICAgICZsdDtzb3J0Jmd0OworICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2ZvbyZxdW90OyAvJmd0OworICAgICAgJmx0O3JldmVyc2UgeG1sbnM9JnF1b3Q7YW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycyZxdW90OyZndDsKKyAgICAgICAgJmx0O2RhdGUgLyZndDsKKyAgICAgICZsdDsvcmV2ZXJzZSZndDsKKyAgICAmbHQ7L3NvcnQmZ3Q7PC9wcmU+CisgIDxwPlRoaXMgdGFrZXMgYWxsIGZpbGVzIGZyb20gPGk+Zm9vPC9pPgorICAgICBhbmQgc29ydHMgdGhlbSBieSBtb2RpZmljYXRpb24gZGF0ZSBpbiByZXZlcnNlIG9yZGVyLgorICAgICBCZWNhdXNlIHRoZSByZXNvdXJjZSBjb21wYXJhdG9ycyB1c2VkICg8Y29kZT4mbHQ7cmV2ZXJzZSZndDs8L2NvZGU+CisgICAgIGFuZCA8Y29kZT4mbHQ7ZGF0ZSZndDs8L2NvZGU+KSBhcmUgaW4gYW4gaW50ZXJuYWwgYW50bGliCisgICAgIHRoZWlyIG5hbWVzcGFjZSBtdXN0IGJlIHNldCBleHBsaWNpdGx5LgorICA8L3A+CisKKzwvYmxvY2txdW90ZT4KKworPGg0PjxhIG5hbWU9ImZpcnN0Ij5maXJzdDwvYT48L2g0PgorPHA+SW5jbHVkZXMgdGhlIGZpcnN0IDxpPmNvdW50PC9pPiByZXNvdXJjZXMgZnJvbSBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uLgorVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSA8YSBocmVmPSIjc29ydCI+c29ydDwvYT4gY29sbGVjdGlvbiwKK2ZvciBleGFtcGxlLCB0byBzZWxlY3QgdGhlIGZpcnN0IGZldyBvbGRlc3QsIGxhcmdlc3QsIGV0Yy4gcmVzb3VyY2VzIGZyb20gYQorbGFyZ2VyIGNvbGxlY3Rpb24uPC9wPgorPGJsb2NrcXVvdGU+CisgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y291bnQ8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIHJlc291cmNlcyB0byBpbmNsdWRlPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgMTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNhY2hlPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBjYWNoZSByZXN1bHRzOyBkaXNhYmxpbmcKKyAgICAgICAgbWF5IHNlcmlvdXNseSBpbXBhY3QgcGVyZm9ybWFuY2U8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgPGg0PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDQ+CisgIDxwPkEgc2luZ2xlIHJlc291cmNlIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQuPC9wPgorPC9ibG9ja3F1b3RlPgorCis8aDQ+PGEgbmFtZT0ibGFzdCI+bGFzdDwvYT48L2g0PgorPHA+SW5jbHVkZXMgdGhlIGxhc3QgPGk+Y291bnQ8L2k+IHJlc291cmNlcyBmcm9tIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24uCitUaGlzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIDxhIGhyZWY9IiNzb3J0Ij5zb3J0PC9hPiBjb2xsZWN0aW9uLAorZm9yIGV4YW1wbGUsIHRvIHNlbGVjdCB0aGUgbGFzdCBmZXcgb2xkZXN0LCBsYXJnZXN0LCBldGMuIHJlc291cmNlcyBmcm9tIGEKK2xhcmdlciBjb2xsZWN0aW9uLiA8c3Ryb25nPlNpbmNlIEFudCAxLjcuMTwvc3Ryb25nPi48L3A+Cis8YmxvY2txdW90ZT4KKyAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5jb3VudDwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHRvIGluY2x1ZGU8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCAxPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FjaGU8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNhY2hlIHJlc3VsdHM7IGRpc2FibGluZworICAgICAgICBtYXkgc2VyaW91c2x5IGltcGFjdCBwZXJmb3JtYW5jZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDxpPnRydWU8L2k+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICA8aDQ+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oND4KKyAgPHA+QSBzaW5nbGUgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZC48L3A+Cis8L2Jsb2NrcXVvdGU+CisKKzxoND48YSBuYW1lPSJ0b2tlbnMiPnRva2VuczwvYT48L2g0PgorPHA+SW5jbHVkZXMgdGhlIDxhIGhyZWY9IiNzdHJpbmciPnN0cmluZzwvYT4gdG9rZW5zIGdhdGhlcmVkIGZyb20gYSBuZXN0ZWQKKyByZXNvdXJjZSBjb2xsZWN0aW9uLiBVc2VzIHRoZSBzYW1lIHRva2VuaXplcnMgc3VwcG9ydGVkIGJ5IHRoZQorPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCN0b2tlbmZpbHRlciI+VG9rZW5GaWx0ZXI8L2E+LiBIaW50OiBpbWFnaW5hdGl2ZQorICB1c2Ugb2YgdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uIGNhbiBpbXBsZW1lbnQgZXF1aXZhbGVudHMgZm9yIHN1Y2ggVW5peAorICBmdW5jdGlvbnMgYXMgPGNvZGU+c29ydDwvY29kZT4sIDxjb2RlPmdyZXAgLWM8L2NvZGU+LCA8Y29kZT53YzwvY29kZT4gYW5kCisgIDxjb2RlPndjIC1sPC9jb2RlPi48L3A+Cis8YmxvY2txdW90ZT4KKyAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyBvZiB0aGUgbmVzdGVkIHJlc291cmNlczwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIHBsYXRmb3JtIGRlZmF1bHQ8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5jYWNoZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZGlzYWJsaW5nCisgICAgICAgIG1heSBzZXJpb3VzbHkgaW1wYWN0IHBlcmZvcm1hbmNlPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgIDxoND5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g0PgorICA8dWw+CisgICAgPGxpPkEgc2luZ2xlIHJlc291cmNlIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQuPC9saT4KKyAgICA8bGk+T25lIG5lc3RlZCB0b2tlbml6ZXIgbWF5IGJlIHNwZWNpZmllZC4gIElmIG9taXR0ZWQsIGEKKyAgICAgICAgPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCNsaW5ldG9rZW5pemVyIj5MaW5lVG9rZW5pemVyPC9hPiB3aWxsIGJlIHVzZWQuCisgICAgPC9saT4KKyAgPC91bD4KKzwvYmxvY2txdW90ZT4KKworPGg0PjxhIG5hbWU9InNldGxvZ2ljIj5TZXQgb3BlcmF0aW9uczwvYT48L2g0PgorPGJsb2NrcXVvdGU+CisgIDxwPlRoZSBmb2xsb3dpbmcgcmVzb3VyY2UgY29sbGVjdGlvbnMgaW1wbGVtZW50IHNldCBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICAgIDxsaT48YSBocmVmPSIjdW5pb24iPnVuaW9uPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNpbnRlcnNlY3QiPmludGVyc2VjdDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSIjZGlmZmVyZW5jZSI+ZGlmZmVyZW5jZTwvYT48L2xpPgorICA8L3VsPgorCisgIDxoND48YSBuYW1lPSJ1bmlvbiI+dW5pb248L2E+PC9oND4KKyAgPHA+VW5pb24gb2YgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zLjwvcD4KKworICA8aDQ+PGEgbmFtZT0iaW50ZXJzZWN0Ij5pbnRlcnNlY3Q8L2E+PC9oND4KKyAgPHA+SW50ZXJzZWN0aW9uIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9ucy48L3A+CisKKyAgPGg0PjxhIG5hbWU9ImRpZmZlcmVuY2UiPmRpZmZlcmVuY2U8L2E+PC9oND4KKyAgPHA+RGlmZmVyZW5jZSBvZiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMuPC9wPgorCisgIDxwPlRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcHBseSB0byBhbGwgc2V0LW9wZXJhdGlvbiByZXNvdXJjZSBjb2xsZWN0aW9uczoKKyAgPC9wPgorICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNhY2hlPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBjYWNoZSByZXN1bHRzOyBkaXNhYmxpbmcKKyAgICAgICAgbWF5IHNlcmlvdXNseSBpbXBhY3QgcGVyZm9ybWFuY2U8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgCisgIDxoND5FeGFtcGxlczwvaDQ+CisgIDxwcmU+CisgICAgJmx0O3Jlc291cmNlcyBpZD0mcXVvdDtBJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7c3RyaW5nIHZhbHVlPSZxdW90O2EmcXVvdDsvJmd0OworICAgICAgICAmbHQ7c3RyaW5nIHZhbHVlPSZxdW90O2ImcXVvdDsvJmd0OworICAgICZsdDsvcmVzb3VyY2VzJmd0OworICAgICZsdDtyZXNvdXJjZXMgaWQ9JnF1b3Q7QiZxdW90OyZndDsKKyAgICAgICAgJmx0O3N0cmluZyB2YWx1ZT0mcXVvdDtiJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3N0cmluZyB2YWx1ZT0mcXVvdDtjJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3Jlc291cmNlcyZndDsKKyAgICAmbHQ7dW5pb24gaWQ9JnF1b3Q7dW5pb24mcXVvdDsmZ3Q7Jmx0O3Jlc291cmNlcyByZWZpZD0mcXVvdDtBJnF1b3Q7LyZndDsmbHQ7cmVzb3VyY2VzIHJlZmlkPSZxdW90O0ImcXVvdDsvJmd0OyZsdDsvdW5pb24mZ3Q7CisgICAgJmx0O2ludGVyc2VjdCBpZD0mcXVvdDtpbnRlcnNlY3QmcXVvdDsmZ3Q7Jmx0O3Jlc291cmNlcyByZWZpZD0mcXVvdDtBJnF1b3Q7LyZndDsmbHQ7cmVzb3VyY2VzIHJlZmlkPSZxdW90O0ImcXVvdDsvJmd0OyZsdDsvaW50ZXJzZWN0Jmd0OworICAgICZsdDtkaWZmZXJlbmNlIGlkPSZxdW90O2RpZmZlcmVuY2UmcXVvdDsmZ3Q7Jmx0O3Jlc291cmNlcyByZWZpZD0mcXVvdDtBJnF1b3Q7LyZndDsmbHQ7cmVzb3VyY2VzIHJlZmlkPSZxdW90O0ImcXVvdDsvJmd0OyZsdDsvZGlmZmVyZW5jZSZndDsKKyAgICAmbHQ7ZWNobyZndDsKKyAgICAgIEE6ICR7dG9TdHJpbmc6QX0gICAgICAgICAgICAgICAgICAgID0gYTtiCisgICAgICBCOiAke3RvU3RyaW5nOkJ9ICAgICAgICAgICAgICAgICAgICA9IGI7YworCisgICAgICB1bmlvbiAgICAgOiAke3RvU3RyaW5nOnVuaW9ufSAgICAgICA9IGE7YjtjCisgICAgICBpbnRlcnNlY3QgOiAke3RvU3RyaW5nOmludGVyc2VjdH0gICA9IGIKKyAgICAgIGRpZmZlcmVuY2U6ICR7dG9TdHJpbmc6ZGlmZmVyZW5jZX0gID0gYTtjCisgICAgJmx0Oy9lY2hvJmd0OworICA8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9zZWxlY3RvcnMtcHJvZ3JhbS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL3NlbGVjdG9ycy1wcm9ncmFtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQwYjNkMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9zZWxlY3RvcnMtcHJvZ3JhbS5odG1sCkBAIC0wLDAgKzEsMjY0IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UHJvZ3JhbW1pbmcgU2VsZWN0b3JzIGluIEFudDwvdGl0bGU+CisgIDwvaGVhZD4KKworICA8Ym9keT4KKyAgICA8aDI+UHJvZ3JhbW1pbmcgeW91ciBvd24gU2VsZWN0b3JzPC9oMj4KKworICAgIDxoMz5TZWxlY3RvciBQcm9ncmFtbWluZyBBUEk8L2gzPgorCisgICAgPHA+V2FudCB0byBkZWZpbmUgeW91ciBvd24gc2VsZWN0b3JzPyBJdCdzIGVhc3khPC9wPgorCisgICAgPHA+Rmlyc3QsIHBpY2sgdGhlIHR5cGUgb2Ygc2VsZWN0b3IgdGhhdCB5b3Ugd2FudCB0byBkZWZpbmUuIFRoZXJlCisgICAgYXJlIHRocmVlIHR5cGVzLCBhbmQgYSByZWNpcGUgZm9yIGVhY2ggb25lIGZvbGxvd3MuIENoYW5jZXMgYXJlCisgICAgeW91J2xsIHdhbnQgdG8gd29yayB3aXRoIHRoZSBmaXJzdCBvbmUsIEN1c3RvbSBTZWxlY3RvcnMuPC9wPgorCisgICAgPG9sPgorICAgICAgPGxpPkN1c3RvbSBTZWxlY3RvcnMKKworICAgICAgICA8cD5UaGlzIGlzIHRoZSBjYXRlZ29yeSB0aGF0IEFudCBwcm92aWRlcyBzcGVjaWZpY2FsbHkgZm9yIHlvdSB0bworICAgICAgICBkZWZpbmUgeW91ciBvd24gU2VsZWN0b3JzLiBBbnl3aGVyZSB5b3Ugd2FudCB0byB1c2UgeW91ciBzZWxlY3RvcgorICAgICAgICB5b3UgdXNlIHRoZSA8Y29kZT4mbHQ7Y3VzdG9tJmd0OzwvY29kZT4gZWxlbWVudCBhbmQgc3BlY2lmeQorICAgICAgICB0aGUgY2xhc3MgbmFtZSBvZiB5b3VyIHNlbGVjdG9yIHdpdGhpbiBpdC4gU2VlIHRoZQorICAgICAgICA8YSBocmVmPSJzZWxlY3RvcnMuaHRtbCNjdXN0b21zZWxlY3QiPkN1c3RvbSBTZWxlY3RvcnM8L2E+CisgICAgICAgIHNlY3Rpb24gb2YgdGhlIFNlbGVjdG9yIHBhZ2UgZm9yIGRldGFpbHMuIFRoZQorICAgICAgICA8Y29kZT4mbHQ7Y3VzdG9tJmd0OzwvY29kZT4gZWxlbWVudCBjYW4gYmUgdXNlZCBhbnl3aGVyZQorICAgICAgICB0aGUgY29yZSBzZWxlY3RvcnMgY2FuIGJlIHVzZWQuIEl0IGNhbiBiZSBjb250YWluZWQgd2l0aGluCisgICAgICAgIDxhIGhyZWY9InNlbGVjdG9ycy5odG1sI3NlbGVjdGNvbnRhaW5lcnMiPlNlbGVjdG9yIENvbnRhaW5lcnM8L2E+LAorICAgICAgICBmb3IgZXhhbXBsZS48L3A+CisKKyAgICAgICAgPHA+VG8gY3JlYXRlIGEgbmV3IEN1c3RvbSBTZWxlY3RvciwgeW91IGhhdmUgdG8gY3JlYXRlIGEgY2xhc3MgdGhhdAorICAgICAgICBpbXBsZW1lbnRzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5FeHRlbmRGaWxlU2VsZWN0b3I8L2NvZGU+LgorICAgICAgICBUaGUgZWFzaWVzdCB3YXkgdG8gZG8gdGhhdCBpcyB0aHJvdWdoIHRoZSBjb252ZW5pZW5jZSBiYXNlIGNsYXNzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlRXh0ZW5kU2VsZWN0b3I8L2NvZGU+LAorICAgICAgICB3aGljaCBwcm92aWRlcyBhbGwgb2YgdGhlIG1ldGhvZHMgZm9yIHN1cHBvcnRpbmcKKyAgICAgICAgPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4gdGFncy4gRmlyc3QsIG92ZXJyaWRlIHRoZQorICAgICAgICA8Y29kZT5pc1NlbGVjdGVkKCk8L2NvZGU+IG1ldGhvZCwgYW5kIG9wdGlvbmFsbHkgdGhlCisgICAgICAgIDxjb2RlPnZlcmlmeVNldHRpbmdzKCk8L2NvZGU+IG1ldGhvZC4gSWYgeW91ciBjdXN0b20KKyAgICAgICAgc2VsZWN0b3IgcmVxdWlyZXMgcGFyYW1ldGVycyB0byBiZSBzZXQsIHlvdSBjYW4gYWxzbyBvdmVycmlkZQorICAgICAgICB0aGUgPGNvZGU+c2V0UGFyYW1ldGVycygpPC9jb2RlPiBtZXRob2QgYW5kIGludGVycHJldCB0aGUKKyAgICAgICAgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgaW4gYW55IHdheSB5b3UgbGlrZS4gU2V2ZXJhbCBvZiB0aGUKKyAgICAgICAgY29yZSBzZWxlY3RvcnMgZGVtb25zdHJhdGUgaG93IHRvIGRvIHRoYXQgYmVjYXVzZSB0aGV5IGNhbgorICAgICAgICBhbHNvIGJlIHVzZWQgYXMgY3VzdG9tIHNlbGVjdG9ycy48L3A+CisKKyAgICAgIDxsaT5Db3JlIFNlbGVjdG9ycworCisgICAgICAgIDxwPlRoZXNlIGFyZSB0aGUgc2VsZWN0b3JzIHVzZWQgYnkgQW50IGl0c2VsZi4gVG8gaW1wbGVtZW50IG9uZSBvZgorICAgICAgICB0aGVzZSwgeW91IHdpbGwgaGF2ZSB0byBhbHRlciBzb21lIG9mIHRoZSBjbGFzc2VzIGNvbnRhaW5lZCB3aXRoaW4KKyAgICAgICAgQW50LjwvcD4KKworICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPjxwPkZpcnN0LCBjcmVhdGUgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMKKyAgICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I8L2NvZGU+LgorICAgICAgICAgICAgWW91IGNhbiBlaXRoZXIgY2hvb3NlIHRvIGltcGxlbWVudCBhbGwgbWV0aG9kcyB5b3Vyc2VsZiBmcm9tCisgICAgICAgICAgICBzY3JhdGNoLCBvciB5b3UgY2FuIGV4dGVuZAorICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvcjwvY29kZT4KKyAgICAgICAgICAgIGluc3RlYWQsIGEgY29udmVuaWVuY2UgY2xhc3MgdGhhdCBwcm92aWRlcyByZWFzb25hYmxlIGRlZmF1bHQKKyAgICAgICAgICAgIGJlaGF2aW91ciBmb3IgbWFueSBtZXRob2RzLjwvcD4KKworICAgICAgICAgICAgPHA+VGhlcmUgaXMgb25seSBvbmUgbWV0aG9kIHJlcXVpcmVkLgorICAgICAgICAgICAgPGNvZGU+cHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgRmlsZSBmaWxlKTwvY29kZT4KKyAgICAgICAgICAgICAgaXMgdGhlIHJlYWwgcHVycG9zZSBvZiB0aGUgd2hvbGUgZXhlcmNpc2UuIEl0IHJldHVybnMgdHJ1ZQorICAgICAgICAgICAgICBvciBmYWxzZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBzaG91bGQgYmUKKyAgICAgICAgICAgICAgc2VsZWN0ZWQgZnJvbSB0aGUgbGlzdCBvciBub3QuPC9wPgorCisgICAgICAgICAgICA8cD5JZiB5b3UgYXJlIHVzaW5nCisgICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZVNlbGVjdG9yPC9jb2RlPgorICAgICAgICAgICAgdGhlcmUgYXJlIGFsc28gc29tZSBwcmVkZWZpbmVkIGJlaGF2aW91cnMgeW91IGNhbiB0YWtlIGFkdmFudGFnZQorICAgICAgICAgICAgb2YuIEFueSB0aW1lIHlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHdoZW4gc2V0dGluZyBhdHRyaWJ1dGVzIG9yCisgICAgICAgICAgICBhZGRpbmcgdGFncywgeW91IGNhbiBjYWxsIHNldEVycm9yKFN0cmluZyBlcnJtc2cpIGFuZCB0aGUgY2xhc3MKKyAgICAgICAgICAgIHdpbGwga25vdyB0aGF0IHRoZXJlIGlzIGEgcHJvYmxlbS4gVGhlbiwgYXQgdGhlIHRvcCBvZiB5b3VyCisgICAgICAgICAgICA8Y29kZT5pc1NlbGVjdGVkKCk8L2NvZGU+IG1ldGhvZCBjYWxsIDxjb2RlPnZhbGlkYXRlKCk8L2NvZGU+IGFuZAorICAgICAgICAgICAgYSBCdWlsZEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biB3aXRoIHRoZSBjb250ZW50cyBvZiB5b3VyIGVycm9yCisgICAgICAgICAgICBtZXNzYWdlLiBUaGUgPGNvZGU+dmFsaWRhdGUoKTwvY29kZT4gbWV0aG9kIGFsc28gZ2l2ZXMgeW91IGEKKyAgICAgICAgICAgIGxhc3QgY2hhbmNlIHRvIGNoZWNrIHlvdXIgc2V0dGluZ3MgZm9yIGNvbnNpc3RlbmN5IGJlY2F1c2UgaXQKKyAgICAgICAgICAgIGNhbGxzIDxjb2RlPnZlcmlmeVNldHRpbmdzKCk8L2NvZGU+LiBPdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQKKyAgICAgICAgICAgIGNhbGwgPGNvZGU+c2V0RXJyb3IoKTwvY29kZT4gd2l0aGluIGl0IGlmIHlvdSBkZXRlY3QgYW55CisgICAgICAgICAgICBwcm9ibGVtcyBpbiBob3cgeW91ciBzZWxlY3RvciBpcyBzZXQgdXAuPC9wPgorCisgICAgICAgICAgICA8cD5Zb3UgbWF5IGFsc28gd2FudCB0byBvdmVycmlkZSA8Y29kZT50b1N0cmluZygpPC9jb2RlPi48L3A+CisKKyAgICAgICAgICA8bGk+PHA+UHV0IGFuIDxjb2RlPmFkZDwvY29kZT4gbWV0aG9kIGZvciB5b3VyIHNlbGVjdG9yIGluCisgICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LgorICAgICAgICAgICAgVGhpcyBpcyBhbiBpbnRlcmZhY2UsIHNvIHlvdSB3aWxsIGFsc28gaGF2ZSB0byBhZGQgYW4gaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIGZvciB0aGUgbWV0aG9kIGluIHRoZSBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCBpdCwgbmFtZWx5CisgICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5BYnN0cmFjdEZpbGVTZXQ8L2NvZGU+LAorICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrPC9jb2RlPiBhbmQKKyAgICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LgorICAgICAgICAgICAgT25jZSBpdCBpcyBpbiB0aGVyZSwgaXQgd2lsbCBiZSBhdmFpbGFibGUgZXZlcnl3aGVyZSB0aGF0IGNvcmUKKyAgICAgICAgICAgIHNlbGVjdG9ycyBhcmUgYXBwcm9wcmlhdGUuPC9wPgorICAgICAgICA8L3VsPgorCisgICAgICA8bGk+U2VsZWN0b3IgQ29udGFpbmVycworICAgICAgICA8cD5Hb3QgYW4gaWRlYSBmb3IgYSBuZXcgU2VsZWN0b3IgQ29udGFpbmVyPyBDcmVhdGluZyBhIG5ldyBvbmUgaXMKKyAgICAgICAgbm8gcHJvYmxlbTo8L3A+CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+PHA+Q3JlYXRlIGEgbmV3IGNsYXNzIHRoYXQgaW1wbGVtZW50cworICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNlbGVjdG9yQ29udGFpbmVyPC9jb2RlPi4KKyAgICAgICAgICAgIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB5b3VyIG5ldworICAgICAgICAgICAgQ29udGFpbmVyIGNhbiBhY2Nlc3MgYW55IG5ldyBzZWxlY3RvcnMgdGhhdCBjb21lIGFsb25nLiBBZ2FpbiwgdGhlcmUKKyAgICAgICAgICAgIGlzIGEgY29udmVuaWVuY2UgY2xhc3MgYXZhaWxhYmxlIGZvciB5b3UgY2FsbGVkCisgICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZVNlbGVjdG9yQ29udGFpbmVyPC9jb2RlPi4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICA8bGk+PHA+SW1wbGVtZW50IHRoZQorICAgICAgICAgICAgPGNvZGU+cHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSk8L2NvZGU+CisgICAgICAgICAgICBtZXRob2QgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLiBDaGFuY2VzIGFyZSB5b3UnbGwgd2FudCB0byBpdGVyYXRlCisgICAgICAgICAgICBvdmVyIHRoZSBzZWxlY3RvcnMgdW5kZXIgeW91LCBzbyB1c2UKKyAgICAgICAgICAgIDxjb2RlPnNlbGVjdG9yRWxlbWVudHMoKTwvY29kZT4gdG8gZ2V0IGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBkbworICAgICAgICAgICAgdGhhdC48L3A+CisgICAgICAgICAgPGxpPjxwPkFnYWluLCBwdXQgYW4gPGNvZGU+YWRkPC9jb2RlPiBtZXRob2QgZm9yIHlvdXIgY29udGFpbmVyIGluCisgICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JDb250YWluZXI8L2NvZGU+CisgICAgICAgICAgICBhbmQgaXRzIGltcGxlbWVudGF0aW9ucworICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQWJzdHJhY3RGaWxlU2V0PC9jb2RlPiBhbmQKKyAgICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LgorICAgICAgICAgICAgPC9wPgorICAgICAgICA8L3VsPgorICAgIDwvb2w+CisKKyAgICA8aDM+VGVzdGluZyBTZWxlY3RvcnM8L2gzPgorCisgICAgPHA+Rm9yIGEgcm9idXN0IGNvbXBvbmVudCAoYW5kIHNlbGVjdG9ycyBhcmUgKFByb2plY3QpQ29tcG9uZW50cykgdGVzdHMgYXJlCisgICAgbmVjZXNzYXJ5LiBGb3IgdGVzdGluZyBUYXNrcyB3ZSB1c2UgSlVuaXQgVGVzdENhc2VzIC0gbW9yZSBzcGVjaWZpYworICAgIDx0dD5vcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlPC90dD4uCisgICAgU29tZSBvZiBpdHMgZmVhdHVyZXMgbGlrZSBjb25maWd1cmUgdGhlICh0ZXN0KSBwcm9qZWN0IGJ5IHJlYWRpbmcgaXRzIGJ1aWxkZmlsZSBhbmQKKyAgICBleGVjdXRlIHRhcmdldHMgd2UgbmVlZCBmb3Igc2VsZWN0b3IgdGVzdHMgYWxzby4gVGhlcmVmb3JlIHdlIHVzZSB0aGF0IEJ1aWxkRmlsZVRlc3QuCisgICAgQnV0IHRlc3Rpbmcgc2VsZWN0b3JzIHJlcXVpcmVzIHNvbWUgbW9yZSB3b3JrOiBoYXZpbmcgYSBzZXQgb2YgZmlsZXMsIGluc3RhbnRpYXRlCisgICAgYW5kIGNvbmZpZ3VyZSB0aGUgc2VsZWN0b3IsIGNoZWNrIHRoZSBzZWxlY3Rpb24gd29yayBhbmQgbW9yZS4gQmVjYXVzZSB3ZSB1c3VhbGx5CisgICAgZXh0ZW5kIDx0dD5CYXNlRXh0ZW5kU2VsZWN0b3I8L3R0PiBpdHMgZmVhdHVyZXMgaGF2ZSB0byBiZSB0ZXN0ZWQgYWxzbyAoZS5nLiBzZXRFcnJvcigpKS4KKyAgICA8L3A+CisKKyAgICA8cD5UaGF0J3Mgd2h5IHdlIGhhdmUgYSBiYXNlIGNsYXNzIGZvciBkb2luZyBvdXIgc2VsZWN0b3IgdGVzdHM6CisgICAgPHR0Pm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlU2VsZWN0b3JUZXN0PC90dD4uPC9wPgorCisgICAgPHA+VGhpcyBjbGFzcyBleHRlbmRzIFRlc3RDYXNlIGFuZCB0aGVyZWZvcmUgY2FuIGluY2x1ZGVkIGluIHRoZSBzZXQgb2YgQW50J3MKKyAgICB1bml0IHRlc3RzLiBJdCBob2xkcyBhbiBpbnN0YW5jZSBvZiBwcmVjb25maWd1cmVkIEJ1aWxkRmlsZVRlc3QuIENvbmZpZ3VyYXRpb24KKyAgICBpcyBkb25lIGJ5IHBhcnNpbmcgdGhlIHNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy54bWwuIEJhc2VTZWxlY3RvclRlc3QKKyAgICB0aGVuIGdpdmVzIHVzIGhlbHBlciBtZXRob2RzIGZvciBoYW5kbGluZyBtdWx0aXBsZSBzZWxlY3Rpb25zLiA8L3A+CisKKyAgICA8cD5CZWNhdXNlIHRoZSB0ZXJtICJ0ZXN0Y2FzZSIgb3IgInRlc3RlbnZpcm9ubWVudCIgYXJlIHNvIG9mdGVuIHVzZWQsIHRoaXMKKyAgICBzcGVjaWFsIHRlc3RlbnZpcm9ubWVudCBnb3QgYSBuZXcgbmFtZTogPGk+YmVkPC9pPi4gTGlrZSB5b3UgaW5pdGlhbGl6ZSB0aGUKKyAgICB0ZXN0IGVudmlyb25tZW50IGJ5IGNhbGxpbmcgc2V0VXAoKSBhbmQgY2xlYW5pbmcgYnkgY2FsbGluZyB0ZWFyRG93bigpICg8aT5vciBsaWtlCisgICAgdG8gbWFrZSB5b3VyIGJlZCBiZWZvcmUgZ28gc2xlZXBpbmc8L2k+KSB5b3UgaGF2ZSB0byBkbyB0aGF0IHdvcmsgd2l0aCB5b3VyCisgICAgPGk+YmVkPC9pPiBieSBjYWxsaW5nIDx0dD5tYWtlQmVkKCk8L3R0PiByZXNwZWNpdGl2ZSA8dHQ+Y2xlYW51cEJlZCgpPC90dD4uPC9wPgorCisgICAgPHA+QSB1c3VhbCB0ZXN0IHNjZW5hcmlvIGlzPG9sPgorICAgICAgIDxsaT5tYWtlIHRoZSBiZWQ8L2xpPgorICAgICAgIDxsaT5pbnN0YW50aWF0ZSB0aGUgc2VsZWN0b3I8L2xpPgorICAgICAgIDxsaT5jb25maWd1cmUgdGhlIHNlbGVjdG9yPC9saT4KKyAgICAgICA8bGk+bGV0IHRoZSBzZWxlY3RvciBkbyBzb21lIHdvcms8L2xpPgorICAgICAgIDxsaT52ZXJpZnkgdGhlIHdvcms8L2xpPgorICAgICAgIDxsaT5jbGVhbiB0aGUgYmVkPC9saT4KKyAgICAgICA8L29sPgorICAgIDwvcD4KKworICAgIDxwPkZvciBjb21tb24gd2F5IG9mIGluc3RhbnRpYXRpb24geW91IGhhdmUgdG8gb3ZlcnJpZGUgdGhlIDx0dD5nZXRJbnN0YW5jZSgpPC90dD4KKyAgICBzaW1wbHkgYnkgcmV0dXJuaW5nIGEgbmV3IG9iamVjdCBvZiB5b3VyIHNlbGVjdG9yLiBGb3IgZWFzaWVyICJzZWxlY3Rpb24gYW5kIHZlcmlmaWNhdGlvbiB3b3JrIgorICAgIEJhc2VTZWxlY3RvclRlc3QgcHJvdmlkZXMgdGhlIG1ldGhvZCA8dHQ+cGVyZm9ybVRlc3RzKCk8L3R0PiB3aGljaAorICAgIGl0ZXJhdGVzIG92ZXIgYWxsIGZpbGVzIChhbmQgZGlyZWN0b3JpZXMpIGluIHRoZSBTdHJpbmcgYXJyYXkgPHR0PmZpbGVuYW1lczwvdHQ+CisgICAgYW5kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBzZWxlY3RvciByZXR1cm5zIHRoZSBleHBlY3RlZCByZXN1bHQuIElmIGFuIGVycm9yCisgICAgb2NjdXJyZWQgKGVzcGVjaWFsbHkgdGhlIHNlbGVjdG9yIGRvZXMgbm90IHJldHVybiB0aGUgZXhwZWN0ZWQgcmVzdWx0KSB0aGUgdGVzdAorICAgIGZhaWxzIGFuZCB0aGUgZmFpbGluZyBmaWxlbmFtZXMgYXJlIGxvZ2dlZC48L3A+CisKKyAgICA8cD5BbiBleGFtcGxlIHRlc3Qgd291bGQgYmU6PHByZT4KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitwdWJsaWMgY2xhc3MgTXlTZWxlY3RvclRlc3QgZXh0ZW5kcyBCYXNlU2VsZWN0b3JUZXN0IHsKKworICAgIHB1YmxpYyBNeVNlbGVjdG9yVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmFzZVNlbGVjdG9yIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15U2VsZWN0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZTEoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRlc3QgZW52aXJvbm1lbnQgJ2JlZCcKKyAgICAgICAgICAgIG1ha2VCZWQoKTsKKworICAgICAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzZWxlY3RvcgorICAgICAgICAgICAgTXlTZWxlY3RvciBzID0gKE15U2VsZWN0b3IpZ2V0U2VsZWN0b3IoKTsKKyAgICAgICAgICAgIHMuYWRkUGFyYW0oImtleTEiLCAidmFsdWUxIik7CisgICAgICAgICAgICBzLmFkZFBhcmFtKCJrZXkyIiwgInZhbHVlMiIpOworICAgICAgICAgICAgcy5zZXRYWCh0cnVlKTsKKyAgICAgICAgICAgIHMuc2V0WVkoImEgdmFsdWUiKTsKKworICAgICAgICAgICAgLy8gZG8gdGhlIHRlc3RzCisgICAgICAgICAgICBwZXJmb3JtVGVzdHMocywgIkZUVFRUVFRUVFRUVCIpOyAgLy8gRmlyc3QgaXMgbm90IHNlbGVjdGVkIC0gcmVzdCBpcworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBjbGVhbnVwIHRoZSBlbnZpcm9ubWVudAorICAgICAgICAgICAgY2xlYW51cEJlZCgpOworICAgICAgICB9CisgICAgfQorfQorICAgIDwvcHJlPgorICAgIEFzIGFuIGV4YW1wbGUgb2YgYW4gZXJyb3IgSlVuaXQgY291bGQgbG9nPHByZT4KKyAgICBbanVuaXRdICAgICBGQUlMRUQKKyAgICBbanVuaXRdIEVycm9yIGZvciBmaWxlczogPGZvbnQgY29sb3I9Ymx1ZT4uO2NvcHkuZmlsdGVyc2V0LmZpbHRlcmVkO3Rhci9nei9hc2YtbG9nby5naWYudGFyLmd6PC9mb250PgorICAgIFtqdW5pdF0gZXhwZWN0ZWQ6Jmx0Ozxmb250IGNvbG9yPWJsdWU+RlRUVEZUVFRGLi4uPC9mb250PiZndDsgYnV0IHdhczombHQ7VFRUVFRUVFRULi4uJmd0OworICAgIFtqdW5pdF0ganVuaXQuZnJhbWV3b3JrLkNvbXBhcmlzb25GYWlsdXJlOiBFcnJvciBmb3IgZmlsZXM6IC47Y29weS5maWx0ZXJzZXQuZmlsdGVyZWQ7dGFyL2d6L2FzZi1sb2dvLmdpZi50YXIuZ3oKKyAgICBbanVuaXRdIGV4cGVjdGVkOiZsdDtGVFRURlRUVEYuLi4mZ3Q7IGJ1dCB3YXM6Jmx0O1RUVFRUVFRUVC4uLiZndDsKKyAgICBbanVuaXRdICAgICBhdCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFscyhBc3NlcnQuamF2YTo4MSkKKyAgICBbanVuaXRdICAgICBhdCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZVNlbGVjdG9yVGVzdC5wZXJmb3JtVGVzdChCYXNlU2VsZWN0b3JUZXN0LmphdmE6MTk0KQorICAgIDwvcHJlPjwvcD4KKworICAgIDxwPkRlc2NyaWJlZCBhYm92ZSB0aGUgdGVzdCBjbGFzcyBzaG91bGQgcHJvdmlkZSBhIDx0dD5nZXRJbnN0YW5jZSgpPC90dD4KKyAgICBtZXRob2QuIEJ1dCB0aGF0IGlzbid0IHVzZWQgaGVyZS4gVGhlIHVzZWQgPHR0PmdldFNlbGVjdG9yKCk8L3R0PiBtZXRob2QgaXMKKyAgICBpbXBsZW1lbnRlZCBpbiB0aGUgYmFzZSBjbGFzcyBhbmQgZ2l2ZXMgYW4gaW5zdGFuY2Ugb2YgYW4gQW50IFByb2plY3QgdG8KKyAgICB0aGUgc2VsZWN0b3IuIFRoaXMgaXMgdXN1YWxseSBkb25lIGluc2lkZSBub3JtYWwgYnVpbGQgZmlsZSBydW5zLCBidXQgbm90CisgICAgaW5zaWRlIHRoaXMgc3BlY2lhbCBlbnZpcm9ubWVudCwgc28gdGhpcyBtZXRob2QgZ2l2ZXMgdGhlIHNlbGVjdG9yIHRoZQorICAgIGFiaWxpdHkgdG8gdXNlIGl0cyBvd24gUHJvamVjdCBvYmplY3QgKDx0dD5nZXRQcm9qZWN0KCk8L3R0PiksIGZvciBleGFtcGxlCisgICAgZm9yIGxvZ2dpbmcuPC9wPgorCisKKyAgICA8aDM+TG9nZ2luZzwvaDM+CisKKyAgICA8cD5EdXJpbmcgZGV2ZWxvcG1lbnQgYW5kIG1heWJlIGxhdGVyIHlvdSBzb21ldGltZXMgbmVlZCB0aGUgb3V0cHV0IG9mIGluZm9ybWF0aW9uLgorICAgIFRoZXJlZm9yZSBMb2dnaW5nIGlzIG5lZWRlZC4gQmVjYXVzZSB0aGUgc2VsZWN0b3IgZXh0ZW5kcyBCYXNlRXh0ZW5kU2VsZWN0b3Igb3IgZGlyZWN0bHkKKyAgICBCYXNlU2VsZWN0b3IgaXQgaXMgYW4gQW50IDx0dD5EYXRhVHlwZTwvdHQ+IGFuZCB0aGVyZWZvcmUgYSA8dHQ+UHJvamVjdENvbXBvbmVudDwvdHQ+LiA8YnI+CisgICAgVGhhdCBtZWFucyB0aGF0IHlvdSBoYXZlIGFjY2VzcyB0byB0aGUgcHJvamVjdCBvYmplY3QgYW5kIGl0cyBsb2dnaW5nIGNhcGFiaWxpdHkuCisgICAgPHR0PlByb2plY3RDb21wb25lbnQ8L3R0PiBpdHNlbGYgcHJvdmlkZXMgPGk+bG9nPC9pPiBtZXRob2RzIHdoaWNoIHdpbGwgZG8gdGhlCisgICAgYWNjZXNzIHRvIHRoZSBwcm9qZWN0IGluc3RhbmNlLiBMb2dnaW5nIGlzIHRoZXJlZm9yZSBkb25lIHNpbXBseSB3aXRoOgorICAgIDxwcmU+CisgICAgICAgIGxvZyggIm1lc3NhZ2UiICk7CisgICAgPC9wcmU+CisgICAgb3IKKyAgICA8cHJlPgorICAgICAgICBsb2coICJtZXNzYWdlIiAsIGxvZ2xldmVsICk7CisgICAgPC9wcmU+CisgICAgd2hlcmUgdGhlIDx0dD5sb2dsZXZlbDwvdHQ+IGlzIG9uZSBvZiB0aGUgdmFsdWVzIDx1bD4KKyAgICA8bGk+IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuTVNHX0VSUiA8L2xpPgorICAgIDxsaT4gb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdC5NU0dfV0FSTiA8L2xpPgorICAgIDxsaT4gb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdC5NU0dfSU5GTyAgKD0gZGVmYXVsdCkgPC9saT4KKyAgICA8bGk+IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuTVNHX1ZFUkJPU0UgPC9saT4KKyAgICA8bGk+IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuTVNHX0RFQlVHIDwvbGk+CisgICAgPC91bD4KKyAgICA8L3A+CisKKyAgICAKKyAgPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvc2VsZWN0b3JzLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvc2VsZWN0b3JzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWYzN2VlNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy9zZWxlY3RvcnMuaHRtbApAQCAtMCwwICsxLDE1MjcgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKyAgICA8dGl0bGU+U2VsZWN0b3JzIGluIEFudDwvdGl0bGU+CisgIDwvaGVhZD4KKworICA8Ym9keT4KKyAgICA8aDI+U2VsZWN0b3JzPC9oMj4KKworICAgIDxwPlNlbGVjdG9ycyBhcmUgYSBtZWNoYW5pc20gd2hlcmVieSB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIGEKKyAgICA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGNhbiBiZSBzZWxlY3RlZCBiYXNlZCBvbiBjcml0ZXJpYQorICAgIG90aGVyIHRoYW4gZmlsZW5hbWUgYXMgcHJvdmlkZWQgYnkgdGhlIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4KKyAgICBhbmQgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiB0YWdzLjwvcD4KKworICAgIDxoMz5Ib3cgdG8gdXNlIGEgU2VsZWN0b3I8L2gzPgorCisgICAgPHA+QSBzZWxlY3RvciBpcyBhbiBlbGVtZW50IG9mIEZpbGVTZXQsIGFuZCBhcHBlYXJzIHdpdGhpbiBpdC4gSXQgY2FuCisgICAgYWxzbyBiZSBkZWZpbmVkIG91dHNpZGUgb2YgYW55IHRhcmdldCBieSB1c2luZyB0aGUgPGNvZGU+Jmx0O3NlbGVjdG9yJmd0OzwvY29kZT4gdGFnCisgICAgYW5kIHRoZW4gdXNpbmcgaXQgYXMgYSByZWZlcmVuY2UuCisgICAgPC9wPgorCisgICAgPHA+RGlmZmVyZW50IHNlbGVjdG9ycyBoYXZlIGRpZmZlcmVudCBhdHRyaWJ1dGVzLiBTb21lIHNlbGVjdG9ycyBjYW4KKyAgICBjb250YWluIG90aGVyIHNlbGVjdG9ycywgYW5kIHRoZXNlIGFyZSBjYWxsZWQKKyAgICA8YSBocmVmPSIjc2VsZWN0Y29udGFpbmVycyI+PGNvZGU+U2VsZWN0b3IgQ29udGFpbmVyczwvY29kZT48L2E+LgorICAgIFRoZXJlIGlzIGFsc28gYSBjYXRlZ29yeSBvZiBzZWxlY3RvcnMgdGhhdCBhbGxvdworICAgIHVzZXItZGVmaW5lZCBleHRlbnNpb25zLCBjYWxsZWQKKyAgICA8YSBocmVmPSIjY3VzdG9tc2VsZWN0Ij48Y29kZT5DdXN0b20gU2VsZWN0b3JzPC9jb2RlPjwvYT4uCisgICAgVGhlIG9uZXMgYnVpbHQgaW4gdG8gQW50IGFyZSBjYWxsZWQKKyAgICA8YSBocmVmPSIjY29yZXNlbGVjdCI+PGNvZGU+Q29yZSBTZWxlY3RvcnM8L2NvZGU+PC9hPi4KKyAgICA8L3A+CisKKyAgICA8YSBuYW1lPSJjb3Jlc2VsZWN0Ij48L2E+CisgICAgPGgzPkNvcmUgU2VsZWN0b3JzPC9oMz4KKworICAgIDxwPkNvcmUgc2VsZWN0b3JzIGFyZSB0aGUgb25lcyB0aGF0IGNvbWUgc3RhbmRhcmQKKyAgICB3aXRoIEFudC4gVGhleSBjYW4gYmUgdXNlZCB3aXRoaW4gYSBmaWxlc2V0IGFuZCBjYW4gYmUgY29udGFpbmVkCisgICAgd2l0aGluIFNlbGVjdG9yIENvbnRhaW5lcnMuPC9wPgorCisgICAgPHA+VGhlIGNvcmUgc2VsZWN0b3JzIGFyZTo8L3A+CisKKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI2NvbnRhaW5zc2VsZWN0Ij48Y29kZT4mbHQ7Y29udGFpbnMmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QKKyAgICAgICAgZmlsZXMgdGhhdCBjb250YWluIGEgcGFydGljdWxhciB0ZXh0IHN0cmluZzwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI2RhdGVzZWxlY3QiPjxjb2RlPiZsdDtkYXRlJmd0OzwvY29kZT48L2E+IC0gU2VsZWN0IGZpbGVzCisgICAgICAgIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgYSBwYXJ0aWN1bGFyIGRhdGUKKyAgICAgICAgYW5kIHRpbWU8L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNkZXBlbmRzZWxlY3QiPjxjb2RlPiZsdDtkZXBlbmQmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QgZmlsZXMKKyAgICAgICAgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgbW9yZSByZWNlbnRseSB0aGFuIGVxdWl2YWxlbnQgZmlsZXMKKyAgICAgICAgZWxzZXdoZXJlPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjZGVwdGhzZWxlY3QiPjxjb2RlPiZsdDtkZXB0aCZndDs8L2NvZGU+PC9hPiAtIFNlbGVjdCBmaWxlcworICAgICAgICB0aGF0IGFwcGVhciBzbyBtYW55IGRpcmVjdG9yaWVzIGRvd24gaW4gYSBkaXJlY3RvcnkgdHJlZTwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI2RpZmZlcmVudHNlbGVjdCI+PGNvZGU+Jmx0O2RpZmZlcmVudCZndDs8L2NvZGU+PC9hPiAtIFNlbGVjdCBmaWxlcworICAgICAgICB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSBlbHNld2hlcmU8L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNmaWxlbmFtZXNlbGVjdCI+PGNvZGU+Jmx0O2ZpbGVuYW1lJmd0OzwvY29kZT48L2E+IC0gU2VsZWN0CisgICAgICAgIGZpbGVzIHdob3NlIG5hbWUgbWF0Y2hlcyBhIHBhcnRpY3VsYXIgcGF0dGVybi4gRXF1aXZhbGVudCB0bworICAgICAgICB0aGUgaW5jbHVkZSBhbmQgZXhjbHVkZSBlbGVtZW50cyBvZiBhIHBhdHRlcm5zZXQuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjcHJlc2VudHNlbGVjdCI+PGNvZGU+Jmx0O3ByZXNlbnQmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QKKyAgICAgICAgZmlsZXMgdGhhdCBlaXRoZXIgZG8gb3IgZG8gbm90IGV4aXN0IGluIHNvbWUgb3RoZXIgbG9jYXRpb248L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNyZWdleHBzZWxlY3QiPjxjb2RlPiZsdDtjb250YWluc3JlZ2V4cCZndDs8L2NvZGU+PC9hPiAtIFNlbGVjdAorICAgICAgICBmaWxlcyB0aGF0IG1hdGNoIGEgcmVndWxhciBleHByZXNzaW9uPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjc2l6ZXNlbGVjdCI+PGNvZGU+Jmx0O3NpemUmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QgZmlsZXMKKyAgICAgICAgdGhhdCBhcmUgbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiBhIHBhcnRpY3VsYXIgbnVtYmVyIG9mIGJ5dGVzLjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI3R5cGVzZWxlY3QiPjxjb2RlPiZsdDt0eXBlJmd0OzwvY29kZT48L2E+IC0gU2VsZWN0IGZpbGVzCisgICAgICAgIHRoYXQgYXJlIGVpdGhlciByZWd1bGFyIGZpbGVzIG9yIGRpcmVjdG9yaWVzLjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI21vZGlmaWVkIj48Y29kZT4mbHQ7bW9kaWZpZWQmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QgZmlsZXMgaWYKKyAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY29uZmlndXJlZCBhbGdvcml0aG0gaXMgZGlmZmVyZW50IGZyb20gdGhhdAorICAgICAgICBzdG9yZWQgaW4gYSBjYWNoZS48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNzaWduZWRzZWxlY3RvciI+PGNvZGU+Jmx0O3NpZ25lZHNlbGVjdG9yJmd0OzwvY29kZT48L2E+IC0gU2VsZWN0IGZpbGVzIGlmCisgICAgICAgIHRoZXkgYXJlIHNpZ25lZCwgYW5kIG9wdGlvbmFsbHkgaWYgdGhleSBoYXZlIGEgc2lnbmF0dXJlIG9mIGEgY2VydGFpbiBuYW1lLgorICAgICAgPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjc2NyaXB0c2VsZWN0b3IiPjxjb2RlPiZsdDtzY3JpcHRzZWxlY3RvciZndDs8L2NvZGU+PC9hPiAtIAorICAgICAgICBVc2UgYSBCU0Ygb3IgSlNSIDIyMyBzY3JpcHRpbmcgbGFuZ3VhZ2UgdG8gY3JlYXRlCisgICAgICAgIHlvdXIgb3duIHNlbGVjdG9yCisgICAgICA8L2xpPgorICAgIDwvdWw+CisKKyAgICA8YSBuYW1lPSJjb250YWluc3NlbGVjdCI+PC9hPgorICAgIDxoND5Db250YWlucyBTZWxlY3RvcjwvaDQ+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2NvbnRhaW5zJmd0OzwvY29kZT4gdGFnIGluIGEgRmlsZVNldCBsaW1pdHMKKyAgICB0aGUgZmlsZXMgZGVmaW5lZCBieSB0aGF0IGZpbGVzZXQgdG8gb25seSB0aG9zZSB3aGljaCBjb250YWluIHRoZQorICAgIHN0cmluZyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnRleHQ8L2NvZGU+IGF0dHJpYnV0ZS4KKyAgICAuPC9wPgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7Y29udGFpbnMmZ3Q7PC9jb2RlPiBzZWxlY3RvciBjYW4gYmUgdXNlZCBhcyBhCisgICAgICBSZXNvdXJjZVNlbGVjdG9yIChzZWUgdGhlCisgICAgICA8YSBocmVmPSJyZXNvdXJjZXMuaHRtbCNyZXN0cmljdCI+Jmx0O3Jlc3RyaWN0Jmd0OzwvYT4KKyAgICAgIFJlc291cmNlQ29sbGVjdGlvbikuPC9wPgorCisgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnRleHQ8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgdGV4dCB0aGF0IGV2ZXJ5IGZpbGUgbXVzdCBjb250YWluCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBwYXkgYXR0ZW50aW9uIHRvIGNhc2Ugd2hlbiBsb29raW5nCisgICAgICAgICAgZm9yIHRoZSBzdHJpbmcgaW4gdGhlIDxjb2RlPnRleHQ8L2NvZGU+IGF0dHJpYnV0ZS4gRGVmYXVsdCBpcworICAgICAgICAgIHRydWUuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmV3aGl0ZXNwYWNlPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGVsaW1pbmF0ZSB3aGl0ZXNwYWNlIGJlZm9yZSBjaGVja2luZworICAgICAgICAgIGZvciB0aGUgc3RyaW5nIGluIHRoZSA8Y29kZT50ZXh0PC9jb2RlPiBhdHRyaWJ1dGUuIERlZmF1bHQgaXMKKyAgICAgICAgICBmYWxzZS4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgQ29udGFpbnMgU2VsZWN0b3I6PC9wPgorCisgICAgPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2RvYy5wYXRofSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmh0bWwmcXVvdDsmZ3Q7CisgICAgJmx0O2NvbnRhaW5zIHRleHQ9JnF1b3Q7c2NyaXB0JnF1b3Q7IGNhc2VzZW5zaXRpdmU9JnF1b3Q7bm8mcXVvdDsvJmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisgICAgPHA+U2VsZWN0cyBhbGwgdGhlIEhUTUwgZmlsZXMgdGhhdCBjb250YWluIHRoZSBzdHJpbmcKKyAgICA8Y29kZT5zY3JpcHQ8L2NvZGU+LjwvcD4KKworCisgICAgPGEgbmFtZT0iZGF0ZXNlbGVjdCI+PC9hPgorICAgIDxoND5EYXRlIFNlbGVjdG9yPC9oND4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZGF0ZSZndDs8L2NvZGU+IHRhZyBpbiBhIEZpbGVTZXQgd2lsbCBwdXQKKyAgICBhIGxpbWl0IG9uIHRoZSBmaWxlcyBzcGVjaWZpZWQgYnkgdGhlIGluY2x1ZGUgdGFnLCBzbyB0aGF0IHRhZ3MKKyAgICB3aG9zZSBsYXN0IG1vZGlmaWVkIGRhdGUgZG9lcyBub3QgbWVldCB0aGUgZGF0ZSBsaW1pdHMgc3BlY2lmaWVkCisgICAgYnkgdGhlIHNlbGVjdG9yIHdpbGwgbm90IGVuZCB1cCBiZWluZyBzZWxlY3RlZC48L3A+CisKKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGF0ZXRpbWU8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgZGF0ZSBhbmQgdGltZSB0byB0ZXN0IGZvci4KKyAgICAgICAgICBTaG91bGQgYmUgaW4gdGhlIGZvcm1hdCBNTS9ERC9ZWVlZIEhIOk1NIEFNX29yX1BNLCBvcgorICAgICAgICAgIGFuIGFsdGVybmF0aXZlIHBhdHRlcm4gc3BlY2lmaWVkIHZpYSB0aGUgPGk+cGF0dGVybjwvaT4KKyAgICAgICAgICBhdHRyaWJ1dGUuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+QXQgbGVhc3Qgb25lIG9mIHRoZSB0d28uPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWlsbGlzPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIHRoYXQgc2hvdWxkCisgICAgICAgICAgYmUgdGVzdGVkIGZvci4gSXQgaXMgdXN1YWxseSBtdWNoIGVhc2llciB0byB1c2UgdGhlIGRhdGV0aW1lCisgICAgICAgICAgYXR0cmlidXRlLgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj53aGVuPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgaG93IHRvIGludGVycHJldCB0aGUgZGF0ZSwgd2hldGhlcgorICAgICAgICAgIHRoZSBmaWxlcyB0byBiZSBzZWxlY3RlZCBhcmUgdGhvc2Ugd2hvc2UgbGFzdCBtb2RpZmllZCB0aW1lcyBzaG91bGQKKyAgICAgICAgICBiZSBiZWZvcmUsIGFmdGVyLCBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBBY2NlcHRhYmxlCisgICAgICAgICAgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmU6CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPmJlZm9yZSAtIHNlbGVjdCBmaWxlcyB3aG9zZSBsYXN0IG1vZGlmaWVkIGRhdGUgaXMgYmVmb3JlIHRoZSBpbmRpY2F0ZWQgZGF0ZQorICAgICAgICAgICAgPGxpPmFmdGVyIC0gc2VsZWN0IGZpbGVzIHdob3NlIGxhc3QgbW9kaWZpZWQgZGF0ZSBpcyBhZnRlciB0aGUgaW5kaWNhdGVkIGRhdGUKKyAgICAgICAgICAgIDxsaT5lcXVhbCAtIHNlbGVjdCBmaWxlcyAgd2hvc2UgbGFzdCBtb2RpZmllZCBkYXRlIGlzIHRoaXMgZXhhY3QgZGF0ZQorICAgICAgICAgIDwvdWw+CisgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgZXF1YWwuCisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5ncmFudWxhcml0eTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgbGVld2F5IHRvIHVzZSB3aGVuCisgICAgICAgICAgY29tcGFyaW5nIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG5vdCBldmVyeQorICAgICAgICAgIGZpbGUgc3lzdGVtIHN1cHBvcnRzIHRyYWNraW5nIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgdG8gdGhlCisgICAgICAgICAgbWlsbGlzZWNvbmQgbGV2ZWwuIERlZmF1bHQgaXMgMCBtaWxsaXNlY29uZHMsIG9yIDIgc2Vjb25kcyBvbiBET1Mgc3lzdGVtcy4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSA8Q09ERT5TaW1wbGVEYXRlRm9ybWF0PC9DT0RFPi1jb21wYXRpYmxlIHBhdHRlcm4KKyAgICAgICAgICB0byB1c2Ugd2hlbiBpbnRlcnByZXRpbmcgdGhlIDxpPmRhdGV0aW1lPC9pPiBhdHRyaWJ1dGUuCisgICAgICAgICAgPGk+U2luY2UgQW50IDEuNi4yPC9pPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2hlY2tkaXJzPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gY2hlY2sgZGF0ZXMgb24gZGlyZWN0b3JpZXMuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIDxpPmZhbHNlPC9pPjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgRGF0ZSBTZWxlY3Rvcjo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7amFyLnBhdGh9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouamFyJnF1b3Q7Jmd0OworICAgICZsdDtkYXRlIGRhdGV0aW1lPSZxdW90OzAxLzAxLzIwMDEgMTI6MDAgQU0mcXVvdDsgd2hlbj0mcXVvdDtiZWZvcmUmcXVvdDsvJmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisgICAgPHA+U2VsZWN0cyBhbGwgSkFSIGZpbGVzIHdoaWNoIHdlcmUgbGFzdCBtb2RpZmllZCBiZWZvcmUgbWlkbmlnaHQKKyAgICBKYW51YXJ5IDEsIDIwMDEuPC9wPgorCisKKyAgICA8YSBuYW1lPSJkZXBlbmRzZWxlY3QiPjwvYT4KKyAgICA8aDQ+RGVwZW5kIFNlbGVjdG9yPC9oND4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT4gdGFnIHNlbGVjdHMgZmlsZXMKKyAgICB3aG9zZSBsYXN0IG1vZGlmaWVkIGRhdGUgaXMgbGF0ZXIgdGhhbiBhbm90aGVyLCBlcXVpdmFsZW50IGZpbGUgaW4KKyAgICBhbm90aGVyIGxvY2F0aW9uLjwvcD4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT4gdGFnIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYQorICAgIGNvbnRhaW5lZCA8YSBocmVmPSJtYXBwZXIuaHRtbCI+PGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+PC9hPiBlbGVtZW50CisgICAgdG8gZGVmaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0byBiZSBjb21wYXJlZCBhZ2FpbnN0LiBJZiBubworICAgIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHNwZWNpZmllZCwgdGhlCisgICAgPGNvZGU+aWRlbnRpdHk8L2NvZGU+IHR5cGUgbWFwcGVyIGlzIHVzZWQuPC9wPgorCisgICAgPHA+VGhlIDxjb2RlPiZsdDtkZXBlbmQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBpcyBjYXNlLXNlbnNpdGl2ZS48L3A+CisKKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0ZGlyPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgdG8gbG9vayBmb3IgdGhlIGZpbGVzIHRvIGNvbXBhcmUKKyAgICAgICAgICBhZ2FpbnN0LiBUaGUgcHJlY2lzZSBsb2NhdGlvbiBkZXBlbmRzIG9uIGEgY29tYmluYXRpb24gb2YgdGhpcworICAgICAgICAgIGF0dHJpYnV0ZSBhbmQgdGhlIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50LCBpZiBhbnkuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Z3JhbnVsYXJpdHk8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byBnaXZlIGJlZm9yZQorICAgICAgICAgIGRlY2lkaW5nIGEgZmlsZSBpcyBvdXQgb2YgZGF0ZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBub3QgZXZlcnkKKyAgICAgICAgICBmaWxlIHN5c3RlbSBzdXBwb3J0cyB0cmFja2luZyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIHRvIHRoZQorICAgICAgICAgIG1pbGxpc2Vjb25kIGxldmVsLiBEZWZhdWx0IGlzIDAgbWlsbGlzZWNvbmRzLCBvciAyIHNlY29uZHMgb24gRE9TIHN5c3RlbXMuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIERlcGVuZCBTZWxlY3Rvcjo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7YW50LjEuNX0vc3JjL21haW4mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7Jmd0OworICAgICZsdDtkZXBlbmQgdGFyZ2V0ZGlyPSZxdW90OyR7YW50LjEuNC4xfS9zcmMvbWFpbiZxdW90Oy8mZ3Q7CismbHQ7L2ZpbGVzZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKyAgICA8cD5TZWxlY3RzIGFsbCB0aGUgSmF2YSBzb3VyY2UgZmlsZXMgd2hpY2ggd2VyZSBtb2RpZmllZCBpbiB0aGUKKyAgICAgIDEuNSByZWxlYXNlLgorICAgIDwvcD4KKworCisgICAgPGEgbmFtZT0iZGVwdGhzZWxlY3QiPjwvYT4KKyAgICA8aDQ+RGVwdGggU2VsZWN0b3I8L2g0PgorCisgICAgPHA+VGhlIDxjb2RlPiZsdDtkZXB0aCZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzIGJhc2VkIG9uCisgICAgaG93IG1hbnkgZGlyZWN0b3J5IGxldmVscyBkZWVwIHRoZXkgYXJlIGluIHJlbGF0aW9uIHRvIHRoZSBiYXNlCisgICAgZGlyZWN0b3J5IG9mIHRoZSBmaWxlc2V0LgorICAgIDwvcD4KKworICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5taW48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBtaW5pbXVtIG51bWJlciBvZiBkaXJlY3RvcnkgbGV2ZWxzIGJlbG93CisgICAgICAgICAgdGhlIGJhc2UgZGlyZWN0b3J5IHRoYXQgYSBmaWxlIG11c3QgYmUgaW4gb3JkZXIgdG8gYmUgc2VsZWN0ZWQuCisgICAgICAgICAgRGVmYXVsdCBpcyBubyBsaW1pdC4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5BdCBsZWFzdCBvbmUgb2YgdGhlIHR3by48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5tYXg8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBtYXhpbXVtIG51bWJlciBvZiBkaXJlY3RvcnkgbGV2ZWxzIGJlbG93CisgICAgICAgICAgdGhlIGJhc2UgZGlyZWN0b3J5IHRoYXQgYSBmaWxlIGNhbiBiZSBhbmQgc3RpbGwgYmUgc2VsZWN0ZWQuCisgICAgICAgICAgRGVmYXVsdCBpcyBubyBsaW1pdC4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKworICAgIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBEZXB0aCBTZWxlY3Rvcjo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7ZG9jLnBhdGh9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyomcXVvdDsmZ3Q7CisgICAgJmx0O2RlcHRoIG1heD0mcXVvdDsxJnF1b3Q7LyZndDsKKyZsdDsvZmlsZXNldCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworICAgIDxwPlNlbGVjdHMgYWxsIGZpbGVzIGluIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgb25lIGRpcmVjdG9yeSBiZWxvdworICAgIHRoYXQuPC9wPgorCisgICAgPGEgbmFtZT0iZGlmZmVyZW50c2VsZWN0Ij4KKyAgICA8aDQ+RGlmZmVyZW50IFNlbGVjdG9yPC9oND4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZGlmZmVyZW50Jmd0OzwvY29kZT4gc2VsZWN0b3Igd2lsbCBzZWxlY3QgYSBmaWxlCisgICAgaWYgaXQgaXMgZGVlbWVkIHRvIGJlICdkaWZmZXJlbnQnIGZyb20gYW4gZXF1aXZhbGVudCBmaWxlIGluCisgICAgYW5vdGhlciBsb2NhdGlvbi4gVGhlIHJ1bGVzIGZvciBkZXRlcm1pbmluZyBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICB0aGUgdHdvIGZpbGVzIGFyZSBhcyBmb2xsb3dzOgorICAgIDxvbD4KKyAgICA8bGk+IElmIHRoZXJlIGlzIG5vICdvdGhlcicgZmlsZSwgaXQncyBkaWZmZXJlbnQuCisgICAgPGxpPiBGaWxlcyB3aXRoIGRpZmZlcmVudCBsZW5ndGhzIGFyZSBkaWZmZXJlbnQuCisgICAgPGxpPiBJZiA8dHQ+aWdub3JlRmlsZVRpbWVzPC90dD4gaXMgdHVybmVkIG9mZiwgdGhlbiBkaWZmZXJpbmcgZmlsZQorICAgIHRpbWVzdGFtcHMgd2lsbCBjYXVzZSBmaWxlcyB0byBiZSByZWdhcmRlZCBhcyBkaWZmZXJlbnQuCisgICAgPGxpPiBVbmxlc3MgPHR0Pmlnbm9yZUNvbnRlbnRzPC90dD4gaXMgc2V0IHRvIHRydWUsCisgICAgICAgICBhIGJ5dGUtZm9yLWJ5dGUgY2hlY2sgaXMgcnVuIGFnYWluc3QgdGhlIHR3byBmaWxlcy4KKyAgICA8L29sPgorCisgICAgVGhpcyBpcyBhIHVzZWZ1bCBzZWxlY3RvciB0byB3b3JrIHdpdGggcHJvZ3JhbXMgYW5kIHRhc2tzIHRoYXQgZG9uJ3QgaGFuZGxlCisgICAgZGVwZW5kZW5jeSBjaGVja2luZyBwcm9wZXJseTsgZXZlbiBpZiBhIHByZWRlY2Vzc29yIHRhc2sgYWx3YXlzIGNyZWF0ZXMgaXRzCisgICAgb3V0cHV0IGZpbGVzLCBmb2xsb3d1cCB0YXNrcyBjYW4gYmUgZHJpdmVuIG9mZiBjb3BpZXMgbWFkZSB3aXRoIGEgZGlmZmVyZW50CisgICAgc2VsZWN0b3IsIHNvIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgZHJpdmVuIG9uIHRoZSBhYnNvbHV0ZSBzdGF0ZSBvZiB0aGUKKyAgICBmaWxlcywgbm90IGp1c3QgYSB0aW1lc3RhbXAuIEZvciBleGFtcGxlOiBhbnl0aGluZyBmZXRjaGVkIGZyb20gYSB3ZWIgc2l0ZSwKKyAgICBvciB0aGUgb3V0cHV0IG9mIHNvbWUgcHJvZ3JhbS4gVG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgY2hlY2tpbmcsIHdoZW4gdXNpbmcKKyAgICB0aGlzIHRhc2sgaW5zaWRlIGEgPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiB0YXNrLCBzZXQKKyAgICA8dHQ+cHJlc2VydmVsYXN0bW9kaWZpZWQ8L3R0PiB0byA8aT50cnVlPC9pPiB0byBwcm9wYWdhdGUgdGhlIHRpbWVzdGFtcAorICAgIGZyb20gdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLjxwPgorCisgICAgVGhlIDxjb2RlPiZsdDtkaWZmZXJlbnQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBzdXBwb3J0cyB0aGUgdXNlIG9mIGEKKyAgICBjb250YWluZWQgPGEgaHJlZj0ibWFwcGVyLmh0bWwiPjxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudAorICAgIHRvIGRlZmluZSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgdG8gYmUgY29tcGFyZWQgYWdhaW5zdC4gSWYgbm8KKyAgICA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gZWxlbWVudCBpcyBzcGVjaWZpZWQsIHRoZQorICAgIDxjb2RlPmlkZW50aXR5PC9jb2RlPiB0eXBlIG1hcHBlciBpcyB1c2VkLjwvcD4KKworICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj50YXJnZXRkaXI8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSB0byBsb29rIGZvciB0aGUgZmlsZXMgdG8gY29tcGFyZQorICAgICAgICAgIGFnYWluc3QuIFRoZSBwcmVjaXNlIGxvY2F0aW9uIGRlcGVuZHMgb24gYSBjb21iaW5hdGlvbiBvZiB0aGlzCisgICAgICAgICAgYXR0cmlidXRlIGFuZCB0aGUgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQsIGlmIGFueS4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVGaWxlVGltZXM8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gdXNlIGZpbGUgdGltZXMgaW4gdGhlIGNvbXBhcmlzb24gb3Igbm90LgorICAgICAgICAgIERlZmF1bHQgaXMgdHJ1ZSAodGltZSBkaWZmZXJlbmNlcyBhcmUgaWdub3JlZCkuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVDb250ZW50czwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBkbyBhIGJ5dGUgcGVyIGJ5dGUgY29tcGFyZS4KKyAgICAgICAgICBEZWZhdWx0IGlzIGZhbHNlIChjb250ZW50cyBhcmUgY29tcGFyZWQpLgorICAgICAgICAgIFNpbmNlIEFudCAxLjYuMworICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Z3JhbnVsYXJpdHk8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byBnaXZlIGJlZm9yZQorICAgICAgICAgIGRlY2lkaW5nIGEgZmlsZSBpcyBvdXQgb2YgZGF0ZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBub3QgZXZlcnkKKyAgICAgICAgICBmaWxlIHN5c3RlbSBzdXBwb3J0cyB0cmFja2luZyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIHRvIHRoZQorICAgICAgICAgIG1pbGxpc2Vjb25kIGxldmVsLiBEZWZhdWx0IGlzIDAgbWlsbGlzZWNvbmRzLCBvciAyIHNlY29uZHMgb24gRE9TIHN5c3RlbXMuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIERpZmZlcmVudCBTZWxlY3Rvcjo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7YW50LjEuNX0vc3JjL21haW4mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7Jmd0OworICAgICZsdDtkaWZmZXJlbnQgdGFyZ2V0ZGlyPSZxdW90OyR7YW50LjEuNC4xfS9zcmMvbWFpbiZxdW90OworICAgICAgICBpZ25vcmVGaWxlVGltZXM9InRydWUiLyZndDsKKyZsdDsvZmlsZXNldCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworICAgIDxwPkNvbXBhcmVzIGFsbCB0aGUgSmF2YSBzb3VyY2UgZmlsZXMgYmV0d2VlbiB0aGUgMS40LjEgYW5kIHRoZSAxLjUgcmVsZWFzZQorICAgIGFuZCBzZWxlY3RzIHRob3NlIHdobyBhcmUgZGlmZmVyZW50LCBkaXNyZWdhcmRpbmcgZmlsZSB0aW1lcy4KKyAgICA8L3A+CisKKyAgICA8YSBuYW1lPSJmaWxlbmFtZXNlbGVjdCI+PC9hPgorICAgIDxoND5GaWxlbmFtZSBTZWxlY3RvcjwvaDQ+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2ZpbGVuYW1lJmd0OzwvY29kZT4gdGFnIGFjdHMgbGlrZSB0aGUKKyAgICA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+CisgICAgdGFncyB3aXRoaW4gYSBmaWxlc2V0LiBCeSB1c2luZyBhIHNlbGVjdG9yIGluc3RlYWQsIGhvd2V2ZXIsCisgICAgb25lIGNhbiBjb21iaW5lIGl0IHdpdGggYWxsIHRoZSBvdGhlciBzZWxlY3RvcnMgdXNpbmcgd2hhdGV2ZXIKKyAgICA8YSBocmVmPSIjc2VsZWN0Y29udGFpbmVycyI+c2VsZWN0b3IgY29udGFpbmVyPC9hPiBpcyBkZXNpcmVkLgorICAgIDwvcD4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPiBzZWxlY3RvciBpcworICAgIGNhc2Utc2Vuc2l0aXZlLjwvcD4KKworICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBmaWxlcyB0byBzZWxlY3QuIFRoZSBuYW1lIHBhcmFtZXRlcgorICAgICAgICAgIGNhbiBjb250YWluIHRoZSBzdGFuZGFyZCBBbnQgd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jYXNlc2Vuc2l0aXZlPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIHBheSBhdHRlbnRpb24gdG8gY2FzZSB3aGVuIGxvb2tpbmcKKyAgICAgICAgICBhdCBmaWxlIG5hbWVzLiBEZWZhdWx0IGlzICJ0cnVlIi4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm5lZ2F0ZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byByZXZlcnNlIHRoZSBlZmZlY3RzIG9mIHRoaXMgZmlsZW5hbWUKKyAgICAgICAgICBzZWxlY3Rpb24sIHRoZXJlZm9yZSBlbXVsYXRpbmcgYW4gZXhjbHVkZSByYXRoZXIgdGhhbiBpbmNsdWRlCisgICAgICAgICAgdGFnLiBEZWZhdWx0IGlzICJmYWxzZSIuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIEZpbGVuYW1lIFNlbGVjdG9yOjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtkb2MucGF0aH0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKiZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZW5hbWUgbmFtZT0mcXVvdDsqKi8qLmNzcyZxdW90Oy8mZ3Q7CismbHQ7L2ZpbGVzZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKyAgICA8cD5TZWxlY3RzIGFsbCB0aGUgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IGZpbGVzLjwvcD4KKworCisgICAgPGEgbmFtZT0icHJlc2VudHNlbGVjdCI+PC9hPgorICAgIDxoND5QcmVzZW50IFNlbGVjdG9yPC9oND4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7cHJlc2VudCZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzCisgICAgdGhhdCBoYXZlIGFuIGVxdWl2YWxlbnQgZmlsZSBpbiBhbm90aGVyIGRpcmVjdG9yeSB0cmVlLjwvcD4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7cHJlc2VudCZndDs8L2NvZGU+IHRhZyBzdXBwb3J0cyB0aGUgdXNlIG9mIGEKKyAgICBjb250YWluZWQgPGEgaHJlZj0ibWFwcGVyLmh0bWwiPjxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudAorICAgIHRvIGRlZmluZSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgdG8gYmUgdGVzdGVkIGFnYWluc3QuIElmIG5vCisgICAgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQgaXMgc3BlY2lmaWVkLCB0aGUKKyAgICA8Y29kZT5pZGVudGl0eTwvY29kZT4gdHlwZSBtYXBwZXIgaXMgdXNlZC48L3A+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O3ByZXNlbnQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBpcyBjYXNlLXNlbnNpdGl2ZS48L3A+CisKKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0ZGlyPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgdG8gbG9vayBmb3IgdGhlIGZpbGVzIHRvIGNvbXBhcmUKKyAgICAgICAgICBhZ2FpbnN0LiBUaGUgcHJlY2lzZSBsb2NhdGlvbiBkZXBlbmRzIG9uIGEgY29tYmluYXRpb24gb2YgdGhpcworICAgICAgICAgIGF0dHJpYnV0ZSBhbmQgdGhlIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50LCBpZiBhbnkuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlc2VudDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB3ZSBhcmUgcmVxdWlyaW5nIHRoYXQgYSBmaWxlIGlzIHByZXNlbnQgaW4KKyAgICAgICAgICB0aGUgc3JjIGRpcmVjdG9yeSB0cmVlIG9ubHksIG9yIGluIGJvdGggdGhlIHNyYyBhbmQgdGhlIHRhcmdldAorICAgICAgICAgIGRpcmVjdG9yeSB0cmVlLiBWYWxpZCB2YWx1ZXMgYXJlOgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT5zcmNvbmx5IC0gc2VsZWN0IGZpbGVzIG9ubHkgaWYgdGhleSBhcmUgaW4gdGhlIHNyYworICAgICAgICAgICAgICBkaXJlY3RvcnkgdHJlZSBidXQgbm90IGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRyZWUKKyAgICAgICAgICAgIDxsaT5ib3RoIC0gc2VsZWN0IGZpbGVzIG9ubHkgaWYgdGhleSBhcmUgcHJlc2VudCBib3RoIGluIHRoZQorICAgICAgICAgICAgICBzcmMgYW5kIHRhcmdldCBkaXJlY3RvcnkgdHJlZXMKKyAgICAgICAgICA8L3VsPgorICAgICAgICAgIERlZmF1bHQgaXMgYm90aC4gU2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byAmcXVvdDtzcmNvbmx5JnF1b3Q7CisgICAgICAgICAgaXMgZXF1aXZhbGVudCB0byB3cmFwcGluZyB0aGUgc2VsZWN0b3IgaW4gdGhlIDxjb2RlPiZsdDtub3QmZ3Q7PC9jb2RlPgorICAgICAgICAgIHNlbGVjdG9yIGNvbnRhaW5lci4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgUHJlc2VudCBTZWxlY3Rvcjo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7YW50LjEuNX0vc3JjL21haW4mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7Jmd0OworICAgICZsdDtwcmVzZW50IHByZXNlbnQ9JnF1b3Q7c3Jjb25seSZxdW90OyB0YXJnZXRkaXI9JnF1b3Q7JHthbnQuMS40LjF9L3NyYy9tYWluJnF1b3Q7LyZndDsKKyZsdDsvZmlsZXNldCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworICAgIDxwPlNlbGVjdHMgYWxsIHRoZSBKYXZhIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgbmV3IGluIHRoZQorICAgICAgMS41IHJlbGVhc2UuCisgICAgPC9wPgorCisgICAgPGEgbmFtZT0icmVnZXhwc2VsZWN0Ij48L2E+CisgICAgPGg0PlJlZ3VsYXIgRXhwcmVzc2lvbiBTZWxlY3RvcjwvaDQ+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2NvbnRhaW5zcmVnZXhwJmd0OzwvY29kZT4gdGFnIGluIGEgRmlsZVNldCBsaW1pdHMKKyAgICB0aGUgZmlsZXMgZGVmaW5lZCBieSB0aGF0IGZpbGVzZXQgdG8gb25seSB0aG9zZSB3aGljaCBjb250YWluIGEKKyAgICBtYXRjaCB0byB0aGUgcmVndWxhciBleHByZXNzaW9uIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+ZXhwcmVzc2lvbjwvY29kZT4gYXR0cmlidXRlLgorICAgIDwvcD4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2NvbnRhaW5zcmVnZXhwJmd0OzwvY29kZT4gc2VsZWN0b3IgY2FuIGJlIHVzZWQgYXMgYQorICAgICAgUmVzb3VyY2VTZWxlY3RvciAoc2VlIHRoZQorICAgICAgPGEgaHJlZj0icmVzb3VyY2VzLmh0bWwjcmVzdHJpY3QiPiZsdDtyZXN0cmljdCZndDs8L2E+CisgICAgICBSZXNvdXJjZUNvbGxlY3Rpb24pLjwvcD4KKworICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5leHByZXNzaW9uPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG11c3QKKyAgICAgICAgbWF0Y2ggdHJ1ZSBpbiBldmVyeSBmaWxlPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBTZWxlY3Rvcjo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7ZG9jLnBhdGh9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoudHh0JnF1b3Q7Jmd0OworICAgICZsdDtjb250YWluc3JlZ2V4cCBleHByZXNzaW9uPSZxdW90O1s0LTZdXC5bMC05XSZxdW90Oy8mZ3Q7CismbHQ7L2ZpbGVzZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKyAgICA8cD5TZWxlY3RzIGFsbCB0aGUgdGV4dCBmaWxlcyB0aGF0IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAoaGF2ZSBhIDQsNSBvciA2IGZvbGxvd2VkIGJ5IGEgcGVyaW9kIGFuZCBhIG51bWJlciBmcm9tIDAgdG8gOSkuCisKKworICAgIDxhIG5hbWU9InNpemVzZWxlY3QiPjwvYT4KKyAgICA8aDQ+U2l6ZSBTZWxlY3RvcjwvaDQ+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O3NpemUmZ3Q7PC9jb2RlPiB0YWcgaW4gYSBGaWxlU2V0IHdpbGwgcHV0CisgICAgYSBsaW1pdCBvbiB0aGUgZmlsZXMgc3BlY2lmaWVkIGJ5IHRoZSBpbmNsdWRlIHRhZywgc28gdGhhdCB0YWdzCisgICAgd2hpY2ggZG8gbm90IG1lZXQgdGhlIHNpemUgbGltaXRzIHNwZWNpZmllZCBieSB0aGUgc2VsZWN0b3Igd2lsbCBub3QKKyAgICBlbmQgdXAgYmVpbmcgc2VsZWN0ZWQuPC9wPgorCisgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc2l6ZSBvZiB0aGUgZmlsZSB3aGljaCBzaG91bGQgYmUgdGVzdGVkIGZvci4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj51bml0czwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHVuaXRzIHRoYXQgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBhdHRyaWJ1dGUKKyAgICAgICAgICBpcyBleHByZXNzZWQgaW4uIFdoZW4gdXNpbmcgdGhlIHN0YW5kYXJkIHNpbmdsZSBsZXR0ZXIgU0kKKyAgICAgICAgICBkZXNpZ25hdGlvbnMsIHN1Y2ggYXMgJnF1b3Q7ayZxdW90OywmcXVvdDtNJnF1b3Q7LCBvcgorICAgICAgICAgICZxdW90O0cmcXVvdDssIG11bHRpcGxlcyBvZiAxMDAwIGFyZSB1c2VkLiBJZiB5b3Ugd2FudCB0byB1c2UKKyAgICAgICAgICBwb3dlciBvZiAyIHVuaXRzLCB1c2UgdGhlIElFQyBzdGFuZGFyZDogJnF1b3Q7S2kmcXVvdDsgZm9yIDEwMjQsCisgICAgICAgICAgJnF1b3Q7TWkmcXVvdDsgZm9yIDEwNDg1NzYsIGFuZCBzbyBvbi4gVGhlIGRlZmF1bHQgaXMgbm8gdW5pdHMsCisgICAgICAgICAgd2hpY2ggbWVhbnMgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSBleGFjdAorICAgICAgICAgIG51bWJlciBvZiBieXRlcy4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPndoZW48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyBob3cgdG8gaW50ZXJwcmV0IHRoZSBzaXplLCB3aGV0aGVyCisgICAgICAgICAgdGhlIGZpbGVzIHRvIGJlIHNlbGVjdGVkIHNob3VsZCBiZSBsYXJnZXIsIHNtYWxsZXIsIG9yIGVxdWFsIHRvCisgICAgICAgICAgdGhhdCB2YWx1ZS4gQWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlIGFyZToKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+bGVzcyAtIHNlbGVjdCBmaWxlcyBsZXNzIHRoYW4gdGhlIGluZGljYXRlZCBzaXplCisgICAgICAgICAgICA8bGk+bW9yZSAtIHNlbGVjdCBmaWxlcyBncmVhdGVyIHRoYW4gdGhlIGluZGljYXRlZCBzaXplCisgICAgICAgICAgICA8bGk+ZXF1YWwgLSBzZWxlY3QgZmlsZXMgdGhpcyBleGFjdCBzaXplCisgICAgICAgICAgPC91bD4KKyAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBlcXVhbC4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU2l6ZSBTZWxlY3Rvcjo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7amFyLnBhdGh9JnF1b3Q7Jmd0OworICAmbHQ7cGF0dGVybnNldCZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamFyJnF1b3Q7LyZndDsKKyAgJmx0Oy9wYXR0ZXJuc2V0Jmd0OworICAmbHQ7c2l6ZSB2YWx1ZT0mcXVvdDs0JnF1b3Q7IHVuaXRzPSZxdW90O0tpJnF1b3Q7IHdoZW49JnF1b3Q7bW9yZSZxdW90Oy8mZ3Q7CismbHQ7L2ZpbGVzZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKyAgICA8cD5TZWxlY3RzIGFsbCBKQVIgZmlsZXMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gNDA5NiBieXRlcy48L3A+CisKKyAgICA8YSBuYW1lPSJ0eXBlc2VsZWN0Ij48L2E+CisgICAgPGg0PlR5cGUgU2VsZWN0b3I8L2g0PgorCisgICAgPHA+VGhlIDxjb2RlPiZsdDt0eXBlJmd0OzwvY29kZT4gdGFnIHNlbGVjdHMgZmlsZXMgb2YgYSBjZXJ0YWluIHR5cGU6CisgICAgZGlyZWN0b3J5IG9yIHJlZ3VsYXIuPC9wPgorCisgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB0eXBlIG9mIGZpbGUgd2hpY2ggc2hvdWxkIGJlIHRlc3RlZCBmb3IuCisgICAgICAgICAgICBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgPGxpPmZpbGUgLSByZWd1bGFyIGZpbGVzPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+ZGlyIC0gZGlyZWN0b3JpZXM8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFR5cGUgU2VsZWN0b3IgdG8gc2VsZWN0IG9ubHkKKyAgICBkaXJlY3RvcmllcyBpbiA8Y29kZT4ke3NyY308L2NvZGU+PC9wPgorCisgICAgPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3NyY30mcXVvdDsmZ3Q7CisgICZsdDt0eXBlIHR5cGU9ImRpciIvJmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisgICAgPHA+VGhlIFR5cGUgU2VsZWN0b3IgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIHNlbGVjdG9ycy4KKyAgICBGb3IgZXhhbXBsZSwgdG8gc2VsZWN0IGZpbGVzIHRoYXQgYWxzbyBleGlzdCBpbiBhIDxjb2RlPnRlbXBsYXRlPC9jb2RlPgorICAgIGRpcmVjdG9yeSwgYnV0IGF2b2lkIHNlbGVjdGluZyBlbXB0eSBkaXJlY3RvcmllcywgdXNlOgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSIke3NyY30iJmd0OworICAgICZsdDthbmQmZ3Q7CisgICAgICAgICZsdDtwcmVzZW50IHRhcmdldGRpcj0idGVtcGxhdGUiLyZndDsKKyAgICAgICAgJmx0O3R5cGUgdHlwZT0iZmlsZSIvJmd0OworICAgICZsdDsvYW5kJmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisKKyAgICA8YSBuYW1lPSJtb2RpZmllZCI+PC9hPgorICAgIDxoND5Nb2RpZmllZCBTZWxlY3RvcjwvaDQ+CisgICAgPHA+VGhlIDxjb2RlPiZsdDttb2RpZmllZCZndDs8L2NvZGU+IHNlbGVjdG9yIGNvbXB1dGVzIGEgdmFsdWUgZm9yIGEgZmlsZSwgY29tcGFyZXMgdGhhdAorICAgIHRvIHRoZSB2YWx1ZSBzdG9yZWQgaW4gYSBjYWNoZSBhbmQgc2VsZWN0IHRoZSBmaWxlLCBpZiB0aGVzZSB0d28gdmFsdWVzCisgICAgZGlmZmVyLjwvcD4KKyAgICA8cD5CZWNhdXNlIHRoaXMgc2VsZWN0b3IgaXMgaGlnaGx5IGNvbmZpZ3VyYWJsZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlbGVjdGlvbiBpcyBkb25lCisgICAgaXM6IDxvbD4KKyAgICAgICAgPGxpPiBnZXQgdGhlIGFic29sdXRlIHBhdGggZm9yIHRoZSBmaWxlIDwvbGk+CisgICAgICAgIDxsaT4gZ2V0IHRoZSBjYWNoZWQgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJlZCBjYWNoZSAoYWJzb2x1dGUgcGF0aCBhcyBrZXkpIDwvbGk+CisgICAgICAgIDxsaT4gZ2V0IHRoZSBuZXcgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJlZCBhbGdvcml0aG0gPC9saT4KKyAgICAgICAgPGxpPiBjb21wYXJlIHRoZXNlIHR3byB2YWx1ZXMgd2l0aCB0aGUgY29uZmlndXJlZCBjb21wYXJhdG9yIDwvbGk+CisgICAgICAgIDxsaT4gdXBkYXRlIHRoZSBjYWNoZSBpZiBuZWVkZWQgYW5kIHJlcXVlc3RlZCA8L2xpPgorICAgICAgICA8bGk+IGRvIHRoZSBzZWxlY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSBjb21wYXJpc29uIHJlc3VsdCA8L2xpPgorICAgICAgICA8L29sPgorICAgIFRoZSBjb21wYXJpc29uLCBjb21wdXRpbmcgb2YgdGhlIGhhc2h2YWx1ZSBhbmQgdGhlIHN0b3JlIGlzIGRvbmUgYnkgaW1wbGVtZW50YXRpb24KKyAgICBvZiBzcGVjaWFsIGludGVyZmFjZXMuIFRoZXJlZm9yZSB0aGV5IG1heSBwcm92aWRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycy48L3A+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O21vZGlmaWVkJmd0OzwvY29kZT4gc2VsZWN0b3IgY2FuIGJlIHVzZWQgYXMgYQorICAgICAgUmVzb3VyY2VTZWxlY3RvciAoc2VlIHRoZQorICAgICAgPGEgaHJlZj0icmVzb3VyY2VzLmh0bWwjcmVzdHJpY3QiPiZsdDtyZXN0cmljdCZndDs8L2E+CisgICAgICBSZXNvdXJjZUNvbGxlY3Rpb24pLgorICAgIEluIHRoYXQgY2FzZSBpdCBtYXBzIHNpbXBsZSBmaWxlIHJlc291cmNlcyB0byBmaWxlcyBhbmQgZG9lcyBpdHMgam9iLiBJZiB0aGUKKyAgICByZXNvdXJjZSBpcyBmcm9tIGFub3RoZXIgdHlwZSwgdGhlIDxjb2RlPiZsdDttb2RpZmllZCZndDs8L2NvZGU+IHNlbGVjdG9yIHRyaWVzCisgICAgdG8gKDxiPmF0dGVudGlvbiE8L2I+KSBjb3B5IHRoZSBjb250ZW50IGludG8gYSBsb2NhbCBmaWxlIGZvciBjb21wdXRpbmcgdGhlCisgICAgaGFzaHZhbHVlLjwvcD4KKworICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gYWxnb3JpdGhtIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFRoZSB0eXBlIG9mIGFsZ29yaXRobSBzaG91bGQgYmUgdXNlZC4KKyAgICAgICAgICAgIEFjY2VwdGFibGUgdmFsdWVzIGFyZSAoZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgbGF0ZXIpOgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT4gaGFzaHZhbHVlIC0gSGFzaHZhbHVlQWxnb3JpdGhtIDwvbGk+CisgICAgICAgICAgICAgICAgPGxpPiBkaWdlc3QgLSBEaWdlc3RBbGdvcml0aG0gPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+IGNoZWNrc3VtIC0gQ2hlY2tzdW1BbGdvcml0aG0gPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+IE5vLCBkZWZhdWx0cyB0byA8aT5kaWdlc3Q8L2k+IDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBjYWNoZSA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBUaGUgdHlwZSBvZiBjYWNoZSBzaG91bGQgYmUgdXNlZC4KKyAgICAgICAgICAgIEFjY2VwdGFibGUgdmFsdWVzIGFyZSAoZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgbGF0ZXIpOgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT4gcHJvcGVydHlmaWxlIC0gUHJvcGVydHlmaWxlQ2FjaGUgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+IE5vLCBkZWZhdWx0cyB0byA8aT5wcm9wZXJ0eWZpbGU8L2k+IDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBjb21wYXJhdG9yIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFRoZSB0eXBlIG9mIGNvbXBhcmF0b3Igc2hvdWxkIGJlIHVzZWQuCisgICAgICAgICAgICBBY2NlcHRhYmxlIHZhbHVlcyBhcmUgKGZ1cnRoZXIgaW5mb3JtYXRpb24gc2VlIGxhdGVyKToKKyAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+IGVxdWFsIC0gRXF1YWxDb21wYXJhdG9yIDwvbGk+CisgICAgICAgICAgICAgICAgPGxpPiBydWxlIC0gamF2YS50ZXh0LlJ1bGVCYXNlZENvbGxhdG9yCisgICAgICAgICAgICAgICAgICA8IS0tIE5PVEUgLS0+CisgICAgICAgICAgICAgICAgICA8aT4oc2VlIDxhIGhyZWY9IiNNb2RTZWxOb3RlIj5ub3RlPC9hPiBmb3IgcmVzdHJpY3Rpb25zKTwvaT4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4gTm8sIGRlZmF1bHRzIHRvIDxpPmVxdWFsPC9pPiA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gYWxnb3JpdGhtY2xhc3MgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gQ2xhc3NuYW1lIG9mIGN1c3RvbSBhbGdvcml0aG0gaW1wbGVtZW50YXRpb24uIExvd2VyCisgICAgICAgICAgcHJpb3JpdHkgdGhhbiA8aT5hbGdvcml0aG08L2k+LiA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPiBObyA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gY2FjaGVjbGFzcyA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBDbGFzc25hbWUgb2YgY3VzdG9tIGNhY2hlIGltcGxlbWVudGF0aW9uLiBMb3dlcgorICAgICAgICAgIHByaW9yaXR5IHRoYW4gPGk+Y2FjaGU8L2k+LiA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPiBObyA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gY29tcGFyYXRvcmNsYXNzIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IENsYXNzbmFtZSBvZiBjdXN0b20gY29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbi4gTG93ZXIKKyAgICAgICAgICBwcmlvcml0eSB0aGFuIDxpPmNvbXBhcmF0b3I8L2k+LiA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPiBObyA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gdXBkYXRlIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFNob3VsZCB0aGUgY2FjaGUgYmUgdXBkYXRlZCB3aGVuIHZhbHVlcyBkaWZmZXI/IChib29sZWFuKSA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPiBObywgZGVmYXVsdHMgdG8gPGk+dHJ1ZTwvaT4gPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IHNlbGRpcnMgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gU2hvdWxkIGRpcmVjdG9yaWVzIGJlIHNlbGVjdGVkPyAoYm9vbGVhbikgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4gTm8sIGRlZmF1bHRzIHRvIDxpPnRydWU8L2k+IDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBzZWxyZXMgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gU2hvdWxkIFJlc291cmNlcyB3aGl0aG91dCBhbiBJbnB1dFN0cmVhbSwgYW5kCisgICAgICAgICAgIHRoZXJlZm9yZSB3aXRob3V0IGNoZWNraW5nLCBiZSBzZWxlY3RlZD8gIChib29sZWFuKSA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPiBObywgZGVmYXVsdHMgdG8gPGk+dHJ1ZTwvaT4uIE9ubHkgcmVsZXZhbnQKKyAgICAgICAgICAgd2hlbiB1c2VkIGFzIFJlc291cmNlU2VsZWN0b3IuIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBkZWxheXVwZGF0ZSA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBJZiBzZXQgdG8gPGk+dHJ1ZTwvaT4sIHRoZSBzdG9yYWdlIG9mIHRoZSBjYWNoZSB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlCisgICAgICAgICAgICAgbmV4dCBmaW5pc2hlZCBCdWlsZEV2ZW50OyB0YXNrIGZpbmlzaGVkLCB0YXJnZXQgZmluaXNoZWQgb3IgYnVpbGQgZmluaXNoZWQsCisgICAgICAgICAgICAgd2hpY2hldmVyIGNvbWVzIGZpcnN0LiAgVGhpcyBpcyBwcm92aWRlZCBmb3IgaW5jcmVhc2VkIHBlcmZvcm1hbmNlLiAgSWYgc2V0CisgICAgICAgICAgICAgdG8gPGk+ZmFsc2U8L2k+LCB0aGUgc3RvcmFnZSBvZiB0aGUgY2FjaGUgd2lsbCBoYXBwZW4gd2l0aCBlYWNoIGNoYW5nZS4gIFRoaXMKKyAgICAgICAgICAgICBhdHRyaWJ1dGUgZGVwZW5kcyB1cG9uIHRoZSA8aT51cGRhdGU8L2k+IGF0dHJpYnV0ZS4gKGJvb2xlYW4pPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4gTm8sIGRlZmF1bHRzIHRvIDxpPnRydWU8L2k+IDwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8cD5UaGVzZSBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgd2l0aCBuZXN0ZWQgPGNvZGU+Jmx0O3BhcmFtLyZndDs8L2NvZGU+IHRhZ3MuIFdpdGggPGNvZGU+Jmx0O3BhcmFtLyZndDs8L2NvZGU+CisgICAgdGFncyB5b3UgY2FuIHNldCBvdGhlciB2YWx1ZXMgdG9vIC0gYXMgbG9uZyBhcyB0aGV5IGFyZSBuYW1lZCBhY2NvcmRpbmcgdG8KKyAgICB0aGUgZm9sbG93aW5nIHJ1bGVzOiA8dWw+CisgICAgICAgIDxsaT4gPGI+IGFsZ29yaXRobSA8L2I+OiBzYW1lIGFzIGF0dHJpYnV0ZSBhbGdvcml0aG0gPC9saT4KKyAgICAgICAgPGxpPiA8Yj4gY2FjaGUgPC9iPjogc2FtZSBhcyBhdHRyaWJ1dGUgY2FjaGUgPC9saT4KKyAgICAgICAgPGxpPiA8Yj4gY29tcGFyYXRvciA8L2I+OiBzYW1lIGFzIGF0dHJpYnV0ZSBjb21wYXJhdG9yIDwvbGk+CisgICAgICAgIDxsaT4gPGI+IGFsZ29yaXRobWNsYXNzIDwvYj46IHNhbWUgYXMgYXR0cmlidXRlIGFsZ29yaXRobWNsYXNzIDwvbGk+CisgICAgICAgIDxsaT4gPGI+IGNhY2hlY2xhc3MgPC9iPjogc2FtZSBhcyBhdHRyaWJ1dGUgY2FjaGVjbGFzcyA8L2xpPgorICAgICAgICA8bGk+IDxiPiBjb21wYXJhdG9yY2xhc3MgPC9iPjogc2FtZSBhcyBhdHRyaWJ1dGUgY29tcGFyYXRvcmNsYXNzIDwvbGk+CisgICAgICAgIDxsaT4gPGI+IHVwZGF0ZSA8L2I+OiBzYW1lIGFzIGF0dHJpYnV0ZSB1cGRhdGUgPC9saT4KKyAgICAgICAgPGxpPiA8Yj4gc2VsZGlycyA8L2I+OiBzYW1lIGFzIGF0dHJpYnV0ZSBzZWxkaXJzIDwvbGk+CisgICAgICAgIDxsaT4gPGI+IGFsZ29yaXRobS4qIDwvYj46IFZhbHVlIGlzIHRyYW5zZmVyZWQgdG8gdGhlIGFsZ29yaXRobSB2aWEgaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpPnNldDwvaT5YWC1tZXRob2RzIDwvbGk+CisgICAgICAgIDxsaT4gPGI+IGNhY2hlLiogPC9iPjogVmFsdWUgaXMgdHJhbnNmZXJlZCB0byB0aGUgY2FjaGUgdmlhIGl0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aT5zZXQ8L2k+WFgtbWV0aG9kcyA8L2xpPgorICAgICAgICA8bGk+IDxiPiBjb21wYXJhdG9yLiogPC9iPjogVmFsdWUgaXMgdHJhbnNmZXJlZCB0byB0aGUgY29tcGFyYXRvciB2aWEgaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpPnNldDwvaT5YWC1tZXRob2RzIDwvbGk+CisgICAgPC91bD48L3A+CisKKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIyIj48Zm9udCBzaXplPSIrMSI+PGI+IEFsZ29yaXRobSBvcHRpb25zPC9iPjwvZm9udD48L3RkPjwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+TmFtZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBoYXNodmFsdWUgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGludG8gYSBqYXZhLmxhbmcuU3RyaW5nCisgICAgICAgICAgYW5kIHVzZSB0aGF0cyBoYXNoVmFsdWUoKS4gTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHJlcXVpcmVkLgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gZGlnZXN0IDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFVzZXMgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0LiBUaGlzIEFsZ29yaXRobSBzdXBwb3J0cworICAgICAgICAgIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGk+YWxnb3JpdGhtLmFsZ29yaXRobTwvaT4gKG9wdGlvbmFsKTogTmFtZSBvZiB0aGUgRGlnZXN0IGFsZ29yaXRobQorICAgICAgICAgICAgICAgIChlLmcuICdNRDUnIG9yICdTSEEnLCBkZWZhdWx0ID0gPGk+TUQ1PC9pPikgPC9saT4KKyAgICAgICAgICAgIDxsaT48aT5hbGdvcml0aG0ucHJvdmlkZXI8L2k+IChvcHRpb25hbCk6IE5hbWUgb2YgdGhlIERpZ2VzdCBwcm92aWRlcgorICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gPGk+bnVsbDwvaT4pIDwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IGNoZWNrc3VtIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFVzZXMgamF2YS51dGlsLnppcC5DaGVja3N1bS4gVGhpcyBBbGdvcml0aG0gc3VwcG9ydHMKKyAgICAgICAgICB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxpPmFsZ29yaXRobS5hbGdvcml0aG08L2k+IChvcHRpb25hbCk6IE5hbWUgb2YgdGhlIGFsZ29yaXRobQorICAgICAgICAgICAgICAgIChlLmcuICdDUkMnIG9yICdBRExFUicsIGRlZmF1bHQgPSA8aT5DUkM8L2k+KSA8L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIyIj48Zm9udCBzaXplPSIrMSI+PGI+IENhY2hlIG9wdGlvbnMgPC9iPjwvZm9udD48L3RkPjwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IHByb3BlcnR5ZmlsZSA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBVc2UgdGhlIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGNsYXNzIGFuZCBpdHMgcG9zc2liaWxpdHkKKyAgICAgICAgICB0byBsb2FkIGFuZCBzdG9yZSB0byBmaWxlLgorICAgICAgICAgIFRoaXMgQ2FjaGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48aT5jYWNoZS5jYWNoZWZpbGU8L2k+IChvcHRpb25hbCk6IE5hbWUgb2YgdGhlIHByb3BlcnRpZXMtZmlsZQorICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gPGk+Y2FjaGUucHJvcGVydGllczwvaT4pIDwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+PHRkIGNvbHNwYW49IjIiPjxmb250IHNpemU9IisxIj48Yj4gQ29tcGFyYXRvciBvcHRpb25zPC9iPjwvZm9udD48L3RkPjwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IGVxdWFsIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFZlcnkgc2ltcGxlIG9iamVjdCBjb21wYXJpc29uLiA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gcnVsZSA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBVc2VzIDxpPmphdmEudGV4dC5SdWxlQmFzZWRDb2xsYXRvcjwvaT4gZm9yIE9iamVjdAorICAgICAgICAgIGNvbXBhcmlzb24uCisgICAgICAgICAgPCEtLSBOT1RFIC0tPgorICAgICAgICAgIDxpPihzZWUgPGEgaHJlZj0iI01vZFNlbE5vdGUiPm5vdGU8L2E+IGZvciByZXN0cmljdGlvbnMpPC9pPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPHA+VGhlIDxjb2RlPiZsdDttb2RpZmllZCZndDs8L2NvZGU+IHNlbGVjdG9yIHN1cHBvcnRzIGEgbmVzdGVkCisgICAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj4KKyAgICBQQVRIIGxpa2Ugc3RydWN0dXJlPC9hPiBmb3IgZmluZGluZyBjdXN0b20gaW50ZXJmYWNlIGltcGxlbWVudGF0aW9ucy4gPC9wPgorCisgICAgPHA+SGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRoZSBNb2RpZmllZCBTZWxlY3Rvcjo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorICAgICZsdDtjb3B5IHRvZGlyPSJkZXN0IiZndDsKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJzcmMiJmd0OworICAgICAgICAgICAgJmx0O21vZGlmaWVkLyZndDsKKyAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICZsdDsvY29weSZndDsKKyAgICA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAgPHA+VGhpcyB3aWxsIGNvcHkgYWxsIGZpbGVzIGZyb20gPGk+c3JjPC9pPiB0byA8aT5kZXN0PC9pPiB3aGljaCBjb250ZW50IGhhcyBjaGFuZ2VkLgorICAgIFVzaW5nIGFuIHVwZGF0aW5nIFByb3BlcnR5ZmlsZUNhY2hlIHdpdGggY2FjaGUucHJvcGVydGllcyBhbmQKKyAgICBNRDUtRGlnZXN0QWxnb3JpdGhtLjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxwcmU+CisgICAgJmx0O2NvcHkgdG9kaXI9ImRlc3QiJmd0OworICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9InNyYyImZ3Q7CisgICAgICAgICAgICAmbHQ7bW9kaWZpZWQgdXBkYXRlPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgIHNlbGRpcnM9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgY2FjaGU9InByb3BlcnR5ZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG09ImRpZ2VzdCIKKyAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yPSJlcXVhbCImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImNhY2hlLmNhY2hlZmlsZSIgICAgIHZhbHVlPSJjYWNoZS5wcm9wZXJ0aWVzIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobS5hbGdvcml0aG0iIHZhbHVlPSJNRDUiLyZndDsKKyAgICAgICAgICAgICZsdDsvbW9kaWZpZWQmZ3Q7CisgICAgICAgICZsdDsvZmlsZXNldCZndDsKKyAgICAmbHQ7L2NvcHkmZ3Q7CisgICAgPC9wcmU+PC9ibG9ja3F1b3RlPgorICA8cD5UaGlzIGlzIHRoZSBzYW1lIGV4YW1wbGUgcmV3cml0dGVuIGFzIENvcmVTZWxlY3RvciB3aXRoIHNldHRpbmcgdGhlIGFsbCB0aGUgdmFsdWVzCisgIChzYW1lIGFzIGRlZmF1bHRzIGFyZSkuPC9wPgorCisgICAgPGJsb2NrcXVvdGU+PHByZT4KKyAgICAmbHQ7Y29weSB0b2Rpcj0iZGVzdCImZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0ic3JjIiZndDsKKyAgICAgICAgICAgICZsdDtjdXN0b20gY2xhc3M9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLk1vZGlmaWVkU2VsZWN0b3IiJmd0OworICAgICAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJ1cGRhdGUiICAgICB2YWx1ZT0idHJ1ZSIvJmd0OworICAgICAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJzZWxkaXJzIiAgICB2YWx1ZT0idHJ1ZSIvJmd0OworICAgICAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJjYWNoZSIgICAgICB2YWx1ZT0icHJvcGVydHlmaWxlIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobSIgIHZhbHVlPSJkaWdlc3QiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0iY29tcGFyYXRvciIgdmFsdWU9ImVxdWFsIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImNhY2hlLmNhY2hlZmlsZSIgICAgIHZhbHVlPSJjYWNoZS5wcm9wZXJ0aWVzIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobS5hbGdvcml0aG0iIHZhbHVlPSJNRDUiLyZndDsKKyAgICAgICAgICAgICZsdDsvY3VzdG9tJmd0OworICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICAgJmx0Oy9jb3B5Jmd0OworICAgIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgPHA+QW5kIHRoaXMgaXMgdGhlIHNhbWUgcmV3cml0dGVuIGFzIEN1c3RvbVNlbGVjdG9yLjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxwcmU+CisgICZsdDt0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtYW5kLXVwbG9hZC1zaXRlIiZndDsKKyAgICAgICZsdDtlY2hvJmd0OyBnZW5lcmF0ZSB0aGUgc2l0ZSB1c2luZyBmb3JyZXN0ICZsdDsvZWNobyZndDsKKyAgICAgICZsdDthbnRjYWxsIHRhcmdldD0ic2l0ZSIvJmd0OworCisgICAgICAmbHQ7ZWNobyZndDsgdXBsb2FkIHRoZSBjaGFuZ2VkIGZpbGUgJmx0Oy9lY2hvJmd0OworICAgICAgJmx0O2Z0cCBzZXJ2ZXI9IiR7ZnRwLnNlcnZlcn0iIHVzZXJpZD0iJHtmdHAudXNlcn0iIHBhc3N3b3JkPSIke2Z0cC5wd2R9IiZndDsKKyAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiJmd0OworICAgICAgICAgICAgICAmbHQ7bW9kaWZpZWQvJmd0OworICAgICAgICAgICZsdDsvZmlsZXNldCZndDsKKyAgICAgICZsdDsvZnRwJmd0OworICAmbHQ7L3RhcmdldCZndDsKKyAgICA8L3ByZT48L2Jsb2NrcXVvdGU+CisgIDxwPkEgdXNlZnVsIHNjZW5hcmlvIGZvciB0aGlzIHNlbGVjdG9yIGluc2lkZSBhIGJ1aWxkIGVudmlyb25tZW50CisgIGZvciBob21lcGFnZSBnZW5lcmF0aW9uIChlLmcuIHdpdGggPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL2ZvcnJlc3QvIj4KKyAgQXBhY2hlIEZvcnJlc3Q8L2E+KS4gSGVyZSBhbGwgPGI+Y2hhbmdlZDwvYj4gZmlsZXMgYXJlIHVwbG9hZGVkIHRvIHRoZSBzZXJ2ZXIuIFRoZQorICBDYWNoZVNlbGVjdG9yIHNhdmVzIHRoZXJlZm9yZSBtdWNoIHVwbG9hZCB0aW1lLjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxwcmU+CisgICZsdDttb2RpZmllZCBjYWNoZWNsYXNzbmFtZT0iY29tLm15Y29tcGFueS5NeUNhY2hlIiZndDsKKyAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJsaWIvbXljb21wb255LWFudHV0aWwuamFyIi8mZ3Q7CisgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgJmx0Oy9tb2RpZmllZCZndDsKKyAgICA8L3ByZT48L2Jsb2NrcXVvdGU+CisgICAgPHA+VXNlcyA8dHQ+Y29tLm15Y29tcGFueS5NeUNhY2hlPC90dD4gZnJvbSBhIGphciBvdXRzaWRlIG9mIEFudHMgb3duIGNsYXNzcGF0aAorICAgIGFzIGNhY2hlIGltcGxlbWVudGF0aW9uPC9wPgorCisgIDxhIG5hbWU9Ik1vZFNlbE5vdGUiPjwvYT4KKyAgPGg0Pk5vdGUgb24gUnVsZUJhc2VkQ29sbGF0b3I8L2g0PgorICA8cD5UaGUgUnVsZUJhc2VkQ29sbGF0b3IgbmVlZHMgYSBmb3JtYXQgZm9yIGl0cyB3b3JrLCBidXQgaXRzIG5lZWRlZCB3aGlsZQorICBpbnN0YW50aWF0aW9uLiBUaGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIGluaXRpYWxpemF0aW9uIGFsZ29yaXRobSBmb3IgdGhpcworICBjYXNlLiBUaGVyZWZvcmUgeW91IHNob3VsZCBub3QgdXNlIHRoaXMgKG9yIHRlbGwgbWUgdGhlIHdvcmthcm91bmQgOi0pLjwvcD4KKworICAgICAgPGEgbmFtZT0ic2lnbmVkc2VsZWN0b3IiPjwvYT4KKyAgICAgIDxoND5TaWduZWQgU2VsZWN0b3I8L2g0PgorCisgICAgICA8cD4KKyAgICAgICAgVGhlIDxjb2RlPiZsdDtzaWduZWRzZWxlY3RvciZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIHNpZ25lZCBmaWxlcyBhbmQgb3B0aW9uYWx5CisgICAgICAgIHNpZ25lZCB3aXRoIGEgY2VydGFpbiBuYW1lLgorICAgICAgPC9wPgorICAgICAgPHA+CisgICAgICAgIFRoaXMgc2VsZWN0b3IgaGFzIGJlZW4gYWRkZWQgaW4gQXBhY2hlIEFudCAxLjcuCisgICAgICA8L3A+CisgICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBUaGUgc2lnbmF0dXJlIG5hbWUgdG8gY2hlY2sgZm9yLjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICA8L3RhYmxlPgorCisgICAgICA8YSBuYW1lPSJzY3JpcHRzZWxlY3RvciI+PC9hPgorICAgICAgPGg0PlNjcmlwdCBTZWxlY3RvcjwvaDQ+CisKKyAgICAgIDxwPgorICAgICAgICBUaGUgPGNvZGU+Jmx0O3NjcmlwdHNlbGVjdG9yJmd0OzwvY29kZT4gZWxlbWVudCBlbmFibGVzIHlvdQorICAgICAgICB0byB3cml0ZSBhIGNvbXBsZXggc2VsZWN0aW9uIGFsZ29yaXRobSBpbiBhbnkKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YiIHRhcmdldD0iX3RvcCI+QXBhY2hlIEJTRjwvYT4KKyAgICAgICAgb3IKKyAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9zY3JpcHRpbmcuZGV2LmphdmEubmV0Ij5KU1IgMjIzPC9hPgorICAgICAgICBzdXBwb3J0ZWQgbGFuZ3VhZ2UuPC9wPgorICAgICAgICBTZWUgdGhlIDxhIGhyZWY9Ii4uL09wdGlvbmFsVGFza3Mvc2NyaXB0Lmh0bWwiPlNjcmlwdDwvYT4gdGFzayBmb3IKKyAgICAgICAgYW4gZXhwbGFuYXRpb24gb2Ygc2NyaXB0cyBhbmQgZGVwZW5kZW5jaWVzLgorICAgICAgPC9wPgorICAgICAgPHA+CisgICAgICAgIFRoaXMgc2VsZWN0b3Igd2FzIGFkZGVkIGluIEFwYWNoZSBBbnQgMS43LgorICAgICAgPC9wPgorICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bGFuZ3VhZ2U8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bGFuZ3VhZ2Ugb2YgdGhlIHNjcmlwdC48L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+eWVzPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWFuYWdlcjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgIFRoZSBzY3JpcHQgZW5naW5lIG1hbmFnZXIgdG8gdXNlLgorICAgICAgICAgICAgU2VlIHRoZSA8YSBocmVmPSIuLi9PcHRpb25hbFRhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2sKKyAgICAgICAgICAgIGZvciB1c2luZyB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0IGlzICJhdXRvIjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlbmFtZSBvZiB0aGUgc2NyaXB0PC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+c2V0YmVhbnM8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciB0byBoYXZlIGFsbCBwcm9wZXJ0aWVzLCByZWZlcmVuY2VzIGFuZCB0YXJnZXRzIGFzCisgICAgICAgICAgICBnbG9iYWwgdmFyaWFibGVzIGluIHRoZSBzY3JpcHQuPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzICJ0cnVlIi48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgICAgICBUaGUgY2xhc3NwYXRoIHRvIHBhc3MgaW50byB0aGUgc2NyaXB0LgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgYQorICAgICAgICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICA8L3RhYmxlPgorICA8cD4KKyAgICBUaGlzIHNlbGVjdG9yIGNhbiB0YWtlIGEgbmVzdGVkICZsdDtjbGFzc3BhdGgmZ3Q7IGVsZW1lbnQuCisgICAgU2VlIHRoZSA8YSBocmVmPSIuLi9PcHRpb25hbFRhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2sKKyAgICBvbiBob3cgdG8gdXNlIHRoaXMgZWxlbWVudC4KKyAgPC9wPgorICAgICAgPHA+CisgICAgICBJZiBubyA8Y29kZT5zcmM8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzdXBwbGllZCwgdGhlIHNjcmlwdCBtdXN0IGJlIG5lc3RlZAorICAgICAgaW5zaWRlIHRoZSBzZWxlY3RvciBkZWNsYXJhdGlvbi4KKyAgICAgIDwvcD4KKyAgICAgIDxwPlRoZSBlbWJlZGRlZCBzY3JpcHQgaXMgaW52b2tlZCBmb3IgZXZlcnkgdGVzdCwgd2l0aAorICAgICAgICAgdGhlIGJlYW4gPGNvZGU+c2VsZjwvY29kZT4KKyAgICAgICAgaXMgYm91bmQgdG8gdGhlIHNlbGVjdG9yLiBJdCBoYXMgYW4gYXR0cmlidXRlIDxjb2RlPnNlbGVjdGVkPC9jb2RlPgorICAgICAgICBtdXN0IGNhbiBiZSBzZXQgdXNpbmcgPGNvZGU+c2V0U2VsZWN0ZWQoYm9vbGVhbik8L2NvZGU+IHRvIHNlbGVjdCB0aGF0CisgICAgICAgIGZpbGUuCisKKyAgICAgIDxwPgorCisgICAgICBUaGUgZm9sbG93aW5nIGJlYW5zIGFyZSBjb25maWd1cmVkIGZvciBldmVyeSBzY3JpcHQsIGFsb25nc2lkZQorICAgICAgdGhlIGNsYXNzaWMgc2V0IG9mIHByb2plY3QsIHByb3BlcnRpZXMsIGFuZCB0YXJnZXRzLgorCisgICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5CZWFuPC9iPjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VHlwZTwvYj48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zZWxmPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNlbGVjdG9yIGluc3RhbmNlPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZW5hbWU8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZW5hbWUgb2YgdGhlIHNlbGVjdGlvbjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiA+U3RyaW5nPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlIG9mIHRoZSBzZWxlY3Rpb248L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgPmphdmEuaW8uRmlsZTwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXI8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+RmlsZXNldCBiYXNlIGRpcmVjdG9yeTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiA+amF2YS5pby5GaWxlPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgPC90YWJsZT4KKyAgICAgIDxwPgorICAgICAgVGhlIDxjb2RlPnNlbGY8L2NvZGU+IGJlYW4gbWFwcyB0byB0aGUgc2VsZWN0b3IsIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nCisgICAgICBhdHRyaWJ1dGVzLiBPbmx5IHRoZSA8Y29kZT5zZWxlY3RlZDwvY29kZT4gZmxhZyBpcyB3cml0ZWFibGUsIHRoZSByZXN0CisgICAgICBhcmUgcmVhZCBvbmx5IHZpYSB0aGVpciBnZXR0ZXIgbWV0aG9kcy4KKworICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+VHlwZTwvYj48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zZWxlY3RlZDwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj53cml0ZWFibGUgZmxhZyB0byBzZWxlY3QgdGhpcyBmaWxlPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPmJvb2xlYW48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlbmFtZTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlbmFtZSBvZiB0aGUgc2VsZWN0aW9uPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiID5TdHJpbmc8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGUgb2YgdGhlIHNlbGVjdGlvbjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiA+amF2YS5pby5GaWxlPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5GaWxlc2V0IGJhc2UgZGlyZWN0b3J5PC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiID5qYXZhLmlvLkZpbGU8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KKworICAgICAgPHA+CisgICAgICBFeGFtcGxlCisgICAgICA8L3A+Cis8cHJlPgorICAgICZsdDtzY3JpcHRzZWxlY3RvciBsYW5ndWFnZT0mcXVvdDtqYXZhc2NyaXB0JnF1b3Q7Jmd0OworICAgICAgc2VsZi5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAmbHQ7L3NjcmlwdHNlbGVjdG9yJmd0OworPC9wcmU+CisgICAgPHA+CisgICAgU2VsZWN0cyBldmVyeSBmaWxlLgorICAgIDwvcD4KKworPHByZT4KKyAgICAmbHQ7c2NyaXB0c2VsZWN0b3IgbGFuZ3VhZ2U9JnF1b3Q7amF2YXNjcmlwdCZxdW90OyZndDsKKyAgICAgIHNlbGYuc2V0U2VsZWN0ZWQoKGZpbGVuYW1lLmxlbmd0aCUyKT09MCk7CisgICAgJmx0Oy9zY3JpcHRzZWxlY3RvciZndDsKKzwvcHJlPgorU2VsZWN0IGZpbGVzIHdob3NlIGZpbGVuYW1lIGxlbmd0aCBpcyBldmVuLgorCisgICAgPGEgbmFtZT0ic2VsZWN0Y29udGFpbmVycyI+PC9hPgorICAgIDxoMz5TZWxlY3RvciBDb250YWluZXJzPC9oMz4KKworICAgIDxwPlRvIGNyZWF0ZSBtb3JlIGNvbXBsZXggc2VsZWN0aW9ucywgYSB2YXJpZXR5IG9mIHNlbGVjdG9ycyB0aGF0CisgICAgY29udGFpbiBvdGhlciBzZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBmb3IgeW91ciB1c2UuIFRoZXkgY29tYmluZSB0aGUKKyAgICBzZWxlY3Rpb25zIG9mIHRoZWlyIGNoaWxkIHNlbGVjdG9ycyBpbiB2YXJpb3VzIHdheXMuPC9wPgorCisgICAgPHA+VGhlIHNlbGVjdG9yIGNvbnRhaW5lcnMgYXJlOjwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT48YSBocmVmPSIjYW5kc2VsZWN0Ij48Y29kZT4mbHQ7YW5kJmd0OzwvY29kZT48L2E+IC0gc2VsZWN0IGEgZmlsZSBvbmx5IGlmIGFsbAorICAgICAgICB0aGUgY29udGFpbmVkIHNlbGVjdG9ycyBzZWxlY3QgaXQuCisgICAgICA8bGk+PGEgaHJlZj0iI21ham9yaXR5c2VsZWN0Ij48Y29kZT4mbHQ7bWFqb3JpdHkmZ3Q7PC9jb2RlPjwvYT4gLSBzZWxlY3QgYSBmaWxlCisgICAgICAgIGlmIGEgbWFqb3JpdHkgb2YgaXRzIHNlbGVjdG9ycyBzZWxlY3QgaXQuCisgICAgICA8bGk+PGEgaHJlZj0iI25vbmVzZWxlY3QiPjxjb2RlPiZsdDtub25lJmd0OzwvY29kZT48L2E+IC0gc2VsZWN0IGEgZmlsZSBvbmx5IGlmCisgICAgICAgIG5vbmUgb2YgdGhlIGNvbnRhaW5lZCBzZWxlY3RvcnMgc2VsZWN0IGl0LgorICAgICAgPGxpPjxhIGhyZWY9IiNub3RzZWxlY3QiPjxjb2RlPiZsdDtub3QmZ3Q7PC9jb2RlPjwvYT4gLSBjYW4gY29udGFpbiBvbmx5IG9uZQorICAgICAgICBzZWxlY3RvciwgYW5kIHJldmVyc2VzIHdoYXQgaXQgc2VsZWN0cyBhbmQgZG9lc24ndCBzZWxlY3QuCisgICAgICA8bGk+PGEgaHJlZj0iI29yc2VsZWN0Ij48Y29kZT4mbHQ7b3ImZ3Q7PC9jb2RlPjwvYT4gLSBzZWxlY3RzIGEgZmlsZSBpZiBhbnkgb25lCisgICAgICAgIG9mIHRoZSBjb250YWluZWQgc2VsZWN0b3JzIHNlbGVjdHMgaXQuCisgICAgICA8bGk+PGEgaHJlZj0iI3NlbGVjdG9yc2VsZWN0Ij48Y29kZT4mbHQ7c2VsZWN0b3ImZ3Q7PC9jb2RlPjwvYT4gLSBjb250YWlucyBvbmx5IG9uZQorICAgICAgICBzZWxlY3RvciBhbmQgZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGl0IHdpdGhvdXQgYWx0ZXJhdGlvbiwgcHJvdmlkZWQKKyAgICAgICAgdGhhdCBhbnkgPGNvZGU+JnF1b3Q7aWYmcXVvdDs8L2NvZGU+IG9yCisgICAgICAgIDxjb2RlPiZxdW90O3VubGVzcyZxdW90OzwvY29kZT4gY29uZGl0aW9ucyBhcmUgbWV0LiBUaGlzCisgICAgICAgIGlzIHRoZSBzZWxlY3RvciB0byB1c2UgaWYgeW91IHdhbnQgdG8gZGVmaW5lIGEgcmVmZXJlbmNlLiBJdCBpcworICAgICAgICB1c2FibGUgYXMgYW4gZWxlbWVudCBvZiA8Y29kZT4mbHQ7cHJvamVjdCZndDs8L2NvZGU+LiBJdCBpcyBhbHNvCisgICAgICAgIHRoZSBvbmUgdG8gdXNlIGlmIHlvdSB3YW50IHNlbGVjdGlvbiBvZiBmaWxlcyB0byBiZSBkZXBlbmRlbnQgb24KKyAgICAgICAgQW50IHByb3BlcnR5IHNldHRpbmdzLgorICAgIDwvdWw+CisKKyAgICA8cD5BbGwgc2VsZWN0b3IgY29udGFpbmVycyBjYW4gY29udGFpbiBhbnkgb3RoZXIgc2VsZWN0b3IsIGluY2x1ZGluZworICAgIG90aGVyIGNvbnRhaW5lcnMsIGFzIGFuIGVsZW1lbnQuIFVzaW5nIGNvbnRhaW5lcnMsIHRoZSBzZWxlY3RvciB0YWdzCisgICAgY2FuIGJlIGFyYml0cmFyaWx5IGRlZXAuIEhlcmUgaXMgYSBjb21wbGV0ZSBsaXN0IG9mIGFsbG93YWJsZQorICAgIHNlbGVjdG9yIGVsZW1lbnRzIHdpdGhpbiBhIGNvbnRhaW5lcjo8L1A+CisKKyAgICA8dWw+CisgICAgICA8bGk+PGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+PC9saT4KKyAgICAgIDxsaT48Y29kZT4mbHQ7Y29udGFpbnMmZ3Q7PC9jb2RlPjwvbGk+CisgICAgICA8bGk+PGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+PC9saT4KKyAgICAgIDxsaT48Y29kZT4mbHQ7ZGF0ZSZndDs8L2NvZGU+PC9saT4KKyAgICAgIDxsaT48Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT48L2xpPgorICAgICAgPGxpPjxjb2RlPiZsdDtkZXB0aCZndDs8L2NvZGU+PC9saT4KKyAgICAgIDxsaT48Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPjwvbGk+CisgICAgICA8bGk+PGNvZGU+Jmx0O21ham9yaXR5Jmd0OzwvY29kZT48L2xpPgorICAgICAgPGxpPjxjb2RlPiZsdDtub25lJmd0OzwvY29kZT48L2xpPgorICAgICAgPGxpPjxjb2RlPiZsdDtub3QmZ3Q7PC9jb2RlPjwvbGk+CisgICAgICA8bGk+PGNvZGU+Jmx0O29yJmd0OzwvY29kZT48L2xpPgorICAgICAgPGxpPjxjb2RlPiZsdDtwcmVzZW50Jmd0OzwvY29kZT48L2xpPgorICAgICAgPGxpPjxjb2RlPiZsdDtzZWxlY3RvciZndDs8L2NvZGU+PC9saT4KKyAgICAgIDxsaT48Y29kZT4mbHQ7c2l6ZSZndDs8L2NvZGU+PC9saT4KKyAgICA8L3VsPgorCisgICAgPGEgbmFtZT0iYW5kc2VsZWN0Ij48L2E+CisgICAgPGg0PkFuZCBTZWxlY3RvcjwvaDQ+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzIHRoYXQgYXJlCisgICAgc2VsZWN0ZWQgYnkgYWxsIG9mIHRoZSBlbGVtZW50cyBpdCBjb250YWlucy4gSXQgcmV0dXJucyBhcworICAgIHNvb24gYXMgaXQgZmluZHMgYSBzZWxlY3RvciB0aGF0IGRvZXMgbm90IHNlbGVjdCB0aGUgZmlsZSwKKyAgICBzbyBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBjaGVjayBldmVyeSBzZWxlY3Rvci4KKyAgICA8L3A+CisKKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgQW5kIFNlbGVjdG9yOjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtkaXN0fSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmphciZxdW90OyZndDsKKyAgICAmbHQ7YW5kJmd0OworICAgICAgICAmbHQ7c2l6ZSB2YWx1ZT0mcXVvdDs0JnF1b3Q7IHVuaXRzPSZxdW90O0tpJnF1b3Q7IHdoZW49JnF1b3Q7bW9yZSZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDtkYXRlIGRhdGV0aW1lPSZxdW90OzAxLzAxLzIwMDEgMTI6MDAgQU0mcXVvdDsgd2hlbj0mcXVvdDtiZWZvcmUmcXVvdDsvJmd0OworICAgICZsdDsvYW5kJmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisgICAgPHA+U2VsZWN0cyBhbGwgdGhlIEpBUiBmaWxlIGxhcmdlciB0aGFuIDQwOTYgYnl0ZXMgd2hpY2ggaGF2ZW4ndCBiZWVuIHVwZGF0ZQorICAgICAgc2luY2UgdGhlIGxhc3QgbWlsbGVuaXVtLgorICAgIDwvcD4KKworCisgICAgPGEgbmFtZT0ibWFqb3JpdHlzZWxlY3QiPjwvYT4KKyAgICA8aDQ+TWFqb3JpdHkgU2VsZWN0b3I8L2g0PgorCisgICAgPHA+VGhlIDxjb2RlPiZsdDttYWpvcml0eSZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzIHByb3ZpZGVkCisgICAgdGhhdCBhIG1ham9yaXR5IG9mIHRoZSBjb250YWluZWQgZWxlbWVudHMgYWxzbyBzZWxlY3QgaXQuIFRpZXMgYXJlCisgICAgZGVhbHQgd2l0aCBhcyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmFsbG93dGllPC9jb2RlPiBhdHRyaWJ1dGUuCisgICAgPC9wPgorCisgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmFsbG93dGllPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGZpbGVzIHNob3VsZCBiZSBzZWxlY3RlZCBpZiB0aGVyZQorICAgICAgICAgIGFyZSBhbiBldmVuIG51bWJlciBvZiBzZWxlY3RvcnMgc2VsZWN0aW5nIHRoZW0gYXMgYXJlCisgICAgICAgICAgbm90IHNlbGVjdGluZyB0aGVtLiBEZWZhdWx0IGlzIHRydWUuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisKKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgTWFqb3JpdHkgU2VsZWN0b3I6PC9wPgorCisgICAgPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2RvY3N9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouaHRtbCZxdW90OyZndDsKKyAgICAmbHQ7bWFqb3JpdHkmZ3Q7CisgICAgICAgICZsdDtjb250YWlucyB0ZXh0PSZxdW90O3Byb2plY3QmcXVvdDsgY2FzZXNlbnNpdGl2ZT0iZmFsc2UiLyZndDsKKyAgICAgICAgJmx0O2NvbnRhaW5zIHRleHQ9JnF1b3Q7dGFza2RlZiZxdW90OyBjYXNlc2Vuc2l0aXZlPSJmYWxzZSIvJmd0OworICAgICAgICAmbHQ7Y29udGFpbnMgdGV4dD0mcXVvdDtJbnRyb3NwZWN0aW9uSGVscGVyJnF1b3Q7IGNhc2VzZW5zaXRpdmU9InRydWUiLyZndDsKKyAgICAmbHQ7L21ham9yaXR5Jmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisgICAgPHA+U2VsZWN0cyBhbGwgdGhlIEhUTUwgZmlsZXMgd2hpY2ggY29udGFpbiBhdCBsZWFzdCB0d28gb2YgdGhlIHRocmVlCisgICAgcGhyYXNlcyAicHJvamVjdCIsICJ0YXNrZGVmIiwgYW5kICJJbnRyb3NwZWN0aW9uSGVscGVyIiAodGhpcyBsYXN0IHBocmFzZSBtdXN0CisgICAgbWF0Y2ggY2FzZSBleGFjdGx5KS4KKyAgICA8L3A+CisKKworICAgIDxhIG5hbWU9Im5vbmVzZWxlY3QiPjwvYT4KKyAgICA8aDQ+Tm9uZSBTZWxlY3RvcjwvaDQ+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O25vbmUmZ3Q7PC9jb2RlPiB0YWcgc2VsZWN0cyBmaWxlcyB0aGF0IGFyZQorICAgIG5vdCBzZWxlY3RlZCBieSBhbnkgb2YgdGhlIGVsZW1lbnRzIGl0IGNvbnRhaW5zLiBJdCByZXR1cm5zIGFzCisgICAgc29vbiBhcyBpdCBmaW5kcyBhIHNlbGVjdG9yIHRoYXQgc2VsZWN0cyB0aGUgZmlsZSwKKyAgICBzbyBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBjaGVjayBldmVyeSBzZWxlY3Rvci4KKyAgICA8L3A+CisKKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgTm9uZSBTZWxlY3Rvcjo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7c3JjfSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsmZ3Q7CisgICAgJmx0O25vbmUmZ3Q7CisgICAgICAgICZsdDtwcmVzZW50IHRhcmdldGRpcj0mcXVvdDske2Rlc3R9JnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3ByZXNlbnQgdGFyZ2V0ZGlyPSZxdW90OyR7ZGVzdH0mcXVvdDsmZ3Q7CisgICAgICAgICAgICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7Z2xvYiZxdW90OyBmcm9tPSZxdW90OyouamF2YSZxdW90OyB0bz0mcXVvdDsqLmNsYXNzJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0Oy9wcmVzZW50Jmd0OworICAgICZsdDsvbm9uZSZndDsKKyZsdDsvZmlsZXNldCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworICAgIDxwPlNlbGVjdHMgb25seSBKYXZhIGZpbGVzIHdoaWNoIGRvIG5vdCBoYXZlIGVxdWl2YWxlbnQgamF2YSBvcgorICAgIGNsYXNzIGZpbGVzIGluIHRoZSBkZXN0IGRpcmVjdG9yeS4KKyAgICA8L3A+CisKKworICAgIDxhIG5hbWU9Im5vdHNlbGVjdCI+PC9hPgorICAgIDxoND5Ob3QgU2VsZWN0b3I8L2g0PgorCisgICAgPHA+VGhlIDxjb2RlPiZsdDtub3QmZ3Q7PC9jb2RlPiB0YWcgcmV2ZXJzZXMgdGhlIG1lYW5pbmcgb2YgdGhlCisgICAgc2luZ2xlIHNlbGVjdG9yIGl0IGNvbnRhaW5zLgorICAgIDwvcD4KKworICAgIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBOb3QgU2VsZWN0b3I6PC9wPgorCisgICAgPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3NyY30mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7Jmd0OworICAgICZsdDtub3QmZ3Q7CisgICAgICAgICZsdDtjb250YWlucyB0ZXh0PSZxdW90O3Rlc3QmcXVvdDsvJmd0OworICAgICZsdDsvbm90Jmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisgICAgPHA+U2VsZWN0cyBhbGwgdGhlIGZpbGVzIGluIHRoZSBzcmMgZGlyZWN0b3J5IHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlCisgICAgc3RyaW5nICJ0ZXN0Ii4KKyAgICA8L3A+CisKKworICAgIDxhIG5hbWU9Im9yc2VsZWN0Ij48L2E+CisgICAgPGg0Pk9yIFNlbGVjdG9yPC9oND4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7b3ImZ3Q7PC9jb2RlPiB0YWcgc2VsZWN0cyBmaWxlcyB0aGF0IGFyZQorICAgIHNlbGVjdGVkIGJ5IGFueSBvbmUgb2YgdGhlIGVsZW1lbnRzIGl0IGNvbnRhaW5zLiBJdCByZXR1cm5zIGFzCisgICAgc29vbiBhcyBpdCBmaW5kcyBhIHNlbGVjdG9yIHRoYXQgc2VsZWN0cyB0aGUgZmlsZSwKKyAgICBzbyBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBjaGVjayBldmVyeSBzZWxlY3Rvci4KKyAgICA8L3A+CisKKyAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgT3IgU2VsZWN0b3I6PC9wPgorCisgICAgPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2Jhc2VkaXJ9JnF1b3Q7Jmd0OworICAgICZsdDtvciZndDsKKyAgICAgICAgJmx0O2RlcHRoIG1heD0mcXVvdDswJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O2ZpbGVuYW1lIG5hbWU9IioucG5nIi8mZ3Q7CisgICAgICAgICZsdDtmaWxlbmFtZSBuYW1lPSIqLmdpZiIvJmd0OworICAgICAgICAmbHQ7ZmlsZW5hbWUgbmFtZT0iKi5qcGciLyZndDsKKyAgICAmbHQ7L29yJmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisgICAgPHA+U2VsZWN0cyBhbGwgdGhlIGZpbGVzIGluIHRoZSB0b3AgZGlyZWN0b3J5IGFsb25nIHdpdGggYWxsIHRoZQorICAgIGltYWdlIGZpbGVzIGJlbG93IGl0LgorICAgIDwvcD4KKworCisgICAgPGEgbmFtZT0ic2VsZWN0b3JzZWxlY3QiPjwvYT4KKyAgICA8aDQ+U2VsZWN0b3IgUmVmZXJlbmNlPC9oND4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7c2VsZWN0b3ImZ3Q7PC9jb2RlPiB0YWcgaXMgdXNlZCB0byBjcmVhdGUgc2VsZWN0b3JzCisgICAgdGhhdCBjYW4gYmUgcmV1c2VkIHRocm91Z2ggcmVmZXJlbmNlcy4gSXQgaXMgdGhlIG9ubHkgc2VsZWN0b3Igd2hpY2ggY2FuCisgICAgYmUgdXNlZCBvdXRzaWRlIG9mCisgICAgYW55IHRhcmdldCwgYXMgYW4gZWxlbWVudCBvZiB0aGUgPGNvZGU+Jmx0O3Byb2plY3QmZ3Q7PC9jb2RlPiB0YWcuIEl0CisgICAgY2FuIGNvbnRhaW4gb25seSBvbmUgb3RoZXIgc2VsZWN0b3IsIGJ1dCBvZiBjb3Vyc2UgdGhhdCBzZWxlY3RvciBjYW4KKyAgICBiZSBhIGNvbnRhaW5lci4KKyAgICA8L3A+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O3NlbGVjdG9yJmd0OzwvY29kZT4gdGFnIGNhbiBhbHNvIGJlIHVzZWQgdG8gc2VsZWN0CisgICAgZmlsZXMgY29uZGl0aW9uYWxseSBiYXNlZCBvbiB3aGV0aGVyIGFuIEFudCBwcm9wZXJ0eSBleGlzdHMgb3Igbm90LgorICAgIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyByZWFsaXplZCB1c2luZyB0aGUgPGNvZGU+JnF1b3Q7aWYmcXVvdDs8L2NvZGU+IGFuZAorICAgIDxjb2RlPiZxdW90O3VubGVzcyZxdW90OzwvY29kZT4gYXR0cmlidXRlcyBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGV5CisgICAgYXJlIHVzZWQgb24gdGFyZ2V0cyBvciBvbiB0aGUgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKKyAgICA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IHRhZ3Mgd2l0aGluIGEKKyAgICA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+LjwvcD4KKworICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pZjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QWxsb3cgZmlsZXMgdG8gYmUgc2VsZWN0ZWQgb25seSBpZiB0aGUgbmFtZWQKKyAgICAgICAgICBwcm9wZXJ0eSBpcyBzZXQuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj51bmxlc3M8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkFsbG93IGZpbGVzIHRvIGJlIHNlbGVjdGVkIG9ubHkgaWYgdGhlIG5hbWVkCisgICAgICAgICAgcHJvcGVydHkgaXMgPGI+bm90PC9iPiBzZXQuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNlbGVjdG9yIFJlZmVyZW5jZTo8L3A+CisKKyAgICA8YmxvY2txdW90ZT48cHJlPgorJmx0O3Byb2plY3QgZGVmYXVsdD0mcXVvdDthbGwmcXVvdDsgYmFzZWRpcj0mcXVvdDsuL2FudCZxdW90OyZndDsKKworICAgICZsdDtzZWxlY3RvciBpZD0mcXVvdDtjb21wbGV0ZWQmcXVvdDsmZ3Q7CisgICAgICAgICZsdDtub25lJmd0OworICAgICAgICAgICAgJmx0O2RlcGVuZCB0YXJnZXRkaXI9JnF1b3Q7YnVpbGQvY2xhc3NlcyZxdW90OyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7Z2xvYiZxdW90OyBmcm9tPSZxdW90OyouamF2YSZxdW90OyB0bz0mcXVvdDsqLmNsYXNzJnF1b3Q7LyZndDsKKyAgICAgICAgICAgICZsdDsvZGVwZW5kJmd0OworICAgICAgICAgICAgJmx0O2RlcGVuZCB0YXJnZXRkaXI9JnF1b3Q7ZG9jcy9tYW51YWwvYXBpJnF1b3Q7Jmd0OworICAgICAgICAgICAgICAgICZsdDttYXBwZXIgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7IGZyb209JnF1b3Q7Ki5qYXZhJnF1b3Q7IHRvPSZxdW90OyouaHRtbCZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2RlcGVuZCZndDsKKyAgICAgICAgJmx0Oy9ub25lJmd0OworICAgICZsdDsvc2VsZWN0b3ImZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0Jmd0OworICAgICAgICAmbHQ7emlwJmd0OworICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyYy9tYWluJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90OyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7c2VsZWN0b3IgcmVmaWQ9JnF1b3Q7Y29tcGxldGVkJnF1b3Q7LyZndDsKKyAgICAgICAgICAgICZsdDsvZmlsZXNldCZndDsKKyAgICAgICAgJmx0Oy96aXAmZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyZsdDsvcHJvamVjdCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworICAgIDxwPlppcHMgdXAgYWxsIHRoZSBKYXZhIGZpbGVzIHdoaWNoIGhhdmUgYW4gdXAtdG8tZGF0ZSBlcXVpdmFsZW50CisgICAgY2xhc3MgZmlsZSBhbmQgamF2YWRvYyBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorICAgIDwvcD4KKworICAgIDxwPkFuZCBhbiBleGFtcGxlIG9mIHNlbGVjdGluZyBmaWxlcyBjb25kaXRpb25hbGx5LCBiYXNlZCBvbiB3aGV0aGVyCisgICAgcHJvcGVydGllcyBhcmUgc2V0OjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHt3b3JraW5nLmNvcHl9JnF1b3Q7Jmd0OworICAgICZsdDtvciZndDsKKyAgICAgICAgJmx0O3NlbGVjdG9yIGlmPSZxdW90O2luY2x1ZGUudGVzdHMmcXVvdDsmZ3Q7CisgICAgICAgICAgICAmbHQ7ZmlsZW5hbWUgbmFtZT0mcXVvdDsqKi8qVGVzdC5jbGFzcyZxdW90OyZndDsKKyAgICAgICAgJmx0Oy9zZWxlY3RvciZndDsKKyAgICAgICAgJmx0O3NlbGVjdG9yIGlmPSZxdW90O2luY2x1ZGUuc291cmNlJnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O2FuZCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7ZmlsZW5hbWUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O25vdCZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3NlbGVjdG9yIHVubGVzcz0mcXVvdDtpbmNsdWRlLnRlc3RzJnF1b3Q7Jmd0OworICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2ZpbGVuYW1lIG5hbWU9JnF1b3Q7KiovKlRlc3QuamF2YSZxdW90OyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0Oy9zZWxlY3RvciZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L25vdCZndDsKKyAgICAgICAgICAgICZsdDsvYW5kJmd0OworICAgICAgICAmbHQ7L3NlbGVjdG9yJmd0OworICAgICZsdDsvb3ImZ3Q7CismbHQ7L2ZpbGVzZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKyAgICA8cD5BIGZpbGVzZXQgdGhhdCBjb25kaXRpb25hbGx5IGNvbnRhaW5zIEphdmEgc291cmNlIGZpbGVzIGFuZCBUZXN0CisgICAgc291cmNlIGFuZCBjbGFzcyBmaWxlcy48L3A+CisKKyAgICA8YSBuYW1lPSJjdXN0b21zZWxlY3QiPjwvYT4KKyAgICA8aDM+Q3VzdG9tIFNlbGVjdG9yczwvaDM+CisKKyAgICA8cD5Zb3UgY2FuIHdyaXRlIHlvdXIgb3duIHNlbGVjdG9ycyBhbmQgdXNlIHRoZW0gd2l0aGluIHRoZSBzZWxlY3RvcgorICAgIGNvbnRhaW5lcnMgYnkgc3BlY2lmeWluZyB0aGVtIHdpdGhpbiB0aGUgPGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+IHRhZy48L3A+CisKKyAgICA8cD5GaXJzdCwgeW91IGhhdmUgdG8gd3JpdGUgeW91ciBzZWxlY3RvciBjbGFzcyBpbiBKYXZhLiBUaGUgb25seQorICAgIHJlcXVpcmVtZW50IGl0IG11c3QgbWVldCBpbiBvcmRlciB0byBiZSBhIHNlbGVjdG9yIGlzIHRoYXQgaXQgaW1wbGVtZW50cworICAgIHRoZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZVNlbGVjdG9yPC9jb2RlPgorICAgIGludGVyZmFjZSwgd2hpY2ggY29udGFpbnMgYSBzaW5nbGUgbWV0aG9kLiBTZWUKKyAgICA8YSBocmVmPSJzZWxlY3RvcnMtcHJvZ3JhbS5odG1sIj5Qcm9ncmFtbWluZyBTZWxlY3RvcnMgaW4gQW50PC9hPiBmb3IKKyAgICBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKworICAgIDxwPk9uY2UgdGhhdCBpcyB3cml0dGVuLCB5b3UgaW5jbHVkZSBpdCBpbiB5b3VyIGJ1aWxkIGZpbGUgYnkgdXNpbmcKKyAgICB0aGUgPGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+IHRhZy4KKyAgICA8L3A+CisKKyAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB5b3VyIGNsYXNzIHRoYXQgaW1wbGVtZW50cworICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I8L2NvZGU+LgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UgaW4gb3JkZXIgdG8gbG9hZCB0aGUKKyAgICAgICAgICBjdXN0b20gc2VsZWN0b3IgY2xhc3MuIElmIG5laXRoZXIgdGhpcyBjbGFzc3BhdGggbm9yIHRoZQorICAgICAgICAgIGNsYXNzcGF0aHJlZiBhcmUgc3BlY2lmaWVkLCB0aGUgY2xhc3Mgd2lsbCBiZQorICAgICAgICAgIGxvYWRlZCBmcm9tIHRoZSBjbGFzc3BhdGggdGhhdCBBbnQgdXNlcy4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggcHJldmlvdXNseQorICAgICAgICAgIGRlZmluZWQuIElmIG5laXRoZXIgdGhpcyByZWZlcmVuY2Ugbm9yIHRoZQorICAgICAgICAgIGNsYXNzcGF0aCBhYm92ZSBhcmUgc3BlY2lmaWVkLCB0aGUgY2xhc3Mgd2lsbCBiZQorICAgICAgICAgIGxvYWRlZCBmcm9tIHRoZSBjbGFzc3BhdGggdGhhdCBBbnQgdXNlcy4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8cD5IZXJlIGlzIGhvdyB5b3UgdXNlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiB0bworICAgIHVzZSB5b3VyIGNsYXNzIGFzIGEgc2VsZWN0b3I6CisgICAgPC9wPgorCisgICAgPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtmaWxlc2V0IGRpcj0mcXVvdDske215ZGlyfSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qJnF1b3Q7Jmd0OworICAgICZsdDtjdXN0b20gY2xhc3NuYW1lPSZxdW90O2NvbS5teWRvbWFpbi5NeVNlbGVjdG9yJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtteWF0dHJpYnV0ZSZxdW90OyB2YWx1ZT0mcXVvdDtteXZhbHVlJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2N1c3RvbSZndDsKKyZsdDsvZmlsZXNldCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworICAgIDxwPkEgbnVtYmVyIG9mIGNvcmUgc2VsZWN0b3JzIGNhbiBhbHNvIGJlIHVzZWQgYXMgY3VzdG9tIHNlbGVjdG9ycworICAgIGJ5IHNwZWNpZnlpbmcgdGhlaXIgYXR0cmlidXRlcyB1c2luZyA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiBlbGVtZW50cy4gVGhlc2UKKyAgICBhcmU8L3A+CisKKyAgICA8dWw+CisgICAgICA8bGk+PGEgaHJlZj0iI2NvbnRhaW5zc2VsZWN0Ij5Db250YWlucyBTZWxlY3RvcjwvYT4gd2l0aAorICAgICAgICBjbGFzc25hbWUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkNvbnRhaW5zU2VsZWN0b3I8L2NvZGU+CisgICAgICA8bGk+PGEgaHJlZj0iI2RhdGVzZWxlY3QiPkRhdGUgU2VsZWN0b3I8L2E+IHdpdGgKKyAgICAgICAgY2xhc3NuYW1lIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EYXRlU2VsZWN0b3I8L2NvZGU+CisgICAgICA8bGk+PGEgaHJlZj0iI2RlcHRoc2VsZWN0Ij5EZXB0aCBTZWxlY3RvcjwvYT4gd2l0aAorICAgICAgICBjbGFzc25hbWUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRlcHRoU2VsZWN0b3I8L2NvZGU+CisgICAgICA8bGk+PGEgaHJlZj0iI2ZpbGVuYW1lc2VsZWN0Ij5GaWxlbmFtZSBTZWxlY3RvcjwvYT4gd2l0aAorICAgICAgICBjbGFzc25hbWUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVuYW1lU2VsZWN0b3I8L2NvZGU+CisgICAgICA8bGk+PGEgaHJlZj0iI3NpemVzZWxlY3QiPlNpemUgU2VsZWN0b3I8L2E+IHdpdGgKKyAgICAgICAgY2xhc3NuYW1lIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TaXplU2VsZWN0b3I8L2NvZGU+CisgICAgPC91bD4KKworICAgIDxwPkhlcmUgaXMgdGhlIGV4YW1wbGUgZnJvbSB0aGUgRGVwdGggU2VsZWN0b3Igc2VjdGlvbiByZXdyaXR0ZW4KKyAgICB0byB1c2UgdGhlIHNlbGVjdG9yIHRocm91Z2ggPGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+LjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxwcmU+CismbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtkb2MucGF0aH0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKiZxdW90OyZndDsKKyAgICAmbHQ7Y3VzdG9tIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGVwdGhTZWxlY3RvciZxdW90OyZndDsKKyAgICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7bWF4JnF1b3Q7IHZhbHVlPSZxdW90OzEmcXVvdDsvJmd0OworICAgICZsdDsvY3VzdG9tJmd0OworJmx0Oy9maWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisgICAgPHA+U2VsZWN0cyBhbGwgZmlsZXMgaW4gdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCBvbmUgZGlyZWN0b3J5IGJlbG93CisgICAgdGhhdC48L3A+CisKKyAgICA8cD5Gb3IgbW9yZSBkZXRhaWxzIGNvbmNlcm5pbmcgd3JpdGluZyB5b3VyIG93biBzZWxlY3RvcnMsIGNvbnN1bHQKKyAgICA8YSBocmVmPSJzZWxlY3RvcnMtcHJvZ3JhbS5odG1sIj5Qcm9ncmFtbWluZyBTZWxlY3RvcnMgaW4gQW50PC9hPi48L3A+CisKKyAgICAKKworICA8L2JvZHk+CisKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy90YXJmaWxlc2V0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvdGFyZmlsZXNldC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkyMGQwMjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvdGFyZmlsZXNldC5odG1sCkBAIC0wLDAgKzEsMTYwIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5UYXJGaWxlU2V0IFR5cGU8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDI+PGEgbmFtZT0iZmlsZXNldCI+VGFyRmlsZVNldDwvYT48L2gyPgorCis8cD48ZW0+VGFyRmlsZVNldDwvZW0+IGhhcyBiZWVuIGFkZGVkIGFzIGEgc3RhbmQtYWxvbmUgdHlwZSBpbiBBbnQKKzEuNy48L3A+CisKKzxwPkEgPGNvZGU+Jmx0O3RhcmZpbGVzZXQmZ3Q7PC9jb2RlPiBpcyBhIHNwZWNpYWwgZm9ybSBvZiBhIDxjb2RlPiZsdDs8YQorIGhyZWY9ImZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4mZ3Q7PC9jb2RlPiB3aGljaCBjYW4gYmVoYXZlIGluIDIKK2RpZmZlcmVudCB3YXlzIDogPGJyPgorPC9wPgorPHVsPgorICA8bGk+V2hlbiB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPnNyYzwvc3Bhbj4gYXR0cmlidXRlCisgIGlzIHVzZWQgLSBvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGhhcyBiZWVuIHNwZWNpZmllZCwgdGhlCisgIHRhcmZpbGVzZXQgaXMgcG9wdWxhdGVkIHdpdGggdGFyIGVudHJpZXMgZm91bmQgaW4gdGhlIGZpbGUgPHNwYW4KKyAgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPnNyYzwvc3Bhbj4uPGJyPgorICA8L2xpPgorICA8bGk+V2hlbiB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPmRpcjwvc3Bhbj4gYXR0cmlidXRlCitpcyB1c2VkLCB0aGUgdGFyZmlsZXNldCBpcyBwb3B1bGF0ZWQgd2l0aCBmaWxlc3lzdGVtIGZpbGVzIGZvdW5kIHVuZGVyIDxzcGFuCisgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPmRpcjwvc3Bhbj4uPGJyPgorICA8L2xpPgorPC91bD4KKzxwPjxjb2RlPiZsdDt0YXJmaWxlc2V0Jmd0OzwvY29kZT4gc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0OzxhCisgaHJlZj0iZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPiZndDs8L2NvZGU+CitpbiBhZGRpdGlvbiB0byB0aG9zZSBsaXN0ZWQgYmVsb3cuPGJyPgorPC9wPgorPHA+QSB0YXJmaWxlc2V0IGNhbiBiZSBkZWZpbmVkIHdpdGggdGhlIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOgoraXRhbGljOyI+aWQgPC9zcGFuPmF0dHJpYnV0ZSBhbmQgcmVmZXJyZWQgdG8gd2l0aCB0aGUgPHNwYW4KK3N0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5yZWZpZDwvc3Bhbj4gYXR0cmlidXRlLiAgVGhpcyBpcyBhbHNvIHRydWUKK2ZvciB0YXJmaWxlc2V0IHdoaWNoIGhhcyBiZWVuIGFkZGVkIGluIEFudCAxLjcuPGJyPgorPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPnByZWZpeDwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmFsbCBmaWxlcyBpbiB0aGUgZmlsZXNldCBhcmUgcHJlZml4ZWQgd2l0aCB0aGF0IAorcGF0aCBpbiB0aGUgYXJjaGl2ZS48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZ1bGxwYXRoPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlc2V0IGlzIHBsYWNlZCBhdCAgCit0aGF0IGV4YWN0IGxvY2F0aW9uIGluIHRoZSBhcmNoaXZlLjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWF5IGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIDxpPmRpcjwvaT4gYXR0cmlidXRlCisgdG8gc3BlY2lmeSBhIHRhciBmaWxlIHdob3NlIGNvbnRlbnRzIHdpbGwgYmUgZXh0cmFjdGVkIGFuZCAgICAgaW5jbHVkZWQKK2luIHRoZSBhcmNoaXZlLjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZW1vZGU8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIDMgZGlnaXQgb2N0YWwgc3RyaW5nLCBzcGVjaWZ5IHRoZSB1c2VyLCBncm91cCAKK2FuZCBvdGhlciBtb2RlcyBpbiB0aGUgc3RhbmRhcmQgVW5peCBmYXNoaW9uLiAgT25seSBhcHBsaWVzIHRvICAgIAorcGxhaW4gZmlsZXMuICBEZWZhdWx0IGlzIDY0NC48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcm1vZGU8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIDMgZGlnaXQgb2N0YWwgc3RyaW5nLCBzcGVjaWZ5IHRoZSB1c2VyLCBncm91cCAKK2FuZCBvdGhlciBtb2RlcyBpbiB0aGUgc3RhbmRhcmQgVW5peCBmYXNoaW9uLiAgT25seSBhcHBsaWVzIHRvICAgIAorZGlyZWN0b3JpZXMuICBEZWZhdWx0IGlzIDc1NS48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXJuYW1lPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHVzZXJuYW1lIGZvciB0aGUgdGFyIGVudHJ5LiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgVUlELgorICAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Z3JvdXA8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZ3JvdXBuYW1lIGZvciB0aGUgdGFyIGVudHJ5LiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgR0lELgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj51aWQ8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdXNlciBpZGVudGlmaWVyIChVSUQpIGZvciB0aGUgdGFyIGVudHJ5LiBUaGlzIGlzIGFuIGludGVnZXIgdmFsdWUKKyAgICAgICAgYW5kIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgdXNlcm5hbWUuCisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmdpZDwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBncm91cCBpZGVudGlmaWVyIChHSUQpIGZvciB0aGUgdGFyIGVudHJ5LgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorPHA+VGhlIDxpPmZ1bGxwYXRoPC9pPiBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgc2V0IGZvciBmaWxlc2V0cyB0aGF0CityZXByZXNlbnQgYSBzaW5nbGUgZmlsZS4gVGhlIDxpPnByZWZpeDwvaT4gYW5kIDxpPmZ1bGxwYXRoPC9pPgorYXR0cmlidXRlcyBjYW5ub3QgYm90aCBiZSBzZXQgb24gdGhlIHNhbWUgZmlsZXNldC48L3A+Cis8cD5XaGVuIHVzaW5nIHRoZSA8aT5zcmM8L2k+IGF0dHJpYnV0ZSwgaW5jbHVkZSBhbmQgZXhjbHVkZSBwYXR0ZXJucworbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiB0aGUgYXJjaGl2ZSBmb3IgaW5jbHVzaW9uIGluIHRoZQorYXJjaGl2ZSBhcyB3aXRoIHRoZSA8aT5kaXI8L2k+IGF0dHJpYnV0ZS48L3A+CisKKzxwPlBsZWFzZSBub3RlIHRoYXQgY3VycmVudGx5IG9ubHkgdGhlIDxhCitocmVmPSIuLi9Db3JlVGFza3MvdGFyLmh0bWwiPnRhcjwvYT4gdGFzayB1c2VzIHRoZSBwZXJtaXNzaW9uIGFuZAorb3duZXJzaGlwIGF0dHJpYnV0ZXMuPC9wPgorCis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPGg0PmFueSA8YSBocmVmPSJyZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHNpbmdsZSBlbGVtZW50CityZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KKworPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIHVzZWQgYXMgc3JjLjwvcD4KKworPGg0PkV4YW1wbGVzPC9oND4KKzxibG9ja3F1b3RlPgorPHByZT4KKyAgJmx0O2NvcHkgdG9kaXI9InNvbWUtZGlyIiZndDsKKyAgICAmbHQ7dGFyZmlsZXNldCBpbmNsdWRlcz0ibGliLyoqIiZndDsKKyAgICAgICZsdDtiemlwMnJlc291cmNlJmd0OworICAgICAgICAmbHQ7dXJsIHVybD0iaHR0cDovL2V4YW1wbGUub3JnL2Rpc3Qvc29tZS1hcmNoaXZlLnRhci5iejIiLyZndDsKKyAgICAgICZsdDsvYnppcDJyZXNvdXJjZSZndDsKKyAgICAmbHQ7L3RhcmZpbGVzZXQmZ3Q7CisgICZsdDsvY29weSZndDsKKyAgICAgIDwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+ZG93bmxvYWRzIHRoZSBhcmNoaXZlIHNvbWUtYXJjaGl2ZS50YXIuYnoyLCB1bmNvbXByZXNzZXMgYW5kCitleHRyYWN0cyBpdCBvbiB0aGUgZmx5LCBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaWIgZGlyZWN0b3J5IGludG8KK3NvbWUtZGlyIGFuZCBkaXNjYXJkcyB0aGUgcmVzdCBvZiB0aGUgYXJjaGl2ZS4gIEZpbGUgdGltZXN0YW1wcyB3aWxsCitiZSBjb21wYXJlZCBiZXR3ZWVuIHRoZSBhcmNoaXZlJ3MgZW50cmllcyBhbmQgZmlsZXMgaW5zaWRlIHRoZSB0YXJnZXQKK2RpcmVjdG9yeSwgbm8gZmlsZXMgZ2V0IG92ZXJ3cml0dGVuIHVubGVzcyB0aGV5IGFyZSBvdXQtb2YtZGF0ZS48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvQ29yZVR5cGVzL3htbGNhdGFsb2cuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy94bWxjYXRhbG9nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwNThhZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy94bWxjYXRhbG9nLmh0bWwKQEAgLTAsMCArMSwzMDYgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+WE1MQ2F0YWxvZyBUeXBlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJYTUxDYXRhbG9nIj5YTUxDYXRhbG9nPC9hPjwvaDI+CisKKzxwPkFuIFhNTENhdGFsb2cgaXMgYSBjYXRhbG9nIG9mIHB1YmxpYyByZXNvdXJjZXMgc3VjaCBhcyBEVERzIG9yCitlbnRpdGllcyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIGFuIFhNTCBkb2N1bWVudC4gIENhdGFsb2dzIGFyZQordHlwaWNhbGx5IHVzZWQgdG8gbWFrZSB3ZWIgcmVmZXJlbmNlcyB0byByZXNvdXJjZXMgcG9pbnQgdG8gYSBsb2NhbGx5CitjYWNoZWQgY29weSBvZiB0aGUgcmVzb3VyY2UuPC9wPgorCis8cD5UaGlzIGFsbG93cyB0aGUgWE1MIFBhcnNlciwgWFNMVCBQcm9jZXNzb3Igb3Igb3RoZXIgY29uc3VtZXIgb2YgWE1MIAorZG9jdW1lbnRzCit0byBlZmZpY2llbnRseSBhbGxvdyBhIGxvY2FsIHN1YnN0aXR1dGlvbiBmb3IgYSByZXNvdXJjZSBhdmFpbGFibGUgb24gdGhlIAord2ViLgorPC9wPgorPHA+PGI+Tm90ZTo8L2I+IFRoaXMgdGFzayA8ZW0+dXNlcywgYnV0IGRvZXMgbm90IGRlcGVuZCBvbjwvZW0+IGV4dGVybmFsCitsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLiAgU2VlIDxhCisgIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUKK2luZm9ybWF0aW9uLjwvcD4KKzxwPlRoaXMgZGF0YSB0eXBlIHByb3ZpZGVzIGEgY2F0YWxvZyBvZiByZXNvdXJjZSBsb2NhdGlvbnMgYmFzZWQKK29uIHRoZSA8YQoraHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KK09BU0lTICJPcGVuIENhdGFsb2ciIHN0YW5kYXJkPC9hPi4gIFRoZSBjYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQKK2JvdGggZm9yIEVudGl0eSByZXNvbHV0aW9uIGFuZCBVUkkgcmVzb2x1dGlvbiwgaW4gYWNjb3JkYW5jZSB3aXRoCit0aGUgPGNvZGU+b3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI8L2NvZGU+IGFuZCA8Y29kZT4KK2phdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI8L2NvZGU+IGludGVyZmFjZXMgYXMgZGVmaW5lZAoraW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheHAiPkphdmEgQVBJIGZvciBYTUwKK1Byb2Nlc3NpbmcgKEpBWFApIFNwZWNpZmljYXRpb248L2E+LjwvcD4KKzxwPkZvciBleGFtcGxlLCBpbiBhIDxjb2RlPndlYi54bWw8L2NvZGU+IGZpbGUsIHRoZSBEVEQgaXMgcmVmZXJlbmNlZCBhczoKKzxwcmU+CismbHQ7IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgJnF1b3Q7LS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOJnF1b3Q7CisgICZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMl8yLmR0ZCZxdW90OyZndDsKKzwvcHJlPgorVGhlIFhNTCBwcm9jZXNzb3IsIHdpdGhvdXQgWE1MQ2F0YWxvZyBzdXBwb3J0LCB3b3VsZCBuZWVkIHRvIHJldHJpZXZlIHRoZSAKK0RURCBmcm9tCit0aGUgVVJMIHNwZWNpZmllZCB3aGVuZXZlciB2YWxpZGF0aW9uIG9mIHRoZSBkb2N1bWVudCB3YXMgcmVxdWlyZWQuCis8L3A+Cis8cD5UaGlzIGNhbiBiZSB2ZXJ5IHRpbWUgY29uc3VtaW5nIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcywKK2VzcGVjaWFsbHkgd2hlcmUgbmV0d29yayB0aHJvdWdocHV0IGlzIGxpbWl0ZWQuICBBbHRlcm5hdGl2ZWx5LCB5b3UKK2NhbiBkbyB0aGUgZm9sbG93aW5nOgorPG9sPgorPGxpPkNvcHkgPGNvZGU+d2ViLWFwcF8yXzIuZHRkPC9jb2RlPiBvbnRvIHlvdXIgbG9jYWwgZGlzayBzb21ld2hlcmUgKGVpdGhlciBpbiB0aGUKK2ZpbGVzeXN0ZW0gb3IgZXZlbiBlbWJlZGRlZCBpbnNpZGUgYSBqYXIgb3IgemlwIGZpbGUgb24gdGhlIGNsYXNzcGF0aCkuPC9saT4KKzxsaT5DcmVhdGUgYW4gPGNvZGU+Jmx0O3htbGNhdGFsb2cmZ3Q7PC9jb2RlPiB3aXRoIGEgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IAorZWxlbWVudCB3aG9zZSA8Y29kZT5sb2NhdGlvbjwvY29kZT4gYXR0cmlidXRlIHBvaW50cyB0byB0aGUgZmlsZS48L2xpPgorPGxpPlN1Y2Nlc3MhIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgbm93IHVzZSB0aGUgbG9jYWwgY29weSBpbnN0ZWFkIG9mIGNhbGxpbmcgb3V0Cit0byB0aGUgaW50ZXJuZXQuPC9saT4KKzwvb2w+Cis8L3A+Cis8cD5YTUxDYXRhbG9ncyBjYW4gYXBwZWFyIGluc2lkZSB0YXNrcwordGhhdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBvciBhdCB0aGUgc2FtZSBsZXZlbCBhcyA8Y29kZT50YXJnZXQ8L2NvZGU+CistIGkuZS4sIGFzIGNoaWxkcmVuIG9mIDxjb2RlPnByb2plY3Q8L2NvZGU+IGZvciByZXVzZSBhY3Jvc3MgZGlmZmVyZW50IAordGFza3MsCitlLmcuIFhNTCBWYWxpZGF0aW9uIGFuZCBYU0xUIFRyYW5zZm9ybWF0aW9uLiAgVGhlIFhNTCBWYWxpZGF0ZSB0YXNrCit1c2VzIFhNTENhdGFsb2dzIGZvciBlbnRpdHkgcmVzb2x1dGlvbi4gIFRoZSBYU0xUIFRyYW5zZm9ybWF0aW9uCit0YXNrIHVzZXMgWE1MQ2F0YWxvZ3MgZm9yIGJvdGggZW50aXR5IGFuZCBVUkkgcmVzb2x1dGlvbi48L3A+Cis8cD5YTUxDYXRhbG9ncyBhcmUgc3BlY2lmaWVkIGFzIGVpdGhlciBhIHJlZmVyZW5jZSB0byBhbm90aGVyCitYTUxDYXRhbG9nLCBkZWZpbmVkIHByZXZpb3VzbHkgaW4gYSBidWlsZCBmaWxlLCBvciBhcyBhIGxpc3Qgb2YKKzxjb2RlPmR0ZDwvY29kZT4gb3IgPGNvZGU+ZW50aXR5PC9jb2RlPiBsb2NhdGlvbnMuICBJbiBhZGRpdGlvbiwKK2V4dGVybmFsIGNhdGFsb2cgZmlsZXMgbWF5IGJlIHNwZWNpZmllZCBpbiBhIG5lc3RlZCA8Y29kZT5jYXRhbG9ncGF0aDwvY29kZT4gLAorYnV0IHRoZXkgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgcmVzb2x2ZXIgbGlicmFyeSBmcm9tCit4bWwtY29tbW9ucyBpcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSBjbGFzc3BhdGguICA8Yj5EdWUgdG8gYmFja3dhcmRzCitpbmNvbXBhdGlibGUgY2hhbmdlcyBpbiB0aGUgcmVzb2x2ZXIgY29kZSBhZnRlciB0aGUgcmVsZWFzZSBvZgorcmVzb2x2ZXIgMS4wLCBBbnQgd2lsbCBub3Qgc3VwcG9ydCByZXNvbHZlci5qYXIgaW4gdmVyc2lvbiAxLjAgLSB3ZQorZXhwZWN0IGEgcmVzb2x2ZXIgcmVsZWFzZSAxLjEgdG8gaGFwcGVuIGJlZm9yZSBBbnQgMS42IGdldHMKK3JlbGVhc2VkLjwvYj4gIEEgc2VwYXJhdGUgY2xhc3NwYXRoIGZvciBlbnRpdHkgcmVzb2x1dGlvbiBtYXkgYmUKK3NwZWNpZmllZCBpbmxpbmUgdmlhIG5lc3RlZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnRzOyBvdGhlcndpc2UKK3RoZSBzeXN0ZW0gY2xhc3NwYXRoIGlzIHVzZWQgZm9yIHRoaXMgYXMgd2VsbC48L3A+Cis8cD5YTUxDYXRhbG9ncyBjYW4gYWxzbyBiZSBuZXN0ZWQgaW5zaWRlIG90aGVyIFhNTENhdGFsb2dzLiAgRm9yCitleGFtcGxlLCBhICJzdXBlcnNldCIgWE1MQ2F0YWxvZyBjb3VsZCBiZSBtYWRlIGJ5IGluY2x1ZGluZyBzZXZlcmFsCituZXN0ZWQgWE1MQ2F0YWxvZ3MgdGhhdCByZWZlcnJlZCB0byBvdGhlciwgcHJldmlvdXNseSBkZWZpbmVkCitYTUxDYXRhbG9ncy48L3A+Cis8cD5SZXNvdXJjZSBsb2NhdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgaW4tbGluZSBvciBpbgorZXh0ZXJuYWwgY2F0YWxvZyBmaWxlKHMpLCBvciBib3RoLiAgSW4gb3JkZXIgdG8gdXNlIGFuIGV4dGVybmFsCitjYXRhbG9nIGZpbGUsIHRoZSB4bWwtY29tbW9ucyByZXNvbHZlciBsaWJyYXJ5ICgicmVzb2x2ZXIuamFyIikKK211c3QgYmUgaW4geW91ciBwYXRoLiAgRXh0ZXJuYWwgY2F0YWxvZyBmaWxlcyBtYXkgYmUgZWl0aGVyIDxhCitocmVmPSJodHRwOi8vb2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvYmFja2dyb3VuZC85NDAxLmh0bWwiPgorcGxhaW4gdGV4dCBmb3JtYXQ8L2E+IG9yIDxhCitocmVmPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KK1hNTCBmb3JtYXQ8L2E+LiAgSWYgdGhlIHhtbC1jb21tb25zIHJlc29sdmVyIGxpYnJhcnkgaXMgbm90IGZvdW5kIGluIHRoZQorY2xhc3NwYXRoLCBleHRlcm5hbCBjYXRhbG9nIGZpbGVzLCBzcGVjaWZpZWQgaW4gPGNvZGU+Y2F0YWxvZ3BhdGg8L2NvZGU+LCAKK3dpbGwgYmUgaWdub3JlZCBhbmQgYSB3YXJuaW5nCit3aWxsIGJlIGxvZ2dlZC4gIEluIHRoaXMgY2FzZSwgaG93ZXZlciwgcHJvY2Vzc2luZyBvZiBpbmxpbmUgZW50cmllcyB3aWxsCitwcm9jZWVkIG5vcm1hbGx5LjwvcD4KKzxwPkN1cnJlbnRseSwgb25seSA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gYW5kCis8Y29kZT4mbHQ7ZW50aXR5Jmd0OzwvY29kZT4gZWxlbWVudHMgbWF5IGJlIHNwZWNpZmllZCBpbmxpbmU7IHRoZXNlCityb3VnaGx5IGNvcnJlc3BvbmQgdG8gT0FTSVMgY2F0YWxvZyBlbnRyeSB0eXBlcyA8Y29kZT5QVUJMSUM8L2NvZGU+IGFuZAorPGNvZGU+VVJJPC9jb2RlPiByZXNwZWN0aXZlbHkuICBCeSBjb250cmFzdCwgZXh0ZXJuYWwgY2F0YWxvZyBmaWxlcworbWF5IHVzZSBhbnkgb2YgdGhlIGVudHJ5IHR5cGVzIGRlZmluZWQgaW4gdGhlIAorPGEgaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KKytPQVNJUyBzcGVjaWZpY2F0aW9uPC9hPi48L3A+Cis8aDM+PGEgbmFtZT0iUmVzb2x2ZXJBbGdvcml0aG0iPkVudGl0eS9EVEQvVVJJIFJlc29sdXRpb24gQWxnb3JpdGhtPC9hPjwvaDM+CisKK1doZW4gYW4gZW50aXR5LCBEVEQsIG9yIFVSSSBpcyBsb29rZWQgdXAgYnkgdGhlIFhNTCBwcm9jZXNzb3IsIHRoZQorWE1MQ2F0YWxvZyBzZWFyY2hlcyBpdHMgbGlzdCBvZiBlbnRyaWVzIHRvIHNlZSBpZiBhbnkgbWF0Y2guICBUaGF0IGlzLAoraXQgYXR0ZW1wdHMgdG8gbWF0Y2ggdGhlIDxjb2RlPnB1YmxpY0lkPC9jb2RlPiBhdHRyaWJ1dGUgb2YgZWFjaCBlbnRyeQord2l0aCB0aGUgUHVibGljSUQgb3IgVVJJIG9mIHRoZSBlbnRpdHkgdG8gYmUgcmVzb2x2ZWQuICBBc3N1bWluZyBhCittYXRjaGluZyBlbnRyeSBpcyBmb3VuZCwgWE1MQ2F0YWxvZyB0aGVuIGV4ZWN1dGVzIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisKKzxoND4xLiBGaWxlc3lzdGVtIGxvb2t1cDwvaDQ+CisKKzxwPlRoZSA8Y29kZT5sb2NhdGlvbjwvY29kZT4gaXMgZmlyc3QgbG9va2VkIHVwIGluIHRoZSBmaWxlc3lzdGVtLiAgSWYKK3RoZSA8Y29kZT5sb2NhdGlvbjwvY29kZT4gaXMgYSByZWxhdGl2ZSBwYXRoLCB0aGUgYW50IHByb2plY3QgYmFzZWRpcgorYXR0cmlidXRlIGlzIHVzZWQgYXMgdGhlIGJhc2UgZGlyZWN0b3J5LiAgSWYgdGhlIDxjb2RlPmxvY2F0aW9uPC9jb2RlPgorc3BlY2lmaWVzIGFuIGFic29sdXRlIHBhdGgsIGl0IGlzIHVzZWQgYXMgaXMuICBPbmNlIHdlIGhhdmUgYW4KK2Fic29sdXRlIHBhdGggaW4gaGFuZCwgd2UgY2hlY2sgdG8gc2VlIGlmIGEgdmFsaWQgYW5kIHJlYWRhYmxlIGZpbGUKK2V4aXN0cyBhdCB0aGF0IHBhdGguICBJZiBzbywgd2UgYXJlIGRvbmUuICBJZiBub3QsIHdlIHByb2NlZWQgdG8gdGhlCituZXh0IHN0ZXAuPC9wPgorCis8aDQ+Mi4gQ2xhc3NwYXRoIGxvb2t1cDwvaDQ+CisKKzxwPlRoZSA8Y29kZT5sb2NhdGlvbjwvY29kZT4gaXMgbmV4dCBsb29rZWQgdXAgaW4gdGhlIGNsYXNzcGF0aC4KK1JlY2FsbCB0aGF0IGphciBmaWxlcyBhcmUgbWVyZWx5IGZhbmN5IHppcCBmaWxlcy4gIEZvciBjbGFzc3BhdGgKK2xvb2t1cCwgdGhlIDxjb2RlPmxvY2F0aW9uPC9jb2RlPiBpcyB1c2VkIGFzIGlzIChubyBiYXNlIGlzCitwcmVwZW5kZWQpLiAgV2UgdXNlIGEgQ2xhc3Nsb2FkZXIgdG8gYXR0ZW1wdCB0byBsb2FkIHRoZSByZXNvdXJjZSBmcm9tCit0aGUgY2xhc3NwYXRoLiAgRm9yIGV4YW1wbGUsIGlmIGhlbGxvLmphciBpcyBpbiB0aGUgY2xhc3NwYXRoIGFuZCBpdAorY29udGFpbnMgPGNvZGU+Zm9vL2Jhci9ibGF0LmR0ZDwvY29kZT4gaXQgd2lsbCByZXNvbHZlIGFuIGVudGl0eSB3aG9zZQorPGNvZGU+bG9jYXRpb248L2NvZGU+IGlzIDxjb2RlPmZvby9iYXIvYmxhdC5kdGQ8L2NvZGU+LiAgT2YgY291cnNlLCBpdAord2lsbCA8ZW0+bm90PC9lbT4gcmVzb2x2ZSBhbiBlbnRpdHkgd2hvc2UgPGNvZGU+bG9jYXRpb248L2NvZGU+IGlzCis8Y29kZT5ibGF0LmR0ZDwvY29kZT4uCisKKworPGg0PjNhLiBBcGFjaGUgeG1sLWNvbW1vbnMgcmVzb2x2ZXIgbG9va3VwPC9oND4KKworPHA+V2hhdCBoYXBwZW5zIG5leHQgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSByZXNvbHZlciBsaWJyYXJ5IGZyb20KK3htbC1jb21tb25zIGlzIGF2YWlsYWJsZSBvbiB0aGUgY2xhc3NwYXRoLiAgSWYgc28sIHdlIGRlZmVyIGFsbAorZnVydGhlciBhdHRlbXB0cyBhdCByZXNvbHZpbmcgdG8gaXQuICBUaGUgcmVzb2x2ZXIgbGlicmFyeSBzdXBwb3J0cworZXh0cmVtZWx5IHNvcGhpc3RpY2F0ZWQgZnVuY3Rpb25hbGl0eSBsaWtlIFVSTCByZXdyaXRpbmcgYW5kIHNvIG9uLAord2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IG1ha2luZyB0aGUgYXBwcm9wcmlhdGUgZW50cmllcyBpbiBleHRlcm5hbAorY2F0YWxvZyBmaWxlcyAoWE1MQ2F0YWxvZyBkb2VzIG5vdCB5ZXQgcHJvdmlkZSBpbmxpbmUgc3VwcG9ydCBmb3IgYWxsCitvZiB0aGUgZW50cmllcyBkZWZpbmVkIGluIHRoZSA8YQoraHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj5PQVNJUworc3RhbmRhcmQ8L2E+KS48L3A+CisKKzxoND4zLiBVUkwtc3BhY2UgbG9va3VwPC9oND4KKworPHA+RmluYWxseSwgd2UgYXR0ZW1wdCB0byBtYWtlIGEgVVJMIG91dCBvZiB0aGUgPGNvZGU+bG9jYXRpb248L2NvZGU+LgorQXQgZmlyc3QgdGhpcyBtYXkgc2VlbSBsaWtlIHRoaXMgd291bGQgZGVmZWF0IHRoZSBwdXJwb3NlIG9mCitYTUxDYXRhbG9ncyAtLSB3aHkgZ28gYmFjayBvdXQgdG8gdGhlIGludGVybmV0PyAgQnV0IGluIGZhY3QsIHRoaXMgY2FuCitiZSB1c2VkIHRvIChpbiBhIHNlbnNlKSBpbXBsZW1lbnQgSFRUUCByZWRpcmVjdHMsIHN1YnN0aXR1dGluZyBvbmUgVVJMCitmb3IgYW5vdGhlci4gIFRoZSBtYXBwZWQtdG8gVVJMIG1pZ2h0IGFsc28gYmUgc2VydmVkIGJ5IGEgbG9jYWwgd2ViCitzZXJ2ZXIuICBJZiB0aGUgVVJMIHJlc29sdmVzIHRvIGEgdmFsaWQgYW5kIHJlYWRhYmxlIHJlc291cmNlLCB3ZSBhcmUKK2RvbmUuICBPdGhlcndpc2UsIHdlIGdpdmUgdXAuICBJbiB0aGlzIGNhc2UsIHRoZSBYTUwgcHJvY2Vzc29yIHdpbGwKK3BlcmZvcm0gaXRzIG5vcm1hbCByZXNvbHV0aW9uIGFsZ29yaXRobS4gIERlcGVuZGluZyBvbiB0aGUgcHJvY2Vzc29yCitjb25maWd1cmF0aW9uLCBmdXJ0aGVyIHJlc29sdXRpb24gZmFpbHVyZXMgbWF5IG9yIG1heSBub3QgcmVzdWx0IGluCitmYXRhbCAoaS5lLiBidWlsZC1lbmRpbmcpIGVycm9ycy48L3A+CisKKzxoMz5YTUxDYXRhbG9nIGF0dHJpYnV0ZXM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YSB1bmlxdWUgbmFtZSBmb3IgYW4gWE1MQ2F0YWxvZywgdXNlZCBmb3IgcmVmZXJlbmNpbmcgCit0aGUKKyAgICBYTUxDYXRhbG9nJ3MgY29udGVudHMgZnJvbSBhbm90aGVyIFhNTENhdGFsb2c8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZWZpZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgPGNvZGU+aWQ8L2NvZGU+IG9mIGFub3RoZXIgWE1MQ2F0YWxvZyB3aG9zZSAKK2NvbnRlbnRzCisgICAgeW91IHdvdWxkIGxpa2UgdG8gYmUgdXNlZCBmb3IgdGhpcyBYTUxDYXRhbG9nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5YTUxDYXRhbG9nIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8aDQ+ZHRkL2VudGl0eTwvaDQ+Cis8cD5UaGUgPGNvZGU+ZHRkPC9jb2RlPiBhbmQgPGNvZGU+ZW50aXR5PC9jb2RlPiBlbGVtZW50cyB1c2VkIHRvIHNwZWNpZnkKK1hNTENhdGFsb2dzIGFyZSBpZGVudGljYWwgaW4gdGhlaXIgc3RydWN0dXJlPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHVibGljSWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHB1YmxpYyBpZGVudGlmaWVyIHVzZWQgd2hlbiBkZWZpbmluZyBhIGR0ZCBvciAKK2VudGl0eSwKKyAgICBlLmcuIDxjb2RlPiZxdW90Oy0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gCisyLjIvL0VOJnF1b3Q7PC9jb2RlPgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhdGlvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbG9jYXRpb24gb2YgdGhlIGxvY2FsIHJlcGxhY2VtZW50IHRvIGJlIHVzZWQgZm9yIAordGhlIHB1YmxpYyBpZGVudGlmaWVyIHNwZWNpZmllZC4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgZmlsZSBuYW1lLCAKK3Jlc291cmNlIG5hbWUgZm91bmQgb24gdGhlIGNsYXNzcGF0aCwgb3IgYSBVUkwuICBSZWxhdGl2ZSBwYXRocyB3aWxsCitiZSByZXNvbHZlZCBhY2NvcmRpbmcgdG8gdGhlIGJhc2UsIHdoaWNoIGJ5IGRlZmF1bHQgaXMgdGhlIEFudCBwcm9qZWN0CitiYXNlZGlyLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoND5jbGFzc3BhdGg8L2g0PgorPHA+VGhlIGNsYXNzcGF0aCB0byB1c2UgZm9yIDxhIGhyZWY9IiNSZXNvbHZlckFsZ29yaXRobSI+ZW50aXR5CityZXNvbHV0aW9uPC9hPi4gIFRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGlzIGEKKzxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aDwvYT4tbGlrZSBzdHJ1Y3R1cmUuPC9wPgorPGg0PmNhdGFsb2dwYXRoPC9oND4KKzxwPgorVGhlIG5lc3RlZCA8Y29kZT5jYXRhbG9ncGF0aDwvY29kZT4gZWxlbWVudCBpcyBhIDxhCitocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGg8L2E+LWxpa2Ugc3RydWN0dXJlIGxpc3RpbmcgY2F0YWxvZyBmaWxlcyB0bworc2VhcmNoLiAgQWxsIGZpbGVzIGluIHRoaXMgcGF0aCBhcmUgYXNzdW1lZCB0byBiZSBPQVNJUyBjYXRhbG9nIGZpbGVzLCBpbgorZWl0aGVyCis8YSBocmVmPSJodHRwOi8vb2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvYmFja2dyb3VuZC85NDAxLmh0bWwiPgorcGxhaW4gdGV4dCBmb3JtYXQ8L2E+IG9yIDxhCitocmVmPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KK1hNTCBmb3JtYXQ8L2E+LiBFbnRyaWVzIHNwZWNpZnlpbmcgbm9uZXhpc3RlbnQgZmlsZXMgd2lsbCBiZSBpZ25vcmVkLiBJZiB0aGUKK3Jlc29sdmVyIGxpYnJhcnkgZnJvbSB4bWwtY29tbW9ucyBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBjbGFzc3BhdGgsIGFsbAorPGNvZGU+Y2F0YWxvZ3BhdGhzPC9jb2RlPiB3aWxsIGJlIGlnbm9yZWQgYW5kIGEgd2FybmluZyB3aWxsIGJlIGxvZ2dlZC4KKzwvcD4KKzxoMz5FeGFtcGxlczwvaDM+Cis8cD5TZXQgdXAgYW4gWE1MQ2F0YWxvZyB3aXRoIGEgc2luZ2xlIGR0ZCByZWZlcmVuY2VkIGxvY2FsbHkgaW4gYSB1c2VyJ3MgCitob21lIAorZGlyZWN0b3J5OjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CisgICAgJmx0O3htbGNhdGFsb2cmZ3Q7CisgICAgICAgICZsdDtkdGQgCisgICAgICAgICAgICBwdWJsaWNJZD0mcXVvdDstLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjEuMi8vRU4mcXVvdDsKKyAgICAgICAgICAgIGxvY2F0aW9uPSZxdW90Oy9ob21lL2Rpb24vZG93bmxvYWRzL2RvY2Jvb2svZG9jYm9va3guZHRkJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3htbGNhdGFsb2cmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5TZXQgdXAgYW4gWE1MQ2F0YWxvZyB3aXRoIGEgbXVsdGlwbGUgZHRkcyB0byBiZSBmb3VuZCBlaXRoZXIgaW4gdGhlCitmaWxlc3lzdGVtIChyZWxhdGl2ZSB0byB0aGUgQW50IHByb2plY3QgYmFzZWRpcikgb3IgaW4gdGhlIGNsYXNzcGF0aDoKKzwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CisgICAgJmx0O3htbGNhdGFsb2cgaWQ9JnF1b3Q7Y29tbW9uRFREcyZxdW90OyZndDsKKyAgICAgICAgJmx0O2R0ZCAKKyAgICAgICAgICAgIHB1YmxpY0lkPSZxdW90Oy0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiZxdW90OworICAgICAgICAgICAgbG9jYXRpb249JnF1b3Q7ZG9jYm9vay9kb2Nib29reC5kdGQmcXVvdDsvJmd0OworICAgICAgICAmbHQ7ZHRkIAorICAgICAgICAgICAgcHVibGljSWQ9JnF1b3Q7LS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOJnF1b3Q7CisgICAgICAgICAgICBsb2NhdGlvbj0mcXVvdDt3ZWItYXBwXzJfMi5kdGQmcXVvdDsvJmd0OworICAgICZsdDsveG1sY2F0YWxvZyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+U2V0IHVwIGFuIFhNTENhdGFsb2cgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIERURHMgYW5kIGVudGl0aWVzIGFzCit3ZWxsIGFzIGEgbmVzdGVkIFhNTENhdGFsb2cgYW5kIGV4dGVybmFsIGNhdGFsb2cgZmlsZXMgaW4gYm90aAorZm9ybWF0czo8L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CisgICAgJmx0O3htbGNhdGFsb2cgaWQ9JnF1b3Q7YWxsY2F0YWxvZ3MmcXVvdDsmZ3Q7CisgICAgICAgICZsdDtkdGQgCisgICAgICAgICAgICBwdWJsaWNJZD0mcXVvdDstLy9BcmllbFBhcnRuZXJzLy9EVEQgWE1MIEFydGljbGUgVjEuMC8vRU4mcXVvdDsKKyAgICAgICAgICAgIGxvY2F0aW9uPSZxdW90O2NvbS9hcmllbHBhcnRuZXJzL2tub3dsZWRnZWJhc2UvZHRkL2FydGljbGUuZHRkJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O2VudGl0eSAKKyAgICAgICAgICAgIHB1YmxpY0lkPSZxdW90O0xhcmdlTG9nbyZxdW90OworICAgICAgICAgICAgbG9jYXRpb249JnF1b3Q7Y29tL2FyaWVscGFydG5lcnMvaW1hZ2VzL2FyaWVsLWxvZ28tbGFyZ2UuZ2lmJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3htbGNhdGFsb2cgcmVmaWQ9ImNvbW1vbkRURHMiLyZndDsKKyAgICAgICAgICAgICZsdDtjYXRhbG9ncGF0aCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249Ii9ldGMvc2dtbC9jYXRhbG9nIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgCisgICAgICAgICAgICAgICAgICAgIGRpcj0mcXVvdDsvYW5ldHdvcmsvZHJpdmUmcXVvdDsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovY2F0YWxvZyZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgCisgICAgICAgICAgICAgICAgICAgIGRpcj0mcXVvdDsvbXkvY2F0YWxvZ3MmcXVvdDsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovY2F0YWxvZy54bWwmcXVvdDsvJmd0OworICAgICAgICAgICAgJmx0Oy9jYXRhbG9ncGF0aCZndDsKKyAgICAgICAgJmx0Oy94bWxjYXRhbG9nJmd0OworICAgICZsdDsveG1sY2F0YWxvZyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPlRvIHJlZmVyZW5jZSB0aGUgYWJvdmUgWE1MQ2F0YWxvZyBpbiBhbiA8Y29kZT54c2x0PC9jb2RlPiB0YXNrOjxwPgorPGJsb2NrcXVvdGU+PHByZT4KKyAgICAmbHQ7eHNsdCBiYXNlZGlyPSIke3NvdXJjZS5kb2N9IgorICAgICAgICAgICBkZXN0ZGlyPSIke2Rlc3QueGRvY3N9IgorICAgICAgICAgICBleHRlbnNpb249Ii54bWwiCisgICAgICAgICAgIHN0eWxlPSIke3NvdXJjZS54c2wuY29udmVydGVyLmRvY2Jvb2t9IgorICAgICAgICAgICBpbmNsdWRlcz0iKiovKi54bWwiCisgICAgICAgICAgIGZvcmNlPSJ0cnVlIiZndDsKKyAgICAgICAgJmx0O3htbGNhdGFsb2cgcmVmaWQ9JnF1b3Q7YWxsY2F0YWxvZ3MmcXVvdDsvJmd0OworICAgICZsdDsveHNsdCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0NvcmVUeXBlcy96aXBmaWxlc2V0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvemlwZmlsZXNldC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZWQ4OGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9Db3JlVHlwZXMvemlwZmlsZXNldC5odG1sCkBAIC0wLDAgKzEsMTM2IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5aaXBGaWxlU2V0IFR5cGU8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDI+PGEgbmFtZT0iZmlsZXNldCI+WmlwRmlsZVNldDwvYT48L2gyPgorCis8cD5BIDxjb2RlPiZsdDt6aXBmaWxlc2V0Jmd0OzwvY29kZT4gaXMgYSBzcGVjaWFsIGZvcm0gb2YgYSA8Y29kZT4mbHQ7PGEKKyBocmVmPSJmaWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+Jmd0OzwvY29kZT4gd2hpY2ggY2FuIGJlaGF2ZSBpbiAyCitkaWZmZXJlbnQgd2F5cyA6IDxicj4KKzwvcD4KKzx1bD4KKyAgPGxpPldoZW4gdGhlIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5zcmM8L3NwYW4+IGF0dHJpYnV0ZQorICBpcyB1c2VkIC0gb3IgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQKKyAgKDxlbT5zaW5jZSBBbnQgMS43PC9lbT4pLCB0aGUgemlwZmlsZXNldCBpcyBwb3B1bGF0ZWQgd2l0aCAKKyAgemlwIGVudHJpZXMgZm91bmQgaW4gdGhlIGZpbGUgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6CisgIGl0YWxpYzsiPnNyYzwvc3Bhbj4uPGJyPgorICA8L2xpPgorICA8bGk+V2hlbiB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPmRpcjwvc3Bhbj4gYXR0cmlidXRlCitpcyB1c2VkLCB0aGUgemlwZmlsZXNldCBpcyBwb3B1bGF0ZWQgd2l0aCBmaWxlc3lzdGVtIGZpbGVzIGZvdW5kIHVuZGVyIDxzcGFuCisgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPmRpcjwvc3Bhbj4uPGJyPgorICA8L2xpPgorPC91bD4KKzxwPjxjb2RlPiZsdDt6aXBmaWxlc2V0Jmd0OzwvY29kZT4gc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0OzxhCisgaHJlZj0iZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPiZndDs8L2NvZGU+CitpbiBhZGRpdGlvbiB0byB0aG9zZSBsaXN0ZWQgYmVsb3cuPGJyPgorPC9wPgorPHA+U2luY2UgQW50IDEuNiwgYSB6aXBmaWxlc2V0IGNhbiBiZSBkZWZpbmVkIHdpdGggdGhlIDxzcGFuCisgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPmlkIDwvc3Bhbj5hdHRyaWJ1dGUgYW5kIHJlZmVycmVkIHRvIHdpdGgKK3RoZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+cmVmaWQ8L3NwYW4+IGF0dHJpYnV0ZS48YnI+Cis8L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlZml4PC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+YWxsIGZpbGVzIGluIHRoZSBmaWxlc2V0IGFyZSBwcmVmaXhlZCB3aXRoIHRoYXQgCitwYXRoIGluIHRoZSBhcmNoaXZlLjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZnVsbHBhdGg8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSBkZXNjcmliZWQgYnkgdGhlIGZpbGVzZXQgaXMgcGxhY2VkIGF0ICAKK3RoYXQgZXhhY3QgbG9jYXRpb24gaW4gdGhlIGFyY2hpdmUuPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5tYXkgYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgPGk+ZGlyPC9pPiBhdHRyaWJ1dGUKKyB0byBzcGVjaWZ5IGEgemlwIGZpbGUgd2hvc2UgY29udGVudHMgd2lsbCBiZSBleHRyYWN0ZWQgYW5kICAgICBpbmNsdWRlZAoraW4gdGhlIGFyY2hpdmUuPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlbW9kZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgMyBkaWdpdCBvY3RhbCBzdHJpbmcsIHNwZWNpZnkgdGhlIHVzZXIsIGdyb3VwIAorYW5kIG90aGVyIG1vZGVzIGluIHRoZSBzdGFuZGFyZCBVbml4IGZhc2hpb24uICBPbmx5IGFwcGxpZXMgdG8gICAgCitwbGFpbiBmaWxlcy4gIERlZmF1bHQgaXMgNjQ0LiA8ZW0+c2luY2UgQW50IDEuNS4yPC9lbT4uPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5kaXJtb2RlPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSAzIGRpZ2l0IG9jdGFsIHN0cmluZywgc3BlY2lmeSB0aGUgdXNlciwgZ3JvdXAgCithbmQgb3RoZXIgbW9kZXMgaW4gdGhlIHN0YW5kYXJkIFVuaXggZmFzaGlvbi4gIE9ubHkgYXBwbGllcyB0byAgICAKK2RpcmVjdG9yaWVzLiAgRGVmYXVsdCBpcyA3NTUuIDxlbT5zaW5jZSBBbnQgMS41LjI8L2VtPi48L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcworICAgICAgaW5zaWRlIHRoZSB6aXAgZmlsZS4gIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQorICAgICAgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uCisgICAgICBEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgIDxiPk9ubHkgc3VwcG9ydGVkIGJ5IHppcGZpbGVzZXQuPC9iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxwPlRoZSA8aT5mdWxscGF0aDwvaT4gYXR0cmlidXRlIGNhbiBvbmx5IGJlIHNldCBmb3IgZmlsZXNldHMgdGhhdAorcmVwcmVzZW50IGEgc2luZ2xlIGZpbGUuIFRoZSA8aT5wcmVmaXg8L2k+IGFuZCA8aT5mdWxscGF0aDwvaT4KK2F0dHJpYnV0ZXMgY2Fubm90IGJvdGggYmUgc2V0IG9uIHRoZSBzYW1lIGZpbGVzZXQuPC9wPgorPHA+V2hlbiB1c2luZyB0aGUgPGk+c3JjPC9pPiBhdHRyaWJ1dGUsIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgcGF0dGVybnMKK21heSBiZSB1c2VkIHRvIHNwZWNpZnkgYSBzdWJzZXQgb2YgdGhlIGFyY2hpdmUgZm9yIGluY2x1c2lvbiBpbiB0aGUKK2FyY2hpdmUgYXMgd2l0aCB0aGUgPGk+ZGlyPC9pPiBhdHRyaWJ1dGUuPC9wPgorCis8cD5QbGVhc2Ugbm90ZSB0aGF0IGN1cnJlbnRseSBvbmx5IHRoZSA8YQoraHJlZj0iLi4vQ29yZVRhc2tzL3Rhci5odG1sIj50YXI8L2E+IGFuZCA8YQoraHJlZj0iLi4vQ29yZVRha3MvemlwLmh0bWwiPnppcDwvYT4gdGFza3MgdXNlIHRoZSBwZXJtaXNzaW9uLjwvcD4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND5hbnkgZmlsZSBzeXN0ZW0gYmFzZWQgPGEgaHJlZj0icmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPiBvcgorc2luZ2xlIGVsZW1lbnQgcmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+CisKKzxwPlRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2lsbCBiZSB1c2VkIGFzIHNyYy48L3A+CisKKzxoND5FeGFtcGxlczwvaDQ+Cis8YmxvY2txdW90ZT4KKyAgPHByZT4gICZsdDt6aXAgZGVzdGZpbGU9IiR7ZGlzdH0vbWFudWFsLnppcCImZ3Q7PGJyPiAgICAmbHQ7emlwZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiIHByZWZpeD0iZG9jcy91c2VyLWd1aWRlIi8mZ3Q7PGJyPiAgICAmbHQ7emlwZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJDaGFuZ2VMb2cyNy50eHQiIGZ1bGxwYXRoPSJkb2NzL0NoYW5nZUxvZy50eHQiLyZndDs8YnI+ICAgICZsdDt6aXBmaWxlc2V0IHNyYz0iZXhhbXBsZXMuemlwIiBpbmNsdWRlcz0iKiovKi5odG1sIiBwcmVmaXg9ImRvY3MvZXhhbXBsZXMiLyZndDs8YnI+ICAmbHQ7L3ppcCZndDs8YnI+PC9wcmU+CisgIDxwPnppcHMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50bwordGhlIDxjb2RlPmRvY3MvdXNlci1ndWlkZTwvY29kZT4gZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlLCBhZGRzIHRoZQorZmlsZSA8Y29kZT5DaGFuZ2VMb2cyNy50eHQ8L2NvZGU+IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyA8Y29kZT5kb2NzL0NoYW5nZUxvZy50eHQ8L2NvZGU+LAorYW5kIGluY2x1ZGVzIGFsbCB0aGUgaHRtbCBmaWxlcyBpbiA8Y29kZT5leGFtcGxlcy56aXA8L2NvZGU+IHVuZGVyIDxjb2RlPmRvY3MvZXhhbXBsZXM8L2NvZGU+LgorVGhlIGFyY2hpdmUgbWlnaHQgZW5kIHVwIGNvbnRhaW5pbmcgdGhlIGZpbGVzOjwvcD4KKyAgPGNvZGU+IGRvY3MvdXNlci1ndWlkZS9odG1sL2luZGV4Lmh0bWw8YnI+Citkb2NzL0NoYW5nZUxvZy50eHQ8YnI+Citkb2NzL2V4YW1wbGVzL2luZGV4Lmh0bWw8YnI+CisgIDwvY29kZT48L2Jsb2NrcXVvdGU+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvSW50ZWdyYXRpb24vYW50dG9vbDEuZ2lmIGIvdHJ1bmsvZG9jcy9tYW51YWwvSW50ZWdyYXRpb24vYW50dG9vbDEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNDUwYmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9JbnRlZ3JhdGlvbi9hbnR0b29sMS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvSW50ZWdyYXRpb24vamV4dC1wbHVnaW4uaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL0ludGVncmF0aW9uL2pleHQtcGx1Z2luLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzMGViNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL0ludGVncmF0aW9uL2pleHQtcGx1Z2luLmh0bWwKQEAgLTAsMCArMSw1NiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+QXBhY2hlIEFudFdvcmsgUGx1Z2luIGZvciB0aGUgSmV4dCBKYXZhIFRleHQgRWRpdG9yPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDE+QW50V29yayBQbHVnaW4gZm9yIHRoZSBKZXh0IEphdmEgVGV4dCBFZGl0b3I8L2gxPgorIDxhIG5hbWU9ImF1dGhvcnMiPjwvYT5ieTx1bD4KKyAgPGxpPktsYXVzIEhhcnRsYWdlCisgICAgICAoPGEgaHJlZj0ibWFpbHRvOktIYXJ0bGFnZUB0LW9ubGluZS5kZSI+S0hhcnRsYWdlQHQtb25saW5lLmRlPC9hPik8L2xpPgorPC91bD4KKzxocj4KKworPHA+WW91IGNhbiBkb3dubG9hZCB0aGUgcGx1Z2luIGF0OiA8YQoraHJlZj0iZnRwOi8vamV4dC5zb3VyY2Vmb3JnZS5uZXQvcHViL2pleHQvcGx1Z2lucy9BbnRXb3JrLnppcCI+ZnRwOi8vamV4dC5zb3VyY2Vmb3JnZS5uZXQvcHViL2pleHQvcGx1Z2lucy9BbnRXb3JrLnppcDwvYT48L3A+CisKKzxoMj5JbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIFJlYWRtZS50eHQ6PC9oMj4KKworPHA+WW91IGhhdmUgdG8gZW5hYmxlIHRoZSBKZXh0IENvbnNvbGUgdG8gc2VlIHRoZSBBbnQgb3V0cHV0IChtZW51OgorRWRpdC0mZ3Q7T3B0aW9ucy4uLiAtIEdlbmVyYWwgUGFuZWwpLCBiZWNhdXNlIHRoZSBBbnQgbWVzc2FnZXMgYXJlCityZWRpcmVjdGVkIHRvIHRoZSBKZXh0IGNvbnNvbGUuPC9wPgorCis8cD5Zb3UgY2FuIGNvbmZpZ3VyZSB0aGUgQW50IGNhbGwgaW4gdGhlIEpleHQgbWVudTogRWRpdC0mZ3Q7T3B0aW9ucy4uLiAtCitQbHVnaW4gT3B0aW9ucyAtIEFudHdvcmsgUGx1Z2luIFBhbmVsOyBoZXJlIHlvdSBjYW4gc2V0IHRoZSBhbnQgaG9tZQorZGlyZWN0b3J5IGFuZCB0aGUgcGF0aCB0byB5b3VyIGJ1aWxkIGZpbGUuPC9wPgorCis8cD5Zb3UgY2FuIHN0YXJ0IEFudFdvcmsgaW4gdGhlIG1lbnU6IFBsdWdpbnMtJmd0O0FudC0mZ3Q7V29yayBOb3chICBJbiB0aGUKK2FwcGVhcmluZyBkaWFsb2cgYm94IHlvdSBjYW4gZW50ZXIgdGhlIHRhcmdldCB3aGljaCB5b3Ugd2FudCB0bworY29tcGlsZS48L3A+CisKKzxwPklmIGEgamF2YWMgZXJyb3Igb2NjdXJzIGluIHRoZSBhbnQgcnVuIGFuIGVycm9yLWxpc3Qgb3BlbnMgd2l0aGluCitKZXh0LiBXaXRoIGEgZG91YmxlLWNsaWNrIG9uIHRoZSBlcnJvci1tZXNzYWdlIHlvdSBqdW1wIHRvIHRoZSBlcnJvcgoraW4gdGhlIHNwZWNpZmllZCBqYXZhIHRleHQgZmlsZS48L3A+CisKKworPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0ludGVncmF0aW9uL3JlbWFjYy5naWYgYi90cnVuay9kb2NzL21hbnVhbC9JbnRlZ3JhdGlvbi9yZW1hY2MuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMmUwNDgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9JbnRlZ3JhdGlvbi9yZW1hY2MuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0ludGVncmF0aW9uL3Rvb2xtZW51LmdpZiBiL3RydW5rL2RvY3MvbWFudWFsL0ludGVncmF0aW9uL3Rvb2xtZW51LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjRkYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvSW50ZWdyYXRpb24vdG9vbG1lbnUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL0xJQ0VOU0UgYi90cnVuay9kb2NzL21hbnVhbC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjBkNGIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9MSUNFTlNFCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKyAqCisgKiAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorICoKKyAqICAgMS4gRGVmaW5pdGlvbnMuCisgKgorICogICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICogICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKyAqCisgKiAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgKiAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKyAqCisgKiAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAqICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICogICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICogICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAqICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAqICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgKiAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisgKgorICogICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgKiAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisgKgorICogICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAqICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICogICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorICoKKyAqICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAqICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICogICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgKiAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKyAqCisgKiAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgKiAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAqICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgKiAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisgKgorICogICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgKiAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAqICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICogICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICogICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAqICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICogICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorICoKKyAqICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAqICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICogICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAqICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICogICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAqICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgKiAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAqICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAqICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAqICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAqICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgKiAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgKiAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorICoKKyAqICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAqICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgKiAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorICoKKyAqICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAqICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAqICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgKiAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICogICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorICoKKyAqICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAqICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAqICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgKiAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICogICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICogICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICogICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgKiAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgKiAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgKiAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAqICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAqICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAqICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICoKKyAqICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAqICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgKiAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgKiAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAqICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisgKgorICogICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgKiAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKyAqCisgKiAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICogICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICogICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAqICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAqICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKyAqCisgKiAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICogICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICogICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgKiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAqICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICogICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAqICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAqICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICogICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICogICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgKiAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgKiAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICogICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAqICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICogICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgKiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisgKgorICogICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAqICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgKiAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICogICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAqICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKyAqCisgKiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAqICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgKiAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgKiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICogICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgKiAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgKiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKyAqCisgKiAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAqICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICogICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAqICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisgKgorICogICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAqICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICogICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgKiAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgKiAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAqICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgKiAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICogICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisgKgorICogICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAqICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgKiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgKiAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgKiAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAqICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgKiAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAqICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICogICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICogICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgKiAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAqICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAqICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAqICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAqICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAqICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAqICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICogICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAqICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICogICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKyAqCisgKiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworICoKKyAqICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorICoKKyAqICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICogICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICogICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICogICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAqICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICogICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAqICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorICoKKyAqICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvQm9ybGFuZEVKQlRhc2tzLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL0JvcmxhbmRFSkJUYXNrcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNmZlNWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL0JvcmxhbmRFSkJUYXNrcy5odG1sCkBAIC0wLDAgKzEsMTQzIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkJvcmxhbmQgRUpCIFRhc2tzPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJsb2ciPkJvcmxhbmREZXBsb3k8L2E+VG9vbDwvaDI+Cis8cD5ieSBCZW5vaXQgTW91c3NhdWQgKDxhIGhyZWY9Im1haWx0bzpiZW5vaXQubW91c3NhdWRAY3JpbHRlbGVjb20uY29tIj5iZW5vaXQubW91c3NhdWRAY3JpbHRlbGVjb20uY29tPC9hPik8L3A+CisKKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlRoZSBCb3JsYW5kRGVwbG95VG9vbCBpcyBhIHZlbmRvciBzcGVjaWZpYyBuZXN0ZWQgZWxlbWVudCBmb3IgdGhlIEVqYmphciBvcHRpb25hbCB0YXNrLjwvcD4KKzxwPkJvcmxhbmREZXBsb3ltZW50VG9vbCBpcyBkZWRpY2F0ZWQgdG8gdGhlIEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIDQuNS54IGFuZCBCb3JsYW5kCisgIEVudGVycHJpc2UgU2VydmVyIDUueC4gSXQgIGdlbmVyYXRlcyBhbmQgY29tcGlsZXMgdGhlIHN0dWJzIGFuZCBza2VsZXRvbnMgZm9yIGFsbCBlamIgZGVzY3JpYmVkIGludG8gdGhlCisgIERlcGxveW1lbnQgRGVzY3JpcHRvciwgYnVpbGRzIHRoZSBqYXIgZmlsZSBpbmNsdWRpbmcgdGhlIHN1cHBvcnQgZmlsZXMgYW5kCisgIHZlcmlmeSB3aGV0aGVyIHRoZSBwcm9kdWNlZCBqYXIgaXMgdmFsaWQgb3Igbm90LjwvcD4KKworPHA+QmVub2l0IE1vdXNzYXVkIG1haW50YWlucyBhIHNlcGFyYXRlIDxhCitocmVmPSJodHRwOi8vd3d3Lm1vdXNzYXVkLm9yZy9lamJqYXIuaHRtbCI+RkFRPC9hPiBmb3IgdGhpcyB0YXNrIGF0CitoaXMgaG9tZXBhZ2UuPC9wPgorCis8aDM+Qm9ybGFuZCBlbGVtZW50PC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2MyI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjYyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPmRlc3RkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+VGhlIGJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBib3JsYW5kCisgICAgICByZWFkeSBqYXIgZmlsZXMgYXJlIGRlcG9zaXRlZDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPnllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2MyI+ZGVidWc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+SWYgdHJ1ZSwgdHVybiBvbiB0aGUgZGVidWcgbW9kZSBmb3IgZWFjaCBib3JsYW5kCisgICAgICB0b29scyAoamF2YTJpaW9wLCBpYXN0b29sIC4uLikgZGVmYXVsdCA9IGZhbHNlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPnZlcmlmeTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij5JZiB0cnVlLCB0dXJuIG9uIHRoZSB2ZXJpZmljYXRpb24gYXQgdGhlIGVuZAorICAgICAgb2YgdGhlIGphciBwcm9kdWN0aW9uIChkZWZhdWx0ID0gZmFsc2UpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPnZlcmlmeWFyZ3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+ZXh0cmEgcGFyYW1ldGVyIGZvciB2ZXJpZnkgY29tbWFuZDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj5zdWZmaXg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+U3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUKKyAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byBjcmVhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBCb3JsYW5kIEVKQiBqYXIgZmlsZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj5ObywgZGVmYXVsdHMgdG8gJy1lamIuamFyJy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPmJhc2R0ZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij48Yj5EZXByZWNhdGVkPC9iPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlCisgICAgICBEVEQgd2hpY2ggY292ZXJzIHRoZSBCb3JsYW5kIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCisgICAgICBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIHlvdSBoYXZlIGJvcmxhbmQgaW4geW91ciBjbGFzc3BhdGguIElmIHlvdQorICAgICAgZG8gbm90LCB5b3Ugc2hvdWxkIHVzZSBhIG5lc3RlZAorICAgICAgPGEgaHJlZj0iZWpiLmh0bWwjZWpiamFyLWR0ZCI+PGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+PC9hPiBlbGVtZW50LCBkZXNjcmliZWQKKyAgICAgIGluIHRoZSBlamJqYXIgdGFzayBkb2N1bWVudGF0aW9uLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj5lamJkdGQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+PGI+RGVwcmVjYXRlZDwvYj4uIERlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgICAgZWpiLWphciBEVEQgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4gVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeQorICAgICAgaWYgeW91IGhhdmUgYm9ybGFuZCBpbiB5b3VyIGNsYXNzcGF0aC4gSWYgeW91IGRvIG5vdCwgeW91IHNob3VsZCB1c2UgYQorICAgICAgbmVzdGVkIDxhIGhyZWY9ImVqYi5odG1sI2VqYmphci1kdGQiPjxjb2RlPiZsdDtkdGQmZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudCwKKyAgICAgIGRlc2NyaWJlZCBpbiB0aGUgZWpiamFyIHRhc2sKKyAgICAgIGRvY3VtZW50YXRpb24uIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj5nZW5lcmF0ZWNsaWVudCA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+SWYgdHJ1ZSwgdHVybiBvbiB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICAgZWpiamFyIChkZWZhdWx0ID0gZmFsc2UpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPnZlcnNpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+c2V0IHRoZSBCb3JsYW5kIEFwcGxpY2F0aW9uIFZlcnNpb24uCisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaT40IG1lYW5zIEIuQS5TIChCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlcikgNC54LCB0YXJnZXQgd2lsbCBhZGQgZWpiLWlucHJpc2UueG1sIGZpbGU8L2xpPgorICAgICAgICAgICAgICA8bGk+NSBtZWFucyBCLkUuUyAoQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIpIDUueCwgdGFyZ2V0IHdpbGwgYWRkIGVqYi1ib3JsYW5kLnhtbCBmaWxlPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+Tm8sIGRlZmF1bHRzIHRvIDQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPmphdmEyaWlvcFBhcmFtcyA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+SWYgZmlsbGVkLCB0aGUgcGFyYW1zIGFyZSBhZGRlZCB0byB0aGUgamF2YTJpaW9wIGNvbW1hbmQgKGV4OiAtbm9fd2Fybl9taXNzaW5nX2RlZmluZSk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj5ubzwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cD5UaGUgZm9sbG93aW5nIGJ1aWxkLnhtbCBzbmlwcGV0IGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBCb3JsYW5kIGVsZW1lbnQKKyAgaW50byB0aGUgZWpiamFyIHRhc2s8L3A+Cis8cHJlPiAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0mcXVvdDske2J1aWxkLmNsYXNzZXN9JnF1b3Q7IGJhc2VqYXJuYW1lPSZxdW90O3ZzbXAmcXVvdDsgZGVzY3JpcHRvcmRpcj0mcXVvdDske3JzYy5kaXJ9L2hybWFuYWdlciZxdW90OyZndDsKKyAgICAgICAgJmx0O2JvcmxhbmQgZGVzdGRpcj0mcXVvdDtsaWImcXVvdDsgdmVyaWZ5PSZxdW90O29uJnF1b3Q7IGdlbmVyYXRlY2xpZW50PSZxdW90O29uJnF1b3Q7IHZlcnNpb249JnF1b3Q7NSZxdW90OyZndDsKKyAgICAgICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSZxdW90O2NsYXNzcGF0aCZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDsvYm9ybGFuZCZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKlxlamItamFyLnhtbCZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDtzdXBwb3J0IGRpcj0mcXVvdDske2J1aWxkLmNsYXNzZXN9JnF1b3Q7Jmd0OworICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7ZGVtb1wqLmNsYXNzJnF1b3Q7LyZndDsKKyAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2RlbW9caGVscGVyXCouY2xhc3MmcXVvdDsvJmd0OworICAgICAgICAgJmx0Oy9zdXBwb3J0Jmd0OworICAgICAmbHQ7L2VqYmphciZndDs8L3ByZT4KKzxwcmU+VGhlIGJvcmxhbmQgZWxlbWVudCB3aWxsIGdlbmVyYXRlIGludG8gdGhlIGxpYiBkaXIgYW4gZWpiIGphciBmaWxlIHVzaW5nIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcGxhY2VkIGludG8gdGhlICR7cnNjLmRpcn0vaHJtYW5hZ2VyIGRpcmVjdG9yeS4KK1RoZSB2ZXJpZnkgcGhhc2UgaXMgdHVybmVkIG9uIGFuZCB0aGUgZ2VuZXJhdGUgY2xpZW50IHBoYXNlIGFzIHdlbGwuCis8L3ByZT4KKworPGgzPiZuYnNwOzwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9Cb3JsYW5kR2VuZXJhdGVDbGllbnQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvQm9ybGFuZEdlbmVyYXRlQ2xpZW50Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5NTZiMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvQm9ybGFuZEdlbmVyYXRlQ2xpZW50Lmh0bWwKQEAgLTAsMCArMSw5MCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Cb3JsYW5kR2VuZXJhdGVDbGllbnQgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ibG9nIj5Cb3JsYW5kR2VuZXJhdGVDbGllbnQ8L2E+PC9oMj4KKzxwPmJ5IEJlbm9pdCBNb3Vzc2F1ZCAoPGEgaHJlZj0ibWFpbHRvOmJlbm9pdC5tb3Vzc2F1ZEBjcmlsdGVsZWNvbS5jb20iPmJlbm9pdC5tb3Vzc2F1ZEBjcmlsdGVsZWNvbS5jb208L2E+KTwvcD4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5UaGUgQm9ybGFuZEdlbmVyYXRlQ2xpZW50IGlzIGEgdGFzayBkZWRpY2F0ZWQgdG8gQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIKKyAgdiA0LjUuIEl0IG9mZmVycyB0byBnZW5lcmF0ZSB0aGUgY2xpZW50IGphciBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gYW4gZWpiIGphcgorICBmaWxlLjwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2MyI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjYyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPmVqYmphcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij5lamIgamFyIGZpbGU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj55ZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPmRlYnVnPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI5MTUiPklmIHRydWUsIHR1cm4gb24gdGhlIGRlYnVnIG1vZGUgZm9yIGVhY2ggYm9ybGFuZAorICAgICAgdG9vbHMgKGphdmEyaWlvcCwgaWFzdG9vbCAuLi4pIGRlZmF1bHQgPSBmYWxzZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj5jbGllbnRqYXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+Y2xpZW50IGphciBmaWxlIG5hbWUuIElmIG1pc3NpbmcgdGhlIGNsaWVudCBqYXIKKyAgICAgIGZpbGUgbmFtZSBpcyBidWlsZCB1c2luZyB0aGUgZWpiamFyIGZpbGUgbmFtZTogZWpiamFyID0gaGVsbG9iZWFuLWVqYi5qYXIKKyAgICAgID0mZ3Q7IGhlbGxvYmVhbi1lamJjbGllbnQuamFyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPm1vZGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+Y2hvb3NlIHRoZSBjb21tYW5kIGxhdW5jaGluZyBtb2RlLiBUd28gdmFsdWVzOgorICAgICAgamF2YSBvciBmb3JrLiBkZWZhdWx0ID0gZm9yay4gamF2YSBpcyBub3Qgc3VwcG9ydGVkIGZvciB2ZXJzaW9uPTUuUG9zc2liaWxpdHkgdG8gc3BlY2lmeSBhIGNsYXNzcGF0aC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2MyI+dmVyc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij5zZXQgdGhlIEJvcmxhbmQgQXBwbGljYXRpb24gVmVyc2lvbi4KKyAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpPjQgbWVhbnMgQi5BLlMgKEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIDQueCk8L2xpPgorICAgICAgICAgICAgICA8bGk+NSBtZWFucyBCLkUuUyAoQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNS54KTwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPk5vLCBkZWZhdWx0cyB0byA0PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cD5UaGUgZm9sbG93aW5nIGJ1aWxkLnhtbCBzbmlwcGV0IGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBCb3JsYW5kIGVsZW1lbnQKKyAgIGludG8gdGhlIGVqYmphciB0YXNrIHVzaW5nIHRoZSBqYXZhIG1vZGUuPC9wPgorPHByZT4KKyZsdDtibGdlbmNsaWVudCBlamJqYXI9JnF1b3Q7bGliL3NlY3V0ZXN0LWVqYi5qYXImcXVvdDsgY2xpZW50amFyPSZxdW90O2xpYi9jbGllbnQuamFyJnF1b3Q7IGRlYnVnPSZxdW90O3RydWUmcXVvdDsgbW9kZT0mcXVvdDtmb3JrJnF1b3Q7Jmd0OyB2ZXJzaW9uPSZxdW90OzUmcXVvdDsmZ3Q7CisgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O215bW9kdWxlLmphciZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CismbHQ7L2JsZ2VuY2xpZW50Jmd0OworPC9wcmU+Cis8cHJlPiZuYnNwOzwvcHJlPgorCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvYW50bHIuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvYW50bHIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Q0ZmRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9hbnRsci5odG1sCkBAIC0wLDAgKzEsMjAwIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkFOVExSIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImFudGxyIj5BTlRMUjwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPgorICBJbnZva2VzIHRoZSA8YSBIUkVGPSJodHRwOi8vd3d3LmFudGxyLm9yZy8iIHRhcmdldD0iX3RvcCI+QU5UTFI8L2E+IFRyYW5zbGF0b3IgZ2VuZXJhdG9yCisgIG9uIGEgZ3JhbW1hciBmaWxlLgorPC9wPgorPHA+CisgIFRvIHVzZSB0aGUgQU5UTFIgdGFzaywgc2V0IHRoZSA8aT50YXJnZXQ8L2k+IGF0dHJpYnV0ZSB0byB0aGUgbmFtZSBvZiB0aGUKKyAgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuICBPcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZQorICA8aT5vdXRwdXRkaXJlY3Rvcnk8L2k+IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZSB0byBhIHNwZWNpZmljIGRpcmVjdG9yeS4KKyAgT3RoZXJ3aXNlIEFOVExSIHdyaXRlcyB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZworICB0aGUgZ3JhbW1hciBmaWxlLgorPC9wPgorPHA+CisgIFRoaXMgdGFzayBvbmx5IGludm9rZXMgQU5UTFIgaWYgdGhlIGdyYW1tYXIgZmlsZSAob3IgdGhlCisgIHN1cGVyZ3JhbW1hciBzcGVjaWZpZWQgYnkgdGhlIGdsaWIgYXR0cmlidXRlKSBpcyBuZXdlciB0aGFuIHRoZQorICBnZW5lcmF0ZWQgZmlsZXMuCis8L3A+Cis8cD5BbnRsciAyLjcuMSBOb3RlOgorPGk+CisgIFRvIHN1Y2Nlc3NmdWxseSBydW4gQU5UTFIsIHlvdXIgYmVzdCBvcHRpb24gaXMgcHJvYmFibHkgdG8gYnVpbGQgdGhlIHdob2xlCisgIGphciB3aXRoIHRoZSBwcm92aWRlZCBzY3JpcHQgPGI+bWthbGxqYXI8L2I+IGFuZCBkcm9wIHRoZSByZXN1bHRpbmcgamFyIChhYm91dCAzMDBLQikKKyAgaW50byAke2FudC5ob21lfS9saWIuIERyb3BwaW5nIHRoZSBkZWZhdWx0IGphciAoNzBLQikgaXMgcHJvYmFibHkgbm90IGVub3VnaAorICBmb3IgbW9zdCBuZWVkcyBhbmQgeW91ciBvbmx5IG9wdGlvbiB3aWxsIGJlIHRvIGFkZCBBTlRMUiBob21lIGRpcmVjdG9yeQorICB0byB5b3VyIGNsYXNzcGF0aCBhcyBkZXNjcmliZWQgaW4gQU5UTFIgPHR0Pmluc3RhbGwuaHRtbDwvdHQ+IGRvY3VtZW50LgorPC9pPgorPC9wPgorPHA+QW50bHIgMi43LjIgTm90ZToKKzxpPgorICBJbnN0ZWFkIG9mIHRoZSBhYm92ZSwgeW91IHdpbGwgbmVlZCBhbnRscmFsbC5qYXIgdGhhdCBjYW4gYmUgY3JlYXRlZAorICBieSB0aGUgPGI+YW50bHItYWxsLmphcjwvYj4gdGFyZ2V0IG9mIHRoZSBNYWtlZmlsZSBwcm92aWRlZCB3aXRoIHRoZQorICBkb3dubG9hZC4KKzwvaT4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0ZGlyZWN0b3J5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgVGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvLiAgSWYgbm90IHNldCwgdGhlIGZpbGVzCisgICAgICBhcmUgd3JpdHRlbiB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGdyYW1tYXIgZmlsZS4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5nbGliPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgQW4gb3B0aW9uYWwgc3VwZXIgZ3JhbW1hciBmaWxlIHRoYXQgdGhlIHRhcmdldCBncmFtbWFyIG92ZXJyaWRlcy4gIFRoaXMKKyAgICAgIGZlYXR1cmUgaXMgb25seSBuZWVkZWQgZm9yIGFkdmFuY2VkIHZvY2FidWxhcmllcy4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1ZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIFdoZW4gc2V0IHRvICJ5ZXMiLCB0aGlzIGZsYWcgYWRkcyBjb2RlIHRvIHRoZSBnZW5lcmF0ZWQgcGFyc2VyIHRoYXQgd2lsbAorICAgICAgbGF1bmNoIHRoZSBQYXJzZVZpZXcgZGVidWdnZXIgdXBvbiBpbnZvY2F0aW9uLiAgVGhlIGRlZmF1bHQgaXMgIm5vIi4KKyAgICAgIDxicj4KKyAgICAgIE5vdGU6IFBhcnNlVmlldyBpcyBhIHNlcGFyYXRlIGNvbXBvbmVudCB0aGF0IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBvciB5b3VyCisgICAgICBncmFtbWFyIHdpbGwgaGF2ZSBjb21waWxhdGlvbiBlcnJvcnMuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aHRtbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIEVtaXQgYW4gaHRtbCB2ZXJzaW9uIG9mIHRoZSBncmFtbWFyIHdpdGggaHlwZXJsaW5rZWQgYWN0aW9ucy4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaWFnbm9zdGljPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgR2VuZXJhdGVzIGEgdGV4dCBmaWxlIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSB0YXJnZXQgZ3JhbW1hci4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50cmFjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIEZvcmNlcyA8Yj5hbGw8L2I+IHJ1bGVzIHRvIGNhbGwgdHJhY2VJbi90cmFjZU91dCBpZiBzZXQgdG8gInllcyIuCisgICAgICBUaGUgZGVmYXVsdCBpcyAibm8iLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRyYWNlUGFyc2VyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgT25seSBmb3JjZXMgcGFyc2VyIHJ1bGVzIHRvIGNhbGwgdHJhY2VJbi90cmFjZU91dCBpZiBzZXQgdG8gInllcyIuCisgICAgICBUaGUgZGVmYXVsdCBpcyAibm8iLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRyYWNlTGV4ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBPbmx5IGZvcmNlcyBsZXhlciBydWxlcyB0byBjYWxsIHRyYWNlSW4vdHJhY2VPdXQgaWYgc2V0IHRvICJ5ZXMiLgorICAgICAgVGhlIGRlZmF1bHQgaXMgIm5vIi4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50cmFjZVRyZWVXYWxrZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBPbmx5IGZvcmNlcyB0cmVlIHdhbGtlciBydWxlcyB0byBjYWxsIHRyYWNlSW4vdHJhY2VPdXQgaWYgc2V0IHRvCisgICAgICAieWVzIi4gIFRoZSBkZWZhdWx0IGlzICJubyIuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPCEtLXRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yazwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5SdW4gQU5UTFIgaW4gYSBzZXBhcmF0ZSBWTS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgJnF1b3Q7b2ZmJnF1b3Q7PC90ZD4KKyAgPC90ci0tPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIFZNIGluLiA8IS0tKGlnbm9yZWQgaWYKKyAgICAgIGZvcmsgaXMgZGlzYWJsZWQpLS0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgorCis8cD48Y29kZT5BTlRMUjwvY29kZT4gc3VwcG9ydHMgYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+CitlbGVtZW50LCB0aGF0IHJlcHJlc2VudHMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZQorc3RydWN0dXJlPC9hPi4gSXQgaXMgZ2l2ZW4gYXMgYSBjb252ZW5pZW5jZSBpZiB5b3UgaGF2ZSB0byBzcGVjaWZ5Cit0aGUgb3JpZ2luYWwgQU5UTFIgZGlyZWN0b3J5LiBJbiBtb3N0IGNhc2VzLCBkcm9wcGluZyB0aGUgYXBwcm9wcmlhdGUKK0FOVExSIGphciBpbiB0aGUgbm9ybWFsIEFudCBsaWIgcmVwb3NpdG9yeSB3aWxsIGJlIGVub3VnaC48L3A+CisKKzxoND5qdm1hcmc8L2g0PgorCis8cD48IS0tSWYgZm9yayBpcyBlbmFibGVkLCAtLT5BZGRpdGlvbmFsIHBhcmFtZXRlcnMgbWF5IGJlIHBhc3NlZCB0byB0aGUgbmV3CitWTSB2aWEgbmVzdGVkIDxjb2RlPiZsdDtqdm1hcmcmZ3Q7PC9jb2RlPiBhdHRyaWJ1dGVzLCBmb3IgZXhhbXBsZTo8L3A+CisKKzxwcmU+CismbHQ7YW50bHIgdGFyZ2V0PSIuLi4iJmd0OworICAmbHQ7anZtYXJnIHZhbHVlPSZxdW90Oy1EamF2YS5jb21waWxlcj1OT05FJnF1b3Q7LyZndDsKKyAgLi4uCismbHQ7L2FudGxyJmd0OworPC9wcmU+CisKKzxwPndvdWxkIHJ1biBBTlRMUiBpbiBhIFZNIHdpdGhvdXQgSklULjwvcD4KKworPHA+PGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGFsbG93cyBhbGwgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gPGEKK2hyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kIGxpbmUgYXJndW1lbnRzPC9hPi48L3A+CisKKzxoMz5FeGFtcGxlPC9oMz4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7YW50bHIKKyAgICB0YXJnZXQ9JnF1b3Q7ZXRjL2phdmEuZyZxdW90OworICAgIG91dHB1dGRpcmVjdG9yeT0mcXVvdDtidWlsZC9zcmMmcXVvdDsKKy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD4KKyAgVGhpcyBpbnZva2VzIEFOVExSIG9uIGdyYW1tYXIgZmlsZSBldGMvamF2YS5nLCB3cml0aW5nIHRoZSBnZW5lcmF0ZWQKKyAgZmlsZXMgdG8gYnVpbGQvc3JjLgorPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9hdHRyaWIuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvYXR0cmliLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkMjJlNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvYXR0cmliLmh0bWwKQEAgLTAsMCArMSwxNDggQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+QW50IFVzZXIgTWFudWFsPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJhdHRyaWIiPkF0dHJpYjwvYT48L2gyPgorPHA+PGVtPlNpbmNlIEFudCAxLjYuPC9lbT48L3A+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorCis8cD5DaGFuZ2VzIHRoZSBhdHRyaWJ1dGVzIG9mIGEgZmlsZSBvciBhbGwgZmlsZXMgaW5zaWRlIHNwZWNpZmllZAorZGlyZWN0b3JpZXMuICBSaWdodCBub3cgaXQgaGFzIGVmZmVjdCBvbmx5IHVuZGVyIFdpbmRvd3MuIEVhY2ggb2YgdGhlCis0IHBvc3NpYmxlIHBlcm1pc3Npb25zIGhhcyBpdHMgb3duIGF0dHJpYnV0ZSwgbWF0Y2hpbmcgdGhlIGFyZ3VtZW50cworZm9yIHRoZSBhdHRyaWIgY29tbWFuZC48L3A+CisKKzxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cywgCis8YSBocmVmPSIuLi9Db3JlVHlwZXMvZGlyc2V0Lmh0bWwiPkRpclNldDwvYT5zIG9yIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCI+RmlsZUxpc3Q8L2E+cyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nCituZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2RpcnNldCZndDs8L2NvZGU+IGFuZCAKKzxjb2RlPiZsdDtmaWxlbGlzdCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKworPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS43LCB0aGlzIHRhc2sgc3VwcG9ydHMgYXJiaXRyYXJ5IDxhCitocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT5zCithcyBuZXN0ZWQgZWxlbWVudHMuPC9wPgorCis8cD5CeSBkZWZhdWx0IHRoaXMgdGFzayB3aWxsIHVzZSBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5nCithdHRyaWIgY29tbWFuZC4gIElmIHlvdSBhcmUgd29ya2luZyBvbiBhIGxhcmdlIG51bWJlciBvZiBmaWxlcyB0aGlzCittYXkgcmVzdWx0IGluIGEgY29tbWFuZCBsaW5lIHRoYXQgaXMgdG9vIGxvbmcgZm9yIHlvdXIgb3BlcmF0aW5nCitzeXN0ZW0uICBJZiB5b3UgZW5jb3VudGVyIHN1Y2ggcHJvYmxlbXMsIHlvdSBzaG91bGQgc2V0IHRoZQorbWF4cGFyYWxsZWwgYXR0cmlidXRlIG9mIHRoaXMgdGFzayB0byBhIG5vbi16ZXJvIHZhbHVlLiAgVGhlIG51bWJlciB0bwordXNlIGhpZ2hseSBkZXBlbmRzIG9uIHRoZSBsZW5ndGggb2YgeW91ciBmaWxlIG5hbWVzICh0aGUgZGVwdGggb2YgeW91cgorZGlyZWN0b3J5IHRyZWUpLCBzbyB5b3UnbGwgaGF2ZSB0byBleHBlcmltZW50IGEgbGl0dGxlLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSBvciBkaXJlY3Rvcnkgb2Ygd2hpY2ggdGhlIHBlcm1pc3Npb25zIG11c3QgYmUKKyAgICBjaGFuZ2VkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB2YWxpZ249Im1pZGRsZSI+WWVzIG9yIG5lc3RlZAorICAgIDxjb2RlPiZsdDtmaWxlc2V0L2xpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZWFkb25seTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcmVhZG9ubHkgcGVybWlzc2lvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgcm93c3Bhbj0iNCI+YXQgbGVhc3Qgb25lIG9mIHRoZSBmb3VyLiA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hcmNoaXZlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBhcmNoaXZlIHBlcm1pc3Npb24uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3lzdGVtPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBzeXN0ZW0gcGVybWlzc2lvbi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5oaWRkZW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGhpZGRlbiBwZXJtaXNzaW9uLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T25lIG9mIDxpPmZpbGU8L2k+LCA8aT5kaXI8L2k+IG9yIDxpPmJvdGg8L2k+LiBJZiBzZXQgdG8KKyAgICAgIDxpPmZpbGU8L2k+LCBvbmx5IHRoZSBwZXJtaXNzaW9ucyBvZiBwbGFpbiBmaWxlcyBhcmUgZ29pbmcgdG8gYmUgY2hhbmdlZC4KKyAgICAgIElmIHNldCB0byA8aT5kaXI8L2k+LCBvbmx5IHRoZSBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZC48YnI+CisgICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSB0eXBlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bworICAgICAgbmVzdGVkIDxpPmRpcnNldDwvaT5zIC0gPGk+ZGlyc2V0PC9pPnMgYWx3YXlzIGltcGxpY2l0bHkKKyAgICAgIGFzc3VtZSB0eXBlIHRvIGJlIDxpPmRpcjwvaT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZpbGU8L2k+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIHByaW50IGEgc3VtbWFyeSBhZnRlciBleGVjdXRpb24gb3Igbm90LgorICAgICAgRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhcmFsbGVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb2Nlc3MgYWxsIHNwZWNpZmllZCBmaWxlcyB1c2luZyBhIHNpbmdsZQorICAgICAgPGNvZGU+Y2htb2Q8L2NvZGU+IGNvbW1hbmQuIERlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4cGFyYWxsZWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TGltaXQgdGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBieSBwYXNzaW5nIGF0CisgICAgICBtb3N0IHRoaXMgbWFueSBzb3VyY2VmaWxlcyBhdCBvbmNlLiAgU2V0IGl0IHRvICZsdDs9IDAgZm9yCisgICAgICB1bmxpbWl0ZWQuICBEZWZhdWx0cyB0byB1bmxpbWl0ZWQuICA8ZW0+U2luY2UgQW50IDEuNi48L2VtPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorICA8YmxvY2txdW90ZT4KKzxwcmU+Jmx0O2F0dHJpYiBmaWxlPSZxdW90OyR7ZGlzdH0vcnVuLmJhdCZxdW90OyByZWFkb25seT0mcXVvdDt0cnVlJnF1b3Q7IGhpZGRlbj0mcXVvdDt0cnVlJnF1b3Q7LyZndDs8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPm1ha2VzIHRoZSAmcXVvdDtydW4uYmF0JnF1b3Q7IGZpbGUgcmVhZC1vbmx5IGFuZCBoaWRkZW4uPC9wPgorCis8YmxvY2txdW90ZT4KKyAgPHByZT4mbHQ7YXR0cmliIHJlYWRvbmx5PSZxdW90O2ZhbHNlJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHttZXRhLmluZn0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi54bWwmcXVvdDsvJmd0OworJmx0Oy9hdHRyaWImZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPm1ha2VzIGFsbCAmcXVvdDsueG1sJnF1b3Q7IGZpbGVzIGJlbG93IDxjb2RlPiR7bWV0YS5pbmZ9PC9jb2RlPiByZWFkYWJsZS48L3A+CisKKzxibG9ja3F1b3RlPgorICA8cHJlPgorJmx0O2F0dHJpYiByZWFkb25seT0mcXVvdDt0cnVlJnF1b3Q7IGFyY2hpdmU9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NoYXJlZC9zb3VyY2VzMSZxdW90OyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqL3RyaWFsLyoqJnF1b3Q7LyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7ZmlsZXNldCByZWZpZD0mcXVvdDtvdGhlci5zaGFyZWQuc291cmNlcyZxdW90Oy8mZ3Q7CismbHQ7L2F0dHJpYiZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+bWFrZXMgYWxsIGZpbGVzIGJlbG93IDxjb2RlPnNoYXJlZC9zb3VyY2VzMTwvY29kZT4gKGV4Y2VwdCB0aG9zZSBiZWxvdyBhbnkKKyAgZGlyZWN0b3J5IG5hbWVkIHRyaWFsKSByZWFkLW9ubHkgYW5kIGFyY2hpdmVkLiBJbiBhZGRpdGlvbiBhbGwgZmlsZXMgYmVsb25naW5nCisgIHRvIGEgRmlsZVNldCB3aXRoIDxjb2RlPmlkPC9jb2RlPiA8Y29kZT5vdGhlci5zaGFyZWQuc291cmNlczwvY29kZT4gZ2V0IHRoZQorICBzYW1lIGF0dHJpYnV0ZXMuPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9jYWIuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvY2FiLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmYWI0OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvY2FiLmh0bWwKQEAgLTAsMCArMSwxNjcgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Q2FiIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImNhYiI+Q2FiPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+VGhlIGNhYiB0YXNrIGNyZWF0ZXMgTWljcm9zb2Z0IGNhYiBhcmNoaXZlIGZpbGVzLiAgSXQgaXMgaW52b2tlZAorc2ltaWxhciB0byB0aGUgPGEgaHJlZj0iLi4vQ29yZVRhc2tzL2phci5odG1sIj5qYXI8L2E+IG9yIDxhIGhyZWY9Ii4uL0NvcmVUYXNrcy96aXAuaHRtbCI+emlwPC9hPiB0YXNrcy4KK1RoaXMgdGFzayB3aWxsIHdvcmsgb24gV2luZG93cyB1c2luZyB0aGUgZXh0ZXJuYWwgY2FiYXJjIHRvb2wgKHByb3ZpZGVkIGJ5IE1pY3Jvc29mdCkKK3doaWNoIG11c3QgYmUgbG9jYXRlZCBpbiB5b3VyIGV4ZWN1dGFibGUgcGF0aC48L3A+Cis8cD5UbyB1c2UgdGhpcyB0YXNrIG9uIG90aGVyIHBsYXRmb3JtcyB5b3UgbmVlZCB0byBkb3dubG9hZCBhbmQgY29tcGlsZSBsaWJjYWJpbmV0IGZyb20KKzxhIGhyZWY9Imh0dHA6Ly90cmlsbC5jaXMuZm9yZGhhbS5lZHUvfmJhcmJhY2hhL2NhYmluZXRfbGlicmFyeS8iPgoraHR0cDovL3RyaWxsLmNpcy5mb3JkaGFtLmVkdS9+YmFyYmFjaGEvY2FiaW5ldF9saWJyYXJ5LzwvYT4uPC9wPgorPHA+U2VlIHRoZSBzZWN0aW9uIG9uIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkCit0YXNrczwvYT4sIG9uIGhvdyB0aGUgaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0bword3JpdGUgcGF0dGVybnMuPC9wPgorPHA+VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZAorc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgorKDxjb2RlPmRpcjwvY29kZT4gYmVjb21lcyA8Y29kZT5iYXNlZGlyPC9jb2RlPikgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCis8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZAorPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jYWJmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBjYWIgZmlsZSB0byBjcmVhdGUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSB0byBzdGFydCBhcmNoaXZpbmcgZmlsZXMgZnJvbS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNldCB0byAmcXVvdDt5ZXMmcXVvdDsgaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBvdXRwdXQgZnJvbQorICAgICAgdGhlIGNhYmFyYyB0b29sLiAgZGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDsuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2V0IHRvICZxdW90O25vJnF1b3Q7IHRvIHN0b3JlIGZpbGVzIHdpdGhvdXQgY29tcHJlc3NpbmcuCisgICAgICBkZWZhdWx0cyB0byAmcXVvdDt5ZXMmcXVvdDsuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3B0aW9uczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2UgdG8gc2V0IGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yCisgICAgICB0aGUgY2FiYXJjIHRvb2wuICBzaG91bGQgbm90IG5vcm1hbGx5IGJlIG5lY2Vzc2FyeS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdAorICAgICAgbXVzdCBiZSBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQKKyAgICAgIG11c3QgYmUgZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkCisgICAgICB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQKKyAgICAgIG9yIG5vdCAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5maWxlc2V0PC9oND4KKworPHA+VGhlIGNhYiB0YXNrIHN1cHBvcnRzIG9uZSBuZXN0ZWQgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPjxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT48L2E+CitlbGVtZW50IHRvIHNwZWNpZnkgdGhlIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBhcmNoaXZlLgorICBJZiB0aGlzIGlzIHNwZWNpZmllZCwgdGhlICJiYXNlZGlyIiBhdHRyaWJ1dGUgY2Fubm90IGJlIHVzZWQuCis8L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2NhYiBjYWJmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLmNhYiZxdW90OworICAgICBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsKKyAgLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmNhYnMgYWxsIGZpbGVzIGluIHRoZSBodGRvY3MvbWFudWFsIGRpcmVjdG9yeSBpbnRvIGEgZmlsZSBjYWxsZWQKK21hbnVhbC5jYWIgaW4gdGhlICR7ZGlzdH0gZGlyZWN0b3J5LjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y2FiIGNhYmZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuY2FiJnF1b3Q7CisgICAgIGJhc2VkaXI9JnF1b3Q7aHRkb2NzL21hbnVhbCZxdW90OworICAgICBleGNsdWRlcz0mcXVvdDtteWRvY3MvKiosICoqL3RvZG8uaHRtbCZxdW90OworICAvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+Y2FicyBhbGwgZmlsZXMgaW4gdGhlIGh0ZG9jcy9tYW51YWwgZGlyZWN0b3J5IGludG8gYSBmaWxlIGNhbGxlZAorbWFudWFsLmNhYiBpbiB0aGUgJHtkaXN0fSBkaXJlY3RvcnkuIEZpbGVzIGluIHRoZSBkaXJlY3RvcnkgbXlkb2NzLAorb3IgZmlsZXMgd2l0aCB0aGUgbmFtZSB0b2RvLmh0bWwgYXJlIGV4Y2x1ZGVkLjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y2FiIGNhYmZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuY2FiJnF1b3Q7CisgICAgIGJhc2VkaXI9JnF1b3Q7aHRkb2NzL21hbnVhbCZxdW90OworICAgICBpbmNsdWRlcz0mcXVvdDthcGkvKiovKi5odG1sJnF1b3Q7CisgICAgIGV4Y2x1ZGVzPSZxdW90OyoqL3RvZG8uaHRtbCZxdW90OworICAgICB2ZXJib3NlPSZxdW90O3llcyZxdW90OworICAvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+Q2FiIGFsbCBmaWxlcyBpbiB0aGUgaHRkb2NzL21hbnVhbCBkaXJlY3RvcnkgaW50byBhIGZpbGUgY2FsbGVkCittYW51YWwuY2FiIGluIHRoZSAke2Rpc3R9IGRpcmVjdG9yeS4gT25seSBodG1sIGZpbGVzIHVuZGVyIHRoZQorZGlyZWN0b3J5IGFwaSBhcmUgYXJjaGl2ZWQsIGFuZCBmaWxlcyB3aXRoIHRoZSBuYW1lIHRvZG8uaHRtbCBhcmUKK2V4Y2x1ZGVkLiBPdXRwdXQgZnJvbSB0aGUgY2FiYXJjIHRvb2wgaXMgZGlzcGxheWVkIGluIHRoZSBidWlsZAorb3V0cHV0LjwvcD4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtjYWIgY2FiZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC5jYWImcXVvdDsKKyAgICAgdmVyYm9zZT0mcXVvdDt5ZXMmcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0CisgICAgICAgZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsKKyAgICAgICBpbmNsdWRlcz0mcXVvdDthcGkvKiovKi5odG1sJnF1b3Q7CisgICAgICAgZXhjbHVkZXM9JnF1b3Q7KiovdG9kby5odG1sJnF1b3Q7CisgIC8mZ3Q7CismbHQ7L2NhYiZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4YW1wbGUgYWJvdmUuPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2NjbS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9jY20uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWMxODFjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9jY20uaHRtbApAQCAtMCwwICsxLDI3MyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5Db250aW51dXMgVGFza3M8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgxPkNvbnRpbnV1cyBTdXBwb3J0PC9oMT4KKzx1bD4KKyAgPGxpPjxhIGhyZWY9IiNjY21jaGVja2luIj5DQ01DaGVja2luPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjY2NtY2hlY2tvdXQiPkNDTUNoZWNrb3V0PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjY2NtY2hlY2tpbnRhc2siPkNDTUNoZWNraW5UYXNrPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjY2NtcmVjb25maWd1cmUiPkNDTVJlY29uZmlndXJlPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjY2NtY3JlYXRldGFzayI+Q0NNQ3JlYXRlVGFzazwvYT48L2xpPgorPC91bD4KKworPHA+VGhlc2UgYW50IHRhc2tzIGFyZSB3cmFwcGVycyBhcm91bmQgQ29udGludXVzIFNvdXJjZSBNYW5hZ2VyLiBUaGV5IGhhdmUgYmVlbiB0ZXN0ZWQKKyAgYWdhaW5zdCB2ZXJzaW9ucyA1LjEvNi4yIG9uIFdpbmRvd3MgMjAwMCwgYnV0IHNob3VsZCB3b3JrIG9uIG90aGVyIHBsYXRmb3JtcyB3aXRoIGNjbSBpbnN0YWxsZWQuPC9wPgorPHA+YXV0aG9yOiA8YSBocmVmPSJtYWlsdG86YmVub2l0Lm1vdXNzYXVkQGNyaWx0ZWxlY29tLmNvbSI+QmVub2l0IE1vdXNhdWQgKGJlbm9pdC5tb3Vzc2F1ZEBjcmlsdGVsZWNvbS5jb20pIDwvYT48L3A+Cis8aHI+Cis8aDI+PGEgbmFtZT0iY2NtY2hlY2tpbiI+Q0NNQ2hlY2tpbjwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1Rhc2sgdG8gY2hlY2tpbiBhIGZpbGUKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjU5OCI+CisgIDx0cj4KKyAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICA8dGg+VmFsdWVzPC90aD4KKyAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5QYXRoIHRvIHRoZSBmaWxlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIERlZmF1bHQgaXMgJnF1b3Q7Q2hlY2tpbiZxdW90OyBwbHVzIHRoZSBkYXRlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnRhc2s8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNrIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0Jyk8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2NtZGlyPC90ZD4KKyAgICA8dGQ+cGF0aCB0byB0aGUgY2NtIGV4ZWN1dGFibGUgZmlsZSwgcmVxdWlyZWQgaWYgaXQgaXMgbm90IG9uIHRoZSBQQVRIPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKyAgPHByZT4mbHQ7Y2NtY2hlY2tpbiBmaWxlPSZxdW90O2M6L3dhL2NvbS9mb28vTXlGaWxlLmphdmEmcXVvdDsKKyAgICAgICAgY29tbWVudD0mcXVvdDtteWNvbW1lbnQmcXVvdDsvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5DaGVja3MgaW4gdGhlIGZpbGUgPGk+Yzovd2EvY29tL2Zvby9NeUZpbGUuamF2YTwvaT4uCisgIENvbW1lbnQgYXR0cmlidXRlIDxpPm15Y29tbWVudDwvaT4gaXMgYWRkZWQgYXMgYSB0YXNrIGNvbW1lbnQuIFRoZSB0YXNrCisgIHVzZWQgaXMgdGhlIG9uZSBzZXQgYXMgdGhlIGRlZmF1bHQuPC9wPgorPGhyPgorPGgyPjxhIG5hbWU9ImNjbWNoZWNrb3V0Ij5DQ01DaGVja291dDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1Rhc2sgdG8gcGVyZm9ybSBhIENoZWNrb3V0IGNvbW1hbmQgdG8gQ29udGludXVzCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSI2MTQiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+UGF0aCB0byB0aGUgZmlsZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgICAgPHRkIHJvd3NwYW49MiI+WWVzIChmaWxlfGZpbGVzZXQpPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5maWxlc2V0PC90ZD4KKyAgICA8dGQ+ZmlsZXNldCBjb250YWluaW5nIHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQgb3V0PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnRhc2s8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNraW4gdGhlIGZpbGUgKG1heSB1c2UKKyAgICAgICdkZWZhdWx0Jyk8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2NtZGlyPC90ZD4KKyAgICA8dGQ+cGF0aCB0byB0aGUgY2NtIGV4ZWN1dGFibGUgZmlsZSwgcmVxdWlyZWQgaWYgaXQgaXMgbm90IG9uIHRoZSBQQVRIPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKyAgPHByZT4mbHQ7Y2NtY2hlY2tvdXQgZmlsZT0mcXVvdDtjOi93YS9jb20vZm9vL015RmlsZS5qYXZhJnF1b3Q7CisgICAgICAgIGNvbW1lbnQ9JnF1b3Q7bXljb21tZW50JnF1b3Q7LyZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+Q2hlY2sgb3V0IHRoZSBmaWxlIDxpPmM6L3dhL2NvbS9mb28vTXlGaWxlLmphdmE8L2k+LgorICBDb21tZW50IGF0dHJpYnV0ZSA8aT5teWNvbW1lbnQ8L2k+IGlzIGFkZGVkIGFzIGEgdGFzayBjb21tZW50CisgICBUaGUgdXNlZCB0YXNrIGlzIHRoZSBvbmUgc2V0IGFzIHRoZSBkZWZhdWx0LjwvcD4KKzxibG9ja3F1b3RlPgorICA8cHJlPiZsdDtjY21jaGVja291dCAgY29tbWVudD0mcXVvdDtteWNvbW1lbnQmcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtsaWImcXVvdDsgJmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5qYXImcXVvdDsvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L2NjbWNoZWNrb3V0ICZndDsKKyAgPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPkNoZWNrIG91dCBhbGwgdGhlIGZpbGVzIGluIHRoZSA8aT5saWI8L2k+IGRpcmVjdG9yeSBoYXZpbmcgdGhlIDxpPi5qYXI8L2k+IGV4dGVuc2lvbi4KKyAgQ29tbWVudCBhdHRyaWJ1dGUgPGk+bXljb21tZW50PC9pPiBpcyBhZGRlZCBhcyBhIHRhc2sgY29tbWVudAorICAgVGhlIHVzZWQgdGFzayBpcyB0aGUgb25lIHNldCBhcyB0aGUgZGVmYXVsdC48L3A+CisKKworCis8aHI+Cis8aDI+PGEgbmFtZT0iY2NtY2hlY2tpbnRhc2siPkNDTUNoZWNraW5UYXNrPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIGEgY2hlY2sgaW4gZGVmYXVsdCB0YXNrIGNvbW1hbmQgdG8gQ29udGludXVzCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnRhc2s8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNrIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0Jyk8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2NtZGlyPC90ZD4KKyAgICA8dGQgPnBhdGggdG8gdGhlIGNjbSBleGVjdXRhYmxlIGZpbGUsIHJlcXVpcmVkIGlmIGl0IGlzIG5vdCBvbiB0aGUgUEFUSDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXMgPC9oMz4KKzxibG9ja3F1b3RlPgorICA8cHJlPiZsdDtjY21jaGVja2ludGFzayBjb21tZW50PSZxdW90O2JsYWhibGFoLyZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+RG9lcyBhIENoZWNraW4gZGVmYXVsdCB0YXNrIG9uIGFsbCB0aGUgY2hlY2tlZCBvdXQgZmlsZXMgaW4gdGhlIGN1cnJlbnQgdGFzay48L3A+Cis8aHI+Cis8aDI+PGEgbmFtZT0iY2NtcmVjb25maWd1cmUiPkNDTVJlY29uZmlndXJlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIGFuIHJlY29uZmlndXJlIGNvbW1hbmQgdG8gQ29udGludXVzLgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVjdXJzZTwvdGQ+CisgICAgPHRkPnJlY3Vyc2Ugb24gc3VicHJvamVjdCAoZGVmYXVsdCBmYWxzZSk8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dmVyYm9zZTwvdGQ+CisgICAgPHRkPmRvIGEgdmVyYm9zZSByZWNvbmZpZ3VyZSBvcGVyYXRpb24gKGRlZmF1bHQgZmFsc2UpPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNjbXByb2plY3Q8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhlIGNjbSBwcm9qZWN0IG9uIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgYXBwbGllZC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNjbWRpcjwvdGQ+CisgICAgPHRkID5wYXRoIHRvIHRoZSBjY20gZXhlY3V0YWJsZSBmaWxlLCByZXF1aXJlZCBpZiBpdCBpcyBub3Qgb24gdGhlIFBBVEg8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPgorIDxwcmU+Jmx0O2NjbXJlY29uZmlndXJlIGNjbXByb2plY3Q9JnF1b3Q7QU5UQ0NNX1RFU1QjQk1PXzEmcXVvdDsKKyAgICAgICAgIHZlcmJvc2U9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPkRvZXMgYSBDb250aW51dXMgPGk+cmVjb25maWd1cmU8L2k+IG9uIHRoZSBwcm9qZWN0IDxpPkFOVENDTV9URVNUI0JNT18xPC9pPi4KKzwvcD4KKzxocj4KKzxoMj48YSBuYW1lPSJjY21jcmVhdGV0YXNrIj5DQ01DcmVhdGVUYXNrPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorQ3JlYXRlIGEgQ29udGludXVzIHRhc2suCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnBsYXRmb3JtPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB0aGUgdGFyZ2V0IHBsYXRmb3JtPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNjbWRpcjwvdGQ+CisgICAgPHRkID5wYXRoIHRvIHRoZSBjY20gZXhlY3V0YWJsZSBmaWxlLCByZXF1aXJlZCBpZiBpdCBpcyBub3Qgb24gdGhlIFBBVEg8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVzb2x2ZXI8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHRoZSByZXNvbHZlcjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5yZWxlYXNlPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB0aGUgQ0NNIHJlbGVhc2U8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c3Vic3lzdGVtPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB0aGUgc3Vic3lzdGVtPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnRhc2s8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNraW4gdGhlIGZpbGUgKG1heSB1c2UgJ2RlZmF1bHQnKTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+CisgIDxwcmU+Jmx0O2NjbWNyZWF0ZXRhc2sgcmVzb2x2ZXI9JnF1b3Q7JHt1c2VyLm5hbWV9JnF1b3Q7CisgICAgICAgICAgICByZWxlYXNlPSZxdW90O0FOVENDTV9URVNUJnF1b3Q7IGNvbW1lbnQ9JnF1b3Q7YmxhaGJsYWgmcXVvdDsvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5DcmVhdGVzIGEgdGFzayBmb3IgdGhlIHJlbGVhc2UgPGk+QU5UQ0NNX1RFU1Q8L2k+IHdpdGggdGhlCisgIGN1cnJlbnQgdXNlciBhcyB0aGUgcmVzb2x2ZXIgZm9yIHRoaXMgdGFzay48L3A+CisKKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2NoZ3JwLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2NoZ3JwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNTJlZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvY2hncnAuaHRtbApAQCAtMCwwICsxLDE2NiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5DaGdycCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJDaGdycCI+Q2hncnA8L2E+PC9oMj4KKzxwPjxlbT5TaW5jZSBBbnQgMS42LjwvZW0+PC9wPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworPHA+Q2hhbmdlcyB0aGUgZ3JvdXAgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUgc3BlY2lmaWVkCitkaXJlY3Rvcmllcy4gUmlnaHQgbm93IGl0IGhhcyBlZmZlY3Qgb25seSB1bmRlciBVbml4LiAgVGhlIGdyb3VwCithdHRyaWJ1dGUgaXMgZXF1aXZhbGVudCB0byB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudCBmb3IgdGhlIGNoZ3JwCitjb21tYW5kLjwvcD4KKworPHA+PGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zLCAKKzxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9kaXJzZXQuaHRtbCI+RGlyU2V0PC9hPnMgb3IgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9maWxlbGlzdC5odG1sIj5GaWxlTGlzdDwvYT5zIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcKK25lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4gYW5kIAorPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorCis8cD5TdGFydGluZyB3aXRoIEFudCAxLjcsIHRoaXMgdGFzayBzdXBwb3J0cyBhcmJpdHJhcnkgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZSBDb2xsZWN0aW9uPC9hPnMKK2FzIG5lc3RlZCBlbGVtZW50cy48L3A+CisKKzxwPkJ5IGRlZmF1bHQgdGhpcyB0YXNrIHdpbGwgdXNlIGEgc2luZ2xlIGludm9jYXRpb24gb2YgdGhlIHVuZGVybHlpbmcKK2NoZ3JwIGNvbW1hbmQuICBJZiB5b3UgYXJlIHdvcmtpbmcgb24gYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgdGhpcyBtYXkKK3Jlc3VsdCBpbiBhIGNvbW1hbmQgbGluZSB0aGF0IGlzIHRvbyBsb25nIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uCitJZiB5b3UgZW5jb3VudGVyIHN1Y2ggcHJvYmxlbXMsIHlvdSBzaG91bGQgc2V0IHRoZSBtYXhwYXJhbGxlbAorYXR0cmlidXRlIG9mIHRoaXMgdGFzayB0byBhIG5vbi16ZXJvIHZhbHVlLiAgVGhlIG51bWJlciB0byB1c2UgaGlnaGx5CitkZXBlbmRzIG9uIHRoZSBsZW5ndGggb2YgeW91ciBmaWxlIG5hbWVzICh0aGUgZGVwdGggb2YgeW91ciBkaXJlY3RvcnkKK3RyZWUpIGFuZCB5b3VyIG9wZXJhdGluZyBzeXN0ZW0sIHNvIHlvdSdsbCBoYXZlIHRvIGV4cGVyaW1lbnQgYQorbGl0dGxlLiAgUE9TSVggcmVjb21tZW5kcyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyBvZiBhdCBsZWFzdCA0MDk2CitjaGFyYWN0ZXJzLCB0aGlzIG1heSBnaXZlIHlvdSBhbiBhcHByb3hpbWF0aW9uIGZvciB0aGUgbnVtYmVyIHlvdQorY291bGQgdXNlIGFzIGluaXRpYWwgdmFsdWUgZm9yIHRoZXNlIGV4cGVyaW1lbnRzLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSBvciBkaXJlY3Rvcnkgb2Ygd2hpY2ggdGhlIGdyb3VwIG11c3QgYmUKKyAgICBjaGFuZ2VkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB2YWxpZ249Im1pZGRsZSI+WWVzLCB1bmxlc3MgbmVzdGVkCisgICAgICA8Y29kZT4mbHQ7ZmlsZXNldHxmaWxlbGlzdHxkaXJzZXQmZ3Q7PC9jb2RlPgorICAgICAgZWxlbWVudHMgYXJlIHNwZWNpZmllZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmdyb3VwPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuZXcgZ3JvdXAuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhcmFsbGVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb2Nlc3MgYWxsIHNwZWNpZmllZCBmaWxlcyB1c2luZyBhIHNpbmdsZQorICAgICAgPGNvZGU+Y2hncnA8L2NvZGU+IGNvbW1hbmQuIERlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5PbmUgb2YgPGk+ZmlsZTwvaT4sIDxpPmRpcjwvaT4gb3IKKyAgICAgIDxpPmJvdGg8L2k+LiBJZiBzZXQgdG8gPGk+ZmlsZTwvaT4sIG9ubHkgdGhlIGdyb3VwIG9mCisgICAgICBwbGFpbiBmaWxlcyBhcmUgZ29pbmcgdG8gYmUgY2hhbmdlZC4gSWYgc2V0IHRvIDxpPmRpcjwvaT4sIG9ubHkKKyAgICAgIHRoZSBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZC48YnI+CisgICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSB0eXBlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bworICAgICAgbmVzdGVkIDxpPmRpcnNldDwvaT5zIC0gPGk+ZGlyc2V0PC9pPnMgYWx3YXlzIGltcGxpY2l0bHkKKyAgICAgIGFzc3VtZSB0eXBlIHRvIGJlIDxpPmRpcjwvaT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZpbGU8L2k+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4cGFyYWxsZWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TGltaXQgdGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBieSBwYXNzaW5nIGF0CisgICAgICBtb3N0IHRoaXMgbWFueSBzb3VyY2VmaWxlcyBhdCBvbmNlLiAgU2V0IGl0IHRvICZsdDs9IDAgZm9yCisgICAgICB1bmxpbWl0ZWQuICBEZWZhdWx0cyB0byB1bmxpbWl0ZWQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKworICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gcHJpbnQgYSBzdW1tYXJ5IGFmdGVyIGV4ZWN1dGlvbiBvciBub3QuCisgICAgICBEZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+CisgIDxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y2hncnAgZmlsZT0mcXVvdDske2Rpc3R9L3N0YXJ0LnNoJnF1b3Q7IGdyb3VwPSZxdW90O2NvZGVycyZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPm1ha2VzIHRoZSAmcXVvdDtzdGFydC5zaCZxdW90OyBmaWxlIGJlbG9uZyB0byB0aGUgY29kZXJzIGdyb3VwIG9uIGEKK1VOSVggc3lzdGVtLjwvcD4KKzxibG9ja3F1b3RlPgorPHByZT4KKyZsdDtjaGdycCBncm91cD0mcXVvdDtjb2RlcnMmcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2Rpc3R9L2JpbiZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLnNoJnF1b3Q7LyZndDsKKyZsdDsvY2hncnAmZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPm1ha2VzIGFsbCAmcXVvdDsuc2gmcXVvdDsgZmlsZXMgYmVsb3cgPGNvZGU+JHtkaXN0fS9iaW48L2NvZGU+CitiZWxvbmcgdG8gdGhlIGNvZGVycyBncm91cCBvbiBhIFVOSVggc3lzdGVtLjwvcD4KKzxibG9ja3F1b3RlPgorPHByZT4KKyZsdDtjaGdycCBncm91cD0mcXVvdDtjb2RlcnMmcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzaGFyZWQvc291cmNlczEmcXVvdDsmZ3Q7CisgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi90cmlhbC8qKiZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0O2ZpbGVzZXQgcmVmaWQ9JnF1b3Q7b3RoZXIuc2hhcmVkLnNvdXJjZXMmcXVvdDsvJmd0OworJmx0Oy9jaGdycCZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+bWFrZXMgYWxsIGZpbGVzIGJlbG93IDxjb2RlPnNoYXJlZC9zb3VyY2VzMTwvY29kZT4gKGV4Y2VwdCB0aG9zZQorYmVsb3cgYW55IGRpcmVjdG9yeSBuYW1lZCB0cmlhbCkgYmVsb25nIHRvIHRoZSBjb2RlcnMgZ3JvdXAgb24gYSBVTklYIAorc3lzdGVtLiBJbiBhZGRpdGlvbiBhbGwgZmlsZXMgYmVsb25naW5nIHRvIGEgRmlsZVNldAord2l0aCA8Y29kZT5pZDwvY29kZT4gPGNvZGU+b3RoZXIuc2hhcmVkLnNvdXJjZXM8L2NvZGU+IGdldCB0aGUgc2FtZQorZ3JvdXAuPC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7Y2hncnAgZ3JvdXA9JnF1b3Q7d2ViZGV2JnF1b3Q7IHR5cGU9JnF1b3Q7ZmlsZSZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90Oy93ZWImcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLnRlc3QuanNwJnF1b3Q7LyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyoubmV3JnF1b3Q7LyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7ZGlyc2V0IGRpcj0mcXVvdDsvd2ViJnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovdGVzdF8qJnF1b3Q7LyZndDsKKyAgJmx0Oy9kaXJzZXQmZ3Q7CismbHQ7L2NobW9kJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPm1ha2VzIGFsbCA8Y29kZT4udGVzdC5qc3A8L2NvZGU+LCBhbmQgPGNvZGU+Lm5ldzwvY29kZT4gZmlsZXMgYmVsb25nIHRvIAorZ3JvdXAgd2ViZGV2LiBEaXJlY3RvcmllcyBiZWdpbm5pbmcgd2l0aCA8Y29kZT50ZXN0XzwvY29kZT4gYWxzbyB3aWxsIGJlbG9uZyAKK3RvIHdlYmRldiwgYnV0IGlmIHRoZXJlIGlzIGEgZGlyZWN0b3J5IHRoYXQgZW5kcyBpbiA8Y29kZT4ubmV3PC9jb2RlPiBvciBhIGZpbGUKK3RoYXQgYmVnaW5zIHdpdGggPGNvZGU+dGVzdF88L2NvZGU+IGl0IHdpbGwgYmUgdW5hZmZlY3RlZC48L3A+CisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9jaG93bi5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9jaG93bi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzU1NjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2Nob3duLmh0bWwKQEAgLTAsMCArMSwxNjQgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Q2hvd24gVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iQ2hvd24iPkNob3duPC9hPjwvaDI+Cis8cD48ZW0+U2luY2UgQW50IDEuNi48L2VtPjwvcD4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKzxwPkNoYW5nZXMgdGhlIG93bmVyIG9mIGEgZmlsZSBvciBhbGwgZmlsZXMgaW5zaWRlIHNwZWNpZmllZAorZGlyZWN0b3JpZXMuIFJpZ2h0IG5vdyBpdCBoYXMgZWZmZWN0IG9ubHkgdW5kZXIgVW5peC4gIFRoZSBvd25lcgorYXR0cmlidXRlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQgZm9yIHRoZSBjaG93bgorY29tbWFuZC48L3A+CisKKzxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cywgCis8YSBocmVmPSIuLi9Db3JlVHlwZXMvZGlyc2V0Lmh0bWwiPkRpclNldDwvYT5zIG9yIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCI+RmlsZUxpc3Q8L2E+cyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nCituZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2RpcnNldCZndDs8L2NvZGU+IGFuZCAKKzxjb2RlPiZsdDtmaWxlbGlzdCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKworPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS43LCB0aGlzIHRhc2sgc3VwcG9ydHMgYXJiaXRyYXJ5IDxhCitocmVmPSIuLi9Db3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT5zCithcyBuZXN0ZWQgZWxlbWVudHMuPC9wPgorCis8cD5CeSBkZWZhdWx0IHRoaXMgdGFzayB3aWxsIHVzZSBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5nCitjaG93biBjb21tYW5kLiAgSWYgeW91IGFyZSB3b3JraW5nIG9uIGEgbGFyZ2UgbnVtYmVyIG9mIGZpbGVzIHRoaXMgbWF5CityZXN1bHQgaW4gYSBjb21tYW5kIGxpbmUgdGhhdCBpcyB0b28gbG9uZyBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLgorSWYgeW91IGVuY291bnRlciBzdWNoIHByb2JsZW1zLCB5b3Ugc2hvdWxkIHNldCB0aGUgbWF4cGFyYWxsZWwKK2F0dHJpYnV0ZSBvZiB0aGlzIHRhc2sgdG8gYSBub24temVybyB2YWx1ZS4gIFRoZSBudW1iZXIgdG8gdXNlIGhpZ2hseQorZGVwZW5kcyBvbiB0aGUgbGVuZ3RoIG9mIHlvdXIgZmlsZSBuYW1lcyAodGhlIGRlcHRoIG9mIHlvdXIgZGlyZWN0b3J5Cit0cmVlKSBhbmQgeW91ciBvcGVyYXRpbmcgc3lzdGVtLCBzbyB5b3UnbGwgaGF2ZSB0byBleHBlcmltZW50IGEKK2xpdHRsZS4gIFBPU0lYIHJlY29tbWVuZHMgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgb2YgYXQgbGVhc3QgNDA5NgorY2hhcmFjdGVycywgdGhpcyBtYXkgZ2l2ZSB5b3UgYW4gYXBwcm94aW1hdGlvbiBmb3IgdGhlIG51bWJlciB5b3UKK2NvdWxkIHVzZSBhcyBpbml0aWFsIHZhbHVlIGZvciB0aGVzZSBleHBlcmltZW50cy48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgb3IgZGlyZWN0b3J5IG9mIHdoaWNoIHRoZSBvd25lciBtdXN0IGJlCisgICAgY2hhbmdlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgdmFsaWduPSJtaWRkbGUiPlllcyBvciBuZXN0ZWQKKyAgICA8Y29kZT4mbHQ7ZmlsZXNldC9saXN0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3duZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5ldyBvd25lci48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFyYWxsZWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvY2VzcyBhbGwgc3BlY2lmaWVkIGZpbGVzIHVzaW5nIGEgc2luZ2xlCisgICAgICA8Y29kZT5jaG93bjwvY29kZT4gY29tbWFuZC4gRGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50eXBlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk9uZSBvZiA8aT5maWxlPC9pPiwgPGk+ZGlyPC9pPiBvcgorICAgICAgPGk+Ym90aDwvaT4uIElmIHNldCB0byA8aT5maWxlPC9pPiwgb25seSB0aGUgb3duZXIgb2YKKyAgICAgIHBsYWluIGZpbGVzIGFyZSBnb2luZyB0byBiZSBjaGFuZ2VkLiBJZiBzZXQgdG8gPGk+ZGlyPC9pPiwgb25seQorICAgICAgdGhlIGRpcmVjdG9yaWVzIGFyZSBjb25zaWRlcmVkLjxicj4KKyAgICAgIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIHR5cGUgYXR0cmlidXRlIGRvZXMgbm90IGFwcGx5IHRvCisgICAgICBuZXN0ZWQgPGk+ZGlyc2V0PC9pPnMgLSA8aT5kaXJzZXQ8L2k+cyBhbHdheXMgaW1wbGljaXRseQorICAgICAgYXNzdW1lIHR5cGUgdG8gYmUgPGk+ZGlyPC9pPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmlsZTwvaT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYXhwYXJhbGxlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5MaW1pdCB0aGUgYW1vdW50IG9mIHBhcmFsbGVsaXNtIGJ5IHBhc3NpbmcgYXQKKyAgICAgIG1vc3QgdGhpcyBtYW55IHNvdXJjZWZpbGVzIGF0IG9uY2UuICBTZXQgaXQgdG8gJmx0Oz0gMCBmb3IKKyAgICAgIHVubGltaXRlZC4gIERlZmF1bHRzIHRvIHVubGltaXRlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorCisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBwcmludCBhIHN1bW1hcnkgYWZ0ZXIgZXhlY3V0aW9uIG9yIG5vdC4KKyAgICAgIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorCis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y2hvd24gZmlsZT0iJHtkaXN0fS9zdGFydC5zaCIgb3duZXI9ImNvZGVyam9lIi8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPm1ha2VzIHRoZSAic3RhcnQuc2giIGZpbGUgYmVsb25nIHRvIGNvZGVyam9lIG9uIGEKK1VOSVggc3lzdGVtLjwvcD4KKzxibG9ja3F1b3RlPgorPHByZT4KKyAgICAmbHQ7Y2hvd24gb3duZXI9ImNvZGVyam9lIiZndDsKKyAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtkaXN0fS9iaW4iIGluY2x1ZGVzPSIqKi8qLnNoIi8mZ3Q7CisgICAgJmx0Oy9jaG93biZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+bWFrZXMgYWxsICIuc2giIGZpbGVzIGJlbG93IDxjb2RlPiR7ZGlzdH0vYmluPC9jb2RlPgorYmVsb25nIHRvIGNvZGVyam9lIG9uIGEgVU5JWCBzeXN0ZW0uPC9wPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2Nob3duIG93bmVyPSJjb2RlcmpvZSImZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0ic2hhcmVkL3NvdXJjZXMxIiZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSIqKi90cmlhbC8qKiIvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDtmaWxlc2V0IHJlZmlkPSJvdGhlci5zaGFyZWQuc291cmNlcyIvJmd0OworJmx0Oy9jaG93biZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+bWFrZXMgYWxsIGZpbGVzIGJlbG93IDxjb2RlPnNoYXJlZC9zb3VyY2VzMTwvY29kZT4gKGV4Y2VwdCB0aG9zZQorYmVsb3cgYW55IGRpcmVjdG9yeSBuYW1lZCB0cmlhbCkgYmVsb25nIHRvIGNvZGVyam9lIG9uIGEgVU5JWCAKK3N5c3RlbS4gSW4gYWRkaXRpb24gYWxsIGZpbGVzIGJlbG9uZ2luZyB0byBhIEZpbGVTZXQKK3dpdGggPGNvZGU+aWQ8L2NvZGU+IDxjb2RlPm90aGVyLnNoYXJlZC5zb3VyY2VzPC9jb2RlPiBnZXQgdGhlIHNhbWUKK293bmVyLjwvcD4KKworPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2Nob3duIG93bmVyPSJ3ZWJhZG1pbiIgdHlwZT0iZmlsZSImZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0iL3dlYiImZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5jZ2kiLyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLm9sZCIvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDtkaXJzZXQgZGlyPSIvd2ViIiZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi9wcml2YXRlXyoiLyZndDsKKyAgJmx0Oy9kaXJzZXQmZ3Q7CismbHQ7L2NobW9kJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPm1ha2VzIGNnaSBzY3JpcHRzLCBmaWxlcyB3aXRoIGEgPGNvZGU+Lm9sZDwvY29kZT4gZXh0ZW5zaW9uIG9yCitkaXJlY3RvcmllcyBiZWdpbm5pbmcgd2l0aCA8Y29kZT5wcml2YXRlXzwvY29kZT4gYmVsb25nIHRvIHRoZSB1c2VyIG5hbWVkCit3ZWJhZG1pbi4gQSBkaXJlY3RvcnkgZW5kaW5nIGluIDxjb2RlPi5vbGQ8L2NvZGU+IG9yIGEgZmlsZSBiZWdpbm5pbmcgd2l0aCAKKzxjb2RlPnByaXZhdGVfPC9jb2RlPiB3b3VsZCByZW1haW4gdW5hZmZlY3RlZC48L3A+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvY2xlYXJjYXNlLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2NsZWFyY2FzZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYWI0YTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2NsZWFyY2FzZS5odG1sCkBAIC0wLDAgKzEsOTU4IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKyAgPHRpdGxlPkNsZWFyY2FzZSBUYXNrczwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPkFudCBDbGVhckNhc2UgVGFza3M8L2gxPgorPHA+Ynk6PGJyPgorQ3VydGlzIFdoaXRlIChjd2hpdGUgYXQgYXJhY25ldCBkb3QgY29tKSw8YnI+CitTZWFuIFAuIEthbmUgKHNwa2FuZSBhdCBnZW5vbWF0aWNhIGRvdCBjb20pLDxicj4KK1JvYiBBbmRlcnNvbiAoQW5kZXJzb24uUm9iIGF0IHZlY3RvcnNjbSBkb3QgY29tKSwgYW5kPGJyPgorU2VhbiBFZ2FuICAgIChzZWFuIGF0IGNtLWxvZ2ljIGRvdCBjb20pPC9wPgorCis8cD5WZXJzaW9uIDEuNiAtIDAyLzI1LzIwMDM8L3A+CisKKzxoMT5DbGVhckNhc2UgU3VwcG9ydDwvaDE+Cis8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPgorPHVsPgorICA8bGk+PEEgaHJlZj0iI2ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPgorICA8bGk+PEEgaHJlZj0iI2NjY2hlY2tpbiI+Q0NDaGVja2luPC9hPgorICA8bGk+PEEgaHJlZj0iI2NjY2hlY2tvdXQiPkNDQ2hlY2tvdXQ8L2E+CisgIDxsaT48QSBocmVmPSIjY2N1bmNoZWNrb3V0Ij5DQ1VuQ2hlY2tvdXQ8L2E+CisgIDxsaT48QSBocmVmPSIjY2N1cGRhdGUiPkNDVXBkYXRlPC9hPgorICA8bGk+PEEgaHJlZj0iI2NjbWtsYnR5cGUiPkNDTWtsYnR5cGU8L2E+CisgIDxsaT48QSBocmVmPSIjY2Nta2xhYmVsIj5DQ01rbGFiZWw8L2E+CisgIDxsaT48QSBocmVmPSIjY2NybXR5cGUiPkNDUm10eXBlPC9hPgorICA8bGk+PEEgaHJlZj0iI2NjbG9jayI+Q0NMb2NrPC9hPgorICA8bGk+PEEgaHJlZj0iI2NjdW5sb2NrIj5DQ1VubG9jazwvYT4KKyAgPGxpPjxBIGhyZWY9IiNjY21rYmwiPkNDTWtibDwvYT4KKyAgPGxpPjxBIGhyZWY9IiNjY21rYXR0ciI+Q0NNa2F0dHI8L2E+CisgIDxsaT48QSBocmVmPSIjY2Nta2RpciI+Q0NNa2RpcjwvYT4KKyAgPGxpPjxBIGhyZWY9IiNjY21rZWxlbSI+Q0NNa2VsZW08L2E+PC9saT4KKworPC91bD4KKworPGhyPgorPGgyPjxhIG5hbWU9ImludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvaDI+Cis8cD5BbnQgcHJvdmlkZXMgc2V2ZXJhbCBvcHRpb25hbCB0YXNrcyBmb3Igd29ya2luZyB3aXRoIENsZWFyQ2FzZS4gVGhlc2UgdGFza3MgY29ycmVzcG9uZCB0byB2YXJpb3VzCitDbGVhckNhc2UgY29tbWFuZHMgdXNpbmcgdGhlIENsZWFydG9vbCBwcm9ncmFtLiBUaGUgY3VycmVudCB0YXNrcyBhdmFpbGFibGUgZm9yIEFudCBjb3JyZXNwb25kIHRvIG9ubHkKK2EgZmV3IG9mIHRoZSBzaWduaWZpY2FudCBDbGVhckNhc2UgY29tbWFuZHMuPC9wPgorCis8cD5Nb3JlIHRhc2tzIGNhbiBiZSBlYXNpbHkgYWRkZWQgYnkgZGVyaXZpbmcgZnJvbSB0aGUgQ2xlYXJDYXNlIGNsYXNzIGFuZCB0aGVuIGFkZGluZworZnVuY3Rpb25hbGl0eSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoYXQgQ2xlYXJDYXNlIGNvbW1hbmQuPC9wPgorPHA+CisgICAgSW1wb3J0YW50OiB0aGVzZSB0YXNrcyBhbGwgcmVxdWlyZSA8Y29kZT5jbGVhcnRvb2w8L2NvZGU+IG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgSWYgYSB0YXNrIGZhaWxzIHdpdGggYW4gSU9FeGNlcHRpb24sIGVzcGVjaWFsbHkgZXJyb3IgY29kZSAyIG9uIFdpbmRvd3MsCisgICAgdGhpcyBpcyB5b3VyIHByb2JsZW0uCis8L3A+CisKKworPGhyPgorPGgyPjxhIG5hbWU9ImNjY2hlY2tpbiI+Q0NDaGVja2luPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIGEgImNsZWFydG9vbCBjaGVja2luIiBjb21tYW5kIHRvIENsZWFyQ2FzZS4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICA8dGg+VmFsdWVzPC90aD4KKyAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnZpZXdwYXRoPC90ZD4KKyAgICA8dGQ+UGF0aCB0byB0aGUgQ2xlYXJDYXNlIHZpZXcgZmlsZSBvciBkaXJlY3RvcnkgdGhhdCB0aGUgY29tbWFuZAorICAgICAgICB3aWxsIG9wZXJhdGUgb248L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNvbW1lbnRmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNvbW1lbnRmaWxlCisgICAgICAgIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5ub3dhcm48L3RkPgorICAgIDx0ZD5TdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnByZXNlcnZldGltZTwvdGQ+CisgICAgPHRkPlByZXNlcnZlIHRoZSBtb2RpZmljYXRpb24gdGltZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5rZWVwY29weTwvdGQ+CisgICAgPHRkPktlZXBzIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmlkZW50aWNhbDwvdGQ+CisgICAgPHRkPkFsbG93cyB0aGUgZmlsZSB0byBiZSBjaGVja2VkIGluIGV2ZW4gaWYgaXQgaXMgaWRlbnRpY2FsCisgICAgICAgIHRvIHRoZSBvcmlnaW5hbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2NjY2hlY2tpbiB2aWV3cGF0aD0iYzovdmlld3Mvdmlld2Rpci9hZmlsZSIKKyAgICAgICAgY29tbWVudGZpbGU9ImFjb21tZW50LnR4dCIKKyAgICAgICAgbm93YXJuPSJ0cnVlIgorICAgICAgICBpZGVudGljYWw9InRydWUiLyZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+RG9lcyBhIENsZWFyQ2FzZSA8aT5jaGVja2luPC9pPiBvbiB0aGUgZmlsZSA8aT5jOi92aWV3cy92aWV3ZGlyL2FmaWxlPC9pPi4KK0NvbW1lbnQgdGV4dCBmcm9tIHRoZSBmaWxlIDxpPmFjb21tZW50LnR4dDwvaT4gaXMgYWRkZWQgdG8gQ2xlYXJDYXNlIGFzIGEgY29tbWVudC4KK0FsbCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkLiBUaGUgZmlsZSBpcyBjaGVja2VkIGluIGV2ZW4gaWYgaXQgaXMKKzxpPmlkZW50aWNhbDwvaT4gdG8gdGhlIG9yaWdpbmFsLjwvcD4KKzxocj4KKzxoMj48YSBuYW1lPSJjY2NoZWNrb3V0Ij5DQ0NoZWNrb3V0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIGEgImNsZWFydG9vbCBjaGVja291dCIgY29tbWFuZCB0byBDbGVhckNhc2UuCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQKKyAgICAgICAgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnJlc2VydmVkPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gY2hlY2sgb3V0IHRoZSBmaWxlIGFzIHJlc2VydmVkIG9yIG5vdDwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+b3V0PC90ZD4KKyAgICA8dGQ+Q3JlYXRlcyBhIHdyaXRhYmxlIGZpbGUgdW5kZXIgYSBkaWZmZXJlbnQgZmlsZW5hbWU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bm9kYXRhPC90ZD4KKyAgICA8dGQ+Q2hlY2tzIG91dCB0aGUgZmlsZSBidXQgZG9lcyBub3QgY3JlYXRlIGFuIGVkaXRhYmxlIGZpbGUKKyAgICAgICAgY29udGFpbmluZyBpdHMgZGF0YTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5icmFuY2g8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IGEgYnJhbmNoIHRvIGNoZWNrIG91dCB0aGUgZmlsZSB0bzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICA8dGQ+QWxsb3dzIGNoZWNrb3V0IG9mIGEgdmVyc2lvbiBvdGhlciB0aGFuIG1haW4gbGF0ZXN0PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm5vd2FybjwvdGQ+CisgICAgPHRkPlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXM8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNvbW1lbnRmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yCisgICAgICAgIGNvbW1lbnRmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5ub3RjbzwvdGQ+CisgICAgPHRkPkZhaWwgaWYgaXQncyBhbHJlYWR5IGNoZWNrZWQgb3V0IHRvIHRoZSBjdXJyZW50IHZpZXcuIFNldCB0byBmYWxzZSB0byBpZ25vcmUgaXQuPGJyPgorICAgIFNpbmNlIGFudCAxLjYuMTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZS48YnI+CisgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7Y2NjaGVja291dCB2aWV3cGF0aD0iYzovdmlld3Mvdmlld2Rpci9hZmlsZSIKKyAgICAgICAgcmVzZXJ2ZWQ9InRydWUiCisgICAgICAgIGJyYW5jaD0iYWJyYW5jaCIKKyAgICAgICAgbm93YXJuPSJ0cnVlIgorICAgICAgICBjb21tZW50PSJTb21lIGNvbW1lbnQgdGV4dCIvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPmNoZWNrb3V0PC9pPiBvbiB0aGUgZmlsZSA8aT5jOi92aWV3cy92aWV3ZGlyL2FmaWxlPC9pPi4KK0l0IGlzIGNoZWNrZWQgb3V0IGFzIDxpPnJlc2VydmVkPC9pPiBvbiBicmFuY2ggY2FsbGVkIDxpPmFicmFuY2g8L2k+LiBBbGwKK3dhcm5pbmcgbWVzc2FnZXMgYXJlIHN1cHByZXNzZWQuIEEgPGk+U29tZSBjb21tZW50IHRleHQ8L2k+IGlzIGFkZGVkIHRvCitDbGVhckNhc2UgYXMgYSBjb21tZW50LjwvcD4KKzxocj4KKzxoMj48YSBuYW1lPSJjY3VuY2hlY2tvdXQiPkNDVW5DaGVja291dDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1Rhc2sgdG8gcGVyZm9ybSBhIFVuQ2hlY2tvdXQgY29tbWFuZCB0byBDbGVhckNhc2UuCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQKKyAgICAgICAgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmtlZXBjb3B5PC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8ga2VlcCBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwCisgICAgICAgIGV4dGVuc2lvbiBvciBub3Q8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWU8YnI+CisgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7Y2N1bmNoZWNrb3V0IHZpZXdwYXRoPSJjOi92aWV3cy92aWV3ZGlyL2FmaWxlIgorICAgICAgICBrZWVwY29weT0idHJ1ZSIvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPnVuY2hlY2tvdXQ8L2k+IG9uIHRoZSBmaWxlIDxpPmM6L3ZpZXdzL3ZpZXdkaXIvYWZpbGU8L2k+LgorQSBjb3B5IG9mIHRoZSBmaWxlIGNhbGxlZCA8aT5jOi92aWV3cy92aWV3ZGlyL2FmaWxlLmtlZXA8L2k+IGlzIGtlcHQuPC9wPgorPGhyPgorPGgyPjxhIG5hbWU9ImNjdXBkYXRlIj5DQ1VwZGF0ZTwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1Rhc2sgdG8gcGVyZm9ybSBhbiAiY2xlYXJ0b29sIHVwZGF0ZSIgY29tbWFuZCB0byBDbGVhckNhc2UuCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSBzbmFwc2hvdCB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQKKyAgICAgICAgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmdyYXBoaWNhbDwvdGQ+CisgICAgPHRkPkRpc3BsYXlzIGEgZ3JhcGhpY2FsIGRpYWxvZyBkdXJpbmcgdGhlIHVwZGF0ZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5sb2c8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgYSBsb2cgZmlsZSBmb3IgQ2xlYXJDYXNlIHRvIHdyaXRlIHRvPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm92ZXJ3cml0ZTwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIG92ZXJ3cml0ZSBoaWphY2tlZCBmaWxlcyBvciBub3Q8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVuYW1lPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoYXQgaGlqYWNrZWQgZmlsZXMgc2hvdWxkIGJlIHJlbmFtZWQgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jdXJyZW50dGltZTwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGF0IG1vZGlmaWNhdGlvbiB0aW1lIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZQorICAgICAgICBjdXJyZW50IHRpbWUuIEVpdGhlciBjdXJyZW50dGltZSBvciBwcmVzZXJ2ZXRpbWUgY2FuIGJlCisgICAgICAgIHNwZWNpZmllZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cHJlc2VydmV0aW1lPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoYXQgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIHByZXNlcnZlZCBmcm9tIHRoZQorICAgICAgICBWT0IgdGltZS4gRWl0aGVyIGN1cnJlbnR0aW1lIG9yIHByZXNlcnZldGltZSBjYW4gYmUKKyAgICAgICAgc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZS48YnI+CisgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7Y2N1cGRhdGUgdmlld3BhdGg9ImM6L3ZpZXdzL3ZpZXdkaXIiCisgICAgICAgIGdyYXBoaWNhbD0iZmFsc2UiCisgICAgICAgIGxvZz0ibG9nLmxvZyIKKyAgICAgICAgb3ZlcndyaXRlPSJ0cnVlIgorICAgICAgICBjdXJyZW50dGltZT0idHJ1ZSIKKyAgICAgICAgcmVuYW1lPSJmYWxzZSIvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPnVwZGF0ZTwvaT4gb24gdGhlIHNuYXBzaG90IHZpZXcgZGlyZWN0b3J5IDxpPmM6L3ZpZXdzL3ZpZXdkaXI8L2k+LgorQSBncmFwaGljYWwgZGlhbG9nIHdpbGwgYmUgZGlzcGxheWVkLiBUaGUgb3V0cHV0IHdpbGwgYmUgbG9nZ2VkIHRvCis8aT5sb2cubG9nPC9pPiBhbmQgaXQgd2lsbCBvdmVyd3JpdGUgYW55IGhpamFja2VkIGZpbGVzLiBUaGUgbW9kaWZpZWQKK3RpbWUgd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnQgdGltZS48L3A+CisKKworCis8aHI+Cis8aDI+PGEgbmFtZT0iY2Nta2xidHlwZSI+Q0NNa2xidHlwZTwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1Rhc2sgdG8gcGVyZm9ybSBhICJta2xidHlwZSIgY29tbWFuZCB0byBDbGVhckNhc2UuCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD50eXBlbmFtZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIGxhYmVsIHR5cGUgdG8gY3JlYXRlPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPnZvYjwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIFZPQjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPnJlcGxhY2U8L3RkPgorICAgIDx0ZD5SZXBsYWNlIGFuIGV4aXN0aW5nIGxhYmVsIGRlZmluaXRpb24gb2YgdGhlIHNhbWUgdHlwZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPmdsb2JhbDwvdGQ+CisgICAgPHRkPkVpdGhlciBnbG9iYWwgb3Igb3JkaW5hcnkgY2FuIGJlIHNwZWNpZmllZCwgbm90IGJvdGguIENyZWF0ZXMgYSBsYWJlbCB0eXBlIHRoYXQgaXMgZ2xvYmFsIHRvIHRoZSBWT0Igb3IgdG8gVk9CcyB0aGF0IHVzZSB0aGlzIFZPQjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPm9yZGluYXJ5PC90ZD4KKyAgICA8dGQ+RWl0aGVyIGdsb2JhbCBvciBvcmRpbmFyeSBjYW4gYmUgc3BlY2lmaWVkLCBub3QgYm90aC4gQ3JlYXRlcyBhIGxhYmVsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCBvbmx5IGluIHRoZSBjdXJyZW50IFZPQi4gPEI+RGVmYXVsdDwvQj48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDx0cj4KKyAgPHRyPgorICAgIDx0ZD5wYnJhbmNoPC90ZD4KKyAgICA8dGQ+QWxsb3dzIHRoZSBsYWJlbCB0eXBlIHRvIGJlIHVzZWQgb25jZSBwZXIgYnJhbmNoIGluIGEgZ2l2ZW4gZWxlbWVudCdzIHZlcnNpb24gdHJlZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPnNoYXJlZDwvdGQ+CisgICAgPHRkPlNldHMgdGhlIHdheSBtYXN0ZXJzaGlwIGlzIGNoZWNrZWQgYnkgQ2xlYXJDYXNlLiBTZWUgQ2xlYXJDYXNlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHM8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDx0cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8dHI+CisgIDx0cj4KKyAgICA8dGQ+Y29tbWVudGZpbGU8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDx0cj48L3RyPgorICA8dHI+CisgICAgPHRkPmZhaWxvbmVycjwvdGQ+CisgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlPGJyPgorICAgIFNpbmNlIGFudCAxLjYuMTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7Y2Nta2xidHlwZSB0eXBlbmFtZT0iVkVSU0lPTl8xIgorICAgICAgICBvcmRpbmFyeT0idHJ1ZSIKKyAgICAgICAgY29tbWVudD0iRGV2ZWxvcG1lbnQgdmVyc2lvbiAxIi8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPkRvZXMgYSBDbGVhckNhc2UgPGk+bWtsYnR5cGU8L2k+IHRvIGNyZWF0ZSBhIGxhYmVsIHR5cGUgbmFtZWQgPGk+VkVSU0lPTl8xPC9pPi4KK0l0IGlzIGNyZWF0ZWQgYXMgPGk+b3JkaW5hcnk8L2k+IHNvIGl0IGlzIGF2YWlsYWJsZSBvbmx5IHRvIHRoZSBjdXJyZW50IFZPQi4KK1RoZSB0ZXh0IDxpPkRldmVsb3BtZW50IHZlcnNpb24gMTwvaT4gaXMgYWRkZWQgYXMgYSBjb21tZW50LjwvcD4KKworCis8aHI+Cis8aDI+PGEgbmFtZT0iY2Nta2xhYmVsIj5DQ01rbGFiZWw8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CitUYXNrIHRvIHBlcmZvcm0gYSAibWtsYWJlbCIgY29tbWFuZCB0byBDbGVhckNhc2UuCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD50eXBlbmFtZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIGxhYmVsIHR5cGU8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8dHI+CisgIDx0cj4KKyAgICA8dGQ+dmlld3BhdGg8L3RkPgorICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPnJlcGxhY2U8L3RkPgorICAgIDx0ZD5SZXBsYWNlIGEgbGFiZWwgb2YgdGhlIHNhbWUgdHlwZSBvbiB0aGUgc2FtZSBicmFuY2g8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDx0cj4KKyAgPHRyPgorICAgIDx0ZD5yZWN1cnNlPC90ZD4KKyAgICA8dGQ+UHJvY2VzcyBlYWNoIHN1YmRpcmVjdG9yeSB1bmRlciB2aWV3cGF0aDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPnZlcnNpb248L3RkPgorICAgIDx0ZD5JZGVudGlmeSBhIHNwZWNpZmljIHZlcnNpb24gdG8gYXR0YWNoIHRoZSBsYWJlbCB0bzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPnZvYjwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIFZPQjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDx0cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPjwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWU8YnI+CisgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPgorPHByZT4KKyZsdDtjY21rbGFiZWwgdmlld3BhdGg9ImM6L3ZpZXdzL3ZpZXdkaXIvYWZpbGUiCisgICAgICAgIGNvbW1lbnQ9IlNvbWUgY29tbWVudCB0ZXh0IgorICAgICAgICByZWN1cnNlPSJ0cnVlIgorICAgICAgICB2ZXJzaW9uPSJcbWFpblwyIgorICAgICAgICB0eXBlbmFtZT0iVkVSU0lPTl8xIi8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPkRvZXMgYSBDbGVhckNhc2UgPGk+bWtsYWJlbDwvaT4gb24gdGhlIGZpbGUgPGk+Yzovdmlld3Mvdmlld2Rpci9hZmlsZTwvaT4gdW5kZXIKK3RoZSBtYWluIGJyYW5jaCBmb3IgdmVyc2lvbiAyICg8aT5cbWFpblwyPC9pPikuIFRleHQgPGk+U29tZSBjb21tZW50IHRleHQ8L2k+IGlzIGFkZGVkCithcyBhIGNvbW1lbnQuIEl0IHdpbGwgPGk+cmVjdXJzZTwvaT4gYWxsIHN1YmRpcmVjdG9yaWVzLgorCisKKzxocj4KKzxoMj48YSBuYW1lPSJjY3JtdHlwZSI+Q0NSbXR5cGU8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CitUYXNrIHRvIHBlcmZvcm0gYSAicm10eXBlIiBjb21tYW5kIHRvIENsZWFyQ2FzZS4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICA8dGg+VmFsdWVzPC90aD4KKyAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnR5cGVraW5kPC90ZD4KKyAgICA8dGQ+VGhlIGtpbmQgb2YgdHlwZSB0byBjcmVhdGUuIFZhbGlkIHR5cGVzIGFyZToKKyAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI0MCUiPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHdpZHRoPSIxNSUiPiA8L3RkPgorICAgICAgICAgIDx0ZD48Yj5hdHR5cGU8L2I+PGJyPgorICAgICAgICAgICAgICA8Yj5icnR5cGU8L2I+PGJyPgorICAgICAgICAgICAgICA8Yj5lbHR5cGU8L2I+PGJyPgorICAgICAgICAgICAgICA8Yj5obHR5cGU8L2I+PGJyPgorICAgICAgICAgICAgICA8Yj5sYnR5cGU8L2I+PGJyPgorICAgICAgICAgICAgICA8Yj50cnR5cGU8L2I+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+LSA8YnI+CisgICAgICAgICAgICAgIC0gPGJyPgorICAgICAgICAgICAgICAtIDxicj4KKyAgICAgICAgICAgICAgLSA8YnI+CisgICAgICAgICAgICAgIC0gPGJyPgorICAgICAgICAgICAgICAtCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+YXR0cmlidXRlIHR5cGU8YnI+CisgICAgICAgICAgICAgIGJyYW5jaCB0eXBlPGJyPgorICAgICAgICAgICAgICBlbGVtZW50IHR5cGU8YnI+CisgICAgICAgICAgICAgIGh5cGVybGluayB0eXBlPGJyPgorICAgICAgICAgICAgICBsYWJlbCB0eXBlPGJyPgorICAgICAgICAgICAgICB0cmlnZ2VyIHR5cGUKKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KKyAgICA8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8dHI+CisgIDx0cj4KKyAgICA8dGQ+dHlwZW5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgdHlwZSB0byByZW1vdmU8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8dHI+CisgIDx0cj4KKyAgICA8dGQ+aWdub3JlPC90ZD4KKyAgICA8dGQ+VXNlZCB3aXRoIHRyaWdnZXIgdHlwZXMgb25seS4gRm9yY2VzIHJlbW92YWwgb2YgdHJpZ2dlciB0eXBlIGV2ZW4gaWYgYSBwcmUtb3BlcmF0aW9uIHRyaWdnZXIgd291bGQgcHJldmVudCBpdHMgcmVtb3ZhbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPnJtYWxsPC90ZD4KKyAgICA8dGQ+UmVtb3ZlcyBhbGwgaW5zdGFuY2VzIG9mIGEgdHlwZSBhbmQgdGhlIHR5cGUgb2JqZWN0IGl0c2VsZjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPgorICA8dHI+CisgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDx0cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPHRyPjwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWUKKyAgICBTaW5jZSBhbnQgMS42LjE8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2Njcm10eXBlIHR5cGVraW5kPSJsYnR5cGUiCisgICAgICAgIHR5cGVuYW1lPSJWRVJTSU9OXzEiCisgICAgICAgIGNvbW1lbnRmaWxlPSJhY29tbWVudC50eHQiCisgICAgICAgIHJtYWxsPSJ0cnVlIi8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPkRvZXMgYSBDbGVhckNhc2UgPGk+cm10eXBlPC9pPiB0byByZW1vdmUgYSBsYWJlbCB0eXBlICg8aT5sYnR5cGU8L2k+KSBuYW1lZCA8aT5WRVJTSU9OXzE8L2k+LgorQ29tbWVudCB0ZXh0IGZyb20gdGhlIGZpbGUgPGk+YWNvbW1lbnQudHh0PC9pPiBpcyBhZGRlZCBhcyBhIGNvbW1lbnQuIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHR5cGUKK2FyZSByZW1vdmVkLCBpbmNsdWRpbmcgdGhlIHR5cGUgb2JqZWN0IGl0c2VsZi48L3A+Cis8aHI+CisKKzxoMj48YSBuYW1lPSJjY2xvY2siPkNDTG9jazwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1Rhc2sgdG8gcGVyZm9ybSBhICJjbGVhcnRvb2wgbG9jayIgY29tbWFuZCB0byBDbGVhckNhc2UuCis8aDM+UGFyYW1ldGVyczwvaDM+CisgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgIDx0cj4KKyAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5yZXBsYWNlPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZpZXMgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIGxvY2s8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5udXNlcnM8L3RkPgorICAgICAgPHRkPlNwZWNpZmllcyB1c2VyKHMpIHdobyBjYW4gc3RpbGwgbW9kaWZ5IHRoZSBvYmplY3Q8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5vYnNvbGV0ZTwvdGQ+CisgICAgICA8dGQ+U3BlY2lmaWVzIHRoYXQgdGhlIG9iamVjdCBzaG91bGQgYmUgbWFya2VkIG9ic29sZXRlPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgICA8dGQ+U3BlY2lmaWVzIGhvdyB0byBwb3B1bGF0ZSBjb21tZW50cyBmaWVsZHM8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5wbmFtZTwvdGQ+CisgICAgICA8dGQ+U3BlY2lmaWVzIHRoZSBvYmplY3QgcGF0aG5hbWUgdG8gYmUgbG9ja2VkLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgICAgPHRkPm9ianNlbGVjdDwvdGQ+CisgICAgICA8dGQ+VGhpcyB2YXJpYWJsZSBpcyBvYnNvbGV0ZS4gU2hvdWxkIHVzZSA8aT5vYmpzZWw8L2k+IGluc3RlYWQuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+b2Jqc2VsPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG9iamVjdChzKSB0byBiZSBsb2NrZWQuPGJyPgorICAgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWUuPGJyPgorICAgIFNpbmNlIGFudCAxLjYuMTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKworIDwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2NjbG9jaworICAgIG9ianNlbD0ic3RyZWFtOkFwcGxpY2F0aW9uX0ludGVncmF0aW9uQFxNeVByb2plY3RfUFZPQiIKKyAgICAvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPmxvY2s8L2k+IG9uIHRoZSBvYmplY3QgPGk+c3RyZWFtOkFwcGxpY2F0aW9uX0ludGVncmF0aW9uQFxNeVByb2plY3RfUFZPQjwvaT4uPC9wPgorPGhyPgorCis8aDI+PGEgbmFtZT0iY2N1bmxvY2siPkNDVW5sb2NrPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIGEgImNsZWFydG9vbCB1bmxvY2siIGNvbW1hbmQgdG8gQ2xlYXJDYXNlLgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgIDx0cj4KKyAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZpZXMgaG93IHRvIHBvcHVsYXRlIGNvbW1lbnRzIGZpZWxkczwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPnBuYW1lPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG9iamVjdCBwYXRobmFtZSB0byBiZSB1bmxvY2tlZC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyAgICAgIDx0ZD5vYmpzZWxlY3Q8L3RkPgorICAgICAgPHRkPlRoaXMgdmFyaWFibGUgaXMgb2Jzb2xldGUuIFNob3VsZCB1c2UgPGk+b2Jqc2VsPC9pPiBpbnN0ZWFkLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPm9ianNlbDwvdGQ+CisgICAgICA8dGQ+U3BlY2lmaWVzIHRoZSBvYmplY3QocykgdG8gYmUgdW5sb2NrZWQuPGJyPgorICAgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWUuPGJyPgorICAgIFNpbmNlIGFudCAxLjYuMTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKworIDwvdGFibGU+CisgPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPgorPHByZT4KKyZsdDtjY3VubG9jaworICAgIG9ianNlbD0ic3RyZWFtOkFwcGxpY2F0aW9uX0ludGVncmF0aW9uQFxNeVByb2plY3RfUFZPQiIKKyAgICAvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPnVubG9jazwvaT4gb24gdGhlIG9iamVjdCA8aT5zdHJlYW06QXBwbGljYXRpb25fSW50ZWdyYXRpb25AXE15UHJvamVjdF9QVk9CPC9pPi48L3A+Cis8aHI+CisKKzxoMj48YSBuYW1lPSJjY21rYmwiPkNDTWtibDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1Rhc2sgdG8gcGVyZm9ybSBhICJjbGVhcnRvb2wgbWtibCIgY29tbWFuZCB0byBDbGVhckNhc2UuCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgPHRyPgorICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZQordXNlZC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+Y29tbWVudGZpbGU8L3RkPgorICAgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yCitjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+YmFzZWxpbmVyb290bmFtZTwvdGQ+CisgICAgICA8dGQ+U3BlY2lmeSB0aGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhc2VsaW5lLjwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+bm93YXJuPC90ZD4KKyAgICAgIDx0ZD5TdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+aWRlbnRpY2FsPC90ZD4KKyAgICAgIDx0ZD5BbGxvd3MgdGhlIGJhc2VsaW5lIHRvIGJlIGNyZWF0ZWQgZXZlbiBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlCitwcmV2aW91cyBiYXNlbGluZS48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+ZnVsbDwvdGQ+CisgICAgICA8dGQ+Q3JlYXRlcyBhIGZ1bGwgYmFzZWxpbmUuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPm5sYWJlbDwvdGQ+CisgICAgICA8dGQ+QWxsb3dzIHRoZSBiYXNlbGluZSB0byBiZSBjcmVhdGVkIHdpdGhvdXQgYSBsYWJlbC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWUuPGJyPgorICAgIFNpbmNlIGFudCAxLjYuMTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyA8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPgorPHByZT4KKyZsdDtjY21rYmwKKyAgICBiYXNlbGluZXJvb3RuYW1lPSJBcHBsaWNhdGlvbl9CYXNlbGluZV9BVVRPIgorICAgIGlkZW50aWNhbD0ieWVzIgorICAgIGZ1bGw9Im5vIgorICAgIHZpZXdwYXRoPSJ2OlxBcHBsaWNhdGlvbkNDIgorICAgIC8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPkRvZXMgYSBDbGVhckNhc2UgPGk+bWtibDwvaT4gb24gdGhlIEludGVncmF0aW9uIHZpZXcgYXQgPGk+djpcQXBwbGljYXRpb25DQzwvaT4KK2V2ZW4gaWYgaXQgaXMgPGk+aWRlbnRpY2FsPC9pPiB0byBhIHByZXZpb3VzIGJhc2VsaW5lLiBUaGUgbmV3IGJhc2VsaW5lIHdpdGggYmUKK2luY3JlbWVudGFsIGFuZCBuYW1lZCAiQXBwbGljYXRpb25fQmFzZWxpbmVfQVVUTyIuPC9wPgorPGhyPgorCis8aDI+PGEgbmFtZT0iY2Nta2F0dHIiPkNDTWthdHRyPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIGEgJnF1b3Q7Y2xlYXJ0b29sIG1rYXR0ciZxdW90OyBjb21tYW5kIHRvIENsZWFyQ2FzZS48YnI+CitTaW5jZSBhbnQgMS42LjEKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICA8dHI+CisgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgICA8dGg+VmFsdWVzPC90aD4KKyAgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+dmlld3BhdGg8L3RkPgorICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5yZXBsYWNlPC90ZD4KKyAgICAgIDx0ZD5SZXBsYWNlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlmIGl0IGFscmVhZHkgZXhpc3RzPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPnJlY3Vyc2U8L3RkPgorICAgICAgPHRkPlByb2Nlc3MgZWFjaCBzdWJkaXJlY3RvcnkgdW5kZXIgdmlld3BhdGg8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+dmVyc2lvbjwvdGQ+CisgICAgICA8dGQ+SWRlbnRpZnkgYSBzcGVjaWZpYyB2ZXJzaW9uIHRvIGF0dGFjaCB0aGUgYXR0cmlidXRlIHRvPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPnR5cGVuYW1lPC90ZD4KKyAgICAgIDx0ZD5OYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZTwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+dHlwZXZhbHVlPC90ZD4KKyAgICAgIDx0ZD5WYWx1ZSB0byBhdHRhY2ggdG8gdGhlIGF0dHJpYnV0ZSB0eXBlPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+Y29tbWVudGZpbGU8L3RkPgorICAgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICAgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorIDwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2NjbWthdHRyIHZpZXdwYXRoPSZxdW90O2M6L3ZpZXdzL3ZpZXdkaXIvYWZpbGUmcXVvdDsKKyAgICB0eXBlbmFtZT0mcXVvdDtCdWdGaXgmcXVvdDsKKyAgICB0eXBldmFsdWU9JnF1b3Q7MzQ0NDUmcXVvdDsKKyAgICAvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPm1rYXR0cjwvaT4gb24gdGhlIGZpbGUgPGk+Yzovdmlld3Mvdmlld2Rpci9hZmlsZTwvaT4gYW5kCithdHRhY2hlcyB0aGUgYXR0cmlidXRlIDxpPkJ1Z0ZpeDwvaT4gd2l0aCBhIHZhbHVlIG9mIDxpPjM0NDQ1PC9pPiB0byBpdC48L3A+Cis8aHI+CisKKzxoMj48YSBuYW1lPSJjY21rZGlyIj5DQ01rZGlyPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIGEgJnF1b3Q7Y2xlYXJ0b29sIG1rZGlyJnF1b3Q7IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLjxicj4KK1NpbmNlIGFudCAxLjYuMQorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgIDx0cj4KKyAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgICAgICA8dGQ+UGF0aCB0byB0aGUgQ2xlYXJDYXNlIHZpZXcgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+Y29tbWVudGZpbGU8L3RkPgorICAgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5ub2NoZWNrb3V0PC90ZD4KKyAgICAgIDx0ZD5EbyBub3QgY2hlY2tvdXQgYWZ0ZXIgZWxlbWVudCBjcmVhdGlvbjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICAgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorIDwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2NjbWtkaXIgdmlld3BhdGg9JnF1b3Q7Yzovdmlld3Mvdmlld2Rpci9hZGlyJnF1b3Q7CisgICAgICAgIG5vY2hjZWtvdXQ9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICBjb21tZW50PSZxdW90O1NvbWUgY29tbWVudCB0ZXh0JnF1b3Q7LyZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+RG9lcyBhIENsZWFyQ2FzZSA8aT5ta2RpcjwvaT4gb24gdGhlIGRpciA8aT5jOi92aWV3cy92aWV3ZGlyL2FkaXI8L2k+IGFuZAorZG9lcyBub3QgYXV0b21hdGljYWxseSBjaGVjayBpdCBvdXQuPC9wPgorPGhyPgorCis8aDI+PGEgbmFtZT0iY2Nta2VsZW0iPkNDTWtlbGVtPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIGEgJnF1b3Q7Y2xlYXJ0b29sIG1rZWxlbSZxdW90OyBjb21tYW5kIHRvIENsZWFyQ2FzZS48YnI+CitTaW5jZSBhbnQgMS42LjEKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICA8dHI+CisgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgICA8dGg+VmFsdWVzPC90aD4KKyAgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+dmlld3BhdGg8L3RkPgorICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5ub3dhcm48L3RkPgorICAgICAgPHRkPlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXM8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5ub2NoZWNrb3V0PC90ZD4KKyAgICAgIDx0ZD5EbyBub3QgY2hlY2tvdXQgYWZ0ZXIgZWxlbWVudCBjcmVhdGlvbjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPmNoZWNraW48L3RkPgorICAgICAgPHRkPkNoZWNraW4gZWxlbWVudCBhZnRlciBjcmVhdGlvbjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPnByZXNlcnZldGltZTwvdGQ+CisgICAgICA8dGQ+UHJlc2VydmUgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIChmb3IgY2hlY2tpbik8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5tYXN0ZXI8L3RkPgorICAgICAgPHRkPkFzc2lnbiBtYXN0ZXJzaGlwIG9mIHRoZSBtYWluIGJyYW5jaCB0byB0aGUgY3VycmVudCBzaXRlPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+ZWx0eXBlPC90ZD4KKyAgICAgIDx0ZD5FbGVtZW50IHR5cGUgdG8gdXNlIGR1cmluZyBlbGVtZW50IGNyZWF0aW9uPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAgICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorIDwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2NjbWtlbGVtIHZpZXdwYXRoPSZxdW90O2M6L3ZpZXdzL3ZpZXdkaXIvYWZpbGUmcXVvdDsKKyAgICAgICAgZWx0eXBlPSZxdW90O3RleHRfZmlsZSZxdW90OworICAgICAgICBjaGVja2luPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgY29tbWVudD0mcXVvdDtTb21lIGNvbW1lbnQgdGV4dCZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPkRvZXMgYSBDbGVhckNhc2UgPGk+bWtlbGVtPC9pPiBvbiB0aGUgZmlsZSA8aT5jOi92aWV3cy92aWV3ZGlyL2FmaWxlPC9pPiB3aXRoCitlbGVtZW50IHR5cGUgPGk+dGV4dF9maWxlPC9pPi4gSXQgYWxzbyBjaGVja3MgaW4gdGhlIGZpbGUgYWZ0ZXIgY3JlYXRpb24uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2NzYy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9jc2MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTVlZDkxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9jc2MuaHRtbApAQCAtMCwwICsxLDQ5NCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgIAorPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8dGl0bGU+Q3NjCisgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiM1MjVENzYiCisgICAgICBhbGluaz0iIzUyNUQ3NiIgdmxpbms9IiM1MjVENzYiPgorCis8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjQiPgorCisgIDwhLS0gUEFHRSBIRUFERVIgLS0+CisgIDx0cj4KKyAgICA8dGQ+CisgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICA8Zm9udCBzaXplPSIrMyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48c3Ryb25nPkNzYworIFRhc2s8L3N0cm9uZz48L2ZvbnQ+CisgICAgICAgICAgICA8YnI+PGZvbnQgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5Db21waWxlcyBDIyBzb3VyY2UgaW50byBleGVjdXRhYmxlcyBvciBtb2R1bGVzLjwvZm9udD4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDwhLS0gUFJPSkVDVCBMT0dPIC0tPgorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+CisgICAgICAgICAgICAgIDxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmIiBhbGlnbj0icmlnaHQiIGFsdD0iQXBhY2hlIEFudCIgYm9yZGVyPSIwIj4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICA8L3RkPgorICAgICAgPC90cj48L3RhYmxlPgorICAgIDwvdGQ+CisgIDwvdHI+CisKKyAgPCEtLSBTVEFSVCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KKyAgPHRyPgorICAgIDx0ZCAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKworICAgICAgICAgIDwhLS0gQXBwbHlpbmcgdGFzay9sb25nLWRlc2NyaXB0aW9uIC0tPgorICAgIDwhLS0gU3RhcnQgRGVzY3JpcHRpb24gLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0iZGVzY3JpcHRpb24iPgorICAgICAgICAgIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBDb21waWxlcyBDIyBzb3VyY2UgaW50byBleGVjdXRhYmxlcyBvciBtb2R1bGVzLiBjc2MuZXhlIG9uIFdpbmRvd3Mgb3IgbWNzIG9uIGFueSBvdGhlciBwbGF0Zm9ybSBtdXN0IGJlIG9uIHRoZSBleGVjdXRlIHBhdGgsIHVubGVzcyBhbm90aGVyIGV4ZWN1dGFibGUgb3IgdGhlIGZ1bGwgcGF0aCB0byB0aGF0IGV4ZWN1dGFibGUgaXMgc3BlY2lmaWVkIGluIHRoZSA8dHQ+ZXhlY3V0YWJsZTwvdHQ+IHBhcmFtZXRlciA8cD4gQWxsIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsOiA8Y29kZT4mbHQ7Y3NjLyZndDs8L2NvZGU+IHNob3VsZCBzdWZmaWNlIHRvIHByb2R1Y2UgYSBkZWJ1ZyBidWlsZCBvZiBhbGwgKi5jcyBmaWxlcy4gSG93ZXZlciwgbmFtaW5nIGFuIDx0dD5kZXN0RmlsZTwvdHQ+c3RvcHMgdGhlIGNzYyBjb21waWxlciBmcm9tIGNob29zaW5nIGFuIG91dHB1dCBuYW1lIGZyb20gcmFuZG9tLCBhbmQgYWxsb3dzIHRoZSBkZXBlbmRlbmN5IGNoZWNrZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaWxlIGlzIG91dCBvZiBkYXRlLiA8cD4gVGhlIHRhc2sgaXMgYSBkaXJlY3RvcnkgYmFzZWQgdGFzaywgc28gYXR0cmlidXRlcyBsaWtlIDxiPmluY2x1ZGVzPSIqLmNzIiA8L2I+IGFuZCA8Yj5leGNsdWRlcz0iYnJva2VuLmNzIjwvYj4gY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgZmlsZXMgcHVsbGVkIGluLiBCeSBkZWZhdWx0LCBhbGwgKi5jcyBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0IGZvbGRlciBkb3duIGFyZSBpbmNsdWRlZCBpbiB0aGUgY29tbWFuZC4gV2hlbiB0aGlzIGhhcHBlbnMgdGhlIG91dHB1dCBmaWxlIC1pZiBub3Qgc3BlY2lmaWVkLSBpcyB0YWtlbiBhcyB0aGUgZmlyc3QgZmlsZSBpbiB0aGUgbGlzdCwgd2hpY2ggbWF5IGJlIHNvbWV3aGF0IGhhcmQgdG8gY29udHJvbC4gU3BlY2lmeWluZyB0aGUgb3V0cHV0IGZpbGUgd2l0aCA8dHQ+ZGVzdEZpbGU8L3R0PiBzZWVtcyBwcnVkZW50LiA8cD4gPHA+IEZvciBtb3JlIGNvbXBsZXggc291cmNlIHRyZWVzLCBuZXN0ZWQgPHR0PnNyYzwvdHQ+IGVsZW1lbnRzIGNhbiBiZSBzdXBwbGllZC4gV2hlbiBzdWNoIGFuIGVsZW1lbnQgaXMgcHJlc2VudCwgdGhlIGltcGxpY2l0IGZpbGVzZXQgaXMgaWdub3JlZC4gVGhpcyBtYWtlcyBzZW5zZSwgd2hlbiB5b3UgdGhpbmsgYWJvdXQgaXQgOikgIDxwPkZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlIHBhdHRlcm4gPGNvZGU+KiovKi5jczwvY29kZT4gaXMgcHJlc2V0IGFzIGluY2x1ZGVzIGxpc3QgYW5kIHlvdSBjYW4gbm90IG92ZXJyaWRlIGl0IHdpdGggYW4gZXhwbGljaXQgaW5jbHVkZXMgYXR0cmlidXRlLiAgVXNlIG5lc3RlZCA8Y29kZT4mbHQ7c3JjJmd0OzwvY29kZT4gZWxlbWVudHMgaW5zdGVhZCBvZiB0aGUgYmFzZWRpciBhdHRyaWJ1dGUgaWYgeW91IG5lZWQgbW9yZSBjb250cm9sLjwvcD4gPHA+IFJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgZmlsZXMgY2FuIGJlIG1hZGUgdGhyb3VnaCB0aGUgcmVmZXJlbmNlcyBhdHRyaWJ1dGUsIG9yIChzaW5jZSBBbnQxLjYpLCB2aWEgbmVzdGVkIDxjb2RlPiZsdDtyZWZlcmVuY2UmZ3Q7PC9jb2RlPiBmaWxlc2V0cy4gV2l0aCB0aGUgbGF0dGVyLCB0aGUgdGltZXN0YW1wcyBvZiB0aGUgcmVmZXJlbmNlcyBhcmUgYWxzbyB1c2VkIGluIHRoZSBkZXBlbmRlbmN5IGNoZWNraW5nIGFsZ29yaXRobS4gPHA+IEV4YW1wbGUgPHByZT4mbHQ7Y3NjIG9wdGltaXplPSZxdW90O3RydWUmcXVvdDsgZGVidWc9JnF1b3Q7ZmFsc2UmcXVvdDsgZG9jRmlsZT0mcXVvdDtkb2N1bWVudGF0aW9uLnhtbCZxdW90OyB3YXJuTGV2ZWw9JnF1b3Q7NCZxdW90OyB1bnNhZmU9JnF1b3Q7ZmFsc2UmcXVvdDsgdGFyZ2V0VHlwZT0mcXVvdDtleGUmcXVvdDsgaW5jcmVtZW50YWw9JnF1b3Q7ZmFsc2UmcXVvdDsgbWFpbkNsYXNzID0gJnF1b3Q7TWFpbkFwcCZxdW90OyBkZXN0RmlsZT0mcXVvdDtOZXRBcHAuZXhlJnF1b3Q7ICZndDsgJmx0O3NyYyBkaXI9InNyYyIgaW5jbHVkZXM9IiouY3MiLyZndDsgJmx0O3JlZmVyZW5jZSBmaWxlPSIke3Rlc3RDU0MuZGxsfSIvJmd0OyAmbHQ7ZGVmaW5lIG5hbWU9IlJFTEVBU0UiLyZndDsgJmx0O2RlZmluZSBuYW1lPSJERUJVRyIgaWY9ImRlYnVnLnByb3BlcnR5Ii8mZ3Q7ICZsdDtkZWZpbmUgbmFtZT0iZGVmMyIgdW5sZXNzPSJkZWYzLnByb3BlcnR5Ii8mZ3Q7ICZsdDsvY3NjJmd0OyA8L3ByZT4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIERlc2NyaXB0aW9uIC0tPgorCisgICAgPCEtLSBTdGFydCBBdHRyaWJ1dGVzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJhdHRyaWJ1dGVzIj4KKyAgICAgICAgICA8c3Ryb25nPlBhcmFtZXRlcnM8L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgPHRhYmxlPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkF0dHJpYnV0ZTwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5UeXBlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlJlcXVpcmVtZW50PC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAKKyAgICA8IS0tIEF0dHJpYnV0ZSBHcm91cCAtLT4gICAgCisgICAgICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmFkZGl0aW9uYWxtb2R1bGVzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZXMgdG8gcmVmZXIgdG8uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiByb3dzcGFuPSIyNiI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPk9wdGlvbmFsPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZGVidWc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zZXQgdGhlIGRlYnVnIGZsYWcgb24gb3Igb2ZmLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5kZWZpbml0aW9uczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBkZWZpbmVkIGNvbnN0YW50cy48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5kZXN0ZGlyPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgb2YgZmlsZXMgdG8gYmUgY29tcGlsZWQuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmRlc3RmaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0IHRoZSBuYW1lIG9mIGV4ZS9saWJyYXJ5IHRvIGNyZWF0ZS48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZG9jZmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmZpbGUgZm9yIGdlbmVyYXRlZCBYTUwgZG9jdW1lbnRhdGlvbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5leGVjdXRhYmxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtLCBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cy4gQ2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBmdWxsIHBhdGggdG8gYSBwcm9ncmFtLCBvciB0byBzd2l0Y2ggdG8gYW4gYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kLCBzdWNoIGFzIHRoZSBNb25vIG9yIFJvdG9yIHZlcnNpb25zIC1wcm92aWRlZCB0aGV5IHVzZSB0aGUgc2FtZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFzIHRoZSAuTkVUIGZyYW1ld29yayBlZGl0aW9uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZXh0cmFvcHRpb25zPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+QW55IGV4dHJhIG9wdGlvbnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IHN1cHBvcnRlZCBieSB0aGlzIHRhc2suPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZmFpbG9uZXJyb3I8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5JZiB0cnVlLCBmYWlsIG9uIGNvbXBpbGF0aW9uIGVycm9ycy48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZmlsZWFsaWduPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0IHRoZSBmaWxlIGFsaWdubWVudC4gVmFsaWQgdmFsdWVzIGFyZSAwLDUxMiwgMTAyNCwgMjA0OCwgNDA5NiwgODE5MiwgYW5kIDE2Mzg0LCAwIG1lYW5zICdsZWF2ZSB0byB0aGUgY29tcGlsZXInPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+aW50PC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZnVsbHBhdGhzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+SWYgdHJ1ZSwgcHJpbnQgdGhlIGZ1bGwgcGF0aCBvZiBmaWxlcyBvbiBlcnJvcnMuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmluY2x1ZGVkZWZhdWx0cmVmZXJlbmNlczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPklmIHRydWUsIGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGNvbW1vbiBhc3NlbWJsaWVzIGluIGRvdG5ldCwgYW5kIHRlbGxzIHRoZSBjb21waWxlciB0byBsaW5rIGluIG1zY29yZS5kbGwuIHNldCB0aGUgYXV0b21hdGljIHJlZmVyZW5jZSBpbmNsdXNpb24gZmxhZyBvbiBvciBvZmYgdGhpcyBmbGFnIGNvbnRyb2xzIHRoZSAvbm9zdGRsaWIgb3B0aW9uIGluIENTQzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5pbmNyZW1lbnRhbDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNldCB0aGUgaW5jcmVtZW50YWwgY29tcGlsYXRpb24gZmxhZyBvbiBvciBvZmYuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm1haW5jbGFzczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldHMgdGhlIG5hbWUgb2YgbWFpbiBjbGFzcyBmb3IgZXhlY3V0YWJsZXMuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bm9jb25maWc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5BIGZsYWcgdGhhdCB0ZWxscyB0aGUgY29tcGlsZXIgbm90IHRvIHJlYWQgaW4gdGhlIGNvbXBpbGVyIHNldHRpbmdzIGZpbGVzICdjc2MucnNwJyBpbiBpdHMgYmluIGRpcmVjdG9yeSBhbmQgdGhlbiB0aGUgbG9jYWwgZGlyZWN0b3J5PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm9wdGltaXplPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+SWYgdHJ1ZSwgZW5hYmxlcyBvcHRpbWl6YXRpb24gZmxhZy48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+b3V0cHV0ZmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlRoZSBvdXRwdXQgZmlsZS4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIGRlc3RGaWxlIGF0dHJpYnV0ZS48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+cmVmZXJlbmNlZmlsZXM8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5QYXRoIG9mIHJlZmVyZW5jZXMgdG8gaW5jbHVkZS4gV2lsZGNhcmRzIHNob3VsZCB3b3JrLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlBhdGg8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5yZWZlcmVuY2VzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIERMTHMgdG8gcmVmZXIgdG8uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c3JjZGlyPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IG9mIHRoZSBmaWxlcyB0byBiZSBjb21waWxlZC48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+dGFyZ2V0dHlwZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNldCB0aGUgdGFyZ2V0IHR5cGUgdG8gb25lIG9mIGV4ZXxsaWJyYXJ5fG1vZHVsZXx3aW5leGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4iZXhlIiwgImxpYnJhcnkiLCAibW9kdWxlIiwgIndpbmV4ZSI8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj51bnNhZmU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5JZiB0cnVlLCBlbmFibGVzIHRoZSB1bnNhZmUga2V5d29yZC48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+dXRmOG91dHB1dDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPklmIHRydWUsIHJlcXVpcmUgYWxsIGNvbXBpbGVyIG91dHB1dCB0byBiZSBpbiBVVEY4IGZvcm1hdC48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+d2FybmxldmVsPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+TGV2ZWwgb2Ygd2FybmluZyBjdXJyZW50bHkgYmV0d2VlbiAxIGFuZCA0IHdpdGggNCBiZWluZyB0aGUgc3RyaWN0ZXN0LjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmludDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPndpbjMyaWNvbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldCB0aGUgZmlsZW5hbWUgb2YgaWNvbiB0byBpbmNsdWRlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj53aW4zMnJlczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldHMgdGhlIGZpbGVuYW1lIG9mIGEgd2luMzIgcmVzb3VyY2UgKC5SRVMpIGZpbGUgdG8gaW5jbHVkZS4gVGhpcyBpcyBub3QgYSAuTkVUIHJlc291cmNlLCBidXQgd2hhdCBXaW5kb3dzIGlzIHVzZWQgdG8uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorCisKKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEF0dHJpYnV0ZXMgLS0+CisKKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnRzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImVsZW1lbnRzIj4KKyAgICAgICAgICA8c3Ryb25nPlBhcmFtZXRlcnMgYXMgbmVzdGVkIGVsZW1lbnRzPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnQgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzgyOERBNiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiIHNpemU9Ii0xIj4KKyAgICAgICAgICA8c3Ryb25nPmRlZmluZTwvc3Ryb25nPiAob3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0LkRvdG5ldERlZmluZSk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBhZGQgYSBkZWZpbmUgdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+cmVmZXJlbmNlPC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0KTwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIGFkZCBhIG5ldyByZWZlcmVuY2UgZmlsZXNldCB0byB0aGUgY29tcGlsYXRpb24KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+cmVzb3VyY2U8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5Eb3RuZXRSZXNvdXJjZSk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBsaW5rIG9yIGVtYmVkIGEgcmVzb3VyY2UKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+c3JjPC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0KTwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIGFkZCBhIG5ldyBzb3VyY2UgZGlyZWN0b3J5IHRvIHRoZSBjb21waWxlCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KKworICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudHMgLS0+CisKKworICAgIDwvdGQ+CisgIDwvdHI+CisgIDwhLS0gRU5EIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorCis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2RlcGVuZC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9kZXBlbmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODY4NjRkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9kZXBlbmQuaHRtbApAQCAtMCwwICsxLDIxNiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5EZXBlbmQgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+RGVwZW5kPC9oMj4KKworQSB0YXNrIHRvIG1hbmFnZSBKYXZhIGNsYXNzIGZpbGUgZGVwZW5kZW5jaWVzLgorCis8aDM+RGVzY3JpcHRpb248L2gzPgorCis8cD4KK1RoZSBkZXBlbmQgdGFzayB3b3JrcyBieSBkZXRlcm1pbmluZyB3aGljaCBjbGFzc2VzIGFyZSBvdXQgb2YgZGF0ZSB3aXRoCityZXNwZWN0IHRvIHRoZWlyIHNvdXJjZSBhbmQgdGhlbiByZW1vdmluZyB0aGUgY2xhc3MgZmlsZXMgb2YgYW55IG90aGVyCitjbGFzc2VzIHdoaWNoIGRlcGVuZCBvbiB0aGUgb3V0LW9mLWRhdGUgY2xhc3Nlcy4KKzwvcD4KKworPHA+IFRvIGRldGVybWluZSB0aGUgY2xhc3MgZGVwZW5kZW5jaWVzLCB0aGUgZGVwZW5kIHRhc2sgYW5hbHlzZXMgdGhlIGNsYXNzIAorZmlsZXMgb2YgYWxsIGNsYXNzIGZpbGVzIHBhc3NlZCB0byBpdC4gRGVwZW5kIGRvZXMgbm90IHBhcnNlIHlvdXIgc291cmNlIGNvZGUgaW4gCithbnkgd2F5IGJ1dCByZWxpZXMgdXBvbiB0aGUgY2xhc3MgcmVmZXJlbmNlcyBlbmNvZGVkIGludG8gdGhlIGNsYXNzIGZpbGVzIGJ5IHRoZSAKK2NvbXBpbGVyLiBUaGlzIGlzIGdlbmVyYWxseSBmYXN0ZXIgdGhhbiBwYXJzaW5nIHRoZSBKYXZhIHNvdXJjZS48L3A+CisKKzxwPgorVG8gbGVhcm4gbW9yZSBhYm91dCBob3cgdGhpcyBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjbGFzcyBmaWxlcywgCitwbGVhc2UgcmVmZXIgdG8gPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3Ztc3BlYy8iPnRoZSBKYXZhIAorVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb248L2E+Cis8L3A+CisKKzxwPiBTaW5jZSBhIGNsYXNzJyBkZXBlbmRlbmNpZXMgb25seSBjaGFuZ2Ugd2hlbiB0aGUgY2xhc3MgaXRzZWxmIGNoYW5nZXMsIHRoZSAKK2RlcGVuZCB0YXNrIGlzIGFibGUgdG8gY2FjaGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4gT25seSB0aG9zZSBjbGFzcyBmaWxlcyAKK3doaWNoIGhhdmUgY2hhbmdlZCB3aWxsIGhhdmUgdGhlaXIgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiByZS1hbmFseXNlZC4gTm90ZSB0aGF0IAoraWYgeW91IGNoYW5nZSBhIGNsYXNzJyBkZXBlbmRlbmNpZXMgYnkgY2hhbmdpbmcgdGhlIHNvdXJjZSwgaXQgd2lsbCBiZSAKK3JlY29tcGlsZWQgYW55d2F5LiBZb3UgY2FuIGV4YW1pbmUgdGhlIGRlcGVuZGVuY3kgZmlsZXMgY3JlYXRlZCB0byB1bmRlcnN0YW5kIAordGhlICBkZXBlbmRlbmNpZXMgb2YgeW91ciBjbGFzc2VzLiBQbGVhc2UgZG8gbm90IHJlbHksIGhvd2V2ZXIsIG9uIHRoZSBmb3JtYXQgb2YgCit0aGUgaW5mb3JtYXRpb24sIGFzIGl0IG1heSBjaGFuZ2UgaW4gYSBsYXRlciByZWxlYXNlLiA8L3A+CisKKzxwPiBPbmNlIGRlcGVuZCBkaXNjb3ZlcnMgYWxsIG9mIHRoZSBjbGFzcyBkZXBlbmRlbmNpZXMsIGl0ICZxdW90O2ludmVydHMmcXVvdDsgCit0aGlzIHJlbGF0aW9uIHRvIGRldGVybWluZSwgZm9yIGVhY2ggY2xhc3MsIHdoaWNoIG90aGVyIGNsYXNzZXMgYXJlIGRlcGVuZGVudCAKK3Vwb24gaXQuIFRoaXMgJnF1b3Q7YWZmZWN0cyZxdW90OyBsaXN0IGlzIHVzZWQgdG8gZGlzY292ZXIgd2hpY2ggY2xhc3NlcyBhcmUgCitpbnZhbGlkYXRlZCBieSB0aGUgb3V0IG9mIGRhdGUgY2xhc3MuIFRoZSBjbGFzcyBmaWxlcyBvZiB0aGUgaW52YWxpZGF0ZWQgCitjbGFzc2VzIGFyZSByZW1vdmVkLCB0cmlnZ2VyaW5nIHRoZSBjb21waWxhdGlvbiBvZiB0aGUgYWZmZWN0ZWQgY2xhc3Nlcy4gPC9wPgorCis8cD4gVGhlIGRlcGVuZCB0YXNrIHN1cHBvcnRzIGFuIGF0dHJpYnV0ZSwgJnF1b3Q7Y2xvc3VyZSZxdW90OyB3aGljaCBjb250cm9scyAKK3doZXRoZXIgZGVwZW5kIHdpbGwgb25seSBjb25zaWRlciBkaXJlY3QgY2xhc3MtY2xhc3MgcmVsYXRpb25zaGlwcyBvciB3aGV0aGVyIGl0IAord2lsbCBhbHNvIGNvbnNpZGVyIHRyYW5zaXRpdmUsIGluZGlyZWN0IHJlbGF0aW9uc2hpcHMuIEZvciBleGFtcGxlLCBzYXkgdGhlcmUgCithcmUgdGhyZWUgY2xhc3NlcywgQSwgd2hpY2ggZGVwZW5kcyBvbiBCLCB3aGljaCBpbi10dXJuIGRlcGVuZCBvbiBDLiBOb3cgc2F5IAordGhhdCBjbGFzcyBDIGlzIG91dCBvZiBkYXRlLiBXaXRob3V0IGNsb3N1cmUsIG9ubHkgY2xhc3MgQiB3b3VsZCBiZSByZW1vdmVkIGJ5IAorZGVwZW5kLiBXaXRoIGNsb3N1cmUgc2V0LCBjbGFzcyBBIHdvdWxkIGFsc28gYmUgcmVtb3ZlZC4gTm9ybWFsbHkgZGlyZWN0IAorcmVsYXRpb25zaGlwcyBhcmUgc3VmZmljaWVudCAtIGl0IGlzIHVudXN1YWwgZm9yIGEgY2xhc3MgdG8gZGVwZW5kIG9uIGFub3RoZXIgCit3aXRob3V0IGhhdmluZyBhIGRpcmVjdCByZWxhdGlvbnNoaXAuIFdpdGggY2xvc3VyZSBzZXQsIHlvdSB3aWxsIG5vdGljZSB0aGF0IAorZGVwZW5kIHR5cGljYWxseSByZW1vdmVzIGZhciBtb3JlIGNsYXNzIGZpbGVzLiA8L3A+CisKKzxwPlRoZSBjbGFzc3BhdGggYXR0cmlidXRlIGZvciA8Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT4gaXMgb3B0aW9uYWwuIElmIGl0IGlzIHByZXNlbnQsIAorZGVwZW5kIHdpbGwgY2hlY2sgY2xhc3MgZGVwZW5kZW5jaWVzIGFnYWluc3QgY2xhc3NlcyBhbmQgamFycyBvbiB0aGlzIGNsYXNzcGF0aC4KK0FueSBjbGFzc2VzIHdoaWNoIGRlcGVuZCBvbiBhbiBlbGVtZW50IGZyb20gdGhpcyBjbGFzc3BhdGggYW5kIHdoaWNoIGFyZSBvbGRlciAKK3RoYW4gdGhhdCBlbGVtZW50IHdpbGwgYmUgZGVsZXRlZC4gQSB0eXBpY2FsIGV4YW1wbGUgd2hlcmUgeW91IHdvdWxkIHVzZSB0aGlzIAorZmFjaWxpdHkgd291bGQgYmUgd2hlcmUgeW91IGFyZSBidWlsZGluZyBhIHV0aWxpdHkgamFyIGFuZCB3YW50IHRvIG1ha2Ugc3VyZSAKK2NsYXNzZXMgd2hpY2ggYXJlIG91dCBvZiBkYXRlIHdpdGggcmVzcGVjdCB0byB0aGlzIGphciBhcmUgcmVidWlsdC4gWW91IHNob3VsZAorPGI+bm90PC9iPiBpbmNsdWRlIGphcnMgaW4gdGhpcyBjbGFzc3BhdGggd2hpY2ggeW91IGRvIG5vdCBleHBlY3QgdG8gY2hhbmdlLCAKK3N1Y2ggYXMgdGhlIEpESyBydW50aW1lIGphciBvciB0aGlyZCBwYXJ0eSBqYXJzLCBzaW5jZSBkb2luZyBzbyB3aWxsIGp1c3Qgc2xvdyAKK2Rvd24gdGhlIGRlcGVuZGVuY3kgY2hlY2suIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgZG8gdXNlIGEgY2xhc3NwYXRoIGZvciB0aGUgCitkZXBlbmQgdGFzayBpdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzcGF0aCBuZWNlc3NhcnkgdG8gYWN0dWFsbHkgCitjb21waWxlIHlvdXIgY29kZS48L3A+CisKKzxoMz5QZXJmb3JtYW5jZTwvaDM+IAorCis8cD4gVGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBkZXBlbmQgdGFzayBpcyBkZXBlbmRlbnQgb24gYSAKK251bWJlciBvZiBmYWN0b3JzIHN1Y2ggYXMgY2xhc3MgcmVsYXRpb25zaGlwIGNvbXBsZXhpdHkgYW5kIGhvdyBtYW55IGNsYXNzIGZpbGVzIAorYXJlIG91dCBvZiBkYXRlLiBUaGUgZGVjaXNpb24gYWJvdXQgd2hldGhlciBpdCBpcyBjaGVhcGVyIHRvIGp1c3QgcmVjb21waWxlIGFsbCAKK2NsYXNzZXMgb3IgdG8gdXNlIHRoZSBkZXBlbmQgdGFzayB3aWxsIGRlcGVuZCBvbiB0aGUgc2l6ZSBvZiB5b3VyIHByb2plY3QgYW5kIAoraG93IGludGVycmVsYXRlZCB5b3VyIGNsYXNzZXMgYXJlLiA8L3A+CisKKworPGgzPkxpbWl0YXRpb25zPC9oMz4KKworPHA+IFRoZXJlIGFyZSBzb21lIHNvdXJjZSBkZXBlbmRlbmNpZXMgd2hpY2ggZGVwZW5kIHdpbGwgbm90IGRldGVjdC4gPC9wPgorCis8dWw+Cis8bGk+SWYgdGhlIEphdmEgY29tcGlsZXIgb3B0aW1pemVzIGF3YXkgYSBjbGFzcyByZWxhdGlvbnNoaXAsIAorICAgIHRoZXJlIGNhbiBiZSBhIHNvdXJjZSBkZXBlbmRlbmN5IHdpdGhvdXQgYSBjbGFzcyBkZXBlbmRlbmN5LiA8L2xpPgorICAgIAorPGxpPk5vbiBwdWJsaWMgY2xhc3NlcyBjYXVzZSB0d28gcHJvYmxlbXMuIEZpcnN0bHkgZGVwZW5kIGNhbm5vdCByZWxhdGUKKyAgICB0aGUgY2xhc3MgZmlsZSB0byBhIHNvdXJjZSBmaWxlLiBJbiB0aGUgZnV0dXJlIHRoaXMgbWF5IGJlIGFkZHJlc3NlZAorICAgIHVzaW5nIHRoZSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUgaW4gdGhlIGNsYXNzZmlsZS4gU2Vjb25kbHksIG5laXRoZXIgCisgICAgZGVwZW5kIG5vciB0aGUgY29tcGlsZXIgdGFza3MgY2FuIGRldGVjdCB3aGVuIGEgbm9uIHB1YmxpYyBjbGFzcyBpcworICAgIG1pc3NpbmcuIElubmVyIGNsYXNzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRlcGVuZCB0YXNrLjwvbGk+Cis8L3VsPgorCitUaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgb2YgdGhlc2UgbGltaXRhdGlvbnMgaXMgdGhhdCB0aGUgdGFzayBjYW4ndCB0ZWxsCit3aGljaCBjbGFzc2VzIHRvIHJlY29tcGlsZSB3aGVuIGEgY29uc3RhbnQgcHJpbWl0aXZlIGRhdGEgdHlwZSBleHBvcnRlZCAKK2J5IG90aGVyIGNsYXNzZXMgaXMgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgY2hhbmdlIGluIHRoZSBkZWZpbml0aW9uIG9mCitzb21ldGhpbmcgbGlrZQorPHByZT4KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgeworICBwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUc9ZmFsc2U7Cit9Cis8L3ByZT4gd2lsbCBub3QgYmUgcGlja2VkIHVwIGJ5IG90aGVyIGNsYXNzZXMuCisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY0RpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHNvdXJjZSBleGlzdHMuIGRlcGVuZAord2lsbCBleGFtaW5lIHRoaXMgdG8gZGV0ZXJtaW5lIHdoaWNoIGNsYXNzZXMgYXJlIG91dCBvZiBkYXRlLiBJZiB5b3UgdXNlIG11bHRpcGxlCitzb3VyY2UgZGlyZWN0b3JpZXMgeW91IGNhbiBwYXNzIHRoaXMgYXR0cmlidXRlIGEgcGF0aCBvZiBzb3VyY2UgZGlyZWN0b3JpZXMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3REaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGNsYXNzIGZpbGVzIHdoaWNoCit3aWxsIGJlIGFuYWx5c2VkLiBJZiB0aGlzIGlzIG5vdCBwcmVzZW50LCB0aGUgc3JjZGlyIGlzIHVzZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FjaGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyBhIGRpcmVjdG9yeSBpbiB3aGljaCBkZXBlbmQgY2FuIHN0b3JlIGFuZAorcmV0cmlldmUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4gSWYgdGhpcyBpcyBub3QgcHJlc2VudCwgZGVwZW5kIHdpbGwgbm90Cit1c2UgYSBjYWNoZSA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbG9zdXJlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgYXR0cmlidXRlIGNvbnRyb2xzIHdoZXRoZXIgZGVwZW5kIG9ubHkgcmVtb3ZlcworY2xhc3NlcyB3aGljaCBkaXJlY3RseSBkZXBlbmQgb24gb3V0IG9mIGRhdGUgY2xhc3Nlcy4gSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSwKK2RlcGVuZCB3aWxsIHRyYXZlcnNlIHRoZSBjbGFzcyBkZXBlbmRlbmN5IGdyYXBoIGRlbGV0aW5nIGFsbCBhZmZlY3RlZAorY2xhc3Nlcy4gRGVmYXVsdHMgdG8gZmFsc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kdW1wPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHRydWUgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBkZWJ1ZyBsZXZlbCBsb2cKKyAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIGNvbnRhaW5pbmcgamFycyBhbmQgY2xhc3NlcyBmb3Igd2hpY2ggPGNvZGU+Jmx0O2RlcGVuZCZndDs8L2NvZGU+IHNob3VsZCBhbHNvCisgICAgICAgICAgICAgICAgICAgICBjaGVjayBkZXBlbmRlbmNpZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj53YXJuT25SbWlTdHViczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5GbGFnIHRvIGRpc2FibGUgd2FybmluZ3MgYWJvdXQgZmlsZXMgdGhhdCBsb29rIGxpa2Ugcm1pYyBnZW5lcmF0ZWQgc3R1Yi9za2VsZXRvbgorICAgIGNsYXNzZXMsIGFuZCB3aGljaCBoYXZlIG5vIC5qYXZhIHNvdXJjZS4gVXNlZnVsIHdoZW4gZG9pbmcgcm1pIGRldmVsb3BtZW50LiA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQ9dHJ1ZTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxwPlRoZSA8Y29kZT5kZXBlbmQ8L2NvZGU+IHRhc2sncyA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGF0dHJpYnV0ZSBpcyBhIAorPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRILWxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0Cit2aWEgYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgorCis8cD5BZGRpdGlvbmFsbHksCit0aGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQKKzxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+CithbmQgc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YKKzxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDxjb2RlPmRpcjwvY29kZT4gYmVjb21lcyA8Y29kZT5zcmNkaXI8L2NvZGU+KSwKK2FzIHdlbGwgYXMgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LAorPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiwgYW5kIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuCisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cHJlPiZsdDtkZXBlbmQgc3JjZGlyPSZxdW90OyR7amF2YS5kaXJ9JnF1b3Q7CisgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OworICAgICAgICBjYWNoZT0mcXVvdDtkZXBjYWNoZSZxdW90OworICAgICAgICBjbG9zdXJlPSZxdW90O3llcyZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPnJlbW92ZXMgYW55IGNsYXNzZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGQuY2xhc3Nlc308L2NvZGU+IGRpcmVjdG9yeQordGhhdCBkZXBlbmQgb24gb3V0LW9mLWRhdGUgY2xhc3Nlcy4gQ2xhc3NlcyBhcmUgY29uc2lkZXJlZCBvdXQtb2YtZGF0ZSB3aXRoIAorcmVzcGVjdCB0byB0aGUgc291cmNlIGluIHRoZSA8Y29kZT4ke2phdmEuZGlyfTwvY29kZT4gZGlyZWN0b3J5LCB1c2luZyB0aGUgc2FtZQorbWVjaGFuaXNtIGFzIHRoZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrLiBJbiB0aGlzIGV4YW1wbGUsIHRoZQorPGNvZGU+Jmx0O2RlcGVuZCZndDs8L2NvZGU+IHRhc2sgY2FjaGVzIGl0cyBkZXBlbmRlbmN5IAoraW5mb3JtYXRpb24gaW4gdGhlIDxjb2RlPmRlcGNhY2hlPC9jb2RlPiBkaXJlY3RvcnkuIDwvcD4KKworPHByZT4KKyZsdDtkZXBlbmQgc3JjZGlyPSZxdW90OyR7amF2YS5kaXJ9JnF1b3Q7IGRlc3RkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OworICAgICAgICBjYWNoZT0mcXVvdDtkZXBjYWNoZSZxdW90OyBjbG9zdXJlPSZxdW90O3llcyZxdW90OyZndDsKKyAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OworICAmbHQ7ZXhjbHVkZXNmaWxlIG5hbWU9JnF1b3Q7JHtqYXZhLmRpcn0vYnVpbGRfZXhjbHVkZXMmcXVvdDsvJmd0OworJmx0Oy9kZXBlbmQmZ3Q7Cis8L3ByZT4KKzxwPmRvZXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUsIGJ1dCBleHBsaWNpdGx5IGluY2x1ZGVzIGFsbAorPGNvZGU+LmphdmE8L2NvZGU+IGZpbGVzLCBleGNlcHQgdGhvc2UgdGhhdCBtYXRjaCB0aGUgbGlzdCBnaXZlbgoraW4gPGNvZGU+JHtqYXZhLmRpcn0vYnVpbGRfZXhjbHVkZXM8L2NvZGU+LjwvcD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9kb3RuZXQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvZG90bmV0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkNmZmNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvZG90bmV0Lmh0bWwKQEAgLTAsMCArMSwzMjYgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPi5ORVQgVGFza3M8L3RpdGxlPgorPC9oZWFkPgorCis8aDE+Lk5FVCB0YXNrczwvaDE+Cis8aDI+SW50cm9kdWN0aW9uPC9oMj4KKworCis8cD48c3Ryb25nPlRoZXNlIHRhc2tzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUKK3JlbGVhc2Ugb2YgQW50LiAgVGhleSBhcmUgbm93IHBhcnQgb2YgdGhlIDxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9kb3RuZXQvaW5kZXguaHRtbCI+Lk5FVAorQW50bGliPC9hPi48L3N0cm9uZz48L3A+CisKK0FudCBzdXBwb3J0IGZvciAuTkVUIGdvZXMgYmFjayB0byBiZWZvcmUgLk5FVCB3YXMgcmVsZWFzZWQsIGFuZAorY29udGludWVzIHRvIGJlIGV4cGFuZGVkIGJhc2VkIG9uIHVzZXIgZGVtYW5kLiBVc2VycyB3cml0aW5nIG5vdGhpbmcgYnV0CithIC5ORVQgYXBwbGljYXRpb24sIG1heSB3YW50IHRvIGxvb2sgYXQgdGhlIC5ORVQtYmFzZWQKKzxBIGhyZWY9Imh0dHA6Ly9uYW50LnNvdXJjZWZvcmdlLm5ldC8iPk5BbnQ8L0E+IHByb2plY3QsIHRoYXQgc3VwcG9ydHMKK2JvdGggdGhlIE1pY3Jvc29mdCBhbmQgdGhlIFhpbWlhbiBtYW5hZ2VkIDxBCitocmVmPSJodHRwOi8vZ28tbW9uby5jb20vIj5Nb25vPC9BPiBwcm9qZWN0J3MgaW1wbGVtZW50YXRpb24gb2YgdGhlCisuTkVUIGZyYW1ld29yay4KKzxwPgorCitPdmVyIHRpbWUsIHRoZSAuTkVUIHRhc2tzIGluIEFudCBoYXZlIHRlbmRlZCB0byBldm9sdmUgdG8gbWVldCBhIGZldworbGltaXRlZCBuZWVkcy4gRmlyc3RseSwgZGV2ZWxvcGVycyB3b3JraW5nIHdpdGggY29tcGxleCBkZXBsb3ltZW50IHByb2JsZW1zIG1heQord2FudCB0byB1c2UgYW50IHRvIHVzZSB0aGUgZmFpcmx5IGFkdmFuY2VkIGRlcGxveW1lbnQgdGFza3MgQW50IHNoaXBzCit3aXRoLiBTZWNvbmRseSwgYW55b25lIHdobyBoYXMgYSBjcm9zcy1wbGF0Zm9ybSBwcm9qZWN0IGNhbiB1c2UgdGhlc2UKK3Rhc2tzIHRvIGNvdmVyIHRoZSAuTkVUIHNpZGUgb2YgdGhlIHByb2JsZW0uIEhlcmUsIGNyb3NzLXBsYXRmb3JtIGNhbgorbWVhbiBtb3JlIHRoYW4ganVzdCBKYXZhIGFuZCAuTkVUOiB0aGUgQysrIHRhc2tzIGluIHRoZSBhbnQtY29udHJpYgorcHJvamVjdCBvbiBzb3VyY2Vmb3JnZSBjYW4gYmUgdXNlZCB3aXRoIEFudCB0byBkbyBuYXRpdmUgQysrIGFuZCAuTkVUCitjcm9zcyBkZXZlbG9wbWVudCBpZiB0aGF0IGlzIHlvdXIgbmVlZC4gRmluYWxseSwgQW50IHN1cHBvcnQgZm9yIC5ORVQKK2xldHMgb25lIGF1dG9tYXRlIC5ORVQgZGV2ZWxvcG1lbnQgdW5kZXIgYW4gYXV0b21hdGVkIGJ1aWxkIHByb2Nlc3MsCitzdWNoIGFzIEFudEhpbGwgb3IgQ3J1aXNlIENvbnRyb2wuCisKKzxwPgorCitXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCB0aGUgQW50IHRhc2tzIGZvciAuTkVUIHN1cHBvcnQgZG8gbm90IGdldCBhcworbXVjaCByaWdvcm91cyB1c2UgYXMgdGhlIEphdmEgdG9vbHMsIGFuZCBhcmUgZXZvbHZpbmcgbW9yZSBzbG93bHkgLXRoYXQKK2luY2x1ZGVzIHRoZSB0aW1lIGZvciBzdXBwb3J0IGNhbGxzIHRvIGNoYW5nZS4gQnV0IGFzIGEgY29uc2VxdWVuY2UsCitkZXZlbG9wZXJzIHdvcmtpbmcgb24gLk5FVCBzdXBwb3J0IGhhdmUgbW9yZSBmcmVlZG9tIHRvIHBsYXkgYXJvdW5kIHdpdGgKK3RoZSBjb2RlLiBJdCBhbHNvIG1lYW5zIHRoYXQgdGhlIGZhaXJseSB1bnVzdWFsIHNldCBvZiB0YXNrcyBzdXBwb3J0ZWQKK2J5IGFudCBlbmFibGUgYSBmZXcgaW50ZXJlc3Rpbmcgb3BlcmF0aW9ucyB0aGF0IGNhbiBub3QgYmUgcGVyZm9ybWVkIGFueQorb3RoZXIgd2F5OgorPG9sPgorCis8bGk+SW50ZWdyYXRpbmcgd2l0aCBhIEphdmEgYmFzZWQgU09BUCBTZXJ2aWNlIC1nZW5lcmF0aW5nIEMjIGNvZGUgZnJvbQordGhlIHNlcnZlcidzIFdTREwgYW5kIHJ1bm5pbmcgaXQgYWdhaW5zdCB0aGUgc2VydmVyLgorPC9saT4KKzxsaT5CdWlsZGluZyBhbmQgZGVwbG95aW5nIGEgQyMtYmFzZWQgV2ViIFNlcnZpY2UsIHRoZW4gdXNpbmcgdGhlIEFwYWNoZQorQXhpcyB0YXNrcyB0byBjcmVhdGUgSlVuaXQgdGVzdHMgdG8gY2FsbCB0aGUgZW5kcG9pbnRzLgorCis8bGk+UGF0Y2hpbmcgLk5FVCB0eXBlIGxpYnJhcmllcyB0byB3b3JrIHdpdGggbW9yZSBjb21wbGV4IElETCB0aGFuIHRoZQorYmFzaWMgPGNvZGU+Jmx0O2ltcG9ydHR5cGVsaWImZ3Q7PC9jb2RlPiB3cmFwcGVyIGFyb3VuZCB0bGJpbXBvcnQgc3VwcG9ydHMuIEhlbmNlIHRoZQorZGlzYXNzZW1ibGVyIGFuZCB0aGUgcmVhc3NlbWJsZXIuCis8L2xpPgorCis8L29sPgorTmVlZGxlc3MgdG8gc2F5LCBwb3NzaWJsZSBkb2VzIG5vdCBtZWFuIGVhc3kuCis8QSBocmVmPSJodHRwOi8vd3d3Lm1hbm5pbmcuY29tL2hhdGNoZXIvY2hhcDE1LnBkZiI+Q2hhcHRlciAxNTwvQT4gb2YKK0phdmEgRGV2ZWxvcG1lbnQgd2l0aCBBbnQgY292ZXJzIHRoZSBmaXJzdCBvZiB0aGVzZSwgdXNpbmcgdGhlIEFudDEuNQordmVyc2lvbiBvZiB0aGUgdGFza3MuIEdvaW5nIHRoZSBvdGhlciB3YXkgLWdlbmVyYXRpbmcgSmF2YSBjbGllbnQKK2NvZGUgYW5kIEpVbml0IHRlc3RjYXNlcyBpcyBjb3ZlcmVkIGluCis8QSBocmVmPSJodHRwOi8vd3d3LmlzZXJhbi5jb20vU3RldmUvcGFwZXJzL2ludGVyb3AvIj5UaGUgV29uZHJvdXMgY3Vyc2UKK29mIEludGVyb3A8L0E+LiBUaGUgZmluYWwgdHJpY2ssIElETCBhbmQgVHlwZWxpYiBhYnVzZSwgaXMgbm90Citkb2N1bWVudGVkIGFzIHdlIGRvIG5vdCB3YW50IHRvIGVuY291cmFnZSBzdWNoIGFuIHVnbHkgcHJhY3Rpc2UuIEl0LAorY2FuLCBob3dldmVyLCBiZSBkb25lIGlmIGFic29sdXRlbHkgbmVjZXNzYXJ5LiAKKworPGgzPlRhc2sgTGlzdDwvaDM+CisKKzx0YWJsZSBib3JkZXI9IjAiID4KKzx0cj4KKyAgPHRkPjxiPlRhc2s8L2I+PC90ZD4KKyAgPHRkPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PGEgaHJlZj0iY3NjLmh0bWwiPmNzYzwvYT48L3RkPgorICA8dGQ+Q29tcGlsZXMgQyMgY29kZTwvdGQ+Cis8L3RyPgorCis8dHI+CisgIDx0ZD48YSBocmVmPSJ2YmMuaHRtbCI+dmJjPC9hPjwvdGQ+CisgIDx0ZD5Db21waWxlcyBWQi5ORVQgY29kZTwvdGQ+Cis8L3RyPgorCis8dHI+CisgIDx0ZD48YSBocmVmPSJqc2hhcnBjLmh0bWwiPmpzaGFycGM8L2E+PC90ZD4KKyAgPHRkPkNvbXBpbGVzIEojIGZpbGVzPC90ZD4KKzwvdHI+CisKKzx0cj4KKyAgPHRkPjxhIGhyZWY9ImlsZGFzbS5odG1sIj5pbGRhc208L2E+PC90ZD4KKyAgPHRkPkRpc2Fzc2VtYmxlcyAuTkVUIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXM8L3RkPgorPC90cj4KKworPHRyPgorICA8dGQ+PGEgaHJlZj0iaWxhc20uaHRtbCI+aWxhc208L2E+PC90ZD4KKyAgPHRkPkFzc2VtYmxlcyAuaWwgZmlsZXM8L3RkPgorPC90cj4KKworPHRyPgorICA8dGQ+PGEgaHJlZj0id3NkbHRvZG90bmV0Lmh0bWwiPndzZGx0b2RvdG5ldDwvYT48L3RkPgorICA8dGQ+R2VuZXJhdGVzIC5ORVQgY29kZSAoQyMgb3IgVkIpIGZyb20gYSBXU0RMIGZpbGU8L3RkPgorPC90cj4KKworPHRyPgorICA8dGQ+PGEgaHJlZj0iaW1wb3J0dHlwZWxpYi5odG1sIj5pbXBvcnR0eXBlbGliPC9hPjwvdGQ+CisgIDx0ZD5JbXBvcnRzIGEgQ09NIHR5cGUgbGlicmFyeSBpbnRvIC5ORVQ8L3RkPgorPC90cj4KKworPC90YWJsZT4KKworPGhyPgorPGgzPkNvbW1vbiAuTkVUIERhdGF0eXBlcyA8L2gzPgorCitUaGVyZSBhcmUgc29tZSBkYXRhdHlwZXMgdGhhdCBhcmUgY29tbW9uIHRvIHRoZSBjb3JlIGNvbXBpbGVyIGNsYXNzZXM6Citjc2MsIHZiYyBhbmQgIGpzaGFycGMKKworPGg0PlJlc291cmNlPC9oND4KKworVGhpcyBpcyBhIHJlc291cmNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLiBBbnQgdXNlcyB0aGlzIGZvcgorZGVwZW5kZW5jeSBjaGVja2luZyAtaWYgcmVzb3VyY2VzIGluY2x1ZGVkIHRoaXMgd2F5IGhhdmUgY2hhbmdlZCwgdGhlCitleGVjdXRhYmxlIG9yIGxpYnJhcnkgd2lsbCBiZSByZWJ1aWx0LgorPHA+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5GaWxlPC90ZD4gCisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcmVzb3VyY2UgdG8gaW5jbHVkZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4gCisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuIAorICAgIE9wdGlvbmFsIHVubGVzcyB0aGUgcmVzb3VyY2UgaXMKKyAgICBtYXJrZWQgYXMgcHVibGljIG9yIHByaXZhdGU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lbWJlZDwvdGQ+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhZyB0byBjb250cm9sIHdoZXRoZXIgdGhlIHJlc291cmNlCisgICAgaXMgZW1iZWRkZWQgaW4gdGhlIGFzc2VtYmx5LCBvciBqdXN0IGxpbmtlZCB0byBpdDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObyAtZGVmYXVsdCBpcyB0cnVlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHVibGljPC90ZD4gCisgICAgPHRkIHZhbGlnbj0idG9wIj5WQiBvbmx5OiBmbGFnIHRvIGNvbnRyb2wgaWYgYSByZXNvdXJjZSBzaG91bGQgYmUgCisgICAgcHVibGljIG9yIHByaXZhdGUuIFNldCB0byB0cnVlIGZvciBwdWJsaWMsIGZhbHNlIGZvciBwcml2YXRlCisgICAgYW5kIGxlYXZlIHVuZGVmaW5lZCBmb3IgZm9yIG5laXRoZXIuIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDU+RXhhbXBsZXM8L2g1PgorCis8cHJlPgorJmx0O3Jlc291cmNlIGZpbGU9ImFwcC5pY28iIG5hbWU9Imljb24iLyZndDsKKyZsdDtyZXNvdXJjZSBmaWxlPSJzcGxhc2guanBnIi8mZ3Q7CismbHQ7cmVzb3VyY2UgbmFtZT0ic3BsYXNoIiBmaWxlPSJzcGxhc2guanBnIiBwdWJsaWM9ImZhbHNlIi8mZ3Q7Cis8L3ByZT4KKworPGg0PkRlZmluZTwvaDQ+CisKK1RoaXMgaXMgYSBkZWZpbml0aW9uOyBpbiAuTkVUIHRoZXNlIGNhbiBlaXRoZXIgYmUgZGVmaW5lZCBvciB1bmRlZmluZWQsCit1bmxpa2UgQysrICNkZWZpbmVzLCB3aGljaCBjYW4gYmUgZWl0aGVyIHVuZGVmaW5lZCBvciBhcmJpdHJhcnkgdGV4dC4KK1RoZSBBbnQgY29tcGlsYXRpb24gdGFza3MgY2FuIHVuY29uZGl0aW9uYWxseSBhZGQgZGVmaW5pdGlvbnMsIG9yCitjb25kaXRpb25hbGx5IHNldCBhIGNvbXBpbGUtdGltZSBkZWZpbml0aW9uIGlmIGFuIGFudCBwcm9wZXJ0eSBpcworZGVmaW5lZCBvciBub3QuCis8cD4KKworRGVwZW5kZW5jeSBMb2dpYzogdGhlIHRhc2tzIGFyZSBub3QgKHlldCkgY2xldmVyIGVub3VnaCB0byByZW1lbWJlciB3aGF0Cit0aGUgbGFzdCBkZWZpbml0aW9ucyB3ZXJlIGFuZCB0cmlnZ2VyIGEgcmVidWlsZCB3aGVuIHRoZXkgY2hhbmdlLiBDbGVhbgorYnVpbGQgdGhlIGNvZGUgd2hlbiB0aGUgZGVmaW5lcyBhcmUgbGlrZWx5IHRvIGJlIGRpZmZlcmVudC4KKzxwPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIGRlZmluaXRpb248L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWY8L3RkPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWUgb2YgYSBhbnQgcHJvcGVydHkgdG8gdGVzdCBmb3I7CisgICAgdGhlIGRlZmluaXRpb24gaXMgb25seSBzZXQgaWYgdGhpcyBwcm9wZXJ0eSBpcyBkZWZpbmVkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZSBvZiBhIGFudCBwcm9wZXJ0eSB0byB0ZXN0IGZvcjsKKyAgICB0aGUgZGVmaW5pdGlvbiBpcyBvbmx5IHNldCBpZiB0aGlzIHByb3BlcnR5IGlzIHVuZGVmaW5lZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg1PkV4YW1wbGVzPC9oNT4KKworPHByZT4KKyZsdDtkZWZpbmUgbmFtZT0idW5zYWZlIi8mZ3Q7CismbHQ7ZGVmaW5lIG5hbWU9ImRlYnVnIiBpZj0iYnVpbGQuZGVidWciLyZndDsKKyZsdDtkZWZpbmUgbmFtZT0iZG90bmV0IiB1bmxlc3M9ImJ1aWxkLm1vbm8iLyZndDsKKzwvcHJlPgorCis8aHI+Cis8aDM+IENoYW5nZSBMb2cgPC9oMz4KKworPGg0PkFudDEuNjwvaDQ+CitUaGlzIHJldmlzaW9uIGdvZXMgYWxvbmcgd2l0aCBORVQgMS4xLCB0aG91Z2ggdGhlcmUgaXMgbm8gcmVhc29uIHdoeQoraXQgc2hvdWxkIG5vdCB3b3JrIG9uIG90aGVyIHZlcnNpb25zLgorPHA+CisKKzxvbD4KKzxsaT52YmMgdGFzazwvbGk+Cis8bGk+anNoYXJwYyB0YXNrPC9saT4KKzxsaT5tb25vIHN1cHBvcnQ8L2xpPgorPGxpPmlsYXNtPC9saT4KKzxsaT50bGJpbXBvcnQ8L2xpPgorPGxpPlJlZmVyZW5jZSBmaWxlc2V0cyBpbiB0aGUgY29tcGlsZXIgdGFza3M8L2xpPgorPGxpPmRlZmluaXRpb25zIGluIHRoZSBjb21waWxlciB0YXNrczwvbGk+Cis8bGk+bXVsdGlwbGUgc291cmNlIGZpbGVzZXRzIGluIHRoZSBjb21waWxlciB0YXNrcy4gSWYgdGhlc2UgYXJlIHVzZWQsIHRoZQoraW1wbGljaXQgZmlsZXNldCBpcyBkaXNhYmxlZDwvbGk+Cis8L29sPgorCitUaGUgY29tcGlsZSB0YXNrczogdmJjLCBqc2hhcnBjLCBhbmQgY3NjLCBhbGwgY29udGFpbiBsb3RzIG9mIGNvbW1vbiBjb2RlCitpbiBhIHNoYXJlZCBiYXNlIGNsYXNzOiBpZiB5b3UgY2FuIHVzZSBvbmUgeW91IHNob3VsZCBiZSBhYmxlIHRvIHVzZQorYW5vdGhlci4KKworPGg0PkFudCAxLjU8L2g0PgorVGhpcyByZXZpc2lvbiBnb2VzIGFsb25nIHdpdGggTkVUIDEuMCAoU1AxKQorPG9sPgorPGxpPkNTQzogYWRkZWQgZmlsZWFsaWduPC9saT4KKzxsaT5DU0M6IGFkZGVkIHJlZmVyZW5jZSB0byBvZmZpY2UuZGxsPC9saT4KKzxsaT5DU0M6IGRlcGVuZGVuY3kgY2hlY2tpbmchIG9ubHkgaWYgZGVzdEZpbGUgaXMgc2V0IQorPGxpPldzZGxUb0RvdG5ldCB3cml0dGVuCis8L29sPgorCis8aDQ+VmVyc2lvbiAwLjU8L2g0PgorVGhpcyByZXZpc2lvbiBnb2VzIGFsb25nIHdpdGggTkVUIDEuMCAoU1AxKQorPG9sPgorPGxpPkNTQzogYWRkZWQgZmlsZWFsaWduPC9saT4KKzxsaT5DU0M6IGFkZGVkIHJlZmVyZW5jZSB0byBvZmZpY2UuZGxsPC9saT4KKzxsaT5DU0M6IGRlcGVuZGVuY3kgY2hlY2tpbmchIG9ubHkgaWYgZGVzdEZpbGUgaXMgc2V0IQorPGxpPldzZGxUb0RvdG5ldCB3cml0dGVuCis8L29sPgorCis8aDQ+VmVyc2lvbiAwLjQ8L2g0PgorVGhpcyBpcyB0aGUgYmV0YS0yIHJldmlzaW9uIG9mIHRoZSB0YXNrcy4KKzxvbD4KKzxsaT5JTEFTTTogcHVsbGVkIHRoZSBvd25lciBhdHRyaWJ1dGUsIGFkZGVkIGtleWZpbGUgZm9yIGdpdmluZyBiaW5hcmllcyBhIHN0cm9uZyBuYW1lCisoTUQ1IGhhc2ggb2YgdGhlIGNoZWNrc3VtKTwvbGk+Cis8bGk+Q1NDOiBhZGRlZCB3aW4zMnJlcyAsIG5vQ29uZmlnLCB1dGY4b3V0cHV0LCBmdWxscGF0aHM8L2xpPgorPGxpPkNTQzogPC9saT4KKzwvb2w+CisKKzxoND5WZXJzaW9uIDAuMzwvaDQ+CisKK1RoZSBjaGFuZ2VzIGhlcmUgcmVmbGVjdCBCZXRhLTEgb2YgdGhlIGRvdG5ldCBTREsgYW5kIGV4cGVyaWVuY2Ugb2YgdXNlIGluCittb3JlIGNvbXBsZXggcHJvamVjdHMuIFRoaXMgYnVpbGQgZG9lcyBub3Qgd29yayB3aXRoIHRoZSBvbGRlciBTREssCitwcmltYXJpbHkgYmVjYXVzZSB0aGUgYXV0b21hdGljIHJlZmVyZW5jZSBmZWF0dXJlIHJlZmVyZW5jZXMgbGlicmFyaWVzCitvbmx5IGZvdW5kIGluIHRoZSBuZXcgU0RLIHZlcnNpb24uCis8cD4KK0V4dGVybmFsIGNoYW5nZXM8L3A+Cis8dWw+Cis8bGk+UmVjdXJzaXZlIGluY2x1c2lvbiBvZiAuY3MgYW5kIC5pbCBmaWxlczwvbGk+CisKKzxsaT5Eb2N1bWVudGF0aW9uIGVuaGFuY2VkLCBpbmNsdWRlcyBleGFtcGxlcyBhbmQgZGV0YWlscyBvZiBhbGwgcGFyYW1ldGVyczwvbGk+CisKKzxsaT5UaGUgY3NjIHRhc2sgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgY29tbW9uIGRvdG5ldCBhc3NlbWJsaWVzLCBzbwordGhlcmUgaXMgbm8gbmVlZCB0byByZW1lbWJlciB0byByZWZlciB0byAnU3lzdGVtLmRsbCcsICdTeXN0ZW0uV2ViLlNlcnZpY2VzJywKKyBldGMuIFRoaXMgZmVhdHVyZSBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgJ2luY2x1ZGVEZWZhdWx0UmVmZXJlbmNlcycKKyBmbGFnIHRvIGZhbHNlLiA8L2xpPgorCisgPGxpPiBSZWZlcmVuY2VzIGNhbiBhbHNvIGJlIHJlZmVycmVkIHRvIHVzaW5nIHRoZSBSZWZlcmVuY2VGaWxlcyBwYXJhbWV0ZXIsIHdoaWNoCitpcyBhbiBhbnQgcGF0aCBzcGVjaWZpY2F0aW9uLiBUaGUgb2xkICdyZWZlcmVuY2VzJyBzdHJpbmcgaXMgc3RpbGwgcmV0YWluZWQuPC9saT4KKzxsaT4gQW4gJ2V4dHJhb3B0aW9ucycgYXR0cmlidXRlIGVuYWJsZXMgdGhlIGJ1aWxkIGZpbGUgdG8gaW5jbHVkZSBhbnkgQ1NDIG9wdGlvbnMKK3doaWNoIGFyZSBub3QgZXhwbGljaXRseSBzdXBwb3J0ZWQgaW4gdGhlIENTQyB0YXNrLiA8L2xpPgorPC91bD4KKworSW50ZXJuYWwgY2hhbmdlcworPHVsPgorPGxpPlNvbWUgbWlub3IgcmVmYWN0b3JpbmcgKG1vdmUgY29tbW9uIGNvZGUgYSBtZXRob2QpPC9saT4KKzxsaT5BcHBsaWNhdGlvbiBvZiBKZWRpdHMgSmF2YVN0eWxlIHRhc2sgcmVzdWx0ZWQgaW4gYSBtYWpvciByZXNoYXBpbmcgb2YKK3RoZSBjb2RlYmFzZSBhbmQgdGhlIGluc2VydGlvbiBvZiBhIGJsYW5rIGxpbmUgZXZlcnkgc2Vjb25kIGxpbmUuIFNpZ25pZmljYW50CitlZmZvcnQgd2FzIHJlcXVpcmVkIHRvIHJldmVydCBzb21lIChidXQgbm90IGFsbCkgY2hhbmdlcy48L2xpPgorPGxpPlJlbW92ZWQgdGhyb3dzIGNsYXVzZSBmcm9tIG1ldGhvZHMgd2hpY2ggY2FuJ3QgdGhyb3cgZXhjZXB0aW9uCis8L3VsPgorCitUaGUgdGVzdCBoYXJuZXNzIGhhcyBiZWVuIGV4cGFuZGVkIHRvIGluY2x1ZGUgdW5pY29kZSBzb3VyY2UgZmlsZQorKHRoZSBidWlsZCB3b3JrcyBidXQgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSBoYXMgJ2lzc3Vlcycgd2l0aCBoaWdoIHVuaWNvZGUKK3BhY2thZ2UgYW5kIG1ldGhvZCBuYW1lcykKKworPGg0PlZlcnNpb24gMC4yPC9oND4KK0ZpcnN0IHB1YmxpYyBlZGl0aW9uLCBhZGRlZCB0byB0aGUgYW50IGN2cyB0cmVlLiBUZXN0ZWQgb24gdGhlIFBEQyBidWlsZCBvZgordGhlIGRvdG5ldCBTREsgb25seSwgYW5kIHN0aWxsIGltbWF0dXJlLiBUaGUgY29tbWFuZCBleGVjdXRpb24gY29kZSB3YXMKK3JlZmFjdG9yZWQgb3V0IGludG8gYSAnTmV0Q29tbWFuZCcgY2xhc3MgZm9yIHJlLXVzZS4gVGhlIElsYXNtIHRhc2sgd2FzIGFkZGVkCithdCB0aGlzIHRpbWUuCisKKzxoND5WZXJzaW9uIDAuMTwvaDQ+CitJbml0aWFsIHByb29mIG9mIGNvbmNlcHQ7IHZlcnkgcnVkaW1lbnRhcnkgc3VwcG9ydCBmb3IgQ1NDIG9ubHkuCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvZWNob3Byb3BlcnRpZXMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvZWNob3Byb3BlcnRpZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQyOTgxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9lY2hvcHJvcGVydGllcy5odG1sCkBAIC0wLDAgKzEsMTQ2IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkVjaG9wcm9wZXJ0aWVzIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImVjaG9wcm9wZXJ0aWVzIj5lY2hvcHJvcGVydGllczwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworPHA+RGlzcGxheXMgYWxsIHRoZSBjdXJyZW50IHByb3BlcnRpZXMgKG9yIGEgc3Vic2V0IG9mIHRoZW0gc3BlY2lmaWVkCitieSBhIG5lc3RlZCA8Y29kZT4mbHQ7cHJvcGVydHlzZXQmZ3Q7PC9jb2RlPikgaW4gdGhlIHByb2plY3QuICBUaGUKK291dHB1dCBjYW4gYmUgc2VudCB0byBhIGZpbGUgaWYgZGVzaXJlZC4gIFRoaXMgdGFzayBjYW4gYmUgdXNlZCBhcyBhCitzb21ld2hhdCBjb250cml2ZWQgbWVhbnMgb2YgcmV0dXJuaW5nIGRhdGEgZnJvbSBhbgorPHR0PiZsdDthbnQmZ3Q7PC90dD4gaW52b2NhdGlvbiwgYnV0IGlzIHJlYWxseSBmb3IgZGVidWdnaW5nIGJ1aWxkCitmaWxlcy48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHNwZWNpZmllZCwgdGhlIHZhbHVlIGluZGljYXRlcyB0aGUgbmFtZSBvZiB0aGUKKyAgICBmaWxlIHRvIHNlbmQgdGhlIG91dHB1dCBvZiB0aGUgc3RhdGVtZW50IHRvLiAgVGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZQorICAgIGlzIGNvbXBhdGlibGUgZm9yIGxvYWRpbmcgYnkgYW55IEphdmEgYXBwbGljYXRpb24gYXMgYSBwcm9wZXJ0eSBmaWxlLgorICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIG91dHB1dCB3aWxsIGdvIHRvIHRoZSBBbnQgbG9nLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByZWZpeDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgYSBwcmVmaXggd2hpY2ggaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHByb3BlcnRpZXMKKyAgICAgICAgb25seSB0aG9zZSBwcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggdGhpcyBwcmVmaXggd2lsbCBiZSBlY2hvZWQuCisgICAgICAgIDxQPgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlZ2V4PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpcyB1c2VkIHRvIGZpbHRlciB0aGUKKyAgICAgICAgcHJvcGVydGllcworICAgICAgICBvbmx5IHRob3NlIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgbWF0Y2ggaXQgd2lsbCBiZSBlY2hvZWQuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4gICAKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QnkgZGVmYXVsdCwgdGhlICJmYWlsb25lcnJvciIgYXR0cmlidXRlIGlzIGVuYWJsZWQuCisgICAgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHdyaXRpbmcgdGhlIHByb3BlcnRpZXMgdG8gYSBmaWxlLCBhbmQgdGhpcworICAgIGF0dHJpYnV0ZSBpcyBlbmFibGVkLCB0aGVuIGEgQnVpbGRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24sIGNhdXNpbmcgdGhlCisgICAgYnVpbGQgdG8gZmFpbC4gIElmIGRpc2FibGVkLCB0aGVuIElPIGVycm9ycyB3aWxsIGJlIHJlcG9ydGVkIGFzIGEgbG9nCisgICAgc3RhdGVtZW50LCBhbmQgdGhlIGJ1aWxkIHdpbGwgY29udGludWUgd2l0aG91dCBmYWlsdXJlIGZyb20gdGhpcyB0YXNrLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcm1hdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5PbmUgb2YgPGNvZGU+dGV4dDwvY29kZT4gb3IgPGNvZGU+eG1sPC9jb2RlPi4KKyAgICBEZXRlcm1pbmVzIHRoZSBvdXRwdXQgZm9ybWF0LiAgRGVmYXVsdHMgdG8gPGNvZGU+dGV4dDwvY29kZT4uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+cHJvcGVydHlzZXQ8L2g0PgorCis8cD5Zb3UgY2FuIHNwZWNpZnkgc3Vic2V0cyBvZiBwcm9wZXJ0aWVzIHRvIGJlIGVjaG9lZCB3aXRoIDxhCitocmVmPSIuLi9Db3JlVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+cHJvcGVydHlzZXQ8L2E+cy4gVXNpbmcKKzx0dD5wcm9wZXJ0eXNldDwvdHQ+cyBnaXZlcyBtb3JlIGNvbnRyb2wgb24gd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlCitwaWNrZWQgdXAuIFRoZSBhdHRyaWJ1dGVzIDx0dD5wcmVmaXg8L3R0PiBhbmQgPHR0PnJlZ2V4PC90dD4gYXJlIGp1c3QKK3Nob3JjdXRzIHRoYXQgdXNlIDx0dD5wcm9wZXJ0eXNldDwvdHQ+cyBpbnRlcm5hbGx5LgorPC9wPgorCis8cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPjxwcmU+CisgICZsdDtlY2hvcHJvcGVydGllcy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5SZXBvcnQgdGhlIGN1cnJlbnQgcHJvcGVydGllcyB0byB0aGUgbG9nLjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CisgICZsdDtlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0ibXkucHJvcGVydGllcyIvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+UmVwb3J0IHRoZSBjdXJyZW50IHByb3BlcnRpZXMgdG8gdGhlIGZpbGUgIm15LnByb3BlcnRpZXMiLCBhbmQgd2lsbAorZmFpbCB0aGUgYnVpbGQgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQgb3Igd3JpdHRlbiB0by48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorICAmbHQ7ZWNob3Byb3BlcnRpZXMgZGVzdGZpbGU9Im15LnByb3BlcnRpZXMiIGZhaWxvbmVycm9yPSJmYWxzZSIvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+UmVwb3J0IHRoZSBjdXJyZW50IHByb3BlcnRpZXMgdG8gdGhlIGZpbGUgIm15LnByb3BlcnRpZXMiLCBhbmQgd2lsbAorbG9nIGEgbWVzc2FnZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciB3cml0dGVuIHRvLCBidXQgd2lsbCBzdGlsbAorYWxsb3cgdGhlIGJ1aWxkIHRvIGNvbnRpbnVlLjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CisgICZsdDtlY2hvcHJvcGVydGllcyBwcmVmaXg9ImphdmEuIi8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5MaXN0IGFsbCBwcm9wZXJ0aWVzIGJlZ2lubmluZyB3aXRoICJqYXZhLiI8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorICAmbHQ7ZWNob3Byb3BlcnRpZXMmZ3Q7CisgICAgJmx0O3Byb3BlcnR5c2V0Jmd0OworICAgICAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0iamF2YS4iLyZndDsKKyAgICAmbHQ7L3Byb3BlcnR5c2V0Jmd0OworICAmbHQ7L2VjaG9wcm9wZXJ0aWVzJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+VGhpcyBhZ2FpbiBsaXN0cyBhbGwgcHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCAiamF2YS4iIHVzaW5nIGEgbmVzdGVkCis8dHQ+Jmx0Oy9wcm9wZXJ0eXNldCZndDs8L3R0PiB3aGljaCBpcyBhbiBlcXVpdmFsZW50IGJ1dCBsb25nZXIgd2F5LjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CisgICZsdDtlY2hvcHJvcGVydGllcyByZWdleD0iLiphbnQuKiIvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+TGlzdHMgYWxsIHByb3BlcnRpZXMgdGhhdCBjb250YWluICJhbnQiIGluIHRoZWlyIG5hbWVzLgorVGhlIGVxdWl2YWxlbnQgc25pcHBldCB3aXRoIDx0dD4mbHQ7L3Byb3BlcnR5c2V0Jmd0OzwvdHQ+IGlzOjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CisgICZsdDtlY2hvcHJvcGVydGllcyZndDsKKyAgICAmbHQ7cHJvcGVydHlzZXQmZ3Q7CisgICAgICAmbHQ7cHJvcGVydHlyZWYgcmVnZXg9Ii4qYW50LioiLyZndDsKKyAgICAmbHQ7L3Byb3BlcnR5c2V0Jmd0OworICAmbHQ7L2VjaG9wcm9wZXJ0aWVzJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2VqYi5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9lamIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjM2Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9lamIuaHRtbApAQCAtMCwwICsxLDE3NzYgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+RUpCIFRhc2tzPC90aXRsZT4KKworPC9oZWFkPgorCis8Ym9keT4KKworPGgxPkFudCBFSkIgVGFza3MgVXNlciBNYW51YWw8L2gxPgorPHA+Ynk8L3A+Cis8IS0tIE5hbWVzIGFyZSBpbiBhbHBoYWJldGljYWwgb3JkZXIsIG9uIGxhc3QgbmFtZSAtLT4KKzx1bD4KKyAgPGxpPlBhdWwgQXVzdGluICg8YSBocmVmPSJtYWlsdG86cF9kX2F1c3RpbkB5YWhvby5jb20iPnBfZF9hdXN0aW5AeWFob28uY29tPC9hPik8L2xpPgorICA8bGk+SG9sZ2VyIEVuZ2VscyAoPGEgaHJlZj0ibWFpbHRvOmhlbmdlbHNAaW5ub3ZpZGF0YS5jb20iPmhlbmdlbHNAaW5ub3ZpZGF0YS5jb208L2E+KTwvbGk+CisgIDxsaT5UaW0gRmVubmVsbCAoPGEgaHJlZj0ibWFpbHRvOnRmZW5uZUByY24uY29tIj50ZmVubmVAcmNuLmNvbTwvYT4pPC9saT4KKyAgPGxpPk1hcnRpbiBHZWUgKDxhIGhyZWY9Im1haWx0bzptYXJ0aW4uZ2VlQGljc3luZXJneS5jb20iPm1hcnRpbi5nZWVAaWNzeW5lcmd5LmNvbTwvYT4pPC9saT4KKyAgPGxpPkNvbm9yIE1hY05laWxsPC9saT4KKyAgPGxpPkN5cmlsbGUgTW9ydmFuICg8YSBocmVmPSJtYWlsdG86Y21vcnZhbkBpbmdlbm9zeWEuY29tIj5jbW9ydmFuQGluZ2Vub3N5YS5jb208L2E+KTwvbGk+CisgIDxsaT5HcmVnIE5lbHNvbiAoPGEgaHJlZj0ibWFpbHRvOmduQHN1bi5jb20iPmduQHN1bi5jb208L2E+KTwvbGk+CisgIDxsaT5Sb2IgdmFuIE9vc3RydW0oPGEgaHJlZj0ibWFpbHRvOnJvYkBzcHJpbmd3ZWxsZmFybXMuY2EiPnJvYkBzcHJpbmd3ZWxsZmFybXMuY2E8L2E+KTwvbGk+Cis8L3VsPgorCis8aHI+Cis8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPgorPHVsPgorICA8bGk+PGEgaHJlZj0iI2ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjZWpidGFza3MiPkVKQiBUYXNrczwvYT48L2xpPgorPC91bD4KKworPGhyPgorPGgyPjxhIG5hbWU9ImludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvaDI+Cis8cD5BbnQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygb3B0aW9uYWwgdGFza3MgZm9yIGRldmVsb3BpbmcgMS54IGFuZCAyLngKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiIiB0YXJnZXQ9Il90b3AiPkVudGVycHJpc2UgSmF2YSBCZWFucyAoRUpCcyk8L2E+LgorSW4gZ2VuZXJhbCB0aGVzZSB0YXNrcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHBhcnRpY3VsYXIgdmVuZG9yJ3MgRUpCIFNlcnZlci48L3A+CisKKzxwPiBUaGUgdGFza3Mgc3VwcG9ydDo8YnI+CisKKzx1bD4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuYm9ybGFuZC5jb20iPkJvcmxhbmQgPC9hPgorICBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41PC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuaXBsYW5ldC5jb20iPmlQbGFuZXQgPC9hPgorICBBcHBsaWNhdGlvbiBTZXJ2ZXIgNi4wPC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuamJvc3Mub3JnLyIgdGFyZ2V0PSJfdG9wIj4KKyAgSkJvc3MgMi4xPC9hPiBhbmQgYWJvdmUgRUpCIHNlcnZlcnM8L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5iZWEuY29tIiB0YXJnZXQ9Il90b3AiPldlYmxvZ2ljPC9hPgorICAgNC41LjEgdGhyb3VnaCB0byA3LjAgRUpCIHNlcnZlcnM8L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vYmplY3R3ZWIub3JnL2pvbmFzLyIgdGFyZ2V0PSJfdG9wIj5KT25BUzwvYT4KKyAgIDIuNC54IGFuZCAyLjUgT3BlbiBTb3VyY2UgRUpCIHNlcnZlcjwvbGk+CisgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmlibS5jb20vd2Vic3BoZXJlIj5JQk0gV2ViU3BoZXJlPC9hPiA0LjA8L2xpPgorPC91bD4KKyAgICBWZW5kb3JzIHN1Y2ggYXMgQkVBIGFuZCBJQk0gbm93IHByb3ZpZGUgY3VzdG9tIEFudCB0YXNrcyB0byB3b3JrIHdpdGggdGhlaXIKKyAgICBwYXJ0aWN1bGFyIHByb2R1Y3RzLiBNb3JlIGltcG9ydGFudGx5LCBFSkIzLjAgcmVuZGVycyB0aGlzIHdob2xlIHByb2Nlc3Mgb2Jzb2xldGUuCisgICAgQWNjb3JkaW5nbHksIGRldmVsb3BlbWVudCBvZiB0aGVzZSB0YXNrcyBpcyBlZmZlY3RpdmVseSBmcm96ZW4uIEJ1ZyByZXBvcnRzCisgICAgYW5kIGVzcGVjaWFsbHkgcGF0Y2hlcyBhcmUgd2VsY29tZSwgYnV0IHRoZXJlIGlzIG5vIHByZXNzaW5nIG5lZWQgdG8gYWRkCisgICAgc3VwcG9ydCBmb3IgbmV3IGFwcGxpY2F0aW9uIHNlcnZlcnMuIE5vYm9keSBzaG91bGQgYmUgd3JpdGluZyBuZXcgRUpCMi54IGFwcGxpY2F0aW9ucworICAgIGFuZCBkZWZpbml0ZWx5IG5vdCBuZXcgRUpCMi54IHNlcnZlcnMuCis8L3A+CisKKzxocj4KKzxoMj48YSBuYW1lPSJlamJ0YXNrcyI+RUpCIFRhc2tzPC9hPjwvaDI+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisgPHRyPjx0ZD5UYXNrPC90ZD48dGQgY29sc3Bhbj0iMiI+QXBwbGljYXRpb24gU2VydmVyczwvdGQ+PC90cj4KKyA8dHI+PHRkPjxhIGhyZWY9IkJvcmxhbmRHZW5lcmF0ZUNsaWVudC5odG1sIj5ibGdlbmNsaWVudDwvYT48L3RkPjx0ZCBjb2xzcGFuPSIyIj5Cb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciA0LjUgYW5kIDUueDwvdGQ+PC90cj4KKyA8dHI+PHRkPjxhIGhyZWY9IiNkZGNyZWF0b3IiPmRkY3JlYXRvcjwvYT48L3RkPjx0ZCBjb2xzcGFuPSIyIj5XZWJsb2dpYyA0LjUuMTwvdGQ+PC90cj4KKyA8dHI+PHRkPjxhIGhyZWY9IiNlamJjIj5lamJjPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjIiPldlYmxvZ2ljIDQuNS4xPC90ZD48L3RyPgorIDx0cj48dGQ+PGEgaHJlZj0iI2lwbGFuZXQtZWpiYyI+aXBsYW5ldC1lamJjPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjIiPmlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyIDYuMDwvdGQ+PC90cj4KKyA8dHI+PHRkIHJvd3NwYW49IjciPjxhIGhyZWY9IiNlamJqYXIiPmVqYmphcjwvYT48L3RkPjx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0iY2VudGVyIj48Yj5OZXN0ZWQgRWxlbWVudHM8L2I+PC90ZD48L3RyPgorIDx0cj48dGQ+PGEgaHJlZj0iQm9ybGFuZEVKQlRhc2tzLmh0bWwiPmJvcmxhbmQ8L2E+PC90ZD48dGQ+Qm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41IGFuZCA1Lng8L3RkPjwvdHI+CisgPHRyPjx0ZD48YSBocmVmPSIjZWpiamFyX2lwbGFuZXQiPmlQbGFuZXQ8L2E+PC90ZD48dGQ+aVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNi4wPC90ZD48L3RyPgorIDx0cj48dGQ+PGEgaHJlZj0iI2VqYmphcl9qYm9zcyI+amJvc3M8L2E+PC90ZD48dGQ+SkJvc3M8L3RkPjwvdHI+CisgPHRyPjx0ZD48YSBocmVmPSIjZWpiamFyX2pvbmFzIj5qb25hczwvYT48L3RkPjx0ZD5KT25BUyAyLjQueCBhbmQgMi41PC90ZD48L3RyPgorIDx0cj48dGQ+PGEgaHJlZj0iI2VqYmphcl93ZWJsb2dpYyI+d2VibG9naWM8L2E+PC90ZD48dGQ+V2VibG9naWMgNS4xIHRvIDcuMDwvdGQ+PC90cj4KKyA8dHI+PHRkPjxhIGhyZWY9IiNlamJqYXJfd2Vic3BoZXJlIj53ZWJzcGhlcmU8L2E+PC90ZD48dGQ+SUJNIFdlYlNwaGVyZSA0LjA8L3RkPjwvdHI+CisgPHRyPjx0ZD48YSBocmVmPSIjd2xydW4iPndscnVuPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjIiPldlYmxvZ2ljIDQuNS4xIHRvIDcuMDwvdGQ+PC90cj4KKyA8dHI+PHRkPjxhIGhyZWY9IiN3bHN0b3AiPndsc3RvcDwvYT48L3RkPjx0ZCBjb2xzcGFuPSIyIj5XZWJsb2dpYyA0LjUuMSB0byA3LjA8L3RkPjwvdHI+CisKKzwvdGFibGU+CisKKzxocj4KKzxoMj48YSBuYW1lPSJkZGNyZWF0b3IiPmRkY3JlYXRvcjwvYT48L2gyPgorPGgzPjxiPkRlc2NyaXB0aW9uOjwvYj48L2gzPgorPHA+ZGRjcmVhdG9yIHdpbGwgY29tcGlsZSBhIHNldCBvZiBXZWJsb2dpYyB0ZXh0LWJhc2VkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgaW50byBhIHNlcmlhbGl6ZWQKK0VKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBzZWxlY3Rpb24gb2Ygd2hpY2ggb2YgdGhlIHRleHQtYmFzZWQgZGVzY3JpcHRvcnMgYXJlIHRvIGJlIGNvbXBpbGVkCitpcyBiYXNlZCBvbiB0aGUgc3RhbmRhcmQgQW50IGluY2x1ZGUgYW5kIGV4Y2x1ZGUgc2VsZWN0aW9uIG1lY2hhbmlzbXMuCis8L3A+CisKKzxoMz5QYXJhbWV0ZXJzOjwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdG9yczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRlc2NyaXB0b3JzIGFyZSBzZWxlY3RlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzZXJpYWxpemVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgd2lsbCBiZSB3cml0dGVuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGlzIHRoZSBjbGFzc3BhdGggdG8gdXNlIHRvIHJ1biB0aGUgdW5kZXJseWluZyB3ZWJsb2dpYyBkZGNyZWF0b3IgdG9vbC4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBpbmNsdWRlIHRoZSA8Y29kZT53ZWJsb2dpYy5lamIudXRpbHMuRERDcmVhdG9yPC9jb2RlPiBjbGFzczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+CismbHQ7ZGRjcmVhdG9yIGRlc2NyaXB0b3JzPSZxdW90OyR7ZGQuZGlyfSZxdW90OworICAgICAgICAgICBkZXN0PSZxdW90OyR7Z2VuLmNsYXNzZXN9JnF1b3Q7CisgICAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDske2Rlc2NyaXB0b3JidWlsZC5jbGFzc3BhdGh9JnF1b3Q7Jmd0OworICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoudHh0JnF1b3Q7LyZndDsKKyZsdDsvZGRjcmVhdG9yJmd0OworPC9wcmU+CisKKzxocj4KKzxoMj48YSBuYW1lPSJlamJjIj5lamJjPC9hPjwvaDI+Cis8aDM+PGI+RGVzY3JpcHRpb246PC9iPjwvaDM+Cis8cD5UaGUgZWpiYyB0YXNrIHdpbGwgcnVuIFdlYmxvZ2ljJ3MgZWpiYyB0b29sLiBUaGlzIHRvb2wgd2lsbCB0YWtlIGEgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IsCitleGFtaW5lIHRoZSB2YXJpb3VzIEVKQiBpbnRlcmZhY2VzIGFuZCBiZWFuIGNsYXNzZXMgYW5kIHRoZW4gZ2VuZXJhdGUgdGhlIHJlcXVpcmVkIHN1cHBvcnQgY2xhc3NlcworbmVjZXNzYXJ5IHRvIGRlcGxveSB0aGUgYmVhbiBpbiBhIFdlYmxvZ2ljIEVKQiBjb250YWluZXIuIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBSTUkgc3R1YnMgYW5kIHNrZWxldG9ucworYXMgd2VsbCBhcyB0aGUgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcy48L3A+Cis8cD4KK1RoZSBhbnQgdGFzayB3aGljaCBydW5zIHRoaXMgdG9vbCBpcyBhYmxlIHRvIGNvbXBpbGUgc2V2ZXJhbCBiZWFucyBpbiBhIHNpbmdsZSBvcGVyYXRpb24uIFRoZSBiZWFucyB0byBiZQorY29tcGlsZWQgYXJlIHNlbGVjdGVkIGJ5IGluY2x1ZGluZyB0aGVpciBzZXJpYWxpemVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuIFRoZSBzdGFuZGFyZCBhbnQKKzxjb2RlPmluY2x1ZGU8L2NvZGU+IGFuZCA8Y29kZT5leGNsdWRlPC9jb2RlPiBjb25zdHJ1Y3RzIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycwordG8gYmUgaW5jbHVkZWQuIDwvcD4KKzxwPgorRWFjaCBkZXNjcmlwdG9yIGlzIGV4YW1pbmVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyBhcmUgb3V0IG9mIGRhdGUgYW5kIG5lZWQgdG8gYmUKK3JlZ2VuZXJhdGVkLiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIGRlLXNlcmlhbGl6ZWQgdG8gZGlzY292ZXIgdGhlIGhvbWUsIHJlbW90ZSBhbmQKK2ltcGxlbWVudGF0aW9uIGNsYXNzZXMuIFRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlcyBhcmUgZGV0ZXJtaW5lZCBhbmQgY2hlY2tlZCB0byBzZWUgdGhlaXIKK21vZGlmaWNhdGlvbiB0aW1lcy4gVGhlc2UgdGltZXMgYW5kIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgc2VyaWFsaXplZCBkZXNjcmlwdG9yIGl0c2VsZiBhcmUKK2NvbXBhcmVkIHdpdGggdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy4gSWYgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIGFyZSBub3QgcHJlc2VudAorb3IgYXJlIG91dCBvZiBkYXRlLCB0aGUgZWpiYyB0b29sIGlzIHJ1biB0byBnZW5lcmF0ZSBuZXcgdmVyc2lvbnMuPC9wPgorPGgzPlBhcmFtZXRlcnM6PC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc2NyaXB0b3JzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGhlIHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhcmUgc2VsZWN0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGJhc2UgZGlyZWN0b3J5IHdoZXJlIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcywgUklNIHN0dWJzIGFuZCBSTUkgc2tlbGV0b25zIGFyZSB3cml0dGVuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmlmZXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgbWFuaWZlc3QgZmlsZSB0byBiZSB3cml0dGVuLiBUaGlzIG1hbmlmZXN0IHdpbGwgY29udGFpbiBhbiBlbnRyeSBmb3IgZWFjaCBFSkIgcHJvY2Vzc2VkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHNvdXJjZSB0cmVlIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlcyBvZiB0aGUgaG9tZSBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICByZW1vdGUgaW50ZXJmYWNlIGFuZCBiZWFuIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGNsYXNzcGF0aCBtdXN0IGluY2x1ZGUgYm90aCB0aGUgPGNvZGU+d2VibG9naWMuZWpiYzwvY29kZT4gY2xhc3MgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgY2xhc3MgZmlsZXMgb2YgdGhlIGJlYW4sIGhvbWUgaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlLCBldGMgb2YgdGhlIGJlYW4gYmVpbmcKKyAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5rZWVwZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQ+Q29udHJvbHMgd2hldGhlciBlamJjIHdpbGwga2VlcCB0aGUKKyAgICAgICAgaW50ZXJtZWRpYXRlIEphdmEgZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgY2xhc3MgZmlsZXMuIFRoaXMgY2FuIGJlCisgICAgICAgIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZy48L3RkPgorICAgIDx0ZD5ObywgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyZsdDtlamJjIGRlc2NyaXB0b3JzPSZxdW90OyR7Z2VuLmNsYXNzZXN9JnF1b3Q7CisgICAgICAgICAgIHNyYz0mcXVvdDske3NyYy5kaXJ9JnF1b3Q7CisgICAgICAgICAgIGRlc3Q9JnF1b3Q7JHtnZW4uY2xhc3Nlc30mcXVvdDsKKyAgICAgICAgICAgbWFuaWZlc3Q9JnF1b3Q7JHtidWlsZC5tYW5pZmVzdH0mcXVvdDsKKyAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7ZGVzY3JpcHRvcmJ1aWxkLmNsYXNzcGF0aH0mcXVvdDsmZ3Q7CisgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7Ki5zZXImcXVvdDsvJmd0OworJmx0Oy9lamJjJmd0OworPC9wcmU+CisKKzxocj4KKzxoMj4KKzxhIE5BTUU9ImlwbGFuZXQtZWpiYyI+PC9hPmlwbGFuZXQtZWpiYzwvaDI+CisKKzxoMz4KKzxiPkRlc2NyaXB0aW9uOjwvYj48L2gzPgorVGFzayB0byBjb21waWxlIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zIGZvciB0aGUgaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIKKzYuMC4gIEdpdmVuIGEgc3RhbmRhcmQgRUpCIDEuMSBYTUwgZGVzY3JpcHRvciBhcyB3ZWxsIGFzIGFuIGlBUy1zcGVjaWZpYworRUpCIGRlc2NyaXB0b3IsIHRoaXMgdGFzayB3aWxsIGdlbmVyYXRlIHRoZSBzdHVicyBhbmQgc2tlbGV0b25zIHJlcXVpcmVkCit0byBkZXBsb3kgdGhlIEVKQiB0byBpQVMuICBTaW5jZSB0aGUgWE1MIGRlc2NyaXB0b3JzIGNhbiBpbmNsdWRlIG11bHRpcGxlCitFSkJzLCB0aGlzIGlzIGEgY29udmVuaWVudCB3YXkgb2Ygc3BlY2lmeWluZyBtYW55IEVKQnMgaW4gYSBzaW5nbGUgQW50Cit0YXNrLgorPHA+Rm9yIGVhY2ggRUpCIHNwZWNpZmllZCwgdGhlIHRhc2sgd2lsbCBsb2NhdGUgdGhlIHRocmVlIGNsYXNzZXMgdGhhdAorY29tcHJpc2UgdGhlIEVKQiBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LiAgSWYgdGhlc2UgY2xhc3MgZmlsZXMKK2Nhbm5vdCBiZSBsb2NhdGVkIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIHRoZSB0YXNrIHdpbGwgZmFpbC4gVGhlCit0YXNrIHdpbGwgYWxzbyBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgaW4gdGhpcyBkaXJlY3RvcnkuCitJZiBmb3VuZCwgdGhlIHRpbWVzdGFtcHMgb24gdGhlIHN0dWJzIGFuZCBza2VsZXRvbnMgd2lsbCBiZSBjaGVja2VkIHRvCitlbnN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZS4gT25seSBpZiB0aGVzZSBmaWxlcyBjYW5ub3QgYmUgZm91bmQgb3IgaWYgdGhleQorYXJlIG91dCBvZiBkYXRlIHdpbGwgdGhlIGlBUyBlamJjIHV0aWxpdHkgYmUgY2FsbGVkIHRvIGdlbmVyYXRlIG5ldyBzdHVicworYW5kIHNrZWxldG9ucy48L3A+Cis8aDM+CitQYXJhbWV0ZXJzOjwvaDM+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+Cis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorCis8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisKKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCB2YWxpZ249InRvcCI+ZWpiZGVzY3JpcHRvcjwvdGQ+CisKKzx0ZCB2YWxpZ249InRvcCI+U3RhbmRhcmQgRUpCIDEuMSBYTUwgZGVzY3JpcHRvciAodHlwaWNhbGx5IHRpdGxlZCAiZWpiLWphci54bWwiKS48L3RkPgorCis8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPmlhc2Rlc2NyaXB0b3I8L3RkPgorCis8dGQgdmFsaWduPSJ0b3AiPmlBUy1zcGVjaWZpYyBFSkIgWE1MIGRlc2NyaXB0b3IgKHR5cGljYWxseSB0aXRsZWQgImlhcy1lamItamFyLnhtbCIpLjwvdGQ+CisKKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCB2YWxpZ249InRvcCI+ZGVzdDwvdGQ+CisKKzx0ZCB2YWxpZ249InRvcCI+VGhlIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgUk1JIHN0dWJzIGFuZCBza2VsZXRvbnMKK2FyZSB3cml0dGVuLiBJbiBhZGRpdGlvbiwgdGhlIGNsYXNzIGZpbGVzIGZvciBlYWNoIGJlYW4gKGhvbWUgaW50ZXJmYWNlLAorcmVtb3RlIGludGVyZmFjZSwgYW5kIEVKQiBpbXBsZW1lbnRhdGlvbikgbXVzdCBiZSBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeS48L3RkPgorCis8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisKKzx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB1c2VkIHdoZW4gZ2VuZXJhdGluZyBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucy4KK0lmIG9taXR0ZWQsIHRoZSBjbGFzc3BhdGggc3BlY2lmaWVkIHdoZW4gQW50IHdhcyBzdGFydGVkIHdpbGwgYmUgdXNlZC4KK05lc3RlZCAiY2xhc3NwYXRoIiBlbGVtZW50cyBtYXkgYWxzbyBiZSB1c2VkLjwvdGQ+CisKKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIHZhbGlnbj0idG9wIj5rZWVwZ2VuZXJhdGVkPC90ZD4KKworPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIEphdmEgc291cmNlIGZpbGVzIHdoaWNoIGFyZQorZ2VuZXJhdGVkIGJ5IGVqYmMgd2lsbCBiZSBzYXZlZCBvciBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuIElmICJ5ZXMiLCB0aGUKK3NvdXJjZSBmaWxlcyB3aWxsIGJlIHJldGFpbmVkLiBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byAibm8iLiA8L3RkPgorCis8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCB2YWxpZ249InRvcCI+ZGVidWc8L3RkPgorCis8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBlamJjIHV0aWxpdHkgc2hvdWxkIGxvZyBhZGRpdGlvbmFsIGRlYnVnZ2luZworc3RhdGVtZW50cyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiBJZiAieWVzIiwgdGhlIGFkZGl0aW9uYWwgZGVidWdnaW5nIHN0YXRlbWVudHMKK3dpbGwgYmUgZ2VuZXJhdGVkLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIm5vIi4gPC90ZD4KKworPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj4KKzxjZW50ZXI+Tm88L2NlbnRlcj4KKzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPmlhc2hvbWU8L3RkPgorCis8dGQ+TWF5IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgImhvbWUiIGRpcmVjdG9yeSBmb3IgdGhpcyBpQVMgaW5zdGFsbGF0aW9uLgorVGhpcyBpcyB1c2VkIHRvIGZpbmQgdGhlIGVqYmMgdXRpbGl0eSBpZiBpdCBpc24ndCBpbmNsdWRlZCBpbiB0aGUgdXNlcidzCitzeXN0ZW0gcGF0aC4gSWYgc3BlY2lmaWVkLCBpdCBzaG91bGQgcmVmZXIgdG8gdGhlICJbaW5zdGFsbC1sb2NhdGlvbl0vaXBsYW5ldC9pYXM2L2lhcyIKK2RpcmVjdG9yeS4gSWYgb21pdHRlZCwgdGhlIGVqYmMgdXRpbGl0eSBtdXN0IGJlIG9uIHRoZSB1c2VyJ3Mgc3lzdGVtIHBhdGguIDwvdGQ+CisKKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorPC90cj4KKzwvdGFibGU+CisKKzxoMz4KK0V4YW1wbGVzPC9oMz4KKworPHByZT4KKyZsdDtpcGxhbmV0LWVqYmMgZWpiZGVzY3JpcHRvcj0iZWpiLWphci54bWwiCisgICAgICAgICAgICAgIGlhc2Rlc2NyaXB0b3I9Imlhcy1lamItamFyLnhtbCIKKyAgICAgICAgICAgICAgZGVzdD0iJHtidWlsZC5jbGFzc2VzZGlyfSIKKyAgICAgICAgICAgICAgY2xhc3NwYXRoPSIke2lhcy5lamJjLmNwYXRofSIvJmd0OworCisKKyZsdDtpcGxhbmV0LWVqYmMgZWpiZGVzY3JpcHRvcj0iZWpiLWphci54bWwiCisgICAgICAgICAgICAgIGlhc2Rlc2NyaXB0b3I9Imlhcy1lamItamFyLnhtbCIKKyAgICAgICAgICAgICAgZGVzdD0iJHtidWlsZC5jbGFzc2VzZGlyfSIKKyAgICAgICAgICAgICAga2VlcGdlbmVyYXRlZD0ieWVzIgorICAgICAgICAgICAgICBkZWJ1Zz0ieWVzIgorICAgICAgICAgICAgICBpYXNob21lPSIke2lhcy5ob21lfSImZ3Q7CisgICAgICAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0iLiIvJmd0OworICAgICAgICAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGQuY2xhc3NwYXRofSIvJmd0OworICAgICAgICAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyZsdDsvaXBsYW5ldC1lamJjJmd0OworCisKKzwvcHJlPgorCis8aHI+Cis8aDI+PGEgbmFtZT0id2xydW4iPndscnVuPC9hPjwvaDI+Cis8aDM+PGI+RGVzY3JpcHRpb246PC9iPjwvaDM+CisKKzxwPlRoZSA8Y29kZT53bHJ1bjwvY29kZT4gdGFzayBpcyB1c2VkIHRvIHN0YXJ0IGEgd2VibG9naWMgc2VydmVyLiBUaGUgdGFzayBydW5zCithIHdlYmxvZ2ljIGluc3RhbmNlIGluIGEgc2VwYXJhdGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUuIEEgbnVtYmVyIG9mIHBhcmFtZXRlcnMKK2FyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIG9wZXJhdGlvbiBvZiB0aGUgd2VibG9naWMgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGUgdGFzaywKK2FuZCBoZW5jZSBhbnQsIHdpbGwgbm90IGNvbXBsZXRlIHVudGlsIHRoZSB3ZWJsb2dpYyBpbnN0YW5jZSBpcyBzdG9wcGVkLjwvcD4KKworPGgzPlBhcmFtZXRlcnM6PC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkIGZvciA0LjUuMSBhbmQgNS4xPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZCBmb3IgNi4wPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkJFQSBIb21lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhdGlvbiBvZiB0aGUgQkVBIEhvbWUgd2hlcmUgdGhlIHNlcnZlcidzIGNvbmZpZyBpcyBkZWZpbmVkLgorICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgd2xydW4gYXNzdW1lcyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbAorICAgICAgICAgICAgICAgICAgICAgYmUgcnVubmluZyB1bmRlciBXZWJsb2dpYyA2LjA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmhvbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWJsb2dpYyBob21lIHRoYXQgaXMgdG8gYmUgdXNlZC4gVGhpcyBpcyB0aGUgbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHdlYmxvZ2ljIGlzIGluc3RhbGxlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcy4gTm90ZSB0aGlzIGlzIHRoZSBhYnNvbHV0ZSBsb2NhdGlvbiwgbm90IHJlbGF0aXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUEgaG9tZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Eb21haW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRvbWFpbiB0byB3aGljaCB0aGUgc2VydmVyIGJlbG9uZ3MuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdpdGggdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIHRoYXQgcnVucyB0aGUgV2VibG9naWMKKyAgICAgICAgICAgICAgICAgICAgIFNlcnZlci4gUHJpb3IgdG8gV2VibG9naWMgNi4wLCB0aGlzIGlzIHR5cGljYWxseSBzZXQgdG8gdGhlIFdlYmxvZ2ljCisgICAgICAgICAgICAgICAgICAgICBib290IGNsYXNzcGF0aC4gVW5kZXIgV2VibG9naWMgNi4wIHRoaXMgc2hvdWxkIGluY2x1ZGUgYWxsIHRoZQorICAgICAgICAgICAgICAgICAgICAgd2VibG9naWMgamFyczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2xjbGFzc3BhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHdlYmxvZ2ljIGNsYXNzcGF0aCB1c2VkIGJ5IHRoZSBXZWJsb2dpYyBTZXJ2ZXIuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnRpZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHByb3BlcnRpZXMgZmlsZSB3aXRoaW4gdGhlIHdlYmxvZ2ljIGhvbWUgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbnRyb2wgdGhlIHdlYmxvZ2ljIGluc3RhbmNlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgd2VibG9naWMgc2VydmVyIHdpdGhpbiB0aGUgd2VibG9naWMgaG9tZSB3aGljaCBpcyB0byBiZSBydW4uCisgICAgICAgICAgICAgICAgICAgICBUaGlzIGRlZmF1bHRzIHRvICZxdW90O215c2VydmVyJnF1b3Q7PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cG9saWN5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSBwb2xpY3kgZmlsZSB3aXRoaW4gdGhlIHdlYmxvZ2ljIGhvbWUgZGlyZWN0b3J5IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgIGlzIHRvIGJlIHVzZWQuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHBvbGljeSBmaWxlIDxjb2RlPndlYmxvZ2ljLnBvbGljeTwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG1hbmFnZW1lbnQgdXNlcm5hbWUgdXNlZCB0byBtYW5hZ2UgdGhlIHNlcnZlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc2VydmVyJ3MgbWFuYWdlbWVudCBwYXNzd29yZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGtQYXNzd29yZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJpdmF0ZSBrZXkgcGFzc3dvcmQgc28gdGhlIHNlcnZlciBjYW4gZGVjcnlwdCB0aGUgU1NMCisgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGtleSBmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmp2bWFyZ3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QWRkaXRpb25hbCBhcmd1bWVudCBzdHJpbmcgcGFzc2VkIHRvIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSB1c2VkIHRvIHJ1biB0aGUKKyAgICAgICAgICAgICAgICAgICAgIFdlYmxvZ2ljIGluc3RhbmNlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPndlYmxvZ2ljTWFpbkNsYXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWUgb2YgdGhlIG1haW4gY2xhc3MgZm9yIHdlYmxvZ2ljPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5OZXN0ZWQgRWxlbWVudHM8L2gzPgorCis8cD5UaGUgd2xydW4gdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7d2xjbGFzc3BhdGgmZ3Q7PC9jb2RlPgorZWxlbWVudHMgdG8gc2V0IHRoZSByZXNwZWN0aXZlIGNsYXNzcGF0aHMuPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorCis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgdGhlIHVzZSBvZiB3bHJ1biB0byBydW4gYSBzZXJ2ZXIgdW5kZXIgV2VibG9naWMgNS4xPC9wPgorCis8cHJlPgorICAgICZsdDt3bHJ1biB0YXNrbmFtZT0mcXVvdDtteXNlcnZlciZxdW90OworICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHt3ZWJsb2dpYy5ib290LmNsYXNzcGF0aH0mcXVvdDsKKyAgICAgICAgICAgd2xjbGFzc3BhdGg9JnF1b3Q7JHt3ZWJsb2dpYy5jbGFzc2VzfToke2NvZGUuamFyc30mcXVvdDsKKyAgICAgICAgICAgbmFtZT0mcXVvdDtteXNlcnZlciZxdW90OworICAgICAgICAgICBob21lPSZxdW90OyR7d2VibG9naWMuaG9tZX0mcXVvdDsKKyAgICAgICAgICAgcHJvcGVydGllcz0mcXVvdDtteXNlcnZlci9teXNlcnZlci5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKzwvcHJlPgorCis8cD5UaGlzIGV4YW1wbGUgc2hvd3Mgd2xydW4gYmVpbmcgdXNlZCB0byBydW4gdGhlIHBldHN0b3JlIHNlcnZlciB1bmRlcgorV2VibG9naWMgNi4wPC9wPgorCis8cHJlPgorICAgICZsdDt3bHJ1biB0YXNrbmFtZT0mcXVvdDtwZXRzdG9yZSZxdW90OworICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHt3ZWJsb2dpYy5jbGFzc2VzfSZxdW90OworICAgICAgICAgICBuYW1lPSZxdW90O3BldHN0b3JlU2VydmVyJnF1b3Q7CisgICAgICAgICAgIGRvbWFpbj0mcXVvdDtwZXRzdG9yZSZxdW90OworICAgICAgICAgICBob21lPSZxdW90OyR7d2VibG9naWMuaG9tZX0mcXVvdDsKKyAgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7cGV0c3RvcmVQYXNzd29yZCZxdW90OworICAgICAgICAgICBiZWFob21lPSZxdW90OyR7YmVhLmhvbWV9JnF1b3Q7LyZndDsKKzwvcHJlPgorCis8aHI+Cis8aDI+PGEgbmFtZT0id2xzdG9wIj53bHN0b3A8L2E+PC9oMj4KKzxoMz48Yj5EZXNjcmlwdGlvbjo8L2I+PC9oMz4KKworPHA+VGhlIDxjb2RlPndsc3RvcDwvY29kZT4gdGFzayBpcyB1c2VkIHRvIHN0b3AgYSB3ZWJsb2dpYyBpbnN0YW5jZSB3aGljaCBpcworY3VycmVudGx5IHJ1bm5pbmcuIFRvIHNodXQgZG93biBhbiBpbnN0YW5jZSB5b3UgbXVzdCBzdXBwbHkgYm90aCBhIHVzZXJuYW1lIGFuZAorYSBwYXNzd29yZC4gVGhlc2Ugd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGNsZWFyIGluIHRoZSBidWlsZCBzY3JpcHQgdXNlZCB0byBzdG9wCit0aGUgaW5zdGFuY2UuIEZvciBzZWN1cml0eSByZWFzb25zLCB0aGlzIHRhc2sgaXMgdGhlcmVmb3JlIG9ubHkgYXBwcm9wcmlhdGUgaW4gYQorZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIDwvcD4KKworPHA+VGhpcyB0YXNrIHdvcmtzIGZvciBtb3N0IHZlcnNpb24gb2YgV2VibG9naWMsIGluY2x1ZGluZyA2LjAuIFlvdSBuZWVkIHRvCitzcGVjaWZ5IHRoZSBCRUEgSG9tZSB0byBoYXZlIHRoaXMgdGFzayB3b3JrIGNvcnJlY3RseSB1bmRlciA2LjA8L3A+CisKKzxoMz5QYXJhbWV0ZXJzOjwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5CRUFIb21lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgYXR0cmlidXRlIHNlbGVjdHMgV2VibG9naWMgNi4wIHNodXRkb3duLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2l0aCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdGhhdCBydW5zIHRoZSBXZWJsb2dpYworICAgICAgICAgICAgICAgICAgICAgU2h1dGRvd24gY29tbWFuZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdXNlcm5hbWUgb2YgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHNodXRkb3duIHRoZSBzZXJ2ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhc3N3b3JkIGZvciB0aGUgYWNjb3VudCBzcGVjaWZpZWQgaW4gdGhlIHVzZXIgcGFyYW1ldGVyLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51cmw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIFVSTCB3aGljaCBkZXNjcmliZXMgdGhlIHBvcnQgdG8gd2hpY2ggdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgZm9yIFQzIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHQzOi8vbG9jYWxob3N0OjcwMDE8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVsYXk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRlbGF5IGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHNlcnZlciB3aWxsIHN0b3AuIFRoaXMgZGVmYXVsdHMgdG8gYW4KKyAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZSBzaHV0ZG93bi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPk5lc3RlZCBFbGVtZW50PC9oMz4KKworPHA+VGhlIGNsYXNzcGF0aCBvZiB0aGUgd2xzdG9wIHRhc2sgY2FuIGJlIHNldCBieSBhIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudC48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPlRoaXMgZXhhbXBsZSBzaG93IHRoZSBzaHV0ZG93biBmb3IgYSBXZWJsb2dpYyA2LjAgc2VydmVyPC9wPgorCis8cHJlPgorICAgICZsdDt3bHN0b3AgY2xhc3NwYXRoPSZxdW90OyR7d2VibG9naWMuY2xhc3Nlc30mcXVvdDsKKyAgICAgICAgICAgIHVzZXI9JnF1b3Q7c3lzdGVtJnF1b3Q7CisgICAgICAgICAgICB1cmw9JnF1b3Q7dDM6Ly9sb2NhbGhvc3Q6NzAwMSZxdW90OworICAgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7Zm9vYmFyJnF1b3Q7CisgICAgICAgICAgICBiZWFob21lPSZxdW90OyR7YmVhLmhvbWV9JnF1b3Q7LyZndDsKKzwvcHJlPgorCis8aHI+CisKKzxoMj48YSBuYW1lPSJlamJqYXIiPmVqYmphcjwvYT48L2gyPgorPGgzPjxiPkRlc2NyaXB0aW9uOjwvYj48L2gzPgorCis8cD5UaGlzIHRhc2sgaXMgZGVzaWduZWQgdG8gc3VwcG9ydCBidWlsZGluZyBvZiBFSkIgamFyIGZpbGVzIChFSkIgMS4xICZhbXA7IDIuMCkuCitTdXBwb3J0IGlzIGN1cnJlbnRseSBwcm92aWRlZCBmb3IgJ3ZhbmlsbGEnIEVKQiBqYXIgZmlsZXMgLSBpLmUuIHRob3NlIGNvbnRhaW5pbmcgb25seQordGhlIHVzZXIgZ2VuZXJhdGVkIGNsYXNzIGZpbGVzIGFuZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBOZXN0ZWQKK2VsZW1lbnRzIHByb3ZpZGUgc3VwcG9ydCBmb3IgdmVuZG9yIHNwZWNpZmljIGRlcGxveW1lbnQgdG9vbHMuIFRoZXNlIGN1cnJlbnRseQoraW5jbHVkZTogPC9wPgorPHVsPgorICA8bGk+Qm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41PC9saT4KKyAgPGxpPmlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyIDYuMDwvbGk+CisgIDxsaT5KQm9zcyAyLjEgYW5kIGFib3ZlPC9saT4KKyAgPGxpPldlYmxvZ2ljIDUuMS82LjAgc2Vzc2lvbi9lbnRpdHkgYmVhbnMgdXNpbmcgdGhlIHdlYmxvZ2ljLmVqYmMgdG9vbDwvbGk+CisgIDxsaT5JQk0gV2ViU3BoZXJlIDQuMDwvbGk+CisgIDxsaT5UT1BMaW5rIGZvciBXZWJMb2dpYyAyLjUuMS1lbmFibGVkIGVudGl0eSBiZWFuczwvbGk+CisgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9iamVjdHdlYi5vcmcvam9uYXMvIj5KT25BUzwvYT4gMi40LnggYW5kIDIuNSBPcGVuIFNvdXJjZSBFSkIgc2VydmVyPC9saT4KKzwvdWw+CisKKworPHA+VGhlIHRhc2sgd29ya3MgYXMgYSBkaXJlY3Rvcnkgc2Nhbm5pbmcgdGFzaywgYW5kIHBlcmZvcm1zIGFuIGFjdGlvbiBmb3IgZWFjaAorZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvdW5kLiBBcyBzdWNoIHRoZSBpbmNsdWRlcyBhbmQgZXhjbHVkZXMgc2hvdWxkIGJlIHNldAordG8gZW5zdXJlIHRoYXQgYWxsIGRlc2lyZWQgRUpCIGRlc2NyaXB0b3JzIGFyZSBmb3VuZCwgYnV0IG5vIGFwcGxpY2F0aW9uCitzZXJ2ZXIgZGVzY3JpcHRvcnMgYXJlIGZvdW5kLiBGb3IgZWFjaCBkZXNjcmlwdG9yIGZvdW5kLCBlamJqYXIgd2lsbCBwYXJzZSB0aGUKK2RlcGxveW1lbnQgZGVzY3JpcHRvciB0byBkZXRlcm1pbmUgdGhlIG5lY2Vzc2FyeSBjbGFzcyBmaWxlcyB3aGljaCBpbXBsZW1lbnQgdGhlCitiZWFuLiBUaGVzZSBmaWxlcyBhcmUgYXNzZW1ibGVkIGFsb25nIHdpdGggdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgaW50byBhCit3ZWxsIGZvcm1lZCBFSkIgamFyIGZpbGUuIEFueSBzdXBwb3J0IGZpbGVzIHdoaWNoIG5lZWQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCitnZW5lcmF0ZWQgamFyIGNhbiBiZSBhZGRlZCB3aXRoIHRoZSA8Y29kZT4mbHQ7c3VwcG9ydCZndDs8L2NvZGU+IG5lc3RlZCBlbGVtZW50LiBGb3IgZWFjaAorY2xhc3MgaW5jbHVkZWQgaW4gdGhlIGphciwgZWpiamFyIHdpbGwgc2NhbiBmb3IgYW55IHN1cGVyIGNsYXNzZXMgb3Igc3VwZXIKK2ludGVyZmFjZXMuIFRoZXNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBqYXIuPC9wPgorCis8cD5JZiBubyBuZXN0ZWQgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZSB0YXNrIHdpbGwKK3NpbXBseSBnZW5lcmF0ZSBhIGdlbmVyaWMgRUpCIGphci4gU3VjaCBqYXJzIGFyZSB0eXBpY2FsbHkgdXNlZCBhcyB0aGUgaW5wdXQgdG8KK3ZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IHRvb2xzLiBGb3IgZWFjaCBuZXN0ZWQgZGVwbG95bWVudCBlbGVtZW50LCBhIHZlbmRvcgorc3BlY2lmaWMgZGVwbG95bWVudCB0b29sIGlzIHJ1biB0byBnZW5lcmF0ZSBhIGphciBmaWxlIHJlYWR5IGZvciBkZXBsb3ltZW50IGluCit0aGF0IHZlbmRvcidzIEVKQiBjb250YWluZXIuIDwvcD4KKworPHA+VGhlIGphciBmaWxlcyBhcmUgb25seSBidWlsdCBpZiB0aGV5IGFyZSBvdXQgb2YgZGF0ZS4gIEVhY2ggZGVwbG95bWVudCB0b29sCitlbGVtZW50IHdpbGwgZXhhbWluZSBpdHMgdGFyZ2V0IGphciBmaWxlIGFuZCBkZXRlcm1pbmUgaWYgaXQgaXMgb3V0IG9mIGRhdGUgd2l0aAorcmVzcGVjdCB0byB0aGUgY2xhc3MgZmlsZXMgYW5kIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgdGhhdCBtYWtlIHVwIHRoZSBiZWFuLiBJZgorYW55IG9mIHRoZXNlIGZpbGVzIGFyZSBuZXdlciB0aGFuIHRoZSBqYXIgZmlsZSB0aGUgamFyIHdpbGwgYmUgcmVidWlsdCBvdGhlcndpc2UKK2EgbWVzc2FnZSBpcyBsb2dnZWQgdGhhdCB0aGUgamFyIGZpbGUgaXMgdXAgdG8gZGF0ZS48L3A+CisKKzxwPlRoZSB0YXNrIHVzZXMgdGhlCis8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2JjZWwiPiBqYWthcnRhLUJDRUwgPC9hPiBmcmFtZXdvcmsKK3RvIGV4dHJhY3QgYWxsIGRlcGVuZGVudCBjbGFzc2VzLiBUaGlzCittZWFucyB0aGF0LCBpbiBhZGRpdGlvbiB0byB0aGUgY2xhc3NlcyB0aGF0IGFyZSBtZW50aW9uZWQgaW4gdGhlCitkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFueSBjbGFzc2VzIHRoYXQgdGhlc2UgZGVwZW5kIG9uIGFyZSBhbHNvCithdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIHRoZSBqYXIgZmlsZS48L3A+CisKKworPGgzPk5hbWluZyBDb252ZW50aW9uPC9oMz4KKworRWpiamFyIGhhbmRsZXMgdGhlIHByb2Nlc3Npbmcgb2YgbXVsdGlwbGUgYmVhbnMsIGFuZCBpdCB1c2VzIGEgc2V0IG9mIG5hbWluZworY29udmVudGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgRUpCIGphcnMuIFRoZSBuYW1pbmcgY29udmVudGlvbgordGhhdCBpcyB1c2VkIGlzIGNvbnRyb2xsZWQgYnkgdGhlICZxdW90O25hbWluZyZxdW90OyBhdHRyaWJ1dGUuIEl0IHN1cHBvcnRzIHRoZQorZm9sbG93aW5nIHZhbHVlcworPHVsPgorCis8bGk+ZGVzY3JpcHRvcjwvbGk+Cis8cD5UaGlzIGlzIHRoZSBkZWZhdWx0IG5hbWluZyBzY2hlbWUuIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgYmVhbiBpcyBkZXJpdmVkIGZyb20gdGhlCituYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBGb3IgYW4gQWNjb3VudCBiZWFuLCBmb3IgZXhhbXBsZSwgdGhlIGRlcGxveW1lbnQKK2Rlc2NyaXB0b3Igd291bGQgYmUgbmFtZWQgPGNvZGU+QWNjb3VudC1lamItamFyLnhtbDwvY29kZT4uIFZlbmRvciBzcGVjaWZpYyBkZXNjcmlwdG9ycyBhcmUKK2xvY2F0ZWQgdXNpbmcgdGhlIHNhbWUgbmFtaW5nIGNvbnZlbnRpb24uIFRoZSB3ZWJsb2dpYyBiZWFuLCBmb3IgZXhhbXBsZSwgd291bGQgYmUgbmFtZWQKKzxjb2RlPkFjY291bnQtd2VibG9naWMtZWpiLWphci54bWw8L2NvZGU+LiBVbmRlciB0aGlzIGFycmFuZ2VtZW50LCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycworY2FuIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBjb2RlIGltcGxlbWVudGluZyB0aGUgYmVhbnMsIHdoaWNoIGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUgc2FtZSBiZWFuIGNvZGUKK2lzIGRlcGxveWVkIGluIHNlcGFyYXRlIGJlYW5zLgorPC9wPgorCis8cD5UaGlzIHNjaGVtZSBpcyB1c2VmdWwgd2hlbiB5b3UgYXJlIHVzaW5nIG9uZSBiZWFuIHBlciBFSkIgamFyIGFuZCB3aGVyZSB5b3UgbWF5IGJlCitkZXBsb3lpbmcgdGhlIHNhbWUgYmVhbiBjbGFzc2VzIGluIGRpZmZlcmVudCBiZWFucywgd2l0aCBkaWZmZXJlbnQgZGVwbG95bWVudCBjaGFyYWN0ZXJpc3RpY3MuCisKKzxsaT5lamItbmFtZTwvbGk+Cis8cD4gVGhpcyBuYW1pbmcgc2NoZW1lIHVzZXMgdGhlIDxjb2RlPiZsdDtlamItbmFtZSZndDs8L2NvZGU+IGVsZW1lbnQgZnJvbSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvCitkZXRlcm1pbmUgdGhlIGJlYW4gbmFtZS4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBkZXNjcmlwdG9ycyBub3JtYWxseSB1c2UgdGhlIGdlbmVyaWMKK2Rlc2NyaXB0b3IgbmFtZXMsIHN1Y2ggYXMgPGNvZGU+ZWpiLWphci54bWw8L2NvZGU+IGFsb25nIHdpdGggYW55IGFzc29jaWF0ZWQgdmVuZG9yIHNwZWNpZmljIGRlc2NyaXB0b3IKK25hbWVzLiBGb3IgZXhhbXBsZSwgSWYgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT4mbHQ7ZWpiLW5hbWUmZ3Q7PC9jb2RlPiB3ZXJlIHRvIGJlIGdpdmVuIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKK2FzIGZvbGxvd3M6Cis8cHJlPgorJmx0O2VqYi1qYXImZ3Q7CisgICAgJmx0O2VudGVycHJpc2UtYmVhbnMmZ3Q7CisgICAgICAgICZsdDtlbnRpdHkmZ3Q7CisgICAgICAgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7U2FtcGxlJmx0Oy9lamItbmFtZSZndDsKKyAgICAgICAgICAgICZsdDtob21lJmd0O29yZy5hcGFjaGUuYW50LmVqYnNhbXBsZS5TYW1wbGVIb21lJmx0Oy9ob21lJmd0OworPC9wcmU+CisKK3RoZW4gdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBiZWFuIHdvdWxkIGJlIDxjb2RlPlNhbXBsZS5qYXI8L2NvZGU+Cis8L3A+Cis8cD4gVGhpcyBzY2hlbWUgaXMgdXNlZnVsIHdoZXJlIHlvdSB3YW50IHRvIHVzZSB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yIG5hbWVzLCB3aGljaCBtYXkgYmUgbW9yZQorY29tcGF0aWJsZSB3aXRoIG90aGVyIEVKQiB0b29scy4gVGhpcyBzY2hlbWUgbXVzdCBoYXZlIG9uZSBiZWFuIHBlciBqYXIuCis8L3A+Cis8bGk+ZGlyZWN0b3J5PC9saT4KKzxwPgorSW4gdGhpcyBtb2RlLCB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGJlYW4gamFyIGlzIGRlcml2ZWQgZnJvbSB0aGUgZGlyZWN0b3J5Citjb250YWluaW5nIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiBBZ2FpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyB0eXBpY2FsbHkgdXNlCit0aGUgc3RhbmRhcmQgZmlsZW5hbWVzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHBhdGggdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcworPGNvZGU+L2hvbWUvdXNlci9kZXYvYXBwc2VydmVyL2RkL3NhbXBsZTwvY29kZT4sIHRoZW4gdGhlIGdlbmVyYXRlZAorYmVhbiB3aWxsIGJlIG5hbWVkIDxjb2RlPnNhbXBsZS5qYXI8L2NvZGU+Cis8L3A+Cis8cD4KK1RoaXMgc2NoZW1lIGlzIGFsc28gdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gdXNlIHN0YW5kYXJkIHN0eWxlIGRlc2NyaXB0b3IgbmFtZXMuIEl0IGlzIG9mdGVuCittb3N0IHVzZWZ1bCB3aGVuIHRoZSAgZGVzY3JpcHRvcnMgYXJlIGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBiZWFuIHNvdXJjZSBjb2RlLAorYWx0aG91Z2ggdGhhdCBpcyBub3QgbWFuZGF0b3J5LiBUaGlzIHNjaGVtZSBjYW4gaGFuZGxlIG11bHRpcGxlIGJlYW5zIHBlciBqYXIuCis8L3A+CisKKzxsaT5iYXNlamFybmFtZTwvbGk+Cis8cD4KK1RoZSBmaW5hbCBzY2hlbWUgc3VwcG9ydGVkIGJ5IHRoZSA8Y29kZT4mbHQ7ZWpiamFyJmd0OzwvY29kZT4gdGFzayBpcyB1c2VkIHdoZW4geW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgZ2VuZXJhdGVkCitiZWFuIGphciBuYW1lIGRpcmVjdGx5LiBJbiB0aGlzIGNhc2UgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBqYXIgaXMgc3BlY2lmaWVkIGJ5IHRoZQorJnF1b3Q7YmFzZWphcm5hbWUmcXVvdDsgYXR0cmlidXRlLiBTaW5jZSBhbGwgZ2VuZXJhdGVkIGJlYW5zIHdpbGwgaGF2ZSB0aGUgc2FtZSBuYW1lLCB0aGlzIHRhc2sgc2hvdWxkCitiZSBvbmx5IHVzZWQgd2hlbiBlYWNoIGRlc2NyaXB0b3IgaXMgaW4gaXRzIG93biBkaXJlY3RvcnkuCis8L3A+CisKKzxwPgorVGhpcyBzY2hlbWUgaXMgbW9zdCBhcHByb3ByaWF0ZSB3aGVuIHlvdSBhcmUgdXNpbmcgbXVsdGlwbGUgYmVhbnMgcGVyIGphciBhbmQgb25seSBwcm9jZXNzIGEgc2luZ2xlCitkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFlvdSB0eXBpY2FsbHkgd2FudCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBqYXIgYW5kIG5vdCBkZXJpdmUgaXQgZnJvbSB0aGUKK2JlYW5zIGluIHRoZSBqYXIuCis8L3A+CisKKzwvdWw+CisKKzxhIG5hbWU9ImVqYmphcl9kZXBzIj48aDM+RGVwZW5kZW5jaWVzPC9oMz48L2E+Cis8cD5JbiBhZGRpdGlvbiB0byB0aGUgYmVhbiBjbGFzc2VzLCBlamJqYXIgaXMgYWJsZSB0byBhZCBhZGRpdGlvbmFsIGNsYXNzZXMgdG8gdGhlIGdlbmVyYXRlZAorZWpiamFyLiBUaGVzZSBjbGFzc2VzIGFyZSB0eXBpY2FsbHkgdGhlIHN1cHBvcnQgY2xhc3NlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgYmVhbidzIGNsYXNzZXMgb3IgYXMKK3BhcmFtZXRlcnMgdG8gdGhlIGJlYW4ncyBtZXRob2RzLjwvcD4KKworPHA+SW4gdmVyc2lvbnMgb2YgQW50IHByaW9yIHRvIDEuNSwgZWpiamFyIHVzZWQgcmVmbGVjdGlvbiBhbmQgYXR0ZW1wdGVkIHRvIGFkZCB0aGUgc3VwZXIKK2NsYXNzZXMgYW5kIHN1cGVyIGludGVyZmFjZXMgb2YgdGhlIGJlYW4gY2xhc3Nlcy4gRm9yIHRoaXMgdGVjaG5pcXVlIHRvIHdvcmsgdGhlIGJlYW4KK2NsYXNzZXMgaGFkIHRvIGJlIGxvYWRlZCBpbnRvIEFudCdzIEpWTS4gVGhpcyB3YXMgbm90IGFsd2F5cyBwb3NzaWJsZSBkdWUgdG8gY2xhc3MgZGVwZW5kZW5jaWVzLgorPC9wPgorCis8cD5UaGUgZWpiamFyIHRhc2sgaW4gQW50IHJlbGVhc2VzIDEuNSBhbmQgbGF0ZXIgdXNlcyB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYmNlbCI+IGpha2FydGEtQkNFTCA8L2E+IGxpYnJhcnkKK3RvIGFuYWx5emUgdGhlIGJlYW4ncyBjbGFzcworZmlsZXMgZGlyZWN0bHksIHJhdGhlciB0aGFuIGxvYWRpbmcgdGhlbSBpbnRvIHRoZSBKVk0uIFRoaXMgYWxzbyBhbGxvd3MgZWpiamFyIHRvIGFkZCBhbGwKK29mIHRoZSByZXF1aXJlZCBzdXBwb3J0IGNsYXNzZXMgZm9yIGEgYmVhbiBhbmQgbm90IGp1c3Qgc3VwZXIgY2xhc3Nlcy4KKzwvcD4KKworPHA+SW4gQW50IDEuNSwgYSBuZXcgYXR0cmlidXRlLCA8Y29kZT5kZXBlbmRlbmN5PC9jb2RlPiBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIGFsbG93IHRoZQorYnVpbGRmaWxlIHRvIGNvbnRyb2wgd2hhdCBhZGRpdGlvbmFsIGNsYXNzZXMgYXJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgamFyLiBJdCB0YWtlcyB0aHJlZQorcG9zc2libGUgdmFsdWVzPC9wPgorPHVsPgorPGxpPjxjb2RlPm5vbmU8L2NvZGU+IC0gb25seSB0aGUgYmVhbiBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIGRlc2NyaWJlZCBpbiB0aGUgYmVhbidzCitkZXNjcmlwdG9yIGFyZSBhZGRlZCB0byB0aGUgamFyLjwvbGk+Cis8bGk+PGNvZGU+c3VwZXI8L2NvZGU+IC0gdGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBhbmQgcmVwbGljYXRlcyB0aGUgb3JpZ2luYWwgZWpiamFyCitiZWhhdmlvdXIgd2hlcmUgc3VwZXIgY2xhc3NlcyBhbmQgc3VwZXIgaW50ZXJmYWNlcyBhcmUgYWRkZWQgdG8gdGhlIGphcjwvbGk+Cis8bGk+PGNvZGU+ZnVsbDwvY29kZT4gLSBJbiB0aGlzIG1vZGUgYWxsIGNsYXNzZXMgdXNlZCBieSB0aGUgYmVhbidzIGNsYXNzZXMgYW5kIGludGVyZmFjZXMKK2FyZSBhZGRlZCB0byB0aGUgamFyPC9saT4KKzwvdWw+Cis8cD5UaGUgPGNvZGU+c3VwZXI8L2NvZGU+IGFuZCA8Y29kZT5mdWxsPC9jb2RlPiB2YWx1ZXMgcmVxdWlyZSB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYmNlbCI+IGpha2FydGEtQkNFTCA8L2E+IGxpYnJhcnkKK3RvIGJlIGF2YWlsYWJsZS4gSWYgaXQgaXMgbm90LCBlamJqYXIgd2lsbCBkcm9wIGJhY2sgdG8gdGhlIGJlaGF2aW91ciBjb3JyZXNwb25kaW5nIHRvCit0aGUgdmFsdWUgPGNvZGU+bm9uZTwvY29kZT4uPC9wPgorCis8aDM+UGFyYW1ldGVyczo8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzY3JpcHRvcmRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgdW5kZXIgd2hpY2ggdG8gc2NhbiBmb3IgRUpCCisgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICBsb2NhdGVkIGluIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSAnc3JjZGlyJworICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2RpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmNsYXNzIGZpbGVzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgIG1ha2UgdXAgdGhlIGJlYW4uIEluY2x1ZGVkIGFyZSB0aGUgaG9tZS0gcmVtb3RlLSBway0KKyAgICAgICAgICAgICAgICAgICAgIGFuZCBpbXBsZW1lbnRhdGlvbi0gY2xhc3NlcyBhbmQgYWxsIGNsYXNzZXMsIHRoYXQgdGhlc2UKKyAgICAgICAgICAgICAgICAgICAgIGRlcGVuZCBvbi4gTm90ZSB0aGF0IHRoaXMgY2FuIGJlIHRoZSBzYW1lIGFzIHRoZQorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcmRpciBpZiBhbGwgZmlsZXMgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgdHJlZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgaW50byB3aGljaCBnZW5lcmF0ZWQgamFyIGZpbGVzIGFyZQorICAgICAgICAgICAgICAgICAgICAgZGVwb3NpdGVkLiBKYXIgZmlsZXMgYXJlIGRlcG9zaXRlZCBpbiBkaXJlY3RvcmllcworICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGVpciBsb2NhdGlvbiB3aXRoaW4gdGhlIGRlc2NyaXB0b3JkaXIKKyAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZS4gTm90ZSB0aGF0IHRoaXMgYXR0cmlidXRlIGlzIG9ubHkgdXNlZCBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHRhc2sgaXMgZ2VuZXJhdGluZyBnZW5lcmljIGphcnMgKGkuZS4gbm8gdmVuZG9yLXNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50IGVsZW1lbnRzIGhhdmUgYmVlbiBzcGVjaWZpZWQpLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIHVubGVzcyB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBlbGVtZW50cworICAgIGhhdmUgYmVlbiBzcGVjaWZpZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y21wdmVyc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5FaXRoZXIgPGNvZGU+MS4wPC9jb2RlPiBvciA8Y29kZT4yLjA8L2NvZGU+Ljxicj4KKyAgICBEZWZhdWx0IGlzIDxjb2RlPjEuMDwvY29kZT4uPGJyPgorICAgIEEgQ01QIDIuMCBpbXBsZW1lbnRhdGlvbiBleGlzdHMgY3VycmVudGx5IG9ubHkgZm9yIEpCb3NzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db250cm9scyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gdXNlZCB0byBuYW1lIGdlbmVyYXRlZAorICAgICAgICAgICAgICAgICAgICAgRUpCIGphcnMuIFBsZWFzZSByZWZlciB0byB0aGUgZGVzY3JpcHRpb24gYWJvdmUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWphcm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGJhc2UgbmFtZSB0aGF0IGlzIHVzZWQgZm9yIHRoZSBnZW5lcmF0ZWQgamFyIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZ2VuZXJpYyBqYXIgZmlsZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICB3aWxsIHVzZSB0aGlzIHZhbHVlIGFzIHRoZSBwcmVmaXggKGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSAnZ2VuZXJpY2phcnN1ZmZpeCcgYXR0cmlidXRlKSBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICByZXN1bHRhbnQgZWpiIGphciBmaWxlIChmb2xsb3dlZCBieSBhbnkgc3VmZml4IHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG5lc3RlZCBlbGVtZW50KS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlbmFtZXRlcm1pbmF0b3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RyaW5nIHZhbHVlIHVzZWQgdG8gc3Vic3RyaW5nIG91dCBhIHN0cmluZyBmcm9tIHRoZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICBvZiBlYWNoIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3VuZCwgd2hpY2ggaXMgdGhlbiB1c2VkIHRvCisgICAgICAgICAgICAgICAgICAgICBsb2NhdGUgcmVsYXRlZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIChlLmcuIHRoZSBXZWJMb2dpYworICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMpLiBGb3IgZXhhbXBsZSwgYSBiYXNlbmFtZSBvZiAnLicgYW5kIGEKKyAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjYWxsZWQgJ0Zvb0JlYW4uZWpiLWphci54bWwnIHdvdWxkCisgICAgICAgICAgICAgICAgICAgICByZXN1bHQgaW4gYSBiYXNlbmFtZSBvZiAnRm9vQmVhbicgd2hpY2ggd291bGQgdGhlbiBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgICB0byBmaW5kIEZvb0JlYW4ud2VibG9naWMtZWpiLWphci54bWwgYW5kCisgICAgICAgICAgICAgICAgICAgICBGb29CZWFuLndlYmxvZ2ljLWNtcC1yZGJtcy1qYXIueG1sLCBhcyB3ZWxsIGFzIHRvIGNyZWF0ZQorICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGVuYW1lcyBvZiB0aGUgamFyIGZpbGVzIGFzIEZvb0JlYW4tZ2VuZXJpYy5qYXIgYW5kCisgICAgICAgICAgICAgICAgICAgICBGb29CZWFuLXdsLmphci4gVGhpcyBhdHRyaWJ1dGUgaXMgbm90IHVzZWQgaWYgdGhlCisgICAgICAgICAgICAgICAgICAgICAnYmFzZWphcm5hbWUnIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byAnLScuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Z2VuZXJpY2phcnN1ZmZpeDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdHJpbmcgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIGJhc2VuYW1lIG9mIHRoZSBkZXBsb3ltZW50CisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHRvIGNyZWF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyaWMgRUpCIGphcgorICAgICAgICAgICAgICAgICAgICAgZmlsZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvICctZ2VuZXJpYy5qYXInLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGNsYXNzcGF0aCBpcyB1c2VkIHdoZW4gcmVzb2x2aW5nIGNsYXNzZXMgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgIGFyZSB0byBiZSBhZGRlZCB0byB0aGUgamFyLiBUeXBpY2FsbHkgbmVzdGVkIGRlcGxveW1lbnQKKyAgICAgICAgICAgICAgICAgICAgIHRvb2wgZWxlbWVudHMgd2lsbCBhbHNvIHN1cHBvcnQgYSBjbGFzc3BhdGggd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgY29tYmluZWQgd2l0aCB0aGlzIGNsYXNzcGF0aCB3aGVuIHJlc29sdmluZworICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mbGF0ZGVzdGRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgdGhpcyBhdHRyaWJ1dGUgdG8gdHJ1ZSBpZiB5b3Ugd2FudCBhbGwgZ2VuZXJhdGVkIGphcnMKKyAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHBsYWNlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVzdGRpciwgcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoZSBkZXNjcmlwdG9yIGRpciBoaWVyYXJjaHkuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlcGVuZGVuY3k8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBhdHRyaWJ1dGUgY29udHJvbHMgd2hpY2ggYWRkaXRpb25hbCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCisgICAgICAgICAgICAgICAgICAgICBhcmUgYWRkZWQgdG8gdGhlIGphci4gUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2VqYmphcl9kZXBzIj5hYm92ZTwvYT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5OZXN0ZWQgRWxlbWVudHM8L2gzPgorCis8cD5JbiBhZGRpdGlvbiB0byB0aGUgdmVuZG9yIHNwZWNpZmljIG5lc3RlZCBlbGVtZW50cywgdGhlIGVqYmphciB0YXNrIHByb3ZpZGVzCit0aHJlZSBuZXN0ZWQgZWxlbWVudHMuIDwvcD4KKworPGg0PkNsYXNzcGF0aDwvaDQ+CisKKzxwPlRoZSA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQgYWxsb3dzIHRoZSBjbGFzc3BhdGgKK3RvIGJlIHNldC4gSXQgaXMgdXNlZnVsIHdoZW4gc2V0dGluZyB0aGUgY2xhc3NwYXRoIGZyb20gYSByZWZlcmVuY2UgcGF0aC4gSW4gYWxsCitvdGhlciByZXNwZWN0cyB0aGUgYmVoYXZpb3VyIGlzIHRoZSBzYW1lIGFzIHRoZSBjbGFzc3BhdGggYXR0cmlidXRlLjwvcD4KKworPGEgbmFtZT0iZWpiamFyLWR0ZCI+PGg0PmR0ZDwvaDQ+PC9hPgorCis8cD5UaGUgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhbCBsb2NhdGlvbiBvZiBEVERzIHRvIGJlCit1c2VkIHdoZW4gcGFyc2luZyB0aGUgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVXNpbmcgYSBsb2NhbCBEVEQgaXMgbXVjaAorZmFzdGVyIHRoYW4gbG9hZGluZyB0aGUgRFREIGFjcm9zcyB0aGUgbmV0LiBJZiB5b3UgYXJlIHJ1bm5pbmcgZWpiamFyIGJlaGluZCBhCitmaXJld2FsbCB5b3UgbWF5IG5vdCBldmVuIGJlIGFibGUgdG8gYWNjZXNzIHRoZSByZW1vdGUgRFRELiBUaGUgc3VwcG9ydGVkCit2ZW5kb3Itc3BlY2lmaWMgbmVzdGVkIGVsZW1lbnRzIGtub3cgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXF1aXJlZCBEVERzIHdpdGhpbgordGhlIHZlbmRvciBjbGFzcyBoaWVyYXJjaHkgYW5kLCBpbiBnZW5lcmFsLCB0aGlzIG1lYW5zIDxjb2RlPiZsdDtkdGQmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUKK25vdCByZXF1aXJlZC4gSXQgZG9lcyBtZWFuLCBob3dldmVyLCB0aGF0IHRoZSB2ZW5kb3IncyBjbGFzcyBoaWVyYXJjaHkgbXVzdCBiZQorYXZhaWxhYmxlIGluIHRoZSBjbGFzc3BhdGggd2hlbiBBbnQgaXMgc3RhcnRlZC4gSWYgeW91ciB3YW50IHRvIHJ1biBBbnQgd2l0aG91dAorcmVxdWlyaW5nIHRoZSB2ZW5kb3IgY2xhc3NlcyBpbiB0aGUgY2xhc3NwYXRoLCB5b3Ugd291bGQgbmVlZCB0byB1c2UgYQorPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wdWJsaWNJZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHVibGljIElkIG9mIHRoZSBEVEQgZm9yIHdoaWNoIHRoZSBsb2NhdGlvbiBpcyBiZWluZyBwcm92aWRlZDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhdGlvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbG9jYXRpb24gb2YgdGhlIGxvY2FsIGNvcHkgb2YgdGhlIERURC4gVGhpcyBjYW4gZWl0aGVyIGJlIGEKKyAgICAgICAgICAgICAgICAgICAgIGZpbGUgb3IgYSByZXNvdXJjZSBsb2FkYWJsZSBmcm9tIHRoZSBjbGFzc3BhdGguPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+c3VwcG9ydDwvaDQ+CisKKzxwPlRoZSA8Y29kZT4mbHQ7c3VwcG9ydCZndDs8L2NvZGU+IG5lc3RlZCBlbGVtZW50IGlzIHVzZWQgdG8gc3VwcGx5IGFkZGl0aW9uYWwgY2xhc3NlcworKGZpbGVzKSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIGphcnMuIFRoZSA8Y29kZT4mbHQ7c3VwcG9ydCZndDs8L2NvZGU+IGVsZW1lbnQgaXMgYQorPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4sIHNvIGl0IGNhbiBlaXRoZXIgcmVmZXJlbmNlIGEgZmlsZXNldCBkZWNsYXJlZCBlbHNld2hlcmUgb3IgaXQgY2FuIGJlCitkZWZpbmVkIGluLXBsYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gbmVzdGVkCitlbGVtZW50cy4gVGhlIGZpbGVzIGluIHRoZSBzdXBwb3J0IGZpbGVzZXQgYXJlIGFkZGVkIGludG8gdGhlIGdlbmVyYXRlZCBFSkIgamFyCitpbiB0aGUgc2FtZSByZWxhdGl2ZSBsb2NhdGlvbiBhcyB0aGVpciBsb2NhdGlvbiB3aXRoaW4gdGhlIHN1cHBvcnQgZmlsZXNldC4gTm90ZQordGhhdCB3aGVuIGVqYmphciBnZW5lcmF0ZXMgbW9yZSB0aGFuIG9uZSBqYXIgZmlsZSwgdGhlIHN1cHBvcnQgZmlsZXMgYXJlIGFkZGVkCit0byBlYWNoIG9uZS48L3A+CisKKzxoMz5WZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBlbGVtZW50czwvaDM+CisKK0VhY2ggdmVuZG9yLXNwZWNpZmljIG5lc3RlZCBlbGVtZW50IGNvbnRyb2xzIHRoZSBnZW5lcmF0aW9uIG9mIGEgZGVwbG95YWJsZSBqYXIKK3NwZWNpZmljIHRvIHRoYXQgdmVuZG9yJ3MgRUpCIGNvbnRhaW5lci4gVGhlIHBhcmFtZXRlcnMgZm9yIGVhY2ggc3VwcG9ydGVkCitkZXBsb3ltZW50IGVsZW1lbnQgYXJlIGRldGFpbGVkIGhlcmUuCisKKworPGgzPjxhIG5hbWU9ImVqYmphcl9qYm9zcyI+SmJvc3MgZWxlbWVudDwvYT48L2gzPgorCis8cD5UaGUgamJvc3MgZWxlbWVudCBzZWFyY2hlcyBmb3IgdGhlIEpCb3NzIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYW5kIGFkZHMgdGhlbQordG8gdGhlIGZpbmFsIGVqYiBqYXIgZmlsZS4gSkJvc3MgaGFzIHR3byBkZXBsb3ltZW50IGRlc2NyaXB0b3JzOgorPHVsPjxsaT5qYm9zcy54bWw8L2xpPgorPGxpPmZvciBjb250YWluZXIgbWFuYWdlciBwZXJzaXN0ZW5jZTo8YnI+Cis8dGFibGUgYm9yZGVyPSIxIj4KKzx0cj48dGQ+PGI+Q01QIHZlcnNpb248L2I+PC90ZD48dGQ+PGI+RmlsZSBuYW1lPC9iPjwvdGQ+PC90cj4KKzx0cj48dGQ+Q01QIDEuMDwvdGQ+PHRkPmphd3MueG1sPC90ZD48L3RyPgorPHRyPjx0ZD5DTVAgMi4wPC90ZD48dGQ+amJvc3NjbXAtamRiYy54bWw8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC9saT4KKzwvdWw+Cis8YnI+CisuIFRoZSBKQm9zcyBzZXJ2ZXIgdXNlcyBob3QgZGVwbG95bWVudCBhbmQgZG9lcworbm90IHJlcXVpcmUgY29tcGlsYXRpb24gb2YgYWRkaXRpb25hbCBzdHVicyBhbmQgc2tlbGV0b25zLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIHdlYmxvZ2ljIHJlYWR5CisgICAgICAgICAgICAgICAgICAgICBqYXIgZmlsZXMgYXJlIGRlcG9zaXRlZC4gSmFyIGZpbGVzIGFyZSBkZXBvc2l0ZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIgbG9jYXRpb24gd2l0aGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcmRpciBuYW1lc3BhY2UuIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5nZW5lcmljamFyc3VmZml4PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZ2VuZXJpYyBqYXIgaXMgZ2VuZXJhdGVkIGFzIGFuIGludGVybWVkaWF0ZSBzdGVwIGluCisgICAgICAgICAgICAgICAgICAgICBidWlsZCB0aGUgd2VibG9naWMgZGVwbG95bWVudCBqYXIuIFRoZSBzdWZmaXggdXNlZCB0bworICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgdGhlIGdlbmVyaWMgamFyIGZpbGUgaXMgbm90IHBhcnRpY3VsYXJseQorICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50IHVubGVzcyBpdCBpcyBkZXNpcmVkIHRvIGtlZXAgdGhlIGdlbmVyaWMKKyAgICAgICAgICAgICAgICAgICAgIGphciBmaWxlLiBJdCBzaG91bGQgbm90LCBob3dldmVyLCBiZSB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIHN1ZmZpeCBzZXR0aW5nLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gJy1nZW5lcmljLmphcicuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3VmZml4PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0cmluZyB2YWx1ZSBhcHBlbmRlZCB0byB0aGUgYmFzZW5hbWUgb2YgdGhlIGRlcGxveW1lbnQKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgdG8gY3JlYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgSkJvc3MgRUpCCisgICAgICAgICAgICAgICAgICAgICBqYXIgZmlsZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvICcuamFyJy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5rZWVwZ2VuZXJpYzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGdlbmVyaWMgZmlsZSB1c2VkIGFzIGlucHV0IHRvCisgICAgICAgICAgICAgICAgICAgICBlamJjIGlzIHJldGFpbmVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gZmFsc2U8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworCis8aDM+PGEgbmFtZT0iZWpiamFyX3dlYmxvZ2ljIj5XZWJsb2dpYyBlbGVtZW50PC9hPjwvaDM+CisKKzxwPlRoZSB3ZWJsb2dpYyBlbGVtZW50IGlzIHVzZWQgdG8gY29udHJvbCB0aGUgd2VibG9naWMuZWpiYyBjb21waWxlciBmb3IKK2dlbmVyYXRpbmcgd2VibG9naWMgRUpCIGphcnMuIFByaW9yIHRvIEFudCAxLjMsIHRoZSBtZXRob2Qgb2YgbG9jYXRpbmcgQ01QCitkZXNjcmlwdG9ycyB3YXMgdG8gdXNlIHRoZSBlamJqYXIgbmFtaW5nIGNvbnZlbnRpb24uIFNvIGlmIHlvdXIgZWpiLWphciB3YXMKK2NhbGxlZCwgQ3VzdG9tZXItZWpiLWphci54bWwsIHlvdXIgd2VibG9naWMgZGVzY3JpcHRvciB3YXMgY2FsbGVkIEN1c3RvbWVyLQord2VibG9naWMtZWpiLWphci54bWwgYW5kIHlvdXIgQ01QIGRlc2NyaXB0b3IgaGFkIHRvIGJlIEN1c3RvbWVyLXdlYmxvZ2ljLWNtcC0KK3JkYm1zLWphci54bWwuIEluIGFkZGl0aW9uLCB0aGUgPGNvZGU+Jmx0O3R5cGUtc3RvcmFnZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHdlYmxvZ2ljCitkZXNjcmlwdG9yIGhhZCB0byBiZSBzZXQgdG8gdGhlIHN0YW5kYXJkIG5hbWUgTUVUQS1JTkYvd2VibG9naWMtY21wLXJkYm1zLQoramFyLnhtbCwgYXMgdGhhdCBpcyB3aGVyZSB0aGUgQ01QIGRlc2NyaXB0b3Igd2FzIG1hcHBlZCB0byBpbiB0aGUgZ2VuZXJhdGVkCitqYXIuPC9wPgorCis8cD5UaGVyZSBhcmUgYSBmZXcgcHJvYmxlbXMgd2l0aCB0aGlzIHNjaGVtZS4gSXQgZG9lcyBub3QgYWxsb3cgZm9yIG1vcmUgdGhhbgorb25lIENNUCBkZXNjcmlwdG9yIHRvIGJlIGRlZmluZWQgaW4gYSBqYXIgYW5kIGl0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlCitkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGdlbmVyYXRlZCBieSBzb21lIHRvb2xzLjwvcD4KKworPHA+SW4gQW50IDEuMywgZWpiamFyIHBhcnNlcyB0aGUgd2VibG9naWMgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGRpc2NvdmVyIHRoZQorQ01QIGRlc2NyaXB0b3JzLCB3aGljaCBhcmUgdGhlbiBpbmNsdWRlZCBhdXRvbWF0aWNhbGx5LiBUaGlzIGJlaGF2aW91ciBpcworY29udHJvbGxlZCBieSB0aGUgbmV3Q01QIGF0dHJpYnV0ZS4gTm90ZSB0aGF0IGlmIHlvdSBtb3ZlIHRvIHRoZSBuZXcgbWV0aG9kIG9mCitkZXRlcm1pbmluZyBDTVAgZGVzY3JpcHRvcnMsIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHlvdXIgd2VibG9naWMgZGVwbG95bWVudAorZGVzY3JpcHRvcidzIDxjb2RlPiZsdDt0eXBlLXN0b3JhZ2UmZ3Q7PC9jb2RlPiBlbGVtZW50LiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgeW91IHdvdWxkCitkZWZpbmUgdGhpcyBhcyBNRVRBLUlORi9DdXN0b21lci13ZWJsb2dpYy1jbXAtcmRibXMtamFyLnhtbC48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCB3ZWJsb2dpYyByZWFkeQorICAgICAgICAgICAgICAgICAgICAgamFyIGZpbGVzIGFyZSBkZXBvc2l0ZWQuIEphciBmaWxlcyBhcmUgZGVwb3NpdGVkIGluCisgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIGxvY2F0aW9uIHdpdGhpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JkaXIgbmFtZXNwYWNlLiA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Z2VuZXJpY2phcnN1ZmZpeDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIGdlbmVyaWMgamFyIGlzIGdlbmVyYXRlZCBhcyBhbiBpbnRlcm1lZGlhdGUgc3RlcCBpbgorICAgICAgICAgICAgICAgICAgICAgYnVpbGQgdGhlIHdlYmxvZ2ljIGRlcGxveW1lbnQgamFyLiBUaGUgc3VmZml4IHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIHRoZSBnZW5lcmljIGphciBmaWxlIGlzIG5vdCBwYXJ0aWN1bGFybHkKKyAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFudCB1bmxlc3MgaXQgaXMgZGVzaXJlZCB0byBrZWVwIHRoZSBnZW5lcmljCisgICAgICAgICAgICAgICAgICAgICBqYXIgZmlsZS4gSXQgc2hvdWxkIG5vdCwgaG93ZXZlciwgYmUgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBzdWZmaXggc2V0dGluZy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvICctZ2VuZXJpYy5qYXInLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN1ZmZpeDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdHJpbmcgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIGJhc2VuYW1lIG9mIHRoZSBkZXBsb3ltZW50CisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHRvIGNyZWF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIFdlYkxvZ2ljIEVKQgorICAgICAgICAgICAgICAgICAgICAgamFyIGZpbGUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byAnLmphcicuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHJ1bm5pbmcgdGhlIHdlYmxvZ2ljIGVqYmMKKyAgICAgICAgICAgICAgICAgICAgIHRvb2wuIE5vdGUgdGhhdCB0aGlzIHRvb2wgdHlwaWNhbGx5IHJlcXVpcmVzIHRoZSBjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICB0aGF0IG1ha2UgdXAgdGhlIGJlYW4gdG8gYmUgYXZhaWxhYmxlIG9uIHRoZSBjbGFzc3BhdGguCisgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHksIGhvd2V2ZXIsIHRoaXMgd2lsbCBjYXVzZSB0aGUgZWpiYyB0b29sIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICBydW4gaW4gYSBzZXBhcmF0ZSBWTTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPndsY2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldlYmxvZ2ljIDYuMCB3aWxsIGdpdmUgYSB3YXJuaW5nIGlmIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcworICAgICAgICAgICAgICAgICAgICAgb2YgYSBiZWFuIGFyZSBvbiB0aGUgc3lzdGVtIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biB3ZWJsb2dpYy5lamJjLgorICAgICAgICAgICAgICAgICAgICAgSW4gdGhhdCBjYXNlLCB0aGUgc3RhbmRhcmQgd2VibG9naWMgY2xhc3NlcyBzaG91bGQgYmUgc2V0IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMgYXR0cmlidXRlIChvciBlcXVpdmFsZW50IG5lc3RlZCBlbGVtZW50KSBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBsb2NhdGVkIHdpdGggdGhlIHN0YW5kYXJkIGNsYXNzcGF0aAorICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+a2VlcGdlbmVyaWM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBjb250cm9scyB3aGV0aGVyIHRoZSBnZW5lcmljIGZpbGUgdXNlZCBhcyBpbnB1dCB0bworICAgICAgICAgICAgICAgICAgICAgZWpiYyBpcyByZXRhaW5lZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcGlsZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBhbGxvd3MgZm9yIHRoZSBzZWxlY3Rpb24gb2YgYSBkaWZmZXJlbnQgY29tcGlsZXIKKyAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBjb21waWxhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIEphdmEKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVzLiBUaGlzIGNvdWxkIGJlIHNldCwgZm9yIGV4YW1wbGUsIHRvIEppa2VzIHRvCisgICAgICAgICAgICAgICAgICAgICBjb21waWxlIHdpdGggdGhlIEppa2VzIGNvbXBpbGVyLiBJZiB0aGlzIGlzIG5vdCBzZXQKKyAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5IGlzIHNldAorICAgICAgICAgICAgICAgICAgICAgdG8gamlrZXMsIHRoZSBKaWtlcyBjb21waWxlciB3aWxsIGJlIHVzZWQuIElmIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBkZXNpcmVkLCB0aGUgdmFsdWUgJnF1b3Q7PGNvZGU+ZGVmYXVsdDwvY29kZT4mcXVvdDsKKyAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBnaXZlbiB0byB1c2UgdGhlIGRlZmF1bHQgY29tcGlsZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZWJ1aWxkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIHdlYmxvZ2ljLmVqYmMgaXMgYWx3YXlzCisgICAgICAgICAgICAgICAgICAgICBpbnZva2VkIHRvIGJ1aWxkIHRoZSBqYXIgZmlsZS4gSW4gY2VydGFpbiBjaXJjdW1zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyB3aGVuIG9ubHkgYSBiZWFuIGNsYXNzIGhhcyBiZWVuIGNoYW5nZWQsIHRoZSBqYXIKKyAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBnZW5lcmF0ZWQgYnkgbWVyZWx5IHJlcGxhY2luZyB0aGUgY2hhbmdlZCBjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IHJlcnVubmluZyBlamJjLiBTZXR0aW5nIHRoaXMgdG8gZmFsc2Ugd2lsbCByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgIHRoZSB0aW1lIHRvIHJ1biBlamJqYXIuCisgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+a2VlcGdlbmVyYXRlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db250cm9scyB3aGV0aGVyIHdlYmxvZ2ljIHdpbGwga2VlcCB0aGUgZ2VuZXJhdGVkIEphdmEKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVzIHVzZWQgdG8gYnVpbGQgdGhlIGNsYXNzIGZpbGVzIGFkZGVkIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgamFyLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcKKyAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YXJnczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSB3ZWJsb2dpYy5lamJjCisgICAgICAgICAgICAgICAgICAgICB0b29sLgorICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPndlYmxvZ2ljZHRkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlcHJlY2F0ZWQ8L2I+LiBEZWZpbmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWpiLWphciBEVEQgaW4KKyAgICAgICAgICAgICAgICAgICAgIHRoZSB3ZWJsb2dpYyBjbGFzcyBoaWVyYXJjaHkuIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgeW91CisgICAgICAgICAgICAgICAgICAgICBoYXZlIHdlYmxvZ2ljIGluIHlvdXIgY2xhc3NwYXRoLiBJZiB5b3UgZG8gbm90LCB5b3Ugc2hvdWxkIHVzZSBhCisgICAgICAgICAgICAgICAgICAgICBuZXN0ZWQgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnQsIGRlc2NyaWJlZCBhYm92ZS4gSWYgeW91IGRvIGNob29zZQorICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIGFuIGF0dHJpYnV0ZSwgeW91IHNob3VsZCB1c2UgYQorICAgICAgICAgICAgICAgICAgICAgbmVzdGVkIDxjb2RlPiZsdDtkdGQmZ3Q7PC9jb2RlPiBlbGVtZW50LgorICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPndsZHRkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlcHJlY2F0ZWQ8L2I+LiBEZWZpbmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgd2VibG9naWMtZWpiLWphcgorICAgICAgICAgICAgICAgICAgICAgRFREIHdoaWNoIGNvdmVycyB0aGUgV2VibG9naWMgc3BlY2lmaWMgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KKyAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgeW91IGhhdmUgd2VibG9naWMgaW4geW91cgorICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoLiBJZiB5b3UgZG8gbm90LCB5b3Ugc2hvdWxkIHVzZSBhIG5lc3RlZCA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIGRlc2NyaWJlZCBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lamJkdGQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVwcmVjYXRlZDwvYj4uIERlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBlamItamFyIERURCBpbgorICAgICAgICAgICAgICAgICAgICAgdGhlIHdlYmxvZ2ljIGNsYXNzIGhpZXJhcmNoeS4gVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBpZiB5b3UKKyAgICAgICAgICAgICAgICAgICAgIGhhdmUgd2VibG9naWMgaW4geW91ciBjbGFzc3BhdGguIElmIHlvdSBkbyBub3QsIHlvdSBzaG91bGQgdXNlIGEKKyAgICAgICAgICAgICAgICAgICAgIG5lc3RlZCA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gZWxlbWVudCwgZGVzY3JpYmVkIGFib3ZlLgorICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5ld0NNUDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGUgbmV3IG1ldGhvZCBmb3IgbG9jYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgIENNUCBkZXNjcmlwdG9ycyB3aWxsIGJlIHVzZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLiBEZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm9sZENNUDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXByZWNhdGVkPC9iPiBUaGlzIGlzIGFuIGFudG9ueW0gZm9yIG5ld0NNUCB3aGljaCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ub0VKQkM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUsIFdlYmxvZ2ljJ3MgZWpiYyB3aWxsIG5vdCBiZSBydW4gb24gdGhlIEVKQiBqYXIuCisgICAgICAgICAgICAgICAgICAgICBVc2UgdGhpcyBpZiB5b3UgcHJlZmVyIHRvIHJ1biBlamJjIGF0IGRlcGxveW1lbnQgdGltZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZWpiY2NsYXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgY2xhc3NuYW1lIG9mIHRoZSBlamJjIGNvbXBpbGVyLiBOb3JtYWxseSBlamJqYXIgZGV0ZXJtaW5lcworICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGJhc2VkIG9uIHRoZSBEVEQgdXNlZCBmb3IgdGhlIEVKQi4gVGhlIEVKQiAyLjAgY29tcGlsZXIKKyAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVkIGluIHdlYmxvZ2ljIDYgaGFzLCBob3dldmVyLCBiZWVuIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiA3LiBXaGVuCisgICAgICAgICAgICAgICAgICAgICB1c2luZyB3aXRoIHZlcnNpb24gNyB0aGlzIGF0dHJpYnV0ZSBzaG91bGQgYmUgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAmcXVvdDt3ZWJsb2dpYy5lamJjJnF1b3Q7IHRvIGF2b2lkIHRoZSBkZXByZWNhdGlvbiB3YXJuaW5nLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5qdm1hcmdzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIFZpcnR1YWwgTWFjaGluZQorICAgICAgICAgICAgICAgICAgICAgcnVubmluZyB3ZWJsb2dpYy5lamJjIHRvb2wuIEZvciBleGFtcGxlIHRvIHNldCB0aGUgbWVtb3J5IHNpemUsCisgICAgICAgICAgICAgICAgICAgICB0aGlzIGNvdWxkIGJlIGp2bWFyZ3M9JnF1b3Q7LVhteDEyOG0mcXVvdDsKKyAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5qdm1kZWJ1Z2xldmVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIHdlYmxvZ2ljLlN0ZG91dFNldmVyaXR5TGV2ZWwgdG8gdXNlIHdoZW4gcnVubmluZworICAgICAgICAgICAgICAgICAgICAgdGhlIFZpcnR1YWwgTWFjaGluZSB0aGF0IGV4ZWN1dGVzIGVqYmMuIFNldCB0byAxNiB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmdzIGFib3V0IEVKQiBIb21lIGFuZCBSZW1vdGVzIGJlaW5nIGluIHRoZSBjbGFzc3BhdGgKKyAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXRkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgc2V0IGVqYmMgd2lsbCBiZSBnaXZlbiB0aGlzIGRpcmVjdG9yeSBhcyB0aGUgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiByYXRoZXIgdGhhbiBhIGphciBmaWxlLiBUaGlzIGFsbG93cyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uIG9mICZxdW90O2V4cGxvZGVkJnF1b3Q7IGphcnMuCisgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPlRoZSB3ZWJsb2dpYyBuZXN0ZWQgZWxlbWVudCBzdXBwb3J0cyB0aHJlZSBuZXN0ZWQgZWxlbWVudHMuIFRoZQorZmlyc3QgdHdvLCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt3bGNsYXNzcGF0aCZndDs8L2NvZGU+LCBhcmUgdXNlZCB0byBzZXQgdGhlCityZXNwZWN0aXZlIGNsYXNzcGF0aHMuIFRoZXNlIG5lc3RlZCBlbGVtZW50cyBhcmUgdXNlZnVsIHdoZW4gc2V0dGluZyB1cAorY2xhc3MgcGF0aHMgdXNpbmcgcmVmZXJlbmNlIElkcy4gVGhlIGxhc3QsIDxjb2RlPiZsdDtzeXNwcm9wZXJ0eSZndDs8L2NvZGU+LCBhbGxvd3MKK0phdmEgc3lzdGVtIHByb3BlcnRpZXMgdG8gYmUgc2V0IGR1cmluZyB0aGUgY29tcGlsZXIgcnVuLiBUaGlzIHR1cm5zIG91dAordG8gYmUgbmVjZXNzYXJ5IGZvciBzdXBwb3J0aW5nIENNUCBFSkIgY29tcGlsYXRpb24gaW4gYWxsIGVudmlyb25tZW50cy4KKzwvcD4KKworPGgzPlRPUExpbmsgZm9yIFdlYmxvZ2ljIGVsZW1lbnQ8L2gzPgorCis8cD48Yj48aT5EZXByZWNhdGVkPC9pPjwvYj48L3A+CisKKzxwPlRoZSB0b3BsaW5rIGVsZW1lbnQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBUb3BsaW5rIGJlYW5zIGNhbiBub3cgYmUgYnVpbHQgd2l0aCB0aGUgc3RhbmRhcmQKK3dlYmxvZ2ljIGVsZW1lbnQsIGFzIGxvbmcgYXMgdGhlIG5ld0NNUCBhdHRyaWJ1dGUgaXMgc2V0IHRvICZxdW90O3RydWUmcXVvdDsKKzwvcD4KKworPHA+VGhlIFRvcExpbmsgZWxlbWVudCBpcyB1c2VkIHRvIGhhbmRsZSBiZWFucyB3aGljaCB1c2UgVG9wbGluayBmb3IgdGhlIENNUCBvcGVyYXRpb25zLiBJdAoraXMgZGVyaXZlZCBmcm9tIHRoZSBzdGFuZGFyZCB3ZWJsb2dpYyBlbGVtZW50IHNvIGl0IHN1cHBvcnRzIHRoZSBzYW1lIHNldCBvZiBhdHRyaWJ1dGVzIHBsdXMgdGhlc2UKK2FkZGl0aW9uYWwgYXR0cmlidXRlczwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9wbGlua2Rlc2NyaXB0b3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIFRPUExpbmsgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgY29udGFpbmVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3JkaXInIGRpcmVjdG9yeS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9wbGlua2R0ZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIFRPUExpbmsgRFREIGZpbGUuIFRoaXMgY2FuIGJlIGEgZmlsZSBwYXRoIG9yCisgICAgICAgICAgICAgICAgICAgICBhIGZpbGUgVVJMLiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQsIGJ1dCB1c2luZyBhIGxvY2FsIERURCBpcyByZWNvbW1lbmRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGR0ZCBmaWxlIGF0IHd3dy5vYmplY3RwZW9wbGUuY29tLjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPlRoaXMgZXhhbXBsZSBzaG93cyBlamJqYXIgYmVpbmcgdXNlZCB0byBnZW5lcmF0ZSBkZXBsb3ltZW50IGphcnMgdXNpbmcgYQorV2VibG9naWMgRUpCIGNvbnRhaW5lci4gVGhpcyBleGFtcGxlIHJlcXVpcmVzIHRoZSBuYW1pbmcgc3RhbmRhcmQgdG8gYmUgdXNlZCBmb3IKK3RoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiBVc2luZyB0aGlzIGZvcm1hdCB3aWxsIGNyZWF0ZSBhIGVqYiBqYXIgZmlsZSBmb3IKK2VhY2ggdmFyaWF0aW9uIG9mICcqLWVqYi1qYXIueG1sJyB0aGF0IGlzIGZvdW5kIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKK2RpcmVjdG9yeS48L3A+CisKKzxwcmU+CisgICAgJmx0O2VqYmphciBzcmNkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OworICAgICAgICAgICAgZGVzY3JpcHRvcmRpcj0mcXVvdDske2Rlc2NyaXB0b3IuZGlyfSZxdW90OyZndDsKKyAgICAgICZsdDt3ZWJsb2dpYyBkZXN0ZGlyPSZxdW90OyR7ZGVwbG95bWVudGphcnMuZGlyfSZxdW90OworICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDske2Rlc2NyaXB0b3JidWlsZC5jbGFzc3BhdGh9JnF1b3Q7LyZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi1lamItamFyLnhtbCZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqLyp3ZWJsb2dpYyoueG1sJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2VqYmphciZndDsKKzwvcHJlPgorCis8cD5JZiB3ZWJsb2dpYyBpcyBub3QgaW4gdGhlIEFudCBjbGFzc3BhdGgsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZQorc2hvd3MgaG93IHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWJsb2dpYyBEVERzLiBUaGlzCitleGFtcGxlIGFsc28gc2hvdyB0aGUgdXNlIG9mIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50LjwvcD4KKworPHByZT4KKyAgICAmbHQ7ZWpiamFyIGRlc2NyaXB0b3JkaXI9JnF1b3Q7JHtzcmMuZGlyfSZxdW90OyBzcmNkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OyZndDsKKyAgICAgICAmbHQ7d2VibG9naWMgZGVzdGRpcj0mcXVvdDske2RlcGxveW1lbnQud2Vic2hvcC5kaXJ9JnF1b3Q7CisgICAgICAgICAgICAgICAgIGtlZXBnZW5lcmljPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgICAgICAgYXJncz0mcXVvdDstZyAta2VlcGdlbmVyYXRlZCAke2VqYmMuY29tcGlsZXJ9JnF1b3Q7CisgICAgICAgICAgICAgICAgIHN1ZmZpeD0mcXVvdDsuamFyJnF1b3Q7CisgICAgICAgICAgICAgICAgIG9sZENNUD0mcXVvdDtmYWxzZSZxdW90OyZndDsKKyAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7ZGVzY3JpcHRvcmJ1aWxkLmNsYXNzcGF0aH0mcXVvdDsvJmd0OworICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CisgICAgICAgJmx0Oy93ZWJsb2dpYyZndDsKKyAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyotZWpiLWphci54bWwmcXVvdDsvJmd0OworICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7KiovKi13ZWJsb2dpYy1lamItamFyLnhtbCZxdW90Oy8mZ3Q7CisgICAgICAgJmx0O2R0ZCBwdWJsaWNJZD0mcXVvdDstLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiZxdW90OworICAgICAgICAgICAgbG9jYXRpb249JnF1b3Q7JHt3ZWJsb2dpYy5ob21lfS9jbGFzc2VzL3dlYmxvZ2ljL2VqYi9kZXBsb3ltZW50L3htbC9lamItamFyLmR0ZCZxdW90Oy8mZ3Q7CisgICAgICAgJmx0O2R0ZCBwdWJsaWNJZD0mcXVvdDstLy9CRUEgU3lzdGVtcywgSW5jLi8vRFREIFdlYkxvZ2ljIDUuMS4wIEVKQi8vRU4mcXVvdDsKKyAgICAgICAgICAgIGxvY2F0aW9uPSZxdW90OyR7d2VibG9naWMuaG9tZX0vY2xhc3Nlcy93ZWJsb2dpYy9lamIvZGVwbG95bWVudC94bWwvd2VibG9naWMtZWpiLWphci5kdGQmcXVvdDsvJmd0OworICAgICZsdDsvZWpiamFyJmd0OworPC9wcmU+CisKKworPHA+VGhpcyBleGFtcGxlIHNob3dzIGVqYmphciBiZWluZyB1c2VkIHRvIGdlbmVyYXRlIGEgc2luZ2xlIGRlcGxveW1lbnQgamFyCit1c2luZyBhIFdlYmxvZ2ljIEVKQiBjb250YWluZXIuIFRoaXMgZXhhbXBsZSBkb2VzIG5vdCByZXF1aXJlIHRoZSBkZXBsb3ltZW50CitkZXNjcmlwdG9ycyB0byB1c2UgdGhlIG5hbWluZyBzdGFuZGFyZC4gVGhpcyB3aWxsIGNyZWF0ZSBvbmx5IG9uZSBlamIgamFyIGZpbGUgLQorJ1RoZUVKQkphci5qYXInLjwvcD4KKworCis8cHJlPgorICAgICZsdDtlamJqYXIgc3JjZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlc30mcXVvdDsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JkaXI9JnF1b3Q7JHtkZXNjcmlwdG9yLmRpcn0mcXVvdDsKKyAgICAgICAgICAgIGJhc2VqYXJuYW1lPSZxdW90O1RoZUVKQkphciZxdW90OyZndDsKKyAgICAgICZsdDt3ZWJsb2dpYyBkZXN0ZGlyPSZxdW90OyR7ZGVwbG95bWVudGphcnMuZGlyfSZxdW90OworICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDske2Rlc2NyaXB0b3JidWlsZC5jbGFzc3BhdGh9JnF1b3Q7LyZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovZWpiLWphci54bWwmcXVvdDsvJmd0OworICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi93ZWJsb2dpYyoueG1sJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2VqYmphciZndDsKKzwvcHJlPgorCis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgZWpiamFyIGJlaW5nIHVzZWQgdG8gZ2VuZXJhdGUgZGVwbG95bWVudCBqYXJzIGZvciBhIFRPUExpbmstZW5hYmxlZCBlbnRpdHkgYmVhbiB1c2luZyBhCitXZWJsb2dpYyBFSkIgY29udGFpbmVyLiBUaGlzIGV4YW1wbGUgZG9lcyBub3QgcmVxdWlyZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyB0byB1c2UgdGhlIG5hbWluZyBzdGFuZGFyZC4KK1RoaXMgd2lsbCBjcmVhdGUgb25seSBvbmUgVE9QTGluay1lbmFibGVkIGVqYiBqYXIgZmlsZSAtICdBZGRyZXNzLmphcicuPC9wPgorCis8cHJlPgorICAgICZsdDtlamJqYXIgc3JjZGlyPSZxdW90OyR7YnVpbGQuZGlyfSZxdW90OworICAgICAgICAgICAgZGVzdGRpcj0mcXVvdDske3NvbGFudC5lamIuZGlyfSZxdW90OworICAgICAgICAgICAgZGVzY3JpcHRvcmRpcj0mcXVvdDske2Rlc2NyaXB0b3IuZGlyfSZxdW90OworICAgICAgICAgICAgYmFzZWphcm5hbWU9JnF1b3Q7QWRkcmVzcyZxdW90OyZndDsKKyAgICAgICAgICAgICZsdDt3ZWJsb2dpY3RvcGxpbmsgZGVzdGRpcj0mcXVvdDske3NvbGFudC5lamIuZGlyfSZxdW90OworICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHtqYXZhLmNsYXNzLnBhdGh9JnF1b3Q7CisgICAgICAgICAgICAgICAgICAgIGtlZXBnZW5lcmljPSZxdW90O2ZhbHNlJnF1b3Q7CisgICAgICAgICAgICAgICAgICAgIHRvcGxpbmtkZXNjcmlwdG9yPSZxdW90O0FkZHJlc3MueG1sJnF1b3Q7CisgICAgICAgICAgICAgICAgICAgIHRvcGxpbmtkdGQ9JnF1b3Q7ZmlsZTovLy9kdGRmaWxlcy90b3BsaW5rLWNtcF8yXzVfMS5kdGQmcXVvdDsKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4PSZxdW90Oy5qYXImcXVvdDsvJmd0OworICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi9lamItamFyLnhtbCZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqL3dlYmxvZ2ljLWVqYi1qYXIueG1sJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2VqYmphciZndDsKKzwvcHJlPgorCis8cD5UaGlzIGZpbmFsIGV4YW1wbGUgc2hvd3MgaG93IHlvdSB3b3VsZCBzZXQtdXAgZWpiamFyIHVuZGVyIFdlYmxvZ2ljIDYuMC4gSXQgYWxzbyBzaG93cyB0aGUgdXNlIG9mIHRoZQorPGNvZGU+Jmx0O3N1cHBvcnQmZ3Q7PC9jb2RlPiBlbGVtZW50IHRvIGFkZCBzdXBwb3J0IGZpbGVzPC9wPgorCis8cHJlPgorICAgICZsdDtlamJqYXIgZGVzY3JpcHRvcmRpcj0mcXVvdDske2RkLmRpcn0mcXVvdDsgc3JjZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlcy5zZXJ2ZXJ9JnF1b3Q7Jmd0OworICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi1lamItamFyLnhtbCZxdW90Oy8mZ3Q7CisgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qLXdlYmxvZ2ljLWVqYi1qYXIueG1sJnF1b3Q7LyZndDsKKyAgICAgICAmbHQ7c3VwcG9ydCBkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzLnNlcnZlcn0mcXVvdDsmZ3Q7CisgICAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouY2xhc3MmcXVvdDsvJmd0OworICAgICAgICZsdDsvc3VwcG9ydCZndDsKKyAgICAgICAmbHQ7d2VibG9naWMgZGVzdGRpcj0mcXVvdDske2RlcGxveW1lbnQuZGlyfSZxdW90OworICAgICAgICAgICAgICAgICBrZWVwZ2VuZXJpYz0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgICAgICAgIHN1ZmZpeD0mcXVvdDsuamFyJnF1b3Q7CisgICAgICAgICAgICAgICAgIHJlYnVpbGQ9JnF1b3Q7ZmFsc2UmcXVvdDsmZ3Q7CisgICAgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtidWlsZC5jbGFzc2VzLnNlcnZlcn0mcXVvdDsvJmd0OworICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CisgICAgICAgICAmbHQ7d2xjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske3dlYmxvZ2ljLmNsYXNzZXN9JnF1b3Q7LyZndDsKKyAgICAgICAgICZsdDsvd2xjbGFzc3BhdGgmZ3Q7CisgICAgICAgJmx0Oy93ZWJsb2dpYyZndDsKKyAgICAmbHQ7L2VqYmphciZndDsKKzwvcHJlPgorCisKKzxoMz48YSBuYW1lPSJlamJqYXJfd2Vic3BoZXJlIj5XZWJTcGhlcmUgZWxlbWVudDwvYT48L2gzPgorCis8cD5UaGUgd2Vic3BoZXJlIGVsZW1lbnQgc2VhcmNoZXMgZm9yIHRoZSB3ZWJzcGhlcmUgc3BlY2lmaWMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhbmQKK2FkZHMgdGhlbSB0byB0aGUgZmluYWwgZWpiIGphciBmaWxlLiBXZWJzcGhlcmUgaGFzIHR3byBzcGVjaWZpYyBkZXNjcmlwdG9ycyBmb3Igc2Vzc2lvbgorYmVhbnM6Cis8dWw+CisgICA8bGk+aWJtLWVqYi1qYXItYm5kLnhtaTwvbGk+CisgICA8bGk+aWJtLWVqYi1qYXItZXh0LnhtaTwvbGk+Cis8L3VsPgorYW5kIGFub3RoZXIgdHdvIGZvciBjb250YWluZXIgbWFuYWdlZCBlbnRpdHkgYmVhbnM6Cis8dWw+CisgICA8bGk+TWFwLm1hcHhtaTwvbGk+CisgICA8bGk+U2NoZW1hLmRieG1pPC9saT4KKzwvdWw+CitJbiB0ZXJtcyBvZiBXZWJTcGhlcmUsIHRoZSBnZW5lcmF0aW9uIG9mIGNvbnRhaW5lciBjb2RlIGFuZCBzdHVicyBpcyBjYWxsZWQgPGNvZGU+ZGVwbG95bWVudDwvY29kZT4uCitUaGlzIHN0ZXAgY2FuIGJlIHBlcmZvcm1lZCBieSB0aGUgd2Vic3BoZXJlIGVsZW1lbnQgYXMgcGFydCBvZiB0aGUgamFyIGdlbmVyYXRpb24gcHJvY2Vzcy4gSWYgdGhlCitzd2l0Y2ggPGNvZGU+ZWpiZGVwbG95PC9jb2RlPiBpcyBvbiwgdGhlIGVqYmRlcGxveSB0b29sIGZyb20gdGhlIHdlYnNwaGVyZSB0b29sc2V0IGlzIGNhbGxlZCBmb3IKK2V2ZXJ5IGVqYi1qYXIuIFVuZm9ydHVuYXRlbHksIHRoaXMgc3RlcCBvbmx5IHdvcmtzLCBpZiB5b3UgdXNlIHRoZSBpYm0gamRrLiBPdGhlcndpc2UsIHRoZSBybWljCisoY2FsbGVkIGJ5IGVqYmRlcGxveSkgdGhyb3dzIGEgQ2xhc3NGb3JtYXRFcnJvci4gQmUgc3VyZSB0byBzd2l0Y2ggZWpiZGVwbG95IG9mZiwgaWYgcnVuIGFudCB3aXRoCitzdW4gamRrLgorPC9wPgorCis8cD4KK0ZvciB0aGUgd2Vic3BoZXJlIGVsZW1lbnQgdG8gd29yaywgeW91IGhhdmUgdG8gcHJvdmlkZSBhIGNvbXBsZXRlIGNsYXNzcGF0aCwgdGhhdCBjb250YWlucyBhbGwKK2NsYXNzZXMsIHRoYXQgYXJlIHJlcXVpcmVkIHRvIHJlZmxlY3QgdGhlIGJlYW4gY2xhc3Nlcy4gRm9yIGVqYmRlcGxveSB0byB3b3JrLCB5b3UgbXVzdCBhbHNvIHByb3ZpZGUKK3RoZSBjbGFzc3BhdGggb2YgdGhlIGVqYmRlcGxveSB0b29sIGFuZCBzZXQgdGhlIDxpPndlYnNwaGVyZS5ob21lPC9pPiBwcm9wZXJ0eSAobG9vayBhdCB0aGUgZXhhbXBsZXMgYmVsb3cpLgorPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgd2VibG9naWMgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgIGphciBmaWxlcyBhcmUgZGVwb3NpdGVkLiBKYXIgZmlsZXMgYXJlIGRlcG9zaXRlZCBpbgorICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byB0aGVpciBsb2NhdGlvbiB3aXRoaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yZGlyIG5hbWVzcGFjZS4gPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVqYmRlcGxveTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EZWNpZGVzIHdoZXRoZXIgZWpiZGVwbG95IGlzIGNhbGxlZC4gV2hlbiB5b3Ugc2V0IHRoaXMgdG8gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJlIHN1cmUsIHRvIHJ1biBhbnQgd2l0aCB0aGUgaWJtIGpkay48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIHRydWU8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdWZmaXg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGVwbG95bWVudAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB0byBjcmVhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBXZWJMb2dpYyBFSkIKKyAgICAgICAgICAgICAgICAgICAgIGphciBmaWxlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gJy5qYXInLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXBnZW5lcmljPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgY29udHJvbHMgd2hldGhlciB0aGUgZ2VuZXJpYyBmaWxlIHVzZWQgYXMgaW5wdXQgdG8KKyAgICAgICAgICAgICAgICAgICAgIGVqYmRlcGxveSBpcyByZXRhaW5lZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVidWlsZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGNvbnRyb2xzIHdoZXRoZXIgZWpiZGVwbG95IGlzIGNhbGxlZCBhbHRob3VnaCBubyBjaGFuZ2VzCisgICAgICAgICAgICAgICAgICAgICBoYXZlIG9jY3VycmVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gZmFsc2U8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50ZW1wZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZGlyZWN0b3J5LCB3aGVyZSBlamJkZXBsb3kgd2lsbCB3cml0ZSB0ZW1wb3JhcnkgZmlsZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvICdfZWpiZGVwbG95X3RlbXAnLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRiTmFtZTxicj5kYlNjaGVtYTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGVzZSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gZWpiZGVwbG95LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRiVmVuZG9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgb3B0aW9uIGlzIHBhc3NlZCB0byBlamJkZXBsb3kuIAorICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgIFZhbGlkIG9wdGlvbnMgY2FuIGJlIG9idGFpbmVkIGJ5IHJ1bm5pbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorICAgICAgICAgICAgICAgICAgIDxjb2RlPgorICAgICAgICAgICAgICAgICAgICZsdDtXQVNfSE9NRSZndDsvYmluL0VKQkRlcGxveS5bc2gvYmF0XSAtaGVscAorICAgICAgICAgICAgICAgICAgIDwvY29kZT4KKyAgICAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYWxzbyB1c2VkIHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgTWFwLm1hcHhtaSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIFNjaGVtYS5kYnhtaSBmaWxlcywgZm9yIGV4YW1wbGUgQWNjb3VudC1EQjJVREJXSU5fVjcxLU1hcC5tYXB4bWkKKyAgICAgICAgICAgICAgICAgICAgIGFuZCBBY2NvdW50LURCMlVEQldJTl9WNzEtU2NoZW1hLmRieG1pLgorICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29kZWdlbjxicj5xdWlldDxicj5ub3ZhbGlkYXRlPGJyPm5vaW5mb3JtPGJyPnRyYWNlPGJyPgorICAgICAgICAgICAgICAgICAgICAgdXNlMzVNYXBwaW5nUnVsZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlc2Ugb3B0aW9ucyBhcmUgYWxsIHBhc3NlZCB0byBlamJkZXBsb3kuIEFsbCBvcHRpb25zCisgICAgICAgICAgICAgICAgICAgICBleGNlcHQgJ3F1aWV0JyBkZWZhdWx0IHRvIGZhbHNlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJtaWNPcHRpb25zPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgb3B0aW9uIGlzIHBhc3NlZCB0byBlamJkZXBsb3kgYW5kIHdpbGwgYmUgcGFzc2VkCisgICAgICAgICAgICAgICAgICAgICBvbiB0byBybWljLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgZWpiamFyIGJlaW5nIHVzZWQgdG8gZ2VuZXJhdGUgZGVwbG95bWVudCBqYXJzIGZvciBhbGwgZGVwbG95bWVudCBkZXNjcmlwdG9ycworaW4gdGhlIGRlc2NyaXB0b3IgZGlyOjwvcD4KKworPHByZT4KKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDt3ZWJwc2hlcmUuaG9tZSZxdW90OyB2YWx1ZT0mcXVvdDske3dhczQuaG9tZX0mcXVvdDsvJmd0OworICAgICZsdDtlamJqYXIgc3JjZGlyPSIke2J1aWxkLmNsYXNzfSIgZGVzY3JpcHRvcmRpcj0iZXRjL2VqYiImZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLWVqYi1qYXIueG1sIi8mZ3Q7CisgICAgICAmbHQ7d2Vic3BoZXJlIGRidmVuZG9yPSJEQjJVREJPUzM5MF9WNiIKKyAgICAgICAgICAgICAgICAgZWpiZGVwbG95PSJ0cnVlIgorICAgICAgICAgICAgICAgICBvbGRDTVA9ImZhbHNlIgorICAgICAgICAgICAgICAgICB0ZW1wZGlyPSIvdG1wIgorICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2Rpc3Quc2VydmVyfSImZ3Q7CisgICAgICAgICZsdDt3YXNjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke3dhczQuaG9tZX0vZGVwbG95dG9vbC9pdHAvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLmJvb3QvYm9vdC5qYXIiLyZndDsKKyAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7d2FzNC5ob21lfS9kZXBsb3l0b29sL2l0cC9wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmVqYmRlcGxveS9ydW50aW1lL2JhdGNoLmphciIvJmd0OworICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt3YXM0LmhvbWV9L2xpYi94ZXJjZXMuamFyIi8mZ3Q7CisgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke3dhczQuaG9tZX0vbGliL2l2amVqYjM1LmphciIvJmd0OworICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt3YXM0LmhvbWV9L2xpYi9qMmVlLmphciIvJmd0OworICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt3YXM0LmhvbWV9L2xpYi92YXBydC5qYXIiLyZndDsKKyAgICAgICAgJmx0Oy93YXNjbGFzc3BhdGgmZ3Q7CisgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgJmx0O3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCIvJmd0OworICAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAgICZsdDsvd2Vic3BoZXJlJmd0OworICAgICAgJmx0O2R0ZCBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCisgICAgICAgICAgIGxvY2F0aW9uPSIke2xpYn0vZHRkL2VqYi1qYXJfMV8xLmR0ZCIvJmd0OworICAgICZsdDsvZWpiamFyJmd0OworPC9wcmU+CisKKzxoMz48YSBuYW1lPSJlamJqYXJfaXBsYW5ldCI+aVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIgKGlBUykgZWxlbWVudDwvYT48L2gzPgorCitUaGUgJmx0O2lwbGFuZXQmbHQ7IG5lc3RlZCBlbGVtZW50IGlzIHVzZWQgdG8gYnVpbGQgaUFTLXNwZWNpZmljIHN0dWJzIGFuZAorCitza2VsZXRvbnMgYW5kIGNvbnN0cnVjdCBhIEpBUiBmaWxlIHdoaWNoIG1heSBiZSBkZXBsb3llZCB0byB0aGUgaVBsYW5ldAorQXBwbGljYXRpb24gU2VydmVyIDYuMC4gIFRoZSBidWlsZCBwcm9jZXNzIHdpbGwgYWx3YXlzIGRldGVybWluZSBpZgordGhlIEVKQiBzdHVicy9za2VsZXRvbnMgYW5kIHRoZSBFSkItSkFSIGZpbGUgYXJlIHVwIHRvIGRhdGUsIGFuZCBpdCB3aWxsCitkbyB0aGUgbWluaW11bSBhbW91bnQgb2Ygd29yayByZXF1aXJlZC4KKzxwPkxpa2UgdGhlIFdlYkxvZ2ljIGVsZW1lbnQsIGEgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHRoZSBFSkIgZGVzY3JpcHRvcnMKK2lzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIGZvciB0aGUgY29tcGxldGVkIEpBUiBmaWxlLgorRm9yIGV4YW1wbGUsIGlmIHRoZSBFSkIgZGVzY3JpcHRvciBlamIvQWNjb3VudC1lamItamFyLnhtbCBpcyBmb3VuZCBpbgordGhlIGRlc2NyaXB0b3IgZGlyZWN0b3J5LCB0aGUgaXBsYW5ldCBlbGVtZW50IHdpbGwgc2VhcmNoIGZvciBhbiBpQVMtc3BlY2lmaWMKK0VKQiBkZXNjcmlwdG9yIGZpbGUgbmFtZWQgZWpiL0FjY291bnQtaWFzLWVqYi1qYXIueG1sIChpZiBpdCBpc24ndCBmb3VuZCwKK3RoZSB0YXNrIHdpbGwgZmFpbCkgYW5kIGEgSkFSIGZpbGUgbmFtZWQgZWpiL0FjY291bnQuamFyIHdpbGwgYmUgd3JpdHRlbgoraW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gIE5vdGUgdGhhdCB3aGVuIHRoZSBFSkIgZGVzY3JpcHRvcnMKK2FyZSBhZGRlZCB0byB0aGUgSkFSIGZpbGUsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgcmVuYW1lZCBNRVRBLUlORi9lamItamFyLnhtbAorYW5kIE1FVEEtSU5GL2lhcy1lamItamFyLnhtbC48L3A+Cis8cD5PZiBjb3Vyc2UsIHRoaXMgbmFtaW5nIGJlaGF2aW91ciBjYW4gYmUgbW9kaWZpZWQgYnkgc3BlY2lmeWluZyBhdHRyaWJ1dGVzCitpbiB0aGUgZWpiamFyIHRhc2sgKGZvciBleGFtcGxlLCBiYXNlamFybmFtZSwgYmFzZW5hbWV0ZXJtaW5hdG9yLCBhbmQgZmxhdGRlc3RkaXIpCithcyB3ZWxsIGFzIHRoZSBpcGxhbmV0IGVsZW1lbnQgKGZvciBleGFtcGxlLCBzdWZmaXgpLiAgUmVmZXIgdG8gdGhlCithcHByb3ByaWF0ZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuPC9wPgorPGgzPgorUGFyYW1ldGVyczo8L2gzPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRyPgorPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKworPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorCis8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgorCis8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgSkFSIGZpbGVzIHdpbGwKK2JlIHdyaXR0ZW4uIEVhY2ggSkFSIGZpbGUgaXMgd3JpdHRlbiBpbiBkaXJlY3RvcmllcyB3aGljaCBjb3JyZXNwb25kIHRvCit0aGVpciBsb2NhdGlvbiB3aXRoaW4gdGhlICJkZXNjcmlwdG9yZGlyIiBuYW1lc3BhY2UuPC90ZD4KKworPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorPC90cj4KKworPHRyPgorPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorCis8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdXNlZCB3aGVuIGdlbmVyYXRpbmcgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMuCitJZiBvbWl0dGVkLCB0aGUgY2xhc3NwYXRoIHNwZWNpZmllZCBpbiB0aGUgImVqYmphciIgcGFyZW50IHRhc2sgd2lsbCBiZQordXNlZC4gIElmIHNwZWNpZmllZCwgdGhlIGNsYXNzcGF0aCBlbGVtZW50cyB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUKK2NsYXNzcGF0aCBzcGVjaWZpZWQgaW4gdGhlIHBhcmVudCAiZWpiamFyIiB0YXNrLiBOb3RlIHRoYXQgbmVzdGVkICJjbGFzc3BhdGgiCitlbGVtZW50cyBtYXkgYWxzbyBiZSB1c2VkLjwvdGQ+CisKKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIHZhbGlnbj0idG9wIj5rZWVwZ2VuZXJhdGVkPC90ZD4KKworPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIEphdmEgc291cmNlIGZpbGVzIHdoaWNoIGFyZQorZ2VuZXJhdGVkIGJ5IGVqYmMgd2lsbCBiZSBzYXZlZCBvciBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuIElmICJ5ZXMiLCB0aGUKK3NvdXJjZSBmaWxlcyB3aWxsIGJlIHJldGFpbmVkLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIm5vIi4gPC90ZD4KKworPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPmRlYnVnPC90ZD4KKworPHRkPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZWpiYyB1dGlsaXR5IHNob3VsZCBsb2cgYWRkaXRpb25hbCBkZWJ1Z2dpbmcKK3N0YXRlbWVudHMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gSWYgInllcyIsIHRoZSBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzCit3aWxsIGJlIGdlbmVyYXRlZC4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvICJubyIuIDwvdGQ+CisKKzx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIHZhbGlnbj0idG9wIj5pYXNob21lPC90ZD4KKworPHRkPk1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlICJob21lIiBkaXJlY3RvcnkgZm9yIHRoaXMgaUFTIGluc3RhbGxhdGlvbi4KK1RoaXMgaXMgdXNlZCB0byBmaW5kIHRoZSBlamJjIHV0aWxpdHkgaWYgaXQgaXNuJ3QgaW5jbHVkZWQgaW4gdGhlIHVzZXIncworc3lzdGVtIHBhdGguICBJZiBzcGVjaWZpZWQsIGl0IHNob3VsZCByZWZlciB0byB0aGUgW2luc3RhbGwtbG9jYXRpb25dL2lwbGFuZXQvaWFzNi9pYXMKK2RpcmVjdG9yeS4gIElmIG9taXR0ZWQsIHRoZSBlamJjIHV0aWxpdHkgbXVzdCBiZSBvbiB0aGUgdXNlcidzIHN5c3RlbQorcGF0aC4gPC90ZD4KKworPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgdmFsaWduPSJ0b3AiPnN1ZmZpeDwvdGQ+CisKKzx0ZD5TdHJpbmcgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIEpBUiBmaWxlbmFtZSB3aGVuIGNyZWF0aW5nIGVhY2ggSkFSLgorSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIi5qYXIiLiA8L3RkPgorCis8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8cD5BcyBub3RlZCBhYm92ZSwgdGhlIGlwbGFuZXQgZWxlbWVudCBzdXBwb3J0cyBhZGRpdGlvbmFsIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPgorbmVzdGVkIGVsZW1lbnRzLjwvcD4KKzxoMz4KK0V4YW1wbGVzPC9oMz4KK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHR5cGljYWwgdXNlIG9mIHRoZSA8Y29kZT4mbHQ7aXBsYW5ldCZndDs8L2NvZGU+IG5lc3RlZCBlbGVtZW50LgorSXQgd2lsbCBuYW1lIGVhY2ggRUpCLUpBUiB1c2luZyB0aGUgImJhc2VuYW1lIiBwcmVwZW5kZWQgdG8gZWFjaCBzdGFuZGFyZAorRUpCIGRlc2NyaXB0b3IuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGRlc2NyaXB0b3IgbmFtZWQgIkFjY291bnQtZWpiLWphci54bWwiCitpcyBwcm9jZXNzZWQsIHRoZSBFSkItSkFSIHdpbGwgYmUgbmFtZWQgIkFjY291bnQuamFyIgorPHByZT4KKyAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc2VzZGlyfSIKKyAgICAgICAgICAgIGRlc2NyaXB0b3JkaXI9IiR7c3JjfSImZ3Q7CisKKyAgICAgICAgICAgICZsdDtpcGxhbmV0IGRlc3RkaXI9IiR7YXNzZW1ibGUuZWpiamFyfSIKKyAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtpYXMuZWpiYy5jcGF0aH0iLyZndDsKKyAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyotZWpiLWphci54bWwiLyZndDsKKyAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqLyppYXMtKi54bWwiLyZndDsKKyAgICAmbHQ7L2VqYmphciZndDs8L3ByZT4KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50IGFzIHdlbGwKK2FzIHNvbWUgb2YgdGhlIG90aGVyIG9wdGlvbmFsIGF0dHJpYnV0ZXMuCis8cHJlPgorICAgICZsdDtlamJqYXIgc3JjZGlyPSIke2J1aWxkLmNsYXNzZXNkaXJ9IgorICAgICAgICAgICAgZGVzY3JpcHRvcmRpcj0iJHtzcmN9IiZndDsKKworICAgICAgICAgICAgJmx0O2lwbGFuZXQgZGVzdGRpcj0iJHthc3NlbWJsZS5lamJqYXJ9IgorICAgICAgICAgICAgICAgICAgICAgaWFzaG9tZT0iJHtpYXMuaG9tZX0iCisgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz0ieWVzIgorICAgICAgICAgICAgICAgICAgICAga2VlcGdlbmVyYXRlZD0ieWVzIiZndDsKKyAgICAgICAgICAgICAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9Ii4iLyZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZC5jbGFzc3BhdGh9Ii8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAgICAgICAgICZsdDsvaXBsYW5ldCZndDsKKyAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyotZWpiLWphci54bWwiLyZndDsKKyAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqLyppYXMtKi54bWwiLyZndDsKKyAgICAmbHQ7L2VqYmphciZndDs8L3ByZT4KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIGJhc2VqYXJuYW1lIGF0dHJpYnV0ZS4gIEluIHRoaXMKK2Nhc2UsIHRoZSBjb21wbGV0ZWQgRUpCLUpBUiB3aWxsIGJlIG5hbWVkICJIZWxsb1dvcmxkLmphciIgIElmIG11bHRpcGxlCitFSkIgZGVzY3JpcHRvcnMgbWlnaHQgYmUgZm91bmQsIGNhcmUgbXVzdCBiZSB0YWtlbiB0byBlbnN1cmUgdGhhdCB0aGUgY29tcGxldGVkCitKQVIgZmlsZXMgZG9uJ3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXIuCis8cHJlPgorICAgICZsdDtlamJqYXIgc3JjZGlyPSIke2J1aWxkLmNsYXNzZXNkaXJ9IgorICAgICAgICAgICAgZGVzY3JpcHRvcmRpcj0iJHtzcmN9IgorICAgICAgICAgICAgYmFzZWphcm5hbWU9IkhlbGxvV29ybGQiJmd0OworCisgICAgICAgICAgICAmbHQ7aXBsYW5ldCBkZXN0ZGlyPSIke2Fzc2VtYmxlLmVqYmphcn0iCisgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7aWFzLmVqYmMuY3BhdGh9Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLWVqYi1qYXIueG1sIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSIqKi8qaWFzLSoueG1sIi8mZ3Q7CisgICAgJmx0Oy9lamJqYXImZ3Q7PC9wcmU+CitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIGR0ZCBuZXN0ZWQgZWxlbWVudC4gSWYgdGhlIGxvY2FsCitjb3BpZXMgb2YgdGhlIERURHMgYXJlIGluY2x1ZGVkIGluIHRoZSBjbGFzc3BhdGgsIHRoZXkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5CityZWZlcmVuY2VkIHdpdGhvdXQgdGhlIG5lc3RlZCBlbGVtZW50cy4gIEluIGlBUyA2LjAgU1AyLCB0aGVzZSBsb2NhbCBEVERzIGFyZQorZm91bmQgaW4gdGhlIFtpQVMtaW5zdGFsbC1kaXJlY3RvcnldL0FQUFMgZGlyZWN0b3J5LiAgSW4gaUFTIDYuMCBTUDMsIHRoZXNlCitsb2NhbCBEVERzIGFyZSBmb3VuZCBpbiB0aGUgW2lBUy1pbnN0YWxsLWRpcmVjdG9yeV0vZHRkIGRpcmVjdG9yeS4KKzxwcmU+CisgICAgJmx0O2VqYmphciBzcmNkaXI9IiR7YnVpbGQuY2xhc3Nlc2Rpcn0iCisgICAgICAgICAgICBkZXNjcmlwdG9yZGlyPSIke3NyY30iJmd0OworICAgICAgICAgICAgJmx0O2lwbGFuZXQgZGVzdGRpcj0iJHthc3NlbWJsZS5lamJqYXJ9IiZndDsKKyAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtpYXMuZWpiYy5jcGF0aH0iLyZndDsKKyAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyotZWpiLWphci54bWwiLyZndDsKKyAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqLyppYXMtKi54bWwiLyZndDsKKworICAgICAgICAgICAgJmx0O2R0ZCBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCisgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke2lhcy5ob21lfS9BUFBTL2VqYi1qYXJfMV8xLmR0ZCIvJmd0OworICAgICAgICAgICAgJmx0O2R0ZCBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIGlBUyBFbnRlcnByaXNlIEphdmFCZWFucyAxLjAvL0VOIgorICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iJHtpYXMuaG9tZX0vQVBQUy9JQVNFamJfamFyXzFfMC5kdGQiLyZndDsKKyAgICAmbHQ7L2VqYmphciZndDs8L3ByZT4KKworPGgzPjxhIG5hbWU9ImVqYmphcl9qb25hcyI+Sk9uQVMgKEphdmEgT3BlbiBBcHBsaWNhdGlvbiBTZXJ2ZXIpIGVsZW1lbnQ8L2E+PC9oMz4KKworPHA+VGhlIDxjb2RlPiZsdDtqb25hcyZndDs8L2NvZGU+IG5lc3RlZCBlbGVtZW50IGlzIHVzZWQgdG8gYnVpbGQgSk9uQVMtc3BlY2lmaWMgc3R1YnMgYW5kCitza2VsZXRvbnMgdGhhbmtzIHRvIHRoZSA8Y29kZT5HZW5JQzwvY29kZT4gc3BlY2lmaWMgdG9vbCwgYW5kIGNvbnN0cnVjdCBhIEpBUgorZmlsZSB3aGljaCBtYXkgYmUgZGVwbG95ZWQgdG8gdGhlIEpPbkFTIEFwcGxpY2F0aW9uIFNlcnZlci4gVGhlIGJ1aWxkIHByb2Nlc3MKK3dpbGwgYWx3YXlzIGRldGVybWluZSBpZiB0aGUgRUpCIHN0dWJzL3NrZWxldG9ucyBhbmQgdGhlIEVKQi1KQVIgZmlsZSBhcmUgdXAgdG8KK2RhdGUsIGFuZCBpdCB3aWxsIGRvIHRoZSBtaW5pbXVtIGFtb3VudCBvZiB3b3JrIHJlcXVpcmVkLjwvcD4KKworPHA+TGlrZSB0aGUgV2ViTG9naWMgZWxlbWVudCwgYSBuYW1pbmcgY29udmVudGlvbiBmb3IgdGhlIEVKQiBkZXNjcmlwdG9ycyBpcworbW9zdCBjb21tb25seSB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgZm9yIHRoZSBjb21wbGV0ZWQgSkFSIGZpbGUuIEZvciBleGFtcGxlLAoraWYgdGhlIEVKQiBkZXNjcmlwdG9yIDxjb2RlPmVqYi9BY2NvdW50LWVqYi1qYXIueG1sPC9jb2RlPiBpcyBmb3VuZCBpbiB0aGUKK2Rlc2NyaXB0b3IgZGlyZWN0b3J5LCB0aGUgPGNvZGU+Jmx0O2pvbmFzJmd0OzwvY29kZT4gZWxlbWVudCB3aWxsIHNlYXJjaCBmb3IgYSBKT25BUy1zcGVjaWZpYworRUpCIGRlc2NyaXB0b3IgZmlsZSBuYW1lZCA8Y29kZT5lamIvQWNjb3VudC1qb25hcy1lamItamFyLnhtbDwvY29kZT4gYW5kIGEgSkFSCitmaWxlIG5hbWVkIDxjb2RlPmVqYi9BY2NvdW50LmphcjwvY29kZT4gd2lsbCBiZSB3cml0dGVuIGluIHRoZSBkZXN0aW5hdGlvbgorZGlyZWN0b3J5LiBCdXQgdGhlIDxjb2RlPiZsdDtqb25hcyZndDs8L2NvZGU+IGVsZW1lbnQgY2FuIGFsc28gdXNlIHRoZSBKT25BUyBuYW1pbmcKK2NvbnZlbnRpb24uIFdpdGggdGhlIHNhbWUgZXhhbXBsZSBhcyBiZWxvdywgdGhlIEVKQiBkZXNjcmlwdG9yIGNhbiBhbHNvIGJlIG5hbWVkCis8Y29kZT5lamIvQWNjb3VudC54bWw8L2NvZGU+IChubyBiYXNlIG5hbWUgdGVybWluYXRvciBoZXJlKSBpbiB0aGUgZGVzY3JpcHRvcgorZGlyZWN0b3J5LiBUaGVuIHRoZSA8Y29kZT4mbHQ7am9uYXMmZ3Q7PC9jb2RlPiBlbGVtZW50IHdpbGwgc2VhcmNoIGZvciBhIEpPbkFTLXNwZWNpZmljIEVKQgorZGVzY3JpcHRvciBmaWxlIGNhbGxlZCA8Y29kZT5lamIvam9uYXMtQWNjb3VudC54bWw8L2NvZGU+LiBUaGlzIGNvbnZlbnRpb24gZG8KK25vdCBmb2xsb3cgc3RyaWN0bHkgdGhlIGVqYi1qYXIgbmFtaW5nIGNvbnZlbnRpb24gcmVjb21tZW5kYXRpb24gYnV0IGlzCitzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9uIG9mIEpPbkFTLjwvcD4KKworPHA+Tm90ZSB0aGF0IHdoZW4gdGhlIEVKQiBkZXNjcmlwdG9ycyBhcmUgYWRkZWQgdG8gdGhlIEpBUiBmaWxlLCB0aGV5IGFyZQorYXV0b21hdGljYWxseSByZW5hbWVkIDxjb2RlPk1FVEEtSU5GL2VqYi1qYXIueG1sPC9jb2RlPiBhbmQKKzxjb2RlPk1FVEEtSU5GL2pvbmFzLWVqYi1qYXIueG1sPC9jb2RlPi48L3A+CisKKzxwPk9mIGNvdXJzZSwgdGhpcyBuYW1pbmcgYmVoYXZpb3IgY2FuIGJlIG1vZGlmaWVkIGJ5IHNwZWNpZnlpbmcgYXR0cmlidXRlcyBpbgordGhlIGVqYmphciB0YXNrIChmb3IgZXhhbXBsZSwgYmFzZWphcm5hbWUsIGJhc2VuYW1ldGVybWluYXRvciwgYW5kIGZsYXRkZXN0ZGlyKQorYXMgd2VsbCBhcyB0aGUgaXBsYW5ldCBlbGVtZW50IChmb3IgZXhhbXBsZSwgc3VmZml4KS4gUmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlCitkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuPC9wPgorCis8aDM+IFBhcmFtZXRlcnM6PC9oMz4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249IlRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgICA8dGQgYWxpZ249IkNlbnRlciIgdmFsaWduPSJUb3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPmRlc3RkaXI8L3RkPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIEpBUiBmaWxlcworICAgICAgd2lsbCBiZSB3cml0dGVuLiBFYWNoIEpBUiBmaWxlIGlzIHdyaXR0ZW4gaW4gZGlyZWN0b3JpZXMgd2hpY2ggY29ycmVzcG9uZAorICAgICAgdG8gdGhlaXIgbG9jYXRpb24gd2l0aGluIHRoZSAiPGNvZGU+ZGVzY3JpcHRvcmRpcjwvY29kZT4iIG5hbWVzcGFjZS48L3RkPgorICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIj5qb25hc3Jvb3Q8L3RkPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIj5UaGUgcm9vdCBkaXJlY3RvcnkgZm9yIEpPbkFTLjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUb3AiIGFsaWduPSJDZW50ZXIiPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPlRoZSBjbGFzc3BhdGggdXNlZCB3aGVuIGdlbmVyYXRpbmcgRUpCIHN0dWJzIGFuZAorICAgICAgc2tlbGV0b25zLiBJZiBvbWl0dGVkLCB0aGUgY2xhc3NwYXRoIHNwZWNpZmllZCBpbiB0aGUgImVqYmphciIgcGFyZW50CisgICAgICB0YXNrIHdpbGwgYmUgdXNlZC4gSWYgc3BlY2lmaWVkLCB0aGUgY2xhc3NwYXRoIGVsZW1lbnRzIHdpbGwgYmUgcHJlcGVuZGVkCisgICAgICB0byB0aGUgY2xhc3NwYXRoIHNwZWNpZmllZCBpbiB0aGUgcGFyZW50ICJlamJqYXIiIHRhc2sgKHNlZSBhbHNvIHRoZSBPUkIKKyAgICAgIGF0dHJpYnV0ZSBkb2N1bWVudGF0aW9uIGJlbG93KS4gTm90ZSB0aGF0IG5lc3RlZCAiY2xhc3NwYXRoIiBlbGVtZW50cyBtYXkKKyAgICAgIGFsc28gYmUgdXNlZC48L3RkPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIiBhbGlnbj0iQ2VudGVyIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPmtlZXBnZW5lcmF0ZWQ8L3RkPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIj48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaW50ZXJtZWRpYXRlIEphdmEKKyAgICAgIHNvdXJjZSBmaWxlcyBnZW5lcmF0ZWQgYnkgR2VuSUMgbXVzdCBiZSBkZWxldGVkIG9yIG5vdC4gSWYKKyAgICAgIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgorICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPm5vY29tcGlsPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249IlRvcCI+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMKKyAgICAgIG11c3Qgbm90IGJlIGNvbXBpbGVkIHZpYSB0aGUgamF2YSBhbmQgcm1pIGNvbXBpbGVycy4gSWYgb21pdHRlZCwKKyAgICAgIGl0IGRlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgorICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPm5vdmFsaWRhdGlvbjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPjxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBYTUwgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0CisgICAgICBiZSBwYXJzZWQgd2l0aG91dCB2YWxpZGF0aW9uLiBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249IlRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIj5qYXZhYzwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPkphdmEgY29tcGlsZXIgdG8gdXNlLiBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cworICAgICAgdG8gdGhlIHZhbHVlIG9mIDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBwcm9wZXJ0eS48L3RkPgorICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPmphdmFjb3B0czwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPk9wdGlvbnMgdG8gcGFzcyB0byB0aGUgamF2YSBjb21waWxlci48L3RkPgorICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPnJtaWNvcHRzPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249IlRvcCI+T3B0aW9ucyB0byBwYXNzIHRvIHRoZSBybWkgY29tcGlsZXIuPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249IlRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5zZWNwcm9wYWc8L3RkPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgUk1JIFNrZWwuIGFuZAorICAgICAgU3R1Yi4gbXVzdCBiZSBtb2RpZmllZCB0byBpbXBsZW1lbnQgdGhlIGltcGxpY2l0IHByb3BhZ2F0aW9uIG9mCisgICAgICB0aGUgc2VjdXJpdHkgY29udGV4dCAodGhlIHRyYW5zYWN0aW9uYWwgY29udGV4dCBpcyBhbHdheXMKKyAgICAgIHByb3ZpZGVkKS4gSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249IlRvcCI+dmVyYm9zZTwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgLXZlcmJvc2Ugc3dpdGNoLiBJZgorICAgICAgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LjwvdGQ+CisgICAgICA8dGQgYWxpZ249IkNlbnRlciIgdmFsaWduPSJUb3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249IlRvcCI+YWRkaXRpb25hbGFyZ3M8L3RkPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIj5BZGQgYWRkaXRpb25hbCBhcmdzIHRvIEdlbklDLjwvdGQ+CisgICAgICA8dGQgYWxpZ249IkNlbnRlciIgdmFsaWduPSJUb3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249IlRvcCI+a2VlcGdlbmVyaWM8L3RkPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIj48Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2VuZXJpYyBKQVIgZmlsZSB1c2VkIGFzIGlucHV0CisgICAgICB0byBHZW5JQyBtdXN0IGJlIHJldGFpbmVkLiBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249IlRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIj5zdWZmaXg8L3RkPgorICAgICAgPHRkPlN0cmluZyB2YWx1ZSBhcHBlbmRlZCB0byB0aGUgSkFSIGZpbGVuYW1lIHdoZW4gY3JlYXRpbmcgZWFjaCBKQVIuICBJZgorICAgICAgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIi5qYXIiLiA8L3RkPgorICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJUb3AiPm9yYjwvdGQ+CisgICAgICA8dGQ+Q2hvb3NlIHlvdXIgT1JCIDogUk1JLCBKRVJFTUlFLCBEQVZJRC4gSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlCisgICAgICBvbmUgcHJlc2VudCBpbiBjbGFzc3BhdGguIElmIHNwZWNpZmllZCwgdGhlIGNvcnJlc3BvbmRpbmcgSk9uQVMgSkFSIGlzCisgICAgICBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBjbGFzc3BhdGguPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249IlRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0iVG9wIj5ub2dlbmljPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249IlRvcCI+SWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LAorICAgICAgSk9uQVMncyBHZW5JQyB3aWxsIG5vdCBiZSBydW4gb24gdGhlIEVKQiBKQVIuIFVzZSB0aGlzIGlmIHlvdQorICAgICAgcHJlZmVyIHRvIHJ1biBHZW5JQyBhdCBkZXBsb3ltZW50IHRpbWUuIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzCisgICAgICB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249IlRvcCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKworPHA+QXMgbm90ZWQgYWJvdmUsIHRoZSBqb25hcyBlbGVtZW50IHN1cHBvcnRzIGFkZGl0aW9uYWwgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+CituZXN0ZWQgZWxlbWVudHMuPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorCis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgZWpiamFyIGJlaW5nIHVzZWQgdG8gZ2VuZXJhdGUgZGVwbG95bWVudCBqYXJzIHVzaW5nIGEKK0pPbkFTIEVKQiBjb250YWluZXIuIFRoaXMgZXhhbXBsZSByZXF1aXJlcyB0aGUgbmFtaW5nIHN0YW5kYXJkIHRvIGJlIHVzZWQgZm9yCit0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gVXNpbmcgdGhpcyBmb3JtYXQgd2lsbCBjcmVhdGUgYSBFSkIgSkFSIGZpbGUgZm9yCitlYWNoIHZhcmlhdGlvbiBvZiAmbmJzcDsnKi1qYXIueG1sJyB0aGF0IGlzIGZvdW5kIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKK2RpcmVjdG9yeS4mbmJzcDs8L3A+CisKKzxwcmU+CisgICAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgICAgICAgICAgZGVzY3JpcHRvcmRpcj0iJHtkZXNjcmlwdG9yLmRpcn0iJmd0OworICAgICAgICAmbHQ7am9uYXMgZGVzdGRpcj0iJHtkZXBsb3ltZW50amFycy5kaXJ9IgorICAgICAgICAgICAgIGpvbmFzcm9vdD0iJHtqb25hcy5yb290fSIKKyAgICAgICAgICAgICBvcmI9IlJNSSIvJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvJmd0OworICAgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSIqKi9qb25hcy0qLnhtbCIvJmd0OworICAgICAgICAmbHQ7c3VwcG9ydCBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iJmd0OworICAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouY2xhc3MiLyZndDsKKyAgICAgICAgJmx0Oy9zdXBwb3J0Jmd0OworICAgICAgJmx0Oy9lamJqYXImZ3Q7Cis8L3ByZT4KKworPHA+VGhpcyBleGFtcGxlIHNob3dzIGVqYmphciBiZWluZyB1c2VkIHRvIGdlbmVyYXRlIGEgc2luZ2xlIGRlcGxveW1lbnQgamFyCit1c2luZyBhIEpPbkFTIEVKQiBjb250YWluZXIuIFRoaXMgZXhhbXBsZSBkb2VzIHJlcXVpcmUgdGhlIGRlcGxveW1lbnQKK2Rlc2NyaXB0b3JzIHRvIHVzZSB0aGUgbmFtaW5nIHN0YW5kYXJkLiBUaGlzIHdpbGwgY3JlYXRlIG9ubHkgb25lIGVqYiBqYXIgZmlsZSAtCisnVGhlRUpCSmFyLmphcicuPC9wPgorCis8cHJlPgorICAgICAgJmx0O2VqYmphciBzcmNkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCisgICAgICAgICAgICAgIGRlc2NyaXB0b3JkaXI9IiR7ZGVzY3JpcHRvci5kaXJ9IgorICAgICAgICAgICAgICBiYXNlamFybmFtZT0iVGhlRUpCSmFyIiZndDsKKyAgICAgICAgJmx0O2pvbmFzIGRlc3RkaXI9IiR7ZGVwbG95bWVudGphcnMuZGlyfSIKKyAgICAgICAgICAgICAgICAgIGpvbmFzcm9vdD0iJHtqb25hcy5yb290fSIKKyAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLmphciIKKyAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtkZXNjcmlwdG9yYnVpbGQuY2xhc3NwYXRofSIvJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi9lamItamFyLnhtbCIvJmd0OworICAgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSIqKi9qb25hcy1lamItamFyLnhtbCIvJmd0OworICAgICAgJmx0Oy9lamJqYXImZ3Q7Cis8L3ByZT4KKworCisKKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2Z0cC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9mdHAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzY4MWNkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9mdHAuaHRtbApAQCAtMCwwICsxLDcxOCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5GVFAgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iZnRwIj5GVFA8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5UaGUgZnRwIHRhc2sgaW1wbGVtZW50cyBhIGJhc2ljIEZUUCBjbGllbnQgdGhhdCBjYW4gc2VuZCwgcmVjZWl2ZSwKK2xpc3QsIGRlbGV0ZSBmaWxlcywgYW5kIGNyZWF0ZSBkaXJlY3Rvcmllcy4gIFNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zIGFuZCBleGFtcGxlcyBvZiBob3cKK3RvIHBlcmZvcm0gZWFjaCB0YXNrLjwvcD4KKzxwPjxiPk5vdGU6PC9iPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLgorU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNjb21tb25zLW5ldCI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorPGk+R2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnksIGZvciB0aGUgYmVzdCBzdXBwb3J0IGluIEFudDwvaT4KKworPC9wPgorPHA+VGhlIGZ0cCB0YXNrIGF0dGVtcHRzIHRvIGRldGVybWluZSB3aGF0IGZpbGUgc3lzdGVtIGlzIGluIHBsYWNlIG9uIHRoZSBGVFAgc2VydmVyLgorU3VwcG9ydGVkIHNlcnZlciB0eXBlcyBhcmUgVW5peCwgTlQsIE9TMiwgVk1TLCBhbmQgT1M0MDAuICBJbiBhZGRpdGlvbiwgTlQgYW5kIE9TNDAwIHNlcnZlcnMKK3doaWNoIGhhdmUgYmVlbiBjb25maWd1cmVkIHRvIGRpc3BsYXkgdGhlIGRpcmVjdG9yeSBpbiBVbml4IHN0eWxlIGFyZSBhbHNvIHN1cHBvcnRlZCBjb3JyZWN0bHkuCitPdGhlcndpc2UsIHRoZSBzeXN0ZW0gd2lsbCBkZWZhdWx0IHRvIFVuaXggc3RhbmRhcmRzLgorPGk+cmVtb3RlZGlyPC9pPiBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgZXhhY3Qgc3ludGF4IHJlcXVpcmVkIGJ5IHRoZSBmdHAKK3NlcnZlci4gSWYgdGhlIHVzdWFsIFVuaXggY29udmVudGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciwKKzxpPnNlcGFyYXRvcjwvaT4gY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBmaWxlIHNlcGFyYXRvciB0aGF0IHNob3VsZCBiZSB1c2VkCitpbnN0ZWFkLjwvcD4KKzxwPlNlZSB0aGUgc2VjdGlvbiBvbiA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZAordGFza3M8L2E+LCBvbiBob3cgdGhlIGluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8KK3dyaXRlIHBhdHRlcm5zLjwvcD4KKzxwPgorVGhpcyB0YXNrIGRvZXMgbm90IGN1cnJlbnRseSB1c2UgdGhlIHByb3h5IGluZm9ybWF0aW9uIHNldCBieSB0aGUKKzxhIGhyZWY9InNldHByb3h5Lmh0bWwiPjxjb2RlPiZsdDtzZXRwcm94eSZndDs8L2NvZGU+PC9hPiB0YXNrLCBhbmQgY2Fubm90IGdvIHRocm91Z2gKK2EgZmlyZXdhbGwgdmlhIHNvY2tzLiAKKzxwPgorPGI+V2FybmluZzogPC9iPiB0aGVyZSBoYXZlIGJlZW4gcHJvYmxlbXMgcmVwb3J0ZWQgY29uY2VybmluZyB0aGUgZnRwIGdldCB3aXRoIHRoZSA8Y29kZT5uZXdlcjwvY29kZT4gYXR0cmlidXRlLgorUHJvYmxlbXMgbWlnaHQgYmUgZHVlIHRvIGZvcm1hdCBvZiBscyAtbCBkaWZmZXJpbmcgZnJvbSB3aGF0IGlzIGV4cGVjdGVkIGJ5IGNvbW1vbnMtbmV0LAorZm9yIGluc3RhbmNlIGR1ZSB0byBzcGVjaWZpY2l0aWVzIG9mIGxhbmd1YWdlIHVzZWQgYnkgdGhlIGZ0cCBzZXJ2ZXIgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nLgorSWYgeW91IGVuY291bnRlciBzdWNoIGEgcHJvYmxlbSwgcGxlYXNlIHNlbmQgYW4gZW1haWwgaW5jbHVkaW5nIGEgc2FtcGxlIGRpcmVjdG9yeSBsaXN0aW5nCitjb21pbmcgZnJvbSB5b3VyIGZ0cCBzZXJ2ZXIgKGxzIC1sIG9uIHRoZSBmdHAgcHJvbXB0KS4KKzwvcD4KKzxwPgorSWYgeW91IGNhbiBjb25uZWN0IGJ1dCBub3QgdXBsb2FkIG9yIGRvd25sb2FkLCB0cnkgc2V0dGluZyB0aGUgPGNvZGU+cGFzc2l2ZTwvY29kZT4KK2F0dHJpYnV0ZSB0byB0cnVlIHRvIHVzZSB0aGUgZXhpc3RpbmcgKG9wZW4pIGNoYW5uZWwsIGluc3RlYWQgb2YgaGF2aW5nIHRoZSBzZXJ2ZXIKK3RyeSB0byBzZXQgdXAgYSBuZXcgY29ubmVjdGlvbi48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNSUiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjY1JSI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMCUiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNlcnZlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGZ0cCBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBvcnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHBvcnQgbnVtYmVyIG9mIHRoZSByZW1vdGUgZnRwIHNlcnZlci4KKyAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHBvcnQgMjEuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcmlkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIGZ0cCBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBsb2dpbiBwYXNzd29yZCB0byB1c2Ugb24gdGhlIGZ0cCBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFjY291bnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGFjY291bnQgdG8gdXNlIG9uIHRoZSBmdHAgc2VydmVyLgorICAgICAgICA8ZW0+c2luY2UgQW50IDEuNzwvZW0+LgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbW90ZWRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZW1vdGUgZGlyZWN0b3J5IG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgZnRwIHNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgc2VlIHRhYmxlIGJlbG93IGZvciBkZXRhaWxlZCB1c2FnZQorICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YWN0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmdHAgYWN0aW9uIHRvIHBlcmZvcm0sIGRlZmF1bHRpbmcgdG8gInNlbmQiLgorICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IHN1cHBvcnRzICJwdXQiLCAiZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICJkZWwiLCAibGlzdCIsICJjaG1vZCIsCisgICAgICAgICAgICAgICAgICAgICAibWtkaXIiLCAicm1kaXIiLCBhbmQgInNpdGUiLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJpbmFyeTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZWxlY3RzIGJpbmFyeS1tb2RlICgieWVzIikgb3IgdGV4dC1tb2RlCisgICAgICAgICAgICAgICAgICAgICAoIm5vIikgdHJhbnNmZXJzLgorICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gInllcyI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzaXZlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNlbGVjdHMgcGFzc2l2ZS1tb2RlICgieWVzIikgdHJhbnNmZXJzLCBmb3IKKyAgICAgICAgICAgICAgICAgICAgIGJldHRlciB0aHJvdWdoLWZpcmV3YWxsIGNvbm5lY3Rpdml0eSwgYXQgdGhlIHByaWNlCisgICAgICAgICAgICAgICAgICAgICBvZiBwZXJmb3JtYW5jZS4KKyAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvICJubyI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRpc3BsYXlzIGluZm9ybWF0aW9uIG9uIGVhY2ggZmlsZSB0cmFuc2ZlcnJlZCBpZiBzZXQgCisgICAgICAgICAgICAgICAgICAgICB0byAieWVzIi4gRGVmYXVsdHMgdG8gIm5vIi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXBlbmRzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRyYW5zZmVycyBvbmx5IG5ldyBvciBjaGFuZ2VkIGZpbGVzIGlmIHNldCB0byAKKyAgICAgICAgICAgICAgICAgICAgICJ5ZXMiLiBEZWZhdWx0cyB0byAibm8iLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5ld2VyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmEgc3lub255bSBmb3IgPGk+ZGVwZW5kczwvaT4uCisgICAgc2VlIHRpbWVkaWZmYXV0byBhbmQgdGltZWRpZmZtaWxsaXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aW1lZGlmZmF1dG88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2V0IHRvIDxjb2RlPiJ0cnVlIjwvY29kZT4KKyAgICB0byBtYWtlIGFudCBjYWxjdWxhdGUgdGhlIHRpbWUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLjxicj4KKyAgICA8ZW0+cmVxdWlyZXMgd3JpdGUgYWNjZXNzIGluIHRoZSByZW1vdGUgZGlyZWN0b3J5PC9lbT48YnI+CisgICAgU2luY2UgYW50IDEuNjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDxhIG5hbWU9InRpbWVzdGFtcEdyYW51bGFyaXR5Ii8+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVzdGFtcEdyYW51bGFyaXR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgZWl0aGVyIDxjb2RlPk1JTlVURTwvY29kZT4sIDxjb2RlPk5PTkU8L2NvZGU+LAorICAgICAob3IgeW91IG1heSBzcGVjaWZ5IDxjb2RlPiIiPC9jb2RlPiB3aGljaCBpcyBlcXVpdmFsZW50IHRvIG5vdCBzcGVjaWZ5aW5nIGEgdmFsdWUsCisgICAgIHVzZWZ1bCBmb3IgcHJvcGVydHktZmlsZSBkcml2ZW4gc2NyaXB0cykuICBBbGxvd3Mgb3ZlcnJpZGUgb2YgdGhlIHR5cGljYWwgc2l0dWF0aW9uIAorICAgICBpbiBQVVQgYW5kIEdFVCB3aGVyZSBsb2NhbCBmaWxlc3lzdGVtIHRpbWVzdGFtcHMgYXJlIDxjb2RlPkhIOm1tOnNzPC9jb2RlPiAKKyAgICAgYW5kIHRoZSB0eXBpY2FsIEZUUCBzZXJ2ZXIncyB0aW1lc3RhbXBzIGFyZSA8Y29kZT5ISDptbTwvY29kZT4uICBUaGlzIGNhbiB0aHJvdyAKKyAgICAgb2ZmIHVwdG9kYXRlIGNhbGN1bGF0aW9ucy4gIEhvd2V2ZXIsIHRoZSBkZWZhdWx0IHZhbHVlcyBzaG91bGQgc3VmZmljZSBmb3IgbW9zdAorICAgICBhcHBsaWNhdGlvbnMuPGJyPgorICAgIFNpbmNlIGFudCAxLjcKKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uICBPbmx5IGFwcGxpZXMgaW4gInB1dHMiIGFuZCAiZ2V0cyIgd2hlcmUgdGhlCisgICAgZGVmYXVsdCB2YWx1ZXMgYXJlIDxjb2RlPk1JTlVURTwvY29kZT4gZm9yIFBVVCBhbmQgPGNvZGU+Tk9ORTwvY29kZT4gZm9yIEdFVC4gIAorICAgIChJdCBpcyBub3QgYXMgbmVjZXNzYXJ5IGluIEdFVCBiZWNhdXNlIHdlIGhhdmUgdGhlIDxiPnByZXNlcnZlbGFzdG1vZGlmaWVkPC9iPiBvcHRpb24uKTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVkaWZmbWlsbGlzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlcHJlY2F0ZWQ8L2I+LiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGFkZCB0byB0aGUgdGltZSBvbiAKKyAgICB0aGUgcmVtb3RlIG1hY2hpbmUgdG8gZ2V0IHRoZSB0aW1lIG9uIHRoZSBsb2NhbCBtYWNoaW5lLiAgVGhlIDxiPnRpbWVzdGFtcEdyYW51bGFyaXR5PC9iPiAKKyAgICBhdHRyaWJ1dGUgKGZvciB3aGljaCB0aGUgZGVmYXVsdCB2YWx1ZXMgc2hvdWxkIHN1ZmZpY2UgaW4gbW9zdCBzaXR1YXRpb25zKSwgYW5kIHRoZSAKKyAgICA8Yj5zZXJ2ZXJUaW1lWm9uZUNvbmZpZzwvYj4gb3B0aW9uLCBzaG91bGQgbWFrZSB0aGlzIHVubmVjZXNzYXJ5LiAKKyAgICA8Yj5zZXJ2ZXJUaW1lWm9uZUNvbmZpZzwvYj4gZG9lcyB0aGUgbWF0aCBmb3IgeW91IGFuZCBhbHNvIGtub3dzIGFib3V0IAorICAgIERheWxpZ2h0IFNhdmluZ3MgVGltZS48YnI+CisgICAgU2luY2UgYW50IDEuNgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNlcGFyYXRvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZXRzIHRoZSBmaWxlIHNlcGFyYXRvciB1c2VkIG9uIHRoZSBmdHAgc2VydmVyLgorICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gIi8iLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVtYXNrPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNldHMgdGhlIGRlZmF1bHQgZmlsZSBwZXJtaXNzaW9ucyBmb3IgbmV3IGZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgdW5peCBvbmx5LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNobW9kPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNldHMgb3IgY2hhbmdlcyBmaWxlIHBlcm1pc3Npb25zIGZvciBuZXcgb3IgZXhpc3RpbmcgZmlsZXMsCisgICAgICB1bml4IG9ubHkuIElmIHVzZWQgd2l0aCBhIHB1dCBhY3Rpb24sIGNobW9kIHdpbGwgYmUgaXNzdWVkIGZvciBlYWNoIGZpbGUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGlzdGluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSB0byB3cml0ZSByZXN1bHRzIG9mIHRoZSAibGlzdCIgYWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgZm9yIHRoZSAibGlzdCIgYWN0aW9uLCBpZ25vcmVkIG90aGVyd2lzZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVOb25jcml0aWNhbEVycm9yczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mbGFnIHdoaWNoIHBlcm1pdHMgdGhlIHRhc2sgdG8gaWdub3JlIHNvbWUgbm9uLWZhdGFsIGVycm9yCisgICAgICBjb2RlcyBzZW50IGJ5IHNvbWUgc2VydmVycyBkdXJpbmcgZGlyZWN0b3J5IGNyZWF0aW9uOiB3dS1mdHAgaW4gcGFydGljdWxhci4KKyAgICAgIERlZmF1bHQ6IGZhbHNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2tpcEZhaWxlZFRyYW5zZmVyczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mbGFnIHdoaWNoIGVuYWJsZXMgdW5zdWNjZXNzZnVsIGZpbGUgcHV0LCBkZWxldGUKKyAgICBhbmQgZ2V0IG9wZXJhdGlvbnMgdG8gYmUgc2tpcHBlZCB3aXRoIGEgd2FybmluZyBhbmQgdGhlCisgICAgcmVtYWluZGVyIG9mIHRoZSBmaWxlcyBzdGlsbCB0cmFuc2ZlcnJlZC4gRGVmYXVsdDogZmFsc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPiAgCisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByZXNlcnZlbGFzdG1vZGlmaWVkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkdpdmUgdGhlIGNvcGllZCBmaWxlcyB0aGUgc2FtZSBsYXN0IG1vZGlmaWVkCisgICAgICB0aW1lIGFzIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMgKGFwcGxpZXMgdG8gZ2V0dGluZyBmaWxlcyBvbmx5KS4KKyAgICAgICg8ZW0+Tm90ZTwvZW0+OiBJZ25vcmVkIG9uIEphdmEgMS4xKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmV0cmllc0FsbG93ZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IHRoZSBudW1iZXIgb2YgcmV0cmllcyBhbGxvd2VkIG9uIGFuIGZpbGUtdHJhbnNmZXIgb3BlcmF0aW9uLgorICAgIElmIGEgbnVtYmVyID4gMCBzcGVjaWZpZWQsIGVhY2ggZmlsZSB0cmFuc2ZlciBjYW4gZmFpbCB1cCB0byB0aGF0CisgICAgbWFueSB0aW1lcyBiZWZvcmUgdGhlIG9wZXJhdGlvbiBpcyBmYWlsZWQuICBJZiAtMSBvciAiZm9yZXZlciIgc3BlY2lmaWVkLCB0aGUKKyAgICBvcGVyYXRpb24gd2lsbCBrZWVwIHRyeWluZyB1bnRpbCBpdCBzdWNjZWVkcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIDA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zaXRlQ29tbWFuZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgdGhlIHNlcnZlci1zcGVjaWZpYyBTSVRFIGNvbW1hbmQgdG8gZXhlY3V0ZSBpZgorICAgIHRoZSA8Y29kZT5hY3Rpb248L2NvZGU+IGF0dHJpYnV0ZSBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgPGNvZGU+InNpdGUiPC9jb2RlPi4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5pdGlhbFNpdGVDb21tYW5kPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNldCBhIHNlcnZlci1zcGVjaWZpYyBTSVRFIGNvbW1hbmQgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseQorICAgIGFmdGVyIGxvZ2luLgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorCisgICAgPHRyPgorICAgIDx0ZCBjb2xzcGFuPSIzIj4KKyAgICA8cD48Yj5UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgcmVxdWlyZSA8YSBocmVmPQorICAgICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbmV0L2Rvd25sb2FkLmh0bWwiPgorICAgIGpha2FydGEtY29tbW9ucy1uZXQtMS40LjAgb3IgZ3JlYXRlcjwvYT4uPC9iPjwvcD4KKyAgICA8cD4KKyAgICBVc2UgdGhlc2Ugb3B0aW9ucyB3aGVuIHRoZSBzdGFuZGFyZCBvcHRpb25zIGRvbid0IHdvcmssIGJlY2F1c2UKKyAgICA8dWw+PGxpPnRoZSBzZXJ2ZXIgaXMgaW4gYSBkaWZmZXJlbnQgdGltZXpvbmUgYW5kIHlvdSBuZWVkIHRpbWVzdGFtcAorICAgIGRlcGVuZGVuY3kgY2hlY2tpbmc8L2xpPgorICAgIDxsaT50aGUgZGVmYXVsdCB0aW1lc3RhbXAgZm9ybWF0dGluZyBkb2Vzbid0IG1hdGNoIHRoZSBzZXJ2ZXIgZGlzcGxheSBhbmQKKyAgICBsaXN0IHBhcnNpbmcgdGhlcmVmb3JlIGZhaWxzPC9saT48L3VsPgorICAgIDwvcD48cD4KKyAgICBJZiBub25lIG9mIHRoZXNlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgbWVjaGFuaXNtIG9mIGxldHRpbmcgdGhlIHN5c3RlbQorICAgIGF1dG8tZGV0ZWN0IHRoZSBzZXJ2ZXIgT1MgdHlwZSBiYXNlZCBvbiB0aGUgRlRQIFNZU1QgY29tbWFuZCBhbmQgYXNzdW1pbmcKKyAgICBzdGFuZGFyZCBmb3JtYXR0aW5nIGZvciB0aGF0IE9TIHR5cGUgd2lsbCBiZSB1c2VkLgorICAgIDwvcD48cD4KKyAgICBUbyBhaWQgaW4gcHJvcGVydHktZmlsZS1iYXNlZCBkZXZlbG9wbWVudCB3aGVyZSBhIGJ1aWxkIHNjcmlwdCBpcyBjb25maWd1cmVkCisgICAgd2l0aCBwcm9wZXJ0eSBmaWxlcywgZm9yIGFueSBvZiB0aGVzZSBhdHRyaWJ1dGVzLCBhIHZhbHVlIG9mIDxjb2RlPiIiPC9jb2RlPgorICAgIGlzIGVxdWl2YWxlbnQgdG8gbm90IHNwZWNpZnlpbmcgaXQuCisgICAgPC9wPjxwPgorICAgIFBsZWFzZSB1bmRlcnN0YW5kIHRoYXQgdGhlc2Ugb3B0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlIGF1dG9kZXRlY3Rpb24KKyAgICBzY2hlbWUuICBJZiBhbnkgb2YgdGhlc2Ugb3B0aW9ucyBpcyBzcGVjaWZpZWQsIChvdGhlciB0aGFuIHdpdGggYSB2YWx1ZSBvZgorICAgIDxjb2RlPiIiPC9jb2RlPiApIGEgc3lzdGVtIHR5cGUgbXVzdCBiZSBjaG9zZW4gYW5kIGlmIHN5c3RlbVR5cGVLZXkgaXMgbm90CisgICAgc3BlY2lmaWVkLCBVTklYIHdpbGwgYmUgYXNzdW1lZC4gVGhlIHBoaWxvc29waHkgYmVoaW5kIHRoaXMgaXMgdGhhdCB0aGVzZQorICAgIG9wdGlvbnMgYXJlIGZvciBzZXR0aW5nIG5vbi1zdGFuZGFyZCBmb3JtYXRzLCBhbmQgYSBidWlsZC1zY3JpcHQgYXV0aG9yIHdobworICAgIGtub3dzIHdoYXQgc3lzdGVtIGhlIGlzIGRlYWxpbmcgd2l0aCB3aWxsIGtub3cgd2hhdCBvcHRpb25zIHRvIG5lZWQgdG8gYmUKKyAgICBzZXQuIE90aGVyd2lzZSwgdGhlc2Ugb3B0aW9ucyBzaG91bGQgYmUgbGVmdCBhbG9uZSBhbmQgdGhlIGRlZmF1bHQKKyAgICBhdXRvZGV0ZWN0aW9uIHNjaGVtZSBjYW4gYmUgdXNlZCBhbmQgd2lsbCB3b3JrIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcy4KKyAgICA8L3A+PC90ZD4KKyAgICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zeXN0ZW1UeXBlS2V5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBzeXN0ZW0gaW4gdXNlIG9uIHRoZSBzZXJ2ZXIuCisgICAgICBTdXBwb3J0ZWQgdmFsdWVzIGFyZSA8Y29kZT4iVU5JWCIsICJWTVMiLCAiV0lORE9XUyIsICJPUy8yIiwgIk9TLzQwMCIsCisgICAgICAiTVZTIi48L2NvZGU+ICBJZiBub3Qgc3BlY2lmaWVkLCAob3Igc3BlY2lmaWVkIGFzIDxjb2RlPiIiPC9jb2RlPikgYW5kIGlmCisgICAgICBubyBvdGhlciB4eHhDb25maWcgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkLCB0aGUgYXV0b2RlY3RlY3Rpb24gbWVjaGFuaXNtCisgICAgICBiYXNlZCBvbiB0aGUgRlRQIFNZU1QgY29tbWFuZCB3aWxsIGJlIHVzZWQuPGJyPgorICAgICAgU2luY2UgYW50IDEuNworICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgYnV0IGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIHh4eENvbmZpZworICAgICAgICBhdHRyaWJ1dGVzIGlzIHNwZWNpZmllZCwgVU5JWCB3aWxsIGJlIGFzc3VtZWQsIGV2ZW4gaWYgPGNvZGU+IiI8L2NvZGU+CisgICAgICAgIGlzIHNwZWNpZmllZCBoZXJlLgorICAgIDwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2VydmVyVGltZVpvbmVDb25maWc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSBhcyBhIEphdmEKKyAgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9UaW1lWm9uZS5odG1sIj4KKyAgICAgVGltZVpvbmU8L2E+IGlkZW50aWZpZXIsIChlLmcuIDxjb2RlPkdNVDwvY29kZT4sIDxjb2RlPkFtZXJpY2EvQ2hpY2FnbzwvY29kZT4gb3IKKyAgICA8Y29kZT5Bc2lhL0pha2FydGE8L2NvZGU+KSB0aGUgdGltZXpvbmUgdXNlZCBieSB0aGUgc2VydmVyIGZvciB0aW1lc3RhbXBzLiAgVGhpcyAKKyAgICAgIGVuYWJsZXMgdGltZXN0YW1wIGRlcGVuZGVuY3kgY2hlY2tpbmcgZXZlbiB3aGVuIHRoZSBzZXJ2ZXIgaXMgaW4gYSBkaWZmZXJlbnQgCisgICAgICB0aW1lIHpvbmUgZnJvbSB0aGUgY2xpZW50LiBUaW1lIFpvbmVzIGtub3csIGFsc28sIGFib3V0IGRheWxpZ2h0IHNhdmluZ3MgdGltZSwgCisgICAgICBhbmQgZG8gbm90IHJlcXVpcmUgeW91IHRvIGNhbGN1bGF0ZSBtaWxsaXNlY29uZHMgb2YgZGlmZmVyZW5jZS4gIElmIG5vdCBzcGVjaWZpZWQsIAorICAgICAgKG9yIHNwZWNpZmllZCBhcyA8Y29kZT4iIjwvY29kZT4pLCB0aGUgdGltZSB6b25lIG9mIHRoZSBjbGllbnQgaXMgYXNzdW1lZC48YnI+CisgICAgICBTaW5jZSBhbnQgMS43CisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIAorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdERhdGVGb3JtYXRDb25maWc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSBpbiBKYXZhIAorICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3RleHQvU2ltcGxlRGF0ZUZvcm1hdC5odG1sIj4KKyAgICAgU2ltcGxlRGF0ZUZvcm1hdDwvYT4gbm90YXRpb24sIChlLmcuCisgICAgIDxjb2RlPnl5eXktTU0tZGQ8L2NvZGU+KSwgdGhlIGRhdGUgZm9ybWF0IGdlbmVyYWxseSB1c2VkIGJ5IHRoZSBGVFAgc2VydmVyCisgICAgICB0byBwYXJzZSBkYXRlcy4gIEluIHNvbWUgY2FzZXMgdGhpcyB3aWxsIGJlIHRoZSBvbmx5IGRhdGUgZm9ybWF0IHVzZWQuCisgICAgICBJbiBvdGhlcnMsICh1bml4IGZvciBleGFtcGxlKSB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgZGF0ZXMKKyAgICAgIG9sZGVyIHRoYW4gYSB5ZWFyIG9sZC4gKFNlZSA8Yj5yZWNlbnREYXRlRm9ybWF0Q29uZmlnPC9iPikuICBJZiBub3Qgc3BlY2lmaWVkLAorICAgICAgKG9yIHNwZWNpZmllZCBhcyA8Y29kZT4iIjwvY29kZT4pLCB0aGUgZGVmYXVsdCBkYXRlIGZvcm1hdCBmb3IgdGhlIHN5c3RlbQorICAgICAgdHlwZSBpbmRpY2F0ZWQgYnkgdGhlIDxiPnN5c3RlbVR5cGVLZXk8L2I+IGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQuPGJyPgorICAgICAgU2luY2UgYW50IDEuNworICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4KKyAgICBOby4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZWNlbnREYXRlRm9ybWF0Q29uZmlnPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgaW4gSmF2YSAKKyAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuaHRtbCI+CisgICAgIFNpbXBsZURhdGVGb3JtYXQ8L2E+IG5vdGF0aW9uLAorICAgICAgKGUuZy4gPGNvZGU+TU1NIGRkIGhoOm1tPC9jb2RlPikgdGhlIGRhdGUgZm9ybWF0IHVzZWQgYnkgdGhlIEZUUCBzZXJ2ZXIKKyAgICAgIHRvIHBhcnNlIGRhdGVzIGxlc3MgdGhhbiBhIHllYXIgb2xkLiAgSWYgbm90IHNwZWNpZmllZCAob3Igc3BlY2lmaWVkIGFzCisgICAgICA8Y29kZT4iIjwvY29kZT4pLCBhbmQgaWYgdGhlIHN5c3RlbSB0eXBlIGluZGljYXRlZCBieSB0aGUgc3lzdGVtIGtleSB1c2VzCisgICAgICBhIHJlY2VudCBkYXRlIGZvcm1hdCwgaXRzIHN0YW5kYXJkIGZvcm1hdCB3aWxsIGJlIHVzZWQuPGJyPgorICAgICAgU2luY2UgYW50IDEuNworICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWNzLnVjaS5lZHUvcHViL2lldGYvaHR0cC9yZWxhdGVkL2lzbzYzOS50eHQiPgorICAgICAgdHdvLWxldHRlciBJU08tNjM5IGxhbmd1YWdlIGNvZGU8L2E+IHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAgICAgIGxhbmd1YWdlIHVzZWQgYnkgdGhlIHNlcnZlciB0byBmb3JtYXQgbW9udGggbmFtZXMuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUKKyAgICAgIHNwZWNpZmllZCB3aGVuIHRoZSBzZXJ2ZXIgdXNlcyBub24tbnVtZXJpYyBhYmJyZXZpYXRpb25zIGZvciBtb250aHMgaW4gaXRzCisgICAgICBkYXRlIGxpc3RpbmdzIGluIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiBFbmdsaXNoLiAgVGhpcyBhcHBlYXJzIHRvIGJlCisgICAgICBiZWNvbWluZyByYXJlciBhbmQgcmFyZXIsIGFzIGNvbW1vbmx5IGRpc3RyaWJ1dGVkIGZ0cCBzZXJ2ZXJzIHNlZW0KKyAgICAgIGluY3JlYXNpbmdseSB0byB1c2UgRW5nbGlzaCBvciBhbGwtbnVtZXJpYyBmb3JtYXRzLgorICAgICAgTGFuZ3VhZ2VzIHN1cHBvcnRlZCBhcmU6CisgICAgICA8dWw+CisgICAgICAJPGxpPmVuIC0gRW5nbGlzaDwvbGk+CisgICAgICAJPGxpPmZyIC0gRnJlbmNoPC9saT4KKyAgICAgIAk8bGk+ZGUgLSBHZXJtYW48L2xpPgorICAgICAgCTxsaT5pdCAtIEl0YWxpYW48L2xpPgorICAgICAgCTxsaT5lcyAtIFNwYW5pc2g8L2xpPgorICAgICAgCTxsaT5wdCAtIFBvcnR1Z3Vlc2U8L2xpPgorICAgICAgCTxsaT5kYSAtIERhbmlzaDwvbGk+CisgICAgICAJPGxpPnN2IC0gU3dlZGlzaDwvbGk+CisgICAgICAJPGxpPm5vIC0gTm9yd2VnaWFuPC9saT4KKyAgICAgIAk8bGk+bmwgLSBEdXRjaDwvbGk+CisgICAgICAJPGxpPnJvIC0gUm9tYW5pYW48L2xpPgorICAgICAgCTxsaT5zcSAtIEFsYmFuaWFuPC9saT4KKyAgICAgIAk8bGk+c2ggLSBTZXJiby1jcm9hdGlhbjwvbGk+CisgICAgICAJPGxpPnNrIC0gU2xvdmFrPC9saT4KKyAgICAgIAk8bGk+c2wgLSBTbG92ZW5pYW48L2xpPgorICAgICAgPC91bD4KKyAgICAgIElmIHlvdSByZXF1aXJlIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiB0aGUgYWJvdmUsIHNlZSBhbHNvIHRoZQorICAgICAgPGI+c2hvcnRNb250aE5hbWVzQ29uZmlnPC9iPiBhdHRyaWJ1dGUuPGJyPgorICAgICAgU2luY2UgYW50IDEuNworICAgIDwvdGQ+CisKKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2hvcnRNb250aE5hbWVzQ29uZmlnPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNwZWNpZnkgdGhlIG1vbnRoIGFiYnJldmlhdGlvbnMgdXNlZCBvbiB0aGUgc2VydmVyIGluIGZpbGUKKyAgICAgIHRpbWVzdGFtcCBkYXRlcyBhcyBhIHBpcGUtZGVsaW1pdGVkIHN0cmluZyBmb3IgZWFjaCBtb250aC4gRm9yIGV4YW1wbGUsCisgICAgICBhIHNldCBvZiBtb250aCBuYW1lcyB1c2VkIGJ5IGEgaHlwb3RoZXRpY2FsCisgICAgICBJY2VsYW5kaWMgRlRQIHNlcnZlciBtaWdodCBjb25jZWl2YWJseSBiZSBzcGVjaWZpZWQgYXMKKyAgICAgIDxjb2RlPiJqYW58ZmVifG1hcnxhcHJ8bWEmI3hFRDt8aiYjeEZBO258aiYjeEZBO2x8JiN4RTE7ZyYjeEZBO3xzZXB8b2t0fG4mI3hGMzt2fGRlcyI8L2NvZGU+LgorICAgICAgVGhpcyBhdHRyaWJ1dGUgZXhpc3RzIHByaW1hcmlseSB0byBzdXBwb3J0IGxhbmd1YWdlcyBub3Qgc3VwcG9ydGVkIGJ5CisgICAgICB0aGUgPGI+c2VydmVyTGFuZ3VhZ2VDb2RlPC9iPiBhdHRyaWJ1dGUuPGJyPgorICAgICAgU2luY2UgYW50IDEuNworICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPk5vdGUgYWJvdXQgcmVtb3RlZGlyIGF0dHJpYnV0ZTwvaDM+Cis8dGFibGUgIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIgorID4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSIyMCUiPkFjdGlvbjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IiB3aWR0aD0iNDAlIj5tZWFuaW5nIG9mIDxjb2RlPnJlbW90ZWRpcjwvY29kZT48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+dXNlIG9mIG5lc3RlZCA8Y29kZT5maWxlc2V0PC9jb2RlPgorKHMpPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSIyMCUiPnNlbmQvcHV0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSI0MCUiPmJhc2UgZGlyZWN0b3J5IHRvCit3aGljaCB0aGUgZmlsZXMgYXJlIHNlbnQ8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+dGhleSBhcmUgdXNlZCBub3JtYWxseSBhbmQKK2V2YWx1YXRlZCBvbiB0aGUgbG9jYWwgbWFjaGluZTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IiB3aWR0aD0iMjAlIj5yZWN2L2dldDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IiB3aWR0aD0iNDAlIj5iYXNlIGRpcmVjdG9yeSBmcm9tCit3aGljaCB0aGUgZmlsZXMgYXJlIHJldHJpZXZlZDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij50aGUgcmVtb3RlIGZpbGVzIGxvY2F0ZWQgdW5kZXIKK3RoZSA8Y29kZT5yZW1vdGVkaXIgPC9jb2RlPm1hdGNoaW5nIHRoZSBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybnMgb2YKK3RoZSA8Y29kZT5maWxlc2V0Jm5ic3A7PC9jb2RlPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IiB3aWR0aD0iMjAlIj5kZWwvZGVsZXRlPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSI0MCUiPmJhc2UgZGlyZWN0b3J5IGZyb20KK3doaWNoIGZpbGVzIGdldCBkZWxldGVkPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnRoZSByZW1vdGUgZmlsZXMgbG9jYXRlZCB1bmRlcgordGhlIDxjb2RlPnJlbW90ZWRpciA8L2NvZGU+bWF0Y2hpbmcgdGhlIGluY2x1ZGUvZXhjbHVkZSBwYXR0ZXJucyBvZgordGhlIDxjb2RlPmZpbGVzZXQgPGJyPgorICAgICAgPC9jb2RlPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IiB3aWR0aD0iMjAlIj5saXN0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSI0MCUiPmJhc2UgZGlyZWN0b3J5IGZyb20KK3doaWNoIGZpbGVzIGFyZSBsaXN0ZWQ8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+dGhlIHJlbW90ZSBmaWxlcyBsb2NhdGVkIHVuZGVyCit0aGUgPGNvZGU+cmVtb3RlZGlyIDwvY29kZT5tYXRjaGluZyB0aGUgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIG9mCit0aGUgPGNvZGU+ZmlsZXNldCA8YnI+CisgICAgICA8L2NvZGU+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSIyMCUiPm1rZGlyPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSI0MCUiPmRpcmVjdG9yeSB0byBjcmVhdGU8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+bm90IHVzZWQ8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyIgd2lkdGg9IjIwJSI+Y2htb2Q8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyIgd2lkdGg9IjQwJSI+YmFzZSBkaXJlY3RvcnkgZnJvbQord2hpY2ggdGhlIG1vZGUgb2YgZmlsZXMgZ2V0IGNoYW5nZWQ8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+dGhlIHJlbW90ZSBmaWxlcyBsb2NhdGVkIHVuZGVyCit0aGUgPGNvZGU+cmVtb3RlZGlyIDwvY29kZT5tYXRjaGluZyB0aGUgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIG9mCit0aGUgPGNvZGU+ZmlsZXNldCA8YnI+CisgICAgICA8L2NvZGU+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSIyMCUiPnJtZGlyPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSI0MCUiPmJhc2UgZGlyZWN0b3J5IGZyb20KK3doaWNoIGRpcmVjdG9yaWVzIGdldCByZW1vdmVkPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnRoZSByZW1vdGUgZGlyZWN0b3JpZXMgbG9jYXRlZAordW5kZXIgdGhlIDxjb2RlPnJlbW90ZWRpciA8L2NvZGU+bWF0Y2hpbmcgdGhlIGluY2x1ZGUvZXhjbHVkZQorcGF0dGVybnMgb2YgdGhlIDxjb2RlPmZpbGVzZXQgPGJyPgorICAgICAgPC9jb2RlPjwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+PGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8aDQ+ZmlsZXNldDwvaDQ+Cis8cD5UaGUgZnRwIHRhc2sgc3VwcG9ydHMgYW55IG51bWJlciBvZiBuZXN0ZWQgPGEKK2hyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPjxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT48L2E+IGVsZW1lbnRzIHRvIHNwZWNpZnkKK3RoZSBmaWxlcyB0byBiZSByZXRyaWV2ZWQsIG9yIGRlbGV0ZWQsIG9yIGxpc3RlZCwgb3Igd2hvc2UgbW9kZSB5b3Ugd2FudCB0byBjaGFuZ2UuPC9wPgorPHA+CitUaGUgYXR0cmlidXRlIDxjb2RlPmZvbGxvd3N5bWxpbmtzPC9jb2RlPiBvZiA8Y29kZT5maWxlc2V0PC9jb2RlPiBpcyBzdXBwb3J0ZWQgb24KK2xvY2FsIChwdXQpIGFzIHdlbGwgYXMgcmVtb3RlIChnZXQsIGNobW9kLCBkZWxldGUpIGZpbGVzZXRzLgorPGVtPkJlZm9yZSBhbnQgMS42IHRoZXJlIHdhcyBubyBzdXBwb3J0IG9mIHN5bWJvbGljIGxpbmtzIGluIHJlbW90ZSBmaWxlc2V0cy4KK0luIG9yZGVyIHRvIGV4Y2x1ZGUgc3ltYm9saWMgbGlua3MgKHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiBhbnQgMS41LnggYW5kIG9sZGVyKSwKK3lvdSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IDxjb2RlPmZvbGxvd3N5bWxpbmtzPC9jb2RlPiB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC9lbT4KK09uIHJlbW90ZSBmaWxlc2V0cyBoaWRkZW4gZmlsZXMgYXJlIG5vdCBjaGVja2VkIGZvciBiZWluZyBzeW1ib2xpYyBsaW5rcy4gSGlkZGVuCitmaWxlcyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gbm90IGJlIHN5bWJvbGljIGxpbmtzLgorPC9wPgorPHA+CitSZW1vdGUgZmlsZXNldHMgZG8gbm90IHN1cHBvcnQgc2VsZWN0b3JzLjxicj4KKzwvcD4KKworPGgzPlNlbmRpbmcgRmlsZXM8L2gzPgorPHA+VGhlIGVhc2llc3Qgd2F5IHRvIGRlc2NyaWJlIGhvdyB0byBzZW5kIGZpbGVzIGlzIHdpdGggYSBjb3VwbGUgb2YgZXhhbXBsZXM6PC9wPgorPHByZT4KKyAgJmx0O2Z0cCBzZXJ2ZXI9ImZ0cC5hcGFjaGUub3JnIgorICAgICAgIHVzZXJpZD0iYW5vbnltb3VzIgorICAgICAgIHBhc3N3b3JkPSJtZUBteW9yZy5jb20iJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iaHRkb2NzL21hbnVhbCIvJmd0OworICAmbHQ7L2Z0cCZndDsKKzwvcHJlPgorPHA+TG9ncyBpbiB0byA8Y29kZT5mdHAuYXBhY2hlLm9yZzwvY29kZT4gYXMgPGNvZGU+YW5vbnltb3VzPC9jb2RlPiBhbmQgCit1cGxvYWRzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5IAordG8gdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciB0aGF0IHVzZXIuPC9wPgorPHByZT4gICZsdDtmdHAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgICByZW1vdGVkaXI9ImluY29taW5nIgorICAgICAgIHVzZXJpZD0iYW5vbnltb3VzIgorICAgICAgIHBhc3N3b3JkPSJtZUBteW9yZy5jb20iCisgICAgICAgZGVwZW5kcz0ieWVzIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiLyZndDsKKyAgJmx0Oy9mdHAmZ3Q7PC9wcmU+Cis8cD5Mb2dzIGluIHRvIDxjb2RlPmZ0cC5hcGFjaGUub3JnPC9jb2RlPiBhcyA8Y29kZT5hbm9ueW1vdXM8L2NvZGU+IGFuZAordXBsb2FkcyBhbGwgbmV3IG9yIGNoYW5nZWQgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeSAKK3RvIHRoZSA8Y29kZT5pbmNvbWluZzwvY29kZT4gZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IGRpcmVjdG9yeQorZm9yIDxjb2RlPmFub255bW91czwvY29kZT4uPC9wPgorPHByZT4gICZsdDtmdHAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgICBwb3J0PSIyMTIxIgorICAgICAgIHJlbW90ZWRpcj0iL3B1Yi9pbmNvbWluZyIKKyAgICAgICB1c2VyaWQ9ImNvZGVyIgorICAgICAgIHBhc3N3b3JkPSJqYXZhMSIKKyAgICAgICBwYXNzaXZlPSJ5ZXMiCisgICAgICAgZGVwZW5kcz0ieWVzIgorICAgICAgIGJpbmFyeT0ibm8iJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iaHRkb2NzL21hbnVhbCImZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDsvZnRwJmd0OzwvcHJlPgorPHA+TG9ncyBpbiB0byA8Y29kZT5mdHAuYXBhY2hlLm9yZzwvY29kZT4gYXQgcG9ydCA8Y29kZT4yMTIxPC9jb2RlPiBhcworPGNvZGU+Y29kZXI8L2NvZGU+IHdpdGggcGFzc3dvcmQgPGNvZGU+amF2YTE8L2NvZGU+IGFuZCB1cGxvYWRzIGFsbCBuZXcgb3IKK2NoYW5nZWQgSFRNTCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5IHRvIHRoZQorPGNvZGU+L3B1Yi9pbmNvbWluZzwvY29kZT4gZGlyZWN0b3J5LiBUaGUgZmlsZXMgYXJlIHRyYW5zZmVycmVkIGluIHRleHQgbW9kZS4KK1Bhc3NpdmUgbW9kZSBoYXMgYmVlbiBzd2l0Y2hlZCBvbiB0byBzZW5kIGZpbGVzIGZyb20gYmVoaW5kIGEgZmlyZXdhbGwuPC9wPgorPHByZT4gICZsdDtmdHAgc2VydmVyPSJmdHAuaHlwb3RoZXRpY2FsLmluZGlhLm9yZyIKKyAgICAgICBwb3J0PSIyMTIxIgorICAgICAgIHJlbW90ZWRpcj0iL3B1Yi9pbmNvbWluZyIKKyAgICAgICB1c2VyaWQ9ImNvZGVyIgorICAgICAgIHBhc3N3b3JkPSJqYXZhMSIKKyAgICAgICBkZXBlbmRzPSJ5ZXMiCisgICAgICAgYmluYXJ5PSJubyIKKyAgICAgICBzeXN0ZW1UeXBlS2V5PSJXaW5kb3dzIgorICAgICAgIHNlcnZlclRpbWVab25lQ29uZmlnPSJJbmRpYS9DYWxjdXR0YSImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIiZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouaHRtbCIvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0Oy9mdHAmZ3Q7PC9wcmU+Cis8cD5Mb2dzIGluIHRvIGEgV2luZG93cyBzZXJ2ZXIgYXQgPGNvZGU+ZnRwLmh5cG90aGV0aWNhbC5pbmRpYS5vcmc8L2NvZGU+CithdCBwb3J0IDxjb2RlPjIxMjE8L2NvZGU+IGFzIDxjb2RlPmNvZGVyPC9jb2RlPiB3aXRoIHBhc3N3b3JkIDxjb2RlPmphdmExPC9jb2RlPgorYW5kIHVwbG9hZHMgYWxsIG5ldyBvciBjaGFuZ2VkIChhY2NvdW50aW5nIGZvciB0aW1lem9uZSBkaWZmZXJlbmNlcykKK0hUTUwgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+CitkaXJlY3RvcnkgdG8gdGhlIDxjb2RlPi9wdWIvaW5jb21pbmc8L2NvZGU+IGRpcmVjdG9yeS4gVGhlIGZpbGVzIGFyZSB0cmFuc2ZlcnJlZAoraW4gdGV4dCBtb2RlLjwvcD4KKzxwcmU+ICAmbHQ7ZnRwIHNlcnZlcj0iZnRwLm50Lm9yZyIKKyAgICAgICByZW1vdGVkaXI9ImM6XHVwbG9hZHMiCisgICAgICAgdXNlcmlkPSJjb2RlciIKKyAgICAgICBwYXNzd29yZD0iamF2YTEiCisgICAgICAgc2VwYXJhdG9yPSJcIgorICAgICAgIHZlcmJvc2U9InllcyImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIiZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouaHRtbCIvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0Oy9mdHAmZ3Q7PC9wcmU+PHA+TG9ncyBpbiB0byB0aGUgV2luZG93cy1iYXNlZCA8Y29kZT5mdHAubnQub3JnPC9jb2RlPiBhcyAKKzxjb2RlPmNvZGVyPC9jb2RlPiB3aXRoIHBhc3N3b3JkIDxjb2RlPmphdmExPC9jb2RlPiBhbmQgdXBsb2FkcyBhbGwgCitIVE1MIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgdG8gdGhlIAorPGNvZGU+YzpcdXBsb2FkczwvY29kZT4gZGlyZWN0b3J5LiAgUHJvZ3Jlc3MgbWVzc2FnZXMgYXJlIGRpc3BsYXllZCBhcyBlYWNoCitmaWxlIGlzIHVwbG9hZGVkLjwvcD4KKzxoMz5HZXR0aW5nIEZpbGVzPC9oMz4KKzxwPkdldHRpbmcgZmlsZXMgZnJvbSBhbiBGVFAgc2VydmVyIHdvcmtzIHByZXR0eSBtdWNoIHRoZSBzYW1lIHdheSBhcyAKK3NlbmRpbmcgdGhlbSBkb2VzLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBuZXN0ZWQgZmlsZXNldHMKK3VzZSB0aGUgcmVtb3RlZGlyIGF0dHJpYnV0ZSBhcyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlcyBvbiB0aGUKK0ZUUCBzZXJ2ZXIsIGFuZCB0aGUgZGlyIGF0dHJpYnV0ZSBhcyB0aGUgbG9jYWwgZGlyZWN0b3J5IHRvIHB1dCB0aGUgZmlsZXMKK2ludG8uICBUaGUgZmlsZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgRlRQIHNpdGUgaXMgcHJlc2VydmVkIG9uIHRoZSBsb2NhbCBtYWNoaW5lLjwvcD4KKzxwcmU+CisgICZsdDtmdHAgYWN0aW9uPSJnZXQiCisgICAgICAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgICB1c2VyaWQ9ImFub255bW91cyIKKyAgICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiJmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7L2Z0cCZndDsKKzwvcHJlPgorPHA+TG9ncyBpbiB0byA8Y29kZT5mdHAuYXBhY2hlLm9yZzwvY29kZT4gYXMgPGNvZGU+YW5vbnltb3VzPC9jb2RlPiBhbmQgCityZWN1cnNpdmVseSBkb3dubG9hZHMgYWxsIC5odG1sIGZpbGVzIGZyb20gZGVmYXVsdCBkaXJlY3RvcnkgZm9yIHRoYXQgdXNlciAKK2ludG8gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeSBvbiB0aGUgbG9jYWwgbWFjaGluZS48L3A+Cis8cHJlPgorICAmbHQ7ZnRwIGFjdGlvbj0iZ2V0IgorICAgICAgIHNlcnZlcj0iZnRwLmFwYWNoZS5vcmciCisgICAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCisgICAgICAgcGFzc3dvcmQ9Im1lQG15b3JnLmNvbSIKKyAgICAgICBzeXN0ZW1UeXBlS2V5PSJVTklYIgorICAgICAgIGRlZmF1bHREYXRlRm9ybWF0Q29uZmlnPSJ5eXl5LU1NLWRkIEhIOm1tIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiJmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7L2Z0cCZndDsKKzwvcHJlPgorPHA+SWYgYXBhY2hlLm9yZyBldmVyIHN3aXRjaGVzIHRvIGEgdW5peCBGVFAgc2VydmVyIHRoYXQgdXNlcyB0aGUgbmV3IGFsbC1udW1lcmljCitmb3JtYXQgZm9yIHRpbWVzdGFtcHMsIHRoaXMgdmVyc2lvbiB3b3VsZCBiZWNvbWUgbmVjZXNzYXJ5LiAgSXQgd291bGQgYWNjb21wbGlzaAordGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSBidXQgd291bGQgc3VjY2Vzc2Z1bGx5IGhhbmRsZSB0aGUKK251bWVyaWMgdGltZXN0YW1wcy4KK1RoZSA8Y29kZT5zeXN0ZW1UeXBlS2V5PC9jb2RlPiBpcyBub3QgbmVjZXNzYXJ5IGhlcmUgYnV0IGhlbHBzIGNsYXJpZnkgd2hhdCBpcworZ29pbmcgb24uPC9wPgorPHByZT4KKyAgJmx0O2Z0cCBhY3Rpb249ImdldCIKKyAgICAgICBzZXJ2ZXI9ImZ0cC5oeXB0aGV0aWNhbC5mciIKKyAgICAgICB1c2VyaWQ9ImFub255bW91cyIKKyAgICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIgorICAgICAgIGRlZmF1bHREYXRlRm9ybWF0Q29uZmlnPSJkIE1NTSB5eXl5IgorICAgICAgIHJlY2VudERhdGVGb3JtYXRDb25maWc9ImQgTU1NIEhIOm1tIgorICAgICAgIHNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZz0iZnIiJmd0OworICAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiJmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7L2Z0cCZndDsKKzwvcHJlPgorPHA+TG9ncyBpbnRvIGEgVU5JWCBGVFAgc2VydmVyIGF0IDxjb2RlPmZ0cC5oeXBvdGhldGljYWwuZnI8L2NvZGU+IHdoaWNoIGRpc3BsYXlzCitkYXRlcyB3aXRoIEZyZW5jaCBuYW1lcyBpbiBTdGFuZGFyZCBFdXJvcGVhbiBmb3JtYXQsIGFzIDxjb2RlPmFub255bW91czwvY29kZT4sIGFuZAorcmVjdXJzaXZlbHkgZG93bmxvYWRzIGFsbCAuaHRtbCBmaWxlcyBmcm9tIGRlZmF1bHQgZGlyZWN0b3J5IGZvciB0aGF0IHVzZXIKK2ludG8gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeSBvbiB0aGUgbG9jYWwgbWFjaGluZS48L3A+CisKKzxoMz5EZWxldGluZyBGaWxlczwvaDM+CitBcyB5b3UndmUgcHJvYmFibHkgZ3Vlc3NlZCBieSBub3csIHlvdSB1c2UgbmVzdGVkIGZpbGVzZXQgZWxlbWVudHMgdG8gCitzZWxlY3QgdGhlIGZpbGVzIHRvIGRlbGV0ZSBmcm9tIHRoZSByZW1vdGUgRlRQIHNlcnZlci4gIEFnYWluLCB0aGUgCitmaWxlc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJlbW90ZSBkaXJlY3RvcnksIG5vdCBhIGxvY2FsIGRpcmVjdG9yeS4gIEluCitmYWN0LCB0aGUgZGlyIGF0dHJpYnV0ZSBvZiB0aGUgZmlsZXNldCBpcyBpZ25vcmVkIGNvbXBsZXRlbHkuCisKKzxwcmU+CisgICZsdDtmdHAgYWN0aW9uPSJkZWwiCisgICAgICAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgICB1c2VyaWQ9ImFub255bW91cyIKKyAgICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIiZndDsKKyAgICAmbHQ7ZmlsZXNldCZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyoudG1wIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7L2Z0cCZndDsKKzwvcHJlPgorPHA+TG9ncyBpbiB0byA8Y29kZT5mdHAuYXBhY2hlLm9yZzwvY29kZT4gYXMgPGNvZGU+YW5vbnltb3VzPC9jb2RlPiBhbmQKK3RyaWVzIHRvIGRlbGV0ZSBhbGwgKi50bXAgZmlsZXMgZnJvbSB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgZm9yIHRoYXQgdXNlci4KK0lmIHlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgZmlsZSwgYSBCdWlsZEV4Y2VwdGlvbiBpcyB0aHJvd24uPC9wPgorPGgzPkxpc3RpbmcgRmlsZXM8L2gzPgorPHByZT4KKyAgJmx0O2Z0cCBhY3Rpb249Imxpc3QiCisgICAgICAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgICB1c2VyaWQ9ImFub255bW91cyIKKyAgICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIgorICAgICAgIGxpc3Rpbmc9ImRhdGEvZnRwLmxpc3RpbmciJmd0OworICAgICZsdDtmaWxlc2V0Jmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKioiLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDsvZnRwJmd0OworPC9wcmU+Cis8cD5UaGlzIHByb3ZpZGVzIGEgZmlsZSBsaXN0aW5nIGluIDxjb2RlPmRhdGEvZnRwLmxpc3Rpbmc8L2NvZGU+IG9mIGFsbCB0aGUgZmlsZXMgb24KK3RoZSBGVFAgc2VydmVyIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBvZiB0aGUgPGNvZGU+YW5vbnltb3VzPC9jb2RlPgordXNlci4gVGhlIGxpc3RpbmcgaXMgaW4gd2hhdGV2ZXIgZm9ybWF0IHRoZSBGVFAgc2VydmVyIG5vcm1hbGx5IGxpc3RzIGZpbGVzLjwvcD4KKworPGgzPkNyZWF0aW5nIERpcmVjdG9yaWVzPC9oMz4KKzxwPk5vdGUgdGhhdCB3aXRoIHRoZSBta2RpciBhY3Rpb24sIHRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlIGlzIHNwZWNpZmllZCB1c2luZyB0aGUKK3JlbW90ZWRpciBhdHRyaWJ1dGUuPC9wPgorPHByZT4KKyAgJmx0O2Z0cCBhY3Rpb249Im1rZGlyIgorICAgICAgIHNlcnZlcj0iZnRwLmFwYWNoZS5vcmciCisgICAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCisgICAgICAgcGFzc3dvcmQ9Im1lQG15b3JnLmNvbSIKKyAgICAgICByZW1vdGVkaXI9InNvbWUvcmVtb3RlL2RpciIvJmd0OworPC9wcmU+Cis8cD5UaGlzIGNyZWF0ZXMgdGhlIGRpcmVjdG9yeSA8Y29kZT5zb21lL3JlbW90ZS9kaXI8L2NvZGU+IGJlbmVhdGggdGhlIGRlZmF1bHQgcm9vdAorZGlyZWN0b3J5LiAgQXMgd2l0aCBhbGwgb3RoZXIgYWN0aW9ucywgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyIG11c3QgYmUgY29ycmVjdAorYWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVzIG9mIHRoZSBGVFAgc2VydmVyLjwvcD4KKzxoMz5SZW1vdmluZyBEaXJlY3RvcmllczwvaDM+CitUaGlzIGFjdGlvbiB1c2VzIG5lc3RlZCBmaWxlc2V0IGVsZW1lbnRzIHRvIAorc2VsZWN0IHRoZSBkaXJlY3RvcmllcyB0byByZW1vdmUgZnJvbSB0aGUgcmVtb3RlIEZUUCBzZXJ2ZXIuICBUaGUgCitmaWxlc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJlbW90ZSBkaXJlY3RvcnksIG5vdCBhIGxvY2FsIGRpcmVjdG9yeS4gCitUaGUgZGlyIGF0dHJpYnV0ZSBvZiB0aGUgZmlsZXNldCBpcyBpZ25vcmVkIGNvbXBsZXRlbHkuCitUaGUgZGlyZWN0b3JpZXMgdG8gYmUgcmVtb3ZlZCBtdXN0IGJlIGVtcHR5LCBvciBjb250YWluIG9ubHkKK290aGVyIGRpcmVjdG9yaWVzIHRoYXQgaGF2ZSBiZWVuIGFsc28gc2VsZWN0ZWQgdG8gYmUgcmVtb3ZlZCBieSB0aGUgZmlsZXNldHMKK3BhdHRlcm5zLCBvdGhlcndpc2UgYSBCdWlsZEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KK0Fsc28sIGlmIHlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LCBhIEJ1aWxkRXhjZXB0aW9uIGlzIAordGhyb3duLgorCis8cHJlPgorICAmbHQ7ZnRwIGFjdGlvbj0icm1kaXIiCisgICAgICAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgICB1c2VyaWQ9ImFub255bW91cyIKKyAgICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIgorICAgICAgIHJlbW90ZWRpcj0iL3NvbWVkaXIiICZndDsKKyAgICAmbHQ7ZmlsZXNldCZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9ImRpcmEiLyZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9ImRpcmIvKioiLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDsvZnRwJmd0OworPC9wcmU+Cis8cD5Mb2dzIGluIHRvIDxjb2RlPmZ0cC5hcGFjaGUub3JnPC9jb2RlPiBhcyA8Y29kZT5hbm9ueW1vdXM8L2NvZGU+IGFuZAordHJpZXMgdG8gcmVtb3ZlIDxjb2RlPi9zb21lZGlyL2RpcmE8L2NvZGU+IGRpcmVjdG9yeSBhbmQKK2FsbCB0aGUgZGlyZWN0b3JpZXMgdHJlZSBzdGFydGluZyBhdCwgYW5kIGluY2x1ZGluZywgPGNvZGU+L3NvbWVkaXIvZGlyYjwvY29kZT4uCitXaGVuIHJlbW92aW5nIHRoZSA8Y29kZT4vc29tZWRpci9kaXJiPC9jb2RlPiB0cmVlLAoraXQgd2lsbCBzdGFydCBhdCB0aGUgbGVhdmVzIG1vdmluZyB1cCB0byB0aGUgcm9vdCwgc28gdGhhdCB3aGVuCitpdCB0cmllcyB0byByZW1vdmUgYSBkaXJlY3RvcnkgaXQgaXMgc3VyZSBhbGwgdGhlIGRpcmVjdG9yaWVzIHVuZGVyIGl0IGFyZQorYWxyZWFkeSByZW1vdmVkLgorT2J2aW91c2x5IGFsbCB0aGUgZmlsZXMgaW4gdGhlIHRyZWUgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBkZWxldGVkLgorPC9wPgorPHA+QXMgYW4gZXhhbXBsZSBzdXBwb3NlIHlvdSB3YW50IHRvIGRlbGV0ZSBldmVyeXRoaW5nIGNvbnRhaW5lZCBpbnRvIAorPGNvZGU+L3NvbWVkaXI8L2NvZGU+LCBzbyBpbnZva2UgZmlyc3QgdGhlIDxjb2RlPiZsdDtmdHAmZ3Q7PC9jb2RlPiB0YXNrIHdpdGgKKzxjb2RlPmFjdGlvbj0iZGVsZXRlIjwvY29kZT4sIHRoZW4gd2l0aAorPGNvZGU+YWN0aW9uPSJybWRpciI8L2NvZGU+IHNwZWNpZnlpbmcgaW4gYm90aCBjYXNlcworPGNvZGU+cmVtb3RlZGlyPSIvc29tZWRpciI8L2NvZGU+IGFuZAorCis8cHJlPgorICAgICZsdDtmaWxlc2V0Jmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKiIvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKzwvcHJlPgorCitUaGUgZGlyZWN0b3J5IHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+cmVtb3RlZGlyPC9jb2RlPiBwYXJhbWV0ZXIgaXMgbmV2ZXIKK3NlbGVjdGVkIGZvciByZW1vdmUsIHNvIGlmIHlvdSBuZWVkIHRvIHJlbW92ZSBpdCwgc3BlY2lmeSBpdHMgcGFyZW50IGluCis8Y29kZT5yZW1vdGVkaXI8L2NvZGU+IHBhcmFtZXRlciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgCis8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IHBhdHRlcm4sIGxpa2UgPGNvZGU+InNvbWVkaXIvKioiPC9jb2RlPi4KKzwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvaWxhc20uaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvaWxhc20uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2QwMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9pbGFzbS5odG1sCkBAIC0wLDAgKzEsMjc4IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgCis8aHRtbD4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDx0aXRsZT5JbGFzbQorIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjNTI1RDc2IgorICAgICAgYWxpbms9IiM1MjVENzYiIHZsaW5rPSIjNTI1RDc2Ij4KKworPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSI0Ij4KKworICA8IS0tIFBBR0UgSEVBREVSIC0tPgorICA8dHI+CisgICAgPHRkPgorICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPjx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgPGZvbnQgc2l6ZT0iKzMiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PHN0cm9uZz5JbGFzbQorIFRhc2s8L3N0cm9uZz48L2ZvbnQ+CisgICAgICAgICAgICA8YnI+PGZvbnQgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5Bc3NlbWJsZXMgLk5FVCBJbnRlcm1lZGlhdGUgTGFuZ3VhZ2UgZmlsZXMuPC9mb250PgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgPCEtLSBQUk9KRUNUIExPR08gLS0+CisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj4KKyAgICAgICAgICAgICAgPGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiIGFsaWduPSJyaWdodCIgYWx0PSJBcGFjaGUgQW50IiBib3JkZXI9IjAiPgorICAgICAgICAgICAgPC9hPgorICAgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPjwvdGFibGU+CisgICAgPC90ZD4KKyAgPC90cj4KKworICA8IS0tIFNUQVJUIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorICA8dHI+CisgICAgPHRkICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorCisgICAgICAgICAgPCEtLSBBcHBseWluZyB0YXNrL2xvbmctZGVzY3JpcHRpb24gLS0+CisgICAgPCEtLSBTdGFydCBEZXNjcmlwdGlvbiAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJkZXNjcmlwdGlvbiI+CisgICAgICAgICAgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIEFzc2VtYmxlcyAuTkVUIEludGVybWVkaWF0ZSBMYW5ndWFnZSBmaWxlcy4gaWxhc20uZXhlIG11c3QgYmUgb24gdGhlIGV4ZWN1dGUgcGF0aCwgdW5sZXNzIGFub3RoZXIgZXhlY3V0YWJsZSBvciB0aGUgZnVsbCBwYXRoIHRvIHRoYXQgZXhlY3V0YWJsZSBpcyBzcGVjaWZpZWQgaW4gdGhlIDx0dD5leGVjdXRhYmxlPC90dD4gcGFyYW1ldGVyIDxwPiA8cD4gQWxsIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsOiA8Y29kZT4mbHQ7aWwvJmd0OzwvY29kZT4gc2hvdWxkIHN1ZmZpY2UgdG8gcHJvZHVjZSBhIGRlYnVnIGJ1aWxkIG9mIGFsbCAqLmlsIGZpbGVzLiBUaGUgb3B0aW9uIHNldCBpcyByb3VnaGx5IGNvbXBhdGlibGUgd2l0aCB0aGUgQ1NoYXJwIGNsYXNzOyBldmVuIHRob3VnaCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIG9ubHkgdmFndWVseSBlcXVpdmFsZW50LiBbVGhlIGxvdyBsZXZlbCBjb21tYW5kcyB0YWtlIHRoaW5ncyBsaWtlIC9PVVQ9ZmlsZSwgY3NjIHdhbnRzIC9vdXQ6ZmlsZSAuLi4gL3ZlcmJvc2UgaXMgdXNlZCBzb21lIHBsYWNlczsgL3F1aWV0IGhlcmUgaW4gaWxkYXNtLi4uIGV0Yy5dIEl0IHdvdWxkIGJlIG5pY2UgaWYgc29tZW9uZSBtYWRlIGFsbCB0aGUgY29tbWFuZCBsaW5lIHRvb2xzIGNvbnNpc3RlbnQgKGFuZCBub3QgYXMgYnJpdHRsZSBhcyB0aGUgamF2YSBjbWRsaW5lIHRvb2xzKSA8cD4gPHA+IFRoZSB0YXNrIGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2ssIHNvIGF0dHJpYnV0ZXMgbGlrZSA8Yj5pbmNsdWRlcz0iKi5pbCIgPC9iPiBhbmQgPGI+ZXhjbHVkZXM9ImJyb2tlbi5pbCI8L2I+IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGZpbGVzIHB1bGxlZCBpbi4gWW91IGNhbiBhbHNvIHVzZSBuZXN0ZWQgJmx0O3NyYyZndCBmaWxlc2V0cyB0byByZWZlciB0byBzb3VyY2UuIDxwPgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRGVzY3JpcHRpb24gLS0+CisKKyAgICA8IS0tIFN0YXJ0IEF0dHJpYnV0ZXMgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImF0dHJpYnV0ZXMiPgorICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVyczwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+QXR0cmlidXRlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlR5cGU8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+UmVxdWlyZW1lbnQ8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAorICAgIAorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZGVidWc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zZXQgdGhlIGRlYnVnIGZsYWcgb24gb3Igb2ZmLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHJvd3NwYW49IjEwIj4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+T3B0aW9uYWw8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5kZXN0ZmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldCB0aGUgbmFtZSBvZiBleGUvbGlicmFyeSB0byBjcmVhdGUuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmV4dHJhb3B0aW9uczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkFueSBleHRyYSBvcHRpb25zIHdoaWNoIGFyZSBub3QgZXhwbGljaXRseSBzdXBwb3J0ZWQgYnkgdGhpcyB0YXNrLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmZhaWxvbmVycm9yPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+SWYgdHJ1ZSwgZmFpbHMgaWYgaWxhc20gdG9vbCBmYWlscy48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+a2V5ZmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgcHJpdmF0ZSBrZXkuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmxpc3Rpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5JZiB0cnVlLCBwcm9kdWNlIGEgbGlzdGluZyAob2ZmIGJ5IGRlZmF1bHQpLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5vdXRwdXRmaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0IHRoZSBvdXRwdXQgZmlsZTsgaWRlbnRpY2FsIHRvIHNldERlc3RGaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnJlc291cmNlZmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm5hbWUgb2YgcmVzb3VyY2UgZmlsZSB0byBpbmNsdWRlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zcmNkaXI8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXQgdGhlIHNvdXJjZSBkaXJlY3Rvcnkgb2YgdGhlIGZpbGVzIHRvIGJlIGNvbXBpbGVkLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj52ZXJib3NlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+SWYgdHJ1ZSwgZW5hYmxlIHZlcmJvc2UgSUxBU00gb3V0cHV0LjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKworCisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBBdHRyaWJ1dGVzIC0tPgorCisgICAgPCEtLSBTdGFydCBFbGVtZW50cyAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJlbGVtZW50cyI+CisgICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzIGFzIG5lc3RlZCBlbGVtZW50czwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgPCEtLSBTdGFydCBFbGVtZW50IC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM4MjhEQTYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIiBzaXplPSItMSI+CisgICAgICAgICAgPHN0cm9uZz5yZWZlcmVuY2U8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQpPC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgYWRkIGEgbmV3IHJlZmVyZW5jZSBmaWxlc2V0IHRvIHRoZSBjb21waWxhdGlvbgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEVsZW1lbnQgLS0+CisgICAgPCEtLSBTdGFydCBFbGVtZW50IC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM4MjhEQTYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIiBzaXplPSItMSI+CisgICAgICAgICAgPHN0cm9uZz5zcmM8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQpPC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgYWRkIGEgbmV3IHNvdXJjZSBkaXJlY3RvcnkgdG8gdGhlIGNvbXBpbGUKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50cyAtLT4KKworCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPCEtLSBFTkQgUklHSFQgU0lERSBNQUlOIEJPRFkgLS0+CisKKzwvdGFibGU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvaWxkYXNtLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2lsZGFzbS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExM2Y2YmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2lsZGFzbS5odG1sCkBAIC0wLDAgKzEsMzM4IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgCis8aHRtbD4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDx0aXRsZT5JbGRhc20KKyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzUyNUQ3NiIKKyAgICAgIGFsaW5rPSIjNTI1RDc2IiB2bGluaz0iIzUyNUQ3NiI+CisKKzx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+CisKKyAgPCEtLSBQQUdFIEhFQURFUiAtLT4KKyAgPHRyPgorICAgIDx0ZD4KKyAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgIDxmb250IHNpemU9IiszIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxzdHJvbmc+SWxkYXNtCisgVGFzazwvc3Ryb25nPjwvZm9udD4KKyAgICAgICAgICAgIDxicj48Zm9udCBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlRhc2sgdG8gdGFrZSBhIC5ORVQgb3IgTW9ubyAtZ2VuZXJhdGVkIG1hbmFnZWQgZXhlY3V0YWJsZSBhbmQgdHVybiBpdCBpbnRvIElMQVNNIGFzc2VtYmx5IGNvZGUuPC9mb250PgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgPCEtLSBQUk9KRUNUIExPR08gLS0+CisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj4KKyAgICAgICAgICAgICAgPGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiIGFsaWduPSJyaWdodCIgYWx0PSJBcGFjaGUgQW50IiBib3JkZXI9IjAiPgorICAgICAgICAgICAgPC9hPgorICAgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPjwvdGFibGU+CisgICAgPC90ZD4KKyAgPC90cj4KKworICA8IS0tIFNUQVJUIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorICA8dHI+CisgICAgPHRkICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorCisgICAgICAgICAgPCEtLSBBcHBseWluZyB0YXNrL2xvbmctZGVzY3JpcHRpb24gLS0+CisgICAgPCEtLSBTdGFydCBEZXNjcmlwdGlvbiAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJkZXNjcmlwdGlvbiI+CisgICAgICAgICAgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIFRhc2sgdG8gdGFrZSBhIC5ORVQgb3IgTW9ubyAtZ2VuZXJhdGVkIG1hbmFnZWQgZXhlY3V0YWJsZSBhbmQgdHVybiBpdCBpbnRvIElMQVNNIGFzc2VtYmx5IGNvZGUuIFVzZWZ1bCB3aGVuIGNvbnZlcnRpbmcgaW1wb3J0ZWQgdHlwZWxpYnMgaW50byBhc3NlbWJsZXIgYmVmb3JlIHBhdGNoaW5nIGFuZCByZWNvbXBpbGluZywgYXMgb25lIGhhcyB0byBkbyB3aGVuIGRvaW5nIGFkdmFuY2VkIHR5cGVsaWIgd29yay4gPHA+IEFzIHdlbGwgYXMgZ2VuZXJhdGluZyB0aGUgbmFtZWQgb3V0cHV0IGZpbGUsIHRoZSBpbGRhc20gcHJvZ3JhbSB3aWxsIGFsc28gZ2VuZXJhdGUgcmVzb3VyY2UgZmlsZXMgPGNvZGU+SWNvbnMucmVzb3VyY2VzPC9jb2RlPiA8Y29kZT5NZXNzYWdlLnJlc291cmNlczwvY29kZT4gYW5kIGEgLnJlcyBmaWxlIHdob3NlIGZpbGVuYW1lIHN0dWIgaXMgZGVyaXZlZCBmcm9tIHRoZSBzb3VyY2UgaW4gd2F5cyB0byBvYnNjdXJlIHRvIGRldGVybWluZS4gVGhlcmUgaXMgbm8gd2F5IHRvIGNvbnRyb2wgd2hldGhlciBvciBub3QgdGhlc2UgZmlsZXMgYXJlIGNyZWF0ZWQsIG9yIHdoZXJlIHRoZXkgYXJlIGNyZWF0ZWQgKHRoZXkgYXJlIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5OyB0aGVpciBuYW1lcyBjb21lIGZyb20gaW5zaWRlIHRoZSBleGVjdXRhYmxlIGFuZCBtYXkgYmUgdGhvc2UgdXNlZCBieSB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyKS4gVGhpcyB0YXNrIGNyZWF0ZXMgdGhlIHJlc291cmNlcyBpbiB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieSA8Y29kZT5yZXNvdXJjZURpcjwvY29kZT4gaWYgc2V0LCBlbHNlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgPGNvZGU+ZGVzdEZpbGU8L2NvZGU+LiA8cD4gVGhpcyB0YXNrIHJlcXVpcmVzIHRoZSAuTkVUIFNESyBpbnN0YWxsZWQgYW5kIGlsZGFzbSBvbiB0aGUgcGF0aC4gVG8gZGlzYXNzZW1ibGUgdXNpbmcgYWx0ZXJuYXRlIENMUiBzeXN0ZW1zLCBzZXQgdGhlIGV4ZWN1dGFibGUgYXR0cmlidXRlIHRvIHRoZSBuYW1lL3BhdGggb2YgdGhlIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiAtb25lIHRoYXQgbXVzdCBzdXBwb3J0IGFsbCB0aGUgY2xhc3NpYyBpbGRhc20gY29tbWFuZHMuIDxwPiBEZXBlbmRlbmN5IGxvZ2ljOiB0aGUgdGFzayBleGVjdXRlcyB0aGUgY29tbWFuZCBpZiB0aGUgb3V0cHV0IGZpbGUgaXMgbWlzc2luZyBvciBvbGRlciB0aGFuIHRoZSBzb3VyY2UgZmlsZS4gSXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgY2hhbmdlcyBpbiB0aGUgb3B0aW9ucyBvZiB0aGUgdGFzaywgb3IgdGltZXN0YW1wIGRpZmZlcmVuY2VzIGluIHJlc291cmNlIGZpbGVzLiBXaGVuIHRoZSB1bmRlcmx5aW5nIGlsZGFzbSBleGVjdXRhYmxlIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgaXQgbGVhdmVzIHRoZSAuaWwgZmlsZSBpbiBwbGFjZSB3aXRoIHNvbWUgZXJyb3IgbWVzc2FnZS4gVG8gcHJldmVudCB0aGlzIGZyb20gY29uZnVzaW5nIHRoZSBkZXBlbmRlbmN5IGxvZ2ljLCB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmRlc3Q8L2NvZGU+IGF0dHJpYnV0ZSBpcyA8aT5hbHdheXM8L2k+IGRlbGV0ZWQgYWZ0ZXIgYW4gdW5zdWNjZXNzZnVsIGJ1aWxkLgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRGVzY3JpcHRpb24gLS0+CisKKyAgICA8IS0tIFN0YXJ0IEF0dHJpYnV0ZXMgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImF0dHJpYnV0ZXMiPgorICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVyczwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+QXR0cmlidXRlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlR5cGU8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+UmVxdWlyZW1lbnQ8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAorICAgIAorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+YXNzZW1ibGVyPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZW5hYmxlIChkZWZhdWx0KSBvciBkaXNhYmxlIGFzc2VtYmx5IGxhbmd1YWdlIGluIHRoZSBvdXRwdXQ8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiByb3dzcGFuPSIxNyI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPk9wdGlvbmFsPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ynl0ZXM8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5lbmFibGUgb3IgZGlzYWJsZSAoZGVmYXVsdCkgdGhlIG9yaWdpbmFsIGJ5dGVzIGFzIGNvbW1lbnRzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmRlc3RmaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+dGhlIG91dHB1dCBmaWxlIChyZXF1aXJlZCk8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZW5jb2Rpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZWxlY3QgdGhlIG91dHB1dCBlbmNvZGluZzogYXNjaWksIHV0Zjggb3IgdW5pY29kZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPiJhc2NpaSIsICJ1dGY4IiwgInVuaWNvZGUiPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZXhlY3V0YWJsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm92ZXJyaWRlIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIChub3JtYWxseSBpbGRhc20pIG9yIHNldCBpdHMgZnVsbCBwYXRoLiBEbyBub3Qgc2V0IGEgcmVsYXRpdmUgcGF0aCwgYXMgdGhlIHVnbHkgaGFja3MgbmVlZGVkIHRvIGNyZWF0ZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgZGVzdCBkaXJlY3RvcnkgZm9yY2UgdXMgdG8gY2hhbmdlIHRvIHRoaXMgZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbi4gaS5lIHVzZSAmbHQ7cHJvcGVydHkgbG9jYXRpb24mZ3QgdG8gY3JlYXRlIGFuIGFic29sdXRlIHBhdGggZnJvbSBhIHJlbGF0aXZlIG9uZSBiZWZvcmUgc2V0dGluZyB0aGlzIHZhbHVlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmhlYWRlcjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmluY2x1ZGUgaGVhZGVyIGluZm9ybWF0aW9uOyBkZWZhdWx0IGZhbHNlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5pdGVtPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bmFtZSBhIHNpbmdsZSBpdGVtIHRvIGRlY29kZTsgYSBjbGFzcyBvciBhIG1ldGhvZCBlLmcgaXRlbT0iTXljbGFzczo6bWV0aG9kIiBvciBpdGVtPSJuYW1lc3BhY2UxOjpuYW1lc3BhY2UyOjpNeWNsYXNzOm1ldGhvZCh2b2lkKGludDMyKSk8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5saW5lbnVtYmVyczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmluY2x1ZGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb247IGRlZmF1bHQ9ZmFsc2U8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bWV0YWRhdGE8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5pbmNsdWRlIG1ldGFkYXRhIGluZm9ybWF0aW9uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnByb2dyZXNzYmFyPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c2hvdyBhIGdyYXBoaWNhbCBwcm9ncmVzcyBiYXIgaW4gYSB3aW5kb3cgZHVyaW5nIHRoZSBwcm9jZXNzOyBvZmYgYnkgZGVmYXVsdDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5xdW90ZWFsbG5hbWVzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+cXVvdGUgYWxsIG5hbWVzLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5yYXdleGNlcHRpb25oYW5kbGluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmVuYWJsZSByYXcgZXhjZXB0aW9uIGhhbmRsaW5nIChkZWZhdWx0ID0gZmFsc2UpPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnJlc291cmNlZGlyPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0IHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlcyB0byBiZSBjcmVhdGVkLiBXZSBjYW5ub3QgY29udHJvbCB0aGVpciBuYW1lcywgYnV0IHdlIGNhbiBzYXkgd2hlcmUgdGhleSBnZXQgY3JlYXRlZC4gSWYgbm90IHNldCwgdGhlIGRpcmVjdG9yeSBvZiB0aGUgZGVzdCBmaWxlIGlzIHVzZWQ8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c2hvd3NvdXJjZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmluY2x1ZGUgdGhlIHNvdXJjZSBhcyBjb21tZW50cyAoZGVmYXVsdD1mYWxzZSk8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c291cmNlZmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnRoZSBmaWxlIHRvIGRpc2Fzc2VtYmxlIC1yZXF1aXJlZDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zcmNmaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+YWx0ZXJuYXRlIG5hbWUgZm9yIHNvdXJjZUZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+dmlzaWJpbGl0eTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnZpc2liaWxpdHkgb3B0aW9uczogb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZywgd2l0aCArIHNpZ25zIHRvIGNvbmNhdGVuYXRlIHRoZW06IDxwcmU+IHB1YiA6IFB1YmxpYyBwcmkgOiBQcml2YXRlIGZhbSA6IEZhbWlseSBhc20gOiBBc3NlbWJseSBmYWEgOiBGYW1pbHkgYW5kIEFzc2VtYmx5IGZvYSA6IEZhbWlseSBvciBBc3NlbWJseSBwc2MgOiBQcml2YXRlIFNjb3BlIDwvcHJlPiBlLmcuIHZpc2liaWxpdHk9InB1YitwcmkiLiBGYW1pbHkgbWVhbnMgPGNvZGU+cHJvdGVjdGVkPC9jb2RlPiBpbiBDIzs8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKworCisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBBdHRyaWJ1dGVzIC0tPgorCisgICAgPCEtLSBTdGFydCBFbGVtZW50cyAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJlbGVtZW50cyI+CisgICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzIGFzIG5lc3RlZCBlbGVtZW50czwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEVsZW1lbnRzIC0tPgorCisKKyAgICA8L3RkPgorICA8L3RyPgorICA8IS0tIEVORCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KKworPC90YWJsZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9pbWFnZS1jbGFzc2RpYWdyYW0uZ2lmIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9pbWFnZS1jbGFzc2RpYWdyYW0uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNGI4MWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2ltYWdlLWNsYXNzZGlhZ3JhbS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9pbWFnZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9pbWFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNTc0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2ltYWdlLmh0bWwKQEAgLTAsMCArMSwyMzkgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SW1hZ2UgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iaW1hZ2UiPkltYWdlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+QXBwbGllcyBhIGNoYWluIG9mIGltYWdlIG9wZXJhdGlvbnMgb24gYSBzZXQgb2YgZmlsZXMuPC9wPgorPHA+UmVxdWlyZXMgSmF2YSBBZHZhbmNlZCBJbWFnZSBBUEkgZnJvbSBTdW4uPC9wPgorCis8aDU+T3ZlcnZpZXcgb2YgdXNlZCBkYXRhdHlwZXM8L2g1PgorPGltZyBzcmM9ImltYWdlLWNsYXNzZGlhZ3JhbS5naWYiIGJvcmRlcj0iMCIgYWx0PSJDbGFzcy1EaWFncmFtIj4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+IGZhaWxvbmVycm9yIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gQm9vbGVhbiB2YWx1ZS4gSWYgZmFsc2UsIG5vdGUgZXJyb3JzIHRvIHRoZSBvdXRwdXQgYnV0IGtlZXAgZ29pbmcuIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+dHJ1ZTwvaT4pIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBzcmNkaXIgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgaW1hZ2VzLiA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4geWVzLCB1bmxlc3MgbmVzdGVkIGZpbGVzZXQgaXMgdXNlZCA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gZW5jb2RpbmcgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBJbWFnZSBlbmNvZGluZyB0eXBlLiA8YnI+CisgICAgICBWYWxpZCAoY2FzZWluc2Vuc2l0aXZlKSBhcmU6IGpwZywganBlZywgdGlmLCB0aWZmCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+IG5vIChkZWZhdWx0cyB0byA8aT5KUEVHPC9pPikgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+IG92ZXJ3cml0ZSA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+IEJvb2xlYW4gdmFsdWUuIFNldHMgd2hldGhlciBvciBub3QgdG8gb3ZlcndyaXRlCisgICAgICBhIGZpbGUgaWYgdGhlcmUgaXMgbmFtaW5nIGNvbmZsaWN0LgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+ZmFsc2U8L2k+KSA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gZ2MgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBCb29sZWFuIHZhbHVlLiBFbmFibGVzIGdhcmJhZ2UgY29sbGVjdGlvbiBhZnRlcgorICAgICAgZWFjaCBpbWFnZSBwcm9jZXNzZWQuCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+IG5vIChkZWZhdWx0cyB0byA8aT5mYWxzZTwvaT4pIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBkZXN0ZGlyIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gRGlyZWN0b3J5IHdoZXJlIHRoZSByZXN1bHQgaW1hZ2VzIGFyZSBzdG9yZWQuIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gdmFsdWUgb2YgPGk+c3JjZGlyPC9pPikgPC90ZD4KKyAgPC90cj4KKyAgPCEtLSBhdHRyaWJ1dGVzIGluaGVyaXRlZCBmcm9tIE1hdGNoaW5nVGFzayAtLT4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBleGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCisgICAgICBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdAorICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBjYXNlU2Vuc2l0aXZlIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gQm9vbGVhbiB2YWx1ZS4gU2V0cyBjYXNlIHNlbnNpdGl2aXR5IG9mIHRoZSBmaWxlIHN5c3RlbS4gPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+IG5vIChkZWZhdWx0cyB0byA8aT5mYWxzZTwvaT4pIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBmb2xsb3dTeW1saW5rcyA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+IEJvb2xlYW4gdmFsdWUuIFNldHMgd2hldGhlciBvciBub3Qgc3ltYm9saWMgbGlua3Mgc2hvdWxkIGJlIGZvbGxvd2VkLiA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4gbm8gKGRlZmF1bHRzIHRvIDxpPnRydWU8L2k+KSA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCitzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGFzIHdlbGwgYXMgdGhlCituZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKKzxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorCisKKzxoND5JbWFnZU9wZXJhdGlvbjwvaDQ+Cis8cD5BZGRzIGFuIEltYWdlT3BlcmF0aW9uIHRvIGNoYWluLjwvcD4KKzxoNT5OZXN0ZWQgRWxlbWVudHM8L2g1PgorSW1hZ2VPcGVyYXRpb24gY2FuIGhhbmRsZSBuZXN0ZWQgUm90YXRlLCBEcmF3LCBSZWN0YW5nbGUsIFRleHQgYW5kIFNjYWxlIG9iamVjdHMuCisKKzxoND5Sb3RhdGU8L2g0PgorPHA+QWRkcyBhIFJvdGF0ZSBJbWFnZU9wZXJhdGlvbiB0byBjaGFpbi48L3A+Cis8aDU+UGFyYW1ldGVyczwvaDU+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gYW5nbGUgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBGbG9hdCB2YWx1ZS4gU2V0cyB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gZGVncmVlcy4gPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+IG5vIChkZWZhdWx0cyB0byA8aT4wLjBGPC9pPikgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5TY2FsZTwvaDQ+Cis8cD5BZGRzIGEgU2NhbGUgSW1hZ2VPcGVyYXRpb24gdG8gY2hhaW4uPC9wPgorPGg1PlBhcmFtZXRlcnM8L2g1PgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiBwcm9wb3J0aW9ucyA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+IFNldHMgd2hpY2ggZGltZW5zaW9uIHRvIGNvbnRyb2wgcHJvcG9ydGlvbnMgZnJvbS4gVmFsaWQgdmFsdWVzIGFyZTo8dWw+CisgICAgICAgIDxsaT4mcXVvdDtpZ25vcmUmcXVvdDsgLSAgdHJlYXQgdGhlIGRpbWVuc2lvbnMgaW5kZXBlbmRlbnRseS48L2xpPgorICAgICAgICA8bGk+JnF1b3Q7aGVpZ2h0JnF1b3Q7IC0ga2VlcCBwcm9wb3J0aW9ucyBiYXNlZCBvbiB0aGUgd2lkdGguPC9saT4KKyAgICAgICAgPGxpPiZxdW90O3dpZHRoJnF1b3Q7IC0ga2VlcCBwcm9wb3J0aW9ucyBiYXNlZCBvbiB0aGUgaGVpZ2h0LjwvbGk+CisgICAgICAgIDxsaT4mcXVvdDtjb3ZlciZxdW90OyAtIGtlZXAgcHJvcG9ydGlvbnMgYW5kIGZpdCBpbiB0aGUgc3VwcGxpZWQgZGltZW5zaW9ucy48L2xpPgorICAgICAgICA8bGk+JnF1b3Q7Zml0JnF1b3Q7IC0ga2VlcCBwcm9wb3J0aW9ucyBhbmQgY292ZXIgdGhlIHN1cHBsaWVkIGRpbWVuc2lvbnMuPC9saT4KKyAgICA8L3VsPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+aWdub3JlPC9pPikgPC90ZD4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+IHdpZHRoIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gU2V0cyB0aGUgd2lkdGggb2YgdGhlIGltYWdlLCBlaXRoZXIgYXMgYW4gaW50ZWdlciBvciBhICUuIDwvdGQ+CisgICAgICAgIDwhLS0gdG9kbzogaWYgaW50ZWdlciwgd2hhdCBraW5kPyBjbSwgcHgsIGluY2hlcywgLi4uIC0tPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4gbm8gKGRlZmF1bHRzIHRvIDxpPjEwMCU8L2k+KSA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gaGVpZ2h0IDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSwgZWl0aGVyIGFzIGFuIGludGVnZXIgb3IgYSAlLiA8L3RkPgorICAgICAgICA8IS0tIHRvZG86IGlmIGludGVnZXIsIHdoYXQga2luZD8gY20sIHB4LCBpbmNoZXMsIC4uLiAtLT4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+IG5vIChkZWZhdWx0cyB0byA8aT4xMDAlPC9pPikgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5EcmF3PC9oND4KKzxwPkFkZHMgYSBEcmF3IEltYWdlT3BlcmF0aW9uIHRvIGNoYWluLiBEcmF3T3BlcmF0aW9uIERhdGFUeXBlIG9iamVjdHMgY2FuIGJlCituZXN0ZWQgaW5zaWRlIHRoZSBEcmF3IG9iamVjdC48L3A+Cis8aDU+UGFyYW1ldGVyczwvaDU+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj4geGxvYyA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+IFgtUG9zaXRpb24gd2hlcmUgdG8gZHJhdyBuZXN0ZWQgaW1hZ2UgZWxlbWVudHMuIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+MDwvaT4pIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPiB5bG9jIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gWS1Qb3NpdGlvbiB3aGVyZSB0byBkcmF3IG5lc3RlZCBpbWFnZSBlbGVtZW50cy4gPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+IG5vIChkZWZhdWx0cyB0byA8aT4wPC9pPikgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbmJzcDsmbHQ7aW1hZ2UgZGVzdGRpcj0ic2FtcGxlcy9sb3ciIG92ZXJ3cml0ZT0ieWVzIiZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7ZmlsZXNldCBkaXI9InNhbXBsZXMvZnVsbCImZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5qcGciLyZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L2ZpbGVzZXQmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O3NjYWxlIHdpZHRoPSIxNjAiIGhlaWdodD0iMTYwIiBwcm9wb3J0aW9ucz0iZml0Ii8mZ3Q7CismbmJzcDsmbHQ7L2ltYWdlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+Q3JlYXRlIHRodW1ibmFpbHMgb2YgbXkgaW1hZ2VzIGFuZCBtYWtlIHN1cmUgdGhleSBhbGwgZml0IHdpdGhpbiB0aGUgMTYweDE2MCBzaXplIHdoZXRoZXIgdGhlCitpbWFnZSBpcyBwb3J0cmFpdCBvciBsYW5kc2NhcGUuPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2ltYWdlIHNyY2Rpcj0ic3JjIiBpbmNsdWRlcz0iKi5wbmciJmd0OworICAgICZsdDtzY2FsZSBwcm9wb3J0aW9ucz0id2lkdGgiIHdpZHRoPSI0MCIvJmd0OworJmx0Oy9pbWFnZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPkNyZWF0ZXMgYSB0aHVtYm5haWwgZm9yIGFsbCBQTkctZmlsZXMgaW4gPGk+c3JjPC9pPiBpbiB0aGUgc2l6ZSBvZiA0MCBwaXhlbCBrZWVwaW5nIHRoZSBwcm9wb3J0aW9ucworYW5kIHN0b3JlcyB0aGUgPGk+c3JjPC9pPi48L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7aW1hZ2Ugc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImRlc3QiIGluY2x1ZGVzPSIqLnBuZyImZ3Q7CisgICAgJmx0O3NjYWxlIHByb3BvcnRpb25zPSJ3aWR0aCIgd2lkdGg9IjQwIi8mZ3Q7CismbHQ7L2ltYWdlJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+U2FtZSBhcyBhYm92ZSBidXQgc3RvcmVzIHRoZSByZXN1bHQgaW4gPGk+ZGVzdDwvaT4uPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorPC9wcmU+PC9ibG9ja3F1b3RlPgorCisKKworPC9ib2R5PgorPC9odG1sPgorCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvaW1wb3J0dHlwZWxpYi5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9pbXBvcnR0eXBlbGliLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyOTJiNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvaW1wb3J0dHlwZWxpYi5odG1sCkBAIC0wLDAgKzEsMjA2IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgCis8aHRtbD4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDx0aXRsZT5JbXBvcnR0eXBlbGliCisgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiM1MjVENzYiCisgICAgICBhbGluaz0iIzUyNUQ3NiIgdmxpbms9IiM1MjVENzYiPgorCis8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjQiPgorCisgIDwhLS0gUEFHRSBIRUFERVIgLS0+CisgIDx0cj4KKyAgICA8dGQ+CisgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICA8Zm9udCBzaXplPSIrMyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48c3Ryb25nPkltcG9ydHR5cGVsaWIKKyBUYXNrPC9zdHJvbmc+PC9mb250PgorICAgICAgICAgICAgPGJyPjxmb250IGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+SW1wb3J0IGEgQ09NIHR5cGUgbGlicmFyeSBpbnRvIHRoZSAuTkVUIGZyYW1ld29yay48L2ZvbnQ+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8IS0tIFBST0pFQ1QgTE9HTyAtLT4KKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPgorICAgICAgICAgICAgICA8aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2FudF9sb2dvX2xhcmdlLmdpZiIgYWxpZ249InJpZ2h0IiBhbHQ9IkFwYWNoZSBBbnQiIGJvcmRlcj0iMCI+CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+PC90YWJsZT4KKyAgICA8L3RkPgorICA8L3RyPgorCisgIDwhLS0gU1RBUlQgUklHSFQgU0lERSBNQUlOIEJPRFkgLS0+CisgIDx0cj4KKyAgICA8dGQgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisKKyAgICAgICAgICA8IS0tIEFwcGx5aW5nIHRhc2svbG9uZy1kZXNjcmlwdGlvbiAtLT4KKyAgICA8IS0tIFN0YXJ0IERlc2NyaXB0aW9uIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImRlc2NyaXB0aW9uIj4KKyAgICAgICAgICA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgSW1wb3J0IGEgQ09NIHR5cGUgbGlicmFyeSBpbnRvIHRoZSAuTkVUIGZyYW1ld29yay4gPHA+IFRoaXMgdGFzayBpcyBhIHdyYXBwZXIgdG8gLk5FVCdzIHRsYmltcG9ydDsgaXQgaW1wb3J0cyBhIHRsYiBmaWxlIHRvIGEgTkVUIGFzc2VtYmx5IGJ5IGdlbmVyYXRpbmcgYSBiaW5hcnkgYXNzZW1ibHkgKC5kbGwpIHRoYXQgY29udGFpbnMgYWxsIHRoZSBiaW5kaW5nIG1ldGFkYXRhLiBJdCB1c2VzIGRhdGUgdGltZXN0YW1wcyB0byBtaW5pbWlzZSByZWJ1aWxkcy4gPHA+IEV4YW1wbGUgPHByZT4gJmx0O2ltcG9ydHR5cGVsaWIgc3JjZmlsZT0ieGVyY2VzLnRsYiIgZGVzdGZpbGU9InhlcmNlcy5kbGwiIG5hbWVzcGFjZT0iQXBhY2hlLlhlcmNlcyIvJmd0OyA8L3ByZT4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIERlc2NyaXB0aW9uIC0tPgorCisgICAgPCEtLSBTdGFydCBBdHRyaWJ1dGVzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJhdHRyaWJ1dGVzIj4KKyAgICAgICAgICA8c3Ryb25nPlBhcmFtZXRlcnM8L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgPHRhYmxlPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkF0dHJpYnV0ZTwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5EZXNjcmlwdGlvbjwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5UeXBlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlJlcXVpcmVtZW50PC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAKKyAgICA8IS0tIEF0dHJpYnV0ZSBHcm91cCAtLT4gICAgCisgICAgICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmRlc3RmaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bmFtZSB0aGUgb3V0cHV0IGZpbGUuIHJlcXVpcmVkPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCIgcm93c3Bhbj0iNiI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPk9wdGlvbmFsPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZXh0cmFvcHRpb25zPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c2V0IGFueSBleHRyYSBvcHRpb25zIHRoYXQgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoaXMgdGFzay48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5uYW1lc3BhY2U8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj53aGF0IG5hbWVzcGFjZSBpcyB0aGUgdHlwZWxpYiB0byBiZSBpbi4gcmVxdWlyZWQ8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zcmNmaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+d2hhdCBpcyB0aGUgc291cmNlIC50bGIgZmlsZT8gcmVxdWlyZWQuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnVuc2FmZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmRvIHlvdSB3YW50IHVuc2FmZSBjb2RlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj51c2VzeXNhcnJheTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNldCB0aGlzIHRvIG1hcCBhIENPTSBTYWZlQXJyYXkgdG8gdGhlIFN5c3RlbS5BcnJheSBjbGFzczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKworCisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBBdHRyaWJ1dGVzIC0tPgorCisgICAgPCEtLSBTdGFydCBFbGVtZW50cyAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJlbGVtZW50cyI+CisgICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzIGFzIG5lc3RlZCBlbGVtZW50czwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEVsZW1lbnRzIC0tPgorCisKKyAgICA8L3RkPgorICA8L3RyPgorICA8IS0tIEVORCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KKworPC90YWJsZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qYXJsaWItYXZhaWxhYmxlLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2phcmxpYi1hdmFpbGFibGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE3MzJjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qYXJsaWItYXZhaWxhYmxlLmh0bWwKQEAgLTAsMCArMSwxMzUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+amFybGliLWF2YWlsYWJsZSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJqYXJsaWItYXZhaWxhYmxlIj5qYXJsaWItYXZhaWxhYmxlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+Q2hlY2sgd2hldGhlciBhbiBleHRlbnNpb24gaXMgcHJlc2VudCBpbiBhIGZpbGVzZXQgb3IgYW4gZXh0ZW5zaW9uU2V0LgorSWYgdGhlIGV4dGVuc2lvbiBpcyBwcmVzZW50IHRoZW4gYSBwcm9wZXJ0eSBpcyBzZXQuPC9wPgorCis8cD5Ob3RlIHRoYXQgdGhpcyB0YXNrCit3b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIHNwZWNpZmljYXRpb24uCisgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9uYWwgcGFja2FnZXMsIHNlZSB0aGUgZG9jdW1lbnQKKzxlbT5PcHRpb25hbCBQYWNrYWdlIFZlcnNpb25pbmc8L2VtPiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHlvdXIKK0phdmEyIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQorPGNvZGU+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2NvZGU+IG9yIG9ubGluZSBhdAorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sIj4KK2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvYT4uPC9wPgorPHA+U2VlIHRoZSBFeHRlbnNpb24gYW5kIEV4dGVuc2lvblNldCBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGRldGFpbHM8L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldCBpZiBleHRlbnNpb25zIGlzIGF2YWlsYWJsZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBjaGVjayBmb3IgZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBvbmUgb2YgZmlsZSwgbmVzdGVkCisgICAgRXh0ZW5zaW9uU2V0IG9yIG5lc3RlZCBmaWxlc2V0IG11c3QgYmUgcHJlc2VudC48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+ZXh0ZW5zaW9uPC9oND4KKyA8cD48YSBocmVmPSIuLi9PcHRpb25hbFR5cGVzL2V4dGVuc2lvbi5odG1sIj5FeHRlbnNpb248L2E+IHRoZSBleHRlbnNpb24KKyB0byBzZWFyY2ggZm9yLjwvcD4KKworPGg0PmZpbGVzZXQ8L2g0PgorIDxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QKK3NldHMgb2YgZmlsZXMgdG8gY2hlY2sgZm9yIGV4dGVuc2lvbi48L3A+CisKKzxoND5leHRlbnNpb25TZXQ8L2g0PgorIDxwPjxhIGhyZWY9Ii4uL09wdGlvbmFsVHlwZXMvZXh0ZW5zaW9uc2V0Lmh0bWwiPkV4dGVuc2lvblNldDwvYT5zIGlzIHRoZSBzZXQKKyBvZiBleHRlbnNpb25zIHRvIHNlYXJjaCBmb3IgZXh0ZW5zaW9uIGluLjwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwPjxiPlNlYXJjaCBmb3IgZXh0ZW5zaW9uIGluIHNpbmdsZSBmaWxlPC9iPjwvcD4KKzxwcmU+CisgICZsdDtqYXJsaWItYXZhaWxhYmxlIHByb3BlcnR5PSZxdW90O215ZXh0LnByZXNlbnQmcXVvdDsgZmlsZT0mcXVvdDtteWZpbGUuamFyJnF1b3Q7Jmd0OworICAgICZsdDtleHRlbnNpb24KKyAgICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQmcXVvdDsKKyAgICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuNC45JnF1b3Q7CisgICAgICBzcGVjaWZpY2F0aW9uVmVuZG9yPSZxdW90O0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJnF1b3Q7LyZndDsKKyAgJmx0Oy9qYXJsaWItYXZhaWxhYmxlJmd0OworPC9wcmU+CisKKzxwPjxiPlNlYXJjaCBmb3IgZXh0ZW5zaW9uIGluIHNpbmdsZSBmaWxlIHJlZmVyZW5jaW5nIGV4dGVybmFsIEV4dGVuc2lvbjwvYj48L3A+Cis8cHJlPgorICAmbHQ7ZXh0ZW5zaW9uIGlkPSZxdW90O215ZXh0JnF1b3Q7CisgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudCZxdW90OworICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuNC45JnF1b3Q7CisgICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90Oy8mZ3Q7CisKKyAgJmx0O2phcmxpYi1hdmFpbGFibGUgcHJvcGVydHk9JnF1b3Q7bXlleHQucHJlc2VudCZxdW90OyBmaWxlPSZxdW90O215ZmlsZS5qYXImcXVvdDsmZ3Q7CisgICAgJmx0O2V4dGVuc2lvbiByZWZpZD0mcXVvdDtteWV4dCZxdW90Oy8mZ3Q7CisgICZsdDsvamFybGliLWF2YWlsYWJsZSZndDsKKzwvcHJlPgorPHA+PGI+U2VhcmNoIGZvciBleHRlbnNpb24gaW4gZmlsZXNldDwvYj48L3A+Cis8cHJlPgorICAmbHQ7ZXh0ZW5zaW9uIGlkPSZxdW90O215ZXh0JnF1b3Q7CisgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudCZxdW90OworICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuNC45JnF1b3Q7CisgICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90Oy8mZ3Q7CisKKyAgJmx0O2phcmxpYi1hdmFpbGFibGUgcHJvcGVydHk9JnF1b3Q7bXlleHQucHJlc2VudCZxdW90OyZndDsKKyAgICAmbHQ7ZXh0ZW5zaW9uIHJlZmlkPSZxdW90O215ZXh0JnF1b3Q7LyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9ImxpYiImZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLmphciIvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0Oy9qYXJsaWItYXZhaWxhYmxlJmd0OworPC9wcmU+Cis8cD48Yj5TZWFyY2ggZm9yIGV4dGVuc2lvbiBpbiBleHRlbnNpb25TZXQ8L2I+PC9wPgorPHByZT4KKyAgJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtteWV4dCZxdW90OworICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQmcXVvdDsKKyAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbj0mcXVvdDsxLjQuOSZxdW90OworICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24mcXVvdDsvJmd0OworCisgICZsdDtqYXJsaWItYXZhaWxhYmxlIHByb3BlcnR5PSZxdW90O215ZXh0LnByZXNlbnQmcXVvdDsmZ3Q7CisgICAgJmx0O2V4dGVuc2lvbiByZWZpZD0mcXVvdDtteWV4dCZxdW90Oy8mZ3Q7CisgICAgJmx0O2V4dGVuc2lvblNldCBpZD0mcXVvdDtleHRzMyZxdW90OyZndDsKKyAgICAgICZsdDtsaWJmaWxlc2V0CisgICAgICAgIGluY2x1ZGVVcmw9JnF1b3Q7ZmFsc2UmcXVvdDsKKyAgICAgICAgaW5jbHVkZUltcGw9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICBkaXI9JnF1b3Q7bGliJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyouamFyJnF1b3Q7LyZndDsKKyAgICAgICZsdDsvbGliZmlsZXNldCZndDsKKyAgICAmbHQ7L2V4dGVuc2lvblNldCZndDsKKyAgJmx0Oy9qYXJsaWItYXZhaWxhYmxlJmd0OworPC9wcmU+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvamFybGliLWRpc3BsYXkuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvamFybGliLWRpc3BsYXkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmJmZmYyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qYXJsaWItZGlzcGxheS5odG1sCkBAIC0wLDAgKzEsODEgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+amFybGliLWRpc3BsYXkgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iamFybGliLWRpc3BsYXkiPmphcmxpYi1kaXNwbGF5PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+RGlzcGxheSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIGFuZCAiUGFja2FnZSBTcGVjaWZpY2F0aW9uIiBpbmZvcm1hdGlvbgorIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBqYXJzLjwvcD4KKworPHA+Tm90ZSB0aGF0IHRoaXMgdGFzaword29ya3Mgd2l0aCBleHRlbnNpb25zIGFzIGRlZmluZWQgYnkgdGhlICJPcHRpb25hbCBQYWNrYWdlIiBzcGVjaWZpY2F0aW9uLgorIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50Cis8ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4gaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCitKYXZhMiBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluIGZpbGUKKzxjb2RlPmd1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9jb2RlPiBvciBvbmxpbmUgYXQKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCI+CitodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2E+LjwvcD4KKzxwPlNlZSB0aGUgRXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIGRpc3BsYXkgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGFib3V0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgYnV0IG9uZSBvZiBmaWxlIG9yIGZpbGVzZXQgbXVzdCBiZQorICAgIHByZXNlbnQuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPGg0PmZpbGVzZXQ8L2g0PgorIDxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBjb250YWluIGxpc3Qgb2YgZmlsZXMgdG8KKyBkaXNwbGF5IEV4dGVuc2lvbiBpbmZvcm1hdGlvbiAgYWJvdXQuPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHA+PGI+RGlzcGxheSBFeHRlbnNpb24gaW5mbyBmb3IgYSBzaW5nbGUgZmlsZTwvYj48L3A+Cis8cHJlPgorICAmbHQ7amFybGliLWRpc3BsYXkgZmlsZT0mcXVvdDtteWZpbGUuamFyJnF1b3Q7Jmd0OworPC9wcmU+CisKKzxwPjxiPkRpc3BsYXkgRXh0ZW5zaW9uIGluZm8gZm9yIGEgZmlsZXNldDwvYj48L3A+Cis8cHJlPgorICAmbHQ7amFybGliLWRpc3BsYXkmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJsaWIiJmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKi5qYXIiLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDsvamFybGliLWRpc3BsYXkmZ3Q7Cis8L3ByZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qYXJsaWItbWFuaWZlc3QuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvamFybGliLW1hbmlmZXN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkZGE1MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvamFybGliLW1hbmlmZXN0Lmh0bWwKQEAgLTAsMCArMSwxMjQgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+amFybGliLW1hbmlmZXN0IFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImphcmxpYi1tYW5pZmVzdCI+amFybGliLW1hbmlmZXN0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+VGFzayB0byBnZW5lcmF0ZSBhIG1hbmlmZXN0IHRoYXQgZGVjbGFyZXMgYWxsIHRoZSBkZXBlbmRlbmNpZXMKKyBpbiBtYW5pZmVzdC4gVGhlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSBsb29raW5nIGluIHRoZQorIHNwZWNpZmllZCBwYXRoIGFuZCBzZWFyY2hpbmcgZm9yIEV4dGVuc2lvbiAvICJPcHRpb25hbCBQYWNrYWdlIgorIHNwZWNpZmljYXRpb25zIGluIHRoZSBtYW5pZmVzdHMgb2YgdGhlIGphcnMuPC9wPgorCis8cD5Ob3RlIHRoYXQgdGhpcyB0YXNrCit3b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIHNwZWNpZmljYXRpb24uCisgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9uYWwgcGFja2FnZXMsIHNlZSB0aGUgZG9jdW1lbnQKKzxlbT5PcHRpb25hbCBQYWNrYWdlIFZlcnNpb25pbmc8L2VtPiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHlvdXIKK0phdmEyIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQorPGNvZGU+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2NvZGU+IG9yIG9ubGluZSBhdAorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sIj4KK2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvYT4uPC9wPgorPHA+U2VlIHRoZSBFeHRlbnNpb24gYW5kIEV4dGVuc2lvblNldCBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGRldGFpbHM8L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIGdlbmVyYXRlIE1hbmlmZXN0IGludG88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND5leHRlbnNpb248L2g0PgorIDxwPjxhIGhyZWY9Ii4uL09wdGlvbmFsVHlwZXMvZXh0ZW5zaW9uLmh0bWwiPkV4dGVuc2lvbjwvYT4gdGhlIGV4dGVuc2lvbgorIHRoYXQgdGhpcyBsaWJyYXJ5IGltcGxlbWVudHMuPC9wPgorCis8aDQ+ZGVwZW5kczwvaDQ+CisgPHA+PGEgaHJlZj0iLi4vT3B0aW9uYWxUeXBlcy9leHRlbnNpb25zZXQuaHRtbCI+RXh0ZW5zaW9uU2V0PC9hPnMgY29udGFpbmluZworIGFsbCBkZXBlbmRlbmNpZXMgZm9yIGphci48L3A+CisKKzxoND5vcHRpb25zPC9oND4KKyA8cD48YSBocmVmPSIuLi9PcHRpb25hbFR5cGVzL2V4dGVuc2lvbnNldC5odG1sIj5FeHRlbnNpb25TZXQ8L2E+cyBjb250YWluaW5nCisgYWxsIG9wdGlvbmFsIGRlcGVuZGVuY2llcyBmb3IgamFyLiAoT3B0aW9uYWwgZGVwZW5kZW5jaWVzIHdpbGwgYmUgdXNlZCBpZgorIHByZXNlbnQgZWxzZSB0aGV5IHdpbGwgYmUgaWdub3JlZCk8L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cD48Yj5CYXNpYyBNYW5pZmVzdCBnZW5lcmF0ZWQgZm9yIHNpbmdsZSBFeHRlbnNpb248L2I+PC9wPgorPHByZT4KKyZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7ZTEmcXVvdDsKKyAgICBleHRlbnNpb25OYW1lPSZxdW90O015RXh0ZW5zaW9ucyZxdW90OworICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMCZxdW90OworICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7CisgICAgaW1wbGVtZW50YXRpb25WZW5kb3JJRD0mcXVvdDt2diZxdW90OworICAgIGltcGxlbWVudGF0aW9uVmVuZG9yPSZxdW90O0FwYWNoZSZxdW90OworICAgIGltcGxlbWVudGF0aW9uVmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsKKyAgICBpbXBsZW1lbnRhdGlvblVSTD0mcXVvdDtodHRwOi8vc29tZXdoZXJlLmNvbSZxdW90Oy8mZ3Q7CisKKyZsdDtqYXJsaWItbWFuaWZlc3QgZGVzdGZpbGU9JnF1b3Q7bXlNYW5pZmVzdC50eHQmcXVvdDsmZ3Q7CisgICAgJmx0O2V4dGVuc2lvbiByZWZpZD0mcXVvdDtlMSZxdW90Oy8mZ3Q7CismbHQ7L2phcmxpYi1tYW5pZmVzdCZndDsKKzwvcHJlPgorCis8cD48Yj5TZWFyY2ggZm9yIGV4dGVuc2lvbiBpbiBmaWxlc2V0PC9iPjwvcD4KKzxwPjxiPkEgbGFyZ2UgZXhhbXBsZSB3aXRoIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBkZXBlbmRlbmNpZXM8L2I+PC9wPgorPHByZT4KKyZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7ZTEmcXVvdDsKKyAgICBleHRlbnNpb25OYW1lPSZxdW90O015RXh0ZW5zaW9ucyZxdW90OworICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMCZxdW90OworICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7CisgICAgaW1wbGVtZW50YXRpb25WZW5kb3JJRD0mcXVvdDt2diZxdW90OworICAgIGltcGxlbWVudGF0aW9uVmVuZG9yPSZxdW90O0FwYWNoZSZxdW90OworICAgIGltcGxlbWVudGF0aW9uVmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsKKyAgICBpbXBsZW1lbnRhdGlvblVSTD0mcXVvdDtodHRwOi8vc29tZXdoZXJlLmNvbSZxdW90Oy8mZ3Q7CisKKyZsdDtleHRlbnNpb25TZXQgaWQ9JnF1b3Q7b3B0aW9uLmV4dCZxdW90OyZndDsKKyAgICAmbHQ7bGliZmlsZXNldCBkaXI9JnF1b3Q7bGliL29wdGlvbiZxdW90OyZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphciZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9saWJmaWxlc2V0Jmd0OworJmx0Oy9leHRlbnNpb25TZXQmZ3Q7CisKKyZsdDtleHRlbnNpb25TZXQgaWQ9JnF1b3Q7ZGVwZW5kcy5leHQmcXVvdDsmZ3Q7CisgICAgJmx0O2xpYmZpbGVzZXQgZGlyPSZxdW90O2xpYi9yZXF1aXJlZCZxdW90OyZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqLmphciZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9saWJmaWxlc2V0Jmd0OworJmx0Oy9leHRlbnNpb25TZXQmZ3Q7CisKKyZsdDtqYXJsaWItbWFuaWZlc3QgZGVzdGZpbGU9JnF1b3Q7bXlNYW5pZmVzdC50eHQmcXVvdDsmZ3Q7CisgICAgJmx0O2V4dGVuc2lvbiByZWZpZD0mcXVvdDtlMSZxdW90Oy8mZ3Q7CisgICAgJmx0O2RlcGVuZHMgcmVmaWQ9JnF1b3Q7ZGVwZW5kcy5leHQmcXVvdDsvJmd0OworICAgICZsdDtvcHRpb25zIHJlZmlkPSZxdW90O29wdGlvbi5leHQmcXVvdDsvJmd0OworJmx0Oy9qYXJsaWItbWFuaWZlc3QmZ3Q7Cis8L3ByZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qYXJsaWItcmVzb2x2ZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qYXJsaWItcmVzb2x2ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTA4MzUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2phcmxpYi1yZXNvbHZlLmh0bWwKQEAgLTAsMCArMSwyMTIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+amFybGliLXJlc29sdmUgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0iamFybGliLXJlc29sdmUiPmphcmxpYi1yZXNvbHZlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+VHJ5IHRvIGxvY2F0ZSBhIGphciB0byBzYXRpc2Z5IGFuIGV4dGVuc2lvbiBhbmQgcGxhY2UKKyBsb2NhdGlvbiBvZiBqYXIgaW50byBwcm9wZXJ0eS4gVGhlIHRhc2sgYWxsb3dzIHlvdSB0bworIGFkZCBhIG51bWJlciBvZiByZXNvbHZlcnMgdGhhdCBhcmUgY2FwYWJsZSBvZiBsb2NhdGluZyBhCisgbGlicmFyeSBmb3IgYSBzcGVjaWZpYyBleHRlbnNpb24uIEVhY2ggcmVzb2x2ZXIgd2lsbCBiZSBhdHRlbXB0ZWQKKyBpbiBzcGVjaWZpZWQgb3JkZXIgdW50aWwgbGlicmFyeSBpcyBmb3VuZCBvciBubyByZXNvbHZlcnMgYXJlIGxlZnQuCisgSWYgbm8gcmVzb2x2ZXJzIGFyZSBsZWZ0IGFuZCBmYWlsT25FcnJvciBpcyB0cnVlIHRoZW4gYSBCdWlsZEV4Y2VwdGlvbgorIHdpbGwgYmUgdGhyb3duLjwvcD4KKworPHA+Tm90ZSB0aGF0IHRoaXMgdGFzaword29ya3Mgd2l0aCBleHRlbnNpb25zIGFzIGRlZmluZWQgYnkgdGhlICJPcHRpb25hbCBQYWNrYWdlIiBzcGVjaWZpY2F0aW9uLgorIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50Cis8ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4gaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCitKYXZhMiBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluIGZpbGUKKzxjb2RlPmd1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9jb2RlPiBvciBvbmxpbmUgYXQKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCI+CitodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2E+LjwvcD4KKzxwPlNlZSB0aGUgRXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBwcm9wZXJ0eSB0byBzZXQgdG8gbGlicmFyeSBsb2NhdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbE9uRXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VHJ1ZSBpZiBmYWlsdXJlIHRvIGxvY2F0ZSBsaWJyYXJ5IHNob3VsZCByZXN1bHQgaW4gYnVpbGQgZXhjZXB0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jaGVja0V4dGVuc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UcnVlIGlmIGxpYnJhcmllcyByZXR1cm5lZCBieSBuZXN0ZWQgcmVzb2x2ZXJzIHNob3VsZCBiZSBjaGVja2VkIHRvIHNlZSBpZgorICAgIHRoZXkgc3VwcGx5IGV4dGVuc2lvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPGg0PmV4dGVuc2lvbjwvaDQ+CisgPHA+PGEgaHJlZj0iLi4vT3B0aW9uYWxUeXBlcy9leHRlbnNpb24uaHRtbCI+RXh0ZW5zaW9uPC9hPiB0aGUgZXh0ZW5zaW9uCisgdG8gcmVzb2x2ZS4gTXVzdCBiZSBwcmVzZW50PC9wPgorCis8aDQ+bG9jYXRpb248L2g0PgorIDxwPlRoZSBsb2NhdGlvbiBzdWIgZWxlbWVudCBhbGxvd3MgeW91IHRvIGxvb2sgZm9yIGEgbGlicmFyeSBpbiBhCisgbG9jYXRpb24gcmVsYXRpdmUgdG8gcHJvamVjdCBkaXJlY3RvcnkuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bG9jYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhdGhuYW1lIG9mIGxpYnJhcnkuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+dXJsPC9oND4KKyA8cD5UaGUgdXJsIHJlc29sdmVyIGFsbG93cyB5b3UgdG8gZG93bmxvYWQgYSBsaWJyYXJ5IGZyb20gYSBVUkwgdG8gYQorIGxvY2FsIGZpbGUuPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXJsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBVUkwgdG8gZG93bmxvYWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIGRvd25sb2FkIFVSTCBpbnRvLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgQnV0IG9uZSBvZiBkZXN0ZmlsZSBvcgorICAgIGRlc3RkaXIgbXVzdCBiZSBwcmVzZW50PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHBsYWNlIGRvd25sb2FkZWQgZmlsZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIEJ1dCBvbmUgb2YgZGVzdGZpbGUgb3IKKyAgICBkZXN0ZGlyIG11c3QgYmUgcHJlc2VudDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+YW50PC9oND4KKyA8cD5UaGUgYW50IHJlc29sdmVyIGFsbG93cyB5b3UgdG8gcnVuIGEgYW50IGJ1aWxkIGZpbGUgdG8gZ2VuZXJhdGUgYSBsaWJyYXJ5LjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFudGZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGJ1aWxkIGZpbGUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRoYXQgdGhlIGFudCBidWlsZCBjcmVhdGVzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50YXJnZXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHRhcmdldCB0byBydW4gaW4gYnVpbGQgZmlsZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwPjxiPlJlc29sdmUgRXh0ZW5zaW9uIHRvIGZpbGUuPC9iPiBJZiBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGZpbGUKKyAgIGRvZXMgbm90IGltcGxlbWVudCBleHRlbnNpb24gdGhlbiB0aHJvdyBhbiBleGNlcHRpb24uPC9wPgorPHByZT4KKyAgJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtkdmUuZXh0JnF1b3Q7CisgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcucmVhbGl0eWZvcmdlLmR2ZSZxdW90OworICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMiZxdW90OworICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7LyZndDsKKworICAmbHQ7amFybGliLXJlc29sdmUgcHJvcGVydHk9ImR2ZS5saWJyYXJ5IiZndDsKKyAgICAmbHQ7ZXh0ZW5zaW9uIHJlZmlkPSJkdmUuZXh0Ii8mZ3Q7CisgICAgJmx0O2xvY2F0aW9uIGxvY2F0aW9uPSIvb3B0L2phcnMvZHZlLmphciIvJmd0OworICAmbHQ7L2phcmxpYi1yZXNvbHZlJmd0OworPC9wcmU+CisKKzxwPjxiPlJlc29sdmUgRXh0ZW5zaW9uIHRvIHVybC48L2I+IElmIHVybCBkb2VzIG5vdCBleGlzdCBvciBjYW4gbm90IHdyaXRlCisgICB0byBkZXN0ZmlsZSBvciBmaWxlcyBkb2VzIG5vdCBpbXBsZW1lbnQgZXh0ZW5zaW9uIHRoZW4gdGhyb3cgYW4gZXhjZXB0aW9uLjwvcD4KKzxwcmU+CisgICZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7ZHZlLmV4dCZxdW90OworICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7b3JnLnJlYWxpdHlmb3JnZS5kdmUmcXVvdDsKKyAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbj0mcXVvdDsxLjImcXVvdDsKKyAgICBzcGVjaWZpY2F0aW9uVmVuZG9yPSZxdW90O1BldGVyIERvbmFsZCZxdW90Oy8mZ3Q7CisKKyAgJmx0O2phcmxpYi1yZXNvbHZlIHByb3BlcnR5PSJkdmUubGlicmFyeSImZ3Q7CisgICAgJmx0O2V4dGVuc2lvbiByZWZpZD0iZHZlLmV4dCIvJmd0OworICAgICZsdDt1cmwgdXJsPSJodHRwOi8vd3d3LnJlYWxpdHlmb3JnZS5uZXQvamFycy9kdmUuamFyIiBkZXN0ZmlsZT0ibGliL2R2ZS5qYXIiLyZndDsKKyAgJmx0Oy9qYXJsaWItcmVzb2x2ZSZndDsKKzwvcHJlPgorCis8cD48Yj5SZXNvbHZlIEV4dGVuc2lvbiB0byBmaWxlIHByb2R1Y2UgYnkgYW50IGJ1aWxkLjwvYj4gSWYgZmlsZSBkb2VzIG5vdCBnZXQgcHJvZHVjZWQKKyAgIG9yIGFudCBmaWxlIGlzIG1pc3Npbmcgb3IgYnVpbGQgZmFpbHMgdGhlbiB0aHJvdyBhbiBleGNlcHRpb24gKE5vdGUgZG9lcyBub3QgY2hlY2sKKyAgIHRoYXQgbGlicmFyeSBpbXBsZW1lbnRzIGV4dGVuc2lvbikuPC9wPgorPHByZT4KKyAgJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtkdmUuZXh0JnF1b3Q7CisgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcucmVhbGl0eWZvcmdlLmR2ZSZxdW90OworICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMiZxdW90OworICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7LyZndDsKKworICAmbHQ7amFybGliLXJlc29sdmUgcHJvcGVydHk9ImR2ZS5saWJyYXJ5IiBjaGVja0V4dGVuc2lvbj0iZmFsc2UiJmd0OworICAgICZsdDtleHRlbnNpb24gcmVmaWQ9ImR2ZS5leHQiLyZndDsKKyAgICAmbHQ7YW50IGFudGZpbGU9Ii4uL2R2ZS9idWlsZC54bWwiIHRhcmdldD0ibWFpbiIgZGVzdGZpbGU9ImxpYi9kdmUuamFyIi8mZ3Q7CisgICZsdDsvamFybGliLXJlc29sdmUmZ3Q7Cis8L3ByZT4KKworPHA+PGI+UmVzb2x2ZSBFeHRlbnNpb24gdmlhIG11bHRpcGxlIG1ldGhvZHMuPC9iPiBGaXJzdCBjaGVjayBsb2NhbCBmaWxlIHRvIHNlZSBpZiBpdCBpbXBsZW1lbnRzCisgIGV4dGVuc2lvbi4gSWYgaXQgZG9lcyBub3QgdGhlbiB0cnkgdG8gYnVpbGQgaXQgZnJvbSBzb3VyY2UgaW4gcGFyYWxsZWwgZGlyZWN0b3J5LiBJZiB0aGF0CisgIGZhaWxzIHRoZW4gZmluYWxseSB0cnkgdG8gZG93bmxvYWQgaXQgZnJvbSBhIHdlYnNpdGUuIElmIGFsbCBzdGVwcyBmYWlsIHRoZW4gdGhyb3cgYSBidWlsZAorICBleGNlcHRpb24uPC9wPgorPHByZT4KKyAgJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtkdmUuZXh0JnF1b3Q7CisgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcucmVhbGl0eWZvcmdlLmR2ZSZxdW90OworICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMiZxdW90OworICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7LyZndDsKKworICAmbHQ7amFybGliLXJlc29sdmUgcHJvcGVydHk9ImR2ZS5saWJyYXJ5IiZndDsKKyAgICAmbHQ7ZXh0ZW5zaW9uIHJlZmlkPSJkdmUuZXh0Ii8mZ3Q7CisgICAgJmx0O2xvY2F0aW9uIGxvY2F0aW9uPSIvb3B0L2phcnMvZHZlLmphciIvJmd0OworICAgICZsdDthbnQgYW50ZmlsZT0iLi4vZHZlL2J1aWxkLnhtbCIgdGFyZ2V0PSJtYWluIiBkZXN0ZmlsZT0ibGliL2R2ZS5qYXIiLyZndDsKKyAgICAmbHQ7dXJsIHVybD0iaHR0cDovL3d3dy5yZWFsaXR5Zm9yZ2UubmV0L2phcnMvZHZlLmphciIgZGVzdGZpbGU9ImxpYi9kdmUuamFyIi8mZ3Q7CisgICZsdDsvamFybGliLXJlc29sdmUmZ3Q7Cis8L3ByZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qYXZhY2MuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvamF2YWNjLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiNDYwYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvamF2YWNjLmh0bWwKQEAgLTAsMCArMSwyMDQgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SmF2YUNDIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImphdmFjYyI+SmF2YUNDPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+CisgIEludm9rZXMgdGhlIDxhIEhSRUY9Imh0dHA6Ly9qYXZhY2MuZGV2LmphdmEubmV0LyIgdGFyZ2V0PSJfdG9wIj5KYXZhQ0M8L2E+IGNvbXBpbGVyCisgIGNvbXBpbGVyIG9uIGEgZ3JhbW1hciBmaWxlLgorPC9wPgorPHA+CisgIFRvIHVzZSB0aGUgamF2YWNjIHRhc2ssIHNldCB0aGUgPGk+dGFyZ2V0PC9pPiBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUgb2YgdGhlCisgIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLiAgWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZworICB0aGUgSmF2YUNDIGluc3RhbGxhdGlvbiB1c2luZyB0aGUgPGk+amF2YWNjaG9tZTwvaT4gYXR0cmlidXRlLCBzbyB0aGF0IGFudAorICBjYW4gZmluZCB0aGUgSmF2YUNDIGNsYXNzZXMuICBPcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZQorICA8aT5vdXRwdXRkaXJlY3Rvcnk8L2k+IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZSB0byBhIHNwZWNpZmljIGRpcmVjdG9yeS4KKyAgT3RoZXJ3aXNlIGphdmFjYyB3cml0ZXMgdGhlIGdlbmVyYXRlZCBmaWxlcyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcKKyAgdGhlIGdyYW1tYXIgZmlsZS4KKzwvcD4KKzxwPgorICBUaGlzIHRhc2sgb25seSBpbnZva2VzIEphdmFDQyBpZiB0aGUgZ3JhbW1hciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGdlbmVyYXRlZAorICBKYXZhIGZpbGVzLiAgamF2YWNjIGFzc3VtZXMgdGhhdCB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgcGFyc2VyCisgIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBncmFtbWFyIGZpbGUsIGlnbm9yaW5nIHRoZSAuamouCisgIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgamF2YWNjIHRhc2sgd2lsbCBzdGlsbCB3b3JrLCBidXQgaXQgd2lsbCBhbHdheXMKKyAgZ2VuZXJhdGUgdGhlIG91dHB1dCBmaWxlcy4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+amF2YWNjaG9tZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dGRpcmVjdG9yeTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIFRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBmaWxlcyB0by4gIElmIG5vdCBzZXQsIHRoZSBmaWxlcworICAgICAgYXJlIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YnVpbGRwYXJzZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgQlVJTERfUEFSU0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1aWxkdG9rZW5tYW5hZ2VyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIEJVSUxEX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FjaGV0b2tlbnM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgQ0FDSEVfVE9LRU5TIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNob2ljZWFtYmlndWl0eWNoZWNrPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIENIT0lDRV9BTUJJR1VJVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGFuIGludGVnZXIgb3B0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1vbnRva2VuYWN0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIENPTU1PTl9UT0tFTl9BQ1RJT04gZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWdsb29rYWhlYWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgREVCVUdfTE9PS0FIRUFEIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlYnVncGFyc2VyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIERFQlVHX1BBUlNFUiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1Z3Rva2VubWFuYWdlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBERUJVR19UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9ycmVwb3J0aW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIEVSUk9SX1JFUE9SVElORyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZWxhY2hlY2s8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgRk9SQ0VfTEFfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlY2FzZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBJR05PUkVfQ0FTRSBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5qYXZhdW5pY29kZWVzY2FwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBKQVZBX1VOSUNPREVfRVNDQVBFIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmpka3ZlcnNpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgSkRLX1ZFUlNJT04gb3B0aW9uLiBUaGlzIGlzIGEgc3RyaW5nIG9wdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPiAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+a2VlcGxpbmVjb2x1bW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgS0VFUF9MSU5FX0NPTFVNTiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb29rYWhlYWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgTE9PS0FIRUFEIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhbiBpbnRlZ2VyIG9wdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vcHRpbWl6ZXRva2VubWFuYWdlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBPUFRJTUlaRV9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm90aGVyYW1iaWd1aXR5Y2hlY2s8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgT1RIRVJfQU1CSUdVSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhbiBpbnRlZ2VyIG9wdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zYW5pdHljaGVjazwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBTQU5JVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3RhdGljPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIFNUQVRJQyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51bmljb2RlaW5wdXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgVU5JQ09ERV9JTlBVVCBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2VyY2hhcnN0cmVhbTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBVU0VSX0NIQVJfU1RSRUFNIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXJ0b2tlbm1hbmFnZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgVVNFUl9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGU8L2gzPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtqYXZhY2MKKyAgICB0YXJnZXQ9JnF1b3Q7c3JjL1BhcnNlci5qaiZxdW90OworICAgIG91dHB1dGRpcmVjdG9yeT0mcXVvdDtidWlsZC9zcmMmcXVvdDsKKyAgICBqYXZhY2Nob21lPSZxdW90O2M6L3Byb2dyYW0gZmlsZXMvSmF2YUNDJnF1b3Q7CisgICAgc3RhdGljPSZxdW90O3RydWUmcXVvdDsKKy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD4KKyAgVGhpcyBpbnZva2VzIEphdmFDQyBvbiBncmFtbWFyIGZpbGUgc3JjL1BhcnNlci5qaiwgd3JpdGluZyB0aGUgZ2VuZXJhdGVkCisgIGZpbGVzIHRvIGJ1aWxkL3NyYy4gIFRoZSBncmFtbWFyIG9wdGlvbiBTVEFUSUMgaXMgc2V0IHRvIHRydWUgd2hlbgorICBpbnZva2luZyBKYXZhQ0MuCis8L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvamF2YWguaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvamF2YWguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmViYjhhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qYXZhaC5odG1sCkBAIC0wLDAgKzEsMTkyIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkphdmFoIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImphdmFoIj5KYXZhaDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkdlbmVyYXRlcyBKTkkgaGVhZGVycyBmcm9tIGEgSmF2YSBjbGFzcy48L3A+Cis8cD4gV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgZ2VuZXJhdGUgdGhlIEMgaGVhZGVyIGFuZCBzb3VyY2UgZmlsZXMgdGhhdAorYXJlIG5lZWRlZCB0byBpbXBsZW1lbnQgbmF0aXZlIG1ldGhvZHMuIEpOSSBvcGVyYXRlcyBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24KK3doZXRoZXIgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL3Rvb2xkb2NzL3dpbjMyL2phdmFoLmh0bWwiPkpESzEuMjwvYT4KKyhvciBsYXRlcikgb3IgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4xL2RvY3MvdG9vbGRvY3Mvd2luMzIvamF2YWguaHRtbCI+cHJlLUpESzEuMjwvYT4KK3N5c3RlbXMgYXJlIHVzZWQuPC9wPgorCis8cD5JdCBpcyBwb3NzaWJsZSB0byB1c2UgZGlmZmVyZW50IGNvbXBpbGVycy4gVGhpcyBjYW4gYmUgc2VsZWN0ZWQKK3dpdGggdGhlIDxjb2RlPmltcGxlbWVudGF0aW9uPC9jb2RlPiBhdHRyaWJ1dGUuICA8YQorbmFtZT0iaW1wbGVtZW50YXRpb252YWx1ZXMiPkhlcmUgYXJlIHRoZSBjaG9pY2VzPC9hPjo8L3A+Cis8dWw+CisgIDxsaT5kZWZhdWx0IC0gdGhlIGRlZmF1bHQgY29tcGlsZXIgKGthZmZlaCBvciBzdW4pIGZvciB0aGUgcGxhdGZvcm0uPC9saT4KKyAgPGxpPnN1biAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIHRoZSBKREspPC9saT4KKyAgPGxpPmthZmZlaCAodGhlIG5hdGl2ZSBzdGFuZGFyZCBjb21waWxlciBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmthZmZlLm9yZyIgdGFyZ2V0PSJfdG9wIj5LYWZmZTwvYT4pPC9saT4KKzwvdWw+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgKG9yIGNsYXNzZXMsCisgICAgICBzZXBhcmF0ZWQgYnkgY29tbWFzKTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXRGaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0aW5nIGhlYWRlciBvciBzb3VyY2UgZmlsZXMgZm9yIGFsbCB0aGUgY2xhc3NlcyBsaXN0ZWQgaW50byB0aGlzIGZpbGU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgcm93c3Bhbj0iMiI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZXRzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgamF2YWggc2F2ZXMgdGhlIGhlYWRlciBmaWxlcyBvciB0aGUKKyAgICAgIHN0dWIgZmlsZXMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yY2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3BlY2lmaWVzIHRoYXQgb3V0cHV0IGZpbGVzIHNob3VsZCBhbHdheXMgYmUgd3JpdHRlbiAoSkRLMS4yIG9ubHkpPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b2xkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNwZWNpZmllcyB0aGF0IG9sZCBKREsxLjAtc3R5bGUgaGVhZGVyIGZpbGVzIHNob3VsZCBiZSBnZW5lcmF0ZWQKKyAgICAgIChvdGhlcndpc2Ugb3V0cHV0IGZpbGUgY29udGFpbiBKTkktc3R5bGUgbmF0aXZlIG1ldGhvZCAgICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMpIChKREsxLjIgb25seSk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdHViczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5nZW5lcmF0ZSBDIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBKYXZhIG9iamVjdCBmaWxlICh1c2VkIHdpdGggb2xkKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2F1c2VzIEphdmFoIHRvIHByaW50IGEgbWVzc2FnZSBjb25jZXJuaW5nIHRoZSBzdGF0dXMgICAgIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzcGF0aCB0byB1c2UuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Ym9vdGNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhdGlvbiBvZiBib290c3RyYXAgY2xhc3MgZmlsZXMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXh0ZGlyczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gbG9jYXRpb24gb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW1wbGVtZW50YXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIElmIHRoaXMKKyAgICBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIGRlZmF1bHQgY29tcGlsZXIgZm9yIHRoZSBjdXJyZW50IFZNCisgICAgd2lsbCBiZSB1c2VkLiAgKFNlZSB0aGUgYWJvdmUgPGEKKyAgICBocmVmPSIjaW1wbGVtZW50YXRpb252YWx1ZXMiPmxpc3Q8L2E+IG9mIHZhbGlkIGNvbXBpbGVycy4pPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD5FaXRoZXIgb3V0cHV0RmlsZSBvciBkZXN0ZGlyIG11c3QgYmUgc3VwcGxpZWQsIGJ1dCBub3QgYm90aC4mbmJzcDs8L3A+CisKKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+YXJnPC9oND4KKworPHA+WW91IGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIGNvbXBpbGVyCit3aXRoIG5lc3RlZCA8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gZWxlbWVudHMuICBUaGVzZSBlbGVtZW50cyBhcmUKK3NwZWNpZmllZCBsaWtlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPgorYnV0IGhhdmUgYW4gYWRkaXRpb25hbCBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCB0byBlbmFibGUgYXJndW1lbnRzCitvbmx5IGlmIGEgZ2l2ZW4gY29tcGlsZXIgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjQiPlNlZQorICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSI0Ij5FeGFjdGx5IG9uZSBvZiB0aGVzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5saW5lPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGg8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbXBsZW1lbnRhdGlvbjwvdGQ+CisgICAgPHRkPk9ubHkgcGFzcyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IGlmIHRoZSBjaG9zZW4gY29tcGlsZXIKKyAgICBpbXBsZW1lbnRhdGlvbiBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZS4gIExlZ2FsIHZhbHVlcworICAgIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBpbiB0aGUgYWJvdmUgPGEKKyAgICBocmVmPSIjaW1wbGVtZW50YXRpb252YWx1ZXMiPmxpc3Q8L2E+IG9mIHZhbGlkIGNvbXBpbGVycy4pPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+ICAmbHQ7amF2YWggZGVzdGRpcj0mcXVvdDtjJnF1b3Q7IGNsYXNzPSZxdW90O29yZy5mb28uYmFyLldpYmJsZSZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD5tYWtlcyBhIEpOSSBoZWFkZXIgb2YgdGhlIG5hbWVkIGNsYXNzLCB1c2luZyB0aGUgSkRLMS4yIEpOSSBtb2RlbC4gQXNzdW1pbmcKK3RoZSBkaXJlY3RvcnkgJ2MnIGFscmVhZHkgZXhpc3RzLCB0aGUgZmlsZSA8dHQ+b3JnX2Zvb19iYXJfV2liYmxlLmg8L3R0PgoraXMgY3JlYXRlZCB0aGVyZS4gSWYgdGhpcyBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdCBpcyBsZWZ0IHVuY2hhbmdlZC48L3A+Cis8cHJlPiAgJmx0O2phdmFoIG91dHB1dEZpbGU9JnF1b3Q7d2liYmxlLmgmcXVvdDsmZ3Q7CisgICAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuV2liYmxlLG9yZy5mb28uYmFyLkJvYmJsZSZxdW90Oy8mZ3Q7CisgICZsdDsvamF2YWgmZ3Q7PC9wcmU+Cis8cD5pcyBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBleGFtcGxlLCBleGNlcHQgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIGEgZmlsZQorY2FsbGVkIDx0dD53aWJibGUuaDwvdHQ+CitpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuPC9wPgorPHByZT4gICZsdDtqYXZhaCBkZXN0ZGlyPSZxdW90O2MmcXVvdDsgZm9yY2U9JnF1b3Q7eWVzJnF1b3Q7Jmd0OworICAgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLldpYmJsZSZxdW90Oy8mZ3Q7CisgICAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuQm9iYmxlJnF1b3Q7LyZndDsKKyAgICAmbHQ7Y2xhc3MgbmFtZT0mcXVvdDtvcmcuZm9vLmJhci5UcmliYmxlJnF1b3Q7LyZndDsKKyAgJmx0Oy9qYXZhaCZndDs8L3ByZT4KKzxwPndyaXRlcyB0aHJlZSBoZWFkZXIgZmlsZXMsIG9uZSBmb3IgZWFjaCBvZiB0aGUgY2xhc3NlcyBuYW1lZC4gQmVjYXVzZSB0aGUKK2ZvcmNlIG9wdGlvbiBpcyBzZXQsIHRoZXNlIGhlYWRlciBmaWxlcyBhcmUgYWx3YXlzIHdyaXR0ZW4gd2hlbiB0aGUgSmF2YWggdGFzaworaXMgaW52b2tlZCwgZXZlbiBpZiB0aGV5IGFscmVhZHkgZXhpc3QuPC9wPgorPHByZT4gICZsdDtqYXZhaCBkZXN0ZGlyPSZxdW90O2MmcXVvdDsgdmVyYm9zZT0mcXVvdDt5ZXMmcXVvdDsgb2xkPSZxdW90O3llcyZxdW90OyBmb3JjZT0mcXVvdDt5ZXMmcXVvdDsmZ3Q7CisgICAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuV2liYmxlJnF1b3Q7LyZndDsKKyAgICAmbHQ7Y2xhc3MgbmFtZT0mcXVvdDtvcmcuZm9vLmJhci5Cb2JibGUmcXVvdDsvJmd0OworICAgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLlRyaWJibGUmcXVvdDsvJmd0OworICAmbHQ7L2phdmFoJmd0OworICAmbHQ7amF2YWggZGVzdGRpcj0mcXVvdDtjJnF1b3Q7IHZlcmJvc2U9JnF1b3Q7eWVzJnF1b3Q7IHN0dWJzPSZxdW90O3llcyZxdW90OyBvbGQ9JnF1b3Q7eWVzJnF1b3Q7IGZvcmNlPSZxdW90O3llcyZxdW90OyZndDsKKyAgICAmbHQ7Y2xhc3MgbmFtZT0mcXVvdDtvcmcuZm9vLmJhci5XaWJibGUmcXVvdDsvJmd0OworICAgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLkJvYmJsZSZxdW90Oy8mZ3Q7CisgICAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuVHJpYmJsZSZxdW90Oy8mZ3Q7CisgICZsdDsvamF2YWgmZ3Q7PC9wcmU+Cis8cD53cml0ZXMgdGhlIGhlYWRlcnMgZm9yIHRoZSB0aHJlZSBjbGFzc2VzIHVzaW5nIHRoZSAnb2xkJyBKTkkgZm9ybWF0LCB0aGVuCit3cml0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgLmMgc3R1YnMuIFRoZSB2ZXJib3NlIG9wdGlvbiB3aWxsIGNhdXNlIEphdmFoIHRvCitkZXNjcmliZSBpdHMgcHJvZ3Jlc3MuPC9wPgorCisKKzwvYm9keT4KKworPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qZGVwZW5kLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2pkZXBlbmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDhmOTRhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qZGVwZW5kLmh0bWwKQEAgLTAsMCArMSwxNzcgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+CisKKzxodG1sPgorPGhlYWQ+CisgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkpEZXBlbmQgVGFzazwvdGl0bGU+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBOQU1FPSJKRGVwZW5kIj48L2E+SkRlcGVuZDwvaDI+CisKKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKzxQPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPkpEZXBlbmQ8L2E+IHBhcnNlci48L1A+CisKKzxQPlRoaXMgcGFyc2VyICZxdW90O3RyYXZlcnNlcyBhIHNldCBvZiBKYXZhIHNvdXJjZSBmaWxlIGRpcmVjdG9yaWVzIGFuZCBnZW5lcmF0ZXMgZGVzaWduIHF1YWxpdHkgbWV0cmljcyBmb3IgZWFjaCBKYXZhIHBhY2thZ2UmcXVvdDsuCitJdCBhbGxvd3MgdG8gJnF1b3Q7YXV0b21hdGljYWxseSBtZWFzdXJlIHRoZSBxdWFsaXR5IG9mIGEgZGVzaWduIGluIHRlcm1zIG9mIGl0cyBleHRlbnNpYmlsaXR5LCByZXVzYWJpbGl0eSwgYW5kIG1haW50YWluYWJpbGl0eSB0bworZWZmZWN0aXZlbHkgbWFuYWdlIGFuZCBjb250cm9sIHBhY2thZ2UgZGVwZW5kZW5jaWVzLiZxdW90OzwvUD4KKworPHA+U291cmNlIGZpbGUgZGlyZWN0b3JpZXMgYXJlIGRlZmluZWQgYnkgbmVzdGVkCis8Y29kZT4mbHQ7c291cmNlc3BhdGgmZ3Q7PC9jb2RlPjsgQ2xhc3MgZmlsZSBkaXJlY3RvcmllcyBhcmUgZGVmaW5lZAorYnkgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc2VzZXNwYXRoJmd0OzwvY29kZT4sIHNlZSA8YQoraHJlZj0iI25lc3RlZCI+bmVzdGVkIGVsZW1lbnRzPC9hPi48L3A+CisKKzxwPk9wdGlvbmFsbHksIHlvdSBjYW4gYWxzbyBzZXQgdGhlIDxjb2RlPm91dHB1dGZpbGU8L2NvZGU+IG5hbWUgd2hlcmUgdGhlIG91dHB1dCBpcyBzdG9yZWQuIEJ5IGRlZmF1bHQgdGhlIHRhc2sgd3JpdGVzIGl0cyByZXBvcnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC48L1A+CisKKzxwPiBUaGUgdGFzayByZXF1aXJlcyBhdCBsZWFzdCB0aGUgSkRlcGVuZCAxLjIgdmVyc2lvbi4gPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+CisKKzx0YWJsZSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTIgPgorICA8dHI+CisgICAgPHRkIFZBTElHTj1UT1A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIFZBTElHTj1UT1A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBWQUxJR049VE9QPm91dHB1dGZpbGU8L3RkPgorICAgIDx0ZCBWQUxJR049VE9QPlRoZSBvdXRwdXQgZmlsZSBuYW1lLiBJZiBub3Qgc2V0LCB0aGUgb3V0cHV0IGlzIHByaW50ZWQgb24gdGhlIHN0YW5kYXJkIG91dHB1dC48L3RkPgorICAgIDx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgVkFMSUdOPVRPUD5mb3JtYXQ8L3RkPgorICAgIDx0ZCBWQUxJR049VE9QPlRoZSBmb3JtYXQgdG8gd3JpdGUgdGhlIG91dHB1dCBpbi4gVGhlIGRlZmF1bHQgaXMgInRleHQiLCB0aGUgYWx0ZXJuYXRpdmUgaXMgInhtbCI8L3RkPgorICAgIDx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgVkFMSUdOPVRPUD5mb3JrPC90ZD4KKyAgICA8dGQgVkFMSUdOPVRPUD5SdW4gdGhlIHRlc3RzIGluIGEgc2VwYXJhdGUgVk0uPC90ZD4KKyAgICA8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm8sIGRlZmF1bHQgaXMgIm9mZiI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIFZBTElHTj1UT1A+aGFsdG9uZXJyb3I8L3RkPgorICAgIDx0ZCBWQUxJR049VE9QPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgamRlcGVuZCBhbmFseXNpcy48L3RkPgorICAgIDx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObywgZGVmYXVsdCBpcyAib2ZmIjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgVkFMSUdOPVRPUD50aW1lb3V0PC90ZD4KKyAgICA8dGQgVkFMSUdOPVRPUD5DYW5jZWwgdGhlIG9wZXJhdGlvbiBpZiBpdCBkb2Vzbid0IGZpbmlzaCBpbiB0aGUgZ2l2ZW4gdGltZSAobWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzKS4gKElnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZC4pPC90ZD4KKyAgICA8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIFZBTElHTj1UT1A+anZtPC90ZD4KKyAgICA8dGQgVkFMSUdOPVRPUD5UaGUgY29tbWFuZCB1c2VkIHRvIGludm9rZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUsIGRlZmF1bHQgaXMgJ2phdmEnLiBUaGUgY29tbWFuZCBpcyByZXNvbHZlZCBieSBqYXZhLmxhbmcuUnVudGltZS5leGVjKCkuIChJZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQuKTwvdGQ+CisgICAgPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vLCBkZWZhdWx0ICJqYXZhIjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgVkFMSUdOPVRPUD5kaXI8L3RkPgorICAgIDx0ZCBWQUxJR049VE9QPlRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi4gKElnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZCk8L3RkPgorICAgIDx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgVkFMSUdOPVRPUD5pbmNsdWRlcnVudGltZTwvdGQ+CisgICAgPHRkIFZBTElHTj1UT1A+SW1wbGljaXRseSBhZGQgdGhlIGNsYXNzZXMgcmVxdWlyZWQgdG8gcnVuIGpkZXBlbmQKKyAgICBpbiBmb3JrZWQgbW9kZS4gKElnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZCkuIFNpbmNlIGFudCAxLjYuPC90ZD4KKyAgICA8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm8sIGRlZmF1bHQgaXMgIm5vIi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIFZBTElHTj1UT1A+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgVkFMSUdOPVRPUD50aGUgY2xhc3NwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgcmVmZXJlbmNlIHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+PGEgbmFtZT0ibmVzdGVkIj5OZXN0ZWQgRWxlbWVudHM8L2E+PC9oMz4KKworPHA+PGNvZGU+amRlcGVuZDwvY29kZT4gc3VwcG9ydHMgZm91ciBuZXN0ZWQgZWxlbWVudHM6Cis8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OywgJmx0O2NsYXNzZXNwYXRoJmd0OyA8L2NvZGU+IGFuZAorPGNvZGU+Jmx0O3NvdXJjZXNwYXRoJmd0OzwvY29kZT4sIHRoYXQgcmVwcmVzZW50IDxhCitocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZSBzdHJ1Y3R1cmVzPC9hPiwgYW5kCis8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+LjwvcD4KKworPHA+PGNvZGU+Jmx0O3NvdXJjZXNwYXRoJmd0OzwvY29kZT4gaXMgdXNlZCB0byBkZWZpbmUgdGhlIHBhdGhzIG9mIHRoZQorc291cmNlIGNvZGUgdG8gYW5hbHl6ZSwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuIFdpdGggdmVyc2lvbiAyLjUgb2YKK0pEZXBlbmQsIG9ubHkgY2xhc3MgZmlsZXMgYXJlIGFuYWx5emVkLiBUaGUgbmVzdGVkIGVsZW1lbnQKKzxjb2RlPiZsdDtjbGFzc2VzcGF0aCZndDs8L2NvZGU+IHJlcGxhY2VzIDxjb2RlPiZsdDtzb3VyY2VzcGF0aCZndDs8L2NvZGU+IGFuZCBpcyB1c2VkIHRvIGRlZmluZQordGhlIHBhdGhzIG9mIGNvbXBpbGVkIGNsYXNzIGNvZGUgdG8gYW5hbHl6ZTsgdGhlIDxjb2RlPiZsdDtzb3VyY2VzcGF0aCZndDs8L2NvZGU+Cit2YXJpYWJsZSBpcyBzdGlsbCBhdmFpbGFibGUgaW4gY2FzZSB5b3UgYXJlIHVzaW5nIGFuIGVhcmxpZXIgdmVyc2lvbgorb2YgSkRlcGVuZC4gIFRoZSA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGVsZW1lbnQgY2FuIGJlIHVzZWQgdG8gc2V0IHBhY2thZ2VzCit0byBpZ25vcmUgKHJlcXVpcmVzIEpEZXBlbmQgMi41IG9yIGFib3ZlKS48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxibG9ja3F1b3RlPgorPHByZT4KKyZsdDtqZGVwZW5kIGNsYXNzcGF0aHJlZj0iYmFzZS5wYXRoIiZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Y2xhc3Nlc3BhdGgmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQiLyZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L2NsYXNzZXNwYXRoJmd0OworJmx0Oy9qZGVwZW5kJmd0OworCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+VGhpcyBpbnZva2VzIEpEZXBlbmQgb24gdGhlIDxjb2RlPmJ1aWxkPC9jb2RlPiBkaXJlY3RvcnksIHdyaXRpbmcKK3RoZSBvdXRwdXQgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4gVGhlIGNsYXNzcGF0aCBpcyBkZWZpbmVkIHVzaW5nIGEKK2NsYXNzcGF0aCByZWZlcmVuY2UuPC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7amRlcGVuZCBvdXRwdXRmaWxlPSJkb2NzL2pkZXBlbmQueG1sIiBmb3JrPSJ5ZXMiIGZvcm1hdD0ieG1sIiZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7c291cmNlc3BhdGgmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjIi8mZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9zb3VyY2VzcGF0aCZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Y2xhc3NwYXRoJmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249ImNsYXNzZXMiLyZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJsaWIvamRlcGVuZC5qYXIiLyZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L2NsYXNzcGF0aCZndDsKKyZsdDsvamRlcGVuZCZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD5UaGlzIGludm9rZXMgSkRlcGVuZCBpbiBhIHNlcGFyYXRlIFZNIG9uIHRoZSA8Y29kZT5zcmM8L2NvZGU+IGFuZAorPGNvZGU+dGVzdHNyYzwvY29kZT4gZGlyZWN0b3JpZXMsIHdyaXRpbmcgdGhlIG91dHB1dCB0byB0aGUKKzxjb2RlPiZsdDtkb2NzL2pkZXBlbmQueG1sJmd0OzwvY29kZT4gZmlsZSBpbiB4bWwgZm9ybWF0LiBUaGUKK2NsYXNzcGF0aCBpcyBkZWZpbmVkIHVzaW5nIG5lc3RlZCBlbGVtZW50cy4gPC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7amRlcGVuZCBjbGFzc3BhdGhyZWY9ImJhc2UucGF0aCImZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsgJmx0O2V4Y2x1ZGUgbmFtZT0iamF2YS4qJmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtleGNsdWRlIG5hbWU9ImphdmF4LiomZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsgJmx0O2NsYXNzZXNwYXRoJmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkIi8mZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsgJmx0Oy9jbGFzc2VzcGF0aCZndDsKKyZsdDsvamRlcGVuZCZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD5UaGlzIGludm9rZXMgSkRlcGVuZCB3aXRoIHRoZSBidWlsZCBkaXJlY3RvcnkgYXMgdGhlIGJhc2UgZm9yIGNsYXNzCitmaWxlcyB0byBhbmFseXplLCBhbmQgd2lsbCBpZ25vcmUgYWxsIGNsYXNzZXMgaW4gdGhlIGphdmEuKiBhbmQKK2phdmF4LiogcGFja2FnZXMuPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2pqZG9jLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2pqZG9jLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzNDlkMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvampkb2MuaHRtbApAQCAtMCwwICsxLDExNiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SkpEb2MgVGFzazwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGgyPgorPGEgTkFNRT0iamp0cmVlIj48L2E+SkpEb2M8L2gyPgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvcD4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKzxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhY2MuZGV2LmphdmEubmV0LyI+SkpEb2M8L2E+IHByZXByb2Nlc3NvcgorZm9yIHRoZSBKYXZhQ0MgY29tcGlsZXIgY29tcGlsZXIuIEl0IHRha2VzIGEgSmF2YUNDIHBhcnNlciBzcGVjaWZpY2F0aW9uCithbmQgcHJvZHVjZXMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEJORiBncmFtbWFyLgorSXQgY2FuIG9wZXJhdGUgaW4gdGhyZWUgbW9kZXMsIGRldGVybWluZWQgYnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuCis8cD5UbyB1c2UgdGhlIGpqZG9jIHRhc2ssIHNldCB0aGUgPGk+dGFyZ2V0PC9pPiBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUKK29mIHRoZSBKYXZhQ0MgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5Citjb250YWluaW5nIHRoZSBKYXZhQ0MgaW5zdGFsbGF0aW9uIHVzaW5nIHRoZSA8aT5qYXZhY2Nob21lPC9pPiBhdHRyaWJ1dGUsCitzbyB0aGF0IGFudCBjYW4gZmluZCB0aGUgSmF2YUNDIGNsYXNzZXMuIE9wdGlvbmFsbHksIHlvdSBjYW4gYWxzbyBzZXQgdGhlCis8aT5vdXRwdXRmaWxlPC9pPiB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIEJORiBkb2N1bWVudGF0aW9uIGZpbGUgdG8gYSBzcGVjaWZpYyAoZGlyZWN0b3J5IGFuZCkgZmlsZS4KK090aGVyd2lzZSBqamRvYyB3cml0ZXMgdGhlIGdlbmVyYXRlZCBCTkYgZG9jdW1lbnRhdGlvbiBmaWxlIGFzIHRoZSBKYXZhQ0MKK2dyYW1tYXIgZmlsZSB3aXRoIGEgc3VmZml4IC50eHQgb3IgLmh0bWwuPC9wPgorPHA+VGhpcyB0YXNrIG9ubHkgaW52b2tlcyBKSkRvYyBpZiB0aGUgZ3JhbW1hciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlCitnZW5lcmF0ZWQgQk5GIGRvY3VtZW50YXRpb24gZmlsZS48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKworPHRhYmxlIEJPUkRFUiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTIgPgorPHRyPgorPHRkIFZBTElHTj1UT1A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisKKzx0ZCBWQUxJR049VE9QPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisKKzx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD48Yj5SZXF1aXJlZDwvYj48L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1A+dGFyZ2V0PC90ZD4KKworPHRkIFZBTElHTj1UT1A+VGhlIGphdmFjYyBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy48L3RkPgorCis8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+WWVzPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPmphdmFjY2hvbWU8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5UaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPlllczwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgVkFMSUdOPVRPUD5vdXRwdXRmaWxlPC90ZD4KKworPHRkIFZBTElHTj1UT1A+VGhlIGZpbGUgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBCTkYgZG9jdW1lbnRhdGlvbiBmaWxlIHRvLiBJZiBub3Qgc2V0LAordGhlIGZpbGUgaXMgd3JpdHRlbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIEphdmFDQyBncmFtbWFyIGZpbGUgYnV0IHdpdGggYSB0aGUgc3VmZml4IC5odG1sIG9yIC50eHQuJm5ic3A7PC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPnRleHQ8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBURVhUIEJORiBkb2N1bWVudGF0aW9uIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW4KK29wdGlvbi48L3RkPgorCis8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1A+b25ldGFibGU8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBPTkVfVEFCTEUgQk5GIGRvY3VtZW50YXRpb24gb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8aDM+CitFeGFtcGxlPC9oMz4KKworPGJsb2NrcXVvdGU+Cis8cHJlPiZsdDtqamRvYyZuYnNwOworJm5ic3A7Jm5ic3A7Jm5ic3A7IHRhcmdldD0ic3JjL1BhcnNlci5qaiImbmJzcDsKKyZuYnNwOyZuYnNwOyZuYnNwOyBvdXRwdXRmaWxlPSJkb2MvUGFyc2VyQk5GLmh0bWwiCismbmJzcDsmbmJzcDsmbmJzcDsgamF2YWNjaG9tZT0iYzovcHJvZ3JhbSBmaWxlcy9KYXZhQ0MiJm5ic3A7CisvJmd0OzwvcHJlPgorPC9ibG9ja3F1b3RlPgorVGhpcyBpbnZva2VzIEpKRG9jIG9uIGdyYW1tYXIgZmlsZSBzcmMvUGFyc2VyLmpqLCB3cml0aW5nIHRoZSBnZW5lcmF0ZWQKK0JORiBkb2N1bWVudGF0aW9uIGZpbGUsIFBhcnNlckJORi5odG1sLCBmaWxlIHRvIGRvYy4KKzxicj4KKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2pqdHJlZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qanRyZWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTAxODZlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qanRyZWUuaHRtbApAQCAtMCwwICsxLDU1NiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+CisgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SkpUcmVlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzxoMj4KKzxhIE5BTUU9ImpqdHJlZSI+PC9hPkpKVHJlZTwvaDI+CisKKzxoMz4KK0Rlc2NyaXB0aW9uPC9oMz4KKzxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhY2MuZGV2LmphdmEubmV0LyI+SkpUcmVlPC9hPiBwcmVwcm9jZXNzb3IKK2ZvciB0aGUgSmF2YUNDIGNvbXBpbGVyIGNvbXBpbGVyLiBJdCBpbnNlcnRzIHBhcnNlIHRyZWUgYnVpbGRpbmcgYWN0aW9ucworYXQgdmFyaW91cyBwbGFjZXMgaW4gdGhlIEphdmFDQyBzb3VyY2UgdGhhdCBpdCBnZW5lcmF0ZXMuIFRoZSBvdXRwdXQgb2YKK0pKVHJlZSBpcyBydW4gdGhyb3VnaCBKYXZhQ0MgdG8gY3JlYXRlIHRoZSBwYXJzZXIuCis8cD5UbyB1c2UgdGhlIGpqdHJlZSB0YXNrLCBzZXQgdGhlIDxpPnRhcmdldDwvaT4gYXR0cmlidXRlIHRvIHRoZSBuYW1lCitvZiB0aGUgSkpUcmVlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeQorY29udGFpbmluZyB0aGUgSmF2YUNDIGluc3RhbGxhdGlvbiB1c2luZyB0aGUgPGk+amF2YWNjaG9tZTwvaT4gYXR0cmlidXRlLAorc28gdGhhdCBhbnQgY2FuIGZpbmQgdGhlIEphdmFDQyBjbGFzc2VzLiBPcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZQorPGk+b3V0cHV0ZGlyZWN0b3J5PC9pPgordG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBKYXZhQ0MgZ3JhbW1hciBhbmQgbm9kZSBmaWxlcyB0byBhIHNwZWNpZmljIGRpcmVjdG9yeS4KK090aGVyd2lzZSBqanRyZWUgd3JpdGVzIHRoZSBnZW5lcmF0ZWQgSmF2YUNDIGdyYW1tYXIgYW5kIG5vZGUgZmlsZXMgdG8gdGhlIGRpcmVjdG9yeQorY29udGFpbmluZyB0aGUgSkpUcmVlIGdyYW1tYXIgZmlsZS4gQXMgYW4gZXh0cmEgb3B0aW9uLCB5b3UgY2FuIGFsc28gc2V0IHRoZQorPGk+b3V0cHV0ZmlsZTwvaT4gdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBKYXZhQ0MgZ3JhbW1hciBmaWxlIHRvIGEgc3BlY2lmaWMgKGRpcmVjdG9yeSBhbmQpIGZpbGUuCitPdGhlcndpc2Ugamp0cmVlIHdyaXRlcyB0aGUgZ2VuZXJhdGVkIEphdmFDQyBncmFtbWFyIGZpbGUgYXMgdGhlIEpKVHJlZQorZ3JhbW1hciBmaWxlIHdpdGggYSBzdWZmaXggLmpqLjwvcD4KKzxwPlRoaXMgdGFzayBvbmx5IGludm9rZXMgSkpUcmVlIGlmIHRoZSBncmFtbWFyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUKK2dlbmVyYXRlZCBKYXZhQ0MgZmlsZS48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKworPHRhYmxlIEJPUkRFUiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTIgPgorPHRyPgorPHRkIFZBTElHTj1UT1A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisKKzx0ZCBWQUxJR049VE9QPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisKKzx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD48Yj5SZXF1aXJlZDwvYj48L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1A+dGFyZ2V0PC90ZD4KKworPHRkIFZBTElHTj1UT1A+VGhlIGpqdHJlZSBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy48L3RkPgorCis8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+WWVzPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPmphdmFjY2hvbWU8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5UaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPlllczwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgVkFMSUdOPVRPUD5vdXRwdXRkaXJlY3Rvcnk8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5UaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgSmF2YUNDIGdyYW1tYXIgYW5kIG5vZGUgZmlsZXMgdG8uCitJZiBub3Qgc2V0LCB0aGUgZmlsZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuJm5ic3A7PC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPm91dHB1dGZpbGU8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5UaGUgZmlsZSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIEphdmFDQyBncmFtbWFyIGZpbGUKK3RvLiBJZiBub3Qgc2V0LCB0aGUgZmlsZSBpcyB3cml0dGVuIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgSkpUcmVlCitncmFtbWFyIGZpbGUgYnV0IHdpdGggYSB0aGUgc3VmZml4IDxjb2RlPi5qajwvY29kZT4uICBUaGlzIGlzIGEKK2ZpbGVuYW1lIHJlbGF0aXZlIHRvIDxlbT5vdXRwdXRkaXJlY3Rvcnk8L2VtPiBpZiBzcGVjaWZpZWQsIHRoZQorcHJvamVjdCdzIGJhc2VkaXIuPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPmJ1aWxkbm9kZWZpbGVzPC90ZD4KKworPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgQlVJTERfTk9ERV9GSUxFUyBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW4KK29wdGlvbi48L3RkPgorCis8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1A+bXVsdGk8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBNVUxUSSBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisKKzx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgVkFMSUdOPVRPUD5ub2RlZGVmYXVsdHZvaWQ8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBOT0RFX0RFRkFVTFRfVk9JRCBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW4KK29wdGlvbi48L3RkPgorCis8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1A+bm9kZWZhY3Rvcnk8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBOT0RFX0ZBQ1RPUlkgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYm9vbGVhbiBvcHRpb24uPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPm5vZGVzY29wZWhvb2s8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBOT0RFX1NDT1BFX0hPT0sgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuCitvcHRpb24uPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPm5vZGV1c2VzcGFyc2VyPC90ZD4KKworPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgTk9ERV9VU0VTX1BBUlNFUiBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW4KK29wdGlvbi48L3RkPgorCis8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1A+c3RhdGljPC90ZD4KKworPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgU1RBVElDIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPnZpc2l0b3I8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBWSVNJVE9SIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPm5vZGVwYWNrYWdlPC90ZD4KKworPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgTk9ERV9QQUNLQUdFIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgc3RyaW5nIG9wdGlvbi48L3RkPgorCis8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1A+dmlzaXRvcmV4Y2VwdGlvbjwvdGQ+CisKKzx0ZCBWQUxJR049VE9QPlNldHMgdGhlIFZJU0lUT1JfRVhDRVBUSU9OIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgc3RyaW5nCitvcHRpb24uPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QPm5vZGVwcmVmaXg8L3RkPgorCis8dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBOT0RFX1BSRUZJWCBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIHN0cmluZyBvcHRpb24uPC90ZD4KKworPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8aDM+CitFeGFtcGxlPC9oMz4KKworPGJsb2NrcXVvdGU+Cis8cHJlPiZsdDtqanRyZWUmbmJzcDsKKyZuYnNwOyZuYnNwOyZuYnNwOyB0YXJnZXQ9InNyYy9QYXJzZXIuamp0IiZuYnNwOworJm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dGRpcmVjdG9yeT0iYnVpbGQvc3JjIgorJm5ic3A7Jm5ic3A7Jm5ic3A7IGphdmFjY2hvbWU9ImM6L3Byb2dyYW0gZmlsZXMvSmF2YUNDIiZuYnNwOworJm5ic3A7Jm5ic3A7Jm5ic3A7IG5vZGV1c2VzcGFyc2VyPSJ0cnVlIgorLyZndDs8L3ByZT4KKzwvYmxvY2txdW90ZT4KK1RoaXMgaW52b2tlcyBKSlRyZWUgb24gZ3JhbW1hciBmaWxlIHNyYy9QYXJzZXIuamp0LCB3cml0aW5nIHRoZSBnZW5lcmF0ZWQKK2dyYW1tYXIgZmlsZSwgUGFyc2VyLmpqLCBmaWxlIHRvIGJ1aWxkL3NyYy4gVGhlIGdyYW1tYXIgb3B0aW9uIE5PREVfVVNFU19QQVJTRVIKK2lzIHNldCB0byB0cnVlIHdoZW4gaW52b2tpbmcgSkpUcmVlLgorPGJyPgorCis8aDM+Q29tcGFyaXNvbiBvdXRwdXQgbG9jYXRpb25zIGJldHdlZW4gY29tbWFuZCBsaW5lIEpKVHJlZSBhbmQgZGlmZmVyZW50IEFudCB0YXNrZGVmIHZlcnNpb25zPC9oMz4KKworPHRhYmxlIGNlbGxwYWRkaW5nPSIzIiBib3JkZXI9IjEiPgorPHRyPgorICA8dGQ+PGI+Q29tbWFuZCBMaW5lIEpKVHJlZSBvcHRpb25zPC9iPgorICAgIDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8aT5hbmQgR2VuZXJhdGVkIEZpbGVzPC9pPiAod29ya2luZyBkaXJlY3Rvcnk6IDxjb2RlPi90bXA8L2NvZGU+KTwvdGQ+CisgIDx0ZD48Yj5BbnQgMS41LjM8L2I+IHZlcnN1cyBjb21tYW5kIGxpbmU8L3RkPgorICA8dGQ+PGI+QW50IDEuNjwvYj4gdmVyc3VzIGNvbW1hbmQgbGluZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIGdyYW1tYXIuamp0PC9iPgorICAgIC90bXAvZ3JhbW1hci5qagorICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+U2FtZTwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9ncmFtbWFyLmpqCisgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD48cHJlPgorL3RtcC9yZWxhdGl2ZS9ncmFtbWFyLmpqCisvdG1wL3JlbGF0aXZlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgorICAgIC90bXAvZ3JhbW1hci5qagorICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+PHByZT4KKy90bXAvYWJzb2x1dGUvZ3JhbW1hci5qagorL3RtcC9hYnNvbHV0ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIGdyYW1tYXIuamp0PC9iPgorICAgIC90bXAvcmVsYXRpdmUvZ3JhbW1hci5qagorICAgIC90bXAvcmVsYXRpdmUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+U2FtZTwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgorICAgIC90bXAvcmVsYXRpdmUvZ3JhbW1hci5qagorICAgIC90bXAvcmVsYXRpdmUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+U2FtZTwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9yZWxhdGl2ZS9ncmFtbWFyLmpqCisgICAgL3RtcC9yZWxhdGl2ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyAgZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqCisgICAgL3RtcC9hYnNvbHV0ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqCisgICAgL3RtcC9hYnNvbHV0ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamoKKyAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpvdXRwdXQuamogIGdyYW1tYXIuamp0PC9iPgorICAgIC90bXAvb3V0cHV0LmpqCisgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqICByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL291dHB1dC5qagorICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL291dHB1dC5qagorICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIGdyYW1tYXIuamp0PC9iPgorICAgIC90bXAvcmVsYXRpdmUvb3V0cHV0LmpqCisgICAgL3RtcC9yZWxhdGl2ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9yZWxhdGl2ZS9vdXRwdXQuamoKKyAgICAvdG1wL3JlbGF0aXZlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpvdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgorICAgIC90bXAvcmVsYXRpdmUvb3V0cHV0LmpqCisgICAgL3RtcC9yZWxhdGl2ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyAgZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9hYnNvbHV0ZS9vdXRwdXQuamoKKyAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpvdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvICByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL2Fic29sdXRlL291dHB1dC5qagorICAgIC90bXAvYWJzb2x1dGUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9hYnNvbHV0ZS9vdXRwdXQuamoKKyAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqICBncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL3N1YmRpci9vdXRwdXQuamoKKyAgICAvdG1wLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqICByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL3N1YmRpci9vdXRwdXQuamoKKyAgICAvdG1wLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgorICAgIC90bXAvc3ViZGlyL291dHB1dC5qagorICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlICBncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL3JlbGF0aXZlL3N1YmRpci9vdXRwdXQuamoKKyAgICAvdG1wL3JlbGF0aXZlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9yZWxhdGl2ZS9zdWJkaXIvb3V0cHV0LmpqCisgICAgL3RtcC9yZWxhdGl2ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6c3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9yZWxhdGl2ZS9zdWJkaXIvb3V0cHV0LmpqCisgICAgL3RtcC9yZWxhdGl2ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6c3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gIGdyYW1tYXIuamp0PC9iPgorICAgIC90bXAvYWJzb2x1dGUvc3ViZGlyL291dHB1dC5qagorICAgIC90bXAvYWJzb2x1dGUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvICByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL2Fic29sdXRlL3N1YmRpci9vdXRwdXQuamoKKyAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL2Fic29sdXRlL3N1YmRpci9vdXRwdXQuamoKKyAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTovdG1wL3N1YmRpci9vdXRwdXQuamogIGdyYW1tYXIuamp0PC9iPgorICAgIC90bXAvc3ViZGlyL291dHB1dC5qagorICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9zdWJkaXIvb3V0cHV0LmpqCisgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6L3RtcC9zdWJkaXIvb3V0cHV0LmpqICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgorICAgIC90bXAvc3ViZGlyL291dHB1dC5qagorICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOjxpPjx1PkQ6PC91PjwvaT4vdG1wL3N1YmRpci9vdXRwdXQuamogIGdyYW1tYXIuamp0PC9iPgorICAgIC90bXAvc3ViZGlyL291dHB1dC5qagorICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkICopPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOjxpPjx1PkQ6PC91PjwvaT4vdG1wL3N1YmRpci9vdXRwdXQuamogIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgorICAgIC90bXAvc3ViZGlyL291dHB1dC5qagorICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkICopPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOjxpPjx1PkQ6PC91PjwvaT4vdG1wL3N1YmRpci9vdXRwdXQuamogIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9zdWJkaXIvb3V0cHV0LmpqCisgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQgKik8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6L3RtcC9zdWJkaXIvb3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAgZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9yZWxhdGl2ZS90bXAvc3ViZGlyL291dHB1dC5qagorICAgIC90bXAvcmVsYXRpdmUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgorICAgIC90bXAvcmVsYXRpdmUvdG1wL3N1YmRpci9vdXRwdXQuamoKKyAgICAvdG1wL3JlbGF0aXZlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTovdG1wL3N1YmRpci9vdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgorICAgIC90bXAvcmVsYXRpdmUvdG1wL3N1YmRpci9vdXRwdXQuamoKKyAgICAvdG1wL3JlbGF0aXZlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KKyAgPC90ZD4KKyAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgorICA8dGQ+U2FtZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTovdG1wL3N1YmRpci9vdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvICBncmFtbWFyLmpqdDwvYj4KKyAgICAvdG1wL2Fic29sdXRlL3RtcC9zdWJkaXIvb3V0cHV0LmpqCisgICAgL3RtcC9hYnNvbHV0ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CisgIDwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPC90ZD4KKyAgPHRkPlNhbWU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6L3RtcC9zdWJkaXIvb3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9hYnNvbHV0ZS90bXAvc3ViZGlyL291dHB1dC5qagorICAgIC90bXAvYWJzb2x1dGUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgICAgL3RtcC9hYnNvbHV0ZS90bXAvc3ViZGlyL291dHB1dC5qagorICAgIC90bXAvYWJzb2x1dGUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgorICA8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CisgIDx0ZD5TYW1lPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8cD4qKSA8dT5Gb290bm90ZTwvdT46IFdoZW4gcnVubmluZyBKSlRyZWUgd2l0aCB0aGUgQW50IHRhc2tkZWYgPGk+amp0cmVlPC9pPiB0aGUgb3B0aW9uIDxjb2RlPi1PVVRQVVRfRElSRUNUT1JZPC9jb2RlPiBtdXN0IGFsd2F5cyAKK2JlIHNldCwgYmVjYXVzZSB0aGUgcHJvamVjdCdzIGJhc2VkaXIgYW5kIHRoZSBhbnQgd29ya2luZyBkaXJlY3RvcnkgbWlnaHQgZGlmZmVyLiBTbyBldmVuIGlmIHlvdSBkb24ndCBzcGVjaWZ5IHRoZSBqanRyZWUgdGFza2RlZiAKKzxpPm91dHB1dGRpcmVjdG9yeTwvaT4gSkpUcmVlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIDxjb2RlPi1PVVRQVVRfRElSRUNUT1JZPC9jb2RlPiBzZXQgdG8gdGhlIHByb2plY3QncyBiYXNlZGlyZWN0b3J5LiAKK0J1dCB3aGVuIHRoZSA8Y29kZT4tT1VUUFVUX0RJUkVDVE9SWTwvY29kZT4gaXMgc2V0LCB0aGUgPGNvZGU+LU9VVFBVVF9GSUxFPC9jb2RlPiBzZXR0aW5nIGlzIGhhbmRsZWQgYXMgaWYgcmVsYXRpdmUgdG8gdGhpcyAKKzxjb2RlPi1PVVRQVVRfRElSRUNUT1JZPC9jb2RlPi4gVGh1cyB3aGVuIHRoZSA8Y29kZT4tT1VUUFVUX0ZJTEU8L2NvZGU+IGlzIGFic29sdXRlIG9yIGNvbnRhaW5zIGEgZHJpdmUgbGV0dGVyIHdlIGhhdmUgYSAKK3Byb2JsZW0uIAorVGhlcmVmb3JlIGFic29sdXRlIDxpPm91dHB1dGZpbGU8L2k+cyAod2hlbiB0aGUgPGk+b3V0cHV0ZGlyZWN0b3J5PC9pPiBpc24ndCBzcGVjaWZpZWQpIGFyZSBtYWRlIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IGRpcmVjdG9yeS4KK0FuZCBmb3IgdGhpcyByZWFzb24gPGk+b3V0cHV0ZmlsZTwvaT5zIHRoYXQgY29udGFpbiBhIGRyaXZlIGxldHRlciBjYW4ndCBiZSBzdXBwb3J0ZWQuPC9wPgorCis8cD5CeSB0aGUgd2F5OiBzcGVjaWZ5aW5nIGEgZHJpdmUgbGV0dGVyIGluIHRoZSA8Y29kZT4tT1VUUFVUX0ZJTEU8L2NvZGU+IHdoZW4gdGhlIDxjb2RlPi1PVVRQVVRfRElSRUNUT1JZPC9jb2RlPiBpcyBzZXQsIGFsc28gCityZXN1bHRzIGluIHN0cmFuZ2UgYmVoYXZpb3Igd2hlbiBydW5uaW5nIEpKVHJlZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuPC9wPgorCis8YnI+CisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qbGluay5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qbGluay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YmQyNDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2psaW5rLmh0bWwKQEAgLTAsMCArMSwxNzcgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkpMaW5rIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzxoMj48YSBuYW1lPSJqbGluayI+Smxpbms8L2E+PC9oMj4KKzxoMz48aT5EZXByZWNhdGVkPC9pPjwvaDM+Cis8cD48aT5UaGlzIHRhc2sgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIGEgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3ppcGZpbGVzZXQuaHRtbCI+emlwZmlsZXNldDwvYT4KKyBvciA8YSBocmVmPSIuLi9Db3JlVGFza3MvemlwLmh0bWwjemlwZ3JvdXBmaWxlc2V0Ij56aXBncm91cGZpbGVzZXQ8L2E+IHdpdGggdGhlCisgPGEgaHJlZj0iLi4vQ29yZVRhc2tzL2phci5odG1sIj5KYXIgdGFzazwvYT4gb3IgPGEgaHJlZj0iLi4vQ29yZVRhc2tzL3ppcC5odG1sIj5aaXAgdGFzazwvYT4KKyBpbnN0ZWFkLjwvaT48L3A+CisKKzxoMz48Yj5EZXNjcmlwdGlvbjo8L2I+PC9oMz4KKzxwPkxpbmtzIGVudHJpZXMgZnJvbSBzdWItYnVpbGRzIGFuZCBsaWJyYXJpZXMuPC9wPgorCis8cD5UaGUgamxpbmsgdGFzayBjYW4gYmUgdXNlZCB0byBidWlsZCBqYXIgYW5kIHppcCBmaWxlcywgc2ltaWxhciB0byAKK3RoZSA8aT5qYXI8L2k+IHRhc2suCitIb3dldmVyLCBqbGluayBwcm92aWRlcyBvcHRpb25zIGZvciBjb250cm9sbGluZyB0aGUgd2F5IGVudHJpZXMgZnJvbSAKK2lucHV0IGZpbGVzCithcmUgYWRkZWQgdG8gdGhlIG91dHB1dCBmaWxlLiBTcGVjaWZpY2FsbHksIGNhcGFiaWxpdGllcyBmb3IgbWVyZ2luZyAKK2VudHJpZXMgZnJvbQorbXVsdGlwbGUgemlwIG9yIGphciBmaWxlcyBpcyBhdmFpbGFibGUuPC9wPgorCis8cD5JZiBhIG1lcmdlZmlsZSBpcyBzcGVjaWZpZWQgZGlyZWN0bHkgKGVnLiBhdCB0aGUgdG9wIGxldmVsIG9mIGEgCis8aT5tZXJnZWZpbGVzPC9pPgorcGF0aGVsZW1lbnQpIDxpPmFuZDwvaT4gdGhlIG1lcmdlZmlsZSBlbmRzIGluICZxdW90Oy56aXAmcXVvdDsgb3IgCismcXVvdDsuamFyJnF1b3Q7LAorZW50cmllcyBpbiB0aGUgbWVyZ2VmaWxlIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIG91dGZpbGUuIEEgZmlsZSB3aXRoIAorYW55IG90aGVyIGV4dGVuc2lvbgord2lsbCBiZSBhZGRlZCB0byB0aGUgb3V0cHV0IGZpbGUsIGV2ZW4gaWYgaXQgaXMgc3BlY2lmaWVkIGluIHRoZSAKK21lcmdlZmlsZXMgZWxlbWVudC4KK0RpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiBlaXRoZXIgdGhlIG1lcmdlZmlsZXMgb3IgYWRkZmlsZXMgZWxlbWVudCAKK2FyZSBhZGRlZCB0byB0aGUKK291dHB1dCBmaWxlIGFzIHlvdSB3b3VsZCBleHBlY3Q6IGFsbCBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcyBhcmUgCityZWN1cnNpdmVseSBhZGRlZCB0bwordGhlIG91dHB1dCBmaWxlIHdpdGggYXBwcm9wcmlhdGUgcHJlZml4ZXMgaW4gdGhlIG91dHB1dCBmaWxlIAorKHdpdGhvdXQgbWVyZ2luZykuCis8L3A+CisKKzxwPgorSW4gdGhlIGNhc2Ugd2hlcmUgZHVwbGljYXRlIGVudHJpZXMgYW5kL29yIGZpbGVzIGFyZSBmb3VuZCBhbW9uZyB0aGUgCitmaWxlcyB0byBiZSBtZXJnZWQgb3IKK2FkZGVkLCBqbGluayBtZXJnZXMgb3IgYWRkcyB0aGUgZmlyc3QgZW50cnkgYW5kIGlnbm9yZXMgYWxsIHN1YnNlcXVlbnQgZW50cmllcy4KKzwvcD4KKworPHA+CitqbGluayBpZ25vcmVzIE1FVEEtSU5GIGRpcmVjdG9yaWVzIGluIG1lcmdlZmlsZXMuIFVzZXJzIHNob3VsZCBzdXBwbHkgdGhlaXIKK293biBtYW5pZmVzdCBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBmaWxlLgorPC9wPgorCis8cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBqbGlua2VkLiAKK1RoaXMgY2FuIGJlCitkb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCAKKzxpPmV4Y2x1ZGVzZmlsZTwvaT4sCithbmQgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGVzIG9uIHRoZSA8aT5hZGRmaWxlczwvaT4gYW5kIAorPGk+bWVyZ2VmaWxlczwvaT4KK25lc3RlZCBlbGVtZW50cy4gV2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+IG9yIDxpPmluY2x1ZGVzZmlsZTwvaT4KK2F0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4KK1RoZSA8aT5leGNsdWRlPC9pPiBvciA8aT5leGNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKK3RoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKK2ZpbmFsbHkgd2l0aCB0aGUgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQord2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uIDxhCitocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUKK2luY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuIFRoZSBwYXR0ZXJucyBhcmUKK3JlbGF0aXZlIHRvIHRoZSA8aT5iYXNlPC9pPiBkaXJlY3RvcnkuPC9wPgorCisKKworPGgzPlBhcmFtZXRlcnM6PC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICA8dHI+CisgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRmaWxlPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcGF0aCBvZiB0aGUgb3V0cHV0IGZpbGUuPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5jb21wcmVzczwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciBvciBub3QgdGhlIG91dHB1dCBzaG91bGQgYmUgY29tcHJlc3NlZC4gCis8aT50cnVlPC9pPiwKKyAgICAgICAgICAgICAgICAgICAgICA8aT55ZXM8L2k+LCBvciA8aT5vbjwvaT4gcmVzdWx0IGluIGNvbXByZXNzZWQgb3V0cHV0LgorICAgICAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIG91dHB1dCB3aWxsIGJlIHVuY29tcHJlc3NlZCAoaW5mbGF0ZWQpLjwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5tZXJnZWZpbGVzPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlcyB0byBiZSBtZXJnZWQgaW50byB0aGUgb3V0cHV0LCBpZiBwb3NzaWJsZS48L3RkPgorICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkF0IGxlYXN0IG9uZSBvZiAKK21lcmdlZmlsZXMgb3IgYWRkZmlsZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5hZGRmaWxlczwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIG91dHB1dC48L3RkPgorICAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPlRoZSBmb2xsb3dpbmcgd2lsbCBtZXJnZSB0aGUgZW50cmllcyBpbiBtZXJnZWZvby5qYXIgYW5kIG1lcmdlYmFyLmphciAKK2ludG8gb3V0Lmphci4KK21hYy5qYXIgYW5kIHBjLmphciB3aWxsIGJlIGFkZGVkIGFzIHNpbmdsZSBlbnRyaWVzIHRvIG91dC5qYXIuPC9wPgorPHByZT4KKyZsdDtqbGluayBjb21wcmVzcz0mcXVvdDtmYWxzZSZxdW90OyBvdXRmaWxlPSZxdW90O291dC5qYXImcXVvdDsmZ3Q7CisgICAmbHQ7bWVyZ2VmaWxlcyZndDsKKyAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtidWlsZC5kaXJ9L21lcmdlZm9vLmphciZxdW90Oy8mZ3Q7CisgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7YnVpbGQuZGlyfS9tZXJnZWJhci5qYXImcXVvdDsvJmd0OworICAgJmx0Oy9tZXJnZWZpbGVzJmd0OworICAgJmx0O2FkZGZpbGVzJmd0OworICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2J1aWxkLmRpcn0vbWFjLmphciZxdW90Oy8mZ3Q7CisgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7YnVpbGQuZGlyfS9wYy56aXAmcXVvdDsvJmd0OworICAgJmx0Oy9hZGRmaWxlcyZndDsKKyZsdDsvamxpbmsmZ3Q7Cis8L3ByZT4KKworPHA+PGI+Tm9uLWRlcHJlY2F0ZWQgYWx0ZXJuYXRpdmUgdG8gdGhlIGFib3ZlOjwvYj48L3A+Cis8cHJlPgorJmx0O2phciBjb21wcmVzcz0mcXVvdDtmYWxzZSZxdW90OyBkZXN0ZmlsZT0mcXVvdDtvdXQuamFyJnF1b3Q7Jmd0OworICAmbHQ7emlwZ3JvdXBmaWxlc2V0IGRpcj0mcXVvdDske2J1aWxkLmRpcn0mcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDttZXJnZWZvby5qYXImcXVvdDsvJmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7bWVyZ2ViYXIuamFyJnF1b3Q7LyZndDsKKyAgJmx0Oy96aXBncm91cGZpbGVzZXQmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2J1aWxkLmRpcn0mcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDttYWMuamFyJnF1b3Q7LyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O3BjLmphciZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsZXNldCZndDsKKyZsdDsvamFyJmd0OworPC9wcmU+CisKKzxwPlN1cHBvc2UgdGhlIGZpbGUgZm9vLmphciBjb250YWlucyB0d28gZW50cmllczogYmFyLmNsYXNzIGFuZCAKK2Jhcm5vbmUvbXlDbGFzcy56aXAuCitTdXBwb3NlIHRoZSBwYXRoIGZvciBmaWxlIGZvby5qYXIgaXMgYnVpbGQvdGVtcGJ1aWxkL2Zvby5qYXIuIFRoZSAKK2ZvbGxvd2luZyBleGFtcGxlCit3aWxsIHByb3ZpZGUgdGhlIGVudHJ5IHRlbXBidWlsZC9mb28uamFyIGluIHRoZSBvdXQuamFyLjwvcD4KKzxwcmU+CismbHQ7amxpbmsgY29tcHJlc3M9JnF1b3Q7ZmFsc2UmcXVvdDsgb3V0ZmlsZT0mcXVvdDtvdXQuamFyJnF1b3Q7Jmd0OworICAgJmx0O21lcmdlZmlsZXMmZ3Q7CisgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90O2J1aWxkL3RlbXBidWlsZCZxdW90Oy8mZ3Q7CisgICAmbHQ7L21lcmdlZmlsZXMmZ3Q7CismbHQ7L2psaW5rJmd0OworPC9wcmU+CisKKzxwPkhvd2V2ZXIsIHRoZSBuZXh0IGV4YW1wbGUgd291bGQgcmVzdWx0IGluIHR3byB0b3AtbGV2ZWwgZW50cmllcyBpbiBvdXQuamFyLAorbmFtZWx5IGJhci5jbGFzcyBhbmQgYmFybm9uZS9teUNsYXNzLnppcDwvcD4KKzxwcmU+CismbHQ7amxpbmsgY29tcHJlc3M9JnF1b3Q7ZmFsc2UmcXVvdDsgb3V0ZmlsZT0mcXVvdDtvdXQuamFyJnF1b3Q7Jmd0OworICAgJmx0O21lcmdlZmlsZXMmZ3Q7CisgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90O2J1aWxkL3RlbXBidWlsZC9mb28uamFyJnF1b3Q7LyZndDsKKyAgICZsdDsvbWVyZ2VmaWxlcyZndDsKKyZsdDsvamxpbmsmZ3Q7Cis8L3ByZT4KKworCis8L2JvZHk+CisKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvanNoYXJwYy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qc2hhcnBjLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2ZTQyZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvanNoYXJwYy5odG1sCkBAIC0wLDAgKzEsNDM0IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgCis8aHRtbD4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDx0aXRsZT5Kc2hhcnBjCisgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiM1MjVENzYiCisgICAgICBhbGluaz0iIzUyNUQ3NiIgdmxpbms9IiM1MjVENzYiPgorCis8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjQiPgorCisgIDwhLS0gUEFHRSBIRUFERVIgLS0+CisgIDx0cj4KKyAgICA8dGQ+CisgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICA8Zm9udCBzaXplPSIrMyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48c3Ryb25nPkpzaGFycGMKKyBUYXNrPC9zdHJvbmc+PC9mb250PgorICAgICAgICAgICAgPGJyPjxmb250IGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Q29tcGlsZSBKIyBzb3VyY2UgZG93biB0byBhIG1hbmFnZWQgLk5FVCBhcHBsaWNhdGlvbi4gPHA+Rm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGUgcGF0dGVybiA8Y29kZT4qKi8qLmphdmE8L2NvZGU+IGlzIHByZXNldCBhcyBpbmNsdWRlcyBsaXN0IGFuZCB5b3UgY2FuIG5vdCBvdmVycmlkZSBpdCB3aXRoIGFuIGV4cGxpY2l0IGluY2x1ZGVzIGF0dHJpYnV0ZS4gIFVzZSBuZXN0ZWQgPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IGVsZW1lbnRzIGluc3RlYWQgb2YgdGhlIGJhc2VkaXIgYXR0cmlidXRlIGlmIHlvdSBuZWVkIG1vcmUgY29udHJvbC48L3A+PC9mb250PgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgPCEtLSBQUk9KRUNUIExPR08gLS0+CisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj4KKyAgICAgICAgICAgICAgPGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiIGFsaWduPSJyaWdodCIgYWx0PSJBcGFjaGUgQW50IiBib3JkZXI9IjAiPgorICAgICAgICAgICAgPC9hPgorICAgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPjwvdGFibGU+CisgICAgPC90ZD4KKyAgPC90cj4KKworICA8IS0tIFNUQVJUIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorICA8dHI+CisgICAgPHRkICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorCisgICAgICAgICAgPCEtLSBBcHBseWluZyB0YXNrL2xvbmctZGVzY3JpcHRpb24gLS0+CisgICAgPCEtLSBTdGFydCBEZXNjcmlwdGlvbiAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJkZXNjcmlwdGlvbiI+CisgICAgICAgICAgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIENvbXBpbGUgSiMgc291cmNlIGRvd24gdG8gYSBtYW5hZ2VkIC5ORVQgYXBwbGljYXRpb24uIDxwPiBKIyBpcyBub3QgSmF2YS4gQnV0IGl0IGlzIHRoZSBsYW5ndWFnZSBjbG9zZXN0IHRvIEphdmEgaW4gdGhlIC5ORVQgZnJhbWV3b3JrLiBUaGlzIHRhc2sgY29tcGlsZXMganNoYXJwIHNvdXJjZSAoLmphdmEgZmlsZXMpLCBhbmQgZ2VuZXJhdGVzIGEgLk5FVCBtYW5hZ2VkIGV4ZSBvciBkbGwuIDxwPgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRGVzY3JpcHRpb24gLS0+CisKKyAgICA8IS0tIFN0YXJ0IEF0dHJpYnV0ZXMgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImF0dHJpYnV0ZXMiPgorICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVyczwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+QXR0cmlidXRlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlR5cGU8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+UmVxdWlyZW1lbnQ8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAorICAgIAorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+YWRkaXRpb25hbG1vZHVsZXMgLSBub3RlIHRoYXQgeW91ciB2ZXJzaW9uIG9mIHZqYyBtYXkgbm90IHN1cHBvcnQgdGhpcyBvcHRpb24uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZXMgdG8gcmVmZXIgdG8uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiByb3dzcGFuPSIyMSI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPk9wdGlvbmFsPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+YmFzZWFkZHJlc3M8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5kZWJ1ZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNldCB0aGUgZGVidWcgZmxhZyBvbiBvciBvZmYuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmRlc3RkaXI8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiBmaWxlcyB0byBiZSBjb21waWxlZC48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZGVzdGZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXQgdGhlIG5hbWUgb2YgZXhlL2xpYnJhcnkgdG8gY3JlYXRlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5leGVjdXRhYmxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtLCBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cy4gQ2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBmdWxsIHBhdGggdG8gYSBwcm9ncmFtLCBvciB0byBzd2l0Y2ggdG8gYW4gYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kLCBzdWNoIGFzIHRoZSBNb25vIG9yIFJvdG9yIHZlcnNpb25zIC1wcm92aWRlZCB0aGV5IHVzZSB0aGUgc2FtZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFzIHRoZSAuTkVUIGZyYW1ld29yayBlZGl0aW9uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZXh0cmFvcHRpb25zPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+QW55IGV4dHJhIG9wdGlvbnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IHN1cHBvcnRlZCBieSB0aGlzIHRhc2suPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZmFpbG9uZXJyb3I8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5JZiB0cnVlLCBmYWlsIG9uIGNvbXBpbGF0aW9uIGVycm9ycy48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+aW5jbHVkZWRlZmF1bHRyZWZlcmVuY2VzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+SWYgdHJ1ZSwgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgY29tbW9uIGFzc2VtYmxpZXMgaW4gZG90bmV0LCBhbmQgdGVsbHMgdGhlIGNvbXBpbGVyIHRvIGxpbmsgaW4gbXNjb3JlLmRsbC4gc2V0IHRoZSBhdXRvbWF0aWMgcmVmZXJlbmNlIGluY2x1c2lvbiBmbGFnIG9uIG9yIG9mZiB0aGlzIGZsYWcgY29udHJvbHMgdGhlIC9ub3N0ZGxpYiBvcHRpb24gaW4gQ1NDPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm1haW5jbGFzczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldHMgdGhlIG5hbWUgb2YgbWFpbiBjbGFzcyBmb3IgZXhlY3V0YWJsZXMuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+b3B0aW1pemU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5JZiB0cnVlLCBlbmFibGVzIG9wdGltaXphdGlvbiBmbGFnLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5wdXJlamF2YTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmRvIHdlIHdhbnQgcHVyZSBqYXZhIChkZWZhdWx0LCB0cnVlKSBvciBjb3JydXB0ZWQgSiM/PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnJlZmVyZW5jZWZpbGVzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+UGF0aCBvZiByZWZlcmVuY2VzIHRvIGluY2x1ZGUuIFdpbGRjYXJkcyBzaG91bGQgd29yay48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5QYXRoPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+cmVmZXJlbmNlczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBETExzIHRvIHJlZmVyIHRvLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNlY3VyZXNjb3Bpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5NYWtlIHBhY2thZ2Ugc2NvcGVkIGNvZGUgdmlzaWJsZSB0byB0aGUgY3VycmVudCBhc3NlbWJseSBvbmx5IChkZWZhdWx0OiBmYWxzZSkgLk5FVCBkb2VzIG5vdCBoYXZlIHBhY2thZ2Ugc2NvcGluZy4gSW5zdGVhZCBpdCBoYXMgYXNzZW1ibHksIHByaXZhdGUgYW5kIHB1YmxpYy4gQnkgZGVmYXVsdCwgcGFja2FnZSBjb250ZW50IGlzIHB1YmxpYyB0byBhbGwuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNyY2RpcjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldCB0aGUgc291cmNlIGRpcmVjdG9yeSBvZiB0aGUgZmlsZXMgdG8gYmUgY29tcGlsZWQuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnRhcmdldHR5cGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zZXQgdGhlIHRhcmdldCB0eXBlIHRvIG9uZSBvZiBleGV8bGlicmFyeXxtb2R1bGV8d2luZXhlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ImV4ZSIsICJsaWJyYXJ5IiwgIm1vZHVsZSIsICJ3aW5leGUiPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+dXRmOG91dHB1dDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPklmIHRydWUsIHJlcXVpcmUgYWxsIGNvbXBpbGVyIG91dHB1dCB0byBiZSBpbiBVVEY4IGZvcm1hdC48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+d2FybmxldmVsPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+TGV2ZWwgb2Ygd2FybmluZyBjdXJyZW50bHkgYmV0d2VlbiAxIGFuZCA0IHdpdGggNCBiZWluZyB0aGUgc3RyaWN0ZXN0LjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmludDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPndpbjMyaWNvbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldCB0aGUgZmlsZW5hbWUgb2YgaWNvbiB0byBpbmNsdWRlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj53aW4zMnJlczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldHMgdGhlIGZpbGVuYW1lIG9mIGEgd2luMzIgcmVzb3VyY2UgKC5SRVMpIGZpbGUgdG8gaW5jbHVkZS4gVGhpcyBpcyBub3QgYSAuTkVUIHJlc291cmNlLCBidXQgd2hhdCBXaW5kb3dzIGlzIHVzZWQgdG8uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorCisKKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEF0dHJpYnV0ZXMgLS0+CisKKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnRzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImVsZW1lbnRzIj4KKyAgICAgICAgICA8c3Ryb25nPlBhcmFtZXRlcnMgYXMgbmVzdGVkIGVsZW1lbnRzPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnQgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzgyOERBNiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiIHNpemU9Ii0xIj4KKyAgICAgICAgICA8c3Ryb25nPmRlZmluZTwvc3Ryb25nPiAob3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0LkRvdG5ldERlZmluZSk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBhZGQgYSBkZWZpbmUgdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+cmVmZXJlbmNlPC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0KTwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIGFkZCBhIG5ldyByZWZlcmVuY2UgZmlsZXNldCB0byB0aGUgY29tcGlsYXRpb24KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+cmVzb3VyY2U8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5Eb3RuZXRSZXNvdXJjZSk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBsaW5rIG9yIGVtYmVkIGEgcmVzb3VyY2UKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+c3JjPC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0KTwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIGFkZCBhIG5ldyBzb3VyY2UgZGlyZWN0b3J5IHRvIHRoZSBjb21waWxlCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KKworICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudHMgLS0+CisKKworICAgIDwvdGQ+CisgIDwvdHI+CisgIDwhLS0gRU5EIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorCis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2pzcGMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvanNwYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMzQyOGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2pzcGMuaHRtbApAQCAtMCwwICsxLDMwOCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5KU1BDIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImpzcGMiPmpzcGMgKGRlcHJlY2F0ZWQpPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorCis8cD4gQW50IHRhc2sgdG8gcnVuIHRoZSBKU1AgY29tcGlsZXIgYW5kIHR1cm4gSlNQIHBhZ2VzIGludG8gSmF2YSBzb3VyY2UuCisKKzxwPjxiPkRlcHJlY2F0ZWQ8L2I+IGlmIHlvdSB1c2UgdGhpcyB0YXNrIHdpdGggVG9tY2F0J3MgSmFzcGVyIEpTUAorY29tcGlsZXIsIHlvdSBzaG91bGQgc2VyaW91c2x5IGNvbnNpZGVyIHVzaW5nIHRoZSB0YXNrIHNoaXBwaW5nIHdpdGgKK1RvbWNhdCBpbnN0ZWFkLiAgVGhpcyB0YXNrIGlzIG9ubHkgdGVzdGVkIGFnYWluc3QgVG9tY2F0IDQueC4gVGhlcmUKK2FyZSBrbm93biBwcm9ibGVtcyB3aXRoIFRvbWNhdCA1LnggdGhhdCB3b24ndCBnZXQgZml4ZWQgaW4gQW50LCBwbGVhc2UKK3VzZSBUb21jYXQncyBqc3BjIHRhc2sgaW5zdGVhZC48YnIvPgorSW5zdGVhZCBvZiByZWx5aW5nIG9uIGNvbnRhaW5lciBzcGVjaWZpYyBKU1AtY29tcGlsZXJzIHdlIHN1Z2dlc3QgZGVwbG95aW5nIAordGhlIHJhdyBmaWxlcyAoKi5qc3ApIGFuZCB1c2UgdGhlIGNvbnRhaW5lciBidWlsZC1pbiBmdW5jdGlvbnM6IGFmdGVyIGRlcGxveWluZyBydW4KK2EgdGVzdCBzdWl0ZSAoZS5nLiB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY2FjdHVzLyI+Q2FjdHVzPC9hPiBvciAKKzxhIGhyZWY9Imh0dHA6Ly9odHRwdW5pdC5zb3VyY2Vmb3JnZS5uZXQvIj5IdHRwVW5pdDwvYT4pIGFnYWluc3QgdGhlIGRlcGxveWVkIHdlYiAKK2FwcGxpY2F0aW9uLiBTbyB5b3UnbGwgZ2V0IHRoZSB0ZXN0IHJlc3VsdCA8aT5hbmQ8L2k+IHRoZSBjb21waWxlZCBKU1BzLgorPC9wPgorCis8cD4KKworVGhpcyB0YXNrIGNhbiBiZSB1c2VkIHRvIHByZWNvbXBpbGUgSlNQIHBhZ2VzIGZvciBmYXN0IGluaXRpYWwgaW52b2NhdGlvbgorb2YgSlNQIHBhZ2VzLCBkZXBsb3ltZW50IG9uIGEgc2VydmVyIHdpdGhvdXQgdGhlIGZ1bGwgSkRLIGluc3RhbGxlZCwKK29yIHNpbXBseSB0byBzeW50YXggY2hlY2sgdGhlIHBhZ2VzIHdpdGhvdXQgZGVwbG95aW5nIHRoZW0uCitJbiBtb3N0IGNhc2VzLCBhIGphdmFjIHRhc2sgaXMgdXN1YWxseSB0aGUgbmV4dCBzdGFnZSBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4KK1RoZSB0YXNrIGRvZXMgYmFzaWMgZGVwZW5kZW5jeSBjaGVja2luZyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlY29tcGlsYXRpb24gLXRoaXMKK2NoZWNraW5nIGNvbXBhcmVzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdGltZXN0YW1wcywgYW5kIGRvZXMgbm90IGZhY3RvcgoraW4gY2xhc3Mgb3IgdGFnbGliIGRlcGVuZGVuY2llcywgb3IgPGNvZGU+Jmx0O2pzcDppbmNsdWRlJmd0OzwvY29kZT4gcmVmZXJlbmNlcy4KKworPHA+CitCeSBkZWZhdWx0IHRoZSB0YXNrIHVzZXMgdGhlIEphc3BlciBKU1AgY29tcGlsZXIuIFRoaXMKK21lYW5zIHRoZSB0YXNrIG5lZWRzIGphc3Blci5qYXIgYW5kIGphc3Blci1ydW50aW1lLmphciwgd2hpY2ggY29tZSB3aXRoCitidWlsZHMgb2YgVG9tY2F0IDQvQ2F0YWxpbmEgZnJvbSB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0LyI+SmFrYXJ0YSBUb21jYXQgcHJvamVjdDwvYT4sCithbmQgYW55IG90aGVyIEphciBmaWxlcyB3aGljaCBtYXkgYmUgbmVlZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyAoaXQgY2hhbmdlcykKKworV2UgcmVjb21tZW5kIChpbiBNYXJjaCAyMDAzKSBUb21jYXQgdmVyc2lvbiA0LjEueCBmb3IgdGhlIG1vc3Qgcm9idXN0IHZlcnNpb24KK29mIEphc3Blci4KKworPHA+CitUaGVyZSBhcmUgbWFueSBsaW1pdGF0aW9ucyB3aXRoIHRoaXMgdGFzayB3aGljaCBwYXJ0aWFsbHkgc3RlbSBmcm9tIHRoZQorbWFueSB2ZXJzaW9ucyBvZiBKYXNwZXIsIG90aGVycyBmcm9tIGltcGxlbWVudGF0aW9uICdpc3N1ZXMnIGluIHRoZSB0YXNrCisoaS5lLiBub2JvZHkncyB3aWxsaW5nbmVzcyB0byByYWRpY2FsbHkgY2hhbmdlIGxhcmdlIGJpdHMgb2YgaXQgdG8gd29yaworYXJvdW5kIGphc3BlcikuIEJlY2F1c2Ugb2YgdGhpcyBhbmQgdGhlIGZhY3QgdGhhdCBKU1AgcGFnZXMgZG8gbm90IGhhdmUKK3RvIGJlIHBvcnRhYmxlIGFjcm9zcyBpbXBsZW1lbnRhdGlvbnMgLW9yIHZlcnNpb25zIG9mIGltcGxlbWVudGF0aW9ucy0KK3RoaXMgdGFzayBpcyBiZXR0ZXIgdXNlZCBmb3IgdmFsaWRhdGluZyBKU1AgcGFnZXMgYmVmb3JlIGRlcGxveW1lbnQsCityYXRoZXIgdGhhbiBwcmVjb21waWxpbmcgdGhlbS4gRm9yIHRoYXQsIGp1c3QgZGVwbG95IGFuZCBydW4geW91ciBodHRwdW5pdAoranVuaXQgdGVzdHMgYWZ0ZXIgZGVwbG95bWVudCB0byBjb21waWxlIGFuZCB0ZXN0IHlvdXIgcGFnZXMsIGFsbCBpbiBvbmUKK2dvLgorIAorPC9wPgorCisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KK1RoZSBUYXNrIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PHA+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hlcmUgdG8gcGxhY2UgdGhlIGdlbmVyYXRlZCBmaWxlcy4gVGhleSBhcmUgbG9jYXRlZAorICAgIHVuZGVyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2RpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGVyZSB0byBsb29rIGZvciBzb3VyY2UganNwIGZpbGVzLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2ZXJib3NpdHkgaW50ZWdlciB0byBwYXNzIHRvIHRoZSBjb21waWxlci4gRGVmYXVsdD0iMCI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYWNrYWdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2UgZm9yIGdlbmVyYXRlZCBqYXZhCisgICAgY2xhc3Nlcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzcyBuYW1lIG9mIGEgSlNQIGNvbXBpbGVyIGFkYXB0ZXIsCisgICAgc3VjaCBhcyAiamFzcGVyIiBvciAiamFzcGVyNDEiPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC1kZWZhdWx0cyB0byAiamFzcGVyIjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmllcGx1Z2luPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkphdmEgUGx1Z2luIGNsYXNzaWQgZm9yIEludGVybmV0IEV4cGxvcmVyLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1hcHBlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4oYm9vbGVhbikgR2VuZXJhdGUgc2VwYXJhdGUgd3JpdGUoKSBjYWxscyBmb3IgZWFjaCBIVE1MCisgICAgbGluZSBpbiB0aGUgSlNQLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSB0byBydW4gdGhlIGpzcCBjb21waWxlci4KKyAgICBUaGlzIGNhbiBhbHNvIGJlIHNwZWNpZmllZAorICAgIGJ5IHRoZSBuZXN0ZWQgZWxlbWVudCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+CisgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QYXRoPC9hPikuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBidXQgaXQgc2VlbXMgdG8gd29yayBiZXR0ZXIgd2hlbiB1c2VkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5SZWZlcmVuY2U8L2E+LiBBcworICAgIHBlciA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhZyB0byBjb250cm9sIGFjdGlvbiBvbiBjb21waWxlIGZhaWx1cmVzOiBkZWZhdWx0PXllczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVyaWJhc2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgVGhlIHVyaSBjb250ZXh0IG9mIHJlbGF0aXZlIFVSSQorICAgIHJlZmVyZW5jZXMgaW4gdGhlIEpTUCBwYWdlcy4gSWYgaXQgZG9lcyBub3QKKyAgICBleGlzdCB0aGVuIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUKKyAgICByZWxhdGl2ZSB0byB0aGUgZGVjbGFyZWQgb3IgZGVyaXZlZCB2YWx1ZSBvZiA8dHQ+dXJpcm9vdC48L3R0PgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVyaXJvb3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgVGhlIHJvb3QgZGlyZWN0b3J5IHRoYXQgdXJpIGZpbGVzIHNob3VsZCBiZSByZXNvbHZlZAorICAgIGFnYWluc3QuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcGlsZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgQ2xhc3MgbmFtZSBvZiBqc3AgY29tcGlsZXIgYWRhcHRlciB0byB1c2UuICBEZWZhdWx0cyB0bworICAgIHRoZSBzdGFuZGFyZCBhZGFwdGVyIGZvciBKYXNwZXIuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcGlsZXJjbGFzc3BhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB1c2VkIHRvIGZpbmQgdGhlIGNvbXBpbGVyIGFkYXB0ZXIgc3BlY2lmaWVkCisgICAgYnkgdGhlIDxjb2RlPmNvbXBpbGVyPC9jb2RlPiBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2ViaW5jPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBmcmFjdGlvbiBvZiB3ZWIueG1sIHRoYXQgbGlzdHMgc2VydmxldHMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4gICAgCisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPndlYnhtbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5GaWxlIG5hbWUgZm9yIHdlYi54bWwgdG8gYmUgZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4gIAorCisgIDwvdGFibGU+CisKKzxQPlRoZSA8dHQ+bWFwcGVkPC90dD4gb3B0aW9uIHdpbGwsIGlmIHNldCB0byB0cnVlLCBzcGxpdCB0aGUgSlNQIHRleHQgY29udGVudCBpbnRvIGEKK29uZSBsaW5lIHBlciBjYWxsIGZvcm1hdC4gIFRoZXJlIGFyZSBjb21tZW50cyBhYm92ZSBhbmQgYmVsb3cgdGhlIG1hcHBlZAord3JpdGUgY2FsbHMgdG8gbG9jYWxpemUgd2hlcmUgaW4gdGhlIEpTUCBmaWxlIGVhY2ggbGluZSBvZiB0ZXh0IGNvbWVzCitmcm9tLiAgVGhpcyBjYW4gbGVhZCB0byBhIG1pbm9yIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIChidXQgaXQgaXMgYm91bmQKK2J5IGEgbGluZWFyIGNvbXBsZXhpdHkpLiAgV2l0aG91dCB0aGlzIG9wdGlvbnMgYWxsIGFkamFjZW50IHdyaXRlcyBhcmUKK2NvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIHdyaXRlLjwvUD4KKworPFA+VGhlIDx0dD5pZXBsdWdpbjwvdHQ+IG9wdGlvbiBpcyB1c2VkIGJ5IHRoZSA8dHQ+Jmx0O2pzcDpwbHVnaW4mZ3Q7PC90dD4gdGFncy4KK0lmIHRoZSBKYXZhIFBsdWctaW4gQ09NIENsYXNzLUlEIHlvdSB3YW50IHRvIHVzZSBjaGFuZ2VzIHRoZW4gaXQgY2FuIGJlCitzcGVjaWZpZWQgaGVyZS4gIFRoaXMgc2hvdWxkIG5vdCBuZWVkIHRvIGJlIGFsdGVyZWQuPC9QPgorCis8UD48dHQ+dXJpcm9vdDwvdHQ+IHNwZWNpZmllcyB0aGUgcm9vdCBvZiB0aGUgd2ViCithcHBsaWNhdGlvbi4gIFRoaXMgaXMgd2hlcmUgYWxsIGFic29sdXRlIHVyaXMgd2lsbCBiZSByZXNvbHZlZCBmcm9tLgorSWYgaXQgaXMgbm90IHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBKU1AgcGFnZSB3aWxsIGJlIHVzZWQgdG8gZGVyaXZlCitpdC4gIFRvIGRlcml2ZSBpdCBlYWNoIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGZpcnN0IEpTUCBwYWdlIGlzCitzZWFyY2hlZCBmb3IgYSA8dHQ+V0VCLUlORjwvdHQ+IGRpcmVjdG9yeSwgYW5kIHRoZSBkaXJlY3RvcnkgY2xvc2VzdCB0bwordGhlIEpTUCBwYWdlIHRoYXQgaGFzIG9uZSB3aWxsIGJlIHVzZWQuICBJZiBub25lIGNhbiBiZSBmb3VuZCB0aGVuIHRoZQorZGlyZWN0b3J5IEphc3BlcmMgd2FzIGNhbGxlZCBmcm9tIHdpbGwgYmUgdXNlZC4gIFRoaXMgb25seSBhZmZlY3RzIHBhZ2VzCit0cmFuc2xhdGVkIGZyb20gYW4gZXhwbGljaXRseSBkZWNsYXJlZCBKU1AgZmlsZSAtaW5jbHVkaW5nIHJlZmVyZW5jZXMKK3RvIHRhZ2xpYnM8L1A+CisKKzxQPjx0dD51cmliYXNlPC90dD4gaXMgdXNlZCB0byBlc3RhYmxpc2ggdGhlIHVyaSBjb250ZXh0IG9mCityZWxhdGl2ZSBVUkkgcmVmZXJlbmNlcyBpbiB0aGUgSlNQIHBhZ2VzLiAgSWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiBpdAoraXMgZGVyaXZlZCBmcm9tIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgZGVjbGFyZWQgb3IKK2Rlcml2ZWQgdmFsdWUgb2YgPHR0PnVyaXJvb3Q8L3R0Pi4gVGhpcyBvbmx5IGFmZmVjdHMgcGFnZXMKK3RyYW5zbGF0ZWQgZnJvbSBhbiBleHBsaWNpdGx5IGRlY2xhcmVkIEpTUCBmaWxlLjwvUD4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKK1RoaXMgdGFzayBpcyBhIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwiPmRpcmVjdG9yeSBiYXNlZCB0YXNrPC9hPiwgbGlrZQorPHN0cm9uZz5qYXZhYzwvc3Ryb25nPiwgc28gdGhlIGpzcCBmaWxlcyB0byBiZSBjb21waWxlZCBhcmUgbG9jYXRlZCBhcyBqYXZhCitmaWxlcyBhcmUgYnkgPHN0cm9uZz5qYXZhYzwvc3Ryb25nPi4gVGhhdCBpcywgZWxlbWVudHMgc3VjaCBhcyA8dHQ+aW5jbHVkZXM8L3R0PiBhbmQKKzx0dD5leGNsdWRlczwvdHQ+IGNhbiBiZSB1c2VkIGRpcmVjdGx5IGluc2lkZSB0aGUgdGFzayBkZWNsYXJhdGlvbi4KKworPHA+CisKK0VsZW1lbnRzIHNwZWNpZmljIHRvIHRoZSBqc3BjIHRhc2sgYXJlOi0KKworPGg0PmNsYXNzcGF0aDwvaDQ+CisKK1RoZSBjbGFzc3BhdGggdXNlZCB0byBjb21waWxlIHRoZSBKU1AgcGFnZXMsIHNwZWNpZmllZCBhcyBmb3IgYW55IG90aGVyCitjbGFzc3BhdGguCisKKzxoND5jbGFzc3BhdGhyZWY8L2g0PgorYSByZWZlcmVuY2UgdG8gYW4gZXhpc3RpbmcgY2xhc3NwYXRoCisKKzxoND53ZWJhcHA8L2g0PgorSW5zdHJ1Y3Rpb25zIHRvIGphc3BlciB0byBidWlsZCBhbiBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgorVGhlIGJhc2UgZGlyZWN0b3J5IG11c3QgaGF2ZSBhIFdFQi1JTkYgc3ViZGlyZWN0b3J5IGJlbmVhdGggaXQuCitXaGVuIHVzZWQsIHRoZSB0YXNrIGhhbmRzIG9mZiBhbGwgZGVwZW5kZW5jeSBjaGVja2luZyB0byB0aGUgY29tcGlsZXIuCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPkV4YW1wbGU8L2gzPgorPHByZT4KKyZsdDtqc3BjIHNyY2Rpcj0iJHtiYXNlZGlyfS9zcmMvd2FyIgorICAgICAgZGVzdGRpcj0iJHtiYXNlZGlyfS9nZW5zcmMiCisgICAgICBwYWNrYWdlPSJjb20uaTNzcC5qc3AiCisgICAgICBjb21waWxlcj0iamFzcGVyNDEiCisgICAgICB2ZXJib3NlPSI5IiZndDsKKyAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5qc3AiLyZndDsKKyZsdDsvanNwYyZndDsKKzwvcHJlPgorQnVpbGQgYWxsIGpzcCBwYWdlcyB1bmRlciBzcmMvd2FyIGludG8gdGhlIGRlc3RpbmF0aW9uIC9nZW5zcmMsIGluIGEKK3BhY2thZ2UgaGllcmFyY2h5IGJlZ2lubmluZyB3aXRoIGNvbS5pM3NwLmpzcC4KKzxwcmU+CismbHQ7anNwYworICAgICAgZGVzdGRpcj0iaW50ZXJpbSIKKyAgICAgIHZlcmJvc2U9IjEiCisgICAgICBzcmNkaXI9InNyYyIKKyAgICAgIGNvbXBpbGVyPSJqYXNwZXI0MSIKKyAgICAgIHBhY2thZ2U9ImNvbS5pM3NwLmpzcCImZ3Q7CisgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouanNwIi8mZ3Q7CismbHQ7L2pzcGMmZ3Q7CismbHQ7ZGVwZW5kCisgICAgICAgICBzcmNkaXI9ImludGVyaW0iCisgICAgICAgICBkZXN0ZGlyPSJidWlsZCIKKyAgICAgICAgIGNhY2hlPSJidWlsZC9kZXBlbmRlbmNpZXMiCisgICAgICAgICBjbGFzc3BhdGg9ImxpYi90YWdsaWJzLmphciIvJmd0OworJmx0O2phdmFjCisgICAgICAgICBzcmNkaXI9ImludGVyaW0iCisgICAgICAgICBkZXN0ZGlyPSJidWlsZCIKKyAgICAgICAgIGNsYXNzcGF0aD0ibGliL3RhZ2xpYnMuamFyIgorICAgICAgICAgZGVidWc9Im9uIi8mZ3Q7Cis8L3ByZT4KK0dlbmVyYXRlIGpzcCBwYWdlcyB0aGVuIGphdmFjIHRoZW0gZG93biB0bworYnl0ZWNvZGVzLiBJbmNsdWRlIGxpYi90YWdsaWIgamFyIGluIHRoZSBqYXZhIGNvbXBpbGF0aW9uLgorIERlcGVuZGVuY3kgY2hlY2tpbmcgaXMgdXNlZCB0byBzY3J1YiB0aGUKK2phdmEgZmlsZXMgaWYgY2xhc3MgZGVwZW5kZW5jaWVzIGluZGljYXRlIGl0IGlzIG5lZWRlZC4KKworPHA+PGg0Pk5vdGVzPC9oND4KK1VzaW5nIHRoZSA8Y29kZT5wYWNrYWdlPC9jb2RlPiBhdHRyaWJ1dGUgaXQgaXMgcG9zc2libGUgdG8gaWRlbnRpZnkgdGhlIHJlc3VsdGluZworamF2YSBmaWxlcyBhbmQgdGh1cyBkbyBmdWxsIGRlcGVuZGVuY3kgY2hlY2tpbmcgLSB0aGlzIHRhc2sgc2hvdWxkIG9ubHkgcmVidWlsZAoramF2YSBmaWxlcyBpZiB0aGVpciBqc3AgZmlsZSBoYXMgYmVlbiBtb2RpZmllZC4gSG93ZXZlciwgdGhpcyBvbmx5IHdvcmtzCit3aXRoIHNvbWUgdmVyc2lvbnMgb2YgamFzcGVyLiBCeSBkZWZhdWx0IHRoZSBjaGVja2luZyBzdXBwb3J0cyB0b21jYXQgNC4wLngKK3dpdGggdGhlICJqYXNwZXIiIGNvbXBpbGVyLCBzZXQgdGhlIGNvbXBpbGVyIHRvICJqYXNwZXI0MSIgZm9yIHRoZSB0b21jYXQ0LjEueAorZGVwZW5kZW5jeSBjaGVja2luZy4KK0V2ZW4gd2hlbiBpdCBkb2VzIHdvcmssIGNoYW5nZXMgaW4KKy5UTEQgaW1wb3J0cyBvciBpbiBjb21waWxlIHRpbWUgaW5jbHVkZXMgZG8gbm90IGdldCBwaWNrZWQgdXAuCisKKzxwPgorSmFzcGVyIGdlbmVyYXRlcyBKU1AgcGFnZXMgYWdhaW5zdCB0aGUgSlNQMS4yIHNwZWNpZmljYXRpb24gLWEgY29weSBvZgordmVyc2lvbiAyLjMgb2YgdGhlIHNlcnZsZXQgc3BlY2lmaWNhdGlvbiBpcyBuZWVkZWQgb24gdGhlIGNsYXNzcGF0aCB0bworY29tcGlsZSB0aGUgSmF2YSBjb2RlLgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2p1bml0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2p1bml0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjOWQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvanVuaXQuaHRtbApAQCAtMCwwICsxLDY3MiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SlVuaXQgVGFzazwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGgyPjxhIG5hbWU9Imp1bml0Ij5KVW5pdDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworPHA+VGhpcyB0YXNrIHJ1bnMgdGVzdHMgZnJvbSB0aGUgSlVuaXQgdGVzdGluZyBmcmFtZXdvcmsuIFRoZSBsYXRlc3QKK3ZlcnNpb24gb2YgdGhlIGZyYW1ld29yayBjYW4gYmUgZm91bmQgYXQKKzxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnIj5odHRwOi8vd3d3Lmp1bml0Lm9yZzwvYT4uCitUaGlzIHRhc2sgaGFzIGJlZW4gdGVzdGVkIHdpdGggSlVuaXQgMy4wIHVwIHRvIEpVbml0IDMuOC4yOyBpdCB3b24ndAord29yayB3aXRoIHZlcnNpb25zIHByaW9yIHRvIEpVbml0IDMuMC4gSXQgYWxzbyB3b3JrcyB3aXRoIEpVbml0IDQuMCwgaW5jbHVkaW5nCisicHVyZSIgSlVuaXQgNCB0ZXN0cyB1c2luZyBvbmx5IGFubm90YXRpb25zIGFuZCBubyA8Y29kZT5KVW5pdDRUZXN0QWRhcHRlcjwvY29kZT4uPC9wPgorPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkCitpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4gIFNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+CitMaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCis8L3A+Cis8cD4KKzxzdHJvbmc+Tm90ZTwvc3Ryb25nPjoKK1lvdSBtdXN0IGhhdmUgPGNvZGU+anVuaXQuamFyPC9jb2RlPiBhdmFpbGFibGUuCitZb3UgY2FuIGRvIG9uZSBvZjoKKzwvcD4KKzxvbD4KKzxsaT4KK1B1dCBib3RoIDxjb2RlPmp1bml0LmphcjwvY29kZT4gYW5kIDxjb2RlPmFudC1qdW5pdC5qYXI8L2NvZGU+IGluCis8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+LgorPC9saT4KKzxsaT4KK0RvIG5vdCBwdXQgZWl0aGVyIGluIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4sIGFuZCBpbnN0ZWFkCitpbmNsdWRlIHRoZWlyIGxvY2F0aW9ucyBpbiB5b3VyIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuCis8L2xpPgorPGxpPgorQWRkIGJvdGggSkFScyB0byB5b3VyIGNsYXNzcGF0aCB1c2luZyA8Y29kZT4tbGliPC9jb2RlPi4KKzwvbGk+Cis8bGk+CitTcGVjaWZ5IHRoZSBsb2NhdGlvbnMgb2YgYm90aCBKQVJzIHVzaW5nCithIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIGEgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiBpbiB0aGUgYnVpbGQgZmlsZS4KKzwvbGk+Cis8bGk+CitMZWF2ZSA8Y29kZT5hbnQtanVuaXQuamFyPC9jb2RlPiBpbiBpdHMgZGVmYXVsdCBsb2NhdGlvbiBpbiA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+CitidXQgaW5jbHVkZSA8Y29kZT5qdW5pdC5qYXI8L2NvZGU+IGluIHRoZSA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gcGFzc2VkCit0byA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi4gPGVtPihzaW5jZSBBbnQgMS43KTwvZW0+Cis8L2xpPgorPC9vbD4KKzxwPgorU2VlIDxhIGhyZWY9Ii4uLy4uL2ZhcS5odG1sI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXIiIHRhcmdldD0iX3RvcCI+dGhlCitGQVE8L2E+IGZvciBkZXRhaWxzLgorPC9wPgorCis8cD5UZXN0cyBhcmUgZGVmaW5lZCBieSBuZXN0ZWQgPGNvZGU+dGVzdDwvY29kZT4gb3IKKzxjb2RlPmJhdGNodGVzdDwvY29kZT4gdGFncyAoc2VlIDxhIGhyZWY9IiNuZXN0ZWQiPm5lc3RlZAorZWxlbWVudHM8L2E+KS48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJpbnRzdW1tYXJ5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlByaW50IG9uZS1saW5lIHN0YXRpc3RpY3MgZm9yIGVhY2ggdGVzdGNhc2UuIENhbgorICAgICAgdGFrZSB0aGUgdmFsdWVzIDxjb2RlPm9uPC9jb2RlPiwKKyAgICAgIDxjb2RlPm9mZjwvY29kZT4sIGFuZAorICAgICAgPGNvZGU+d2l0aE91dEFuZEVycjwvY29kZT4uCisgICAgICA8Y29kZT53aXRoT3V0QW5kRXJyPC9jb2RlPiBpcyB0aGUgc2FtZQorICAgICAgYXMgPGNvZGU+b248L2NvZGU+IGJ1dCBhbHNvIGluY2x1ZGVzIHRoZSBvdXRwdXQgb2YgdGhlIHRlc3QKKyAgICAgIGFzIHdyaXR0ZW4gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gYW5kIDxjb2RlPlN5c3RlbS5lcnI8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT5vZmY8L2NvZGU+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcms8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UnVuIHRoZSB0ZXN0cyBpbiBhIHNlcGFyYXRlIFZNLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT5vZmY8L2NvZGU+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmttb2RlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbnRyb2xzIGhvdyBtYW55IEphdmEgVmlydHVhbCBNYWNoaW5lcyBnZXQKKyAgICBjcmVhdGVkIGlmIHlvdSB3YW50IHRvIGZvcmsgc29tZSB0ZXN0cy4gIFBvc3NpYmxlIHZhbHVlcyBhcmUKKyAgICAmcXVvdDtwZXJUZXN0JnF1b3Q7ICh0aGUgZGVmYXVsdCksICZxdW90O3BlckJhdGNoJnF1b3Q7IGFuZAorICAgICZxdW90O29uY2UmcXVvdDsuICAmcXVvdDtvbmNlJnF1b3Q7IGNyZWF0ZXMgb25seSBhIHNpbmdsZSBKYXZhIFZNCisgICAgZm9yIGFsbCB0ZXN0cyB3aGlsZSAmcXVvdDtwZXJUZXN0JnF1b3Q7IGNyZWF0ZXMgYSBuZXcgVk0gZm9yIGVhY2gKKyAgICBUZXN0Q2FzZSBjbGFzcy4gICZxdW90O3BlckJhdGNoJnF1b3Q7IGNyZWF0ZXMgYSBWTSBmb3IgZWFjaCBuZXN0ZWQKKyAgICA8Y29kZT4mbHQ7YmF0Y2h0ZXN0Jmd0OzwvY29kZT4gYW5kIG9uZSBjb2xsZWN0aW5nIGFsbCBuZXN0ZWQKKyAgICA8Y29kZT4mbHQ7dGVzdCZndDs8L2NvZGU+cy4gIE5vdGUgdGhhdCBvbmx5IHRlc3RzIHdpdGggdGhlIHNhbWUKKyAgICBzZXR0aW5ncyBvZiA8Y29kZT5maWx0ZXJ0cmFjZTwvY29kZT4sIDxjb2RlPmhhbHRvbmVycm9yPC9jb2RlPiwKKyAgICA8Y29kZT5oYWx0b25mYWlsdXJlPC9jb2RlPiwgPGNvZGU+ZXJyb3Jwcm9wZXJ0eTwvY29kZT4gYW5kCisgICAgPGNvZGU+ZmFpbHVyZXByb3BlcnR5PC9jb2RlPiBjYW4gc2hhcmUgYSBWTSwgc28gZXZlbiBpZiB5b3Ugc2V0CisgICAgPGNvZGU+Zm9ya21vZGU8L2NvZGU+IHRvICZxdW90O29uY2UmcXVvdDssIEFudCBtYXkgaGF2ZSB0byBjcmVhdGUKKyAgICBtb3JlIHRoYW4gYSBzaW5nbGUgSmF2YSBWTS4gIFRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgZm9yIHRlc3RzCisgICAgdGhhdCBkb24ndCBnZXQgZm9ya2VkIGludG8gYSBuZXcgSmF2YSBWTS4gIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT5wZXJUZXN0PC9jb2RlPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5oYWx0b25lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIHRlc3QKKyAgICAgICBydW4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPm9mZjwvY29kZT4uPC90ZD4KKyAgPC90cj4KKzx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9ycHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5oYWx0b25mYWlsdXJlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYSB0ZXN0IGZhaWxzIChlcnJvcnMgYXJlCisgICAgICBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT5vZmY8L2NvZGU+LjwvdGQ+CisgIDwvdHI+Cis8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsdXJlcHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZQorICAgICAgKGVycm9ycyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uPC90ZD4KKzwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbHRlcnRyYWNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkZpbHRlciBvdXQgSnVuaXQgYW5kIEFudCBzdGFjayBmcmFtZXMgZnJvbSBlcnJvciBhbmQgZmFpbHVyZSBzdGFjayB0cmFjZXMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPm9uPC9jb2RlPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aW1lb3V0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNhbmNlbCB0aGUgaW5kaXZpZHVhbCB0ZXN0cyBpZiB0aGV5IGRvbid0IGZpbmlzaAorICAgICAgaW4gdGhlIGdpdmVuIHRpbWUgKG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcykuICBJZ25vcmVkIGlmCisgICAgICA8Y29kZT5mb3JrPC9jb2RlPiBpcyBkaXNhYmxlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIHRvIHRoZSBmb3JrZWQgVk0uCisgICAgICBJZ25vcmVkIGlmIDxjb2RlPmZvcms8L2NvZGU+IGlzIGRpc2FibGVkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmp2bTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tbWFuZCB1c2VkIHRvIGludm9rZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUsCisgICAgICBkZWZhdWx0IGlzICdqYXZhJy4gIFRoZSBjb21tYW5kIGlzIHJlc29sdmVkIGJ5CisgICAgICA8Y29kZT5qYXZhLmxhbmcuUnVudGltZS5leGVjKCk8L2NvZGU+LgorICAgICAgSWdub3JlZCBpZiA8Y29kZT5mb3JrPC9jb2RlPiBpcyBkaXNhYmxlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgPGNvZGU+amF2YTwvY29kZT4uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gaW52b2tlIHRoZSBWTS4gSWdub3JlZCBpZgorICAgICAgPGNvZGU+Zm9yazwvY29kZT4gaXMgZGlzYWJsZWQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmV3ZW52aXJvbm1lbnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RG8gbm90IHByb3BhZ2F0ZSB0aGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3CisgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC4gSWdub3JlZCBpZiA8Y29kZT5mb3JrPC9jb2RlPiBpcworICAgICAgZGlzYWJsZWQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlYW50cnVudGltZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JbXBsaWNpdGx5IGFkZCB0aGUgQW50IGNsYXNzZXMgcmVxdWlyZWQgdG8gcnVuCisgICAgICB0aGUgdGVzdHMgYW5kIEpVbml0IHRvIHRoZSBjbGFzc3BhdGggaW4gZm9ya2VkIG1vZGUuCisgICAgICA8Yj5Ob3RlOjwvYj4gUGxlYXNlIHJlYWQgdGhlIDxhCisgICAgICBocmVmPSIuLi8uLi9mYXEuaHRtbCNqdW5pdC1uby1ydW50aW1lLXhtbCI+QW50IEZBUTwvYT4gaWYgeW91CisgICAgICB3YW50IHRvIHNldCB0aGlzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdXNlIHRoZSBYTUwgZm9ybWF0dGVyCisgICAgICBhdCB0aGUgc2FtZSB0aW1lLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zaG93b3V0cHV0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNlbmQgYW55IG91dHB1dCBnZW5lcmF0ZWQgYnkgdGVzdHMgdG8gQW50J3MKKyAgICAgIGxvZ2dpbmcgc3lzdGVtIGFzIHdlbGwgYXMgdG8gdGhlIGZvcm1hdHRlcnMuICBCeSBkZWZhdWx0IG9ubHkgdGhlCisgICAgICBmb3JtYXR0ZXJzIHJlY2VpdmUgdGhlIG91dHB1dC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXR0b2Zvcm1hdHRlcnM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICA8ZW0+U2luY2UgQW50IDEuNy4wLjwvZW0+PGJyLz4KKyAgICAgIFNlbmQgYW55IG91dHB1dCBnZW5lcmF0ZWQgYnkgdGVzdHMgdG8gdGhlIHRlc3QgZm9ybWF0dGVycy4KKyAgICAgIFRoaXMgaXMgInRydWUiIGJ5IGRlZmF1bHQuCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGVtcGRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGVyZSBBbnQgc2hvdWxkIHBsYWNlIHRlbXBvcmFyeSBmaWxlcy4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIHRoZSBwcm9qZWN0J3MgYmFzZQorICAgICAgZGlyZWN0b3J5LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbG9hZGluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIG9yIG5vdCBhIG5ldyBjbGFzc2xvYWRlciBzaG91bGQgYmUgaW5zdGFudGlhdGVkIGZvciBlYWNoIHRlc3QgY2FzZS48YnI+CisgICAgSWdub3JlIGlmIDxjb2RlPmZvcms8L2NvZGU+IGlzIHNldCB0byB0cnVlLgorICAgICAgPGVtPlNpbmNlIEFudCAxLjY8L2VtPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xvbmV2bTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiBzZXQgdG8gdHJ1ZSB0cnVlLCB0aGVuIGFsbCBzeXN0ZW0gcHJvcGVydGllcworICAgICAgYW5kIHRoZSBib290Y2xhc3NwYXRoIG9mIHRoZSBmb3JrZWQgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgd2lsbCBiZQorICAgICAgdGhlIHNhbWUgYXMgdGhvc2Ugb2YgdGhlIEphdmEgVk0gcnVubmluZyBBbnQuICBEZWZhdWx0IGlzCisgICAgICAmcXVvdDtmYWxzZSZxdW90OyAoaWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkKS4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+QnkgdXNpbmcgdGhlIDxjb2RlPmVycm9ycHJvcGVydHk8L2NvZGU+IGFuZCA8Y29kZT5mYWlsdXJlcHJvcGVydHk8L2NvZGU+CithdHRyaWJ1dGVzLCBpdCBpcyBwb3NzaWJsZSB0bworcGVyZm9ybSBzZXR1cCB3b3JrIChzdWNoIGFzIHN0YXJ0aW5nIGFuIGV4dGVybmFsIHNlcnZlciksIGV4ZWN1dGUgdGhlIHRlc3QsCitjbGVhbiB1cCwgYW5kIHN0aWxsIGZhaWwgdGhlIGJ1aWxkIGluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUuPC9wPgorCis8cD5UaGUgPGNvZGU+ZmlsdGVydHJhY2U8L2NvZGU+IGF0dHJpYnV0ZSBjb25kZW5zZXMgZXJyb3IgYW5kIGZhaWx1cmUKK3N0YWNrIHRyYWNlcyBiZWZvcmUgcmVwb3J0aW5nIHRoZW0uCitJdCB3b3JrcyB3aXRoIGJvdGggdGhlIHBsYWluIGFuZCBYTUwgZm9ybWF0dGVycy4gIEl0IGZpbHRlcnMgb3V0IGFueSBsaW5lcwordGhhdCBiZWdpbiB3aXRoIHRoZSBmb2xsb3dpbmcgc3RyaW5nIHBhdHRlcm5zOjxwcmU+CisgICAianVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIgorICAgImp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0IgorICAgImp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUiCisgICAianVuaXQuZnJhbWV3b3JrLkFzc2VydC4iCisgICAianVuaXQuc3dpbmd1aS5UZXN0UnVubmVyIgorICAgImp1bml0LmF3dHVpLlRlc3RSdW5uZXIiCisgICAianVuaXQudGV4dHVpLlRlc3RSdW5uZXIiCisgICAiamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZSgiCisgICAic3VuLnJlZmxlY3QuIgorICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LiI8L3ByZT48L3A+CisKKzxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgorCis8cD5UaGUgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gdGFzaworc3VwcG9ydHMgYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+CitlbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlCitzdHJ1Y3R1cmU8L2E+LjwvcD4KKworPHA+QXMgb2YgQW50IDEuNywgdGhpcyBjbGFzc3BhdGggbWF5IGJlIHVzZWQgdG8gcmVmZXIgdG8gPGNvZGU+anVuaXQuamFyPC9jb2RlPgorYXMgd2VsbCBhcyB5b3VyIHRlc3RzIGFuZCB0aGUgdGVzdGVkIGNvZGUuCisKKzxoND5qdm1hcmc8L2g0PgorCis8cD5JZiA8Y29kZT5mb3JrPC9jb2RlPiBpcyBlbmFibGVkLCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgbWF5IGJlIHBhc3NlZCB0bwordGhlIG5ldyBWTSB2aWEgbmVzdGVkIDxjb2RlPiZsdDtqdm1hcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gRm9yIGV4YW1wbGU6PC9wPgorCis8cHJlPgorJmx0O2p1bml0IGZvcms9JnF1b3Q7eWVzJnF1b3Q7Jmd0OworICAmbHQ7anZtYXJnIHZhbHVlPSZxdW90Oy1EamF2YS5jb21waWxlcj1OT05FJnF1b3Q7LyZndDsKKyAgLi4uCismbHQ7L2p1bml0Jmd0OworPC9wcmU+CisKKzxwPndvdWxkIHJ1biB0aGUgdGVzdCBpbiBhIFZNIHdpdGhvdXQgSklULjwvcD4KKworPHA+PGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGFsbG93cyBhbGwgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gPGEKK2hyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPi48L3A+CisKKzxoND5zeXNwcm9wZXJ0eTwvaDQ+CisKKzxwPlVzZSBuZXN0ZWQgPGNvZGU+Jmx0O3N5c3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudHMgdG8gc3BlY2lmeSBzeXN0ZW0KK3Byb3BlcnRpZXMgcmVxdWlyZWQgYnkgdGhlIGNsYXNzLiBUaGVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUKK3RvIHRoZSBWTSBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdCAoZWl0aGVyIEFOVCdzIFZNIG9yIHRoZSBmb3JrZWQgVk0sCitpZiA8Y29kZT5mb3JrPC9jb2RlPiBpcyBlbmFibGVkKS4KK1RoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgYXJlIHRoZSBzYW1lIGFzIGZvciA8YSBocmVmPSIuLi9Db3JlVGFza3MvZXhlYy5odG1sI2VudiI+ZW52aXJvbm1lbnQgdmFyaWFibGVzPC9hPi48L3A+CisKKzxwcmU+CismbHQ7anVuaXQgZm9yaz0mcXVvdDtubyZxdW90OyZndDsKKyAgJmx0O3N5c3Byb3BlcnR5IGtleT0mcXVvdDtiYXNlZGlyJnF1b3Q7IHZhbHVlPSZxdW90OyR7YmFzZWRpcn0mcXVvdDsvJmd0OworICAuLi4KKyZsdDsvanVuaXQmZ3Q7Cis8L3ByZT4KKworPHA+d291bGQgcnVuIHRoZSB0ZXN0IGluIEFOVCdzIFZNIGFuZCBtYWtlIHRoZSA8Y29kZT5iYXNlZGlyPC9jb2RlPiBwcm9wZXJ0eQorYXZhaWxhYmxlIHRvIHRoZSB0ZXN0LjwvcD4KKworPGg0PnN5c3Byb3BlcnR5c2V0PC9oND4KKworPHA+WW91IGNhbiBzcGVjaWZ5IGEgc2V0IG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBhcyBzeXN0ZW0gcHJvcGVydGllcword2l0aCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+c3lzcHJvcGVydHlzZXQ8L2E+cy48L3A+CisKKzxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC9wPgorCis8aDQ+ZW52PC9oND4KKworPHA+SXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUKK2ZvcmtlZCBWTSB2aWEgbmVzdGVkIDxjb2RlPiZsdDtlbnYmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gRm9yIGEgZGVzY3JpcHRpb24KK29mIHRoZSA8Y29kZT4mbHQ7ZW52Jmd0OzwvY29kZT4gZWxlbWVudCdzIGF0dHJpYnV0ZXMsIHNlZSB0aGUKK2Rlc2NyaXB0aW9uIGluIHRoZSA8YSBocmVmPSIuLi9Db3JlVGFza3MvZXhlYy5odG1sI2VudiI+ZXhlYzwvYT4gdGFzay48L3A+CisKKzxwPlNldHRpbmdzIHdpbGwgYmUgaWdub3JlZCBpZiA8Y29kZT5mb3JrPC9jb2RlPiBpcyBkaXNhYmxlZC48L3A+CisKKzxoND5ib290Y2xhc3NwYXRoPC9oND4KKworPHA+VGhlIGxvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlcyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoaXMKKzxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4gLSB3aWxsIGJlIGlnbm9yZWQKK2lmIDxpPmZvcms8L2k+IGlzIG5vdCA8Y29kZT50cnVlPC9jb2RlPiBvciB0aGUgdGFyZ2V0IFZNIGRvZXNuJ3QKK3N1cHBvcnQgaXQgKGkuZS4gSmF2YSAxLjEpLjwvcD4KKworPHA+PGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3A+CisKKzxoND5wZXJtaXNzaW9uczwvaDQ+Cis8cD5TZWN1cml0eSBwZXJtaXNzaW9ucyBjYW4gYmUgcmV2b2tlZCBhbmQgZ3JhbnRlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgCitjbGFzcyB2aWEgYSBuZXN0ZWQgPGk+cGVybWlzc2lvbnM8L2k+IGVsZW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZQorc2VlIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9wZXJtaXNzaW9ucy5odG1sIj5wZXJtaXNzaW9uczwvYT48L3A+CisKKzxwPlNldHRpbmdzIHdpbGwgYmUgaWdub3JlZCBpZiBmb3JrIGlzIGVuYWJsZWQuPC9wPgorCis8cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvcD4KKyAKKzxoND5hc3NlcnRpb25zPC9oND4KKworPHA+WW91IGNhbiBjb250cm9sIGVuYWJsZW1lbnQgb2YgSmF2YSAxLjQgYXNzZXJ0aW9ucyB3aXRoIGFuCis8YSBocmVmPSIuLi9Db3JlVHlwZXMvYXNzZXJ0aW9ucy5odG1sIj48dHQ+Jmx0O2Fzc2VydGlvbnMmZ3Q7PC90dD48L2E+CitzdWJlbGVtZW50LjwvcD4KKyAKKzxwPkFzc2VydGlvbiBzdGF0ZW1lbnRzIGFyZSBjdXJyZW50bHkgaWdub3JlZCBpbiBub24tZm9ya2VkIG1vZGUuPC9wPgorCis8cD48ZW0+c2luY2UgQW50IDEuNi48L2VtPjwvcD4KKworPGg0PmZvcm1hdHRlcjwvaDQ+CisKKzxwPlRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBjYW4gYmUgcHJpbnRlZCBpbiBkaWZmZXJlbnQKK2Zvcm1hdHMuIE91dHB1dCB3aWxsIGFsd2F5cyBiZSBzZW50IHRvIGEgZmlsZSwgdW5sZXNzIHlvdSBzZXQgdGhlCis8Y29kZT51c2VmaWxlPC9jb2RlPiBhdHRyaWJ1dGUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgorVGhlIG5hbWUgb2YgdGhlIGZpbGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUKK25hbWUgb2YgdGhlIHRlc3QgYW5kIGNhbiBiZSBzZXQgYnkgdGhlIDxjb2RlPm91dGZpbGU8L2NvZGU+IGF0dHJpYnV0ZQorb2YgPGNvZGU+Jmx0O3Rlc3QmZ3Q7PC9jb2RlPi48L3A+CisKKzxwPlRoZXJlIGFyZSBmb3VyIHByZWRlZmluZWQgZm9ybWF0dGVycyAtIG9uZSBwcmludHMgdGhlIHRlc3QgcmVzdWx0cworaW4gWE1MIGZvcm1hdCwgdGhlIG90aGVyIGVtaXRzIHBsYWluIHRleHQuICBUaGUgZm9ybWF0dGVyIG5hbWVkCis8Y29kZT5icmllZjwvY29kZT4gd2lsbCBvbmx5IHByaW50IGRldGFpbGVkIGluZm9ybWF0aW9uIGZvciB0ZXN0Y2FzZXMKK3RoYXQgZmFpbGVkLCB3aGlsZSA8Y29kZT5wbGFpbjwvY29kZT4gZ2l2ZXMgYSBsaXR0bGUgc3RhdGlzdGljcyBsaW5lCitmb3IgYWxsIHRlc3QgY2FzZXMuICBDdXN0b20gZm9ybWF0dGVycyB0aGF0IG5lZWQgdG8gaW1wbGVtZW50Cis8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFJlc3VsdEZvcm1hdHRlcjwvY29kZT4KK2NhbiBiZSBzcGVjaWZpZWQuPC9wPgorCis8cD5JZiB5b3UgdXNlIHRoZSBYTUwgZm9ybWF0dGVyLCBpdCBtYXkgbm90IGluY2x1ZGUgdGhlIHNhbWUgb3V0cHV0Cit0aGF0IHlvdXIgdGVzdHMgaGF2ZSB3cml0dGVuIGFzIHNvbWUgY2hhcmFjdGVycyBhcmUgaWxsZWdhbCBpbiBYTUwKK2RvY3VtZW50cyBhbmQgd2lsbCBiZSBkcm9wcGVkLjwvcD4KKworPHA+VGhlIGZvdXJ0aCBmb3JtYXR0ZXIgbmFtZWQgPGNvZGU+ZmFpbHVyZTwvY29kZT4gKHNpbmNlIEFudCAxLjguMCkgCitjb2xsZWN0cyBhbGwgZmFpbGluZyA8Y29kZT50ZXN0WFhYKCk8L2NvZGU+CittZXRob2RzIGFuZCBjcmVhdGVzIGEgbmV3IDxjb2RlPlRlc3RDYXNlPC9jb2RlPiB3aGljaCBkZWxlZ2F0ZXMgb25seSB0aGVzZQorZmFpbGluZyBtZXRob2RzLiBUaGUgbmFtZSBhbmQgdGhlIGxvY2F0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdmlhIEphdmEgU3lzdGVtIHByb3BlcnR5IG9yIEFudCBwcm9wZXJ0eQorPGNvZGU+YW50Lmp1bml0LmZhaWx1cmVDb2xsZWN0b3I8L2NvZGU+LiBUaGUgdmFsdWUgaGFzIHRvIHBvaW50IHRvIHRoZSBkaXJlY3RvcnkgYW5kIAordGhlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyBjbGFzcyAod2l0aG91dCBzdWZmaXgpLiBJdCBkZWZhdWx0cyB0byA8aT5qYXZhLXRtcC1kaXI8L2k+L0ZhaWxlZFRlc3RzLjwvcD4KKworPHA+PGI+Tm90ZTo8L2I+IFBsZWFzZSByZWFkIHRoZSA8YQoraHJlZj0iLi4vLi4vZmFxLmh0bWwjanVuaXQtbm8tcnVudGltZS14bWwiPkFudCBGQVE8L2E+IGlmIHlvdSB3YW50IHRvCitzZXQgdGhlIGZvcmsgYXR0cmlidXRlIHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgaW5jbHVkZUFudFJ1bnRpbWUKK2F0dHJpYnV0ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHVzZSB0aGUgWE1MIGZvcm1hdHRlciBhdCB0aGUgc2FtZQordGltZS48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Vc2UgYSBwcmVkZWZpbmVkIGZvcm1hdHRlciAoZWl0aGVyCisgICAgICA8Y29kZT54bWw8L2NvZGU+LCA8Y29kZT5wbGFpbjwvY29kZT4sIDxjb2RlPmJyaWVmPC9jb2RlPiBvciA8Y29kZT5mYWlsdXJlPC9jb2RlPikuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlc2UuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYSBjdXN0b20gZm9ybWF0dGVyIGNsYXNzLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4dGVuc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5FeHRlbnNpb24gdG8gYXBwZW5kIHRvIHRoZSBvdXRwdXQgZmlsZW5hbWUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLCBpZiA8Y29kZT5jbGFzc25hbWU8L2NvZGU+IGhhcyBiZWVuIHVzZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Cb29sZWFuIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIG91dHB1dCBzaG91bGQgYmUKKyAgICAgIHNlbnQgdG8gYSBmaWxlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk9ubHkgdXNlIGZvcm1hdHRlciBpZiB0aGUgbmFtZWQgcHJvcGVydHkgaXMgc2V0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IHVzZSBmb3JtYXR0ZXIgaWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzIDxiPm5vdDwvYj4gc2V0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LjwvdGQ+CisgIDwvdHI+ICAKKzwvdGFibGU+CisKKzxoND50ZXN0PC9oND4KKworPHA+RGVmaW5lcyBhIHNpbmdsZSB0ZXN0IGNsYXNzLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgdGhlIHRlc3QgY2xhc3MuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yazwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5SdW4gdGhlIHRlc3RzIGluIGEgc2VwYXJhdGUgVk0uCisgICAgICBPdmVycmlkZXMgdmFsdWUgc2V0IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmhhbHRvbmVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgdGVzdAorICAgICAgIHJ1bi4gT3ZlcnJpZGVzIHZhbHVlIHNldCBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3Jwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IuCisgICAgICBPdmVycmlkZXMgdmFsdWUgc2V0IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5oYWx0b25mYWlsdXJlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYSB0ZXN0IGZhaWxzIChlcnJvcnMgYXJlCisgICAgICBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLiAgT3ZlcnJpZGVzIHZhbHVlIHNldCBpbgorICAgICAgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWx1cmVwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlCisgICAgICAoZXJyb3JzIGFyZSBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLiBPdmVycmlkZXMgdmFsdWUgc2V0IGluCisgICAgICA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsdGVydHJhY2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RmlsdGVyIG91dCBKdW5pdCBhbmQgQW50IHN0YWNrIGZyYW1lcyBmcm9tIGVycm9yIGFuZCBmYWlsdXJlIHN0YWNrCisgICAgdHJhY2VzLiAgT3ZlcnJpZGVzIHZhbHVlIHNldCBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgPGNvZGU+b248L2NvZGU+LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRvZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRpcmVjdG9yeSB0byB3cml0ZSB0aGUgcmVwb3J0cyB0by48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm91dGZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QmFzZSBuYW1lIG9mIHRoZSB0ZXN0IHJlc3VsdC4gVGhlIGZ1bGwgZmlsZW5hbWUgaXMKKyAgICAgIGRldGVybWluZWQgYnkgdGhpcyBhdHRyaWJ1dGUgYW5kIHRoZSBleHRlbnNpb24gb2YKKyAgICAgIDxjb2RlPmZvcm1hdHRlcjwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzCisgICAgICA8Y29kZT5URVNULTwvY29kZT48ZW0+bmFtZTwvZW0+LCB3aGVyZSA8ZW0+bmFtZTwvZW0+IGlzIHRoZSBuYW1lIG9mCisgICAgICB0aGUgdGVzdCBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IHJ1biB0ZXN0IGlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBzZXQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dW5sZXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk9ubHkgcnVuIHRlc3QgaWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzIDxiPm5vdDwvYj4gc2V0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5UZXN0cyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXR0ZXJzIHZpYSBuZXN0ZWQKKzxjb2RlPiZsdDtmb3JtYXR0ZXImZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisKKzxoND5iYXRjaHRlc3Q8L2g0PgorCis8cD5EZWZpbmUgYSBudW1iZXIgb2YgdGVzdHMgYmFzZWQgb24gcGF0dGVybiBtYXRjaGluZy48L3A+CisKKzxwPjxjb2RlPmJhdGNodGVzdDwvY29kZT4gY29sbGVjdHMgdGhlIGluY2x1ZGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2VzPC9hPiBmcm9tIGFueSBudW1iZXIKK29mIG5lc3RlZCA8YQoraHJlZj0iLi4vQ29yZVR5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+cy4gSXQgdGhlbgorZ2VuZXJhdGVzIGEgdGVzdCBjbGFzcyBuYW1lIGZvciBlYWNoIHJlc291cmNlIHRoYXQgZW5kcyBpbgorPGNvZGU+LmphdmE8L2NvZGU+IG9yIDxjb2RlPi5jbGFzczwvY29kZT4uPC9wPgorCis8cD5BbnkgdHlwZSBvZiBSZXNvdXJjZSBDb2xsZWN0aW9uIGlzIHN1cHBvcnRlZCBhcyBhIG5lc3RlZCBlbGVtZW50LAorcHJpb3IgdG8gQW50IDEuNyBvbmx5IDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gaGFzIGJlZW4KK3N1cHBvcnRlZC48L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yazwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5SdW4gdGhlIHRlc3RzIGluIGEgc2VwYXJhdGUgVk0uCisgICAgICBPdmVycmlkZXMgdmFsdWUgc2V0IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmhhbHRvbmVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgdGVzdAorICAgICAgIHJ1bi4gT3ZlcnJpZGVzIHZhbHVlIHNldCBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3Jwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IuCisgICAgICBPdmVycmlkZXMgdmFsdWUgc2V0IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5oYWx0b25mYWlsdXJlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYSB0ZXN0IGZhaWxzIChlcnJvcnMgYXJlCisgICAgICBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLiAgT3ZlcnJpZGVzIHZhbHVlIHNldCBpbgorICAgICAgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWx1cmVwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlCisgICAgICAoZXJyb3JzIGFyZSBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLiBPdmVycmlkZXMgdmFsdWUgc2V0IGluCisgICAgICA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWx0ZXJ0cmFjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5GaWx0ZXIgb3V0IEp1bml0IGFuZCBBbnQgc3RhY2sgZnJhbWVzIGZyb20gZXJyb3IgYW5kIGZhaWx1cmUgc3RhY2sKKyAgICB0cmFjZXMuICBPdmVycmlkZXMgdmFsdWUgc2V0IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT5vbjwvY29kZT4uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RGlyZWN0b3J5IHRvIHdyaXRlIHRoZSByZXBvcnRzIHRvLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSBydW4gdGVzdHMgaWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzIHNldC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51bmxlc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSBydW4gdGVzdHMgaWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHNldC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+QmF0Y2h0ZXN0cyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXR0ZXJzIHZpYSBuZXN0ZWQKKzxjb2RlPiZsdDtmb3JtYXR0ZXImZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwcmU+CismbHQ7anVuaXQmZ3Q7CisgICZsdDt0ZXN0IG5hbWU9Im15LnRlc3QuVGVzdENhc2UiLyZndDsKKyZsdDsvanVuaXQmZ3Q7Cis8L3ByZT4KKworPHA+UnVucyB0aGUgdGVzdCBkZWZpbmVkIGluIDxjb2RlPm15LnRlc3QuVGVzdENhc2U8L2NvZGU+IGluIHRoZSBzYW1lCitWTS4gTm8gb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkIHVubGVzcyB0aGUgdGVzdCBmYWlscy48L3A+CisKKzxwcmU+CismbHQ7anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGZvcms9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIiZndDsKKyAgJmx0O2Zvcm1hdHRlciB0eXBlPSJwbGFpbiIvJmd0OworICAmbHQ7dGVzdCBuYW1lPSJteS50ZXN0LlRlc3RDYXNlIi8mZ3Q7CismbHQ7L2p1bml0Jmd0OworPC9wcmU+CisKKzxwPlJ1bnMgdGhlIHRlc3QgZGVmaW5lZCBpbiA8Y29kZT5teS50ZXN0LlRlc3RDYXNlPC9jb2RlPiBpbiBhCitzZXBhcmF0ZSBWTS4gIEF0IHRoZSBlbmQgb2YgdGhlIHRlc3QsIGEgb25lLWxpbmUgc3VtbWFyeSB3aWxsIGJlCitwcmludGVkLiBBIGRldGFpbGVkIHJlcG9ydCBvZiB0aGUgdGVzdCBjYW4gYmUgZm91bmQgaW4KKzxjb2RlPlRFU1QtbXkudGVzdC5UZXN0Q2FzZS50eHQ8L2NvZGU+LiBUaGUgYnVpbGQgcHJvY2VzcyB3aWxsIGJlCitzdG9wcGVkIGlmIHRoZSB0ZXN0IGZhaWxzLjwvcD4KKworPHByZT4KKyZsdDtqdW5pdCBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIiZndDsKKyAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdHN9Ii8mZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvJmd0OworICAmbHQ7L2NsYXNzcGF0aCZndDsKKworICAmbHQ7Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8mZ3Q7CisKKyAgJmx0O3Rlc3QgbmFtZT0ibXkudGVzdC5UZXN0Q2FzZSIgaGFsdG9uZmFpbHVyZT0ibm8iIG91dGZpbGU9InJlc3VsdCImZ3Q7CisgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJ4bWwiLyZndDsKKyAgJmx0Oy90ZXN0Jmd0OworCisgICZsdDtiYXRjaHRlc3QgZm9yaz0ieWVzIiB0b2Rpcj0iJHtyZXBvcnRzLnRlc3RzfSImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3NyYy50ZXN0c30iJmd0OworICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKlRlc3QqLmphdmEiLyZndDsKKyAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqL0FsbFRlc3RzLmphdmEiLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDsvYmF0Y2h0ZXN0Jmd0OworJmx0Oy9qdW5pdCZndDsKKzwvcHJlPgorCis8cD5SdW5zIDxjb2RlPm15LnRlc3QuVGVzdENhc2U8L2NvZGU+IGluIHRoZSBzYW1lIFZNLCBpZ25vcmluZyB0aGUKK2dpdmVuIENMQVNTUEFUSDsgb25seSBhIHdhcm5pbmcgaXMgcHJpbnRlZCBpZiB0aGlzIHRlc3QgZmFpbHMuIEluCithZGRpdGlvbiB0byB0aGUgcGxhaW4gdGV4dCB0ZXN0IHJlc3VsdHMsIGZvciB0aGlzIHRlc3QgYSBYTUwgcmVzdWx0Cit3aWxsIGJlIG91dHB1dCB0byA8Y29kZT5yZXN1bHQueG1sPC9jb2RlPi4gIAorVGhlbiwgZm9yIGVhY2ggbWF0Y2hpbmcgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGRlZmluZWQgZm9yCis8Y29kZT4ke3NyYy50ZXN0c308L2NvZGU+IGEKK3Rlc3QgaXMgcnVuIGluIGEgc2VwYXJhdGUgVk0uIElmIGEgdGVzdCBmYWlscywgdGhlIGJ1aWxkIHByb2Nlc3MgaXMKK2Fib3J0ZWQuIFJlc3VsdHMgYXJlIGNvbGxlY3RlZCBpbiBmaWxlcyBuYW1lZAorPGNvZGU+VEVTVC08L2NvZGU+PGVtPm5hbWU8L2VtPjxjb2RlPi50eHQ8L2NvZGU+IGFuZCB3cml0dGVuIHRvCis8Y29kZT4ke3JlcG9ydHMudGVzdHN9PC9jb2RlPi48L3A+CisKKzxwcmU+CismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7dGVzdCZxdW90OyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtjb2xsZWN0b3IuZGlyJnF1b3Q7IHZhbHVlPSZxdW90OyR7YnVpbGQuZGlyfS9mYWlsaW5nVGVzdHMmcXVvdDsvJmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2NvbGxlY3Rvci5jbGFzcyZxdW90OyB2YWx1ZT0mcXVvdDtGYWlsZWRUZXN0cyZxdW90Oy8mZ3Q7CisgICAgJmx0OyEtLSBEZWxldGUgJ29sZCcgY29sbGVjdG9yIGNsYXNzZXMgLS0mZ3Q7CisgICAgJmx0O2RlbGV0ZSZndDsKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7Y29sbGVjdG9yLmRpcn0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7JHtjb2xsZWN0b3IuY2xhc3N9Ki5jbGFzcyZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9kZWxldGUmZ3Q7CisgICAgJmx0OyEtLSBjb21waWxlIHRoZSBGYWlsZWRUZXN0cyBjbGFzcyBpZiBwcmVzZW50IC0tJmd0OyAKKyAgICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7Y29sbGVjdG9yLmRpcn0mcXVvdDsgZGVzdGRpcj0mcXVvdDske2NvbGxlY3Rvci5kaXJ9JnF1b3Q7LyZndDsKKyAgICAmbHQ7YXZhaWxhYmxlIGZpbGU9JnF1b3Q7JHtjb2xsZWN0b3IuZGlyfS8ke2NvbGxlY3Rvci5jbGFzc30uY2xhc3MmcXVvdDsgcHJvcGVydHk9JnF1b3Q7aGFzRmFpbGluZ1Rlc3RzJnF1b3Q7LyZndDsKKyAgICAmbHQ7anVuaXQgaGFsdG9uZXJyb3I9JnF1b3Q7ZmFsc2UmcXVvdDsgaGFsdG9uZmFpbHVyZT0mcXVvdDtmYWxzZSZxdW90OyZndDsKKyAgICAgICAgJmx0O3N5c3Byb3BlcnR5IGtleT0mcXVvdDthbnQuanVuaXQuZmFpbHVyZUNvbGxlY3RvciZxdW90OyB2YWx1ZT0mcXVvdDske2NvbGxlY3Rvci5kaXJ9LyR7Y29sbGVjdG9yLmNsYXNzfSZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7JHtjb2xsZWN0b3IuZGlyfSZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAgICAgICAmbHQ7YmF0Y2h0ZXN0IHRvZGlyPSZxdW90OyR7Y29sbGVjdG9yLmRpcn0mcXVvdDsgdW5sZXNzPSZxdW90O2hhc0ZhaWxpbmdUZXN0cyZxdW90OyZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2NvbGxlY3Rvci5kaXJ9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90OyBleGNsdWRlcz0mcXVvdDsqKi8ke2NvbGxlY3Rvci5jbGFzc30uKiZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAmbHQ7IS0tIGZvciBpbml0aWFsIGNyZWF0aW9uIG9mIHRoZSBGYWlsaW5nVGVzdHMuamF2YSAtLSZndDsKKyAgICAgICAgICAgICZsdDtmb3JtYXR0ZXIgdHlwZT0mcXVvdDtmYWlsdXJlJnF1b3Q7LyZndDsKKyAgICAgICAgICAgICZsdDshLS0gSSB3YW50IHRvIHNlZSBzb21ldGhpbmcgLi4uIC0tJmd0OworICAgICAgICAgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSZxdW90O3BsYWluJnF1b3Q7IHVzZWZpbGU9JnF1b3Q7ZmFsc2UmcXVvdDsvJmd0OworICAgICAgICAmbHQ7L2JhdGNodGVzdCZndDsKKyAgICAgICAgJmx0O3Rlc3QgbmFtZT0mcXVvdDtGYWlsZWRUZXN0cyZxdW90OyBpZj0mcXVvdDtoYXNGYWlsaW5nVGVzdHMmcXVvdDsmZ3Q7CisgICAgICAgICAgICAmbHQ7IS0tIHVwZGF0ZSB0aGUgRmFpbGluZ1Rlc3RzLmphdmEgLS0mZ3Q7CisgICAgICAgICAgICAmbHQ7Zm9ybWF0dGVyIHR5cGU9JnF1b3Q7ZmFpbHVyZSZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAmbHQ7IS0tIGFnYWluLCBJIHdhbnQgdG8gc2VlIHNvbWV0aGluZyAtLSZndDsKKyAgICAgICAgICAgICZsdDtmb3JtYXR0ZXIgdHlwZT0mcXVvdDtwbGFpbiZxdW90OyB1c2VmaWxlPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0Oy90ZXN0Jmd0OworICAgICZsdDsvanVuaXQmZ3Q7CismbHQ7L3RhcmdldCZndDsKKzwvcHJlPgorPHA+T24gdGhlIGZpcnN0IHJ1biBhbGwgdGVzdHMgYXJlIGNvbGxlY3RlZCB2aWEgdGhlIDxjb2RlPiZsdDtiYXRjaHRlc3QvJmd0OzwvY29kZT4KK2VsZW1lbnQuIEl0J3MgPGNvZGU+cGxhaW48L2NvZGU+IGZvcm1hdHRlciBzaG93cyB0aGUgb3V0cHV0IG9uIHRoZSBjb25zb2xlLiBUaGUKKzxjb2RlPmZhaWx1cmU8L2NvZGU+IGZvcm1hdHRlciBjcmVhdGVzIGEgamF2YSBzb3VyY2UgZmlsZSBpbiAKKzxjb2RlPiR7YnVpbGQuZGlyfS9mYWlsaW5nVGVzdHMvRmFpbGVkVGVzdHMuamF2YTwvY29kZT4gd2hpY2ggZXh0ZW5kcyAKKzxjb2RlPmp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTwvY29kZT4gYW5kIHJldHVybnMgZnJvbSBhIDxjb2RlPnN1aXRlKCk8L2NvZGU+CittZXRob2QgYSB0ZXN0IHN1aXRlIGZvciB0aGUgZmFpbGluZyB0ZXN0cy4gPGJyLz4KK09uIGEgc2Vjb25kIHJ1biB0aGUgY29sbGVjdG9yIGNsYXNzIGV4aXN0cyBhbmQgaW5zdGVhZCBvZiB0aGUgPGNvZGU+Jmx0O2JhdGNodGVzdC8mZ3Q7PC9jb2RlPgordGhlIHNpbmdsZSA8Y29kZT4mbHQ7dGVzdC8mZ3Q7PC9jb2RlPiB3aWxsIHJ1bi4gU28gb25seSB0aGUgZmFpbGluZyB0ZXN0IGNhc2VzIGFyZSByZS1ydW4uCitUaGUgdHdvIG5lc3RlZCBmb3JtYXR0ZXJzIGFyZSBmb3IgZGlzcGxheWluZyAoZm9yIHRoZSB1c2VyKSBhbmQgZm9yIHVwZGF0aW5nIHRoZSBjb2xsZWN0b3IKK2NsYXNzLgorPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvanVuaXRyZXBvcnQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvanVuaXRyZXBvcnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTg2ZDdkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9qdW5pdHJlcG9ydC5odG1sCkBAIC0wLDAgKzEsMjA1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5KVW5pdFJlcG9ydCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJqdW5pdHJlcG9ydCI+SlVuaXRSZXBvcnQ8L2E+PC9oMj4KK01lcmdlIHRoZSBpbmRpdmlkdWFsIFhNTCBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIEpVbml0IHRhc2sgYW5kIGV2ZW50dWFsbHkgYXBwbHkKK2Egc3R5bGVzaGVldCBvbiB0aGUgcmVzdWx0aW5nIG1lcmdlZCBkb2N1bWVudCB0byBwcm92aWRlIGEgYnJvd3NhYmxlIHJlcG9ydCBvZgordGhlIHRlc3RjYXNlcyByZXN1bHRzLgorPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluCit0aGUgQW50IGRpc3RyaWJ1dGlvbi4gIFNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+CitMaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorCis8aDM+UmVxdWlyZW1lbnRzPC9oMz4KKworPHA+VGhlIHRhc2sgbmVlZHMgQXBhY2hlIDxhCitocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai8iPlhhbGFuIDIuNC4xKyBvciBYYWxhbiBYU0xUQzwvYT4KKyhKREsgMS40IGNvbnRhaW5zIGEgdmVyc2lvbiBvZiBYYWxhbi1KIDIueCB3aGlsZSBKREsgMS41IHNoaXBzIHdpdGggYQordmVyc2lvbiBvZiBYU0xUQykuIFN0YXJ0aW5nIGZyb20gSkRLIDEuNC4yLTAxIGl0IHNoaXBzIHdpdGggYSBidW5kbGVkCitYYWxhbi1KIDIuNC4xKywgbWVhbmluZyB0aGF0IEpESyB2ZXJzaW9uIHByaW9yIHRvIDEuNC4yLTAxIHdvbid0IHdvcmsKK291dCBvZiB0aGUgYm94LiBUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXplIHRoZSBjb21wYXRpYmlsaXR5IHN0YXR1cy4gCis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRyPjx0aD5YYWxhbjwvdGg+PHRoPlN1biBKREsgQnVuZGxlPC90aD48dGg+U3RhdHVzPHRoPjwvdHI+IAorPHRyPjx0ZD4yLjQuMSs8L3RkPjx0ZD5KREsgMS40LjItMDErPC90ZD48dGQ+T0s8L3RkPjwvdHI+Cis8dHI+PHRkPlhTTFRDPC90ZD48dGQ+SkRLIDEuNS54PC90ZD48dGQ+T0s8L3RkPjwvdHI+Cis8dHI+PHRkPjIueDwvdGQ+PHRkPkpESyAxLjQueDwvdGQ+PHRkPkRFUFJFQ0FURUQ8YnI+PGk+VXNlICR7YW50LmhvbWV9L2V0Yy9qdW5pdC1mcmFtZXMteGFsYW4xLnhzbAorPGJyPiBVcGdyYWRlIFhhbGFuIHVzaW5nIHRoZSBKREsgZW5kb3JzZW1lbnQgbWVjaGFuaXNtPC9pPjwvdGQ+PC90cj4KKzwvdGFibGU+CisKKzxwPldpdGggQW50IDEuNi4yIHdlIGhhZCB0byBkZWNpZGUgYmV0d2VlbiBzdXBwb3J0aW5nIFhhbGFuLUogMS9YYWxhbiBKIDIuNC4xLQorYW5kIFhhbGFuIDIuNC4xKy9YU0xUQywgc2luY2UgdGhlcmUgd2FzIG5vIHdheSB0byBzdXBwb3J0IGJvdGggY291cGxlcyBhdCB0aGUgc2FtZQordGltZS48L3A+Cis8cD5XaXRoIEFudCAxLjcgd2UgaGFkIHRvIGRyb3Agc3VwcG9ydCBYYWxhbi1KIDEsIHNpbmNlIFhhbGFuLUogMSBoYXMgbm90IAorYXZhaWxhYmxlIGFueW1vcmUgZm9yIHF1aXRlIHNvbWUgdGltZS48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRvZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgWE1MIGZpbGUgdGhhdCB3aWxsIGFnZ3JlZ2F0ZSBhbGwgaW5kaXZpZHVhbAorICAgICAgWE1MIHRlc3RzdWl0ZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBieSB0aGUgSlVuaXQgdGFzay48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uIERlZmF1bHQgdG8gVEVTVFMtVGVzdFN1aXRlcy54bWw8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50b2RpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IHdoZXJlIHNob3VsZCBiZSB3cml0dGVuIHRoZSBmaWxlIHJlc3VsdGluZworICAgICAgZnJvbSB0aGUgaW5kaXZpZHVhbCBYTUwgdGVzdHN1aXRlIGFnZ3JlZ2F0aW9uLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5Oby4gRGVmYXVsdCB0byBjdXJyZW50IGRpcmVjdG9yeTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPjxhIG5hbWU9Im5lc3RlZCI+TmVzdGVkIEVsZW1lbnRzPC9hPjwvaDM+Cis8aDQ+ZmlsZXNldDwvaDQ+Cis8cD48Y29kZT5qdW5pdHJlcG9ydDwvY29kZT4gY29sbGVjdHMgaW5kaXZpZHVhbCB4bWwgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBKVW5pdAordGFzayB1c2luZyB0aGUgbmVzdGVkIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPjxjb2RlPiZsdDtGaWxlU2V0Jmd0OzwvY29kZT48L2E+CitlbGVtZW50LjwvcD4KKzxoND5yZXBvcnQ8L2g0PgorPHA+R2VuZXJhdGUgYSBicm93c2FibGUgcmVwb3J0IGJhc2VkIG9uIHRoZSBkb2N1bWVudCBjcmVhdGVkIGJ5IHRoZSBtZXJnZS48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JtYXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIHJlcG9ydC4gTXVzdCBiZSAmcXVvdDtub2ZyYW1lcyZxdW90OworICAgICAgb3IgJnF1b3Q7ZnJhbWVzJnF1b3Q7LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCB0byAmcXVvdDtmcmFtZXMmcXVvdDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdHlsZWRpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzdHlsZXNoZWV0cyBhcmUgZGVmaW5lZC4gVGhleSBtdXN0CisgICAgICBiZSBjb25mb3JtaW5nIHRvIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6CisgICAgICA8dWw+CisgICAgICAgIDxsaT5mcmFtZXMgZm9ybWF0OiB0aGUgc3R5bGVzaGVldCBtdXN0IGJlIG5hbWVkIDxpPmp1bml0LWZyYW1lcy54c2w8L2k+LjwvbGk+CisgICAgICAgIDxsaT5ub2ZyYW1lcyBmb3JtYXQ6IHRoZSBzdHlsZXNoZWV0IG11c3QgYmUgbmFtZWQgPGk+anVuaXQtbm9mcmFtZXMueHNsPC9pPi48L2xpPgorICAgICAgPC91bD4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uIERlZmF1bHQgdG8gZW1iZWRkZWQgc3R5bGVzaGVldHMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZmlsZXMgcmVzdWx0aW5nIGZyb20gdGhlCisgICAgICB0cmFuc2Zvcm1hdGlvbiBzaG91bGQgYmUgd3JpdHRlbiB0by48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uIERlZmF1bHQgdG8gY3VycmVudCBkaXJlY3Rvcnk8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPiBBbnQgYXNzdW1lcyB0aGUgZm9sbG93aW5nIGNvbmNlcm5pbmcgdGhlIDx0dD5mcmFtZXM8L3R0PiBhbmQgPHR0Pm5vZnJhbWVzPC90dD4gZm9ybWF0cyA6PC9wPgorPHA+VGhlIDx0dD5mcmFtZXM8L3R0PiBmb3JtYXQgdXNlcworYSBzdHlsZXNoZWV0IHdoaWNoIGlzIGdlbmVyYXRpbmcgb3V0cHV0IDxlbT5vbmx5PC9lbT4gYnkgcmVkaXJlY3RpbmcuPC9wPgorPHA+VGhlCis8dHQ+bm9mcmFtZXM8L3R0PiBmb3JtYXQgZG9lcyBub3QgdXNlIHJlZGlyZWN0aW5nIGFuZCBnZW5lcmF0ZXMgb25lCitmaWxlIGNhbGxlZCA8dHQ+anVuaXQtbm9mcmFtZXMuaHRtbDwvdHQ+LjwvcD4KKzxwPkN1c3RvbSB2ZXJzaW9ucyBvZiA8dHQ+anVuaXQtZnJhbWVzLnhzbDwvdHQ+IG9yIDx0dD5qdW5pdC1ub2ZyYW1lcy54c2w8L3R0PiBtdXN0IGFkaGVyZSB0byB0aGUgYWJvdmUgY29udmVudGlvbnMuPC9wPgorCis8aDM+TmVzdGVkIEVsZW1lbnQgb2YgdGhlIHJlcG9ydCB0YWc8L2gzPgorPGg0PnBhcmFtPC9oND4KKzxlbT5TaW5jZSBBbnQgMS43PC9lbT50aGUgcmVwb3J0IHRhZyBzdXBwb3J0cyBuZXN0ZWQgcGFyYW0gdGFncy4KK1RoZXNlIHRhZ3MgY2FuIHBhc3MgWFNMIHBhcmFtZXRlcnMgdG8gdGhlIHN0eWxlc2hlZXQuCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgd2lkdGg9IjYwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgdGhlIFhTTCBwYXJhbWV0ZXI8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhwcmVzc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UZXh0IHZhbHVlIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBwYXJhbS48YnI+CisgICAgV2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gYmUgYW4gWFNMIGV4cHJlc3Npb24uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmlmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXJhbSB3aWxsIG9ubHkgcGFzc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMgc2V0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcGFyYW0gd2lsbCBvbmx5IHBhc3NlZCB1bmxlc3MgdGhpcyBwcm9wZXJ0eSBpcyBzZXQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPlRoZSBidWlsdC1pbiBzdHlsZXNoZWV0cyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczo8L3A+Cis8dGFibGUgd2lkdGg9IjYwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5YU0wtUGFyYW1ldGVyPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VElUTEU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGl0bGUgdXNlZCBpbiAmbHQ7dGl0bGUmZ3Q7IGFuZCAmbHQ7aDEmZ3Q7IHRhZ3M8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uIERlZmF1bHRzIHRvIDxpPlVuaXQgVGVzdCBSZXN1bHRzLjwvaT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworCisKKzxoMz5FeGFtcGxlIG9mIHJlcG9ydDwvaDM+Cis8YmxvY2txdW90ZT4KKyAgPHByZT4mbHQ7anVuaXRyZXBvcnQgdG9kaXI9JnF1b3Q7Li9yZXBvcnRzJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7Li9yZXBvcnRzJnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7VEVTVC0qLnhtbCZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0O3JlcG9ydCBmb3JtYXQ9JnF1b3Q7ZnJhbWVzJnF1b3Q7IHRvZGlyPSZxdW90Oy4vcmVwb3J0L2h0bWwmcXVvdDsvJmd0OworJmx0Oy9qdW5pdHJlcG9ydCZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+d291bGQgZ2VuZXJhdGUgYSA8dHQ+VEVTVFMtVGVzdFN1aXRlcy54bWw8L3R0PiBmaWxlIGluIHRoZSBkaXJlY3RvcnkgPHR0PnJlcG9ydHM8L3R0PiBhbmQKK2dlbmVyYXRlIHRoZSBkZWZhdWx0IGZyYW1lZCByZXBvcnQgaW4gdGhlIGRpcmVjdG9yeSA8dHQ+cmVwb3J0L2h0bWw8L3R0Pi48L3A+Cis8aDM+RXhhbXBsZSBvZiByZXBvcnQgd2l0aCB4c2wgcGFyYW1zPC9oMz4KKzxibG9ja3F1b3RlPgorICA8cHJlPgorJmx0O2p1bml0cmVwb3J0IHRvZGlyPSIke291dHB1dGRpcn0iJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iJHtqcmRpcn0iJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJURVNULSoueG1sIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICZsdDtyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfS9odG1sIgorICAgICAgICBzdHlsZWRpcj0ianVuaXRyZXBvcnQiCisgICAgICAgIGZvcm1hdD0iZnJhbWVzIiZndDsKKyAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImtleTEiIGV4cHJlc3Npb249InZhbHVlMSIvJmd0OworICAgICAgICAmbHQ7cGFyYW0gbmFtZT0ia2V5MiIgZXhwcmVzc2lvbj0idmFsdWUyIi8mZ3Q7CisgICAgJmx0Oy9yZXBvcnQmZ3Q7CismbHQ7L2p1bml0cmVwb3J0Jmd0OworICA8L3ByZT4KKyAgPC9ibG9ja3F1b3RlPgorPHA+VGhpcyBleGFtcGxlIHJlcXVpcmVzIGEgZmlsZSBjYWxsZWQgPHR0Pmp1bml0cmVwb3J0L2p1bml0LWZyYW1lcy54c2w8L3R0Pi4KKyAgICBUaGUgWFNMIHBhcmFtZXRlcnMga2V5MSBhbmQga2V5MiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLjwvcD4KKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL21pbWVtYWlsLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL21pbWVtYWlsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2NTJkMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvbWltZW1haWwuaHRtbApAQCAtMCwwICsxLDExNSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5NaW1lTWFpbCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJtaW1lbWFpbCI+TWltZU1haWw8L2E+PC9oMj4KKworPGgzPjxpPkRlcHJlY2F0ZWQ8L2k+PC9oMz4KKzxwPjxpPlRoaXMgdGFzayBoYXMgYmVlbiBkZXByZWNhdGVkLiAgVXNlIHRoZSA8YSBocmVmPSIuLi9Db3JlVGFza3MvbWFpbC5odG1sIj5tYWlsPC9hPiB0YXNrIGluc3RlYWQuPC9pPjwvcD4KKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlNlbmRzIFNNVFAgbWFpbCB3aXRoIE1JTUUgYXR0YWNobWVudHMuCis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFtYWlsL2luZGV4Lmh0bWwiPkphdmFNYWlsPC9hPgorYW5kIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YWJlYW5zL2dsYXNnb3cvamFmLmh0bWwiPkphdmEKK0FjdGl2YXRpb24gRnJhbWV3b3JrPC9hPiBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgdGFzay48L3A+Cis8cD5NdWx0aXBsZSBmaWxlcyBjYW4gYmUgYXR0YWNoZWQgdXNpbmcgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldHMuPC9hPjwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1lc3NhZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG1lc3NhZ2UgYm9keTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5ObywgYnV0IG9ubHkgb25lIG9mIG9mICdtZXNzYWdlJyBvcgorICAgICAgJ21lc3NhZ2VGaWxlJyBtYXkgYmUgc3BlY2lmaWVkLiZuYnNwOyBJZiBub3Qgc3BlY2lmaWVkLCBhIGZpbGVzZXQgbXVzdCBiZQorICAgICAgcHJvdmlkZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZUZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmaWxlbmFtZSB0byByZWFkIGFuZCB1c2VkIGFzIHRoZSBtZXNzYWdlIGJvZHk8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tZXNzYWdlTWltZVR5cGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TUlNRSB0eXBlIHRvIHVzZSBmb3IgJ21lc3NhZ2UnIG9yICdtZXNzYWdlRmlsZScgd2hlbgorICAgICAgYXR0YWNoZWQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0cyB0byAidGV4dC9wbGFpbiI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50b2xpc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVG86IHJlY2lwaWVudHM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMyI+WWVzLCBhdCBsZWFzdCBvbmUgb2YgJ3RvbGlzdCcsICdjY2xpc3QnLAorICAgICAgb3IgJ2JjY2xpc3QnIG11c3QgYmUgc3BlY2lmaWVkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNjbGlzdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBDQzogcmVjaXBpZW50czwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iY2NsaXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIEJDQzogcmVjaXBpZW50czwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5tYWlsaG9zdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Ib3N0IG5hbWUgb2YgdGhlIG1haWwgc2VydmVyLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCB0byAmcXVvdDtsb2NhbGhvc3QmcXVvdDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdWJqZWN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkVtYWlsIHN1YmplY3QgbGluZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mcm9tPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkVtYWlsIGFkZHJlc3Mgb2Ygc2VuZGVyLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGFuIGVycm9yIG9jY3VycyBzZW5kaW5nIHRoZQorICAgICAgZS1tYWlsLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCB0byAmcXVvdDt0cnVlJnF1b3Q7PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPHA+PGI+U2VuZCBhIHNpbmdsZSBIVE1MIGZpbGUgYXMgdGhlIGJvZHkgb2YgYSBtZXNzYWdlPC9iPjwvcD4KKzxwcmU+ICAgICZsdDttaW1lbWFpbCBtZXNzYWdlTWltZVR5cGU9JnF1b3Q7dGV4dC9odG1sJnF1b3Q7IG1lc3NhZ2VGaWxlPSZxdW90O292ZXJ2aWV3LXN1bW1hcnkuaHRtbCZxdW90OworICAgICAgICB0b2xpc3Q9JnF1b3Q7eW91JnF1b3Q7IHN1YmplY3Q9JnF1b3Q7SlVuaXQgVGVzdCBSZXN1bHRzOiAke1RPREFZfSZxdW90OyBmcm9tPSZxdW90O21lJnF1b3Q7LyZndDs8L3ByZT4KKzxwPjxiPlNlbmRzIGFsbCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBhcyBhdHRhY2htZW50czwvYj48L3A+Cis8cHJlPiAgICAmbHQ7bWltZW1haWwgbWVzc2FnZT0mcXVvdDtTZWUgYXR0YWNoZWQgZmlsZXMmcXVvdDsgdG9saXN0PSZxdW90O3lvdSZxdW90OyBzdWJqZWN0PSZxdW90O0F0dGFjaG1lbnRzJnF1b3Q7IGZyb209JnF1b3Q7bWUmcXVvdDsmZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtkaXN0LyouKiZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDsvZmlsZXNldCZndDsKKyAgICAmbHQ7L21pbWVtYWlsJmd0OworPC9wcmU+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL25hdGl2ZTJhc2NpaS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9uYXRpdmUyYXNjaWkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQwZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9uYXRpdmUyYXNjaWkuaHRtbApAQCAtMCwwICsxLDIxMiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisgIDxoZWFkPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+TmF0aXZlMkFzY2lpIFRhc2s8L3RpdGxlPjwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgyPk5hdGl2ZTJBc2NpaTwvaDI+CisKKyAgICA8aDM+RGVzY3JpcHRpb246PC9oMz4KKworICAgIDxwPgorICAgICAgQ29udmVydHMgZmlsZXMgZnJvbSBuYXRpdmUgZW5jb2RpbmdzIHRvIEFTQ0lJIHdpdGggZXNjYXBlZCBVbmljb2RlLgorICAgICAgQSBjb21tb24gdXNhZ2UgaXMgdG8gY29udmVydCBzb3VyY2UgZmlsZXMgbWFpbnRhaW5lZCBpbiBhIG5hdGl2ZQorICAgICAgb3BlcmF0aW5nIHN5c3RlbSBlbmNvZGluZywgdG8gQVNDSUkgcHJpb3IgdG8gY29tcGlsYXRpb24uCisgICAgPC9wPgorCisgICAgPHA+CisgICAgICBGaWxlcyBpbiB0aGUgZGlyZWN0b3J5IDxlbT5zcmM8L2VtPgorICAgICAgYXJlIGNvbnZlcnRlZCBmcm9tIGEgbmF0aXZlIGVuY29kaW5nIHRvIEFTQ0lJLgorICAgICAgQnkgZGVmYXVsdCwgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgYXJlIGNvbnZlcnRlZC4KKyAgICAgIEhvd2V2ZXIsIGNvbnZlcnNpb24gbWF5IGJlIGxpbWl0ZWQgdG8gc2VsZWN0ZWQgZmlsZXMgdXNpbmcKKyAgICAgIDxlbT5pbmNsdWRlczwvZW0+IGFuZCA8ZW0+ZXhjbHVkZXM8L2VtPiBhdHRyaWJ1dGVzLgorICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZmlsZSBtYXRjaGluZyBwYXR0ZXJucywKKyAgICAgIHNlZSB0aGUgc2VjdGlvbiBvbgorICAgICAgPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LgorICAgICAgSWYgbm8gPGVtPmVuY29kaW5nPC9lbT4gaXMgc3BlY2lmaWVkLAorICAgICAgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBKVk0gaXMgdXNlZC4KKyAgICAgIElmIDxlbT5leHQ8L2VtPiBpcyBzcGVjaWZpZWQsIHRoZW4gb3V0cHV0IGZpbGVzIGFyZSByZW5hbWVkCisgICAgICB0byB1c2UgaXQgYXMgYSBuZXcgZXh0ZW5zaW9uLgorICAgICAgTW9yZSBzb3BoaXN0aWNhdGVkIGZpbGUgbmFtZSB0cmFuc2xhdGlvbnMgY2FuIGJlIGFjaGlldmVkIHVzaW5nIGEgbmVzdGVkCisgICAgICA8ZW0+PGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+PC9lbT4gZWxlbWVudC4gQnkgZGVmYXVsdCBhbgorICAgICAgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL21hcHBlci5odG1sI2lkZW50aXR5LW1hcHBlciI+aWRlbnRpdHkgbWFwcGVyPC9hPiB3aWxsIGJlIHVzZWQuCisgICAgICBJZiA8ZW0+ZGVzdDwvZW0+IGFuZCA8ZW0+c3JjPC9lbT4gcG9pbnQgdG8gdGhlIHNhbWUgZGlyZWN0b3J5LAorICAgICAgdGhlIDxlbT5leHQ8L2VtPiBhdHRyaWJ1dGUgb3IgYSBuZXN0ZWQgPGVtPjxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPjwvZW0+CisgICAgICBpcyByZXF1aXJlZC4KKyAgICA8L3A+CisKKyAgICA8cD4KKyAgICAgIFRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlIFNldDwvYT4sCisgICAgICBhbmQgc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgorICAgICAgKDxjb2RlPmRpcjwvY29kZT4gYmVjb21lcyA8Y29kZT5zcmM8L2NvZGU+KSBhcyB3ZWxsIGFzCisgICAgICBuZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiwKKyAgICAgIGFuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLgorICAgIDwvcD4KKworICAgIDxwPkl0IGlzIHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgY29udmVydGVycy4gVGhpcyBjYW4gYmUgc2VsZWN0ZWQKKyAgICAgIHdpdGggdGhlIDxjb2RlPmltcGxlbWVudGF0aW9uPC9jb2RlPiBhdHRyaWJ1dGUuCisgICAgICA8YSBuYW1lPSJpbXBsZW1lbnRhdGlvbnZhbHVlcyI+SGVyZSBhcmUgdGhlIGNob2ljZXM8L2E+OjwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+ZGVmYXVsdCAtIHRoZSBkZWZhdWx0IGNvbnZlcnRlciAoa2FmZmUgb3Igc3VuKSBmb3IgdGhlIHBsYXRmb3JtLjwvbGk+CisgICAgICA8bGk+c3VuICh0aGUgc3RhbmRhcmQgY29udmVydGVyIG9mIHRoZSBKREspPC9saT4KKyAgICAgIDxsaT5rYWZmZSAodGhlIHN0YW5kYXJkIGNvbnZlcnRlciBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmthZmZlLm9yZyIgdGFyZ2V0PSJfdG9wIj5LYWZmZTwvYT4pPC9saT4KKyAgICA8L3VsPgorCisgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICA8dGQ+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+cmV2ZXJzZTwvdGQ+CisgICAgICAgIDx0ZD5SZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgY29udmVyc2lvbiwKKyAgICAgICAgICBpLmUuIGNvbnZlcnQgZnJvbSBBU0NJSSB0byBuYXRpdmUgPGI+b25seSBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICAgICAgICBzdW4gY29udmVydGVyPC9iPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+ZW5jb2Rpbmc8L3RkPgorICAgICAgICA8dGQ+VGhlIG5hdGl2ZSBlbmNvZGluZyB0aGUgZmlsZXMgYXJlIGluCisgICAgICAgICAgKGRlZmF1bHQgaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBKVk0pPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5zcmM8L3RkPgorICAgICAgICA8dGQ+VGhlIGRpcmVjdG9yeSB0byBmaW5kIGZpbGVzIGluIChkZWZhdWx0IGlzIDxlbT5iYXNlZGlyPC9lbT4pPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5kZXN0PC90ZD4KKyAgICAgICAgPHRkPlRoZSBkaXJlY3RvcnkgdG8gb3V0cHV0IGZpbGUgdG88L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5leHQ8L3RkPgorICAgICAgICA8dGQ+RmlsZSBleHRlbnNpb24gdG8gdXNlIGluIHJlbmFtaW5nIG91dHB1dCBmaWxlczwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICAgICAgPHRkPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90CisgICAgICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuCisgICAgICAgICAgRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgICAgICA8dGQ+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgICAgIGluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgICAgIDx0ZD50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmV4Y2x1ZGVzPC90ZD4KKyAgICAgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuCisgICAgICAgICAgTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICAgICAgPHRkPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcworICAgICAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmltcGxlbWVudGF0aW9uPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29udmVydGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS4KKyAgICAgICAgICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGUgZGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZQorICAgICAgICAgIGN1cnJlbnQgVk0gd2lsbCBiZSB1c2VkLiAgKFNlZSB0aGUgYWJvdmUgPGEKKyAgICAgICAgICBocmVmPSIjaW1wbGVtZW50YXRpb252YWx1ZXMiPmxpc3Q8L2E+IG9mIHZhbGlkIGNvbnZlcnRlcnMuKTwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPGg0PmFyZzwvaDQ+CisKKzxwPllvdSBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjb252ZXJ0ZXIKK3dpdGggbmVzdGVkIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gIFRoZXNlIGVsZW1lbnRzIGFyZQorc3BlY2lmaWVkIGxpa2UgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+CitidXQgaGF2ZSBhbiBhZGRpdGlvbmFsIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBhcmd1bWVudHMKK29ubHkgaWYgYSBnaXZlbiBjb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjQiPlNlZQorICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSI0Ij5FeGFjdGx5IG9uZSBvZiB0aGVzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5saW5lPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGg8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbXBsZW1lbnRhdGlvbjwvdGQ+CisgICAgPHRkPk9ubHkgcGFzcyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IGlmIHRoZSBjaG9zZW4gY29udmVydGVyCisgICAgaW1wbGVtZW50YXRpb24gbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUuICBMZWdhbCB2YWx1ZXMKKyAgICBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgaW4gdGhlIGFib3ZlIDxhCisgICAgaHJlZj0iI2ltcGxlbWVudGF0aW9udmFsdWVzIj5saXN0PC9hPiBvZiB2YWxpZCBjb21waWxlcnMuKTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKyAgICA8aDM+RXhhbXBsZXM8L2gzPgorCisgICAgPHByZT4KKyZsdDtuYXRpdmUyYXNjaWkgZW5jb2Rpbmc9JnF1b3Q7RVVDSklTJnF1b3Q7IHNyYz0mcXVvdDtzcmNkaXImcXVvdDsgZGVzdD0mcXVvdDtzcmNkaXImcXVvdDsKKyAgIGluY2x1ZGVzPSZxdW90OyoqLyouZXVjamlzJnF1b3Q7IGV4dD0mcXVvdDsuamF2YSZxdW90Oy8mZ3Q7CisgICAgPC9wcmU+CisKKyAgICA8cD4KKyAgICAgIENvbnZlcnRzIGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IDxlbT5zcmNkaXI8L2VtPgorICAgICAgZW5kaW5nIGluIDxjb2RlPi5ldWNqaXM8L2NvZGU+IGZyb20gdGhlIEVVQ0pJUyBlbmNvZGluZyB0byBBU0NJSQorICAgICAgYW5kIHJlbmFtZXMgdGhlbSB0byBlbmQgaW4gPGNvZGU+LmphdmE8L2NvZGU+LgorICAgIDwvcD4KKworPHByZT4KKyZsdDtuYXRpdmUyYXNjaWkgZW5jb2Rpbmc9JnF1b3Q7RVVDSklTJnF1b3Q7IHNyYz0mcXVvdDtuYXRpdmUvamFwYW5lc2UmcXVvdDsgZGVzdD0mcXVvdDtzcmMmcXVvdDsKKyAgIGluY2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKworICAgIDxwPgorICAgICAgQ29udmVydHMgYWxsIHRoZSBmaWxlcyBlbmRpbmcgaW4gPGNvZGU+LmphdmE8L2NvZGU+CisgICAgICBpbiB0aGUgZGlyZWN0b3J5IDxlbT5uYXRpdmUvamFwYW5lc2U8L2VtPiB0byBBU0NJSSwKKyAgICAgIHBsYWNpbmcgdGhlIHJlc3VsdHMgaW4gdGhlIGRpcmVjdG9yeSA8ZW0+c3JjPC9lbT4uCisgICAgICBUaGUgbmFtZXMgb2YgdGhlIGZpbGVzIHJlbWFpbiB0aGUgc2FtZS4KKyAgICA8L3A+CisgIDwvYm9keT4KKworPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9uZXRyZXh4Yy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9uZXRyZXh4Yy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMmUyMzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL25ldHJleHhjLmh0bWwKQEAgLTAsMCArMSwzMzAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+TmV0UmV4eEMgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ibmV0cmV4eGMiPk5ldFJleHhDPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+Q29tcGlsZXMgYSA8YSBocmVmPSJodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vbmV0cmV4eCIgdGFyZ2V0PSJfdG9wIj5OZXRSZXh4PC9hPgorc291cmNlIHRyZWUgd2l0aGluIHRoZSBydW5uaW5nIChBbnQpIFZNLjwvcD4KKzxwPlRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aWxsIGJlIHJlY3Vyc2l2ZWx5IHNjYW5uZWQgZm9yCitOZXRSZXh4IHNvdXJjZSBmaWxlcyB0byBjb21waWxlLiAgT25seSBOZXRSZXh4IGZpbGVzIHRoYXQgaGF2ZSBubyBjb3JyZXNwb25kaW5nCitjbGFzcyBmaWxlIG9yIHdoZXJlIHRoZSBjbGFzcyBmaWxlIGlzIG9sZGVyIHRoYW4gdGhlIGphdmEgZmlsZSB3aWxsIGJlIGNvbXBpbGVkLjwvcD4KKzxwPkZpbGVzIGluIHRoZSBzb3VyY2UgdHJlZSBhcmUgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksCithbGxvd2luZyBzdXBwb3J0IGZpbGVzIHRvIGJlIGxvY2F0ZWQgcHJvcGVybHkgaW4gdGhlIGNsYXNzcGF0aC4gVGhlIHNvdXJjZQorZmlsZXMgYXJlIGNvcGllZCBiZWNhdXNlIHRoZSBOZXRSZXh4IGNvbXBpbGVyIGNhbm5vdCBwcm9kdWNlIGNsYXNzIGZpbGVzIGluIGEKK3NwZWNpZmljIGRpcmVjdG9yeSB2aWEgcGFyYW1ldGVyczwvcD4KKzxwPlRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgdHJlZSBzaG91bGQgZm9sbG93IHRoZSBwYWNrYWdlCitoaWVyYXJjaHkuPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgY29tcGlsZWQvY29waWVkLgorVGhpcyBjYW4gYmUgZG9uZSB3aXRoIHRoZSA8aT5pbmNsdWRlczwvaT4sIDxpPmluY2x1ZGVzZmlsZTwvaT4sIDxpPmV4Y2x1ZGVzPC9pPiwgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhbmQKKzxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlcy4gV2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+IG9yIDxpPmluY2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIHlvdQorc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlCis8aT5leGNsdWRlPC9pPiBvciA8aT5leGNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUKK2V4Y2x1ZGVkLiAgVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gIEFuZCBmaW5hbGx5IHdpdGggdGhlCis8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91Cit3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24gb24gPGEKK2hyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy48L3A+Cis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCitzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+CisoPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPnNyY2RpcjwvY29kZT4pIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAorPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKKzxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorPHA+QWxsIHByb3BlcnRpZXMgZXhjZXB0IGNsYXNzcGF0aCwgc3JjZGlyIGFuZCBkZXN0RGlyIGFyZSBhbHNvIGF2YWlsYWJsZSBhcyBwcm9wZXJ0aWVzIGluIHRoZSBmb3JtCis8Y29kZT5hbnQubmV0cmV4eGMuPGk+YXR0cmlidXRlbmFtZTwvaT48L2NvZGU+LCBlZy48YnI+Cis8Y29kZT4mbHQ7cHJvcGVydHkgbmFtZT0iYW50Lm5ldHJleHhjLnZlcmJvc2UiIHZhbHVlPSJub3ZlcmJvc2UiLyZndDs8L2NvZGU+PGJyPgorb3IgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFzPGJyPgorPGNvZGU+YW50IC1EYW50Lm5ldHJleHhjLnZlcmJvc2U9bm92ZXJib3NlIC4uLjwvY29kZT4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YmluYXJ5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgbGl0ZXJhbHMgYXJlIHRyZWF0ZWQgYXMgdGhlIGphdmEgYmluYXJ5CisgICAgICB0eXBlIHJhdGhlciB0aGFuIHRoZSBOZXRSZXh4IHR5cGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlIGR1cmluZyBjb21waWxhdGlvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1lbnRzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgY29tbWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZQorICAgICAgZ2VuZXJhdGVkIGphdmEgc291cmNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcGFjdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGVycm9yIG1lc3NhZ2VzIGNvbWUgb3V0IGluIGNvbXBhY3Qgb3IKKyAgICAgIHZlcmJvc2UgZm9ybWF0LiBEZWZhdWx0IGlzIHRoZSBjb21wYWN0IGZvcm1hdC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGNvbXBpbGUgdGhlCisgICAgICBnZW5lcmF0ZWQgamF2YSBjb2RlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29uc29sZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIG9yIG5vdCBtZXNzYWdlcyBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZQorICAgICAgJ2NvbnNvbGUnPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y3Jvc3NyZWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB2YXJpYWJsZSBjcm9zcyByZWZlcmVuY2VzIGFyZSBnZW5lcmF0ZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWNpbWFsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgZGVjaW1hbCBhcml0aG1ldGljIHNob3VsZCBiZSB1c2VkIGZvciB0aGUKKyAgICAgIE5ldFJleHggY29kZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdAorICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbgorICAgICAgb21pdHRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0RGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgTmV0UmV4eAorICAgICAgc291cmNlIGZpbGVzIHNob3VsZCBiZSBjb3BpZWQgYW5kIHRoZW4gY29tcGlsZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlhZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGUgaXMKKyAgICAgIGdlbmVyYXRlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuCisgICAgICBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4cGxpY2l0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdmFyaWFibGVzIG11c3QgYmUgZGVjbGFyZWQgZXhwbGljaXRseQorICAgICAgYmVmb3JlIHVzZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcm1hdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBjb2RlIGlzIGZvcm1hdHRlZCBuaWNlbHkKKyAgICAgIG9yIGxlZnQgdG8gbWF0Y2ggTmV0UmV4eCBsaW5lIG51bWJlcnMgZm9yIGNhbGwgc3RhY2sgZGVidWdnaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmphdmE8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZSBpcyBwcm9kdWNlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBzb3VyY2UgZmlsZSBzaG91bGQgYmUga2VwdAorICAgICAgYWZ0ZXIgY29tcGlsYXRpb24uIFRoZSBnZW5lcmF0ZWQgZmlsZXMgd2lsbCBoYXZlIGFuIGV4dGVuc2lvbiBvZgorICAgICAgLmphdmEua2VlcCwgPGI+bm90PC9iPiAuamF2YTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxvZ288L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGUgY29tcGlsZXIgdGV4dCBsb2dvIGlzIGRpc3BsYXllZCB3aGVuCisgICAgICBjb21waWxpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXBsYWNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIGdlbmVyYXRlZCAuamF2YSBmaWxlIHNob3VsZCBiZSByZXBsYWNlZAorICAgICAgd2hlbiBjb21waWxpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zYXZlbG9nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIGNvbXBpbGVyIG1lc3NhZ2VzIHdpbGwgYmUgd3JpdHRlbiB0bworICAgICAgTmV0UmV4eEMubG9nIGFzIHdlbGwgYXMgdG8gdGhlIGNvbnNvbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2VkaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdG8gc3RvcmUgdGhlIGNsYXNzIGZpbGVzIGluIHRoZQorICAgICAgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIHNvdXJjZSBmaWxlcy4gVGhlIGFsdGVybmF0aXZlIGlzIHRoZSB3b3JraW5nCisgICAgICBkaXJlY3Rvcnk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNEaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IHRoZSBzb3VyY2UgZGlyIHRvIGZpbmQgdGhlIHNvdXJjZSBOZXRSZXh4CisgICAgICBmaWxlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdHJpY3RhcmdzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRoYXQgbWV0aG9kIGNhbGxzIGFsd2F5cworICAgICAgbmVlZCBwYXJlbnRoZXNlcywgZXZlbiBpZiBubyBhcmd1bWVudHMgYXJlIG5lZWRlZCwgZS5nLgorICAgICAgPGNvZGU+YVN0cmluZ1Zhci5nZXRCeXRlczwvY29kZT4gdnMuCisgICAgICA8Y29kZT5hU3RyaW5nVmFyLmdldEJ5dGVzKCk8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3RyaWN0YXNzaWduPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGUgdGhhdCBhc3NpZ25tZW50cyBtdXN0CisgICAgICBtYXRjaCBleGFjdGx5IG9uIHR5cGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdHJpY3RjYXNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB3aGV0aGVyIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHNob3VsZCBiZQorICAgICAgY2FzZSBzZW5zaXRpdmUgb3Igbm90PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3RyaWN0aW1wb3J0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgY2xhc3NlcyBuZWVkIHRvIGJlIGltcG9ydGVkIGV4cGxpY2l0bHkgdXNpbmcgYW4KKyAgICAgIDxjb2RlPmltcG9ydDwvY29kZT4gc3RhdGVtZW50LiAgQnkgZGVmYXVsdCB0aGUgTmV0UmV4eCBjb21waWxlciB3aWxsCisgICAgICBpbXBvcnQgY2VydGFpbiBwYWNrYWdlcyBhdXRvbWF0aWNhbGx5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3RyaWN0cHJvcHM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBsb2NhbCBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgcXVhbGlmaWVkCisgICAgICBleHBsaWNpdGx5IHVzaW5nIDxjb2RlPnRoaXM8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3RyaWN0c2lnbmFsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIGNvbXBpbGVyIHNob3VsZCBmb3JjZSBjYXRjaGluZyBvZgorICAgICAgZXhjZXB0aW9ucyBieSBleHBsaWNpdGx5IG5hbWVkIHR5cGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3ltYm9sczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGRlYnVnIHN5bWJvbHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbnRvIHRoZQorICAgICAgY2xhc3MgZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QXNrcyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBwcmludCBjb21waWxhdGlvbgorICAgICAgdGltZXMgdG8gdGhlIGNvbnNvbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50cmFjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UdXJucyBvbiBvciBvZmYgdHJhY2luZyBhbmQgZGlyZWN0cyB0aGUgcmVzdWx0YW50CisgICAgICB0cmFjZSBvdXRwdXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51dGY4PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRoYXQgdGhlIHNvdXJjZSBpcyBpbiBVVEY4PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGxvdHMgb2Ygd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZAorICAgICAgYmUgZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3VwcHJlc3NNZXRob2RBcmd1bWVudE5vdFVzZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCB0aGUKKyAgICAgICZhbXA7TWV0aG9kIGFyZ3VtZW50IG5vdCB1c2VkJmFtcDsgbWVzc2FnZXMgaW4gc3RyaWN0YXJncyBtb2RlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN1cHByZXNzUHJpdmF0ZVByb3BlcnR5Tm90VXNlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZQorICAgICAgJmFtcDtQcml2YXRlIFByb3BlcnR5IGRlZmluZWQsIGJ1dCBub3QgdXNlZCZhbXA7IG1lc3NhZ2VzIGluIHN0cmljdGFyZ3MgbW9kZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zdXBwcmVzc1ZhcmlhYmxlTm90VXNlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZQorICAgICAgJmFtcDtWYXJpYWJsZSBzZXQgYnV0IG5vdCB1c2VkJmFtcDsgbWVzc2FnZXMgaW4gc3RyaWN0YXJncyBtb2RlLgorICAgICAgUGxlYXNlIGJlIGNhcmVmdWwgd2l0aCB0aGlzIG9uZSwgYXMgeW91IGNhbiBoaWRlIGVycm9ycyBiZWhpbmQgaXQhPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3VwcHJlc3NFeGNlcHRpb25Ob3RTaWduYWxsZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCB0aGUKKyAgICAgICZhbXA7RXhjZXB0aW9uIGlzIGRlY2xhcmVkLCBidXQgbm90IHNpZ25hbGVkIHdpdGhpbiB0aGUgbWV0aG9kJmFtcDsKKyAgICAgIG1lc3NhZ2VzIGluIHN0cmljdHNpZ25hbCBtb2RlLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN1cHByZXNzRGVwcmVjYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCBhbnkgZGVwcmVjYXRpb24tbWVzc2FnZXMKKyAgICAgIG9mIHRoZSBjb21waWxlciBvdXQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+CisgIDxwPjxjb2RlPiZsdDtuZXRyZXh4YyBzcmNEaXI9JnF1b3Q7L3NvdXJjZS9wcm9qZWN0JnF1b3Q7CisgICAgICAgICAgIGluY2x1ZGVzPSZxdW90O3Zuci91dGlsLyomcXVvdDsKKyAgICAgICAgICAgZGVzdERpcj0mcXVvdDsvc291cmNlL3Byb2plY3QvYnVpbGQmcXVvdDsKKyAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90Oy9zb3VyY2UvcHJvamVjdDIvcHJvai5qYXImcXVvdDsKKyAgICAgICAgICAgY29tbWVudHM9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgICBjcm9zc3JlZj0mcXVvdDtmYWxzZSZxdW90OyByZXBsYWNlPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAga2VlcD0mcXVvdDt0cnVlJnF1b3Q7LyZndDs8L2NvZGU+CisgIDwvcD4KKzwvYmxvY2txdW90ZT4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcGVyZm9yY2UuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcGVyZm9yY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjU1YjNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9wZXJmb3JjZS5odG1sCkBAIC0wLDAgKzEsMTAwNiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UGVyZm9yY2UgVGFza3M8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+UGVyZm9yY2UgVGFza3MgVXNlciBNYW51YWw8L2gxPgorPHA+Ynk8L3A+Cis8dWw+CisgICAgPGxpPkxlcyBIdWdoZXMgKDxhIGhyZWY9Im1haWx0bzpsZXNsaWUuaHVnaGVzQHJ1YnVzLmNvbSI+bGVzbGllLmh1Z2hlc0BydWJ1cy5jb208L2E+KTwvbGk+CisgICAgPGxpPktpcmsgV3lsaWUgKDxhIGhyZWY9Im1haWx0bzpraXJrQHJhZGlrLmNvbSI+a2lya0ByYWRpay5jb208L2E+KTwvbGk+CisgICAgPGxpPk1hdHQgQmlzaG9wICg8YSBocmVmPSJtYWlsdG86bWF0dEB0aGViaXNob3BzLm9yZyI+bWF0dEB0aGViaXNob3BzLm9yZzwvYT4pPC9saT4KKyAgICA8bGk+QW50b2luZSBMZXZ5LUxhbWJlcnQ8L2xpPgorPC91bD4KKzxocj4KKzxoMj5Db250ZW50czwvaDI+Cis8dWw+CisgICAgPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiN0YXNrcyI+VGhlIFRhc2tzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNjaGFuZ2VzIj5DaGFuZ2UgSGlzdG9yeTwvYT48L2xpPgorPC91bD4KKzxicj4KKzxoMj48YSBuYW1lPSJpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvaDI+Cis8cD5UaGVzZSB0YXNrcyBwcm92aWRlIGFuIGludGVyZmFjZSB0byB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5wZXJmb3JjZS5jb20iIHRhcmdldD0iX3RvcCI+UGVyZm9yY2U8L2E+IFNDTS4KK1RoZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTwvY29kZT4gcGFja2FnZSBjb25zaXN0cyBvZiBhIHNpbXBsZSBmcmFtZXdvcmsgdG8gc3VwcG9ydCAKK3A0IGZ1bmN0aW9uYWxpdHkgYXMgd2VsbCBhcyBzb21lIEFudCB0YXNrcyBlbmNhcHN1bGF0aW5nIGZyZXF1ZW50bHkgdXNlZCAoYnkgbWUgOi0pIHA0IGNvbW1hbmRzLiAKK0hvd2V2ZXIsIHRoZSBhZGRpdGlvbiBvZiBuZXcgcDQgY29tbWFuZHMgaXMgYSBwcmV0dHkgc2ltcGxlIHRhc2sgKHNlZSB0aGUgc291cmNlKS4gCitBbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlc2UgY29tbWFuZHMgb24gdGhlIGRlc2t0b3AsIAordGhleSB3ZXJlIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGF1dG9tYXRlZCBidWlsZCBzeXN0ZW1zLjwvcD4KKworPHA+PGI+Tm90ZTo8L2I+IFRoZXNlIHRhc2tzIHJlcXVpcmUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvb3JvIiB0YXJnZXQ9Il90b3AiPm9ybzwvYT4gcmVndWxhcgorZXhwcmVzc2lvbiBwYWNrYWdlLiBTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPmxpYnJhcnkgZGVwZW5kZW5jaWVzPC9hPiBmb3IgdGhlIHByZWNpc2UKK3ZlcnNpb24gcmVxdWlyZWQuCitZb3Ugd2lsbCBhbHNvIG5lZWQgdGhlIFBlcmZvcmNlIGNsaWVudCBleGVjdXRhYmxlIChwNCBvciBwNC5leGUgYnV0IG5vdCBwNHdpbi5leGUpIGluIHlvdXIgcGF0aC4KKzwvcD4KKworCisKKzxoMj48YSBuYW1lPSJ0YXNrcyI+VGhlIFRhc2tzPC9hPjwvaDI+CisKKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CisgICAgPHRyPgorICAgICAgPHRkPjxiPlRhc2s8L2I+PC90ZD4KKyAgICAgIDx0ZD48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI3A0c3luYyI+UDRTeW5jPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5TeW5jaHJvbmlzZSBhIHdvcmtzcGFjZSB0byBhIGRlcG90PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiNwNGNoYW5nZSI+UDRDaGFuZ2U8L2E+PC90ZD4KKyAgICAgICAgPHRkPlJlcXVlc3QgYSBuZXcgY2hhbmdlbGlzdCBmcm9tIHRoZSBQZXJmb3JjZSBzZXJ2ZXI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI3A0ZWRpdCI+UDRFZGl0PC9hPjwvdGQ+CisgICAgICAgIDx0ZD5PcGVuIGZpbGVzIGZvciBlZGl0IChjaGVja291dCk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI3A0c3VibWl0Ij5QNFN1Ym1pdDwvYT48L3RkPgorICAgICAgICA8dGQ+U3VibWl0IGEgY2hhbmdlbGlzdCB0byB0aGUgUGVyZm9yY2Ugc2VydmVyIChjaGVja2luKTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjcDRoYXZlIj5QNEhhdmU8L2E+PC90ZD4KKyAgICAgICAgPHRkPkxpc3QgY3VycmVudCBmaWxlcyBpbiBjbGllbnQgdmlldywgdXNlZnVsIGZvciByZXBvcnRpbmc8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI3A0bGFiZWwiPlA0TGFiZWw8L2E+PC90ZD4KKyAgICAgICAgPHRkPkNyZWF0ZSBhIGxhYmVsIHJlZmxlY3RpbmcgZmlsZXMgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiNwNGxhYmVsc3luYyI+UDRMYWJlbHN5bmM8L2E+PC90ZD4KKyAgICAgICAgPHRkPlN5bmNzIGFuIGV4aXN0aW5nIGxhYmVsPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiNwNGNvdW50ZXIiPlA0Q291bnRlcjwvYT48L3RkPgorICAgICAgICA8dGQ+T2J0YWluIG9yIHNldCB0aGUgdmFsdWUgb2YgYSBjb3VudGVyPC90ZD4KKyAgICA8L3RyPgorCSAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjcDRyZW9wZW4iPlA0UmVvcGVuPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Nb3ZlIGZpbGVzIGJldHdlZW4gY2hhbmdlbGlzdHM8L3RkPgorICAgIDwvdHI+CisKKwkgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI3A0cmV2ZXJ0Ij5QNFJldmVydDwvYT48L3RkPgorICAgICAgICA8dGQ+UmV2ZXJ0IGZpbGVzPC90ZD4KKyAgICA8L3RyPgorCSAgICAKKyAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjcDRhZGQiPlA0QWRkPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5BZGQgZmlsZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9IiNwNGRlbGV0ZSI+UDREZWxldGU8L2E+PC90ZD4KKyAgICAgIDx0ZD5EZWxldGUgZmlsZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9IiNwNGludGVncmF0ZSI+UDRJbnRlZ3JhdGU8L2E+PC90ZD4KKyAgICAgIDx0ZD5JbnRlZ3JhdGUgZmlsZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9IiNwNHJlc29sdmUiPlA0UmVzb2x2ZTwvYT48L3RkPgorICAgICAgPHRkPlJlc29sdmUgZmlsZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI3A0ZnN0YXQiPlA0RnN0YXQ8L2E+PC90ZD4KKyAgICAgICAgPHRkPlNob3cgZGlmZmVyZW5jZXMgYmV0d2VlbiBsb2NhbCByZXBvc2l0b3J5IGFuZCBwNCByZXBvc2l0b3J5PC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKworPGgzPkdlbmVyYWwgUDQgUHJvcGVydGllczwvaDM+Cis8cD5FYWNoIHA0IHRhc2sgcmVxdWlyZXMgYSBudW1iZXIgb2Ygc2V0dGluZ3MsIGVpdGhlciB0aHJvdWdoIGJ1aWxkLXdpZGUgcHJvcGVydGllcywgaW5kaXZpZHVhbCBhdHRyaWJ1dGVzIAorb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGVzZSBhcmUKKzwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlByb3BlcnR5PC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkVudiBWYXI8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5EZWZhdWx0PC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnA0LnBvcnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5QNFBPUlQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wZXJmb3JjZToxNjY2PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cDQuY2xpZW50PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsaWVudDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5QNENMSUVOVDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2dnZWQgaW4gdXNlcm5hbWU8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wNC51c2VyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UDRVU0VSPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwNCB1c2VybmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbG9nZ2VkIGluIHVzZXJuYW1lPC90ZD4KKyAgPC90cj4KKzx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPi0tPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZpZXc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LS08L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uLiBTZWUgdGhlIHA0IHVzZXIgZ3VpZGUgZm9yIG1vcmUgaW5mby48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Ly8uLi48L3RkPgorICA8L3RyPgorCis8L3RhYmxlPgorPHA+IFlvdXIgbG9jYWwgaW5zdGFsbGF0aW9uIG9mIFBlcmZvcmNlIG1heSByZXF1aXJlIG90aGVyIHNldHRpbmdzIChlLmcuCitQNFBBU1NXRCwgUDRDT05GSUcpLiBNYW55IG9mIHRoZXNlIHNldHRpbmdzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGdsb2JhbG9wdHMKK2F0dHJpYnV0ZSAoZGVzY3JpYmVkIGJlbG93KSwgYnV0IG5vdCBhbGwuIElmIGEgc2V0dGluZyBjYW5ub3QgYmUgc2V0CitieSB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMsIHRoZW4gaXQgY2FuIG9ubHkgYmUgc2V0IG91dHNpZGUgb2YgQW50IGFzIGFuIAorZW52aXJvbm1lbnQgdmFyaWFibGUuCis8L3A+Cis8cD4KK0FkZGl0aW9uYWxseSwgeW91IG1heSBhbHNvIHNwZWNpZnkgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorPC9wPgorPHA+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRyPgorICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+Cis8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgd2hldGhlciB0byBzdG9wIHRoZSBidWlsZAorICAgICAoPGNvZGU+dHJ1ZTwvY29kZT58PGNvZGU+eWVzPC9jb2RlPnw8Y29kZT5vbjwvY29kZT4pCisgICAgIG9yIGtlZXAgZ29pbmcgKDxjb2RlPmZhbHNlPC9jb2RlPnw8Y29kZT5ubzwvY29kZT58PGNvZGU+b2ZmPC9jb2RlPikKKyAgICAgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5nbG9iYWxvcHRzPGJyPjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyBnbG9iYWwgb3B0aW9ucyBmb3IgcGVyZm9yY2UgdG8gdXNlIHdoaWxlCisgICAgICBleGVjdXRpbmcgdGhlIHRhc2suIFRoZXNlIHByb3BlcnRpZXMgc2hvdWxkIGJlIGNvbmNhdGVuYXRlZCBpbnRvIG9uZQorICAgICAgc3RyaW5nLDxicj4KKyAgICAgIHN1Y2ggYXMgIi1QIDxpPnBhc3N3b3JkPC9pPiAtQyBFVUNKSVMiLiBVc2UgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KKyAgICAgIHN5bnRheCwgTk9UIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcy4gU2VlIHRoZTxicj4KKyAgICAgIFBlcmZvcmNlIENvbW1hbmQgUmVmZXJlbmNlIGZvciBkZXRhaWxzLjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPk5vPGJyPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHA+U2V0dGluZyBpbiB0aGUgZW52aXJvbm1lbnQ6LTwvcD4KKzxwPgorKFVuaXggY3NoKTwvcD4KKzxwcmU+c2V0ZW52IFA0UE9SVCBteXBlcmZvcmNlYm94OjE2NjY8L3ByZT4KKzxwPihVbml4IHNoIGV0IGFsKTwvcD4KKzxwcmU+UDRVU0VSPW15cDR1c2VyaWQ7IGV4cG9ydCBQNFVTRVI8L3ByZT4KKzxwPlVzaW5nIGJ1aWxkIHByb3BlcnRpZXM6LTwvcD4KKzxwcmU+Jmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7cDQuY2xpZW50JnF1b3Q7IHZhbHVlPSZxdW90O25pZ2h0bHlidWlsZCZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD5Vc2luZyB0YXNrIGF0dHJpYnV0ZXM6LTwvcD4KKzxwcmU+CismbHQ7cDRXaGF0ZXZlcgorCXBvcnQ9JnF1b3Q7bXlzZXJ2ZXI6MTY2NiZxdW90OworCWNsaWVudD0mcXVvdDtzbW9rZXRlc3QmcXVvdDsKKwl1c2VyPSZxdW90O3Ntb2tldGVzdGR1ZGUmcXVvdDsKKwkuCisJLgorCS4KKy8mZ3Q7Cis8L3ByZT4KKworPHA+CitGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHVuZGVybHlpbmcgJ3A0JyBjb21tYW5kcyB5b3UgYXJlIHJlZmVycmVkIHRvIHRoZSBQZXJmb3JjZSBDb21tYW5kIFJlZmVyZW5jZQorYXZhaWxhYmxlIGZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cucGVyZm9yY2UuY29tLyIgdGFyZ2V0PSJfdG9wIj5QZXJmb3JjZSB3ZWJzaXRlPC9hPi4KKzwvcD4KKworCis8aHI+Cis8aDI+VGFzayBEZXNjcmlwdGlvbnM8L2gyPgorPGgyPjxhIG5hbWU9InA0c3luYyI+UDRTeW5jPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb246PC9oMz4KKzxwPlN5bmNocm9uaXplIHRoZSBjdXJyZW50IHdvcmtzcGFjZSB3aXRoIHRoZSBkZXBvdC48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlIGEgcmVmcmVzaCBvZiBmaWxlcywgaWYgdGhpcyBhdHRyaWJ1dGUgaGFzCisgICAgYmVlbiBzZXQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm5vIC0gaWYgb21pdHRlZCwgaXQgd2lsbCBiZSBvZmYsCisgICAgb3RoZXJ3aXNlIGEgcmVmcmVzaCB3aWxsIGJlIGZvcmNlZC48L3RkPgorICA8L3RyPgorPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGFiZWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3luYyBjbGllbnQgdG8gbGFiZWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+bm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+Jmx0O3A0c3luYyBsYWJlbD0mcXVvdDtuaWdodGx5YnVpbGQtMC4wMTIzJnF1b3Q7IGZvcmNlPSZxdW90O2ZvbyZxdW90Oy8mZ3Q7CismbHQ7cDRzeW5jIHZpZXc9JnF1b3Q7Ly9kZXBvdC9wcm9qZWN0cy9wcm9qZWN0Zm9vL21haW4vc3JjLy4uLiZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzxocj4KKworCisKKzxoMj48YSBuYW1lPSJwNGNoYW5nZSI+UDRDaGFuZ2U8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjo8L2gzPgorPHA+UmVxdWVzdCBhIG5ldyBjaGFuZ2VsaXN0IGZyb20gdGhlIFBlcmZvcmNlIHNlcnZlci4gCitUaGlzIHRhc2sgc2V0cyB0aGUgJHtwNC5jaGFuZ2V9IHByb3BlcnR5IHdoaWNoIGNhbiB0aGVuIGJlIHBhc3NlZCB0byA8QSBIUkVGPSIjcDRzdWJtaXQiPlA0U3VibWl0PC9BPiwKKzxBIEhSRUY9IiNwNGVkaXQiPlA0RWRpdDwvQT4sIG9yIDxhIEhSRUY9IiNwNGFkZCI+UDRBZGQ8L0E+LCBvciA8YSBIUkVGPSIjcDRkZWxldGUiPlA0RGVsZXRlPC9BPiwKK3RoZW4gdG8gPEEgSFJFRj0iI3A0c3VibWl0Ij5QNFN1Ym1pdDwvQT4uCis8L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdGlvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EZXNjcmlwdGlvbiBmb3IgQ2hhbmdlTGlzdC4gSWYgbm9uZSBzcGVjaWZpZWQsIGl0IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdG8gIkF1dG9TdWJtaXQgQnkgQW50IjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+Jmx0O3A0Y2hhbmdlIGRlc2NyaXB0aW9uPSJDaGFuZ2UgQnVpbGQgTnVtYmVyIGluIFNjcmlwdCImZ3Q7Cis8L3ByZT4KKzxocj4KKworCisKKworPGgyPjxhIG5hbWU9InA0ZWRpdCI+UDRFZGl0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb246PC9oMz4KKzxwPk9wZW4gZmlsZShzKSBmb3IgZWRpdC4gUDRDaGFuZ2Ugc2hvdWxkIGJlIHVzZWQgdG8gb2J0YWluIGEgbmV3IGNoYW5nZWxpc3QgZm9yIFA0RWRpdCBhcywKK2FsdGhvdWdoIFA0RWRpdCBjYW4gb3BlbiBmaWxlcyB0byB0aGUgZGVmYXVsdCBjaGFuZ2UsICBQNFN1Ym1pdCBjYW5ub3QgeWV0IHN1Ym1pdCBpdC4KKzwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZpZXc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGVzcGVjIHRvIHJlcXVlc3QgdG8gZWRpdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jaGFuZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QW4gZXhpc3RpbmcgY2hhbmdlbGlzdCBudW1iZXIgdG8gYXNzaWduIGZpbGVzIHRvLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgYnV0IHNlZSBhYm92ZS48L3RkPgorICA8L3RyPgorCis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyZsdDtwNGVkaXQKKyAgICB2aWV3PSZxdW90Oy8vZGVwb3QvcHJvamVjdHMvcHJvamVjdGZvby9tYWluL3NyYy9CbGFoLmphdmEuLi4mcXVvdDsKKyAgICBjaGFuZ2U9JnF1b3Q7JHtwNC5jaGFuZ2V9JnF1b3Q7LyZndDsKKzwvcHJlPgorPGhyPgorCisKKworCis8aDI+PGEgbmFtZT0icDRzdWJtaXQiPlA0U3VibWl0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb246PC9oMz4KKzxwPlN1Ym1pdCBhIGNoYW5nZWxpc3QsIHVzdWFsbHkgb2J0YWluZWQgZnJvbSBQNENoYW5nZS4KKzxwPlA0U3VibWl0IHdpbGwgYWxzbyBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBwNC5jaGFuZ2UgaWYgdGhlIGNoYW5nZSBsaXN0IGlzIHJlbmFtZWQgYnkgdGhlIFBlcmZvcmNlIHNlcnZlci4KKzxwPlA0U3VibWl0IHdpbGwgc2V0IGEgcHJvcGVydHkgcDQubmVlZHNyZXNvbHZlIHRvIDEgaWYgdGhlIGNoYW5nZSBjb3VsZCBub3QgYmUgc3VibWl0dGVkIGR1ZSB0byBmaWxlcyBuZWVkaW5nIHJlc29sdmluZy4KKzxwPkZpbGVzIHdpbGwgbmVlZCByZXNvbHZlIGlmIGF0IHRoZSB0aW1lIG9mIGNoZWNraW5nIGluLCB0aGUgcmV2aXNpb24gdGhhdCB3YXMgY2hlY2tlZCBvdXQgdG8gZG8gdGhlIGN1cnJlbnQgZWRpdAoraXMgbm90IHRoZSBsYXRlc3QgYW55IG1vcmUuCis8cD5JZiBubyBmaWxlcyBuZWVkIHJlc29sdmUsIHRoZSBwNC5uZWVkc3Jlc29sdmUgd2lsbCBiZSBzZXQgdG8gMC4KKzwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNoYW5nZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2hhbmdlbGlzdCBudW1iZXIgdG8gc3VibWl0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNoYW5nZXByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYSBwcm9wZXJ0eSB0byB3aGljaCB0aGUgbmV3IGNoYW5nZSBudW1iZXIKKyAgICB3aWxsIGJlIGFzc2lnbmVkIGlmIHRoZSBQZXJmb3JjZSBzZXJ2ZXIgcmVudW1iZXJzIHRoZSBjaGFuZ2U8YnI+CisgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmVlZHNyZXNvbHZlcHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiBwcm9wZXJ0eSB3aGljaCB3aWxsIGJlIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPgorICAgIGlmIHRoZSBzdWJtaXQgcmVxdWlyZXMgYSByZXNvbHZlPGJyPgorICAgIFNpbmNlIGFudCAxLjYuMTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4mbHQ7cDRzdWJtaXQgY2hhbmdlPSZxdW90OyR7cDQuY2hhbmdlfSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzxocj4KKworCisKKworPGgyPjxhIG5hbWU9InA0aGF2ZSI+UDRIYXZlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb246PC9oMz4KKzxwPkxpc3QgaGFuZHkgZmlsZSBpbmZvIHJlZmxlY3RpbmcgdGhlIGN1cnJlbnQgY2xpZW50IGNvbnRlbnRzLgorPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Tm9uZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4tLTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4tLTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4mbHQ7cDRoYXZlLyZndDsKKzwvcHJlPgorPGhyPgorCisKKworCis8aDI+PGEgbmFtZT0icDRsYWJlbCI+UDRMYWJlbDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uOjwvaDM+Cis8cD5DcmVhdGUgYSBuZXcgbGFiZWwgYW5kIHNldCBjb250ZW50cyB0byByZWZsZWN0IGN1cnJlbnQgY2xpZW50IGZpbGUgcmV2aXNpb25zLgorPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgbGFiZWw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmlldzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGllbnQgdmlldyB0byB1c2UgZm9yIGxhYmVsPGJyPgorICAgIFRoZSB2aWV3IGNhbiBjb250YWluIG11bHRpcGxlIGxpbmVzIHNlcGFyYXRlZCBieSA7IG9yIDo8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkxhYmVsIERlc2NyaXB0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bG9jazwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NrIHRoZSBsYWJlbCBvbmNlIGNyZWF0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKworCis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+CismbHQ7cDRsYWJlbAorCW5hbWU9JnF1b3Q7TmlnaHRseUJ1aWxkOiR7RFNUQU1QfToke1RTVEFNUH0mcXVvdDsgCisJZGVzYz0mcXVvdDtBdXRvIE5pZ2h0bHkgQnVpbGQmcXVvdDsKKwlsb2NrPSZxdW90O2xvY2tlZCZxdW90OworCXZpZXc9JnF1b3Q7Ly9maXJzdGRlcG90Ly4uLjsvL3NlY29uZGVwb3QvZm9vL2Jhci8uLi4mcXVvdDsKKy8mZ3Q7Cis8L3ByZT4KKzxocj4KKworCis8aDI+PGEgbmFtZT0icDRsYWJlbHN5bmMiPlA0TGFiZWxzeW5jPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb246PC9oMz4KKzxwPlN5bmNzIGFuIGV4aXN0aW5nIGxhYmVsIGFnYWluc3QgdGhlIGN1cnJlbnQgd29ya3NwYWNlIG9yIGFnYWluc3Qgc3BlY2lmaWVkIHJldmlzaW9ucy4KKzwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5QZXJmb3JjZSBjb21tYW5kIGxpbmUgZmxhZzwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBsYWJlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LWwgbGFiZWxuYW1lPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmlldzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICBsaXN0IG9mIGZpbGVzIG9yIHJldmlzaW9uIHNwZWNzIHNlcGFyYXRlZCBieSA6IG9yIDs8YnI+CisgICAgaW4gdGhlIGFic2VuY2Ugb2YgdGhpcyBhdHRyaWJ1dGUsIHRoZSBsYWJlbHN5bmMgd2lsbCBiZSBkb25lIGFnYWluc3QgdGhlIGN1cnJlbnQgUGVyZm9yY2UgY2xpZW50IG9yIHRoZSB2YWx1ZSBvZiB0aGUgcDRjbGllbnQgYXR0cmlidXRlIG9yIHRoZSB2YWx1ZSBvZiB0aGUgcDQuY2xpZW50IHByb3BlcnR5IG9yIHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUDRDTElFTlQ8L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImNlbnRlciI+ZmlsZVtyZXZSYW5nZV0gLi4uIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNpbXVsYXRpb25tb2RlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRpc3BsYXlzIHdoaWNoIGVmZmVjdCB0aGUgb3BlcmF0aW9uIHdvdWxkIGhhdmUgb24gdGhlIGxhYmVsIGJ1dCBkbyBub3QgYWN0dWFsbHkgZG8gaXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LW48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hZGQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgc2V0IHRvIHRydWUsIHByZXNlcnZlIGZpbGVzIHdoaWNoIGV4aXN0IGluIHRoZSBsYWJlbCwgYnV0IG5vdCBpbiB0aGUgY3VycmVudCB2aWV3PC90ZD4KKyAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPi1hPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVsZXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHNldCB0byB0cnVlLCByZW1vdmUgZnJvbSB0aGUgbGFiZWwgdGhlIGZpbGVzIG1lbnRpb25lZCBpbiB0aGUgdmlldyBhdHRyaWJ1dGU8L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LWQ8L3RkPgorICA8L3RyPgorCisKKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyZsdDsKK3A0bGFiZWxzeW5jCituYW1lPSZxdW90O2N1cnJlbnRfcmVsZWFzZSZxdW90Owordmlldz0iLy9kZXBvdC8uLi4jaGVhZDsvL2RlcG90Mi9maWxlMSMyNSIKK2FkZD0mcXVvdDt0cnVlJnF1b3Q7CisvJmd0OworPC9wcmU+CitUaGlzIGV4YW1wbGUgd2lsbCBhZGQgaW50byB0aGUgbGFiZWwgY2FsbGVkIDxpPmN1cnJlbnRfcmVsZWFzZTwvaT4gdGhlIGN1cnJlbnQgaGVhZCByZXZpc2lvbiBvZiBhbGwgdGhlIGZpbGVzIGxvY2F0ZWQgdW5kZXIgPGk+Ly9kZXBvdDwvaT4KK2FuZCB0aGUgcmV2aXNpb24gMjUgb2YgdGhlIGZpbGUgPGk+Ly9kZXBvdDIvZmlsZTE8L2k+LgorPHByZT4KKyZsdDsKK3A0bGFiZWxzeW5jCituYW1lPSZxdW90O2N1cnJlbnRfcmVsZWFzZSZxdW90OworcDRjbGllbnQ9JnF1b3Q7bXljbGllbnQmcXVvdDsKKy8mZ3Q7Cis8L3ByZT4KK1RoaXMgZXhhbXBsZSB3aWxsIHVwZGF0ZSB0aGUgbGFiZWwgY2FsbGVkIDxpPmN1cnJlbnRfcmVsZWFzZTwvaT4gc28gdGhhdCBpdCByZWZsZWN0cyB0aGUgUGVyZm9yY2UgY2xpZW50IDxpPm15Y2xpZW50PC9pPi48YnI+CitGaWxlcyBwcmVzZW50IGluIHRoZSBsYWJlbCBiZWZvcmUgdGhlIHN5bmMgYW5kIG5vdCBwcmVzZW50IGN1cnJlbnRseSBpbiB0aGUgY2xpZW50IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsYWJlbCwgYmVjYXVzZSB0aGUgYWRkIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LgorPHByZT4KKyZsdDsKK3A0bGFiZWxzeW5jCituYW1lPSZxdW90O2N1cnJlbnRfcmVsZWFzZSZxdW90OworLyZndDsKKzwvcHJlPgorVGhpcyBleGFtcGxlIHdpbGwgdXBkYXRlIHRoZSBsYWJlbCBjYWxsZWQgPGk+Y3VycmVudF9yZWxlYXNlPC9pPiBzbyB0aGF0IGl0IHJlZmxlY3RzIHRoZSBjdXJyZW50IGRlZmF1bHQgY2xpZW50IGZvciB0aGUgYW50IFBlcmZvcmNlIHRhc2tzLjxicj4KK1RoZSBkZWZhdWx0IGNsaWVudCBpcyBieSBvcmRlciBvZiBwcmlvcml0eSA6Cis8dWw+Cis8bGk+Cit0aGUgdmFsdWUgb2YgdGhlIHA0LmNsaWVudCBwcm9wZXJ0eSBpZiBzZXQgaW4gdGhlIHByb2plY3QKKzwvbGk+Cis8bGk+Cit0aGUgdmFsdWUgb2YgdGhlIFA0Q0xJRU5UIGVudmlyb25tZW50IHZhcmlhYmxlCis8L2xpPgorPGxpPgordGhlIGRlZmF1bHQgUGVyZm9yY2UgY2xpZW50IGZyb20gdGhlIFdpbmRvd3MgcmVnaXN0cnkgdW5kZXIgV2luZG93cyBvcGVyYXRpbmcgc3lzdGVtcworPC9saT4KKzwvdWw+CitGaWxlcyBwcmVzZW50IGluIHRoZSBsYWJlbCBiZWZvcmUgdGhlIHN5bmMgYW5kIG5vdCBwcmVzZW50IGN1cnJlbnRseSBpbiB0aGUgY2xpZW50IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsYWJlbCwgYmVjYXVzZSB0aGUgYWRkIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LgorPGhyPgorCisKKzxoMj48YSBuYW1lPSJwNGNvdW50ZXIiPlA0Q291bnRlcjwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uOjwvaDM+Cis8cD4KK09idGFpbiBvciBzZXQgdGhlIHZhbHVlIG9mIGEgY291bnRlci4gV2hlbiB1c2VkIGluIGl0cyBiYXNlIGZvcm0KKyh3aGVyZSBvbmx5IHRoZSBjb3VudGVyIG5hbWUgaXMgcHJvdmlkZWQpLCB0aGUgY291bnRlciB2YWx1ZSB3aWxsIGJlCitwcmludGVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiBXaGVuIHRoZSB2YWx1ZSBpcyBwcm92aWRlZCwgdGhlIGNvdW50ZXIKK3dpbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBwcm92aWRlZC4gV2hlbiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQsCit0aGUgcHJvcGVydHkgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIuIFlvdSBtYXkKK25vdCBzcGVjaWZ5IHRvIGJvdGggZ2V0IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIGluIHRoZSBzYW1lCitUYXNrLgorPC9wPgorPFA+CitUaGUgdXNlciBwZXJmb3JtaW5nIHRoaXMgdGFzayBtdXN0IGhhdmUgUGVyZm9yY2UgJnF1b3Q7cmV2aWV3JnF1b3Q7IHBlcm1pc3Npb25zCithcyBkZWZpbmVkIGJ5IFBlcmZvcmNlIHByb3RlY3Rpb25zIGluIG9yZGVyIGZvciB0aGlzIHRhc2sgdG8gc3VjY2VlZC4KKzwvUD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGNvdW50ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGNvdW50ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJvcGVydHkgdG8gYmUgc2V0IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+CitQcmludCB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIgbmFtZWQgJnF1b3Q7bGFzdC1jbGVhbi1idWlsZCZxdW90OyB0byB0aGUgb3V0cHV0IHN0cmVhbToKKzxwcmU+CismbHQ7cDRjb3VudGVyIG5hbWU9JnF1b3Q7bGFzdC1jbGVhbi1idWlsZCZxdW90Oy8mZ3Q7Cis8L1BSRT4KK1NldCB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSAmcXVvdDtUU1RBTVAmcXVvdDsgcHJvcGVydHk6Cis8UFJFPgorJmx0O3A0Y291bnRlciBuYW1lPSZxdW90O2xhc3QtY2xlYW4tYnVpbGQmcXVvdDsgdmFsdWU9JnF1b3Q7JHtUU1RBTVB9JnF1b3Q7LyZndDsKKzwvUFJFPgorU2V0IHRoZSB2YWx1ZSBvZiB0aGUgJnF1b3Q7cDQubGFzdC5jbGVhbi5idWlsZCZxdW90OyBwcm9wZXJ0eSB0byB0aGUgY3VycmVudAordmFsdWUgb2YgdGhlICZxdW90O2xhc3QtY2xlYW4tYnVpbGQmcXVvdDsgY291bnRlcjoKKzxQUkU+CismbHQ7cDRjb3VudGVyIG5hbWU9JnF1b3Q7bGFzdC1jbGVhbi1idWlsZCZxdW90OyBwcm9wZXJ0eT0mcXVvdDtwNC5sYXN0LmNsZWFuLmJ1aWxkJnF1b3Q7LyZndDsKKzwvcHJlPgorPGhyPgorCisKKworCis8aDI+PGEgbmFtZT0icDRyZW9wZW4iPlA0UmVvcGVuPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb246PC9oMz4KKzxwPgorTW92ZSAob3IgcmVvcGVuIGluIFBlcmZvcmNlIHNwZWFrKSBjaGVja291dCBmaWxlcyBiZXR3ZWVuIGNoYW5nZWxpc3RzLgorPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9jaGFuZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNoYW5nZWxpc3QgdG8gbW92ZSBmaWxlcyB0by48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+CitNb3ZlIGFsbCBvcGVuIGZpbGVzIHRvIHRoZSBkZWZhdWx0IGNoYW5nZWxpc3QKKzxwcmU+CismbHQ7cDRyZW9wZW4gdmlldz0mcXVvdDsvLy4uLiZxdW90OyB0b2NoYW5nZT0mcXVvdDtkZWZhdWx0JnF1b3Q7LyZndDsKKzwvUFJFPgorQ3JlYXRlIGEgbmV3IGNoYW5nZWxpc3QgdGhlbiByZW9wZW4gaW50byBpdCwgYW55IGZpbGVzIGZyb20gdGhlIHZpZXcgLy9wcm9qZWN0cy9mb28vbWFpbi8uLi4KKzxQUkU+CismbHQ7cDRjaGFuZ2UgZGVzY3JpcHRpb249Ik1vdmUgZmlsZXMgb3V0IG9mIHRoZSB3YXkiLyZndDsKKyZsdDtwNHJlb3BlbiB2aWV3PSZxdW90Oy8vcHJvamVjdHMvZm9vL21haW4vLi4uJnF1b3Q7IHRvY2hhbmdlPSZxdW90OyR7cDQuY2hhbmdlfSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzxocj4KKworCisKKzxoMj48YSBuYW1lPSJwNHJldmVydCI+UDRSZXZlcnQ8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjo8L2gzPgorPHA+CitSZXZlcnRzIGZpbGVzLgorPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2hhbmdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjaGFuZ2VsaXN0IHRvIHJldmVydC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXZlcnRPbmx5VW5jaGFuZ2VkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlJldmVydCBvbmx5IHVuY2hhbmdlZCBmaWxlcyAocDQgcmV2ZXJ0IC1hKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIAorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KK1JldmVydCBldmVyeXRoaW5nIQorPHByZT4KKyZsdDtwNHJldmVydCB2aWV3PSZxdW90Oy8vLi4uJnF1b3Q7LyZndDsKKzwvUFJFPgorUmV2ZXJ0IGFueSB1bmNoYW5nZWQgZmlsZXMgaW4gdGhlIGRlZmF1bHQgY2hhbmdlCis8UFJFPgorJmx0O3A0cmV2ZXJ0IGNoYW5nZT0iZGVmYXVsdCIgcmV2ZXJ0b25seXVuY2hhbmdlZD0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKKzwvcHJlPgorPGhyPgorCis8aDI+PGEgbmFtZT0icDRhZGQiPlA0QWRkPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb246PC9oMz4KKzxwPgorQWRkcyBmaWxlcyBzcGVjaWZpZWQgaW4gbmVzdGVkIGZpbGVzZXQgY2hpbGRyZW4uCis8L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYW5kbGVuZ3RoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgcG9zaXRpdmUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIGxlbmd0aAorICAgICAgICBvZiB0aGUgY29tbWFuZGxpbmUgd2hlbiBjYWxsaW5nIFBlcmZvcmNlIHRvIGFkZCB0aGUgZmlsZXMuIAorICAgICAgICBEZWZhdWx0cyB0byA0NTAsIGhpZ2hlciB2YWx1ZXMgbWVhbiBmYXN0ZXIgZXhlY3V0aW9uLAorICAgICAgICBidXQgYWxzbyBwb3NzaWJsZSBmYWlsdXJlcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jaGFuZ2VsaXN0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHNwZWNpZmllZCB0aGUgb3BlbiBmaWxlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorc3BlY2lmaWVkIHBlbmRpbmcgY2hhbmdlbGlzdCBudW1iZXI7IG90aGVyd2lzZSB0aGUgb3BlbiBmaWxlcyBhcmUKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgZGVmYXVsdCBjaGFuZ2VsaXN0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIAorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KK1JlcXVpcmUgYSBjaGFuZ2VsaXN0LCBhZGQgYWxsIGphdmEgZmlsZXMgc3RhcnRpbmcgZnJvbSBhIGRpcmVjdG9yeSwKK2FuZCBzdWJtaXQKKworPHByZT4KKyZsdDtwNGNoYW5nZS8mZ3Q7CismbHQ7cDRhZGQgY29tbWFuZGxlbmd0aD0mcXVvdDsyMDAwMCZxdW90OyBjaGFuZ2VsaXN0PSZxdW90OyR7cDQuY2hhbmdlfSZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7Li4vZGlyL3NyYy8mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7LyZndDsKKyZsdDtwNGFkZCZndDsKKyZsdDtwNHN1Ym1pdCBjaGFuZ2U9JnF1b3Q7JHtwNC5jaGFuZ2V9JnF1b3Q7LyZndDsKKzwvcHJlPgorPGhyPgorCis8aDI+PGEgbmFtZT0icDRmc3RhdCI+UDRGc3RhdDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uOjwvaDM+Cis8cD4KK0xpc3RzIGZpbGVzIHVuZGVyIFBlcmZvcmNlIGNvbnRyb2wgYW5kIGZpbGVzIG5vdCB1bmRlciBQZXJmb3JjZSBjb250cm9sIGluIG9uZSBvciBzZXZlcmFsIGZpbGVzZXRzCis8L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zaG93ZmlsdGVyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNob3VsZCBiZSBvbmUgb2YKKyAgICAgIDx0YWJsZSBib3JkZXI9IjEiPgorICAgICAgICA8dHI+PHRkPnZhbHVlPC90ZD48dGQ+ZGVzY3JpcHRpb248L3RkPjwvdHI+CisgICAgICAgIDx0cj48dGQ+JnF1b3Q7YWxsJnF1b3Q7PC90ZD48dGQ+bGlzdCBhbGwgZmlsZXMsIGZpcnN0IHRoZSBvbmVzIHdoaWNoIGFyZSB1bmRlciBQZXJmb3JjZSBjb250cm9sLCB0aGVuIHRoZSBvdGhlcnM8L3RkPjwvdHI+CisgICAgICAgIDx0cj48dGQ+JnF1b3Q7ZXhpc3RpbmcmcXVvdDs8L3RkPjx0ZD5saXN0IG9ubHkgZmlsZXMgdW5kZXIgUGVyZm9yY2UgY29udHJvbDwvdGQ+PC90cj4KKyAgICAgICAgPHRyPjx0ZD4mcXVvdDtub24tZXhpc3RpbmcmcXVvdDs8L3RkPjx0ZD5saXN0IG9ubHkgZmlsZXMgd2hpY2ggYXJlIG5vdCB1bmRlciBQZXJmb3JjZSBjb250cm9sPC90ZD48L3RyPjwvdGFibGU+CisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVzZXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b25lIG9yIHNldmVyYWwgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+ZmlsZXNldChzKTwvYT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+eWVzIChhdCBsZWFzdCBvbmUgZmlsZXNldCBpcyBuZWVkZWQpPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CitTZXZlcmFsIG5lc3RlZCBmaWxlc2V0cyBjYW4gYmUgdXNlZCB3aXRoIFA0RnN0YXQsIG9uZSBzaG91bGQgYmUgdGhlcmUgYXQgbGVhc3QuCis8aDM+RXhhbXBsZXM8L2gzPgord2lsbCBsaXN0IGFsbCB0aGUgZmlsZXMgdW5kZXIgQzpcZGV2XGdudVxkZXBvdCwgc29ydGVkIGJ5IHVuZGVyIFBlcmZvcmNlIG9yIG5vdCB1bmRlciBQZXJmb3JjZTxicj4KKzxwcmU+CismbHQ7cHJvamVjdCBuYW1lPSZxdW90O3A0ZnN0YXQmcXVvdDsgZGVmYXVsdD0mcXVvdDtwNGZzdGF0JnF1b3Q7IGJhc2VkaXI9JnF1b3Q7QzpcZGV2XGdudSZxdW90OyZndDsKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7cDRmc3RhdCZxdW90OyAmZ3Q7CisgICAgICAgICZsdDtwNGZzdGF0IHNob3dmaWx0ZXI9JnF1b3Q7YWxsJnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2RlcG90JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyomcXVvdDsvJmd0OworICAgICAgICAmbHQ7L3A0ZnN0YXQmZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wPgorPC9wcmU+CisKKworCisKKzxoMj48YSBuYW1lPSJwNGRlbGV0ZSI+UDREZWxldGU8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjo8L2gzPgorPHA+T3BlbiBmaWxlKHMpIGZvciBkZWxldGUuIFA0Q2hhbmdlIHNob3VsZCBiZSB1c2VkIHRvIG9idGFpbiBhIG5ldyBjaGFuZ2VsaXN0IGZvciBQNERlbGV0ZSBhcywKK2FsdGhvdWdoIFA0RGVsZXRlIGNhbiBvcGVuIGZpbGVzIHRvIHRoZSBkZWZhdWx0IGNoYW5nZSwgIFA0U3VibWl0IGNhbm5vdCB5ZXQgc3VibWl0IGl0LgorPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmlldzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZXNwZWMgdG8gcmVxdWVzdCB0byBkZWxldGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2hhbmdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkFuIGV4aXN0aW5nIGNoYW5nZWxpc3QgbnVtYmVyIHRvIGFzc2lnbiBmaWxlcyB0by48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGJ1dCBzZWUgYWJvdmUuPC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+CismbHQ7cDRkZWxldGUKKyAgICB2aWV3PSZxdW90Oy8vZGVwb3QvcHJvamVjdHMvcHJvamVjdGZvby9tYWluL3NyYy9CbGFoLmphdmEuLi4mcXVvdDsKKyAgICBjaGFuZ2U9JnF1b3Q7JHtwNC5jaGFuZ2V9JnF1b3Q7LyZndDsKKzwvcHJlPgorPGhyPgorPGgyPjxhIG5hbWU9InA0aW50ZWdyYXRlIj5QNEludGVncmF0ZTwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uOjwvaDM+Cis8cD5PcGVuIGZpbGUocykgZm9yIGludGVncmF0ZS4gUDRDaGFuZ2Ugc2hvdWxkIGJlIHVzZWQgdG8gb2J0YWluIGEgbmV3IGNoYW5nZWxpc3QgZm9yIFA0SW50ZWdyYXRlIGFzLAorYWx0aG91Z2ggUDRJbnRlZ3JhdGUgY2FuIG9wZW4gZmlsZXMgdG8gdGhlIGRlZmF1bHQgY2hhbmdlLCAgUDRTdWJtaXQgY2Fubm90IHlldCBzdWJtaXQgaXQuCis8L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8cD5JZiB0aGlzIHRhc2sgaXMgdXNlZCB3aXRob3V0IHVzaW5nIGEgYnJhbmNoIGRlZmluaXRpb24sIGJvdGggZnJvbWZpbGUgYW5kIHRvZmlsZSBtdXN0IGJlIHN1cHBsaWVkLgorSWYgYSBicmFuY2ggZGVmaW5pdGlvbiBpcyBzdXBwbGllZCwgYXQgbGVhc3Qgb25lIG9mIGZyb21maWxlIG9yIHRvZmlsZSBzaG91bGQgYmUgc3VwcGxpZWQuCitCb3RoIGZyb21maWxlIGFuZCB0b2ZpbGUgY2FuIGJlIHN1cHBsaWVkIHRvZ2V0aGVyIHdpdGggYSBicmFuY2ggZGVmaW5pdGlvbi48L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UGVyZm9yY2UgY29tbWFuZCBsaW5lIGZsYWc8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZnJvbWZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T3JpZ2luYWwgZmlsZSBvciB2aWV3PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPnJlcXVpcmVkIGlmIGEgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRhcmdldCBmaWxlIG9yIHZpZXcuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPnJlcXVpcmVkIGlmIGEgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YnJhbmNoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYnJhbmNoIHNwZWNpZmljYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LWI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jaGFuZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QW4gZXhpc3RpbmcgY2hhbmdlbGlzdCBudW1iZXIgdG8gYXNzaWduIGZpbGVzIHRvLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgYnV0IHNlZSBhYm92ZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LWM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZWludGVncmF0ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Gb3JjZXMgaW50ZWdyYXRpb24gcmVnYXJkbGVzcyBvZiBwcmV2aW91cyBpbnRlZ3JhdGlvbiBoaXN0b3J5ICgqKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4tZjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlc3RvcmVkZWxldGVkcmV2aXNpb25zPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkVuYWJsZXMgaW50ZWdyYXRpb24gYXJvdW5kIGRlbGV0ZWQgcmV2aXNpb25zICgqKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4tZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxlYXZldGFyZ2V0cmV2aXNpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UHJldmVudHMgdGFyZ2V0IGZpbGVzIGZyb20gYmVpbmcgc3luY2VkIHRvIGhlYWQgcmV2aXNpb24gYmVmb3JlIGludGVncmF0aW9uICgqKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4taDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuYWJsZWJhc2VsZXNzbWVyZ2VzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkZvcmNlcyBpbnRlZ3JhdGlvbiB0byBleGlzdGluZyB0YXJnZXQgZmlsZXMgd2hpY2ggaGF2ZSBubyBpbnRlZ3JhdGlvbiBoaXN0b3J5IHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZmlsZXMgKCopPC90ZD4KKyAgICA8dGQgdmFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPi1pPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2ltdWxhdGlvbm1vZGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RGlzcGxheXMgd2hpY2ggaW50ZWdyYXRpb25zIGFyZSBuZWNlc3NhcnkgYnV0IGRvIG5vdCBhY3R1YWxseSBzY2hlZHVsZSB0aGVtICgqKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4tbjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJldmVyc2VicmFuY2htYXBwaW5nczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5SZXZlcnNlcyBtYXBwaW5ncyBpbiB0aGUgYnJhbmNoIHZpZXcsIHdpdGggc291cmNlIGFuZCB0YXJnZXQgZmlsZXMgZXhjaGFuZ2luZyBwbGFjZSAoKik8L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LXI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wYWdhdGVzb3VyY2VmaWxldHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5NYWtlcyBzb3VyY2UgZmlsZSB0eXBlIHByb3BhZ2F0ZSB0byBleGlzdGluZyB0YXJnZXQgZmlsZXMgKCopPC90ZD4KKyAgICA8dGQgdmFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPi10PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bm9jb3B5dGFyZ2V0ZmlsZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UHJldmVudHMgdGhlIHBoeXNpY2FsIGRlbGl2ZXJ5IG9uIGRpc2sgb2YgbmV3IHRhcmdldCBmaWxlcyAoKik8L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LXY8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxicj4KKygqKSBUaGUgZm9sbG93aW5nIGFwcGxpZXMgZm9yIGEgbnVtYmVyIG9mIGZsYWdzLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4gVG8gc2V0IHRoZSBmbGFnLCB1c2UgICZxdW90O3RydWUmcXVvdDsKKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+CismbHQ7cDRpbnRlZ3JhdGUKKyAgICBmcm9tZmlsZT0mcXVvdDsvL2RlcG90L3Byb2plY3RzL3Byb2plY3Rmb28vbWFpbi9zcmMvQmxhaC5qYXZhLi4uJnF1b3Q7CisgICAgdG9maWxlPSZxdW90Oy8vZGVwb3QvcHJvamVjdHMvcHJvamVjdGZvby9yZWxlYXNlL3NyYy9CbGFoLmphdmEuLi4mcXVvdDsKKyAgICBjaGFuZ2U9JnF1b3Q7JHtwNC5jaGFuZ2V9JnF1b3Q7LyZndDsKKzwvcHJlPgorPGhyPgorPGgyPjxhIG5hbWU9InA0cmVzb2x2ZSI+UDRSZXNvbHZlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb246PC9oMz4KKzxwPlJlc29sdmVzIGZpbGVzLiBZb3Ugd2FudCB0byBkbyB0aGlzIGlmIDoKKzx1bD4KKzxsaT4KK3RoZXJlIGhhdmUgYmVlbiBvciB0aGVyZSBtYXkgYmUgY29uY3VycmVudCBlZGl0cyBvZiB0aGUgc2FtZSBmaWxlLiBGb3IgaW5zdGFuY2UsIHlvdSBoYXZlIGJlZ3VuIHRvIGVkaXQgYSBmaWxlLCBhbmQgd2hpbGUgeW91IHdlcmUgd29ya2luZyBvbiBpdCwgc29tZWJvZHkgaGFzIHN1Ym1pdHRlZCBhIG5ldyB2ZXJzaW9uICBvZiB0aGUgc2FtZSBmaWxlLiBXaGVuIHlvdSBmaXJzdCBhdHRlbXB0IHRvIHN1Ym1pdCB5b3VyIGZpbGUocyksIHlvdSB3aWxsIGdldCBhIG1lc3NhZ2UgKHByb3BlcnR5IHA0Lm5lZWRzcmVzb2x2ZSBzZXQpLgorPC9saT4KKzxsaT4KK3lvdSBoYXZlIGp1c3QgYmVlbiBkb2luZyBhbiBpbnRlZ3JhdGlvbiB0byBleGlzdGluZyB0YXJnZXQgZmlsZXMKKzwvbGk+Cis8L3VsPgorUDRSZXNvbHZlIGRvZXMgbm90IHVzZSBhIGNoYW5nZSBsaXN0IG51bWJlciAoaXQgdGFrZXMgaXQgZnJvbSB0aGUgZmlsZXMgaXQgaXMgd29ya2luZyBvbikuCis8L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UGVyZm9yY2UgY29tbWFuZCBsaW5lIGZsYWc8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmlldzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZXNwZWMgdG8gcmVxdWVzdCB0byBkZWxldGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPjwvdGQ+CisgICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvbHZlbW9kZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5TaG91bGQgaGF2ZSBvbmUgb2YgdGhlc2UgdmFsdWVzIDoKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPiZxdW90O2F1dG9tYXRpYyZxdW90OzwvbGk+CisgICAgICAgIDxsaT4mcXVvdDtmb3JjZSZxdW90OzwvbGk+CisgICAgICAgIDxsaT4mcXVvdDtzYWZlJnF1b3Q7PC9saT4KKyAgICAgICAgPGxpPiZxdW90O3RoZWlycyZxdW90OzwvbGk+CisgICAgICAgIDxsaT4mcXVvdDt5b3VycyZxdW90OzwvbGk+CisgICAgICA8L3VsPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Y29ycmVzcG9uZHMgdG8gb25lIG9mIC1hbSAtYWYgLWFzIC1hdCAtYXkgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVkb2FsbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hbGxvd3MgcHJldmlvdXNseSByZXNvbHZlZCBmaWxlcyB0byBiZSByZXNvbHZlZCBhZ2FpbiAoKik8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LWY8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zaW11bGF0aW9ubW9kZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5MaXN0cyB0aGUgaW50ZWdyYXRpb25zIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCwgd2l0aG91dCBhY3R1YWxseSBkb2luZyB0aGVtLiAoKik8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+LW48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZXRleHRtb2RlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkF0dGVtcHRzIGEgdGV4dHVhbCBtZXJnZSwgZXZlbiBmb3IgYmluYXJ5IGZpbGVzICgqKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4tdDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1hcmtlcnNmb3JhbGw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UHV0cyBpbiBtYXJrZXJzIGZvciBhbGwgY2hhbmdlcywgY29uZmxpY3Rpbmcgb3Igbm90ICgqKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4tdjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGJyPgorKCopIFRoZSBmb2xsb3dpbmcgYXBwbGllcyBmb3IgYSBudW1iZXIgb2YgZmxhZ3MuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLiBUbyBzZXQgdGhlIGZsYWcsIHVzZSAgJnF1b3Q7dHJ1ZSZxdW90OworCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyZsdDtwNHJlc29sdmUKKyAgICB2aWV3PSZxdW90Oy8vZGVwb3QvcHJvamVjdHMvcHJvamVjdGZvby9tYWluL3NyYy9CbGFoLmphdmEuLi4mcXVvdDsKKyAgICByZXNvbHZlbW9kZT0mcXVvdDthdXRvbWF0aWMmcXVvdDsvJmd0OworPC9wcmU+CisKKzxoMj48YSBuYW1lPSJjaGFuZ2VzIj5DaGFuZ2UgSGlzdG9yeTwvYT48L2gyPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNlcHQgMjAwMDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4tLTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JbnRlcm5hbCBSZWxlYXNlIHdpdGhpbiBSdWJ1czwvdGQ+Cis8L3RyPgorCis8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Ob3YgMjAwMDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5WMS4wPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkluaXRpYWwgUmVsZWFzZSBkb25hdGVkIHRvIEFTRiA6LSk8L3RkPgorPC90cj4KKzx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkphbiAyMDAxPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlYxLjE8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Rml4ZWQgY3Jvc3MgcGxhdGZvcm0gKE5UL1VuaXgpIGJ1Zzxicj4KKyAgICBSZWZhY3RvcmVkIHA0IG91dHB1dCBoYW5kbGluZyBjb2RlPGJyPgorICAgIFJlZmFjdG9yZWQgZXhlYydpbmcgY29kZTwvdGQ+ICAgIAorPC90cj4KKzx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkphbiAyMDAzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlYxLjI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QWRkZWQgZ2xvYmFsb3B0cyB0byBQNEJhc2UgdG8gYWxsb3cgCisgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsIGdsb2JhbCBvcHRpb25zIHRvIGJlIHNldC48YnI+CisgICAgICAgICAgICAgICAgICAgICBBZGRlZCBwNGZzdGF0IHRhc2s8L3RkPgorPC90cj4KKzx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk1heSAyMDAzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlYxLjM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QWRkZWQgcDRsYWJlbHN5bmMsIHA0cmVzb2x2ZSwgcDRpbnRlZ3JhdGUuPGJyPgorICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZCBwNHN1Ym1pdCAoZGV0ZWN0aW9uIG9mIGNoYW5nZXMgb2YgY2hhbmdlIG51bWJlcnMsCisgICAgICAgICAgICAgICAgICAgICBhbmQgb2YgZmFpbGVkIHN1Ym1pdHMgZHVlIHRvIHJlc29sdXRpb24gbmVlZGVkKTwvdGQ+Cis8L3RyPgorPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SmFuIDIwMDQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YW50IDEuNi4xPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorQ2hhbmdlZCBwNHN1Ym1pdCwgbmVlZHNyZXNvbHZlcHJvcGVydHkgYW5kIGNoYW5nZXByb3BlcnR5IGFkZGVkPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3Byb3BlcnR5ZmlsZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9wcm9wZXJ0eWZpbGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTczOTgzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9wcm9wZXJ0eWZpbGUuaHRtbApAQCAtMCwwICsxLDIwNiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UHJvcGVydHlGaWxlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgxPlByb3BlcnR5RmlsZTwvaDE+Cis8cD5ieTwvcD4KKzwhLS0gTmFtZXMgYXJlIGluIGFscGhhYmV0aWNhbCBvcmRlciwgb24gbGFzdCBuYW1lIC0tPgorPHVsPgorICA8bGk+VGhvbWFzIENocmlzdGVuICg8YSBocmVmPSJtYWlsdG86Y2hyQGFjdGl2ZS5jaCI+Y2hyQGFjdGl2ZS5jaDwvYT4pPC9saT4KKyAgPGxpPkplcmVteSBNYXdzb24gKDxhIGhyZWY9Im1haWx0bzpqZW1AbG9mdGluc3BhY2UuY29tLmF1Ij5qZW1AbG9mdGluc3BhY2UuY29tL2F1PC9hPik8L2xpPgorPC91bD4KKworPGhyPgorPGgyPlRhYmxlIG9mIENvbnRlbnRzPC9oMj4KKzx1bD4KKyAgPGxpPjxhIGhyZWY9IiNpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI3Byb3B0YXNrIj5Qcm9wZXJ0eUZpbGUgVGFzazwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI2VudHJ5RWxlbWVudCI+RW50cnkgVGFzazwvYT48L2xpPgorPC91bD4KKworPGhyPgorPGgyPjxhIG5hbWU9ImludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvaDI+Cis8cD5BbnQgcHJvdmlkZXMgYW4gb3B0aW9uYWwgdGFzayBmb3IgZWRpdGluZyBwcm9wZXJ0eSBmaWxlcy4gIFRoaXMgaXMgdmVyeSB1c2VmdWwKK3doZW4gd2FudGluZyB0byBtYWtlIHVuYXR0ZW5kZWQgbW9kaWZpY2F0aW9ucyB0byBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBhcHBsaWNhdGlvbgorc2VydmVycyBhbmQgYXBwbGljYXRpb25zLiAgQ3VycmVudGx5LCB0aGUgdGFzayBtYWludGFpbnMgYSB3b3JraW5nIHByb3BlcnR5IGZpbGUgd2l0aAordGhlIGFiaWxpdHkgdG8gYWRkIHByb3BlcnRpZXMgb3IgbWFrZSBjaGFuZ2VzIHRvIGV4aXN0aW5nIG9uZXMuICBIb3dldmVyLCBhbnkgY29tbWVudHMKK2FyZSBsb3N0LjwvcD4KKworPGhyPgorPGgyPjxhIG5hbWU9InByb3B0YXNrIj5Qcm9wZXJ0eUZpbGUgVGFzazwvYT48L2gyPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkxvY2F0aW9uIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRvIGJlIGVkaXRlZDwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+Y29tbWVudDwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+SGVhZGVyIGZvciB0aGUgZmlsZSBpdHNlbGY8L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND48YSBuYW1lPSJlbnRyeUVsZW1lbnQiPkVudHJ5PC9hPjwvaDQ+Cis8cD5Vc2UgbmVzdGVkIDxjb2RlPiZsdDtlbnRyeSZndDs8L2NvZGU+CitlbGVtZW50cyB0byBzcGVjaWZ5IGFjdHVhbCBtb2RpZmljYXRpb25zIHRvIHRoZSBwcm9wZXJ0eSBmaWxlIGl0c2VsZi48L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5rZXk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiB0aGUgcHJvcGVydHkgbmFtZS92YWx1ZSBwYWlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlZhbHVlIHRvIHNldCAoPSksIHRvIGFkZCAoKykgb3Igc3VidHJhY3QgKC0pPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkF0IGxlYXN0IG9uZSBtdXN0IGJlIHNwZWNpZmllZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5pdGlhbCB2YWx1ZSB0byBzZXQgZm9yIGEgcHJvcGVydHkgaWYgaXQgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIHByb3BlcnR5IGZpbGUuPGJyPgorICAgICAgICAgICAgICAgICAgICAgRm9yIHR5cGUgZGF0ZSwgYW4gYWRkaXRpb25hbCBrZXl3b3JkIGlzIGFsbG93ZWQ6ICZxdW90O25vdyZxdW90OzwvdGQ+CisgICAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5SZWdhcmQgdGhlIHZhbHVlIGFzIDogaW50LCBkYXRlIG9yIHN0cmluZyAoZGVmYXVsdCk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vcGVyYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+JnF1b3Q7KyZxdW90OyBvciAmcXVvdDs9JnF1b3Q7IChkZWZhdWx0KSBmb3IgYWxsIGRhdGF0eXBlczxicj4mcXVvdDstJnF1b3Q7IChmb3IgZGF0ZSBhbmQgaW50IG9ubHkpLjxicj4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXR0ZXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkZvciBpbnQgYW5kIGRhdGUgdHlwZSBvbmx5LiBJZiBwcmVzZW50LCBWYWx1ZXMgd2lsbAorICAgICAgICAgICAgICAgICAgICAgYmUgcGFyc2VkIGFuZCBmb3JtYXR0ZWQgYWNjb3JkaW5nbHkuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dW5pdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdW5pdCBvZiB0aGUgdmFsdWUgdG8gYmUgYXBwbGllZCB0byBkYXRlICsvLSBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgVmFsaWQgVmFsdWVzIGFyZToKKyAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5taWxsaXNlY29uZDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+c2Vjb25kPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5taW51dGU8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPmhvdXI8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPmRheSAoZGVmYXVsdCk8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPndlZWs8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPm1vbnRoPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT55ZWFyPC9saT4KKyAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgICAgICBUaGlzIG9ubHkgYXBwbGllcyB0byBkYXRlIHR5cGVzIHVzaW5nIGEgKy8tIG9wZXJhdGlvbi4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPlRoZSBydWxlcyB1c2VkIHdoZW4gc2V0dGluZyBhIHByb3BlcnR5IHZhbHVlIGFyZSBzaG93biBiZWxvdy4mbmJzcDsgVGhlCitvcGVyYXRpb24gb2NjdXJzIDxiPmFmdGVyPC9iPiB0aGVzZSBydWxlcyBhcmUgY29uc2lkZXJlZC48L3A+CisKKzx1bD4KKyAgPGxpPklmIG9ubHkgdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIGl0IHJlZ2FyZGxlc3Mgb2YgaXRzCisgIHByZXZpb3VzIHZhbHVlLjwvbGk+CisgIDxsaT5JZiBvbmx5IGRlZmF1bHQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgcHJldmlvdXNseSBleGlzdGVkIGluIHRoZQorICBwcm9wZXJ0eSBmaWxlLCBpdCBpcyB1bmNoYW5nZWQuPC9saT4KKyAgPGxpPklmIG9ubHkgZGVmYXVsdCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBkaWQgbm90IGV4aXN0IGluIHRoZQorICBwcm9wZXJ0eSBmaWxlLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIGRlZmF1bHQuPC9saT4KKyAgPGxpPklmIHZhbHVlIGFuZCBkZWZhdWx0IGFyZSBib3RoIHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IHByZXZpb3VzbHkKKyAgZXhpc3RlZCBpbiB0aGUgcHJvcGVydHkgZmlsZSwgdGhlIHByb3BlcnR5IGlzIHNldCB0byB2YWx1ZS48L2xpPgorICA8bGk+SWYgdmFsdWUgYW5kIGRlZmF1bHQgYXJlIGJvdGggc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgZGlkIG5vdCBleGlzdCBpbgorICB0aGUgcHJvcGVydHkgZmlsZSwgdGhlIHByb3BlcnR5IGlzIHNldCB0byBkZWZhdWx0LjwvbGk+Cis8L3VsPgorPHA+Jm5ic3A7PC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorCis8cD5UaGUgZm9sbG93aW5nIGNoYW5nZXMgdGhlIG15LnByb3BlcnRpZXMgZmlsZS4gIEFzc3VtZSBteS5wcm9wZXJ0aWVzIGxvb2sgbGlrZTo8L3A+CisKKzxwcmU+IyBBIGNvbW1lbnQKK2FrZXk9bm92YWx1ZTwvcHJlPgorCis8cD5BZnRlciBydW5uaW5nLCB0aGUgZmlsZSB3b3VsZCBub3cgbG9vayBsaWtlCis8L3A+Cis8cHJlPiNUaHUgTm92IDAyIDIzOjQxOjQ3IEVTVCAyMDAwCitha2V5PWF2YWx1ZQorYWRhdGU9MjAwMC8xMS8wMiAyM1w6NDEKK2FuaW50PTEKK2Zvcm1hdGVkLmludD0wMDE0Citmb3JtYXRlZC5kYXRlPTAyOCAxN1w6MzQKKzwvcHJlPgorPHA+CitUaGUgc2xhc2hlcyBjb25mb3JtIHRvIHRoZSBleHBlY3RhdGlvbnMgb2YgdGhlIFByb3BlcnRpZXMgY2xhc3MuICBUaGUgZmlsZSB3aWxsIGJlIHN0b3JlZCBpbiBhIG1hbm5lciBzbyB0aGF0IGVhY2ggY2hhcmFjdGVyIGlzIGV4YW1pbmVkIGFuZCBlc2NhcGVkIGlmIG5lY2Vzc2FyeS4gIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgY29tbWVudCBpcyBub3cgbG9zdC4gIFBsZWFzZSBrZWVwIHRoaXMgaW4gbWluZCB3aGVuIHJ1bm5pbmcgdGhpcyB0YXNrIGFnYWluc3QgaGVhdmlseSBjb21tZW50ZWQgcHJvcGVydGllcyBmaWxlcy4gIEl0IG1heSBiZSBiZXN0IHRvIGhhdmUgYSBjb21tZW50ZWQgdmVyc2lvbiBpbiB0aGUgc291cmNlIHRyZWUsIGNvcHkgaXQgdG8gYSBkZXBsb3ltZW50IGFyZWEsIGFuZCB0aGVuIHJ1biB0aGUgbW9kaWZpY2F0aW9ucyBvbiB0aGUgY29weS4gIEZ1dHVyZSB2ZXJzaW9ucyBvZiBQcm9wZXJ0eUZpbGUgd2lsbCBob3BlZnVsbHkgZWxpbWluYXRlIHRoaXMgc2hvcnRjb21pbmcuCis8L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+Jmx0O3Byb3BlcnR5ZmlsZQorICAgIGZpbGU9JnF1b3Q7bXkucHJvcGVydGllcyZxdW90OworICAgIGNvbW1lbnQ9JnF1b3Q7TXkgcHJvcGVydGllcyZxdW90OyZndDsKKyAgJmx0O2VudHJ5ICBrZXk9JnF1b3Q7YWtleSZxdW90OyB2YWx1ZT0mcXVvdDthdmFsdWUmcXVvdDsvJmd0OworICAmbHQ7ZW50cnkgIGtleT0mcXVvdDthZGF0ZSZxdW90OyB0eXBlPSZxdW90O2RhdGUmcXVvdDsgdmFsdWU9JnF1b3Q7bm93JnF1b3Q7LyZndDsKKyAgJmx0O2VudHJ5ICBrZXk9JnF1b3Q7YW5pbnQmcXVvdDsgdHlwZT0mcXVvdDtpbnQmcXVvdDsgb3BlcmF0aW9uPSZxdW90OysmcXVvdDsvJmd0OworICAmbHQ7ZW50cnkgIGtleT0mcXVvdDtmb3JtYXRlZC5pbnQmcXVvdDsgdHlwZT0mcXVvdDtpbnQmcXVvdDsgZGVmYXVsdD0mcXVvdDswMDEzJnF1b3Q7IG9wZXJhdGlvbj0mcXVvdDsrJnF1b3Q7IHBhdHRlcm49JnF1b3Q7MDAwMCZxdW90Oy8mZ3Q7CisgICZsdDtlbnRyeSAga2V5PSZxdW90O2Zvcm1hdGVkLmRhdGUmcXVvdDsgdHlwZT0mcXVvdDtkYXRlJnF1b3Q7IHZhbHVlPSZxdW90O25vdyZxdW90OyBwYXR0ZXJuPSZxdW90O0RERCBISDptbSZxdW90Oy8mZ3Q7CismbHQ7L3Byb3BlcnR5ZmlsZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPgorVG8gcHJvZHVjZSBkYXRlcyByZWxhdGl2ZSBmcm9tIHRvZGF5IDo8L3A+Cis8YmxvY2txdW90ZT48cHJlPiZsdDtwcm9wZXJ0eWZpbGUKKyAgICBmaWxlPSZxdW90O215LnByb3BlcnRpZXMmcXVvdDsKKyAgICBjb21tZW50PSZxdW90O015IHByb3BlcnRpZXMmcXVvdDsmZ3Q7CisgICZsdDtlbnRyeSAga2V5PSZxdW90O2Zvcm1hdGVkLmRhdGUtMSZxdW90OworICAgICAgdHlwZT0mcXVvdDtkYXRlJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7bm93JnF1b3Q7IHBhdHRlcm49JnF1b3Q7REREJnF1b3Q7CisgICAgICBvcGVyYXRpb249JnF1b3Q7LSZxdW90OyB2YWx1ZT0mcXVvdDsxJnF1b3Q7LyZndDsKKyAgJmx0O2VudHJ5ICBrZXk9JnF1b3Q7Zm9ybWF0ZWQudG9tb3Jyb3cmcXVvdDsKKyAgICAgIHR5cGU9JnF1b3Q7ZGF0ZSZxdW90OyBkZWZhdWx0PSZxdW90O25vdyZxdW90OyBwYXR0ZXJuPSZxdW90O0RERCZxdW90OworICAgICAgb3BlcmF0aW9uPSZxdW90OysmcXVvdDsgdmFsdWU9JnF1b3Q7MSZxdW90Oy8mZ3Q7CismbHQ7L3Byb3BlcnR5ZmlsZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+CitDb25jYXRlbmF0aW9uIG9mIHN0cmluZ3MgOjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+Jmx0O3Byb3BlcnR5ZmlsZQorICAgIGZpbGU9JnF1b3Q7bXkucHJvcGVydGllcyZxdW90OworICAgIGNvbW1lbnQ9JnF1b3Q7TXkgcHJvcGVydGllcyZxdW90OyZndDsKKyAgJmx0O2VudHJ5ICBrZXk9JnF1b3Q7cHJvZ3Jlc3MmcXVvdDsgZGVmYXVsdD0mcXVvdDsmcXVvdDsgb3BlcmF0aW9uPSZxdW90OysmcXVvdDsgdmFsdWU9JnF1b3Q7LiZxdW90Oy8mZ3Q7CismbHQ7L3Byb3BlcnR5ZmlsZSZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPkVhY2ggdGltZSBjYWxsZWQsIGEgJnF1b3Q7LiZxdW90OyB3aWxsIGJlIGFwcGVuZGVkIHRvICZxdW90O3Byb2dyZXNzJnF1b3Q7Cis8L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcHZjc3Rhc2suaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcHZjc3Rhc2suaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY4MTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9wdmNzdGFzay5odG1sCkBAIC0wLDAgKzEsMjk1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5QVkNTIHRhc2s8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzxoMT4KK0FudCBQdmNzIFRhc2sgVXNlciBNYW51YWw8L2gxPgorCis8cD48Yj5Ob3RlOjwvYj4KK0JlZm9yZSB1c2luZyB0aGlzIHRhc2ssIHRoZSB1c2VyIHJ1bm5pbmcgYW50IG11c3QgaGF2ZSBhY2Nlc3MgdG8gdGhlCitjb21tYW5kcyBvZiBQVkNTIChnZXQgYW5kIHBjbGkpIGFuZCBtdXN0IGhhdmUgYWNjZXNzIHRvIHRoZQorcmVwb3NpdG9yeS4gTm90ZSB0aGF0IHRoZSB3YXkgdG8gc3BlY2lmeSB0aGUgcmVwb3NpdG9yeSBpcyBwbGF0Zm9ybQorZGVwZW5kZW50IHNvIHVzZSBwcm9wZXJ0eSB0byBzcGVjaWZ5IGxvY2F0aW9uIG9mIHJlcG9zaXRvcnkuCis8L3A+CisKK2J5Cis8YnI+PCEtLSBOYW1lcyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBvbiBsYXN0IG5hbWUgLS0+Cis8dWw+CisgIDxsaT5UaG9tYXMgQ2hyaXN0ZW5zZW4gKDxhIGhyZWY9Im1haWx0bzp0Y2hyaXN0ZW5zZW5Abm9yZGlqYS5jb20iPnRjaHJpc3RlbnNlbkBub3JkaWphLmNvbTwvYT4pPC9saT4KKyAgPGxpPkRvbiBKZWZmZXJ5ICg8YSBocmVmPSJtYWlsdG86ZG9uakBhcG9nZWVuZXQuY29tIj5kb25qQGFwb2dlZW5ldC5jb208L2E+KTwvbGk+CisgIDxsaT5Kb24gRGlja2luc29uICg8YSBocmVmPSJtYWlsdG86ZGlja2luc29uLmpAdWNsZXMub3JnLnVrIj5kaWNraW5zb24uakB1Y2xlcy5vcmcudWs8L2E+KTwvbGk+Cis8L3VsPgorVmVyc2lvbiAxLjEgLSAyMDAxLzA2LzI3PGJyPgorPHA+UHJvYmxlbXMgd2l0aCBVTkMgcGF0aG5hbWVzIGFuZCB0aGUgdXNlIG9mICgpIGluIHBhdGhzIGFyZSBmaXhlZCBhbmQgYW4gdXBkYXRlb25seQorICBhcmd1bWVudCBpbnRyb2R1Y2VkLjwvcD4KK1ZlcnNpb24gMS4wIC0gMjAwMS8wMS8zMTxicj4KKzxwPkluaXRpYWwgcmVsZWFzZS48L3A+Cis8aHI+Cis8aDI+CitUYWJsZSBvZiBDb250ZW50czwvaDI+Cis8dWw+CisgIDxsaT48YSBocmVmPSIjaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNwdmNzIj5QdmNzIFRhc2s8L2E+PC9saT4KKzwvdWw+Cis8aHI+CisKKzxoMj48YSBOQU1FPSJpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2gyPgorVGhlIHB2Y3MgdGFzayBhbGxvd3MgdGhlIHVzZXIgb2YgYW50IHRvIGV4dHJhY3QgdGhlIGxhdGVzdCBlZGl0aW9uCitvZiB0aGUgc291cmNlIGNvZGUgZnJvbSBhIFBWQ1MgcmVwb3NpdG9yeS4gUFZDUyBpcyBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0KK2RldmVsb3BlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3Lm1lcmFudC5jb20vcHJvZHVjdHMvcHZjcyI+TWVyYW50PC9hPi4KKzxicj4KK1RoaXMgdmVyc2lvbiBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zdCBQVkNTIHZlcnNpb24gNi41IGFuZCA2LjYgdW5kZXIgV2luZG93cyBhbmQgU29sYXJpcy4KKworPGhyPgorPGgyPjxhIE5BTUU9InB2Y3MiPlB2Y3MgVGFzazwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1RoZSBwdmNzIHRhc2sgaXMgc2V0IHRvIHBvaW50IGF0IGEgUFZDUyByZXBvc2l0b3J5IGFuZCBvcHRpb25hbGx5IGEgcHJvamVjdAord2l0aGluIHRoYXQgcmVwb3NpdG9yeSwgYW5kIGNhbiBmcm9tIHRoYXQgc3BlY2lmaWNhdGlvbiBnZXQgdGhlIGxhdGVzdAordmVyc2lvbiBvZiB0aGUgZmlsZXMgY29udGFpbmVkIGJ5IHRoZSByZXBvc2l0b3J5LgorPGgzPgorUGFyYW1ldGVyczwvaDM+CisKKzx0YWJsZSBCT1JERVIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0yID4KKzx0cj4KKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMiUiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+cmVwb3NpdG9yeTwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSI3OCUiPlRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSAoc2VlIHlvdXIgUFZDUworbWFudWFscyk8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj5ZZXM8L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+cHZjc3Byb2plY3Q8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5UaGUgcHJvamVjdCB3aXRoaW4gdGhlIFBWQ1MgcmVwb3NpdG9yeSB0byBleHRyYWN0CitmaWxlcyBmcm9tICgmcXVvdDsvJnF1b3Q7IGlzIHJvb3QgcHJvamVjdCBhbmQgdGhhdCBpcyBkZWZhdWx0IGlmIHRoaXMgYXR0cmlidXRlIGlzbid0CitzcGVjaWZpZWQpPC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEwJSI+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+bGFiZWw8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5Pbmx5IGZpbGVzIG1hcmtlZCB3aXRoIHRoaXMgbGFiZWwgYXJlIGV4dHJhY3RlZC48L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj5ObzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMTIlIj5wcm9tb3Rpb25ncm91cDwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSI3OCUiPk9ubHkgZmlsZXMgd2l0aGluIHRoaXMgcHJvbW90aW9uIGdyb3VwIGFyZSBleHRyYWN0ZWQuIFVzaW5nCitib3RoIHRoZSA8aT5sYWJlbDwvaT4gYW5kIHRoZSA8aT5wcm9tb3Rpb25ncm91cDwvaT4gdGFnIHdpbGwgY2F1c2UgdGhlIGZpbGVzIGluIHRoZQorcHJvbW90aW9uIGdyb3VwIGFuZCB3aXRoIHRoYXQgbGFiZWwgdG8gYmUgZXh0cmFjdGVkLgorPC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEwJSI+Tm88L3RkPgorPC90cj4KKworPHRyPgorPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+Y29uZmlnPC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9Ijc4JSI+cGF0aCBvZiBhIG5vbiBkZWZhdWx0IC5jZmcgZmlsZS4KK0NhbiBiZSBnaXZlbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSB0byBhbnQncyBiYXNlIGRpcmVjdG9yeS4KKzwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMCUiPk5vPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMiUiPmZvcmNlPC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9Ijc4JSI+SWYgc2V0IHRvIDxpPnllczwvaT4gYWxsIGZpbGVzIHRoYXQgZXhpc3RzIGFuZCBhcmUgd3JpdGFibGUgYXJlIG92ZXJ3cml0dGVuLiBEZWZhdWx0IDxpPm5vPC9pPiBjYXVzZXMgdGhlIGZpbGVzIHRoYXQgYXJlIHdyaXRhYmxlIHRvIGJlIGlnbm9yZWQuIFRoaXMgc3RvcHMgdGhlIFBWQ1MgY29tbWFuZCA8aT5nZXQ8L2k+IHRvIHN0b3AgYXNraW5nIHF1ZXN0aW9ucyE8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj5ObzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMTIlIj53b3Jrc3BhY2U8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5CeSBzcGVjaWZ5aW5nIGEgd29ya3NwYWNlLCB0aGUgZmlsZXMgYXJlIGV4dHJhY3RlZCB0byB0aGF0IGxvY2F0aW9uLiBBIFBWQ1Mgd29ya3NwYWNlIGlzIGEKK25hbWUgZm9yIGEgbG9jYXRpb24gb2YgdGhlIHdvcmtmaWxlcyBhbmQgaXNuJ3QgYXMgc3VjaCB0aGUgbG9jYXRpb24gaXRzZWxmLiBZb3UgZGVmaW5lIHRoZSBsb2NhdGlvbiBmb3IgYSB3b3Jrc3BhY2UKK3VzaW5nIHRoZSBQVkNTIEdVSSBjbGllbnRzLiBJZiB0aGlzIGlzbid0IHNwZWNpZmllZCB0aGUgZGVmYXVsdCB3b3Jrc3BhY2UgZm9yIHRoZSBjdXJyZW50IHVzZXIgaXMgdXNlZC48L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj5ObzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMTIlIj5wdmNzYmluPC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9Ijc4JSI+T24gc29tZSBzeXN0ZW1zIHRoZSBQVkNTIGV4ZWN1dGFibGVzIDxpPnBjbGk8L2k+CithbmQgPGk+Z2V0PC9pPiBhcmUgbm90IGZvdW5kIGluIHRoZSBQQVRILiBJbiBzdWNoIGNhc2VzIHRoaXMgYXR0cmlidXRlCitzaG91bGQgYmUgc2V0IHRvIHRoZSBiaW4gZGlyZWN0b3J5IG9mIHRoZSBQVkNTIGluc3RhbGxhdGlvbiBjb250YWluaW5nCit0aGUgZXhlY3V0YWJsZXMgbWVudGlvbmVkIGJlZm9yZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXNuJ3Qgc3BlY2lmaWVkIHRoZQordGFnIGV4cGVjdHMgdGhlIGV4ZWN1dGFibGVzIHRvIGJlIGZvdW5kIHVzaW5nIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLjwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMCUiPk5vPC90ZD4KKzwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+aWdub3JlcmV0dXJuY29kZTwvdGQ+CisgICAgICA8dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5JZiBzZXQgdG8gPGk+dHJ1ZTwvaT4gdGhlIHJldHVybiB2YWx1ZSBmcm9tIGV4ZWN1dGluZworICAgICAgICB0aGUgcHZjcyBjb21tYW5kcyBhcmUgaWdub3JlZC48L3RkPgorICAgICAgPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEwJSI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+dXBkYXRlb25seTwvdGQ+CisgICAgICA8dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5JZiBzZXQgdG8gPGk+dHJ1ZTwvaT4gZmlsZXMgYXJlIGdvdHRlbiBvbmx5IGlmCisgICAgICAgIG5ld2VyIHRoYW4gZXhpc3RpbmcgbG9jYWwgZmlsZXMuPC90ZD4KKyAgICAgIDx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMCUiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249IlRPUCI+ZmlsZW5hbWVmb3JtYXQ8L3RkPgorICAgICAgPHRkIHZhbGlnbj0iVE9QIj5UaGUgZm9ybWF0IG9mIHlvdXIgZm9sZGVyIG5hbWVzIGluIGEKKyAgICAgICAgICBmb3JtYXQgc3VpdGFibGUgZm9yIDxjb2RlPmphdmEudGV4dC5NZXNzYWdlRm9ybWF0PC9jb2RlPi4KKyAgICAgICAgICBEZWZhdWx0cyB0byA8Y29kZT57MH0tYXJjKHsxfSk8L2NvZGU+LiAgUmVwb3NpdG9yaWVzIHdoZXJlCisgICAgICAgICAgdGhlIGFyY2hpdmUgZXh0ZW5zaW9uIGlzIG5vdCAgPGNvZGU+LWFyYzwvY29kZT4gc2hvdWxkIHNldAorICAgICAgICAgIHRoaXMuPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249IlRPUCI+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0iVE9QIj5saW5lc3RhcnQ8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJUT1AiPlVzZWQgdG8gcGFyc2UgdGhlIG91dHB1dCBvZiB0aGUgcGNsaQorICAgICAgICAgIGNvbW1hbmQuIEl0IGRlZmF1bHRzIHRvIDxjb2RlPiZxdW90O1A6PC9jb2RlPi4gIFRoZSBwYXJzZXIgYWxyZWFkeQorICAgICAgICAgIGtub3dzIGFib3V0IC8gYW5kIFxcLCB0aGlzIHByb3BlcnR5IGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB0aGUKKyAgICAgICAgICByZXBvc2l0b3J5IGlzIGFjY2Vzc2VkIG9uIGEgV2luZG93cyBwbGF0Zm9ybSB2aWEgYSBkcml2ZSBsZXR0ZXIKKyAgICAgICAgICBtYXBwaW5nLjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUT1AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249IlRPUCI+cmV2aXNpb248L3RkPgorICAgICAgPHRkIHZhbGlnbj0iVE9QIj5SZXRyaWV2ZSB0aGUgc3BlY2lmaWVkIHJldmlzaW9uLjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUT1AiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249IlRPUCI+dXNlcmlkPC90ZD4KKyAgICAgIDx0ZCB2YWxpZ249IlRPUCI+VXNlIHRoZSBzcGVjaWZpZWQgdXNlcmlkLjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJUT1AiPk5vPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKzxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgorCis8aDM+cHZjc3Byb2plY3QgZWxlbWVudDwvaDM+Cis8cD48Y29kZT5wdmNzPC9jb2RlPiBzdXBwb3J0cyBhIG5lc3RlZAorPGNvZGU+Jmx0O3B2Y3Nwcm9qZWN0Jmd0OzwvY29kZT4gZWxlbWVudCwgdGhhdCByZXByZXNlbnRzIGEgcHJvamVjdAord2l0aGluIHRoZSBQVkNTIHJlcG9zaXRvcnkgdG8gZXh0cmFjdCBmaWxlcyBmcm9tLiAgQnkgbmVzdGluZyBtdWx0aXBsZQorPGNvZGU+Jmx0O3B2Y3Nwcm9qZWN0Jmd0OzwvY29kZT4gZWxlbWVudHMgdW5kZXIgdGhlCis8Y29kZT4mbHQ7cHZjcyZndDs8L2NvZGU+IHRhc2ssIG11bHRpcGxlIHByb2plY3RzIGNhbiBiZQorc3BlY2lmaWVkLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorCis8dGFibGUgQk9SREVSIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MiA+Cis8dHI+Cis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMTIlIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9Ijc4JSI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEwJSI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMiUiPm5hbWU8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5UaGUgbmFtZSBvZiB0aGUgcHZjcyBwcm9qZWN0PC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEwJSI+WWVzPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorVGhlIGZvbGxvd2luZyBzZXQtdXAgZXh0cmFjdHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBmaWxlcyBpbiB0aGUgcHZjcyByZXBvc2l0b3J5LgorPHByZT4KKyAgJmx0OyEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tJmd0OworICAmbHQ7IS0tIEdldCB0aGUgbGF0ZXN0IHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0mZ3Q7CisgICZsdDshLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLSZndDsKKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2dldGxhdGVzdCZxdW90OyZndDsKKyAgICAmbHQ7cHZjcyByZXBvc2l0b3J5PSZxdW90Oy9tbnQvcHZjcyZxdW90OyBwdmNzcHJvamVjdD0mcXVvdDsvbXlwcmomcXVvdDsvJmd0OworICAmbHQ7L3RhcmdldCZndDs8L3VsPgorPC9wcmU+Cis8cD5Ob3cgcnVuOjwvcD4KKzxjb2RlPmFudCBnZXRsYXRlc3Q8L2NvZGU+Cis8cD5UaGlzIHdpbGwgY2F1c2UgdGhlIGZvbGxvd2luZyBvdXRwdXQgdG8gYXBwZWFyOjwvcD4KKzxwcmU+CisgIGdldGxhdGVzdDoKKyAgW3B2Y3NdIFBWQ1MgVmVyc2lvbiBNYW5hZ2VyIChWTUdVSSkgdjYuNi4xMCAoQnVpbGQgODcwKSBmb3IgV2luZG93cyBOVC84MHg4NgorICBbcHZjc10gQ29weXJpZ2h0IDE5ODUtMjAwMCBNRVJBTlQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIFtwdmNzXSBQVkNTIFZlcnNpb24gTWFuYWdlciAoZ2V0KSB2Ni42LjEwIChCdWlsZCA4NzApIGZvciBXaW5kb3dzIE5ULzgweDg2CisgIFtwdmNzXSBDb3B5cmlnaHQgMTk4NS0yMDAwIE1FUkFOVC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgW3B2Y3NdIGM6XG15d3NcbXlwcmpcbWFpbi5qYXZhICZsdDstIEM6XG15cHZjc1xhcmNoaXZlc1xteXByalxtYWluLmphdmEtYXJjCisgIFtwdmNzXSByZXYgMS4xCisgIFtwdmNzXSBjOlxteXdzXG15cHJqXGFwYWNoZVx0b29sLmphdmEgJmx0Oy0gQzpcbXlwdmNzXGFyY2hpdmVzXG15cHJqXGFwYWNoZVx0b29scy5qYXZhLWFyYworICBbcHZjc10gcmV2IDEuNQorCisgIEJVSUxEIFNVQ0NFU1NGVUwKKworICBUb3RhbCB0aW1lOiAxOSBzZWNvbmRzPC9wcmU+CisKK1RoaXMgbmV4dCBleGFtcGxlIGV4dHJhY3RzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgZmlsZXMgaW4gdGhlIHB2Y3MKK3JlcG9zaXRvcnkgZnJvbSB0d28gcHJvamVjdHMgdXNpbmcgbmVzdGVkIDxjb2RlPiZsdDtwdmNzcHJvamVjdCZndDs8L2NvZGU+IGVsZW1lbnRzLgorPHByZT4KKyAgJmx0OyEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0mZ3Q7CisgICZsdDshLS0gR2V0IGxhdGVzdCBmcm9tIG15cHJqIGFuZCBteXByajIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tJmd0OworICAmbHQ7IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLSZndDsKKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2dldGxhdGVzdDImcXVvdDsmZ3Q7CisgICAgJmx0O3B2Y3MgcmVwb3NpdG9yeT0mcXVvdDsvbW50L3B2Y3MmcXVvdDsmZ3Q7CisgICAgICAmbHQ7cHZjc3Byb2plY3QgbmFtZT0mcXVvdDsvbXlwcmomcXVvdDsvJmd0OworICAgICAgJmx0O3B2Y3Nwcm9qZWN0IG5hbWU9JnF1b3Q7L215cHJqMiZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9wdmNzJmd0OworICAmbHQ7L3RhcmdldCZndDs8L3VsPgorPC9wcmU+Cis8cD5Ob3cgcnVuOjwvcD4KKzxjb2RlPmFudCBnZXRsYXRlc3QyPC9jb2RlPgorPHA+VGhpcyB3aWxsIGNhdXNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0IHRvIGFwcGVhcjo8L3A+Cis8cHJlPgorICBnZXRsYXRlc3QyOgorICBbcHZjc10gUFZDUyBWZXJzaW9uIE1hbmFnZXIgKFZNR1VJKSB2Ni42LjEwIChCdWlsZCA4NzApIGZvciBXaW5kb3dzIE5ULzgweDg2CisgIFtwdmNzXSBDb3B5cmlnaHQgMTk4NS0yMDAwIE1FUkFOVC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIFtwdmNzXSBQVkNTIFZlcnNpb24gTWFuYWdlciAoZ2V0KSB2Ni42LjEwIChCdWlsZCA4NzApIGZvciBXaW5kb3dzIE5ULzgweDg2CisgIFtwdmNzXSBDb3B5cmlnaHQgMTk4NS0yMDAwIE1FUkFOVC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIFtwdmNzXSBjOlxteXdzXG15cHJqXG1haW4uamF2YSAmbHQ7LSBDOlxteXB2Y3NcYXJjaGl2ZXNcbXlwcmpcbWFpbi5qYXZhLWFyYworICBbcHZjc10gcmV2IDEuMQorICBbcHZjc10gYzpcbXl3c1xteXByalxhcGFjaGVcdG9vbC5qYXZhICZsdDstIEM6XG15cHZjc1xhcmNoaXZlc1xteXByalxhcGFjaGVcdG9vbC5qYXZhLWFyYworICBbcHZjc10gcmV2IDEuNQorICBbcHZjc10gYzpcbXl3c1xteXByajJcYXBhY2hlXHRvb2wyLmphdmEgJmx0Oy0gQzpcbXlwdmNzXGFyY2hpdmVzXG15cHJqMlxhcGFjaGVcdG9vbDIuamF2YS1hcmMKKyAgW3B2Y3NdIHJldiAxLjIKKworICBCVUlMRCBTVUNDRVNTRlVMCisKKyAgVG90YWwgdGltZTogMjIgc2Vjb25kczwvcHJlPgorCis8aHIgV0lEVEg9IjEwMCUiPgorPHA+UFZDUyBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIE1FUkFOVC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3JlbmFtZWV4dGVuc2lvbnMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcmVuYW1lZXh0ZW5zaW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjk1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3JlbmFtZWV4dGVuc2lvbnMuaHRtbApAQCAtMCwwICsxLDEyMyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5SZW5hbWVFeHRlbnNpb25zIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InJlbmFtZWV4dHMiPlJlbmFtZUV4dGVuc2lvbnM8L2E+PC9oMj4KKzxoMz48aT5EZXByZWNhdGVkPC9pPjwvaDM+Cis8cD48aT5UaGlzIHRhc2sgaGFzIGJlZW4gZGVwcmVjYXRlZC4gIFVzZSB0aGUgPGEgaHJlZj0iLi4vQ29yZVRhc2tzL21vdmUuaHRtbCI+bW92ZTwvYT4KK3Rhc2sgd2l0aCBhIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCNnbG9iLW1hcHBlciI+Z2xvYiBtYXBwZXI8L2E+IGluc3RlYWQuPC9pPjwvcD4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5SZW5hbWVzIGZpbGVzIGluIHRoZSA8Y29kZT5zcmNEaXI8L2NvZGU+IGRpcmVjdG9yeSBlbmRpbmcgd2l0aCB0aGUKKzxjb2RlPmZyb21FeHRlbnNpb248L2NvZGU+IHN0cmluZyBzbyB0aGF0IHRoZXkgZW5kIHdpdGggdGhlCis8Y29kZT50b0V4dGVuc2lvbjwvY29kZT4gc3RyaW5nLiBGaWxlcyBhcmUgb25seSByZXBsYWNlZCBpZgorPGNvZGU+cmVwbGFjZTwvY29kZT4gaXMgdHJ1ZQorPC9wPgorPHA+U2VlIHRoZSBzZWN0aW9uIG9uCis8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUKK2luY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuCitUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCitzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+CisoPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPnNyY0RpcjwvY29kZT4pIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAorPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKKzxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90CisgICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuCisgICAgICBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKKyAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuCisgICAgICBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZyb21FeHRlbnRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0cmluZyB0aGF0IGZpbGVzIG11c3QgZW5kIGluIHRvIGJlIHJlbmFtZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQorICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKKyAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlcGxhY2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGUgZmlsZSBiZWluZyByZW5hbWVkIHRvIHNob3VsZCBiZQorICAgICAgcmVwbGFjZWQgaWYgaXQgYWxyZWFkeSBleGlzdHM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNEaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0YXJ0aW5nIGRpcmVjdG9yeSBmb3IgZmlsZXMgdG8gc2VhcmNoIGluPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRvRXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdHJpbmcgdGhhdCByZW5hbWVkIGZpbGVzIHdpbGwgZW5kIHdpdGggb24KKyAgICAgIGNvbXBsZXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+CisgIDxwPjxjb2RlPiZsdDtyZW5hbWVleHQgc3JjRGlyPSZxdW90Oy9zb3VyY2UvcHJvamVjdDEmcXVvdDsKKyAgICAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiomcXVvdDsKKyAgICAgICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7Kiovc2FtcGxlcy8qJnF1b3Q7CisgICAgICAgICAgICAgIGZyb21FeHRlbnNpb249JnF1b3Q7LmphdmEua2VlcCZxdW90OworICAgICAgICAgICAgICB0b0V4dGVuc2lvbj0mcXVvdDsuamF2YSZxdW90OworICAgICAgICAgICAgICByZXBsYWNlPSZxdW90O3RydWUmcXVvdDsvJmd0OworPC9jb2RlPgorICA8L3A+Cis8L2Jsb2NrcXVvdGU+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcmVwbGFjZXJlZ2V4cC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9yZXBsYWNlcmVnZXhwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5N2QyZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcmVwbGFjZXJlZ2V4cC5odG1sCkBAIC0wLDAgKzEsMTU5IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlJlcGxhY2VSZWdFeHAgVGFzazwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGgyPjxhIG5hbWU9InJlcGxhY2VyZWdleHAiPlJlcGxhY2VSZWdFeHA8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5SZXBsYWNlUmVnRXhwIGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2sgZm9yIHJlcGxhY2luZyB0aGUKK29jY3VycmVuY2Ugb2YgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBhIHN1YnN0aXR1dGlvbiBwYXR0ZXJuCitpbiBhIHNlbGVjdGVkIGZpbGUgb3Igc2V0IG9mIGZpbGVzLjwvcD4KKworPHA+VGhlIG91dHB1dCBmaWxlIGlzIG9ubHkgd3JpdHRlbiBpZiBpdCBkaWZmZXJzIGZyb20gdGhlIGV4aXN0aW5nCitmaWxlLiAgVGhpcyBwcmV2ZW50cyBzcHVyaW91cyByZWJ1aWxkcyBiYXNlZCBvbiB1bmNoYW5nZWQgZmlsZXMgd2hpY2gKK2hhdmUgYmVlbiByZWdlbmVyYXRlZCBieSB0aGlzIHRhc2suPC9wPiAKKworPHA+U2ltaWxhciB0byA8YSBocmVmPSIuLi9Db3JlVHlwZXMvbWFwcGVyLmh0bWwjcmVnZXhwLW1hcHBlciI+cmVnZXhwCit0eXBlIG1hcHBlcnM8L2E+IHRoaXMgdGFzayBuZWVkcyBhIHN1cHBvcnRpbmcgcmVndWxhciBleHByZXNzaW9uCitsaWJyYXJ5IGFuZCBhbiBpbXBsZW1lbnRhdGlvbiBvZgorPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwPC9jb2RlPi4KK1NlZSBkZXRhaWxzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSA8YSBocmVmPSIuLi9Db3JlVHlwZXMvcmVnZXhwLmh0bWwjaW1wbGVtZW50YXRpb24iPlJlZ2V4cCBUeXBlPC9hPi4gPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGUgZm9yIHdoaWNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc2hvdWxkIGJlIHJlcGxhY2VkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPlllcyBpZiBubyBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBpcyB1c2VkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWF0Y2g8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGluIHRoZSBmaWxlKHMpPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLCBpZiBubyBuZXN0ZWQgPGNvZGU+Jmx0O3JlZ2V4cCZndDs8L2NvZGU+IGlzIHVzZWQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXBsYWNlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdWJzdGl0dXRpb24gcGF0dGVybiB0byBwbGFjZSBpbiB0aGUgZmlsZShzKSBpbiBwbGFjZQorICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ZZXMsIGlmIG5vIG5lc3RlZCA8Y29kZT4mbHQ7c3Vic3RpdHV0aW9uJmd0OzwvY29kZT4gaXMgdXNlZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZsYWdzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmbGFncyB0byB1c2Ugd2hlbiBtYXRjaGluZyB0aGUgcmVndWxhciBleHByZXNzaW9uLiAgRm9yIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uLCBjb25zdWx0IHRoZSBQZXJsNSBzeW50YXg8YnI+CisgICAgICAgICAgICAgICAgICAgICBnIDogR2xvYmFsIHJlcGxhY2VtZW50LiAgUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgZm91bmQ8YnI+CisgICAgICAgICAgICAgICAgICAgICBpIDogQ2FzZSBJbnNlbnNpdGl2ZS4gIERvIG5vdCBjb25zaWRlciBjYXNlIGluIHRoZSBtYXRjaDxicj4KKyAgICAgICAgICAgICAgICAgICAgIG0gOiBNdWx0aWxpbmUuICBUcmVhdCB0aGUgc3RyaW5nIGFzIG11bHRpcGxlIGxpbmVzIG9mIGlucHV0LCB1c2luZyAiXiIgYW5kICIkIiBhcyB0aGUgc3RhcnQgb3IgZW5kIG9mIGFueSBsaW5lLCByZXNwZWN0aXZlbHksIHJhdGhlciB0aGFuIHN0YXJ0IG9yIGVuZCBvZiBzdHJpbmcuPGJyPgorICAgICAgICAgICAgICAgICAgICAgcyA6IFNpbmdsZWxpbmUuICBUcmVhdCB0aGUgc3RyaW5nIGFzIGEgc2luZ2xlIGxpbmUgb2YgaW5wdXQsIHVzaW5nICIuIiB0byBtYXRjaCBhbnkgY2hhcmFjdGVyLCBpbmNsdWRpbmcgYSBuZXdsaW5lLCB3aGljaCBub3JtYWxseSwgaXQgd291bGQgbm90IG1hdGNoLjxicj4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ieWxpbmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UHJvY2VzcyB0aGUgZmlsZShzKSBvbmUgbGluZSBhdCBhIHRpbWUsIGV4ZWN1dGluZyB0aGUgcmVwbGFjZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgIG9uIG9uZSBsaW5lIGF0IGEgdGltZSAoPGk+dHJ1ZS9mYWxzZTwvaT4pLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91CisgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIG9ubHkgcmVwbGFjZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbgorICAgICAgICAgICAgICAgICAgICAgZWFjaCBsaW5lLCB3aGljaCBpcyBub3QgZWFzeSB0byBkbyB3aGVuIHByb2Nlc3NpbmcgdGhlIGZpbGUgYXMgYSB3aG9sZS4KKyAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIDxpPmZhbHNlPC9pPi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGUuIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGVuY29kaW5nPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyZsdDtyZXBsYWNlcmVnZXhwIGZpbGU9JnF1b3Q7JHtzcmN9L2J1aWxkLnByb3BlcnRpZXMmcXVvdDsKKyAgICAgICAgICAgICAgIG1hdGNoPSZxdW90O09sZFByb3BlcnR5PSguKikmcXVvdDsKKyAgICAgICAgICAgICAgIHJlcGxhY2U9JnF1b3Q7TmV3UHJvcGVydHk9XDEmcXVvdDsKKyAgICAgICAgICAgICAgIGJ5bGluZT0mcXVvdDt0cnVlJnF1b3Q7CisvJmd0OworPC9wcmU+Cis8cD5yZXBsYWNlcyBvY2N1cnJlbmNlcyBvZiB0aGUgcHJvcGVydHkgbmFtZSAmcXVvdDtPbGRQcm9wZXJ0eSZxdW90OworIHdpdGggJnF1b3Q7TmV3UHJvcGVydHkmcXVvdDsgaW4gYSBwcm9wZXJ0aWVzIGZpbGUsIHByZXNlcnZpbmcgdGhlIGV4aXN0aW5nCit2YWx1ZSwgaW4gdGhlIGZpbGUgPGNvZGU+JHtzcmN9L2J1aWxkLnByb3BlcnRpZXM8L2NvZGU+PC9wPgorCis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxwPlRoaXMgdGFzayBzdXBwb3J0cyBhIG5lc3RlZCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPgorICAgZWxlbWVudC48L3A+Cis8cD5UaGlzIHRhc2sgc3VwcG9ydHMgYSBuZXN0ZWQgPGk+PGEgaHJlZj0iLi4vQ29yZVR5cGVzL3JlZ2V4cC5odG1sIj5SZWdleHA8L2E+PC9pPiBlbGVtZW50IHRvIHNwZWNpZnkKKyAgIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uICBZb3UgY2FuIHVzZSB0aGlzIGVsZW1lbnQgdG8gcmVmZXIgdG8gYSBwcmV2aW91c2x5CisgICBkZWZpbmVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBkYXRhdHlwZSBpbnN0YW5jZS48L3A+Cis8YmxvY2txdW90ZT4KKyAgICAgJmx0O3JlZ2V4cCBpZD0iaWQiIHBhdHRlcm49ImFscGhhKC4rKWJldGEiLyZndDs8YnI+CisgICAgICZsdDtyZWdleHAgcmVmaWQ9ImlkIi8mZ3Q7Cis8L2Jsb2NrcXVvdGU+Cis8cD5UaGlzIHRhc2sgc3VwcG9ydHMgYSBuZXN0ZWQgPGk+U3Vic3RpdHV0aW9uPC9pPiBlbGVtZW50IHRvIHNwZWNpZnkKKyAgIHRoZSBzdWJzdGl0dXRpb24gcGF0dGVybi4gIFlvdSBjYW4gdXNlIHRoaXMgZWxlbWVudCB0byByZWZlciB0byBhIHByZXZpb3VzbHkKKyAgIGRlZmluZWQgc3Vic3RpdHV0aW9uIHBhdHRlcm4gZGF0YXR5cGUgaW5zdGFuY2UuPC9wPgorPGJsb2NrcXVvdGU+CisgICAgICZsdDtzdWJzdGl0dXRpb24gaWQ9ImlkIiBleHByZXNzaW9uPSJiZXRhXDFhbHBoYSIvJmd0Ozxicj4KKyAgICAgJmx0O3N1YnN0aXR1dGlvbiByZWZpZD0iaWQiLyZndDsKKzwvYmxvY2txdW90ZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKyAgPHByZT4KKyZsdDtyZXBsYWNlcmVnZXhwIGJ5bGluZT0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAmbHQ7cmVnZXhwIHBhdHRlcm49JnF1b3Q7T2xkUHJvcGVydHk9KC4qKSZxdW90Oy8mZ3Q7CisgICZsdDtzdWJzdGl0dXRpb24gZXhwcmVzc2lvbj0mcXVvdDtOZXdQcm9wZXJ0eT1cMSZxdW90Oy8mZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7Ki5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9yZXBsYWNlcmVnZXhwJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+cmVwbGFjZXMgb2NjdXJyZW5jZXMgb2YgdGhlIHByb3BlcnR5IG5hbWUgJnF1b3Q7T2xkUHJvcGVydHkmcXVvdDsKKyB3aXRoICZxdW90O05ld1Byb3BlcnR5JnF1b3Q7IGluIGEgcHJvcGVydGllcyBmaWxlLCBwcmVzZXJ2aW5nIHRoZSBleGlzdGluZwordmFsdWUsIGluIGFsbCBmaWxlcyBlbmRpbmcgaW4gPGNvZGU+LnByb3BlcnRpZXM8L2NvZGU+IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeTwvcD4KKworPGJsb2NrcXVvdGU+Cis8cHJlPiZsdDtyZXBsYWNlcmVnZXhwIG1hdGNoPSJccysiIHJlcGxhY2U9IiAiIGZsYWdzPSJnIiBieWxpbmU9InRydWUiJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iJHtodG1sLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmh0bWwiLyZndDsKKyZsdDsvcmVwbGFjZXJlZ2V4cCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPnJlcGxhY2VzIGFsbCB3aGl0ZXNwYWNlcyAoYmxhbmtzLCB0YWJzLCBldGMpIGJ5IG9uZSBibGFuayByZW1haW5pbmcgdGhlCitsaW5lIHNlcGFyYXRvci4gU28gd2l0aCBpbnB1dAorCis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7aHRtbCZndDsgICAgJmx0O2JvZHkmZ3Q7CismbHQ7Jmx0O1RBQiZndDsmZ3Q7Jmx0O2gxJmd0OyAgICBUIEUgUyBUICAgJmx0Oy9oMSZndDsgICZsdDsmbHQ7VEFCJmd0OyZndDsgICAgCismbHQ7Jmx0O1RBQiZndDsmZ3Q7ICZsdDsvYm9keSZndDsmbHQ7L2h0bWwmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cit3b3VsZCBjb252ZXJ0ZWQgdG8KKzxwcmU+CismbHQ7aHRtbCZndDsgJmx0O2JvZHkmZ3Q7CisgJmx0O2gxJmd0OyBUIEUgUyBUICZsdDsvaDEmZ3Q7ICZsdDsvYm9keSZndDsmbHQ7L2h0bWwmZ3Q7Cis8L3ByZT4KKzwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcmV4ZWMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcmV4ZWMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODFmZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9yZXhlYy5odG1sCkBAIC0wLDAgKzEsMTE2IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlJFeGVjIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InJleGVjIj5SRXhlYzwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1Rhc2sgdG8gYXV0b21hdGUgYSByZW1vdGUgcmV4ZWMgc2Vzc2lvbi4gSnVzdCBsaWtlIHRoZSBUZWxuZXQgdGFzaywKK2l0IHVzZXMgbmVzdGVkIDx0dD4mbHQ7cmVhZCZndDs8L3R0PiB0byBpbmRpY2F0ZSBzdHJpbmdzIHRvIHdhaXQgZm9yLCBhbmQKKzx0dD4mbHQ7d3JpdGUmZ3Q7PC90dD4gdGFncyB0byBzcGVjaWZ5IHRleHQgdG8gc2VuZCB0byB0aGUgcmVtb3RlIHByb2Nlc3MuCisKKzxwPjxiPk5vdGU6PC9iPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLgorU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorCis8cD5Zb3UgY2FuIHNwZWNpZnkgdGhlIGNvbW1hbmRzIHlvdSB3YW50IHRvIGV4ZWN1dGUgYXMgbmVzdGVkIGVsZW1lbnRzCitvciB2aWEgdGhlIGNvbW1hbmQgYXR0cmlidXRlLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGUgY29tbWFuZAorYXR0cmlidXRlLiAgSWYgeW91IHVzZSB0aGUgY29tbWFuZCBhdHRyaWJ1dGUsIHlvdSBtdXN0IHVzZSB0aGUKK3VzZXJuYW1lIGFuZCBwYXNzd29yZCBhdHRyaWJ1dGVzIGFzIHdlbGwuPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+dXNlcmlkPC90ZD4KKyAgICAgPHRkPnRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIHJlbW90ZSBzZXJ2ZXIuPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgICA8dGQ+dGhlIGxvZ2luIHBhc3N3b3JkIHRvIHVzZSBvbiB0aGUgcmVtb3RlIHNlcnZlci48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5zZXJ2ZXI8L3RkPgorICAgICA8dGQ+dGhlIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSByZXhlYyBzZXJ2ZXIuPC90ZD4KKyAgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmNvbW1hbmQ8L3RkPgorICAgICA8dGQ+dGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBvbiB0aGUgcmVtb3RlIHNlcnZlci48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5wb3J0PC90ZD4KKyAgICAgPHRkPnRoZSBwb3J0IG51bWJlciBvZiB0aGUgcmVtb3RlIHJleGVjIHNlcnZlci4gRGVmYXVsdHMgdG8gcG9ydCA1MTIgaW4gQlNEIFVuaXggc3lzdGVtcy48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD50aW1lb3V0PC90ZD4KKyAgICAgPHRkPnNldCBhIGRlZmF1bHQgdGltZW91dCB0byB3YWl0IGZvciBhIHJlc3BvbnNlLiBTcGVjaWZpZWQgaW4gc2Vjb25kcy4gRGVmYXVsdCBpcyBubyB0aW1lb3V0LjwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPjxhIG5hbWU9Im5lc3RlZCI+TmVzdGVkIEVsZW1lbnRzPC9hPjwvaDM+CitUaGUgaW5wdXQgdG8gc2VuZCB0byB0aGUgc2VydmVyLCBhbmQgcmVzcG9uc2VzIHRvIHdhaXQgZm9yLCBhcmUKK2Rlc2NyaWJlZCBhcyBuZXN0ZWQgZWxlbWVudHMuICAKKworPGg0PnJlYWQ8L2g0PgorCis8cD5kZWNsYXJlIChhcyBhIHRleHQgY2hpbGQgb2YgdGhpcyBlbGVtZW50KSBhIHN0cmluZyB0byB3YWl0IGZvci4KK1RoZSBlbGVtZW50IHN1cHBvcnRzIHRoZSB0aW1lb3V0IGF0dHJpYnV0ZSwgd2hpY2ggb3ZlcnJpZGVzIGFueQordGltZW91dCBzcGVjaWZpZWQgZm9yIHRoZSB0YXNrIGFzIGEgd2hvbGUuIEl0IGFsc28gaGFzIGEgPHR0PnN0cmluZzwvdHQ+CithdHRyaWJ1dGUsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHNwZWNpZnlpbmcgdGhlIHN0cmluZyBhcyAKK2EgdGV4dCBlbGVtZW50LgorPC9wPgorPGk+SXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkZWNsYXJlIGEgY2xvc2luZyA8Y29kZT4mbHQ7cmVhZCZndDs8L2NvZGU+IGVsZW1lbnQgbGlrZSBmb3IgdGhlIFRlbG5ldCB0YXNrLiBUaGUgY29ubmVjdGlvbiBpcyBub3QgYnJva2VuIHVudGlsIHRoZSBjb21tYW5kIGhhcyBjb21wbGV0ZWQgYW5kCit0aGUgaW5wdXQgc3RyZWFtIChvdXRwdXQgb2YgdGhlIGNvbW1hbmQpIGlzIHRlcm1pbmF0ZWQuCis8L2k+Cis8aDQ+d3JpdGU8L2g0PgorCis8cD5kZXNjcmliZXMgdGhlIHRleHQgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBUaGUgPHR0PmVjaG88L3R0PiBib29sZWFuCithdHRyaWJ1dGUgY29udHJvbHMgd2hldGhlciB0aGUgc3RyaW5nIGlzIGVjaG9lZCB0byB0aGUgbG9jYWwgbG9nOyAKK3RoaXMgaXMgInRydWUiIGJ5IGRlZmF1bHQKKzwvcD4KKzxoMz5FeGFtcGxlPC9oMz4KK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29ubmVjdGluZyB0byBhIHNlcnZlciBhbmQgcnVubmluZyBhIGNvbW1hbmQuCisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7cmV4ZWMgdXNlcmlkPSZxdW90O2JvYiZxdW90OyBwYXNzd29yZD0mcXVvdDtiYWRwYXNzJnF1b3Q7IHNlcnZlcj0mcXVvdDtsb2NhbGhvc3QmcXVvdDsgY29tbWFuZD0mcXVvdDtscyZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK1RoZSB0YXNrIGNhbiBiZSB1c2VkIHdpdGggb3RoZXIgcG9ydHMgYXMgd2VsbDoKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7cmV4ZWMgcG9ydD0mcXVvdDs4MCZxdW90OyB1c2VyaWQ9JnF1b3Q7Ym9iJnF1b3Q7IHBhc3N3b3JkPSZxdW90O2JhZHBhc3MmcXVvdDsgc2VydmVyPSZxdW90O2xvY2FsaG9zdCZxdW90OyBjb21tYW5kPSZxdW90O2xzJnF1b3Q7LyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9ycG0uaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcnBtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxM2UwNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvcnBtLmh0bWwKQEAgLTAsMCArMSwxMjMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGh0bWw+CisKKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5ScG0gVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0icnBtIj5ScG08L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD4KKyAgQSBiYXNpYyB0YXNrIGZvciBpbnZva2luZyB0aGUgcnBtIGV4ZWN1dGFibGUgdG8gYnVpbGQgYSBSZWRIYXQgUGFja2FnZSBNYW5hZ2VyIExpbnV4IGluc3RhbGxhdGlvbgorICBmaWxlLiBUaGUgdGFzayBjdXJyZW50bHkgb25seSB3b3JrcyBvbiBMaW51eCBvciBvdGhlciBVbml4IHBsYXRmb3JtcyB3aXRoIHJwbSBzdXBwb3J0LgorPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcGVjRmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgc3BlYyBmaWxlIHRvIGJlIHVzZWQuIFRoaXMgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgU1BFQ1MgZGlyZWN0b3J5CisgICAgdW5kZXIgdGhlIHJvb3Qgb2YgdGhlIFJQTSBzZXQgaW4gdGhlIHRvcERpciBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRvcERpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGljaCB3aWxsIGhhdmUgdGhlIGV4cGVjdGVkCisgICAgICBzdWJkaXJlY3RvcmllcywgU1BFQ1MsIFNPVVJDRVMsIEJVSUxELCBTUlBNUy4gIElmIHRoaXMgaXNuJ3Qgc3BlY2lmaWVkLAorICAgICAgdGhlIGRlZmF1bHQgUlBNIGRpcmVjdG9yeSBvZiB0aGUgc3lzdGVtIChvciB1c2VyLCBpZiB+Ly5ycG1tYWNyb3MgZGVmaW5lcyBpdCkgaXMgdXNlZCAob2Z0ZW4KKyAgICAgIC91c3Ivc3JjL3JwbS48YnI+CisgICAgICBEZWZpbmluZyBhIHRvcGRpciB3aWxsIHNldCA8dHQ+JV90b3BkaXI8L3R0PiB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAtdGhlcmUgaXMgbm8gbmVlZAorICAgICAgdG8gZWRpdCB5b3VyIC5ycG1tYWNyb3MgZmlsZS4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGJ1dCB5b3VyIGJ1aWxkIGZpbGUgaXMgdmVyeSBicml0dGxlIGlmIGl0IGlzIG5vdCBzZXQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xlYW5CdWlsZERpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIHdpbGwgcmVtb3ZlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIEJVSUxECisgICAgICBkaXJlY3RvcnkuCisgICAgICBTZWUgdGhlIHRoZSA8dHQ+LS1jbGVhbjwvdHQ+IG9wdGlvbiBvZiBycG1idWlsZC4KKyAgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZW1vdmVTcGVjPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgd2lsbCByZW1vdmUgdGhlIHNwZWMgZmlsZSBmcm9tIFNQRUNTLgorICAgICAgU2VlIHRoZSB0aGUgPHR0Pi0tcm1zcGVjPC90dD4gb3B0aW9uIG9mIHJwbWJ1aWxkLgorICAgIDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbW92ZVNvdXJjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5GbGFnIChvcHRpb25hbCwgZGVmYXVsdD1mYWxzZSkgCisgICAgICAgIHRvIHJlbW92ZSB0aGUgc291cmNlcyBhZnRlciB0aGUgYnVpbGQuCisgICAgICAgIFNlZSB0aGUgdGhlIDx0dD4tLXJtc291cmNlPC90dD4gb3B0aW9uIG9mIHJwbWJ1aWxkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJwbUJ1aWxkQ29tbWFuZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZXhlY3V0YWJsZSB0byB1c2UgZm9yIGJ1aWxkaW5nIHRoZSBSUE0uCisgICAgICBEZWZhdWx0cyB0byA8Y29kZT5ycG1idWlsZDwvY29kZT4gaWYgaXQgY2FuIGJlIGZvdW5kIG9yCisgICAgICA8Y29kZT5ycG08L2NvZGU+IG90aGVyd2lzZS4gIFNldCB0aGlzIGlmIHlvdSBkb24ndCBoYXZlIGVpdGhlciBvbgorICAgICAgeW91ciBQQVRIIG9yIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGV4ZWN1dGFibGUuICA8ZW0+U2luY2UgQW50CisgICAgICAxLjY8L2VtPi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYW5kPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjb21tYW5kIHRvIHBhc3MgdG8gdGhlIHJwbWJ1aWxkIHByb2dyYW0uIFRoZSBkZWZhdWx0IGlzICItYmIiPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cXVpZXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3VwcHJlc3Mgb3V0cHV0LiBEZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQvZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hlcmUgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvciBnbzwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxPbkVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiB0aGUgUlBNIGJ1aWxkIGNvbW1hbmQgZXhpdHMgd2l0aCAKKyAgICAgICBhIG5vbi16ZXJvIHJldHVuY29kZS4gRGVmYXVsdHMgdG8gZmFsc2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+CisgICAgJmx0O3JwbQorICAgICAgICBzcGVjRmlsZT0iZXhhbXBsZS5zcGVjIgorICAgICAgICB0b3BEaXI9ImJ1aWxkL3JwbSIKKyAgICAgICAgY2xlYW5CdWlsZERpcj0idHJ1ZSIKKyAgICAgICAgZmFpbE9uRXJyb3I9InRydWUiLyZndDsKKzwvcHJlPgorPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NjaGVtYXZhbGlkYXRlLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NjaGVtYXZhbGlkYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlNTFkMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvc2NoZW1hdmFsaWRhdGUuaHRtbApAQCAtMCwwICsxLDI4MyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5TY2hlbWFWYWxpZGF0ZSBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJzY2hlbWF2YWxpZGF0ZSI+U2NoZW1hVmFsaWRhdGU8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKzxwPlRoaXMgdGFzayB2YWxpZGF0ZXMgWE1MIGZpbGVzIGRlc2NyaWJlZCBieSBhbiBYTUwgU2NoZW1hLgorVGhlIHRhc2sgZXh0ZW5kcyB0aGUgWG1sVmFsaWRhdGUgdGFzayB3aXRoIFhTRC1zcGVjaWZpYyBmZWF0dXJlcy48L3A+Cis8b2w+Cis8bGk+VGhlIHBhcnNlciBpcyBjcmVhdGVkIHZhbGlkYXRpbmcgYW5kIG5hbWVzcGFjZSBhd2FyZQorPC9saT4KKzxsaT5WYWxpZGF0aW9uIGlzIHR1cm5lZCBvbi48L2xpPgorPGxpPlNjaGVtYSB2YWxpZGF0aW9uIGlzIHR1cm5lZCBvbi48L2xpPgorPGxpPkFueSBuby1uYW1lc3BhY2Ugc2NoZW1hIFVSTCBvciBmaWxlIHN1cHBsaWVkIGlzIHVzZWQgYXMgdGhlIG5vLW5hbWVzcGFjZSBzY2hlbWEKKzxsaT5BbGwgbmVzdGVkIHNjaGVtYSBkZWNsYXJhdGlvbnMgYXJlIHR1cm5lZCBpbnRvIHRoZSBsaXN0IG9mIG5hbWVzcGFjZS11cmwKK2JpbmRpbmdzIGZvciBzY2hlbWEgbG9va3VwLgorPC9vbD4KKworTm90ZSB0aGF0IG5lc3RlZCBjYXRhbG9ncyBhcmUgc3RpbGwgdXNlZCBmb3IgbG9va3VwIG9mIHRoZSBVUkxzIGdpdmVuIGFzIHRoZQorc291cmNlcyBvZiBzY2hlbWEgZG9jdW1lbnRzLCBzbyB5b3UgY2FuIHN0aWxsIGRlbGVnYXRlIGxvb2t1cCB0byBhIGNhdGFsb2csIHlvdQoranVzdCBuZWVkIHRvIGxpc3QgYWxsIHNjaGVtYSBVUklzIGFuZCB0aGVpciBVUkwgZXF1aXZhbGVudHMuCisKKzxwPlRoaXMgdGFzayBzdXBwb3J0cyB0aGUgdXNlIG9mIG5lc3RlZAorICA8bGk+PGEgaHJlZj0iLi4vQ29yZVR5cGVzL3htbGNhdGFsb2cuaHRtbCI+PHR0PiZsdDt4bWxjYXRhbG9nJmd0OzwvdHQ+PC9hPiBlbGVtZW50czwvbGk+CisgIDxsaT4gPHR0PiZsdDtzY2hlbWEmZ3Q7PC90dD4gZWxlbWVudHMsIHRoYXQgYmluZCBhIG5hbWVzcGFjZSBVUkkgdG8gYSBVUkwgb3IgYQorICBsb2NhbCBmaWxlbmFtZS4KKyAgPGxpPjx0dD4mbHQ7ZHRkJmd0OzwvdHQ+IGVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIHJlc29sdmUgRFREcyBhbmQgZW50aXRpZXMuPC9saT4KKyAgPGxpPjx0dD4mbHQ7YXR0cmlidXRlJmd0OzwvdHQ+IGVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIHNldCBmZWF0dXJlcyBvbiB0aGUgcGFyc2VyLgorICAgICAgVGhlc2UgY2FuIGJlIGFueSBudW1iZXIgb2YKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L3BhY2thZ2Utc3VtbWFyeS5odG1sI3BhY2thZ2VfZGVzY3JpcHRpb24iPjx0dD5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvPC90dD48L2E+CisgICAgICBvciBvdGhlciBmZWF0dXJlcyB0aGF0IHlvdXIgcGFyc2VyIG1heSBzdXBwb3J0LjwvbGk+CisgIDxsaT48dHQ+Jmx0O3Byb3BlcnR5Jmd0OzwvdHQ+IGVsZW1lbnRzLCBjb250YWluaW5nIHN0cmluZyBwcm9wZXJ0aWVzCis8L3A+CisKKzxwPgorVGhlIHRhc2sgb25seSBzdXBwb3J0cyBTQVgyIG9yIGxhdGVyIHBhcnNlcnM6IGl0IGlzIGFuIGVycm9yIHRvIHNwZWNpZnkgYSBTQVgxCitwYXJzZXIuIAorCisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzbmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcGFyc2VyIHRvIHVzZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlcmUgdG8gZmluZCB0aGUgcGFyc2VyIGNsYXNzLiAKKyAgICBPcHRpb25hbGx5IGNhbiB1c2UgYW4gZW1iZWRkZWQgPHR0PiZsdDtjbGFzc3BhdGgmZ3Q7PC90dD4gZWxlbWVudC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kaXNhYmxlRFREPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgRmxhZyB0byBkaXNhYmxlIERURCBzdXBwb3J0LiBEVEQgc3VwcG9ydCBpcyBuZWVkZWQgdG8gCisgICAgICB2YWxpZGF0ZSBYU0QgZmlsZXMgdGhlbXNlbHZlcywgYW1vbmdzdCBvdGhlcnMuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdCBmYWxzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxzIG9uIGEgZXJyb3IgaWYgc2V0IHRvIHRydWUgKGRlZmF1bHRzIHRvIHRydWUpLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUocykgeW91IHdhbnQgdG8gY2hlY2suIChvcHRpb25hbGx5IGNhbiB1c2UgYW4gZW1iZWRkZWQgZmlsZXNldCk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mdWxsY2hlY2tpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBlbmFibGUgZnVsbCBzY2hlbWEgY2hlY2tpbmcuIFNsb3cgYnV0IHN0cmljdC4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0IHRydWU8L3RkPgorICA8L3RyPgorICAKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGVuaWVudDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIGlmIHRydWUsIG9ubHkgY2hlY2sgdGhlIFhNTCBkb2N1bWVudCBpcyB3ZWxsIGZvcm1lZAorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5vTmFtZXNwYWNlRmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIGZpbGVuYW1lIG9mIGEgbm8tbmFtZXNwYWNlIFhTRCBmaWxlIHRvIHByb3ZpZGUgdGhlIAorICAgICAgc2NoZW1hIGZvciBuby1uYW1lc3BhY2UgWE1MIGNvbnRlbnQuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bm9OYW1lc3BhY2VVUkw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBVUkwgb2YgYSBuby1uYW1lc3BhY2UgWFNEIGZpbGUgdG8gcHJvdmlkZSB0aGUgCisgICAgICBzY2hlbWEgZm9yIG5vLW5hbWVzcGFjZSBYTUwgY29udGVudC4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj53YXJuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxvZyBwYXJzZXIgd2FybiBldmVudHMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgorCisKKzxoND5zY2hlbWE8L2g0PgorPHA+CitJZGVudGlmeSB0aGUgbmFtZSBhbmQgbG9jYXRpb24gb2YgYSBzY2hlbWEgdGhhdCBtYXkgYmUgdXNlZCBpbiB2YWxpZGF0aW5nCit0aGUgZG9jdW1lbnQocykuCis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWVzcGFjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5VUkkgb2YgdGhlIHNjaGVtYSBuYW1lc3BhY2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXJsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlVSTCBvZiB0aGUgc2NoZW1hPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk9uZSBvZiB1cmwgb3IgZmlsZSBpcyByZXF1aXJlZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZSBvZiB0aGUgc2NoZW1hPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk9uZSBvZiB1cmwgb3IgZmlsZSBpcyByZXF1aXJlZDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+ZHRkPC9oND4KKzxwPgorPHR0PiZsdDtkdGQmZ3Q7PC90dD4gaXMgdXNlZCB0byBzcGVjaWZ5IGRpZmZlcmVudCBsb2NhdGlvbnMgZm9yIERURCByZXNvbHV0aW9uLgorPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wdWJsaWNJZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5QdWJsaWMgSUQgb2YgdGhlIERURCB0byByZXNvbHZlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2F0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkxvY2F0aW9uIG9mIHRoZSBEVEQgdG8gdXNlLCB3aGljaCBjYW4gYmUgYSBmaWxlLAorICAgIGEgcmVzb3VyY2UsIG9yIGEgVVJMPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg0PnhtbGNhdGFsb2c8L2g0PgorPHA+VGhlIDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy94bWxjYXRhbG9nLmh0bWwiPjx0dD4mbHQ7eG1sY2F0YWxvZyZndDs8L3R0PjwvYT4KK2VsZW1lbnQgaXMgdXNlZCB0byBwZXJmb3JtIGVudGl0eSByZXNvbHV0aW9uLjwvcD4KKzxoND5hdHRyaWJ1dGU8L2g0PgorPHA+VGhlIDx0dD4mbHQ7YXR0cmlidXRlJmd0OzwvdHQ+IGVsZW1lbnQgaXMgdXNlZCB0byBzZXQgcGFyc2VyIGZlYXR1cmVzLjxicj4KK0ZlYXR1cmVzIHVzYWJsZSB3aXRoIHRoZSB4ZXJjZXMgcGFyc2VyIGFyZSBkZWZpbmVkIGhlcmUgOgorIDxhIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtai9mZWF0dXJlcy5odG1sIj5TZXR0aW5nIGZlYXR1cmVzPC9hPjxicj4KKworU0FYIGZlYXR1cmVzIGFyZSBkZWZpbmVkIGhlcmU6CisgPGEgaHJlZj0iaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiI+PHR0Pmh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy88L3R0PjwvYT48YnI+CisgPC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBib29sZWFuIHZhbHVlIG9mIHRoZSBmZWF0dXJlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPC9wPgorCis8aDQ+cHJvcGVydHk8L2g0PgorPHA+VGhlIDx0dD4mbHQ7cHJvcGVydHkmZ3Q7PC90dD4gZWxlbWVudCBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzLgorVGhlc2UgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBoZXJlIGZvciB0aGUgeGVyY2VzIFhNTCBwYXJzZXIgaW1wbGVtZW50YXRpb24gOgorIDxhIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtai9wcm9wZXJ0aWVzLmh0bWwiPlhNTCBQYXJzZXIgcHJvcGVydGllczwvYT4KK1Byb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzY2hlbWEgdXNlZCB0byB2YWxpZGF0ZSB0aGUgWE1MIGZpbGUuCis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGZlYXR1cmU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgcHJvcGVydHk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8L3A+CisKKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwcmU+CisgICAgJmx0O3NjaGVtYXZhbGlkYXRlCisgICAgICBub05hbWVzcGFjZUZpbGU9ImRvY3VtZW50LnhzZCIKKyAgICAgIGZpbGU9InhtbC9lbmRwaWVjZS54bWwiJmd0OworICAgICZsdDsvc2NoZW1hdmFsaWRhdGUmZ3Q7Cis8L3ByZT4KK1ZhbGlkYXRlIGEgZG9jdW1lbnQgYWdhaW5zdCBhbiBYTUwgc2NoZW1hLiBUaGUgZG9jdW1lbnQgZG9lcyBub3QgZGVjbGFyZQorYW55IHNjaGVtYSBpdHNlbGYsIHdoaWNoIGlzIHdoeSB0aGUgPHR0Pm5vTmFtZXNwYWNlRmlsZTwvdHQ+IGlzIG5lZWRlZC4gCis8cHJlPgorICAgICZsdDtwcmVzZXRkZWYgbmFtZT0idmFsaWRhdGUtc29hcCImZ3Q7CisgICAgICAmbHQ7c2NoZW1hdmFsaWRhdGUgJmd0OworICAgICAgICAmbHQ7c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIgorICAgICAgICAgIGZpbGU9IiR7c29hcC5kaXJ9L3dzLWFkZHJlc3NpbmcueHNkIiAvJmd0OworICAgICAgICAmbHQ7c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIgorICAgICAgICAgIGZpbGU9IiR7c29hcC5kaXJ9L3NvYXAxMi54c2QiIC8mZ3Q7CisgICAgICAgICZsdDtzY2hlbWEgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKKyAgICAgICAgICBmaWxlPSIke3NvYXAuZGlyfS93c2RsLnhzZCIgLyZndDsKKyAgICAgICAgJmx0O3NjaGVtYSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICAgICAgIGZpbGU9IiR7c29hcC5kaXJ9L1hNTFNjaGVtYS54c2QiIC8mZ3Q7CisgICAgICAgICZsdDsvc2NoZW1hdmFsaWRhdGUmZ3Q7CisgICAgJmx0Oy9wcmVzZXRkZWYmZ3Q7Cis8L3ByZT4KK0RlY2xhcmUgYSBuZXcgcHJlc2V0IHRhc2ssIDx0dD4mbHQ7dmFsaWRhdGUtc29hcCZndDs8L3R0PiwgdGhhdCB2YWxpZGF0ZXMKK1hTRCBhbmQgV1NETCBkb2N1bWVudHMgYWdhaW5zdCB0aGUgcmVsZXZhbnQgc3BlY2lmaWNhdGlvbnMuIAorVG8gdmFsaWRhdGUgWFNEIGRvY3VtZW50cywgeW91IGFsc28gbmVlZCBYTUxTY2hlbWEuZHRkIGFuZCBkYXRhdHlwZXMuZHRkIGluIAordGhlIHNhbWUgZGlyZWN0b3J5IGFzIFhNTFNjaGVtYS54c2QsIG9yIHBvaW50ZWQgdG8gdmlhIHRoZSBjYXRhbG9nLiBBbGwKK3RoZXNlIGZpbGVzIGNhbiBiZSBmZXRjaGVkIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgordGhlIFczQzwvYT4uIAorPHByZT4KKyAgICAmbHQ7dmFsaWRhdGUtc29hcCBmaWxlPSJ4bWwvdGVzdC54c2QiLyZndDsKKzwvcHJlPgorVXNlIHRoZSBwcmVzZXQgdGFzayBkZWZpbmVkIGFib3ZlIHRvIHZhbGlkYXRlIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQuCis8YnI+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NjcC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zY3AuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBjODlkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zY3AuaHRtbApAQCAtMCwwICsxLDI2NyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5TQ1AgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ic2NwIj5TQ1A8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKzxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3A+CisKKzxwPkNvcGllcyBhIGZpbGUgb3IgRmlsZVNldCB0byBvciBmcm9tIGEgKHJlbW90ZSkgbWFjaGluZSBydW5uaW5nIGFuIFNTSCBkYWVtb24uCitGaWxlU2V0IDxpPm9ubHk8L2k+IHdvcmtzIGZvciBjb3B5aW5nIGZpbGVzIGZyb20gdGhlIGxvY2FsIG1hY2hpbmUgdG8gYQorcmVtb3RlIG1hY2hpbmUuPC9wPgorCis8cD48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZAoraW4gdGhlIEFudCBkaXN0cmlidXRpb24uICBTZWUgPGEKK2hyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4KK2ZvciBtb3JlIGluZm9ybWF0aW9uLiAgVGhpcyB0YXNrIGhhcyBiZWVuIHRlc3RlZCB3aXRoIGpzY2gtMC4xLjIgYW5kIGxhdGVyLjwvcD4KKworPHA+U2VlIGFsc28gdGhlIDxhIGhyZWY9InNzaGV4ZWMuaHRtbCI+c3NoZXhlYyB0YXNrPC9hPjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBjb3B5LiAgVGhpcyBjYW4gYmUgYSBsb2NhbCBwYXRoIG9yIGEKKyAgICByZW1vdGUgcGF0aCBvZiB0aGUgZm9ybSA8aT51c2VyWzpwYXNzd29yZF1AaG9zdDovZGlyZWN0b3J5L3BhdGg8L2k+LgorICAgIDxpPjpwYXNzd29yZDwvaT4gY2FuIGJlIG9taXR0ZWQgaWYgeW91IHVzZSBrZXkgYmFzZWQKKyAgICBhdXRoZW50aWNhdGlvbiBvciBzcGVjaWZ5IHRoZSBwYXNzd29yZCBhdHRyaWJ1dGUuICBUaGUgd2F5IHJlbW90ZQorICAgIHBhdGggaXMgcmVjb2duaXplZCBpcyB3aGV0aGVyIGl0IGNvbnRhaW5zIEAgY2hhcmFjdGVyIG9yIG5vdC4gVGhpcworICAgIHdpbGwgbm90IHdvcmsgaWYgeW91ciBsb2NhbFBhdGggY29udGFpbnMgQCBjaGFyYWN0ZXIuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIGEgbmVzdGVkCisgICAgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bG9jYWxGaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIGZpbGUgYXR0cmlidXRlLiBCdXQKKyAgICB0aGlzIG11c3QgYWx3YXlzIHBvaW50IHRvIGEgbG9jYWwgZmlsZS4gVGhlIHJlYXNvbiB0aGlzIHdhcyBhZGRlZAorICAgIHdhcyB0aGF0IHdoZW4geW91IGdpdmUgZmlsZSBhdHRyaWJ1dGUgaXQgaXMgdHJlYXRlZCBhcyByZW1vdGUgaWYKKyAgICBpdCBjb250YWlucyBAIGNoYXJhY3Rlci4gVGhpcyBjaGFyYWN0ZXIgY2FuIGV4aXN0IGFsc28gaW4gbG9jYWwKKyAgICBwYXRocy4gIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5BbHRlcm5hdGl2ZSB0byBmaWxlIGF0dHJpYnV0ZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZW1vdGVGaWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIGZpbGUgYXR0cmlidXRlLiBCdXQKKyAgICB0aGlzIG11c3QgYWx3YXlzIHBvaW50IHRvIGEgcmVtb3RlIGZpbGUuICA8ZW0+c2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+QWx0ZXJuYXRpdmUgdG8gZmlsZSBhdHRyaWJ1dGUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dG9kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB0byBjb3B5IHRvLiAgVGhpcyBjYW4gYmUgYSBsb2NhbCBwYXRoCisgICAgb3IgYSByZW1vdGUgcGF0aCBvZiB0aGUgZm9ybSA8aT51c2VyWzpwYXNzd29yZF1AaG9zdDovZGlyZWN0b3J5L3BhdGg8L2k+LgorICAgIDxpPjpwYXNzd29yZDwvaT4gY2FuIGJlIG9taXR0ZWQgaWYgeW91IHVzZSBrZXkgYmFzZWQKKyAgICBhdXRoZW50aWNhdGlvbiBvciBzcGVjaWZ5IHRoZSBwYXNzd29yZCBhdHRyaWJ1dGUuICBUaGUgd2F5IHJlbW90ZQorICAgIHBhdGggaXMgcmVjb2duaXplZCBpcyB3aGV0aGVyIGl0IGNvbnRhaW5zIEAgY2hhcmFjdGVyIG9yIG5vdC4gVGhpcworICAgIHdpbGwgbm90IHdvcmsgaWYgeW91ciBsb2NhbFBhdGggY29udGFpbnMgQCBjaGFyYWN0ZXIuPC90ZD4KKyAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2FsVG9kaXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgdG9kaXIKKyAgICBhdHRyaWJ1dGUuIEJ1dCB0aGlzIG11c3QgYWx3YXlzIHBvaW50IHRvIGEgbG9jYWwgZGlyZWN0b3J5LiBUaGUKKyAgICByZWFzb24gdGhpcyB3YXMgYWRkZWQgd2FzIHRoYXQgd2hlbiB5b3UgZ2l2ZSB0b2RpciBhdHRyaWJ1dGUgaXQgaXMKKyAgICB0cmVhdGVkIGFzIHJlbW90ZSBpZiBpdCBjb250YWlucyBAIGNoYXJhY3Rlci4gVGhpcyBjaGFyYWN0ZXIgY2FuCisgICAgZXhpc3QgYWxzbyBpbiBsb2NhbCBwYXRocy4gIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+CisgICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5BbHRlcm5hdGl2ZSB0byB0b2RpciBhdHRyaWJ1dGUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bG9jYWxUb2ZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q2hhbmdlcyB0aGUgZmlsZSBuYW1lIHRvIHRoZSBnaXZlbiBuYW1lIHdoaWxlCisgICAgcmVjZWl2aW5nIGl0LCBvbmx5IHVzZWZ1bCBpZiByZWNlaXZpbmcgYSBzaW5nbGUgZmlsZS4gIDxlbT5zaW5jZQorICAgIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPkFsdGVybmF0aXZlIHRvIHRvZGlyIGF0dHJpYnV0ZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZW1vdGVUb2RpcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSB0b2RpcgorICAgIGF0dHJpYnV0ZS4gQnV0IHRoaXMgbXVzdCBhbHdheXMgcG9pbnQgdG8gYSByZW1vdGUgZGlyZWN0b3J5LgorICAgIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+CisgICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5BbHRlcm5hdGl2ZSB0byB0b2RpciBhdHRyaWJ1dGUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmVtb3RlVG9maWxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNoYW5nZXMgdGhlIGZpbGUgbmFtZSB0byB0aGUgZ2l2ZW4gbmFtZSB3aGlsZQorICAgIHNlbmRpbmcgaXQsIG9ubHkgdXNlZnVsIGlmIHNlbmRpbmcgYSBzaW5nbGUgZmlsZS4gIDxlbT5zaW5jZQorICAgIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPkFsdGVybmF0aXZlIHRvIHRvZGlyIGF0dHJpYnV0ZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wb3J0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0LjwvdGQ+CisgICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gMjIuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dHJ1c3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyB0cnVzdHMgYWxsIHVua25vd24gaG9zdHMgaWYgc2V0IHRvIHllcy90cnVlLjxicj4KKyAgICAgIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPiBJZiB5b3Ugc2V0IHRoaXMgdG8gZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlCisgICAgICBob3N0IHlvdSBjb25uZWN0IHRvIG11c3QgYmUgbGlzdGVkIGluIHlvdXIga25vd25ob3N0cyBmaWxlLCB0aGlzCisgICAgICBhbHNvIGltcGxpZXMgdGhhdCB0aGUgZmlsZSBleGlzdHMuPC90ZD4KKyAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBOby48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5rbm93bmhvc3RzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgc2V0cyB0aGUga25vd24gaG9zdHMgZmlsZSB0byB1c2UgdG8gdmFsaWRhdGUKKyAgICB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlbW90ZSBob3N0LiAgVGhpcyBtdXN0IGJlIGEgU1NIMiBmb3JtYXQgZmlsZS4KKyAgICBTU0gxIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLjwvdGQ+CisgICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8KKyAgICAke3VzZXIuaG9tZX0vLnNzaC9rbm93bl9ob3N0cy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBoYWx0IHRoZSBidWlsZCBpZiB0aGUgdHJhbnNmZXIgZmFpbHMuCisgICAgIDwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQ8L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXNzd29yZC48L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vdCBpZiB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZAorICAgICBhdXRoZW50aWNhdGlvbiBvciB0aGUgcGFzc3dvcmQgaGFzIGJlZW4gZ2l2ZW4gaW4gdGhlIGZpbGUgb3IKKyAgICAgdG9kaXIgYXR0cmlidXRlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtleWZpbGU8L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiPkxvY2F0aW9uIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIHByaXZhdGUga2V5LjwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCBpZiB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZAorICAgICBhdXRoZW50aWNhdGlvbi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzcGhyYXNlPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5QYXNzcGhyYXNlIGZvciB5b3VyIHByaXZhdGUga2V5LjwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCBpZiB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZAorICAgICBhdXRoZW50aWNhdGlvbi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRldGVybWluZXMgd2hldGhlciBTQ1Agb3V0cHV0cyB2ZXJib3NlbHkgdG8gdGhlCisgICAgdXNlci4gQ3VycmVudGx5IHRoaXMgbWVhbnMgb3V0cHV0dGluZyBkb3RzL3N0YXJzIHNob3dpbmcgdGhlCisgICAgcHJvZ3Jlc3Mgb2YgYSBmaWxlIHRyYW5zZmVyLiAgPGVtPnNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZnRwPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRldGVybWluZXMgd2hldGhlciBTQ1AgdXNlcyB0aGUgc2Z0cCBwcm90b2NvbC4KKyAgICBUaGUgc2Z0cCBwcm90b2NvbCBpcyB0aGUgZmlsZSB0cmFuc2ZlciBwcm90b2NvbCBvZiBTU0gyLiAgSXQgaXMKKyAgICByZWNvbW1lbmRlZCB0aGF0IHRoaXMgYmUgc2V0IHRvIHRydWUgaWYgeW91IGFyZSBjb3B5aW5nIHRvL2Zyb20gYQorICAgIHNlcnZlciB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBzY3AxLiA8ZW0+c2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+ZmlsZXNldDwvaDQ+CisgPHA+PGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zIGFyZSB1c2VkIHRvIHNlbGVjdAorc2V0cyBvZiBmaWxlcyB0byBjb3B5LgorIFRvIHVzZSBhIGZpbGVzZXQsIHRoZSA8Y29kZT50b2RpcjwvY29kZT4gYXR0cmlidXRlIG11c3QgYmUgc2V0LjwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxwPjxiPkNvcHkgYSBzaW5nbGUgbG9jYWwgZmlsZSB0byBhIHJlbW90ZSBtYWNoaW5lPC9iPjwvcD4KKzxwcmU+CisgICZsdDtzY3AgZmlsZT0mcXVvdDtteWZpbGUudHh0JnF1b3Q7IHRvZGlyPSZxdW90O3VzZXI6cGFzc3dvcmRAc29tZWhvc3Q6L2hvbWUvY2h1Y2smcXVvdDsvJmd0OworPC9wcmU+CisKKzxwPjxiPkNvcHkgYSBzaW5nbGUgbG9jYWwgZmlsZSB0byBhIHJlbW90ZSBtYWNoaW5lIHdpdGggc2VwYXJhdGUKK3Bhc3N3b3JkIGF0dHJpYnV0ZTwvYj48L3A+Cis8cHJlPgorICAmbHQ7c2NwIGZpbGU9JnF1b3Q7bXlmaWxlLnR4dCZxdW90OyB0b2Rpcj0mcXVvdDt1c2VyQHNvbWVob3N0Oi9ob21lL2NodWNrJnF1b3Q7IHBhc3N3b3JkPSZxdW90O3Bhc3N3b3JkJnF1b3Q7LyZndDsKKzwvcHJlPgorCis8cD48Yj5Db3B5IGEgc2luZ2xlIGxvY2FsIGZpbGUgdG8gYSByZW1vdGUgbWFjaGluZSB1c2luZyBrZXkgYmFzZQorYXV0aGVudGljYXRpb24uPC9iPjwvcD4KKzxwcmU+CisgICZsdDtzY3AgZmlsZT0mcXVvdDtteWZpbGUudHh0JnF1b3Q7CisgICAgICAgdG9kaXI9JnF1b3Q7dXNlckBzb21laG9zdDovaG9tZS9jaHVjayZxdW90OyAKKyAgICAgICBrZXlmaWxlPSZxdW90OyR7dXNlci5ob21lfS8uc3NoL2lkX2RzYSZxdW90OworICAgICAgIHBhc3NwaHJhc2U9JnF1b3Q7bXkgZXh0cmVtZWx5IHNlY3JldCBwYXNzcGhyYXNlJnF1b3Q7CisgIC8mZ3Q7Cis8L3ByZT4KKworPHA+PGI+Q29weSBhIHNpbmdsZSByZW1vdGUgZmlsZSB0byBhIGxvY2FsIGRpcmVjdG9yeTwvYj48L3A+Cis8cHJlPgorICAmbHQ7c2NwIGZpbGU9JnF1b3Q7dXNlcjpwYXNzd29yZEBzb21laG9zdDovaG9tZS9jaHVjay9teWZpbGUudHh0JnF1b3Q7IHRvZGlyPSZxdW90Oy4uL3NvbWUvb3RoZXIvZGlyJnF1b3Q7LyZndDsKKzwvcHJlPgorCis8cD48Yj5Db3B5IGEgcmVtb3RlIGRpcmVjdG9yeSB0byBhIGxvY2FsIGRpcmVjdG9yeTwvYj48L3A+Cis8cHJlPgorICAmbHQ7c2NwIGZpbGU9JnF1b3Q7dXNlcjpwYXNzd29yZEBzb21laG9zdDovaG9tZS9jaHVjay8qJnF1b3Q7IHRvZGlyPSZxdW90Oy9ob21lL3NhcmEmcXVvdDsvJmd0OworPC9wcmU+CisKKzxwPjxiPkNvcHkgYSBsb2NhbCBkaXJlY3RvcnkgdG8gYSByZW1vdGUgZGlyZWN0b3J5PC9iPjwvcD4KKzxwcmU+CisgICZsdDtzY3AgdG9kaXI9JnF1b3Q7dXNlcjpwYXNzd29yZEBzb21laG9zdDovaG9tZS9jaHVjay8mcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyY19kaXImcXVvdDsvJmd0OworICAmbHQ7L3NjcCZndDsKKzwvcHJlPgorPHA+PGI+Q29weSBhIHNldCBvZiBmaWxlcyB0byBhIGRpcmVjdG9yeTwvYj48L3A+Cis8cHJlPgorICAmbHQ7c2NwIHRvZGlyPSZxdW90O3VzZXI6cGFzc3dvcmRAc29tZWhvc3Q6L2hvbWUvY2h1Y2smcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyY19kaXImcXVvdDsmZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7L3NjcCZndDsKKworICAmbHQ7c2NwIHRvZGlyPSZxdW90O3VzZXI6cGFzc3dvcmRAc29tZWhvc3Q6L2hvbWUvY2h1Y2smcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyY19kaXImcXVvdDsgZXhjbHVkZXM9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7LyZndDsKKyAgJmx0Oy9zY3AmZ3Q7Cis8L3ByZT4KKworPHA+PHN0cm9uZz5TZWN1cml0eSBOb3RlOjwvc3Ryb25nPiAgSGFyZCBjb2RpbmcgcGFzc3dvcmRzIGFuZC9vciB1c2VybmFtZXMKK2luIHNjcCB0YXNrIGNhbiBiZSBhIHNlcmlvdXMgc2VjdXJpdHkgaG9sZS4gIENvbnNpZGVyIHVzaW5nIHZhcmlhYmxlCitzdWJzdGl0dXRpb24gYW5kIGluY2x1ZGUgdGhlIHBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKKzxwPgorPHByZT4KKyAgICAmbHQ7c2NwIHRvZGlyPSZxdW90OyR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9QGhvc3Q6L2RpciZxdW90OyAuLi4mZ3Q7Cis8L3ByZT4KK0ludm9raW5nIGFudCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lOgorPHByZT4KKyAgICBhbnQgLUR1c2VybmFtZT1tZSAtRHBhc3N3b3JkPW15cGFzc3dvcmQgdGFyZ2V0MSB0YXJnZXQyCis8L3ByZT4KKworSXMgc2xpZ2h0bHkgYmV0dGVyLCBidXQgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkIGlzIGV4cG9zZWQgdG8gYWxsIHVzZXJzIG9uIGFuIFVuaXgKK3N5c3RlbSAodmlhIHRoZSBwcyBjb21tYW5kKS4gVGhlIGJlc3QgYXBwcm9hY2ggaXMgdG8gdXNlIHRoZQorPGNvZGU+Jmx0O2lucHV0Jmd0OzwvY29kZT4gdGFzayBhbmQvb3IgcmV0cmlldmUgdGhlIHBhc3N3b3JkIGZyb20gYSAoc2VjdXJlZCkKKy5wcm9wZXJ0aWVzIGZpbGUuCisKKzxwPgorCis8cD48c3Ryb25nPlVuaXggTm90ZTo8L3N0cm9uZz4gRmlsZSBwZXJtaXNzaW9ucyBhcmUgbm90IHJldGFpbmVkIHdoZW4gZmlsZXMKK2FyZSBjb3BpZWQ7IHRoZXkgZW5kIHVwIHdpdGggdGhlIGRlZmF1bHQgPGNvZGU+VU1BU0s8L2NvZGU+IHBlcm1pc3Npb25zCitpbnN0ZWFkLiBUaGlzIGlzIGNhdXNlZCBieSB0aGUgbGFjayBvZiBhbnkgbWVhbnMgdG8gcXVlcnkgb3Igc2V0IGZpbGUKK3Blcm1pc3Npb25zIGluIHRoZSBjdXJyZW50IEphdmEgcnVudGltZXMuIElmIHlvdSBuZWVkIGEgcGVybWlzc2lvbi0KK3ByZXNlcnZpbmcgY29weSBmdW5jdGlvbiwgdXNlIDxjb2RlPiZsdDtleGVjIGV4ZWN1dGFibGU9InNjcCIgLi4uICZndDs8L2NvZGU+CitpbnN0ZWFkLgorPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NjcmlwdC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zY3JpcHQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDU1ZjliCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zY3JpcHQuaHRtbApAQCAtMCwwICsxLDM5MSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPjwvbWV0YT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+U2NyaXB0IFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InNjcmlwdCI+U2NyaXB0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorICA8cD5FeGVjdXRlIGEgc2NyaXB0IGluIGEKKyAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2JzZiIgdGFyZ2V0PSJfdG9wIj5BcGFjaGUgQlNGPC9hPgorICAgIG9yCisgICAgPGEgaHJlZj0iaHR0cHM6Ly9zY3JpcHRpbmcuZGV2LmphdmEubmV0Ij5KU1IgMjIzPC9hPiAgc3VwcG9ydGVkIGxhbmd1YWdlLgorICA8L3A+CisgIDxwPjxiPk5vdGU6PC9iPgorICAgIFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFudCBkaXN0cmlidXRpb24uCisgICAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4KKyAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgPC9wPgorICA8cD4KKyAgICBUaGUgdGFzayBtYXkgdXNlIHRoZSBCU0Ygc2NyaXB0aW5nIG1hbmFnZXIgb3IgdGhlIEpTUiAyMjMgbWFuYWdlciB0aGF0CisgICAgaXMgaW5jbHVkZWQgaW4gSkRLNiBhbmQgaGlnaGVyLiBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIDxjb2RlPm1hbmFnZXI8L2NvZGU+CisgICAgYXR0cmlidXRlLiBUaGUgSlNSIDIyMyBzY3JpcHRpbmcgbWFuYWdlciBpcyBpbmRpY2F0ZWQgYnkgImphdmF4Ii4KKyAgPC9wPgorICA8cD5BbGwgaXRlbXMgKHRhc2tzLCB0YXJnZXRzLCBldGMpIG9mIHRoZSBydW5uaW5nIHByb2plY3QgYXJlCisgICAgYWNjZXNzaWJsZSBmcm9tIHRoZSBzY3JpcHQsIHVzaW5nIGVpdGhlciB0aGVpciA8Y29kZT5uYW1lPC9jb2RlPiBvcgorICAgIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGVzIChhcyBsb25nIGFzIHRoZWlyIG5hbWVzIGFyZSBjb25zaWRlcmVkCisgICAgdmFsaWQgSmF2YSBpZGVudGlmaWVycywgdGhhdCBpcykuCisgICAgVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAic2V0YmVhbnMiIGF0dHJpYnV0ZSBvZiB0aGUgdGFzay4KKyAgICBUaGUgbmFtZSAicHJvamVjdCIgaXMgYSBwcmUtZGVmaW5lZCByZWZlcmVuY2UgdG8gdGhlIFByb2plY3QsIHdoaWNoIGNhbiBiZQorICAgIHVzZWQgaW5zdGVhZCBvZiB0aGUgcHJvamVjdCBuYW1lLiBUaGUgbmFtZSAic2VsZiIgaXMgYSBwcmUtZGVmaW5lZCByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbAorICAgIDxjb2RlPiZsdDtzY3JpcHQmZ3Q7PC9jb2RlPi1UYXNrIGluc3RhbmNlLjxicj5Gcm9tIHRoZXNlIG9iamVjdHMgeW91IGhhdmUgYWNjZXNzIHRvIHRoZSBBbnQgSmF2YSBBUEksIHNlZSB0aGUKKzxhIGhyZWY9Ii4uL2FwaS9pbmRleC5odG1sIj5KYXZhRG9jPC9hPiAoZXNwZWNpYWxseSBmb3IKKzxhIGhyZWY9Ii4uL2FwaS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0Lmh0bWwiPlByb2plY3Q8L2E+IGFuZAorPGEgaHJlZj0iLi4vYXBpL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjcmlwdC5odG1sIj5TY3JpcHQ8L2E+KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Cis8cD5JZiB5b3UgYXJlIHVzaW5nIEphdmFTY3JpcHQgdW5kZXIgQlNGLCBhIGdvb2QgcmVzb3VyY2UgaXMgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvcmhpbm8vZG9jLmh0bWwiPgoraHR0cDovL3d3dy5tb3ppbGxhLm9yZy9yaGluby9kb2MuaHRtbDwvYT4gYXMgd2UgYXJlIHVzaW5nIHRoZWlyIEphdmFTY3JpcHQgaW50ZXJwcmV0ZXIuPC9wPgorPHA+U2NyaXB0cyBjYW4gZG8gYWxtb3N0IGFueXRoaW5nIGEgdGFzayB3cml0dGVuIGluIEphdmEgY291bGQgZG8uPC9wPgorPHA+Umhpbm8gcHJvdmlkZXMgYSBzcGVjaWFsIGNvbnN0cnVjdCAtIHRoZSA8aT5KYXZhQWRhcHRlcjwvaT4uIFdpdGggdGhhdCB5b3UgY2FuCitjcmVhdGUgYW4gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgc2V2ZXJhbCBpbnRlcmZhY2VzLCBleHRlbmRzIGNsYXNzZXMgYW5kIGZvciB3aGljaCB5b3UKK2NhbiBvdmVyd3JpdGUgbWV0aG9kcy4gQmVjYXVzZSB0aGlzIGlzIGFuIHVuZG9jdW1lbnRlZCBmZWF0dXJlICh5ZXQpLCBoZXJlIGlzIHRoZSBsaW5rCit0byBhbiBleHBsYW5hdGlvbjogPGEgaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3Vwcz9obD1lbiZscj0maWU9VVRGLTgmb2U9VVRGLTgmbmV3d2luZG93PTEmZnJhbWU9cmlnaHQmdGg9NjEwZDJkYjQ1YzA3NTZiZCZzZWVrbT0zOTFFRUMzQy41MjM2RDkyOSU0MHlhaG9vLmNvbSNsaW5rMiI+CitHcm91cHNAR29vZ2xlOiAiUmhpbm8sIGVudW0uanMsIEphdmFBZGFwdGVyPyI8L2E+IGJ5IE5vcnJpcyBCb3lkIGluIHRoZSBuZXdzZ3JvdXAKKzxpPm5ldHNjYXBlLnB1YmxpYy5tb3ppbGxhLmpzZW5nPC9pPi48L3A+CisKKworCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sYW5ndWFnZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhlIHNjcmlwdCBpcyB3cml0dGVuIGluLgorICAgICAgTXVzdCBiZSBhIHN1cHBvcnRlZCBBcGFjaGUgQlNGIG9yIEpTUiAyMjMgbGFuZ3VhZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bWFuYWdlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIDxlbT5TaW5jZTogQW50IDEuNy4gPC9lbT4KKyAgICAgIFRoZSBzY3JpcHQgZW5naW5lIG1hbmFnZXIgdG8gdXNlLiBUaGlzIGNhbiBoYXZlCisgICAgICBvbmUgb2YgdGhyZWUgdmFsdWVzICgiYXV0byIsICJic2YiIG9yICJqYXZheCIpLgorICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgImF1dG8iLgorICAgICAgPGRsPgorICAgICAgICA8bGk+ImJzZiIgdXNlIHRoZSBCU0Ygc2NyaXB0aW5nIG1hbmFnZXIgdG8gcnVuCisgICAgICAgICAgdGhlIGxhbmd1YWdlLjwvbGk+CisgICAgICAgIDxsaT4iamF2YXgiIHVzZSB0aGUgPGVtPmphdmF4LnNjcmlwdGluZzwvZW0+IG1hbmFnZXIKKyAgICAgICAgICB0byBydW4gdGhlIGxhbmd1YWdlLiAoVGhpcyB3aWxsIG9ubHkgd29yayBmb3IgSkRLNiBhbmQgaGlnaGVyKS48L2xpPgorICAgICAgICA8bGk+ImF1dG8iIHVzZSB0aGUgQlNGIGVuZ2luZSBpZiBpdCBleGlzdHMsCisgICAgICAgICAgb3RoZXJ3aXNlIHVzZSB0aGUgPGVtPmphdmF4LnNjcmlwdGluZzwvZW0+IG1hbmFnZXIuPC9saT4KKyAgICAgIDwvZGw+CisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0IGFzIGEgZmlsZSwgaWYgbm90IGlubGluZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNldGJlYW5zPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udHJvbHMgd2hldGhlciB0byBzZXQgdmFyaWFibGVzIGZvcgorICAgICAgYWxsIHByb3BlcnRpZXMsIHJlZmVyZW5jZXMgYW5kIHRhcmdldHMgaW4gdGhlIHJ1bm5pbmcgc2NyaXB0LgorICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgZmFsc2UsIG9ubHkgdGhlIHRoZSAicHJvamVjdCIgYW5kICJzZWxmIiB2YXJpYWJsZXMgYXJlIHNldC4KKyAgICAgIElmIHRoaXMgYXR0cmlidXRlIGlzIHRydWUgYWxsIHRoZSB2YXJpYWJsZXMgYXJlIHNldC4gVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcworICAgICAgYXR0cmlidXRlIGlzICJ0cnVlIi4gIDxlbT5TaW5jZSBBbnQgMS43PC9lbT4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGUgY2xhc3NwYXRoIHRvIHBhc3MgaW50byB0aGUgc2NyaXB0LiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhCisgICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5jbGFzc3BhdGg8L2g0PgorICA8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+PC9wPgorPHA+CisgIDxjb2RlPlNjcmlwdDwvY29kZT4ncyA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGF0dHJpYnV0ZSBpcyBhIAorICA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmU8L2E+IGFuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIGEgbmVzdGVkCisgIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50LgorICA8cD4KKyAgICBJZiBhIGNsYXNzcGF0aCBpcyBzZXQsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgY3VycmVudCB0aHJlYWQKKyAgICBjb250ZXh0IGNsYXNzbG9hZGVyLCBhbmQKKyAgICBhcyB0aGUgY2xhc3Nsb2FkZXIgZ2l2ZW4gdG8gdGhlIEJTRiBtYW5hZ2VyLiAKKyAgICBUaGlzIG1lYW5zIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorICAgIHRoZSBjbGFzc3BhdGggY29udGFpbmluZyB0aGUgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24gZm9yIEJTRgorICAgIG9yIGZvciBKU1IgMjIzIG1hbmFnZXJzLgorICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBvbmUgd2FudHMKKyAgICB0byBrZWVwICR7dXNlci5ob21lfS8uYW50L2xpYiBmcmVlIG9mIGxvdHMgb2Ygc2NyaXB0aW5nIGxhbmd1YWdlCisgICAgc3BlY2lmaWMgamFyIGZpbGVzLgorICA8L3A+CisgIDxwPgorICAgIDxiPk5COiAoU2luY2UgQW50IDEuNy4xKTwvYj4KKyAgICBUaGlzIGNsYXNzcGF0aCA8ZW0+Y2FuPC9lbT4gYmUgdXNlZCB0bworICAgIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mCisgICAgdGhlIEJTRiBqYXIgZmlsZSBhbmQvb3IgbGFuZ3VhZ2VzCisgICAgdGhhdCBoYXZlIGVuZ2luZXMgaW4gdGhlIEJTRiBqYXIgZmlsZS4gVGhpcyBpbmNsdWRlcyB0aGUKKyAgICBqYXZhc2NyaXB0LCBqeXRob24sIG5ldHJleHggYW5kIGphY2wgbGFuZ3VhZ2VzLgorICA8L3A+Cis8L3A+Cis8aDM+RXhhbXBsZXM8L2gzPgorVGhlIGZvbGxvd2luZyBzbmlwcGV0IHNob3dzIHVzZSBvZiBmaXZlIGRpZmZlcmVudCBsYW5ndWFnZXM6CisgIDxibG9ja3F1b3RlPjxwcmU+CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJIZWxsbyB3b3JsZCIvJmd0OworCisgICAgJmx0O3NjcmlwdCBsYW5ndWFnZT0iZ3Jvb3Z5IiZndDsKKyAgICAgIHByaW50bG4oIm1lc3NhZ2UgaXMgIiArIG1lc3NhZ2UpCisgICAgJmx0Oy9zY3JpcHQmZ3Q7CisKKyAgICAmbHQ7c2NyaXB0IGxhbmd1YWdlPSJiZWFuc2hlbGwiJmd0OworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtZXNzYWdlIGlzICIgKyBtZXNzYWdlKTsKKyAgICAmbHQ7L3NjcmlwdCZndDsKKworICAgICZsdDtzY3JpcHQgbGFuZ3VhZ2U9Imp1ZG9zY3JpcHQiJmd0OworICAgICAgICBwcmludGxuICdtZXNzYWdlIGlzICcsIG1lc3NhZ2UKKyAgICAmbHQ7L3NjcmlwdCZndDsKKworICAgICZsdDtzY3JpcHQgbGFuZ3VhZ2U9InJ1YnkiJmd0OworICAgICAgICBwcmludCAnbWVzc2FnZSBpcyAnLCAkbWVzc2FnZSwgIlxuIgorICAgICZsdDsvc2NyaXB0Jmd0OworCisgICAgJmx0O3NjcmlwdCBsYW5ndWFnZT0ianl0aG9uIiZndDsKK3ByaW50ICJtZXNzYWdlIGlzICVzIiAlIG1lc3NhZ2UKKyAgICAmbHQ7L3NjcmlwdCZndDsKKzwvcHJlPgorICA8L2Jsb2NrcXVvdGU+CisgIDxwPgorICBOb3RlIHRoYXQgZm9yIHRoZSA8aT5qeXRob248L2k+IGV4YW1wbGUsIHRoZSBzY3JpcHQgY29udGVudHMgPGI+bXVzdDwvYj4KKyAgc3RhcnQgb24gdGhlIGZpcnN0IGNvbHVtbi4KKyAgPC9wPgorICA8cD4KKyAgICBOb3RlIGFsc28gdGhhdCBmb3IgdGhlIDxpPnJ1Ynk8L2k+IGV4YW1wbGUsIHRoZSBuYW1lcyBvZiB0aGUgc2V0IHZhcmlhYmxlcyBhcmUgcHJlZml4ZWQKKyAgICBieSBhICckJy4KKyAgPHA+CisgICAgVGhlIGZvbGxvd2luZyBzY3JpcHQgc2hvd3MgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZCBqcnVieSBleGFtcGxlOgorICA8L3A+CisgIDxibG9ja3F1b3RlPjxwcmU+CismbHQ7c2NyaXB0IGxhbmd1YWdlPSJydWJ5IiZndDsKKyAgeG1sZmlsZXMgPSBEaXIubmV3KCIuIikuZW50cmllcy5kZWxldGVfaWYgeyB8aXwgISAoaSA9fiAvXC54bWwkLykgfQorICB4bWxmaWxlcy5zb3J0LmVhY2ggeyB8aXwgJHNlbGYubG9nKGkpIH0KKyZsdDsvc2NyaXB0Jmd0OworPC9wcmU+CisgIDwvYmxvY2txdW90ZT4KKyAgPHA+CisgICAgVGhlIHNhbWUgZXhhbXBsZSBpbiBncm9vdnkgaXM6CisgIDwvcD4KKyAgPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtzY3JpcHQgbGFuZ3VhZ2U9Imdyb292eSImZ3Q7CisgIHhtbGZpbGVzID0gbmV3IGphdmEuaW8uRmlsZSgiLiIpLmxpc3RGaWxlcygpLmZpbmRBbGx7IGl0ID1+ICJcLnhtbCQifQorICB4bWxmaWxlcy5zb3J0KCkuZWFjaCB7IHNlbGYubG9nKGl0LnRvU3RyaW5nKCkpfQorJmx0Oy9zY3JpcHQmZ3Q7Cis8L3ByZT4KKyAgPC9ibG9ja3F1b3RlPgorICA8cD4KKyAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIHVzZSBvZiBjbGFzc3BhdGggdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24KKyAgICBvZiB0aGUgYmVhbnNoZWxsIGphciBmaWxlLgorICA8L3A+CisgIDxibG9ja3F1b3RlPjxwcmU+CismbHQ7c2NyaXB0IGxhbmd1YWdlPSJiZWFuc2hlbGwiIHNldGJlYW5zPSJ0cnVlIiZndDsKKyAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7dXNlci5ob21lfS9sYW5nL2JlYW5zaGVsbCIgaW5jbHVkZXM9IiouamFyIiAvJmd0OworICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB3b3JsZCIpOworJmx0Oy9zY3JpcHQmZ3Q7Cis8L3ByZT4KKyAgPC9ibG9ja3F1b3RlPgorICA8cD4KKyAgICBUaGUgZm9sbG93aW5nIHNjcmlwdCB1c2VzIGphdmFzY3JpcHQgdG8gY3JlYXRlIGEgbnVtYmVyIG9mCisgICAgZWNobyB0YXNrcyBhbmQgZXhlY3V0ZSB0aGVtLgorICA8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Byb2plY3QgbmFtZT0mcXVvdDtzcXVhcmVzJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7bWFpbiZxdW90OyBiYXNlZGlyPSZxdW90Oy4mcXVvdDsmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O21haW4mcXVvdDsmZ3Q7CisKKyAgICAmbHQ7c2NyaXB0IGxhbmd1YWdlPSZxdW90O2phdmFzY3JpcHQmcXVvdDsmZ3Q7ICZsdDshW0NEQVRBWworCisgICAgICBmb3IgKGk9MTsgaSZsdDs9MTA7IGkrKykgeworICAgICAgICBlY2hvID0gc3F1YXJlcy5jcmVhdGVUYXNrKCZxdW90O2VjaG8mcXVvdDspOworICAgICAgICBlY2hvLnNldE1lc3NhZ2UoaSppKTsKKyAgICAgICAgZWNoby5wZXJmb3JtKCk7CisgICAgICB9CisKKyAgICBdXSZndDsgJmx0Oy9zY3JpcHQmZ3Q7CisKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyZsdDsvcHJvamVjdCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPmdlbmVyYXRlczwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CittYWluOgorMQorNAorOQorMTYKKzI1CiszNgorNDkKKzY0Cis4MQorMTAwCisKK0JVSUxEIFNVQ0NFU1NGVUwKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPHA+Tm93IGEgbW9yZSBjb21wbGV4IGV4YW1wbGUgdXNpbmcgdGhlIEphdmEgQVBJIGFuZCB0aGUgQW50IEFQSS4gVGhlIGdvYWwgaXMgdG8gbGlzdCB0aGUKK2ZpbGVzaXplcyBvZiBhbGwgZmlsZXMgYSA8Y29kZT4mbHQ7ZmlsZXNldC8mZ3Q7PC9jb2RlPiBjYXVnaHQuPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKworJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Jmd0OworJmx0O3Byb2plY3QgbmFtZT0iPGZvbnQgY29sb3I9Ymx1ZT5NeVByb2plY3Q8L2ZvbnQ+IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIiZndDsKKworICAmbHQ7cHJvcGVydHkgbmFtZT0iZnMuZGlyIiB2YWx1ZT0ic3JjIi8mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJmcy5pbmNsdWRlcyIgdmFsdWU9IioqLyoudHh0Ii8mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJmcy5leGNsdWRlcyIgdmFsdWU9IioqLyoudG1wIi8mZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSJtYWluIiZndDsKKyAgICAmbHQ7c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiZndDsgJmx0OyFbQ0RBVEFbCisKKyAgICAgIC8vIGltcG9ydCBzdGF0ZW1lbnRzCisgICAgICA8Zm9udCBjb2xvcj1ibHVlPi8vIGltcG9ydFBhY2thZ2UoamF2YS5pbyk8L2ZvbnQ+OworICAgICAgPGZvbnQgY29sb3I9Ymx1ZT5pbXBvcnRDbGFzcyhqYXZhLmlvLkZpbGUpPC9mb250PjsKKworICAgICAgLy8gQWNjZXNzIHRvIEFudC1Qcm9wZXJ0aWVzIGJ5IHRoZWlyIG5hbWVzCisgICAgICBkaXIgICAgICA9IDxmb250IGNvbG9yPWJsdWU+cHJvamVjdDwvZm9udD4uZ2V0UHJvcGVydHkoImZzLmRpciIpOworICAgICAgaW5jbHVkZXMgPSA8Zm9udCBjb2xvcj1ibHVlPk15UHJvamVjdDwvZm9udD4uZ2V0UHJvcGVydHkoImZzLmluY2x1ZGVzIik7CisgICAgICBleGNsdWRlcyA9IDxmb250IGNvbG9yPWJsdWU+c2VsZi5nZXRQcm9qZWN0KCk8L2ZvbnQ+ICAuPGZvbnQgY29sb3I9Ymx1ZT5nZXRQcm9wZXJ0eSgiZnMuZXhjbHVkZXMiKTwvZm9udD47CisKKyAgICAgIC8vIENyZWF0ZSBhICZsdDtmaWxlc2V0IGRpcj0iIiBpbmNsdWRlcz0iIi8mZ3Q7CisgICAgICBmcyA9IHByb2plY3QuPGZvbnQgY29sb3I9Ymx1ZT5jcmVhdGVEYXRhVHlwZSgiZmlsZXNldCIpPC9mb250PjsKKyAgICAgIGZzLnNldERpciggbmV3IEZpbGUoZGlyKSApOworICAgICAgPGZvbnQgY29sb3I9Ymx1ZT5mcy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk8L2ZvbnQ+OworICAgICAgZnMuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOworCisgICAgICAvLyBHZXQgdGhlIGZpbGVzIChhcnJheSkgb2YgdGhhdCBmaWxlc2V0CisgICAgICBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7CisgICAgICBzcmNGaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKworICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoYXQgYXJyYXkKKyAgICAgIGZvciAoaT0wOyBpJmx0O3NyY0ZpbGVzLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZXMgdmlhIEphdmEgQVBJCisgICAgICAgIHZhciBiYXNlZGlyICA9IGZzLmdldERpcihwcm9qZWN0KTsKKyAgICAgICAgdmFyIGZpbGVuYW1lID0gc3JjRmlsZXNbaV07CisgICAgICAgIHZhciBmaWxlID0gPGZvbnQgY29sb3I9Ymx1ZT5uZXcgRmlsZShiYXNlZGlyLCBmaWxlbmFtZSk8L2ZvbnQ+OworICAgICAgICB2YXIgc2l6ZSA9IGZpbGUubGVuZ3RoKCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCB1c2UgYSBUYXNrIHZpYSBBbnQgQVBJCisgICAgICAgIGVjaG8gPSBNeVByb2plY3QuPGZvbnQgY29sb3I9Ymx1ZT5jcmVhdGVUYXNrKCJlY2hvIik8L2ZvbnQ+OworICAgICAgICBlY2hvLnNldE1lc3NhZ2UoZmlsZW5hbWUgKyAiOiAiICsgc2l6ZSArICIgYnl0ZSIpOworICAgICAgICBlY2hvLjxmb250IGNvbG9yPWJsdWU+cGVyZm9ybSgpPC9mb250PjsKKyAgICAgIH0KKyAgICBdXSZndDsmbHQ7L3NjcmlwdCZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5XZSB3YW50IHRvIHVzZSB0aGUgSmF2YSBBUEkuIEJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBhbHdheXMgdHlwaW5nIHRoZSBwYWNrYWdlIHNpZ25hdHVyZQord2UgZG8gYW4gaW1wb3J0LiBSaGlubyBrbm93cyB0d28gZGlmZmVyZW50IG1ldGhvZHMgZm9yIGltcG9ydCBzdGF0ZW1lbnRzOiBvbmUgZm9yIHBhY2thZ2VzCithbmQgb25lIGZvciBhIHNpbmdsZSBjbGFzcy4gQnkgZGVmYXVsdCBvbmx5IHRoZSA8aT5qYXZhPC9pPiBwYWNrYWdlcyBhcmUgYXZhaWxhYmxlLCBzbworPGk+amF2YS5sYW5nLlN5c3RlbTwvaT4gY2FuIGJlIGRpcmVjdGx5IGltcG9ydGVkIHdpdGggPGNvZGU+aW1wb3J0Q2xhc3MvaW1wb3J0UGFja2FnZTwvY29kZT4uCitGb3Igb3RoZXIgcGFja2FnZXMgeW91IGhhdmUgdG8gcHJlZml4IHRoZSBmdWxsIGNsYXNzaWZpZWQgbmFtZSB3aXRoIDxpPlBhY2thZ2VzPC9pPi4KK0ZvciBleGFtcGxlIEFudCdzIDxpPkZpbGVVdGlsczwvaT4gY2xhc3MgY2FuIGJlIGltcG9ydGVkIHdpdGgKKzxjb2RlPmltcG9ydENsYXNzKDxiPlBhY2thZ2VzPC9iPi5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlscyk8L2NvZGU+Cis8YnI+CitUaGUgPGNvZGU+Jmx0O3NjcmlwdCZndDs8L2NvZGU+IHRhc2sgcG9wdWxhdGVzIHRoZSBQcm9qZWN0IGluc3RhbmNlIHVuZGVyCit0aGUgbmFtZSA8aT5wcm9qZWN0PC9pPiwgc28gd2UgY2FuIHVzZSB0aGF0IHJlZmVyZW5jZS4gQW5vdGhlciB3YXkgaXMgdG8gdXNlIGl0cyBnaXZlbiBuYW1lCitvciBnZXR0aW5nIGl0cyByZWZlcmVuY2UgZnJvbSB0aGUgdGFzayBpdHNlbGYuPGJyPgorVGhlIFByb2plY3QgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIGFuZCBzZXR0aW5nIHByb3BlcnRpZXMsIGNyZWF0aW5nIERhdGFUeXBlcyBhbmQKK1Rhc2tzIGFuZCBtdWNoIG1vcmUuPGJyPgorQWZ0ZXIgY3JlYXRpbmcgYSBGaWxlU2V0IG9iamVjdCB3ZSBpbml0aWFsaXplIHRoYXQgYnkgY2FsbGluZyBpdHMgc2V0LW1ldGhvZHMuIFRoZW4gd2UgY2FuCit1c2UgdGhhdCBvYmplY3QgbGlrZSBhIG5vcm1hbCBBbnQgdGFzayAoPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiBmb3IgZXhhbXBsZSkuPGJyPgorRm9yIGdldHRpbmcgdGhlIHNpemUgb2YgYSBmaWxlIHdlIGluc3RhbnRpYXRlIGEgPGNvZGU+amF2YS5pby5GaWxlPC9jb2RlPi4gU28gd2UgYXJlIHVzaW5nCitub3JtYWwgSmF2YSBBUEkgaGVyZS48YnI+CitGaW5hbGx5IHdlIHVzZSB0aGUgPGNvZGU+Jmx0O2VjaG8mZ3Q7PC9jb2RlPiB0YXNrIGZvciBwcm9kdWNpbmcgdGhlIG91dHB1dC4gVGhlIHRhc2sgaXMgbm90IGV4ZWN1dGVkIGJ5CitpdHMgZXhlY3V0ZSgpIG1ldGhvZCwgYmVjYXVzZSB0aGUgcGVyZm9ybSgpIG1ldGhvZCAoaW1wbGVtZW50ZWQgaW4gVGFzayBpdHNlbGYpIGRvZXMgdGhlCithcHByb3ByaWF0ZSBsb2dnaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgaW52b2tpbmcgZXhlY3V0ZSgpLgorPC9wPgorPHA+CisgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBiZWFuc2hlbGwgdG8gY3JlYXRlIGFuIGFudAorICB0YXNrLiBUaGlzIHRhc2sgd2lsbCBhZGQgZmlsZXNldHMgYW5kIHBhdGhzIHRvIGEgcmVmZXJlbmNlZAorICBwYXRoLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLgorPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDshLS0KKyAgICAgICBEZWZpbmUgYWRkdG9wYXRoIHRhc2sKKyAtLSZndDsKKyZsdDtzY3JpcHQgbGFuZ3VhZ2U9ImJlYW5zaGVsbCImZ3Q7CisgICAgaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisgICAgaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisgICAgaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CisgICAgcHVibGljIGNsYXNzIEFkZFRvUGF0aCBleHRlbmRzIFRhc2sgeworICAgICAgICBwcml2YXRlIFBhdGggcGF0aDsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVmSWQoU3RyaW5nIGlkKSB7CisgICAgICAgICAgICBwYXRoID0gZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShpZCk7CisgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZShpZCwgcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgYWRkKFBhdGggYykgeworICAgICAgICAgICAgcGF0aC5hZGQoYyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgYWRkKEZpbGVTZXQgYykgeworICAgICAgICAgICAgcGF0aC5hZGQoYyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgfQorICAgIH0KKyAgICBwcm9qZWN0LmFkZFRhc2tEZWZpbml0aW9uKCJhZGR0b3BhdGgiLCBBZGRUb1BhdGguY2xhc3MpOworJmx0Oy9zY3JpcHQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisgIDxwPgorICAgIEFuIGV4YW1wbGUgb2YgdXNpbmcgdGhpcyB0YXNrIHRvIGNyZWF0ZSBhIHBhdGgKKyAgICBmcm9tIGEgbGlzdCBvZiBkaXJlY3RvcmllcyAodXNpbmcgYW50Y29udHJpYidzCisgICAgPGEgaHJlZj0iaHR0cDovL2FudC1jb250cmliLnNvdXJjZWZvcmdlLm5ldC90YXNrcy90YXNrcy9mb3IuaHRtbCI+CisgICAgICAmbHQ7Zm9yJmd0OzwvYT4gdGFzaykgZm9sbG93czoKKyAgPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtwYXRoIGlkPSJtYWluLnBhdGgiJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMiLyZndDsKKyZsdDsvcGF0aCZndDsKKyZsdDthYzpmb3IgcGFyYW09InJlZiIgbGlzdD0iY29tbW9ucyxmdyxscHMiCisgICAgICAgIHhtbG5zOmFjPSJhbnRsaWI6bmV0LnNmLmFudGNvbnRyaWIiJmd0OworICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAmbHQ7YWRkdG9wYXRoIHJlZmlkPSJtYWluLnBhdGgiJmd0OworICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2Rpc3QuZGlyfS9Ae3JlZn0vbWFpbiIKKyAgICAgICAgICAgICAgIGluY2x1ZGVzPSIqKi8qLmphciIvJmd0OworICAgICZsdDsvYWRkdG9wYXRoJmd0OworICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CismbHQ7L2FjOmZvciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zY3JpcHRkZWYuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvc2NyaXB0ZGVmLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDYzNDExYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvc2NyaXB0ZGVmLmh0bWwKQEAgLTAsMCArMSwzMzIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+U2NyaXB0ZGVmIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InNjcmlwdCI+U2NyaXB0ZGVmPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+U2NyaXB0ZGVmIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhbiBBbnQgdGFzayB1c2luZyBhIHNjcmlwdGluZyBsYW5ndWFnZS4gQW50CitzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieQorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YiIHRhcmdldD0iX3RvcCI+QXBhY2hlIEJTRjwvYT4gCitvcgorICA8YSBocmVmPSJodHRwczovL3NjcmlwdGluZy5kZXYuamF2YS5uZXQiPkpTUiAyMjM8L2E+CittYXkgYmUKK3VzZWQgdG8gZGVmaW5lIHRoZSBzY3JpcHQuIFNjcmlwdGRlZiBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBlbmNhcHN1bGF0ZQorY29udHJvbCBsb2dpYyBmcm9tIGEgYnVpbGQgd2l0aGluIGFuIEFudCB0YXNrIG1pbmltaXppbmcgdGhlIG5lZWQgZm9yCitwcm92aWRpbmcgY29udHJvbCBzdHlsZSB0YXNrcyBpbiBBbnQgaXRzZWxmLiBDb21wbGV4IGxvZ2ljIGNhbiBiZSBtYWRlCithdmFpbGFibGUgd2hpbGUgcmV0YWluaW5nIHRoZSBzaW1wbGUgc3RydWN0dXJlIG9mIGFuIEFudCBidWlsZCBmaWxlLiBTY3JpcHRkZWYKK2lzIGFsc28gdXNlZnVsIGZvciBwcm90b3R5cGluZyBuZXcgY3VzdG9tIHRhc2tzLiBDZXJ0YWlubHkgYXMgdGhlIGNvbXBsZXhpdHkKK29mIHRoZSBzY3JpcHQgaW5jcmVhc2VzIGl0IHdvdWxkIGJlIGJldHRlciB0byBtaWdyYXRlIHRoZSB0YXNrIGRlZmluaXRpb24KK2ludG8gYSBKYXZhIGJhc2VkIGN1c3RvbSB0YXNrLgorPC9wPgorCis8cD48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUKK0FudCBkaXN0cmlidXRpb24uIFNlZQorPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPgorZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorCisKKworPHA+VGhlIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cyBzdXBwb3J0ZWQgYnkgdGhlIHRhc2sgbWF5IGJlIGRlZmluZWQKK3VzaW5nIDxjb2RlPiZsdDthdHRyaWJ1dGUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2VsZW1lbnQmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudHMuIFRoZXNlIGFyZQorYXZhaWxhYmxlIHRvIHRoZSBzY3JpcHQgdGhhdCBpbXBsZW1lbnRzIHRoZSB0YXNrIGFzIHR3byBjb2xsZWN0aW9uIHN0eWxlCitzY3JpcHQgdmFyaWFibGVzIDxjb2RlPmF0dHJpYnV0ZXM8L2NvZGU+IGFuZCA8Y29kZT5lbGVtZW50czwvY29kZT4uIFRoZQorZWxlbWVudHMgaW4gdGhlIDxjb2RlPmF0dHJpYnV0ZXM8L2NvZGU+IGNvbGxlY3Rpb24gbWF5IGJlIGFjY2Vzc2VkIGJ5IHRoZQorYXR0cmlidXRlIG5hbWUuIFRoZSA8Y29kZT5lbGVtZW50czwvY29kZT4gY29sbGVjdGlvbiBpcyBhY2Nlc3NlZCBieSB0aGUgbmVzdGVkCitlbGVtZW50IG5hbWUuIFRoaXMgd2lsbCByZXR1cm4gYSBsaXN0IG9mIGFsbCBpbnN0YW5jZXMgb2YgdGhlIG5lc3RlZCBlbGVtZW50LgorVGhlIGluc3RhbmNlcyBpbiB0aGlzIGxpc3QgbWF5IGJlIGFjY2Vzc2VkIGJ5IGFuIGludGVnZXIgaW5kZXguCis8L3A+CisKKzxwPjxiPk5vdGU6PC9iPiBBbnQgd2lsbCB0dXJuIGFsbCBhdHRyaWJ1dGUgYW5kIGVsZW1lbnQgbmFtZXMgaW50byBhbGwKK2xvd2VyY2FzZSBuYW1lcywgc28gZXZlbiBpZiB5b3UgdXNlIG5hbWU9IlNvbWVBdHRyaWJ1dGUiLCB5b3UnbGwgaGF2ZQordG8gdXNlICJzb21lYXR0cmlidXRlIiB0byByZXRyaWV2ZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgZnJvbSB0aGUKKzxjb2RlPmF0dHJpYnV0ZXM8L2NvZGU+IGNvbGxlY3Rpb24uPC9wPgorCis8cD5UaGUgbmFtZSAic2VsZiIgKDxpPnNpbmNlIEFudCAxLjYuMzwvaT4pIGlzIGEgcHJlLWRlZmluZWQgcmVmZXJlbmNlIHRvIHRoZQorICAgIHNjcmlwdCBkZWYgdGFzayBpbnN0YW5jZS4KKyAgICBJdCBjYW4gYmUgdXNlZCBmb3IgbG9nZ2luZywgb3IgZm9yIGludGVncmF0aW9uIHdpdGggdGhlIHJlc3Qgb2YKKyAgICBhbnQuIHRoZSA8Y29kZT5zZWxmLnRleHQgYXR0cmlidXRlPC9jb2RlPiBjb250YWlucworICAgIGFueSBuZXN0ZWQgdGV4dCBwYXNzZWQgdG8gdGhlIHNjcmlwdDwvcD4KKworPHA+SWYgYW4gYXR0cmlidXRlIG9yIGVsZW1lbnQgaXMgbm90IHBhc3NlZCBpbiwgCit0aGVuIDxjb2RlPmF0dHJpYnV0ZXMuZ2V0KCk8L2NvZGU+IG9yIDxjb2RlPmVsZW1lbnRzLmdldCgpPC9jb2RlPiB3aWxsIAorcmV0dXJuIG51bGwuIEl0IGlzIHVwIHRvIHRoZSBzY3JpcHQgdG8gcGVyZm9ybSBhbnkgY2hlY2tzIGFuZCB2YWxpZGF0aW9uLiAKKzxjb2RlPnNlbGYuZmFpbChTdHJpbmcgbWVzc2FnZSk8L2NvZGU+Y2FuIGJlIHVzZWQgdG8gcmFpc2UgYSAKKzxjb2RlPkJ1aWxkRXhjZXB0aW9uPC9jb2RlPi4KKzwvcD4KKworCis8cD5UaGUgbmFtZSAicHJvamVjdCIgaXMgYSBwcmUtZGVmaW5lZCByZWZlcmVuY2UgdG8gdGhlIEFudCBQcm9qZWN0LiBGb3IKK21vcmUgaW5mb3JtYXRpb24gb24gd3JpdGluZyBzY3JpcHRzLCBwbGVhc2UgcmVmZXIgdG8gdGhlCis8YSBocmVmPSJzY3JpcHQuaHRtbCI+PGNvZGU+Jmx0O3NjcmlwdCZndDs8L2NvZGU+PC9hPiB0YXNrCis8L3A+CisKKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgdGFzayB0byBiZSBjcmVhdGVkIHVzaW5nIHRoZSBzY3JpcHQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGFuZ3VhZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIHRoZSBzY3JpcHQgaXMgd3JpdHRlbiBpbi4KKyAgICAgIE11c3QgYmUgYSBzdXBwb3J0ZWQgQXBhY2hlIEJTRiBvciBKU1IgMjIzIGxhbmd1YWdlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmFnZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBUaGUgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyIHRvIHVzZS4KKyAgICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vT3B0aW9uYWxUYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCisgICAgICBmb3IgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdCBpcyAiYXV0byI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGxvY2F0aW9uIG9mIHRoZSBzY3JpcHQgYXMgYSBmaWxlLCBpZiBub3QgaW5saW5lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXJpPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgVGhlIFhNTCBuYW1lc3BhY2UgdXJpIHRoYXQgdGhpcyBkZWZpbml0aW9uIHNob3VsZCBsaXZlIGluLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgIFRoZSBjbGFzc3BhdGggdG8gcGFzcyBpbnRvIHRoZSBzY3JpcHQuCisgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhCisgICAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmxvYWRlclJlZjwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBsb2FkZXIgdGhhdCBpcworICAgICAgICB1c2VkIHRvIGxvYWQgdGhlIHNjcmlwdCwgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIAorICAgICAgICBjbGFzc3BhdGguIFRoaXMgYWxsb3dzIG11bHRpcGxlIHNjcmlwdCBkZWZpbnRpb25zCisgICAgICAgIHRvIHJldXNlIHRoZSBzYW1lIGNsYXNzIGxvYWRlci4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5hdHRyaWJ1dGU8L2g0PgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQ+ZWxlbWVudDwvaDQ+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBuZXN0ZWQgZWxlbWVudCB0byBiZSBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICB0YXNrIGRlZmluZWQgYnkgdGhlIHNjcmlwdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc25hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgdXNlZCBmb3IgdGhlIG5lc3RlZCBlbGVtZW50LgorICAgICAgICAgVGhpcyBzcGVjaWZpZXMgdGhlIGNsYXNzIGRpcmVjdGx5IGFuZCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nCisgICAgICAgICB0aGUgQW50IHR5cGUgbmFtZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj50eXBlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIG5hbWUgb2YgYW4gQW50IHRhc2sgb3IgdHlwZSB3aGljaCBpcyB0bworICAgICAgICBiZSB1c2VkIHdoZW4gdGhpcyBlbGVtZW50IGlzIHRvIGJlIGNyZWF0ZWQuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUKKyAgICAgICAgdG8gc3BlY2lmeWluZyB0aGUgY2xhc3MgbmFtZSBkaXJlY3RseS4gSWYgdGhlIHR5cGUgaXMgaW4gYSBuYW1lc3BhY2UsCisgICAgICAgIHRoZSBVUkkgYW5kIGEgOiBtdXN0IGJlIHByZWZpeGVkIHRvIHRoZSB0eXBlLiBGb3IgZXhhbXBsZQorICAgICAgICA8Y29kZT50eXBlPSJhbnRsaWI6ZXhhbXBsZS5vcmc6bmV3dHlwZSI8L2NvZGU+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YW55IHJlc291cmNlIG9yIHJlc291cmNlIGNvbGxlY3Rpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U2luY2UgQW50MS43LjEsIHRoaXMgdGFzayBjYW4gbG9hZCBzY3JpcHRzCisgICAgZnJvbSBhbnkgcmVzb3VyY2Ugc3VwcGxpZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC4gd2hlbiA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorCis8L3RhYmxlPgorCisgIDxoND5jbGFzc3BhdGg8L2g0PgorICA8cD4KKyAgICBTZWUgdGhlIDxhIGhyZWY9Ii4uL09wdGlvbmFsVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzaworICAgIGZvciB1c2luZyB0aGlzIG5lc3RlZCBlbGVtZW50LgorICA8L3A+CisKKworPGgzPkV4YW1wbGVzPC9oMz4KKworPHA+CitUaGUgZm9sbG93aW5nIGRlZmluaXRpb24gY3JlYXRlcyBhIHRhc2sgd2hpY2ggc3VwcG9ydHMgYW4gYXR0cmlidXRlIGNhbGxlZAorYXR0ciBhbmQgdHdvIG5lc3RlZCBlbGVtZW50cywgb25lIGJlaW5nIGEgZmlsZXNldCBhbmQgdGhlIG90aGVyIGEgcGF0aC4gV2hlbgorZXhlY3V0ZWQsIHRoZSByZXN1bHRpbmcgdGFzayBsb2dzIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGFuZCB0aGUgYmFzZWRpcgorb2YgdGhlIGZpcnN0IGZpbGVzZXQuCis8L3A+CisKKzxwcmU+CisgICZsdDtzY3JpcHRkZWYgbmFtZT0mcXVvdDtzY3JpcHR0ZXN0JnF1b3Q7IGxhbmd1YWdlPSZxdW90O2phdmFzY3JpcHQmcXVvdDsmZ3Q7CisgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O2F0dHIxJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZWxlbWVudCBuYW1lPSZxdW90O2ZpbGVzZXQmcXVvdDsgdHlwZT0mcXVvdDtmaWxlc2V0JnF1b3Q7LyZndDsKKyAgICAmbHQ7ZWxlbWVudCBuYW1lPSZxdW90O3BhdGgmcXVvdDsgdHlwZT0mcXVvdDtwYXRoJnF1b3Q7LyZndDsKKyAgICAmbHQ7IVtDREFUQVsKKworICAgICAgc2VsZi5sb2coJnF1b3Q7SGVsbG8gZnJvbSBzY3JpcHQmcXVvdDspOworICAgICAgc2VsZi5sb2coJnF1b3Q7QXR0cmlidXRlIGF0dHIxID0gJnF1b3Q7ICsgYXR0cmlidXRlcy5nZXQoJnF1b3Q7YXR0cjEmcXVvdDspKTsKKyAgICAgIHNlbGYubG9nKCZxdW90O0ZpcnN0IGZpbGVzZXQgYmFzZWRpciA9ICZxdW90OworICAgICAgICArIGVsZW1lbnRzLmdldCgmcXVvdDtmaWxlc2V0JnF1b3Q7KS5nZXQoMCkuZ2V0RGlyKHByb2plY3QpKTsKKworICAgIF1dJmd0OworICAmbHQ7L3NjcmlwdGRlZiZndDsKKworICAmbHQ7c2NyaXB0dGVzdCBhdHRyMT0mcXVvdDt0ZXN0JnF1b3Q7Jmd0OworICAgICZsdDtwYXRoJmd0OworICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O3NyYyZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9wYXRoJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmMmcXVvdDsvJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDttYWluJnF1b3Q7LyZndDsKKyAgJmx0Oy9zY3JpcHR0ZXN0Jmd0OworPC9wcmU+CisKKzxwPgorVGhlIGZvbGxvd2luZyB2YXJpYXRpb24gb24gdGhlIGFib3ZlIHNjcmlwdCBsaXN0cyB0aGUgbnVtYmVyIG9mIGZpbGVzZXQgZWxlbWVudHMKK2FuZCBpdGVyYXRlcyB0aHJvdWdoIHRoZW0KKzwvcD4KKzxwcmU+CisgICZsdDtzY3JpcHRkZWYgbmFtZT0mcXVvdDtzY3JpcHR0ZXN0MiZxdW90OyBsYW5ndWFnZT0mcXVvdDtqYXZhc2NyaXB0JnF1b3Q7Jmd0OworICAgICZsdDtlbGVtZW50IG5hbWU9JnF1b3Q7ZmlsZXNldCZxdW90OyB0eXBlPSZxdW90O2ZpbGVzZXQmcXVvdDsvJmd0OworICAgICZsdDshW0NEQVRBWworICAgICAgZmlsZXNldHMgPSBlbGVtZW50cy5nZXQoJnF1b3Q7ZmlsZXNldCZxdW90Oyk7CisgICAgICBzZWxmLmxvZygmcXVvdDtOdW1iZXIgb2YgZmlsZXNldHMgPSAmcXVvdDsgKyBmaWxlc2V0cy5zaXplKCkpOworICAgICAgZm9yIChpID0gMDsgaSAmbHQ7IGZpbGVzZXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNlbGYubG9nKCZxdW90O2ZpbGVzZXQgJnF1b3Q7ICsgaSArICZxdW90OyBiYXNlZGlyID0gJnF1b3Q7CisgICAgICAgICAgKyBmaWxlc2V0cy5nZXQoaSkuZ2V0RGlyKHByb2plY3QpKTsKKyAgICAgIH0KKyAgICBdXSZndDsKKyAgJmx0Oy9zY3JpcHRkZWYmZ3QKKworICAmbHQ7c2NyaXB0dGVzdDImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyYyZxdW90Oy8mZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O21haW4mcXVvdDsvJmd0OworICAmbHQ7L3NjcmlwdHRlc3QyJmd0OworPC9wcmU+CisKKzxwPgorV2hlbiBhIHNjcmlwdCBoYXMgYSBzeW50YXggZXJyb3IsIHRoZSBzY3JpcHRkZWYgbmFtZSB3aWxsIGJlIGxpc3RlZCBpbiB0aGUKK2Vycm9yLiBGb3IgZXhhbXBsZSBpbiB0aGUgYWJvdmUgc2NyaXB0LCByZW1vdmluZyB0aGUgY2xvc2luZyBjdXJseSBicmFja2V0Cit3b3VsZCByZXN1bHQgaW4gdGhpcyBlcnJvcgorPC9wPgorCis8cD48Y29kZT5idWlsZC54bWw6MTU6IFN5bnRheEVycm9yOiBtaXNzaW5nIH0gaW4gY29tcG91bmQKK3N0YXRlbWVudCAoc2NyaXB0ZGVmIDxjb2RlPiZsdDtzY3JpcHR0ZXN0MiZndDs8L2NvZGU+OyBsaW5lIDEwKTwvY29kZT48L3A+CisKKzxwPgorU2NyaXB0IGVycm9ycyBhcmUgb25seSBkZXRlY3RlZCB3aGVuIGEgc2NyaXB0IHRhc2sgaXMgYWN0dWFsbHkgZXhlY3V0ZWQuCis8L3A+Cis8cD4KKyAgICBUaGUgbmV4dCBleGFtcGxlIGRvZXMgdXNlcyBuZXN0ZWQgdGV4dCBpbiBKeXRob24uIEl0IGFsc28gZGVjbGFyZXMgCisgICAgdGhlIHNjcmlwdCBpbiBhIG5ldyB4bWwgbmFtZXNwYWNlLCB3aGljaCBtdXN0IGJlIHVzZWQgdG8gcmVmZXIgdG8gCisgICAgdGhlIHRhc2suIERlY2xhcmluZyBzY3JpcHRzIGluIGEgbmV3IG5hbWVzcGFjZSBndWFyYW50ZWVzIHRoYXQgQW50IHdpbGwgCisgICAgbm90IGNyZWF0ZSBhIHRhc2sgb2YgdGhlIHNhbWUgKG5hbWVzcGFjZSxsb2NhbG5hbWUpIG5hbWUgcGFpci4gCis8L3A+CisKKzxwcmU+CismbHQ7dGFyZ2V0IG5hbWU9ImVjaG8tdGFzay1qeXRob24iJmd0OworICAmbHQ7c2NyaXB0ZGVmIGxhbmd1YWdlPSJqeXRob24iCisgICAgICBuYW1lPSJlY2hvIgorICAgICAgdXJpPSJodHRwOi8vZXhhbXBsZS5vcmcvc2NyaXB0IiZndDsKKyAgICAgICZsdDshW0NEQVRBWworc2VsZi5sb2coInRleHQ6ICIgK3NlbGYudGV4dCkKKyAgICBdXSZndDsKKyAgICAmbHQ7L3NjcmlwdGRlZiZndDsKKyZsdDsvdGFyZ2V0Jmd0OworCismbHQ7dGFyZ2V0IG5hbWU9InRlc3RFY2hvIiBkZXBlbmRzPSJlY2hvLXRhc2stanl0aG9uIgorICAgIHhtbG5zOnM9Imh0dHA6Ly9leGFtcGxlLm9yZy9zY3JpcHQiJmd0OworICAmbHQ7czplY2hvJmd0O25lc3RlZCB0ZXh0Jmx0Oy9zOmVjaG8mZ3Q7CismbHQ7L3RhcmdldCZndDsKKzwvcHJlPgorCitUaGUgbmV4dCBleGFtcGxlIHNob3dzIHRoZSB1c2Ugb2YgJmx0O2NsYXNzcGF0aCZndDsgYW5kCisibG9hZGVycmVmIiB0byBnZXQgYWNjZXNzIHRvIHRoZSBiZWFuc2hlbGwgamFyLgorPHByZT4KKyAgICAmbHQ7c2NyaXB0ZGVmIG5hbWU9ImIxIiBsYW5ndWFnZT0iYmVhbnNoZWxsIgorICAgICAgICAgICAgICAgbG9hZGVycmVmPSJiZWFuc2hlbGwtcmVmIiZndDsKKyAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iYSIvJmd0OworICAgICAgJmx0O2NsYXNzcGF0aAorICAgICAgICBwYXRoPSIke3VzZXIuaG9tZX0vc2NyaXB0aW5nL2JlYW5zaGVsbC9ic2gtMS4zYjEuamFyIi8mZ3Q7CisgICAgICBzZWxmLmxvZygiYXR0cmlidXRlIGEgaXMgIiArIGF0dHJpYnV0ZXMuZ2V0KCJhIikpOworICAgICZsdDsvc2NyaXB0ZGVmJmd0OworCisgICAgJmx0O3NjcmlwdGRlZiBuYW1lPSJiMiIgbGFuZ3VhZ2U9ImJlYW5zaGVsbCIKKyAgICAgICAgICAgICAgIGxvYWRlcnJlZj0iYmVhbnNoZWxsLXJlZiImZ3Q7CisgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImEyIi8mZ3Q7CisgICAgICBzZWxmLmxvZygiYXR0cmlidXRlIGEyIGlzICIgKyBhdHRyaWJ1dGVzLmdldCgiYTIiKSk7CisgICAgJmx0Oy9zY3JpcHRkZWYmZ3Q7CisKKyAgICAmbHQ7YjEgYT0idGhpcyBpcyBhbiAnYSciLyZndDsKKyAgICAmbHQ7YjIgYTI9InRoaXMgaXMgYW4gJ2EyJyBmb3IgYjIiLyZndDsKKzwvcHJlPgorPGgzPlRlc3RpbmcgU2NyaXB0czwvaDM+CisKKzxwPgorVGhlIGVhc2llc3Qgd2F5IHRvIHRlc3Qgc2NyaXB0cyBpcyB0byB1c2UgdGhlIAorPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYW50dW5pdC8iPkFudFVuaXQ8L2E+IGFudCBsaWJyYXJ5LgorVGhpcyB3aWxsIHJ1biBhbGwgdGFyZ2V0cyBpbiBhIHNjcmlwdCB0aGF0IGJlZ2luIHdpdGggInRlc3QiIChhbmQgdGhlaXIgZGVwZW5kZW5jaWVzKS4gPC9wPgorCisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NlcnZlcmRlcGxveS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zZXJ2ZXJkZXBsb3kuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzFhYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zZXJ2ZXJkZXBsb3kuaHRtbApAQCAtMCwwICsxLDMzNSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5TZXJ2ZXJEZXBsb3kgVGFzazwvdGl0bGU+CisKKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMT48YSBuYW1lPSJzZXJ2ZXJkZXBsb3kiPkFOVCBTZXJ2ZXJEZXBsb3kgVXNlciBNYW51YWw8L2E+PC9oMT4KKzxwPmJ5PC9wPgorPCEtLSBOYW1lcyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBvbiBsYXN0IG5hbWUgLS0+Cis8dWw+Cis8bGk+Q2hyaXN0b3BoZXIgQS4gTG9uZ28gKDxhIGhyZWY9Im1haWx0bzpjYWxAY2xvdWQ5Lm5ldCI+Y2FsQGNsb3VkOS5uZXQ8L2E+KTwvbGk+Cis8bGk+Q3lyaWxsZSBNb3J2YW4gKDxhIGhyZWY9Im1haWx0bzpjbW9ydmFuQGluZ2Vub3N5YS5jb20iPmNtb3J2YW5AaW5nZW5vc3lhLmNvbTwvYT4pPC9saT4KKzwvdWw+CisKKzwvcD4KKzxocj4KKzxwPiBBdCBwcmVzZW50IHRoZSB0YXNrcyBzdXBwb3J0Ojxicj4KKworPHVsPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuYmVhLmNvbSIgdGFyZ2V0PSJfdG9wIj5XZWJsb2dpYzwvYT4gc2VydmVyczwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vYmplY3R3ZWIub3JnL2pvbmFzLyIgdGFyZ2V0PSJfdG9wIj5KT25BUzwvYT4KKzIuNCBPcGVuIFNvdXJjZSBFSkIgc2VydmVyPC9saT4KKzwvdWw+CitPdmVyIHRpbWUgd2UgZXhwZWN0IGZ1cnRoZXIgb3B0aW9uYWwgdGFza3MgIHRvIHN1cHBvcnQgYWRkaXRpb25hbCBKMkVFIFNlcnZlcnMuCis8L3A+CisKKzxocj4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorPHRyPjx0ZD5UYXNrPC90ZD48dGQgY29sc3Bhbj0iMiI+QXBwbGljYXRpb24gU2VydmVyczwvdGQ+PC90cj4KKzx0cj48dGQgcm93c3Bhbj0iNCI+PGEgaHJlZj0iI3NlcnZlcmRlcGxveV9lbGVtZW50Ij5zZXJ2ZXJkZXBsb3k8L2E+PC90ZD48dGQgY29sc3Bhbj0iMiIgYWxpZ249ImNlbnRlciI+PGI+TmVzdGVkIEVsZW1lbnRzPC9iPjwvdGQ+PC90cj4KKzx0cj48dGQ+PGEgaHJlZj0iI3NlcnZlcmRlcGxveV9nZW5lcmljIj5nZW5lcmljPC9hPjwvdGQ+PHRkPkdlbmVyaWMgdGFzazwvdGQ+PC90cj4KKzx0cj48dGQ+PGEgaHJlZj0iI3NlcnZlcmRlcGxveV9qb25hcyI+am9uYXM8L2E+PC90ZD48dGQ+Sk9uQVMgMi40PC90ZD48L3RyPgorPHRyPjx0ZD48YSBocmVmPSIjc2VydmVyZGVwbG95X3dlYmxvZ2ljIj53ZWJsb2dpYzwvYT48L3RkPjx0ZD5XZWJsb2dpYzwvdGQ+PC90cj4KKworPC90YWJsZT4KKworPGEgbmFtZT0ic2VydmVyZGVwbG95X2VsZW1lbnQiPgorPGgyPlNlcnZlckRlcGxveSBlbGVtZW50PC9oMj4KKworPGgzPjxiPkRlc2NyaXB0aW9uOjwvYj48L2gzPgorCis8cD5UaGUgPGNvZGU+c2VydmVyZGVwbG95PC9jb2RlPiB0YXNrIGlzIHVzZWQgdG8gcnVuIGEgImhvdCIgZGVwbG95bWVudCB0b29sIGZvcgordmVuZG9yLXNwZWNpZmljIEoyRUUgc2VydmVyLiBUaGUgdGFzayByZXF1aXJlcyBuZXN0ZWQgZWxlbWVudHMgd2hpY2ggZGVmaW5lCit0aGUgYXR0cmlidXRlcyBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgdG9vbCBiZWluZyBleGVjdXRlZC4KK1ZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IHRvb2xzIGVsZW1lbnRzIG1heSBlbmZvcmNlIHJ1bGVzIGZvciB3aGljaAorYXR0cmlidXRlcyBhcmUgcmVxdWlyZWQsIGRlcGVuZGluZyBvbiB0aGUgdG9vbC4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM6PC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFjdGlvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGlzIHRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkLiAgRm9yIG1vc3QgY2FzZXMgdGhpcworICAgIHdpbGwgYmUgImRlcGxveSIuICBTb21lIHRvb2xzIHN1cHBvcnQgYWRkaXRpb25hbCBhY3Rpb25zLCBzdWNoIGFzICJkZWxldGUiLCAibGlzdCIsCisgICAgInVuZGVwbG95IiwgInVwZGF0ZSIuLi48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmdWxseSBxdWFsaWZpZWQgcGF0aC9maWxlbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGRlcGxveWVkLgorICAgIFRoaXMgbWF5IGJlIGFuIC5lYXIsIC5qYXIsIC53YXIsIG9yIGFueSBvdGhlciB0eXBlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgPC90ZD4KKyAgICA8dGQ+VG9vbCBkZXBlbmRlbnQ8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+CisKKzxwPlRoZSBzZXJ2ZXJkZXBsb3kgdGFzayBzdXBwb3J0cyBhIG5lc3RlZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnQgdG8gc2V0IHRoZSBjbGFzc3BhdGguPC9wPgorCis8aDM+VmVuZG9yLXNwZWNpZmljIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoMz5QYXJhbWV0ZXJzIHVzZWQgZm9yIGFsbCB0b29sczo8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBKVk0gcnVubmluZyB0aGUgdG9vbC4KKyAgICBUaGUgY2xhc3NwYXRoIG1heSBhbHNvIGJlIHN1cHBsaWVkIGFzIGEgbmVzdGVkIGVsZW1lbnQuPC90ZD4KKyAgICA8dGQ+VG9vbCBkZXBlbmRlbnQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zZXJ2ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGFkZHJlc3Mgb3IgVVJMIGZvciB0aGUgc2VydmVyIHdoZXJlIHRoZSBjb21wb25lbnQgd2lsbCBiZSBkZXBsb3llZC48L3RkPgorICAgIDx0ZD5Ub29sIGRlcGVuZGVudDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXJuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1c2VyIHdpdGggcHJpdmlsZWdlcyB0byBkZXBsb3kgYXBwbGljYXRpb25zIHRvIHRoZSBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQ+VG9vbCBkZXBlbmRlbnQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcGFzc3dvcmQgb2YgdGhlIHVzZXIgd2l0aCBwcml2aWxlZ2VzIHRvIGRlcGxveSBhcHBsaWNhdGlvbnMgdG8gdGhlIHNlcnZlci48L3RkPgorICAgIDx0ZD5Ub29sIGRlcGVuZGVudDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5BbHNvIHN1cHBvcnRlZCBhcmUgbmVzdGVkIHZlbmRvci1zcGVjaWZpYyBlbGVtZW50cy48L3A+CisKKzxhIG5hbWU9InNlcnZlcmRlcGxveV9nZW5lcmljIj4KKzxoMz5HZW5lcmljIGVsZW1lbnQ8L2gzPgorVGhpcyBlbGVtZW50IGlzIHByb3ZpZGVkIGZvciBnZW5lcmljIEphdmEtYmFzZWQgZGVwbG95bWVudCB0b29scy4KK1RoZSBnZW5lcmljIHRhc2sgYWNjZXB0cyAoYnV0IGRvZXMgbm90IHJlcXVpcmUpIG5lc3RlZCA8Y29kZT5hcmc8L2NvZGU+CithbmQgPGNvZGU+anZtYXJnPC9jb2RlPiBlbGVtZW50cy4KK0EgSlZNIHdpbGwgYmUgc3Bhd25lZCB3aXRoIHRoZSBwcm92aWRlZCBhdHRyaWJ1dGVzLiAgSXQgaXMgcmVjb21tZW5kZWQKK3RoYXQgYSB2ZW5kb3Itc3BlY2lmaWMgZWxlbWVudCBiZSB1c2VkIG92ZXIgdGhlIGdlbmVyaWMgb25lIGlmIGF0IGFsbAorcG9zc2libGUuCis8cD5UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgZ2VuZXJpYyBlbGVtZW50LjwvcD4KKzxwPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIEphdmEgYmFzZWQKKyAgICBkZXBsb3ltZW50IHRvb2wgdG8gZXhlY3V0ZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzwvcD4KKworPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+Cis8cD5UaGUgZ2VuZXJpYyBlbGVtZW50IHN1cHBvcnRzIG5lc3RlZCA8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtqdm1hcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisKKzxoMz5FeGFtcGxlPC9oMz4KKworPHA+VGhpcyBleGFtcGxlIHNob3dzIHRoZSB1c2Ugb2YgZ2VuZXJpYyBkZXBsb3kgZWxlbWVudCB0byBkZXBsb3kgYSBjb21wb25lbnQKK3VzaW5nIGEgSmF2YSBiYXNlZCBkZXBsb3kgdG9vbDo8L3A+CisKKzxwcmU+CisgICAgJmx0O3NlcnZlcmRlcGxveSBhY3Rpb249JnF1b3Q7ZGVwbG95JnF1b3Q7IHNvdXJjZT0mcXVvdDske2xpYi5kaXJ9L2VqYl9teUFwcC5lYXImcXVvdDsmZ3Q7CisgICAgICAgICZsdDtnZW5lcmljIGNsYXNzbmFtZT0iY29tLnlhbWF0by5qMmVlLnRvb2xzLmRlcGxveS5EZXBsb3lUb29sIgorICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7Y2xhc3NwYXRofSZxdW90OworICAgICAgICAgICAgdXNlcm5hbWU9JnF1b3Q7JHt1c2VyLm5hbWV9JnF1b3Q7CisgICAgICAgICAgICBwYXNzd29yZD0mcXVvdDske3VzZXIucGFzc3dvcmR9JnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iLWNvbXBvbmVudD1XaWxkU3RhciIvJmd0OworICAgICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iLWZvcmNlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7anZtYXJnIHZhbHVlPSItbXM2NG0iLyZndDsKKyAgICAgICAgICAgICZsdDtqdm1hcmcgdmFsdWU9Ii1teDEyOG0iLyZndDsKKyAgICAgICAgJmx0Oy9nZW5lcmljJmd0OworICAgICZsdDsvc2VydmVyZGVwbG95Jmd0OworPC9wcmU+CisKKzxhIG5hbWU9InNlcnZlcmRlcGxveV93ZWJsb2dpYyI+Cis8aDM+V2ViTG9naWMgZWxlbWVudDwvaDM+Cis8cD4KK1RoZSBXZWJMb2dpYyBlbGVtZW50IGNvbnRhaW5zIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBydW4gdGhlCis8Y29kZT53ZWJsb2dpYy5kZXBsb3k8L2NvZGU+IGRlcGxveW1lbnQgdG9vbC4KKzxwPlZhbGlkIGFjdGlvbnMgZm9yIHRoZSB0b29sIGFyZSA8Y29kZT5kZXBsb3k8L2NvZGU+LCA8Y29kZT51bmRlcGxveTwvY29kZT4sCis8Y29kZT5saXN0PC9jb2RlPiwgPGNvZGU+dXBkYXRlPC9jb2RlPiwgYW5kIDxjb2RlPmRlbGV0ZTwvY29kZT4uCis8cD5JZiB0aGUgYWN0aW9uIGlzIDxjb2RlPmRlcGxveTwvY29kZT4gb3IgPGNvZGU+dXBkYXRlPC9jb2RlPiwKK3RoZSA8Y29kZT5hcHBsaWNhdGlvbjwvY29kZT4gYW5kIDxjb2RlPnNvdXJjZTwvY29kZT4gYXR0cmlidXRlcyBtdXN0IGJlIHNldC4KK0lmIHRoZSBhY3Rpb24gaXMgPGNvZGU+dW5kZXBsb3k8L2NvZGU+IG9yIDxjb2RlPmRlbGV0ZTwvY29kZT4sCit0aGUgPGNvZGU+YXBwbGljYXRpb248L2NvZGU+IGF0dHJpYnV0ZSBtdXN0IGJlIHNldC4gIElmIHRoZSA8Y29kZT51c2VybmFtZTwvY29kZT4KK2F0dHJpYnV0ZSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byAic3lzdGVtIi4gIFRoZSA8Y29kZT5wYXNzd29yZDwvY29kZT4gYXR0cmlidXRlIGlzCityZXF1aXJlZCBmb3IgYWxsIGFjdGlvbnMuCis8cD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGxpY2F0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGJlaW5nIGRlcGxveWVkPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcG9uZW50PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIGNvbXBvbmVudCBzdHJpbmcgZm9yIGRlcGxveW1lbnQgdGFyZ2V0cy4KKyAgICBJdCBpcyBpbiB0aGUgZm9ybSA8Y29kZT4mbHQ7Y29tcG9uZW50Jmd0OzombHQ7dGFyZ2V0MSZndDssJmx0O3RhcmdldDImZ3Q7Li4uPC9jb2RlPgorICAgIFdoZXJlIGNvbXBvbmVudCBpcyB0aGUgYXJjaGl2ZSBuYW1lIChtaW51cyB0aGUgLmphciwgLmVhciwgLndhcgorICAgIGV4dGVuc2lvbikuICBUYXJnZXRzIGFyZSB0aGUgc2VydmVycyB3aGVyZSB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGRlcGxveWVkPC90ZD4KKyAgICA8dGQ+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1ZzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiBzZXQgdG8gdHJ1ZSwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aWxsIGJlCisgICAgcHJpbnRlZCBkdXJpbmcgdGhlIGRlcGxveW1lbnQgcHJvY2Vzcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPlRoaXMgZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mIHNlcnZlcmRlcGxveSB0byBkZXBsb3kgYSBjb21wb25lbnQgdG8gYSBXZWJMb2dpYyBzZXJ2ZXI6PC9wPgorCis8cHJlPgorICAgICZsdDtzZXJ2ZXJkZXBsb3kgYWN0aW9uPSZxdW90O2RlcGxveSZxdW90OyBzb3VyY2U9JnF1b3Q7JHtsaWIuZGlyfS9lamJfbXlBcHAuZWFyJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7d2VibG9naWMgYXBwbGljYXRpb249JnF1b3Q7bXlhcHAmcXVvdDsKKyAgICAgICAgICAgIHNlcnZlcj0mcXVvdDt0MzovL215c2VydmVyOjcwMDEmcXVvdDsKKyAgICAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDske3dlYmxvZ2ljLmhvbWV9L2xpYi93ZWJsb2dpYy5qYXImcXVvdDsKKyAgICAgICAgICAgIHVzZXJuYW1lPSZxdW90OyR7dXNlci5uYW1lfSZxdW90OworICAgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7JHt1c2VyLnBhc3N3b3JkfSZxdW90OworICAgICAgICAgICAgY29tcG9uZW50PSZxdW90O2VqYl9mb29iYXI6bXlzZXJ2ZXIscHJvZHVjdGlvbnNlcnZlciZxdW90OworICAgICAgICAgICAgZGVidWc9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9zZXJ2ZXJkZXBsb3kmZ3Q7Cis8L3ByZT4KKworPHA+VGhpcyBleGFtcGxlIHNob3dzIHNlcnZlcmRlcGxveSBiZWluZyB1c2VkIHRvIGRlbGV0ZSBhIGNvbXBvbmVudCBmcm9tIGEKK1dlYkxvZ2ljIHNlcnZlcjo8L3A+CisKKzxwcmU+CisgICAgJmx0O3NlcnZlcmRlcGxveSBhY3Rpb249JnF1b3Q7ZGVsZXRlJnF1b3Q7IHNvdXJjZT0mcXVvdDske2xpYi5kaXJ9L2VqYl9teUFwcC5qYXImcXVvdDsvJmd0CisgICAgICAgICZsdDt3ZWJsb2dpYyBhcHBsaWNhdGlvbj0mcXVvdDtteWFwcCZxdW90OworICAgICAgICAgICAgc2VydmVyPSZxdW90O3QzOi8vbXlzZXJ2ZXI6NzAwMSZxdW90OworICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7d2VibG9naWMuaG9tZX0vbGliL3dlYmxvZ2ljLmphciZxdW90OworICAgICAgICAgICAgdXNlcm5hbWU9JnF1b3Q7JHt1c2VyLm5hbWV9JnF1b3Q7CisgICAgICAgICAgICBwYXNzd29yZD0mcXVvdDske3VzZXIucGFzc3dvcmR9JnF1b3Q7LyZndDsKKyAgICAmbHQ7L3NlcnZlcmRlcGxveSZndDsKKzwvcHJlPgorCis8YSBuYW1lPSJzZXJ2ZXJkZXBsb3lfam9uYXMiPgorPGgzPkpPbkFTIChKYXZhIE9wZW4gQXBwbGljYXRpb24gU2VydmVyKSBlbGVtZW50PC9oMz4KKzxwPgorVGhlIEpPbkFTIGVsZW1lbnQgY29udGFpbnMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIHJ1biB0aGUKKzxjb2RlPkpvbmFzQWRtaW48L2NvZGU+IGRlcGxveW1lbnQgdG9vbC4KKzxwPlZhbGlkIGFjdGlvbnMgZm9yIHRoZSB0b29sIGFyZSA8Y29kZT5kZXBsb3k8L2NvZGU+LCA8Y29kZT51bmRlcGxveTwvY29kZT4sCis8Y29kZT5saXN0PC9jb2RlPiBhbmQgPGNvZGU+dXBkYXRlPC9jb2RlPi4KKzxwPllvdSBjYW4ndCB1c2UgPGNvZGU+dXNlcjwvY29kZT4gYW5kIDxjb2RlPnBhc3N3b3JkPC9jb2RlPiBwcm9wZXJ0eSB3aXRoIHRoaXMgCit0YXNrLgorPHA+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5qb25hc3Jvb3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJvb3QgZGlyZWN0b3J5IGZvciBKT25BUy48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vcmI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q2hvb3NlIHlvdXIgT1JCIDogUk1JLCBKRVJFTUlFLCBEQVZJRCwgLi4uIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzCisgICAgIHRvIHRoZSBvbmUgcHJlc2VudCBpbiBjbGFzc3BhdGguIFRoZSBjb3JyZXNwb25kaW5nIEpPbkFTIEpBUiBpcworICAgICBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBjbGFzc3BhdGguIElmIHlvdXIgb3JiIGlzIERBVklEIChSTUkvSUlPUCkgeW91IG11c3QgCisgICAgIHNwZWNpZnkgZGF2aWRob3N0IGFuZCBkYXZpZHBvcnQgcHJvcGVydGllcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRhdmlkaG9zdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmFsdWUgZm9yIHRoZSBzeXN0ZW0gcHJvcGVydHkgOiA8Y29kZT5kYXZpZC5Db3NOYW1pbmcuZGVmYXVsdF9ob3N0PC9jb2RlPiAuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kYXZpZHBvcnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZhbHVlIGZvciB0aGUgc3lzdGVtIHByb3BlcnR5IDogPGNvZGU+ZGF2aWQuQ29zTmFtaW5nLmRlZmF1bHRfcG9ydDwvY29kZT4gLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIEphdmEgYmFzZWQKKyAgICBkZXBsb3ltZW50IHRvb2wgdG8gZXhlY3V0ZS4gRGVmYXVsdCB0byA8Y29kZT5vcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluPC9jb2RlPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+Cis8cD5UaGUgam9uYXMgZWxlbWVudCBzdXBwb3J0cyBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorCisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPlRoaXMgZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mIHNlcnZlcmRlcGxveSB0byBkZXBsb3kgYSBjb21wb25lbnQgdG8gYSBKT25BUyBzZXJ2ZXI6PC9wPgorCis8cHJlPgorICAgICZsdDtzZXJ2ZXJkZXBsb3kgYWN0aW9uPSZxdW90O2RlcGxveSZxdW90OyBzb3VyY2U9JnF1b3Q7JHtsaWIuZGlyfS9lamJfbXlBcHAuamFyJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7am9uYXMgc2VydmVyPSZxdW90O015Sk9uQVMmcXVvdDsgam9uYXNyb290PSIke2pvbmFzLnJvb3R9IiZndDsKKworICAgICAgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqb25hcy5yb290fS9saWIvUk1JX2pvbmFzLmphciZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2pvbmFzLnJvb3R9L2NvbmZpZy8mcXVvdDsvJmd0OworICAgICAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAgICAgJmx0Oy9qb25hcyZndDsKKyAgICAmbHQ7L3NlcnZlcmRlcGxveSZndDsKKzwvcHJlPgorCis8cD5UaGlzIGV4YW1wbGUgc2hvd3Mgc2VydmVyZGVwbG95IGJlaW5nIHVzZWQgdG8gbGlzdCB0aGUgY29tcG9uZW50cyBmcm9tIGEKK0pPbkFTIHNlcnZlciBhbmQgYSBXZWJMb2dpYyBzZXJ2ZXI6PC9wPgorCis8cHJlPgorICAgICZsdDtzZXJ2ZXJkZXBsb3kgYWN0aW9uPSZxdW90O2xpc3QmcXVvdDsvJmd0CisgICAgICAgICZsdDtqb25hcyBqb25hc3Jvb3Q9JnF1b3Q7JHtqb25hcy5yb290fSZxdW90OyBvcmI9JnF1b3Q7SkVSRU1JRSZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDt3ZWJsb2dpYyBhcHBsaWNhdGlvbj0mcXVvdDtteWFwcCZxdW90CisgICAgICAgICAgICBzZXJ2ZXI9JnF1b3Q7dDM6Ly9teXNlcnZlcjo3MDAxJnF1b3Q7CisgICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHt3ZWJsb2dpYy5ob21lfS9saWIvd2VibG9naWMuamFyJnF1b3Q7CisgICAgICAgICAgICB1c2VybmFtZT0mcXVvdDske3VzZXIubmFtZX0mcXVvdDsKKyAgICAgICAgICAgIHBhc3N3b3JkPSZxdW90OyR7dXNlci5wYXNzd29yZH0mcXVvdDsvJmd0OworICAgICZsdDsvc2VydmVyZGVwbG95Jmd0OworPC9wcmU+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NldHByb3h5Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NldHByb3h5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhYTk4NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvc2V0cHJveHkuaHRtbApAQCAtMCwwICsxLDIyMiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgIAorPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8dGl0bGU+U2V0cHJveHkKKyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzUyNUQ3NiIKKyAgICAgIGFsaW5rPSIjNTI1RDc2IiB2bGluaz0iIzUyNUQ3NiI+CisKKzx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+CisKKyAgPCEtLSBQQUdFIEhFQURFUiAtLT4KKyAgPHRyPgorICAgIDx0ZD4KKyAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgIDxmb250IHNpemU9IiszIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxzdHJvbmc+U2V0cHJveHkKKyBUYXNrPC9zdHJvbmc+PC9mb250PgorICAgICAgICAgICAgPGJyPjxmb250IGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0cyBKYXZhJ3Mgd2ViIHByb3h5IHByb3BlcnRpZXMsIHNvIHRoYXQgdGFza3MgYW5kIGNvZGUgcnVuIGluIHRoZSBzYW1lIEpWTSBjYW4gaGF2ZSB0aHJvdWdoLXRoZS1maXJld2FsbCBhY2Nlc3MgdG8gcmVtb3RlIHdlYiBzaXRlcywgYW5kIHJlbW90ZSBmdHAgc2l0ZXMuPC9mb250PgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgPCEtLSBQUk9KRUNUIExPR08gLS0+CisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj4KKyAgICAgICAgICAgICAgPGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiIGFsaWduPSJyaWdodCIgYWx0PSJBcGFjaGUgQW50IiBib3JkZXI9IjAiPgorICAgICAgICAgICAgPC9hPgorICAgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPjwvdGFibGU+CisgICAgPC90ZD4KKyAgPC90cj4KKworICA8IS0tIFNUQVJUIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorICA8dHI+CisgICAgPHRkICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorCisgICAgICAgICAgPCEtLSBBcHBseWluZyB0YXNrL2xvbmctZGVzY3JpcHRpb24gLS0+CisgICAgPCEtLSBTdGFydCBEZXNjcmlwdGlvbiAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJkZXNjcmlwdGlvbiI+CisgICAgICAgICAgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIFNldHMgSmF2YSdzIHdlYiBwcm94eSBwcm9wZXJ0aWVzLCBzbyB0aGF0IHRhc2tzIGFuZCBjb2RlIHJ1biBpbiB0aGUgc2FtZSBKVk0gY2FuIGhhdmUgdGhyb3VnaC10aGUtZmlyZXdhbGwgYWNjZXNzIHRvIHJlbW90ZSB3ZWIgc2l0ZXMsIGFuZCByZW1vdGUgZnRwIHNpdGVzLiBZb3UgY2FuIG5vbWluYXRlIGFuIGh0dHAgYW5kIGZ0cCBwcm94eSwgb3IgYSBzb2NrcyBzZXJ2ZXIsIHJlc2V0IHRoZSBzZXJ2ZXIgc2V0dGluZ3MsIG9yIGRvIG5vdGhpbmcgYXQgYWxsLiA8cD4gRXhhbXBsZXMgPHByZT4mbHQ7c2V0cHJveHkvJmd0OzwvcHJlPiBkbyBub3RoaW5nIDxwcmU+Jmx0O3NldHByb3h5IHByb3h5aG9zdD0iZmlyZXdhbGwiLyZndDs8L3ByZT4gc2V0IHRoZSBwcm94eSB0byBmaXJld2FsbDo4MCA8cHJlPiZsdDtzZXRwcm94eSBwcm94eWhvc3Q9ImZpcmV3YWxsIiBwcm94eXBvcnQ9IjgxIi8mZ3Q7PC9wcmU+IHNldCB0aGUgcHJveHkgdG8gZmlyZXdhbGw6ODEgPHByZT4mbHQ7c2V0cHJveHkgcHJveHlob3N0PSIiLyZndDs8L3ByZT4gc3RvcCB1c2luZyB0aGUgaHR0cCBwcm94eTsgZG9uJ3QgY2hhbmdlIHRoZSBzb2NrcyBzZXR0aW5ncyA8cHJlPiZsdDtzZXRwcm94eSBzb2Nrc3Byb3h5aG9zdD0ic29ja3N5Ii8mZ3Q7PC9wcmU+IHVzZSBzb2NrcyB2aWEgc29ja3N5OjEwODAgPHByZT4mbHQ7c2V0cHJveHkgc29ja3Nwcm94eWhvc3Q9IiIvJmd0OzwvcHJlPiBzdG9wIHVzaW5nIHRoZSBzb2NrcyBzZXJ2ZXIuIDxwPiBZb3UgY2FuIHNldCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgaHR0cCB3aXRoIHRoZSA8dHQ+cHJveHlIb3N0PC90dD4gYW5kIDx0dD5wcm94eVBhc3N3b3JkPC90dD4gYXR0cmlidXRlcy4gT24gSmF2YTEuNCBhbmQgYWJvdmUgdGhlc2UgY2FuIGFsc28gYmUgdXNlZCBhZ2FpbnN0IFNPQ0tTNSBzZXJ2ZXJzLiA8L3A+CisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBEZXNjcmlwdGlvbiAtLT4KKworIDwhLS0gSWdub3JlIC0tPgorCisKKworICAgIDwhLS0gU3RhcnQgQXR0cmlidXRlcyAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0iYXR0cmlidXRlcyI+CisgICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5BdHRyaWJ1dGU8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+RGVzY3JpcHRpb248L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+VHlwZTwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5SZXF1aXJlbWVudDwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSBHcm91cCAtLT4gICAgCisgICAgCisgICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAorICAgICAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ub25wcm94eWhvc3RzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+QSBsaXN0IG9mIGhvc3RzIHRvIGJ5cGFzcyB0aGUgcHJveHkgb24uIFRoZXNlIHNob3VsZCBiZSBzZXBhcmF0ZWQgd2l0aCB0aGUgdmVydGljYWwgYmFyIGNoYXJhY3RlciAnfCcuIE9ubHkgaW4gSmF2YSAxLjQgZG9lcyBmdHAgdXNlIHRoaXMgbGlzdC4gZS5nLiBmb3pib3QuY29ycC5zdW4uY29tfCouZW5nLnN1bi5jb208L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHJvd3NwYW49IjciPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5PcHRpb25hbDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnByb3h5aG9zdDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnRoZSBIVFRQL2Z0cCBwcm94eSBob3N0LiBTZXQgdGhpcyB0byAiIiBmb3IgdGhlIGh0dHAgcHJveHkgb3B0aW9uIHRvIGJlIGRpc2FibGVkPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+cHJveHlwYXNzd29yZDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldCB0aGUgcGFzc3dvcmQgZm9yIHRoZSBwcm94eS4gVXNlZCBvbmx5IGlmIHRoZSBwcm94eVVzZXIgaXMgc2V0LjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnByb3h5cG9ydDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnRoZSBIVFRQL2Z0cCBwcm94eSBwb3J0IG51bWJlcjsgZGVmYXVsdCBpcyA4MDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmludDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnByb3h5dXNlcjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNldCB0aGUgcHJveHkgdXNlci4gUHJvYmFibHkgcmVxdWlyZXMgYSBwYXNzd29yZCB0byBhY2NvbXBhbnkgdGhpcyBzZXR0aW5nLiBEZWZhdWx0PSIiPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c29ja3Nwcm94eWhvc3Q8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5UaGUgbmFtZSBvZiBhIFNvY2tzIHNlcnZlci4gU2V0IHRvICIiIHRvIHR1cm4gc29ja3MgcHJveHlpbmcgb2ZmLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNvY2tzcHJveHlwb3J0PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0IHRoZSBQcm94eVBvcnQgZm9yIHNvY2tzIGNvbm5lY3Rpb25zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxMDgwPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+aW50PC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisKKworICAgICAgICA8L3RhYmxlPgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgQXR0cmlidXRlcyAtLT4KKworICAgIDwhLS0gU3RhcnQgRWxlbWVudHMgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0iZWxlbWVudHMiPgorICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVycyBhcyBuZXN0ZWQgZWxlbWVudHM8L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50cyAtLT4KKworCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPCEtLSBFTkQgUklHSFQgU0lERSBNQUlOIEJPRFkgLS0+CisKKzwvdGFibGU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvc29zLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3Nvcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZWZlNTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3Nvcy5odG1sCkBAIC0wLDAgKzEsNTAzIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+CisKKyAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+U09TIFRhc2tzPC90aXRsZT4KKworPC9oZWFkPgorPGJvZHk+CisKKzxkaXYgYWxpZ249ImNlbnRlciI+Cis8aDE+U291cmNlT2ZmU2l0ZSBUYXNrcyBVc2VyIE1hbnVhbDwvaDE+CisKKzxkaXYgYWxpZ249ImxlZnQiPmJ5Cis8dWw+Cis8bGk+PGEgaHJlZj0ibWFpbHRvOmplc3NlQGNyeXB0b2NhcmQuY29tIj5KZXNzZSBTdG9ja2FsbDwvYT48L2xpPgorPC91bD4KK1ZlcnNpb24gMS4xIDIwMDIvMDEvMjMKKzxicj4KKzxicj4KKworPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIyIj4KKzxoMj5Db250ZW50czwvaDI+CisKKzx1bD4KKyAgICA8bGk+PGEgaHJlZj0iI2ludHJvIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iI3Rhc2tzIj5UaGUgVGFza3M8L2E+PC9saT4KKworPC91bD4KKzxicj4KKworPGgyPjxhIG5hbWU9ImludHJvIj5JbnRyb2R1Y3Rpb248L2E+IDwvaDI+CisKKzxwPlRoZXNlIHRhc2tzIHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3NzYWZlL2RlZmF1bHQuYXNwIiB0YXJnZXQ9Il90b3AiPgorTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlPC9hPiBTQ00gdmlhIDxhIGhyZWY9Imh0dHA6Ly93d3cuc291cmNlZ2Vhci5jb20iPgorU291cmNlR2VhcidzPC9hPiA8YSBocmVmPSJodHRwOi8vc291cmNlZ2Vhci5jb20vc29zL2luZGV4Lmh0bSI+U291cmNlT2ZmU2l0ZTwvYT4KK3Byb2R1Y3QuIFNvdXJjZU9mZlNpdGUgaXMgYW4gYWRkLW9uIHRvIE1pY3Jvc29mdCdzIFZTUywgdGhhdCBhbGxvd3MgcmVtb3RlCitkZXZlbG9wbWVudCB0ZWFtcyBhbmQgdGVsZS1jb21tdXRlcnMgdGhhdCBuZWVkIGZhc3QgYW5kIHNlY3VyZSByZWFkL3dyaXRlCithY2Nlc3MgdG8gYSBjZW50cmFsaXplZCBTb3VyY2VTYWZlIGRhdGFiYXNlIHZpYSBhbnkgVENQL0lQIGNvbm5lY3Rpb24uIFNPUworcHJvdmlkZXMgTGludXggLFNvbGFyaXMgJmFtcDsgV2luZG93cyBjbGllbnRzLiBUaGUKKzxjb2RlPiBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3M8L2NvZGU+CitwYWNrYWdlIGNvbnNpc3RzICBvZiBhIHNpbXBsZSBmcmFtZXdvcmsgdG8gc3VwcG9ydCBTT1MgZnVuY3Rpb25hbGl0eSBhcyB3ZWxsCithcyBzb21lIEFudCB0YXNrcyAgZW5jYXBzdWxhdGluZyBmcmVxdWVudGx5IHVzZWQgU09TIGNvbW1hbmRzLiAgQWx0aG91Z2ggaXQKK2lzIHBvc3NpYmxlIHRvIHVzZSAgdGhlc2UgY29tbWFuZHMgb24gdGhlIGRlc2t0b3AsICB0aGV5IHdlcmUgcHJpbWFyaWx5IGludGVuZGVkCit0byBiZSB1c2VkIGJ5ICBhdXRvbWF0ZWQgYnVpbGQgc3lzdGVtcy4gVGhlc2UgdGFza3MgaGF2ZSBiZWVuIHRlc3RlZCB3aXRoCitTb3VyY2VPZmZTaXRlICB2ZXJzaW9uIDMuNS4xIGNvbm5lY3RpbmcgdG8gVmlzdWFsU291cmNlU2FmZSA2LjAuIFRoZSB0YXNrcworaGF2ZSBiZWVuIHRlc3RlZCB3aXRoIExpbnV4LCBTb2xhcmlzICZhbXA7IFdpbmRvd3MyMDAwLjwvcD4KKworPGgyPjxhIG5hbWU9InRhc2tzIj5UaGUgVGFza3M8L2E+IDwvaDI+CisKKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CisgICAgICAgPHRib2R5PgorICAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+PGEgaHJlZj0iI1NPU0dldCI+c29zZ2V0PC9hPjwvdGQ+CisgICAgICAgICAgIDx0ZD5SZXRyaWV2ZXMgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3Qgb3IgZmlsZS48L3RkPgorICAgICAgICAgPC90cj4KKyAgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPjxhIGhyZWY9IiNTT1NMYWJlbCI+c29zbGFiZWw8L2E+PC90ZD4KKyAgICAgICAgICAgPHRkPkFzc2lnbnMgYSBsYWJlbCB0byB0aGUgc3BlY2lmaWVkIHByb2plY3QuPC90ZD4KKyAgICAgICAgIDwvdHI+CisgICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD48YSBocmVmPSIjU09TQ2hlY2tJbiI+c29zY2hlY2tpbjwvYT48L3RkPgorICAgICAgICAgICA8dGQ+VXBkYXRlcyBWU1Mgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gYSBjaGVja2VkIG91dCBmaWxlIG9yIHByb2plY3QsCisgICAgICAgICAgIGFuZCB1bmxvY2tzIHRoZSBWU1MgbWFzdGVyIGNvcHkuPC90ZD4KKyAgICAgICAgIDwvdHI+CisgICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD48YSBocmVmPSIjU09TQ2hlY2tPdXQiPnNvc2NoZWNrb3V0PC9hPjwvdGQ+CisgICAgICAgICAgIDx0ZD5SZXRyaWV2ZXMgYSByZWFkLXdyaXRlIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0CisgICAgICAgICAgIG9yIGZpbGUsIGxvY2tpbmcgdGhlJm5ic3A7VlNTIG1hc3RlciBjb3B5PC90ZD4KKyAgICAgICAgIDwvdHI+CisKKyAgPC90Ym9keT4KKzwvdGFibGU+CisgICAgIDxicj4KKworPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIyIj4KKzxoMj5UYXNrIERlc2NyaXB0aW9uczwvaDI+CisKKzxoMj48YSBuYW1lPSJTT1NHZXQiPjwvYT5TT1NHZXQ8YnI+CisgICAgIDwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorICAgICAgICAgICAgIFRhc2sgdG8gcGVyZm9ybSBHRVQgY29tbWFuZHMgd2l0aCBTT1M8YnI+Cis8aDM+UGFyYW1ldGVyczwvaDM+CisgICAgIDwvZGl2PgorICAgICA8L2Rpdj4KKworPHRhYmxlIGJvcmRlcj0iMSI+CisgICAgIDx0Ym9keT4KKyAgICAgICA8dHI+CisgICAgICAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgICAgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD5zb3NjbWQ8L3RkPgorICAgICAgICAgIDx0ZD5EaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgc29zY21kKC5leGUpIDxicj4KKyAgICAgICAgICBzb3NjbWQoLmV4ZSkgbXVzdCBiZSBpbiB0aGUgcGF0aCBpZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgorICAgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPnZzc3NlcnZlcnBhdGg8L3RkPgorICAgICAgICAgICA8dGQ+cGF0aCB0byB0aGUgc3Jjc2FmZS5pbmkgIC0gZWcuIFxcc2VydmVyXHZzc1xzcmNzYWZlLmluaTwvdGQ+CisgICAgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgICAgICAgPHRkPmFkZHJlc3MgJmFtcDsgcG9ydCBvZiB0aGUgU09TIHNlcnZlciAgLSBlZy4gMTkyLjE2OC4wLjE6ODg4ODwvdGQ+CisgICAgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD5wcm9qZWN0cGF0aDwvdGQ+CisgICAgICAgICAgIDx0ZD5Tb3VyY2VTYWZlIHByb2plY3QgcGF0aCAtIGVnLiAkL1NvdXJjZVJvb3QvUHJvamVjdDE8L3RkPgorICAgICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgICAgICAgIDx0ZD5GaWxlbmFtZSB0byBhY3QgdXBvbjxicj4KKyAgICAgICAgICAgSWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiBhY3QgdXBvbiB0aGUgcHJvamVjdDwvdGQ+CisgICAgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICAgICAgICAgPHRkPlNvdXJjZVNhZmUgdXNlcm5hbWU8L3RkPgorICAgICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgICAgICAgICA8dGQ+U291cmNlU2FmZSBwYXNzd29yZDwvdGQ+CisgICAgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPmxvY2FscGF0aDwvdGQ+CisgICAgICAgICAgIDx0ZD5PdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg8L3RkPgorICAgICAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD5zb3Nob21lPC90ZD4KKyAgICAgICAgICAgPHRkPlRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5PC90ZD4KKyAgICAgICAgICAgPHRkPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICA8dGQ+bm9jb21wcmVzczwvdGQ+CisgICAgICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gZGlzYWJsZSBjb21wcmVzc2lvbjwvdGQ+CisgICAgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+CisgICAgICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gT25seSB3b3JrcyB3aXRoIHRoZSBHZXRQcm9qZWN0IGNvbW1hbmQ8L3RkPgorICAgICAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICAgICAgICAgPHRkPmEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IC0gT25seSB3b3JrcyB3aXRoIHRoZSBHZXRGaWxlIGNvbW1hbmQ8L3RkPgorICAgICAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD5sYWJlbDwvdGQ+CisgICAgICAgICAgIDx0ZD5hIGxhYmVsIHZlcnNpb24gdG8gZ2V0IC0gT25seSB3b3JrcyB3aXRoIHRoZSBHZXRQcm9qZWN0IGNvbW1hbmQ8L3RkPgorICAgICAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgIDx0ZD5ub2NhY2hlPC90ZD4KKyAgICAgICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBPbmx5IG5lZWRlZCBpZiBTT1NIT01FIGlzIHNldCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZTwvdGQ+CisgICAgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgICAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIFN0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KKyAgICAgICAgICAgPHRkPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlPC9oMz4KKworPHByZT4KKyZsdDtzb3NnZXQgdmVyYm9zZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgIHJlY3Vyc2l2ZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgIHVzZXJuYW1lPSZxdW90O2J1aWxkJnF1b3Q7CisgICAgICAgIHBhc3N3b3JkPSZxdW90O2J1aWxkJnF1b3Q7CisgICAgICAgIGxvY2FscGF0aD0mcXVvdDt0bXAmcXVvdDsKKyAgICAgICAgcHJvamVjdHBhdGg9JnF1b3Q7JC9Tb3VyY2VSb290L3Byb2plY3QxJnF1b3Q7CisgICAgICAgIHNvc3NlcnZlcnBhdGg9JnF1b3Q7MTkyLjE2OC4xMC42Ojg4ODgmcXVvdDsKKyAgICAgICAgdnNzc2VydmVycGF0aD0mcXVvdDtkOlx2c3Ncc3Jjc2FmZS5pbmkmcXVvdDsvJmd0OworPC9wcmU+Cis8c21hbGw+Q29ubmVjdHMgdG8gYSBTb3VyY2VPZmZzaXRlIHNlcnZlciBvbiAxOTIuMTY4LjEwLjY6ODg4OCB3aXRoCitidWlsZCxidWlsZCBhcyB0aGUgdXNlcm5hbWUgJmFtcDsgcGFzc3dvcmQuIFRoZSBTb3VyY2VTYWZlICBkYXRhYmFzZSByZXNpZGVzCitvbiB0aGUgc2FtZSBib3ggYXMgdGhlIFNPUyBzZXJ2ZXIgICZhbXA7IHRoZSBWU1MgZGF0YWJhc2UgIGlzIGF0CismcXVvdDtkOlx2c3Ncc3Jjc2FmZS5pbmkmcXVvdDsgRG9lcyBhIHJlY3Vyc2l2ZSBHZXRQcm9qZWN0IG9uCiskL1NvdXJjZVJvb3QvcHJvamVjdDEsIHVzaW5nIHRtcCBhcyB0aGUgd29ya2luZworZGlyZWN0b3J5LiA8L3NtYWxsPjxicj4KKzxicj4KKworPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIyIj4KKzxoMj48YSBuYW1lPSJTT1NMYWJlbCI+PC9hPlNPU0xhYmVsPC9oMj4KKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KKyAgICAgICAgICAgICBUYXNrIHRvIHBlcmZvcm0gTGFiZWwgY29tbWFuZHMgd2l0aCBTT1M8YnI+Cis8aDM+UGFyYW1ldGVyczwvaDM+CisKKzx0YWJsZSBib3JkZXI9IjEiPgorICAgIDx0Ym9keT48dHI+CisgICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5zb3NjbWQ8L3RkPgorICAgICAgPHRkPkRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb3NjbWQoLmV4ZSkgPGJyPgorICAgICAgc29zY21kKC5leGUpIG11c3QgYmUgaW4gdGhlIHBhdGggaWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPnZzc3NlcnZlcnBhdGg8L3RkPgorICAgICAgIDx0ZD5wYXRoIHRvIHRoZSBzcmNzYWZlLmluaSAgLSBlZy4gXFxzZXJ2ZXJcdnNzXHNyY3NhZmUuaW5pPC90ZD4KKyAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICA8dGQ+c29zc2VydmVycGF0aDwvdGQ+CisgICAgICAgPHRkPmFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIFNPUyBzZXJ2ZXIgIC0gZWcuIDE5Mi4xNjguMC4xOjg4ODg8L3RkPgorICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD5wcm9qZWN0cGF0aDwvdGQ+CisgICAgICAgPHRkPlNvdXJjZVNhZmUgcHJvamVjdCBwYXRoIC0gZWcuICQvU291cmNlUm9vdC9Qcm9qZWN0MTwvdGQ+CisgICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICAgICA8dGQ+U291cmNlU2FmZSB1c2VybmFtZTwvdGQ+CisgICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICAgICA8dGQ+U291cmNlU2FmZSBwYXNzd29yZDwvdGQ+CisgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICA8dGQ+bGFiZWw8L3RkPgorICAgICAgIDx0ZD5UaGUgbGFiZWwgdG8gYXBwbHkgdG8gYSBwcm9qZWN0PC90ZD4KKyAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgICAgPHRkPkEgY29tbWVudCB0byBiZSBhcHBsaWVkIHRvIGFsbCBmaWxlcyBiZWluZyBsYWJlbGVkPC90ZD4KKyAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIFN0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KKyAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZTwvaDM+Cis8cHJlPgorJmx0O3Nvc2xhYmVsIHVzZXJuYW1lPSZxdW90O2J1aWxkJnF1b3Q7CisgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7YnVpbGQmcXVvdDsKKyAgICAgICAgICBsYWJlbD0mcXVvdDt0ZXN0IGxhYmVsJnF1b3Q7CisgICAgICAgICAgcHJvamVjdHBhdGg9JnF1b3Q7JC9Tb3VyY2VSb290L3Byb2plY3QxJnF1b3Q7CisgICAgICAgICAgc29zc2VydmVycGF0aD0mcXVvdDsxOTIuMTY4LjEwLjY6ODg4OCZxdW90OworICAgICAgICAgIHZzc3NlcnZlcnBhdGg9JnF1b3Q7ZDpcdnNzXHNyY3NhZmUuaW5pJnF1b3Q7LyZndDsKKzwvcHJlPgorCis8c21hbGw+Q29ubmVjdHMgdG8gYSBTb3VyY2VPZmZzaXRlIHNlcnZlciBvbiAxOTIuMTY4LjEwLjY6ODg4OCB3aXRoCitidWlsZCxidWlsZCBhcyB0aGUgdXNlcm5hbWUgJmFtcDsgcGFzc3dvcmQuIFRoZSBTb3VyY2VTYWZlIGRhdGFiYXNlIHJlc2lkZXMKK29uIHRoZSBzYW1lIGJveCBhcyAgdGhlICBTT1Mgc2VydmVyICAmYW1wOyB0aGUgVlNTIGRhdGFiYXNlIGlzIGF0CismcXVvdDtkOlx2c3Ncc3Jjc2FmZS5pbmkmcXVvdDsuIExhYmVscyB0aGUgJC9Tb3VyY2VSb290L3Byb2plY3QxCitwcm9qZWN0IHdpdGggJnF1b3Q7dGVzdCBsYWJlbCZxdW90Oy48L3NtYWxsPjxicj4KKzxicj4KKworPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIyIj48YnI+CisKKzxoMj48YSBuYW1lPSJTT1NDaGVja0luIj48L2E+U09TQ2hlY2tJbjwvaDI+CisKKzxoMz5EZXNjcmlwdGlvbjwvaDM+CisgICAgICAgIFRhc2sgdG8gcGVyZm9ybSBDaGVja0luIGNvbW1hbmRzIHdpdGggU09TPGJyPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSI+CisgICAgICAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnNvc2NtZDwvdGQ+CisgICAgICA8dGQ+RGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHNvc2NtZCguZXhlKSA8YnI+CisgICAgICBzb3NjbWQoLmV4ZSkgbXVzdCBiZSBpbiB0aGUgcGF0aCBpZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICA8dGQ+dnNzc2VydmVycGF0aDwvdGQ+CisgICAgICAgPHRkPnBhdGggdG8gdGhlIHNyY3NhZmUuaW5pICAtIGVnLiBcXHNlcnZlclx2c3Ncc3Jjc2FmZS5pbmk8L3RkPgorICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgICA8dGQ+YWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgU09TIHNlcnZlciAgLSBlZy4gMTkyLjE2OC4wLjE6ODg4ODwvdGQ+CisgICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPnByb2plY3RwYXRoPC90ZD4KKyAgICAgICA8dGQ+U291cmNlU2FmZSBwcm9qZWN0IHBhdGggLSBlZy4gJC9Tb3VyY2VSb290L1Byb2plY3QxPC90ZD4KKyAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgICAgPHRkPkZpbGVuYW1lIHRvIGFjdCB1cG9uPGJyPiBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIGFjdCB1cG9uIHRoZSBwcm9qZWN0PC90ZD4KKyAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD51c2VybmFtZTwvdGQ+CisgICAgICAgPHRkPlNvdXJjZVNhZmUgdXNlcm5hbWU8L3RkPgorICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD5wYXNzd29yZDwvdGQ+CisgICAgICAgPHRkPlNvdXJjZVNhZmUgcGFzc3dvcmQ8L3RkPgorICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPmxvY2FscGF0aDwvdGQ+CisgICAgICAgPHRkPk92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDwvdGQ+CisgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICA8dGQ+c29zaG9tZTwvdGQ+CisgICAgICAgPHRkPlRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5PC90ZD4KKyAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD5ub2NvbXByZXNzPC90ZD4KKyAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIGRpc2FibGUgY29tcHJlc3Npb248L3RkPgorICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+CisgICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBPbmx5IHdvcmtzIHdpdGggdGhlIENoZWNrT3V0UHJvamVjdCBjb21tYW5kPC90ZD4KKyAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD5ub2NhY2hlPC90ZD4KKyAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgbmVlZGVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlPC90ZD4KKyAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIFN0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KKyAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPjx0ZD5jb21tZW50PC90ZD4KKyAgICAgICA8dGQ+QSBjb21tZW50IHRvIGJlIGFwcGxpZWQgdG8gYWxsIGZpbGVzIGJlaW5nIGNoZWNrZWQgaW48L3RkPgorICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyA8L3Rib2R5PgorPC90YWJsZT4KKworPGgzPkV4YW1wbGU8L2gzPgorPHByZT4KKyZsdDtzb3NjaGVja2luIHVzZXJuYW1lPSZxdW90O2J1aWxkJnF1b3Q7CisgICAgICAgICAgICBwYXNzd29yZD0mcXVvdDtidWlsZCZxdW90OworICAgICAgICAgICAgZmlsZT0mcXVvdDtmb29iYXIudHh0JnF1b3Q7CisgICAgICAgICAgICB2ZXJib3NlPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgIGNvbW1lbnQ9JnF1b3Q7Y29tbWVudCBhYmMmcXVvdDsKKyAgICAgICAgICAgIHByb2plY3RwYXRoPSZxdW90OyQvU291cmNlUm9vdC9wcm9qZWN0MSZxdW90OworICAgICAgICAgICAgc29zc2VydmVycGF0aD0mcXVvdDtzZXJ2ZXIxOjg4ODgmcXVvdDsKKyAgICAgICAgICAgIHZzc3NlcnZlcnBhdGg9JnF1b3Q7XFxzZXJ2ZXIyXHZzc1xzcmNzYWZlLmluaSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKworPHNtYWxsPkNvbm5lY3RzIHRvIGEgU291cmNlT2Zmc2l0ZSBzZXJ2ZXIgb24gc2VydmVyMTo4ODg4IHdpdGggYnVpbGQsYnVpbGQgYXMKK3RoZSB1c2VybmFtZSAmYW1wOyBwYXNzd29yZC4gVGhlIFNvdXJjZVNhZmUgZGF0YWJhc2UgcmVzaWRlcyBvbiBhIGRpZmZlcmVudAorYm94IChzZXJ2ZXIyKSAmYW1wOyB0aGUgVlNTIGRhdGFiYXNlIGlzIG9uIGEgc2hhcmUgY2FsbGVkCismcXVvdDt2c3MmcXVvdDsuIENoZWNrcy1pbiBvbmx5IHRoZSAmcXVvdDtmb29iYXIudHh0JnF1b3Q7IGZpbGUgYWRkaW5nCithIGNvbW1lbnQgb2YgJnF1b3Q7Y29tbWVudCBhYmMmcXVvdDsuIEV4dHJhIHN0YXR1cyBtZXNzYWdlcyB3aWxsIGJlCitkaXNwbGF5ZWQgb24gc2NyZWVuLjwvc21hbGw+PGJyPgorPGJyPgorCis8aHIgd2lkdGg9IjEwMCUiIHNpemU9IjIiPgorPGgyPjxhIG5hbWU9IlNPU0NoZWNrT3V0Ij48L2E+U09TQ2hlY2tPdXQ8L2gyPgorCis8aDM+RGVzY3JpcHRpb248L2gzPgorICAgICAgIFRhc2sgdG8gcGVyZm9ybSBDaGVja091dCBjb21tYW5kcyB3aXRoIFNPUzxicj4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorCis8dGFibGUgYm9yZGVyPSIxIj4KKyAgICAgICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgICA8dGg+VmFsdWVzPC90aD4KKyAgICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+c29zY21kPC90ZD4KKyAgICAgIDx0ZD5EaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgc29zY21kKC5leGUpIDxicj4KKyAgICAgIHNvc2NtZCguZXhlKSBtdXN0IGJlIGluIHRoZSBwYXRoIGlmIHRoaXMgaXMgbm90IHNwZWNpZmllZDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD52c3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgICA8dGQ+cGF0aCB0byB0aGUgc3Jjc2FmZS5pbmkgIC0gZWcuIFxcc2VydmVyXHZzc1xzcmNzYWZlLmluaTwvdGQ+CisgICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPnNvc3NlcnZlcnBhdGg8L3RkPgorICAgICAgIDx0ZD5hZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBTT1Mgc2VydmVyICAtIGVnLiAxOTIuMTY4LjAuMTo4ODg4PC90ZD4KKyAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICA8dGQ+cHJvamVjdHBhdGg8L3RkPgorICAgICAgIDx0ZD5Tb3VyY2VTYWZlIHByb2plY3QgcGF0aCAtIGVnLiAkL1NvdXJjZVJvb3QvUHJvamVjdDE8L3RkPgorICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD5maWxlPC90ZD4KKyAgICAgICA8dGQ+RmlsZW5hbWUgdG8gYWN0IHVwb248YnI+IElmIG5vIGZpbGUgaXMgc3BlY2lmaWVkIHRoZW4gYWN0IHVwb24gdGhlIHByb2plY3Q8L3RkPgorICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICAgICA8dGQ+U291cmNlU2FmZSB1c2VybmFtZTwvdGQ+CisgICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICAgICA8dGQ+U291cmNlU2FmZSBwYXNzd29yZDwvdGQ+CisgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KKyAgICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KKyAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgIDx0ZD5zb3Nob21lPC90ZD4KKyAgICAgICA8dGQ+VGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3Rvcnk8L3RkPgorICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPm5vY29tcHJlc3M8L3RkPgorICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gZGlzYWJsZSBjb21wcmVzc2lvbjwvdGQ+CisgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgd29ya3Mgd2l0aCB0aGUgQ2hlY2tPdXRQcm9qZWN0IGNvbW1hbmQ8L3RkPgorICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPm5vY2FjaGU8L3RkPgorICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gT25seSBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGU8L3RkPgorICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gU3RhdHVzIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQ8L3RkPgorICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisgICAgIDxicj4KKworPGgzPkV4YW1wbGU8L2gzPgorPHByZT4KKyZsdDtzb3NjaGVja291dCBzb3NjbWQ9JnF1b3Q7L3Vzci9sb2NhbC9iaW4mcXVvdDsKKyAgICAgICAgICAgICB2ZXJib3NlPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgICB1c2VybmFtZT0mcXVvdDtidWlsZCZxdW90OworICAgICAgICAgICAgIHBhc3N3b3JkPSZxdW90O2J1aWxkJnF1b3Q7CisgICAgICAgICAgICAgcHJvamVjdHBhdGg9JnF1b3Q7JC9Tb3VyY2VSb290L3Byb2plY3QxJnF1b3Q7CisgICAgICAgICAgICAgc29zc2VydmVycGF0aD0mcXVvdDsxOTIuMTY4LjEwLjY6ODg4OCZxdW90OworICAgICAgICAgICAgIHZzc3NlcnZlcnBhdGg9JnF1b3Q7XFxzZXJ2ZXIyXHZzc1xzcmNzYWZlLmluaSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKworPHNtYWxsPkNvbm5lY3RzIHRvIGEgU291cmNlT2Zmc2l0ZSBzZXJ2ZXIgb24gc2VydmVyMTo4ODg4IHdpdGggYnVpbGQsYnVpbGQgYXMKK3RoZSB1c2VybmFtZSAmYW1wOyBwYXNzd29yZC4gVGhlIFNvdXJjZVNhZmUgZGF0YWJhc2UgcmVzaWRlcyBvbiBhIGRpZmZlcmVudAorYm94IChzZXJ2ZXIyKSAmYW1wOyB0aGUgVlNTIGRhdGFiYXNlIGlzIG9uIGEgc2hhcmUgY2FsbGVkCismcXVvdDt2c3MmcXVvdDsuIENoZWNrcy1vdXQgJnF1b3Q7cHJvamVjdDEmcXVvdDssIE9ubHkgdGhlCismcXVvdDtwcm9qZWN0MSZxdW90OyBkaXJlY3Rvcnkgd2lsbCBiZSBsb2NrZWQgYXMgdGhlIHJlY3Vyc2l2ZSBvcHRpb24KK3dhcyBub3Qgc2V0LiBFeHRyYSBzdGF0dXMgbWVzc2FnZXMgd2lsbCBiZSBkaXNwbGF5ZWQgb24gc2NyZWVuLiBUaGUKK3Nvc2NtZCguZXhlKSBmaWxlIHRvIGJlIHVzZWQgcmVzaWRlcyBpbiAvdXNyL2xvY2FsL2Jpbi48L3NtYWxsPjxicj4KKzxicj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zb3VuZC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zb3VuZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOTVmODAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NvdW5kLmh0bWwKQEAgLTAsMCArMSwxMjMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+U291bmQgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ic291bmQiPlNvdW5kPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+UGxheXMgYSBzb3VuZC1maWxlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1aWxkLCBhY2NvcmRpbmcgdG8gd2hldGhlcgordGhlIGJ1aWxkIGZhaWxlZCBvciBzdWNjZWVkZWQuIFlvdSBjYW4gc3BlY2lmeSBlaXRoZXIgYSBzcGVjaWZpYworc291bmQtZmlsZSB0byBwbGF5LCBvciwgaWYgYSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLCB0aGUKKzxjb2RlPiZsdDtzb3VuZCZndDs8L2NvZGU+IHRhc2sgd2lsbCByYW5kb21seSBzZWxlY3QgYSBmaWxlIHRvIHBsYXkuCitOb3RlOiBBdCB0aGlzIHBvaW50LCB0aGUgcmFuZG9tIHNlbGVjdGlvbiBpcyBiYXNlZCBvbiBhbGwgdGhlIGZpbGVzCitpbiB0aGUgZGlyZWN0b3J5LCBub3QganVzdCB0aG9zZSBlbmRpbmcgaW4gYXBwcm9wcmlhdGUgc3VmZml4ZXMKK2ZvciBzb3VuZC1maWxlcywgc28gYmUgc3VyZSB5b3Ugb25seSBoYXZlIHNvdW5kLWZpbGVzIGluIHRoZSAKK2RpcmVjdG9yeSB5b3Ugc3BlY2lmeS48L3A+Cis8cD5Nb3JlIHByZWNpc2VseSA8Y29kZT4mbHQ7c291bmQmZ3Q7PC9jb2RlPiByZWdpc3RlcnMgYSBob29rIHRoYXQgaXMKK3RyaWdnZXJlZCB3aGVuIHRoZSBidWlsZCBmaW5pc2hlcy4gVGhlcmVmb3JlIHlvdSBoYXZlIHRvIHBsYWNlIHRoaXMKK3Rhc2sgYXMgdG9wIGxldmVsIG9yIGluc2lkZSBhIHRhcmdldCB3aGljaCBpcyBhbHdheXMgZXhlY3V0ZWQuPC9wPgorPHA+CitVbmxlc3MgeW91IGFyZSBydW5uaW5nIG9uIEphdmEgMS4zIG9yIGxhdGVyLCB5b3UgbmVlZCB0aGUgSmF2YSBNZWRpYSBGcmFtZXdvcmsKK29uIHRoZSBjbGFzc3BhdGggKGphdmF4LnNvdW5kKS4gCis8L3A+CisKKworPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+Cis8aDQ+c3VjY2VzczwvaDQ+Cis8cD5TcGVjaWZpZXMgdGhlIHNvdW5kIHRvIGJlIHBsYXllZCBpZiB0aGUgYnVpbGQgc3VjY2VlZGVkLjwvcD4KKzxoND5mYWlsPC9oND4KKzxwPlNwZWNpZmllcyB0aGUgc291bmQgdG8gYmUgcGxheWVkIGlmIHRoZSBidWlsZCBmYWlsZWQuPC9wPgorCis8aDM+TmVzdGVkIEVsZW1lbnQgUGFyYW1ldGVyczwvaDM+Cis8cD4KK1RoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBtYXkgYmUgdXNlZCBvbiB0aGUgPGNvZGU+Jmx0O3N1Y2Nlc3MmZ3Q7PC9jb2RlPiAKK2FuZCA8Y29kZT4mbHQ7ZmFpbCZndDs8L2NvZGU+IGVsZW1lbnRzOjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcGF0aCB0byBhIHNvdW5kLWZpbGUgZGlyZWN0b3J5LCBvciB0aGUgbmFtZSBvZiBhCitzcGVjaWZpYyBzb3VuZC1maWxlLCB0byBiZSBwbGF5ZWQuIElmIHRoaXMgZmlsZSBkb2VzIG5vdCBleGlzdCwgYW4gZXJyb3IgbWVzc2FnZQord2lsbCBiZSBsb2dnZWQuCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxvb3BzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBudW1iZXIgb2YgZXh0cmEgdGltZXMgdG8gcGxheSB0aGUgc291bmQtZmlsZTsKKyAgICAgIGRlZmF1bHQgaXMgPGNvZGU+MDwvY29kZT4uCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZHVyYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGFtb3VudCBvZiB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRvIHBsYXkKKyAgICAgIHRoZSBzb3VuZC1maWxlLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O3RhcmdldCBuYW1lPSZxdW90O2Z1biZxdW90OyBpZj0mcXVvdDtmdW4mcXVvdDsgdW5sZXNzPSZxdW90O2Z1bi5kb25lJnF1b3Q7Jmd0OworICAmbHQ7c291bmQmZ3Q7CisgICAgJmx0O3N1Y2Nlc3Mgc291cmNlPSZxdW90OyR7dXNlci5ob21lfS9zb3VuZHMvYmVsbC53YXYmcXVvdDsvJmd0OworICAgICZsdDtmYWlsIHNvdXJjZT0mcXVvdDske3VzZXIuaG9tZX0vc291bmRzL29obm8ud2F2JnF1b3Q7IGxvb3BzPSZxdW90OzImcXVvdDsvJmd0OworICAmbHQ7L3NvdW5kJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtmdW4uZG9uZSZxdW90OyB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKKyZsdDsvdGFyZ2V0Jmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CitwbGF5cyB0aGUgPGNvZGU+YmVsbC53YXY8L2NvZGU+IHNvdW5kLWZpbGUgaWYgdGhlIGJ1aWxkIHN1Y2NlZWRlZCwgb3IKK3RoZSA8Y29kZT5vaG5vLndhdjwvY29kZT4gc291bmQtZmlsZSBpZiB0aGUgYnVpbGQgZmFpbGVkLCB0aHJlZSB0aW1lcywKK2lmIHRoZSA8Y29kZT5mdW48L2NvZGU+IHByb3BlcnR5IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPi4KK0lmIHRoZSB0YXJnZXQKK2lzIGEgZGVwZW5kZW5jeSBvZiBhbiAmcXVvdDtpbml0aWFsaXphdGlvbiZxdW90OyB0YXJnZXQgdGhhdCBvdGhlcgordGFyZ2V0cyBkZXBlbmQgb24sIHRoZQorPGNvZGU+ZnVuLmRvbmU8L2NvZGU+IHByb3BlcnR5IHByZXZlbnRzIHRoZSB0YXJnZXQgZnJvbSBiZWluZyBleGVjdXRlZAorbW9yZSB0aGFuIG9uY2UuCis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7ZnVuJnF1b3Q7IGlmPSZxdW90O2Z1biZxdW90OyB1bmxlc3M9JnF1b3Q7ZnVuLmRvbmUmcXVvdDsmZ3Q7CisgICZsdDtzb3VuZCZndDsKKyAgICAmbHQ7c3VjY2VzcyBzb3VyY2U9JnF1b3Q7Ly9pbnRyYW5ldC9zb3VuZHMvc3VjY2VzcyZxdW90Oy8mZ3Q7CisgICAgJmx0O2ZhaWwgc291cmNlPSZxdW90Oy8vaW50cmFuZXQvc291bmRzL2ZhaWx1cmUmcXVvdDsvJmd0OworICAmbHQ7L3NvdW5kJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtmdW4uZG9uZSZxdW90OyB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKKyZsdDsvdGFyZ2V0Jmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CityYW5kb21seSBzZWxlY3RzIGEgc291bmQtZmlsZSB0byBwbGF5IHdoZW4gdGhlIGJ1aWxkIHN1Y2NlZWRzIG9yIGZhaWxzLgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NwbGFzaC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zcGxhc2guaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmExMGEzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zcGxhc2guaHRtbApAQCAtMCwwICsxLDExOSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5BbnQgVXNlciBNYW51YWw8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9IlNwbGFzaCI+U3BsYXNoPC9hPjwvaDI+Cis8cD5ieSBMZXMgSHVnaGVzIChsZXNsaWUuaHVnaGVzQHJ1YnVzLmNvbSkKKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5UaGlzIHRhc2sgY3JlYXRlcyBhIHNwbGFzaCBzY3JlZW4uIFRoZSBzcGxhc2ggc2NyZWVuIGlzIGRpc3BsYXllZAorZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYnVpbGQgYW5kIGluY2x1ZGVzIGEgaGFuZHkgcHJvZ3Jlc3MgYmFyIGFzCit3ZWxsLiBVc2UgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc291bmQgdGFzayB0byBwcm92aWRlIGludGVyZXN0Cit3aGlsc3Qgd2FpdGluZyBmb3IgeW91ciBidWlsZHMgdG8gY29tcGxldGUuLi48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+RGVmYXVsdDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbWFnZXVybDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5BIFVSTCBwb2ludGluZyB0byBhbiBpbWFnZSB0byBkaXNwbGF5LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5hbnRsb2dvLmdpZiBmcm9tIHRoZSBjbGFzc3BhdGg8L3RkPgorICA8L3RyPgorIAorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zaG93ZHVyYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5pdGlhbCBwZXJpb2QgdG8gcGF1c2UgdGhlIGJ1aWxkIHRvIHNob3cgdGhlCisgICAgc3BsYXNoIGluIG1pbGxpc2Vjb25kcy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+NTAwMCBtczwvdGQ+CisgIDwvdHI+ICAKKzwvdGFibGU+Cis8aDM+RGVwcmVjYXRlZCBwcm9wZXJ0aWVzPC9oMz4KKyAgCitUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwcm94eSBzZXR0aW5ncyB0byByZXRyaWV2ZQorYW4gaW1hZ2UgZnJvbSBiZWhpbmQgYSBmaXJld2FsbC4gSG93ZXZlciwgdGhlIHNldHRpbmdzIGFwcGx5IG5vdCBqdXN0IHRvIHRoaXMKK3Rhc2ssIGJ1dCB0byBhbGwgZm9sbG93aW5nIHRhc2tzLiBUaGVyZWZvcmUgdGhleSBhcmUgbm93IG1vc3RseSBkZXByZWNhdGVkIGluIAorcHJlZmVyZW5jZSB0byB0aGUgPGNvZGU+Jmx0O3NldHByb3h5Jmd0OzwvY29kZT4gdGFzaywgdGhhdCBtYWtlcyBpdCBjbGVhciB0byByZWFkZXJzIG9mCit0aGUgYnVpbGQgZXhhY3RseSB3aGF0IGlzIGdvaW5nIG9uLiBXZSBzYXkgbW9zdGx5IGFzIHRoaXMgdGFzaydzIHN1cHBvcnQKK2luY2x1ZGVzIHByb3h5IGF1dGhlbnRpY2F0aW9uLCBzbyB5b3UgbWF5IHN0aWxsIG5lZWQgdG8gdXNlIGl0cworcHJveHkgYXR0cmlidXRlcy4KKyAgCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2Vwcm94eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Vc2UgYSBwcm94eSB0byBhY2Nlc3MgaW1ndXJsLiBOb3RlOiBPbmx5IHRlc3RlZAorICAgIG9uIEpESyAxLjIuMiBhbmQgYWJvdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm9uZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3h5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklQIG9yIGhvc3RuYW1lIG9mIHRoZSBwcm94eSBzZXJ2ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm9uZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBvcnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+UHJveHkgcG9ydG51bWJlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Ob25lPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Vc2VyIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGUgcHJveHkgYXMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vbmU8L3RkPgorCisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlByb3h5IHBhc3N3b3JkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vbmU8L3RkPgorICA8L3RyPgorCis8L3RhYmxlPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7c3BsYXNoLyZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPlNwbGFzaCA8Y29kZT5pbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmPC9jb2RlPiBmcm9tIHRoZSBjbGFzc3BhdGguPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtzcGxhc2ggaW1hZ2V1cmw9JnF1b3Q7aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiZxdW90OworICAgICAgICAgICB1c2Vwcm94eT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgIHNob3dkdXJhdGlvbj0mcXVvdDs1MDAwJnF1b3Q7LyZndDsKKworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+U3BsYXNoZXMgdGhlIGpha2FydGEgbG9nbywgZm9yCithbiBpbml0aWFsIHBlcmlvZCBvZiA1IHNlY29uZHMuPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zc2hleGVjLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3NzaGV4ZWMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E5NjBkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zc2hleGVjLmh0bWwKQEAgLTAsMCArMSwxOTIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+U1NIRVhFQyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJzc2hleGVjIj5TU0hFWEVDPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorCis8cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+PC9wPgorCis8cD5SdW5zIGEgY29tbWFuZCBvbiBhIHJlbW90ZSBtYWNoaW5lIHJ1bm5pbmcgU1NIIGRhZW1vbi4KKzwvcD4KKworPHA+PGI+Tm90ZTo8L2I+IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQKK2luIHRoZSBBbnQgZGlzdHJpYnV0aW9uLiAgU2VlIDxhCitocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+Citmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIFRoaXMgdGFzayBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBqc2NoLTAuMS4yOSBhbmQgYWJvdmUKK2FuZCB3b24ndCB3b3JrIHdpdGggdmVyc2lvbnMgb2YganNjaCBlYXJsaWVyIHRoYW4KKzAuMS4yOC48L3A+CisKKzxwPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJzY3AuaHRtbCI+c2NwIHRhc2s8L2E+PC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ob3N0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBob3N0bmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCB0byB3aGljaCB5b3Ugd2lzaCB0byBjb25uZWN0LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2VybmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdXNlcm5hbWUgb24gdGhlIHJlbW90ZSBob3N0IHRvIHdoaWNoIHlvdSBhcmUgY29ubmVjdGluZy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWFuZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tbWFuZCB0byBydW4gb24gdGhlIHJlbW90ZSBob3N0LjwvdGQ+CisgICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5FaXRoZXIgdGhpcyBvciBjb21tYW5kUmVzb3VyY2UgbXVzdCBiZSBzZXQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYW5kUmVzb3VyY2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJlc291cmNlIChmaWxlKSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kcyB0byBydW4gb24gdGhlIHJlbW90ZSBob3N0LgorICAgIFNpbmNlIEFudCAxLjcuMTwvdGQ+CisgICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5FaXRoZXIgdGhpcyBvciBjb21tYW5kIG11c3QgYmUgc2V0PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcG9ydCB0byBjb25uZWN0IHRvIG9uIHRoZSByZW1vdGUgaG9zdC48L3RkPgorICAgIDx0ZCB2YWxpYW49InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIDIyLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRydXN0PC90ZD4KKworICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyB0cnVzdHMgYWxsIHVua25vd24gaG9zdHMgaWYgc2V0IHRvIHllcy90cnVlLjxicj4KKyAgICAgIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPiBJZiB5b3Ugc2V0IHRoaXMgdG8gZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlCisgICAgICBob3N0IHlvdSBjb25uZWN0IHRvIG11c3QgYmUgbGlzdGVkIGluIHlvdXIga25vd25ob3N0cyBmaWxlLCB0aGlzCisgICAgICBhbHNvIGltcGxpZXMgdGhhdCB0aGUgZmlsZSBleGlzdHMuPC90ZD4KKyAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBOby48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5rbm93bmhvc3RzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgc2V0cyB0aGUga25vd24gaG9zdHMgZmlsZSB0byB1c2UgdG8gdmFsaWRhdGUKKyAgICB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlbW90ZSBob3N0LiAgVGhpcyBtdXN0IGJlIGEgU1NIMiBmb3JtYXQgZmlsZS4KKyAgICBTU0gxIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLjwvdGQ+CisgICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8KKyAgICAke3VzZXIuaG9tZX0vLnNzaC9rbm93bl9ob3N0cy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBoYWx0IHRoZSBidWlsZCBpZiB0aGUgY29tbWFuZCBkb2VzIG5vdCBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCisgICAgIDwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQ8L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXNzd29yZC48L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vdCBpZiB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZAorICAgICBhdXRoZW50aWNhdGlvbiBvciB0aGUgcGFzc3dvcmQgaGFzIGJlZW4gZ2l2ZW4gaW4gdGhlIGZpbGUgb3IKKyAgICAgdG9kaXIgYXR0cmlidXRlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmtleWZpbGU8L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiPkxvY2F0aW9uIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIHByaXZhdGUga2V5LjwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCBpZiB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZAorICAgICBhdXRoZW50aWNhdGlvbi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzcGhyYXNlPC90ZD4KKyAgICAgPHRkIHZhbGlnbj0idG9wIj5QYXNzcGhyYXNlIGZvciB5b3VyIHByaXZhdGUga2V5LjwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiBhIGZpbGUgdG8gd2hpY2ggdG8gd3JpdGUgdGhlIG91dHB1dC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hcHBlbmQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBvdXRwdXQgZmlsZSBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXR0ZW4uIERlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgZmlsZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlIAorICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVvdXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgY29tbWFuZCBpZiBpdCBkb2Vzbid0IGZpbmlzaCB3aXRoaW4gdGhlCisgICAgICBzcGVjaWZpZWQgdGltZSAoZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzKS4gRGVmYXVsdHMgdG8gMCB3aGljaCBtZWFucyAmcXVvdDt3YWl0IGZvcmV2ZXImcXVvdDsuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8cD48Yj5SdW4gYSBjb21tYW5kIG9uIGEgcmVtb3RlIG1hY2hpbmUgdXNpbmcgcGFzc3dvcmQgYXV0aGVudGljYXRpb248L2I+PC9wPgorPHByZT4KKyAgJmx0O3NzaGV4ZWMgaG9zdD0mcXVvdDtzb21laG9zdCZxdW90OworCXVzZXJuYW1lPSZxdW90O2R1ZGUmcXVvdDsKKwlwYXNzd29yZD0mcXVvdDt5byZxdW90OworCWNvbW1hbmQ9JnF1b3Q7dG91Y2ggc29tZWZpbGUmcXVvdDsvJmd0OworPC9wcmU+CisKKzxwPjxiPlJ1biBhIGNvbW1hbmQgb24gYSByZW1vdGUgbWFjaGluZSB1c2luZyBrZXkgYXV0aGVudGljYXRpb248L2I+PC9wPgorPHByZT4KKyAgJmx0O3NzaGV4ZWMgaG9zdD0mcXVvdDtzb21laG9zdCZxdW90OworCXVzZXJuYW1lPSZxdW90O2R1ZGUmcXVvdDsKKwlrZXlmaWxlPSZxdW90OyR7dXNlci5ob21lfS8uc3NoL2lkX2RzYSZxdW90OworCXBhc3NwaHJhc2U9JnF1b3Q7eW8gaXRzIGEgc2VjcmV0JnF1b3Q7CisJY29tbWFuZD0mcXVvdDt0b3VjaCBzb21lZmlsZSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKworPHA+PGI+UnVuIGEgY29tbWFuZCBvbiBhIHJlbW90ZSBtYWNoaW5lIHVzaW5nIGtleSBhdXRoZW50aWNhdGlvbiB3aXRoIG5vIHBhc3NwaHJhc2U8L2I+PC9wPgorPHByZT4KKyAgJmx0O3NzaGV4ZWMgaG9zdD0mcXVvdDtzb21laG9zdCZxdW90OworCXVzZXJuYW1lPSZxdW90O2R1ZGUmcXVvdDsKKwlrZXlmaWxlPSZxdW90OyR7dXNlci5ob21lfS8uc3NoL2lkX2RzYSZxdW90OworCWNvbW1hbmQ9JnF1b3Q7dG91Y2ggc29tZWZpbGUmcXVvdDsvJmd0OworPC9wcmU+CisKKzxwPjxiPlJ1biBhIHNldCBvZiBjb21tYW5kcyBmcm9tIGEgY29tbWFuZCByZXNvdXJjZSAoZmlsZSkgb24gYSByZW1vdGUgbWFjaGluZSB1c2luZyBrZXkgYXV0aGVudGljYXRpb24gd2l0aCBubyBwYXNzcGhyYXNlPC9iPjwvcD4KKzxwcmU+CisgICZsdDtzc2hleGVjIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKKwl1c2VybmFtZT0mcXVvdDtkdWRlJnF1b3Q7CisJa2V5ZmlsZT0mcXVvdDske3VzZXIuaG9tZX0vLnNzaC9pZF9kc2EmcXVvdDsKKwljb21tYW5kUmVzb3VyY2U9JnF1b3Q7dG9fcnVuJnF1b3Q7LyZndDsKKzwvcHJlPgorCisKKzxwPjxzdHJvbmc+U2VjdXJpdHkgTm90ZTo8L3N0cm9uZz4gIEhhcmQgY29kaW5nIHBhc3N3b3JkcyBhbmQvb3IgdXNlcm5hbWVzCitpbiBzc2hleGVjIHRhc2sgY2FuIGJlIGEgc2VyaW91cyBzZWN1cml0eSBob2xlLiAgQ29uc2lkZXIgdXNpbmcgdmFyaWFibGUKK3N1YnN0aXR1dGlvbiBhbmQgaW5jbHVkZSB0aGUgcGFzc3dvcmQgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOjxicj4KKzxwcmU+CisgICZsdDtzc2hleGVjIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKKwl1c2VybmFtZT0mcXVvdDske3VzZXJuYW1lfSZxdW90OworCXBhc3N3b3JkPSZxdW90OyR7cGFzc3dvcmR9JnF1b3Q7CisJY29tbWFuZD0mcXVvdDt0b3VjaCBzb21lZmlsZSZxdW90Oy8mZ3Q7Cis8L3ByZT4KK0ludm9rZSBhbnQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZToKKzxwcmU+CisgICAgYW50IC1EdXNlcm5hbWU9bWUgLURwYXNzd29yZD1teXBhc3N3b3JkIHRhcmdldDEgdGFyZ2V0MgorPC9wcmU+Cis8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3N0YXJ0ZWFtLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3N0YXJ0ZWFtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlMzM1OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvc3RhcnRlYW0uaHRtbApAQCAtMCwwICsxLDk5MCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+U3RhclRlYW0gVGFza3M8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+U3RhclRlYW0gU3VwcG9ydDwvaDE+Cis8dWw+CisgIDxsaT48YSBocmVmPSIjc3RjaGVja291dCI+U1RDaGVja291dDwvYT48L2xpPiAKKyAgPGxpPjxhIGhyZWY9IiNzdGNoZWNraW4iPlNUQ2hlY2tpbjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI3N0bGFiZWwiPlNUTGFiZWw8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNzdGxpc3QiPlNUTGlzdDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI3N0YXJ0ZWFtIj48aT5TdGFyVGVhbSAoZGVwcmVjYXRlZCkgPC9pPjwvYT48L2xpPgorPC91bD4KKworPHA+CitUaGUgU3RhclRlYW0gcmV2aXNpb24gY29udHJvbCBzeXN0ZW0gd2FzIHJlY2VudGx5IGFjcXVpcmVkIGJ5IEJvcmxhbmQuCitUaGVzZSB0YXNrcyBtYWtlIHVzZSBvZiBmdW5jdGlvbnMgZnJvbSB0aGUgU3RhclRlYW0gQVBJIHRvIHdvcmsgd2l0aCB0aGF0IHN5c3RlbS4gIAorQXMgYSByZXN1bHQgdGhleSBhcmUgb25seSBhdmFpbGFibGUgdG8gbGljZW5zZWQgdXNlcnMgb2YgU3RhclRlYW0uICBZb3UgbXVzdCBoYXZlCis8Q09ERT5zdGFydGVhbS1zZGsuamFyPC9DT0RFPiBpbiB5b3VyIGNsYXNzcGF0aCB0byBydW4gdGhlc2UgdGFza3MuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgU3RhclRlYW0gQVBJIGFuZCBob3cgdG8gbGljZW5zZSBpdCwgc2VlCit0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5ib3JsYW5kLmNvbS9zdGFydGVhbS8iPkJvcmxhbmQ8L2E+IHdlYiBzaXRlLjwvcD4KKyAgPHA+CisgICAgPGVtPkFsbCB0aGUgU3RhclRlYW0gdGFzayBuYW1lcyBhcmUgaW4gbG93ZXIgY2FzZS48L2VtPgorICA8L3A+Cis8aDM+SW1wb3J0YW50IE5vdGUgb24gSW5zdGFsbGF0aW9uIGFuZCBMaWNlbnNpbmc6PC9oMz4KKzxwPgorPGI+T24gV2luZG93cyBtYWNoaW5lcywgdGhlIG1lcmUgcHJlc2VuY2Ugb2YgPENPREU+c3RhcnRlYW0tc2RrLmphcjwvQ09ERT4gb24gdGhlIGNsYXNzcGF0aCAKK2lzIG5vdCBzdWZmaWNpZW50IGZvciBnZXR0aW5nIHRoZXNlIHRhc2tzIHRvIHdvcmsgcHJvcGVybHkuPC9iPiAgVGhlc2UgdGFza3MgYWxzbyByZXF1aXJlIGEgCitmdWxseS1pbnN0YWxsZWQgYW5kIGZ1bGx5LWxpY2Vuc2VkIHZlcnNpb24gb2YgdGhlIFN0YXJHYXRlIFJ1bnRpbWUuICBUaGlzIGlzIHBhcnQgCitvZiBhIFN0YXJUZWFtIGNsaWVudCBpbnN0YWxsYXRpb24gb3IgbWF5IGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5LiAgVGhlIGZ1bGwgY2xpZW50CitpbnN0YWxsIGlzIG5vdCByZXF1aXJlZC4gIEluIHBhcnRpY3VsYXIsIHRoZSBXaW5kb3dzIHBhdGggbXVzdCBpbmNsdWRlIHRoZSBkaXJlY3Rvcnkgd2hlcmUgCit0aGUgU3RhckdhdGUgUnVudGltZSA8Q09ERT4uZGxsPC9DT0RFPiBmaWxlcyBhcmUgaW5zdGFsbGVkLgorPC9wPjxwPgorRWFybGllciB2ZXJzaW9ucyBvZiBBbnQgKHByaW9yIHRvIDEuNS4yKSBkaWQgbm90IGhhdmUgdGhpcyByZXN0cmljdGlvbiBiZWNhdXNlIHRoZXkKK3dlcmUgbm90IGFzIGRlcGVuZGVudCBvbiB0aGUgU3RhclRlYW0gcnVudGltZSAtIHdoaWNoIHRoZSBuZXdlciB2ZXJzaW9ucyB1c2UgdG8gYWNjZXNzCitTdGFyVGVhbSBmaWxlIHN0YXR1cyBpbmZvcm1hdGlvbi4gIFRoZSBvbGRlciB2ZXJzaW9ucyBsYWNrZWQgdGhpcyBpbXBvcnRhbnQgY2FwYWJpbGl0eS4KKzwvcD4KKzxocj48L2hyPgorCis8YSBuYW1lPSJjb21tb24tcGFyYW1zIj4KKzxoMj5Db21tb24gUGFyYW1ldGVycyBmb3IgQWxsIFN0YXJ0ZWFtIFRhc2tzPC9oMj48L2E+Cis8cD4KK1RoZSBmb2xsb3dpbmcgcGFyYW1ldGVycywgaGF2aW5nIHRvIGRvIHdpdGggbWFraW5nIHRoZSBjb25uZWN0aW9uIHRvIGEgU3RhclRlYW0gcHJvamVjdCwgYXJlIGNvbW1vbiB0byBhbGwgdGhlIGZvbGxvd2luZyB0YXNrcyBleGNlcHQgdGhlIGRlcHJlY2F0ZWQgPGk+U3RhclRlYW08L2k+IHRhc2suCis8L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXJuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1c2VybmFtZSBvZiB0aGUgYWNjb3VudCB1c2VkIHRvIGxvZyBpbiB0byB0aGUgU3RhclRlYW0gc2VydmVyLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj55ZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcGFzc3dvcmQgb2YgdGhlIGFjY291bnQgdXNlZCB0byBsb2cgaW4gdG8gdGhlIFN0YXJUZWFtIHNlcnZlci48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+eWVzPC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5VUkw8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QSBzdHJpbmcgb2YgdGhlIGZvcm0gPGNvZGU+c2VydmVybmFtZTpwb3J0bnVtL3Byb2plY3QvdmlldzwvY29kZT4gCit3aGljaCBlbmFibGVzIHVzZXIgdG8gc2V0IGFsbCBvZiB0aGVzZSBlbGVtZW50cyBpbiBvbmUgc3RyaW5nLiA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249ImNlbnRlciI+IEVpdGhlciB0aGlzIC4uLjwvdGQ+CisgIDwvdHI+ICAKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2VydmVybmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgU3RhclRlYW0gc2VydmVyLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0iY2VudGVyIiByb3dzcGFuID0gIjQiPi4uLiBvciA8Yj5hbGwgZm91cjwvYj4gb2YgdGhlc2UgbXVzdCBiZSBkZWZpbmVkLjwvdGQ+ICAKKyAgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNlcnZlcnBvcnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBTdGFyVGVhbSBzZXJ2ZXIuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvamVjdG5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIFN0YXJUZWFtIHByb2plY3Qgb24gd2hpY2ggdG8gb3BlcmF0ZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52aWV3bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgdmlldyBpbiB0aGUgU3RhclRlYW0gcHJvamVjdCBvbiB3aGljaCB0byBvcGVyYXRlLjwvdGQ+CisgIDwvdHI+CisKKworPC90YWJsZT4KKworPGhyPjwvaHI+CisKKzxhIG5hbWU9InN0Y2hlY2tvdXQiPgorPGgyPlNUQ2hlY2tvdXQ8L2gyPjwvYT4KKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworQ2hlY2tzIG91dCBmaWxlcyBmcm9tIGEgU3RhclRlYW0gcHJvamVjdC4KKworPHA+CitUaGUgPGk+aW5jbHVkZXM8L2k+IGFuZCA8aT5leGNsdWRlczwvaT4gYXR0cmlidXRlcyBmdW5jdGlvbiBkaWZmZXJlbnRseSBmcm9tCitvdGhlciB0YXNrcyBpbiBBbnQuIEluY2x1c2lvbi9leGNsdXNpb24gYnkgZm9sZGVyIGlzIE5PVCBzdXBwb3J0ZWQuCis8L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KK1NlZSBhbHNvIDxBIGhyZWY9IiNjb21tb24tcGFyYW1zIj50aGUgcmVxdWlyZWQgY29tbW9uIFN0YXJUZWFtIHBhcmFtZXRlcnM8L0E+Ljxicj48L2JyPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yb290c3RhcnRlYW1mb2xkZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJvb3Qgb2YgdGhlIHN1YnRyZWUgaW4gdGhlIFN0YXJUZWFtIHJlcG9zaXRvcnkgZnJvbSB3aGljaCB0byAKKyAgICBjaGVjayBvdXQgZmlsZXMuICBEZWZhdWx0cyB0byB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIHZpZXcgKCcvJykuIAorICAgICAgPGI+PGk+SWYgc3VwcGxpZWQsIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBhbiAiYWJzb2x1dGUiIHBhdGgsIHRoYXQgaXMsIGl0IHNob3VsZCBiZWdpbiB3aXRoIGEgJy8nLiAgCisgICAgICBSZWxhdGl2ZSBwYXRocyBoYXZlIGxpdHRsZSBtZWFuaW5nIGluIHRoaXMgY29udGV4dCBhbmQgY29uZnVzZSBTdGFyVGVhbS48L2k+PC9iPgorICAgICAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4gIAorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yb290bG9jYWxmb2xkZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGxvY2FsIGZvbGRlciB3aGljaCB3aWxsIGJlIHRoZSByb290IG9mIHRoZSB0cmVlIHRvIHdoaWNoIGZpbGVzIGFyZSBjaGVja2VkIG91dC4gIElmIHRoaXMgaXMgbm90IHN1cHBsaWVkLCB0aGVuIHRoZSBTdGFyVGVhbSAiZGVmYXVsdCBmb2xkZXIiIGFzc29jaWF0ZWQgd2l0aCA8aT5yb290c3RhcnRlYW1mb2xkZXI8L2k+IGlzIHVzZWQuCisgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPiAgCisgIAorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jcmVhdGV3b3JraW5nZGlyczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jcmVhdGVzIGxvY2FsIGZvbGRlcnMgZXZlbiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIFN0YXJUZWFtIGZvbGRlciBpcyBlbXB0eS4gIERlZmF1bHRzIHRvICJ0cnVlIi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZWxldGV1bmNvbnRyb2xsZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWYgdHJ1ZSwgYW55IGZpbGVzIE5PVCBpbiBTdGFyVGVhbSB3aWxsIGJlIGRlbGV0ZWQuICBEZWZhdWx0cyB0byAidHJ1ZSIuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IGNoZWNrIG91dCBmaWxlcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGF0dGVybnMgaW4gdGhpcyBsaXN0LiAgUGF0dGVybnMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgPGk+Y29tbWFzPC9pPi4gIFBhdHRlcm5zIGluIDxpPmV4Y2x1ZGVzPC9pPiB0YWtlIHByZWNlZGVuY2Ugb3ZlciBwYXR0ZXJucyBpbiA8aT5pbmNsdWRlczwvaT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RG8gbm90IGNoZWNrIG91dCBmaWxlcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGF0dGVybnMgaW4gdGhpcyBsaXN0LiAgUGF0dGVybnMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgIDxpPmNvbW1hczwvaT4uICBQYXR0ZXJucyBpbiA8aT5leGNsdWRlczwvaT4gdGFrZSBwcmVjZWRlbmNlIG92ZXIgcGF0dGVybnMgaW4gPGk+aW5jbHVkZXM8L2k+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxhYmVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkNoZWNrIG91dCBmaWxlcyBhcyBvZiB0aGlzIGxhYmVsLiAgVGhlIGxhYmVsIG11c3QgZXhpc3QgaW4gc3RhcnRlYW0gb3IgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5FaXRoZXIgb3IgbmVpdGhlciwgYnV0IG5vdCBib3RoLCBtYXkgYmUgc3BlY2lmaWVkLiAgTmVpdGhlciA8Y29kZT5sb2NrZWQ8L2NvZGU+IG9yIDxjb2RlPnVubG9ja2VkPC9jb2RlPiBtYXkgYmUgdHJ1ZSBpZiBlaXRoZXIgPGNvZGU+bGFiZWw8L2NvZGU+IG9yIDxjb2RlPmFzb2ZkYXRlPC9jb2RlPiBpcyBzcGVjaWZpZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YXNvZmRhdGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q2hlY2sgb3V0IGZpbGVzIGFzIG9mIHRoaXMgZGF0ZS4gIFRoZSBkYXRlIG11c3QKKyAgICBiZSBmb3JtYXR0ZWQgaW4gSVNPODYwMSBkYXRldGltZQorICAgICg8Y29kZT55eXl5LU1NLWRkJ1QnSEg6bW06c3M8L2NvZGU+KSwgSVNPODYwMQorICAgIGRhdGUoPGNvZGU+eXl5eS1NTS1kZDwvY29kZT4pIG9yIGEgdXNlci1kZWZpbmVkIFNpbXBsZURhdGVGb3JtYXQKKyAgICBkZWZpbmVkIGluIHRoZSA8Y29kZT5hc29mRGF0ZUZvcm1hdDwvY29kZT4gYXR0cmlidXRlLiAgSWYgdGhlIGRhdGUKKyAgICBpcyBub3QgcGFyc2FibGUgYnkgdGhlIGRlZmF1bHQgb3Igc2VsZWN0ZWQgZm9ybWF0LCBhbiBleGNlcHRpb24KKyAgICB3aWxsIGJlIHRocm93bi4gIDxlbT5TaW5jZSBBbnQgMS42LjwvZW0+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YXNvZmRhdGVmb3JtYXQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+amF2YS51dGlsLlNpbXBsZURhdGVGb3JtYXQgY29tcGF0aWJsZSBzdHJpbmcgdXNlZAorICAgIHRvIHBhcnNlIHRoZSA8Y29kZT5hc29mZGF0ZTwvY29kZT4gYXR0cmlidXRlLiAgPGVtPlNpbmNlIEFudAorICAgIDEuNi48L2VtPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlY3Vyc2l2ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgaWYgc3ViZm9sZGVycyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGZpbGVzIHRvIGNoZWNrIG91dC4gIERlZmF1bHRzIHRvICJ0cnVlIi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgdHJ1ZSwgY2hlY2tvdXRzIHdpbGwgb2NjdXIgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzIAordGhhdCBTdGFyVGVhbSBpcyBtYWludGFpbmluZyBmb3IgdGhlIGZpbGUuICAgSWYgZmFsc2UsIHN0YXR1cyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGZpbGVzIHRvIGNoZWNrIG91dC4gRGVmYXVsdHMgdG8gImZhbHNlIi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPiAKKyA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2NrZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgdHJ1ZSwgZmlsZSB3aWxsIGJlIGxvY2tlZCBhZ2FpbnN0IGNoYW5nZXMgYnkgb3RoZXIgCit1c2Vycy4gIElmIGZhbHNlIChkZWZhdWx0KSBoYXMgbm8gZWZmZWN0LiAKKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkVpdGhlciBvciBuZWl0aGVyLCBidXQgbm90IGJvdGgsIG1heSBiZSB0cnVlLiBOZWl0aGVyIG1heSBiZSB0cnVlIGlmIGEgPGNvZGU+bGFiZWw8L2NvZGU+IG9yIGFuIDxjb2RlPmFzb2ZkYXRlPC9jb2RlPiBpcyBzcGVjaWZpZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dW5sb2NrZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgdHJ1ZSwgZmlsZSB3aWxsIGJlIHVubG9ja2VkIHNvIHRoYXQgb3RoZXIgdXNlcnMgbWF5CitjaGFuZ2UgaXQuICBUaGlzIGlzIGEgd2F5IHRvIHJldmVyc2UgY2hhbmdlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNoZWNrZWQgaW4uCitJZiBmYWxzZSAoZGVmYXVsdCkgaGFzIG5vIGVmZmVjdC48L3RkPiAKKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcmVwb3NpdG9yeXRpbWVzdGFtcDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50cnVlIG1lYW5zIGNoZWNrZWQgb3V0IGZpbGVzIHdpbGwgZ2V0IHRoZSByZXBvc2l0b3J5IHRpbWVzdGFtcC4KK2ZhbHNlKGRlZmF1bHQpIG1lYW5zIHRoZSBjaGVja2VkIG91dCBmaWxlcyB3aWxsIGJlIHRpbWVzdGFtcGVkIGF0IHRoZSB0aW1lCitvZiBjaGVja291dC48L3RkPiAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKworICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcmVsb2FkZmlsZWluZm9ybWF0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBTdGFyVGVhbSBzZXJ2ZXIgaGFzIHRoZSBhYmlsaXR5IHRvIHByZWxvYWQgZmlsZSBtZXRhZGF0YSBmb3IgYW4KKyAgICBlbnRpcmUgdHJlZSBwcmlvciB0byBiZWdpbm5pbmcgYWN0aW9uIG9uIHRoYXQgdHJlZS4gIERvaW5nIHNvIGNhbiBpbiBzb21lIGluc3RhbmNlcyAKKyAgICBsZWFkIHRvIHN1YnN0YW50aWFsbHkgZmFzdGVyIGFjdGlvbnMsIHBhcnRpY3VsYXJseSBvdmVyIGxhcmdlIHRyZWVzLiAgU2V0dGluZyB0aGlzIAorICAgIHRvICJ5ZXMiIChkZWZhdWx0KSBlbmdhZ2VzIHRoaXMgZnVuY3Rpb25hbGl0eSwgc2V0dGluZyBpdCB0byAibm8iIHR1cm5zIGl0IG9mZi48L3RkPiAgICAKKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKyAgICAKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y29udmVydEVPTDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JZiB0cnVlLCAoZGVmYXVsdCkgYWxsIGFzY2lpIGZpbGVzIHdpbGwgaGF2ZSB0aGVpciBlbmQtb2YtbGluZSAKKyAgICBjaGFyYWN0ZXJzIGFkanVzdGVkIHRvIHRoYXQgb2YgdGhlIGxvY2FsIG1hY2hpbmUgb24gY2hlY2tvdXQuICBUaGlzIGlzIG5vcm1hbGx5CisgICAgd2hhdCB5b3UnZCB3YW50IGJ1dCBpZiBmb3Igc29tZSByZWFzb24geW91IGRvbid0IHdhbnQgdGhhdCB0byBoYXBwZW4sIHNldCBpdCB0byBmYWxzZQorICAgIGFuZCB0aGUgZmlsZXMgd2lsbCBiZSBjaGVja2VkIG91dCB3aXRoIHdoYXRldmVyIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgYXJlIHVzZWQgb24KKyAgICB0aGUgc2VydmVyLiA8L3RkPiAgICAKKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKworPHByZT4KKyAgJmx0O3N0Y2hlY2tvdXQgc2VydmVybmFtZT0iU1RBUlRFQU0iIAorICAgICAgICAgICAgICBzZXJ2ZXJwb3J0PSI0OTIwMSIKKyAgICAgICAgICAgICAgcHJvamVjdG5hbWU9IkFQcm9qZWN0IiAKKyAgICAgICAgICAgICAgdmlld25hbWU9IkFWaWV3IgorICAgICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgICAgICAgICAgICAgIHJvb3Rsb2NhbGZvbGRlcj0iQzpcZGV2XGJ1aWxkdGVzdFxjbyIKKyAgICAgICAgICAgICAgZm9yY2VkPSJ0cnVlIgorICAvJmd0OworPC9wcmU+CisKK1RoZSBtaW5pbXVtIG5lY2Vzc2FyeSB0byBjaGVjayBvdXQgZmlsZXMgb3V0IGZyb20gYSBTdGFyVGVhbSBzZXJ2ZXIuICBUaGlzIHdpbGwKK2NoZWNrIG91dCBhbGwgZmlsZXMgaW4gdGhlIDxpPkFWaWV3PC9pPiB2aWV3IG9mIHRoZSA8aT5BUHJvamVjdDwvaT4gcHJvamVjdCB0bworPGNvZGU+QzpcZGV2XGJ1aWxkdGVzdFxjbzwvY29kZT4uICBFbXB0eSBmb2xkZXJzIGluIFN0YXJUZWFtIHdpbGwgaGF2ZSBsb2NhbCBmb2xkZXJzIAorY3JlYXRlZCBmb3IgdGhlbSBhbmQgYW55IG5vbi1TdGFyVGVhbSBmaWxlcyBmb3VuZCBpbiB0aGUgdHJlZSB3aWxsIGJlIGRlbGV0ZWQuCisKKzxwcmU+CisgICZsdDtzdGNoZWNrb3V0IFVSTD0iU1RBUlRFQU06NDkyMDEvQXByb2plY3QvQVZpZXciIAorICAgICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgICAgICAgICAgICAgIHJvb3Rsb2NhbGZvbGRlcj0iQzpcZGV2XGJ1aWxkdGVzdFxjbyIKKyAgICAgICAgICAgICAgZm9yY2VkPSJ0cnVlIgorICAvJmd0OworPC9wcmU+CitBbmQgdGhpcyBpcyBhIHNpbXBsZXIgd2F5IG9mIGFjY29tcGxpc2hpbmcgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUsIHVzaW5nIHRoZSBVUkwgYXR0cmlidXRlLgorPGJyPjwvYnI+Cis8cHJlPgorICAmbHQ7c3RjaGVja291dCBVUkw9IlNUQVJURUFNOjQ5MjAxL0Fwcm9qZWN0L0FWaWV3IiAKKyAgICAgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgICAgICBwYXNzd29yZD0ic2VjcmV0IgorICAgICAgICAgICAgICByb290bG9jYWxmb2xkZXI9IkM6XGRldlxidWlsZHRlc3RcY28iCisgICAgICAgICAgICAgIHJvb3RzdGFydGVhbWZvbGRlcj0iXERldiIKKyAgICAgICAgICAgICAgZXhjbHVkZXM9IiouYmFrICoub2xkIgorICAgICAgICAgICAgICBsYWJlbD0idjIuNi4wMDEiCisgICAgICAgICAgICAgIGZvcmNlZD0idHJ1ZSIKKyAgLyZndDsKKzwvcHJlPgorCitUaGlzIHdpbGwgY2hlY2sgb3V0IGFsbCBmaWxlcyBmcm9tIHRoZSA8aT5EZXY8L2k+IGZvbGRlciBhbmQgYmVsb3cgdGhhdCBkbyBub3QKK2VuZCBpbiA8aT4uYmFrPC9pPiBvciA8aT4ub2xkPC9pPiB3aXRoIHRoZSBsYWJlbCA8aT52Mi42LjAwMTwvaT4uICAKKworPHByZT4KKyAgJmx0O3N0Y2hlY2tvdXQgVVJMPSJTVEFSVEVBTTo0OTIwMS9BcHJvamVjdC9BVmlldyIKKyAgICAgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgICAgICBwYXNzd29yZD0ic2VjcmV0IgorICAgICAgICAgICAgICByb290bG9jYWxmb2xkZXI9IkM6XGRldlxidWlsZHRlc3RcY28iCisgICAgICAgICAgICAgIGluY2x1ZGVzPSIqLmh0bSwqLmh0bWwiCisgICAgICAgICAgICAgIGV4Y2x1ZGVzPSJpbmRleC4qIgorICAgICAgICAgICAgICBmb3JjZWQ9InRydWUiCisgIC8mZ3Q7Cis8L3ByZT4KKworICAgICAKK1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBvdmVybGFwcGluZyA8aT5pbmNsdWRlczwvaT4gYW5kIDxpPmV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGVzLiAgQmVjYXVzZQorPGk+ZXhjbHVkZXM8L2k+IHRha2VzIHByZWNlZGVuY2Ugb3ZlciA8aT5pbmNsdWRlczwvaT4sIGZpbGVzIG5hbWVkIDxjb2RlPmluZGV4Lmh0bWw8L2NvZGU+IHdpbGwKK25vdCBiZSBjaGVja2VkIG91dCBieSB0aGlzIGNvbW1hbmQuCisKKzxwcmU+CisgICZsdDtzdGNoZWNrb3V0IFVSTD0iU1RBUlRFQU06NDkyMDEvQXByb2plY3QvQVZpZXciCisgICAgICAgICAgICAgIHVzZXJuYW1lPSJhdXNlciIKKyAgICAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgICAgcm9vdGxvY2FsZm9sZGVyPSJDOlxkZXZcYnVpbGR0ZXN0XGNvIgorICAgICAgICAgICAgICBpbmNsdWRlcz0iKi5odG0sKi5odG1sIgorICAgICAgICAgICAgICBleGNsdWRlcz0iaW5kZXguKiIKKyAgICAgICAgICAgICAgZm9yY2VkPSJ0cnVlIgorICAgICAgICAgICAgICByZWN1cnNpdmU9ImZhbHNlIgorICAvJmd0OworPC9wcmU+CitUaGlzIGV4YW1wbGUgaXMgbGlrZSB0aGUgcHJldmlvdXMgb25lLCBidXQgd2lsbCBvbmx5IGNoZWNrIG91dCBmaWxlcyBpbiAKK0M6XGRldlxidWlsZHRlc3RcY28sIGJlY2F1c2Ugb2YgdGhlIHR1cm5pbmcgb2ZmIG9mIHRoZSByZWN1cnNpdmUgYXR0cmlidXRlLgorCis8cHJlPgorICAmbHQ7c3RjaGVja291dCBVUkw9IlNUQVJURUFNOjQ5MjAxL0Fwcm9qZWN0L0FWaWV3IgorICAgICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgICAgICAgICAgICAgIHJvb3RzdGFydGVhbWZvbGRlcj0ic3JjL2phdmEiCisgICAgICAgICAgICAgIHJvb3Rsb2NhbGZvbGRlcj0iQzpcZGV2XGJ1aWxkdGVzdFxjbyIKKyAgICAgICAgICAgICAgZm9yY2VkPSJ0cnVlIgorICAvJmd0OworPC9wcmU+Cis8YnI+PC9icj4KKzxwcmU+CisgICZsdDtzdGNoZWNrb3V0IFVSTD0iU1RBUlRFQU06NDkyMDEvQXByb2plY3QvQVZpZXciCisgICAgICAgICAgICAgIHVzZXJuYW1lPSJhdXNlciIKKyAgICAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgICAgcm9vdHN0YXJ0ZWFtZm9sZGVyPSJzcmMvamF2YSIKKyAgLyZndDsKKzwvcHJlPgorPGJyPjwvYnI+Cis8cHJlPgorICZsdDtzdGNoZWNrb3V0IFVSTD0iU1RBUlRFQU06NDkyMDEvQXByb2plY3QvQVZpZXciCisgICAgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgICAgICAgICAgICAgcm9vdHN0YXJ0ZWFtZm9sZGVyPSJzcmMvamF2YSIKKyAgICAgICAgICAgICByb290bG9jYWxmb2xkZXI9IkM6XGRldlxidWlsZHRlc3RcY29cc3JjXGphdmEiCisgICAgICAgICAgICAgZm9yY2VkPSJ0cnVlIgorICAvJmd0OworPC9wcmU+CisKK0luIHRoZSBwcmVjZWRpbmcgdGhyZWUgZXhhbXBsZXMsIGFzc3VtaW5nIHRoYXQgdGhlIEFQcm9qZWN0IHByb2plY3QgaGFzIGEgZGVmYXVsdCBmb2xkZXIgb2YKKyJDOlx3b3JrXEFQcm9qZWN0IiwgdGhlIGZpcnN0IGV4YW1wbGUgd2lsbCBjaGVjayBvdXQgdGhlIHRyZWUgb2YgZmlsZXMgcm9vdGVkIGluIHRoZSBzcmMvamF2YSBmb2xkZXIgb2YgdGhlIEFWaWV3IHZpZXcgb2YgdGhlIEFQcm9qZWN0IGluIHRoZSBTdGFyVGVhbSByZXBvc2l0b3J5IHRvIGEgbG9jYWwgdHJlZSByb290ZWQgYXQgQzpcZGV2XGJ1aWxkdGVzdFxjbywgCit0aGUgc2Vjb25kIHRvIGEgdHJlZSByb290ZWQgYXQgQzpcd29ya1xBUHJvamVjdFxzcmNcamF2YSAoc2luY2Ugbm8gPGk+cm9vdGxvY2FsZm9sZGVyPC9pPiBpcyBzcGVjaWZpZWQpIGFuZCB0aGUgdGhpcmQgdG8gYSB0cmVlIHJvb3RlZCBhdCBDOlxkZXZcYnVpbGR0ZXN0XGNvXHNyY1xqYXZhLiAgTm90ZSBhbHNvLCB0aGF0IHNpbmNlIHRoZSBzZWNvbmQgZXhhbXBsZSBkb2VzIG5vdCBzZXQgImZvcmNlZCIgdHJ1ZSwgb25seSB0aG9zZSBmaWxlcyB3aGljaCB0aGUgcmVwb3NpdG9yeSBjb25zaWRlcnMgb3V0LW9mLWRhdGUgd2lsbCBiZSBjaGVja2VkIG91dC4KKzxocj48L2hyPgorCis8YSBuYW1lPSJzdGNoZWNraW4iPgorPGgyPlNUQ2hlY2tpbjwvaDI+PC9hPgorCis8aDM+RGVzY3JpcHRpb248L2gzPgorCitDaGVja3MgZmlsZXMgaW50byBhIFN0YXJUZWFtIHByb2plY3QuICBPcHRpb25hbGx5IGFkZHMgZmlsZXMgYW5kIGluIHRoZSBsb2NhbCB0cmVlIHRoYXQgYXJlIG5vdCBtYW5hZ2VkIGJ5IHRoZSByZXBvc2l0b3J5IHRvIGl0cyBjb250cm9sLgorCis8cD4KK1RoZSA8aT5pbmNsdWRlczwvaT4gYW5kIDxpPmV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGVzIGZ1bmN0aW9uIGRpZmZlcmVudGx5IGZyb20KK290aGVyIHRhc2tzIGluIEFudC4gSW5jbHVzaW9uL2V4Y2x1c2lvbiBieSBmb2xkZXIgaXMgTk9UIHN1cHBvcnRlZC4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorU2VlIGFsc28gPEEgaHJlZj0iI2NvbW1vbi1wYXJhbXMiPnRoZSByZXF1aXJlZCBjb21tb24gU3RhclRlYW0gcGFyYW1ldGVyczwvQT4uPGJyPjwvYnI+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yb290c3RhcnRlYW1mb2xkZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJvb3Qgb2YgdGhlIHN1YnRyZWUgaW4gdGhlIFN0YXJUZWFtIHJlcG9zaXRvcnkgaW50byB3aGljaCB0byAKKyAgICBmaWxlcyB3aWxsIGJlIGNoZWNrZWQuICBEZWZhdWx0cyB0byB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIHZpZXcgKCcvJykuCisgICAgICAgPGI+PGk+SWYgc3VwcGxpZWQsIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBhbiAiYWJzb2x1dGUiIHBhdGgsIHRoYXQgaXMsIGl0IHNob3VsZCBiZWdpbiB3aXRoIGEgJy8nLiAgCisgICAgICBSZWxhdGl2ZSBwYXRocyBoYXZlIGxpdHRsZSBtZWFuaW5nIGluIHRoaXMgY29udGV4dCBhbmQgY29uZnVzZSBTdGFyVGVhbS48L2k+PC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDwvdHI+ICAKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cm9vdGxvY2FsZm9sZGVyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhbCBmb2xkZXIgd2hpY2ggd2lsbCBiZSB0aGUgcm9vdCBvZiB0aGUgdHJlZSB0byB3aGljaCBmaWxlcyBhcmUgY2hlY2tlZCBvdXQuICBJZiB0aGlzIGlzIG5vdCBzdXBwbGllZCwgdGhlbiB0aGUgU3RhclRlYW0gImRlZmF1bHQgZm9sZGVyIiBhc3NvY2lhdGVkIHdpdGggPGk+cm9vdHN0YXJ0ZWFtZm9sZGVyPC9pPiBpcyB1c2VkLiA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPiAgCisgIAorCisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1lbnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Q2hlY2tpbiBjb21tZW50IHRvIGJlIHNhdmVkIHdpdGggdGhlIGZpbGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hZGR1bmNvbnRyb2xsZWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aWYgdHJ1ZSwgYW55IGZpbGVzIG9yIGZvbGRlcnMgTk9UIGluIFN0YXJUZWFtIHdpbGwgYmUgCithZGRlZCB0byB0aGUgcmVwb3NpdG9yeS4gIERlZmF1bHRzIHRvICJmYWxzZSIuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IGNoZWNrIGluIGZpbGVzIHRoYXQgbWF0Y2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBwYXR0ZXJucyBpbiB0aGlzIGxpc3QuICBQYXR0ZXJucyBtdXN0IGJlIHNlcGFyYXRlZCBieSA8aT5jb21tYXM8L2k+LiAgUGF0dGVybnMgaW4gPGk+ZXhjbHVkZXM8L2k+IHRha2UgcHJlY2VkZW5jZSBvdmVyIHBhdHRlcm5zIGluIDxpPmluY2x1ZGVzPC9pPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgY2hlY2sgaW4gZmlsZXMgdGhhdCBtYXRjaCBhdCBsZWFzdCBvbmUgb2YgdGhlIHBhdHRlcm5zIGluIHRoaXMgbGlzdC4gIFBhdHRlcm5zIG11c3QgYmUgc2VwYXJhdGVkIGJ5ICA8aT5jb21tYXM8L2k+LiAgUGF0dGVybnMgaW4gPGk+ZXhjbHVkZXM8L2k+IHRha2UgcHJlY2VkZW5jZSBvdmVyIHBhdHRlcm5zIGluIDxpPmluY2x1ZGVzPC9pPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZWN1cnNpdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIGlmIHN1YmZvbGRlcnMgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBmaWxlcyB0byBjaGVjayBpbi4gIERlZmF1bHRzIHRvICJmYWxzZSIuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yY2VkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHRydWUsIGNoZWNraW5zIHdpbGwgb2NjdXIgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzIAordGhhdCBTdGFyVGVhbSBpcyBtYWludGFpbmluZyBmb3IgdGhlIGZpbGUuICBJZiBmYWxzZSwgY2hlY2tpbnMgd2lsbCB1c2UgdGhpcyBzdGF0dXMgdG8gZGVjaWRlIHdoaWNoIGZpbGVzIHRvIHVwZGF0ZS4gIERlZmF1bHRzIHRvICJmYWxzZSIuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVubG9ja2VkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHRydWUsIGZpbGUgd2lsbCBiZSB1bmxvY2tlZCBzbyB0aGF0IG90aGVyIHVzZXJzIG1heQorY2hhbmdlIGl0LiAgSWYgZmFsc2UgKGRlZmF1bHQpIGxvY2sgc3RhdHVzIHdpbGwgbm90IGNoYW5nZS4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4gCisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnByZWxvYWRmaWxlaW5mb3JtYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIFN0YXJUZWFtIHNlcnZlciBoYXMgdGhlIGFiaWxpdHkgdG8gcHJlbG9hZCBmaWxlIG1ldGFkYXRhIGZvciBhbgorICAgIGVudGlyZSB0cmVlIHByaW9yIHRvIGJlZ2lubmluZyBhY3Rpb24gb24gdGhhdCB0cmVlLiAgRG9pbmcgc28gY2FuIGluIHNvbWUgaW5zdGFuY2VzIAorICAgIGxlYWQgdG8gc3Vic3RhbnRpYWxseSBmYXN0ZXIgYWN0aW9ucywgcGFydGljdWxhcmx5IG92ZXIgbGFyZ2UgdHJlZXMuICBTZXR0aW5nIHRoaXMgCisgICAgdG8gInllcyIgKGRlZmF1bHQpIGVuZ2FnZXMgdGhpcyBmdW5jdGlvbmFsaXR5LCBzZXR0aW5nIGl0IHRvICJubyIgdHVybnMgaXQgb2ZmLjwvdGQ+ICAgIAorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorCis8cHJlPgorICAmbHQ7c3RjaGVja2luIHNlcnZlcm5hbWU9IlNUQVJURUFNIiAKKyAgICAgICAgICAgICBzZXJ2ZXJwb3J0PSI0OTIwMSIKKyAgICAgICAgICAgICBwcm9qZWN0bmFtZT0iQVByb2plY3QiIAorICAgICAgICAgICAgIHZpZXduYW1lPSJBVmlldyIKKyAgICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgICByb290bG9jYWxmb2xkZXI9IkM6XGRldlxidWlsZHRlc3RcY28iCisgICAgICAgICAgICAgZm9yY2VkPSJ0cnVlIgorICAvJmd0OworPC9wcmU+CisKK1RoZSBtaW5pbXVtIG5lY2Vzc2FyeSB0byBjaGVjayBmaWxlcyBpbnRvIGEgU3RhclRlYW0gc2VydmVyLiAgVGhpcyB3aWxsCitjaGVjayBhbGwgZmlsZXMgb24gdGhlIGxvY2FsIHRyZWUgcm9vdGVkIGF0IDxjb2RlPkM6XGRldlxidWlsZHRlc3RcY288L2NvZGU+CitpbnRvIHRoZSA8aT5BVmlldzwvaT4gdmlldyBvZiB0aGUgPGk+QVByb2plY3Q8L2k+IHByb2plY3QgaW4gdGhlIHJlcG9zaXRvcnkuCitGb3IgZmlsZXMgYW5kIGZvbGRlcnMgaW4gdGhlIGxvY2FsIHRyZWUgYnV0IG5vdCBpbiBzdGFydGVhbSwgbm90aGluZyB3aWxsIGJlIGRvbmUuICBTaW5jZSB0aGUgPGk+Zm9yY2VkPC9pPiBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgZmlsZXMgd2hpY2ggYXJlIGNoZWNrZWQgaW4gd2lsbCBiZSBjaGVja2VkIGluIHdpdGhvdXQgcmVnYXJkIHRvIHdoYXQgdGhlIFN0YXJUZWFtIHJlcG9zaXRvcnkgY29uc2lkZXJzIHRoZWlyIHN0YXR1cyB0byBiZS4gIFRoaXMgaXMgYSByZWFzb25hYmxlIGNob2ljZSBvZiBhdHRyaWJ1dGVzIHNpbmNlIFN0YXJUZWFtJ3Mgc3RhdHVzIGZvciBhIGZpbGUgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgbG9jYWwgZmlsZSBpbiB0aGUgU3RhclRlYW0gZGVmYXVsdCBkaXJlY3RvcnksIG5vdCBvbiB0aGUgZGlyZWN0b3J5IHdlIGFyZSBhY3R1YWxseSB3b3JraW5nIHdpdGguCisKKzxwcmU+CisgICZsdDtzdGNoZWNraW4gVVJMPSJTVEFSVEVBTTo0OTIwMS9BcHJvamVjdC9BVmlldyIgCisgICAgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgICAgICAgICAgICAgcm9vdGxvY2FsZm9sZGVyPSJDOlxkZXZcYnVpbGR0ZXN0XGNvIgorICAgICAgICAgICAgIGZvcmNlZD0idHJ1ZSIKKyAgLyZndDsKKzwvcHJlPgorQW5kIHRoaXMgaXMgYSBzaW1wbGVyIHdheSBvZiBnaXZpbmcgdGhlIHNhbWUgY29tbWFuZHMgYXMgdGhlIGNvbW1hbmQgYWJvdmUgdXNpbmcgdGhlIFVSTCBzaG9ydGN1dC4KKzxicj48L2JyPgorPHByZT4KKyAgJmx0O3N0Y2hlY2tpbiBVUkw9IlNUQVJURUFNOjQ5MjAxL0Fwcm9qZWN0L0FWaWV3IiAKKyAgICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgICByb290bG9jYWxmb2xkZXI9IkM6XGRldlxidWlsZHRlc3RcY28iCisgICAgICAgICAgICAgcm9vdHN0YXJ0ZWFtZm9sZGVyPSJcRGV2IgorICAgICAgICAgICAgIGV4Y2x1ZGVzPSIqLmJhayAqLm9sZCIKKyAgICAgICAgICAgICBmb3JjZWQ9InRydWUiCisgIC8mZ3Q7Cis8L3ByZT4KKworVGhpcyB3aWxsIGNoZWNrIGFsbCBmaWxlcyBpbiB0byB0aGUgPGk+RGV2PC9pPiBmb2xkZXIgYW5kIGJlbG93IHRoYXQgZG8gbm90CitlbmQgaW4gPGk+LmJhazwvaT4gb3IgPGk+Lm9sZDwvaT4gZnJvbSB0aGUgdHJlZSByb290ZWQgYXQiQzpcZGV2XGJ1aWxkdGVzdFxjbyIgLiAgCisKKzxwcmU+CisgICZsdDtzdGNoZWNraW4gVVJMPSJTVEFSVEVBTTo0OTIwMS9BcHJvamVjdC9BVmlldyIKKyAgICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgICByb290bG9jYWxmb2xkZXI9IkM6XGRldlxidWlsZHRlc3RcY28iCisgICAgICAgICAgICAgaW5jbHVkZXM9IiouaHRtLCouaHRtbCIKKyAgICAgICAgICAgICBleGNsdWRlcz0iaW5kZXguKiIKKyAgICAgICAgICAgICBmb3JjZWQ9InRydWUiCisgIC8mZ3Q7Cis8L3ByZT4KKworICAgICAKK1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBvdmVybGFwcGluZyA8aT5pbmNsdWRlczwvaT4gYW5kIDxpPmV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGVzLiAgQmVjYXVzZQorPGk+ZXhjbHVkZXM8L2k+IHRha2VzIHByZWNlZGVuY2Ugb3ZlciA8aT5pbmNsdWRlczwvaT4sIGZpbGVzIG5hbWVkIDxjb2RlPmluZGV4Lmh0bWw8L2NvZGU+IHdpbGwKK25vdCBiZSBjaGVja2VkIGluIGJ5IHRoaXMgY29tbWFuZC4KKworPHByZT4KKyAgJmx0O3N0Y2hlY2tpbiBVUkw9IlNUQVJURUFNOjQ5MjAxL0Fwcm9qZWN0L0FWaWV3IgorICAgICAgICAgICAgIHVzZXJuYW1lPSJhdXNlciIKKyAgICAgICAgICAgICBwYXNzd29yZD0ic2VjcmV0IgorICAgICAgICAgICAgIHJvb3Rsb2NhbGZvbGRlcj0iQzpcZGV2XGJ1aWxkdGVzdFxjbyIKKyAgICAgICAgICAgICByb290c3RhcnRlYW1mb2xkZXI9InNyYy9qYXZhIgorICAgICAgICAgICAgIGluY2x1ZGVzPSIqLmh0bSwqLmh0bWwiCisgICAgICAgICAgICAgZXhjbHVkZXM9ImluZGV4LioiCisgICAgICAgICAgICAgZm9yY2VkPSJ0cnVlIgorICAgICAgICAgICAgIHJlY3Vyc2l2ZT0iZmFsc2UiCisgIC8mZ3Q7Cis8L3ByZT4KK1RoaXMgZXhhbXBsZSBpcyBsaWtlIHRoZSBwcmV2aW91cyBvbmUsIGJ1dCB3aWxsIG9ubHkgY2hlY2sgaW4gZmlsZXMgZnJvbSAKK0M6XGRldlxidWlsZHRlc3RcY28sIGJlY2F1c2Ugb2YgdGhlIHR1cm5pbmcgb2ZmIG9mIHRoZSByZWN1cnNpdmUgYXR0cmlidXRlLgorCis8cHJlPgorICAmbHQ7c3RjaGVja2luIFVSTD0iU1RBUlRFQU06NDkyMDEvQXByb2plY3QvQVZpZXciCisgICAgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgICAgICAgICAgICAgcm9vdGxvY2FsZm9sZGVyPSJDOlxkZXZcYnVpbGR0ZXN0XGNvIgorICAgICAgICAgICAgIHJvb3RzdGFydGVhbWZvbGRlcj0ic3JjL2phdmEiCisgICAgICAgICAgICAgaW5jbHVkZXM9InZlcnNpb24udHh0IgorICAgICAgICAgICAgIGZvcmNlZD0idHJ1ZSIKKyAgICAgICAgICAgICByZWN1cnNpdmU9ImZhbHNlIgorICAvJmd0OworPC9wcmU+CitUaGlzIGV4YW1wbGUgaXMgbGlrZSB0aGUgcHJldmlvdXMgb25lLCBidXQgd2lsbCBvbmx5IGNoZWNrIG9ubHkgaW4gb25lIGZpbGUsIEM6XGRldlxidWlsZHRlc3RcY29cdmVyc2lvbi50eHQgdG8gdGhlIFN0YXJUZWFtIGZvbGRlciBzcmMvamF2YS4KKworPHByZT4KKyAgJmx0O3N0Y2hlY2tpbiBVUkw9IlNUQVJURUFNOjQ5MjAxL0Fwcm9qZWN0L0FWaWV3IgorICAgICAgICAgICAgIHVzZXJuYW1lPSJhdXNlciIKKyAgICAgICAgICAgICBwYXNzd29yZD0ic2VjcmV0IgorICAgICAgICAgICAgIHJvb3Rsb2NhbGZvbGRlcj0iQzpcZGV2XGJ1aWxkdGVzdFxjbyIKKyAgICAgICAgICAgICByb290c3RhcnRlYW1mb2xkZXI9InNyYy9qYXZhIgorICAgICAgICAgICAgIGluY2x1ZGVzPSJ2ZXJzaW9uLmphdmEiCisgICAgICAgICAgICAgZm9yY2VkPSJ0cnVlIgorICAgICAgICAgICAgIHJlY3Vyc2l2ZT0iZmFsc2UiCisgICAgICAgICAgICAgYWRkVW5jb250cm9sbGVkPSJ0cnVlIgorICAgICAgICAgICAgIGNvbW1lbnQ9IkZpeCBCdWcgIzY2NyIKKyAgLyZndDsKKzwvcHJlPgorVGhpcyBleGFtcGxlIGlzIGxpa2UgdGhlIHByZXZpb3VzIG9uZSwgYnV0IHdpbGwgb25seSBjaGVjayBvbmx5IGluIG9uZSBmaWxlLCBDOlxkZXZcYnVpbGR0ZXN0XGNvXHZlcnNpb24uamF2YSB0byB0aGUgU3RhclRlYW0gZm9sZGVyIHNyYy9qYXZhLiAgQmVjYXVzZSB0aGUgPGk+YWRkVW5jb250cm9sbGVkPC9pPiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LCBpZiBTdGFyVGVhbSBkb2VzIG5vdCBhbHJlYWR5IGNvbnRyb2wgdGhpcyBmaWxlIGluIHRoaXMgbG9jYXRpb24sIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlcG9zaXRvcnkuICBBbHNvLCBpdCB3aWxsIHdyaXRlIGEgY29tbWVudCB0byB0aGUgcmVwb3NpdG9yeSBmb3IgdGhpcyB2ZXJzaW9uIG9mIHRoZSBmaWxlLgorCis8cHJlPgorICAmbHQ7c3RjaGVja2luIFVSTD0iU1RBUlRFQU06NDkyMDEvQXByb2plY3QvQVZpZXciCisgICAgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgICAgICAgICAgICAgcm9vdHN0YXJ0ZWFtZm9sZGVyPSJzcmMvamF2YSIKKyAgICAgICAgICAgICByb290bG9jYWxmb2xkZXI9IkM6XGRldlxidWlsZHRlc3RcY28iCisgICAgICAgICAgICAgZm9yY2VkPSJ0cnVlIgorICAvJmd0OworPC9wcmU+Cis8YnI+PC9icj4KKzxwcmU+CisgICZsdDtzdGNoZWNraW4gVVJMPSJTVEFSVEVBTTo0OTIwMS9BcHJvamVjdC9BVmlldyIKKyAgICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgICByb290c3RhcnRlYW1mb2xkZXI9InNyYy9qYXZhIgorICAvJmd0OworPC9wcmU+Cis8YnI+PC9icj4KKzxwcmU+CisgJmx0O3N0Y2hlY2tpbiBVUkw9IlNUQVJURUFNOjQ5MjAxL0Fwcm9qZWN0L0FWaWV3IgorICAgICAgICAgICAgIHVzZXJuYW1lPSJhdXNlciIKKyAgICAgICAgICAgICBwYXNzd29yZD0ic2VjcmV0IgorICAgICAgICAgICAgIHJvb3RzdGFydGVhbWZvbGRlcj0ic3JjL2phdmEiCisgICAgICAgICAgICAgcm9vdGxvY2FsZm9sZGVyPSJDOlxkZXZcYnVpbGR0ZXN0XGNvXHNyY1xqYXZhIgorICAgICAgICAgICAgIGZvcmNlZD0idHJ1ZSIKKyAgLyZndDsKKzwvcHJlPgorCitJbiB0aGUgcHJlY2VkaW5nIHRocmVlIGV4YW1wbGVzLCBhc3N1bWluZyB0aGF0IHRoZSBBUHJvamVjdCBwcm9qZWN0IGhhcyBhIGRlZmF1bHQgZm9sZGVyIG9mIEM6XHdvcmtcYnVpbGR0ZXN0XGNvXEFQcm9qZWN0LCAgCit0aGUgZmlyc3QgZXhhbXBsZSB3aWxsIGNoZWNrIGluIGZpbGVzIGZyb20gYSB0cmVlIHJvb3RlZCBhdCBDOlxkZXZcYnVpbGR0ZXN0XGNvLCAKK3RoZSBzZWNvbmQgZnJvbSBhIHRyZWUgcm9vdGVkIGF0IEM6XHdvcmtcYnVpbGR0ZXN0XGNvXEFQcm9qZWN0XHNyY1xqYXZhLCAKK2FuZCB0aGUgdGhpcmQgZnJvbSBhIHRyZWUgcm9vdGVkIGF0IEM6XGRldlxidWlsZHRlc3RcY29cc3JjXGphdmEgYWxsIHRvIGEgdHJlZSByb290ZWQgYXQgc3JjL2phdmEKKworPGhyPjwvaHI+CisKKzxhIG5hbWU9InN0bGFiZWwiPgorPGgyPlNUTGFiZWw8L2gyPjwvYT4KKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworQ3JlYXRlcyBhIHZpZXcgbGFiZWwgaW4gU3RhclRlYW0gYXQgdGhlIHNwZWNpZmllZCB2aWV3LiAgVGhlIGxhYmVsIHdpbGwgYmUgY2xhc3NpZmllZCBieSBTdGFyVGVhbSBhcyBhICJidWlsZCBsYWJlbCIuICBUaGlzIHRhc2sgd2lsbCBmYWlsIGlmIHRoZXJlIGFscmVhZHkgZXhpc3RzIGluIDxpPnZpZXduYW1lPC9pPiBhIGxhYmVsIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgPGk+bGFiZWw8L2k+IHBhcmFtZXRlci4gCisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KK1NlZSBhbHNvIDxBIGhyZWY9IiNjb21tb24tcGFyYW1zIj50aGUgcmVxdWlyZWQgY29tbW9uIFN0YXJUZWFtIHBhcmFtZXRlcnM8L0E+Ljxicj48L2JyPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sYWJlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUgbGFiZWw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+eWVzPC90ZD4KKyAgPC90cj4gCisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc2NyaXB0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZGVzY3JpcHRpb24gb2YgdGhlIGxhYmVsIHRvIGJlIHN0b3JlZCBpbiB0aGUgU3RhclRlYW0gcHJvamVjdC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+eWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cmV2aXNpb25sYWJlbDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ZZXMgbWVhbnMgdGhhdCB0aGUgbGFiZWwgYXR0cmlidXRlIGlzIHRvIGJlIHNhdmVkIGFzIGEgJnF1b3Q7cmV2aXNpb24gbGFiZWwmcXVvdDsuICBObyAoZGVmYXVsdCkgbWVhbnMgdGhhdCBpdCB3aWxsIGJlIHNhdmVkIGFzIGEgJnF1b3Q7dmlldyBsYWJlbCZxdW90OzwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDwvdHI+IAorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5idWlsZGxhYmVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlllcyBtZWFucyB0aGF0IHRoZSBsYWJlbCBhdHRyaWJ1dGUgaXMgdG8gYmUgc2F2ZWQgYXMgYSAmcXVvdDtidWlsZCBsYWJlbCZxdW90Oy4gIAorICAgICAgVGhpcyBtZWFucyB0aGF0IENoYW5nZSBSZXF1ZXN0cyB3aGljaCBoYXZlIGFuICZxdW90O0FkZHJlc3NlZEluJnF1b3Q7IGZpZWxkIHZhbHVlIG9mICZxdW90O25leHQgYnVpbGQmcXVvdDsKKyAgICAgICB3aWxsIGhhdmUgdGhpcyBsYWJlbCBhc3NpZ25lZCB0byB0aGF0IGZpZWxkIHdoZW4gdGhlIGxhYmVsIGlzIGNyZWF0ZWQuICAKKyAgICAgICBObyAoZGVmYXVsdCkgbWVhbnMgdGhhdCBubyBDUnMgd2lsbCBoYXZlIHRoaXMgbGFiZWwgYXNzaWduZWQgdG8gdGhlbS4gIFRoaXMgd2lsbCBoYXZlIG5vIGVmZmVjdCBpZiA8Yj5yZXZpc2lvbmxhYmVsPC9iPiBpcyBhbHNvIHRydWUuICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPiAKKworIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxhc3RidWlsZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdGltZXN0YW1wIG9mIHRoZSBidWlsZCB0aGF0IHdpbGwgYmUgc3RvcmVkIHdpdGggdGhlIGxhYmVsLiAgTXVzdCBiZSBmb3JtYXR0ZWQgPGNvZGU+eXl5eU1NZGRISG1tc3M8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKK1RoaXMgZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mIHRoaXMgdGFnLiAgSXQgd2lsbCBjcmVhdGUgYSBWaWV3IGxhYmVsIHRoYXQgaXMgYSBidWlsZCBsYWJlbCBuYW1lZCA8aT5WZXJzaW9uIDYuMjwvaT4gd2l0aAorPGk+JnF1b3Q7VGhvcm91Z2ggZGVzY3JpcHRpb24mcXVvdDs8L2k+IGFzIGl0cyBkZXNjcmlwdGlvbi4KKzxwcmU+CisgICZsdDt0c3RhbXAmZ3Q7CisgICAgJmx0O2Zvcm1hdCBwcm9wZXJ0eT0ibm93c3RhbXAiIHBhdHRlcm49Inl5eXlNTWRkSEhtbXNzIiBsb2NhbGU9ImVuIi8mZ3Q7CisgICZsdDsvdHN0YW1wJmd0OyAgCisgICZsdDtzdGxhYmVsIFVSTD0iU1RBUlRFQU06NDkyMDEvQXByb2plY3QvQVZpZXciCisgICAgICAgICAgIHVzZXJuYW1lPSJhdXNlciIKKyAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgbGFiZWw9IlZlcnNpb24gNi4yIgorICAgICAgICAgICBsYXN0YnVpbGQ9IiR7bm93c3RhbXB9IgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhvcm91Z2ggZGVzY3JpcHRpb24iCisgIC8mZ3Q7Cis8L3ByZT4KK1RoaXMgZXhhbXBsZSBjcmVhdGVzIGEgbm9uLWJ1aWxkIFZpZXcgbGFiZWwgbmFtZWQgPGk+VmVyc2lvbiA2LjM8L2k+IHdpdGgKKzxpPiZxdW90O1Rob3JvdWdoIGRlc2NyaXB0aW9uJnF1b3Q7PC9pPiBhcyBpdHMgZGVzY3JpcHRpb24uCis8cHJlPgorICAmbHQ7dHN0YW1wJmd0OworICAgICZsdDtmb3JtYXQgcHJvcGVydHk9Im5vd3N0YW1wIiBwYXR0ZXJuPSJ5eXl5TU1kZEhIbW1zcyIgbG9jYWxlPSJlbiIvJmd0OworICAmbHQ7L3RzdGFtcCZndDsgIAorICAmbHQ7c3RsYWJlbCBVUkw9IlNUQVJURUFNOjQ5MjAxL0Fwcm9qZWN0L0FWaWV3IgorICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgICAgICAgICAgIGxhYmVsPSJWZXJzaW9uIDYuMyIKKyAgICAgICAgICAgbGFzdGJ1aWxkPSIke25vd3N0YW1wfSIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRob3JvdWdoIGRlc2NyaXB0aW9uIgorICAgICAgICAgICBidWlsZGxhYmVsPSJmYWxzZSIKKyAgLyZndDsKKzwvcHJlPgorVGhpcyBleGFtcGxlIHdpbGwgY3JlYXRlIGEgUmV2aXNpb24gbGFiZWwgdGhhdCBpcyBhIGJ1aWxkIGxhYmVsIG5hbWVkIDxpPlZlcnNpb24gNi4yLjAwLjAwMTwvaT4gd2l0aAorPGk+JnF1b3Q7cmV2aXNpb24gbGFiZWwmcXVvdDs8L2k+IGFzIGl0cyBkZXNjcmlwdGlvbi4KKzxwcmU+CisgICZsdDt0c3RhbXAmZ3Q7CisgICAgJmx0O2Zvcm1hdCBwcm9wZXJ0eT0ibm93c3RhbXAiIHBhdHRlcm49Inl5eXlNTWRkSEhtbXNzIiBsb2NhbGU9ImVuIi8mZ3Q7CisgICZsdDsvdHN0YW1wJmd0OyAgCisgICZsdDtzdGxhYmVsIFVSTD0iU1RBUlRFQU06NDkyMDEvQXByb2plY3QvQVZpZXciCisgICAgICAgICAgIHVzZXJuYW1lPSJhdXNlciIKKyAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgbGFiZWw9IlZlcnNpb24gNi4yLjAwLjAwMSIKKyAgICAgICAgICAgZGVzY3JpcHRpb249InJldmlzaW9uIGxhYmVsIgorICAgICAgICAgICByZXZpc2lvbmxhYmVsPSJ0cnVlIgorICAvJmd0OworPC9wcmU+CisKKzxocj48L2hyPgorPGEgbmFtZT0ic3RsaXN0Ij4KKzxoMj5TVExpc3Q8L2gyPjwvYT4KKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworUHJvZHVjZXMgYSBsaXN0aW5nIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgU3RhclRlYW0gcmVwb3NpdG9yeSBhdCB0aGUgc3BlY2lmaWVkIHZpZXcgYW5kIFN0YXJUZWFtRm9sZGVyLiAgVGhlIGxpc3Rpbmcgd2lsbCBjb250YWluIHRoZSBuYW1lIG9mIHRoZSB1c2VyLCBpZiBhbnksIHdobyBoYXMgdGhlIGZpbGUgbG9ja2VkLCB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgaXRzIGxhc3RNb2RpZmllZERhdGUgaW4gdGhlIHJlcG9zaXRvcnksIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCBhbmQgdGhlIHN0YXR1cyBvZiB0aGUgbG9jYWwgZmlsZSBpbiB0aGUgZGVmYXVsdCBsb2NhbCBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkuIAorCis8aDM+UGFyYW1ldGVyczwvaDM+CitTZWUgYWxzbyA8QSBocmVmPSIjY29tbW9uLXBhcmFtcyI+dGhlIHJlcXVpcmVkIGNvbW1vbiBTdGFyVGVhbSBwYXJhbWV0ZXJzPC9BPi48YnI+PC9icj4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cm9vdHN0YXJ0ZWFtZm9sZGVyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSByb290IG9mIHRoZSBzdWJ0cmVlIGluIHRoZSBTdGFyVGVhbSByZXBvc2l0b3J5IHRvIGJlIGxpc3RlZC4gIERlZmF1bHRzIHRvIHRoZSByb290IGZvbGRlciBvZiB0aGUgdmlldyAoJy8nKS4gPGI+PGk+SWYgc3VwcGxpZWQsIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBhbiAiYWJzb2x1dGUiIHBhdGgsIHRoYXQgaXMsIGl0IHNob3VsZCBiZWdpbiB3aXRoIGEgJy8nLiAgCisgICAgICBSZWxhdGl2ZSBwYXRocyBoYXZlIGxpdHRsZSBtZWFuaW5nIGluIHRoaXMgY29udGV4dCBhbmQgY29uZnVzZSBTdGFyVGVhbS48L2k+PC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDwvdHI+ICAKKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cm9vdGxvY2FsZm9sZGVyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhbCBmb2xkZXIgd2hpY2ggd2lsbCBiZSB0aGUgcm9vdCBvZiB0aGUgdHJlZSB0byB3aGljaCBmaWxlcyBhcmUgY29tcGFyZWQuICBJZiB0aGlzIGlzIG5vdCBzdXBwbGllZCwgdGhlbiB0aGUgU3RhclRlYW0gImRlZmF1bHQgZm9sZGVyIiBhc3NvY2lhdGVkIHdpdGggPGk+cm9vdHN0YXJ0ZWFtZm9sZGVyPC9pPiBpcyB1c2VkIGFuZCBhIHN0YXR1cyBmaWVsZCB3aWxsIGFwcGVhciBpbiB0aGUgbGlzdGluZy4gIE90aGVyd2lzZSwgdGhlIHN0YXR1cyBmaWVsZCB3aWxsIG5vdCBhcHBlYXIuCisgICA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPiAgCisgICAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSBsaXN0IGZpbGVzIHRoYXQgbWF0Y2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBwYXR0ZXJucyBpbiB0aGlzIGxpc3QuICBQYXR0ZXJucyBtdXN0IGJlIHNlcGFyYXRlZCBieSA8aT5jb21tYXM8L2k+LiAgUGF0dGVybnMgaW4gPGk+ZXhjbHVkZXM8L2k+IHRha2UgcHJlY2VkZW5jZSBvdmVyIHBhdHRlcm5zIGluIDxpPmluY2x1ZGVzPC9pPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgbGlzdCBmaWxlcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGF0dGVybnMgaW4gdGhpcyBsaXN0LiAgUGF0dGVybnMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgIDxpPmNvbW1hczwvaT4uICBQYXR0ZXJucyBpbiA8aT5leGNsdWRlczwvaT4gdGFrZSBwcmVjZWRlbmNlIG92ZXIgcGF0dGVybnMgaW4gPGk+aW5jbHVkZXM8L2k+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxhYmVsPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkxpc3QgZmlsZXMsIGRhdGVzLCBhbmQgc3RhdHVzZXMgYXMgb2YgdGhpcyBsYWJlbC4gIFRoZSBsYWJlbCBtdXN0IGV4aXN0IGluIHN0YXJ0ZWFtIG9yIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIGVhY2ggZmlsZSB3aWxsIGJlIGxpc3RlZC48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hc29mZGF0ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5MaXN0IGZpbGVzLCBkYXRlcywgYW5kIHN0YXR1c2VzIGFzIG9mIHRoaXMgZGF0ZS4KKyAgICBUaGUgZGF0ZSBtdXN0IGJlIGZvcm1hdHRlZCBpbiBJU084NjAxIGRhdGV0aW1lCisgICAgKDxjb2RlPnl5eXktTU0tZGQnVCdISDptbTpzczwvY29kZT4pLCBJU084NjAxCisgICAgZGF0ZSg8Y29kZT55eXl5LU1NLWRkPC9jb2RlPikgb3IgYSB1c2VyLWRlZmluZWQgU2ltcGxlRGF0ZUZvcm1hdAorICAgIGRlZmluZWQgaW4gdGhlIDxjb2RlPmFzb2ZEYXRlRm9ybWF0PC9jb2RlPiBhdHRyaWJ1dGUuICBJZiB0aGUgZGF0ZQorICAgIGlzIG5vdCBwYXJzYWJsZSBieSB0aGUgZGVmYXVsdCBvciBzZWxlY3RlZCBmb3JtYXQsIGFuIGV4Y2VwdGlvbgorICAgIHdpbGwgYmUgdGhyb3duLiAgPGVtPlNpbmNlIEFudCAxLjYuPC9lbT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hc29mZGF0ZWZvcm1hdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5qYXZhLnV0aWwuU2ltcGxlRGF0ZUZvcm1hdCBjb21wYXRpYmxlIHN0cmluZyB1c2VkCisgICAgdG8gcGFyc2UgdGhlIDxjb2RlPmFzb2ZkYXRlPC9jb2RlPiBhdHRyaWJ1dGUuICA8ZW0+U2luY2UgQW50CisgICAgMS42LjwvZW0+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZWN1cnNpdmU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIGlmIHN1YmZvbGRlcnMgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBmaWxlcyB0byBsaXN0LiAgRGVmYXVsdHMgdG8gInRydWUiLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGlzdHVuY29udHJvbGxlZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZiB0cnVlLCBhbnkgZmlsZXMgb3IgZm9sZGVycyBOT1QgaW4gU3RhclRlYW0gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdGluZy4KKyAgICBJZiBmYWxzZSwgdGhleSB3b24ndC4gIERlZmF1bHRzIHRvICJ0cnVlIi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICAgIDwvdHI+CisgIAorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wcmVsb2FkZmlsZWluZm9ybWF0aW9uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBTdGFyVGVhbSBzZXJ2ZXIgaGFzIHRoZSBhYmlsaXR5IHRvIHByZWxvYWQgZmlsZSBtZXRhZGF0YSBmb3IgYW4KKyAgICBlbnRpcmUgdHJlZSBwcmlvciB0byBiZWdpbm5pbmcgYWN0aW9uIG9uIHRoYXQgdHJlZS4gIERvaW5nIHNvIGNhbiBpbiBzb21lIGluc3RhbmNlcyAKKyAgICBsZWFkIHRvIHN1YnN0YW50aWFsbHkgZmFzdGVyIGFjdGlvbnMsIHBhcnRpY3VsYXJseSBvdmVyIGxhcmdlIHRyZWVzLiAgU2V0dGluZyB0aGlzIAorICAgIHRvICJ5ZXMiIChkZWZhdWx0KSBlbmdhZ2VzIHRoaXMgZnVuY3Rpb25hbGl0eSwgc2V0dGluZyBpdCB0byAibm8iIHR1cm5zIGl0IG9mZi48L3RkPiAgICAKKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwcmU+CisKKyAgJmx0O3N0bGlzdCB1cmw9IldBU0hJTkdUT046NDkyMDEvYnVpbGQiCisgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgLyZndDsKKzwvcHJlPgorCitUaGUgYWJvdmUgY29tbWFuZCBtaWdodCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgbGlzdGluZzoKKworPHByZT4KKyAgIFtzdGxpc3RdIEZvbGRlcjogQnVpbGQgKERlZmF1bHQgZm9sZGVyOiBDOi93b3JrL2J1aWxkKQorICAgW3N0bGlzdF0gRm9sZGVyOiBkZXYgKERlZmF1bHQgZm9sZGVyOiBDOi93b3JrL2J1aWxkL2RldikKKyAgIFtzdGxpc3RdIE91dCBvZiBkYXRlICBTdWUgRGV2ZWxvcGVyICAgICAgICAxLzEvMDIgNzoyNTo0NyBQTSBDU1QgICAgIDQzNjggYnVpbGQueG1sCisgICBbc3RsaXN0XSBNaXNzaW5nICAgICAgR2VvcmdlIEhhY2tlciAgICAgICAgMS8xLzAyIDc6MjU6NDkgUE0gQ1NUICAgICAgIDM2IFRlc3QwMS5wcm9wZXJ0aWVzCisgICBbc3RsaXN0XSBDdXJyZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgMS8xLzAyIDc6MjU6NDkgUE0gQ1NUICAgICA0MzY4IGJ1aWxkMi54bWwKKyAgIFtzdGxpc3RdIEZvbGRlcjogdGVzdCAoRGVmYXVsdCBmb2xkZXIgQzovd29yay9idWlsZC9kZXYvdGVzdCkKKyAgIFtzdGxpc3RdIE1pc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAxLzEvMDIgNzoyNTo1MCBQTSBDU1QgICAgIDQzNjggYnVpbGQyLnhtbAorPC9wcmU+CisKK3doaWxlIGFkZGluZyBhIDxpPnJvb3Rsb2NhbGZvbGRlcjwvaT4gYW5kIGFuIDxpPmV4Y2x1ZGVzPC9pPiBwYXJhbSAuLi4KKworPHByZT4KKworICAmbHQ7c3RsaXN0IHVybD0iV0FTSElOR1RPTjo0OTIwMS9idWlsZCIKKyAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICByb290bG9jYWxmb2xkZXI9InNyY2RpcjIiCisgICAgICAgICAgZXhjbHVkZXM9IioucHJvcGVydGllcyIKKyAvJmd0OworPC9wcmU+CisKK21pZ2h0IHByb2R1Y2UgdGhpcyBsaXN0aW5nLiBUaGUgc3RhdHVzIGlzIG1pc3NpbmcgYmVjYXVzZSB3ZSBhcmUgbm90IGdvaW5nIGFnYWluc3QgdGhlIGRlZmF1bHQgZm9sZGVyLgorCis8cHJlPgorICAgW3N0bGlzdF0gb3ZlcnJpZGluZyBsb2NhbCBmb2xkZXIgdG8gc3JjZGlyMgorICAgW3N0bGlzdF0gRm9sZGVyOiBCdWlsZCAoTG9jYWwgZm9sZGVyOiBzcmNkaXIyKQorICAgW3N0bGlzdF0gRm9sZGVyOiBkZXYgKExvY2FsIGZvbGRlcjogc3JjZGlyMi9kZXYpCisgICBbc3RsaXN0XSBTdWUgRGV2ZWxvcGVyICAgICAgICAxLzEvMDIgNzoyNTo0NyBQTSBDU1QgICAgIDQzNjggYnVpbGQueG1sCisgICBbc3RsaXN0XSAgICAgICAgICAgICAgICAgICAgICAxLzEvMDIgNzoyNTo0OSBQTSBDU1QgICAgIDQzNjggYnVpbGQyLnhtbAorICAgW3N0bGlzdF0gRm9sZGVyOiB0ZXN0IChMb2NhbCBmb2xkZXI6IHNyY2RpcjIvZGV2L3Rlc3QpCisgICBbc3RsaXN0XSAgICAgICAgICAgICAgICAgICAgICAxLzEvMDIgNzoyNTo1MCBQTSBDU1QgICAgIDQzNjggYnVpbGQyLnhtbAorIAorCis8L3ByZT4KKworPGhyPjwvaHI+CisKKzxhIG5hbWU9InN0YXJ0ZWFtIj4KKzxoMj5TdGFydGVhbTwvaDI+PC9hPgorPGgzPjxpPkRlcHJlY2F0ZWQ8L2k+PC9oMz4KKzxwPjxpPlRoaXMgdGFzayBoYXMgYmVlbiBkZXByZWNhdGVkLiAgVXNlIHRoZSA8YSBocmVmPSIjc3RjaGVja291dCI+U1RDaGVja291dDwvYT4gdGFzayBpbnN0ZWFkLjwvaT48L3A+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorCitDaGVja3Mgb3V0IGZpbGVzIGZyb20gYSBTdGFyVGVhbSBwcm9qZWN0LgorCis8cD4KK1RoZSA8aT5pbmNsdWRlczwvaT4gYW5kIDxpPmV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGVzIGZ1bmN0aW9uIGRpZmZlcmVudGx5IGZyb20KK290aGVyIHRhc2tzIGluIEFudC4gIE11bHRpcGxlIHBhdHRlcm5zIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHNwYWNlcywgbm90Citjb21tYXMuICBTZWUgdGhlIGV4YW1wbGVzIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHVzZXJuYW1lIG9mIHRoZSBhY2NvdW50IHVzZWQgdG8gbG9nIGluIHRvIHRoZSBTdGFyVGVhbSBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPnllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXNzd29yZCBvZiB0aGUgYWNjb3VudCB1c2VkIHRvIGxvZyBpbiB0byB0aGUgU3RhclRlYW0gc2VydmVyLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj55ZXM8L3RkPgorICA8L3RyPiAgCisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNlcnZlcm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIFN0YXJUZWFtIHNlcnZlci48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+eWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2VydmVycG9ydDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcG9ydCBudW1iZXIgb2YgdGhlIFN0YXJUZWFtIHNlcnZlci48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+eWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvamVjdG5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIFN0YXJUZWFtIHByb2plY3QuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPnllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZpZXduYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSB2aWV3IGluIHRoZSBTdGFyVGVhbSBwcm9qZWN0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj55ZXM8L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRhcmdldGZvbGRlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZm9sZGVyIHRvIHdoaWNoIGZpbGVzIGFyZSBjaGVja2VkIG91dC4gIFdoYXQgdGhpcyBwcmVjaXNlbHkgbWVhbnMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgPGk+dGFyZ2V0Rm9sZGVyQWJzb2x1dGU8L2k+IHBhcmFtLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj55ZXM8L3RkPgorICA8L3RyPiAgCisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRhcmdldEZvbGRlckFic29sdXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRldGVybWluZXMgaG93IDxpPnRhcmdldGZvbGRlcjwvaT4gaXMgaW50ZXJwcmV0ZWQsIHRoYXQgaXMsIHdoZXRoZXIgdGhlIFN0YXJUZWFtICJkZWZhdWx0IGZvbGRlciIgZm9yIHRoZSBwcm9qZWN0IGlzIGZhY3RvcmVkIGluIChmYWxzZSkgb3Igd2hldGhlciA8aT50YXJnZXRGb2xkZXI8L2k+IGlzIGEgY29tcGxldGUgbWFwcGluZyB0byA8aT5mb2xkZXJuYW1lPC9pPiAodHJ1ZSkuCisgICAgICBJZiAidHJ1ZSIsIHRoZSB0YXJnZXQgdHJlZSB3aWxsIGJlIHJvb3RlZCBhdCA8aT50YXJnZXRmb2xkZXIrImRlZmF1bHQgZm9sZGVyIjwvaT4uICBJZiBmYWxzZSwgdGhlIHRhcmdldCB0cmVlIHdpbGwgYmUgcm9vdGVkIGF0IDxpPnRhcmdldGZvbGRlcjwvaT4uICBEZWZhdWx0cyB0byAiZmFsc2UiLiAgPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4gIAorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb2xkZXJuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdWJmb2xkZXIgaW4gdGhlIHByb2plY3QgZnJvbSB3aGljaCB0byBjaGVjayBvdXQgZmlsZXMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPC90cj4gIAorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5PdmVyd3JpdGUgZXhpc3RpbmcgZm9sZGVycyBpZiB0aGlzIGlzIHNldCB0byAidHJ1ZSIuICBEZWZhdWx0cyB0byAiZmFsc2UiLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnJlY3Vyc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgaWYgc3ViZm9sZGVycyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGZpbGVzIHRvIGNoZWNrIG91dC4gIERlZmF1bHRzIHRvICJ0cnVlIi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlByb3ZpZGVzIHByb2dyZXNzIGluZm9ybWF0aW9uLiAgRGVmYXVsdHMgdG8gImZhbHNlIi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IGNoZWNrIG91dCBmaWxlcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGF0dGVybnMgaW4gdGhpcyBsaXN0LiAgUGF0dGVybnMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgc3BhY2VzLiAgUGF0dGVybnMgaW4gPGk+ZXhjbHVkZXM8L2k+IHRha2UgcHJlY2VkZW5jZSBvdmVyIHBhdHRlcm5zIGluIDxpPmluY2x1ZGVzPC9pPi48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgY2hlY2sgb3V0IGZpbGVzIHRoYXQgbWF0Y2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBwYXR0ZXJucyBpbiB0aGlzIGxpc3QuICBQYXR0ZXJucyBtdXN0IGJlIHNlcGFyYXRlZCBieSBzcGFjZXMuICBQYXR0ZXJucyBpbiA8aT5leGNsdWRlczwvaT4gdGFrZSBwcmVjZWRlbmNlIG92ZXIgcGF0dGVybnMgaW4gPGk+aW5jbHVkZXM8L2k+LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+RXhhbXBsZXM8L2gzPgorCis8cHJlPgorICAmbHQ7c3RhcnRlYW0gc2VydmVybmFtZT0iU1RBUlRFQU0iIAorICAgICAgICAgICAgc2VydmVycG9ydD0iNDkyMDEiCisgICAgICAgICAgICBwcm9qZWN0bmFtZT0iQVByb2plY3QiIAorICAgICAgICAgICAgdmlld25hbWU9IkFWaWV3IgorICAgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgIHRhcmdldGZvbGRlcj0iQzpcZGV2XGJ1aWxkdGVzdFxjbyIKKyAgLyZndDsKKzwvcHJlPgorCitUaGUgbWluaW11bSBuZWNlc3NhcnkgdG8gY2hlY2sgb3V0IGZpbGVzIG91dCBmcm9tIGEgU3RhclRlYW0gc2VydmVyLiAgVGhpcyB3aWxsCitjaGVjayBvdXQgYWxsIGZpbGVzIGluIHRoZSA8aT5BVmlldzwvaT4gdmlldyBvZiB0aGUgPGk+QVByb2plY3Q8L2k+IHByb2plY3QgdG8KKzxjb2RlPkM6XGRldlxidWlsZHRlc3RcY288L2NvZGU+LgorCis8cHJlPgorICAmbHQ7c3RhcnRlYW0gc2VydmVybmFtZT0iU1RBUlRFQU0iIAorICAgICAgICAgICAgc2VydmVycG9ydD0iNDkyMDEiCisgICAgICAgICAgICBwcm9qZWN0bmFtZT0iQVByb2plY3QiIAorICAgICAgICAgICAgdmlld25hbWU9IkFWaWV3IgorICAgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgIHRhcmdldGZvbGRlcj0iQzpcZGV2XGJ1aWxkdGVzdFxjbyIKKyAgICAgICAgICAgIGZvbGRlcm5hbWU9IlxEZXYiCisgICAgICAgICAgICBleGNsdWRlcz0iKi5iYWsgKi5vbGQiCisgICAgICAgICAgICBmb3JjZT0idHJ1ZSIKKyAgLyZndDsKKzwvcHJlPgorCitUaGlzIHdpbGwgY2hlY2tvdXQgYWxsIGZpbGVzIGZyb20gdGhlIDxpPkRldjwvaT4gZm9sZGVyIGFuZCBiZWxvdyB0aGF0IGRvIG5vdAorZW5kIGluIDxpPi5iYWs8L2k+IG9yIDxpPi5vbGQ8L2k+LiAgVGhlIGZvcmNlIGZsYWcgd2lsbCBjYXVzZSBhbnkgZXhpc3RpbmcgZmlsZXMgdG8gYmUKK292ZXJ3cml0dGVuIGJ5IHRoZSB2ZXJzaW9uIGluIFN0YXJUZWFtLgorCis8cHJlPgorICAmbHQ7c3RhcnRlYW0gc2VydmVybmFtZT0iU1RBUlRFQU0iIAorICAgICAgICAgICAgc2VydmVycG9ydD0iNDkyMDEiCisgICAgICAgICAgICBwcm9qZWN0bmFtZT0iQVByb2plY3QiIAorICAgICAgICAgICAgdmlld25hbWU9IkFWaWV3IgorICAgICAgICAgICAgdXNlcm5hbWU9ImF1c2VyIgorICAgICAgICAgICAgcGFzc3dvcmQ9InNlY3JldCIKKyAgICAgICAgICAgIHRhcmdldGZvbGRlcj0iQzpcZGV2XGJ1aWxkdGVzdFxjbyIKKyAgICAgICAgICAgIGluY2x1ZGVzPSIqLmh0bSAqLmh0bWwiCisgICAgICAgICAgICBleGNsdWRlcz0iaW5kZXguKiIKKyAgLyZndDsKKzwvcHJlPgorCisKKyAgICAgICAKK1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBvdmVybGFwcGluZyA8aT5pbmNsdWRlczwvaT4gYW5kIDxpPmV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGVzLiAgQmVjYXVzZQorPGk+ZXhjbHVkZXM8L2k+IHRha2VzIHByZWNlZGVuY2Ugb3ZlciA8aT5pbmNsdWRlczwvaT4sIGZpbGVzIG5hbWVkIDxjb2RlPmluZGV4Lmh0bWw8L2NvZGU+IHdpbGwKK25vdCBiZSBjaGVja2VkIG91dCBieSB0aGlzIGNvbW1hbmQuCisKKworPHByZT4KKyAmbHQ7c3RhcnRlYW0gc2VydmVybmFtZT0iU1RBUlRFQU0iIAorICAgICAgICAgICAgc2VydmVycG9ydD0iNDkyMDEiCisgICAgICAgICAgICBwcm9qZWN0bmFtZT0iQVByb2plY3QiIAorICAgICAgICAgICAgZm9sZGVybmFtZT0ic3JjL2phdmEiCisgICAgICAgICAgICB2aWV3bmFtZT0iQVZpZXciCisgICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgICBwYXNzd29yZD0ic2VjcmV0IgorICAgICAgICAgICAgdGFyZ2V0Zm9sZGVyPSJDOlxkZXZcYnVpbGR0ZXN0XGNvIgorICAgICAgICAgICAgdGFyZ2V0Zm9sZGVyYWJzb2x1dGU9InRydWUiCisgIC8mZ3Q7Cis8L3ByZT4KKzxicj48L2JyPgorPHByZT4KKyAmbHQ7c3RhcnRlYW0gc2VydmVybmFtZT0iU1RBUlRFQU0iIAorICAgICAgICAgICAgc2VydmVycG9ydD0iNDkyMDEiCisgICAgICAgICAgICBwcm9qZWN0bmFtZT0iQVByb2plY3QiIAorICAgICAgICAgICAgZm9sZGVybmFtZT0ic3JjL2phdmEiCisgICAgICAgICAgICB2aWV3bmFtZT0iQVZpZXciCisgICAgICAgICAgICB1c2VybmFtZT0iYXVzZXIiCisgICAgICAgICAgICBwYXNzd29yZD0ic2VjcmV0IgorICAgICAgICAgICAgdGFyZ2V0Zm9sZGVyPSJDOlxkZXZcYnVpbGR0ZXN0XGNvIgorICAgICAgICAgICAgdGFyZ2V0Zm9sZGVyYWJzb2x1dGUgPSJmYWxzZSIKKyAgLyZndDsKKzwvcHJlPgorPGJyPjwvYnI+Cis8cHJlPgorICZsdDtzdGFydGVhbSBzZXJ2ZXJuYW1lPSJTVEFSVEVBTSIgCisgICAgICAgICAgICBzZXJ2ZXJwb3J0PSI0OTIwMSIKKyAgICAgICAgICAgIHByb2plY3RuYW1lPSJBUHJvamVjdCIgCisgICAgICAgICAgICBmb2xkZXJuYW1lPSJzcmMvamF2YSIKKyAgICAgICAgICAgIHZpZXduYW1lPSJBVmlldyIKKyAgICAgICAgICAgIHVzZXJuYW1lPSJhdXNlciIKKyAgICAgICAgICAgIHBhc3N3b3JkPSJzZWNyZXQiCisgICAgICAgICAgICB0YXJnZXRmb2xkZXI9IkM6XGRldlxidWlsZHRlc3RcY29cc3JjXGphdmEiCisgICAgICAgICAgICB0YXJnZXRmb2xkZXJhYnNvbHV0ZT0idHJ1ZSIKKyAgLyZndDsKKzwvcHJlPgorCitJbiB0aGUgcHJlY2VkaW5nIHRocmVlIGV4YW1wbGVzLCBhc3N1bWluZyB0aGF0IHRoZSBBUHJvamVjdCBwcm9qZWN0IGhhcyBhIGRlZmF1bHQgZm9sZGVyIG9mCisiQVByb2plY3QiLCB0aGUgZmlyc3QgZXhhbXBsZSB3aWxsIGNoZWNrIHRoZSBmaWxlcyBsb2NhdGVkIGluIHN0YXJ0ZWFtIHVuZGVyIHNyYy9qYXZhIG91dCB0byBhIHRyZWUgcm9vdGVkIGF0IEM6XGRldlxidWlsZHRlc3RcY28sIAordGhlIHNlY29uZCB0byBhIHRyZWUgcm9vdGVkIGF0IEM6XGRldlxidWlsZHRlc3RcY29cQVByb2plY3Rcc3JjXGphdmEgYW5kIHRoZSB0aGlyZCB0byBhIHRyZWUgcm9vdGVkIGF0IEM6XGRldlxidWlsZHRlc3RcY29cc3JjXGphdmEuCisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3N0eWxlYm9vay5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zdHlsZWJvb2suaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjRjZDhhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zdHlsZWJvb2suaHRtbApAQCAtMCwwICsxLDg5IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlN0eWxlQm9vayBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJzdHlsZWJvb2siPlN0eWxlYm9vazwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworPHN0cm9uZz5UaGlzIHRhc2sgaXMgZGVwcmVjYXRlZCBhcyBzdHlsZWJvb2sgaXRzZWxmIGhhcyBiZWVuCitkZXByZWNhdGVkIGJ5IHRoZSBBcGFjaGUgWE1MIGNvbW11bml0eS48L3N0cm9uZz4KKworPHA+VGhpcyBleGVjdXRlcyB0aGUgYXBhY2hlIFN0eWxlYm9vayBkb2N1bWVudGF0aW9uIGdlbmVyYXRvci4gCitVbmxpa2UgdGhlIGNvbW1hbmRsaW5lIHZlcnNpb24gb2YgdGhpcyB0b29sLCBhbGwgdGhyZWUgYXJndW1lbnRzCithcmUgcmVxdWlyZWQgdG8gcnVuIHN0eWxlYm9vay48L3A+Cis8cD48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4KK1NlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKzxwPgorIEJlaW5nIGV4dGVuZGVkIGZyb20gPGNvZGU+Jmx0O0phdmEmZ3Q7PC9jb2RlPiwgYWxsIHRoZSBwYXJlbnQncyBhdHRyaWJ1dGVzCisgYW5kIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4gRG8gbm90IHNldCBhbnkgYXBhcnQgZnJvbSB0aGUgPHR0PmNsYXNzcGF0aDwvdHQ+CisgYXMgdGhleSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlcmUgaW4gZnV0dXJlLgorIDwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Ym9vazwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYm9vayB4bWwgZmlsZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gc3RhcnRzIGZyb20KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+c2tpbmRpcmVjdG9yeTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIHN0eWxlYm9vayBza2luCisgICAgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRhcmdldGRpcmVjdG9yeTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZCAKKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD4KK1RoZSB1c2VyIGNhbiBhbHNvIHNwZWNpZnkgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudCB3aGljaCBkZWZpbmVzIGNsYXNzcGF0aCAKK2luIHdoaWNoIHRoZSB0YXNrIGlzIGV4ZWN1dGVkLjwvcD4KKworPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPgorPHByZT4KKyZsdDtzdHlsZWJvb2sgdGFyZ2V0ZGlyZWN0b3J5PSZxdW90O2J1aWxkL2RvY3MmcXVvdDsgCisgICAgICAgICAgIGJvb2s9JnF1b3Q7c3JjL3hkb2NzL2Jvb2sueG1sJnF1b3Q7IAorICAgICAgICAgICBza2luZGlyZWN0b3J5PSZxdW90O3NyYy9za2lucy9teXNraW4mcXVvdDsvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CitUaGUgYWJvdmUgd2lsbCBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGluIGJ1aWxkL2RvY3Mgc3RhcnRpbmcgZnJvbSB0aGUgYm9vayAKK3NyYy94ZG9jcy9ib29rLnhtbCBhbmQgdXNpbmcgdGhlIHNraW4gbG9jYXRlZCBpbiBkaXJlY3Rvcnkgc3JjL3NraW5zL215c2tpbi4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zeW1saW5rLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3N5bWxpbmsuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzllNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy9zeW1saW5rLmh0bWwKQEAgLTAsMCArMSwxNDAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+U3ltbGluayBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJzeW1saW5rIj5TeW1saW5rPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+IE1hbmFnZXMgc3ltYm9saWMgbGlua3Mgb24gVW5peCBiYXNlZCBwbGF0Zm9ybXMuIENhbiBiZSB1c2VkIHRvCittYWtlIGFuIGluZGl2aWR1YWwgbGluaywgZGVsZXRlIGEgbGluaywgY3JlYXRlIG11bHRpcGxlIGxpbmtzIGZyb20gcHJvcGVydGllcyBmaWxlcywgCitvciBjcmVhdGUgcHJvcGVydGllcyBmaWxlcyBkZXNjcmliaW5nIGxpbmtzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuCitFeGlzdGluZyBsaW5rcyBhcmUgbm90IG92ZXJ3cml0dGVuIGJ5IGRlZmF1bHQuCisKKzxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QgYQorc2V0IG9mIGxpbmtzIHRvIHJlY29yZCwgb3IgYSBzZXQgb2YgcHJvcGVydHkgZmlsZXMgdG8gY3JlYXRlIGxpbmtzIGZyb20uIDwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmFjdGlvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdHlwZSBvZiBhY3Rpb24gdG8gcGVyZm9ybSwgbWF5IGJlICJzaW5nbGUiLCAKKyAgICAicmVjb3JkIiwgInJlY3JlYXRlIiBvciAiZGVsZXRlIi48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIHNpbmdsZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5saW5rPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBsaW5rIHRvIGJlIGNyZWF0ZWQgb3IgZGVsZXRlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImNlbnRlciIgPnJlcXVpcmVkIGZvciAKKyAgICBhY3Rpb249InNpbmdsZSIgb3IgImRlbGV0ZSIuIElnbm9yZWQgaW4gb3RoZXIgYWN0aW9ucy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvdXJjZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmVzb3VyY2UgdGhlIGxpbmsgc2hvdWxkIHBvaW50IHRvLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5yZXF1aXJlZCBmb3IgYWN0aW9uPSJzaW5nbGUiLiBJZ25vcmVkIGluIG90aGVyIGFjdGlvbnMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGlua2ZpbGVuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgdG8gY3JlYXRlIGluIAorICAgIGVhY2ggaW5jbHVkZWQgZGlyZWN0b3J5LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5yZXF1aXJlZCBmb3IgYWN0aW9uPSJyZWNvcmQiLiAKKyAgICBJZ25vcmVkIGluIG90aGVyIGFjdGlvbnMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+b3ZlcndyaXRlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJ3cml0ZSBleGlzdGluZyBsaW5rcyBvciBub3QuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCBidWlsZCBpZiB0cnVlLCBsb2cgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBkbyBub3Qgc3RvcCB0aGUgYnVpbGQsCisgICAgICAgd2hlbiB0aGUgYW4gZXJyb3Igb2NjdXJzIGlmIGZhbHNlLgorICAgICA8L3RkPgorICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byB0cnVlLjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisgCis8aDQ+ZmlsZXNldDwvaDQ+CisgPHA+PGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zCisgYXJlIHVzZWQgd2hlbiBhY3Rpb24gPSAicmVjb3JkIiB0byBzZWxlY3QgZGlyZWN0b3JpZXMgYW5kIGxpbmtuYW1lcyB0byBiZSByZWNvcmRlZC4gCisgVGhleSBhcmUgYWxzbyB1c2VkIHdoZW4gYWN0aW9uID0gInJlY3JlYXRlIiB0byBzcGVjaWZ5IGJvdGggdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IAorIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCwgYW5kIHRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCB0aGV5IGNhbiBiZSBmb3VuZC4gQXQgbGVhc3Qgb25lIAorIGZpbGVzZXQgaXMgcmVxdWlyZWQgZm9yIGVhY2ggY2FzZS48L3A+CisgCis8aDM+RXhhbXBsZXM8L2gzPgorCisgIDxwPiBNYWtlIGEgbGluayBuYW1lZCAiZm9vIiB0byBhIHJlc291cmNlIG5hbWVkICJiYXIuZm9vIiBpbiBzdWJkaXI6PC9wPgorICA8cHJlPgorICAmbHQ7c3ltbGluayBsaW5rPSIke2Rpci50b3B9L2ZvbyIgcmVzb3VyY2U9IiR7ZGlyLnRvcH0vc3ViZGlyL2Jhci5mb28iLyZndDsKKyAgPC9wcmU+CisgCisgIDxwPiBSZWNvcmQgYWxsIGxpbmtzIGluIHN1YmRpciBhbmQgaXQncyBkZXNjZW5kYW50cyBpbiBmaWxlcyBuYW1lZAorICAiZGlyLmxpbmtzIjwvcD4KKyAgPHByZT4KKyAgJmx0O3N5bWxpbmsgYWN0aW9uPSJyZWNvcmQiIGxpbmtmaWxlbmFtZT0iZGlyLmxpbmtzIiZndDsKKyAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2Rpci50b3B9IiBpbmNsdWRlcz0ic3ViZGlyJiM0NzsqKiIvJmd0OworICAmbHQ7L3N5bWxpbmsmZ3Q7CisgIDwvcHJlPgorIAorICA8cD4gUmVjcmVhdGUgdGhlIGxpbmtzIHJlY29yZGVkIGluIHRoZSBwcmV2aW91cyBleGFtcGxlOjwvcD4KKyAgPHByZT4KKyAgJmx0O3N5bWxpbmsgYWN0aW9uPSJyZWNyZWF0ZSImZ3Q7CisgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtkaXIudG9wfSIgaW5jbHVkZXM9InN1YmRpciYjNDc7KiomIzQ3O2Rpci5saW5rcyIvJmd0OyAgCisgICZsdDsvc3ltbGluayZndDsKKyAgPC9wcmU+CisgCisgPHA+IERlbGV0ZSBhIGxpbmsgbmFtZWQgImZvbyI6CisgPHByZT4KKyAmbHQ7c3ltbGluayBhY3Rpb249ImRlbGV0ZSIgbGluaz0iJHtkaXIudG9wfS9mb28iLyZndDsKKyA8L3ByZT4KKworICA8cD48c3Ryb25nPkphdmEgMS4yIGFuZCBlYXJsaWVyOjwvc3Ryb25nPiBEdWUgdG8gbGltaXRhdGlvbnMgb24gZXhlY3V0aW5nIHN5c3RlbQorICBsZXZlbCBjb21tYW5kcyBpbiBKYXZhIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAxLjMgdGhpcyB0YXNrIG1heSBoYXZlIGRpZmZpY3VsdHkKKyAgb3BlcmF0aW5nIHdpdGggYSByZWxhdGl2ZSBwYXRoIGluIEFOVF9IT01FLiBUaGUgdHlwaWNhbCBzeW1wdG9tIGlzIGFuIAorICBJT0V4Y2VwdGlvbiB3aGVyZSBhbnQgY2FuJ3QgZmluZCAvc29tZS93b3JraW5nL2RpcmVjdG9yeSR7QU5UX0hPTUV9L2Jpbi9hbnRSdW4KKyAgb3Igc29tZXRoaW5nIHNpbWlsYXIuIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGNoYW5nZSB5b3VyIEFOVF9IT01FIGVudmlyb25tZW50CisgIHZhcmlhYmxlIHRvIGFuIGFic29sdXRlIHBhdGgsIHdoaWNoIHdpbGwgcmVtb3ZlIHRoZSAvc29tZS93b3JraW5nL2RpcmVjdG9yeSBwb3J0aW9uCisgIG9mIHRoZSBhYm92ZSBwYXRoIGFuZCBhbGxvdyBhbnQgdG8gZmluZCB0aGUgY29ycmVjdCBjb21tYW5kbGluZSBleGVjdXRpb24gc2NyaXB0LgorIAorICA8cD48c3Ryb25nPkxJTUlUQVRJT05TOjwvc3Ryb25nPiBCZWNhdXNlIEphdmEgaGFzIG5vIGRpcmVjdCBzdXBwb3J0IGZvcgorICBoYW5kbGluZyBzeW1saW5rcyB0aGlzIHRhc2sgZGl2aW5lcyB0aGVtIGJ5IGNvbXBhcmluZyBjYW5vbmljYWwgYW5kCisgIGFic29sdXRlIHBhdGhzLiBPbiBub24tdW5peCBzeXN0ZW1zIHRoaXMgbWF5IGNhdXNlIGZhbHNlIHBvc2l0aXZlcy4KKyAgRnVydGhlcm1vcmUsIGFueSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBjb21tYW5kCisgIDxjb2RlPmxuIC1zICZsdDtsaW5rbmFtZSZndDsgJmx0O3Jlc291cmNlbmFtZSZndDs8L2NvZGU+IGlzIG5vdCBhIHZhbGlkIAorICBjb21tYW5kIG9uIHRoZSBjb21tYW5kIGxpbmUgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UgYWN0aW9uPSJzaW5nbGUiIG9yIAorICBhY3Rpb249InJlY3JlYXRlIi4gQWN0aW9uPSJyZWNvcmQiIGFuZCBhY3Rpb249ZGVsZXRlIHNob3VsZCBzdGlsbCB3b3JrLiBGaW5hbGx5LCAKKyAgdGhlIGxhY2sgb2Ygc3VwcG9ydCBmb3Igc3ltbGlua3MgaW4gSmF2YSBtZWFucyB0aGF0IGFsbCBsaW5rcyBhcmUgcmVjb3JkZWQgYXMgCisgIGxpbmtzIHRvIHRoZSA8c3Ryb25nPmNhbm9uaWNhbDwvc3Ryb25nPiByZXNvdXJjZSBuYW1lLiBUaGVyZWZvcmUgdGhlIGxpbms6CisgIDxjb2RlPmxpbmsgLS0+IHN1YmRpci9kaXIvLi4vZm9vLmJhcjwvY29kZT4gd2lsbCBiZSByZWNvcmRlZCBhcworICA8Y29kZT5saW5rPXN1YmRpci9mb28uYmFyPC9jb2RlPiBhbmQgcmVzdG9yZWQgYXMKKyAgPGNvZGU+bGluayAtLT4gc3ViZGlyL2Zvby5iYXI8L2NvZGU+PC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy90ZWxuZXQuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvdGVsbmV0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhMzIwYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvdGVsbmV0Lmh0bWwKQEAgLTAsMCArMSwxNTUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+VGVsbmV0IFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InRlbG5ldCI+VGVsbmV0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBhdXRvbWF0ZSBhIHJlbW90ZSB0ZWxuZXQgc2Vzc2lvbi4gVGhlIHRhc2sgdXNlcyAKK25lc3RlZCA8dHQ+Jmx0O3JlYWQmZ3Q7PC90dD4gdG8gaW5kaWNhdGUgc3RyaW5ncyB0byB3YWl0IGZvciwgYW5kCis8dHQ+Jmx0O3dyaXRlJmd0OzwvdHQ+IHRhZ3MgdG8gc3BlY2lmeSB0ZXh0IHRvIHNlbmQuICAKKworPHA+SWYgeW91IGRvIHNwZWNpZnkgYSB1c2VyaWQgYW5kIHBhc3N3b3JkLCB0aGUgc3lzdGVtIHdpbGwgCithc3N1bWUgYSBjb21tb24gdW5peCBwcm9tcHQgdG8gd2FpdCBvbi4gVGhpcyBiZWhhdmlvciBjYW4gYmUgZWFzaWx5IG92ZXItcmlkZGVuLjwvcD4KKzxwPjxiPk5vdGU6PC9iPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLgorU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+dXNlcmlkPC90ZD4KKyAgICAgPHRkPnRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIHRlbG5ldCBzZXJ2ZXIuPC90ZD4KKyAgICAgPHRkPk9ubHkgaWYgcGFzc3dvcmQgaXMgc3BlY2lmaWVkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgICA8dGQ+dGhlIGxvZ2luIHBhc3N3b3JkIHRvIHVzZSBvbiB0aGUgdGVsbmV0IHNlcnZlci48L3RkPgorICAgICA8dGQ+T25seSBpZiB1c2VyaWQgaXMgc3BlY2lmaWVkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+c2VydmVyPC90ZD4KKyAgICAgPHRkPnRoZSBhZGRyZXNzIG9mIHRoZSByZW1vdGUgdGVsbmV0IHNlcnZlci48L3RkPgorICAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+cG9ydDwvdGQ+CisgICAgIDx0ZD50aGUgcG9ydCBudW1iZXIgb2YgdGhlIHJlbW90ZSB0ZWxuZXQgc2VydmVyLiBEZWZhdWx0cyB0byBwb3J0IDIzLjwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmluaXRpYWxDUjwvdGQ+CisgICAgIDx0ZD5zZW5kIGEgY3IgYWZ0ZXIgY29ubmVjdGluZyAoJnF1b3Q7eWVzJnF1b3Q7KS4gRGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDsuPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+dGltZW91dDwvdGQ+CisgICAgIDx0ZD5zZXQgYSBkZWZhdWx0IHRpbWVvdXQgdG8gd2FpdCBmb3IgYSByZXNwb25zZS4gU3BlY2lmaWVkIGluIHNlY29uZHMuIERlZmF1bHQgaXMgbm8gdGltZW91dC48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgorVGhlIGNvbW1hbmRzIHRvIHNlbmQgdG8gdGhlIHNlcnZlciwgYW5kIHJlc3BvbnNlcyB0byB3YWl0IGZvciwgYXJlCitkZXNjcmliZWQgYXMgbmVzdGVkIGVsZW1lbnRzLiAgCisKKzxoND5yZWFkPC9oND4KKworPHA+ZGVjbGFyZSAoYXMgYSB0ZXh0IGNoaWxkIG9mIHRoaXMgZWxlbWVudCkgYSBzdHJpbmcgdG8gd2FpdCBmb3IuCitUaGUgZWxlbWVudCBzdXBwb3J0cyB0aGUgdGltZW91dCBhdHRyaWJ1dGUsIHdoaWNoIG92ZXJyaWRlcyBhbnkKK3RpbWVvdXQgc3BlY2lmaWVkIGZvciB0aGUgdGFzayBhcyBhIHdob2xlLiBJdCBhbHNvIGhhcyBhIDx0dD5zdHJpbmc8L3R0PgorYXR0cmlidXRlLCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIHRoZSBzdHJpbmcgYXMgCithIHRleHQgZWxlbWVudC4KKzwvcD4KKzxpPkFsd2F5cyBkZWNsYXJlIGFuIG9wZW5pbmcgYW5kIGNsb3NpbmcKKzxjb2RlPiZsdDtyZWFkJmd0OzwvY29kZT4gZWxlbWVudCB0byBlbnN1cmUgdGhhdCBzdGF0ZW1lbnRzIGFyZSBub3Qgc2VudCBiZWZvcmUKK3RoZSBjb25uZWN0aW9uIGlzIHJlYWR5LCBhbmQgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBub3QgYnJva2VuIGJlZm9yZQordGhlIGZpbmFsIGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4KKzwvaT4KKzxoND53cml0ZTwvaDQ+CisKKzxwPmRlc2NyaWJlcyB0aGUgdGV4dCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuIFRoZSA8dHQ+ZWNobzwvdHQ+IGJvb2xlYW4KK2F0dHJpYnV0ZSBjb250cm9scyB3aGV0aGVyIHRoZSBzdHJpbmcgaXMgZWNob2VkIHRvIHRoZSBsb2NhbCBsb2c7IAordGhpcyBpcyAidHJ1ZSIgYnkgZGVmYXVsdAorPC9wPgorPGgzPkV4YW1wbGVzPC9oMz4KK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29ubmVjdGluZyB0byBhIHNlcnZlciBhbmQgcnVubmluZyBhIGNvbW1hbmQuICBUaGlzIGFzc3VtZXMKKyBhIHByb21wdCBvZiAmcXVvdDtvZ2luOiZxdW90OyBmb3IgdGhlIHVzZXJpZCwgYW5kIGEgcHJvbXB0IG9mICZxdW90O2Fzc3dvcmQ6JnF1b3Q7CisgZm9yIHRoZSBwYXNzd29yZC4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDt0ZWxuZXQgdXNlcmlkPSZxdW90O2JvYiZxdW90OyBwYXNzd29yZD0mcXVvdDtiYWRwYXNzJnF1b3Q7IHNlcnZlcj0mcXVvdDtsb2NhbGhvc3QmcXVvdDsmZ3Q7CisgICAmbHQ7cmVhZCZndDsvaG9tZS9ib2ImbHQ7L3JlYWQmZ3Q7CisgICAmbHQ7d3JpdGUmZ3Q7bHMmbHQ7L3dyaXRlJmd0OworICAgJmx0O3JlYWQgc3RyaW5nPSZxdW90Oy9ob21lL2JvYiZxdW90Oy8mZ3Q7CismbHQ7L3RlbG5ldCZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworVGhpcyB0YXNrIGNhbiBiZSByZXdyaXR0ZW4gYXM6Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3RlbG5ldCBzZXJ2ZXI9JnF1b3Q7bG9jYWxob3N0JnF1b3Q7Jmd0OworICAgJmx0O3JlYWQmZ3Q7b2dpbjombHQ7L3JlYWQmZ3Q7CisgICAmbHQ7d3JpdGUmZ3Q7Ym9iJmx0Oy93cml0ZSZndDsKKyAgICZsdDtyZWFkJmd0O2Fzc3dvcmQ6Jmx0Oy9yZWFkJmd0OworICAgJmx0O3dyaXRlJmd0O2JhZHBhc3MmbHQ7L3dyaXRlJmd0OworICAgJmx0O3JlYWQmZ3Q7L2hvbWUvYm9iJmx0Oy9yZWFkJmd0OworICAgJmx0O3dyaXRlJmd0O2xzJmx0Oy93cml0ZSZndDsKKyAgICZsdDtyZWFkJmd0Oy9ob21lL2JvYiZsdDsvcmVhZCZndDsKKyZsdDsvdGVsbmV0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCitBIHRpbWVvdXQgY2FuIGJlIHNwZWNpZmllZCBhdCB0aGUgPGNvZGU+Jmx0O3RlbG5ldCZndDs8L2NvZGU+IGxldmVsIG9yIGF0IHRoZSA8Y29kZT4mbHQ7cmVhZCZndDs8L2NvZGU+IGxldmVsLiAKK1RoaXMgd2lsbCBjb25uZWN0LCBpc3N1ZSBhIHNsZWVwIGNvbW1hbmQgdGhhdCBpcyBzdXBwcmVzc2VkIGZyb20gZGlzcGxheWluZyBhbmQgd2FpdCAKKzEwIHNlY29uZHMgYmVmb3JlIHF1aXR0aW5nLgorPGJsb2NrcXVvdGU+PHByZT4KKyZsdDt0ZWxuZXQgdXNlcmlkPSZxdW90O2JvYiZxdW90OyBwYXNzd29yZD0mcXVvdDtiYWRwYXNzJnF1b3Q7IHNlcnZlcj0mcXVvdDtsb2NhbGhvc3QmcXVvdDsgdGltZW91dD0mcXVvdDsyMCZxdW90OyZndDsKKyAgICZsdDtyZWFkJmd0Oy9ob21lL2JvYiZsdDsvcmVhZCZndDsKKyAgICZsdDt3cml0ZSBlY2hvPSZxdW90O2ZhbHNlJnF1b3Q7Jmd0O3NsZWVwIDE1Jmx0Oy93cml0ZSZndDsKKyAgICZsdDtyZWFkIHRpbWVvdXQ9JnF1b3Q7MTAmcXVvdDsmZ3Q7L2hvbWUvYm9iJmx0Oy9yZWFkJmd0OworJmx0Oy90ZWxuZXQmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKK1RoZSB0YXNrIGNhbiBiZSB1c2VkIHdpdGggb3RoZXIgcG9ydHMgYXMgd2VsbDoKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7dGVsbmV0IHBvcnQ9JnF1b3Q7ODAmcXVvdDsgc2VydmVyPSZxdW90O2xvY2FsaG9zdCZxdW90OyB0aW1lb3V0PSZxdW90OzIwJnF1b3Q7Jmd0OworICAgJmx0O3JlYWQvJmd0OworICAgJmx0O3dyaXRlJmd0O0dFVCAvIGh0dHAvMC45Jmx0Oy93cml0ZSZndDsKKyAgICZsdDt3cml0ZS8mZ3Q7CisgICAmbHQ7cmVhZCB0aW1lb3V0PSZxdW90OzEwJnF1b3Q7Jmd0OyZhbXA7bHQ7L0hUTUwmYW1wO2d0OyZsdDsvcmVhZCZndDsKKyZsdDsvdGVsbmV0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+CitUbyB1c2UgdGhpcyB0YXNrIGFnYWluc3QgdGhlIFdpbk5UIHRlbG5ldCBzZXJ2aWNlLCB5b3UgbmVlZCB0byBjb25maWd1cmUgdGhlIHNlcnZpY2UgdG8gdXNlIAorY2xhc3NpYyBhdXRoZW50aWNhdGlvbiByYXRoZXIgdGhhbiBOVExNIG5lZ290aWF0ZWQgYXV0aGVudGljYXRpb24uIAorVGhpcyBjYW4gYmUgZG9uZSBpbiB0aGUgVGVsbmV0IFNlcnZlciBBZG1pbiBhcHA6IAorc2VsZWN0ICJkaXNwbGF5L2NoYW5nZSByZWdpc3RyeSBzZXR0aW5ncyIsIHRoZW4gIk5UTE0iLCB0aGVuIHNldCB0aGUgdmFsdWUgb2YgTlRMTSB0byAxLgorPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy90cmFuc2xhdGUuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvdHJhbnNsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0MTAyMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvdHJhbnNsYXRlLmh0bWwKQEAgLTAsMCArMSwxODIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+VHJhbnNsYXRlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InRyYW5zbGF0ZSI+VHJhbnNsYXRlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+SWRlbnRpZmllcyBrZXlzIGluIGZpbGVzIGRlbGltaXRlZCBieSBzcGVjaWFsIHRva2VucworYW5kIHRyYW5zbGF0ZXMgdGhlbSB3aXRoIHZhbHVlcyByZWFkIGZyb20gcmVzb3VyY2UgYnVuZGxlcy4KKzwvcD4KKzxwPgorQSByZXNvdXJjZSBidW5kbGUgY29udGFpbnMgbG9jYWxlLXNwZWNpZmljIGtleS12YWx1ZSBwYWlycy4KK0EgcmVzb3VyY2UgYnVuZGxlIGlzIGEgaGllcmFyY2hpY2FsIHNldCBvZiBwcm9wZXJ0eSBmaWxlcy4KK0EgYnVuZGxlIG5hbWUgbWFrZXMgdXAgaXRzIGJhc2UgZmFtaWx5IG5hbWUuICBFYWNoIGZpbGUgdGhhdAorbWFrZXMgdXAgdGhpcyBidW5kbGUgaGFzIHRoaXMgbmFtZSBwbHVzIGl0cyBsb2NhbGUuICBGb3IgZXhhbXBsZSwKK2lmIHRoZSByZXNvdXJjZSBidW5kbGUgbmFtZSBpcyBNeVJlc291cmNlcywgdGhlIGZpbGUgdGhhdCBjb250YWlucworR2VybWFuIHRleHQgd2lsbCB0YWtlIHRoZSBuYW1lIE15UmVzb3VyY2VzX2RlLiAgSW4gYWRkaXRpb24gdG8KK2xhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50IGFyZSBhbHNvIHVzZWQgdG8gZm9ybSB0aGUgZmlsZXMgaW4KK3RoZSBidW5kbGUuCis8L3A+Cis8cD4KK1RoZSByZXNvdXJjZSBidW5kbGUgbG9va3VwIHNlYXJjaGVzIGZvciByZXNvdXJjZSBmaWxlcyB3aXRoIHZhcmlvdXMKK3N1ZmZpeGVzIG9uIHRoZSBiYXNpcyBvZiAoMSkgdGhlIGRlc2lyZWQgbG9jYWxlIGFuZCAoMikgdGhlIGRlZmF1bHQKK2xvY2FsZSAoYmFzZWJ1bmRsZW5hbWUpLCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGZyb20gbG93ZXItbGV2ZWwKKyhtb3JlIHNwZWNpZmljKSB0byBwYXJlbnQtbGV2ZWwgKGxlc3Mgc3BlY2lmaWMpOgorPC9wPgorPHByZT4KK2Jhc2VidW5kbGVuYW1lICsgJnF1b3Q7XyZxdW90OyArIGxhbmd1YWdlMSArICZxdW90O18mcXVvdDsgKyBjb3VudHJ5MSArICZxdW90O18mcXVvdDsgKyB2YXJpYW50MQorYmFzZWJ1bmRsZW5hbWUgKyAmcXVvdDtfJnF1b3Q7ICsgbGFuZ3VhZ2UxICsgJnF1b3Q7XyZxdW90OyArIGNvdW50cnkxCitiYXNlYnVuZGxlbmFtZSArICZxdW90O18mcXVvdDsgKyBsYW5ndWFnZTEKK2Jhc2VidW5kbGVuYW1lCitiYXNlYnVuZGxlbmFtZSArICZxdW90O18mcXVvdDsgKyBsYW5ndWFnZTIgKyAmcXVvdDtfJnF1b3Q7ICsgY291bnRyeTIgKyAmcXVvdDtfJnF1b3Q7ICsgdmFyaWFudDIKK2Jhc2VidW5kbGVuYW1lICsgJnF1b3Q7XyZxdW90OyArIGxhbmd1YWdlMiArICZxdW90O18mcXVvdDsgKyBjb3VudHJ5MgorYmFzZWJ1bmRsZW5hbWUgKyAmcXVvdDtfJnF1b3Q7ICsgbGFuZ3VhZ2UyCis8L3ByZT4KKzxwPgorVGhlIGZpbGUgbmFtZXMgZ2VuZXJhdGVkIHRodXMgYXJlIGFwcGVuZGVkIHdpdGggdGhlIHN0cmluZyAmcXVvdDsucHJvcGVydGllcyZxdW90OwordG8gbWFrZSB1cCB0aGUgZmlsZSBuYW1lcyB0aGF0IGFyZSB0byBiZSB1c2VkLgorPC9wPgorPHA+CitGaWxlIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gIFRoZSBlbmNvZGluZyBzY2hlbWUgb2YgdGhlIHNvdXJjZSBmaWxlcywKK2Rlc3RpbmF0aW9uIGZpbGVzIGFuZCB0aGUgYnVuZGxlIGZpbGVzIGNhbiBiZSBzcGVjaWZpZWQuCisKK0Rlc3RpbmF0aW9uIGZpbGVzIGNhbiBiZSBleHBsaWNpdGx5IG92ZXJ3cml0dGVuIHVzaW5nIHRoZQorPHZhcj5mb3JjZW92ZXJ3cml0ZTwvdmFyPiBhdHRyaWJ1dGUuICBJZiA8dmFyPmZvcmNlb3ZlcndyaXRlPC92YXI+CitpcyBmYWxzZSwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgb3ZlcndyaXR0ZW4gb25seSBpZiBlaXRoZXIgdGhlCitzb3VyY2UgZmlsZSBvciBhbnkgb2YgdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgYnVuZGxlIGhhdmUgYmVlbgorbW9kaWZpZWQgYWZ0ZXIgdGhlIGRlc3RpbmF0aW9uIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQuCis8L3A+Cis8cD4KKzxlbT5OZXcgaW4gQW50IDEuNjo8L2VtPjxicj4KK0xpbmUgZW5kaW5ncyBvZiBzb3VyY2UgZmlsZXMgYXJlIHByZXNlcnZlZCBpbiB0aGUgdHJhbnNsYXRlZCBmaWxlcy4KKzwvcD4KKzxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QgZmlsZXMgdG8KK3RyYW5zbGF0ZS4KKzwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRvZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSBkZXN0aW5hdGlvbiBmaWxlcyBhcmUKKyAgICAgIHRvIGJlIGNyZWF0ZWQuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN0YXJ0dG9rZW48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0YXJ0aW5nIHRva2VuIHRvIGlkZW50aWZ5IGtleXMuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmVuZHRva2VuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmRpbmcgdG9rZW4gdG8gaWRlbnRpZnkga2V5cy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YnVuZGxlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkZhbWlseSBuYW1lIG9mIHJlc291cmNlIGJ1bmRsZS48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YnVuZGxlbGFuZ3VhZ2U8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgIExvY2FsZSBzcGVjaWZpYyBsYW5ndWFnZSBvZiByZXNvdXJjZSBidW5kbGUuICBEZWZhdWx0cyB0bworICAgICAgICBkZWZhdWx0IGxvY2FsZSdzIGxhbmd1YWdlLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1bmRsZWNvdW50cnk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgIExvY2FsZSBzcGVjaWZpYyBjb3VudHJ5IG9mIHJlc291cmNlIGJ1bmRsZS4gIERlZmF1bHRzIHRvCisgICAgICAgIGRlZmF1bHQgbG9jYWxlJ3MgY291bnRyeS4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5idW5kbGV2YXJpYW50PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICBMb2NhbGUgc3BlY2lmaWMgdmFyaWFudCBvZiByZXNvdXJjZSBidW5kbGUuICBEZWZhdWx0cyB0bworICAgICAgICB0aGUgZGVmYXVsdCB2YXJpYW50IG9mIHRoZSBjb3VudHJ5IGFuZCBsYW5ndWFnZSBiZWluZyB1c2VkLgorICAgIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2VuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlNvdXJjZSBmaWxlIGVuY29kaW5nIHNjaGVtZS4gIERlZmF1bHRzIHRvCisgICAgc3lzdGVtIGRlZmF1bHQgZmlsZSBlbmNvZGluZy48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+RGVzdGluYXRpb24gZmlsZSBlbmNvZGluZyBzY2hlbWUuICBEZWZhdWx0cyB0bworICAgIHNvdXJjZSBmaWxlIGVuY29kaW5nLjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1bmRsZWVuY29kaW5nPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlJlc291cmNlIEJ1bmRsZSBmaWxlIGVuY29kaW5nIHNjaGVtZS4gIERlZmF1bHRzIHRvCisgICAgc291cmNlIGZpbGUgZW5jb2RpbmcuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yY2VvdmVyd3JpdGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uCisgICAgICBmaWxlcyBhcmUgbmV3ZXIuIERlZmF1bHRzIHRvICZxdW90O25vJnF1b3Q7LjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxoND5maWxlc2V0PC9oND4KKyA8cD48YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0czwvYT4gYXJlIHVzZWQgdG8gc2VsZWN0IGZpbGVzIHRoYXQKKyBjb250YWluIGtleXMgZm9yIHdoaWNoIHZhbHVlIHRyYW5zbGF0ZWQgZmlsZXMgYXJlIHRvIGJlIGdlbmVyYXRlZC4KKzwvcD4KKzxoMz5FeGFtcGxlczwvaDM+Cis8cD48Yj5UcmFuc2xhdGUgc291cmNlIGZpbGUgZW5jb2RlZCBpbiBlbmdsaXNoIGludG8gaXRzIGphcGFuZXNlCitlcXVpdmFsZW50IHVzaW5nIGEgcmVzb3VyY2UgYnVuZGxlIGVuY29kZWQgaW4gamFwYW5lc2UuCis8L2I+PC9wPgorPHByZT4KKyAgJmx0O3RyYW5zbGF0ZSB0b0Rpcj0mcXVvdDskKGRlc3QuZGlyfS9qYSZxdW90OworICAgICAgICBzdGFydHRva2VuPSZxdW90OyMmcXVvdDsKKyAgICAgICAgZW5kdG9rZW49JnF1b3Q7IyZxdW90OworICAgICAgICBidW5kbGU9JnF1b3Q7cmVzb3VyY2UvQmFzZVJlc291cmNlJnF1b3Q7CisgICAgICAgIGJ1bmRsZWxhbmd1YWdlPSZxdW90O2phJnF1b3Q7CisgICAgICAgIGZvcmNlb3ZlcndyaXRlPSZxdW90O3llcyZxdW90OworICAgICAgICBzcmNlbmNvZGluZz0mcXVvdDtJU084ODU5XzEmcXVvdDsKKyAgICAgICAgZGVzdGVuY29kaW5nPSZxdW90O1NKSVMmcXVvdDsKKyAgICAgICAgYnVuZGxlZW5jb2Rpbmc9JnF1b3Q7U0pJUyZxdW90OyZndDsKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7c3JjLmRpcn0mcXVvdDsmZ3Q7CisgICAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouanNwJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7L3RyYW5zbGF0ZSZndDsKKzwvcHJlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3ZiYy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy92YmMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQzZDRlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy92YmMuaHRtbApAQCAtMCwwICsxLDQ3MCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgIAorPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8dGl0bGU+VmJjCisgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiM1MjVENzYiCisgICAgICBhbGluaz0iIzUyNUQ3NiIgdmxpbms9IiM1MjVENzYiPgorCis8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjQiPgorCisgIDwhLS0gUEFHRSBIRUFERVIgLS0+CisgIDx0cj4KKyAgICA8dGQ+CisgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICA8Zm9udCBzaXplPSIrMyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48c3Ryb25nPlZiYworIFRhc2s8L3N0cm9uZz48L2ZvbnQ+CisgICAgICAgICAgICA8YnI+PGZvbnQgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5UaGlzIHRhc2sgY29tcGlsZXMgVmlzdWFsIEJhc2ljLk5FVCBzb3VyY2UgaW50byBleGVjdXRhYmxlcyBvciBtb2R1bGVzLiAgPHA+Rm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGUgcGF0dGVybiA8Y29kZT4qKi8qLnZiPC9jb2RlPiBpcyBwcmVzZXQgYXMgaW5jbHVkZXMgbGlzdCBhbmQgeW91IGNhbiBub3Qgb3ZlcnJpZGUgaXQgd2l0aCBhbiBleHBsaWNpdCBpbmNsdWRlcyBhdHRyaWJ1dGUuICBVc2UgbmVzdGVkIDxjb2RlPiZsdDtzcmMmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbnN0ZWFkIG9mIHRoZSBiYXNlZGlyIGF0dHJpYnV0ZSBpZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wuPC9wPjwvZm9udD4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDwhLS0gUFJPSkVDVCBMT0dPIC0tPgorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+CisgICAgICAgICAgICAgIDxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmIiBhbGlnbj0icmlnaHQiIGFsdD0iQXBhY2hlIEFudCIgYm9yZGVyPSIwIj4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICA8L3RkPgorICAgICAgPC90cj48L3RhYmxlPgorICAgIDwvdGQ+CisgIDwvdHI+CisKKyAgPCEtLSBTVEFSVCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KKyAgPHRyPgorICAgIDx0ZCAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKworICAgICAgICAgIDwhLS0gQXBwbHlpbmcgdGFzay9sb25nLWRlc2NyaXB0aW9uIC0tPgorICAgIDwhLS0gU3RhcnQgRGVzY3JpcHRpb24gLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0iZGVzY3JpcHRpb24iPgorICAgICAgICAgIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBUaGlzIHRhc2sgY29tcGlsZXMgVmlzdWFsIEJhc2ljLk5FVCBzb3VyY2UgaW50byBleGVjdXRhYmxlcyBvciBtb2R1bGVzLiBUaGUgdGFzayByZXF1aXJlcyB2YmMuZXhlIG9uIHRoZSBleGVjdXRlIHBhdGgsIHVubGVzcyBpdCBvciBhbiBlcXVpdmFsZW50IHByb2dyYW0gaXMgc3BlY2lmaWVkIGluIHRoZSA8dHQ+ZXhlY3V0YWJsZTwvdHQ+IHBhcmFtZXRlciA8cD4gQWxsIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsOiA8Y29kZT4mbHQ7dmJjLyZndDs8L2NvZGU+IHNob3VsZCBzdWZmaWNlIHRvIHByb2R1Y2UgYSBkZWJ1ZyBidWlsZCBvZiBhbGwgKi52YiBmaWxlcy4gPHA+IFRoZSB0YXNrIGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2ssIHNvIGF0dHJpYnV0ZXMgbGlrZSA8dHQ+aW5jbHVkZXM9JnF1b3Q7KipcLyoudmImcXVvdDs8L3R0PiBhbmQgPHR0PmV4Y2x1ZGVzPSZxdW90O2Jyb2tlbi52YiZxdW90OzwvdHQ+IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGZpbGVzIHB1bGxlZCBpbi4gQnkgZGVmYXVsdCwgYWxsICoudmIgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCBmb2xkZXIgZG93biBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvbW1hbmQuIFdoZW4gdGhpcyBoYXBwZW5zIHRoZSBkZXN0RmlsZSAtaWYgbm90IHNwZWNpZmllZC0gaXMgdGFrZW4gYXMgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIGxpc3QsIHdoaWNoIG1heSBiZSBzb21ld2hhdCBoYXJkIHRvIGNvbnRyb2wuIFNwZWNpZnlpbmcgdGhlIG91dHB1dCBmaWxlIHdpdGggPHR0PmRlc3RmaWxlPC90dD4gaXMgcHJ1ZGVudC4gPC9wPiA8cD4gQWxzbywgZGVwZW5kZW5jeSBjaGVja2luZyBvbmx5IHdvcmtzIGlmIGRlc3RmaWxlIGlzIHNldC4gQXMgd2l0aCA8Y29kZT4mbHQ7Y3NjJmd0OzwvY29kZT4gbmVzdGVkIDx0dD5zcmM8L3R0PiBmaWxlc2V0cyBvZiBzb3VyY2UsIHJlZmVyZW5jZSBmaWxlc2V0cywgZGVmaW5pdGlvbnMgYW5kIHJlc291cmNlcyBjYW4gYmUgcHJvdmlkZWQuIDxwPiBFeGFtcGxlIDwvcD4gPHByZT4mbHQ7dmJjIG9wdGltaXplPSZxdW90O3RydWUmcXVvdDsgZGVidWc9JnF1b3Q7ZmFsc2UmcXVvdDsgd2FybkxldmVsPSZxdW90OzQmcXVvdDsgdGFyZ2V0VHlwZT0mcXVvdDtleGUmcXVvdDsgZGVmaW5pdGlvbnM9JnF1b3Q7UkVMRUFTRSZxdW90OyBleGNsdWRlcz0mcXVvdDtzcmMvdW5pY29kZV9jbGFzcy52YiZxdW90OyBtYWluQ2xhc3MgPSAmcXVvdDtNYWluQXBwJnF1b3Q7IGRlc3RGaWxlPSZxdW90O05ldEFwcC5leGUmcXVvdDsgb3B0aW9uRXhwbGljaXQ9JnF1b3Q7dHJ1ZSZxdW90OyBvcHRpb25Db21wYXJlPSZxdW90O3RleHQmcXVvdDsgcmVmZXJlbmNlcz0iU3lzdGVtLlhtbCxTeXN0ZW0uV2ViLlhtbCIgJmd0OyAmbHQ7cmVmZXJlbmNlIGZpbGU9IiR7dGVzdENTQy5kbGx9Ii8mZ3Q7ICZsdDtkZWZpbmUgbmFtZT0iUkVMRUFTRSIvJmd0OyAmbHQ7ZGVmaW5lIG5hbWU9IkRFQlVHIiBpZj0iZGVidWcucHJvcGVydHkiLyZndDsgJmx0O2RlZmluZSBuYW1lPSJkZWYzIiB1bmxlc3M9ImRlZjIucHJvcGVydHkiLyZndDsgJmx0Oy92YmMmZ3Q7IDwvcHJlPgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRGVzY3JpcHRpb24gLS0+CisKKyAgICA8IS0tIFN0YXJ0IEF0dHJpYnV0ZXMgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImF0dHJpYnV0ZXMiPgorICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVyczwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+QXR0cmlidXRlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlR5cGU8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+UmVxdWlyZW1lbnQ8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAorICAgIAorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+YWRkaXRpb25hbG1vZHVsZXM8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlcyB0byByZWZlciB0by48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHJvd3NwYW49IjI0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+T3B0aW9uYWw8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5kZWJ1ZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNldCB0aGUgZGVidWcgZmxhZyBvbiBvciBvZmYuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmRlc3RkaXI8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiBmaWxlcyB0byBiZSBjb21waWxlZC48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZGVzdGZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXQgdGhlIG5hbWUgb2YgZXhlL2xpYnJhcnkgdG8gY3JlYXRlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5leGVjdXRhYmxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtLCBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cy4gQ2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBmdWxsIHBhdGggdG8gYSBwcm9ncmFtLCBvciB0byBzd2l0Y2ggdG8gYW4gYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kLCBzdWNoIGFzIHRoZSBNb25vIG9yIFJvdG9yIHZlcnNpb25zIC1wcm92aWRlZCB0aGV5IHVzZSB0aGUgc2FtZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFzIHRoZSAuTkVUIGZyYW1ld29yayBlZGl0aW9uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZXh0cmFvcHRpb25zPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+QW55IGV4dHJhIG9wdGlvbnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IHN1cHBvcnRlZCBieSB0aGlzIHRhc2suPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZmFpbG9uZXJyb3I8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5JZiB0cnVlLCBmYWlsIG9uIGNvbXBpbGF0aW9uIGVycm9ycy48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+aW1wb3J0czwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkRlY2xhcmUgZ2xvYmFsIGltcG9ydHMgZm9yIG5hbWVzcGFjZXMgaW4gcmVmZXJlbmNlZCBtZXRhZGF0YSBmaWxlcy48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5pbmNsdWRlZGVmYXVsdHJlZmVyZW5jZXM8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5JZiB0cnVlLCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBjb21tb24gYXNzZW1ibGllcyBpbiBkb3RuZXQsIGFuZCB0ZWxscyB0aGUgY29tcGlsZXIgdG8gbGluayBpbiBtc2NvcmUuZGxsLiBzZXQgdGhlIGF1dG9tYXRpYyByZWZlcmVuY2UgaW5jbHVzaW9uIGZsYWcgb24gb3Igb2ZmIHRoaXMgZmxhZyBjb250cm9scyB0aGUgL25vc3RkbGliIG9wdGlvbiBpbiBDU0M8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bWFpbmNsYXNzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0cyB0aGUgbmFtZSBvZiBtYWluIGNsYXNzIGZvciBleGVjdXRhYmxlcy48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5vcHRpbWl6ZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPklmIHRydWUsIGVuYWJsZXMgb3B0aW1pemF0aW9uIGZsYWcuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm9wdGlvbmNvbXBhcmU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TcGVjaWZ5IGJpbmFyeS0gb3IgdGV4dC1zdHlsZSBzdHJpbmcgY29tcGFyaXNvbnMuIERlZmF1bHRzIHRvICJiaW5hcnkiPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+b3B0aW9uZXhwbGljaXQ8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5XaGV0aGVyIHRvIHJlcXVpcmUgZXhwbGljaXQgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5vcHRpb25zdHJpY3Q8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5FbmZvcmNlIHN0cmljdCBsYW5ndWFnZSBzZW1hbnRpY3MuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnJlZmVyZW5jZWZpbGVzPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+UGF0aCBvZiByZWZlcmVuY2VzIHRvIGluY2x1ZGUuIFdpbGRjYXJkcyBzaG91bGQgd29yay48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5QYXRoPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+cmVmZXJlbmNlczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBETExzIHRvIHJlZmVyIHRvLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnJlbW92ZWludGNoZWNrczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPldoZXRoZXIgdG8gcmVtb3ZlIGludGVnZXIgY2hlY2tzLiBEZWZhdWx0IGZhbHNlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5yb290bmFtZXNwYWNlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3BlY2lmaWVzIHRoZSByb290IG5hbWVzcGFjZSBmb3IgYWxsIHR5cGUgZGVjbGFyYXRpb25zLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNyY2RpcjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldCB0aGUgc291cmNlIGRpcmVjdG9yeSBvZiB0aGUgZmlsZXMgdG8gYmUgY29tcGlsZWQuPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnRhcmdldHR5cGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zZXQgdGhlIHRhcmdldCB0eXBlIHRvIG9uZSBvZiBleGV8bGlicmFyeXxtb2R1bGV8d2luZXhlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ImV4ZSIsICJsaWJyYXJ5IiwgIm1vZHVsZSIsICJ3aW5leGUiPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+dXRmOG91dHB1dDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPklmIHRydWUsIHJlcXVpcmUgYWxsIGNvbXBpbGVyIG91dHB1dCB0byBiZSBpbiBVVEY4IGZvcm1hdC48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+d2FybmxldmVsPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+TGV2ZWwgb2Ygd2FybmluZyBjdXJyZW50bHkgYmV0d2VlbiAxIGFuZCA0IHdpdGggNCBiZWluZyB0aGUgc3RyaWN0ZXN0LjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmludDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPndpbjMyaWNvbjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldCB0aGUgZmlsZW5hbWUgb2YgaWNvbiB0byBpbmNsdWRlLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj53aW4zMnJlczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldHMgdGhlIGZpbGVuYW1lIG9mIGEgd2luMzIgcmVzb3VyY2UgKC5SRVMpIGZpbGUgdG8gaW5jbHVkZS4gVGhpcyBpcyBub3QgYSAuTkVUIHJlc291cmNlLCBidXQgd2hhdCBXaW5kb3dzIGlzIHVzZWQgdG8uPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorCisKKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEF0dHJpYnV0ZXMgLS0+CisKKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnRzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImVsZW1lbnRzIj4KKyAgICAgICAgICA8c3Ryb25nPlBhcmFtZXRlcnMgYXMgbmVzdGVkIGVsZW1lbnRzPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnQgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzgyOERBNiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiIHNpemU9Ii0xIj4KKyAgICAgICAgICA8c3Ryb25nPmRlZmluZTwvc3Ryb25nPiAob3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0LkRvdG5ldERlZmluZSk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBhZGQgYSBkZWZpbmUgdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+cmVmZXJlbmNlPC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0KTwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIGFkZCBhIG5ldyByZWZlcmVuY2UgZmlsZXNldCB0byB0aGUgY29tcGlsYXRpb24KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+cmVzb3VyY2U8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5Eb3RuZXRSZXNvdXJjZSk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICBsaW5rIG9yIGVtYmVkIGEgcmVzb3VyY2UKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KKyAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgorICAgICAgICAgIDxzdHJvbmc+c3JjPC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0KTwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIGFkZCBhIG5ldyBzb3VyY2UgZGlyZWN0b3J5IHRvIHRoZSBjb21waWxlCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KKworICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudHMgLS0+CisKKworICAgIDwvdGQ+CisgIDwvdHI+CisgIDwhLS0gRU5EIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorCis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3Zzcy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy92c3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNlYTBjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy92c3MuaHRtbApAQCAtMCwwICsxLDgyMyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+TWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlKFZTUykgVGFza3M8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+TWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlIFRhc2tzIFVzZXIgTWFudWFsPC9oMT4KKzxwPmJ5PC9wPgorPHVsPgorICAgIDxsaT5DcmFpZyBDb3R0aW5naGFtPC9saT4KKyAgICA8bGk+QW5kcmV3IEV2ZXJpdHQ8L2xpPgorICAgIDxsaT5CYWxhenMgRmVqZXMgMjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Im1haWx0bzpHbGVubl9Ud2lnZ3NAYm1jLmNvbSI+R2xlbm5fVHdpZ2dzQGJtYy5jb208L2E+PC9saT4KKyAgICA8bGk+TWFydGluIFBvZXNjaGwgKDxhIGhyZWY9Im1haWx0bzptcG9lc2NobEBtYXJtb3QuYXQiPm1wb2VzY2hsQG1hcm1vdC5hdDwvYT4pPC9saT4KKyAgICA8bGk+UGhpbGxpcCBXZWxsczwvbGk+CisgICAgPGxpPkpvbiBTa2VldCAoPGEgaHJlZj0ibWFpbHRvOmpvbi5za2VldEBwZXJhbW9uLmNvbSI+am9uLnNrZWV0QHBlcmFtb24uY29tPC9hPik8L2xpPgorICAgIDxsaT5OaWdlbCBNYWduYXkgKDxhIGhyZWY9Im1haWx0bzpuaWdlbC5tYWduYXlAcGFyc2VjLmNvLnVrIj5uaWdlbC5tYWduYXlAcGFyc2VjLmNvLnVrPC9hPik8L2xpPgorICAgIDxsaT5HYXJ5IFMuIFdlYXZlcjwvbGk+CisgICAgPGxpPkplc3NlIFN0b2NrYWxsPC9saT4KKyA8L3VsPgorPGhyPgorPGgyPkNvbnRlbnRzPC9oMj4KKzx1bD4KKyAgICA8bGk+PGEgaHJlZj0iI2ludHJvIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iI3Rhc2tzIj5UaGUgVGFza3M8L2E+PC9saT4KKzwvdWw+Cis8YnI+Cis8aDI+PGEgbmFtZT0iaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2gyPgorPHA+VGhlc2UgdGFza3MgcHJvdmlkZSBhbiBpbnRlcmZhY2UgdG8gdGhlCis8YSBocmVmPSJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3NzYWZlL2RlZmF1bHQuYXNwIiB0YXJnZXQ9Il90b3AiPk1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZTwvYT4gU0NNLgorVGhlIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzczwvY29kZT4gcGFja2FnZSBjb25zaXN0cyBvZiBhIHNpbXBsZSBmcmFtZXdvcmsgdG8gc3VwcG9ydAordnNzIGZ1bmN0aW9uYWxpdHkgYXMgd2VsbCBhcyBzb21lIEFudCB0YXNrcyBlbmNhcHN1bGF0aW5nIGZyZXF1ZW50bHkgdXNlZCB2c3MgY29tbWFuZHMuCitBbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlc2UgY29tbWFuZHMgb24gdGhlIGRlc2t0b3AsCit0aGV5IHdlcmUgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgYXV0b21hdGVkIGJ1aWxkIHN5c3RlbXMuPC9wPgorPHA+CitJZiB5b3UgZ2V0IGEgQ3JlYXRlUHJvY2Vzc3MgSU9FcnJvcj0yIHdoZW4gcnVubmluZyB0aGVzZSwgaXQgbWVhbnMKK3RoYXQgc3MuZXhlIHdhcyBub3QgZm91bmQuIENoZWNrIHRvIHNlZSBpZiB5b3UgY2FuIHJ1biBpdCBmcm9tIHRoZQorY29tbWFuZCBsaW5lIC15b3UgbWF5IG5lZWQgdG8gYWx0ZXIgeW91ciBwYXRoLCBvciBzZXQgdGhlIDx0dD5zc2RpcjwvdHQ+Citwcm9wZXJ0eS4KKzxoMj48YSBuYW1lPSJ0YXNrcyI+VGhlIFRhc2tzPC9hPjwvaDI+CisKKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI3Zzc2dldCI+dnNzZ2V0PC9hPjwvdGQ+CisgICAgICAgIDx0ZD5SZXRyaWV2ZXMgYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgVlNTIGZpbGUocykuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiN2c3NsYWJlbCI+dnNzbGFiZWw8L2E+PC90ZD4KKyAgICAgICAgPHRkPkFzc2lnbnMgYSBsYWJlbCB0byB0aGUgc3BlY2lmaWVkIHZlcnNpb24gb3IgY3VycmVudCB2ZXJzaW9uIG9mIGEgZmlsZSBvciBwcm9qZWN0LjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjdnNzaGlzdG9yeSI+dnNzaGlzdG9yeTwvYT48L3RkPgorICAgICAgICA8dGQ+U2hvd3MgdGhlIGhpc3Rvcnkgb2YgYSBmaWxlIG9yIHByb2plY3QgaW4gVlNTLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjdnNzY2hlY2tpbiI+dnNzY2hlY2tpbjwvYT48L3RkPgorICAgICAgICA8dGQ+VXBkYXRlcyBWU1Mgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gYSBjaGVja2VkIG91dCBmaWxlLCBhbmQgdW5sb2NrcyB0aGUgVlNTIG1hc3RlciBjb3B5LjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjdnNzY2hlY2tvdXQiPnZzc2NoZWNrb3V0PC9hPjwvdGQ+CisgICAgICAgIDx0ZD5Db3BpZXMgYSBmaWxlIGZyb20gdGhlIGN1cnJlbnQgcHJvamVjdCB0byB0aGUgY3VycmVudCBmb2xkZXIsIGZvciB0aGUgcHVycG9zZSBvZiBlZGl0aW5nLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjdnNzYWRkIj52c3NhZGQ8L2E+PC90ZD4KKyAgICAgICAgPHRkPkFkZHMgYSBuZXcgZmlsZSBpbnRvIHRoZSBWU1MgQXJjaGl2ZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjdnNzY3AiPnZzc2NwPC9hPjwvdGQ+CisgICAgICAgIDx0ZD5DaGFuZ2UgdGhlIGN1cnJlbnQgcHJvamVjdCBiZWluZyB1c2VkIGluIFZTUzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48YSBocmVmPSIjdnNzY3JlYXRlIj52c3NjcmVhdGU8L2E+PC90ZD4KKyAgICAgICAgPHRkPkNyZWF0ZXMgYSBwcm9qZWN0IGluIFZTUy48L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorCis8aHI+Cis8aDI+VGFzayBEZXNjcmlwdGlvbnM8L2gyPgorCis8IS0tIFZTU0dFVCAtLT4KKworPGgyPjxhIG5hbWU9InZzc2dldCI+VnNzR2V0PC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIEdFVCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCis8cD5JZiB5b3Ugc3BlY2lmeSB0d28gb3IgbW9yZSBhdHRyaWJ1dGVzIGZyb20gdmVyc2lvbiwgZGF0ZSBhbmQKK2xhYmVsIG9ubHkgb25lIHdpbGwgYmUgdXNlZCBpbiB0aGUgb3JkZXIgdmVyc2lvbiwgZGF0ZSwgbGFiZWwuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPnZzc3BhdGg8L3RkPgorICAgICA8dGQ+U291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvCisgICAgICAgICBwZXJmb3JtIHRoZSBhY3Rpb24gb24uPC90ZD4KKyAgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmxvZ2luPC90ZD4KKyAgICAgPHRkPnVzZXJuYW1lWyxwYXNzd29yZF0gLSBUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG5lZWRlZCB0byBnZXQgYWNjZXNzCisgICAgICAgICB0byBWU1MuIE5vdGUgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBib3RoIChpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkKSAtCisgICAgICAgICBBbnQvVlNTIHdpbGwgaGFuZyBpZiB5b3UgbGVhdmUgdGhlIHBhc3N3b3JkIG91dCBhbmQgVlNTIGRvZXMgbm90IGFjY2VwdAorICAgICAgICAgbG9naW4gd2l0aG91dCBhIHBhc3N3b3JkLiA8L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5sb2NhbHBhdGg8L3RkPgorICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+c3NkaXI8L3RkPgorICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUKKyAgICAgICAgIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KKyAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcmNzYWZlLmluaTwvY29kZT4gcmVzaWRlcy48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD53cml0YWJsZTwvdGQ+CisgICAgIDx0ZD50cnVlIG9yIGZhbHNlOyBkZWZhdWx0IGZhbHNlPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICAgPHRkPnRydWUgb3IgZmFsc2U7IGRlZmF1bHQgZmFsc2UuIE5vdGUgaG93ZXZlciB0aGF0IGluIHRoZSBTb3VyY2VTYWZlIFVJCisgICAgICwgdGhlcmUgaXMgYSBzZXR0aW5nIGFjY2Vzc2VkIHZpYSBUb29scy9PcHRpb25zL0dlbmVyYWxUYWIgY2FsbGVkCisgICAgICZxdW90O0FjdCBvbiBwcm9qZWN0cyByZWN1cnNpdmVseSZxdW90Oy4gIElmIHRoaXMgc2V0dGluZyBpcyBjaGVja2VkLAorICAgICB0aGVuIHRoZSByZWN1cnNpdmUgYXR0cmlidXRlIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQsIGFuZCB0aGUgZ2V0CisgICAgIHdpbGwgYWx3YXlzIGJlIGRvbmUgcmVjdXJzaXZlbHkKKyAgICAgPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+dmVyc2lvbjwvdGQ+CisgICAgIDx0ZD5hIHZlcnNpb24gbnVtYmVyIHRvIGdldDwvdGQ+CisgICAgIDx0ZCByb3dzcGFuPSIzIj5Obywgb25seSBvbmUgb2YgdGhlc2UgYWxsb3dlZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmRhdGU8L3RkPgorICAgICA8dGQ+YSBkYXRlIHN0YW1wIHRvIGdldCBhdDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmxhYmVsPC90ZD4KKyAgICAgPHRkPmEgbGFiZWwgdG8gZ2V0IGZvcjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPnF1aWV0PC90ZD4KKyAgICAgPHRkPnN1cHByZXNzIG91dHB1dCAob2ZmIGJ5IGRlZmF1bHQpPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+YXV0b3Jlc3BvbnNlPC90ZD4KKyAgICAgPHRkPldoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLiBCeSBkZWZhdWx0LCAtSS0gaXMKKyAgICAgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD53cml0YWJsZWZpbGVzPC90ZD4KKyAgICA8dGQ+QmVoYXZpb3Igd2hlbiBsb2NhbCBmaWxlcyBhcmUgd3JpdGFibGUuIFZhbGlkIG9wdGlvbnMgYXJlOiA8Y29kZT5yZXBsYWNlPC9jb2RlPiwgCisgICAgICAgIDxjb2RlPnNraXA8L2NvZGU+IGFuZCA8Y29kZT5mYWlsPC9jb2RlPjsgRGVmYXVsdHMgdG8gPGNvZGU+ZmFpbDwvY29kZT4KKyAgICAgICAgPGJyPjxjb2RlPnNraXA8L2NvZGU+IGltcGxpZXMgPGNvZGU+ZmFpbG9uZXJyb3I9ZmFsc2U8L2NvZGU+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQ+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHNzLmV4ZSBleGl0cyB3aXRoIGEgcmV0dXJuY29kZSBvZiAxMDAuIERlZmF1bHRzIHRvIHRydWU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmlsZXRpbWVzdGFtcDwvdGQ+CisgICAgPHRkPlNldCB0aGUgYmVoYXZpb3IgZm9yIHRpbWVzdGFtcHMgb2YgbG9jYWwgZmlsZXMuIFZhbGlkIG9wdGlvbnMgYXJlIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LCAKKyAgICAgICAgPGNvZGU+bW9kaWZpZWQ8L2NvZGU+LCBvciA8Y29kZT51cGRhdGVkPC9jb2RlPi4gRGVmYXVsdHMgdG8gPGNvZGU+Y3VycmVudDwvY29kZT4uPC90ZD4gCisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8cD5Ob3RlIHRoYXQgb25seSBvbmUgb2YgdmVyc2lvbiwgZGF0ZSBvciBsYWJlbCBzaG91bGQgYmUgc3BlY2lmaWVkPC9wPgorPGgzPkV4YW1wbGVzPC9oMz4KKzxibG9ja3F1b3RlPgorPHByZT4KKyZsdDt2c3NnZXQgbG9jYWxQYXRoPSZxdW90O0M6XG15c3JjXG15cHJvamVjdCZxdW90OworICAgICAgICByZWN1cnNpdmU9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICBsYWJlbD0mcXVvdDtSZWxlYXNlMSZxdW90OworICAgICAgICBsb2dpbj0mcXVvdDttZSxteXBhc3N3b3JkJnF1b3Q7CisgICAgICAgIHZzc3BhdGg9JnF1b3Q7JC9zb3VyY2UvYVByb2plY3QmcXVvdDsKKyAgICAgICAgd3JpdGFibGU9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPkRvZXMgYSBnZXQgb24gdGhlIFZTUy1Qcm9qZWN0IDxpPiQvc291cmNlL215cHJvamVjdDwvaT4gdXNpbmcgdGhlIHVzZXJuYW1lCis8aT5tZTwvaT4gYW5kIHRoZSBwYXNzd29yZCA8aT5teXBhc3N3b3JkPC9pPi4gSXQgd2lsbCByZWN1cnNpdmVseSBnZXQgdGhlIGZpbGVzCit3aGljaCBhcmUgbGFiZWxlZCA8aT5SZWxlYXNlMTwvaT4gYW5kIHdyaXRlIHRoZW0gdG8gdGhlIGxvY2FsIGRpcmVjdG9yeQorPGk+QzpcbXlzcmNcbXlwcm9qZWN0PC9pPi4gVGhlIGxvY2FsIGZpbGVzIHdpbGwgYmUgd3JpdGFibGUuPC9wPgorPGhyPgorCis8IS0tIFZTU0xBQkVMIC0tPgorCis8aDI+PGEgbmFtZT0idnNzbGFiZWwiPlZzc0xhYmVsPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIExBQkVMIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KKzxwPkFzc2lnbnMgYSBsYWJlbCB0byB0aGUgc3BlY2lmaWVkIHZlcnNpb24gb3IgY3VycmVudCB2ZXJzaW9uIG9mIGEgZmlsZSBvcgorcHJvamVjdC48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgPHRyPgorICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD52c3NwYXRoPC90ZD4KKyAgICAgPHRkPlNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0bworICAgICAgICAgcGVyZm9ybSB0aGUgYWN0aW9uIG9uLjwvdGQ+CisgICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5sb2dpbjwvdGQ+CisgICAgIDx0ZD51c2VybmFtZVsscGFzc3dvcmRdIC0gVGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBuZWVkZWQgdG8gZ2V0IGFjY2VzcworICAgICAgICAgdG8gVlNTLiBOb3RlIHRoYXQgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgYm90aCAoaWYgeW91IGhhdmUgYSBwYXNzd29yZCkgLQorICAgICAgICAgQW50L1ZTUyB3aWxsIGhhbmcgaWYgeW91IGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQKKyAgICAgICAgIGxvZ2luIHdpdGhvdXQgYSBwYXNzd29yZC4gPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+c3NkaXI8L3RkPgorICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUKKyAgICAgICAgIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KKyAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcmNzYWZlLmluaTwvY29kZT4gcmVzaWRlcy48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmxhYmVsPC90ZD4KKyAgICAgIDx0ZD5BIGxhYmVsIHRvIGFwcGx5IHRvIHRoZSBoaWVyYXJjaHk8L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPnZlcnNpb248L3RkPgorICAgICAgPHRkPkFuIGV4aXN0aW5nIGZpbGUgb3IgcHJvamVjdCB2ZXJzaW9uIHRvIGxhYmVsLiBCeSBkZWZhdWx0IHRoZSBjdXJyZW50CisgICAgICB2ZXJzaW9uIGlzIGxhYmVsZWQuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgICAgPHRkPlRoZSBjb21tZW50IHRvIHVzZSBmb3IgdGhpcyBsYWJlbC4gRW1wdHkgb3IgJy0nIGZvciBubyBjb21tZW50LjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+YXV0b3Jlc3BvbnNlPC90ZD4KKyAgICAgPHRkPldoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLiBCeSBkZWZhdWx0LCAtSS0gaXMKKyAgICAgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiBzcy5leGUgZXhpdHMgd2l0aCBhIHJldHVybmNvZGUgb2YgMTAwLiBEZWZhdWx0cyB0byB0cnVlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7dnNzbGFiZWwgdnNzcGF0aD0mcXVvdDskL3NvdXJjZS9hUHJvamVjdCZxdW90OworICAgICAgICAgIGxvZ2luPSZxdW90O21lLG15cGFzc3dvcmQmcXVvdDsKKyAgICAgICAgICBsYWJlbD0mcXVvdDtSZWxlYXNlMSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPkxhYmVscyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBWU1MgcHJvamVjdCA8aT4kL3NvdXJjZS9hUHJvamVjdDwvaT4gd2l0aAordGhlIGxhYmVsIDxpPlJlbGVhc2UxPC9pPiB1c2luZyB0aGUgdXNlcm5hbWUgPGk+bWU8L2k+IGFuZCB0aGUgcGFzc3dvcmQKKzxpPm15cGFzc3dvcmQ8L2k+LgorPC9wPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O3Zzc2xhYmVsIHZzc3BhdGg9JnF1b3Q7JC9zb3VyY2UvYVByb2plY3QvbXlmaWxlLnR4dCZxdW90OworICAgICAgICAgIHZlcnNpb249JnF1b3Q7NCZxdW90OworICAgICAgICAgIGxhYmVsPSZxdW90OzEuMDMuMDA0JnF1b3Q7LyZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+TGFiZWxzIHZlcnNpb24gNCBvZiB0aGUgVlNTIGZpbGUgPGk+JC9zb3VyY2UvYVByb2plY3QvbXlmaWxlLnR4dDwvaT4gd2l0aCB0aGUKK2xhYmVsIDxpPjEuMDMuMDA0PC9pPi4gSWYgdGhpcyB2ZXJzaW9uIGFscmVhZHkgaGFzIGEgbGFiZWwsIHRoZSBvcGVyYXRpb24gKGFuZAordGhlIGJ1aWxkKSB3aWxsIGZhaWwuCis8L3A+Cis8aHI+CisKKzwhLS0gVlNTSElTVE9SWSAtLT4KKworPGgyPjxhIG5hbWU9InZzc2hpc3RvcnkiPlZzc0hpc3Rvcnk8L2E+PC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CitUYXNrIHRvIHBlcmZvcm0gSElTVE9SWSBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+dnNzcGF0aDwvdGQ+CisgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8KKyAgICAgICAgIHBlcmZvcm0gdGhlIGFjdGlvbiBvbi48L3RkPgorICAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+bG9naW48L3RkPgorICAgICA8dGQ+dXNlcm5hbWVbLHBhc3N3b3JkXSAtIFRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbmVlZGVkIHRvIGdldCBhY2Nlc3MKKyAgICAgICAgIHRvIFZTUy4gTm90ZSB0aGF0IHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IGJvdGggKGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQpIC0KKyAgICAgICAgIEFudC9WU1Mgd2lsbCBoYW5nIGlmIHlvdSBsZWF2ZSB0aGUgcGFzc3dvcmQgb3V0IGFuZCBWU1MgZG9lcyBub3QgYWNjZXB0CisgICAgICAgICBsb2dpbiB3aXRob3V0IGEgcGFzc3dvcmQuIDwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPnNzZGlyPC90ZD4KKyAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXMuIEJ5IGRlZmF1bHQgdGhlCisgICAgICAgICB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+c2VydmVyUGF0aDwvdGQ+CisgICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jjc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXMuPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mcm9tRGF0ZTwvdGQ+CisgICAgPHRkPlN0YXJ0IGRhdGUgZm9yIGNvbXBhcmlzb248L3RkPgorICAgIDx0ZD5TZWUgYmVsb3c8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnRvRGF0ZTwvdGQ+CisgICAgPHRkPkVuZCBkYXRlIGZvciBjb21wYXJpc29uPC90ZD4KKyAgICA8dGQ+U2VlIGJlbG93PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5kYXRlRm9ybWF0PC90ZD4KKyAgICA8dGQ+Rm9ybWF0IG9mIGRhdGVzIGluIGZyb21EYXRlIGFuZCB0b0RhdGUuIFVzZWQgd2hlbiBjYWxjdWxhdGluZyBkYXRlcyB3aXRoCisgICAgICB0aGUgbnVtZGF5cyBhdHRyaWJ1dGUuIFRoaXMgc3RyaW5nIHVzZXMgdGhlIGZvcm1hdHRpbmcgcnVsZXMgb2YgU2ltcGxlRGF0ZUZvcm1hdC4KKyAgICAgIERlZmF1bHRzIHRvIERhdGVGb3JtYXQuU0hPUlQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZyb21MYWJlbDwvdGQ+CisgICAgPHRkPlN0YXJ0IGxhYmVsIGZvciBjb21wYXJpc29uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnRvTGFiZWw8L3RkPgorICAgIDx0ZD5TdGFydCBsYWJlbCBmb3IgY29tcGFyaXNvbjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5udW1kYXlzPC90ZD4KKyAgICA8dGQ+VGhlIG51bWJlciBvZiBkYXlzIGZvciBjb21wYXJpc29uLjwvdGQ+CisgICAgPHRkPlNlZSBiZWxvdzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+b3V0cHV0PC90ZD4KKyAgICA8dGQ+RmlsZSB0byB3cml0ZSB0aGUgZGlmZi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICA8dGQ+dHJ1ZSBvciBmYWxzZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zdHlsZTwvdGQ+CisgICAgPHRkPmJyaWVmLCBjb2RlZGlmZiwgZGVmYXVsdCBvciBub2ZpbGUuIFRoZSBkZWZhdWx0IGlzIGRlZmF1bHQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnVzZXI8L3RkPgorICAgIDx0ZD5OYW1lIHRoZSB1c2VyIHdob3NlIGNoYW5nZXMgd2Ugd291bGQgbGlrZSB0byBzZWU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgc3MuZXhlIGV4aXRzIHdpdGggYSByZXR1cm5jb2RlIG9mIDEwMC4gRGVmYXVsdHMgdG8gdHJ1ZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5TcGVjaWZ5aW5nIHRoZSB0aW1lLWZyYW1lPC9oND4KKzxwPlRoZXJlIGFyZSBkaWZmZXJlbnQgd2F5cyB0byBzcGVjaWZ5IHdoYXQgdGltZS1mcmFtZSB5b3Ugd2lzaCB0byBldmFsdWF0ZTo8L3A+Cis8dWw+CisgIDxsaT5DaGFuZ2VzIGJldHdlZW4gdHdvIGRhdGVzOiBTcGVjaWZ5IGJvdGggPGNvZGU+ZnJvbURhdGU8L2NvZGU+IGFuZCA8Y29kZT50b0RhdGU8L2NvZGU+IDwvbGk+CisgIDxsaT5DaGFuZ2VzIGJlZm9yZSBhIGRhdGU6IFNwZWNpZnkgPGNvZGU+dG9EYXRlPC9jb2RlPjwvbGk+CisgIDxsaT5DaGFuZ2VzIGFmdGVyIGEgZGF0ZTogU3BlY2lmeSA8Y29kZT5mcm9tRGF0ZTwvY29kZT48L2xpPgorICA8bGk+Q2hhbmdlcyBYIERheXMgYmVmb3JlIGEgZGF0ZTogU3BlY2lmeSA8Y29kZT50b0RhdGU8L2NvZGU+IGFuZCAobmVnYXRpdmUhKSA8Y29kZT5udW1EYXlzPC9jb2RlPjwvbGk+CisgIDxsaT5DaGFuZ2VzIFggRGF5cyBhZnRlciBhIGRhdGU6IFNwZWNpZnkgPGNvZGU+ZnJvbURhdGU8L2NvZGU+IGFuZCA8Y29kZT5udW1EYXlzPC9jb2RlPjwvbGk+Cis8L3VsPgorCisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKyAgPHByZT4KKyZsdDt2c3NoaXN0b3J5IHZzc3BhdGg9JnF1b3Q7JC9teVByb2plY3QmcXVvdDsgcmVjdXJzaXZlPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgIGZyb21MYWJlbD0mcXVvdDtSZWxlYXNlMSZxdW90OworICAgICAgICAgICAgdG9MYWJlbD0mcXVvdDtSZWxlYXNlMiZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPlNob3dzIGFsbCBjaGFuZ2VzIGJldHdlZW4gJnF1b3Q7UmVsZWFzZTEmcXVvdDsgYW5kICZxdW90O1JlbGVhc2UyJnF1b3Q7LjwvcD4KKworPGJsb2NrcXVvdGU+CisgIDxwcmU+CismbHQ7dnNzaGlzdG9yeSB2c3NwYXRoPSZxdW90OyQvbXlQcm9qZWN0JnF1b3Q7IHJlY3Vyc2l2ZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgICBmcm9tRGF0ZT0mcXVvdDswMS4wMS4yMDAxJnF1b3Q7CisgICAgICAgICAgICB0b0RhdGU9JnF1b3Q7MzEuMDMuMjAwMSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPlNob3dzIGFsbCBjaGFuZ2VzIGJldHdlZW4gSmFudWFyeSAxc3QgMjAwMSBhbmQgTWFyY2ggMzFzdCAyMDAxIChpbiBHZXJtYW55LCBkYXRlIG11c3QgYmUgc3BlY2lmaWVkIGFjY29yZGluZyB0byB5b3VyIGxvY2FsZSkuPC9wPgorCis8YmxvY2txdW90ZT4KKyAgPHByZT4KKyZsdDt0c3RhbXAmZ3Q7CisgICZsdDtmb3JtYXQgcHJvcGVydHk9JnF1b3Q7dG8udHN0YW1wJnF1b3Q7IHBhdHRlcm49JnF1b3Q7TS1kLXl5O2g6bW1hJnF1b3Q7LyZndDsKKyZsdDsvdHN0YW1wJmd0OworCismbHQ7dnNzaGlzdG9yeSB2c3NwYXRoPSZxdW90OyQvbXlQcm9qZWN0JnF1b3Q7IHJlY3Vyc2l2ZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgICBudW1EYXlzPSZxdW90Oy0xNCZxdW90OworICAgICAgICAgICAgZGF0ZUZvcm1hdD0mcXVvdDtNLWQteXk7aDptbWEmcXVvdDsKKyAgICAgICAgICAgIHRvRGF0ZT0mcXVvdDske3RvLnRzdGFtcH0mcXVvdDsvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5TaG93cyBhbGwgY2hhbmdlcyBpbiB0aGUgMTQgZGF5cyBiZWZvcmUgdG9kYXkuPC9wPgorPGhyPgorCis8IS0tIFZTU0NIRUNLSU4gLS0+CisKKzxoMj48YSBuYW1lPSJ2c3NjaGVja2luIj5Wc3NDaGVja2luPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIENIRUNLSU4gY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPnZzc3BhdGg8L3RkPgorICAgICA8dGQ+U291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvCisgICAgICAgICBwZXJmb3JtIHRoZSBhY3Rpb24gb24uPC90ZD4KKyAgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmxvZ2luPC90ZD4KKyAgICAgPHRkPnVzZXJuYW1lWyxwYXNzd29yZF0gLSBUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG5lZWRlZCB0byBnZXQgYWNjZXNzCisgICAgICAgICB0byBWU1MuIE5vdGUgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBib3RoIChpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkKSAtCisgICAgICAgICBBbnQvVlNTIHdpbGwgaGFuZyBpZiB5b3UgbGVhdmUgdGhlIHBhc3N3b3JkIG91dCBhbmQgVlNTIGRvZXMgbm90IGFjY2VwdAorICAgICAgICAgbG9naW4gd2l0aG91dCBhIHBhc3N3b3JkLiA8L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5sb2NhbHBhdGg8L3RkPgorICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+c3NkaXI8L3RkPgorICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUKKyAgICAgICAgIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KKyAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcmNzYWZlLmluaTwvY29kZT4gcmVzaWRlcy48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD53cml0YWJsZTwvdGQ+CisgICAgIDx0ZD50cnVlIG9yIGZhbHNlPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICAgPHRkPnRydWUgb3IgZmFsc2U8L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICAgPHRkPkNvbW1lbnQgdG8gdXNlIGZvciB0aGUgZmlsZXMgdGhhdCB3aGVyZSBjaGVja2VkIGluLjwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+CisgICAgIDx0ZD4nWScsICdOJyBvciBlbXB0eS4gU3BlY2lmeSBob3cgdG8gcmVwbHkgdG8gcXVlc3Rpb25zIGZyb20gVlNTLjwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgc3MuZXhlIGV4aXRzIHdpdGggYSByZXR1cm5jb2RlIG9mIDEwMC4gRGVmYXVsdHMgdG8gdHJ1ZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7dnNzY2hlY2tpbiB2c3NwYXRoPSZxdW90OyQvdGVzdC90ZXN0KiZxdW90OworICAgICAgICAgICAgbG9jYWxwYXRoPSZxdW90O0Q6XGJ1aWxkXCZxdW90OworICAgICAgICAgICAgY29tbWVudD0mcXVvdDtNb2RpZmllZCBieSBhdXRvbWF0aWMgYnVpbGQmcXVvdDsvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5DaGVja3MgaW4gdGhlIGZpbGUocykgbmFtZWQgPGk+dGVzdCo8L2k+IGluIHRoZSBwcm9qZWN0IDxpPiQvdGVzdDwvaT4gdXNpbmcKK3RoZSBsb2NhbCBkaXJlY3RvcnkgPGk+RDpcYnVpbGQ8L2k+LjwvcD4KKzxocj4KKworPCEtLSBWU1NDSEVDS09VVCAtLT4KKworPGgyPjxhIG5hbWU9InZzc2NoZWNrb3V0Ij5Wc3NDaGVja291dDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KK1Rhc2sgdG8gcGVyZm9ybSBDSEVDS09VVCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCis8cD5JZiB5b3Ugc3BlY2lmeSB0d28gb3IgbW9yZSBhdHRyaWJ1dGVzIGZyb20gdmVyc2lvbiwgZGF0ZSBhbmQKK2xhYmVsIG9ubHkgb25lIHdpbGwgYmUgdXNlZCBpbiB0aGUgb3JkZXIgdmVyc2lvbiwgZGF0ZSwgbGFiZWwuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPnZzc3BhdGg8L3RkPgorICAgICA8dGQ+U291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvCisgICAgICAgICBwZXJmb3JtIHRoZSBhY3Rpb24gb24uPC90ZD4KKyAgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmxvZ2luPC90ZD4KKyAgICAgPHRkPnVzZXJuYW1lWyxwYXNzd29yZF0gLSBUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG5lZWRlZCB0byBnZXQgYWNjZXNzCisgICAgICAgICB0byBWU1MuIE5vdGUgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBib3RoIChpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkKSAtCisgICAgICAgICBBbnQvVlNTIHdpbGwgaGFuZyBpZiB5b3UgbGVhdmUgdGhlIHBhc3N3b3JkIG91dCBhbmQgVlNTIGRvZXMgbm90IGFjY2VwdAorICAgICAgICAgbG9naW4gd2l0aG91dCBhIHBhc3N3b3JkLiA8L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5sb2NhbHBhdGg8L3RkPgorICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+c3NkaXI8L3RkPgorICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUKKyAgICAgICAgIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KKyAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcmNzYWZlLmluaTwvY29kZT4gcmVzaWRlcy48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD53cml0YWJsZTwvdGQ+CisgICAgIDx0ZD50cnVlIG9yIGZhbHNlPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICAgPHRkPnRydWUgb3IgZmFsc2U8L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICAgPHRkPmEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0PC90ZD4KKyAgICAgPHRkIHJvd3NwYW49IjMiPk5vLCBvbmx5IG9uZSBvZiB0aGVzZSBhbGxvd2VkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+ZGF0ZTwvdGQ+CisgICAgIDx0ZD5hIGRhdGUgc3RhbXAgdG8gZ2V0IGF0PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+bGFiZWw8L3RkPgorICAgICA8dGQ+YSBsYWJlbCB0byBnZXQgZm9yPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD53cml0YWJsZWZpbGVzPC90ZD4KKyAgICA8dGQ+QmVoYXZpb3Igd2hlbiBsb2NhbCBmaWxlcyBhcmUgd3JpdGFibGUuIFZhbGlkIG9wdGlvbnMgYXJlOiA8Y29kZT5yZXBsYWNlPC9jb2RlPiwgCisgICAgICAgIDxjb2RlPnNraXA8L2NvZGU+IGFuZCA8Y29kZT5mYWlsPC9jb2RlPjsgRGVmYXVsdHMgdG8gPGNvZGU+ZmFpbDwvY29kZT4KKyAgICAgICAgPGJyPjxjb2RlPnNraXA8L2NvZGU+IGltcGxpZXMgPGNvZGU+ZmFpbG9uZXJyb3I9ZmFsc2U8L2NvZGU+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQ+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHNzLmV4ZSBleGl0cyB3aXRoIGEgcmV0dXJuY29kZSBvZiAxMDAuIERlZmF1bHRzIHRvIHRydWU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmlsZXRpbWVzdGFtcDwvdGQ+CisgICAgPHRkPlNldCB0aGUgYmVoYXZpb3IgZm9yIHRpbWVzdGFtcHMgb2YgbG9jYWwgZmlsZXMuIFZhbGlkIG9wdGlvbnMgYXJlIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LCAKKyAgICAgICAgPGNvZGU+bW9kaWZpZWQ8L2NvZGU+LCBvciA8Y29kZT51cGRhdGVkPC9jb2RlPi4gRGVmYXVsdHMgdG8gPGNvZGU+Y3VycmVudDwvY29kZT4uPC90ZD4gCisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5nZXRsb2NhbGNvcHk8L3RkPgorICAgIDx0ZD5TZXQgdGhlIGJlaGF2aW9yIHRvIHJldHJpZXZlIGxvY2FsIGNvcGllcyBvZiB0aGUgZmlsZXMuIERlZmF1bHRzIHRvIHRydWUuPC90ZD4gCisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7dnNzY2hlY2tvdXQgdnNzcGF0aD0mcXVvdDskL3Rlc3QmcXVvdDsKKyAgICAgICAgICAgICBsb2NhbHBhdGg9JnF1b3Q7RDpcYnVpbGQmcXVvdDsKKyAgICAgICAgICAgICByZWN1cnNpdmU9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgICAgIGxvZ2luPSZxdW90O21lLG15cGFzcyZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPkRvZXMgYSByZWN1cnNpdmUgY2hlY2tvdXQgb2YgdGhlIHByb2plY3QgPGk+JC90ZXN0PC9pPiB0byB0aGUgZGlyZWN0b3J5IEQ6XGJ1aWxkLgorPC9wPgorPGhyPgorCis8IS0tIFZTU0FERCAtLT4KKworPGgyPjxhIG5hbWU9InZzc2FkZCI+VnNzQWRkPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorVGFzayB0byBwZXJmb3JtIEFERCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KKyAgICAgPHRkPlNwZWNpZnkgdGhlIGxvY2FsIGZpbGUocykgdG8gYWRkIHRvIFZTUzwvdGQ+CisgICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5sb2dpbjwvdGQ+CisgICAgIDx0ZD51c2VybmFtZVsscGFzc3dvcmRdIC0gVGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBuZWVkZWQgdG8gZ2V0IGFjY2VzcworICAgICAgICAgdG8gVlNTLiBOb3RlIHRoYXQgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgYm90aCAoaWYgeW91IGhhdmUgYSBwYXNzd29yZCkgLQorICAgICAgICAgQW50L1ZTUyB3aWxsIGhhbmcgaWYgeW91IGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQKKyAgICAgICAgIGxvZ2luIHdpdGhvdXQgYSBwYXNzd29yZC4gPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+c3NkaXI8L3RkPgorICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUKKyAgICAgICAgIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KKyAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcmNzYWZlLmluaTwvY29kZT4gcmVzaWRlcy48L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD53cml0YWJsZTwvdGQ+CisgICAgIDx0ZD50cnVlIG9yIGZhbHNlPC90ZD4KKyAgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICAgPHRkPnRydWUgb3IgZmFsc2U8L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICAgPHRkPkNvbW1lbnQgdG8gdXNlIGZvciB0aGUgZmlsZXMgdGhhdCB3aGVyZSBjaGVja2VkIGluLjwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+CisgICAgIDx0ZD4nWScsICdOJyBvciBlbXB0eS4gU3BlY2lmeSBob3cgdG8gcmVwbHkgdG8gcXVlc3Rpb25zIGZyb20gVlNTLjwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgc3MuZXhlIGV4aXRzIHdpdGggYSByZXR1cm5jb2RlIG9mIDEwMC4gRGVmYXVsdHMgdG8gdHJ1ZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7dnNzYWRkIGxvY2FscGF0aD0mcXVvdDtEOlxidWlsZFxidWlsZC4wMDAxMi56aXAmcXVvdDsKKyAgICAgICAgICAgIGNvbW1lbnQ9JnF1b3Q7QWRkZWQgYnkgYXV0b21hdGljIGJ1aWxkJnF1b3Q7LyZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+QWRkIHRoZSBmaWxlIG5hbWVkIGJ1aWxkLjAwMDEyLnppcCBpbnRvIHRoZSBwcm9qZWN0IGN1cnJlbnQgd29ya2luZworZGlyZWN0b3J5IChzZWUgdnNzY3ApLjwvcD4KKzxocj4KKworPCEtLSBWU1NDUCAtLT4KKworPGgyPjxhIG5hbWU9InZzc2NwIj5Wc3NDcDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlRhc2sgdG8gcGVyZm9ybSBDUCAoQ2hhbmdlIFByb2plY3QpIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS48L3A+Cis8cD5UaGlzIHRhc2sgaXMgdHlwaWNhbGx5IHVzZWQgYmVmb3JlIGEgVnNzQWRkIGluIG9yZGVyIHRvIHNldCB0aGUgdGFyZ2V0IHByb2plY3Q8L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPlZhbHVlczwvdGg+CisgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgICA8dGQ+dnNzcGF0aDwvdGQ+CisgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0IHlvdSB3aXNoIHRvCisgICAgICAgICBtYWtlIHRoZSBjdXJyZW50IHByb2plY3QuPC90ZD4KKyAgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPmxvZ2luPC90ZD4KKyAgICAgPHRkPnVzZXJuYW1lWyxwYXNzd29yZF0gLSBUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG5lZWRlZCB0byBnZXQgYWNjZXNzCisgICAgICAgICB0byBWU1MuIE5vdGUgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBib3RoIChpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkKSAtCisgICAgICAgICBBbnQvVlNTIHdpbGwgaGFuZyBpZiB5b3UgbGVhdmUgdGhlIHBhc3N3b3JkIG91dCBhbmQgVlNTIGRvZXMgbm90IGFjY2VwdAorICAgICAgICAgbG9naW4gd2l0aG91dCBhIHBhc3N3b3JkLiA8L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgIDx0ZD5zc2RpcjwvdGQ+CisgICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzLiBCeSBkZWZhdWx0IHRoZQorICAgICAgICAgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILjwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICAgPHRkPnNlcnZlclBhdGg8L3RkPgorICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyY3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzLjwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgc3MuZXhlIGV4aXRzIHdpdGggYSByZXR1cm5jb2RlIG9mIDEwMC4gRGVmYXVsdHMgdG8gdHJ1ZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7dnNzY3AgdnNzcGF0aD0mcXVvdDskL1Byb2plY3RzL2FudCZxdW90Oy8mZ3Q7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPlNldHMgdGhlIGN1cnJlbnQgVlNTIHByb2plY3QgdG8gPGk+JC9Qcm9qZWN0cy9hbnQ8L2k+LjwvcD4KKzxocj4KKworPCEtLSBWU1NDUkVBVEUgLS0+CisKKyA8aDI+PGEgbmFtZT0idnNzY3JlYXRlIj5Wc3NDcmVhdGU8L2E+PC9oMj4KKyA8aDM+RGVzY3JpcHRpb248L2gzPgorIFRhc2sgdG8gcGVyZm9ybSBDUkVBVEUgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2UgU2FmZS4KKyA8cD5DcmVhdGVzIGEgbmV3IHByb2plY3QgaW4gVlNTLjwvcD4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICA8dGg+VmFsdWVzPC90aD4KKyAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmxvZ2luPC90ZD4KKyAgICA8dGQ+dXNlcm5hbWUscGFzc3dvcmQ8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dnNzcGF0aDwvdGQ+CisgICAgPHRkPlNvdXJjZVNhZmUgcGF0aCBvZiBwcm9qZWN0IHRvIGJlIGNyZWF0ZWQ8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnNzZGlyPC90ZD4KKyAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5xdWlldDwvdGQ+CisgICAgPHRkPnN1cHByZXNzIG91dHB1dCAob2ZmIGJ5IGRlZmF1bHQpPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsT25FcnJvcjwvdGQ+CisgICAgPHRkPmZhaWwgaWYgdGhlcmUgaXMgYW4gZXJyb3IgY3JlYXRpbmcgdGhlIHByb2plY3QgKHRydWUgYnkgZGVmYXVsdCk8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+YXV0b3Jlc3BvbnNlPC90ZD4KKyAgICA8dGQ+V2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcyB1c2VkOyB2YWx1ZXMgb2YgWSBvciBOIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgPHRkPlRoZSBjb21tZW50IHRvIHVzZSBmb3IgdGhpcyBsYWJlbC4gRW1wdHkgb3IgJy0nIGZvciBubyBjb21tZW50LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0O3Zzc2NyZWF0ZSB2c3NwYXRoPSZxdW90OyQvZXhpc3RpbmdQcm9qZWN0L25ld1Byb2plY3QmcXVvdDsvJmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5DcmVhdGVzIHRoZSBWU1MtUHJvamVjdCA8aT4kL2V4aXN0aW5nUHJvamVjdC9uZXdQcm9qZWN0PC9pPi48L3A+Cis8aHI+CisKKzwhLS0gRm9vdGVyIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy93bGpzcGMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvd2xqc3BjLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxODNkYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvd2xqc3BjLmh0bWwKQEAgLTAsMCArMSw5OSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD48bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPldMSlNQQyBUYXNrPC90aXRsZT48L2hlYWQ+Cis8Ym9keT4KKzxoMT53bGpzcGM8L2gxPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkNsYXNzIHRvIHByZWNvbXBpbGUgSlNQJ3MgdXNpbmcgd2VibG9naWMncyBqc3AgY29tcGlsZXIgKHdlYmxvZ2ljLmpzcGMpPC9wPgorVGVzdGVkIG9ubHkgb24gV2VibG9naWMgNC41LjEgLSBOVDQuMCBhbmQgU29sYXJpcyA1LjcsNS44PGJyPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbFBhZGRpbmc9IjIiIGNlbGxTcGFjaW5nPSIwIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnNyYzwvdGQ+CisgICAgICA8dGQ+cm9vdCBvZiBzb3VyY2UgdHJlZSBmb3IgSlNQLCBpZSwgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHlvdXIgd2VibG9naWMgc2VydmVyPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPgorZGVzdDwvdGQ+CisgICAgICA8dGQ+IHJvb3Qgb2YgZGVzdGluYXRpb24gZGlyZWN0b3J5LCB3aGF0IHlvdSBoYXZlIHNldCBhcyBXb3JraW5nRGlyIGluIHRoZSB3ZWJsb2dpYyBwcm9wZXJ0aWVzPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPgorcGFja2FnZTwvdGQ+CisgICAgICA8dGQ+IHN0YXJ0IHBhY2thZ2UgbmFtZSB1bmRlciB3aGljaCB5b3VyIEpTUCdzIHdvdWxkIGJlIGNvbXBpbGVkPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPgorY2xhc3NwYXRoPC90ZD4KKyAgICAgIDx0ZD5DbGFzcyBwYXRoIHRvIHVzZSB3aGVuIGNvbXBpbGluZyBqc3AnczwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxwPgorPGJyPgorCitBIGNsYXNzcGF0aCBzaG91bGQgYmUgc2V0IHdoaWNoIGNvbnRhaW5zIHRoZSB3ZWJsb2dpYyBjbGFzc2VzIGFzIHdlbGwgYXMgYWxsIGFwcGxpY2F0aW9uIGNsYXNzZXM8YnI+CityZWZlcmVuY2VkIGJ5IHRoZSBKU1AuIFRoZSBzeXN0ZW0gY2xhc3NwYXRoIGlzIGFsc28gYXBwZW5kZWQgd2hlbiB0aGUganNwYyBpcyBjYWxsZWQsIHNvIHlvdSBtYXk8YnI+CitjaG9vc2UgdG8gcHV0IGV2ZXJ5dGhpbmcgaW4gdGhlIGNsYXNzcGF0aCB3aGlsZSBjYWxsaW5nIEFudC4gSG93ZXZlciwgc2luY2UgcHJlc3VtYWJseSB0aGUgSlNQJ3Mgd2lsbCByZWZlcmVuY2U8YnI+CitjbGFzc2VzIGJlaW5nIGJ1aWxkIGJ5IEFudCwgaXQgd291bGQgYmUgYmV0dGVyIHRvIGV4cGxpY2l0bHkgYWRkIHRoZSBjbGFzc3BhdGggaW4gdGhlIHRhc2s8YnI+Cis8YnI+CitUaGUgdGFzayBjaGVja3MgdGltZXN0YW1wcyBvbiB0aGUgSlNQJ3MgYW5kIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcywgYW5kIGNvbXBpbGVzPGJyPgorb25seSB0aG9zZSBmaWxlcyB0aGF0IGhhdmUgY2hhbmdlZC48YnI+Cis8YnI+CitJdCBmb2xsb3dzIHRoZSB3ZWJsb2dpYyBuYW1pbmcgY29udmVudGlvbiBvZiBwdXR0aW5nIGNsYXNzZXMgaW48YnI+Cis8Yj4gX2Rpck5hbWUvX2ZpbGVOYW1lLmNsYXNzIGZvciBkaXJuYW1lL2ZpbGVOYW1lLmpzcCAgIDwvYj48YnI+Cis8YnI+Cis8L3A+Cis8aDM+PGJyPgorRXhhbXBsZTxicj4KKzwvaDM+Cis8cD4KKzxwcmU+CismbHQ7dGFyZ2V0IG5hbWU9ImpzcGNvbXBpbGUiIGRlcGVuZHM9ImNvbXBpbGUiJmd0OworICAmbHQ7d2xqc3BjIHNyYz0iYzpcXHdlYmxvZ2ljXFxteXNlcnZlclxccHVibGljX2h0bWwiIGRlc3Q9ImM6XFx3ZWJsb2dpY1xcbXlzZXJ2ZXJcXHNlcnZlcmNsYXNzZXMiIHBhY2thZ2U9Im15YXBwLmpzcCImZ3QKKyAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke3dlYmxvZ2ljLmNsYXNzcGF0aH0iLyZndDsKKyAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke2NvbXBpbGUuZGVzdH0iLyZndDsKKyAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgJmx0Oy93bGpzcGMmZ3Q7CismbHQ7L3RhcmdldCZndDsKKzwvcHJlPgorCis8L3A+CisKKzxoMz5MaW1pdGF0aW9uczwvaDM+Cis8dWw+Cis8bGk+VGhpcyB3b3JrcyBvbmx5IG9uIHdlYmxvZ2ljIDQuNS4xPC9saT4KKzxsaT5JdCBjb21waWxlcyB0aGUgZmlsZXMgdGhydSB0aGUgQ2xhc3NpYyBjb21waWxlciBvbmx5LjwvbGk+Cis8bGk+U2luY2UgaXQgaXMgbXkgZXhwZXJpZW5jZSB0aGF0IHdlYmxvZ2ljIGpzcGMgdGhyb3dzIG91dCBvZiBtZW1vcnkgZXJyb3Igb24gYmVpbmcgZ2l2ZW4gdG9vCittYW55IGZpbGVzIGF0IG9uZSBnbywgaXQgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggb25lIGpzcCBmaWxlIGVhY2guPC9saT4KKzwvdWw+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3Mvd3NkbHRvZG90bmV0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3dzZGx0b2RvdG5ldC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDA3MGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3dzZGx0b2RvdG5ldC5odG1sCkBAIC0wLDAgKzEsMjMwIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgCis8aHRtbD4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDx0aXRsZT5Xc2RsdG9kb3RuZXQKKyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzUyNUQ3NiIKKyAgICAgIGFsaW5rPSIjNTI1RDc2IiB2bGluaz0iIzUyNUQ3NiI+CisKKzx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+CisKKyAgPCEtLSBQQUdFIEhFQURFUiAtLT4KKyAgPHRyPgorICAgIDx0ZD4KKyAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgIDxmb250IHNpemU9IiszIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxzdHJvbmc+V3NkbHRvZG90bmV0CisgVGFzazwvc3Ryb25nPjwvZm9udD4KKyAgICAgICAgICAgIDxicj48Zm9udCBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkNvbnZlcnRzIGEgV1NETCBmaWxlIG9yIFVSTCByZXNvdXJjZSBpbnRvIGEgLk5FVCBsYW5ndWFnZS48L2ZvbnQ+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8IS0tIFBST0pFQ1QgTE9HTyAtLT4KKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPgorICAgICAgICAgICAgICA8aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2FudF9sb2dvX2xhcmdlLmdpZiIgYWxpZ249InJpZ2h0IiBhbHQ9IkFwYWNoZSBBbnQiIGJvcmRlcj0iMCI+CisgICAgICAgICAgICA8L2E+CisgICAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+PC90YWJsZT4KKyAgICA8L3RkPgorICA8L3RyPgorCisgIDwhLS0gU1RBUlQgUklHSFQgU0lERSBNQUlOIEJPRFkgLS0+CisgIDx0cj4KKyAgICA8dGQgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisKKyAgICAgICAgICA8IS0tIEFwcGx5aW5nIHRhc2svbG9uZy1kZXNjcmlwdGlvbiAtLT4KKyAgICA8IS0tIFN0YXJ0IERlc2NyaXB0aW9uIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImRlc2NyaXB0aW9uIj4KKyAgICAgICAgICA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgQ29udmVydHMgYSBXU0RMIGZpbGUgb3IgVVJMIHJlc291cmNlIGludG8gYSAuTkVUIGxhbmd1YWdlLiBXaHkgYWRkIGEgd3JhcHBlciB0byB0aGUgTVMgV1NETCB0b29sPyBTbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoYXQgeW91ciB3ZWIgc2VydmljZXMsIGJlIHRoZXkgd3JpdHRlbiB3aXRoIEF4aXMgb3IgYW55b25lIGVsc2UncyBTT0FQIHRvb2xraXQsIHdvcmsgd2l0aCAuTkVUIGNsaWVudHMuIFRoaXMgdGFzayBpcyBkZXBlbmRlbmN5IGF3YXJlIHdoZW4gdXNpbmcgYSBmaWxlIGFzIGEgc291cmNlIGFuZCBkZXN0aW5hdGlvbjsgc28gaWYgeW91IDxjb2RlPiZsdDtnZXQmZ3Q7PC9jb2RlPiB0aGUgZmlsZSAod2l0aCA8Y29kZT51c2V0aW1lc3RhbXA9InRydWUiPC9jb2RlPikgdGhlbiB5b3Ugb25seSByZWJ1aWxkIHN0dWZmIHdoZW4gdGhlIFdTREwgZmlsZSBpcyBjaGFuZ2VkLiBPZiBjb3Vyc2UsIGlmIHRoZSBzZXJ2ZXIgZ2VuZXJhdGVzIGEgbmV3IHRpbWVzdGFtcCBldmVyeSB0aW1lIHlvdSBhc2sgZm9yIHRoZSBXU0RMLCB0aGlzIGlzIG5vdCBlbm91Z2guLi51c2UgdGhlIDxjb2RlPiZsdDtmaWxlc21hdGNoJmd0OzwvY29kZT4gPGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+IHRvIHRvIGJ5dGUgZm9yIGJ5dGUgY29tcGFyaXNvbiBhZ2FpbnN0IGEgY2FjaGVkIFdTREwgZmlsZSB0aGVuIG1ha2UgdGhlIHRhcmdldCBjb25kaXRpb25hbCBvbiB0aGF0IHRlc3QgZmFpbGluZy4gU2VlICJDcmVhdGluZyBhbiBYTUwgV2ViIFNlcnZpY2UgUHJveHkiLCAid3NkbC5leGUiIGRvY3MgaW4gdGhlIGZyYW1ld29yayBTREsgZG9jdW1lbnRhdGlvbgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRGVzY3JpcHRpb24gLS0+CisKKyAgICA8IS0tIFN0YXJ0IEF0dHJpYnV0ZXMgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+CisgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgIDxhIG5hbWU9ImF0dHJpYnV0ZXMiPgorICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVyczwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+QXR0cmlidXRlPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlR5cGU8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+UmVxdWlyZW1lbnQ8L2I+PC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAorICAgIAorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZGVzdGZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5OYW1lIG9mIHRoZSBmaWxlIHRvIGdlbmVyYXRlLiBSZXF1aXJlZDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHJvd3NwYW49IjgiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5PcHRpb25hbDwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDwhLS0gQXR0cmlidXRlIC0tPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmV4dHJhb3B0aW9uczwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkFueSBleHRyYSBXU0RMLkVYRSBvcHRpb25zIHdoaWNoIGFyZW4ndCBleHBsaWNpdGx5IHN1cHBvcnRlZCBieSB0aGUgYW50IHdyYXBwZXIgdGFzazsgb3B0aW9uYWw8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5mYWlsb25lcnJvcjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPldoZXRoZXIgb3Igbm90IGEgZmFpbHVyZSBzaG91bGQgaGFsdCB0aGUgYnVpbGQuIE9wdGlvbmFsIC0gZGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bGFuZ3VhZ2U8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zZXQgdGhlIGxhbmd1YWdlOyBvbmUgb2YgIkNTIiwgIkpTIiwgb3IgIlZCIiBvcHRpb25hbCwgZGVmYXVsdCBpcyBDUyBmb3IgQyMgc291cmNlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bmFtZXNwYWNlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bmFtZXNwYWNlIHRvIHBsYWNlIHRoZSBzb3VyY2UgaW4uIG9wdGlvbmFsOyBkZWZhdWx0ICIiPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c2VydmVyPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZmxhZyB0byBlbmFibGUgc2VydmVyIHNpZGUgY29kZSBnZW5lcmF0aW9uOyBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZTwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zcmNmaWxlPC9mb250PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+VGhlIGxvY2FsIFdTREwgZmlsZSB0byBwYXJzZTsgZWl0aGVyIHVybCBvciBzcmNGaWxlIGlzIHJlcXVpcmVkLjwvZm9udD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj51cmw8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXRzIHRoZSBVUkwgdG8gZmV0Y2guIEZldGNoaW5nIGlzIGJ5IHdzZGwuZXhlOyBBbnQgcHJveHkgc2V0dGluZ3MgYXJlIGlnbm9yZWQ7IGVpdGhlciB1cmwgb3Igc3JjRmlsZSBpcyByZXF1aXJlZC48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKworCisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBBdHRyaWJ1dGVzIC0tPgorCisgICAgPCEtLSBTdGFydCBFbGVtZW50cyAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgorICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJlbGVtZW50cyI+CisgICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzIGFzIG5lc3RlZCBlbGVtZW50czwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIEVsZW1lbnRzIC0tPgorCisKKyAgICA8L3RkPgorICA8L3RyPgorICA8IS0tIEVORCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KKworPC90YWJsZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy94bWx2YWxpZGF0ZS5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUYXNrcy94bWx2YWxpZGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWU1MzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL3htbHZhbGlkYXRlLmh0bWwKQEAgLTAsMCArMSwyNjMgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+WE1MVmFsaWRhdGUgVGFzazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgbmFtZT0ieG1sdmFsaWRhdGUiPlhNTFZhbGlkYXRlPC9hPjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorCis8cD5UaGlzIHRhc2sgY2hlY2tzIHRoYXQgWE1MIGZpbGVzIGFyZSB2YWxpZCAob3Igb25seSB3ZWxsIGZvcm1lZCkuIFRoZQordGFzayB1c2VzIHRoZSBTQVgyIHBhcnNlciBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBKQVhQIGJ5IGRlZmF1bHQKKyhwcm9iYWJseSB0aGUgb25lIHRoYXQgaXMgdXNlZCBieSBBbnQgaXRzZWxmKSwgYnV0IG9uZSBjYW4gc3BlY2lmeSBhbnkKK1NBWDEvMiBwYXJzZXIgaWYgbmVlZGVkLjwvcD4KKworPHA+VGhpcyB0YXNrIHN1cHBvcnRzIHRoZSB1c2Ugb2YgbmVzdGVkCisgIDxsaT48YSBocmVmPSIuLi9Db3JlVHlwZXMveG1sY2F0YWxvZy5odG1sIj48dHQ+Jmx0O3htbGNhdGFsb2cmZ3Q7PC90dD48L2E+IGVsZW1lbnRzPC9saT4KKyAgPGxpPjx0dD4mbHQ7ZHRkJmd0OzwvdHQ+IGVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIHJlc29sdmUgRFREcyBhbmQgZW50aXRpZXM8L2xpPgorICA8bGk+PHR0PiZsdDthdHRyaWJ1dGUmZ3Q7PC90dD4gZWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gc2V0IGZlYXR1cmVzIG9uIHRoZSBwYXJzZXIuCisgICAgICBUaGVzZSBjYW4gYmUgYW55IG51bWJlciBvZgorICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiI+PHR0Pmh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy88L3R0PjwvYT4KKyAgICAgIG9yIG90aGVyIGZlYXR1cmVzIHRoYXQgeW91ciBwYXJzZXIgbWF5IHN1cHBvcnQuPC9saT4KKyAgPGxpPjx0dD4mbHQ7cHJvcGVydHkmZ3Q7PC90dD4gZWxlbWVudHMsIGNvbnRhaW5pbmcgc3RyaW5nIHByb3BlcnRpZXMKKzwvcD4KKworPHA+PGI+V2FybmluZzwvYj4gOiBKQVhQIGNyZWF0ZXMgYnkgZGVmYXVsdCBhIG5vbiBuYW1lc3BhY2UgYXdhcmUgcGFyc2VyLgorVGhlIDx0dD4iaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiPC90dD4gZmVhdHVyZSBpcyBzZXQKK2J5IGRlZmF1bHQgdG8gPHR0PmZhbHNlPC90dD4gYnkgdGhlIEpBWFAgaW1wbGVtZW50YXRpb24gdXNlZCBieSBhbnQuIFRvIHZhbGlkYXRlCithIGRvY3VtZW50IGNvbnRhaW5pbmcgbmFtZXNwYWNlcywKK3NldCB0aGUgbmFtZXNwYWNlcyBmZWF0dXJlIHRvIDx0dD50cnVlPC90dD4gZXhwbGljaXRseSBieSBuZXN0aW5nIHRoZSBmb2xsb3dpbmcgZWxlbWVudDoKKzxwcmU+CisgICZsdDthdHRyaWJ1dGUgbmFtZT0iaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiIHZhbHVlPSJ0cnVlIi8mZ3Q7Cis8L3ByZT4KK0lmIHlvdSBhcmUgdXNpbmcgZm9yIGluc3RhbmNlIGEgPHR0PnhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPC90dD4gYXR0cmlidXRlIGluIHlvdXIgWE1MIGZpbGVzLAoreW91IHdpbGwgbmVlZCB0aGlzIG5hbWVzcGFjZSBzdXBwb3J0IGZlYXR1cmUuCis8L3A+Cis8cD5JZiB5b3UgYXJlIHVzaW5nIGEgcGFyc2VyIG5vdCBnZW5lcmF0ZWQgYnkgSkFYUCwgYnkgdXNpbmcgdGhlIDx0dD5jbGFzc25hbWU8L3R0PiBhdHRyaWJ1dGUgb2YgeG1sdmFsaWRhdGUsIHRoaXMgd2FybmluZworbWF5IG5vdCBhcHBseS48L3A+CisKKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZShzKSB5b3Ugd2FudCB0byBjaGVjay4gKG9wdGlvbmFsbHkgY2FuIHVzZSBhbiBlbWJlZGRlZCBmaWxlc2V0KTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmxlbmllbnQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICBpZiB0cnVlLCBvbmx5IGNoZWNrIHRoZSBYTUwgZG9jdW1lbnQgaXMgd2VsbCBmb3JtZWQKKyAgICAgICAgKGlnbm9yZWQgaWYgdGhlIHNwZWNpZmllZCBwYXJzZXIgaXMgYSBTQVgxIHBhcnNlcikKKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc25hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHBhcnNlciB0byB1c2UuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXJlIHRvIGZpbmQgdGhlIHBhcnNlciBjbGFzcy4gT3B0aW9uYWxseSBjYW4gdXNlIGFuIGVtYmVkZGVkIDx0dD4mbHQ7Y2xhc3NwYXRoJmd0OzwvdHQ+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbHMgb24gYSBlcnJvciBpZiBzZXQgdG8gdHJ1ZSAoZGVmYXVsdHMgdG8gdHJ1ZSkuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+d2FybjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5sb2cgcGFyc2VyIHdhcm4gZXZlbnRzLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+PGEgbmFtZT0ibmVzdGVkIj5OZXN0ZWQgRWxlbWVudHM8L2E+PC9oMz4KKzxoND5kdGQ8L2g0PgorPHA+Cis8dHQ+Jmx0O2R0ZCZndDs8L3R0PiBpcyB1c2VkIHRvIHNwZWNpZnkgZGlmZmVyZW50IGxvY2F0aW9ucyBmb3IgRFREIHJlc29sdXRpb24uCis8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnB1YmxpY0lkPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlB1YmxpYyBJRCBvZiB0aGUgRFREIHRvIHJlc29sdmU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bG9jYXRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TG9jYXRpb24gb2YgdGhlIERURCB0byB1c2UsIHdoaWNoIGNhbiBiZSBhIGZpbGUsCisgICAgYSByZXNvdXJjZSwgb3IgYSBVUkw8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDQ+eG1sY2F0YWxvZzwvaDQ+Cis8cD5UaGUgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL3htbGNhdGFsb2cuaHRtbCI+PHR0PiZsdDt4bWxjYXRhbG9nJmd0OzwvdHQ+PC9hPgorZWxlbWVudCBpcyB1c2VkIHRvIHBlcmZvcm0gZW50aXR5IHJlc29sdXRpb24uPC9wPgorPGg0PmF0dHJpYnV0ZTwvaDQ+Cis8cD5UaGUgPHR0PiZsdDthdHRyaWJ1dGUmZ3Q7PC90dD4gZWxlbWVudCBpcyB1c2VkIHRvIHNldCBwYXJzZXIgZmVhdHVyZXMuPGJyPgorRmVhdHVyZXMgdXNhYmxlIHdpdGggdGhlIHhlcmNlcyBwYXJzZXIgYXJlIGRlZmluZWQgaGVyZSA6CisgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL2ZlYXR1cmVzLmh0bWwiPlNldHRpbmcgZmVhdHVyZXM8L2E+PGJyPgorCitTQVggZmVhdHVyZXMgYXJlIGRlZmluZWQgaGVyZToKKyA8YSBocmVmPSJodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9wYWNrYWdlLXN1bW1hcnkuaHRtbCNwYWNrYWdlX2Rlc2NyaXB0aW9uIj48dHQ+aHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzLzwvdHQ+PC9hPjxicj4KKyA8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGZlYXR1cmU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGZlYXR1cmU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8L3A+CisKKzxoND5wcm9wZXJ0eTwvaDQ+Cis8cD5UaGUgPHR0PiZsdDtwcm9wZXJ0eSZndDs8L3R0PiBlbGVtZW50IGlzIHVzZWQgdG8gc2V0IHByb3BlcnRpZXMuCitUaGVzZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGhlcmUgZm9yIHRoZSB4ZXJjZXMgWE1MIHBhcnNlciBpbXBsZW1lbnRhdGlvbiA6CisgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL3Byb3BlcnRpZXMuaHRtbCI+WE1MIFBhcnNlciBwcm9wZXJ0aWVzPC9hPgorUHJvcGVydGllcyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNjaGVtYSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBYTUwgZmlsZS4KKzwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgZmVhdHVyZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzwvcD4KKworCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyZsdDt4bWx2YWxpZGF0ZSBmaWxlPSJ0b3RvLnhtbCIvJmd0OworPC9wcmU+CitWYWxpZGF0ZSB0b3RvLnhtbAorPHByZT4KKyZsdDt4bWx2YWxpZGF0ZSBmYWlsb25lcnJvcj0ibm8iIGxlbmllbnQ9InllcyIgd2Fybj0ieWVzIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIiJmd0OworICAgICAgICAgICAgIGNsYXNzcGF0aD0ibGliL3hlcmNlcy5qYXIiJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9InNyYyIgaW5jbHVkZXM9InN0eWxlLyoueHNsIi8mZ3Q7CismbHQ7L3htbHZhbGlkYXRlJmd0OworPC9wcmU+CitWYWxpZGF0ZSBhbGwgLnhzbCBmaWxlcyBpbiBzcmMvc3R5bGUsIGJ1dCBvbmx5IHdhcm4gaWYgdGhlcmUgaXMgYW4gZXJyb3IsIHJhdGhlciB0aGFuCitoYWx0IHRoZSBidWlsZC4KKzxwcmU+CisKKyZsdDt4bWx2YWxpZGF0ZSBmaWxlPSJzdHJ1dHMtY29uZmlnLnhtbCIgd2Fybj0iZmFsc2UiJmd0OworICAmbHQ7ZHRkIHB1YmxpY0lkPSItLy9BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi8vRFREIFN0cnV0cyBDb25maWd1cmF0aW9uIDEuMC8vRU4iCisgICAgICAgbG9jYXRpb249InN0cnV0cy1jb25maWdfMV8wLmR0ZCIvJmd0OworJmx0Oy94bWx2YWxpZGF0ZSZndDsKKzwvcHJlPgorCitWYWxpZGF0ZSBhIHN0cnV0cyBjb25maWd1cmF0aW9uLCB1c2luZyBhIGxvY2FsIGNvcHkgb2YgdGhlIERURC4gCis8cHJlPiAKKyZsdDt4bWx2YWxpZGF0ZSBmYWlsb25lcnJvcj0ibm8iJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5kaXJ9IiBpbmNsdWRlcz0iKiovKi54bWwiLyZndDsKKyAgJmx0O3htbGNhdGFsb2cgcmVmaWQ9Im15Y2F0YWxvZyIvJmd0OworJmx0Oy94bWx2YWxpZGF0ZSZndDsKKzwvcHJlPgorCitTY2FuIGFsbCBYTUwgZmlsZXMgaW4gdGhlIHByb2plY3QsIHVzaW5nIGEgcHJlZGVmaW5lZCBjYXRhbG9nIHRvIG1hcCBVUklzIHRvIGxvY2FsIGZpbGVzLgorPHByZT4KKyZsdDt4bWx2YWxpZGF0ZSBmYWlsb25lcnJvcj0ibm8iJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5kaXJ9IiBpbmNsdWRlcz0iKiovKi54bWwiLyZndDsKKyAgJmx0O3htbGNhdGFsb2cmZ3Q7CisgICAgICAgJmx0O2R0ZAorICAgICAgICAgcHVibGljSWQ9JnF1b3Q7LS8vQXJpZWxQYXJ0bmVycy8vRFREIFhNTCBBcnRpY2xlIFYxLjAvL0VOJnF1b3Q7CisgICAgICAgICBsb2NhdGlvbj0mcXVvdDtjb20vYXJpZWxwYXJ0bmVycy9rbm93bGVkZ2ViYXNlL2R0ZC9hcnRpY2xlLmR0ZCZxdW90Oy8mZ3Q7CisgICZsdDsveG1sY2F0YWxvZyZndDsKKyZsdDsveG1sdmFsaWRhdGUmZ3Q7Cis8L3ByZT4KK1NjYW4gYWxsIFhNTCBmaWxlcyBpbiB0aGUgcHJvamVjdCwgdXNpbmcgdGhlIGNhdGFsb2cgZGVmaW5lZCBpbmxpbmUuCisKKzxwcmU+CismbHQ7eG1sdmFsaWRhdGUgZmFpbG9uZXJyb3I9InllcyIgbGVuaWVudD0ibm8iIHdhcm49InllcyImZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0ieG1sIiBpbmNsdWRlcz0iKiovKi54bWwiLyZndDsKKyAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIgdmFsdWU9InRydWUiLyZndDsKKyAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiICB2YWx1ZT0idHJ1ZSIvJmd0OworICAmbHQ7YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiB2YWx1ZT0idHJ1ZSIvJmd0OworJmx0Oy94bWx2YWxpZGF0ZSZndDsKKzwvcHJlPgorVmFsaWRhdGUgYWxsIC54bWwgZmlsZXMgaW4geG1sIGRpcmVjdG9yeSB3aXRoIHRoZSBwYXJzZXIgY29uZmlndXJlZCB0byBwZXJmb3JtIFhTRCB2YWxpZGF0aW9uLgorTm90ZTogVGhlIHBhcnNlciBtdXN0IHN1cHBvcnQgdGhlIGZlYXR1cmUKKzxjb2RlPmh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYTwvY29kZT4uCitUaGUgPGEgaHJlZj0ic2NoZW1hdmFsaWRhdGUuaHRtbCI+c2NoZW1hdmFsaWRhdGU8L2E+IHRhc2sgaXMgYmV0dGVyIGZvciB2YWxpZGF0aW5nCitXM0MgWE1MIFNjaGVtYXMsIGFzIGl0IGV4dGVuZHMgdGhpcyB0YXNrIHdpdGggdGhlIHJpZ2h0IG9wdGlvbnMgYXV0b21hdGljYWxseSBlbmFibGVkLAorYW5kIG1ha2VzIGl0IGVhc3kgdG8gYWRkIGEgbGlzdCBvZiBzY2hlbWEgZmlsZXMvVVJMcyB0byBhY3QgYXMgc291cmNlcy4KKworPHByZT4KKzwhLS0gQ29udmVydHMgcGF0aCB0byBVUkwgZm9ybWF0IC0tPgorJmx0O3BhdGhjb252ZXJ0IGRpcnNlcD0iLyIgcHJvcGVydHk9InhzZC5maWxlIiZndDsKKyZsdDtwYXRoJmd0OworICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJ4bWwvZG9jLnhzZCIvJmd0OworJmx0Oy9wYXRoJmd0OworJmx0Oy9wYXRoY29udmVydCZndDsKKworJmx0O3htbHZhbGlkYXRlIGZpbGU9InhtbC9lbmRwaWVjZS1ub1NjaGVtYS54bWwiIGxlbmllbnQ9ImZhbHNlIgorICBmYWlsb25lcnJvcj0idHJ1ZSIgd2Fybj0idHJ1ZSImZ3Q7CisgICZsdDthdHRyaWJ1dGUgbmFtZT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIgorICB2YWx1ZT0idHJ1ZSIvJmd0OworICAmbHQ7YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiB2YWx1ZT0idHJ1ZSIvJmd0OworICAmbHQ7cHJvcGVydHkKKyAgbmFtZT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLW5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iCisgIHZhbHVlPSIke3hzZC5maWxlfSIvJmd0OworJmx0Oy94bWx2YWxpZGF0ZSZndDsKKzwvcHJlPgorPGJyPgorVmFsaWRhdGUgdGhlIGZpbGUgeG1sL2VuZHBpZWNlLW5vU2NoZW1hLnhtbCBhZ2FpbnN0IHRoZSBzY2hlbWEgeG1sL2RvYy54c2QuCis8YnI+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFR5cGVzL2NsYXNzZmlsZXNldC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUeXBlcy9jbGFzc2ZpbGVzZXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZiMzNkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUeXBlcy9jbGFzc2ZpbGVzZXQuaHRtbApAQCAtMCwwICsxLDExOSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Q2xhc3NGaWxlU2V0IFR5cGU8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMj48YSBuYW1lPSJmaWxlc2V0Ij5DbGFzc0ZpbGVTZXQ8L2E+PC9oMj4KKzxwPkEgY2xhc3NmaWxlc2V0IGlzIGEgc3BlY2lhbGlzZWQgdHlwZSBvZiBmaWxlc2V0IHdoaWNoLCBnaXZlbiBhIHNldCBvZiAKKyZxdW90O3Jvb3QmcXVvdDsgY2xhc3Nlcywgd2lsbCBpbmNsdWRlIGFsbCBvZiB0aGUgY2xhc3MgZmlsZXMgdXBvbiB3aGljaCB0aGUgCityb290IGNsYXNzZXMgZGVwZW5kLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHRvIGNyZWF0ZSBhIGphciB3aXRoIGFsbCBvZiB0aGUKK3JlcXVpcmVkIGNsYXNzZXMgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi4KKzwvcD4KKzxwPgorY2xhc3NmaWxlc2V0cyBhcmUgdHlwaWNhbGx5IHVzZWQgYnkgcmVmZXJlbmNlLiBUaGV5IGFyZSBkZWNsYXJlZCB3aXRoIGFuCismcXVvdDtpZCZxdW90OyB2YWx1ZSBhbmQgdGhpcyBpcyB0aGVuIHVzZWQgYXMgYSByZWZlcmVuY2Ugd2hlcmUgYSBub3JtYWwgZmlsZXNldAoraXMgZXhwZWN0ZWQuCis8L3A+Cis8cD4KK1RoaXMgdHlwZSByZXF1aXJlcyB0aGUgPGNvZGU+amFrYXJ0YS1CQ0VMPC9jb2RlPiBsaWJyYXJ5LgorPC9wPgorCisKKzxoMz5BdHRyaWJ1dGVzPC9oMz4KKzxwPlRoZSBjbGFzcyBmaWxlc2V0IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGluIGFkZGl0aW9uCit0byB0aG9zZSBzdXBwb3J0ZWQgYnkgdGhlIAorPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+c3RhbmRhcmQgZmlsZXNldDwvYT46Cis8L3A+CisgCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5yb290Y2xhc3M8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+QSBzaW5nbGUgcm9vdCBjbGFzcyBuYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5OZXN0ZWQgRWxlbWVudHM8L2gzPgorCis8aDQ+Um9vdDwvaDQ+Cis8cD4KK1doZW4gbW9yZSB0aGFuIG9uZSByb290IGNsYXNzIGlzIHJlcXVpcmVkLCBtdWx0aXBsZSBuZXN0ZWQgPGNvZGU+Jmx0O3Jvb3QmZ3Q7PC9jb2RlPiBlbGVtZW50cworbWF5IGJlIHVzZWQKKzwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzbmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHJvb3QgY2xhc3M8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5Sb290RmlsZVNldDwvaDQ+Cis8cD4KK0Egcm9vdCBmaWxlc2V0IGlzIHVzZWQgdG8gYWRkIGEgc2V0IG9mIHJvb3QgY2xhc3NlcyBmcm9tIGEgZmlsZXNldC4gSW4gdGhpcyBjYXNlIHRoZSBlbnRyaWVzIGluIAordGhlIGZpbGVzZXQgYXJlIGV4cGVjdGVkIHRvIGJlIEphdmEgY2xhc3MgZmlsZXMuIFRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIGlzIGRldGVybWluZWQgYnkgdGhlIAorcmVsYXRpdmUgbG9jYXRpb24gb2YgdGhlIGNsYXNzZmlsZSBpbiB0aGUgZmlsZXNldC4gU28sIHRoZSBmaWxlIAorPGNvZGU+b3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdC5jbGFzczwvY29kZT4gY29ycmVzcG9uZHMgdG8gdGhlIEphdmEgY2xhc3MKKzxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q8L2NvZGU+LjwvcD4KKworPGg0PkV4YW1wbGVzPC9oND4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7Y2xhc3NmaWxlc2V0IGlkPSZxdW90O3JlcWRDbGFzc2VzIiBkaXI9JnF1b3Q7JHtjbGFzc2VzLmRpcn0mcXVvdDsmZ3Q7CisgICZsdDtyb290IGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0JnF1b3Q7LyZndDsKKyZsdDsvY2xhc3NmaWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5UaGlzIGV4YW1wbGUgY3JlYXRlcyBhIGZpbGVzZXQgY29udGFpbmluZyBhbGwgdGhlIGNsYXNzIGZpbGVzIHVwb24gd2hpY2ggdGhlIAorPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDwvY29kZT4gY2xhc3MgZGVwZW5kcy4gVGhpcyBmaWxlc2V0IGNvdWxkIAordGhlbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGphci4gCis8L3A+CisKKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7amFyIGRlc3RmaWxlPSZxdW90O21pbmltYWwuamFyJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCByZWZpZD0mcXVvdDtyZXFkQ2xhc3NlcyZxdW90Oy8mZ3Q7CismbHQ7L2phciZndDsKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+PHByZT4KKyZsdDtjbGFzc2ZpbGVzZXQgaWQ9JnF1b3Q7cmVxZENsYXNzZXMmcXVvdDsgZGlyPSZxdW90OyR7Y2xhc3Nlcy5kaXJ9JnF1b3Q7Jmd0OworICAmbHQ7cm9vdGZpbGVzZXQgZGlyPSZxdW90OyR7Y2xhc3Nlcy5kaXJ9JnF1b3Q7IGluY2x1ZGVzPSZxdW90O29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3QqLmNsYXNzJnF1b3Q7LyZndDsKKyZsdDsvY2xhc3NmaWxlc2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5UaGlzIGV4YW1wbGUgY29uc3RydWN0cyB0aGUgY2xhc3NmaWxlc2V0IHVzaW5nIGFsbCB0aGUgY2xhc3Mgd2l0aCBuYW1lcyBzdGFydGluZyB3aXRoIFByb2plY3QgCitpbiB0aGUgb3JnLmFwYWNoZS50b29scy5hbnQgcGFja2FnZTwvcD4gCisKKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL09wdGlvbmFsVHlwZXMvZXh0ZW5zaW9uLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFR5cGVzL2V4dGVuc2lvbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjI3NjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFR5cGVzL2V4dGVuc2lvbi5odG1sCkBAIC0wLDAgKzEsMTE0IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5FeHRlbnNpb24gVHlwZTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgyPjxhIG5hbWU9ImZpbGVzZXQiPkV4dGVuc2lvbjwvYT48L2gyPgorPHA+VXRpbGl0eSB0eXBlIHRoYXQgcmVwcmVzZW50cyBlaXRoZXIgYW4gYXZhaWxhYmxlICJPcHRpb25hbCBQYWNrYWdlIgorIChmb3JtZXJseSBrbm93biBhcyAiU3RhbmRhcmQgRXh0ZW5zaW9uIikgYXMgZGVzY3JpYmVkIGluIHRoZSBtYW5pZmVzdAorIG9mIGEgSkFSIGZpbGUsIG9yIHRoZSByZXF1aXJlbWVudCBmb3Igc3VjaCBhbiBvcHRpb25hbCBwYWNrYWdlLjwvcD4KKzxwPk5vdGUgdGhhdCB0aGlzIHR5cGUKK3dvcmtzIHdpdGggZXh0ZW5zaW9ucyBhcyBkZWZpbmVkIGJ5IHRoZSAiT3B0aW9uYWwgUGFja2FnZSIgc3BlY2lmaWNhdGlvbi4KKyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudAorPGVtPk9wdGlvbmFsIFBhY2thZ2UgVmVyc2lvbmluZzwvZW0+IGluIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91cgorSmF2YTIgU3RhbmRhcmQgRWRpdGlvbiBwYWNrYWdlLCBpbiBmaWxlCis8Y29kZT5ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvY29kZT4gb3Igb25saW5lIGF0Cis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwiPgoraHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9hPi48L3A+CisKKzxoMz5BdHRyaWJ1dGVzPC9oMz4KKzxwPlRoZSBleHRlbnNpb24gdHlwZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM8L2E+OgorPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5leHRlbnNpb25OYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGV4dGVuc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj55ZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcGVjaWZpY2F0aW9uVmVyc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmVyc2lvbiBvZiBleHRlbnNpb24gc3BlY2lmaWNhdGlvbiAoTXVzdCBiZSBpbgorICAgIGRld2V5IGRlY2ltYWwgYWthIGRvdHRlZCBkZWNpbWFsIG5vdGF0aW9uLiAzLjIuNCk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+bm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zcGVjaWZpY2F0aW9uVmVuZG9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzcGVjaWZpY2F0aW9uIHZlbmRvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmltcGxlbWVudGF0aW9uVmVyc2lvbjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmVyc2lvbiBvZiBleHRlbnNpb24gaW1wbGVtZW50YXRpb24gKE11c3QgYmUgaW4KKyAgICBkZXdleSBkZWNpbWFsIGFrYSBkb3R0ZWQgZGVjaW1hbCBub3RhdGlvbi4gMy4yLjQpPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+aW1wbGVtZW50YXRpb25WZW5kb3I8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGltcGxlbWVudGF0aW9uIHZlbmRvcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmltcGxlbWVudGF0aW9uVmVuZG9ySWQ8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGltcGxlbWVudGF0aW9uIHZlbmRvciBJRDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmltcGxlbWVudGF0aW9uVVJMPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1cmwgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBleHRlbnNpb24uPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5FeGFtcGxlczwvaDQ+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtlMSZxdW90OworICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7TXlFeHRlbnNpb25zJnF1b3Q7CisgICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7CisgICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtQZXRlciBEb25hbGQmcXVvdDsKKyAgICBpbXBsZW1lbnRhdGlvblZlbmRvcklEPSZxdW90O3Z2JnF1b3Q7CisgICAgaW1wbGVtZW50YXRpb25WZW5kb3I9JnF1b3Q7QXBhY2hlJnF1b3Q7CisgICAgaW1wbGVtZW50YXRpb25WZXJzaW9uPSZxdW90OzIuMCZxdW90OworICAgIGltcGxlbWVudGF0aW9uVVJMPSZxdW90O2h0dHA6Ly9zb21ld2hlcmUuY29tL215RXh0LmphciZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisKKzxwPkZ1bGx5IHNwZWNpZmljIGV4dGVuc2lvbiBvYmplY3QuPC9wPgorCis8YmxvY2txdW90ZT48cHJlPgorJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtlMSZxdW90OworICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7TXlFeHRlbnNpb25zJnF1b3Q7CisgICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7CisgICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtQZXRlciBEb25hbGQmcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorCis8cD5FeHRlbnNpb24gb2JqZWN0IHRoYXQganVzdCBzcGVjaWVzIHRoZSBzcGVjaWZpY2F0aW9uIGRldGFpbHMuPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9PcHRpb25hbFR5cGVzL2V4dGVuc2lvbnNldC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUeXBlcy9leHRlbnNpb25zZXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2IxNTFkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvT3B0aW9uYWxUeXBlcy9leHRlbnNpb25zZXQuaHRtbApAQCAtMCwwICsxLDgzIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5FeHRlbnNpb25TZXQgVHlwZTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgyPjxhPkV4dGVuc2lvblNldDwvYT48L2gyPgorPHA+VXRpbGl0eSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIHNldCBvZiBFeHRlbnNpb25zLjwvcD4KKzxwPk5vdGUgdGhhdCB0aGlzIHR5cGUKK3dvcmtzIHdpdGggZXh0ZW5zaW9ucyBhcyBkZWZpbmVkIGJ5IHRoZSAiT3B0aW9uYWwgUGFja2FnZSIgc3BlY2lmaWNhdGlvbi4KKyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudAorPGVtPk9wdGlvbmFsIFBhY2thZ2UgVmVyc2lvbmluZzwvZW0+IGluIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91cgorSmF2YTIgU3RhbmRhcmQgRWRpdGlvbiBwYWNrYWdlLCBpbiBmaWxlCis8Y29kZT5ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvY29kZT4gb3Igb25saW5lIGF0Cis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwiPgoraHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9hPi48L3A+CisKKzxoMz5OZXN0ZWQgRWxlbWVudHM8L2gzPgorCis8aDQ+ZXh0ZW5zaW9uPC9oND4KKzxwPjxhIGhyZWY9ImV4dGVuc2lvbi5odG1sIj5FeHRlbnNpb248L2E+IG9iamVjdCB0byBhZGQgdG8gc2V0LjwvcD4KKworPGg0PmZpbGVzZXQ8L2g0PgorIDxwPjxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBhbGwgZmlsZXMgY29udGFpbmVkCisgY29udGFpbmVkIHdpdGhpbiBzZXQgdGhhdCBhcmUgamFycyBhbmQgaW1wbGVtZW50IGFuIGV4dGVuc2lvbiBhcmUgYWRkZWQKKyB0byBleHRlbnNpb24gc2V0LjwvcD4KKworPGg0PkxpYkZpbGVTZXQ8L2g0PgorIDxwPkFsbCBmaWxlcyBjb250YWluZWQgY29udGFpbmVkIHdpdGhpbiBzZXQgdGhhdCBhcmUgamFycyBhbmQgaW1wbGVtZW50IAorIGFuIGV4dGVuc2lvbiBhcmUgYWRkZWQgdG8gZXh0ZW5zaW9uIHNldC4gSG93ZXZlciB0aGUgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIAorIG1heSBiZSBtb2RpZmllZCBieSBhdHRyaWJ1dGVzIG9mIGxpYmZpbGVzZXQ8L3A+CisKKzxoND5FeGFtcGxlczwvaDQ+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtlMSZxdW90OworICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7TXlFeHRlbnNpb25zJnF1b3Q7CisgICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7CisgICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtQZXRlciBEb25hbGQmcXVvdDsKKyAgICBpbXBsZW1lbnRhdGlvblZlbmRvcklEPSZxdW90O3Z2JnF1b3Q7CisgICAgaW1wbGVtZW50YXRpb25WZW5kb3I9JnF1b3Q7QXBhY2hlJnF1b3Q7CisgICAgaW1wbGVtZW50YXRpb25WZXJzaW9uPSZxdW90OzIuMCZxdW90OworICAgIGltcGxlbWVudGF0aW9uVVJMPSZxdW90O2h0dHA6Ly9zb21ld2hlcmUuY29tL215RXh0LmphciZxdW90Oy8mZ3Q7CisKKyZsdDtsaWJmaWxlc2V0IGlkPSJsZnMiCisgICAgICAgICAgICAgICBpbmNsdWRlVXJsPSJ0cnVlIgorICAgICAgICAgICAgICAgaW5jbHVkZUltcGw9ImZhbHNlIgorICAgICAgICAgICAgICAgZGlyPSJ0b29scy9saWIiJmd0OworICAmbHQ7aW5jbHVkZSBuYW1lPSIqLmphciIvJmd0OworJmx0Oy9saWJmaWxlc2V0Jmd0OworCismbHQ7ZXh0ZW5zaW9uU2V0IGlkPSJleHRzIiZndDsKKyAgJmx0O2xpYmZpbGVzZXQgZGlyPSJsaWIiJmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9IiouamFyIi8mZ3Q7CisgICZsdDsvbGliZmlsZXNldCZndDsKKyAgJmx0O2xpYmZpbGVzZXQgcmVmaWQ9ImxmcyIvJmd0OworICAmbHQ7ZXh0ZW5zaW9uIHJlZmlkPSJlMSIvJmd0OworJmx0Oy9leHRlbnNpb25TZXQmZ3Q7CisKKzwvcHJlPjwvYmxvY2txdW90ZT4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvYW50ZXh0ZXJuYWwuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL2FudGV4dGVybmFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5NTFkNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL2FudGV4dGVybmFsLmh0bWwKQEAgLTAsMCArMSwxNjAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SW5wdXRIYW5kbGVyPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+VXNpbmcgQW50IFRhc2tzIE91dHNpZGUgb2YgQW50PC9oMT4KKworPGgyPlJhdGlvbmFsZTwvaDI+CisKKzxwPkFudCBwcm92aWRlcyBhIHJpY2ggc2V0IG9mIHRhc2tzIGZvciBidWlsZGZpbGUgY3JlYXRvcnMgYW5kCithZG1pbmlzdHJhdG9ycy4gIEJ1dCB3aGF0IGFib3V0IHByb2dyYW1tZXJzPyAgQ2FuIHRoZSBmdW5jdGlvbmFsaXR5Citwcm92aWRlZCBieSBBbnQgdGFza3MgYmUgdXNlZCBpbiBqYXZhIHByb2dyYW1zPzwvcD4KKworPHA+WWVzLCBhbmQgaXRzIHF1aXRlIGVhc3kuICBCZWZvcmUgZ2V0dGluZyBpbnRvIHRoZSBkZXRhaWxzLCBob3dldmVyLCAKK3dlIHNob3VsZCBtZW50aW9uIHRoZSBwcm9zIGFuZCBjb25zIG9mIHRoaXMgYXBwcm9hY2g6CisKKzxoMz5Qcm9zPC9oMz4KKworPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBtYXJnaW49IjAiIGJvcmRlcj0iMSI+Cis8dHI+Cis8dGQ+PGI+Um9idXN0PC9iPjwvdGQ+Cis8dGQ+CitBbnQgdGFza3MgYXJlIHZlcnkgcm9idXN0LiAgVGhleSBoYXZlIGJlZW4gYmFuZ2VkIG9uIGJ5IG1hbnkgcGVvcGxlLgorQW50IHRhc2tzIGhhdmUgYmVlbiB1c2VkIGluIG1hbnkgZGlmZmVyZW50IGNvbnRleHRzLCBhbmQgaGF2ZQordGhlcmVmb3JlIGJlZW4gaW5zdHJ1bWVudGVkIHRvIHRha2UgY2FyZSBvZiBhIGdyZWF0IG1hbnkgYm91bmRhcnkKK2NvbmRpdGlvbnMgYW5kIHBvdGVudGlhbGx5IG9ic2N1cmUgZXJyb3JzLgorPC90ZD4KKzwvdHI+Cis8dHI+Cis8dGQ+PGI+Q3Jvc3MgUGxhdGZvcm08L2I+PC90ZD4KKzx0ZD4KK0FudCB0YXNrcyBhcmUgY3Jvc3MgcGxhdGZvcm0uICBUaGV5IGhhdmUgYmVlbiB0ZXN0ZWQgb24gYWxsIG9mIHRoZQordm9sdW1lIHBsYXRmb3JtcywgYW5kIHNldmVyYWwgcmF0aGVyIHVudXN1YWwgb25lcyAoTmV0d2FyZSBhbmQgT1MvMzkwLCB0bworbmFtZSBhIGZldykuCis8L3RkPgorPC90cj4KKzx0cj4KKzx0ZD48Yj5Db21tdW5pdHkgU3VwcG9ydDwvYj48L3RkPgorPHRkPgorVXNpbmcgQW50IHRhc2tzIG1lYW5zIHlvdSBoYXZlIGxlc3Mgb2YgeW91ciBvd24gY29kZSB0byBzdXBwb3J0LiAgQW50Citjb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgZW50aXJlIEFwYWNoZSBBbnQgY29tbXVuaXR5LgorPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8aDM+Q29uczwvaDM+CisKKzx0YWJsZSBjZWxscGFkZGluZz0iMCIgbWFyZ2luPSIwIiBib3JkZXI9IjEiPgorPHRyPgorPHRkPjxiPkRlcGVuZGVuY3kgb24gQW50IExpYnJhcmllczwvYj48L3RkPgorPHRkPgorT2J2aW91c2x5LCBpZiB5b3UgdXNlIGFuIEFudCB0YXNrIGluIHlvdXIgY29kZSwgeW91IHdpbGwgaGF2ZSB0byBhZGQKKyJhbnQuamFyIiB0byB5b3VyIHBhdGguICBPZiBjb3Vyc2UsIHlvdSBjb3VsZCB1c2UgYSBjb2RlIG9wdGltaXplciB0bworcmVtb3ZlIHRoZSB1bm5lY2Vzc2FyeSBjbGFzc2VzLCBidXQgeW91IHdpbGwgc3RpbGwgcHJvYmFibHkgcmVxdWlyZSBhCitjaHVuayBvZiB0aGUgQW50IGNvcmUuCis8L3RkPgorPC90cj4KKzx0cj4KKzx0ZD48Yj5Mb3NzIG9mIEZsZXhpYmlsaXR5PC9iPjwvdGQ+Cis8dGQ+CitBdCBzb21lIHBvaW50LCBpZiB5b3UgZmluZCB5b3Vyc2VsZiBoYXZpbmcgdG8gbW9kaWZ5IHRoZSBBbnQgY29kZSwgaXQKK3Byb2JhYmx5IG1ha2VzIG1vcmUgc2Vuc2UgdG8gInJvbGwgeW91ciBvd24uIiAgT2YgY291cnNlLCB5b3UgY2FuCitzdGlsbCBzdGVhbCBzb21lIGNvZGUgc25pcHBldHMgYW5kIGdvb2QgaWRlYXMuICBUaGlzIGlzIHRoZSBiZWF1dHkgb2YKK29wZW4gc291cmNlIQorPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCisKKzxoMj5FeGFtcGxlPC9oMj4KKworPHA+TGV0J3Mgc2F5IHlvdSB3YW50IHRvIHVuemlwIGEgemlwIGZpbGUgcHJvZ3JhbW1hdGljYWxseSBmcm9tIGphdmEKK2ludG8gYSBjZXJ0YWluIGRpcmVjdG9yeS4gIE9mIGNvdXJzZSB5b3UgY291bGQgd3JpdGUgeW91ciBvd24gcm91dGluZQordG8gZG8gdGhpcywgYnV0IHdoeSBub3QgdXNlIHRoZSBBbnQgdGFzayB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbj88L3A+CisKKzxwPkluIG15IGV4YW1wbGUsIEkgd2FudGVkIHRvIGJlIGFibGUgdG8gdW56aXAgYSBmaWxlIGZyb20gd2l0aGluIGFuCitYU0xUIFRyYW5zZm9ybWF0aW9uLiAgWFNMVCBUcmFuc2Zvcm1lcnMgY2FuIGJlIGV4dGVuZGVkIGJ5IHBsdWdnaW5nIGluCitzdGF0aWMgbWV0aG9kcyBpbiBqYXZhLiAgSSB0aGVyZWZvcmUgbmVlZCBhIGZ1bmN0aW9uIHNvbWV0aGluZyBsaWtlCit0aGlzOjwvcD4KKworPHByZT4KKy8qKgorICogVW56aXAgYSB6aXAgZmlsZSBpbnRvIGEgZ2l2ZW4gZGlyZWN0b3J5LgorICoKKyAqIEBwYXJhbSB6aXBGaWxlcGF0aCBBIHBhdGhuYW1lIHJlcHJlc2VudGluZyBhIGxvY2FsIHppcCBmaWxlCisgKiBAcGFyYW0gZGVzdGluYXRpb25EaXIgd2hlcmUgdG8gdW56aXAgdGhlIGFyY2hpdmUgdG8KKyAqLworIHN0YXRpYyBwdWJsaWMgdm9pZCB1bnppcChTdHJpbmcgemlwRmlsZXBhdGgsIFN0cmluZyBkZXN0aW5hdGlvbkRpcikKKzwvcHJlPgorCis8cD4KK1RoZSBBbnQgdGFzayB0byBwZXJmb3JtIHRoaXMgZnVuY3Rpb24gaXMKKzxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4cGFuZDwvY29kZT4uICBBbGwgd2UgaGF2ZSB0byBkbworaXMgY3JlYXRlIGEgZHVtbXkgQW50IDxjb2RlPlByb2plY3Q8L2NvZGU+IGFuZCA8Y29kZT5UYXJnZXQ8L2NvZGU+LAorc2V0IHRoZSA8Y29kZT5UYXNrPC9jb2RlPiBwYXJhbWV0ZXJzIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgc2V0IGluIGEKK2J1aWxkZmlsZSwgYW5kIGNhbGwgPGNvZGU+ZXhlY3V0ZSgpPC9jb2RlPi48L3A+CisKKzxwPkZpcnN0LCBsZXQncyBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcHJvcGVyIGluY2x1ZGVzOjwvcD4KKworPHByZT4KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeHBhbmQ7CitpbXBvcnQgamF2YS5pby5GaWxlOworPC9wcmU+CisKKzxwPlRoZSBmdW5jdGlvbiBjYWxsIGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZTo8L3A+CisKKzxwcmU+CitzdGF0aWMgcHVibGljIHZvaWQgdW56aXAoU3RyaW5nIHppcEZpbGVwYXRoLCBTdHJpbmcgZGVzdGluYXRpb25EaXIpIHsKKworICAgIGZpbmFsIGNsYXNzIEV4cGFuZGVyIGV4dGVuZHMgRXhwYW5kIHsKKyAgICAgICAgcHVibGljIEV4cGFuZGVyKCkgeworIAkgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisJICAgIHByb2plY3QuaW5pdCgpOworCSAgICB0YXNrVHlwZSA9ICJ1bnppcCI7CisJICAgIHRhc2tOYW1lID0gInVuemlwIjsKKwkgICAgdGFyZ2V0ID0gbmV3IFRhcmdldCgpOworCX0JCisgICAgfQorICAgIEV4cGFuZGVyIGV4cGFuZGVyID0gbmV3IEV4cGFuZGVyKCk7CisgICAgZXhwYW5kZXIuc2V0U3JjKG5ldyBGaWxlKHppcGZpbGUpKTsKKyAgICBleHBhbmRlci5zZXREZXN0KG5ldyBGaWxlKGRlc3RkaXIpKTsKKyAgICBleHBhbmRlci5leGVjdXRlKCk7Cis8L3ByZT4KKworPHA+SW4gYWN0dWFsIHByYWN0aWNlLCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIGFkZCB5b3VyIG93biBlcnJvcgoraGFuZGxpbmcgY29kZSBhbmQgeW91IG1heSBub3Qgd2FudCB0byB1c2UgYSBsb2NhbCBpbm5lciBjbGFzcy4KK0hvd2V2ZXIsIHRoZSBwb2ludCBvZiB0aGUgZXhhbXBsZSBpcyB0byBzaG93IGhvdyBhbiBBbnQgdGFzayBjYW4gYmUKK2NhbGxlZCBwcm9ncmFtbWF0aWNhbGx5IGluIHJlbGF0aXZlbHkgZmV3IGxpbmVzIG9mIGNvZGUuPC9wPgorCis8cD5UaGUgcXVlc3Rpb24geW91IGFyZSBwcm9iYWJseSBhc2tpbmcgeW91cnNlbGYgYXQgdGhpcyBwb2ludCBpczoKKzxpPkhvdyB3b3VsZCBJIGtub3cgd2hpY2ggY2xhc3NlcyBhbmQgbWV0aG9kcyBoYXZlIHRvIGJlIGNhbGxlZCBpbgorb3JkZXIgdG8gc2V0IHVwIGEgZHVtbXkgUHJvamVjdCBhbmQgVGFyZ2V0PzwvaT4gVGhlIGFuc3dlciBpczogeW91Citkb24ndC4gIFVsdGltYXRlbHksIHlvdSBoYXZlIHRvIGJlIHdpbGxpbmcgdG8gZ2V0IHlvdXIgZmVldCB3ZXQgYW5kCityZWFkIHRoZSBzb3VyY2UgY29kZS4gIFRoZSBhYm92ZSBleGFtcGxlIGlzIG1lcmVseSBkZXNpZ25lZCB0byB3aGV0Cit5b3VyIGFwcGV0aXRlIGFuZCBnZXQgeW91IHN0YXJ0ZWQuICBHbyBmb3IgaXQhPC9wPgorCisKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL2FudHRhc2tzbGlzdC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvYW50dGFza3NsaXN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiMmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL2FudHRhc2tzbGlzdC5odG1sCkBAIC0wLDAgKzEsNDIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KKzx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KKzxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+Cis8L2hlYWQ+CisKKzxib2R5PgorCisKKzxoMj48YSBocmVmPSJ0b2MuaHRtbCIgdGFyZ2V0PSJuYXZGcmFtZSI+VGFibGUgb2YgQ29udGVudHM8L2E+PC9oMj4KKworPGgzPkFudCBUYXNrczwvaDM+Cis8YSBocmVmPSJ0YXNrc292ZXJ2aWV3Lmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5PdmVydmlldyBvZiBBbnQgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9ImNvcmV0YXNrbGlzdC5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5Db3JlIFRhc2tzPC9hPjxici8+Cis8YSBocmVmPSJvcHRpb25hbHRhc2tsaXN0Lmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPk9wdGlvbmFsIFRhc2tzPC9hPjxici8+Cis8ZGl2IHN0eWxlPSJwYWRkaW5nLWxlZnQ6MWVtIj4KKyAgPGEgaHJlZj0iaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiIHRhcmdldD0ibWFpbkZyYW1lIj4KKyAgTGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+PGJyLz4KKzwvZGl2PgorCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL2FwaS9pbmRleC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvYXBpL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzMDk5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL2FwaS9pbmRleC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkFwYWNoZSBBbnQgQVBJPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGI+QXBhY2hlIEFudCBBUEkgaGFzIG5vdCBiZWVuIGdlbmVyYXRlZDwvYj4KKworPHA+SWYgeW91IHNlZSB0aGlzIHBhZ2Ugb25saW5lIGF0IDxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5hbnQuYXBhY2hlLm9yZzwvYT4sIGl0IGlzIG5vdCBhIGJ1ZywgYnV0CitvbiBwdXJwb3NlLiAgV2UgZG8gbm90IHByb3ZpZGUgYW4gb25saW5lIHZlcnNpb24gb2YgdGhlIEFQSSBkb2NzLCB0aGV5CithcmUgaW5jbHVkZWQgd2l0aCBhbGwgb3VyIGRpc3RyaWJ1dGlvbnMuPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9iYXNlX3Rhc2tfY2xhc3Nlcy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvYmFzZV90YXNrX2NsYXNzZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjA1OGViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvYmFzZV90YXNrX2NsYXNzZXMuaHRtbApAQCAtMCwwICsxLDExNCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5UYXNrcyBEZXNpZ25lZCBmb3IgRXh0ZW5zaW9uPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+VGFza3MgRGVzaWduZWQgZm9yIEV4dGVuc2lvbjwvaDE+CisKKzxwPlRoZXNlIGNsYXNzZXMgYXJlIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkLiAgQWx3YXlzIHN0YXJ0IGhlcmUgd2hlbiB3cml0aW5nIHlvdXIgb3duIHRhc2suPC9wPgorCis8cD48c3Ryb25nPlRoZSBsaW5rcyB3aWxsIG5vdCB3b3JrIGluIHRoZSBvbmxpbmUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ljwvc3Ryb25nPjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSI+Cis8dGhlYWQ+Cis8dHI+Cis8dGg+CitDbGFzcworPC90aD4KKzx0aD4KK0Rlc2NyaXB0aW9uCis8L3RoPgorPC90cj4KKzwvdGhlYWQ+Cis8dGJvZHk+Cis8dHI+Cis8dGQ+Cis8YSBocmVmPSJhcGkvb3JnL2FwYWNoZS90b29scy9hbnQvVGFzay5odG1sIj5UYXNrPC9hPgorPC90ZD4KKzx0ZD4KK0Jhc2UgY2xhc3MgZm9yIGFsbCB0YXNrcy4KKzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+Cis8YSBocmVmPSJhcGkvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQWJzdHJhY3RDdnNUYXNrLmh0bWwiPkFic3RyYWN0Q3ZzVGFzazwvYT4KKzwvdGQ+Cis8dGQ+CitBbm90aGVyIHRhc2sgY2FuIGV4dGVuZCB0aGlzIHdpdGggc29tZSBjdXN0b21pemVkIG91dHB1dCBwcm9jZXNzaW5nCis8L3RkPgorPC90cj4KKworPHRyPgorPHRkPgorPGEgaHJlZj0iYXBpL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0pEQkNUYXNrLmh0bWwiPkpEQkNUYXNrPC9hPgorPC90ZD4KKzx0ZD4KK0hhbmRsZXMgSkRCQyBjb25maWd1cmF0aW9uIG5lZWRlZCBieSBTUUwgdHlwZSB0YXNrcy4KKzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+Cis8YSBocmVmPSJhcGkvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWF0Y2hpbmdUYXNrLmh0bWwiPk1hdGNoaW5nVGFzazwvYT4KKzwvdGQ+Cis8dGQ+CitUaGlzIGlzIGFuIGFic3RyYWN0IHRhc2sgdGhhdCBzaG91bGQgYmUgdXNlZCBieSBhbGwgdGhvc2UgdGFza3MgdGhhdCByZXF1aXJlIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBmaWxlcyBiYXNlZCBvbiBwYXR0ZXJuIG1hdGNoaW5nLgorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0ZD4KKzxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYWNrLmh0bWwiPlBhY2s8L2E+Cis8L3RkPgorPHRkPgorQWJzdHJhY3QgQmFzZSBjbGFzcyBmb3IgcGFjayB0YXNrcy4KKzwvdGQ+Cis8L3RyPgorCisKKzx0cj4KKzx0ZD4KKzxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnBhY2suaHRtbCI+VW5wYWNrPC9hPgorPC90ZD4KKzx0ZD4KK0Fic3RyYWN0IEJhc2UgY2xhc3MgZm9yIHVucGFjayB0YXNrcy4KKzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGQ+Cis8YSBocmVmPSJhcGkvb3JnL2FwYWNoZS90b29scy9hbnQvZGlzcGF0Y2gvRGlzcGF0Y2hUYXNrLmh0bWwiPkRpc3BhdGNoVGFzazwvYT4KKzwvdGQ+Cis8dGQ+CitBYnN0cmFjdCBCYXNlIGNsYXNzIGZvciB0YXNrcyB0aGF0IG1heSBoYXZlIG11bHRpcGxlIGFjdGlvbnMuCis8L3RkPgorPC90cj4KKworPC90Ym9keT4KKzwvdGFibGU+CisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9jbG9uZXZtLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9jbG9uZXZtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzNTU0NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL2Nsb25ldm0uaHRtbApAQCAtMCwwICsxLDUyIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPmFudC5idWlsZC5jbG9uZXZtPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBuYW1lPSJjbG9uZXZtIj5hbnQuYnVpbGQuY2xvbmV2bTwvYT48L2gyPgorCis8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+PC9wPgorCis8cD5UaGUgdmFsdWUgb2YgdGhlIGFudC5idWlsZC5jbG9uZXZtIHN5c3RlbSBwcm9wZXJ0eSBjb250cm9scyBob3cgQW50CitpbnN0cnVtZW50cyBmb3JrZWQgSmF2YSBWaXJ0dWFsIE1hY2hpbmVzLiAgVGhlIDxhCitocmVmPSJDb3JlVGFza3MvamF2YS5odG1sIj5qYXZhPC9hPiBhbmQgPGEKK2hyZWY9Ik9wdGlvbmFsVGFza3MvanVuaXQuaHRtbCI+anVuaXQ8L2E+IHRhc2tzIHN1cHBvcnQgY2xvbmV2bQorYXR0cmlidXRlcyB0byBjb250cm9sIHRoZSBWTXMgb24gYSB0YXNrLWJ5LXRhc2sgYmFzaXMgd2hpbGUgdGhlIHN5c3RlbQorcHJvcGVydHkgYXBwbGllcyB0byBhbGwgZm9ya2VkIEphdmEgVk1zLjwvcD4KKworPHA+SWYgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyB0cnVlLCB0aGVuIGFsbCBzeXN0ZW0gcHJvcGVydGllcyBvZgordGhlIGZvcmtlZCBKYXZhIFZpcnR1YWwgTWFjaGluZSB3aWxsIGJlIHRoZSBzYW1lIGFzIHRob3NlIG9mIHRoZSBKYXZhCitWTSBydW5uaW5nIEFudC4gIEluIGFkZGl0aW9uLCBpZiB5b3Ugc2V0IGFudC5idWlsZC5jbG9uZXZtIHRvIHRydWUgYW5kIDxhCitocmVmPSJzeXNjbGFzc3BhdGguaHRtbCI+YnVpbGQuc3lzY2xhc3NwYXRoPC9hPiBoYXMgbm90IGJlZW4gc2V0LCB0aGUKK2Jvb3RjbGFzc3BhdGggb2YgZm9ya2VkIEphdmEgVk1zIGdldHMgY29uc3RydWN0ZWQgYXMgaWYKK2J1aWxkLnN5c2NsYXNzcGF0aCBoYWQgdGhlIHZhbHVlICJsYXN0Ii48L3A+CisKKzxwPk5vdGUgdGhhdCB0aGlzIGhhcyB0byBiZSBhIHN5c3RlbSBwcm9wZXJ0eSwgc28gaXQgY2Fubm90IGJlCitzcGVjaWZpZWQgb24gdGhlIEFudCBjb21tYW5kIGxpbmUuICBVc2UgdGhlIEFOVF9PUFRTIGVudmlyb25tZW50Cit2YXJpYWJsZSBpbnN0ZWFkLjwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL2NvbmNlcHRzdHlwZXNsaXN0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9jb25jZXB0c3R5cGVzbGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMDlhODQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9jb25jZXB0c3R5cGVzbGlzdC5odG1sCkBAIC0wLDAgKzEsNzggQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KKzx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KKzxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgaHJlZj0idG9jLmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPlRhYmxlIG9mIENvbnRlbnRzPC9hPjwvaDI+CisKKzxoMz5Db25jZXB0czwvaDM+Cis8YSBocmVmPSJjbG9uZXZtLmh0bWwiPmFudC5idWlsZC5jbG9uZXZtPC9hPjxici8+Cis8YSBocmVmPSJzeXNjbGFzc3BhdGguaHRtbCI+YnVpbGQuc3lzY2xhc3NwYXRoPC9hPjxici8+Cis8YSBocmVmPSJqYXZhY3Byb3BzLmh0bWwiPkFudCBwcm9wZXJ0aWVzIGNvbnRyb2xsaW5nIGphdmFjPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvY29tbW9uLmh0bWwiPkNvbW1vbiBBdHRyaWJ1dGVzPC9hPjxici8+CisKKzxoMz5Db3JlIFR5cGVzPC9oMz4KKzxhIGhyZWY9IkNvcmVUeXBlcy9kZXNjcmlwdGlvbi5odG1sIj5EZXNjcmlwdGlvbiBUeXBlPC9hPjxici8+Cis8YSBocmVmPSJkaXJ0YXNrcy5odG1sIj5EaXJlY3RvcnktYmFzZWQgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUeXBlcy9kaXJzZXQuaHRtbCI+RGlyU2V0PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMvZmlsZWxpc3QuaHRtbCI+RmlsZUxpc3Q8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUeXBlcy9tYXBwZXIuaHRtbCI+RmlsZSBNYXBwZXJzPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+RmlsdGVyQ2hhaW5zIGFuZCBGaWx0ZXJSZWFkZXJzPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMvZmlsdGVyc2V0Lmh0bWwiPkZpbHRlclNldDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVR5cGVzL3BhdHRlcm5zZXQuaHRtbCI+UGF0dGVyblNldDwvYT48YnIvPgorPGEgaHJlZj0idXNpbmcuaHRtbCNwYXRoIj5QYXRoLWxpa2UgU3RydWN0dXJlczwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVR5cGVzL3Blcm1pc3Npb25zLmh0bWwiPlBlcm1pc3Npb25zPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+UHJvcGVydHlTZXQ8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUeXBlcy9yZWRpcmVjdG9yLmh0bWwiPkkvTyBSZWRpcmVjdG9yczwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVR5cGVzL3JlZ2V4cC5odG1sIj5SZWdleHA8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCI+UmVzb3VyY2VzPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbnM8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUeXBlcy9zZWxlY3RvcnMuaHRtbCI+U2VsZWN0b3JzPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMvdGFyZmlsZXNldC5odG1sIj5UYXJGaWxlU2V0PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMveG1sY2F0YWxvZy5odG1sIj5YTUxDYXRhbG9nPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMvemlwZmlsZXNldC5odG1sIj5aaXBGaWxlU2V0PC9hPjxici8+CisKKzxoMz5PcHRpb25hbCBUeXBlczwvaDM+Cis8YSBocmVmPSJPcHRpb25hbFR5cGVzL2NsYXNzZmlsZXNldC5odG1sIj5DbGFzcyBGaWxlc2V0PC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFR5cGVzL2V4dGVuc2lvbi5odG1sIj5FeHRlbnNpb24gUGFja2FnZTwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUeXBlcy9leHRlbnNpb25zZXQuaHRtbCI+U2V0IG9mIEV4dGVuc2lvbiBQYWNrYWdlczwvYT48YnIvPgorCis8aDM+TmFtZXNwYWNlPC9oMz4KKzxhIGhyZWY9IkNvcmVUeXBlcy9uYW1lc3BhY2UuaHRtbCI+TmFtZXNwYWNlIFN1cHBvcnQ8L2E+PGJyLz4KKworPGgzPkFudGxpYjwvaDM+Cis8YSBocmVmPSJDb3JlVHlwZXMvYW50bGliLmh0bWwiPkFudGxpYjwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVR5cGVzL2FudGxpYi5odG1sI2FudGxpYm5hbWVzcGFjZSI+QW50bGliIG5hbWVzcGFjZTwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVR5cGVzL2FudGxpYi5odG1sI2N1cnJlbnRuYW1lc3BhY2UiPkN1cnJlbnQgbmFtZXNwYWNlPC9hPjxici8+CisKKzxoMz5DdXN0b20gQ29tcG9uZW50czwvaDM+Cis8YSBocmVmPSJDb3JlVHlwZXMvY3VzdG9tLXByb2dyYW1taW5nLmh0bWwiPkN1c3RvbSBDb21wb25lbnRzPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMvY3VzdG9tLXByb2dyYW1taW5nLmh0bWwjY3VzdG9tY29uZGl0aW9ucyI+Q29uZGl0aW9uczwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVR5cGVzL2N1c3RvbS1wcm9ncmFtbWluZy5odG1sI2N1c3RvbXNlbGVjdG9ycyI+U2VsZWN0b3JzPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVHlwZXMvY3VzdG9tLXByb2dyYW1taW5nLmh0bWwjZmlsdGVycmVhZGVycyI+RmlsdGVyUmVhZGVyczwvYT48YnIvPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9jb3JldGFza2xpc3QuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL2NvcmV0YXNrbGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjMzODkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9jb3JldGFza2xpc3QuaHRtbApAQCAtMCwwICsxLDEzMyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiLz4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyIvPgorPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWw8L3RpdGxlPgorPGJhc2UgdGFyZ2V0PSJtYWluRnJhbWUiLz4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBocmVmPSJ0b2MuaHRtbCIgdGFyZ2V0PSJuYXZGcmFtZSI+VGFibGUgb2YgQ29udGVudHM8L2E+PC9oMj4KKworPGEgaHJlZj0ib3B0aW9uYWx0YXNrbGlzdC5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5PcHRpb25hbCBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0idGFza3NvdmVydmlldy5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+T3ZlcnZpZXcgb2YgQW50IFRhc2tzPC9hPjxici8+Cis8YSBocmVmPSJjb25jZXB0c3R5cGVzbGlzdC5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5Db25jZXB0cyBhbmQgVHlwZXM8L2E+PGJyLz4KKworPGgzPkNvcmUgVGFza3M8L2gzPgorPGEgaHJlZj0iQ29yZVRhc2tzL2FudC5odG1sIj5BbnQ8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9hbnRjYWxsLmh0bWwiPkFudENhbGw8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9hbnRzdHJ1Y3R1cmUuaHRtbCI+QW50U3RydWN0dXJlPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvYW50dmVyc2lvbi5odG1sIj5BbnRWZXJzaW9uPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvYXBwbHkuaHRtbCI+QXBwbHkvPGk+RXhlY09uPC9pPjwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2FwdC5odG1sIj5BcHQ8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9hdmFpbGFibGUuaHRtbCI+QXZhaWxhYmxlPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvYmFzZW5hbWUuaHRtbCI+QmFzZW5hbWU8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9idWlsZG51bWJlci5odG1sIj5CdWlsZE51bWJlcjwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3VucGFjay5odG1sIj5CVW56aXAyPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvcGFjay5odG1sIj5CWmlwMjwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2NoZWNrc3VtLmh0bWwiPkNoZWNrc3VtPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvY2htb2QuaHRtbCI+Q2htb2Q8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9jb25jYXQuaHRtbCI+Q29uY2F0PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvY29uZGl0aW9uLmh0bWwiPkNvbmRpdGlvbjwvYT48YnIvPgorPGRpdiBzdHlsZT0icGFkZGluZy1sZWZ0OjFlbSI+CisgIDxhIGhyZWY9IkNvcmVUYXNrcy9jb25kaXRpb25zLmh0bWwiPlN1cHBvcnRlZCBjb25kaXRpb25zPC9hPjxici8+Cis8L2Rpdj4KKzxhIGhyZWY9IkNvcmVUYXNrcy9jb3B5Lmh0bWwiPkNvcHk8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9jb3B5ZGlyLmh0bWwiPjxpPkNvcHlkaXI8L2k+PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvY29weWZpbGUuaHRtbCI+PGk+Q29weWZpbGU8L2k+PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvY29tcG9uZW50ZGVmLmh0bWwiPkNvbXBvbmVudGRlZjwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2N2cy5odG1sIj5DdnM8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9jaGFuZ2Vsb2cuaHRtbCI+Q3ZzQ2hhbmdlTG9nPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvY3ZzdmVyc2lvbi5odG1sIj5DdnNWZXJzaW9uPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvY3ZzcGFzcy5odG1sIj5DVlNQYXNzPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvY3ZzdGFnZGlmZi5odG1sIj5DdnNUYWdEaWZmPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvZGVmYXVsdGV4Y2x1ZGVzLmh0bWwiPkRlZmF1bHRleGNsdWRlczwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2RlbGV0ZS5odG1sIj5EZWxldGU8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9kZWx0cmVlLmh0bWwiPjxpPkRlbHRyZWU8L2k+PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvZGVwZW5kc2V0Lmh0bWwiPkRlcGVuZHNldDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2RpYWdub3N0aWNzLmh0bWwiPkRpYWdub3N0aWNzPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvZGlybmFtZS5odG1sIj5EaXJuYW1lPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvZWFyLmh0bWwiPkVhcjwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2VjaG8uaHRtbCI+RWNobzwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2VjaG94bWwuaHRtbCI+RWNob1hNTDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2V4ZWMuaHRtbCI+RXhlYzwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2ZhaWwuaHRtbCI+RmFpbDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2ZpbHRlci5odG1sIj5GaWx0ZXI8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9maXhjcmxmLmh0bWwiPkZpeENSTEY8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9nZW5rZXkuaHRtbCI+R2VuS2V5PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvZ2V0Lmh0bWwiPkdldDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3VucGFjay5odG1sIj5HVW56aXA8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9wYWNrLmh0bWwiPkdaaXA8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9pbXBvcnQuaHRtbCI+SW1wb3J0PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvaW5wdXQuaHRtbCI+SW5wdXQ8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9qYXIuaHRtbCI+SmFyPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvamF2YS5odG1sIj5KYXZhPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvamF2YWMuaHRtbCI+SmF2YWM8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9qYXZhZG9jLmh0bWwiPkphdmFkb2MvPGk+SmF2YWRvYzI8L2k+PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvbGVuZ3RoLmh0bWwiPkxlbmd0aDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL2xvYWRmaWxlLmh0bWwiPkxvYWRGaWxlPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvbG9hZHByb3BlcnRpZXMuaHRtbCI+TG9hZFByb3BlcnRpZXM8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9sb2FkcmVzb3VyY2UuaHRtbCI+TG9hZFJlc291cmNlPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvbWFrZXVybC5odG1sIj5NYWtlVVJMPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvbWFpbC5odG1sIj5NYWlsPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvbWFjcm9kZWYuaHRtbCI+TWFjcm9EZWY8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9tYW5pZmVzdC5odG1sIj5NYW5pZmVzdDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL21hbmlmZXN0Y2xhc3NwYXRoLmh0bWwiPk1hbmlmZXN0Q2xhc3NQYXRoPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvbWtkaXIuaHRtbCI+TWtkaXI8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9tb3ZlLmh0bWwiPk1vdmU8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9uaWNlLmh0bWwiPk5pY2U8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9wYXJhbGxlbC5odG1sIj5QYXJhbGxlbDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3BhdGNoLmh0bWwiPlBhdGNoPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvcGF0aGNvbnZlcnQuaHRtbCI+UGF0aENvbnZlcnQ8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9wcmVzZXRkZWYuaHRtbCI+UHJlU2V0RGVmPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvcHJvcGVydHkuaHRtbCI+UHJvcGVydHk8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9yZWNvcmRlci5odG1sIj5SZWNvcmQ8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9yZW5hbWUuaHRtbCI+PGk+UmVuYW1lPC9pPjwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3JlcGxhY2UuaHRtbCI+UmVwbGFjZTwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3Jlc291cmNlY291bnQuaHRtbCI+UmVzb3VyY2VDb3VudDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3JldHJ5Lmh0bWwiPlJldHJ5PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3Mvcm1pYy5odG1sIj5SbWljPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3Mvc2VxdWVudGlhbC5odG1sIj5TZXF1ZW50aWFsPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3Mvc2lnbmphci5odG1sIj5TaWduSmFyPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3Mvc2xlZXAuaHRtbCI+U2xlZXA8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy9zcWwuaHRtbCI+U3FsPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3Mvc3ViYW50Lmh0bWwiPlN1YmFudDwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3N5bmMuaHRtbCI+U3luYzwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3Rhci5odG1sIj5UYXI8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy90YXNrZGVmLmh0bWwiPlRhc2tkZWY8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy90ZW1wZmlsZS5odG1sIj5UZW1wZmlsZTwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3RvdWNoLmh0bWwiPlRvdWNoPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvdHJ1bmNhdGUuaHRtbCI+VHJ1bmNhdGU8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy90c3RhbXAuaHRtbCI+VFN0YW1wPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvdHlwZWRlZi5odG1sIj5UeXBlZGVmPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvdW56aXAuaHRtbCI+VW5qYXI8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy91bnppcC5odG1sIj5VbnRhcjwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3VuemlwLmh0bWwiPlVud2FyPC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvdW56aXAuaHRtbCI+VW56aXA8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy91cHRvZGF0ZS5odG1sIj5VcHRvZGF0ZTwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3dhaXRmb3IuaHRtbCI+V2FpdGZvcjwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3doaWNocmVzb3VyY2UuaHRtbCI+V2hpY2hSZXNvdXJjZTwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3dhci5odG1sIj5XYXI8L2E+PGJyLz4KKzxhIGhyZWY9IkNvcmVUYXNrcy94bWxwcm9wZXJ0eS5odG1sIj5YbWxQcm9wZXJ0eTwvYT48YnIvPgorPGEgaHJlZj0iQ29yZVRhc2tzL3N0eWxlLmh0bWwiPlhTTFQvPGk+U3R5bGU8L2k+PC9hPjxici8+Cis8YSBocmVmPSJDb3JlVGFza3MvemlwLmh0bWwiPlppcDwvYT48YnIvPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvY292ZXIuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL2NvdmVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyYmQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL2NvdmVyLmh0bWwKQEAgLTAsMCArMSw0MiBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5BcGFjaGUgQW50IDEuOC4wIFVzZXIgTWFudWFsPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8ZGl2IGFsaWduPSJjZW50ZXIiPiAKKyAgPGgxPjxpbWcgc3JjPSIuLi9pbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjEyMCI+PC9oMT4KKyAgPGgxPkFwYWNoZSBBbnQgMS43LjEgTWFudWFsPC9oMT4KKyAgPHAgYWxpZ249ImxlZnQiPlRoaXMgaXMgdGhlIG1hbnVhbCBmb3IgdmVyc2lvbiAxLjguMCBvZiAKKyAgPGEgdGFyZ2V0PSJfdG9wIiBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaW5kZXguaHRtbCI+QXBhY2hlIEFudDwvYT4uIAorICAgIElmIHlvdXIgdmVyc2lvbiAKKyAgICBvZiBBbnQgKGFzIHZlcmlmaWVkIHdpdGggPHR0PmFudCAtdmVyc2lvbjwvdHQ+KSBpcyBvbGRlciBvciBuZXdlciB0aGFuIHRoaXMgCisgICAgdmVyc2lvbiB0aGVuIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0IG1hbnVhbCBzZXQuIFBsZWFzZSB1c2UgdGhlIGRvY3VtZW50YXRpb24gCisgICAgYXBwcm9wcmlhdGUgdG8geW91ciBjdXJyZW50IHZlcnNpb24uIEFsc28sIGlmIHlvdSBhcmUgdXNpbmcgYSB2ZXJzaW9uCisgICAgb2xkZXIgdGhhbiB0aGUgbW9zdCByZWNlbnQgcmVsZWFzZSwgd2UgcmVjb21tZW5kIGFuIHVwZ3JhZGUgdG8gZml4IGJ1Z3MKKyAgICBhcyB3ZWxsIGFzIHByb3ZpZGUgbmV3IGZ1bmN0aW9uYWxpdHkuIDwvcD4KKyAgPHA+Jm5ic3A7PC9wPgorPC9kaXY+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvY3JlZGl0cy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvY3JlZGl0cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZjFmNDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9jcmVkaXRzLmh0bWwKQEAgLTAsMCArMSw2OSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWwgLSBDcmVkaXRzPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxkaXYgYWxpZ249ImNlbnRlciI+Cis8aDE+QXBhY2hlIEFudCBVc2VyIE1hbnVhbDwvaDE+Cis8cD5ieTwvcD4KKzwvZGl2PgorPCEtLSBOYW1lcyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBvbiBsYXN0IG5hbWUgLS0+Cis8dWw+CisgIDxsaT5TdGVwaGFuZSBCYWlsbGlleiAoPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+c2JhaWxsaWV6QGltZWRpYXRpb24uY29tPC9hPik8L2xpPgorICA8bGk+Tmljb2xhIEtlbiBCYXJvenppICg8YSBocmVmPSJtYWlsdG86bmljb2xha2VuQGFwYWNoZS5vcmciPm5pY29sYWtlbkBhcGFjaGUub3JnPC9hPik8L2xpPgorICA8bGk+SmFjcXVlcyBCZXJnZXJvbiAoPGEgaHJlZj0ibWFpbHRvOmphY3F1ZXMuYmVyZ2Vyb25AZG9naWNvLmNvbSI+amFjcXVlcy5iZXJnZXJvbkBkb2dpY28uY29tPC9hPik8L2xpPgorICA8bGk+U3RlZmFuIEJvZGV3aWcgKDxhIGhyZWY9Im1haWx0bzpzdGVmYW4uYm9kZXdpZ0BmcmVlbmV0LmRlIj5zdGVmYW4uYm9kZXdpZ0BmcmVlbmV0LmRlPC9hPik8L2xpPgorICA8bGk+UGF0cmljayBDaGFuZXpvbiAoPGEgaHJlZj0ibWFpbHRvOmNoYW5lem9uQG5ldHNjYXBlLmNvbSI+Y2hhbmV6b25AbmV0c2NhcGUuY29tPC9hPik8L2xpPgorICA8bGk+SmFtZXMgRHVuY2FuIERhdmlkc29uICg8YSBocmVmPSJtYWlsdG86ZHVuY2FuQHgxODAuY29tIj5kdW5jYW5AeDE4MC5jb208L2E+KTwvbGk+CisgIDxsaT5Ub20gRGltb2NrICg8YSBocmVmPSJtYWlsdG86dGFkMUBjb3JuZWxsLmVkdSI+dGFkMUBjb3JuZWxsLmVkdTwvYT4pPC9saT4KKyAgPGxpPlBldGVyIERvbmFsZCAoPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+ZG9uYWxkcEBhcGFjaGUub3JnPC9hPik8L2xpPgorICA8bGk+ZElvbiBHaWxsYXJkICg8YSBocmVmPSJtYWlsdG86ZGlvbkBhcGFjaGUub3JnIj5kaW9uQGFwYWNoZS5vcmc8L2E+KTwvbGk+CisgIDxsaT5FcmlrIEhhdGNoZXIgKDxhIGhyZWY9Im1haWx0bzplaGF0Y2hlckBhcGFjaGUub3JnIj5laGF0Y2hlckBhcGFjaGUub3JnPC9hPik8L2xpPgorICA8bGk+RGlhbmUgSG9sdCAoPGEgaHJlZj0ibWFpbHRvOmhvbHRkbEB5YWhvby5jb20iPmhvbHRkbEB5YWhvby5jb208L2E+KTwvbGk+CisgIDxsaT5CaWxsIEtlbGx5ICg8YSBocmVmPSJtYWlsdG86YmlsbC5rZWxseUBzb2Z0d2lyZWQtaW5jLmNvbSI+YmlsbC5rZWxseUBzb2Z0d2lyZWQtaW5jLmNvbTwvYT4pPC9saT4KKyAgPGxpPk1hcnRpam4gS3J1aXRob2Y8L2xpPgorICA8bGk+QXJub3V0IEouIEt1aXBlciAoPGEgaHJlZj0ibWFpbHRvOmFqa3VpcGVyQHd4cy5ubCI+YWprdWlwZXJAd3hzLm5sPC9hPik8L2xpPgorICA8bGk+QW50b2luZSBM6XZ5LUxhbWJlcnQ8L2xpPgorICA8bGk+Q29ub3IgTWFjTmVpbGw8L2xpPgorICA8bGk+SmFuIE1hdOhybmU8L2xpPgorICA8bGk+U3RlZmFubyBNYXp6b2NjaGkgKDxhIGhyZWY9Im1haWx0bzpzdGVmYW5vQGFwYWNoZS5vcmciPnN0ZWZhbm9AYXBhY2hlLm9yZzwvYT4pPC9saT4KKyAgPGxpPkVyaWsgTWVhZGUgKDxhIGhyZWY9Im1haWx0bzplbWVhZGVAZ2Vla2Zhcm0ub3JnIj5lbWVhZGVAZ2Vla2Zhcm0ub3JnPC9hPik8L2xpPgorICA8bGk+U2FtIFJ1YnkgKDxhIGhyZWY9Im1haWx0bzpydWJ5c0B1cy5pYm0uY29tIj5ydWJ5c0B1cy5pYm0uY29tPC9hPik8L2xpPgorICA8bGk+TmljbyBTZWVzc2xlICg8YSBocmVmPSJtYWlsdG86bmljb0BzZWVzc2xlLmRlIj5uaWNvQHNlZXNzbGUuZGU8L2E+KTwvbGk+CisgIDxsaT5Kb24gUy4gU3RldmVucyAoPGEgaHJlZj0ibWFpbHRvOmpvbkBsYXRjaGtleS5jb20iPmpvbkBsYXRjaGtleS5jb208L2E+KTwvbGk+CisgIDxsaT5Xb2xmIFNpYmVyc2tpPC9saT4KKyAgPGxpPk1hZ2VzaCBVbWFzYW5rYXI8L2xpPgorICA8bGk+Um9nZXIgVmF1Z2huICg8YSBocmVmPSJtYWlsdG86cnZhdWdobkBzZWFjb25pbmMuY29tIj5ydmF1Z2huQHNlYWNvbmluYy5jb208L2E+KTwvbGk+CisgIDxsaT5EYXZlIFdhbGVuZCAoPGEgaHJlZj0ibWFpbHRvOmR3YWxlbmRAY3MudHVmdHMuZWR1Ij5kd2FsZW5kQGNzLnR1ZnRzLmVkdTwvYT4pPC9saT4KKyAgPGxpPlBoaWxsaXAgV2VsbHMgKDxhIGhyZWY9Im1haWx0bzpwaGlsd2VsbHNAcm9ja2V0bWFpbC5jb20iPnBoaWx3ZWxsc0Byb2NrZXRtYWlsLmNvbTwvYT4pPC9saT4KKyAgPGxpPkNocmlzdG9waCBXaWxoZWxtczwvbGk+CisgIDxsaT5DcmFlZyBTdHJvbmcgKDxhIGhyZWY9Im1haWx0bzpjc3Ryb25nQGFyaWVscGFydG5lcnMuY29tIj5jc3Ryb25nQGFyaWVscGFydG5lcnMuY29tPC9hPik8L2xpPgorPC91bD4KKworPGNlbnRlcj4KKzxwPlZlcnNpb246IDEuNy4wPC9wPgorPC9jZW50ZXI+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvZGV2ZWxvcC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvZGV2ZWxvcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZmY5MGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9kZXZlbG9wLmh0bWwKQEAgLTAsMCArMSw1MjEgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+V3JpdGluZyBZb3VyIE93biBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+RGV2ZWxvcGluZyB3aXRoIEFudDwvaDE+CisKKzxoMj48YSBuYW1lPSJ3cml0aW5nb3dudGFzayI+V3JpdGluZyBZb3VyIE93biBUYXNrPC9hPjwvaDI+Cis8cD5JdCBpcyB2ZXJ5IGVhc3kgdG8gd3JpdGUgeW91ciBvd24gdGFzazo8L3A+Cis8b2w+CisgIDxsaT5DcmVhdGUgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrPC9jb2RlPgorICAgICAgb3IgPGEgaHJlZj0iYmFzZV90YXNrX2NsYXNzZXMuaHRtbCI+YW5vdGhlciBjbGFzczwvYT4gdGhhdCB3YXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQuPC9saT4KKyAgPGxpPkZvciBlYWNoIGF0dHJpYnV0ZSwgd3JpdGUgYSA8aT5zZXR0ZXI8L2k+IG1ldGhvZC4gVGhlIHNldHRlciBtZXRob2QgbXVzdCBiZSBhCisgICAgPGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+IG1ldGhvZCB0aGF0IHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50LiBUaGUKKyAgICBuYW1lIG9mIHRoZSBtZXRob2QgbXVzdCBiZWdpbiB3aXRoIDxjb2RlPnNldDwvY29kZT4sIGZvbGxvd2VkIGJ5IHRoZQorICAgIGF0dHJpYnV0ZSBuYW1lLCB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5hbWUgaW4gdXBwZXJjYXNlLCBhbmQgdGhlIHJlc3QgaW4KKworICAgIGxvd2VyY2FzZTxhIGhyZWY9IiNmb290bm90ZS0xIj48c3VwPio8L3N1cD48L2E+LiAgVGhhdCBpcywgdG8gc3VwcG9ydCBhbiBhdHRyaWJ1dGUgbmFtZWQKKyAgICA8Y29kZT5maWxlPC9jb2RlPiB5b3UgY3JlYXRlIGEgbWV0aG9kIDxjb2RlPnNldEZpbGU8L2NvZGU+LgorICAgIERlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQsIEFudCB3aWxsIHBlcmZvcm0gc29tZQorICAgIGNvbnZlcnNpb25zIGZvciB5b3UsIHNlZSA8YSBocmVmPSIjc2V0LW1hZ2ljIj5iZWxvdzwvYT4uPC9saT4KKworICA8bGk+SWYgeW91ciB0YXNrIHNoYWxsIGNvbnRhaW4gb3RoZXIgdGFza3MgYXMgbmVzdGVkIGVsZW1lbnRzIChsaWtlCisgIDxhIGhyZWY9IkNvcmVUYXNrcy9wYXJhbGxlbC5odG1sIj48Y29kZT5wYXJhbGxlbDwvY29kZT48L2E+KSwgeW91cgorICBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlCisgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tDb250YWluZXI8L2NvZGU+LiAgSWYgeW91IGRvIHNvLCB5b3VyCisgIHRhc2sgY2FuIG5vdCBzdXBwb3J0IGFueSBvdGhlciBuZXN0ZWQgZWxlbWVudHMuICBTZWUgCisgIDxhIGhyZWY9IiN0YXNrY29udGFpbmVyIj5iZWxvdzwvYT4uPC9saT4KKworPGxpPklmIHRoZSB0YXNrIHNob3VsZCBzdXBwb3J0IGNoYXJhY3RlciBkYXRhICh0ZXh0IG5lc3RlZCBiZXR3ZWVuIHRoZQorc3RhcnQgZW5kIGVuZCB0YWdzKSwgd3JpdGUgYSA8Y29kZT5wdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyk8L2NvZGU+CittZXRob2QuICBOb3RlIHRoYXQgQW50IGRvZXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZXhwYW5kIHByb3BlcnRpZXMgb24KK3RoZSB0ZXh0IGl0IHBhc3NlcyB0byB0aGUgdGFzay48L2xpPgorCis8bGk+Rm9yIGVhY2ggbmVzdGVkIGVsZW1lbnQsIHdyaXRlIGEgPGk+Y3JlYXRlPC9pPiwgPGk+YWRkPC9pPiBvcgorPGk+YWRkQ29uZmlndXJlZDwvaT4gbWV0aG9kLiAgQSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYQorPGNvZGU+cHVibGljPC9jb2RlPiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4KKzxjb2RlPk9iamVjdDwvY29kZT4gdHlwZS4gVGhlIG5hbWUgb2YgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZWdpbgord2l0aCA8Y29kZT5jcmVhdGU8L2NvZGU+LCBmb2xsb3dlZCBieSB0aGUgZWxlbWVudCBuYW1lLiBBbiBhZGQgKG9yCithZGRDb25maWd1cmVkKSBtZXRob2QgbXVzdCBiZSBhIDxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPiBtZXRob2QgdGhhdAordGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgb2YgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB0eXBlIHdpdGggYQorbm8tYXJndW1lbnQgY29uc3RydWN0b3IuICBUaGUgbmFtZSBvZiB0aGUgYWRkIChhZGRDb25maWd1cmVkKSBtZXRob2QKK211c3QgYmVnaW4gd2l0aCA8Y29kZT5hZGQ8L2NvZGU+ICg8Y29kZT5hZGRDb25maWd1cmVkPC9jb2RlPiksCitmb2xsb3dlZCBieSB0aGUgZWxlbWVudCBuYW1lLiAgRm9yIGEgbW9yZSBjb21wbGV0ZSBkaXNjdXNzaW9uIHNlZSAKKzxhIGhyZWY9IiNuZXN0ZWQtZWxlbWVudHMiPmJlbG93PC9hPi48L2xpPgorCis8bGk+V3JpdGUgYSA8Y29kZT5wdWJsaWMgdm9pZCBleGVjdXRlPC9jb2RlPiBtZXRob2QsIHdpdGggbm8gYXJndW1lbnRzLCB0aGF0Cit0aHJvd3MgYSA8Y29kZT5CdWlsZEV4Y2VwdGlvbjwvY29kZT4uIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIHRhc2sKK2l0c2VsZi48L2xpPgorPC9vbD4KKworPGhyPgorPHA+PGEgbmFtZT0iZm9vdG5vdGUtMSI+KjwvYT4gQWN0dWFsbHkgdGhlIGNhc2Ugb2YgdGhlIGxldHRlcnMgYWZ0ZXIKK3RoZSBmaXJzdCBvbmUgZG9lc24ndCByZWFsbHkgbWF0dGVyIHRvIEFudCwgdXNpbmcgYWxsIGxvd2VyIGNhc2UgaXMgYQorZ29vZCBjb252ZW50aW9uLCB0aG91Z2guPC9wPgorCis8aDM+VGhlIExpZmUtY3ljbGUgb2YgYSBUYXNrPC9oMz4KKzxvbD4KKyAgPGxpPgorICAgIFRoZSB4bWwgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSB0YWcgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICB0YXNrIGdldHMgY29udmVydGVkIHRvIGFuIFVua25vd25FbGVtZW50IGF0IHBhcnNlciB0aW1lLgorICAgIFRoaXMgVW5rbm93bkVsZW1lbnQgZ2V0cyBwbGFjZWQgaW4gYSBsaXN0IHdpdGhpbiBhIHRhcmdldAorICAgIG9iamVjdCwgb3IgcmVjdXJzaXZseSB3aXRoaW4gYW5vdGhlciBVbmtub3duRWxlbWVudC4KKyAgPC9saT4KKyAgPGxpPgorICAgIFdoZW4gdGhlIHRhcmdldCBpcyBleGVjdXRlZCwgZWFjaCBVbmtub3duRWxlbWVudCBpcyBpbnZva2VkCisgICAgdXNpbmcgYW4gPGNvZGU+cGVyZm9ybSgpPC9jb2RlPiBtZXRob2QuIFRoaXMgaW5zdGFudGlhdGVzCisgICAgdGhlIHRhc2suIFRoaXMgbWVhbnMgdGhhdCB0YXNrcyBvbmx5IGdldHMKKyAgICBpbnN0YW50aWF0ZWQgYXQgcnVuIHRpbWUuCisgIDwvbGk+CisKKyAgPGxpPlRoZSB0YXNrIGdldHMgcmVmZXJlbmNlcyB0byBpdHMgcHJvamVjdCBhbmQgbG9jYXRpb24gaW5zaWRlIHRoZQorICAgIGJ1aWxkZmlsZSB2aWEgaXRzIGluaGVyaXRlZCA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhbmQKKyAgICA8Y29kZT5sb2NhdGlvbjwvY29kZT4gdmFyaWFibGVzLjwvbGk+CisKKyAgPGxpPklmIHRoZSB1c2VyIHNwZWNpZmllZCBhbiA8Y29kZT5pZDwvY29kZT4gYXR0cmlidXRlIHRvIHRoaXMgdGFzaywKKyAgICB0aGUgcHJvamVjdAorICAgIHJlZ2lzdGVycyBhIHJlZmVyZW5jZSB0byB0aGlzIG5ld2x5IGNyZWF0ZWQgdGFzaywgYXQgcnVuCisgICAgdGltZS48L2xpPgorCisgIDxsaT5UaGUgdGFzayBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgaXQgYmVsb25ncyB0byB2aWEgaXRzCisgICAgaW5oZXJpdGVkIDxjb2RlPnRhcmdldDwvY29kZT4gdmFyaWFibGUuPC9saT4KKworICA8bGk+PGNvZGU+aW5pdCgpPC9jb2RlPiBpcyBjYWxsZWQgYXQgcnVuIHRpbWUuPC9saT4KKworICA8bGk+QWxsIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBYTUwgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgdGFzaworICAgIGFyZSBjcmVhdGVkIHZpYSB0aGlzIHRhc2sncyA8Y29kZT5jcmVhdGVYWFgoKTwvY29kZT4gbWV0aG9kcyBvcgorICAgIGluc3RhbnRpYXRlZCBhbmQgYWRkZWQgdG8gdGhpcyB0YXNrIHZpYSBpdHMgPGNvZGU+YWRkWFhYKCk8L2NvZGU+CisgICAgbWV0aG9kcywgYXQgcnVuIHRpbWUuPC9saT4KKworICA8bGk+QWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyB0YXNrIGdldCBzZXQgdmlhIHRoZWlyIGNvcnJlc3BvbmRpbmcKKyAgICA8Y29kZT5zZXRYWFg8L2NvZGU+IG1ldGhvZHMsIGF0IHJ1bnRpbWUuPC9saT4KKworICA8bGk+VGhlIGNvbnRlbnQgY2hhcmFjdGVyIGRhdGEgc2VjdGlvbnMgaW5zaWRlIHRoZSBYTUwgZWxlbWVudAorICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0YXNrIGlzIGFkZGVkIHRvIHRoZSB0YXNrIHZpYSBpdHMKKyAgICA8Y29kZT5hZGRUZXh0PC9jb2RlPiBtZXRob2QsIGF0IHJ1bnRpbWUuPC9saT4KKworICA8bGk+QWxsIGF0dHJpYnV0ZXMgb2YgYWxsIGNoaWxkIGVsZW1lbnRzIGdldCBzZXQgdmlhIHRoZWlyIGNvcnJlc3BvbmRpbmcKKyAgICA8Y29kZT5zZXRYWFg8L2NvZGU+IG1ldGhvZHMsIGF0IHJ1bnRpbWUuPC9saT4KKworICA8bGk+PGEgbmFtZT0iZXhlY3V0ZSI+PGNvZGU+ZXhlY3V0ZSgpPC9jb2RlPjwvYT4gaXMgY2FsbGVkIGF0IHJ1bnRpbWUuCisgICAgSWYgPGNvZGU+dGFyZ2V0MTwvY29kZT4gYW5kIDxjb2RlPnRhcmdldDI8L2NvZGU+IGJvdGggZGVwZW5kCisgICAgb24gPGNvZGU+dGFyZ2V0MzwvY29kZT4sIHRoZW4gcnVubmluZworICAgIDxjb2RlPidhbnQgdGFyZ2V0MSB0YXJnZXQyJzwvY29kZT4gd2lsbCBydW4gYWxsIHRhc2tzIGluCisgICAgPGNvZGU+dGFyZ2V0MzwvY29kZT4gdHdpY2UuPC9saT4KKzwvb2w+CisKKzxoMz48YSBuYW1lPSJzZXQtbWFnaWMiPkNvbnZlcnNpb25zIEFudCB3aWxsIHBlcmZvcm0gZm9yIGF0dHJpYnV0ZXM8L2E+PC9oMz4KKworPHA+QW50IHdpbGwgYWx3YXlzIGV4cGFuZCBwcm9wZXJ0aWVzIGJlZm9yZSBpdCBwYXNzZXMgdGhlIHZhbHVlIG9mIGFuCithdHRyaWJ1dGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc2V0dGVyIG1ldGhvZC48L3A+CisKKzxwPlRoZSBtb3N0IGNvbW1vbiB3YXkgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHNldHRlciBpcyB0byB1c2UgYQorPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4gYXJndW1lbnQuICBJbiB0aGlzIGNhc2UgQW50IHdpbGwgcGFzcwordGhlIGxpdGVyYWwgdmFsdWUgKGFmdGVyIHByb3BlcnR5IGV4cGFuc2lvbikgdG8geW91ciB0YXNrLiAgQnV0IHRoZXJlCitpcyBtb3JlISAgSWYgdGhlIGFyZ3VtZW50IG9mIHlvdSBzZXR0ZXIgbWV0aG9kIGlzPC9wPgorCis8dWw+CisKKyAgPGxpPjxjb2RlPmJvb2xlYW48L2NvZGU+LCB5b3VyIG1ldGhvZCB3aWxsIGJlIHBhc3NlZCB0aGUgdmFsdWUKKyAgPGk+dHJ1ZTwvaT4gaWYgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZSBpcyBvbmUgb2YKKyAgPGNvZGU+dHJ1ZTwvY29kZT4sIDxjb2RlPnllczwvY29kZT4sIG9yIDxjb2RlPm9uPC9jb2RlPiBhbmQKKyAgPGk+ZmFsc2U8L2k+IG90aGVyd2lzZS48L2xpPgorCisgIDxsaT48Y29kZT5jaGFyPC9jb2RlPiBvciA8Y29kZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9jb2RlPiwgeW91cgorICBtZXRob2Qgd2lsbCBiZSBwYXNzZWQgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGluCisgIHRoZSBidWlsZCBmaWxlLjwvbGk+CisKKyAgPGxpPmFueSBvdGhlciBwcmltaXRpdmUgdHlwZSAoPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+c2hvcnQ8L2NvZGU+CisgIGFuZCBzbyBvbiksIEFudCB3aWxsIGNvbnZlcnQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaW50byB0aGlzCisgIHR5cGUsIHRodXMgbWFraW5nIHN1cmUgdGhhdCB5b3UnbGwgbmV2ZXIgcmVjZWl2ZSBpbnB1dCB0aGF0IGlzIG5vdCBhCisgIG51bWJlciBmb3IgdGhhdCBhdHRyaWJ1dGUuPC9saT4KKworICA8bGk+PGNvZGU+amF2YS5pby5GaWxlPC9jb2RlPiwgQW50IHdpbGwgZmlyc3QgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCisgIHZhbHVlIGdpdmVuIGluIHRoZSBidWlsZCBmaWxlIHJlcHJlc2VudHMgYW4gYWJzb2x1dGUgcGF0aCBuYW1lLiAgSWYKKyAgbm90LCBBbnQgd2lsbCBpbnRlcnByZXQgdGhlIHZhbHVlIGFzIGEgcGF0aCBuYW1lIHJlbGF0aXZlIHRvIHRoZQorICBwcm9qZWN0J3MgYmFzZWRpci48L2xpPgorCisgIDxsaT48Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoPC9jb2RlPiwgQW50IHdpbGwgdG9rZW5pemUKKyAgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZSwgYWNjZXB0aW5nIDxjb2RlPjo8L2NvZGU+IGFuZAorICA8Y29kZT47PC9jb2RlPiBhcyBwYXRoIHNlcGFyYXRvcnMuICBSZWxhdGl2ZSBwYXRoIG5hbWVzIHdpbGwgYmUKKyAgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyBiYXNlZGlyLjwvbGk+CisKKyAgPGxpPjxjb2RlPmphdmEubGFuZy5DbGFzczwvY29kZT4sIEFudCB3aWxsIGludGVycHJldCB0aGUgdmFsdWUKKyAgZ2l2ZW4gaW4gdGhlIGJ1aWxkIGZpbGUgYXMgYSBKYXZhIGNsYXNzIG5hbWUgYW5kIGxvYWQgdGhlIG5hbWVkCisgIGNsYXNzIGZyb20gdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuPC9saT4KKworICA8bGk+YW55IG90aGVyIHR5cGUgdGhhdCBoYXMgYSBjb25zdHJ1Y3RvciB3aXRoIGEgc2luZ2xlCisgIDxjb2RlPlN0cmluZzwvY29kZT4gYXJndW1lbnQsIEFudCB3aWxsIHVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvCisgIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIHRoZSB2YWx1ZSBnaXZlbiBpbiB0aGUgYnVpbGQgZmlsZS48L2xpPgorCisgIDxsaT5BIHN1YmNsYXNzIG9mCisgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU8L2NvZGU+LCBBbnQKKyAgd2lsbCBpbnZva2UgdGhpcyBjbGFzc2VzIDxjb2RlPnNldFZhbHVlPC9jb2RlPiBtZXRob2QuICBVc2UgdGhpcyBpZgorICB5b3VyIHRhc2sgc2hvdWxkIHN1cHBvcnQgZW51bWVyYXRlZCBhdHRyaWJ1dGVzIChhdHRyaWJ1dGVzIHdpdGgKKyAgdmFsdWVzIHRoYXQgbXVzdCBiZSBwYXJ0IG9mIGEgcHJlZGVmaW5lZCBzZXQgb2YgdmFsdWVzKS4gIFNlZQorICA8Y29kZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaXhDUkxGLmphdmE8L2NvZGU+IGFuZCB0aGUKKyAgaW5uZXIgPGNvZGU+QWRkQXNpc1JlbW92ZTwvY29kZT4gY2xhc3MgdXNlZCBpbiA8Y29kZT5zZXRDcjwvY29kZT4KKyAgZm9yIGFuIGV4YW1wbGUuPC9saT4KKworICA8bGk+QSAoSmF2YSA1KSBlbnVtZXJhdGlvbi4gQW50IHdpbGwgY2FsbCB0aGUgc2V0dGVyIHdpdGggdGhlIGVudW0gY29uc3RhbnQKKyAgbWF0Y2hpbmcgdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBidWlsZCBmaWxlLiBUaGlzIGlzIGVhc2llciB0aGFuIHVzaW5nCisgIDxjb2RlPkVudW1lcmF0ZWRBdHRyaWJ1dGU8L2NvZGU+IGFuZCBjYW4gcmVzdWx0IGluIGNsZWFuZXIgY29kZSwgYnV0IG9mIGNvdXJzZQorICB5b3VyIHRhc2sgd2lsbCBub3QgcnVuIG9uIEpESyAxLjQgb3IgZWFybGllci4gTm90ZSB0aGF0IGFueSBvdmVycmlkZSBvZgorICA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBpbiB0aGUgZW51bWVyYXRpb24gaXMgaWdub3JlZDsgdGhlIGJ1aWxkIGZpbGUgbXVzdCB1c2UKKyAgdGhlIGRlY2xhcmVkIG5hbWUgKHNlZSA8Y29kZT5FbnVtLmdldE5hbWUoKTwvY29kZT4pLiBZb3UgbWF5IHdpc2ggdG8gdXNlIGxvd2VyY2FzZQorICBlbnVtIGNvbnN0YW50IG5hbWVzLCBpbiBjb250cmFzdCB0byB1c3VhbCBKYXZhIHN0eWxlLCB0byBsb29rIGJldHRlciBpbiBidWlsZCBmaWxlcy4KKyAgPGVtPkFzIG9mIEFudCAxLjcuMC48L2VtPjwvbGk+CisKKzwvdWw+CisKKzxwPldoYXQgaGFwcGVucyBpZiBtb3JlIHRoYW4gb25lIHNldHRlciBtZXRob2QgaXMgcHJlc2VudCBmb3IgYSBnaXZlbgorYXR0cmlidXRlPyAgQSBtZXRob2QgdGFraW5nIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBhcmd1bWVudCB3aWxsIGFsd2F5cworbG9zZSBhZ2FpbnN0IHRoZSBtb3JlIHNwZWNpZmljIG1ldGhvZHMuICBJZiB0aGVyZSBhcmUgc3RpbGwgbW9yZQorc2V0dGVycyBBbnQgY291bGQgY2hvc2UgZnJvbSwgb25seSBvbmUgb2YgdGhlbSB3aWxsIGJlIGNhbGxlZCwgYnV0IHdlCitkb24ndCBrbm93IHdoaWNoLCB0aGlzIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHlvdXIgSmF2YQordmlydHVhbCBtYWNoaW5lLjwvcD4KKworPGgzPjxhIG5hbWU9Im5lc3RlZC1lbGVtZW50cyI+U3VwcG9ydGluZyBuZXN0ZWQgZWxlbWVudHM8L2E+PC9oMz4KKworPHA+TGV0J3MgYXNzdW1lIHlvdXIgdGFzayBzaGFsbCBzdXBwb3J0IG5lc3RlZCBlbGVtZW50cyB3aXRoIHRoZSBuYW1lCis8Y29kZT5pbm5lcjwvY29kZT4uICBGaXJzdCBvZiBhbGwsIHlvdSBuZWVkIGEgY2xhc3MgdGhhdCByZXByZXNlbnRzCit0aGlzIG5lc3RlZCBlbGVtZW50LiAgT2Z0ZW4geW91IHNpbXBseSB3YW50IHRvIHVzZSBvbmUgb2YgQW50J3MKK2NsYXNzZXMgbGlrZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0PC9jb2RlPiB0bworc3VwcG9ydCBuZXN0ZWQgPGNvZGU+ZmlsZXNldDwvY29kZT4gZWxlbWVudHMuPC9wPgorCis8cD5BdHRyaWJ1dGVzIG9mIHRoZSBuZXN0ZWQgZWxlbWVudHMgb3IgbmVzdGVkIGNoaWxkIGVsZW1lbnRzIG9mIHRoZW0KK3dpbGwgYmUgaGFuZGxlZCB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gdXNlZCBmb3IgdGFza3MgKGkuZS4gc2V0dGVyCittZXRob2RzIGZvciBhdHRyaWJ1dGVzLCBhZGRUZXh0IGZvciBuZXN0ZWQgdGV4dCBhbmQKK2NyZWF0ZS9hZGQvYWRkQ29uZmlndXJlZCBtZXRob2RzIGZvciBjaGlsZCBlbGVtZW50cykuPC9wPgorCis8cD5Ob3cgeW91IGhhdmUgYSBjbGFzcyA8Y29kZT5OZXN0ZWRFbGVtZW50PC9jb2RlPiB0aGF0IGlzIHN1cHBvc2VkIHRvCitiZSB1c2VkIGZvciB5b3VyIG5lc3RlZCA8Y29kZT4mbHQ7aW5uZXImZ3Q7PC9jb2RlPiBlbGVtZW50cywgeW91IGhhdmUKK3RocmVlIG9wdGlvbnM6PC9wPgorCis8b2w+CisgIDxsaT48Y29kZT5wdWJsaWMgTmVzdGVkRWxlbWVudCBjcmVhdGVJbm5lcigpPC9jb2RlPjwvbGk+CisgIDxsaT48Y29kZT5wdWJsaWMgdm9pZCBhZGRJbm5lcihOZXN0ZWRFbGVtZW50IGFuSW5uZXIpPC9jb2RlPjwvbGk+CisgIDxsaT48Y29kZT5wdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkSW5uZXIoTmVzdGVkRWxlbWVudCBhbklubmVyKTwvY29kZT48L2xpPgorPC9vbD4KKworPHA+V2hhdCBpcyB0aGUgZGlmZmVyZW5jZT88L3A+CisKKzxwPk9wdGlvbiAxIG1ha2VzIHRoZSB0YXNrIGNyZWF0ZSB0aGUgaW5zdGFuY2Ugb2YKKzxjb2RlPk5lc3RlZEVsZW1lbnQ8L2NvZGU+LCB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSB0eXBlLgorRm9yIHRoZSBvcHRpb25zIDIgYW5kIDMsIEFudCBoYXMgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mCis8Y29kZT5OZXN0ZWRJbm5lcjwvY29kZT4gYmVmb3JlIGl0IGNhbiBwYXNzIGl0IHRvIHRoZSB0YXNrLCB0aGlzCittZWFucywgPGNvZGU+TmVzdGVkSW5uZXI8L2NvZGU+IG11c3QgaGF2ZSBhIDxjb2RlPnB1YmxpYzwvY29kZT4gbm8tYXJnCisgIGNvbnN0cnVjdG9yIG9yIGEgPGNvZGU+cHVibGljPC9jb2RlPiBvbmUtYXJnIGNvbnN0cnVjdG9yCisgIHRha2luZyBhIFByb2plY3QgY2xhc3MgYXMgYSBwYXJhbWV0ZXIuCitUaGlzIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBvcHRpb25zIDEgYW5kIDIuPC9wPgorCis8cD5UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIgYW5kIDMgaXMgd2hhdCBBbnQgaGFzIGRvbmUgdG8gdGhlIG9iamVjdAorYmVmb3JlIGl0IHBhc3NlcyBpdCB0byB0aGUgbWV0aG9kLiAgPGNvZGU+YWRkSW5uZXI8L2NvZGU+IHdpbGwgcmVjZWl2ZQorYW4gb2JqZWN0IGRpcmVjdGx5IGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBoYXMgYmVlbiBjYWxsZWQsIHdoaWxlCis8Y29kZT5hZGRDb25maWd1cmVkSW5uZXI8L2NvZGU+IGdldHMgdGhlIG9iamVjdCA8ZW0+YWZ0ZXI8L2VtPiB0aGUKK2F0dHJpYnV0ZXMgYW5kIG5lc3RlZCBjaGlsZHJlbiBmb3IgdGhpcyBuZXcgb2JqZWN0IGhhdmUgYmVlbgoraGFuZGxlZC48L3A+CisKKzxwPldoYXQgaGFwcGVucyBpZiB5b3UgdXNlIG1vcmUgdGhhbiBvbmUgb2YgdGhlIG9wdGlvbnM/ICBPbmx5IG9uZSBvZgordGhlIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQsIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoLCB0aGlzIGRlcGVuZHMgb24KK3RoZSBpbXBsZW1lbnRhdGlvbiBvZiB5b3VyIEphdmEgdmlydHVhbCBtYWNoaW5lLjwvcD4KKworICA8aDM+PGEgbmFtZT0ibmVzdGVkdHlwZSI+TmVzdGVkIFR5cGVzPC9hPjwvaDM+CitJZiB5b3VyIHRhc2sgbmVlZHMgdG8gbmVzdCBhbiBhcmJpdGFyeSB0eXBlIHRoYXQgaGFzIGJlZW4gZGVmaW5lZAorICB1c2luZyA8Y29kZT4mbHQ7dHlwZWRlZiZndDs8L2NvZGU+IHlvdSBoYXZlIHR3byBvcHRpb25zLgorICA8b2w+CisgICAgPGxpPjxjb2RlPnB1YmxpYyB2b2lkIGFkZChUeXBlIHR5cGUpPC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPnB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWQoVHlwZSB0eXBlKTwvY29kZT48L2xpPgorICA8L29sPgorICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEgYW5kIDIgaXMgdGhlIHNhbWUgYXMgYmV0d2VlbiAyIGFuZCAzIGluIHRoZQorICBwcmV2aW91cyBzZWN0aW9uLgorICA8cD4KKyAgICBGb3IgZXhhbXBsZSBzdXBwb3NlIG9uZSB3YW50ZWQgdG8gaGFuZGxlIG9iamVjdHMgb2JqZWN0IG9mIHR5cGUKKyAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29uZGl0aW9uLCBvbmUgbWF5CisgICAgaGF2ZSBhIGNsYXNzOgorICA8L3A+CisgIDxibG9ja3F1b3RlPgorICA8cHJlPgorcHVibGljIGNsYXNzIE15VGFzayBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgTGlzdCBjb25kaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgIHB1YmxpYyB2b2lkIGFkZChDb25kaXRpb24gYykgeworICAgICAgICBjb25kaXRpb25zLmFkZChjKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgLy8gaXRlcmF0b3Igb3ZlciB0aGUgY29uZGl0aW9ucworICAgIH0KK30KKyAgPC9wcmU+CisgIDwvYmxvY2txdW90ZT4KKyAgPHA+CisgICAgT25lIG1heSBkZWZpbmUgYW5kIHVzZSB0aGlzIGNsYXNzIGxpa2UgdGhpczoKKyAgPC9wPgorICA8YmxvY2txdW90ZT4KKyAgICA8cHJlPgorJmx0O3Rhc2tkZWYgbmFtZT0ibXl0YXNrIiBjbGFzc25hbWU9Ik15VGFzayIgY2xhc3NwYXRoPSJjbGFzc2VzIi8mZ3Q7CismbHQ7dHlwZWRlZiBuYW1lPSJjb25kaXRpb24uZXF1YWxzIgorICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb25zLkVxdWFscyIvJmd0OworJmx0O215dGFzayZndDsKKyAgICAmbHQ7Y29uZGl0aW9uLmVxdWFscyBhcmcxPSIke2RlYnVnfSIgYXJnMj0idHJ1ZSIvJmd0OworJmx0Oy9teXRhc2smZ3Q7CisgICAgPC9wcmU+CisgIDwvYmxvY2txdW90ZT4KKyAgPHA+CisgICAgQSBtb3JlIGNvbXBsaWNhdGVkIGV4YW1wbGUgZm9sbG93czoKKyAgPC9wPgorICA8YmxvY2txdW90ZT4KKyAgICA8cHJlPgorcHVibGljIGNsYXNzIFNhbXBsZSB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpbGVTZWxlY3RvciBpbXBsZW1lbnRzIEZpbGVTZWxlY3RvciB7CisgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyQShpbnQgYSkge30KKyAgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJCKGludCBiKSB7fQorICAgICAgICAgcHVibGljIHZvaWQgYWRkKFBhdGggcGF0aCkge30KKyAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgeworICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgfQorICAgICB9CisKKyAgICBpbnRlcmZhY2UgTXlJbnRlcmZhY2UgeworICAgICAgICB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2YWwpOworICAgIH0gICAgICAgIAorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZFBhdGggZXh0ZW5kcyBQYXRoIHsKKyAgICAgICAgcHVibGljIEJ1aWxkUGF0aChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgICAgIHN1cGVyKHByb2plY3QpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBhZGQoTXlJbnRlcmZhY2UgaW50ZXIpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7fQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWEludGVyZmFjZSBpbXBsZW1lbnRzIE15SW50ZXJmYWNlIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHgpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvdW50KGludCBjKSB7fQorICAgIH0KK30KKyAgICA8L3ByZT4KKyAgPC9ibG9ja3F1b3RlPgorICA8cD4KKyAgICBUaGlzIGNsYXNzIGRlZmluZXMgYSBudW1iZXIgb2Ygc3RhdGljIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQvZXh0ZW5kCisgICAgUGF0aCwgTXlGaWxlU2VsZWN0b3IgYW5kIE15SW50ZXJmYWNlLiBUaGVzZSBtYXkgYmUgZGVmaW5lZCBhbmQgdXNlZAorICAgIGFzIGZvbGxvd3M6CisgIDwvcD4KKyAgPHByZT4KKyAgICA8YmxvY2txdW90ZT4KKyZsdDt0eXBlZGVmIG5hbWU9Im15ZmlsZXNlbGVjdG9yIiBjbGFzc25hbWU9IlNhbXBsZSRNeUZpbGVTZWxlY3RvciIKKyAgICAgICAgIGNsYXNzcGF0aD0iY2xhc3NlcyIgbG9hZGVycmVmPSJjbGFzc2VzIi8mZ3Q7CismbHQ7dHlwZWRlZiBuYW1lPSJidWlsZHBhdGgiIGNsYXNzbmFtZT0iU2FtcGxlJEJ1aWxkUGF0aCIKKyAgICAgICAgIGNsYXNzcGF0aD0iY2xhc3NlcyIgbG9hZGVycmVmPSJjbGFzc2VzIi8mZ3Q7CismbHQ7dHlwZWRlZiBuYW1lPSJ4aW50ZXJmYWNlIiBjbGFzc25hbWU9IlNhbXBsZSRYSW50ZXJmYWNlIgorICAgICAgICAgY2xhc3NwYXRoPSJjbGFzc2VzIiBsb2FkZXJyZWY9ImNsYXNzZXMiLyZndDsKKworJmx0O2NvcHkgdG9kaXI9ImNvcHktY2xhc3NlcyImZ3Q7CisgICAmbHQ7ZmlsZXNldCBkaXI9ImNsYXNzZXMiJmd0OworICAgICAgJmx0O215ZmlsZXNlbGVjdG9yIGF0dHJhPSIxMCIgYXR0ckI9Ii0xMCImZ3Q7CisgICAgICAgICAmbHQ7YnVpbGRwYXRoIHBhdGg9Ii4iIHVybD0iYWJjIiZndDsKKyAgICAgICAgICAgICZsdDt4aW50ZXJmYWNlIGNvdW50PSI0Ii8mZ3Q7CisgICAgICAgICAmbHQ7L2J1aWxkcGF0aCZndDsKKyAgICAgICZsdDsvbXlmaWxlc2VsZWN0b3ImZ3Q7CisgICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L2NvcHkmZ3Q7CisgICAgPC9ibG9ja3F1b3RlPgorICA8L3ByZT4KKzxoMz48YSBuYW1lPSJ0YXNrY29udGFpbmVyIj5UYXNrQ29udGFpbmVyPC9hPjwvaDM+CisKKzxwPlRoZSA8Y29kZT5UYXNrQ29udGFpbmVyPC9jb2RlPiBjb25zaXN0cyBvZiBhIHNpbmdsZSBtZXRob2QsCis8Y29kZT5hZGRUYXNrPC9jb2RlPiB0aGF0IGJhc2ljYWxseSBpcyB0aGUgc2FtZSBhcyBhbiA8YQoraHJlZj0iI25lc3RlZC1lbGVtZW50cyI+YWRkIG1ldGhvZDwvYT4gZm9yIG5lc3RlZCBlbGVtZW50cy4gIFRoZSB0YXNrCitpbnN0YW5jZXMgd2lsbCBiZSBjb25maWd1cmVkICh0aGVpciBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMKK2hhdmUgYmVlbiBoYW5kbGVkKSB3aGVuIHlvdXIgdGFzaydzIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG1ldGhvZCBnZXRzCitpbnZva2VkLCBidXQgbm90IGJlZm9yZSB0aGF0LjwvcD4KKworPHA+V2hlbiB3ZSA8YSBocmVmPSIjZXhlY3V0ZSI+c2FpZDwvYT4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd291bGQgYmUKK2NhbGxlZCwgd2UgbGllZCA7LSkuICBJbiBmYWN0LCBBbnQgd2lsbCBjYWxsIHRoZSA8Y29kZT5wZXJmb3JtPC9jb2RlPgorbWV0aG9kIGluIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s8L2NvZGU+LCB3aGljaCBpbiB0dXJuIGNhbGxzCis8Y29kZT5leGVjdXRlPC9jb2RlPi4gIFRoaXMgbWV0aG9kIG1ha2VzIHN1cmUgdGhhdCA8YQoraHJlZj0iI2J1aWxkZXZlbnRzIj5CdWlsZCBFdmVudHM8L2E+IHdpbGwgYmUgdHJpZ2dlcmVkLiAgSWYgeW91CitleGVjdXRlIHRoZSB0YXNrIGluc3RhbmNlcyBuZXN0ZWQgaW50byB5b3VyIHRhc2ssIHlvdSBzaG91bGQgYWxzbworaW52b2tlIDxjb2RlPnBlcmZvcm08L2NvZGU+IG9uIHRoZXNlIGluc3RhbmNlcyBpbnN0ZWFkIG9mCis8Y29kZT5leGVjdXRlPC9jb2RlPi48L3A+CisKKzxoMz5FeGFtcGxlPC9oMz4KKzxwPkxldCdzIHdyaXRlIG91ciBvd24gdGFzaywgd2hpY2ggcHJpbnRzIGEgbWVzc2FnZSBvbiB0aGUKKzxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+IHN0cmVhbS4KK1RoZQordGFzayBoYXMgb25lIGF0dHJpYnV0ZSwgY2FsbGVkIDxjb2RlPm1lc3NhZ2U8L2NvZGU+LjwvcD4KKzxibG9ja3F1b3RlPgorPHByZT4KK3BhY2thZ2UgY29tLm15ZG9tYWluOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworcHVibGljIGNsYXNzIE15VmVyeU93blRhc2sgZXh0ZW5kcyBUYXNrIHsKKyAgICBwcml2YXRlIFN0cmluZyBtc2c7CisKKyAgICAvLyBUaGUgbWV0aG9kIGV4ZWN1dGluZyB0aGUgdGFzaworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKKyAgICB9CisKKyAgICAvLyBUaGUgc2V0dGVyIGZvciB0aGUgJnF1b3Q7bWVzc2FnZSZxdW90OyBhdHRyaWJ1dGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtc2cpIHsKKyAgICAgICAgdGhpcy5tc2cgPSBtc2c7CisgICAgfQorfQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5JdCdzIHJlYWxseSB0aGlzIHNpbXBsZSA7LSk8L3A+Cis8cD5BZGRpbmcgeW91ciB0YXNrIHRvIHRoZSBzeXN0ZW0gaXMgcmF0aGVyIHNpbXBsZSB0b286PC9wPgorPG9sPgorICA8bGk+TWFrZSBzdXJlIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgeW91ciB0YXNrIGlzIGluIHRoZSBjbGFzc3BhdGggd2hlbgorICAgIHN0YXJ0aW5nIEFudC48L2xpPgorICA8bGk+QWRkIGEgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiBlbGVtZW50IHRvIHlvdXIgcHJvamVjdC4KKyAgICBUaGlzIGFjdHVhbGx5IGFkZHMgeW91ciB0YXNrIHRvIHRoZSBzeXN0ZW0uPC9saT4KKyAgPGxpPlVzZSB5b3VyIHRhc2sgaW4gdGhlIHJlc3Qgb2YgdGhlIGJ1aWxkZmlsZS48L2xpPgorPC9vbD4KKworPGgzPkV4YW1wbGU8L2gzPgorPGJsb2NrcXVvdGU+Cis8cHJlPgorJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDs/Jmd0OworCismbHQ7cHJvamVjdCBuYW1lPSZxdW90O093blRhc2tFeGFtcGxlJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7bWFpbiZxdW90OyBiYXNlZGlyPSZxdW90Oy4mcXVvdDsmZ3Q7CisgICZsdDt0YXNrZGVmIG5hbWU9JnF1b3Q7bXl0YXNrJnF1b3Q7IGNsYXNzbmFtZT0mcXVvdDtjb20ubXlkb21haW4uTXlWZXJ5T3duVGFzayZxdW90Oy8mZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O21haW4mcXVvdDsmZ3Q7CisgICAgJmx0O215dGFzayBtZXNzYWdlPSZxdW90O0hlbGxvIFdvcmxkISBNeVZlcnlPd25UYXNrIHdvcmtzISZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8aDM+RXhhbXBsZSAyPC9oMz4KK1RvIHVzZSBhIHRhc2sgZGlyZWN0bHkgZnJvbSB0aGUgYnVpbGRmaWxlIHdoaWNoIGNyZWF0ZWQgaXQsIHBsYWNlIHRoZQorPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiBkZWNsYXJhdGlvbiBpbnNpZGUgYSB0YXJnZXQKKzxpPmFmdGVyIHRoZSBjb21waWxhdGlvbjwvaT4uIFVzZSB0aGUgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiBhdHRyaWJ1dGUgb2YKKzxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gdG8gcG9pbnQgdG8gd2hlcmUgdGhlIGNvZGUgaGFzIGp1c3QgYmVlbgorY29tcGlsZWQuCis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90Oz8mZ3Q7CisKKyZsdDtwcm9qZWN0IG5hbWU9JnF1b3Q7T3duVGFza0V4YW1wbGUyJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7bWFpbiZxdW90OyBiYXNlZGlyPSZxdW90Oy4mcXVvdDsmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2J1aWxkJnF1b3Q7ICZndDsKKyAgICAmbHQ7bWtkaXIgZGlyPSZxdW90O2J1aWxkJnF1b3Q7LyZndDsKKyAgICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90O3NvdXJjZSZxdW90OyBkZXN0ZGlyPSZxdW90O2J1aWxkJnF1b3Q7LyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2RlY2xhcmUmcXVvdDsgZGVwZW5kcz0mcXVvdDtidWlsZCZxdW90OyZndDsKKyAgICAmbHQ7dGFza2RlZiBuYW1lPSZxdW90O215dGFzayZxdW90OworICAgICAgICBjbGFzc25hbWU9JnF1b3Q7Y29tLm15ZG9tYWluLk15VmVyeU93blRhc2smcXVvdDsKKyAgICAgICAgY2xhc3NwYXRoPSZxdW90O2J1aWxkJnF1b3Q7LyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O21haW4mcXVvdDsgZGVwZW5kcz0mcXVvdDtkZWNsYXJlJnF1b3Q7Jmd0OworICAgICZsdDtteXRhc2sgbWVzc2FnZT0mcXVvdDtIZWxsbyBXb3JsZCEgTXlWZXJ5T3duVGFzayB3b3JrcyEmcXVvdDsvJmd0OworICAmbHQ7L3RhcmdldCZndDsKKyZsdDsvcHJvamVjdCZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCis8cD5Bbm90aGVyIHdheSB0byBhZGQgYSB0YXNrIChtb3JlIHBlcm1hbmVudGx5KSwgaXMgdG8gYWRkIHRoZSB0YXNrIG5hbWUgYW5kCitpbXBsZW1lbnRpbmcgY2xhc3MgbmFtZSB0byB0aGUgPGNvZGU+ZGVmYXVsdC5wcm9wZXJ0aWVzPC9jb2RlPiBmaWxlIGluIHRoZQorPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM8L2NvZGU+CitwYWNrYWdlLiBUaGVuIHlvdSBjYW4gdXNlIGl0IGFzIGlmIGl0IHdlcmUgYSBidWlsdC1pbiB0YXNrLjwvcD4KKworPGhyPgorPGgyPjxhIG5hbWU9ImJ1aWxkZXZlbnRzIj5CdWlsZCBFdmVudHM8L2E+PC9oMj4KKzxQPkFudCBpcyBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgYnVpbGQgZXZlbnRzIGFzIGl0IHBlcmZvcm1zIHRoZSB0YXNrcyBuZWNlc3NhcnkgdG8gYnVpbGQgYSBwcm9qZWN0LgorTGlzdGVuZXJzIGNhbiBiZSBhdHRhY2hlZCB0byBBbnQgdG8gcmVjZWl2ZSB0aGVzZSBldmVudHMuIFRoaXMgY2FwYWJpbGl0eSBjb3VsZCBiZSB1c2VkLCBmb3IgZXhhbXBsZSwKK3RvIGNvbm5lY3QgQW50IHRvIGEgR1VJIG9yIHRvIGludGVncmF0ZSBBbnQgd2l0aCBhbiBJREUuCis8L1A+Cis8cD5UbyB1c2UgYnVpbGQgZXZlbnRzIHlvdSBuZWVkIHRvIGNyZWF0ZSBhbiBhbnQgPGNvZGU+UHJvamVjdDwvY29kZT4gb2JqZWN0LiBZb3UgY2FuIHRoZW4gY2FsbCB0aGUKKzxjb2RlPmFkZEJ1aWxkTGlzdGVuZXI8L2NvZGU+IG1ldGhvZCB0byBhZGQgeW91ciBsaXN0ZW5lciB0byB0aGUgcHJvamVjdC4gWW91ciBsaXN0ZW5lciBtdXN0IGltcGxlbWVudAordGhlIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50QnVpbGRMaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlLiBUaGUgbGlzdGVuZXIgd2lsbCByZWNlaXZlIEJ1aWxkRXZlbnRzCitmb3IgdGhlIGZvbGxvd2luZyBldmVudHM8L1A+Cis8dWw+Cis8bGk+QnVpbGQgc3RhcnRlZDwvbGk+Cis8bGk+QnVpbGQgZmluaXNoZWQ8L2xpPgorPGxpPlRhcmdldCBzdGFydGVkPC9saT4KKzxsaT5UYXJnZXQgZmluaXNoZWQ8L2xpPgorPGxpPlRhc2sgc3RhcnRlZDwvbGk+Cis8bGk+VGFzayBmaW5pc2hlZDwvbGk+Cis8bGk+TWVzc2FnZSBsb2dnZWQ8L2xpPgorPC91bD4KKworPHA+SWYgdGhlIGJ1aWxkIGZpbGUgaW52b2tlcyBhbm90aGVyIGJ1aWxkIGZpbGUgdmlhIDxhCitocmVmPSJDb3JlVGFza3MvYW50Lmh0bWwiPjxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPjwvYT4gb3IgPGEKK2hyZWY9IkNvcmVUYXNrcy9zdWJhbnQuaHRtbCI+PGNvZGU+Jmx0O3N1YmFudCZndDs8L2NvZGU+PC9hPiBvciB1c2VzIDxhCitocmVmPSJDb3JlVGFza3MvYW50Y2FsbC5odG1sIj48Y29kZT4mbHQ7YW50Y2FsbCZndDs8L2NvZGU+PC9hPiwgeW91IGFyZSBjcmVhdGluZyBhCituZXcgQW50ICJwcm9qZWN0IiB0aGF0IHdpbGwgc2VuZCB0YXJnZXQgYW5kIHRhc2sgbGV2ZWwgZXZlbnRzIG9mIGl0cworb3duIGJ1dCBuZXZlciBzZW5kcyBidWlsZCBzdGFydGVkL2ZpbmlzaGVkIGV2ZW50cy4gIEFudCAxLjYuMgoraW50cm9kdWNlcyBhbiBleHRlbnNpb24gb2YgdGhlIEJ1aWxkTGlzdGVuZXIgaW50ZXJmYWNlIG5hbWVkCitTdWJCdWlsZExpc3RlbmVyIHRoYXQgd2lsbCByZWNlaXZlIHR3byBuZXcgZXZlbnRzIGZvcjwvcD4KKzx1bD4KKzxsaT5TdWJCdWlsZCBzdGFydGVkPC9saT4KKzxsaT5TdWJCdWlsZCBmaW5pc2hlZDwvbGk+Cis8L3VsPgorPHA+SWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRob3NlIGV2ZW50cywgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRvCitpbXBsZW1lbnQgdGhlIG5ldyBpbnRlcmZhY2UgaW5zdGVhZCBvZiBCdWlsZExpc3RlbmVyIChhbmQgcmVnaXN0ZXIgdGhlCitsaXN0ZW5lciwgb2YgY291cnNlKS48L3A+CisKKzxwPgorSWYgeW91IHdpc2ggdG8gYXR0YWNoIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHlvdSBtYXkgdXNlIHRoZQorPGNvZGU+LWxpc3RlbmVyPC9jb2RlPiBvcHRpb24uIEZvciBleGFtcGxlOjwvcD4KKzxibG9ja3F1b3RlPgorICA8cHJlPmFudCAtbGlzdGVuZXIgb3JnLmFwYWNoZS50b29scy5hbnQuWG1sTG9nZ2VyPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD53aWxsIHJ1biBBbnQgd2l0aCBhIGxpc3RlbmVyIHRoYXQgZ2VuZXJhdGVzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbGQgcHJvZ3Jlc3MuIFRoaXMKK2xpc3RlbmVyIGlzIGluY2x1ZGVkIHdpdGggQW50LCBhcyBpcyB0aGUgZGVmYXVsdCBsaXN0ZW5lciwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBsb2dnaW5nIHRvIHN0YW5kYXJkIG91dHB1dC48L3A+CisKKzxwPjxiPk5vdGU6IDwvYj5BIGxpc3RlbmVyIG11c3Qgbm90IGFjY2VzcyBTeXN0ZW0ub3V0IGFuZCBTeXN0ZW0uZXJyIGRpcmVjdGx5IHNpbmNlIG91cHV0IG9uIAordGhlc2Ugc3RyZWFtcyBpcyByZWRpcmVjdGVkIGJ5IEFudCdzIGNvcmUgdG8gdGhlIGJ1aWxkIGV2ZW50IHN5c3RlbS4gQWNjZXNzaW5nIHRoZXNlIAorc3RyZWFtcyBjYW4gY2F1c2UgYW4gaW5maW5pdGUgbG9vcCBpbiBBbnQuIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBBbnQsIHRoaXMgd2lsbAorZWl0aGVyIGNhdXNlIHRoZSBidWlsZCB0byB0ZXJtaW5hdGUgb3IgdGhlIEphdmEgVk0gdG8gcnVuIG91dCBvZiBTdGFjayBzcGFjZS4gQSBsb2dnZXIsIGFsc28sIG1heSAKK25vdCBhY2Nlc3MgU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyciBkaXJlY3RseS4gSXQgbXVzdCB1c2UgdGhlIHN0cmVhbXMgd2l0aCB3aGljaCBpdCBoYXMKK2JlZW4gY29uZmlndXJlZC4KKzwvcD4KKworPGhyPgorPGgyPjxhIG5hbWU9ImludGVncmF0aW9uIj5Tb3VyY2UgY29kZSBpbnRlZ3JhdGlvbjwvYT48L2gyPgorCitUaGUgb3RoZXIgd2F5IHRvIGV4dGVuZCBBbnQgdGhyb3VnaCBKYXZhIGlzIHRvIG1ha2UgY2hhbmdlcyB0byBleGlzdGluZyB0YXNrcywgd2hpY2ggaXMgcG9zaXRpdmVseSBlbmNvdXJhZ2VkLgorQm90aCBjaGFuZ2VzIHRvIHRoZSBleGlzdGluZyBzb3VyY2UgYW5kIG5ldyB0YXNrcyBjYW4gYmUgaW5jb3Jwb3JhdGVkIGJhY2sgaW50byB0aGUgQW50IGNvZGViYXNlLCB3aGljaAorYmVuZWZpdHMgYWxsIHVzZXJzIGFuZCBzcHJlYWRzIHRoZSBtYWludGVuYW5jZSBsb2FkIGFyb3VuZC4KKzxwPgorCitQbGVhc2UgY29uc3VsdCB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9nZXRpbnZvbHZlZC5odG1sIj5HZXR0aW5nIEludm9sdmVkPC9hPiBwYWdlcyBvbiB0aGUgSmFrYXJ0YSB3ZWIgc2l0ZQorZm9yIGRldGFpbHMgb24gaG93IHRvIGZldGNoIHRoZSBsYXRlc3Qgc291cmNlIGFuZCBob3cgdG8gc3VibWl0IGNoYW5nZXMgZm9yIHJlaW5jb3Jwb3JhdGlvbiBpbnRvIHRoZQorc291cmNlIHRyZWUuCis8cD4KK0FudCBhbHNvIGhhcyBzb21lCis8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50X3Rhc2tfZ3VpZGVsaW5lcy5odG1sIj50YXNrIGd1aWRlbGluZXM8L2E+Cit3aGljaCBwcm92aWRlcyBzb21lIGFkdmljZSB0byBwZW9wbGUgZGV2ZWxvcGluZyBhbmQgdGVzdGluZyB0YXNrcy4gRXZlbiBpZiB5b3UgaW50ZW5kIHRvCitrZWVwIHlvdXIgdGFza3MgdG8geW91cnNlbGYsIHlvdSBzaG91bGQgc3RpbGwgcmVhZCB0aGlzIGFzIGl0IHNob3VsZCBiZSBpbmZvcm1hdGl2ZS4KKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9kZXZlbG9wbGlzdC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvZGV2ZWxvcGxpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDg0MjBlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvZGV2ZWxvcGxpc3QuaHRtbApAQCAtMCwwICsxLDQ3IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIvPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIi8+Cis8dGl0bGU+QXBhY2hlIEFudCBVc2VyIE1hbnVhbDwvdGl0bGU+Cis8YmFzZSB0YXJnZXQ9Im1haW5GcmFtZSIvPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIGhyZWY9InRvYy5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5UYWJsZSBvZiBDb250ZW50czwvYT48L2gyPgorCis8aDM+RGV2ZWxvcGluZyB3aXRoIEFudDwvaDM+CisKKzxhIGhyZWY9Ii4uL2FudF9pbl9hbmdlci5odG1sIj5BbnQgaW4gQW5nZXI8L2E+PGJyLz4KKzxhIGhyZWY9Ii4uL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCI+QW50IFRhc2sgR3VpZGVsaW5lczwvYT48YnIvPgorPGEgaHJlZj0iZGV2ZWxvcC5odG1sI3dyaXRpbmdvd250YXNrIj5Xcml0aW5nIFlvdXIgT3duIFRhc2s8L2E+PGJyLz4KKzxhIGhyZWY9ImJhc2VfdGFza19jbGFzc2VzLmh0bWwiPlRhc2tzIERlc2lnbmVkIGZvciBFeHRlbnNpb248L2E+PGJyLz4KKzxhIGhyZWY9ImRldmVsb3AuaHRtbCNidWlsZGV2ZW50cyI+QnVpbGQgRXZlbnRzPC9hPjxici8+Cis8YSBocmVmPSJkZXZlbG9wLmh0bWwjaW50ZWdyYXRpb24iPlNvdXJjZS1jb2RlIEludGVncmF0aW9uPC9hPjxici8+Cis8YSBocmVmPSJpbnB1dGhhbmRsZXIuaHRtbCI+SW5wdXRIYW5kbGVyPC9hPjxici8+Cis8YSBocmVmPSJhbnRleHRlcm5hbC5odG1sIj5Vc2luZyBBbnQgVGFza3MgT3V0c2lkZSBvZiBBbnQ8L2E+PGJyLz4KKworPGJyLz5UdXRvcmlhbHM8YnIvPgorPGEgaHJlZj0idHV0b3JpYWwtSGVsbG9Xb3JsZFdpdGhBbnQuaHRtbCI+SGVsbG8gV29ybGQgd2l0aCBBbnQ8L2E+PGJyLz4KKzxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbCI+V3JpdGluZyBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0idHV0b3JpYWwtdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy5odG1sIj5UYXNrcyB1c2luZyBQcm9wZXJ0aWVzLCBGaWxlc2V0cyAmYW1wOyBQYXRoczwvYT48YnIvPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9kaXJ0YXNrcy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvZGlydGFza3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDg2MGVmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvZGlydGFza3MuaHRtbApAQCAtMCwwICsxLDMwMCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5EaXJlY3RvcnktYmFzZWQgVGFza3M8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9ImRpcmVjdG9yeWJhc2VkdGFza3MiPkRpcmVjdG9yeS1iYXNlZCBUYXNrczwvYT48L2gyPgorPHA+U29tZSB0YXNrcyB1c2UgZGlyZWN0b3J5IHRyZWVzIGZvciB0aGUgYWN0aW9ucyB0aGV5IHBlcmZvcm0uCitGb3IgZXhhbXBsZSwgdGhlIDxhIGhyZWY9IkNvcmVUYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4gdGFzaywgd2hpY2gKK2NvbXBpbGVzIGEgZGlyZWN0b3J5IHRyZWUgd2l0aCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgaW50bworPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcywgaXMgb25lIG9mIHRoZXNlIGRpcmVjdG9yeS1iYXNlZCB0YXNrcy4gQmVjYXVzZQorc29tZSBvZiB0aGVzZSB0YXNrcyBkbyBzbyBtdWNoIHdvcmsgd2l0aCBhIGRpcmVjdG9yeSB0cmVlLCB0aGUgdGFzayBpdHNlbGYKK2NhbiBhY3QgYXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uPC9wPgorPHA+V2hldGhlciB0aGUgZmlsZXNldCBpcyBpbXBsaWNpdCBvciBub3QsIGl0IGNhbiBvZnRlbiBiZSB2ZXJ5IHVzZWZ1bCB0bword29yayBvbiBhIHN1YnNldCBvZiB0aGUgZGlyZWN0b3J5IHRyZWUuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgaG93IHlvdSBjYW4KK3NlbGVjdCBhIHN1YnNldCBvZiBzdWNoIGEgZGlyZWN0b3J5IHRyZWUgd2hlbiB1c2luZyBvbmUgb2YgdGhlc2UKK2RpcmVjdG9yeS1iYXNlZCB0YXNrcy48L3A+Cis8cD5BbnQgZ2l2ZXMgeW91IHR3byB3YXlzIHRvIGNyZWF0ZSBhIHN1YnNldCBvZiBmaWxlcyBpbiBhIGZpbGVzZXQsIGJvdGggb2YKK3doaWNoIGNhbiBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWU6PC9wPgorPHVsPgorICA8bGk+T25seSBpbmNsdWRlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0aGF0IG1hdGNoIGFueQorICAgIDxjb2RlPmluY2x1ZGU8L2NvZGU+IHBhdHRlcm5zIGFuZCBkbyBub3QgbWF0Y2ggYW55CisgICAgPGNvZGU+ZXhjbHVkZTwvY29kZT4gcGF0dGVybnMgaW4gYSBnaXZlbgorICAgIDxhIGhyZWY9IkNvcmVUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwiPlBhdHRlcm5TZXQ8L2E+LjwvbGk+CisgIDxsaT5TZWxlY3QgZmlsZXMgYmFzZWQgb24gc2VsZWN0aW9uIGNyaXRlcmlhIGRlZmluZWQgYnkgYSBjb2xsZWN0aW9uIG9mCisgICAgPGEgaHJlZj0iQ29yZVR5cGVzL3NlbGVjdG9ycy5odG1sIj5zZWxlY3RvcjwvYT4gbmVzdGVkIGVsZW1lbnRzLjwvbGk+Cis8L3VsPgorPGgzPjxhIG5hbWU9InBhdHRlcm5zZXQiPlBhdHRlcm5zZXQ8L2E+PC9oMz4KKworPHA+V2Ugc2FpZCB0aGF0IERpcmVjdG9yeS1iYXNlZCB0YXNrcyBjYW4gc29tZXRpbWVzIGFjdCBhcyBhbiBpbXBsaWNpdAorPGEgaHJlZj0iQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+PGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPjwvYT4sCitidXQgaW4gYWRkaXRpb24gdG8gdGhhdCwgYSBGaWxlU2V0IGFjdHMgYXMgYW4gaW1wbGljaXQKKzxhIGhyZWY9IkNvcmVUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwiPjxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT48L2E+LjwvcD4KKworPHA+VGhlIGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIGVsZW1lbnRzIG9mIHRoZSBpbXBsaWNpdCBQYXR0ZXJuU2V0IGNhbiBiZQorc3BlY2lmaWVkIGluc2lkZSB0aGUgZGlyZWN0b3J5LWJhc2VkIHRhc2sgKG9yIGV4cGxpY2l0IGZpbGVzZXQpIHZpYQorZWl0aGVyOjwvcD4KKzx1bD4KKyAgPGxpPnRoZSBhdHRyaWJ1dGVzIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiBhbmQKKyAgICA8Y29kZT5leGNsdWRlczwvY29kZT4uPC9saT4KKyAgPGxpPm5lc3RlZCBlbGVtZW50cyA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+IGFuZAorICAgIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4uPC9saT4KKyAgPGxpPmV4dGVybmFsIGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZSBhdHRyaWJ1dGVzCisgICAgPGNvZGU+aW5jbHVkZXNmaWxlPC9jb2RlPiBhbmQgPGNvZGU+ZXhjbHVkZXNmaWxlPC9jb2RlPi48L2xpPgorICA8bGk+ZXh0ZXJuYWwgZmlsZXMgc3BlY2lmaWVkIHdpdGggdGhlIG5lc3RlZCBlbGVtZW50cworICAgIDxjb2RlPiZsdDtpbmNsdWRlc2ZpbGUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2V4Y2x1ZGVzZmlsZSZndDs8L2NvZGU+LgorICA8L2xpPgorPC91bD4KKzxwPgorV2hlbiBkZWFsaW5nIHdpdGggYW4gZXh0ZXJuYWwgZmlsZSwgZWFjaCBsaW5lIG9mIHRoZSBmaWxlCitpcyB0YWtlbiBhcyBhIHBhdHRlcm4gdGhhdCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiBpbmNsdWRlIG9yIGV4Y2x1ZGUKK3BhdHRlcm5zLjwvcD4KKworPHA+V2hlbiBib3RoIGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIGFyZSB1c2VkLCBvbmx5IGZpbGVzL2RpcmVjdG9yaWVzIHRoYXQKK21hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5jbHVkZSBwYXR0ZXJucyBhbmQgZG9uJ3QgbWF0Y2ggYW55IG9mIHRoZQorZXhjbHVkZSBwYXR0ZXJucyBhcmUgdXNlZC4gSWYgbm8gaW5jbHVkZSBwYXR0ZXJuIGlzIGdpdmVuLCBhbGwgZmlsZXMKK2FyZSBhc3N1bWVkIHRvIG1hdGNoIHRoZSBpbmNsdWRlIHBhdHRlcm4gKHdpdGggdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiBvZgordGhlIGRlZmF1bHQgZXhjbHVkZXMpLjwvcD4KKworPGg0PjxhIG5hbWU9InBhdHRlcm5zIj5QYXR0ZXJuczwvYT48L2g0PgorCis8cD5BcyBkZXNjcmliZWQgZWFybGllciwgcGF0dGVybnMgYXJlIHVzZWQgZm9yIHRoZSBpbmNsdXNpb24gYW5kIGV4Y2x1c2lvbgorb2YgZmlsZXMuIFRoZXNlIHBhdHRlcm5zIGxvb2sgdmVyeSBtdWNoIGxpa2UgdGhlIHBhdHRlcm5zIHVzZWQgaW4gRE9TIGFuZAorVU5JWDo8L3A+Cis8cD4nKicgbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycywgJz8nIG1hdGNoZXMgb25lIGNoYXJhY3Rlci48L3A+CisKKzxwPkluIGdlbmVyYWwsIHBhdHRlcm5zIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHBhdGhzLCByZWxhdGl2ZSB0byBhCit0YXNrIGRlcGVuZGVudCBiYXNlIGRpcmVjdG9yeSAodGhlIGRpciBhdHRyaWJ1dGUgaW4gdGhlIGNhc2Ugb2YKKzxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4pLiAgT25seSBmaWxlcyBmb3VuZCBiZWxvdyB0aGF0IGJhc2UKK2RpcmVjdG9yeSBhcmUgY29uc2lkZXJlZC4gIFNvIHdoaWxlIGEgcGF0dGVybiBsaWtlCis8Y29kZT4uLi9mb28uamF2YTwvY29kZT4gaXMgcG9zc2libGUsIGl0IHdpbGwgbm90IG1hdGNoIGFueXRoaW5nIHdoZW4KK2FwcGxpZWQgc2luY2UgdGhlIGJhc2UgZGlyZWN0b3J5J3MgcGFyZW50IGlzIG5ldmVyIHNjYW5uZWQgZm9yCitmaWxlcy48L3A+CisKKzxwPjxiPkV4YW1wbGVzOjwvYj48L3A+Cis8cD4KKzxjb2RlPiouamF2YTwvY29kZT4mbmJzcDsmbmJzcDttYXRjaGVzJm5ic3A7Jm5ic3A7PGNvZGU+LmphdmE8L2NvZGU+LAorPGNvZGU+eC5qYXZhPC9jb2RlPiBhbmQgPGNvZGU+Rm9vQmFyLmphdmE8L2NvZGU+LCBidXQKK25vdCA8Y29kZT5Gb29CYXIueG1sPC9jb2RlPiAoZG9lcyBub3QgZW5kIHdpdGggPGNvZGU+LmphdmE8L2NvZGU+KS48L3A+Cis8cD4KKzxjb2RlPj8uamF2YTwvY29kZT4mbmJzcDsmbmJzcDttYXRjaGVzJm5ic3A7Jm5ic3A7PGNvZGU+eC5qYXZhPC9jb2RlPiwKKzxjb2RlPkEuamF2YTwvY29kZT4sIGJ1dCBub3QgPGNvZGU+LmphdmE8L2NvZGU+IG9yIDxjb2RlPnh5ei5qYXZhPC9jb2RlPgorKGJvdGggZG9uJ3QgaGF2ZSBvbmUgY2hhcmFjdGVyIGJlZm9yZSA8Y29kZT4uamF2YTwvY29kZT4pLjwvcD4KKzxwPgorQ29tYmluYXRpb25zIG9mIDxjb2RlPio8L2NvZGU+J3MgYW5kIDxjb2RlPj88L2NvZGU+J3MgYXJlIGFsbG93ZWQuPC9wPgorPHA+TWF0Y2hpbmcgaXMgZG9uZSBwZXItZGlyZWN0b3J5LiBUaGlzIG1lYW5zIHRoYXQgZmlyc3QgdGhlIGZpcnN0IGRpcmVjdG9yeSBpbgordGhlIHBhdHRlcm4gaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaXJzdCBkaXJlY3RvcnkgaW4gdGhlIHBhdGggdG8gbWF0Y2guIFRoZW4KK3RoZSBzZWNvbmQgZGlyZWN0b3J5IGlzIG1hdGNoZWQsIGFuZCBzbyBvbi4gRm9yIGV4YW1wbGUsIHdoZW4gd2UgaGF2ZSB0aGUgcGF0dGVybgorPGNvZGU+Lz9hYmMvKi8qLmphdmE8L2NvZGU+CithbmQgdGhlIHBhdGggPGNvZGU+L3hhYmMvZm9vYmFyL3Rlc3QuamF2YTwvY29kZT4sCit0aGUgZmlyc3QgPGNvZGU+P2FiYzwvY29kZT4gaXMgbWF0Y2hlZCB3aXRoIDxjb2RlPnhhYmM8L2NvZGU+LAordGhlbiA8Y29kZT4qPC9jb2RlPiBpcyBtYXRjaGVkIHdpdGggPGNvZGU+Zm9vYmFyPC9jb2RlPiwKK2FuZCBmaW5hbGx5IDxjb2RlPiouamF2YTwvY29kZT4gaXMgbWF0Y2hlZCB3aXRoIDxjb2RlPnRlc3QuamF2YTwvY29kZT4uCitUaGV5IGFsbCBtYXRjaCwgc28gdGhlIHBhdGggbWF0Y2hlcyB0aGUgcGF0dGVybi48L3A+Cis8cD5UbyBtYWtlIHRoaW5ncyBhIGJpdCBtb3JlIGZsZXhpYmxlLCB3ZSBhZGQgb25lIGV4dHJhIGZlYXR1cmUsIHdoaWNoIG1ha2VzIGl0Citwb3NzaWJsZSB0byBtYXRjaCBtdWx0aXBsZSBkaXJlY3RvcnkgbGV2ZWxzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGEKK2NvbXBsZXRlIGRpcmVjdG9yeSB0cmVlLCBvciBhIGZpbGUgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLgorVG8gZG8gdGhpcywgPGNvZGU+Kio8L2NvZGU+CittdXN0IGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkuCitXaGVuIDxjb2RlPioqPC9jb2RlPiBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIGEKK2RpcmVjdG9yeSBpbiB0aGUgcGF0dGVybiwgaXQgbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMuCitGb3IgZXhhbXBsZToKKzxjb2RlPi90ZXN0LyoqPC9jb2RlPiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJlY3RvcmllcyB1bmRlciA8Y29kZT4vdGVzdC88L2NvZGU+LAorc3VjaCBhcyA8Y29kZT4vdGVzdC94LmphdmE8L2NvZGU+LAorb3IgPGNvZGU+L3Rlc3QvZm9vL2Jhci94eXouaHRtbDwvY29kZT4sIGJ1dCBub3QgPGNvZGU+L3h5ei54bWw8L2NvZGU+LjwvcD4KKzxwPlRoZXJlIGlzIG9uZSAmcXVvdDtzaG9ydGhhbmQmcXVvdDs6IGlmIGEgcGF0dGVybiBlbmRzCit3aXRoIDxjb2RlPi88L2NvZGU+CitvciA8Y29kZT5cPC9jb2RlPiwgdGhlbiA8Y29kZT4qKjwvY29kZT4KK2lzIGFwcGVuZGVkLgorRm9yIGV4YW1wbGUsIDxjb2RlPm15cGFja2FnZS90ZXN0LzwvY29kZT4gaXMgaW50ZXJwcmV0ZWQgYXMgaWYgaXQgd2VyZQorPGNvZGU+bXlwYWNrYWdlL3Rlc3QvKio8L2NvZGU+LjwvcD4KKzxwPjxiPkV4YW1wbGUgcGF0dGVybnM6PC9iPjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPioqL0NWUy8qPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5NYXRjaGVzIGFsbCBmaWxlcyBpbiA8Y29kZT5DVlM8L2NvZGU+CisgICAgICBkaXJlY3RvcmllcyB0aGF0IGNhbiBiZSBsb2NhdGVkCisgICAgICBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuPGJyPgorICAgICAgTWF0Y2hlczoKKyAgICAgIDxwcmU+CisgICAgICBDVlMvUmVwb3NpdG9yeQorICAgICAgb3JnL2FwYWNoZS9DVlMvRW50cmllcworICAgICAgb3JnL2FwYWNoZS9qYWthcnRhL3Rvb2xzL2FudC9DVlMvRW50cmllcworICAgICAgPC9wcmU+CisgICAgICBCdXQgbm90OgorICAgICAgPHByZT4KKyAgICAgIG9yZy9hcGFjaGUvQ1ZTL2Zvby9iYXIvRW50cmllcyAoPGNvZGU+Zm9vL2Jhci88L2NvZGU+CisgICAgICBwYXJ0IGRvZXMgbm90IG1hdGNoKQorICAgICAgPC9wcmU+CisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+b3JnL2FwYWNoZS9qYWthcnRhLyoqPC9jb2RlPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5NYXRjaGVzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+b3JnL2FwYWNoZS9qYWthcnRhPC9jb2RlPgorICAgICAgZGlyZWN0b3J5IHRyZWUuPGJyPgorICAgICAgTWF0Y2hlczoKKyAgICAgIDxwcmU+CisgICAgICBvcmcvYXBhY2hlL2pha2FydGEvdG9vbHMvYW50L2RvY3MvaW5kZXguaHRtbAorICAgICAgb3JnL2FwYWNoZS9qYWthcnRhL3Rlc3QueG1sCisgICAgICA8L3ByZT4KKyAgICAgIEJ1dCBub3Q6CisgICAgICA8cHJlPgorICAgICAgb3JnL2FwYWNoZS94eXouamF2YQorICAgICAgPC9wcmU+CisgICAgICAoPGNvZGU+amFrYXJ0YS88L2NvZGU+IHBhcnQgaXMgbWlzc2luZykuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+b3JnL2FwYWNoZS8qKi9DVlMvKjwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TWF0Y2hlcyBhbGwgZmlsZXMgaW4gPGNvZGU+Q1ZTPC9jb2RlPiBkaXJlY3RvcmllcworICAgICAgdGhhdCBhcmUgbG9jYXRlZCBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUgdW5kZXIKKyAgICAgIDxjb2RlPm9yZy9hcGFjaGU8L2NvZGU+Ljxicj4KKyAgICAgIE1hdGNoZXM6CisgICAgICA8cHJlPgorICAgICAgb3JnL2FwYWNoZS9DVlMvRW50cmllcworICAgICAgb3JnL2FwYWNoZS9qYWthcnRhL3Rvb2xzL2FudC9DVlMvRW50cmllcworICAgICAgPC9wcmU+CisgICAgICBCdXQgbm90OgorICAgICAgPHByZT4KKyAgICAgIG9yZy9hcGFjaGUvQ1ZTL2Zvby9iYXIvRW50cmllcworICAgICAgPC9wcmU+CisgICAgICAoPGNvZGU+Zm9vL2Jhci88L2NvZGU+IHBhcnQgZG9lcyBub3QgbWF0Y2gpPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+KiovdGVzdC8qKjwvY29kZT48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+TWF0Y2hlcyBhbGwgZmlsZXMgdGhhdCBoYXZlIGEgPGNvZGU+dGVzdDwvY29kZT4KKyAgICAgICAgZWxlbWVudCBpbiB0aGVpciBwYXRoLCBpbmNsdWRpbmcgPGNvZGU+dGVzdDwvY29kZT4gYXMgYSBmaWxlbmFtZS48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPldoZW4gdGhlc2UgcGF0dGVybnMgYXJlIHVzZWQgaW4gaW5jbHVzaW9uIGFuZCBleGNsdXNpb24sIHlvdSBoYXZlIGEgcG93ZXJmdWwKK3dheSB0byBzZWxlY3QganVzdCB0aGUgZmlsZXMgeW91IHdhbnQuPC9wPgorCis8aDM+PGEgbmFtZT0ic2VsZWN0b3JzIj5TZWxlY3RvcnM8L2E+PC9oMz4KKzxwPlRoZSA8YSBocmVmPSJDb3JlVHlwZXMvZmlsZXNldC5odG1sIj48Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+PC9hPiwKK3doZXRoZXIgaW1wbGljaXQgb3IgZXhwbGljaXQgaW4gdGhlCitkaXJlY3RvcnktYmFzZWQgdGFzaywgYWxzbyBhY3RzIGFzIGFuCis8YSBocmVmPSJDb3JlVHlwZXMvc2VsZWN0b3JzLmh0bWwjYW5kc2VsZWN0Ij48Y29kZT4mbHQ7YW5kJmd0OzwvY29kZT48L2E+CitzZWxlY3RvciBjb250YWluZXIuIFRoaXMgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFyYml0cmFyaWx5IGNvbXBsaWNhdGVkCitzZWxlY3Rpb24gY3JpdGVyaWEgZm9yIHRoZSBmaWxlcyB0aGUgdGFzayBzaG91bGQgd29yayB3aXRoLiBTZWUgdGhlCis8YSBocmVmPSJDb3JlVHlwZXMvc2VsZWN0b3JzLmh0bWwiPlNlbGVjdG9yPC9hPiBkb2N1bWVudGF0aW9uIGZvciBtb3JlCitpbmZvcm1hdGlvbi48L3A+CisKKzxoMz48YSBuYW1lPSJ0YXNrbGlzdCI+U3RhbmRhcmQgVGFza3MvRmlsZXNldHM8L2E+PC9oMz4KKzxwPk1hbnkgb2YgdGhlIHN0YW5kYXJkIHRhc2tzIGluIGFudCB0YWtlIG9uZSBvciBtb3JlIGZpbGVzZXRzIHdoaWNoIGZvbGxvdwordGhlIHJ1bGVzIGdpdmVuIGhlcmUuIFRoaXMgbGlzdCwgYSBzdWJzZXQgb2YgdGhvc2UsIGlzIGEgbGlzdCBvZiBzdGFuZGFyZCBhbnQKK3Rhc2tzIHRoYXQgY2FuIGFjdCBhcyBhbiBpbXBsaWNpdCBmaWxlc2V0OjwvcD4KKzx1bD4KKyAgICAgIDxsaT48YSBocmVmPSJDb3JlVGFza3MvY2hlY2tzdW0uaHRtbCI+PGNvZGU+Jmx0O2NoZWNrc3VtJmd0OzwvY29kZT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IkNvcmVUYXNrcy9jb3B5ZGlyLmh0bWwiPjxjb2RlPiZsdDtjb3B5ZGlyJmd0OzwvY29kZT48L2E+IChkZXByZWNhdGVkKTwvbGk+CisgIDxsaT48YSBocmVmPSJDb3JlVGFza3MvZGVsZXRlLmh0bWwiPjxjb2RlPiZsdDtkZWxldGUmZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iQ29yZVRhc2tzL2RlcGVuZHNldC5odG1sIj48Y29kZT4mbHQ7ZGVwZW5kc2V0Jmd0OzwvY29kZT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IkNvcmVUYXNrcy9maXhjcmxmLmh0bWwiPjxjb2RlPiZsdDtmaXhjcmxmJmd0OzwvY29kZT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IkNvcmVUYXNrcy9qYXZhYy5odG1sIj48Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iQ29yZVRhc2tzL3JlcGxhY2UuaHRtbCI+PGNvZGU+Jmx0O3JlcGxhY2UmZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iQ29yZVRhc2tzL3JtaWMuaHRtbCI+PGNvZGU+Jmx0O3JtaWMmZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iQ29yZVRhc2tzL3N0eWxlLmh0bWwiPjxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IChha2EgPGNvZGU+Jmx0O3hzbHQmZ3Q7PC9jb2RlPik8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IkNvcmVUYXNrcy90YXIuaHRtbCI+PGNvZGU+Jmx0O3RhciZndDs8L2NvZGU+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJDb3JlVGFza3MvemlwLmh0bWwiPjxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9lamIuaHRtbCNkZGNyZWF0b3IiPjxjb2RlPiZsdDtkZGNyZWF0b3ImZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9lamIuaHRtbCNlamJqYXIiPjxjb2RlPiZsdDtlamJqYXImZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9lamIuaHRtbCNlamJjIj48Y29kZT4mbHQ7ZWpiYyZndDs8L2NvZGU+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJPcHRpb25hbFRhc2tzL2NhYi5odG1sIj48Y29kZT4mbHQ7Y2FiJmd0OzwvY29kZT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvbmF0aXZlMmFzY2lpLmh0bWwiPjxjb2RlPiZsdDtuYXRpdmUyYXNjaWkmZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9uZXRyZXh4Yy5odG1sIj48Y29kZT4mbHQ7bmV0cmV4eGMmZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+CisgICAgPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9yZW5hbWVleHRlbnNpb25zLmh0bWwiPjxjb2RlPiZsdDtyZW5hbWVleHRlbnNpb25zJmd0OzwvY29kZT48L2E+CisgIDwvbGk+CisgIDxsaT48YSBocmVmPSJPcHRpb25hbFRhc2tzL2RlcGVuZC5odG1sIj48Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvZG90bmV0Lmh0bWwiPjxjb2RlPiZsdDtpbGFzbSZndDs8L2NvZGU+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJPcHRpb25hbFRhc2tzL2RvdG5ldC5odG1sIj48Y29kZT4mbHQ7Y3NjJmd0OzwvY29kZT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvZG90bmV0Lmh0bWwiPjxjb2RlPiZsdDt2YmMmZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy90cmFuc2xhdGUuaHRtbCI+PGNvZGU+Jmx0O3RyYW5zbGF0ZSZndDs8L2NvZGU+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJPcHRpb25hbFRhc2tzL2ltYWdlLmh0bWwiPjxjb2RlPiZsdDtpbWFnZSZndDs8L2NvZGU+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJPcHRpb25hbFRhc2tzL2psaW5rLmh0bWwiPjxjb2RlPiZsdDtqbGluayZndDs8L2NvZGU+PC9hPiAoZGVwcmVjYXRlZCk8L2xpPgorICA8bGk+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qc3BjLmh0bWwiPjxjb2RlPiZsdDtqc3BjJmd0OzwvY29kZT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvd2xqc3BjLmh0bWwiPjxjb2RlPiZsdDt3bGpzcGMmZ3Q7PC9jb2RlPjwvYT48L2xpPgorPC91bD4KKworPGgzPjxhIG5hbWU9ImV4YW1wbGVzIj5FeGFtcGxlczwvYT48L2gzPgorPHByZT4KKyZsdDtjb3B5IHRvZGlyPSZxdW90OyR7ZGlzdH0mcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovaW1hZ2VzLyomcXVvdDsKKyAgICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7KiovKi5naWYmcXVvdDsKKyAgLyZndDsKKyZsdDsvY29weSZndDs8L3ByZT4KKzxwPlRoaXMgY29waWVzIGFsbCBmaWxlcyBpbiBkaXJlY3RvcmllcyBjYWxsZWQgPGNvZGU+aW1hZ2VzPC9jb2RlPiB0aGF0IGFyZQorbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IHRyZWUgZGVmaW5lZCBieSA8Y29kZT4ke3NyY308L2NvZGU+IHRvIHRoZQorZGVzdGluYXRpb24gZGlyZWN0b3J5IGRlZmluZWQgYnkgPGNvZGU+JHtkaXN0fTwvY29kZT4sCitidXQgZXhjbHVkZXMgYWxsIDxjb2RlPiouZ2lmPC9jb2RlPiBmaWxlcyBmcm9tIHRoZSBjb3B5LjwvcD4KKzxwcmU+CismbHQ7Y29weSB0b2Rpcj0mcXVvdDske2Rpc3R9JnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovaW1hZ2VzLyomcXVvdDsvJmd0OworICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7KiovKi5naWYmcXVvdDsvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L2NvcHkmZ3Q7Cis8L3ByZT4KKzxwPiBUaGUgc2FtZSBhcyB0aGUgZXhhbXBsZSBhYm92ZSwgYnV0IGV4cHJlc3NlZCB1c2luZyBuZXN0ZWQgZWxlbWVudHMuPC9wPgorCis8cHJlPgorJmx0O2RlbGV0ZSBkaXI9JnF1b3Q7JHtkaXN0fSZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqL2ltYWdlcy8qJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqLyouZ2lmJnF1b3Q7LyZndDsKKyZsdDsvZGVsZXRlJmd0OworPC9wcmU+Cis8cD5EZWxldGluZyB0aGUgb3JpZ2luYWwgc2V0IG9mIGZpbGVzLCB0aGUgPGNvZGU+ZGVsZXRlPC9jb2RlPiB0YXNrIGNhbiBhY3QKK2FzIGFuIGltcGxpY2l0IGZpbGVzZXQuPC9wPgorCis8aDM+PGEgbmFtZT0iZGVmYXVsdGV4Y2x1ZGVzIj5EZWZhdWx0IEV4Y2x1ZGVzPC9hPjwvaDM+Cis8cD5UaGVyZSBhcmUgYSBzZXQgb2YgZGVmaW5pdGlvbnMgdGhhdCBhcmUgZXhjbHVkZWQgYnkgZGVmYXVsdCBmcm9tIGFsbAorZGlyZWN0b3J5LWJhc2VkIHRhc2tzLiBUaGV5IGFyZTo8L3A+Cis8cHJlPgorICAgICAqKi8qfgorICAgICAqKi8jKiMKKyAgICAgKiovLiMqCisgICAgICoqLyUqJQorICAgICAqKi8uXyoKKyAgICAgKiovQ1ZTCisgICAgICoqL0NWUy8qKgorICAgICAqKi8uY3ZzaWdub3JlCisgICAgICoqL1NDQ1MKKyAgICAgKiovU0NDUy8qKgorICAgICAqKi92c3N2ZXIuc2NjCisgICAgICoqLy5zdm4KKyAgICAgKiovLnN2bi8qKgorICAgICAqKi8uRFNfU3RvcmUKKzwvcHJlPgorPHA+SWYgeW91IGRvIG5vdCB3YW50IHRoZXNlIGRlZmF1bHQgZXhjbHVkZXMgYXBwbGllZCwgeW91IG1heSBkaXNhYmxlCit0aGVtIHdpdGggdGhlIDxjb2RlPmRlZmF1bHRleGNsdWRlcz0mcXVvdDtubyZxdW90OzwvY29kZT4KK2F0dHJpYnV0ZS48L3A+CisKKzxwPlRoaXMgaXMgdGhlIGRlZmF1bHQgbGlzdDsgbm90ZSB0aGF0IHlvdSBjYW4gbW9kaWZ5IHRoZSBsaXN0IG9mCitkZWZhdWx0IGV4Y2x1ZGVzIGJ5IHVzaW5nIHRoZSA8YQoraHJlZj0iQ29yZVRhc2tzL2RlZmF1bHRleGNsdWRlcy5odG1sIj5kZWZhdWx0ZXhjbHVkZXM8L2E+IHRhc2suPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9mYXZpY29uLmljbyBiL3RydW5rL2RvY3MvbWFudWFsL2Zhdmljb24uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmMyNTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9mYXZpY29uLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9mZWVkYmFjay5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvZmVlZGJhY2suaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTJjMTkxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvZmVlZGJhY2suaHRtbApAQCAtMCwwICsxLDcyIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWwgLSBGZWVkYmFjazwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDE+PGEgbmFtZT0iZmVlZGJhY2siPkZlZWRiYWNrPC9hPiBhbmQgVHJvdWJsZXNob290aW5nPC9oMT4KKzxwPklmIHRoaW5ncyBkbyBub3Qgd29yaywgZXNwZWNpYWxseSBzaW1wbGUgdGhpbmdzIGxpa2UgPHR0PmFudCAtdmVyc2lvbjwvdHQ+LCAKKyAgdGhlbiBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB5b3VyIGNvbmZpZ3VyYXRpb24uIEJlZm9yZSBmaWxpbmcgYnVnIHJlcG9ydHMgYW5kIAorICBlbWFpbGluZyBhbGwgdGhlIGFudCBtYWlsaW5nIGxpc3RzPC9wPgorPG9sPgorICA8bGk+Q2hlY2sgeW91ciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEFyZSBBTlRfSE9NRSBhbmQgSkFWQV9IT01FIGNvcnJlY3Q/IElmIAorICAgIHRoZXkgaGF2ZSBxdW90ZXMgb3IgdHJhaWxpbmcgc2xhc2hlcywgcmVtb3ZlIHRoZW0uPC9saT4KKyAgPGxpPlVuc2V0IENMQVNTUEFUSDsgaWYgdGhhdCBpcyB3cm9uZyB0aGluZ3MgZ28gaG9ycmlibHkgd3JvbmcuIEFudCBkb2VzIG5vdCAKKyAgICBuZWVkIHRoZSBDTEFTU1BBVEggdmFyaWFibGUgZGVmaW5lZCB0byBhbnl0aGluZyB0byB3b3JrLjwvbGk+CisgIDxsaT5NYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHZlcnNpb25zIG9mIGNyaW1zb24uamFyIG9yIG90aGVyIFhNTCBwYXJzZXJzIGluIEpSRS9leHQ8L2xpPgorICA8bGk+SXMgeW91ciBwYXRoIGNvcnJlY3Q/IGlzIEFudCBvbiBpdD8gV2hhdCBhYm91dCBKREsvYmluPyBoYXZlIHlvdSB0ZXN0ZWQgCisgICAgdGhpcz8gSWYgeW91IGFyZSB1c2luZyBKaWtlcywgaXMgaXQgb24gdGhlIHBhdGg/IEEgY3JlYXRlUHJvY2VzcyBlcnJvciAoZXNwZWNpYWxseSAKKyAgICB3aXRoIElEPTIgb24gd2luZG93cykgdXN1YWxseSBtZWFucyBleGVjdXRhYmxlIG5vdCBmb3VuZCBvbiB0aGUgcGF0aC48L2xpPgorICA8bGk+V2hpY2ggdmVyc2lvbiBvZiBhbnQgYXJlIHlvdSBydW5uaW5nPyBPdGhlciBhcHBsaWNhdGlvbnMgZGlzdHJpYnV0ZSBhIGNvcHkgCisgICAgLWl0IG1heSBiZSBiZWluZyBwaWNrZWQgdXAgYnkgYWNjaWRlbnQuPC9saT4KKyAgPGxpPklmIGEgdGFzayBpcyBmYWlsaW5nIHRvIHJ1biBpcyBvcHRpb25hbC5qYXIgaW4gQU5UX0hPTUUvbGliPyBBcmUgdGhlcmUgYW55IAorICAgIGxpYnJhcmllcyB3aGljaCBpdCBkZXBlbmRzIG9uIG1pc3Npbmc/PC9saT4KKyAgPGxpPklmIGEgdGFzayBkb2Vzbid0IGRvIHdoYXQgeW91IGV4cGVjdCwgcnVuIDx0dD5hbnQgLXZlcmJvc2U8L3R0PiBvciA8dHQ+YW50IAorICAgIC1kZWJ1ZzwvdHQ+IHRvIHNlZSB3aGF0IGlzIGhhcHBlbmluZzwvbGk+Cis8L29sPgorPHA+SWYgeW91IGNhbid0IGZpeCB5b3VyIHByb2JsZW0sIHN0YXJ0IHdpdGggdGhlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50IAorICBVc2VyIE1haWxpbmcgTGlzdDwvYT4gLiBUaGVzZSBhcmUgb3RoZXIgYW50IHVzZXJzIHdobyB3aWxsIGhlbHAgeW91IGxlYXJuIHRvIAorICB1c2UgYW50LiBJZiB0aGV5IGNhbm5vdCBmaXggaXQgdGhlbiBzb21lb25lIG1heSBzdWdnZXN0IGZpbGluZyBhIGJ1ZyByZXBvcnQsIAorICB3aGljaCB3aWxsIGVzY2FsYXRlIHRoZSBpc3N1ZS4gUmVtZW1iZXIgb2YgY291cnNlLCB0aGF0IHN1cHBvcnQsIGxpa2UgYWxsIG9wZW4gCisgIHNvdXJjZSBkZXZlbG9wbWVudCB0YXNrcywgaXMgdm9sdW50YXJ5LiBJZiB5b3UgaGF2ZW4ndCBpbnZlc3RlZCB0aW1lIGluIGhlbHBpbmcgCisgIHlvdXJzZWxmIGJ5IGZvbGxvd2luZyB0aGUgc3RlcHMgYWJvdmUsIGl0IGlzIHVubGlrZWx5IHRoYXQgYW55b25lIHdpbGwgaW52ZXN0IAorICB0aGUgdGltZSBpbiBoZWxwaW5nIHlvdS4gPC9wPgorPHA+QWxzbywgaWYgeW91IGRvbid0IHVuZGVyc3RhbmQgc29tZXRoaW5nLCB0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21haWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj5BbnQgCisgIFVzZXIgTWFpbGluZyBMaXN0PC9hPiBpcyB0aGUgcGxhY2UgdG8gYXNrIHF1ZXN0aW9ucy4gTm90IHRoZSBkZXZlbG9wZXIgbGlzdCwgCisgIG5vciB0aGUgaW5kaXZpZHVhbHMgd2hvc2UgbmFtZXMgYXBwZWFycyBpbiB0aGUgc291cmNlIGFuZCBkb2N1bWVudGF0aW9uLiBJZiAKKyAgdGhleSBhbnN3ZXJlZCBhbGwgc3VjaCBlbWFpbHMsIG5vYm9keSB3b3VsZCBoYXZlIGFueSB0aW1lIHRvIGltcHJvdmUgYW50LiA8L3A+Cis8cD5UbyBwcm92aWRlIGZlZWRiYWNrIG9uIHRoaXMgc29mdHdhcmUsIHBsZWFzZSBzdWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50IAorICBVc2VyIE1haWxpbmcgTGlzdDwvYT4gPC9wPgorCis8cD5JZiB5b3Ugd2FudCB0byBjb250cmlidXRlIHRvIEFudCBvciBzdGF5IGN1cnJlbnQgd2l0aCB0aGUgbGF0ZXN0CitkZXZlbG9wbWVudCwgam9pbiB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50IERldmVsb3BtZW50IE1haWxpbmcgTGlzdDwvYT4KKzwvcD4KKzxwPkEgc2VhcmNoYWJsZSBhcmNoaXZlIGNhbiBiZSBmb3VuZCBhdCA8YQoraHJlZj0iaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbSIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tPC9hPi4KK090aGVyIGFyY2hpdmVzIHdpbGwgYmUgZG9jdW1lbnRlZCBvbmxpbmUgYXQgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwjQXJjaGl2ZXMiIHRhcmdldD0iX3RvcCI+TWFpbGluZyBMaXN0cyBBcmNoaXZlczwvYT4gPC9wPgorCisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvaWRlLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9pZGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjEzNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvaWRlLmh0bWwKQEAgLTAsMCArMSwxMDUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KKzx0aXRsZT5JREUgSW50ZWdyYXRpb248L3RpdGxlPgorPGJhc2UgdGFyZ2V0PSJtYWluRnJhbWUiLz4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBocmVmPSJ0b2MuaHRtbCIgdGFyZ2V0PSJuYXZGcmFtZSI+VGFibGUgb2YgQ29udGVudHM8L2E+PC9oMj4KKworPGgzPklERSBJbnRlZ3JhdGlvbjwvaDM+Cis8cD4KK0FsbCB0aGUgbW9kZXJuIEphdmEgSURFcyBzdXBwb3J0IEFudCBhbG1vc3Qgb3V0IG9mIHRoZSBib3guCis8L3A+CisKKzx1bD4KKyAgPGxpPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnRydW5uZXIuc291cmNlZm9yZ2UubmV0LyI+CisgICAgICBBbnRSdW5uZXIgRm9yIEpCdWlsZGVyICh1bmJ1bmRsZWQpCisgICAgPC9hPgorICA8L2xpPgorICA8bGk+CisgICAgPGEgaHJlZj0iSW50ZWdyYXRpb24vamV4dC1wbHVnaW4uaHRtbCI+CisgICAgICBBbnRXb3JrIFBsdWdpbiBmb3IgdGhlIEpleHQgSmF2YSBUZXh0IEVkaXRvciAodW5idW5kbGVkKQorICAgIDwvYT4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9qZGVlLnN1bnNpdGUuZGsvIj4KKyAgICAgIEpERUUgKEphdmEgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgZm9yIEVtYWNzKQorICAgIDwvYT4gaGFzIGJ1aWx0LWluIHRleHQgQU5UIGludGVncmF0aW9uOiBzZWxlY3Rpb24gb2YgdGFyZ2V0IHRocm91Z2ggdGV4dAorICAgIGZpZWxkLCBleGVjdXRpb24sIGh5cGVybGluayB0byBjb21waWxhdGlvbiBlcnJvcnMuIEluc3RhbGxhdGlvbjogYnVpbHQtaW4KKyAgICBKREVFIDIuMi44IG9yIGxhdGVyLiBDb25maWd1cmF0aW9uOiB0aHJvdWdoIGN1c3RvbWl6ZSBtZW51CisgICAgIkpkZSBCdWlsZCBGdW5jdGlvbiIKKyAgPC9saT4KKyAgPGxpPgorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW50ZWxsaWouY29tL2lkZWEvIj4KKyAgICAgIElERUEKKyAgICA8L2E+IGhhcyBidWlsdC1pbiBHVUkgQU5UIGludGVncmF0aW9uOiBHVUkgc2VsZWN0aW9uIG9mIHRhcmdldHMsIGV4ZWN1dGlvbiwKKyAgICBoeXBlcmxpbmsgdG8gY29tcGlsYXRpb24gZXJyb3JzCisgIDwvbGk+CisgIDxsaT4KKyAgICA8YSBocmVmPSJodHRwOi8vYW50Lm5ldGJlYW5zLm9yZy8iPgorICAgICAgTmV0QmVhbnMKKyAgICA8L2E+CisgICAgTmV0QmVhbnMgSURFIHVzZXMgQW50IGFzIHRoZSBiYXNpcyBmb3IgaXRzIHByb2plY3Qgc3lzdGVtIHN0YXJ0aW5nIHdpdGggdGhlIDQuMCByZWxlYXNlLgorICA8L2xpPgorICA8bGk+CisgICAgPGEgaHJlZj0iaHR0cDovL2plZGl0Lm9yZy8iPgorICAgICAgakVkaXQKKyAgICA8L2E+CisgICAgakVkaXQgaXMgYW4gb3BlbiBzb3VyY2UgamF2YSBJREUgd2l0aCBzb21lIGdyZWF0IHBsdWdpbnMgZm9yIEphdmEgZGV2LCBhCisgICAgZ29vZCBYTUwgZWRpdG9yIGFuZCB0aGUgQW50ZmFybSBwbHVnaW4gdG8gZXhlY3V0ZSB0YXJnZXRzIGluIGEgYnVpbGQKKyAgICBmaWxlLgorICA8L2xpPgorICA8bGk+CisgICAgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnLyI+CisgICAgICBFY2xpcHNlCisgICAgPC9hPgorICAgIEVjbGlwc2UgaXMgSUJNJ3MgY291bnRlcnBvaW50IHRvIE5ldEJlYW5zOyBhbiBvcGVuIHNvdXJjZSBJREUgd2l0aAorICAgIEphdmEgYW5kIEFudCBzdXBwb3J0LgorICA8L2xpPgorICA8bGk+CisgICAgPGEgaHJlZj0iSW50ZWdyYXRpb24vVkFKQW50VG9vbC5odG1sIj4KKyAgICAgIFZpc3VhbEFnZSBmb3IgSmF2YTwvYT4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3c3Yi5zb2Z0d2FyZS5pYm0uY29tL3dzZGQvbGlicmFyeS90ZWNoYXJ0aWNsZXMvMDIwM19zZWFybGUvc2VhcmxlMS5odG1sIj4KKyAgICAgIFdlYlNwaGVyZSBTdHVkaW8gQXBwbGljYXRpb24gRGV2ZWxvcGVyCisgICAgPC9hPgorICA8L2xpPgorICA8bGk+CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5ib3JsYW5kLmNvbS9qYnVpbGRlci9wZGYvamI5X2ZlYW1hdHJpeC5wZGYiPgorICAgICAgSkJ1aWxkZXIgOSBQZXJzb25hbAorICAgIDwvYT4KKyAgICBKQnVpbGRlciBzdXBwb3J0cyBBbnQgd2l0aCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzLiBBZGQgQW50IG5vZGVzIHRvCisgICAgcHJvamVjdHMgYW5kIGV4ZWN1dGUgQW50IHRhcmdldHMgZnJvbSB3aXRoaW4gSkJ1aWxkZXIuIEFkZCBjdXN0b20gQW50LWJhc2VkCisgICAgYnVpbGQgdGFza3Mgd2l0aCBjdXN0b20gQW50IGxpYnJhcmllcyB0byBydW4gQW50IGZyb20gd2l0aGluIEpCdWlsZGVyLgorICAgIFJhcGlkIG5hdmlnYXRpb24gZnJvbSBBbnQgYnVpbGQgZXJyb3IgbWVzc2FnZXMgdG8gc291cmNlIGZpbGVzLgorICAgIEN1c3RvbWl6ZSBidWlsZCBtZW51IGFuZCB0b29sYmFyIHdpdGggY3VzdG9tIGJ1aWxkIHRhcmdldHMuCisgIDwvbGk+Cis8L3VsPgorCisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvaW5kZXguaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1NmU2MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KKzwvaGVhZD4KKworPGZyYW1lc2V0IGNvbHM9IjI2JSw3NCUiPgorPGZyYW1lIHNyYz0idG9jLmh0bWwiIG5hbWU9Im5hdkZyYW1lIj4KKzxmcmFtZSBzcmM9ImNvdmVyLmh0bWwiIG5hbWU9Im1haW5GcmFtZSI+Cis8L2ZyYW1lc2V0PgorPG5vZnJhbWVzPgorPEgyPkFwYWNoZSBBbnQgVXNlciBNYW51YWw8L0gyPgorCis8YSBocmVmPSJ0b2MuaHRtbCI+QXBhY2hlIEFudCBVc2VyIE1hbnVhbDwvYT48L25vZnJhbWVzPgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9pbnB1dGhhbmRsZXIuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL2lucHV0aGFuZGxlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzQ5MzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9pbnB1dGhhbmRsZXIuaHRtbApAQCAtMCwwICsxLDExMCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5JbnB1dEhhbmRsZXI8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMT5JbnB1dEhhbmRsZXI8L2gxPgorCis8aDI+T3ZlcnZpZXc8L2gyPgorCis8cD5XaGVuIGEgdGFzayB3YW50cyB0byBwcm9tcHQgYSB1c2VyIGZvciBpbnB1dCwgaXQgZG9lc24ndCBzaW1wbHkKK3JlYWQgdGhlIGlucHV0IGZyb20gdGhlIGNvbnNvbGUgYXMgdGhpcyB3b3VsZCBtYWtlIGl0IGltcG9zc2libGUgdG8KK2VtYmVkIEFudCBpbiBhbiBJREUuICBJbnN0ZWFkIGl0IGFza3MgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlCis8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXI8L2NvZGU+IGludGVyZmFjZSB0bworcHJvbXB0IHRoZSB1c2VyIGFuZCBoYW5kIHRoZSB1c2VyIGlucHV0IGJhY2sgdG8gdGhlIHRhc2suPC9wPgorCis8cD5UbyBkbyB0aGlzLCB0aGUgdGFzayBjcmVhdGVzIGFuIDxjb2RlPklucHV0UmVxdWVzdDwvY29kZT4gb2JqZWN0CithbmQgcGFzc2VzIGl0IHRvIHRoZSA8Y29kZT5JbnB1dEhhbmRsZXI8L2NvZGU+IFN1Y2ggYW4KKzxjb2RlPklucHV0UmVxdWVzdDwvY29kZT4gbWF5IGtub3cgd2hldGhlciBhIGdpdmVuIHVzZXIgaW5wdXQgaXMgdmFsaWQKK2FuZCB0aGUgPGNvZGU+SW5wdXRIYW5kbGVyPC9jb2RlPiBpcyBzdXBwb3NlZCB0byByZWplY3QgYWxsIGludmFsaWQKK2lucHV0LjwvcD4KKworPHA+RXhhY3RseSBvbmUgPGNvZGU+SW5wdXRIYW5kbGVyPC9jb2RlPiBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGgKK2V2ZXJ5IEFudCBwcm9jZXNzLCB1c2VycyBjYW4gc3BlY2lmeSB0aGUgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlCis8Y29kZT4taW5wdXRoYW5kbGVyPC9jb2RlPiBjb21tYW5kIGxpbmUgc3dpdGNoLjwvcD4KKworPGgyPklucHV0SGFuZGxlcjwvaDI+CisKKzxwPlRoZSA8Y29kZT5JbnB1dEhhbmRsZXI8L2NvZGU+IGludGVyZmFjZSBjb250YWlucyBleGFjdGx5IG9uZQorbWV0aG9kPC9wPgorCis8cHJlPgorICAgIHZvaWQgaGFuZGxlSW5wdXQoSW5wdXRSZXF1ZXN0IHJlcXVlc3QpIAorICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Cis8L3ByZT4KKworPHA+d2l0aCBzb21lIHByZS0gYW5kIHBvc3Rjb25kaXRpb25zLiAgVGhlIG1haW4gcG9zdGNvbmRpdGlvbiBpcyB0aGF0Cit0aGlzIG1ldGhvZCBtdXN0IG5vdCByZXR1cm4gdW5sZXNzIHRoZSA8Y29kZT5yZXF1ZXN0PC9jb2RlPiBjb25zaWRlcnMKK3RoZSB1c2VyIGlucHV0IHZhbGlkLCBpdCBpcyBhbGxvd2VkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpbiB0aGlzCitzaXR1YXRpb24uPC9wPgorCis8cD5BbnQgY29tZXMgd2l0aCB0aHJlZSBidWlsdC1pbiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2U6PC9wPgorCis8aDM+PGEgbmFtZT0iZGVmYXVsdGhhbmRsZXIiPkRlZmF1bHRJbnB1dEhhbmRsZXI8L2E+PC9oMz4KKworPHA+VGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24geW91IGdldCwgd2hlbiB5b3UgZG9uJ3QgdXNlIHRoZQorPGNvZGU+LWlucHV0aGFuZGxlcjwvY29kZT4gY29tbWFuZCBsaW5lIHN3aXRjaCBhdCBhbGwuICBUaGlzCitpbXBsZW1lbnRhdGlvbiB3aWxsIHByaW50IHRoZSBwcm9tcHQgZW5jYXBzdWxhdGVkIGluIHRoZQorPGNvZGU+cmVxdWVzdDwvY29kZT4gb2JqZWN0IHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtIGFuZCByZS1wcm9tcHQgZm9yCitpbnB1dCB1bnRpbCB0aGUgdXNlciBlbnRlcnMgc29tZXRoaW5nIHRoYXQgaXMgY29uc2lkZXJlZCB2YWxpZCBpbnB1dAorYnkgdGhlIDxjb2RlPnJlcXVlc3Q8L2NvZGU+IG9iamVjdC4gIElucHV0IHdpbGwgYmUgcmVhZCBmcm9tIHRoZQorY29uc29sZSBhbmQgdGhlIHVzZXIgd2lsbCBuZWVkIHRvIHByZXNzIHRoZSBSZXR1cm4ga2V5LjwvcD4KKworPGgzPlByb3BlcnR5RmlsZUlucHV0SGFuZGxlcjwvaDM+CisKKzxwPlRoaXMgaW1wbGVtZW50YXRpb24gaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJ1biB1bmF0dGVuZGVkIGJ1aWxkCitwcm9jZXNzZXMuICBJdCByZWFkcyBhbGwgaW5wdXQgZnJvbSBhIHByb3BlcnRpZXMgZmlsZSBhbmQgbWFrZXMgdGhlCitidWlsZCBmYWlsIGlmIGl0IGNhbm5vdCBmaW5kIHZhbGlkIGlucHV0IGluIHRoaXMgZmlsZS4gIFRoZSBuYW1lIG9mCit0aGUgcHJvcGVydGllcyBmaWxlIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBKYXZhIHN5c3RlbSBwcm9wZXJ0eQorPGNvZGU+YW50LmlucHV0LnByb3BlcnRpZXM8L2NvZGU+LjwvcD4KKworPHA+VGhlIHByb21wdCBlbmNhcHN1bGF0ZWQgaW4gYSA8Y29kZT5yZXF1ZXN0PC9jb2RlPiB3aWxsIGJlIHVzZWQgYXMKK3RoZSBrZXkgd2hlbiBsb29raW5nIHVwIHRoZSBpbnB1dCBpbnNpZGUgdGhlIHByb3BlcnRpZXMgZmlsZS4gIElmIG5vCitpbnB1dCBjYW4gYmUgZm91bmQsIHRoZSBpbnB1dCBpcyBjb25zaWRlcmVkIGludmFsaWQgYW5kIGFuIGV4Y2VwdGlvbgord2lsbCBiZSB0aHJvd24uPC9wPgorCis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz4gdGhhdCA8Y29kZT5hbnQuaW5wdXQucHJvcGVydGllczwvY29kZT4gbXVzdAorYmUgYSBKYXZhIHN5c3RlbSBwcm9wZXJ0eSwgbm90IGFuIEFudCBwcm9wZXJ0eS4gIEkuZS4geW91IGNhbm5vdAorZGVmaW5lIGl0IGFzIGEgc2ltcGxlIHBhcmFtZXRlciB0byA8Y29kZT5hbnQ8L2NvZGU+LCBidXQgeW91IGNhbgorZGVmaW5lIGl0IGluc2lkZSB0aGUgPGNvZGU+QU5UX09QVFM8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLjwvcD4KKworPGgzPkdyZWVkeUlucHV0SGFuZGxlcjwvaDM+CisKKzxwPkxpa2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHRoaXMgSW5wdXRIYW5kbGVyIHJlYWRzIGZyb20gc3RhbmRhcmQKK2lucHV0LiBIb3dldmVyLCBpdCBjb25zdW1lcyA8aT5hbGw8L2k+IGF2YWlsYWJsZSBpbnB1dC4gVGhpcyBiZWhhdmlvciBpcwordXNlZnVsIGZvciBzZW5kaW5nIEFudCBpbnB1dCB2aWEgYW4gT1MgcGlwZS4gPGI+U2luY2UgQW50IDEuNzwvYj4uPC9wPgorCis8aDI+SW5wdXRSZXF1ZXN0PC9oMj4KKworPHA+SW5zdGFuY2VzIG9mIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdDwvY29kZT4KK2VuY2Fwc3VsYXRlIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gYXNrIGEgdXNlciBmb3IgaW5wdXQgYW5kCit2YWxpZGF0ZSB0aGlzIGlucHV0LjwvcD4KKworPHA+VGhlIGluc3RhbmNlcyBvZiA8Y29kZT5JbnB1dFJlcXVlc3Q8L2NvZGU+IGl0c2VsZiB3aWxsIGFjY2VwdCBhbnkKK2lucHV0LCBidXQgc3ViY2xhc3NlcyBtYXkgdXNlIHN0cmljdGVyIHZhbGlkYXRpb25zLgorPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuTXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3Q8L2NvZGU+CitzaG91bGQgYmUgdXNlZCBpZiB0aGUgdXNlciBpbnB1dCBtdXN0IGJlIHBhcnQgb2YgYSBwcmVkZWZpbmVkIHNldCBvZgorY2hvaWNlcy48L3A+CisKKworPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvaW5zdGFsbC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvaW5zdGFsbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZmIyODcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9pbnN0YWxsLmh0bWwKQEAgLTAsMCArMSw5ODIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+SW5zdGFsbGluZyBBbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMT5JbnN0YWxsaW5nIEFudDwvaDE+Cis8aDI+PGEgbmFtZT0iZ2V0dGluZyI+R2V0dGluZyBBbnQ8L2E+PC9oMj4KKworPGgzPkRvd25sb2FkIEFyZWEgTGF5b3V0PC9oMz4KKzx0YWJsZT4KKzx0cj4KKyAgPHRoPkZpbGVuYW1lIG9yIFBhdGg8L3RoPgorICA8dGg+RGVzY3JpcHRpb248L3RoPgorPC90cj4KKzx0cj4KKyAgPHRkPktFWVM8L3RkPgorICA8dGQ+UEdQLUtleXNmaWxlLiBJdCBjb250YWlucyB0aGUgUEdQLWtleXMgb2YgQW50IGRldmVsb3BlcnMgc28geW91IGNhbiAndHJ1c3QnIHRoZSBkaXN0cmlidXRpb24uIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+UkVMRUFTRS1OT1RFUy17dmVyc2lvbn0uaHRtbDwvdGQ+CisgIDx0ZD4KKyAgICBSZWxlYXNlIG5vdGVzIG9mIHRoZSBnaXZlbiB2ZXJzaW9uIGluIEhUTUwgZm9ybWF0LiBXaGVuIHVwZ3JhZGluZyB5b3VyIEFudCBpbnN0YWxsYXRpb24geW91CisgICAgc2hvdWxkIGhhdmUgYSBsb29rIGF0IHRoZSA8aT5DaGFuZ2VzIHRoYXQgY291bGQgYnJlYWsgb2xkZXIgZW52aXJvbm1lbnRzPC9pPiBzZWN0aW9uLgorICA8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPmFudC1jdXJyZW50LWJpbi56aXA8L3RkPgorICA8dGQ+CisgICAgWklQLUFyY2hpdmUgY29udGFpbmluZyB0aGUgY29tcGlsZWQgdmVyc2lvbiBvZiBBbnQgaW4gdGhlIGxhc3QgcmVsZWFzZWQgdmVyc2lvbi4gVGhpcyBpcyB0aGUgZmlsZQorICAgIG1vc3QgdXNlcnMgd2lsbCB3YW50IHRvIGRvd25sb2FkLgorICA8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPmFudC1jdXJyZW50LXNyYy56aXA8L3RkPgorICA8dGQ+CisgICAgWklQLUFyY2hpdmUgY29udGFpbmluZyB0aGUgc291cmNlcyBvZiBBbnQuIElmIHlvdSBoYXZlIHRoaXMgeW91IGNvdWxkIGNvbXBpbGUgQW50IGl0c2VsZi4KKyAgICBJZiB5b3UgZG8gbm90IGhhdmUgdGhlIDxpPnJlcXVpcmVkPC9pPiBkZXBlbmRlbmNpZXMsIHRoZSBjbGFzc2VzIGRlcGVkaW5nIG9uIHRoZW0gYXJlIGp1c3Qgbm90CisgICAgYnVpbGQuCisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+YW50LWN1cnJlbnQtKi5hc2M8L3RkPgorICA8dGQ+CisgICAgU2VjdXJpdHkgZmlsZSBmb3IgY2hlY2tpbmcgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSB6aXAgZmlsZS4gVGhpcyBvbmUgaXMgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QcmV0dHlfR29vZF9Qcml2YWN5IiB0YXJnZXQ9Il9ibGFuayI+UEdQPC9hPiBrZXkuCisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+YW50LWN1cnJlbnQtKi5tZDU8L3RkPgorICA8dGQ+CisgICAgU2VjdXJpdHkgZmlsZSBmb3IgY2hlY2tpbmcgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSB6aXAgZmlsZS4gVGhpcyBvbmUgaXMgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZDUiIHRhcmdldD0iX2JsYW5rIj5NRDU8L2E+IGtleS4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD5hbnQtY3VycmVudC0qLnNoYTE8L3RkPgorICA8dGQ+CisgICAgU2VjdXJpdHkgZmlsZSBmb3IgY2hlY2tpbmcgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSB6aXAgZmlsZS4gVGhpcyBvbmUgaXMgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TSEEtMSIgdGFyZ2V0PSJfYmxhbmsiPlNIQTE8L2E+IGtleS4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD5hbnRsaWJzLzwvdGQ+CisgIDx0ZD4KKyAgICBUaGlzIGRpcmVjdG9yeSBob2xkcyB0aGUgQW50bGlicyB0aGF0IGFyZSBtYWRlIG9mIGF2YWlsYWJsZSBieSB0aGUgQXBhY2hlIEFudCBwcm9qZWN0LgorICAgIEFudGxpYnMgYXJlIGJ1bmRsZXMgb2YgQW50IHRhc2tzIHRoYXQgYXJlIG5vdCBkZWxpdmVyZWQgYXMgcGFydCBvZiB0aGUgQW50IGNvcmUgYnV0IGFyZQorICAgIGF2YWlsYWJsZSBhcyBvcHRpb25hbCBkb3dubG9hZHMuCisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+YmluYXJpZXMvPC90ZD4KKyAgPHRkPgorICAgIFRoZSBiaW5hcmllcyBkaXJlY3RvcnkgaG9sZHMgc3BlY2lmaWMgQW50IHJlbGVhc2VzIGJ1bmRsZWQgaW4gYm90aCBaSVAgYW5kIHRhci5neiBjb21wcmVzc2lvbgorICAgIGZvcm1hdHMuIFRoZSBuYW1lZCByZWxlYXNlcyBhcmUgaW4gY29udHJhc3QgdG8gdGhlIGFudC1jdXJyZW50LWJpbi56aXAgZmlsZSBpbiB0aGUgcGFyZW50IAorICAgIGRpcmVjdG9yeSwgd2hpY2ggaXMgYWx3YXlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIG1vc3QgY3VycmVudCByZWxlYXNlIG9mIEFudC4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD5jb21tb24vPC90ZD4KKyAgPHRkPgorICAgIFRoZSBjb21tb24gZGlyZWN0b3J5IGhvbGRzIHZhcmlvdXMgZmlsZXMsIHN1Y2ggYXMgdGhlIEFwYWNoZSBMaWNlbnNlIGZpbGUgdGhhdCBBbnQgaXMgbGljZW5zZWQKKyAgICB1bmRlciwgdGhhdCBwZW9wbGUgbWF5IHdpc2ggdG8gZXhhbWluZSB3aXRob3V0IGhhdmluZyB0byBkb3dubG9hZCB0aGUgd2hvbGUgQW50IGRpc3RyaWJ1dGlvbi4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD5zb3VyY2UvPC90ZD4KKyAgPHRkPgorICAgIFRoZSBzb3VyY2UgZGlyZWN0b3J5IGhvbGRzIHRoZSBzb3VyY2UgY29kZSBmb3Igc3BlY2lmaWMgQW50IHJlbGVhc2VzIGJ1bmRsZWQgaW4gYm90aCBaSVAgYW5kIAorICAgIHRhci5neiBjb21wcmVzc2lvbiBmb3JtYXRzLiBUaGUgbmFtZWQgcmVsZWFzZXMgYXJlIGluIGNvbnRyYXN0IHRvIHRoZSBhbnQtY3VycmVudC1zcmMuemlwIGZpbGUKKyAgICBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSwgd2hpY2ggaXMgYWx3YXlzIGd1YXJhbnRlZWQgdG8gaG9sZCB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBtb3N0IGN1cnJlbnQgCisgICAgcmVsZWFzZSBvZiBBbnQuCisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworPGgzPkJpbmFyeSBFZGl0aW9uPC9oMz4KKzxwPlRoZSBsYXRlc3Qgc3RhYmxlIHZlcnNpb24gb2YgQW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBBbnQgd2ViIHBhZ2UgPGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iIHRhcmdldD0iX3RvcCI+aHR0cDovL2FudC5hcGFjaGUub3JnLzwvYT4uCisKKzxoMz5BcyBhIGJpbmFyeSBpbiBhbiBSUE0gUGFja2FnZTwvaDM+CisKKzxwPkNvbnN1bHQgdGhlIDxhIGhyZWY9IiNqcGFja2FnZSI+anBhY2thZ2U8L2E+IHNlY3Rpb24gYmVsb3cuPC9wPgorCis8aDM+QnVuZGxlZCBpbiBJREVzPC9oMz4KKzxwPgorICAgIEFsbCB0aGUgbWFpbiBKYXZhIElERXMgc2hpcCB3aXRoIEFudCwgcHJvZHVjdHMgc3VjaCBhcyBFY2xpcHNlLCBOZXRCZWFucworICAgIGFuZCBJbnRlbGxpSiBJREVBLiBJZiB5b3UgaW5zdGFsbCBBbnQgdGhpcyB3YXkgeW91IHVzdWFsbHkgZ2V0IHRoZSBtb3N0IHJlY2VudAorICAgIHJlbGVhc2Ugb2YgQW50IGF0IHRoZSB0aW1lIHRoZSBJREUgd2FzIHJlbGVhc2VkLiBTb21lIG9mIHRoZSBJREVzIChFY2xpcHNlCisgICAgYW5kIE5ldEJlYW5zIGluIHBhcnRpY3VsYXIpIHNoaXAgd2l0aCBleHRyYSB0YXNrcyB0aGF0IG9ubHkgd29yayBpZgorICAgIElERS1zcGVjaWZpYyB0b29scyBhcmUgb24gQW50J3MgcGF0aC4gVG8gdXNlIHRoZXNlIG9uIGNvbW1hbmQtbGluZSB2ZXJzaW9ucworICAgIG9mIEFudCwgdGhlIHJlbGV2YW50IEpBUnMgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgY29tbWFuZC1saW5lIEFudCBhcworICAgIGV4dHJhIGxpYnJhcmllcy90YXNrcy4gTm90ZSB0aGF0IGlmIGl0IGlzIGFuIElERSB0YXNrIG9yIGV4dGVuc2lvbiB0aGF0IGlzCisgICAgbm90IGJlaGF2aW5nLCB0aGUgQW50IHRlYW0gaXMgdW5hYmxlIHRvIGZpZWxkIGJ1ZyByZXBvcnRzLiBUcnkgdGhlIElERSBtYWlsaW5nCisgICAgbGlzdHMgZmlyc3QsIHdobyB3aWxsIGNyb3NzLWZpbGUgYnVncyBpZiBhcHByb3ByaWF0ZS4KKzwvcD4KKzxwPgorICAgIElERSdzIGNhbiBpbnZhcmlhYmx5IGJlIHBvaW50ZWQgYXQgZGlmZmVyZW50IEFudCBpbnN0YWxsYXRpb25zLiBUaGlzIGxldHMKKyAgICBkZXZlbG9wZXJzIHVwZ3JhZGUgdG8gYSBuZXcgcmVsZWFzZSBvZiBBbnQsIGFuZCBlbGltaW5hdGUgaW5jb25zaXN0ZW5jaWVzCisgICAgYmV0d2VlbiBjb21tYW5kLWxpbmUgYW5kIElERSBBbnQuCis8L3A+CisKKzxoMz5CdW5kbGVkIGluIEphdmEgYXBwbGljYXRpb25zPC9oMz4KKworPHA+CisgICAgTWFueSBKYXZhIGFwcGxpY2F0aW9ucywgbW9zdCBwYXJ0aWN1bGFybHkgYXBwbGljYXRpb24gc2VydmVycywgc2hpcCB3aXRoCisgICAgYSB2ZXJzaW9uIG9mIEFudC4gVGhlc2UgYXJlIHByaW1hcmlseSBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbiwKKyAgICB1c2luZyB0aGUgSmF2YSBBUElzIHRvIGRlbGVnYXRlIHRhc2tzIHN1Y2ggYXMgSlNQIHBhZ2UgY29tcGlsYXRpb24gdG8gdGhlIEFudAorICAgIHJ1bnRpbWUuIFN1Y2ggZGlzdHJpYnV0aW9ucyBhcmUgdXN1YWxseSB1bnN1cHBvcnRlZCBieSBldmVyeW9uZS4gUGFydGljdWxhcmx5CisgICAgdHJvdWJsZXNvbWUgYXJlIHRob3NlIHByb2R1Y3RzIHRoYXQgbm9uIG9ubHkgc2hpcCB3aXRoIHRoZWlyIG93biBBbnQgcmVsZWFzZSwKKyAgICB0aGV5IGFkZCB0aGVpciBvd24gdmVyc2lvbiBvZiBBTlQuQkFUIG9yIGFudC5zaCB0byB0aGUgUEFUSC4gSWYgQW50IHN0YXJ0cworICAgIGJlaGF2aW5nIHdpZXJkbHkgYWZ0ZXIgaW5zdGFsbGluZyBzb21ldGhpbmcsIHRyeSB0aGUKKyAgICA8YSBocmVmPSIjZGlhZ25vc3RpY3MiPmRpYWdub3N0aWNzPC9hPiBhZHZpY2UuCis8L3A+CisKKzxoMz5Tb3VyY2UgRWRpdGlvbjwvaDM+CisKKzxwPklmIHlvdSBwcmVmZXIgdGhlIHNvdXJjZSBlZGl0aW9uLCB5b3UgY2FuIGRvd25sb2FkIHRoZSBzb3VyY2UgZm9yIHRoZSBsYXRlc3QKK0FudCByZWxlYXNlIGZyb20KKzxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9zcmNkb3dubG9hZC5jZ2kiIHRhcmdldD0iX3RvcCI+aHR0cDovL2FudC5hcGFjaGUub3JnL3NyY2Rvd25sb2FkLmNnaTwvYT4uCisKK0lmIHlvdSBwcmVmZXIgdGhlIGxlYWRpbmctZWRnZSBjb2RlLCB5b3UgY2FuIGFjY2VzcwordGhlIGNvZGUgYXMgaXQgaXMgYmVpbmcgZGV2ZWxvcGVkIHZpYSBTVk4uIFRoZSBBbnQgd2Vic2l0ZSBoYXMgZGV0YWlscyBvbgorPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL3N2bi5odG1sIiB0YXJnZXQ9Il90b3AiPmFjY2Vzc2luZyBTVk48L2E+LgorQWxsIGJ1ZyBmaXhlcyB3aWxsIGdvIGluIGFnYWluc3QgdGhlIEhFQUQgb2YgdGhlIHNvdXJjZSB0cmVlLCBhbmQgdGhlIGZpcnN0CityZXNwb25zZSB0byBtYW55IGJ1Z3JlcHMgd2lsbCBiZSAiaGF2ZSB5b3UgdHJpZWQgdGhlIGxhdGVzdCB2ZXJzaW9uIi4KK0Rvbid0IGJlIGFmcmFpZCB0byBkb3dubG9hZCBhbmQgYnVpbGQgYSBwcmVyZXJlbGVhc2UgZWRpdGlvbiwgYXMgZXZlcnl0aGluZworb3RoZXIgdGhhbiBuZXcgZmVhdHVyZXMgYXJlIHVzdWFsbHkgc3RhYmxlLgorICAgIDwvcD4KKzxwPgorCisKK1NlZSB0aGUgc2VjdGlvbiA8YSBocmVmPSIjYnVpbGRpbmdhbnQiPkJ1aWxkaW5nIEFudDwvYT4gb24gaG93IHRvCitidWlsZCBBbnQgZnJvbSB0aGUgc291cmNlIGNvZGUuCitZb3UgY2FuIGFsc28gYWNjZXNzIHRoZQorPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC8iIHRhcmdldD0iX3RvcCI+CitBbnQgU1ZOIHJlcG9zaXRvcnk8L2E+IG9uLWxpbmUuIDwvcD4KKworPGhyPgorPGgyPjxhIG5hbWU9InN5c3JlcXVpcmVtZW50cyI+U3lzdGVtIFJlcXVpcmVtZW50czwvYT48L2gyPgorQW50IGhhcyBiZWVuIHVzZWQgc3VjY2Vzc2Z1bGx5IG9uIG1hbnkgcGxhdGZvcm1zLCBpbmNsdWRpbmcgTGludXgsCitjb21tZXJjaWFsIGZsYXZvdXJzIG9mIFVuaXggc3VjaCBhcyBTb2xhcmlzIGFuZCBIUC1VWCwKK1dpbmRvd3MgTlQtcGxhdGZvcm1zLCBPUy8yIFdhcnAsIE5vdmVsbCBOZXR3YXJlIDYsIE9wZW5WTVMgYW5kIE1hY09TIFguCitUaGUgcGxhdGZvcm1zIHVzZWQgbW9zdCBmb3IgZGV2ZWxvcG1lbnQgYXJlLCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLAorTGludXgsIE1hY09TIFgsIFdpbmRvd3MgWFAgYW5kIFVuaXg7IHRoZXNlIGFyZSB0aGVyZWZvcmUgdGhhdCBwbGF0Zm9ybXMKK3RoYXQgdGVuZCB0byB3b3JrIGJlc3QuIEFzIG9mIEFudDEuNywgV2luZG93cyA5eCBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorPHA+CitUbyBidWlsZCBhbmQgdXNlIEFudCwgeW91IG11c3QgaGF2ZSBhIEpBWFAtY29tcGxpYW50IFhNTCBwYXJzZXIgaW5zdGFsbGVkIGFuZAorYXZhaWxhYmxlIG9uIHlvdXIgY2xhc3NwYXRoLCBzdWNoIGFzIFhlcmNlcy48L3A+Cis8cD4KK1RoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIEFudCBpbmNsdWRlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlCis8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzMi1qL2luZGV4Lmh0bWwiIHRhcmdldD0iX3RvcCI+QXBhY2hlIFhlcmNlczI8L2E+IFhNTCBwYXJzZXIuCitQbGVhc2Ugc2VlCis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC8iIHRhcmdldD0iX3RvcCI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvPC9hPgorZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgSkFYUC4KK0lmIHlvdSB3aXNoIHRvIHVzZSBhIGRpZmZlcmVudCBKQVhQLWNvbXBsaWFudCBwYXJzZXIsIHlvdSBzaG91bGQgcmVtb3ZlCis8Y29kZT54ZXJjZXNJbXBsLmphcjwvY29kZT4gYW5kIDxjb2RlPnhtbC1hcGlzLmphcjwvY29kZT4KK2Zyb20gQW50J3MgPGNvZGU+bGliPC9jb2RlPiBkaXJlY3RvcnkuCis8cD4KK1lvdSBjYW4gdGhlbiBlaXRoZXIgcHV0IHRoZSBKQVJzIG9mIHlvdXIgcHJlZmVycmVkIHBhcnNlciBpbnRvIEFudCdzCis8Y29kZT5saWI8L2NvZGU+IGRpcmVjdG9yeSBvciBwdXQgdGhlIGphcnMgb24gdGhlIHN5c3RlbSBjbGFzc3BhdGguCitTb21lIHBhcnRzIG9mIEFudCB3aWxsIGZhaWwgaWYgeW91IHVzZSBhbiBvbGQgcGFyc2VyLCBlc3BlY2lhbGx5IG9uZQordGhhdCBpcyBub3QgbmFtZXNwYWNlLWF3YXJlLiBJbiBwYXJ0aWN1bGFyLCBhdm9pZCB0aGUgQ3JpbXNvbiBwYXJzZXIuPC9wPgorCis8cD5UaXA6ICJhbnQgLWRpYWdub3N0aWNzIiB3aWxsIGxpc3QgdGhlIFhNTCBwYXJzZXIgdXNlZCBhbmQgaXRzIGxvY2F0aW9uLjwvcD4KKworPHA+CitGb3IgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBBbnQsIHlvdSB3aWxsIGFsc28gbmVlZCBhIEpESyBpbnN0YWxsZWQgb24KK3lvdXIgc3lzdGVtLCB2ZXJzaW9uIDEuMiBvciBsYXRlciByZXF1aXJlZCwgMS41IG9yIGxhdGVyIHN0cm9uZ2x5IHJlY29tbWVuZGVkLgorVGhlIGxhdGVyIHRoZSB2ZXJzaW9uIG9mIEphdmEgLCB0aGUgbW9yZSBBbnQgdGFza3MgeW91IGdldC4KKzwvcD4KKzxwPgorPHN0cm9uZz5Ob3RlICMyOiA8L3N0cm9uZz5JZiBhIEpESyBpcyBub3QgcHJlc2VudCwgb25seSB0aGUgSlJFIHJ1bnRpbWUsIHRoZW4gbWFueSB0YXNrcyB3aWxsIG5vdCB3b3JrLgorPC9wPgorCis8aDM+T3BlbiBTb3VyY2UgSmF2YSBSdW50aW1lczwvaDM+Cis8cD4KKyAgICBUaGUgQW50IHRlYW0gc3Ryb25nbHkgc3VwcG9ydHMgdXNlcnMgcnVubmluZyBBbnQgb24gS2FmZmUgYW5kIG90aGVyCisgICAgb3BlbiBzb3VyY2UgSmF2YSBydW50aW1lcywgYW5kIHNvIHN0cml2ZXMgdG8gaGF2ZSBhIHByb2R1Y3QgdGhhdCB3b3JrcworICAgIHdlbGwgb24gdGhvc2UgcGxhdGZvcm1zLiBXaGF0IGFwcGVhcnMgdG8gd29yayB3ZWxsIGlzIEthZmZlIHdpdGgKKyAgICBHbnUgQ2xhc3NwYXRoIGFuZCB0aGUgWGVyY2VzIGFuZCBYYWxhbiBsaWJyYXJpZXMuCis8L3A+CisKKzxocj4KKzxoMj48YSBuYW1lPSJpbnN0YWxsaW5nIj5JbnN0YWxsaW5nIEFudDwvYT48L2gyPgorPHA+VGhlIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQW50IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IGxheW91dDoKKzxwcmU+CisgIGFudAorICAgKy0tLSBSRUFETUUsIExJQ0VOU0UsIGZldGNoLnhtbCwgb3RoZXIgdGV4dCBmaWxlcy4gLy9iYXNpYyBpbmZvcm1hdGlvbgorICAgKy0tLSBiaW4gIC8vIGNvbnRhaW5zIGxhdW5jaGVyIHNjcmlwdHMKKyAgIHwKKyAgICstLS0gbGliICAvLyBjb250YWlucyBBbnQgamFycyBwbHVzIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMKKyAgIHwKKyAgICstLS0gZG9jcyAvLyBjb250YWlucyBkb2N1bWVudGF0aW9uCisgICB8ICAgICAgfAorICAgfCAgICAgICstLS0gaW1hZ2VzICAvLyB2YXJpb3VzIGxvZ29zIGZvciBodG1sIGRvY3VtZW50YXRpb24KKyAgIHwgICAgICB8CisgICB8ICAgICAgKy0tLSBtYW51YWwgIC8vIEFudCBkb2N1bWVudGF0aW9uIChhIG11c3QgcmVhZCA7LSkKKyAgIHwKKyAgICstLS0gZXRjIC8vIGNvbnRhaW5zIHhzbCBnb29kaWVzIHRvOgorICAgICAgICAgICAgLy8gICAtIGNyZWF0ZSBhbiBlbmhhbmNlZCByZXBvcnQgZnJvbSB4bWwgb3V0cHV0IG9mIHZhcmlvdXMgdGFza3MuCisgICAgICAgICAgICAvLyAgIC0gbWlncmF0ZSB5b3VyIGJ1aWxkIGZpbGVzIGFuZCBnZXQgcmlkIG9mICdkZXByZWNhdGVkJyB3YXJuaW5nCisgICAgICAgICAgICAvLyAgIC0gLi4uIGFuZCBtb3JlIDstKQorPC9wcmU+CisKK09ubHkgdGhlIDxjb2RlPmJpbjwvY29kZT4gYW5kIDxjb2RlPmxpYjwvY29kZT4gZGlyZWN0b3JpZXMgYXJlCityZXF1aXJlZCB0byBydW4gQW50LgorCitUbyBpbnN0YWxsIEFudCwgY2hvb3NlIGEgZGlyZWN0b3J5IGFuZCBjb3B5IHRoZSBkaXN0cmlidXRpb24KK2ZpbGVzIHRoZXJlLiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGtub3duIGFzIEFOVF9IT01FLgorPC9wPgorCis8dGFibGUgd2lkdGg9IjgwJSI+Cis8dHI+CisgIDx0ZCBjb2xzcGFuPSIyIj4KKyAgICA8Yj5XaW5kb3dzIDk1LCBXaW5kb3dzIDk4ICZhbXA7IFdpbmRvd3MgTUUgTm90ZTo8L2I+CisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjUlIj4mbmJzcDs8L3RkPgorICA8dGQ+PGk+CitPbiB0aGVzZSBzeXN0ZW1zLCB0aGUgc2NyaXB0IHVzZWQgdG8gbGF1bmNoIEFudCB3aWxsIGhhdmUKK3Byb2JsZW1zIGlmIEFOVF9IT01FIGlzIGEgbG9uZyBmaWxlbmFtZSAoaS5lLiBhIGZpbGVuYW1lIHdoaWNoIGlzIG5vdAorb2YgdGhlIGZvcm1hdCBrbm93biBhcyAmcXVvdDs4LjMmcXVvdDspLiBUaGlzIGlzIGR1ZSB0bworbGltaXRhdGlvbnMgaW4gdGhlIE9TJ3MgaGFuZGxpbmcgb2YgdGhlIDxjb2RlPiZxdW90O2ZvciZxdW90OzwvY29kZT4KK2JhdGNoLWZpbGUgc3RhdGVtZW50LiBJdCBpcyByZWNvbW1lbmRlZCwgdGhlcmVmb3JlLCB0aGF0IEFudCBiZQoraW5zdGFsbGVkIGluIGEgPGI+c2hvcnQ8L2I+LCA4LjMgcGF0aCwgc3VjaCBhcyBDOlxBbnQuIDwvaT4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZCB3aWR0aD0iNSUiPiZuYnNwOzwvdGQ+CisgIDx0ZD4KKyAgICA8cD5PbiB0aGVzZSBzeXN0ZW1zIHlvdSB3aWxsIGFsc28gbmVlZCB0byBjb25maWd1cmUgbW9yZSBlbnZpcm9ubWVudAorICAgICAgIHNwYWNlIHRvIGNhdGVyIGZvciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgaW4gdGhlIEFudCBsYXVjaCBzY3JpcHQuCisgICAgICAgVG8gZG8gdGhpcywgeW91IHdpbGwgbmVlZCB0byBhZGQgb3IgdXBkYXRlIHRoZSBmb2xsb3dpbmcgbGluZSBpbgorICAgICAgIHRoZSA8Y29kZT5jb25maWcuc3lzPC9jb2RlPiBmaWxlCisgICAgPC9wPgorICAgIDxwPjxjb2RlPnNoZWxsPWM6XGNvbW1hbmQuY29tIGM6XCAvcCAvZTozMjc2ODwvY29kZT48L3A+CisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworPGgzPlNldHVwPC9oMz4KKzxwPgorQmVmb3JlIHlvdSBjYW4gcnVuIEFudCB0aGVyZSBpcyBzb21lIGFkZGl0aW9uYWwgc2V0IHVwIHlvdQord2lsbCBuZWVkIHRvIGRvIHVubGVzcyB5b3UgYXJlIGluc3RhbGxpbmcgdGhlIDxhIGhyZWY9IiNqcGFja2FnZSI+UlBNCit2ZXJzaW9uIGZyb20ganBhY2thZ2Uub3JnPC9hPjo8L3A+Cis8dWw+Cis8bGk+QWRkIHRoZSA8Y29kZT5iaW48L2NvZGU+IGRpcmVjdG9yeSB0byB5b3VyIHBhdGguPC9saT4KKzxsaT5TZXQgdGhlIDxjb2RlPkFOVF9IT01FPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUKK2RpcmVjdG9yeSB3aGVyZSB5b3UgaW5zdGFsbGVkIEFudC4gIE9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIEFudCdzCitzdGFydHVwIHNjcmlwdHMgY2FuIGd1ZXNzIDxjb2RlPkFOVF9IT01FPC9jb2RlPiAoVW5peCBkaWFsZWN0cyBhbmQKK1dpbmRvd3MgTlQvMjAwMCksIGJ1dCBpdCBpcyBiZXR0ZXIgdG8gbm90IHJlbHkgb24gdGhpcyBiZWhhdmlvci48L2xpPgorPGxpPk9wdGlvbmFsbHksIHNldCB0aGUgPGNvZGU+SkFWQV9IT01FPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZQorKHNlZSB0aGUgPGEgaHJlZj0iI2FkdmFuY2VkIj5BZHZhbmNlZDwvYT4gc2VjdGlvbiBiZWxvdykuCitUaGlzIHNob3VsZCBiZSBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3VyIEpESyBpcyBpbnN0YWxsZWQuPC9saT4KKzwvdWw+Cis8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IERvIG5vdCBpbnN0YWxsIEFudCdzIGFudC5qYXIgZmlsZSBpbnRvIHRoZSBsaWIvZXh0CitkaXJlY3Rvcnkgb2YgdGhlIEpESy9KUkUuIEFudCBpcyBhbiBhcHBsaWNhdGlvbiwgd2hpbHN0IHRoZSBleHRlbnNpb24KK2RpcmVjdG9yeSBpcyBpbnRlbmRlZCBmb3IgSkRLIGV4dGVuc2lvbnMuIEluIHBhcnRpY3VsYXIgdGhlcmUgYXJlIHNlY3VyaXR5CityZXN0cmljdGlvbnMgb24gdGhlIGNsYXNzZXMgd2hpY2ggbWF5IGJlIGxvYWRlZCBieSBhbiBleHRlbnNpb24uPC9wPgorCis8dGFibGUgd2lkdGg9IjgwJSI+Cis8dHI+CisgIDx0ZCBjb2xzcGFuPSIyIj4KKyAgICA8Yj5XaW5kb3dzIE5vdGU6PC9iPgorICA8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIHdpZHRoPSI1JSI+Jm5ic3A7PC90ZD4KKyAgPHRkPgorICAgIFRoZSBhbnQuYmF0IHNjcmlwdCBtYWtlcyB1c2Ugb2YgdGhyZWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIC0KKyAgICBBTlRfSE9NRSwgQ0xBU1NQQVRIIGFuZCBKQVZBX0hPTUUuIDxiPkVuc3VyZTwvYj4gdGhhdCBBTlRfSE9NRSBhbmQgSkFWQV9IT01FIHZhcmlhYmxlcyBhcmUgc2V0LCAKKyAgICBhbmQgdGhhdCB0aGV5IGRvIDxiPjx1Pm5vdDwvdT48L2I+IGhhdmUgcXVvdGVzIChlaXRoZXIKKyAgICAnIG9yICZxdW90OykgYW5kIHRoZXkgZG8gPGI+PHU+bm90PC91PjwvYj4gZW5kIHdpdGggXCBvciB3aXRoIC8uIENMQVNTUEFUSCBzaG91bGQgYmUgdW5zZXQgb3IgCisgICAgZW1wdHkuCisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworPGgzPjxhIG5hbWU9ImNoZWNrSW5zdGFsbGF0aW9uIj5DaGVjayBJbnN0YWxsYXRpb248L2E+PC9oMz4KKzxwPllvdSBjYW4gY2hlY2sgdGhlIGJhc2ljIGluc3RhbGxhdGlvbiB3aXRoIG9wZW5pbmcgYSBuZXcgc2hlbGwgYW5kIHR5cGluZyA8dHQ+YW50PC90dD4uIFlvdQorc2hvdWxkIGdldCBhIG1lc3NhZ2UgbGlrZSB0aGlzCis8cHJlPgorQnVpbGRmaWxlOiBidWlsZC54bWwgZG9lcyBub3QgZXhpc3QhCitCdWlsZCBmYWlsZWQKKzwvcHJlPgorU28gQW50IHdvcmtzLiBUaGlzIG1lc3NhZ2UgaXMgdGhlcmUgYmVjYXVzZSB5b3UgbmVlZCB0byB3cml0ZSBhbiBpbmRpdmlkdWFsIGJ1aWxkZmlsZSBmb3IgeW91ciAKK3Byb2plY3QuIFdpdGggYSA8dHQ+YW50IC12ZXJzaW9uPC90dD4geW91IHNob3VsZCBnZXQgYW4gb3V0cHV0IGxpa2UKKzxwcmU+CitBcGFjaGUgQW50IHZlcnNpb24gMS43LjAgY29tcGlsZWQgb24gRGVjZW1iZXIgMTMgMjAwNgorPC9wcmU+IAorCisKKzwvcD4KKworPGgzPjxhIG5hbWU9Im9wdGlvbmFsVGFza3MiPk9wdGlvbmFsIFRhc2tzPC9hPjwvaDM+Cis8cD5BbnQgc3VwcG9ydHMgYSBudW1iZXIgb2Ygb3B0aW9uYWwgdGFza3MuIEFuIG9wdGlvbmFsIHRhc2sgaXMgYSB0YXNrIHdoaWNoCit0eXBpY2FsbHkgcmVxdWlyZXMgYW4gZXh0ZXJuYWwgbGlicmFyeSB0byBmdW5jdGlvbi4gVGhlIG9wdGlvbmFsIHRhc2tzIGFyZQorcGFja2FnZWQgdG9nZXRoZXIgd2l0aCB0aGUgY29yZSBBbnQgdGFza3MuPC9wPgorCis8cD5UaGUgZXh0ZXJuYWwgbGlicmFyaWVzIHJlcXVpcmVkIGJ5IGVhY2ggb2YgdGhlIG9wdGlvbmFsIHRhc2tzIGlzIGRldGFpbGVkCitpbiB0aGUgPGEgaHJlZj0iI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBzZWN0aW9uLiBUaGVzZSBleHRlcm5hbAorbGlicmFyaWVzIG11c3QgYmUgYWRkZWQgdG8gQW50J3MgY2xhc3NwYXRoLCBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyB3YXlzOgorPC9wPgorPHVsPgorICAgIDxsaT48cD4KKyAgICAgICAgSW4gPGNvZGU+PGk+QU5UX0hPTUU8L2k+L2xpYjwvY29kZT4uIFRoaXMgbWFrZXMgdGhlIEpBUiBmaWxlcyBhdmFpbGFibGUgdG8gYWxsCisgICAgICAgIEFudCB1c2VycyBhbmQgYnVpbGRzLgorICAgIDwvcD48L2xpPgorCisgICAgPGxpPjxwPgorICAgICAgICBJbiA8Y29kZT4ke3VzZXIuaG9tZX0vLmFudC9saWI8L2NvZGU+IChhcyBvZiBBbnQgMS42KS4gVGhpcworICAgICAgICBhbGxvd3MgZGlmZmVyZW50IHVzZXJzIHRvIGFkZCBuZXcgbGlicmFyaWVzIHRvIEFudC4gQWxsIEpBUiBmaWxlcworICAgICAgICBhZGRlZCB0byB0aGlzIGRpcmVjdG9yeSBhcmUgYXZhaWxhYmxlIHRvIGNvbW1hbmQtbGluZSBBbnQuCisgICAgPC9wPjwvbGk+CisKKyAgICA8bGk+PHA+CisgICAgICAgIE9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCBhIDxjb2RlPi1saWI8L2NvZGU+IHBhcmFtZXRlci4gVGhpcyBsZXRzCisgICAgICAgIHlvdSBhZGQgbmV3IEpBUiBmaWxlcyBvbiBhIGNhc2UtYnktY2FzZSBiYXNpcy4KKyAgICA8L3A+PC9saT4KKworICAgIDxsaT48cD4KKyAgICAgICAgSW4gdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuIEF2b2lkIHRoaXM7IGl0IG1ha2VzCisgICAgICAgIHRoZSBKQVIgZmlsZXMgdmlzaWJsZSB0byA8aT5hbGw8L2k+IEphdmEgYXBwbGljYXRpb25zLCBhbmQgY2F1c2VzCisgICAgICAgIG5vIGVuZCBvZiBzdXBwb3J0IGNhbGxzLiBTZWUgPGEgaHJlZj0iI2NsYXNzcGF0aCI+YmVsb3c8L2E+IGZvciBkZXRhaWxzLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKworICAgIDxsaT48cD4KKyAgICAgICAgSW4gc29tZSA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gYWNjZXB0ZWQgYnkgdGhlIHRhc2sgaXRzZWxmLgorICAgICAgICBGb3IgZXhhbXBsZSwgYXMgb2YgQW50IDEuNy4wIHlvdSBjYW4gcnVuIHRoZSA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPgorICAgICAgICB0YXNrIHdpdGhvdXQgPGNvZGU+anVuaXQuamFyPC9jb2RlPiBpbiBBbnQncyBvd24gY2xhc3NwYXRoLCBzbyBsb25nIGFzCisgICAgICAgIGl0IGlzIGluY2x1ZGVkIChhbG9uZyB3aXRoIHlvdXIgcHJvZ3JhbSBhbmQgdGVzdHMpIGluIHRoZSBjbGFzc3BhdGgKKyAgICAgICAgcGFzc2VkIHdoZW4gcnVubmluZyB0aGUgdGFzay4KKyAgICAgICAgPC9wPjxwPgorICAgICAgICBXaGVyZSBwb3NzaWJsZSwgdGhpcyBvcHRpb24gaXMgZ2VuZXJhbGx5CisgICAgICAgIHRvIGJlIHByZWZlcnJlZCwgYXMgdGhlIEFudCBzY3JpcHQgaXRzZWxmIGNhbiBkZXRlcm1pbmUgdGhlIGJlc3QgcGF0aAorICAgICAgICB0byBsb2FkIHRoZSBsaWJyYXJ5IGZyb206IHZpYSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGJhc2VkaXIgKGlmIHlvdQorICAgICAgICBrZWVwIHRoZSBsaWJyYXJ5IHVuZGVyIHZlcnNpb24gY29udHJvbCB3aXRoIHlvdXIgcHJvamVjdCksIGFjY29yZGluZworICAgICAgICB0byBBbnQgcHJvcGVydGllcywgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBJdnkgZG93bmxvYWRzLCB3aGF0ZXZlciB5b3UgbGlrZS4KKyAgICA8L3A+PC9saT4KKworPC91bD4KKworPHA+CisgICAgSURFcyBoYXZlIGRpZmZlcmVudCB3YXlzIG9mIGFkZGluZyBleHRlcm5hbCBKQVIgZmlsZXMgYW5kIHRoaXJkLXBhcnR5IHRhc2tzCisgICAgdG8gQW50LiBVc3VhbGx5IGl0IGlzIGRvbmUgYnkgc29tZSBjb25maWd1cmF0aW9uIGRpYWxvZy4gU29tZXRpbWVzIEpBUiBmaWxlcworICAgIGFkZGVkIHRvIGEgcHJvamVjdCBhcmUgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbnQncyBjbGFzc3BhdGguCis8L3A+CisKKzxoMz48YSBuYW1lPSJjbGFzc3BhdGgiPlRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlPC9hPjwvaDM+Cis8cD4KKworVGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgYSBzb3VyY2Ugb2YgbWFueSBBbnQgc3VwcG9ydCBxdWVyaWVzLiBBcwordGhlIHJvdW5kIHRyaXAgdGltZSBmb3IgZGlhZ25vc2lzIG9uIHRoZSBBbnQgdXNlciBtYWlsaW5nIGxpc3QgY2FuIGJlIHNsb3csIGFuZAorYmVjYXVzZSBmaWxpbmcgYnVnIHJlcG9ydHMgY29tcGxhaW5pbmcgYWJvdXQgJ2FudC5iYXQnIG5vdCB3b3JraW5nIHdpbGwgYmUKK3JlamVjdGVkIGJ5IHRoZSBkZXZlbG9wZXJzIGFzIFdPUktTRk9STUUgInRoaXMgaXMgYSBjb25maWd1cmF0aW9uIHByb2JsZW0sIG5vdCBhCitidWciLCB5b3UgY2FuIHNhdmUgeW91cnNlbGYgYSBsb3Qgb2YgdGltZSBhbmQgZnJ1c3RyYXRpb24gYnkgZm9sbG93aW5nIHNvbWUKK3NpbXBsZSBzdGVwcy4KKworPC9wPgorPG9sPgorCis8bGk+RG8gbm90IGV2ZXIgc2V0IDxjb2RlPkNMQVNTUEFUSDwvY29kZT4uIEFudCBkb2VzIG5vdCBuZWVkIGl0LCBpdCBvbmx5IGNhdXNlcyBjb25mdXNpb24KK2FuZCBicmVha3MgdGhpbmdzLgorCis8L2xpPgorCis8bGk+SWYgeW91IGlnbm9yZSB0aGUgcHJldmlvdXMgcnVsZSwgZG8gbm90IGV2ZXIsIGV2ZXIsIHB1dCBxdW90ZXMgaW4gdGhlCis8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LCBldmVuIGlmIHRoZXJlIGlzIGEgc3BhY2UgaW4gYSBkaXJlY3RvcnkuIFRoaXMgd2lsbCBicmVhayBBbnQsIGFuZCBpdAoraXMgbm90IG5lZWRlZC4gPC9saT4KKworPGxpPklmIHlvdSBpZ25vcmUgdGhlIGZpcnN0IHJ1bGUsIGRvIG5vdCBldmVyLCBldmVyLCBoYXZlIGEgdHJhaWxpbmcgYmFja3NsYXNoCitpbiBhIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4sIGFzIGl0IGJyZWFrcyBBbnQncyBhYmlsaXR5IHRvIHF1b3RlIHRoZSBzdHJpbmcuIEFnYWluLCB0aGlzIGlzCitub3QgbmVlZGVkIGZvciB0aGUgY29ycmVjdCBvcGVyYXRpb24gb2YgdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUsIGV2ZW4KK2lmIGEgRE9TIGRpcmVjdG9yeSBpcyB0byBiZSBhZGRlZCB0byB0aGUgcGF0aC4gPC9saT4KKworPGxpPllvdSBjYW4gc3RvcCBBbnQgdXNpbmcgdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgYnkgc2V0dGluZyB0aGUKKzxjb2RlPi1ub2NsYXNzcGF0aDwvY29kZT4gb3B0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgaXMgYW4gZWFzeSB3YXkKK3RvIHRlc3QgZm9yIGNsYXNzcGF0aC1yZWxhdGVkIHByb2JsZW1zLjwvbGk+CisKKzwvb2w+CisKKzxwPgorCitUaGUgdXN1YWwgc3ltcHRvbSBvZiA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IHByb2JsZW1zIGlzIHRoYXQgYW50IHdpbGwgbm90IHJ1biB3aXRoIHNvbWUgZXJyb3IKK2Fib3V0IG5vdCBiZWluZyBhYmxlIHRvIGZpbmQgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyPC9jb2RlPiwgb3IsIGlmIHlvdSBoYXZlIGdvdCB0aGUKK3F1b3Rlcy9iYWNrc2xhc2hlcyB3cm9uZywgc29tZSB2ZXJ5IHdlaXJkIEphdmEgc3RhcnR1cCBlcnJvci4gVG8gc2VlIGlmIHRoaXMgaXMKK3RoZSBjYXNlLCBydW4gPGNvZGU+YW50IC1ub2NsYXNzcGF0aDwvY29kZT4gb3IgdW5zZXQgdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQKK3ZhcmlhYmxlLgorCis8L3A+CisKKzxwPgorWW91IGNhbiBhbHNvIG1ha2UgeW91ciBBbnQgc2NyaXB0IHJlamVjdCB0aGlzIGVudmlyb25tZW50Cit2YXJpYWJsZSBqdXN0IGJ5IHBsYWNpbmcgdGhlIGZvbGxvd2luZyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JpcHQgKG9yIGluIGFuIGluaXQgdGFyZ2V0KToKKzwvcD4KKzxwcmU+CismbHQ7cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudi4iLyZndDsKKyZsdDtwcm9wZXJ0eSBuYW1lPSJlbnYuQ0xBU1NQQVRIIiB2YWx1ZT0iIi8mZ3Q7CismbHQ7ZmFpbCBtZXNzYWdlPSJVbnNldCAkQ0xBU1NQQVRIIC8gJUNMQVNTUEFUSCUgYmVmb3JlIHJ1bm5pbmcgQW50ISImZ3Q7CisgICAgJmx0O2NvbmRpdGlvbiZndDsKKyAgICAgICAgJmx0O25vdCZndDsKKyAgICAgICAgICAgICZsdDtlcXVhbHMgYXJnMT0iJHtlbnYuQ0xBU1NQQVRIfSIgYXJnMj0iIi8mZ3Q7CisgICAgICAgICZsdDsvbm90Jmd0OworICAgICZsdDsvY29uZGl0aW9uJmd0OworJmx0Oy9mYWlsJmd0OworPC9wcmU+CisKKzxoMz48YSBuYW1lPSJwcm94eSI+UHJveHkgQ29uZmlndXJhdGlvbjwvYT48L2gzPgorCis8cD4gTWFueSBBbnQgYnVpbHQtaW4gYW5kIHRoaXJkLXBhcnR5IHRhc2tzIHVzZSBuZXR3b3JrIGNvbm5lY3Rpb25zIHRvIHJldHJpZXZlCitmaWxlcyBmcm9tIEhUVFAgc2VydmVycy4gSWYgeW91IGFyZSBiZWhpbmQgYSBmaXJld2FsbCB3aXRoIGEgcHJveHkgc2VydmVyLCB0aGVuCitBbnQgbmVlZHMgdG8gYmUgY29uZmlndXJlZCB3aXRoIHRoZSBwcm94eS4gSGVyZSBhcmUgdGhlIGRpZmZlcmVudCB3YXlzIHRvIGRvCit0aGlzLiA8L3A+CisKKzx1bD4KKworPGxpPjxiPldpdGggSmF2YTEuNTwvYj48YnI+CisKK1doZW4geW91IHJ1biBBbnQgb24gSmF2YTEuNSwgeW91IGNvdWxkIHRyeSB0byB1c2UgdGhlIGF1dG9tYXRpYyBwcm94eSBzZXR1cAorbWVjaGFuaXNtIHdpdGggPGNvZGU+LWF1dG9wcm94eTwvY29kZT4uIAorCis8L2xpPgorCis8bGk+PGI+V2l0aCBleHBsaWNpdCBKVk0gcHJvcGVydGllcy48L2I+PGJyPgorCitUaGVzZSBhcmUgZG9jdW1lbnRlZCA8YQoraHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvbmV0L3Byb3BlcnRpZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj5ieSBTdW48L2E+LAorYW5kIGNvbnRyb2wgdGhlIHByb3h5IGJlaGF2aW91ciBvZiB0aGUgZW50aXJlIEpWTS4gVG8gc2V0IHRoZW0gaW4gQW50LCBkZWNsYXJlCit0aGVtIGluIHRoZSA8Y29kZT5BTlRfT1BUUzwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoaXMgaXMgdGhlIGJlc3Qgb3B0aW9uCitmb3IgYSBub24tbW9iaWxlIHN5c3RlbS4gRm9yIGEgbGFwdG9wLCB5b3UgaGF2ZSB0byBjaGFuZ2UgdGhlc2Ugc2V0dGluZ3MgYXMgeW91Cityb2FtLgorCis8L2xpPgorCis8bGk+PGI+SW4gdGhlIGJ1aWxkIGZpbGUgaXRzZWxmPC9iPjxicj4KKworSWYgeW91IGFyZSB3cml0aW5nIGFuIGJ1aWxkIGZpbGUgdGhhdCBpcyBhbHdheXMgdG8gYmUgdXNlZCBiZWhpbmQgdGhlIGZpcmV3YWxsLAordGhlICZsdDtzZXRwcm94eSZndDsgdGFzayBsZXRzIHlvdSBjb25maWd1cmUgdGhlIHByb3h5ICh3aGljaCBpdCBkb2VzIGJ5IHNldHRpbmcKK3RoZSBKVk0gcHJvcGVydGllcykuIElmIHlvdSBkbyB0aGlzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdXNpbmcgYW50IHByb3BlcnRpZXMKK3RvIGRlZmluZSB0aGUgcHJveHkgaG9zdCwgcG9ydCwgZXRjLCBzbyB0aGF0IGluZGl2aWR1YWxzIGNhbiBvdmVycmlkZSB0aGUKK2RlZmF1bHRzLjwvbGk+CisKKzwvdWw+CisKKzxwPiBUaGUgQW50IHRlYW0gYWNrbm93bGVkZ2VzIHRoYXQgdGhpcyBpcyB1bnNhdGlzZmFjdG9yeS4gVW50aWwgdGhlIEpWTQorYXV0b21hdGljIHByb3h5IHNldHVwIHdvcmtzIHByb3Blcmx5IGV2ZXJ5d2hlcmUsIGV4cGxpY2l0IEpWTSBvcHRpb25zIHZpYQorQU5UX0FSR1MgYXJlIHByb2JhYmx5IHRoZSBiZXN0IHNvbHV0aW9uLiBTZXR0aW5nIHByb3BlcnRpZXMgb24gQW50J3MKK2NvbW1hbmQgbGluZSBkbyBub3Qgd29yaywgYmVjYXVzZSB0aG9zZSBhcmUgPGk+QW50IHByb3BlcnRpZXM8L2k+IGJlaW5nIHNldCwgbm90CitKVk0gb3B0aW9ucy4gVGhpcyBtZWFucyB0aGUgZm9sbG93aW5nIGRvZXMgbm90IHNldCB1cCB0aGUgY29tbWFuZCBsaW5lOgorCis8L3A+CisKKzxwcmU+YW50IC1EaHR0cC5wcm94eUhvc3Q9cHJveHkgLURodHRwLnByb3h5UG9ydD04MTwvcHJlPgorCis8cD4gQWxsIGl0IGRvZXMgaXMgc2V0IHVwIHR3byBBbnQgcHJvcGVydGllcy48L3A+CisKKzxwPk9uZSBvdGhlciB0cm91Ymxlc3BvdCB3aXRoCitwcm94aWVzIGlzIHdpdGggYXV0aGVudGljYXRpbmcgcHJveGllcy4gQW50IGNhbm5vdCBnbyBiZXlvbmQgd2hhdCB0aGUgSlZNIGRvZXMKK2hlcmUsIGFuZCBhcyBpdCBpcyB2ZXJ5IGhhcmQgdG8gcmVtb3RlbHkgZGlhZ25vc2UsIHRlc3QgYW5kIGZpeCBwcm94eS1yZWxhdGVkCitwcm9ibGVtcywgdXNlcnMgd2hvIHdvcmsgYmVoaW5kIGEgc2VjdXJlIHByb3h5IHdpbGwgaGF2ZSB0byBzcGVuZCBtdWNoIHRpbWUKK2NvbmZpZ3VyaW5nIHRoZSBKVk0gcHJvcGVydGllcyB1bnRpbCB0aGV5IGFyZSBoYXBweS4gPC9wPgorCisKKzxoMz48YSBuYW1lPSJ3aW5kb3dzIj5XaW5kb3dzIGFuZCBPUy8yPC9hPjwvaDM+Cis8cD5Bc3N1bWUgQW50IGlzIGluc3RhbGxlZCBpbiA8Y29kZT5jOlxhbnRcPC9jb2RlPi4gVGhlIGZvbGxvd2luZyBzZXRzIHVwIHRoZQorZW52aXJvbm1lbnQ6PC9wPgorPHByZT5zZXQgQU5UX0hPTUU9YzpcYW50CitzZXQgSkFWQV9IT01FPWM6XGpkay0xLjUuMC4wNQorc2V0IFBBVEg9JVBBVEglOyVBTlRfSE9NRSVcYmluPC9wcmU+CisKKzxoMz5MaW51eC9Vbml4IChiYXNoKTwvaDM+Cis8cD5Bc3N1bWUgQW50IGlzIGluc3RhbGxlZCBpbiA8Y29kZT4vdXNyL2xvY2FsL2FudDwvY29kZT4uIFRoZSBmb2xsb3dpbmcgc2V0cyB1cAordGhlIGVudmlyb25tZW50OjwvcD4KKzxwcmU+ZXhwb3J0IEFOVF9IT01FPS91c3IvbG9jYWwvYW50CitleHBvcnQgSkFWQV9IT01FPS91c3IvbG9jYWwvamRrLTEuNS4wLjA1CitleHBvcnQgUEFUSD0ke1BBVEh9OiR7QU5UX0hPTUV9L2JpbjwvcHJlPgorCis8aDM+TGludXgvVW5peCAoY3NoKTwvaDM+Cis8cHJlPnNldGVudiBBTlRfSE9NRSAvdXNyL2xvY2FsL2FudAorc2V0ZW52IEpBVkFfSE9NRSAvdXNyL2xvY2FsL2pkay9qZGstMS41LjAuMDUKK3NldCBwYXRoPSggJHBhdGggJEFOVF9IT01FL2JpbiApPC9wcmU+CisKKzxwPgorSGF2aW5nIGEgc3ltYm9saWMgbGluayBzZXQgdXAgdG8gcG9pbnQgdG8gdGhlIEpWTS9KU0sgdmVyc2lvbiBtYWtlcyB1cGRhdGVzIG1vcmUgc2VhbWxlc3MuIDwvcD4KKzxhIG5hbWU9ImpwYWNrYWdlIj48L2E+Cis8aDM+UlBNIHZlcnNpb24gZnJvbSBqcGFja2FnZS5vcmc8L2gzPgorPHA+CitUaGUgPGEgaHJlZj0iaHR0cDovL3d3dy5qcGFja2FnZS5vcmciIHRhcmdldD0iX3RvcCI+SlBhY2thZ2UgcHJvamVjdDwvYT4gZGlzdHJpYnV0ZXMgYW4gUlBNIHZlcnNpb24gb2YgQW50LgorV2l0aCB0aGlzIHZlcnNpb24sIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gc2V0IDxjb2RlPiBKQVZBX0hPTUUgPC9jb2RlPm9yCis8Y29kZT4gQU5UX0hPTUUgPC9jb2RlPmVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgdGhlIFJQTSBpbnN0YWxsZXIgd2lsbCBjb3JyZWN0bHkKK3BsYWNlIHRoZSBBbnQgZXhlY3V0YWJsZSBvbiB5b3VyIHBhdGguCis8L3A+CisgIDxwPgorICAgIDxiPk5PVEU6PC9iPiA8ZW0+U2luY2UgQW50IDEuNy4wPC9lbT4sIGlmIHRoZSA8Y29kZT5BTlRfSE9NRTwvY29kZT4KKyAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIHRoZSBqcGFja2FnZSBkaXN0cmlidXRpb24gd2lsbCBiZQorICAgIGlnbm9yZWQuCisgIDwvcD4KKyAgPHA+CitPcHRpb25hbCBqYXJzIGZvciB0aGUgSlBhY2thZ2UgdmVyc2lvbiBhcmUgaGFuZGxlZCBpbiB0d28gd2F5cy4gIFRoZSBlYXNpZXN0LCBhbmQKK2Jlc3Qgd2F5IGlzIHRvIGdldCB0aGVzZSBleHRlcm5hbCBsaWJyYXJpZXMgZnJvbSBKUGFja2FnZSBpZiBKUGFja2FnZSBoYXMgdGhlbQorYXZhaWxhYmxlLiAgKE5vdGU6IGZvciBlYWNoIHN1Y2ggbGlicmFyeSwgeW91IHdpbGwgaGF2ZSB0byBnZXQgYm90aCB0aGUgZXh0ZXJuYWwKK3BhY2thZ2UgaXRzZWxmIChlLmcuIDxjb2RlPm9yby0yLjAuOC0yanBwLm5vYXJjaC5ycG08L2NvZGU+KSBhbmQgdGhlIHNtYWxsIGxpYnJhcnkgdGhhdCBsaW5rcworYW50IGFuZCB0aGUgZXh0ZXJuYWwgcGFja2FnZSAoZS5nLiA8Y29kZT5hbnQtYXBhY2hlLW9yby0xLjYuMi0zanBwLm5vYXJjaC5ycG08L2NvZGU+KS4KKzwvcD48cD4KK0hvd2V2ZXIsIEpQYWNrYWdlIGRvZXMgbm90IHBhY2thZ2UgcHJvcHJpZXRhcnkgc29mdHdhcmUsIGFuZCBzaW5jZSBzb21lIG9mIHRoZQorb3B0aW9uYWwgcGFja2FnZXMgZGVwZW5kIG9uIHByb3ByaWV0YXJ5IGphcnMsIHRoZXkgbXVzdCBiZSBoYW5kbGVkIGFzIGZvbGxvd3MuCitUaGlzIG1heSB2aW9sYXRlIHRoZSBzcGlyaXQgb2YgSlBhY2thZ2UsIGJ1dCBpdCBpcyBuZWNlc3NhcnkgaWYgeW91IG5lZWQgdGhlc2UgcHJvcHJpZXRhcnkgcGFja2FnZXMuCitGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2FudCB0byBpbnN0YWxsIHN1cHBvcnQgZm9yIHN0YXJ0ZWFtLCB3aGljaCBqcGFja2FnZSBkb2VzIG5vdAorc3VwcG9ydDoKKzxvbD4KKzxsaT5EZWNpZGUgd2hlcmUgeW91IHdhbnQgdG8gZGVwbG95IHRoZSBleHRyYSBqYXJzLiAgT25lIG9wdGlvbiBpcyBpbiA8Y29kZT4kQU5UX0hPTUUvbGliPC9jb2RlPiwKK3doaWNoLCBmb3IgSlBhY2thZ2UgaXMgdXN1YWxseSA8Y29kZT4vdXNyL3NoYXJlL2FudC9saWI8L2NvZGU+LiAgQW5vdGhlciwgbGVzcyBtZXNzeSBvcHRpb24KK2lzIHRvIGNyZWF0ZSBhbiA8Y29kZT4uYW50L2xpYjwvY29kZT4gc3ViZGlyZWN0b3J5IG9mIHlvdXIgaG9tZSBkaXJlY3RvcnkgYW5kIHBsYWNlIHlvdXIKK25vbi1qcGFja2FnZSBhbnQgamFycyB0aGVyZSwgdGhlcmVieSBhdm9pZGluZyBtaXhpbmcganBhY2thZ2UKK2xpYnJhcmllcyB3aXRoIG5vbi1qcGFjYWtnZSBzdHVmZiBpbiB0aGUgc2FtZSBmb2xkZXIuCitNb3JlIGluZm9ybWF0aW9uIG9uIHdoZXJlIEFudCBmaW5kcyBpdHMgbGlicmFyaWVzIGlzIGF2YWlsYWJsZQorPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9ydW5uaW5nLmh0bWwjbGlicyI+aGVyZTwvYT48L2xpPgorPGxpPkRvd25sb2FkIGEgbm9uLWpwYWNrYWdlIGJpbmFyeSBkaXN0cmlidXRpb24gZnJvbSB0aGUgcmVndWxhcgorICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiIHRhcmdldD0iX3RvcCI+QXBhY2hlIEFudCBzaXRlPC9hPjwvbGk+Cis8bGk+VW56aXAgb3IgdW50YXIgdGhlIGRpc3RyaWJ1dGlvbiBpbnRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeTwvbGk+Cis8bGk+Q29weSB0aGUgbGlua2luZyBqYXIsIGluIHRoaXMgY2FzZSA8Y29kZT5hbnQtc3RhcnRlYW0uamFyPC9jb2RlPiwgaW50byB0aGUgbGlicmFyeSBkaXJlY3RvcnkgeW91CitjaG9zZSBpbiBzdGVwIDEgYWJvdmUuPC9saT4KKzxsaT5Db3B5IHRoZSBwcm9wcmlldGFyeSBqYXIgaXRzZWxmIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5LjwvbGk+Cis8L29sPgorRmluYWxseSwgaWYgZm9yIHNvbWUgcmVhc29uIHlvdSBhcmUgcnVubmluZyBvbiBhIHN5c3RlbSB3aXRoIGJvdGggdGhlIEpQYWNrYWdlIGFuZCBBcGFjaGUgdmVyc2lvbnMgb2YgQW50CithdmFpbGFibGUsIGlmIHlvdSBzaG91bGQgd2FudCB0byBydW4gdGhlIEFwYWNoZSB2ZXJzaW9uICh3aGljaCB3aWxsIGhhdmUgdG8gYmUgc3BlY2lmaWVkIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lLAorbm90IGZvdW5kIG9uIHRoZSBwYXRoKSwgeW91IHNob3VsZCB1c2UgQW50J3MgPGNvZGU+LS1ub2NvbmZpZzwvY29kZT4gY29tbWFuZC1saW5lIHN3aXRjaCB0byBhdm9pZCBKUGFja2FnZSdzIGNsYXNzcGF0aCBtZWNoYW5pc20uCisKKworPGgzPjxhIG5hbWU9ImFkdmFuY2VkIj5BZHZhbmNlZDwvYT48L2gzPgorCis8cD5UaGVyZSBhcmUgbG90cyBvZiB2YXJpYW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJ1biBBbnQuIFdoYXQgeW91IG5lZWQgaXMgYXQKK2xlYXN0IHRoZSBmb2xsb3dpbmc6PC9wPgorPHVsPgorPGxpPlRoZSBjbGFzc3BhdGggZm9yIEFudCBtdXN0IGNvbnRhaW4gPGNvZGU+YW50LmphcjwvY29kZT4gYW5kIGFueSBqYXJzL2NsYXNzZXMKK25lZWRlZCBmb3IgeW91ciBjaG9zZW4gSkFYUC1jb21wbGlhbnQgWE1MIHBhcnNlci48L2xpPgorPGxpPldoZW4geW91IG5lZWQgSkRLIGZ1bmN0aW9uYWxpdHkKKyhzdWNoIGFzIGZvciB0aGUgPGEgaHJlZj0iQ29yZVRhc2tzL2phdmFjLmh0bWwiPmphdmFjPC9hPiB0YXNrIG9yIHRoZQorPGEgaHJlZj0iQ29yZVRhc2tzL3JtaWMuaHRtbCI+cm1pYzwvYT4gdGFzayksIHRoZW4gPGNvZGU+dG9vbHMuamFyPC9jb2RlPgorbXVzdCBiZSBhZGRlZC4gVGhlIHNjcmlwdHMgc3VwcGxpZWQgd2l0aCBBbnQsCitpbiB0aGUgPGNvZGU+YmluPC9jb2RlPiBkaXJlY3RvcnksIHdpbGwgYWRkCit0aGUgcmVxdWlyZWQgSkRLIGNsYXNzZXMgYXV0b21hdGljYWxseSwgaWYgdGhlIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4KK2Vudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC48L2xpPgorCis8bGk+V2hlbiB5b3UgYXJlIGV4ZWN1dGluZyBwbGF0Zm9ybS1zcGVjaWZpYyBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMgdGhlCis8YSBocmVmPSJDb3JlVGFza3MvZXhlYy5odG1sIj5leGVjPC9hPiB0YXNrIG9yIHRoZQorPGEgaHJlZj0iQ29yZVRhc2tzL2N2cy5odG1sIj5jdnM8L2E+IHRhc2ssIHRoZSBwcm9wZXJ0eSA8Y29kZT5hbnQuaG9tZTwvY29kZT4KK211c3QgYmUgc2V0IHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB3aGVyZSB5b3UgaW5zdGFsbGVkIEFudC4gQWdhaW4KK3RoaXMgaXMgc2V0IGJ5IHRoZSBBbnQgc2NyaXB0cyB0byB0aGUgdmFsdWUgb2YgdGhlIEFOVF9IT01FIGVudmlyb25tZW50Cit2YXJpYWJsZS48L2xpPgorPC91bD4KK1RoZSBzdXBwbGllZCBhbnQgc2hlbGwgc2NyaXB0cyBhbGwgc3VwcG9ydCBhbiA8dHQ+QU5UX09QVFM8L3R0PgorZW52aXJvbm1lbnQgdmFyaWFibGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3VwcGx5IGV4dHJhIG9wdGlvbnMKK3RvIGFudC4gU29tZSBvZiB0aGUgc2NyaXB0cyBhbHNvIHJlYWQgaW4gYW4gZXh0cmEgc2NyaXB0IHN0b3JlZAoraW4gdGhlIHVzZXJzIGhvbWUgZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgdXNlZCB0byBzZXQgc3VjaCBvcHRpb25zLiBMb29rCithdCB0aGUgc291cmNlIGZvciB5b3VyIHBsYXRmb3JtJ3MgaW52b2NhdGlvbiBzY3JpcHQgZm9yIGRldGFpbHMuCisKKzxocj4KKzxoMj48YSBuYW1lPSJidWlsZGluZ2FudCI+QnVpbGRpbmcgQW50PC9hPjwvaDI+Cis8cD5UbyBidWlsZCBBbnQgZnJvbSBzb3VyY2UsIHlvdSBjYW4gZWl0aGVyIGluc3RhbGwgdGhlIEFudCBzb3VyY2UgZGlzdHJpYnV0aW9uCitvciBjaGVja291dCB0aGUgYW50IG1vZHVsZSBmcm9tIFNWTi48L3A+Cis8cD5PbmNlIHlvdSBoYXZlIGluc3RhbGxlZCB0aGUgc291cmNlLCBjaGFuZ2UgaW50byB0aGUgaW5zdGFsbGF0aW9uCitkaXJlY3RvcnkuPC9wPgorCis8cD5TZXQgdGhlIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUKK3RvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIEpESyBpcyBpbnN0YWxsZWQuCitTZWUgPGEgaHJlZj0iI2luc3RhbGxpbmciPkluc3RhbGxpbmcgQW50PC9hPgorZm9yIGV4YW1wbGVzIG9uIGhvdyB0byBkbyB0aGlzIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uIDwvcD4KKworPHA+PGI+Tm90ZTwvYj46IFRoZSBib290c3RyYXAgcHJvY2VzcyBvZiBBbnQgcmVxdWlyZXMgYSBncmVlZHkKK2NvbXBpbGVyIGxpa2UgU3VuJ3MgamF2YWMgb3IgamlrZXMuICBJdCBkb2VzIG5vdCB3b3JrIHdpdGggZ2NqIG9yCitramMuPC9wPgorCis8cD5NYWtlIHN1cmUgeW91IGhhdmUgZG93bmxvYWRlZCBhbnkgYXV4aWxpYXJ5IGphcnMgcmVxdWlyZWQgdG8KK2J1aWxkIHRhc2tzIHlvdSBhcmUgaW50ZXJlc3RlZCBpbi4gVGhlc2Ugc2hvdWxkIGJlCithZGRlZCB0byB0aGUgPGNvZGU+bGliL29wdGlvbmFsPC9jb2RlPgorZGlyZWN0b3J5IG9mIHRoZSBzb3VyY2UgdHJlZS4KK1NlZSA8YSBocmVmPSIjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+Citmb3IgYSBsaXN0IG9mIEpBUiByZXF1aXJlbWVudHMgZm9yIHZhcmlvdXMgZmVhdHVyZXMuCitOb3RlIHRoYXQgdGhpcyB3aWxsIG1ha2UgdGhlIGF1eGlsaWFyeSBKQVIKK2F2YWlsYWJsZSBmb3IgdGhlIGJ1aWxkaW5nIG9mIEFudCBvbmx5LiBGb3IgcnVubmluZyBBbnQgeW91IHdpbGwKK3N0aWxsIG5lZWQgdG8KK21ha2UgdGhlIEpBUnMgYXZhaWxhYmxlIGFzIGRlc2NyaWJlZCB1bmRlcgorPGEgaHJlZj0iI2luc3RhbGxpbmciPkluc3RhbGxpbmcgQW50PC9hPi48L3A+CisKKzxwPllvdXIgYXJlIG5vdyByZWFkeSB0byBidWlsZCBBbnQ6PC9wPgorPGJsb2NrcXVvdGU+CisgIDxwPjxjb2RlPmJ1aWxkIC1EZGlzdC5kaXI9Jmx0OzxpPmRpcmVjdG9yeV90b19jb250YWluX0FudF9kaXN0cmlidXRpb248L2k+Jmd0OyBkaXN0PC9jb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyg8aT5XaW5kb3dzPC9pPik8L3A+CisgIDxwPjxjb2RlPnNoIGJ1aWxkLnNoIC1EZGlzdC5kaXI9Jmx0OzxpPmRpcmVjdG9yeV90b19jb250YWluX0FudF9kaXN0cmlidXRpb248L2k+Jmd0OyBkaXN0PC9jb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyg8aT5Vbml4PC9pPik8L3A+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPlRoaXMgd2lsbCBjcmVhdGUgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIEFudCBpbiB0aGUgZGlyZWN0b3J5IHlvdSBzcGVjaWZpZWQuPC9wPgorCis8cD5UaGUgYWJvdmUgYWN0aW9uIGRvZXMgdGhlIGZvbGxvd2luZzo8L3A+Cis8dWw+CisKKzxsaT5JZiBuZWNlc3NhcnkgaXQgd2lsbCBib290c3RyYXAgdGhlIEFudCBjb2RlLiBCb290c3RyYXBwaW5nIGludm9sdmVzIHRoZSBtYW51YWwKK2NvbXBpbGF0aW9uIG9mIGVub3VnaCBBbnQgY29kZSB0byBiZSBhYmxlIHRvIHJ1biBBbnQuIFRoZSBib290c3RyYXBwZWQgQW50IGlzCit1c2VkIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBidWlsZCBzdGVwcy4gPC9saT4KKworPGxpPkludm9rZXMgdGhlIGJvb3RzdHJhcHBlZCBBbnQgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGJ1aWxkIHNjcmlwdC4gSW4KK3RoaXMgY2FzZSwgdGhlc2UgcGFyYW1ldGVycyBkZWZpbmUgYW4gQW50IHByb3BlcnR5IHZhbHVlIGFuZCBzcGVjaWZ5IHRoZSAmcXVvdDtkaXN0JnF1b3Q7IHRhcmdldAoraW4gQW50J3Mgb3duIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZS48L2xpPgorCis8bGk+Q3JlYXRlIHRoZSBhbnQuamFyIGFuZCBhbnQtbGF1bmNoZXIuamFyIEpBUiBmaWxlczwvbGk+CisKKzxsaT5DcmVhdGUgb3B0aW9uYWwgSkFScyBmb3Igd2hpY2ggdGhlIGJ1aWxkIGhhZCB0aGUgcmVsZXZhbnQgbGlicmFyaWVzLiBJZgorYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaXMgbWlzc2luZyBmcm9tIEFOVF9IT01FL2xpYi9vcHRpb25hbCwgdGhlbiB0aGUgbWF0Y2hpbmcKK2FudC0gSkFSIGZpbGUgd2lsbCBub3QgYmUgY3JlYXRlZC4gRm9yIGV4YW1wbGUsIGFudC1qdW5pdC5qYXIgaXMgb25seSBidWlsdAoraWYgdGhlcmUgaXMgYSBqdW5pdC5qYXIgaW4gdGhlIG9wdGlvbmFsIGRpcmVjdG9yeS48L2xpPgorPC91bD4KKworPHA+T24gbW9zdCBvY2Nhc2lvbnMgeW91IHdpbGwgbm90IG5lZWQgdG8gZXhwbGljaXRseSBib290c3RyYXAgQW50IHNpbmNlIHRoZSBidWlsZAorc2NyaXB0cyBkbyB0aGF0IGZvciB5b3UuIElmIGhvd2V2ZXIsIHRoZSBidWlsZCBmaWxlIHlvdSBhcmUgdXNpbmcgbWFrZXMgdXNlIG9mIGZlYXR1cmVzCitub3QgeWV0IGNvbXBpbGVkIGludG8gdGhlIGJvb3RzdHJhcHBlZCBBbnQsIHlvdSB3aWxsIG5lZWQgdG8gbWFudWFsbHkgYm9vdHN0cmFwLgorUnVuIDxjb2RlPmJvb3RzdHJhcC5iYXQ8L2NvZGU+IChXaW5kb3dzKSBvciA8Y29kZT5ib290c3RyYXAuc2g8L2NvZGU+IChVTklYKQordG8gYnVpbGQgYSBuZXcgYm9vdHN0cmFwIHZlcnNpb24gb2YgQW50LjwvcD4KKworSWYgeW91IHdpc2ggdG8gaW5zdGFsbCB0aGUgYnVpbGQgaW50byB0aGUgY3VycmVudCA8Y29kZT5BTlRfSE9NRTwvY29kZT4KK2RpcmVjdG9yeSwgeW91IGNhbiB1c2U6Cis8YmxvY2txdW90ZT4KKyAgPHA+PGNvZGU+YnVpbGQgaW5zdGFsbDwvY29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsoPGk+V2luZG93czwvaT4pPC9wPgorICA8cD48Y29kZT5zaCBidWlsZC5zaCBpbnN0YWxsPC9jb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyg8aT5Vbml4PC9pPik8L3A+Cis8L2Jsb2NrcXVvdGU+CisKK1lvdSBjYW4gYXZvaWQgdGhlIGxlbmd0aHkgSmF2YWRvYyBzdGVwLCBpZiBkZXNpcmVkLCB3aXRoOgorPGJsb2NrcXVvdGU+CisgIDxwPjxjb2RlPmJ1aWxkIGluc3RhbGwtbGl0ZTwvY29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsoPGk+V2luZG93czwvaT4pPC9wPgorICA8cD48Y29kZT5zaCBidWlsZC5zaCBpbnN0YWxsLWxpdGU8L2NvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KDxpPlVuaXg8L2k+KTwvcD4KKzwvYmxvY2txdW90ZT4KK1RoaXMgd2lsbCBvbmx5IGluc3RhbGwgdGhlIDxjb2RlPmJpbjwvY29kZT4gYW5kIDxjb2RlPmxpYjwvY29kZT4gZGlyZWN0b3JpZXMuCis8cD5Cb3RoIHRoZSA8Y29kZT5pbnN0YWxsPC9jb2RlPiBhbmQKKzxjb2RlPmluc3RhbGwtbGl0ZTwvY29kZT4gdGFyZ2V0cyB3aWxsIG92ZXJ3cml0ZQordGhlIGN1cnJlbnQgQW50IHZlcnNpb24gaW4gPGNvZGU+QU5UX0hPTUU8L2NvZGU+LjwvcD4KKworPGhyPgorPGgyPjxhIG5hbWU9ImxpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPjwvaDI+Cis8cD5UaGUgZm9sbG93aW5nIGxpYnJhcmllcyBhcmUgbmVlZGVkIGluIEFudCdzIGNsYXNzcGF0aAoraWYgeW91IGFyZSB1c2luZyB0aGUKK2luZGljYXRlZCBmZWF0dXJlLiBOb3RlIHRoYXQgb25seSBvbmUgb2YgdGhlIHJlZ2V4cCBsaWJyYXJpZXMgaXMKK25lZWRlZCBmb3IgdXNlIHdpdGggdGhlIG1hcHBlcnMKKyhhbmQgSmF2YSAxLjQgYW5kIGhpZ2hlciBpbmNsdWRlcyBhIHJlZ2V4cCBpbXBsZW1lbnRhdGlvbiB3aGljaAorQW50IHdpbGwgZmluZCBhdXRvbWF0aWNhbGx5KS4KK1lvdSB3aWxsIGFsc28gbmVlZCB0byBpbnN0YWxsIHRoZSBwYXJ0aWN1bGFyCitBbnQgb3B0aW9uYWwgamFyIGNvbnRhaW5pbmcgdGhlIHRhc2sgZGVmaW5pdGlvbnMgdG8gbWFrZSB0aGVzZQordGFza3MgYXZhaWxhYmxlLiBQbGVhc2UgcmVmZXIgdG8gdGhlIDxhIGhyZWY9IiNvcHRpb25hbFRhc2tzIj4KK0luc3RhbGxpbmcgQW50IC8gT3B0aW9uYWwgVGFza3M8L2E+IHNlY3Rpb24gYWJvdmUuPC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHI+CisgICAgPHRkPjxiPkphciBOYW1lPC9iPjwvdGQ+CisgICAgPHRkPjxiPk5lZWRlZCBGb3I8L2I+PC90ZD4KKyAgICA8dGQ+PGI+QXZhaWxhYmxlIEF0PC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+QW4gWFNMIHRyYW5zZm9ybWVyIGxpa2UgWGFsYW48L3RkPgorICAgIDx0ZD5zdHlsZSB0YXNrPC90ZD4KKyAgICA8dGQ+CisgICAgPGI+SWYgeW91IHVzZSBKREsgMS40KywgYW4gWFNMIHRyYW5zZm9ybWVyIGlzIGFscmVhZHkgaW5jbHVkZWQsIHNvIHlvdSBuZWVkIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsLjwvYj48YnI+CisgICAgPHVsPjxsaT5YQUxBTiA6IDxhIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi1qL2luZGV4Lmh0bWwiCisgICAgdGFyZ2V0PSJfdG9wIj5odHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai9pbmRleC5odG1sPC9hPjwvbGk+CisgICAgPC91bD4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmpha2FydGEtcmVnZXhwLTEuMy5qYXI8L3RkPgorICAgIDx0ZD5yZWdleHAgdHlwZSB3aXRoIG1hcHBlcnM8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3JlZ2V4cC8iIHRhcmdldD0iX3RvcCI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+amFrYXJ0YS1vcm8tMi4wLjguamFyPC90ZD4KKyAgICA8dGQ+cmVnZXhwIHR5cGUgd2l0aCBtYXBwZXJzIGFuZCB0aGUgcGVyZm9yY2UgdGFza3M8YnI+CisgICAgVG8gdXNlIHRoZSBGVFAgdGFzaywKK3lvdSBuZWVkIGpha2FydGEtb3JvIDIuMC44IG9yIGxhdGVyLCBhbmQgPGEgaHJlZj0iI2NvbW1vbnMtbmV0Ij5jb21tb25zLW5ldDwvYT48L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL29yby8iIHRhcmdldD0iX3RvcCI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9vcm8vPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+anVuaXQuamFyPC90ZD4KKyAgICA8dGQ+PGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gdGFzay4gTWF5IGJlIGluIGNsYXNzcGF0aCBwYXNzZWQgdG8gdGFzayByYXRoZXIgdGhhbiBBbnQncyBjbGFzc3BhdGguPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qdW5pdC5vcmcvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuanVuaXQub3JnLzwvYT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnhhbGFuLmphcjwvdGQ+CisgICAgPHRkPmp1bml0cmVwb3J0IHRhc2s8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai8iIHRhcmdldD0iX3RvcCI+aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuLWovPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c3R5bGVib29rLmphcjwvdGQ+CisgICAgPHRkPnN0eWxlYm9vayB0YXNrPC90ZD4KKyAgICA8dGQ+U1ZOIHJlcG9zaXRvcnkgb2YgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3N2bi5odG1sIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly94bWwuYXBhY2hlLm9yZy9zdm4uaHRtbDwvYT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmFudGxyLmphcjwvdGQ+CisgICAgPHRkPmFudGxyIHRhc2s8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmFudGxyLm9yZy8iIHRhcmdldD0iX3RvcCI+aHR0cDovL3d3dy5hbnRsci5vcmcvPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+YnNmLmphcjwvdGQ+CisgICAgPHRkPnNjcmlwdCB0YXNrCisgICAgICA8cD4KKyAgICAgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBBbnQgMS42IGFuZCBsYXRlciByZXF1aXJlIEFwYWNoZSBCU0YsIG5vdAorICAgICAgICB0aGUgSUJNIHZlcnNpb24uICBJLmUuIHlvdSBuZWVkIEJTRiAyLjMuMC1yYzEgb3IgbGF0ZXIuCisgICAgICA8L3A+CisgICAgICA8cD4KKyAgICAgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBCU0YgMi40LjAgaXMgbmVlZGVkIHRvIHVzZSBhIHBvc3QgMS41UjMgdmVyc2lvbgorICAgICAgICBvZiByaGlubydzIGphdmFzY3JpcHQuCisgICAgICA8L3A+CisgICAgICA8cD4KKyAgICAgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBCU0YgMi40LjAgdXNlcyBqYWthcmF0YS1jb21tb25zLWxvZ2dpbmcKKyAgICAgICAgc28gaXQgbmVlZHMgdGhlIGNvbW1vbnMtbG9nZ2luZy5qYXIuCisgICAgICA8L3A+CisgICAgICA8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2JzZi8iIHRhcmdldD0iX3RvcCI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YvPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+R3Jvb3Z5IGphcnM8L3RkPgorICAgIDx0ZD5Hcm9vdnkgd2l0aCBzY3JpcHQgYW5kIHNjcmlwdGRlZiB0YXNrczxicj4KKyAgICAgIFlvdSBuZWVkIHRvIGdldCB0aGUgZ3Jvb3Z5IGphciBhbmQgdHdvIGFzbSBqYXJzIGZyb20gYSBncm9vdnkKKyAgICAgIGluc3RhbGxhdGlvbi4gVGhlIGphcnMgYXJlIGdyb292eS1bdmVyc2lvbl0uamFyLCBhc20tW3Zlc2lvbl0uamFyIGFuZAorICAgICAgYXNtLXV0aWwtW3ZlcnNpb25dLmphciBhbmQgYW50bHItW3ZlcnNpb25dLmphci4KKyAgICAgIEFzIG9mIGdyb292eSB2ZXJzaW9uIDEuMC1KU1ItMDYsIHRoZSBqYXJzIGFyZQorICAgICAgZ3Jvb3Z5LTEuMC1KU1ItMDYuamFyLCBhbnRsci0yLjcuNS5qYXIsIGFzbS0yLjIuamFyIGFuZCBhc20tdXRpbC0yLjIuamFyLgorICAgICAgQWx0ZXJuYXRpdmVseSBvbmUgbWF5IHVzZSB0aGUgZW1iZWRkZWQgZ3Jvb3Z5IGphciBmaWxlLgorICAgICAgVGhpcyBpcyBsb2NhdGVkIGluIHRoZSBlbWJlZGRlZCBkaXJlY3Rvcnkgb2YgdGhlIGdyb292eSBkaXN0cmlidXRpb24uCisgICAgICBUaGlzIGJ1bmRsZXMgYWxsIHRoZSBuZWVkZWQgamFyIGZpbGVzIGludG8gb25lIGphciBmaWxlLgorICAgICAgSXQgaXMgY2FsbGVkIGdyb292eS1hbGwtW3ZlcnNpb25dLmphci4KKyAgICA8L3RkPgorICAgIDx0ZD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLyIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy88L2E+CisgICAgICA8YnI+CisgICAgICBUaGUgYXNtIGphcnMgYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gdGhlIGNyZWF0b3JzIG9mIGFzbSAtCisgICAgICA8YSBocmVmPSJodHRwOi8vYXNtLm9iamVjdHdlYi5vcmcvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly9hc20ub2JqZWN0d2ViLm9yZy88L2E+CisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5uZXRyZXh4LmphcjwvdGQ+CisgICAgPHRkPm5ldHJleHggdGFzaywgUmV4eCB3aXRoIHRoZSBzY3JpcHQgdGFzazwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuaWJtLmNvbS9zb2Z0d2FyZS9hd2R0b29scy9uZXRyZXh4L2Rvd25sb2FkLmh0bWwiIHRhcmdldD0iX3RvcCI+CisgICAgICAgIGh0dHA6Ly93d3cuaWJtLmNvbS9zb2Z0d2FyZS9hd2R0b29scy9uZXRyZXh4L2Rvd25sb2FkLmh0bWw8L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5qcy5qYXI8L3RkPgorICAgIDx0ZD5KYXZhc2NyaXB0IHdpdGggc2NyaXB0IHRhc2s8YnI+CisgICAgSWYgeW91IHVzZSBBcGFjaGUgQlNGIDIuMy4wLXJjMSwgeW91IG11c3QgdXNlIHJoaW5vIDEuNVIzIChsYXRlcgorICAgIHZlcnNpb25zIG9mIEJTRiAoZS5nLiB2ZXJzaW9uIDIuNC4wKSB3b3JrIHdpdGggMS41UjQgYW5kIGhpZ2hlcikuPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9yaGluby8iIHRhcmdldD0iX3RvcCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9yaGluby88L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5qeXRob24uamFyPC90ZD4KKyAgICA8dGQ+UHl0aG9uIHdpdGggc2NyaXB0IHRhc2s8YnI+CisgICAgV2FybmluZyA6IGp5dGhvbi5qYXIgYWxzbyBjb250YWlucyBjbGFzc2VzIGZyb20gamFrYXJ0YS1vcm8uCisgICAgUmVtb3ZlIHRoZXNlIGNsYXNzZXMgaWYgeW91IGFyZSBhbHNvIHVzaW5nIGpha2FydGEtb3JvLjwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qeXRob24uc291cmNlZm9yZ2UubmV0LyIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vanl0aG9uLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5qcHl0aG9uLmphcjwvdGQ+CisgICAgPHRkPlB5dGhvbiB3aXRoIHNjcmlwdCB0YXNrIDxiPmRlcHJlY2F0ZWQsIGp5dGhvbiBpcyB0aGUgcHJlZmVyZWQgZW5naW5lPC9iPjwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuanB5dGhvbi5vcmcvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuanB5dGhvbi5vcmcvPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+amFjbC5qYXIgYW5kIHRjbGphdmEuamFyPC90ZD4KKyAgICA8dGQ+VENMIHdpdGggc2NyaXB0IHRhc2s8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnNjcmlwdGljcy5jb20vc29mdHdhcmUvamF2YS8iIHRhcmdldD0iX3RvcCI+aHR0cDovL3d3dy5zY3JpcHRpY3MuY29tL3NvZnR3YXJlL2phdmEvPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+QmVhblNoZWxsIEpBUihzKTwvdGQ+CisgICAgPHRkPkJlYW5TaGVsbCB3aXRoIHNjcmlwdCB0YXNrLgorICAgICAgPGJyPgorICAgIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogQW50IHJlcXVpcmVzIEJlYW5TaGVsbCB2ZXJzaW9uIDEuMyBvcgorICAgICAgbGF0ZXI8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmJlYW5zaGVsbC5vcmcvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuYmVhbnNoZWxsLm9yZy88L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5qcnVieS5qYXI8L3RkPgorICAgIDx0ZD5SdWJ5IHdpdGggc2NyaXB0IHRhc2s8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vanJ1Ynkuc291cmNlZm9yZ2UubmV0LyIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vanJ1Ynkuc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmp1ZG8uamFyPC90ZD4KKyAgICA8dGQ+SnVkb3NjcmlwdCB3aXRoIHNjcmlwdCB0YXNrPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qdWRvc2NyaXB0LmNvbS9pbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuanVkb3NjcmlwdC5jb20vaW5kZXguaHRtbDwvYT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNvbW1vbnMtbG9nZ2luZy5qYXI8L3RkPgorICAgIDx0ZD5Db21tb25zTG9nZ2luZ0xpc3RlbmVyPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2xvZ2dpbmcvaW5kZXguaHRtbCIKKyAgICAgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbG9nZ2luZy9pbmRleC5odG1sPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bG9nNGouamFyPC90ZD4KKyAgICA8dGQ+TG9nNGpMaXN0ZW5lcjwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovZG9jcy9pbmRleC5odG1sIgorICAgICAgICAgICB0YXJnZXQ9Il90b3AiPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvbG9nNGovZG9jcy9pbmRleC5odG1sPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGEgbmFtZT0iY29tbW9ucy1uZXQiPmNvbW1vbnMtbmV0LmphcjwvYT48L3RkPgorICAgIDx0ZD5mdHAsIHJleGVjIGFuZCB0ZWxuZXQgdGFza3M8YnI+CisgICAgamFrYXJ0YS1vcm8gMi4wLjggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgdG9nZXRoZXIgd2l0aCBjb21tb25zLW5ldCAxLjQuMC48YnI+CisgICAgRm9yIGFsbCB1c2VycywgYSBtaW5pbXVtIHZlcnNpb24gb2YgY29tbW9ucy1uZXQgb2YgMS40LjAgaXMgcmVjb21tZW5kZWQuICBFYXJsaWVyCisgICAgdmVyc2lvbnMgZGlkIG5vdCBzdXBwb3J0IHRoZSBmdWxsIHJhbmdlIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYW5kIDEuNC4wIGlzIG5lZWRlZAorICAgIHRvIGNvbXBpbGUgQW50LgorICAgIDwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9uZXQvaW5kZXguaHRtbCIKKyAgICAgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbmV0L2luZGV4Lmh0bWw8L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5iY2VsLmphcjwvdGQ+CisgICAgPHRkPmNsYXNzZmlsZXNldCBkYXRhIHR5cGUsCisgICAgICAgIEphdmFDbGFzc0hlbHBlciB1c2VkIGJ5IHRoZSBDbGFzc0NvbnN0YW50cyBmaWx0ZXIgcmVhZGVyIGFuZAorICAgICAgICBvcHRpb25hbGx5IHVzZWQgYnkgZWpiamFyIGZvciBkZXBlbmRlbmN5IGRldGVybWluYXRpb24KKyAgICA8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2JjZWwvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYmNlbC88L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5tYWlsLmphcjwvdGQ+CisgICAgPHRkPk1haWwgdGFzayB3aXRoIE1pbWUgZW5jb2RpbmcsIGFuZCB0aGUgTWltZU1haWwgdGFzazwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YW1haWwvIgorICAgICAgICB0YXJnZXQ9Il90b3AiPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YW1haWwvPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+anNzZS5qYXI8L3RkPgorICAgIDx0ZD4KK1N1cHBvcnQgZm9yIFNNVFAgb3ZlciBUTFMvU1NMIDxicj4KK2luIHRoZSBNYWlsIHRhc2s8YnI+CitBbHJlYWR5IGluY2x1ZGVkIEphdmEgMS40KzwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNzZS8iCisgICAgICAgIHRhcmdldD0iX3RvcCI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3NlLzwvYT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmFjdGl2YXRpb24uamFyPC90ZD4KKyAgICA8dGQ+TWFpbCB0YXNrIHdpdGggTWltZSBlbmNvZGluZywgYW5kIHRoZSBNaW1lTWFpbCB0YXNrPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhYmVhbnMvZ2xhc2dvdy9qYWYuaHRtbCIKKyAgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFiZWFucy9nbGFzZ293L2phZi5odG1sPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+amRlcGVuZC5qYXI8L3RkPgorICAgIDx0ZD5qZGVwZW5kIHRhc2s8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmNsYXJrd2FyZS5jb20vc29mdHdhcmUvSkRlcGVuZC5odG1sIgorICAgICAgICB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWw8L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5yZXNvbHZlci5qYXIgPGI+MS4xYmV0YSBvciBsYXRlcjwvYj48L3RkPgorICAgIDx0ZD54bWxjYXRhbG9nIGRhdGF0eXBlIDxlbT5vbmx5IGlmIHN1cHBvcnQgZm9yIGV4dGVybmFsIGNhdGFsb2cgZmlsZXMgaXMgZGVzaXJlZDwvZW0+PC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL2NvbW1vbnMvIgorICAgIHRhcmdldD0iX3RvcCI+aHR0cDovL3htbC5hcGFjaGUub3JnL2NvbW1vbnMvPC9hPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmpzY2guamFyIDxiPjAuMS4yOSBvciBsYXRlcjwvYj48L3RkPgorICAgIDx0ZD5zc2hleGVjIGFuZCBzY3AgdGFza3M8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmpjcmFmdC5jb20vanNjaC9pbmRleC5odG1sIgorICAgICAgICB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuamNyYWZ0LmNvbS9qc2NoL2luZGV4Lmh0bWw8L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5KQUkgLSBKYXZhIEFkdmFuY2VkIEltYWdpbmc8L3RkPgorICAgIDx0ZD5pbWFnZSB0YXNrPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhLW1lZGlhL2phaS8iCisgICAgICAgIHRhcmdldD0iX3RvcCI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhLW1lZGlhL2phaS88L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5TdGFydGVhbSBTREs8L3RkPgorICAgIDx0ZD5TdGFydGVhbSB2ZXJzaW9uIG1hbmFnZW1lbnQgdGFza3M8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmJvcmxhbmQuY29tL2Rvd25sb2Fkcy9kb3dubG9hZF9zdGFydGVhbS5odG1sIgorICAgICAgICB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuYm9ybGFuZC5jb20vZG93bmxvYWRzL2Rvd25sb2FkX3N0YXJ0ZWFtLmh0bWw8L2E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8YnI+Cis8aDI+PGEgbmFtZT0iVHJvdWJsZXNob290aW5nIj5Ucm91Ymxlc2hvb3Rpbmc8L2E+PC9oMj4KKworCis8aDM+PGEgbmFtZT0iZGlhZ25vc3RpY3MiPkRpYWdub3N0aWNzPC9hPjwvaDM+CisKKzxwPiBBbnQgaGFzIGEgYnVpbHQgaW4gZGlhZ25vc3RpY3MgZmVhdHVyZS4gSWYgeW91IHJ1biA8Y29kZT5hbnQKKy1kaWFnbm9zdGljczwvY29kZT4gYW50IHdpbGwgbG9vayBhdCBpdHMgaW50ZXJuYWwgc3RhdGUgYW5kIHByaW50IGl0IG91dC4gVGhpcworY29kZSB3aWxsIGNoZWNrIGFuZCBwcmludCB0aGUgZm9sbG93aW5nIHRoaW5ncy4gPC9wPgorCis8dWw+CisKKzxsaT5XaGVyZSBBbnQgaXMgcnVubmluZyBmcm9tLiBTb21ldGltZXMgeW91IGNhbiBiZSBzdXJwcmlzZWQuPC9saT4KKworPGxpPlRoZSB2ZXJzaW9uIG9mIGFudC5qYXIgYW5kIG9mIHRoZSBhbnQtKi5qYXIgY29udGFpbmluZyB0aGUgb3B0aW9uYWwgdGFza3MgLQorICAgIGFuZCB3aGV0aGVyIHRoZXkgbWF0Y2g8L2xpPgorCis8bGk+V2hpY2ggSkFSIGZpbGVzIGFyZSBpbiBBTlRfSE9NRS9saWIKKworPGxpPldoaWNoIG9wdGlvbmFsIHRhc2tzIGFyZSBhdmFpbGFibGUuIElmIGEgdGFzayBpcyBub3QgbGlzdGVkIGFzIGJlaW5nCithdmFpbGFibGUsIGVpdGhlciBpdCBpcyBub3QgcHJlc2VudCwgb3IgbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUKK2Fic2VudC48L2xpPgorCisKKzxsaT5YTUwgUGFyc2VyIGluZm9ybWF0aW9uPC9saT4KKworPGxpPkpWTSBzeXN0ZW0gcHJvcGVydGllcworPC9saT4KKworPGxpPlRoZSBzdGF0dXMgb2YgdGhlIHRlbXAgZGlyZWN0b3J5LiBJZiB0aGlzIGlzIG5vdCB3cml0ZWFibGUsIG9yIGl0cyBjbG9jayBpcworaG9ycmlibHkgd3JvbmcgKHBvc3NpYmxlIGlmIGl0IGlzIG9uIGEgbmV0d29yayBkcml2ZSksIGEgbG90IG9mIHRhc2tzIHdpbGwgZmFpbAord2l0aCBvYnNjdXJlIGVycm9yIG1lc3NhZ2VzLjwvbGk+CisKKzxsaT5UaGUgY3VycmVudCB0aW1lIHpvbmUgYXMgSmF2YSBzZWVzIGl0LiBJZiB0aGlzIGlzIG5vdCB3aGF0IGl0IHNob3VsZCBiZSBmb3IKK3lvdXIgbG9jYXRpb24sIHRoZW4gZGVwZW5kZW5jeSBsb2dpYyBtYXkgZ2V0IGNvbmZ1c2VkLgorCis8L3VsPgorCis8cD4KKyAgICBSdW5uaW5nIDxjb2RlPmFudCAtZGlhZ25vc3RpY3M8L2NvZGU+IGlzIGEgZ29vZCB3YXkgdG8gY2hlY2sgdGhhdCBhbnQgaXMKKyAgICBpbnN0YWxsZWQuIEl0IGlzIGFsc28gYSBmaXJzdCBzdGVwIHRvd2FyZHMgc2VsZi1kaWFnbm9zaXMgb2YgYW55IHByb2JsZW0uCisgICAgQW55IGNvbmZpZ3VyYXRpb24gcHJvYmxlbSByZXBvcnRlZCB0byB0aGUgdXNlciBtYWlsaW5nIGxpc3Qgd2lsbCBwcm9iYWJseQorICAgIHJlc3VsdCBpbnMgc29tZW9uZSBhc2tpbmcgeW91IHRvIHJ1biB0aGUgY29tbWFuZCBhbmQgc2hvdyB0aGUgcmVzdWx0cywgc28KKyAgICBzYXZlIHRpbWUgYnkgdXNpbmcgaXQgeW91cnNlbGYuCis8L3A+CisKKzxwPgorICAgIEZvciB1bmRlci1JREUgZGlhZ29zdGljcywgdXNlIHRoZSAmbHQ7ZGlhZ25vc3RpY3MmZ3Q7IHRhc2sgdG8gcnVuIHRoZSBzYW1lCisgICAgdGVzdHMgYXMgYW4gYW50IHRhc2suIFRoaXMgY2FuIGJlIGFkZGVkIHRvIGEgZGlhZ25vc3RpY3MgdGFyZ2V0IGluIGEgYnVpbGQKKyAgICBmaWxlIHRvIHNlZSB3aGF0IHRhc2tzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlIElERSwgd2hhdCB0aGUgWE1MIHBhcnNlciBhbmQKKyAgICBjbGFzc3BhdGggaXMsIGV0Yy4KKzwvcD4KKworPGgzPjxhIG5hbWU9ImFudC11c2VyIj51c2VyIG1haWxpbmcgbGlzdDwvYT48L2gzPgorCis8cD4gSWYgeW91IGNhbm5vdCBnZXQgQW50IGluc3RhbGxlZCBvciB3b3JraW5nLCB0aGUgQW50IHVzZXIgbWFpbGluZyBsaXN0IGlzIHRoZQorYmVzdCBwbGFjZSB0byBzdGFydCB3aXRoIGFueSBwcm9ibGVtLiBQbGVhc2UgZG8geW91ciBob21ld29yayBmaXJzdCwgbWFrZSBzdXJlCit0aGF0IGl0IGlzIG5vdCBhIDxhIGhyZWY9IiNjbGFzc3BhdGgiPjxjb2RlPkNMQVNTUEFUSDwvY29kZT48L2E+IHByb2JsZW0sIGFuZCBydW4gYSA8YQoraHJlZj0iI2RpYWdub3N0aWNzIj5kaWFnbm9zdGljcyBjaGVjazwvYT4gdG8gc2VlIHdoYXQgQW50IHRoaW5rcyBvZiBpdHMgb3duCitzdGF0ZS4gV2h5IHRoZSB1c2VyIGxpc3QsIGFuZCBub3QgdGhlIGRldmVsb3BlciBsaXN0PworQmVjYXVzZSB0aGVyZSBhcmUgbW9yZSB1c2VycyB0aGFuIGRldmVsb3BlcnMsIHNvIG1vcmUgcGVvcGxlIHdobyBjYW4gaGVscCB5b3UuIDwvcD4KKworPHA+CisKK1BsZWFzZSBvbmx5IGZpbGUgYSBidWcgcmVwb3J0IGFnYWluc3QgQW50IGZvciBhIGNvbmZpZ3VyYXRpb24vc3RhcnR1cCBwcm9ibGVtIGlmCit0aGVyZSByZWFsbHkgaXMgYSBmaXhhYmxlIGJ1ZyBpbiBBbnQgcmVsYXRlZCB0byBjb25maWd1cmF0aW9uLCBzdWNoIGFzIGl0IG5vdAord29ya2luZyBvbiBhIHBhcnRpY3VsYXIgcGxhdGZvcm0sIHdpdGggYSBjZXJ0YWluIEpWTSB2ZXJzaW9uLCBldGMsIG9yIGlmIHlvdSBhcmUKK2FkdmlzZWQgdG8gZG8gaXQgYnkgdGhlIHVzZXIgbWFpbGluZyBsaXN0LgorPC9wPgorCisKKworCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9pbnN0YWxsbGlzdC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvaW5zdGFsbGxpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTgwZDVmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvaW5zdGFsbGxpc3QuaHRtbApAQCAtMCwwICsxLDQ0IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIvPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIi8+Cis8dGl0bGU+QXBhY2hlIEFudCBVc2VyIE1hbnVhbDwvdGl0bGU+Cis8YmFzZSB0YXJnZXQ9Im1haW5GcmFtZSIvPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIGhyZWY9InRvYy5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5UYWJsZSBvZiBDb250ZW50czwvYT48L2gyPgorCis8aDM+SW5zdGFsbGluZyBBbnQ8L2gzPgorPHA+PGEgaHJlZj0iaW5zdGFsbC5odG1sI2dldHRpbmciPkdldHRpbmcgQW50PC9hPjxici8+CisgIDxhIGhyZWY9Imluc3RhbGwuaHRtbCNzeXNyZXF1aXJlbWVudHMiPlN5c3RlbSBSZXF1aXJlbWVudHM8L2E+PGJyLz4KKyAgPGEgaHJlZj0iaW5zdGFsbC5odG1sI2luc3RhbGxpbmciPkluc3RhbGxpbmcgQW50PC9hPjxici8+CisgIDxhIGhyZWY9Imluc3RhbGwuaHRtbCNjaGVja0luc3RhbGxhdGlvbiI+Q2hlY2sgSW5zdGFsbGF0aW9uPC9hPjxici8+CisgIDxhIGhyZWY9Imluc3RhbGwuaHRtbCNidWlsZGluZ2FudCI+QnVpbGRpbmcgQW50PC9hPjxici8+CisgIDxhIGhyZWY9Imluc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT48YnIvPgorICA8YSBocmVmPSJwbGF0Zm9ybS5odG1sIj5QbGF0Zm9ybSBTcGVjaWZpYyBJc3N1ZXM8L2E+PGJyLz4KKyAgPGEgaHJlZj0icHJveHkuaHRtbCI+UHJveHkgY29uZmlndXJhdGlvbjwvYT48YnIvPgorPC9wPgorPHA+PGJyLz4KKzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvaW50cm8uaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL2ludHJvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2NzNlZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL2ludHJvLmh0bWwKQEAgLTAsMCArMSw2OSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsIC0gSW50cm9kdWN0aW9uPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+PGEgbmFtZT0iaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9oMT4KKzxwPkFwYWNoZSBBbnQgaXMgYSBKYXZhLWJhc2VkIGJ1aWxkIHRvb2wuIEluIHRoZW9yeSwgaXQgaXMga2luZCBvZiBsaWtlCis8aT5tYWtlPC9pPiwgd2l0aG91dCA8aT5tYWtlPC9pPidzIHdyaW5rbGVzLjwvcD4KKzxoMz5XaHk/PC9oMz4KKzxwPldoeSBhbm90aGVyIGJ1aWxkIHRvb2wgd2hlbiB0aGVyZSBpcyBhbHJlYWR5Cis8aT5tYWtlPC9pPiwKKzxpPmdudW1ha2U8L2k+LAorPGk+bm1ha2U8L2k+LAorPGk+amFtPC9pPiwKK2FuZAorb3RoZXJzPyBCZWNhdXNlIGFsbCB0aG9zZSB0b29scyBoYXZlIGxpbWl0YXRpb25zIHRoYXQgQW50J3Mgb3JpZ2luYWwgYXV0aG9yCitjb3VsZG4ndCBsaXZlIHdpdGggd2hlbiBkZXZlbG9waW5nIHNvZnR3YXJlIGFjcm9zcyBtdWx0aXBsZSBwbGF0Zm9ybXMuCitNYWtlLWxpa2UKK3Rvb2xzIGFyZSBpbmhlcmVudGx5IHNoZWxsLWJhc2VkOiB0aGV5IGV2YWx1YXRlIGEgc2V0IG9mIGRlcGVuZGVuY2llcywKK3RoZW4gZXhlY3V0ZSBjb21tYW5kcyBub3QgdW5saWtlIHdoYXQgeW91IHdvdWxkIGlzc3VlIG9uIGEgc2hlbGwuCitUaGlzIG1lYW5zIHRoYXQgeW91CitjYW4gZWFzaWx5IGV4dGVuZCB0aGVzZSB0b29scyBieSB1c2luZyBvciB3cml0aW5nIGFueSBwcm9ncmFtIGZvciB0aGUgT1MgdGhhdAoreW91IGFyZSB3b3JraW5nIG9uOyBob3dldmVyLCB0aGlzIGFsc28gbWVhbnMgdGhhdCB5b3UgbGltaXQgeW91cnNlbGYgdG8gdGhlIE9TLAorb3IgYXQgbGVhc3QgdGhlIE9TIHR5cGUsIHN1Y2ggYXMgVW5peCwgdGhhdCB5b3UgYXJlIHdvcmtpbmcgb24uPC9wPgorPHA+TWFrZWZpbGVzIGFyZSBpbmhlcmVudGx5IGV2aWwgYXMgd2VsbC4gQW55Ym9keSB3aG8gaGFzIHdvcmtlZCBvbiB0aGVtIGZvciBhbnkKK3RpbWUgaGFzIHJ1biBpbnRvIHRoZSBkcmVhZGVkIHRhYiBwcm9ibGVtLiAmcXVvdDtJcyBteSBjb21tYW5kIG5vdCBleGVjdXRpbmcKK2JlY2F1c2UgSSBoYXZlIGEgc3BhY2UgaW4gZnJvbnQgb2YgbXkgdGFiPyEhJnF1b3Q7IHNhaWQgdGhlIG9yaWdpbmFsIGF1dGhvciBvZgorQW50IHdheSB0b28gbWFueSB0aW1lcy4gVG9vbHMgbGlrZSBKYW0gdG9vayBjYXJlIG9mIHRoaXMgdG8gYSBncmVhdCBkZWdyZWUsIGJ1dAorc3RpbGwgaGF2ZSB5ZXQgYW5vdGhlciBmb3JtYXQgdG8gdXNlIGFuZCByZW1lbWJlci48L3A+Cis8cD5BbnQgaXMgZGlmZmVyZW50LiBJbnN0ZWFkIG9mIGEgbW9kZWwgd2hlcmUgaXQgaXMgZXh0ZW5kZWQgd2l0aCBzaGVsbC1iYXNlZAorY29tbWFuZHMsIEFudCBpcyBleHRlbmRlZCB1c2luZyBKYXZhIGNsYXNzZXMuIEluc3RlYWQgb2Ygd3JpdGluZyBzaGVsbCBjb21tYW5kcywKK3RoZSBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSBYTUwtYmFzZWQsIGNhbGxpbmcgb3V0IGEgdGFyZ2V0IHRyZWUgd2hlcmUgdmFyaW91cwordGFza3MgZ2V0IGV4ZWN1dGVkLiBFYWNoIHRhc2sgaXMgcnVuIGJ5IGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyCitUYXNrIGludGVyZmFjZS48L3A+Cis8cD5HcmFudGVkLCB0aGlzIHJlbW92ZXMgc29tZSBvZiB0aGUgZXhwcmVzc2l2ZSBwb3dlciB0aGF0IGlzIGluaGVyZW50IGluIGJlaW5nCithYmxlIHRvIGNvbnN0cnVjdCBhIHNoZWxsIGNvbW1hbmQgc3VjaCBhcworPG5vYnI+PGNvZGU+YGZpbmQgLiAtbmFtZSBmb28gLWV4ZWMgcm0ge31gPC9jb2RlPjwvbm9icj4sIGJ1dCBpdAorZ2l2ZXMgeW91IHRoZSBhYmlsaXR5IHRvIGJlIGNyb3NzLXBsYXRmb3JtLS10byB3b3JrIGFueXdoZXJlIGFuZAorZXZlcnl3aGVyZS4gQW5kCitoZXksIGlmIHlvdSByZWFsbHkgbmVlZCB0byBleGVjdXRlIGEgc2hlbGwgY29tbWFuZCwgQW50IGhhcyBhbgorPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrIHRoYXQKK2FsbG93cyBkaWZmZXJlbnQgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgYmFzZWQgb24gdGhlIE9TIGl0IGlzIGV4ZWN1dGluZworb24uPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9qYXZhY3Byb3BzLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9qYXZhY3Byb3BzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1YzFkOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL2phdmFjcHJvcHMuaHRtbApAQCAtMCwwICsxLDUzIEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPlByb3BlcnRpZXMgY29udHJvbGxpbmcgamF2YWM8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPHA+VGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4KK2Rvbid0IGhhdmUgYW55IGRlZmF1bHQgdmFsdWVzIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBTaW5jZSB0aGUKK3VuZGVybHlpbmcgamF2YWMgY29tcGlsZXIncyBkZWZhdWx0IGRlcGVuZHMgb24gdGhlIEpESyB5b3UgdXNlLCB5b3UKK21heSBlbmNvdW50ZXIgYnVpbGQgZmlsZXMgdGhhdCBkb24ndCBleHBsaWNpdGx5IHNldCB0aG9zZSBhdHRyaWJ1dGVzCithbmQgdGhhdCB3aWxsIG5vIGxvbmdlciBjb21waWxlIHVzaW5nIGEgbmV3ZXIgSkRLLiAgSWYgeW91IGNhbm5vdAorY2hhbmdlIHRoZSBidWlsZCBmaWxlLCBBbnQgcHJvdmlkZXMgdHdvIHByb3BlcnRpZXMgdGhhdCBoZWxwIHlvdQorc2V0dGluZyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UgYXR0cmlidXRlcy4gIElmIHRoZSBhdHRyaWJ1dGVzIGhhdmUKK2JlZW4gc2V0IGV4cGxpY2l0bHksIHRoZSBwcm9wZXJ0aWVzIGxpc3RlZCBoZXJlIHdpbGwgYmUgaWdub3JlZC48L3A+CisKKzxoMj48YSBuYW1lPSJzb3VyY2UiPmFudC5idWlsZC5qYXZhYy5zb3VyY2U8L2E+PC9oMj4KKworPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvcD4KKworPHA+UHJvdmlkZXMgYSBkZWZhdWx0IHZhbHVlIGZvciA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPidzIGFuZAorPGNvZGU+Jmx0O2phdmFkb2MmZ3Q7PC9jb2RlPidzIHNvdXJjZSBhdHRyaWJ1dGUuPC9wPgorCis8aDI+PGEgbmFtZT0idGFyZ2V0Ij5hbnQuYnVpbGQuamF2YWMudGFyZ2V0PC9hPjwvaDI+CisKKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+CisKKzxwPlByb3ZpZGVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4ncyB0YXJnZXQKK2F0dHJpYnV0ZS48L3A+CisKKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC9saXN0ZW5lcnMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL2xpc3RlbmVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZjdlYjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9saXN0ZW5lcnMuaHRtbApAQCAtMCwwICsxLDUwMyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5MaXN0ZW5lcnMgJmFtcDsgTG9nZ2VyczwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgxPkxpc3RlbmVycyAmYW1wOyBMb2dnZXJzPC9oMT4KKworPGgyPjxhIG5hbWU9Ik92ZXJ2aWV3Ij5PdmVydmlldzwvYT48L2gyPgorCis8cD5BbnQgaGFzIHR3byByZWxhdGVkIGZlYXR1cmVzIHRvIGFsbG93IHRoZSBidWlsZCBwcm9jZXNzIHRvIGJlIG1vbml0b3JlZDoKK2xpc3RlbmVycyBhbmQgbG9nZ2Vycy48L3A+CisKKzxoMz48YSBuYW1lPSJMaXN0ZW5lcnMiPkxpc3RlbmVyczwvYT48L2gzPgorCis8cD5BIGxpc3RlbmVyIGlzIGFsZXJ0ZWQgb2YgdGhlIGZvbGxvd2luZyBldmVudHM6PC9wPgorCis8dWw+CisgIDxsaT5idWlsZCBzdGFydGVkPC9saT4KKyAgPGxpPmJ1aWxkIGZpbmlzaGVkPC9saT4KKyAgPGxpPnRhcmdldCBzdGFydGVkPC9saT4KKyAgPGxpPnRhcmdldCBmaW5pc2hlZDwvbGk+CisgIDxsaT50YXNrIHN0YXJ0ZWQ8L2xpPgorICA8bGk+dGFzayBmaW5pc2hlZDwvbGk+CisgIDxsaT5tZXNzYWdlIGxvZ2dlZDwvbGk+Cis8L3VsPgorCis8cD4KKyAgVGhlc2UgYXJlIHVzZWQgaW50ZXJuYWxseSBmb3IgdmFyaW91cyByZWNvcmRpbmcgYW5kIGhvdXNla2VlcGluZyBvcGVyYXRpb25zLAorICBob3dldmVyIG5ldyBsaXN0ZW5lcnMgbWF5IHJlZ2lzdGVyZWQgb24gdGhlIGNvbW1hbmQgbGluZSB0aHJvdWdoIHRoZSA8Y29kZT4tbGlzdGVuZXI8L2NvZGU+CisgIGFyZ3VtZW50LgorPC9wPgorCis8aDM+PGEgbmFtZT0iTG9nZ2VycyI+TG9nZ2VyczwvYT48L2gzPgorCis8cD5Mb2dnZXJzIGV4dGVuZCB0aGUgY2FwYWJpbGl0aWVzIG9mIGxpc3RlbmVycyBhbmQgYWRkIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6PC9wPgorCis8dWw+CisgIDxsaT5SZWNlaXZlcyBhIGhhbmRsZSB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvciBwcmludCBzdHJlYW1zIGFuZAorICB0aGVyZWZvcmUgY2FuIGxvZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZSBvciB0aGUgPGNvZGU+LWxvZ2ZpbGU8L2NvZGU+IHNwZWNpZmllZCBmaWxlLjwvbGk+CisgIDxsaT5Mb2dnaW5nIGxldmVsICgtcXVpZXQsIC12ZXJib3NlLCAtZGVidWcpIGF3YXJlPC9saT4KKyAgPGxpPkVtYWNzLW1vZGUgYXdhcmU8L2xpPgorPC91bD4KKworPGgyPjxhIG5hbWU9ImJ1aWx0aW4iPkJ1aWx0LWluIExpc3RlbmVycy9Mb2dnZXJzPC9hPjwvaDI+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iMTAwJSIgaWQ9IkF1dG9OdW1iZXIxIj4KKyAgPHRyPgorICAgIDx0ZCB3aWR0aD0iMzMlIj5DbGFzc25hbWU8L3RkPgorICAgIDx0ZCB3aWR0aD0iMzMlIj5EZXNjcmlwdGlvbjwvdGQ+CisgICAgPHRkIHdpZHRoPSIzNCUiPlR5cGU8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIzMyUiPjxjb2RlPjxhIGhyZWY9IiNEZWZhdWx0TG9nZ2VyIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5EZWZhdWx0TG9nZ2VyPC9hPjwvY29kZT48L3RkPgorICAgIDx0ZCB3aWR0aD0iMzMlIj5UaGUgbG9nZ2VyIHVzZWQgaW1wbGljaXRseSB1bmxlc3Mgb3ZlcnJpZGRlbiB3aXRoIHRoZQorICAgIDxjb2RlPi1sb2dnZXI8L2NvZGU+IGNvbW1hbmQtbGluZSBzd2l0Y2guPC90ZD4KKyAgICA8dGQgd2lkdGg9IjM0JSI+QnVpbGRMb2dnZXI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIzMyUiPjxjb2RlPjxhIGhyZWY9IiNOb0Jhbm5lckxvZ2dlciI+CisgICAgb3JnLmFwYWNoZS50b29scy5hbnQuTm9CYW5uZXJMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+CisgICAgPHRkIHdpZHRoPSIzMyUiPlRoaXMgbG9nZ2VyIG9taXRzIG91dHB1dCBvZiBlbXB0eSB0YXJnZXQgb3V0cHV0LjwvdGQ+CisgICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTG9nZ2VyPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB3aWR0aD0iMzMlIj48Y29kZT48YSBocmVmPSIjTWFpbExvZ2dlciI+CisgICAgb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuTWFpbExvZ2dlcjwvYT48L2NvZGU+PC90ZD4KKyAgICA8dGQgd2lkdGg9IjMzJSI+RXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHN1Y2ggdGhhdCBvdXRwdXQgaXMgc3RpbGwgZ2VuZXJhdGVkCisgICAgdGhlIHNhbWUsIGFuZCB3aGVuIHRoZSBidWlsZCBpcyBmaW5pc2hlZCBhbiBlLW1haWwgY2FuIGJlIHNlbnQuPC90ZD4KKyAgICA8dGQgd2lkdGg9IjM0JSI+QnVpbGRMb2dnZXI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIzMyUiPjxjb2RlPjxhIGhyZWY9IiNBbnNpQ29sb3JMb2dnZXIiPgorICAgIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLkFuc2lDb2xvckxvZ2dlcjwvYT48L2NvZGU+PC90ZD4KKyAgICA8dGQgd2lkdGg9IjMzJSI+Q29sb3JpZmllcyB0aGUgYnVpbGQgb3V0cHV0LjwvdGQ+CisgICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTG9nZ2VyPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB3aWR0aD0iMzMlIj48Y29kZT48YSBocmVmPSIjTG9nNGpMaXN0ZW5lciI+CisgICAgb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuTG9nNGpMaXN0ZW5lcjwvYT48L2NvZGU+PC90ZD4KKyAgICA8dGQgd2lkdGg9IjMzJSI+UGFzc2VzIGV2ZW50cyB0byBMb2c0aiBmb3IgaGlnaGx5IGN1c3RvbWl6YWJsZSBsb2dnaW5nLjwvdGQ+CisgICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTGlzdGVuZXI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIzMyUiPjxjb2RlPjxhIGhyZWY9IiNYbWxMb2dnZXIiPm9yZy5hcGFjaGUudG9vbHMuYW50LlhtbExvZ2dlcjwvYT48L2NvZGU+PC90ZD4KKyAgICA8dGQgd2lkdGg9IjMzJSI+V3JpdGVzIHRoZSBidWlsZCBpbmZvcm1hdGlvbiB0byBhbiBYTUwgZmlsZS48L3RkPgorICAgIDx0ZCB3aWR0aD0iMzQlIj5CdWlsZExvZ2dlcjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjMzJSI+PGNvZGU+PGEgaHJlZj0iI1RpbWVzdGFtcGVkTG9nZ2VyIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5UaW1lc3RhbXBlZExvZ2dlcjwvYT48L2NvZGU+PC90ZD4KKyAgICA8dGQgd2lkdGg9IjMzJSI+UHJpbnRzIHRoZSB0aW1lIHRoYXQgYSBidWlsZCBmaW5pc2hlZDwvdGQ+CisgICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTG9nZ2VyPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB3aWR0aD0iMzMlIj48Y29kZT48YSBocmVmPSIjQmlnUHJvamVjdExvZ2dlciI+b3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuQmlnUHJvamVjdExvZ2dlcjwvYT48L2NvZGU+PC90ZD4KKyAgICA8dGQgd2lkdGg9IjMzJSI+UHJpbnRzIHRoZSBwcm9qZWN0IG5hbWUgZXZlcnkgdGFyZ2V0PC90ZD4KKyAgICA8dGQgd2lkdGg9IjM0JSI+QnVpbGRMb2dnZXI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIzMyUiPjxjb2RlPjxhIGhyZWY9IiNQcm9maWxlTG9nZ2VyIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5Qcm9maWxlTG9nZ2VyPC9hPjwvY29kZT48L3RkPgorICAgIDx0ZCB3aWR0aD0iMzMlIj5UaGUgZGVmYXVsdCBsb2dnZXIsIHdpdGggc3RhcnQgdGltZXMsIGVuZCB0aW1lcyBhbmQKKyAgICBkdXJhdGlvbnMgYWRkZWQgZm9yIGVhY2ggdGFzayBhbmQgdGFyZ2V0LjwvdGQ+CisgICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTG9nZ2VyPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+PGEgbmFtZT0iRGVmYXVsdExvZ2dlciI+RGVmYXVsdExvZ2dlcjwvYT48L2gzPgorCis8cD5TaW1wbHkgcnVuIEFudCBub3JtYWxseSwgb3I6PC9wPgorCis8YmxvY2txdW90ZT4KKworPHA+PGNvZGU+YW50IC1sb2dnZXIgb3JnLmFwYWNoZS50b29scy5hbnQuRGVmYXVsdExvZ2dlcjwvY29kZT48L3A+CisKKzwvYmxvY2txdW90ZT4KKworPGgzPjxhIG5hbWU9Ik5vQmFubmVyTG9nZ2VyIj5Ob0Jhbm5lckxvZ2dlcjwvYT48L2gzPgorCis8cD5SZW1vdmVzIG91dHB1dCBvZiBlbXB0eSB0YXJnZXQgb3V0cHV0LjwvcD4KKworPGJsb2NrcXVvdGU+CisKKzxwPjxjb2RlPmFudCAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lk5vQmFubmVyTG9nZ2VyPC9jb2RlPjwvcD4KKworPC9ibG9ja3F1b3RlPgorCis8aDM+PGEgbmFtZT0iTWFpbExvZ2dlciI+TWFpbExvZ2dlcjwvYT48L2gzPgorCis8cD5UaGUgTWFpbExvZ2dlciBjYXB0dXJlcyBhbGwgb3V0cHV0IGxvZ2dlZCB0aHJvdWdoIERlZmF1bHRMb2dnZXIgKHN0YW5kYXJkIEFudAorb3V0cHV0KSBhbmQgd2lsbCBzZW5kIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgbWVzc2FnZXMgdG8gdW5pcXVlIGUtbWFpbCBsaXN0cywgd2l0aAorY29udHJvbCBmb3IgdHVybmluZyBvZmYgc3VjY2VzcyBvciBmYWlsdXJlIG1lc3NhZ2VzIGluZGl2aWR1YWxseS48L3A+Cis8cD5Qcm9wZXJ0aWVzIGNvbnRyb2xsaW5nIHRoZSBvcGVyYXRpb24gb2YgTWFpbExvZ2dlcjo8L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjEwMCUiIGlkPSJBdXRvTnVtYmVyMiI+CisgIDx0cj4KKyAgICA8dGggd2lkdGg9IjMzNyI+UHJvcGVydHk8L3RoPgorICAgIDx0aCB3aWR0aD0iNjMlIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHdpZHRoPSI2MyUiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLm1haWxob3N0IDwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPk1haWwgc2VydmVyIHRvIHVzZTwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPk5vLCBkZWZhdWx0ICZxdW90O2xvY2FsaG9zdCZxdW90OzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5wb3J0IDwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPlNNVFAgUG9ydCBmb3IgdGhlIE1haWwgc2VydmVyPC90ZD4KKyAgICA8dGQgd2lkdGg9IjYzJSI+Tm8sIGRlZmF1bHQgJnF1b3Q7MjUmcXVvdDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIudXNlcjwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPnVzZXIgbmFtZSBmb3IgU01UUCBhdXRoPC90ZD4KKyAgICA8dGQgd2lkdGg9IjYzJSI+WWVzLCBpZiBTTVRQIGF1dGggaXMgcmVxdWlyZWQgb24geW91ciBTTVRQIHNlcnZlcjxicj4KKyAgICB0aGUgZW1haWwgbWVzc2FnZSB3aWxsIGJlIHRoZW4gc2VudCB1c2luZyBNaW1lIGFuZCByZXF1aXJlcyBKYXZhTWFpbDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5wYXNzd29yZDwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPnBhc3N3b3JkIGZvciBTTVRQIGF1dGg8L3RkPgorICAgIDx0ZCB3aWR0aD0iNjMlIj5ZZXMsIGlmIFNNVFAgYXV0aCBpcyByZXF1aXJlZCBvbiB5b3VyIFNNVFAgc2VydmVyPGJyPgorICAgIHRoZSBlbWFpbCBtZXNzYWdlIHdpbGwgYmUgdGhlbiBzZW50IHVzaW5nIE1pbWUgYW5kIHJlcXVpcmVzIEphdmFNYWlsPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLnNzbDwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPm9uIG9yIHRydWUgaWYgc3NsIGlzIG5lZWRlZDxicj4KKyAgICBUaGlzIGZlYXR1cmUgcmVxdWlyZXMgSmF2YU1haWw8L3RkPgorICAgIDx0ZCB3aWR0aD0iNjMlIj4KKyAgICBubzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5mcm9tPC90ZD4KKyAgICA8dGQgd2lkdGg9IjYzJSI+TWFpbCAmcXVvdDtmcm9tJnF1b3Q7IGFkZHJlc3M8L3RkPgorICAgIDx0ZCB3aWR0aD0iNjMlIj5ZZXMsIGlmIG1haWwgbmVlZHMgdG8gYmUgc2VudDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5yZXBseXRvPC90ZD4KKyAgICA8dGQgd2lkdGg9IjYzJSI+TWFpbCAmcXVvdDtyZXBseXRvJnF1b3Q7IGFkZHJlc3MoZXMpLCBjb21tYS1zZXBhcmF0ZWQ8L3RkPgorICAgIDx0ZCB3aWR0aD0iNjMlIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5mYWlsdXJlLm5vdGlmeSA8L3RkPgorICAgIDx0ZCB3aWR0aD0iNjMlIj5TZW5kIGJ1aWxkIGZhaWx1cmUgZS1tYWlscz88L3RkPgorICAgIDx0ZCB3aWR0aD0iNjMlIj5ObywgZGVmYXVsdCAmcXVvdDt0cnVlJnF1b3Q7PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLnN1Y2Nlc3Mubm90aWZ5IDwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPlNlbmQgYnVpbGQgc3VjY2VzcyBlLW1haWxzPzwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPk5vLCBkZWZhdWx0ICZxdW90O3RydWUmcXVvdDs8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIuZmFpbHVyZS50byA8L3RkPgorICAgIDx0ZCB3aWR0aD0iNjMlIj5BZGRyZXNzKGVzKSB0byBzZW5kIGZhaWx1cmUgbWVzc2FnZXMgdG8sIGNvbW1hLXNlcGFyYXRlZDwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPlllcywgaWYgZmFpbHVyZSBtYWlsIGlzIHRvIGJlIHNlbnQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIuc3VjY2Vzcy50byA8L3RkPgorICAgIDx0ZCB3aWR0aD0iNjMlIj5BZGRyZXNzKGVzKSB0byBzZW5kIHN1Y2Nlc3MgbWVzc2FnZXMgdG8sIGNvbW1hLXNlcGFyYXRlZDwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPlllcywgaWYgc3VjY2VzcyBtYWlsIGlzIHRvIGJlIHNlbnQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIuZmFpbHVyZS5zdWJqZWN0IDwvdGQ+CisgICAgPHRkIHdpZHRoPSI2MyUiPlN1YmplY3Qgb2YgZmFpbGVkIGJ1aWxkPC90ZD4KKyAgICA8dGQgd2lkdGg9IjYzJSI+Tm8sIGRlZmF1bHQgJnF1b3Q7QnVpbGQgRmFpbHVyZSZxdW90OzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5zdWNjZXNzLnN1YmplY3QgPC90ZD4KKyAgICA8dGQgd2lkdGg9IjYzJSI+U3ViamVjdCBvZiBzdWNjZXNzZnVsIGJ1aWxkPC90ZD4KKyAgICA8dGQgd2lkdGg9IjYzJSI+Tm8sIGRlZmF1bHQgJnF1b3Q7QnVpbGQgU3VjY2VzcyZxdW90OzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5wcm9wZXJ0aWVzLmZpbGUgPC90ZD4KKyAgICA8dGQgd2lkdGg9IjYzJSI+RmlsZW5hbWUgb2YgcHJvcGVydGllcyBmaWxlIHRoYXQgd2lsbCBvdmVycmlkZSBvdGhlciB2YWx1ZXMuPC90ZD4KKyAgICA8dGQgd2lkdGg9IjYzJSI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxibG9ja3F1b3RlPgorCis8cD48Y29kZT5hbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5NYWlsTG9nZ2VyPC9jb2RlPjwvcD4KKworPC9ibG9ja3F1b3RlPgorCis8aDM+PGEgbmFtZT0iQW5zaUNvbG9yTG9nZ2VyIj5BbnNpQ29sb3JMb2dnZXI8L2E+PC9oMz4KKworPHA+VGhlIEFuc2lDb2xvckxvZ2dlciBhZGRzIGNvbG9yIHRvIHRoZSBzdGFuZGFyZCBBbnQgb3V0cHV0CitieSBwcmVmaXhpbmcgYW5kIHN1ZmZpeGluZyBBTlNJIGNvbG9yIGNvZGUgZXNjYXBlIHNlcXVlbmNlcyB0bworaXQuICBJdCBpcyBqdXN0IGFuIGV4dGVuc2lvbiBvZiA8YSBocmVmPSIjRGVmYXVsdExvZ2dlciI+RGVmYXVsdExvZ2dlcjwvYT4KK2FuZCBoZW5jZSBwcm92aWRlcyBhbGwgZmVhdHVyZXMgdGhhdCBEZWZhdWx0TG9nZ2VyIGRvZXMuPC9wPgorPHA+QW5zaUNvbG9yTG9nZ2VyIGRpZmZlcmVudGlhdGVzIHRoZSBvdXRwdXQgYnkgYXNzaWduaW5nCitkaWZmZXJlbnQgY29sb3JzIGRlcGVuZGluZyB1cG9uIHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLjwvcD4KKzxwPklmIHVzZWQgd2l0aCB0aGUgLWxvZ2ZpbGUgb3B0aW9uLCB0aGUgb3V0cHV0IGZpbGUKK3dpbGwgY29udGFpbiBhbGwgdGhlIG5lY2Vzc2FyeSBlc2NhcGUgY29kZXMgdG8KK2Rpc3BsYXkgdGhlIHRleHQgaW4gY29sb3JpemVkIG1vZGUgd2hlbiBkaXNwbGF5ZWQKK2luIHRoZSBjb25zb2xlIHVzaW5nIGFwcGxpY2F0aW9ucyBsaWtlIGNhdCwgbW9yZSwgZXRjLjwvcD4KKzxwPlRoaXMgaXMgZGVzaWduZWQgdG8gd29yayBvbiB0ZXJtaW5hbHMgdGhhdCBzdXBwb3J0IEFOU0kKK2NvbG9yIGNvZGVzLiAgSXQgd29ya3Mgb24gWFRlcm0sIEVUZXJtLCBXaW45eCBDb25zb2xlCisod2l0aCBBTlNJLlNZUyBsb2FkZWQuKSwgZXRjLjwvcD4KKzxwPjxTdHJvbmc+Tk9URTo8L1N0cm9uZz4KK0l0IGRvZXNuJ3Qgd29yayBvbiBXaW5OVCBhbmQgc3VjY2Vzc29ycywgZXZlbiB3aGVuIGEgQ09NTUFORC5DT00gY29uc29sZSBsb2FkZWQgd2l0aAorQU5TSS5TWVMgaXMgdXNlZC48L3A+Cis8cD5JZiB0aGUgdXNlciB3aXNoZXMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29sb3JzCit3aXRoIGN1c3RvbSBvbmVzLCBhIGZpbGUgY29udGFpbmluZyB6ZXJvIG9yIG1vcmUgb2YgdGhlCitjdXN0b20gY29sb3Iga2V5LXZhbHVlIHBhaXJzIG11c3QgYmUgY3JlYXRlZC4gIFRoZSByZWNvZ25pemVkIGtleXMKK2FuZCB0aGVpciBkZWZhdWx0IHZhbHVlcyBhcmUgc2hvd24gYmVsb3c6PC9wPjxjb2RlPjxwcmU+CitBbnNpQ29sb3JMb2dnZXIuRVJST1JfQ09MT1I9MjszMQorQW5zaUNvbG9yTG9nZ2VyLldBUk5JTkdfQ09MT1I9MjszNQorQW5zaUNvbG9yTG9nZ2VyLklORk9fQ09MT1I9MjszNgorQW5zaUNvbG9yTG9nZ2VyLlZFUkJPU0VfQ09MT1I9MjszMgorQW5zaUNvbG9yTG9nZ2VyLkRFQlVHX0NPTE9SPTI7MzQ8L3ByZT48L2NvZGU+Cis8cD5FYWNoIGtleSB0YWtlcyBhcyB2YWx1ZSBhIGNvbG9yIGNvbWJpbmF0aW9uIGRlZmluZWQgYXMKKzxiPkF0dHJpYnV0ZTtGb3JlZ3JvdW5kO0JhY2tncm91bmQ8L2I+LiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsIGJhY2tncm91bmQKK3ZhbHVlIGhhcyBub3QgYmVlbiB1c2VkLjwvcD4KKzxwPlRoaXMgZmlsZSBtdXN0IGJlIHNwZWNmaWVkIGFzIHRoZSB2YWx1ZSBvZiBhIHN5c3RlbSB2YXJpYWJsZQorbmFtZWQgYW50LmxvZ2dlci5kZWZhdWx0cyBhbmQgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHVzaW5nIHRoZSAtRAorb3B0aW9uIHRvIHRoZSA8Yj5qYXZhPC9iPiBjb21tYW5kIHRoYXQgaW52b2tlcyB0aGUgQW50IGFwcGxpY2F0aW9uLgorQW4gZWFzeSB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIGFkZCAtRGFudC5sb2dnZXIuZGVmYXVsdHM9Cis8aT4vcGF0aC90by95b3VyL2ZpbGU8L2k+IHRvIHRoZSBBTlRfT1BUUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK0FudCdzIGxhdW5jaGluZyBzY3JpcHQgcmVjb2duaXplcyB0aGlzIGZsYWcgYW5kIHdpbGwgcGFzcyBpdCB0bwordGhlIGphdmEgY29tbWFuZCBhcHByb3ByaWF0ZWx5LjwvcD4KKzxwPkZvcm1hdDo8L3A+PHByZT4KK0Fuc2lDb2xvckxvZ2dlci4qPUF0dHJpYnV0ZTtGb3JlZ3JvdW5kO0JhY2tncm91bmQKKworQXR0cmlidXRlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorMCAtJmd0OyBSZXNldCBBbGwgQXR0cmlidXRlcyAocmV0dXJuIHRvIG5vcm1hbCBtb2RlKQorMSAtJmd0OyBCcmlnaHQgKFVzdWFsbHkgdHVybnMgb24gQk9MRCkKKzIgLSZndDsgRGltCiszIC0mZ3Q7IFVuZGVybGluZQorNSAtJmd0OyBsaW5rCis3IC0mZ3Q7IFJldmVyc2UKKzggLSZndDsgSGlkZGVuCisKK0ZvcmVncm91bmQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiszMCAtJmd0OyBCbGFjaworMzEgLSZndDsgUmVkCiszMiAtJmd0OyBHcmVlbgorMzMgLSZndDsgWWVsbG93CiszNCAtJmd0OyBCbHVlCiszNSAtJmd0OyBNYWdlbnRhCiszNiAtJmd0OyBDeWFuCiszNyAtJmd0OyBXaGl0ZQorCitCYWNrZ3JvdW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorNDAgLSZndDsgQmxhY2sKKzQxIC0mZ3Q7IFJlZAorNDIgLSZndDsgR3JlZW4KKzQzIC0mZ3Q7IFllbGxvdworNDQgLSZndDsgQmx1ZQorNDUgLSZndDsgTWFnZW50YQorNDYgLSZndDsgQ3lhbgorNDcgLSZndDsgV2hpdGU8L3ByZT4KKworPGJsb2NrcXVvdGU+CisKKzxwPjxjb2RlPmFudCAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLkFuc2lDb2xvckxvZ2dlcjwvY29kZT48L3A+CisKKzwvYmxvY2txdW90ZT4KKworPGgzPjxhIG5hbWU9IkxvZzRqTGlzdGVuZXIiPkxvZzRqTGlzdGVuZXI8L2E+PC9oMz4KKworPHA+UGFzc2VzIGJ1aWxkIGV2ZW50cyB0byBMb2c0aiwgdXNpbmcgdGhlIGZ1bGwgY2xhc3NuYW1lJ3Mgb2YgdGhlIGdlbmVyYXRvciBvZgorZWFjaCBidWlsZCBldmVudCBhcyB0aGUgY2F0ZWdvcnk6PC9wPgorCis8dWw+CisgIDxsaT5idWlsZCBzdGFydGVkIC8gYnVpbGQgZmluaXNoZWQgLSBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0PC9saT4KKyAgPGxpPnRhcmdldCBzdGFydGVkIC8gdGFyZ2V0IGZpbmlzaGVkIC0gb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0PC9saT4KKyAgPGxpPnRhc2sgc3RhcnRlZCAvIHRhc2sgZmluaXNoZWQgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgdGFzazwvbGk+CisgIDxsaT5tZXNzYWdlIGxvZ2dlZCAtIHRoZSBjbGFzc25hbWUgb2Ygb25lIG9mIHRoZSBhYm92ZSwgc28gaWYgYSB0YXNrIGxvZ3MgYQorICBtZXNzYWdlLCBpdHMgY2xhc3NuYW1lIGlzIHRoZSBjYXRlZ29yeSB1c2VkLCBhbmQgc28gb24uPC9saT4KKzwvdWw+CisKKzxwPkFsbCBzdGFydCBldmVudHMgYXJlIGxvZ2dlZCBhcyBJTkZPLiZuYnNwOyBGaW5pc2ggZXZlbnRzIGFyZSBlaXRoZXIgbG9nZ2VkIGFzCitJTkZPIG9yIEVSUk9SIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBidWlsZCBmYWlsZWQgZHVyaW5nIHRoYXQgc3RhZ2UuIE1lc3NhZ2UKK2V2ZW50cyBhcmUgbG9nZ2VkIGFjY29yZGluZyB0byB0aGVpciBBbnQgbG9nZ2luZyBsZXZlbCwgbWFwcGluZyBkaXJlY3RseSB0byBhCitjb3JyZXNwb25kaW5nIExvZzRqIGxldmVsLjwvcD4KKworPGJsb2NrcXVvdGU+CisKKzxwPjxjb2RlPmFudCAtbGlzdGVuZXIgb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuTG9nNGpMaXN0ZW5lcjwvY29kZT48L3A+CisKKzwvYmxvY2txdW90ZT4KKworPHA+VG8gdXNlIExvZzRqIHlvdSB3aWxsIG5lZWQgdGhlIExvZzRqIEpBUiBmaWxlIGFuZCBhICdsb2c0ai5wcm9wZXJ0aWVzJworY29uZmlndXJhdGlvbiBmaWxlLiAgQm90aCBzaG91bGQgYmUgcGxhY2VkIHNvbWV3aGVyZSBpbiB5b3VyIEFudAorY2xhc3NwYXRoLiBJZiB0aGUgbG9nNGoucHJvcGVydGllcyBpcyBpbiB5b3VyIHByb2plY3Qgcm9vdCBmb2xkZXIgeW91IGNhbgorYWRkIHRoaXMgd2l0aCA8aT4tbGliPC9pPiBvcHRpb246PC9wPgorCis8YmxvY2txdW90ZT4KKzxwcmU+PGNvZGU+YW50IC1saXN0ZW5lciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5Mb2c0akxpc3RlbmVyIC1saWIgLjwvY29kZT48L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPHA+SWYsIGZvciBleGFtcGxlLCB5b3Ugd2FudGVkIHRvIGNhcHR1cmUgdGhlIHNhbWUgaW5mb3JtYXRpb24gb3V0cHV0IHRvIHRoZQorY29uc29sZSBieSB0aGUgRGVmYXVsdExvZ2dlciBhbmQgc2VuZCBpdCB0byBhIGZpbGUgbmFtZWQgJ2J1aWxkLmxvZycsIHlvdQorY291bGQgdXNlIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbjo8L3A+CisKKzxibG9ja3F1b3RlPgorCis8cHJlPjxjb2RlPmxvZzRqLnJvb3RMb2dnZXI9RVJST1IsIExvZ0ZpbGUKK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0PUlORk8KK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ9SU5GTworbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzPUlORk8KK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvPVdBUk4KKworbG9nNGouYXBwZW5kZXIuTG9nRmlsZT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuTG9nRmlsZS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Citsb2c0ai5hcHBlbmRlci5Mb2dGaWxlLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJTZyXSAlOGN7MX0gOiAlbSVuCitsb2c0ai5hcHBlbmRlci5Mb2dGaWxlLmZpbGU9YnVpbGQubG9nCis8L2NvZGU+PC9wcmU+CisKKzwvYmxvY2txdW90ZT4KKworPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZmlndXJpbmcgTG9nNEogc2VlIDxhIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGovZG9jcy9kb2N1bWVudGF0aW9uLmh0bWwiPml0cworZG9jdW1lbnRhdGlvbiBwYWdlPC9hPi48L3A+CisKKzxoMz48YSBuYW1lPSJYbWxMb2dnZXIiPlhtbExvZ2dlcjwvYT48L2gzPgorCis8cD5Xcml0ZXMgYWxsIGJ1aWxkIGluZm9ybWF0aW9uIG91dCB0byBhbiBYTUwgZmlsZSBuYW1lZCBsb2cueG1sLCBvciB0aGUgdmFsdWUKK29mIHRoZSA8Y29kZT5YbWxMb2dnZXIuZmlsZTwvY29kZT4gcHJvcGVydHkgaWYgcHJlc2VudCwgd2hlbiB1c2VkIGFzIGEKK2xpc3RlbmVyLiBXaGVuIHVzZWQgYXMgYSBsb2dnZXIsIGl0IHdyaXRlcyBhbGwgb3V0cHV0IHRvIGVpdGhlciB0aGUKK2NvbnNvbGUgb3IgdG8gdGhlIHZhbHVlIG9mIDxjb2RlPi1sb2dmaWxlPC9jb2RlPi4gV2hldGhlciB1c2VkIGFzIGEgbGlzdGVuZXIKK29yIGxvZ2dlciwgdGhlIG91dHB1dCBpcyBub3QgZ2VuZXJhdGVkIHVudGlsIHRoZSBidWlsZCBpcyBjb21wbGV0ZSwgYXMgaXQKK2J1ZmZlcnMgdGhlIGluZm9ybWF0aW9uIGluIG9yZGVyIHRvIHByb3ZpZGUgdGltaW5nIGluZm9ybWF0aW9uIGZvciB0YXNrLAordGFyZ2V0cywgYW5kIHRoZSBwcm9qZWN0LgorPHA+CitCeSBkZWZhdWx0IHRoZSBYTUwgZmlsZSBjcmVhdGVzCithIHJlZmVyZW5jZSB0byBhbiBYU0xUIGZpbGUgImxvZy54c2wiIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeTsgbG9vayBpbgorQU5UX0hPTUUvZXRjIGZvciBvbmUgb2YgdGhlc2UuIFlvdSBjYW4gc2V0IHRoZSBwcm9wZXJ0eQorPGNvZGU+YW50LlhtbExvZ2dlci5zdHlsZXNoZWV0LnVyaTwvY29kZT4gdG8gcHJvdmlkZSBhIHVyaSB0byBhIHN0eWxlIHNoZWV0LgordGhpcyBjYW4gYmUgYSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBmaWxlIHBhdGgsIG9yIGFuIGh0dHAgVVJMLgorSWYgeW91IHNldCB0aGUgcHJvcGVydHkgdG8gdGhlIGVtcHR5IHN0cmluZywgIiIsIG5vIFhTTFQgdHJhbnNmb3JtCitpcyBkZWNsYXJlZCBhdCBhbGwuCis8L3A+CisKKzxibG9ja3F1b3RlPgorCis8cD48Y29kZT5hbnQgLWxpc3RlbmVyIG9yZy5hcGFjaGUudG9vbHMuYW50LlhtbExvZ2dlcjwvY29kZT48YnI+Cis8Y29kZT5hbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5YbWxMb2dnZXIgLXZlcmJvc2UgLWxvZ2ZpbGUgYnVpbGRfbG9nLnhtbDwvY29kZT48L3A+CisKKzwvYmxvY2txdW90ZT4KKworCis8aDM+PGEgbmFtZT0iVGltZXN0YW1wZWRMb2dnZXIiPlRpbWVzdGFtcGVkTG9nZ2VyPC9hPjwvaDM+CisKKzxwPgorICBBY3RzIGxpa2UgdGhlIGRlZmF1bHQgbG9nZ2VyLCBleGNlcHQgdGhhdCB0aGUgZmluYWwgc3VjY2Vzcy9mYWlsdXJlIG1lc3NhZ2UgYWxzbyBpbmNsdWRlcworICB0aGUgdGltZSB0aGF0IHRoZSBidWlsZCBjb21wbGV0ZWQuIEZvciBleGFtcGxlOgorPC9wPgorPHByZT4KKyAgQlVJTEQgU1VDQ0VTU0ZVTCAtIGF0IDE2LzA4LzA1IDE2OjI0Cis8L3ByZT4KKzxwPlRvIHVzZSB0aGlzIGxpc3RlbmVyLCB1c2UgdGhlIGNvbW1hbmQ6PC9wPgorCis8YmxvY2txdW90ZT4KKworPGNvZGU+YW50ICAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLlRpbWVzdGFtcGVkTG9nZ2VyPC9jb2RlPgorCis8L2Jsb2NrcXVvdGU+CisKKzxoMz48YSBuYW1lPSJCaWdQcm9qZWN0TG9nZ2VyIj5CaWdQcm9qZWN0TG9nZ2VyPC9hPjwvaDM+CisKKzxwPgorICBUaGlzIGxvZ2dlciBpcyBkZXNpZ25lZCB0byBtYWtlIGV4YW1pbmluZyB0aGUgbG9ncyBvZiBhIGJpZyBidWlsZCBlYXNpZXIsCisgIGVzcGVjaWFsbHkgdGhvc2UgcnVuIHVuZGVyIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gdG9vbHMuIEl0Cis8L3A+Cis8b2w+CisgIDxsaT5XaGVuIGVudGVyaW5nIGEgY2hpbGQgcHJvamVjdCwgcHJpbnRzIGl0cyBuYW1lIGFuZCBkaXJlY3Rvcnk8L2xpPgorICA8bGk+V2hlbiBleGl0aW5nIGEgY2hpbGQgcHJvamVjdCwgcHJpbnRzIGl0cyBuYW1lPC9saT4KKyAgPGxpPkluY2x1ZGVzIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHdoZW4gcHJpbnRpbmcgYSB0YXJnZXQ8L2xpPgorICA8bGk+T21pdHMgbG9nZ2luZyB0aGUgbmFtZXMgb2YgYWxsIHRhcmdldHMgdGhhdCBoYXZlIG5vIGRpcmVjdCB0YXNrIG91dHB1dDwvbGk+CisgIDxsaT5JbmNsdWRlcyB0aGUgYnVpbGQgZmluaXNoZWQgdGltZXN0YW1wIG9mIHRoZSBUaW1lU3RhbXAgbG9nZ2VyPC9saT4KKzwvb2w+Cis8cD4KKyAgVGhpcyBpcyB1c2VmdWwgd2hlbiB1c2luZyAmbHQ7c3ViYW50Jmd0OyB0byBidWlsZCBhIGxhcmdlIHByb2plY3QKKyAgZnJvbSBtYW55IHNtYWxsZXIgcHJvamVjdHMgLXRoZSBvdXRwdXQgc2hvd3Mgd2hpY2ggcGFydGljdWxhcgorICBwcm9qZWN0IGlzIGJ1aWxkaW5nLiBIZXJlIGlzIGFuIGV4YW1wbGUgaW4gd2hpY2ggImNsZWFuIiBpcyBiZWluZyBjYWxsZWQKKyAgb24gYWxsIGEgbnVtYmVyIG9mIGNoaWxkIHByb2plY3RzLCBvbmx5IHNvbWUgb2Ygd2hpY2ggcGVyZm9ybSB3b3JrOgorPC9wPgorPHByZT4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRW50ZXJpbmcgcHJvamVjdCAieHVuaXQiCitJbiAvaG9tZS9hbnQvY29tcG9uZW50cy94dW5pdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit4dW5pdC5jbGVhbjoKKyAgIFtkZWxldGVdIERlbGV0aW5nIGRpcmVjdG9yeSAvaG9tZS9hbnQvY29tcG9uZW50cy94dW5pdC9idWlsZAorICAgW2RlbGV0ZV0gRGVsZXRpbmcgZGlyZWN0b3J5IC9ob21lL2FudC9jb21wb25lbnRzL3h1bml0L2Rpc3QKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRXhpdGluZyBwcm9qZWN0ICJ4dW5pdCIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRW50ZXJpbmcgcHJvamVjdCAianVuaXQiCitJbiAvaG9tZS9hbnQvY29tcG9uZW50cy9qdW5pdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitFeGl0aW5nIHByb2plY3QgImp1bml0IgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorPC9wcmU+CisKKzxwPgorICBUaGUgZW50cnkgYW5kIGV4aXQgbWVzc2FnZXMgYXJlIHZlcnkgdmVyYm9zZSBpbiB0aGlzIGV4YW1wbGUsIGJ1dCBpbgorICBhIGJpZyBwcm9qZWN0IGNvbXBpbGluZyBvciB0ZXN0aW5nIG1hbnkgY2hpbGQgY29tcG9uZW50cywgdGhlIG1lc3NhZ2VzCisgIGFyZSByZWR1Y2VkIHRvIGJlY29taW5nIGNsZWFyIGRlbGltaXRlcnMgb2Ygd2hlcmUgZGlmZmVyZW50IHByb2plY3RzCisgIGFyZSBpbiBjaGFyZ2UgLW9yIG1vcmUgaW1wb3J0YW50bHksIHdoaWNoIHByb2plY3QgaXMgZmFpbGluZy4KKzwvcD4KKworPHA+VG8gdXNlIHRoaXMgbGlzdGVuZXIsIHVzZSB0aGUgY29tbWFuZDo8L3A+Cis8YmxvY2txdW90ZT4KKworPGNvZGU+YW50ICAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLkJpZ1Byb2plY3RMb2dnZXI8L2NvZGU+CisKKzwvYmxvY2txdW90ZT4KKworPGgyPjxhIG5hbWU9ImRldiI+V3JpdGluZyB5b3VyIG93bjwvYT48L2gyPgorCis8cD5TZWUgdGhlIDxhIGhyZWY9ImRldmVsb3AuaHRtbCNidWlsZGV2ZW50cyI+QnVpbGQgRXZlbnRzPC9hPiBzZWN0aW9uIGZvcgorZGV2ZWxvcGVycy48L3A+CisKKzxwPk5vdGVzOjwvcD4KKworPHVsPgorICA8bGk+CisgICAgQSBsaXN0ZW5lciBvciBsb2dnZXIgc2hvdWxkIG5vdCB3cml0ZSB0byBzdGFuZGFyZCBvdXRwdXQgb3IgZXJyb3IgaW4gdGhlIDxjb2RlPm1lc3NhZ2VMb2dnZWQoKSBtZXRob2Q8L2NvZGU+OworICAgIEFudCBjYXB0dXJlcyB0aGVzZSBpbnRlcm5hbGx5IGFuZCBpdCB3aWxsIHRyaWdnZXIgYW4gaW5maW5pdGUgbG9vcC4KKyAgPC9saT4KKyAgPGxpPgorICAgIExvZ2dpbmcgaXMgc3luY2hyb25vdXM7IGFsbCBsaXN0ZW5lcnMgYW5kIGxvZ2dlcnMgYXJlIGNhbGxlZCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCB3aXRoIHRoZSBidWlsZCBibG9ja2luZyB1bnRpbAorICAgIHRoZSBvdXRwdXQgaXMgcHJvY2Vzc2VkLiBTbG93IGxvZ2dpbmcgbWVhbnMgYSBzbG93IGJ1aWxkLgorICA8L2xpPgorICA8bGk+V2hlbiBhIGJ1aWxkIGlzIHN0YXJ0ZWQsIGFuZCA8Y29kZT5CdWlsZExpc3RlbmVyLmJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KTwvY29kZT4gaXMgY2FsbGVkLAorICAgIHRoZSBwcm9qZWN0IGlzIG5vdCBmdWxseSBmdW5jdGlvbmFsLiBUaGUgYnVpbGQgaGFzIHN0YXJ0ZWQsIHllcywgYW5kIHRoZSBldmVudC5nZXRQcm9qZWN0KCkgbWV0aG9kIGNhbGwKKyAgICByZXR1cm5zIHRoZSBQcm9qZWN0IGluc3RhbmNlLCBidXQgdGhhdCBwcm9qZWN0IGlzIGluaXRpYWxpemVkIHdpdGggSlZNIGFuZCBhbnQgcHJvcGVydGllcywgbm9yIGhhcyBpdAorICAgIHBhcnNlZCB0aGUgYnVpbGQgZmlsZSB5ZXQuIFlvdSBjYW5ub3QgY2FsbCA8Y29kZT5Qcm9qZWN0LmdldFByb3BlcnR5KCk8L2NvZGU+IGZvciBwcm9wZXJ0eSBsb29rdXAsIG9yCisgICAgPGNvZGU+UHJvamVjdC5nZXROYW1lKCk8L2NvZGU+IHRvIGdldCB0aGUgcHJvamVjdCBuYW1lIChpdCB3aWxsIHJldHVybiBudWxsKS4KKyAgPC9saT4KKyAgPGxpPgorICAgIENsYXNzZXMgdGhhdCBpbXBsZW1lbnQgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuU3ViQnVpbGRMaXN0ZW5lcjwvY29kZT4gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gY2hpbGQgcHJvamVjdHMKKyAgICBzdGFydCBhbmQgc3RvcC4KKyAgPC9saT4KKworPC91bD4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL29wdGlvbmFsdGFza2xpc3QuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL29wdGlvbmFsdGFza2xpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWYxNDZhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvb3B0aW9uYWx0YXNrbGlzdC5odG1sCkBAIC0wLDAgKzEsOTIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KKzx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KKzxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgaHJlZj0idG9jLmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPlRhYmxlIG9mIENvbnRlbnRzPC9hPjwvaDI+CisKKzxhIGhyZWY9ImNvcmV0YXNrbGlzdC5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5Db3JlIFRhc2tzPC9hPjxici8+Cis8YSBocmVmPSJ0YXNrc292ZXJ2aWV3Lmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5PdmVydmlldyBvZiBBbnQgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9ImNvbmNlcHRzdHlwZXNsaXN0Lmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPkNvbmNlcHRzIGFuZCBUeXBlczwvYT48YnIvPgorCis8aDM+T3B0aW9uYWwgVGFza3M8L2gzPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9kb3RuZXQuaHRtbCI+PGk+Lk5FVCBUYXNrczwvaT48L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvYW50bHIuaHRtbCI+QU5UTFI8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvYXR0cmliLmh0bWwiPkF0dHJpYjwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9jYWIuaHRtbCI+Q2FiPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2NoZ3JwLmh0bWwiPkNoZ3JwPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2Nob3duLmh0bWwiPkNob3duPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2NsZWFyY2FzZS5odG1sIj5DbGVhcmNhc2UgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvY2NtLmh0bWwiPkNvbnRpbnV1cy9TeW5lcmd5IFRhc2tzPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2RlcGVuZC5odG1sIj5EZXBlbmQ8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvZWpiLmh0bWwiPkVKQiBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9lY2hvcHJvcGVydGllcy5odG1sIj5FY2hvcHJvcGVydGllczwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9mdHAuaHRtbCI+RlRQPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2ltYWdlLmh0bWwiPkltYWdlPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2phcmxpYi1hdmFpbGFibGUuaHRtbCI+SmFybGliLWF2YWlsYWJsZTwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qYXJsaWItZGlzcGxheS5odG1sIj5KYXJsaWItZGlzcGxheTwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qYXJsaWItbWFuaWZlc3QuaHRtbCI+SmFybGliLW1hbmlmZXN0PC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2phcmxpYi1yZXNvbHZlLmh0bWwiPkphcmxpYi1yZXNvbHZlPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2phdmFjYy5odG1sIj5KYXZhQ0M8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvamF2YWguaHRtbCI+SmF2YWg8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvanNwYy5odG1sIj5Kc3BDPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2pkZXBlbmQuaHRtbCI+SkRlcGVuZDwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qamRvYy5odG1sIj5KSkRvYzwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qanRyZWUuaHRtbCI+SkpUcmVlPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL2psaW5rLmh0bWwiPjxpPkpsaW5rPC9pPjwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qdW5pdC5odG1sIj5KVW5pdDwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qdW5pdHJlcG9ydC5odG1sIj5KVW5pdFJlcG9ydDwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9taW1lbWFpbC5odG1sIj48aT5NaW1lTWFpbDwvaT48L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvbmF0aXZlMmFzY2lpLmh0bWwiPk5hdGl2ZTJBc2NpaTwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9uZXRyZXh4Yy5odG1sIj5OZXRSZXh4QzwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9wZXJmb3JjZS5odG1sIj5QZXJmb3JjZSBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9wcm9wZXJ0eWZpbGUuaHRtbCI+UHJvcGVydHlGaWxlPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3B2Y3N0YXNrLmh0bWwiPlB2Y3M8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvcmVuYW1lZXh0ZW5zaW9ucy5odG1sIj48aT5SZW5hbWVFeHRlbnNpb25zPC9pPjwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9yZXBsYWNlcmVnZXhwLmh0bWwiPlJlcGxhY2VSZWdFeHA8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvcmV4ZWMuaHRtbCI+UkV4ZWM8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvcnBtLmh0bWwiPlJwbTwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9zY2hlbWF2YWxpZGF0ZS5odG1sIj5TY2hlbWFWYWxpZGF0ZTwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9zY3AuaHRtbCI+U2NwPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3NjcmlwdC5odG1sIj5TY3JpcHQ8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvc2NyaXB0ZGVmLmh0bWwiPlNjcmlwdGRlZjwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9zZXJ2ZXJkZXBsb3kuaHRtbCI+U2VydmVyRGVwbG95PC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3NldHByb3h5Lmh0bWwiPlNldHByb3h5PC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3NvdW5kLmh0bWwiPlNvdW5kPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3Nvcy5odG1sIj5Tb3VyY2VPZmZTaXRlPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3NwbGFzaC5odG1sIj5TcGxhc2g8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvc3NoZXhlYy5odG1sIj5Tc2hleGVjPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3N0YXJ0ZWFtLmh0bWwiPlN0YXJ0ZWFtIFRhc2tzPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3N0eWxlYm9vay5odG1sIj48aT5TdHlsZWJvb2s8L2k+PC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3N5bWxpbmsuaHRtbCI+U3ltbGluazwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy90ZWxuZXQuaHRtbCI+VGVsbmV0PC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3RyYW5zbGF0ZS5odG1sIj5UcmFuc2xhdGU8L2E+PGJyLz4KKzxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvdnNzLmh0bWwjdGFza3MiPk1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZSBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy93bGpzcGMuaHRtbCI+V2VibG9naWMgSlNQIENvbXBpbGVyPC9hPjxici8+Cis8YSBocmVmPSJPcHRpb25hbFRhc2tzL3htbHZhbGlkYXRlLmh0bWwiPlhtbFZhbGlkYXRlPC9hPjxici8+CisKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvcGxhdGZvcm0uaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL3BsYXRmb3JtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0ODkzYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL3BsYXRmb3JtLmh0bWwKQEAgLTAsMCArMSwyMDUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UGxhdGZvcm0gSXNzdWVzPC90aXRsZT4KKzwvaGVhZD4KKworPGgxPlBsYXRmb3JtIElzc3VlczwvaDE+CisKKzxoMj5KYXZhIHZlcnNpb25zPC9oMj4KKzxoMz5KYXZhIDEuNTwvaDM+CisKK1lvdSBtYXkgbmVlZCBhIGJpZ2dlciBzdGFjayB0aGFuIGRlZmF1bHQsIGVzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyB0aGUgYnVpbHQgaW4KK1hTTFQgZW5naW5lLiBXZSByZWNvbW1lbmQgeW91IHVzZSBBcGFjaGUgWGFsYW47IGluZGVlZCwgc29tZSB0YXNrcyAoSlVuaXQgcmVwb3J0IGluIFhNTCwKK2ZvciBleGFtcGxlKSBtYXkgbm90IHdvcmsgYWdhaW5zdCB0aGUgc2hpcHBpbmcgWFNMIGVuZ2luZS4KKworPGgzPkphdmEgMS4yPC9oMz4KKworCitZb3UgbWF5IHNvbWV0aW1lcyBzZWUgbWVzc2FnZXMgbGlrZQorPHByZT4KK0Egbm9uZmF0YWwgaW50ZXJuYWwgSklUICgzLjEwLjEwNyh4KSkgZXJyb3IgJ2NoZ1Rhcmc6IENvbmRpdGlvbmFsJyBoYXMKK29jY3VycmVkIGluIDoKKyAgJ29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3QuYWRkUmVmZXJlbmNlCisoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9PYmplY3Q7KVYnOiBJbnRlcnByZXRpbmcgbWV0aG9kLgorICBQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IgaW4gZGV0YWlsIHRvCisgIGh0dHA6Ly9qYXZhLnN1bi5jb20vY2dpLWJpbi9idWdyZXBvcnQuY2dpCis8L3ByZT4KK1RoZXNlIGFyZSBjYXVzZWQgYnkgc3VidGxlIGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4gdGhlIEphdmExLjQrIGNvbXBpbGVkCityZWxlYXNlOyBidWdzIGluIHRoZSBKYXZhIHJ1bnRpbWUgdGhhdCBTdW4gd29uJ3QgZml4LiBQb3NzaWJsZSBzb2x1dGlvbnM6LQorPG9sPgorPGxpPlVwZ3JhZGUgeW91ciBKVk0uCis8bGk+UmVjb21waWxlIEFudCBvbiBhIEphdmExLjIgbWFjaGluZQorPGxpPkFkZCA8dHQ+LURqYXZhLmNvbXBpbGVyPU5PTkU8L3R0PiB0bwordGhlIHZhbHVlIG9mIHlvdXIgQU5UX09QVFMgZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoaXMgdHVybnMgdGhlIEpJVCBvZmYuCis8bGk+SWdub3JlIHRoZSBtZXNzYWdlcy4KKzwvb2w+CisKKworCisKKzxoMj5Vbml4IGFuZCBMaW51eDwvaDI+CisKKzx1bD4KKzxsaT4gWW91IHNob3VsZCB1c2UgYSBHTlUgdmVyc2lvbiBvZiA8dHQ+dGFyPC90dD4gdG8gdW50YXIgdGhlIEFwYWNoZSAKK0FudCBzb3VyY2UgdHJlZSwgaWYgeW91IGhhdmUgZG93bmxvYWRlZCB0aGlzIGFzIGEgdGFyIGZpbGUuIElmIHlvdSBnZXQKK3dpZXJkIGVycm9ycyBhYm91dCBtaXNzaW5nIGZpbGVzLCB0aGlzIGlzIHRoZSBwcm9ibGVtLiAKKzwvbGk+Cis8bGk+IEFudCBkb2VzIG5vdCBwcmVzZXJ2ZSBmaWxlIHBlcm1pc3Npb25zIHdoZW4gYSBmaWxlIGlzIGNvcGllZCwgbW92ZWQgb3IgCithcmNoaXZlZCwgYmVjYXVzZSBKYXZhIGRvZXMgbm90IGxldCBpdCByZWFkIG9yIHdyaXRlIHRoZSBwZXJtaXNzaW9ucy4KKyBVc2UgPHR0PiZsdDtjaG1vZCZndDs8L3R0PiB0byBzZXQgcGVybWlzc2lvbnMsIGFuZCB3aGVuIGNyZWF0aW5nIGEgCit0YXIgYXJjaGl2ZSwgdXNlIHRoZSA8dHQ+bW9kZTwvdHQ+IGF0dHJpYnV0ZSBvZiA8dHQ+Jmx0O3RhcmZpbGVzZXQmZ3Q7PC90dD4KK3RvIHNldCB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIHRhciBmaWxlLCBvciA8Y29kZT4mbHQ7YXBwbHkmZ3Q7PC9jb2RlPiB0aGUgcmVhbCB0YXIgcHJvZ3JhbS4KKzwvbGk+Cis8bGk+IEFudCBpcyBub3Qgc3ltYm9saWMgbGluayBhd2FyZSBpbiBtb3ZlcywgZGVsZXRlcyBhbmQgd2hlbiByZWN1cnNpbmcgZG93biBhIHRyZWUKK29mIGRpcmVjdG9yaWVzIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBmaWxlcy4gVW5leHBlY3RlZCB0aGluZ3MgY2FuIGhhcHBlbi4KKzwvbGk+Cis8bGk+IExpbnV4IG9uIElBLTY0OiBhcHBhcmVudGx5IHlvdSBuZWVkIGEgbGFyZ2VyIGhlYXAgdGhhbiB0aGUgZGVmYXVsdAorb25lICg2NE0pIHRvIGNvbXBpbGUgYmlnIHByb2plY3RzLiBJZiB5b3UgZ2V0IG91dCBvZiBoZWFwCitlcnJvcnMsIGVpdGhlciBpbmNyZWFzZSB0aGUgaGVhcCBvciB1c2UgYSBmb3JraW5nIGphdmFjLiBCZXR0ZXIgeWV0LAordXNlIGppa2VzIGZvciBleHRyYSBjb21waWxhdGlvbiBzcGVlZC4gICAKKzwvbGk+CisKKzwvdWw+CisKKworPGgyPk1pY3Jvc29mdCBXaW5kb3dzPC9oMj4KKzxwPgorV2luZG93cyA5eCAod2luOTUsIHdpbjk4LCB3aW45OFNFIGFuZCB3aW5NRSkgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gQW50MS43LAorPC9wPgorCis8cD4KK1RoZSBBbnQgdGVhbSBoYXMgcmV0aXJlZCBzdXBwb3J0IGZvciB0aGVzZSBwcm9kdWN0cyBiZWNhdXNlIHRoZXkgYXJlIG91dGRhdGVkIGFuZAorY2FuIGV4cG9zZSBjdXN0b21lcnMgdG8gc2VjdXJpdHkgcmlza3MuIFdlIHJlY29tbWVuZCB0aGF0IGN1c3RvbWVycyB3aG8gYXJlCitzdGlsbCBydW5uaW5nIFdpbmRvd3MgOTggb3IgV2luZG93cyBNZSB1cGdyYWRlIHRvIGEgbmV3ZXIsIG1vcmUgc2VjdXJlIAorb3BlcmF0aW5nIHN5c3RlbSwgYXMgc29vbiBhcyBwb3NzaWJsZS4KKzwvcD4KKzxwPgorQ3VzdG9tZXJzIHdobyB1cGdyYWRlIHRvIExpbnV4IHJlcG9ydCBpbXByb3ZlZCBzZWN1cml0eSwgcmljaGVyCitmdW5jdGlvbmFsaXR5LCBhbmQgaW5jcmVhc2VkIHByb2R1Y3Rpdml0eS4gCis8L3A+Cis8aDI+TWljcm9zb2Z0IFdpbmRvd3MgMkssIFhQIGFuZCBTZXJ2ZXIgMkswMyA8L2gyPgorCis8cD4KK1dpbmRvd3MgOXggKHdpbjk1LCB3aW45OCwgd2luOThTRSBhbmQgd2luTUUpIGhhcyBhIGJhdGNoIGZpbGUgc3lzdGVtIHdoaWNoCitkb2VzIG5vdCB3b3JrIGZ1bGx5IHdpdGggbG9uZyBmaWxlIG5hbWVzLCBzbyB3ZSByZWNvbW1lbmQgdGhhdCBhbnQgYW5kIHRoZSBKREsKK2FyZSBpbnN0YWxsZWQgaW50byBkaXJlY3RvcmllcyB3aXRob3V0IHNwYWNlcywgYW5kIHdpdGggOC4zIGZpbGVuYW1lcy4gCitUaGUgUGVybCBhbmQgUHl0aG9uIGxhdW5jaGVyIHNjcmlwdHMgZG8gbm90IHN1ZmZlciBmcm9tIHRoaXMgbGltaXRhdGlvbi4KKzwvcD4KKzxwPgorQWxsIHZlcnNpb25zIG9mIHdpbmRvd3MgYXJlIHVzdWFsbHkgY2FzZSBpbnNlbnNpdGl2ZSwgYWx0aG91Z2ggbW91bnRlZCAKK2ZpbGUgc3lzdGVtcyAoVW5peCBkcml2ZXMsIENsZWFyY2FzZSB2aWV3cykgY2FuIGJlIGNhc2Ugc2Vuc2l0aXZlIHVuZGVybmVhdGgsCitjb25mdXNpbmcgcGF0dGVybnNldHMuCis8L3A+Cis8cD4KK0FudCBjYW4gb2Z0ZW4gbm90IGRlbGV0ZSBhIGRpcmVjdG9yeSB3aGljaCBpcyBvcGVuIGluIGFuIEV4cGxvcmVyIHdpbmRvdy4gCitUaGVyZSBpcyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGlzIHNob3J0IG9mIHNwYXduaW5nIGEgcHJvZ3JhbSB0byBraWxsCit0aGUgc2hlbGwgYmVmb3JlIGRlbGV0aW5nIGRpcmVjdG9yaWVzLgorTm9yIGNhbiBmaWxlcyB0aGF0IGFyZSBpbiB1c2UgYmUgb3ZlcndyaXR0ZW4uCis8L3A+Cis8cD4KKyAgICBGaW5hbGx5LCBpZiBhbnkgQW50IHRhc2sgZmFpbHMgd2l0aCBhbiBJT0Vycm9yPTIsIGl0IG1lYW5zIHRoYXQgd2hhdGV2ZXIKKyAgICBuYXRpdmUgcHJvZ3JhbSBBbnQgaXMgdHJ5aW5nIHRvIHJ1biwgaXQgaXMgbm90IG9uIHRoZSBwYXRoLgorPC9wPgorCis8aDI+TWljcm9zb2Z0IFdpbmRvd3MgVmlzdGE8L2gyPgorPHA+CisgICAgVGhlcmUgYXJlIHJlcG9ydHMgb2YgcHJvYmxlbXMgd2l0aCBXaW5kb3dzIFZpc3RhIHNlY3VyaXR5IGJyaW5naW5nIHVwCisgICAgZGlhbG9nIGJveGVzIGFza2luZyBpZiB0aGUgdXNlciB3YW50cyB0byBydW4gYW4gdW50cnVzdGVkIGV4ZWN1dGFibGUKKyAgICBkdXJpbmcgYW4gYW50IHJ1biwgc3VjaCBhcyB3aGVuIHRoZSAmbHQ7c2lnbmphciZndCB0YXNrIHJ1bnMgdGhlIGphcnNpZ25lci5leGUKKyAgICBwcm9ncmFtLiBUaGlzIGlzIGJleW9uZCBBbnQncyBjb250cm9sLCBhbmQgc3RlbXMgZnJvbSB0aGUgT1MgdHJ5aW5nIHRvIHByb3ZpZGUKKyAgICBzb21lIGlsbHVzaW9uIG9mIHNlY3VyaXR5IGJ5IGJlaW5nIHJlbHVjdGFudCB0byBydW4gdW5zaWduZWQgbmF0aXZlIGV4ZWN1dGFibGVzLgorICAgIFRoZSBsYXRlc3QgSmF2YSB2ZXJzaW9ucyBhcHBlYXIgdG8gcmVzb2x2ZSB0aGlzIHByb2JsZW0gYnkgaGF2aW5nIHNpZ25lZAorICAgIGJpbmFyaWVzLiAKKzwvcD4KKworCis8aDI+Q3lnd2luPC9oMj4KKworQ3lnd2luIGlzIG5vdCBhbiBvcGVyYXRpbmcgc3lzdGVtOyByYXRoZXIgaXQgaXMgYW4gYXBwbGljYXRpb24gc3VpdGUgCitydW5uaW5nIHVuZGVyIFdpbmRvd3MgYW5kIHByb3ZpZGluZyBzb21lIFVOSVggbGlrZSBmdW5jdGlvbmFsaXR5LiBTdW4gaGFzIAorbm90IGNyZWF0ZWQgYW55IHNwZWNpZmljIEphdmEgRGV2ZWxvcG1lbnQgS2l0IG9yIEphdmEgUnVudGltZSBFbnZpcm9ubWVudCBmb3IgCitjeWd3aW4uIFNlZSB0aGlzIGxpbmsgOiAKKzxhIGhyZWY9Imh0dHA6Ly93d3cuaW5vbml0LmNvbS9jeWd3aW4vZmFxLyI+aHR0cDovL3d3dy5pbm9uaXQuY29tL2N5Z3dpbi9mYXEvPC9hPiAuIAorT25seSBXaW5kb3dzIHBhdGggCituYW1lcyBhcmUgc3VwcG9ydGVkIGJ5IEpESyBhbmQgSlJFIHRvb2xzIHVuZGVyIFdpbmRvd3Mgb3IgY3lnd2luLiBSZWxhdGl2ZSBwYXRoIAorbmFtZXMgc3VjaCBhcyAic3JjL29yZy9hcGFjaGUvdG9vbHMiIGFyZSBzdXBwb3J0ZWQsIGJ1dCBKYXZhIHRvb2xzIGRvIG5vdCAKK3VuZGVyc3RhbmQgL2N5Z2RyaXZlL2MgdG8gbWVhbiBjOlwuCis8cD4KK1RoZSB1dGlsaXR5IGN5Z3BhdGggKHVzZWQgaW5kdXN0cmlhbGx5IGluIHRoZSBhbnQgc2NyaXB0IHRvIHN1cHBvcnQgY3lnd2luKSBjYW4gCitjb252ZXJ0IGN5Z3dpbiBwYXRoIG5hbWVzIHRvIFdpbmRvd3MuCitZb3UgY2FuIHVzZSB0aGUgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrIGluIGFudCB0byBjb252ZXJ0IGN5Z3dpbiBwYXRocyB0byBXaW5kb3dzIHBhdGgsIGZvciAKK2luc3RhbmNlIGxpa2UgdGhhdCA6Cis8cHJlPgorJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7c29tZS5jeWd3aW4ucGF0aCZxdW90OyB2YWx1ZT0mcXVvdDsvY3lnZHJpdmUvaC9zb21lcGF0aCZxdW90Oy8mZ3Q7CismbHQ7ZXhlYyBleGVjdXRhYmxlPSZxdW90O2N5Z3BhdGgmcXVvdDsgb3V0cHV0cHJvcGVydHk9JnF1b3Q7d2luZG93cy5wYXRobmFtZSZxdW90OyZndDsKKyAgICZsdDthcmcgdmFsdWU9JnF1b3Q7LS13aW5kb3dzJnF1b3Q7LyZndDsKKyAgICZsdDthcmcgdmFsdWU9JnF1b3Q7JHtzb21lLmN5Z3dpbi5wYXRofSZxdW90Oy8mZ3Q7CismbHQ7L2V4ZWMmZ3Q7CismbHQ7ZWNobyBtZXNzYWdlPSZxdW90OyR7d2luZG93cy5wYXRobmFtZX0mcXVvdDsvJmd0OworPC9wcmU+CisKK1dlIGdldCBsb3RzIG9mIHN1cHBvcnQgY2FsbHMgZnJvbSBDeWd3aW4gdXNlcnMuIEVpdGhlciBpdCBpcyBpbmNyZWRpYmx5Citwb3B1bGFyLCBvciBpdCBpcyB0cm91YmxlLiBJZiB5b3UgZG8gdXNlIGl0LCByZW1lbWJlciB0aGF0IEphdmEgaXMgYQorV2luZG93cyBhcHBsaWNhdGlvbiwgc28gQW50IGlzIHJ1bm5pbmcgaW4gYSBXaW5kb3dzIHByb2Nlc3MsIG5vdCBhCitDeWd3aW4gb25lLiBUaGlzIHdpbGwgc2F2ZSB1cyBoYXZpbmcgdG8gbWFyayB5b3VyIGJ1ZyByZXBvcnRzIGFzIGludmFsaWQuIAorCis8aDI+QXBwbGUgTWFjT1MgWDwvaDI+CisKK01hY09TIFggaXMgdGhlIGZpcnN0IG9mIHRoZSBBcHBsZSBwbGF0Zm9ybXMgdGhhdCBBbnQgc3VwcG9ydHMgY29tcGxldGVseTsKK2l0IGlzIHRyZWF0ZWQgbGlrZSBhbnkgb3RoZXIgVW5peC4gCisKKzxoMj5Ob3ZlbGwgTmV0d2FyZTwvaDI+CisKKzxwPlRvIGdpdmUgdGhlIHNhbWUgbGV2ZWwgb2Ygc29waGlzdGljYXRlZCBjb250cm9sIGFzIEFudCdzIHN0YXJ0dXAgc2NyaXB0cyBvbiBvdGhlciBwbGF0Zm9ybXMsIGl0IHdhcyBkZWNpZGVkIHRvIG1ha2UgdGhlIG1haW4gYW50IHN0YXJ0dXAgb24gTmV0V2FyZSBiZSB2aWEgYSBQZXJsIFNjcmlwdCwgInJ1bmFudC5wbCIuICBUaGlzIGlzIGZvdW5kIGluIHRoZSBiaW4gZGlyZWN0b3J5IChmb3IgaW5zdGFuY2UgLSBib290c3RyYXBcYmluIG9yIGRpc3RcYmluKS48L3A+CisKKzxwPk9uZSBpbXBvcnRhbnQgaXRlbSBvZiBub3RlIGlzIHRoYXQgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBmb2xsb3dpbmcgdG8gcnVuIGFudDo8L3A+Cis8dWw+PGxpPjxjb2RlPkNMQVNTUEFUSDwvY29kZT4gLSBwdXQgYW50LmphciwgeGVyY2VzSW1wbC5qYXIsIHhtbC1hcGlzLmphciBhbmQgYW55IG90aGVyIG5lZWRlZCBqYXJzIG9uIHRoZSBzeXN0ZW0gY2xhc3NwYXRoLjwvbGk+CisgICA8bGk+PGNvZGU+QU5UX09QVFM8L2NvZGU+IC0gT24gTmV0V2FyZSwgPGNvZGU+QU5UX09QVFM8L2NvZGU+IG5lZWRzIHRvIGluY2x1ZGUgYSBwYXJhbWV0ZXIgb2YgdGhlIGZvcm0sIDxub2JyPiItZW52Q1dEPTxjb2RlPkFOVF9IT01FPC9jb2RlPiI8L25vYnI+LCB3aXRoIDxjb2RlPkFOVF9IT01FPC9jb2RlPiBiZWluZyB0aGUgZnVsbHkgZXhwYW5kZWQgbG9jYXRpb24gb2YgQW50LCA8Yj5ub3Q8L2I+IGFuIGVudmlyb25tZW50IHZhcmlhYmxlLiAgVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgTmV0V2FyZSBTeXN0ZW0gQ29uc29sZSBoYXMgbm8gbm90aW9uIG9mIGEgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS48L2xpPgorPC91bD4KKzxwPkl0IGlzIHN1Z2dlc3RlZCB0aGF0IHlvdSBjcmVhdGUgdXAgYW4gYW50Lm5jZiB0aGF0IHNldHMgdXAgdGhlc2UgcGFyYW1ldGVycywgYW5kIGNhbGxzIDxjb2RlPnBlcmwgQU5UX0hPTUUvZGlzdC9iaW4vcnVuYW50LnBsPC9jb2RlPjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBzdWNoIGFuIE5DRiBmaWxlKGFzc3VtaW5nIGFudCBpcyBpbnN0YWxsZWQgaW4gPG5vYnI+J3N5czovYXBhY2hlLWFudC8nKTo8L25vYnI+PC9wPgorPGNvZGU+CisgICAmbmJzcDsmbmJzcDsmbmJzcDtlbnZzZXQgQ0xBU1NQQVRIPVNZUzovYXBhY2hlLWFudC9ib290c3RyYXAvbGliL2FudC5qYXI8YnI+CisgICAmbmJzcDsmbmJzcDsmbmJzcDtlbnZzZXQgQ0xBU1NQQVRIPSRDTEFTU1BBVEg7U1lTOi9hcGFjaGUtYW50L2xpYi94ZXJjZXNJbXBsLmphciA8YnI+CisgICAmbmJzcDsmbmJzcDsmbmJzcDtlbnZzZXQgQ0xBU1NQQVRIPSRDTEFTU1BBVEg7U1lTOi9hcGFjaGUtYW50L2xpYi94bWwtYXBpcy5qYXIgPGJyPgorICAgJm5ic3A7Jm5ic3A7Jm5ic3A7ZW52c2V0IENMQVNTUEFUSD0kQ0xBU1NQQVRIO1NZUzovYXBhY2hlLWFudC9saWIvb3B0aW9uYWwvanVuaXQuamFyIDxicj4KKyAgICZuYnNwOyZuYnNwOyZuYnNwO2VudnNldCBDTEFTU1BBVEg9JENMQVNTUEFUSDtTWVM6L2FwYWNoZS1hbnQvYm9vdHN0cmFwL2xpYi9vcHRpb25hbC5qYXIgPGJyPgorPGJyPgorICAgJm5ic3A7Jm5ic3A7Jm5ic3A7c2V0ZW52IEFOVF9PUFRTPS1lbnZDV0Q9c3lzOi9hcGFjaGUtYW50IDxicj4KKyAgICZuYnNwOyZuYnNwOyZuYnNwO2VudnNldCBBTlRfT1BUUz0tZW52Q1dEPXN5czovYXBhY2hlLWFudCA8YnI+CisgICAmbmJzcDsmbmJzcDsmbmJzcDtzZXRlbnYgQU5UX0hPTUU9c3lzOi9hcGFjaGUtYW50L2Rpc3QvbGliIDxicj4KKyAgICZuYnNwOyZuYnNwOyZuYnNwO2VudnNldCBBTlRfSE9NRT1zeXM6L2FwYWNoZS1hbnQvZGlzdC9saWIgPGJyPgorPGJyPgorICAgJm5ic3A7Jm5ic3A7Jm5ic3A7cGVybCBzeXM6L2FwYWNoZS1hbnQvZGlzdC9iaW4vcnVuYW50LnBsIDxicj4KKzwvY29kZT4KKworPHA+QW50IHdvcmtzIG9uIEpWTSB2ZXJzaW9uIDEuMyBvciBoaWdoZXIuICBZb3UgbWF5IGhhdmUgc29tZSBsdWNrIHJ1bm5pbmcgaXQgb24gSlZNIDEuMiwgYnV0IHNlcmlvdXMgcHJvYmxlbXMgaGF2ZSBiZWVuIGZvdW5kIHJ1bm5pbmcgQW50IG9uIEpWTSAxLjEuN0IuICBUaGVzZSBwcm9ibGVtcyBhcmUgY2F1c2VkIGJ5IEpWTSBidWdzIHRoYXQgd2lsbCBub3QgYmUgZml4ZWQuPC9wPgorPHA+SlZNIDEuMyBpcyBzdXBwb3J0ZWQgb24gTm92ZWxsIE5ldFdhcmUgdmVyc2lvbnMgNS4xIGFuZCBoaWdoZXIuPC9wPgorCisKKzxoMj5PdGhlciBwbGF0Zm9ybXM8L2gyPgorU3VwcG9ydCBmb3Igb3RoZXIgcGxhdGZvcm1zIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbXBsZXRlLCBhcyBjZXJ0YWluIAordGVjaG5pcXVlcyB0byBoaWRlIHBsYXRmb3JtIGRldGFpbHMgZnJvbSBidWlsZCBmaWxlcyBuZWVkIHRvIGJlIHdyaXR0ZW4gYW5kCit0ZXN0ZWQgb24gZXZlcnkgcGFydGljdWxhciBwbGF0Zm9ybS4gQ29udHJpYnV0aW9ucyBpbiB0aGlzIGFyZWEgYXJlIHdlbGNvbWUuCisKKworPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvcHJveHkuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL3Byb3h5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE4NzAzNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL3Byb3h5Lmh0bWwKQEAgLTAsMCArMSwyOTUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UHJveHkgQ29uZmlndXJhdGlvbjwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorPGgyPlByb3h5IENvbmZpZ3VyYXRpb248L2gyPgorCis8cD4KK1RoaXMgcGFnZSBkaXNjdXNzaW5nIHByb3h5IGlzc3VlcyBvbiBjb21tYW5kLWxpbmUgYW50LgorQ29uc3VsdCB5b3VyIElERSBkb2N1bWVudGF0aW9uIGZvciBJREUtc3BlY2lmaWMgaW5mb3JtYXRpb24gdXBvbiBwcm94eSBzZXR1cC4KKzwvcD4KKworPHA+CisKK0FsbCB0YXNrcyBhbmQgdGhyZWFkcyBydW5uaW5nIGluIEFudCdzIEpWTSBzaGFyZSB0aGUgc2FtZSBIVFRQL0ZUUC9Tb2NrcworcHJveHkgY29uZmlndXJhdGlvbi4KKzwvcD4KKworPHA+CisgICAgV2hlbiBhbnkgdGFzayB0cmllcyB0byByZXRyaWV2ZSBjb250ZW50IGZyb20gYW4gSFRUUCBwYWdlLCBpbmNsdWRpbmcgdGhlCisgICAgPGNvZGU+Jmx0O2dldCZndDs8L2NvZGU+IHRhc2ssIGFueSBhdXRvbWF0ZWQgVVJMIHJldHJpZXZhbCBpbgorICAgIGFuIFhNTC9YU0wgdGFzaywgb3IgYW55IHRoaXJkLXBhcnR5IHRhc2sgdGhhdCB1c2VzIHRoZSA8Y29kZT5qYXZhLm5ldC5VUkw8L2NvZGU+CisgICAgY2xhc3NlcywgdGhlIHByb3h5IHNldHRpbmdzIG1heSBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc3VjY2VzcyBhbmQgZmFpbHVyZS4KKzwvcD4KKzxwPgorICAgIEFueW9uZSBhdXRob3JpbmcgYSBidWlsZCBmaWxlIGJlaGluZCBhIGJsb2NraW5nIGZpcmV3YWxsIHdpbGwgaW1tZWRpYXRlbHkgYXBwcmVjaWF0ZQorICAgIHRoZSBwcm9ibGVtcyBhbmQgbWF5IHdhbnQgdG8gd3JpdGUgYSBidWlsZCBmaWxlIHRvIGRlYWwgd2l0aCB0aGUgcHJvYmxlbSwgYnV0CisgICAgdXNlcnMgb2YgdGhpcmQgcGFydHkgYnVpbGQgYnVpbGQgZmlsZXMgbWF5IGZpbmQgdGhhdCB0aGUgYnVpbGQgZmlsZSBpdHNlbGYKKyAgICBkb2VzIG5vdCB3b3JrIGJlaGluZCB0aGUgZmlyZXdhbGwuCis8L3A+Cis8cD4KKyAgICBUaGlzIGlzIGEgbG9uZyBzdGFuZGluZyBwcm9ibGVtIHdpdGggSmF2YSBhbmQgQW50LiBUaGUgb25seSB3YXkgdG8gZml4CisgICAgaXQgaXMgdG8gZXhwbGljdGx5IGNvbmZpZ3VyZSBBbnQgd2l0aCB0aGUgcHJveHkgc2V0dGluZ3MsIGVpdGhlcgorICAgIGJ5IHBhc3NpbmcgZG93biB0aGUgcHJveHkgZGV0YWlscyBhcyBKVk0gcHJvcGVydGllcywgb3IgdG8KKyAgICB0ZWxsIEFudCBvbiBhIEphdmExLjUrIHN5c3RlbSB0byBoYXZlIHRoZSBKVk0gd29yayBpdCBvdXQgZm9yIGl0c2VsZi4KKworPC9wPgorCisKKworPGgzPkphdmExLjUrIHByb3h5IHN1cHBvcnQgKG5ldyBmb3IgQW50MS43KTwvaDM+Cis8cD4KKyAgICBXaGVuIEFudCBzdGFydHMgdXAsIGlmIHRoZSA8Y29kZT4tYXV0b3Byb3h5PC9jb2RlPgorICAgIGNvbW1hbmQgaXMgc3VwcGxpZWQsIEFudCBzZXRzIHRoZQorICAgIDxjb2RlPmphdmEubmV0LnVzZVN5c3RlbVByb3hpZXM8L2NvZGU+IHN5c3RlbSBwcm9wZXJ0eS4gVGhpcyB0ZWxscyAKKyAgICBhIEphdmExLjUrIEpWTSB0byB1c2UgdGhlIGN1cnJlbnQgc2V0IG9mIHByb3BlcnR5IHNldHRpbmdzIG9mIHRoZSBob3N0CisgICAgZW52aXJvbm1lbnQuIE90aGVyIEpWTXMsIHN1Y2ggYXMgdGhlIEthZmZlIGFuZCBBcGFjaGUgSGFybW9ueSBydW50aW1lcywKKyAgICBtYXkgYWxzbyB1c2UgdGhpcyBwcm9wZXJ0eSBpbiBmdXR1cmUuCisgICAgSXQgaXMgaWdub3JlZCBvbiB0aGUgSmF2YTEuNCBhbmQgZWFybGllciBydW50aW1lcy4KKzwvcD4KKzxwPgorICAgIFRoaXMgcHJvcGVydHkgbWF5YmUgZW5vdWdoIHRvIGdpdmUgY29tbWFuZC1saW5lIEFudAorICAgIGJ1aWxkcyBuZXR3b3JrIGFjY2VzcywgYWx0aG91Z2ggaW4gcHJhY3Rpc2UgdGhlIHJlc3VsdHMKKyAgICBhcmUgaW5jb25zaXN0ZW50LgorPC9wPgorPHA+CisgICAgSXQgaXMgaGFzIGFsc28gYmVlbiByZXBvcnRlZCBhIGJyZWFraW5nIHRoZSBJQk0gSmF2YSA1IEpSRSBvbiBBSVgsCisgICAgYW5kIGRvZXMgbm90IGFsd2F5cyB3b3JrIG9uIExpbnV4IChwcmVzdW1hYmx5IGR1ZSB0byBtaXNzaW5nIGdjb25mIHNldHRpbmdzKQorICAgIE90aGVyIG9kZCB0aGluZ3MgY2FuIGdvIHdyb25nLCBsaWtlIE9yYWNsZSBKREJDIGRyaXZlcnMgb3IgcHVyZSBKYXZhIFNWTiBjbGllbnRzLgorPC9wPgorCis8cD4KKyAgICBUbyBtYWtlIHRoZSA8Y29kZT4tYXV0b3Byb3h5PC9jb2RlPiBvcHRpb24gdGhlIGRlZmF1bHQsIGFkZCBpdCB0byB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICA8Y29kZT5BTlRfQVJHUzwvY29kZT4sIHdoaWNoIGNvbnRhaW5zIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gcGFzcyB0byBBbnQgb24gZXZlcnkKKyAgICBjb21tYW5kIGxpbmUgcnVuLgorPC9wPgorCis8aDQ+SG93IEF1dG9wcm94eSB3b3JrczwvaDQ+Cis8cD4KK1dlIGFyZSBncmF0ZWZ1bCBmb3Igc29tZSBpbnB1dCBmcm9tIFN1biBhcyB0byBob3cgdGhlIHByb3h5IGNvZGUgd29ya3MgdW5kZXIKK0phdmEgMS41IGFuZCB1cC4gVGhlIDxjb2RlPmphdmEubmV0LnVzZVN5c3RlbVByb3hpZXM8L2NvZGU+IGlzIGNoZWNrZWQgb25seQorb25jZSwgYXQgc3RhcnR1cCB0aW1lLCB0aGUgb3RoZXIgY2hlY2tzIChyZWdpc3RyeSwgZ2NvbmYsIHN5c3RlbSBwcm9wZXJ0aWVzKSBhcmUgZG9uZQorZHluYW1pY2FsbHkgd2hlbmV2ZXIgbmVlZGVkIChzb2NrZXQgY29ubmVjdGlvbiwgVVJMIGNvbm5lY3Rpb24gZXRjLi4pLgorPC9wPgorPGg1PldpbmRvd3M8L2g1PgorCis8cD4KK1RoZSBKVk0gZ29lcyBzdHJhaWdodCB0byB0aGUgcmVnaXN0cnksIGJ5cGFzc2luZyBXaW5JbmV0LCBhcyBpdCBpcyBub3QKK3ByZXNlbnQvY29uc2lzdGVudCBvbiBhbGwgc3VwcG9ydGVkIFdpbmRvd3MgcGxhdGZvcm1zIChpdCBpcyBwYXJ0IG9mIElFLAorcmVhbGx5KS4gSmF2YSA3IG1heSB1c2UgdGhlIFdpbmRvd3MgQVBJcyBvbiB0aGUgcGxhdGZvcm1zIHdoZW4gaXQgaXMgcHJlc2VudC4KKzwvcD4KKworPGg1PkxpbnV4PC9oNT4KKworPHA+CitUaGUgSlZNIHVzZXMgdGhlIGdjb25mIGxpYnJhcnkgdG8gbG9vayBhdCBzcGVjaWZpYyBlbnRyaWVzLgorVGhlIEdDb25mLTIgc2V0dGluZ3MgdXNlZCBhcmU6Cis8L3A+Cis8cHJlPgorIC0gL3N5c3RlbS9odHRwX3Byb3h5L3VzZV9odHRwX3Byb3h5ICAgICAgICAgICAgYm9vbGVhbgorIC0gL3N5c3RlbS9odHRwX3Byb3h5L3VzZV9hdXRoZW50aWNhdGlvbiAgICAgICAgYm9vbGVhbgorIC0gL3N5c3RlbS9odHRwX3Byb3h5L2hvc3QgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nCisgLSAvc3lzdGVtL2h0dHBfcHJveHkvYXV0aGVudGljYXRpb25fdXNlciAgICAgICBzdHJpbmcKKyAtIC9zeXN0ZW0vaHR0cF9wcm94eS9hdXRoZW50aWNhdGlvbl9wYXNzd29yZCAgIHN0cmluZworIC0gL3N5c3RlbS9odHRwX3Byb3h5L3BvcnQgICAgICAgICAgICAgICAgICAgICAgaW50CisgLSAvc3lzdGVtL3Byb3h5L3NvY2tzX2hvc3QgICAgICAgICAgICAgICAgICAgICBzdHJpbmcKKyAtIC9zeXN0ZW0vcHJveHkvbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZworIC0gL3N5c3RlbS9wcm94eS9mdHBfaG9zdCAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nCisgLSAvc3lzdGVtL3Byb3h5L3NlY3VyZV9ob3N0ICAgICAgICAgICAgICAgICAgICBzdHJpbmcKKyAtIC9zeXN0ZW0vcHJveHkvc29ja3NfcG9ydCAgICAgICAgICAgICAgICAgICAgIGludAorIC0gL3N5c3RlbS9wcm94eS9mdHBfcG9ydCAgICAgICAgICAgICAgICAgICAgICAgaW50CisgLSAvc3lzdGVtL3Byb3h5L3NlY3VyZV9wb3J0ICAgICAgICAgICAgICAgICAgICBpbnQKKyAtIC9zeXN0ZW0vcHJveHkvbm9fcHJveHlfZm9yICAgICAgICAgICAgICAgICAgIGxpc3QKKyAtIC9zeXN0ZW0vcHJveHkvZ29waGVyX2hvc3QgICAgICAgICAgICAgICAgICAgIHN0cmluZworIC0gL3N5c3RlbS9wcm94eS9nb3BoZXJfcG9ydCAgICAgICAgICAgICAgICAgICAgaW50Cis8L3ByZT4KKzxwPgorSWYgeW91IGFyZSB1c2luZyBLREUgb3IgYW5vdGhlciBHVUkgdGhhbiBHbm9tZSwgeW91IGNhbiBzdGlsbCB1c2UgdGhlCis8Y29kZT5nY29uZi1lZGl0b3I8L2NvZGU+IHRvb2wgdG8gYWRkIHRoZXNlIGVudHJpZXMuCis8L3A+CisKKworPGgzPk1hbnVhbCBKVk0gb3B0aW9uczwvaDM+Cis8cD4KKyAgICBBbnkgSlZNIGNhbiBoYXZlIGl0cyBwcm94eSBvcHRpb25zIGV4cGxpY2l0bHkgY29uZmlndXJlZCBieSBwYXNzaW5nCisgICAgdGhlIGFwcHJvcHJpYXRlIDxjb2RlPi1EPC9jb2RlPiBzeXN0ZW0gcHJvcGVydHkgb3B0aW9ucyB0byB0aGUgcnVudGltZS4KKyAgICBBbnQgY2FuIGJlIGNvbmZpZ3VyZWQgdGhyb3VnaCBhbGwgaXRzIHNoZWxsIHNjcmlwdHMgdmlhIHRoZQorICAgIDxjb2RlPkFOVF9PUFRTPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2hpY2ggaXMgYSBsaXN0IG9mIG9wdGlvbnMgdG8KKyAgICBzdXBwbHkgdG8gQW50J3MgSlZNOgorPC9wPgorPHA+CisgIEZvciBiYXNoOgorPC9wPiAgCis8cHJlPgorICAgIGV4cG9ydCBBTlRfT1BUUz0iLURodHRwLnByb3h5SG9zdD1wcm94eSAtRGh0dHAucHJveHlQb3J0PTgwODAiCis8L3ByZT4KKyAgRm9yIGNzaC90Y3NoOgorPHByZT4KKyAgICBzZXRlbnYgQU5UX09QVFMgIi1EaHR0cC5wcm94eUhvc3Q9cHJveHkgLURodHRwLnByb3h5UG9ydD04MDgwIgorPC9wcmU+Cis8cD4KK0lmIHlvdSBpbnNlcnQgdGhpcyBsaW5lIGludG8gdGhlIEFudCBzaGVsbCBzY3JpcHQgaXRzZWxmLCBpdCBnZXRzIHBpY2tlZCB1cAorYnkgYWxsIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gdG9vbHMgcnVubmluZyBvbiB0aGUgc3lzdGVtIHRoYXQgY2FsbCBBbnQgdmlhIHRoZQorY29tbWFuZCBsaW5lLgorPC9wPgorPHA+CisgIEZvciBXaW5kb3dzLCBzZXQgdGhlIDxjb2RlPkFOVF9PUFRTPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiB0aGUgYXBwcm9wcmlhdGUgIk15IENvbXB1dGVyIiAKKyAgcHJvcGVydGllcyBkaWFsb2cgYm94ICh3aW5YUCksICJDb21wdXRlciIgcHJvcGVydGllcyAoVmlzdGEpCis8L3A+Cis8cD4KKyAgVGhpcyBtZWNoYW5pc20gd29ya3MgYWNyb3NzIEphdmEgdmVyc2lvbnMsIGlzIGNyb3NzLXBsYXRmb3JtIGFuZCByZWxpYWJsZS4gCisgIE9uY2Ugc2V0LCBhbGwgYnVpbGQgZmlsZXMgcnVuIHZpYSB0aGUgY29tbWFuZCBsaW5lIHdpbGwgYXV0b21hdGljYWxseSBoYXZlCisgIHRoZWlyIHByb3h5IHNldHVwIGNvcnJlY3RseSwgd2l0aG91dCBuZWVkaW5nIGFueSBidWlsZCBmaWxlIGNoYW5nZXMuIEl0IGFsc28KKyAgYXBwYXJlbnRseSBvdmVycmlkZXMgQW50J3MgYXV0b21hdGljIHByb3h5IHNldHRpbmdzIG9wdGlvbnMuCis8L3A+Cis8cD4gIAorICBJdCBpcyBsaW1pdGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKKzwvcD4gIAorICA8b2w+CisgIDxsaT5Eb2VzIG5vdCB3b3JrIHVuZGVyIElERXMuIFRoZXNlIG5lZWQgdGhlaXIgb3duIHByb3h5IHNldHRpbmdzIGNoYW5nZWQ8L2xpPgorICA8bGk+Tm90IGR5bmFtaWMgZW5vdWdoIHRvIGRlYWwgd2l0aCBsYXB0b3AgY29uZmlndXJhdGlvbiBjaGFuZ2VzLjwvbGk+CisgIDwvb2w+CisKKworPGgzPlNldFByb3h5IFRhc2s8L2gzPgorPHA+CisgICAgVGhlIDxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvc2V0cHJveHkuaHRtbCI+c2V0cHJveHkgdGFzazwvYT4gY2FuIGJlIHVzZWQgdG8KKyAgICBleHBsaWNpdGx5IHNldCBhIHByb3h5IGluIGEgYnVpbGQgZmlsZS4gVGhpcyBtYW5pcHVsYXRlcyB0aGUgbWFueSBwcm94eSAKKyAgICBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2YgYSBKVk0sIGFuZCBjb250cm9scyB0aGUgcHJveHkgc2V0dGluZ3MgZm9yIGFsbCAKKyAgICBuZXR3b3JrIG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgSlZNIGZyb20gdGhhdCBtb21lbnQuIAorPC9wPgorPHA+CisgICAgSWYgeW91IGhhdmUgYSBidWlsZCBmaWxlIHRoYXQgaXMgb25seSB0byBiZSB1c2VkIGluLWhvdXNlLCBiZWhpbmQgYSBmaXJld2FsbCwgb24KKyAgICBhbiBvbGRlciBKVk0sIDxpPmFuZCB5b3UgY2Fubm90IGNoYW5nZSBBbnQncyBKVk0gcHJveHkgc2V0dGluZ3M8L2k+LCB0aGVuCisgICAgdGhpcyBpcyB5b3VyIGJlc3Qgb3B0aW9uLiBJdCBpcyB1Z2x5IGFuZCBicml0dGxlLCBiZWNhdXNlIHRoZSBidWlsZCBmaWxlIG5vdyBjb250YWlucworICAgIHN5c3RlbSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiBJdCBpcyBhbHNvIGhhcmQgdG8gZ2V0IHRoaXMgcmlnaHQgYWNyb3NzCisgICAgdGhlIG1hbnkgcG9zc2libGUgcHJveHkgb3B0aW9ucyBvZiBkaWZmZXJlbnQgdXNlcnMgKG5vbmUsIEhUVFAsIFNPQ0tTKS4KKzwvcD4KKworCis8cD4KKyAgICBOb3RlIHRoYXQgcHJveHkgY29uZmlndXJhdGlvbnMgc2V0IHdpdGggdGhpcyB0YXNrIHdpbGwgcHJvYmFibHkgb3ZlcnJpZGUKKyAgICBhbnkgc2V0IGJ5IG90aGVyIG1lY2hhbmlzbXMuIEl0IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBmYW5jeSB0cmlja3MgdG8gCisgICAgb25seSBzZXQgYSBwcm94eSBpZiB0aGUgcHJveHkgaXMgY29uc2lkZXJlZCByZWFjaGFibGU6Cis8L3A+CisKKzxwcmU+CisgICZsdDt0YXJnZXQgbmFtZT0icHJvYmUtcHJveHkiIGRlcGVuZHM9ImluaXQiJmd0OworICAgICZsdDtjb25kaXRpb24gcHJvcGVydHk9InByb3h5LmVuYWJsZWQiJmd0OworICAgICAgJmx0O2FuZCZndDsKKyAgICAgICAgJmx0O2lzc2V0IHByb3BlcnR5PSJwcm94eS5ob3N0Ii8mZ3Q7CisgICAgICAgICZsdDtpc3JlYWNoYWJsZSBob3N0PSIke3Byb3h5Lmhvc3R9Ii8mZ3Q7CisgICAgICAmbHQ7L2FuZCZndDsKKyAgICAmbHQ7L2NvbmRpdGlvbiZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSJwcm94eSIgZGVwZW5kcz0icHJvYmUtcHJveHkiIGlmPSJwcm94eS5lbmFibGVkIiZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0icHJveHkucG9ydCIgdmFsdWU9IjgwIi8mZ3Q7CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9InByb3h5LnVzZXIiIHZhbHVlPSIiLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0icHJveHkucGFzcyIgdmFsdWU9IiIvJmd0OworICAgICZsdDtzZXRwcm94eSBwcm94eWhvc3Q9IiR7cHJveHkuaG9zdH0iIHByb3h5cG9ydD0iJHtwcm94eS5wb3J0fSIKKyAgICAgIHByb3h5dXNlcj0iJHtwcm94eS51c2VyfSIgcHJveHlwYXNzd29yZD0iJHtwcm94eS5wYXNzfSIvJmd0OworICAmbHQ7L3RhcmdldCZndDsKKzwvcHJlPgorCis8aDM+Q3VzdG9tIFByb3h5U2VsZWN0b3IgaW1wbGVtZW50YXRpb25zPC9oMz4KKzxwPgorICAgIEFzIEphdmEgbGV0cyBkZXZlbG9wZXJzIHdyaXRlIHRoZWlyIG93biBQcm94eVNlbGVjdG9yIGltcGxlbWVudGF0aW9ucywgaXQgCisgICAgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSBmb3Igc29tZW9uZSB0byB3cml0ZSB0aGVpciBvd24gcHJveHkgc2VsZWN0b3IgY2xhc3MgdGhhdCB1c2VzCisgICAgZGlmZmVyZW50IHBvbGljaWVzIHRvIGRldGVybWluZSBwcm94eSBzZXR0aW5ncy4gVGhlcmUgaXMgbm8gZXhwbGljaXQgc3VwcG9ydAorICAgIGZvciB0aGlzIGluIEFudCwgYW5kIGl0IGhhcyBub3QsIHRvIHRoZSB0ZWFtJ3Mga25vd2xlZGdlLCBiZWVuIGF0dGVtcHRlZC4gCis8L3A+Cis8cD4KKyAgICBUaGlzIGNvdWxkIGJlIHRoZSBtb3N0IGZsZXhpYmxlIG9mIHNvbHV0aW9ucywgYXMgb25lIGNvdWxkIGVhc2lseSBpbWFnaW5lCisgICAgYW4gQW50LXNwZWNpZmljIHByb3h5IHNlbGVjdG9yIHRoYXQgd2FzIGRyaXZlbiBvZmYgYW50IHByb3BlcnRpZXMsIHJhdGhlcgorICAgIHRoYW4gc3lzdGVtIHByb3BlcnRpZXMuIERldmVsb3BlcnMgY291bGQgc2V0IHByb3h5IG9wdGlvbnMgaW4gdGhlaXIKKyAgICBjdXN0b20gYnVpbGQucHJvcGVydGllcyBmaWxlcywgYW5kIGhhdmUgdGhpcyBwcm9wYWdhdGUuCis8L3A+Cis8cD4KKyAgICBPbmUgaXNzdWUgaGVyZSBpcyB3aXRoIGNvbmN1cnJlbmN5OiB0aGUgZGVmYXVsdCBwcm94eSBzZWxlY3RvciBpcyBwZXItSlZNLAorICAgIG5vdCBwZXItdGhyZWFkLCBhbmQgc28gdGhlIHByb3h5IHNldHRpbmdzIHdpbGwgYXBwbHkgdG8gYWxsIHNvY2tldHMgb3BlbmVkCisgICAgb24gYWxsIHRocmVhZHM7IHdlIGFsc28gaGF2ZSB0aGUgcHJvYmxlbSBvZiBob3cgdG8gcHJvcGFnYXRlIG9wdGlvbnMgZnJvbQorICAgIG9uZSBidWlsZCB0byB0aGUgSlZNLXdpZGUgc2VsZWN0b3IuCis8L3A+CisKKzxoMz5Db25maWd1cmluZyB0aGUgUHJveHkgc2V0dGluZ3Mgb2YgSmF2YSBwcm9ncmFtcyB1bmRlciBBbnQ8L2gzPgorCis8cD4KKyAgICBBbnkgcHJvZ3JhbSB0aGF0IGlzIGV4ZWN1dGVkIHdpdGggPGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPiB3aXRob3V0IHNldHRpbmcKKyAgICA8Y29kZT5mb3JrPSJ0cnVlIjwvY29kZT4gd2lsbCBwaWNrIHVwIHRoZSBBbnQncyBzZXR0aW5ncy4gSWYgeW91IG5lZWQKKyAgICBkaWZmZXJlbnQgdmFsdWVzLCBzZXQgPGNvZGU+Zm9yaz0iZmFsc2UiPC9jb2RlPiBhbmQgcHJvdmlkZSB0aGUgdmFsdWVzCisgICAgaW4gPGNvZGU+Jmx0O3N5c3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudHMuCis8L3A+ICAgIAorICAgIElmIHlvdSB3aXNoIHRvIGhhdmUKKyAgICBhIGZvcmtlZCBwcm9jZXNzIHBpY2sgdXAgdGhlIEFudCdzIHNldHRpbmdzLCB1c2UgdGhlIAorICAgIDxhIGhyZWY9IkNvcmVUeXBlcy9wcm9wZXJ0eXNldC5odG1sIj48Y29kZT4mbHQ7c3lzcHJvcGVydHlzZXQmZ3Q7PC9jb2RlPjwvYT4KKyAgICBlbGVtZW50IHRvIHByb3BhZ2F0ZSB0aGUgbm9ybWFsIHByb3h5IHNldHRpbmdzLiBUaGUgZm9sbG93aW5nIHByb3BlcnR5c2V0CisgICAgaXMgYSBkYXRhdHlwZSB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBhIDxjb2RlPiZsdDtqYXZhJmd0OzwvY29kZT4gdGFzayB0bworICAgIHBhc3MgZG93biB0aGUgY3VycmVudCB2YWx1ZXMuCisgICAgCis8L3A+Cis8cHJlPgorJmx0O3Byb3BlcnR5c2V0IGlkPSJwcm94eS5wcm9wZXJ0aWVzIj4KKyAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0iamF2YS5uZXQudXNlU3lzdGVtUHJveGllcyIvPgorICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSJodHRwLiIvPgorICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSJodHRwcy4iLz4KKyAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0iZnRwLiIvPgorICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSJzb2Nrc1Byb3h5Ii8+CismbHQ7L3Byb3BlcnR5c2V0PgorPC9wcmU+CisKKzxoMz5TdW1tYXJ5IGFuZCBjb25jbHVzaW9uczwvaDM+Cis8cD4KK1RoZXJlIGFyZSBmb3VyIHdheXMgdG8gc2V0IHVwIHByb3hpZXMgaW4gQW50LgorPC9wPgorPG9sPgorPGxpPldpdGggQW50MS43IGFuZCBKYXZhIDEuNSsgdXNpbmcgdGhlIDxjb2RlPi1hdXRvcHJveHk8L2NvZGU+IHBhcmFtZXRlci48L2xpPgorPGxpPlZpYSBKVk0gc3lzdGVtIHByb3BlcnRpZXMgLXNldCB0aGVzZSBpbiB0aGUgQU5UX0FSR1MgZW52aXJvbm1lbnQgdmFyaWFibGUuPC9saT4KKzxsaT5WaWEgdGhlICZsdDtzZXRwcm94eSZndDsgdGFzay48L2xpPgorPGxpPkN1c3RvbSBQcm94eVNlbGVjdG9yIGltcGxlbWVudGF0aW9uczwvbGk+Cis8L29sPgorPHA+CitQcm94eSBzZXR0aW5ncyBhcmUgYXV0b21hdGljYWxseSBzaGFyZWQgd2l0aCBKYXZhIHByb2dyYW1zIHN0YXJ0ZWQgdW5kZXIgQW50IDxpPgordGhhdCBhcmUgbm90IGZvcmtlZDwvaT47IHRvIHBhc3MgcHJveHkgc2V0dGluZ3MgZG93biB0byBzdWJzaWRpYXJ5IHByb2dyYW1zLCB1c2UKK2EgcHJvcGVydHlzZXQuCis8L3A+Cis8cD4KK092ZXIgdGltZSwgd2UgZXhwZWN0IHRoZSBKYXZhIDUrIHByb3h5IGZlYXR1cmVzIHRvIHN0YWJpbGl6ZSwgYW5kIGZvciBKYXZhIGNvZGUKK3RvIGFkYXB0IHRvIHRoZW0uIEhvd2V2ZXIsIGdpdmVuIHRoZSBmYWN0IHRoYXQgaXQgY3VycmVudGx5IGRvZXMgYnJlYWsgc29tZQorYnVpbGRzLCBpdCB3aWxsIGJlIHNvbWUgdGltZSBiZWZvcmUgQW50IGVuYWJsZXMgdGhlIGF1dG9tYXRpYyBwcm94eSBmZWF0dXJlIGJ5CitkZWZhdWx0LiBVbnRpbCB0aGVuLCB5b3UgaGF2ZSB0byBlbmFibGUgdGhlIDxjb2RlPi1hdXRvcHJveHk8L2NvZGU+IG9wdGlvbiBvcgordXNlIG9uZSBvZiB0aGUgYWx0ZXJuYXRlIG1lY2hhbmlzbXMgdG8gY29uZmlndXJlIHRoZSBKVk0uCisKKzxoND5GdXJ0aGVyIHJlYWRpbmc8L2g0PgorCis8dWw+Cis8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvbmV0L3Byb3BlcnRpZXMuaHRtbCI+CitKYXZhIE5ldHdvcmtpbmcgUHJvcGVydGllczwvYT4uIE5vdGljZSBob3cgbm90IGFsbCBwcm94eSBzZXR0aW5ncyBhcmUgZG9jdW1lbnRlZAordGhlcmUuCis8bGk+PGEgaHJlZj0iaHR0cDovL2Jsb2dzLnN1bi5jb20vcm9sbGVyL3Jlc291cmNlcy9qY2MvUHJveGllcy5wZGYiPlByb3hpZXM8L2E+Cis8L2xpPgorPC91bD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvcnVubmluZy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvcnVubmluZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzI0YWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9ydW5uaW5nLmh0bWwKQEAgLTAsMCArMSw1ODQgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+UnVubmluZyBBcGFjaGUgQW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMT5SdW5uaW5nIEFudDwvaDE+Cis8aDI+PGEgbmFtZT0iY29tbWFuZGxpbmUiPkNvbW1hbmQgTGluZTwvYT48L2gyPgorPHA+IElmIHlvdSd2ZSBpbnN0YWxsZWQgQW50IGFzIGRlc2NyaWJlZCBpbiB0aGUKKzxhIGhyZWY9Imluc3RhbGwuaHRtbCI+IEluc3RhbGxpbmcgQW50PC9hPiBzZWN0aW9uLAorcnVubmluZyBBbnQgZnJvbSB0aGUgY29tbWFuZC1saW5lIGlzIHNpbXBsZToganVzdCB0eXBlCis8Y29kZT5hbnQ8L2NvZGU+LjwvcD4KKzxwPldoZW4gbm8gYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQsIEFudCBsb29rcyBmb3IgYSA8Y29kZT5idWlsZC54bWw8L2NvZGU+CitmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQsIGlmIGZvdW5kLCB1c2VzIHRoYXQgZmlsZSBhcyB0aGUKK2J1aWxkIGZpbGUgYW5kIHJ1bnMgdGhlIHRhcmdldCBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmRlZmF1bHQ8L2NvZGU+CithdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4gdGFnLgorVG8gbWFrZSBBbnQgdXNlCithIGJ1aWxkIGZpbGUgb3RoZXIgdGhhbiA8Y29kZT5idWlsZC54bWw8L2NvZGU+LCB1c2UgdGhlIGNvbW1hbmQtbGluZQorb3B0aW9uIDxub2JyPjxjb2RlPi1idWlsZGZpbGUgPGk+ZmlsZTwvaT48L2NvZGU+PC9ub2JyPiwKK3doZXJlIDxpPmZpbGU8L2k+IGlzIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBmaWxlIHlvdSB3YW50IHRvIHVzZS48L3A+CitJZiB5b3UgdXNlIHRoZSA8bm9icj48Y29kZT4tZmluZCBbPGk+ZmlsZTwvaT5dPC9jb2RlPjwvbm9icj4gb3B0aW9uLAorQW50IHdpbGwgc2VhcmNoIGZvciBhIGJ1aWxkIGZpbGUgZmlyc3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGVuIGluCit0aGUgcGFyZW50IGRpcmVjdG9yeSwgYW5kIHNvIG9uLCB1bnRpbCBlaXRoZXIgYSBidWlsZCBmaWxlIGlzIGZvdW5kIG9yIHRoZSByb290CitvZiB0aGUgZmlsZXN5c3RlbSBoYXMgYmVlbiByZWFjaGVkLiBCeSBkZWZhdWx0LCBpdCB3aWxsIGxvb2sgZm9yIGEgYnVpbGQgZmlsZQorY2FsbGVkIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4uIFRvIGhhdmUgaXQgc2VhcmNoIGZvciBhIGJ1aWxkIGZpbGUgb3RoZXIKK3RoYW4gPGNvZGU+YnVpbGQueG1sPC9jb2RlPiwgc3BlY2lmeSBhIGZpbGUgYXJndW1lbnQuCis8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSBpbmNsdWRlIGFueSBvdGhlciBmbGFncyBvciBhcmd1bWVudHMKK29uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIKK3RoZSA8bm9icj48Y29kZT4tZmluZDwvY29kZT48L25vYnI+IGZsYWcsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIGZpbGUgYXJndW1lbnQKK2ZvciB0aGUgPG5vYnI+PGNvZGU+LWZpbmQ8L2NvZGU+PC9ub2JyPiBmbGFnLCBldmVuIGlmIHRoZSBuYW1lIG9mIHRoZQorYnVpbGQgZmlsZSB5b3Ugd2FudCB0byBmaW5kIGlzIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4uCisKKzxwPllvdSBjYW4gYWxzbyBzZXQgPGEgaHJlZj0idXNpbmcuaHRtbCNwcm9wZXJ0aWVzIj5wcm9wZXJ0aWVzPC9hPiBvbiB0aGUKK2NvbW1hbmQgbGluZS4gIFRoaXMgY2FuIGJlIGRvbmUgd2l0aAordGhlIDxub2JyPjxjb2RlPi1EPGk+cHJvcGVydHk8L2k+PTxpPnZhbHVlPC9pPjwvY29kZT48L25vYnI+IG9wdGlvbiwKK3doZXJlIDxpPnByb3BlcnR5PC9pPiBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHksCithbmQgPGk+dmFsdWU8L2k+IGlzIHRoZSB2YWx1ZSBmb3IgdGhhdCBwcm9wZXJ0eS4gSWYgeW91IHNwZWNpZnkgYQorcHJvcGVydHkgdGhhdCBpcyBhbHNvIHNldCBpbiB0aGUgYnVpbGQgZmlsZQorKHNlZSB0aGUgPGEgaHJlZj0iQ29yZVRhc2tzL3Byb3BlcnR5Lmh0bWwiPnByb3BlcnR5PC9hPiB0YXNrKSwKK3RoZSB2YWx1ZSBzcGVjaWZpZWQgb24gdGhlCitjb21tYW5kIGxpbmUgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZQorYnVpbGQgZmlsZS4KK0RlZmluaW5nIHByb3BlcnRpZXMgb24gdGhlIGNvbW1hbmQgbGluZSBjYW4gYWxzbyBiZSB1c2VkIHRvIHBhc3MgaW4KK3RoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXM7IGp1c3QgcGFzcworPG5vYnI+PGNvZGU+LURNWVZBUj0lTVlWQVIlPC9jb2RlPjwvbm9icj4gKFdpbmRvd3MpIG9yCis8bm9icj48Y29kZT4tRE1ZVkFSPSRNWVZBUjwvY29kZT48L25vYnI+IChVbml4KQordG8gQW50LiBZb3UgY2FuIHRoZW4gYWNjZXNzCit0aGVzZSB2YXJpYWJsZXMgaW5zaWRlIHlvdXIgYnVpbGQgZmlsZSBhcyA8Y29kZT4ke01ZVkFSfTwvY29kZT4uCitZb3UgY2FuIGFsc28gYWNjZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2luZyB0aGUKKzxhIGhyZWY9IkNvcmVUYXNrcy9wcm9wZXJ0eS5odG1sIj4gcHJvcGVydHk8L2E+IHRhc2sncworPGNvZGU+ZW52aXJvbm1lbnQ8L2NvZGU+IGF0dHJpYnV0ZS4KKzwvcD4KKworPHA+T3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgYW1vdW50IG9mIGxvZ2dpbmcgb3V0cHV0IGJ5IEFudCBhcmU6Cis8bm9icj48Y29kZT4tcXVpZXQ8L2NvZGU+PC9ub2JyPiwKK3doaWNoIGluc3RydWN0cyBBbnQgdG8gcHJpbnQgbGVzcworaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGU7Cis8bm9icj48Y29kZT4tdmVyYm9zZTwvY29kZT48L25vYnI+LCB3aGljaCBjYXVzZXMgQW50IHRvIHByaW50CithZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlOyBhbmQgPG5vYnI+PGNvZGU+LWRlYnVnPC9jb2RlPjwvbm9icj4sCit3aGljaCBjYXVzZXMgQW50IHRvIHByaW50IGNvbnNpZGVyYWJseSBtb3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCis8L3A+CisKKzxwPkl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YXJnZXRzIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkLgorV2hlbiBvbWl0dGVkLCB0aGUgdGFyZ2V0IHRoYXQgaXMgc3BlY2lmaWVkIGluIHRoZQorPGNvZGU+ZGVmYXVsdDwvY29kZT4gYXR0cmlidXRlIG9mIHRoZQorPGEgaHJlZj0idXNpbmcuaHRtbCNwcm9qZWN0cyI+PGNvZGU+cHJvamVjdDwvY29kZT48L2E+IHRhZyBpcwordXNlZC48L3A+CisKKzxwPlRoZSA8bm9icj48Y29kZT4tcHJvamVjdGhlbHA8L2NvZGU+PC9ub2JyPiBvcHRpb24gcHJpbnRzIG91dCBhIGxpc3QKK29mIHRoZSBidWlsZCBmaWxlJ3MgdGFyZ2V0cy4gVGFyZ2V0cyB0aGF0IGluY2x1ZGUgYQorPGNvZGU+ZGVzY3JpcHRpb248L2NvZGU+IGF0dHJpYnV0ZSBhcmUgbGlzdGVkIGFzICZxdW90O01haW4gdGFyZ2V0cyZxdW90OywKK3Rob3NlIHdpdGhvdXQgYSA8Y29kZT5kZXNjcmlwdGlvbjwvY29kZT4gYXJlIGxpc3RlZCBhcworJnF1b3Q7T3RoZXIgdGFyZ2V0cyZxdW90OywgdGhlbiB0aGUgJnF1b3Q7RGVmYXVsdCZxdW90OyB0YXJnZXQgaXMgbGlzdGVkCisoIk90aGVyIHRhcmdldHMiIGFyZSBvbmx5IGRpc3BsYXllZCBpZiB0aGVyZSBhcmUgbm8gbWFpbgordGFyZ2V0cywgb3IgaWYgQW50IGlzIGludm9rZWQgaW4gLXZlcmJvc2Ugb3IgLWRlYnVnIG1vZGUpLgorCis8aDM+PGEgbmFtZT0ib3B0aW9ucyI+Q29tbWFuZC1saW5lIE9wdGlvbnMgU3VtbWFyeTwvYT48L2gzPgorPHByZT5hbnQgW29wdGlvbnNdIFt0YXJnZXQgW3RhcmdldDIgW3RhcmdldDNdIC4uLl1dCitPcHRpb25zOgorICAtaGVscCwgLWggICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtcHJvamVjdGhlbHAsIC1wICAgICAgIHByaW50IHByb2plY3QgaGVscCBpbmZvcm1hdGlvbgorICAtdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1kaWFnbm9zdGljcyAgICAgICAgICAgcHJpbnQgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBiZSBoZWxwZnVsIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ25vc2Ugb3IgcmVwb3J0IHByb2JsZW1zLgorICAtcXVpZXQsIC1xICAgICAgICAgICAgIGJlIGV4dHJhIHF1aWV0CisgIC12ZXJib3NlLCAtdiAgICAgICAgICAgYmUgZXh0cmEgdmVyYm9zZQorICAtZGVidWcsIC1kICAgICAgICAgICAgIHByaW50IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorICAtZW1hY3MsIC1lICAgICAgICAgICAgIHByb2R1Y2UgbG9nZ2luZyBpbmZvcm1hdGlvbiB3aXRob3V0IGFkb3JubWVudHMKKyAgLWxpYiAmbHQ7cGF0aCZndDsgICAgICAgICAgICBzcGVjaWZpZXMgYSBwYXRoIHRvIHNlYXJjaCBmb3IgamFycyBhbmQgY2xhc3NlcworICAtbG9nZmlsZSAmbHQ7ZmlsZSZndDsgICAgICAgIHVzZSBnaXZlbiBmaWxlIGZvciBsb2cKKyAgICAtbCAgICAgJmx0O2ZpbGUmZ3Q7ICAgICAgICAgICAgICAgICcnCisgIC1sb2dnZXIgJmx0O2NsYXNzbmFtZSZndDsgICAgdGhlIGNsYXNzIHdoaWNoIGlzIHRvIHBlcmZvcm0gbG9nZ2luZworICAtbGlzdGVuZXIgJmx0O2NsYXNzbmFtZSZndDsgIGFkZCBhbiBpbnN0YW5jZSBvZiBjbGFzcyBhcyBhIHByb2plY3QgbGlzdGVuZXIKKyAgLW5vaW5wdXQgICAgICAgICAgICAgICBkbyBub3QgYWxsb3cgaW50ZXJhY3RpdmUgaW5wdXQKKyAgLWJ1aWxkZmlsZSAmbHQ7ZmlsZSZndDsgICAgICB1c2UgZ2l2ZW4gYnVpbGRmaWxlCisgICAgLWZpbGUgICAgJmx0O2ZpbGUmZ3Q7ICAgICAgICAgICAgICAnJworICAgIC1mICAgICAgICZsdDtmaWxlJmd0OyAgICAgICAgICAgICAgJycKKyAgLUQmbHQ7cHJvcGVydHkmZ3Q7PSZsdDt2YWx1ZSZndDsgICB1c2UgdmFsdWUgZm9yIGdpdmVuIHByb3BlcnR5CisgIC1rZWVwLWdvaW5nLCAtayAgICAgICAgZXhlY3V0ZSBhbGwgdGFyZ2V0cyB0aGF0IGRvIG5vdCBkZXBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICBvbiBmYWlsZWQgdGFyZ2V0KHMpCisgIC1wcm9wZXJ0eWZpbGUgJmx0O25hbWUmZ3Q7ICAgbG9hZCBhbGwgcHJvcGVydGllcyBmcm9tIGZpbGUgd2l0aCAtRAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgdGFraW5nIHByZWNlZGVuY2UKKyAgLWlucHV0aGFuZGxlciAmbHQ7Y2xhc3MmZ3Q7ICB0aGUgY2xhc3Mgd2hpY2ggd2lsbCBoYW5kbGUgaW5wdXQgcmVxdWVzdHMKKyAgLWZpbmQgJmx0O2ZpbGUmZ3Q7ICAgICAgICAgICAocyllYXJjaCBmb3IgYnVpbGRmaWxlIHRvd2FyZHMgdGhlIHJvb3Qgb2YKKyAgICAtcyAgJmx0O2ZpbGUmZ3Q7ICAgICAgICAgICB0aGUgZmlsZXN5c3RlbSBhbmQgdXNlIGl0CisgIC1uaWNlICBudW1iZXIgICAgICAgICAgQSBuaWNlbmVzcyB2YWx1ZSBmb3IgdGhlIG1haW4gdGhyZWFkOgorICAgICAgICAgICAgICAgICAgICAgICAgIDEgKGxvd2VzdCkgdG8gMTAgKGhpZ2hlc3QpOyA1IGlzIHRoZSBkZWZhdWx0CisgIC1ub3VzZXJsaWIgICAgICAgICAgICAgUnVuIGFudCB3aXRob3V0IHVzaW5nIHRoZSBqYXIgZmlsZXMgZnJvbSAke3VzZXIuaG9tZX0vLmFudC9saWIKKyAgLW5vY2xhc3NwYXRoICAgICAgICAgICBSdW4gYW50IHdpdGhvdXQgdXNpbmcgQ0xBU1NQQVRICisgIC1hdXRvcHJveHkgICAgICAgICAgICAgSmF2YSAxLjUrIDogdXNlIHRoZSBPUyBwcm94aWVzCisgIC1tYWluICZsdDtjbGFzcyZndDsgICAgICAgICAgb3ZlcnJpZGUgQW50J3Mgbm9ybWFsIGVudHJ5IHBvaW50Cis8L3ByZT4KKzxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IDxjb2RlPi1sb2dnZXI8L2NvZGU+IGFuZAorPGNvZGU+LWxpc3RlbmVyPC9jb2RlPiBzZWUKKzxhIGhyZWY9Imxpc3RlbmVycy5odG1sIj5Mb2dnZXJzICZhbXA7IExpc3RlbmVyczwvYT4uCis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8Y29kZT4taW5wdXRoYW5kbGVyPC9jb2RlPiBzZWUKKzxhIGhyZWY9ImlucHV0aGFuZGxlci5odG1sIj5JbnB1dEhhbmRsZXI8L2E+LgorPHA+RWFzaWVzdCB3YXkgb2YgY2hhbmdpbmcgdGhlIGV4aXQtYmVoYXZpb3VyIGlzIHN1YmNsYXNzaW5nIHRoZSBvcmlnaW5hbCBtYWluIGNsYXNzOgorPHByZT4KK3B1YmxpYyBjbGFzcyBDdXN0b21FeGl0Q29kZSBleHRlbmRzIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4geworICAgIHByb3RlY3RlZCB2b2lkIGV4aXQoaW50IGV4aXRDb2RlKSB7CisgICAgICAgIC8vIGltcGxlbWVudCB5b3VyIG93biBiZWhhdmlvdXIsIGUuZy4gTk9UIGV4aXRpbmcgdGhlIEpWTQorICAgIH0KK30KKzwvcHJlPiBhbmQgc3RhcnRpbmcgQW50IHdpdGggYWNjZXNzICg8dHQ+LWxpYiBwYXRoLXRvLWNsYXNzPC90dD4pIHRvIHRoaXMgY2xhc3MuCis8L3A+CisKKzxoMz48YSBuYW1lPSJsaWJzIj5MaWJyYXJ5IERpcmVjdG9yaWVzPC9hPjwvaDM+Cis8cD4KK1ByaW9yIHRvIEFudCAxLjYsIGFsbCBqYXJzIGluIHRoZSBBTlRfSE9NRS9saWIgd291bGQgYmUgYWRkZWQgdG8gdGhlIENMQVNTUEFUSAordXNlZCB0byBydW4gQW50LiBUaGlzIHdhcyBkb25lIGluIHRoZSBzY3JpcHRzIHRoYXQgc3RhcnRlZCBBbnQuIEZyb20gQW50IDEuNiwKK3R3byBkaXJlY3RvcmllcyBhcmUgc2Nhbm5lZCBieSBkZWZhdWx0IGFuZCBtb3JlIGNhbiBiZSBhZGRlZCBhcyByZXF1aXJlZC4gVGhlCitkZWZhdWx0IGRpcmVjdG9yaWVzIHNjYW5uZWQgYXJlIEFOVF9IT01FL2xpYiBhbmQgYSB1c2VyIHNwZWNpZmljIGRpcmVjdG9yeSwKKyR7dXNlci5ob21lfS8uYW50L2xpYi4gVGhpcyBhcnJhbmdlbWVudCBhbGxvd3MgdGhlIEFudCBpbnN0YWxsYXRpb24gdG8gYmUKK3NoYXJlZCBieSBtYW55IHVzZXJzIHdoaWxlIHN0aWxsIGFsbG93aW5nIGVhY2ggdXNlciB0byBkZXBsb3kgYWRkaXRpb25hbCBqYXJzLgorU3VjaCBhZGRpdGlvbmFsIGphcnMgY291bGQgYmUgc3VwcG9ydCBqYXJzIGZvciBBbnQncyBvcHRpb25hbCB0YXNrcyBvciBqYXJzCitjb250YWluaW5nIHRoaXJkLXBhcnR5IHRhc2tzIHRvIGJlIHVzZWQgaW4gdGhlIGJ1aWxkLiBJdCBhbHNvIGFsbG93cyB0aGUgbWFpbiBBbnQgaW5zdGFsbGF0aW9uIHRvIGJlIGxvY2tlZCBkb3duIHdoaWNoIHdpbGwgcGxlYXNlIHN5c3RlbSBhZG1pbnN0cmF0b3JzLgorPC9wPgorCis8cD4KK0FkZGl0aW9uYWwgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQgbWF5IGJlIGFkZGVkIGJ5IHVzaW5nIHRoZSAtbGliIG9wdGlvbi4KK1RoZSAtbGliIG9wdGlvbiBzcGVjaWZpZXMgYSBzZWFyY2ggcGF0aC4gQW55IGphcnMgb3IgY2xhc3NlcyBpbiB0aGUgZGlyZWN0b3JpZXMKK29mIHRoZSBwYXRoIHdpbGwgYmUgYWRkZWQgdG8gQW50J3MgY2xhc3Nsb2FkZXIuIFRoZSBvcmRlciBpbiB3aGljaCBqYXJzIGFyZQorYWRkZWQgdG8gdGhlIGNsYXNzcGF0aCBpcyBhcyBmb2xsb3dzOgorPC9wPgorCis8dWw+CisgIDxsaT4tbGliIGphcnMgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBieSB0aGUgLWxpYiBlbGVtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lPC9saT4KKyAgPGxpPmphcnMgZnJvbSAke3VzZXIuaG9tZX0vLmFudC9saWIgKHVubGVzcyAtbm91c2VybGliIGlzIHNldCk8L2xpPgorICA8bGk+amFycyBmcm9tIEFOVF9IT01FL2xpYjwvbGk+Cis8L3VsPgorCis8cD4KK05vdGUgdGhhdCB0aGUgQ0xBU1NQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHBhc3NlZCB0byBBbnQgdXNpbmcgYSAtbGliCitvcHRpb24uIEFudCBpdHNlbGYgaXMgc3RhcnRlZCB3aXRoIGEgdmVyeSBtaW5pbWFsaXN0aWMgY2xhc3NwYXRoLgorQW50IHNob3VsZCB3b3JrIHBlcmZlY3RseSB3ZWxsIHdpdGggYW4gZW1wdHkgQ0xBU1NQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLAorc29tZXRoaW5nIHRoZSB0aGUgLW5vY2xhc3NwYXRoIG9wdGlvbiBhY3R1YWxseSBlbmZvcmNlcy4gV2UgZ2V0IG1hbnkgbW9yZSBzdXBwb3J0IGNhbGxzIHJlbGF0ZWQgdG8gY2xhc3NwYXRoIHByb2JsZW1zIChlc3BlY2lhbGx5IHF1b3RpbmcgcHJvYmxlbXMpIHRoYW4KK3dlIGxpa2UuCisKKzwvcD4KKworPHA+CitUaGUgbG9jYXRpb24gb2YgJHt1c2VyLmhvbWV9Ly5hbnQvbGliIGlzIHNvbWV3aGF0IGRlcGVuZGVudCBvbiB0aGUgSlZNLiBPbiBVbml4CitzeXN0ZW1zICR7dXNlci5ob21lfSBtYXBzIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnkgd2hpbHN0IG9uIHJlY2VudAordmVyc2lvbnMgb2YgV2luZG93cyBpdCB3aWxsIGJlIHNvbWV3aGVyZSBzdWNoIGFzCitDOlxEb2N1bWVudHMmbmJzcDthbmQmbmJzcDtTZXR0aW5nc1x1c2VybmFtZVwuYW50XGxpYi4gWW91IHNob3VsZCBjb25zdWx0IHlvdXIKK0pWTSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCis8L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8YmxvY2txdW90ZT4KKyAgPHByZT5hbnQ8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPnJ1bnMgQW50IHVzaW5nIHRoZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBvbgordGhlIGRlZmF1bHQgdGFyZ2V0LjwvcD4KKzxibG9ja3F1b3RlPgorICA8cHJlPmFudCAtYnVpbGRmaWxlIHRlc3QueG1sPC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5ydW5zIEFudCB1c2luZyB0aGUgPGNvZGU+dGVzdC54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBvbgordGhlIGRlZmF1bHQgdGFyZ2V0LjwvcD4KKzxibG9ja3F1b3RlPgorICA8cHJlPmFudCAtYnVpbGRmaWxlIHRlc3QueG1sIGRpc3Q8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPnJ1bnMgQW50IHVzaW5nIHRoZSA8Y29kZT50ZXN0LnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG9uCit0aGUgdGFyZ2V0IGNhbGxlZCA8Y29kZT5kaXN0PC9jb2RlPi48L3A+Cis8YmxvY2txdW90ZT4KKyAgPHByZT5hbnQgLWJ1aWxkZmlsZSB0ZXN0LnhtbCAtRGJ1aWxkPWJ1aWxkL2NsYXNzZXMgZGlzdDwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+cnVucyBBbnQgdXNpbmcgdGhlIDxjb2RlPnRlc3QueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgb24KK3RoZSB0YXJnZXQgY2FsbGVkIDxjb2RlPmRpc3Q8L2NvZGU+LCBzZXR0aW5nIHRoZSA8Y29kZT5idWlsZDwvY29kZT4gcHJvcGVydHkKK3RvIHRoZSB2YWx1ZSA8Y29kZT5idWlsZC9jbGFzc2VzPC9jb2RlPi48L3A+CisKKzxibG9ja3F1b3RlPgorICA8cHJlPmFudCAtbGliIC9ob21lL2FudC9leHRyYXM8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPnJ1bnMgQW50IHBpY2tpbmcgdXAgYWRkaXRpb25hbCB0YXNrIGFuZCBzdXBwb3J0IGphcnMgZnJvbSB0aGUKKy9ob21lL2FudC9leHRyYXMgbG9jYXRpb24KKzwvcD4KKworPGgzPjxhIG5hbWU9ImZpbGVzIj5GaWxlczwvYT48L2gzPgorCis8cD5UaGUgQW50IHdyYXBwZXIgc2NyaXB0IGZvciBVbml4IHdpbGwgc291cmNlIChyZWFkIGFuZCBldmFsdWF0ZSkgdGhlCitmaWxlIDxjb2RlPn4vLmFudHJjPC9jb2RlPiBiZWZvcmUgaXQgZG9lcyBhbnl0aGluZy4gT24gV2luZG93cywgdGhlIEFudAord3JhcHBlciBiYXRjaC1maWxlIGludm9rZXMgPGNvZGU+JUhPTUUlXGFudHJjX3ByZS5iYXQ8L2NvZGU+IGF0IHRoZSBzdGFydCBhbmQKKzxjb2RlPiVIT01FJVxhbnRyY19wb3N0LmJhdDwvY29kZT4gYXQgdGhlIGVuZC4gIFlvdSBjYW4gdXNlIHRoZXNlCitmaWxlcywgZm9yIGV4YW1wbGUsIHRvIHNldC91bnNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBzaG91bGQgb25seSBiZQordmlzaWJsZSBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBBbnQuICBTZWUgdGhlIG5leHQgc2VjdGlvbiBmb3IgZXhhbXBsZXMuPC9wPgorCis8aDM+PGEgbmFtZT0iZW52dmFycyI+RW52aXJvbm1lbnQgVmFyaWFibGVzPC9hPjwvaDM+CisKKzxwPlRoZSB3cmFwcGVyIHNjcmlwdHMgdXNlIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpZgorc2V0KTo8L3A+CisKKzx1bD4KKyAgPGxpPjxjb2RlPkpBVkFDTUQ8L2NvZGU+IC0gZnVsbCBwYXRoIG9mIHRoZSBKYXZhIGV4ZWN1dGFibGUuICBVc2UgdGhpcworICB0byBpbnZva2UgYSBkaWZmZXJlbnQgSlZNIHRoYW4gPGNvZGU+SkFWQV9IT01FL2Jpbi9qYXZhKC5leGUpPC9jb2RlPi48L2xpPgorCisgIDxsaT48Y29kZT5BTlRfT1BUUzwvY29kZT4gLSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRoYXQgc2hvdWxkIGJlCisgIHBhc3NlZCB0byB0aGUgSlZNLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBkZWZpbmUgc3lzdGVtIHByb3BlcnRpZXMgb3Igc2V0CisgIHRoZSBtYXhpbXVtIEphdmEgaGVhcCBzaXplIGhlcmUuPC9saT4KKworICA8bGk+PGNvZGU+QU5UX0FSR1M8L2NvZGU+IC0gQW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHMuIEZvciBleGFtcGxlLAorICBzZXQgPGNvZGU+QU5UX0FSR1M8L2NvZGU+IHRvIHBvaW50IHRvIGEgZGlmZmVyZW50IGxvZ2dlciwgaW5jbHVkZSBhCisgIGxpc3RlbmVyLCBhbmQgdG8gaW5jbHVkZSB0aGUgPGNvZGU+LWZpbmQ8L2NvZGU+IGZsYWcuPC9saT4KKyAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3UgaW5jbHVkZSA8Y29kZT4tZmluZDwvY29kZT4KKyAgaW4gPGNvZGU+QU5UX0FSR1M8L2NvZGU+LCB5b3Ugc2hvdWxkIGluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIGJ1aWxkIGZpbGUKKyAgdG8gZmluZCwgZXZlbiBpZiB0aGUgZmlsZSBpcyBjYWxsZWQgPGNvZGU+YnVpbGQueG1sPC9jb2RlPi4KKzwvdWw+CisKKzxoMz48YSBuYW1lPSJzeXNwcm9wcyI+SmF2YSBTeXN0ZW0gUHJvcGVydGllczwvYT48L2gzPgorPHA+U29tZSBvZiBBbnQncyBjb3JlIGNsYXNzZXMgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHN5c3RlbSBwcm9wZXJ0aWVzLjwvcD4KKzxwPkhlcmUgaXMgdGhlIHJlc3VsdCBvZiBhIHNlYXJjaCB0aHJvdWdoIHRoZSBjb2RlYmFzZS4gQmVjYXVzZSBzeXN0ZW0gcHJvcGVydGllcyBhcmUKK2F2YWlsYWJsZSB2aWEgUHJvamVjdCBpbnN0YW5jZSwgSSBzZWFyY2hlZCBmb3IgdGhlbSB3aXRoIGEKKzxwcmU+CisgICAgZ3JlcCAtciAtbiAiZ2V0UHJvcGVydCIgKiAmZ3Q7IC4uXGdyZXAudHh0Cis8L3ByZT4KK2NvbW1hbmQuIEFmdGVyIHRoYXQgSSBmaWx0ZXJlZCBvdXQgdGhlIG9mdGVuLXVzZWQgYnV0IG5vdC1zby1pbXBvcnRhbnQgdmFsdWVzIChtb3N0IG9mIHRoZW0KK3JlYWQtb25seSB2YWx1ZXMpOiA8aT5wYXRoLnNlcGFyYXRvciwgYW50LmhvbWUsIGJhc2VkaXIsIHVzZXIuZGlyLCBvcy5uYW1lLAorbGluZS5zZXBhcmF0b3IsIGphdmEuaG9tZSwgamF2YS52ZXJzaW9uLCBqYXZhLnZlcnNpb24sIHVzZXIuaG9tZSwgamF2YS5jbGFzcy5wYXRoPC9pPjxicj4KK0FuZCBJIGZpbHRlcmVkIG91dCB0aGUgPGk+Z2V0UHJvcGVydHlIZWxwZXI8L2k+IGFjY2Vzcy48L3A+Cis8dGFibGUgYm9yZGVyPSIxIj4KKzx0cj4KKyAgPHRoPnByb3BlcnR5IG5hbWU8L3RoPgorICA8dGg+dmFsaWQgdmFsdWVzIC9kZWZhdWx0IHZhbHVlPC90aD4KKyAgPHRoPmRlc2NyaXB0aW9uPC90aD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5hbnQuYnVpbGQuamF2YWMuc291cmNlPC9jb2RlPjwvdGQ+CisgIDx0ZD5Tb3VyY2UtbGV2ZWwgdmVyc2lvbiBudW1iZXI8L3RkPgorICA8dGQ+RGVmYXVsdCA8ZW0+c291cmNlPC9lbT4gdmFsdWUgZm9yICZsdDtqYXZhYyZndDsvJmx0O2phdmFkb2MmZ3Q7PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5hbnQuYnVpbGQuamF2YWMudGFyZ2V0PC9jb2RlPjwvdGQ+CisgIDx0ZD5DbGFzcy1jb21wYXRpYmlsaXR5IHZlcnNpb24gbnVtYmVyPC90ZD4KKyAgPHRkPkRlZmF1bHQgPGVtPnRhcmdldDwvZW0+IHZhbHVlIGZvciAmbHQ7amF2YWMmZ3Q7PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5hbnQuZXhlY3V0b3IuY2xhc3M8L2NvZGU+PC90ZD4KKyAgPHRkPmNsYXNzbmFtZTsgZGVmYXVsdCBpcyBvcmcuIGFwYWNoZS4gdG9vbHMuIGFudC4gaGVscGVyLiBEZWZhdWx0RXhlY3V0b3I8L3RkPgorICA8dGQ+PGI+U2luY2UgQW50IDEuNi4zPC9iPiBBbnQgd2lsbCBkZWxlZ2F0ZSBUYXJnZXQgaW52b2NhdGlvbiB0byB0aGUKK29yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yIGltcGxlbWVudGF0aW9uIHNwZWNpZmllZCBoZXJlLgorICA8L3RkPgorPC90cj4KKworPHRyPgorICA8dGQ+PGNvZGU+YW50LmZpbGU8L2NvZGU+PC90ZD4KKyAgPHRkPnJlYWQgb25seTogZnVsbCBmaWxlbmFtZSBvZiB0aGUgYnVpbGQgZmlsZTwvdGQ+CisgIDx0ZD5UaGlzIGlzIHNldCB0byB0aGUgbmFtZSBvZiB0aGUgYnVpbGQgZmlsZS4gSW4KKyAgPGEgaHJlZj0iQ29yZVRhc2tzL2ltcG9ydC5odG1sIj4KKyAgJmx0O2ltcG9ydCZndDstZWQ8L2E+IGZpbGVzLCB0aGlzIGlzIHNldCB0byB0aGUgY29udGFpbmluZyBidWlsZCBmaWxlLgorICA8L3RkPgorPC90cj4KKworPHRyPgorICA8dGQ+PGNvZGU+YW50LmZpbGUuKjwvY29kZT48L3RkPgorICA8dGQ+cmVhZCBvbmx5OiBmdWxsIGZpbGVuYW1lIG9mIHRoZSBidWlsZCBmaWxlIG9mIEFudCBwcm9qZWN0cworICA8L3RkPgorICA8dGQ+VGhpcyBpcyBzZXQgdG8gdGhlIG5hbWUgb2YgYSBmaWxlIGJ5IHByb2plY3Q7CisgIHRoaXMgbGV0cyB5b3UgZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiA8YSBocmVmPSJDb3JlVGFza3MvaW1wb3J0Lmh0bWwiPgorICAmbHQ7aW1wb3J0Jmd0Oy1lZDwvYT4gZmlsZXMsCisgIDwvdGQ+Cis8L3RyPgorCis8dHI+CisgIDx0ZD48Y29kZT5hbnQuaW5wdXQucHJvcGVydGllczwvY29kZT48L3RkPgorICA8dGQ+ZmlsZW5hbWUgKHJlcXVpcmVkKTwvdGQ+CisgIDx0ZD5OYW1lIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIHZhbHVlcyBmb3IgdGhlCisgICAgICA8YSBocmVmPSJpbnB1dGhhbmRsZXIuaHRtbCI+UHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyPC9hPi4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5hbnQubG9nZ2VyLmRlZmF1bHRzPC9jb2RlPjwvdGQ+CisgIDwhLS0gYWRkIHRoZSBibGFuayBhZnRlciB0aGUgc2xhc2gsIHNvIHRoZSBicm93c2VyIGNhbiBkbyBhIGxpbmUgYnJlYWsgLS0+CisgIDx0ZD5maWxlbmFtZSAob3B0aW9uYWwsIGRlZmF1bHQgJy9vcmcvIGFwYWNoZS8gdG9vbHMvIGFudC8gbGlzdGVuZXIvIGRlZmF1bHRzLnByb3BlcnRpZXMnKTwvdGQ+CisgIDx0ZD5OYW1lIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIGNvbG9yIG1hcHBpbmdzIGZvciB0aGUKKyAgICAgIDxhIGhyZWY9Imxpc3RlbmVycy5odG1sI0Fuc2lDb2xvckxvZ2dlciI+QW5zaUNvbG9yTG9nZ2VyPC9hPi4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5hbnQubmV0cmV4eGMuKjwvY29kZT48L3RkPgorICA8dGQ+c2V2ZXJhbCBmb3JtYXRzPC90ZD4KKyAgPHRkPlVzZSBzcGVjaWZpZWQgdmFsdWVzIGFzIGRlZmF1bHRzIGZvciA8YSBocmVmPSJPcHRpb25hbFRhc2tzL25ldHJleHhjLmh0bWwiPm5ldHJleHhjPC9hPi4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5hbnQuUHJvcGVydHlIZWxwZXI8L2NvZGU+PC90ZD4KKyAgPHRkPmFudC1yZWZlcmVuY2UtbmFtZSAob3B0aW9uYWwpPC90ZD4KKyAgPHRkPlNwZWNpZnkgdGhlIFByb3BlcnR5SGVscGVyIHRvIHVzZS4gVGhlIG9iamVjdCBtdXN0IGJlIG9mIHRoZSB0eXBlCisgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlci4gSWYgbm90IGRlZmluZWQgYW4gb2JqZWN0IG9mCisgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlciB3aWxsIGJlIHVzZWQgYXMgUHJvcGVydHlIZWxwZXIuCisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PGNvZGU+YW50LnJlZ2V4cC5yZWdleHBpbXBsPC9jb2RlPjwvdGQ+CisgIDx0ZD5jbGFzc25hbWU8L3RkPgorICA8dGQ+Y2xhc3NuYW1lIGZvciBhIFJlZ0V4cCBpbXBsZW1lbnRhdGlvbjsgaWYgbm90IHNldCBBbnQgdHJpZXMgdG8KKyAgICAgIGZpbmQgYW5vdGhlciAoSkRLMTQrLCBBcGFjaGUgT3JvLi4uKTsKKyAgICAgIDxhIGhyZWY9IkNvcmVUeXBlcy9tYXBwZXIuaHRtbCNyZWdleHAtbWFwcGVyIj5SZWdFeHAtTWFwcGVyPC9hPgorICAgICAgIkNob2ljZSBvZiByZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24iCisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PGNvZGU+YW50LnJldXNlLmxvYWRlcjwvY29kZT48L3RkPgorICA8dGQ+Ym9vbGVhbjwvdGQ+CisgIDx0ZD5hbGxvdyB0byByZXVzZSBjbGFzc2xvYWRlcnMKKyAgICAgIHVzZWQgaW4gb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5DbGFzc3BhdGhVdGlsCisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PGNvZGU+YW50LlhtbExvZ2dlci5zdHlsZXNoZWV0LnVyaTwvY29kZT48L3RkPgorICA8dGQ+ZmlsZW5hbWUgKGRlZmF1bHQgJ2xvZy54c2wnKTwvdGQ+CisgIDx0ZD5OYW1lIGZvciB0aGUgc3R5bGVzaGVldCB0byBpbmNsdWRlIGluIHRoZSBsb2dmaWxlIGJ5CisgICAgICA8YSBocmVmPSJsaXN0ZW5lcnMuaHRtbCNYbWxMb2dnZXIiPlhtbExvZ2dlcjwvYT4uCisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+PC90ZD4KKyAgPHRkPm5hbWU8L3RkPgorICA8dGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBjb21waWxlciB0byB1c2UuCisgICAgICBzZWUgPGEgaHJlZj0iQ29yZVRhc2tzL2phdmFjLmh0bWwiPmphdmFjPC9hPiwKKyAgICAgIDxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvZWpiLmh0bWwjZWpiamFyX3dlYmxvZ2ljIj5FSkIgVGFza3M8L2E+CisgICAgICAoY29tcGlsZXIgYXR0cmlidXRlKSwKKyAgICAgIDxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvamF2YWguaHRtbCI+amF2YWg8L2E+CisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PGNvZGU+YnVpbGQuY29tcGlsZXIuZW1hY3M8L2NvZGU+PC90ZD4KKyAgPHRkPmJvb2xlYW4gKGRlZmF1bHQgZmFsc2UpPC90ZD4KKyAgPHRkPkVuYWJsZSBlbWFjcy1jb21wYXRpYmxlIGVycm9yIG1lc3NhZ2VzLgorICAgICAgc2VlIDxhIGhyZWY9IkNvcmVUYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4gIkppa2VzIE5vdGVzIgorICA8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxjb2RlPmJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQ8L2NvZGU+PC90ZD4KKyAgPHRkPmJvb2xlYW4gKGRlZmF1bHQgZmFsc2UpPC90ZD4KKyAgPHRkPkVuYWJsZSBmdWxsIGRlcGVuZGVuY3kgY2hlY2tpbmcKKyAgICAgIHNlZSA8YSBocmVmPSJDb3JlVGFza3MvamF2YWMuaHRtbCI+amF2YWM8L2E+ICJKaWtlcyBOb3RlcyIKKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5idWlsZC5jb21waWxlci5qdmMuZXh0ZW5zaW9uczwvY29kZT48L3RkPgorICA8dGQ+Ym9vbGVhbiAoZGVmYXVsdCB0cnVlKTwvdGQ+CisgIDx0ZD5lbmFibGUgTWljcm9zb2Z0IGV4dGVuc2lvbnMgb2YgdGhlaXIgamF2YSBjb21waWxlcgorICAgICAgc2VlIDxhIGhyZWY9IkNvcmVUYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4gIkp2YyBOb3RlcyIKKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5idWlsZC5jb21waWxlci5wZWRhbnRpYzwvY29kZT48L3RkPgorICA8dGQ+Ym9vbGVhbiAoZGVmYXVsdCBmYWxzZSk8L3RkPgorICA8dGQ+RW5hYmxlIHBlZGFudGljIHdhcm5pbmdzLgorICAgICAgc2VlIDxhIGhyZWY9IkNvcmVUYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4gIkppa2VzIE5vdGVzIgorICA8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxjb2RlPmJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzPC9jb2RlPjwvdGQ+CisgIDx0ZD5EZXByZWNhdGVkIGZsYWc8L3RkPgorICA8dGQ+IHNlZSA8YSBocmVmPSJDb3JlVGFza3MvamF2YWMuaHRtbCI+amF2YWM8L2E+ICJKaWtlcyBOb3RlcyIgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5idWlsZC5ybWljPC9jb2RlPjwvdGQ+CisgIDx0ZD5uYW1lPC90ZD4KKyAgPHRkPmNvbnRyb2wgdGhlIDxhIGhyZWY9IkNvcmVUYXNrcy9ybWljLmh0bWwiPnJtaWM8L2E+IGNvbXBpbGVyIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PGNvZGU+YnVpbGQuc3lzY2xhc3NwYXRoPC9jb2RlPjwvdGQ+CisgIDx0ZD4ib25seSIsIHNvbWV0aGluZyBlbHNlPC90ZD4KKyAgPHRkPm9ubHk6IGN1cnJlbnQgdGhyZWFkcyBnZXQgdGhlIGFjdHVhbCBjbGFzcyBsb2FkZXIKKyAgICAgIChBbnRDbGFzc0xvYWRlci5zZXRUaHJlYWRDb250ZXh0TG9hZGVyKCkpLgorICAgICAgZWxzZTogdXNlIGNvcmUgbG9hZGVyIGFzIGRlZmF1bHQgKENvbXBvbmVudEhlbHBlci5pbml0VGFza3MoKSkuIERpc2FibGUKKyAgICAgIGNoYW5naW5nIHRoZSBjbGFzc2xvYWRlciAob2F0YS50YXNrZGVmcy5DbGFzc2xvYWRlci5leGVjdXRlKCkgZXhwZXJpbWVudGFsCisgICAgICB0YXNrKS4KKyAgICAgIDwhLS0gc29tZXdoZXJlIGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbD8/IC0tPgorICA8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxjb2RlPmZpbGUuZW5jb2Rpbmc8L2NvZGU+PC90ZD4KKyAgPHRkPm5hbWUgb2YgYSBzdXBwb3J0ZWQgY2hhcmFjdGVyIHNldCAoZS5nLiBVVEYtOCwgSVNPLTg4NTktMSwgVVMtQVNDSUkpPC90ZD4KKyAgPHRkPnVzZSBhcyBkZWZhdWx0IGNoYXJhY3RlciBzZXQgb2YgZW1haWwgbWVzc2FnZXM7IHVzZSBhcyBkZWZhdWx0IGZvciBzb3VyY2UtLCBkZXN0LSBhbmQgYnVuZGxlZW5jb2RpbmcKKyAgICAgIGluIDxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvdHJhbnNsYXRlLmh0bWwiPnRyYW5zbGF0ZTwvYT4gPGJyPgorICAgICAgc2VlIEphdmFEb2Mgb2YgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXQuaHRtbCI+amF2YS5uaW8uY2hhcnNldC5DaGFyc2V0PC9hPgorICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY2hhcmFjdGVyIHNldHMgKG5vdCB1c2VkIGluIEFudCwgYnV0IGhhcyBuaWNlIGRvY3MpLgorICA8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxjb2RlPmppa2VzLmNsYXNzLnBhdGg8L2NvZGU+PC90ZD4KKyAgPHRkPnBhdGg8L3RkPgorICA8dGQ+VGhlIHNwZWNpZmllZCBwYXRoIGlzIGFkZGVkIHRvIHRoZSBjbGFzc3BhdGggaWYgamlrZXMgaXMgdXNlZCBhcyBjb21waWxlci48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxjb2RlPk1haWxMb2dnZXIucHJvcGVydGllcy5maWxlLCBNYWlsTG9nZ2VyLio8L2NvZGU+PC90ZD4KKyAgPHRkPmZpbGVuYW1lIChvcHRpb25hbCwgZGVmYXVsdHMgZGVyaXZlZCBmcm9tIFByb2plY3QgaW5zdGFuY2UpPC90ZD4KKyAgPHRkPk5hbWUgb2YgdGhlIGZpbGUgaG9sZGluZyBwcm9wZXJ0aWVzIGZvciBzZW5kaW5nIGVtYWlscyBieSB0aGUKKyAgICAgIDxhIGhyZWY9Imxpc3RlbmVycy5odG1sI01haWxMb2dnZXIiPk1haWxMb2dnZXI8L2E+LiBPdmVycmlkZSBwcm9wZXJ0aWVzIHNldAorICAgICAgaW5zaWRlIHRoZSBidWlsZGZpbGUgb3IgdmlhIGNvbW1hbmQgbGluZS4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyPC9jb2RlPjwvdGQ+CisgIDwhLS0gYWRkIHRoZSBibGFuayBhZnRlciB0aGUgc2xhc2gsIHNvIHRoZSBicm93c2VyIGNhbiBkbyBhIGxpbmUgYnJlYWsgLS0+CisgIDx0ZD5jbGFzc25hbWUgKG9wdGlvbmFsLCBkZWZhdWx0ICdvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyJyk8L3RkPgorICA8dGQ+c3BlY2lmaWVzIHRoZSBjbGFzc25hbWUgdG8gdXNlIGFzIFByb2plY3RIZWxwZXIuIFRoZSBjbGFzcyBtdXN0IGV4dGVuZAorICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlci4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5wNC5wb3J0LCBwNC5jbGllbnQsIHA0LnVzZXI8L2NvZGU+PC90ZD4KKyAgPHRkPnNldmVyYWwgZm9ybWF0czwvdGQ+CisgIDx0ZD5TcGVjaWZ5IGRlZmF1bHRzIGZvciBwb3J0LSwgY2xpZW50LSBhbmQgdXNlci1zZXR0aW5nIG9mIHRoZQorICAgICAgPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9wZXJmb3JjZS5odG1sIj5wZXJmb3JjZTwvYT4gdGFza3MuCisgIDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQ+PGNvZGU+d2Vic3BoZXJlLmhvbWUKKyAgPHRkPnBhdGg8L3RkPgorICA8dGQ+UG9pbnRzIHRvIGhvbWUgZGlyZWN0b3J5IG9mIHdlYnNwaGVyZS4KKyAgICAgIHNlZSA8YSBocmVmPSJPcHRpb25hbFRhc2tzL2VqYi5odG1sI2VqYmphcl93ZWJzcGhlcmUiPkVKQiBUYXNrczwvYT4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48Y29kZT5YbWxMb2dnZXIuZmlsZQorICA8dGQ+ZmlsZW5hbWUgKGRlZmF1bHQgJ2xvZy54bWwnKTwvdGQ+CisgIDx0ZD5OYW1lIGZvciB0aGUgbG9nZmlsZSBmb3IgPGEgaHJlZj0ibGlzdGVuZXJzLmh0bWwjTWFpbExvZ2dlciI+TWFpbExvZ2dlcjwvYT4uCisgIDwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworPHA+CitJZiBuZXcgcHJvcGVydGllcyBnZXQgYWRkZWQgKGl0IGhhcHBlbnMpLCBleHBlY3QgdGhlbSB0byBhcHBlYXIgdW5kZXIgdGhlCisiYW50LiIgYW5kICJvcmcuYXBhY2hlLnRvb2xzLmFudCIgcHJlZml4ZXMsIHVubGVzcyB0aGUgZGV2ZWxvcGVycyBoYXZlIGEKK3ZlcnkgZ29vZCByZWFzb24gdG8gdXNlIGFub3RoZXIgcHJlZml4LiBBY2NvcmRpbmdseSwgcGxlYXNlIGF2b2lkIHVzaW5nCitwcm9wZXJ0aWVzIHRoYXQgYmVnaW4gd2l0aCB0aGVzZSBwcmVmaXhlcy4gVGhpcyBwcm90ZWN0cyB5b3UgZnJvbSBmdXR1cmUKK0FudCByZWxlYXNlcyBicmVha2luZyB5b3VyIGJ1aWxkIGZpbGUuCis8L3A+Cis8aDM+cmV0dXJuIGNvZGU8L2gzPgorPHA+dGhlIGFudCBzdGFydCB1cCBzY3JpcHRzIChpbiB0aGVpciBXaW5kb3dzIGFuZCBVbml4IHZlcnNpb24pIHJldHVybgordGhlIHJldHVybiBjb2RlIG9mIHRoZSBqYXZhIHByb2dyYW0uIFNvIGEgc3VjY2Vzc2Z1bCBidWlsZCByZXR1cm5zIDAsCitmYWlsZWQgYnVpbGRzIHJldHVybiBvdGhlciB2YWx1ZXMuCis8L3A+CisKKzxoMj48YSBuYW1lPSJjeWd3aW4iPkN5Z3dpbiBVc2VyczwvYT48L2gyPgorPHA+VGhlIFVuaXggbGF1bmNoIHNjcmlwdCB0aGF0IGNvbWUgd2l0aCBBbnQgd29ya3MgY29ycmVjdGx5IHdpdGggQ3lnd2luLiBZb3UKK3Nob3VsZCBub3QgaGF2ZSBhbnkgcHJvYmxlbXMgbGF1bmNoaW5nIEFudCBmcm9tIHRoZSBDeWd3aW4gc2hlbGwuIEl0IGlzCitpbXBvcnRhbnQgdG8gbm90ZSwgaG93ZXZlciwgdGhhdCBvbmNlIEFudCBpcyBydW5uaW5nIGl0IGlzIHBhcnQgb2YgdGhlIEpESword2hpY2ggb3BlcmF0ZXMgYXMgYSBuYXRpdmUgV2luZG93cyBhcHBsaWNhdGlvbi4gVGhlIEpESyBpcyBub3QgYSBDeWd3aW4KK2V4ZWN1dGFibGUsIGFuZCBpdCB0aGVyZWZvcmUgaGFzIG5vIGtub3dsZWRnZSBvZiBDeWd3aW4gcGF0aHMsIGV0Yy4gSW4KK3BhcnRpY3VsYXIgd2hlbiB1c2luZyB0aGUgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrLCBleGVjdXRhYmxlIG5hbWVzIHN1Y2gKK2FzICZxdW90Oy9iaW4vc2gmcXVvdDsgd2lsbCBub3Qgd29yaywgZXZlbiB0aG91Z2ggdGhlc2Ugd29yayBmcm9tIHRoZSBDeWd3aW4KK3NoZWxsIGZyb20gd2hpY2ggQW50IHdhcyBsYXVuY2hlZC4gWW91IGNhbiB1c2UgYW4gZXhlY3V0YWJsZSBuYW1lIHN1Y2ggYXMKKyZxdW90O3NoJnF1b3Q7IGFuZCByZWx5IG9uIHRoYXQgY29tbWFuZCBiZWluZyBhdmFpbGFibGUgaW4gdGhlIFdpbmRvd3MgcGF0aC4KKzwvcD4KKworPGgyPjxhIG5hbWU9Im9zMiI+T1MvMiBVc2VyczwvYT48L2gyPgorPHA+VGhlIE9TLzIgbGF1bmNoIHNjcmlwdCB3YXMgZGV2ZWxvcGVkIHRvIHBlcmZvcm0gY29tcGxleCB0YXNrcy4gSXQgaGFzIHR3byBwYXJ0czoKKzxjb2RlPmFudC5jbWQ8L2NvZGU+IHdoaWNoIGNhbGxzIEFudCBhbmQgPGNvZGU+YW50ZW52LmNtZDwvY29kZT4gd2hpY2ggc2V0cyB0aGUgZW52aXJvbm1lbnQgZm9yIEFudC4KK01vc3Qgb2Z0ZW4geW91IHdpbGwganVzdCBjYWxsIDxjb2RlPmFudC5jbWQ8L2NvZGU+IHVzaW5nIHRoZSBzYW1lIGNvbW1hbmQgbGluZSBvcHRpb25zIGFzIGRlc2NyaWJlZAorYWJvdmUuIFRoZSBiZWhhdmlvdXIgY2FuIGJlIG1vZGlmaWVkIGJ5IGEgbnVtYmVyIG9mIHdheXMgZXhwbGFpbmVkIGJlbG93LjwvcD4KKworPHA+U2NyaXB0IDxjb2RlPmFudC5jbWQ8L2NvZGU+IGZpcnN0IHZlcmlmaWVzIHdoZXRoZXIgdGhlIEFudCBlbnZpcm9ubWVudCBpcyBzZXQgY29ycmVjdGx5LiBUaGUKK3JlcXVpcmVtZW50cyBhcmU6PC9wPgorPG9sPgorPGxpPkVudmlyb25tZW50IHZhcmlhYmxlIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4gaXMgc2V0LjwvbGk+Cis8bGk+RW52aXJvbm1lbnQgdmFyaWFibGUgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IGlzIHNldC48L2xpPgorPGxpPkVudmlyb25tZW50IHZhcmlhYmxlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gaXMgc2V0IGFuZCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudCBmcm9tCis8Y29kZT5KQVZBX0hPTUU8L2NvZGU+IGFuZCBhdCBsZWFzdCBvbmUgZWxlbWVudCBmcm9tIDxjb2RlPkFOVF9IT01FPC9jb2RlPi48L2xpPgorPC9vbD4KKworPHA+SWYgYW55IG9mIHRoZXNlIGNvbmRpdGlvbnMgaXMgdmlvbGF0ZWQsIHNjcmlwdCA8Y29kZT5hbnRlbnYuY21kPC9jb2RlPiBpcyBjYWxsZWQuIFRoaXMgc2NyaXB0CitmaXJzdCBpbnZva2VzIGNvbmZpZ3VyYXRpb24gc2NyaXB0cyBpZiB0aGVyZSBleGlzdDogdGhlIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24KKzxjb2RlPmFudGNvbmYuY21kPC9jb2RlPiBmcm9tIHRoZSA8Y29kZT4lRVRDJTwvY29kZT4gZGlyZWN0b3J5IGFuZCB0aGVuIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24KKzxjb2RlPmFudHJjLmNtZDwvY29kZT4gZnJvbSB0aGUgPGNvZGU+JUhPTUUlPC9jb2RlPiBkaXJlY3RvcnkuIEF0IHRoaXMgbW9tZW50IGJvdGgKKzxjb2RlPkpBVkFfSE9NRTwvY29kZT4gYW5kIDxjb2RlPkFOVF9IT01FPC9jb2RlPiBtdXN0IGJlIGRlZmluZWQgYmVjYXVzZSA8Y29kZT5hbnRlbnYuY21kPC9jb2RlPgorbm93IGFkZHMgPGNvZGU+Y2xhc3Nlcy56aXA8L2NvZGU+IG9yIDxjb2RlPnRvb2xzLmphcjwvY29kZT4gKGRlcGVuZGluZyBvbiB2ZXJzaW9uIG9mIEpWTSkgYW5kCitldmVyeXRoaW5nIGZyb20gPGNvZGU+JUFOVF9IT01FJVxsaWI8L2NvZGU+IGV4Y2VwdCA8Y29kZT5hbnQtKi5qYXI8L2NvZGU+IHRvCis8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LiBGaW5hbGx5IDxjb2RlPmFudC5jbWQ8L2NvZGU+IGNhbGxzIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbgorPGNvZGU+YW50cmMuY21kPC9jb2RlPi4gQWxsIHNldHRpbmdzIG1hZGUgYnkgPGNvZGU+YW50LmNtZDwvY29kZT4gYXJlIGxvY2FsIGFuZCBhcmUgdW5kb25lIHdoZW4gdGhlCitzY3JpcHQgZW5kcy4gVGhlIHNldHRpbmdzIG1hZGUgYnkgPGNvZGU+YW50ZW52LmNtZDwvY29kZT4gYXJlIHBlcnNpc3RlbnQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUKK3NoZWxsIChvZiBjb3Vyc2UgdW5sZXNzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gPGNvZGU+YW50LmNtZDwvY29kZT4pLiBJdCBpcyB0aHVzIHBvc3NpYmxlIHRvIGNhbGwKKzxjb2RlPmFudGVudi5jbWQ8L2NvZGU+IG1hbnVhbGx5IGFuZCBtb2RpZnkgc29tZSBzZXR0aW5ncyBiZWZvcmUgY2FsbGluZyA8Y29kZT5hbnQuY21kPC9jb2RlPi48L3A+CisKKzxwPlNjcmlwdHMgPGNvZGU+ZW52c2V0LmNtZDwvY29kZT4gYW5kIDxjb2RlPnJ1bnJjLmNtZDwvY29kZT4gcGVyZm9ybSBhdXhpbGlhcnkgdGFza3MuIEFsbCBzY3JpcHRzCitoYXZlIHNvbWUgZG9jdW1lbnRhdGlvbiBpbnNpZGUuPC9wPgorCis8aDI+PGEgbmFtZT0idmlhamF2YSI+UnVubmluZyBBbnQgdmlhIEphdmE8L2E+PC9oMj4KKzxwPklmIHlvdSBoYXZlIGluc3RhbGxlZCBBbnQgaW4gdGhlIGRvLWl0LXlvdXJzZWxmIHdheSwgQW50IGNhbiBiZSBzdGFydGVkCitmcm9tIG9uZSBvZiB0d28gZW50cnkgcG9pbnRzOjwvcD4KKzxibG9ja3F1b3RlPgorICA8cHJlPmphdmEgLURhbnQuaG9tZT1jOlxhbnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbiBbb3B0aW9uc10gW3RhcmdldF08L3ByZT4KKzwvYmxvY2txdW90ZT4KKworPGJsb2NrcXVvdGU+CisgIDxwcmU+amF2YSAtRGFudC5ob21lPWM6XGFudCBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIgW29wdGlvbnNdIFt0YXJnZXRdPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKKzxwPgorVGhlIGZpcnN0IG1ldGhvZCBydW5zIEFudCdzIHRyYWRpdGlvbmFsIGVudHJ5IHBvaW50LiBUaGUgc2Vjb25kIG1ldGhvZCB1c2VzCit0aGUgQW50IExhdW5jaGVyIGludHJvZHVjZWQgaW4gQW50IDEuNi4gVGhlIGZvcm1lciBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydAordGhlIC1saWIgb3B0aW9uIGFuZCBhbGwgcmVxdWlyZWQgY2xhc3NlcyBhcmUgbG9hZGVkIGZyb20gdGhlIENMQVNTUEFUSC4gWW91IG11c3QKK2Vuc3VyZSB0aGF0IGFsbCByZXF1aXJlZCBqYXJzIGFyZSBhdmFpbGFibGUuIEF0IGEgbWluaW11bSB0aGUgQ0xBU1NQQVRIIHNob3VsZAoraW5jbHVkZToKKzwvcD4KKworPHVsPgorPGxpPjxjb2RlPmFudC5qYXI8L2NvZGU+IGFuZCA8Y29kZT5hbnQtbGF1bmNoZXIuamFyPC9jb2RlPjwvbGk+Cis8bGk+amFycy9jbGFzc2VzIGZvciB5b3VyIFhNTCBwYXJzZXI8L2xpPgorPGxpPnRoZSBKREsncyByZXF1aXJlZCBqYXIvemlwIGZpbGVzPC9saT4KKzwvdWw+CisKKzxwPgorVGhlIGxhdHRlciBtZXRob2Qgc3VwcG9ydHMgdGhlIC1saWIsIC1ub3VzZXJsaWIsIC1ub2NsYXNzcGF0aCBvcHRpb25zIGFuZCB3aWxsCisgICAgbG9hZCBqYXJzIGZyb20gdGhlIHNwZWNpZmllZCBBTlRfSE9NRS4gWW91IHNob3VsZCBzdGFydCB0aGUgbGF0dGVyIHdpdGggdGhlIG1vc3QgbWluaW1hbAorY2xhc3NwYXRoIHBvc3NpYmxlLCBnZW5lcmFsbHkganVzdCB0aGUgYW50LWxhdW5jaGVyLmphci4KKzwvcD4KKworPGEgbmFtZT0idmlhYW50Ii8+CisKK0FudCBjYW4gYmUgc3RhcnRlZCBpbiBBbnQgdmlhIHRoZSA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IGNvbW1hbmQuCitIZXJlIGlzIGFuIGV4YW1wbGU6CisKKzxwcmU+CismbHQ7amF2YQorICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciIKKyAgICAgICAgZm9yaz0idHJ1ZSIKKyAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICAgIGRpcj0iJHtzdWIuYnVpbGRkaXJ9IgorICAgICAgICB0aW1lb3V0PSI0MDAwMDAwIgorICAgICAgICB0YXNrbmFtZT0ic3RhcnRBbnQiCismZ3Q7CisgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5ob21lfS9saWIvYW50LWxhdW5jaGVyLmphciIvJmd0OworICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAgICZsdDthcmcgdmFsdWU9Ii1idWlsZGZpbGUiLyZndDsKKyAgICAmbHQ7YXJnIGZpbGU9IiR7c3ViLmJ1aWxkZmlsZX0iLyZndDsKKyAgICAmbHQ7YXJnIHZhbHVlPSItRHRoaXM9dGhpcyIvJmd0OworICAgICZsdDthcmcgdmFsdWU9Ii1EdGhhdD10aGF0Ii8mZ3Q7CisgICAgJmx0O2FyZyB2YWx1ZT0iLURiYXNlZGlyPSR7c3ViLmJ1aWxkZGlyfSIvJmd0OworICAgICZsdDthcmcgdmFsdWU9Ii1EdGhlLm90aGVyPXRoZS5vdGhlciIvJmd0OworICAgICZsdDthcmcgdmFsdWU9IiR7c3ViLnRhcmdldH0iLyZndDsKKyZsdDsvamF2YSZndDsKKzwvcHJlPgorPGJyPgorCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3J1bm5pbmdsaXN0Lmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9ydW5uaW5nbGlzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmQ5NDUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9ydW5uaW5nbGlzdC5odG1sCkBAIC0wLDAgKzEsNDQgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KKzx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KKzxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgaHJlZj0idG9jLmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPlRhYmxlIG9mIENvbnRlbnRzPC9hPjwvaDI+CisKKzxoMz5SdW5uaW5nIEFudDwvaDM+Cis8YSBocmVmPSJydW5uaW5nLmh0bWwjY29tbWFuZGxpbmUiPkNvbW1hbmQgTGluZTwvYT48YnIvPgorPGRpdiBzdHlsZT0icGFkZGluZy1sZWZ0OjFlbSI+CisgIDxhIGhyZWY9InJ1bm5pbmcuaHRtbCNvcHRpb25zIj5PcHRpb25zPC9hPjxici8+CisgIDxhIGhyZWY9InJ1bm5pbmcuaHRtbCNsaWJzIj5MaWJyYXJ5IERpcmVjdG9yaWVzPC9hPjxici8+CisgIDxhIGhyZWY9InJ1bm5pbmcuaHRtbCNmaWxlcyI+RmlsZXM8L2E+PGJyLz4KKyAgPGEgaHJlZj0icnVubmluZy5odG1sI2VudnZhcnMiPkVudmlyb25tZW50IFZhcmlhYmxlczwvYT48YnIvPgorICA8YSBocmVmPSJydW5uaW5nLmh0bWwjc3lzcHJvcHMiPkphdmEgU3lzdGVtIFByb3BlcnRpZXM8L2E+PGJyLz4KKyAgPGEgaHJlZj0icnVubmluZy5odG1sI2N5Z3dpbiI+Q3lnd2luIFVzZXJzPC9hPjxici8+CisgIDxhIGhyZWY9InJ1bm5pbmcuaHRtbCNvczIiPk9TLzIgVXNlcnM8L2E+PGJyLz4KKzwvZGl2PgorPGEgaHJlZj0icnVubmluZy5odG1sI3ZpYWphdmEiPlJ1bm5pbmcgQW50IHZpYSBKYXZhPC9hPjxici8+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3N0eWxlc2hlZXRzL2FudG1hbnVhbC5jc3MgYi90cnVuay9kb2NzL21hbnVhbC9zdHlsZXNoZWV0cy9hbnRtYW51YWwuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OWIyZWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL21hbnVhbC9zdHlsZXNoZWV0cy9hbnRtYW51YWwuY3NzCkBAIC0wLDAgKzEsMjAgQEAKKy8qIAorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqLworYm9keSB7CisgICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoL2ltYWdlcy9iZXRhLnBuZykKK30KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyBiL3RydW5rL2RvY3MvbWFudWFsL3N0eWxlc2hlZXRzL3N0eWxlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA3ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvc3R5bGVzaGVldHMvc3R5bGUuY3NzCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK2gyIHsKKyAgZm9udC1zaXplOiAyMDAlOworICBiYWNrZ3JvdW5kLWNvbG9yOiBmZmZmZmY7Cit9CisKK2gzIHsKKyAgZm9udC1zaXplOiAxMzAlOworICBjb2xvcjogICAgICNmZmZmZmY7CisgIGJhY2tncm91bmQtY29sb3I6ICM1MjVENzY7Cit9CisKK2g0IHsKKyAgY29sb3I6ICAjZmZmZmZmOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjODI4REE2OworfQorCit0ZCB7CisgICBiYWNrZ3JvdW5kLWNvbG9yOiBlZWVlZWU7CisgICBjb2xvcjogICAgICAgICAgICAwMDAwMDA7Cit9CisKKy8qIGZpcnN0IHJvdyAqLwordGFibGUgdHI6Zmlyc3QtY2hpbGQgdGQgeworICAgYmFja2dyb3VuZC1jb2xvcjogY2NjY2NjOworICAgY29sb3I6ICAgICAgICAgICAgMDAwMDAwOworfQorCisvKiBvciB0aCBhcyBmaXJzdCByb3cgKi8KK3RhYmxlIHRoIHsKKyAgIGJhY2tncm91bmQtY29sb3I6IGNjY2NjYzsKKyAgIGNvbG9yOiAgICAgICAgICAgIDAwMDAwMDsKK30KKworcHJlIHsKKyAgIGJhY2tncm91bmQtY29sb3I6IGVmZWZlZjsKK30KKworLyogY29kZSBzbmlwcGV0cyBpbiBleGFtcGxlcyBhbmQgdHV0b3JpYWxzICovCisuY29kZSB7IAorICAgYmFja2dyb3VuZDogI0VGRUZFRjsgCisgICBtYXJnaW4tdG9wOiAKK30KKworLyogaGlnaGxpZ2h0IGNvbnNvbGUgb3V0cHV0ICovCisub3V0cHV0IHsgCisgICBjb2xvcjogI0ZGRkZGRjsgCisgICBiYWNrZ3JvdW5kOiAjODM3QTY3OyAKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvc3lzY2xhc3NwYXRoLmh0bWwgYi90cnVuay9kb2NzL21hbnVhbC9zeXNjbGFzc3BhdGguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQwMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvc3lzY2xhc3NwYXRoLmh0bWwKQEAgLTAsMCArMSw4MCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5idWlsZC5zeXNjbGFzc3BhdGg8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyPjxhIG5hbWU9InN5c2NsYXNzcGF0aCI+YnVpbGQuc3lzY2xhc3NwYXRoPC9hPjwvaDI+Cis8cD5UaGUgdmFsdWUgb2YgdGhlIGJ1aWxkLnN5c2NsYXNzcGF0aCBwcm9wZXJ0eQorY29udHJvbCBob3cgdGhlIHN5c3RlbSBjbGFzc3BhdGgsIGllLiB0aGUgY2xhc3NwYXRoIGluIGVmZmVjdCB3aGVuCitBbnQgaXMgcnVuLCBhZmZlY3RzIHRoZSBiZWhhdmlvdXIgb2YgY2xhc3NwYXRocyBpbiBBbnQuCitUaGUgZGVmYXVsdCBiZWhhdmlvciB2YXJpZXMgZnJvbSBBbnQgdG8gQW50IHRhc2suPC9wPgorCitUaGUgdmFsdWVzIGFuZCB0aGVpciBtZWFuaW5ncyBhcmU6CisKKzx0YWJsZSBjZWxsc3BhY2luZz0iMjAiPgorPHRyPgorPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+b25seTwvdGg+Cis8dGQ+T25seSB0aGUgc3lzdGVtIGNsYXNzcGF0aCBpcyB1c2VkIGFuZCBjbGFzc3BhdGhzIHNwZWNpZmllZCBpbiBidWlsZCBmaWxlcywKK2V0YyBhcmUgaWdub3JlZC4gVGhpcyBzaXR1YXRpb24gY291bGQgYmUgY29uc2lkZXJlZCBhcyB0aGUgcGVyc29uIHJ1bm5pbmcKK3RoZSBidWlsZCBmaWxlIGtub3dzIG1vcmUgYWJvdXQgdGhlIGVudmlyb25tZW50IHRoYW4gdGhlIHBlcnNvbiB3cml0aW5nIHRoZQorYnVpbGQgZmlsZQorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPmlnbm9yZTwvdGg+Cis8dGQ+CitUaGUgc3lzdGVtIGNsYXNzcGF0aCBpcyBpZ25vcmVkLiBUaGlzIHNpdHVhdGlvbiBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUKK2Fib3ZlLiBUaGUgcGVyc29uIHJ1bm5pbmcgdGhlIGJ1aWxkIHRydXN0cyB0aGUgYnVpbGQgZmlsZSB3cml0ZXIgdG8gZ2V0IHRoZQorYnVpbGQgZmlsZSByaWdodAorPC90ZD4KKzwvdHI+CisKKzx0cj4KKzx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPmxhc3Q8L3RoPgorPHRkPgorVGhlIGNsYXNzcGF0aCBpcyBjb25jYXRlbmF0ZWQgdG8gYW55IHNwZWNpZmllZCBjbGFzc3BhdGhzIGF0IHRoZSBlbmQuIFRoaXMKK2lzIGEgY29tcHJvbWlzZSwgd2hlcmUgdGhlIGJ1aWxkIGZpbGUgd3JpdGVyIGhhcyBwcmlvcml0eS4KKzwvdGQ+Cis8L3RyPgorCis8dHI+Cis8dGggYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5maXJzdDwvdGg+Cis8dGQ+CitBbnkgc3BlY2lmaWVkIGNsYXNzcGF0aHMgYXJlIGNvbmNhdGVuYXRlZCB0byB0aGUgc3lzdGVtIGNsYXNzcGF0aC4gVGhpcyBpcwordGhlIG90aGVyIGZvcm0gb2YgY29tcHJvbWlzZSB3aGVyZSB0aGUgYnVpbGQgcnVubmVyIGhhcyBwcmlvcml0eS4KKzwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKworPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPiB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBhbHNvIGFmZmVjdHMgdGhlCitib290Y2xhc3NwYXRoIHNldHRpbmdzLS1pdCBjb21iaW5lcyB0aGUgYm9vdGNsYXNzcGF0aCB0aGF0IGhhcyBiZWVuCitzcGVjaWZpZWQgZm9yIGEgdGFzayB3aXRoIHRoZSBib290Y2xhc3NwYXRoIG9mIHRoZSBKYXZhIFZNIHJ1bm5pbmcKK0FudC4gIElmIHRoZSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0LCBpdCBkZWZhdWx0cyB0byAiaWdub3JlIiBpbgordGhpcyBjYXNlLjwvcD4KKworCis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3Rhc2tzb3ZlcnZpZXcuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL3Rhc2tzb3ZlcnZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTMyZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvdGFza3NvdmVydmlldy5odG1sCkBAIC0wLDAgKzEsMTIzMSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPk92ZXJ2aWV3IG9mIEFudCBUYXNrczwvdGl0bGU+CisgIDxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIj4KKzwvaGVhZD4KKworPGJvZHk+Cis8YSBuYW1lPSJ0b3AiPjwvYT4KKzxoMj5PdmVydmlldyBvZiBBbnQgVGFza3M8L2gyPgorPHA+R2l2ZW4gdGhlIGxhcmdlIG51bWJlciBvZiB0YXNrcyBhdmFpbGFibGUgd2l0aCBBbnQsIGl0IG1heSBiZQorZGlmZmljdWx0IHRvIGdldCBhbiBvdmVyYWxsIHZpZXcgb2Ygd2hhdCBlYWNoIHRhc2sgY2FuIGRvLiAgVGhlIGZvbGxvd2luZwordGFibGVzIHByb3ZpZGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiBlYWNoIHRhc2sgYW5kIGEgbGluayB0byB0aGUgY29tcGxldGUKK2RvY3VtZW50YXRpb24uPC9wPgorCis8YSBocmVmPSIjYXJjaGl2ZSI+QXJjaGl2ZSBUYXNrczwvYT48YnI+Cis8YSBocmVmPSIjYXVkaXQiPkF1ZGl0L0NvdmVyYWdlIFRhc2tzPC9hPjxicj4KKzxhIGhyZWY9IiNjb21waWxlIj5Db21waWxlIFRhc2tzPC9hPjxicj4KKzxhIGhyZWY9IiNkZXBsb3kiPkRlcGxveW1lbnQgVGFza3M8L2E+PGJyPgorPGEgaHJlZj0iI2RvYyI+RG9jdW1lbnRhdGlvbiBUYXNrczwvYT48YnI+Cis8YSBocmVmPSIjZWpiIj5FSkIgVGFza3M8L2E+PGJyPgorPGEgaHJlZj0iI2V4ZWMiPkV4ZWN1dGlvbiBUYXNrczwvYT48YnI+Cis8YSBocmVmPSIjZmlsZSI+RmlsZSBUYXNrczwvYT48YnI+Cis8YSBocmVmPSIjZXh0ZW5zaW9ucyI+SmF2YTIgRXh0ZW5zaW9ucyBUYXNrczwvYT48YnI+Cis8YSBocmVmPSIjbG9nIj5Mb2dnaW5nIFRhc2tzPC9hPjxicj4KKzxhIGhyZWY9IiNtYWlsIj5NYWlsIFRhc2tzPC9hPjxicj4KKzxhIGhyZWY9IiNtaXNjIj5NaXNjZWxsYW5lb3VzIFRhc2tzPC9hPjxicj4KKzxhIGhyZWY9IiNuZXQiPi5ORVQgVGFza3M8L2E+PGJyPgorPGEgaHJlZj0iI3ByZXByb2MiPlByZS1wcm9jZXNzIFRhc2tzPC9hPjxicj4KKzxhIGhyZWY9IiNwcm9wIj5Qcm9wZXJ0eSBUYXNrczwvYT48YnI+Cis8YSBocmVmPSIjcmVtb3RlIj5SZW1vdGUgVGFza3M8L2E+PGJyPgorPGEgaHJlZj0iI3NjbSI+U0NNIFRhc2tzPC9hPjxicj4KKzxhIGhyZWY9IiN0ZXN0aW5nIj5UZXN0aW5nIFRhc2tzPC9hPjxicj4KKzxhIGhyZWY9IiN2YWoiPlZpc3VhbCBBZ2UgZm9yIEphdmEgVGFza3M8L2E+PGJyPgorCisKKzxwPjwvcD4KKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgorPHRoIGFsaWduPSJsZWZ0Ij4KKzxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorPGEgbmFtZT0iYXJjaGl2ZSI+QXJjaGl2ZSBUYXNrczwvYT4KKzwvZm9udD4KKzwvdGg+Cis8Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KKzwvZm9udD4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoIG5vd3JhcD5EZXNjcmlwdGlvbjwvdGg+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy91bnBhY2suaHRtbCI+QlVuemlwMjwvYT48L3RkPgorICAgIDx0ZD48cD5FeHBhbmRzIGEgZmlsZSBwYWNrZWQgdXNpbmcgR1ppcCBvciBCWmlwMi48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3BhY2suaHRtbCI+QlppcDI8L2E+PC90ZD4KKyAgICA8dGQ+PHA+UGFja3MgYSBmaWxlIHVzaW5nIHRoZSBHWmlwIG9yIEJaaXAyIGFsZ29yaXRobS4gVGhpcyB0YXNrCisgICAgIGRvZXMgbm90IGRvIGFueSBkZXBlbmRlbmN5IGNoZWNraW5nOyB0aGUgb3V0cHV0IGZpbGUgaXMgYWx3YXlzCisgICAgIGdlbmVyYXRlZDwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL2NhYi5odG1sIj5DYWI8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q3JlYXRlcyBNaWNyb3NvZnQgQ0FCIGFyY2hpdmUgZmlsZXMuIEl0IGlzIGludm9rZWQKKyAgICAgc2ltaWxhciB0byB0aGUgPGEgaHJlZj0iQ29yZVRhc2tzL2phci5odG1sIj5KYXI8L2E+IG9yCisgICAgIDxhIGhyZWY9IkNvcmVUYXNrcy96aXAuaHRtbCI+WmlwPC9hPiB0YXNrcy4gVGhpcyB0YXNrIHdpbGwgd29yayBvbgorICAgICBXaW5kb3dzIHVzaW5nIHRoZSBleHRlcm5hbCA8aT5jYWJhcmM8L2k+IHRvb2wgKHByb3ZpZGVkIGJ5IE1pY3Jvc29mdCksCisgICAgIHdoaWNoIG11c3QgYmUgbG9jYXRlZCBpbiB5b3VyIGV4ZWN1dGFibGUgcGF0aC48L3A+PC90ZD4KKyAgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9lYXIuaHRtbCI+RWFyPC9hPjwvdGQ+CisgICAgPHRkPjxwPkFuIGV4dGVuc2lvbiBvZiB0aGUgPGEgaHJlZj0iQ29yZVRhc2tzL2phci5odG1sIj5KYXI8L2E+IHRhc2sgd2l0aAorICAgICBzcGVjaWFsIHRyZWF0bWVudCBmb3IgZmlsZXMgdGhhdCBzaG91bGQgZW5kIHVwIGluIGFuCisgICAgIEVudGVycHJpc2UgQXBwbGljYXRpb24gYXJjaGl2ZS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2d1bnppcC5odG1sIj5HVW56aXA8L2E+PC90ZD4KKyAgICA8dGQ+PHA+RXhwYW5kcyBhIEdaaXAgZmlsZS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2d6aXAuaHRtbCI+R1ppcDwvYT48L3RkPgorICAgIDx0ZD48cD5HWmlwcyBhIHNldCBvZiBmaWxlcy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2phci5odG1sIj5KYXI8L2E+PC90ZD4KKyAgICA8dGQ+PHA+SmFycyBhIHNldCBvZiBmaWxlcy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qbGluay5odG1sIj5KbGluazwvYT48L3RkPgorICAgIDx0ZD48cD48aT5EZXByZWNhdGVkLjwvaT4gVXNlIHRoZSA8Y29kZT56aXBmaWxlc2V0PC9jb2RlPgorICAgICBhbmQgPGNvZGU+emlwZ3JvdXBmaWxlc2V0PC9jb2RlPiBhdHRyaWJ1dGVzIG9mIHRoZQorICAgICA8YSBocmVmPSJDb3JlVGFza3MvamFyLmh0bWwiPkphcjwvYT4gb3IKKyAgICAgPGEgaHJlZj0iQ29yZVRhc2tzL3ppcC5odG1sIj5aaXA8L2E+IHRhc2tzIGluc3RlYWQuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9tYW5pZmVzdC5odG1sIj5NYW5pZmVzdDwvYT48L3RkPgorICAgIDx0ZD48cD5DcmVhdGVzIGEgbWFuaWZlc3QgZmlsZS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9ycG0uaHRtbCI+UnBtPC9hPjwvdGQ+CisgICAgPHRkPjxwPkludm9rZXMgdGhlIDxpPnJwbTwvaT4gZXhlY3V0YWJsZSB0byBidWlsZCBhIExpbnV4IGluc3RhbGxhdGlvbgorICAgICBmaWxlLiBUaGlzIHRhc2sgY3VycmVudGx5IG9ubHkgd29ya3Mgb24gTGludXggb3Igb3RoZXIgVW5peCBwbGF0Zm9ybXMKKyAgICAgd2l0aCBSUE0gc3VwcG9ydC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3NpZ25qYXIuaHRtbCI+U2lnbkphcjwvYT48L3RkPgorICAgIDx0ZD48cD5TaWducyBhIGphciBvciB6aXAgZmlsZSB3aXRoIHRoZSA8aT5qYXZhc2lnbjwvaT4KKyAgICAgY29tbWFuZC1saW5lIHRvb2wuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy90YXIuaHRtbCI+VGFyPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNyZWF0ZXMgYSB0YXIgYXJjaGl2ZS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3VuemlwLmh0bWwiPlVuamFyPC9hPjwvdGQ+CisgICAgPHRkPjxwPlVuemlwcyBhIGphcmZpbGUuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy91bnRhci5odG1sIj5VbnRhcjwvYT48L3RkPgorICAgIDx0ZD48cD5VbnRhcnMgYSB0YXJmaWxlLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvdW56aXAuaHRtbCI+VW53YXI8L2E+PC90ZD4KKyAgICA8dGQ+PHA+VW56aXBzIGEgd2FyZmlsZS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3VuemlwLmh0bWwiPlVuemlwPC9hPjwvdGQ+CisgICAgPHRkPjxwPlVuemlwcyBhIHppcGZpbGUuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy93YXIuaHRtbCI+V2FyPC9hPjwvdGQ+CisgICAgPHRkPjxwPkFuIGV4dGVuc2lvbiBvZiB0aGUgPGEgaHJlZj0iQ29yZVRhc2tzL2phci5odG1sIj5KYXI8L2E+IHRhc2sKKyAgICAgd2l0aCBzcGVjaWFsIHRyZWF0bWVudCBmb3IgZmlsZXMgdGhhdCBzaG91bGQgZW5kIHVwIGluIHRoZQorICAgICA8Y29kZT5XRUItSU5GL2xpYjwvY29kZT4sIDxjb2RlPldFQi1JTkYvY2xhc3NlczwvY29kZT4sIG9yCisgICAgIDxjb2RlPldFQi1JTkY8L2NvZGU+IGRpcmVjdG9yaWVzIG9mIHRoZSBXZWIgQXBwbGljYXRpb24gQXJjaGl2ZS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3ppcC5odG1sIj5aaXA8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q3JlYXRlcyBhIHppcGZpbGUuPC9wPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD48L3A+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKzx0aCBhbGlnbj0ibGVmdCI+Cis8Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzxhIG5hbWU9ImF1ZGl0Ij5BdWRpdC9Db3ZlcmFnZSBUYXNrczwvYT4KKzwvZm9udD48L3RoPgorPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Cis8L2ZvbnQ+Cis8L3RhYmxlPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgorICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvamRlcGVuZC5odG1sIj5KRGVwZW5kPC9hPjwvdGQ+CisgICAgPHRkPjxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPgorICAgICBKRGVwZW5kPC9hPiBwYXJzZXIuIFRoaXMgcGFyc2VyICZxdW90O3RyYXZlcnNlcyBhIHNldCBvZiBKYXZhIHNvdXJjZS1maWxlCisgICAgIGRpcmVjdG9yaWVzIGFuZCBnZW5lcmF0ZXMgZGVzaWduLXF1YWxpdHkgbWV0cmljcyBmb3IgZWFjaCBKYXZhCisgICAgIHBhY2thZ2UmcXVvdDsuPC9wPjwvdGQ+CisgICA8L3RyPgorCis8L3RhYmxlPgorCis8cD48L3A+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKzx0aCBhbGlnbj0ibGVmdCI+Cis8Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzxhIG5hbWU9ImNvbXBpbGUiPkNvbXBpbGUgVGFza3M8L2E+Cis8L2ZvbnQ+PC90aD4KKzxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgorPC9mb250PgorPC90YWJsZT4KKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KKyAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL2RlcGVuZC5odG1sIj5EZXBlbmQ8L2E+PC90ZD4KKyAgICA8dGQ+PHA+RGV0ZXJtaW5lcyB3aGljaCBjbGFzc2ZpbGVzIGFyZSBvdXQtb2YtZGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlaXIKKyAgICAgc291cmNlLCByZW1vdmluZyB0aGUgY2xhc3NmaWxlcyBvZiBhbnkgb3RoZXIgY2xhc3NlcyB0aGF0IGRlcGVuZCBvbiB0aGUKKyAgICAgb3V0LW9mLWRhdGUgY2xhc3NlcywgZm9yY2luZyB0aGUgcmUtY29tcGlsZSBvZiB0aGUgcmVtb3ZlZCBjbGFzc2ZpbGVzLgorICAgICBUeXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorICAgICA8YSBocmVmPSJDb3JlVGFza3MvamF2YWMuaHRtbCI+SmF2YWM8L2E+IHRhc2suPC9wPjwvdGQ+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9qYXZhYy5odG1sIj5KYXZhYzwvYT48L3RkPgorICAgIDx0ZD48cD5Db21waWxlcyB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlKHMpIHdpdGhpbiB0aGUgcnVubmluZworICAgICAoQW50KSBWTSwgb3IgaW4gYW5vdGhlciBWTSBpZiB0aGUgPGNvZGU+Zm9yazwvY29kZT4gYXR0cmlidXRlIGlzCisgICAgIHNwZWNpZmllZC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2FwdC5odG1sIj5BcHQ8L2E+PC90ZD4KKyAgICA8dGQ+PHA+UnVucyB0aGUgYW5ub3RhdGlvbiBwcm9jZXNzb3IgdG9vbCAoYXB0KSwgYW5kIHRoZW4gb3B0aW9uYWxseSBjb21waWxlcworICAgdGhlIG9yaWdpbmFsIGNvZGUsIGFuZCBhbnkgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL2pzcGMuaHRtbCI+SnNwQzwvYT48L3RkPgorICAgIDx0ZD48cD5SdW5zIHRoZSBKU1AgY29tcGlsZXIuIEl0IGNhbiBiZSB1c2VkIHRvIHByZWNvbXBpbGUgSlNQIHBhZ2VzCisgICAgIGZvciBmYXN0IGluaXRpYWwgaW52b2NhdGlvbiBvZiBKU1AgcGFnZXMsIGRlcGxveW1lbnQgb24gYSBzZXJ2ZXIgd2l0aG91dAorICAgICB0aGUgZnVsbCBKREsgaW5zdGFsbGVkLCBvciBzaW1wbHkgdG8gc3ludGF4LWNoZWNrIHRoZSBwYWdlcyB3aXRob3V0CisgICAgIGRlcGxveWluZyB0aGVtLiBUaGUgPGEgaHJlZj0iQ29yZVRhc2tzL2phdmFjLmh0bWwiPkphdmFjPC9hPiB0YXNrCisgICAgIGNhbiBiZSB1c2VkIHRvIGNvbXBpbGUgdGhlIGdlbmVyYXRlZCBKYXZhIHNvdXJjZS4KKyAgICAgKEZvciBXZWJsb2dpYyBKU1AgY29tcGlsZXMsCisgICAgIHNlZSB0aGUgPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy93bGpzcGMuaHRtbCI+V2xqc3BjPC9hPiB0YXNrLik8L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9uZXRyZXh4Yy5odG1sIj5OZXRSZXh4QzwvYT48L3RkPgorICAgIDx0ZD48cD5Db21waWxlcyBhCisgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9uZXRyZXh4IiB0YXJnZXQ9Il90b3AiPk5ldFJleHg8L2E+CisgICAgIHNvdXJjZSB0cmVlIHdpdGhpbiB0aGUgcnVubmluZyAoQW50KSBWTS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3JtaWMuaHRtbCI+Um1pYzwvYT48L3RkPgorICAgIDx0ZD48cD5SdW5zIHRoZSA8aT5ybWljPC9pPiBjb21waWxlciBvbiB0aGUgc3BlY2lmaWVkIGZpbGUocykuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvd2xqc3BjLmh0bWwiPldsanNwYzwvYT48L3RkPgorICAgIDx0ZD48cD5Db21waWxlcyBKU1AgcGFnZXMgdXNpbmcgV2VibG9naWMncyBKU1AgY29tcGlsZXIsCisgICAgIDxpPndlYmxvZ2ljLmpzcGM8L2k+LiAoRm9yIG5vbi1XZWJsb2dpYyBKU1AgY29tcGlsZXMsIHNlZSB0aGUKKyAgICAgPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qc3BjLmh0bWwiPkpzcEM8L2E+IHRhc2suPC9wPjwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+CisKKzxwPjwvcD4KKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgorPHRoIGFsaWduPSJsZWZ0Ij4KKzxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorPGEgbmFtZT0iZGVwbG95Ij5EZXBsb3ltZW50IFRhc2tzPC9hPgorPC9mb250PjwvdGg+Cis8Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KKzwvZm9udD4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9zZXJ2ZXJkZXBsb3kuaHRtbCI+U2VydmVyRGVwbG95PC9hPjwvdGQ+CisgICAgPHRkPjxwPlRhc2sgdG8gcnVuIGEgJnF1b3Q7aG90JnF1b3Q7IGRlcGxveW1lbnQgdG9vbCBmb3IgdmVuZG9yLXNwZWNpZmljCisgICAgIEoyRUUgc2VydmVyLgorICAgIDwvcD48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PC9wPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Cis8dGggYWxpZ249ImxlZnQiPgorPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8YSBuYW1lPSJkb2MiPkRvY3VtZW50YXRpb24gVGFza3M8L2E+Cis8L2ZvbnQ+PC90aD4KKzxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgorPC9mb250PgorPC90YWJsZT4KKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KKyAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvamF2YWRvYy5odG1sIj5KYXZhZG9jLzxpPkphdmFkb2MyPC9pPjwvYT48L3RkPgorICAgIDx0ZD48cD5HZW5lcmF0ZXMgY29kZSBkb2N1bWVudGF0aW9uIHVzaW5nIHRoZSA8aT5qYXZhZG9jPC9pPiB0b29sLgorICAgICBUaGUgSmF2YWRvYzIgdGFzayBpcyBkZXByZWNhdGVkOyB1c2UgdGhlIEphdmFkb2MgdGFzayBpbnN0ZWFkLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL3N0eWxlYm9vay5odG1sIj5TdHlsZWJvb2s8L2E+PC90ZD4KKyAgICA8dGQ+PHA+RXhlY3V0ZXMgdGhlIEFwYWNoZSBTdHlsZWJvb2sgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IuCisgICAgIFVubGlrZSB0aGUgY29tbWFuZC1saW5lIHZlcnNpb24gb2YgdGhpcyB0b29sLCBhbGwgdGhyZWUgYXJndW1lbnRzCisgICAgIGFyZSByZXF1aXJlZCB0byBydW4gdGhlIFN0eWxlYm9vayB0YXNrLjwvcD48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PC9wPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Cis8dGggYWxpZ249ImxlZnQiPgorPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8YSBuYW1lPSJlamIiPkVKQiBUYXNrczwvYT4KKzwvZm9udD48L3RoPgorPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Cis8L2ZvbnQ+Cis8L3RhYmxlPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgorICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvZWpiLmh0bWwiPkVKQiBUYXNrczwvYT48L3RkPgorICAgIDx0ZD48cD4oU2VlIHRoZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJpbmcgdGhlIEVKQiB0YXNrcy4pPC9wPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD48L3A+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKzx0aCBhbGlnbj0ibGVmdCI+Cis8Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzxhIG5hbWU9ImV4ZWMiPkV4ZWN1dGlvbiBUYXNrczwvYT4KKzwvZm9udD48L3RoPgorPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Cis8L2ZvbnQ+Cis8L3RhYmxlPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgorICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9hbnQuaHRtbCI+QW50PC9hPjwvdGQ+CisgICAgPHRkPjxwPlJ1bnMgQW50IG9uIGEgc3VwcGxpZWQgYnVpbGRmaWxlLCBvcHRpb25hbGx5CisgICAgIHBhc3NpbmcgcHJvcGVydGllcyAod2l0aCBwb3NzaWJseSBuZXcgdmFsdWVzKS4KKyAgICAgVGhpcyB0YXNrIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHN1Yi1wcm9qZWN0cy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2FudGNhbGwuaHRtbCI+QW50Q2FsbDwvYT48L3RkPgorICAgIDx0ZD48cD5SdW5zIGFub3RoZXIgdGFyZ2V0IHdpdGhpbiB0aGUgc2FtZSBidWlsZGZpbGUsIG9wdGlvbmFsbHkKKyAgICAgcGFzc2luZyBwcm9wZXJ0aWVzICh3aXRoIHBvc3NpYmx5IG5ldyB2YWx1ZXMpLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvYXBwbHkuaHRtbCI+QXBwbHkvPGk+RXhlY09uPC9pPjwvYT48L3RkPgorICAgIDx0ZD48cD5FeGVjdXRlcyBhIHN5c3RlbSBjb21tYW5kLiBXaGVuIHRoZSA8Y29kZT5vczwvY29kZT4gYXR0cmlidXRlIGlzCisgICAgIHNwZWNpZmllZCwgdGhlIGNvbW1hbmQgaXMgb25seSBleGVjdXRlZCB3aGVuIEFudCBpcyBydW4gb24gb25lCisgICAgIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW5nIHN5c3RlbXMuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9kZXBlbmRzZXQuaHRtbCI+RGVwZW5kc2V0PC9hPjwvdGQ+CisgICAgPHRkPjxwPlRoaXMgdGFzayBjb21wYXJlcyBhIHNldCBvZiBzb3VyY2UgZmlsZXMgd2l0aCBhIHNldCBvZiB0YXJnZXQKKyAgICAgZmlsZXMuICBJZiBhbnkgb2YgdGhlIHNvdXJjZSBmaWxlcyBpcyBuZXdlciB0aGFuIGFueSBvZgorICAgICB0aGUgdGFyZ2V0IGZpbGVzLCBhbGwgdGhlIHRhcmdldCBmaWxlcyBhcmUgcmVtb3ZlZC4gPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9leGVjLmh0bWwiPkV4ZWM8L2E+PC90ZD4KKyAgICA8dGQ+PHA+RXhlY3V0ZXMgYSBzeXN0ZW0gY29tbWFuZC4gV2hlbiB0aGUgPGNvZGU+b3M8L2NvZGU+IGF0dHJpYnV0ZQorICAgICBpcyBzcGVjaWZpZWQsIHRoZSBjb21tYW5kIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBBbnQgaXMgcnVuIG9uIG9uZSBvZgorICAgICB0aGUgc3BlY2lmaWVkIG9wZXJhdGluZyBzeXN0ZW1zLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvamF2YS5odG1sIj5KYXZhPC9hPjwvdGQ+CisgICAgPHRkPjxwPkV4ZWN1dGVzIGEgSmF2YSBjbGFzcyB3aXRoaW4gdGhlIHJ1bm5pbmcgKEFudCkgVk0sIG9yIGluCisgICAgIGFub3RoZXIgVk0gaWYgdGhlIDxjb2RlPmZvcms8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9wYXJhbGxlbC5odG1sIj5QYXJhbGxlbDwvYT48L3RkPgorICAgIDx0ZD48cD5BIGNvbnRhaW5lciB0YXNrIHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgQW50IHRhc2tzLgorICAgICBFYWNoIG5lc3RlZCB0YXNrIHNwZWNpZmllZCB3aXRoaW4gdGhlIDxjb2RlPiZsdDtwYXJhbGxlbCZndDs8L2NvZGU+CisgICAgIHRhZyB3aWxsIGJlIGV4ZWN1dGVkIGluIGl0cyBvd24gdGhyZWFkLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3Mvc2VxdWVudGlhbC5odG1sIj5TZXF1ZW50aWFsPC9hPjwvdGQ+CisgICAgPHRkPjxwPkEgY29udGFpbmVyIHRhc2sgdGhhdCBjYW4gY29udGFpbiBvdGhlciBBbnQgdGFza3MuCisgICAgIFRoZSBuZXN0ZWQgdGFza3MgYXJlIHNpbXBseSBleGVjdXRlZCBpbiBzZXF1ZW5jZS4gSXRzIHByaW1hcnkgdXNlIGlzCisgICAgIHRvIHN1cHBvcnQgdGhlIHNlcXVlbnRpYWwgZXhlY3V0aW9uIG9mIGEgc3Vic2V0IG9mIHRhc2tzIHdpdGhpbgorICAgICB0aGUgPGNvZGU+Jmx0O3BhcmFsbGVsJmd0OzwvY29kZT4gdGFnLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3Mvc2xlZXAuaHRtbCI+U2xlZXA8L2E+PC90ZD4KKyAgICA8dGQ+PHA+IEEgdGFzayBmb3Igc3VzcGVuZGluZyBleGVjdXRpb24gZm9yIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lLgorICAgICBVc2VmdWwgd2hlbiBhIGJ1aWxkIG9yIGRlcGxveW1lbnQgcHJvY2VzcyByZXF1aXJlcyBhbiBpbnRlcnZhbCBiZXR3ZWVuCisgICAgIHRhc2tzLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3Mvc3ViYW50Lmh0bWwiPlN1YmFudDwvYT48L3RkPgorICAgIDx0ZD48cD4gQ2FsbHMgYSBnaXZlbiB0YXJnZXQgZm9yIGFsbCBkZWZpbmVkIHN1Yi1idWlsZHMuIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIG9mIGFudCBmb3IgYnVsayBwcm9qZWN0IGV4ZWN1dGlvbi48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3dhaXRmb3IuaHRtbCI+V2FpdGZvcjwvYT48L3RkPgorICAgIDx0ZD48cD5CbG9ja3MgZXhlY3V0aW9uIHVudGlsIGEgc2V0IG9mIHNwZWNpZmllZCBjb25kaXRpb25zIGJlY29tZSB0cnVlLgorICAgICBUaGlzIHRhc2sgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHRoZQorICAgICA8YSBocmVmPSJDb3JlVGFza3MvcGFyYWxsZWwuaHRtbCI+UGFyYWxsZWw8L2E+IHRhc2sgdG8gc3luY2hyb25pemUKKyAgICAgYSBzZXQgb2YgcHJvY2Vzc2VzLjwvcD48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PC9wPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Cis8dGggYWxpZ249ImxlZnQiPgorPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8YSBuYW1lPSJmaWxlIj5GaWxlIFRhc2tzPC9hPgorPC9mb250PjwvdGg+Cis8Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KKzwvZm9udD4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9hdHRyaWIuaHRtbCI+QXR0cmliPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNoYW5nZXMgdGhlIHBlcm1pc3Npb25zIGFuZC9vciBhdHRyaWJ1dGVzIG9mIGEgZmlsZSBvciBhbGwKKyAgICBmaWxlcyBpbnNpZGUgdGhlIHNwZWNpZmllZCBkaXJlY3Rvcmllcy4gQ3VycmVudGx5LCBpdCBoYXMgZWZmZWN0CisgICAgb25seSB1bmRlciBXaW5kb3dzLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvY2hlY2tzdW0uaHRtbCI+Q2hlY2tzdW08L2E+PC90ZD4KKyAgICA8dGQ+PHA+R2VuZXJhdGVzIGEgY2hlY2tzdW0gZm9yIGEgZmlsZSBvciBzZXQgb2YgZmlsZXMuIFRoaXMgdGFzayBjYW4KKyAgICAgYWxzbyBiZSB1c2VkIHRvIHBlcmZvcm0gY2hlY2tzdW0gdmVyaWZpY2F0aW9ucy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9jaGdycC5odG1sIj5DaGdycDwvYT48L3RkPgorICAgIDx0ZD48cD5DaGFuZ2VzIHRoZSBncm91cCBvd25lcnNoaXAgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUKKyAgICB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLiBDdXJyZW50bHksIGl0IGhhcyBlZmZlY3Qgb25seSB1bmRlcgorICAgIFVuaXguPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9jaG1vZC5odG1sIj5DaG1vZDwvYT48L3RkPgorICAgIDx0ZD48cD5DaGFuZ2VzIHRoZSBwZXJtaXNzaW9ucyBvZiBhIGZpbGUgb3IgYWxsIGZpbGVzIGluc2lkZSB0aGUKKyAgICAgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLiBDdXJyZW50bHksIGl0IGhhcyBlZmZlY3Qgb25seSB1bmRlciBVbml4LgorICAgICBUaGUgcGVybWlzc2lvbnMgYXJlIGFsc28gVU5JWCBzdHlsZSwgbGlrZSB0aGUgYXJndW1lbnRzIGZvciB0aGUKKyAgICA8aT5jaG1vZDwvaT4gY29tbWFuZC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9jaG93bi5odG1sIj5DaG93bjwvYT48L3RkPgorICAgIDx0ZD48cD5DaGFuZ2VzIHRoZSBvd25lciBvZiBhIGZpbGUgb3IgYWxsIGZpbGVzIGluc2lkZSB0aGUKKyAgICBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuIEN1cnJlbnRseSwgaXQgaGFzIGVmZmVjdCBvbmx5IHVuZGVyCisgICAgVW5peC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2NvbmNhdC5odG1sIj5Db25jYXQ8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q29uY2F0ZW5hdGVzIG11bHRpcGxlIGZpbGVzIGludG8gYSBzaW5nbGUgb25lIG9yIHRvIEFudCdzCisgICAgIGxvZ2dpbmcgc3lzdGVtLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvY29weS5odG1sIj5Db3B5PC9hPjwvdGQ+CisgICAgPHRkPjxwPkNvcGllcyBhIGZpbGUgb3IgRmlsZXNldCB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2NvcHlkaXIuaHRtbCI+PGk+Q29weWRpcjwvaT48L2E+PC90ZD4KKyAgICA8dGQ+PHA+PGk+RGVwcmVjYXRlZC48L2k+ICBVc2UgdGhlCisgICAgIDxhIGhyZWY9IkNvcmVUYXNrcy9jb3B5Lmh0bWwiPkNvcHk8L2E+IHRhc2sgaW5zdGVhZC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2NvcHlmaWxlLmh0bWwiPjxpPkNvcHlmaWxlPC9pPjwvYT48L3RkPgorICAgIDx0ZD48cD48aT5EZXByZWNhdGVkLjwvaT4gIFVzZSB0aGUKKyAgICAgPGEgaHJlZj0iQ29yZVRhc2tzL2NvcHkuaHRtbCI+Q29weTwvYT4gdGFzayBpbnN0ZWFkLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvZGVsZXRlLmh0bWwiPkRlbGV0ZTwvYT48L3RkPgorICAgIDx0ZD48cD5EZWxldGVzIGVpdGhlciBhIHNpbmdsZSBmaWxlLCBhbGwgZmlsZXMgYW5kIHN1Yi1kaXJlY3RvcmllcworICAgICBpbiBhIHNwZWNpZmllZCBkaXJlY3RvcnksIG9yIGEgc2V0IG9mIGZpbGVzIHNwZWNpZmllZCBieSBvbmUgb3IgbW9yZQorICAgICA8YSBocmVmPSJDb3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9kZWx0cmVlLmh0bWwiPjxpPkRlbHRyZWU8L2k+PC9hPjwvdGQ+CisgICAgPHRkPjxwPjxpPkRlcHJlY2F0ZWQuPC9pPiAgVXNlIHRoZQorICAgICA8YSBocmVmPSJDb3JlVGFza3MvZGVsZXRlLmh0bWwiPkRlbGV0ZTwvYT4gdGFzayBpbnN0ZWFkLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvZmlsdGVyLmh0bWwiPkZpbHRlcjwvYT48L3RkPgorICAgIDx0ZD48cD5TZXRzIGEgdG9rZW4gZmlsdGVyIGZvciB0aGlzIHByb2plY3QsIG9yIHJlYWRzIG11bHRpcGxlIHRva2VuCisgICAgIGZpbHRlcnMgZnJvbSBhIHNwZWNpZmllZCBmaWxlIGFuZCBzZXRzIHRoZXNlIGFzIGZpbHRlcnMuIFRva2VuIGZpbHRlcnMKKyAgICAgYXJlIHVzZWQgYnkgYWxsIHRhc2tzIHRoYXQgcGVyZm9ybSBmaWxlLWNvcHlpbmcgb3BlcmF0aW9ucy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2ZpeGNybGYuaHRtbCI+Rml4Q1JMRjwvYT48L3RkPgorICAgIDx0ZD48cD5Nb2RpZmllcyBhIGZpbGUgdG8gYWRkIG9yIHJlbW92ZSB0YWJzLCBjYXJyaWFnZSByZXR1cm5zLCBsaW5lZmVlZHMsCisgICAgIGFuZCBFT0YgY2hhcmFjdGVycy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2dldC5odG1sIj5HZXQ8L2E+PC90ZD4KKyAgICA8dGQ+PHA+R2V0cyBhIGZpbGUgZnJvbSBhIFVSTC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL21rZGlyLmh0bWwiPk1rZGlyPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNyZWF0ZXMgYSBkaXJlY3RvcnkuIE5vbi1leGlzdGVudCBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQsCisgICAgIHdoZW4gbmVjZXNzYXJ5LjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvbW92ZS5odG1sIj5Nb3ZlPC9hPjwvdGQ+CisgICAgPHRkPjxwPk1vdmVzIGEgZmlsZSB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeSwgb3IgYSBzZXQocykgb2YgZmlsZShzKSB0bworICAgICBhIG5ldyBkaXJlY3RvcnkuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9wYXRjaC5odG1sIj5QYXRjaDwvYT48L3RkPgorICAgIDx0ZD48cD5BcHBsaWVzIGEgJnF1b3Q7ZGlmZiZxdW90OyBmaWxlIHRvIG9yaWdpbmFscy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3JlbmFtZS5odG1sIj48aT5SZW5hbWU8L2k+PC9hPjwvdGQ+CisgICAgPHRkPjxwPjxpPkRlcHJlY2F0ZWQuPC9pPiAgVXNlIHRoZSA8YSBocmVmPSJDb3JlVGFza3MvbW92ZS5odG1sIj5Nb3ZlPC9hPgorICAgIHRhc2sgaW5zdGVhZC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9yZW5hbWVleHRlbnNpb25zLmh0bWwiPgorICAgICA8aT5SZW5hbWVFeHRlbnNpb25zPC9pPjwvYT48L3RkPgorICAgIDx0ZD48cD48aT5EZXByZWNhdGVkPC9pPi4gVXNlIHRoZSA8YSBocmVmPSJDb3JlVGFza3MvbW92ZS5odG1sIj5Nb3ZlPC9hPgorICAgICB0YXNrIHdpdGggYSA8YSBocmVmPSJDb3JlVHlwZXMvbWFwcGVyLmh0bWwjZ2xvYi1tYXBwZXIiPmdsb2IgbWFwcGVyPC9hPgorICAgICBpbnN0ZWFkLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvcmVwbGFjZS5odG1sIj5SZXBsYWNlPC9hPjwvdGQ+CisgICAgPHRkPjxwPlJlcGxhY2UgaXMgYSBkaXJlY3RvcnktYmFzZWQgdGFzayBmb3IgcmVwbGFjaW5nIHRoZSBvY2N1cnJlbmNlCisgICAgIG9mIGEgZ2l2ZW4gc3RyaW5nIHdpdGggYW5vdGhlciBzdHJpbmcgaW4gc2VsZWN0ZWQgZmlsZS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9yZXBsYWNlcmVnZXhwLmh0bWwiPgorICAgICBSZXBsYWNlUmVnRXhwPC9hPjwvdGQ+CisgICAgPHRkPjxwPkRpcmVjdG9yeS1iYXNlZCB0YXNrIGZvciByZXBsYWNpbmcgdGhlIG9jY3VycmVuY2Ugb2YgYSBnaXZlbgorICAgICByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBhIHN1YnN0aXR1dGlvbiBwYXR0ZXJuIGluIGEgZmlsZSBvciBzZXQgb2YKKyAgICAgZmlsZXMuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9zeW5jLmh0bWwiPlN5bmM8L2E+PC90ZD4KKyAgICA8dGQ+PHA+U3luY2hyb25pemUgdHdvIGRpcmVjdG9yeSB0cmVlcy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3RlbXBmaWxlLmh0bWwiPlRlbXBmaWxlPC9hPjwvdGQ+CisgICAgPHRkPjxwPkdlbmVyYXRlcyBhIG5hbWUgZm9yIGEgbmV3IHRlbXBvcmFyeSBmaWxlIGFuZCBzZXRzIHRoZSBzcGVjaWZpZWQKKyAgICAgcHJvcGVydHkgdG8gdGhhdCBuYW1lLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvdG91Y2guaHRtbCI+VG91Y2g8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q2hhbmdlcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBmaWxlIGFuZCBwb3NzaWJseSBjcmVhdGVzIGl0IGF0CisgICAgIHRoZSBzYW1lIHRpbWUuPC9wPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD48L3A+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKzx0aCBhbGlnbj0ibGVmdCI+Cis8Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzxhIG5hbWU9ImV4dGVuc2lvbnMiPkphdmEyIEV4dGVuc2lvbnMgVGFza3M8L2E+Cis8L2ZvbnQ+PC90aD4KKzxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgorPC9mb250PgorPC90YWJsZT4KKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KKyAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD4KKyAgICA8YSBocmVmPSJPcHRpb25hbFRhc2tzL2phcmxpYi1hdmFpbGFibGUuaHRtbCI+SmFybGliLWF2YWlsYWJsZTwvYT48L3RkPgorICAgIDx0ZD48cD5DaGVjayB3aGV0aGVyIGFuIGV4dGVuc2lvbiBpcyBwcmVzZW50IGluIGEgRmlsZVNldCBvciBhbgorICAgICAgRXh0ZW5zaW9uU2V0LiBJZiB0aGUgZXh0ZW5zaW9uIGlzIHByZXNlbnQsIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMKKyAgICAgc2V0LjwvcD4KKyAgICA8L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD4KKyAgICA8YSBocmVmPSJPcHRpb25hbFRhc2tzL2phcmxpYi1kaXNwbGF5Lmh0bWwiPkphcmxpYi1kaXNwbGF5PC9hPjwvdGQ+CisgICAgPHRkPjxwPkRpc3BsYXkgdGhlICZxdW90O09wdGlvbmFsIFBhY2thZ2UmcXVvdDsgYW5kCisgICAgICAmcXVvdDtQYWNrYWdlIFNwZWNpZmljYXRpb24mcXVvdDsgaW5mb3JtYXRpb24gY29udGFpbmVkIHdpdGhpbiB0aGUKKyAgICAgIHNwZWNpZmllZCBqYXJzLjwvcD4KKyAgICA8L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD4KKyAgICA8YSBocmVmPSJPcHRpb25hbFRhc2tzL2phcmxpYi1tYW5pZmVzdC5odG1sIj5KYXJsaWItbWFuaWZlc3Q8L2E+PC90ZD4KKyAgICA8dGQ+PHA+VGFzayB0byBnZW5lcmF0ZSBhIG1hbmlmZXN0IHRoYXQgZGVjbGFyZXMgYWxsIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgIGluIG1hbmlmZXN0LiBUaGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IGxvb2tpbmcgaW4gdGhlCisgICAgICBzcGVjaWZpZWQgcGF0aCBhbmQgc2VhcmNoaW5nIGZvciBFeHRlbnNpb24vJnF1b3Q7T3B0aW9uYWwgUGFja2FnZSZxdW90OworICAgICAgc3BlY2lmaWNhdGlvbnMgaW4gdGhlIG1hbmlmZXN0cyBvZiB0aGUgamFycy48L3A+CisgICAgPC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+CisgICAgPGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qYXJsaWItcmVzb2x2ZS5odG1sIj5KYXJsaWItcmVzb2x2ZTwvYT48L3RkPgorICAgIDx0ZD48cD5UcnkgdG8gbG9jYXRlIGEgamFyIHRvIHNhdGlzZnkgYW4gZXh0ZW5zaW9uLCBhbmQgcGxhY2UgdGhlCisgICAgICBsb2NhdGlvbiBvZiB0aGUgamFyIGludG8gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS48L3A+CisgICAgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPjwvcD4KKzxwPjwvcD4KKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgorPHRoIGFsaWduPSJsZWZ0Ij4KKzxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorPGEgbmFtZT0ibG9nIj5Mb2dnaW5nIFRhc2tzPC9hPgorPC9mb250PjwvdGg+Cis8Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KKzwvZm9udD4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3JlY29yZGVyLmh0bWwiPlJlY29yZDwvYT48L3RkPgorICAgIDx0ZD48cD5SdW5zIGEgbGlzdGVuZXIgdGhhdCByZWNvcmRzIHRoZSBsb2dnaW5nIG91dHB1dCBvZiB0aGUKKyAgICAgYnVpbGQtcHJvY2VzcyBldmVudHMgdG8gYSBmaWxlLiBTZXZlcmFsIHJlY29yZGVycyBjYW4gZXhpc3QKKyAgICAgYXQgdGhlIHNhbWUgdGltZS4gRWFjaCByZWNvcmRlciBpcyBhc3NvY2lhdGVkIHdpdGggYSBmaWxlLjwvcD48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PC9wPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Cis8dGggYWxpZ249ImxlZnQiPgorPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8YSBuYW1lPSJtYWlsIj5NYWlsIFRhc2tzPC9hPgorPC9mb250PjwvdGg+Cis8Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KKzwvZm9udD4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL21haWwuaHRtbCI+TWFpbDwvYT48L3RkPgorICAgIDx0ZD48cD5BIHRhc2sgdG8gc2VuZCBTTVRQIGVtYWlsLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL21pbWVtYWlsLmh0bWwiPk1pbWVNYWlsPC9hPjwvdGQ+CisgICAgPHRkPjxwPjxpPkRlcHJlY2F0ZWQ8L2k+LiBVc2UgdGhlIDxhIGhyZWY9IkNvcmVUYXNrcy9tYWlsLmh0bWwiPk1haWw8L2E+CisgICAgIHRhc2sgaW5zdGVhZC48L3A+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPHA+PC9wPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Cis8dGggYWxpZ249ImxlZnQiPgorPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8YSBuYW1lPSJtaXNjIj5NaXNjZWxsYW5lb3VzIFRhc2tzPC9hPgorPC9mb250PjwvdGg+Cis8Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KKzwvZm9udD4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2RlZmF1bHRleGNsdWRlcy5odG1sIj5EZWZhdWx0ZXhjbHVkZXM8L2E+PC90ZD4KKyAgICA8dGQ+PHA+TW9kaWZ5IHRoZSBsaXN0IG9mIGRlZmF1bHQgZXhjbHVkZSBwYXR0ZXJucyBmcm9tIHdpdGhpbgorICAgIHlvdXIgYnVpbGQgZmlsZS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2VjaG8uaHRtbCI+RWNobzwvYT48L3RkPgorICAgIDx0ZD48cD5FY2hvZXMgdGV4dCB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPiBvciB0byBhIGZpbGUuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9mYWlsLmh0bWwiPkZhaWw8L2E+PC90ZD4KKyAgICA8dGQ+PHA+RXhpdHMgdGhlIGN1cnJlbnQgYnVpbGQgYnkgdGhyb3dpbmcgYSBCdWlsZEV4Y2VwdGlvbiwKKyAgICAgb3B0aW9uYWxseSBwcmludGluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvZ2Vua2V5Lmh0bWwiPkdlbktleTwvYT48L3RkPgorICAgIDx0ZD48cD5HZW5lcmF0ZXMgYSBrZXkgaW4ga2V5c3RvcmUuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9pbnB1dC5odG1sIj5JbnB1dDwvYT48L3RkPgorICAgIDx0ZD48cD5BbGxvd3MgdXNlciBpbnRlcmFjdGlvbiBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MgYnkgZGlzcGxheWluZyBhCisgICAgIG1lc3NhZ2UgYW5kIHJlYWRpbmcgYSBsaW5lIG9mIGlucHV0IGZyb20gdGhlIGNvbnNvbGUuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvc2NyaXB0Lmh0bWwiPlNjcmlwdDwvYT48L3RkPgorICAgIDx0ZD48cD5FeGVjdXRlcyBhIHNjcmlwdCBpbiBhCisgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnNmLyIKKyAgICAgIHRhcmdldD0iX3RvcCI+QXBhY2hlIEJTRjwvYT4tc3VwcG9ydGVkIGxhbmd1YWdlLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL3NvdW5kLmh0bWwiPlNvdW5kPC9hPjwvdGQ+CisgICAgPHRkPjxwPlBsYXlzIGEgc291bmQgZmlsZSBhdCB0aGUgZW5kIG9mIHRoZSBidWlsZCwgYWNjb3JkaW5nIHRvIHdoZXRoZXIKKyAgICAgdGhlIGJ1aWxkIGZhaWxlZCBvciBzdWNjZWVkZWQuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvc3BsYXNoLmh0bWwiPlNwbGFzaDwvYT48L3RkPgorICAgIDx0ZD48cD5EaXNwbGF5cyBhIHNwbGFzaCBzY3JlZW4uPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9zcWwuaHRtbCI+U3FsPC9hPjwvdGQ+CisgICAgPHRkPjxwPkV4ZWN1dGVzIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHZpYSBKREJDIHRvIGEgZGF0YWJhc2UuCisgICAgIFN0YXRlbWVudHMgY2FuIGVpdGhlciBiZSByZWFkIGluIGZyb20gYSB0ZXh0IGZpbGUgdXNpbmcgdGhlCisgICAgIDxjb2RlPnNyYzwvY29kZT4gYXR0cmlidXRlLCBvciBmcm9tIGJldHdlZW4gdGhlIGVuY2xvc2luZyBTUUwKKyAgICAgdGFncy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3Rhc2tkZWYuaHRtbCI+VGFza2RlZjwvYT48L3RkPgorICAgIDx0ZD48cD5BZGRzIGEgdGFzayBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QsIHN1Y2ggdGhhdCB0aGlzCisgICAgIG5ldyB0YXNrIGNhbiBiZSB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy90c3RhbXAuaHRtbCI+VFN0YW1wPC9hPjwvdGQ+CisgICAgPHRkPjxwPlNldHMgdGhlIDxjb2RlPkRTVEFNUDwvY29kZT4sIDxjb2RlPlRTVEFNUDwvY29kZT4sIGFuZAorICAgICA8Y29kZT5UT0RBWTwvY29kZT4gcHJvcGVydGllcyBpbiB0aGUgY3VycmVudCBwcm9qZWN0LCBiYXNlZCBvbgorICAgICB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvdHlwZWRlZi5odG1sIj5UeXBlZGVmPC9hPjwvdGQ+CisgICAgPHRkPjxwPkFkZHMgYSBkYXRhLXR5cGUgZGVmaW5pdGlvbiB0byB0aGUgY3VycmVudCBwcm9qZWN0LCBzdWNoIHRoYXQgdGhpcworICAgICBuZXcgdHlwZSBjYW4gYmUgdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL3htbHZhbGlkYXRlLmh0bWwiPlhtbFZhbGlkYXRlPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNoZWNrcyB0aGF0IFhNTCBmaWxlcyBhcmUgdmFsaWQgKG9yIG9ubHkgd2VsbC1mb3JtZWQpLiBUaGlzIHRhc2sKKyAgICAgdXNlcyB0aGUgWE1MIHBhcnNlciB0aGF0IGlzIGN1cnJlbnRseSB1c2VkIGJ5IEFudCBieSBkZWZhdWx0LCBidXQgYW55IFNBWDEvMgorICAgICBwYXJzZXIgY2FuIGJlIHNwZWNpZmllZCwgaWYgbmVlZGVkLjwvcD48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PC9wPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Cis8dGggYWxpZ249ImxlZnQiPgorPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8YSBuYW1lPSJuZXQiPi5ORVQgVGFza3M8L2E+Cis8L2ZvbnQ+PC90aD4KKzxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgorPC9mb250PgorPC90YWJsZT4KKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KKyAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL2RvdG5ldC5odG1sIj4uTkVUIFRhc2tzPC9hPjwvdGQ+CisgICAgPHRkPjxwPihTZWUgdGhlIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZyB0aGUgLk5FVCB0YXNrcy4pPC9wPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD48L3A+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKzx0aCBhbGlnbj0ibGVmdCI+Cis8Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzxhIG5hbWU9InByZXByb2MiPlByZS1wcm9jZXNzIFRhc2tzPC9hPgorPC9mb250PjwvdGg+Cis8Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KKzwvZm9udD4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9hbnRsci5odG1sIj5BTlRMUjwvYT48L3RkPgorICAgIDx0ZD48cD5JbnZva2VzIHRoZSA8YSBIUkVGPSJodHRwOi8vd3d3LmFudGxyLm9yZy8iIHRhcmdldD0iX3RvcCI+QU5UTFI8L2E+CisgICAgIFRyYW5zbGF0b3IgZ2VuZXJhdG9yIG9uIGEgZ3JhbW1hciBmaWxlLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvYW50c3RydWN0dXJlLmh0bWwiPkFudFN0cnVjdHVyZTwvYT48L3RkPgorICAgIDx0ZD48cD5HZW5lcmF0ZXMgYSBEVEQgZm9yIEFudCBidWlsZGZpbGVzIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24KKyAgICAgYWJvdXQgYWxsIHRhc2tzIGN1cnJlbnRseSBrbm93biB0byBBbnQuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9pbXBvcnQuaHRtbCI+SW1wb3J0PC9hPjwvdGQ+CisgICAgPHRkPjxwPkltcG9ydCBhbm90aGVyIGJ1aWxkIGZpbGUgYW5kIHBvdGVudGlhbGx5IG92ZXJyaWRlIHRhcmdldHMKKyAgICBpbiBpdCB3aXRoIHRhcmdldHMgb2YgeW91ciBvd24uPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvamF2YWNjLmh0bWwiPkphdmFDQzwvYT48L3RkPgorICAgIDx0ZD48cD5JbnZva2VzIHRoZQorICAgICA8YSBIUkVGPSJodHRwOi8vamF2YWNjLmRldi5qYXZhLm5ldC8iIHRhcmdldD0iX3RvcCI+CisgICAgIEphdmFDQzwvYT4gY29tcGlsZXItY29tcGlsZXIgb24gYSBncmFtbWFyIGZpbGUuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvamF2YWguaHRtbCI+SmF2YWg8L2E+PC90ZD4KKyAgICA8dGQ+PHA+R2VuZXJhdGVzIEpOSSBoZWFkZXJzIGZyb20gYSBKYXZhIGNsYXNzLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL2pqZG9jLmh0bWwiPkpKRG9jPC9hPjwvdGQ+CisgICAgPHRkPjxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhY2MuZGV2LmphdmEubmV0LyI+CisgICAgIEpKRG9jPC9hPiBkb2N1bWVudGF0aW9uIGdlbmVyYXRvciBmb3IgdGhlIEphdmFDQyBjb21waWxlci1jb21waWxlci4KKyAgICAgSkpEb2MgdGFrZXMgYSBKYXZhQ0MgcGFyc2VyIHNwZWNpZmljYXRpb24gYW5kIHByb2R1Y2VzIGRvY3VtZW50YXRpb24KKyAgICAgZm9yIHRoZSBCTkYgZ3JhbW1hci4gIEl0IGNhbiBvcGVyYXRlIGluIHRocmVlIG1vZGVzLCBkZXRlcm1pbmVkIGJ5CisgICAgIGNvbW1hbmQgbGluZSBvcHRpb25zLiBUaGlzIHRhc2sgb25seSBpbnZva2VzIEpKRG9jIGlmIHRoZSBncmFtbWFyIGZpbGUKKyAgICAgaXMgbmV3ZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIEJORiBncmFtbWFyIGRvY3VtZW50YXRpb24uPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvamp0cmVlLmh0bWwiPkpKVHJlZTwvYT48L3RkPgorICAgIDx0ZD48cD5JbnZva2VzIHRoZSA8YSBocmVmPSJodHRwOi8vamF2YWNjLmRldi5qYXZhLm5ldC8iPgorICAgICBKSlRyZWU8L2E+IHByZXByb2Nlc3NvciBmb3IgdGhlIEphdmFDQyBjb21waWxlci1jb21waWxlci4gSXQgaW5zZXJ0cworICAgICBwYXJzZS10cmVlIGJ1aWxkaW5nIGFjdGlvbnMgYXQgdmFyaW91cyBwbGFjZXMgaW4gdGhlIEphdmFDQyBzb3VyY2UgdGhhdAorICAgICBpdCBnZW5lcmF0ZXMuIFRoZSBvdXRwdXQgb2YgSkpUcmVlIGlzIHJ1biB0aHJvdWdoIEphdmFDQyB0byBjcmVhdGUgdGhlCisgICAgIHBhcnNlci4gVGhpcyB0YXNrIG9ubHkgaW52b2tlcyBKSlRyZWUgaWYgdGhlIGdyYW1tYXIgZmlsZSBpcyBuZXdlciB0aGFuCisgICAgIHRoZSBnZW5lcmF0ZWQgSmF2YUNDIGZpbGUuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9tYWNyb2RlZi5odG1sIj5NYWNyb2RlZjwvYT48L3RkPgorICAgIDx0ZD48cD5EZWZpbmUgYSBuZXcgdGFzayBhcyBhIG1hY3JvIGJ1aWx0LXVwIHVwb24gb3RoZXIgdGFza3MuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvbmF0aXZlMmFzY2lpLmh0bWwiPgorICAgICBOYXRpdmUyQXNjaWk8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q29udmVydHMgZmlsZXMgZnJvbSBuYXRpdmUgZW5jb2RpbmdzIHRvIEFTQ0lJIHdpdGggZXNjYXBlZCBVbmljb2RlLgorICAgICAgQSBjb21tb24gdXNhZ2UgaXMgdG8gY29udmVydCBzb3VyY2UgZmlsZXMgbWFpbnRhaW5lZCBpbiBhIG5hdGl2ZQorICAgICAgb3BlcmF0aW5nIHN5c3RlbSBlbmNvZGluZyB0byBBU0NJSSwgcHJpb3IgdG8gY29tcGlsYXRpb24uPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9wcmVzZXRkZWYuaHRtbCI+UHJlc2V0ZGVmPC9hPjwvdGQ+CisgICAgPHRkPjxwPkRlZmluZSBhIG5ldyB0YXNrIGJ5IGluc3RydW1lbnRpbmcgYW4gZXhpc3RpbmcgdGFzayB3aXRoCisgICAgZGVmYXVsdCB2YWx1ZXMgZm9yIGF0dHJpYnV0ZXMgb3IgY2hpbGQgZWxlbWVudHMuPC9wPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL3RyYW5zbGF0ZS5odG1sIj5UcmFuc2xhdGU8L2E+PC90ZD4KKyAgICA8dGQ+PHA+SWRlbnRpZmllcyBrZXlzIGluIGZpbGVzLCBkZWxpbWl0ZWQgYnkgc3BlY2lhbCB0b2tlbnMsIGFuZAorICAgICB0cmFuc2xhdGVzIHRoZW0gd2l0aCB2YWx1ZXMgcmVhZCBmcm9tIHJlc291cmNlIGJ1bmRsZXMuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9zdHlsZS5odG1sIj5YU0xUPC9hPjwvdGQ+CisgICAgPHRkPjxwPlByb2Nlc3NlcyBhIHNldCBvZiBkb2N1bWVudHMgdmlhIFhTTFQuPC9wPjwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+CisKKzxwPjwvcD4KKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgorPHRoIGFsaWduPSJsZWZ0Ij4KKzxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorPGEgbmFtZT0icHJvcCI+UHJvcGVydHkgVGFza3M8L2E+Cis8L2ZvbnQ+PC90aD4KKzxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgorPC9mb250PgorPC90YWJsZT4KKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgorICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KKyAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvYXZhaWxhYmxlLmh0bWwiPkF2YWlsYWJsZTwvYT48L3RkPgorICAgIDx0ZD48cD5TZXRzIGEgcHJvcGVydHkgaWYgYSBzcGVjaWZpZWQgZmlsZSwgZGlyZWN0b3J5LCBjbGFzcyBpbiB0aGUKKyAgICAgY2xhc3NwYXRoLCBvciBKVk0gc3lzdGVtIHJlc291cmNlIGlzIGF2YWlsYWJsZSBhdCBydW50aW1lLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvYmFzZW5hbWUuaHRtbCI+QmFzZW5hbWU8L2E+PC90ZD4KKyAgICA8dGQ+PHA+U2V0cyBhIHByb3BlcnR5IHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgYSBzcGVjaWZpZWQgcGF0aC4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2J1aWxkbnVtYmVyLmh0bWwiPkJ1aWxkTnVtYmVyPC9hPjwvdGQ+CisgICAgPHRkPjxwPlRhc2sgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBidWlsZCBudW1iZXJzLgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvY29uZGl0aW9uLmh0bWwiPkNvbmRpdGlvbjwvYT48L3RkPgorICAgIDx0ZD48cD5TZXRzIGEgcHJvcGVydHkgaWYgYSBjZXJ0YWluIGNvbmRpdGlvbiBob2xkcyB0cnVlOyB0aGlzIGlzIGEKKyAgICAgZ2VuZXJhbGl6YXRpb24gb2YgPGEgaHJlZj0iQ29yZVRhc2tzL2F2YWlsYWJsZS5odG1sIj5BdmFpbGFibGU8L2E+IGFuZAorICAgICA8YSBocmVmPSJDb3JlVGFza3MvdXB0b2RhdGUuaHRtbCI+VXB0b2RhdGU8L2E+LjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvZGlybmFtZS5odG1sIj5EaXJuYW1lPC9hPjwvdGQ+CisgICAgPHRkPjxwPlNldHMgYSBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlIHVwIHRvLAorICAgICBidXQgbm90IGluY2x1ZGluZywgdGhlIGxhc3QgcGF0aCBlbGVtZW50LgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD4KKyAgICA8YSBocmVmPSJPcHRpb25hbFRhc2tzL2VjaG9wcm9wZXJ0aWVzLmh0bWwiPkVjaG9wcm9wZXJ0aWVzPC9hPjxicj4KKworICAgIDwvdGQ+CisgICAgPHRkPjxwPkxpc3RzIHRoZSBjdXJyZW50IHByb3BlcnRpZXMuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9sb2FkZmlsZS5odG1sIj5Mb2FkRmlsZTwvYT48L3RkPgorICAgIDx0ZD48cD5Mb2FkcyBhIGZpbGUgaW50byBhIHByb3BlcnR5LjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJDb3JlVGFza3MvbG9hZHByb3BlcnRpZXMuaHRtbCI+TG9hZFByb3BlcnRpZXM8L2E+PC90ZD4KKyAgICA8dGQ+PHA+TG9hZCBhIGZpbGUncyBjb250ZW50cyBhcyBBbnQgcHJvcGVydGllcy4gVGhpcyB0YXNrIGlzCisgICAgIGVxdWl2YWxlbnQgdG8gdXNpbmcgPGNvZGU+Jmx0O3Byb3BlcnR5IGZpbGU9JnF1b3Q7Li4uJnF1b3Q7LyZndDs8L2NvZGU+CisgICAgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7PC9jb2RlPiBlbGVtZW50cywKKyAgICAgYW5kIGl0IGNhbm5vdCBiZSBzcGVjaWZpZWQgb3V0c2lkZSBhIHRhcmdldC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL21ha2V1cmwuaHRtbCI+TWFrZVVSTDwvYT48L3RkPgorICAgIDx0ZD48cD5DcmVhdGVzIGEgVVJMIChsaXN0KSBmcm9tIGEgZmlsZS9maWxlc2V0IG9yIHBhdGg8L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3BhdGhjb252ZXJ0Lmh0bWwiPlBhdGhDb252ZXJ0PC9hPjwvdGQ+CisgICAgPHRkPjxwPkNvbnZlcnRzIGEgbmVzdGVkIHBhdGgsIHBhdGggcmVmZXJlbmNlLCBmaWxlbGlzdCByZWZlcmVuY2UsIG9yCisgICAgIGZpbGVzZXQgcmVmZXJlbmNlIHRvIHRoZSBmb3JtIHVzYWJsZSBvbiBhIHNwZWNpZmllZCBwbGF0Zm9ybSBhbmQvb3IKKyAgICAgdG8gYSBsaXN0IG9mIGl0ZW1zIHNlcGFyYXRlZCBieSB0aGUgc3BlY2lmaWVkIHNlcGFyYXRvciBhbmQgc3RvcmVzCisgICAgIHRoZSByZXN1bHQgaW4gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3Byb3BlcnR5Lmh0bWwiPlByb3BlcnR5PC9hPjwvdGQ+CisgICAgPHRkPjxwPlNldHMgYSBwcm9wZXJ0eSAoYnkgbmFtZSBhbmQgdmFsdWUpLCBvciBzZXQgb2YgcHJvcGVydGllcworICAgICAoZnJvbSBhIGZpbGUgb3IgcmVzb3VyY2UpIGluIHRoZSBwcm9qZWN0LjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL3Byb3BlcnR5ZmlsZS5odG1sIj4KKyAgICAgUHJvcGVydHlGaWxlPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNyZWF0ZXMgb3IgbW9kaWZpZXMgcHJvcGVydHkgZmlsZXMuIFVzZWZ1bCB3aGVuIHdhbnRpbmcgdG8gbWFrZQorICAgICB1bmF0dGVuZGVkIG1vZGlmaWNhdGlvbnMgdG8gY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgYXBwbGljYXRpb24KKyAgICAgc2VydmVycyBhbmQgYXBwbGljYXRpb25zLiBUeXBpY2FsbHkgdXNlZCBmb3IgdGhpbmdzIHN1Y2ggYXMKKyAgICAgYXV0b21hdGljYWxseSBnZW5lcmF0aW5nIGEgYnVpbGQgbnVtYmVyIGFuZCBzYXZpbmcgaXQgdG8gYSBidWlsZAorICAgICBwcm9wZXJ0aWVzIGZpbGUsIG9yIGRvaW5nIGRhdGUgbWFuaXB1bGF0aW9uLjxwPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy91cHRvZGF0ZS5odG1sIj5VcHRvZGF0ZTwvYT48L3RkPgorICAgIDx0ZD48cD5TZXRzIGEgcHJvcGVydHkgaWYgYSBnaXZlbiB0YXJnZXQgZmlsZSBpcyBuZXdlciB0aGFuIGEgc2V0IG9mCisgICAgIHNvdXJjZSBmaWxlcy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL3doaWNocmVzb3VyY2UuaHRtbCI+V2hpY2hyZXNvdXJjZTwvYT48L3RkPgorICAgIDx0ZD48cD5GaW5kIGEgY2xhc3Mgb3IgcmVzb3VyY2UuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy94bWxwcm9wZXJ0eS5odG1sIj5YbWxQcm9wZXJ0eTwvYT48L3RkPgorICAgIDx0ZD48cD5Mb2FkcyBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBhIHdlbGwtZm9ybWVkIFhNTCBmaWxlLjwvcD48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PC9wPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Cis8dGggYWxpZ249ImxlZnQiPgorPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8YSBuYW1lPSJyZW1vdGUiPlJlbW90ZSBUYXNrczwvYT4KKzwvZm9udD48L3RoPgorPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Cis8L2ZvbnQ+Cis8L3RhYmxlPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgorICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvZnRwLmh0bWwiPkZUUDwvYT48L3RkPgorICAgIDx0ZD48cD5JbXBsZW1lbnRzIGEgYmFzaWMgRlRQIGNsaWVudCB0aGF0IGNhbiBzZW5kLCByZWNlaXZlLAorICAgICBsaXN0LCBhbmQgZGVsZXRlIGZpbGVzLCBhbmQgY3JlYXRlIGRpcmVjdG9yaWVzLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL3JleGVjLmh0bWwiPlJleGVjPC9hPjwvdGQ+CisgICAgPHRkPjxwPlRhc2sgdG8gYXV0b21hdGUgYSByZW1vdGUgcmV4ZWMgc2Vzc2lvbi48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9zY3AuaHRtbCI+U2NwPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNvcHkgZmlsZXMgdG8gb3IgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIgdXNpbmcgU1NILjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL3NldHByb3h5Lmh0bWwiPnNldHByb3h5PC9hPjwvdGQ+CisgICAgPHRkPjxwPlNldHMgSmF2YSdzIHdlYiBwcm94eSBwcm9wZXJ0aWVzLCBzbyB0aGF0IHRhc2tzIGFuZCBjb2RlIHJ1bgorIGluIHRoZSBzYW1lIEpWTSBjYW4gaGF2ZSB0aHJvdWdoLXRoZS1maXJld2FsbCBhY2Nlc3MgdG8gcmVtb3RlIHdlYiBzaXRlcy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9zc2hleGVjLmh0bWwiPlNzaGV4ZWM8L2E+PC90ZD4KKyAgICA8dGQ+PHA+RXhlY3V0ZSBhIGNvbW1hbmQgb24gYSByZW1vdGUgc2VydmVyIHVzaW5nIFNTSC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy90ZWxuZXQuaHRtbCI+VGVsbmV0PC9hPjwvdGQ+CisgICAgPHRkPjxwPlRhc2sgdG8gYXV0b21hdGUgYSByZW1vdGUgPGk+dGVsbmV0PC9pPiBzZXNzaW9uLiBUaGlzIHRhc2sgdXNlcworICAgICBuZXN0ZWQgPGNvZGU+Jmx0O3JlYWQmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3dyaXRlJmd0OzwvY29kZT4gdGFncworICAgICB0byBpbmRpY2F0ZSBzdHJpbmdzIHRvIHdhaXQgZm9yIGFuZCBzcGVjaWZ5IHRleHQgdG8gc2VuZC48L3A+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPHA+PC9wPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Cis8dGggYWxpZ249ImxlZnQiPgorPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8YSBuYW1lPSJzY20iPlNDTSBUYXNrczwvYT4KKzwvZm9udD48L3RoPgorPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Cis8L2ZvbnQ+Cis8L3RhYmxlPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+CisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgorICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9jdnMuaHRtbCI+Q3ZzPC9hPjwvdGQ+CisgICAgPHRkPjxwPkhhbmRsZXMgcGFja2FnZXMvbW9kdWxlcyByZXRyaWV2ZWQgZnJvbSBhCisgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubm9uZ251Lm9yZy9jdnMvIiB0YXJnZXQ9Il90b3AiPkNWUzwvYT4KKyAgICAgcmVwb3NpdG9yeS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iQ29yZVRhc2tzL2NoYW5nZWxvZy5odG1sIj5DdnNDaGFuZ2VMb2c8L2E+PC90ZD4KKyAgICA8dGQ+PHA+R2VuZXJhdGVzIGFuIFhNTCByZXBvcnQgb2YgdGhlIGNoYW5nZXMgcmVjb3JkZWQgaW4gYQorICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm5vbmdudS5vcmcvY3ZzLyIgdGFyZ2V0PSJfdG9wIj5DVlM8L2E+CisgICAgIHJlcG9zaXRvcnkuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9jdnNwYXNzLmh0bWwiPkNWU1Bhc3M8L2E+PC90ZD4KKyAgICA8dGQ+PHA+QWRkcyBlbnRyaWVzIHRvIGEgLmN2c3Bhc3MgZmlsZS4gQWRkaW5nIGVudHJpZXMgdG8gdGhpcyBmaWxlCisgICAgIGhhcyB0aGUgc2FtZSBhZmZlY3QgYXMgYSA8aT5jdnMgbG9naW48L2k+IGNvbW1hbmQuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9IkNvcmVUYXNrcy9jdnN0YWdkaWZmLmh0bWwiPkN2c1RhZ0RpZmY8L2E+PC90ZD4KKyAgICA8dGQ+PHA+R2VuZXJhdGVzIGFuIFhNTC1mb3JtYXR0ZWQgcmVwb3J0IGZpbGUgb2YgdGhlIGNoYW5nZXMgYmV0d2VlbgorICAgIHR3byB0YWdzIG9yIGRhdGVzIHJlY29yZGVkIGluIGEgPGEgaHJlZj0iaHR0cDovL3d3dy5ub25nbnUub3JnL2N2cy8iCisgICAgdGFyZ2V0PSJfdG9wIj5DVlM8L2E+IHJlcG9zaXRvcnkuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvY2xlYXJjYXNlLmh0bWwiPkNsZWFyQ2FzZTwvYT48L3RkPgorICAgIDx0ZD48cD5UYXNrcyB0byBwZXJmb3JtIHRoZSBDbGVhckNhc2UgY2xlYXJ0b29sIDxpPmNoZWNraW48L2k+LCA8aT5jaGVja291dDwvaT4sCisgICAgIDxpPnVuY2hlY2tvdXQ8L2k+LCA8aT51cGRhdGU8L2k+LCA8aT5sb2NrPC9pPiwgPGk+dW5sb2NrPC9pPiwgPGk+bWtsYnR5cGU8L2k+LCA8aT5ybXR5cGU8L2k+LCA8aT5ta2xhYmVsPC9pPiwgPGk+bWthdHRyPC9pPiwgPGk+bWtkaXI8L2k+LCA8aT5ta2VsZW08L2k+LCBhbmQgPGk+bWtibDwvaT4gY29tbWFuZHMuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvY2NtLmh0bWwiPkNvbnRpbnV1cy9TeW5lcmd5PC9hPjwvdGQ+CisgICAgPHRkPjxwPlRhc2tzIHRvIHBlcmZvcm0gdGhlIENvbnRpbnV1cyA8aT5jY21jaGVja2luPC9pPiwKKyAgICAgPGk+Y2NtY2hlY2tvdXQ8L2k+LCA8aT5jY21jaGVja2ludGFzazwvaT4sIDxpPmNjbXJlY29uZmlndXJlPC9pPiwgYW5kCisgICAgIDxpPmNjbWNyZWF0ZVRhc2s8L2k+IGNvbW1hbmRzLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL3Zzcy5odG1sIj4KKyAgICAgTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlPC9hPjwvdGQ+CisgICAgPHRkPjxwPlRhc2tzIHRvIHBlcmZvcm0gdGhlIFZpc3VhbCBTb3VyY2VTYWZlIDxpPnZzc2dldDwvaT4sCisgICAgIDxpPnZzc2xhYmVsPC9pPiwgPGk+dnNzaGlzdG9yeTwvaT4sIDxpPnZzc2NoZWNraW48L2k+LAorICAgICA8aT52c3NjaGVja291dDwvaT4sIDxpPnZzc2FkZDwvaT4sIDxpPnZzc2NwPC9pPiwgYW5kIDxpPnZzc2NyZWF0ZTwvaT4KKyAgICAgY29tbWFuZHMuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3MvcGVyZm9yY2UuaHRtbCI+UGVyZm9yY2U8L2E+PC90ZD4KKyAgICA8dGQ+PHA+VGFza3MgdG8gcGVyZm9ybSB0aGUgUGVyZm9yY2UgPGk+cDRzeW5jPC9pPiwgPGk+cDRjaGFuZ2U8L2k+LAorICAgICA8aT5wNGVkaXQ8L2k+LCA8aT5wNHN1Ym1pdDwvaT4sIDxpPnA0aGF2ZTwvaT4sIDxpPnA0bGFiZWw8L2k+LAorICAgICA8aT5wNGNvdW50ZXI8L2k+LCA8aT5wNHJlb3BlbjwvaT4sIDxpPnA0cmV2ZXJ0PC9pPiwgYW5kIDxpPnA0YWRkPC9pPgorICAgICBjb21tYW5kcy48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9wdmNzdGFzay5odG1sIj5QdmNzPC9hPjwvdGQ+CisgICAgPHRkPjxwPkFsbG93cyB0aGUgdXNlciBleHRyYWN0IHRoZSBsYXRlc3QgZWRpdGlvbiBvZiB0aGUgc291cmNlIGNvZGUKKyAgICAgZnJvbSBhIFBWQ1MgcmVwb3NpdG9yeS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9zb3MuaHRtbCI+U291cmNlT2ZmU2l0ZTwvYT48L3RkPgorICAgIDx0ZD48cD5UYXNrcyB0byBwZXJmb3JtIHRoZSBTb3VyY2VPZmZTaXRlIDxpPnNvc2dldDwvaT4sIDxpPnNvc2xhYmVsPC9pPiwKKyAgICAgPGk+c29zY2hlY2tpbjwvaT4sIGFuZCA8aT5zb3NjaGVja291dDwvaT4gY29tbWFuZHMuPC9wPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGQgbm93cmFwPjxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvc3RhcnRlYW0uaHRtbCI+U3RhclRlYW08L2E+PC90ZD4KKyAgICA8dGQ+PHA+VGFza3MgdG8gcGVyZm9ybSB0aGUgU3RhclRlYW0gPGk+c3RjaGVja291dDwvaT4sIDxpPnN0Y2hlY2tpbjwvaT4sCisgICAgIDxpPnN0bGFiZWw8L2k+LCBhbmQgPGk+c3RsaXN0PC9pPiBjb21tYW5kcy4gVGhlCisgICAgIDxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvc3RhcnRlYW0uaHRtbCNzdGFydGVhbSI+U3RhcnRlYW08L2E+IHRhc2sKKyAgICAgaXMgZGVwcmVjYXRlZDsgdXNlCisgICAgIDxhIGhyZWY9Ik9wdGlvbmFsVGFza3Mvc3RhcnRlYW0uaHRtbCNzdGNoZWNrb3V0Ij5TVENoZWNrb3V0PC9hPgorICAgICBpbnN0ZWFkLjwvcD48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PC9wPgorPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Cis8dGggYWxpZ249ImxlZnQiPgorPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Cis8YSBuYW1lPSJ0ZXN0aW5nIj5UZXN0aW5nIFRhc2tzPC9hPgorPC9mb250PjwvdGg+Cis8Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KKzx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KKzwvZm9udD4KKzwvdGFibGU+Cis8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKworICA8dHIgdmFsaWduPSJ0b3AiPgorICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iT3B0aW9uYWxUYXNrcy9qdW5pdC5odG1sIj5KdW5pdDwvYT48L3RkPgorICAgIDx0ZD48cD5SdW5zIHRlc3RzIGZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnIj5KdW5pdDwvYT4KKyAgICAgdGVzdGluZyBmcmFtZXdvcmsuIFRoaXMgdGFzayBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBKVW5pdCAzLjAgdXAgdG8KKyAgICAgSlVuaXQgMy43OyBpdCB3b24ndCB3b3JrIHdpdGggdmVyc2lvbnMgcHJpb3IgdG8gSlVuaXQgMy4wLjwvcD48L3RkPgorICA8L3RyPgorCisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPHRkIG5vd3JhcD48YSBocmVmPSJPcHRpb25hbFRhc2tzL2p1bml0cmVwb3J0Lmh0bWwiPkp1bml0UmVwb3J0PC9hPjwvdGQ+CisgICAgPHRkPjxwPk1lcmdlcyB0aGUgaW5kaXZpZHVhbCBYTUwgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZQorICAgICA8YSBocmVmPSJPcHRpb25hbFRhc2tzL2p1bml0Lmh0bWwiPkp1bml0PC9hPiB0YXNrIGFuZCBhcHBsaWVzIGEKKyAgICAgc3R5bGVzaGVldCBvbiB0aGUgcmVzdWx0aW5nIG1lcmdlZCBkb2N1bWVudCB0byBwcm92aWRlIGEgYnJvd3NhYmxlCisgICAgIHJlcG9ydCBvZiB0aGUgdGVzdGNhc2VzIHJlc3VsdHMuPC9wPjwvdGQ+CisgIDwvdHI+CisKKzwvdGFibGU+CisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3RvYy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvdG9jLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0YWIwYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL3RvYy5odG1sCkBAIC0wLDAgKzEsNDcgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KKzx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KKzxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPgorPGEgaHJlZj0iaW50cm8uaHRtbCI+SW50cm9kdWN0aW9uPC9hPjxici8+Cis8YSBocmVmPSJpbnN0YWxsbGlzdC5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5JbnN0YWxsaW5nIEFudDwvYT48YnIvPgorPGEgaHJlZj0idXNpbmdsaXN0Lmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPlVzaW5nIEFudDwvYT48YnIvPgorPGEgaHJlZj0icnVubmluZ2xpc3QuaHRtbCIgdGFyZ2V0PSJuYXZGcmFtZSI+UnVubmluZyBBbnQ8L2E+PGJyLz4KKzxhIGhyZWY9ImFudHRhc2tzbGlzdC5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5BbnQgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9ImNvbmNlcHRzdHlwZXNsaXN0Lmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPkNvbmNlcHRzIGFuZCBUeXBlczwvYT48YnIvPgorPGEgaHJlZj0ibGlzdGVuZXJzLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5Mb2dnZXJzICZhbXA7IExpc3RlbmVyczwvYT48YnIvPgorPGEgaHJlZj0iaWRlLmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPkVkaXRvci9JREUgSW50ZWdyYXRpb248L2E+PGJyLz4KKzxhIGhyZWY9ImRldmVsb3BsaXN0Lmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPkRldmVsb3Bpbmcgd2l0aCBBbnQ8L2E+PGJyLz4KKzxhIGhyZWY9InR1dG9yaWFscy5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5UdXRvcmlhbHM8L2E+PGJyLz4KKzxhIGhyZWY9ImFwaS9pbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPkFudCBBUEk8L2E+PGJyLz4KKzxhIGhyZWY9IkxJQ0VOU0UiPkxpY2Vuc2U8L2E+PGJyLz4KKzxhIGhyZWY9ImZlZWRiYWNrLmh0bWwiPkZlZWRiYWNrIGFuZCBUcm91Ymxlc2hvb3Rpbmc8L2E+PGJyLz4KKzxici8+Cis8YSBocmVmPSJjcmVkaXRzLmh0bWwiPkF1dGhvcnM8L2E+PGJyLz4KKworPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL21hbnVhbC90dXRvcmlhbC1IZWxsb1dvcmxkV2l0aEFudC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvdHV0b3JpYWwtSGVsbG9Xb3JsZFdpdGhBbnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWIwZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvdHV0b3JpYWwtSGVsbG9Xb3JsZFdpdGhBbnQuaHRtbApAQCAtMCwwICsxLDUxNyBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKyAgPHRpdGxlPlR1dG9yaWFsOiBIZWxsbyBXb3JsZCB3aXRoIEFudDwvdGl0bGU+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5UdXRvcmlhbDogSGVsbG8gV29ybGQgd2l0aCBBbnQ8L2gxPgorCis8cD5UaGlzIGRvY3VtZW50IHByb3ZpZGVzIGEgc3RlcCBieSBzdGVwIHR1dG9yaWFsIGZvciBzdGFydGluZyBqYXZhIHByb2dyYW1taW5nIHdpdGggQW50LgorSXQgZG9lcyA8Yj5ub3Q8L2I+IGNvbnRhaW4gZGVlcGVyIGtub3dsZWRnZSBhYm91dCBKYXZhIG9yIEFudC4gVGhpcyB0dXRvcmlhbCBoYXMgdGhlIGdvYWwKK3RvIGxldCB5b3Ugc2VlLCBob3cgdG8gZG8gdGhlIGVhc2llc3Qgc3RlcHMgaW4gQW50LjwvcD4KKworCisKKzxoMj5Db250ZW50PC9oMj4KKzxwPjx1bD4KKzxsaT48YSBocmVmPSIjcHJlcGFyZSI+UHJlcGFyaW5nIHRoZSBwcm9qZWN0PC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI2ZvdXItc3RlcHMiPkVuaGFuY2UgdGhlIGJ1aWxkIGZpbGU8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjZW5oYW5jZSI+RW5oYW5jZSB0aGUgYnVpbGQgZmlsZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNleHQtbGlicyI+VXNpbmcgZXh0ZXJuYWwgbGlicmFyaWVzPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI3Jlc291cmNlcyI+UmVzb3VyY2VzPC9hPjwvbGk+Cis8L3VsPjwvcD4KKworCis8YSBuYW1lPSJwcmVwYXJlIj48L2E+Cis8aDI+UHJlcGFyaW5nIHRoZSBwcm9qZWN0PC9oMj4KKzxwPldlIHdhbnQgdG8gc2VwYXJhdGUgdGhlIHNvdXJjZSBmcm9tIHRoZSBnZW5lcmF0ZWQgZmlsZXMsIHNvIG91ciBqYXZhIHNvdXJjZSBmaWxlcyB3aWxsCitiZSBpbiA8dHQ+c3JjPC90dD4gZm9sZGVyLiBBbGwgZ2VuZXJhdGVkIGZpbGVzIHNob3VsZCBiZSB1bmRlciA8dHQ+YnVpbGQ8L3R0PiwgYW5kIHRoZXJlCitzcGxpdHRlZCBpbnRvIHNldmVyYWwgc3ViZGlyZWN0b3JpZXMgZm9yIHRoZSBpbmRpdmlkdWFsIHN0ZXBzOiA8dHQ+Y2xhc3NlczwvdHQ+IGZvciBvdXIgY29tcGlsZWQKK2ZpbGVzIGFuZCA8dHQ+amFyPC90dD4gZm9yIG91ciBvd24gSkFSLWZpbGUuPC9wPgorPHA+V2UgaGF2ZSB0byBjcmVhdGUgb25seSB0aGUgPHR0PnNyYzwvdHQ+IGRpcmVjdG9yeS4gKEJlY2F1c2UgSSBhbSB3b3JraW5nIG9uIFdpbmRvd3MsIGhlcmUgaXMgCit0aGUgd2luLXN5bnRheCAtIHRyYW5zbGF0ZSB0byB5b3VyIHNoZWxsKTo8L3A+CisKKzxwcmUgY2xhc3M9ImNvZGUiPgorbWQgc3JjCis8L3ByZT4KKworPHA+VGhlIGZvbGxvd2luZyBzaW1wbGUgSmF2YSBjbGFzcyBqdXN0IHByaW50cyBhIGZpeGVkIG1lc3NhZ2Ugb3V0IHRvIFNURE9VVCwKK3NvIGp1c3Qgd3JpdGUgdGhpcyBjb2RlIGludG8gPHR0PnNyY1xvYXRhXEhlbGxvV29ybGQuamF2YTwvdHQ+LjwvcD4KKworPHByZSBjbGFzcz0iY29kZSI+CitwYWNrYWdlIG9hdGE7CisKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gV29ybGQiKTsKKyAgICB9Cit9Cis8L3ByZT4KKworPHA+Tm93IGp1c3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biB0aGF0OgorPHByZSBjbGFzcz0iY29kZSI+CittZCBidWlsZFxjbGFzc2VzCitqYXZhYyAtc291cmNlcGF0aCBzcmMgLWQgYnVpbGRcY2xhc3NlcyBzcmNcb2F0YVxIZWxsb1dvcmxkLmphdmEKK2phdmEgLWNwIGJ1aWxkXGNsYXNzZXMgb2F0YS5IZWxsb1dvcmxkCis8L3ByZT4KK3doaWNoIHdpbGwgcmVzdWx0IGluCis8cHJlIGNsYXNzPSJvdXRwdXQiPgorSGVsbG8gV29ybGQKKzwvcHJlPgorPC9wPgorCis8cD5DcmVhdGluZyBhIGphci1maWxlIGlzIG5vdCB2ZXJ5IGRpZmZpY3VsdC4gQnV0IGNyZWF0aW5nIGEgPGk+c3RhcnRhYmxlPC9pPiBqYXItZmlsZSBuZWVkcyBtb3JlIHN0ZXBzOiBjcmVhdGUgYQorbWFuaWZlc3QtZmlsZSBjb250YWluaW5nIHRoZSBzdGFydCBjbGFzcywgY3JlYXRpbmcgdGhlIHRhcmdldCBkaXJlY3RvcnkgYW5kIGFyY2hpdmluZyB0aGUgZmlsZXMuPC9wPgorPHByZSBjbGFzcz0iY29kZSI+CitlY2hvIE1haW4tQ2xhc3M6IG9hdGEuSGVsbG9Xb3JsZCZndDtteU1hbmlmZXN0CittZCBidWlsZFxqYXIKK2phciBjZm0gYnVpbGRcamFyXEhlbGxvV29ybGQuamFyIG15TWFuaWZlc3QgLUMgYnVpbGRcY2xhc3NlcyAuCitqYXZhIC1qYXIgYnVpbGRcamFyXEhlbGxvV29ybGQuamFyCis8L3ByZT4KKworPHA+PGI+Tm90ZTo8L2I+IERvIG5vdCBoYXZlIGJsYW5rcyBhcm91bmQgdGhlICZndDstc2lnbiBpbiB0aGUgPHR0PmVjaG8gTWFpbi1DbGFzczwvdHQ+IGluc3RydWN0aW9uIGJlY2F1c2UgaXQgd291bGQgCitmYWxzaWZ5IGl0ITwvcD4KKworCis8YSBuYW1lPSJmb3VyLXN0ZXBzIj48L2E+Cis8aDI+Rm91ciBzdGVwcyB0byBhIHJ1bm5pbmcgYXBwbGljYXRpb248L2gyPgorPHA+QWZ0ZXIgZmluaXNoaW5nIHRoZSBqYXZhLW9ubHkgc3RlcCB3ZSBoYXZlIHRvIHRoaW5rIGFib3V0IG91ciBidWlsZCBwcm9jZXNzLiBXZSA8aT5oYXZlPC9pPiB0byBjb21waWxlIG91ciBjb2RlLCBvdGhlcndpc2Ugd2UgY291bGRuJ3QKK3N0YXJ0IHRoZSBwcm9ncmFtLiBPaCAtICJzdGFydCIgLSB5ZXMsIHdlIGNvdWxkIHByb3ZpZGUgYSB0YXJnZXQgZm9yIHRoYXQuIFdlIDxpPnNob3VsZDwvaT4gcGFja2FnZSBvdXIgYXBwbGljYXRpb24uCitOb3cgaXQncyBvbmx5IG9uZSBjbGFzcyAtIGJ1dCBpZiB5b3Ugd2FudCB0byBwcm92aWRlIGEgZG93bmxvYWQsIG5vIG9uZSB3b3VsZCBkb3dubG9hZCBzZXZlcmFsIGh1bmRyZWRzIGZpbGVzIC4uLgorKHRoaW5rIGFib3V0IGEgY29tcGxleCBTd2luZyBHVUkgLSBzbyBsZXQgdXMgY3JlYXRlIGEgamFyIGZpbGUuIEEgc3RhcnRhYmxlIGphciBmaWxlIHdvdWxkIGJlIG5pY2UgLi4uIEFuZCBpdCdzIGEKK2dvb2QgcHJhY3Rpc2UgdG8gaGF2ZSBhICJjbGVhbiIgdGFyZ2V0LCB3aGljaCBkZWxldGVzIGFsbCB0aGUgZ2VuZXJhdGVkIHN0dWZmLiBNYW55IGZhaWx1cmVzIGNvdWxkIGJlIHNvbHZlZCBqdXN0CitieSBhICJjbGVhbiBidWlsZCIuPC9wPgorCis8cD5CeSBkZWZhdWx0IEFudCB1c2VzIDx0dD5idWlsZC54bWw8L3R0PiBhcyB0aGUgbmFtZSBmb3IgYSBidWlsZGZpbGUsIHNvIG91ciA8dHQ+LlxidWlsZC54bWw8L3R0PiB3b3VsZCBiZTo8L3A+Cis8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDtwcm9qZWN0Jmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJjbGVhbiImZ3Q7CisgICAgICAgICZsdDtkZWxldGUgZGlyPSJidWlsZCIvJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJjb21waWxlIiZndDsKKyAgICAgICAgJmx0O21rZGlyIGRpcj0iYnVpbGQvY2xhc3NlcyIvJmd0OworICAgICAgICAmbHQ7amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMiLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0iamFyIiZndDsKKyAgICAgICAgJmx0O21rZGlyIGRpcj0iYnVpbGQvamFyIi8mZ3Q7CisgICAgICAgICZsdDtqYXIgZGVzdGZpbGU9ImJ1aWxkL2phci9IZWxsb1dvcmxkLmphciIgYmFzZWRpcj0iYnVpbGQvY2xhc3NlcyImZ3Q7CisgICAgICAgICAgICAmbHQ7bWFuaWZlc3QmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJNYWluLUNsYXNzIiB2YWx1ZT0ib2F0YS5IZWxsb1dvcmxkIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L21hbmlmZXN0Jmd0OworICAgICAgICAmbHQ7L2phciZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0icnVuIiZndDsKKyAgICAgICAgJmx0O2phdmEgamFyPSJidWlsZC9qYXIvSGVsbG9Xb3JsZC5qYXIiIGZvcms9InRydWUiLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+CisKKzxwPk5vdyB5b3UgY2FuIGNvbXBpbGUsIHBhY2thZ2UgYW5kIHJ1biB0aGUgYXBwbGljYXRpb24gdmlhPC9wPgorPHByZSBjbGFzcz0iY29kZSI+CithbnQgY29tcGlsZQorYW50IGphcgorYW50IHJ1bgorPC9wcmU+Cis8cD5PciBzaG9ydGVyIHdpdGg8L3A+Cis8cHJlIGNsYXNzPSJjb2RlIj4KK2FudCBjb21waWxlIGphciBydW4KKzwvcHJlPgorCis8cD5XaGlsZSBoYXZpbmcgYSBsb29rIGF0IHRoZSBidWlsZGZpbGUsIHdlIHdpbGwgc2VlIHNvbWUgc2ltaWxhciBzdGVwcyBiZXR3ZWVuIEFudCBhbmQgdGhlIGphdmEtb25seSBjb21tYW5kczoKKzx0YWJsZT4KKzx0cj4KKyAgPHRoPmphdmEtb25seTwvdGg+CisgIDx0aD5BbnQ8L3RoPgorPC90cj4KKzx0cj4KKyAgPHRkIHZhbGlnbj0idG9wIj48cHJlIGNsYXNzPSJjb2RlIj4KK21kIGJ1aWxkXGNsYXNzZXMKK2phdmFjCisgICAgLXNvdXJjZXBhdGggc3JjCisgICAgLWQgYnVpbGRcY2xhc3NlcworICAgIHNyY1xvYXRhXEhlbGxvV29ybGQuamF2YQorZWNobyBNYWluLUNsYXNzOiBvYXRhLkhlbGxvV29ybGQ+bWYKK21kIGJ1aWxkXGphcgoramFyIGNmbQorICAgIGJ1aWxkXGphclxIZWxsb1dvcmxkLmphcgorICAgIG1mCisgICAgLUMgYnVpbGRcY2xhc3NlcworICAgIC4KKworCisKK2phdmEgLWphciBidWlsZFxqYXJcSGVsbG9Xb3JsZC5qYXIKKyAgPC9wcmU+PC90ZD4KKyAgPHRkIHZhbGlnbj0idG9wIj48cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDtta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMiLyZndDsKKyZsdDtqYXZhYworICAgIHNyY2Rpcj0ic3JjIgorICAgIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMiLyZndDsKKzxpPiZsdDshLS0gYXV0b21hdGljYWxseSBkZXRlY3RlZCAtLSZndDs8L2k+Cis8aT4mbHQ7IS0tIG9ic29sZXRlOyBkb25lIHZpYSBtYW5pZmVzdCB0YWcgLS0mZ3Q7PC9pPgorJmx0O21rZGlyIGRpcj0iYnVpbGQvamFyIi8mZ3Q7CismbHQ7amFyCisgICAgZGVzdGZpbGU9ImJ1aWxkL2phci9IZWxsb1dvcmxkLmphciIKKworICAgIGJhc2VkaXI9ImJ1aWxkL2NsYXNzZXMiJmd0OworICAgICZsdDttYW5pZmVzdCZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJNYWluLUNsYXNzIiB2YWx1ZT0ib2F0YS5IZWxsb1dvcmxkIi8mZ3Q7CisgICAgJmx0Oy9tYW5pZmVzdCZndDsKKyZsdDsvamFyJmd0OworJmx0O2phdmEgamFyPSJidWlsZC9qYXIvSGVsbG9Xb3JsZC5qYXIiIGZvcms9InRydWUiLyZndDsKKyAgPC9wcmU+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzwvcD4KKworCisKKzxhIG5hbWU9ImVuaGFuY2UiPjwvYT4KKzxoMj5FbmhhbmNlIHRoZSBidWlsZCBmaWxlPC9oMj4KKzxwPk5vdyB3ZSBoYXZlIGEgd29ya2luZyBidWlsZGZpbGUgd2UgY291bGQgZG8gc29tZSBlbmhhbmNlbWVudHM6IG1hbnkgdGltZSB5b3UgYXJlIHJlZmVyZW5jaW5nIHRoZQorc2FtZSBkaXJlY3RvcmllcywgbWFpbi1jbGFzcyBhbmQgamFyLW5hbWUgYXJlIGhhcmQgY29kZWQsIGFuZCB3aGlsZSBpbnZvY2F0aW9uIHlvdSBoYXZlIHRvIHJlbWVtYmVyCit0aGUgcmlnaHQgb3JkZXIgb2YgYnVpbGQgc3RlcHMuPC9wPgorPHA+VGhlIGZpcnN0IGFuZCBzZWNvbmQgcG9pbnQgd291bGQgYmUgYWRkcmVzc2VkIHdpdGggPGk+cHJvcGVydGllczwvaT4sIHRoZSB0aGlyZCB3aXRoIGEgc3BlY2lhbCBwcm9wZXJ0eSAtIGFuIGF0dHJpYnV0ZQorb2YgdGhlICZsdDtwcm9qZWN0Jmd0Oy10YWcgYW5kIHRoZSBmb3VydGggcHJvYmxlbSBjYW4gYmUgc29sdmVkIHVzaW5nIGRlcGVuZGVuY2llcy48L3A+CisKKworPHByZSBjbGFzcz0iY29kZSI+CismbHQ7cHJvamVjdCBuYW1lPSJIZWxsb1dvcmxkIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIiZndDsKKworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiAgICAgdmFsdWU9InNyYyIvJmd0OworCisgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgICB2YWx1ZT0iYnVpbGQiLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvJmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJqYXIuZGlyIiAgICAgdmFsdWU9IiR7YnVpbGQuZGlyfS9qYXIiLyZndDsKKworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJtYWluLWNsYXNzIiAgdmFsdWU9Im9hdGEuSGVsbG9Xb3JsZCIvJmd0OworCisKKworICAgICZsdDt0YXJnZXQgbmFtZT0iY2xlYW4iJmd0OworICAgICAgICAmbHQ7ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiJmd0OworICAgICAgICAmbHQ7bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIvJmd0OworICAgICAgICAmbHQ7amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIvJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJqYXIiIGRlcGVuZHM9ImNvbXBpbGUiJmd0OworICAgICAgICAmbHQ7bWtkaXIgZGlyPSIke2phci5kaXJ9Ii8mZ3Q7CisgICAgICAgICZsdDtqYXIgZGVzdGZpbGU9IiR7amFyLmRpcn0vJHthbnQucHJvamVjdC5uYW1lfS5qYXIiIGJhc2VkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiZndDsKKyAgICAgICAgICAgICZsdDttYW5pZmVzdCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiIHZhbHVlPSIke21haW4tY2xhc3N9Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7L21hbmlmZXN0Jmd0OworICAgICAgICAmbHQ7L2phciZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJqYXIiJmd0OworICAgICAgICAmbHQ7amF2YSBqYXI9IiR7amFyLmRpcn0vJHthbnQucHJvamVjdC5uYW1lfS5qYXIiIGZvcms9InRydWUiLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0iY2xlYW4tYnVpbGQiIGRlcGVuZHM9ImNsZWFuLGphciIvJmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJjbGVhbixydW4iLyZndDsKKworJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+CisKKworPHA+Tm93IGl0J3MgZWFzaWVyLCBqdXN0IGRvIGEgPHR0IGNsYXNzPSJjb2RlIj5hbnQ8L3R0PiBhbmQgeW91IHdpbGwgZ2V0PC9wPgorPHByZSBjbGFzcz0ib3V0cHV0Ij4KK0J1aWxkZmlsZTogYnVpbGQueG1sCisKK2NsZWFuOgorCitjb21waWxlOgorICAgIFtta2Rpcl0gQ3JlYXRlZCBkaXI6IEM6XC4uLlxidWlsZFxjbGFzc2VzCisgICAgW2phdmFjXSBDb21waWxpbmcgMSBzb3VyY2UgZmlsZSB0byBDOlwuLi5cYnVpbGRcY2xhc3NlcworCitqYXI6CisgICAgW21rZGlyXSBDcmVhdGVkIGRpcjogQzpcLi4uXGJ1aWxkXGphcgorICAgICAgW2phcl0gQnVpbGRpbmcgamFyOiBDOlwuLi5cYnVpbGRcamFyXEhlbGxvV29ybGQuamFyCisKK3J1bjoKKyAgICAgW2phdmFdIEhlbGxvIFdvcmxkCisKK21haW46CisKK0JVSUxEIFNVQ0NFU1NGVUwKKzwvcHJlPgorCisKKzxhIG5hbWU9ImV4dC1saWJzIj48L2E+Cis8aDI+VXNpbmcgZXh0ZXJuYWwgbGlicmFyaWVzPC9oMj4KKzxwPlNvbWVob3cgdG9sZCB1cyBub3QgdG8gdXNlIHN5c28tc3RhdGVtZW50cy4gRm9yIGxvZy1TdGF0ZW1lbnRzIHdlIHNob3VsZCB1c2UgYSBMb2dnaW5nLUFQSSAtIGN1c3RvbWl6YWJsZSBvbiBhIGhpZ2gKK2RlZ3JlZSAoaW5jbHVkaW5nIHN3aXRjaGluZyBvZmYgZHVyaW5nIHVzdWFsIGxpZmUgKD0gbm90IGRldmVsb3BtZW50KSBleGVjdXRpb24pLiBXZSB1c2UgTG9nNEogZm9yIHRoYXQsIGJlY2F1c2UgPHVsPgorPGxpPml0IGlzIG5vdCBwYXJ0IG9mIHRoZSBKREsgKDEuNCspIGFuZCB3ZSB3YW50IHRvIHNob3cgaG93IHRvIHVzZSBleHRlcm5hbCBsaWJzPC9saT4KKzxsaT5pdCBjYW4gcnVuIHVuZGVyIEpESyAxLjIgKGFzIEFudCk8L2xpPgorPGxpPml0J3MgaGlnaGx5IGNvbmZpZ3VyYWJsZTwvbGk+Cis8bGk+aXQncyBmcm9tIEFwYWNoZSA7LSk8L2xpPgorPC91bD48L3A+Cis8cD5XZSBzdG9yZSBvdXIgZXh0ZXJuYWwgbGlicmFyaWVzIGluIGEgbmV3IGRpcmVjdG9yeSA8dHQ+bGliPC90dD4uIExvZzRKIGNhbiBiZQorPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbG9nZ2luZy9sb2c0ai8xLjIuMTMvbG9nZ2luZy1sb2c0ai0xLjIuMTMuemlwIj5kb3dubG9hZGVkIFsxXTwvYT4gZnJvbSBMb2dnaW5nJ3MgSG9tZXBhZ2UuCitDcmVhdGUgdGhlIDx0dD5saWI8L3R0PiBkaXJlY3RvcnkgYW5kIGV4dHJhY3QgdGhlIGxvZzRqLTEuMi45LmphciBpbnRvIHRoYXQgbGliLWRpcmVjdG9yeS4gQWZ0ZXIgdGhhdCB3ZSBoYXZlIHRvIG1vZGlmeQorb3VyIGphdmEgc291cmNlIHRvIHVzZSB0aGF0IGxpYnJhcnkgYW5kIG91ciBidWlsZGZpbGUgc28gdGhhdCB0aGlzIGxpYnJhcnkgY291bGQgYmUgYWNjZXNzZWQgZHVyaW5nIGNvbXBpbGF0aW9uIGFuZCBydW4uCis8L3A+Cis8cD5Xb3JraW5nIHdpdGggTG9nNEogaXMgZG9jdW1lbnRlZCBpbnNpZGUgaXRzIG1hbnVhbC4gSGVyZSB3ZSB1c2UgdGhlIDxpPk15QXBwPC9pPi1leGFtcGxlIGZyb20gdGhlCis8YSBocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqL2RvY3MvbWFudWFsLmh0bWwiPlNob3J0IE1hbnVhbCBbMl08L2E+LiBGaXJzdCB3ZSBoYXZlIHRvIG1vZGlmeSB0aGUgamF2YSBzb3VyY2UgdG8KK3VzZSB0aGUgbG9nZ2luZyBmcmFtZXdvcms6PC9wPgorCis8cHJlIGNsYXNzPSJjb2RlIj4KK3BhY2thZ2Ugb2F0YTsKKworPGI+aW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOzwvYj4KKzxiPmltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOzwvYj4KKworcHVibGljIGNsYXNzIEhlbGxvV29ybGQgeworICAgIDxiPnN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihIZWxsb1dvcmxkLmNsYXNzKTs8L2I+CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIDxiPkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOzwvYj4KKyAgICAgICAgPGZvbnQgY29sb3I9ImJsdWUiPjxiPmxvZ2dlci5pbmZvKCJIZWxsbyBXb3JsZCIpOzwvYj48L2ZvbnQ+ICAgICAgICAgIC8vIHRoZSBvbGQgU3lzTy1zdGF0ZW1lbnQKKyAgICB9Cit9Cis8L3ByZT4KKworPHA+TW9zdCBvZiB0aGUgbW9kaWZpY2F0aW9ucyBhcmUgImZyYW1ld29yayBvdmVyaGVhZCIgd2hpY2ggaGFzIHRvIGJlIGRvbmUgb25jZS4gVGhlIGJsdWUgbGluZSBpcyBvdXIgIm9sZCBTeXN0ZW0tb3V0Igorc3RhdGVtZW50LjwvcD4KKzxwPkRvbid0IHRyeSB0byBydW4gPHR0PmFudDwvdHQ+IC0geW91IHdpbGwgb25seSBnZXQgbG90IG9mIGNvbXBpbGVyIGVycm9ycy4gTG9nNEogaXMgbm90IGluc2lkZSB0aGUgY2xhc3NwYXRoIHNvIHdlIGhhdmUKK3RvIGRvIGEgbGl0dGxlIHdvcmsgaGVyZS4gQnV0IGRvIG5vdCBjaGFuZ2UgdGhlIENMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSEgVGhpcyBpcyBvbmx5IGZvciB0aGlzIHByb2plY3QgYW5kIG1heWJlCit5b3Ugd291bGQgYnJlYWsgb3RoZXIgZW52aXJvbm1lbnRzICh0aGlzIGlzIG9uZSBvZiB0aGUgbW9zdCBmYW1vdXMgbWlzdGFrZXMgd2hlbiB3b3JraW5nIHdpdGggQW50KS4gV2UgaW50cm9kdWNlIExvZzRKCisob3IgdG8gYmUgbW9yZSBwcmVjaXNlOiBhbGwgbGlicmFyaWVzIChqYXItZmlsZXMpIHdoaWNoIGFyZSBzb21ld2hlcmUgdW5kZXIgPHR0Pi5cbGliPC90dD4pIGludG8gb3VyIGJ1aWxkZmlsZTo8L3A+CisKKzxwcmUgY2xhc3M9ImNvZGUiPgorJmx0O3Byb2plY3QgbmFtZT0iSGVsbG9Xb3JsZCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiImZ3Q7CisgICAgLi4uCisgICAgPGI+Jmx0O3Byb3BlcnR5IG5hbWU9ImxpYi5kaXIiICAgICB2YWx1ZT0ibGliIi8mZ3Q7PC9iPgorCisgICAgPGI+Jmx0O3BhdGggaWQ9ImNsYXNzcGF0aCImZ3Q7PC9iPgorICAgICAgICA8Yj4mbHQ7ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmphciIvJmd0OzwvYj4KKyAgICA8Yj4mbHQ7L3BhdGgmZ3Q7PC9iPgorCisgICAgLi4uCisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiJmd0OworICAgICAgICAmbHQ7bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIvJmd0OworICAgICAgICAmbHQ7amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIgPGI+Y2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiPC9iPi8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iamFyIiZndDsKKyAgICAgICAgJmx0O2phdmEgZm9yaz0idHJ1ZSIgPGI+Y2xhc3NuYW1lPSIke21haW4tY2xhc3N9IjwvYj4mZ3Q7CisgICAgICAgICAgICA8Yj4mbHQ7Y2xhc3NwYXRoJmd0OzwvYj4KKyAgICAgICAgICAgICAgICA8Yj4mbHQ7cGF0aCByZWZpZD0iY2xhc3NwYXRoIi8mZ3Q7PC9iPgorICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPjxiPiZsdDtwYXRoIGxvY2F0aW9uPSIke2phci5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0uamFyIi8mZ3Q7PC9iPjwvZm9udD4KKyAgICAgICAgICAgIDxiPiZsdDsvY2xhc3NwYXRoJmd0OzwvYj4KKyAgICAgICAgJmx0Oy9qYXZhJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCisgICAgLi4uCisKKyZsdDsvcHJvamVjdCZndDsKKzwvcHJlPgorCis8cD5JbiB0aGlzIGV4YW1wbGUgd2Ugc3RhcnQgb3VyIGFwcGxpY2F0aW9uIG5vdCB2aWEgaXRzIE1haW4tQ2xhc3MgbWFuaWZlc3QtYXR0cmlidXRlLCBiZWNhdXNlIHdlIGNvdWxkIG5vdCBwcm92aWRlCithIGphcm5hbWUgPGk+YW5kPC9pPiBhIGNsYXNzcGF0aC4gU28gYWRkIG91ciBjbGFzcyBpbiB0aGUgcmVkIGxpbmUgdG8gdGhlIGFscmVhZHkgZGVmaW5lZCBwYXRoIGFuZCBzdGFydCBhcyB1c3VhbC4gUnVubmluZworPHR0PmFudDwvdHQ+IHdvdWxkIGdpdmUgKGFmdGVyIHRoZSB1c3VhbCBjb21waWxlIHN0dWZmKTo8L3A+CisKKzxwcmUgY2xhc3M9Im91dHB1dCI+CitbamF2YV0gMCBbbWFpbl0gSU5GTyBvYXRhLkhlbGxvV29ybGQgIC0gSGVsbG8gV29ybGQKKzwvcHJlPgorCis8cD5XaGF0J3MgdGhhdD8gPHVsPgorPGxpPjxpPltqYXZhXTwvaT4gQW50IHRhc2sgcnVubmluZyBhdCB0aGUgbW9tZW50PC9saT4KKzxsaT48aT4wPC9pPiA8Zm9udCBzaXplPSItMSI+c29ycnkgZG9uJ3Qga25vdyAtIHNvbWUgTG9nNEogc3R1ZmY8L2ZvbnQ+PC9saT4KKzxsaT48aT5bbWFpbl08L2k+IHRoZSBydW5uaW5nIHRocmVhZCBmcm9tIG91ciBhcHBsaWNhdGlvbiA8L2xpPgorPGxpPjxpPklORk88L2k+IGxvZyBsZXZlbCBvZiB0aGF0IHN0YXRlbWVudDwvaT4KKzxsaT48aT5vYXRhLkhlbGxvV29ybGQ8L2k+IHNvdXJjZSBvZiB0aGF0IHN0YXRlbWVudDwvaT4KKzxsaT48aT4tPC9pPiBzZXBhcmF0b3I8L2xpPgorPGxpPjxpPkhlbGxvIFdvcmxkPC9pPiB0aGUgbWVzc2FnZTwvbGk+Cis8L3VsPgorRm9yIGFub3RoZXIgbGF5b3V0IC4uLiBoYXZlIGEgbG9vayBpbnNpZGUgTG9nNEoncyBkb2N1bWVudGF0aW9uIGFib3V0IHVzaW5nIG90aGVyIFBhdHRlcm5MYXlvdXQncy48L3A+CisKKworPGEgbmFtZT0iY29uZmlnLWZpbGVzIj4KKzxoMj5Db25maWd1cmF0aW9uIGZpbGVzPC9oMj4KKzxwPldoeSB3ZSBoYXZlIHVzZWQgTG9nNEo/ICJJdCdzIGhpZ2hseSBjb25maWd1cmFibGUiPyBObyAtIGFsbCBpcyBoYXJkIGNvZGVkISBCdXQgdGhhdCBpcyBub3QgdGhlIGRlYnQgb2YgTG9nNEogLSBpdCdzCitvdXJzLiBXZSBoYWQgY29kZWQgPHR0PkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOzwvdHQ+IHdoaWNoIGltcGxpZXMgYSBzaW1wbGUsIGJ1dCBoYXJkIGNvZGVkIGNvbmZpZ3VyYXRpb24uIE1vcmUKK2NvbmZvcnRhYmxlIHdvdWxkIGJlIHVzaW5nIGEgcHJvcGVydHkgZmlsZS4gSW4gdGhlIGphdmEgc291cmNlIGRlbGV0ZSB0aGUgQmFzaWNDb25maWd1cmF0aW9uLWxpbmUgZnJvbSB0aGUgbWFpbigpIG1ldGhvZAorKGFuZCB0aGUgcmVsYXRlZCBpbXBvcnQtc3RhdGVtZW50KS4gTG9nNEogd2lsbCBzZWFyY2ggdGhlbiBmb3IgYSBjb25maWd1cmF0aW9uIGFzIGRlc2NyaWJlZCBpbiBpdCdzIG1hbnVhbC4gVGhlbiBjcmVhdGUgCithIG5ldyBmaWxlIDx0dD5zcmMvbG9nNGoucHJvcGVydGllczwvdHQ+LiBUaGF0J3MgdGhlIGRlZmF1bHQgbmFtZSBmb3IgTG9nNEoncyBjb25maWd1cmF0aW9uIGFuZCB1c2luZyB0aGF0IG5hbWUgd291bGQgbWFrZSAKK2xpZmUgZWFzaWVyIC0gbm90IG9ubHkgdGhlIGZyYW1ld29yayBrbm93cyB3aGF0IGlzIGluc2lkZSwgeW91IHRvbyE8L3A+CisKKzxwcmUgY2xhc3M9ImNvZGUiPgorbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgPGI+c3Rkb3V0PC9iPgorCitsb2c0ai5hcHBlbmRlci48Yj5zdGRvdXQ8L2I+PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCisKK2xvZzRqLmFwcGVuZGVyLjxiPnN0ZG91dDwvYj4ubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuPGI+c3Rkb3V0PC9iPi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49PGZvbnQgY29sb3I9ImJsdWUiPjxiPiVtJW48L2I+PC9mb250PgorPC9wcmU+CisKKzxwPlRoaXMgY29uZmlndXJhdGlvbiBjcmVhdGVzIGFuIG91dHB1dCBjaGFubmVsICgiQXBwZW5kZXIiKSB0byBjb25zb2xlIG5hbWVkIGFzIDx0dD5zdGRvdXQ8L3R0PiB3aGljaCBwcmludHMgdGhlCittZXNzYWdlICglbSkgZm9sbG93ZWQgYnkgYSBsaW5lIGZlZWQgKCVuKSAtIHNhbWUgYXMgdGhlIGVhcmxpZXIgU3lzdGVtLm91dC5wcmludGxuKCkgOi0pIE9vb2gga2F5IC0gYnV0IHdlIGhhdmVuJ3QKK2ZpbmlzaGVkIHlldC4gV2Ugc2hvdWxkIGRlbGl2ZXIgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwgdG9vLiBTbyB3ZSBjaGFuZ2UgdGhlIGJ1aWxkZmlsZTo8L3A+CisKKzxwcmUgY2xhc3M9ImNvZGUiPgorICAgIC4uLgorICAgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSImZ3Q7CisgICAgICAgICZsdDtta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CisgICAgICAgICZsdDtqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvJmd0OworICAgICAgICA8Yj4mbHQ7Y29weSB0b2Rpcj0iJHtjbGFzc2VzLmRpcn0iJmd0OzwvYj4KKyAgICAgICAgICAgIDxiPiZsdDtmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgZXhjbHVkZXM9IioqLyouamF2YSIvJmd0OzwvYj4KKyAgICAgICAgPGI+Jmx0Oy9jb3B5Jmd0OzwvYj4KKyAgICAmbHQ7L3RhcmdldCZndDsKKyAgICAuLi4KKzwvcHJlPgorCis8cD5UaGlzIGNvcGllcyBhbGwgcmVzb3VyY2VzIChhcyBsb25nIGFzIHRoZXkgaGF2ZW4ndCB0aGUgc3VmZml4ICIuamF2YSIpIHRvIHRoZSBidWlsZCBkaXJlY3RvcnksIHNvIHdlIGNvdWxkCitzdGFydCB0aGUgYXBwbGljYXRpb24gZnJvbSB0aGF0IGRpcmVjdG9yeSBhbmQgdGhlc2UgZmlsZXMgd2lsbCBpbmNsdWRlZCBpbnRvIHRoZSBqYXIuPC9wPgorCisKKzxhIG5hbWU9Imp1bml0Ij4KKzxoMj5UZXN0aW5nIHRoZSBjbGFzczwvaDI+Cis8cD5JbiB0aGlzIHN0ZXAgd2Ugd2lsbCBpbnRyb2R1Y2UgdGhlIHVzYWdlIG9mIHRoZSBKVW5pdCBbM10gdGVzdGZyYW1ld29yayBpbiBjb21iaW5hdGlvbiB3aXRoIEFudC4gQmVjYXVzZSBBbnQKK2hhcyBhIGJ1aWx0LWluIEpVbml0IDMuOC4yIHlvdSBjb3VsZCBzdGFydCBkaXJlY3RseSB1c2luZyBpdC4gV3JpdGUgYSB0ZXN0IGNsYXNzIGluIDx0dD5zcmNcSGVsbG9Xb3JsZFRlc3QuamF2YTwvdHQ+OiA8L3A+CisKKzxwcmUgY2xhc3M9ImNvZGUiPgorcHVibGljIGNsYXNzIEhlbGxvV29ybGRUZXN0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RoaW5nKCkgeworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lsbEFsd2F5c0ZhaWwoKSB7CisgICAgICAgIGZhaWwoIkFuIGVycm9yIG1lc3NhZ2UiKTsKKyAgICB9CisgICAgCit9PC9wcmU+CisKKzxwPkJlY2F1c2Ugd2UgZG9udCBoYXZlIHJlYWwgYnVzaW5lc3MgbG9naWMgdG8gdGVzdCwgdGhpcyB0ZXN0IGNsYXNzIGlzIHZlcnkgc21hbGw6IGp1c3Qgc2hvdyBob3cgdG8gc3RhcnQuIEZvciAKK2Z1cnRoZXIgaW5mb3JtYXRpb24gc2VlIHRoZSBKVW5pdCBkb2N1bWVudGF0aW9uIFszXSBhbmQgdGhlIG1hbnVhbCBvZiA8YSBocmVmPSJPcHRpb25hbFRhc2tzL2p1bml0Lmh0bWwiPmp1bml0PC9hPiB0YXNrLgorTm93IHdlIGFkZCBhIGp1bml0IGluc3RydWN0aW9uIHRvIG91ciBidWlsZGZpbGU6PC9wPgorCis8cHJlIGNsYXNzPSJjb2RlIj4KKyAgICAuLi4KKworICAgICZsdDt0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJqYXIiJmd0OworICAgICAgICAmbHQ7amF2YSBmb3JrPSJ0cnVlIiBjbGFzc25hbWU9IiR7bWFpbi1jbGFzc30iJmd0OworICAgICAgICAgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cGF0aCByZWZpZD0iY2xhc3NwYXRoIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3BhdGggPGI+aWQ9ImFwcGxpY2F0aW9uIjwvYj4gbG9jYXRpb249IiR7amFyLmRpcn0vJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLyZndDsKKyAgICAgICAgICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAgICAgICAmbHQ7L2phdmEmZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisgICAgCisgICAgPGI+Jmx0O3RhcmdldCBuYW1lPSJqdW5pdCIgZGVwZW5kcz0iamFyIiZndDsKKyAgICAgICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ieWVzIiZndDsKKyAgICAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3BhdGggcmVmaWQ9ImNsYXNzcGF0aCIvJmd0OworICAgICAgICAgICAgICAgICZsdDtwYXRoIHJlZmlkPSJhcHBsaWNhdGlvbiIvJmd0OworICAgICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICZsdDtiYXRjaHRlc3QgZm9yaz0ieWVzIiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqVGVzdC5qYXZhIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2JhdGNodGVzdCZndDsKKyAgICAgICAgJmx0Oy9qdW5pdCZndDsKKyAgICAmbHQ7L3RhcmdldCZndDs8L2I+CisKKyAgICAuLi4KKworPC9wcmU+CisKKzxwPldlIHJldXNlIHRoZSBwYXRoIHRvIG91ciBvd24gamFyIGZpbGUgYXMgZGVmaW5lZCBpbiBydW4tdGFyZ2V0IGJ5IGdpdmluZyBpdCBhbiBJRC4KK1RoZSA8dHQ+cHJpbnRzdW1tYXJ5PXllczwvdHQ+IGxldHMgdXMgc2VlIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gdGhhbiBqdXN0IGEgIkZBSUxFRCIgb3IgIlBBU1NFRCIgbWVzc2FnZS4KK0hvdyBtdWNoIHRlc3RzIGZhaWxlZD8gU29tZSBlcnJvcnM/IFByaW50c3VtbWFyeSBsZXRzIHVzIGtub3cuIFRoZSBjbGFzc3BhdGggaXMgc2V0IHVwIHRvIGZpbmQgb3VyIGNsYXNzZXMuCitUbyBydW4gdGVzdHMgdGhlIDx0dD5iYXRjaHRlc3Q8L3R0PiBoZXJlIGlzIHVzZWQsIHNvIHlvdSBjb3VsZCBlYXNpbHkgYWRkIG1vcmUgdGVzdCBjbGFzc2VzIGluIHRoZSBmdXR1cmUganVzdAorYnkgbmFtaW5nIHRoZW0gPHR0PipUZXN0LmphdmE8L3R0Pi4gVGhpcyBpcyBhIGNvbW1vbiBuYW1pbmcgc2NoZW1lLjwvcD4KKworPHA+QWZ0ZXIgYSA8dHQgY2xhc3M9ImNvZGUiPmFudCBqdW5pdDwvdHQ+IHlvdSdsbCBnZXQ6PC9wPgorCis8cHJlIGNsYXNzPSJvdXRwdXQiPgorLi4uCitqdW5pdDoKKyAgICBbanVuaXRdIFJ1bm5pbmcgSGVsbG9Xb3JsZFRlc3QKKyAgICBbanVuaXRdIFRlc3RzIHJ1bjogMiwgRmFpbHVyZXM6IDEsIEVycm9yczogMCwgVGltZSBlbGFwc2VkOiAwLDAxIHNlYworICAgIFtqdW5pdF0gVGVzdCBIZWxsb1dvcmxkVGVzdCBGQUlMRUQKKworQlVJTEQgU1VDQ0VTU0ZVTAorLi4uCis8L3ByZT4KKworPHA+V2UgY2FuIGFsc28gcHJvZHVjZSBhIHJlcG9ydC4gU29tZXRoaW5nIHRoYXQgeW91IChhbmQgb3RoZXIpIGNvdWxkIHJlYWQgYWZ0ZXIgY2xvc2luZyB0aGUgc2hlbGwgLi4uLiAKK1RoZXJlIGFyZSB0d28gc3RlcHM6IDEuIGxldCAmbHQ7anVuaXQmZ3Q7IGxvZyB0aGUgaW5mb3JtYXRpb24gYW5kIDIuIGNvbnZlcnQgdGhlc2UgdG8gc29tZXRoaW5nIHJlYWRhYmxlIChicm93c2FibGUpLjxwPgorCis8cHJlIGNsYXNzPSJjb2RlIj4KKyAgICAuLi4KKyAgICA8Yj4mbHQ7cHJvcGVydHkgbmFtZT0icmVwb3J0LmRpciIgIHZhbHVlPSIke2J1aWxkLmRpcn0vanVuaXRyZXBvcnQiLyZndDs8L2I+CisgICAgLi4uCisgICAgJmx0O3RhcmdldCBuYW1lPSJqdW5pdCIgZGVwZW5kcz0iamFyIiZndDsKKyAgICAgICAgPGI+Jmx0O21rZGlyIGRpcj0iJHtyZXBvcnQuZGlyfSIvJmd0OzwvYj4KKyAgICAgICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ieWVzIiZndDsKKyAgICAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3BhdGggcmVmaWQ9ImNsYXNzcGF0aCIvJmd0OworICAgICAgICAgICAgICAgICZsdDtwYXRoIHJlZmlkPSJhcHBsaWNhdGlvbiIvJmd0OworICAgICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxiPiZsdDtmb3JtYXR0ZXIgdHlwZT0ieG1sIi8mZ3Q7PC9iPgorICAgICAgICAgICAgCisgICAgICAgICAgICAmbHQ7YmF0Y2h0ZXN0IGZvcms9InllcyIgPGI+dG9kaXI9IiR7cmVwb3J0LmRpcn0iPC9iPiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqVGVzdC5qYXZhIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2JhdGNodGVzdCZndDsKKyAgICAgICAgJmx0Oy9qdW5pdCZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKyAgICAKKyAgICA8Yj4mbHQ7dGFyZ2V0IG5hbWU9Imp1bml0cmVwb3J0IiZndDsKKyAgICAgICAgJmx0O2p1bml0cmVwb3J0IHRvZGlyPSIke3JlcG9ydC5kaXJ9IiZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtyZXBvcnQuZGlyfSIgaW5jbHVkZXM9IlRFU1QtKi54bWwiLyZndDsKKyAgICAgICAgICAgICZsdDtyZXBvcnQgdG9kaXI9IiR7cmVwb3J0LmRpcn0iLyZndDsKKyAgICAgICAgJmx0Oy9qdW5pdHJlcG9ydCZndDsKKyAgICAmbHQ7L3RhcmdldCZndDs8L2I+Cis8L3ByZT4KKworPHA+QmVjYXVzZSB3ZSB3b3VsZCBwcm9kdWNlIGEgbG90IG9mIGZpbGVzIGFuZCB0aGVzZSBmaWxlcyB3b3VsZCBiZSB3cml0dGVuIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBieSBkZWZhdWx0LAord2UgZGVmaW5lIGEgcmVwb3J0IGRpcmVjdG9yeSwgY3JlYXRlIGl0IGJlZm9yZSBydW5uaW5nIHRoZSA8dHQ+anVuaXQ8L3R0PiBhbmQgcmVkaXJlY3QgdGhlIGxvZ2dpbmcgdG8gaXQuIFRoZSBsb2cgZm9ybWF0CitpcyBYTUwgc28gPHR0Pmp1bml0cmVwb3J0PC90dD4gY291bGQgcGFyc2UgaXQuIEluIGEgc2Vjb25kIHRhcmdldCA8dHQ+anVuaXRyZXBvcnQ8L3R0PiBzaG91bGQgY3JlYXRlIGEgYnJvd3NhYmxlIAorSFRNTC1yZXBvcnQgZm9yIGFsbCBnZW5lcmF0ZWQgeG1sLWxvZyBmaWxlcyBpbiB0aGUgcmVwb3J0IGRpcmVjdG9yeS4gTm93IHlvdSBjYW4gb3BlbiB0aGUgJHtyZXBvcnQuZGlyfVxpbmRleC5odG1sIGFuZAorc2VlIHRoZSByZXN1bHQgKGxvb2tzIHNvbWV0aGluZyBsaWtlIEphdmFEb2MpLjxicj4KK1BlcnNvbmFsbHkgSSB1c2UgdHdvIGRpZmZlcmVudCB0YXJnZXRzIGZvciBqdW5pdCBhbmQganVuaXRyZXBvcnQuIEdlbmVyYXRpbmcgdGhlIEhUTUwgcmVwb3J0IG5lZWRzIHNvbWUgdGltZSBhbmQgeW91IGRvbnQKK25lZWQgdGhlIEhUTUwgcmVwb3J0IGp1c3QgZm9yIHRlc3RpbmcsIGUuZy4gaWYgeW91IGFyZSBmaXhpbmcgYW4gZXJyb3Igb3IgYSBpbnRlZ3JhdGlvbiBzZXJ2ZXIgaXMgZG9pbmcgYSBqb2IuCis8L3A+CisKKworCisKKzxhIG5hbWU9InJlc291cmNlcyI+PC9hPgorPGgyPlJlc291cmNlczwvaDI+Cis8cHJlPgorICAgIFsxXSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9sb2dnaW5nL2xvZzRqLzEuMi4xMy9sb2dnaW5nLWxvZzRqLTEuMi4xMy56aXAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2xvZ2dpbmcvbG9nNGovMS4yLjEzL2xvZ2dpbmctbG9nNGotMS4yLjEzLnppcDwvYT4KKyAgICBbMl0gPGEgaHJlZj0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9sb2c0ai9kb2NzL21hbnVhbC5odG1sIj5odHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqL2RvY3MvbWFudWFsLmh0bWw8L2E+CisgICAgWzNdIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnL2luZGV4Lmh0bSI+aHR0cDovL3d3dy5qdW5pdC5vcmcvaW5kZXguaHRtPC9hPgorPC9wcmU+CisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFsLXRhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFsLXRhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhkZDZiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvdHV0b3JpYWwtdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy5odG1sCkBAIC0wLDAgKzEsOTc5IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorICA8dGl0bGU+VHV0b3JpYWw6IFRhc2tzIHVzaW5nIFByb3BlcnRpZXMsIEZpbGVzZXRzICZhbXA7IFBhdGhzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPlR1dG9yaWFsOiBUYXNrcyB1c2luZyBQcm9wZXJ0aWVzLCBGaWxlc2V0cyAmYW1wOyBQYXRoczwvaDE+CisKKzxwPkFmdGVyIHJlYWRpbmcgdGhlIHR1dG9yaWFsIGFib3V0IDxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbCI+d3JpdGluZwordGFza3MgWzFdPC9hPiB0aGlzIHR1dG9yaWFsIGV4cGxhaW5zIGhvdyB0byBnZXQgYW5kIHNldCBwcm9wZXJ0aWVzIGFuZCBob3cgdG8gdXNlCituZXN0ZWQgZmlsZXNldHMgYW5kIHBhdGhzLiBGaW5hbGx5IGl0IGV4cGxhaW5zIGhvdyB0byBjb250cmlidXRlIHRhc2tzIHRvIEFudC48L3A+CisKKzxoMj5Db250ZW50PC9oMj4KKzxwPjx1bD4KKzxsaT48YSBocmVmPSIjZ29hbCI+VGhlIGdvYWw8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjYnVpbGRlbnZpcm9ubWVudCI+QnVpbGQgZW52aXJvbm1lbnQ8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjcHJvcGVydHlhY2Nlc3MiPlByb3BlcnR5IGFjY2VzczwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNmaWxlc2V0cyI+VXNpbmcgZmlsZXNldHM8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjcGF0aCI+VXNpbmcgbmVzdGVkIHBhdGhzPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI3JldHVybmluZy1saXN0Ij5SZXR1cm5pbmcgYSBsaXN0PC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI2RvY3VtZW50YXRpb24iPkRvY3VtZW50YXRpb248L2E+PC9saT4KKzxsaT48YSBocmVmPSIjY29udHJpYnV0ZSI+Q29udHJpYnV0ZSB0aGUgbmV3IHRhc2s8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjcmVzb3VyY2VzIj5SZXNvdXJjZXM8L2E+PC9saT4KKzwvdWw+PC9wPgorCisKKzxoMj48YSBuYW1lPSJnb2FsIj5UaGUgZ29hbDwvYT48L2gyPgorPHA+VGhlIGdvYWwgaXMgdG8gd3JpdGUgYSB0YXNrLCB3aGljaCBzZWFyY2hzIGluIGEgcGF0aCBmb3IgYSBmaWxlIGFuZCBzYXZlcyB0aGUKK2xvY2F0aW9uIG9mIHRoYXQgZmlsZSBpbiBhIHByb3BlcnR5LjwvcD4KKworCis8aDI+PGEgbmFtZT0iYnVpbGRlbnZpcm9ubWVudCI+QnVpbGQgZW52aXJvbm1lbnQ8L2E+PC9oMj4KKzxwPldlIGNhbiB1c2UgdGhlIGJ1aWxkZmlsZSBmcm9tIHRoZSBvdGhlciB0dXRvcmlhbCBhbmQgbW9kaWZ5IGl0IGEgbGl0dGxlIGJpdC4KK1RoYXQncyB0aGUgYWR2YW50YWdlIG9mIHVzaW5nIHByb3BlcnRpZXMgLSB3ZSBjYW4gcmV1c2UgbmVhcmx5IHRoZSB3aG9sZSBzY3JpcHQuIDotKTwvcD4KKzxwcmUgY2xhc3M9ImNvZGUiPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Jmd0OworJmx0O3Byb2plY3QgbmFtZT0iPGI+RmluZFRhc2s8L2I+IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0IiZndDsKKyAgICAuLi4KKyAgICAmbHQ7dGFyZ2V0IG5hbWU9InVzZS5pbml0IiBkZXNjcmlwdGlvbj0iVGFza2RlZidzIHRoZSA8Yj5GaW5kPC9iPi1UYXNrIiBkZXBlbmRzPSJqYXIiJmd0OworICAgICAgICAmbHQ7dGFza2RlZiBuYW1lPSI8Yj5maW5kPC9iPiIgY2xhc3NuYW1lPSI8Yj5GaW5kPC9iPiIgY2xhc3NwYXRoPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIvJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCisgICAgPGI+Jmx0OyEtLSB0aGUgb3RoZXIgdXNlLiogdGFyZ2V0cyBhcmUgZGVsZXRlZCAtLSZndDs8L2I+CisgICAgLi4uCismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT4KKworPHA+VGhlIGJ1aWxkZmlsZSBpcyBpbiB0aGUgYXJjaGl2ZSA8YSBocmVmPSJ0dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLnppcCI+Cit0dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLnppcCBbMl08L2E+IGluIDx0dD4vYnVpbGQueG1sLjAxLXByb3BlcnR5YWNjZXNzPC90dD4KKyhmdXR1cmUgdmVyc2lvbiBzYXZlZCBhcyAqLjAyLi4uLCBmaW5hbCB2ZXJzaW9uIGFzIGJ1aWxkLnhtbDsgc2FtZSBmb3Igc291cmNlcykuPC9wPgorCisKKzxoMj48YSBuYW1lPSJwcm9wZXJ0eWFjY2VzcyI+UHJvcGVydHkgYWNjZXNzPC9hPjwvaDI+Cis8cD5PdXIgZmlyc3Qgc3RlcCBpcyB0byBzZXQgYSBwcm9wZXJ0eSB0byBhIHZhbHVlIGFuZCBwcmludCB0aGUgdmFsdWUgb2YgdGhhdCBwcm9wZXJ0eS4KK1NvIG91ciBzY2VuYXJpbyB3b3VsZCBiZQorPHByZSBjbGFzcz0iY29kZSI+CisgICAgJmx0O2ZpbmQgcHJvcGVydHk9InRlc3QiIHZhbHVlPSJ0ZXN0LXZhbHVlIi8mZ3Q7CisgICAgJmx0O2ZpbmQgcHJpbnQ9InRlc3QiLyZndDsKKzwvcHJlPgorb2ssIGNhbiBiZSByZXdyaXR0ZW4gd2l0aCB0aGUgY29yZSB0YXNrcworPHByZSBjbGFzcz0iY29kZSI+CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9InRlc3QiIHZhbHVlPSJ0ZXN0LXZhbHVlIi8mZ3Q7CisgICAgJmx0O2VjaG8gbWVzc2FnZT0iJHt0ZXN0fSIvJmd0OworPC9wcmU+CitidXQgSSBoYXZlIHRvIHN0YXJ0IG9uIGtub3duIGdyb3VuZCA6LSk8L3A+Cis8cD5TbyB3aGF0IHRvIGRvPyBIYW5kbGluZyB0aHJlZSBhdHRyaWJ1dGVzIChwcm9wZXJ0eSwgdmFsdWUsIHByaW50KSBhbmQgYW4gZXhlY3V0ZSBtZXRob2QuCitCZWNhdXNlIHRoaXMgaXMgb25seSBhbiBpbnRyb2R1Y3Rpb24gZXhhbXBsZSBJIGRvbid0IGRvIG11Y2ggY2hlY2tpbmc6CisKKzxwcmUgY2xhc3M9ImNvZGUiPgoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgRmluZCBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJpbnQ7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIC8vIHNldHRlciBmb3IgdmFsdWUgYW5kIHByaW50CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBpZiAocHJpbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSA9IDxiPmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShwcmludCk8L2I+OworICAgICAgICAgICAgbG9nKHByb3BWYWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwcm9wZXJ0eSBub3Qgc2V0Iik7CisgICAgICAgICAgICBpZiAodmFsdWUgICAgPT0gbnVsbCkgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ2YWx1ZSBub3Qgc2V0Iik7CisgICAgICAgICAgICA8Yj5nZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTwvYj47CisgICAgICAgIH0KKyAgICB9Cit9Cis8L3ByZT4KKworQXMgc2FpZCBpbiB0aGUgb3RoZXIgdHV0b3JpYWwsIHRoZSBwcm9wZXJ0eSBhY2Nlc3MgaXMgZG9uZSB2aWEgUHJvamVjdCBpbnN0YW5jZS4KK1dlIGdldCB0aGlzIGluc3RhbmNlIHZpYSB0aGUgcHVibGljIDx0dD5nZXRQcm9qZWN0KCk8L3R0PiBtZXRob2Qgd2hpY2ggd2UgaW5oZXJpdCBmcm9tCis8dHQ+VGFzazwvdHQ+IChtb3JlIHByZWNpc2UgZnJvbSBQcm9qZWN0Q29tcG9uZW50KS4gUmVhZGluZyBhIHByb3BlcnR5IGlzIGRvbmUgdmlhCis8dHQ+Z2V0UHJvcGVydHkoPGk+cHJvcGVydHluYW1lPC9pPik8L3R0PiAodmVyeSBzaW1wbGUsIGlzbid0IGl0PykuIFRoaXMgcHJvcGVydHkgcmV0dXJucwordGhlIHZhbHVlIGFzIFN0cmluZyBvciA8aT5udWxsPC9pPiBpZiBub3Qgc2V0Ljxicj4KK1NldHRpbmcgYSBwcm9wZXJ0eSBpcyAuLi4gbm90IHJlYWxseSBkaWZmaWN1bHQsIGJ1dCB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHNldHRlci4gWW91IGNhbgordXNlIHRoZSA8dHQ+c2V0UHJvcGVydHkoKTwvdHQ+IG1ldGhvZCB3aGljaCB3aWxsIGRvIHRoZSBqb2IgbGlrZSBleHBlY3RlZC4gQnV0IHRoZXJlIGlzCithIGdvbGRlbiBydWxlIGluIEFudDogPGk+cHJvcGVydGllcyBhcmUgaW1tdXRhYmxlPC9pPi4gQW5kIHRoaXMgbWV0aG9kIHNldHMgdGhlIHByb3BlcnR5Cit0byB0aGUgc3BlY2lmaWVkIHZhbHVlIC0gd2hldGhlciBpdCBoYXMgYSB2YWx1ZSBiZWZvcmUgdGhhdCBvciBub3QuIFNvIHdlIHVzZSBhbm90aGVyCit3YXkuIDx0dD5zZXROZXdQcm9wZXJ0eSgpPC90dD4gc2V0cyB0aGUgcHJvcGVydHkgb25seSBpZiB0aGVyZSBpcyBubyBwcm9wZXJ0eSB3aXRoIHRoYXQKK25hbWUuIE90aGVyd2lzZSBhIG1lc3NhZ2UgaXMgbG9nZ2VkLjwvcD4KKworPHA+PGk+KGJ5IHRoZSB3YXk6IGEgc2hvcnQgd29yZCB0byBhbnRzICJuYW1lc3BhY2VzIiAoZG9uJ3QKK2JlIGNvbmZ1c2VkIHdpdGggeG1sIG5hbWVzcGFjZXM6CithbiA8Y29kZT4mbHQ7YW50Y2FsbCZndDs8L2NvZGU+IGNyZWF0ZXMgYSBuZXcgc3BhY2UgZm9yIHByb3BlcnR5IG5hbWVzLiBBbGwgcHJvcGVydGllcyBmcm9tIHRoZSBjYWxsZXIKK2FyZSBwYXNzZWQgdG8gdGhlIGNhbGxlZSwgYnV0IHRoZSBjYWxsZWUgY2FuIHNldCBpdHMgb3duIHByb3BlcnRpZXMgd2l0aG91dCBub3RpY2UgYnkgdGhlCitjYWxsZXIuKTwvaT48L3A+CisKKzxwPlRoZXJlIGFyZSBzb21lIG90aGVyIHNldHRlciwgdG9vIChidXQgSSBoYXZlbid0IHVzZWQgdGhlbSwgc28gSSBjYW4ndCBzYXkgc29tZXRoaW5nCit0byB0aGVtLCBzb3JyeSA6LSk8L3A+CisKKzxwPkFmdGVyIHB1dHRpbmcgb3VyIHR3byBsaW5lIGV4YW1wbGUgZnJvbSBhYm92ZSBpbnRvIGEgdGFyZ2V0IG5hbWVzIDx0dD51c2Uuc2ltcGxlPC90dD4KK3dlIGNhbiBjYWxsIHRoYXQgZnJvbSBvdXIgdGVzdGNhc2U6CisKKzxwcmUgY2xhc3M9ImNvZGUiPgoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBGaW5kVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIEZpbmRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJidWlsZC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgeworICAgICAgICA8Yj5leHBlY3RMb2coInVzZS5zaW1wbGUiLCAidGVzdC12YWx1ZSIpOzwvYj4KKyAgICB9Cit9Cis8L3ByZT4KKworYW5kIGFsbCB3b3JrcyBmaW5lLjwvcD4KKworCisKKzxoMj48YSBuYW1lPSJmaWxlc2V0cyI+VXNpbmcgZmlsZXNldHM8L2E+PC9oMj4KKzxwPkFudCBwcm92aWRlcyBhIGNvbW1vbiB3YXkgb2YgYnVuZGxpbmcgZmlsZXM6IHRoZSBmaWxlc2V0LiBCZWNhdXNlIHlvdSBhcmUgcmVhZGluZwordGhpcyB0dXRvcmlhbCBJIHRoaW5rIHlvdSBrbm93IHRoZW0gYW5kIEkgZG9uJ3QgaGF2ZSB0byBzcGVuZCBtb3JlIGV4cGxhbmF0aW9ucyBhYm91dAordGhlaXIgdXNhZ2UgaW4gYnVpbGRmaWxlcy4gT3VyIGdvYWwgaXMgdG8gc2VhcmNoIGEgZmlsZSBpbiBwYXRoLiBBbmQgb24gdGhpcyBzdGVwIHRoZQorcGF0aCBpcyBzaW1wbHkgYSBmaWxlc2V0IChvciBtb3JlIHByZWNpc2U6IGEgY29sbGVjdGlvbiBvZiBmaWxlc2V0cykuIFNvIG91ciB1c2FnZQord291bGQgYmUKKzxwcmUgY2xhc3M9ImNvZGUiPgorICAgICZsdDtmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2NhdGlvbi5hbnQtamFyIiZndDsKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2FudC5ob21lfSIgaW5jbHVkZXM9IioqLyouamFyIi8mZ3Q7CisgICAgJmx0Oy9maW5kJmd0OworPC9wcmU+Cis8L3A+CisKKzxwPldoYXQgZG8gd2UgbmVlZD8gQSB0YXNrIHdpdGggdHdvIGF0dHJpYnV0ZXMgKGZpbGUsIGxvY2F0aW9uKSBhbmQgbmVzdGVkCitmaWxlc2V0cy4gQmVjYXVzZSB3ZSBoYWQgYXR0cmlidXRlIGhhbmRsaW5nIGFscmVhZHkgZXhwbGFpbmVkIGluIHRoZSBleGFtcGxlIGFib3ZlIGFuZCB0aGUKK2hhbmRsaW5nIG9mIG5lc3RlZCBlbGVtZW50cyBpcyBkZXNjcmliZWQgaW4gdGhlIG90aGVyIHR1dG9yaWFsIHRoZSBjb2RlIHNob3VsZCBiZSB2ZXJ5IGVhc3k6Cis8cHJlIGNsYXNzPSJjb2RlIj4KK3B1YmxpYyBjbGFzcyBGaW5kIGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlOworICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOworICAgIHByaXZhdGUgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOworCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgeworICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IGZpbGVzZXQpIHsKKyAgICAgICAgZmlsZXNldHMuYWRkKGZpbGVzZXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgfQorfQorPC9wcmU+CitPayAtIHRoYXQgdGFzayB3b3VsZG4ndCBkbyB2ZXJ5IG11Y2gsIGJ1dCB3ZSBjYW4gdXNlIGl0IGluIHRoZSBkZXNjcmliZWQgbWFubmVyIHdpdGhvdXQKK2ZhaWx1cmUuIE9uIG5leHQgc3RlcCB3ZSBoYXZlIHRvIGltcGxlbWVudCB0aGUgZXhlY3V0ZSBtZXRob2QuIEFuZCBiZWZvcmUgdGhhdCB3ZSB3aWxsCitpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHRlc3RjYXNlcyAoVEREIC0gdGVzdCBkcml2ZW4gZGV2ZWxvcG1lbnQpLjwvcD4KKworPHA+SW4gdGhlIG90aGVyIHR1dG9yaWFsIHdlIGhhdmUgcmV1c2VkIHRoZSBhbHJlYWR5IHdyaXR0ZW4gdGFyZ2V0cyBvZiBvdXIgYnVpbGRmaWxlLgorTm93IHdlIHdpbGwgY29uZmlndXJlIG1vc3Qgb2YgdGhlIHRlc3RjYXNlcyB2aWEgamF2YSBjb2RlIChzb21ldGltZXMgaXQncyBtdWNoIGVhc2llcgordG8gd3JpdGUgYSB0YXJnZXQgdGhhbiBkb2luZyBpdCB2aWEgamF2YSBjb2RpbmcpLiBXaGF0IGNhbiBiZSB0ZXN0ZWQ/PHVsPgorPGxpPm5vdCB2YWxpZCBjb25maWd1cmVkIHRhc2sgKG1pc3NpbmcgZmlsZSwgbWlzc2luZyBsb2NhdGlvbiwgbWlzc2luZyBmaWxlc2V0KTwvbGk+Cis8bGk+ZG9uJ3QgZmluZCBhIHByZXNlbnQgZmlsZTwvbGk+Cis8bGk+YmVoYXZpb3VyIGlmIGZpbGUgY2FuJ3QgYmUgZm91bmQ8L2xpPgorPC91bD4KK01heWJlIHlvdSBmaW5kIHNvbWUgbW9yZSB0ZXN0Y2FzZXMuIEJ1dCB0aGlzIGlzIGVub3VnaCBmb3Igbm93Ljxicj4KK0ZvciBlYWNoIG9mIHRoZXNlIHBvaW50cyB3ZSBjcmVhdGUgYSA8dHQ+dGVzdFhYPC90dD4gbWV0aG9kLjwvcD4KKworPHByZSBjbGFzcz0iY29kZSI+CitwdWJsaWMgY2xhc3MgRmluZFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC4uLiAvLyBjb25zdHJ1Y3Rvciwgc2V0VXAgYXMgYWJvdmUKKworICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRmlsZSgpIHsKKyAgICAgICAgPGI+RmluZCBmaW5kID0gbmV3IEZpbmQoKTs8L2I+CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICA8Yj5maW5kLmV4ZWN1dGUoKTs8L2I+CisgICAgICAgICAgICBmYWlsKCJObyAnbm8tZmlsZSctZXhjZXB0aW9uIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBleHBlY3RlZAorICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gImZpbGUgbm90IHNldCI7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGV4Y2VwdGlvbiBtZXNzYWdlLiIsIGV4cGVjdGVkLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0xvY2F0aW9uKCkgeworICAgICAgICBGaW5kIGZpbmQgPSBuZXcgRmluZCgpOworICAgICAgICA8Yj5maW5kLnNldEZpbGUoImFudC5qYXIiKTs8L2I+CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5kLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGZhaWwoIk5vICduby1sb2NhdGlvbictZXhjZXB0aW9uIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC4uLiAvLyBzaW1pbGFyIHRvIHRlc3RNaXNzaW5nRmlsZSgpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0ZpbGVzZXQoKSB7CisgICAgICAgIEZpbmQgZmluZCA9IG5ldyBGaW5kKCk7CisgICAgICAgIGZpbmQuc2V0RmlsZSgiYW50LmphciIpOworICAgICAgICBmaW5kLnNldExvY2F0aW9uKCJsb2NhdGlvbi5hbnQtamFyIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5kLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGZhaWwoIk5vICduby1maWxlc2V0Jy1leGNlcHRpb24gdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLi4uIC8vIHNpbWlsYXIgdG8gdGVzdE1pc3NpbmdGaWxlKCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlTm90UHJlc2VudCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVOb3RQcmVzZW50Iik7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImxvY2F0aW9uLmFudC1qYXIiKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiUHJvcGVydHkgc2V0IHRvIHdyb25nIHZhbHVlLiIsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVQcmVzZW50KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsZVByZXNlbnQiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibG9jYXRpb24uYW50LWphciIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJQcm9wZXJ0eSBub3Qgc2V0LiIsIHJlc3VsdCk7CisgICAgICAgIGFzc2VydFRydWUoIldyb25nIGZpbGUgZm91bmQuIiwgcmVzdWx0LmVuZHNXaXRoKCJhbnQuamFyIikpOworICAgIH0KK30KKzwvcHJlPgorCis8cD5JZiB3ZSBydW4gdGhpcyB0ZXN0IGNsYXNzIGFsbCB0ZXN0IGNhc2VzIChleGNlcHQgPGk+dGVzdEZpbGVOb3RQcmVzZW50PC9pPikgZmFpbC4gTm93IHdlCitjYW4gaW1wbGVtZW50IG91ciB0YXNrLCBzbyB0aGF0IHRoZXNlIHRlc3QgY2FzZXMgd2lsbCBwYXNzLjwvcD4KKworPHByZSBjbGFzcz0iY29kZSI+CisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgIGlmIChmaWxlPT1udWxsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgbm90IHNldCIpOworICAgICAgICBpZiAobG9jYXRpb249PW51bGwpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibG9jYXRpb24gbm90IHNldCIpOworICAgICAgICBpZiAoZmlsZXNldHMuc2l6ZSgpJmx0OzEpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmlsZXNldCBub3Qgc2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgICAgICBTdHJpbmcgZm91bmRMb2NhdGlvbiA9IG51bGw7CisgICAgICAgIGZvcihJdGVyYXRvciBpdEZTZXRzID0gZmlsZXNldHMuaXRlcmF0b3IoKTsgaXRGU2V0cy5oYXNOZXh0KCk7ICkgeyAgICAgIC8vIDIKKyAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldClpdEZTZXRzLm5leHQoKTsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7ICAgICAgICAgLy8gMworICAgICAgICAgICAgU3RyaW5nW10gaW5jbHVkZWRGaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpJmx0O2luY2x1ZGVkRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBpbmNsdWRlZEZpbGVzW2ldLnJlcGxhY2UoJ1xcJywnLycpOyAgICAgICAgICAgLy8gNAorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCIvIikrMSk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kTG9jYXRpb249PW51bGwgJmFtcDsmYW1wOyBmaWxlLmVxdWFscyhmaWxlbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBiYXNlICA9IGRzLmdldEJhc2VkaXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNQorICAgICAgICAgICAgICAgICAgICBGaWxlIGZvdW5kID0gbmV3IEZpbGUoYmFzZSwgaW5jbHVkZWRGaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kTG9jYXRpb24gPSBmb3VuZC5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kTG9jYXRpb24hPW51bGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNgorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KGxvY2F0aW9uLCBmb3VuZExvY2F0aW9uKTsKKyAgICB9Cis8L3ByZT4KKworPHA+T24gPGI+Ly8xPC9iPiB3ZSBjaGVjayB0aGUgcHJlcmVxdWlzaXRlcyBmb3Igb3VyIHRhc2suIERvaW5nIHRoYXQgaW4gYSA8dHQ+dmFsaWRhdGU8L3R0Pi1tZXRob2QKK2lzIGEgY29tbW9uIHdheSwgYmVjYXVzZSB3ZSBzZXBhcmF0ZSB0aGUgcHJlcmVxdWlzaXRlcyBmcm9tIHRoZSByZWFsIHdvcmsuIE9uIDxiPi8vMjwvYj4gd2UgaXRlcmF0ZQorb3ZlciBhbGwgbmVzdGVkIGZpbGVzZXRzLiBJZiB3ZSBkb24ndCB3YW50IHRvIGhhbmRsZSBtdWx0aXBsZSBmaWxlc2V0cywgdGhlIDx0dD5hZGRGaWxlc2V0KCk8L3R0PgorbWV0aG9kIGhhcyB0byByZWplY3QgdGhlIGZ1cnRoZXIgY2FsbHMuIFdlIGNhbiBnZXQgdGhlIHJlc3VsdCBvZiBhIGZpbGVzZXQgdmlhIGl0cyBEaXJlY3RvcnlTY2FubmVyCitsaWtlIGRvbmUgaW4gPGI+Ly8zPC9iPi4gQWZ0ZXIgdGhhdCB3ZSBjcmVhdGUgYSBwbGF0dGZvcm0gaW5kZXBlbmRlbmQgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mCit0aGUgZmlsZSBwYXRoICg8Yj4vLzQ8L2I+LCBjYW4gYmUgZG9uZSBpbiBvdGhlciB3YXlzIG9mIGNvdXJzZSkuIFdlIGhhdmUgdG8gZG8gdGhlIDx0dD5yZXBsYWNlKCk8L3R0PiwKK2JlY2F1c2Ugd2Ugd29yayB3aXRoIGEgc2ltcGxlIHN0cmluZyBjb21wYXJpc29uLiBBbnQgaXRzZWxmIGlzIHBsYXRmb3JtIGluZGVwZW5kYW50IGFuZCBjYW4KK3RoZXJlZm9yZSBydW4gb24gZmlsZXN5c3RlbXMgd2l0aCBzbGFzaCAoLywgZS5nLiBMaW51eCkgb3IgYmFja3NsYXNoIChcLCBlLmcuIFdpbmRvd3MpIGFzCitwYXRoIHNlcGFyYXRvci4gVGhlcmVmb3JlIHdlIGhhdmUgdG8gdW5pZnkgdGhhdC4gSWYgd2UgZm91bmQgb3VyIGZpbGUgd2UgY3JlYXRlIGFuIGFic29sdXRlCitwYXRoIHJlcHJlc2VudGF0aW9uIG9uIDxiPi8vNTwvYj4sIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGF0IGluZm9ybWF0aW9uIHdpdGhvdXQga25vd2luZyB0aGUgYmFzZWRpci4KKyhUaGlzIGlzIHZlcnkgaW1wb3J0YW50IG9uIHVzZSB3aXRoIG11bHRpcGxlIGZpbGVzZXRzLCBiZWNhdXNlIHRoZXkgY2FuIGhhdmUgZGlmZmVyZW50IGJhc2VkaXJzCithbmQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZGlyZWN0b3J5IHNjYW5uZXIgaXMgcmVsYXRpdmUgdG8gaXRzIGJhc2VkaXIuKSBGaW5hbGx5IHdlIHN0b3JlIHRoZQorbG9jYXRpb24gb2YgdGhlIGZpbGUgYXMgcHJvcGVydHksIGlmIHdlIGhhZCBmb3VuZCBvbmUgKDxiPi8vNjwvYj4pLjwvcD4KKworPHA+T2ssIG11Y2ggbW9yZSBlYXNpZXIgaW4gdGhpcyBzaW1wbGUgY2FzZSB3b3VsZCBiZSB0byBhZGQgdGhlIDxpPmZpbGU8L2k+IGFzIGFkZGl0aW9uYWwKKzxpPmluY2x1ZGU8L2k+IGVsZW1lbnQgdG8gYWxsIGZpbGVzZXRzLiBCdXQgSSB3YW50ZWQgdG8gc2hvdyBob3cgdG8gaGFuZGxlIGNvbXBsZXggc2l0dWF0aW9ucword2hpdGhvdXQgYmVpbmcgY29tcGxleCA6LSk8L3A+CisKKzxwPlRoZSB0ZXN0IGNhc2UgdXNlcyB0aGUgYW50IHByb3BlcnR5IDxpPmFudC5ob21lPC9pPiBhcyByZWZlcmVuY2UuIFRoaXMgcHJvcGVydHkgaXMgc2V0IGJ5IHRoZQorPHR0PkxhdW5jaGVyPC90dD4gY2xhc3Mgd2hpY2ggc3RhcnRzIGFudC4gV2UgY2FuIHVzZSB0aGF0IHByb3BlcnR5IGluIG91ciBidWlsZGZpbGVzIGFzIGEKKzxhIGhyZWY9InVzaW5nLmh0bWwjYnVpbHQtaW4tcHJvcHMiPmJ1aWxkLWluIHByb3BlcnR5IFszXTwvYT4uIEJ1dCBpZiB3ZSBjcmVhdGUgYSBuZXcgYW50CitlbnZpcm9ubWVudCB3ZSBoYXZlIHRvIHNldCB0aGF0IHZhbHVlIGZvciBvdXIgb3duLiBBbmQgd2UgdXNlIHRoZSA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB0YXNrIGluIGZvcmstbW9kZS4KK1RoZXJlZm9yZSB3ZSBoYXZlIGRvIG1vZGlmeSBvdXIgYnVpbGRmaWxlOgorPHByZSBjbGFzcz0iY29kZSI+CisgICAgJmx0O3RhcmdldCBuYW1lPSJqdW5pdCIgZGVzY3JpcHRpb249IlJ1bnMgdGhlIHVuaXQgdGVzdHMiIGRlcGVuZHM9ImphciImZ3Q7CisgICAgICAgICZsdDtkZWxldGUgZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSIvJmd0OworICAgICAgICAmbHQ7bWtkaXIgIGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iLyZndDsKKyAgICAgICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyImZ3Q7CisgICAgICAgICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgudGVzdCIvJmd0OworICAgICAgICAgICAgPGI+Jmx0O3N5c3Byb3BlcnR5IGtleT0iYW50LmhvbWUiIHZhbHVlPSIke2FudC5ob21lfSIvJmd0OzwvYj4KKyAgICAgICAgICAgICZsdDtmb3JtYXR0ZXIgdHlwZT0ieG1sIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7YmF0Y2h0ZXN0IGZvcms9InllcyIgdG9kaXI9IiR7anVuaXQub3V0LmRpci54bWx9IiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qVGVzdC5qYXZhIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2JhdGNodGVzdCZndDsKKyAgICAgICAgJmx0Oy9qdW5pdCZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKzwvcHJlPgorCisKKzxoMj48YSBuYW1lPSJwYXRoIj5Vc2luZyBuZXN0ZWQgcGF0aHM8L2E+PC9oMj4KKzxwPkEgdGFzayBwcm92aWRpbmcgc3VwcG9ydCBmb3IgZmlsZXNldHMgaXMgYSB2ZXJ5IGNvbWZvcnRhYmxlIG9uZS4gQnV0IHRoZXJlIGlzIGFub3RoZXIKK3Bvc3NpYmlsaXR5IG9mIGJ1bmRsaW5nIGZpbGVzOiB0aGUgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPi4gRmlsZXNldCBhcmUgZWFzeSBpZiB0aGUgZmlsZXMgYXJlIGFsbCB1bmRlcgorYSBjb21tb24gYmFzZSBkaXJlY3RvcnkuIEJ1dCBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB5b3UgaGF2ZSBhIHByb2JsZW0uIEFub3RoZXIgZGlzYWR2YW50YWdlCitpcyBpdHMgc3BlZWQ6IGlmIHlvdSBoYXZlIG9ubHkgYSBmZXcgZmlsZXMgaW4gYSBodWdlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIHdoeSBub3QgdXNlIGEKKzxjb2RlPiZsdDtmaWxlbGlzdCZndDs8L2NvZGU+IGluc3RlYWQ/IDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT5zIGNvbWJpbmVzIHRoZXNlIGRhdGF0eXBlcyBpbiB0aGF0IHdheSB0aGF0IGEgcGF0aCBjb250YWlucworb3RoZXIgcGF0aHMsIGZpbGVzZXRzLCBkaXJzZXRzIGFuZCBmaWxlbGlzdHMuIFRoaXMgaXMgd2h5IDxhIGhyZWY9Imh0dHA6Ly9hbnQtY29udHJpYi5zb3VyY2Vmb3JnZS5uZXQvIj4KK0FudC1Db250cmlicyBbNF08L2E+IDxjb2RlPiZsdDtmb3JlYWNoJmd0OzwvY29kZT4gdGFzayBpcyBtb2RpZmllZCB0byBzdXBwb3J0IHBhdGhzIGluc3RlYWQgb2YgZmlsZXNldHMuIFNvIHdlIHdhbnQgdGhhdCwKK3Rvby48L3A+CisKKzxwPkNoYW5naW5nIGZyb20gZmlsZXNldCB0byBwYXRoIHN1cHBvcnQgaXMgdmVyeSBlYXN5OjwvcD4KKzxwcmUgY2xhc3M9ImNvZGUiPgorPGk+PGI+Q2hhbmdlIGphdmEgY29kZSBmcm9tOjwvYj48L2k+CisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IGZpbGVzZXQpIHsKKyAgICAgICAgZmlsZXNldHMuYWRkKGZpbGVzZXQpOworICAgIH0KKzxpPjxiPnRvOjwvYj48L2k+CisgICAgcHJpdmF0ZSBWZWN0b3IgcGF0aHMgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgICAgICAgICAgICoxCisgICAgcHVibGljIHZvaWQgYWRkPGI+UGF0aDwvYj4oPGI+UGF0aDwvYj4gcGF0aCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgKjIKKyAgICAgICAgcGF0aHMuYWRkKHBhdGgpOworICAgIH0KKzxpPjxiPmFuZCBidWlsZCBmaWxlIGZyb206PC9iPjwvaT4KKyAgICAmbHQ7ZmluZCBmaWxlPSJhbnQuamFyIiBsb2NhdGlvbj0ibG9jYXRpb24uYW50LWphciImZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iIGluY2x1ZGVzPSIqKi8qLmphciIvJmd0OworICAgICZsdDsvZmluZCZndDsKKzxpPjxiPnRvOjwvYj48L2k+CisgICAgJmx0O2ZpbmQgZmlsZT0iYW50LmphciIgbG9jYXRpb249ImxvY2F0aW9uLmFudC1qYXIiJmd0OworICAgICAgICA8Yj4mbHQ7cGF0aCZndDs8L2I+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKjMKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iIGluY2x1ZGVzPSIqKi8qLmphciIvJmd0OworICAgICAgICAmbHQ7L3BhdGgmZ3Q7CisgICAgJmx0Oy9maW5kJmd0OworPC9wcmU+Cis8cD5PbiA8Yj4qMTwvYj4gd2UgcmVuYW1lIG9ubHkgdGhlIHZlY3Rvci4gSXTvv71zIGp1c3QgZm9yIGJldHRlciByZWFkaW5nIHRoZSBzb3VyY2UuIE9uIDxiPioyPC9iPgord2UgaGF2ZSB0byBwcm92aWRlIHRoZSByaWdodCBtZXRob2Q6IGFuIGFkZDxpPk5hbWU8L2k+KDxpPlR5cGU8L2k+IHQpLiBUaGVyZWZvcmUgcmVwbGFjZSB0aGUKK2ZpbGVzZXQgd2l0aCBwYXRoIGhlcmUuIEZpbmFsbHkgd2UgaGF2ZSB0byBtb2RpZnkgb3VyIGJ1aWxkZmlsZSBvbiA8Yj4qMzwvYj4gYmVjYXVzZSBvdXIgdGFzaworZG9lc27vv710IHN1cHBvcnQgbmVzdGVkIGZpbGVzZXRzIGFueSBsb25nZXIuIFNvIHdlIHdyYXAgdGhlIGZpbGVzZXQgaW5zaWRlIGEgcGF0aC48L3A+CisKKzxwPkFuZCBub3cgd2UgbW9kaWZ5IHRoZSB0ZXN0Y2FzZS4gT2gsIG5vdCB2ZXJ5IG11Y2ggdG8gZG8gOi0pIFJlbmFtaW5nIHRoZSA8dHQ+dGVzdE1pc3NpbmdGaWxlc2V0KCk8L3R0PgorKG5vdCByZWFsbHkgYSA8aT5tdXN0LWJlPC9pPiBidXQgYmV0dGVyIGl077+9cyBuYW1lZCBsaWtlIHRoZSB0aGluayBpdCBkb2VzKSBhbmQgdXBkYXRlIHRoZQorPGk+ZXhwZWN0ZWQ8L2k+LVN0cmluZyBpbiB0aGF0IG1ldGhvZCAobm93IGEgPHR0PnBhdGggbm90IHNldDwvdHQ+IG1lc3NhZ2UgaXMgZXhwZWN0ZWQpLiBUaGUgbW9yZSBjb21wbGV4Cit0ZXN0IGNhc2VzIGJhc2Ugb24gdGhlIGJ1aWxkc2NyaXB0LiBTbyB0aGUgdGFyZ2V0cyA8dHQ+dGVzdEZpbGVOb3RQcmVzZW50PC90dD4gYW5kIDx0dD50ZXN0RmlsZVByZXNlbnQ8L3R0PiBoYXZlIHRvIGJlCittb2RpZmllZCBpbiB0aGUgbWFubmVyIGRlc2NyaWJlZCBhYm92ZS48L3A+CisKKzxwPlRoZSB0ZXN0IGFyZSBmaW5pc2hlZC4gTm93IHdlIGhhdmUgdG8gYWRhcHQgdGhlIHRhc2sgaW1wbGVtZW50YXRpb24uIFRoZSBlYXNpZXN0IG1vZGlmaWNhdGlvbiBpcworaW4gdGhlIDx0dD52YWxpZGF0ZSgpPC90dD4gbWV0aG9kIHdoZXJlIHdlIGNoYW5nZSBsZSBsYXN0IGxpbmUgdG8gPHR0PmlmIChwYXRocy5zaXplKCkmbHQ7MSkgdGhyb3cgbmV3CitCdWlsZEV4Y2VwdGlvbigicGF0aCBub3Qgc2V0Iik7PC90dD4uIEluIHRoZSA8dHQ+ZXhlY3V0ZSgpPC90dD4gbWV0aG9kIHdlIGhhdmUgYSBsaXR0bGUgbW9yZSB3b3JrLgorLi4uIG1tbWggLi4uIGluIHJlYWxpdHkgaXQncyBsZXNzZXIgd29yaywgYmVjYXVzZSB0aGUgUGF0aCBjbGFzcyBkb2VzIHRoZSB3aG9sZSBEaXJlY3RvcnlTY2FubmVyLWhhbmRsaW5nCithbmQgY3JlYXRpbmctYWJzb2x1dGUtcGF0aHMgc3R1ZmYgZm9yIHVzLiBTbyB0aGUgZXhlY3V0ZSBtZXRob2QgaXMganVzdDo8L3A+CisKKzxwcmUgY2xhc3M9ImNvZGUiPgorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIFN0cmluZyBmb3VuZExvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgZm9yKEl0ZXJhdG9yIGl0UGF0aHMgPSBwYXRocy5pdGVyYXRvcigpOyBpdFBhdGhzLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBQYXRoIHBhdGggPSAoPGI+UGF0aDwvYj4paXRQYXRocy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgICAgICAgICBTdHJpbmdbXSBpbmNsdWRlZEZpbGVzID0gPGI+cGF0aC5saXN0KCk8L2I+OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyCisgICAgICAgICAgICBmb3IoaW50IGk9MDsgaSZsdDtpbmNsdWRlZEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gaW5jbHVkZWRGaWxlc1tpXS5yZXBsYWNlKCdcXCcsJy8nKTsKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZigiLyIpKzEpOworICAgICAgICAgICAgICAgIGlmIChmb3VuZExvY2F0aW9uPT1udWxsICZhbXA7JmFtcDsgZmlsZS5lcXVhbHMoZmlsZW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIDxiPmZvdW5kTG9jYXRpb24gPSBpbmNsdWRlZEZpbGVzW2ldOzwvYj4gICAgICAgICAgICAgICAgICAgICAgICAvLyAzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZExvY2F0aW9uIT1udWxsKQorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KGxvY2F0aW9uLCBmb3VuZExvY2F0aW9uKTsKKyAgICB9Cis8L3ByZT4KKworPHA+T2YgY291cnNlIHdlIGhhdmUgdG8gZG8gdGhlIHR5cGVjYXNlIHRvIFBhdGggb24gPGI+Ly8xPC9iPi4gT24gPGI+Ly8yPC9iPiBhbmQgPGI+Ly8zPC9iPgord2Ugc2VlIHRoYXQgdGhlIFBhdGggY2xhc3MgZG9lcyB0aGUgd29yayBmb3IgdXM6IG5vIERpcmVjdG9yeVNjYW5uZXIgKHdhcyBhdCAyKSBhbmQgbm8KK2NyZWF0aW5nIG9mIHRoZSBhYnNvbHV0ZSBwYXRoICh3YXMgYXQgMykuPC9wPgorCisKKworPGgyPjxhIG5hbWU9InJldHVybmluZy1saXN0Ij5SZXR1cm5pbmcgYSBsaXN0PC9hPjwvaDI+Cis8cD5TbyBmYXIgc28gZ29vZC4gQnV0IGNvdWxkIGEgZmlsZSBiZSBvbiBtb3JlIHRoYW4gb25lIHBsYWNlIGluIHRoZSBwYXRoPyAtIE9mIGNvdXJzZS48YnI+CitBbmQgd291bGQgaXQgYmUgZ29vZCB0byBnZXQgYWxsIG9mIHRoZW0/IC0gSXQgZGVwZW5kcyBvbiAuLi48cD4KKworPHA+SW4gdGhpcyBzZWN0aW9uIHdlIHdpbGwgZXh0ZW5kIHRoYXQgdGFzayB0byBzdXBwb3J0IHJldHVybmluZyBhIGxpc3Qgb2YgYWxsIGZpbGVzLgorTGlzdHMgYXMgcHJvcGVydHkgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEFudCBuYXRpdmVseS4gU28gd2UgaGF2ZSB0byBzZWUgaG93IG90aGVyCit0YXNrcyB1c2UgbGlzdHMuIFRoZSBtb3N0IGZhbW91cyB0YXNrIHVzaW5nIGxpc3RzIGlzIEFudC1Db250cmlicyA8Y29kZT4mbHQ7Zm9yZWFjaCZndDs8L2NvZGU+LiBBbGwgbGlzdAorZWxlbWVudHMgYXJlIGNvbmNhdGVuYXRlZCBhbmQgc2VwYXJhdGVkIHdpdGggYSBjdXN0b21pemFibGUgc2VwYXJhdG9yIChkZWZhdWx0ICcsJykuPC9wPgorCis8cD5TbyB3ZSBkbyB0aGUgZm9sbG93aW5nOjwvcD4KKworPHByZSBjbGFzcz0iY29kZSI+CisgICAgJmx0O2ZpbmQgLi4uIDxiPmRlbGltaXRlcj0iIjwvYj4vJmd0OyAuLi4gJmx0Oy9maW5kJmd0OworPC9wcmU+CisKKzxwPklmIHRoZSBkZWxpbWl0ZXIgaXMgc2V0IHdlIHdpbGwgcmV0dXJuIGFsbCBmb3VuZCBmaWxlcyBhcyBsaXN0IHdpdGggdGhhdCBkZWxpbWl0ZXIuPC9wPgorCis8cD5UaGVyZWZvcmUgd2UgaGF2ZSB0bzx1bD4KKzxsaT5wcm92aWRlIGEgbmV3IGF0dHJpYnV0ZTwvbGk+Cis8bGk+Y29sbGVjdCBtb3JlIHRoYW4gdGhlIGZpcnN0IGZpbGU8L2xpPgorPGxpPmRlbGV0ZSBkdXBsaWNhdGVzPC9saT4KKzxsaT5jcmVhdGUgdGhlIGxpc3QgaWYgbmVjZXNzYXJ5PC9saT4KKzxsaT5yZXR1cm4gdGhhdCBsaXN0PC9saT4KKzwvdWw+PC9wPgorCis8cD5TbyB3ZSBhZGQgYXMgdGVzdGNhc2U6PC9wPgorPHByZSBjbGFzcz0iY29kZSI+Cis8Yj48aT5pbiB0aGUgYnVpbGRmaWxlOjwvaT48L2I+CisgICAgJmx0O3RhcmdldCBuYW1lPSJ0ZXN0LmluaXQiJmd0OworICAgICAgICAmbHQ7bWtkaXIgZGlyPSJ0ZXN0MS9kaXIxMS9kaXIxMTEiLyZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoxCisgICAgICAgICZsdDtta2RpciBkaXI9InRlc3QxL2RpcjExL2RpcjExMiIvJmd0OworICAgICAgICAuLi4KKyAgICAgICAgJmx0O3RvdWNoIGZpbGU9InRlc3QxL2RpcjExL2RpcjExMS90ZXN0Ii8mZ3Q7CisgICAgICAgICZsdDt0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMS9kaXIxMTEvbm90Ii8mZ3Q7CisgICAgICAgIC4uLgorICAgICAgICAmbHQ7dG91Y2ggZmlsZT0idGVzdDEvZGlyMTMvZGlyMTMxL25vdDIiLyZndDsKKyAgICAgICAgJmx0O3RvdWNoIGZpbGU9InRlc3QxL2RpcjEzL2RpcjEzMi90ZXN0Ii8mZ3Q7CisgICAgICAgICZsdDt0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMy9kaXIxMzIvbm90Ii8mZ3Q7CisgICAgICAgICZsdDt0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMy9kaXIxMzIvbm90MiIvJmd0OworICAgICAgICAmbHQ7bWtkaXIgZGlyPSJ0ZXN0MiIvJmd0OworICAgICAgICAmbHQ7Y29weSB0b2Rpcj0idGVzdDIiJmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoyCisgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9InRlc3QxIi8mZ3Q7CisgICAgICAgICZsdDsvY29weSZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0idGVzdE11bHRpcGxlRmlsZXMiIGRlcGVuZHM9InVzZS5pbml0LDxiPnRlc3QuaW5pdDwvYj4iJmd0OyAgICAqMworICAgICAgICAmbHQ7ZmluZCBmaWxlPSJ0ZXN0IiBsb2NhdGlvbj0ibG9jYXRpb24udGVzdCIgPGI+ZGVsaW1pdGVyPSI7IjwvYj4mZ3Q7CisgICAgICAgICAgICAmbHQ7cGF0aCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9InRlc3QxIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJ0ZXN0MiIvJmd0OworICAgICAgICAgICAgJmx0Oy9wYXRoJmd0OworICAgICAgICAmbHQ7L2ZpbmQmZ3Q7CisgICAgICAgICZsdDtkZWxldGUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKjQKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0idGVzdDEiLyZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0idGVzdDIiLyZndDsKKyAgICAgICAgJmx0Oy9kZWxldGUmZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKzxiPjxpPmluIHRoZSB0ZXN0IGNsYXNzOjwvaT48L2I+CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRmlsZXMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RNdWx0aXBsZUZpbGVzIik7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImxvY2F0aW9uLnRlc3QiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUHJvcGVydHkgbm90IHNldC4iLCByZXN1bHQpOworICAgICAgICBhc3NlcnRUcnVlKCJPbmx5IG9uZSBmaWxlIGZvdW5kLiIsIHJlc3VsdC5pbmRleE9mKCI7IikgJmd0OyAtMSk7CisgICAgfQorPC9wcmU+CisKKzxwPk5vdyB3ZSBuZWVkIGEgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aGVyZSB3ZSBDQU4gZmluZCBmaWxlcyB3aXRoIHRoZSBzYW1lCituYW1lIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4gQmVjYXVzZSB3ZSBjYW4ndCBzdXJlIHRvIGhhdmUgb25lIHdlIGNyZWF0ZQorb25lIG9uIDxiPioxPC9iPiBhbmQgPGI+KjI8L2I+LiBBbmQgb2YgY291cnNlIHdlIGNsZWFuIHVwIHRoYXQgb24gPGI+KjQ8L2I+LiBUaGUgY3JlYXRpb24KK2NhbiBiZSBkb25lIGluc2lkZSBvdXIgdGVzdCB0YXJnZXQgb3IgaW4gYSBzZXBhcmF0ZSBvbmUsIHdoaWNoIHdpbGwgYmUgYmV0dGVyCitmb3IgcmV1c2UgbGF0ZXIgKDxiPiozPC9iPikuCisKKzxwPlRoZSB0YXNrIGltcGxlbWVudGF0aW9uIGlzIG1vZGlmaWVkIGFzIGZvbGxvd2VkOjwvcD4KKworPHByZSBjbGFzcz0iY29kZSI+CisgICAgcHJpdmF0ZSBWZWN0b3IgZm91bmRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAuLi4KKyAgICBwcml2YXRlIFN0cmluZyBkZWxpbWl0ZXIgPSBudWxsOworICAgIC4uLgorICAgIHB1YmxpYyB2b2lkIHNldERlbGltaXRlcihTdHJpbmcgZGVsaW0pIHsKKyAgICAgICAgZGVsaW1pdGVyID0gZGVsaW07CisgICAgfQorICAgIC4uLgorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIC8vIGZpbmQgYWxsIGZpbGVzCisgICAgICAgIGZvcihJdGVyYXRvciBpdFBhdGhzID0gcGF0aHMuaXRlcmF0b3IoKTsgaXRQYXRocy5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgUGF0aCBwYXRoID0gKFBhdGgpaXRQYXRocy5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmdbXSBpbmNsdWRlZEZpbGVzID0gcGF0aC5saXN0KCk7CisgICAgICAgICAgICBmb3IoaW50IGk9MDsgaSZsdDtpbmNsdWRlZEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gaW5jbHVkZWRGaWxlc1tpXS5yZXBsYWNlKCdcXCcsJy8nKTsKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZigiLyIpKzEpOworICAgICAgICAgICAgICAgIGlmIChmaWxlLmVxdWFscyhmaWxlbmFtZSkgJmFtcDsmYW1wOyA8Yj4hZm91bmRGaWxlcy5jb250YWlucyhpbmNsdWRlZEZpbGVzW2ldPC9iPikpIHsgICAvLyAxCisgICAgICAgICAgICAgICAgICAgIGZvdW5kRmlsZXMuYWRkKGluY2x1ZGVkRmlsZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgcmV0dXJuIHZhbHVlIChsaXN0L3NpbmdsZSkKKyAgICAgICAgU3RyaW5nIHJ2ID0gbnVsbDsKKyAgICAgICAgaWYgKGZvdW5kRmlsZXMuc2l6ZSgpICZndDsgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyCisgICAgICAgICAgICBpZiAoZGVsaW1pdGVyPT1udWxsKSB7CisgICAgICAgICAgICAgICAgLy8gb25seSB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICBydiA9IChTdHJpbmcpZm91bmRGaWxlcy5lbGVtZW50QXQoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBsaXN0CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGl0PWZvdW5kRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsgICAgLy8gMworICAgICAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChpdC5uZXh0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoPGI+aXQuaGFzTmV4dCgpPC9iPikgbGlzdC5hcHBlbmQoZGVsaW1pdGVyKTsgICAgICAgICAgICAgICAvLyA0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJ2ID0gbGlzdC50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBwcm9wZXJ0eQorICAgICAgICBpZiAocnYhPW51bGwpCisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkobG9jYXRpb24sIHJ2KTsKKyAgICB9Cis8L3ByZT4KKworPHA+VGhlIGFsZ29yaXRobSBkb2VzOiBmaW5kaW5nIGFsbCBmaWxlcywgY3JlYXRpbmcgdGhlIHJldHVybiB2YWx1ZSBkZXBlbmRpbmcgb24gdGhlIHVzZXJzCit3aXNoLCByZXR1cm5pbmcgdGhlIHZhbHVlIGFzIHByb3BlcnR5LiBPbiA8Yj4vLzE8L2I+IHdlIGVsaW1pbmF0ZXMgdGhlIGR1cGxpY2F0ZXMuIDxiPi8vMjwvYj4KK2Vuc3VyZXMgdGhhdCB3ZSBjcmVhdGUgdGhlIHJldHVybiB2YWx1ZSBvbmx5IGlmIHdlIGhhdmUgZm91bmQgb25lIGZpbGUuIE9uIDxiPi8vMzwvYj4gd2UKK2l0ZXJhdGUgb3ZlciBhbGwgZm91bmQgZmlsZXMgYW5kIDxiPi8vNDwvYj4gZW5zdXJlcyB0aGF0IHRoZSBsYXN0IGVudHJ5IGhhcyBubyB0cmFpbGluZworZGVsaW1pdGVyLjwvcD4KKworPHA+T2ssIGZpcnN0IHNlYXJjaGluZyBmb3IgYWxsIGZpbGVzIGFuZCB0aGVuIHJldHVybmluZyBvbmx5IHRoZSBmaXJzdCBvbmUgLi4uIFlvdSBjYW4KK3R1bmUgdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIgb3duIDotKTwvcD4KKworCis8aDI+PGEgbmFtZT0iZG9jdW1lbnRhdGlvbiI+RG9jdW1lbnRhdGlvbjwvYT48L2gyPgorPHA+QSB0YXNrIGlzIHVzZWxlc3MgaWYgdGhlIG9ubHkgd2hvIGlzIGFibGUgdG8gY29kZSB0aGUgYnVpbGRmaWxlIGlzIHRoZSB0YXNrIGRldmVsb3BlcgorKGFuZCBoZSBvbmx5IHRoZSBuZXh0IGZldyB3ZWVrcyA6LSkuIFNvIGRvY3VtZW50YXRpb24gaXMgYWxzbyB2ZXJ5IGltcG9ydGFudC4gSW4gd2hpY2gKK2Zvcm0geW91IGRvIHRoYXQgZGVwZW5kcyBvbiB5b3VyIGZhdm91cml0ZS4gQnV0IGluc2lkZSBBbnQgdGhlcmUgaXMgYSBjb21tb24gZm9ybWF0IGFuZAoraXQgaGFzIGFkdmFudGFnZXMgaWYgeW91IHVzZSB0aGF0OiBhbGwgdGFzayB1c2VycyBrbm93IHRoYXQgZm9ybSwgdGhpcyBmb3JtIGlzIHJlcXVlc3RlZCBpZgoreW91IGRlY2lkZSB0byBjb250cmlidXRlIHlvdXIgdGFzay4gU28gd2Ugd2lsbCBkb2Mgb3VyIHRhc2sgaW4gdGhhdCBmb3JtLjwvcD4KKworPHA+SWYgeW91IGhhdmUgYSBsb29rIGF0IHRoZSBtYW51YWwgcGFnZSBvZiB0aGUgPGEgaHJlZj0iQ29yZVRhc2tzL2phdmEuaHRtbCI+amF2YSBbNV08L2E+CisgICB0YXNrIHlvdSB3aWxsIHNlZTx1bD4KKzxsaT5pdCBpcyBwbGFpbiBodG1sPC9saT4KKzxsaT5zdGFydHMgd2l0aCB0aGUgbmFtZTwvbGk+Cis8bGk+aGFzIHNlY3Rpb25zOiBkZXNjcmlwdGlvbiwgcGFyYW1ldGVycywgbmVzdGVkIGVsZW1lbnRzLCAobWF5YmUgcmV0dXJuIGNvZGVzKSBhbmQgKG1vc3QKK2ltcG9ydGFudCA6LSkgZXhhbXBsZXM8L2xpPgorPGxpPnBhcmFtZXRlcnMgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIHdpdGggY29sdW1ucyBmb3IgYXR0cmlidXRlIG5hbWUsIGl0cyBkZXNjcmlwdGlvbiBhbmQgd2hldGhlcgorICBpdCdzIHJlcXVpcmVkIChpZiB5b3UgYWRkIGEgZmVhdHVyZSBhZnRlciBhbiBBbnQgcmVsZWFzZSwgcHJvdmlkZSBhIDx0dD5zaW5jZSBBbnQgeHg8L3R0PgorICBzdGF0ZW1lbnQgd2hlbiBpdCdzIGludHJvZHVjZWQpPC9saT4KKzxsaT5kZXNjcmliZSB0aGUgbmVzdGVkIGVsZW1lbnRzIChzaW5jZS1zdGF0ZW1lbnQgaWYgbmVjZXNzYXJ5KTwvbGk+Cis8bGk+cHJvdmlkZSBvbmUgb3IgbW9yZSB1c2VmdWwgZXhhbXBsZXM7IGZpcnN0IGNvZGUgdGhlbiBkZXNjcmlwdGlvbjwvbGk+Cis8L3VsPgorQXMgYSB0ZW1wbGF0ZSB3ZSBoYXZlOgorCis8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDtodG1sJmd0OworCismbHQ7aGVhZCZndDsKKyZsdDttZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiZndDsKKyZsdDt0aXRsZSZndDsgPGI+VGFza25hbWU8L2I+IFRhc2smbHQ7L3RpdGxlJmd0OworJmx0Oy9oZWFkJmd0OworCismbHQ7Ym9keSZndDsKKworJmx0O2gyJmd0OyZsdDthIG5hbWU9IjxpPnRhc2tuYW1lPC9pPiImZ3Q7PGI+VGFza25hbWU8L2I+Jmx0Oy9hJmd0OyZsdDsvaDImZ3Q7CismbHQ7aDMmZ3Q7RGVzY3JpcHRpb24mbHQ7L2gzJmd0OworJmx0O3AmZ3Q7IDxiPkRlc2NyaWJlIHRoZSB0YXNrLjwvYj4mbHQ7L3AmZ3Q7CisKKyZsdDtoMyZndDtQYXJhbWV0ZXJzJmx0Oy9oMyZndDsKKyZsdDt0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCImZ3Q7CisgICZsdDt0ciZndDsKKyAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0OyZsdDtiJmd0O0F0dHJpYnV0ZSZsdDsvYiZndDsmbHQ7L3RkJmd0OworICAgICZsdDt0ZCB2YWxpZ249InRvcCImZ3Q7Jmx0O2ImZ3Q7RGVzY3JpcHRpb24mbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKKyAgICAmbHQ7dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiJmd0OyZsdDtiJmd0O1JlcXVpcmVkJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7CisgICZsdDsvdHImZ3Q7CisKKyAgPGI+ZG8gdGhpcyBodG1sIHJvdyBmb3IgZWFjaCBhdHRyaWJ1dGUgKGluY2x1ZGluZyBpbmhlcml0ZWQgYXR0cmlidXRlcyk8L2I+CisgICZsdDt0ciZndDsKKyAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0O2NsYXNzbmFtZSZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkIHZhbGlnbj0idG9wIiZndDt0aGUgSmF2YSBjbGFzcyB0byBleGVjdXRlLiZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiZndDtFaXRoZXIgamFyIG9yIGNsYXNzbmFtZSZsdDsvdGQmZ3Q7CisgICZsdDsvdHImZ3Q7CisKKyZsdDsvdGFibGUmZ3Q7CisKKyZsdDtoMyZndDtQYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHMmbHQ7L2gzJmd0OworCis8Yj5EZXNjcmliZSBlYWNoIG5lc3RlZCBlbGVtZW50IChpbmNsdWRpbmcgaW5oZXJpdGVkKTwvYj4KKyZsdDtoNCZndDt5b3VyIG5lc3RlZCBlbGVtZW50PC9iPiZsdDsvaDQmZ3Q7CismbHQ7cCZndDsgPGI+ZGVzY3JpcHRpb248L2I+ICZsdDsvcCZndDsKKyZsdDtwJmd0OyZsdDtlbSZndDtzaW5jZSBBbnQgMS42Jmx0Oy9lbSZndDsuJmx0Oy9wJmd0OworCismbHQ7aDMmZ3Q7RXhhbXBsZXMmbHQ7L2gzJmd0OworJmx0O3ByZSZndDsKKyAgICA8Yj5BIGNvZGUgc2FtcGxlOyBkb24ndCBmb3JnZXQgdG8gZXNjYXBlIHRoZSAmbHQ7IG9mIHRoZSB0YWdzIHdpdGggJmFtcDtsdDs8L2I+CismbHQ7L3ByZSZndDsKKzxiPndoYXQgc2hvdWxkIHRoYXQgZXhhbXBsZSBkbz88L2I+CisKKyZsdDsvYm9keSZndDsKKyZsdDsvaHRtbCZndDsKKzwvcHJlPgorCis8cD5Gb3Igb3VyIHRhc2sgd2UgaGF2ZSA8YSBocmVmPSJDb3JlVGFza3MvZmluZC5odG1sIj50aGF0IFs2XTwvYT46PC9wPgorPHByZSBjbGFzcz0iY29kZSI+CismbHQ7aHRtbCZndDsKKworJmx0O2hlYWQmZ3Q7CismbHQ7bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyImZ3Q7CismbHQ7dGl0bGUmZ3Q7IEZpbmQgVGFzayZsdDsvdGl0bGUmZ3Q7CismbHQ7L2hlYWQmZ3Q7CisKKyZsdDtib2R5Jmd0OworCismbHQ7aDImZ3Q7Jmx0O2EgbmFtZT0iZmluZCImZ3Q7RmluZCZsdDsvYSZndDsmbHQ7L2gyJmd0OworJmx0O2gzJmd0O0Rlc2NyaXB0aW9uJmx0Oy9oMyZndDsKKyZsdDtwJmd0O1NlYXJjaHMgaW4gYSBnaXZlbiBwYXRoIGZvciBhIGZpbGUgYW5kIHJldHVybnMgdGhlIGFic29sdXRlIHRvIGl0IGFzIHByb3BlcnR5LgorSWYgZGVsaW1pdGVyIGlzIHNldCB0aGlzIHRhc2sgcmV0dXJucyBhbGwgZm91bmQgbG9jYXRpb25zLiZsdDsvcCZndDsKKworJmx0O2gzJmd0O1BhcmFtZXRlcnMmbHQ7L2gzJmd0OworJmx0O3RhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIiZndDsKKyAgJmx0O3RyJmd0OworICAgICZsdDt0ZCB2YWxpZ249InRvcCImZ3Q7Jmx0O2ImZ3Q7QXR0cmlidXRlJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkIHZhbGlnbj0idG9wIiZndDsmbHQ7YiZndDtEZXNjcmlwdGlvbiZsdDsvYiZndDsmbHQ7L3RkJmd0OworICAgICZsdDt0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCImZ3Q7Jmx0O2ImZ3Q7UmVxdWlyZWQmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKKyAgJmx0Oy90ciZndDsKKyAgJmx0O3RyJmd0OworICAgICZsdDt0ZCB2YWxpZ249InRvcCImZ3Q7ZmlsZSZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkIHZhbGlnbj0idG9wIiZndDtUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBzZWFyY2guJmx0Oy90ZCZndDsKKyAgICAmbHQ7dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiJmd0O3llcyZsdDsvdGQmZ3Q7CisgICZsdDsvdHImZ3Q7CisgICZsdDt0ciZndDsKKyAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0O2xvY2F0aW9uJmx0Oy90ZCZndDsKKyAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0O1RoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aGVyZSB0byBzdG9yZSB0aGUgbG9jYXRpb24mbHQ7L3RkJmd0OworICAgICZsdDt0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCImZ3Q7eWVzJmx0Oy90ZCZndDsKKyAgJmx0Oy90ciZndDsKKyAgJmx0O3RyJmd0OworICAgICZsdDt0ZCB2YWxpZ249InRvcCImZ3Q7ZGVsaW1pdGVyJmx0Oy90ZCZndDsKKyAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0O0EgZGVsaW1pdGVyIHRvIHVzZSB3aGVuIHJldHVybmluZyB0aGUgbGlzdCZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiZndDtvbmx5IGlmIHRoZSBsaXN0IGlzIHJlcXVpcmVkJmx0Oy90ZCZndDsKKyAgJmx0Oy90ciZndDsKKyZsdDsvdGFibGUmZ3Q7CisKKyZsdDtoMyZndDtQYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHMmbHQ7L2gzJmd0OworCismbHQ7aDQmZ3Q7cGF0aCZsdDsvaDQmZ3Q7CismbHQ7cCZndDtUaGUgcGF0aCB3aGVyZSB0byBzZWFyY2ggdGhlIGZpbGUuJmx0Oy9wJmd0OworCismbHQ7aDMmZ3Q7RXhhbXBsZXMmbHQ7L2gzJmd0OworJmx0O3ByZSZndDsKKyAgICAmbHQ7ZmluZCBmaWxlPSJhbnQuamFyIiBsb2NhdGlvbj0ibG9jIiZndDsKKyAgICAgICAgJmx0O3BhdGgmZ3Q7CisgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9Ii8mZ3Q7CisgICAgICAgICZsdDtwYXRoJmd0OworICAgICZsdDsvZmluZCZndDsKKyZsdDsvcHJlJmd0OworU2VhcmNoZXMgaW4gQW50cyBob21lIGRpcmVjdG9yeSBmb3IgYSBmaWxlICZsdDtpJmd0O2FudC5qYXImbHQ7L2kmZ3Q7IGFuZCBzdG9yZXMgaXRzIGxvY2F0aW9uIGluCitwcm9wZXJ0eSAmbHQ7aSZndDtsb2MmbHQ7L2kmZ3Q7IChzaG91bGQgYmUgQU5UX0hPTUUvYmluL2FudC5qYXIpLgorCismbHQ7cHJlJmd0OworICAgICZsdDtmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2MiIGRlbGltaXRlcj0iOyImZ3Q7CisgICAgICAgICZsdDtwYXRoJmd0OworICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJDOi8iLyZndDsKKyAgICAgICAgJmx0O3BhdGgmZ3Q7CisgICAgJmx0Oy9maW5kJmd0OworICAgICZsdDtlY2hvJmd0O2FudC5qYXIgZm91bmQgaW46ICR7bG9jfSZsdDsvZWNobyZndDsKKyZsdDsvcHJlJmd0OworU2VhcmNoZXMgaW4gV2luZG93cyBDOiBkcml2ZSBmb3IgYWxsICZsdDtpJmd0O2FudC5qYXImbHQ7L2kmZ3Q7IGFuZCBzdG9yZXMgdGhlaXIgbG9jYXRpb25zIGluCitwcm9wZXJ0eSAmbHQ7aSZndDtsb2MmbHQ7L2kmZ3Q7IGRlbGltaXRlZCB3aXRoICZsdDtpJmd0Oyc7JyZsdDsvaSZndDsuIChzaG91bGQgbmVlZCBhIGxvbmcgdGltZSA6LSkKK0FmdGVyIHRoYXQgaXQgcHJpbnRzIG91dCB0aGUgcmVzdWx0IChlLmcuIEM6L2FudC0xLjUuNC9iaW4vYW50LmphcjtDOi9hbnQtMS42L2Jpbi9hbnQuamFyKS4KKworJmx0Oy9ib2R5Jmd0OworJmx0Oy9odG1sJmd0OworPC9wcmU+CisKKworPGgyPjxhIG5hbWU9ImNvbnRyaWJ1dGUiPkNvbnRyaWJ1dGUgdGhlIG5ldyB0YXNrPC9hPjwvaDI+CitJZiB3ZSBkZWNpZGUgdG8gY29udHJpYnV0ZSBvdXIgdGFzaywgd2Ugc2hvdWxkIGRvIHNvbWUgdGhpbmdzOjx1bD4KKzxsaT5pcyBvdXIgdGFzayB3ZWxjb21lPyA6LSkgU2ltcGx5IGFzayBvbiB0aGUgdXNlciBsaXN0PC9saT4KKzxsaT5pcyB0aGUgcmlnaHQgcGFja2FnZSB1c2VkPyA8L2xpPgorPGxpPmRvZXMgdGhlIGNvZGUgY29uZm9ybSB0byB0aGUgc3R5bGVndWlkZT88L2xpPgorPGxpPmRvIGFsbCB0ZXN0cyBwYXNzPyA8L2xpPgorPGxpPmRvZXMgdGhlIGNvZGUgY29tcGlsZSBvbiBKREsgMS4yIChhbmQgcGFzc2VzIGFsbCB0ZXN0cyB0aGVyZSk/PC9saT4KKzxsaT5jb2RlIHVuZGVyIEFwYWNoZSBsaWNlbnNlPC9saT4KKzxsaT5jcmVhdGUgYSBwYXRjaCBmaWxlPC9saT4KKzxsaT5wdWJsaXNoaW5nIHRoYXQgcGF0Y2ggZmlsZTwvbGk+Cis8L3VsPgorVGhlIDxhIGhyZWY9Ii4uL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCI+QW50IFRhc2sgR3VpZGVsaW5lcyBbN108L2E+IHN1cHBvcnQgYWRkaXRpb25hbAoraW5mb3JtYXRpb24gb24gdGhhdC48L3A+CisKKzxwPk5vdyB3ZSB3aWxsIGNoZWNrIHRoZSAiQ2hlY2tsaXN0IGJlZm9yZSBzdWJtaXR0aW5nIGEgbmV3IHRhc2siIGRlc2NyaWJlZCBpbiB0aGF0IGd1aWRlbGluZS4KKzx1bD4KKzxsaT5KYXZhIGZpbGUgYmVnaW5zIHdpdGggQXBhY2hlIGxpY2Vuc2Ugc3RhdGVtZW50LiA8Yj48aT5tdXN0IGRvIHRoYXQ8L2k+PC9iPjwvbGk+Cis8bGk+VGFzayBkb2VzIG5vdCBkZXBlbmQgb24gR1BMIG9yIExHUEwgY29kZS4gPGI+PGk+b2s8L2k+PC9iPjwvbGk+Cis8bGk+U291cmNlIGNvZGUgY29tcGxpZXMgd2l0aCBzdHlsZSBndWlkZWxpbmVzIDxiPjxpPmhhdmUgdG8gY2hlY2sgKGNoZWNrc3R5bGUpPC9pPjwvYj48L2xpPgorPGxpPkNvZGUgY29tcGlsZXMgYW5kIHJ1bnMgb24gSmF2YTEuMiA8Yj48aT5oYXZlIHRvIHRyeTwvaT48L2I+PC9saT4KKzxsaT5NZW1iZXIgdmFyaWFibGVzIGFyZSBwcml2YXRlLCBhbmQgcHJvdmlkZSBwdWJsaWMgYWNjZXNzb3IgbWV0aG9kcworICAgICAgICBpZiBhY2Nlc3MgaXMgYWN0dWFsbHkgbmVlZGVkLiA8Yj48aT5oYXZlIHRvIGNoZWNrIChjaGVja3N0eWxlKTwvaT48L2I+PC9saT4KKzxsaT48aT5NYXliZTwvaT4gVGFzayBoYXMgZmFpbG9uZXJyb3IgYXR0cmlidXRlIHRvIGNvbnRyb2wgZmFpbHVyZSBiZWhhdmlvdXIgPGI+PGk+aGFzbid0PC9pPjwvYj48L2xpPgorPGxpPk5ldyB0ZXN0IGNhc2VzIHdyaXR0ZW4gYW5kIHN1Y2NlZWQgPGI+PGk+cGFzc2VkIG9uIEpESyAxLjQsIGhhdmUgdG8gdHJ5IG9uIEpESyAxLjI8L2k+PC9iPjwvbGk+Cis8bGk+RG9jdW1lbnRhdGlvbiBwYWdlIHdyaXR0ZW4gPGI+PGk+b2s8L2k+PC9iPjwvbGk+Cis8bGk+RXhhbXBsZSB0YXNrIGRlY2xhcmF0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiB0ZXN0ZWQuIDxiPjxpPm9rICh1c2VkIGluIHRlc3RzKTwvaT48L2I+PC9saT4KKzxsaT5QYXRjaCBmaWxlcyBnZW5lcmF0ZWQgdXNpbmcgY3ZzIGRpZmYgLXUgPGI+PGk+dG8gZG88L2k+PC9iPjwvbGk+Cis8bGk+cGF0Y2ggZmlsZXMgaW5jbHVkZSBhIHBhdGNoIHRvIGRlZmF1bHRzLnByb3BlcnRpZXMgdG8gcmVnaXN0ZXIgdGhlCit0YXNrcyA8Yj48aT50byBkbzwvaT48L2I+PC9saT4KKzxsaT5wYXRjaCBmaWxlcyBpbmNsdWRlIGEgcGF0Y2ggdG8gY29yZXRhc2tsaXN0Lmh0bWwgb3IKK29wdGlvbmFsdGFza2xpc3QuaHRtbCB0byBsaW5rIHRvIHRoZSBuZXcgdGFzayBwYWdlIDxiPjxpPnRvIGRvPC9pPjwvYj48L2xpPgorPGxpPk1lc3NhZ2UgdG8gZGV2IGNvbnRhaW5zIFtTVUJNSVRdIGFuZCB0YXNrIG5hbWUgaW4gc3ViamVjdCA8Yj48aT50byBkbzwvaT48L2I+PC9saT4KKzxsaT5NZXNzYWdlIGJvZHkgY29udGFpbnMgYSByYXRpb25hbGUgZm9yIHRoZSB0YXNrIDxiPjxpPnRvIGRvPC9pPjwvYj48L2xpPgorPGxpPk1lc3NhZ2UgYXR0YWNobWVudHMgY29udGFpbiB0aGUgcmVxdWlyZWQgZmlsZXMgLXNvdXJjZSwgZG9jdW1lbnRhdGlvbiwKK3Rlc3QgYW5kIHBhdGNoZXMgemlwcGVkIHVwIHRvIGVzY2FwZSB0aGUgSFRNTCBmaWx0ZXIuIDxiPjxpPnRvIGRvPC9pPjwvYj48L2xpPgorPC91bD4KKworCis8aDM+UGFja2FnZSAvIERpcmVjdG9yaWVzPC9oMz4KKzxwPlRoaXMgdGFzayBkb2VzIG5vdCBkZXBlbmQgb24gYW55IGV4dGVybmFsIGxpYnJhcnkuIFRoZXJlZm9yZSB3ZSBjYW4gdXNlIHRoaXMgYXMKK2EgY29yZSB0YXNrLiBUaGlzIHRhc2sgY29udGFpbnMgb25seSBvbmUgY2xhc3MuIFNvIHdlIGNhbiB1c2UgdGhlIHN0YW5kYXJkIHBhY2thZ2UKK2ZvciBjb3JlIHRhc2tzOiA8dHQ+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM8L3R0Pi4gSW1wbGVtZW50YXRpb25zIGFyZSBpbiB0aGUKK2RpcmVjdG9yeSA8dHQ+c3JjL21haW48L3R0PiwgdGVzdHMgaW4gPHR0PnNyYy90ZXN0Y2FzZXM8L3R0PiBhbmQgYnVpbGRmaWxlcyBmb3IKK3Rlc3RzIGluIDx0dD5zcmMvZXRjL3Rlc3RjYXNlczwvdHQ+LjwvcD4KKworPHA+Tm93IHdlIGludGVncmF0ZSBvdXIgd29yayBpbnRvIEFudHMgZGlzdHJpYnV0aW9uLiBTbyBmaXJzdCB3ZSBkbyBhbiB1cGRhdGUgb2Ygb3VyCitjdnMgdHJlZS4gSWYgbm90IGRvbmUgeWV0LCB5b3UgaGF2ZSB0byBjaGVja291dCB0aGUgYW50IG1vZHVsZSBmcm9tIEFwYWNoZXMgY3ZzIHNlcnZlcgorYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9jdnMuaHRtbCI+QWNjZXNzIHRoZSBTb3VyY2UgVHJlZSAoQW5vbkNWUykKK1s4XTwvYT4gKHBhc3N3b3JkIGlzIDxpPmFub25jdnM8L2k+KTo8cHJlIGNsYXNzPSJvdXRwdXQiPgorY3ZzIC1kIDpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIGxvZ2luICAgICAgICAgICAgICAgICAvLzEKK2N2cyAtZCA6cHNlcnZlcjphbm9uY3ZzQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyBjaGVja291dCBhbnQgICAgICAgICAgLy8yCis8L3ByZT4KK0lmIHlvdSBoYXZlIGEgbG9jYWwgY29weSBvZiBBbnRzIHNvdXJjZXMganVzdCBkbyBhbiB1cGRhdGUKKzxwcmUgY2xhc3M9Im91dHB1dCI+CitjdnMgLWQgOnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMgbG9naW4KK2NkIGFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8zCitjdnMgLWQgOnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMgdXBkYXRlICAgICAgICAgICAgICAgIC8vNAorPC9wcmU+PC9wPgorCis8cD5XZSB1c2UgdGhlIDxpPi1kPC9pPiBmbGFnIG9uIDxiPi8vMTwvYj4gdG8gc3BlY2lmaXkgdGhlIGN2cyBkaXJlY3RvcnkuIFlvdSBjYW4KK3NwZWNpZnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIENWU1JPT1Qgd2l0aCB0aGF0IHZhbHVlIGFuZCBhZnRlciB0aGF0IHlvdSBoYXZlbu+/vXQKK3RvIHVzZSB0aGF0IGZsYWcgYW55IG1vcmUuIE9uIDxiPi8vMjwvYj4gd2UgZ2V0IHRoZSB3aG9sZSBjdnMgdHJlZSBvZiBhbnQuIChTb3JyeSwKK2J1dCB0aGF0IHVzZXMgYSBsb3Qgb2YgdGltZSAuLi4gMTAgdXAgdG8gMzAgbWludXRlcyBhcmUgbm90IHVudXN1YWwgLi4uIGJ1dCB0aGlzIGhhcwordG8gYmUgZG9uZSBvbmx5IG9uY2UgOi0pLiBBIGN2cyB1cGRhdGUgZG9lc24ndCB1c2UgYSBtb2R1bGVuYW1lIGJ1dCB5b3UgaGF2ZSB0byBiZQoraW5zaWRlIHRoZSBkaXJlY3RvcnkuIFRoZXJlZm9yZSB3ZSBnbyBpbnRvIHRoYXQgb24gPGI+Ly8zPC9iPiBhbmQgZG8gdGhlIHVwZGF0ZQorb24gPGI+Ly80PC9iPi48L3A+CisKKzxwPk5vdyB3ZSB3aWxsIGJ1aWxkIG91ciBBbnQgZGlzdHJpYnV0aW9uIGFuZCBkbyBhIHRlc3QuIFNvIHdlIGNhbiBzZWUgaWYgdGhlcmUKK2FyZSBhbnkgdGVzdHMgZmFpbGluZyBvbiBvdXIgbWFjaGluZS4gKFdlIGNhbiBpZ25vcmUgdGhlc2UgZmFpbGluZyB0ZXN0cyBvbiBsYXRlcgorc3RlcHM7IHdpbmRvd3Mgc3ludGF4IHVzZWQgaGVyZS0gdHJhbnNsYXRlIHRvIHhOSVggaWYgbmVlZGVkKToKKzxwcmUgY2xhc3M9Im91dHB1dCI+CitBTlRIT01FJmd0OyBidWlsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCitBTlRIT01FJmd0OyBzZXQgQU5UX0hPTUU9JUNEJVxkaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyCitBTlRIT01FJmd0OyBhbnQgdGVzdCAtRHRlc3QuaGFsdG9uZmFpbHVyZT1mYWxzZSAgICAgICAgICAgICAgICAgICAgICAvLyAzCis8L3ByZT4KKworRmlyc3Qgd2UgaGF2ZSB0byBidWlsZCBvdXIgQW50IGRpc3RyaWJ1dGlvbiAoPGI+Ly8xPC9iPikuIE9uIDxiPi8vMjwvYj4gd2Ugc2V0IHRoZSBBTlRfSE9NRQorZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgbmV3IGNyZWF0ZWQgZGlzdHJpYnV0aW9uIGlzIHN0b3JlZAorKCVDRCUgaXMgZXhwYW5kZWQgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9uIFdpbmRvd3MgMjAwMCBhbmQgWFAsIG9uIDl4IGFuZCBOVAord3JpdGUgaXQgb3V0KS4gT24gPGI+Ly8zPC9iPiB3ZSBsZXQgQW50IGRvIGFsbCB0aGUgdGVzdHMgKHdoaWNoIGVuZm9yY2VkIGEgY29tcGlsZQorb2YgYWxsIHRlc3RzKSB3aXRob3V0IHN0b3BwaW5nIG9uIGZpcnN0IGZhaWx1cmUuPC9wPgorCis8cD5OZXh0IHdlIGFwcGx5IG91ciB3b3JrIG9udG8gQW50cyBzb3VyY2VzLiBCZWNhdXNlIHdlIGhhdmVuJ3QgbW9kaWZpZWQgYW55LCB0aGlzIGlzCithIHJlbGF0aXZlIHNpbXBsZSBzdGVwLiA8aT4oQmVjYXVzZSBJIGhhdmUgYSBsb2NhbCBjb3B5IG9mIEFudCBhbmQgdXN1YWxseSBjb250cmlidXRlIG15Cit3b3JrLCBJIHdvcmsgb24gdGhlIGxvY2FsIGNvcHkganVzdCBmcm9tIHRoZSBiZWdpbm5pbmcuIFRoZSBhZHZhbnRhZ2U6IHRoaXMgc3RlcCBpc24ndAorbmVjZXNzYXJ5IGFuZCBzYXZlcyBhIGxvdCBvZiB3b3JrIGlmIHlvdSBtb2RpZnkgZXhpc3Rpbmcgc291cmNlIDotKTwvaT4uCisKKzx1bD4KKzxsaT5tb3ZlIHRoZSBGaW5kLmphdmEgdG8gQU5USE9NRS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaW5kLmphdmEgPC9saT4KKzxsaT5tb3ZlIHRoZSBGaW5kVGVzdC5qYXZhIHRvIEFOVEhPTUUvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaW5kVGVzdC5qYXZhIDwvbGk+Cis8bGk+bW92ZSB0aGUgYnVpbGQueG1sIHRvIEFOVEhPTUUvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvPGI+ZmluZC54bWw8L2I+ICghISEgcmVuYW1lZCAhISEpPC9saT4KKzxsaT5hZGQgYSA8dHQ+cGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczs8L3R0PiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0d28gamF2YSBmaWxlcyA8L2xpPgorPGxpPmRlbGV0ZSBhbGwgc3R1ZmYgZnJvbSBmaW5kLnhtbCBrZWVwaW5nIHRoZSB0YXJnZXRzICJ0ZXN0RmlsZU5vdFByZXNlbnQiLCAidGVzdEZpbGVQcmVzZW50IiwKKyAgICAidGVzdC5pbml0IiBhbmQgInRlc3RNdWx0aXBsZUZpbGVzIiA8L2xpPgorPGxpPmRlbGV0ZSB0aGUgZGVwZW5kZW5jeSB0byAidXNlLmluaXQiIGluIHRoZSBmaW5kLnhtbCA8L2xpPgorPGxpPmluIEZpbmRUZXN0LmphdmEgY2hhbmdlIHRoZSBsaW5lIDx0dD5jb25maWd1cmVQcm9qZWN0KCJidWlsZC54bWwiKTs8L3R0PiB0bworICAgIDx0dD5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maW5kLnhtbCIpOzwvdHQ+IDwvbGk+Cis8bGk+bW92ZSB0aGUgZmluZC5odG1sIHRvIEFOVEhPTUUvZG9jcy9tYW51YWwvQ29yZVRhc2tzL2ZpbmQuaHRtbCA8L2xpPgorPGxpPmFkZCBhIDx0dD4mbHQ7YSBocmVmPSJDb3JlVGFza3MvZmluZC5odG1sIiZndDtGaW5kJmx0Oy9hJmd0OyZsdDticiZndDs8L3R0PgorICAgIGluIHRoZSBBTlRIT01FL2RvY3MvbWFudWFsL2NvcmV0YXNrbGlzdC5odG1sIDwvbGk+Cis8L3VsPgorCitOb3cgb3VyIG1vZGlmaWNhdGlvbnMgYXJlIGRvbmUgYW5kIHdlIHdpbGwgcmV0ZXN0IGl0OgorPHByZSBjbGFzcz0ib3V0cHV0Ij4KK0FOVEhPTUUmZ3Q7IGJ1aWxkCitBTlRIT01FJmd0OyBhbnQgcnVuLXNpbmdsZS10ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgICAgICAgICAgLUR0ZXN0Y2FzZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5GaW5kVGVzdCAgICAvLyAyCisgICAgICAgICAgICAgLUR0ZXN0LmhhbHRvbmZhaWx1cmU9ZmFsc2UKKzwvcHJlPgorQmVjYXVzZSB3ZSBvbmx5IHdhbnQgdG8gdGVzdCBvdXIgbmV3IGNsYXNzLCB3ZSB1c2UgdGhlIHRhcmdldCBmb3Igc2luZ2xlIHRlc3RzLCBzcGVjaWZ5Cit0aGUgdGVzdCB0byB1c2UgYW5kIGNvbmZpZ3VyZSBub3QgdG8gaGFsdCBvbiB0aGUgZmlyc3QgZmFpbHVyZSAtIHdlIHdhbnQgdG8gc2VlIGFsbAorZmFpbHVyZXMgb2Ygb3VyIG93biB0ZXN0ICg8Yj4vLzEgKyAyPC9iPikuPC9wPgorCis8cD5BbmQgLi4uIG9oLCBhbGwgdGVzdHMgZmFpbDogPGk+QW50IGNvdWxkIG5vdCBmaW5kIHRoZSB0YXNrIG9yIGEgY2xhc3MgdGhpcyB0YXNrIHJlbGllcyB1cG9uLjwvaT48L3A+CisKKzxwPk9rOiBpbiB0aGUgZWFybGllciBzdGVwcyB3ZSB0b2xkIEFudCB0byB1c2UgdGhlIEZpbmQgY2xhc3MgZm9yIHRoZSA8Y29kZT4mbHQ7ZmluZCZndDs8L2NvZGU+IHRhc2sgKHJlbWVtYmVyIHRoZQorPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiBzdGF0ZW1lbnQgaW4gdGhlICJ1c2UuaW5pdCIgdGFyZ2V0KS4gQnV0IG5vdyB3ZSB3YW50IHRvIGludHJvZHVjZSB0aGF0IHRhc2sgYXMKK2EgY29yZSB0YXNrLiBBbmQgbm9ib2R5IHdhbnRzIHRvIHRhc2tkZWYgdGhlIGphdmFjLCBlY2hvLCAuLi4gU28gd2hhdCB0byBkbz8gVGhlIGFuc3dlciBpcyB0aGUKK3NyYy9tYWluLy4uLi90YXNrZGVmcy9kZWZhdWx0LnByb3BlcnRpZXMuIEhlcmUgaXMgdGhlIG1hcHBpbmcgYmV0d2VlbiB0YXNrbmFtZSBhbmQgaW1wbGVtZW50aW5nCitjbGFzcyBkb25lLiBTbyB3ZSBhZGQgYSA8dHQ+ZmluZD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5GaW5kPC90dD4gYXMgdGhlIGxhc3QgY29yZQordGFzayAoanVzdCBiZWZvcmUgdGhlIDx0dD4jIG9wdGlvbmFsIHRhc2tzPC90dD4gbGluZSkuIE5vdyBhIHNlY29uZCB0cnk6Cis8cHJlIGNsYXNzPSJvdXRwdXQiPgorQU5USE9NRSZndDsgYnVpbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorQU5USE9NRSZndDsgYW50IHJ1bi1zaW5nbGUtdGVzdAorICAgICAgICAgICAgIC1EdGVzdGNhc2U9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRmluZFRlc3QKKyAgICAgICAgICAgICAtRHRlc3QuaGFsdG9uZmFpbHVyZT1mYWxzZQorPC9wcmU+CitXZSBoYXZlIHRvIHJlYnVpbGQgKDxiPi8vMTwvYj4pIEFudCBiZWNhdXNlIHRoZSB0ZXN0IGxvb2sgaW4gdGhlICVBTlRfSE9NRSVcbGliXGFudC5qYXIKKyhtb3JlIHByZWNpc2U6IG9uIHRoZSBjbGFzc3BhdGgpIGZvciB0aGUgcHJvcGVydGllcyBmaWxlLiBBbmQgd2UgaGF2ZSBvbmx5IG1vZGlmaWVkIGl0IGluIHRoZQorc291cmNlIHBhdGguIFNvIHdlIGhhdmUgdG8gcmVidWlsZCB0aGF0IGphci4gQnV0IG5vdyBhbGwgdGVzdHMgcGFzcyBhbmQgd2UgY2hlY2sgd2hldGhlciBvdXIgY2xhc3MKK2JyZWFrcyBzb21lIG90aGVyIHRlc3RzLgorPHByZSBjbGFzcz0ib3V0cHV0Ij4KK0FOVEhPTUUmZ3Q7IGFudCB0ZXN0IC1EdGVzdC5oYWx0b25mYWlsdXJlPWZhbHNlCis8L3ByZT4KK0JlY2F1c2UgdGhlcmUgYXJlIGEgbG90IG9mIHRlc3RzIHRoaXMgc3RlcCByZXF1aXJlcyBhIGxpdHRsZSBiaXQgb2YgdGltZS4gU28gdXNlIHRoZSA8aT5ydW4tc2luZ2xlLXRlc3Q8L2k+CitkdXJpbmcgZGV2ZWxvcG1lbnQgYW5kIGRvIHRoZSA8aT50ZXN0PC9pPiBvbmx5IGF0IHRoZSBlbmQgKG1heWJlIHNvbWV0aW1lcyBkdXJpbmcgZGV2ZWxvcG1lbnQgdG9vKS4KK1dlIHVzZSB0aGUgPGk+LUR0ZXN0LmhhbHRvbmZhaWx1cmU9ZmFsc2U8L2k+IGhlcmUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlciB0ZXN0cyBmYWlsIGFuZCB3ZSBoYXZlCit0byBsb29rIGludG8gdGhlbS48L3A+CisKKzxwPlRoaXMgdGVzdCBydW4gc2hvdWxkIHNob3cgdXMgdHdvIHRoaW5nczogb3VyIHRlc3Qgd2lsbCBydW4gYW5kIHRoZSBudW1iZXIgb2YgZmFpbGluZyB0ZXN0cworaXMgdGhlIHNhbWUgYXMgZGlyZWN0bHkgYWZ0ZXIgdGhlIGN2cyB1cGRhdGUgKHdpdGhvdXQgb3VyIG1vZGlmaWNhdGlvbnMpLjwvcD4KKworCisKKzxoMz5BcGFjaGUgbGljZW5zZSBzdGF0ZW1lbnQ8L2gzPgorPHA+U2ltcGx5IGNvcHkgdGhlIGxpY2Vuc2UgdGV4dCBmcm9tIG9uZSB0aGUgb3RoZXIgc291cmNlIGZyb20gdGhlIEFudCBzb3VyY2UgdHJlZS48L3A+CisKKworPGgzPlRlc3Qgb24gSkRLIDEuMjwvaDM+Cis8cD5VbnRpbCB2ZXJzaW9uIDEuNSBBbnQgbXVzdCBiZSBhYmxlIHRvIHJ1biBvbiBhIEpESyAxLjEuIFdpdGggdmVyc2lvbiAxLjYgdGhpcyBpcyBub3QgYQorcmVxdWlzaXRlIGFueSBtb3JlLiBCdXQgSkRLIDEuMiBpcyBhIG11c3QtdG8td29yay13aXRoLiBTbyB3ZSBoYXZlIHRvIHRlc3QgdGhhdC4gWW91IGNhbiBkb3dubG9hZCBvbGRlcgorSkRLcyBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvYXJjaGl2ZS9pbmRleC5odG1sIj5TdW4gWzldPC9hPi48L3A+CisKKzxwPkNsZWFuIHRoZSBBTlRfSE9NRSB2YXJpYWJsZSwgZGVsZXRlIHRoZSA8aT5idWlsZCwgYm9vdHN0cmFwPC9pPiBhbmQgPGk+ZGlzdDwvaT4gZGlyZWN0b3J5CithbmQgcG9pbnQgSkFWQV9IT01FIHRvIHRoZSBKREsgMS4yIGhvbWUgZGlyZWN0b3J5LiBUaGVuIGRvIHRoZSA8dHQ+YnVpbGQ8L3R0Piwgc2V0IEFOVF9IT01FCithbmQgcnVuIDx0dD5hbnQgdGVzdDwvdHQ+IChsaWtlIGFib3ZlKS48L3A+CisKKzxwPk91ciB0ZXN0IHNob3VsZCBwYXNzLjwvcD4KKworCisKKzxoMz5DaGVja3N0eWxlPC9oMz4KKzxwPlRoZXJlIGFyZSBtYW55IHRoaW5ncyB3ZSBoYXZlIHRvIGVuc3VyZS4gSW5kZW50YXRpb24gd2l0aCA0IHNwYWNlcywgYmxhbmtzIGhlcmUgYW5kIHRoZXJlLCAuLi4KKyhhbGwgZGVzY3JpYmVkIGluIHRoZSA8YSBocmVmPSIuLi9hbnRfdGFza19ndWlkZWxpbmVzLmh0bWwiPkFudCBUYXNrIEd1aWRlbGluZXMgWzddPC9hPiB3aGljaAoraW5jbHVkZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9jb2RlY29udi9odG1sL0NvZGVDb252VE9DLmRvYy5odG1sIj5TdW4gY29kZSBzdHlsZQorWzEwXTwvYT4pLiBCZWNhdXNlIHRoZXJlIGFyZSBzbyBtYW55IHRoaW5ncyB3ZSB3b3VsZCBiZSBoYXBweSB0byBoYXZlIGEgdG9vbCBmb3IgZG8gdGhlIGNoZWNrcy4KK1RoZXJlIGlzIG9uZTogY2hlY2tzdHlsZS4gQ2hlY2tzdHlsZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2NoZWNrc3R5bGUuc291cmNlZm9yZ2UubmV0LyI+CitTb3VyY2Vmb3JnZSBbMTFdPC9hPiBhbmQgQW50IHByb3ZpZGVzIHdpdGggdGhlIDx0dD5jaGVjay54bWw8L3R0PiBhIGJ1aWxkZmlsZSB3aGljaCB3aWxsIGRvIHRoZSBqb2IKK2ZvciB1cy48L3A+CisKKzxwPkRvd25sb2FkIGl0IGFuZCBwdXQgdGhlIGNoZWNrc3R5bGUtKi1hbGwuamFyIGludG8geW91ciAlVVNFUlBST0ZJTEUlXC5hbnRcbGliIGRpcmVjdG9yeS4KK0FsbCBqYXIncyBzdG9yZWQgdGhlcmUgYXJlIGF2YWlsYWJsZSB0byBBbnQgc28geW91IGhhdmVuJ3QgdG8gYWRkIGl0IHRvIHlvdSAlQU5UX0hPTUUlXGxpYgorZGlyZWN0b3J5ICh0aGlzIGZlYXR1cmUgd2FzIGFkZGVkIHdpdGggQW50IDEuNikuPC9wPgorCis8cD5TbyB3ZSB3aWxsIHJ1biB0aGUgdGVzdHMgd2l0aAorPHByZSBjbGFzcz0ib3V0cHV0Ij4KK0FOVEhPTUUmZ3Q7IGFudCAtZiBjaGVjay54bWwgY2hlY2tzdHlsZSBodG1scmVwb3J0Cis8L3ByZT4KK0kgcHJlZmVyIHRoZSBIVE1MIHJlcG9ydCBiZWNhdXNlIHRoZXJlIGFyZSBsb3RzIG9mIG1lc3NhZ2VzIGFuZCB3ZSBjYW4gbmF2aWdhdGUgZmFzdGVyLgorT3BlbiB0aGUgQU5USE9NRS9idWlsZC9yZXBvcnRzL2NoZWNrc3R5bGUvaHRtbC9pbmRleC5odG1sIGFuZCBuYXZpZ2F0ZSB0byB0aGUgRmluZC5qYXZhLiBOb3cgd2UKK3NlZSB0aGF0IHRoZXJlIGFyZSBzb21lIGVycm9yczogbWlzc2luZyB3aGl0ZXNwYWNlcywgdW51c2VkIGltcG9ydHMsIG1pc3NpbmcgamF2YWRvY3MuIFNvIHdlIGhhdmUKK3RvIGRvIHRoYXQuPC9wPgorCis8cD5IaW50OiBzdGFydCBhdCB0aGUgPGI+YnV0dG9tPC9iPiBvZiB0aGUgZmlsZSBzbyB0aGUgbGluZSBudW1iZXJzIGluIHRoZSByZXBvcnQgd2lsbCBrZWVwCit1cCB0byBkYXRlIGFuZCB5b3Ugd2lsbCBmaW5kIHRoZSBuZXh0IGVycm9yIHBsYWNlIG11Y2ggbW9yZSBlYXNpZXIgd2l0aG91dCByZWRvaW5nIHRoZSBjaGVja3N0eWxlLjwvcD4KKworPHA+QWZ0ZXIgY2xlYW5pbmcgdXAgdGhlIGNvZGUgYWNjb3JkaW5nIHRvIHRoZSBtZXNzYWdlcyB3ZSBkZWxldGUgdGhlIHJlcG9ydHMgZGlyZWN0b3J5IGFuZAorZG8gYSBzZWNvbmQgY2hlY2tzdHlsZSBydW4uIE5vdyBvdXIgdGFzayBpc24ndCBsaXN0ZWQuIFRoYXQncyBmaW5lIDotKTwvcD4KKworCisKKzwhLS0KKyAgQ291bGRudCBjcmVhdGUgdGhlIGRpZmYgdGhhdCB3YXkgZm9yIG15c2VsZiwgYnV0IHRoYXQgc2hvdWxkIGJlIGRvY3VtZW50ZWQuCisgIEJ1dCBvbiB0aGUgb3RoZXIgaGFuZCB0aGlzIHR1dG9yaWFsIHNob3VsZCBub3QgYmUgZm9yZ290dGVuIGFueSBsb25nZXIgc28gSQorICBjb21tZW50IHRoYXQgb3V0LiAgSkhNCis8aDM+Q3JlYXRpbmcgdGhlIGRpZmY8L2gzPgorPHA+Q3JlYXRpbmcgYSBkaWZmIGZvciBBbnQgaXMgdmVyeSBlYXN5OiBqdXN0IHN0YXJ0IDx0dD5hbnQgLWYgcGF0Y2gueG1sPC90dD4gYW5kIGFsbCBpcyBkb25lCithdXRvbWF0aWNhbGx5LiBUaGlzIHN0ZXAgcmVxdWlyZXMgYSBjdnMgZXhlY3V0YWJsZSBpbiB5b3VyIHBhdGggYW5kIGludGVybmV0IGFjY2VzcyAobW9yZSBwcmVjaXNlOgorY3ZzIGFjY2VzcykuIEFzIGEgcmVzdWx0IHdlIGdldCBhIGZpbGUgPGk+IFhYWCA8L2k+LjwvcD4KKy0tPgorCisKKzxoMz5QdWJsaXNoIHRoZSB0YXNrPC9oMz4KKzxwPkZpbmFsbHkgd2UgcHVibGlzaCB0aGF0IGFyY2hpdmUuIEFzIGRlc2NyaWJlZCBpbiB0aGUgPGEgaHJlZj0iLi4vYW50X3Rhc2tfZ3VpZGVsaW5lcy5odG1sIj4KK0FudCBUYXNrIEd1aWRlbGluZXMgWzddPC9hPiB3ZSBjYW4gcG9zdCBpdCBvbiB0aGUgZGV2ZWxvcGVyIG1haWxpbmdsaXN0IG9yIHdlIGNyZWF0ZSBhIEJ1Z1ppbGxhCitlbnRyeS4gRm9yIGJvdGggd2UgbmVlZCBzb21lIGluZm9ybWF0aW9uOjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSI+Cis8dHI+CisgIDx0aD5zdWJqZWN0PC90aD4KKyAgPHRkPjxpPnNob3J0IGRlc2NyaXB0aW9uPC9pPjwvdGQ+CisgIDx0ZD5UYXNrIGZvciBmaW5kaW5nIGZpbGVzIGluIGEgcGF0aDwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGg+Ym9keTwvdGg+CisgIDx0ZD48aT5tb3JlIGRldGFpbHMgYWJvdXQgdGhlIHBhdGg8L2k+PC90ZD4KKyAgPHRkPlRoaXMgbmV3IHRhc2sgbG9va3MgaW5zaWRlIGEgbmVzdGVkIDxjb2RlPiZsdDtwYXRoLyZndDs8L2NvZGU+IGZvciBvY2N1cnJlbmNlcyBvZiBhIGZpbGUgYW5kIHN0b3JlcworICAgICAgYWxsIGxvY2F0aW9ucyBhcyBhIHByb3BlcnR5LiBTZWUgdGhlIGluY2x1ZGVkIG1hbnVhbCBmb3IgZGV0YWlscy48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRoPmF0dGFjaGVtZW50czwvdGg+CisgIDx0ZD48aT5hbGwgZmlsZXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBwYXRoPC90ZD4KKyAgPHRkPkFyY2hpdmUgY29udGFpbmluZyBhIHBhdGNoIHdpdGggdGhlIG5ldyBhbmQgbW9kaWZpZWQgcmVzb3VyY2VzPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8cD5TZW5kaW5nIGFuIGVtYWlsIHdpdGggdGhlc2UgaW5mb3JtYXRpb24gaXMgdmVyeSBlYXN5IGFuZCBJIHRoaW5rIEkgaGF2ZW4ndCB0byBzaG93IHRoYXQuCitUaGUgb3RoZXIgd2F5IC0gQnVnWmlsbGEgLSBpcyBzbGlnaHRseSBtb3JlIGRpZmZpY3VsdC4gQnV0IGl0IGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgZW50cmllcword2lsbCBub3QgYmUgZm9yZ290dGVuIChvbmNlIHBlciB3ZWVrIGEgcmVwb3J0IGlzIGdlbmVyYXRlZCkuIFNvIEkgd2lsbCBzaG93IHRoaXMgd2F5LjwvcD4KKworPHA+WW91IG11c3QgaGF2ZSBhIEJ1Z1ppbGxhIGFjY291bnQgZm9yIHRoYXQuIFNvIG9wZW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS8iPgorQnVnWmlsbGEgTWFpbiBQYWdlIFsxMl08L2E+IGFuZCBmb2xsb3cgdGhlIGxpbmsKKzxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9jcmVhdGVhY2NvdW50LmNnaSI+T3BlbiBhIG5ldyBCdWd6aWxsYSBhY2NvdW50IFsxM108L2E+CithbmQgdGhlIHN0ZXBzIGRlc2NyaWJlZCB0aGVyZSBpZiB5b3UgaGF2ZW4ndCBvbmUuPC9wPgorCis8b2w+Cis8bGk+RnJvbSB0aGUgQnVnWmlsbGEgbWFpbiBwYWdlIGNob29zZSA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvZW50ZXJfYnVnLmNnaSI+RW50ZXIKKyAgICBhIG5ldyBidWcgcmVwb3J0IFsxNF08L2E+PC9saT4KKzxsaT5DaG9vc2UgIkFudCIgYXMgcHJvZHVjdCA8L2xpPgorPGxpPlZlcnNpb24gaXMgdGhlIGxhc3QgIkFscGhhIChuaWdodGx5KSIgKGF0IHRoaXMgdGltZSAxLjcpPC9saT4KKzxsaT5Db21wb25lbnQgaXMgIkNvcmUgdGFza3MiPC9saT4KKzxsaT5QbGF0dGZvcm0gYW5kIFNldmVyaXR5IGFyZSBvayB3aXRoICJPdGhlciIgYW5kICJOb3JtYWwiPC9saT4KKzxsaT5Jbml0aWFsIFN0YXRlIGlzIG9rIHdpdGggIk5ldyI8L2xpPgorPGxpPlNhbWUgd2l0aCB0aGUgZW1weSAiQXNzaWduZWQgdG8iPC9saT4KKzxsaT5JdCBpcyBub3QgcmVxdWlyZWQgdG8gYWRkIHlvdXJzZWxmIGFzIENDLCBiZWNhdXNlIHlvdSBhcmUgdGhlIHJlcG9ydGVyIGFuZCB0aGVyZWZvcmUgd2lsbCBiZQorICAgIGluZm9ybWVkIG9uIGNoYW5nZXM8L2xpPgorPGxpPlVSTDogbm8gdXJsIHJlcXVpcmVkPC9saT4KKzxsaT5TdW1tYXJ5OiBhZGQgdGhlIDxpPnN1YmplY3Q8L2k+IGZyb20gdGhlIHRhYmxlPC9saT4KKzxsaT5EZXNjcmlwdGlvbjogYWRkIHRoZSA8aT5ib2R5PC9pPiBmcm9tIHRoZSB0YWJsZTwvbGk+Cis8bGk+VGhlbiBwcmVzcyAiQ29tbWl0IjwvbGk+Cis8bGk+QWZ0ZXIgcmVkaXJlY3RpbmcgdG8gdGhlIG5ldyBjcmVhdGVkIGJ1ZyBlbnRyeSBjbGljayAiQ3JlYXRlIGEgTmV3IEF0dGFjaG1lbnQiPC9saT4KKzxsaT5FbnRlciB0aGUgcGF0aCB0byB5b3VyIGxvY2FsIHBhdGggZmlsZSBpbnRvICJGaWxlIiBvciBjaG9vc2UgaXQgdmlhIHRoZSAiRmlsZSIncworICAgIGJ1dHRvbi48L2xpPgorPGxpPkVudGVyIGEgc2hvcnQgZGVzY3JpcHRpb24gaW50byAiRGVzY3JpcHRpb24iLCBzbyB0aGF0IHlvdSBjb3VsZCBndWVzcywgd2hhdCB0aGUKKyAgICBwYXRoIGZpbGUgaW5jbHVkZXMuIEhlcmUgd2UgY291bGQgYWRkICJJbml0aWFsIFBhdGNoIi48L2xpPgorPGxpPlRoZSAiQ29udGVudCBUeXBlIiBpcyAiYXV0by1kZXRlY3QiLiBZb3UgY291bGQgdXNlIHRoZSAicGF0Y2giIHR5cGUsIGlmIHlvdSBvbmx5CisgICAgcHJvdmlkZSBhIHNpbmdsZSBwYXRoIGZpbGUsIGJ1dCB3ZSB3YW50IGRvIHVwbG9hZCBtb3JlIHRoYXQgb25lLCBpbmNsdWRlZCBpbiBvdXIKKyAgICBwYXRjaC56aXAuPC9saT4KKzxsaT5UaGVuIHByZXNzICJDb21taXQiPC9saT4KKzwvb2w+CitOb3cgdGhlIG5ldyB0YXNrIGlzIHVwbG9hZGVkIGludG8gdGhlIGJ1ZyBkYXRhYmFzZS4KKworCis8aDI+PGEgbmFtZT0icmVzb3VyY2VzIj5SZXNvdXJjZXM8L2E+PC9oMj4KKyZuYnNwOyZuYnNwO1sxXSA8YSBocmVmPSJ0dXRvcmlhbC13cml0aW5nLXRhc2tzLmh0bWwiPnR1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbDwvYT48YnI+CismbmJzcDsmbmJzcDtbMl0gPGEgaHJlZj0idHV0b3JpYWwtdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy56aXAiPnR1dG9yaWFsLXRhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMuemlwPC9hPjxicj4KKyZuYnNwOyZuYnNwO1szXSA8YSBocmVmPSJ1c2luZy5odG1sI2J1aWx0LWluLXByb3BzIj51c2luZy5odG1sI2J1aWx0LWluLXByb3BzPC9hPjxicj4KKyZuYnNwOyZuYnNwO1s0XSA8YSBocmVmPSJodHRwOi8vYW50LWNvbnRyaWIuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2FudC1jb250cmliLnNvdXJjZWZvcmdlLm5ldC88L2E+PGJyPgorJm5ic3A7Jm5ic3A7WzVdIDxhIGhyZWY9IkNvcmVUYXNrcy9qYXZhLmh0bWwiPkNvcmVUYXNrcy9qYXZhLmh0bWw8L2E+PGJyPgorJm5ic3A7Jm5ic3A7WzZdIDxhIGhyZWY9IkNvcmVUYXNrcy9maW5kLmh0bWwiPkNvcmVUYXNrcy9maW5kLmh0bWw8L2E+PGJyPgorJm5ic3A7Jm5ic3A7WzddIDxhIGhyZWY9Ii4uL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCI+Li4vYW50X3Rhc2tfZ3VpZGVsaW5lcy5odG1sPC9hPjxicj4KKyZuYnNwOyZuYnNwO1s4XSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvY3ZzLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9jdnMuaHRtbDwvYT48YnI+CismbmJzcDsmbmJzcDtbOV0gPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9hcmNoaXZlL2luZGV4Lmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvYXJjaGl2ZS9pbmRleC5odG1sPC9hPjxicj4KKyZuYnNwOyZuYnNwO1sxMF0gPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252L2h0bWwvQ29kZUNvbnZUT0MuZG9jLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9jb2RlY29udi9odG1sL0NvZGVDb252VE9DLmRvYy5odG1sPC9hPjxicj4KKyZuYnNwOyZuYnNwO1sxMV0gPGEgaHJlZj0iaHR0cDovL2NoZWNrc3R5bGUuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2NoZWNrc3R5bGUuc291cmNlZm9yZ2UubmV0LzwvYT48YnI+CismbmJzcDsmbmJzcDtbMTJdIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS8iPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS88L2E+PGJyPgorJm5ic3A7Jm5ic3A7WzEzXSA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvY3JlYXRlYWNjb3VudC5jZ2kiPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9jcmVhdGVhY2NvdW50LmNnaTwvYT48YnI+CismbmJzcDsmbmJzcDtbMTRdIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9lbnRlcl9idWcuY2dpIj5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvZW50ZXJfYnVnLmNnaTwvYT48YnI+CisKKworPCEtLQorICBUT0RPOgorICAtIGhvdyB0byBjcmVhdGUgYSBwYXRoIChwYXRoLnhtbCAvIGNvbW1hbmQgbGluZSkKKy0tPgorCisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFsLXRhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMuemlwIGIvdHJ1bmsvZG9jcy9tYW51YWwvdHV0b3JpYWwtdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjOGExMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFsLXRhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFsLXdyaXRpbmctdGFza3Mtc3JjLnppcCBiL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFsLXdyaXRpbmctdGFza3Mtc3JjLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTY3YzNiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvdHV0b3JpYWwtd3JpdGluZy10YXNrcy1zcmMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmNhNjNjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9tYW51YWwvdHV0b3JpYWwtd3JpdGluZy10YXNrcy5odG1sCkBAIC0wLDAgKzEsNzY3IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorICA8dGl0bGU+VHV0b3JpYWw6IFdyaXRpbmcgVGFza3M8L3RpdGxlPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+VHV0b3JpYWw6IFdyaXRpbmcgVGFza3M8L2gxPgorCis8cD5UaGlzIGRvY3VtZW50IHByb3ZpZGVzIGEgc3RlcCBieSBzdGVwIHR1dG9yaWFsIGZvciB3cml0aW5nCit0YXNrcy48L3A+Cis8aDI+Q29udGVudDwvaDI+Cis8cD48dWw+Cis8bGk+PGEgaHJlZj0iI2J1aWxkZW52aXJvbm1lbnQiPlNldCB1cCB0aGUgYnVpbGQgZW52aXJvbm1lbnQ8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjd3JpdGUxIj5Xcml0ZSB0aGUgVGFzazwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiN1c2UxIj5Vc2UgdGhlIFRhc2s8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjVGFza0FkYXB0ZXIiPkludGVncmF0aW9uIHdpdGggVGFza0FkYXB0ZXI8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjZGVyaXZpbmdGcm9tVGFzayI+RGVyaXZpbmcgZnJvbSBBbnQncyBUYXNrPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI2F0dHJpYnV0ZXMiPkF0dHJpYnV0ZXM8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjTmVzdGVkVGV4dCI+TmVzdGVkIFRleHQ8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjTmVzdGVkRWxlbWVudHMiPk5lc3RlZCBFbGVtZW50czwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNjb21wbGV4Ij5PdXIgdGFzayBpbiBhIGxpdHRsZSBtb3JlIGNvbXBsZXggdmVyc2lvbjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNUZXN0aW5nVGFza3MiPlRlc3QgdGhlIFRhc2s8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjcmVzb3VyY2VzIj5SZXNvdXJjZXM8L2E+PC9saT4KKzwvdWw+PC9wPgorCis8YSBuYW1lPSJidWlsZGVudmlyb25tZW50Ij48L2E+Cis8aDI+U2V0IHVwIHRoZSBidWlsZCBlbnZpcm9ubWVudDwvaDI+Cis8cD5BbnQgYnVpbGRzIGl0c2VsZiwgd2UgYXJlIHVzaW5nIEFudCB0b28gKHdoeSB3ZSB3b3VsZCB3cml0ZQorYSB0YXNrIGlmIG5vdD8gOi0pIHRoZXJlZm9yZSB3ZSBzaG91bGQgdXNlIEFudCBmb3Igb3VyIGJ1aWxkLjxwPgorPHA+V2UgY2hvb3NlIGEgZGlyZWN0b3J5IGFzIHJvb3QgZGlyZWN0b3J5LiBBbGwgdGhpbmdzIHdpbGwgYmUgZG9uZQoraGVyZSBpZiBJIHNheSBub3RoaW5nIGRpZmZlcmVudC4gSSB3aWxsIHJlZmVyZW5jZSB0aGlzIGRpcmVjdG9yeQorYXMgPGk+cm9vdC1kaXJlY3Rvcnk8L2k+IG9mIG91ciBwcm9qZWN0LiBJbiB0aGlzIHJvb3QtZGlyZWN0b3J5IHdlCitjcmVhdGUgYSB0ZXh0IGZpbGUgbmFtZXMgPGk+YnVpbGQueG1sPC9pPi4gV2hhdCBzaG91bGQgQW50IGRvIGZvciB1cz8KKzx1bD4KKzxsaT5jb21waWxlcyBteSBzdHVmZjwvbGk+Cis8bGk+bWFrZSB0aGUgamFyLCBzbyB0aGF0IEkgY2FuIGRlcGxveSBpdDwvbGk+Cis8bGk+Y2xlYW4gdXAgZXZlcnl0aGluZzwvbGk+Cis8L3VsPgorU28gdGhlIGJ1aWxkZmlsZSBjb250YWlucyB0aHJlZSB0YXJnZXRzLgorPHByZSBjbGFzcz0iY29kZSI+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8mZ3Q7CismbHQ7cHJvamVjdCBuYW1lPSJNeVRhc2siIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciImZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iRGVsZXRlIGFsbCBnZW5lcmF0ZWQgZmlsZXMiJmd0OworICAgICAgICAmbHQ7ZGVsZXRlIGRpcj0iY2xhc3NlcyIvJmd0OworICAgICAgICAmbHQ7ZGVsZXRlIGZpbGU9Ik15VGFza3MuamFyIi8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlcyB0aGUgVGFzayImZ3Q7CisgICAgICAgICZsdDtqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iY2xhc3NlcyIvJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJKQVJzIHRoZSBUYXNrIiZndDsKKyAgICAgICAgJmx0O2phciBkZXN0ZmlsZT0iTXlUYXNrLmphciIgYmFzZWRpcj0iY2xhc3NlcyIvJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT4KKworVGhpcyBidWlsZGZpbGUgdXNlcyBvZnRlbiB0aGUgc2FtZSB2YWx1ZSAoc3JjLCBjbGFzc2VzLCBNeVRhc2suamFyKSwgc28gd2Ugc2hvdWxkIHJld3JpdGUgdGhhdAordXNpbmcgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT5zLiBPbiBzZWNvbmQgdGhlcmUgYXJlIHNvbWUgaGFuZGljYXBzOiA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiByZXF1aXJlcyB0aGF0IHRoZSBkZXN0aW5hdGlvbgorZGlyZWN0b3J5IGV4aXN0czsgYSBjYWxsIG9mICJjbGVhbiIgd2l0aCBhIG5vbiBleGlzdGluZyBjbGFzc2VzIGRpcmVjdG9yeSB3aWxsIGZhaWw7ICJqYXIiIHJlcXVpcmVzCit0aGUgZXhlY3V0aW9uIG9mIHNvbWUgc3RlcHMgYm9mb3JlLiBTbyB0aGUgcmVmYWN0b3JlZCBjb2RlIGlzOgorCis8cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPyZndDsKKyZsdDtwcm9qZWN0IG5hbWU9Ik15VGFzayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iamFyIiZndDsKKworICAgIDxiPiZsdDtwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0ic3JjIi8mZ3Q7PC9iPgorICAgIDxiPiZsdDtwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzLmRpciIgdmFsdWU9ImNsYXNzZXMiLyZndDs8L2I+CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iRGVsZXRlIGFsbCBnZW5lcmF0ZWQgZmlsZXMiJmd0OworICAgICAgICAmbHQ7ZGVsZXRlIGRpcj0iPGI+JHtjbGFzc2VzLmRpcn08L2I+IiA8Yj5mYWlsb25lcnJvcj0iZmFsc2UiPC9iPi8mZ3Q7CisgICAgICAgICZsdDtkZWxldGUgZmlsZT0iPGI+JHthbnQucHJvamVjdC5uYW1lfS5qYXI8L2I+Ii8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlcyB0aGUgVGFzayImZ3Q7CisgICAgICAgIDxiPiZsdDtta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7PC9iPgorICAgICAgICAmbHQ7amF2YWMgc3JjZGlyPSI8Yj4ke3NyYy5kaXJ9PC9iPiIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0iSkFScyB0aGUgVGFzayIgPGI+ZGVwZW5kcz0iY29tcGlsZSI8L2I+Jmd0OworICAgICAgICAmbHQ7amFyIGRlc3RmaWxlPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIgYmFzZWRpcj0iJHtjbGFzc2VzLmRpcn0iLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+Cis8aT5hbnQucHJvamVjdC5uYW1lPC9pPiBpcyBvbmUgb2YgdGhlCis8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYnVpbHQtaW4tcHJvcHMiIHRhcmdldD0iX2JsYW5rIj4KK2J1aWxkLWluIHByb3BlcnRpZXMgWzFdPC9hPiBvZiBBbnQuCisKKworPGEgbmFtZT0id3JpdGUxIj48L2E+Cis8aDI+V3JpdGUgdGhlIFRhc2s8L2gyPgorCitOb3cgd2Ugd3JpdGUgdGhlIHNpbXBsZXN0IFRhc2sgLSBhIEhlbGxvV29ybGQtVGFzayAod2hhdCBlbHNlPykuIENyZWF0ZSBhIHRleHQgZmlsZQorPGk+SGVsbG9Xb3JsZC5qYXZhPC9pPiBpbiB0aGUgc3JjLWRpcmVjdG9yeSB3aXRoOgorPHByZSBjbGFzcz0iY29kZSI+CitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCB7CisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyBXb3JsZCIpOworICAgIH0KK30KKzwvcHJlPgorYW5kIHdlIGNhbiBjb21waWxlIGFuZCBqYXIgaXQgd2l0aCA8dHQ+YW50PC90dD4gKGRlZmF1bHQgdGFyZ2V0IGlzICJqYXIiIGFuZCB2aWEKK2l0cyA8aT5kZXBlbmRzPC9pPi1jbGF1c2UgdGhlICJjb21waWxlIiBpcyBleGVjdXRlZCBiZWZvcmUpLgorCisKKworPGEgbmFtZT0idXNlMSI+PC9hPgorPGgyPlVzZSB0aGUgVGFzazwvaDI+Cis8cD5CdXQgYWZ0ZXIgY3JlYXRpbmcgdGhlIGphciB3ZSB3YW50IHRvIHVzZSBvdXIgbmV3IFRhc2suIFRoZXJlZm9yZSB3ZSBuZWVkIGEKK25ldyB0YXJnZXQgInVzZSIuIEJlZm9yZSB3ZSBjYW4gdXNlIG91ciBuZXcgdGFzayB3ZSBoYXZlIHRvIGRlY2xhcmUgaXQgd2l0aAorPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvdGFza2RlZi5odG1sIiB0YXJnZXQ9Il9ibGFuayI+Cis8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IFsyXTwvYT4uIEFuZCBmb3IgZWFzaWVyIHByb2Nlc3Mgd2UgY2hhbmdlIHRoZSBkZWZhdWx0IGNsYXVzZToKKzxwcmUgY2xhc3M9ImNvZGUiPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Jmd0OworJmx0O3Byb2plY3QgbmFtZT0iTXlUYXNrIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSI8Yj51c2U8L2I+IiZndDsKKworICAgIC4uLgorCisgICAgPGI+Jmx0O3RhcmdldCBuYW1lPSJ1c2UiIGRlc2NyaXB0aW9uPSJVc2UgdGhlIFRhc2siIGRlcGVuZHM9ImphciImZ3Q7CisgICAgICAgICZsdDt0YXNrZGVmIG5hbWU9ImhlbGxvd29ybGQiIGNsYXNzbmFtZT0iSGVsbG9Xb3JsZCIgY2xhc3NwYXRoPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIvJmd0OworICAgICAgICAmbHQ7aGVsbG93b3JsZC8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7PC9iPgorCismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT4KKworSW1wb3J0YW50IGlzIHRoZSA8aT5jbGFzc3BhdGg8L2k+LWF0dHJpYnV0ZS4gQW50IHNlYXJjaGVzIGluIGl0cyAvbGliIGRpcmVjdG9yeSBmb3IKK3Rhc2tzIGFuZCBvdXIgdGFzayBpc24ndCB0aGVyZS4gU28gd2UgaGF2ZSB0byBwcm92aWRlIHRoZSByaWdodCBsb2NhdGlvbi4gPC9wPgorCis8cD5Ob3cgd2UgY2FuIHR5cGUgaW4gPHR0PmFudDwvdHQ+IGFuZCBhbGwgc2hvdWxkIHdvcmsgLi4uCis8cHJlIGNsYXNzPSJvdXRwdXQiPgorQnVpbGRmaWxlOiBidWlsZC54bWwKKworY29tcGlsZToKKyAgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcY2xhc3NlcworICAgIFtqYXZhY10gQ29tcGlsaW5nIDEgc291cmNlIGZpbGUgdG8gQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrXGNsYXNzZXMKKworamFyOgorICAgICAgW2phcl0gQnVpbGRpbmcgamFyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcTXlUYXNrLmphcgorCit1c2U6CitbaGVsbG93b3JsZF0gSGVsbG8gV29ybGQKKworQlVJTEQgU1VDQ0VTU0ZVTAorVG90YWwgdGltZTogMyBzZWNvbmRzCis8L3ByZT4KKworCisKKzxhIG5hbWU9IlRhc2tBZGFwdGVyIj48L2E+Cis8aDI+SW50ZWdyYXRpb24gd2l0aCBUYXNrQWRhcHRlcjwvaDI+Cis8cD5PdXIgY2xhc3MgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBBbnQuIEl0IGV4dGVuZHMgbm8gc3VwZXJjbGFzcyBhbmQgaW1wbGVtZW50cworbm8gaW50ZXJmYWNlLiBIb3cgZG9lcyBBbnQga25vdyB0byBpbnRlZ3JhdGU/IFZpYSBuYW1lIGNvbnZlbnRpb246IG91ciBjbGFzcyBwcm92aWRlcworYSBtZXRob2Qgd2l0aCBzaWduYXR1cmUgPHR0PnB1YmxpYyB2b2lkIGV4ZWN1dGUoKTwvdHQ+LiBUaGlzIGNsYXNzIGlzIHdyYXBwZWQgYnkgQW50J3MKKzx0dD5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQWRhcHRlcjwvdHQ+IHdoaWNoIGlzIGEgdGFzayBhbmQgdXNlcyByZWZsZWN0aW9uIGZvcgorc2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCBhbmQgY2FsbGluZyB0aGUgPGk+ZXhlY3V0ZSgpPC9pPiBtZXRob2QuPC9wPgorCis8cD48aT5TZXR0aW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0PC9pPj8gQ291bGQgYmUgaW50ZXJlc3RpbmcuIFRoZSBQcm9qZWN0IGNsYXNzCitnaXZlcyB1cyBzb21lIG5pY2UgYWJpbGl0aWVzOiBhY2Nlc3MgdG8gQW50J3MgbG9nZ2luZyBmYWNpbGl0aWVzIGdldHRpbmcgYW5kIHNldHRpbmcKK3Byb3BlcnRpZXMgYW5kIG11Y2ggbW9yZS4gU28gd2UgdHJ5IHRvIHVzZSB0aGF0IGNsYXNzOgorPHByZSBjbGFzcz0iY29kZSI+CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworcHVibGljIGNsYXNzIEhlbGxvV29ybGQgeworCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvaikgeworICAgICAgICBwcm9qZWN0ID0gcHJvajsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHByb2plY3QuZ2V0UHJvcGVydHkoImFudC5wcm9qZWN0Lm5hbWUiKTsKKyAgICAgICAgcHJvamVjdC5sb2coIkhlcmUgaXMgcHJvamVjdCAnIiArIG1lc3NhZ2UgKyAiJy4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICB9Cit9Cis8L3ByZT4KK2FuZCB0aGUgZXhlY3V0aW9uIHdpdGggPHR0PmFudDwvdHQ+IHdpbGwgc2hvdyB1cyB0aGUgZXhwZWN0ZWQKKzxwcmUgY2xhc3M9Im91dHB1dCI+Cit1c2U6CitIZXJlIGlzIHByb2plY3QgJ015VGFzaycuCis8L3ByZT48L3A+CisKKworPGEgbmFtZT0iZGVyaXZpbmdGcm9tVGFzayI+PC9hPgorPGgyPkRlcml2aW5nIGZyb20gQW50J3MgVGFzazwvaDI+Cis8cD5PaywgdGhhdCB3b3JrcyAuLi4gQnV0IHVzdWFsbHkgeW91IHdpbGwgZXh0ZW5kIDx0dD5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrPC90dD4uCitUaGF0IGNsYXNzIGlzIGludGVncmF0ZWQgaW4gQW50LCBnZXQncyB0aGUgcHJvamVjdC1yZWZlcmVuY2UsIHByb3ZpZGVzIGRvY3VtZW50YXRpb24KK2ZpZWxzLCBwcm92aWRlcyBlYXNpZXIgYWNjZXNzIHRvIHRoZSBsb2dnaW5nIGZhY2lsaXR5IGFuZCAodmVyeSB1c2VmdWwpIGdpdmVzIHlvdQordGhlIGV4YWN0IGxvY2F0aW9uIHdoZXJlIDxpPmluIHRoZSBidWlsZGZpbGU8L2k+IHRoaXMgdGFzayBpbnN0YW5jZSBpcyB1c2VkLjwvcD4KKworPHA+T2tpLWRva2kgLSBsZXQncyB1cyB1c2Ugc29tZSBvZiB0aGVzZToKKzxwcmUgY2xhc3M9ImNvZGUiPgoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIGV4dGVuZHMgVGFzayB7CisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgLy8gdXNlIG9mIHRoZSByZWZlcmVuY2UgdG8gUHJvamVjdC1pbnN0YW5jZQorICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LnByb2plY3QubmFtZSIpOworCisgICAgICAgIC8vIFRhc2sncyBsb2cgbWV0aG9kCisgICAgICAgIGxvZygiSGVyZSBpcyBwcm9qZWN0ICciICsgbWVzc2FnZSArICInLiIpOworCisgICAgICAgIC8vIHdoZXJlIHRoaXMgdGFzayBpcyB1c2VkPworICAgICAgICBsb2coIkkgYW0gdXNlZCBpbjogIiArICBnZXRMb2NhdGlvbigpICk7CisgICAgfQorfQorPC9wcmU+Cit3aGljaCBnaXZlcyB1cyB3aGVuIHJ1bm5pbmcKKzxwcmUgY2xhc3M9Im91dHB1dCI+Cit1c2U6CitbaGVsbG93b3JsZF0gSGVyZSBpcyBwcm9qZWN0ICdNeVRhc2snLgorW2hlbGxvd29ybGRdIEkgYW0gdXNlZCBpbjogQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrXGJ1aWxkLnhtbDoyMzoKKzwvcHJlPgorCisKKzxhIG5hbWU9ImF0dHJpYnV0ZXMiPgorPGgyPkF0dHJpYnV0ZXM8L2gyPgorPHA+Tm93IHdlIHdhbnQgdG8gc3BlY2lmeSB0aGUgdGV4dCBvZiBvdXIgbWVzc2FnZSAoaXQgc2VlbXMgdGhhdCB3ZSBhcmUKK3Jld3JpdGluZyB0aGUgPGNvZGU+Jmx0O2VjaG8vJmd0OzwvY29kZT4gdGFzayA6LSkuIEZpcnN0IHdlIHdlbGwgZG8gdGhhdCB3aXRoIGFuIGF0dHJpYnV0ZS4KK0l0IGlzIHZlcnkgZWFzeSAtIGZvciBlYWNoIGF0dHJpYnV0ZSBwcm92aWRlIGEgPHR0PnB1YmxpYyB2b2lkIHNldDxjb2RlPiZsdDthdHRyaWJ1dGVuYW1lJmd0OzwvY29kZT4oPGNvZGU+Jmx0O3R5cGUmZ3Q7PC9jb2RlPgorbmV3VmFsdWUpPC90dD4gbWV0aG9kIGFuZCBBbnQgd2lsbCBkbyB0aGUgcmVzdCB2aWEgcmVmbGVjdGlvbi48L3A+Cis8cHJlIGNsYXNzPSJjb2RlIj4KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIFRhc2sgeworCisgICAgU3RyaW5nIG1lc3NhZ2U7CisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbXNnKSB7CisgICAgICAgIG1lc3NhZ2UgPSBtc2c7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgaWYgKG1lc3NhZ2U9PW51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gbWVzc2FnZSBzZXQuIik7CisgICAgICAgIH0KKyAgICAgICAgbG9nKG1lc3NhZ2UpOworICAgIH0KKworfQorPC9wcmU+Cis8cD5PaCwgd2hhdCdzIHRoYXQgaW4gZXhlY3V0ZSgpPyBUaHJvdyBhIDxpPkJ1aWxkRXhjZXB0aW9uPC9pPj8gWWVzLCB0aGF0J3MgdGhlIHVzdWFsCit3YXkgdG8gc2hvdyBBbnQgdGhhdCBzb21ldGhpbmcgaW1wb3J0YW50IGlzIG1pc3NlZCBhbmQgY29tcGxldGUgYnVpbGQgc2hvdWxkIGZhaWwuIFRoZQorc3RyaW5nIHByb3ZpZGVkIHRoZXJlIGlzIHdyaXR0ZW4gYXMgYnVpbGQtZmFpbGVzLW1lc3NhZ2UuIEhlcmUgaXQncyBuZWNlc3NhcnkgYmVjYXVzZQordGhlIGxvZygpIG1ldGhvZCBjYW4ndCBoYW5kbGUgYSA8aT5udWxsPC9pPiB2YWx1ZSBhcyBwYXJhbWV0ZXIgYW5kIHRocm93cyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLgorKE9mIGNvdXJzZSB5b3UgY2FuIGluaXRpYWxpemUgdGhlIDxpPm1lc3NhZ2U8L2k+IHdpdGggYSBkZWZhdWx0IHN0cmluZy4pPC9wPgorCis8cD5BZnRlciB0aGF0IHdlIGhhdmUgdG8gbW9kaWZ5IG91ciBidWlsZGZpbGU6Cis8cHJlIGNsYXNzPSJjb2RlIj4KKyAgICAmbHQ7dGFyZ2V0IG5hbWU9InVzZSIgZGVzY3JpcHRpb249IlVzZSB0aGUgVGFzayIgZGVwZW5kcz0iamFyIiZndDsKKyAgICAgICAgJmx0O3Rhc2tkZWYgbmFtZT0iaGVsbG93b3JsZCIKKyAgICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJIZWxsb1dvcmxkIgorICAgICAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7YW50LnByb2plY3QubmFtZX0uamFyIi8mZ3Q7CisgICAgICAgICZsdDtoZWxsb3dvcmxkIDxiPm1lc3NhZ2U9IkhlbGxvIFdvcmxkIjwvYj4vJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworPC9wcmU+CitUaGF0J3MgYWxsLjwvcD4KKworPHA+U29tZSBiYWNrZ3JvdW5kIGZvciB3b3JraW5nIHdpdGggYXR0cmlidXRlczogQW50IHN1cHBvcnRzIGFueSBvZiB0aGVzZSBkYXRhdHlwZXMgYXMKK2FyZ3VtZW50cyBvZiB0aGUgc2V0LW1ldGhvZDo8dWw+Cis8bGk+ZWxlbWVudGFyeSBkYXRhIHR5cGUgbGlrZSA8aT5pbnQ8L2k+LCA8aT5sb25nPC9pPiwgLi4uPC9saT4KKzxsaT5pdHMgd3JhcHBlciBjbGFzc2VzIGxpa2UgPGk+amF2YS5sYW5nLkludGVnZXI8L2k+LCA8aT5qYXZhLmxhbmcuTG9uZzwvaT4sIC4uLjwvbGk+Cis8bGk+PGk+amF2YS5sYW5nLlN0cmluZzwvaT48L2xpPgorPGxpPnNvbWUgbW9yZSBjbGFzc2VzIChlLmcuIDxpPmphdmEuaW8uRmlsZTwvaT47IHNlZQorICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sI3NldC1tYWdpYyI+TWFudWFsCisgICAgJ1dyaXRpbmcgWW91ciBPd24gVGFzaycgWzNdPC9hPik8L2xpPgorPC91bD4KK0JlZm9yZSBjYWxsaW5nIHRoZSBzZXQtbWV0aG9kIGFsbCBwcm9wZXJ0aWVzIGFyZSByZXNvbHZlZC4gU28gYSA8dHQ+Jmx0O2hlbGxvd29ybGQgbWVzc2FnZT0iJHttc2d9Ii8mZ3Q7PC90dD4KK3dvdWxkIG5vdCBzZXQgdGhlIG1lc3NhZ2Ugc3RyaW5nIHRvICIke21zZ30iIGlmIHRoZXJlIGlzIGEgcHJvcGVydHkgIm1zZyIgd2l0aCBhIHNldCB2YWx1ZS4KKworCis8YSBuYW1lPSJOZXN0ZWRUZXh0Ij48L2E+Cis8aDI+TmVzdGVkIFRleHQ8L2gyPgorPHA+TWF5YmUgeW91IGhhdmUgdXNlZCB0aGUgPGNvZGU+Jmx0O2VjaG8mZ3Q7PC9jb2RlPiB0YXNrIGluIGEgd2F5IGxpa2UgPHR0PiZsdDtlY2hvJmd0O0hlbGxvIFdvcmxkJmx0Oy9lY2hvJmd0OzwvdHQ+LgorRm9yIHRoYXQgeW91IGhhdmUgdG8gcHJvdmlkZSBhIDx0dD5wdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0ZXh0KTwvdHQ+IG1ldGhvZC4KKzxwcmUgY2xhc3M9ImNvZGUiPgorLi4uCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCBleHRlbmRzIFRhc2sgeworICAgIC4uLgorICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgbWVzc2FnZSA9IHRleHQ7CisgICAgfQorICAgIC4uLgorfQorPC9wcmU+CitCdXQgaGVyZSBwcm9wZXJ0aWVzIGFyZSA8Yj5ub3Q8L2I+IHJlc29sdmVkISBGb3IgcmVzb2x2aW5nIHByb3BlcnRpZXMgd2UgaGF2ZSB0byB1c2UKK1Byb2plY3QncyA8dHQ+cmVwbGFjZVByb3BlcnRpZXMoU3RyaW5nIHByb3BuYW1lKSA6IFN0cmluZzwvdHQ+IG1ldGhvZCB3aGljaCB0YWtlcyB0aGUKK3Byb3BlcnR5IG5hbWUgYXMgYXJndW1lbnQgYW5kIHJldHVybnMgaXRzIHZhbHVlIChvciAke3Byb3BuYW1lfSBpZiBub3Qgc2V0KS48L3A+CisKKworPGEgbmFtZT0iTmVzdGVkRWxlbWVudHMiPjwvYT4KKzxoMj5OZXN0ZWQgRWxlbWVudHM8L2gyPgorPHA+VGhlcmUgYXJlIHNldmVyYWwgd2F5cyBmb3IgaW5zZXJ0aW5nIHRoZSBhYmlsaXR5IG9mIGhhbmRsaW5nIG5lc3RlZCBlbGVtZW50cy4gU2VlCit0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwjbmVzdGVkLWVsZW1lbnRzIj5NYW51YWwgWzRdPC9hPiBmb3Igb3RoZXIuCitXZSB1c2UgdGhlIGZpcnN0IHdheSBvZiB0aGUgdGhyZWUgZGVzY3JpYmVkIHdheXMuIFRoZXJlIGFyZSBzZXZlcmFsIHN0ZXBzIGZvciB0aGF0OjxvbD4KKzxsaT5XZSBjcmVhdGUgYSBjbGFzcyBmb3IgY29sbGVjdGluZyBhbGwgdGhlIGluZm8gdGhlIG5lc3RlZCBlbGVtZW50IHNob3VsZCBjb250YWluLgorICBUaGlzIGNsYXNzIGlzIGNyZWF0ZWQgYnkgdGhlIHNhbWUgcnVsZXMgZm9yIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cworICBhcyBmb3IgdGhlIHRhc2sgKDxjb2RlPnNldCZsdDthdHRyaWJ1dGVuYW1lJmd0OzwvY29kZT4oKSBtZXRob2RzKS4gPC9saT4KKzxsaT5UaGUgdGFzayBob2xkcyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBpbiBhIGxpc3QuPC9saT4KKzxsaT5BIGZhY3RvcnkgbWV0aG9kIGluc3RhbnRpYXRlcyBhbiBvYmplY3QsIHNhdmVzIHRoZSByZWZlcmVuY2UgaW4gdGhlIGxpc3QKKyAgYW5kIHJldHVybnMgaXQgdG8gQW50IENvcmUuPC9saT4KKzxsaT5UaGUgZXhlY3V0ZSgpIG1ldGhvZCBpdGVyYXRlcyBvdmVyIHRoZSBsaXN0IGFuZCBldmFsdWF0ZXMgaXRzIHZhbHVlcy48L2xpPgorPC9vbD48L3A+Cis8cHJlIGNsYXNzPSJjb2RlIj4KK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKy4uLgorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIGlmIChtZXNzYWdlIT1udWxsKSBsb2cobWVzc2FnZSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQ9bWVzc2FnZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsgICAgICA8Yj4vLyA0PC9iPgorICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSAoTWVzc2FnZSlpdC5uZXh0KCk7CisgICAgICAgICAgICBsb2cobXNnLmdldE1zZygpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgVmVjdG9yIG1lc3NhZ2VzID0gbmV3IFZlY3RvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4vLyAyPC9iPgorCisgICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4vLyAzPC9iPgorICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIG1lc3NhZ2VzLmFkZChtc2cpOworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNZXNzYWdlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+Ly8gMTwvYj4KKyAgICAgICAgcHVibGljIE1lc3NhZ2UoKSB7fQorCisgICAgICAgIFN0cmluZyBtc2c7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1zZyhTdHJpbmcgbXNnKSB7IHRoaXMubXNnID0gbXNnOyB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXNnKCkgeyByZXR1cm4gbXNnOyB9CisgICAgfQorLi4uCis8L3ByZT4KKzxwPlRoZW4gd2UgY2FuIHVzZSB0aGUgbmV3IG5lc3RlZCBlbGVtZW50LiBCdXQgd2hlcmUgaXMgeG1sLW5hbWUgZm9yIHRoYXQgZGVmaW5lZD8KK1RoZSBtYXBwaW5nIFhNTC1uYW1lIDogY2xhc3NuYW1lIGlzIGRlZmluZWQgaW4gdGhlIGZhY3RvcnkgbWV0aG9kOgorPHR0PnB1YmxpYyA8aT5jbGFzc25hbWU8L2k+IGNyZWF0ZTxpPlhNTC1uYW1lPC9pPigpPC90dD4uIFRoZXJlZm9yZSB3ZSB3cml0ZSBpbgordGhlIGJ1aWxkZmlsZQorPHByZSBjbGFzcz0iY29kZSI+CisgICAgICAgICZsdDtoZWxsb3dvcmxkJmd0OworICAgICAgICAgICAgJmx0O21lc3NhZ2UgbXNnPSJOZXN0ZWQgRWxlbWVudCAxIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7bWVzc2FnZSBtc2c9Ik5lc3RlZCBFbGVtZW50IDIiLyZndDsKKyAgICAgICAgJmx0Oy9oZWxsb3dvcmxkJmd0OworPC9wcmU+Cis8cD5Ob3RlIHRoYXQgaWYgeW91IGNob29zZSB0byB1c2UgbWV0aG9kcyAyIG9yIDMsIHRoZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIG5lc3RlZAorZWxlbWVudCBtdXN0IGJlIGRlY2xhcmVkIGFzIDxwcmU+c3RhdGljPC9wcmU+PC9wPgorCis8YSBuYW1lPSJjb21wbGV4Ij48L2E+Cis8aDI+T3VyIHRhc2sgaW4gYSBsaXR0bGUgbW9yZSBjb21wbGV4IHZlcnNpb248L2gyPgorPHA+Rm9yIHJlY2FwaXR1bGF0aW9uIG5vdyBhIGxpdHRsZSByZWZhY3RvcmVkIGJ1aWxkZmlsZToKKzxwcmUgY2xhc3M9ImNvZGUiPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Jmd0OworJmx0O3Byb2plY3QgbmFtZT0iTXlUYXNrIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ1c2UiJmd0OworCisgICAgJmx0O3Byb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMiLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIHZhbHVlPSJjbGFzc2VzIi8mZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iRGVsZXRlIGFsbCBnZW5lcmF0ZWQgZmlsZXMiJmd0OworICAgICAgICAmbHQ7ZGVsZXRlIGRpcj0iJHtjbGFzc2VzLmRpcn0iIGZhaWxvbmVycm9yPSJmYWxzZSIvJmd0OworICAgICAgICAmbHQ7ZGVsZXRlIGZpbGU9IiR7YW50LnByb2plY3QubmFtZX0uamFyIi8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlcyB0aGUgVGFzayImZ3Q7CisgICAgICAgICZsdDtta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CisgICAgICAgICZsdDtqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249IkpBUnMgdGhlIFRhc2siIGRlcGVuZHM9ImNvbXBpbGUiJmd0OworICAgICAgICAmbHQ7amFyIGRlc3RmaWxlPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIgYmFzZWRpcj0iJHtjbGFzc2VzLmRpcn0iLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworCisgICAgJmx0O3RhcmdldCBuYW1lPSJ1c2UuaW5pdCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUYXNrZGVmIHRoZSBIZWxsb1dvcmxkLVRhc2siCisgICAgICAgICAgICBkZXBlbmRzPSJqYXIiJmd0OworICAgICAgICAmbHQ7dGFza2RlZiBuYW1lPSJoZWxsb3dvcmxkIgorICAgICAgICAgICAgICAgICBjbGFzc25hbWU9IkhlbGxvV29ybGQiCisgICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworCisgICAgJmx0O3RhcmdldCBuYW1lPSJ1c2Uud2l0aG91dCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJVc2Ugd2l0aG91dCBhbnkiCisgICAgICAgICAgICBkZXBlbmRzPSJ1c2UuaW5pdCImZ3Q7CisgICAgICAgICZsdDtoZWxsb3dvcmxkLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0idXNlLm1lc3NhZ2UiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlIHdpdGggYXR0cmlidXRlICdtZXNzYWdlJyIKKyAgICAgICAgICAgIGRlcGVuZHM9InVzZS5pbml0IiZndDsKKyAgICAgICAgJmx0O2hlbGxvd29ybGQgbWVzc2FnZT0iYXR0cmlidXRlLXRleHQiLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0idXNlLmZhaWwiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlIHdpdGggYXR0cmlidXRlICdmYWlsJyIKKyAgICAgICAgICAgIGRlcGVuZHM9InVzZS5pbml0IiZndDsKKyAgICAgICAgJmx0O2hlbGxvd29ybGQgZmFpbD0idHJ1ZSIvJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJ1c2UubmVzdGVkVGV4dCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJVc2Ugd2l0aCBuZXN0ZWQgdGV4dCIKKyAgICAgICAgICAgIGRlcGVuZHM9InVzZS5pbml0IiZndDsKKyAgICAgICAgJmx0O2hlbGxvd29ybGQmZ3Q7bmVzdGVkLXRleHQmbHQ7L2hlbGxvd29ybGQmZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9InVzZS5uZXN0ZWRFbGVtZW50IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlVzZSB3aXRoIG5lc3RlZCAnbWVzc2FnZSciCisgICAgICAgICAgICBkZXBlbmRzPSJ1c2UuaW5pdCImZ3Q7CisgICAgICAgICZsdDtoZWxsb3dvcmxkJmd0OworICAgICAgICAgICAgJmx0O21lc3NhZ2UgbXNnPSJOZXN0ZWQgRWxlbWVudCAxIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7bWVzc2FnZSBtc2c9Ik5lc3RlZCBFbGVtZW50IDIiLyZndDsKKyAgICAgICAgJmx0Oy9oZWxsb3dvcmxkJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9InVzZSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUcnkgYWxsICh3L291dCB1c2UuZmFpbCkiCisgICAgICAgICAgICBkZXBlbmRzPSJ1c2Uud2l0aG91dCx1c2UubWVzc2FnZSx1c2UubmVzdGVkVGV4dCx1c2UubmVzdGVkRWxlbWVudCIKKyAgICAvJmd0OworCismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT4KKworQW5kIHRoZSBjb2RlIG9mIHRoZSB0YXNrOgorPHByZSBjbGFzcz0iY29kZSI+CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBUaGUgdGFzayBvZiB0aGUgdHV0b3JpYWwuCisgKiBQcmludCBhIG1lc3NhZ2Ugb3IgbGV0IHRoZSBidWlsZCBmYWlsLgorICogQHNpbmNlIDIwMDMtMDgtMTkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGQgZXh0ZW5kcyBUYXNrIHsKKworCisgICAgLyoqIFRoZSBtZXNzYWdlIHRvIHByaW50LiBBcyBhdHRyaWJ1dGUuICovCisgICAgU3RyaW5nIG1lc3NhZ2U7CisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbXNnKSB7CisgICAgICAgIG1lc3NhZ2UgPSBtc2c7CisgICAgfQorCisgICAgLyoqIFNob3VsZCB0aGUgYnVpbGQgZmFpbD8gRGVmYXVsdHMgdG8gPGk+ZmFsc2U8L2k+LiBBcyBhdHRyaWJ1dGUuICovCisgICAgYm9vbGVhbiBmYWlsID0gZmFsc2U7CisgICAgcHVibGljIHZvaWQgc2V0RmFpbChib29sZWFuIGIpIHsKKyAgICAgICAgZmFpbCA9IGI7CisgICAgfQorCisgICAgLyoqIFN1cHBvcnQgZm9yIG5lc3RlZCB0ZXh0LiAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgbWVzc2FnZSA9IHRleHQ7CisgICAgfQorCisKKyAgICAvKiogRG8gdGhlIHdvcmsuICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgLy8gaGFuZGxlIGF0dHJpYnV0ZSAnZmFpbCcKKyAgICAgICAgaWYgKGZhaWwpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbCByZXF1ZXN0ZWQuIik7CisKKyAgICAgICAgLy8gaGFuZGxlIGF0dHJpYnV0ZSAnbWVzc2FnZScgYW5kIG5lc3RlZCB0ZXh0CisgICAgICAgIGlmIChtZXNzYWdlIT1udWxsKSBsb2cobWVzc2FnZSk7CisKKyAgICAgICAgLy8gaGFuZGxlIG5lc3RlZCBlbGVtZW50cworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0PW1lc3NhZ2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IChNZXNzYWdlKWl0Lm5leHQoKTsKKyAgICAgICAgICAgIGxvZyhtc2cuZ2V0TXNnKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiogU3RvcmUgbmVzdGVkICdtZXNzYWdlJ3MuICovCisgICAgVmVjdG9yIG1lc3NhZ2VzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBuZXN0ZWQgJ21lc3NhZ2Uncy4gKi8KKyAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIG1lc3NhZ2VzLmFkZChtc2cpOworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKworICAgIC8qKiBBIG5lc3RlZCAnbWVzc2FnZScuICovCisgICAgcHVibGljIGNsYXNzIE1lc3NhZ2UgeworICAgICAgICAvLyBCZWFuIGNvbnN0cnVjdG9yCisgICAgICAgIHB1YmxpYyBNZXNzYWdlKCkge30KKworICAgICAgICAvKiogTWVzc2FnZSB0byBwcmludC4gKi8KKyAgICAgICAgU3RyaW5nIG1zZzsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TXNnKFN0cmluZyBtc2cpIHsgdGhpcy5tc2cgPSBtc2c7IH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNc2coKSB7IHJldHVybiBtc2c7IH0KKyAgICB9CisKK30KKzwvcHJlPgorCitBbmQgaXQgd29ya3M6Cis8cHJlIGNsYXNzPSJvdXRwdXQiPgorQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrJmd0O2FudAorQnVpbGRmaWxlOiBidWlsZC54bWwKKworY29tcGlsZToKKyAgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcY2xhc3NlcworICAgIFtqYXZhY10gQ29tcGlsaW5nIDEgc291cmNlIGZpbGUgdG8gQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrXGNsYXNzZXMKKworamFyOgorICAgICAgW2phcl0gQnVpbGRpbmcgamFyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcTXlUYXNrLmphcgorCit1c2UuaW5pdDoKKwordXNlLndpdGhvdXQ6CisKK3VzZS5tZXNzYWdlOgorW2hlbGxvd29ybGRdIGF0dHJpYnV0ZS10ZXh0CisKK3VzZS5uZXN0ZWRUZXh0OgorW2hlbGxvd29ybGRdIG5lc3RlZC10ZXh0CisKK3VzZS5uZXN0ZWRFbGVtZW50OgorW2hlbGxvd29ybGRdCitbaGVsbG93b3JsZF0KK1toZWxsb3dvcmxkXQorW2hlbGxvd29ybGRdCitbaGVsbG93b3JsZF0gTmVzdGVkIEVsZW1lbnQgMQorW2hlbGxvd29ybGRdIE5lc3RlZCBFbGVtZW50IDIKKwordXNlOgorCitCVUlMRCBTVUNDRVNTRlVMCitUb3RhbCB0aW1lOiAzIHNlY29uZHMKK0M6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFzayZndDthbnQgdXNlLmZhaWwKK0J1aWxkZmlsZTogYnVpbGQueG1sCisKK2NvbXBpbGU6CisKK2phcjoKKwordXNlLmluaXQ6CisKK3VzZS5mYWlsOgorCitCVUlMRCBGQUlMRUQKK0M6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFza1xidWlsZC54bWw6MzY6IEZhaWwgcmVxdWVzdGVkLgorCitUb3RhbCB0aW1lOiAxIHNlY29uZAorQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrJmd0OworPC9wcmU+CitOZXh0IHN0ZXA6IHRlc3QgLi4uCisKKworCis8YSBuYW1lPSJUZXN0aW5nVGFza3MiPjwvYT4KKzxoMj5UZXN0IHRoZSBUYXNrPC9oMj4KKzxwPldlIGhhdmUgd3JpdHRlbiBhIHRlc3QgYWxyZWFkeTogdGhlIHVzZS4qIHRhc2tzIGluIHRoZSBidWlsZGZpbGUuIEJ1dCBpdHMKK2RpZmZpY3VsdCB0byB0ZXN0IHRoYXQgYXV0b21hdGljYWxseS4gQ29tbW9uIChhbmQgaW4gQW50KSB1c2VkIGlzIEpVbml0IGZvcgordGhhdC4gRm9yIHRlc3RpbmcgdGFza3MgQW50IHByb3ZpZGVzIGEgYmFzZWNsYXNzIDx0dD5vcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0PC90dD4uCitUaGlzIGNsYXNzIGV4dGVuZHMgPHR0Pmp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTwvdHQ+IGFuZCBjYW4gdGhlcmVmb3JlIGJlIGludGVncmF0ZWQKK2ludG8gdGhlIHVuaXQgdGVzdHMuIEJ1dCB0aGlzIGNsYXNzIHByb3ZpZGVzIHNvbWUgZm9yIHRlc3RpbmcgdGFza3MgdXNlZnVsIG1ldGhvZHM6Citpbml0aWFsaXplIEFudCwgbG9hZCBhIGJ1aWxkZmlsZSwgZXhlY3V0ZSB0YXJnZXRzLAorZXhwZWN0aW5nIEJ1aWxkRXhjZXB0aW9ucyB3aXRoIGEgc3BlY2lmaWVkIHRleHQsIGV4cGVjdCBhIHNwZWNpYWwgdGV4dAoraW4gdGhlIG91dHB1dCBsb2cgLi4uIDwvcD4KKworPHA+SW4gQW50IGl0IGlzIHVzdWFsIHRoYXQgdGhlIHRlc3RjYXNlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSB0YXNrIHdpdGggYSBwcmVwZW5kaW5nCis8aT5UZXN0PC9pPiwgdGhlcmVmb3JlIHdlIHdpbGwgY3JlYXRlIGEgZmlsZSA8aT5IZWxsb1dvcmxkVGVzdC5qYXZhPC9pPi4gQmVjYXVzZSB3ZQoraGF2ZSBhIHZlcnkgc21hbGwgcHJvamVjdCB3ZSBjYW4gcHV0IHRoaXMgZmlsZSBpbnRvIDxpPnNyYzwvaT4gZGlyZWN0b3J5IChBbnQncyBvd24KK3Rlc3RjbGFzc2VzIGFyZSBpbiAvc3JjL3Rlc3RjYXNlcy8uLi4pLiBCZWNhdXNlIHdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91ciB0ZXN0cworZm9yICJoYW5kLXRlc3QiIHdlIGNhbiB1c2UgdGhhdCBmb3IgYXV0b21hdGljIHRlc3RzLCB0b28uIEJ1dCB0aGVyZSBpcyBvbmUgbGl0dGxlCitwcm9ibGVtIHdlIGhhdmUgdG8gc29sdmU6IGFsbCB0ZXN0IHN1cHBvcnRpbmcgY2xhc3NlcyBhcmUgbm90IHBhcnQgb2YgdGhlIGJpbmFyeQorZGlzdHJpYnV0aW9uIG9mIEFudC4gU28geW91IGNhbiBidWlsZCB0aGUgc3BlY2lhbCBqYXIgZmlsZSBmcm9tIHNvdXJjZSBkaXN0cm8gd2l0aAordGFyZ2V0ICJ0ZXN0LWphciIgb3IgeW91IGNhbiBkb3dubG9hZCBhIG5pZ2h0bHkgYnVpbGQgZnJvbQorPGEgaHJlZj0iaHR0cDovL2d1bXAuY292YWxlbnQubmV0L2phcnMvbGF0ZXN0L2FudC9hbnQtdGVzdHV0aWwuamFyIj4KK2h0dHA6Ly9ndW1wLmNvdmFsZW50Lm5ldC9qYXJzL2xhdGVzdC9hbnQvYW50LXRlc3R1dGlsLmphciBbNV08L2E+LjwvcD4KKworPHA+Rm9yIGV4ZWN1dGluZyB0aGUgdGVzdCBhbmQgY3JlYXRpbmcgYSByZXBvcnQgd2UgbmVlZCB0aGUgb3B0aW9uYWwgdGFza3MgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4KK2FuZCA8Y29kZT4mbHQ7anVuaXRyZXBvcnQmZ3Q7PC9jb2RlPi4gU28gd2UgYWRkIHRvIHRoZSBidWlsZGZpbGU6Cis8cHJlIGNsYXNzPSJjb2RlIj4KKy4uLgorPGZvbnQgY29sb3I9IiM5RjlGOUYiPiZsdDtwcm9qZWN0IG5hbWU9Ik15VGFzayIgYmFzZWRpcj0iLiIgPC9mb250PmRlZmF1bHQ9InRlc3QiPGZvbnQgY29sb3I9IiM5RjlGOUYiPiZndDs8L2ZvbnQ+CisuLi4KKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iYW50LnRlc3QubGliIiB2YWx1ZT0iYW50LXRlc3R1dGlsLmphciIvJmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJyZXBvcnQuZGlyIiAgIHZhbHVlPSJyZXBvcnQiLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci54bWwiICB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC94bWwiLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci5odG1sIiB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC9odG1sIi8mZ3Q7CisKKyAgICAmbHQ7cGF0aCBpZD0iY2xhc3NwYXRoLnJ1biImZ3Q7CisgICAgICAgICZsdDtwYXRoIHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvJmd0OworICAgICAgICAmbHQ7cGF0aCBsb2NhdGlvbj0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLyZndDsKKyAgICAmbHQ7L3BhdGgmZ3Q7CisKKyAgICAmbHQ7cGF0aCBpZD0iY2xhc3NwYXRoLnRlc3QiJmd0OworICAgICAgICAmbHQ7cGF0aCByZWZpZD0iY2xhc3NwYXRoLnJ1biIvJmd0OworICAgICAgICAmbHQ7cGF0aCBsb2NhdGlvbj0iJHthbnQudGVzdC5saWJ9Ii8mZ3Q7CisgICAgJmx0Oy9wYXRoJmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIiZndDsKKyAgICAgICAgJmx0O2RlbGV0ZSBmYWlsb25lcnJvcj0iZmFsc2UiIGluY2x1ZGVFbXB0eURpcnM9InRydWUiJmd0OworICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLyZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iLyZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtyZXBvcnQuZGlyfSIvJmd0OworICAgICAgICAmbHQ7L2RlbGV0ZSZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgIDxmb250IGNvbG9yPSIjOUY5RjlGIj4mbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlcyB0aGUgVGFzayImZ3Q7CisgICAgICAgICZsdDtta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CisgICAgICAgICZsdDtqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiA8L2ZvbnQ+Y2xhc3NwYXRoPSIke2FudC50ZXN0LmxpYn0iPGZvbnQgY29sb3I9IiM5RjlGOUYiPi8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7PC9mb250PgorLi4uCisgICAgJmx0O3RhcmdldCBuYW1lPSJqdW5pdCIgZGVzY3JpcHRpb249IlJ1bnMgdGhlIHVuaXQgdGVzdHMiIGRlcGVuZHM9ImphciImZ3Q7CisgICAgICAgICZsdDtkZWxldGUgZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSIvJmd0OworICAgICAgICAmbHQ7bWtkaXIgIGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iLyZndDsKKyAgICAgICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyImZ3Q7CisgICAgICAgICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgudGVzdCIvJmd0OworICAgICAgICAgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJ4bWwiLyZndDsKKyAgICAgICAgICAgICZsdDtiYXRjaHRlc3QgZm9yaz0ieWVzIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iJmd0OworICAgICAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IioqLypUZXN0LmphdmEiLyZndDsKKyAgICAgICAgICAgICZsdDsvYmF0Y2h0ZXN0Jmd0OworICAgICAgICAmbHQ7L2p1bml0Jmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJqdW5pdHJlcG9ydCIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIHJlcG9ydCBmb3IgdGhlIHJlc3QgcmVzdWx0IiZndDsKKyAgICAgICAgJmx0O21rZGlyIGRpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9Ii8mZ3Q7CisgICAgICAgICZsdDtqdW5pdHJlcG9ydCB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9IiZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iJmd0OworICAgICAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioueG1sIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICAgICAgICAgICAmbHQ7cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9Ii8mZ3Q7CisgICAgICAgICZsdDsvanVuaXRyZXBvcnQmZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9InRlc3QiCisgICAgICAgICAgICBkZXBlbmRzPSJqdW5pdCxqdW5pdHJlcG9ydCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHVuaXQgdGVzdHMgYW5kIGNyZWF0ZXMgYSByZXBvcnQiCisgICAgLyZndDsKKy4uLgorPC9wcmU+PC9wPgorCis8cD5CYWNrIHRvIHRoZSA8aT5zcmMvSGVsbG9Xb3JsZFRlc3QuamF2YTwvaT4uIFdlIGNyZWF0ZSBhIGNsYXNzIGV4dGVuZGluZworPGk+QnVpbGRGaWxlVGVzdDwvaT4gd2l0aCBTdHJpbmctY29uc3RydWN0b3IgKEpVbml0LXN0YW5kYXJkKSwgYSA8aT5zZXRVcCgpPC9pPgorbWV0aG9kIGluaXRpYWxpemluZyBBbnQgYW5kIGZvciBlYWNoIHRlc3RjYXNlICh0YXJnZXRzIHVzZS4qKSBhIDxpPnRlc3RYWCgpPC9pPgorbWV0aG9kIGludm9raW5nIHRoYXQgdGFyZ2V0LgorPHByZSBjbGFzcz0iY29kZSI+CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworcHVibGljIGNsYXNzIEhlbGxvV29ybGRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgSGVsbG9Xb3JsZFRlc3QoU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIC8vIGluaXRpYWxpemUgQW50CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoImJ1aWxkLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ1c2Uud2l0aG91dCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1lc3NhZ2Ugd2FzIGxvZ2dlZCBidXQgc2hvdWxkIG5vdC4iLCBnZXRMb2coKSwgIiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlKCkgeworICAgICAgICAvLyBleGVjdXRlIHRhcmdldCAndXNlLm5lc3RlZFRleHQnIGFuZCBleHBlY3QgYSBtZXNzYWdlCisgICAgICAgIC8vICdhdHRyaWJ1dGUtdGV4dCcgaW4gdGhlIGxvZworICAgICAgICBleHBlY3RMb2coInVzZS5tZXNzYWdlIiwgImF0dHJpYnV0ZS10ZXh0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZhaWwoKSB7CisgICAgICAgIC8vIGV4ZWN1dGUgdGFyZ2V0ICd1c2UuZmFpbCcgYW5kIGV4cGVjdCBhIEJ1aWxkRXhjZXB0aW9uCisgICAgICAgIC8vIHdpdGggdGV4dCAnRmFpbCByZXF1ZXN0ZWQuJworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidXNlLmZhaWwiLCAiRmFpbCByZXF1ZXN0ZWQuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZFRleHQoKSB7CisgICAgICAgIGV4cGVjdExvZygidXNlLm5lc3RlZFRleHQiLCAibmVzdGVkLXRleHQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkRWxlbWVudCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidXNlLm5lc3RlZEVsZW1lbnQiKTsKKyAgICAgICAgYXNzZXJ0TG9nQ29udGFpbmluZygiTmVzdGVkIEVsZW1lbnQgMSIpOworICAgICAgICBhc3NlcnRMb2dDb250YWluaW5nKCJOZXN0ZWQgRWxlbWVudCAyIik7CisgICAgfQorfQorPC9wcmU+PC9wPgorCis8cD5XaGVuIHN0YXJ0aW5nIDx0dD5hbnQ8L3R0PiB3ZSdsbCBnZXQgYSBzaG9ydCBtZXNzYWdlIHRvIFNURE9VVCBhbmQKK2EgbmljZSBIVE1MLXJlcG9ydC4KKzxwcmUgY2xhc3M9Im91dHB1dCI+CitDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2smZ3Q7YW50CitCdWlsZGZpbGU6IGJ1aWxkLnhtbAorCitjb21waWxlOgorICAgIFtta2Rpcl0gQ3JlYXRlZCBkaXI6IEM6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFza1xjbGFzc2VzCisgICAgW2phdmFjXSBDb21waWxpbmcgMiBzb3VyY2UgZmlsZXMgdG8gQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrXGNsYXNzZXMKKworamFyOgorICAgICAgW2phcl0gQnVpbGRpbmcgamFyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcTXlUYXNrLmphcgorCitqdW5pdDoKKyAgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tccmVwb3J0XGp1bml0XHhtbAorICAgIFtqdW5pdF0gUnVubmluZyBIZWxsb1dvcmxkVGVzdAorICAgIFtqdW5pdF0gVGVzdHMgcnVuOiA1LCBGYWlsdXJlczogMCwgRXJyb3JzOiAwLCBUaW1lIGVsYXBzZWQ6IDIsMzM0IHNlYworCisKKworanVuaXRyZXBvcnQ6CisgICAgW21rZGlyXSBDcmVhdGVkIGRpcjogQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrXHJlcG9ydFxqdW5pdFxodG1sCitbanVuaXRyZXBvcnRdIFVzaW5nIFhhbGFuIHZlcnNpb246IFhhbGFuIEphdmEgMi40LjEKK1tqdW5pdHJlcG9ydF0gVHJhbnNmb3JtIHRpbWU6IDY2MW1zCisKK3Rlc3Q6CisKK0JVSUxEIFNVQ0NFU1NGVUwKK1RvdGFsIHRpbWU6IDcgc2Vjb25kcworQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrJmd0OworPC9wcmU+PC9wPgorCisKKzxhIG5hbWU9InJlc291cmNlcyI+PC9hPgorPGgyPlJlc291cmNlczwvaDI+Cis8cD5UaGlzIHR1dG9yaWFsIGFuZCBpdHMgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgdmlhCis8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTIyNTcwIj5CdWdaaWxsYSBbNl08L2E+LgorVGhlIFpJUCBwcm92aWRlZCB0aGVyZSBjb250YWluczx1bD4KKzxsaT50aGlzIHR1dG9yaWFsPC9saT4KKzxsaT50aGUgYnVpbGRmaWxlIChsYXN0IHZlcnNpb24pPC9saT4KKzxsaT50aGUgc291cmNlIG9mIHRoZSB0YXNrIChsYXN0IHZlcnNpb24pPC9saT4KKzxsaT50aGUgc291cmNlIG9mIHRoZSB1bml0IHRlc3QgKGxhc3QgdmVyc2lvbik8L2xpPgorPGxpPnRoZSBhbnQtdGVzdHV0aWwuamFyIChuaWdodGx5IGJ1aWxkIG9mIDIwMDMtMDgtMTgpPC9saT4KKzxsaT5nZW5lcmF0ZWQgY2xhc3NlczwvbGk+Cis8bGk+Z2VuZXJhdGVkIGphcjwvbGk+Cis8bGk+Z2VuZXJhdGVkIHJlcG9ydHM8L2xpPgorPC91bD4KK1RoZSBsYXN0IHNvdXJjZXMgYW5kIHRoZSBidWlsZGZpbGUgYXJlIGFsc28gYXZhaWxhYmxlCis8YSBocmVmPSJ0dXRvcmlhbC13cml0aW5nLXRhc2tzLXNyYy56aXAiPmhlcmUgWzddPC9hPiBpbnNpZGUgdGhlIG1hbnVhbC4KKzwvcD4KKworCitVc2VkIExpbmtzOjxicj4KKyZuYnNwOyZuYnNwO1sxXSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYnVpbHQtaW4tcHJvcHMiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNidWlsdC1pbi1wcm9wczwvYT48YnI+CismbmJzcDsmbmJzcDtbMl0gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvdGFza2RlZi5odG1sIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL0NvcmVUYXNrcy90YXNrZGVmLmh0bWw8L2E+PGJyPgorJm5ic3A7Jm5ic3A7WzNdIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sI3NldC1tYWdpYyI+aHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwjc2V0LW1hZ2ljPC9hPjxicj4KKyZuYnNwOyZuYnNwO1s0XSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RldmVsb3AuaHRtbCNuZXN0ZWQtZWxlbWVudHMiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sI25lc3RlZC1lbGVtZW50czwvYT48YnI+CismbmJzcDsmbmJzcDtbNV0gPGEgaHJlZj0iaHR0cDovL2d1bXAuY292YWxlbnQubmV0L2phcnMvbGF0ZXN0L2FudC9hbnQtdGVzdHV0aWwuamFyIj5odHRwOi8vZ3VtcC5jb3ZhbGVudC5uZXQvamFycy9sYXRlc3QvYW50L2FudC10ZXN0dXRpbC5qYXI8L2E+PGJyPgorJm5ic3A7Jm5ic3A7WzZdIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjI1NzAiPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjI1NzA8L2E+PGJyPgorJm5ic3A7Jm5ic3A7WzddIDxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3Mtc3JjLnppcCI+dHV0b3JpYWwtd3JpdGluZy10YXNrcy1zcmMuemlwPC9hPjxicj4KKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFscy5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvdHV0b3JpYWxzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzNmJlYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL3R1dG9yaWFscy5odG1sCkBAIC0wLDAgKzEsNDUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KKzx0aXRsZT5UdXRvcmlhbHM8L3RpdGxlPgorPGJhc2UgdGFyZ2V0PSJtYWluRnJhbWUiLz4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj48YSBocmVmPSJ0b2MuaHRtbCIgdGFyZ2V0PSJuYXZGcmFtZSI+VGFibGUgb2YgQ29udGVudHM8L2E+PC9oMj4KKworPGgzPlR1dG9yaWFsczwvaDM+CisKKzxwPjxhIGhyZWY9InR1dG9yaWFsLUhlbGxvV29ybGRXaXRoQW50Lmh0bWwiPkhlbGxvIFdvcmxkIHdpdGggQW50PC9hPjxici8+CitBIHN0ZXAgYnkgc3RlcCB0dXRvcmlhbCBmb3Igc3RhcnRpbmcgamF2YSBwcm9ncmFtbWluZyB3aXRoIEFudC48L3A+CisKKzxwPjxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbCI+V3JpdGluZyBUYXNrczwvYT48YnIvPgorQSBzdGVwIGJ5IHN0ZXAgdHV0b3JpYWwgZm9yIHdyaXRpbmcgdGFza3MuPC9wPgorCis8cD48YSBocmVmPSJ0dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLmh0bWwiPlRhc2tzIHVzaW5nIFByb3BlcnRpZXMsIEZpbGVzZXRzICZhbXA7IFBhdGhzPC9hPjxici8+CitIb3cgdG8gZ2V0IGFuZCBzZXQgcHJvcGVydGllcyBhbmQgaG93IHRvIHVzZSBuZXN0ZWQgZmlsZXNldHMgYW5kIHBhdGhzIAord2hpbGUgd3JpdGluZyB0YXNrcy4gRmluYWxseSBpdCBleHBsYWlucyBob3cgdG8gY29udHJpYnV0ZSB0YXNrcyB0byBBbnQuPC9wPgorCisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9tYW51YWwvdXNpbmcuaHRtbCBiL3RydW5rL2RvY3MvbWFudWFsL3VzaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwZjU2YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL3VzaW5nLmh0bWwKQEAgLTAsMCArMSw3MjIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+V3JpdGluZyBhIFNpbXBsZSBCdWlsZGZpbGU8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMT5Vc2luZyBBbnQ8L2gxPgorPGgyPjxhIG5hbWU9ImJ1aWxkZmlsZSI+V3JpdGluZyBhIFNpbXBsZSBCdWlsZGZpbGU8L2E+PC9oMj4KKzxwPkFudCdzIGJ1aWxkZmlsZXMgYXJlIHdyaXR0ZW4gaW4gWE1MLiBFYWNoIGJ1aWxkZmlsZSBjb250YWlucyBvbmUgcHJvamVjdAorYW5kIGF0IGxlYXN0IG9uZSAoZGVmYXVsdCkgdGFyZ2V0LiBUYXJnZXRzIGNvbnRhaW4gdGFzayBlbGVtZW50cy4KK0VhY2ggdGFzayBlbGVtZW50IG9mIHRoZSBidWlsZGZpbGUgY2FuIGhhdmUgYW4gPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSBhbmQKK2NhbiBsYXRlciBiZSByZWZlcnJlZCB0byBieSB0aGUgdmFsdWUgc3VwcGxpZWQgdG8gdGhpcy4gVGhlIHZhbHVlIGhhcwordG8gYmUgdW5pcXVlLiAoRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHNlZSB0aGUKKzxhIGhyZWY9IiN0YXNrcyI+IFRhc2tzPC9hPiBzZWN0aW9uIGJlbG93Lik8L3A+Cis8aDM+PGEgbmFtZT0icHJvamVjdHMiPlByb2plY3RzPC9hPjwvaDM+Cis8cD5BIDxpPnByb2plY3Q8L2k+IGhhcyB0aHJlZSBhdHRyaWJ1dGVzOjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIHByb2plY3QuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGVmYXVsdCB0YXJnZXQgdG8gdXNlIHdoZW4gbm8gdGFyZ2V0IGlzIHN1cHBsaWVkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgaG93ZXZlciwgPGI+c2luY2UgQW50IDEuNi4wPC9iPiwKKyAgICAgICAgZXZlcnkgcHJvamVjdCBpbmNsdWRlcyBhbiBpbXBsaWNpdCB0YXJnZXQgdGhhdCBjb250YWlucyBhbnkgYW5kCisgICAgICAgIGFsbCB0b3AtbGV2ZWwgdGFza3MgYW5kL29yIHR5cGVzLiBUaGlzIHRhcmdldCB3aWxsIGFsd2F5cyBiZQorICAgICAgICBleGVjdXRlZCBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0J3MgaW5pdGlhbGl6YXRpb24sIGV2ZW4gd2hlbiBBbnQgaXMKKyAgICAgICAgcnVuIHdpdGggdGhlIDxhIGhyZWY9InJ1bm5pbmcuaHRtbCNvcHRpb25zIj4tcHJvamVjdGhlbHA8L2E+IG9wdGlvbi4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBiYXNlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGFsbCBwYXRoIGNhbGN1bGF0aW9ucyBhcmUKKyAgICAgIGRvbmUuIFRoaXMgYXR0cmlidXRlIG1pZ2h0IGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZworICAgICAgdGhlICZxdW90O2Jhc2VkaXImcXVvdDsKKyAgICAgIHByb3BlcnR5IGJlZm9yZWhhbmQuIFdoZW4gdGhpcyBpcyBkb25lLCBpdCBtdXN0IGJlIG9taXR0ZWQgaW4gdGhlCisgICAgICBwcm9qZWN0IHRhZy4gSWYgbmVpdGhlciB0aGUgYXR0cmlidXRlIG5vciB0aGUgcHJvcGVydHkgaGF2ZQorICAgICAgYmVlbiBzZXQsIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBidWlsZGZpbGUgd2lsbCBiZSB1c2VkLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+T3B0aW9uYWxseSwgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIHByb2plY3QgY2FuIGJlIHByb3ZpZGVkIGFzIGEKK3RvcC1sZXZlbCA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IChzZWUgdGhlIDxhCitocmVmPSJDb3JlVHlwZXMvZGVzY3JpcHRpb24uaHRtbCI+ZGVzY3JpcHRpb248L2E+IHR5cGUpLjwvcD4KKworPHA+RWFjaCBwcm9qZWN0IGRlZmluZXMgb25lIG9yIG1vcmUgPGk+dGFyZ2V0czwvaT4uCitBIHRhcmdldCBpcyBhIHNldCBvZiA8aT50YXNrczwvaT4geW91IHdhbnQKK3RvIGJlIGV4ZWN1dGVkLiBXaGVuIHN0YXJ0aW5nIEFudCwgeW91IGNhbiBzZWxlY3Qgd2hpY2ggdGFyZ2V0KHMpIHlvdQord2FudCB0byBoYXZlIGV4ZWN1dGVkLiBXaGVuIG5vIHRhcmdldCBpcyBnaXZlbiwKK3RoZSBwcm9qZWN0J3MgZGVmYXVsdCBpcyB1c2VkLjwvcD4KKworPGgzPjxhIG5hbWU9InRhcmdldHMiPlRhcmdldHM8L2E+PC9oMz4KKzxwPkEgdGFyZ2V0IGNhbiBkZXBlbmQgb24gb3RoZXIgdGFyZ2V0cy4gWW91IG1pZ2h0IGhhdmUgYSB0YXJnZXQgZm9yIGNvbXBpbGluZywKK2ZvciBleGFtcGxlLCBhbmQgYSB0YXJnZXQgZm9yIGNyZWF0aW5nIGEgZGlzdHJpYnV0YWJsZS4gWW91IGNhbiBvbmx5IGJ1aWxkIGEKK2Rpc3RyaWJ1dGFibGUgd2hlbiB5b3UgaGF2ZSBjb21waWxlZCBmaXJzdCwgc28gdGhlIGRpc3RyaWJ1dGUgdGFyZ2V0Cis8aT5kZXBlbmRzIG9uPC9pPiB0aGUgY29tcGlsZSB0YXJnZXQuIEFudCByZXNvbHZlcyB0aGVzZSBkZXBlbmRlbmNpZXMuPC9wPgorPHA+SXQgc2hvdWxkIGJlIG5vdGVkLCBob3dldmVyLCB0aGF0IEFudCdzIDxjb2RlPmRlcGVuZHM8L2NvZGU+IGF0dHJpYnV0ZQorb25seSBzcGVjaWZpZXMgdGhlIDxpPm9yZGVyPC9pPiBpbiB3aGljaCB0YXJnZXRzIHNob3VsZCBiZSBleGVjdXRlZCAtIGl0Citkb2VzIG5vdCBhZmZlY3Qgd2hldGhlciB0aGUgdGFyZ2V0IHRoYXQgc3BlY2lmaWVzIHRoZSBkZXBlbmRlbmN5KHMpIGdldHMKK2V4ZWN1dGVkIGlmIHRoZSBkZXBlbmRlbnQgdGFyZ2V0KHMpIGRpZCBub3QgKG5lZWQgdG8pIHJ1bi4KKzwvcD4KKzxwPkFudCB0cmllcyB0byBleGVjdXRlIHRoZSB0YXJnZXRzIGluIHRoZSA8Y29kZT5kZXBlbmRzPC9jb2RlPgorYXR0cmlidXRlIGluIHRoZSBvcmRlcgordGhleSBhcHBlYXIgKGZyb20gbGVmdCB0byByaWdodCkuIEtlZXAgaW4gbWluZCB0aGF0IGl0IGlzIHBvc3NpYmxlIHRoYXQgYSB0YXJnZXQKK2NhbiBnZXQgZXhlY3V0ZWQgZWFybGllciB3aGVuIGFuIGVhcmxpZXIgdGFyZ2V0IGRlcGVuZHMgb24gaXQ6PC9wPgorPGJsb2NrcXVvdGU+Cis8cHJlPiZsdDt0YXJnZXQgbmFtZT0mcXVvdDtBJnF1b3Q7LyZndDsKKyZsdDt0YXJnZXQgbmFtZT0mcXVvdDtCJnF1b3Q7IGRlcGVuZHM9JnF1b3Q7QSZxdW90Oy8mZ3Q7CismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7QyZxdW90OyBkZXBlbmRzPSZxdW90O0ImcXVvdDsvJmd0OworJmx0O3RhcmdldCBuYW1lPSZxdW90O0QmcXVvdDsgZGVwZW5kcz0mcXVvdDtDLEIsQSZxdW90Oy8mZ3Q7PC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cis8cD5TdXBwb3NlIHdlIHdhbnQgdG8gZXhlY3V0ZSB0YXJnZXQgRC4gRnJvbSBpdHMKKzxjb2RlPmRlcGVuZHM8L2NvZGU+IGF0dHJpYnV0ZSwgeW91CittaWdodCB0aGluayB0aGF0IGZpcnN0IHRhcmdldCBDLCB0aGVuIEIgYW5kIHRoZW4gQSBpcyBleGVjdXRlZC4KK1dyb25nISBDIGRlcGVuZHMgb24gQiwgYW5kIEIgZGVwZW5kcyBvbiBBLCBzbyBmaXJzdCBBIGlzIGV4ZWN1dGVkLCB0aGVuIEIsIHRoZW4gQywgYW5kIGZpbmFsbHkgRC48L3A+Cis8cD5JbiBhIGNoYWluIG9mIGRlcGVuZGVuY2llcyBzdHJldGNoaW5nIGJhY2sgZnJvbSBhIGdpdmVuIHRhcmdldCBzdWNoCithcyBEIGFib3ZlLCBlYWNoIHRhcmdldCBnZXRzIGV4ZWN1dGVkIG9ubHkgb25jZSwgZXZlbiB3aGVuIG1vcmUgdGhhbgorb25lIHRhcmdldCBkZXBlbmRzIG9uIGl0LiBUaHVzLCBleGVjdXRpbmcgdGhlIEQgdGFyZ2V0IHdpbGwgZmlyc3QKK3Jlc3VsdCBpbiBDIGJlaW5nIGNhbGxlZCwgd2hpY2ggaW4gdHVybiB3aWxsIGZpcnN0IGNhbGwgQiwgd2hpY2ggaW4KK3R1cm4gd2lsbCBmaXJzdCBjYWxsIEEuIEFmdGVyIEEsIHRoZW4gQiwgdGhlbiBDIGhhdmUgZXhlY3V0ZWQsCitleGVjdXRpb24gcmV0dXJucyB0byB0aGUgZGVwZW5kZW5jeSBsaXN0IG9mIEQsIHdoaWNoIHdpbGwgPHU+bm90PC91PgorY2FsbCBCIGFuZCBBLCBzaW5jZSB0aGV5IHdlcmUgYWxyZWFkeSBjYWxsZWQgaW4gcHJvY2VzcyBvZiBkZXBlbmRlbmN5CityZXNvbHV0aW9uIGZvciBDIGFuZCBCIHJlc3BlY3RpdmVseSBhcyBkZXBlbmRlbmNpZXMgb2YgRC4gSGFkIG5vIHN1Y2gKK2RlcGVuZGVuY2llcyBiZWVuIGRpc2NvdmVyZWQgaW4gcHJvY2Vzc2luZyBDIGFuZCBCLCBCIGFuZCBBIHdvdWxkCitoYXZlIGJlZW4gZXhlY3V0ZWQgYWZ0ZXIgQyBpbiBwcm9jZXNzaW5nIEQncyBkZXBlbmRlbmN5IGxpc3QuPC9wPgorPHA+QSB0YXJnZXQgYWxzbyBoYXMgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBpdHMgZXhlY3V0aW9uIGlmIChvcgordW5sZXNzKSBhIHByb3BlcnR5IGhhcyBiZWVuIHNldC4gVGhpcyBhbGxvd3MsIGZvciBleGFtcGxlLCBiZXR0ZXIKK2NvbnRyb2wgb24gdGhlIGJ1aWxkaW5nIHByb2Nlc3MgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtCisoamF2YSB2ZXJzaW9uLCBPUywgY29tbWFuZC1saW5lIHByb3BlcnR5IGRlZmluZXMsIGV0Yy4pLiAgVG8gbWFrZSBhIHRhcmdldAorPGk+c2Vuc2U8L2k+IHRoaXMgcHJvcGVydHksIHlvdSBzaG91bGQgYWRkIHRoZSA8Y29kZT5pZjwvY29kZT4gKG9yCis8Y29kZT51bmxlc3M8L2NvZGU+KSBhdHRyaWJ1dGUgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB0aGUgdGFyZ2V0CitzaG91bGQgcmVhY3QgdG8uIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gQW50IHdpbGwgb25seSBjaGVjayB3aGV0aGVyCit0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0LCB0aGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIuICBBIHByb3BlcnR5IHNldAordG8gdGhlIGVtcHR5IHN0cmluZyBpcyBzdGlsbCBhbiBleGlzdGluZyBwcm9wZXJ0eS4gIEZvciBleGFtcGxlOjwvcD4KKzxibG9ja3F1b3RlPgorICA8cHJlPiZsdDt0YXJnZXQgbmFtZT0mcXVvdDtidWlsZC1tb2R1bGUtQSZxdW90OyBpZj0mcXVvdDttb2R1bGUtQS1wcmVzZW50JnF1b3Q7LyZndDs8L3ByZT4KKyAgPHByZT4mbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7YnVpbGQtb3duLWZha2UtbW9kdWxlLUEmcXVvdDsgdW5sZXNzPSZxdW90O21vZHVsZS1BLXByZXNlbnQmcXVvdDsvJmd0OzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+SW4gdGhlIGZpcnN0IGV4YW1wbGUsIGlmIHRoZSA8Y29kZT5tb2R1bGUtQS1wcmVzZW50PC9jb2RlPgorcHJvcGVydHkgaXMgc2V0ICh0byBhbnkgdmFsdWUsIGUuZy4gPGk+ZmFsc2U8L2k+KSwgdGhlIHRhcmdldCB3aWxsIGJlIHJ1bi4gSW4gdGhlIHNlY29uZAorZXhhbXBsZSwgaWYgdGhlIDxjb2RlPm1vZHVsZS1BLXByZXNlbnQ8L2NvZGU+IHByb3BlcnR5IGlzIHNldAorKGFnYWluLCB0byBhbnkgdmFsdWUpLCB0aGUgdGFyZ2V0IHdpbGwgbm90IGJlIHJ1bi4KKzwvcD4KKzxwPk9ubHkgb25lIHByb3BlcnR5bmFtZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBpZi91bmxlc3MgY2xhdXNlLiBJZiB5b3Ugd2FudCB0byBjaGVjaworbXVsdGlwbGUgY29uZGl0aW9ucywgeW91IGNhbiB1c2UgYSBkZXBlbmRlbmQgdGFyZ2V0IGZvciBjb21wdXRpbmcgdGhlIHJlc3VsdCBmb3IgdGhlIGNoZWNrOjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7dGFyZ2V0IG5hbWU9Im15VGFyZ2V0IiBkZXBlbmRzPSJteVRhcmdldC5jaGVjayIgaWY9Im15VGFyZ2V0LnJ1biImZ3Q7CisgICAgJmx0O2VjaG8mZ3Q7RmlsZXMgZm9vLnR4dCBhbmQgYmFyLnR4dCBhcmUgcHJlc2VudC4mbHQ7L2VjaG8mZ3Q7CismbHQvdGFyZ2V0Jmd0OworCismbHQ7dGFyZ2V0IG5hbWU9Im15VGFyZ2V0LmNoZWNrIiZndDsKKyAgICAmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSJteVRhcmdldC5ydW4iJmd0OworICAgICAgICAmbHQ7YW5kJmd0OworICAgICAgICAgICAgJmx0O2F2YWlsYWJsZSBmaWxlPSJmb28udHh0Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7YXZhaWxhYmxlIGZpbGU9ImJhci50eHQiLyZndDsKKyAgICAgICAgJmx0Oy9hbmQmZ3Q7CisgICAgJmx0Oy9jb25kaXRpb24mZ3Q7CismbHQvdGFyZ2V0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+SWYgbm8gPGNvZGU+aWY8L2NvZGU+IGFuZCBubyA8Y29kZT51bmxlc3M8L2NvZGU+IGF0dHJpYnV0ZSBpcyBwcmVzZW50LAordGhlIHRhcmdldCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZC48L3A+CisKKzxwPgorPGI+SW1wb3J0YW50OjwvYj4gdGhlIDxjb2RlPmlmPC9jb2RlPiBhbmQgPGNvZGU+dW5sZXNzPC9jb2RlPiBhdHRyaWJ1dGVzIG9ubHkKK2VuYWJsZSBvciBkaXNhYmxlIHRoZSB0YXJnZXQgdG8gd2hpY2ggdGhleSBhcmUgYXR0YWNoZWQuIFRoZXkgZG8gbm90IGNvbnRyb2wKK3doZXRoZXIgb3Igbm90IHRhcmdldHMgdGhhdCBhIGNvbmRpdGlvbmFsIHRhcmdldCBkZXBlbmRzIHVwb24gZ2V0IGV4ZWN1dGVkLgorSW4gZmFjdCwgdGhleSBkbyBub3QgZXZlbiBnZXQgZXZhbHVhdGVkIHVudGlsIHRoZSB0YXJnZXQgaXMgYWJvdXQgdG8gYmUgZXhlY3V0ZWQsCithbmQgYWxsIGl0cyBwcmVkZWNlc3NvcnMgaGF2ZSBhbHJlYWR5IHJ1bi4KKworPHA+VGhlIG9wdGlvbmFsIDxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPiBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoaXMgdGFyZ2V0LCB3aGljaCBpcyBwcmludGVkIGJ5IHRoZQorPG5vYnI+PGNvZGU+LXByb2plY3RoZWxwPC9jb2RlPjwvbm9icj4gY29tbWFuZC1saW5lIG9wdGlvbi4gVGFyZ2V0cword2l0aG91dCBzdWNoIGEgZGVzY3JpcHRpb24gYXJlIGRlZW1lZCBpbnRlcm5hbCBhbmQgd2lsbCBub3QgYmUgbGlzdGVkLAordW5sZXNzIGVpdGhlciB0aGUgPG5vYnI+PGNvZGU+LXZlcmJvc2U8L2NvZGU+PC9ub2JyPiBvcgorPG5vYnI+PGNvZGU+LWRlYnVnPC9jb2RlPjwvbm9icj4gb3B0aW9uIGlzIHVzZWQuCis8L3A+Cis8cD5JdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gcGxhY2UgeW91ciA8YQoraHJlZj0iQ29yZVRhc2tzL3RzdGFtcC5odG1sIj50c3RhbXA8L2E+IHRhc2tzIGluIGEgc28tY2FsbGVkCis8aT5pbml0aWFsaXphdGlvbjwvaT4gdGFyZ2V0LCBvbiB3aGljaAorYWxsIG90aGVyIHRhcmdldHMgZGVwZW5kLiBNYWtlIHN1cmUgdGhhdCB0YXJnZXQgaXMgYWx3YXlzIHRoZSBmaXJzdCBvbmUgaW4KK3RoZSBkZXBlbmRzIGxpc3Qgb2YgdGhlIG90aGVyIHRhcmdldHMuIEluIHRoaXMgbWFudWFsLCBtb3N0IGluaXRpYWxpemF0aW9uIHRhcmdldHMKK2hhdmUgdGhlIG5hbWUgPGNvZGU+JnF1b3Q7aW5pdCZxdW90OzwvY29kZT4uPC9wPgorPHA+SWYgdGhlIGRlcGVuZHMgYXR0cmlidXRlIGFuZCB0aGUgaWYvdW5sZXNzIGF0dHJpYnV0ZSBhcmUgc2V0LCB0aGUgZGVwZW5kcyBhdHRyaWJ1dGUgaXMKK2V4ZWN1dGVkIGZpcnN0LjwvcD4KKzxwPkEgdGFyZ2V0IGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXBlbmRzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbmFtZXMgb2YgdGFyZ2V0cyBvbiB3aGljaCB0aGlzCisgICAgICB0YXJnZXQgZGVwZW5kcy48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5pZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBtdXN0IGJlIHNldCBpbiBvcmRlciBmb3IgdGhpcworICAgICAgdGFyZ2V0IHRvIGV4ZWN1dGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dW5sZXNzPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IG11c3Qgbm90IGJlIHNldCBpbiBvcmRlcgorICAgICAgZm9yIHRoaXMgdGFyZ2V0IHRvIGV4ZWN1dGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzY3JpcHRpb248L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+YSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGlzIHRhcmdldCdzIGZ1bmN0aW9uLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPC9wPgorCis8cD5BIHRhcmdldCBuYW1lIGNhbiBiZSBhbnkgYWxwaGFudW1lcmljIHN0cmluZyB2YWxpZCBpbiB0aGUgZW5jb2Rpbmcgb2YgdGhlIFhNTAorZmlsZS4gVGhlIGVtcHR5IHN0cmluZyAmcXVvdDsmcXVvdDsgaXMgaW4gdGhpcyBzZXQsIGFzIGlzCitjb21tYSAmcXVvdDssJnF1b3Q7IGFuZCBzcGFjZSAmcXVvdDsgJnF1b3Q7LgorUGxlYXNlIGF2b2lkIHVzaW5nIHRoZXNlLCBhcyB0aGV5IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgQW50IHZlcnNpb25zCitiZWNhdXNlIG9mIGFsbCB0aGUgY29uZnVzaW9uIHRoZXkgY2F1c2UuIElERSBzdXBwb3J0IG9mIHVudXN1YWwgdGFyZ2V0IG5hbWVzLAorb3IgYW55IHRhcmdldCBuYW1lIGNvbnRhaW5pbmcgc3BhY2VzLCB2YXJpZXMgd2l0aCB0aGUgSURFLjwvcD4KKworPHA+VGFyZ2V0cyBiZWdpbm5pbmcgd2l0aCBhIGh5cGhlbiBzdWNoIGFzIDxjb2RlPiZxdW90Oy1yZXN0YXJ0JnF1b3Q7PC9jb2RlPgorYXJlIHZhbGlkLCBhbmQgY2FuIGJlIHVzZWQKK3RvIG5hbWUgdGFyZ2V0cyB0aGF0IHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZS48L3A+CisKKzxoMz48YSBuYW1lPSJ0YXNrcyI+VGFza3M8L2E+PC9oMz4KKzxwPkEgdGFzayBpcyBhIHBpZWNlIG9mIGNvZGUgdGhhdCBjYW4gYmUgZXhlY3V0ZWQuPC9wPgorPHA+QSB0YXNrIGNhbiBoYXZlIG11bHRpcGxlIGF0dHJpYnV0ZXMgKG9yIGFyZ3VtZW50cywgaWYgeW91IHByZWZlcikuIFRoZSB2YWx1ZQorb2YgYW4gYXR0cmlidXRlIG1pZ2h0IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBhIHByb3BlcnR5LiBUaGVzZSByZWZlcmVuY2VzIHdpbGwgYmUKK3Jlc29sdmVkIGJlZm9yZSB0aGUgdGFzayBpcyBleGVjdXRlZC48L3A+Cis8cD5UYXNrcyBoYXZlIGEgY29tbW9uIHN0cnVjdHVyZTo8L3A+Cis8YmxvY2txdW90ZT4KKyAgPHByZT4mbHQ7PGk+bmFtZTwvaT4gPGk+YXR0cmlidXRlMTwvaT49JnF1b3Q7PGk+dmFsdWUxPC9pPiZxdW90OyA8aT5hdHRyaWJ1dGUyPC9pPj0mcXVvdDs8aT52YWx1ZTI8L2k+JnF1b3Q7IC4uLiAvJmd0OzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+d2hlcmUgPGk+bmFtZTwvaT4gaXMgdGhlIG5hbWUgb2YgdGhlIHRhc2ssCis8aT5hdHRyaWJ1dGVOPC9pPiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsIGFuZAorPGk+dmFsdWVOPC9pPiBpcyB0aGUgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlLjwvcD4KKzxwPlRoZXJlIGlzIGEgc2V0IG9mIDxhIGhyZWY9ImNvcmV0YXNrbGlzdC5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5idWlsdC1pbiB0YXNrczwvYT4sIGFsb25nIHdpdGggYQorbnVtYmVyIG9mCis8YSBocmVmPSJvcHRpb25hbHRhc2tsaXN0Lmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPiBvcHRpb25hbCB0YXNrczwvYT4sIGJ1dCBpdCBpcyBhbHNvIHZlcnkKK2Vhc3kgdG8gPGEgaHJlZj0iZGV2ZWxvcC5odG1sI3dyaXRpbmdvd250YXNrIj53cml0ZSB5b3VyIG93bjwvYT4uPC9wPgorPHA+QWxsIHRhc2tzIHNoYXJlIGEgdGFzayBuYW1lIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIG9mCit0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQgaW4gdGhlIGxvZ2dpbmcgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5CitBbnQuPC9wPgorVGFza3MgY2FuIGJlIGFzc2lnbmVkIGFuIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGU6Cis8YmxvY2txdW90ZT4KKzxwcmU+Jmx0OzxpPnRhc2tuYW1lPC9pPiBpZD0iPGk+dGFza0lEPC9pPiIgLi4uIC8mZ3Q7PC9wcmU+Cis8L2Jsb2NrcXVvdGU+Cit3aGVyZSA8aT50YXNrbmFtZTwvaT4gaXMgdGhlIG5hbWUgb2YgdGhlIHRhc2ssIGFuZCA8aT50YXNrSUQ8L2k+IGlzCithIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2suCitZb3UgY2FuIHJlZmVyIHRvIHRoZQorY29ycmVzcG9uZGluZyB0YXNrIG9iamVjdCBpbiBzY3JpcHRzIG9yIG90aGVyIHRhc2tzIHZpYSB0aGlzIG5hbWUuCitGb3IgZXhhbXBsZSwgaW4gc2NyaXB0cyB5b3UgY291bGQgZG86Cis8YmxvY2txdW90ZT4KKzxwcmU+CismbHQ7c2NyaXB0IC4uLiAmZ3Q7CisgIHRhc2sxLnNldEZvbygiYmFyIik7CismbHQ7L3NjcmlwdCZndDsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgordG8gc2V0IHRoZSA8Y29kZT5mb288L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGlzIHBhcnRpY3VsYXIgdGFzayBpbnN0YW5jZS4KK0luIGFub3RoZXIgdGFzayAod3JpdHRlbiBpbiBKYXZhKSwgeW91IGNhbiBhY2Nlc3MgdGhlIGluc3RhbmNlIHZpYQorPGNvZGU+cHJvamVjdC5nZXRSZWZlcmVuY2UoInRhc2sxIik8L2NvZGU+LgorPHA+CitOb3RlPHN1cD4xPC9zdXA+OiBJZiAmcXVvdDt0YXNrMSZxdW90OyBoYXMgbm90IGJlZW4gcnVuIHlldCwgdGhlbgoraXQgaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQgKGllLiwgbm8gYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0KSwgYW5kIGlmIGl0IGlzCitnb2luZyB0byBiZSBjb25maWd1cmVkIGxhdGVyLCBhbnl0aGluZyB5b3UndmUgZG9uZSB0byB0aGUgaW5zdGFuY2UgbWF5CitiZSBvdmVyd3JpdHRlbi4KKzwvcD4KKzxwPgorTm90ZTxzdXA+Mjwvc3VwPjogRnV0dXJlIHZlcnNpb25zIG9mIEFudCB3aWxsIG1vc3QgbGlrZWx5IDxpPm5vdDwvaT4KK2JlIGJhY2t3YXJkLWNvbXBhdGlibGUgd2l0aCB0aGlzIGJlaGF2aW91ciwgc2luY2UgdGhlcmUgd2lsbCBsaWtlbHkgYmUgbm8KK3Rhc2sgaW5zdGFuY2VzIGF0IGFsbCwgb25seSBwcm94aWVzLgorPC9wPgorCis8aDM+PGEgbmFtZT0icHJvcGVydGllcyI+UHJvcGVydGllczwvYT48L2gzPgorPHA+QSBwcm9qZWN0IGNhbiBoYXZlIGEgc2V0IG9mIHByb3BlcnRpZXMuIFRoZXNlIG1pZ2h0IGJlIHNldCBpbiB0aGUgYnVpbGRmaWxlCitieSB0aGUgPGEgaHJlZj0iQ29yZVRhc2tzL3Byb3BlcnR5Lmh0bWwiPnByb3BlcnR5PC9hPiB0YXNrLCBvciBtaWdodCBiZSBzZXQgb3V0c2lkZSBBbnQuIEEKK3Byb3BlcnR5IGhhcyBhIG5hbWUgYW5kIGEgdmFsdWU7IHRoZSBuYW1lIGlzIGNhc2Utc2Vuc2l0aXZlLiBQcm9wZXJ0aWVzIG1heSBiZSB1c2VkIGluIHRoZSB2YWx1ZSBvZgordGFzayBhdHRyaWJ1dGVzLiBUaGlzIGlzIGRvbmUgYnkgcGxhY2luZyB0aGUgcHJvcGVydHkgbmFtZSBiZXR3ZWVuCismcXVvdDs8Y29kZT4kezwvY29kZT4mcXVvdDsgYW5kICZxdW90Ozxjb2RlPn08L2NvZGU+JnF1b3Q7IGluIHRoZQorYXR0cmlidXRlIHZhbHVlLiBGb3IgZXhhbXBsZSwKK2lmIHRoZXJlIGlzIGEgJnF1b3Q7YnVpbGRkaXImcXVvdDsgcHJvcGVydHkgd2l0aCB0aGUgdmFsdWUKKyZxdW90O2J1aWxkJnF1b3Q7LCB0aGVuIHRoaXMgY291bGQgYmUgdXNlZCBpbiBhbiBhdHRyaWJ1dGUgbGlrZSB0aGlzOgorPGNvZGU+JHtidWlsZGRpcn0vY2xhc3NlczwvY29kZT4uCitUaGlzIGlzIHJlc29sdmVkIGF0IHJ1bi10aW1lIGFzIDxjb2RlPmJ1aWxkL2NsYXNzZXM8L2NvZGU+LjwvcD4KKzxwPkluIHRoZSBldmVudCB5b3Ugc2hvdWxkIG5lZWQgdG8gaW5jbHVkZSB0aGlzIGNvbnN0cnVjdCBsaXRlcmFsbHkKKyhpLmUuIHdpdGhvdXQgcHJvcGVydHkgc3Vic3RpdHV0aW9ucyksIHNpbXBseSAiZXNjYXBlIiB0aGUgJyQnIGNoYXJhY3RlcgorYnkgZG91YmxpbmcgaXQuIFRvIGNvbnRpbnVlIHRoZSBwcmV2aW91cyBleGFtcGxlOgorPHByZT4gICZsdDtlY2hvJmd0OyQke2J1aWxkZGlyfT0ke2J1aWxkZGlyfSZsdDsvZWNobyZndDs8L3ByZT4KK3dpbGwgZWNobyB0aGlzIG1lc3NhZ2U6Cis8cHJlPiAgJHtidWlsZGRpcn09YnVpbGQvY2xhc3NlczwvcHJlPjwvcD4KKzxwPkluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBBbnQgcmVsZWFzZXMsCithIHNpbmdsZSAnJCcgY2hhcmFjdGVyIGVuY291bnRlcmVkIGFwYXJ0IGZyb20gYSBwcm9wZXJ0eS1saWtlIGNvbnN0cnVjdAorKGluY2x1ZGluZyBhIG1hdGNoZWQgcGFpciBvZiBmcmVuY2ggYnJhY2VzKSB3aWxsIGJlIGludGVycHJldGVkIGxpdGVyYWxseTsKK3RoYXQgaXMsIGFzICckJy4gIFRoZSAiY29ycmVjdCIgd2F5IHRvIHNwZWNpZnkgdGhpcyBsaXRlcmFsIGNoYXJhY3RlciwKK2hvd2V2ZXIsIGlzIGJ5IHVzaW5nIHRoZSBlc2NhcGluZyBtZWNoYW5pc20gdW5jb25kaXRpb25hbGx5LCBzbyB0aGF0ICIkJCIKK2lzIG9idGFpbmVkIGJ5IHNwZWNpZnlpbmcgIiQkJCQiLiAgTWl4aW5nIHRoZSB0d28gYXBwcm9hY2hlcyB5aWVsZHMKK3VucHJlZGljdGFibGUgcmVzdWx0cywgYXMgIiQkJCIgcmVzdWx0cyBpbiAiJCQiLjwvcD4KKworPGgzPjxhIG5hbWU9ImJ1aWx0LWluLXByb3BzIj5CdWlsdC1pbiBQcm9wZXJ0aWVzPC9hPjwvaDM+Cis8cD5BbnQgcHJvdmlkZXMgYWNjZXNzIHRvIGFsbCBzeXN0ZW0gcHJvcGVydGllcyBhcyBpZiB0aGV5IGhhZCBiZWVuCitkZWZpbmVkIHVzaW5nIGEgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gdGFzay4KK0ZvciBleGFtcGxlLCA8Y29kZT4ke29zLm5hbWV9PC9jb2RlPiBleHBhbmRzIHRvIHRoZQorbmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS48L3A+Cis8cD5Gb3IgYSBsaXN0IG9mIHN5c3RlbSBwcm9wZXJ0aWVzIHNlZQorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2FwaS9qYXZhL2xhbmcvU3lzdGVtLmh0bWwjZ2V0UHJvcGVydGllcygpIj50aGUgSmF2YWRvYyBvZiBTeXN0ZW0uZ2V0UHJvcGVydGllczwvYT4uCis8L3A+Cis8cD5JbiBhZGRpdGlvbiwgQW50IGhhcyBzb21lIGJ1aWx0LWluIHByb3BlcnRpZXM6PC9wPgorPHByZT4KK2Jhc2VkaXIgICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHByb2plY3QncyBiYXNlZGlyIChhcyBzZXQKKyAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgYmFzZWRpciBhdHRyaWJ1dGUgb2YgPGEgaHJlZj0iI3Byb2plY3RzIj4mbHQ7cHJvamVjdCZndDspPC9hPi4KK2FudC5maWxlICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGJ1aWxkZmlsZS4KK2FudC52ZXJzaW9uICAgICAgICAgdGhlIHZlcnNpb24gb2YgQW50CithbnQucHJvamVjdC5uYW1lICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgaXMgY3VycmVudGx5IGV4ZWN1dGluZzsKKyAgICAgICAgICAgICAgICAgICAgaXQgaXMgc2V0IGluIHRoZSBuYW1lIGF0dHJpYnV0ZSBvZiAmbHQ7cHJvamVjdCZndDsuCithbnQuamF2YS52ZXJzaW9uICAgIHRoZSBKVk0gdmVyc2lvbiBBbnQgZGV0ZWN0ZWQ7IGN1cnJlbnRseSBpdCBjYW4gaG9sZAorICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWVzICZxdW90OzEuMiZxdW90OywgJnF1b3Q7MS4zJnF1b3Q7LCAmcXVvdDsxLjQmcXVvdDsgYW5kICZxdW90OzEuNSZxdW90Oy4KKzwvcHJlPgorPHA+VGhlcmUgaXMgYWxzbyBhbm90aGVyIHByb3BlcnR5LCBidXQgdGhpcyBpcyBzZXQgYnkgdGhlIGxhdW5jaGVyIHNjcmlwdCBhbmQgdGhlcmVmb3JlCittYXliZSBub3Qgc2V0IGluc2lkZSBJREVzOjwvcD4KKzxwcmU+CithbnQuaG9tZSAgICAgICAgICAgIGhvbWUgZGlyZWN0b3J5IG9mIEFudAorPC9wcmU+CisKKzxhIG5hbWU9ImV4YW1wbGUiPjxoMz5FeGFtcGxlIEJ1aWxkZmlsZTwvaDM+PC9hPgorPHByZT4KKyZsdDtwcm9qZWN0IG5hbWU9JnF1b3Q7TXlQcm9qZWN0JnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7ZGlzdCZxdW90OyBiYXNlZGlyPSZxdW90Oy4mcXVvdDsmZ3Q7CisgICAgJmx0O2Rlc2NyaXB0aW9uJmd0OworICAgICAgICBzaW1wbGUgZXhhbXBsZSBidWlsZCBmaWxlCisgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKKyAgJmx0OyEtLSBzZXQgZ2xvYmFsIHByb3BlcnRpZXMgZm9yIHRoaXMgYnVpbGQgLS0mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O3NyYyZxdW90OyBsb2NhdGlvbj0mcXVvdDtzcmMmcXVvdDsvJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtidWlsZCZxdW90OyBsb2NhdGlvbj0mcXVvdDtidWlsZCZxdW90Oy8mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2Rpc3QmcXVvdDsgIGxvY2F0aW9uPSZxdW90O2Rpc3QmcXVvdDsvJmd0OworCisgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtpbml0JnF1b3Q7Jmd0OworICAgICZsdDshLS0gQ3JlYXRlIHRoZSB0aW1lIHN0YW1wIC0tJmd0OworICAgICZsdDt0c3RhbXAvJmd0OworICAgICZsdDshLS0gQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3Rvcnkgc3RydWN0dXJlIHVzZWQgYnkgY29tcGlsZSAtLSZndDsKKyAgICAmbHQ7bWtkaXIgZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7LyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbXBpbGUmcXVvdDsgZGVwZW5kcz0mcXVvdDtpbml0JnF1b3Q7CisgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O2NvbXBpbGUgdGhlIHNvdXJjZSAmcXVvdDsgJmd0OworICAgICZsdDshLS0gQ29tcGlsZSB0aGUgamF2YSBjb2RlIGZyb20gJHtzcmN9IGludG8gJHtidWlsZH0gLS0mZ3Q7CisgICAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworCisgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtkaXN0JnF1b3Q7IGRlcGVuZHM9JnF1b3Q7Y29tcGlsZSZxdW90OworICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtnZW5lcmF0ZSB0aGUgZGlzdHJpYnV0aW9uJnF1b3Q7ICZndDsKKyAgICAmbHQ7IS0tIENyZWF0ZSB0aGUgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSAtLSZndDsKKyAgICAmbHQ7bWtkaXIgZGlyPSZxdW90OyR7ZGlzdH0vbGliJnF1b3Q7LyZndDsKKworICAgICZsdDshLS0gUHV0IGV2ZXJ5dGhpbmcgaW4gJHtidWlsZH0gaW50byB0aGUgTXlQcm9qZWN0LSR7RFNUQU1QfS5qYXIgZmlsZSAtLSZndDsKKyAgICAmbHQ7amFyIGphcmZpbGU9JnF1b3Q7JHtkaXN0fS9saWIvTXlQcm9qZWN0LSR7RFNUQU1QfS5qYXImcXVvdDsgYmFzZWRpcj0mcXVvdDske2J1aWxkfSZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworCisgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtjbGVhbiZxdW90OworICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtjbGVhbiB1cCZxdW90OyAmZ3Q7CisgICAgJmx0OyEtLSBEZWxldGUgdGhlICR7YnVpbGR9IGFuZCAke2Rpc3R9IGRpcmVjdG9yeSB0cmVlcyAtLSZndDsKKyAgICAmbHQ7ZGVsZXRlIGRpcj0mcXVvdDske2J1aWxkfSZxdW90Oy8mZ3Q7CisgICAgJmx0O2RlbGV0ZSBkaXI9JnF1b3Q7JHtkaXN0fSZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+CisKKzxwPk5vdGljZSB0aGF0IHdlIGFyZSBkZWNsYXJpbmcgcHJvcGVydGllcyBvdXRzaWRlIGFueSB0YXJnZXQuICBBcyBvZgorQW50IDEuNiBhbGwgdGFza3MgY2FuIGJlIGRlY2xhcmVkIG91dHNpZGUgdGFyZ2V0cyAoZWFybGllciB2ZXJzaW9uCitvbmx5IGFsbG93ZWQgPHR0PiZsdDtwcm9wZXJ0eSZndDs8L3R0Piw8dHQ+Jmx0O3R5cGVkZWYmZ3Q7PC90dD4gYW5kCis8dHQ+Jmx0O3Rhc2tkZWYmZ3Q7PC90dD4pLiAgV2hlbiB5b3UgZG8gdGhpcyB0aGV5IGFyZSBldmFsdWF0ZWQgYmVmb3JlCithbnkgdGFyZ2V0cyBhcmUgZXhlY3V0ZWQuICBTb21lIHRhc2tzIHdpbGwgZ2VuZXJhdGUgYnVpbGQgZmFpbHVyZXMgaWYKK3RoZXkgYXJlIHVzZWQgb3V0c2lkZSBvZiB0YXJnZXRzIGFzIHRoZXkgbWF5IGNhdXNlIGluZmluaXRlIGxvb3BzCitvdGhlcndpc2UgKDxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4gZm9yIGV4YW1wbGUpLjwvcD4KKworPHA+CitXZSBoYXZlIGdpdmVuIHNvbWUgdGFyZ2V0cyBkZXNjcmlwdGlvbnM7IHRoaXMgY2F1c2VzIHRoZSA8dHQ+cHJvamVjdGhlbHA8L3R0PgoraW52b2NhdGlvbiBvcHRpb24gdG8gbGlzdCB0aGVtIGFzIHB1YmxpYyB0YXJnZXRzIHdpdGggdGhlIGRlc2NyaXB0aW9uczsgdGhlCitvdGhlciB0YXJnZXQgaXMgaW50ZXJuYWwgYW5kIG5vdCBsaXN0ZWQuCis8cD4KK0ZpbmFsbHksIGZvciB0aGlzIHRhcmdldCB0byB3b3JrIHRoZSBzb3VyY2UgaW4gdGhlIDx0dD5zcmM8L3R0PiBzdWJkaXJlY3RvcnkKK3Nob3VsZCBiZSBzdG9yZWQgaW4gYSBkaXJlY3RvcnkgdHJlZSB3aGljaCBtYXRjaGVzIHRoZSBwYWNrYWdlIG5hbWVzLiBDaGVjayB0aGUKKzx0dD4mbHQ7amF2YWMmZ3Q7PC90dD4gdGFzayBmb3IgZGV0YWlscy4KKworPGEgbmFtZT0iZmlsdGVycyI+PGgzPlRva2VuIEZpbHRlcnM8L2gzPjwvYT4KKzxwPkEgcHJvamVjdCBjYW4gaGF2ZSBhIHNldCBvZiB0b2tlbnMgdGhhdCBtaWdodCBiZSBhdXRvbWF0aWNhbGx5IGV4cGFuZGVkIGlmCitmb3VuZCB3aGVuIGEgZmlsZSBpcyBjb3BpZWQsIHdoZW4gdGhlIGZpbHRlcmluZy1jb3B5IGJlaGF2aW9yIGlzIHNlbGVjdGVkIGluIHRoZQordGFza3MgdGhhdCBzdXBwb3J0IHRoaXMuIFRoZXNlIG1pZ2h0IGJlIHNldCBpbiB0aGUgYnVpbGRmaWxlCitieSB0aGUgPGEgaHJlZj0iQ29yZVRhc2tzL2ZpbHRlci5odG1sIj5maWx0ZXI8L2E+IHRhc2suPC9wPgorPHA+U2luY2UgdGhpcyBjYW4gcG90ZW50aWFsbHkgYmUgYSB2ZXJ5IGhhcm1mdWwgYmVoYXZpb3IsCit0aGUgdG9rZW5zIGluIHRoZSBmaWxlcyA8Yj5tdXN0PC9iPgorYmUgb2YgdGhlIGZvcm0gPGNvZGU+QDwvY29kZT48aT50b2tlbjwvaT48Y29kZT5APC9jb2RlPiwgd2hlcmUKKzxpPnRva2VuPC9pPiBpcyB0aGUgdG9rZW4gbmFtZSB0aGF0IGlzIHNldAoraW4gdGhlIDxjb2RlPiZsdDtmaWx0ZXImZ3Q7PC9jb2RlPiB0YXNrLiBUaGlzIHRva2VuIHN5bnRheCBtYXRjaGVzIHRoZSBzeW50YXggb2Ygb3RoZXIgYnVpbGQgc3lzdGVtcwordGhhdCBwZXJmb3JtIHN1Y2ggZmlsdGVyaW5nIGFuZCByZW1haW5zIHN1ZmZpY2llbnRseSBvcnRob2dvbmFsIHRvIG1vc3QKK3Byb2dyYW1taW5nIGFuZCBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCBhcyB3ZWxsIGFzIHdpdGggZG9jdW1lbnRhdGlvbiBzeXN0ZW1zLjwvcD4KKzxwPk5vdGU6IElmIGEgdG9rZW4gd2l0aCB0aGUgZm9ybWF0IDxjb2RlPkA8L2NvZGU+PGk+dG9rZW48L2k+PGNvZGU+QDwvY29kZT4KK2lzIGZvdW5kIGluIGEgZmlsZSwgYnV0IG5vCitmaWx0ZXIgaXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgdG9rZW4sIG5vIGNoYW5nZXMgdGFrZSBwbGFjZTsKK3RoZXJlZm9yZSwgbm8gZXNjYXBpbmcKK21ldGhvZCBpcyBhdmFpbGFibGUgLSBidXQgYXMgbG9uZyBhcyB5b3UgY2hvb3NlIGFwcHJvcHJpYXRlIG5hbWVzIGZvciB5b3VyCit0b2tlbnMsIHRoaXMgc2hvdWxkIG5vdCBjYXVzZSBwcm9ibGVtcy48L3A+Cis8cD48Yj5XYXJuaW5nOjwvYj4gSWYgeW91IGNvcHkgYmluYXJ5IGZpbGVzIHdpdGggZmlsdGVyaW5nIHR1cm5lZCBvbiwgeW91IGNhbiBjb3JydXB0IHRoZQorZmlsZXMuIFRoaXMgZmVhdHVyZSBzaG91bGQgYmUgdXNlZCB3aXRoIHRleHQgZmlsZXMgPGVtPm9ubHk8L2VtPi48L3A+CisKKzxoMz48YSBuYW1lPSJwYXRoIj5QYXRoLWxpa2UgU3RydWN0dXJlczwvYT48L2gzPgorPHA+WW91IGNhbiBzcGVjaWZ5IDxjb2RlPlBBVEg8L2NvZGU+LSBhbmQgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPi10eXBlCityZWZlcmVuY2VzIHVzaW5nIGJvdGgKKyZxdW90Ozxjb2RlPjo8L2NvZGU+JnF1b3Q7IGFuZCAmcXVvdDs8Y29kZT47PC9jb2RlPiZxdW90OyBhcyBzZXBhcmF0b3IKK2NoYXJhY3RlcnMuIEFudCB3aWxsCitjb252ZXJ0IHRoZSBzZXBhcmF0b3IgdG8gdGhlIGNvcnJlY3QgY2hhcmFjdGVyIG9mIHRoZSBjdXJyZW50IG9wZXJhdGluZworc3lzdGVtLjwvcD4KKzxwPldoZXJldmVyIHBhdGgtbGlrZSB2YWx1ZXMgbmVlZCB0byBiZSBzcGVjaWZpZWQsIGEgbmVzdGVkIGVsZW1lbnQgY2FuCitiZSB1c2VkLiBUaGlzIHRha2VzIHRoZSBnZW5lcmFsIGZvcm0gb2Y6PC9wPgorPHByZT4KKyAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtjbGFzc3BhdGh9JnF1b3Q7LyZndDsKKyAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDtsaWIvaGVscGVyLmphciZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Cis8L3ByZT4KKzxwPlRoZSA8Y29kZT5sb2NhdGlvbjwvY29kZT4gYXR0cmlidXRlIHNwZWNpZmllcyBhIHNpbmdsZSBmaWxlIG9yCitkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyBiYXNlIGRpcmVjdG9yeSAob3IgYW4gYWJzb2x1dGUKK2ZpbGVuYW1lKSwgd2hpbGUgdGhlIDxjb2RlPnBhdGg8L2NvZGU+IGF0dHJpYnV0ZSBhY2NlcHRzIGNvbG9uLQorb3Igc2VtaWNvbG9uLXNlcGFyYXRlZCBsaXN0cyBvZiBsb2NhdGlvbnMuIFRoZSA8Y29kZT5wYXRoPC9jb2RlPgorYXR0cmlidXRlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCBwcmVkZWZpbmVkIHBhdGhzIC0gaW4gYW55IG90aGVyCitjYXNlLCBtdWx0aXBsZSBlbGVtZW50cyB3aXRoIDxjb2RlPmxvY2F0aW9uPC9jb2RlPiBhdHRyaWJ1dGVzIHNob3VsZCBiZQorcHJlZmVycmVkLjwvcD4KKzxwPkFzIGEgc2hvcnRjdXQsIHRoZSA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gdGFnCitzdXBwb3J0cyA8Y29kZT5wYXRoPC9jb2RlPiBhbmQKKzxjb2RlPmxvY2F0aW9uPC9jb2RlPiBhdHRyaWJ1dGVzIG9mIGl0cyBvd24sIHNvOjwvcD4KKzxwcmU+CisgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7Y2xhc3NwYXRofSZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Cis8L3ByZT4KKzxwPmNhbiBiZSBhYmJyZXZpYXRlZCB0bzo8L3A+Cis8cHJlPgorICAgICZsdDtjbGFzc3BhdGggcGF0aD0mcXVvdDske2NsYXNzcGF0aH0mcXVvdDsvJmd0OworPC9wcmU+Cis8cD5JbiBhZGRpdGlvbiwgb25lIG9yIG1vcmUKKzxhIGhyZWY9IkNvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZSBDb2xsZWN0aW9uPC9hPnMKK2NhbiBiZSBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzICh0aGVzZSBtdXN0IGNvbnNpc3Qgb2YKKzxhIGhyZWY9IkNvcmVUeXBlcy9yZXNvdXJjZXMuaHRtbCNmaWxlIj5maWxlPC9hPi10eXBlIHJlc291cmNlcyBvbmx5KS4KK0FkZGl0aW9uYWxseSwgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgYWx0aG91Z2ggcmVzb3VyY2UgY29sbGVjdGlvbnMgYXJlCitwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIGVuY291bnRlcmVkLCBjZXJ0YWluIHJlc291cmNlIGNvbGxlY3Rpb24gdHlwZXMKK3N1Y2ggYXMgPGEgaHJlZj0iQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4sCis8YSBocmVmPSJDb3JlVHlwZXMvZGlyc2V0Lmh0bWwiPmRpcnNldDwvYT4gYW5kCis8YSBocmVmPSJDb3JlVHlwZXMvcmVzb3VyY2VzLmh0bWwjZmlsZXMiPmZpbGVzPC9hPgorYXJlIHVuZGVmaW5lZCBpbiB0ZXJtcyBvZiBvcmRlci48L3A+Cis8cHJlPgorICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2NsYXNzcGF0aH0mcXVvdDsvJmd0OworICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2xpYiZxdW90OyZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphciZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7Y2xhc3NlcyZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7ZGlyc2V0IGRpcj0mcXVvdDske2J1aWxkLmRpcn0mcXVvdDsmZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7YXBwcy8qKi9jbGFzc2VzJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDthcHBzLyoqLypUZXN0KiZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7L2RpcnNldCZndDsKKyAgICAgICZsdDtmaWxlbGlzdCByZWZpZD0mcXVvdDt0aGlyZC1wYXJ0eV9qYXJzJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKzwvcHJlPgorPHA+VGhpcyBidWlsZHMgYSBwYXRoIHRoYXQgaG9sZHMgdGhlIHZhbHVlIG9mIDxjb2RlPiR7Y2xhc3NwYXRofTwvY29kZT4sCitmb2xsb3dlZCBieSBhbGwgamFyIGZpbGVzIGluIHRoZSA8Y29kZT5saWI8L2NvZGU+IGRpcmVjdG9yeSwKK3RoZSA8Y29kZT5jbGFzc2VzPC9jb2RlPiBkaXJlY3RvcnksIGFsbCBkaXJlY3RvcmllcyBuYW1lZAorPGNvZGU+Y2xhc3NlczwvY29kZT4gdW5kZXIgdGhlIDxjb2RlPmFwcHM8L2NvZGU+IHN1YmRpcmVjdG9yeSBvZgorPGNvZGU+JHtidWlsZC5kaXJ9PC9jb2RlPiwgZXhjZXB0IHRob3NlCit0aGF0IGhhdmUgdGhlIHRleHQgPGNvZGU+VGVzdDwvY29kZT4gaW4gdGhlaXIgbmFtZSwgYW5kCit0aGUgZmlsZXMgc3BlY2lmaWVkIGluIHRoZSByZWZlcmVuY2VkIEZpbGVMaXN0LjwvcD4KKzxwPklmIHlvdSB3YW50IHRvIHVzZSB0aGUgc2FtZSBwYXRoLWxpa2Ugc3RydWN0dXJlIGZvciBzZXZlcmFsIHRhc2tzLAoreW91IGNhbiBkZWZpbmUgdGhlbSB3aXRoIGEgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50IGF0IHRoZQorc2FtZSBsZXZlbCBhcyA8aT50YXJnZXQ8L2k+cywgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGVpcgorPGk+aWQ8L2k+IGF0dHJpYnV0ZS0tc2VlIDxhIGhyZWY9IiNyZWZlcmVuY2VzIj5SZWZlcmVuY2VzPC9hPiBmb3IgYW4KK2V4YW1wbGUuPC9wPgorPHA+QSBwYXRoLWxpa2Ugc3RydWN0dXJlIGNhbiBpbmNsdWRlIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgcGF0aC1saWtlCitzdHJ1Y3R1cmUgKGEgcGF0aCBiZWluZyBpdHNlbGYgYSByZXNvdXJjZSBjb2xsZWN0aW9uKQordmlhIG5lc3RlZCA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGVsZW1lbnRzOjwvcD4KKzxwcmU+CisgICAgJmx0O3BhdGggaWQ9JnF1b3Q7YmFzZS5wYXRoJnF1b3Q7Jmd0OworICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtjbGFzc3BhdGh9JnF1b3Q7LyZndDsKKyAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtsaWImcXVvdDsmZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5qYXImcXVvdDsvJmd0OworICAgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2NsYXNzZXMmcXVvdDsvJmd0OworICAgICZsdDsvcGF0aCZndDsKKworICAgICZsdDtwYXRoIGlkPSZxdW90O3Rlc3RzLnBhdGgmcXVvdDsmZ3Q7CisgICAgICAmbHQ7cGF0aCByZWZpZD0mcXVvdDtiYXNlLnBhdGgmcXVvdDsvJmd0OworICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O3Rlc3RjbGFzc2VzJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3BhdGgmZ3Q7Cis8L3ByZT4KKyBUaGUgc2hvcnRjdXRzIHByZXZpb3VzbHkgbWVudGlvbmVkIGZvciA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gYXJlIGFsc28gdmFsaWQgZm9yIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4uRm9yIGV4YW1wbGU6Cis8cHJlPgorICAgICZsdDtwYXRoIGlkPSZxdW90O2Jhc2UucGF0aCZxdW90OyZndDsKKyAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7Y2xhc3NwYXRofSZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9wYXRoJmd0OworPC9wcmU+CitjYW4gYmUgd3JpdHRlbiBhczoKKzxwcmU+CisgICAgJmx0O3BhdGggaWQ9JnF1b3Q7YmFzZS5wYXRoJnF1b3Q7IHBhdGg9JnF1b3Q7JHtjbGFzc3BhdGh9JnF1b3Q7LyZndDsKKzwvcHJlPgorCisgIDxoND48YSBuYW1lPSJwYXRoc2hvcnRjdXQiPlBhdGggU2hvcnRjdXQ8L2E+PC9oND4KKyAgPHA+CisgICAgSW4gQW50IDEuNiBhIHNob3J0Y3V0IGZvciBjb252ZXJ0aW5nIHBhdGhzIHRvIE9TIHNwZWNpZmljIHN0cmluZ3MKKyAgICBpbiBwcm9wZXJ0aWVzIGhhcyBiZWVuIGFkZGVkLiBPbmUgY2FuIHVzZSB0aGUgZXhwcmVzc2lvbiAKKyAgICAke3RvU3RyaW5nOjxlbT5wYXRocmVmZXJlbmNlPC9lbT59IHRvIGNvbnZlcnQgYSBwYXRoIGVsZW1lbnQKKyAgICByZWZlcmVuY2UgdG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBwYXRoIGFyZ3VtZW50LgorICAgIEZvciBleGFtcGxlOgorICA8L3A+Cis8cHJlPgorICAmbHQ7cGF0aCBpZD0ibGliLnBhdGgucmVmIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9ImxpYiIgaW5jbHVkZXM9IiouamFyIi8mZ3Q7CisgICZsdDsvcGF0aCZndDsKKyAgJmx0O2phdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSJjbGFzc2VzIiZndDsKKyAgICAmbHQ7Y29tcGlsZXJhcmcgYXJnPSItWGJvb3RzdHJhcC9wOiR7dG9TdHJpbmc6bGliLnBhdGgucmVmfSIvJmd0OworICAmbHQ7L2phdmFjJmd0OworPC9wcmU+CisKKworPGgzPjxhIG5hbWU9ImFyZyI+Q29tbWFuZC1saW5lIEFyZ3VtZW50czwvYT48L2gzPgorPHA+U2V2ZXJhbCB0YXNrcyB0YWtlIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGFub3RoZXIKK3Byb2Nlc3Mgb24gdGhlIGNvbW1hbmQgbGluZS4gVG8gbWFrZSBpdCBlYXNpZXIgdG8gc3BlY2lmeSBhcmd1bWVudHMKK3RoYXQgY29udGFpbiBzcGFjZSBjaGFyYWN0ZXJzLCBuZXN0ZWQgPGNvZGU+YXJnPC9jb2RlPiBlbGVtZW50cyBjYW4gYmUgdXNlZC48L3A+Cis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRyPgorICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKzwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPmEgc2luZ2xlIGNvbW1hbmQtbGluZSBhcmd1bWVudDsgY2FuIGNvbnRhaW4gc3BhY2UKKyAgICAgIGNoYXJhY3RlcnMuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iNSI+RXhhY3RseSBvbmUgb2YgdGhlc2UuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGZpbGUgYXMgYSBzaW5nbGUgY29tbWFuZC1saW5lCisgICAgICBhcmd1bWVudDsgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBhYnNvbHV0ZSBmaWxlbmFtZSBvZiB0aGUgZmlsZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXRoPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPkEgc3RyaW5nIHRoYXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcGF0aC1saWtlCisgICAgICBzdHJpbmcgYXMgYSBzaW5nbGUgY29tbWFuZC1saW5lIGFyZ3VtZW50OyB5b3UgY2FuIHVzZSA8Y29kZT47PC9jb2RlPgorICAgICAgb3IgPGNvZGU+OjwvY29kZT4gYXMKKyAgICAgIHBhdGggc2VwYXJhdG9ycyBhbmQgQW50IHdpbGwgY29udmVydCBpdCB0byB0aGUgcGxhdGZvcm0ncyBsb2NhbAorICAgICAgY29udmVudGlvbnMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0aHJlZjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjcmVmZXJlbmNlcyI+UmVmZXJlbmNlPC9hPiB0byBhIHBhdGgKKyAgICAgIGRlZmluZWQgZWxzZXdoZXJlLiAgQW50IHdpbGwgY29udmVydCBpdCB0byB0aGUgcGxhdGZvcm0ncyBsb2NhbAorICAgICAgY29udmVudGlvbnMuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+bGluZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5hIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPkl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBhdm9pZCB0aGUgPGNvZGU+bGluZTwvY29kZT4gdmVyc2lvbgord2hlbiBwb3NzaWJsZS4gIEFudCB3aWxsIHRyeSB0byBzcGxpdCB0aGUgY29tbWFuZCBsaW5lIGluIGEgd2F5CitzaW1pbGFyIHRvIHdoYXQgYSAoVW5peCkgc2hlbGwgd291bGQgZG8sIGJ1dCBtYXkgY3JlYXRlIHNvbWV0aGluZyB0aGF0CitpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIHdoYXQgeW91IGV4cGVjdCB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMuPC9wPgorCis8aDQ+RXhhbXBsZXM8L2g0PgorPGJsb2NrcXVvdGU+PHByZT4KKyAgJmx0O2FyZyB2YWx1ZT0mcXVvdDstbCAtYSZxdW90Oy8mZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5pcyBhIHNpbmdsZSBjb21tYW5kLWxpbmUgYXJndW1lbnQgY29udGFpbmluZyBhIHNwYWNlIGNoYXJhY3RlciwKKzxpPm5vdDwvaT4gc2VwYXJhdGUgY29tbWFuZHMgIi1sIiBhbmQgIi1hIi48L3A+Cis8YmxvY2txdW90ZT48cHJlPgorICAmbHQ7YXJnIGxpbmU9JnF1b3Q7LWwgLWEmcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+VGhpcyBpcyBhIGNvbW1hbmQgbGluZSB3aXRoIHR3byBzZXBhcmF0ZSBhcmd1bWVudHMsICItbCIgYW5kICItYSIuPC9wPgorPGJsb2NrcXVvdGU+PHByZT4KKyAgJmx0O2FyZyBwYXRoPSZxdW90Oy9kaXI7L2RpcjI6XGRpcjMmcXVvdDsvJmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+aXMgYSBzaW5nbGUgY29tbWFuZC1saW5lIGFyZ3VtZW50IHdpdGggdGhlIHZhbHVlCis8Y29kZT5cZGlyO1xkaXIyO1xkaXIzPC9jb2RlPiBvbiBET1MtYmFzZWQgc3lzdGVtcyBhbmQKKzxjb2RlPi9kaXI6L2RpcjI6L2RpcjM8L2NvZGU+IG9uIFVuaXgtbGlrZSBzeXN0ZW1zLjwvcD4KKworPGgzPjxhIG5hbWU9InJlZmVyZW5jZXMiPlJlZmVyZW5jZXM8L2E+PC9oMz4KKworPHA+QW55IHByb2plY3QgZWxlbWVudCBjYW4gYmUgYXNzaWduZWQgYW4gaWRlbnRpZmllciB1c2luZyBpdHMKKzxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUuIEluIG1vc3QgY2FzZXMgdGhlIGVsZW1lbnQgY2FuIHN1YnNlcXVlbnRseQorYmUgcmVmZXJlbmNlZCBieSBzcGVjaWZ5aW5nIHRoZSA8Y29kZT5yZWZpZDwvY29kZT4gYXR0cmlidXRlIG9uIGFuCitlbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGFyZSBnb2luZyB0bworcmVwbGljYXRlIHRoZSBzYW1lIHNuaXBwZXQgb2YgWE1MIG92ZXIgYW5kIG92ZXIgYWdhaW4tLXVzaW5nIGEKKzxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBzdHJ1Y3R1cmUgbW9yZSB0aGFuIG9uY2UsIGZvciBleGFtcGxlLjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+Cis8YmxvY2txdW90ZT48cHJlPgorJmx0O3Byb2plY3QgLi4uICZndDsKKyAgJmx0O3RhcmdldCAuLi4gJmd0OworICAgICZsdDtybWljIC4uLiZndDsKKyAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDtsaWIvJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqYXZhLmNsYXNzLnBhdGh9LyZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7YWRkaXRpb25hbC5wYXRofSZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7L3JtaWMmZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworCisgICZsdDt0YXJnZXQgLi4uICZndDsKKyAgICAmbHQ7amF2YWMgLi4uJmd0OworICAgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2xpYi8mcXVvdDsvJmd0OworICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2phdmEuY2xhc3MucGF0aH0vJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHthZGRpdGlvbmFsLnBhdGh9JnF1b3Q7LyZndDsKKyAgICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAgICZsdDsvamF2YWMmZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworJmx0Oy9wcm9qZWN0Jmd0OworPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+Y291bGQgYmUgcmV3cml0dGVuIGFzOjwvcD4KKzxibG9ja3F1b3RlPjxwcmU+CismbHQ7cHJvamVjdCAuLi4gJmd0OworICAmbHQ7cGF0aCBpZD0mcXVvdDtwcm9qZWN0LmNsYXNzLnBhdGgmcXVvdDsmZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2xpYi8mcXVvdDsvJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7amF2YS5jbGFzcy5wYXRofS8mcXVvdDsvJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7YWRkaXRpb25hbC5wYXRofSZxdW90Oy8mZ3Q7CisgICZsdDsvcGF0aCZndDsKKworICAmbHQ7dGFyZ2V0IC4uLiAmZ3Q7CisgICAgJmx0O3JtaWMgLi4uJmd0OworICAgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0mcXVvdDtwcm9qZWN0LmNsYXNzLnBhdGgmcXVvdDsvJmd0OworICAgICZsdDsvcm1pYyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCAuLi4gJmd0OworICAgICZsdDtqYXZhYyAuLi4mZ3Q7CisgICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSZxdW90O3Byb2plY3QuY2xhc3MucGF0aCZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9qYXZhYyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5BbGwgdGFza3MgdGhhdCB1c2UgbmVzdGVkIGVsZW1lbnRzIGZvciAKKzxhIGhyZWY9IkNvcmVUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwiPlBhdHRlcm5TZXQ8L2E+cywgCis8YSBocmVmPSJDb3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMsIAorPGEgaHJlZj0iQ29yZVR5cGVzL3ppcGZpbGVzZXQuaHRtbCI+WmlwRmlsZVNldDwvYT5zIG9yIAorPGEgaHJlZj0iI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmVzPC9hPiBhY2NlcHQgcmVmZXJlbmNlcyB0byB0aGVzZSBzdHJ1Y3R1cmVzIAorYXMgc2hvd24gaW4gdGhlIGV4YW1wbGVzLiBVc2luZyA8Y29kZT5yZWZpZDwvY29kZT4gb24gYSB0YXNrIHdpbGwgb3JkaW5hcmlseSAKK2hhdmUgdGhlIHNhbWUgZWZmZWN0IChyZWZlcmVuY2luZyBhIHRhc2sgYWxyZWFkeSBkZWNsYXJlZCksIGJ1dCB0aGUgdXNlciAKK3Nob3VsZCBiZSBhd2FyZSB0aGF0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBkZXBlbmRlbnQgb24gdGhlIAoraW1wbGVtZW50YXRpb24gb2YgdGhlIGVsZW1lbnQgdXBvbiB3aGljaCBpdCBpcyBzcGVjaWZpZWQuIFNvbWUgdGFza3MgKHRoZSAKKzxhIGhyZWY9IkNvcmVUYXNrcy9wcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eTwvYT4gdGFzayBpcyBhIGhhbmR5IGV4YW1wbGUpIAorZGVsaWJlcmF0ZWx5IGFzc2lnbiBhIGRpZmZlcmVudCBtZWFuaW5nIHRvIDxjb2RlPnJlZmlkPC9jb2RlPi48L3A+CisKKworPGgzPjxhIG5hbWU9InRvU3RyaW5nIj5HZXR0aW5nIHRoZSB2YWx1ZSBvZiBhIFJlZmVyZW5jZSB3aXRoICR7dG9TdHJpbmc6fTwvYT48L2gzPgorPHA+CitBbnkgQW50IHR5cGUgd2hpY2ggaGFzIGJlZW4gZGVjbGFyZWQgd2l0aCBhIHJlZmVyZW5jZSBjYW4gYWxzbyBpdHMgc3RyaW5nCit2YWx1ZSBleHRyYWN0ZWQgYnkgdXNpbmcgdGhlIDxjb2RlPiR7dG9TdHJpbmc6fTwvY29kZT4gb3BlcmF0aW9uLAord2l0aCB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlIGxpc3RlZCBhZnRlciB0aGUgIDxjb2RlPnRvU3RyaW5nOjwvY29kZT4gdGV4dC4gCitUaGUgIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgSmF2YSBjbGFzcyBpbnN0YW5jZSB0aGF0IGlzCityZWZlcmVuY2VkIGlzIGludm9rZWQgLWFsbCBidWlsdCBpbiB0eXBlcyBzdHJpdmUgdG8gcHJvZHVjZSB1c2VmdWwgYW5kIHJlbGV2YW50CitvdXRwdXQgaW4gc3VjaCBhbiBpbnN0YW5jZS4KKzwvcD4KKzxwPgorRm9yIGV4YW1wbGUsIGhlcmUgaXMgaG93IHRvIGdldCBhIGxpc3Rpbmcgb2YgdGhlIGZpbGVzIGluIGEgZmlsZXNldCwgCis8cD4KKzxwcmU+CismbHQ7ZmlsZXNldCBpZD0mcXVvdDtzb3VyY2VmaWxlcyZxdW90OyBkaXI9JnF1b3Q7c3JjJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90OyAvJmd0OworJmx0O2VjaG8mZ3Q7IHNvdXJjZWZpbGVzID0gJHt0b1N0cmluZzpzb3VyY2VmaWxlc30gJmx0Oy9lY2hvJmd0OworPC9wcmU+Cis8cD4KK1RoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGV4dGVybmFsIHR5cGVzIHByb3ZpZGUgbWVhbmluZ2Z1bCBpbmZvcm1hdGlvbiBpbiBzdWNoCithIHNpdHVhdGlvbjwvcD4KKworCis8aDM+PGEgbmFtZT0iZXh0ZXJuYWwtdGFza3MiPlVzZSBvZiBleHRlcm5hbCB0YXNrczwvYT48L2gzPiAKK0FudCBzdXBwb3J0cyBhIHBsdWdpbiBtZWNoYW5pc20gZm9yIHVzaW5nIHRoaXJkIHBhcnR5IHRhc2tzLiBGb3IgdXNpbmcgdGhlbSB5b3UgCitoYXZlIHRvIGRvIHR3byBzdGVwczogCis8b2w+CisgIDxsaT5wbGFjZSB0aGVpciBpbXBsZW1lbnRhdGlvbiBzb21ld2hlcmUgd2hlcmUgQW50IGNhbiBmaW5kIHRoZW08L2xpPgorICA8bGk+ZGVjbGFyZSB0aGVtLjwvbGk+Cis8L29sPiAKK0Rvbid0IGFkZCBhbnl0aGluZyB0byB0aGUgQ0xBU1NQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIC0gdGhpcyBpcyBvZnRlbiB0aGUgIAorcmVhc29uIGZvciB2ZXJ5IG9ic2N1cmUgZXJyb3JzLiBVc2UgQW50J3Mgb3duIDxhIGhyZWY9Imluc3RhbGwuaHRtbCNvcHRpb25hbFRhc2tzIj5tZWNoYW5pc21zPC9hPiAKK2ZvciBhZGRpbmcgbGlicmFyaWVzOiAKKzx1bD4KKyAgPGxpPnZpYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgPGNvZGU+LWxpYjwvY29kZT48L2xpPgorICA8bGk+YWRkaW5nIHRvIDxjb2RlPiR7dXNlci5ob21lfS8uYW50L2xpYjwvY29kZT48L2xpPgorICA8bGk+YWRkaW5nIHRvIDxjb2RlPiR7YW50LmhvbWV9L2xpYjwvY29kZT48L2xpPgorPC91bD4KK0ZvciB0aGUgZGVjbGFyYXRpb24gdGhlcmUgYXJlIHNldmVyYWwgd2F5czoKKzx1bD4KKyAgPGxpPmRlY2xhcmUgYSBzaW5nbGUgdGFzayBwZXIgdXNpbmcgaW5zdHJ1Y3Rpb24gdXNpbmcgIAorICAgICAgPGNvZGU+Jmx0OzxhIGhyZWY9IkNvcmVUYXNrcy90YXNrZGVmLmh0bWwiPnRhc2tkZWY8L2E+IG5hbWU9JnF1b3Q7dGFza25hbWUmcXVvdDsgCisgICAgICBjbGFzc25hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb25DbGFzcyZxdW90Oy8mZ3Q7PC9jb2RlPgorICAgICAgPGJyPgorICAgICAgPGNvZGU+Jmx0O3Rhc2tkZWYgbmFtZT0mcXVvdDtmb3ImcXVvdDsgY2xhc3NuYW1lPSZxdW90O25ldC5zZi5hbnRjb250cmliLmxvZ2ljLkZvciZxdW90OyAvJmd0OyAKKyAgICAgICZsdDtmb3IgLi4uIC8mZ3Q7PC9jb2RlPgorICA8L2xpPgorICA8bGk+ZGVjbGFyZSBhIGJ1bmRsZSBvZiB0YXNrcyB1c2luZyBhIHByb3BlcnRpZXMtZmlsZSBob2xkaW5nIHRoZXNlIAorICAgICAgdGFza25hbWUtSW1wbGVtZW50YXRpb25DbGFzcy1wYWlycyBhbmQgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPgorICAgICAgPGJyPgorICAgICAgPGNvZGU+Jmx0O3Rhc2tkZWYgcmVzb3VyY2U9JnF1b3Q7bmV0L3NmL2FudGNvbnRyaWIvYW50Y29udHJpYi5wcm9wZXJ0aWVzJnF1b3Q7IC8mZ3Q7IAorICAgICAgJmx0O2ZvciAuLi4gLyZndDs8L2NvZGU+CisgIDwvbGk+CisgIDxsaT5kZWNsYXJlIGEgYnVuZGxlIG9mIHRhc2tzIHVzaW5nIGEgPGEgaHJlZj0iQ29yZVR5cGVzL2FudGxpYi5odG1sIj54bWwtZmlsZTwvYT4gaG9sZGluZyB0aGVzZSAgCisgICAgICB0YXNrbmFtZS1JbXBsZW1lbnRhdGlvbkNsYXNzLXBhaXJzIGFuZCA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+CisgICAgICA8YnI+CisgICAgICA8Y29kZT4mbHQ7dGFza2RlZiByZXNvdXJjZT0mcXVvdDtuZXQvc2YvYW50Y29udHJpYi9hbnRsaWIueG1sJnF1b3Q7IC8mZ3Q7IAorICAgICAgJmx0O2ZvciAuLi4gLyZndDs8L2NvZGU+CisgIDwvbGk+CisgIDxsaT5kZWNsYXJlIGEgYnVuZGxlIG9mIHRhc2tzIHVzaW5nIGEgeG1sLWZpbGUgbmFtZWQgYW50bGliLnhtbCwgWE1MLW5hbWVzcGFjZSBhbmQgCisgICAgICA8YSBocmVmPSJDb3JlVHlwZXMvYW50bGliLmh0bWwjYW50bGlibmFtZXNwYWNlIj48Y29kZT5hbnRsaWI6PC9jb2RlPiBwcm90b2NvbGwgaGFuZGxlcjwvYT4gCisgICAgICA8YnI+CisgICAgICA8Y29kZT4mbHQ7cHJvamVjdCB4bWxuczphYz0mcXVvdDthbnRsaWI6bmV0LnNmLmFudGNvbnJpYiZxdW90Oy8mZ3Q7IAorICAgICAgJmx0O2FjOmZvciAuLi4gLyZndDs8L2NvZGU+CisgIDwvbGk+Cis8L3VsPgorCitJZiB5b3UgbmVlZCBhIHNwZWNpYWwgZnVuY3Rpb24sIHlvdSBzaG91bGQKKzxvbD4KKyAgPGxpPmhhdmUgYSBsb29rIGF0IHRoaXMgbWFudWFsLCBiZWNhdXNlIEFudCBwcm92aWRlcyBsb3Qgb2YgdGFza3M8L2xpPgorICA8bGk+aGF2ZSBhIGxvb2sgYXQgdGhlIGV4dGVybmFsIHRhc2sgcGFnZSBpbiB0aGUgPGEgaHJlZj0iLi4vZXh0ZXJuYWwuaHRtbCI+bWFudWFsPC9hPgorICAgICAgKG9yIGJldHRlciA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvZXh0ZXJuYWwuaHRtbCI+b25saW5lPC9hPik8L2xpPgorICA8bGk+aGF2ZSBhIGxvb2sgYXQgdGhlIGV4dGVybmFsIHRhc2sgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvQW50RXh0ZXJuYWxUYXNrZGVmcyI+d2lraSAKKyAgICAgIHBhZ2U8L2E+PC9saT4KKyAgPGxpPmFzayBvbiB0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21haWwuaHRtbCNVc2VyJTIwTGlzdCI+QW50IHVzZXI8L2E+IGxpc3Q8L2xpPgorICA8bGk+PGEgaHJlZj0idHV0b3JpYWwtd3JpdGluZy10YXNrcy5odG1sIj5pbXBsZW1lbnQgPC9hPihhbmQgc2hhcmUpIHlvdXIgb3duPC9saT4KKzwvb2w+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWFudWFsL3VzaW5nbGlzdC5odG1sIGIvdHJ1bmsvZG9jcy9tYW51YWwvdXNpbmdsaXN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2OTgyYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWFudWFsL3VzaW5nbGlzdC5odG1sCkBAIC0wLDAgKzEsNDcgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KKzx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KKzxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+Cis8L2hlYWQ+CisKKzxib2R5PgorCis8aDI+PGEgaHJlZj0idG9jLmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPlRhYmxlIG9mIENvbnRlbnRzPC9hPjwvaDI+CisKKzxoMz5Vc2luZyBBbnQ8L2gzPgorPGEgaHJlZj0idXNpbmcuaHRtbCNidWlsZGZpbGUiPldyaXRpbmcgYSBTaW1wbGUgQnVpbGRmaWxlPC9hPjxici8+Cis8ZGl2IHN0eWxlPSJwYWRkaW5nLWxlZnQ6MWVtIj4KKyAgPGEgaHJlZj0idXNpbmcuaHRtbCNwcm9qZWN0cyI+UHJvamVjdHM8L2E+PGJyLz4KKyAgPGEgaHJlZj0idXNpbmcuaHRtbCN0YXJnZXRzIj5UYXJnZXRzPC9hPjxici8+CisgIDxhIGhyZWY9InVzaW5nLmh0bWwjdGFza3MiPlRhc2tzPC9hPjxici8+CisgIDxhIGhyZWY9InVzaW5nLmh0bWwjcHJvcGVydGllcyI+UHJvcGVydGllczwvYT48YnIvPgorICA8YSBocmVmPSJ1c2luZy5odG1sI2J1aWx0LWluLXByb3BzIj5CdWlsdC1pbiBQcm9wZXJ0aWVzPC9hPjxici8+CisgIDxhIGhyZWY9InVzaW5nLmh0bWwjZXhhbXBsZSI+RXhhbXBsZSBCdWlsZGZpbGU8L2E+PGJyLz4KKyAgPGEgaHJlZj0idXNpbmcuaHRtbCNmaWx0ZXJzIj5Ub2tlbiBGaWx0ZXJzPC9hPjxici8+CisgIDxhIGhyZWY9InVzaW5nLmh0bWwjcGF0aCI+UGF0aC1saWtlIFN0cnVjdHVyZXM8L2E+PGJyLz4KKyAgPGEgaHJlZj0idXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+PGJyLz4KKyAgPGEgaHJlZj0idXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5SZWZlcmVuY2VzPC9hPjxici8+CisgIDxhIGhyZWY9InVzaW5nLmh0bWwjZXh0ZXJuYWwtdGFza3MiPlVzZSBvZiBleHRlcm5hbCB0YXNrczwvYT48YnIvPgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvbWlzc2lvbi5odG1sIGIvdHJ1bmsvZG9jcy9taXNzaW9uLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMjI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbWlzc2lvbi5odG1sCkBAIC0wLDAgKzEsMjkyIEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBBcGFjaGUgQW50IE1pc3Npb248L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IkFwYWNoZSBBbnQgUE1DIj4KKyAgPG1ldGEgbmFtZT0iZW1haWwiIGNvbnRlbnQ9IiI+CisgICAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxwIGNsYXNzPSJuYXZwYXRoIj4KKyAgICAgICAgPHNjcmlwdCBzcmM9Ii4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIuL2ltYWdlcy9wcm9qZWN0LWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlYXJjaCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IiM0QzZDOEYiPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGltZyBoZWlnaHQ9IjEwIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InNlYXJjaGNhcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJxIiB0eXBlPSJoaWRkZW4iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJTZWFyY2giIHZhbHVlPSJTZWFyY2giIHR5cGU9InN1Ym1pdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgICAgICAgICAgIHRoZSBBcGFjaGUgQW50IHNpdGUKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiI+CisgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iIzRDNkM4RiI+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPkhvbWU8L2I+PC9mb250PjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ibm9uIHNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS40ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuL3Byb2plY3RzL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPlByb2plY3RzPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsdWViYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ibWVudWNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+QXBhY2hlIEFudAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2luZGV4Lmh0bWwiPldlbGNvbWU8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9saWNlbnNlLmh0bWwiPkxpY2Vuc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9hbnRuZXdzLmh0bWwiPk5ld3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb2N1bWVudGF0aW9uCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFudWFsL2luZGV4Lmh0bWwiPk1hbnVhbDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2plY3RzLmh0bWwiPlJlbGF0ZWQgUHJvamVjdHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9leHRlcm5hbC5odG1sIj5FeHRlcm5hbCBUb29scyBhbmQgVGFza3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9yZXNvdXJjZXMuaHRtbCI+UmVzb3VyY2VzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vZmFxLmh0bWwiPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvYW50L0Zyb250UGFnZSI+V2lraTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2JsZW1zLmh0bWwiPkhhdmluZyBQcm9ibGVtcz88L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb3dubG9hZAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYmluZG93bmxvYWQuY2dpIj5CaW5hcnkgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkNvbnRyaWJ1dGluZworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21haWwuaHRtbCI+TWFpbGluZyBMaXN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3N2bi5odG1sIj5TdWJ2ZXJzaW9uIFJlcG9zaXRvcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL25pZ2h0bGllcy5odG1sIj5OaWdodGx5IEJ1aWxkczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J1Z3MuaHRtbCI+QnVnIERhdGFiYXNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+U3BvbnNvcnNoaXAKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiPlRoYW5rczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIj5TcG9uc29yc2hpcDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCI+RG9uYXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdCBNYW5hZ2VtZW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vY29udHJpYnV0b3JzLmh0bWwiPkNvbnRyaWJ1dG9yczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VsIj5BcGFjaGUgQW50IE1pc3Npb248L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnlsYXdzLmh0bWwiPlByb2plY3QgQnlsYXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGVnYWwuaHRtbCI+TGVnYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPkFwYWNoZSBBbnQgTWlzc2lvbjwvaDE+CisgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQm9hcmQgUmVzb2x1dGlvbiI+PC9hPgorICAgICAgQm9hcmQgUmVzb2x1dGlvbgorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcGFjaGUgQW50IGlzIGEgcHJvamVjdCBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2E+LiAgSXQKKyAgICBzdGFydGVkIGFzIGEgc3VicHJvamVjdCBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8iPkFwYWNoZSBKYWthcnRhIFByb2plY3Q8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBpcyB0aGUgYm9hcmQgcmVzb2x1dGlvbiAoZnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vcmVjb3Jkcy9taW51dGVzLzIwMDIvYm9hcmRfbWludXRlc18yMDAyXzExXzE4LnR4dCI+bWludXRlczwvYT4pCisgICAgdGhhdCBjcmVhdGVkIHRoZSBBcGFjaGUgQW50IHByb2plY3Q6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlIj4KKzcuRC4gUmVzb2x1dGlvbiBbUjNdIHRvIGNyZWF0ZSB0aGUgQW50IFBNQworCitXSEVSRUFTLCB0aGUgQm9hcmQgb2YgRGlyZWN0b3JzIGRlZW1zIGl0IHRvIGJlIGluIHRoZSBiZXN0CitpbnRlcmVzdHMgb2YgdGhlIEZvdW5kYXRpb24gYW5kIGNvbnNpc3RlbnQgd2l0aCB0aGUKK0ZvdW5kYXRpb24ncyBwdXJwb3NlIHRvIGVzdGFibGlzaCBhIFByb2plY3QgTWFuYWdlbWVudAorQ29tbWl0dGVlIGNoYXJnZWQgd2l0aCB0aGUgY3JlYXRpb24gYW5kIG1haW50ZW5hbmNlIG9mCitvcGVuLXNvdXJjZSBzb2Z0d2FyZSByZWxhdGVkIHRvIHRoZSBBcGFjaGUgQW50IGJ1aWxkIHRvb2wsIGZvcgorZGlzdHJpYnV0aW9uIGF0IG5vIGNoYXJnZSB0byB0aGUgcHVibGljLgorCitOT1csIFRIRVJFRk9SRSwgQkUgSVQgUkVTT0xWRUQsIHRoYXQgYSBQcm9qZWN0IE1hbmFnZW1lbnQKK0NvbW1pdHRlZSAoUE1DKSwgdG8gYmUga25vd24gYXMgdGhlICZxdW90O0FwYWNoZSBBbnQgUE1DJnF1b3Q7LCBiZSBhbmQKK2hlcmVieSBpcyBlc3RhYmxpc2hlZCBwdXJzdWFudCB0byBCeWxhd3Mgb2YgdGhlIEZvdW5kYXRpb247IGFuZAorYmUgaXQgZnVydGhlcgorCitSRVNPTFZFRCwgdGhhdCB0aGUgQXBhY2hlIEFudCBQTUMgYmUgYW5kIGhlcmVieSBpcyByZXNwb25zaWJsZQorZm9yIHRoZSBjcmVhdGlvbiBhbmQgbWFpbnRlbmFuY2Ugb2YgdGhlIEFudCBidWlsZCBzeXN0ZW0gYW5kCityZWxhdGVkIHNvZnR3YXJlIGNvbXBvbmVudHMsIGJhc2VkIG9uIHNvZnR3YXJlIGxpY2Vuc2VkIHRvIHRoZQorRm91bmRhdGlvbjsgYW5kIGJlIGl0IGZ1cnRoZXIKKworUkVTT0xWRUQsIHRoYXQgdGhlIG9mZmljZSBvZiAmcXVvdDtWaWNlIFByZXNpZGVudCwgQXBhY2hlIEFudCZxdW90OyBiZQorYW5kIGhlcmVieSBpcyBjcmVhdGVkLCB0aGUgcGVyc29uIGhvbGRpbmcgc3VjaCBvZmZpY2UgdG8gc2VydmUKK2F0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIEJvYXJkIG9mIERpcmVjdG9ycyBhcyB0aGUgY2hhaXIgb2YgdGhlCitBcGFjaGUgQW50IFBNQywgYW5kIHRvIGhhdmUgcHJpbWFyeSByZXNwb25zaWJpbGl0eSBmb3IKK21hbmFnZW1lbnQgb2YgdGhlIHByb2plY3RzIHdpdGhpbiB0aGUgc2NvcGUgb2YgcmVzcG9uc2liaWxpdHkKK29mIHRoZSBBcGFjaGUgQW50IFBNQzsgYW5kIGJlIGl0IGZ1cnRoZXIKKworUkVTT0xWRUQsIHRoYXQgdGhlIHBlcnNvbnMgbGlzdGVkIGltbWVkaWF0ZWx5IGJlbG93IGJlIGFuZAoraGVyZWJ5IGFyZSBhcHBvaW50ZWQgdG8gc2VydmUgYXMgdGhlIGluaXRpYWwgbWVtYmVycyBvZiB0aGUKK0FwYWNoZSBBbnQgUE1DOgorCisgICBCcnVjZSBBdGhlcnRvbgorICAgU3RlcGhhbmUgQmFpbGxpZXoKKyAgIFN0ZWZhbiBCb2Rld2lnCisgICBFcmlrIEhhdGNoZXIKKyAgIERpYW5lIEhvbHQKKyAgIERvbmFsZCBMZXNsaWUKKyAgIFN0ZXZlIExvdWdocmFuCisgICBDb25vciBNYWNOZWlsbAorICAgQ29zdGluIE1hbm9sYWNoZQorICAgU2FtIFJ1YnkKKyAgIEpvbiBTa2VldAorICAgTWFnZXNoIFVtYXNhbmthcgorICAgQ2hyaXN0b3BoIFdpbGhlbG1zCisKK05PVywgVEhFUkVGT1JFLCBCRSBJVCBGVVJUSEVSIFJFU09MVkVELCB0aGF0IENvbm9yIE1hY05laWxsIGJlCithbmQgaGVyZWJ5IGlzIGFwcG9pbnRlZCB0byB0aGUgb2ZmaWNlIG9mIFZpY2UgUHJlc2lkZW50LCBBcGFjaGUKK0FudCwgdG8gc2VydmUgaW4gYWNjb3JkYW5jZSB3aXRoIGFuZCBzdWJqZWN0IHRvIHRoZSBkaXJlY3Rpb24KK29mIHRoZSBCb2FyZCBvZiBEaXJlY3RvcnMgYW5kIHRoZSBCeWxhd3Mgb2YgdGhlIEZvdW5kYXRpb24KK3VudGlsIGRlYXRoLCByZXNpZ25hdGlvbiwgcmV0aXJlbWVudCwgcmVtb3ZhbCBvcgorZGlzcXVhbGlmaWNhdGlvbiwgb3IgdW50aWwgYSBzdWNjZXNzb3IgaXMgYXBwb2ludGVkOyBhbmQgYmUgaXQKK2Z1cnRoZXIKKworUkVTT0xWRUQsIHRoYXQgdGhlIGluaXRpYWwgQXBhY2hlIEFudCBQTUMgYmUgYW5kIGhlcmVieSBpcwordGFza2VkIHdpdGggdGhlIGNyZWF0aW9uIG9mIGEgc2V0IG9mIGJ5bGF3cyBpbnRlbmRlZCB0bworZW5jb3VyYWdlIG9wZW4gZGV2ZWxvcG1lbnQgYW5kIGluY3JlYXNlZCBwYXJ0aWNpcGF0aW9uIGluIHRoZQorQXBhY2hlIEFudCBQcm9qZWN0LgorCitCeSBVbmFuaW1vdXMgVm90ZSwgUmVzb2x1dGlvbiBSMyB3YXMgYXBwcm92ZWQuIFRoZSBBbnQgUE1DIGlzCitoZXJlYnkgY3JlYXRlZC4KKyAgICA8L3ByZT4KKyAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9uaWdodGxpZXMuaHRtbCBiL3RydW5rL2RvY3MvbmlnaHRsaWVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxMDliZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvbmlnaHRsaWVzLmh0bWwKQEAgLTAsMCArMSwyMjkgQEAKKworCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKyAgICAgICAgPGh0bWwgbGFuZz0iZW4iPgorICAgIDwhLS0gR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElULCBFRElUIFRIRSBYTUwgRklMRSBJTiB4ZG9jcyBJTlNURUFEISAtLT4KKyAgICA8aGVhZD4KKyAgICAgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgICAgICA8dGl0bGU+QXBhY2hlIEFudCAtIE5pZ2h0bHkgQnVpbGRzPC90aXRsZT4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CisgICAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuL2ltYWdlcy9ncm91cC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+PGltZyBhbHQ9IkFwYWNoZSBBbnQgbG9nbyIgYm9yZGVyPSIwIiBzcmM9Ii4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjUiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+SG9tZTwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUiPjxpbWcgYWx0PSIiIGhlaWdodD0iOCIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4vcHJvamVjdHMvaW5kZXguaHRtbCI+PGZvbnQgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+UHJvamVjdHM8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAgICAgICAgICAgICAgIAorICA8ZGl2IGNsYXNzPSJtZW51Y29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJtZW51Ij4KKyAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BcGFjaGUgQW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vaW5kZXguaHRtbCI+V2VsY29tZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xpY2Vuc2UuaHRtbCI+TGljZW5zZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2FudG5ld3MuaHRtbCI+TmV3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvY3VtZW50YXRpb24KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYW51YWwvaW5kZXguaHRtbCI+TWFudWFsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvamVjdHMuaHRtbCI+UmVsYXRlZCBQcm9qZWN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2V4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9mYXEuaHRtbCI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvRnJvbnRQYWdlIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcHJvYmxlbXMuaHRtbCI+SGF2aW5nIFByb2JsZW1zPzwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkRvd25sb2FkCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9zcmNkb3dubG9hZC5jZ2kiPlNvdXJjZSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+Q29udHJpYnV0aW5nCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFpbC5odG1sIj5NYWlsaW5nIExpc3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vc3ZuLmh0bWwiPlN1YnZlcnNpb24gUmVwb3NpdG9yaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZWwiPk5pZ2h0bHkgQnVpbGRzPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J1Z3MuaHRtbCI+QnVnIERhdGFiYXNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+U3BvbnNvcnNoaXAKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiPlRoYW5rczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIj5TcG9uc29yc2hpcDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCI+RG9uYXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdCBNYW5hZ2VtZW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vY29udHJpYnV0b3JzLmh0bWwiPkNvbnRyaWJ1dG9yczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21pc3Npb24uaHRtbCI+QXBhY2hlIEFudCBNaXNzaW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnlsYXdzLmh0bWwiPlByb2plY3QgQnlsYXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGVnYWwuaHRtbCI+TGVnYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPk5pZ2h0bHkgQnVpbGRzPC9oMT4KKyAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJOaWdodGx5IEJ1aWxkcyI+PC9hPgorICAgICAgTmlnaHRseSBCdWlsZHMKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IHdpc2ggdG8gdXNlIHRoZSBsYXRlc3QgQW50IGZlYXR1cmVzLCB5b3UgY2FuIHRyeSBkb3dubG9hZGluZyBhCis8YSBocmVmPSJodHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvYnVpbGRzL2FudC9uaWdodGx5LyI+bmlnaHRseSBidWlsZDwvYT4uCis8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdSB3YW50IHRvIGJ1aWxkIEFudCBmcm9tIHNvdXJjZXMsIHlvdSBjYW4gdXNlIGEgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3NuYXBzaG90cy9hbnQvIj5TdWJ2ZXJzaW9uIHNuYXBzaG90PC9hPi48L3A+CisgICAgICAgICAgICAgICAgCisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgICAgICAgIDxwIGNsYXNzPSJjb3B5cmlnaHQiPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhLS0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC53cml0ZSgiIC0gIisiTGFzdCBQdWJsaXNoZWQ6ICIgKyBkb2N1bWVudC5sYXN0TW9kaWZpZWQpOworICAgICAgICAgICAgICAvLyAgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9wPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvcGFnZS5jc3MgYi90cnVuay9kb2NzL3BhZ2UuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTZjOTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL3BhZ2UuY3NzCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitib2R5IHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOworICAgIGNvbG9yOiAjMDAwMDAwOworICAgIG1hcmdpbjogMHB4IDBweCAwcHggMHB4OworICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplIDogOTAlOworfQorCithOmxpbmsgeyBjb2xvcjogIzBGMzY2MDsgfQorYTp2aXNpdGVkIHsgY29sb3I6ICMwMDk5OTk7IH0KK2E6YWN0aXZlIHsgY29sb3I6ICMwMDAwNjY7IH0KK2E6aG92ZXIgeyBjb2xvcjogIzAwMDA2NjsgfQorCisubWVudWNvbnRhaW5lciB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzRDNkM4RjsKKyAgICBtYXJnaW46IDBweCA1cHg7CisgICAgd2lkdGg6IDI1MHB4OworfQorCisubWVudSB7CisgICAgZm9udC1zaXplIDogOTAlOworICAgIHBhZGRpbmc6IDNweCA4cHggNXB4IDNweDsKKyAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjMjk0NTYzOworICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzI5NDU2MzsKK30KKworLm1lbnUgYTpsaW5rIHsgY29sb3I6ICNGRkZGRkY7ICB0ZXh0LWRlY29yYXRpb24gOiBub25lOyAgfQorLm1lbnUgYTp2aXNpdGVkIHsgY29sb3I6ICNGRkZGRkY7IHRleHQtZGVjb3JhdGlvbiA6IG5vbmU7IH0KKy5tZW51IGE6aG92ZXIgeyBjb2xvcjogI0ZGQ0MwMDsgdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsgfQorLm1lbnUgdWwgeyBtYXJnaW46IDBweCAwcHggMHB4IDIwcHg7IHBhZGRpbmc6IDBweDsgfQorLm1lbnUgbGkgIHsgbGlzdC1zdHlsZS1pbWFnZTogdXJsKCdpbWFnZXMvbGFiZWwuZ2lmJyk7IGZvbnQtd2VpZ2h0IDogYm9sZDsgfQorLm1lbnUgdWwgdWwgbGkgLnNlbCB7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCgnaW1hZ2VzL2N1cnJlbnQuZ2lmJyk7IGZvbnQtd2VpZ2h0IDogbm9ybWFsOyB9CisubWVudSB1bCB1bCBsaSAgeyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoJ2ltYWdlcy9wYWdlLmdpZicpOyBmb250LXdlaWdodCA6IG5vcm1hbDsgfQorCisubWVudWhlYWRlciB7CisgICAgY29sb3I6ICNDRkRDRUQ7Cit9CisKKy5zZWwgeworICAgIGNvbG9yOiAjZmZjYzAwOworfQorCisudGFiIHsgZm9udC1zaXplIDogODUlOyBib3JkZXI6IDA7IGJhY2tncm91bmQtY29sb3I6ICMyOTQ1NjM7fQorLnRhYiBhOmxpbmsgeyAgIHRleHQtZGVjb3JhdGlvbiA6IG5vbmU7ICB9CisudGFiIGE6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbiA6IG5vbmU7IGNvbG9yOiAjMkE0QTZEIH0KKy50YWIgYTpob3ZlciB7IGNvbG9yOiAjMDAwMDY2OyB9CisKK3RhYmxlIC50aXRsZSB7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IHdpZHRoOjEwMCU7IGJvcmRlcjogMHB4OyB9CisuZGlkYSB7IGZvbnQtc2l6ZTogODAlOyB9CisKKy5wcmUgeyB3aGl0ZS1zcGFjZTogcHJlO30KKy5ub3dyYXAgeyB3aGl0ZS1zcGFjZTogbm93cmFwO30KKworLm1haW4geworICAgIG1hcmdpbi1sZWZ0OiAyODBweDsKKyAgICBtYXJnaW4tcmlnaHQ6IDVweDsKK30KKworLmNvbnRlbnQgeworICAgIHBhZGRpbmc6IDVweCA1cHggNXB4IDEwcHg7CisgICAgZm9udCA6IHNtYWxsIFZlcmRhbmEsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKKyAgICBmb250LXNpemUgOiA5MCU7Cit9CisKKy5jb250ZW50IC5Gb3JyZXN0VGFibGUgeyB3aWR0aDogMTAwJTsgYmFja2dyb3VuZC1jb2xvcjogIzcwOTlDNTsgY29sb3I6ICNmZmZmZmY7IGZvbnQtc2l6ZSA6IDkwJTt9CisuY29udGVudCAuRm9ycmVzdFRhYmxlIGNhcHRpb24geyB0ZXh0LWFsaWduOiBsZWZ0OyBjb2xvcjogYmxhY2s7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CisuY29udGVudCAuRm9ycmVzdFRhYmxlIHRoIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9CisuY29udGVudCAuRm9ycmVzdFRhYmxlIHRkIHsgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmZjsgY29sb3I6IGJsYWNrOyB9CisKKy5jb250ZW50IC5leHRlcm5hbHMgeyB3aWR0aDogODAlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjNzA5OUM1OyBjb2xvcjogI2ZmZmZmZjsgZm9udC1zaXplIDogOTAlO30KKy5jb250ZW50IC5leHRlcm5hbHMgY2FwdGlvbiB7IHRleHQtYWxpZ246IGxlZnQ7IGNvbG9yOiBibGFjazsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KKy5jb250ZW50IC5leHRlcm5hbHMgdGggeyB3aWR0aDogMTIwcHg7IHRleHQtYWxpZ246IHJpZ2h0OyB9CisuY29udGVudCAuZXh0ZXJuYWxzIHRkIHsgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmZjsgY29sb3I6IGJsYWNrOyB9CisKKworCisuZnJhbWUgeyBtYXJnaW46IDVweCAyMHB4IDVweCAyMHB4OyBmb250LXNpemU6IDkwJTsgfQorLmZyYW1lIC5jb250ZW50IHsgbWFyZ2luOiAwcHg7IH0KKworLm5vdGUgeyBib3JkZXI6IHNvbGlkIDFweCAjNzA5OUM1OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGZmOyB9Cisubm90ZSAubGFiZWwgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNzA5OUM1OyBjb2xvcjogI2ZmZmZmZjsgfQorCisud2FybmluZyB7IGJvcmRlcjogc29saWQgMXB4ICNEMDAwMDA7IGJhY2tncm91bmQtY29sb3I6ICNmZmYwZjA7IH0KKy53YXJuaW5nIC5sYWJlbCB7IGJhY2tncm91bmQtY29sb3I6ICNEMDAwMDA7IGNvbG9yOiAjZmZmZmZmOyB9CisKKy5maXhtZSB7IGJvcmRlcjogc29saWQgMXB4ICNDNkM2MDA7IGJhY2tncm91bmQtY29sb3I6ICNGQUY5QzM7IH0KKy5maXhtZSAubGFiZWwgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjQzZDNjAwOyBjb2xvcjogI2ZmZmZmZjsgfQorCisuY29kZSB7IGJvcmRlci1jb2xvcjogI0NGRENFRDsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7IH0KKy5jb2RlZnJhZyB7CWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vc3BhY2U7IH0KKworLmhpZ2hsaWdodCB7IGJhY2tncm91bmQtY29sb3I6IHllbGxvdzsgfQorCisubWluaXRvYyB7bWFyZ2luOiA1cHggNXB4IDVweCA0MHB4O30KKworLmR0ZEVsZW1lbnQgeyB3aWR0aDogMTAwJTsJZm9udC1zaXplOiA5MCU7IGJhY2tncm91bmQtY29sb3IgOiAjZmZmZmZmOyB9CisKKy5kdGRUYWcgeyAgICBjb2xvcjogIzk5MDAwMDsgdGV4dC10cmFuc2Zvcm0gOiB1cHBlcmNhc2U7ICBmb250LXN0eWxlIDogbm9ybWFsOyAgZm9udC1zaXplIDogMTIwJTsgIGZvbnQtd2VpZ2h0IDogYm9sZDsgfQorCisuc2VjdGlvbiB7CisgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjk0NTYzOworICAgIGNvbG9yOiAjZmZmZmZmOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHBhZGRpbmc6IDJweDsKKyAgICBtYXJnaW4tdG9wOiAyMHB4OworICAgIGNsZWFyOiByaWdodDsKK30KKworLnN1YnNlY3Rpb24geworICAgIGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWY7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzRDNkM4RjsKKyAgICBjb2xvcjogI2ZmZmZmZjsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBwYWRkaW5nOiAycHg7CisgICAgY2xlYXI6IHJpZ2h0OworfQorCisudG9jIHsKKyAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmOworICAgIGJhY2tncm91bmQtY29sb3I6ICM0QzZDOEY7CisgICAgY29sb3I6ICNmZmZmZmY7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZzogMnB4OworfQorCisuZmFxIHsKKyAgICBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmOworICAgIGJhY2tncm91bmQtY29sb3I6ICM0QzZDOEY7CisgICAgY29sb3I6ICNmZmZmZmY7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgcGFkZGluZzogMnB4OworfQorCisubmF2cGF0aCB7CisgICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0ZEQ0VEOworICAgIHBhZGRpbmc6IDJweCA2cHg7CisgICAgbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7CisgICAgZm9udC1zaXplOiA5MCU7CisgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICM0QzZDOEY7Cit9CisKKy50aXRsZSB7CisgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKK30KKworLmNvcHlyaWdodCB7CisgICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKKyAgICBmb250LXNpemU6IDkwJTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0ZEQ0VEOworICAgIGNsZWFyOiBib3RoOworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBtYXJnaW46IDBweDsKKyAgICBib3JkZXItdG9wOiB0aGluIHNvbGlkICM0QzZDOEY7Cit9CisKKy5ibHVlYmFyIHsKKyAgICBwYWRkaW5nOiA1cHggNXB4IDVweCAxMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6ICM0QzZDOEY7CisgICAgbWFyZ2luOiAwcHg7Cit9CisKKy5saWdodGJsdWViYXIgeworICAgIHBhZGRpbmc6IDVweCA1cHggNXB4IDEwcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI0NGRENFRDsKKyAgICBtYXJnaW46IDBweDsKKyAgICBib3JkZXItdG9wOiAxcHggc29saWQgIzI5NDU2MzsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzI5NDU2MzsKK30KKworLmxvZ29iYXIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICMyOTQ1NjM7CisgICAgcGFkZGluZy1yaWdodDogMTBweDsKKyAgICBtYXJnaW46IDBweDsKK30KKworLnNlYXJjaGNhcHRpb24geworICAgIGNvbG9yOiAjRkZGRkZGOworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKKyAgICBmb250LXNpemU6IDkwJTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNEM2QzhGOworICAgIG1hcmdpbjogMHB4OworfQorCitAbWVkaWEgcHJpbnQgeworICAgLm1lbnUgeworICAgICBkaXNwbGF5OiBub25lOworICAgfQorfQorCisjYWRjb250YWluZXIgeworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvcHJvYmxlbXMuaHRtbCBiL3RydW5rL2RvY3MvcHJvYmxlbXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWFlOThkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy9wcm9ibGVtcy5odG1sCkBAIC0wLDAgKzEsMzk3IEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBIYXZpbmcgUHJvYmxlbXM/PC90aXRsZT4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CisgICAgICAgICAgPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJDb25vciBNYWNOZWlsbCI+CisgIDxtZXRhIG5hbWU9ImVtYWlsIiBjb250ZW50PSIiPgorICAgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CisgICAgICAgIDxzY3JpcHQgc3JjPSIuL2JyZWFkY3J1bWJzLmpzIiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICAgIDwvcD4KKworICAgICAgPGRpdiBjbGFzcz0ibG9nb2JhciI+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBib3JkZXI9IjAiIGFsdD0iQXBhY2hlIEFudCBzaXRlIiBzcmM9Ii4vaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj48aW1nIGFsdD0iQXBhY2hlIEFudCBsb2dvIiBib3JkZXI9IjAiIHNyYz0iLi9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgb25zdWJtaXQ9InEudmFsdWUgPSBxdWVyeS52YWx1ZSArICcgc2l0ZTphbnQuYXBhY2hlLm9yZyciIGFjdGlvbj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWFyY2giIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSIjNEM2QzhGIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPjxpbWcgaGVpZ2h0PSIxMCIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJzZWFyY2hjYXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc2l6ZT0iMTUiIGlkPSJxdWVyeSIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICB0aGUgQXBhY2hlIEFudCBzaXRlCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgorICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0idGFiIGJhciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiM0QzZDOEYiPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj48Yj5Ib21lPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNSI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI4IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9Im5vbiBzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNGVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iI0IyQzRFMCI+PGEgaHJlZj0iLi9wcm9qZWN0cy9pbmRleC5odG1sIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj5Qcm9qZWN0czwvZm9udD48L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkFwYWNoZSBBbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9pbmRleC5odG1sIj5XZWxjb21lPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGljZW5zZS5odG1sIj5MaWNlbnNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYW50bmV3cy5odG1sIj5OZXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG9jdW1lbnRhdGlvbgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21hbnVhbC9pbmRleC5odG1sIj5NYW51YWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9wcm9qZWN0cy5odG1sIj5SZWxhdGVkIFByb2plY3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vZXh0ZXJuYWwuaHRtbCI+RXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcmVzb3VyY2VzLmh0bWwiPlJlc291cmNlczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2ZhcS5odG1sIj5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2FudC9Gcm9udFBhZ2UiPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+SGF2aW5nIFByb2JsZW1zPzwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb3dubG9hZAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYmluZG93bmxvYWQuY2dpIj5CaW5hcnkgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkNvbnRyaWJ1dGluZworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21haWwuaHRtbCI+TWFpbGluZyBMaXN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3N2bi5odG1sIj5TdWJ2ZXJzaW9uIFJlcG9zaXRvcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL25pZ2h0bGllcy5odG1sIj5OaWdodGx5IEJ1aWxkczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J1Z3MuaHRtbCI+QnVnIERhdGFiYXNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+U3BvbnNvcnNoaXAKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiPlRoYW5rczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIj5TcG9uc29yc2hpcDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCI+RG9uYXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdCBNYW5hZ2VtZW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vY29udHJpYnV0b3JzLmh0bWwiPkNvbnRyaWJ1dG9yczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21pc3Npb24uaHRtbCI+QXBhY2hlIEFudCBNaXNzaW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnlsYXdzLmh0bWwiPlByb2plY3QgQnlsYXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGVnYWwuaHRtbCI+TGVnYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPkhhdmluZyBQcm9ibGVtcz88L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkhhdmluZyBQcm9ibGVtcz8iPjwvYT4KKyAgICAgIEhhdmluZyBQcm9ibGVtcz8KKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgIFRoaXMgcGFnZSBkZXRhaWxzIHNvbWUgc3RlcHMgeW91IGNhbiB0YWtlIHRvIHRyeSBhbmQgcmVzb2x2ZQorICAgICAgICAgICBhbnkgcHJvYmxlbXMgeW91IG1heSBiZSBoYXZpbmcgd2l0aCBBbnQuIElmIHlvdSBmaW5kIHlvdSBjYW4ndAorICAgICAgICAgICByZXNvbHZlIHRoZSBwcm9ibGVtLCB0aGVuIHRoaXMgcGFnZSB3aWxsIGhlbHAgeW91IGNvbGxlY3Qgc29tZSBvZgorICAgICAgICAgICB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gdG8gcHJvdmlkZSBpbiBhIGJ1ZyByZXBvcnQuIFRoaXMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgd2lsbCBoZWxwIHRoZSBBbnQgZGV2ZWxvcGVycyB1bmRlcnN0YW5kIGFuZCByZXNvbHZlIHRoZSBwcm9ibGVtLgorICAgICAgICAgICBPZiBjb3Vyc2UsIG5vdCBhbGwgdGhlIHN0ZXBzIGhlcmUgd2lsbCBtYWtlIHNlbnNlIGZvciBldmVyeSBwcm9ibGVtCisgICAgICAgICAgIHlvdSBtYXkgZW5jb3VudGVyIC0gdGhlc2UgYXJlIGp1c3Qgc29tZSBzdWdnZXN0aW9ucyB0byBwb2ludAorICAgICAgICAgICB5b3UgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbi4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJFbnN1cmUgdGhhdCB5b3UgYXJlIGFjdHVhbGx5IHJ1bm5pbmcgdGhlIHZlcnNpb24gb2YgQW50IHRoYXQgeW91IHRoaW5rIHlvdSBkbyI+PC9hPgorICAgICAgICBFbnN1cmUgdGhhdCB5b3UgYXJlIGFjdHVhbGx5IHJ1bm5pbmcgdGhlIHZlcnNpb24gb2YgQW50IHRoYXQgeW91IHRoaW5rIHlvdSBkbworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPk1hbnkgdG9vbHMgaW5jbHVkZSBhIHZlcnNpb24gb2YgQW50IGFuZCBzb21lIE9wZXJhdGluZworICAgICAgICBTeXN0ZW1zIGV2ZW4gaW5zdGFsbCBpdCBieSBkZWZhdWx0IG5vdywgc28geW91IG1heSBoYXZlIGEKKyAgICAgICAgdmVyc2lvbiBvZiBBbnQgaW5zdGFsbGVkIHRoYXQgeW91IGhhdmVuJ3QgYmVlbiBhd2FyZSBvZi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPk9uZSBvZiB0aGUgZmlyc3QgdGhpbmdzIHRvIGRvIGlzIHRvIHJ1bgorICAgICAgICAgIDxiciAvPjxiciAvPgorICAgICAgICAgIDxmb250IGZhY2U9InZlcmRhbmEiIHNpemU9Ii0xIj5hbnQgLXZlcnNpb248L2ZvbnQ+CisgICAgICAgICAgPGJyIC8+PGJyIC8+CisgICAgICAgICAgYW5kCisgICAgICAgICAgPGJyIC8+PGJyIC8+CisgICAgICAgICAgPGZvbnQgZmFjZT0idmVyZGFuYSIgc2l6ZT0iLTEiPmFudCAtZGlhZ25vc3RpY3M8L2ZvbnQ+CisgICAgICAgICAgPGJyIC8+PGJyIC8+CisgICAgICAgICAgdG8gYmUgc3VyZS4gIEFsc28sIHdlIGhpZ2hseSByZWNvbW1lbmQgdGhhdCB5b3UgcnVuIEFudCB3aXRoCisgICAgICAgICAgYW4gZW1wdHkgQ0xBU1NQQVRILiAgSWYgYW55IG90aGVyIHZlcnNpb24gb2YgQW50IGNhbiBiZQorICAgICAgICAgIGxvYWRlZCBmcm9tIHRoZSBDTEFTU1BBVEgsIG1hbnkgdHlwZXMgb2YgZXJyb3JzIG1heSBoYXBwZW4KKyAgICAgICAgICBiZWNhdXNlIG9mIGluY29tcGF0aWJsZSBjbGFzc2VzIGJlaW5nIGxvYWRlZC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlNlZSA8YSBocmVmPSJmYXEuaHRtbCI+dGhlIEZBUTwvYT4gZm9yIDxhIGhyZWY9ImZhcS5odG1sI05vQ2xhc3NEZWZGb3VuZEVycm9yIj5zb21lPC9hPiA8YSBocmVmPSJmYXEuaHRtbCNJbnN0YW50aWF0aW9uRXhjZXB0aW9uIj5leGFtcGxlczwvYT4sIGJ1dCBtYW55CisgICAgICAgIG90aGVyIHByb2JsZW1zIGFyZSBhIHJlc3VsdCBvZiBhbiBvbGQgdmVyc2lvbiBvZiBBbnQgb24geW91cgorICAgICAgICBzeXN0ZW0gYXMgd2VsbC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iUmVhZCB0aGUgTWFudWFsIj48L2E+CisgICAgICAgIFJlYWQgdGhlIE1hbnVhbAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgVGhlIGZpcnN0IHN0ZXAgdG8gdGFrZSB3aGVuIHlvdSBoYXZlIGEgcHJvYmxlbSB3aXRoIEFudCBpcyB0byByZWFkCisgICAgICAgICAgICB0aGUgPGEgaHJlZj0ibWFudWFsL2luZGV4Lmh0bWwiPm1hbnVhbDwvYT4gZW50cnkgZm9yIHRoZSB0YXNrIG9yCisgICAgICAgICAgICBjb25jZXB0IHRoYXQgaXMgZ2l2aW5nIHlvdSB0cm91YmxlLiBJbiBwYXJ0aWN1bGFyLCBjaGVjayB0aGUKKyAgICAgICAgICAgIG1lYW5pbmcgb2YgYSB0YXNrJ3MgYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzLiBQZXJoYXBzIGFuCisgICAgICAgICAgICBhdHRyaWJ1dGUgaXMgYXZhaWxhYmxlIHRoYXQgd291bGQgcHJvdmlkZSB0aGUgYmVoYXZpb3IgeW91IHJlcXVpcmUuCisgICAgICAgICAgICBJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZSBtYW51YWwgaXRzZWxmLCB5b3UgY2FuIHN1Ym1pdCBhCisgICAgICAgICAgICBkb2N1bWVudGF0aW9uIGJ1ZyByZXBvcnQgKHNlZSBiZWxvdykgdG8gaGVscCB1cyBpbXByb3ZlIHRoZSBBbnQKKyAgICAgICAgICAgIGRvY3VtZW50YXRpb24uCisgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iRXhhbWluZSBEZWJ1ZyBPdXRwdXQiPjwvYT4KKyAgICAgICAgRXhhbWluZSBEZWJ1ZyBPdXRwdXQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgIElmIHlvdSdyZSBzdGlsbCBoYXZpbmcgYSBwcm9ibGVtLCB0aGUgbmV4dCBzdGVwIGlzIHRvIHRyeSBhbmQKKyAgICAgICAgICAgIGdhdGhlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgQW50IGlzIGRvaW5nLgorICAgICAgICAgICAgVHJ5IHJ1bm5pbmcgQW50IHdpdGggdGhlIDxjb2RlPnZlcmJvc2U8L2NvZGU+IGZsYWc6CisgICAgICAgICAgICA8YnIgLz48YnIgLz4KKyAgICAgICAgICAgIDxmb250IGZhY2U9InZlcmRhbmEiIHNpemU9Ii0xIj5hbnQgLXZlcmJvc2U8L2ZvbnQ+CisgICAgICAgICAgICA8YnIgLz48YnIgLz4KKyAgICAgICAgICAgIG9yCisgICAgICAgICAgICA8YnIgLz48YnIgLz4KKyAgICAgICAgICAgIDxmb250IGZhY2U9InZlcmRhbmEiIHNpemU9Ii0xIj5hbnQgLXY8L2ZvbnQ+CisgICAgICAgICAgICA8YnIgLz48YnIgLz4KKworICAgICAgICAgICAgVGhpcyB3aWxsIHByb2R1Y2Ugb3V0cHV0IHRoYXQgc3RhcnRzIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRm9ycmVzdFRhYmxlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorQW50IHZlcnNpb24gMS40LjEgY29tcGlsZWQgb24gT2N0b2JlciAxMSAyMDAxPGJyIC8+CitCdWlsZGZpbGU6IGJ1aWxkLnhtbDxiciAvPgorRGV0ZWN0ZWQgSmF2YSB2ZXJzaW9uOiAxLjMgaW46IEQ6XHVzclxsb2NhbFxqYXZhXGpkazEzXGpyZTxiciAvPgorRGV0ZWN0ZWQgT1M6IFdpbmRvd3MgTlQ8YnIgLz4KK3BhcnNpbmcgYnVpbGRmaWxlIEQ6XGFudFxidWlsZC54bWwKK3dpdGggVVJJID0gZmlsZTpEOi9hbnQvYnVpbGQueG1sPGJyIC8+CitQcm9qZWN0IGJhc2UgZGlyIHNldCB0bzogRDpcYW50PGJyIC8+CiugoFtwcm9wZXJ0eV0gTG9hZGluZyBFbnZpcm9ubWVudCBlbnYuPGJyIC8+CiugoFtwcm9wZXJ0eV0gTG9hZGluZyBEOlxhbnRcY29uZi5wcm9wZXJ0aWVzPGJyIC8+CitCdWlsZCBzZXF1ZW5jZSBmb3IgdGFyZ2V0ICdkZWJ1ZycgaXMgW2RlYnVnXTxiciAvPgorQ29tcGxldGUgYnVpbGQgc2VxdWVuY2UgaXMgW2RlYnVnLCBnZW5zcmMsIGNvbXBpbGUsIGphciwgdGVzdF08YnIgLz4KKy4gLiAuPGJyIC8+CisKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gc2VlIGZyb20gdGhlIHRyYWNlIG1vcmUgYWJvdXQgd2hhdCBBbnQKKyAgICAgICAgICAgICAgaXMgZG9pbmcgYW5kIHdoeSBpdCdzIHRha2luZyBhIHBhcnRpY3VsYXIgY291cnNlIG9mIGFjdGlvbi4KKyAgICAgICAgICAgICAgSWYgeW91IG5lZWQgZXZlbiBtb3JlIGluZm9ybWF0aW9uLCB5b3UgY2FuIHVzZSB0aGUKKyAgICAgICAgICAgICAgPGNvZGU+LWRlYnVnPC9jb2RlPiBmbGFnIHJhdGhlciB0aGFuCisgICAgICAgICAgICAgIDxjb2RlPi12ZXJib3NlPC9jb2RlPi4KKyAgICAgICAgICAgICAgVGhpcyB3aWxsIGdlbmVyYWxseSBwcm9kdWNlIHNvIG11Y2gKKyAgICAgICAgICAgICAgb3V0cHV0IHRoYXQgeW91IG1heSB3YW50IHRvIHNhdmUgdGhlIG91dHB1dCB0byBhIGZpbGUgYW5kCisgICAgICAgICAgICAgIGFuYWx5emUgaXQgaW4gYW4gZWRpdG9yLiBZb3UgY2FuIHNhdmUgdGhlIG91dHB1dCB1c2luZyB0aGUKKyAgICAgICAgICAgICAgPGNvZGU+LWxvZ2ZpbGUgJmx0O2ZpbGVuYW1lJmd0OzwvY29kZT4gZmxhZywgb3IKKyAgICAgICAgICAgICAgdXNpbmcgcmVkaXJlY3Rpb24uCisgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgIE9uY2UgeW91IGhhdmUgYWxsIHRoaXMgZGVidWcgaW5mb3JtYXRpb24sIGhvdyBjYW4geW91IHVzZSBpdAorICAgICAgICAgICAgICB0byBzb2x2ZSB5b3VyIHByb2JsZW0/ICBUaGF0IHdpbGwgZGVwZW5kIG9uIHRoZSB0YXNrIGluIHF1ZXN0aW9uCisgICAgICAgICAgICAgIGFuZCB0aGUgbmF0dXJlIG9mIHlvdXIgcHJvYmxlbS4gRWFjaCB0YXNrIGxvZ3MgZGlmZmVyZW50IGFzcGVjdHMKKyAgICAgICAgICAgICAgb2YgaXRzIG9wZXJhdGlvbiwgYnV0IGl0IHNob3VsZCBnaXZlIHlvdSBhbiBpZGVhIG9mIHdoYXQgaXMgZ29pbmcKKyAgICAgICAgICAgICAgb24uIEZvciBleGFtcGxlLCB0aGUgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzayBsb2dzIHRoZQorICAgICAgICAgICAgICByZWFzb25zIHdoeSBpdAorICAgICAgICAgICAgICBjaG9vc2VzIHRvIGNvbXBpbGUgcGFydGljdWxhciBjbGFzcyBmaWxlcyBhbmQgbm90IG90aGVycywgYWxvbmcKKyAgICAgICAgICAgICAgd2l0aCB3aGljaCBjb21waWxlciBpdCBpcyB1c2luZyBhbmQgdGhlIGFyZ3VtZW50cyBpdCB3aWxsIHBhc3MKKyAgICAgICAgICAgICAgdG8gdGhhdCBjb21waWxlci4gVGhlIGZvbGxvd2luZyBwYXJ0aWFsIHRyYWNlIHNob3dzIHdoeQorICAgICAgICAgICAgICA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiBpcyBhZGRpbmcgb25lIGNsYXNzIGZpbGUgYnV0CisgICAgICAgICAgICAgIHNraXBwaW5nIGFub3RoZXIuCisgICAgICAgICAgICAgIFRoaXMgaXMgZm9sbG93ZWQgYnkgd2hpY2ggY29tcGlsZXIgaXQgd2lsbCBiZSB1c2luZywgdGhlCisgICAgICAgICAgICAgIGFyZ3VtZW50cyB0aGF0IHdpbGwgZ2V0IHBhc3NlZCB0byB0aGUgY29tcGlsZXIsCisgICAgICAgICAgICAgIGFuZCBhIGxpc3Qgb2YgYWxsIHRoZSBjbGFzcyBmaWxlcyB0byBiZSBjb21waWxlZC4KKyAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkZvcnJlc3RUYWJsZSIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKK1tqYXZhY10gVGVzdC5qYXZhIG9taXR0ZWQgYXMgRDpcY2xhc3Nlc1xUZXN0LmNsYXNzIGlzIHVwIHRvIGRhdGUuPGJyIC8+CitbamF2YWNdIFVuc2V0LmphdmEgYWRkZWQgYXMgRDpcY2xhc3Nlc1xVbnNldC5jbGFzcyBpcyBvdXRkYXRlZC48YnIgLz4KK1tqYXZhY10gQ29tcGlsaW5nIDEgc291cmNlIGZpbGUgdG8gRDpcY2xhc3NlczxiciAvPgorW2phdmFjXSBVc2luZyBjbGFzc2ljIGNvbXBpbGVyPGJyIC8+CitbamF2YWNdIENvbXBpbGF0aW9uIGFyZ3M6IC1kIEQ6XGNsYXNzZXMgLWNsYXNzcGF0aCBEOlxjbGFzc2VzOzxiciAvPgorRDpcamRrMTE4XGNsYXNzZXMuemlwOyAtc291cmNlcGF0aCBEOlxzcmNcamF2YSAtZzpub25lPGJyIC8+CitbamF2YWNdIEZpbGUgdG8gYmUgY29tcGlsZWQ6PGJyIC8+CitEOlxzcmNcamF2YVxVbnNldC5qYXZhPGJyIC8+CisKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICBJbiBtYW55IGNhc2VzLCBBbnQgdGFza3MgYXJlIHdyYXBwZXJzIGFyb3VuZCBPUyBjb21tYW5kcyBvcgorICAgICAgICAgICAgICBvdGhlciBKYXZhIGNsYXNzZXMuIEluIGRlYnVnIG1vZGUsIG1hbnkgb2YgdGhlc2UgdGFza3Mgd2lsbAorICAgICAgICAgICAgICBwcmludCBvdXQgdGhlIGVxdWl2YWxlbnQgY29tbWFuZCBsaW5lLCBhcyB0aGUKKyAgICAgICAgICAgICAgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzaworICAgICAgICAgICAgICBvdXRwdXQgZG9lcy4gSWYgeW91IGFyZSBoYXZpbmcgYSBwcm9ibGVtLCBpdCBpcyBvZnRlbiB1c2VmdWwgdG8KKyAgICAgICAgICAgICAgcnVuIHRoZSBjb21tYW5kIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaW4gdGhlIHNhbWUgd2F5CisgICAgICAgICAgICAgIEFudCBpcyBydW5uaW5nIGl0LCBhbmQgc2VlIGlmIHRoZSBwcm9ibGVtIG9jY3VycyBmcm9tIHRoZXJlCisgICAgICAgICAgICAgIGFzIHdlbGwuIFRoZSBwcm9ibGVtIG1heSBiZSBpbiB0aGUgY29tbWFuZCB0aGF0IGlzIGJlaW5nIHJ1biwKKyAgICAgICAgICAgICAgb3IgaXQgbWF5IGJlIGluIHRoZSB3YXkgdGhlIEFudCB0YXNrIGlzIHJ1bm5pbmcgdGhlIGNvbW1hbmQuCisgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBzZWUgdGhlIGVmZmVjdCBvZiBjaGFuZ2luZyBhdHRyaWJ1dGUgdmFsdWVzIG9uIHRoZQorICAgICAgICAgICAgICBnZW5lcmF0ZWQgY29tbWFuZCBsaW5lLiBUaGlzIGNhbiBoZWxwIHlvdSB0byB1bmRlcnN0YW5kIHdoZXRoZXIKKyAgICAgICAgICAgICAgeW91IGFyZSB1c2luZyB0aGUgY29ycmVjdCBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMuCisgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSGFzIEl0IEJlZW4gRml4ZWQ/Ij48L2E+CisgICAgICAgIEhhcyBJdCBCZWVuIEZpeGVkPworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgQWZ0ZXIgZXhhbWluaW5nIHRoZSBkZWJ1ZyBvdXRwdXQsIGlmIHlvdSBzdGlsbCBiZWxpZXZlIHRoYXQgdGhlCisgICAgICAgICAgICBwcm9ibGVtIHlvdSBhcmUgaGF2aW5nIGlzIGNhdXNlZCBieSBBbnQsIGNoYW5jZXMgYXJlIHRoYXQgc29tZW9uZQorICAgICAgICAgICAgZWxzZSBtYXkgaGF2ZSBhbHJlYWR5IGVuY291bnRlcmVkIHRoaXMgcHJvYmxlbSwgYW5kIHBlcmhhcHMgaXQgaGFzCisgICAgICAgICAgICBiZWVuIGZpeGVkLiBUaGUgbmV4dCBzdGVwLCB0aGVyZWZvcmUsIHdvdWxkIGJlIHRvIGRvd25sb2FkIHRoZQorICAgICAgICAgICAgc291cmNlcyBvZiBhbnQsIHNlZSA8YSBocmVmPSJzdm4uaHRtbCI+c3ZuPC9hPi4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vdm1ndW1wLmFwYWNoZS5vcmcvZ3VtcC9wdWJsaWMvaW5kZXguaHRtbCI+R3VtcDwvYT4KKyAgICAgICAgICBpcyBidWlsZGluZyBhbnQgZXZlcnkgbmlnaHQgYW5kIHVzaW5nIHRoZSBhbnQgYnVpbHQgZnJvbSB0aGUKKyAgICAgICAgICBsYXRlc3Qgc291cmNlIHRvIGJ1aWxkIGEgbG9uZyBsaXN0IG9mIG9wZW4gc291cmNlIHByb2plY3RzLiBIb3dldmVyLAorICAgICAgICAgIHRoZSB2ZXJzaW9uIG9mIGFudCBidWlsdCBieSBndW1wIGlzIG5vdCBhdmFpbGFibGUgZm9yIGRvd25sb2FkLiBFdmVuCisgICAgICAgICAgaWYgaXQgd2VyZSwgaXQgd291bGQgbm90IGluY2x1ZGUgbW9zdCBvZiB0aGUgb3B0aW9uYWwgdGFza3MuCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICBXZSBjdXJyZW50bHkgZG8gbm90IGhhdmUgbmlnaHRseSBidWlsZHMgaW5jbHVkaW5nIHRoZSBvcHRpb25hbCB0YXNrcy4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iYnVncyI+PC9hPgorICAgICAgYnVncworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgYXJlIGNvbnZpbmNlZCB0aGF0IHlvdSBoYXZlIGlkZW50aWZpZWQgYW4gdW5maXhlZCBidWcsIHBsZWFzZSB0dXJuIHRvCisgICAgICBvdXIgZG9jdW1lbnQgY29uY2VybmluZyB0aGUgPGEgaHJlZj0iYnVncy5odG1sIj5idWcgZGF0YWJhc2U8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9wcm9qZWN0cy5odG1sIGIvdHJ1bmsvZG9jcy9wcm9qZWN0cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjc1NWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL3Byb2plY3RzLmh0bWwKQEAgLTAsMCArMSwxMzcyIEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBSZWxhdGVkIFByb2plY3RzPC90aXRsZT4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CisgICAgICAgICAgPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJTdGVmYW4gQm9kZXdpZyI+CisgIDxtZXRhIG5hbWU9ImVtYWlsIiBjb250ZW50PSJib2Rld2lnQGFwYWNoZS5vcmciPgorICAgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CisgICAgICAgIDxzY3JpcHQgc3JjPSIuL2JyZWFkY3J1bWJzLmpzIiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICAgIDwvcD4KKworICAgICAgPGRpdiBjbGFzcz0ibG9nb2JhciI+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBib3JkZXI9IjAiIGFsdD0iQXBhY2hlIEFudCBzaXRlIiBzcmM9Ii4vaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj48aW1nIGFsdD0iQXBhY2hlIEFudCBsb2dvIiBib3JkZXI9IjAiIHNyYz0iLi9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgb25zdWJtaXQ9InEudmFsdWUgPSBxdWVyeS52YWx1ZSArICcgc2l0ZTphbnQuYXBhY2hlLm9yZyciIGFjdGlvbj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWFyY2giIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSIjNEM2QzhGIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPjxpbWcgaGVpZ2h0PSIxMCIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJzZWFyY2hjYXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc2l6ZT0iMTUiIGlkPSJxdWVyeSIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICB0aGUgQXBhY2hlIEFudCBzaXRlCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgorICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0idGFiIGJhciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiM0QzZDOEYiPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj48Yj5Ib21lPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNSI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI4IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9Im5vbiBzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNGVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iI0IyQzRFMCI+PGEgaHJlZj0iLi9wcm9qZWN0cy9pbmRleC5odG1sIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj5Qcm9qZWN0czwvZm9udD48L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkFwYWNoZSBBbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9pbmRleC5odG1sIj5XZWxjb21lPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGljZW5zZS5odG1sIj5MaWNlbnNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYW50bmV3cy5odG1sIj5OZXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG9jdW1lbnRhdGlvbgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21hbnVhbC9pbmRleC5odG1sIj5NYW51YWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+UmVsYXRlZCBQcm9qZWN0czwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9leHRlcm5hbC5odG1sIj5FeHRlcm5hbCBUb29scyBhbmQgVGFza3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9yZXNvdXJjZXMuaHRtbCI+UmVzb3VyY2VzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vZmFxLmh0bWwiPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvYW50L0Zyb250UGFnZSI+V2lraTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2JsZW1zLmh0bWwiPkhhdmluZyBQcm9ibGVtcz88L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb3dubG9hZAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYmluZG93bmxvYWQuY2dpIj5CaW5hcnkgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIj5Tb3VyY2UgRGlzdHJpYnV0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkNvbnRyaWJ1dGluZworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21haWwuaHRtbCI+TWFpbGluZyBMaXN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3N2bi5odG1sIj5TdWJ2ZXJzaW9uIFJlcG9zaXRvcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL25pZ2h0bGllcy5odG1sIj5OaWdodGx5IEJ1aWxkczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J1Z3MuaHRtbCI+QnVnIERhdGFiYXNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+U3BvbnNvcnNoaXAKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiPlRoYW5rczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIj5TcG9uc29yc2hpcDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCI+RG9uYXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdCBNYW5hZ2VtZW50CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vY29udHJpYnV0b3JzLmh0bWwiPkNvbnRyaWJ1dG9yczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21pc3Npb24uaHRtbCI+QXBhY2hlIEFudCBNaXNzaW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnlsYXdzLmh0bWwiPlByb2plY3QgQnlsYXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGVnYWwuaHRtbCI+TGVnYWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iL2Fkcy9idXR0b25iYXIuaHRtbCIgLS0+CisgICAgPC9jZW50ZXI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IGxlZnQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LWxlZnQuZ2lmIj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQiIGhlaWdodD0iMTAiIHdpZHRoPSIxMCIgYm9yZGVyPSIwIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPlJlbGF0ZWQgUHJvamVjdHM8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IlJlbGF0ZWQgUHJvamVjdHMiPjwvYT4KKyAgICAgIFJlbGF0ZWQgUHJvamVjdHMKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+Tm90aGluZyBsaXN0ZWQgaGVyZSBpcyBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgdGhlIEFudAorICAgICAgZGV2ZWxvcGVycywgaWYgeW91IGVuY291bnRlciBhbnkgcHJvYmxlbXMgd2l0aCB0aGVtLCBwbGVhc2UgdXNlCisgICAgICB0aGUgY29udGFjdCBpbmZvcm1hdGlvbi48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFuZHJvTURBIj48L2E+CisgICAgICAgIEFuZHJvTURBCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW5kcm9NREEgaXMgYSBjb2RlIGdlbmVyYXRvciB0b29sIHRoYXQgZm9sbG93cyB0aGUgTW9kZWwKKyAgICAgICAgRHJpdmVuIEFyY2hpdGVjdHVyZSAoTURBKSBwYXJhZGlnbS4gSXQgdGFrZXMgYSBVTUwgbW9kZWwgZnJvbQorICAgICAgICBhIENBU0UtdG9vbCBhbmQgZ2VuZXJhdGVzIGNsYXNzZXMgYW5kIGRlcGxveWFibGUgY29tcG9uZW50cworICAgICAgICAoSjJFRSBvciBvdGhlcikgc3BlY2lmaWMgZm9yIHlvdXIgYXBwbGljYXRpb24KKyAgICAgICAgYXJjaGl0ZWN0dXJlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAxLjQuMSBhbmQgYWJvdmUKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb21kYS5vcmcvIj5odHRwOi8vd3d3LkFuZHJvTURBLm9yZy88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L21haWwvP2dyb3VwX2lkPTczMDQ3Ij5wcm9qZWN0IG1haWxpbmcgbGlzdHM8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBCU0QgbGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRDb250cmliIj48L2E+CisgICAgICAgIEFudENvbnRyaWIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgQW50LUNvbnRyaWIgcHJvamVjdCBpcyBhIGNvbGxlY3Rpb24gb2YgdXNlciBzdXBwbGllZAorICAgICAgICB0YXNrIChsaWtlIGFuIDxjb2RlPiZsdDtpZiZndDs8L2NvZGU+IHRhc2spIGFuZCBhIGRldmVsb3BtZW50CisgICAgICAgIHBsYXlncm91bmQgZm9yIGV4cGVyaW1lbnRhbCB0YXNrcyBsaWtlIGEgQy9DKysgY29tcGlsYXRpb24KKyAgICAgICAgdGFzayBmb3IgZGlmZmVyZW50IGNvbXBpbGVycy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgMS40LjEgYW5kIGFib3ZlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQtY29udHJpYi5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vYW50LWNvbnRyaWIuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvbWFpbC8/Z3JvdXBfaWQ9MzYxNzciPnByb2plY3QgbWFpbGluZyBsaXN0PC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRlbG9wZSI+PC9hPgorICAgICAgICBBbnRlbG9wZQorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgR1VJIGZvciBydW5uaW5nIEFudCBhbmQgZWRpdGluZyBidWlsZCBmaWxlcywgY2FuIHJ1biBhcworICAgICAgICBzdGFuZC1hbG9uZSBvciBhcyBhIHBsdWdpbiB0byBqRWRpdC4gSW4gYWRkaXRpb24gdG8gcnVubmluZworICAgICAgICB0YXJnZXRzLCBBbnRlbG9wZSBjYW4gZ2VuZXJhdGUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBhbmQgY2FuCisgICAgICAgIHRyYWNlL2Rpc3BsYXkgYSB0YXJnZXQncyBleGVjdXRpb24gcGF0aCB3aXRob3V0IGFjdHVhbGx5CisgICAgICAgIGV4ZWN1dGluZyB0aGUgdGFyZ2V0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SW5jbHVkZXMgc2V2ZXJhbCBhZGRpdGlvbmFsIHRhc2tzOiBBc3NlcnQsIElmL0Vsc2UsCisgICAgICAgIFRyeS9DYXRjaC9GaW5hbGx5LCBTd2l0Y2gsIFZhcmlhYmxlLCBTdG9wd2F0Y2gsIExpbWl0LCBNYXRoLAorICAgICAgICBQb3N0LCBTU0gsIFNDUCwgQW50RmV0Y2gsIEFudENhbGxCYWNrLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41IGFuZCBoaWdoZXIuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnRlbG9wZS50aWdyaXMub3JnLyI+aHR0cDovL2FudGVsb3BlLnRpZ3Jpcy5vcmcvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmRhbGVhbnNvbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiPkRhbGUgQW5zb248L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFudEhpbGwiPjwvYT4KKyAgICAgICAgQW50SGlsbAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudGhpbGwgaXMgYSBidWlsZCB0b29sIHRoYXQgcHJvbW90ZXMgYSBjb250cm9sbGVkIGJ1aWxkCisgICAgICAgIHByb2Nlc3MgYnkgZW5zdXJpbmcgdGhhdCBldmVyeSBidWlsZCByZWZsZWN0cyB0aGUgc291cmNlCisgICAgICAgIHJlcG9zaXRvcnkgY29udGVudHMgYW5kIHRhZ2dpbmcgdGhlIHJlcG9zaXRvcnkgd2l0aCBhIHVuaXF1ZQorICAgICAgICBidWlsZCBudW1iZXIgYWZ0ZXIgZXZlcnkgYnVpbGQuIEFudGhpbGwgYWxzbyBlbmNvdXJhZ2VzIHRoZQorICAgICAgICBzaGFyaW5nIG9mIGtub3dsZWRnZSB3aXRoaW4gYW4gb3JnYW5pemF0aW9uIGJ5IGF1dG9tYXRpY2FsbHkKKyAgICAgICAgdXBkYXRpbmcgYSBwcm9qZWN0IGludHJhbmV0IHNpdGUgd2l0aCBhcnRpZmFjdHMgZnJvbSB0aGUKKyAgICAgICAgbGF0ZXN0IGJ1aWxkLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBidW5kbGVzIEFudCAxLjMsIGlzIGNvbXBhdGlibGUgd2l0aCBBbnQgMS4zIHRvIDEuNC4xCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudXJiYW5jb2RlLmNvbS9wcm9qZWN0cy9hbnRoaWxsLyI+aHR0cDovL3d3dy51cmJhbmNvZGUuY29tL3Byb2plY3RzL2FudGhpbGwvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOm1iekB1cmJhbmNvZGUuY29tIj5NYWNpZWogWmF3YWR6a2k8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBNb3ppbGxhLWxpa2UgbGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnRpZ2VuIj48L2E+CisgICAgICAgIEFudGlnZW4KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BbnRpZ2VuIChBbnQgSW5zdGFsbGVyIEdlbmVyYXRvcikgaXMgYSB0b29sIHRvIHRha2UgYW4gQW50IGJ1aWxkIHNjcmlwdCwgY29tYmluZSBpdCB3aXRoIGEgR1VJCisgICAgICAgIGFuZCB3cmFwIGl0IHVwIGFzIGFuIGV4ZWN1dGFibGUgamFyIGZpbGUuIEl0cyBtYWluIHVzZSBpcyBmb3IgY3JlYXRpbmcgZ3JhcGhpY2FsLCBhbnQtYmFzZWQgaW5zdGFsbGVycy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgYnVuZGxlcyBBbnQgMS42LjIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudGlnZW4uc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2FudGlnZW4uc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpqb2huZGF2aWR0YXlsb3JAdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5Kb24gVGF5bGVyPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFudEluc3RhbGxlciI+PC9hPgorICAgICAgICBBbnRJbnN0YWxsZXIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5CdWlsZHMgTVNJIHN0eWxlIGluc3RhbGxlcnMgKHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbikKKyAgICAgICAgdXNpbmcgQW50IGFzIEJhY2sgZW5kLiBVSSBkZXZlbG9wZWQgYnkgd3JpdGluZyBhbiBYTUwgaW5zdGFsbAorICAgICAgICBkZXNjcmlwdG9yLiAgUnVudGltZSBsYXVuY2hlZCBmcm9tIHNjcmlwdHMgb3IgYW4gYWxsIGluY2x1c2l2ZQorICAgICAgICBKYXIuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYuMSBvdGhlcnMgbm90IHRlc3RlZAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50aW5zdGFsbGVyLnNmLm5ldC8iPmh0dHA6Ly9hbnRpbnN0YWxsZXIuc2YubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzp0ZWtub3BhdWxAdXNlcnMuc291cmNlZm9yZ2UubmV0Ij50ZWtub3BhdWxAdXNlcnMuc291cmNlZm9yZ2UubmV0PC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTEdQTCBidXQgaW4gdGhlIHByb2Nlc3Mgb2Ygb2YgbW92aW5nIHRvIEFwYWNoZTIuMCBvbiByZXF1ZXN0CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFudGxpb24iPjwvYT4KKyAgICAgICAgQW50bGlvbgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBBbnRsaW9uIFByb2plY3QgYWRkcyB2YWx1ZSB0byBBbnQgYnVpbGQgc2NyaXB0cyBieSBwcm92aWRpbmcKKyAgICAgICAgdGFza3Mgd2hpY2ggY2VudHJhbGl6ZXMgdGhlIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBhbmQgZW5hYmxlcworICAgICAgICBwcm9qZWN0cyB0byBkZWZpbmUgZGVwZW5kZW5jaWVzIHVwb24gb3RoZXIgcHJvamVjdHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5FeHRlcm5hbCBkZXBlbmRlbmNpZXMgbWF5IGJlIGxvYWRlZCBmcm9tIGEgY3VzdG9tIGxvY2FsCisgICAgICAgIHJlcG9zaXRvcnkgb3IgTWF2ZW4tbGlrZSByZW1vdGUgcmVwb3NpdG9yaWVzLiBBbnRsaW9uIGhhbmRsZXMKKyAgICAgICAgdGhlIGdlbmVyYXRpb24gb2YgcHJvcGVydGllcywgZmlsZXNldHMsIGFuZCBwYXRocy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkludGVyLXByb2plY3QgZGVwZW5kZW5jaWVzIGFsbG93IGZvciBidWlsZGluZyB0aGUgb3RoZXIKKyAgICAgICAgcHJvamVjdCdzIGZpbGVzIGlmIHRoZXkgYXJlbid0IGFscmVhZHkgYnVpbHQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnRsaW9uLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnRsaW9uLnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwczovL3NvdXJjZWZvcmdlLm5ldC9tYWlsLz9ncm91cF9pZD05MzQxMCI+UHJvamVjdCBtYWlsaW5nIGxpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50U2hlbGxFeHQgKEFudCBTaGVsbCBFeHRlbnNpb24pIj48L2E+CisgICAgICAgIEFudFNoZWxsRXh0IChBbnQgU2hlbGwgRXh0ZW5zaW9uKQorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFudCBTaGVsbCBFeHRlbnNpb24gaXMgYSBXaW5kb3dzIEV4cGxvcmVyIGVuaGFuY2VtZW50IHRoYXQgYWRkcyBhIGNvbnRleHR1YWwgCisgICAgICAgIG1lbnUgd2hlbiB5b3UgcmlnaHQgY2xpY2sgb3ZlciBhbiBBbnQgeG1sIGZpbGUsIHNvIHlvdSBjYW4gZXhlY3V0ZSBhbGwgdGhlIGFjdGlvbnMgCisgICAgICAgIGRlZmluZWQgaW4gdGhhdCBmaWxlIHdpdGhvdXQgZ29pbmcgdG8gYSBjb21tYW5kIGNvbnNvbGUgb3Igc3RhcnRpbmcgeW91ciBmYXZvdXJpdGUgCisgICAgICAgIElERSB0byBtYWtlIGEgc2ltcGxlIGNsZWFuLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBUZXN0ZWQgd2l0aCBBbnQgMS42IGFuZCBsYXRlciwgc2hvdWxkIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5lbHBhZ2VzdGlvbi5jb20vb3NfYW50X2VuLnNodG1sIj4KKyAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmVscGFnZXN0aW9uLmNvbS9vc19hbnRfZW4uc2h0bWw8L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpvcGVuc291cmNlQGVscGFnZXN0aW9uLmNvbSI+UHJvamVjdCBtYWlsPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTEdQTAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnR3b3JrcyI+PC9hPgorICAgICAgICBBbnR3b3JrcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBhbnR3b3JrcyBwcm9qZWN0IGlzIGEgc2V0IG9mIHRvb2xzIGFuZCBzdGFuZGFyZGl6ZWQgdGFyZ2V0cyB0aGF0CisgICAgICAgIGdyZWF0bHkgc2ltcGxpZmllcyB1c2luZyBhbnQgaW4geW91ciBwcm9qZWN0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgZHJpdmVyIGJlaGluZCBhbnR3b3JrcyBpcyBJbXBvcnRlci4gSW1wb3J0ZXIgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZQorICAgICAgICAgICAgYW50IGltcG9ydCB0YXNrIHRoYXQgd2lsbCBkb3dubG9hZCBhbmQKKyAgICAgICAgICAgIGNhY2hlIGFuIGFudCBidWlsZC54bWwgZmlsZSBhbmQgaXQncyBhc3NvY2lhdGVkIHJlc291cmNlcyBjYWxsZWQKKyAgICAgICAgICAgIGFudGxldHMuICBBbnRsZXRzIGFyZSBhdmFpbGFibGUgZm9yIEphdmEgY29tcGlsaW5nCisgICAgICAgICAgICBhbmQgcGFja2FnaW5nLCAgSlVuaXQsIEZvcnJlc3QsIEoyRUUgYW5kCisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50d29ya3Muc291cmNlZm9yZ2UubmV0L2FudGxldHMvIj5tb3JlPC9hPi4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9hbnR3b3Jrcy5zb3VyY2Vmb3JnZS5uZXQvc3RhcnQuaHRtbCAiPkdldHRpbmcgU3RhcnRlZDwvYT4KKyAgICAgICAgICAgIGd1aWRlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDEuNiBhbmQgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudHdvcmtzLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnR3b3Jrcy5zb3VyY2Vmb3JnZS5uZXQvaW5kZXguaHRtbDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vYW50d29ya3MtZGV2ZWxvcGVycyI+QW50d29ya3MgRGV2ZWxvcGVycyBtYWlsaW5nIGxpc3RzPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVGhlIEFwYWNoZSBMaWNlbnNlIDIuMAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJCdWlsZE1vbmtleSI+PC9hPgorICAgICAgICBCdWlsZE1vbmtleQorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkJ1aWxkTW9ua2V5IGlzIGEgV2ViLWJhc2VkIGF1dG9tYXRlZCBidWlsZCBkYXNoYm9hcmQsIHdpdGggdXBsb2FkCisgICAgICAgICAgIGNhcGFiaWxpdHkgYW5kIGdvb2dsZSB3ZWIgc2VhcmNoLiBJdCBzY2hlZHVsZXMgdGhlIHJ1bm5pbmcgb2YgQW50CisgICAgICAgICAgIGJ1aWxkIHNjcmlwdHMgLSBjaGVja2luZyBzb3VyY2VzIG91dCBvZiBDTSAtIGFuZCBtYWtlcyB0aGUgcmVzdWx0cworICAgICAgICAgICBhdmFpbGFibGUgY2VudHJhbGx5LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS41LjQgb3IgbGF0ZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5idWlsZG1vbmtleS5jb20vIj5odHRwOi8vd3d3LmJ1aWxkbW9ua2V5LmNvbS88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86amJAYnVpbGRtb25rZXkuY29tIj5qYkBidWlsZG1vbmtleS5jb208L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBGcmVld2FyZSwgY29tbWVyY2lhbC9zdXBwb3J0IGxpY2VuY2VzIGF2YWlsYWJsZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJDcnVpc2VDb250cm9sIj48L2E+CisgICAgICAgIENydWlzZUNvbnRyb2wKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5DcnVpc2VDb250cm9sIGlzIGEgdG9vbCBmb3Igc2V0dGluZyB1cCBhIGNvbnRpbnVvdXMgYnVpbGQKKyAgICAgICAgcHJvY2Vzcy4gIENydWlzZUNvbnRyb2wgcHJvdmlkZXMgYW4gQW50IHdyYXBwZXIgYW5kIGEgc2V0IG9mCisgICAgICAgIHRhc2tzIHRvIGF1dG9tYXRlIHRoZSBjaGVja291dC9idWlsZC90ZXN0IGN5Y2xlLiBDcnVpc2VDb250cm9sCisgICAgICAgIGFsc28gY29tZXMgYnVuZGxlZCB3aXRoIGEgc2VydmxldCBmb3Igdmlld2luZyB0aGUgc3RhdHVzIG9mCisgICAgICAgIHRoZSBjdXJyZW50IGJ1aWxkLCBhcyB3ZWxsIGFzIHByZXZpb3VzIGJ1aWxkIHJlc3VsdHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjIgYW5kIGhpZ2hlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3J1aXNlY29udHJvbC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vY3J1aXNlY29udHJvbC5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NydWlzZWNvbnRyb2wuc291cmNlZm9yZ2UubmV0L2NvbnRhY3QuaHRtbCI+UHJvamVjdCBNYWlsaW5nIExpc3RzIGFuZCBBZG1pbmlzdHJhdG9yczwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFJlbGVhc2UgMS4wIGhhcyBiZWVuIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgICAgICAgICAgIExpY2Vuc2UuICBTdGFydGluZyB3aXRoIHJlbGVhc2UgMS4xIHRoZSBsaWNlbnNlIGhhcyBiZWVuCisgICAgICAgICAgICBjaGFuZ2VkIHRvIGEgQlNELWxpa2UgbGljZW5zZS4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iSW52aWN0YSI+PC9hPgorICAgICAgICBJbnZpY3RhCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+SW52aWN0YSBpcyBhIGJ1aWxkIG1hbmFnZW1lbnQgdG9vbC4gVXNpbmcgc2ltcGxlIHByb2plY3QgZGVmaW5pdGlvbiBmaWxlcywKKyAgICAgICAgaXQgZ2VuZXJhdGVzIHBvd2VyZnVsIGJ1aWxkIHNjcmlwdHMgKHN1Y2ggYXMgQU5UKSB3aGlsZSBoaWRpbmcgdGhlaXIKKyAgICAgICAgY29tcGxleGl0eS4gSW52aWN0YSBpcyBhIG1vZHVsYXIgZnJhbWV3b3JrIHRoYXQgYWxsb3dzIGRldmVsb3BpbmcgYWRkaXRpb25hbAorICAgICAgICBjb21wb25lbnRzIGFuZCBvdXRwdXQgdHlwZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjUgYW5kIGhpZ2hlcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vaW52aWN0YS5zZi5uZXQvIj5odHRwOi8vaW52aWN0YS5zZi5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2ludmljdGEuc2YubmV0L2NvbnRhY3QuaHRtbCI+UHJvamVjdCBNYWlsaW5nIExpc3RzIGFuZCBBZG1pbmlzdHJhdG9yczwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExHUEwuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkpBTSAtIEphdmFHZW4gQW50IE1vZHVsZXMiPjwvYT4KKyAgICAgICAgSkFNIC0gSmF2YUdlbiBBbnQgTW9kdWxlcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkpBTSBpcyBhIG1vZHVsYXIgQW50IHRvb2xraXQgZm9yIGRldmVsb3BpbmcgYW5kIHRlc3RpbmcgSmF2YS9KMkVFCisgICAgICAgIGFwcGxpY2F0aW9ucy4gSkFNIHN1cHBvcnRzIEVKQiBhbmQgU2VydmxldC9KU1AgZGV2ZWxvcG1lbnQgdXNpbmcgWERvY2xldCwKKyAgICAgICAgSlVuaXQsIENhY3R1cywgTWF2ZW4sIENhc3RvciBhbmQgTURBL1VNTCBjb2RlIGdlbmVyYXRpb24gb24gdmFyaW91cyBKMkVFCisgICAgICAgIHNlcnZlcnMgaW5jbHVkaW5nIEpCb3NzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS42CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamF2YWdlbi5jb20vamFtLmpzcCI+aHR0cDovL3d3dy5qYXZhZ2VuLmNvbS9qYW0uanNwPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhZ2VuLmNvbS9mZWVkYmFjay5kbyI+RmVlZGJhY2s8L2E+IDxiciAvPgorICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamF2YWdlbi5jb20vYnVncy5kbyI+QnVnIFJlcG9ydHM8L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEdQTAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJLcnlzYWxpcyBDZW50aXBlZGUiPjwvYT4KKyAgICAgICAgS3J5c2FsaXMgQ2VudGlwZWRlCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIENlbnRpcGVkZSBhZG1pbiB0b2xkIHVzLCB0aGF0IHRoYXQgcHJvamVjdAorICAgICAgICAgICAiaXMgbm8gbW9yZSIgYW5kIHRoYXQgIkFudHdvcmtzIGhhcyB0YWtlbiBpdCBwbGFjZS4iCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJMZWFmY3V0dGVyIj48L2E+CisgICAgICAgIExlYWZjdXR0ZXIKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5MZWFmY3V0dGVyIGlzIGFuIEFQSSB3aGljaCBhbGxvd3MgeW91IHRvIGV4ZWN1dGUgQW50IHRhc2tzIGZyb20gSmF2YSBjb2RlLiA8YnIgLz4KKyAgICAgICAgICAgTGVhZmN1dHRlciBpcyB1c2VmdWwgYXM6IDx1bD4KKyAgICAgICAgICAgPGxpPkEgd2F5IG9mIGludGVncmF0aW5nIEFudCB0YXNrcyBpbnRvIGV4aXN0aW5nIEphdmEgcHJvZ3JhbXMuIDwvbGk+CisgICAgICAgICAgIDxsaT5BIHdob2xlc2FsZSBhbHRlcm5hdGl2ZSB0byBzdGFuZGFyZCBBbnQgZm9yIHByb2Nlc3MgYXV0b21hdGlvbi4gPC9saT4KKyAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxpPnVua25vd248L2k+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vbGVhZmN1dHRlci5kZXYuamF2YS5uZXQvIj5odHRwczovL2xlYWZjdXR0ZXIuZGV2LmphdmEubmV0LzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vbGVhZmN1dHRlci5kZXYuamF2YS5uZXQvc2VydmxldHMvUHJvamVjdEZvcnVtVmlldyI+RGlzY3Vzc2lvbiBGb3J1bTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0ibHVudGJ1aWxkIj48L2E+CisgICAgICAgIGx1bnRidWlsZAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkx1bnRidWlsZCBpcyBhbiBvcGVuIHNvdXJjZSBidWlsZCBhdXRvbWF0aW9uIGFuZCBtYW5hZ2VtZW50CisgICAgICAgIHRvb2wgYmFzZWQgb24gQXBhY2hlIEFudC4gQnVpbGRzIGFyZSBzZXR1cCB0aHJvdWdoIGNvbmNlcHRzIG9mCisgICAgICAgIHByb2plY3RzLCB2aWV3cywgc2NoZWR1bGVzLCBtb2R1bGVzLCBldGMuIEFsbCBjb25maWd1cmF0aW9ucworICAgICAgICBhbmQgbW9uaXRvcmluZyB0YXNrcyBpcyBwZXJmb3JtZWQgZnJvbSBhIGNsZWFuIHdlYgorICAgICAgICBpbnRlcmZhY2UuIEl0IHN1cHBvcnRzIHNjaGVkdWxlcyBidWlsZHMsIGZvcmNlIGJ1aWxkcywKKyAgICAgICAgcmVidWlsZHMsIGNsZWFuIGJ1aWxkLCBpbmNyZW1lbnQgYnVpbGQsIGV0Yy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEueAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9sdW50YnVpbGQvIj5odHRwOi8vd3d3LnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9sdW50YnVpbGQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9sdW50YnVpbGQvIj5sdW50YnVpbGQgcHJvamVjdCBwYWdlPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgT3BlbnNvdXJjZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJOQW50Ij48L2E+CisgICAgICAgIE5BbnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5OQW50IGlzIGEgLk5FVCBiYXNlZCBidWlsZCB0b29sLiBJbiB0aGVvcnkgaXQgaXMga2luZCBvZgorICAgICAgICBsaWtlIG1ha2Ugd2l0aG91dCBtYWtlJ3Mgd3JpbmtsZXMuIEluIHByYWN0aWNlIGl0J3MgYSBsb3QgbGlrZQorICAgICAgICBBbnQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIGNvbXBhdGlibGUgaW4gc3Bpcml0LgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vbmFudC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vbmFudC5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9tYWlsLz9ncm91cF9pZD0zMTY1MCI+cHJvamVjdCBtYWlsaW5nIGxpc3Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJQYXJhYnVpbGQiPjwvYT4KKyAgICAgICAgUGFyYWJ1aWxkCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGFyYWJ1aWxkIGlzIGFuIGF1dG9tYXRlZCBtdWx0aXBsYXRmb3JtIGJ1aWxkIG1hbmFnZW1lbnQgc2VydmVyLgorICAgICAgICBQYXJhYnVpbGQgaGVscHMgc29mdHdhcmUgdGVhbXMgYW5kIG9yZ2FuaXphdGlvbnMgb2YgYWxsIHNpemVzIHJlZHVjZQorICAgICAgICByaXNrcyBvZiBwcm9qZWN0IGZhaWx1cmVzIGFuZCBpbmNyZWFzZSBwcm9kdWN0aXZpdHkgYnkgcHJvdmlkaW5nIHByb3ZpZGVzCisgICAgICAgIGF1dG9tYXRpYyBjb250aW51b3VzIGludGVncmF0aW9uIGJ1aWxkcyBhbmQgc3RhYmxlIHNjaGVkdWxlZCBidWlsZHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjMgYW5kIGxhdGVyCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudmlld3RpZXIuY29tL3Byb2R1Y3RzL3BhcmFidWlsZC5odG0iPmh0dHA6Ly93d3cudmlld3RpZXIuY29tL3Byb2R1Y3RzL3BhcmFidWlsZC5odG08L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnZpZXd0aWVyLmNvbS9hYm91dF91cy5odG0iPmh0dHA6Ly93d3cudmlld3RpZXIuY29tL2Fib3V0X3VzLmh0bTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbW1lcmNpYWwKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iUmFudCI+PC9hPgorICAgICAgICBSYW50CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UmFudCBzdGFuZHMgZm9yIFJlbW90ZSBBbnQuIEl0IGlzIGEgZGlzdHJpYnV0ZWQgYnVpbGQKKyAgICAgICAgc3lzdGVtIHRoYXQgYWxsb3dzIGFuIEFudCBidWlsZCBmaWxlIHRvIGxhdW5jaCBidWlsZHMgb24gb3RoZXIKKyAgICAgICAgc3lzdGVtcyBhbmQgcmVjZWl2ZSBleGNlcHRpb25zIHNob3VsZCB0aGV5IG9jY3VyLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS40CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvcmVtb3RlYW50LyI+aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9yZW1vdGVhbnQvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmNuZWxzb25AZWlubm92YXRpb24uY29tIj5DaHJpcyBOZWxzb248L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBNSVQgTGljZW5zZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJTYXZhbnQiPjwvYT4KKyAgICAgICAgU2F2YW50CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+U2F2YW50IGhlbHBzIHNpbXBsaWZ5IGJ1aWxkcyBhbmQgY29kZWJhc2VzIGJ5IGhhbmRsaW5nIHRoZQorICAgICAgICByZXNvbHV0aW9uIG9mIHByb2plY3QgZGVwZW5kZW5jaWVzIGF1dG9tYXRpY2FsbHkuIFNhdmFudCBzdXBwb3J0cworICAgICAgICBNYXZlbiBzdHlsZSBkZXBlbmRlbmN5IGRvd25sb2FkcyBhbmQgdmFyaW91cyBvdGhlciBtZXRob2RzIG9mCisgICAgICAgIHJldHJpZXZpbmcgZGVwZW5kZW5jaWVzLCBpbmNsdWRpbmcgZmV0Y2hpbmcgZmlsZXMgZnJvbSBDVlMgbW9kdWxlcy4KKyAgICAgICAgU2F2YW50IGdvZXMgYSBzdGVwIGZ1cnRoZXIgdGhhbiBvdGhlciBkZXBlbmRlbmN5IHNvbHV0aW9ucyBhbmQgcHJvdmlkZXMKKyAgICAgICAgdGhlIG1lYW5zIGZvciBtdWx0aXBsZSBpbnRlcm5hbCBwcm9qZWN0cyB0byBidWlsZCBlYWNoIG90aGVyIGluIG9yZGVyCisgICAgICAgIHRvIHJlc29sdmUgaW50ZXItcHJvamVjdCBkZXBlbmRlbmNpZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5TYXZhbnQgY2FuIGJlIHVzZWQgdmlhIHZhcmlvdXMgQW50IHR5cGVzIGFuZCB0YXNrcyBhcyB3ZWxsIGFzIHVzZWQKKyAgICAgICAgZnJvbSBhbnkgSmF2YSBhcHBsaWNhdGlvbiBpbmNsdWRpbmcgdGhvc2UgdGhhdCBkbyBub3QgbWFrZSB1c2Ugb2YgQW50LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29tcGF0aWJpbGl0eToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBbnQgMS42LjEKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5pbnZlcnNvZnQuY29tLyI+aHR0cDovL3d3dy5pbnZlcnNvZnQuY29tLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb250YWN0OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW52ZXJzb2Z0LmNvbS9jb250YWN0Lmh0bWwiPmh0dHA6Ly93d3cuaW52ZXJzb2Z0LmNvbS9jb250YWN0Lmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMR1BMCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IldlYlRlc3QiPjwvYT4KKyAgICAgICAgV2ViVGVzdAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPldlYlRlc3QgaXMgYSBmcmVlIG9wZW4gc291cmNlIHRvb2wgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nIG9mIHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICAgIEl0IGlzIGEgc2V0IG9mIHBvd2VyZnVsIEFudCB0YXNrcyBhbGxvd2luZyB0byBjYWxsIHdlYiBwYWdlcywgbWltaWMgdXNlciBhY3Rpb25zCisgICAgICAgIChjbGlja2luZyBsaW5rcywgZmlsbGluZyBmb3JtcywgLi4uKSBhbmQgdmVyaWZ5IHRoZSByZXN1bHRzLgorICAgICAgICBUaGUgZ2VuZXJhdGVkIHJlcG9ydHMgZ2l2ZSBjb21wcmVoZW5zaXZlIGluZm9ybWF0aW9uIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgb2YgdGhlIHRlc3Qgc3RlcHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjYuNQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2VidGVzdC5jYW5vby5jb20vIj5odHRwOi8vd2VidGVzdC5jYW5vby5jb20vPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmNhbm9vLmNvbS9tYWlsbWFuL2xpc3RpbmZvL3dlYnRlc3QvIj5wcm9qZWN0IG1haWxpbmcgbGlzdDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBMaWNlbnNlOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFwYWNoZSBsaWtlIGxpY2Vuc2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iWE1MIFB1YmxpY2F0aW9uIj48L2E+CisgICAgICAgIFhNTCBQdWJsaWNhdGlvbgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlhNTCBQdWJsaWNhdGlvbiBpcyBhIHNldCBvZiB0b29scyB0byBnZW5lcmF0ZSBXZWIgcGFnZXMKKyAgICAgICAgZnJvbSBkZXNrdG9wIGRvY3VtZW50cyBvciBvdGhlciBzdHJ1Y3R1cmVkIGRvY3VtZW50cyB1c2luZworICAgICAgICBYU0xUIGFuZCBBbnQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBDb21wYXRpYmlsaXR5OgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEFudCAxLjQKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL1hNTHB1YmxpY2F0aW9uLm9yZy8iPmh0dHA6Ly9YTUxwdWJsaWNhdGlvbi5vcmcvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbnRhY3Q6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmptdmFuZWxAZnJlZS5mciI+SmVhbi1NYXJjIFZhbmVsPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExpY2Vuc2U6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9InlFZCI+PC9hPgorICAgICAgICB5RWQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD55RWQgaXMgYSBmcmVld2FyZSBtdWx0aS1wdXJwb3NlIGdyYXBoIGFuZCBkaWFncmFtIGVkaXRvcgorICAgICAgICB0aGF0IHJ1bnMgb24gdGhlIEphdmEgMiBwbGF0Zm9ybS4gSXQgcHJvdmlkZXMgYW4gaW1wb3J0IGZpbHRlcgorICAgICAgICBmb3IgQW50IGJ1aWxkIHNjcmlwdHMgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBjb252ZW5pZW50bHkKKyAgICAgICAgZGlzcGxheSBhbmQgYnJvd3NlIHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUgZGlmZmVyZW50IHRhcmdldHMKKyAgICAgICAgb2YgdGhlIGJ1aWxkIGZpbGUuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQKKyAgICAgICAgdW5kZXJzdGFuZGluZyBsYXJnZSBidWlsZCBmaWxlcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENvbXBhdGliaWxpdHk6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IDEueAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lnl3b3Jrcy5jb20vcHJvZHVjdHMveWVkLyI+aHR0cDovL3d3dy55d29ya3MuY29tL3Byb2R1Y3RzL3llZC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQ29udGFjdDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lnl3b3Jrcy5jb20vZW4vY29tcGFueV9jb250YWN0Lmh0bSI+eVdvcmtzIFN1cHBvcnQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTGljZW5zZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBGcmVld2FyZQorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IS0tCisgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoIiAtICIrIkxhc3QgUHVibGlzaGVkOiAiICsgZG9jdW1lbnQubGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgLy8gIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvcD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL3Byb2plY3RzL2luZGV4Lmh0bWwgYi90cnVuay9kb2NzL3Byb2plY3RzL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0MDc1MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvcHJvamVjdHMvaW5kZXguaHRtbApAQCAtMCwwICsxLDE4NCBAQAorCisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgICAgICA8aHRtbCBsYW5nPSJlbiI+CisgICAgPCEtLSBHRU5FUkFURUQgRklMRSwgRE8gTk9UIEVESVQsIEVESVQgVEhFIFhNTCBGSUxFIElOIHhkb2NzIElOU1RFQUQhIC0tPgorICAgIDxoZWFkPgorICAgICAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgICAgICAgIDx0aXRsZT5BcGFjaGUgQW50IC0gV2VsY29tZTwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IkNocmlzdG9waCBXaWxoZWxtcyI+CisgIDxtZXRhIG5hbWU9ImVtYWlsIiBjb250ZW50PSJjaHJpc3RvcGgud2lsaGVsbXNAdC1vbmxpbmUuZGUiPgorICAgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CisgICAgICAgIDxzY3JpcHQgc3JjPSIuLi9icmVhZGNydW1icy5qcyIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgICA8L3A+CisKKyAgICAgIDxkaXYgY2xhc3M9ImxvZ29iYXIiPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgYm9yZGVyPSIwIiBhbHQ9IkFwYWNoZSBBbnQgc2l0ZSIgc3JjPSIuLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIuLi9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgb25zdWJtaXQ9InEudmFsdWUgPSBxdWVyeS52YWx1ZSArICcgc2l0ZTphbnQuYXBhY2hlLm9yZyciIGFjdGlvbj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWFyY2giIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSIjNEM2QzhGIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPjxpbWcgaGVpZ2h0PSIxMCIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InNlYXJjaGNhcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJxIiB0eXBlPSJoaWRkZW4iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICB0aGUgQXBhY2hlIEFudCBzaXRlCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4uL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiIj4KKyAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InRhYiBiYXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9Im5vbiBzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNGVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiNCMkM0RTAiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPkhvbWU8L2ZvbnQ+PC9hPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjNEM2QzhGIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+UHJvamVjdHM8L2I+PC9mb250PjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsdWViYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ibWVudWNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+UHJvamVjdHMKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+V2VsY29tZTwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BbnQgTGlicmFyaWVzCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvaW5kZXguaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvY2hhcnRlci5odG1sIj5DaGFydGVyPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvcHJvcGVyLmh0bWwiPkFudCBMaWJyYXJpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vYW50bGlicy9zYW5kYm94Lmh0bWwiPlNhbmRib3ggQW50IExpYnJhcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3NyY2Rvd25sb2FkLmNnaSI+U291cmNlIERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5JdnkKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vcHJvamVjdHMvaXZ5Lmh0bWwiPkludHJvZHVjdGlvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5LyI+SG9tZXBhZ2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS9kb3dubG9hZC5jZ2kiPkRpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9pdnkvIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxjZW50ZXI+CisgICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9hZHMvYnV0dG9uYmFyLmh0bWwiIC0tPgorICAgIDwvY2VudGVyPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiBsZWZ0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPldlbGNvbWU8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IldlbGNvbWUgdG8gdGhlIEFudCBQcm9qZWN0cyBBcmVhIj48L2E+CisgICAgICBXZWxjb21lIHRvIHRoZSBBbnQgUHJvamVjdHMgQXJlYQorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDM+VGhpcyBpcyB3aGVyZSB0aGUgQW50IHN1Yi1wcm9qZWN0cyBsaXZlITwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vdywgdGhhdCBBbnQgaGFzIGJlY29tZSBhbiBBcGFjaGUgVG9wLUxldmVsIFByb2plY3QgaXQgaXMgdGltZSB0byBtYWtlIHNwYWNlIG9uIHRoaXMKKyAgICBXZWItUGFnZSBmb3IgQW50IHN1Yi1wcm9qZWN0cy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRvIG1ha2Ugc3VyZSB5b3UgZG8gbm90IG1pc3MgYW55dGhpbmc6IFN0YXkgdHVuZWQgYW5kIHZpc2l0IHRoaXMgcGFnZSBmcm9tIHRpbWUgdG8gdGltZSA6KSEKKyAgICA8L3A+CisgICAgICAgICAgICAgICAgCisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgICAgICAgIDxwIGNsYXNzPSJjb3B5cmlnaHQiPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhLS0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC53cml0ZSgiIC0gIisiTGFzdCBQdWJsaXNoZWQ6ICIgKyBkb2N1bWVudC5sYXN0TW9kaWZpZWQpOworICAgICAgICAgICAgICAvLyAgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9wPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3MvcHJvamVjdHMvaXZ5Lmh0bWwgYi90cnVuay9kb2NzL3Byb2plY3RzL2l2eS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmQ0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL3Byb2plY3RzL2l2eS5odG1sCkBAIC0wLDAgKzEsMTgxIEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBUaGUgSXZ5IFN1YnByb2plY3Q8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CisgICAgICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPHAgY2xhc3M9Im5hdnBhdGgiPgorICAgICAgICA8c2NyaXB0IHNyYz0iLi4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi4vaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj48aW1nIGFsdD0iQXBhY2hlIEFudCBsb2dvIiBib3JkZXI9IjAiIHNyYz0iLi4vaW1hZ2VzL3Byb2plY3QtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIG9uc3VibWl0PSJxLnZhbHVlID0gcXVlcnkudmFsdWUgKyAnIHNpdGU6YW50LmFwYWNoZS5vcmcnIiBhY3Rpb249Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2giIG1ldGhvZD0iZ2V0Ij4KKyAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VhcmNoIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iIzRDNkM4RiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJzZWFyY2hjYXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc2l6ZT0iMTUiIGlkPSJxdWVyeSIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4uL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuLi9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiI+CisgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNSI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI4IiB3aWR0aD0iOCIgc3JjPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJub24gc2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjRlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj5Ib21lPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYi1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ic2VsZWN0ZWQgdGFiIiBzdHlsZT0iaGVpZ2h0OiAxLjVlbSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iIzRDNkM4RiI+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPlByb2plY3RzPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL3RhYlNlbC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlByb2plY3RzCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL3Byb2plY3RzL2luZGV4Lmh0bWwiPldlbGNvbWU8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5BbnQgTGlicmFyaWVzCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvaW5kZXguaHRtbCI+SW50cm9kdWN0aW9uPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvY2hhcnRlci5odG1sIj5DaGFydGVyPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4uL2FudGxpYnMvcHJvcGVyLmh0bWwiPkFudCBMaWJyYXJpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vYW50bGlicy9zYW5kYm94Lmh0bWwiPlNhbmRib3ggQW50IExpYnJhcmllczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPkJpbmFyeSBEaXN0cmlidXRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3NyY2Rvd25sb2FkLmNnaSI+U291cmNlIERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5JdnkKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi4vcHJvamVjdHMvaXZ5Lmh0bWwiPkludHJvZHVjdGlvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaXZ5LyI+SG9tZXBhZ2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS9kb3dubG9hZC5jZ2kiPkRpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9pdnkvIj5XaWtpPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxjZW50ZXI+CisgICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9hZHMvYnV0dG9uYmFyLmh0bWwiIC0tPgorICAgIDwvY2VudGVyPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiBsZWZ0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9tZW51LXJpZ2h0LmdpZiI+CisgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0ibGlnaHRibHVlYmFyIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPlRoZSBJdnkgU3VicHJvamVjdDwvaDE+CisgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iVGhlIEl2eSBTdWJwcm9qZWN0Ij48L2E+CisgICAgICBUaGUgSXZ5IFN1YnByb2plY3QKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkFwYWNoZSBJdnk8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5JdnkgaXMgYSBzaW1wbGUgeWV0IHBvd2VyZnVsIGRlcGVuZGVuY3kgbWFuYWdlciBmZWF0dXJpbmcgY29udGludW91cyBpbnRlZ3JhdGlvbiwKKyAgICAgIGRlcGVuZGVuY2llcyBvZiBkZXBlbmRlbmNpZXMgbWFuYWdlbWVudCwgbXVsdGlwbGUgcmVwb3NpdG9yaWVzIGluY2x1ZGluZyBpYmlibGlvIGFuZAorICAgICAgaGlnaCBwZXJmb3JtYW5jZSAodXNlIG9mIGEgbG9jYWwgY2FjaGUpLjwvcD4KKyAgICAgICAgICAgICAgICAKKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvZG9jcy9yZXNvdXJjZXMuaHRtbCBiL3RydW5rL2RvY3MvcmVzb3VyY2VzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3MmY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3MvcmVzb3VyY2VzLmh0bWwKQEAgLTAsMCArMSwxNDQ0IEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBSZXNvdXJjZXM8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgICA8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IlN0ZWZhbiBCb2Rld2lnIj4KKyAgPG1ldGEgbmFtZT0iZW1haWwiIGNvbnRlbnQ9ImJvZGV3aWdAYXBhY2hlLm9yZyI+CisgICAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxwIGNsYXNzPSJuYXZwYXRoIj4KKyAgICAgICAgPHNjcmlwdCBzcmM9Ii4vYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iLi9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIuL2ltYWdlcy9wcm9qZWN0LWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlYXJjaCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IiM0QzZDOEYiPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyI+PGltZyBoZWlnaHQ9IjEwIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InNlYXJjaGNhcHRpb24iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJxIiB0eXBlPSJoaWRkZW4iPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzaXplPSIxNSIgaWQ9InF1ZXJ5IiB0eXBlPSJ0ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJTZWFyY2giIHZhbHVlPSJTZWFyY2giIHR5cGU9InN1Ym1pdCI+CisgICAgICAgICAgICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgICAgICAgICAgIHRoZSBBcGFjaGUgQW50IHNpdGUKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1sZWZ0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iLi9pbWFnZXMvc2VhcmNoLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYiI+CisgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJ0YWIgYmFyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iIzRDNkM4RiI+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPkhvbWU8L2I+PC9mb250PjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iIzRDNkM4RiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWJTZWwtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ibm9uIHNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS40ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iI0IyQzRFMCI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy90YWItbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIjQjJDNEUwIj48YSBocmVmPSIuL3Byb2plY3RzL2luZGV4Lmh0bWwiPjxmb250IHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPlByb2plY3RzPC9mb250PjwvYT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgIDxkaXYgY2xhc3M9ImJsdWViYXIiPjwvZGl2PgorICAgICAgICAgICAgICAgICAgICAKKyAgPGRpdiBjbGFzcz0ibWVudWNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0ibWVudSI+CisgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+QXBhY2hlIEFudAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2luZGV4Lmh0bWwiPldlbGNvbWU8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9saWNlbnNlLmh0bWwiPkxpY2Vuc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9hbnRuZXdzLmh0bWwiPk5ld3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Eb2N1bWVudGF0aW9uCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFudWFsL2luZGV4Lmh0bWwiPk1hbnVhbDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3Byb2plY3RzLmh0bWwiPlJlbGF0ZWQgUHJvamVjdHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9leHRlcm5hbC5odG1sIj5FeHRlcm5hbCBUb29scyBhbmQgVGFza3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+UmVzb3VyY2VzPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2ZhcS5odG1sIj5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2FudC9Gcm9udFBhZ2UiPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9wcm9ibGVtcy5odG1sIj5IYXZpbmcgUHJvYmxlbXM/PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG93bmxvYWQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL3NyY2Rvd25sb2FkLmNnaSI+U291cmNlIERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Db250cmlidXRpbmcKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYWlsLmh0bWwiPk1haWxpbmcgTGlzdHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9zdm4uaHRtbCI+U3VidmVyc2lvbiBSZXBvc2l0b3JpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9uaWdodGxpZXMuaHRtbCI+TmlnaHRseSBCdWlsZHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9idWdzLmh0bWwiPkJ1ZyBEYXRhYmFzZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlNwb25zb3JzaGlwCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIj5UaGFua3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCI+U3BvbnNvcnNoaXA8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vY29udHJpYnV0aW5nLmh0bWwiPkRvbmF0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlByb2plY3QgTWFuYWdlbWVudAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2NvbnRyaWJ1dG9ycy5odG1sIj5Db250cmlidXRvcnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9taXNzaW9uLmh0bWwiPkFwYWNoZSBBbnQgTWlzc2lvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J5bGF3cy5odG1sIj5Qcm9qZWN0IEJ5bGF3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xlZ2FsLmh0bWwiPkxlZ2FsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxjZW50ZXI+CisgICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9hZHMvYnV0dG9uYmFyLmh0bWwiIC0tPgorICAgIDwvY2VudGVyPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiBsZWZ0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvbWVudS1sZWZ0LmdpZiI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvbWVudS1yaWdodC5naWYiPgorICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImxpZ2h0Ymx1ZWJhciI+Jm5ic3A7PC9kaXY+CisgIDxkaXYgY2xhc3M9Im1haW4iPgorICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKyAgICA8aDEgY2xhc3M9InRpdGxlIj5SZXNvdXJjZXM8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkZBUXMiPjwvYT4KKyAgICAgIEZBUXMKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQXQgQW50J3Mgd2Vic2l0ZSI+PC9hPgorICAgICAgICBBdCBBbnQncyB3ZWJzaXRlCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+U3RhcnRpbmcgd2l0aCB0aGUgcmVsZWFzZSBvZiBBbnQgMS40IHRoZSBBbnQncyBGQVEgaXMKKyAgICAgICAgYnVuZGxlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIGNhbgorICAgICAgICBhbHdheXMgYmUgZm91bmQgYXQgdGhlIHdlYnNpdGUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBGQVE6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iZmFxLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iakd1cnUiPjwvYT4KKyAgICAgICAgakd1cnUKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5qR3VydSBob3N0cyBhbiBpbnRlcmFjdGl2ZSBBbnQgZGlzY3Vzc2lvbiBmb3J1bSBhbmQgRkFRIHN5c3RlbTwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgRm9ydW06CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qZ3VydS5jb20vZm9ydW1zL2hvbWUuanNwP3RvcGljPUFudCI+aHR0cDovL3d3dy5qZ3VydS5jb20vZm9ydW1zL2hvbWUuanNwP3RvcGljPUFudDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBGQVE6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qZ3VydS5jb20vZmFxL2hvbWUuanNwP3RvcGljPUFudCI+aHR0cDovL3d3dy5qZ3VydS5jb20vZmFxL2hvbWUuanNwP3RvcGljPUFudDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iRkFRIGFib3V0IEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIHRhc2tzIj48L2E+CisgICAgICAgIEZBUSBhYm91dCBCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciB0YXNrcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkJlbm9pdCBNb3Vzc2F1ZCwgdGhlIG9yaWdpbmFsIGF1dGhvciBvZiB0aGUgQm9ybGFuZAorICAgICAgICBBcHBsaWNhdGlvbiBTZXJ2ZXIgc3BlY2lmaWMgPGEgaHJlZj0ibWFudWFsL09wdGlvbmFsVGFza3MvZWpiLmh0bWwjZWpidGFza3MiPkVKQiB0YXNrczwvYT4gaGFzIHB1dAorICAgICAgICB0b2dldGhlciBhIEZBUSBmb3IgdGhpcyBzcGVjaWZpYyBzdWJ0YXNrLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgRkFROgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubW91c3NhdWQub3JnL2VqYmphci5odG1sIj5odHRwOi8vd3d3Lm1vdXNzYXVkLm9yZy9lamJqYXIuaHRtbDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJXSUtJcyI+PC9hPgorICAgICAgV0lLSXMKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQXBhY2hlIj48L2E+CisgICAgICAgIEFwYWNoZQorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBBU0YgcHJvdmlkZXMgYSBXaWtpIGZhcm0gZm9yIEFwYWNoZSBwcm9qZWN0cy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIE1haW4gcGFnZToKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2dlbmVyYWwiPkFwYWNoZSBXaWtpIEZhcm08L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQW50IFdpa2k6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvIj5BbnQgV2lraTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJCb29rcyI+PC9hPgorICAgICAgQm9va3MKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIG1vc3QgcmVjZW50IGJvb2tzIGNvbWUgZmlyc3Q8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFudCBpbiBBY3Rpb24iPjwvYT4KKyAgICAgICAgQW50IGluIEFjdGlvbgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlB1Ymxpc2hlZCBBcHJpbC9NYXkgMjAwNywgYW5kIGNvdmVyaW5nIEFudCAxLjcuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGlzIGEgbWFqb3IgcmV3cml0ZSBvZiB0aGUgZmlyc3QgZWRpdGlvbjsgc3RpbGwgNjAwIHBhZ2VzIGxvbmcuCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgVGhpcyBib29rIG1vdmVzIHVwIGZyb20gQW50MS41IHRvIEphdmExLjUgYW5kIDEuNywgd2l0aCBhIG5lYXItY29tcGxldGUKKyAgICAgICAgICByZXdyaXRlIG9mIHRoZSBhcHBsaWVkLWFudCBzZWN0aW9uLCBjb3ZlcmluZyBuZXcgdG9waWNzIHN1Y2ggYXMKKyAgICAgICAgICBhbnRsaWJzLCByZXBvc2l0b3J5IG1hbmFnZW1lbnQgd2l0aCBJdnksIFhtbCBTY2hlbWEgdmFsaWRhdGlvbiwKKyAgICAgICAgICBFSkIzLjAvSmF2YSBFRSBkZXZlbG9wbWVudCBhbmQgYWR2YW5jZWQgZGVwbG95bWVudCB1c2luZyBTbWFydEZyb2cuCisgICAgICAgICAgVGhlIGFudCBjb2Rpbmcgc2VjdGlvbiBsb29rcyBhdCBBbnRVbml0LCBhbnRsaWIgYXV0aG9yaW5nIGFuZAorICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZXMsIHdoaWxlIHRoZSBiZWdpbm5lcnMgY2hhcHRlcnMsIHRoZSBmaXJzdCB0aGlyZAorICAgICAgICAgIG9mIHRoZSBib29rLCBzdGlsbCBzaG93cyBkZXZlbG9wZXJzIGhvdyB0byBidWlsZCwgdGVzdCwgcGFja2FnZSBhbmQKKyAgICAgICAgICByZWRpc3RyaWJ1dGUgYSBKYXZhIGFwcGxpY2F0aW9uLgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgIElmIHlvdSBhcmUgb25lIG9mIHRoZSAyMCwwMDArIG93bmVycyBvZiB0aGUgZmlyc3QgZWRpdGlvbiwgaXQgaXMgbm93CisgICAgICAgICAgb2Jzb2xldGUuIFNvcnJ5IDopCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFN0ZXZlIExvdWdocmFuIGFuZCBFcmlrIEhhdGNoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBQdWJsaXNoZXIgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIAorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm1hbm5pbmcuY29tL2xvdWdocmFuLyI+CisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5tYW5uaW5nLmNvbS9sb3VnaHJhbi8KKyAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQm9vayBVUkwKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAKKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudGJvb2sub3JnLyI+CisgICAgICAgICAgICAgICAgaHR0cDovL2FudGJvb2sub3JnLworICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTb3VyY2UgY29kZSByZXBvc2l0b3J5CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYW50Ym9vayI+CisgICAgICAgICAgICAgICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9hbnRib29rCisgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgIAorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+PHRoPklTQk46PC90aD48dGQ+MTkzMjM5NDgwWDwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxiPkF2YWlsYWJsZSBmcm9tOjwvYj48YnI+CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbWF6b24uY29tL2V4ZWMvb2JpZG9zL3RnL2RldGFpbC8tLzE5MzIzOTQ4MFgvYXBhY2hlc29mdHdhci0yMC8iIHRhcmdldD0iX2JsYW5rIj5BbWF6b24uY29tPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly9zZXJ2aWNlLmJmYXN0LmNvbS9iZmFzdC9jbGljaz9iZm1pZD0yMTgxJmFtcDtiZm10eXBlPWJvb2smYW1wO3NvdXJjZWlkPTQxNDYyNTQ0JmFtcDtiZnBpZD0xOTMyMzk0ODBYIiB0YXJnZXQ9Il9ibGFuayI+QmFybmVzICZhbXA7IE5vYmxlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9va3NlbnNlLmNvbS9wcm9kdWN0L2luZm8uanNwP2FmZmlsaWF0ZUlkPUFwYWNoZSZhbXA7aXNibj0xOTMyMzk0ODBYIiB0YXJnZXQ9Il9ibGFuayI+Qm9vayBTZW5zZTwvYT4KKyAgfCA8YSBocmVmPSJodHRwOi8vd3d3LnBvd2VsbHMuY29tL2NnaS1iaW4vYmlibGlvP2lzYm49MTkzMjM5NDgwWCZhbXA7cGFydG5lcl9pZD0yOTY5MyIgdGFyZ2V0PSJfYmxhbmsiPlBvd2VsbHMuY29tPC9hPgorPGJyPjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50OiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwgMm5kIGVkaXRpb24iPjwvYT4KKyAgICAgICAgQW50OiBUaGUgRGVmaW5pdGl2ZSBHdWlkZSwgMm5kIGVkaXRpb24KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5QdWJsaXNoZWQgQXByaWwgMjAwNSwgYW5kIGNvdmVycyBBbnQgcmVsZWFzZSAxLjYuMS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgaXMgYSBjb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBmaXJzdCBlZGl0aW9uOyB0aGlzIGJvb2sgaXMKKyAgICAgICAgbm93IDI5MCBwYWdlcyBhbmQgc28gY292ZXJzIEFudCBpbiBtb3JlIGRlcHRoIHRoYW4gaXRzIHByZWRlY2Vzc29yLgorICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkl0IGFsc28gbWl4ZXMgcmVmZXJlbmNlIGluZm9ybWF0aW9uICh0YWJsZXMpIHdpdGggdGV4dCBleHBsYW5hdGlvbgorICAgICAgICBvbiBob3cgdG8gdXNlIHRoZSB0YXNrcy4gQ29udGVudHMgaW5jbHVkZXMgSlVuaXQsIENWUywgZXhlY3V0aW9uLCBiYXNpYworICAgICAgICBkZXBsb3ltZW50LCBXZWIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgYW5kIFhEb2NsZXQuIFRoZXJlIGlzIGFsc28gY292ZXJhZ2UKKyAgICAgICAgb2YgWERvY2xldCwgYW5kIGEgY2hhcHRlciBvbiBob3cgdG8gZXh0ZW5kIEFudCBpbiBKYXZhLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFN0ZXZlIEhvbHpuZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub3JlaWxseS5jb20vY2F0YWxvZy9hbnR0ZGcyLyI+aHR0cDovL3d3dy5vcmVpbGx5LmNvbS9jYXRhbG9nL2FudHRkZzIvPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj48dGg+SVNCTjo8L3RoPjx0ZD4wNTk2MDA2MDk4PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGI+QXZhaWxhYmxlIGZyb206PC9iPjxicj4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvdGcvZGV0YWlsLy0vMDU5NjAwNjA5OC9hcGFjaGVzb2Z0d2FyLTIwLyIgdGFyZ2V0PSJfYmxhbmsiPkFtYXpvbi5jb208L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3NlcnZpY2UuYmZhc3QuY29tL2JmYXN0L2NsaWNrP2JmbWlkPTIxODEmYW1wO2JmbXR5cGU9Ym9vayZhbXA7c291cmNlaWQ9NDE0NjI1NDQmYW1wO2JmcGlkPTA1OTYwMDYwOTgiIHRhcmdldD0iX2JsYW5rIj5CYXJuZXMgJmFtcDsgTm9ibGU8L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29rc2Vuc2UuY29tL3Byb2R1Y3QvaW5mby5qc3A/YWZmaWxpYXRlSWQ9QXBhY2hlJmFtcDtpc2JuPTA1OTYwMDYwOTgiIHRhcmdldD0iX2JsYW5rIj5Cb29rIFNlbnNlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cucG93ZWxscy5jb20vY2dpLWJpbi9iaWJsaW8/aXNibj0wNTk2MDA2MDk4JmFtcDtwYXJ0bmVyX2lkPTI5NjkzIiB0YXJnZXQ9Il9ibGFuayI+UG93ZWxscy5jb208L2E+Cis8YnI+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJQcmFnbWF0aWMgUHJvamVjdCBBdXRvbWF0aW9uIj48L2E+CisgICAgICAgIFByYWdtYXRpYyBQcm9qZWN0IEF1dG9tYXRpb24KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4KKworICAgICAgICBIb3cgdG8gQnVpbGQsIERlcGxveSwgYW5kIE1vbml0b3IgSmF2YSBBcHBsaWNhdGlvbnMuCisgICAgICAgIFB1Ymxpc2hlZDogSnVseSAyMDA0IElTQk46ICAgICAgICAwLTk3NDUxNDAtMy05CisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgVGhpcyBpcyBub3QgYSByZWZlcmVuY2UgZ3VpZGUgdG8gQW50LCBidXQgYSBib29rIG9uIGhvdyB0byBhdXRvbWF0ZSB0aGUgYnVpbGQgcHJvY2Vzcy4KKyAgICAgICAgICBUaGUgY29yZSBidWlsZCwgY29udGludW91cyBpbnRlZ3JhdGlvbiwgcmVwb3J0aW5nIGFuZCByZWxlYXNlIG1hbmFnZW1lbnQKKyAgICAgICAgICBhcmUgYWxsIGNvdmVyZWQuIEFudCBpcyBvZiBjb3Vyc2UgY2VudHJhbCB0byB0aGlzLiBUaGlzIGlzIGEgZnVuIHJlYWQhCisgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIE1pa2UgQ2xhcmsKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cucHJhZ21hdGljcHJvZ3JhbW1lci5jb20vc2svYXV0by8iPmh0dHA6Ly93d3cucHJhZ21hdGljcHJvZ3JhbW1lci5jb20vc2svYXV0by8vPC9hPgorICAgICAgICAgICAgCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj48dGg+SVNCTjo8L3RoPjx0ZD4wOTc0NTE0MDM5PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGI+QXZhaWxhYmxlIGZyb206PC9iPjxicj4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvdGcvZGV0YWlsLy0vMDk3NDUxNDAzOS9hcGFjaGVzb2Z0d2FyLTIwLyIgdGFyZ2V0PSJfYmxhbmsiPkFtYXpvbi5jb208L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3NlcnZpY2UuYmZhc3QuY29tL2JmYXN0L2NsaWNrP2JmbWlkPTIxODEmYW1wO2JmbXR5cGU9Ym9vayZhbXA7c291cmNlaWQ9NDE0NjI1NDQmYW1wO2JmcGlkPTA5NzQ1MTQwMzkiIHRhcmdldD0iX2JsYW5rIj5CYXJuZXMgJmFtcDsgTm9ibGU8L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29rc2Vuc2UuY29tL3Byb2R1Y3QvaW5mby5qc3A/YWZmaWxpYXRlSWQ9QXBhY2hlJmFtcDtpc2JuPTA5NzQ1MTQwMzkiIHRhcmdldD0iX2JsYW5rIj5Cb29rIFNlbnNlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cucG93ZWxscy5jb20vY2dpLWJpbi9iaWJsaW8/aXNibj0wOTc0NTE0MDM5JmFtcDtwYXJ0bmVyX2lkPTI5NjkzIiB0YXJnZXQ9Il9ibGFuayI+UG93ZWxscy5jb208L2E+Cis8YnI+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJFeHRyZW1lIFByb2dyYW1taW5nIHdpdGggQW50Ij48L2E+CisgICAgICAgIEV4dHJlbWUgUHJvZ3JhbW1pbmcgd2l0aCBBbnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD4gVGhpcyBib29rIHNob3dzIGhvdyB0byBpbXBsZW1lbnQgYW4gWFAgcHJvamVjdCB1c2luZyBBbnQgMS41LjMsIGFuZCBtYW55IG90aGVyIDNyZCBwYXJ0eSB0b29scy4gIENvdmVyczo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgIDxsaT5UaGUgZnVuZGFtZW50YWxzIG9mIEFudDogY29uY2VwdHMsIGNvcmUgYW5kIG9wdGlvbmFsIHRhc2tzPC9saT4KKyAgICAgICAgICAgICAgIDxsaT5Ib3cgdG8gd3JpdGUgY3VzdG9tIEFudCBjb21wb25lbnRzLCBpbmNsdWRpbmcgY3VzdG9tIFRhc2tzLCBMb2dnZXJzLCBMaXN0ZW5lcnMsIElucHV0IEhhbmRsZXJzLCBTZWxlY3RvcnMsIEZpbHRlcnMsIE1hcHBlcnMgYW5kIERhdGEgVHlwZXM8L2xpPgorICAgICAgICAgICAgICAgPGxpPk1pdGlnYXRpbmcgcmlza3MgYnkgY3JlYXRpbmcgc3Bpa2UgdGVzdHMgd2l0aCBBbnQgYnVpbGRmaWxlczwvbGk+CisgICAgICAgICAgICAgICA8bGk+QWRkIENWUyB2ZXJzaW9uIGNvbnRyb2wgYW5kIHRlc3Rpbmcgd2l0aCBKVW5pdDwvbGk+CisgICAgICAgICAgICAgICA8bGk+QXV0b21hdGUgbmlnaHRseSBidWlsZHMgYW5kIHJlcG9ydGluZzwvbGk+CisgICAgICAgICAgICAgICA8bGk+RGVwbG95IGFwcGxpY2F0aW9ucyBkeW5hbWljYWxseSB1c2luZyBYRG9jbGV0PC9saT4KKyAgICAgICAgICAgICAgIDxsaT5FbmZvcmNpbmcgQ29kZSBTdGFuZGFyZHMgd2l0aCBKYWxvcHksIFBNRCwgQ2hlY2tTdHlsZSwgaUNvbnRyYWN0LCBKRGVwZW5kPC9saT4KKyAgICAgICAgICAgICAgIDxsaT5Vc2luZyBSZW1vdGUgQW50IChSYW50KSBhbmQgQ3J1aXNlQ29udHJvbDwvbGk+CisgICAgICAgICAgICAgICA8bGk+R2VuZXJhdGluZyBwcm9qZWN0IGRvY3VtZW50YXRpb248L2xpPgorICAgICAgICAgICAgICAgPGxpPkFkYXB0aW5nIGFuIFhQIHByb2Nlc3MgZm9yIHVzZSBieSBvdGhlciB0ZWFtcyBvciBhY3Jvc3MgYW4gZW50ZXJwcmlzZTwvbGk+CisgICAgICAgICAgICAgICA8bGk+Q3VzdG9tIFRhc2sgZXhhbXBsZXMgdG8gZ2VuZXJhdGluZyBVTUwgZGlhZ3JhbXMsIGNyZWF0aW5nIHJlcG9ydHMgYW5kIG1ldHJpY3Mgb24tdGhlLWZseTwvbGk+CisgICAgICAgICAgICAgICA8bGk+Rm9sbG93cyBhIGNhc2Utc3R1ZHkgb2YgYSB0ZWFtIHRoYXQgaW1wbGVtZW50cyBhbiBYUCBQcm9qZWN0PC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcnM6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR2xlbm4gTmllbWV5ZXIgYW5kIEplcmVteSBQb3RlZXQKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5zYW1zLmNvbS9jYXRhbG9nL3Byb2R1Y3QuYXNwP3Byb2R1Y3RfaWQ9JTdCRkI4MjVBNDgtQkMwNC00QzU1LUJEOEMtREY5M0M2QkJGOTIwJTdEIj5odHRwOi8vd3d3LnNhbXMuY29tL2NhdGFsb2cvcHJvZHVjdC5hc3A/cHJvZHVjdF9pZD0lN0JGQjgyNUE0OC1CQzA0LTRDNTUtQkQ4Qy1ERjkzQzZCQkY5MjAlN0Q8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj48dGg+SVNCTjo8L3RoPjx0ZD4wNjcyMzI1NjI0PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGI+QXZhaWxhYmxlIGZyb206PC9iPjxicj4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvdGcvZGV0YWlsLy0vMDY3MjMyNTYyNC9hcGFjaGVzb2Z0d2FyLTIwLyIgdGFyZ2V0PSJfYmxhbmsiPkFtYXpvbi5jb208L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3NlcnZpY2UuYmZhc3QuY29tL2JmYXN0L2NsaWNrP2JmbWlkPTIxODEmYW1wO2JmbXR5cGU9Ym9vayZhbXA7c291cmNlaWQ9NDE0NjI1NDQmYW1wO2JmcGlkPTA2NzIzMjU2MjQiIHRhcmdldD0iX2JsYW5rIj5CYXJuZXMgJmFtcDsgTm9ibGU8L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29rc2Vuc2UuY29tL3Byb2R1Y3QvaW5mby5qc3A/YWZmaWxpYXRlSWQ9QXBhY2hlJmFtcDtpc2JuPTA2NzIzMjU2MjQiIHRhcmdldD0iX2JsYW5rIj5Cb29rIFNlbnNlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cucG93ZWxscy5jb20vY2dpLWJpbi9iaWJsaW8/aXNibj0wNjcyMzI1NjI0JmFtcDtwYXJ0bmVyX2lkPTI5NjkzIiB0YXJnZXQ9Il9ibGFuayI+UG93ZWxscy5jb208L2E+Cis8YnI+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnQuIERhcyBKYXZhLUJ1aWxkLVRvb2wgaW4gZGVyIFByYXhpcyI+PC9hPgorICAgICAgICBBbnQuIERhcyBKYXZhLUJ1aWxkLVRvb2wgaW4gZGVyIFByYXhpcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgR2VybWFuIGxhbmd1YWdlIGJvb2sgb24gQW50IHRoYXQgY292ZXJzIEFudCAxLjUuCisgICAgICAgIFRoaXMgaXMgdGhlIG9yaWdpbmFsIGRlc2NyaXB0aW9uOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZSI+CisgICAgICAgIERhcyBCdWlsZC1Ub29sIEFudCBpc3QgZGFzIE9wZW4tU291cmNlLVdlcmt6ZXVnLCBkYXMgZGVuIEVudHdpY2tsdW5nc3Byb3plc3MgZWluZXIgSmF2YS0KKyAgICAgICAgb2RlciBKMkVFLUFud2VuZHVuZyB3ZXNlbnRsaWNoIHZlcmVpbmZhY2h0LiBHZXN0ZXVlcnQgZHVyY2ggWE1MLWJhc2llcnRlIFNrcmlwdGUgZu+/vWhydCBlcworICAgICAgICBuYWhlenUgYWxsZSBBdWZnYWJlbiBhdXMsIGRpZSBuYWNoIGRlbSBLb2RpZXJlbiBlaW5lciBBbndlbmR1bmcgYW5mYWxsZW4uPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlNvbWUgdG9waWNzOjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT5jcmVhdGluZyBhcmNoaXZlcyAoemlwLCBqYXIpPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+Y2FsbCB0aGUgamF2YSBjb21waWxlcjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPmVkaXQgcHJvcGVydHkgZmlsZXM8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5maWxlIG9wZXJhdGlvbjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPnNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtczwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgYm9vayBpcyBhdmFpbGFibGUgaW4gRW5nbGlzaCBhcyAiQW50OiBUaGUgSmF2YSBCdWlsZCBUb29sIGluIFByYWN0aWNlIjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yczoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBCZXJuZCBNYXR6a2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hZGRpc29uLXdlc2xleS5kZS9tYWluL21haW4uYXNwP3BhZ2U9aG9tZS9ib29rZGV0YWlscyZhbXA7UHJvZHVjdElEPTEzNDU5Ij5odHRwOi8vd3d3LmFkZGlzb24td2VzbGV5LmRlL21haW4vbWFpbi5hc3A/cGFnZT1ob21lL2Jvb2tkZXRhaWxzJmFtcDtQcm9kdWN0SUQ9MTM0NTk8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj48dGg+SVNCTjo8L3RoPjx0ZD4zODI3MzIwNjY2PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGI+QXZhaWxhYmxlIGZyb206PC9iPjxicj4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvdGcvZGV0YWlsLy0vMzgyNzMyMDY2Ni9hcGFjaGVzb2Z0d2FyLTIwLyIgdGFyZ2V0PSJfYmxhbmsiPkFtYXpvbi5jb208L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3NlcnZpY2UuYmZhc3QuY29tL2JmYXN0L2NsaWNrP2JmbWlkPTIxODEmYW1wO2JmbXR5cGU9Ym9vayZhbXA7c291cmNlaWQ9NDE0NjI1NDQmYW1wO2JmcGlkPTM4MjczMjA2NjYiIHRhcmdldD0iX2JsYW5rIj5CYXJuZXMgJmFtcDsgTm9ibGU8L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29rc2Vuc2UuY29tL3Byb2R1Y3QvaW5mby5qc3A/YWZmaWxpYXRlSWQ9QXBhY2hlJmFtcDtpc2JuPTM4MjczMjA2NjYiIHRhcmdldD0iX2JsYW5rIj5Cb29rIFNlbnNlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cucG93ZWxscy5jb20vY2dpLWJpbi9iaWJsaW8/aXNibj0zODI3MzIwNjY2JmFtcDtwYXJ0bmVyX2lkPTI5NjkzIiB0YXJnZXQ9Il9ibGFuayI+UG93ZWxscy5jb208L2E+Cis8YnI+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKYXZhIERldmVsb3BtZW50IHdpdGggQW50Ij48L2E+CisgICAgICAgIEphdmEgRGV2ZWxvcG1lbnQgd2l0aCBBbnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5QdWJsaXNoZWQgMjAwMi4gVGhpcyBib29rIGNvdmVycyBBbnQgMS41LCBpbmNsdWRpbmc6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgPGxpPlRoZSBuZXcgQW50IDEuNSBmZWF0dXJlczwvbGk+CisgICAgICAgICAgICAgICAgPGxpPkFudCdzIGRhdGF0eXBlcyBhbmQgcHJvcGVydHkgaGFuZGxpbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5KVW5pdCB0ZXN0aW5nIGFuZCByZXBvcnRpbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5Db250aW51b3VzIGludGVncmF0aW9uIHRlY2huaXF1ZXM8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5YRG9jbGV0IGZvciBhdHRyaWJ1dGUtb3JpZW50ZWQgcHJvZ3JhbW1pbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5FSkIgZ2VuZXJhdGlvbiwgYnVpbGRpbmcsIGFuZCBwYWNrYWdpbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5Xcml0aW5nIGFuZCB0ZXN0aW5nIG5hdGl2ZSBjb2RlPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+QnVpbGRpbmcgV2ViIFNlcnZpY2VzIHdpdGggQXBhY2hlIEF4aXM8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5EZXBsb3lpbmcgeW91ciBzeXN0ZW0gdG8gbXVsdGlwbGUgcmVtb3RlIHNlcnZlcnM8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5Vc2luZyBhbmQgd3JpdGluZworICAgICAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+TG9nZ2VyczwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+TGlzdGVuZXJzPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5TZWxlY3RvcnM8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPkN1c3RvbSB0YXNrczwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFsc28gYXZhaWxhYmxlIGluIEtvcmVhbiBhbmQgR2VybWFuIGVkaXRpb25zPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBdXRob3JzOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEVyaWsgSGF0Y2hlciBhbmQgU3RldmUgTG91Z2hyYW4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5tYW5uaW5nLmNvbS9hbnRib29rLyI+aHR0cDovL3d3dy5tYW5uaW5nLmNvbS9hbnRib29rLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPjx0aD5JU0JOOjwvdGg+PHRkPjE5MzAxMTA1ODg8L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48Yj5BdmFpbGFibGUgZnJvbTo8L2I+PGJyPgorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy90Zy9kZXRhaWwvLS8xOTMwMTEwNTg4L2FwYWNoZXNvZnR3YXItMjAvIiB0YXJnZXQ9Il9ibGFuayI+QW1hem9uLmNvbTwvYT4KKyAgfCA8YSBocmVmPSJodHRwOi8vc2VydmljZS5iZmFzdC5jb20vYmZhc3QvY2xpY2s/YmZtaWQ9MjE4MSZhbXA7YmZtdHlwZT1ib29rJmFtcDtzb3VyY2VpZD00MTQ2MjU0NCZhbXA7YmZwaWQ9MTkzMDExMDU4OCIgdGFyZ2V0PSJfYmxhbmsiPkJhcm5lcyAmYW1wOyBOb2JsZTwvYT4KKyAgfCA8YSBocmVmPSJodHRwOi8vd3d3LmJvb2tzZW5zZS5jb20vcHJvZHVjdC9pbmZvLmpzcD9hZmZpbGlhdGVJZD1BcGFjaGUmYW1wO2lzYm49MTkzMDExMDU4OCIgdGFyZ2V0PSJfYmxhbmsiPkJvb2sgU2Vuc2U8L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3d3dy5wb3dlbGxzLmNvbS9jZ2ktYmluL2JpYmxpbz9pc2JuPTE5MzAxMTA1ODgmYW1wO3BhcnRuZXJfaWQ9Mjk2OTMiIHRhcmdldD0iX2JsYW5rIj5Qb3dlbGxzLmNvbTwvYT4KKzxicj48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFudDogVGhlIERlZmluaXRpdmUgR3VpZGUsIDFzdCBlZGl0aW9uIj48L2E+CisgICAgICAgIEFudDogVGhlIERlZmluaXRpdmUgR3VpZGUsIDFzdCBlZGl0aW9uCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+UHVibGlzaGVkIDIwMDIsIENvdmVycyBBbnQgcmVsZWFzZSAxLjQuMS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcnM6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgSmVzc2UgRS4gVGlsbHkgYW5kIEVyaWMgTS4gQnVya2UKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vcmVpbGx5LmNvbS9jYXRhbG9nL2FudHRkZy8iPmh0dHA6Ly93d3cub3JlaWxseS5jb20vY2F0YWxvZy9hbnR0ZGcvPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+PHRoPklTQk46PC90aD48dGQ+MDU5NjAwMTg0MzwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxiPkF2YWlsYWJsZSBmcm9tOjwvYj48YnI+CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbWF6b24uY29tL2V4ZWMvb2JpZG9zL3RnL2RldGFpbC8tLzA1OTYwMDE4NDMvYXBhY2hlc29mdHdhci0yMC8iIHRhcmdldD0iX2JsYW5rIj5BbWF6b24uY29tPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly9zZXJ2aWNlLmJmYXN0LmNvbS9iZmFzdC9jbGljaz9iZm1pZD0yMTgxJmFtcDtiZm10eXBlPWJvb2smYW1wO3NvdXJjZWlkPTQxNDYyNTQ0JmFtcDtiZnBpZD0wNTk2MDAxODQzIiB0YXJnZXQ9Il9ibGFuayI+QmFybmVzICZhbXA7IE5vYmxlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9va3NlbnNlLmNvbS9wcm9kdWN0L2luZm8uanNwP2FmZmlsaWF0ZUlkPUFwYWNoZSZhbXA7aXNibj0wNTk2MDAxODQzIiB0YXJnZXQ9Il9ibGFuayI+Qm9vayBTZW5zZTwvYT4KKyAgfCA8YSBocmVmPSJodHRwOi8vd3d3LnBvd2VsbHMuY29tL2NnaS1iaW4vYmlibGlvP2lzYm49MDU5NjAwMTg0MyZhbXA7cGFydG5lcl9pZD0yOTY5MyIgdGFyZ2V0PSJfYmxhbmsiPlBvd2VsbHMuY29tPC9hPgorPGJyPjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50LiBLdXJ6IHVuZCBHdXQuIj48L2E+CisgICAgICAgIEFudC4gS3VyeiB1bmQgR3V0LgorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgR2VybWFuIGxhbmd1YWdlIHNob3J0IHJlZmVyZW5jZSBmb3IgQW50IHRoYXQgY292ZXJzIEFudAorICAgICAgICAxLjQuICBUaGlzIGlzIHRoZSBvcmlnaW5hbCBkZXNjcmlwdGlvbjo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorICBBbnQga3VyeiAmYW1wOyBndXQgZW50aORsdCBlaW5lIHZvbGxzdORuZGlnZSBSZWZlcmVueiBkZXIgQnVpbHQtaW4gVGFza3MKKyAgdW5kIGlocmVyIGpld2VpbGlnZW4gQXR0cmlidXRlIHNvd2llIGt1cnplIEJlaXNwaWVsZSBm/HIgaWhyZSBWZXJ3ZW5kdW5nLgorICBEYW5lYmVuIGJpZXRldCBkYXMgQnVjaCBlaW5lIGtuYXBwZSBFaW5m/GhydW5nIGluIGRpZSBBcmJlaXQgbWl0IEFudCB1bmQKKyAgZWluZSBFcmzkdXRlcnVuZyBkZXIgQW50LUJhc2lzZWxlbWVudGUgKFByb2pla3RlLCBQcm9wZXJ0aWVzLCBUYXJnZXRzIHVuZCBUYXNrcykuCisgIEJlaGFuZGVsdCB3ZXJkZW4gYXXfZXJkZW0gZ3J1bmRsZWdlbmRlIEtvbnplcHRlIHdpZSBGaWxlc2V0cywgUGF0dGVybnNldHMgdW5kCisgIFBmYWRzdHJ1a3R1cmVuLCBkYXMgU2NocmVpYmVuIGVpZ2VuZXIgVGFza3MsIGRpZSBBdWZydWYtU3ludGF4IHVuZCBPcHRpb25hbCBUYXNrcy4gPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTdGVmYW4gRWRsaWNoCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW1hem9uLmRlL2V4ZWMvb2JpZG9zL0FTSU4vMzg5NzIxMjQxMi8iPmh0dHA6Ly93d3cuYW1hem9uLmRlL2V4ZWMvb2JpZG9zL0FTSU4vMzg5NzIxMjQxMi88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj48dGg+SVNCTjo8L3RoPjx0ZD4zODk3MjEyNDEyPC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGI+QXZhaWxhYmxlIGZyb206PC9iPjxicj4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvdGcvZGV0YWlsLy0vMzg5NzIxMjQxMi9hcGFjaGVzb2Z0d2FyLTIwLyIgdGFyZ2V0PSJfYmxhbmsiPkFtYXpvbi5jb208L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3NlcnZpY2UuYmZhc3QuY29tL2JmYXN0L2NsaWNrP2JmbWlkPTIxODEmYW1wO2JmbXR5cGU9Ym9vayZhbXA7c291cmNlaWQ9NDE0NjI1NDQmYW1wO2JmcGlkPTM4OTcyMTI0MTIiIHRhcmdldD0iX2JsYW5rIj5CYXJuZXMgJmFtcDsgTm9ibGU8L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29rc2Vuc2UuY29tL3Byb2R1Y3QvaW5mby5qc3A/YWZmaWxpYXRlSWQ9QXBhY2hlJmFtcDtpc2JuPTM4OTcyMTI0MTIiIHRhcmdldD0iX2JsYW5rIj5Cb29rIFNlbnNlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cucG93ZWxscy5jb20vY2dpLWJpbi9iaWJsaW8/aXNibj0zODk3MjEyNDEyJmFtcDtwYXJ0bmVyX2lkPTI5NjkzIiB0YXJnZXQ9Il9ibGFuayI+UG93ZWxscy5jb208L2E+Cis8YnI+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJKYXZhIFRvb2xzIGZvciBlWHRyZW1lIFByb2dyYW1taW5nIj48L2E+CisgICAgICAgIEphdmEgVG9vbHMgZm9yIGVYdHJlbWUgUHJvZ3JhbW1pbmcKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGJvb2sgY292ZXJzIHRoZSBmb2xsb3dpbmcgWFAgc3ViamVjdHM6PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgPGxpPkF1dG9tYXRlZCB1bml0IGFuZCBmdW5jdGlvbmFsIHRlc3Rpbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5Db250aW51b3VzIGludGVncmF0aW9uIHRocm91Z2ggYnVpbGQgYW5kIGRlcGxveW1lbnQgYXV0b21hdGlvbjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPlRoZSB2YWx1ZSBvZiByZWZhY3RvcmluZyBhbmQgY29udGludW91cyBpbnRlZ3JhdGlvbjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPkhvdyBBbnQsIEpVbml0LCBKVW5pdFBlcmYsIENhY3R1cywgSFRUUFVuaXQsIGFuZCBKTWV0ZXIKKyAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBnb2FscyBvZiB0aGUgWFAgbWV0aG9kb2xvZ3k8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yczoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBSaWNoYXJkIEhpZ2h0b3dlciBhbmQgTmljaG9sYXMgTGVzaWVja2kKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53aWxleS5jb20vY2RhL3Byb2R1Y3QvMCwsMDQ3MTIwNzA4WCwwMC5odG1sIj5odHRwOi8vd3d3LndpbGV5LmNvbS9jZGEvcHJvZHVjdC8wLCwwNDcxMjA3MDhYLDAwLmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj48dGg+SVNCTjo8L3RoPjx0ZD4wNDcxMjA3MDhYPC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGI+QXZhaWxhYmxlIGZyb206PC9iPjxicj4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvdGcvZGV0YWlsLy0vMDQ3MTIwNzA4WC9hcGFjaGVzb2Z0d2FyLTIwLyIgdGFyZ2V0PSJfYmxhbmsiPkFtYXpvbi5jb208L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3NlcnZpY2UuYmZhc3QuY29tL2JmYXN0L2NsaWNrP2JmbWlkPTIxODEmYW1wO2JmbXR5cGU9Ym9vayZhbXA7c291cmNlaWQ9NDE0NjI1NDQmYW1wO2JmcGlkPTA0NzEyMDcwOFgiIHRhcmdldD0iX2JsYW5rIj5CYXJuZXMgJmFtcDsgTm9ibGU8L2E+CisgIHwgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29rc2Vuc2UuY29tL3Byb2R1Y3QvaW5mby5qc3A/YWZmaWxpYXRlSWQ9QXBhY2hlJmFtcDtpc2JuPTA0NzEyMDcwOFgiIHRhcmdldD0iX2JsYW5rIj5Cb29rIFNlbnNlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cucG93ZWxscy5jb20vY2dpLWJpbi9iaWJsaW8/aXNibj0wNDcxMjA3MDhYJmFtcDtwYXJ0bmVyX2lkPTI5NjkzIiB0YXJnZXQ9Il9ibGFuayI+UG93ZWxscy5jb208L2E+Cis8YnI+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFydGljbGVzIGFuZCBQcmVzZW50YXRpb25zIj48L2E+CisgICAgICBBcnRpY2xlcyBhbmQgUHJlc2VudGF0aW9ucworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGUgZm9sbG93aW5nIHNlY3Rpb25zIGxpc3QgYXJ0aWNsZXMgYW5kIHByZXNlbnRhdGlvbnMKKyAgICAgIHdyaXR0ZW4gYWJvdXQgQXBhY2hlIEFudC4gIElmIHlvdSd2ZSB3cml0dGVuIHNvbWV0aGluZyB0aGF0CisgICAgICBzaG91bGQgYmUgaW5jbHVkZWQsIHBsZWFzZSBwb3N0IGl0IHRvIG9uZSBvZiB0aGUgbWFpbGluZworICAgICAgbGlzdHMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkFydGljbGVzIj48L2E+CisgICAgICBBcnRpY2xlcworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJFeHRlbmRpbmcgQW50IElucHV0IEFiaWxpdGllcyI+PC9hPgorICAgICAgICBFeHRlbmRpbmcgQW50IElucHV0IEFiaWxpdGllcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBjb250ZW50cyBvZiB0aGlzIGRvY3VtZW50IGlzIHRoZSBmb2xsb3dpbmc6PHVsPgorICAgICAgICAgICA8bGk+U2VjdGlvbiAyIHByb3ZpZGVzIGEgc2ltcGxlIGV4YW1wbGUgaG93IElucHV0SGFuZGxlcnMgYXJlIGNyZWF0ZWQsPC9saT4KKyAgICAgICAgICAgPGxpPlNlY3Rpb24gMyBkZXZlbG9wcyBhbiBpbnB1dGhhbmRsZXIgdGhhdCBtYXNrcyB0aGUgcGFzc3dvcmRzIHR5cGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsPC9saT4KKyAgICAgICAgICAgPGxpPlNlY3Rpb24gNCBnaXZlcyB0d28gaGFuZGxlcnMsIHdob3NlIGlucHV0IGlzIHR5cGVkIGluIGdyYXBoaWNhbCBjb21wb25lbnRzLDwvbGk+CisgICAgICAgICAgIDxsaT5TZWN0aW9uIDUgZXh0ZW5kcyBJbnB1dCB0YXNrIHNvIHRoYXQgd2UgY2FuIHVzZSBkaWVyZW50IGlucHV0IGhhbmRsZXJzIG9uIGRpZmZlcmVudCB1c2VzIG9mICZsdDtpbnB1dCZndDssPC9saT4KKyAgICAgICAgICAgPGxpPlNlY3Rpb24gNiBkZXNjcmliZXMgYSBwcm9ibGVtIGZvdW5kIHdoaWxlIHdyaXRpbmcgdGhpcyBkb2N1bWVudCw8L2xpPgorICAgICAgICAgICA8bGk+U2VjdGlvbiA3IHN1bW1hcml6ZXMgc29tZSBkYXJrIGNvcm5lcnMgdGhlIGF1dGhvciBkbyBub3QgdW5kZXJzdGFuZC48L2xpPgorICAgICAgICAgPC91bD48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBJdmFuIEl2YW5vdgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9MTAzNTA5Ij5odHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9MTAzNTA5IChEb3dubG9hZCBaSVArUERGIGZyb20gU291cmNlZm9yZ2UpPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJLZWVwIHRoZSBBbnQsIEhvbGQgdGhlIFhNTCI+PC9hPgorICAgICAgICBLZWVwIHRoZSBBbnQsIEhvbGQgdGhlIFhNTAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPktleSBHLiBHYXV0aGllciB0YWxrcyBhYm91dCB3cml0aW5nICJidWlsZGZpbGVzIiBpbiBKYXZhLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEtleSBHLiBHYXV0aGllcgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmZ0cG9ubGluZS5jb20vamF2YXByby8yMDA0XzA2L21hZ2F6aW5lL2ZlYXR1cmVzL2tnYXV0aGllci8iPmh0dHA6Ly93d3cuZnRwb25saW5lLmNvbS9qYXZhcHJvLzIwMDRfMDYvbWFnYXppbmUvZmVhdHVyZXMva2dhdXRoaWVyLzwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQW50IDEuNiBmb3IgVGFzayBXcml0ZXJzIj48L2E+CisgICAgICAgIEFudCAxLjYgZm9yIFRhc2sgV3JpdGVycworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgYXJ0aWNsZSB0YWxrcyBhYm91dCBYTUwgbmFtZXNwYWNlIGhhbmRsaW5nLCBBbnQKKyAgICAgICAgbGlicmFyaWVzIGFuZCB0aGUgbmV3bHkgaW50cm9kdWNlZCB0eXBlIHBvbHltb3JwaGlzbS48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTdGVmYW4gQm9kZXdpZworICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vb3RuLm9yYWNsZS5jb20vcHViL2FydGljbGVzL2JvZGV3aWdfdGFza3dyaXRlcnMuaHRtbCI+aHR0cDovL290bi5vcmFjbGUuY29tL3B1Yi9hcnRpY2xlcy9ib2Rld2lnX3Rhc2t3cml0ZXJzLmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Ik1hbmFnaW5nIEJ1aWxkIENvbXBsZXhpdHkgd2l0aCBBcGFjaGUgQW50IDEuNiI+PC9hPgorICAgICAgICBNYW5hZ2luZyBCdWlsZCBDb21wbGV4aXR5IHdpdGggQXBhY2hlIEFudCAxLjYKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcyBBcGFjaGUgQW50IGlzIGFwcGxpZWQgdG8gaW5jcmVhc2luZ2x5IGRpZmZpY3VsdCB0YXNrcywKKyAgICAgICAgaXRzIHVzZXJzIGFyZSBjcmVhdGluZyBtb3JlIGNvbXBsZXggYW5kIGxlc3MgbGVnaWJsZSBidWlsZAorICAgICAgICBmaWxlcy4gVGhpcyBpcyBkdWUsIGluIHBhcnQsIHRvIHRoZSBsaW1pdGVkIHRvb2xzIGZvcgorICAgICAgICBkZWNvbXBvc2l0aW9uIGFuZCBjb2RlIHJldXNlIHdpdGhpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZgorICAgICAgICBBbnQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBdXRob3I6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgR2VvZmZyZXkgV2lzZW1hbgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnN5cy1jb24uY29tL3N0b3J5Lz9zdG9yeWlkPTQ1MDc4JmFtcDtERT0xIj5odHRwOi8vd3d3LnN5cy1jb24uY29tL3N0b3J5Lz9zdG9yeWlkPTQ1MDc4JmFtcDtERT0xPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJOZXcgQW50IDEuNiBGZWF0dXJlcyBmb3IgQmlnIFByb2plY3RzIj48L2E+CisgICAgICAgIE5ldyBBbnQgMS42IEZlYXR1cmVzIGZvciBCaWcgUHJvamVjdHMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGFydGljbGUgZGVzY3JpYmVzIHRoZSAmbHQ7bWFjcm9kZWYmZ3Q7LCAmbHQ7aW1wb3J0Jmd0OworICAgICAgICAgIGFuZCAmbHQ7c3ViYW50Jmd0OyB0YXNrcyBpbiBkZXRhaWwgYW5kIHNob3dzIGhvdyB0aGV5IGhlbHAgaW4KKyAgICAgICAgICBidWlsZGluZyBiaWdnZXIgc3lzdGVtcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTdGVmYW4gQm9kZXdpZworICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vb3RuLm9yYWNsZS5jb20vcHViL2FydGljbGVzL2JvZGV3aWdfYW50MS42Lmh0bWwiPmh0dHA6Ly9vdG4ub3JhY2xlLmNvbS9wdWIvYXJ0aWNsZXMvYm9kZXdpZ19hbnQxLjYuaHRtbDwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iUHJvZ3JhbW1pZXJlbiBm/HIgQW50Ij48L2E+CisgICAgICAgIFByb2dyYW1taWVyZW4gZvxyIEFudAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgdGhlIG1haW4gdG9waWNzIG9mIHByb2dyYW1taW5nIHlvdXIgb3duIHRhc2tzLgorICAgICAgICBEZXNjcmlwdGlvbiBpcyBkb25lIG9uIGZpdmUgZXhhbXBsZXMuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGFydGljbGUgaXMgd3JpdHRlbiBpbiBHZXJtYW4gYW5kIHB1Ymxpc2hlZCBpbgorICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnNpZ3MtZGF0YWNvbS5kZS9zZC9wdWJsaWNhdGlvbnMvanMvaW5kZXguaHRtIj5KYXZhLVNwZWt0cnVtPC9hPgorICAgICAgICA1LzIwMDQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBdXRob3I6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQmVybmQgTWF0emtlCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2lncy1kYXRhY29tLmRlL3NkL25ld3MvZG9jdW1lbnQ/UElEPTIxNiI+aHR0cDovL3d3dy5zaWdzLWRhdGFjb20uZGUvc2QvbmV3cy9kb2N1bWVudD9QSUQ9MjE2PC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnQgaW4gQW5nZXI6IFVzaW5nIEFudCBpbiBhIFByb2R1Y3Rpb24gRGV2ZWxvcG1lbnQgU3lzdGVtIj48L2E+CisgICAgICAgIEFudCBpbiBBbmdlcjogVXNpbmcgQW50IGluIGEgUHJvZHVjdGlvbiBEZXZlbG9wbWVudCBTeXN0ZW0KKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBzdHJhdGVnaWVzIGFuZCBzb21lIGJhc2ljIGV4YW1wbGVzIG9mIGhvdyB0bworICAgICAgICB1c2UgQW50IGluIGxhcmdlciB0ZWFtIGRldmVsb3BtZW50IHByb2plY3RzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFN0ZXZlIExvdWdocmFuCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9ImFudF9pbl9hbmdlci5odG1sIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvYW50X2luX2FuZ2VyLmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFudCBUYXNrIEd1aWRlbGluZXMiPjwvYT4KKyAgICAgICAgQW50IFRhc2sgR3VpZGVsaW5lcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byB3cml0ZSBjdXN0b20gQW50IHRhc2tzLCBhbmQgaG93IHRvIHN1Ym1pdAorICAgICAgICB0aGVtIHRvIHBvdGVudGlhbGx5IGJlIGluY2x1ZGVkIGluIEFudC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBTdGV2ZSBMb3VnaHJhbgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJhbnRfdGFza19ndWlkZWxpbmVzLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRfdGFza19ndWlkZWxpbmVzLmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkJ1aWxkIGEgQmV0dGVyIFJvYm90IHdpdGggQW50Ij48L2E+CisgICAgICAgIEJ1aWxkIGEgQmV0dGVyIFJvYm90IHdpdGggQW50CisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBhcnRpY2xlIGRlc2NyaWJlcyB0aGUgZ29yeSBkZXRhaWxzIG9mIHdyaXRpbmcgY3VzdG9tCisgICAgICAgICAgIEFudCB0YXNrcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBFcmlrIEhhdGNoZXIKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5mYXdjZXR0ZS5jb20vamF2YXByby8yMDAzXzAyL21hZ2F6aW5lL2ZlYXR1cmVzL2VoYXRjaGVyLyI+aHR0cDovL3d3dy5mYXdjZXR0ZS5jb20vamF2YXByby8yMDAzXzAyL21hZ2F6aW5lL2ZlYXR1cmVzL2VoYXRjaGVyL2w8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkF1dG9tYXRpbmcgdGhlIGJ1aWxkIGFuZCB0ZXN0IHByb2Nlc3MiPjwvYT4KKyAgICAgICAgQXV0b21hdGluZyB0aGUgYnVpbGQgYW5kIHRlc3QgcHJvY2VzcworICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBkZW1vbnN0cmF0ZXMgYW4gYXBwcm9hY2ggdG8gdGhlIGF1dG9tYXRlZCBidWlsZCBhbmQgdGVzdCBwcm9jZXNzLiBXb3JraW5nIHdpdGggQW50IDEuMyBhbmQgdGhlIEpVbml0IHRlc3QgZnJhbWV3b3JrLCBpdCBzaG93cyBob3cgdG8gYXV0b21hdGUgYSBwcm9jZXNzIHRoYXQgY2FwdHVyZXMgcGVydGluZW50IGluZm9ybWF0aW9uIGFib3V0IGVhY2ggdGVzdCBzdWl0ZSBydW4sIGdlbmVyYXRlcyBhbiBhdHRyYWN0aXZlIHJlcG9ydCwgYW5kIGUtbWFpbHMgdGhlIHJlcG9ydC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86ZWhhdGNoZXJAYXBhY2hlLm9yZyI+RXJpayBIYXRjaGVyPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvamF2YS9saWJyYXJ5L2otanVuaXRtYWlsLyI+aHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2phdmEvbGlicmFyeS9qLWp1bml0bWFpbC88L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkluY3JlbWVudGFsIGRldmVsb3BtZW50IHdpdGggQW50IGFuZCBKVW5pdCI+PC9hPgorICAgICAgICBJbmNyZW1lbnRhbCBkZXZlbG9wbWVudCB3aXRoIEFudCBhbmQgSlVuaXQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGFydGljbGUgZXhwbG9yZXMgdGhlIGJlbmVmaXRzIG9mIHVuaXQgdGVzdGluZyB3aXRoIEFudCBhbmQKKyAgICAgICAgSlVuaXQsIGRldGFpbGluZyBob3cgdG8gZGV2ZWxvcCBhdXRvbWF0ZWQgdW5pdCB0ZXN0cyBhbmQgaW50ZWdyYXRlIHRoZW0KKyAgICAgICAgaW50byB5b3VyIGJ1aWxkIHByb2Nlc3MuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBdXRob3I6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOm1hbGNvbG1AbnVlYXJ0aC5jb20iPk1hbGNvbG0gRGF2aXM8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3ctMTA2LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGlicmFyeS9qLWFudC8/ZHd6b25lPWphdmEiPmh0dHA6Ly93d3ctMTA2LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGlicmFyeS9qLWFudC8/ZHd6b25lPWphdmE8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkF1dG9tYXRlIHlvdXIgYnVpbGQgcHJvY2VzcyB1c2luZyBKYXZhIGFuZCBBbnQiPjwvYT4KKyAgICAgICAgQXV0b21hdGUgeW91ciBidWlsZCBwcm9jZXNzIHVzaW5nIEphdmEgYW5kIEFudAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBpbnRyb2R1Y3Rpb24gdG8gdXNpbmcgQW50IHdpdGggc29tZSBiYXNpYworICAgICAgICBleGFtcGxlcyBhbmQgYnkgaGlnaGxpZ2h0aW5nIHNvbWUgb2YgdGhlIGltcG9ydGFudCB0YXNrcy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86bWljaGFlbC5jeW1lcm1hbkBqYXZhd29ybGQuY29tIj5NaWNoYWVsIEN5bWVybWFuPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTEwLTIwMDAvanctMTAyMC1hbnQuaHRtbCI+aHR0cDovL3d3dy5qYXZhd29ybGQuY29tL2phdmF3b3JsZC9qdy0xMC0yMDAwL2p3LTEwMjAtYW50Lmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlNob3J0IHR1dG9yaWFsIGluIENhY3R1cycgKGZvcm1lcmx5IEoyRUVVbml0KSAgICAgICBkb2N1bWVudGF0aW9uIj48L2E+CisgICAgICAgIFNob3J0IHR1dG9yaWFsIGluIENhY3R1cycgKGZvcm1lcmx5IEoyRUVVbml0KSAgICAgICBkb2N1bWVudGF0aW9uCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlcmUgaXMgYSBzaG9ydCB0dXRvcmlhbCBvbiBob3cgdG8gdXNlIEFudCBpbiBDYWN0dXMnCisgICAgICAgIGRvY3VtZW50YXRpb24uICBJdCBoYXMgYSBzbGFudCB0b3dhcmRzIGJ1aWxkIGZpbGVzIHRoYXQgd2lsbCBiZSB1c2VkCisgICAgICAgIHdpdGggQ2FjdHVzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIENhY3R1cyBkZXZlbG9wbWVudCB0ZWFtCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY2FjdHVzL2hvd3RvX2FudF9wcmltZXIuaHRtbCI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jYWN0dXMvaG93dG9fYW50X3ByaW1lci5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJEZXZlbG9waW5nIGN1c3RvbSBBbnQgdGFza3Mgd2l0aCBWaXN1YWxBZ2UgZm9yIEphdmEiPjwvYT4KKyAgICAgICAgRGV2ZWxvcGluZyBjdXN0b20gQW50IHRhc2tzIHdpdGggVmlzdWFsQWdlIGZvciBKYXZhCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBhcnRpY2xlIG91dGxpbmVzIGhvdyB0byBpbnRlZ3JhdGUgQW50IGludG8gVmlzdWFsQWdlIGZvciBKYXZhLAorICAgICAgICBhbmQgaG93IHRvIHdyaXRlIGFuZCBkZWJ1ZyBjdXN0b20gdGFza3MgdXNpbmcgdGhlIElERSBhbmQgdGhlCisgICAgICAgIGludGVncmF0ZWQgZGVidWdnZXIuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBdXRob3I6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmdsZW5uQHNvbWFuZXR3b3Jrcy5jb20iPkdsZW5uIE1jQWxsaXN0ZXI8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3c3LnNvZnR3YXJlLmlibS5jb20vdmFkLm5zZi9kYXRhL2RvY3VtZW50MjM2Nj9PcGVuRG9jdW1lbnQmYW1wO3A9MSZhbXA7QkNUPTEmYW1wO0Zvb3Rlcj0xIj5odHRwOi8vd3d3Ny5zb2Z0d2FyZS5pYm0uY29tL3ZhZC5uc2YvZGF0YS9kb2N1bWVudDIzNjY/T3BlbkRvY3VtZW50JmFtcDtwPTEmYW1wO0JDVD0xJmFtcDtGb290ZXI9MTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPSJzdWJzZWN0aW9uIj4KKyAgICAgICAgPGEgbmFtZT0iQXV0b21hdGVkIGJ1aWxkcyB3aXRoIFZpc3VhbEFnZSBmb3IgSmF2YSBhbmQgQW50Ij48L2E+CisgICAgICAgIEF1dG9tYXRlZCBidWlsZHMgd2l0aCBWaXN1YWxBZ2UgZm9yIEphdmEgYW5kIEFudAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBzaG93cyBob3cgeW91IGNhbiBwZXJmb3JtIGNvbW1hbmQgbGluZSBidWlsZHMgd2l0aCBhCisgICAgICAgIFZpc3VhbEFnZSBmb3IgSmF2YSByZXBvc2l0b3J5LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpnbGVubkBzb21hbmV0d29ya3MuY29tIj5HbGVubiBNY0FsbGlzdGVyPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIFVSTDoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Ny5zb2Z0d2FyZS5pYm0uY29tL3ZhZC5uc2YvRGF0YS9Eb2N1bWVudDQzNjY/T3BlbkRvY3VtZW50JmFtcDtwPTEmYW1wO0JDVD0zJmFtcDtGb290ZXI9MSI+aHR0cDovL3d3dzcuc29mdHdhcmUuaWJtLmNvbS92YWQubnNmL0RhdGEvRG9jdW1lbnQ0MzY2P09wZW5Eb2N1bWVudCZhbXA7cD0xJmFtcDtCQ1Q9MyZhbXA7Rm9vdGVyPTE8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFudDogQSBCdWlsZCBUb29sIGZyb20gdGhlIEpha2FydGEgUHJvamVjdCI+PC9hPgorICAgICAgICBBbnQ6IEEgQnVpbGQgVG9vbCBmcm9tIHRoZSBKYWthcnRhIFByb2plY3QKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGFydGljbGUgaXMgZnJvbSB0aGUgIkJlc3QgUHJhY3RpY2VzIiBzZWN0aW9uIG9mCisgICAgICAgIFN1bidzIERvdC1Db20gQnVpbGRlciBTaXRlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIExhdXJhIEdlZWxlIFdhbmcKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RjYi5zdW4uY29tL3ByYWN0aWNlcy9wcm9maWxlcy9hbnQuanNwIj5odHRwOi8vZGNiLnN1bi5jb20vcHJhY3RpY2VzL3Byb2ZpbGVzL2FudC5qc3A8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9Ik1ha2luZyBhIE1vdW50YWluIE91dCBvZiBhbiBBbnRoaWxsIj48L2E+CisgICAgICAgIE1ha2luZyBhIE1vdW50YWluIE91dCBvZiBhbiBBbnRoaWxsCisgICAgICA8L2g0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhpcyBhcnRpY2xlIGlzIGZyb20gdGhlIEp1bmUgMjAwMSBpc3N1ZSBvZiB0aGUgSmF2YSBEZXZlbG9wZXInCisgICAgICAgIEpvdXJuYWwuICBZb3UgbmVlZCB0byBiZSBhIHJlZ2lzdGVyZWQgSkRKIHN1YnNjcmliZXIgdG8gdmlldyB0aGlzCisgICAgICAgIGFydGljbGUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBdXRob3I6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgTmVhbCBGb3JkCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3lzLWNvbi5jb20vamF2YS9hcmNoaXZlc2EuY2ZtP3ZvbHVtZT0wNiZhbXA7aXNzdWU9MDYiPmh0dHA6Ly93d3cuc3lzLWNvbi5jb20vamF2YS9hcmNoaXZlc2EuY2ZtP3ZvbHVtZT0wNiZhbXA7aXNzdWU9MDY8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IlVzaW5nIEFudCBhbmQgV2VibG9naWMgRUpCcyI+PC9hPgorICAgICAgICBVc2luZyBBbnQgYW5kIFdlYmxvZ2ljIEVKQnMKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGFydGljbGUgZGVzY3JpYmVzIGhvdyB0byB1c2UgQW50IHRvIGNyZWF0ZSBXZWJsb2dpYyBFSkJzLCBhbmQKKyAgICAgICAgc29tZSB3b3JrYXJvdW5kcyBmb3IgaXNzdWVzIHlvdSBtYXkgZW5jb3VudGVyLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEplc3NlIEUuIFRpbGx5CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub25qYXZhLmNvbS9wdWIvYS9vbmphdmEvMjAwMS8wNi8yNS9hbnRlamIuaHRtbCI+aHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDAxLzA2LzI1L2FudGVqYi5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJVc2luZyBKYXZhU2NyaXB0IHdpdGggQW50Ij48L2E+CisgICAgICAgIFVzaW5nIEphdmFTY3JpcHQgd2l0aCBBbnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BIHR1dG9yaWFsIGFib3V0IHVzaW5nIEphdmFTY3JpcHQgYW5kIFhTTFQgd2l0aCBBbnQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBBdXRob3I6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgRHlsYW4gU2NoaWVtYW5uCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2l0ZXBlbi5jb20vYW50L2phdmFzY3JpcHQuaHRtbCI+aHR0cDovL3d3dy5zaXRlcGVuLmNvbS9hbnQvamF2YXNjcmlwdC5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJCdWlsZGluZyB3aXRoIEFudCI+PC9hPgorICAgICAgICBCdWlsZGluZyB3aXRoIEFudAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlNlcmllcyBvZiBhcnRpY2xlcyB0aGF0IGRlc2NyaWJlIGEgZnJhbWV3b3JrIGZvciB3ZWIKKyAgICAgICAgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgYmFzZWQgb24gQW50IGFuZCBKVW5pdC48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86YWxleGNAcHVycGxldGVjaC5jb20iPkFsZXggQ2hhZmZlZTwvYT4KKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgSW50cm9kdWN0aW9uOiA8YSBocmVmPSJodHRwOi8vc29mdHdhcmVkZXYuZWFydGh3ZWIuY29tL3NkdGVjaC9hcnRpY2xlLzAsLDEyMDY1Xzk4OTYzMSwwMC5odG1sIj5odHRwOi8vc29mdHdhcmVkZXYuZWFydGh3ZWIuY29tL3NkdGVjaC9hcnRpY2xlLzAsLDEyMDY1Xzk4OTYzMSwwMC5odG1sPC9hPjxiciAvPgorICAgICAgICAgICAgICAgIERpcmVjdG9yeSBTdHJ1Y3R1cmU6IDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZWRldi5lYXJ0aHdlYi5jb20vc2R0ZWNoL2FydGljbGUvMCwsMTIwODJfOTk0OTkxLDAwLmh0bWwiPmh0dHA6Ly9zb2Z0d2FyZWRldi5lYXJ0aHdlYi5jb20vc2R0ZWNoL2FydGljbGUvMCwsMTIwODJfOTk0OTkxLDAwLmh0bWw8L2E+PGJyIC8+CisgICAgICAgICAgICAgICAgRGVwbG95bWVudCBhbmQgRGlzdHJpYnV0aW9uOiA8YSBocmVmPSJodHRwOi8vc29mdHdhcmVkZXYuZWFydGh3ZWIuY29tL3NkdGVjaC9hcnRpY2xlLzAsLDEyMDc3Xzk5ODI0MSwwMC5odG1sIj5odHRwOi8vc29mdHdhcmVkZXYuZWFydGh3ZWIuY29tL3NkdGVjaC9hcnRpY2xlLzAsLDEyMDc3Xzk5ODI0MSwwMC5odG1sPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJEZXZlbG9waW5nIHdpdGggSkFYQiBhbmQgQW50Ij48L2E+CisgICAgICAgIERldmVsb3Bpbmcgd2l0aCBKQVhCIGFuZCBBbnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5TZXJpZXMgb2YgYXJ0aWNsZXMgdGhhdCBzaG93cyBob3cgdG8gdXNlIEFudCB0b2dldGhlciB3aXRoCisgICAgICAgIHRoZSBKYXZhIEFQSSBmb3IgWE1MIEJpbmRpbmcgKEpBWEIpLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEpvc2VwaCBTaGVsYnkKKyAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBVUkw6CisgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDAyLzAzLzA2L2pheGFudDEuaHRtbCI+aHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDAyLzAzLzA2L2pheGFudDEuaHRtbDwvYT48YnIgLz4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9uamF2YS5jb20vcHViL2Evb25qYXZhLzIwMDIvMDMvMTMvamF4YmFudDIuaHRtbCI+aHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDAyLzAzLzEzL2pheGJhbnQyLmh0bWw8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iUHJlc2VudGF0aW9ucyI+PC9hPgorICAgICAgUHJlc2VudGF0aW9ucworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSJBbnQgQnVpbGQgVG9vbCI+PC9hPgorICAgICAgICBBbnQgQnVpbGQgVG9vbAorICAgICAgPC9oND4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPkEgUG93ZXJQb2ludCBwcmVzZW50YXRpb24gb24gQW50IDEuMi4gIEl0IHByb3ZpZGVzIGEgYmFzaWMgb3ZlcnZpZXcKKyAgICAgICAgb2YgQW50J3MgY2FwYWJpbGl0aWVzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iNCI+CisgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgQXV0aG9yOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpjaGFuZXpvbkBuZXRzY2FwZS5jb20iPlBhdHJpY2sgQ2hhbmV6b248L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wZW9wbGUubmV0c2NhcGUuY29tL2NoYW5lem9uL3RlY2gvYW50L2FudF9wcmVzby5wcHQiPmh0dHA6Ly9wZW9wbGUubmV0c2NhcGUuY29tL2NoYW5lem9uL3RlY2gvYW50L2FudF9wcmVzby5wcHQ8L2E+CisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ic3Vic2VjdGlvbiI+CisgICAgICAgIDxhIG5hbWU9IkFudCI+PC9hPgorICAgICAgICBBbnQKKyAgICAgIDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5BIGRldGFpbGVkIEFudCAxLjMgUG93ZXJQb2ludCBwcmVzZW50YXRpb24sIG1hZGUgYXQgdGhlIFN0LiBMb3VpcyBKYXZhIFVzZXJzIEdyb3VwCisgICAgICAgIG1lZXRpbmcgaW4gTWFyY2ggMjAwMS4gIEluY2x1ZGVzIGEgZGV0YWlsZWQgYnVpbGQgZmlsZSBhbmQgYmFzaWMKKyAgICAgICAgZGVzY3JpcHRpb25zIG9mIGFsbCB0aGUgYnVpbHQgaW4gYW5kIG9wdGlvbmFsIHRhc2tzLiAgVXBkYXRlZCBmb3IgQW50IDEuNCBpbiBPY3RvYmVyIDIwMDEuCisgICAgICAgIEF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IG5vdy48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjQiPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIEF1dGhvcjoKKyAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIxIiByb3dzcGFuPSIxIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICBNYXJrIFZvbGttYW5uCisgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj0iMSIgcm93c3Bhbj0iMSIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgVVJMOgorICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjEiIHJvd3NwYW49IjEiCisgICAgICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub2Npd2ViLmNvbS9qbmIvZmlsZXMvQW50LnBkZiI+aHR0cDovL3d3dy5vY2l3ZWIuY29tL2puYi9maWxlcy9BbnQucGRmPC9hPgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IS0tCisgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoIiAtICIrIkxhc3QgUHVibGlzaGVkOiAiICsgZG9jdW1lbnQubGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgLy8gIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvcD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL3NsaWRlcy9leHRlbmRpbmdfYW50Lm9kcCBiL3RydW5rL2RvY3Mvc2xpZGVzL2V4dGVuZGluZ19hbnQub2RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGJhN2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL3NsaWRlcy9leHRlbmRpbmdfYW50Lm9kcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL3NyY2Rvd25sb2FkLmNnaSBiL3RydW5rL2RvY3Mvc3JjZG93bmxvYWQuY2dpCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzMjRmNzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL3NyY2Rvd25sb2FkLmNnaQpAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKKyMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKKyMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCitjZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCisvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL3NyY2Rvd25sb2FkLmh0bWwgYi90cnVuay9kb2NzL3NyY2Rvd25sb2FkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjZDZjYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2RvY3Mvc3JjZG93bmxvYWQuaHRtbApAQCAtMCwwICsxLDM0MSBAQAorCisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorICAgICAgICA8aHRtbCBsYW5nPSJlbiI+CisgICAgPCEtLSBHRU5FUkFURUQgRklMRSwgRE8gTk9UIEVESVQsIEVESVQgVEhFIFhNTCBGSUxFIElOIHhkb2NzIElOU1RFQUQhIC0tPgorICAgIDxoZWFkPgorICAgICAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgICAgICAgIDx0aXRsZT5BcGFjaGUgQW50IC0gU291cmNlIERpc3RyaWJ1dGlvbnM8L3RpdGxlPgorICAgICAgICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9wYWdlLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij4KKyAgICAgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CisgICAgICAgIDxzY3JpcHQgc3JjPSIuL2JyZWFkY3J1bWJzLmpzIiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICAgIDwvcD4KKworICAgICAgPGRpdiBjbGFzcz0ibG9nb2JhciI+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBib3JkZXI9IjAiIGFsdD0iQXBhY2hlIEFudCBzaXRlIiBzcmM9Ii4vaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj48aW1nIGFsdD0iQXBhY2hlIEFudCBsb2dvIiBib3JkZXI9IjAiIHNyYz0iLi9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgb25zdWJtaXQ9InEudmFsdWUgPSBxdWVyeS52YWx1ZSArICcgc2l0ZTphbnQuYXBhY2hlLm9yZyciIGFjdGlvbj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWFyY2giIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSIjNEM2QzhGIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPjxpbWcgaGVpZ2h0PSIxMCIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJzZWFyY2hjYXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc2l6ZT0iMTUiIGlkPSJxdWVyeSIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICB0aGUgQXBhY2hlIEFudCBzaXRlCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgorICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0idGFiIGJhciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiM0QzZDOEYiPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj48Yj5Ib21lPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNSI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI4IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9Im5vbiBzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNGVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iI0IyQzRFMCI+PGEgaHJlZj0iLi9wcm9qZWN0cy9pbmRleC5odG1sIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj5Qcm9qZWN0czwvZm9udD48L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkFwYWNoZSBBbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9pbmRleC5odG1sIj5XZWxjb21lPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGljZW5zZS5odG1sIj5MaWNlbnNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYW50bmV3cy5odG1sIj5OZXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG9jdW1lbnRhdGlvbgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21hbnVhbC9pbmRleC5odG1sIj5NYW51YWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9wcm9qZWN0cy5odG1sIj5SZWxhdGVkIFByb2plY3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vZXh0ZXJuYWwuaHRtbCI+RXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcmVzb3VyY2VzLmh0bWwiPlJlc291cmNlczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2ZhcS5odG1sIj5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2FudC9Gcm9udFBhZ2UiPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9wcm9ibGVtcy5odG1sIj5IYXZpbmcgUHJvYmxlbXM/PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG93bmxvYWQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+U291cmNlIERpc3RyaWJ1dGlvbnM8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+Q29udHJpYnV0aW5nCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWFpbC5odG1sIj5NYWlsaW5nIExpc3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vc3ZuLmh0bWwiPlN1YnZlcnNpb24gUmVwb3NpdG9yaWVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbmlnaHRsaWVzLmh0bWwiPk5pZ2h0bHkgQnVpbGRzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYnVncy5odG1sIj5CdWcgRGF0YWJhc2U8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5TcG9uc29yc2hpcAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi90aGFua3MuaHRtbCI+VGhhbmtzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiPlNwb25zb3JzaGlwPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2NvbnRyaWJ1dGluZy5odG1sIj5Eb25hdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Qcm9qZWN0IE1hbmFnZW1lbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9jb250cmlidXRvcnMuaHRtbCI+Q29udHJpYnV0b3JzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbWlzc2lvbi5odG1sIj5BcGFjaGUgQW50IE1pc3Npb248L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9ieWxhd3MuaHRtbCI+UHJvamVjdCBCeWxhd3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9sZWdhbC5odG1sIj5MZWdhbDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKyAgICA8Y2VudGVyPgorICAgIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIvYWRzL2J1dHRvbmJhci5odG1sIiAtLT4KKyAgICA8L2NlbnRlcj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogbGVmdCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJsaWdodGJsdWViYXIiPiZuYnNwOzwvZGl2PgorICA8ZGl2IGNsYXNzPSJtYWluIj4KKyAgPGRpdiBjbGFzcz0iY29udGVudCI+CisgICAgPGgxIGNsYXNzPSJ0aXRsZSI+U291cmNlIERpc3RyaWJ1dGlvbnM8L2gxPgorICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9IkRvd25sb2FkaW5nIEFudCI+PC9hPgorICAgICAgRG93bmxvYWRpbmcgQW50CisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPlVzZSB0aGUgbGlua3MgYmVsb3cgdG8gZG93bmxvYWQgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mIEFudCBmcm9tCitvbmUgb2Ygb3VyIG1pcnJvcnMuICBJdCBpcyBnb29kIHByYWN0aWNlIHRvCis8YSBocmVmPSJbbG9jYXRpb25dI1ZlcmlmeSBSZWxlYXNlcyI+dmVyaWZ5IHRoZSBpbnRlZ3JpdHk8L2E+CitvZiB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzLCBlc3BlY2lhbGx5IGlmIHlvdSBhcmUgdXNpbmcgb25lIG9mIG91cgorbWlycm9yIHNpdGVzLiAgSW4gb3JkZXIgdG8gZG8gdGhpcyB5b3UgbXVzdCB1c2UgdGhlIHNpZ25hdHVyZXMgZnJvbQorb3VyIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC8iPm1haW4gZGlzdHJpYnV0aW9uCitkaXJlY3Rvcnk8L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW50IGlzIGRpc3RyaWJ1dGVkIGFzIDxjb2RlPnppcDwvY29kZT4sIDxjb2RlPnRhci5nejwvY29kZT4gYW5kCis8Y29kZT50YXIuYnoyPC9jb2RlPiBhcmNoaXZlcyAtIHRoZSBjb250ZW50cyBhcmUgdGhlIHNhbWUuICBQbGVhc2UKK25vdGUgdGhhdCB0aGUgPGNvZGU+dGFyLio8L2NvZGU+IGFyY2hpdmVzIGNvbnRhaW4gZmlsZSBuYW1lcyBsb25nZXIKK3RoYW4gMTAwIGNoYXJhY3RlcnMgYW5kIGhhdmUgYmVlbiBjcmVhdGVkIHVzaW5nIEdOVSB0YXIgZXh0ZW5zaW9ucy4KK1RodXMgdGhleSBtdXN0IGJlIHVudGFycmVkIHdpdGggYSBHTlUgY29tcGF0aWJsZSB2ZXJzaW9uIG9mCis8Y29kZT50YXI8L2NvZGU+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IGRvIG5vdCBzZWUgdGhlIGZpbGUgeW91IG5lZWQgaW4gdGhlIGxpbmtzIGJlbG93LCBwbGVhc2Ugc2VlCit0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50LyI+bWFzdGVyIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPiBvciwgcHJlZmVyYWJseSwgaXRzIDxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC8iPm1pcnJvcjwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJzZWN0aW9uIj4KKyAgICAgIDxhIG5hbWU9Ik1pcnJvciI+PC9hPgorICAgICAgTWlycm9yCisgICAgPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwPllvdSBhcmUgY3VycmVudGx5IHVzaW5nIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmIHlvdSBlbmNvdW50ZXIgYQorcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiAgSWYgYWxsCittaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUgPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mCit0aGUgbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIj4KK090aGVyIG1pcnJvcnM6IDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj4KK1tpZi1hbnkgaHR0cF0KKyAgW2ZvciBodHRwXTxvcHRpb24gdmFsdWU9IltodHRwXSI+W2h0dHBdPC9vcHRpb24+W2VuZF0KK1tlbmRdCitbaWYtYW55IGZ0cF0KKyAgW2ZvciBmdHBdPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF0KK1tlbmRdCitbaWYtYW55IGJhY2t1cF0KKyAgW2ZvciBiYWNrdXBdPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+W2VuZF0KK1tlbmRdCis8L3NlbGVjdD4KKzxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiIC8+Cis8L2Zvcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iQ3VycmVudCBSZWxlYXNlIG9mIEFudCI+PC9hPgorICAgICAgQ3VycmVudCBSZWxlYXNlIG9mIEFudAorICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5DdXJyZW50bHksIEFwYWNoZSBBbnQgMS43LjAgaXMgdGhlIGJlc3QgYXZhaWxhYmxlIHZlcnNpb24sIHNlZSB0aGUKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9SRUFETUUuaHRtbCI+cmVsZWFzZSBub3RlczwvYT4uPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj4KKzxkaXYgY2xhc3M9ImxhYmVsIj5Ob3RlPC9kaXY+Cis8ZGl2IGNsYXNzPSJjb250ZW50Ij5BbnQgMS43LjAgaGFzIGJlZW4gcmVsZWFzZWQgb24gMTktRGVjLTIwMDYgYW5kCittYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgbWlycm9ycyBmb3IgYSBmZXcgZGF5cy48L2Rpdj4KKzwvZGl2PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZyI+Cis8ZGl2IGNsYXNzPSJsYWJlbCI+VGFyIGZpbGVzIG1heSByZXF1aXJlIGdudSB0YXIgdG8gZXh0cmFjdDwvZGl2PgorPGRpdiBjbGFzcz0iY29udGVudCI+VGFyIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gY29udGFpbiBsb25nIGZpbGUgbmFtZXMsIGFuZCBtYXkKKyByZXF1aXJlIGdudSB0YXIgdG8gZG8gdGhlIGV4dHJhY3Rpb24uPC9kaXY+Cis8L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorPGxpPjxjb2RlPi56aXA8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnppcCI+YXBhY2hlLWFudC0xLjcuMC1zcmMuemlwPC9hPgorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9zb3VyY2UvYXBhY2hlLWFudC0xLjcuMC1zcmMuemlwLmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnppcC5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnppcC5tZDUiPk1ENTwvYT5dPC9saT4KKworPGxpPjxjb2RlPi50YXIuZ3o8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5neiI+YXBhY2hlLWFudC0xLjcuMC1zcmMudGFyLmd6PC9hPgorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9zb3VyY2UvYXBhY2hlLWFudC0xLjcuMC1zcmMudGFyLmd6LmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5nei5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5nei5tZDUiPk1ENTwvYT5dPC9saT4KKworPGxpPjxjb2RlPi50YXIuYnoyPC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L3NvdXJjZS9hcGFjaGUtYW50LTEuNy4wLXNyYy50YXIuYnoyIj5hcGFjaGUtYW50LTEuNy4wLXNyYy50YXIuYnoyPC9hPgorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9zb3VyY2UvYXBhY2hlLWFudC0xLjcuMC1zcmMudGFyLmJ6Mi5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L3NvdXJjZS9hcGFjaGUtYW50LTEuNy4wLXNyYy50YXIuYnoyLnNoYTEiPlNIQTE8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9zb3VyY2UvYXBhY2hlLWFudC0xLjcuMC1zcmMudGFyLmJ6Mi5tZDUiPk1ENTwvYT5dPC9saT4KKzwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iT2xkIEFudCBSZWxlYXNlcyI+PC9hPgorICAgICAgT2xkIEFudCBSZWxlYXNlcworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5PbGRlciByZWxlYXNlcyBvZiBBbnQgY2FuIGJlIGZvdW5kIDxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlLyI+aGVyZTwvYT4uICBUaG9zZQorcmVsZWFzZXMgYXJlIG9ubHkgcHJvdmlkZWQgYXMgPGNvZGU+emlwPC9jb2RlPiBhcmNoaXZlcyB0aGF0IGNhbiBiZQorZXh0cmFjdGVkIGJ5IDxjb2RlPmphciB4ZiA8L2NvZGU+PGVtPmFyY2hpdmUuemlwPC9lbT4gLSB3ZSBoaWdobHkKK3JlY29tbWVuZCB0byBub3QgdXNlIHRob3NlIHJlbGVhc2VzIGJ1dCB1cGdyYWRlIHRvIEFudCdzIDxhIGhyZWY9Iltsb2NhdGlvbl0jQ3VycmVudCBSZWxlYXNlIG9mIEFudCI+bGF0ZXN0PC9hPiByZWxlYXNlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJWZXJpZnkgUmVsZWFzZXMiPjwvYT4KKyAgICAgIFZlcmlmeSBSZWxlYXNlcworICAgIDwvaDM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cD5JdCBpcyBlc3NlbnRpYWwgdGhhdCB5b3UgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQKK2ZpbGVzIHVzaW5nIHRoZSBQR1Agc2lnbmF0dXJlIG9yIHRoZSBTSEExIG9yIE1ENSBjaGVja3N1bXMuICBUaGUKK2NoZWNrc3VtcyBhcmUgbm90IGFzIHN0cm9uZyBpbmRpY2F0b3JzIGFzIHRoZSBQR1Agc2lnbmF0dXJlLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIFBHUCBzaWduYXR1cmVzIGNhbiBiZSB2ZXJpZmllZCB1c2luZyBQR1Agb3IgR1BHLiAgRmlyc3QKK2Rvd25sb2FkIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvS0VZUyI+S0VZUzwvYT4KK2FzIHdlbGwgYXMgdGhlIDxjb2RlPmFzYzwvY29kZT4gc2lnbmF0dXJlIGZpbGUgZm9yIHRoZSBwYXJ0aWN1bGFyCitkaXN0cmlidXRpb24uICBNYWtlIHN1cmUgeW91IGdldCB0aGVzZSBmaWxlcyBmcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5tYWluIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPiwgcmF0aGVyIHRoYW4gZnJvbSBhIG1pcnJvci4gVGhlbiB2ZXJpZnkgdGhlIHNpZ25hdHVyZXMKK3VzaW5nPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48Y29kZT4KKyUgcGdwayAtYSBLRVlTPGJyIC8+CislIHBncHYgYXBhY2hlLWFudC0xLjcuMC1zcmMudGFyLmd6LmFzYzxiciAvPgorPC9jb2RlPgorPGVtPm9yPC9lbT48YnIgLz4KKzxjb2RlPgorJSBwZ3AgLWthIEtFWVM8YnIgLz4KKyUgcGdwIGFwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5nei5hc2M8YnIgLz4KKzwvY29kZT4KKzxlbT5vcjwvZW0+PGJyIC8+Cis8Y29kZT4KKyUgZ3BnIC0taW1wb3J0IEtFWVM8YnIgLz4KKyUgZ3BnIC0tdmVyaWZ5IGFwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5nei5hc2MKKzwvY29kZT48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdmVyaWZ5IHRoZSBjaGVja3N1bXMgb24gdGhlIGZpbGVzLiAgVW5peAorcHJvZ3JhbXMgY2FsbGVkIDxjb2RlPm1kNTwvY29kZT4vPGNvZGU+c2hhMTwvY29kZT4gb3IKKzxjb2RlPm1kNXN1bTwvY29kZT4vPGNvZGU+c2hhMXN1bTwvY29kZT4gYXJlIGluY2x1ZGVkIGluIG1hbnkgdW5peAorZGlzdHJpYnV0aW9ucy4gIDxjb2RlPipzdW08L2NvZGU+IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleHR1dGlscy90ZXh0dXRpbHMuaHRtbCI+R05VCitUZXh0dXRpbHM8L2E+LiAgV2luZG93cyB1c2VycyBjYW4gZ2V0IGJpbmFyeSBtZDUgcHJvZ3JhbXMgZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LmZvdXJtaWxhYi5jaC9tZDUvIj5oZXJlPC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS8iPmhlcmU8L2E+LiAgPGEgaHJlZj0iaHR0cDovL3d3dy5zbGF2YXNvZnQuY29tL2ZzdW0vIj5mc3VtPC9hPiBzdXBwb3J0cyBNRDUgYW5kCitTSEExLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+V2UgaGlnaGx5IHJlY29tbWVuZCB0byB2ZXJpZnkgdGhlIFBHUCBzaWduYXR1cmUsIHRob3VnaC48L3A+CisgICAgICAgICAgICAgICAgCisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgICAgICAgIDxwIGNsYXNzPSJjb3B5cmlnaHQiPgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhLS0KKyAgICAgICAgICAgICAgICBkb2N1bWVudC53cml0ZSgiIC0gIisiTGFzdCBQdWJsaXNoZWQ6ICIgKyBkb2N1bWVudC5sYXN0TW9kaWZpZWQpOworICAgICAgICAgICAgICAvLyAgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgPC9wPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3RydW5rL2RvY3Mvc3ZuLmh0bWwgYi90cnVuay9kb2NzL3N2bi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTZlYTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9kb2NzL3N2bi5odG1sCkBAIC0wLDAgKzEsMjUzIEBACisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICAgICAgIDxodG1sIGxhbmc9ImVuIj4KKyAgICA8IS0tIEdFTkVSQVRFRCBGSUxFLCBETyBOT1QgRURJVCwgRURJVCBUSEUgWE1MIEZJTEUgSU4geGRvY3MgSU5TVEVBRCEgLS0+CisgICAgPGhlYWQ+CisgICAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKyAgICAgICAgPHRpdGxlPkFwYWNoZSBBbnQgLSBTVk4gUmVwb3NpdG9yaWVzPC90aXRsZT4KKyAgICAgICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vcGFnZS5jc3MiIHJlbD0ic3R5bGVzaGVldCI+CisgICAgICAgICAgPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJBbnRvaW5lIExldnktTGFtYmVydCI+CisgIDxtZXRhIG5hbWU9ImVtYWlsIiBjb250ZW50PSIiPgorICAgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8cCBjbGFzcz0ibmF2cGF0aCI+CisgICAgICAgIDxzY3JpcHQgc3JjPSIuL2JyZWFkY3J1bWJzLmpzIiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICAgIDwvcD4KKworICAgICAgPGRpdiBjbGFzcz0ibG9nb2JhciI+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBib3JkZXI9IjAiIGFsdD0iQXBhY2hlIEFudCBzaXRlIiBzcmM9Ii4vaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj48aW1nIGFsdD0iQXBhY2hlIEFudCBsb2dvIiBib3JkZXI9IjAiIHNyYz0iLi9pbWFnZXMvcHJvamVjdC1sb2dvLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgorICAgICAgICAgICAgICA8Zm9ybSB0YXJnZXQ9Il9ibGFuayIgb25zdWJtaXQ9InEudmFsdWUgPSBxdWVyeS52YWx1ZSArICcgc2l0ZTphbnQuYXBhY2hlLm9yZyciIGFjdGlvbj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NlYXJjaCIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWFyY2giIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSIjNEM2QzhGIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiPjxpbWcgaGVpZ2h0PSIxMCIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJzZWFyY2hjYXB0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0icSIgdHlwZT0iaGlkZGVuIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc2l6ZT0iMTUiIGlkPSJxdWVyeSIgdHlwZT0idGV4dCI+CisgICAgICAgICAgICAgICAgICAgICAgPGltZyBoZWlnaHQ9IjEiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj4KKyAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiB0eXBlPSJzdWJtaXQiPgorICAgICAgICAgICAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgICAgICAgICAgICB0aGUgQXBhY2hlIEFudCBzaXRlCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIuL2ltYWdlcy9zZWFyY2gtbGVmdC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48aW1nIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iMTAiIHdpZHRoPSI5IiBzcmM9Ii4vaW1hZ2VzL3NlYXJjaC1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZGl2PgorCisgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgorICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0idGFiIGJhciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iLi9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjNEM2QzhGIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYlNlbC1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiM0QzZDOEYiPjxmb250IGNvbG9yPSIjZmZmZmZmIiBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj48Yj5Ib21lPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiM0QzZDOEYiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNSI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI4IiB3aWR0aD0iOCIgc3JjPSIuL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9Im5vbiBzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNGVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiNCMkM0RTAiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvdGFiLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iI0IyQzRFMCI+PGEgaHJlZj0iLi9wcm9qZWN0cy9pbmRleC5odG1sIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj5Qcm9qZWN0czwvZm9udD48L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIjQjJDNEUwIj48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL3RhYi1yaWdodC5naWYiPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvZGl2PgorCisgICAgICA8ZGl2IGNsYXNzPSJibHVlYmFyIj48L2Rpdj4KKyAgICAgICAgICAgICAgICAgICAgCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPkFwYWNoZSBBbnQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9pbmRleC5odG1sIj5XZWxjb21lPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vbGljZW5zZS5odG1sIj5MaWNlbnNlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vYW50bmV3cy5odG1sIj5OZXdzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG9jdW1lbnRhdGlvbgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL21hbnVhbC9pbmRleC5odG1sIj5NYW51YWw8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9wcm9qZWN0cy5odG1sIj5SZWxhdGVkIFByb2plY3RzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vZXh0ZXJuYWwuaHRtbCI+RXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii4vcmVzb3VyY2VzLmh0bWwiPlJlc291cmNlczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2ZhcS5odG1sIj5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2FudC9Gcm9udFBhZ2UiPldpa2k8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9wcm9ibGVtcy5odG1sIj5IYXZpbmcgUHJvYmxlbXM/PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibWVudWhlYWRlciI+RG93bmxvYWQKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL3NyY2Rvd25sb2FkLmNnaSI+U291cmNlIERpc3RyaWJ1dGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpIGNsYXNzPSJtZW51aGVhZGVyIj5Db250cmlidXRpbmcKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9tYWlsLmh0bWwiPk1haWxpbmcgTGlzdHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9zdm4uaHRtbCI+U3VidmVyc2lvbiBSZXBvc2l0b3JpZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9uaWdodGxpZXMuaHRtbCI+TmlnaHRseSBCdWlsZHM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9idWdzLmh0bWwiPkJ1ZyBEYXRhYmFzZTwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlNwb25zb3JzaGlwCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIj5UaGFua3M8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vc3BvbnNvcnNoaXAuaHRtbCI+U3BvbnNvcnNoaXA8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vY29udHJpYnV0aW5nLmh0bWwiPkRvbmF0aW9uczwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPlByb2plY3QgTWFuYWdlbWVudAorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2NvbnRyaWJ1dG9ycy5odG1sIj5Db250cmlidXRvcnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iLi9taXNzaW9uLmh0bWwiPkFwYWNoZSBBbnQgTWlzc2lvbjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2J5bGF3cy5odG1sIj5Qcm9qZWN0IEJ5bGF3czwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuL2xlZ2FsLmh0bWwiPkxlZ2FsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgIDwvZGl2PgorICAgIDxjZW50ZXI+CisgICAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9Ii9hZHMvYnV0dG9uYmFyLmh0bWwiIC0tPgorICAgIDwvY2VudGVyPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiBsZWZ0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvbWVudS1sZWZ0LmdpZiI+CisgICAgPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0IiBoZWlnaHQ9IjEwIiB3aWR0aD0iMTAiIGJvcmRlcj0iMCIgYWx0PSIiIHNyYz0iLi9pbWFnZXMvbWVudS1yaWdodC5naWYiPgorICA8L2Rpdj4KKyAgICAgIDxkaXYgY2xhc3M9ImxpZ2h0Ymx1ZWJhciI+Jm5ic3A7PC9kaXY+CisgIDxkaXYgY2xhc3M9Im1haW4iPgorICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KKyAgICA8aDEgY2xhc3M9InRpdGxlIj5TVk4gUmVwb3NpdG9yaWVzPC9oMT4KKyAgICAgICAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+CisgICAgICA8YSBuYW1lPSJBY2Nlc3MgdGhlIFNvdXJjZSBUcmVlIChTdWJ2ZXJzaW9uKSI+PC9hPgorICAgICAgQWNjZXNzIHRoZSBTb3VyY2UgVHJlZSAoU3VidmVyc2lvbikKKyAgICA8L2gzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW55b25lIGNhbiBjaGVja291dCBzb3VyY2UgY29kZSBmcm9tIG91ciBwdWJsaWMgU3VidmVyc2lvbiByZXBvc2l0b3J5LiBUbyBkbyBzbywKKyAgICAgICAgIHNpbXBseSB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIChpZiB5b3UgYXJlIHVzaW5nIGEgR1VJIGNsaWVudCwgY29uZmlndXJlIGl0CisgICAgICAgICBhcHByb3ByaWF0ZWx5KTo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUiPgorc3ZuIGNvIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L1twcm9qZWN0XS90cnVuay8gYW50LVtwcm9qZWN0XTwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Nb2R1bGVzIGF2YWlsYWJsZSBmb3IgYWNjZXNzIGFyZTo8L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvY29yZS90cnVuay8iPmFudDwvYT4gLSBUaGUgIm1haW4iIEFudCBtb2R1bGUuPGJyIC8+CisgICAgICAgICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9jb3JlL3RydW5rLworICAgICAgICA8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9hbnRsaWJzL2FudHVuaXQvdHJ1bmsvIj5hbnR1bml0PC9hPiBUZXN0IGZyYW1ld29yayBmb3IgQW50LjxiciAvPgorICAgICAgICAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvYW50bGlicy9hbnR1bml0L3RydW5rLzwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L2FudGxpYnMvZG90bmV0L3RydW5rLyI+RG90bmV0IGFudGxpYjwvYT4gQ29udGFpbnMgTmFudCwgTnVuaXQsIC4uLjxiciAvPgorICAgICAgICAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvYW50bGlicy9kb3RuZXQvdHJ1bmsvPC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvYW50bGlicy9zdm4vdHJ1bmsvIj5zdm4gYW50bGliPC9hPiBDb250YWlucyB0YXNrcyB0byBpbnRlcmFjdCB3aXRoIFN1YnZlcnNpb24gcmVwb3NpdG9yaWVzLjxiciAvPgorICAgICAgICAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvYW50bGlicy9zdm4vdHJ1bmsvPC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvc2FuZGJveC8iPnNhbmRib3g8L2E+IC0gTmV3IGRldmVsb3BtZW50cy4gQ29udGFpbnMgY3VycmVudGx5IGdlbmRvYy48YnIgLz4KKyAgICAgICAgICAgIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L3NhbmRib3gvCisgICAgICAgIDwvbGk+CisgICAgICA8L3VsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3UgYXJlIG5vdCBmYW1pbGlhciB3aXRoIFN1YnZlcnNpb24sIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9jdnNpbmRleC5odG1sIj5KYWthcnRhJ3MKKyAgICAgIHNvdXJjZSByZXBvc2l0b3JpZXMgcGFnZTwvYT4gbWF5IGhvbGQgbWFueSBoZWxwZnVsIGhpbnRzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+TmlnaHRseSBzbmFwc2hvdHMgb2YgdGhlIFNWTiB0cmVlIGFyZSBhdmFpbGFibGUgYXQKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3NuYXBzaG90cy9hbnQvIj5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvc25hcHNob3RzL2FudC88L2E+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QSBuaWNlIHZpZXcgb2YgdGhlIHNvdXJjZSBoaXN0b3J5IGlzIGF2YWlsYWJsZSB0aHJvdWdoCisgICAgICA8YSBocmVmPSJodHRwOi8vZmlzaGV5ZTMuY2VucXVhLmNvbS9icm93c2UvYW50LyI+Q2VucXVhJ3MgRmlzaGV5ZSBpbnN0YW5jZTwvYT4uPC9wPgorICAgICAgICAgICAgICAgIAorICAgIDwvZGl2PgorICA8L2Rpdj4KKworICAgICAgICA8cCBjbGFzcz0iY29weXJpZ2h0Ij4KKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IS0tCisgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoIiAtICIrIkxhc3QgUHVibGlzaGVkOiAiICsgZG9jdW1lbnQubGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgLy8gIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgIDwvcD4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS90cnVuay9kb2NzL3dlYnRlc3QvdGVzdGtleXN0b3JlIGIvdHJ1bmsvZG9jcy93ZWJ0ZXN0L3Rlc3RrZXlzdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQyMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvZG9jcy93ZWJ0ZXN0L3Rlc3RrZXlzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9mZXRjaC54bWwgYi90cnVuay9mZXRjaC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0MTdmZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2ZldGNoLnhtbApAQCAtMCwwICsxLDIzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBCdWlsZCBmaWxlIHRvIGZldGNoIG9wdGlvbmFsIGxpYnJhcmllcyBmb3IgQXBhY2hlIEFudAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0+Cis8cHJvamVjdCBuYW1lPSJmZXRjaCIgZGVmYXVsdD0iYWxsIiBiYXNlZGlyPSIuIj4KKworPGRlc2NyaXB0aW9uPgorICBUaGlzIGJ1aWxkIGZpbGUgZG93bmxvYWRzIEpBUiBmaWxlcyB0aGF0IG9wdGlvbmFsIEFudCB0YXNrcyB1c2UsCisgIGFuZCBpbnN0YWxscyB0aGVtIGluIGEgbG9jYXRpb24gdGhhdCBpcyBhY2Nlc3NpYmxlIHRoZSBuZXh0IHRpbWUgQW50IHJ1bnMuCisKKyAgWW91IGNhbiBjaG9vc2UgdGhyZWUgbG9jYXRpb25zLCBieSBnb2luZyAtRGRlc3Q9TE9DQVRJT04gb24gdGhlIGNvbW1hbmQgbGluZQorICAtRGRlc3Q9dXNlciAgICAgdXNlciBsaWIgZGlyICAke3VzZXIuaG9tZX0vLmFudC9saWIKKyAgLURkZXN0PXN5c3RlbSAgIGFudCBsaWIgZGlyICAgJHthbnQuaG9tZX0vbGliIC0tRGVmYXVsdC0tCisgIC1EZGVzdD1vcHRpb25hbCBvcHRpb25hbCBkaXIgICR7YW50LmhvbWV9L2xpYi9vcHRpb25hbCAgKGZvciBBbnQgZGV2ZWxvcGVycykKKworICBZb3UgbWF5IGFsc28gbmVlZCB0byBzZXQgcHJveHkgc2V0dGluZ3MuIE9uIEphdmExLjUsIEFudCB0cmllcyB0byBnZXQKKyAgdGhpcyBmcm9tIHRoZSBPUywgdW5sZXNzIHlvdSB1c2UgdGhlIC1ub3Byb3h5IG9wdGlvbi4KKworICBQcm94aWVzIGNhbiBiZSBjb25maWd1cmVkIG1hbnVhbGx5IHNldHRpbmcgdGhlIEpWTSBwcm94eSB2YWx1ZXMgaW4gdGhlCisgIEFOVF9PUFRTIGVudmlyb25tZW50IHZhcmlhYmxlLgorCisgIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIHByb3h5IHVwIGluIHRoZSB0Y3NoIHNoZWxsLCB0aGUgY29tbWFuZCB3b3VsZCBiZQorICBzb21ldGhpbmcgbGlrZToKKworICBGb3IgY3NoL3Rjc2g6CisgICAgc2V0ZW52IEFOVF9PUFRTICItRGh0dHAucHJveHlIb3N0PXByb3h5IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCIKKyAgRm9yIGJhc2g6CisgICAgZXhwb3J0IEFOVF9PUFRTPSItRGh0dHAucHJveHlIb3N0PXByb3h5IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCIKKyAgRm9yIFdpbmRvd3MsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyBib3gKKyAgYW5kIG9wZW4gYSBuZXcgY29uc29sZS4gb3IsIGJ5IGhhbmQKKyAgICBzZXQgQU5UX09QVFMgPSAtRGh0dHAucHJveHlIb3N0PXByb3h5IC1EaHR0cC5wcm94eVBvcnQ9ODA4MAorPC9kZXNjcmlwdGlvbj4KKworICA8IS0tIEdpdmUgdXNlciBhIGNoYW5jZSB0byBvdmVycmlkZSB3aXRob3V0IGVkaXRpbmcgdGhpcyBmaWxlCisgICAgICAgKGFuZCB3aXRob3V0IHR5cGluZyAtRCBlYWNoIHRpbWUgaXQgY29tcGlsZXMgaXQpIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9Ly5hbnQvYW50LnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIGxvY2F0aW9uPSJsaWIiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb25hbC5kaXIiIGxvY2F0aW9uPSIke2xpYi5kaXJ9L29wdGlvbmFsIiAvPgorICA8cHJvcGVydHkgbmFtZT0idXNlcmxpYi5kaXIiIGxvY2F0aW9uPSIke3VzZXIuaG9tZX0vLmFudC9saWIiIC8+CisKKyAgPCEtLSBsb2FkIGluIG91ciBwcm9wZXJ0aWVzIHRhYmxlIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHtsaWIuZGlyfS9saWJyYXJpZXMucHJvcGVydGllcyIvPgorCisgIDxpbXBvcnQgZmlsZT0iZ2V0LW0yLnhtbCIgLz4KKworICA8dGFyZ2V0IG5hbWU9InBpY2stZGVzdCI+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc3QiIHZhbHVlPSJzeXN0ZW0iIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZGVzdC5kaXIiCisgICAgICB2YWx1ZT0iJHtsaWIuZGlyfSI+CisgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZGVzdH0iIGFyZzI9InN5c3RlbSIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJkZXN0LmRpciIKKyAgICAgIHZhbHVlPSIke29wdGlvbmFsLmRpcn0iPgorICAgICAgPGVxdWFscyBhcmcxPSIke2Rlc3R9IiBhcmcyPSJvcHRpb25hbCIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJkZXN0LmRpciIKKyAgICAgIHZhbHVlPSIke3VzZXJsaWIuZGlyfSI+CisgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZGVzdH0iIGFyZzI9InVzZXIiIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGZhaWwgdW5sZXNzPSJkZXN0LmRpciI+VW5rbm93biBkZXN0aW5hdGlvbiA6ICR7ZGVzdH08L2ZhaWw+CisgICAgPGVjaG8+RG93bmxvYWRpbmcgdG8gJHtkZXN0LmRpcn08L2VjaG8+CisgICAgPHByb3BlcnR5IG5hbWU9Im0yLmRlc3QuZGlyIiB2YWx1ZT0iJHtkZXN0LmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJtYWNyb3MiIGRlcGVuZHM9InBpY2stZGVzdCxnZXQtbTIiCisgICAgeG1sbnM6YXJ0aWZhY3Q9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCI+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0iZjIiPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9qZWN0IiAvPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcmNoaXZlIiBkZWZhdWx0PSJAe3Byb2plY3R9Ii8+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGZhaWw+CisgICAgICAgIFVua25vd24gYXJjaGl2ZSBAe2FyY2hpdmV9IC1ubyBwcm9wZXJ0eSBAe2FyY2hpdmV9LnZlcnNpb24gZGVmaW5lZC4KKyAgICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iQHthcmNoaXZlfS52ZXJzaW9uIi8+CisgICAgICAgICAgICA8L25vdD4KKyAgICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgICAgPC9mYWlsPgorICAgICAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIHBhdGhJRD0iQHthcmNoaXZlfS5wYXRoIj4KKyAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElEPSJAe3Byb2plY3R9IgorICAgICAgICAgICAgYXJ0aWZhY3RJRD0iQHthcmNoaXZlfSIKKyAgICAgICAgICAgIHZlcnNpb249IiR7QHthcmNoaXZlfS52ZXJzaW9ufSIvPgorICAgICAgICA8L2FydGlmYWN0OmRlcGVuZGVuY2llcz4KKyAgICAgICAgPCEtLSBub3cgd2UgYXJlIGxlZnQgd2l0aCB0aGUgcHJvYmxlbSBvZiBnZXR0aW5nIHRoZSBmaWxlcworICAgICAgICAgICAgIGludG8gb3VyIGRpcmVjdG9yeSAtLT4KKyAgICAgICAgPGNvcHlwYXRoIGRlc3RkaXI9IiR7ZGVzdC5kaXJ9IiBwYXRocmVmPSJAe2FyY2hpdmV9LnBhdGgiPgorICAgICAgICAgIDxmbGF0dGVubWFwcGVyLz4KKyAgICAgICAgPC9jb3B5cGF0aD4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICA8L3RhcmdldD4KKworCisKKyAgPCEtLSBhbnkgaW5pdCBzdHVmZiAtLT4KKyAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJtYWNyb3MiIC8+CisKKworICA8dGFyZ2V0IG5hbWU9ImRpYWciIGRlcGVuZHM9ImluaXQiPgorICAgIDxlY2hvcHJvcGVydGllcyAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImxvZ2dpbmciCisgICAgZGVzY3JpcHRpb249ImxvYWQgbG9nZ2luZyBsaWJyYXJpZXMiCisgICAgZGVwZW5kcz0iaW5pdCI+CisgICAgPGYyIHByb2plY3Q9ImxvZzRqIiAvPgorICAgIDxmMiBwcm9qZWN0PSJjb21tb25zLWxvZ2dpbmciIGFyY2hpdmU9ImNvbW1vbnMtbG9nZ2luZy1hcGkiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ianVuaXQiCisgICAgZGVzY3JpcHRpb249ImxvYWQganVuaXQgbGlicmFyaWVzIgorICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxmMiBwcm9qZWN0PSJqdW5pdCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ4bWwiCisgICAgZGVzY3JpcHRpb249ImxvYWQgZnVsbCBYTUwgbGlicmFyaWVzICh4YWxhbiwgcmVzb2x2ZXIpIgorICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxmMiBwcm9qZWN0PSJ4YWxhbiIgLz4KKyAgICA8ZjIgcHJvamVjdD0ieG1sLXJlc29sdmVyIiAvPgorICA8L3RhcmdldD4KKworICA8IS0tCisgICBUaGlzIGlzIG5vdCB1c2VkIGFzCisgICB3ZSBsaWtlIHRvIGdldCB0aGUgbW9yZSByZWNlbnQgYXJ0aWZhY3RzIHRoYW4gYXJlIGluIHRoZSByZXBvIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcgKDIwMDYtMTItMjEpCisgICAtLT4KKworICA8dGFyZ2V0IG5hbWU9InhlcmNlcyIKKyAgICAgIGRlc2NyaXB0aW9uPSJsb2FkIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiBYZXJjZXMiCisgICAgICBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZjIgcHJvamVjdD0ieGVyY2VzIiBhcmNoaXZlPSJ4ZXJjZXNJbXBsIi8+CisgICAgPGYyIHByb2plY3Q9InhlcmNlcyIgYXJjaGl2ZT0ieG1sLWFwaXMiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibmV0d29ya2luZyIKKyAgICBkZXNjcmlwdGlvbj0ibG9hZCBuZXR3b3JraW5nIGxpYnJhcmllcyAoY29tbW9ucy1uZXQ7IGpzY2gpIgorICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxmMiBwcm9qZWN0PSJjb21tb25zLW5ldCIgLz4KKyAgICA8ZjIgcHJvamVjdD0iY29tLmpjcmFmdCIgYXJjaGl2ZT0ianNjaCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlZ2V4cCIKKyAgICBkZXNjcmlwdGlvbj0ibG9hZCByZWdleHAgbGlicmFyaWVzIgorICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxmMiBwcm9qZWN0PSJyZWdleHAiIC8+CisgICAgPGYyIHByb2plY3Q9Im9ybyIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbnRsciIKKyAgICBkZXNjcmlwdGlvbj0ibG9hZCBhbnRsciBsaWJyYXJpZXMiCisgICAgZGVwZW5kcz0iaW5pdCI+CisgICAgPGYyIHByb2plY3Q9ImFudGxyIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImJjZWwiCisgICAgZGVzY3JpcHRpb249ImxvYWQgYmNlbCBsaWJyYXJpZXMiCisgICAgZGVwZW5kcz0iaW5pdCI+CisgICAgPGYyIHByb2plY3Q9ImJjZWwiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iamRlcGVuZCIKKyAgICBkZXNjcmlwdGlvbj0ibG9hZCBqZGVwZW5kIGxpYnJhcmllcyIKKyAgICBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZjIgcHJvamVjdD0iamRlcGVuZCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJic2YiCisgICAgZGVzY3JpcHRpb249ImxvYWQgYnNmIGxpYnJhcmllcyIKKyAgICBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZjIgcHJvamVjdD0iYnNmIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImpydWJ5IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJsb2FkIGpydWJ5IgorICAgICAgICAgIGRlcGVuZHM9ImJzZiI+CisgICAgPGYyIHByb2plY3Q9Im9yZy5qcnVieSIgYXJjaGl2ZT0ianJ1YnkiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJiZWFuc2hlbGwiCisgICAgICAgICAgZGVzY3JpcHRpb249ImxvYWQgYmVhbnNoZWxsIHN1cHBvcnQiCisgICAgICAgICAgZGVwZW5kcz0iYnNmIj4KKyAgICA8ZjIgcHJvamVjdD0ib3JnLmJlYW5zaGVsbCIgYXJjaGl2ZT0iYnNoIi8+CisgICAgPGYyIHByb2plY3Q9Im9yZy5iZWFuc2hlbGwiIGFyY2hpdmU9ImJzaC1jb3JlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ianl0aG9uIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJsb2FkIGp5dGhvbiIKKyAgICAgICAgICBkZXBlbmRzPSJic2YiPgorICAgIDxmMiBwcm9qZWN0PSJqeXRob24iIGFyY2hpdmU9Imp5dGhvbiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJoaW5vIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJsb2FkIHJoaW5vIgorICAgICAgICAgIGRlcGVuZHM9ImJzZiI+CisgICAgPGYyIHByb2plY3Q9InJoaW5vIiBhcmNoaXZlPSJqcyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNjcmlwdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibG9hZCBzY3JpcHQgbGFuZ3VhZ2VzIgorICAgICAgICAgIGRlcGVuZHM9ImJzZixqcnVieSxqeXRob24sYmVhbnNoZWxsLHJoaW5vIi8+CisKKyAgPHRhcmdldCBuYW1lPSJkZWJ1Z2dpbmciCisgICAgZGVzY3JpcHRpb249ImludGVybmFsIGFudCBkZWJ1Z2dpbmciCisgICAgZGVwZW5kcz0iaW5pdCI+CisgICAgPGYyIHByb2plY3Q9IndoaWNoIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImFsbCIKKyAgICBkZXNjcmlwdGlvbj0ibG9hZCBhbGwgdGhlIGxpYnJhcmllcyIKKyAgICBkZXBlbmRzPSJsb2dnaW5nLGp1bml0LHhtbCxuZXR3b3JraW5nLHJlZ2V4cCxhbnRscixiY2VsLGpkZXBlbmQsYnNmLGRlYnVnZ2luZyxzY3JpcHQiIC8+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2dldC1tMi54bWwgYi90cnVuay9nZXQtbTIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTFlODEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9nZXQtbTIueG1sCkBAIC0wLDAgKzEsMTIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKworPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgQnVpbGQgZmlsZSB0byBmZXRjaCBtYXZlbjIgdGFza3M7IGV4dHJhY3RlZCBmcm9tIChBbnQncykgZmV0Y2gueG1sCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLT4KKzxwcm9qZWN0IG5hbWU9ImdldC1tMiIgZGVmYXVsdD0iZ2V0LW0yIiBiYXNlZGlyPSIuIj4KKworPGRlc2NyaXB0aW9uPgorICBUaGlzIGJ1aWxkIGZpbGUgZG93bmxvYWRzIHRoZSBNYXZlbjIgQW50IHRhc2tzLAorICBhbmQgaW5zdGFsbHMgdGhlbSBpbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBtMi5kZXN0LmRpciBwcm9wZXJ0eS4KKworICBZb3UgbWF5IG5lZWQgdG8gc2V0IHByb3h5IHNldHRpbmdzLiBPbiBKYXZhMS41LCBBbnQgdHJpZXMgdG8gZ2V0CisgIHRoaXMgZnJvbSB0aGUgT1MsIHVubGVzcyB5b3UgdXNlIHRoZSAtbm9wcm94eSBvcHRpb24uCisKKyAgUHJveGllcyBjYW4gYmUgY29uZmlndXJlZCBtYW51YWxseSBzZXR0aW5nIHRoZSBKVk0gcHJveHkgdmFsdWVzIGluIHRoZQorICBBTlRfT1BUUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICBGb3IgZXhhbXBsZSwgdG8gc2V0IHRoZSBwcm94eSB1cCBpbiB0aGUgdGNzaCBzaGVsbCwgdGhlIGNvbW1hbmQgd291bGQgYmUKKyAgc29tZXRoaW5nIGxpa2U6CisKKyAgRm9yIGNzaC90Y3NoOgorICAgIHNldGVudiBBTlRfT1BUUyAiLURodHRwLnByb3h5SG9zdD1wcm94eSAtRGh0dHAucHJveHlQb3J0PTgwODAiCisgIEZvciBiYXNoOgorICAgIGV4cG9ydCBBTlRfT1BUUz0iLURodHRwLnByb3h5SG9zdD1wcm94eSAtRGh0dHAucHJveHlQb3J0PTgwODAiCisgIEZvciBXaW5kb3dzLCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSBhcHByb3ByaWF0ZSBkaWFsb2cgYm94CisgIGFuZCBvcGVuIGEgbmV3IGNvbnNvbGUuIG9yLCBieSBoYW5kCisgICAgc2V0IEFOVF9PUFRTID0gLURodHRwLnByb3h5SG9zdD1wcm94eSAtRGh0dHAucHJveHlQb3J0PTgwODAKKzwvZGVzY3JpcHRpb24+CisKKyAgPHByb3BlcnR5IGZpbGU9ImdldC1tMi5wcm9wZXJ0aWVzIiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJtMi5hbnRsaWIucmVzb3VyY2UiCisgICAgICAgICAgICB2YWx1ZT0ib3JnL2FwYWNoZS9tYXZlbi9hcnRpZmFjdC9hbnQvYW50bGliLnhtbCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0ibTIuYW50bGliLnVyaSIKKyAgICAgICAgICAgIHZhbHVlPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIC8+CisKKyAgPG1hY3JvZGVmIG5hbWU9InJlcXVpcmUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIC8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZmFpbCB1bmxlc3M9IkB7cHJvcGVydHl9Ij4kJHtAe3Byb3BlcnR5fX0gbm90IHNwZWNpZmllZDwvZmFpbD4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHRhcmdldCBuYW1lPSJwcm9iZS1tMiI+CisgICAgPHJlcXVpcmUgcHJvcGVydHk9Im0yLmRlc3QuZGlyIiAvPgorICAgIDxyZXF1aXJlIHByb3BlcnR5PSJtMi5qYXIubmFtZSIgLz4KKworICAgIDwhLS0gTG9vayBmb3IgTTIgYW50IHRhc2tzIGluIG91ciBjbGFzc3BhdGgtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0ibTIuYXJ0aWZhY3QiIGxvY2F0aW9uPSIke20yLmRlc3QuZGlyfS8ke20yLmphci5uYW1lfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJtMi5hbnRsaWIuZm91bmQiIHJlc291cmNlPSIke20yLmFudGxpYi5yZXNvdXJjZX0iIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibTIuYW50bGliLnR5cGVmb3VuZCI+CisgICAgICA8dHlwZWZvdW5kIG5hbWU9IiR7bTIuYW50bGliLnVyaX06YXJ0aWZhY3QiIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibTIuYXJ0aWZhY3QuZm91bmQiIGZpbGU9IiR7bTIuYXJ0aWZhY3R9IiB0eXBlPSJmaWxlIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvd25sb2FkLW0yIiBkZXBlbmRzPSJwcm9iZS1tMiIgdW5sZXNzPSJtMi5hcnRpZmFjdC5mb3VuZCI+CisgICAgPHJlcXVpcmUgcHJvcGVydHk9Im0yLmFudGxpYi51cmwiIC8+CisgICAgPGVjaG8+RG93bmxvYWRpbmcgdG8gJHttMi5kZXN0LmRpcn08L2VjaG8+CisKKyAgICA8bWtkaXIgZGlyPSIke20yLmRlc3QuZGlyfSIgLz4KKyAgICA8IS0tIGZldGNoIE0yIGFudCB0YXNrcyBpbnRvIG91ciByZXBvc2l0b3J5LCBpZiBpdCBpcyBub3QgdGhlcmUtLT4KKyAgICA8Z2V0IHNyYz0iJHttMi5hbnRsaWIudXJsfSIKKyAgICAgIGRlc3Q9IiR7bTIuYXJ0aWZhY3R9IgorICAgICAgdmVyYm9zZT0idHJ1ZSIKKyAgICAgIHVzZXRpbWVzdGFtcD0iZmFsc2UiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZG9udC12YWxpZGF0ZS1tMi1jaGVja3N1bSIgZGVwZW5kcz0icHJvYmUtbTIiCisgICAgICAgICAgaWY9Im0yLmFydGlmYWN0LmZvdW5kIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdW0uZXF1YWwiIHZhbHVlPSJ0cnVlIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlLW0yLWNoZWNrc3VtIgorICAgICAgICAgIGRlcGVuZHM9ImRvd25sb2FkLW0yLGRvbnQtdmFsaWRhdGUtbTItY2hlY2tzdW0iCisgICAgICAgICAgaWY9Im0yLnNoYTEuY2hlY2tzdW0iIHVubGVzcz0ibTIuYXJ0aWZhY3QuZm91bmQiPgorICAgIDxjaGVja3N1bSBmaWxlPSIke20yLmFydGlmYWN0fSIKKyAgICAgICAgYWxnb3JpdGhtPSJTSEEiCisgICAgICAgIHByb3BlcnR5PSIke20yLnNoYTEuY2hlY2tzdW19IgorICAgICAgICB2ZXJpZnlQcm9wZXJ0eT0iY2hlY2tzdW0uZXF1YWwiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2hlY2tzdW0tbWlzbWF0Y2giIGRlcGVuZHM9InZhbGlkYXRlLW0yLWNoZWNrc3VtIgorICAgICAgICAgIGlmPSJtMi5zaGExLmNoZWNrc3VtIiB1bmxlc3M9ImNoZWNrc3VtLmVxdWFsIj4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7bTIuYXJ0aWZhY3R9IiAvPgorICAgIDxmYWlsPgorICAgICAgRmFpbGVkIHRvIHZlcmlmeSB0aGUgZG93bmxvYWRlZCBmaWxlICR7bTIuYW50bGliLnVybH0iIGFnYWluc3QgdGhlIGNoZWNrc3VtCisgICAgICBjb2RlZCBpbnRvIGxpYnJhcmllcy5wcm9wZXJ0aWVzLgorICAgICAgVGhlIGxvY2FsIGNvcHkgaGFzIGJlZW4gZGVsZXRlZCwgZm9yIHNlY3VyaXR5IHJlYXNvbnMKKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2hlY2tzdW0tbWF0Y2giIGRlcGVuZHM9ImNoZWNrc3VtLW1pc21hdGNoIgorICAgICAgICAgIHVubGVzcz0ibTIuYW50bGliLmZvdW5kIj4KKyAgICA8dGFza2RlZiBjbGFzc3BhdGg9IiR7bTIuYXJ0aWZhY3R9IiByZXNvdXJjZT0iJHttMi5hbnRsaWIucmVzb3VyY2V9IgorICAgICAgICAgICAgIHVyaT0iJHttMi5hbnRsaWIudXJpfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZXQtbTIiIGRlcGVuZHM9ImNoZWNrc3VtLW1hdGNoIgorICAgICAgZGVzY3JpcHRpb249IkRvd25sb2FkIHRoZSBNYXZlbjIgQW50IHRhc2tzIiAvPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9saWIvUkVBRE1FIGIvdHJ1bmsvbGliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWJlMDMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvbGliL1JFQURNRQpAQCAtMCwwICsxLDE2IEBACitQbGVhc2UgcmVmZXIgdG8gdGhlIEFudCBtYW51YWwgdW5kZXIgSW5zdGFsbGluZyBBbnQgLyBMaWJyYXJ5CitEZXBlbmRlbmNpZXMgZm9yIGEgbGlzdCBvZiB0aGUgamFyIHJlcXVpcmVtZW50cyBmb3IgdmFyaW91cyBvcHRpb25hbAordGFza3MgYW5kIGZlYXR1cmVzLgorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB4ZXJjZXNJbXBsLmphciBmcm9tIHRoZSAyLjkuMCByZWxlYXNlIG9mCitBcGFjaGUgWGVyY2VzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb3IgbmV3ZXIgcmVsZWFzZXMgc2VlCis8aHR0cDovL3hlcmNlcy5hcGFjaGUub3JnL3hlcmNlczItai8+LiAgWGVyY2VzIGlzIHByb3ZpZGVkIHVuZGVyIHRoZQorc2FtZSBsaWNlbnNlIGFzIEFwYWNoZSBBbnQgaXRzZWxmLCBzZWUgdGhlIGZpbGUgTElDRU5TRS50eHQuICBGb3IKK2FkZGl0aW9uYWwgWGVyY2VzIHNwZWNpZmljIG5vdGVzIHNlZSB0aGUgZmlsZSBOT1RJQ0UueGVyY2VzLgorCitJdCBhbHNvIGNvbnRhaW5zIHhtbC1hcGlzLmphciwgYW4gQXBhY2hlLWNvbnRyb2xsZWQgY29sbGVjdGlvbiBvZgorc3RhbmRhcmQgY2xhc3NlcyBmcm9tIHRoZSAxLjMuMDQgcmVsZWFzZSBvZiB0aGUgQXBhY2hlIFhNTC1Db21tb25zCityZWxlYXNlLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb3IgbmV3ZXIgcmVsZWFzZXMgc2VlCis8aHR0cDovL3htbC5hcGFjaGUub3JnL2NvbW1vbnMvPi4gIFNlZSB0aGUgZmlsZXMgTElDRU5TRS5kb20gYW5kCitMSUNFTlNFLnNheCBmb3IgdGhlIHRlcm1zIG9mIGRpc3RyaWJ1dGlvbi4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvbGliL2xpYnJhcmllcy5wcm9wZXJ0aWVzIGIvdHJ1bmsvbGliL2xpYnJhcmllcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MWNjNDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9saWIvbGlicmFyaWVzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2MiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjdGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBsaWJyYXJpZXMgZm9yIHVzZSBpbiAKKyNhIGdpdmVuIHJlbGVhc2Ugb2YgdGhlIGNvbXBvbmVudHMKKworI2lmIHlvdSBjaGFuZ2UgdGhpcywgY2hhbmdlIHRoZSBjaGVja3N1bSB0byBtYXRjaAorbTIudmVyc2lvbj0yLjAuNAorbTIudXJsPWh0dHA6Ly9pYmlibGlvLm9yZy9tYXZlbjIvCittMi5hcnRpZmFjdC1uYW1lPW1hdmVuLWFydGlmYWN0LWFudAorbTIuamFyLm5hbWU9JHttMi5hcnRpZmFjdC1uYW1lfS0ke20yLnZlcnNpb259LWRlcC5qYXIKKyN0aGlzIGlzIHRoZSBVUkwgb2YgdGhlIGFudGxpYiBsaWJyYXJ5LCB0aGF0IGlzIHB1bGxlZCBkb3duIGZvciBldmVyeXRoaW5nIGVsc2UuCittMi5hbnRsaWIudXJsPSR7bTIudXJsfS9vcmcvYXBhY2hlL21hdmVuLyR7bTIuYXJ0aWZhY3QtbmFtZX0vJHttMi52ZXJzaW9ufS8ke20yLmphci5uYW1lfQorI3RoaXMgaXMgdGhlIHNoYTEgY2hlY2tzdW0gb2YgdGhlIGFydGlmYWN0CittMi5zaGExLmNoZWNrc3VtPTRlN2RkZmRiOTE2MDBlOWI1OWJiOTY1ZmY4ZWVmMmYwNjAxNWRmNTAKKworCisjdmVyc2lvbnMgb2YgZGlmZmVyZW50IGxpYnJhcmllcy4gUGxlYXNlIGtlZXAgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBleGNlcHQKKyN3aGVuIGEgc3BlY2lmaWMgZGVwZW5kZW5jeSBmb3JjZXMgdGhlbSB0byBiZSBvdXQtb2Ytb3JkZXIKK2FudGxyLnZlcnNpb249Mi43LjIKK2JjZWwudmVyc2lvbj01LjEKK2JzZi52ZXJzaW9uPTIuNC4wCitic2gudmVyc2lvbj0yLjBiNAorYnNoLWNvcmUudmVyc2lvbj0ke2JzaC52ZXJzaW9ufQorY29tbW9ucy1uZXQudmVyc2lvbj0xLjQuMAorY29tbW9ucy1sb2dnaW5nLnZlcnNpb249MS4wLjQKK2NvbW1vbnMtbG9nZ2luZy1hcGkudmVyc2lvbj0ke2NvbW1vbnMtbG9nZ2luZy52ZXJzaW9ufQoramRlcGVuZC52ZXJzaW9uPTIuNworanJ1YnkudmVyc2lvbj0wLjguMworanVuaXQudmVyc2lvbj0zLjguMgoranNjaC52ZXJzaW9uPTAuMS4yOQoranl0aG9uLnZlcnNpb249Mi4xCitsb2c0ai52ZXJzaW9uPTEuMi4xMworI2pzIGlzIHRoZSBqYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSByaGlubyBwcm9qZWN0Citqcy52ZXJzaW9uPTEuNlIzCitvcm8udmVyc2lvbj0yLjAuOAorcmVnZXhwLnZlcnNpb249MS4zCit3aGljaC52ZXJzaW9uPTEuMAoreGVyY2VzLnZlcnNpb249Mi45LjAKK3hlcmNlc0ltcGwudmVyc2lvbj0ke3hlcmNlcy52ZXJzaW9ufQorI3Nob3VsZCBiZSBpbiBzeW5jIHcvIHhlcmNlcywgYnV0IG5vdCBpbiB0aGUgbWF2ZW4gcmVwb3NpdG9yeQorI3htbFBhcnNlckFQSXMudmVyc2lvbj0ke3hlcmNlcy52ZXJzaW9ufQorI3htbFBhcnNlckFQSXMudmVyc2lvbj0yLjYuMQoreG1sLWFwaXMudmVyc2lvbj0xLjMuMDQKK3hhbGFuLnZlcnNpb249Mi43LjAKK3htbC1yZXNvbHZlci52ZXJzaW9uPTEuMQorCisjcGFpcmVkCitqYWNsLnZlcnNpb249MS4yLjYKK3RjbGphdmEudmVyc2lvbj0ke2phY2wudmVyc2lvbn0KZGlmZiAtLWdpdCBhL3RydW5rL2xpYi9vcHRpb25hbC9MSUNFTlNFLmp1bml0Lmh0bWwgYi90cnVuay9saWIvb3B0aW9uYWwvTElDRU5TRS5qdW5pdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkN2UxYjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9saWIvb3B0aW9uYWwvTElDRU5TRS5qdW5pdC5odG1sCkBAIC0wLDAgKzEsMjU5IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD48aGVhZD48dGl0bGU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L3RpdGxlPg0KKw0KKw0KKw0KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIiB2bGluaz0iIzgwMDAwMCI+DQorDQorDQorPHAgYWxpZ249ImNlbnRlciI+PGI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+DQorPC9wPjxwPjxiPjwvYj48Zm9udCBzaXplPSIzIj48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjMiPjwvZm9udD48Zm9udCBzaXplPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMNCitQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4NCitBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTDQorUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PGI+MS4gIERFRklOSVRJT05TPC9iPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9mb250Pg0KKw0KKzwvcD48dWw+PGZvbnQgc2l6ZT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj0ibGVmdCI+DQorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvZm9udD48L3VsPg0KKw0KKw0KKzx1bD48Zm9udCBzaXplPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvZm9udD48L3VsPg0KKw0KKw0KKzx1bD48Zm9udCBzaXplPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2ZvbnQ+PC91bD4NCisNCisNCis8dWw+PGZvbnQgc2l6ZT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+QQ0KK0NvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUNCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaA0KK0NvbnRyaWJ1dG9yJ3MgYmVoYWxmLiA8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QNCitpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mDQorc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24NCitsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L2ZvbnQ+PC91bD4NCisNCis8cD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPjwvZm9udD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCitieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mDQoraXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pjxmb250IHNpemU9IjIiPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pjxmb250IHNpemU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PGI+PC9iPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PGI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvYj48L2ZvbnQ+DQorDQorPC9wPjx1bD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+YSkJPC9mb250Pjxmb250IHNpemU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9mb250Pjxmb250IGNvbG9yPSIjZmYwMDAwIiBzaXplPSIyIj4gPC9mb250Pjxmb250IHNpemU9IjIiPnJlcHJvZHVjZSwNCitwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sDQorZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwNCithbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L2ZvbnQ+PC91bD4NCisNCisNCis8dWw+PGZvbnQgc2l6ZT0iMiI+PC9mb250PjwvdWw+DQorDQorDQorPHVsPjxmb250IHNpemU9IjIiPjwvZm9udD48Zm9udCBzaXplPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvZm9udD48Zm9udCBjb2xvcj0iIzAwODAwMCIgc2l6ZT0iMiI+IDwvZm9udD48Zm9udCBzaXplPSIyIj5yb3lhbHR5LWZyZWUNCitwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8NCitzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gNCitDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQNCitsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUNCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwNCitzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZA0KK2J5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueQ0KK290aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZQ0KK2lzIGxpY2Vuc2VkIGhlcmV1bmRlci4gPC9mb250PjwvdWw+DQorDQorDQorPHVsPjxmb250IHNpemU9IjIiPjwvZm9udD48L3VsPg0KKw0KKw0KKzx1bD48Zm9udCBzaXplPSIyIj5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoDQorQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLA0KK25vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90DQoraW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlcg0KK2VudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yDQorY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YNCitpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZw0KK3RoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkNCithc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkNCityaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzDQorcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzDQorUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZw0KK3RoZSBQcm9ncmFtLjwvZm9udD48L3VsPg0KKw0KKw0KKzx1bD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+PC91bD4NCisNCisNCis8dWw+PGZvbnQgc2l6ZT0iMiI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZQ0KK2l0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0bw0KK2dyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvZm9udD48L3VsPg0KKw0KKw0KKzx1bD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+PC91bD4NCisNCis8cD48Zm9udCBzaXplPSIyIj48Yj4zLiAgUkVRVUlSRU1FTlRTPC9iPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PGI+PC9iPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L2ZvbnQ+DQorDQorPC9wPjx1bD48Zm9udCBzaXplPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9mb250PjwvdWw+DQorDQorDQorPHVsPjxmb250IHNpemU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L2ZvbnQ+PC91bD4NCisNCisNCis8dWw+PGZvbnQgc2l6ZT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9mb250Pjxmb250IHNpemU9IjIiPiBvbg0KK2JlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZA0KK2ltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kDQorbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mDQorbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9mb250PjwvdWw+DQorDQorDQorPHVsPjxmb250IHNpemU9IjIiPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsDQorQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LA0KK3NwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvZm9udD48L3VsPg0KKw0KKw0KKzx1bD48Zm9udCBzaXplPSIyIj5paWkpPC9mb250Pjxmb250IHNpemU9IjIiPiBzdGF0ZXMgdGhhdCBhbnkNCitwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQNCitDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9mb250PjwvdWw+DQorDQorDQorPHVsPjxmb250IHNpemU9IjIiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMNCithdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdA0KK2luIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvcg0KK3NvZnR3YXJlIGV4Y2hhbmdlLjwvZm9udD48Zm9udCBjb2xvcj0iIzAwMDBmZiIgc2l6ZT0iMiI+IDwvZm9udD48Zm9udCBjb2xvcj0iI2ZmMDAwMCIgc2l6ZT0iMiI+PC9mb250PjwvdWw+DQorDQorDQorPHVsPjxmb250IGNvbG9yPSIjZmYwMDAwIiBzaXplPSIyIj48L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+PC9mb250PjwvdWw+DQorDQorPHA+PGZvbnQgc2l6ZT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvZm9udD4NCisNCis8L3A+PHVsPjxmb250IHNpemU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L2ZvbnQ+PC91bD4NCisNCisNCis8dWw+PGZvbnQgc2l6ZT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L2ZvbnQ+PC91bD4NCisNCis8cD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+PGZvbnQgY29sb3I9IiMwMDAwZmYiIHNpemU9IjIiPjxzdHJpa2U+PC9zdHJpa2U+PC9mb250Pg0KKzwvcD48cD48Zm9udCBjb2xvcj0iIzAwMDBmZiIgc2l6ZT0iMiI+PHN0cmlrZT48L3N0cmlrZT48L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlDQorb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseQ0KK2FsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlDQorQ29udHJpYnV0aW9uLiA8L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PGI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdA0KK2NlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycw0KK2FuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlDQorY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0NCitpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcw0KK25vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGENCitDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaA0KK0NvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZA0KK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdA0KK2FueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbQ0KK2NsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5DQorYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3INCitvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMNCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQ0KK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMNCityZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4NCitJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseQ0KK25vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKQ0KK2FsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUNCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudA0KK25lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaA0KK2NsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUNCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3INCitpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4NCittYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLA0KK3Rob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsDQorQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbA0KK0NvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMNCityZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQNCityZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUNCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+PGZvbnQgY29sb3I9IiMwMDAwZmYiIHNpemU9IjIiPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgY29sb3I9IiMwMDAwZmYiIHNpemU9IjIiPjwvZm9udD48Zm9udCBzaXplPSIyIj48Yj41LiAgTk8gV0FSUkFOVFk8L2I+PC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwNCitUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1INCitDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVA0KK0xJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsDQorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvZm9udD48Zm9udCBzaXplPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9mb250Pjxmb250IHNpemU9IjIiPnRoZSBQcm9ncmFtPC9mb250Pjxmb250IHNpemU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+LA0KK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywNCitjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+LiAgPC9mb250Pjxmb250IHNpemU9IjIiPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+PGI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pjxmb250IHNpemU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUDQorRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMDQorSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwNCitFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+DQorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULA0KK1NUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORw0KK0lOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRQ0KK0VYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUNCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj48Yj43LiAgR0VORVJBTDwvYj48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPjwvZm9udD48Zm9udCBzaXplPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMNCitBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbA0KK25vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zDQorb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywNCitzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvDQorbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QNCithIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlDQorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQNCitsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcw0KK0FncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbg0KK2FkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkNCisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdA0KK3RoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyDQorc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoDQorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUNCitkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9mb250Pjxmb250IHNpemU9IjIiPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsDQordGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3INCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhDQorcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuDQorSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudA0KK2FncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzDQorcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcw0KK0FncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtDQorc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvZm9udD48Zm9udCBzaXplPSIyIj48L2ZvbnQ+DQorPC9wPjxwPjxmb250IHNpemU9IjIiPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pjxmb250IHNpemU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0bw0KK2NvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQNCitpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluDQordGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9mb250Pjxmb250IHNpemU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9mb250Pjxmb250IHNpemU9IjIiPnRpbWUuDQorTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMNCitBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gSUJNIG1heSBhc3NpZ24gdGhlDQorcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUNCitlbnRpdHkuIDwvZm9udD48Zm9udCBzaXplPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbA0KK2JlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcNCitDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlDQorQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24NCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlDQorUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvZm9udD48Zm9udCBzaXplPSIyIj52ZXJzaW9uLiAgPC9mb250Pjxmb250IHNpemU9IjIiPkV4Y2VwdA0KK2FzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzDQorbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yDQordW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L2ZvbnQ+PGZvbnQgc2l6ZT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvZm9udD48Zm9udCBzaXplPSIyIj4uPC9mb250Pjxmb250IHNpemU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pg0KKzwvcD48cD48Zm9udCBzaXplPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUNCitTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQNCitTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbg0KK3VuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uDQorYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcNCitsaXRpZ2F0aW9uLjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pjxmb250IHNpemU9IjIiPjwvZm9udD4NCis8L3A+PHA+PGZvbnQgc2l6ZT0iMiI+PC9mb250Pg0KKw0KKzwvcD48L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi9vcHRpb25hbC9SRUFETUUgYi90cnVuay9saWIvb3B0aW9uYWwvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDEyNjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9saWIvb3B0aW9uYWwvUkVBRE1FCkBAIC0wLDAgKzEsMyBAQAorVGhlIGZpbGUganVuaXQtMy44LjIuamFyIGlzIHZlcnNpb24gMy44LjIgb2YgSlVuaXQsIHNlZSB0aGUgZmlsZSBMSUNFTlNFLmp1bml0Citmb3IgdGhlIHRlcm1zIG9mIGRpc3RyaWJ1dGlvbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEpVbml0IG9yCit0aGUgbGF0ZXN0IHJlbGVhc2UsIHNlZSA8aHR0cDovL3d3dy5qdW5pdC5vcmcvPi4KZGlmZiAtLWdpdCBhL3RydW5rL2xpYi9vcHRpb25hbC9hbnQtYW50dW5pdC0xLjAuamFyIGIvdHJ1bmsvbGliL29wdGlvbmFsL2FudC1hbnR1bml0LTEuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlMmZiYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL2xpYi9vcHRpb25hbC9hbnQtYW50dW5pdC0xLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi9vcHRpb25hbC9qdW5pdC0zLjguMi5qYXIgYi90cnVuay9saWIvb3B0aW9uYWwvanVuaXQtMy44LjIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjcxMWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9saWIvb3B0aW9uYWwvanVuaXQtMy44LjIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi94ZXJjZXNJbXBsLmphciBiL3RydW5rL2xpYi94ZXJjZXNJbXBsLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE0YzJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvbGliL3hlcmNlc0ltcGwuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2xpYi94bWwtYXBpcy5qYXIgYi90cnVuay9saWIveG1sLWFwaXMuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MmMwZWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9saWIveG1sLWFwaXMuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3BhdGNoLnhtbCBiL3RydW5rL3BhdGNoLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdmOGJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcGF0Y2gueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBVc2UgQXBhY2hlIEFudCB0byBnZW5lcmF0ZSBhIHBhdGNoIGZpbGUgZm9yIEFwYWNoZSBBbnQuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLT4KKzxwcm9qZWN0IG5hbWU9ImNyZWF0ZS1wYXRjaCIgZGVmYXVsdD0icGF0Y2hwYWNrYWdlIiBiYXNlZGlyPSIuIj4KKyAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXRjaC5wYWNrYWdlIiB2YWx1ZT0icGF0Y2gudGFyLmd6Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InBhdGNoLmZpbGUiIHZhbHVlPSJwYXRjaC50eHQiLz4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9InN2bi5mb3VuZCI+CisgICAgICAgIDxvcj4KKyAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0ic3ZuIiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iLz4KKyAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0ic3ZuLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9Ii8+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9InN2bi5leGUiIGZpbGVwYXRoPSIke2Vudi5QYXRofSIvPgorICAgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPHRhcmdldCBuYW1lPSJjcmVhdGVwYXRjaCI+CisgICAgICAgIDxmYWlsIHVubGVzcz0ic3ZuLmZvdW5kIgorICAgICAgICAgICAgICBtZXNzYWdlPSJZb3UgbmVlZCBhIHZlcnNpb24gb2Ygc3ZuIHRvIGNyZWF0ZSB0aGUgcGF0Y2giLz4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ic3ZuIiBvdXRwdXQ9IiR7cGF0Y2guZmlsZX0iPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iZGlmZiIvPgorICAgICAgICA8L2V4ZWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Im5ld2ZpbGVzIiBkZXBlbmRzPSJjcmVhdGVwYXRjaCI+CisgICAgICAgIDxkZWxldGUgZmlsZT0iJHtwYXRjaC5wYWNrYWdlfSIvPgorICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJzdm4iIG91dHB1dD0iJHtwYXRjaC5maWxlfS50bXAiPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3RhdHVzIi8+CisgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPHJlcGxhY2UgZmlsZT0iJHtwYXRjaC5maWxlfS50bXAiIHRva2VuPSI/ICAgICAgIiB2YWx1ZT0iIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InBhdGNocGFja2FnZSIgZGVwZW5kcz0ibmV3ZmlsZXMiPgorICAgICAgICA8dGFyIGJhc2VkaXI9IiR7YmFzZWRpcn0iCisgICAgICAgICAgICB0YXJmaWxlPSIke3BhdGNoLnBhY2thZ2V9IgorICAgICAgICAgICAgY29tcHJlc3Npb249Imd6aXAiCisgICAgICAgICAgICBpbmNsdWRlc2ZpbGU9IiR7cGF0Y2guZmlsZX0udG1wIgorICAgICAgICAgICAgZXhjbHVkZXM9IiR7cGF0Y2guZmlsZX0udG1wIi8+CisgICAgICAgIDxkZWxldGUgZmlsZT0iJHtwYXRjaC5maWxlfS50bXAiLz4KKyAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL2FudC1zaXRlL2FuYWtpYS9idWlsZC54bWwgYi90cnVuay9wcm9wb3NhbC9hbnQtc2l0ZS9hbmFraWEvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2E3MDIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9hbnQtc2l0ZS9hbmFraWEvYnVpbGQueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzxwcm9qZWN0IG5hbWU9ImJ1aWxkLXNpdGUiIGRlZmF1bHQ9ImRvY3MiIGJhc2VkaXI9Ii4iPgorCisgICAgPCEtLSBJbml0aWFsaXphdGlvbiBwcm9wZXJ0aWVzIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0Lm5hbWUiIHZhbHVlPSJhbnQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZG9jcy5zcmMiICAgICBsb2NhdGlvbj0ieGRvY3MiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZG9jcy5kZXN0IiAgICBsb2NhdGlvbj0iZG9jcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LmZpbGUiIHZhbHVlPSJzdHlsZXNoZWV0cy9wcm9qZWN0LnhtbCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2l0ZS5kaXIiICAgICBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vamFrYXJ0YS1zaXRlMiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVtcGwucGF0aCIgICBsb2NhdGlvbj0ieGRvY3Mvc3R5bGVzaGVldHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InZlbG9jaXR5LnByb3BzIiAgIGxvY2F0aW9uPSIke2RvY3Muc3JjfS92ZWxvY2l0eS5wcm9wZXJ0aWVzIiAvPgorCisgICAgPHBhdGggaWQ9ImFuYWtpYS5jbGFzc3BhdGgiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c2l0ZS5kaXJ9L2xpYiI+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9wYXRoPgorCisgICAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4gICAgCisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnZlbG9jaXR5LmFuYWtpYS5BbmFraWFUYXNrIiAKKyAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0iQW5ha2lhVGFzay5wcmVzZW50Ij4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImFuYWtpYS5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hdmFpbGFibGU+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IGRlcGVuZHM9InByZXBhcmUiIG5hbWU9InByZXBhcmUtZXJyb3IiIHVubGVzcz0iQW5ha2lhVGFzay5wcmVzZW50Ij4KKyAgICAgICAgPGVjaG8+CisgICAgICAgICAgICBBbmFraWFUYXNrIGlzIG5vdCBwcmVzZW50ISBQbGVhc2UgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgCisgICAgICAgICAgICB2ZWxvY2l0eS5qYXIgaXMgaW4geW91ciBjbGFzc3BhdGguCisgICAgICAgIDwvZWNobz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG9jcyIgZGVwZW5kcz0icHJlcGFyZS1lcnJvciIgaWY9IkFuYWtpYVRhc2sucHJlc2VudCI+CisgICAgICAgIDx0YXNrZGVmIG5hbWU9ImFuYWtpYSIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnZlbG9jaXR5LmFuYWtpYS5BbmFraWFUYXNrIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImFuYWtpYS5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC90YXNrZGVmPgorICAgICAgICAKKyAgICAgICAgPGFuYWtpYSBiYXNlZGlyPSIke2RvY3Muc3JjfSIgZGVzdGRpcj0iJHtkb2NzLmRlc3R9LyIKKyAgICAgICAgICAgICBleHRlbnNpb249Ii5odG1sIiBzdHlsZT0iLi9zaXRlLnZzbCIKKyAgICAgICAgICAgICBwcm9qZWN0RmlsZT0iJHtwcm9qZWN0LmZpbGV9IgorICAgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9zdHlsZXNoZWV0cy8qKiIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iKiovKi54bWwiCisgICAgICAgICAgICAgbGFzdE1vZGlmaWVkQ2hlY2s9InRydWUiCisgICAgICAgICAgICAgdGVtcGxhdGVQYXRoPSIke3RlbXBsLnBhdGh9IgorICAgICAgICAgICAgIHZlbG9jaXR5UHJvcGVydGllc0ZpbGU9IiR7dmVsb2NpdHkucHJvcHN9Ij4KKyAgICAgICAgPC9hbmFraWE+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJqYXZhZG9jcyI+CisgICAgICA8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgdGFyZ2V0PSJkaXN0X2phdmFkb2NzIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRpc3QuamF2YWRvY3MiIHZhbHVlPSIke2RvY3MuZGVzdH0vbWFudWFsL2FwaSIgLz4KKyAgICAgIDwvYW50PgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJkb2NzLCBqYXZhZG9jcyIvPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvYW50LXNpdGUvZm9ycmVzdC9hbmFraWEyZm9ycmVzdC54c2wgYi90cnVuay9wcm9wb3NhbC9hbnQtc2l0ZS9mb3JyZXN0L2FuYWtpYTJmb3JyZXN0LnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRjZWFkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvYW50LXNpdGUvZm9ycmVzdC9hbmFraWEyZm9ycmVzdC54c2wKQEAgLTAsMCArMSwxMzQgQEAKKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KKzwhLS0KKworICBBIGxpdHRsZSBiaXQgb2YgYXV0b21hdGVkIHRyYW5zZm9ybWF0aW9uIHRvIGhlbHAgY29udmVyc2lvbgorICBmcm9tIEFuYWtpYSB0byBGb3JyZXN0L0NvY29vbiBkb2NzLgorICAKKyAgVGhpcyBpcyBwdXJlbHkgZXhwZXJpbWVudGFsLCBpdCBoZW0uLi5zaG91bGQgd29yaywgd2VsbCBtb3N0bHkKKyAgYnV0IGl0IHNob3VsZCBtYW5hZ2UgdG8gYnJlYWsgYSBjb3VwbGUgb2YgdGhpbmdzIHNvIHlvdSB3aWxsCisgIG5lZWQgYSBtYW51YWwgcGFzcyB0byBmaXggdGhpbmdzIGFmdGVyIHRoYXQuCisgIAorICBTdGVwaGFuZSBCYWlsbGlleiwgc2JhaWxsaWV6QGFwYWNoZS5vcmcKKyAgCisgIC0tPgorICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiIGRvY3R5cGUtc3lzdGVtPSJkb2N1bWVudC12MTEuZHRkIgorICBkb2N0eXBlLXB1YmxpYz0iLS8vQVBBQ0hFLy9EVEQgRG9jdW1lbnRhdGlvbiBWMS4xLy9FTiIgZW5jb2Rpbmc9IklTTy04ODU5LTEiLz4KKworICA8IS0tIHByb3BlcnRpZXMgPSBoZWFkZXIgaW4gRm9ycmVzdCBsYW5ndWFnZSAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvcGVydGllcyI+CisgICAgPGhlYWRlcj4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iKlsgbG9jYWwtbmFtZSgpICE9ICdhdXRob3InXSIvPgorICAgICAgPGF1dGhvcj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJhdXRob3IiLz4KKyAgICAgIDwvYXV0aG9yPgorICAgIDwvaGVhZGVyPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJhdXRob3IiPgorICAgIDxwZXJzb24gaWQ9Int0ZXh0KCl9Ij4KKyAgICAgIDwhLS0KKyAgICAgIG5vdCBldmVyeW9uZSBnaXZlcyBoaXMgbWFpbCBpbiBvcmRlciBub3QgdG8gcmVjZWl2ZSB0b28gbXVjaCBzcGFtLi4uIG9yIGJlCisgICAgICBhc3NpbWlsYXRlZCBhcyAyNC8yNCA3Lzcgc3VwcG9ydAorICAgICAgLS0+CisgICAgICA8eHNsOmlmIHRlc3Q9IkBlbWFpbCI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iZW1haWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZW1haWwiLz48L3hzbDphdHRyaWJ1dGU+PC94c2w6aWY+CisgICAgPC9wZXJzb24+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gc2VjdGlvbiA9IHN1YnNlY3Rpb24gd2l0aCBmb3JyZXN0IGFuZCB0aGUgdGl0bGUgaXMgYW4gZWxlbWVudCAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2VjdGlvbnxzdWJzZWN0aW9uIj4KKyAgICA8c2VjdGlvbj4KKyAgICAgIDx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3RpdGxlPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICAgIDwvc2VjdGlvbj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBJZ25vcmUgdGhvc2UgdGFncyB0aGV5IHNob3VsZCBub3QgYmUgaGVyZSwgdGhpcyB3aWxsIGNsZWFuIHVwCisgIHNvbWUgYnV0IHdpbGwgYnJlYWsgb3RoZXJzLCBhbnl3YXlzLiBiciBpcyBldmlsIDopIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJicnxub2JyIj4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gZm9udCBzaG91bGQgbm90IGJlIHRoZXJlLCBpdCB3YXMgdXNlZCB0byBkbyBhIHNvdXJjZSAob3IgY29kZSA/KS0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmb250Ij4KKyAgICA8c291cmNlPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICAgIDwvc291cmNlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tIGFzc3VtZXMgaW1nID0gaWNvbiByYXRoZXIgdGhhbiBmaWd1cmUgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImltZyI+CisgICAgPGljb24+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAYWx0fEBzcmN8QHdpZHRofEBoZWlnaHQiLz4KKyAgICA8L2ljb24+CisgIDwveHNsOnRlbXBsYXRlPgorICAKKyAgPCEtLSBhc3N1bWUgZXZlcnkgYW5jaG9yIHdpdGggYSBuYW1lIGlzIGFuIGFuY2hvciAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYVtAbmFtZV0iPgorICAgIDxhbmNob3I+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIi8+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgPC9hbmNob3I+ICAKKyAgPC94c2w6dGVtcGxhdGU+CisgIAorICA8IS0tIHRyeSB0byBiZSBzdXBlciBzbWFydCB0byBkZXRlY3QgbGluay9hbmNob3IvanVtcCAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYVtAaHJlZl0iPgorICAgIDx4c2w6Y2hvb3NlPgorICAgICAgPCEtLSBzb21ldGhpbmcgd2l0aCBhIGhhc2htYXJrIGlzIGEganVtcCAtLT4KKyAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdGFydHMtd2l0aChAaHJlZiwgJyMnKSI+CisgICAgICAgIDxqdW1wPgorICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4KKyAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+ICAgICAgICAKKyAgICAgICAgPC9qdW1wPgorICAgICAgPC94c2w6d2hlbj4KKyAgICAgIDwhLS0KKyAgICAgICAgYXNzdW1lIGV2ZXJ5dGhpbmcgb3V0IG9mIGFwYWNoZSBkb21haW4gd291bGQgYmUgYmV0dGVyIHdpdGggYSBmb3JrCisgICAgICAgIFRoaXMgaXMgcmVhbGx5IGEgbGlmZSBzdHlsZSwgSSBoYXRlIHdpbmRvd3MgZm9ya2luZyBhbGwgb3ZlciBteQorICAgICAgICBkZXNrdG9wIGJ1dCBpdCdzIHF1aXRlIGNvbnZlbmllbnQgc29tZXRpbWVzIHdoZW4gdG9vIGxhenkgdG8gc2hpZnQuCisgICAgICAgIE9uZSBzdXBlciB0aGluZyB3b3VsZCBiZSB0byBkbyBsaWtlIE1pY3Jvc29mdC5jb20gYW5kIHB1dCBhbgorICAgICAgICBleHRyYSBpY29uIHZpYSBmb3JyZXN0IGFmdGVyIHRoZSBsaW5rIHdoZW4gaXQgc2VuZCBvdXRzaWRlCisgICAgICAgIHRoZSBhcGFjaGUgc2l0ZS4KKyAgICAgIC0tPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0YXJ0cy13aXRoKEBocmVmLCAnaHR0cDovLycpIGFuZCBub3QoY29udGFpbnMoQGhyZWYsICdhcGFjaGUub3JnJykpIj4KKyAgICAgICAgPGZvcms+CisgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPgorICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4gICAgICAgIAorICAgICAgICA8L2Zvcms+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPCEtLSBmYWxsYmFjayB0byBhIGJhc2ljIGxpbmsgLS0+CisgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgPGxpbms+CisgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIvPgorICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgICAgICAgPC9saW5rPgorICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgIDwveHNsOmNob29zZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLS0KKyAgICBVZ2x5IGhhY2sgdG8gZGVmaW5lIGFuIGF4aWFsIHRhYmxlCisgICAgVGhlIGNzcyBjb3VsZCBiZSBkZWZpbmVkIGFzIHRleHQtYWxpZ246cmlnaHQgIWltcG9ydGFudDsKKyAgICAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGFibGUiPgorICAgIDx0YWJsZT4KKyAgICA8IS0tCisgICAgICAodHJbMV0vdGggYW5kIHRyWzFdL3RkKSB3b3VsZCBnaXZlIHRoZSBzYW1lIHJlc3VsdAorICAgICAgYnV0IEknbSB1c2luZyBmb2xsb3dpbmctc2liYmxpbmcgdG8gc291bmQgc3VwZXIgc21hcnQKKyAgICAgIGFuZCBvYmZ1c2NhdGUgbXkgY29kZS4gSXQgaGFyZCB0byB3cml0ZSwgc28gaXQgc2hvdWxkCisgICAgICBiZSBoYXJkIHRvIHVuZGVyc3RhbmQgOy0pCisgICAgICAtLT4KKyAgICA8eHNsOmlmIHRlc3Q9InRyWzFdL3RoW2ZvbGxvd2luZy1zaWJsaW5nOjp0ZF0iPgorICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmF4aWFsPC94c2w6YXR0cmlidXRlPgorICAgIDwveHNsOmlmPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gd2lkZSBydWxlLCBjb3B5IGFsbCBub2RlcyBhbmQgYXR0cmlidXRlcyAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm9kZSgpfEAqIiBwcmlvcml0eT0iLTEiPgorICAgIDx4c2w6Y29weT4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCoiLz4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgICA8L3hzbDpjb3B5PgorICA8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvYW50LXNpdGUvZm9ycmVzdC9idWlsZC54bWwgYi90cnVuay9wcm9wb3NhbC9hbnQtc2l0ZS9mb3JyZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQyNGYwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvYW50LXNpdGUvZm9ycmVzdC9idWlsZC54bWwKQEAgLTAsMCArMSwxOCBAQAorPHByb2plY3QgbmFtZT0iYW5ha2lhMmZvcnJlc3QiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+CisKKyAgICA8IS0tIEluaXRpYWxpemF0aW9uIHByb3BlcnRpZXMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImFuYWtpYS54ZG9jcy5zcmMiICAgICBsb2NhdGlvbj0iLi4vYW5ha2lhL3hkb2NzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRvY3MuZGVzdCIgICAgbG9jYXRpb249ImRvY3MiLz4KKworICAgIDwhLS0gcnVuIGZvcnJlc3QsIHJ1biAhIC0tPgorICAgIDx0YXJnZXQgbmFtZT0icnVuIj4gICAgICAKKyAgICAgIDx4c2x0IGZvcmNlPSJ0cnVlIiBiYXNlZGlyPSIke2FuYWtpYS54ZG9jcy5zcmN9IiBkZXN0ZGlyPSIke2RvY3MuZGVzdH0iCisgICAgICAgIGluY2x1ZGVzPSIqKi8qLnhtbCIKKyAgICAgICAgZXh0ZW5zaW9uPSIueG1sIgorICAgICAgICBzdHlsZT0iJHtiYXNlZGlyfS9hbmFraWEyZm9ycmVzdC54c2wiLz4gICAgICAKKyAgICAgIAorICAgICAgPHhzbHQgZm9yY2U9InRydWUiIGluPSIke2FuYWtpYS54ZG9jcy5zcmN9L3N0eWxlc2hlZXRzL3Byb2plY3QueG1sIiBvdXQ9IiR7ZG9jcy5kZXN0fS9ib29rLnhtbCIKKyAgICAgICAgc3R5bGU9IiR7YmFzZWRpcn0vcHJvamVjdDJib29rLnhzbCIvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9hbnQtc2l0ZS9mb3JyZXN0L3Byb2plY3QyYm9vay54c2wgYi90cnVuay9wcm9wb3NhbC9hbnQtc2l0ZS9mb3JyZXN0L3Byb2plY3QyYm9vay54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlMDg0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL2FudC1zaXRlL2ZvcnJlc3QvcHJvamVjdDJib29rLnhzbApAQCAtMCwwICsxLDM2IEBACis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Cis8IS0tCisKKyAgQSBsaXR0bGUgYml0IG9mIGF1dG9tYXRlZCB0cmFuc2Zvcm1hdGlvbiB0byBoZWxwIGNvbnZlcnNpb24KKyAgZnJvbSBBbmFraWEgdG8gRm9ycmVzdC9Db2Nvb24gZG9jcy4KKyAgCisgIFRoaXMgaXMgcHVyZWx5IGV4cGVyaW1lbnRhbCwgaXQgaGVtLi4uc2hvdWxkIHdvcmssIHdlbGwgbW9zdGx5CisgIGJ1dCBpdCBzaG91bGQgbWFuYWdlIHRvIGJyZWFrIGEgY291cGxlIG9mIHRoaW5ncyBzbyB5b3Ugd2lsbAorICBuZWVkIGEgbWFudWFsIHBhc3MgdG8gZml4IHRoaW5ncyBhZnRlciB0aGF0LgorICAKKyAgU3RlcGhhbmUgQmFpbGxpZXosIHNiYWlsbGllekBhcGFjaGUub3JnCisgIAorICAtLT4KKyAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBkb2N0eXBlLXN5c3RlbT0iYm9vay1jb2Nvb24tdjEwLmR0ZCIKKyAgZG9jdHlwZS1wdWJsaWM9Ii0vL0FQQUNIRS8vRFREIENvY29vbiBEb2N1bWVudGF0aW9uIEJvb2sgVjEuMC8vRU4iIGVuY29kaW5nPSJJU08tODg1OS0xIi8+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvamVjdCI+CisgICAgPGJvb2sgY29weXJpZ2h0PSIyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIKKyAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgICBzb2Z0d2FyZT0ie0BuYW1lfSIKKyAgICAgICAgICB0aXRsZT0ie3RpdGxlL3RleHQoKX0iPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImJvZHkvbWVudSIvPgorICAgIDwvYm9vaz4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVudSI+CisgICAgPG1lbnUgbGFiZWw9IntAbmFtZX0iPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Iml0ZW0iLz4KKyAgICA8L21lbnU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Iml0ZW0iPgorICAgIDxtZW51LWl0ZW0gbGFiZWw9IntAbmFtZX0iIGhyZWY9IntAaHJlZn0iLz4KKyAgPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvUkVBRE1FIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NzgyZWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9SRUFETUUKQEAgLTAsMCArMSwyIEBACitDb3B5IHRoZSBmaWxlcyBpbiBvLmEudC5hbnQsIHJlY29tcGlsZS4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvYnVpbGQueG1sIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTg2NTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9idWlsZC54bWwKQEAgLTAsMCArMSw5OCBAQAorPHByb2plY3QgbmFtZT0iZW1iZWQiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgorICA8ZGVzY3JpcHRpb24+RW1iZWQgcHJvcG9zYWw8L2Rlc2NyaXB0aW9uPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSJ1c2VyLnByb3BlcnRpZXMiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJhc2UucGF0aCIgbG9jYXRpb249Ii91c3Ivc2hhcmUvamF2YSIvPgorICA8cHJvcGVydHkgbmFtZT0iYW50LnNyYyIgbG9jYXRpb249Ii4uLy4uIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLnNyYyIgbG9jYXRpb249IiR7YW50LnNyY30vLi4vamFrYXJ0YS1jb21tb25zIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzYW5kYm94LnNyYyIgbG9jYXRpb249IiR7YW50LnNyY30vLi4vamFrYXJ0YS1jb21tb25zLXNhbmRib3giLz4KKworICA8cHJvcGVydHkgbmFtZT0iZW1iZWQuYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0iZGVidWciIHZhbHVlPSJ0cnVlIi8+CisKKyAgPCEtLSBUaG9zZSAyIHNob3VsZCBiZSBtb3ZlZCB0byBKWFBhdGggYW5kIHZlbG9jaXR5LiAtLT4gIAorICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1sb2dnaW5nLmphciIgbG9jYXRpb249IiR7Y29tbW9ucy5zcmN9L2xvZ2dpbmcvZGlzdC9jb21tb25zLWxvZ2dpbmcuamFyIiAvPiAKKyAgPHByb3BlcnR5IG5hbWU9Imp4cGF0aC5qYXIiIGxvY2F0aW9uPSIke2NvbW1vbnMuc3JjfS9qeHBhdGgvZGlzdC9jb21tb25zLWp4cGF0aC5qYXIiIC8+IAorICA8cHJvcGVydHkgbmFtZT0idmVsb2NpdHkuamFyIiBsb2NhdGlvbj0iJHtiYXNlLnBhdGh9L3ZlbG9jaXR5L3ZlbG9jaXR5LTIwMDIwMjIwLmphciIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InZlbG9jaXR5LWRlcC5qYXIiIGxvY2F0aW9uPSIke2Jhc2UucGF0aH0vdmVsb2NpdHkvdmVsb2NpdHktZGVwLTIwMDIwMjIwLmphciIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImpleGwuamFyIiBsb2NhdGlvbj0iJHtzYW5kYm94LnNyY30vamV4bC9kaXN0L2NvbW1vbnMtamV4bC5qYXIiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtZGlzY292ZXJ5LmphciIgbG9jYXRpb249IiR7Y29tbW9ucy5zcmN9L2Rpc2NvdmVyeS9kaXN0L2NvbW1vbnMtZGlzY292ZXJ5LmphciIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3NlcyIgLz4KKyAgPC90YXJnZXQ+CisgICAgCisgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9Im1haW4iIC8+CisKKyAgPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJpbml0LG1haW4tYW50MTUiID4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtYWluLWFudDE1IiBkZXBlbmRzPSJpbml0IiAKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQnVpbGQgaGFja3MgaW50byBhbnQxLjUgdG8gc3VwcG9ydCBzb21lIDEuNiBmZWF0dXJlcyIgPgorICAgPGVjaG8+RW1iZWQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCB3aXRoIGFudDEuNi4gSXQgaXMgb25seSB1c2VkIHdpdGggYW50MS41ICEgVGhlIGR5bmFtaWMgcHJvcGVydGllcyB3b3JrIHdpdGggYm90aCwgdXNlIGVtYmVkLW9wdGlvbmFsIHRhcmdldDwvZWNobz4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMvamF2YSIgIAorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgIGRlc3RkaXI9IiR7ZW1iZWQuYnVpbGR9L2NsYXNzZXMiID4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioqIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvKioiIC8+CisgICAgPC9qYXZhYz4KKworICAgIDxjb3B5IHRvRGlyPSIke2VtYmVkLmJ1aWxkfS9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2phdmEiIGluY2x1ZGVzPSJNRVRBLUlORi8qKiIgLz4KKyAgICA8L2NvcHk+CisKKyAgICA8amFyIGZpbGU9IiR7ZW1iZWQuYnVpbGR9L2FudC1zYXgyLmphciIgYmFzZWRpcj0iJHtlbWJlZC5idWlsZH0vY2xhc3NlcyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIgLz4KKyAgICA8L2phcj4KKyAgICAgICAgCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZW1iZWQtb3B0aW9uYWwiIGRlcGVuZHM9ImluaXQiID4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMvamF2YSIgIAorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgIGRlc3RkaXI9IiR7ZW1iZWQuYnVpbGR9L2NsYXNzZXMiID4KKyAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsLyoqIiAvPgorICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWE1MRE9NKioiIC8+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8IS0tIGFsbCB0aGlzIHdpbGwgbW92ZSB0byB0aGVpciBwYWNrYWdlIC0tPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMiIC8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqeHBhdGguamFyfSIgLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3ZlbG9jaXR5Lmphcn0iIC8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqZXhsLmphcn0iIC8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWRpc2NvdmVyeS5qYXJ9IiAvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iIC8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L2phdmFjPgorCisgICAgPGNvcHkgdG9EaXI9IiR7ZW1iZWQuYnVpbGR9L2NsYXNzZXMiPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvamF2YSIgaW5jbHVkZXM9Ik1FVEEtSU5GLyoqIiAvPgorICAgIDwvY29weT4KKworICAgIDxqYXIgZmlsZT0iJHtlbWJlZC5idWlsZH0vb3B0aW9uYWwtZHlucHJvcC5qYXIiIGJhc2VkaXI9IiR7ZW1iZWQuYnVpbGR9L2NsYXNzZXMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvKioiIC8+CisgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YTUxET00qKiIgLz4KKyAgICA8L2phcj4KKyAgICAgICAgCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ3VtcCIgZGVzY3JpcHRpb249IlBhdGNoIGd1bXAgYm9vdHN0cmFwIGFudCIgZGVwZW5kcz0ibWFpbiIgPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwiIGRlc2NyaXB0aW9uPSJJbnN0YWxscyBidWlsdCBqYXJzIj4KKyAgICA8ZWNobyBtZXNzYWdlPSJDb3B5ICR7ZW1iZWQuYnVpbGR9L2FudC1zYXgyLmphciB0b0Rpcj0ke2FudC5ob21lfS9saWIiLz4KKworICAgIDxta2RpciBkaXI9IiR7YW50LmhvbWV9L2xpYiIgLz4KKyAgICA8Y29weSBmaWxlPSIke2VtYmVkLmJ1aWxkfS9hbnQtc2F4Mi5qYXIiIHRvRGlyPSIke2FudC5ob21lfS9saWIiLz4KKworICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtZW1iZWQiIGRlcGVuZHM9Im1haW4sIGluc3RhbGwiIAorICAgICAgICAgIGRlc2NyaXB0aW9uPSJCdWlsZHMgYW5kIGluc3RhbGxzIGVtYmVkIHdpdGhvdXQgb3B0aW9uYWwiLz4KKyAKKyAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLWVtYmVkLW9wdGlvbmFsIiBkZXBlbmRzPSJlbWJlZC1vcHRpb25hbCwgaW5zdGFsbCIgCisgICAgICAgICAgZGVzY3JpcHRpb249Ikluc3RhbGxzIGV4dHJhIGJ1aWx0IGphcnMiID4KKyAgICA8Y29weSBmaWxlPSIke2VtYmVkLmJ1aWxkfS9vcHRpb25hbC1keW5wcm9wLmphciIgdG9EaXI9IiR7YW50LmhvbWV9L2xpYiIvPgorICA8L3RhcmdldD4gCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTE0ODA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcgpAQCAtMCwwICsxIEBACitvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuUHJvamVjdEhlbHBlckltcGwyCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0Q29tcG9uZW50RmFjdG9yeS5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTk2Yzc4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyU2V0OyAKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJTZXRDb2xsZWN0aW9uOyAKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsgCisKKy8vIFhYWCBJdCB3b3VsZCBiZSBhIGdvb2QgaWRlYSB0byBtZXJnZSBhbGwgJ2hvb2tzJyBpbnRvIG9uZSBBbnRJbnRlcmNlcHRvcgorLy8gbWVjaGFuaXNtLiBUaGF0IHdvdWxkIG1ha2UgaXQgbXVjaCBlYXNpZXIgdG8gcmVhZCBhbmQgZXh0ZW5kLgorCisvKiogCisgKiBBYnN0cmFjdCBjb21wb25lbnQgY3JlYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24uCisgKgorICogVE9ETzogTXVsdGlwbGUgQ29tcG9uZW50SGVscGVycyBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhIHByb2plY3QsIGVpdGhlciBieSBhbgorICogZW1iZWRkaW5nIGFwcGxpY2F0aW9uIG9yIGJ5IHRhc2tkZWYtbGlrZSB0YXNrcy4KKyAqCisgKiBBZnRlciBhIFByb2plY3RDb21wb25lbnRIZWxwZXIgaXMgcmVnaXN0ZXJlZCwgaXQnbGwgbWFuYWdlIHRoZSBjb25zdHJ1Y3Rpb24gYW5kIAorICogY29uZmlndXJhdGlvbiBvZiB0YXNrcy90eXBlcy9ldGMuIEl0IGhhcyBmdWxsIGNvbnRyb2wgb3ZlciBob3cgdGhlCisgKiBjb21wb25lbnQgaXMgY3JlYXRlZCAtIGFuZCBtYXkgcHJvdmlkZSBydW50aW1lIHdyYXBwaW5nIGZvciBjb21wb25lbnRzCisgKiBub3QgaW1wbGVtZW50aW5nIHRoZSBUYXNrL0RhdGFUeXBlIGludGVyZmFjZXMuCisgKiBJdCB3b3JrcyBpbiBjbG9zZSByZWxhdGlvbiB3aXRoIFRhc2tBZGFwdGVyIGFuZCBSdW50aW1lQ29uZmlndXJhYmxlCisgKiB0byBoYW5kbGUgZGVsYXllZCBldmFsdWF0aW9uIG9mIHRhc2tzIG9yIGN1c3RvbSBhdHRyaWJ1dGUtJmd0O3Rhc2sgbWFwcGluZy4KKyAqIElmIGl0IHJldHVybnMgYSB3cmFwcGVyIGZvciBUYXNrLCB0aGUgd3JhcHBlciBpcyByZXF1aXJlZCB0byBleHRlbmQKKyAqIFRhc2tBZGFwdGVyLgorICoKKyAqIFRoZSBjb21tb24gJ0NoYWluJyBwYXR0ZXJuIGlzIHVzZWQgdG8gY29uc3RydWN0CisgKiB0YXNrcywgd2l0aCB0aGUgb3JpZ2luYWwgYmVoYXZpb3IgKCBDbGFzcyByZWdpc3RyeSApIHRyaWVkIGxhc3QsIGJ5IHRoZQorICogZGVmYXVsdCBoZWxwZXIgaW1wbGVtZW50YXRpb24uCisgKgorICogTm90ZSB0aGF0ICdkZWxheWVkJyBjb25zdHJ1Y3Rpb24gb2YgdGFza3MgaXMgdXNlZC4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvamVjdENvbXBvbmVudEZhY3RvcnkgeworCisgICAgLyoqIENyZWF0ZXMgYW4gYW50IGNvbXBvbmVudC4uCisgICAgICoKKyAgICAgKiBBIGZhY3RvcnkgbWF5IGhhdmUga25vd2xlZGdlIGFib3V0IHRoZSB0YXNrcyBpdCBjcmVhdGVzLiBJdCBjYW4gcmV0dXJuCisgICAgICogYW4gb2JqZWN0IGV4dGVuZGluZyBUYXNrQWRhcHRlciB0aGF0IGVtdWxhdGVzIFRhc2svRGF0YVR5cGUuIElmIG51bGwgaXMgcmV0dXJuZWQsCisgICAgICogdGhlIG5leHQgaGVscGVyIGlzIHRyaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGNvbnRleHQgZm9yIHRhc2sgY3JlYXRpb24uCisgICAgICogQHBhcmFtIHJvbGUgQ2xhc3MgbmFtZSBmb3IgdGhlIGV4cGVjdGVkIHJvbGUgKCBUYXNrLCBUeXBlLCBGaWx0ZXIsIGV0YyApLiBOdWxsIGZvciAnYW55JworICAgICAqIEBwYXJhbSBucyBuYW1lc3BhY2UgaWYgYSBTQVgyIHBhcnNlciBpcyB1c2VkLCBudWxsIGZvciAnY2xhc3NpY2FsJyBhbnQKKyAgICAgKiBAcGFyYW0gdGFza05hbWUgdGhlIChsb2NhbCkgbmFtZSBvZiB0aGUgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVByb2plY3RDb21wb25lbnQoIFByb2plY3QgcHJvamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXNrTmFtZSApCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKyAgICAvLyBYWFggY2xhc3MgbG9hZGVyID8gQ2FuIHVzZSB0aGUgbnMsIGJ1dCBhZGRpdGlvbmFsIGhpbnRzIG1heSBiZSBhdmFpbGFibGUgaW4gdGFza2RlZgorICAgIC8vIAorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudEhlbHBlci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOGRiOWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0Q29tcG9uZW50SGVscGVyLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldDsgCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyU2V0Q29sbGVjdGlvbjsgCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7IAorCisvKiogCisgKiBDb21wb25lbnQgY3JlYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24uCisgKgorICogQWZ0ZXIgYSBQcm9qZWN0Q29tcG9uZW50RmFjdG9yeSBpcyByZWdpc3RlcmVkLCBpdCdsbCBtYW5hZ2UgdGhlIGNvbnN0cnVjdGlvbiBhbmQgCisgKiBjb25maWd1cmF0aW9uIG9mIHRhc2tzL3R5cGVzL2V0Yy4gSXQgaGFzIGZ1bGwgY29udHJvbCBvdmVyIGhvdyB0aGUKKyAqIGNvbXBvbmVudCBpcyBjcmVhdGVkIC0gYW5kIG1heSBwcm92aWRlIHJ1bnRpbWUgd3JhcHBpbmcgZm9yIGNvbXBvbmVudHMKKyAqIG5vdCBpbXBsZW1lbnRpbmcgdGhlIFRhc2svRGF0YVR5cGUgaW50ZXJmYWNlcy4KKyAqIEl0IHdvcmtzIGluIGNsb3NlIHJlbGF0aW9uIHdpdGggVGFza0FkYXB0ZXIgYW5kIFJ1bnRpbWVDb25maWd1cmFibGUKKyAqIHRvIGhhbmRsZSBkZWxheWVkIGV2YWx1YXRpb24gb2YgdGFza3Mgb3IgY3VzdG9tIGF0dHJpYnV0ZS0mZ3Q7dGFzayBtYXBwaW5nLgorICogSWYgaXQgcmV0dXJucyBhIHdyYXBwZXIgZm9yIFRhc2ssIHRoZSB3cmFwcGVyIGlzIHJlcXVpcmVkIHRvIGV4dGVuZAorICogVGFza0FkYXB0ZXIuCisgKgorICogVGhlIGNvbW1vbiAnQ2hhaW4nIHBhdHRlcm4gaXMgdXNlZCB0byBjb25zdHJ1Y3QKKyAqIHRhc2tzLCB3aXRoIHRoZSBvcmlnaW5hbCBiZWhhdmlvciAoIENsYXNzIHJlZ2lzdHJ5ICkgdHJpZWQgbGFzdCwgYnkgdGhlCisgKiBkZWZhdWx0IGhlbHBlciBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgJ2RlbGF5ZWQnIGNvbnN0cnVjdGlvbiBvZiB0YXNrcyBpcyB1c2VkLgorICoKKyAqLworcHVibGljIGNsYXNzIFByb2plY3RDb21wb25lbnRIZWxwZXIgIHsKKyAgICBzdGF0aWMgcHJpdmF0ZSBQcm9qZWN0Q29tcG9uZW50SGVscGVyIHNpbmdsZXRvbj1uZXcgUHJvamVjdENvbXBvbmVudEhlbHBlcigpOworICAgIAorICAgIFZlY3RvciBmYWN0b3JpZXM9bmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9qZWN0Q29tcG9uZW50SGVscGVyIGdldFByb2plY3RDb21wb25lbnRIZWxwZXIoKSB7CisgICAgICAgIC8vIFNpbmdsZXRvbiBmb3Igbm93LCBpdCBtYXkgY2hhbmdlICggcGVyL2NsYXNzbG9hZGVyICkKKyAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb21wb25lbnRGYWN0b3J5KCBQcm9qZWN0Q29tcG9uZW50RmFjdG9yeSBmYWN0ICkgeworICAgICAgICBmYWN0b3JpZXMuYWRkRWxlbWVudCggZmFjdCApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVByb2plY3RDb21wb25lbnQoIFVua25vd25FbGVtZW50IHVlLCBQcm9qZWN0IHByb2plY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFza05hbWUgKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIE9iamVjdCBjb21wb25lbnQ9bnVsbDsKKyAgICAgICAgZm9yKCBpbnQgaT0wOyBpPCBmYWN0b3JpZXMuc2l6ZSgpOyBpKysgKSB7CisgICAgICAgICAgICBQcm9qZWN0Q29tcG9uZW50RmFjdG9yeSBmYWN0PShQcm9qZWN0Q29tcG9uZW50RmFjdG9yeSlmYWN0b3JpZXMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgY29tcG9uZW50PWZhY3QuY3JlYXRlUHJvamVjdENvbXBvbmVudCggcHJvamVjdCwgbnMsIHRhc2tOYW1lICk7CisgICAgICAgICAgICBpZiggY29tcG9uZW50IT1udWxsICkgcmV0dXJuIGNvbXBvbmVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmFsbGJhY2sgdG8gcHJvamVjdCBkZWZhdWx0ICIgKyB0YXNrTmFtZSApOworICAgICAgICAvLyBDYW4ndCBjcmVhdGUgY29tcG9uZW50LiBEZWZhdWx0IGlzIHRvIHVzZSB0aGUgb2xkIG1ldGhvZHMgaW4gcHJvamVjdC4KKworICAgICAgICAvLyBUaGlzIHBvbGljeSBpcyB0YWtlbiBmcm9tIDEuNSBQcm9qZWN0SGVscGVyLiBJbiBmdXR1cmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICAgICAvLyB0YXNrIGFuZCB0eXBlIHNob3VsZCBkaXNhcGVhci4KKyAgICAgICAgaWYoIHByb2plY3QuZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpLmdldCh0YXNrTmFtZSkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHBvbGljeSBpbiBQcm9qZWN0SGVscGVyLiBUaGUgMS41IHZlcnNpb24gb2YgVW5rd25vbndFbGVtZW50CisgICAgICAgICAgICAvLyB1c2VkIHRvIHRyeSBmaXJzdCB0byBjcmVhdGUgYSB0YXNrLCBhbmQgaWYgaXQgZmFpbGVkIHRyaWVkIGEgdHlwZS4gSW4gMS42IHRoZSBkaWZmCisgICAgICAgICAgICAvLyBzaG91bGQgZGlzYXBlYXIuCisgICAgICAgICAgICBjb21wb25lbnQgPSBwcm9qZWN0LmNyZWF0ZURhdGFUeXBlKHRhc2tOYW1lKTsKKyAgICAgICAgICAgIGlmKCBjb21wb25lbnQhPW51bGwgKSByZXR1cm4gY29tcG9uZW50OworICAgICAgICB9CisKKyAgICAgICAgLy8gZnJvbSBVbmt3bm9ud0VsZW1lbnQuY3JlYXRlVGFzay4gVGhlICd0b3AgbGV2ZWwnIGNhc2UgaXMgcmVtb3ZlZCwgd2UncmUKKyAgICAgICAgLy8gYWxsd2F5cyBsYXp5CisgICAgICAgIGNvbXBvbmVudCA9IHByb2plY3QuY3JlYXRlVGFzayh0YXNrTmFtZSk7CisKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9wZXJ0eUhlbHBlci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvcGVydHlIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzc0NTczCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvcGVydHlIZWxwZXIuamF2YQpAQCAtMCwwICsxLDYyNyBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZUxpc3RJbXBsOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7CisKKy8qIElTU1VFUzoKKyAtIG5zIHBhcmFtLiBJdCBjb3VsZCBiZSB1c2VkIHRvIHByb3ZpZGUgIm5hbWVzcGFjZXMiIGZvciBwcm9wZXJ0aWVzLCB3aGljaAorIG1heSBiZSBtb3JlIGZsZXhpYmxlLgorIC0gT2JqZWN0IHZhbHVlLiBJbiBhbnQxLjUgU3RyaW5nIGlzIHVzZWQgZm9yIFByb3BlcnRpZXMgLSBidXQgaXQgd291bGQgYmUgbmljZQorIHRvIHN1cHBvcnQgZ2VuZXJpYyBPYmplY3RzICggdGhlIHByb3BlcnR5IHJlbWFpbnMgaW11dGFibGUgLSB5b3UgY2FuJ3QgY2hhbmdlCisgdGhlIGFzc29jaWF0ZWQgb2JqZWN0ICkuIFRoaXMgd2lsbCBhbHNvIGFsbG93IEpTUC1FTCBzdHlsZSBzZXR0aW5nIHVzaW5nIHRoZQorIE9iamVjdCBpZiBhbiBhdHRyaWJ1dGUgY29udGFpbnMgb25seSB0aGUgcHJvcGVydHkgKCBuYW1lPSIke3Byb3BlcnR5fSIgY291bGQKKyBhdm9pZCBPYmplY3QtJmd0O1N0cmluZy0mZ3Q7T2JqZWN0IGNvbnZlcnNpb24gKQorIC0gQ3VycmVudGx5IHdlICJjaGFpbiIgb25seSBmb3IgZ2V0IGFuZCBzZXQgcHJvcGVydHkgKCBwcm9iYWJseSBtb3N0IHVzZXJzCisgd2lsbCBvbmx5IG5lZWQgdGhhdCAtIGlmIHRoZXkgbmVlZCBtb3JlIHRoZXkgY2FuIHJlcGxhY2UgdGhlIHRvcCBoZWxwZXIgKS4KKyBOZWVkIHRvIGRpc2N1c3MgdGhpcyBhbmQgZmluZCBpZiB3ZSBuZWVkIG1vcmUuCisgKi8KKworLyoqIE5PVCBGSU5BTC4gQVBJIE1BWSBDSEFOR0UKKyAqCisgKiBEZWFscyB3aXRoIHByb3BlcnRpZXMgLSBzdWJzdGl0dXRpb24sIGR5bmFtaWMgcHJvcGVydGllcywgZXRjLgorICoKKyAqIFRoaXMgaXMgdGhlIHNhbWUgY29kZSBhcyBpbiBBbnQxLjUuIFRoZSBtYWluIGFkZGl0aW9uIGlzIHRoZSBhYmlsaXR5CisgKiB0byBjaGFpbiBtdWx0aXBsZSBQcm9wZXJ0eUhlbHBlcnMgYW5kIHRvIHJlcGxhY2UgdGhlIGRlZmF1bHQuCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5SGVscGVyIHsKKworICAgIHByb3RlY3RlZCBQcm9qZWN0IHByb2plY3Q7CisgICAgcHJvdGVjdGVkIFByb3BlcnR5SGVscGVyIG5leHQ7CisKKyAgICAvKiogUHJvamVjdCBwcm9wZXJ0aWVzIG1hcCAodXN1YWxseSBTdHJpbmcgdG8gU3RyaW5nKS4gKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgLyoqCisgICAgICogTWFwIG9mICJ1c2VyIiBwcm9wZXJ0aWVzIChhcyBjcmVhdGVkIGluIHRoZSBBbnQgdGFzaywgZm9yIGV4YW1wbGUpLgorICAgICAqIE5vdGUgdGhhdCB0aGVzZSBrZXkvdmFsdWUgcGFpcnMgYXJlIGFsc28gYWx3YXlzIHB1dCBpbnRvIHRoZQorICAgICAqIHByb2plY3QgcHJvcGVydGllcywgc28gb25seSB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgcXVlcmllZC4KKyAgICAgKiBNYXBwaW5nIGlzIFN0cmluZyB0byBTdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZSB1c2VyUHJvcGVydGllcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAvKioKKyAgICAgKiBNYXAgb2YgaW5oZXJpdGVkICJ1c2VyIiBwcm9wZXJ0aWVzIC0gdGhhdCBhcmUgdGhvc2UgInVzZXIiCisgICAgICogcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRhc2tzIGFuZCBub3QgYmVlbiBzZXQKKyAgICAgKiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgYSBHVUkgdG9vbC4KKyAgICAgKiBNYXBwaW5nIGlzIFN0cmluZyB0byBTdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBpbmhlcml0ZWRQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgcHJvdGVjdGVkIFByb3BlcnR5SGVscGVyKCkgeworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tICBIb29rIG1hbmFnZW1lbnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcCApIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0PXA7CisgICAgfQorCisgICAgLyoqIFRoZXJlIGFyZSAyIHdheXMgdG8gaG9vayBpbnRvIHByb3BlcnR5IGhhbmRsaW5nOgorICAgICAqICAtIHlvdSBjYW4gcmVwbGFjZSB0aGUgbWFpbiBQcm9wZXJ0eUhlbHBlci4gVGhlIHJlcGxhY2VtZW50IGlzIHJlcXVpcmVkCisgICAgICogdG8gc3VwcG9ydCB0aGUgc2FtZSBzZW1hbnRpY3MgKCBvZiBjb3Vyc2UgOi0pCisgICAgICoKKyAgICAgKiAgLSB5b3UgY2FuIGNoYWluIGEgcHJvcGVydHkgaGVscGVyIGNhcGFibGUgb2Ygc3RvcmluZyBzb21lIHByb3BlcnRpZXMuCisgICAgICogIEFnYWluLCB5b3UgYXJlIHJlcXVpcmVkIHRvIHJlc3BlY3QgdGhlIGltbXV0YWJpbGl0eSBzZW1hbnRpY3MgKCBhdAorICAgICAqICBsZWFzdCBmb3Igbm9uLWR5bmFtaWMgcHJvcGVydGllcyApCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5leHQoIFByb3BlcnR5SGVscGVyIG5leHQgKSB7CisgICAgICAgIHRoaXMubmV4dD1uZXh0OworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eUhlbHBlciBnZXROZXh0KCkgeworICAgICAgICByZXR1cm4gbmV4dDsKKyAgICB9CisKKyAgICAvKiogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgcHJvcGVydHkgcHJvY2Vzc29yLgorICAgICAqICBVc2VycyBjYW4gcHJvdmlkZSB0aGVpciBvd24gb3IgcmVwbGFjZSBpdCB1c2luZyAiYW50LlByb3BlcnR5SGVscGVyIgorICAgICAqICByZWZlcmVuY2UuIFVzZXIgdGFza3MgY2FuIGFsc28gYWRkIHRoZW1zZWxmIHRvIHRoZSBjaGFpbiwgYW5kIHByb3ZpZGUKKyAgICAgKiAgZHluYW1pYyBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlIZWxwZXIgZ2V0UHJvcGVydHlIZWxwZXIoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIFByb3BlcnR5SGVscGVyIHBoPShQcm9wZXJ0eUhlbHBlcilwcm9qZWN0LmdldFJlZmVyZW5jZSggImFudC5Qcm9wZXJ0eUhlbHBlciIgKTsKKyAgICAgICAgaWYoIHBoIT1udWxsICkgcmV0dXJuIHBoOworICAgICAgICBwaD1uZXcgUHJvcGVydHlIZWxwZXIoKTsKKyAgICAgICAgcGguc2V0UHJvamVjdCggcHJvamVjdCApOworCisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCAiYW50LlByb3BlcnR5SGVscGVyIixwaCApOworICAgICAgICByZXR1cm4gcGg7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gIE1ldGhvZHMgdG8gb3ZlcnJpZGUgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcHJvcGVydHkuIEFueSBleGlzdGluZyBwcm9wZXJ0eSBvZiB0aGUgc2FtZSBuYW1lCisgICAgICogaXMgb3ZlcndyaXR0ZW4sIHVubGVzcyBpdCBpcyBhIHVzZXIgcHJvcGVydHkuIFdpbGwgYmUgY2FsbGVkCisgICAgICogZnJvbSBzZXRQcm9wZXJ0eSgpLgorICAgICAqCisgICAgICogSWYgYWxsIGhlbHBlcnMgcmV0dXJuIGZhbHNlLCB0aGUgcHJvcGVydHkgd2lsbCBiZSBzYXZlZCBpbgorICAgICAqIHRoZSBkZWZhdWx0IHByb3BlcnRpZXMgdGFibGUgYnkgc2V0UHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiBwcm9wZXJ0eSB0byBzZXQuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBoZWxwZXIgaGFzIHN0b3JlZCB0aGUgcHJvcGVydHksIGZhbHNlIGlmIGl0CisgICAgICogICAgY291bGRuJ3QuIEVhY2ggaGVscGVyIHNob3VsZCBkZWxlZ2F0ZSB0byB0aGUgbmV4dCBvbmUgKCB1bmxlc3MgaXQKKyAgICAgKiAgICBoYXMgYSBnb29kIHJlYXNvbiBub3QgdG8gKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRQcm9wZXJ0eUhvb2soU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluaGVyaXRlZCwgYm9vbGVhbiB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTmV3KQorICAgIHsKKyAgICAgICAgaWYoIGdldE5leHQoKSE9bnVsbCApIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc3Vic3Q9Z2V0TmV4dCgpLnNldFByb3BlcnR5SG9vayhucywgbmFtZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGluaGVyaXRlZCwgdXNlciwgaXNOZXcpOworICAgICAgICAgICAgLy8gSWYgbmV4dCBoYXMgaGFuZGxlZCB0aGUgcHJvcGVydHkKKyAgICAgICAgICAgIGlmKCBzdWJzdCApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogR2V0IGEgcHJvcGVydHkuIElmIGFsbCBob29rcyByZXR1cm4gbnVsbCwgdGhlIGRlZmF1bHQKKyAgICAgKiB0YWJsZXMgd2lsbCBiZSB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIG5zCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eUhvb2soU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB1c2VyKSB7CisgICAgICAgIGlmKCBnZXROZXh0KCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIE9iamVjdCBvPWdldE5leHQoKS5nZXRQcm9wZXJ0eUhvb2sobnMsIG5hbWUsIHVzZXIpOworICAgICAgICAgICAgaWYoIG8hPSBudWxsICkgcmV0dXJuIG87CisgICAgICAgIH0KKyAgICAgICAgLy8gRXhwZXJpbWVudGFsL1Rlc3RpbmcsIHdpbGwgYmUgcmVtb3ZlZAorICAgICAgICBpZiggbmFtZS5zdGFydHNXaXRoKCAidG9TdHJpbmc6IiApKSB7CisgICAgICAgICAgICBuYW1lPW5hbWUuc3Vic3RyaW5nKCAidG9TdHJpbmc6Ii5sZW5ndGgoKSk7CisgICAgICAgICAgICBPYmplY3Qgdj1wcm9qZWN0LmdldFJlZmVyZW5jZSggbmFtZSApOworICAgICAgICAgICAgaWYoIHY9PW51bGwgKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiB2LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wdGlvbmFsIG1ldGhvZHMgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFlvdSBjYW4gb3ZlcnJpZGUgdGhvc2UgbWV0aG9kcyBpZiB5b3Ugd2FudCB0byBvcHRpbWl6ZSBvcgorICAgIC8vIGRvIGFkdmFuY2VkIHRoaW5ncyAoIGxpa2Ugc3VwcG9ydCBhIHNwZWNpYWwgc3ludGF4ICkuCisgICAgLy8gVGhlIG1ldGhvZHMgZG8gbm90IGNoYWluIC0geW91IHNob3VsZCB1c2UgdGhlbSB3aGVuIGVtYmVkZGluZyBhbnQKKyAgICAvLyAoIGJ5IHJlcGxhY2luZyB0aGUgbWFpbiBoZWxwZXIgKQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgPGNvZGU+JHt4eHh9PC9jb2RlPiBzdHlsZSBwcm9wZXJ0eQorICAgICAqIHJlZmVyZW5jZXMgaW50byB0d28gbGlzdHMuIFRoZSBmaXJzdCBsaXN0IGlzIGEgY29sbGVjdGlvbgorICAgICAqIG9mIHRleHQgZnJhZ21lbnRzLCB3aGlsZSB0aGUgb3RoZXIgaXMgYSBzZXQgb2Ygc3RyaW5nIHByb3BlcnR5IG5hbWVzLgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGVudHJpZXMgaW4gdGhlIGZpcnN0IGxpc3QgaW5kaWNhdGUgYSBwcm9wZXJ0eQorICAgICAqIHJlZmVyZW5jZSBmcm9tIHRoZSBzZWNvbmQgbGlzdC4KKyAgICAgKgorICAgICAqIEl0IGNhbiBiZSBvdmVycmlkZW4gd2l0aCBhIG1vcmUgZWZmaWNpZW50IG9yIGN1c3RvbWl6ZWQgdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSAgICAgVGV4dCB0byBwYXJzZS4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGZyYWdtZW50cyBMaXN0IHRvIGFkZCB0ZXh0IGZyYWdtZW50cyB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eVJlZnMgTGlzdCB0byBhZGQgcHJvcGVydHkgbmFtZXMgdG8uCisgICAgICogICAgICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBjb250YWlucyBhbiBvcGVuaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT4kezwvY29kZT4gd2l0aG91dCBhIGNsb3NpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPn08L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFyc2VQcm9wZXJ0eVN0cmluZyhTdHJpbmcgdmFsdWUsIFZlY3RvciBmcmFnbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IgcHJvcGVydHlSZWZzKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHBhcnNlUHJvcGVydHlTdHJpbmdEZWZhdWx0KHZhbHVlLCBmcmFnbWVudHMsIHByb3BlcnR5UmVmcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgPGNvZGU+JHt4eHh9PC9jb2RlPiBzdHlsZSBjb25zdHJ1Y3Rpb25zIGluIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdG8gYmUgc2Nhbm5lZCBmb3IgcHJvcGVydHkgcmVmZXJlbmNlcy4KKyAgICAgKiAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbiB3aGljaCBjYXNlIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBubyBlZmZlY3QuCisgICAgICogQHBhcmFtIGtleXMgIE1hcHBpbmcgKFN0cmluZyB0byBTdHJpbmcpIG9mIHByb3BlcnR5IG5hbWVzIHRvIHRoZWlyCisgICAgICogICAgICAgICAgICAgIHZhbHVlcy4gSWYgPGNvZGU+bnVsbDwvY29kZT4sIG9ubHkgcHJvamVjdCBwcm9wZXJ0aWVzIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBjb250YWlucyBhbiBvcGVuaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT4kezwvY29kZT4gd2l0aG91dCBhIGNsb3NpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPn08L2NvZGU+CisgICAgICogQHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nIHdpdGggdGhlIHByb3BlcnRpZXMgcmVwbGFjZWQsIG9yCisgICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgb3JpZ2luYWwgc3RyaW5nIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgcmVwbGFjZVByb3BlcnRpZXMoU3RyaW5nIG5zLCBTdHJpbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUga2V5cykKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yIGZyYWdtZW50cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgVmVjdG9yIHByb3BlcnR5UmVmcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgcGFyc2VQcm9wZXJ0eVN0cmluZyh2YWx1ZSwgZnJhZ21lbnRzLCBwcm9wZXJ0eVJlZnMpOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgRW51bWVyYXRpb24gaSA9IGZyYWdtZW50cy5lbGVtZW50cygpOworICAgICAgICBFbnVtZXJhdGlvbiBqID0gcHJvcGVydHlSZWZzLmVsZW1lbnRzKCk7CisKKyAgICAgICAgd2hpbGUgKGkuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBmcmFnbWVudCA9IChTdHJpbmcpIGkubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIGoubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgcmVwbGFjZW1lbnQ9bnVsbDsKKworICAgICAgICAgICAgICAgIC8vIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgcHJvamVjdCBvciBrZXlzCisgICAgICAgICAgICAgICAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgICAgIGlmKCBrZXlzIT1udWxsICkgeworICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudD1rZXlzLmdldChwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggcmVwbGFjZW1lbnQ9PW51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50PWdldFByb3BlcnR5KG5zLCBwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZygiUHJvcGVydHkgJHsiICsgcHJvcGVydHlOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAifSBoYXMgbm90IGJlZW4gc2V0IiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gKHJlcGxhY2VtZW50IT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgPyByZXBsYWNlbWVudC50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICA6ICIkeyIgKyBwcm9wZXJ0eU5hbWUgKyAifSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoZnJhZ21lbnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBNZXRob2RzIHVzZWQgdG8gc3VwcG9ydCB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQgcHJvdmlkZSBiYWNrd2FyZAorICAgIC8vIGNvbXBhdGliaWxpdHkuIFNvbWUgd2lsbCBiZSBkZXByZWNhdGVkLCB5b3Ugc2hvdWxkIGF2b2lkIGNhbGxpbmcgdGhlbS4KKworCisgICAgLyoqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc2V0UHJvcGVydHkuIFdpbGwgYmUgY2FsbGVkIGZyb20gUHJvamVjdC4KKyAgICAgKiAgVGhpcyBpcyB0aGUgb3JpZ2luYWwgMS41IGltcGxlbWVudGF0aW9uLCB3aXRoIGNhbGxzIHRvIHRoZSBob29rCisgICAgICogIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRQcm9wZXJ0eShTdHJpbmcgbnMsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUsIGJvb2xlYW4gdmVyYm9zZSkKKyAgICB7CisgICAgICAgIC8vIHVzZXIgKCBDTEkgKSBwcm9wZXJ0aWVzIHRha2UgcHJlY2VkZW5jZQorICAgICAgICBpZiAobnVsbCAhPSB1c2VyUHJvcGVydGllcy5nZXQobmFtZSkpIHsKKyAgICAgICAgICAgIGlmKCB2ZXJib3NlICkgeworICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJPdmVycmlkZSBpZ25vcmVkIGZvciB1c2VyIHByb3BlcnR5ICIgKyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGRvbmU9dGhpcy5zZXRQcm9wZXJ0eUhvb2sobnMsIG5hbWUsIHZhbHVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgaWYoIGRvbmUgKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IHByb3BlcnRpZXMuZ2V0KG5hbWUpICYmIHZlcmJvc2UpIHsKKyAgICAgICAgICAgIHByb2plY3QubG9nKCJPdmVycmlkaW5nIHByZXZpb3VzIGRlZmluaXRpb24gb2YgcHJvcGVydHkgIiArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHZlcmJvc2UgKSB7CisgICAgICAgICAgICBwcm9qZWN0LmxvZygiU2V0dGluZyBwcm9qZWN0IHByb3BlcnR5OiAiICsgbmFtZSArICIgLT4gIiArCisgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIH0KKyAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcHJvcGVydHkgaWYgbm8gdmFsdWUgY3VycmVudGx5IGV4aXN0cy4gSWYgdGhlIHByb3BlcnR5CisgICAgICogZXhpc3RzIGFscmVhZHksIGEgbWVzc2FnZSBpcyBsb2dnZWQgYW5kIHRoZSBtZXRob2QgcmV0dXJucyB3aXRoCisgICAgICogbm8gb3RoZXIgZWZmZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0LgorICAgICAqICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TmV3UHJvcGVydHkoU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKG51bGwgIT0gcHJvcGVydGllcy5nZXQobmFtZSkpIHsKKyAgICAgICAgICAgIHByb2plY3QubG9nKCJPdmVycmlkZSBpZ25vcmVkIGZvciBwcm9wZXJ0eSAiICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGRvbmU9dGhpcy5zZXRQcm9wZXJ0eUhvb2sobnMsIG5hbWUsIHZhbHVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBpZiggZG9uZSApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHByb2plY3QubG9nKCJTZXR0aW5nIHByb2plY3QgcHJvcGVydHk6ICIgKyBuYW1lICsgIiAtPiAiICsKKyAgICAgICAgICAgICAgICB2YWx1ZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIHVzZXIgcHJvcGVydHksIHdoaWNoIGNhbm5vdCBiZSBvdmVyd3JpdHRlbiBieQorICAgICAqIHNldC91bnNldCBwcm9wZXJ0eSBjYWxscy4gQW55IHByZXZpb3VzIHZhbHVlIGlzIG92ZXJ3cml0dGVuLgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRVc2VyUHJvcGVydHkoU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHByb2plY3QubG9nKCJTZXR0aW5nIHJvIHByb2plY3QgcHJvcGVydHk6ICIgKyBuYW1lICsgIiAtPiAiICsKKyAgICAgICAgICAgICAgICB2YWx1ZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICB1c2VyUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworCisgICAgICAgIGJvb2xlYW4gZG9uZT10aGlzLnNldFByb3BlcnR5SG9vayhucywgbmFtZSwgdmFsdWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGlmKCBkb25lICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgdXNlciBwcm9wZXJ0eSwgd2hpY2ggY2Fubm90IGJlIG92ZXJ3cml0dGVuIGJ5IHNldC91bnNldAorICAgICAqIHByb3BlcnR5IGNhbGxzLiBBbnkgcHJldmlvdXMgdmFsdWUgaXMgb3ZlcndyaXR0ZW4uIEFsc28gbWFya3MKKyAgICAgKiB0aGVzZSBwcm9wZXJ0aWVzIGFzIHByb3BlcnRpZXMgdGhhdCBoYXZlIG5vdCBjb21lIGZyb20gdGhlCisgICAgICogY29tbWFuZCBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0LgorICAgICAqICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEluaGVyaXRlZFByb3BlcnR5KFN0cmluZyBucywgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGluaGVyaXRlZFByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKKworICAgICAgICBwcm9qZWN0LmxvZygiU2V0dGluZyBybyBwcm9qZWN0IHByb3BlcnR5OiAiICsgbmFtZSArICIgLT4gIiArCisgICAgICAgICAgICAgICAgdmFsdWUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgdXNlclByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKKworICAgICAgICBib29sZWFuIGRvbmU9dGhpcy5zZXRQcm9wZXJ0eUhvb2sobnMsIG5hbWUsIHZhbHVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBpZiggZG9uZSApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2V0dGluZyBwcm9wZXJ0aWVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSwgaWYgaXQgaXMgc2V0LiAgWW91IGNhbiBvdmVycmlkZQorICAgICAqIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHBsdWcgeW91ciBvd24gc3RvcmFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UKKyAgICAgKiAgICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBtYXRjaAorICAgICAqICAgICAgICAgb3IgaWYgYSA8Y29kZT5udWxsPC9jb2RlPiBuYW1lIGlzIHByb3ZpZGVkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBvPWdldFByb3BlcnR5SG9vayhucywgbmFtZSwgZmFsc2UpOworICAgICAgICBpZiggbyE9IG51bGwgKSB7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmdldChuYW1lKTsKKyAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSB1c2VyIHByb3BlcnR5LCBpZiBpdCBpcyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbiB3aGljaCBjYXNlCisgICAgICogICAgICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gbWF0Y2gKKyAgICAgKiAgICAgICAgIG9yIGlmIGEgPGNvZGU+bnVsbDwvY29kZT4gbmFtZSBpcyBwcm92aWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJQcm9wZXJ0eShTdHJpbmcgbnMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBvPWdldFByb3BlcnR5SG9vayhucywgbmFtZSwgdHJ1ZSk7CisgICAgICAgIGlmKCBvIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisgICAgICAgIHJldHVybiAgdXNlclByb3BlcnRpZXMuZ2V0KG5hbWUpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWNjZXNzIHRvIHByb3BlcnR5IHRhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBhbnQgY2FsbCBhbmQgc2ltaWxhciB0YXNrcy4gSXQgc2hvdWxkIGJlCisgICAgLy8gZGVwcmVjYXRlZCwgaXQgaXMgcG9zc2libGUgdG8gdXNlIGEgYmV0dGVyICggbW9yZSBlZmZpY2llbnQgKQorICAgIC8vIG1lY2hhbmlzbSB0byBwcmVzZXJ2ZSB0aGUgY29udGV4dC4KKworICAgIC8vIFRPRE86IGRvIHdlIG5lZWQgdG8gZGVsZWdhdGUgPworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIHByb3BlcnRpZXMgdGFibGUuCisgICAgICogQHJldHVybiBhIGhhc2h0YWJsZSBjb250YWluaW5nIGFsbCBwcm9wZXJ0aWVzCisgICAgICogICAgICAgICAoaW5jbHVkaW5nIHVzZXIgcHJvcGVydGllcykuCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICBIYXNodGFibGUgcHJvcGVydGllc0NvcHkgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHByb3BlcnRpZXMua2V5cygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgT2JqZWN0IG5hbWUgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldChuYW1lKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXNDb3B5LnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBpcyBhIGJldHRlciB3YXkgdG8gc2F2ZSB0aGUgY29udGV4dC4gVGhpcyBzaG91bGRuJ3QKKyAgICAgICAgLy8gZGVsZWdhdGUgdG8gbmV4dCwgaXQncyBmb3IgYmFja3dhcmQgY29tcGF0IG9ubHkuCisKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXNDb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSB1c2VyIHByb3BlcnR5IGhhc2h0YWJsZQorICAgICAqIEByZXR1cm4gYSBoYXNodGFibGUgY29udGFpbmluZyBqdXN0IHRoZSB1c2VyIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldFVzZXJQcm9wZXJ0aWVzKCkgeworICAgICAgICBIYXNodGFibGUgcHJvcGVydGllc0NvcHkgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHVzZXJQcm9wZXJ0aWVzLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBuYW1lID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcHJvcGVydGllcy5nZXQobmFtZSk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzQ29weS5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXNDb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllcyBhbGwgdXNlciBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBub3QgYmVlbiBzZXQgb24gdGhlCisgICAgICogY29tbWFuZCBsaW5lIG9yIGEgR1VJIHRvb2wgZnJvbSB0aGlzIGluc3RhbmNlIHRvIHRoZSBQcm9qZWN0CisgICAgICogaW5zdGFuY2UgZ2l2ZW4gYXMgdGhlIGFyZ3VtZW50LgorICAgICAqCisgICAgICogPHA+VG8gY29weSBhbGwgInVzZXIiIHByb3BlcnRpZXMsIHlvdSB3aWxsIGFsc28gaGF2ZSB0byBjYWxsCisgICAgICoge0BsaW5rICNjb3B5VXNlclByb3BlcnRpZXMgY29weVVzZXJQcm9wZXJ0aWVzfS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIHByb2plY3QgdG8gY29weSB0aGUgcHJvcGVydGllcyB0by4gIE11c3Qgbm90IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlJbmhlcml0ZWRQcm9wZXJ0aWVzKFByb2plY3Qgb3RoZXIpIHsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IGluaGVyaXRlZFByb3BlcnRpZXMua2V5cygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGFyZyA9IGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKG90aGVyLmdldFVzZXJQcm9wZXJ0eShhcmcpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGluaGVyaXRlZFByb3BlcnRpZXMuZ2V0KGFyZyk7CisgICAgICAgICAgICBvdGhlci5zZXRJbmhlcml0ZWRQcm9wZXJ0eShhcmcsIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIGFsbCB1c2VyIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IG9uIHRoZSBjb21tYW5kCisgICAgICogbGluZSBvciBhIEdVSSB0b29sIGZyb20gdGhpcyBpbnN0YW5jZSB0byB0aGUgUHJvamVjdCBpbnN0YW5jZQorICAgICAqIGdpdmVuIGFzIHRoZSBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIDxwPlRvIGNvcHkgYWxsICJ1c2VyIiBwcm9wZXJ0aWVzLCB5b3Ugd2lsbCBhbHNvIGhhdmUgdG8gY2FsbAorICAgICAqIHtAbGluayAjY29weUluaGVyaXRlZFByb3BlcnRpZXMgY29weUluaGVyaXRlZFByb3BlcnRpZXN9LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdGhlciB0aGUgcHJvamVjdCB0byBjb3B5IHRoZSBwcm9wZXJ0aWVzIHRvLiAgTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29weVVzZXJQcm9wZXJ0aWVzKFByb2plY3Qgb3RoZXIpIHsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHVzZXJQcm9wZXJ0aWVzLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBhcmcgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoaW5oZXJpdGVkUHJvcGVydGllcy5jb250YWluc0tleShhcmcpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB1c2VyUHJvcGVydGllcy5nZXQoYXJnKTsKKyAgICAgICAgICAgIG90aGVyLnNldFVzZXJQcm9wZXJ0eShhcmcudG9TdHJpbmcoKSwgdmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0eSBwYXJzaW5nICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIE1vdmVkIGZyb20gUHJvamVjdEhlbHBlci4gWW91IGNhbiBvdmVycmlkZSB0aGUgc3RhdGljIG1ldGhvZCAtCisgICAgLy8gdGhpcyBpcyB1c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICggZm9yIGNvZGUgdGhhdCBjYWxscworICAgIC8vIHRoZSBwYXJzZSBtZXRob2QgaW4gUHJvamVjdEhlbHBlciApLgorCisgICAgLyoqIERlZmF1bHQgcGFyc2luZyBtZXRob2QuIEl0IGlzIGhlcmUgb25seSB0byBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdAorICAgICAqIGZvciB0aGUgc3RhdGljIFByb2plY3RIZWxwZXIucGFyc2VQcm9wZXJ0eVN0cmluZygpLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHBhcnNlUHJvcGVydHlTdHJpbmdEZWZhdWx0KFN0cmluZyB2YWx1ZSwgVmVjdG9yIGZyYWdtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBwcm9wZXJ0eVJlZnMpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IHByZXYgPSAwOworICAgICAgICBpbnQgcG9zOworICAgICAgICAvL3NlYXJjaCBmb3IgdGhlIG5leHQgaW5zdGFuY2Ugb2YgJCBmcm9tIHRoZSAncHJldicgcG9zaXRpb24KKyAgICAgICAgd2hpbGUgKChwb3MgPSB2YWx1ZS5pbmRleE9mKCIkIiwgcHJldikpID49IDApIHsKKworICAgICAgICAgICAgLy9pZiB0aGVyZSB3YXMgYW55IHRleHQgYmVmb3JlIHRoaXMsIGFkZCBpdCBhcyBhIGZyYWdtZW50CisgICAgICAgICAgICAvL1RPRE8sIHRoaXMgY2hlY2sgY291bGQgYmUgbW9kaWZpZWQgdG8gZ28gaWYgcG9zPnByZXY7CisgICAgICAgICAgICAvL3NlZW1zIGxpa2UgdGhpcyBjdXJyZW50IHZlcnNpb24gY291bGQgc3RpY2sgZW1wdHkgc3RyaW5ncworICAgICAgICAgICAgLy9pbnRvIHRoZSBsaXN0CisgICAgICAgICAgICBpZiAocG9zID4gMCkgeworICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KHZhbHVlLnN1YnN0cmluZyhwcmV2LCBwb3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgd2UgdGFjayBvbiBhICQKKyAgICAgICAgICAgIC8vdGhlbiBtb3ZlIHBhc3QgaXQKKyAgICAgICAgICAgIGlmIChwb3MgPT0gKHZhbHVlLmxlbmd0aCgpIC0gMSkpIHsKKyAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkRWxlbWVudCgiJCIpOworICAgICAgICAgICAgICAgIHByZXYgPSBwb3MgKyAxOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5jaGFyQXQocG9zICsgMSkgIT0gJ3snKSB7CisgICAgICAgICAgICAgICAgLy9wZWVrIGFoZWFkIHRvIHNlZSBpZiB0aGUgbmV4dCBjaGFyIGlzIGEgcHJvcGVydHkgb3Igbm90CisgICAgICAgICAgICAgICAgLy9ub3QgYSBwcm9wZXJ0eTogaW5zZXJ0IHRoZSBjaGFyIGFzIGEgbGl0ZXJhbAorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgZnJhZ21lbnRzLmFkZEVsZW1lbnQodmFsdWUuc3Vic3RyaW5nKHBvcyArIDEsIHBvcyArIDIpKTsKKyAgICAgICAgICAgICAgICBwcmV2ID0gcG9zICsgMjsKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQXQocG9zICsgMSkgPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgICAgIC8vYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdHdvICQgbWFwIHRvIG9uZSBtb2RlCisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KCIkIik7CisgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwb3MgKyAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vbmV3IGJlaGF2aW91cjogJFggbWFwcyB0byAkWCBmb3IgYWxsIHZhbHVlcyBvZiBYIT0nJCcKKyAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzLmFkZEVsZW1lbnQodmFsdWUuc3Vic3RyaW5nKHBvcywgcG9zICsgMikpOworICAgICAgICAgICAgICAgICAgICBwcmV2ID0gcG9zICsgMjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9wcm9wZXJ0eSBmb3VuZCwgZXh0cmFjdCBpdHMgbmFtZSBvciBiYWlsIG9uIGEgdHlwbworICAgICAgICAgICAgICAgIGludCBlbmROYW1lID0gdmFsdWUuaW5kZXhPZignfScsIHBvcyk7CisgICAgICAgICAgICAgICAgaWYgKGVuZE5hbWUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3ludGF4IGVycm9yIGluIHByb3BlcnR5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcocG9zICsgMiwgZW5kTmFtZSk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnRzLmFkZEVsZW1lbnQobnVsbCk7CisgICAgICAgICAgICAgICAgcHJvcGVydHlSZWZzLmFkZEVsZW1lbnQocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAgICBwcmV2ID0gZW5kTmFtZSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9ubyBtb3JlICQgc2lnbnMgZm91bmQKKyAgICAgICAgLy9pZiB0aGVyZSBpcyBhbnkgdGFpbCB0byB0aGUgZmlsZSwgYXBwZW5kIGl0CisgICAgICAgIGlmIChwcmV2IDwgdmFsdWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KHZhbHVlLnN1YnN0cmluZyhwcmV2KSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L1J1bnRpbWVDb25maWd1cmFibGUyLmphdmEgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9SdW50aW1lQ29uZmlndXJhYmxlMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MjJhZTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9SdW50aW1lQ29uZmlndXJhYmxlMi5qYXZhCkBAIC0wLDAgKzEsMzQ4IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuKjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlTGlzdEltcGw7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKKworLyoqCisgKiBXcmFwcGVyIGNsYXNzIHRoYXQgaG9sZHMgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gZWxlbWVudCwgaXRzIGNoaWxkcmVuLCBhbmQKKyAqIGFueSB0ZXh0IHdpdGhpbiBpdC4gSXQgdGhlbiB0YWtlcyBjYXJlIG9mIGNvbmZpZ3VyaW5nIHRoYXQgZWxlbWVudCBhdAorICogcnVudGltZS4KKyAqCisgKiBUaGlzIHVzZXMgU0FYMiBhbmQgYSBtb3JlIGZsZXhpYmxlIHN1YnN0aXR1dGlvbiBtZWNoYW5zaW0sIGJhc2VkIG9uCisgKiBvLmEudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWwuCisgKgorICovCitwdWJsaWMgY2xhc3MgUnVudGltZUNvbmZpZ3VyYWJsZTIgZXh0ZW5kcyBSdW50aW1lQ29uZmlndXJhYmxlIHsKKworICAgIC8qKiBOYW1lIG9mIHRoZSBlbGVtZW50IHRvIGNvbmZpZ3VyZS4gZWxlbWVudE5hbWUgaW4gVUUgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50VGFnID0gbnVsbDsgIAorICAgIC8qKiBMaXN0IG9mIGNoaWxkIGVsZW1lbnQgd3JhcHBlcnMuICAqLworICAgIHByaXZhdGUgVmVjdG9yIGNoaWxkcmVuID0gbmV3IFZlY3RvcigpOworICAgIC8qKiBUaGUgZWxlbWVudCB0byBjb25maWd1cmUuIHJlYWxUaGluZyBpbiBVRSAqLworICAgIHByaXZhdGUgT2JqZWN0IHdyYXBwZWRPYmplY3QgPSBudWxsOworICAgIC8qKiBYTUwgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnQuICovCisgICAgcHJpdmF0ZSBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgLyoqIFRleHQgYXBwZWFyaW5nIHdpdGhpbiB0aGUgZWxlbWVudC4gKi8KKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBjaGFyYWN0ZXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIHdyYXBwZWQgb2JqZWN0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcHJveHlDb25maWd1cmVkID0gZmFsc2U7CisKKyAgICBQcm9qZWN0IHByb2plY3Q7CisgICAgcHJvdGVjdGVkIExvY2F0aW9uIGxvY2F0aW9uID0gTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yIGNyZWF0aW5nIGEgd3JhcHBlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJveHkgVGhlIGVsZW1lbnQgdG8gY29uZmlndXJlLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZWxlbWVudFRhZyBUaGUgdGFnIG5hbWUgZ2VuZXJhdGluZyB0aGlzIGVsZW1lbnQuCisgICAgICogICAgICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVudGltZUNvbmZpZ3VyYWJsZTIoUHJvamVjdCBwcm9qZWN0LCBMb2NhdGlvbiBsb2NhdGlvbiwgT2JqZWN0IHByb3h5LCBTdHJpbmcgZWxlbWVudFRhZykgeworICAgICAgICBzdXBlciggcHJveHksIGVsZW1lbnRUYWcgKTsKKyAgICAgICAgd3JhcHBlZE9iamVjdCA9IHByb3h5OworICAgICAgICB0aGlzLmVsZW1lbnRUYWcgPSBlbGVtZW50VGFnOworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gLSBhbGwgb2JqZWN0cyBhcmUgbGF6eQorICAgICAgICBpZiggcHJveHkgaW5zdGFuY2VvZiBUYXNrICkKKyAgICAgICAgICAgICgoVGFzaylwcm94eSkuc2V0UnVudGltZUNvbmZpZ3VyYWJsZVdyYXBwZXIoIHRoaXMgKTsKKyAgICAgICAgcHJveHlDb25maWd1cmVkPWZhbHNlOworICAgIH0KKworICAgIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgfQorCisgICAgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7CisgICAgICAgIHJldHVybiBsb2NhdGlvbjsKKyAgICB9ICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGVsZW1lbnQgdG8gY29uZmlndXJlLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgcmVhbCB0eXBlIG9mCisgICAgICogYW4gZWxlbWVudCBpc24ndCBrbm93biBhdCB0aGUgdGltZSBvZiB3cmFwcGVyIGNyZWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3h5IFRoZSBlbGVtZW50IHRvIGNvbmZpZ3VyZS4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJveHkoT2JqZWN0IHByb3h5KSB7CisgICAgICAgIHdyYXBwZWRPYmplY3QgPSBwcm94eTsKKyAgICAgICAgcHJveHlDb25maWd1cmVkPWZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJveHkoKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkT2JqZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSB3cmFwcGVkIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBMaXN0IG9mIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0aGUgWE1MIGZvciB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgZWxlbWVudC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBkZXByZWNhdGVkIEl0IHNob3VsZG4ndCBiZSBjYWxsZWQgYnkgYW55b25lIGV4Y2VwdCBQcm9qZWN0SGVscGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0IGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgLy8gICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUxpc3RJbXBsKGF0dHJpYnV0ZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMyKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICB0aGlzLmF0dHJpYnV0ZXM9bmV3IEF0dHJpYnV0ZXNJbXBsKCBhdHRyaWJ1dGVzICk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhlIHdyYXBwZWQgZWxlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIEF0dHJpYnV0ZUxpc3QgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhlCisgICAgICogICAgICAgICBYTUwgZm9yIHRoaXMgZWxlbWVudC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBkZXByZWNhdGVkIG9ubHkgZm9yIGJrd2QgY29tcGF0aWJpbGl0eQorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGVMaXN0IGdldEF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBzYXgxQXR0cmlidXRlcyggYXR0cmlidXRlcyApOworICAgIH0KKworICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMyKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZUxpc3Qgc2F4MUF0dHJpYnV0ZXMoIEF0dHJpYnV0ZXMgc2F4MkF0dCApIHsKKyAgICAgICAgQXR0cmlidXRlTGlzdEltcGwgc2F4MUF0dD1uZXcgQXR0cmlidXRlTGlzdEltcGwoKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IHNheDJBdHQuZ2V0TGVuZ3RoKCk7CisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJBdHRyaWJ1dGVzOiAiICsgc2F4MkF0dC5nZXRRTmFtZShpKSArICIgIiArCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHNheDJBdHQuZ2V0VmFsdWUoaSkpOworICAgICAgICAgICAgICAgIHNheDFBdHQuYWRkQXR0cmlidXRlKCBzYXgyQXR0LmdldFFOYW1lKGkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F4MkF0dC5nZXRUeXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXgyQXR0LmdldFZhbHVlKGkpKTsKKyAgICAgICAgICAgIH0KKwl9CisgICAgICAgIHJldHVybiBzYXgxQXR0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjaGlsZCBlbGVtZW50IHRvIHRoZSB3cmFwcGVkIGVsZW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBjaGlsZCBlbGVtZW50IHdyYXBwZXIgdG8gYWRkIHRvIHRoaXMgb25lLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChSdW50aW1lQ29uZmlndXJhYmxlIGNoaWxkKSB7CisgICAgICAgIC8vIGFkZENoaWxkKCBVbmtub3duRWxlbWVudCApIGluIFVFCisgICAgICAgIGNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNoaWxkIHdyYXBwZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB3aXRoaW4gdGhlIGxpc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gcmV0dXJuLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGNoaWxkIHdyYXBwZXIgYXQgcG9zaXRpb24gPGNvZGU+aW5kZXg8L2NvZGU+IHdpdGhpbiB0aGUKKyAgICAgKiAgICAgICAgIGxpc3QuCisgICAgICovCisgICAgcHVibGljIFJ1bnRpbWVDb25maWd1cmFibGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiAoUnVudGltZUNvbmZpZ3VyYWJsZSkgY2hpbGRyZW4uZWxlbWVudEF0KGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGNoYXJhY3RlcnMgZnJvbSAjUENEQVRBIGFyZWFzIHRvIHRoZSB3cmFwcGVkIGVsZW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGRhdGEgVGV4dCB0byBhZGQgdG8gdGhlIHdyYXBwZWQgZWxlbWVudC4gCisgICAgICogICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgZGF0YSkgeworICAgICAgICBjaGFyYWN0ZXJzLmFwcGVuZChkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGNoYXJhY3RlcnMgZnJvbSAjUENEQVRBIGFyZWFzIHRvIHRoZSB3cmFwcGVkIGVsZW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZiBBIGNoYXJhY3RlciBhcnJheSBvZiB0aGUgdGV4dCB3aXRoaW4gdGhlIGVsZW1lbnQuCisgICAgICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KKyAgICAgKiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50KSB7CisgICAgICAgIGFkZFRleHQobmV3IFN0cmluZyhidWYsIHN0YXJ0LCBjb3VudCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhZyBuYW1lIG9mIHRoZSB3cmFwcGVkIGVsZW1lbnQuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgdGFnIG5hbWUgb2YgdGhlIHdyYXBwZWQgZWxlbWVudC4gVGhpcyBpcyB1bmxpa2VseQorICAgICAqICAgICAgICAgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4sIGJ1dCBtYXkgYmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGFnKCkgeworICAgICAgICAvLyBnZXRUYWcgaW4gVUUKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRUYWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGUgd3JhcHBlZCBlbGVtZW50IGFuZCBhbGwgaXRzIGNoaWxkcmVuLgorICAgICAqIFRoZSBhdHRyaWJ1dGVzIGFuZCB0ZXh0IGZvciB0aGUgd3JhcHBlZCBlbGVtZW50IGFyZSBjb25maWd1cmVkLAorICAgICAqIGFuZCB0aGVuIGVhY2ggY2hpbGQgaXMgY29uZmlndXJlZCBhbmQgYWRkZWQuIEVhY2ggdGltZSB0aGUKKyAgICAgKiB3cmFwcGVyIGlzIGNvbmZpZ3VyZWQsIHRoZSBhdHRyaWJ1dGVzIGFuZCB0ZXh0IGZvciBpdCBhcmUKKyAgICAgKiByZXNldC4KKyAgICAgKiAKKyAgICAgKiBJZiB0aGUgZWxlbWVudCBoYXMgYW4gPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSwgYSByZWZlcmVuY2UKKyAgICAgKiBpcyBhZGRlZCB0byB0aGUgcHJvamVjdCBhcyB3ZWxsLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwIFRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHdyYXBwZWQgZWxlbWVudC4gCisgICAgICogICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBmYWlscywgZm9yIGluc3RhbmNlIGR1ZQorICAgICAqICAgICAgICAgICAgdG8gaW52YWxpZCBhdHRyaWJ1dGVzIG9yIGNoaWxkcmVuLCBvciB0ZXh0IGJlaW5nIGFkZGVkIHRvCisgICAgICogICAgICAgICAgICBhbiBlbGVtZW50IHdoaWNoIGRvZXNuJ3QgYWNjZXB0IGl0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1heWJlQ29uZmlndXJlKFByb2plY3QgcCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgbWF5YmVDb25maWd1cmUocCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGUgd3JhcHBlZCBlbGVtZW50LiAgVGhlIGF0dHJpYnV0ZXMgYW5kIHRleHQgZm9yCisgICAgICogdGhlIHdyYXBwZWQgZWxlbWVudCBhcmUgY29uZmlndXJlZC4gIEVhY2ggdGltZSB0aGUgd3JhcHBlciBpcworICAgICAqIGNvbmZpZ3VyZWQsIHRoZSBhdHRyaWJ1dGVzIGFuZCB0ZXh0IGZvciBpdCBhcmUgcmVzZXQuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZWxlbWVudCBoYXMgYW4gPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSwgYSByZWZlcmVuY2UKKyAgICAgKiBpcyBhZGRlZCB0byB0aGUgcHJvamVjdCBhcyB3ZWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHAgVGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgd3JhcHBlZCBlbGVtZW50LgorICAgICAqICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZ3VyZUNoaWxkcmVuIFdoZXRoZXIgdG8gY29uZmlndXJlIGNoaWxkIGVsZW1lbnRzIGFzCisgICAgICogd2VsbC4gIGlmIHRydWUsIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgY29uZmlndXJlZCBhZnRlciB0aGUKKyAgICAgKiB3cmFwcGVkIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb25maWd1cmF0aW9uIGZhaWxzLCBmb3IgaW5zdGFuY2UgZHVlCisgICAgICogICAgICAgICAgICB0byBpbnZhbGlkIGF0dHJpYnV0ZXMgb3IgY2hpbGRyZW4sIG9yIHRleHQgYmVpbmcgYWRkZWQgdG8KKyAgICAgKiAgICAgICAgICAgIGFuIGVsZW1lbnQgd2hpY2ggZG9lc24ndCBhY2NlcHQgaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWF5YmVDb25maWd1cmUoUHJvamVjdCBwLCBib29sZWFuIGNvbmZpZ3VyZUNoaWxkcmVuKSAKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKKworICAgICAgICBpZiggcHJveHlDb25maWd1cmVkICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFByb3BlcnR5SGVscGVyIHBoPVByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHApOworCisgICAgICAgIE9iamVjdCB0YXJnZXQ9KHdyYXBwZWRPYmplY3QgaW5zdGFuY2VvZiBUYXNrQWRhcHRlcikgPworICAgICAgICAgICAgICAgICgoVGFza0FkYXB0ZXIpd3JhcHBlZE9iamVjdCkuZ2V0UHJveHkoKSA6IHdyYXBwZWRPYmplY3Q7CisKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9CisgICAgICAgICAgICAgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKHRhcmdldC5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHAuYWRkQnVpbGRMaXN0ZW5lciggaWggKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZT0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWU9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7CisKKyAgICAgICAgICAgICAgICAvLyByZWZsZWN0IHRoZXNlIGludG8gdGhlIHRhcmdldAorICAgICAgICAgICAgICAgIHZhbHVlID0gcGgucmVwbGFjZVByb3BlcnRpZXMobnVsbCwgdmFsdWUsIHAuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlkIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBleHRlcm5hbGx5CisgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5lcXVhbHMoImlkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGJlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOworICAgICAgICAgICAgLy8gTm8gd2F5IC0gdGhpcyB3aWxsIGJlIHVzZWQgb24gZnV0dXJlIGNhbGxzICggaWYgdGhlIHRhc2sgaXMgdXNlZAorICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXM6IGF0dHJpYnV0ZXMgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChjaGFyYWN0ZXJzLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgIFByb2plY3RIZWxwZXIuYWRkVGV4dChwLCB3cmFwcGVkT2JqZWN0LCBjaGFyYWN0ZXJzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBjaGlsZHJlbi5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZTIgY2hpbGQgCisgICAgICAgICAgICAgICAgPSAoUnVudGltZUNvbmZpZ3VyYWJsZTIpIGVudW0ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChjaGlsZC53cmFwcGVkT2JqZWN0IGluc3RhbmNlb2YgVGFzaykgeworICAgICAgICAgICAgICAgIFRhc2sgY2hpbGRUYXNrID0gKFRhc2spIGNoaWxkLndyYXBwZWRPYmplY3Q7CisgICAgICAgICAgICAgICAgY2hpbGRUYXNrLnNldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyKGNoaWxkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbmZpZ3VyZUNoaWxkcmVuKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLndyYXBwZWRPYmplY3QgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIFRhc2sgY2hpbGRUYXNrID0gKFRhc2spIGNoaWxkLndyYXBwZWRPYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkVGFzay5tYXliZUNvbmZpZ3VyZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1heWJlQ29uZmlndXJlKHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQcm9qZWN0SGVscGVyLnN0b3JlQ2hpbGQocCwgd3JhcHBlZE9iamVjdCwgY2hpbGQud3JhcHBlZE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0RWxlbWVudFRhZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBwLmFkZFJlZmVyZW5jZShpZCwgd3JhcHBlZE9iamVjdCk7CisgICAgICAgICAgICBwLmdldFJlZmVyZW5jZXMoKS5wdXQoIGlkLCB3cmFwcGVkT2JqZWN0ICk7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiWFhYIHVwZGF0aW5nIHJlZmVyZW5jZSAiICsgdGhpcyArICIgIiArIGlkICsgIiAiICsgd3JhcHBlZE9iamVjdCApOworICAgICAgICB9CisKKyAgICAgICAgcHJveHlDb25maWd1cmVkID0gdHJ1ZTsgCisgICB9CisKKworCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Vbmtub3duRWxlbWVudDIuamF2YSBiL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vua25vd25FbGVtZW50Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjczZGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Vbmtub3duRWxlbWVudDIuamF2YQpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvLyBYWFggVXNlIHRoaXMgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIGFkYXB0ZXIgIQorCisvKioKKyAqIFdyYXBwZXIgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSB0YXNrCisgKiBvciBkYXRhIHR5cGUuCisgKgorICogV2l0aCBQSDIsIGFsbCBjb21wb25lbnRzIHdpbGwgYmUgd3JhcHBlZC4gTG9uZyB0ZXJtIHdlIHNob3VsZCBjb25zb2xpZGF0ZQorICogVW5rbmRvd25FbGVtZW50IGFuZCBSdW50aW1lQ29uZmlndXJhYmxlLgorICogCisgKgorICogQGRlcHJlY2F0ZWQgQWxsIHRhc2tzIHdpbGwgYmUgbGF6aWx5IGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQgYmVmb3JlIGV4ZWN1dGlvbi4KKyAqICAgICAgIFRoZSB4bWwgcmVhZGVyIHdpbGwgY3JlYXRlIGEgdHJlZSBvZiBSdW50aW1lQ29uZmlndXJhYmxlLCBhbmQgdGFza3Mgd2lsbAorICogICAgICAgYmUgY29uc3RydWN0ZWQgKCBhbmQgcmVjb25zdHJ1Y3RlZCBmb3IgbG9vcHMgKSBqdXN0IGJlZm9yZSBleGVjdXRpb24uIFRoZQorICogICAgICAgVW5rbm9ud25FbGVtZW50IGNvbnN0cnVjdCBpcyBubyBsb25nZXIgbmVlZGVkLgorICovCitwdWJsaWMgY2xhc3MgVW5rbm93bkVsZW1lbnQyIGV4dGVuZHMgVW5rbm93bkVsZW1lbnQgeworCisgICAgLyoqCisgICAgICogSG9sZHMgdGhlIG5hbWUgb2YgdGhlIHRhc2svdHlwZSBvciBuZXN0ZWQgY2hpbGQgZWxlbWVudCBvZiBhCisgICAgICogdGFzay90eXBlIHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZCBhdCBwYXJzZXIgdGltZSBvciBoYXMKKyAgICAgKiBiZWVuIHJlZGVmaW5lZCBzaW5jZSBvcmlnaW5hbCBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSByZWFsIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBsb2FkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgcmVhbFRoaW5nOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBjaGlsZCBlbGVtZW50cyAoVW5rbm93bkVsZW1lbnRzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBjaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gVW5rbm93bkVsZW1lbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIHVua25vd24gZWxlbWVudC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFVua25vd25FbGVtZW50MihTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgc3VwZXIoIGVsZW1lbnROYW1lICk7CisgICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBYTUwgZWxlbWVudCB3aGljaCBnZW5lcmF0ZWQgdGhpcyB1bmtub3duCisgICAgICogZWxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIFhNTCBlbGVtZW50IHdoaWNoIGdlbmVyYXRlZCB0aGlzIHVua25vd24KKyAgICAgKiAgICAgICAgIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUnVudGltZUNvbmZpZ3VyYWJsZSBnZXRXcmFwcGVyKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUnVudGltZUNvbmZpZ3VyYWJsZTIgZ2V0V3JhcHBlcjIoKSB7CisgICAgICAgIHJldHVybiAoUnVudGltZUNvbmZpZ3VyYWJsZTIpd3JhcHBlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIHJlYWwgb2JqZWN0IGluc3RhbmNlIGFuZCBjaGlsZCBlbGVtZW50cywgdGhlbiBjb25maWd1cmVzCisgICAgICogdGhlIGF0dHJpYnV0ZXMgYW5kIHRleHQgb2YgdGhlIHJlYWwgb2JqZWN0LiBUaGlzIHVua25vd24gZWxlbWVudAorICAgICAqIGlzIHRoZW4gcmVwbGFjZWQgd2l0aCB0aGUgcmVhbCBvYmplY3QgaW4gdGhlIGNvbnRhaW5pbmcgdGFyZ2V0J3MgbGlzdAorICAgICAqIG9mIGNoaWxkcmVuLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBmYWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1heWJlQ29uZmlndXJlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvamVjdENvbXBvbmVudEhlbHBlciBoZWxwZXI9UHJvamVjdENvbXBvbmVudEhlbHBlci5nZXRQcm9qZWN0Q29tcG9uZW50SGVscGVyKCk7CisgICAgICAgIC8vIFVzZWQgdG8gYmU6IG1ha2VPYmplY3QodGhpcywgZ2V0V3JhcHBlcjIoKSk7CisgICAgICAgIHJlYWxUaGluZyA9IGhlbHBlci5jcmVhdGVQcm9qZWN0Q29tcG9uZW50KCB0aGlzLCBnZXRQcm9qZWN0KCksIG51bGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWcoKSk7CisgICAgICAgIGlmIChyZWFsVGhpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgZ2V0Tm90Rm91bmRFeGNlcHRpb24oInRhc2sgb3IgdHlwZSIsIHRoaXMuZ2V0VGFnKCkpOworICAgICAgICB9CisKKyAgICAgICAgZ2V0V3JhcHBlcjIoKS5zZXRQcm94eShyZWFsVGhpbmcpOworCisgICAgICAgIGlmIChyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICBUYXNrIHRhc2s9KFRhc2spcmVhbFRoaW5nOworICAgICAgICAgICAgdGFzay5zZXRMb2NhdGlvbih0aGlzLmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgLy8gVW5rbm93bkVsZW1lbnQgYWx3YXlzIGhhcyBhbiBhc3NvY2lhdGVkIHRhcmdldAorICAgICAgICAgICAgdGFzay5zZXRPd25pbmdUYXJnZXQodGhpcy5nZXRPd25pbmdUYXJnZXQoKSk7CisgICAgICAgICAgICB0YXNrLmluaXQoKTsKKyAgICAgICAgICAgIHRhc2suc2V0UnVudGltZUNvbmZpZ3VyYWJsZVdyYXBwZXIoZ2V0V3JhcHBlcjIoKSk7CisKKyAgICAgICAgICAgIC8vIEZvciBTY3JpcHQgdG8gd29yay4gVWdseQorICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZSBpcyByZXBsYWNlZCBieSBSdW50aW1lQ29uZmlndXJhYmxlCisgICAgICAgICAgICB0aGlzLmdldE93bmluZ1RhcmdldCgpLnJlcGxhY2VDaGlsZCh0aGlzLCAoVGFzaylyZWFsVGhpbmcpOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlQ2hpbGRyZW4ocmVhbFRoaW5nLCBnZXRXcmFwcGVyMigpKTsKKworICAgICAgICBnZXRXcmFwcGVyMigpLm1heWJlQ29uZmlndXJlKGdldFByb2plY3QoKSk7CisKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgb3V0cHV0IHNlbnQgdG8gU3lzdGVtLm91dCBieSB0aGlzIHRhc2sgb3IgaXRzIHJlYWwgdGFzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIG9mIG91dHB1dCB0byBsb2cuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBsaW5lKSB7CisgICAgICAgIGlmIChyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICAoKFRhc2spIHJlYWxUaGluZykuaGFuZGxlT3V0cHV0KGxpbmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuaGFuZGxlT3V0cHV0KGxpbmUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlcyBlcnJvciBvdXRwdXQgc2VudCB0byBTeXN0ZW0uZXJyIGJ5IHRoaXMgdGFzayBvciBpdHMgcmVhbCB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUgVGhlIGVycm9yIGxpbmUgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yT3V0cHV0KFN0cmluZyBsaW5lKSB7CisgICAgICAgIGlmIChyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICAoKFRhc2spIHJlYWxUaGluZykuaGFuZGxlRXJyb3JPdXRwdXQobGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVFcnJvck91dHB1dChsaW5lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSByZWFsIG9iamVjdCBpZiBpdCdzIGEgdGFzay4gSWYgaXQncyBub3QgYSB0YXNrCisgICAgICogKGUuZy4gYSBkYXRhIHR5cGUpIHRoZW4gdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIGlmIChyZWFsVGhpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcGxhaW4gaW1wb3NzaWJsZSB0byBnZXQgaGVyZSwgbWF5YmVDb25maWd1cmUgc2hvdWxkCisgICAgICAgICAgICAvLyBoYXZlIHRocm93biBhbiBleGNlcHRpb24uCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgdGFzayBvZiB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50TmFtZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhbFRoaW5nIGluc3RhbmNlb2YgVGFzaykgeworICAgICAgICAgICAgKChUYXNrKSByZWFsVGhpbmcpLmV4ZWN1dGUoKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aGUgdGFzayB3aWxsIG5vdCBiZSByZXVzZWQgKCBhIG5ldyBpbml0KCkgd2lsbCBiZSBjYWxsZWQgKQorICAgICAgICAvLyBMZXQgR0MgZG8gaXRzIGpvYgorICAgICAgICByZWFsVGhpbmc9bnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY2hpbGQgZWxlbWVudCB0byB0aGlzIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIGNoaWxkIGVsZW1lbnQgdG8gYWRkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChVbmtub3duRWxlbWVudCBjaGlsZCkgeworICAgICAgICBjaGlsZHJlbi5hZGRFbGVtZW50KGNoaWxkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGNoaWxkIGVsZW1lbnRzLCBjcmVhdGVzIGNoaWxkcmVuIG9mIHRoZSBjaGlsZHJlbgorICAgICAqIChyZWN1cnNpdmVseSksIGFuZCBzZXRzIGF0dHJpYnV0ZXMgb2YgdGhlIGNoaWxkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgY29uZmlndXJlZCBvYmplY3QgZm9yIHRoZSBwYXJlbnQuCisgICAgICogICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRXcmFwcGVyIFRoZSB3cmFwcGVyIGNvbnRhaW5pbmcgY2hpbGQgd3JhcHBlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjb25maWd1cmVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBhbnkgY2hpbGRyZW4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjaGlsZHJlbiBjYW5ub3QgYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGlsZHJlbihPYmplY3QgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgcGFyZW50V3JhcHBlcikKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVGFza0FkYXB0ZXIpIHsKKyAgICAgICAgICAgIHBhcmVudCA9ICgoVGFza0FkYXB0ZXIpIHBhcmVudCkuZ2V0UHJveHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIENsYXNzIHBhcmVudENsYXNzID0gcGFyZW50LmdldENsYXNzKCk7CisgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIgaWggPSBJbnRyb3NwZWN0aW9uSGVscGVyLmdldEhlbHBlcihwYXJlbnRDbGFzcyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgY2hpbGRXcmFwcGVyID0gcGFyZW50V3JhcHBlci5nZXRDaGlsZChpKTsKKyAgICAgICAgICAgIFVua25vd25FbGVtZW50IGNoaWxkID0gKFVua25vd25FbGVtZW50KSBjaGlsZHJlbi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBPYmplY3QgcmVhbENoaWxkID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhc2tDb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICBQcm9qZWN0Q29tcG9uZW50SGVscGVyIGhlbHBlcj1Qcm9qZWN0Q29tcG9uZW50SGVscGVyLmdldFByb2plY3RDb21wb25lbnRIZWxwZXIoKTsKKyAgICAgICAgICAgICAgICAvLyBVc2VkIHRvIGJlOiBtYWtlVGFzayhjaGlsZCwgY2hpbGRXcmFwcGVyLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmVhbENoaWxkID0gaGVscGVyLmNyZWF0ZVByb2plY3RDb21wb25lbnQoIGNoaWxkLCBnZXRQcm9qZWN0KCksIG51bGwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRUYWcoKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlYWxDaGlsZCA9PSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBnZXROb3RGb3VuZEV4Y2VwdGlvbigidGFzayIsIGNoaWxkLmdldFRhZygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBYWFggRGF0YVR5cGVzIHdpbGwgYmUgd3JhcHBlZCBvciB0cmVhdGVkIGxpa2Ugbm9ybWFsIGNvbXBvbmVudHMgCisgICAgICAgICAgICAgICAgaWYoIHJlYWxDaGlsZCBpbnN0YW5jZW9mIFRhc2sgKSB7CisgICAgICAgICAgICAgICAgICAgICgoVGFza0NvbnRhaW5lcikgcGFyZW50KS5hZGRUYXNrKChUYXNrKSByZWFsQ2hpbGQpOworICAgICAgICAgICAgICAgICAgICBUYXNrIHRhc2s9KFRhc2spcmVhbENoaWxkOworICAgICAgICAgICAgICAgICAgICB0YXNrLnNldExvY2F0aW9uKGNoaWxkLmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duRWxlbWVudCBhbHdheXMgaGFzIGFuIGFzc29jaWF0ZWQgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgIHRhc2suc2V0T3duaW5nVGFyZ2V0KHRoaXMuZ2V0T3duaW5nVGFyZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB0YXNrLmluaXQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGF0ID8gQWRkIGRhdGEgdHlwZSA/IGNyZWF0ZUVsZW1lbnQgPworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSW50cm9zcGVjdGlvbi1iYXNlZCB0YXNrIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgcmVhbENoaWxkID0gaWguY3JlYXRlRWxlbWVudChnZXRQcm9qZWN0KCksIHBhcmVudCwgY2hpbGQuZ2V0VGFnKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGlsZFdyYXBwZXIuc2V0UHJveHkocmVhbENoaWxkKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBUYXNrQ29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgKChUYXNrKSByZWFsQ2hpbGQpLnNldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyKGNoaWxkV3JhcHBlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoaWxkLmhhbmRsZUNoaWxkcmVuKHJlYWxDaGlsZCwgY2hpbGRXcmFwcGVyKTsKKworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhc2tDb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICAoKFRhc2spIHJlYWxDaGlsZCkubWF5YmVDb25maWd1cmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIG5vIGxvbmdlciB1c2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBtYWtlT2JqZWN0KFVua25vd25FbGVtZW50IHVlLCBSdW50aW1lQ29uZmlndXJhYmxlIHcpIHsKKyAgICAgICAgLypERUJVRyovIHRyeSB7dGhyb3cgbmV3IEV4Y2VwdGlvbigpOyB9IGNhdGNoKEV4Y2VwdGlvbiBleCkge2V4LnByaW50U3RhY2tUcmFjZSgpO30KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgbm8gbG9uZ2VyIHVzZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGFzayBtYWtlVGFzayhVbmtub3duRWxlbWVudCB1ZSwgUnVudGltZUNvbmZpZ3VyYWJsZSB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb25Ub3BMZXZlbCkgeworICAgICAgICAvKkRFQlVHKi8gdHJ5IHt0aHJvdyBuZXcgRXhjZXB0aW9uKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7ZXgucHJpbnRTdGFja1RyYWNlKCk7fQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgdG8gdXNlIGluIGxvZ2dpbmcgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIHRvIHVzZSBpbiBsb2dnaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFza05hbWUoKSB7CisgICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsgLy8gY2xlYW5lciwgd29ya3MgZm9yIGV2ZXJ5dGhpbmcKKyAgICAgICAgLy8gICAgICAgICByZXR1cm4gcmVhbFRoaW5nID09IG51bGwgfHwgIShyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSA/CisgICAgICAgIC8vICAgICAgICAgICAgIHN1cGVyLmdldFRhc2tOYW1lKCkgOiAoKFRhc2spIHJlYWxUaGluZykuZ2V0VGFza05hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFdyYXBwZWQoKSB7CisgICAgICAgIHJldHVybiByZWFsVGhpbmc7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHJldHVybnMgdGhlIHRhc2sgaW5zdGFuY2UgYWZ0ZXIgaXQgaGFzIGJlZW4gY3JlYXRlZCBhbmQgaWYgaXQgaXMgYSB0YXNrLgorICAgICAqCisgICAgICogQHJldHVybiBhIHRhc2sgaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlYWwgb2JqZWN0IGlzIG5vdAorICAgICAqICAgICAgICAgYSB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyBUYXNrIGdldFRhc2soKSB7CisgICAgICAgIGlmIChyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICByZXR1cm4gKFRhc2spIHJlYWxUaGluZzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30vLyBVbmtub3duRWxlbWVudApkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1Byb2plY3RIZWxwZXJJbXBsMi5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1Byb2plY3RIZWxwZXJJbXBsMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNmUxMzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvUHJvamVjdEhlbHBlckltcGwyLmphdmEKQEAgLTAsMCArMSwxMTkyIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7CitpbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOworCitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJBZGFwdGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVMaXN0SW1wbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSkFYUFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFNheDIgYmFzZWQgcHJvamVjdCByZWFkZXIKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9qZWN0SGVscGVySW1wbDIgZXh0ZW5kcyBQcm9qZWN0SGVscGVyIHsKKyAgICAvKiBTdGF0ZWxlc3MgKi8KKworICAgIC8vIHNpbmdsZXRvbnMgLSBzaW5jZSBhbGwgc3RhdGUgaXMgaW4gdGhlIGNvbnRleHQKKyAgICBzdGF0aWMgQW50SGFuZGxlciBlbGVtZW50SGFuZGxlcj1uZXcgRWxlbWVudEhhbmRsZXIoKTsKKyAgICBzdGF0aWMgQW50SGFuZGxlciB0YXJnZXRIYW5kbGVyPW5ldyBUYXJnZXRIYW5kbGVyKCk7CisgICAgc3RhdGljIEFudEhhbmRsZXIgbmVzdGVkRWxlbWVudEhhbmRsZXI9bmV3IE5lc3RlZEVsZW1lbnRIYW5kbGVyKCk7CisgICAgc3RhdGljIEFudEhhbmRsZXIgbWFpbkhhbmRsZXI9bmV3IE1haW5IYW5kbGVyKCk7CisgICAgc3RhdGljIEFudEhhbmRsZXIgcHJvamVjdEhhbmRsZXI9bmV3IFByb2plY3RIYW5kbGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBoZWxwZXIgZm9yIHBhdGggLSZndDsgVVJJIGFuZCBVUkkgLSZndDsgcGF0aCBjb252ZXJzaW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlVXRpbHMgZnUgPSBGaWxlVXRpbHMubmV3RmlsZVV0aWxzKCk7CisKKyAgICAvKiogTWV0aG9kIHRvIGFkZCBzZXZlcmFsICdzcGVjaWFsJyB0YXNrcyB0aGF0IGFyZSBzcGVjaWZpYworICAgICAqICB0byB0aGlzIGhlbHBlci4gSW4gZnV0dXJlIHdlIGNvdWxkIHVzZSB0aGUgcHJvcGVydGllcyBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGhvb2tTcGVjaWFsVGFza3MoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjPUNsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlN5c3RlbVBhdGgiKTsKKyAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQKKyAgICAgICAgICAgIHByb2plY3QuYWRkVGFza0RlZmluaXRpb24oICJzeXN0ZW1QYXRoIiAsIGMgKTsKKyAgICAgICAgICAgIC8vIHRoZSBuZXcgbmFtZSAoIGluIGFudDE2ICkKKyAgICAgICAgICAgIHByb2plY3QuYWRkVGFza0RlZmluaXRpb24oICJjbGFzc2xvYWRlciIgLCBjICk7CisKKyAgICAgICAgICAgIGM9Q2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGVzY3JpcHRpb24iKTsKKyAgICAgICAgICAgIHByb2plY3QuYWRkVGFza0RlZmluaXRpb24oICJkZXNjcmlwdGlvbiIgLCBjICk7CisgICAgICAgICAgICBjPUNsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkltcG9ydCIpOworICAgICAgICAgICAgcHJvamVjdC5hZGRUYXNrRGVmaW5pdGlvbiggImltcG9ydCIgLCBjICk7CisgICAgICAgICAgICBjPUNsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRhc2tkZWYyIik7CisgICAgICAgICAgICBwcm9qZWN0LmFkZFRhc2tEZWZpbml0aW9uKCAidGFza2RlZiIgLCBjICk7CisvLyAgICAgICAgICAgICAgdHJ5IHsKKy8vICAgICAgICAgICAgICAgICBUYXNrIHQ9bmV3IFRhc2tEaXNjb3ZlcnkoKTsKKy8vICAgICAgICAgICAgICAgICB0LnNldFByb2plY3QocHJvamVjdCk7CisvLyAgICAgICAgICAgICAgICAgdC5leGVjdXRlKCk7CisvLyAgICAgICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisvLyAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYW4ndCBsb2FkIFRhc2tEaXNjb3ZlcnkgIiArIGV4ICk7CisvLyAgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorCisgICAgcHVibGljIHZvaWQgcGFyc2UoUHJvamVjdCBwcm9qZWN0LCBPYmplY3Qgc291cmNlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBob29rU3BlY2lhbFRhc2tzKHByb2plY3QpOworICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQ9bmV3IEFudFhtbENvbnRleHQocHJvamVjdCwgdGhpcyk7CisgICAgICAgIAorICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSggImFudC5wYXJzaW5nLmNvbnRleHQiLCBjb250ZXh0ICk7CisKKyAgICAgICAgcGFyc2UocHJvamVjdCwgc291cmNlLG5ldyBSb290SGFuZGxlcihjb250ZXh0KSk7CisKKyAgICAgICAgLy8gWFhYIEhvdyB0byBkZWFsIHdpdGggZGVzY3JpcHRpb24gPz8KKyAgICAgICAgY29udGV4dC5pbXBsaWNpdFRhcmdldC5leGVjdXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBwcm9qZWN0IGZpbGUsIGNvbmZpZ3VyaW5nIHRoZSBwcm9qZWN0IGFzIGl0IGdvZXMuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIG9yIGNhbm5vdCAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZShQcm9qZWN0IHByb2plY3QsIE9iamVjdCBzb3VyY2UsIFJvb3RIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQ9aGFuZGxlci5jb250ZXh0OworCisgICAgICAgIGlmKHNvdXJjZSBpbnN0YW5jZW9mIEZpbGUpIHsKKyAgICAgICAgICAgIGNvbnRleHQuYnVpbGRGaWxlPShGaWxlKXNvdXJjZTsKKy8vICAgICAgICAgfSBlbHNlIGlmKCBzb3VyY2UgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSApIHsKKy8vICAgICAgICAgfSBlbHNlIGlmKCBzb3VyY2UgaW5zdGFuY2VvZiBVUkwgKSB7CisvLyAgICAgICAgIH0gZWxzZSBpZiggc291cmNlIGluc3RhbmNlb2YgSW5wdXRTb3VyY2UgKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJTb3VyY2UgIiArIHNvdXJjZS5nZXRDbGFzcygpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsdWdpbiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbnVsbDsKKworICAgICAgICBjb250ZXh0LmJ1aWxkRmlsZSA9IG5ldyBGaWxlKGNvbnRleHQuYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgY29udGV4dC5idWlsZEZpbGVQYXJlbnQgPSBuZXcgRmlsZShjb250ZXh0LmJ1aWxkRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTQVggMiBzdHlsZSBwYXJzZXIgdXNlZCB0byBwYXJzZSB0aGUgZ2l2ZW4gZmlsZS4gCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnRleHQucGFyc2VyID1KQVhQVXRpbHMuZ2V0WE1MUmVhZGVyKCk7CisKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSBQcm9qZWN0SGVscGVySW1wbDIudG9VUkkoY29udGV4dC5idWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgICAgICAvL1N0cmluZyB1cmkgPSAiZmlsZToiICsgY29udGV4dC5idWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICAgICAgLy9mb3IgKGludCBpbmRleCA9IHVyaS5pbmRleE9mKCcjJyk7IGluZGV4ICE9IC0xOyBpbmRleCA9IHVyaS5pbmRleE9mKCcjJykpIHsKKyAgICAgICAgICAgIC8vICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIiUyMyIgKyB1cmkuc3Vic3RyaW5nKGluZGV4KzEpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb250ZXh0LmJ1aWxkRmlsZSk7CisgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBpbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZCh1cmkpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQYXJzaW5nIHdpdGggUEgyOiAiICsgY29udGV4dC5idWlsZEZpbGUpOworICAgICAgICAgICAgcHJvamVjdC5sb2coInBhcnNpbmcgYnVpbGRmaWxlICIgKyBjb250ZXh0LmJ1aWxkRmlsZSArICIgd2l0aCBVUkkgPSAiICsgdXJpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgRGVmYXVsdEhhbmRsZXIgaGIgPSBoYW5kbGVyOworCisgICAgICAgICAgICBjb250ZXh0LnBhcnNlci5zZXRDb250ZW50SGFuZGxlcihoYik7CisgICAgICAgICAgICBjb250ZXh0LnBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihoYik7CisgICAgICAgICAgICBjb250ZXh0LnBhcnNlci5zZXRFcnJvckhhbmRsZXIoaGIpOworICAgICAgICAgICAgY29udGV4dC5wYXJzZXIuc2V0RFRESGFuZGxlcihoYik7CisgICAgICAgICAgICBjb250ZXh0LnBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSk7CisgICAgICAgIH0gY2F0Y2goU0FYUGFyc2VFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9CisgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uKGV4Yy5nZXRTeXN0ZW1JZCgpLCBleGMuZ2V0TGluZU51bWJlcigpLCBleGMuZ2V0Q29sdW1uTnVtYmVyKCkpOworCisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGV4Yy5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBCdWlsZEV4Y2VwdGlvbiBiZSA9IChCdWlsZEV4Y2VwdGlvbikgdDsKKyAgICAgICAgICAgICAgICBpZiAoYmUuZ2V0TG9jYXRpb24oKSA9PSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGJlLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgYmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpLCB0LCBsb2NhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goU0FYRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBleGMuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4Yy5nZXRNZXNzYWdlKCksIHQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRW5jb2Rpbmcgb2YgcHJvamVjdCBmaWxlIGlzIGludmFsaWQuIixleGMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIHByb2plY3QgZmlsZTogIiArZXhjLmdldE1lc3NhZ2UoKSwgZXhjKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjb21tb24gc3VwZXJjbGFzcyBmb3IgYWxsIFNBWCBldmVudCBoYW5kbGVycyB1c2VkIHRvIHBhcnNlCisgICAgICogdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gCisgICAgICoKKyAgICAgKiBUaGUgY29udGV4dCB3aWxsIGhvbGQgYWxsIHN0YXRlIGluZm9ybWF0aW9uLiBBdCBlYWNoIHRpbWUKKyAgICAgKiB0aGVyZSBpcyBvbmUgYWN0aXZlIGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQuIEl0IGNhbgorICAgICAqIHVzZSBvblN0YXJ0Q2hpbGQoKSB0byBzZXQgYW4gYWx0ZXJuYXRlIGhhbmRsZXIgZm9yIHRoZSBjaGlsZC4KKyAgICAgKi8gCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbnRIYW5kbGVyICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LiBUaGlzIGJhc2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLiAKKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiAKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiwgb3IgaW4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG9mIGVycm9yIGluIGFuIG92ZXJyaWRkZW4gdmVyc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgU3RyaW5nIHFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQuIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBqdXN0CisgICAgICAgICAqIHRocm93cyBhbiBleGNlcHRpb24gLSB5b3UgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB5b3UgZXhwZWN0CisgICAgICAgICAqIGNoaWxkIGVsZW1lbnRzLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLiAKKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiAKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiwgb3IgaW4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG9mIGVycm9yIGluIGFuIG92ZXJyaWRkZW4gdmVyc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFudEhhbmRsZXIgb25TdGFydENoaWxkKFN0cmluZyB1cmksIFN0cmluZyB0YWcsIFN0cmluZyBxbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGVsZW1lbnQgXCIiICsgcW5hbWUgKyAiIFwiIiwgY29udGV4dC5sb2NhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRW5kQ2hpbGQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgU3RyaW5nIHFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhtbENvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhpcyBlbGVtZW50IGFuZCBhbGwgZWxlbWVudHMgbmVzdGVkIGludG8gaXQgaGF2ZSBiZWVuCisgICAgICAgICAqIGhhbmRsZWQgKGkuZS4gYXQgdGhlIDwvZW5kX3RhZ19vZl90aGVfZWxlbWVudD4gKS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgdGFnLCBBbnRYbWxDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRleHQgd2l0aGluIGFuIGVsZW1lbnQuIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBqdXN0CisgICAgICAgICAqIHRocm93cyBhbiBleGNlcHRpb24sIHlvdSBtdXN0IG92ZXJyaWRlIGl0IGlmIHlvdSBleHBlY3QgY29udGVudC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBidWYgQSBjaGFyYWN0ZXIgYXJyYXkgb2YgdGhlIHRleHQgd2l0aGluIHRoZSBlbGVtZW50LgorICAgICAgICAgKiAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgorICAgICAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkuCisgICAgICAgICAqIAorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBvdmVycmlkZGVuLCBvciBpbgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IgaW4gYW4gb3ZlcnJpZGRlbiB2ZXJzaW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50LCBBbnRYbWxDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1Ziwgc3RhcnQsIGNvdW50KS50cmltKCk7CisKKyAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCB0ZXh0IFwiIiArIHMgKyAiXCIiLCBjb250ZXh0LmxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIFdpbGwgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBuYW1lc3BhY2UgaXMgcmVhY2hlZC4KKyAgICAgICAgICAgIEl0J2xsIHZlcmlmeSBpZiB0aGUgbnMgd2FzIHByb2Nlc3NlZCwgYW5kIGlmIG5vdCBsb2FkIHRoZSB0YXNrIGRlZmluaXRpb25zLgorICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja05hbWVzcGFjZSggU3RyaW5nIHVyaSApIHsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIENvbnRleHQgaW5mb3JtYXRpb24gZm9yIHRoZSBhbnQgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFudFhtbENvbnRleHQgeworICAgICAgICAvKiogVGhlIHByb2plY3QgdG8gY29uZmlndXJlLiAqLworICAgICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgICAgICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBwYXJzZS4gKi8KKyAgICAgICAgcHVibGljIEZpbGUgYnVpbGRGaWxlOworCisgICAgICAgIC8qKiAKKyAgICAgICAgICogUGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgYnVpbGQgZmlsZS4gVXNlZCBmb3IgcmVzb2x2aW5nIGVudGl0aWVzCisgICAgICAgICAqIGFuZCBzZXR0aW5nIHRoZSBwcm9qZWN0J3MgYmFzZSBkaXJlY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmlsZSBidWlsZEZpbGVQYXJlbnQ7CisKKyAgICAgICAgLyoqIE5hbWUgb2YgdGhlIGN1cnJlbnQgcHJvamVjdCAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGN1cnJlbnRQcm9qZWN0TmFtZTsKKworICAgICAgICAvKiogCisgICAgICAgICAqIExvY2F0b3IgZm9yIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2VyLiAKKyAgICAgICAgICogVXNlZCBmb3IgZ2l2aW5nIGxvY2F0aW9ucyBvZiBlcnJvcnMgZXRjLgorICAgICAgICAgKi8KKyAgICAgICAgTG9jYXRvciBsb2NhdG9yOworCisgICAgICAgIC8vIERvIHdlIG5lZWQgdGhvc2UgPworICAgICAgICBwdWJsaWMgUHJvamVjdEhlbHBlckltcGwyIGhlbHBlcjsKKyAgICAgICAgb3JnLnhtbC5zYXguWE1MUmVhZGVyIHBhcnNlcjsKKworICAgICAgICAgLyoqCisgICAgICAgICAgKiBUYXJnZXQgdGhhdCBhbGwgb3RoZXIgdGFyZ2V0cyB3aWxsIGRlcGVuZCB1cG9uIGltcGxpY2l0bHkuCisgICAgICAgICAgKgorICAgICAgICAgICogPHA+VGhpcyBob2xkcyBhbGwgdGFza3MgYW5kIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGhhdmUKKyAgICAgICAgICAqIGJlZW4gcGxhY2VkIG91dHNpZGUgb2YgdGFyZ2V0cy48L3A+CisgICAgICAgICAgKi8KKyAgICAgICAgVGFyZ2V0IGltcGxpY2l0VGFyZ2V0ID0gbmV3IFRhcmdldCgpOworCisgICAgICAgIC8qKiBDdXJyZW50IHRhcmdldCAoIG5vIG5lZWQgZm9yIGEgc3RhY2sgYXMgdGhlIHByb2Nlc3NpbmcgbW9kZWwKKyAgICAgICAgICAgIGFsbG93cyBvbmx5IG9uZSBsZXZlbCBvZiB0YXJnZXQgKSAqLworICAgICAgICBwdWJsaWMgVGFyZ2V0IGN1cnJlbnRUYXJnZXQ9bnVsbDsKKworICAgICAgICAvKiogVGhlIHN0YWNrIG9mIFJ1bnRpbWVDb25maWd1cmFibGUyIHdyYXBwaW5nIHRoZQorICAgICAgICAgICAgb2JqZWN0cy4gCisgICAgICAgICovCisgICAgICAgIFZlY3RvciB3U3RhY2s9bmV3IFZlY3RvcigpOworCisgICAgICAgIHB1YmxpYyBIYXNodGFibGUgbmFtZXNwYWNlcz1uZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIAorICAgICAgICAvLyBJbXBvcnQgc3R1ZmYKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaWdub3JlUHJvamVjdFRhZz1mYWxzZTsKKyAgICAgICAgcHVibGljIEhhc2h0YWJsZSBpbXBvcnRlZEZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBwdWJsaWMgaW50IGltcG9ydGxldmVsID0gMDsKKworICAgICAgICBwdWJsaWMgQW50WG1sQ29udGV4dChQcm9qZWN0IHByb2plY3QsIFByb2plY3RIZWxwZXJJbXBsMiBoZWxwZXIpIHsKKyAgICAgICAgICAgIHRoaXMucHJvamVjdD1wcm9qZWN0OworICAgICAgICAgICAgaW1wbGljaXRUYXJnZXQuc2V0TmFtZSgiIik7CisgICAgICAgICAgICB0aGlzLmhlbHBlcj1oZWxwZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUnVudGltZUNvbmZpZ3VyYWJsZTIgY3VycmVudFdyYXBwZXIoKSB7CisgICAgICAgICAgICBpZiggd1N0YWNrLnNpemUoKSA8IDEgKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiAoUnVudGltZUNvbmZpZ3VyYWJsZTIpd1N0YWNrLmVsZW1lbnRBdCggd1N0YWNrLnNpemUoKSAtIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSdW50aW1lQ29uZmlndXJhYmxlMiBwYXJlbnRXcmFwcGVyKCkgeworICAgICAgICAgICAgaWYoIHdTdGFjay5zaXplKCkgPCAyICkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gKFJ1bnRpbWVDb25maWd1cmFibGUyKXdTdGFjay5lbGVtZW50QXQoIHdTdGFjay5zaXplKCkgLSAyICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwdXNoV3JhcHBlciggUnVudGltZUNvbmZpZ3VyYWJsZTIgd3JhcHBlciApIHsKKyAgICAgICAgICAgIHdTdGFjay5hZGRFbGVtZW50KHdyYXBwZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcG9wV3JhcHBlcigpIHsKKyAgICAgICAgICAgIGlmKCB3U3RhY2suc2l6ZSgpID4gMCApIAorICAgICAgICAgICAgICAgIHdTdGFjay5yZW1vdmVFbGVtZW50QXQoIHdTdGFjay5zaXplKCkgLSAxICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmVjdG9yIGdldFdyYXBwZXJTdGFjaygpIHsKKyAgICAgICAgICAgIHJldHVybiB3U3RhY2s7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBTY2FucyBhbiBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhlIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUgYW5kIAorICAgICAgICAgKiBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIHRhcmdldCBvYmplY3QgaW4gdGhlIHByb2plY3QgaWYgYW4KKyAgICAgICAgICogaWQgaXMgZm91bmQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGlzIG1ldGhvZCB3YXMgbW92ZWQgb3V0IG9mIHRoZSBjb25maWd1cmUgbWV0aG9kIHRvIGFsbG93CisgICAgICAgICAqIGl0IHRvIGJlIGV4ZWN1dGVkIGF0IHBhcnNlIHRpbWUuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlICNjb25maWd1cmUoT2JqZWN0LEF0dHJpYnV0ZUxpc3QsUHJvamVjdCkKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY29uZmlndXJlSWQoT2JqZWN0IGVsZW1lbnQsIEF0dHJpYnV0ZXMgYXR0cikgeworICAgICAgICAgICAgU3RyaW5nIGlkID0gYXR0ci5nZXRWYWx1ZSgiaWQiKTsKKyAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoaWQsIGVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSGFuZGxlciBmb3IgYW50IHByb2Nlc3NpbmcuIFVzZXMgYSBzdGFjayBvZiBBbnRIYW5kbGVycyB0bworICAgICAqIGltcGxlbWVudCBlYWNoIGVsZW1lbnQgKCB0aGUgb3JpZ2luYWwgcGFyc2VyIHVzZWQgYSByZWN1cnNpdmUgYmVoYXZpb3IsCisgICAgICogd2l0aCB0aGUgaW1wbGljaXQgZXhlY3V0aW9uIHN0YWNrICkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvb3RIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgeworICAgICAgICBTdGFjayBhbnRIYW5kbGVycz1uZXcgU3RhY2soKTsKKyAgICAgICAgQW50SGFuZGxlciBjdXJyZW50SGFuZGxlcj1udWxsOworICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgUm9vdEhhbmRsZXIoQW50WG1sQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBjdXJyZW50SGFuZGxlcj1Qcm9qZWN0SGVscGVySW1wbDIubWFpbkhhbmRsZXI7CisgICAgICAgICAgICBhbnRIYW5kbGVycy5wdXNoKCBjdXJyZW50SGFuZGxlciApOworICAgICAgICAgICAgdGhpcy5jb250ZXh0PWNvbnRleHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvbHZlcyBmaWxlOiBVUklzIHJlbGF0aXZlIHRvIHRoZSBidWlsZCBmaWxlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBwdWJsaWMgaWRlbnRpZmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgaWYgbm9uZSBpcyBhdmFpbGFibGUuIElnbm9yZWQgaW4gdGhpcyAKKyAgICAgICAgICogICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZGVudGlmaWVyIHByb3ZpZGVkIGluIHRoZSBYTUwgCisgICAgICAgICAqICAgICAgICAgICAgICAgICBkb2N1bWVudC4gV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCkgeworICAgICAgICAKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0UHJvamVjdCgpLmxvZygicmVzb2x2aW5nIHN5c3RlbUlkOiAiICsgc3lzdGVtSWQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAKKyAgICAgICAgICAgIGlmIChzeXN0ZW1JZC5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBQcm9qZWN0SGVscGVySW1wbDIuZnJvbVVSSShzeXN0ZW1JZCk7CisKKyAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmdS5yZXNvbHZlRmlsZShjb250ZXh0LmJ1aWxkRmlsZVBhcmVudCwgcGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOworICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZChQcm9qZWN0SGVscGVySW1wbDIudG9VUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRTb3VyY2U7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZSkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2plY3QubG9nKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGNvdWxkIG5vdCBiZSBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCBpZiBub3QgZmlsZSBvciBmaWxlIG5vdCBmb3VuZAorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYSBwcm9qZWN0IGVsZW1lbnQuIEEgcHJvamVjdCBoYW5kbGVyIGlzIGNyZWF0ZWQKKyAgICAgICAgICogYW5kIGluaXRpYWxpc2VkIHdpdGggdGhlIGVsZW1lbnQgbmFtZSBhbmQgYXR0cmlidXRlcy4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSB0YWcgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4gCisgICAgICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlIHRhZyBnaXZlbiBpcyBub3QgCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+InByb2plY3QiPC9jb2RlPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyB0YWcsIFN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBBbnRIYW5kbGVyIG5leHQ9Y3VycmVudEhhbmRsZXIub25TdGFydENoaWxkKHVyaSwgdGFnLCBxbmFtZSwgYXR0cnMsIGNvbnRleHQpOworICAgICAgICAgICAgYW50SGFuZGxlcnMucHVzaCggY3VycmVudEhhbmRsZXIgKTsKKyAgICAgICAgICAgIGN1cnJlbnRIYW5kbGVyPW5leHQ7CisgICAgICAgICAgICBjdXJyZW50SGFuZGxlci5vblN0YXJ0RWxlbWVudCggdXJpLCB0YWcsIHFuYW1lLCBhdHRycywgY29udGV4dCApOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGxvY2F0b3IgaW4gdGhlIHByb2plY3QgaGVscGVyIGZvciBmdXR1cmUgcmVmZXJlbmNlLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGxvY2F0b3IgVGhlIGxvY2F0b3IgdXNlZCBieSB0aGUgcGFyc2VyLgorICAgICAgICAgKiAgICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgICAgIGNvbnRleHQubG9jYXRvciA9IGxvY2F0b3I7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyB0aGUgZW5kIG9mIGFuIGVsZW1lbnQuIEFueSByZXF1aXJlZCBjbGVhbi11cCBpcyBwZXJmb3JtZWQKKyAgICAgICAgICogYnkgdGhlIG9uRW5kRWxlbWVudCgpIG1ldGhvZCBhbmQgdGhlbiB0aGUgb3JpZ2luYWwgaGFuZGxlciBpcyByZXN0b3JlZCB0bworICAgICAgICAgKiB0aGUgcGFyc2VyLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgd2hpY2ggaXMgZW5kaW5nLgorICAgICAgICAgKiAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKG5vdCB0aHJvd24gaW4gCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaW1wbGVtZW50YXRpb24pCisgICAgICAgICAqIAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGN1cnJlbnRIYW5kbGVyLm9uRW5kRWxlbWVudCh1cmksIG5hbWUsIGNvbnRleHQpOworICAgICAgICAgICAgQW50SGFuZGxlciBwcmV2PShBbnRIYW5kbGVyKWFudEhhbmRsZXJzLnBvcCgpOworICAgICAgICAgICAgY3VycmVudEhhbmRsZXI9cHJldjsKKyAgICAgICAgICAgIGlmKCBjdXJyZW50SGFuZGxlciE9bnVsbCApCisgICAgICAgICAgICAgICAgY3VycmVudEhhbmRsZXIub25FbmRDaGlsZCggdXJpLCBuYW1lLCBxTmFtZSwgY29udGV4dCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBjb3VudCkKKyAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50SGFuZGxlci5jaGFyYWN0ZXJzKCBidWYsIHN0YXJ0LCBjb3VudCwgY29udGV4dCApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYWluSGFuZGxlciBleHRlbmRzIEFudEhhbmRsZXIgeworCisgICAgICAgIHB1YmxpYyBBbnRIYW5kbGVyIG9uU3RhcnRDaGlsZChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhtbENvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAocW5hbWUuZXF1YWxzKCJwcm9qZWN0IikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHJvamVjdEhlbHBlckltcGwyLnByb2plY3RIYW5kbGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgICAgICAgICBpZiggY29udGV4dC5pbXBvcnRsZXZlbCA+IDAgKSB7CisvLyAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBpbiBhbiBpbXBvcnRlZCBmaWxlLiBBbGxvdyB0b3AtbGV2ZWwgPHRhcmdldD4uCisvLyAgICAgICAgICAgICAgICAgICAgIGlmKCBxbmFtZS5lcXVhbHMoICJ0YXJnZXQiICkgKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXJJbXBsMi50YXJnZXRIYW5kbGVyOworLy8gICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZWxlbWVudCBcIiIgKyBxbmFtZSArICJcIiAiICsgbmFtZSwgY29udGV4dC5sb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEhhbmRsZXIgZm9yIHRoZSB0b3AgbGV2ZWwgInByb2plY3QiIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9qZWN0SGFuZGxlciBleHRlbmRzIEFudEhhbmRsZXIgeworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpc2F0aW9uIHJvdXRpbmUgY2FsbGVkIGFmdGVyIGhhbmRsZXIgY3JlYXRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGVzLiBUaGUgYXR0cmlidXRlcyB3aGljaAorICAgICAgICAgKiB0aGlzIGhhbmRsZXIgY2FuIGRlYWwgd2l0aCBhcmU6IDxjb2RlPiJkZWZhdWx0IjwvY29kZT4sCisgICAgICAgICAqIDxjb2RlPiJuYW1lIjwvY29kZT4sIDxjb2RlPiJpZCI8L2NvZGU+IGFuZCA8Y29kZT4iYmFzZWRpciI8L2NvZGU+LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHRhZyBOYW1lIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzIGhhbmRsZXIKKyAgICAgICAgICogICAgICAgICAgICB0byBiZSBjcmVhdGVkLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiAgICAgICAgICAgIElnbm9yZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgd2hpY2ggY2F1c2VkIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgIGhhbmRsZXIgdG8gYmUgY3JlYXRlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIAorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIGFuIHVuZXhwZWN0ZWQgYXR0cmlidXRlIGlzIAorICAgICAgICAgKiAgICAgICAgICAgIGVuY291bnRlcmVkIG9yIGlmIHRoZSA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+IGF0dHJpYnV0ZQorICAgICAgICAgKiAgICAgICAgICAgIGlzIG1pc3NpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgdGFnLCBTdHJpbmcgcW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhtbENvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgaWQgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBudWxsOworCisgICAgICAgICAgICBQcm9qZWN0IHByb2plY3Q9Y29udGV4dC5nZXRQcm9qZWN0KCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBhdHRycy5nZXRRTmFtZShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscygiZGVmYXVsdCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggdmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFjb250ZXh0Lmlnbm9yZVByb2plY3RUYWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0RGVmYXVsdFRhcmdldCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoIm5hbWUiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50UHJvamVjdE5hbWU9dmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhY29udGV4dC5pZ25vcmVQcm9qZWN0VGFnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0TmFtZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UodmFsdWUsIHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiaWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hhdCdzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaWQgYW5kIG5hbWUgPworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFjb250ZXh0Lmlnbm9yZVByb2plY3RUYWcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UodmFsdWUsIHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJiYXNlZGlyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFjb250ZXh0Lmlnbm9yZVByb2plY3RUYWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpciA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBpZ25vcmUgYXR0cmlidXRlcyBpbiBhIGRpZmZlcmVudCBOUyAoIG1heWJlIHN0b3JlIHRoZW0gPyApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBhdHRyaWJ1dGUgXCIiICsgYXR0cnMuZ2V0UU5hbWUoaSkgKyAiXCIiLCBjb250ZXh0LmxvY2F0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvamVjdC5zZXRVc2VyUHJvcGVydHkoImFudC5maWxlLiIrY29udGV4dC5jdXJyZW50UHJvamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYnVpbGRGaWxlLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBpZiggY29udGV4dC5pZ25vcmVQcm9qZWN0VGFnICkgeworICAgICAgICAgICAgICAgIC8vIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNldCBleHBsaWNpdGVseSBiZWZvcmUgc3RhcnRpbmcgPworICAgICAgICAgICAgaWYgKHByb2plY3QuZ2V0UHJvcGVydHkoImJhc2VkaXIiKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKHByb2plY3QuZ2V0UHJvcGVydHkoImJhc2VkaXIiKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgZm9yIGJhc2VEaXIgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBidWlsZCBmaWxlLgorICAgICAgICAgICAgICAgIGlmIChiYXNlRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKGNvbnRleHQuYnVpbGRGaWxlUGFyZW50LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYW4gYWJzb2x1dGUgcGF0aAorICAgICAgICAgICAgICAgICAgICBpZiAoKG5ldyBGaWxlKGJhc2VEaXIpKS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcihiYXNlRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0QmFzZURpcihwcm9qZWN0LnJlc29sdmVGaWxlKGJhc2VEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmJ1aWxkRmlsZVBhcmVudCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwcm9qZWN0LmFkZFRhcmdldCgiIiwgY29udGV4dC5pbXBsaWNpdFRhcmdldCk7CisgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUYXJnZXQ9Y29udGV4dC5pbXBsaWNpdFRhcmdldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhIHRvcC1sZXZlbCBlbGVtZW50IHdpdGhpbiB0aGUgcHJvamVjdC4gQW4KKyAgICAgICAgICogYXBwcm9wcmlhdGUgaGFuZGxlciBpcyBjcmVhdGVkIGFuZCBpbml0aWFsaXNlZCB3aXRoIHRoZSBkZXRhaWxzCisgICAgICAgICAqIG9mIHRoZSBlbGVtZW50LgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLiAKKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiAKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiB0aGUgdGFnIGdpdmVuIGlzIG5vdCAKKyAgICAgICAgICogICAgICAgICAgICA8Y29kZT4idGFza2RlZiI8L2NvZGU+LCA8Y29kZT4idHlwZWRlZiI8L2NvZGU+LAorICAgICAgICAgKiAgICAgICAgICAgIDxjb2RlPiJwcm9wZXJ0eSI8L2NvZGU+LCA8Y29kZT4idGFyZ2V0IjwvY29kZT4KKyAgICAgICAgICogICAgICAgICAgICBvciBhIGRhdGEgdHlwZSBkZWZpbml0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQW50SGFuZGxlciBvblN0YXJ0Q2hpbGQoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUsIFN0cmluZyBxbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHFuYW1lLmVxdWFscygidGFyZ2V0IikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHJvamVjdEhlbHBlckltcGwyLnRhcmdldEhhbmRsZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0SGVscGVySW1wbDIuZWxlbWVudEhhbmRsZXI7CisgICAgICAgICAgICB9IAorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGZvciAidGFyZ2V0IiBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhcmdldEhhbmRsZXIgZXh0ZW5kcyBBbnRIYW5kbGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGlzYXRpb24gcm91dGluZSBjYWxsZWQgYWZ0ZXIgaGFuZGxlciBjcmVhdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBlbGVtZW50IG5hbWUgYW5kIGF0dHJpYnV0ZXMuIFRoZSBhdHRyaWJ1dGVzIHdoaWNoCisgICAgICAgICAqIHRoaXMgaGFuZGxlciBjYW4gZGVhbCB3aXRoIGFyZTogPGNvZGU+Im5hbWUiPC9jb2RlPiwKKyAgICAgICAgICogPGNvZGU+ImRlcGVuZHMiPC9jb2RlPiwgPGNvZGU+ImlmIjwvY29kZT4sCisgICAgICAgICAqIDxjb2RlPiJ1bmxlc3MiPC9jb2RlPiwgPGNvZGU+ImlkIjwvY29kZT4gYW5kIAorICAgICAgICAgKiA8Y29kZT4iZGVzY3JpcHRpb24iPC9jb2RlPi4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSB0YWcgTmFtZSBvZiB0aGUgZWxlbWVudCB3aGljaCBjYXVzZWQgdGhpcyBoYW5kbGVyCisgICAgICAgICAqICAgICAgICAgICAgdG8gYmUgY3JlYXRlZC4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogICAgICAgICAgICBJZ25vcmVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzCisgICAgICAgICAqICAgICAgICAgICAgICBoYW5kbGVyIHRvIGJlIGNyZWF0ZWQuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiAKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiBhbiB1bmV4cGVjdGVkIGF0dHJpYnV0ZSBpcyBlbmNvdW50ZXJlZAorICAgICAgICAgKiAgICAgICAgICAgIG9yIGlmIHRoZSA8Y29kZT4ibmFtZSI8L2NvZGU+IGF0dHJpYnV0ZSBpcyBtaXNzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgU3RyaW5nIHFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGRlcGVuZHMgPSAiIjsKKworICAgICAgICAgICAgUHJvamVjdCBwcm9qZWN0PWNvbnRleHQuZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQoKTsKKyAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRhcmdldD10YXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBhdHRycy5nZXRRTmFtZShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKKworICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKCJuYW1lIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICBpZiggIiIuZXF1YWxzKCBuYW1lICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJuYW1lIGF0dHJpYnV0ZSBtdXN0IG5vdCBiZSBlbXB0eSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiZGVwZW5kcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoImlmIikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElmKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoInVubGVzcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRVbmxlc3ModmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiaWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKHZhbHVlLCB0YXJnZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJkZXNjcmlwdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZXNjcmlwdGlvbih2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGF0dHJpYnV0ZSBcIiIgKyBrZXkgKyAiXCIiLCBjb250ZXh0LmxvY2F0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigidGFyZ2V0IGVsZW1lbnQgYXBwZWFycyB3aXRob3V0IGEgbmFtZSBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBIYXNodGFibGUgY3VycmVudFRhcmdldHMgPSBwcm9qZWN0LmdldFRhcmdldHMoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG5hbWUgaGFzIGFscmVhZHkgYmVlbmQgZGVmaW5lZCAoIGltcG9ydCBmb3IgZXhhbXBsZSApCisgICAgICAgICAgICBpZihjdXJyZW50VGFyZ2V0cy5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIEFsdGVyIHRoZSBuYW1lLgorICAgICAgICAgICAgICAgIGlmKCBjb250ZXh0LmN1cnJlbnRQcm9qZWN0TmFtZSAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3TmFtZT1jb250ZXh0LmN1cnJlbnRQcm9qZWN0TmFtZSArICIuIiArIG5hbWU7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJBbHJlYWR5IGRlZmluZWQgaW4gbWFpbiBvciBhIHByZXZpb3VzIGltcG9ydCwgZGVmaW5lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiBhcyAiICsgbmV3TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIG5hbWU9bmV3TmFtZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZygiQWxyZWFkeSBkZWZpbmVkIGluIG1haW4gb3IgYSBwcmV2aW91cyBpbXBvcnQsIGlnbm9yZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIG5hbWU9bnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBuYW1lICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE5hbWUobmFtZSk7CisgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRPclJlcGxhY2VUYXJnZXQobmFtZSwgdGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBwcm9qZWN0LmxvZygiVGFyZ2V0cyBhcmUgbm93OiAiKyBjdXJyZW50VGFyZ2V0cyAsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIGRlcGVuZGVuY2llcworICAgICAgICAgICAgaWYgKGRlcGVuZHMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0LnNldERlcGVuZHMoZGVwZW5kcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCB3aXRoaW4gYSB0YXJnZXQuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gdGFnIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuIAorICAgICAgICAgKiAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIAorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGluaXRpYWxpc2luZworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBjaGlsZCBoYW5kbGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQW50SGFuZGxlciBvblN0YXJ0Q2hpbGQoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUsIFN0cmluZyBxbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXJJbXBsMi5lbGVtZW50SGFuZGxlcjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgQW50WG1sQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUYXJnZXQ9Y29udGV4dC5pbXBsaWNpdFRhcmdldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXIgZm9yIGFsbCBwcm9qZWN0IGVsZW1lbnRzICggdGFza3MsIGRhdGEgdHlwZXMgKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWxlbWVudEhhbmRsZXIgZXh0ZW5kcyBBbnRIYW5kbGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRWxlbWVudEhhbmRsZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGlzYXRpb24gcm91dGluZSBjYWxsZWQgYWZ0ZXIgaGFuZGxlciBjcmVhdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBlbGVtZW50IG5hbWUgYW5kIGF0dHJpYnV0ZXMuIFRoaXMgY29uZmlndXJlcworICAgICAgICAgKiB0aGUgZWxlbWVudCB3aXRoIGl0cyBhdHRyaWJ1dGVzIGFuZCBzZXRzIGl0IHVwIHdpdGgKKyAgICAgICAgICogaXRzIHBhcmVudCBjb250YWluZXIgKGlmIGFueSkuIE5lc3RlZCBlbGVtZW50cyBhcmUgdGhlbgorICAgICAgICAgKiBhZGRlZCBsYXRlciBhcyB0aGUgcGFyc2VyIGVuY291bnRlcnMgdGhlbS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSB0YWcgTmFtZSBvZiB0aGUgZWxlbWVudCB3aGljaCBjYXVzZWQgdGhpcyBoYW5kbGVyCisgICAgICAgICAqICAgICAgICAgICAgdG8gYmUgY3JlYXRlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqICAgICAgICAgICAgCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzCisgICAgICAgICAqICAgICAgICAgICAgICBoYW5kbGVyIHRvIGJlIGNyZWF0ZWQuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiAKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVycm9yIChub3QgdGhyb3duIGluCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyB0YWcsIFN0cmluZyBxbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WG1sQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUyIHBhcmVudFdyYXBwZXI9Y29udGV4dC5jdXJyZW50V3JhcHBlcigpOworICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZTIgd3JhcHBlcj1udWxsOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoZmFsc2UgJiYgY29udGV4dC5nZXRQcm9qZWN0KCkuZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpLmdldChxbmFtZSkgIT0gbnVsbCkgeworLyoKKyAgVW5rbm93bkVsZW1lbnQgc2hvdWxkIHdvcmsgZm9yIGRhdGEgdHlwZXMgYXMgd2VsbC4gCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGVsaW1pbmF0ZSB0aGUgc3BlY2lhbCB0cmVhdGVtZW50IG9mIGRhdGEgdHlwZS4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGNvbnRleHQuZ2V0UHJvamVjdCgpLmNyZWF0ZURhdGFUeXBlKHFuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGl0IGhhcHBlbiA/IFdlIGp1c3QgY2hlY2tlZCB0aGF0IHRoZSB0eXBlIGV4aXN0cworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmtub3duIGRhdGEgdHlwZSAiK3FuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB3cmFwcGVyID0gbmV3IFJ1bnRpbWVDb25maWd1cmFibGUyKGNvbnRleHQuZ2V0UHJvamVjdCgpLCBudWxsLCBlbGVtZW50LCBxbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlczIoYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUYXJnZXQuYWRkRGF0YVR5cGUod3JhcHBlcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpLCBjb250ZXh0LmxvY2F0b3IsIGV4Yyk7CisgICAgICAgICAgICAgICAgfQorKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVGFzayB0YXNrPW51bGw7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gY3JlYXRlIHRoZSB0YXNrIG5vdyAtIGZvciBjb25zaXN0ZW5jeSBhbmQgdG8KKyAgICAgICAgICAgICAgICAvLyBzaW1wbGlmeSB0aGUgbW9kZWwgaXQgaXMgYmV0dGVyIHRvIGtlZXAgZXZlcnl0aGluZyBsYXp5CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0YXNrID0gY29udGV4dC5nZXRQcm9qZWN0KCkuY3JlYXRlVGFzayhxbmFtZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzd2FsbG93IGhlcmUsIHdpbGwgYmUgdGhyb3duIGFnYWluIGluIAorICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duRWxlbWVudC5tYXliZUNvbmZpZ3VyZSBpZiB0aGUgcHJvYmxlbSBwZXJzaXN0cy4KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgY29uc2VxdWVuY2Ugb2YgbGF6eSBldmFsIC0gVW5rbm93bkVsZW1lbnQgbXVzdCBkZWFsIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBUYXNrQ29udGFpbmVyIGNhc2UuCisgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGlmICh0YXNrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFzayA9IG5ldyBVbmtub3duRWxlbWVudDIocW5hbWUpOworICAgICAgICAgICAgICAgICAgICB0YXNrLnNldFByb2plY3QoY29udGV4dC5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAvL1hYWCB0YXNrLnNldFRhc2tUeXBlKHFuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdGFzay5zZXRUYXNrTmFtZShxbmFtZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTG9jYXRpb24gbG9jYXRpb249bmV3IExvY2F0aW9uKGNvbnRleHQubG9jYXRvci5nZXRTeXN0ZW1JZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxvY2F0b3IuZ2V0TGluZU51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpOworICAgICAgICAgICAgICAgIHRhc2suc2V0TG9jYXRpb24obG9jYXRpb24pOworICAgICAgICAgICAgICAgIGNvbnRleHQuY29uZmlndXJlSWQodGFzaywgYXR0cnMpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRhc2suc2V0T3duaW5nVGFyZ2V0KGNvbnRleHQuY3VycmVudFRhcmdldCk7CisKKyAgICAgICAgICAgICAgICBPYmplY3QgcGFyZW50PW51bGw7CisgICAgICAgICAgICAgICAgaWYoIHBhcmVudFdyYXBwZXIhPW51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnRXcmFwcGVyLmdldFByb3h5KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gV2l0aCBsYXp5IGV2YWwsIHBhcmVudCB3aWxsIGFsc28gYmUgVW5rbndvbkVsZW1lbnQgKCBldmVuIGlmIHRoZSB0YXNrCisgICAgICAgICAgICAgICAgLy8gaXMgYSBUYXNrQ29udGFpbmVyICkuIEl0IGlzIFVua25vd25FbGVtZW50IHdobyBtdXN0IGNoZWNrIHRoaXMuCisgICAgICAgICAgICAgICAgaWYoIHBhcmVudCBpbnN0YW5jZW9mIFRhc2tDb250YWluZXIgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRhc2sgaW5jbHVkZWQgaW4gYSBUYXNrQ29udGFpbmVyCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2hvdWxkbid0IGhhcHBlbiAiKTsKKyAgICAgICAgICAgICAgICAgICAgLypERUJVRyovIHRyeSB7dGhyb3cgbmV3IEV4Y2VwdGlvbigpOyB9IGNhdGNoKEV4Y2VwdGlvbiBleCkge2V4LnByaW50U3RhY2tUcmFjZSgpO30KKyAgICAgICAgICAgICAgICAgICAgKChUYXNrQ29udGFpbmVyKXBhcmVudCkuYWRkVGFzayggdGFzayApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRhc2sgaW5jbHVkZWQgaW4gYSB0YXJnZXQgKCBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgb25lICkuCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRhcmdldC5hZGRUYXNrKCB0YXNrICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lci5hZGRUYXNrKHRhc2spOworICAgICAgICAgICAgICAgIHRhc2suaW5pdCgpOworCisgICAgICAgICAgICAgICAgd3JhcHBlcj1uZXcgUnVudGltZUNvbmZpZ3VyYWJsZTIoY29udGV4dC5nZXRQcm9qZWN0KCksIGxvY2F0aW9uLCB0YXNrLCB0YXNrLmdldFRhc2tOYW1lKCkpOworICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlczIoYXR0cnMpOworCisgICAgICAgICAgICAgICAgaWYgKHBhcmVudFdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnRXcmFwcGVyLmFkZENoaWxkKHdyYXBwZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5wdXNoV3JhcHBlciggd3JhcHBlciApOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyB0ZXh0IHRvIHRoZSB0YXNrLCB1c2luZyB0aGUgd3JhcHBlcgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGJ1ZiBBIGNoYXJhY3RlciBhcnJheSBvZiB0aGUgdGV4dCB3aXRoaW4gdGhlIGVsZW1lbnQuCisgICAgICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgICAgICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBzdXBwb3J0IHRleHQKKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgUHJvamVjdEhlbHBlciNhZGRUZXh0KFByb2plY3QsT2JqZWN0LGNoYXJbXSxpbnQsaW50KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZTIgd3JhcHBlcj1jb250ZXh0LmN1cnJlbnRXcmFwcGVyKCk7CisgICAgICAgICAgICB3cmFwcGVyLmFkZFRleHQoYnVmLCBzdGFydCwgY291bnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCB3aXRoaW4gYSB0YXJnZXQuIFRhc2sgY29udGFpbmVycworICAgICAgICAgKiB3aWxsIGFsd2F5cyB1c2UgYW5vdGhlciB0YXNrIGhhbmRsZXIsIGFuZCBhbGwgb3RoZXIgdGFza3MKKyAgICAgICAgICogd2lsbCBhbHdheXMgdXNlIGEgbmVzdGVkIGVsZW1lbnQgaGFuZGxlci4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSB0YWcgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4gCisgICAgICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gaW5pdGlhbGlzaW5nCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIGhhbmRsZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBbnRIYW5kbGVyIG9uU3RhcnRDaGlsZChTdHJpbmcgdXJpLCBTdHJpbmcgdGFnLCBTdHJpbmcgcW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WG1sQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgZWxlbWVudAorICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZTIgd3JhcHBlcj1jb250ZXh0LmN1cnJlbnRXcmFwcGVyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdCBlbGVtZW50PXdyYXBwZXIuZ2V0UHJveHkoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0NvbnRhaW5lcikgeworICAgICAgICAgICAgICAgIC8vIHRhc2sgY2FuIGNvbnRhaW4gb3RoZXIgdGFza3MgLSBubyBvdGhlciBuZXN0ZWQgZWxlbWVudHMgcG9zc2libGUKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgaGFuZGxlZCBpbnNpZGUgVUUKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNob3VsZG4ndCBoYXBwZW4gLSBVRSIpOworICAgICAgICAgICAgICAgIC8qREVCVUcqLyB0cnkge3Rocm93IG5ldyBFeGNlcHRpb24oKTsgfSBjYXRjaChFeGNlcHRpb24gZXgpIHtleC5wcmludFN0YWNrVHJhY2UoKTt9CisgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXJJbXBsMi5lbGVtZW50SGFuZGxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0SGVscGVySW1wbDIubmVzdGVkRWxlbWVudEhhbmRsZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgQW50WG1sQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBjb250ZXh0LnBvcFdyYXBwZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRW5kQ2hpbGQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgU3RyaW5nIHFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhtbENvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGZvciBhbGwgbmVzdGVkIHByb3BlcnRpZXMuIFNhbWUgYXMgRWxlbWVudEhhbmRsZXIsIGV4Y2VwdCB0aGF0CisgICAgICogaXQgZG9lc24ndCBkZWFsIHdpdGggRGF0YVR5cGVzIGFuZCBkb2Vzbid0IHN1cHBvcnQgVGFza0NvbnRhaW5lci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIGJlaGF2aW9yIC0gSSBqdXN0IG1hZGUgZmV3IGNoYW5nZXMgdG8gYXZvaWQgZHVwbGljYXRlZAorICAgICAqIGNvZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOZXN0ZWRFbGVtZW50SGFuZGxlciBleHRlbmRzIEVsZW1lbnRIYW5kbGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE5lc3RlZEVsZW1lbnRIYW5kbGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpc2F0aW9uIHJvdXRpbmUgY2FsbGVkIGFmdGVyIGhhbmRsZXIgY3JlYXRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGVzLiBUaGlzIGNvbmZpZ3VyZXMKKyAgICAgICAgICogdGhlIGVsZW1lbnQgd2l0aCBpdHMgYXR0cmlidXRlcyBhbmQgc2V0cyBpdCB1cCB3aXRoCisgICAgICAgICAqIGl0cyBwYXJlbnQgY29udGFpbmVyIChpZiBhbnkpLiBOZXN0ZWQgZWxlbWVudHMgYXJlIHRoZW4KKyAgICAgICAgICogYWRkZWQgbGF0ZXIgYXMgdGhlIHBhcnNlciBlbmNvdW50ZXJzIHRoZW0uCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gdGFnIE5hbWUgb2YgdGhlIGVsZW1lbnQgd2hpY2ggY2F1c2VkIHRoaXMgaGFuZGxlcgorICAgICAgICAgKiAgICAgICAgICAgIHRvIGJlIGNyZWF0ZWQuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiAgICAgICAgICAgIAorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCB3aGljaCBjYXVzZWQgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgaGFuZGxlciB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvciwgc3VjaCBhcyBhIAorICAgICAgICAgKiAgICAgICAgICAgIEJ1aWxkRXhjZXB0aW9uIGJlaW5nIHRocm93biBkdXJpbmcgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBwcm9wVHlwZSwgU3RyaW5nIHFuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYbWxDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZTIgcGFyZW50V3JhcHBlcj1jb250ZXh0LmN1cnJlbnRXcmFwcGVyKCk7CisgICAgICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlMiB3cmFwcGVyPW51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50OworICAgICAgICAgICAgICAgIE9iamVjdCBwYXJlbnQ9cGFyZW50V3JhcHBlci5nZXRQcm94eSgpOworCisgICAgICAgICAgICAgICAgLy8gUGFyZW50IHdpbGwgYWxsd2F5cyBiZSBVbmtub3duRWxlbWVudC4gCisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhc2tBZGFwdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2hvdWxkbid0IGhhcHBlbiAiKTsKKyAgICAgICAgICAgICAgICAgICAgLypERUJVRyovIHRyeSB7dGhyb3cgbmV3IEV4Y2VwdGlvbigpOyB9IGNhdGNoKEV4Y2VwdGlvbiBleCkge2V4LnByaW50U3RhY2tUcmFjZSgpO30KKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gKChUYXNrQWRhcHRlcikgcGFyZW50KS5nZXRQcm94eSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBxbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICBVbmtub3duRWxlbWVudCB1YyA9IG5ldyBVbmtub3duRWxlbWVudDIoZWxlbWVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICB1Yy5zZXRQcm9qZWN0KGNvbnRleHQuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgKChVbmtub3duRWxlbWVudCkgcGFyZW50KS5hZGRDaGlsZCh1Yyk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB1YzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBJdCBtYXkgYmUgYSBkYXRhIHR5cGUuIFdpbGwgYmUgcmVtb3ZlZCB3aGVuIHdlIGNvbnNvbGlkYXRlIFVFL1JDCisgICAgICAgICAgICAgICAgICAgIENsYXNzIHBhcmVudENsYXNzID0gcGFyZW50LmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIgaWggPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKHBhcmVudENsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGloLmNyZWF0ZUVsZW1lbnQoY29udGV4dC5nZXRQcm9qZWN0KCksIHBhcmVudCwgZWxlbWVudE5hbWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnRleHQuY29uZmlndXJlSWQoZWxlbWVudCwgYXR0cnMpOworCisgICAgICAgICAgICAgICAgd3JhcHBlciA9IG5ldyBSdW50aW1lQ29uZmlndXJhYmxlMihjb250ZXh0LmdldFByb2plY3QoKSwgbnVsbCwgZWxlbWVudCwgcW5hbWUpOworICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlczIoYXR0cnMpOworICAgICAgICAgICAgICAgIHBhcmVudFdyYXBwZXIuYWRkQ2hpbGQod3JhcHBlcik7CisgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oZXhjLmdldE1lc3NhZ2UoKSwgY29udGV4dC5sb2NhdG9yLCBleGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dC5wdXNoV3JhcHBlciggd3JhcHBlciApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCAxLjUgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+ZmlsZTo8L2NvZGU+IFVSSSB0aGF0IHJlcHJlc2VudHMgdGhlCisgICAgICogZXh0ZXJuYWwgZm9ybSBvZiB0aGUgZ2l2ZW4gcGF0aG5hbWUuCisgICAgICoKKyAgICAgKiA8cD5XaWxsIGJlIGFuIGFic29sdXRlIFVSSSBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBhYnNvbHV0ZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNvZGUgZG9lc24ndCBoYW5kbGUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgcHJvcGVybHkuPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1VSSShTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJmaWxlOiIpOworCisgICAgICAgIC8vIGNhdGNoIGV4Y2VwdGlvbiBpZiBub3JtYWxpemUgdGhpbmtzIHRoaXMgaXMgbm90IGFuIGFic29sdXRlIHBhdGgKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhdGggPSBmdS5ub3JtYWxpemUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8vIik7CisgICAgICAgICAgICAvLyBhZGQgYW4gZXh0cmEgc2xhc2ggZm9yIGZpbGVzeXN0ZW1zIHdpdGggZHJpdmUtc3BlY2lmaWVycworICAgICAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHJlbGF0aXZlIHBhdGgKKyAgICAgICAgfQorCisgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXRlciA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihwYXRoKTsKKyAgICAgICAgZm9yIChjaGFyIGMgPSBpdGVyLmZpcnN0KCk7IGMgIT0gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORTsKKyAgICAgICAgICAgICBjID0gaXRlci5uZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChpc1NwZWNpYWxbY10pIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyUnKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlZENoYXIxW2NdKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlZENoYXIyW2NdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmaWxlIHBhdGggZnJvbSBhIDxjb2RlPmZpbGU6PC9jb2RlPiBVUkkuCisgICAgICoKKyAgICAgKiA8cD5XaWxsIGJlIGFuIGFic29sdXRlIHBhdGggaWYgdGhlIGdpdmVuIFVSSSBpcyBhYnNvbHV0ZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5Td2FsbG93cyAnJScgdGhhdCBhcmUgbm90IGZvbGxvd2VkIGJ5IHR3byBjaGFyYWN0ZXJzLAorICAgICAqIGRvZXNuJ3QgZGVhbCB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLjwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbVVSSShTdHJpbmcgdXJpKSB7CisgICAgICAgIGlmICghdXJpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbiBvbmx5IGhhbmRsZSBmaWxlOiBVUklzIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCJmaWxlOi8vIikpIHsKKyAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoNyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDUpOworICAgICAgICB9CisKKyAgICAgICAgdXJpID0gdXJpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICBpZiAoT3MuaXNGYW1pbHkoImRvcyIpICYmIHVyaS5zdGFydHNXaXRoKCJcXCIpICYmIHVyaS5sZW5ndGgoKSA+IDIKKyAgICAgICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodXJpLmNoYXJBdCgxKSkgJiYgdXJpLmNoYXJBdCgyKSA9PSAnOicpIHsKKyAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXIgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IodXJpKTsKKyAgICAgICAgZm9yIChjaGFyIGMgPSBpdGVyLmZpcnN0KCk7IGMgIT0gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORTsKKyAgICAgICAgICAgICBjID0gaXRlci5uZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChjID09ICclJykgeworICAgICAgICAgICAgICAgIGNoYXIgYzEgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYzEgIT0gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaTEgPSBDaGFyYWN0ZXIuZGlnaXQoYzEsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjMiA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYzIgIT0gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkyID0gQ2hhcmFjdGVyLmRpZ2l0KGMyLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpICgoaTEgPDwgNCkgKyBpMikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgIC8vIGNhdGNoIGV4Y2VwdGlvbiBpZiBub3JtYWxpemUgdGhpbmtzIHRoaXMgaXMgbm90IGFuIGFic29sdXRlIHBhdGgKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhdGggPSBmdS5ub3JtYWxpemUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHJlbGF0aXZlIHBhdGgKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisgICAgLy8gZm9yIHRvVVJJCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbltdIGlzU3BlY2lhbCA9IG5ldyBib29sZWFuWzI1Nl07CisgICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGVzY2FwZWRDaGFyMSA9IG5ldyBjaGFyWzI1Nl07CisgICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGVzY2FwZWRDaGFyMiA9IG5ldyBjaGFyWzI1Nl07CisKKworICAgIC8vIHN0b2xlbiBmcm9tIEZpbGVQYXRoVG9VUkkgb2YgdGhlIFhlcmNlcy1KIHRlYW0KKyAgICBzdGF0aWMgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAweDIwOyBpKyspIHsKKyAgICAgICAgICAgIGlzU3BlY2lhbFtpXSA9IHRydWU7CisgICAgICAgICAgICBlc2NhcGVkQ2hhcjFbaV0gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoaSA+PiA0LCAxNik7CisgICAgICAgICAgICBlc2NhcGVkQ2hhcjJbaV0gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoaSAmIDB4ZiwgMTYpOworICAgICAgICB9CisgICAgICAgIGlzU3BlY2lhbFsweDdmXSA9IHRydWU7CisgICAgICAgIGVzY2FwZWRDaGFyMVsweDdmXSA9ICc3JzsKKyAgICAgICAgZXNjYXBlZENoYXIyWzB4N2ZdID0gJ0YnOworICAgICAgICBjaGFyW10gZXNjQ2hzID0geyc8JywgJz4nLCAnIycsICclJywgJyInLCAneycsICd9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnfCcsICdcXCcsICdeJywgJ34nLCAnWycsICddJywgJ2AnfTsKKyAgICAgICAgaW50IGxlbiA9IGVzY0Nocy5sZW5ndGg7CisgICAgICAgIGNoYXIgY2g7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGNoID0gZXNjQ2hzW2ldOworICAgICAgICAgICAgaXNTcGVjaWFsW2NoXSA9IHRydWU7CisgICAgICAgICAgICBlc2NhcGVkQ2hhcjFbY2hdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGNoID4+IDQsIDE2KTsKKyAgICAgICAgICAgIGVzY2FwZWRDaGFyMltjaF0gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoY2ggJiAweGYsIDE2KTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1Rhc2tBZGFwdGVyMi5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1Rhc2tBZGFwdGVyMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzg2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvVGFza0FkYXB0ZXIyLmphdmEKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKKworLyoqCisgKiBVc2VzIGludHJvc3BlY3Rpb24gdG8gImFkYXB0IiBhbiBhcmJpdHJhcnkgQmVhbiB3aGljaCBkb2Vzbid0CisgKiBpdHNlbGYgZXh0ZW5kIFRhc2ssIGJ1dCBzdGlsbCBjb250YWlucyBhbiBleGVjdXRlIG1ldGhvZCBhbmQgb3B0aW9uYWxseSAKKyAqIGEgc2V0UHJvamVjdCBtZXRob2QuCisgKgorICogIFRoZSBhZGFwdGVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gd3JhcCB0YXNrcyB0aGF0IGFyZSBsb2FkZWQgaW4gYSBkaWZmZXJlbnQgY2xhc3MgbG9hZGVyCisgKiAgYnkgYW50LCB3aGVuIHVzZWQgaW4gcHJvZ3JhbWF0aWMgbW9kZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUYXNrQWRhcHRlcjIgZXh0ZW5kcyBUYXNrIHsgLy8gaW1wbGVtZW50cyBEeW5hbWljQ29uZmlndXJhdG9yIHsKKyAgICAvKiBOZWVkIHRvIHN1cHBvcnQgRHluYW1pY0NvbmZpZ3VyYXRvciBzbyB0aGF0IGFkYXB0ZWQgdGFza3MgY2FuCisgICAgICAgc3VwcG9ydCB0aGF0IHRvby4KKyAgICAqLworICAgIAorICAgIC8qKiBPYmplY3QgdG8gYWN0IGFzIGEgcHJveHkgZm9yLiAqLworICAgIHByaXZhdGUgT2JqZWN0IHByb3h5OworICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZE5hbWU9ImV4ZWN1dGUiOworICAgIAorICAgIHByaXZhdGUgSW50cm9zcGVjdGlvbkhlbHBlciBpaDsKKworICAgIHZvaWQgc2V0SW50cm9zcGVjdGlvbkhlbHBlciggSW50cm9zcGVjdGlvbkhlbHBlciBpaCApIHsKKyAgICAgICAgdGhpcy5paD1paDsKKyAgICB9CisKKyAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGdldEludHJvc3BlY3Rpb25IZWxwZXIoKQorICAgIHsKKyAgICAgICAgaWYoIGloPT1udWxsICkgeworICAgICAgICAgICAgaWggPSBJbnRyb3NwZWN0aW9uSGVscGVyLmdldEhlbHBlcih0YXJnZXQuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGloOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldER5bmFtaWNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSApOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRHluYW1pY0VsZW1lbnQoU3RyaW5nIG5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgCisgICAgLyoqIEV4cGVyaW1lbnRhbCwgbm9uLXB1YmxpYyBtZXRob2QgZm9yIGJldHRlciAnYWRhcHRhdGlvbicKKyAgICAgKgorICAgICAqLworICAgIHZvaWQgc2V0QXR0cmlidXRlKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKCBwcm9qZWN0LCBwcm94eSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfSBjYXRjaCggQnVpbGRFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICBpZiggImRvIi5lcXVhbHMoIG5hbWUgKSApIHsKKyAgICAgICAgICAgICAgICBzZXREbyggdmFsdWUgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIC8qKiBTZXQgdGhlICdhY3Rpb24nIG1ldGhvZC4gVGhpcyBhbGxvdyBiZWFucyBpbXBsZW1lbnRpbmcgbXVsdGlwbGUKKyAgICAgKiBhY3Rpb25zIG9yIHVzaW5nIG1ldGhvZHMgb3RoZXIgdGhhbiAnZXhlY3V0ZSgpJyB0byBiZSB1c2VkIGluIGFudAorICAgICAqIHdpdGhvdXQgYW55IG1vZGlmaWNhdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgQGFudDpleHBlcmltZW50YWwgCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG8oU3RyaW5nIG1ldGhvZE5hbWUgKSB7CisgICAgICAgIHRoaXMubWV0aG9kTmFtZT1tZXRob2ROYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgcHJveGllZCB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBNZXRob2Qgc2V0UHJvamVjdE0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgYyA9IHByb3h5LmdldENsYXNzKCk7CisgICAgICAgICAgICBzZXRQcm9qZWN0TSA9IAorICAgICAgICAgICAgICAgIGMuZ2V0TWV0aG9kKCAic2V0UHJvamVjdCIsIG5ldyBDbGFzc1tdIHtQcm9qZWN0LmNsYXNzfSk7CisgICAgICAgICAgICBpZihzZXRQcm9qZWN0TSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0UHJvamVjdE0uaW52b2tlKHByb3h5LCBuZXcgT2JqZWN0W10ge3Byb2plY3R9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBpZiB0aGUgY2xhc3MgYmVpbmcgdXNlZCBhcyBhIHRhc2sgZG9lcyBub3QgaGF2ZQorICAgICAgICAgICAgLy8gYSBzZXQgcHJvamVjdCBtZXRob2QuCisgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgIGxvZygiRXJyb3Igc2V0dGluZyBwcm9qZWN0IGluICIgKyBwcm94eS5nZXRDbGFzcygpLCAKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCBleCApOworICAgICAgICB9CisKKworICAgICAgICBNZXRob2QgZXhlY3V0ZU09bnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGM9cHJveHkuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIGV4ZWN1dGVNPWMuZ2V0TWV0aG9kKCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbMF0gKTsKKyAgICAgICAgICAgIGlmKCBleGVjdXRlTSA9PSBudWxsICkgeworICAgICAgICAgICAgICAgIGxvZygiTm8gcHVibGljICIgKyBtZXRob2ROYW1lICsgIigpIGluICIgKyBwcm94eS5nZXRDbGFzcygpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcHVibGljICIgKyBtZXRob2ROYW1lICsiKCkgaW4gIiArIHByb3h5LmdldENsYXNzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhlY3V0ZU0uaW52b2tlKHByb3h5LCBudWxsKTsKKyAgICAgICAgICAgIHJldHVybjsgCisgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIGxvZygiRXJyb3IgaW4gIiArIHByb3h5LmdldENsYXNzKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGllLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93ICgoQnVpbGRFeGNlcHRpb24pIHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgIGxvZygiRXJyb3IgaW4gIiArIHByb3h5LmdldENsYXNzKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIGV4ICk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgb2JqZWN0IHRvIHByb3h5IGZvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbyBUaGUgdGFyZ2V0IG9iamVjdC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJveHkoT2JqZWN0IG8pIHsKKyAgICAgICAgdGhpcy5wcm94eSA9IG87CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IG9iamVjdCBiZWluZyBwcm94aWVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCBwcm94eSBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3h5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcm94eSA7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZXNjcmlwdGlvbi5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzFlODE4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogRGVzY3JpcHRpb24gdGFzay4gSWYgdG9wIGxldmVsIHRhc2tzIGFyZSBleGVjdXRlZCBkdXJpbmcgcHJvY2Vzc2luZywgaW1wb3J0CisgKiBhbmQgZGVzY3JpcHRpb24gY2FuIGJlIHJlZ3VsYXIgdGFza3MsIHdpdGggbm8gbmVlZCBmb3Igc3BlY2lhbCBjb2RlIGluIHByb2Nlc3Nvci4KKyAqCisgKiAoIHRoaXMgb25seSB3b3JrcyBmb3IgdG9wLWxldmVsIGRlc2NyLiBBRkFJSyB0aGF0J3MgaG93IGl0IHdvcmtzIGluIGFudDEuNSApCisgKiBJZiB0aGlzIHdvdWxkIGJlIGV4dGVuZGVkIGZvciA8ZGVzY3JpcHRpb24+IGVsZW1lbnRzIGluIHRhcmdldHMgLSBhIHNwZWNpYWwKKyAqIGNvbnN0cnVjdCB3b3VsZCBiZSBuZWVkZWQgdG8gbWFyayB0aGlzIGFzICdwYXJzaW5nIHRpbWUnIHRhc2suCisgKiAKKyAqLworcHVibGljIGNsYXNzIERlc2NyaXB0aW9uIGV4dGVuZHMgVGFzayB7CisgICAgU3RyaW5nIGRlc2NyOworICAgIAorICAgIHB1YmxpYyBEZXNjcmlwdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzY3I7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVGV4dCggU3RyaW5nIHRleHQgKSB7CisgICAgICAgIHRoaXMuZGVzY3I9dGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbiggZGVzY3IgKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ltcG9ydC5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW1wb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwMzA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ltcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci4qOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJBZGFwdGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVMaXN0SW1wbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSkFYUFV0aWxzOworCisvKioKKyAqIEltcG9ydCB0YXNrLgorICoKKyAqIEl0IG11c3QgYmUgJ3RvcCBsZXZlbCcuIE9uIGV4ZWN1dGlvbiBpdCdsbCByZWFkIGFub3RoZXIgZmlsZQorICogaW50byB0aGUgc2FtZSBQcm9qZWN0LiAKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBUYXNrIHsKKyAgICBTdHJpbmcgZmlsZTsKKworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoIFN0cmluZyBmaWxlICkgeworICAgICAgICAvLyBJIGRvbid0IHRoaW5rIHdlIGNhbiB1c2UgRmlsZSAtIGRpZmZlcmVudCBydWxlcworICAgICAgICAvLyBmb3IgcmVsYXRpdmUgcGF0aHMuCisgICAgICAgIHRoaXMuZmlsZT1maWxlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXNhdGlvbiByb3V0aW5lIGNhbGxlZCBhZnRlciBoYW5kbGVyIGNyZWF0aW9uCisgICAgICogd2l0aCB0aGUgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGVzLiBUaGUgYXR0cmlidXRlcyB3aGljaAorICAgICAqIHRoaXMgaGFuZGxlciBjYW4gZGVhbCB3aXRoIGFyZTogPGNvZGU+ImRlZmF1bHQiPC9jb2RlPiwKKyAgICAgKiA8Y29kZT4ibmFtZSI8L2NvZGU+LCA8Y29kZT4iaWQiPC9jb2RlPiBhbmQgPGNvZGU+ImJhc2VkaXIiPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWcgTmFtZSBvZiB0aGUgZWxlbWVudCB3aGljaCBjYXVzZWQgdGhpcyBoYW5kbGVyCisgICAgICogICAgICAgICAgICB0byBiZSBjcmVhdGVkLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqICAgICAgICAgICAgSWdub3JlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzCisgICAgICogICAgICAgICAgICAgIGhhbmRsZXIgdG8gYmUgY3JlYXRlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIGFuIHVuZXhwZWN0ZWQgYXR0cmlidXRlIGlzCisgICAgICogICAgICAgICAgICBlbmNvdW50ZXJlZCBvciBpZiB0aGUgPGNvZGU+ImRlZmF1bHQiPC9jb2RlPiBhdHRyaWJ1dGUKKyAgICAgKiAgICAgICAgICAgIGlzIG1pc3NpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbXBvcnQgZWxlbWVudCBhcHBlYXJzIHdpdGhvdXQgYSBmaWxlIGF0dHJpYnV0ZSIpOworICAgICAgICB9CisgICAgCisgICAgICAgIFByb2plY3RIZWxwZXJJbXBsMi5BbnRYbWxDb250ZXh0IGNvbnRleHQ7CisgICAgICAgIGNvbnRleHQ9KFByb2plY3RIZWxwZXJJbXBsMi5BbnRYbWxDb250ZXh0KXByb2plY3QuZ2V0UmVmZXJlbmNlKCJhbnQucGFyc2luZy5jb250ZXh0Iik7CisKKyAgICAgICAgY29udGV4dC5pbXBvcnRsZXZlbCsrOworCisgICAgICAgIHByb2plY3QubG9nKCJpbXBvcnRsZXZlbDogIisoY29udGV4dC5pbXBvcnRsZXZlbC0xKSsiIC0+ICIrKGNvbnRleHQuaW1wb3J0bGV2ZWwpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIHByb2plY3QubG9nKCJJbXBvcnRpbmcgZmlsZSAiK2ZpbGUrIiBmcm9tICIrCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAvLyBQYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJ1aWxkIGZpbGUgdGhleSdyZSBpbXBvcnRlZCBmcm9tLAorICAgICAgICAvLyAqbm90KiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKHNhbWUgYXMgZW50aXR5IGluY2x1ZGVzKS4KKyAgICAgICAgRmlsZSBpbXBvcnRlZEZpbGUgPSBuZXcgRmlsZShmaWxlKTsKKyAgICAgICAgaWYgKCFpbXBvcnRlZEZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBpbXBvcnRlZEZpbGUgPSBuZXcgRmlsZShjb250ZXh0LmJ1aWxkRmlsZVBhcmVudCwgZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbXBvcnRlZEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBmaW5kICIrZmlsZSsiIGltcG9ydGVkIGZyb20gIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5idWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBBZGQgcGFyZW50IGJ1aWxkIGZpbGUgdG8gdGhlIG1hcCB0byBhdm9pZCBjeWNsZXMuLi4KKyAgICAgICAgU3RyaW5nIHBhcmVudEZpbGVuYW1lID0gZ2V0UGF0aChjb250ZXh0LmJ1aWxkRmlsZSk7CisgICAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZEZpbGVzLmNvbnRhaW5zS2V5KHBhcmVudEZpbGVuYW1lKSkgeworICAgICAgICAgICAgY29udGV4dC5pbXBvcnRlZEZpbGVzLnB1dChwYXJlbnRGaWxlbmFtZSwgY29udGV4dC5idWlsZEZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGltcG9ydCB0aGUgZmlsZSBvbmx5IG9uY2UKKyAgICAgICAgU3RyaW5nIGltcG9ydGVkRmlsZW5hbWUgPSBnZXRQYXRoKGltcG9ydGVkRmlsZSk7CisgICAgICAgIGlmIChjb250ZXh0LmltcG9ydGVkRmlsZXMuY29udGFpbnNLZXkoaW1wb3J0ZWRGaWxlbmFtZSkpIHsKKyAgICAgICAgICAgIHByb2plY3QubG9nKCJcblNraXBwZWQgYWxyZWFkeSBpbXBvcnRlZCBmaWxlOlxuICAgIitpbXBvcnRlZEZpbGVuYW1lKyJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIGNvbnRleHQuaW1wb3J0bGV2ZWwtLTsKKyAgICAgICAgICAgIHByb2plY3QubG9nKCJpbXBvcnRsZXZlbDogIitjb250ZXh0LmltcG9ydGxldmVsKyIgPC0gIisKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmltcG9ydGxldmVsKzEpICxQcm9qZWN0Lk1TR19ERUJVRyk7ICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC5pbXBvcnRlZEZpbGVzLnB1dChpbXBvcnRlZEZpbGVuYW1lLCBpbXBvcnRlZEZpbGUpOworICAgICAgICB9CisgICAgCisgICAgICAgIGNvbnRleHQuaWdub3JlUHJvamVjdFRhZz10cnVlOworICAgICAgICBjb250ZXh0LmhlbHBlci5wYXJzZShwcm9qZWN0LCBpbXBvcnRlZEZpbGUsIG5ldyBQcm9qZWN0SGVscGVySW1wbDIuUm9vdEhhbmRsZXIoY29udGV4dCkpOworICAgICAgICAKKyAgICAgICAgY29udGV4dC5pbXBvcnRsZXZlbC0tOworICAgICAgICBwcm9qZWN0LmxvZygiaW1wb3J0bGV2ZWw6ICIrY29udGV4dC5pbXBvcnRsZXZlbCsiIDwtICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRleHQuaW1wb3J0bGV2ZWwrMSkgLFByb2plY3QuTVNHX0RFQlVHKTsgICAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYXRoKEZpbGUgZmlsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N5c3RlbVBhdGguamF2YSBiL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N5c3RlbVBhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTZiODViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3lzdGVtUGF0aC5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKKy8vaW1wb3J0IG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZUxpc3RJbXBsOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBTcGVjaWZ5IGEgc3lzdGVtIHBhdGgsIHRvIGJlIHVzZWQgdG8gbG9hZCBvcHRpb25hbC5qYXIgYW5kIGFsbAorICogcmVsYXRlZCBsaWJyYXJpZXMuCisgKgorICogVXNpbmcgdGhlIHNwZWNpZmllZCBwYXRoIGl0J2xsIHRyeSB0byBsb2FkIG9yIHJlbG9hZCBhbGwgb3B0aW9uYWwKKyAqIHRhc2tzLiBUaGUgdHlwaWNhbCB1c2UgaXM6CisgKiA8cHJlPgorICogICZsdDtwYXRoIGlkPSJhbnQuZGVwcyIgJmd0OworICogICAgICZsdDtmaWxlc2V0IC4uLiAvJmd0OworICogICZsdDsvcGF0aCZndDsKKyAqCisgKiAgJmx0O3N5c3RlbVBhdGggcGF0aFJlZj0iYW50LmRlcHMiIC8mZ3Q7CisgKgorICogICZsdDtqdW5pdCAuLi4gLyZndDsKKyAqIDwvcHJlPgorICoKKyAqIFRoaXMgcmVxdWlyZXMgdGhhdCBhbnQtc2F4Mi5qYXIgaXMgaW5jbHVkZWQgaW4gYW50L2xpYi4KKyAqCisgKiBJdCBoYXMgYSBzaW5nbGUgcHJvcGVydHksIGEgcmVmZXJlbmNlIHRvIGEgJmx0O3BhdGgmZ3Q7IGNvbnRhaW5pbmcgYWxsCisgKiB0aGUgamFycyB0aGF0IHlvdSBuZWVkLiBJdCdsbCBhdXRvbWF0aWNhbGx5IHJlbG9hZCBvcHRpb25hbC5qYXIKKyAqIHRhc2tzIGluIGEgZGlmZmVyZW50IChub24tZGVsZWdhdGluZykgbG9hZGVyLgorICoKKyAqLworcHVibGljIGNsYXNzIFN5c3RlbVBhdGggZXh0ZW5kcyBUYXNrIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fTE9BREVSX1JFRj0iYW50LnN5c3RlbS5sb2FkZXIiOworICAgIAorICAgIHB1YmxpYyBTeXN0ZW1QYXRoKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGhSZWYoIFJlZmVyZW5jZSBwYXRoUmVmICkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0Q2xhc3NwYXRoUmVmKCBwYXRoUmVmICk7CisgICAgfQorCisgICAgLyoqIFNwZWNpZnkgd2hpY2ggcGF0aCB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKCBSZWZlcmVuY2UgcGF0aFJlZiApIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggcGF0aD0oUGF0aClwYXRoUmVmLmdldFJlZmVyZW5jZWRPYmplY3QocHJvamVjdCk7CisKKyAgICAgICAgaW5pdFN5c3RlbUxvYWRlcihwYXRoKTsKKworICAgIH0KKyAgICAKKyAgICAvKiogV2lsbCBwcmVwYXJlIHRoZSBjbGFzcyBsb2FkZXIgdG8gYWxsb3cgZHluYW1pYyBtb2RpZmljYXRpb25zCisgICAgICogICBvZiB0aGUgY2xhc3NwYXRoLiBPcHRpb25hbCB0YXNrcyBhcmUgbG9hZGVkIGluIGEgZGlmZmVyZW50IGxvYWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdFN5c3RlbUxvYWRlcihQYXRoIHBhdGgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vaWYoIHByb2plY3QuZ2V0UmVmZXJlbmNlKCBTWVNURU1fTE9BREVSX1JFRiApICE9IG51bGwgKQorICAgICAgICAgICAgLy8gICAgcmV0dXJuOyAvLyBhbHJlYWR5IGRvbmUgdGhhdC4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gcmV2ZXJzZSBsb2FkZXIKKyAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGFjbD0oQW50Q2xhc3NMb2FkZXIpcHJvamVjdC5nZXRSZWZlcmVuY2UoU1lTVEVNX0xPQURFUl9SRUYpOworICAgICAgICAgICAgaWYoIGFjbD09bnVsbCApIHsKKyAgICAgICAgICAgICAgICBhY2w9bmV3IEFudENsYXNzTG9hZGVyKCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgdHJ1ZSApOworICAgICAgICAgICAgICAgIGFjbC5hZGRMb2FkZXJQYWNrYWdlUm9vdCggIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsIik7CisgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoIFNZU1RFTV9MT0FERVJfUkVGLCBhY2wgKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBTdHJpbmcgbGlzdFtdPXBhdGgubGlzdCgpOworICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmPSBuZXcgRmlsZSggbGlzdFtpXSApOworICAgICAgICAgICAgICAgIGlmKCBmLmV4aXN0cygpICkgeworICAgICAgICAgICAgICAgICAgICBhY2wuYWRkUGF0aEVsZW1lbnQoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGxvZygiQWRkaW5nIHRvIGNsYXNzIGxvYWRlciAiICsgIGFjbCArICIgIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBYWFggZmluZCB0aGUgY2xhc3NwYXRoIC0gYWRkIHRoZSBvcHRpb25hbCBqYXJzLgorICAgICAgICAgICAgU3RyaW5nIGFudEhvbWU9cHJvamVjdC5nZXRQcm9wZXJ0eSggImFudC5ob21lIiApOworICAgICAgICAgICAgRmlsZSBvcHRpb25hbEphcj1uZXcgRmlsZSggYW50SG9tZSArICIvbGliL29wdGlvbmFsLmphciIgKTsKKyAgICAgICAgICAgIGlmKCBvcHRpb25hbEphci5leGlzdHMoKSApCisgICAgICAgICAgICAgICAgYWNsLmFkZFBhdGhFbGVtZW50KG9wdGlvbmFsSmFyLmdldEFic29sdXRlUGF0aCgpICk7CisKKyAgICAgICAgICAgIC8vIHJlaW5pdCB0aGUgbG9hZGVyIGZvciBvcHRpb25hbCwgaWYgdGhleSB3ZXJlIGluIC9saWIvCisgICAgICAgICAgICBIYXNodGFibGUgdGFza3M9cHJvamVjdC5nZXRUYXNrRGVmaW5pdGlvbnMoKTsKKworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlcGxhY2luZyBqYXJzIiApOworICAgICAgICAgICAgLy8gcmVsb2FkIGFsbCBvcHRpb25hbCB0YXNrcyBpbiB0aGlzIGxvYWRlci4KKyAgICAgICAgICAgIC8vIFNvbWUgdGFza3Mgd2VyZW4ndCBkZWZpbmVkIGJ5IHRoZSBub3JtYWwgaW5pdCgpLCBzaW5jZSBkZXBzIHdlcmUgbWlzc2luZy4KKyAgICAgICAgICAgIFN0cmluZyBkZWZzID0gIi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIjsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGRlZnMpOworICAgICAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgbG9hZCBkZWZhdWx0IHRhc2sgbGlzdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bSA9IHRhc2tzLmtleXMoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSggIGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYz0oQ2xhc3MpdGFza3MuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhIGMuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoICJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbCIgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBjbGFzc2VzIHRoYXQgbmVlZHMgdG8gYmUgcmVwbGFjZWQgPz8KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHRhc2tDbGFzcyA9IGFjbC5sb2FkQ2xhc3MoYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9qZWN0LmFkZFRhc2tEZWZpbml0aW9uKGtleSwgdGFza0NsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0VGFza0RlZmluaXRpb25zKCkucHV0KGtleSwgdGFza0NsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJMb2FkZWQgIiArIGtleSArICIgIiArIHRhc2tDbGFzcy5nZXRDbGFzc0xvYWRlcigpICk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkNvdWxkIG5vdCBsb2FkIGEgZGVwZW5kZW50IGNsYXNzICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuY2RmZS5nZXRNZXNzYWdlKCkgKyAiKSBmb3IgdGFzayAiICsga2V5LCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJDb3VsZCBub3QgbG9hZCBjbGFzcyAoIiArIGMuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBmb3IgdGFzayAiICsga2V5LCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBTb21lIHRhc2tzIGNvdWxkbid0IGJlIGRlZmluZWQgb24gdGhlIGZpcnN0IHJ1bgorICAgICAgICAgICAgICAgIGVudW0gPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoICEgdmFsdWUuc3RhcnRzV2l0aCggIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsIiApKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0YXNrcy5nZXQoIGtleSApICE9IG51bGwgKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIGNsYXNzZXMgdGhhdCBuZWVkcyB0byBiZSByZXBsYWNlZCA/PworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdGFza0NsYXNzID0gYWNsLmxvYWRDbGFzcyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3Byb2plY3QuYWRkVGFza0RlZmluaXRpb24oa2V5LCB0YXNrQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRUYXNrRGVmaW5pdGlvbnMoKS5wdXQoa2V5LCB0YXNrQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRlZCAiICsga2V5ICsgIiAiICsgdGFza0NsYXNzLmdldENsYXNzTG9hZGVyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgbmNkZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGxvYWQgYSBkZXBlbmRlbnQgY2xhc3MgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5jZGZlLmdldE1lc3NhZ2UoKSArICIpIGZvciB0YXNrICIgKyBrZXksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkNvdWxkIG5vdCBsb2FkIGNsYXNzICgiICsgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIGZvciB0YXNrICIgKyBrZXksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgbG9hZCBkZWZhdWx0IHRhc2sgbGlzdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZjIuamF2YSBiL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWYyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2Y2Y4YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWYyLmphdmEKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCisvLyBYWFggSGFkIHRvIGN1dCZwYXN0ZSB0aGUgY29kZSBpbiBEZWZpbmVyIC0gc2luY2UgbW9zdCBmaWVsZHMgYXJlIHByaXZhdGUKKy8vIGFuZCBubyBhY2Nlc3NvciBpcyBhdmFpbGFibGUuCisKKy8qKgorICogU3BlY2lhbCB2ZXJzaW9uIG9mIHRhc2tkZWYgdXNpbmcgdGhlIGNvbmZpZ3VyYWJsZSBhbnQgY2xhc3MgbG9hZGVyLgorICogSXQgd2lsbCBhbHNvIGhhdmUgYWRkaXRpb25hbCBmZWF0dXJlcyAoIE1FVEEtSU5GL2FudC5wcm9wZXJ0aWVzICxldGMgKS4KKyAqIAorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImludGVybmFsIgorICovCitwdWJsaWMgY2xhc3MgVGFza2RlZjIgZXh0ZW5kcyBEZWZpbmVyIHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGg7CisgICAgcHJpdmF0ZSBGaWxlIGZpbGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHJldmVyc2VMb2FkZXIgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBsb2FkZXJJZCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NwYXRoSWQgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVVNFX0xPQURFUl9SRUYgPSAiYW50LnJldXNlLmxvYWRlciI7CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBzdG9wIHVzaW5nIHRoaXMgYXR0cmlidXRlCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldmVyc2VMb2FkZXIoYm9vbGVhbiByZXZlcnNlTG9hZGVyKSB7CisgICAgICAgIHRoaXMucmV2ZXJzZUxvYWRlciA9IHJldmVyc2VMb2FkZXI7CisgICAgICAgIGxvZygiVGhlIHJldmVyc2Vsb2FkZXIgYXR0cmlidXRlIGlzIERFUFJFQ0FURUQuIEl0IHdpbGwgYmUgcmVtb3ZlZCIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjb21wb25lbnQgYmVpbmcgZGVmaW5lZAorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNvbXBvbmVudCBiZWluZyBkZWZpbmVkCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGZpbGVzLgorICAgICAqIFRvIGFjdHVhbGx5IHNoYXJlIHRoZSBzYW1lIGxvYWRlciwgc2V0IGxvYWRlcnJlZiBhcyB3ZWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNsYXNzcGF0aElkPXIuZ2V0UmVmSWQoKTsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRoZSByZWZlcmVuY2UgdG8gbG9jYXRlIHRoZSBsb2FkZXIuIElmIHRoZSBsb2FkZXIgaXMgbm90CisgICAgICogZm91bmQsIHRhc2tkZWYgd2lsbCB1c2UgdGhlIHNwZWNpZmllZCBjbGFzc3BhdGggYW5kIHJlZ2lzdGVyIGl0CisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBUaGlzIGFsbG93IG11bHRpcGxlIHRhc2tkZWYvdHlwZWRlZiB0byB1c2UgdGhlIHNhbWUgY2xhc3MgbG9hZGVyLAorICAgICAqIHNvIHRoZXkgY2FuIGJlIHVzZWQgdG9nZXRoZXIuIEl0IGVsaW1pbmF0ZSB0aGUgbmVlZCB0bworICAgICAqIHB1dCB0aGVtIGluIHRoZSBDTEFTU1BBVEguCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvYWRlclJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBsb2FkZXJJZCA9IHIuZ2V0UmVmSWQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBBbnRDbGFzc0xvYWRlciBhbCA9IGNyZWF0ZUxvYWRlcigpOworCisgICAgICAgIGlmIChmaWxlID09IG51bGwgJiYgcmVzb3VyY2UgPT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBzaW1wbGUgY2FzZSAtIG9uZSBkZWZpbml0aW9uCisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIm5hbWUgb3IgY2xhc3NuYW1lIGF0dHJpYnV0ZXMgb2YgIgorICAgICAgICAgICAgICAgICAgICArIGdldFRhc2tOYW1lKCkgKyAiIGVsZW1lbnQgIgorICAgICAgICAgICAgICAgICAgICArICJhcmUgdW5kZWZpbmVkIjsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZERlZmluaXRpb24oYWwsIG5hbWUsIHZhbHVlKTsKKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgfHwgdmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5hbWUgb3IgdmFsdWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAidG9nZXRoZXIgd2l0aCBmaWxlIG9yIHJlc291cmNlLiI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgcmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIllvdSBtdXN0IG5vdCBzcGVjaWZ5IGJvdGgsIGZpbGUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInJlc291cmNlLiI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkxvYWRpbmcgZGVmaW5pdGlvbnMgZnJvbSBmaWxlICIgKyBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGxvYWQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlICIgKyBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBJdCBkb2VzblwndCBleGlzdC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkxvYWRpbmcgZGVmaW5pdGlvbnMgZnJvbSByZXNvdXJjZSAiICsgcmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgaXMgPSBhbC5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGxvYWQgZGVmaW5pdGlvbnMgZnJvbSByZXNvdXJjZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNvdXJjZSArICIuIEl0IGNvdWxkIG5vdCBiZSBmb3VuZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcHMubG9hZChpcyk7CisgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBwcm9wcy5rZXlzKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbiA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gcHJvcHMuZ2V0UHJvcGVydHkobik7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGREZWZpbml0aW9uKGFsLCBuLCB2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4LCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIHRoZSBjbGFzc2xvYWRlciB0aGVuIGhhbmQgdGhlIGRlZmluaXRpb24gb2ZmIHRvIHRoZSBzdWJjbGFzczsKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHdoZW4gdGhlIGNsYXNzIHdvbnQgbG9hZCBmb3IgYW55IHJlYXNvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZERlZmluaXRpb24oQ2xhc3NMb2FkZXIgYWwsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjID0gYWwubG9hZENsYXNzKHZhbHVlKTsKKyAgICAgICAgICAgIEFudENsYXNzTG9hZGVyLmluaXRpYWxpemVDbGFzcyhjKTsKKyAgICAgICAgICAgIGFkZERlZmluaXRpb24obmFtZSwgYyk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGdldFRhc2tOYW1lKCkgKyAiIGNsYXNzICIgKyB2YWx1ZQorICAgICAgICAgICAgICAgICsgIiBjYW5ub3QgYmUgZm91bmQiOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgY25mZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gZ2V0VGFza05hbWUoKSArICIgY2xhc3MgIiArIHZhbHVlCisgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBiZSBmb3VuZCI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBuY2RmZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgYSBjbGFzc2xvYWRlciBmb3IgdGhpcyBkZWZpbml0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIEFudENsYXNzTG9hZGVyIGNyZWF0ZUxvYWRlcigpIHsKKyAgICAgICAgLy8gbWFnaWMgcHJvcGVydHkKKyAgICAgICAgaWYgKGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShSRVVTRV9MT0FERVJfUkVGKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgJ3JldXNlJyBuYW1lIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgcmVmZXJlbmNlLgorICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgPHRhc2tkZWZzPiB0aGF0IHdvcmsgb24gYm90aCBhbnQxLjQgYW5kIGFudDEuNS4KKyAgICAgICAgICAgIC8vICggaW4gMS40IGl0J2xsIHJlcXVpcmUgdGhlIHRhc2svdHlwZSB0byBiZSBpbiBjbGFzc3BhdGggaWYgdGhleQorICAgICAgICAgICAgLy8gICBhcmUgdXNlZCB0b2doZXRlciApLgorICAgICAgICAgICAgaWYgKGxvYWRlcklkID09IG51bGwgJiYgY2xhc3NwYXRoSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvYWRlcklkID0gImFudC5sb2FkZXIuIiArIGNsYXNzcGF0aElkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgYSBsb2FkZXIgaGFzIGJlZW4gc2V0ICggZWl0aGVyIGJ5IGxvYWRlclJlZiBvciBtYWdpYyBwcm9wZXJ0eSApCisgICAgICAgIGlmIChsb2FkZXJJZCAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3QgcmV1c2VkTG9hZGVyID0gZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShsb2FkZXJJZCk7CisgICAgICAgICAgICBpZiAocmV1c2VkTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocmV1c2VkTG9hZGVyIGluc3RhbmNlb2YgQW50Q2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChBbnRDbGFzc0xvYWRlcilyZXVzZWRMb2FkZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEluIGZ1dHVyZSB0aGUgcmVmZXJlbmNlIG9iamVjdCBtYXkgYmUgdGhlIDxsb2FkZXI+IHR5cGUKKyAgICAgICAgICAgICAgICAvLyBpZiggcmV1c2VkTG9hZGVyIGluc3RhbmNlb2YgTG9hZGVyICkgeworICAgICAgICAgICAgICAgIC8vICAgICAgcmV0dXJuICgoTG9hZGVyKXJldXNlZExvYWRlcikuZ2V0TG9hZGVyKHByb2plY3QpOworICAgICAgICAgICAgICAgIC8vIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFudENsYXNzTG9hZGVyIGFsID0gKEFudENsYXNzTG9hZGVyKXByb2plY3QuZ2V0UmVmZXJlbmNlKCAiYW50LnN5c3RlbS5sb2FkZXIiICk7CisgICAgICAgIGlmKCBhbD09bnVsbCApIHsKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFsID0gbmV3IEFudENsYXNzTG9hZGVyKGdldFByb2plY3QoKSwgY2xhc3NwYXRoLCAhcmV2ZXJzZUxvYWRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsID0gbmV3IEFudENsYXNzTG9hZGVyKGdldFByb2plY3QoKSwgUGF0aC5zeXN0ZW1DbGFzc3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXJldmVyc2VMb2FkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWwgPSBuZXcgQW50Q2xhc3NMb2FkZXIoYWwsIGdldFByb2plY3QoKSwgY2xhc3NwYXRoLCAhcmV2ZXJzZUxvYWRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsID0gbmV3IEFudENsYXNzTG9hZGVyKGFsLCBnZXRQcm9qZWN0KCksIFBhdGguc3lzdGVtQ2xhc3NwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZXZlcnNlTG9hZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBuZWVkIHRvIGxvYWQgVGFzayB2aWEgc3lzdGVtIGNsYXNzbG9hZGVyIG9yIHRoZSBuZXcKKyAgICAgICAgLy8gdGFzayB3ZSB3YW50IHRvIGRlZmluZSB3aWxsIG5ldmVyIGJlIGEgVGFzayBidXQgYWx3YXlzCisgICAgICAgIC8vIGJlIHdyYXBwZWQgaW50byBhIFRhc2tBZGFwdGVyLgorICAgICAgICBhbC5hZGRTeXN0ZW1QYWNrYWdlUm9vdCgib3JnLmFwYWNoZS50b29scy5hbnQiKTsKKworCisgICAgICAgIC8vIElmIHRoZSBsb2FkZXIgaXMgbmV3LCByZWNvcmQgaXQgZm9yIGZ1dHVyZSB1c2VzIGJ5IG90aGVyCisgICAgICAgIC8vIHRhc2svdHlwZWRlZnMKKyAgICAgICAgaWYgKGxvYWRlcklkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKGxvYWRlcklkKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZShsb2FkZXJJZCwgYWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgIHRvIGxvYWQKKyAgICAgKiBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWQKKyAgICAgKiBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShTdHJpbmcgcmVzKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgcHJvcGVydHkgcmVzb3VyY2UgdG8gbG9hZAorICAgICAqIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc25hbWUgb2YgdGhlIG9iamVjdCB3ZSBhcmUgZGVmaW5pbmcuIAorICAgICAqIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmdWxsIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWZpbmVkLgorICAgICAqIFJlcXVpcmVkLCB1bmxlc3MgZmlsZSBvciByZXNvdXJjZSBoYXZlCisgICAgICogYmVlbiBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKFN0cmluZyB2KSB7CisgICAgICAgIHZhbHVlID0gdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdWJjbGFzc2VkIGhhbmRsZXIgZm9yIGRlZmluaXRpb25zOyBjYWxsZWQgYnkgcGFyZW50IGR1cmluZworICAgICAqIGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGREZWZpbml0aW9uKFN0cmluZyBuYW1lLCBDbGFzcyBjKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBnZXRQcm9qZWN0KCkuYWRkVGFza0RlZmluaXRpb24obmFtZSwgYyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWE1MRE9NLmphdmEgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YTUxET00uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjgzYjFiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWE1MRE9NLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKKy8qKgorICogTG9hZHMgYW4geG1sIGZpbGUgYXMgRE9NIGluIGEgRGF0YVR5cGUKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxET00gZXh0ZW5kcyBEYXRhVHlwZSB7CisgICAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgZGF0YSB0eXBlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9UWVBFX05BTUUgPSAieG1sZG9tIjsKKworICAgIHByaXZhdGUgRmlsZSB4bWxmaWxlID0gbnVsbDsKKyAgICBwcml2YXRlIERvY3VtZW50IGRvY1Jvb3QgPSBudWxsOworCisgICAgcHVibGljIFhNTERPTSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgeG1sZmlsZSkgeworICAgICAgICB0aGlzLnhtbGZpbGUgPSB4bWxmaWxlOworICAgIH0KKworICAgIC8qKioKKyAgICAgKiBHZXRzIHRoZSBEb2N1bWVudCByb290IG9mIHRoZSBET00gCisgICAgICogZ2l2ZW4gcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0Um9vdCgpIHsKKyAgICAgIGlmKGRvY1Jvb3Q9PW51bGwpeworICAgICAgICB0cnl7CisgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgIC8vRklYTUUgZXZlbnR1YWxseSBzZXQgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBwcm9wZXJ0aWVzIGluIHRoZSBmdXR1cmUgCisgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgIC8vRklYTUUgZXZlbnR1YWxseSBzZXQgRG9jdW1lbnRCdWlsZGVyIHByb3BlcnRpZXMgaW4gdGhlIGZ1dHVyZSAKKyAgICAgICAgICB0aGlzLmRvY1Jvb3QgPSBidWlsZGVyLnBhcnNlKHhtbGZpbGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKXsKKyAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGluIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBwYXJzZXIiLCBwY2UpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKFNBWEV4Y2VwdGlvbiBzZSl7CisgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgcGFyc2luZyIsIHNlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpeworICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgbG9hZCB0aGUgc3BlY2lmaWVkIGZpbGUiLCBpb2UpOworICAgICAgICB9CisgICAgICB9ICAgICAgCisgICAgICAKKyAgICAgIHJldHVybiBkb2NSb290OworICAgIH0KKworCisgICAgLyoqKgorICAgICAqIEdldCB0aGUgUmVndWxhckV4cHJlc3Npb24gdGhpcyByZWZlcmVuY2UgcmVmZXJzIHRvIGluCisgICAgICogdGhlIGdpdmVuIHByb2plY3QuICBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyB0b28KKyAgICAgKi8KKy8qCisgICAgcHVibGljIFN1YnN0aXR1dGlvbiBnZXRSZWYoUHJvamVjdCBwKSB7CisgICAgICAgIGlmICghaXNDaGVja2VkKCkpIHsKKyAgICAgICAgICAgIFN0YWNrIHN0ayA9IG5ldyBTdGFjaygpOworICAgICAgICAgICAgc3RrLnB1c2godGhpcyk7CisgICAgICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHN0aywgcCk7CisgICAgICAgIH0KKworICAgICAgICAKKyAgICAgICAgT2JqZWN0IG8gPSBnZXRSZWZpZCgpLmdldFJlZmVyZW5jZWRPYmplY3QocCk7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBTdWJzdGl0dXRpb24pKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gZ2V0UmVmaWQoKS5nZXRSZWZJZCgpICsgIiBkb2VzblwndCBkZW5vdGUgYSBzdWJzdGl0dXRpb24iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKFN1YnN0aXR1dGlvbikgbzsKKyAgICAgICAgfQorICAgIH0KKyovCit9IC8vLS0gWE1MRE9NLmphdmEKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0pYUGF0aC5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSlhQYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3NmI2NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0pYUGF0aC5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLio7CisKKy8vIEV4cGVyaW1lbnRhbDogbmVlZCB0byBhZGQgY29kZSB0byBzZWxlY3QgdGhlICdyb290JywgZXRjLgorCisvKioKKyAqICBFbmFibGUgSlhQYXRoIGR5bmFtaWMgcHJvcGVydGllcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKWFBhdGggZXh0ZW5kcyBUYXNrIHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZJWD0ianhwYXRoOiI7CisgICAgSlhQYXRoUHJvcGVydHlIZWxwZXIgaGVscGVyPW5ldyBKWFBhdGhQcm9wZXJ0eUhlbHBlcigpOworCisgICAgcHVibGljIEpYUGF0aCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgSlhQYXRoQ29udGV4dCBnZXRKWFBhdGhDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gaGVscGVyLmp4cGF0aEN0eDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBKWFBhdGhJbnRyb3NwZWN0b3IucmVnaXN0ZXJEeW5hbWljQ2xhc3MoSGFzaHRhYmxlLmNsYXNzLCBKWFBhdGhIYXNodGFibGVIYW5kbGVyLmNsYXNzKTsKKyAgICAgICAgaGVscGVyLmp4cGF0aEN0eD1KWFBhdGhDb250ZXh0Lm5ld0NvbnRleHQoIHByb2plY3QgKTsKKyAgICAgICAgaGVscGVyLmp4cGF0aEN0eC5zZXRWYXJpYWJsZXMobmV3IEFudFZhcmlhYmxlcygpKTsKKworICAgICAgICBQcm9wZXJ0eUhlbHBlciBwaGVscGVyPVByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKCBwcm9qZWN0ICk7CisgICAgICAgIGhlbHBlci5zZXRQcm9qZWN0KCBwcm9qZWN0ICk7CisgICAgICAgIGhlbHBlci5zZXROZXh0KCBwaGVscGVyLmdldE5leHQoKSApOworICAgICAgICBwaGVscGVyLnNldE5leHQoIGhlbHBlciApOworCisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCAianhwYXRoVGFzayIsIHRoaXMgKTsKKworICAgIH0KKworCisgICAgc3RhdGljIGNsYXNzIEpYUGF0aFByb3BlcnR5SGVscGVyIGV4dGVuZHMgUHJvcGVydHlIZWxwZXIgeworICAgICAgICBKWFBhdGhDb250ZXh0IGp4cGF0aEN0eDsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXRQcm9wZXJ0eUhvb2soIFN0cmluZyBucywgU3RyaW5nIG5hbWUsIE9iamVjdCB2LCBib29sZWFuIGluaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZXIsIGJvb2xlYW4gaXNOZXcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhIG5hbWUuc3RhcnRzV2l0aChQUkVGSVgpICkgeworICAgICAgICAgICAgICAgIC8vIHBhc3MgdG8gbmV4dAorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5zZXRQcm9wZXJ0eUhvb2sobnMsIG5hbWUsIHYsIGluaCwgdXNlciwgaXNOZXcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZT1uYW1lLnN1YnN0cmluZyggUFJFRklYLmxlbmd0aCgpICk7CisKKyAgICAgICAgICAgIGp4cGF0aEN0eC5zZXRWYWx1ZSggbmFtZSwgdiApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5SG9vayggU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSAsIGJvb2xlYW4gdXNlcikgeworICAgICAgICAgICAgaWYoICEgbmFtZS5zdGFydHNXaXRoKFBSRUZJWCkgKSB7CisgICAgICAgICAgICAgICAgLy8gcGFzcyB0byBuZXh0CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5SG9vayhucywgbmFtZSwgdXNlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5hbWU9bmFtZS5zdWJzdHJpbmcoIFBSRUZJWC5sZW5ndGgoKSApOworCisgICAgICAgICAgICAvL09iamVjdCBvPWp4cGF0aEN0eC5nZXRWYWx1ZSggbmFtZSApOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkpYUGF0aDogZ2V0UHJvcGVydHkgIiArIG5zICsgIiAiICsgbmFtZSArICI9IiArIG8gKyBvLmdldENsYXNzKCkpOworCisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBqeHBhdGhDdHguaXRlcmF0ZShuYW1lKTsKKworICAgICAgICAgICAgaWYoaXRlcj09bnVsbHx8IWl0ZXIuaGFzTmV4dCgpKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQgKz0gaXRlci5uZXh0KCk7CisKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIsICIrbzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKWFBhdGhIYXNodGFibGVIYW5kbGVyIGltcGxlbWVudHMgRHluYW1pY1Byb3BlcnR5SGFuZGxlciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIGFsbCBrZXlzIGluIHRoZSBtYXAuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvcGVydHlOYW1lcyhPYmplY3Qgb2JqZWN0KXsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0UHJvcGVydHlOYW1lcyAiICsgb2JqZWN0ICk7CisgICAgICAgICAgICBIYXNodGFibGUgbWFwID0gKEhhc2h0YWJsZSkgb2JqZWN0OworICAgICAgICAgICAgU3RyaW5nIG5hbWVzW10gPSBuZXcgU3RyaW5nW21hcC5zaXplKCldOworICAgICAgICAgICAgRW51bWVyYXRpb24gaXQgPSBtYXAua2V5cygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgbmFtZXNbaV0gPSBTdHJpbmcudmFsdWVPZihpdC5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgICAgIC8vICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFByb3BlcnR5ICIgKyBvYmplY3QgKyAiICIgKyBwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgcmV0dXJuICgoSGFzaHRhYmxlKSBvYmplY3QpLmdldChwcm9wZXJ0eU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBrZXkgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpeworICAgICAgICAgICAgKChIYXNodGFibGUpb2JqZWN0KS5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQW50VmFyaWFibGVzIGltcGxlbWVudHMgVmFyaWFibGVzIHsKKworICAgICAgICAgcHJvdGVjdGVkIEFudFZhcmlhYmxlcygpeworICAgICAgICAgfQorCisgICAgICAgICBwdWJsaWMgdm9pZCBkZWNsYXJlVmFyaWFibGUoU3RyaW5nIHZhck5hbWUsIE9iamVjdCB2YWx1ZSl7CisgICAgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkodmFyTmFtZSwgdmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICB9CisKKyAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFyaWFibGUoU3RyaW5nIHZhck5hbWUpeworICAgICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRQcm9wZXJ0eSh2YXJOYW1lKTsKKyAgICAgICAgIH0KKworICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWNsYXJlZFZhcmlhYmxlKFN0cmluZyB2YXJOYW1lKXsKKyAgICAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0UHJvcGVydHkodmFyTmFtZSkgPT0gbnVsbCA/IGZhbHNlIDogdHJ1ZSA7CisgICAgICAgICB9CisKKyAgICAgICAgIHB1YmxpYyB2b2lkIHVuZGVjbGFyZVZhcmlhYmxlKFN0cmluZyB2YXJOYW1lKXsKKyAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgdW5kZWNsYXJlIHZhcmlhYmxlcyBpbiBBbnQuIik7CisgICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0pYUGF0aFNldC5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSlhQYXRoU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjNTk0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0pYUGF0aFNldC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLio7CisKKworLyoqCisgKiAgU2V0IGEgSlhQYXRoIHByb3BlcnR5CisgKiAgCisgKgorICogQGRlcHJlY2F0ZWQgQSBnZW5lcmljIDxwcm9wZXJ0eT4gc2hvdWxkIGJlIHVzZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBKWFBhdGhTZXQgZXh0ZW5kcyBUYXNrIHsKKworICAgIFN0cmluZyBwYXRoOworICAgIFN0cmluZyB2YWx1ZVN0cmluZzsKKyAgICBTdHJpbmcgcmVmSWQ7CisgICAgCisgICAgcHVibGljIEpYUGF0aFNldCgpIHsKKyAgICB9CisKKyAgICAvKiogVGhlIEpYUGF0aCBwb2ludGluZyB0byB0aGUgdGFyZ2V0LgorICAgICAqICBUaGUgcm9vdCBvZiB0aGUgdHJlZSBpcyB0aGUgUHJvamVjdC4KKyAgICAgKiAgRXhhbXBsZToKKyAgICAgKiAgICAgIC9yZWZlcmVuY2VzW0BuYW1lPSdteVJlZiddCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKCBTdHJpbmcgcGF0aCApIHsKKyAgICAgICAgdGhpcy5wYXRoPXBhdGg7CisgICAgfQorCisgICAgLyoqIFRoZSB2YWx1ZSB3aWxsIGJlIHRoZSByZWZlcmVuY2VkIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZJZCggU3RyaW5nIHJlZklkICkgeworICAgICAgICB0aGlzLnJlZklkPXJlZklkOworICAgIH0KKworICAgIC8qKiBTZXQgdGhlIHZhbHVlIHRvIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoIFN0cmluZyBzICkgeworICAgICAgICB0aGlzLnZhbHVlU3RyaW5nPXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgSlhQYXRoQ29udGV4dCBqeHBhdGhDdHg7CisgICAgICAgIEpYUGF0aCBqeHBhdGhUYXNrPShKWFBhdGgpcHJvamVjdC5nZXRSZWZlcmVuY2UoICJqeHBhdGhUYXNrIiApOworICAgICAgICBqeHBhdGhDdHg9anhwYXRoVGFzay5nZXRKWFBhdGhDb250ZXh0KCk7CisKKyAgICAgICAgT2JqZWN0IHZhbHVlPW51bGw7CisgICAgICAgIGlmKCByZWZJZCE9bnVsbCApCisgICAgICAgICAgICB2YWx1ZT1wcm9qZWN0LmdldFJlZmVyZW5jZSggcmVmSWQgKTsKKyAgICAgICAgaWYoIHZhbHVlPT1udWxsICkKKyAgICAgICAgICAgIHZhbHVlPXZhbHVlU3RyaW5nOworICAgICAgICAKKyAgICAgICAganhwYXRoQ3R4LnNldFZhbHVlKCBwYXRoLCB2YWx1ZSApOworICAgIH0gICAgCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9KZXhsUHJvcGVydGllcy5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSmV4bFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGYwOWExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSmV4bFByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qZXhsLio7CisKKy8qKgorICogIEVuYWJsZSBKRVhMIGR5bmFtaWMgcHJvcGVydGllcworICogIAorICoKKyAqLworcHVibGljIGNsYXNzIEpleGxQcm9wZXJ0aWVzIGV4dGVuZHMgVGFzayB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRklYPSJqZXhsOiI7CisgICAgSmV4bFByb3BlcnR5SGVscGVyIGhlbHBlcj1uZXcgSmV4bFByb3BlcnR5SGVscGVyKCk7CisKKyAgICBwdWJsaWMgSmV4bFByb3BlcnRpZXMoKSB7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEpleGxQcm9wZXJ0eUhlbHBlciBleHRlbmRzIFByb3BlcnR5SGVscGVyIHsKKyAgICAgICAgSmV4bENvbnRleHQgamM7CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eUhvb2soIFN0cmluZyBucywgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdXNlciApIHsKKyAgICAgICAgICAgIGlmKCAhIG5hbWUuc3RhcnRzV2l0aChQUkVGSVgpICkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQcm9wZXJ0eUhvb2sobnMsIG5hbWUsIHVzZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuYW1lPW5hbWUuc3Vic3RyaW5nKCBQUkVGSVgubGVuZ3RoKCkgKTsKKyAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGUgPSBFeHByZXNzaW9uRmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKG5hbWUpOworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gZS5ldmFsdWF0ZShqYyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICAvKgorICAgICAgICAgKiAgRmlyc3QgbWFrZSBhIGpleGxDb250ZXh0IGFuZCBwdXQgc3R1ZmYgaW4gaXQKKyAgICAgICAgICovCisgICAgICAgIGhlbHBlci5qYyA9IEpleGxIZWxwZXIuY3JlYXRlQ29udGV4dCgpOworICAgICAgICBoZWxwZXIuamMuZ2V0VmFycygpLnB1dCgiYW50IiwgcHJvamVjdCk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgaXQKKyAgICAgICAgUHJvcGVydHlIZWxwZXIgcGhlbHBlcj1Qcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlciggcHJvamVjdCApOworICAgICAgICBoZWxwZXIuc2V0TmV4dCggcGhlbHBlci5nZXROZXh0KCkgKTsKKyAgICAgICAgaGVscGVyLnNldFByb2plY3QoIHByb2plY3QgKTsKKyAgICAgICAgcGhlbHBlci5zZXROZXh0KCBoZWxwZXIgKTsKKworCisKKyAgICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVGFza0Rpc2NvdmVyeS5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVGFza0Rpc2NvdmVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NzQyNDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9lbWJlZC9zcmMvamF2YS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UYXNrRGlzY292ZXJ5LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiwgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQ29tbW9ucyIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS4qOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnkuamRrLkpES0hvb2tzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnkucmVzb3VyY2UuKjsKKworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGRpc2NvdmVyeSBhbmQgKGxhenkpIGNyZWF0aW9uIG9mIHRhc2tzLgorICoKKyAqIFNldmVyYWwgbWVjaGFuaXNtcyB3aWxsIGJlIHVzZWQ6CisgKiAtIHByb3BlcnRpZXMgZmlsZXMgZm91bmQgaW4gdGhlIGNsYXNzcGF0aCAoIE1FVEEtSU5GL2FudC50YXNrcyApLgorICogLSByZXNvdXJjZXMgbmFtZWQgYWZ0ZXIgdGhlIHRhc2sgbmFtZTogTUVUQS1JTkYvYW50L1tUQVNLX05BTUVdLnRhc2sKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUYXNrRGlzY292ZXJ5IGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIFByb2plY3RDb21wb25lbnRGYWN0b3J5Cit7CisgICAgU3RyaW5nIFJFU09VUkNFX05BTUU9Ik1FVEEtSU5GL2FudC50YXNrcyI7CisKKyAgICAvLyBBbHNvIGRpc2NvdmVyeSB0aGUgJ2xlZ2FjeScgbmFtZXMgLSBpbiBhbnQxLjYgdGhlIGluaXRpYWwgcHJlbG9hZGVkIHRhc2tzCisgICAgLy8gc2hvdWxkIGJlIGRlcHJlY2F0ZWQuCisgICAgCisgICAgUmVzb3VyY2VbXSBkaXNjb3ZlcmVkVGFza3MgPSBudWxsOworCisgICAgSGFzaHRhYmxlIHRhc2tEZWZzPW5ldyBIYXNodGFibGUoKTsKKworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlUHJvamVjdENvbXBvbmVudCggUHJvamVjdCBwcm9qZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhc2tOYW1lICkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcnkgY3JlYXRlICIgKyB0YXNrTmFtZSk7CisgICAgICAgIC8vIAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2I9bmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzYi5hcHBlbmQoICJEaXNjb3ZlcmVkVGFza3NbIiApOworICAgICAgICBpZiggZGlzY292ZXJlZFRhc2tzICE9IG51bGwgKSB7CisgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8ZGlzY292ZXJlZFRhc2tzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCBpPjApIHNiLmFwcGVuZCggIiwgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBkaXNjb3ZlcmVkVGFza3NbaV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZCggIl0iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIFByb3BlcnRpZXMgdGFza0NsYXNzTmFtZXM9bmV3IFByb3BlcnRpZXMoKTsKKworICAgIC8qKiBAVE9ETzogUmVnaXN0ZXIgaXRzZWxmIGFzIFByb2plY3RDb21wb25lbnRIZWxwZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUHJvamVjdENvbXBvbmVudEhlbHBlciBwY0hlbHBlcj1Qcm9qZWN0Q29tcG9uZW50SGVscGVyLmdldFByb2plY3RDb21wb25lbnRIZWxwZXIoKTsKKyAgICAgICAgcGNIZWxwZXIuYWRkQ29tcG9uZW50RmFjdG9yeSggdGhpcyApOworICAgICAgICAKKyAgICAgICAgLy8gV2UnbGwgcmVhZCBhbGwgJ2FudC50YXNrcycgYXQgc3RhcnR1cCwgYW5kIGV2ZXJ5IHRpbWUgYW4gdW5rbm93biB0YXNrCisgICAgICAgIC8vIGlzIGZvdW5kICggdGhlIGNsYXNzbG9hZGVyIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBsYXN0IHRpbWUgKS4gTm90IHRoZSBiZXN0CisgICAgICAgIC8vIHNvbHV0aW9uLCBqdXN0IGEgc3RhcnQuCisgICAgICAgIERpc2NvdmVyUmVzb3VyY2VzIGRpc2MgPSBuZXcgRGlzY292ZXJSZXNvdXJjZXMoKTsKKyAgICAgICAgZGlzYy5hZGRDbGFzc0xvYWRlciggSkRLSG9va3MuZ2V0SkRLSG9va3MoKS5nZXRUaHJlYWRDb250ZXh0Q2xhc3NMb2FkZXIoKSApOworICAgICAgICBkaXNjLmFkZENsYXNzTG9hZGVyKCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSApOworICAgICAgICAKKyAgICAgICAgUmVzb3VyY2VJdGVyYXRvciByaSA9IGRpc2MuZmluZFJlc291cmNlcyhSRVNPVVJDRV9OQU1FKTsKKyAgICAgICAgCisgICAgICAgIFZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHdoaWxlIChyaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFJlc291cmNlIHJlc291cmNlSW5mbyA9IHJpLm5leHRSZXNvdXJjZSgpOworICAgICAgICAgICAgdmVjdG9yLmFkZChyZXNvdXJjZUluZm8pOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCAiICsgcmVzb3VyY2VJbmZvKTsKKworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRpc2NvdmVyZWRUYXNrcyA9IG5ldyBSZXNvdXJjZVt2ZWN0b3Iuc2l6ZSgpXTsKKyAgICAgICAgdmVjdG9yLmNvcHlJbnRvKGRpc2NvdmVyZWRUYXNrcyk7CisgICAgfQorICAgICAgICAKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1ZlbG9jaXR5UHJvcGVydGllcy5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvZW1iZWQvc3JjL2phdmEvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVmVsb2NpdHlQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxYTQ1OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3NyYy9qYXZhL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1ZlbG9jaXR5UHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5hcHAuVmVsb2NpdHlFbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5UZW1wbGF0ZTsKKworLyoqCisgKiAgRW5hYmxlIFZlbG9jaXR5IGR5bmFtaWMgcHJvcGVydGllcworICogIAorICoKKyAqLworcHVibGljIGNsYXNzIFZlbG9jaXR5UHJvcGVydGllcyBleHRlbmRzIFRhc2sgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWD0idm06IjsKKyAgICBWZWxvY2l0eVByb3BlcnR5SGVscGVyIGhlbHBlcj1uZXcgVmVsb2NpdHlQcm9wZXJ0eUhlbHBlcigpOworCisgICAgcHVibGljIFZlbG9jaXR5UHJvcGVydGllcygpIHsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVmVsb2NpdHlQcm9wZXJ0eUhlbHBlciBleHRlbmRzIFByb3BlcnR5SGVscGVyIHsKKyAgICAgICAgVmVsb2NpdHlFbmdpbmUgZW5naW5lOworICAgICAgICBWZWxvY2l0eUNvbnRleHQgY29udGV4dDsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5SG9vayggU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB1c2VyICkgeworICAgICAgICAgICAgaWYoICEgbmFtZS5zdGFydHNXaXRoKFBSRUZJWCkgKSB7CisgICAgICAgICAgICAgICAgLy8gcGFzcyBvbiB0byBuZXh0CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5SG9vayhucywgbmFtZSwgdXNlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5hbWU9bmFtZS5zdWJzdHJpbmcoIFBSRUZJWC5sZW5ndGgoKSApOworICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdz1uZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICAgICAgICAgICAgICBlbmdpbmUuZXZhbHVhdGUoIGNvbnRleHQsIHN3LCAiYW50Vk0iLCBuYW1lICk7CisKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZNOiBnZXRQcm9wZXJ0eSAiICsgbnMgKyAiICIgKyBuYW1lICsgIj0iICsgc3cudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVmVsb2NpdHlFbmdpbmUgZ2V0VmVsb2NpdHlFbmdpbmUoKSB7CisgICAgICAgIHJldHVybiBoZWxwZXIuZW5naW5lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgZW5naW5lCisgICAgICAgICAgICBoZWxwZXIuZW5naW5lPW5ldyBWZWxvY2l0eUVuZ2luZSgpOworICAgICAgICAgICAgaGVscGVyLmVuZ2luZS5pbml0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGhlbHBlci5jb250ZXh0PW5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKyAgICAgICAgICAgIGhlbHBlci5jb250ZXh0LnB1dCggImFudCIsIHByb2plY3QgKTsKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgaXQKKyAgICAgICAgICAgIFByb3BlcnR5SGVscGVyIHBoZWxwZXI9UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIoIHByb2plY3QgKTsKKyAgICAgICAgICAgIGhlbHBlci5zZXROZXh0KCBwaGVscGVyLmdldE5leHQoKSApOworICAgICAgICAgICAgaGVscGVyLnNldFByb2plY3QoIHByb2plY3QgKTsKKyAgICAgICAgICAgIHBoZWxwZXIuc2V0TmV4dCggaGVscGVyICk7CisKKyAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0gICAgCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9lbWJlZC90ZXN0LnhtbCBiL3RydW5rL3Byb3Bvc2FsL2VtYmVkL3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZjU1MzUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9lbWJlZC90ZXN0LnhtbApAQCAtMCwwICsxLDEyNiBAQAorPHByb2plY3QgbmFtZT0iZW1iZWQtdGVzdCIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+CisgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuc3JjIiBsb2NhdGlvbj0iLi4vLi4iLz4KKyAgPGRlc2NyaXB0aW9uPlRlc3QgZm9yIGVtYmVkIHByb3Bvc2FsPC9kZXNjcmlwdGlvbj4gICAgICAgIAorICA8aW1wb3J0IGZpbGU9ImJ1aWxkLnhtbCIvPgorCisgIDwhLS0gVGhpcyBpcyBhIHRyaWNreSBwcm9ibGVtOiBpbXBvcnQgd2lsbCBhcHBlbmQgdGFza3MgYXQgdGhlCisgICAgZW5kIG9mIHRoZSB0YXNrIGxpc3QuIFRoYXQncyBhIGJ1ZywgaXQgc2hvdWxkIHJlcGxhY2UgdGhlCisgICAgPGltcG9ydD4gdGFzayB3aXRoIHRoZSBjb250ZW50LiBXaGVuIGZpeGVkLCB0aGlzIHNob3VsZCBzaG93CisgICAgdGhlIHJlYWwgdmFsdWUuIC0tPiAKKyAgPGVjaG8gbWVzc2FnZT0iQmFzZS5wYXRoIGZyb20gYnVpbGQueG1sICggaW4gdG9wIGxldmVsICk6ICR7YmFzZS5wYXRofSIvPgorICAKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LmphciIgbG9jYXRpb249IiR7YmFzZS5wYXRofS9qdW5pdDMuNy9qdW5pdC5qYXIiLz4KKyAgICAgPGVjaG8+QmFzZS5wYXRoIGZyb20gYnVpbGQueG1sICggaW4gaW5pdCApIDogJHtiYXNlLnBhdGh9PC9lY2hvPgorCisgICAgPHBhdGggaWQ9Im15SmFycyIgPgorICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7anVuaXQuamFyfSIgLz4KKyAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2p4cGF0aC5qYXJ9IiAvPgorICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dmVsb2NpdHktZGVwLmphcn0iIC8+CisgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt2ZWxvY2l0eS5qYXJ9IiAvPgorICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amV4bC5qYXJ9IiAvPgorICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7Y29tbW9ucy1kaXNjb3ZlcnkuamFyfSIgLz4KKyAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9IiAvPgorICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YW50LmhvbWV9L2xpYi9hbnQtc2F4Mi5qYXIiIC8+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii91c3Ivc2hhcmUvamF2YS94YWxhbi1qXzJfM18xL2Jpbi94ZXJjZXNJbXBsLmphciIvPgorICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5ob21lfS9saWIveGVyY2VzSW1wbC5qYXIiLz4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthbnQuaG9tZX0vbGliL3htbC1hcGlzLmphciIvPgorICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5ob21lfS9saWIvYW50LmphciIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2FudC5ob21lfS9saWIiIGluY2x1ZGVzPSJvcHRpb25hbC0qLmphciIgLz4KKyAgICA8L3BhdGg+CisKKyAgICA8ZWNobz5QYXRoOiAke3RvU3RyaW5nOm15SmFyc308L2VjaG8+CisKKyAgICA8Y2xhc3Nsb2FkZXIgY2xhc3NwYXRoUmVmPSJteUphcnMiLz4KKyAgCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ieG1sZG9tIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8dGFza2RlZiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkpYUGF0aCIKKyAgICAgICAgICAgICBuYW1lPSJqeHBhdGgiIC8+CisgICAgPHR5cGVkZWYgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YTUxET00iCisgICAgICAgICAgICAgbmFtZT0ieG1sRG9tIiAvPgorCisgICAgPHhtbERvbSBpZD0ibW9kdWxlLnhtbCIgZmlsZT0iL3dzL2pha2FydGEtZ3VtcC9wcm9qZWN0L2pha2FydGEtYW50LnhtbCIvPgorICAgIDwhLS0gRW5hYmxlIEp4cGF0aCBzdXBwb3J0IC0tPgorICAgIDxqeHBhdGgvPgorICAgIDxlY2hvPk5hbWU6ICR7anhwYXRoOi9yZWZlcmVuY2VzL21vZHVsZS54bWwvcm9vdC9tb2R1bGUvcHJvamVjdFsxXS9AbmFtZX08L2VjaG8+CisKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9ImRpc2NvdmVyeSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGVjaG8gbWVzc2FnZT0iJHtjb21tb25zLWRpc2NvdmVyeS5qYXJ9Ii8+CisKKyAgICA8c3lzdGVtUGF0aCBwYXRoUmVmPSJteUphcnMiLz4KKworICAgIDx0YXNrZGVmIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuU2VydmljZURpc2NvdmVyeVRhc2siCisgICAgICAgICAgICAgbmFtZT0iZGlzY292ZXJ5IiAvPgorICAgIDx0YXNrZGVmIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuSlhQYXRoIgorICAgICAgICAgICAgIG5hbWU9Imp4cGF0aCIgLz4KKworICAgIDxqeHBhdGgvPgorICAgIDxkaXNjb3ZlcnkgZGVidWc9IjEiIGlkPSJteURpc2NvdmVyeSIKKyAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9IkZvdW5kICR7anhwYXRoOi9yZWZlcmVuY2VzW0BuYW1lPSdteURpc2NvdmVyeSddfSIgLz4KKworICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InN5c3RlbVBhdGhUZXN0IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8anVuaXQgaWQ9InJlcGxhY2VkSnVuaXQiIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iRm91bmQgSlVOSVQ6ICR7dG9TdHJpbmc6cmVwbGFjZWRKdW5pdH0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZHluYW1pY1Byb3BlcnRpZXMiIGRlcGVuZHM9ImluaXQiPgorICAgIDwhLS0gVGhpcyBpcyBUYWtzZGVmMi5qYXZhIC0gaXQnbGwgdXNlIHRoZSBzeXN0ZW1QYXRoIGFzIHBhcmVudCBsb2FkZXIKKyAgICAgIC0tPgorICAgIDx0YXNrZGVmIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuSlhQYXRoIgorICAgICAgICAgICAgIG5hbWU9Imp4cGF0aCIgLz4KKyAgICA8dGFza2RlZiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkpYUGF0aFNldCIKKyAgICAgICAgICAgICBuYW1lPSJqeHBhdGhTZXQiIC8+CisgICAgPHRhc2tkZWYgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5WZWxvY2l0eVByb3BlcnRpZXMiCisgICAgICAgICAgICAgbmFtZT0idmVsb2NpdHlQcm9wZXJ0aWVzIiAvPgorICAgIDx0YXNrZGVmIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuSmV4bFByb3BlcnRpZXMiCisgICAgICAgICAgICAgbmFtZT0iamV4bFByb3BlcnRpZXMiIC8+CisKKyAgICA8IS0tIEluaXQgSnhQYXRoLiAnLycgaXMgdGhlIHByb2plY3QgLS0+CisgICAgPGp4cGF0aC8+CisgICAgPHZlbG9jaXR5UHJvcGVydGllcy8+CisgICAgPGpleGxQcm9wZXJ0aWVzLz4KKyAgICAKKyAgICA8ZWNobyBpZD0iZm9vIiBtZXNzYWdlPSJTdGFydGluZyBkeW5hbWljIHByb3BzIHRlc3RzIiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iVmFsdWU6ICR7dm06JGFudC5yZWZlcmVuY2VzLmp4cGF0aFRhc2suZm9vfSIgLz4KKyAgICA8anhwYXRoU2V0IHBhdGg9Ii9yZWZlcmVuY2VzW0BuYW1lPSdqeHBhdGhUYXNrJ10vZm9vIiB2YWx1ZT0iVGVzdCIvPgorICAgIDxlY2hvIG1lc3NhZ2U9IlZhbHVlOiAke3ZtOiRhbnQucmVmZXJlbmNlcy5qeHBhdGhUYXNrLmZvb30iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSIke2pleGw6YW50LnJlZmVyZW5jZXMuanhwYXRoVGFzay5mb289YmFyfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJWYWx1ZTogJHt2bTokYW50LnJlZmVyZW5jZXMuanhwYXRoVGFzay5mb299IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iamV4bCAvcmVmZXJlbmNlcy9teUphcnM6ICR7amV4bDphbnQucmVmZXJlbmNlcy5teUphcnN9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0ianhQYXRoIC90YXJnZXRzWzFdOiAke2p4cGF0aDovdGFyZ2V0c1sxXX0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ianhQYXRoIC9yZWZlcmVuY2VzOiAke2p4cGF0aDovcmVmZXJlbmNlc30iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ianhQYXRoIC9yZWZlcmVuY2VzW0BuYW1lPSdteUphcnMnXTogJHtqeHBhdGg6L3JlZmVyZW5jZXNbQG5hbWU9J215SmFycyddfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqeFBhdGggL3JlZmVyZW5jZXMvbXlKYXJzOiAke2p4cGF0aDovcmVmZXJlbmNlcy9teUphcnN9IiAvPgorCisgICAgPCEtLSBUaGlzIGlzIFhNTERPTS5qYXZhIC0gYSBkYXRhdHlwZSB0aGF0IGhvbGRzIGFuIHhtbCBET00gIC0tPgorICAgIDx0eXBlZGVmIG5hbWU9InhtbGRvbSIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YTUxET00iLz4KKworICAgIDwhLS0gSW5pdCBYTUxET00uIFRoZSBET00gb2YgZmlsZSB0ZXN0LnhtbCB3aWxsIGJlIHJlZmVyZW5jZWQgdmlhIHRoZSBpZC0tPgorICAgIDx4bWxkb20gaWQ9InRlc3QueG1sIiBmaWxlPSJ0ZXN0LnhtbCIvPiAgCisKKyAgICA8ZWNobyBtZXNzYWdlPSJYTUxET006ICR7anhwYXRoOi9yZWZlcmVuY2VzL3Rlc3QueG1sL3Jvb3QvcHJvamVjdC9AbmFtZX0iIC8+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJpbml0LGR5bmFtaWNQcm9wZXJ0aWVzLHN5c3RlbVBhdGhUZXN0LHRlc3QtaW1wb3J0Ij4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9InRlc3QtaW1wb3J0IiA+CisgICAgPGFudGNhbGwgdGFyZ2V0PSJlbWJlZC5tYWluIiAvPgorICA8L3RhcmdldD4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9teXJtaWRvbi9SRUFETUUudHh0IGIvdHJ1bmsvcHJvcG9zYWwvbXlybWlkb24vUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDg1NDNiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvbXlybWlkb24vUkVBRE1FLnR4dApAQCAtMCwwICsxIEBACitNeXJtaWRvbiBoYXMgbW92ZWQgdG8gYSBuZXcgdG9wIGxldmVsIGN2cyBqYWthcnRhLWFudC1teXJtaWRvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvYW50dW5pdC9SRUFETUUgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2FudHVuaXQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTdhMTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2FudHVuaXQvUkVBRE1FCkBAIC0wLDAgKzEgQEAKK01vdmVkIHRvIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L3NhbmRib3gvYW50bGlicy9hbnR1bml0L3RydW5rLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL2J1aWxkLnNoIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2UvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1YTdlNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorCitjeWd3aW49ZmFsc2U7CitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qKSBjeWd3aW49dHJ1ZSA7OworZXNhYworCitQV0Q9YHB3ZGAKK2lmICRjeWd3aW4gOyB0aGVuCisgICAgUFdEPWBjeWdwYXRoIC0td2luZG93cyAiJFBXRCJgCitmaQorCitjZCAuLi8uLi8uLgorL2Jpbi9zaCAuL2J1aWxkLnNoIC1idWlsZGZpbGUgJFBXRC9idWlsZC54bWwgJCoKK2NkICRQV0QKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2UvYnVpbGQueG1sIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2UvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYmQ4MTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9idWlsZC54bWwKQEAgLTAsMCArMSw2MiBAQAorPHByb2plY3QgbmFtZT0iY2xlYXJjYXNlLXByb3Bvc2FsIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJjb21waWxlIj4KKyAgPHByb3BlcnR5IGZpbGU9Ii5hbnQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9Ly5hbnQucHJvcGVydGllcyIvPgorICAKKyAgPCEtLXByb3BlcnR5IG5hbWU9ImJ1aWxkLnN5c2NsYXNzcGF0aCIgdmFsdWU9Imlnbm9yZSIvLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9Imppa2VzIi8+CisgIDwhLS1wcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlci5lbWFjcyIgdmFsdWU9Im9uIi8tLT4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyLnBlZGFudGljIiB2YWx1ZT0idHJ1ZSIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIuZGVwZW5kIiB2YWx1ZT0idHJ1ZSIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIuZnVsbGRlcGVuZCIgdmFsdWU9InRydWUiLz4KKworICA8cHJvcGVydHkgbmFtZT0iZGVidWciIHZhbHVlPSJvbiIvPgorICA8cHJvcGVydHkgbmFtZT0ib3B0aW1pemUiIHZhbHVlPSJvZmYiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRlcHJlY2F0aW9uIiB2YWx1ZT0ib24iLz4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYiIgdmFsdWU9IiR7YnVpbGQuZGlyfS9saWIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnNyYyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9zcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlzdCIgdmFsdWU9IiR7YnVpbGQuZGlyfS9kaXN0Ii8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImphdmEuZGlyIiB2YWx1ZT0ic3JjL2phdmEiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3RzLmRpciIgdmFsdWU9InNyYy90ZXN0Y2FzZXMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImFudC5iYXNlLmRpciIgbG9jYXRpb249Ii4uLy4uLy4uIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJsaWIuZGlyIiBsb2NhdGlvbj0iJHthbnQuYmFzZS5kaXJ9L2xpYiIvPgorICA8cHJvcGVydHkgbmFtZT0iYm9vdHN0cmFwLmRpciIgbG9jYXRpb249IiR7YW50LmJhc2UuZGlyfS9ib290c3RyYXAiLz4KKyAgCisgIDxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkLmNsYXNzZXN9IiAvPgorICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSIgaW5jbHVkZXM9IioqLyouamFyIi8+CisgICAgPGZpbGVzZXQgZGlyPSIke2Jvb3RzdHJhcC5kaXJ9L2xpYiIgaW5jbHVkZXM9ImFudC5qYXIiLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iLS0+IGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlIj4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL21haW4iCisgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICAgb3B0aW1pemU9IiR7b3B0aW1pemV9IgorICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtkZXByZWNhdGlvbn0iCisgICAgICAgICAgIGluY2x1ZGVhbnRydW50aW1lPSJubyI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiLz4KKyAgICA8L2phdmFjPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iZGlzdCIKKyAgICAgICAgICBkZXBlbmRzPSJjbGVhbixjb21waWxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY3JlYXRlIGEgamFyIj4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpc3R9Ii8+CisgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5kaXN0fS9jYy10YXNrcy5qYXIiIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iLS0+IGNsZWFucyB1cCBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8ZGVsZXRlPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iKiovKi5iYWsiIGRlZmF1bHRleGNsdWRlcz0ibm8iLz4KKyAgICA8L2RlbGV0ZT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvZXRjL3Rlc3RjYXNlcy9jYy1jaGVja2luLnhtbCBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9ldGMvdGVzdGNhc2VzL2NjLWNoZWNraW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzg5NDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvZXRjL3Rlc3RjYXNlcy9jYy1jaGVja2luLnhtbApAQCAtMCwwICsxLDM0IEBACis8cHJvamVjdCBuYW1lPSJjYy1jaGVja2luIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJub29wIi8+CisgICAgCisgICAgPCEtLSBkZWZhdWx0IHZhbHVlIGZvciB0ZXN0LmRpciwgb3ZlcnJpZGUgdG8gc3BlY2lmeSBhIGNjIGxvY2F0aW9uIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmRpciIgbG9jYXRpb249Ii4iLz4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9Im5vb3AiLz4KKyAgICAgIAorICAgIDx0YXJnZXQgbmFtZT0idGVzdC1hbGxjaGVja2Vkb3V0IiBkZXNjcmlwdGlvbj0ic2hvdWxkIGNvIGFsbCBjaSBmaWxlcyI+CisgICAgICAgIDxjYy1jaGVja2luIHZpZXdwYXRoPSIke3Rlc3QuZGlyfSIgY29tbWVudD0idGVzdC1hbGxjaGVja2Vkb3V0Ij4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2N0ZXN0LmNpIi8+CisgICAgICAgIDwvY2MtY2hlY2tpbj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdC1hbGxjaGVja2VkaW4iIGRlc2NyaXB0aW9uPSJzaG91bGQgY2kgbm90aGluZyI+IAorICAgICAgICA8Y2MtY2hlY2tpbiB2aWV3cGF0aD0iJHt0ZXN0LmRpcn0iIGNvbW1lbnQ9InRlc3QtYWxsY2hlY2tlZGluIj4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2N0ZXN0LmNvIi8+CisgICAgICAgIDwvY2MtY2hlY2tpbj4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYWxscHJpdmF0ZSIgZGVzY3JpcHRpb249InNob3VsZCBjaSBub3RoaW5nIj4KKyAgICAgICAgPGNjLWNoZWNraW4gdmlld3BhdGg9IiR7dGVzdC5kaXJ9IiBjb21tZW50PSJ0ZXN0LWFsbHByaXZhdGUiPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jY3Rlc3QucHJpdmF0ZSIvPgorICAgICAgICA8L2NjLWNoZWNraW4+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LW1peCIgZGVzY3JpcHRpb249InNob3VsZCBjaSBvbmx5IGNvIGZpbGVzIj4KKyAgICAgICAgPGNjLWNoZWNraW4gdmlld3BhdGg9IiR7dGVzdC5kaXJ9Ij4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2N0ZXN0LnByaXZhdGUiLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2N0ZXN0LmNpIi8+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmNjdGVzdC5jbyIvPgorICAgICAgICA8L2NjLWNoZWNraW4+ICAgICAgICAKKyAgICA8L3RhcmdldD4KKyAgICAKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvZXRjL3Rlc3RjYXNlcy9jYy1jaGVja291dC54bWwgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvZXRjL3Rlc3RjYXNlcy9jYy1jaGVja291dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlNTQxMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9ldGMvdGVzdGNhc2VzL2NjLWNoZWNrb3V0LnhtbApAQCAtMCwwICsxLDM0IEBACis8cHJvamVjdCBuYW1lPSJjYy1jaGVja291dCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibm9vcCIvPgorICAgIAorICAgIDwhLS0gZGVmYXVsdCB2YWx1ZSBmb3IgdGVzdC5kaXIsIG92ZXJyaWRlIHRvIHNwZWNpZnkgYSBjYyBsb2NhdGlvbiAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5kaXIiIGxvY2F0aW9uPSIuIi8+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJub29wIi8+CisgICAgICAKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYWxsY2hlY2tlZG91dCIgZGVzY3JpcHRpb249InNob3VsZCBjbyBub3RoaW5nIj4KKyAgICAgICAgPGNjLWNoZWNrb3V0IHZpZXdwYXRoPSIke3Rlc3QuZGlyfSIgY29tbWVudD0idGVzdC1hbGxjaGVja2Vkb3V0Ij4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2N0ZXN0LmNpIi8+CisgICAgICAgIDwvY2MtY2hlY2tvdXQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYWxsY2hlY2tlZGluIiBkZXNjcmlwdGlvbj0ic2hvdWxkIGNvIGFsbCBmaWxlcyI+IAorICAgICAgICA8Y2MtY2hlY2tvdXQgdmlld3BhdGg9IiR7dGVzdC5kaXJ9IiBjb21tZW50PSJ0ZXN0LWFsbGNoZWNrZWRpbiI+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmNjdGVzdC5jbyIvPgorICAgICAgICA8L2NjLWNoZWNrb3V0PgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0idGVzdC1hbGxwcml2YXRlIiBkZXNjcmlwdGlvbj0ic2hvdWxkIGNvIG5vdGhpbmciPgorICAgICAgICA8Y2MtY2hlY2tvdXQgdmlld3BhdGg9IiR7dGVzdC5kaXJ9IiBjb21tZW50PSJ0ZXN0LWFsbHByaXZhdGUiPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jY3Rlc3QucHJpdmF0ZSIvPgorICAgICAgICA8L2NjLWNoZWNrb3V0PgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0idGVzdC1taXgiIGRlc2NyaXB0aW9uPSJzaG91bGQgY28gb25seSBjaSBmaWxlcyI+CisgICAgICAgIDxjYy1jaGVja291dCB2aWV3cGF0aD0iJHt0ZXN0LmRpcn0iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jY3Rlc3QucHJpdmF0ZSIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jY3Rlc3QuY2kiLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2N0ZXN0LmNvIi8+CisgICAgICAgIDwvY2MtY2hlY2tvdXQ+CisgICAgPC90YXJnZXQ+CisgICAgCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL2V0Yy90ZXN0Y2FzZXMvY2MtbWtlbGVtLnhtbCBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9ldGMvdGVzdGNhc2VzL2NjLW1rZWxlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5NTNhNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9ldGMvdGVzdGNhc2VzL2NjLW1rZWxlbS54bWwKQEAgLTAsMCArMSwzNCBAQAorPHByb2plY3QgbmFtZT0iY2MtbWtlbGVtIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJub29wIi8+CisgICAgCisgICAgPCEtLSBkZWZhdWx0IHZhbHVlIGZvciB0ZXN0LmRpciwgb3ZlcnJpZGUgdG8gc3BlY2lmeSBhIGNjIGxvY2F0aW9uIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmRpciIgbG9jYXRpb249Ii4iLz4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9Im5vb3AiLz4KKyAgICAgIAorICAgIDx0YXJnZXQgbmFtZT0idGVzdC1hbGxjaGVja2Vkb3V0IiBkZXNjcmlwdGlvbj0ic2hvdWxkIG1rZWxlbSBub3RoaW5nIj4KKyAgICAgICAgPGNjLW1rZWxlbSB2aWV3cGF0aD0iJHt0ZXN0LmRpcn0iIGNvbW1lbnQ9InRlc3QtYWxsY2hlY2tlZG91dCI+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmNjdGVzdC5jaSIvPgorICAgICAgICA8L2NjLW1rZWxlbT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdC1hbGxjaGVja2VkaW4iIGRlc2NyaXB0aW9uPSJzaG91bGQgbWtlbGVtIG5vdGhpbmciPiAKKyAgICAgICAgPGNjLW1rZWxlbSB2aWV3cGF0aD0iJHt0ZXN0LmRpcn0iIGNvbW1lbnQ9InRlc3QtYWxsY2hlY2tlZGluIj4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2N0ZXN0LmNvIi8+CisgICAgICAgIDwvY2MtbWtlbGVtPgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0idGVzdC1hbGxwcml2YXRlIiBkZXNjcmlwdGlvbj0ic2hvdWxkIG1rZWxlbSBhbGwgZmlsZXMiPgorICAgICAgICA8Y2MtbWtlbGVtIHZpZXdwYXRoPSIke3Rlc3QuZGlyfSIgY29tbWVudD0idGVzdC1hbGxwcml2YXRlIj4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2N0ZXN0LnByaXZhdGUiLz4KKyAgICAgICAgPC9jYy1ta2VsZW0+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LW1peCIgZGVzY3JpcHRpb249InNob3VsZCBta2VsZW0gb25seSBwcml2YXRlIGZpbGVzIj4KKyAgICAgICAgPGNjLW1rZWxlbSB2aWV3cGF0aD0iJHt0ZXN0LmRpcn0iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jY3Rlc3QucHJpdmF0ZSIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jY3Rlc3QuY2kiLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2N0ZXN0LmNvIi8+CisgICAgICAgIDwvY2MtbWtlbGVtPiAgICAgICAgCisgICAgPC90YXJnZXQ+CisgICAgCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tpbi5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTg1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NDaGVja2luLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBDcmVhdGVzIGEgcGVybWFuZW50IG5ldyB2ZXJzaW9uIG9mIGFuIGVsZW1lbnQKKyAqCisgKiBAc2VlIGh0dHA6Ly9jbGVhcmNhc2UucmF0aW9uYWwuY29tL2RvYy9sYXRlc3QvY2Nhc2VfdXgvY2NyZWYvY2hlY2tpbi5odG1sCisgKgorICovCitwdWJsaWMgY2xhc3MgQ0NDaGVja2luIGV4dGVuZHMgQ0NNYXRjaGluZ1Rhc2sgeworICAgIHByaXZhdGUgYm9vbGVhbiBub3dhcm4gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcHRpbWUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4ga2VlcCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBpZGVudGljYWwgPSB0cnVlOworCisgICAgcHJvdGVjdGVkIFZlY3RvciBnZXRPcHRpb25zKCl7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICB2LmFkZEVsZW1lbnQoImNpIik7CisgICAgICAgIGlmIChub3dhcm4peworICAgICAgICAgICAgdi5hZGRFbGVtZW50KCItbm93YXJuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB0aW1lKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLXB0aW1lIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCl7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoIi1jZmlsZSIpOworICAgICAgICAgICAgdi5hZGRFbGVtZW50KGNvbW1lbnRGaWxlLmdldFBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtlZXApeworICAgICAgICAgICAgdi5hZGRFbGVtZW50KCIta2VlcCIpOworICAgICAgICB9CisgICAgICAgIGlmIChpZGVudGljYWwpeworICAgICAgICAgICAgdi5hZGRFbGVtZW50KCItaWRlbnRpY2FsIik7CisgICAgICAgIH0KKyAgICAgICAgdi5hZGRFbGVtZW50KCI8cG5hbWU+Iik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJncywgQ0NGaWxlIGZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9IGZpbGUuZ2V0UGF0aCgpOworICAgICAgICBDbWRSZXN1bHQgcmVzID0gQ0NVdGlscy5jbGVhcnRvb2woYXJncyk7CisgICAgICAgIGlmIChyZXMuZ2V0U3RhdHVzKCkgIT0gMCl7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocmVzLmdldFN0ZEVycigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdChDQ0ZpbGUgZmlsZSkgeworICAgICAgICByZXR1cm4gZmlsZS5pc0NoZWNrZWRPdXQoKTsKKyAgICB9CisKKyAgICAvLyBiZWFuIHNldHRlcnMKKyAgICBwdWJsaWMgdm9pZCBzZXROb3dhcm4oYm9vbGVhbiBub3dhcm4pIHsKKyAgICAgICAgdGhpcy5ub3dhcm4gPSBub3dhcm47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHRpbWUoYm9vbGVhbiBwdGltZSkgeworICAgICAgICB0aGlzLnB0aW1lID0gcHRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0S2VlcChib29sZWFuIGtlZXApIHsKKyAgICAgICAgdGhpcy5rZWVwID0ga2VlcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZGVudGljYWwoYm9vbGVhbiBpZGVudGljYWwpIHsKKyAgICAgICAgdGhpcy5pZGVudGljYWwgPSBpZGVudGljYWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tvdXQuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ0NoZWNrb3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhOTBmYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ0NoZWNrb3V0LmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQ3JlYXRlcyBhIG1vZGlmaWFibGUgY29weSBvZiBhIHZlcnNpb24KKyAqCisgKiBAc2VlIGh0dHA6Ly9jbGVhcmNhc2UucmF0aW9uYWwuY29tL2RvYy9sYXRlc3QvY2Nhc2VfdXgvY2NyZWYvY2hlY2tvdXQuaHRtbAorICoKKyAqLworcHVibGljIGNsYXNzIENDQ2hlY2tvdXQgZXh0ZW5kcyBDQ01hdGNoaW5nVGFzayB7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlc2VydmVkID0gdHJ1ZTsKKyAgICBwcml2YXRlIFN0cmluZyBicmFuY2ggPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJzaW9uID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG53YXJuID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgb3V0ID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbmRhdGEgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcHRpbWUgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBWZWN0b3IgZ2V0T3B0aW9ucygpeworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdi5hZGRFbGVtZW50KCJjbyIpOworICAgICAgICB2LmFkZEVsZW1lbnQocmVzZXJ2ZWQgPyAiLXJlc2VydmVkIjoiLXVucmVzZXJ2ZWQiKTsKKyAgICAgICAgaWYgKG53YXJuKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLW53YXJuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJyYW5jaCAhPSBudWxsKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLWJyYW5jaCIpOworICAgICAgICAgICAgdi5hZGRFbGVtZW50KGJyYW5jaCk7CisgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbikgeworICAgICAgICAgICAgdi5hZGRFbGVtZW50KCItdmVyc2lvbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChvdXQgIT0gbnVsbCl7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoIi1vdXQiKTsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudChvdXQpOworICAgICAgICB9IGVsc2UgaWYgKG5kYXRhKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLW5kYXRhIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB0aW1lKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLXB0aW1lIik7CisgICAgICAgIH0KKyAgICAgICAgdi5hZGRFbGVtZW50KCI8cG5hbWU+Iik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdChDQ0ZpbGUgZmlsZSkgeworICAgICAgICByZXR1cm4gZmlsZS5pc0NoZWNrZWRJbigpOworICAgIH0KKworICAgIC8vIGJlYW4gc2V0dGVycworICAgIHB1YmxpYyB2b2lkIHNldFB0aW1lKGJvb2xlYW4gcHRpbWUpIHsKKyAgICAgICAgdGhpcy5wdGltZSA9IHB0aW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc2VydmVkKGJvb2xlYW4gcmVzZXJ2ZWQpIHsKKyAgICAgICAgdGhpcy5yZXNlcnZlZCA9IHJlc2VydmVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dChTdHJpbmcgb3V0KSB7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5kYXRhKGJvb2xlYW4gbmRhdGEpIHsKKyAgICAgICAgdGhpcy5uZGF0YSA9IG5kYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJyYW5jaChTdHJpbmcgYnJhbmNoKSB7CisgICAgICAgIHRoaXMuYnJhbmNoID0gYnJhbmNoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oYm9vbGVhbiB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tndhcm4oYm9vbGVhbiBud2FybikgeworICAgICAgICB0aGlzLm53YXJuID0gbndhcm47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDRmlsZS5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDM0NzUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NGaWxlLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIEFuIGV4dGVuZGVkIGZpbGUgdGhhdCBnaXZlcyBzdGF0ZSBpbmZvcm1hdGlvbi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDQ0ZpbGUgZXh0ZW5kcyBGaWxlIHsKKworICAgIC8qKiBpcyBpdCBjaGVja2Vkb3V0ICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrZWRvdXQgPSBmYWxzZTsKKworICAgIC8qKiBpcyBpdCB1bmRlciBzb3VyY2UgY29udHJvbCA/ICovCisgICAgcHJpdmF0ZSBib29sZWFuIHZlcnNpb25lZCA9IGZhbHNlOworCisgICAgLyoqIHdhcyB0aGlzIGZpbGUgYWxyZWFkeSBkZXNjcmliZWQgb25jZSA/ICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlc2NyaWJlZCA9IGZhbHNlOworCisgICAgcHVibGljIENDRmlsZShTdHJpbmcgcGFyZW50LCBTdHJpbmcgY2hpbGQpIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCBjaGlsZCk7CisgICAgfQorCisgICAgcHVibGljIENDRmlsZShGaWxlIHBhcmVudCwgU3RyaW5nIGNoaWxkKSB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgY2hpbGQpOworICAgIH0KKworICAgIHB1YmxpYyBDQ0ZpbGUoU3RyaW5nIHBhdGhuYW1lKSB7CisgICAgICAgIHN1cGVyKHBhdGhuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpbGUgaXMgY2hlY2tlZG91dC4gQSBub24gY2hlY2tlZG91dCBmaWxlCisgICAgICogZG9lcyBub3QgaW1wbHkgaXQgaXMgYSBjaGVja2VkaW4gb25lLgorICAgICAqIEBzZWUgI2lzQ2hlY2tlZEluKCkKKyAgICAgKiBAc2VlICNpc1ZlcnNpb25lZCgpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkT3V0KCkgeworICAgICAgICBpZiAoIWRlc2NyaWJlZCl7CisgICAgICAgICAgICByZWZyZXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoZWNrZWRvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIGlzIHZlcnNpb25lZCBvciBub3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJzaW9uZWQoKSB7CisgICAgICAgIGlmICghZGVzY3JpYmVkKXsKKyAgICAgICAgICAgIHJlZnJlc2goKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmVyc2lvbmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBpcyBjaGVja2VkaW4gb3Igbm90LiBBIG5vbiBjaGVja2VkaW4gZmlsZQorICAgICAqIGRvZXMgbm90IGltcGx5IGl0IGlzIGEgY2hlY2tlZG91dCBvbmUuCisgICAgICogQHNlZSAjaXNDaGVja2VkT3V0KCkKKyAgICAgKiBAc2VlICNpc1ZlcnNpb25lZCgpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkSW4oKXsKKyAgICAgICAgcmV0dXJuIGlzVmVyc2lvbmVkKCkgJiYgIWlzQ2hlY2tlZE91dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZnJlc2ggdGhlIGZpbGUgc3RhdHVzIGluIGNhc2UgaXQgY2hhbmdlZCBzaW5jZSB0aGUKKyAgICAgKiBmaXJzdCBhY2Nlc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IHsiZGVzY3JpYmUiLCAiLWZtdCIsICJcIiVtICVvXCIiLCBnZXRBYnNvbHV0ZVBhdGgoKSB9OworICAgICAgICBDbWRSZXN1bHQgcmVzID0gQ0NVdGlscy5jbGVhcnRvb2woYXJncyk7CisgICAgICAgIGlmIChyZXMuZ2V0U3RhdHVzKCkgIT0gMCl7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocmVzLmdldFN0ZEVycigpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgc3Rkb3V0ID0gcmVzLmdldFN0ZG91dCgpOworICAgICAgICB2ZXJzaW9uZWQgPSAoc3Rkb3V0LmluZGV4T2YoInZpZXcgcHJpdmF0ZSBvYmplY3QiKSA9PSAtMSk7CisgICAgICAgIGNoZWNrZWRvdXQgPSAoc3Rkb3V0LmluZGV4T2YoImNoZWNrb3V0IikgIT0gLTEpOworICAgICAgICBkZXNjcmliZWQgPSB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01hdGNoaW5nVGFzay5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWF0Y2hpbmdUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkMjZhYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01hdGNoaW5nVGFzay5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworCisvKioKKyAqIEJhc2UgdGFzayBmb3IgYWxsIENsZWFyY2FzZSB0YXNrcyBpbnZvbHZpbmcgbXVsdGlwbGUtZmlsZSBwcm9jZXNzaW5nLgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENDTWF0Y2hpbmdUYXNrIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKyAgICAKKyAgICAvKiogdmlldyBwYXRoIHRvIHVzZS4gRXF1aXZhbGVudCB0byBiYXNlIGRpcmVjdG9yeSBvZiBwcm9jZXNzaW5nICovCisgICAgcHJvdGVjdGVkIEZpbGUgdmlld3BhdGg7CisKKyAgICAvKiogY2MgaGVscGVyIHRvb2xzICovCisgICAgcHJvdGVjdGVkIENDVXRpbHMgdXRpbHMgPSBuZXcgQ0NVdGlscyh0aGlzKTsKKyAgICAKKyAgICAvKiogdGhlIHNldCBvZiBjb2xsZWN0ZWQgZmlsZXMgdG8gY2hlY2tpbiAqLworICAgIHByb3RlY3RlZCBIYXNodGFibGUgZmlsZXMgPSBudWxsOworCisgICAgLyoqIGNvbW1lbnRzIHRvIHVzZSBmb3IgdGhlIG9wZXJhdGlvbiAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7CisKKyAgICAvKiogdGhlIGNvbW1lbnQgZmlsZSBjcmVhdGVkIGZyb20gdGhlIGNvbW1lbnRzLiBJdCBhdm9pZHMgZXNjYXBpbmcgaXNzdWVzICovCisgICAgcHJvdGVjdGVkIEZpbGUgY29tbWVudEZpbGU7CisKKyAgICAvKiogY2xlYXJ0b29sIG9wdGlvbnMgKGFuZCBjb21tYW5kIGFzIHdlbGwpICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIG9wdGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgdmVjdG9yIG9mIG9wdGlvbnMgcmVwcmVzZW50aW5nIHRoZSBjbGVhcnRvb2wgYXJndW1lbnRzLgorICAgICAqIFRoZSBsYXN0IGFyZ3VtZW50cyBpcyBub3JtYWxseSBhbGxvY2F0ZWQgYW5kIHJlcGxhY2VkIGF0IHRoZSBsYXN0CisgICAgICogbW9tZW50IGJlZm9yZSBydW5uaW5nIHRoZSBjb21tYW5kLgorICAgICAqIEBzZWUgI2V4ZWN1dGUoU3RyaW5nW10sIENDRmlsZSkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVmVjdG9yIGdldE9wdGlvbnMoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgY2xlYXJjYXNlIGZpbGUKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmaWxlIHNob3VsZCBiZSBhY2NlcHRlZCBvciBub3QgYnkgdGhlCisgICAgICogY29tbWFuZCB0byByZXN0cmljdCB0aGUgZmlsZSBwcm9jZXNzaW5nIGFuZCBlcnJvcnMuIEZvcgorICAgICAqIGV4YW1wbGUgeW91IG1pZ2h0IG5vdCB3YW50IHRvIGNoZWNraW4gZmlsZXMgdGhhdCBhcmUKKyAgICAgKiBhbHJlYWR5IGNoZWNrZWQgaW4gYW5kIHRoYXQgYXJlIGNvbGxlY3RlZCBieSB0aGUgZmlsZXNldAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdChDQ0ZpbGUgZmlsZSl7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlRXhlY3V0ZSgpOworICAgICAgICAgICAgZG9FeGVjdXRlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwb3N0RXhlY3V0ZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKiBjaGVjayBmb3IgYXR0cmlidXRlcyBhbmQgYnVpbGRzIHRoZSBvcHRpb25zIGFycmF5ICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJlRXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2aWV3cGF0aCA9PSBudWxsKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCB2aWV3cGF0aCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwpeworICAgICAgICAgICAgY29tbWVudEZpbGUgPSBDQ1V0aWxzLmNyZWF0ZUNvbW1lbnRGaWxlKGNvbW1lbnQpOworICAgICAgICB9CisgICAgICAgIFZlY3RvciB2ID0gZ2V0T3B0aW9ucygpOworICAgICAgICBvcHRpb25zID0gbmV3IFN0cmluZ1t2LnNpemUoKV07CisgICAgICAgIHYuY29weUludG8ob3B0aW9ucyk7CisgICAgfQorICAgIAorICAgIC8qKiBjbGVhbiB1cCBtZXRob2QgY2FsbHMgYWZ0ZXIgZG9FeGVjdXRlICovCisgICAgcHJvdGVjdGVkIHZvaWQgcG9zdEV4ZWN1dGUoKXsKKyAgICAgICAgaWYgKGNvbW1lbnRGaWxlICE9IG51bGwpeworICAgICAgICAgICAgY29tbWVudEZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29yZSBwcm9jZXNzaW5nLiBJdCBsb29wcyBvdmVyIGFsbCBmaWxlcyBhbmQgY2FsbHMKKyAgICAgKiA8dHQ+ZXhlY3V0ZShTdHJpbmdbXSwgQ0NGaWxlKTwvdHQ+CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgRW51bWVyYXRpb24gZWxlbXMgPSBnZXRGaWxlcygpLmVsZW1lbnRzKCk7CisgICAgICAgIGxvZygiUHJvY2Vzc2luZyAiICsgZmlsZXMuc2l6ZSgpICsgIiBlbGVtZW50cy4uLiIpOworICAgICAgICB3aGlsZSAoIGVsZW1zLmhhc01vcmVFbGVtZW50cygpICl7CisgICAgICAgICAgICBleGVjdXRlKG9wdGlvbnMsIChDQ0ZpbGUpZWxlbXMubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbHMgdGhlIGNsZWFydG9vbCBjb21tYW5kIHdpdGggdGhlIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMuIE5vdGUgdGhlCisgICAgICogdGhlIGxhc3QgYXJyYXkgZWxlbWVudCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGJ5IHRoZSBmaWxlcGF0aC4KKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgY2xlYXJ0b29sIGNvbW1hbmQgdG8gZXhlY3V0ZS4gVGhlIGxhc3QgZWxlbWVudCBiZWluZyBhbGxvY2F0ZWQKKyAgICAgKiBhbmQgcmVwcmVzZW50aW5nIHRoZSBmaWxlcGF0aC4KKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBlbGVtZW50IHRvIHByb2Nlc3MuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gcHJvY2Vzc2luZyB0aGUKKyAgICAgKiBjbGVhcnRvb2wgY29tbWFuZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFN0cmluZ1tdIGFyZ3MsIENDRmlsZSBmaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBmaWxlLmdldFBhdGgoKTsKKyAgICAgICAgQ21kUmVzdWx0IHJlcyA9IHV0aWxzLmNsZWFydG9vbChhcmdzKTsKKyAgICAgICAgaWYgKHJlcy5nZXRTdGF0dXMoKSAhPSAwKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihyZXMuZ2V0U3RkRXJyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgdGhlIHNldCBvZiBmaWxlcy9kaXJlY3RvcmllcyB0byBiZSBwcm9jZXNzZWQuCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZC4gVGhlIGtleSBpcyBtYWRlIHVwCisgICAgICogdGhlIGZpbGVwYXRoIGFuZCB0aGUgdmFsdWUgaXMgdGhlIDx0dD5DQ0ZpbGU8L3R0PiBpbnN0YW5jZS4KKyAgICAgKiBAc2VlICNhY2NlcHQoQ0NGaWxlKQorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0RmlsZXMoKXsKKyAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIGZpbGVzOworICAgICAgICB9CisgICAgICAgIGZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcih2aWV3cGF0aCk7CisgICAgICAgIFN0cmluZ1tdIGluY2x1ZGVzID0gZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgICAgICBhZGRFbGVtZW50cyhmaWxlcywgZHMuZ2V0QmFzZWRpcigpLCBpbmNsdWRlcyk7CisgICAgICAgIGluY2x1ZGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICBhZGRFbGVtZW50cyhmaWxlcywgZHMuZ2V0QmFzZWRpcigpLCBpbmNsdWRlcyk7CisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHJlc3RyaWN0IGEgc2V0IG9mIHJlbGF0aXZlIGVsZW1lbnRzIGFuZCBhZGQgdGhlbQorICAgICAqIHRvIGEgbWFwLgorICAgICAqIEBwYXJhbSBtYXAgdGhlIG1hcCB3LyBhIHBhdGgvQ0NGaWxlIG1hcHBpbmcgdG8gYWRkIGVsZW1lbnRzIHRvLgorICAgICAqIEBwYXJhbSBiYXNlZGlyIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgYWxsIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gZWxlbXMgdGhlIHNldCBvZiBlbGVtZW50cyB0byByZXN0cmljdC4KKyAgICAgKiBAc2VlICNhY2NlcHQoQ0NGaWxlKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnRzKEhhc2h0YWJsZSBtYXAsIEZpbGUgYmFzZWRpciwgU3RyaW5nW10gZWxlbXMpeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKXsKKyAgICAgICAgICAgIENDRmlsZSBmID0gbmV3IENDRmlsZShiYXNlZGlyLCBlbGVtc1tpXSk7CisgICAgICAgICAgICBpZiAoIGFjY2VwdChmKSApeworICAgICAgICAgICAgICAgIG1hcC5wdXQoZi5nZXRQYXRoKCksIGYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisvLyBBbnQgYmVhbiBzZXR0ZXJzCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Vmlld1BhdGgoRmlsZSB2YWx1ZSl7CisgICAgICAgIHRoaXMudmlld3BhdGggPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSl7CisgICAgICAgIGNvbW1lbnQgPSB2YWx1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rZWxlbS5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtlbGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyZGZlYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rZWxlbS5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKKworLyoqCisgKiBDcmVhdGVzIGEgZmlsZSBvciBkaXJlY3RvcnkgZWxlbWVudC4KKyAqCisgKiBAc2VlIGh0dHA6Ly9jbGVhcmNhc2UucmF0aW9uYWwuY29tL2RvYy9sYXRlc3QvY2Nhc2VfdXgvY2NyZWYvbWtlbGVtLmh0bWwKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDQ01rZWxlbSBleHRlbmRzIENDTWF0Y2hpbmdUYXNrIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbm9jaGVja291dDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja2luOworCisgICAgcHJpdmF0ZSBib29sZWFuIHByZXNlcnZlVGltZTsKKworICAgIHByaXZhdGUgSGFzaHRhYmxlIGNvZGlycyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJncywgQ0NGaWxlIGZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIENDRmlsZSBwYXJlbnQgPSAoQ0NGaWxlKWNvZGlycy5nZXQoZmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCl7CisgICAgICAgICAgICBwYXJlbnQgPSBuZXcgQ0NGaWxlKGZpbGUuZ2V0UGFyZW50KCkpOworICAgICAgICAgICAgaWYgKCAhcGFyZW50LmlzVmVyc2lvbmVkKCkgKXsKKyAgICAgICAgICAgICAgICBta2VsZW1EaXJlY3RvcnkocGFyZW50KTsKKyAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdmVyc2lvbmVkIGRpcgorICAgICAgICAgICAgfSBlbHNlIGlmICggcGFyZW50LmlzQ2hlY2tlZEluKCkgKXsKKyAgICAgICAgICAgICAgICB1dGlscy5jaGVja291dCggcGFyZW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RpcnMucHV0KHBhcmVudC5nZXRQYXRoKCksIHBhcmVudCk7CisgICAgICAgIH0KKyAgICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgQ21kUmVzdWx0IHJlcyA9IENDVXRpbHMuY2xlYXJ0b29sKGFyZ3MpOworICAgICAgICBpZiAocmVzLmdldFN0YXR1cygpICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihyZXMuZ2V0U3RkRXJyKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0RXhlY3V0ZSgpIHsKKyAgICAgICAgLy8gY2hlY2tpbiBiYWNrIGFsbCBjbyBkaXJlY3RvcmllcworICAgICAgICBFbnVtZXJhdGlvbiBkaXJzID0gY29kaXJzLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlKCBkaXJzLmhhc01vcmVFbGVtZW50cygpICl7CisgICAgICAgICAgICBGaWxlIGRpciA9IChGaWxlKWRpcnMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHV0aWxzLmNoZWNraW4oIGRpciApOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnBvc3RFeGVjdXRlKCk7CisgICAgfQorCisgICAgLyoqIGNyZWF0ZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYmFzZWQgb24gdXNlciBpbnB1dCAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZ2V0T3B0aW9ucygpeworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdi5hZGRFbGVtZW50KCJta2VsZW0iKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCl7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoIi1lbHR5cGUiKTsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCh0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tbWVudCA9PSBudWxsKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLW5jIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21tZW50RmlsZSA9IENDVXRpbHMuY3JlYXRlQ29tbWVudEZpbGUoY29tbWVudCk7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoIi1jZmkiKTsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudChjb21tZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vY2hlY2tvdXQpeworICAgICAgICAgICAgdi5hZGRFbGVtZW50KCItbmNvIik7CisgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tpbil7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoIi1jaSIpOworICAgICAgICAgICAgaWYgKHByZXNlcnZlVGltZSl7CisgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KCItcHRpbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2LmFkZEVsZW1lbnQoIjxwbmFtZT4iKTsgLy8gZHVtbXkgYXJnIGZvciBmaWxlCisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBta2VsZW1EaXJlY3RvcnkoQ0NGaWxlIGRpcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcmVzb2x2ZSBzeW1vYmxpYyBsaW5rIGlmIGFueS4uLgorICAgICAgICBkaXIgPSBuZXcgQ0NGaWxlKCB1dGlscy5yZXNvbHZlU3ltYm9saWNMaW5rKGRpci5nZXRBYnNvbHV0ZUZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcGFyZW50IGlzIHZlcnNpb25lZC4uLgorICAgICAgICBDQ0ZpbGUgcGFyZW50ID0gbmV3IENDRmlsZShkaXIuZ2V0UGFyZW50KCkpOworICAgICAgICBib29sZWFuIHNob3VsZF9jaSA9IGZhbHNlOworICAgICAgICBpZiAoICFwYXJlbnQuaXNWZXJzaW9uZWQoKSApeworICAgICAgICAgICAgbWtlbGVtRGlyZWN0b3J5KHBhcmVudCk7CisgICAgICAgICAgICBjb2RpcnMucHV0KHBhcmVudC5nZXRQYXRoKCksIHBhcmVudC5nZXRBYnNvbHV0ZUZpbGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gLi4uYW5kIGNoZWNrb3V0IGl0IGlmIGFscmVhZHkgY2hlY2tlZCBpbi4KKyAgICAgICAgaWYgKCBwYXJlbnQuaXNDaGVja2VkSW4oKSApeworICAgICAgICAgICAgdXRpbHMuY2hlY2tvdXQocGFyZW50LmdldEFic29sdXRlRmlsZSgpKTsKKyAgICAgICAgICAgIGNvZGlycy5wdXQocGFyZW50LmdldFBhdGgoKSwgcGFyZW50LmdldEFic29sdXRlRmlsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbmFtZSB0aGUgdW52ZXJzaW9uZWQgZGlyZWN0b3J5IGludG8gYSB0ZW1wb3Jhcnkgb25lLi4uCisgICAgICAgIEZpbGUgbWtlbGVtX2ZpbGUgPSBuZXcgRmlsZShkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiX21rZWxlbSIpOworICAgICAgICBkaXIucmVuYW1lVG8oIG1rZWxlbV9maWxlICk7CisgICAgICAgIC8vIHRoZW4gY3JlYXRlIGl0IHZpYSBDbGVhcmNhc2UuLi4KKyAgICAgICAgdXRpbHMubWtkaXIoIGRpciApOworICAgICAgICBjb2RpcnMucHV0KGRpci5nZXRQYXRoKCksIGRpci5nZXRBYnNvbHV0ZUZpbGUoKSk7CisgICAgICAgIC8vIC4uIGFuZCBwb3B1bGF0ZSBpdCBiYWNrIHdpdGggaXRzIGZpbGVzLi4uCisgICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICBGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoICFmaWxlc1tpXS5yZW5hbWVUbyggbmV3RmlsZSApICkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IHJlbmFtZSBkaXIgJyIgKyBmaWxlc1tpXSArICInIGludG8gJyIgKyBuZXdGaWxlICsgIiciICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZGVsZXRlIHRoaXMgb25lIG9ubHkgaWYgdGhpbmdzIHdlbnQgc21vb3RobHkuLi4KKyAgICAgICAgbWtlbGVtX2ZpbGUuZGVsZXRlKCk7CisgICAgfQorCisvLyBiZWFuIHNldHRlcnMKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSl7CisgICAgICAgIHR5cGUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROb0NoZWNrb3V0KGJvb2xlYW4gdmFsdWUpeworICAgICAgICBub2NoZWNrb3V0ID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tpbihib29sZWFuIHZhbHVlKXsKKyAgICAgICAgY2hlY2tpbiA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByZXNlcnZlVGltZShib29sZWFuIHZhbHVlKXsKKyAgICAgICAgcHJlc2VydmVUaW1lID0gdmFsdWU7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rbGFiZWwuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rbGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWI3MDExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtsYWJlbC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogQXR0YWNoZXMgdmVyc2lvbiBsYWJlbHMgdG8gdmVyc2lvbiBvZiBlbGVtZW50cy4KKyAqCisgKiBAc2VlIGh0dHA6Ly9jbGVhcmNhc2UucmF0aW9uYWwuY29tL2RvYy9sYXRlc3QvY2Nhc2VfdXgvY2NyZWYvbWtsYWJlbC5odG1sIzIwNTEKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDQ01rbGFiZWwgZXh0ZW5kcyBDQ01hdGNoaW5nVGFzayB7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2UgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZm9sbG93ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbiA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlY3Vyc2UgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBWZWN0b3IgZ2V0T3B0aW9ucygpeworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdi5hZGRFbGVtZW50KCJta2xhYmVsIik7CisgICAgICAgIGlmIChyZXBsYWNlKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLXJlcGxhY2UiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVjdXJzZSl7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoIi1yZWN1cnNlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvbGxvdyl7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoIi1mb2xsb3ciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLWNmaWxlIik7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoY29tbWVudEZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmVyc2lvbiAhPSBudWxsKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLXZlcnNpb24iKTsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCh2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAgICB2LmFkZEVsZW1lbnQoIjxwbmFtZT4iKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbm90IHZlcnkgbmljZSwgYnV0IHdlJ2xsIHRyeSB0byBzcGVlZCB1cCB0aGluZ3MKKyAgICAgICAgLy8gYnkgYXNzdW1pbmcgYSByZWN1cnNlIGlzIHNldCBvbmx5IHRvIHRoZSB2aWV3cGF0aC4KKyAgICAgICAgaWYgKHJlY3Vyc2UpeworICAgICAgICAgICAgb3B0aW9uc1tvcHRpb25zLmxlbmd0aCAtIDFdID0gdmlld3BhdGguZ2V0UGF0aCgpOworICAgICAgICAgICAgdXRpbHMuY2xlYXJ0b29sKG9wdGlvbnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuZG9FeGVjdXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQ0NGaWxlIGZpbGUpIHsKKyAgICAgICAgLy9AZml4bWUgZG9lcyBpdCBmYWlsIG9uIGNoZWNrZWRvdXQgZmlsZXMgPworICAgICAgICByZXR1cm4gZmlsZS5pc1ZlcnNpb25lZCgpOworICAgIH0KKyAgICAvLyAgYmVhbiBzZXR0ZXJzCisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWN1cnNlKGJvb2xlYW4gdmFsdWUpeworICAgICAgICByZWN1cnNlID0gdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKXsKKyAgICAgICAgdmVyc2lvbiA9IHZhbHVlOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlKGJvb2xlYW4gdmFsdWUpeworICAgICAgICByZXBsYWNlID0gdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldEZvbGxvdyhib29sZWFuIHZhbHVlKXsKKyAgICAgICAgZm9sbG93ID0gdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDUm1uYW1lLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NSbW5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjM5MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9jbGVhcmNhc2Uvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDUm1uYW1lLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworCisvKioKKyAqIFJlbW92ZXMgdGhlIG5hbWUgb2YgYW4gZWxlbWVudCBvciBWT0Igc3ltYm9saWMgbGluayBmcm9tIGEgZGlyZWN0b3J5IHZlcnNpb24KKyAqCisgKiBAc2VlIGh0dHA6Ly9jbGVhcmNhc2UucmF0aW9uYWwuY29tL2RvYy9sYXRlc3QvY2Nhc2VfdXgvY2NyZWYvcm1uYW1lLmh0bWwKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDQ1JtbmFtZSBleHRlbmRzIENDTWF0Y2hpbmdUYXNrIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZSA9IGZhbHNlOworCisgICAgLyoqIHVzZWQgdG8gY2FjaGUgY28gZGlyZWN0b3JpZXMgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBjb2RpcnMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGdldE9wdGlvbnMoKSB7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICB2LmFkZEVsZW1lbnQoInJtbmFtZSIpOworICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLWNmaWxlIik7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoY29tbWVudEZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLWNvbW1lbnQiKTsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudChDQ1V0aWxzLkRFRkFVTFRfQ09NTUVOVCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcmNlKXsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiLWYiKTsKKyAgICAgICAgfQorICAgICAgICB2LmFkZEVsZW1lbnQoIjxwbmFtZT4iKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmdzLCBDQ0ZpbGUgZmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ0NGaWxlIHBhcmVudCA9IG5ldyBDQ0ZpbGUoZmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgIC8vIHdlIGhhdmUgZmlyc3QgdG8gY28gdGhlIHBhcmVudAorICAgICAgICBpZiAoIHBhcmVudC5pc0NoZWNrZWRJbigpICl7CisgICAgICAgICAgICB1dGlscy5jaGVja291dChwYXJlbnQpOworICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSB0aGUgZWxlbWVudAorICAgICAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBDbWRSZXN1bHQgcmVzID0gdXRpbHMuY2xlYXJ0b29sKGFyZ3MpOworICAgICAgICAvLyBpZiBpdCBmYWlsZWQsIHVuY28gb3RoZXJ3aXNlIGNpIHRoZSBwYXJlbnQKKyAgICAgICAgaWYgKHJlcy5nZXRTdGF0dXMoKSAhPSAwKXsKKyAgICAgICAgICAgIHV0aWxzLnVuY2hlY2tvdXQocGFyZW50KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihyZXMuZ2V0U3RkRXJyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXRpbHMuY2hlY2tpbihwYXJlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENDRmlsZSBmaWxlKXsKKyAgICAgICAgcmV0dXJuIGZpbGUuaXNDaGVja2VkSW4oKTsKKyAgICB9CisKKy8vIGJlYW4gc2V0dGVycworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlKGJvb2xlYW4gdmFsdWUpeworICAgICAgICBmb3JjZSA9IHZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1V0aWxzLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZTMzY2EKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cE1hdGNoZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHVtcFN0cmVhbUhhbmRsZXI7CisKKy8qKgorICogSGVscGVyIG1ldGhvZHMgcmVsYXRlZCB0byBjbGVhcmNhc2UgY29tbWFuZHMuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ0NVdGlscyB7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0NPTU1FTlQgPSAiXCJBdXRvbWF0aWMgb3BlcmF0aW9uIGZyb20gSmFrYXJ0YSBBbnRcIiI7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBSZWdleHBNYXRjaGVyRmFjdG9yeSBfX3JlRmFjdG9yeSA9IG5ldyBSZWdleHBNYXRjaGVyRmFjdG9yeSgpOworCisgICAgLyoqIHRoZSBtYXRjaGVycyBjYWNoZTogcGF0dGVybi9tYXRjaGVyICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlIG1hdGNoZXJzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgcHJpdmF0ZSBUYXNrIHRhc2s7CisKKyAgICBwdWJsaWMgQ0NVdGlscyhUYXNrIHRhc2speworICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIGdyb3VwIG9mIG1hdGNoZXMgb2YgYSBnaXZlbiBSRSBpbiBhIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiB0byBtYXRjaCBpbiB0aGUgaW5wdXQgZGF0YS4KKyAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGRhdGEgd2hlcmUgdG8gbG9vayBmb3IgdGhlIHBhdHRlcm4uCisgICAgICogQHJldHVybiB0aGUgZ3JvdXAgb2YgbWF0Y2hlcyBpZiBhbnksIDAgYmVpbmcgdGhlIGZ1bGwgbWF0Y2gKKyAgICAgKiBhbmQgdGhlIHJlc3QgYmVpbmcgcGFyZW50aGVzaXplZCBleHByZXNzaW9ucy4gPHR0Pm51bGw8L3R0PgorICAgICAqIGlmIHRoZXJlIGFyZSBubyBtYXRjaGVzLgorICAgICAqLworICAgIHB1YmxpYyBWZWN0b3IgbWF0Y2hlcyhTdHJpbmcgcGF0dGVybiwgU3RyaW5nIGlucHV0KXsKKyAgICAgICAgUmVnZXhwTWF0Y2hlciBtYXRjaGVyID0gKFJlZ2V4cE1hdGNoZXIpbWF0Y2hlcnMuZ2V0KHBhdHRlcm4pOworICAgICAgICBpZiAobWF0Y2hlciA9PSBudWxsKXsKKyAgICAgICAgICAgIG1hdGNoZXIgPSBfX3JlRmFjdG9yeS5uZXdSZWdleHBNYXRjaGVyKCk7CisgICAgICAgICAgICBtYXRjaGVyLnNldFBhdHRlcm4ocGF0dGVybik7CisgICAgICAgICAgICBtYXRjaGVycy5wdXQocGF0dGVybiwgbWF0Y2hlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZXIuZ2V0R3JvdXBzKGlucHV0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gcmVzb2x2ZSBhIHN5bWJvbGljIGxpbmsgaWYgaXQgaXMgb25lLgorICAgICAqIEBwYXJhbSB0b3Jlc29sdmUgdGhlIHN5bWJvbGljIGxpbmsgdG8gcmVzb2x2ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBsaW5rIGlmIGl0IGlzIGEgc3ltYm9saWMgbGluaywgb3RoZXJ3aXNlCisgICAgICogcmV0dXJuIHRoZSBvcmlnaW5hbCBsaW5rLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIHJlc29sdmVTeW1ib2xpY0xpbmsoRmlsZSB0b3Jlc29sdmUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7ICJscyIsICItbCIsIHRvcmVzb2x2ZS5nZXRBYnNvbHV0ZVBhdGgoKSB9OworICAgICAgICBDbWRSZXN1bHQgcmVzID0gY2xlYXJ0b29sKGFyZ3MpOworICAgICAgICBpZiAocmVzLmdldFN0YXR1cygpICE9IDAgKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihyZXMuZ2V0U3RkRXJyKCkpOworICAgICAgICB9CisgICAgICAgIFZlY3RvciBncm91cHMgPSBtYXRjaGVzKCJzeW1ib2xpYyBsaW5rKC4qKS0tPiguKikiLCByZXMuZ2V0U3Rkb3V0KCkpOworICAgICAgICBpZiAoZ3JvdXBzID09IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIHRvcmVzb2x2ZTsgLy8gb3IgbnVsbCA/CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGggPSAoU3RyaW5nKWdyb3Vwcy5lbGVtZW50QXQoMik7CisgICAgICAgIHBhdGggPSBwYXRoLnRyaW0oKTsKKyAgICAgICAgRmlsZSByZXNvbHZlZCA9IG5ldyBGaWxlKHBhdGgpOworICAgICAgICBpZiAoICFyZXNvbHZlZC5pc0Fic29sdXRlKCkgKXsKKyAgICAgICAgICAgIHJlc29sdmVkID0gbmV3IEZpbGUodG9yZXNvbHZlLmdldFBhcmVudCgpLCBwYXRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW92ZSBhIGZpbGUgdG8gYW5vdGhlci4gKGllIHJlbmFtZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb3ZlKEZpbGUgZnJvbSwgRmlsZSB0bykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IHsibW92ZSIsICItbmMiLCBmcm9tLmdldFBhdGgoKSwgdG8uZ2V0UGF0aCgpfTsKKyAgICAgICAgQ21kUmVzdWx0IHJlcyA9IGNsZWFydG9vbChhcmdzKTsKKyAgICAgICAgaWYgKHJlcy5nZXRTdGF0dXMoKSAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocmVzLmdldFN0ZEVycigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiB0aGUgbGlzdCBvZiBjaGVja2Vkb3V0IGZpbGVzIGluIGEgZ2l2ZW4gdmlld3BhdGguCisgICAgICogQHBhcmFtIHZpZXdwYXRoIHRoZSBwYXRoIHRvIHRoZSB2aWV3L2RpcmVjdG9yeSB0byBsb29rIGZvcgorICAgICAqIGNoZWNrZWRvdXQgZmlsZXMuCisgICAgICogQHBhcmFtIHJlY3Vyc2UgPHR0PnRydWU8L3R0PiB0byBsb29rIGZvciBmaWxlcyByZWN1cnNpdmVseSwKKyAgICAgKiBvdGhlcndpc2UgPHR0PmZhbHNlPC90dD4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNoZWNrZWRvdXQgZmlsZXMgaW4gdGhlIHZpZXcgKGZ1bGwgcGF0aG5hbWUpLgorICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgbHNjbyhGaWxlIHZpZXdwYXRoLCBib29sZWFuIHJlY3Vyc2UpIHsKKyAgICAgICAgU3RyaW5nIHJlY3Vyc2VQYXJhbSA9IHJlY3Vyc2UgPyAiLXIiIDogIiI7CisgICAgICAgIFN0cmluZyBmdWxscGF0aCA9IHZpZXdwYXRoLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAvL0BmaXhtZSBpcyAtY3ZpIGNvbmZsaWN0aW5nIHdpdGggLXIgPworICAgICAgICBTdHJpbmdbXSBhcmdzID0geyJsc2NvIiwgcmVjdXJzZVBhcmFtLCAiLWN2aSIsICItcyIsICItbWUiLCBmdWxscGF0aH07CisgICAgICAgIENtZFJlc3VsdCByZXMgPSBjbGVhcnRvb2woYXJncyk7CisgICAgICAgIGlmIChyZXMuZ2V0U3RhdHVzKCkgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHJlcy5nZXRTdGRFcnIoKSk7CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3IgbGluZXMgPSByZXMuZ2V0U3Rkb3V0TGluZXMoKTsKKyAgICAgICAgSGFzaHRhYmxlIG1hcCA9IHRvRmlsZXMobGluZXMpOworICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSBhIHNldCBvZiBwYXRocyBpbnRvIGNhbm9uaWNhbCBwYXRocy4KKyAgICAgKiBUeXBpY2FsbHkgdGhpcyBzaG91bGQgYmUgdXNlZCB0byB0cmFuc2Zvcm0gYSBzZXQgb2YKKyAgICAgKiBvdXRwdXQgbGluZXMgYnkgY2xlYXJ0b29sIHJlcHJlc2VudGluZyBmaWxlIHBhdGhzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIHRvRmlsZXMoVmVjdG9yIHBhdGhzKXsKKyAgICAgICAgSGFzaHRhYmxlIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBwYXRocy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHRoZSBwYXRoIGlzIG5vcm1hbGx5IHRoZSBmdWxsIHBhdGgsIHdlIG5vcm1hbGx5CisgICAgICAgICAgICAgICAgLy8gbm90IG5lZWQgdG8gZG8gYSBuZXcgRmlsZSh2aWV3cGF0aCwgcGF0aCkKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgICAgICAgICBwYXRoID0gZi5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChwYXRoLCBwYXRoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaXQncyBub3QgYSBmaWxlLi4uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgYXJlICpub3QqIGNoZWNrZWQgb3V0LgorICAgICAqIEBzZWUgI2xzY28oRmlsZSwgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgSGFzaHRhYmxlIGxzbmNvKEZpbGUgdmlld3BhdGgpeworICAgICAgICBTdHJpbmdbXSBhcmdzID0geyJmaW5kIiwgdmlld3BhdGguZ2V0QWJzb2x1dGVQYXRoKCksICItdHlwZSIsICJmIiwgIi1jdmkiLCAiLW54biIsICItcHJpbnQifTsKKyAgICAgICAgQ21kUmVzdWx0IHJlcyA9IGNsZWFydG9vbChhcmdzKTsKKyAgICAgICAgVmVjdG9yIGxpbmVzID0gcmVzLmdldFN0ZG91dExpbmVzKCk7CisgICAgICAgIEhhc2h0YWJsZSBhbGwgPSB0b0ZpbGVzKGxpbmVzKTsKKyAgICAgICAgSGFzaHRhYmxlIGNvID0gbHNjbyh2aWV3cGF0aCwgdHJ1ZSk7CisgICAgICAgIC8vIHJlbW92ZSB0aGUgY28gZmlsZXMKKyAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGNvLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKCBrZXlzLmhhc01vcmVFbGVtZW50cygpICl7CisgICAgICAgICAgICBPYmplY3QgcGF0aCA9IGtleXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIE9iamVjdCBvID0gYWxsLnJlbW92ZShwYXRoKTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwpeworICAgICAgICAgICAgICAgIC8vIG9vcHMgaG93IGNvbWUgYSBjbyBmaWxlIGlzIG5vdCBmb3VuZCBieSBmaW5kID8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIHRoZSBsaXN0IG9mIHByaXZhdGUgZmlsZXMgaW4gdGhlIHZpZXcgKi8KKyAgICBwdWJsaWMgSGFzaHRhYmxlIGxzcHJpdmF0ZShGaWxlIHZpZXdwYXRoKXsKKyAgICAgICAgLy8gZm9yIGEgc25hcHNob3Qgdmlldywgd2UgbXVzdCB1c2UgbHMgLXIgLXZpZXdfb25seQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGVja2luKEZpbGUgZmlsZSl7CisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7ImNpIiwgIi1uYyIsICItaWRlbnRpY2FsIiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0gOworICAgICAgICBDbWRSZXN1bHQgcmVzID0gY2xlYXJ0b29sKGFyZ3MpOworICAgICAgICBpZiAocmVzLmdldFN0YXR1cygpICE9IDApeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHJlcy5nZXRTdGRFcnIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGVja291dChGaWxlIGZpbGUpeworICAgICAgICBTdHJpbmdbXSBhcmdzID0geyJjbyIsICItbmMiLCAiLXVucmVzZXJ2ZWQiLCBmaWxlLmdldEFic29sdXRlUGF0aCgpfSA7CisgICAgICAgIENtZFJlc3VsdCByZXMgPSBjbGVhcnRvb2woYXJncyk7CisgICAgICAgIGlmIChyZXMuZ2V0U3RhdHVzKCkgIT0gMCl7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocmVzLmdldFN0ZEVycigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuY2hlY2tvdXQoRmlsZSBmaWxlKXsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IHsidW5jbyIsICItcm0iLCBmaWxlLmdldEFic29sdXRlUGF0aCgpIH07CisgICAgICAgIENtZFJlc3VsdCByZXMgPSBjbGVhcnRvb2woYXJncyk7CisgICAgICAgIGlmIChyZXMuZ2V0U3RhdHVzKCkgIT0gMCl7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocmVzLmdldFN0ZEVycigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1rZGlyKEZpbGUgZmlsZSwgU3RyaW5nIGNvbW1lbnQpIHsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1rZGlyKEZpbGUgZmlsZSl7CisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7Im1rZGlyIiwgIi1uYyIsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgfTsKKyAgICAgICAgQ21kUmVzdWx0IHJlcyA9IGNsZWFydG9vbChhcmdzKTsKKyAgICAgICAgaWYgKHJlcy5nZXRTdGF0dXMoKSAhPSAwKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihyZXMuZ2V0U3RkRXJyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBleGVjdXRlIGEgZ2l2ZW4gY2xlYXJ0b29sIGNvbW1hbmQuCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIHBhcmFtZXRlcnMgdXNlZCB0byBleGVjdXRlIGNsZWFydG9vbC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGNvbW1hbmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbWRSZXN1bHQgY2xlYXJ0b29sKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgU3RyaW5nW10gbmFyZ3MgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoICsgMV07CisgICAgICAgIG5hcmdzWzBdID0gImNsZWFydG9vbCI7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgMCwgbmFyZ3MsIDEsIGFyZ3MubGVuZ3RoKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXJyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBFeGVjdXRlU3RyZWFtSGFuZGxlciBoYW5kbGVyID0gbmV3IFB1bXBTdHJlYW1IYW5kbGVyKG91dCwgZXJyKTsKKyAgICAgICAgRXhlY3V0ZSBleGUgPSBuZXcgRXhlY3V0ZShoYW5kbGVyKTsKKyAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKG5hcmdzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCByZXRjb2RlID0gZXhlLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ21kUmVzdWx0KHJldGNvZGUsIG91dC50b1N0cmluZygpLCBlcnIudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBjb21tZW50IGZpbGUgdXNlZCBieSBjbGVhcnRvb2wgY29tbWFuZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZUNvbW1lbnRGaWxlKFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIEZpbGVVdGlscyBmdXRpbHMgPSBGaWxlVXRpbHMubmV3RmlsZVV0aWxzKCk7CisgICAgICAgIEZpbGUgZiA9IGZ1dGlscy5jcmVhdGVUZW1wRmlsZSgiYW50X2NjIiwgIi50bXAiLCBuZXcgRmlsZSgiLiIpKTsKKyAgICAgICAgV3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZikpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNvbW1lbnQpOworICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGY7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ21kUmVzdWx0LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2NsZWFyY2FzZS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ21kUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2MThjMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvY2xlYXJjYXNlL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DbWRSZXN1bHQuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQ21kUmVzdWx0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0ZG91dDsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0ZGVycjsKKworICAgIHByaXZhdGUgaW50IGNvZGUgPSAwOworCisgICAgcHVibGljIENtZFJlc3VsdChpbnQgY29kZSwgU3RyaW5nIHN0ZG91dCwgU3RyaW5nIHN0ZGVycil7CisgICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CisgICAgICAgIHRoaXMuc3Rkb3V0ID0gc3Rkb3V0OworICAgICAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0ZG91dCgpeworICAgICAgICByZXR1cm4gc3Rkb3V0OworICAgIH0KKworICAgIHB1YmxpYyBWZWN0b3IgZ2V0U3Rkb3V0TGluZXMoKXsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmxpbmVTcGxpdChzdGRvdXQpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RkRXJyKCl7CisgICAgICAgIHJldHVybiBzdGRlcnI7CisgICAgfQorCisgICAgcHVibGljIFZlY3RvciBnZXRTdGRFcnJMaW5lcygpeworICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMubGluZVNwbGl0KHN0ZGVycik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTdGF0dXMoKXsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2RvdG5ldC9SRUFETUUgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2RvdG5ldC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0OGJhYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvZG90bmV0L1JFQURNRQpAQCAtMCwwICsxIEBACitNb3ZlZCB0byBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvZG90bmV0L3RydW5rLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvZmlsdGVycmVhZGVycy9SRUFETUUgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2ZpbHRlcnJlYWRlcnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMWE1YmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2ZpbHRlcnJlYWRlcnMvUkVBRE1FCkBAIC0wLDAgKzEsODIgQEAKKworKioqKiogRmlsdGVyIFJlYWRlcnMgaXMgbm93IGF2YWlsYWJsZSBpbiBBbnQncyBtYWluIGRldmVsb3BtZW50IHRyZWUgKioqKioKKworCitBbnQgRmlsdGVyIFJlYWRlcnMKKz09PT09PT09PT09PT09PT09PQorCitVc2VjYXNlOgorPT09PT09PT0KKyogVXNhZ2Ugb2YgZmlsdGVyaW5nIGhhcyBiZWNvbWUgYSBjb21tb24gcGF0dGVybiBpbiAKKyAgQW50J3MgdGFza3MuICBGaWx0ZXJpbmcgaXMgYmVpbmcgcGVyZm9ybWVkIG9uZSB3YXkgb3IKKyAgYW5vdGhlciBpbiB0YXNrcyBsaWtlIDxjb3B5PiwgPG1vdmU+LCA8Zml4Y3JsZj4sCisgIDxsb2FkZmlsZT4sIGV0Yy4KKworKiBUaGVyZSBpcyBubyBnZW5lcmljIHdheSB0byBhZGQgY3VzdG9tIGZpbHRlcnMKKyAgY3VycmVudGx5IHRvIHRoZXNlIHRhc2tzLiAgVXNlciBoYXMgdG8gZWl0aGVyIGV4dGVuZAorICB0aGUgdGFzayB0byBhZGQgY3VzdG9tIGZpbHRlciBwcm9jZXNzaW5nIG9yIGFkZAorICBtb3JlIGF0dHJpYnV0ZXMgYXMgbmVlZGVkIHRvIHRoZSB0YXNrIGl0c2VsZi4KKyAgCisqIElmIHVzZXIgaXMgcHJvdmlkZWQgd2l0aCBhIHBsdWdnYWJsZSBmaWx0ZXJpbmcKKyAgbWVjaGFuaXNtLCBjaGFuZ2VzIHRvIGJ1aWx0LWluIHRhc2tzIGNhbiBiZSBtaW5pbml6ZWQsCisgIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgcHJvdmlkaW5nIGluY3JlYXNlZCBmbGV4aWJpbGl0eQorICB0byB0aGUgdXNlci4KKworRGVzaWduOgorPT09PT09CisqIEZpbHRlckNoYWluIGlzIGFuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiAnQW50RmlsdGVyUmVhZGVyJ3MgYW5kCisgICdqYXZhLmlvLkZpbHRlclJlYWRlcidzCisKKyogRWFjaCBBbnRGaWx0ZXJSZWFkZXIgZW5jbG9zZXMgdGhlIGN1c3RvbSBjbGFzcyByZXByZXNlbnRpbmcgCisgIHRoZSBhY3R1YWwgamF2YS5pby5GaWx0ZXJSZWFkZXIgYW5kIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gCisgIHBhcmFtZXRlcnMgdGhhdCBtYXkgYmUgdXNlZCBieSB0aGUgY3VzdG9tIGNsYXNzIGlmIGl0CisgIGltcGxlbWVudHMgdGhlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcml6YWJsZQorICBpbnRlcmZhY2UuCisKKyogRm9yIGVhc2Ugb2YgdXNlLCBBbnQncyBjb3JlIGZpbHRlciByZWFkZXJzIGNhbgorICBiZSB1c2VkIHdpdGggYSBmaWx0ZXIgcmVhZGVyIHNwZWNpZmljIHN5bnRheCBhbHNvLgorICAKKyogQ3VzdG9tIGZpbHRlciByZWFkZXJzIGNhbiBiZSBjcmVhdGVkIGVhc2lseSBldmVuCisgIHdpdGhvdXQgdXNpbmcgYW55IG9mIEFudCdzIEFQSSAtIGFsbCBvbmUgbmVlZHMgdG8KKyAgZG8gdG8gY3JlYXRlIGEgY3VzdG9tIGZpbHRlciBpcyB0byBleHRlbmQgCisgIGphdmEuaW8uRmlsdGVyUmVhZGVyLgorICAKKyogSWYgdGhlIGV4dGVuZGVkIGNsYXNzIGFsc28gaW1wbGVtZW50cyBQYXJhbWV0ZXJpemFibGUsCisgIG9wZXJhdGlvbiBwYXJhbWV0ZXJzIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUKKyAgY3VzdG9tIGZpbHRlci4KKworKiBFYWNoIEZpbHRlclJlYWRlciBpcyBwaXBlZCB0aHJvdWdoIHRoZSBvdGhlciwgaWYgYW55LCBpbgorICB0aGUgY2hhaW4sIGluIHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbi4KKworRXhhbXBsZToKKz09PT09PT0KKworPGxvYWRmaWxlIHNyY0ZpbGU9ImZvbyIgcHJvcGVydHk9ImJhciI+CisgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5TdHJpcExpbmVDb21tZW50cyI+CisgICAgICAgICAgICA8cGFyYW0gdHlwZT0iY29tbWVudCIgdmFsdWU9Ii8vIi8+CisgICAgICAgICAgICA8cGFyYW0gdHlwZT0iY29tbWVudCIgdmFsdWU9IlJFTSAiLz4KKyAgICAgICAgICAgIDxwYXJhbSB0eXBlPSJjb21tZW50IiB2YWx1ZT0iLS0iLz4KKyAgICAgICAgPC9maWx0ZXJyZWFkZXI+CisgICAgICAgIDxmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlN0cmlwTGluZUJyZWFrcyIvPgorICAgIDwvZmlsdGVyY2hhaW4+Cis8L2xvYWRmaWxlPgorCitUaGUgYWJvdmUgZXhhbXBsZSBsb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgZm9vLAorZmlsdGVycyBvdXQgdGhlIGxpbmVzIHRoYXQgYmVnaW4gd2l0aCAvLywgUkVNIGFuZCAtLSwKK3JlbW92ZXMgbGluZSBicmVha3MgYW5kIHRoZW4gc3RvcmVzIHRoZSByZXN1bHQgaW4KK3RoZSBwcm9wZXJ0eSBuYW1lZCBiYXIuCisKK1NpbmNlIFN0cmlwTGluZUNvbW1lbnRzIGFuZCBTdHJpcExpbmVCcmVha3MgYXJlIGJ1aWx0LWluCitBbnQgZmlsdGVyIHJlYWRlcnMsIHRoZSBzYW1lIGNhbiBhbHNvIGJlIHJlcHJlc2VudGVkIGFzOgorCis8bG9hZGZpbGUgc3JjRmlsZT0iZm9vIiBwcm9wZXJ0eT0iYmFyIj4KKyAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxzdHJpcGxpbmVjb21tZW50cz4KKyAgICAgICAgICAgIDxjb21tZW50IHZhbHVlPSIvLyIvPgorICAgICAgICAgICAgPGNvbW1lbnQgdmFsdWU9IlJFTSAiLz4KKyAgICAgICAgICAgIDxjb21tZW50IHZhbHVlPSItLSIvPgorICAgICAgICA8L3N0cmlwbGluZWNvbW1lbnRzPgorICAgICAgICA8c3RyaXBsaW5lYnJlYWtzLz4KKyAgICA8L2ZpbHRlcmNoYWluPgorPC9sb2FkZmlsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL2J1aWxkLnhtbCBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWRmODU5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3MvYnVpbGQueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgPz4KKzxwcm9qZWN0IG5hbWU9Imh0dHB0YXNrcyIgZGVmYXVsdD0iYWxsIj4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEJ1aWxkIHRoZSBIVFRQIHRhc2tzIGludG8gdGhlIG1haW4gYW50IGRpcgorICAgICAgICBUaGlzIGlzIG5vdCBwcm9kdWN0aW9uIHF1YWxpdHkKKworICAgIDwvZGVzY3JpcHRpb24+CisgIDxwcm9wZXJ0eSBuYW1lPSJiYXNlIiBsb2NhdGlvbj0iLi4vLi4vLi4iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSIke2Jhc2V9L2J1aWxkIiAvPgorICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIGxvY2F0aW9uPSJzcmMvbWFpbiIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJkZWJ1ZyIgdmFsdWU9InRydWUiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZXByZWNhdGlvbiIgdmFsdWU9ImZhbHNlIiAvPgorICA8cHJvcGVydHkgbmFtZT0ib3B0aW1pemUiIHZhbHVlPSJ0cnVlIiAvPgorCisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImNvbXBpbGUiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtkZXByZWNhdGlvbn0iCisgICAgICAgICAgIGluY2x1ZGVhbnRydW50aW1lPSJ0cnVlIgorICAgICAgICAgICBvcHRpbWl6ZT0iJHtvcHRpbWl6ZX0iPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+CisgICAgPC9qYXZhYz4KKzwhLS0gICAgPGNvcHkgdG9EaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIgPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5Pi0tPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL2RvY3MvbWFudWFsL09wdGlvbmFsVGFza3MvaHR0cHRhc2tzLmh0bWwgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2h0dHB0YXNrcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMDg5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9kb2NzL21hbnVhbC9PcHRpb25hbFRhc2tzL2h0dHB0YXNrcy5odG1sCkBAIC0wLDAgKzEsNDI5IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkh0dHAgVGFza3M8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDI+SHR0cCBUYXNrczwvaDI+CisKK1Rhc2tzIGRvIHRvIG1ha2UgdGhlIGJhc2ljIEhUVFAgcmVxdWVzdHM6IGdldCwgcG9zdCwgaGVhZCwgcHV0LCB3aXRoIGF1dGhlbnRpY2F0aW9uLgorVGhlcmUgaXMgYWxzbyBhIHRhc2sgdG8gY29uZmlndXJlIHRoZSBwcm94eSBzZXR0aW5ncyBvZiB0aGUgaHR0cCB0YXNrcy4KKzxwPgorVGhlc2UgdGFza3Mgc2lnbmlmaWNhbnRseSBleHRlbmQgdGhlIGJhc2ljIDxhCitocmVmPSIuLi9Db3JlVGFza3MvZ2V0Lmh0bWwiPmdldCB0YXNrPC9hPiwgYnV0IGFyZSBzcGxpdCBvZmYgaW50byB0aGUgb3B0aW9uYWwgc2VjdGlvbgorc28gdGhhdAorPG9sPgorPGxpPiBUaGUgY29yZSBhbnQgZmlsZSBkb2Vzbid0IGdldCBzbyBiaWcKKzxsaT4gdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gbW92ZSB0byB1c2luZyBhbiBvcHRpb25hbCBqYXIgKEh0dHBDbGllbnQpIHRvIHdvcmsgYXJvdW5kCitsaW1pdGF0aW9ucyBvZiB0aGUgSFRUUCBzdXBwb3J0IGJ1aWx0IGluIHRvIHRoZSBKYXZhIHBsYXRmb3JtLiAgIAorPC9vbD4KKworPGgzPkNvcmUgRnVuY3Rpb25hbGl0eSBhbmQgUGFyYW1ldGVyczwvaDM+CisKKzxwPkNvbW1vbiBmdW5jdGlvbmFsaXR5IHRvIHRoZSBjb3JlIHRhc2tzIHRhc2tzIGlzIDwvcD4KKworPG9sPgorCis8bGk+QWJpbGl0eSB0byBuYW1lIHRoZSByZW1vdGUgdXJsIHdoaWNoIHRoZSB0YXJnZXQgb2YgdGhlIHJlcXVlc3QuPC9saT4KKworPGxpPkFiaWxpdHkgdG8gbmFtZSBhIGxvY2FsIGZpbGUgYXMgdGhlIGxvY2FsIHN0b3JlIG9mIGFueSByZXR1cm5lZAorY29udGVudC48L2xpPgorCis8bGk+QWJpbGl0eSB0byBuYW1lIGEgcHJvcGVydHkgYXMgdGhlIGxvY2FsIHN0b3JlIG9mIGFueSByZXR1cm5lZAorY29udGVudC48L2xpPgorCis8bGk+QWJpbGl0eSB0byBuYW1lIGEgcHJvcGVydHkgdG8gYmUgc2V0IHRvICZxdW90O3RydWUmcXVvdDsgd2hlbiBhCityZXF1ZXN0IHN1Y2NlZWRzLjwvbGk+CisKKzxsaT5UaGUgb3B0aW9uIHRvIGxpc3QgYSBudW1iZXIgb2YgcGFyYW1ldGVycywgZWFjaCB3aXRoIGEgbmFtZSBhbmQgYQordmFsdWUuIFNvbWUgbWV0aG9kcyAoSHR0cEdldCwgSHR0cEhlYWQpIGF0dGFjaCB0aGVzZSBwYXJhbWV0ZXJzIHRvIHRoZQorc3RhdGVkIHVybCB0byBnZW5lcmF0ZSB0aGUgdXJsIHRvIGFjdHVhbGx5IGZldGNoLiBPdGhlcnMgKEh0dHBQb3N0KSBzZW5kCit0aGUgcGFyYW1ldGVycyB1cCBpbiB0aGUgc3RhbmRhcmQgcmVwcmVzZW50YXRpb24gb2YgZm9ybSBkYXRhLjwvbGk+CisKKzxsaT5UaGUgb3B0aW9uIHRvIHN0YXRlIHRoZSBhdXRoZW50aWNhdGlvbiBwb2xpY3kgYW5kIHRoZW4gdGhlIHVzZXJuYW1lCithbmQgcGFzc3dvcmQuIEN1cnJlbnRseSBvbmx5IGJhc2ljIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQsIHdoaWNoIGlzCit1dHRlcmx5IGluc2VjdXJlIGV4Y2VwdCBvdmVyIGFuIGh0dHBzIGxpbms8L2xpPgorCis8bGk+QSAndmVyYm9zZScgb3B0aW9uIHdoaWNoIHByb3ZpZGVzIGV4dHJhIGluZm9ybWF0aW9uIGFuZCBwcm9nZXNzCitpbmZvcm1hdGlvbiBkdXJpbmcgYSBkb3dubG9hZC48L2xpPgorCis8bGk+VGltZXN0YW1wIGNvbnRyb2wsIHVzaW5nIHRoZSA8aT51c2V0aW1lc3RhbXA8L2k+IGZsYWcuIFdoZW4gc2V0IHRoZQordGltZXN0YW1wIG9mIGRvd25sb2FkZWQgY29udGVudCBpcyBzZXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgcmVtb3RlIGZpbGUKKyhKYXZhIDEuMiBvciBsYXRlciBvbmx5KSwgYW5kIHRoZSBsb2NhbCB0aW1lc3RhbXAgb2YgdGhlIGRlc3RpbmF0aW9uCitmaWxlIChpZiBpdCBleGlzdHMpIHVzZWQgdG8gc2V0IHRoZSBpZi1tb2RpZmllZC1zaW5jZSBoZWFkZXIgaW4gdGhlCityZXF1ZXN0LCB3aGljaCB3aWxsIHRyaWdnZXIgb3B0aW9uYWwgZG93bmxvYWQgb25seS4gPC9saT4KKworPC9vbD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorCis8cD4gVGhlIDxpPnVybDwvaT4gcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgVVJMIHRvIGFjY2Vzcy4gVGhlIG9wdGlvbmFsCis8aT5kZXN0PC9pPiBwYXJhbWV0ZXIgc3BlY2lmaWVzIGEgZGVzdGluYXRpb24gdG8gd2hpY2ggdGhlIHJldHJpZXZlZAorcGFnZSB3aWxsIGJlIHdyaXR0ZW4uIFRoZSBvcHRpb25hbCA8aT5kZXN0aW5hdGlvbnByb3BlcnR5IDwvaT5wYXJhbWV0ZXIKK3NwZWNpZmllcyBhIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzYXZlIHRoZSBjb250ZW50IHRvLCBpbnN0ZWFkIG9mIGEKK3Byb3BlcnR5LiBJZiBuZWl0aGVyIDxpPmRlc3Q8L2k+IG5vciA8aT5kZXN0aW5hdGlvbnByb3BlcnR5PC9pPgorc3BlY2lmaWVkLCB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBVUkwgYXJlIGRpc2NhcmRlZCAodGhpcyBpcwordXNlZnVsIHdoZW4gYWNjZXNzaW5nIHRoZSBVUkwgZm9yIHRoZSBwdXJwb3NlIG9mIGNhdXNpbmcgc29tZSBhY3Rpb24gb24KK3RoZSByZW1vdGUgc2VydmVyKS48L3A+CisKKzxwPiBXaGVuIHRoZSA8aT52ZXJib3NlPC9pPiBvcHRpb24gaXMgZW5hYmxlZCwgdGhlIHRhc2sgZGlzcGxheXMgYSAnLicgZm9yIGV2ZXJ5IAorICA2NCBLQiByZXRyaWV2ZWQuIElmIHRoZSA8aT5ibG9ja3NpemU8L2k+IHBhcmFtZXRlciBpcyBhZGp1c3RlZCB0aGVuIGZpbGVzIGFyZSAKKyAgdXBsb2FkZWQgb3IgZG93bmxvYWRlZCBpbiBhIGRpZmZlcmVudCBzaXplIGJsb2NrIGZyb20gdGhpcywgYW5kIHByb2dyZXNzIG1hcmtlcnMgCisgIGFwcGVhciBhcHByb3ByaWF0ZWx5LiA8L3A+CisKK1RoZSA8aT51c2V0aW1lc3RhbXA8L2k+IG9wdGlvbiBlbmFibGVzIHlvdSB0byBjb250cm9sIGRvd25sb2FkcyBzbyB0aGF0Cit0aGUgcmVtb3RlIGZpbGUgaXMgb25seSBmZXRjaGVkIGlmIG5ld2VyIHRoYW4gdGhlIGxvY2FsIGNvcHkuIElmIHRoZXJlCitpcyBubyBsb2NhbCBjb3B5LCB0aGUgZG93bmxvYWQgYWx3YXlzIHRha2VzIHBsYWNlLiBXaGVuIGEgZmlsZSBpcworZG93bmxvYWRlZCwgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIGlzIHNldCB0byB0aGUgcmVtb3RlCit0aW1lc3RhbXAsIGlmIHRoZSBKVk0gaXMgSmF2YTEuMiBvciBsYXRlci4gTkI6IFRoaXMgdGltZXN0YW1wIGZhY2lsaXR5Citvbmx5IHdvcmtzIG9uIGRvd25sb2FkcyB1c2luZyB0aGUgSFRUUCBwcm90b2NvbC4KKworPHA+VGhlIDxpPmF1dGh0eXBlPC9pPiwgPGk+dXNlcm5hbWU8L2k+LCBhbmQgPGk+cGFzc3dvcmQ8L2k+IG9wdGlvbnMgZW5hYmxlIHN1cHBvcnQgCisgIGZvciBwYXNzd29yZCBwcm90ZWN0ZWQgcGFnZXMuIEN1cnJlbnRseSBvbmx5ICdCYXNpYycgYXV0aGVudGljYXRpb24gaXMgdXNlZCwgCisgIHdoaWNoIGlzIG5vdG9yaW91c2x5IGluc2VjdXJlIGV4Y2VwdCBvdmVyIGFuIGVuY3J5cHRlZCBodHRwcyBjaGFubmVsLjwvcD4KKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4gCisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+YXV0aHR5cGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIEhUVFAgYXV0aGVudGljYXRpb24gcHJvdG9jb2wgdG8gdXNlLCA8aT5ub25lPC9pPiBvciA8aT5iYXNpYzwvaT4uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPmJsb2Nrc2l6ZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5zaXplIChpbiBraWxvYnl0ZXMpIG9mIHRoZSBkYXRhIGJsb2NrIHVzZWQgZm9yIHVwbG9hZCBhbmQgCisgICAgICBkb3dubG9hZC4gRGVmYXVsdDogNjQuPGJyPgorICAgICAgS2VlcCB0aGlzIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGhhcmQgZGlzayBzZWN0b3Igc2l6ZSBmb3IgZmlsZSBJTyBwZXJmb3JtYW5jZS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+ZGVzdDwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgd2hlcmUgdG8gc3RvcmUgdGhlIHJldHJpZXZlZCBmaWxlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4gCisgICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0aW5hdGlvblByb3BlcnR5PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gZmlsbCB3aXRoIHRoZSByZXR1cm5lZCBjb250ZW50LiAKKyAgICAgIElnbm9yZWQgaWYgPGk+ZGVzdDwvaT4gaXMgc2V0PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnN0b3AgdGhlIGJ1aWxkIGlmIHRoZSByZXF1ZXN0IGZhaWxlZC4gZGVmYXVsdDogdHJ1ZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4gCisgICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4gCisgICAgPHRkIHZhbGlnbj0idG9wIj5zdWNjZXNzUHJvcGVydHk8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgdG8gJnF1b3Q7dHJ1ZSZxdW90OyBpZiB0aGUgCisgICAgICByZXF1ZXN0IHN1Y2NlZWRzLjxicj4KKyAgICAgIFNldCA8aT5mYWlsb25lcnJvcjwvaT4gdG8gZmFsc2UgZm9yIHRoaXMgdG8gYmUgb2YgdXNlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4gCisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj51cmw8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBVUkwgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBhIGZpbGUuPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4gCisgICAgPHRkIHZhbGlnbj0idG9wIj51c2VjYWNoZXM8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Ym9vbGVhbiB0byBlbmFibGUgJ2NhY2hpbmcnIG9mIGNvbnRlbnQgZHVyaW5nIHRoZSBmZXRjaCBwcm9jZXNzLiAKKyAgICAgIGRlZmF1bHQ6ZmFsc2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj51c2VyZXNwb25zZWNvZGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+Ym9vbGVhbiB0byBlbmFibGUgc3VjY2Vzcy9mYWlsdXJlIHRvIGJlIGRldGVybWluZWQgYnkgcmVzdWx0IAorICAgICAgb2YgdGhlIHJlY2VpdmVkIHJlc3BvbnNlIGNvZGUuIEhUVFAgb25seS4gZGVmYXVsdD10cnVlLjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj4mbmJzcDs8L3RkPgorICA8L3RyPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHVzZXIgbmFtZSBmb3IgYXV0aGVudGljYXRpb24uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXRpbWVzdGFtcDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj5ib29sZWFuIGZsYWcgdG8gY29uZGl0aW9uYWxseSBkb3dubG9hZCBhIGZpbGUgYmFzZWQgb24gdGhlIAorICAgICAgdGltZXN0YW1wIG9mIHRoZSBsb2NhbCBjb3B5LiBIVFRQIG9ubHk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIj4gYm9vbGVhbiBmbGFnIHRvIGNvbnRyb2wgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gZGlzcGxheS48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPiBUaGUgPGk+c3VjY2Vzc1Byb3BlcnR5PC9pPiBuYW1lcyBhIHByb3BlcnR5IHdoaWNoIHdpbGwgYmUgc2V0IHRvICJ0cnVlIiBpZiAKKyAgdGhlIHJlcXVlc3Qgd2FzIGRlZW1lZCBzdWNjZXNzZnVsLiBGb3IgYW55IG5vbi1odHRwIHByb3RvY29sLCBzdWNjZXNzIGlzIGRlZmluZWQgCisgIGFzIHRoZSByZXF1ZXN0IGNvbXBsZXRpbmcuIEZvciBodHRwIGFuZCBodHRwcywgc3VjY2VzcyBpcyBkZWZpbmVkIGFzIHRoZSByZXF1ZXN0IAorICBjb21wbGV0aW5nLCBhbmQgdGhlIHJlc3BvbnNlIGNvZGUgZnJvbSB0aGUgc2VydmluZyBiZWluZyBvbmUgb2YgdGhlICdzdWNjZXNzJyAKKyAgdmFsdWVzIC1hbnkgbnVtYmVyIGJldHdlZW4gMjAwIGFuZCAyOTkgaW5jbHVzaXZlLiBUaGUgdXN1YWwgSFRUUF9PSyAoMjAwKSBpcyAKKyAgdGhlcmVmb3JlIGEgc3VjY2VzcywgYXMgaXMgSFRUUF9BQ0NFUFRFRCAoMjAyKS4gQnV0IGZhaWx1cmVzIHN1Y2ggYXMgQkFEX1JFUVVFU1QgCisgICg0MDApIGFuZCB0aGUgdWJpcXVpdG91cyBIVFRQX05PVF9GT1VORCAoNDA0KSBhcmUgbW9zdCBkZWZpbmF0ZWx5IGVycm9ycy4gU28gCisgIGFuIGF0dGVtcHQgdG8gYWNjZXNzIGEgbWlzc2luZyB1cmwgbWF5IHJlc3VsdCAnZmFpbHVyZScsZXZlbiB0aG91Z2ggc29tZSBjb250ZW50IAorICB3YXMgZG93bmxvYWQgKHN1Y2ggYXMsIHBlcmhhcHMsIHRoZSAnZmlsZSBub3QgZm91bmQnIHRleHQpLiBJZiB0aGlzIGlzIG5vdCB3aGF0IAorICB5b3UgZGVzaXJlLCB0aGVuIHNldCA8aT51c2VyZXNwb25zZWNvZGU8L2k+PSZxdW90O2ZhbHNlJnF1b3Q7IGZvciB0aGUgc3lzdGVtIAorICB0byBpbnRlcnByZXQgYW55IGRhdGEgYmFjayBhcyBhIHN1Y2Nlc3MuIAorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisKKzxwPjxiPnBhcmFtPC9iPjwvcD4KKworPHA+U3BlY2lmaWVzIGFuIEhUVFAgcmVxdWVzdCBwYXJhbWV0ZXIgdG8gc2VuZCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LgorRm9yIDxpPmdldDwvaT4gYW5kIDxpPmhlYWQ8L2k+IHJlcXVlc3QgbWV0aG9kcyB0aGUgcGFyYW1ldGVycyBhcmUKK2VuY29kZWQgYXMgcGFydCBvZiB0aGUgVVJMLiBGb3IgPGk+cG9zdDwvaT4gcmVxdWVzdCBtZXRob2RzLCB0aGUKK3BhcmFtZXRlcnMgYXJlIHNlbnQgYXMgdGhlIFBPU1QgcmVxdWVzdCBkYXRhLjwvcD4KKworPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgYm9yZGVyPSIxIj4KKyAgPHRib2R5PgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibWlkZGxlIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0IHByb3BlcnR5IHRvIHNldC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249Im1pZGRsZSI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0IHByb3BlcnR5LiBZb3UgbWF5IGFsdGVybmF0aXZlbHkKKyAgICAgIHNwZWNpZnkgdGhlIHZhbHVlIGFzIHRleHQgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgcGFyYW0gdGFncy48L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249Im1pZGRsZSI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+CisKKzxwPjxiPmhlYWRlcjwvYj48L3A+CisKKzxwPlNwZWNpZmllcyBhbiBhcmJpdHJhcnkgSFRUUCByZXF1ZXN0IGhlYWRlciB0aGF0IHdpbGwgYmUgc2VudCB3aXRoIHRoZQorcmVxdWVzdC48L3A+CisKKzx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIGJvcmRlcj0iMSI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJtaWRkbGUiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIEhUVFAgcmVxdWVzdCBoZWFkZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249Im1pZGRsZSI+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHZhbHVlIG9mIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVyLiBZb3UgbWF5IGFsdGVybmF0aXZlbHkKKyAgICAgIHNwZWNpZnkgdGhlIHZhbHVlIGFzIHRleHQgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgaGVhZGVyIHRhZ3MuPC90ZD4KKyAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJtaWRkbGUiPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGgzPlF1aXJreSBMaW1pdGF0aW9ucyBvZiBqYXZhLm5ldCBjbGFzc2VzPC9oMz4KK011bHRpcGxlIEhUVFAgaGVhZGVycyBjYW4gd2l0aCB0aGUgc2FtZSBuYW1lIGNhbiA8Yj5ub3Q8L2I+IGJlIHNldCwgZXZlbiAKK3Rob3VnaCB0aGUgcHJvdG9jb2wgcGVybWl0cyBpdC4gSmF2YTEuMSBhbmQgSmF2YSAxLjIgPGk+bWF5PC9pPiBwZXJtaXQgbXVsdGlwbGUgCitjb29raWVzIHRvIGJlIHNldCwgYnV0IHRoaXMgYmVoYXZpb3VyIGlzIGV4cGxpY2l0bHkgbm90IHN1cHBvcnRlZCBvbiBKYXZhMS4zLAorYXMgc29tZW9uZSB3ZW50IGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gc3RvcCB0aGlzIChKYXZhIGJ1ZyBJRCAjNDI0MjI1NCkuIAorWW91IG5lZWQgdG8gc2V0IG11bHRpcGxlIGNvb2tpZXMgaW4gb25lIGdvIGFuZCBob3BlIHRoZSBmYXIgZW5kIGNhbiBoYW5kbGUgaXQKKzxwPgorQnVnIElEICM0MTYwNDk5IGNvdmVycyBhbm90aGVyIGlzc3VlLCB0byB3aXQ6IHNvbWUgdmVyc2lvbnMgb2YgSmF2YSB0aHJvdworZXhjZXB0aW9ucyB3aGVuIGFuIGVycm9yIGNvZGUgaXMgZ3JlYXRlciB0aGFuIDQwMCBhbmQgdGhlIGRlc3QgZmlsZSBpc24ndAorb25lIG9mIGEgZmV3IHNpbXBsZSBmaWxlIHR5cGVzLCBidXQgSmF2YSAxLjIgYW5kIDEuMyBkbyBub3QuIFNvIHRoZXJlCitpcyBubyB3YXkgdG8gZ2V0IHRoZSBlcnJvciB0ZXh0IHdoZW4gYSBqc3AgcGFnZSB0aHJvd3Mgc29tZSBleGNlcHRpb24uCis8cD4KK0Fsc28sIGFsdGhvdWdoIHRoaXMgaXNudCBnb2luZyB0byBiZSBmaWxlZCB1bnRpbCB3ZSBoYXZlIGEgc2hvcnQKK3Rlc3QgY2FzZSwgYnV0IGlmIHlvdSByZWNpZXZlIGEgc2hvcnQgcmVzcG9uc2Ugd2l0aCBsZXNzIGNvbnRlbnQgdGhhbiAKK3RoZSBjb250ZW50LWxlbmd0aCBoZWFkZXIgcHJvbWlzZXMsIHRoZSBsaWJyYXJ5IHNlZW1zIHRvIHNpbGVudGx5IAorcmVkdWNlIHRoZSBjb250ZW50IGxlbmd0aCBoZWFkZXIgdG8gbWF0Y2gsIHdoaWNoIHNlZW1zIHRoZSB3cm9uZyBhY3Rpb24uICAgICAKKworICAKKyAgCis8aDI+PGEgbmFtZT0iaHR0cGdldCI+SHR0cEdldDwvYT48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworPHA+QWNjZXNzZXMgYSBVUkwgdG8gcmV0cmlldmUgYSBmaWxlIG9yIHRvIGNhdXNlIHNvbWUgYWN0aW9uIG9uIHRoZSBzZXJ2ZXIuPC9wPgorCis8cD4gVGhpcyB0YXNrIHNob3VsZCBiZSBwcmVmZXJyZWQgYWJvdmUgdGhlIDxhIGhyZWY9IiNjdnMiPkNWUyB0YXNrPC9hPiB3aGVuIGRvaW5nIAorICBhdXRvbWF0ZWQgYnVpbGRzLiBDVlMgaXMgc2lnbmlmaWNhbnRseSBzbG93ZXIgdGhhbiBsb2FkaW5nIGEgY29tcHJlc3NlZCBhcmNoaXZlIAorICB3aXRoIGh0dHAvZnRwLiBUaGlzIHRhc2sgd2lsbCBhbHNvIHJldHJpZXZlIGNvbnRlbnQgdXNpbmcgb3RoZXIgc3VwcG9ydGVkIHByb3RvY29scywgCisgIHN1Y2ggYXMgZnRwOiBhbmQgZmlsZTogCis8cD5BbGwgdGhlIGF0dHJpYnV0ZXMgb2YgaHR0cHRhc2sgbWF5IGJlIHVzZWQuIE5vdGUgdGhhdCBhIHF1aXJrIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiAKKyAgb2YgdGhlIGh0dHAgY2xpZW50IGluIGphdmEgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byByZWxpYWJseSBmZXRjaCB0aGUgcmVzcG9uc2UgCisgIGRldGFpbHMgZnJvbSBhbnkgdW5zdWNjZXNzZnVsIHJlcXVlc3QgYWdhaW5zdCBhIFVSTCB3aGljaCBkb2Vzbid0IGVuZCBpbiAnLmh0bSwuaHRtbCAKKyAgb3IgLnR4dCcuIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgdGFzayBpcyB1c2VkIHRvIGNvbXBpbGUganNwIHBhZ2VzIGJ5IGlzc3VpbmcgCisgIHJlcXVlc3QgYWdhaW5zdCB0aGVtLCB0aGUgdGV4dCBkZXRhaWxzIG9mIGFueSBlcnJvcnMgd2lsbCBub3QgYmUgcGlja2VkIHVwLiAKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwcmU+ICAmbHQ7aHR0cGdldCB1cmw9JnF1b3Q7aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8mcXVvdDsgZGVzdD0mcXVvdDtoZWxwL2luZGV4Lmh0bWwmcXVvdDsvJmd0OzwvcHJlPgorPHA+RmV0Y2hlcyB0aGUgaW5kZXggcGFnZSBvZiBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLywgYW5kIHN0b3JlcyBpdCBpbiB0aGUgCisgIGZpbGUgPGNvZGU+aGVscC9pbmRleC5odG1sPC9jb2RlPi4gPC9wPgorCis8cHJlPiAgICAmbHQ7aHR0cGdldCBzcmM9JnF1b3Q7aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvdG9tY2F0L25pZ2h0bHkvYW50LnppcCZxdW90OworICAgICAgICBkZXN0PSZxdW90O29wdGlvbmFsLmphciZxdW90OworICAgICAgICB2ZXJib3NlPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgdXNldGltZXN0YW1wPSZxdW90O3RydWUmcXVvdDsKKwkmZ3Q7CisgICAgICAgICZsdDtoZWFkZXIgbmFtZT0mcXVvdDtDb29raWUmcXVvdDsgdmFsdWU9JnF1b3Q7c29tZWlkPTQzZmYyYiZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9odHRwZ2V0Jmd0OzwvcHJlPgorPHA+IFJldHJpZXZlcyB0aGUgbmlnaHRseSBhbnQgYnVpbGQgZnJvbSB0aGUgdG9tY2F0IGRpc3RyaWJ1dGlvbiwgaWYgdGhlIGxvY2FsIAorICBjb3B5IGlzIG1pc3Npbmcgb3Igb3V0IG9mIGRhdGUuIFVzZXMgdGhlIHZlcmJvc2Ugb3B0aW9uIGZvciBwcm9ncmVzcyBpbmZvcm1hdGlvbi4gCisgIEEgY29va2llIGlzIHN1cHBsaWVkIGZvciB0aGUgc2VydmVyJ3MgYmVuZWZpdC48L3A+Cis8cHJlPiAgICAmbHQ7aHR0cGdldCB1cmw9Imh0dHBzOi8vd3d3LnBpenphc2VydmljZXMuY29tL3ByaWNlcy5qc3AiCisgICAgICAgICBkZXN0PSJwaXp6YS1wcmljZXMueG1sJnF1b3Q7Jmd0OworICAgICAgICZsdDtwYXJhbSBuYW1lPSZxdW90O3ppcGNvZGUmcXVvdDsmZ3Q7NTczNDAmbHQ7L3BhcmFtJmd0OworICAgICAgICZsdDtwYXJhbSBuYW1lPSZxdW90O3BpenphJnF1b3Q7Jmd0O3BlcHBlcm9uaSZsdDsvcGFyYW0mZ3Q7CisgICAgJmx0Oy9odHRwZ2V0Jmd0OzwvcHJlPgorPHA+QnVpbGRzIGEgVVJMIGJ5IGFkZGluZyBwYXJhbWV0ZXJzICgmcXVvdDs/emlwY29kZT01NzM0MCZhbXA7cGl6emE9cGVwcGVyb25pJnF1b3Q7KSAKKyAgdG8gdGhlIGJhc2UgVVJMIGFuZCB0aGVuIGZldGNoZXMgdGhlIGNvbnRlbnRzIChmaWN0aW9uYWwgZXhhbXBsZSk8L3A+Cis8aDI+PGEgbmFtZT0iaHR0cGhlYWQiPkh0dHBIZWFkPC9hPiA8L2gyPgorPHA+VGhlIGh0dHAgSEVBRCByZXF1ZXN0IGlzIHNpbWlsYXIgdG8gdGhlIG5vcm1hbCBHRVQgcmVxdWVzdCAsIGV4Y2VwdCBpdCwgYnkgCisgIGRlZmluaXRpb24sIHJldHVybnMgbm8gY29udGVudCwganVzdCBhIHN1Y2Nlc3MgY29kZSBhbmQgaHR0cCBoZWFkZXJzLiBBY2NvcmRpbmdseSwgCisgIHRoZSBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBiYXNlIGNsYXNzIC08aT5kZXN0PC9pPiBhbmQgLSwgPGk+ZGVzdGluYXRpb25wcm9wZXJ0eW5hbWU8L2k+KSAKKyAgYXJlIG5vdCBzdXBwb3J0ZWQgLWFueSBhdHRlbXB0IHRvIHVzZSB0aGVtIHdpbGwgcmVzdWx0IGluIGEgYnVpbGQgZmFpbHVyZS4gTm90ZSAKKyAgYWxzbyB0aGF0IHRoZSBodHRwIGFuZCBodHRwcyBwcm90b2NvbHMgYXJlIHRoZSBvbmx5IHByb3RvY29scyBzdXBwb3J0ZWQuIDwvcD4KKzxwPgorSHR0cEhlYWQgaXMgdXNlZnVsIGZvciB0cmlnZ2VyaW5nIHNlcnZlciBzaWRlIGFjdGlvbnMsIGJ1dCBub3RlIHRoYXQgbWFueSBzZXJ2ZXJzCitpbnRlcnByZXQgYSBIRUFEIHZlcnkgZGlmZmVyZW50bHkgZnJvbSBhIEdFVC4gQW4gSHR0cEdldCByZXF1ZXN0IHdpdGggdGhlCityZXR1cm4gZGF0YSBkaXNjYXJkZWQgaXMgb2Z0ZW4gYSBtb3JlIHJlbGlhYmxlIGFwcHJvYWNoLgorPC9wPgorCis8cD4gV2hlcmUgaGVhZCBjYW4gYmUgdXNlZnVsIGlzIGluIHRlc3RpbmcgZm9yIHRoZSBhdmFpbGFiaWxpdHkgYW5kIHJlYWNoYWJpbGl0eSAKKyAgb2Ygc2VydmVycywgc3VjaCBhcyBpbiB0aGUgZm9sbG93aW5nIHRlc3QgZm9yIGFwYWNoZSBiZWluZyByZWFjaGFibGUsIHdoaWNoIAorICBzZXRzIGEgdmFyaWFibGUgb24gc3VjY2VzczotIAorPHByZT4KKyAgICAmbHQ7aHR0cGhlYWQgdXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIgorICAgIAkgZmFpbG9uZXJyb3I9ImZhbHNlIgorICAgIAkgc3VjY2Vzc3Byb3BlcnR5PSJyZWFjaGFibGUuYXBhY2hlIgorICAgIAkgLyZndDsKKzwvcHJlPgorCis8cD5Ob3RlIHRoYXQgc29tZXRpbWVzIGEgbWlzc2luZyBmaWxlIG9uIGEgbWlzLWNvbmZpZ3VyZWQgc2VydmVyIHN0aWxsIGdlbmVyYXRlcyAKKyAgYSBzdWNjZXNzZnVsICcyMDAnIHJlc3BvbnNlIHRvIGEgR0VUIHJlcXVlc3QgLWFuZCByZXR1cm5zIGEgJ21pc3NpbmcnIGZpbGUgcGFnZSwgCisgIGJ1dCBhIEhFQUQgcmVxdWVzdCB3aWxsIHJlbGlhYmx5IHBpY2sgdXAgdGhlICdtaXNzaW5nIGZpbGUnIGVycm9yLiA8L3A+Cis8aDI+PGEgbmFtZT0iaHR0cHBvc3QiPkh0dHBQb3N0PC9hPjwvaDI+CisKKzxwPlRoaXMgaW1wbGVtZW50cyB0aGUgUE9TVCByZXF1ZXN0LiBTdXBwbGllZCBwYXJhbWV0ZXIgZGF0YSBpcyB0dXJuZWQgaW50byBmb3JtIAorICBkYXRhIGFuZCBzZW50IGFzIHRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LCByYXRoZXIgdGhhbiBhcHBlbmRlZCB0byB0aGUgVVJMLiBJZiAKKyAgYSBmaWxlIHRvIHVwbG9hZCBpcyBzcGVjaWZpZWQgaW5zdGVhZCwgdXNpbmcgPGk+dXBsb2FkRmlsZTwvaT4sIHRoZSBwYXJhbWV0ZXIgCisgIHZhbHVlcyBhcmUgaWdub3JlZC4gSW5zdGVhZCB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBmaWxlIGlzIHNlbnQgaW4gdGhlIGhlYWRlciAKKyAgLWJhc2VkIG9uIHRoZSA8aT5jb250ZW50VHlwZTwvaT4gYXR0cmlidXRlIG9yIHdoYXQgdGhlIGphdmEgcnVudGltZSB0aGlua3MgdGhlIAorICBjb250ZW50IHR5cGUgaXMgYmFzZWQgb24gdGhlIGZpbGUgZXh0ZW5zaW9uLiBUaGUgZmlsZSBpcyB1cGxvYWRlZC4gPC9wPgorCis8cD5MaWtlIEh0dHBHZXQsIHRoaXMgY29tbWFuZCBjYW4gcmV0dXJuIGEgY29udGVudCB3aGljaCBjYW4gZG93bmxvYWRlZCB0byBhIGZpbGUsCisgIHRvIGEgcHJvcGVydHksIG9yIGp1c3QgaWdub3JlZC48L3A+CisKKzxwPlRoaXMgdGFzayBhZGRzIHR3byBuZXcgYXR0cmlidXRlcyB0byB0aGUgYmFzZSBzZXQuIDwvcD4KKzx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIGJvcmRlcj0iMSI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3OCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTU5Ij48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzgiPnVwbG9hZEZpbGU8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1OSI+YSBmaWxlIHRvIHVwbG9hZC4gd2hlbiBzcGVjaWZpZWQsIGFsbCBwYXJhbWV0ZXJzCisgICAgICBhcmUgaWdub3JlZC48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj4KKyAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+bm88L2Rpdj4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzgiPmNvbnRlbnRUeXBlIDwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTU5Ij50aGUgdHlwZSBvZiB0aGUgY29udGVudCAodGV4dC9odG1sLCB0ZXh0L3htbCwKKyAgICAgIGFwcGxpY2F0aW9uL2JpbmFyeSwgZXRjKS4gT25seSBvZiByZWxldmFuY2Ugd2hlbiBhIGZpbGUgaXMgYmVpbmcgdXBsb2FkZWQsCisgICAgICBhbmQgc3RpbGwgb3B0aW9uYWwgaW4gdGhhdCBjYXNlLiA8L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj4KKyAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+bm88L2Rpdj4KKyAgICA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz48L2gzPgorPHByZT4KKyAgICZsdDtodHRwcG9zdCB1cmw9JnF1b3Q7aHR0cDovL3d3dy5leGFtcGxlLmNvbS9zZXJ2bGV0L2RvY3NlcnZlciZxdW90OworICAgICAgICAgICBhdXRodHlwZT0mcXVvdDtiYXNpYyZxdW90OyB1c2VybmFtZT0mcXVvdDtqb2UmcXVvdDsgcGFzc3dvcmQ9JnF1b3Q7c2lsbHkmcXVvdDsmZ3Q7CisgICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7YWN0aW9uJnF1b3Q7IHZhbHVlPSZxdW90O2dldGRvYyZxdW90Oy8mZ3Q7CisgICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7SVNCTiZxdW90OyZndDswMzg1NTAxMjBYJmx0Oy9wYXJhbSZndDsKKyAgICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtwYWdlcyZxdW90OyZndDsxOS0yMCZsdDsvcGFyYW0mZ3Q7CisgICAgICAgJmx0O2hlYWRlciBuYW1lPSZxdW90O0FjY2VwdC1MYW5ndWFnZSZxdW90OyB2YWx1ZT0mcXVvdDtlbi11cyZxdW90Oy8mZ3Q7CisgICAmbHQ7L2h0dHBwb3N0Jmd0OzwvcHJlPgorPHA+QWNjZXNzZXMgYSBzZXJ2ZXIgYXQgd3d3LmZvby5jb20sIHBhc3NpbmcgYSByZXF1ZXN0IHRvIHNvbWUgc2VydmxldCBhc2tpbmcgaXQKK3RvIHJldHJpZXZlIHNldmVyYWwgcGFnZXMgZnJvbSBhIHN0b3JlZCBib29rLiBBbiBIVFRQIGhlYWRlciBzcGVjaWZ5aW5nCithY2NlcHRhYmxlIGxhbmd1YWdlcyBmb3IgdGhlIHJldHVybmVkIGNvbnRlbnRzIGlzIGFsc28gc2VudC4gQmFzaWMKK2F1dGhlbnRpY2F0aW9uIGlzIHVzZWQgd2l0aCBhIHVzZXIgbmFtZSBvZiAmcXVvdDtqb2UmcXVvdDsgYW5kIGEgcGFzc3dvcmQgb2YKKyZxdW90O3NpbGx5JnF1b3Q7LjwvcD4KKzxwPgorPHByZT4gICAgJmx0O2h0dHBwb3N0IHVybD0iaHR0cHM6Ly93d3cucGl6emFzZXJ2aWNlcy5jb20iCisgICAgICAgICB1cGxvYWRGaWxlPSJwaXp6YS1vcmRlci54bWwiCisgICAgICAgICBjb250ZW50VHlwZT0idGV4dC94bWwiJmd0OworPC9wcmU+Cis8cD5TZW5kcyBhIHByZS1wcmVwYXJlZCBvcmRlciBmb3IgYSBwaXp6YSB0byBhIHBpenphIHZlbmRvciBhY2NlcHRpbmcgb3JkZXJzIHVzaW5nIAorICB4bWwtcnBjIHJlcXVlc3RzLiAoTkI6IGZpY3Rpb25hbCBleGFtcGxlKSA8L3A+Cis8aDI+PGEgbmFtZT0iU2V0UHJveHkiPjwvYT5TZXRQcm94eTwvaDI+Cis8cD5UaGlzIHRhc2sgY29uZmlndXJlcyB0aGUgcHJveHkgc2V0dGluZ3MgZm9yIGFsbCBodHRwIHRhc2tzIHdoaWNoIGZvbGxvdyBpdCAKKyAgaW4gdGhlIGJ1aWxkLiBUaGF0IGluY2x1ZGVzIHRoZSBvcmlnaW5hbCBHZXQgdGFzaywgYnV0IG5vdCB0aGUgdGVsbmV0IGFuZCBGVFAgCisgIHRhc2tzLiBUaGUgcHJveHkgc2V0dGluZ3MgcmVtYWluIGluIHBsYWNlIHVudGlsIGNoYW5nZWQgb3IgdGhlIGJ1aWxkIGZpbmlzaGVzLCAKKyAgYW5kIHdpbGwgYWxzbyBob2xkIGZvciBvdGhlciBhbnQgYnVpbGQgZmlsZXMgaW52b2tlZCBhbmQgZXZlbiBub24tZm9ya2VkIGphdmEgCisgIGludm9jYXRpb25zLCBhbmQgZXZlbiBVUkwgcmVzb2x1dGlvbnMgb2YgWE1MIHBhcnNlcnMgcnVubmluZyBpbiB0aGUgc2FtZSBKVk0KKyAgPC9wPgorPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgYm9yZGVyPSIxIj4KKyAgPHRyPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3OCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTU5Ij48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8L3RyPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc4Ij5wcm94eUhvc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1OSI+aG9zdG5hbWUgb2YgYSB3ZWIvZnRwIHByb3h5IHNlcnZlcjwvdGQ+CisgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPiAKKyAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+bm88L2Rpdj4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+IAorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc4Ij5wcm94eVBvcnQgPC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NTkiPmludGVnZXI7IHRoZSBwb3J0IG9mIHRoZSBwcm94eSBzZXJ2ZXI8L3RkPgorICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj4gCisgICAgICA8ZGl2IGFsaWduPSJjZW50ZXIiPm5vPC9kaXY+CisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPiAKKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3OCI+c29ja3NQcm94eUhvc3Q8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjU1OSI+aG9zdG5hbWUgb2YgYSBTT0NLUzQgcHJveHkgc2VydmVyPC90ZD4KKyAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+IAorICAgICAgPGRpdiBhbGlnbj0iY2VudGVyIj5ubzwvZGl2PgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4gCisgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzgiPnNvY2tzUHJveHlQb3J0PC90ZD4KKyAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1NTkiPmludGVnZXI7IHBvcnQgbnVtYmVyIG9mIGEgU09DS1M0IHNlcnZlciAoZGVmYXVsdD0xMDgwKTwvdGQ+CisgICAgPHRkIHZhbGlnbj0iY2VudGVyIiBhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPiAKKyAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+bm88L2Rpdj4KKyAgICA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMz48L2gzPgorPHA+VHVybiBvZmYgYWxsIHByb3hpZXM8L3A+Cis8cHJlPiAgICAmbHQ7c2V0cHJveHkgcHJveHlob3N0PSZxdW90OyZxdW90OyBzb2Nrc1Byb3h5SG9zdD0mcXVvdDsmcXVvdDsgLyZndDs8L3ByZT4KKzxwPlNldCB3ZWIgcHJveHkgdG8gJ3dlYi1wcm94eTo4MCc7IGRvIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIGV4aXN0aW5nIHNvY2tzIAorICBzZXR0aW5ncyAoaWYgYW55KTwvcD4KKzxwcmU+ICAgICZsdDtzZXRwcm94eSBwcm94eUhvc3Q9JnF1b3Q7d2ViLXByb3h5JnF1b3Q7IHByb3h5UG9ydD0mcXVvdDs4MCZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD5UdXJuIG9uIHNvY2tzPC9wPgorPHByZT4gICAgJmx0O3NldHByb3h5IHNvY2tzUHJveHlIb3N0PSZxdW90O3NvY2tzLXNlcnZlciZxdW90OyBzb2Nrc1Byb3h5UG9ydD0mcXVvdDsxMDgwJnF1b3Q7LyZndDs8L3ByZT4KKzxwPkRvIG5vdGhpbmc8L3A+Cis8cHJlPiAgICAmbHQ7c2V0cHJveHkvJmd0OzwvcHJlPgorPGhyPgorPHAgYWxpZ249ImNlbnRlciI+Q29weXJpZ2h0ICZjb3B5OyAyMDAwLDIwMDEgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMKK1Jlc2VydmVkLjwvcD4KKworPC9ib2R5PgorPC9odG1sPgorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9CYXNlNjRFbmNvZGUuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvQmFzZTY0RW5jb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmNGUzYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvQmFzZTY0RW5jb2RlLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaHR0cDsKKworLyoqCisgKiBUaGlzIGNvZGUgaGFuZGxlcyBCYXNlNjQgZW5jb2RpbmcgZm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uCisgKiBhbmQgdGhlIGxpa2UKKyAqCisgKiBAY3JlYXRlZCAwMiBBcHJpbCAyMDAxCisgKi8KK2NsYXNzIEJhc2U2NEVuY29kZSB7CisKKyAgICAvKioKKyAgICAgKiB0aGUgZW5jb2RlIGFscGhhYmV0CisgICAgICovCisgICAgcHJpdmF0ZSBjaGFyW10gYWxwaGFiZXQgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLnRvQ2hhckFycmF5KCk7CisKKworICAgIC8qKgorICAgICAqIEVuY29kZSBhIGJsb2NrIG9mIGJpbmFyeSBkYXRhIGFzIGJhc2U2NCBhcyBzcGVjaWZpZWQgaW4gUkZDMTUyMS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBiaW5hcnkgZGF0YSB0byBlbmNvZGUuCisgICAgICogQHJldHVybiBBbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBkYXRhIGVuY29kZWQKKyAgICAgKiAgICAgIGFzIEJhc2U2NAorICAgICAqLworICAgIHB1YmxpYyBjaGFyW10gZW5jb2RlQmFzZTY0KGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIGNoYXJbXSBvdXQgPSBuZXcgY2hhclsoKGRhdGEubGVuZ3RoICsgMikgLyAzKSAqIDRdOworCisgICAgICAgIC8vCisgICAgICAgIC8vIDMgYnl0ZXMgZW5jb2RlIHRvIDQgY2hhcnMuICBPdXRwdXQgaXMgYWx3YXlzIGFuIGV2ZW4KKyAgICAgICAgLy8gbXVsdGlwbGUgb2YgNCBjaGFyYWN0ZXJzLgorICAgICAgICAvLworICAgICAgICBmb3IgKGludCBpID0gMCwgaW5kZXggPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMywgaW5kZXggKz0gNCkgeworICAgICAgICAgICAgYm9vbGVhbiBxdWFkID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIHRyaXBsZSA9IGZhbHNlOworICAgICAgICAgICAgLy9jb252ZXJ0IHRvIHVuc2lnbmVkIGJ5dGUKKyAgICAgICAgICAgIGludCB2YWwgPSAoMHhGRiAmIChpbnQpIGRhdGFbaV0pOworICAgICAgICAgICAgdmFsIDw8PSA4OworICAgICAgICAgICAgaWYgKChpICsgMSkgPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHZhbCB8PSAoMHhGRiAmIChpbnQpIGRhdGFbaSArIDFdKTsKKyAgICAgICAgICAgICAgICB0cmlwbGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsIDw8PSA4OworICAgICAgICAgICAgaWYgKChpICsgMikgPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHZhbCB8PSAoMHhGRiAmIChpbnQpIGRhdGFbaSArIDJdKTsKKyAgICAgICAgICAgICAgICBxdWFkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dFtpbmRleCArIDNdID0gYWxwaGFiZXRbKHF1YWQgPyAodmFsICYgMHgzRikgOiA2NCldOworICAgICAgICAgICAgdmFsID4+PSA2OworICAgICAgICAgICAgb3V0W2luZGV4ICsgMl0gPSBhbHBoYWJldFsodHJpcGxlID8gKHZhbCAmIDB4M0YpIDogNjQpXTsKKyAgICAgICAgICAgIHZhbCA+Pj0gNjsKKyAgICAgICAgICAgIG91dFtpbmRleCArIDFdID0gYWxwaGFiZXRbdmFsICYgMHgzRl07CisgICAgICAgICAgICB2YWwgPj49IDY7CisgICAgICAgICAgICBvdXRbaW5kZXggKyAwXSA9IGFscGhhYmV0W3ZhbCAmIDB4M0ZdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvQ29udGVudEd1ZXNzZXIuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvQ29udGVudEd1ZXNzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTJiMzUxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9Db250ZW50R3Vlc3Nlci5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmh0dHA7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lio7CisKKy8qKgorICogdGhpcyBpcyBhIGNsYXNzIHRvIHdvcmsgYXJvdW5kIHRoZSBmYWN0IGEgZnVuY3Rpb24gSSB3YW50IChndWVzc0NvbnRlbnRUeXBlRnJvbU5hbWUpCisgKiBpcyBwcm90ZWN0ZWQuCisgKgorICogQGNyZWF0ZWQgTWFyY2ggMTcsIDIwMDEKKyAqLworY2xhc3MgQ29udGVudEd1ZXNzZXIgZXh0ZW5kcyBVUkxDb25uZWN0aW9uIHsKKworICAgIC8qKgorICAgICAqIHN0dWIgQ29uc3RydWN0b3IgZm9yIHRoZSBDb250ZW50R3Vlc3NlciBvYmplY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgRGVzY3JpcHRpb24gb2YgUGFyYW1ldGVyCisgICAgICovCisgICAgQ29udGVudEd1ZXNzZXIoVVJMIHVybCkgeworICAgICAgICBzdXBlcih1cmwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdGhpcyBzdHViIGlzIG5lZWRlZCBmb3IgdGhlIGJ1aWxkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIERlc2NyaXB0aW9uIG9mIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIH0KKworCisgICAgLyoqCisgICAgICogbWFrZSBhIHByb3RlY3RlZCBtZXRob2QgcHVibGljLgorICAgICAqIFRoaXMgZ3Vlc3NlcyBmaWxlIHR5cGUgZnJvbSBleHRlbnNpb24uIEl0J3Mgb2sgZm9yIHZlcnkKKyAgICAgKiB3ZWxsIGtub3duIHR5cGVzLi4uCisgICAgICogQHBhcmFtIGZpbGVuYW1lIGZpbGUgdG8gZ3Vlc3MgdHlwZSBvZgorICAgICAqIEByZXR1cm4gd2hhdCB0aGUgc3lzdGVtIGd1ZXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0NvbnRlbnRUeXBlKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICByZXR1cm4gZ3Vlc3NDb250ZW50VHlwZUZyb21OYW1lKGZpbGVuYW1lKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvSHR0cEF1dGhlbnRpY2F0aW9uU3RyYXRlZ3kuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvSHR0cEF1dGhlbnRpY2F0aW9uU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjRhYzAzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9IdHRwQXV0aGVudGljYXRpb25TdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmh0dHA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworCisvKioKKyAqIHRoaXMgaW50ZXJmYWNlIGlzIGZvciB1c2UgYnkgY2xhc3NlcyB3aGljaCBhdXRoZW50aWNhdGUgY29ubmVjdGlvbnMuCisgKgorICogQGNyZWF0ZWQgMjAgTWFyY2ggMjAwMQorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSHR0cEF1dGhlbnRpY2F0aW9uU3RyYXRlZ3kgeworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBBdXRoZW50aWNhdGlvbkhlYWRlciBhdHRyaWJ1dGUgb2YgdGhlIEh0dHBBdXRoU3RyYXRlZ3kKKyAgICAgKiBvYmplY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29ubmVjdGlvbiBUaGUgY3VycmVudCByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3BvbnNlQ29ubmVjdGlvbiBhbnkgcHJldmlvdXMgcmVxdWVzdCwgd2hpY2ggY2FuIGNvbnRhaW4gYQorICAgICAqICAgICAgICAgIGNoYWxsZW5nZSBmb3IgdGhlIG5leHQgcm91bmQuIFdpbGwgb2Z0ZW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSB1c2VyIHRoZSBjdXJyZW50IHVzZXIgbmFtZQorICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgY3VycmVudCBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhlbnRpY2F0aW9uSGVhZGVyKFVSTENvbm5lY3Rpb24gcmVxdWVzdENvbm5lY3Rpb24sCisgICAgICAgICAgICBVUkxDb25uZWN0aW9uIHJlc3BvbnNlQ29ubmVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gOworCisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9IdHRwQmFzaWNBdXRoLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL0h0dHBCYXNpY0F1dGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzdmZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9IdHRwQmFzaWNBdXRoLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmh0dHA7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdldDsKKworCisvKioKKyAqIHRoaXMgY2xhc3MgaW1wbGVtZW50cyBiYXNpYyBhdXRoLCB0aGUgb25lIHRoYXQgc2hvdWxkbid0IGJlIHVzZWQKKyAqIGV4Y2VwdCBvdmVyIGFuIGVuY3J5cHRlZCBsaW5rIG9yIHRydXN0ZWQgbmV0d29yay4KKyAqCisgKiBAY3JlYXRlZCAyMCBNYXJjaCAyMDAxCisgKi8KKworcHVibGljIGNsYXNzIEh0dHBCYXNpY0F1dGggaW1wbGVtZW50cyBIdHRwQXV0aGVudGljYXRpb25TdHJhdGVneSB7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEF1dGhlbnRpY2F0aW9uSGVhZGVyIGF0dHJpYnV0ZSBvZiB0aGUgSHR0cEF1dGhTdHJhdGVneQorICAgICAqIG9iamVjdAorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RDb25uZWN0aW9uIFRoZSBjdXJyZW50IHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2VDb25uZWN0aW9uIGFueSBwcmV2aW91cyByZXF1ZXN0LCB3aGljaCBjYW4gY29udGFpbiBhCisgICAgICogICAgICAgICAgY2hhbGxlbmdlIGZvciB0aGUgbmV4dCByb3VuZC4gV2lsbCBvZnRlbiBiZSBudWxsCisgICAgICogQHBhcmFtIHVzZXIgdGhlIGN1cnJlbnQgdXNlciBuYW1lCisgICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBjdXJyZW50IHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0aGVudGljYXRpb25IZWFkZXIoVVJMQ29ubmVjdGlvbiByZXF1ZXN0Q29ubmVjdGlvbiwKKyAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gcmVzcG9uc2VDb25uZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXNzd29yZCA9IHVzZXJuYW1lID09IG51bGwgPyAiIiA6IHBhc3N3b3JkOworICAgICAgICAgICAgU3RyaW5nIGVuY29kZVN0ciA9IHVzZXJuYW1lICsgIjoiICsgcGFzc3dvcmQ7CisgICAgICAgICAgICBjaGFyW10gZW5jb2RlZFBhc3M7CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RlZFBhc3NTdHI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEJhc2U2NEVuY29kZSBlbmNvZGVyID0gbmV3IEJhc2U2NEVuY29kZSgpOworICAgICAgICAgICAgZW5jb2RlZFBhc3MgPSBlbmNvZGVyLmVuY29kZUJhc2U2NChlbmNvZGVTdHIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBlbmNvZGVkUGFzc1N0cj0gbmV3IFN0cmluZyhlbmNvZGVkUGFzcyk7CisgICAgICAgICAgICAvKiB0aGlzIHVzZXMgdGhlIGdldCB0YXNrCisgICAgICAgICAgICBHZXQuQmFzZTY0Q29udmVydGVyIGNvbnZlcnRlcj0gbmV3IEdldC5CYXNlNjRDb252ZXJ0ZXIoKTsKKyAgICAgICAgICAgIGVuY29kZWRQYXNzU3RyID0gY29udmVydGVyLmVuY29kZShlbmNvZGVTdHIpOworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFN0cmluZyBhdXRoU3RyID0gIkJBU0lDICIgK2VuY29kZWRQYXNzU3RyOworICAgICAgICAgICAgcmVxdWVzdENvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBdXRob3JpemF0aW9uIiwgYXV0aFN0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9IdHRwRGlnZXN0QXV0aC5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9IdHRwRGlnZXN0QXV0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OWY0OWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL0h0dHBEaWdlc3RBdXRoLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CisKKworLyoqCisgKiB0aGlzIGNsYXNzIGltcGxlbWVudHMgYmFzaWMgYXV0aCwgdGhlIG9uZSB0aGF0IHNob3VsZG4ndCBiZSB1c2VkCisgKiBleGNlcHQgb3ZlciBhbiBlbmNyeXB0ZWQgbGluayBvciB0cnVzdGVkIG5ldHdvcmsuCisgKgorICogQGNyZWF0ZWQgMjAgTWFyY2ggMjAwMQorICovCisKK3B1YmxpYyBjbGFzcyBIdHRwRGlnZXN0QXV0aCBpbXBsZW1lbnRzIEh0dHBBdXRoZW50aWNhdGlvblN0cmF0ZWd5IHsKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgQXV0aGVudGljYXRpb25IZWFkZXIgYXR0cmlidXRlIG9mIHRoZSBIdHRwQXV0aFN0cmF0ZWd5CisgICAgICogb2JqZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvbm5lY3Rpb24gVGhlIGN1cnJlbnQgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwb25zZUNvbm5lY3Rpb24gYW55IHByZXZpb3VzIHJlcXVlc3QsIHdoaWNoIGNhbiBjb250YWluIGEKKyAgICAgKiAgICAgICAgICBjaGFsbGVuZ2UgZm9yIHRoZSBuZXh0IHJvdW5kLiBXaWxsIG9mdGVuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gdXNlciB0aGUgY3VycmVudCB1c2VyIG5hbWUKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgdGhlIGN1cnJlbnQgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRoZW50aWNhdGlvbkhlYWRlcihVUkxDb25uZWN0aW9uIHJlcXVlc3RDb25uZWN0aW9uLAorICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiByZXNwb25zZUNvbm5lY3Rpb24sCisgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHVzZXJuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhc3N3b3JkID0gdXNlcm5hbWUgPT0gbnVsbCA/ICIiIDogcGFzc3dvcmQ7CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RlU3RyID0gdXNlcm5hbWUgKyAiOiIgKyBwYXNzd29yZDsKKyAgICAgICAgICAgIEJhc2U2NEVuY29kZSBlbmNvZGVyID0gbmV3IEJhc2U2NEVuY29kZSgpOworICAgICAgICAgICAgY2hhcltdIGVuY29kZWRQYXNzID0gZW5jb2Rlci5lbmNvZGVCYXNlNjQoZW5jb2RlU3RyLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgU3RyaW5nIGF1dGhTdHIgPSAiQkFTSUMgIiArIG5ldyBTdHJpbmcoZW5jb2RlZFBhc3MpOworICAgICAgICAgICAgcmVxdWVzdENvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBdXRob3JpemF0aW9uIiwgYXV0aFN0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9IdHRwR2V0LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL0h0dHBHZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRjM2MxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9IdHRwR2V0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGJvcmluZyBvbGQgSFRUUDEuMCBnZXQuIEl0IHJlcHJlc2VudHMKKyAqIGEgcmVmYWN0b3Jpbmcgb2YgR2V0IHRvIEh0dHBUYXNrIGFuZCB0aGVuIGludG8gYSBzcGVjaWZpYworICogc3ViY2xhc3MuIGJlY2F1c2UgYWxtb3N0IGV2ZXJ5dGhpbmcgaXMgZG9uZSBieSB0aGUgcGFyZW50LAorICogdGhpcyBjbGFzcyBpcyBhbG1vc3QgY29tcGxldGVseSBlbXB0eQorICogQHNpbmNlIGFudDEuNQorICogQGNyZWF0ZWQgTWFyY2ggMTcsIDIwMDEKKyAqLworCitwdWJsaWMgY2xhc3MgSHR0cEdldCBleHRlbmRzIEh0dHBUYXNrIHsKKworICAgICAvKioKKyAgICAgKiBvdmVycmlkZSBvZiB0ZXN0CisgICAgICogQHJldHVybiB0cnVlIGFsd2F5cworICAgICAqLworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJlUGFyYW1zQWRkZWRUb1VybCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgIC8qKgorICAgICAqIHRoaXMgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGltcGxlbWVudGF0aW9ucworICAgICAqIHRvIHNldCB0aGUgcmVxdWVzdCBtZXRob2QgdG8gR0VULCBQT1NULCB3aGF0ZXZlcgorICAgICAqIEByZXR1cm4gR0VULCBvYnZpb3VzbHkKKyAgICAgKi8KKyAgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0TWV0aG9kKCkgeworICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL0h0dHBIZWFkLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL0h0dHBIZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0MmE2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvSHR0cEhlYWQuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CisKKy8qKgorICogSGVhZCBpcyBhIGdldCB3aXRoIGEgZGlmZmVyZW50IG1ldGhvZCBhbmQgdGhlIG5vdGlvbiBvZgorICogZGVzdGluYXRpb24gZmlsZSBtaXNzaW5nLiBXaHkgd291bGQgYW55b25lIHdhbnQgdG8gbWFrZSBhIEhFQUQKKyAqIHJlcXVlc3Q/IGEpIHNpZGUgZWZmZWN0cyBvbiB0aGUgc2VydmVyIGFuZCBiKSBwb2xsaW5nIGZvciBzdHVmZgorICogQHNpbmNlIGFudDEuNQorICogQGNyZWF0ZWQgTWFyY2ggMTcsIDIwMDEKKyAqLworCitwdWJsaWMgY2xhc3MgSHR0cEhlYWQgZXh0ZW5kcyBIdHRwVGFzayB7CisKKyAgICAgLyoqCisgICAgICogdGhpcyBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgaW1wbGVtZW50YXRpb25zCisgICAgICogdG8gc2V0IHRoZSByZXF1ZXN0IG1ldGhvZCB0byBHRVQsIFBPU1QsIHdoYXRldmVyCisgICAgICogQHJldHVybiBIRUFEIGFsd2F5cworICAgICAqLworICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RNZXRob2QoKSB7CisgICAgICAgICByZXR1cm4gIkhFQUQiOworICAgICB9CisKKyAgICAgLyoqCisgICAgICogb3ZlcnJpZGUgb2YgdGVzdAorICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBib29sZWFuIGFyZVBhcmFtc0FkZGVkVG9VcmwoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIGNoZWNrIGZvciBhbGwgdGhlIGRlc3RpbmF0aW9uIHNldHRpbmdzIGJlaW5nCisgICAgICogbnVsbDsgbm90aGluZyBlbHNlIG1ha2VzIHNlbnNlIGZvciBhIEhFQUQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyBpcyBmaW5lLiBmYWxzZSBpZiB3ZSBoYXZlIGVuY291bnRlcmVkCisgICAgICogICAgICBwcm9ibGVtcyBidXQgYXJlbnQgYWxsb3dlZCB0byBmYWlsIG9uIGFuIGVycm9yLAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gb25seSB0aHJvdyB0aGlzIHdoZW4gdGhlIGZhaWxvbmVycm9yCisgICAgICogICAgICBmbGFnIGlzIHRydWUKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeUFyZ3VtZW50cygpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEJ1aWxkRXhjZXB0aW9uIHRyb3VibGUgPSBudWxsOworICAgICAgICBpZihnZXREZXN0KCkgIT0gbnVsbCB8fCBnZXREZXN0aW5hdGlvblByb3BlcnR5KCkgIT1udWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3RpbmF0aW9uIHByb3BlcnRpZXMgbXVzdCBub3QgYmUgZGVmaW5lZCBmb3IgYSBIRUFEIHJlcXVlc3QiKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci52ZXJpZnlBcmd1bWVudHMoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvSHR0cFBvc3QuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvSHR0cFBvc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmIzMGMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9IdHRwUG9zdC5qYXZhCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5odHRwOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKKworLyoqCisgKiB0aGlzIGNsYXNzIGRvZXMgcG9zdCBvZiBmb3JtIGNvbnRlbnQgb3IgcmF3IGZpbGVzLiB5b3UgY2FuIGhhdmUgb25lCisgKiBvciB0aGUgb3RoZXIgLWFzIHNvb24gYXMgYSBmaWxlIGlzIHNwZWNpZmllZCBhbGwgdGhlIG90aGVyIHByb3BlcnRpZXMKKyAqIGFyZSBkcm9wcGVkIG9uIHRoZSBmbG9vci4KKyAqIGEgZmlsZSBwb3N0IHdpbGwgaGF2ZSBjb250ZW50IHR5cGUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBleHRlbnNpb24sIHlvdSBjYW4KKyAqIG92ZXJyaWRlIGl0CisgKiBAc2luY2UgYW50MS41CisgKiBAY3JlYXRlZCBNYXJjaCAxNywgMjAwMQorICovCisKK3B1YmxpYyBjbGFzcyBIdHRwUG9zdCBleHRlbmRzIEh0dHBUYXNrIHsKKworICAgIC8qKgorICAgICAqIGZpbGUgdG8gdXBsb2FkLiBOdWxsIGlzIG9rCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgRmlsZSBwb3N0RmlsZT1udWxsOworCisgICAgLyoqCisgICAgICogc2V0IHRoZSBmaWxlIHRvIHBvc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcGxvYWRGaWxlKEZpbGUgcG9zdEZpbGUpIHsKKyAgICAgICAgdGhpcy5wb3N0RmlsZT1wb3N0RmlsZTsKKyAgICB9CisKKyAgICAgLyoqCisgICAgICAqIHF1ZXJ5IHRoZSBwb3N0IGZpbGUKKyAgICAgICogQHJldHVybiB0aGUgZmlsZSBvciBudWxsIGZvciAnbm90IGRlZmluZWQnCisgICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFVwbG9hZEZpbGUoKSB7CisgICAgICAgIHJldHVybiBwb3N0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb250ZW50IHR5cGUuIGlnbm9yZWQgd2hlbiB0aGUgZmlsZSBpcyBudWxsLAorICAgICAqIGFuZCBldmVuIHRoZW4gd2UgZ3Vlc3MgaXQgaWYgYWludCBzcGVjaWZpZWQKKyAgICAgKi8KKworICAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZTsKKworICAgICAvKioKKyAgICAgICogc2V0IHRoZSBjb250ZW50IHR5cGUuIFJlY29tbWVuZGVkIGlmIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZAorICAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgICB0aGlzLmNvbnRlbnRUeXBlPWNvbnRlbnRUeXBlOworICAgICB9CisKKyAgICAgLyoqCisgICAgICAqIHF1ZXJ5IHRoZSBjb250ZW50IHR5cGUKKyAgICAgICogQHJldHVybiB0aGUgY29udGVudCB0eXBlIG9yIG51bGwgZm9yICdub3QgZGVmaW5lZCcKKyAgICAgICovCisgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgICByZXR1cm4gY29udGVudFR5cGU7CisgICAgIH0KKworICAgICAvKioKKyAgICAgKiBvdmVycmlkZSBvZiB0ZXN0CisgICAgICogQHJldHVybiBmYWxzZSBhbHdheXMKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBib29sZWFuIGFyZVBhcmFtc0FkZGVkVG9VcmwoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIG92ZXJyaWRlIG9mIHRoZSBiYXNlIGNvbm5lY3QgcHVtcHMKKyAgICAgKiB1cCB0aGUgcGFyYW1ldGVyIHZlY3RvciBhcyBmb3JtIGRhdGEKKyAgICAgKgorICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiB3aGVyZSB0byBjb25uZWN0IHRvCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBidWlsZCB0cm91YmxlCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBJTyB0cm91YmxlCisgICAgICovCisgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gZG9Db25uZWN0KFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbikKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYocG9zdEZpbGU9PW51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkb0Nvbm5lY3RGb3JtUG9zdChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBkb0Nvbm5lY3RGaWxlUG9zdChjb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGZlZWQgdXAgdGhlIHBhcmFtZXRlciB2ZWN0b3IgYXMgZm9ybSBkYXRhCisgICAgICoKKyAgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gd2hlcmUgdG8gY29ubmVjdCB0bworICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gYnVpbGQgdHJvdWJsZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gSU8gdHJvdWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBVUkxDb25uZWN0aW9uIGRvQ29ubmVjdEZvcm1Qb3N0KFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbikKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgbG9nKCJQb3N0aW5nIGRhdGEgYXMgYSBmb3JtIixQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBvdXRwdXQgcGF5bG9hZAorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZVN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMjU2KTsKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKGJ5dGVTdHJlYW0pOworICAgICAgICB3cml0ZVBvc3REYXRhKG91dCk7CisgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgYnl0ZVtdIGRhdGE9Ynl0ZVN0cmVhbS50b0J5dGVBcnJheSgpOworICAgICAgICAvL3NlbmQgaXQKKyAgICAgICAgCisgICAgICAgIHJldHVybiBkb0Nvbm5lY3RXaXRoVXBsb2FkKGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCisgICAgICAgICAgICAgICAgYnl0ZVN0cmVhbS5zaXplKCksCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmZWVkIHVwIHRoZSBkYXRhIGZpbGUKKyAgICAgKgorICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiB3aGVyZSB0byBjb25uZWN0IHRvCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBidWlsZCB0cm91YmxlCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBJTyB0cm91YmxlCisgICAgICovCisgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gZG9Db25uZWN0RmlsZVBvc3QoVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHNpemU9KGludClwb3N0RmlsZS5sZW5ndGgoKTsKKyAgICAgICAgbG9nKCJQb3N0aW5nIGZpbGUgIitwb3N0RmlsZSxQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5zdHJlYW09bmV3IEZpbGVJbnB1dFN0cmVhbShwb3N0RmlsZSk7CisgICAgICAgIFN0cmluZyB0eXBlPWNvbnRlbnRUeXBlOworICAgICAgICBpZih0eXBlPT1udWxsKSB7CisgICAgICAgICAgICB0eXBlPUNvbnRlbnRHdWVzc2VyLmd1ZXNzQ29udGVudFR5cGUocG9zdEZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZG9Db25uZWN0V2l0aFVwbG9hZChjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBpbnN0cmVhbSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB3cml0ZSBvdXQgcG9zdCBkYXRhIGluIGZvcm0gbW9kZQorICAgICAqCisgICAgICogQHBhcmFtIG91dCBEZXNjcmlwdGlvbiBvZiBQYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVBvc3REYXRhKFByaW50V3JpdGVyIG91dCkgeworICAgICAgICBIdHRwUmVxdWVzdFBhcmFtZXRlciBwYXJhbTsKKyAgICAgICAgVmVjdG9yIHBhcmFtcz1nZXRSZXF1ZXN0UGFyYW1ldGVycygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCcmJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJhbSA9IChIdHRwUmVxdWVzdFBhcmFtZXRlcikgcGFyYW1zLmdldChpKTsKKyAgICAgICAgICAgIG91dC5wcmludChwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGxvZygicGFyYW1ldGVyIDogIitwYXJhbS50b1N0cmluZygpLFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICAvKioKKyAgICAgKiB0aGlzIG11c3QgYmUgb3ZlcnJpZGRlbiBieSBpbXBsZW1lbnRhdGlvbnMKKyAgICAgKiB0byBzZXQgdGhlIHJlcXVlc3QgbWV0aG9kIHRvIEdFVCwgUE9TVCwgd2hhdGV2ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2Qgc3RyaW5nCisgICAgICovCisgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdE1ldGhvZCgpIHsKKyAgICAgICAgIHJldHVybiAiUE9TVCI7CisgICAgIH0KKworCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL0h0dHBSZXF1ZXN0UGFyYW1ldGVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL0h0dHBSZXF1ZXN0UGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzMjQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvSHR0cFJlcXVlc3RQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaHR0cDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBuYW1lLXZhbHVlIHBhaXJzIGZvciByZXF1ZXN0IHBhcmFtZXRlcnMKKyAqIGFuZCBoZWFkZXJzCisgKgorICogQGNyZWF0ZWQgTWFyY2ggMTcsIDIwMDEKKyAqLworCitwdWJsaWMgY2xhc3MgSHR0cFJlcXVlc3RQYXJhbWV0ZXIgeworCisgICAgLyoqCisgICAgICogcmVxdWVzdCBuYW1lCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiByZXF1ZXN0IHZhbHVlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIE5hbWUgYXR0cmlidXRlIG9mIHRoZSByZXF1ZXN0IHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5ldyBOYW1lIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgVmFsdWUgYXR0cmlidXRlIG9mIHRoZSByZXF1ZXN0IHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgVmFsdWUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgb2YgdGhlIHJlcXVlc3QgcGFyYW1ldGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBOYW1lIHZhbHVlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIFZhbHVlIGF0dHJpYnV0ZSBvZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFZhbHVlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIGZlYXR1cmUgdG8gdGhlIFRleHQgYXR0cmlidXRlIG9mIHRoZSByZXF1ZXN0IHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgVGhlIGZlYXR1cmUgdG8gYmUgYWRkZWQgdG8gdGhlIFRleHQgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICB0aGlzLnZhbHVlID0gdGV4dDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHNpbXBsZSBzdHJpbmdpZmllciByZXR1cm5pbmcgbmFtZSBhbmQgdmFsdWUgZW5jb2RlZCBmb3IgdXNlIGluIEhUVFAgcmVxdWVzdHMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIFVSTEVuY29kZXIuZW5jb2RlKGdldE5hbWUoKSkrCisgICAgICAgICAgICAnPScrVVJMRW5jb2Rlci5lbmNvZGUoZ2V0VmFsdWUoKSk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvSHR0cFRhc2suamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvSHR0cFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGZjYjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9odHRwdGFza3Mvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaHR0cC9IdHRwVGFzay5qYXZhCkBAIC0wLDAgKzEsMTE0MSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgZm91bmRhdGlvbmFsIGNsYXNzIGZvciBhbGwgdGhlIHRhc2tzIHdoaWNoIGltcGxlbWVudAorICogaHR0cCBtZXRob2RzLiBUbyBpbXBsZW1lbnQgYSBzdWJjbGFzcyB5b3UgKm11c3QqIHByb3ZpZGUKKyAqIGFuIGltcGxlbWVudGF0aW9uIG9mIGdldFJlcXVlc3RNZXRob2QoKS4gQ29uc2lkZXIgYWxzbworICogc3RhdGluZyB0aGUgcGFyYW1ldGVyIHBvbGljeSAoYXJlUGFyYW1zQWRkZWRUb1VybCgpKSBhbmQKKyAqIHRoZW4sIGlmIG5lZWRlZCwgb3ZlcnJpZGluZyBkb0Nvbm5lY3QsIGFuZCB0aGUgb25Db25uZWN0ZWQoKSwKKyAqIE9uRG93bmxvYWRGaW5pc2hlZCgpIG1ldGhvZHMuCisgKiBAc2luY2UgYW50MS41CisgKiBAY3JlYXRlZCBNYXJjaCAxNywgMjAwMQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSHR0cFRhc2sgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8qKgorICAgICAqIGZsYWcgdG8gY29udHJvbCBhY3Rpb24gb24gZXhlY3V0aW9uIHRyb3VibGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvcj10cnVlOworCisgICAgLyoqCisgICAgICogdGhpcyBzZXRzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgYW5kIHRoZSBoYXNoIGZvciBkb3dubG9hZAorICAgICAqLworCisgICAgcHJvdGVjdGVkIGludCBibG9ja1NpemUgPSA2NDsKKworICAgIC8qKgorICAgICAqIHByb3BlcnR5IHRvIHNldCBvbiBzdWNjZXNzCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN1Y2Nlc3NQcm9wZXJ0eTsKKworICAgIC8qKgorICAgICAqIHNvdXJjZSBVUkwuIHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlOworCisgICAgLyoqCisgICAgICogZGVzdGluYXRpb24gZm9yIGRvd25sb2FkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGRlc3Q7CisgICAgLyoqCisgICAgICogdmVyYm9zZSBmbGFnIGdpdmVzIGV4dHJhIGluZm9ybWF0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIHRpbWVzdGFtcCBiYXNlZCBkb3dubG9hZCBmbGFnLiBvZmYgYnkgZGVmYXVsdAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VUaW1lc3RhbXAgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIGF1dGhvcml6YXRpb24gbWVjaGFuaXNtIGluIHVzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhdXRoVHlwZSA9IEFVVEhfTk9ORTsKKworICAgIC8qKgorICAgICAqIHVzZXJuYW1lIGZvciBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lOworCisgICAgLyoqCisgICAgICogcGFzc3dvcmQgZm9yIGF1dGhlbnRpY2F0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7CisKKyAgICAvKioKKyAgICAgKiBwYXJhbWV0ZXJzIHRvIHNlbmQgb24gYSByZXF1ZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3IgcGFyYW1zID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogaGVhZGVycyB0byBzZW5kIG9uIGEgcmVxdWVzdAorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIGhlYWRlcnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBjYWNoZSBwb2xpY3kKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlY2FjaGVzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiB0aGUgbmFtZSBvZiBhIGRlc3RpbmF0aW9uIHByb3BlcnR5CisgICAgICovCisKKyAgICBwcml2YXRlIFN0cmluZyBkZXN0aW5hdGlvblByb3BuYW1lID0gbnVsbDsKKworICAgIC8qKioKKyAgICAgKiBhIGZsYWcgdG8gY29udHJvbCB3aGV0aGVyIG9yIG5vdCByZXNwb25zZSBjb2RlcworICAgICAqIGFyZSBhY3RlZCBvbgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VSZXNwb25zZUNvZGU9dHJ1ZTsKKworICAgIC8qKgorICAgICAqIE5vIGF1dGhlbnRpY2F0aW9uIHNwZWNpZmllZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFVVEhfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBiYXNpYyAnY2xlYXJ0ZXh0JyBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFVVEhfQkFTSUMgPSAxOworCisgICAgLyoqCisgICAgICogZGlnZXN0IGF1dGguIG5vdCBhY3R1YWxseSBzdXBwb3J0ZWQgYnV0IHByZXNlbnQgZm9yIGNvbXBsZXRlbmVzcworICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFVVEhfRElHRVNUID0gMjsKKworCisgICAgLyoqCisgICAgICogdHVybiBjYWNoaW5nIG9uIG9yIG9mZi4gb25seSByZWxldmFudCBmb3IgcHJvdG9jb2xzIGFuZCBtZXRob2RzCisgICAgICogd2hpY2ggYXJlIGNhY2hlYWJsZSAoSEVBRCwgR0VUKSBvbiBodHRwCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlY2FjaGVzIFRoZSBuZXcgVXNlQ2FjaGVzIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlQ2FjaGVzKGJvb2xlYW4gdXNlY2FjaGVzKSB7CisgICAgICAgIHRoaXMudXNlY2FjaGVzID0gdXNlY2FjaGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIHR1cm4gY2FjaGluZyBvbiBvciBvZmYuIG9ubHkgcmVsZXZhbnQgZm9yIHByb3RvY29scyBhbmQgbWV0aG9kcworICAgICAqIHdoaWNoIGFyZSBjYWNoZWFibGUgKEhFQUQsIEdFVCkgb24gaHR0cAorICAgICAqCisgICAgICogQHBhcmFtIHVzZWNhY2hlcyBUaGUgbmV3IFVzZUNhY2hlcyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZVJlc3BvbnNlQ29kZShib29sZWFuIHVzZVJlc3BvbnNlQ29kZXMgKSB7CisgICAgICAgIHRoaXMudXNlUmVzcG9uc2VDb2RlICA9IHVzZVJlc3BvbnNlQ29kZSA7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVSTC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1IFVSTCBmb3IgdGhlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VVJMKFN0cmluZyB1KSB7CisgICAgICAgIHRoaXMuc291cmNlID0gdTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHRoZSBsb2NhbCBkZXN0aW5hdGlvbiBmb3IgYW55IHJlc3BvbnNlLiB0aGlzIGNhbiBiZSBudWxsIGZvciAnZG9udAorICAgICAqIGRvd25sb2FkJworICAgICAqCisgICAgICogQHBhcmFtIGRlc3QgUGF0aCB0byBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3QoRmlsZSBkZXN0KSB7CisgICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7CisgICAgfQorCisvKioKKyAgICAgKiB0aGUgbG9jYWwgZGVzdGluYXRpb24gZm9yIGFueSByZXNwb25zZS4gdGhpcyBjYW4gYmUgbnVsbCBmb3IgJ2RvbnQKKyAgICAgKiBkb3dubG9hZCcKKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXN0IFBhdGggdG8gZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvblByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMuZGVzdGluYXRpb25Qcm9wbmFtZSA9IG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCZSB2ZXJib3NlLCBpZiBzZXQgdG8gIiA8Q09ERT50cnVlPC9DT0RFPiAiLgorICAgICAqCisgICAgICogQHBhcmFtIHZlcmJvc2UgVGhlIG5ldyBWZXJib3NlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHNldCBmYWlsIG9uIGVycm9yIGZsYWcKKyAgICAgKgorICAgICAqIEBwYXJhbSBiIFRoZSBuZXcgRmFpbE9uRXJyb3IgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGIpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSBiOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlIHRpbWVzdGFtcHMsIGlmIHNldCB0byAiIDxDT0RFPnRydWU8L0NPREU+ICIuIDxwPgorICAgICAqCisgICAgICogSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBpZi1tb2RpZmllZC1zaW5jZSBoZWFkZXIgaXMgc2V0IHNvIHRoYXQKKyAgICAgKiB0aGUgZmlsZSBpcyBvbmx5IGZldGNoZWQgaWYgaXQgaXMgbmV3ZXIgdGhhbiB0aGUgbG9jYWwgZmlsZSAob3IKKyAgICAgKiB0aGVyZSBpcyBubyBsb2NhbCBmaWxlKSBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBvbiBIVFRQIGNvbm5lY3Rpb25zLAorICAgICAqIGl0IGlzIGlnbm9yZWQgaW4gb3RoZXIgY2FzZXMuIFdoZW4gdGhlIGZsYWcgaXMgc2V0LCB0aGUgbG9jYWwgY29weQorICAgICAqIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUgd2lsbCBhbHNvIGhhdmUgaXRzIHRpbWVzdGFtcCBzZXQgdG8gdGhlCisgICAgICogcmVtb3RlIGZpbGUgdGltZS4gPGJyPgorICAgICAqIE5vdGUgdGhhdCByZW1vdGUgZmlsZXMgb2YgZGF0ZSAxLzEvMTk3MCAoR01UKSBhcmUgdHJlYXRlZCBhcyAnbm8KKyAgICAgKiB0aW1lc3RhbXAnLCBhbmQgd2ViIHNlcnZlcnMgb2Z0ZW4gc2VydmUgZmlsZXMgd2l0aCBhIHRpbWVzdGFtcAorICAgICAqIGluIHRoZSBmdXR1cmUgYnkgcmVwbGFjaW5nIHRoZWlyIHRpbWVzdGFtcCB3aXRoIHRoYXQgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiB0aW1lLiBBbHNvLCBpbnRlci1jb21wdXRlciBjbG9jayBkaWZmZXJlbmNlcyBjYW4gY2F1c2Ugbm8gZW5kIG9mCisgICAgICogZ3JpZWYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNldGltZXN0YW1wIFRoZSBuZXcgVXNlVGltZXN0YW1wIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlVGltZXN0YW1wKGJvb2xlYW4gdXNldGltZXN0YW1wKSB7CisgICAgICAgIGlmIChwcm9qZWN0LmdldEphdmFWZXJzaW9uKCkgIT0gUHJvamVjdC5KQVZBXzFfMSkgeworICAgICAgICAgICAgdGhpcy51c2VUaW1lc3RhbXAgPSB1c2V0aW1lc3RhbXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsb2coInVzZXRpbWVzdGFtcCBpcyBub3Qgc3VwcG9ydGVkIG9uIGphdmEgMS4xIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEF1dGh0eXBlIGF0dHJpYnV0ZSBvZiB0aGUgSHR0cFRhc2sgb2JqZWN0IFJFVklTSVQvUkVGQUNUT1IKKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuZXcgQXV0aHR5cGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRodHlwZShBdXRoTWV0aG9kVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMuYXV0aFR5cGU9dHlwZS5tYXBWYWx1ZVRvTnVtYmVyKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBVc2VybmFtZSB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4gc2V0dGluZyB0aGUgdXNlcm5hbWUKKyAgICAgKiBpbXBsaWNpdGx5IHR1cm5zIGF1dGhlbnRpY2F0aW9uIG9uLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSBuZXcgVXNlcm5hbWUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgICAgICBpZiAoYXV0aFR5cGUgPT0gQVVUSF9OT05FKSB7CisgICAgICAgICAgICBhdXRoVHlwZSA9IEFVVEhfQkFTSUM7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIFBhc3N3b3JkIGF0dHJpYnV0ZSBvZiB0aGUgSHR0cFRhc2sgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIG5ldyBQYXNzd29yZCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzZXQgYSB2YXJpYWJsZSB0byBiZSBzZXQgaW4gdGhlIGV2ZW50IG9mIHN1Y2Nlc3MKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdWNjZXNzUHJvcGVydHkgVGhlIG5ldyBTdWNjZXNzUHJvcGVydHkgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWNjZXNzUHJvcGVydHkoU3RyaW5nIHN1Y2Nlc3NQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnN1Y2Nlc3NQcm9wZXJ0eSA9IHN1Y2Nlc3NQcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYmxvY2sgc2l6ZSAoa2IpCisgICAgICovCisKKyAgICAgcHVibGljIGludCBnZXRCbG9ja1NpemUoKSB7CisgICAgICAgICByZXR1cm4gYmxvY2tTaXplOworICAgICB9CisKKyAgICAgLyoqCisgICAgICAqIHNldCB0aGUgbmV3IGJsb2NrIHNpemUgZm9yIGRvd25sb2FkCisgICAgICAqIEBwYXJhbSB0aGUgbmV3IHZhbHVlIChpbiBraWxvYnl0ZXMpCisgICAgICAqLworICAgICBwdWJsaWMgdm9pZCBzZXRCbG9ja1NpemUoaW50IGJsb2Nrc2l6ZSkgeworICAgICAgICAgdGhpcy5ibG9ja1NpemU9YmxvY2tTaXplOworICAgICB9CisKKworICAgIC8qKgorICAgICAqIHF1ZXJ5IGNhY2hlIHBvbGljeQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVXNlQ2FjaGVzIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlQ2FjaGVzKCkgeworICAgICAgICByZXR1cm4gdXNlY2FjaGVzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogcXVlcnkgZmFpbCBvbiBlcnJvciBmbGFnCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBGYWlsRmFpbE9uRXJyb3IgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsT25FcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIGZhaWxPbkVycm9yOworICAgIH0KKworCisgICAgLyoqCisgICAgICogZ2V0IHRoZSB1c2VybmFtZQorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IHVzZXJuYW1lIG9yIG51bGwgZm9yICdub25lJworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7CisgICAgICAgIHJldHVybiB1c2VybmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGdldCB0aGUgcGFzc3dvcmQKKyAgICAgKgorICAgICAqIEByZXR1cm4gY3VycmVudCBwYXNzd29yZCBvciBudWxsIGZvciAnbm9uZScKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gcGFzc3dvcmQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBSZW1vdGVVUkwgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGFjY2VzcyBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBSZXF1ZXN0UGFyYW1ldGVycyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBWZWN0b3IgZ2V0UmVxdWVzdFBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBhY2Nlc3NvciBvZiBzdWNjZXNzIHByb3BlcnR5IG5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFN1Y2Nlc3NQcm9wZXJ0eSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VjY2Vzc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gc3VjY2Vzc1Byb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIGFjY2Vzc29yIG9mIGRlc3RpbmF0aW9uIHByb3BlcnR5IG5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGRlc3RpbmF0aW9uIHZhbHVlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXN0aW5hdGlvblByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gZGVzdGluYXRpb25Qcm9wbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhY2Nlc3NvciBvZiBkZXN0aW5hdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBUaGVkZXN0aW5hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldERlc3QoKSB7CisgICAgICAgIHJldHVybiBkZXN0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogaWYgdGhlIHVzZXIgd2FudGVkIGEgc3VjY2VzcyBwcm9wZXJ0eSwgdGhpcyBpcyBpdC4gb2YgY291cnNlLCBpdAorICAgICAqIGlzIG9ubHkgcmVsZXZhbnQgaWYgZmFpbG9uZXJyb3I9ZmFsc2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gRGVzY3JpcHRpb24gb2YgdGhlIFJldHVybmVkIFZhbHVlCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBub3RlU3VjY2VzcygpIHsKKyAgICAgICAgaWYgKHN1Y2Nlc3NQcm9wZXJ0eSAhPSBudWxsICYmIHN1Y2Nlc3NQcm9wZXJ0eS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXRQcm9wZXJ0eShzdWNjZXNzUHJvcGVydHksICJ0cnVlIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERvZXMgdGhlIHdvcmsuCisgICAgICogQHRvZG8gZXh0cmFjdCBjb250ZW50IGxlbmd0aCBoZWFkZXIgYW5kIHVzZSBpdCB0byB2ZXJpZnkKKyAgICAgKiBjb21wbGV0ZW5lc3Mgb2YgZG93bmxvYWQKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIFRocm93biBpbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vY2hlY2sgYXJndW1lbnRzLCB3aWxsIGJhaWwgb3V0IGlmIHRoZXJlCisgICAgICAgIC8vd2FzIHRyb3VibGUgCisgICAgICAgIHZlcmlmeUFyZ3VtZW50cygpOworICAgICAgICAKKyAgICAgICAgLy9zZXQgdXAgdGhlIFVSTCBjb25uZWN0aW9uCisgICAgICAgIFVSTCB1cmwgPSBidWlsZFVSTCgpOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vbm93IGNyZWF0ZSBhIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworCisgICAgICAgICAgICAvL3NldCBjYWNoaW5nIG9wdGlvbiB0byB3aGF0ZXZlcgorICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZ2V0VXNlQ2FjaGVzKCkpOworCisgICAgICAgICAgICAvL3NldCB0aGUgdGltZXN0YW1wIG9wdGlvbiBpZiBmbGFnIGlzIHNldCBhbmQKKyAgICAgICAgICAgIC8vdGhlIGxvY2FsIGZpbGUgYWN0dWFsbHkgZXhpc3RzLgorICAgICAgICAgICAgbG9uZyBsb2NhbFRpbWVzdGFtcCA9IGdldFRpbWVzdGFtcCgpOworICAgICAgICAgICAgaWYgKGxvY2FsVGltZXN0YW1wICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBEYXRlIHQgPSBuZXcgRGF0ZShsb2NhbFRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGxvZygibG9jYWwgZmlsZSBkYXRlIDogIiArIHQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0SWZNb2RpZmllZFNpbmNlKGxvY2FsVGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGF1dGggaGVhZGVyLCBpZiBzcGVjaWZpZWQKKyAgICAgICAgICAgIC8vTkI6IHZlcmlmeUFyZ3VtZW50cyB3aWxsIGFscmVhZHkgaGF2ZSBjaGVja2VkIHRoYXQgeW91IGNhbid0CisgICAgICAgICAgICAvL2hhdmUgYSBudWxsIHVzZXJuYW1lIHdpdGggYSBub24tbnVsbCBzdHJhdGVneS4KKyAgICAgICAgICAgIEh0dHBBdXRoZW50aWNhdGlvblN0cmF0ZWd5IGF1dGhTdHJhdGVneT1nZXRBdXRoU3RyYXRlZ3koKTsKKyAgICAgICAgICAgIGlmIChhdXRoU3RyYXRlZ3kgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGF1dGhTdHJhdGVneS5zZXRBdXRoZW50aWNhdGlvbkhlYWRlcihjb25uZWN0aW9uLG51bGwsdXNlcm5hbWUscGFzc3dvcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXQgZXhwbGljaXRseSBzcGVjaWZpZWQgcmVxdWVzdCBoZWFkZXJzCisgICAgICAgICAgICBIdHRwUmVxdWVzdFBhcmFtZXRlciBoZWFkZXI7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAoSHR0cFJlcXVlc3RQYXJhbWV0ZXIpIGhlYWRlcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KGhlYWRlci5nZXROYW1lKCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9jYXN0IHRvIGFuIGh0dHAgY29ubmVjdGlvbiBpZiB3ZSBjYW4sCisgICAgICAgICAgICAvL3RoZW4gc2V0IHRoZSByZXF1ZXN0IG1ldGhvZCBwdWxsZWQgZnJvbSB0aGUgc3ViY2xhc3MKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2Q9Z2V0UmVxdWVzdE1ldGhvZCgpOworICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gaHR0cENvbm5lY3Rpb24gPSBudWxsOworICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikgeworICAgICAgICAgICAgICAgIGh0dHBDb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgIGh0dHBDb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QobWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZygibWFraW5nICIrbWV0aG9kKyIgdG8gIit1cmwpOworCisgICAgICAgICAgICAvL2NhbGwgc2VsZiBvciBzdWJjbGFzcyBmb3IgdGhlIGNvbm5lY3QuCisgICAgICAgICAgICAvL3RoZSBjb25uZWN0aW9uIG9iamVjdCBtYXkgY2hhbmdlIGlkZW50aXR5IGF0IHRoaXMgcG9pbnQuCisgICAgICAgICAgICBjb25uZWN0aW9uPWRvQ29ubmVjdChjb25uZWN0aW9uKTsKKworICAgICAgICAgICAgLy90aGVuIHByb3ZpZGUgYSBiaXQgb2Ygb3ZlcnJpZGFibGUgcG9zdCBwcm9jZXNzaW5nIGZvciB0aGUgZnVuIG9mIGl0CisgICAgICAgICAgICBpZiAoIW9uQ29ubmVjdGVkKGNvbm5lY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3JlcGVhdCB0aGUgY2FzdC4KKyAgICAgICAgICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgSHR0cFVSTENvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBodHRwQ29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgY29ubmVjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGh0dHBDb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgYSAzMDQgcmVzdWx0IChIVFRQIG9ubHkpIHdoZW4gd2Ugc2V0IHRoZSB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAvLyBlYXJsaWVyIG9uIChBIGZyYWN0aW9uYWwgcGVyZm9ybWFuY2UgdHdlYWspCisgICAgICAgICAgICAgICAgaWYgKGxvY2FsVGltZXN0YW1wICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFJlc3BvbnNlQ29kZShodHRwQ29ubmVjdGlvbikgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9OT1RfTU9ESUZJRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbm90IG1vZGlmaWVkIHNvIG5vIGZpbGUgZG93bmxvYWQuIGp1c3QgcmV0dXJuIGluc3RlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHRyYWNlIG91dCBzb21ldGhpbmcgc28gdGhlIHVzZXIgZG9lc24ndCB0aGluayB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy9kb3dubG9hZCBoYXBwZW5lZCB3aGVuIGl0IGRpZG4ndAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJMb2NhbCBmaWxlIGlzIHVwIHRvIGRhdGUgLSBzbyBub3RoaW5nIHdhcyBkb3dubG9hZGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RlU3VjY2VzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKworICAgICAgICAgICAgLy9nZXQgdGhlIGlucHV0IHN0cmVhbQorICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRJbnB1dFN0cmVhbShjb25uZWN0aW9uKTsKKworICAgICAgICAgICAgLy9iYWlsIG91dCBpZiB0aGUgaW5wdXQgc3RyZWFtIGlzbid0IHZhbGlkIGF0IHRoaXMgcG9pbnQKKyAgICAgICAgICAgIC8vYWdhaW4sIHRob3VnaCB3ZSBzaG91bGQgaGF2ZSBnb3QgdG8gdGhpcyBwb2ludCBlYXJsaWVyLgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygiQ2FuJ3QgZ2V0ICIgKyB1cmwsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgaWYgKGdldEZhaWxPbkVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbid0IHJlYWNoIFVSTCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3BpY2sgYSBmaWxlIG9yIG51bGwgc3RyZWFtIGZvciBzYXZpbmcgY29udGVudAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisgICAgICAgICAgICBpZiAoZGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJTYXZpbmcgb3V0cHV0IHRvICIrZGVzdCxQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihkZXN0aW5hdGlvblByb3BuYW1lIT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vc2F2ZSBjb250ZW50cyB0byBhIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIGxvZygiU2F2aW5nIG91dHB1dCB0byBwcm9wZXJ0eSAiK2Rlc3RpbmF0aW9uUHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgIG91dD1uZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGJsb2NrU2l6ZSAqIDEwMjQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy9kaXNjYXJkIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IE51bGxPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vZ2V0IGNvbnRlbnQgbGVuZ3RoCisgICAgICAgICAgICAvL2RvIGl0IHRoaXMgd2F5IGluc3RlYWQgb2YgY2FsbGluZyBnZXRDb250ZW50TGVuZ3RoKCkgYmVjYXVzZQorICAgICAgICAgICAgLy90aGF0IHdheSBpcyBzcG9yYWRpY2FsbHkgdW5yZWxpYWJsZSAobGVuZ3RoIGlzIGRvd25ncmFkZWQgdG8gCisgICAgICAgICAgICAvL3NpemUgb2Ygc21hbGwgcGFja2V0cykKKyAgICAgICAgICAgIGludCBjb250ZW50TGVuZ3RoPWNvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGRJbnQoIkNvbnRlbnQtTGVuZ3RoIiwtMSk7CisgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkPTA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vbm93IHN0YXJ0IGRvd25sb2FkLgorICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2Jsb2NrU2l6ZSAqIDEwMjRdOworICAgICAgICAgICAgaW50IGxlbmd0aDsKKworICAgICAgICAgICAgd2hpbGUgKChsZW5ndGggPSBpcy5yZWFkKGJ1ZmZlcikpID49IDAgJiYgCisgICAgICAgICAgICAgICAgKGNvbnRlbnRMZW5ndGg9PS0xIHx8IGJ5dGVzUmVhZDxjb250ZW50TGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCs9bGVuZ3RoOworICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQ2hhcignLicpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9maW5pc2hlZCBzdWNjZXNzZnVsbHkgLSBjbGVhbiB1cC4KKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzQ2hhcignXG4nKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL2lmIGl0IHdlIHdlcmUgc2F2aW5nIHRvIGEgYnl0ZSBhcnJheSwgdGhlbgorICAgICAgICAgICAgLy9zZXQgdGhlIGRlc3RpbmF0aW9uIHByb3BlcnR5IHdpdGggaXRzIGNvbnRlbnRzCisgICAgICAgICAgICBpZihvdXQgaW5zdGFuY2VvZiBCeXRlQXJyYXlPdXRwdXRTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoZGVzdGluYXRpb25Qcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9ldmVyeXRoaW5nIGlzIGRvd25sb2FkZWQ7IGNsb3NlIGZpbGVzCisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIGlzPW51bGw7CisgICAgICAgICAgICBvdXQ9bnVsbDsKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICAvL2Fub3RoZXIgb3ZlcnJpZGFibGUgbm90aWZpY2F0aW9uIG1ldGhvZAorICAgICAgICAgICAgaWYgKCFvbkRvd25sb2FkRmluaXNoZWQoY29ubmVjdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vUkVGQUNUT1I6IG1vdmUgdGhpcyBkb3duIHRvIEh0dHBIZWFkPyBXaGF0IGlmIGEgcG9zdCB3YW50cworICAgICAgICAgICAgLy90byBzZXQgYSBkYXRlPworICAgICAgICAgICAgLy9pZiAoYW5kIG9ubHkgaWYpIHRoZSB1c2UgZmlsZSB0aW1lIG9wdGlvbiBpcyBzZXQsIHRoZW4gdGhlCisgICAgICAgICAgICAvL3NhdmVkIGZpbGUgbm93IGhhcyBpdHMgdGltZXN0YW1wIHNldCB0byB0aGF0IG9mIHRoZSBkb3dubG9hZGVkIGZpbGUKKyAgICAgICAgICAgIGlmICh1c2VUaW1lc3RhbXApIHsKKyAgICAgICAgICAgICAgICBsb25nIHJlbW90ZVRpbWVzdGFtcCA9IGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0ZSB0ID0gbmV3IERhdGUocmVtb3RlVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJsYXN0IG1vZGlmaWVkID0gIiArIHQudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgocmVtb3RlVGltZXN0YW1wID09IDApID8gIiAtIHVzaW5nIGN1cnJlbnQgdGltZSBpbnN0ZWFkIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZW1vdGVUaW1lc3RhbXAgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0b3VjaEZpbGUoZGVzdCwgcmVtb3RlVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGZhaWx1cmVTdHJpbmc9bnVsbDsKKyAgICAgICAgICAgIGlmKGNvbnRlbnRMZW5ndGg+LTEgJiYgYnl0ZXNSZWFkIT1jb250ZW50TGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZVN0cmluZz0iSW5jb21wbGV0ZSBkb3dubG9hZCAtRXhwZWN0ZWQgIitjb250ZW50TGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsicmVjZWl2ZWQgIitieXRlc1JlYWQrIiBieXRlcyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgIC8vZmluYWxseSBjbGVhbiBhbnl0aGluZyB1cC4KKyAgICAgICAgICAgICAgICAvL2h0dHAgcmVxdWVzdHMgaGF2ZSB0aGVpciByZXNwb25zZSBjb2RlIGNoZWNrZWQsIGFuZCBvbmx5CisgICAgICAgICAgICAgICAgLy90aG9zZSBpbiB0aGUgc3VjY2VzcyByYW5nZSBhcmUgZGVlbWVkIHN1Y2Nlc3NmdWwuCisgICAgICAgICAgICAgICAgaWYgKGh0dHBDb25uZWN0aW9uICE9IG51bGwgJiYgdXNlUmVzcG9uc2VDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXNDb2RlPWh0dHBDb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXNDb2RlIDwyMDAgfHwgc3RhdHVzQ29kZSA+Mjk5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZVN0cmluZz0iU2VydmVyIGVycm9yIGNvZGUgIitzdGF0dXNDb2RlKyIgcmVjZWl2ZWQiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy9jaGVjayBmb3IgYW4gZXJyb3IgbWVzc2FnZQorICAgICAgICAgICAgaWYoZmFpbHVyZVN0cmluZz09bnVsbCkgeworICAgICAgICAgICAgICAgIG5vdGVTdWNjZXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihmYWlsT25FcnJvcikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGZhaWx1cmVTdHJpbmcpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbG9nKGZhaWx1cmVTdHJpbmcsUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGxvZygiRXJyb3IgcGVyZm9ybWluZyAiK2dldFJlcXVlc3RNZXRob2QoKSArIiBvbiAiICsgdXJsICsKKyAgICAgICAgICAgICAgICAiIDogIitpb2UudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2hvdyBhIHByb2dyZXNzIGNoYXJhY3RlcgorICAgICAqIEB0b2RvIHRoaXMgZG9lc24ndCB3b3JrIGluIHNoZWxsIHdyYXBwZXJzCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzaG93UHJvZ3Jlc3NDaGFyKGNoYXIgYykgeworICAgICAgICBTeXN0ZW0ub3V0LndyaXRlKGMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIGZvcm0gLyByZXF1ZXN0IHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbSBUaGUgZmVhdHVyZSB0byBiZSBhZGRlZCB0byB0aGUgSHR0cFJlcXVlc3RQYXJhbWV0ZXIKKyAgICAgKiAgICAgIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtKEh0dHBSZXF1ZXN0UGFyYW1ldGVyIHBhcmFtKSB7CisgICAgICAgIHBhcmFtcy5hZGQocGFyYW0pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhbiBIVFRQIHJlcXVlc3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgZmVhdHVyZSB0byBiZSBhZGRlZCB0byB0aGUgSGVhZGVyIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihIdHRwUmVxdWVzdFBhcmFtZXRlciBoZWFkZXIpIHsKKyAgICAgICAgaGVhZGVycy5hZGQoaGVhZGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHRoaXMgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGltcGxlbWVudGF0aW9ucyB0byBzZXQgdGhlIHJlcXVlc3QgbWV0aG9kCisgICAgICogdG8gR0VULCBQT1NULCB3aGF0ZXZlciBOQjogdGhpcyBtZXRob2Qgb25seSBnZXRzIGNhbGxlZCBmb3IgYW4KKyAgICAgKiBodHRwIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1ldGhvZCBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFJlcXVlc3RNZXRob2QoKTsKKworCisgICAgLyoqCisgICAgICogZGV0ZXJtaW5lIHRoZSB0aW1lc3RhbXAgdG8gdXNlIGlmIHRoZSBmbGFnIGlzIHNldCBhbmQgdGhlIGxvY2FsCisgICAgICogZmlsZSBhY3R1YWxseSBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDAgZm9yICdubyB0aW1lc3RhbXAnLCBhIG51bWJlciBvdGhlcndoaXNlCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRUaW1lc3RhbXAoKSB7CisgICAgICAgIGxvbmcgdGltZXN0YW1wID0gMDsKKyAgICAgICAgaWYgKHVzZVRpbWVzdGFtcCAmJiBkZXN0ICE9IG51bGwgJiYgZGVzdC5leGlzdHMoKSkgeworICAgICAgICAgICAgdGltZXN0YW1wID0gZGVzdC5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRpbWVzdGFtcDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGFzayBmb3IgYXV0aGVudGljYXRpb24gZGV0YWlscy4gQW4gZW1wdHkgc3RyaW5nIG1lYW5zICdubyBhdXRoJworICAgICAqCisgICAgICogQHJldHVybiBhbiBSRkMyNjE3IGF1dGggc3RyaW5nCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU3RyaW5nKCkgeworICAgICAgICAvLyBTZXQgYXV0aG9yaXphdGlvbiBlYWRlciwgaWYgc3BlY2lmaWVkCisgICAgICAgIGlmIChhdXRoVHlwZSA9PSBBVVRIX0JBU0lDICYmIHVzZXJuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmQgPT0gbnVsbCA/ICIiIDogcGFzc3dvcmQ7CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RlU3RyID0gdXNlcm5hbWUgKyAiOiIgKyBwYXNzd29yZDsKKyAgICAgICAgICAgIEJhc2U2NEVuY29kZSBlbmNvZGVyID0gbmV3IEJhc2U2NEVuY29kZSgpOworICAgICAgICAgICAgY2hhcltdIGVuY29kZWRQYXNzID0gZW5jb2Rlci5lbmNvZGVCYXNlNjQoZW5jb2RlU3RyLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgU3RyaW5nIGF1dGhTdHIgPSAiQkFTSUMgIiArIG5ldyBTdHJpbmcoZW5jb2RlZFBhc3MpOworICAgICAgICAgICAgcmV0dXJuIGF1dGhTdHI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogdGhpcyBvdmVycmlkYWJsZSBtZXRob2QgdmVyaWZpZXMgdGhhdCBhbGwgdGhlIHBhcmFtcyBhcmUgdmFsaWQKKyAgICAgKiB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBjaGVja3MgZm9yIHJlbW90ZSB1cmwgdmFsaWRpdHkgYW5kIGlmIHRoZQorICAgICAqIGRlc3RpbmF0aW9uIGlzIG5vdCBudWxsLCB3cml0ZSBhY2Nlc3MgdG8gd2hhdCBtdXN0bnQgYmUgYSBkaXJlY3RvcnkuCisgICAgICogc3VibGNhc3NlcyBjYW4gY2FsbCB0aGUgYmFzZSBjbGFzcyBhcyB3ZWxsIGFzIGNoZWNrIHRoZWlyIG93biBkYXRhCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyBpcyBmaW5lLiBmYWxzZSBpZiB3ZSBoYXZlIGVuY291bnRlcmVkCisgICAgICogICAgICBwcm9ibGVtcyBidXQgYXJlbnQgYWxsb3dlZCB0byBmYWlsIG9uIGFuIGVycm9yLAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gb25seSB0aHJvdyB0aGlzIHdoZW4gdGhlIGZhaWxvbmVycm9yCisgICAgICogICAgICBmbGFnIGlzIHRydWUKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeUFyZ3VtZW50cygpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEJ1aWxkRXhjZXB0aW9uIHRyb3VibGUgPSBudWxsOworICAgICAgICAvL2NoZWNrIHJlbW90ZSBwYXJhbXMgLWJ1dCBvbmx5IGNyZWF0ZSBhbiBleGNlcHRpb24sIG5vdCB0aHJvdyBpdAorICAgICAgICBpZiAoZ2V0VVJMKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0YXJnZXQgVVJMIG1pc3NpbmciKTsKKyAgICAgICAgfQorICAgICAgICAvL2NoZWNrIGRlc3RpbmF0aW9uIHBhcmFtZXRlcnMgIC1idXQgb25seSBjcmVhdGUgYW4gZXhjZXB0aW9uLCBub3QgdGhyb3cgaXQKKyAgICAgICAgaWYgKGRlc3QgIT0gbnVsbCAmJiBkZXN0LmV4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAoZGVzdC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghZGVzdC5jYW5Xcml0ZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4ndCB3cml0ZSB0byAiICsgZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9jaGVjayBhdXRoIHBvbGljeQorICAgICAgICBpZihhdXRoVHlwZSE9QVVUSF9OT05FICYmIHVzZXJuYW1lPT1udWxsKSB7CisgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibm8gdXNlcm5hbWUgZGVmaW5lZCB0byB1c2Ugd2l0aCBhdXRob3Jpc2F0aW9uIik7CisgICAgICAgIH0KKyAgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIHRpbWVzdGFtcCBvZiBhIG5hbWVkIGZpbGUgdG8gYSBzcGVjaWZpZWQgdGltZS4gcHJpbnRzIGEKKyAgICAgKiB3YXJuaW5nIG9uIGphdmExLjEKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIERlc2NyaXB0aW9uIG9mIFBhcmFtZXRlcgorICAgICAqIEBwYXJhbSB0aW1lbWlsbGlzIERlc2NyaXB0aW9uIG9mIFBhcmFtZXRlcgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gVGhyb3duIGluIHVucmVjb3ZlcmFibGUgZXJyb3IuIExpa2VseQorICAgICAqICAgICAgdGhpcyBjb21lcyBmcm9tIGZpbGUgYWNjZXNzIGZhaWx1cmVzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRvdWNoRmlsZShGaWxlIGZpbGUsIGxvbmcgdGltZW1pbGxpcykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0UHJvamVjdCgpLnNldEZpbGVMYXN0TW9kaWZpZWQoZmlsZSwgdGltZW1pbGxpcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBidWlsZCBhIFVSTCBmcm9tIHRoZSBzb3VyY2UgdXJsLCBtYXliZSB3aXRoIHBhcmFtZXRlcnMgYXR0YWNoZWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gRGVzY3JpcHRpb24gb2YgdGhlIFJldHVybmVkIFZhbHVlCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBEZXNjcmlwdGlvbiBvZiBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVVJMIGJ1aWxkVVJMKCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHVybGJhc2UgPSBnZXRVUkwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChhcmVQYXJhbXNBZGRlZFRvVXJsKCkpIHsKKyAgICAgICAgICAgICAgICB1cmxiYXNlID0gcGFyYW1ldGVyaXplVVJMKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxiYXNlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBVUkwiKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogdGFrZSBhIHVybCBhbmQgYWRkIHBhcmFtZXRlcnMgdG8gaXQuIGlmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzCisgICAgICogdGhlIGJhc2UgdXJsIHN0cmluZyBpcyByZXR1cm5lZAorICAgICAqCisgICAgICogQHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGZvciBVUkwgY3JlYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIERlc2NyaXB0aW9uIG9mIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFyYW1ldGVyaXplVVJMKCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy9yZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFVSTCgpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VVJMKCkpOworICAgICAgICAvL3RoaXMgZGV2aW91cyBsaXR0bGUgbGluZSBjb2RlIHJlY29nbmlzZXMgYSBwYXJhbWV0ZXIgc3RyaW5nIGFscmVhZHkKKyAgICAgICAgLy9pbiB0aGUgc291cmNlIHVybCwgYW5kIGlmIHNvIGRvZXNudCBhZGQgYSBuZXcgb25lCisgICAgICAgIGJ1Zi5hcHBlbmQoc291cmNlLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJyk7CisgICAgICAgIEh0dHBSZXF1ZXN0UGFyYW1ldGVyIHBhcmFtOworCisgICAgICAgIC8vcnVuIHRocm91Z2ggdGhlIHBhcmFtZXRlciBsaXN0LCBlbmNvZGUgdGhlIG5hbWUvdmFsdWUgcGFpcnMgYW5kCisgICAgICAgIC8vYXBwZW5kIHRoZW0gdG8gdGhlIGxpc3QKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyYnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcmFtID0gKEh0dHBSZXF1ZXN0UGFyYW1ldGVyKSBwYXJhbXMuZ2V0KGkpOworICAgICAgICAgICAgYnVmLmFwcGVuZChwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBxdWVyeSBmb3IgdGhlIHJlcXVlc3Qgd2FudGluZyBwYXJhbWV0ZXJzIG9uIHRoZSB1cmwgZGVmYXVsdCBpcworICAgICAqIHRydWUsIHN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gY2hhbmdlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSB1cmwgc2hvdWxkIGhhdmUgcGFyYW1zIGF0dGFjaGVkLgorICAgICAqLworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJlUGFyYW1zQWRkZWRUb1VybCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBhdXRoIHBvbGljeQorICAgICAqIGEgbnVsbCByZXR1cm4gdmFsdWUgbWVhbnMgJ25vIHBvbGljeSBjaG9zZW4nCisgICAgICogQHJldHVybiBjdXJyZW50IGF1dGhvcmlzYXRpb24gc3RyYXRlZ3kgb3IgbnVsbAorICAgICAqLworCisgICAgIHByb3RlY3RlZCBIdHRwQXV0aGVudGljYXRpb25TdHJhdGVneSBnZXRBdXRoU3RyYXRlZ3koKSB7CisgICAgICAgIEh0dHBBdXRoZW50aWNhdGlvblN0cmF0ZWd5IHN0cmF0ZWd5PW51bGw7CisgICAgICAgIHN3aXRjaChhdXRoVHlwZSkgeworICAgICAgICAgICAgY2FzZSBBVVRIX0JBU0lDOgorICAgICAgICAgICAgICAgIHN0cmF0ZWd5PW5ldyBIdHRwQmFzaWNBdXRoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQVVUSF9ESUdFU1Q6CisgICAgICAgICAgICAgICAgLy9UT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQVVUSF9OT05FOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyYXRlZ3k7CisKKyAgICAgfQorCisgICAgLyoqCisgICAgICogdGhpcyBtZXRob2Qgb3BlbnMgdGhlIGNvbm5lY3Rpb24uIEl0IGNhbiByZWNvZ25pc2UgYSA0MDEgZXJyb3IgY29kZQorICAgICAqIGFuZCBpbiBkaWdlc3QgYXV0aCB3aWxsIHRoZW4gb3BlbiBhIG5ldyBjb25uZWN0aW9uIHdpdGggdGhlCisgICAgICogc3VwcGxpZWQgbm9uY2UgZW5jb2RlZC4gVGhhdCBpcyB3aHkgaXQgY2FuIHJldHVybiBhIG5ldworICAgICAqIGNvbm5lY3Rpb24gb2JqZWN0LgorICAgICAqIEB0b2RvIGhhbmRsZSBkaWdlc3QgYXV0aAorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIHdoZXJlIHRvIGNvbm5lY3QgdG8KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGJ1aWxkIHRyb3VibGUKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIElPIHRyb3VibGUKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGNvbm5lY3Rpb24uIFRoaXMgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBvbGQgb25lCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgVVJMQ29ubmVjdGlvbiBtYWtlQ29ubmVjdGlvbldpdGhBdXRoSGFuZGxpbmcoVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJDb25uZWN0aW5nIHRvICIrY29ubmVjdGlvbi50b1N0cmluZygpLFByb2plY3QuTVNHX0RFQlVHKTsgICAgCisgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworICAgICAgICBVUkxDb25uZWN0aW9uIHJldHVybkNvbm5lY3Rpb249Y29ubmVjdGlvbjsKKyAgICAgICAgbG9nKCJjb25uZWN0ZWQiLFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikgeworICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gaHR0cENvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm5lY3Rpb247CisgICAgICAgICAgICBpZihnZXRSZXNwb25zZUNvZGUoaHR0cENvbm5lY3Rpb24pPT1IdHRwVVJMQ29ubmVjdGlvbi5IVFRQX1VOQVVUSE9SSVpFRAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXV0aFR5cGU9PUFVVEhfRElHRVNUKSB7CisgICAgICAgICAgICAgICAgLy9UT0RPIGF1dGggZmFpbHVyZS4gaW4gZGlnZXN0IG1vZGUgd2UgY2FuIG1ha2UgYSBuZXcgYXV0aAorICAgICAgICAgICAgICAgIC8vZHVwbGljYXRpbmcgYWxsIHRoZSBzZXR0aW5ncyB0aGVuIHJlY29ubmVjdAorICAgICAgICAgICAgICAgIC8vYW5kIHJldHVybiBpdAorICAgICAgICAgICAgICAgIGxvZygiRGlnZXN0IGF1dGhlbnRpY2F0aW9uIG5lZWRlZCBidXQgbm90IHlldCBzdXBwb3J0ZWQiLFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXR1cm5Db25uZWN0aW9uOworICAgIH0KKworCisgICAgLyoqIAorICAgICAqIGJ5IG1ha2luZyBhIHF1ZXJ5IGZvciBhIHZhbHVlIGZyb20gdGhlIGNvbm5lY3Rpb24sIHdlIGZvcmNlIHRoZQorICAgICAqIGNsaWVudCBjb2RlIHRvIGFjdHVhbGx5IGRvIHRoZSBodHRwIHJlcXVlc3QgYW5kIGdvIGludG8gaW5wdXQgbW9kZS4KKyAgICAgKiBzbyBuZXh0IHdlIGNhbiBjaGVjayBmb3IgdHJvdWJsZS4gCisgICAgICovCisgICAgdm9pZCBwcm9iZUNvbm5lY3Rpb24gKEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgU3RyaW5nIHByb2JlPWNvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGRLZXkoMCk7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogZ2V0IGEgcmVzcG9uc2UgZnJvbSBhIGNvbm5lY3Rpb24gcmVxdWVzdC4KKyAgICAgKiBUaGlzIGNvZGUgZml4ZXMgYSBwcm9ibGVtIGZvdW5kIGluIEh0dHBVUkxDb25uZWN0aW9uLCB0aGF0CisgICAgICogYW55IGF0dGVtcHQgdG8gZ2V0IHRoZSByZXNwb25zZSBjb2RlIHdvdWxkIHRyaWdnZXIgYSBGaWxlTm90Rm91bmQKKyAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MTYwNDk5Lmh0bWwiPgorICAgICAqIEJ1Z1BhcmFkZSBkZXRhaWxzIDwvYT4KKyAgICAgKiAiSWYgdGhlIHJlcXVlc3RlZCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgZW5kcyBpbiAuaHRtbCwgLmh0bSwgLnR4dCBvciAvLCB5b3UKKyAgICAgKiAgd2lsbCBnZXQgdGhlIGVycm9yIHN0cmVhbSB3aXRoIG5vIGV4Y2VwdGlvbiB0aHJvd24uIElmIHRoZSBmaWxlIGRvZXMgbm90IGVuZAorICAgICAqICBsaWtlIGFueSBvZiB0aGVzZSB5b3UgY2FuIGNhdGNoIHRoZSBleGNlcHRpb24gYW5kIGltbWVkaWF0ZWx5IHJlcXVlc3QgaXQgYWdhaW4KKyAgICAgKiAgdG8gZ2V0IHRoZSBlcnJvciBzdHJlYW0uIFRoZSByZXNwb25zZSBjb2RlIGNhbiBiZSBvYnRhaW5lZCB3aXRoCisgICAgICogIGdldFJlc3BvbnNlQ29kZSgpLiIKKyAgICAgKiB3aGljaCBtZWFucywgdG8gcmVhbGx5IGdldCB0aGUgcmVzcG9uc2UgY29kZSB5b3UgbmVlZCB0byBhc2sgdHdpY2UuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gdGhlIGN1cnJlbnQgaHR0cCBsaW5rCisgICAgICogQHJldHVybiB3aGF0ZXZlciB3ZSBnZXQgYmFjaworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55dGhpbmcgb3RoZXIgdGhhbiBmaWxlIG5vdCBmb3VuZCBnZXRzIHRocm93biwKKyAgICAgKiBhbmQgZXZlbiBhIEZpbGVOb3RGb3VuZCBleGNlcHRpb24gaWYgdGhhdCBnZXRzIHRocm93biB0b28gbWFueSB0aW1lcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldFJlc3BvbnNlQ29kZShIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiAgeworICAgICAgICAvL2ZvcmNlIHRoZSBjcmVhdGlvbiBvZiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgIC8vKHdoaWNoIGlzIHdoYXQgSHR0cFVSTENvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCkgZG9lcyBpbnRlcm5hbGx5CisgICAgICAgIC8vdGhhdCB3YXkgdGhlIGJ1ZyBoYW5kbGVyIGNvZGUgaXMgb25seSBuZWVkZWQgb25jZS4KKworICAgICAgICAvL3Byb2JlQ29ubmVjdGlvbihjb25uZWN0aW9uKTsKKyAgICAgICAgSU9FeGNlcHRpb24gc3dhbGxvd2VkPW51bGw7CisgICAgICAgIGJvb2xlYW4gY2F1Z2h0PWZhbHNlOworICAgICAgICBpbnQgcmVzcG9uc2U9MDsKKyAgICAgICAgZm9yIChpbnQgYXR0ZW1wdHMgPSAwOyBhdHRlbXB0cyA8IDU7IGF0dGVtcHRzKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgICAgICAgICAgIGNhdWdodD10cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGxvZygiU3dhbGxvd2VkIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpbiBnZXRSZXNwb25zZUNvZGUiLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICBsb2coZXgudG9TdHJpbmcoKSxQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgc3dhbGxvd2VkPWV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCFjYXVnaHQgJiYgc3dhbGxvd2VkIT1udWxsKSB7CisgICAgICAgICAgICB0aHJvdyBzd2FsbG93ZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhbiBpbnB1dCBzdHJlYW0gZnJvbSBhIGNvbm5lY3Rpb24KKyAgICAgKiBUaGlzIGNvZGUgdHJpZXMgdG8gZml4IGEgcHJvYmxlbSBmb3VuZCBpbiBIdHRwVVJMQ29ubmVjdGlvbiwgdGhhdAorICAgICAqIGFueSBhdHRlbXB0IHRvIGdldCB0aGUgcmVzcG9uc2UgY29kZSB3b3VsZCB0cmlnZ2VyIGEgRmlsZU5vdEZvdW5kCisgICAgICogQnVnUGFyYWRlIElEIDQxNjA0OTkgOgorICAgICAqIDxibG9ja3F1b3RlPgorICAgICAqICJJZiB0aGUgcmVxdWVzdGVkIGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBlbmRzIGluIC5odG1sLCAuaHRtLCAudHh0IG9yIC8sIHlvdQorICAgICAqICB3aWxsIGdldCB0aGUgZXJyb3Igc3RyZWFtIHdpdGggbm8gZXhjZXB0aW9uIHRocm93bi4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZW5kCisgICAgICogIGxpa2UgYW55IG9mIHRoZXNlIHlvdSBjYW4gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgaW1tZWRpYXRlbHkgcmVxdWVzdCBpdCBhZ2FpbgorICAgICAqICB0byBnZXQgdGhlIGVycm9yIHN0cmVhbS4gVGhlIHJlc3BvbnNlIGNvZGUgY2FuIGJlIG9idGFpbmVkIHdpdGgKKyAgICAgKiAgZ2V0UmVzcG9uc2VDb2RlKCkuIgorICAgICAqIDxibG9ja3F1b3RlPgorICAgICAqIHdoaWNoIG1lYW5zLCB0byByZWFsbHkgZ2V0IHRoZSByZXNwb25zZSBjb2RlIHlvdSBuZWVkIHRvIGFzayB0d2ljZS4gTW9yZSB0byB0aGUgcG9pbnQKKyAgICAgKiB0aGlzIGhhbmRsaW5nIGlzIG5vdCBjb25zaXN0ZW50IGFjcm9zcyBKVk1zOiBvbiBqYXZhIDEuMyB5b3UgY2FuIGFzayBhcyBvZnRlbiBhcyB5b3UgbGlrZQorICAgICAqIGJ1dCB5b3UgYXJlIG5vdCBnb2luZyB0byBnZXQgdGhlIGlucHV0IHN0cmVhbSBvbiBhIEpTUCBwYWdlIHdoZW4gaXQgaGFzIHNvbWUgNTAwIGNsYXNzIGVycm9yLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBjdXJyZW50IGxpbmsKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnl0aGluZyBvdGhlciB0aGFuIGZpbGUgbm90IGZvdW5kIGdldHMgdGhyb3duLAorICAgICAqIGFuZCBldmVuIGEgRmlsZU5vdEZvdW5kIGV4Y2VwdGlvbiBpZiB0aGF0IGdldHMgdGhyb3duIHRvbyBtYW55IHRpbWVzLgorICAgICAqLworCisgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiAgeworICAgICAgICBJT0V4Y2VwdGlvbiBzd2FsbG93ZWQ9bnVsbDsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5zdHJlYW09bnVsbDsKKyAgICAgICAgZm9yIChpbnQgYXR0ZW1wdHMgPSAwOyBhdHRlbXB0cyA8IDU7IGF0dGVtcHRzKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5zdHJlYW0gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbG9nKCJTd2FsbG93ZWQgSU8gZXhjZXB0aW9uIGluIGdldElucHV0U3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgbG9nKGV4LnRvU3RyaW5nKCksUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIHN3YWxsb3dlZD1leDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihpbnN0cmVhbT09bnVsbCAmJiBzd2FsbG93ZWQhPW51bGwpIHsKKyAgICAgICAgICAgIHRocm93IHN3YWxsb3dlZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdHJlYW07CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIHRoaXMgbWV0aG9kIGlzIGludGVkZWQgZm9yIG92ZXJyaWRpbmcuIGl0IGlzIGNhbGxlZCB3aGVuIGNvbm5lY3RpbmcKKyAgICAgKiB0byBhIFVSTCwgYW5kIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGp1c3QgY2FsbHMgY29ubmVjdCgpIG9uIHRoZQorICAgICAqIHBhcmFtZXRlci4gYW55IHN1YmNsYXNzIHRoYXQgd2FudHMgdG8gcHVtcCBpdHMgb3duIGRhdGFzdHJlYW0gdXAKKyAgICAgKiAobGlrZSBwb3N0KSBtdXN0IG92ZXJyaWRlIHRoaXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIHdoZXJlIHRvIGNvbm5lY3QgdG8KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGJ1aWxkIHRyb3VibGUKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIElPIHRyb3VibGUKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBVUkxDb25uZWN0aW9uIGRvQ29ubmVjdChVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24pCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbWFrZUNvbm5lY3Rpb25XaXRoQXV0aEhhbmRsaW5nKGNvbm5lY3Rpb24pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdGhpcyBpcyBhIG1ldGhvZCBmb3IgdXBsb2FkIGNlbnRyaWMgcG9zdC1saWtlIHJlcXVlc3RzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiB3aG8gd2UgdGFsayB0bworICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSBEZXNjcmlwdGlvbiBvZiBQYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBEZXNjcmlwdGlvbiBvZiBQYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gY29udGVudCBEZXNjcmlwdGlvbiBvZiBQYXJhbWV0ZXIKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIElPCisgICAgICovCisgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gZG9Db25uZWN0V2l0aFVwbG9hZChVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24sCisgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUsIGludCBjb250ZW50TGVuZ3RoLAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gY29udGVudCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBsb2coInVwbG9hZGluZyAiICsgY29udGVudExlbmd0aCArICIgYnl0ZXMgb2YgdHlwZSAiICsgY29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIC8vdGVsbCB0aGUgY29ubmVjdGlvbiB3ZSBhcmUgaW4gb3V0cHV0IG1vZGUKKyAgICAgICAgY29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKKworCisgICAgICAgIC8vIFNldCBjb250ZW50IGxlbmd0aCBhbmQgdHlwZSBoZWFkZXJzCisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LUxlbmd0aCIsIFN0cmluZy52YWx1ZU9mKGNvbnRlbnRMZW5ndGgpKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgLy90b2RvOiBhZGQgYXV0aCBoYW5kbGluZworICAgICAgICAvL2Nvbm5lY3Rpb249bWFrZUNvbm5lY3Rpb25XaXRoQXV0aEhhbmRsaW5nKGNvbm5lY3Rpb24pOworICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIHRvU2VydmVyID0gY29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICAvL2NyZWF0ZSBhIGJ1ZmZlciB3aGljaCBpcyB0aGUgc21hbGxlciBvZgorICAgICAgICAvL3RoZSBjb250ZW50IGxlbmd0aCBhbmQgdGhlIGJsb2NrIHNpemUgKGluIEtCKQorICAgICAgICBpbnQgYnVmZmVyc2l6ZT1ibG9ja1NpemUqMTAyNDsKKyAgICAgICAgaWYoY29udGVudExlbmd0aDxidWZmZXJzaXplKQorICAgICAgICAgICAgYnVmZmVyc2l6ZT1jb250ZW50TGVuZ3RoOworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyc2l6ZV07CisgICAgICAgIGludCByZW1haW5pbmcgPSBjb250ZW50TGVuZ3RoOworCisgICAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICBpbnQgcmVhZCA9IGNvbnRlbnQucmVhZChidWZmZXIpOworICAgICAgICAgICAgbG9nKCJibG9jayBvZiAiK3JlYWQsUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgdG9TZXJ2ZXIud3JpdGUoYnVmZmVyLCAwLCByZWFkKTsKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSByZWFkOworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3NDaGFyKCdeJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIHNob3dQcm9ncmVzc0NoYXIoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJ1cGxvYWQgY29tcGxldGVkIixQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIGludGVybmFsIGV2ZW50IGhhbmRsZXIgY2FsbGVkIGFmdGVyIGEgY29ubmVjdCBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICogb3IgcmV0dXJuIGZhbHNlIGZvciBhbiBpbW1lZGlhdGUgZXhpdCBmcm9tIHRoZSBwcm9jZXNzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiB0aGUgbm93IG9wZW4gY29ubmVjdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXhlY3V0aW9uIGlzIHRvIGNvbnRpbnVlCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBEZXNjcmlwdGlvbiBvZiBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBvbkNvbm5lY3RlZChVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24pCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogaW50ZXJuYWwgZXZlbnQgaGFuZGxlciBjYWxsZWQgYWZ0ZXIgdGhlIGRvd25sb2FkIGlzIGNvbXBsZXRlIHRoZQorICAgICAqIGNvZGUgY2FuIHN0aWxsIGJhaWwgb3V0IGF0IHRoaXMgcG9pbnQsIGFuZCB0aGUgY29ubmVjdGlvbiBtYXkgY29udGFpbgorICAgICAqIGhlYWRlcnMgb2YgaW50ZXJlc3QuIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gb3IgcmV0dXJuIGZhbHNlIGZvcgorICAgICAqIGFuIGltbWVkaWF0ZSBleGl0IGZyb20gdGhlIHByb2Nlc3MKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIHRoZSBub3cgb3BlbiBjb25uZWN0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBleGVjdXRpb24gaXMgdG8gY29udGludWUKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIERlc2NyaXB0aW9uIG9mIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG9uRG93bmxvYWRGaW5pc2hlZChVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24pCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgZm9yICJhdXRoVHlwZSIgd2l0aCB0aGUgdmFsdWUgImJhc2ljIiAobm90ZSwKKyAgICAgKiBldmVudHVhbGx5IHdlIGNhbiBhZGQgImRpZ2VzdCIgYXV0aGVudGljYXRpb24pCisgICAgICoKKyAgICAgKiBAY3JlYXRlZCBNYXJjaCAxNywgMjAwMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXV0aE1ldGhvZFR5cGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBhdXRob3Jpc2F0aW9uIHN1cHBvcnRlZAorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBWYWx1ZXMgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyJub25lIiwgImJhc2ljIiwiZGlnZXN0In07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogbG9va3VwIGZyb20gdmFsdWUgdG8gYSBudW1lcmljIHZhbHVlLiBkZWZhdWx0cyB0byAwLCBiYXNpYy1hdXRoCisgICAgICAgICAqIEBwYXJhbSBjaG9pY2Ugc3RyaW5nIHNlbGVjdGlvbgorICAgICAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIHZhbHVlCisgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgIG1hcFZhbHVlVG9OdW1iZXIoKSB7CisgICAgICAgICAgICBTdHJpbmcgY2hvaWNlPWdldFZhbHVlKCk7CisgICAgICAgICAgICBpbnQgdmFsdWU9MDsKKyAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcz1nZXRWYWx1ZXMoKTsKKyAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8dmFsdWVzLmxlbmd0aDtpKyspIHsKKyAgICAgICAgICAgICAgICBpZih2YWx1ZXNbaV0uZXF1YWxzSWdub3JlQ2FzZShjaG9pY2UpKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZT1pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL051bGxPdXRwdXRTdHJlYW0uamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvTnVsbE91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NjU4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL051bGxPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaHR0cDsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIHNpbXBsZSBvdXRwdXQgc3RyZWFtIHdoaWNoIGRpc2NhcmRzIGFsbCB3cml0ZSByZXF1ZXN0cyB0aGlzIHNob3VsZAorICogcmVhbGx5IGJlIHBhcnQgb2YgamF2YS5pbywgYXMgaXQgaXMgc3BvcmFkaWNhbGx5IGludmFsdWFibGUKKyAqCisgKiBAY3JlYXRlZCBNYXJjaCAxNywgMjAwMQorICovCitwdWJsaWMgY2xhc3MgTnVsbE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKyAgICAvKioKKyAgICAgKiBkaXNjYXJkIGFsbCBpbmNvbWluZyBieXRlcworICAgICAqCisgICAgICogQHBhcmFtIGIgYnl0ZSB0byB3cml0ZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gbmV2ZXIgdGhyb3dhYmxlIGluIHRoaXMgc3ViY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGRpc2NhcmQgYWxsIGluY29taW5nIGJ5dGVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiAgYnl0ZSBhcnJheQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gbmV2ZXIgdGhyb3dhYmxlIGluIHRoaXMgc3ViY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGRpc2NhcmQgYWxsIGluY29taW5nIGJ5dGVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiAgYnl0ZSBhcnJheQorICAgICAqIEBwYXJhbSBvZmYgc3RhcnRpbmcgb2Zmc2V0CisgICAgICogQHBhcmFtIGxlbiBsZW5ndGggdG8gd3JpdGUKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIG5ldmVyIHRocm93YWJsZSBpbiB0aGlzIHN1YmNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsCisgICAgICAgICAgICBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL1NldFByb3h5LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL1NldFByb3h5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiNGEzMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvU2V0UHJveHkuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKKworLyoqCisgKiBwcm94eSBkZWZpbml0aW9uIHRhc2suIFRoaXMgYWxsb3dzIGFsbCB3ZWIgdGFza3MgaW4gdGhlIGJ1aWxkIGZpbGUKKyAqIGV4ZWN1dGVkIGFmdGVyIHRoaXMgdGFzayB0byBhY2Nlc3MgdGhlIHdlYiB0aHJvdWdoIGEgcHJveHkgc2VydmVyCisgKgorICogQGNyZWF0ZWQgTWFyY2ggMTcsIDIwMDEKKyAqLworCitwdWJsaWMgY2xhc3MgU2V0UHJveHkgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8qKgorICAgICAqIHByb3h5IGRldGFpbHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3h5SG9zdCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIHByb3h5IHBvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHByb3h5UG9ydCA9IDgwOworCisgICAgLyoqCisgICAgICogc29ja3MgaG9zdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzb2Nrc1Byb3h5SG9zdCA9IG51bGw7CisgICAgLyoqCisgICAgICogc29ja3MgcHJveHkgcG9ydC4gMTA4MCBpcyB0aGUgZGVmYXVsdAorICAgICAqLworICAgIHByaXZhdGUgaW50IHNvY2tzUHJveHlQb3J0ID0gMTA4MDsKKworCisKKyAgICAvKioKKyAgICAgKiBzZXQgYSBwcm94eSBob3N0LiB0aGUgcG9ydCBzaG91bGQgYmUgZGVmaW5lZCB0b28KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0bmFtZSB0aGUgbmV3IHByb3h5IGhvc3RuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJveHlIb3N0KFN0cmluZyBob3N0bmFtZSkgeworICAgICAgICBwcm94eUhvc3QgPSBob3N0bmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHNldCB0aGUgcHJveHkgcG9ydCBudW1iZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydCBwb3J0IG51bWJlciBvZiB0aGUgcHJveHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm94eVBvcnQoaW50IHBvcnQpIHsKKyAgICAgICAgcHJveHlQb3J0ID0gcG9ydDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGFjY2Vzc29yIHRvIHByb3h5IGhvc3RuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBob3N0bmFtZSBvciBudWxsCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3h5SG9zdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb3h5SG9zdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGFjY2Vzc29yIHRvIHByb3h5IGhvc3RuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwb3J0IG51bWJlcgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRQcm94eVBvcnQoKSB7CisgICAgICAgIHJldHVybiBwcm94eVBvcnQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFNvY2tzUHJveHlIb3N0IGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHBhcmFtIGhvc3QgVGhlIG5ldyBTb2Nrc1Byb3h5SG9zdCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvY2tzUHJveHlIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuc29ja3NQcm94eUhvc3QgPSBob3N0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTb2Nrc1Byb3h5UG9ydCBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0IFRoZSBuZXcgU29ja3NQcm94eVBvcnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb2Nrc1Byb3h5UG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnNvY2tzUHJveHlQb3J0ID0gcG9ydDsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogaWYgdGhlIHByb3h5IHBvcnQgYW5kIGhvc3Qgc2V0dGluZ3MgYXJlIG5vdCBudWxsLCB0aGVuIHRoZSBzZXR0aW5ncworICAgICAqIGdldCBhcHBsaWVkIHRoZXNlIHNldHRpbmdzIGxhc3QgYmV5b25kIHRoZSBsaWZlIG9mIHRoZSBvYmplY3QgYW5kCisgICAgICogYXBwbHkgdG8gYWxsIG5ldHdvcmsgY29ubmVjdGlvbnMKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2V0dGluZ3Mgd2VyZSBhcHBsaWVkCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBhcHBseVdlYlByb3h5U2V0dGluZ3MoKSB7CisgICAgICAgIGJvb2xlYW4gc2V0dGluZ3NDaGFuZ2VkPWZhbHNlOworICAgICAgICBQcm9wZXJ0aWVzIHByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOworICAgICAgICBpZiAoZ2V0UHJveHlIb3N0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJTZXR0aW5nIHByb3h5IHRvICIgKyBnZXRQcm94eUhvc3QoKSArICI6IiArIGdldFByb3h5UG9ydCgpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHByb3AucHV0KCJodHRwLnByb3h5SG9zdCIsIGdldFByb3h5SG9zdCgpKTsKKyAgICAgICAgICAgIHByb3AucHV0KCJodHRwLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKGdldFByb3h5UG9ydCgpKSk7CisgICAgICAgICAgICBwcm9wLnB1dCgiaHR0cHMucHJveHlIb3N0IiwgZ2V0UHJveHlIb3N0KCkpOworICAgICAgICAgICAgcHJvcC5wdXQoImh0dHBzLnByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKGdldFByb3h5UG9ydCgpKSk7CisgICAgICAgICAgICBwcm9wLnB1dCgiZnRwLnByb3h5SG9zdCIsIGdldFByb3h5SG9zdCgpKTsKKyAgICAgICAgICAgIHByb3AucHV0KCJmdHAucHJveHlQb3J0IiwgU3RyaW5nLnZhbHVlT2YoZ2V0UHJveHlQb3J0KCkpKTsKKyAgICAgICAgICAgIHNldHRpbmdzQ2hhbmdlZD10cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy9zb2NrcworICAgICAgICBpZiAoc29ja3NQcm94eUhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJTZXR0aW5nIHByb3h5IHRvICIgKyBnZXRQcm94eUhvc3QoKSArICI6IiArIGdldFByb3h5UG9ydCgpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHByb3AucHV0KCJzb2Nrc1Byb3h5SG9zdCIsIHNvY2tzUHJveHlIb3N0KTsKKyAgICAgICAgICAgIHByb3AucHV0KCJzb2Nrc1Byb3h5UG9ydCIsIEludGVnZXIudG9TdHJpbmcoc29ja3NQcm94eVBvcnQpKTsKKyAgICAgICAgICAgIHNldHRpbmdzQ2hhbmdlZD10cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy9mb3IgSmF2YTEuMSB3ZSBuZWVkIHRvIHRlbGwgdGhlIHN5c3RlbSB0aGF0IHRoZSBzZXR0aW5ncyBhcmUgbmV3CisgICAgICAgIGlmKHNldHRpbmdzQ2hhbmdlZCAmJiBwcm9qZWN0LmdldEphdmFWZXJzaW9uKCkgPT0gUHJvamVjdC5KQVZBXzFfMSkgeworICAgICAgICAgICAgcHJvcC5wdXQoImh0dHAucHJveHlTZXQiLCAidHJ1ZSIpOworICAgICAgICAgICAgc3VuLm5ldC53d3cuaHR0cC5IdHRwQ2xpZW50LnJlc2V0UHJvcGVydGllcygpOworICAgICAgICB9CisgICAgICAgIGxlZ2FjeVJlc2V0UHJveHlTZXR0aW5nc0NhbGwoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIG1ha2UgYSBjYWxsIHRvIHN1bi5uZXQud3d3Lmh0dHAuSHR0cENsaWVudC5yZXNldFByb3BlcnRpZXMoKTsKKyAgICAgKiB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBqYXZhIDEuMTsgcmVmbGVjdGlvbiBpcyB1c2VkIHRvIHN0b3AgdGhlIGNvbXBpbGVyCisgICAgICogd2hpbmluZywgYW5kIGluIGNhc2UgY2xlYW5yb29tIEpWTXMgZG9udCBoYXZlIHRoZSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIERlc2NyaXB0aW9uIG9mIHRoZSBSZXR1cm5lZCBWYWx1ZQorICAgICAqIEByZXR1cm5zCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsZWdhY3lSZXNldFByb3h5U2V0dGluZ3NDYWxsKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgYyA9IENsYXNzLmZvck5hbWUoInN1bi5uZXQud3d3Lmh0dHAuSHR0cENsaWVudCIpOworICAgICAgICAgICAgTWV0aG9kIHJlc2V0ID0gYy5nZXRNZXRob2QoInJlc2V0UHJvcGVydGllcyIsIG51bGwpOworICAgICAgICAgICAgcmVzZXQuaW52b2tlKG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgd29yay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gVGhyb3duIGluIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcGx5V2ViUHJveHlTZXR0aW5ncygpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL2hvc3RuYW1lLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2h0dHB0YXNrcy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9odHRwL2hvc3RuYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyZTc2NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvaHR0cHRhc2tzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2h0dHAvaG9zdG5hbWUuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqICBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiAgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICBkaXN0cmlidXRpb24uCisgKgorICogIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiAgNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiAgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqICBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqICBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqICBTVUNIIERBTUFHRS4KKyAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5odHRwOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKKworLyoqCisgKiB0cml2aWFsIHRhc2sgdG8gZ2V0IHRoZSBob3N0bmFtZSBvZiBhIGJveDsgYXMgSVBhZGRyLCBob3N0bmFtZSwgb3IKKyAqIGZ1bGxuYW1lLgorICoKKyAqIEBjcmVhdGVkIDA3IEphbnVhcnkgMjAwMgorICovCisKK3B1YmxpYyBjbGFzcyBob3N0bmFtZSBleHRlbmRzIFRhc2sgeworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgdGhlIEZpZWxkCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgRmllbGQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmFpbG9uZXJyb3IgPSB0cnVlOworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgdGhlIEZpZWxkCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFkZHJlc3MgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgRmFpbE9uRXJyb3IgYXR0cmlidXRlIG9mIHRoZSBIb3N0bmFtZSBvYmplY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWlsb25lcnJvciBUaGUgbmV3IEZhaWxPbkVycm9yIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbE9uRXJyb3IoYm9vbGVhbiBmYWlsb25lcnJvcikgeworICAgICAgICB0aGlzLmZhaWxvbmVycm9yID0gZmFpbG9uZXJyb3I7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBBZGRyZXNzIGF0dHJpYnV0ZSBvZiB0aGUgSG9zdG5hbWUgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgbmV3IEFkZHJlc3MgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKGJvb2xlYW4gYWRkcmVzcykgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgd29yay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gVGhyb3duIGluIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmKHByb3BlcnR5PT1udWxsKSB7CisgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvcGVydHkgYXR0cmlidXRlIG11c3QgYmUgZGVmaW5lZCIpOyAKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVzdWx0OworICAgICAgICBTdHJpbmcgZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0QWRkcmVzcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0SG9zdG5hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHJlc3VsdCk7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJyZXNvbHZpbmcgaG9zdG5hbWUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygiZmFpbGVkIHRvIHJlc29sdmUgbG9jYWwgaG9zdG5hbWUiLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBBZGRyZXNzIGF0dHJpYnV0ZSBvZiB0aGUgSG9zdG5hbWUgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBBZGRyZXNzIHZhbHVlCisgICAgICogQGV4Y2VwdGlvbiBTZWN1cml0eUV4Y2VwdGlvbiBEZXNjcmlwdGlvbiBvZiBFeGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFVua25vd25Ib3N0RXhjZXB0aW9uIERlc2NyaXB0aW9uIG9mIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzcygpCisgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgVW5rbm93bkhvc3RFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0TG9jYWxIb3N0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBIb3N0bmFtZSBhdHRyaWJ1dGUgb2YgdGhlIEhvc3RuYW1lIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgSG9zdG5hbWUgdmFsdWUKKyAgICAgKiBAZXhjZXB0aW9uIFNlY3VyaXR5RXhjZXB0aW9uIERlc2NyaXB0aW9uIG9mIEV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gVW5rbm93bkhvc3RFeGNlcHRpb24gRGVzY3JpcHRpb24gb2YgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0bmFtZSgpCisgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgVW5rbm93bkhvc3RFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0TG9jYWxIb3N0QWRkcmVzcygpLmdldEhvc3ROYW1lKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBMb2NhbEhvc3RBZGRyZXNzIGF0dHJpYnV0ZSBvZiB0aGUgSG9zdG5hbWUgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBMb2NhbEhvc3RBZGRyZXNzIHZhbHVlCisgICAgICogQGV4Y2VwdGlvbiBVbmtub3duSG9zdEV4Y2VwdGlvbiBEZXNjcmlwdGlvbiBvZiBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0TG9jYWxIb3N0QWRkcmVzcygpCisgICAgICAgIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9pbnB1dC9SRUFETUUgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2lucHV0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzQ1ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9pbnB1dC9SRUFETUUKQEAgLTAsMCArMSw4IEBACitUaGUgaW5wdXQgcHJvcG9zYWwgaGFzIGJlZW4gYWNjZXB0ZWQgYXMgcGFydCBvZiBtYWluIEFudCBhbmQgaGFzIGJlZW4KK21lcmdlZCB3aXRoIHRoZSBtYWluIGNvZGUgdHJlZSBvbiAyMDAyLTA0LTIyLgorCitUaGUgb25seSBwYXJ0IHRoYXQgZGlkbid0IGdldCBtb3ZlZCBvdmVyIHdhcyBTd2luZ0lucHV0SGFuZGxlciB0aGF0CitoYXMgbmV2ZXIgYmVlbiBtb3JlIHRoYW4gYSBwcm9vZiBvZiBjb25jZXB0IC0gaWYgeW91IHJlYWxseSB3YW50IHRvCitzZWUgaXQsIHlvdSBjYW4gZmluZCBpdCBpbiBDVlMncyBBdHRpYzoKKworPGh0dHA6Ly9jdnMuYXBhY2hlLm9yZy92aWV3Y3ZzL2pha2FydGEtYW50L3Byb3Bvc2FsL3NhbmRib3gvaW5wdXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvQXR0aWMvU3dpbmdJbnB1dEhhbmRsZXIuamF2YT4KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvYnVpbGQuYmF0IGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWU5ZmZjMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvYnVpbGQuYmF0CkBAIC0wLDAgKzEsMzAgQEAKK0BlY2hvIG9mZgorCitzZXQgT0xEQ0xBU1NQQVRIPSVDTEFTU1BBVEglCitzZXQgUkVBTF9BTlRfSE9NRT0lQU5UX0hPTUUlCitzZXQgQU5UX0hPTUU9Ym9vdHN0cmFwCitpZiBleGlzdCBib290c3RyYXBcbGliXGFudC5qYXIgaWYgZXhpc3QgYm9vdHN0cmFwXGJpblxhbnQuYmF0IGlmIGV4aXN0IGJvb3RzdHJhcFxiaW5cbGNwLmJhdCBpZiBleGlzdCBib290c3RyYXBcYmluXGFudFJ1bi5iYXQgZ290byBydW5BbnQKK2NhbGwgYm9vdHN0cmFwLmJhdAoraWYgZXhpc3QgYm9vdHN0cmFwXGxpYlxhbnQuamFyIGlmIGV4aXN0IGJvb3RzdHJhcFxiaW5cYW50LmJhdCBpZiBleGlzdCBib290c3RyYXBcYmluXGxjcC5iYXQgaWYgZXhpc3QgYm9vdHN0cmFwXGJpblxhbnRSdW4uYmF0IGdvdG8gcnVuQW50CitlY2hvIEJvb3RzdHJhcCBGQUlMRUQKK2dvdG8gY2xlYW51cAorCis6cnVuQW50CitzZXQgTE9DQUxDTEFTU1BBVEg9bGliXGNyaW1zb24uamFyO2Jvb3RzdHJhcFxsaWJcYW50LmphcgorZm9yICUlaSBpbiAobGliXG9wdGlvbmFsXCouamFyKSBkbyBjYWxsIGJvb3RzdHJhcFxiaW5cbGNwLmJhdCAlJWkKK3NldCBDTEFTU1BBVEg9bGliXG9wdGlvbmFsXHhhbGFuajFjb21wYXQuamFyOyVMT0NBTENMQVNTUEFUSCU7JUNMQVNTUEFUSCUKK3NldCBMT0NBTENMQVNTUEFUSD0KKworaWYgbm90ICIlUkVBTF9BTlRfSE9NRSUiID09ICIiIGdvdG8gaW5zdGFsbF9hbnQKK2NhbGwgYm9vdHN0cmFwXGJpblxhbnQuYmF0IC1lbWFjcyAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQorZ290byBjbGVhbnVwCisKKzppbnN0YWxsX2FudAorY2FsbCBib290c3RyYXBcYmluXGFudC5iYXQgLWVtYWNzIC1EYW50Lmluc3RhbGw9IiVSRUFMX0FOVF9IT01FJSIgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKKworcmVtIGNsZWFuIHVwCis6Y2xlYW51cAorc2V0IEFOVF9IT01FPSVSRUFMX0FOVF9IT01FJQorc2V0IFJFQUxfQU5UX0hPTUU9CitzZXQgQ0xBU1NQQVRIPSVPTERDTEFTU1BBVEglCitzZXQgT0xEQ0xBU1NQQVRIPQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9idWlsZC5zaCBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1YTdlNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvYnVpbGQuc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCisKK2N5Z3dpbj1mYWxzZTsKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiopIGN5Z3dpbj10cnVlIDs7Citlc2FjCisKK1BXRD1gcHdkYAoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBQV0Q9YGN5Z3BhdGggLS13aW5kb3dzICIkUFdEImAKK2ZpCisKK2NkIC4uLy4uLy4uCisvYmluL3NoIC4vYnVpbGQuc2ggLWJ1aWxkZmlsZSAkUFdEL2J1aWxkLnhtbCAkKgorY2QgJFBXRAorCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L2J1aWxkLnhtbCBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjE3OGIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L2J1aWxkLnhtbApAQCAtMCwwICsxLDc5IEBACis8cHJvamVjdCBuYW1lPSJqdW5pdC1wcm9wb3NhbCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iY29tcGlsZSI+CisgIDxwcm9wZXJ0eSBmaWxlPSIuYW50LnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS8uYW50LnByb3BlcnRpZXMiLz4KKyAgCisgIDwhLS1wcm9wZXJ0eSBuYW1lPSJidWlsZC5zeXNjbGFzc3BhdGgiIHZhbHVlPSJpZ25vcmUiLy0tPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJqaWtlcyIvPgorICA8IS0tcHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIuZW1hY3MiIHZhbHVlPSJvbiIvLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlci5wZWRhbnRpYyIgdmFsdWU9InRydWUiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyLmRlcGVuZCIgdmFsdWU9InRydWUiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQiIHZhbHVlPSJ0cnVlIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImRlYnVnIiB2YWx1ZT0ib24iLz4KKyAgPHByb3BlcnR5IG5hbWU9Im9wdGltaXplIiB2YWx1ZT0ib2ZmIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZXByZWNhdGlvbiIgdmFsdWU9Im9uIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIHZhbHVlPSIke2J1aWxkLmRpcn0vbGliIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5zcmMiIHZhbHVlPSIke2J1aWxkLmRpcn0vc3JjIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KKyAgCisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2FzZXMuY2xhc3NlcyIgdmFsdWU9IiR7YnVpbGQuZGlyfS90ZXN0Y2FzZXMiLz4KKworICA8cHJvcGVydHkgbmFtZT0iamF2YS5kaXIiIHZhbHVlPSJzcmMvamF2YSIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdHMuZGlyIiB2YWx1ZT0ic3JjL3Rlc3RjYXNlcyIvPgorICA8cHJvcGVydHkgbmFtZT0iYW50LmJhc2UuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4iLz4KKyAgPHByb3BlcnR5IG5hbWU9ImFudC5saWIuZGlyIiBsb2NhdGlvbj0iJHthbnQuYmFzZS5kaXJ9L2xpYiIvPgorICA8cHJvcGVydHkgbmFtZT0ibGliLmRpciIgbG9jYXRpb249ImxpYiIvPgorICA8cHJvcGVydHkgbmFtZT0iYm9vdHN0cmFwLmRpciIgbG9jYXRpb249IiR7YW50LmJhc2UuZGlyfS9ib290c3RyYXAiLz4KKyAgCisgIDxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkLmNsYXNzZXN9IiAvPgorICAgIDxmaWxlc2V0IGRpcj0iJHthbnQubGliLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmphciIvPgorICAgIDxmaWxlc2V0IGRpcj0iJHtib290c3RyYXAuZGlyfS9saWIiIGluY2x1ZGVzPSJhbnQuamFyIi8+CisgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgPC9wYXRoPgorCisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY29tcGlsZSB0aGUgc291cmNlIGNvZGUiPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMvbWFpbiIKKyAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgICBvcHRpbWl6ZT0iJHtvcHRpbWl6ZX0iCisgICAgICAgICAgIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgaW5jbHVkZWFudHJ1bnRpbWU9Im5vIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InByb2plY3QuY2xhc3MucGF0aCIvPgorICAgIDwvamF2YWM+CisgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21waWxlLXRlc3RzIi8+CisgIDwvdGFyZ2V0PgorICAKKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY2xlYW5zIHVwIGJ1aWxkIGFuZCBkaXN0IGRpcmVjdG9yaWVzIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgorICAgIDxkZWxldGU+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqKi8qLmJhayIgZGVmYXVsdGV4Y2x1ZGVzPSJubyIvPgorICAgIDwvZGVsZXRlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdHMiPgorICAgIDxta2RpciBkaXI9IiR7dGVzdGNhc2VzLmNsYXNzZXN9Ii8+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3Rlc3RjYXNlcyIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt0ZXN0Y2FzZXMuY2xhc3Nlc30iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICAgb3B0aW1pemU9IiR7b3B0aW1pemV9IgorICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtkZXByZWNhdGlvbn0iCisgICAgICAgICAgIGluY2x1ZGVhbnRydW50aW1lPSJubyI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiLz4KKyAgICA8L2phdmFjPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0icnVuLWFudC10ZXN0cyIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgIDwhLS1hbnQgZGlyPSIke2FudC5iYXNlLmRpcn0iIHRhcmdldD0iYnVpbGQiIGluaGVyaXRhbGw9ImZhbHNlIi8+CisgICAgIDxhbnQgZGlyPSIke2FudC5iYXNlLmRpcn0iIHRhcmdldD0iY29tcGlsZS10ZXN0cyIgaW5oZXJpdGFsbD0iZmFsc2UiLy0tPgorICAgICA8YW50IGFudGZpbGU9InJqdW5pdC1hbnQtdGVzdHMueG1sIi8+CisgIDwvdGFyZ2V0PgorICAKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L2xpYi9leGNhbGlidXItaTE4bi0xLjAuamFyIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9saWIvZXhjYWxpYnVyLWkxOG4tMS4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzUzM2I1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9saWIvZXhjYWxpYnVyLWkxOG4tMS4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3JqdW5pdC1hbnQtdGVzdHMueG1sIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9yanVuaXQtYW50LXRlc3RzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk4NTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9yanVuaXQtYW50LXRlc3RzLnhtbApAQCAtMCwwICsxLDM0IEBACis8cHJvamVjdCBuYW1lPSJyanVuaXQtYW50LXRlc3RzIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJhbnQtdGVzdHMiPiAgCisgIDwhLS0KKyAgICBydW4gYW50IHRlc3RzLiBUaGlzIGlzIHVudXNhYmxlIGlmIG5vdCBydW5uaW5nIGl0CisgICAgdmlhIGJ1aWxkLnhtbCBhcyBpdCBzaG91bGQgaW5oZXJpdHMgcHJvcGVydGllcworICAgIC0tPgorICA8dGFza2RlZiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5SSlVuaXRUYXNrIgorICAgIG5hbWU9InJqdW5pdCI+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIvPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHtqYXZhLmRpcn0iLz4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICA8L3Rhc2tkZWY+CisgIDx0YXJnZXQgbmFtZT0iYW50LXRlc3RzIj4KKyAgICAgIDxyanVuaXQ+CisgICAgICAgICAgPHNlcnZlciBwb3J0PSI2NjY2Ij4KKyAgICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJicmllZiI+CisgICAgICAgICAgICAgICAgICA8IS0tcGFyYW0gbmFtZT0iZmlsZSIgbG9jYXRpb249Imp1bml0LXRlc3QtbG9nLnR4dCIvLS0+CisgICAgICAgICAgICAgIDwvZm9ybWF0dGVyPgorICAgICAgICAgIDwvc2VydmVyPgorICAgICAgICAgIDxjbGllbnQgaG9zdD0iMTI3LjAuMC4xIiAgcG9ydD0iNjY2NiI+CisgICAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2FudC5saWIuZGlyfSIgaW5jbHVkZXM9IioqLyouamFyIi8+CisgICAgICAgICAgICAgICAgPHBhdGggbG9jYXRpb249IiR7YW50LmJhc2UuZGlyfS9idWlsZC9jbGFzc2VzIi8+CisgICAgICAgICAgICAgICAgPHBhdGggbG9jYXRpb249IiR7amF2YS5kaXJ9Ii8+CisgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItWG14MjU2TUIiLz4KKyAgICAgICAgICAgICAgPGJhdGNodGVzdCBwYXRoPSIke2FudC5iYXNlLmRpcn0vYnVpbGQvdGVzdGNhc2VzIj4KKyAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLypUZXN0LmNsYXNzIi8+CisgICAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICAgIDwvY2xpZW50PgorICAgICAgPC9yanVuaXQ+CisgICA8L3RhcmdldD4KKyA8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvQXJyYXlFbnVtZXJhdGlvbi5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvQXJyYXlFbnVtZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWFjYjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9BcnJheUVudW1lcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBDb252ZW5pZW50IGVudW1lcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KKyAqLworY2xhc3MgQXJyYXlFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKKworICAgIC8qKiBjb252ZW5pZW50IG51bGwgZW51bWVyYXRpb24gKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIEVudW1lcmF0aW9uIE5VTExfRU5VTUVSQVRJT04gPQorICAgICAgICAgICAgbmV3IEFycmF5RW51bWVyYXRpb24obmV3IE9iamVjdFswXSk7CisKKyAgICAvKiogb2JqZWN0IGFycmF5ICovCisgICAgcHJpdmF0ZSBPYmplY3RbXSBhcnJheTsKKworICAgIC8qKiBjdXJyZW50IGluZGV4ICovCisgICAgcHJpdmF0ZSBpbnQgcG9zOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhIG5ldyBlbnVtZXJhdGlvbiB0aGF0IHdyYXBzIGFuIGFycmF5LgorICAgICAqIEBwYXJhbSAgICAgICBhcnJheSAgIHRoZSBhcnJheSBvZiBvYmplY3QgdG8gZW51bWVyYXRlLgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUVudW1lcmF0aW9uKE9iamVjdFtdIGFycmF5KSB7CisgICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKKyAgICAgICAgdGhpcy5wb3MgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGlmIHRoaXMgZW51bWVyYXRpb24gY29udGFpbnMgbW9yZSBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoaXMgZW51bWVyYXRpb24gb2JqZWN0CisgICAgICogICAgICAgICAgIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBtb3JlIGVsZW1lbnQgdG8gcHJvdmlkZTsKKyAgICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIChwb3MgPCBhcnJheS5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGlzIGVudW1lcmF0aW9uIGlmIHRoaXMgZW51bWVyYXRpb24KKyAgICAgKiBvYmplY3QgaGFzIGF0IGxlYXN0IG9uZSBtb3JlIGVsZW1lbnQgdG8gcHJvdmlkZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzICBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uICBpZiBubyBtb3JlIGVsZW1lbnRzIGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBhcnJheVtwb3NdOworICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvQmFzZVRlc3RFbGVtZW50LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9CYXNlVGVzdEVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDFmOTYzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvQmFzZVRlc3RFbGVtZW50LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IGp1bml0LnJ1bm5lci5UZXN0Q29sbGVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworCisvKioKKyAqIEJhc2UgdGVzdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGltcGxlbWVudHMgdGhlIGlmL3VubGVzcyBsb2dpYy4KKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVGVzdEVsZW1lbnQKKyAgICAgICAgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IGltcGxlbWVudHMgVGVzdENvbGxlY3RvciB7CisKKyAgICAvKiogcnVuIHRoZSB0ZXN0IG9ubHkgaWYgdGhpcyBwcm9wZXJ0eSBpcyBwcmVzZW50ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaWZQcm9wZXJ0eTsKKworICAgIC8qKiBydW4gdGhlIHRlc3QgdW5sZXNzIHRoaXMgcHJvcGVydHkgaXMgcHJlc2VudCAqLworICAgIHByaXZhdGUgU3RyaW5nIHVubGVzc1Byb3BlcnR5OworCisgICAgcHVibGljIGZpbmFsIEVudW1lcmF0aW9uIGNvbGxlY3RUZXN0cygpIHsKKyAgICAgICAgaWYgKHNob3VsZFJ1bigpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGVzdHMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQXJyYXlFbnVtZXJhdGlvbi5OVUxMX0VOVU1FUkFUSU9OOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldElmKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZlByb3BlcnR5ID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0VW5sZXNzKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB1bmxlc3NQcm9wZXJ0eSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZXN0IGNvbGxlY3Rpb24gcHJvY2VzcworICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgcmVwcmVzZW50aW5nCisgICAgICogYSBKVW5pdCBUZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFbnVtZXJhdGlvbiBnZXRUZXN0cygpOworCisgICAgLyoqCisgICAgICogY2hlY2sgd2hldGhlciB0aGlzIHRlc3Qgc2hvdWxkIGJlIHJ1biBvciBub3QuCisgICAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgdGVzdCBzaG91bGQgcnVuIGJhc2VkIG9uCisgICAgICogdGhlIHByZXNlbmNlIG9mIDx0dD5pZjwvdHQ+IGFuZCA8dHQ+dW5sZXNzPC90dD4gcHJvcGVydGllcy4KKyAgICAgKiBAc2VlICNzZXRJZihTdHJpbmcpCisgICAgICogQHNlZSAjc2V0VW5sZXNzKFN0cmluZykKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSdW4oKSB7CisgICAgICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgaWYgKCBpZlByb3BlcnR5ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBwcm9qZWN0LmdldFByb3BlcnR5KGlmUHJvcGVydHkpID09IG51bGwgKXsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodW5sZXNzUHJvcGVydHkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0UHJvcGVydHkodW5sZXNzUHJvcGVydHkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9CYXRjaFRlc3RFbGVtZW50LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9CYXRjaFRlc3RFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjNTdkMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L0JhdGNoVGVzdEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0OworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQ7CisKKy8qKgorICogQSB0ZXN0IGVsZW1lbnQgd2hlcmUgdGVzdHMgZmlsZXMgYXJlIHNwZWNpZmllZCBieSBpbmNsdWRlL2V4Y2x1ZGUKKyAqIHBhdHRlcm5zLiB0ZXN0cyBmaWxlcyBsb2NhdGlvbiBhcmUgc3BlY2lmaWVkIGJ5IG9uZSBvcmUgbXVsdGlwbGUKKyAqIHBhdGggZWxlbWVudHMuIChkaXJlY3Rvcnkgb3IgYXJjaGl2ZSkuCisgKgorICogPHByZT4KKyAqIDwhRUxFTUVOVCBiYXRjaHRlc3Q+CisgKiA8IUFUVExJU1QgYmF0Y2h0ZXN0IHBhdGggQ0RBVEEgcmVxdWlyZWQ+CisgKiA8L3ByZT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBCYXRjaFRlc3RFbGVtZW50IGV4dGVuZHMgQmFzZVRlc3RFbGVtZW50IHsKKworICAgIHByaXZhdGUgQ2xhc3NwYXRoVGVzdENvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgQ2xhc3NwYXRoVGVzdENvbGxlY3RvcigpOworCisvLyBUZXN0IGNvbGxlY3RvciBpbXBsZW1lbnRhdGlvbgorCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFRlc3RzKCkgeworICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIGNvbGxlY3Rvci5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICByZXR1cm4gY29sbGVjdG9yLmNvbGxlY3RUZXN0cygpOworICAgIH0KKworLy8gQW50IGJlYW4gYWNjZXNzb3JzCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFBhdGggcGF0aCkgeworICAgICAgICBjb2xsZWN0b3Iuc2V0UGF0aChwYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGF0aCBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gY29sbGVjdG9yLmdldFBhdGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rvci5jcmVhdGVJbmNsdWRlKCk7CisgICAgfQorCisgICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUV4Y2x1ZGUoKSB7CisgICAgICAgIHJldHVybiBjb2xsZWN0b3IuY3JlYXRlRXhjbHVkZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvQ2xhc3NwYXRoVGVzdENvbGxlY3Rvci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvQ2xhc3NwYXRoVGVzdENvbGxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjE2NGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9DbGFzc3BhdGhUZXN0Q29sbGVjdG9yLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQganVuaXQucnVubmVyLlRlc3RDb2xsZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQ7CisKKy8qKgorICogQSByb3VnaCBpbXBsZW1lbnRhdGlvbiBvZiBhIHRlc3QgY29sbGVjdG9yIHRoYXQgd2lsbCBjb2xsZWN0IHRlc3RzCisgKiB1c2luZyBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybnMgaW4gYSBzZXQgb2YgcGF0aHMuIEEgcGF0aCBjYW4gZWl0aGVyCisgKiBiZSBhIGRpcmVjdG9yeSBvciBhbiBhcmNoaXZlLiAoemlwIG9yIGphciBmaWxlKQorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENsYXNzcGF0aFRlc3RDb2xsZWN0b3IgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50CisgICAgICAgIGltcGxlbWVudHMgVGVzdENvbGxlY3RvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1VGRklYX0xFTkdUSCA9ICIuY2xhc3MiLmxlbmd0aCgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuU2V0IHBhdHRlcm5zID0gbmV3IFBhdHRlcm5TZXQoKTsKKworICAgIHByaXZhdGUgUGF0aCBwYXRoID0gbnVsbDsKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBjb2xsZWN0VGVzdHMoKSB7CisgICAgICAgIEhhc2h0YWJsZSBjb2xsZWN0ZWQgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIC8vIHN0YXJ0IGZyb20gbGFzdCwgc28gdGhhdCBmaXJzdCBlbGVtZW50cworICAgICAgICAvLyBvdmVycmlkZSBsYXN0IG9uZSBpbiBjYXNlIHRoZXJlIGFyZSBkdXBsaWNhdGVzLgorICAgICAgICAvLyBpZSBtaW1pYyBjbGFzc3BhdGggYmVoYXZpb3IuCisgICAgICAgIFN0cmluZ1tdIHBhdGhzID0gcGF0aC5saXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSBwYXRocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocGF0aHNbaV0pOworICAgICAgICAgICAgQXJyYXlMaXN0IGluY2x1ZGVkID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBpbmNsdWRlZCA9IGdhdGhlckZyb21EaXJlY3RvcnkoZik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuemlwIikKKyAgICAgICAgICAgICAgICAgICAgfHwgZi5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgICAgIGluY2x1ZGVkID0gZ2F0aGVyRnJvbUFyY2hpdmUoZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWRkIHRlc3RzIHRvIHRoZSBhbHJlYWR5IGNvbGxlY3RlZCBvbmUKKyAgICAgICAgICAgIGZpbmFsIGludCBpbmNsdWRlZENvdW50ID0gaW5jbHVkZWQuc2l6ZSgpOworICAgICAgICAgICAgbG9nKCJBZGRpbmcgIiArIGluY2x1ZGVkQ291bnQgKyAiIHRlc3RjYXNlcyBmcm9tICIgKyBmLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5jbHVkZWRDb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRlc3RuYW1lID0gKFN0cmluZykgaW5jbHVkZWQuZ2V0KGopOworICAgICAgICAgICAgICAgIGNvbGxlY3RlZC5wdXQodGVzdG5hbWUsICIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2coIkNvbGxlY3RlZCAiICsgY29sbGVjdGVkLnNpemUoKSArICIgdGVzdGNhc2VzIGZyb20gIiArIHBhdGhzLmxlbmd0aCArICIgcGF0aChzKS4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3RlZC5rZXlzKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgY2xhc3NuYW1lcyBmcm9tIGEgZGlyZWN0b3J5IHRoYXQgbWF0Y2gKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHBhdHRlcm5zLgorICAgICAqIEBwYXJhbSBkaXIgdGhlIGJhc2UgZGlyZWN0b3J5IChtdXN0IGFsc28gYmUgdGhlIGJhc2UgcGFja2FnZSkKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNsYXNzbmFtZXMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4uCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBnYXRoZXJGcm9tRGlyZWN0b3J5KEZpbGUgZGlyKSB7CisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIoZGlyKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMocGF0dGVybnMuZ2V0SW5jbHVkZVBhdHRlcm5zKHByb2plY3QpKTsKKyAgICAgICAgZHMuc2V0RXhjbHVkZXMocGF0dGVybnMuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBTdHJpbmdbXSBpbmNsdWRlZCA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgcmV0dXJuIHRlc3RDbGFzc05hbWVGcm9tRmlsZShpbmNsdWRlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGNsYXNzbmFtZXMgZnJvbSBhIHppcGZpbGUgdGhhdCBtYXRjaAorICAgICAqIHRoZSBzcGVjaWZpZWQgcGF0dGVybnMuCisgICAgICogQHBhcmFtIHppcCB0aGUgemlwZmlsZSAobXVzdCBhbHNvIGJlIHRoZSBiYXNlIHBhY2thZ2UpCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjbGFzc25hbWVzIG1hdGNoaW5nIHRoZSBwYXR0ZXJuLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3QgZ2F0aGVyRnJvbUFyY2hpdmUoRmlsZSB6aXApIHsKKyAgICAgICAgWmlwU2Nhbm5lciB6cyA9IG5ldyBaaXBTY2FubmVyKCk7CisgICAgICAgIHpzLnNldEJhc2VkaXIoemlwKTsKKyAgICAgICAgenMuc2V0SW5jbHVkZXMocGF0dGVybnMuZ2V0SW5jbHVkZVBhdHRlcm5zKGdldFByb2plY3QoKSkpOworICAgICAgICB6cy5zZXRFeGNsdWRlcyhwYXR0ZXJucy5nZXRFeGNsdWRlUGF0dGVybnMoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgIHpzLnNjYW4oKTsKKyAgICAgICAgU3RyaW5nW10gaW5jbHVkZWQgPSB6cy5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgIHJldHVybiB0ZXN0Q2xhc3NOYW1lRnJvbUZpbGUoaW5jbHVkZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRyYW5zZm9ybSBhIHNldCBvZiBmaWxlIGludG8gdGhlaXIgbWF0Y2hpbmcgY2xhc3NuYW1lCisgICAgICogQHRvZG8gd2hhdCBhYm91dCB1c2luZyBhIG1hcHBlciBmb3IgdGhpcyA/CisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCB0ZXN0Q2xhc3NOYW1lRnJvbUZpbGUoU3RyaW5nW10gY2xhc3NGaWxlTmFtZXMpIHsKKyAgICAgICAgQXJyYXlMaXN0IHRlc3RzID0gbmV3IEFycmF5TGlzdChjbGFzc0ZpbGVOYW1lcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzRmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGNsYXNzRmlsZU5hbWVzW2ldOworICAgICAgICAgICAgaWYgKGlzVGVzdENsYXNzKGZpbGUpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGNsYXNzTmFtZUZyb21GaWxlKGZpbGUpOworICAgICAgICAgICAgICAgIHRlc3RzLmFkZChjbGFzc25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0czsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Rlc3RDbGFzcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSkgeworICAgICAgICByZXR1cm4gY2xhc3NGaWxlTmFtZS5lbmRzV2l0aCgiLmNsYXNzIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWVGcm9tRmlsZShTdHJpbmcgY2xhc3NGaWxlTmFtZSkgeworICAgICAgICAvLyBjb252ZXJ0IC9hL2IuY2xhc3MgdG8gYS5iCisgICAgICAgIFN0cmluZyBzID0gY2xhc3NGaWxlTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NGaWxlTmFtZS5sZW5ndGgoKSAtIFNVRkZJWF9MRU5HVEgpOworICAgICAgICBTdHJpbmcgczIgPSBzLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpOworICAgICAgICBpZiAoczIuc3RhcnRzV2l0aCgiLiIpKSB7CisgICAgICAgICAgICBzMiA9IHMyLnN1YnN0cmluZygxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gczI7CisgICAgfQorCisvLyBBbnQgYmVhbiBhY2Nlc3NvcnMKKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoUGF0aCBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgcHVibGljIFBhdGggZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhdHRlcm5zLmNyZWF0ZUluY2x1ZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlRXhjbHVkZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhdHRlcm5zLmNyZWF0ZUV4Y2x1ZGUoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L0NsaWVudEVsZW1lbnQuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L0NsaWVudEVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWYwOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvQ2xpZW50RWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGp1bml0LnJ1bm5lci5UZXN0Q29sbGVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLmkxOG4uUmVzb3VyY2VNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5pMThuLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dTdHJlYW1IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lSmF2YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIEFuIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAqCisgKiA8cHJlPgorICogPCFFTEVNRU5UIHNlcnZlciAoanZtYXJnKSogKGNsYXNzcGF0aCkqICh0ZXN0KSogKGJhdGNodGVzdCkqPgorICogPCFBVFRMSVNUIHNlcnZlciBwb3J0IG51bWVyaWMgNjY2Nj4KKyAqIDwhQVRUTElTVCBzZXJ2ZXIgaG9zdCBDREFUQSAxMjcuMC4wLjE+CisgKiA8L3ByZT4KKworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2xpZW50RWxlbWVudCBleHRlbmRzIFByb2plY3RDb21wb25lbnQgeworICAgIC8qKiByZXNvdXJjZXMgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBSZXNvdXJjZXMgUkVTID0KKyAgICAgICAgICAgIFJlc291cmNlTWFuYWdlci5nZXRQYWNrYWdlUmVzb3VyY2VzKENsaWVudEVsZW1lbnQuY2xhc3MpOworCisgICAgLyoqIHBvcnQgdG8gY29udGFjdCB0aGUgc2VydmVyLiBEZWZhdWx0IHRvIDY2NjYgKi8KKyAgICBwcml2YXRlIGludCBwb3J0ID0gNjY2NjsKKworICAgIC8qKiBzZXJ2ZXIgaG9zdG5hbWUgdG8gY29ubmVjdCB0by4gRGVmYXVsdCB0byAxMjcuMC4wLjEgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob3N0ID0gIjEyNy4wLjAuMSI7CisKKyAgICAvKiogdGVzdCBjb2xsZWN0b3IgZWxlbWVudHMgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdCB0ZXN0Q29sbGVjdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIC8qKiB0aGUgY29tbWFuZCBsaW5lIHRvIGxhdW5jaCB0aGUgVGVzdFJ1bm5lciAqLworICAgIHByaXZhdGUgQ29tbWFuZGxpbmVKYXZhIGNtZCA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsKKworICAgIC8qKiB0aGUgcGFyZW50IHRhc2sgKi8KKyAgICBwcml2YXRlIFJKVW5pdFRhc2sgcGFyZW50OworCisgICAgLyoqIGhlbHAgZGVidWcgdGhlIFRlc3RSdW5uZXIgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworICAgIC8qKiBjcmVhdGUgYSBuZXcgY2xpZW50ICovCisgICAgcHVibGljIENsaWVudEVsZW1lbnQoUkpVbml0VGFzayB2YWx1ZSkgeworICAgICAgICBwYXJlbnQgPSB2YWx1ZTsKKyAgICAgICAgY21kLnNldENsYXNzbmFtZSgib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LnJlbW90ZS5UZXN0UnVubmVyIik7CisgICAgfQorCisgICAgLyoqIGNvcmUgZW50cnkgcG9pbnQgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZUV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGRvRXhlY3V0ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcG9zdEV4ZWN1dGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByZUV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyBtdXN0IGFwcGVuZGVkIHRvIGNsYXNzcGF0aCB0byBhdm9pZCBjb25mbGljdHMuCisgICAgICAgIEpVbml0SGVscGVyLmFkZENsYXNzcGF0aEVudHJ5KGNyZWF0ZUNsYXNzcGF0aCgpLCAiL2p1bml0L2ZyYW1ld29yay9UZXN0Q2FzZS5jbGFzcyIpOworICAgICAgICBKVW5pdEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyeShjcmVhdGVDbGFzc3BhdGgoKSwgIi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrLmNsYXNzIik7CisgICAgICAgIEpVbml0SGVscGVyLmFkZENsYXNzcGF0aEVudHJ5KGNyZWF0ZUNsYXNzcGF0aCgpLCAiL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9yZW1vdGUvVGVzdFJ1bm5lci5jbGFzcyIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgdG1wID0gY29uZmlndXJlVGVzdFJ1bm5lcigpOworICAgICAgICBFeGVjdXRlIGV4ZWN1dGUgPSBuZXcgRXhlY3V0ZShuZXcgTG9nU3RyZWFtSGFuZGxlcihwYXJlbnQsIFByb2plY3QuTVNHX1ZFUkJPU0UsIFByb2plY3QuTVNHX1ZFUkJPU0UpKTsKKyAgICAgICAgZXhlY3V0ZS5zZXRDb21tYW5kbGluZShjbWQuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgIGV4ZWN1dGUuc2V0QW50UnVuKHByb2plY3QpOworCisgICAgICAgIGxvZyhSRVMuZ2V0U3RyaW5nKCJ0YXNrLnByb2Nlc3MtY21kbGluZS5sb2ciLCBjbWQudG9TdHJpbmcoKSksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBpbnQgcmV0VmFsID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldFZhbCA9IGV4ZWN1dGUuZXhlY3V0ZSgpOworICAgICAgICAgICAgaWYgKHJldFZhbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0YXNrLnByb2Nlc3MtZmFpbGVkLmVycm9yIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSBSRVMuZ2V0U3RyaW5nKCJ0YXNrLnByb2Nlc3MtZmFpbGVkLmVycm9yIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRtcC5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHBvc3RFeGVjdXRlKCkgeworICAgICAgICAvLyBub3RoaW5nCisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhbGwgY29sbGVjdGVkIHRlc3RzIHNwZWNpZmllZCB3aXRoIHRlc3QgZWxlbWVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uIGNvbGxlY3RUZXN0cygpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gdGVzdENvbGxlY3RvcnMuc2l6ZSgpOworICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbltdIHRlc3RzID0gbmV3IEVudW1lcmF0aW9uW2NvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBUZXN0Q29sbGVjdG9yIHRlID0gKFRlc3RDb2xsZWN0b3IpIHRlc3RDb2xsZWN0b3JzLmdldChpKTsKKyAgICAgICAgICAgIHRlc3RzW2ldID0gdGUuY29sbGVjdFRlc3RzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb3VuZEVudW1lcmF0aW9uKHRlc3RzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIHJ1bm5lciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICogQHJldHVybiB0aGUgcmVmZXJlbmNlIHRvIHRoZSB0ZW1wb3JhcnkgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICogdG8gYmUgZGVsZXRlZCBvbmNlIHRoZSBUZXN0UnVubmVyIGhhcyBlbmRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBjb25maWd1cmVUZXN0UnVubmVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLnNldFByb3BlcnR5KCJkZWJ1ZyIsIFN0cmluZy52YWx1ZU9mKGRlYnVnKSk7CisgICAgICAgIHByb3BzLnNldFByb3BlcnR5KCJob3N0IiwgaG9zdCk7CisgICAgICAgIHByb3BzLnNldFByb3BlcnR5KCJwb3J0IiwgU3RyaW5nLnZhbHVlT2YocG9ydCkpOworICAgICAgICAvLyBnZXQgYWxsIHRlc3QgY2xhc3NlcyB0byBydW4uLi4KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAyNDApOworICAgICAgICBFbnVtZXJhdGlvbiBjbGFzc25hbWVzID0gY29sbGVjdFRlc3RzKCk7CisgICAgICAgIHdoaWxlIChjbGFzc25hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKFN0cmluZykgY2xhc3NuYW1lcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgYnVmLmFwcGVuZChjbGFzc25hbWUpLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIHByb3BzLnNldFByb3BlcnR5KCJjbGFzc25hbWVzIiwgYnVmLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIGR1bXAgdGhlIHByb3BlcnRpZXMgdG8gYSB0ZW1wb3JhcnkgZmlsZS4KKyAgICAgICAgRmlsZVV0aWxzIGZ1dGlscyA9IEZpbGVVdGlscy5uZXdGaWxlVXRpbHMoKTsKKyAgICAgICAgRmlsZSBmID0gZnV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJqdW5pdC1hbnRydW5uZXIiLCAidG1wIiwgbmV3IEZpbGUoIi4iKSk7CisgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpKTsKKyAgICAgICAgICAgIHByb3BzLnN0b3JlKGJhb3MsICJKVW5pdCBBbnQgUnVubmVyIGNvbmZpZ3VyYXRpb24gZmlsZSIpOworICAgICAgICAgICAgbG9nKGJhb3MudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBvcy53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgcnVubmVyCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZmlsZSIpOworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShmLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgcmV0dXJuIGY7CisgICAgfQorCisvLyAtLS0gQW50IGJlYW4gc2V0dGVycworCisgICAgLyoqIHNldCB0aGUgcG9ydCB0byBjb25uZWN0IHRvICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgdmFsdWUpIHsKKyAgICAgICAgcG9ydCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKiBzZXQgdGhlIGhvc3QgdG8gY29udGFjdCAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGhvc3QgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKiogc2V0IGRlYnVnIG1vZGUgZm9yIHRoZSBydW5uZXIuIGl0IHdpbGwgbG9nIGEgZmlsZSB0byB3b3JraW5nIGRpciAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZmxhZykgeworICAgICAgICBkZWJ1ZyA9IGZsYWc7CisgICAgfQorCisgICAgLyoqIENyZWF0ZSBhIG5ldyBKVk0gYXJndW1lbnQuICovCisgICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUp2bWFyZygpIHsKKyAgICAgICAgcmV0dXJuIGNtZC5jcmVhdGVWbUFyZ3VtZW50KCk7CisgICAgfQorCisgICAgLyoqIGNsYXNzcGF0aCB0byBiZSBzZXQgZm9yIHJ1bm5pbmcgdGVzdHMgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjbWQuY3JlYXRlQ2xhc3NwYXRoKGdldFByb2plY3QoKSk7CisgICAgfQorCisgICAgLyoqIGFkZCBhIHNpbmdsZSB0ZXN0IGVsZW1lbnQgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkVGVzdChUZXN0RWxlbWVudCB2YWx1ZSkgeworICAgICAgICB0ZXN0Q29sbGVjdG9ycy5hZGQodmFsdWUpOworICAgIH0KKworICAgIC8qKiBhZGQgYSBiYXRjaCB0ZXN0IGVsZW1lbnQgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkQmF0Y2hUZXN0KEJhdGNoVGVzdEVsZW1lbnQgdmFsdWUpIHsKKyAgICAgICAgLy8gYWRkIHRoZSBjbGFzc3BhdGggb2YgYmF0Y2h0ZXN0IHRvIGNtZCBjbGFzc3BhdGgKKyAgICAgICAgUGF0aCBwYXRoID0gdmFsdWUuZ2V0UGF0aCgpOworICAgICAgICBjbWQuZ2V0Q2xhc3NwYXRoKCkuYXBwZW5kKHBhdGgpOworICAgICAgICB0ZXN0Q29sbGVjdG9ycy5hZGQodmFsdWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvQ29tcG91bmRFbnVtZXJhdGlvbi5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvQ29tcG91bmRFbnVtZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmODQ4OTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9Db21wb3VuZEVudW1lcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBDb252ZW5pZW50IGVudW1lcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgZW51bWVyYXRpb24uIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIEVudW1lcmF0aW9uIGUxID0gdjEuZWxlbWVudHMoKTsKKyAqIHdoaWxlIChlMS5oYXNNb3JlRWxlbWVudHMoKSl7CisgKiAgICAvLyBkbyBzb21ldGhpbmcKKyAqIH0KKyAqIEVudW1lcmF0aW9uIGUyID0gdjIuZWxlbWVudHMoKTsKKyAqIHdoaWxlIChlMi5oYXNNb3JlRWxlbWVudHMoKSl7CisgKiAgICAvLyBkbyB0aGUgc2FtZSB0aGluZworICogfQorICogPC9wcmU+CisgKiBjYW4gYmUgd3JpdHRlbiBhczoKKyAqIDxwcmU+CisgKiBFbnVtZXJhdGlvbltdIGVudW1zID0geyB2MS5lbGVtZW50cygpLCB2Mi5lbGVtZW50cygpIH07CisgKiBFbnVtZXJhdGlvbiBlID0gRW51bWVyYXRpb25zLmZyb21Db21wb3VuZChlbnVtcyk7CisgKiB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7CisgKiAgICAvLyBkbyBzb21ldGhpbmcKKyAqIH0KKyAqIDwvcHJlPgorICogTm90ZSB0aGF0IHRoZSBlbnVtZXJhdGlvbiB3aWxsIHNraXAgbnVsbCBlbGVtZW50cyBpbiB0aGUgYXJyYXkuIFRoZSBmb2xsb3dpbmcgaXMKKyAqIHRodXMgcG9zc2libGU6CisgKiA8cHJlPgorICogRW51bWVyYXRpb25bXSBlbnVtcyA9IHsgdjEuZWxlbWVudHMoKSwgbnVsbCwgdjIuZWxlbWVudHMoKSB9OyAvLyBhIG51bGwgZW51bWVyYXRpb24gaW4gdGhlIGFycmF5CisgKiBFbnVtZXJhdGlvbiBlID0gRW51bWVyYXRpb25zLmZyb21Db21wb3VuZChlbnVtcyk7CisgKiB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7CisgKiAgICAvLyBkbyBzb21ldGhpbmcKKyAqIH0KKyAqIDwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgQ29tcG91bmRFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKKworICAgIC8qKiBlbnVtZXJhdGlvbiBhcnJheSAqLworICAgIHByaXZhdGUgRW51bWVyYXRpb25bXSBlbnVtQXJyYXk7CisKKyAgICAvKiogaW5kZXggaW4gdGhlIGVudW1zIGFycmF5ICovCisgICAgcHJpdmF0ZSBpbnQgaW5kZXggPSAwOworCisgICAgcHVibGljIENvbXBvdW5kRW51bWVyYXRpb24oRW51bWVyYXRpb25bXSBlbnVtYXJyYXkpIHsKKyAgICAgICAgdGhpcy5lbnVtQXJyYXkgPSBlbnVtYXJyYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgaWYgdGhpcyBlbnVtZXJhdGlvbiBjb250YWlucyBtb3JlIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhpcyBlbnVtZXJhdGlvbiBvYmplY3QKKyAgICAgKiAgICAgICAgICAgY29udGFpbnMgYXQgbGVhc3Qgb25lIG1vcmUgZWxlbWVudCB0byBwcm92aWRlOworICAgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICB3aGlsZSAoaW5kZXggPCBlbnVtQXJyYXkubGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoZW51bUFycmF5W2luZGV4XSAhPSBudWxsICYmIGVudW1BcnJheVtpbmRleF0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGlzIGVudW1lcmF0aW9uIGlmIHRoaXMgZW51bWVyYXRpb24KKyAgICAgKiBvYmplY3QgaGFzIGF0IGxlYXN0IG9uZSBtb3JlIGVsZW1lbnQgdG8gcHJvdmlkZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzICBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uICBpZiBubyBtb3JlIGVsZW1lbnRzIGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIGVudW1BcnJheVtpbmRleF0ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L0ZpbHRlckVsZW1lbnQuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L0ZpbHRlckVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJjZTQyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvRmlsdGVyRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5mb3JtYXR0ZXIuRmlsdGVyRm9ybWF0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5mb3JtYXR0ZXIuRmlsdGVyU3RhY2tGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LmZvcm1hdHRlci5Gb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKKworLyoqCisgKiBBIGZpbHRlciBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgaW5zaWRlIGEgUmVzdWx0Rm9ybWF0dGVyRWxlbWVudCB0byBkZW5vdGUKKyAqIGEgZmlsdGVyaW5nLiBOb3RlIHRoYXQgdGhlIGZpbHRlcmluZyBvcmRlciBjb3JyZXNwb25kIHRvIHRoZSBlbGVtZW50CisgKiBvcmRlci4gVGhlIGZpcnN0IGVsZW1lbnQgYmVpbmcgdGhlIHRvcCBmaWx0ZXIsIHRoZSBsYXN0IGVsZW1lbnQKKyAqIGJlaW5nIHRoZSBib3R0b20gZmlsdGVyLgorICoKKyAqIDxwcmU+CisgKiA8IUVMRU1FTlQgZmlsdGVyPgorICogPCFBVFRMSVNUIGZpbHRlciB0eXBlIChzdGFjaykgcmVxdWlyZWQ+CisgKiA8IUFUVExJU1QgZmlsdGVyIGNsYXNzbmFtZSBDREFUQSByZXF1aXJlZD4KKyAqIDwvcHJlPgorICoKKyAqLworcHVibGljIGNsYXNzIEZpbHRlckVsZW1lbnQgeworCisgICAgLyoqIGZpbHRlciBjbGFzc25hbWUsIGlzIHNob3VsZCBpbmhlcml0IGZyb20gRmlsdGVyRm9ybWF0dGVyICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NuYW1lOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGludHJvc3BlY3Rpb24gb24gPHR0PnR5cGU8L3R0PiBhdHRyaWJ1dGUuCisgICAgICogQHNlZSBGaWx0ZXJBdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKEZpbHRlckF0dHJpYnV0ZSBmYSkgeworICAgICAgICBzZXRDbGFzc05hbWUoZmEuZ2V0Q2xhc3NOYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBpbnRyb3NwZWN0aW9uIG9uIDx0dD5jbGFzc25hbWU8L3R0PiBhdHRyaWJ1dGUuCisgICAgICogSXQgbXVzdCBpbmhlcml0IGZyb20gPHR0PkZpbHRlckZvcm1hdHRlcjwvdHQ+CisgICAgICogQHNlZSBGaWx0ZXJGb3JtYXR0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgY2xhc3NuYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwIHRoaXMgZmlsdGVyIGFyb3VuZCBhIGdpdmVuIGZvcm1hdHRlci4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBlcnJvciBoYXBwZW5zIHdoZW4gY3JlYXRpbmcgdGhpcyBmaWx0ZXIuCisgICAgICovCisgICAgcHVibGljIEZvcm1hdHRlciBjcmVhdGVGaWx0ZXJGb3JtYXR0ZXIoRm9ybWF0dGVyIGYpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgIGlmICghRmlsdGVyRm9ybWF0dGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXp6ICsgIiBtdXN0IGJlIGEgRmlsdGVyRm9ybWF0dGVyLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc3RydWN0b3IgY3RvciA9IGNsYXp6LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde0Zvcm1hdHRlci5jbGFzc30pOworICAgICAgICAgICAgcmV0dXJuIChGb3JtYXR0ZXIpIGN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2Z9KTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBhIHByZWRlZmluZWQgc2V0IG9mIGZpbHRlcnMgdy8gdGhlaXIgY2xhc3MgbWFwcGluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVyQXR0cmlidXRlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKiB0aGUgcHJlZGVmaW5lZCBhbGlhcyBmb3IgZmlsdGVycyAqLworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBWQUxVRVMgPSB7InN0YWNrIn07CisKKyAgICAgICAgLyoqIHRoZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbGlhcyAoaW4gdGhlIHNhbWUgb3JkZXIpICovCisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIENMQVNTTkFNRVMgPSB7RmlsdGVyU3RhY2tGb3JtYXR0ZXIuY2xhc3MuZ2V0TmFtZSgpfTsKKworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIFZBTFVFUzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBnZXQgdGhlIGNsYXNzbmFtZSBtYXRjaGluZyB0aGUgYWxpYXMgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gQ0xBU1NOQU1FU1tnZXRJbmRleCgpXTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvSlVuaXRIZWxwZXIuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L0pVbml0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxMmI1YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L0pVbml0SGVscGVyLmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIEEgc2V0IG9mIGhlbHBlcnMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBKVW5pdC4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKVW5pdEhlbHBlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VJVEVfTUVUSE9ETkFNRSA9ICJzdWl0ZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBwYXJzZSB0aGUgb3V0cHV0IG9mIHRoZSBtZXRob2QgPHR0PnRvU3RyaW5nKCk8L3R0PgorICAgICAqIGZyb20gdGhlIDx0dD5UZXN0Q2FzZTwvdHQ+IGNsYXNzLiBUaGUgZm9ybWF0IHJldHVybmVkIGlzOgorICAgICAqIDx0dD5uYW1lKGNsYXNzbmFtZSk8L3R0PgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoU3RyaW5nIHRleHQpeworICAgICAgICBpbnQgcDEgPSB0ZXh0LmluZGV4T2YoJygnKTsKKyAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIHAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBwYXJzZSB0aGUgb3V0cHV0IG9mIHRoZSBtZXRob2QgPHR0PnRvU3RyaW5nKCk8L3R0PgorICAgICAqIGZyb20gdGhlIDx0dD5UZXN0Q2FzZTwvdHQ+IGNsYXNzLiBUaGUgZm9ybWF0IHJldHVybmVkIGlzOgorICAgICAqIDx0dD5uYW1lKGNsYXNzbmFtZSk8L3R0PgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIGNsYXNzbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdWl0ZU5hbWUoU3RyaW5nIHRleHQpeworICAgICAgICBpbnQgcDEgPSB0ZXh0LmluZGV4T2YoJygnKTsKKyAgICAgICAgaW50IHAyID0gdGV4dC5pbmRleE9mKCcpJywgcDEpOworICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcocDEgKyAxLCBwMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVGVzdCBjb3JyZXNwb25kaW5nIHRvIHRvIHRoZSBnaXZlbiBjbGFzcyBuYW1lCisgICAgICogQHBhcmFtIGxvYWRlciBjbGFzc2xvYWRlciB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSBjbGFzcyBvcgorICAgICAqIDx0dD5udWxsPC90dD4gZm9yIHN5c3RlbSBjbGFzc2xvYWRlci4KKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBjbGFzc25hbWUgb2YgdGhlIHRlc3Qgd2Ugd2FudCB0byBleHRyYWN0LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGEgZ2VuZXJpYyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRlc3QgZ2V0VGVzdChDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBjbGFzc25hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFRlc3QoY2xhenopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhIHRlc3QgZnJvbSBhIGdpdmVuIGNsYXNzCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyB0byBleHRyYWN0IGEgdGVzdCBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBnZXRUZXN0KENsYXNzIGNsYXp6KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFRlc3RTdWl0ZSkgb2JqOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHN1aXRlIG1ldGhvZAorICAgICAgICAgICAgTWV0aG9kIHN1aXRlTWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKFNVSVRFX01FVEhPRE5BTUUsIG5ldyBDbGFzc1swXSk7CisgICAgICAgICAgICByZXR1cm4gKFRlc3QpIHN1aXRlTWV0aG9kLmludm9rZShudWxsLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgaWYgaXQgaXMgcmVhbGx5IGEgdmFsaWQgdGVzdGNhc2UKKyAgICAgICAgaW50IG1vZGlmaWVycyA9IGNsYXp6LmdldE1vZGlmaWVycygpOworICAgICAgICBpZiAoICFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpIHx8CisgICAgICAgICAgICAgICAgTW9kaWZpZXIuaXNBYnN0cmFjdChtb2RpZmllcnMpIHx8CisgICAgICAgICAgICAgICAgIVRlc3RDYXNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyB0cnkgdG8gZXh0cmFjdCBhIHRlc3Qgc3VpdGUgYXV0b21hdGljYWxseQorICAgICAgICAvLyB0aGlzIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgaWYgdGhlIGNsYXNzIGlzIG5vIHN1aXRhYmxlIFRlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKGNsYXp6KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgcmV0dXJuIHRoZSBkaXJlY3Rvcnkgb3IgYXJjaGl2ZQorICAgICAqIHRoYXQgY29udGFpbnMgaXQuCisgICAgICoKKyAgICAgKiA8cD5Eb2Vzbid0IHdvcmsgZm9yIGFyY2hpdmVzIGluIEpESyAxLjEgYXMgdGhlIFVSTCByZXR1cm5lZCBieQorICAgICAqIGdldFJlc291cmNlIGRvZXNuJ3QgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIGxvb2sgZm9yIGluIHRoZSBKVk0gY2xhc3NwYXRoLgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHJlc291cmNlIG9yCisgICAgICogPHR0Pm51bGw8L3R0PiBpZiBpdCBkb2VzIG5vdCBrbm93IGhvdyB0byBoYW5kbGUgaXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldFJlc291cmNlRW50cnkoU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIFVSTCB1cmwgPSBKVW5pdEhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gY2FuJ3QgZmluZCB0aGUgcmVzb3VyY2UuLi4KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB1ID0gdXJsLnRvU3RyaW5nKCk7CisgICAgICAgIGlmICh1LnN0YXJ0c1dpdGgoImphcjpmaWxlOiIpKSB7CisgICAgICAgICAgICBpbnQgcGxpbmcgPSB1LmluZGV4T2YoIiEiKTsKKyAgICAgICAgICAgIFN0cmluZyBqYXJOYW1lID0gdS5zdWJzdHJpbmcoOSwgcGxpbmcpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKChuZXcgRmlsZShqYXJOYW1lKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9IGVsc2UgaWYgKHUuc3RhcnRzV2l0aCgiZmlsZToiKSkgeworICAgICAgICAgICAgaW50IHRhaWwgPSB1LmluZGV4T2YocmVzb3VyY2UpOworICAgICAgICAgICAgU3RyaW5nIGRpck5hbWUgPSB1LnN1YnN0cmluZyg1LCB0YWlsKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZSgobmV3IEZpbGUoZGlyTmFtZSkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgaXQuLi4KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIGEgc3BlY2lmaWMgcmVzb3VyY2UgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHBhdGggaW5zdGFuY2UuIFRoZSBlbnRyeSBjYW4gZWl0aGVyIGJlIGEgZGlyZWN0b3J5CisgICAgICogb3IgYW4gYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBhZGQgdGhlIHJlc291cmNlIGVudHJ5IHRvLgorICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gbG9vayBmb3IuCisgICAgICogQHNlZSAjZ2V0UmVzb3VyY2VFbnRyeShTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENsYXNzcGF0aEVudHJ5KFBhdGggcGF0aCwgU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIEZpbGUgZiA9IGdldFJlc291cmNlRW50cnkocmVzb3VyY2UpOworICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXRoLmNyZWF0ZVBhdGhFbGVtZW50KCkuc2V0TG9jYXRpb24oZik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L0tlZXBBbGl2ZU91dHB1dFN0cmVhbS5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvS2VlcEFsaXZlT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjZTcwNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L0tlZXBBbGl2ZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogQ2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byB3cmFwIDx0dD5TeXN0ZW0ub3V0PC90dD4gYW5kIDx0dD5TeXN0ZW0uZXJyPC90dD4KKyAqIHdpdGhvdXQgZ2V0dGluZyBhbnhpb3VzIGFib3V0IHRoZSBjbGllbnQgY2xvc2luZyB0aGUgc3RyZWFtLgorICoKKyAqIDxwPgorICogSW4gY29kZS1sYW5ndWFnZSBpdCBtZWFucyB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZG86CisgKiA8cHJlPgorICogaWYgKG91dCAhPSBTeXN0ZW0ub3V0ICYmIG91dCE9IFN5c3RlbS5lcnIpeworICogICBvdXQuY2xvc2UoKTsKKyAqIH0KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIEtlZXBBbGl2ZU91dHB1dFN0cmVhbSBleHRlbmRzIEZpbHRlck91dHB1dFN0cmVhbSB7CisKKyAgICBwdWJsaWMgS2VlcEFsaXZlT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgc3VwZXIob3V0KTsKKyAgICB9CisKKyAgICAvKiogdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L091dHB1dEF0dHJpYnV0ZS5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvT3V0cHV0QXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmOGJiOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L091dHB1dEF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworCisvKioKKyAqIEF0dGVtcHQgdG8gY3JlYXRlIGFuIG91dHB1dCBzcGVjaWZpYyBhdHRyaWJ1dGUuCisgKiA8cD4KKyAqIFRoZSBwb3NzaWJsZSBvdXRwdXQgdmFsdWVzIGFyZSAnc3Rkb3V0JyBhbmQgJ3N0ZGVycicsIG90aGVyd2lzZQorICogaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB2YWx1ZSByZXByZXNlbnQgYSBmaWxlLgorICogPC9wPgorICogTm90ZSB0aGF0IHN0ZG91dCBhbmQgc3RkZXJyIGFyZSB3cmFwcGVkIGJ5IGEgPHR0PktlZXBBbGl2ZU91dHB1dFN0cmVhbTwvdHQ+CisgKiBzbyB0aGF0IHRoZSBzdHJlYW0gY2Fubm90IGJlIGNsb3NlZC4KKyAqCisgKiBAc2VlIEtlZXBBbGl2ZU91dHB1dFN0cmVhbQorICovCitwdWJsaWMgY2xhc3MgT3V0cHV0QXR0cmlidXRlIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCB7CisKKyAgICAvKioga2V5d29yZCB0byByZXByZXNlbnQgc3Rkb3V0IG91dHB1dCAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNURE9VVCA9ICJzdGRvdXQiOworCisgICAgLyoqIGtleXdvcmQgdG8gcmVwcmVzZW50IHN0ZGVyciBvdXRwdXQgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVERFUlIgPSAic3RkZXJyIjsKKworICAgIC8qKiB0aGUgc2VsZWN0ZWQgdmFsdWUgZm9yIG91dHB1dCwgZWl0aGVyIHN0ZG91dCxzdGRlcnIgb3IgZmlsZXBhdGggKi8KKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBvdXRwdXQgYXR0cmlidXRlIGZyb20gYSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0QXR0cmlidXRlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgb3V0cHV0c3RyZWFtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgaWYgKFNURE9VVC5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEtlZXBBbGl2ZU91dHB1dFN0cmVhbShTeXN0ZW0ub3V0KTsKKyAgICAgICAgfSBlbHNlIGlmIChTVERFUlIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBLZWVwQWxpdmVPdXRwdXRTdHJlYW0oU3lzdGVtLmVycik7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBmID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKHZhbHVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9SSlVuaXRUYXNrLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9SSlVuaXRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1ZDVlMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L1JKVW5pdFRhc2suamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0OworCitpbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLmkxOG4uUmVzb3VyY2VNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5pMThuLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisvKioKKyAqIFRoZSBjb3JlIEpVbml0IHRhc2suCisgKgorICovCitwdWJsaWMgY2xhc3MgUkpVbml0VGFzayBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUmVzb3VyY2VzIFJFUyA9CisgICAgICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0UGFja2FnZVJlc291cmNlcyhSSlVuaXRUYXNrLmNsYXNzKTsKKworICAgIC8qKiBwb3J0IHRvIHJ1biB0aGUgc2VydmVyIG9uICovCisgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IC0xOworCisgICAgLyoqIHRpbWVvdXQgcGVyaW9kIGluIG1zICovCisgICAgcHJpdmF0ZSBsb25nIHRpbWVvdXQgPSAtMTsKKworICAgIC8qKiBjbGllbnQgY29uZmlndXJhaXRvbiBlbGVtZW50ICovCisgICAgcHJpdmF0ZSBDbGllbnRFbGVtZW50IGNsaWVudCA9IG51bGw7CisKKyAgICAvKiogc2VydmVyIGNvbmZpZ3VyYXRpb24gZWxlbWVudCAqLworICAgIHByaXZhdGUgU2VydmVyRWxlbWVudCBzZXJ2ZXIgPSBudWxsOworCisvLyB0YXNrIGltcGxlbWVudGF0aW9uCisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsICYmIHNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgc3RhdGU6IG5lZWQgdG8gYmUgc2VydmVyLCBjbGllbnQgb3IgYm90aCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gMSkgc2VydmVyIGFuZCBjbGllbnQKKyAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsICYmIGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBTZXJ2ZXJXb3JrZXIgd29ya2VyID0gbmV3IFNlcnZlcldvcmtlcigpOworICAgICAgICAgICAgd29ya2VyLnN0YXJ0KCk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZSgpOworICAgICAgICAgICAgRXhjZXB0aW9uIGNhdWdodCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdvcmtlci5qb2luKCk7CisgICAgICAgICAgICAgICAgY2F1Z2h0ID0gd29ya2VyLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgY2F1Z2h0ID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXVnaHQgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNhdWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyAyKSBzZXJ2ZXIgb25seSAod2FpdGluZyBmb3IgY2xpZW50KQorICAgICAgICBpZiAoc2VydmVyICE9IG51bGwgJiYgY2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHNlcnZlci5leGVjdXRlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyAzKSBjbGllbnQgb25seSAoY29ubmVjdGluZyB0byBzZXJ2ZXIpCisgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCAmJiBjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgY2xpZW50LmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworLy8gQW50IGJlYW4gYWNjZXNzb3JzCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgYSBuZXcgY2xpZW50IGluIGNoYXJnZSBvZiBydW5uaW5nIHRlc3RzIGFuZCBzZW5kaW5nCisgICAgICogdGhlIHJlc3VsdHMgdG8gdGhlIHNlcnZlciB0aGF0IGNvbGxlY3QgdGhlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50RWxlbWVudCBjcmVhdGVDbGllbnQoKSB7CisgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgY2xpZW50ID0gbmV3IENsaWVudEVsZW1lbnQodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgYSBuZXcgY2xpZW50IGluIGNoYXJnZSBvZiBydW5uaW5nIHRlc3RzIGFuZCBzZW5kaW5nCisgICAgICogdGhlIHJlc3VsdHMgdG8gdGhlIHNlcnZlciB0aGF0IGNvbGxlY3QgdGhlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmVyRWxlbWVudCBjcmVhdGVTZXJ2ZXIoKSB7CisgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyID0gbmV3IFNlcnZlckVsZW1lbnQodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9CisKKworICAgIC8qKiB0aGUgd29ya2VyIHRvIHJ1biB0aGUgc2VydmVyIG9uICovCisgICAgY2xhc3MgU2VydmVyV29ya2VyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBFeGNlcHRpb24gY2F1Z2h0ID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZlci5leGVjdXRlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNhdWdodCA9IGU7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGNhdWdodDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvUmVzb3VyY2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhNDcwZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMyBAQAorIyB0YXNrCit0YXNrLnByb2Nlc3MtY21kbGluZS5sb2cgPSBFeGVjdXRpbmcgezB9Cit0YXNrLnByb2Nlc3MtZmFpbGVkLmVycm9yID0gUHJvY2VzcyBmYWlsZWQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvUmVzdWx0Rm9ybWF0dGVyRWxlbWVudC5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvUmVzdWx0Rm9ybWF0dGVyRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTYzNGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9SZXN1bHRGb3JtYXR0ZXJFbGVtZW50LmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuZm9ybWF0dGVyLkZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworCisvKioKKyAqIEFuIGVsZW1lbnQgcmVwcmVzZW50aW5nIGEgPHR0PkZvcm1hdHRlcjwvdHQ+CisgKgorICogPHByZT4KKyAqIDwhRUxFTUVOVCBmb3JtYXR0ZXIgKGZpbHRlcikqPgorICogPCFBVFRMSVNUIGZvcm1hdHRlciB0eXBlIChwbGFpbnx4bWx8YnJpZWYpICNSRVFVSVJFRD4KKyAqIDwhQVRUTElTVCBmb3JtYXR0ZXIgY2xhc3NuYW1lIENEQVRBICNSRVFVSVJFRD4KKyAqIDwhQVRUTElTVCBmb3JtYXR0ZXIgZXh0ZW5zaW9uIENEQVRBICNJTVBMSUVEPgorICogPCFBVFRMSVNUIGZvcm1hdHRlciB1c2VmaWxlICh5ZXN8bm8pIG5vPgorICogPC9wcmU+CisgKgorICoKKyAqIEBzZWUgUkpVbml0VGFzaworICogQHNlZSBGb3JtYXR0ZXIKKyAqLworcHVibGljIGNsYXNzIFJlc3VsdEZvcm1hdHRlckVsZW1lbnQgeworCisgICAgLyoqIG91dHB1dCBzdHJlYW0gZm9yIHRoZSBmb3JtYXR0ZXIgKi8KKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgS2VlcEFsaXZlT3V0cHV0U3RyZWFtKFN5c3RlbS5vdXQpOworCisgICAgLyoqIGZvcm1hdHRlciBjbGFzc25hbWUgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7CisKKyAgICAvKiogdGhlIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhpcyBmb3JtYXR0ZXIgKi8KKyAgICBwcml2YXRlIFZlY3RvciBmaWx0ZXJzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIHRoZSBwYXJhbWV0ZXJzIHNldCBmb3IgY29uZmlndXJhdGlvbiBwdXJwb3NlcyAqLworICAgIHByaXZhdGUgVmVjdG9yIHBhcmFtcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIHNldCBhbiBleGlzdGluZyB0eXBlIG9mIGZvcm1hdHRlci4KKyAgICAgKiBAc2VlIFR5cGVBdHRyaWJ1dGUKKyAgICAgKiBAc2VlICNzZXRDbGFzc25hbWUoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZUF0dHJpYnV0ZSB0eXBlKSB7CisgICAgICAgIHNldENsYXNzbmFtZSh0eXBlLmdldENsYXNzTmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4gU2V0IG5hbWUgb2YgY2xhc3MgdG8gYmUgdXNlZCBhcyB0aGUgZm9ybWF0dGVyLgorICAgICAqCisgICAgICogPHA+IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgPGNvZGU+Rm9ybWF0dGVyPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHRpbmcgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmaWx0ZXJzIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCisgICAgICogQHNlZSAjYWRkRmlsdGVyKEZpbHRlckVsZW1lbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVycyhTdHJpbmcgZmlsdGVycykgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpbHRlcnMsICIsIik7CisgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIEZpbHRlckVsZW1lbnQgZmUgPSBuZXcgRmlsdGVyRWxlbWVudCgpOworICAgICAgICAgICAgRmlsdGVyRWxlbWVudC5GaWx0ZXJBdHRyaWJ1dGUgZmEgPSBuZXcgRmlsdGVyRWxlbWVudC5GaWx0ZXJBdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgIGZhLnNldFZhbHVlKHN0Lm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIGZlLnNldFR5cGUoZmEpOworICAgICAgICAgICAgYWRkRmlsdGVyKGZlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbHRlciB0byB0aGlzIGZvcm1hdHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoRmlsdGVyRWxlbWVudCBmZSkgeworICAgICAgICBmaWx0ZXJzLmFkZEVsZW1lbnQoZmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIGZvciBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtKFBhcmFtZXRlciBwYXJhbSkgeworICAgICAgICBwYXJhbXMuYWRkRWxlbWVudChwYXJhbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIGZvcm1hdHRlciBzaG91bGQgbG9nIHRvIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dEF0dHJpYnV0ZSBvdXRwdXQpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXRwdXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIHRoZSBGb3JtYXR0ZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIGVsZW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZvcm1hdHRlciBjcmVhdGVGb3JtYXR0ZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoY2xhc3NuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigieW91IG11c3Qgc3BlY2lmeSB0eXBlIG9yIGNsYXNzbmFtZSIpOworICAgICAgICB9CisgICAgICAgIEZvcm1hdHRlciBmID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOworICAgICAgICAgICAgaWYgKCFGb3JtYXR0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oY2xhenogKyAiIGlzIG5vdCBhIEZvcm1hdHRlciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZiA9IChGb3JtYXR0ZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3cmFwIGZpbHRlcnMgaW4gdGhlIHJldmVyc2Ugb3JkZXI6IGZpcnN0ID0gdG9wLCBsYXN0ID0gYm90dG9tLgorICAgICAgICBmb3IgKGludCBpID0gZmlsdGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgRmlsdGVyRWxlbWVudCBmZSA9IChGaWx0ZXJFbGVtZW50KSBmaWx0ZXJzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGYgPSBmZS5jcmVhdGVGaWx0ZXJGb3JtYXR0ZXIoZik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgcHJvcGVydGllcyBmcm9tIHBhcmFtZXRlcnMKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSAoUGFyYW1ldGVyKSBwYXJhbXMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgcHJvcHMucHV0KHBhcmFtLmdldE5hbWUoKSwgcGFyYW0uZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXQgaXMgYXNzdW1lZCBoZXJlIHRoYXQgdGhlIGZpbHRlcnMgYXJlIGNoYWluaW5nIHRpbCB0aGUKKyAgICAgICAgLy8gd3JhcHBlZCBmb3JtYXR0ZXIuCisgICAgICAgIGYuaW5pdChwcm9wcyk7CisgICAgICAgIHJldHVybiBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgInBsYWluIiwgInhtbCIgYW5kICJicmllZiIuCisgICAgICogPHA+IFVzZSB0byBlbnVtZXJhdGUgb3B0aW9ucyBmb3IgPHR0PnR5cGU8L3R0PiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBUeXBlQXR0cmlidXRlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIFZBTFVFUyA9IHsicGxhaW4iLCAieG1sIiwgImJyaWVmIn07CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIENMQVNTTkFNRVMgPSB7CisgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LmZvcm1hdHRlci5QbGFpbkZvcm1hdHRlciIsCisgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LmZvcm1hdHRlci5YTUxGb3JtYXR0ZXIiLAorICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5mb3JtYXR0ZXIuQnJpZWZGb3JtYXR0ZXIiCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRVM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBDTEFTU05BTUVTW2dldEluZGV4KCldOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIGEgcGFyYW1ldGVyIHRoYXQgYmUgdXNlZCB0byBjb25maWd1cmUgYSBmb3JtYXR0ZXIgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFBhcmFtZXRlciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHNldFZhbHVlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9TZXJ2ZXJFbGVtZW50LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9TZXJ2ZXJFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0NTUzMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L1NlcnZlckVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuZm9ybWF0dGVyLkZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlLlNlcnZlcjsKKworLyoqCisgKiBBbiBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogPHByZT4KKyAqIDwhRUxFTUVOVCBzZXJ2ZXIgKGZvcm1hdHRlcikqPgorICogPCFBVFRMSVNUIHNlcnZlciBwb3J0IG51bWVyaWMgNjY2Nj4KKyAqIDwhQVRUTElTVCBzZXJ2ZXIgaGFsdG9uZmFpbHVyZSAoeWVzfG5vKSBubz4KKyAqIDwhQVRUTElTVCBzZXJ2ZXIgaGFsdG9uZXJyb3IgKHllc3xubykgbm8+CisgKiA8L3ByZT4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2ZXJFbGVtZW50IGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCB7CisKKyAgICAvKiogZm9ybWF0dGVycyB0aGF0IHdyaXRlIHRoZSB0ZXN0cyByZXN1bHRzICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgZm9ybWF0dGVycyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIC8qKiBwb3J0IHRvIHJ1biB0aGUgc2VydmVyIG9uLiBEZWZhdWx0IHRvIDY2NjYgKi8KKyAgICBwcml2YXRlIGludCBwb3J0ID0gNjY2NjsKKworICAgIC8qKiBzdG9wIHRoZSBjbGllbnQgcnVuIGlmIGEgZmFpbHVyZSBvY2N1cnMgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFsdE9uRmFpbHVyZSA9IGZhbHNlOworCisgICAgLyoqIHN0b3AgdGhlIGNsaWVudCBydW4gaWYgYW4gZXJyb3Igb2NjdXJzICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhbHRPbkVycm9yID0gZmFsc2U7CisKKyAgICAvKiogdGhlIHBhcmVudCB0YXNrICovCisgICAgcHJpdmF0ZSBSSlVuaXRUYXNrIHBhcmVudDsKKworICAgIHByaXZhdGUgU2VydmVyIHNlcnZlcjsKKworICAgIC8qKiBjcmVhdGUgYSBuZXcgc2VydmVyICovCisgICAgcHVibGljIFNlcnZlckVsZW1lbnQoUkpVbml0VGFzayB2YWx1ZSkgeworICAgICAgICBwYXJlbnQgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKiogc3RhcnQgdGhlIHNlcnZlciBhbmQgYmxvY2sgdW50aWwgY2xpZW50IGhhcyBmaW5pc2hlZCAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlcnZlci4uLgorICAgICAgICBzZXJ2ZXIgPSBuZXcgU2VydmVyKHBvcnQpOworICAgICAgICBmaW5hbCBpbnQgZm9ybWF0dGVyQ291bnQgPSBmb3JtYXR0ZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYXR0ZXJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBGb3JtYXR0ZXIgZiA9IChGb3JtYXR0ZXIpIGZvcm1hdHRlcnMuZ2V0KGkpOworICAgICAgICAgICAgc2VydmVyLmFkZExpc3RlbmVyKGYpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYW5kIHJ1biBpdC4gSXQgd2lsbCBzdG9wIG9uY2UgYSBjbGllbnQgaGFzIGZpbmlzaGVkLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KGZhbHNlKTsgLy8gZG8gbm90IGxvb3AKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2VydmVyLnNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogc2V0IHRoZSBwb3J0IHRvIGxpc3RlbiB0byAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHZhbHVlKSB7CisgICAgICAgIHBvcnQgPSB2YWx1ZTsKKyAgICB9CisKKy8vQGZpeG1lICBsb2dpYyBwcm9ibGVtIGhlcmUsIHNob3VsZCB0aGUgc2VydmVyIHNheSB0byB0aGUgY2xpZW50CisvLyB0aGF0IHRoZXJlIGl0IHNob3VsZCBzdG9wIG9yIHNob3VsZCB0aGUgY2xpZW50IGRvIGl0IGl0c2VsZiA/CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIYWx0T25GYWlsdXJlKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgaGFsdE9uRmFpbHVyZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhhbHRPbkVycm9yKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgaGFsdE9uRXJyb3IgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKiogYWRkIGEgbmV3IGZvcm1hdHRlciBlbGVtZW50ICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEZvcm1hdHRlcihSZXN1bHRGb3JtYXR0ZXJFbGVtZW50IGZlKSB7CisgICAgICAgIEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBmZS5jcmVhdGVGb3JtYXR0ZXIoKTsKKyAgICAgICAgZm9ybWF0dGVycy5hZGQoZm9ybWF0dGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9UZXN0RWxlbWVudC5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvVGVzdEVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTRlZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvVGVzdEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICogQSBzaW1wbGUgdGVzdCBlbGVtZW50LgorICoKKyAqLworcHVibGljIGNsYXNzIFRlc3RFbGVtZW50IGV4dGVuZHMgQmFzZVRlc3RFbGVtZW50IHsKKworICAgIC8qKiBjbGFzc25hbWUgb2YgSlVuaXQgdGVzdCAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKy8vQGZpeG1lLCBhIHBhdGggaXMgbmVlZGVkIGZvciBhIHRlc3QuCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0VGVzdHMoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlFbnVtZXJhdGlvbihuZXcgU3RyaW5nW117bmFtZX0pOworICAgIH0KKworLy8gQW50IGJlYW4gc2V0dGVycworCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvV2F0Y2hkb2dUZXN0LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9XYXRjaGRvZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFiOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvV2F0Y2hkb2dUZXN0LmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJKYWthcnRhLVJlZ2V4cCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdERlY29yYXRvcjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7CisKKy8qKgorICogQSBUZXN0IGRlY29yYXRvciB0aGF0IGFsbG93cyB0byBjYW5jZWwgYSB0ZXN0IGlmIGl0IGV4Y2VlZHMKKyAqIGEgY2VydGFpbiB0aW1lLiBJdCBjYW4gYmUgdXNlZCBnbG9iYWxseSBvciBpbmRpdmlkdWFsbHkgb3ZlcgorICogZWFjaCB0ZXN0Y2FzZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBXYXRjaGRvZ1Rlc3QgZXh0ZW5kcyBUZXN0RGVjb3JhdG9yIHsKKworICAgIC8qKiB0aGUgdGltZSBvdXQgZGVsYXkgaW4gbXNlY3MgKi8KKyAgICBwcml2YXRlIGxvbmcgdGltZU91dDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB3YXRjaGRvZy4KKyAgICAgKiBAcGFyYW0gdGVzdCB0aGUgdGVzdCB0byB3YXRjaCBmb3IKKyAgICAgKiBAcGFyYW0gbXNlY3MgdGhlIHRpbWUgb3V0IGRlbGF5IGluIG1zZWNzLgorICAgICAqLworICAgIHB1YmxpYyBXYXRjaGRvZ1Rlc3QoVGVzdCB0ZXN0LCBsb25nIG1zZWNzKSB7CisgICAgICAgIHN1cGVyKHRlc3QpOworICAgICAgICB0aW1lT3V0ID0gbXNlY3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFRocmVhZCB3b3JrZXIgPSBjcmVhdGVXb3JrZXIocmVzdWx0KTsKKyAgICAgICAgd29ya2VyLnN0YXJ0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHdhaXQgYXQgbW9zdCB0aGUgdGltZU91dCB0aW1lLgorICAgICAgICAgICAgd29ya2VyLmpvaW4odGltZU91dCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSB0aHJlYWQgaXMgc3RpbGwgYWxpdmUsIGl0IG11c3QgYmUga2lsbGVkLgorICAgICAgICAgICAgaWYgKHdvcmtlci5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrZXIuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEZhaWx1cmUoZ2V0VGVzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJUaW1lZCBvdXQgYWZ0ZXIgIiArIHRpbWVPdXQgKyAibXMiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdvcmtlci5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcihnZXRUZXN0KCksIGUpOworICAgICAgICAgICAgcmVzdWx0LnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBjcmVhdGUgYSBuZXcgd29ya2VyIHRocmVhZCAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgY3JlYXRlV29ya2VyKGZpbmFsIFRlc3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFRocmVhZCB3b3JrZXIgPSBuZXcgVGhyZWFkKCJKVW5pdCBUZXN0IFdvcmtlciIpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBnZXRUZXN0KCkucnVuKHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiB3b3JrZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9aaXBTY2FubmVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9aaXBTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiNDgzNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L1ppcFNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworCisvKioKKyAqIFByb3ZpZGUgYSB3YXkgdG8gc2NhbiBlbnRyaWVzIGluIGEgemlwIGZpbGUuIE5vdGUgdGhhdCBpdCBleHRlbmRzCisgKiBEaXJlY3RvcnlTY2FubmVyIHRvIG1ha2UgdXNlIG9mIHByb3RlY3RlZCBtZXRob2RzIGJ1dCBpbXBsZW1lbnRhdGlvbgorICogbWF5IG5vdCBiZSB2YWxpZCBmb3Igc29tZSBtZXRob2RzLgorICogPHA+CisgKiB0aGUgc2V0QmFzZURpcigpIG11c3QgYmUgY2FsbGVkIHRvIHNldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBhcmNoaXZlCisgKiBmaWxlICguamFyIG9yIC56aXApLgorICogPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIFppcFNjYW5uZXIgZXh0ZW5kcyBEaXJlY3RvcnlTY2FubmVyIHsKKyAgICBwdWJsaWMgWmlwU2Nhbm5lcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmdbXSBleGNsdWRlcykgeworICAgICAgICBzdXBlci5zZXRFeGNsdWRlcyhleGNsdWRlcyk7CisgICAgICAgIG5vcm1hbGl6ZSh0aGlzLmV4Y2x1ZGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmdbXSBpbmNsdWRlcykgeworICAgICAgICBzdXBlci5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7CisgICAgICAgIG5vcm1hbGl6ZSh0aGlzLmluY2x1ZGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBub3JtYWxpemUgYSBzZXQgb2YgcGF0aHMgc28gdGhhdCBpdCB1c2VzIC8gb3RoZXJ3aXNlIG1hdGNoaW5nIHdpbGwKKyAgICAgKiBmYWlsIGJlYXV0aWZ1bGx5IHNpbmNlIGFyY2hpdmVzIHVzZSAvIHRvIGRlbm90ZSBhIHBhdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbm9ybWFsaXplKFN0cmluZ1tdIGZpbGVzKSB7CisgICAgICAgIGlmIChmaWxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmlsZXNbaV0gPSBmaWxlc1tpXS5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FucyB0aGUgYXJjaGl2ZSBmb3IgZmlsZXMgdGhhdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5jbHVkZQorICAgICAqIHBhdHRlcm4sIGFuZCBkb24ndCBtYXRjaCBhbnkgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gdGhlIHppcCBmaWxlIHdhcyBzZXQgaW5jb3JyZWNseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNjYW4oKSB7CisgICAgICAgIGlmIChiYXNlZGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIHppcGZpbGUgc2V0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFiYXNlZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ6aXBmaWxlICIgKyBiYXNlZGlyCisgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICB9CisgICAgICAgIGlmIChiYXNlZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInppcGZpbGUgIiArIGJhc2VkaXIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIGZpbGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmNsdWRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBObyBpbmNsdWRlcyBzdXBwbGllZCwgc28gc2V0IGl0IHRvICdtYXRjaGVzIGFsbCcKKyAgICAgICAgICAgIGluY2x1ZGVzID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGluY2x1ZGVzWzBdID0gIioqIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhjbHVkZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZXhjbHVkZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisKKyAgICAgICAgZmlsZXNJbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZmlsZXNOb3RJbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZmlsZXNFeGNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZGlyc0luY2x1ZGVkID0gbmV3IFZlY3RvcigpOworICAgICAgICBkaXJzTm90SW5jbHVkZWQgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGRpcnNFeGNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICBpZiAoaXNJbmNsdWRlZCgiIikpIHsKKyAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZCgiIikpIHsKKyAgICAgICAgICAgICAgICBkaXJzSW5jbHVkZWQuYWRkRWxlbWVudCgiIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpcnNFeGNsdWRlZC5hZGRFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpcnNOb3RJbmNsdWRlZC5hZGRFbGVtZW50KCIiKTsKKyAgICAgICAgfQorICAgICAgICBzY2FuZGlyKGJhc2VkaXIsICIiLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuZGlyKEZpbGUgZmlsZSwgU3RyaW5nIHZwYXRoLCBib29sZWFuIGZhc3QpIHsKKyAgICAgICAgWmlwRmlsZSB6aXAgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgemlwID0gbmV3IFppcEZpbGUoZmlsZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgRW51bWVyYXRpb24gZW50cmllcyA9IHppcC5lbnRyaWVzKCk7CisgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisgICAgICAgICAgICAvLyBAZml4bWUgZG8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZW50cmllcyB0aGF0IHN0YXJ0cworICAgICAgICAgICAgLy8gd2l0aCAuIG9yIC4vID8KKyAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzSW5jbHVkZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJzSW5jbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmdJbmNsdWRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZGlyc0V4Y2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBldmVyeXRoaW5nSW5jbHVkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZGlyc05vdEluY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlZChuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRXhjbHVkZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzSW5jbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmdJbmNsdWRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNFeGNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlcnl0aGluZ0luY2x1ZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzTm90SW5jbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9CYXNlRm9ybWF0dGVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvQmFzZUZvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTljZTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvQmFzZUZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5mb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGUuVGVzdFJ1bkV2ZW50OworCisvKioKKyAqIFByb3ZpZGUgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgdG8gZmFjdG9yaXplCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUZvcm1hdHRlciBpbXBsZW1lbnRzIEZvcm1hdHRlciB7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFByb3BlcnRpZXMgcHJvcHMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0U3RhcnRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWx1cmUoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdEVycm9yKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN1aXRlU3RhcnRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdWl0ZUVuZGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJ1blN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uUnVuRW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uUnVuU3RvcHBlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvQmFzZVN0cmVhbUZvcm1hdHRlci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvZm9ybWF0dGVyL0Jhc2VTdHJlYW1Gb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjA4YjAxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvZm9ybWF0dGVyL0Jhc2VTdHJlYW1Gb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LmZvcm1hdHRlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5LZWVwQWxpdmVPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LnJlbW90ZS5UZXN0UnVuRXZlbnQ7CisKKy8qKgorICogQmFzZSBmb3JtYXR0ZXIgcHJvdmlkaW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gZGVhbCB3aXRoCisgKiBlaXRoZXIgc3Rkb3V0IG9yIGEgZmlsZS4KKyAqIDxwPgorICogVGhlIGZpbGUgaXMgc3BlY2lmaWVkIGJ5IGluaXRpYWxpemluZyB0aGUgZm9ybWF0dGVyIHdpdGgKKyAqIGEgZmlsZXBhdGggbWFwcGVkIGJ5IHRoZSBrZXkgJ2ZpbGUnLgorICogPC9wPgorICogPHA+CisgKiBpZiBubyBmaWxlIGtleSBleGlzdHMgaW4gdGhlIHByb3BlcnRpZXMsIGl0IGRlZmF1bHRzIHRvIHN0ZG91dC4KKyAqIDwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlU3RyZWFtRm9ybWF0dGVyIGV4dGVuZHMgQmFzZUZvcm1hdHRlciB7CisKKyAgICAvKiogdGhlIGtleSB1c2VkIHRvIHNwZWNpZml5IGEgZmlsZXBhdGggKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX0tFWSA9ICJmaWxlIjsKKworICAgIC8qKiB3cml0ZXIgdG8gb3V0cHV0IHRoZSBkYXRhIHRvICovCisgICAgcHJpdmF0ZSBQcmludFdyaXRlciB3cml0ZXI7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICBjbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoUHJvcGVydGllcyBwcm9wcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGUgPSBwcm9wcy5nZXRQcm9wZXJ0eShGSUxFX0tFWSk7CisgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7CisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZml4bWUgbmVlZCB0byByZXNvbHZlIHRoZSBmaWxlICEhISEKKyAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9zID0gbmV3IEtlZXBBbGl2ZU91dHB1dFN0cmVhbShTeXN0ZW0ub3V0KTsKKyAgICAgICAgfQorICAgICAgICBzZXRPdXRwdXQob3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gd3JhcCB0aGUgc3RyZWFtIG92ZXIgYW4gVVRGOCBidWZmZXJlZCB3cml0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSB2YWx1ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZG8gbm90IGJ1ZmZlciBidXQgZmx1c2ggZWFjaCBsaW5lLgorICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIodmFsdWUsICJVVEY4IiksIHRydWUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbgorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SdW5FbmRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHdyaXRlciB1c2VkIHRvIHByaW50IGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHdyaXRlcjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9CcmllZkZvcm1hdHRlci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvZm9ybWF0dGVyL0JyaWVmRm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzMDNkNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9CcmllZkZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5mb3JtYXR0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmF2YWxvbi5leGNhbGlidXIuaTE4bi5SZXNvdXJjZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLmkxOG4uUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGUuVGVzdFJ1bkV2ZW50OworCisvKioKKyAqIERpc3BsYXkgYWRkaXRpb25hbCBtZXNzYWdlcyBmcm9tIGEgPHR0PlN1bW1hcnlGb3JtYXR0ZXI8L3R0PgorICogZm9yIGZhaWx1cmVzIGFuZCBlcnJvcnMuCisgKgorICovCitwdWJsaWMgY2xhc3MgQnJpZWZGb3JtYXR0ZXIgZXh0ZW5kcyBTdW1tYXJ5Rm9ybWF0dGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFJlc291cmNlcyBSRVMgPQorICAgICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldFBhY2thZ2VSZXNvdXJjZXMoQnJpZWZGb3JtYXR0ZXIuY2xhc3MpOworCisgICAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBSRVMuZ2V0U3RyaW5nKCJicmllZi5zdGF0dXMtZmFpbHVyZS5tc2ciLCBldnQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGV2dC5nZXRFcnJvcigpLmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgIGdldFdyaXRlcigpLnByaW50bG4obXNnKTsKKyAgICAgICAgc3VwZXIub25UZXN0RmFpbHVyZShldnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdEVycm9yKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IFJFUy5nZXRTdHJpbmcoImJyaWVmLnN0YXR1cy1lcnJvci5tc2ciLCBldnQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGV2dC5nZXRFcnJvcigpLmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgIGdldFdyaXRlcigpLnByaW50bG4obXNnKTsKKyAgICAgICAgc3VwZXIub25UZXN0RXJyb3IoZXZ0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvRmlsdGVyRm9ybWF0dGVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvRmlsdGVyRm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5OWQ3MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9GaWx0ZXJGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LmZvcm1hdHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LnJlbW90ZS5UZXN0UnVuRXZlbnQ7CisKKy8qKgorICogQSBiYXNlIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIGRhdGEuCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyRm9ybWF0dGVyIGltcGxlbWVudHMgRm9ybWF0dGVyIHsKKworICAgIHByaXZhdGUgRm9ybWF0dGVyIGZvcm1hdHRlcjsKKworICAgIHByb3RlY3RlZCBGaWx0ZXJGb3JtYXR0ZXIoRm9ybWF0dGVyIGZvcm1hdHRlcikgeworICAgICAgICBzZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKTsKKyAgICB9CisKKyAgICAvKiogZmluYWwgdG8gZW5mb3JjZSBjaGFpbmluZyBvZiBpbml0aWFsaXphdGlvbiAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoUHJvcGVydGllcyBwcm9wcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZm9ybWF0dGVyLmluaXQocHJvcHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3VpdGVTdGFydGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgZm9ybWF0dGVyLm9uU3VpdGVTdGFydGVkKGV2dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdWl0ZUVuZGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgZm9ybWF0dGVyLm9uU3VpdGVFbmRlZChldnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdFN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBmb3JtYXR0ZXIub25UZXN0U3RhcnRlZChldnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdEVuZGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgZm9ybWF0dGVyLm9uVGVzdEVuZGVkKGV2dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIGZvcm1hdHRlci5vblRlc3RGYWlsdXJlKGV2dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RXJyb3IoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBmb3JtYXR0ZXIub25UZXN0RXJyb3IoZXZ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJ1blN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBmb3JtYXR0ZXIub25SdW5TdGFydGVkKGV2dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SdW5FbmRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIGZvcm1hdHRlci5vblJ1bkVuZGVkKGV2dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SdW5TdG9wcGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgZm9ybWF0dGVyLm9uUnVuRW5kZWQoZXZ0KTsKKyAgICB9CisKKyAgICAvKiogc2V0IHRoZSB3cmFwcGVkIGZvcm1hdHRlciAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEZvcm1hdHRlcihGb3JtYXR0ZXIgdmFsdWUpIHsKKyAgICAgICAgZm9ybWF0dGVyID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqIHJldHVybiB0aGUgd3JhcHBlZCBmb3JtYXR0ZXIgKi8KKyAgICBwcm90ZWN0ZWQgRm9ybWF0dGVyIGdldEZvcm1hdHRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdHRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvRmlsdGVyU3RhY2tGb3JtYXR0ZXIuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9GaWx0ZXJTdGFja0Zvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Y2I5MTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvRmlsdGVyU3RhY2tGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LmZvcm1hdHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGUuVGVzdFJ1bkV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGUuRXhjZXB0aW9uRGF0YTsKKworLyoqCisgKiBGaWx0ZXJlZCBGb3JtYXR0ZXIgdGhhdCBzdHJpcHMgb3V0IHVud2FudGVkIHN0YWNrIGZyYW1lcyBmcm9tIHRoZSBmdWxsCisgKiBzdGFjayB0cmFjZSwgZm9yIGluc3RhbmNlIGl0IHdpbGwgZmlsdGVyIHRoZSBsaW5lcyBjb250YWluaW5nIHRoZQorICogZm9sbG93aW5nIG1hdGNoZXM6CisgKiA8cHJlPgorICogICBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UKKyAqICAganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQKKyAqICAganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZQorICogICBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LgorICogICBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXIKKyAqICAganVuaXQuYXd0dWkuVGVzdFJ1bm5lcgorICogICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcgorICogICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKAorICogICBvcmcuYXBhY2hlLnRvb2xzLmFudC4KKyAqIDwvcHJlPgorICogUmVtb3ZpbmcgYWxsIHRoZSBhYm92ZSB3aWxsIGhlbHAgdG8gbWFrZSBzdGFja3RyYWNlIG1vcmUgcmVhZGFibGUuCisgKgorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyU3RhY2tGb3JtYXR0ZXIgZXh0ZW5kcyBGaWx0ZXJGb3JtYXR0ZXIgeworCisgICAgLyoqIHRoZSBzZXQgb2YgbWF0Y2hlcyB0byBsb29rIGZvciBpbiBhIHN0YWNrIHRyYWNlICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gREVGQVVMVF9UUkFDRV9GSUxURVJTID0gbmV3IFN0cmluZ1tdeworICAgICAgICAianVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIiwKKyAgICAgICAgImp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0IiwKKyAgICAgICAgImp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUiLAorICAgICAgICAianVuaXQuZnJhbWV3b3JrLkFzc2VydC4iLCAvLyBkb24ndCBmaWx0ZXIgQXNzZXJ0aW9uRmFpbHVyZQorICAgICAgICAianVuaXQuc3dpbmd1aS5UZXN0UnVubmVyIiwKKyAgICAgICAgImp1bml0LmF3dHVpLlRlc3RSdW5uZXIiLAorICAgICAgICAianVuaXQudGV4dHVpLlRlc3RSdW5uZXIiLAorICAgICAgICAiamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZSgiLAorICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQuIgorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGZpbHRlcnMgPSBnZXRGaWx0ZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDx0dD5GaWx0ZXJTdGFja0Zvcm1hdHRlcjwvdHQ+CisgICAgICogQHBhcmFtIGZvcm1hdHRlciB0aGUgZm9ybWF0dGVyIHRvIGJlIGZpbHRlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJTdGFja0Zvcm1hdHRlcihGb3JtYXR0ZXIgZm9ybWF0dGVyKSB7CisgICAgICAgIHN1cGVyKGZvcm1hdHRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIGZpbHRlckV2ZW50KGV2dCk7CisgICAgICAgIHN1cGVyLm9uVGVzdEZhaWx1cmUoZXZ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RFcnJvcihUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIGZpbHRlckV2ZW50KGV2dCk7CisgICAgICAgIHN1cGVyLm9uVGVzdEZhaWx1cmUoZXZ0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaWx0ZXJFdmVudChUZXN0UnVuRXZlbnQgZXZ0KXsKKyAgICAgICAgU3RyaW5nIGZpbHRlcmVkVHJhY2UgPSBmaWx0ZXIoZXZ0LmdldEVycm9yKCkuZ2V0U3RhY2tUcmFjZSgpKTsKKyAgICAgICAgRXhjZXB0aW9uRGF0YSBlcnJvciA9IG5ldyBFeGNlcHRpb25EYXRhKAorICAgICAgICAgICAgICAgIGV2dC5nZXRFcnJvcigpLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICBldnQuZ2V0RXJyb3IoKS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgZmlsdGVyZWRUcmFjZSk7CisgICAgICAgIGV2dC5zZXRFcnJvcihlcnJvcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBmaWx0ZXIoU3RyaW5nIHRyYWNlKXsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZSwgIlxyXG4iKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodHJhY2UubGVuZ3RoKCkpOworICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHN0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKGFjY2VwdChsaW5lKSkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZSkuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBsaW5lIHNob3VsZCBiZSBhY2NlcHRlZC4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBiZSBjaGVjayBmb3IgYWNjZXB0YW5jZS4KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIGxpbmUgaXMgYWNjZXB0ZWQsIDx0dD5mYWxzZTwvdHQ+IGlmIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKGZpbHRlcnNbaV0pID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXJzIHRvIHVzZSBmb3IgdGhpcworICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZ2V0RmlsdGVycygpeworICAgICAgICAvLyBAZml4bWUgaGFjayBmb3Igbm93LCBuZWVkIHNvbWV0aGluZyBiZXR0ZXIuCisgICAgICAgIC8vIHVzaW5nIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyA/CisgICAgICAgIFN0cmluZyBmaWx0ZXJzID0gU3lzdGVtLmdldFByb3BlcnR5KCJhbnQucmp1bml0LnN0YWNrdHJhY2UuZmlsdGVycyIpOworICAgICAgICBpZiAoZmlsdGVycyA9PSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiBERUZBVUxUX1RSQUNFX0ZJTFRFUlM7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihmaWx0ZXJzLCAiLCIpOworICAgICAgICBTdHJpbmdbXSByZXN1bHRzID0gbmV3IFN0cmluZ1sgc3QuY291bnRUb2tlbnMoKSBdOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpeworICAgICAgICAgICAgcmVzdWx0c1tpKytdID0gc3QubmV4dFRva2VuKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvRm9ybWF0dGVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvRm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4YTJkZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9Gb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuZm9ybWF0dGVyOworCitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlLlRlc3RSdW5MaXN0ZW5lcjsKKworLyoqCisgKiBUaGUgZm9ybWF0dGVyIGludGVyZmFjZS4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRm9ybWF0dGVyIGV4dGVuZHMgVGVzdFJ1bkxpc3RlbmVyIHsKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBmb3JtYXR0ZXIgd2l0aCBzb21lIGN1c3RvbSBwcm9wZXJ0aWVzCisgICAgICogRm9yIGV4YW1wbGUgaXQgY291bGQgYmUgYSBmaWxlbmFtZSwgYSBwb3J0IGFuZCBob3N0bmFtZSwKKyAgICAgKiBhIGRhdGFiYXNlLCBldGMuLi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KFByb3BlcnRpZXMgcHJvcHMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvZm9ybWF0dGVyL1BsYWluRm9ybWF0dGVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvUGxhaW5Gb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzU3MzIyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvZm9ybWF0dGVyL1BsYWluRm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5mb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGUuVGVzdFJ1bkV2ZW50OworCisvKioKKyAqIERlZmF1bHQgZm9ybWF0dGVyIHRvIHRleHQuCisgKgorICovCitwdWJsaWMgY2xhc3MgUGxhaW5Gb3JtYXR0ZXIgZXh0ZW5kcyBCYXNlU3RyZWFtRm9ybWF0dGVyIHsKKworICAgIHB1YmxpYyB2b2lkIG9uU3VpdGVTdGFydGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgZ2V0V3JpdGVyKCkucHJpbnRsbigiICBzdWl0ZTogIiArIGV2dC5nZXROYW1lKCkpOworICAgICAgICBzdXBlci5vblN1aXRlU3RhcnRlZChldnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3VpdGVFbmRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIGdldFdyaXRlcigpLnByaW50bG4oIiAgZW5kIHN1aXRlIik7CisgICAgICAgIHN1cGVyLm9uU3VpdGVFbmRlZChldnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdFN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBnZXRXcml0ZXIoKS5wcmludGxuKCIgICAgcnVubmluZyB0ZXN0OiAiICsgZXZ0LmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBnZXRXcml0ZXIoKS5wcmludGxuKCIgICAgc3VjY2VzczogIiArIGV2dC5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWx1cmUoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBnZXRXcml0ZXIoKS5wcmludGxuKCIgICAgZmFpbHVyZTogIiArIGV2dC5nZXROYW1lKCkpOworICAgICAgICBnZXRXcml0ZXIoKS5wcmludGxuKGV2dC5nZXRFcnJvcigpLmdldFN0YWNrVHJhY2UoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RXJyb3IoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBnZXRXcml0ZXIoKS5wcmludGxuKCIgICAgZXJyb3I6ICIgKyBldnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgZ2V0V3JpdGVyKCkucHJpbnRsbihldnQuZ2V0RXJyb3IoKS5nZXRTdGFja1RyYWNlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uUnVuRW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBnZXRXcml0ZXIoKS5wcmludGxuKCJydW4gZW5kZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJ1blN0b3BwZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBnZXRXcml0ZXIoKS5wcmludGxuKCJydW4gc3RvcHBlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9SZXNvdXJjZXMucHJvcGVydGllcyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9SZXNvdXJjZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmZkOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvZm9ybWF0dGVyL1Jlc291cmNlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOCBAQAorIyBTdW1tYXJ5IGZvcm1hdHRlcgorc3VpdGUuc3VtbWFyeS5tc2cgPSBUZXN0U3VpdGU6IHswfVxuVGVzdHMgcnVuOiB7MSwgbnVtYmVyLCBpbnRlZ2VyfSwgRmFpbHVyZXM6IHsyLCBudW1iZXIsIGludGVnZXJ9LCBFcnJvcnM6IHszLCBudW1iZXIsIGludGVnZXJ9LCBUaW1lIGVsYXBzZWQ6IHs0LCBudW1iZXIsIGludGVnZXJ9c1xuCitydW4uc3VtbWFyeS5tc2c9U3VtbWFyeSBUZXN0cyBydW46IHswLCBudW1iZXIsIGludGVnZXJ9LCBGYWlsdXJlczogezEsIG51bWJlciwgaW50ZWdlcn0sIEVycm9yczogezIsIG51bWJlciwgaW50ZWdlcn0sIFRpbWUgZWxhcHNlZDogezMsIG51bWJlciwgaW50ZWdlcn1zCisKKyMgQnJpZWYgZm9ybWF0dGVyCiticmllZi5zdGF0dXMtZXJyb3IubXNnID0gVGVzdENhc2U6IHswfVx0Q2F1c2VkIGFuIEVSUk9SXG57MX1cbgorYnJpZWYuc3RhdHVzLWZhaWx1cmUubXNnID0gVGVzdENhc2U6IHswfVx0RkFJTEVEXG57MX1cbgorCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvU3VtbWFyeUZvcm1hdHRlci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvZm9ybWF0dGVyL1N1bW1hcnlGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc5MTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvZm9ybWF0dGVyL1N1bW1hcnlGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuZm9ybWF0dGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5hdmFsb24uZXhjYWxpYnVyLmkxOG4uUmVzb3VyY2VNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuYXZhbG9uLmV4Y2FsaWJ1ci5pMThuLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlLlRlc3RSdW5FdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlLlRlc3RTdW1tYXJ5OworCisvKioKKyAqIERpc3BsYXkgYSBzdW1tYXJ5IG1lc3NhZ2UgYXQgdGhlIGVuZCBvZiBhIHRlc3RzdWl0ZSBzdGF0aW5nCisgKiBydW5zLCBmYWlsdXJlcywgZXJyb3JzLCBhbmQgZWxhcHNlZCB0aW1lLgorICoKKyAqLworcHVibGljIGNsYXNzIFN1bW1hcnlGb3JtYXR0ZXIgZXh0ZW5kcyBCYXNlU3RyZWFtRm9ybWF0dGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFJlc291cmNlcyBSRVMgPQorICAgICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldFBhY2thZ2VSZXNvdXJjZXMoU3VtbWFyeUZvcm1hdHRlci5jbGFzcyk7CisKKyAgICBwdWJsaWMgdm9pZCBvblN1aXRlRW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBUZXN0U3VtbWFyeSBzdW1tYXJ5ID0gZXZ0LmdldFN1bW1hcnkoKTsKKyAgICAgICAgU3RyaW5nIG1zZyA9IFJFUy5nZXRTdHJpbmcoInN1aXRlLnN1bW1hcnkubXNnIiwKKyAgICAgICAgICAgICAgICBldnQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKHN1bW1hcnkucnVuQ291bnQoKSksCisgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoc3VtbWFyeS5mYWlsdXJlQ291bnQoKSksCisgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoc3VtbWFyeS5lcnJvckNvdW50KCkpLAorICAgICAgICAgICAgICAgIG5ldyBMb25nKHN1bW1hcnkuZWxhcHNlZFRpbWUoKS8xMDAwKSk7CisgICAgICAgIGdldFdyaXRlcigpLnByaW50bG4obXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJ1bkVuZGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgVGVzdFN1bW1hcnkgc3VtbWFyeSA9IGV2dC5nZXRTdW1tYXJ5KCk7CisgICAgICAgIFN0cmluZyBtc2cgPSBSRVMuZ2V0U3RyaW5nKCJydW4uc3VtbWFyeS5tc2ciLAorICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKHN1bW1hcnkucnVuQ291bnQoKSksCisgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoc3VtbWFyeS5mYWlsdXJlQ291bnQoKSksCisgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoc3VtbWFyeS5lcnJvckNvdW50KCkpLAorICAgICAgICAgICAgICAgIG5ldyBMb25nKHN1bW1hcnkuZWxhcHNlZFRpbWUoKS8xMDAwKSk7CisgICAgICAgIGdldFdyaXRlcigpLnByaW50bG4obXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhOTcxMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9YTUxGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LmZvcm1hdHRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuSlVuaXRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LnJlbW90ZS5UZXN0UnVuRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LnJlbW90ZS5UZXN0U3VtbWFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlLkV4Y2VwdGlvbkRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5ET01FbGVtZW50V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRGF0ZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogWE1MIEZvcm1hdHRlci4gRHVlIHRvIHRoZSBuYXR1cmUgb2YgdGhlIFhNTCB3ZSBhcmUgZm9yY2VkIHRvIHN0b3JlCisgKiBldmVyeXRoaW5nIGluIG1lbW9yeSB1bnRpbCBpdCBpcyBmaW5pc2hlZC4gSXQgbWlnaHQgYmUgcmVzb3VyY2UKKyAqIGludGVuc2l2ZSB3aGVuIHJ1bm5pbmcgbG90cyBvZiB0ZXN0Y2FzZXMuCisgKgorICogPHRlc3RzdWl0ZXMgc3RvcD0idHJ1ZSI+CisgKiAgPHRlc3RzdWl0ZSBuYW1lPSIiIHRpbWU9IiI+CisgKiAgICA8dGVzdGNhc2UgbmFtZT0iIiB0aW1lPSIiPgorICogICAgICA8ZXJyb3IvPgorICogICAgPC90ZXN0Y2FzZT4KKyAqICAgIDx0ZXN0Y2FzZSBuYW1lPSIiIHRpbWU9IiI+CisgKiAgICAgIDxmYWlsdXJlLz4KKyAqICAgIDwvdGVzdGNhc2U+CisgKiAgPC90ZXN0c3VpdGU+CisgKiA8L3Rlc3RzdWl0ZXM+CisgKgorICovCitwdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGVyIGV4dGVuZHMgQmFzZVN0cmVhbUZvcm1hdHRlciB7CisKKyAgICAvKiogdGhlIHRlc3RzdWl0ZXMgZWxlbWVudCBmb3IgdGhlIGFnZ3JlZ2F0ZSBkb2N1bWVudCAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRFU1RTVUlURVMgPSAidGVzdHN1aXRlcyI7CisKKyAgICAvKiogdGhlIHRlc3RzdWl0ZSBlbGVtZW50ICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVTVFNVSVRFID0gInRlc3RzdWl0ZSI7CisKKyAgICAvKiogdGhlIHRlc3RjYXNlIGVsZW1lbnQgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBURVNUQ0FTRSA9ICJ0ZXN0Y2FzZSI7CisKKyAgICAvKiogdGhlIGVycm9yIGVsZW1lbnQgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFUlJPUiA9ICJlcnJvciI7CisKKyAgICAvKiogdGhlIGZhaWx1cmUgZWxlbWVudCAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZBSUxVUkUgPSAiZmFpbHVyZSI7CisKKyAgICAvKiogdGhlIHN5c3RlbS1lcnIgZWxlbWVudCAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNZU1RFTV9FUlIgPSAic3lzdGVtLWVyciI7CisKKyAgICAvKiogdGhlIHN5c3RlbS1vdXQgZWxlbWVudCAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNZU1RFTV9PVVQgPSAic3lzdGVtLW91dCI7CisKKyAgICAvKiogcGFja2FnZSBhdHRyaWJ1dGUgZm9yIHRoZSBhZ2dyZWdhdGUgZG9jdW1lbnQgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX1BBQ0tBR0UgPSAicGFja2FnZSI7CisKKyAgICAvKiogbmFtZSBhdHRyaWJ1dGUgZm9yIHByb3BlcnR5LCB0ZXN0Y2FzZSBhbmQgdGVzdHN1aXRlIGVsZW1lbnRzICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOworCisgICAgLyoqIHRpbWUgYXR0cmlidXRlIGZvciB0ZXN0Y2FzZSBhbmQgdGVzdHN1aXRlIGVsZW1lbnRzICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9USU1FID0gInRpbWUiOworCisgICAgLyoqIGVycm9ycyBhdHRyaWJ1dGUgZm9yIHRlc3RzdWl0ZSBlbGVtZW50cyAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfRVJST1JTID0gImVycm9ycyI7CisKKyAgICAvKiogZmFpbHVyZXMgYXR0cmlidXRlIGZvciB0ZXN0c3VpdGUgZWxlbWVudHMgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0ZBSUxVUkVTID0gImZhaWx1cmVzIjsKKworICAgIC8qKiB0ZXN0cyBhdHRyaWJ1dGUgZm9yIHRlc3RzdWl0ZSBlbGVtZW50cyAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVEVTVFMgPSAidGVzdHMiOworCisgICAgLyoqIHR5cGUgYXR0cmlidXRlIGZvciBmYWlsdXJlIGFuZCBlcnJvciBlbGVtZW50cyAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsKKworICAgIC8qKiBtZXNzYWdlIGF0dHJpYnV0ZSBmb3IgZmFpbHVyZSBlbGVtZW50cyAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTUVTU0FHRSA9ICJtZXNzYWdlIjsKKworICAgIC8qKiB0aGUgcHJvcGVydGllcyBlbGVtZW50ICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsKKworICAgIC8qKiB0aGUgcHJvcGVydHkgZWxlbWVudCAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZID0gInByb3BlcnR5IjsKKworICAgIC8qKiB2YWx1ZSBhdHRyaWJ1dGUgZm9yIHByb3BlcnR5IGVsZW1lbnRzICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9WQUxVRSA9ICJ2YWx1ZSI7CisKKyAgICAvKiogVGhlIFhNTCBkb2N1bWVudC4gKi8KKyAgICBwcml2YXRlIERvY3VtZW50IGRvYyA9IGdldERvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7CisKKyAgICAvKiogIFRoZSB3cmFwcGVyIGZvciB0aGUgd2hvbGUgdGVzdHN1aXRlLiAqLworICAgIHByaXZhdGUgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KFRFU1RTVUlURVMpOworCisgICAgcHJpdmF0ZSBFbGVtZW50IGxhc3RUZXN0RWxlbWVudCA9IG51bGw7CisgICAgcHJpdmF0ZSBUZXN0UnVuRXZlbnQgbGFzdFRlc3RFdmVudCA9IG51bGw7CisgICAgcHJpdmF0ZSBFbGVtZW50IGxhc3RTdWl0ZUVsZW1lbnQgPSBudWxsOworICAgIHByaXZhdGUgbG9uZyBwcm9ncmFtU3RhcnQ7CisKKyAgICBwdWJsaWMgdm9pZCBvblN1aXRlU3RhcnRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIFN0cmluZyBmdWxsY2xhc3NuYW1lID0gZXZ0LmdldE5hbWUoKTsKKyAgICAgICAgaW50IHBvcyA9IGZ1bGxjbGFzc25hbWUubGFzdEluZGV4T2YoJy4nKTsKKworICAgICAgICAvLyBhIG1pc3NpbmcgLiBtaWdodCBpbXBseSBubyBwYWNrYWdlIGF0IGFsbC4gRG9uJ3QgZ2V0IGZvb2xlZC4KKyAgICAgICAgU3RyaW5nIHBrZ05hbWUgPSAocG9zID09IC0xKSA/ICIiIDogZnVsbGNsYXNzbmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IChwb3MgPT0gLTEpID8gZnVsbGNsYXNzbmFtZSA6IGZ1bGxjbGFzc25hbWUuc3Vic3RyaW5nKHBvcyArIDEpOworCisgICAgICAgIEVsZW1lbnQgc3VpdGUgPSBkb2MuY3JlYXRlRWxlbWVudChURVNUU1VJVEUpOworICAgICAgICBzdWl0ZS5zZXRBdHRyaWJ1dGUoQVRUUl9OQU1FLCBjbGFzc25hbWUpOworICAgICAgICBzdWl0ZS5zZXRBdHRyaWJ1dGUoQVRUUl9QQUNLQUdFLCBwa2dOYW1lKTsKKyAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3VpdGUpOworICAgICAgICBsYXN0U3VpdGVFbGVtZW50ID0gc3VpdGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdWl0ZUVuZGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgRWxlbWVudCBzdWl0ZSA9IGxhc3RTdWl0ZUVsZW1lbnQ7CisgICAgICAgIFRlc3RTdW1tYXJ5IHN1bW1hcnkgPSBldnQuZ2V0U3VtbWFyeSgpOworICAgICAgICBzdWl0ZS5zZXRBdHRyaWJ1dGUoQVRUUl9USU1FLCBTdHJpbmcudmFsdWVPZihzdW1tYXJ5LmVsYXBzZWRUaW1lKCkvMTAwMC4wZikpOworICAgICAgICBzdWl0ZS5zZXRBdHRyaWJ1dGUoQVRUUl9URVNUUywgU3RyaW5nLnZhbHVlT2Yoc3VtbWFyeS5ydW5Db3VudCgpKSk7CisgICAgICAgIHN1aXRlLnNldEF0dHJpYnV0ZShBVFRSX0ZBSUxVUkVTLCBTdHJpbmcudmFsdWVPZihzdW1tYXJ5LmZhaWx1cmVDb3VudCgpKSk7CisgICAgICAgIHN1aXRlLnNldEF0dHJpYnV0ZShBVFRSX0VSUk9SUywgU3RyaW5nLnZhbHVlT2Yoc3VtbWFyeS5lcnJvckNvdW50KCkpKTsKKyAgICAgICAgbGFzdFN1aXRlRWxlbWVudCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SdW5FbmRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbGFwc2VkVGltZSA9IFN0cmluZy52YWx1ZU9mKGV2dC5nZXRUaW1lU3RhbXAoKSAtIHByb2dyYW1TdGFydCk7CisgICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgiZWxhcHNlZF90aW1lIiwgZWxhcHNlZFRpbWUpOworICAgICAgICAvLyBPdXRwdXQgcHJvcGVydGllcworICAgICAgICBmaW5hbCBFbGVtZW50IHByb3BzRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KFBST1BFUlRJRVMpOworICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChwcm9wc0VsZW1lbnQpOworICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzID0gZXZ0LmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHByb3BzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJvcEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChQUk9QRVJUWSk7CisgICAgICAgICAgICAgICAgcHJvcEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfTkFNRSwgbmFtZSk7CisgICAgICAgICAgICAgICAgcHJvcEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfVkFMVUUsIHByb3BzLmdldFByb3BlcnR5KG5hbWUpKTsKKyAgICAgICAgICAgICAgICBwcm9wc0VsZW1lbnQuYXBwZW5kQ2hpbGQocHJvcEVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SdW5TdGFydGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgcHJvZ3JhbVN0YXJ0ID0gZXZ0LmdldFRpbWVTdGFtcCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0ZSA9IERhdGVVdGlscy5mb3JtYXQocHJvZ3JhbVN0YXJ0LCBEYXRlVXRpbHMuSVNPODYwMV9EQVRFVElNRV9QQVRURVJOKTsKKyAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJwcm9ncmFtX3N0YXJ0IiwgZGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SdW5TdG9wcGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJzdG9wcGVkIiwgInRydWUiKTsKKyAgICAgICAgb25SdW5FbmRlZChldnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdFN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBFbGVtZW50IHRlc3QgPSBkb2MuY3JlYXRlRWxlbWVudChURVNUQ0FTRSk7CisgICAgICAgIFN0cmluZyBuYW1lID0gSlVuaXRIZWxwZXIuZ2V0VGVzdE5hbWUoZXZ0LmdldE5hbWUoKSk7CisgICAgICAgIHRlc3Quc2V0QXR0cmlidXRlKEFUVFJfTkFNRSwgbmFtZSk7CisgICAgICAgIFN0cmluZyBzdWl0ZU5hbWUgPSBKVW5pdEhlbHBlci5nZXRTdWl0ZU5hbWUoZXZ0LmdldE5hbWUoKSk7CisgICAgICAgIFN0cmluZyBsYXN0U3VpdGVOYW1lID0gbGFzdFN1aXRlRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9QQUNLQUdFKQorICAgICAgICAgICAgICAgICsgIi4iICsgbGFzdFN1aXRlRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKKyAgICAgICAgaWYgKCAhc3VpdGVOYW1lLmVxdWFscyhsYXN0U3VpdGVOYW1lKSApeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZWNlaXZlZCB0ZXN0Y2FzZSBmcm9tIHRlc3QgIgorICAgICAgICAgICAgICAgICAgICArIHN1aXRlTmFtZSArICIgYW5kIHdhcyBleHBlY3RpbmcgIgorICAgICAgICAgICAgICAgICAgICArIGxhc3RTdWl0ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOworICAgICAgICB9CisgICAgICAgIGxhc3RTdWl0ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGVzdCk7CisgICAgICAgIGxhc3RUZXN0RWxlbWVudCA9IHRlc3Q7CisgICAgICAgIGxhc3RUZXN0RXZlbnQgPSBldnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICAvLyB3aXRoIGEgVGVzdFNldHVwLCBzdGFydFRlc3QgYW5kIGVuZFRlc3QgYXJlIG5vdCBjYWxsZWQuCisgICAgICAgIGlmIChsYXN0VGVzdEV2ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIG9uVGVzdFN0YXJ0ZWQoZXZ0KTsKKyAgICAgICAgfQorICAgICAgICBmbG9hdCB0aW1lID0gKGV2dC5nZXRUaW1lU3RhbXAoKSAtIGxhc3RUZXN0RXZlbnQuZ2V0VGltZVN0YW1wKCkpIC8gMTAwMC4wZjsKKyAgICAgICAgbGFzdFRlc3RFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX1RJTUUsIEZsb2F0LnRvU3RyaW5nKHRpbWUpKTsKKyAgICAgICAgbGFzdFRlc3RFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgbGFzdFRlc3RFdmVudCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RXJyb3IoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBvblRlc3RGYWlsdXJlKGV2dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIFN0cmluZyB0eXBlID0gZXZ0LmdldFR5cGUoKSA9PSBUZXN0UnVuRXZlbnQuVEVTVF9GQUlMVVJFID8gRkFJTFVSRSA6IEVSUk9SOworICAgICAgICBFbGVtZW50IG5lc3RlZCA9IGRvYy5jcmVhdGVFbGVtZW50KHR5cGUpOworICAgICAgICBsYXN0VGVzdEVsZW1lbnQuYXBwZW5kQ2hpbGQobmVzdGVkKTsKKyAgICAgICAgRXhjZXB0aW9uRGF0YSBlcnJvciA9IGV2dC5nZXRFcnJvcigpOworICAgICAgICBuZXN0ZWQuc2V0QXR0cmlidXRlKEFUVFJfTUVTU0FHRSwgZXJyb3IuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgbmVzdGVkLnNldEF0dHJpYnV0ZShBVFRSX1RZUEUsIGVycm9yLmdldFR5cGUoKSk7CisgICAgICAgIFRleHQgdGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZShlcnJvci5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICBuZXN0ZWQuYXBwZW5kQ2hpbGQodGV4dCk7CisgICAgICAgIG9uVGVzdEVuZGVkKGV2dCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIHdyaXRlciB1c2VzIFVURjggZW5jb2RpbmcKKyAgICAgICAgZ2V0V3JpdGVyKCkucHJpbnRsbigiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnID8+Iik7CisgICAgICAgIFN0cmluZyBub3cgPSBEYXRlVXRpbHMuZm9ybWF0KG5ldyBEYXRlKCksIERhdGVVdGlscy5JU084NjAxX0RBVEVUSU1FX1BBVFRFUk4pOworICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoInNuYXBzaG90X2NyZWF0ZWQiLCBub3cpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgRE9NRWxlbWVudFdyaXRlciBkb21Xcml0ZXIgPSBuZXcgRE9NRWxlbWVudFdyaXRlcigpOworICAgICAgICAgICAgZG9tV3JpdGVyLndyaXRlKHJvb3RFbGVtZW50LCBnZXRXcml0ZXIoKSwgMCwgIiAgIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcihleGMpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9yZW1vdGUvRXZlbnREaXNwYXRjaGVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9yZW1vdGUvRXZlbnREaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlY2NmYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9FdmVudERpc3BhdGNoZXIuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LnJlbW90ZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogRGlzcGF0Y2ggbWVzc2FnZXMgdG8gYXBwcm9wcmlhdGUgbGlzdGVuZXIgbWV0aG9kZSBiYXNlZCBvbiBldmVudCBpZC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudERpc3BhdGNoZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaE1hcCBldmVudE1hcCA9IG5ldyBIYXNoTWFwKDMpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgcmVnaXN0ZXJEZWZhdWx0cygpOworICAgIH0KKworICAgIC8qKiB0aGUgc2V0IG9mIHJlZ2lzdGVyZWQgbGlzdGVuZXJzICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGxpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIGxpc3RlbmVyIHRoYXQgd2lsbCByZWNlaXZlIGV2ZW50cyBmcm9tIHRoZSBjbGllbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKFRlc3RSdW5MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgbWVzc2FnZSBmcm9tIHRoZSBjbGllbnQgYW5kIGRpc3BhdGNoIHRoZQorICAgICAqIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdG8gdGhlIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaEV2ZW50KFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlID0gbmV3IEludGVnZXIoZXZ0LmdldFR5cGUoKSk7CisgICAgICAgIGZpbmFsIEV2ZW50QWN0aW9uIGFjdGlvbiA9IChFdmVudEFjdGlvbikgZXZlbnRNYXAuZ2V0KHR5cGUpOworICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFRlc3RSdW5MaXN0ZW5lciBsaXN0ZW5lciA9IChUZXN0UnVuTGlzdGVuZXIpIGxpc3RlbmVycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgYWN0aW9uLmRpc3BhdGNoKGxpc3RlbmVyLCBldnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlckRlZmF1bHRzKCkgeworICAgICAgICByZWdpc3RlckFjdGlvbihUZXN0UnVuRXZlbnQuUlVOX1NUQVJURUQsIG5ldyBSdW5TdGFydGVkQWN0aW9uKCkpOworICAgICAgICByZWdpc3RlckFjdGlvbihUZXN0UnVuRXZlbnQuUlVOX0VOREVELCBuZXcgUnVuRW5kZWRBY3Rpb24oKSk7CisgICAgICAgIHJlZ2lzdGVyQWN0aW9uKFRlc3RSdW5FdmVudC5URVNUX1NUQVJURUQsIG5ldyBUZXN0U3RhcnRlZEFjdGlvbigpKTsKKyAgICAgICAgcmVnaXN0ZXJBY3Rpb24oVGVzdFJ1bkV2ZW50LlRFU1RfRU5ERUQsIG5ldyBUZXN0RW5kZWRBY3Rpb24oKSk7CisgICAgICAgIHJlZ2lzdGVyQWN0aW9uKFRlc3RSdW5FdmVudC5URVNUX0ZBSUxVUkUsIG5ldyBUZXN0RmFpbHVyZUFjdGlvbigpKTsKKyAgICAgICAgcmVnaXN0ZXJBY3Rpb24oVGVzdFJ1bkV2ZW50LlRFU1RfRVJST1IsIG5ldyBUZXN0RXJyb3JBY3Rpb24oKSk7CisgICAgICAgIHJlZ2lzdGVyQWN0aW9uKFRlc3RSdW5FdmVudC5TVUlURV9TVEFSVEVELCBuZXcgU3VpdGVTdGFydGVkQWN0aW9uKCkpOworICAgICAgICByZWdpc3RlckFjdGlvbihUZXN0UnVuRXZlbnQuU1VJVEVfRU5ERUQsIG5ldyBTdWl0ZUVuZGVkQWN0aW9uKCkpOworICAgICAgICByZWdpc3RlckFjdGlvbihUZXN0UnVuRXZlbnQuUlVOX1NUT1BQRUQsIG5ldyBSdW5TdG9wcGVkQWN0aW9uKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXJBY3Rpb24oaW50IGlkLCBFdmVudEFjdGlvbiBhY3Rpb24peworICAgICAgICBldmVudE1hcC5wdXQobmV3IEludGVnZXIoaWQpLCBhY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRBY3Rpb24geworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaChUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIsIFRlc3RSdW5FdmVudCBldnQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJ1blN0YXJ0ZWRBY3Rpb24gaW1wbGVtZW50cyBFdmVudEFjdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoKFRlc3RSdW5MaXN0ZW5lciBsaXN0ZW5lciwgVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICAgICAgbGlzdGVuZXIub25SdW5TdGFydGVkKGV2dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSdW5FbmRlZEFjdGlvbiBpbXBsZW1lbnRzIEV2ZW50QWN0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2goVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyLCBUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICBsaXN0ZW5lci5vblJ1bkVuZGVkKGV2dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0U3RhcnRlZEFjdGlvbiBpbXBsZW1lbnRzIEV2ZW50QWN0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2goVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyLCBUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICBsaXN0ZW5lci5vblRlc3RTdGFydGVkKGV2dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0RW5kZWRBY3Rpb24gaW1wbGVtZW50cyBFdmVudEFjdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoKFRlc3RSdW5MaXN0ZW5lciBsaXN0ZW5lciwgVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICAgICAgbGlzdGVuZXIub25UZXN0RW5kZWQoZXZ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RGYWlsdXJlQWN0aW9uIGltcGxlbWVudHMgRXZlbnRBY3Rpb24geworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaChUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIsIFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLm9uVGVzdEZhaWx1cmUoZXZ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RFcnJvckFjdGlvbiBpbXBsZW1lbnRzIEV2ZW50QWN0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2goVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyLCBUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICBsaXN0ZW5lci5vblRlc3RFcnJvcihldnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3VpdGVTdGFydGVkQWN0aW9uIGltcGxlbWVudHMgRXZlbnRBY3Rpb24geworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaChUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIsIFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLm9uU3VpdGVTdGFydGVkKGV2dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdWl0ZUVuZGVkQWN0aW9uIGltcGxlbWVudHMgRXZlbnRBY3Rpb24geworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaChUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIsIFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLm9uU3VpdGVFbmRlZChldnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUnVuU3RvcHBlZEFjdGlvbiBpbXBsZW1lbnRzIEV2ZW50QWN0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2goVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyLCBUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICBsaXN0ZW5lci5vblJ1blN0b3BwZWQoZXZ0KTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL0V4Y2VwdGlvbkRhdGEuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9FeGNlcHRpb25EYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliODBmYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9FeGNlcHRpb25EYXRhLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGU7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogQSB3cmFwcGVyIGFyb3VuZCBhbiBleGNlcHRpb24gc2luY2UgYW4gZXhjZXB0aW9uIHN0YWNrdHJhY2UgaXMKKyAqIG5vdCBzZXJpYWxpemFibGUuCisgKgorICovCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uRGF0YSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKiogdGhlIHN0YWNrdHJhY2Ugb2YgdGhlIGV4Y2VwdGlvbiAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN0YWNrdHJhY2U7CisKKyAgICAvKiogdGhlIGNsYXNzbmFtZSBvZiBhbiBleGNlcHRpb24gKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlOworCisgICAgLyoqIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhpcyBleGNlcHRpb24gKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGVycm9yLgorICAgICAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGV4Y2VwdGlvbiB0byBydW4gYXMKKyAgICAgKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uRGF0YShUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgIHRoaXMoZXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgU3RyaW5nVXRpbHMuZ2V0U3RhY2tUcmFjZShleGNlcHRpb24pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZXJyb3IuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGVycm9yIChpZSBjbGFzc25hbWUpLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhpcyBlcnJvci4KKyAgICAgKiBAcGFyYW0gc3RhY2t0cmFjZSB0aGUgZnVsbCBzdGFja3RyYWNlIG9mIHRoaXMgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIEV4Y2VwdGlvbkRhdGEoU3RyaW5nIHR5cGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgc3RhY2t0cmFjZSkgeworICAgICAgICB0aGlzLnN0YWNrdHJhY2UgPSBzdGFja3RyYWNlOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGVycm9yIChpZSBjbGFzc25hbWUpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhpcyBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHN0YWNrdHJhY2UgZm9yIHRoaXMgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdGFja1RyYWNlKCkgeworICAgICAgICByZXR1cm4gc3RhY2t0cmFjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8peworICAgICAgICBpZiAoIG8gaW5zdGFuY2VvZiBFeGNlcHRpb25EYXRhICl7CisgICAgICAgICAgICBFeGNlcHRpb25EYXRhIG90aGVyID0gKEV4Y2VwdGlvbkRhdGEpbzsKKyAgICAgICAgICAgIHJldHVybiAoICggdHlwZSA9PSBudWxsID8gb3RoZXIudHlwZSA9PSBudWxsIDogIHR5cGUuZXF1YWxzKG90aGVyLnR5cGUpICkgJiYKKyAgICAgICAgICAgICAgICAgICAgKCBtZXNzYWdlID09IG51bGwgPyBvdGhlci5tZXNzYWdlID09IG51bGwgOiBtZXNzYWdlLmVxdWFscyhvdGhlci5tZXNzYWdlKSApICYmCisgICAgICAgICAgICAgICAgICAgICggc3RhY2t0cmFjZSA9PSBudWxsID8gb3RoZXIuc3RhY2t0cmFjZSA9PSBudWxsIDogc3RhY2t0cmFjZS5lcXVhbHMob3RoZXIuc3RhY2t0cmFjZSkgKSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKG1lc3NhZ2UgIT0gbnVsbCkgPyAodHlwZSArICI6ICIgKyBtZXNzYWdlKSA6IHR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL01lc3Nlbmdlci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL01lc3Nlbmdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZjY4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9yZW1vdGUvTWVzc2VuZ2VyLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGU7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKKworLyoqCisgKiBSZWFkIG9yIHdyaXRlIGV2ZW50cyB0by9mcm9tIGFwcHJvcHJpYXRlIHN0cmVhbXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgTWVzc2VuZ2VyIHsKKworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW47CisKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7CisKKyAgICBwdWJsaWMgTWVzc2VuZ2VyKElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXRPdXRwdXRTdHJlYW0oIG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0KSApOworICAgICAgICBzZXRJbnB1dFN0cmVhbSggbmV3IE9iamVjdElucHV0U3RyZWFtKGluKSApOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICBvdXQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgaW4gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFRlc3RSdW5FdmVudCByZWFkKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChUZXN0UnVuRXZlbnQpKChPYmplY3RJbnB1dFN0cmVhbSlpbikucmVhZE9iamVjdCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlRXZlbnQoVGVzdFJ1bkV2ZW50IGV2dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgKChPYmplY3RPdXRwdXRTdHJlYW0pb3V0KS53cml0ZU9iamVjdChldnQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCl7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCl7CisgICAgICAgIHJldHVybiBpbjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCl7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKXsKKyAgICAgICAgdGhpcy5pbiA9IGluOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9TZXJ2ZXIuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9TZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzY2MmY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCisvKioKKyAqIFRoZSBzZXJ2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgZXZlbnRzIGZyb20gYSByZW1vdGUgY2xpZW50LgorICoKKyAqIDxpPgorICogVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBjb2RlIGZyb20gRXJpY2ggR2FtbWEgbWFkZSBmb3IgdGhlCisgKiBKVW5pdCBwbHVnaW4gZm9yIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPkVjbGlwc2U8L2E+IGFuZCBpcworICogbWVyZ2VkIHdpdGggY29kZSBvcmlnaW5hdGluZyBmcm9tIEFudCAxLjQueC4KKyAqIDwvaT4KKyAqCisgKiBAc2VlIFRlc3RSdW5uZXIKKyAqLworcHVibGljIGNsYXNzIFNlcnZlciB7CisKKyAgICAvKiogdGhlIHBvcnQgd2hlcmUgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgKi8KKyAgICBwcml2YXRlIGludCBwb3J0ID0gLTE7CisKKyAgICAvKiogdGhlIHNlcnZlciBzb2NrZXQgKi8KKyAgICBwcml2YXRlIFNlcnZlclNvY2tldCBzZXJ2ZXI7CisKKyAgICAvKiogdGhlIGNsaWVudCB0aGF0IGlzIGNvbm5lY3RlZCB0byB0aGUgc2VydmVyICovCisgICAgcHJpdmF0ZSBTb2NrZXQgY2xpZW50OworCisgICAgLyoqIHRoZSByZWFkZXIgaW4gY2hhcmdlIG9mIGludGVycHJldGluZyBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQgKi8KKyAgICBwcml2YXRlIE1lc3NlbmdlciBtZXNzZW5nZXI7CisKKyAgICBwcml2YXRlIEV2ZW50RGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcigpOworCisgICAgcHVibGljIFNlcnZlcihpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNhbmNlbCgpOworICAgICAgICBzaHV0ZG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5ldyBsaXN0ZW5lcgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIGluc3RhbmNlIG9mIGEgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGRpc3BhdGNoZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSBhbiBleGlzdGluZyBsaXN0ZW5lcgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIGluc3RhbmNlIG9mIGEgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGRpc3BhdGNoZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKiByZXR1cm4gd2hldGhlciB0aGVyZSBpcyBhIGNsaWVudCBydW5uaW5nIG9yIG5vdCAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgICAgIHJldHVybiBjbGllbnQgIT0gbnVsbCAmJiBzZXJ2ZXIgIT0gbnVsbCAmJiBtZXNzZW5nZXIgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogc3RhcnQgYSBzZXJ2ZXIgdG8gdGhlIHNwZWNpZmllZCBwb3J0ICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoYm9vbGVhbiBsb29wKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXJ2ZXIgPSBuZXcgU2VydmVyU29ja2V0KHBvcnQpOworICAgICAgICB3aGlsZSAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsaWVudCA9IHNlcnZlci5hY2NlcHQoKTsKKyAgICAgICAgICAgIG1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIoY2xpZW50LmdldElucHV0U3RyZWFtKCksIGNsaWVudC5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBUZXN0UnVuRXZlbnQgZXZ0ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAoZXZ0ID0gbWVzc2VuZ2VyLnJlYWQoKSkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgLy9AZml4bWUgdGhpcyBzdGFja3RyYWNlIG1pZ2h0IGJlIG5vcm1hbCB3aGVuIGNsb3NpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGUgc29ja2V0LiBTbyBkZWNvbXBvc2UgdGhlIGFib3ZlIGluIGRpc3RpbmN0IHN0ZXBzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxvb3ApeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIGNhbmNlbCB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50ICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgaWYgKGlzUnVubmluZygpKSB7CisgICAgICAgICAgICBUZXN0UnVuRXZlbnQgZXZ0ID0gbmV3IFRlc3RSdW5FdmVudChuZXcgSW50ZWdlcigtMSksIFRlc3RSdW5FdmVudC5SVU5fU1RPUCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1lc3Nlbmdlci53cml0ZUV2ZW50KGV2dCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBzaHV0ZG93biB0aGUgc2VydmVyIGFuZCBhbnkgcnVubmluZyBjbGllbnQgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2h1dGRvd24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobWVzc2VuZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZXNzZW5nZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBtZXNzZW5nZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LnNodXRkb3duSW5wdXQoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQuc2h1dGRvd25PdXRwdXQoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlcnZlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9UZXN0UnVuRXZlbnQuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9UZXN0UnVuRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGU4ODRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL1Rlc3RSdW5FdmVudC5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlOworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBQcm92aWRlIHRoZSBiYXNpYyBldmVudHMgdG8gYmUgdXNlZCBkdXJpbmcgdGhlIHRlc3RzLgorICogVGhpcyBpcyBub3QgdmVyeSBleHRlbnNpYmxlIGJ1dCBzaW5jZSB0aGUgZXZlbnRzIHNob3VsZCBiZSBzb21ld2hhdAorICogbGltaXRlZCwgZm9yIG5vdyB0aGlzIGlzIGJldHRlciB0byBkbyBpdCBsaWtlIHRoaXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgVGVzdFJ1bkV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgeworCisgICAgLy8gcmVjZWl2ZWQgZnJvbSBjbGllbnRzCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUlVOX1NUQVJURUQgPSAwOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJVTl9FTkRFRCA9IDE7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUlVOX1NUT1BQRUQgPSAyOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFU1RfU1RBUlRFRCA9IDM7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEVTVF9GQUlMVVJFID0gNDsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX0VSUk9SID0gNTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX0VOREVEID0gNjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVUlURV9TVEFSVEVEID0gNzsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVUlURV9FTkRFRCA9IDg7CisKKyAgICAvLyByZWNlaXZlZCBmcm9tIHNlcnZlcgorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJVTl9TVE9QID0gOTsKKworICAgIC8qKiB0aGUgdHlwZSBvZiBldmVudCAqLworICAgIHByaXZhdGUgaW50IHR5cGUgPSAtMTsKKworICAgIC8qKiB0aW1lc3RhbXAgZm9yIGFsbCBldmVudHMgKi8KKyAgICBwcml2YXRlIGxvbmcgdGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAvKiogbmFtZSBvZiB0ZXN0Y2FzZShtZXRob2QgbmFtZSkgb3IgdGVzdHN1aXRlIChjbGFzc25hbWUpICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIC8qKiBzdGFja3RyYWNlIGZvciBlcnJvciBvciBmYWlsdXJlICovCisgICAgcHJpdmF0ZSBFeGNlcHRpb25EYXRhIGVycm9yOworCisgICAgLyoqIHByb3BlcnRpZXMgZm9yIGVuZCBvZiB0ZXN0cnVuICovCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzOworCisgICAgLyoqIGhhbmR5IHJlc3VsdCBmb3IgZWFjaCBlbmQgb2Ygc2VxdWVuY2UgKi8KKyAgICBwcml2YXRlIFRlc3RTdW1tYXJ5IHJlc3VsdDsKKworICAgIHB1YmxpYyBUZXN0UnVuRXZlbnQoSW50ZWdlciBpZCwgaW50IHR5cGUpeworICAgICAgICBzdXBlcihpZCk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFRlc3RSdW5FdmVudChJbnRlZ2VyIGlkLCBpbnQgdHlwZSwgU3RyaW5nIG5hbWUsIFRlc3RTdW1tYXJ5IHJlc3VsdCl7CisgICAgICAgIHRoaXMoaWQsIHR5cGUsIG5hbWUpOworICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdFJ1bkV2ZW50KEludGVnZXIgaWQsIGludCB0eXBlLCBTdHJpbmcgbmFtZSl7CisgICAgICAgIHRoaXMoaWQsIHR5cGUpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBUZXN0UnVuRXZlbnQoSW50ZWdlciBpZCwgaW50IHR5cGUsIFByb3BlcnRpZXMgcHJvcHMsIFRlc3RTdW1tYXJ5IHJlc3VsdCl7CisgICAgICAgIHRoaXMoaWQsIHR5cGUpOworICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7CisgICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBUZXN0UnVuRXZlbnQoSW50ZWdlciBpZCwgaW50IHR5cGUsIFN0cmluZyBuYW1lLCBUaHJvd2FibGUgdCl7CisgICAgICAgIHRoaXMoaWQsIHR5cGUsIG5hbWUpOworICAgICAgICB0aGlzLmVycm9yID0gbmV3IEV4Y2VwdGlvbkRhdGEodCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVTdGFtcChsb25nIHRpbWVzdGFtcCkgeworICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvcihFeGNlcHRpb25EYXRhIGVycm9yKSB7CisgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7CisgICAgICAgIHRoaXMucHJvcHMgPSBwcm9wczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKXsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VGltZVN0YW1wKCl7CisgICAgICAgIHJldHVybiB0aW1lc3RhbXA7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCl7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBUZXN0U3VtbWFyeSBnZXRTdW1tYXJ5KCl7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIEV4Y2VwdGlvbkRhdGEgZ2V0RXJyb3IoKXsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKXsKKyAgICAgICAgcmV0dXJuIHByb3BzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgbyl7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGVzdFJ1bkV2ZW50KXsKKyAgICAgICAgICAgIFRlc3RSdW5FdmVudCBvdGhlciA9IChUZXN0UnVuRXZlbnQpbzsKKyAgICAgICAgICAgIHJldHVybiAoICh0eXBlID09IG90aGVyLnR5cGUpICYmCisgICAgICAgICAgICAgICAgICAgICh0aW1lc3RhbXAgPT0gb3RoZXIudGltZXN0YW1wKSAmJgorICAgICAgICAgICAgICAgICAgICAoIG5hbWUgPT0gbnVsbCA/IG90aGVyLm5hbWUgPT0gbnVsbCA6ICBuYW1lLmVxdWFscyhvdGhlci5uYW1lKSApICYmCisgICAgICAgICAgICAgICAgICAgICggZXJyb3IgPT0gbnVsbCA/IG90aGVyLmVycm9yID09IG51bGwgOiBlcnJvci5lcXVhbHMob3RoZXIuZXJyb3IpICkgJiYKKyAgICAgICAgICAgICAgICAgICAgKCBwcm9wcyA9PSBudWxsID8gb3RoZXIucHJvcHMgPT0gbnVsbCA6IHByb3BzLmVxdWFscyhvdGhlci5wcm9wcykgKSAmJgorICAgICAgICAgICAgICAgICAgICAoIHJlc3VsdCA9PSBudWxsID8gb3RoZXIucmVzdWx0ID09IG51bGwgOiByZXN1bHQuZXF1YWxzKG90aGVyLnJlc3VsdCkgKSApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoImlkOiAiKS5hcHBlbmQoc291cmNlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgidHlwZTogIikuYXBwZW5kKHR5cGUpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL1Rlc3RSdW5MaXN0ZW5lci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL1Rlc3RSdW5MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YWRlODcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9yZW1vdGUvVGVzdFJ1bkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LnJlbW90ZTsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOworCisKKy8qKgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBUZXN0UnVuTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKKworICAgIHZvaWQgb25SdW5TdGFydGVkKFRlc3RSdW5FdmVudCBldnQpOworICAgIHZvaWQgb25SdW5FbmRlZChUZXN0UnVuRXZlbnQgZXZ0KTsKKyAgICB2b2lkIG9uUnVuU3RvcHBlZChUZXN0UnVuRXZlbnQgZXZ0KTsKKworICAgIHZvaWQgb25TdWl0ZVN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCk7CisgICAgdm9pZCBvblN1aXRlRW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCk7CisKKyAgICB2b2lkIG9uVGVzdFN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCk7CisgICAgdm9pZCBvblRlc3RFcnJvcihUZXN0UnVuRXZlbnQgZXZ0KTsKKyAgICB2b2lkIG9uVGVzdEZhaWx1cmUoVGVzdFJ1bkV2ZW50IGV2dCk7CisgICAgdm9pZCBvblRlc3RFbmRlZChUZXN0UnVuRXZlbnQgZXZ0KTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9UZXN0UnVubmVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9yZW1vdGUvVGVzdFJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDVhZDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9yZW1vdGUvVGVzdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0TGlzdGVuZXI7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5KVW5pdEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuZm9ybWF0dGVyLkZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuZm9ybWF0dGVyLlBsYWluRm9ybWF0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogVGVzdFJ1bm5lciBmb3IgcnVubmluZyB0ZXN0cyBhbmQgc2VuZCByZXN1bHRzIHRvIGEgcmVtb3RlIHNlcnZlci4KKyAqCisgKiA8aT4KKyAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGUgY29kZSBmcm9tIEVyaWNoIEdhbW1hIG1hZGUgZm9yIHRoZQorICogSlVuaXQgcGx1Z2luIGZvciA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5FY2xpcHNlPC9hPiBhbmQgaXMKKyAqIG1lcmdlZCB3aXRoIGNvZGUgb3JpZ2luYXRpbmcgZnJvbSBBbnQgMS40LnguCisgKiA8L2k+CisgKgorICovCitwdWJsaWMgY2xhc3MgVGVzdFJ1bm5lciBpbXBsZW1lbnRzIFRlc3RMaXN0ZW5lciB7CisKKyAgICAvKiogdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBydW5uZXIgKi8KKyAgICBwcml2YXRlIGZpbmFsIEludGVnZXIgaWQgPSBuZXcgSW50ZWdlciggKG5ldyBSYW5kb20oKSkubmV4dEludCgpICk7CisKKyAgICAvKiogaG9zdCB0byBjb25uZWN0IHRvICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9ICIxMjcuMC4wLjEiOworCisgICAgLyoqIHBvcnQgdG8gY29ubmVjdCB0byAqLworICAgIHByaXZhdGUgaW50IHBvcnQgPSAtMTsKKworICAgIC8qKiBoYW5keSBkZWJ1ZyBmbGFnICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKyAgICAvKiogdGhlIGxpc3Qgb2YgdGVzdCBjbGFzcyBuYW1lcyB0byBydW4gKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdCB0ZXN0Q2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIC8qKiByZXN1bHQgb2YgdGhlIGN1cnJlbnQgdGVzdCAqLworICAgIHByaXZhdGUgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0OworCisgICAgLyoqIGNsaWVudCBzb2NrZXQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyICovCisgICAgcHJpdmF0ZSBTb2NrZXQgY2xpZW50U29ja2V0OworCisgICAgLyoqIHdyaXRlciB0byBzZW5kIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciAqLworICAgIHByaXZhdGUgTWVzc2VuZ2VyIG1lc3NlbmdlcjsKKworICAgIC8qKiBoZWxwZnVsIGZvcm1hdHRlciB0byBkZWJ1ZyBldmVudHMgZGlyZWN0bHkgaGVyZSAqLworICAgIHByaXZhdGUgZmluYWwgRm9ybWF0dGVyIGRlYnVnRm9ybWF0dGVyID0gbmV3IFBsYWluRm9ybWF0dGVyKCk7CisKKyAgICAvKiogYmVhbiBjb25zdHJ1Y3RvciAqLworICAgIHB1YmxpYyBUZXN0UnVubmVyKCkgeworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoImZpbGUiLCAicmp1bml0LWNsaWVudC1kZWJ1Zy5sb2ciKTsKKyAgICAgICAgZGVidWdGb3JtYXR0ZXIuaW5pdChwcm9wcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWJ1ZyBtb2RlLgorICAgICAqIEBwYXJhbSBkZWJ1ZyB0cnVlIHRvIHNldCB0byBkZWJ1ZyBtb2RlIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGRlYnVnKSB7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBvcnQgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyCisgICAgICogQHBhcmFtIHBvcnQgYSB2YWxpZCBwb3J0IG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0bmFtZSBvZiB0aGUgc2VydmVyCisgICAgICogQHBhcmFtIGhvc3QgdGhlIGhvc3RuYW1lIG9yIGlwIG9mIHRoZSBzZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgdGVzdCBjbGFzcyBuYW1lIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoaXMgcnVubmVyLgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHRlc3QgdG8gcnVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRlc3RDbGFzc05hbWUoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICB0ZXN0Q2xhc3NOYW1lcy5hZGQoY2xhc3NuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJlYWQgbGlzdGVuZXIgZm9yIGEgc2h1dGRvd24gZnJvbSB0aGUgc2VydmVyCisgICAgICogTm90ZSB0aGF0IGl0IHdpbGwgc3RvcCBhbnkgcnVubmluZyB0ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgU3RvcFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGVzdFJ1bkV2ZW50IGV2dCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKChldnQgPSBtZXNzZW5nZXIucmVhZCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09IFRlc3RSdW5FdmVudC5SVU5fU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFJ1bm5lci50aGlzLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgVGVzdFJ1bm5lci50aGlzLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVudHJ5IHBvaW50IGZvciBjb21tYW5kIGxpbmUuCisgICAgICogVXNhZ2U6CisgICAgICogPHByZT4KKyAgICAgKiBUZXN0UnVubmVyIC1jbGFzc25hbWVzIDxjbGFzc25hbWVzPiAtcG9ydCA8cG9ydD4gLWhvc3QgPGhvc3Q+IC1kZWJ1ZworICAgICAqIC1maWxlCisgICAgICogLWNsYXNzbmFtZXMgPGxpc3Qgb2Ygd2hpdGVzcGFjZSBzZXBhcmF0ZWQgY2xhc3NuYW1lcyB0byBydW4+CisgICAgICogLXBvcnQgICAgICAgPHBvcnQgdG8gY29ubmVjdCB0bz4KKyAgICAgKiAtaG9zdCAgICAgICA8aG9zdCB0byBjb25uZWN0IHRvPgorICAgICAqIC1kZWJ1ZyAgICAgIHRvIHJ1biBpbiBkZWJ1ZyBtb2RlCisgICAgICogPC9wcmU+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RSdW5uZXIgdGVzdFJ1blNlcnZlciA9IG5ldyBUZXN0UnVubmVyKCk7CisgICAgICAgIHRlc3RSdW5TZXJ2ZXIuaW5pdChhcmdzKTsKKyAgICAgICAgdGVzdFJ1blNlcnZlci5ydW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGFyZ3VtZW50cyBvZiBjb21tYW5kIGxpbmUuCisgICAgICogdGVzdENsYXNzTmFtZXMsIGhvc3QsIHBvcnQsIGxpc3RlbmVycyBhbmQgZGVidWcgbW9kZSBhcmUgc2V0CisgICAgICogQHNlZSAgI21haW4oU3RyaW5nW10pCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIi1maWxlIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgLy8gQGZpeG1lIGlmIHlvdSBtaXggZmlsZSBhbmQgb3RoZXIgb3B0aW9ucyBpdCB3aWxsIGJlIGEgbWVzcywKKyAgICAgICAgICAgICAgICAvLyBub3QgaW1wb3J0YW50IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhcmdzWysraV0pOworICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoZmlzKTsKKyAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpbml0KHByb3BzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgiLWNsYXNzbmFtZXMiLmVxdWFsc0lnbm9yZUNhc2UoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gKytpOyBqIDwgYXJncy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tqXS5zdGFydHNXaXRoKCItIikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgYWRkVGVzdENsYXNzTmFtZShhcmdzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIi1wb3J0Ii5lcXVhbHNJZ25vcmVDYXNlKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgc2V0UG9ydChJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbKytpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCItaG9zdCIuZXF1YWxzSWdub3JlQ2FzZShhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgIHNldEhvc3QoYXJnc1srK2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgiLWRlYnVnIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgc2V0RGVidWcodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBUZXN0UnVubmVyIGZyb20gcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0gcHJvcHMgdGhlIHByb3BlcnRpZXMgY29udGFpbmluZyBjb25maWd1cmF0aW9uIGRhdGEuCisgICAgICogQHNlZSAjaW5pdChTdHJpbmdbXSkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFByb3BlcnRpZXMgcHJvcHMpIHsKKyAgICAgICAgaWYgKHByb3BzLmdldFByb3BlcnR5KCJkZWJ1ZyIpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldERlYnVnKHRydWUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwb3J0ID0gcHJvcHMuZ2V0UHJvcGVydHkoInBvcnQiKTsKKyAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0UG9ydChJbnRlZ2VyLnBhcnNlSW50KHBvcnQpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgaG9zdCA9IHByb3BzLmdldFByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldEhvc3QoaG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGNsYXNzbmFtZXMgPSBwcm9wcy5nZXRQcm9wZXJ0eSgiY2xhc3NuYW1lcyIpOworICAgICAgICBpZiAoY2xhc3NuYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzbmFtZXMpOworICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIGFkZFRlc3RDbGFzc05hbWUoc3QubmV4dFRva2VuKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0ZXN0Q2xhc3NOYW1lcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gVGVzdENhc2Ugc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICAgICAgY29ubmVjdCgpOworCisgICAgICAgIHRlc3RSZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpOworICAgICAgICB0ZXN0UmVzdWx0LmFkZExpc3RlbmVyKHRoaXMpOworICAgICAgICBydW5UZXN0cygpOworCisgICAgICAgIHRlc3RSZXN1bHQucmVtb3ZlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIGlmICh0ZXN0UmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRlc3RSZXN1bHQuc3RvcCgpOworICAgICAgICAgICAgdGVzdFJlc3VsdCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm0gYWxsIGNsYXNzbmFtZXMgaW50byBpbnN0YW50aWF0ZWQgPHR0PlRlc3Q8L3R0Pi4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBhIGdlbmVyaWMgZXhjZXB0aW9uIHRoYXQgY2FuIGJlIHRocm93biB3aGlsZQorICAgICAqIGluc3RhbnRpYXRpbmcgYSB0ZXN0IGNhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcCBnZXRTdWl0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gdGVzdENsYXNzTmFtZXMuc2l6ZSgpOworICAgICAgICBsb2coIkV4dHJhY3RpbmcgdGVzdGNhc2VzIGZyb20gIiArIGNvdW50ICsgIiBjbGFzc25hbWVzLi4uIik7CisgICAgICAgIGZpbmFsIE1hcCBzdWl0ZXMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSAoU3RyaW5nKSB0ZXN0Q2xhc3NOYW1lcy5nZXQoaSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRlc3QgdGVzdCA9IEpVbml0SGVscGVyLmdldFRlc3QobnVsbCwgY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHN1aXRlcy5wdXQoY2xhc3NuYW1lLCB0ZXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBsb2cgZXJyb3IgaW5zdGVhZCA/CisgICAgICAgICAgICAgICAgbG9nKCJDb3VsZCBub3QgZ2V0IFRlc3QgaW5zdGFuY2UgZnJvbSAiICsgY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICBsb2coZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJFeHRyYWN0ZWQgIiArIHN1aXRlcy5zaXplKCkgKyAiIHRlc3RjYXNlcy4iKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuVGVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBNYXAgc3VpdGVzID0gZ2V0U3VpdGVzKCk7CisKKyAgICAgICAgLy8gY291bnQgYWxsIHRlc3RNZXRob2RzIGFuZCBpbmZvcm0gVGVzdFJ1bkxpc3RlbmVycworICAgICAgICBpbnQgY291bnQgPSBjb3VudFRlc3RzKHN1aXRlcy52YWx1ZXMoKSk7CisgICAgICAgIGxvZygiVG90YWwgdGVzdHMgdG8gcnVuOiAiICsgY291bnQpOworICAgICAgICBUZXN0UnVuRXZlbnQgZXZ0ID0gbmV3IFRlc3RSdW5FdmVudChpZCwgVGVzdFJ1bkV2ZW50LlJVTl9TVEFSVEVEKTsKKyAgICAgICAgaWYgKGRlYnVnKXsKKyAgICAgICAgICAgIGRlYnVnRm9ybWF0dGVyLm9uUnVuU3RhcnRlZChldnQpOworICAgICAgICB9CisgICAgICAgIGZpcmVFdmVudChldnQpOworCisgICAgICAgIFRlc3RTdW1tYXJ5IHJ1blN1bW1hcnkgPSBuZXcgVGVzdFN1bW1hcnkoKTsKKyAgICAgICAgcnVuU3VtbWFyeS5zdGFydCh0ZXN0UmVzdWx0KTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHN1aXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIFRlc3QgdGVzdCA9IChUZXN0KWVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RDYXNlKSB7CisgICAgICAgICAgICAgICAgdGVzdCA9IG5ldyBUZXN0U3VpdGUobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5UZXN0KHRlc3QsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJ1blN1bW1hcnkuc3RvcCh0ZXN0UmVzdWx0KTsKKworICAgICAgICAvLyBpbmZvcm0gVGVzdFJ1bkxpc3RlbmVycyBvZiB0ZXN0IGVuZAorICAgICAgICBpbnQgdHlwZSA9ICh0ZXN0UmVzdWx0ID09IG51bGwgfHwgdGVzdFJlc3VsdC5zaG91bGRTdG9wKCkpID8KKyAgICAgICAgICAgIFRlc3RSdW5FdmVudC5SVU5fU1RPUFBFRCA6IFRlc3RSdW5FdmVudC5SVU5fRU5ERUQ7CisgICAgICAgIGV2dCA9IG5ldyBUZXN0UnVuRXZlbnQoaWQsIHR5cGUsIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCksIHJ1blN1bW1hcnkpOworICAgICAgICBpZiAoZGVidWcpeworICAgICAgICAgICAgZGVidWdGb3JtYXR0ZXIub25SdW5FbmRlZChldnQpOworICAgICAgICB9CisgICAgICAgIGZpcmVFdmVudChldnQpOworICAgICAgICBsb2coIkZpbmlzaGVkIGFmdGVyICIgKyBydW5TdW1tYXJ5LmVsYXBzZWRUaW1lKCkgKyAibXMiKTsKKyAgICAgICAgc2h1dERvd24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBydW4gYSBzaW5nbGUgc3VpdGUgYW5kIGRpc3BhdGNoIGl0cyByZXN1bHRzLgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSBpbnN0YW5jZSBvZiB0aGUgdGVzdHN1aXRlIHRvIHJ1bi4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdGVzdHN1aXRlIChjbGFzc25hbWUpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoVGVzdCB0ZXN0LCBTdHJpbmcgbmFtZSl7CisgICAgICAgIFRlc3RSdW5FdmVudCBldnQgPSBuZXcgVGVzdFJ1bkV2ZW50KGlkLCBUZXN0UnVuRXZlbnQuU1VJVEVfU1RBUlRFRCwgbmFtZSk7CisgICAgICAgIGlmIChkZWJ1Zyl7CisgICAgICAgICAgICBkZWJ1Z0Zvcm1hdHRlci5vblN1aXRlU3RhcnRlZChldnQpOworICAgICAgICB9CisgICAgICAgIGZpcmVFdmVudChldnQpOworICAgICAgICBUZXN0U3VtbWFyeSBzdWl0ZVN1bW1hcnkgPSBuZXcgVGVzdFN1bW1hcnkoKTsKKyAgICAgICAgc3VpdGVTdW1tYXJ5LnN0YXJ0KHRlc3RSZXN1bHQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdC5ydW4odGVzdFJlc3VsdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdWl0ZVN1bW1hcnkuc3RvcCh0ZXN0UmVzdWx0KTsKKyAgICAgICAgICAgIGV2dCA9IG5ldyBUZXN0UnVuRXZlbnQoaWQsIFRlc3RSdW5FdmVudC5TVUlURV9FTkRFRCwgbmFtZSwgc3VpdGVTdW1tYXJ5KTsKKyAgICAgICAgICAgIGlmIChkZWJ1Zyl7CisgICAgICAgICAgICAgICAgZGVidWdGb3JtYXR0ZXIub25TdWl0ZUVuZGVkKGV2dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXJlRXZlbnQoZXZ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvdW50IHRoZSBudW1iZXIgb2YgdGVzdCBtZXRob2RzIGluIGFsbCB0ZXN0cworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IGNvdW50VGVzdHMoQ29sbGVjdGlvbiB0ZXN0cykgeworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdGVzdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIFRlc3QgdGVzdCA9IChUZXN0KWl0Lm5leHQoKTsKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyB0ZXN0LmNvdW50VGVzdENhc2VzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHN0b3AoKSB7CisgICAgICAgIGlmICh0ZXN0UmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRlc3RSZXN1bHQuc3RvcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY29ubmVjdCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIHBvcnQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnkgZXJyb3Igb2NjdXJzIGR1cmluZyBjb25uZWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb2coIkNvbm5lY3RpbmcgdG8gIiArIGhvc3QgKyAiIG9uIHBvcnQgIiArIHBvcnQgKyAiLi4uIik7CisgICAgICAgIGNsaWVudFNvY2tldCA9IG5ldyBTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICAgIG1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIoY2xpZW50U29ja2V0LmdldElucHV0U3RyZWFtKCksIGNsaWVudFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgIG5ldyBTdG9wVGhyZWFkKCkuc3RhcnQoKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIHNodXREb3duKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1lc3NlbmdlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgbWVzc2VuZ2VyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjbGllbnRTb2NrZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZyhlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVFdmVudChUZXN0UnVuRXZlbnQgZXZ0KXsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1lc3Nlbmdlci53cml0ZUV2ZW50KGV2dCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgbG9nKGUpOworICAgICAgICB9CisgICAgfQorCisvLyAtLS0tLS0tLSBKVW5pdCBUZXN0TGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKworCisgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgeworICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSB0ZXN0LnRvU3RyaW5nKCk7CisgICAgICAgIFRlc3RSdW5FdmVudCBldnQgPSBuZXcgVGVzdFJ1bkV2ZW50KGlkLCBUZXN0UnVuRXZlbnQuVEVTVF9TVEFSVEVELCB0ZXN0TmFtZSk7CisgICAgICAgIGlmIChkZWJ1Zyl7CisgICAgICAgICAgICBkZWJ1Z0Zvcm1hdHRlci5vblRlc3RTdGFydGVkKGV2dCk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUV2ZW50KGV2dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgeworICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSB0ZXN0LnRvU3RyaW5nKCk7CisgICAgICAgIFRlc3RSdW5FdmVudCBldnQgPSBuZXcgVGVzdFJ1bkV2ZW50KGlkLCBUZXN0UnVuRXZlbnQuVEVTVF9FUlJPUiwgdGVzdE5hbWUsIHQpOworICAgICAgICBpZiAoZGVidWcpeworICAgICAgICAgICAgZGVidWdGb3JtYXR0ZXIub25UZXN0RXJyb3IoZXZ0KTsKKyAgICAgICAgfQorICAgICAgICBmaXJlRXZlbnQoZXZ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciBKVW5pdCAmbHQ7IDMuNAorICAgICAqIEBzZWUgI2FkZEZhaWx1cmUoVGVzdCwgVGhyb3dhYmxlKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciBhZmUpIHsKKyAgICAgICAgYWRkRmFpbHVyZSh0ZXN0LCAoVGhyb3dhYmxlKSBhZmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZm9yIEpVbml0ICZsdDs9IDMuNAorICAgICAqIEBzZWUgI2FkZEZhaWx1cmUoVGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IHRlc3QudG9TdHJpbmcoKTsKKyAgICAgICAgVGVzdFJ1bkV2ZW50IGV2dCA9IG5ldyBUZXN0UnVuRXZlbnQoaWQsIFRlc3RSdW5FdmVudC5URVNUX0ZBSUxVUkUsIHRlc3ROYW1lLCB0KTsKKyAgICAgICAgaWYgKGRlYnVnKXsKKyAgICAgICAgICAgIGRlYnVnRm9ybWF0dGVyLm9uVGVzdEZhaWx1cmUoZXZ0KTsKKyAgICAgICAgfQorICAgICAgICBmaXJlRXZlbnQoZXZ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkgeworICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSB0ZXN0LnRvU3RyaW5nKCk7CisgICAgICAgIFRlc3RSdW5FdmVudCBldnQgPSBuZXcgVGVzdFJ1bkV2ZW50KGlkLCBUZXN0UnVuRXZlbnQuVEVTVF9FTkRFRCwgdGVzdE5hbWUpOworICAgICAgICBpZiAoZGVidWcpeworICAgICAgICAgICAgZGVidWdGb3JtYXR0ZXIub25UZXN0RW5kZWQoZXZ0KTsKKyAgICAgICAgfQorICAgICAgICBmaXJlRXZlbnQoZXZ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9nKFRocm93YWJsZSB0KSB7CisgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL1Rlc3RTdW1tYXJ5LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9yZW1vdGUvVGVzdFN1bW1hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODZhNzcwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL1Rlc3RTdW1tYXJ5LmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGU7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OworCisvKioKKyAqIEEgaGVscGZ1bCB0ZXN0IHN1bW1hcnkgdGhhdCBpcyBzb21ld2hhdCBzaW1pbGFyIHRvIDx0dD5UZXN0UmVzdWx0PC90dD4uCisgKiBIZXJlIHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyB0ZXN0IHN1bW1hcnkgc2hvdWxkIHJlZ2lzdGVyIHRvCisgKiB0aGUgdGVzdCByZXN1bHQgdGhlIHRpbWUgeW91IHdhbiB0byBjb2xsZWN0IGluZm9ybWF0aW9uLgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRlc3RTdW1tYXJ5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBUZXN0TGlzdGVuZXIgeworCisgICAgLyoqIHRpbWUgZWxhcHNlZCBkdXJpbmcgdGVzdHMgcnVuICBpbiBtcyAqLworICAgIHByaXZhdGUgbG9uZyBlbGFwc2VkVGltZTsKKworICAgIC8qKiBudW1iZXIgb2YgZXJyb3JzICovCisgICAgcHJpdmF0ZSBpbnQgZXJyb3JDb3VudDsKKworICAgIC8qKiBudW1iZXIgb2Ygc3VjY2Vzc2VzICovCisgICAgcHJpdmF0ZSBpbnQgc3VjY2Vzc0NvdW50OworCisgICAgLyoqIG51bWJlciBvZiBmYWlsdXJlcyAqLworICAgIHByaXZhdGUgaW50IGZhaWx1cmVDb3VudDsKKworICAgIC8qKiBudW1iZXIgb2YgcnVucyAqLworICAgIHByaXZhdGUgaW50IHJ1bkNvdW50OworCisgICAgLyoqIGJlYW4gY29uc3RydWN0b3IgKi8KKyAgICBwdWJsaWMgVGVzdFN1bW1hcnkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVycm9ycyB0aGF0IG9jY3VycmVkIGluIHRoaXMgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGVycm9yQ291bnQoKSB7CisgICAgICAgIHJldHVybiBlcnJvckNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzdWNjZXNzZXMgdGhhdCBvY2N1cnJlZCBpbiB0aGlzIHRlc3QuCisgICAgICovCisgICAgcHVibGljIGludCBzdWNjZXNzQ291bnQoKSB7CisgICAgICAgIHJldHVybiBzdWNjZXNzQ291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzIHRoYXQgb2NjdXJyZWQgaW4gdGhpcyB0ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZmFpbHVyZUNvdW50KCkgeworICAgICAgICByZXR1cm4gZmFpbHVyZUNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBydW5zIHRoYXQgb2NjdXJyZWQgaW4gdGhpcyB0ZXN0LgorICAgICAqIGEgcnVuIGlzIHRoZSBzdW0gb2YgZmFpbHVyZXMgKyBlcnJvcnMgKyBzdWNjZXNzZXMuCisgICAgICovCisgICAgcHVibGljIGludCBydW5Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHJ1bkNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGVsYXBzZWQgdGltZSBpbiBtcworICAgICAqLworICAgIHB1YmxpYyBsb25nIGVsYXBzZWRUaW1lKCkgeworICAgICAgICByZXR1cm4gZWxhcHNlZFRpbWU7CisgICAgfQorCisvLworICAgIC8qKgorICAgICAqIHJlZ2lzdGVyIHRvIHRoZSA8dHQ+VGVzdFJlc3VsdDwvdHQ+IGFuZCBzdGFydHMgdGhlIHRpbWUgY291bnRlci4KKyAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSBpbnN0YW5jZSB0byByZWdpc3RlciB0by4KKyAgICAgKiBAc2VlICNzdG9wKFRlc3RSZXN1bHQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoVGVzdFJlc3VsdCByZXN1bHQpeworICAgICAgICBlbGFwc2VkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICByZXN1bHQuYWRkTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdW5yZWdpc3RlciBmcm9tIHRoZSA8dHQ+VGVzdFJlc3VsdDwvdHQ+IGFuZCBzdG9wcyB0aGUgdGltZSBjb3VudGVyLgorICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIGluc3RhbmNlIHRvIHVucmVnaXN0ZXIgZnJvbS4KKyAgICAgKiBAc2VlICNzdGFydChUZXN0UmVzdWx0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoVGVzdFJlc3VsdCByZXN1bHQpeworICAgICAgICBlbGFwc2VkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZWxhcHNlZFRpbWU7CisgICAgICAgIHJlc3VsdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKy8vIHRlc3QgbGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKworICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBlcnJvckNvdW50Kys7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIGVycm9yKSB7CisgICAgICAgIGZhaWx1cmVDb3VudCsrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7CisgICAgICAgIHN1Y2Nlc3NDb3VudCsrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChUZXN0IHRlc3QpIHsKKyAgICAgICAgcnVuQ291bnQrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoInJ1bjogIikuYXBwZW5kKHJ1bkNvdW50KTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIHN1Y2Nlc3M6ICIpLmFwcGVuZChzdWNjZXNzQ291bnQpOworICAgICAgICBidWYuYXBwZW5kKCIgZmFpbHVyZXM6ICIpLmFwcGVuZChmYWlsdXJlQ291bnQpOworICAgICAgICBidWYuYXBwZW5kKCIgZXJyb3JzOiAiKS5hcHBlbmQoZXJyb3JDb3VudCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBlbGFwc2VkOiAiKS5hcHBlbmQoZWxhcHNlZFRpbWUpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvdXNlY2FzZS54bWwgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC91c2VjYXNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY3M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvdXNlY2FzZS54bWwKQEAgLTAsMCArMSw1MSBAQAorPHByb2plY3QgbmFtZT0iIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0cyI+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RzIj4KKworICAgICAgICA8cmp1bml0IHBvcnQ9IjEyMzQiPgorICAgICAgICAgICAgPHNlcnZlcj4KKyAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIgZmlsdGVycz0ic3RhY2t0cmFjZSIvPgorICAgICAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIGZpbHRlcnM9InN0YWNrdHJhY2UiLz4KKyAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9ImptcyIgZmlsdGVycz0ic3RhY2t0cmFjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJxdWV1ZSIgdmFsdWU9InRlc3RfcXVldWUiLz4KKyAgICAgICAgICAgICAgICA8L2Zvcm1hdHRlcj4KKyAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InJtaSIgZmlsdGVycz0ic3RhY2t0cmFjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJob3N0IiB2YWx1ZT0iMTI3LjAuMC4xIi8+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwb3J0IiB2YWx1ZT0iNjc4OSIvPgorICAgICAgICAgICAgICAgIDwvZm9ybWF0dGVyPgorICAgICAgICAgICAgPC9zZXJ2ZXI+CisKKyAgICAgICAgICAgIDxjbGllbnQgaG9zdD0iMTI3LjAuMC4xIj4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LWNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1YbXg9NTEyTUIiLz4KKyAgICAgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLnRlc3QuTnVsbFRlc3QiIGlmPSJjb25kaXRpb24xIj4KKyAgICAgICAgICAgICAgICA8YmF0Y2h0ZXN0IHBhdGg9IiR7Y2xhc3NwYXRofSIgdW5sZXNzPSJjb25kaXRpb24yIj4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKipUZXN0KiIvPgorICAgICAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICAgICAgPC9jbGllbnQ+CisgICAgICAgIDxyanVuaXQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNlcnZlci1vbmx5Ij4KKyAgICAgICAgPCEtLSB3aWxsIGJsb2NrIHVudGlsIGEgY2xpZW50IGNvbm5lY3QgYW5kIGZpbmlzaGVzIC0tPgorICAgICAgICA8cmp1bml0IHBvcnQ9IjEyMzQiPgorICAgICAgICAgICAgPHNlcnZlcj4KKyAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIgZmlsdGVycz0ic3RhY2t0cmFjZSIvPgorICAgICAgICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgbG9jYXRpb249InRlc3QueG1sIi8+CisgICAgICAgICAgICAgICAgPC9mb3JtYXR0ZXI+CisgICAgICAgICAgICA8L3NlcnZlcj4KKyAgICAgICA8L3JqdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic2VydmVyLW9ubHkiPgorICAgICAgICA8IS0tIHdpbGwgY29ubmVjdCB0byBhbiBleGlzdGluZyBzZXJ2ZXIgYW5kIHNlbmQgcmVzdWx0cyAtLT4KKyAgICAgICAgPHJqdW5pdCBwb3J0PSIxMjM0Ij4KKyAgICAgICAgICAgIDxjbGllbnQgaG9zdD0iMTI3LjAuMC4xIj4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LWNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1YbXg9NTEyTUIiLz4KKyAgICAgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLnRlc3QuTnVsbFRlc3QiIGlmPSJjb25kaXRpb24xIj4KKyAgICAgICAgICAgIDwvY2xpZW50PgorICAgICAgIDwvcmp1bml0PgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9SSlVuaXRUYXNrVGVzdC5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9SSlVuaXRUYXNrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYjU4OTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L1JKVW5pdFRhc2tUZXN0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgUkpVbml0VGFza1Rlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgUkpVbml0VGFza1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgiZGF0YS9idWlsZC10ZXN0LnhtbCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVByb2plY3QoU3RyaW5nIHJlc291cmNlKXsKKyAgICAgICAgVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgZmluZCByZXNvdXJjZSA6IiArIHJlc291cmNlLCB1cmwpOworICAgICAgICBzdXBlci5jb25maWd1cmVQcm9qZWN0KHVybC5nZXRGaWxlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJBbmRDbGllbnQoKXsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgic2VydmVyLWFuZC1jbGllbnQiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldEZ1bGxMb2coKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJBbmRDbGllbnQyKCl7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInNlcnZlci1hbmQtY2xpZW50Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRGdWxsTG9nKCkpOworICAgIH0KKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFsb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJ1biBzZXJ2ZXIgZmlyc3QuLgorICAgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCl7CisgICAgICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgic2VydmVyLW9ubHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xpZW50LW9ubHkiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldEZ1bGxMb2coKSk7CisgICAgICAgIHRocmVhZC5qb2luKCk7CisgICAgfQorKi8KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9UZXN0UnVuUmVjb3JkZXIuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvVGVzdFJ1blJlY29yZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY1M2Q1NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvVGVzdFJ1blJlY29yZGVyLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdDsKKworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlLlRlc3RSdW5FdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlLlRlc3RSdW5MaXN0ZW5lcjsKKworLyoqCisgKiBBIFRlc3RSdW5MaXN0ZW5lciB0aGF0IHN0b3JlcyBhbGwgZXZlbnRzIGZvciBsYXRlciBjaGVjay4KKyAqCisgKiA8cD4KKyAqIEFsbCB0aGUgZXZlbnRzIGFyZSBzdG9yZWQgY2hyb25vbG9naWNhbGx5IGluIGRpc3RpbmN0IHZlY3RvcnMKKyAqIGFuZCBhcmUgbWFkZSBhdmFpbGFibGUgYXMgcHVibGljIGluc3RhbmNlcworICogPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIFRlc3RSdW5SZWNvcmRlciBpbXBsZW1lbnRzIFRlc3RSdW5MaXN0ZW5lciB7CisKKy8vIGFsbCB0aGVzZSBhcmUgcHVibGljIGluIG9yZGVyIGZvciB0ZXN0Y2FzZXMgdG8gaGF2ZSBhY2Nlc3MgcXVpY2tseQorICAgIHB1YmxpYyBWZWN0b3IgdGVzdFN0YXJ0ZWQgPSBuZXcgVmVjdG9yKCk7CisgICAgcHVibGljIFZlY3RvciB0ZXN0RW5kZWQgPSBuZXcgVmVjdG9yKCk7CisgICAgcHVibGljIFZlY3RvciB0ZXN0RmFpbGVkID0gbmV3IFZlY3RvcigpOworICAgIHB1YmxpYyBWZWN0b3IgdGVzdEVycm9yID0gbmV3IFZlY3RvcigpOworICAgIHB1YmxpYyBWZWN0b3IgcnVuU3RhcnRlZCA9IG5ldyBWZWN0b3IoKTsKKyAgICBwdWJsaWMgVmVjdG9yIHJ1bkVuZGVkID0gbmV3IFZlY3RvcigpOworICAgIHB1YmxpYyBWZWN0b3IgcnVuU3RvcHBlZCA9IG5ldyBWZWN0b3IoKTsKKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdFN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICB0ZXN0U3RhcnRlZC5hZGRFbGVtZW50KGV2dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICB0ZXN0RW5kZWQuYWRkRWxlbWVudChldnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWx1cmUoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICB0ZXN0RmFpbGVkLmFkZEVsZW1lbnQoZXZ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJ1blN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBydW5TdGFydGVkLmFkZEVsZW1lbnQoZXZ0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJ1bkVuZGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgcnVuRW5kZWQuYWRkRWxlbWVudChldnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uUnVuU3RvcHBlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIHJ1blN0b3BwZWQuYWRkRWxlbWVudChldnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3VpdGVTdGFydGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN1aXRlRW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdEVycm9yKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgdGVzdEVycm9yLmFkZEVsZW1lbnQoIGV2dCApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvWmlwU2Nhbm5lclRlc3QuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvWmlwU2Nhbm5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJhNDExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9aaXBTY2FubmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQmFzaWMgdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgY29sbGVjdG9yIGlzIHdvcmtpbmcuCisgKgorICovCitwdWJsaWMgY2xhc3MgWmlwU2Nhbm5lclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIFppcFNjYW5uZXJUZXN0KFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBaaXBTY2FubmVyIF9zY2FubmVyOworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3NjYW5uZXIgPSBuZXcgWmlwU2Nhbm5lcigpOworICAgICAgICBTdHJpbmcgcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyAiL2xpYi9ydC5qYXIiOworICAgICAgICBfc2Nhbm5lci5zZXRCYXNlZGlyKHBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF9zY2FubmVyLnNjYW4oKTsKKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBfc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgIGFzc2VydENvbnRhaW5zKGZpbGVzLCAiamF2YS9sYW5nL0V4Y2VwdGlvbi5jbGFzcyIpOworICAgICAgICBTdHJpbmdbXSBkaXJzID0gX3NjYW5uZXIuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgICAgICBhc3NlcnRDb250YWlucyhkaXJzLCAiamF2YS9sYW5nLyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNsdWRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfc2Nhbm5lci5zZXRJbmNsdWRlcyggbmV3IFN0cmluZ1tdeyAiKiovRXhjZXB0aW9uLmNsYXNzIiB9KTsKKyAgICAgICAgX3NjYW5uZXIuc2NhbigpOworICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IF9zY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGZpbGVzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmaWxlc1swXSwgImphdmEvbGFuZy9FeGNlcHRpb24uY2xhc3MiKTsKKyAgICB9CisKKworCisgICAgcHVibGljIHZvaWQgYXNzZXJ0Q29udGFpbnMoT2JqZWN0W10gbGlzdHMsIE9iamVjdCBvKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0cy5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICBpZiAobGlzdHNbaV0uZXF1YWxzKG8pKXsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiU2hvdWxkIGNvbnRhaW4gIiArIG8pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9kYXRhL1Rlc3QxLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2RhdGEvVGVzdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDhjYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9kYXRhL1Rlc3QxLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LmRhdGE7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogUHJvdmlkZSBhIGNvbW1vbiBzZXQgb2YgdGVzdCByZXBvcnRpbmcuCisgKgorICovCitwdWJsaWMgY2xhc3MgVGVzdDEgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIFRlc3QxKFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzKCl7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZhaWx1cmUoKXsKKyAgICAgICAgZmFpbCgiZmFpbHVyZSBvbiBwdXJwb3NlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVycm9yKCl7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlcnJvciBvbiBwdXJwb3NlIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9kYXRhL2J1aWxkLXRlc3QueG1sIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9kYXRhL2J1aWxkLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjcyMzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2RhdGEvYnVpbGQtdGVzdC54bWwKQEAgLTAsMCArMSw0MiBAQAorPHByb2plY3QgbmFtZT0icmp1bml0LXRlc3RzIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJzZXJ2ZXItYW5kLWNsaWVudCI+CisKKyAgICA8dGFza2RlZiBuYW1lPSJyanVuaXQiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LlJKVW5pdFRhc2siLz4KKworICAgIDx0YXJnZXQgbmFtZT0ic2VydmVyLWFuZC1jbGllbnQiPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJqYXZhLmNsYXNzLnBhdGg6ICR7amF2YS5jbGFzcy5wYXRofSIvPgorICAgICAgICA8cmp1bml0PgorICAgICAgICAgICAgPHNlcnZlciBwb3J0PSIxMjM0Ij4KKyAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIGxvY2F0aW9uPSJqdW5pdC10ZXN0LWxvZy50eHQiLz4KKyAgICAgICAgICAgICAgICA8L2Zvcm1hdHRlcj4KKyAgICAgICAgICAgIDwvc2VydmVyPgorICAgICAgICAgICAgPGNsaWVudCBob3N0PSIxMjcuMC4wLjEiICBwb3J0PSIxMjM0Ij4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgorICAgICAgICAgICAgICAgIDx0ZXN0IG5hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LmRhdGEuVGVzdDEiLz4KKyAgICAgICAgICAgIDwvY2xpZW50PgorICAgICAgICA8L3JqdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic2VydmVyLW9ubHkiPgorICAgICAgICA8cmp1bml0PgorICAgICAgICAgICAgPHNlcnZlciBwb3J0PSIxMjM0Ij4KKyAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIGxvY2F0aW9uPSJqdW5pdC10ZXN0LWxvZy50eHQiLz4KKyAgICAgICAgICAgICAgICA8L2Zvcm1hdHRlcj4KKyAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiBsb2NhdGlvbj0ianVuaXQtdGVzdC1sb2cueG1sIi8+CisgICAgICAgICAgICAgICAgPC9mb3JtYXR0ZXI+CisgICAgICAgICAgICA8L3NlcnZlcj4KKyAgICAgICAgPC9yanVuaXQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsaWVudC1vbmx5Ij4KKyAgICAgICAgPHJqdW5pdD4KKyAgICAgICAgICAgIDxjbGllbnQgaG9zdD0iMTI3LjAuMC4xIiAgcG9ydD0iMTIzNCI+CisgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KKyAgICAgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5kYXRhLlRlc3QxIi8+CisgICAgICAgICAgICA8L2NsaWVudD4KKyAgICAgICAgPC9yanVuaXQ+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9GaWx0ZXJTdGFja0Zvcm1hdHRlclRlc3QuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvZm9ybWF0dGVyL0ZpbHRlclN0YWNrRm9ybWF0dGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZmMxN2YKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9GaWx0ZXJTdGFja0Zvcm1hdHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LmZvcm1hdHRlcjsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGUuVGVzdFJ1bkV2ZW50OworCisvKioKKyAqIE5vdCBleGFjdGx5IHJvY2tldCBzY2llbmNlIHRlc3QuLiBkb29oICEKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJTdGFja0Zvcm1hdHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQorICAgICAgICBpbXBsZW1lbnRzIEZvcm1hdHRlciB7CisKKyAgICBwdWJsaWMgRmlsdGVyU3RhY2tGb3JtYXR0ZXJUZXN0KFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgdHJhY2U7CisgICAgcHJvdGVjdGVkIFN0cmluZyBleHBlY3RlZDsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3LCB0cnVlKTsKKyAgICAgICAgcHcucHJpbnRsbigib3JnLmFwYWNoZS50ZXN0LkNsYXNzTmFtZS5tZXRob2QoQ2xhc3NOYW1lLmphdmE6MTI1KSIpOworICAgICAgICBwdy5wcmludGxuKCJcdGF0IG9yZy5hcGFjaGUudGVzdC5DMS5tMShDMS5qYXZhOjEyNSkiKTsKKyAgICAgICAgcHcucHJpbnRsbigiXHRhdCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UubTAoVGVzdENhc2UuamF2YTo5OTkpIik7CisgICAgICAgIHB3LnByaW50bG4oIlx0YXQgb3JnLmFwYWNoZS50ZXN0LkMyLm0xKEMyLmphdmE6MTI1KSIpOworICAgICAgICBwdy5wcmludGxuKCJcdGF0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0Lm0xKFRlc3RSZXN1bHQuamF2YTo5OTkpIik7CisgICAgICAgIHB3LnByaW50bG4oIlx0YXQgb3JnLmFwYWNoZS50ZXN0LkMzLm0xKEMzLmphdmE6MTI1KSIpOworICAgICAgICBwdy5wcmludGxuKCJcdGF0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUubTIoVGVzdFN1aXRlLmphdmE6OTk5KSIpOworICAgICAgICBwdy5wcmludGxuKCJcdGF0IG9yZy5hcGFjaGUudGVzdC5DNC5tMShDNC5qYXZhOjEyNSkiKTsKKyAgICAgICAgcHcucHJpbnRsbigiXHRhdCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Lm0zKEFzc2VydC5qYXZhOjk5OSkiKTsKKyAgICAgICAgcHcucHJpbnRsbigiXHRhdCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXIubTMoVGVzdFJ1bm5lci5qYXZhOjk5OSkiKTsKKyAgICAgICAgcHcucHJpbnRsbigiXHRhdCBqdW5pdC5hd3R1aS5UZXN0UnVubmVyLm0zKFRlc3RSdW5uZXIuamF2YTo5OTkpIik7CisgICAgICAgIHB3LnByaW50bG4oIlx0YXQgb3JnLmFwYWNoZS50ZXN0LkM1Lm0xKEM1LmphdmE6MTI1KSIpOworICAgICAgICBwdy5wcmludGxuKCJcdGF0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyLm0zKFRlc3RSdW5uZXIuamF2YTo5OTkpIik7CisgICAgICAgIHB3LnByaW50bG4oIlx0YXQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZShNZXRob2QuamF2YTo5OTkpIik7CisgICAgICAgIHB3LnByaW50bG4oIlx0YXQgb3JnLmFwYWNoZS50b29scy5hbnQuQy5tKEMuamF2YTo5OTkpIik7CisgICAgICAgIHB3LnByaW50bG4oIlx0YXQgb3JnLmFwYWNoZS50ZXN0LkM2Lm0xKEM2LmphdmE6MTI1KSIpOworICAgICAgICB0cmFjZSA9IHN3LnRvU3RyaW5nKCk7CisgICAgICAgIHN3LmdldEJ1ZmZlcigpLnNldExlbmd0aCgwKTsKKworICAgICAgICBwdy5wcmludGxuKCJvcmcuYXBhY2hlLnRlc3QuQ2xhc3NOYW1lLm1ldGhvZChDbGFzc05hbWUuamF2YToxMjUpIik7CisgICAgICAgIHB3LnByaW50bG4oIlx0YXQgb3JnLmFwYWNoZS50ZXN0LkMxLm0xKEMxLmphdmE6MTI1KSIpOworICAgICAgICBwdy5wcmludGxuKCJcdGF0IG9yZy5hcGFjaGUudGVzdC5DMi5tMShDMi5qYXZhOjEyNSkiKTsKKyAgICAgICAgcHcucHJpbnRsbigiXHRhdCBvcmcuYXBhY2hlLnRlc3QuQzMubTEoQzMuamF2YToxMjUpIik7CisgICAgICAgIHB3LnByaW50bG4oIlx0YXQgb3JnLmFwYWNoZS50ZXN0LkM0Lm0xKEM0LmphdmE6MTI1KSIpOworICAgICAgICBwdy5wcmludGxuKCJcdGF0IG9yZy5hcGFjaGUudGVzdC5DNS5tMShDNS5qYXZhOjEyNSkiKTsKKyAgICAgICAgcHcucHJpbnRsbigiXHRhdCBvcmcuYXBhY2hlLnRlc3QuQzYubTEoQzYuamF2YToxMjUpIik7CisgICAgICAgIGV4cGVjdGVkID0gc3cudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyaW5nKCkgeworICAgICAgICAvKgorICAgICAgICBGaWx0ZXJTdGFja0Zvcm1hdHRlciB3cmFwcGVyID0gbmV3IEZpbHRlclN0YWNrRm9ybWF0dGVyKHRoaXMpOworICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oInh4Iik7CisgICAgICAgIGUuZmlsbEluU3RhY2tUcmFjZSgpOworICAgICAgICBUZXN0UnVuRXZlbnQgZXZ0ID0gbmV3IFRlc3RSdW5FdmVudChuZXcgSW50ZWdlcigxKSwgVGVzdFJ1bkV2ZW50LlRFU1RfRVJST1IsICJ4eCIpOworICAgICAgICB3cmFwcGVyLm9uVGVzdEZhaWx1cmUoZXZ0KTsKKyAgICAgICAgU3RyaW5nVXRpbHMuZ2V0U3RhY2tUcmFjZSgpCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZmlsdGVyZWRUcmFjZSk7CisgICAgICAgICovCisgICAgfQorCisKKy8vIC0tLSBmb3JtYXR0ZXIgaW1wbGVtZW50YXRpb24KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbHRlcmVkVHJhY2U7CisKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RTdGFydGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblRlc3RFbmRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdEZhaWx1cmUoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgICAgICBmaWx0ZXJlZFRyYWNlID0gdHJhY2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdWl0ZVN0YXJ0ZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3VpdGVFbmRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25UZXN0RXJyb3IoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uUnVuU3RhcnRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SdW5FbmRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SdW5TdG9wcGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L2Zvcm1hdHRlci9Gb3JtYXR0ZXJSZWNvcmRlci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvRm9ybWF0dGVyUmVjb3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWRhOTNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9mb3JtYXR0ZXIvRm9ybWF0dGVyUmVjb3JkZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuZm9ybWF0dGVyOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuVGVzdFJ1blJlY29yZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIEEgZm9ybWF0dGVyIHJlY29yZGVyIHRoYXQgc2VydmVzIHRoZSBzYW1lIHB1cnBvc2UgYXMKKyAqIGEgPHR0PlRlc3RSdW5SZWNvcmRlcjwvdHQ+CisgKgorICoKKyAqIEBzZWUgVGVzdFJ1blJlY29yZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JtYXR0ZXJSZWNvcmRlciBleHRlbmRzIFRlc3RSdW5SZWNvcmRlcgorICAgICAgICBpbXBsZW1lbnRzIEZvcm1hdHRlciB7CisgICAgcHVibGljIHZvaWQgaW5pdChQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL01lc3NhZ2VSZWFkZXJUZXN0LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9NZXNzYWdlUmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjYyMTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9NZXNzYWdlUmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LnJlbW90ZS5UZXN0UnVuTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucmp1bml0LlRlc3RSdW5SZWNvcmRlcjsKKworLyoqCisgKiBFbnN1cmUgdGhhdCB0aGUgUmVhZGVyL1dyaXRlciB3b3JrcyBmaW5lLgorICoKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VSZWFkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBFdmVudERpc3BhdGNoZXIgZGlzcGF0Y2hlcjsKKworICAgIHByb3RlY3RlZCBUZXN0UnVuUmVjb3JkZXIgcmVjb3JkZXI7CisKKyAgICBwdWJsaWMgTWVzc2FnZVJlYWRlclRlc3QoU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGRpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7CisgICAgICAgIHJlY29yZGVyID0gbmV3IFRlc3RSdW5SZWNvcmRlcigpOworICAgICAgICBkaXNwYXRjaGVyLmFkZExpc3RlbmVyKCByZWNvcmRlciApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0UnVuU3RhcnRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0UnVuRXZlbnQgZXZ0ID0gbmV3IFRlc3RSdW5FdmVudChuZXcgSW50ZWdlcig5OSksIFRlc3RSdW5FdmVudC5SVU5fU1RBUlRFRCk7CisgICAgICAgIGRpc3BhdGNoZXIuZmlyZVJ1blN0YXJ0ZWQoIGV2dCApOworICAgICAgICBhc3NlcnRFcXVhbHMoZXZ0LCByZWNvcmRlci5ydW5TdGFydGVkLmVsZW1lbnRBdCgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRlc3RTdGFydGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RSdW5FdmVudCBldnQgPSBuZXcgVGVzdFJ1bkV2ZW50KG5ldyBJbnRlZ2VyKDk5KSwgVGVzdFJ1bkV2ZW50LlRFU1RfU1RBUlRFRCwgInh4eHgiKTsKKyAgICAgICAgZGlzcGF0Y2hlci5maXJlVGVzdFN0YXJ0ZWQoIGV2dCApOworICAgICAgICBhc3NlcnRFcXVhbHMoZXZ0LCByZWNvcmRlci50ZXN0U3RhcnRlZC5lbGVtZW50QXQoMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0RW5kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdFJ1bkV2ZW50IGV2dCA9IG5ldyBUZXN0UnVuRXZlbnQobmV3IEludGVnZXIoOTkpLCBUZXN0UnVuRXZlbnQuVEVTVF9FTkRFRCwgInh4eHgiKTsKKyAgICAgICAgZGlzcGF0Y2hlci5maXJlVGVzdEVuZGVkKCBldnQgKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV2dCwgcmVjb3JkZXIudGVzdEVuZGVkLmVsZW1lbnRBdCgwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRlc3RGYWlsZWRFcnJvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oImVycm9yIik7CisgICAgICAgIGUuZmlsbEluU3RhY2tUcmFjZSgpOworICAgICAgICBUZXN0UnVuRXZlbnQgZXZ0ID0gbmV3IFRlc3RSdW5FdmVudChuZXcgSW50ZWdlcig5OSksIFRlc3RSdW5FdmVudC5URVNUX0VSUk9SLCAieHh4eCIsIGUpOworICAgICAgICBkaXNwYXRjaGVyLmZpcmVUZXN0RXJyb3IoIGV2dCApOworICAgICAgICBhc3NlcnRFcXVhbHMoZXZ0LCByZWNvcmRlci50ZXN0RXJyb3IuZWxlbWVudEF0KDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEZhaWxlZEZhaWx1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJlcnJvciIpOworICAgICAgICBlLmZpbGxJblN0YWNrVHJhY2UoKTsKKyAgICAgICAgVGVzdFJ1bkV2ZW50IGV2dCA9IG5ldyBUZXN0UnVuRXZlbnQobmV3IEludGVnZXIoOTkpLCBUZXN0UnVuRXZlbnQuVEVTVF9GQUlMVVJFLCAieHh4eCIsIGUpOworICAgICAgICBkaXNwYXRjaGVyLmZpcmVUZXN0RmFpbHVyZSggZXZ0ICk7CisgICAgICAgIGFzc2VydEVxdWFscyhldnQsIHJlY29yZGVyLnRlc3RGYWlsZWQuZWxlbWVudEF0KDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdFJ1bkVuZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RSdW5FdmVudCBldnQgPSBuZXcgVGVzdFJ1bkV2ZW50KG5ldyBJbnRlZ2VyKDk5KSwgVGVzdFJ1bkV2ZW50LlJVTl9FTkRFRCk7CisgICAgICAgIGRpc3BhdGNoZXIuZmlyZVJ1bkVuZGVkKCBldnQgKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV2dCwgcmVjb3JkZXIucnVuRW5kZWQuZWxlbWVudEF0KDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdFJ1blN0b3BwZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdFJ1bkV2ZW50IGV2dCA9IG5ldyBUZXN0UnVuRXZlbnQobmV3IEludGVnZXIoOTkpLCBUZXN0UnVuRXZlbnQuUlVOX1NUT1BQRUQpOworICAgICAgICBkaXNwYXRjaGVyLmZpcmVSdW5TdG9wcGVkKCBldnQgKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV2dCwgcmVjb3JkZXIucnVuU3RvcHBlZC5lbGVtZW50QXQoMCkpOworICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL1Rlc3RDYXNlcy5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9qdW5pdC9zcmMvdGVzdGNhc2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3JqdW5pdC9yZW1vdGUvVGVzdENhc2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwYjQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL1Rlc3RDYXNlcy5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIFRlc3RDYXNlcyB7CisKKyAgICAvKiogbnVsbCB0ZXN0Y2FzZSB3LyAzIHRlc3RzICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgICAgIHB1YmxpYyBOdWxsVGVzdENhc2UoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHMpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzKCl7fQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbHVyZSgpeyBhc3NlcnRUcnVlKGZhbHNlKTsgfQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RXJyb3IoKXsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm9uIHB1cnBvc2UiKTsgfQorICAgIH0KKworICAgIC8qKiB0ZXN0Y2FzZSB3LyBhIHN0YXRpYyBzdWl0ZSBtZXRob2QgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgICAgIHB1YmxpYyBOdWxsVGVzdFN1aXRlKFN0cmluZyBzKSB7CisgICAgICAgICAgICBzdXBlcihzKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE51bGxUZXN0Q2FzZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgeworICAgICAgICBwdWJsaWMgU2ltcGxlVGVzdENhc2UoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHMpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzKCl7fQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFpbFNldHVwVGVzdFN1aXRlIGV4dGVuZHMgVGVzdENhc2UgeworICAgICAgICBwdWJsaWMgRmFpbFNldHVwVGVzdFN1aXRlKFN0cmluZyBzKSB7CisgICAgICAgICAgICBzdXBlcihzKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmFpbFRlc3RTZXR1cCggbmV3IFRlc3RTdWl0ZShTaW1wbGVUZXN0Q2FzZS5jbGFzcykgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFpbFRlc3RTZXR1cCBleHRlbmRzIFRlc3RTZXR1cCB7CisgICAgICAgIHB1YmxpYyBGYWlsVGVzdFNldHVwKFRlc3QgdGVzdCkgeworICAgICAgICAgICAgc3VwZXIodGVzdCk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9uIHB1cnBvc2UiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvanVuaXQvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9yanVuaXQvcmVtb3RlL1Rlc3RSdW5uZXJUZXN0LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9UZXN0UnVubmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjAxMzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L2p1bml0L3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcmp1bml0L3JlbW90ZS9UZXN0UnVubmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQucmVtb3RlOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0TGlzdGVuZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5yanVuaXQuZm9ybWF0dGVyLlBsYWluRm9ybWF0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5yZW1vdGUuVGVzdFJ1bkxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnJqdW5pdC5UZXN0UnVuUmVjb3JkZXI7CisKKy8qKgorICogVGVzdENhc2UgZm9yIHRoZSB0ZXN0IHJ1bm5lci4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UnVubmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlCisgICAgICAgIGltcGxlbWVudHMgVGVzdFJ1bkxpc3RlbmVyIHsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBPUlQgPSAxMjM0OworCisgICAgcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7CisKKyAgICBwcm90ZWN0ZWQgVGVzdFJ1bm5lciBydW5uZXI7CisKKyAgICBwcm90ZWN0ZWQgVGVzdFJ1blJlY29yZGVyIHJlY29yZGVyOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZG9uZTsKKworICAgIHB1YmxpYyBUZXN0UnVubmVyVGVzdChTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTsKKyAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisgICAgICAgIHJ1bm5lciA9IGNyZWF0ZUNsaWVudCgpOworICAgICAgICByZWNvcmRlciA9IG5ldyBUZXN0UnVuUmVjb3JkZXIoKTsKKyAgICAgICAgc2VydmVyLmFkZExpc3RlbmVyKCByZWNvcmRlciApOworICAgICAgICBzZXJ2ZXIuYWRkTGlzdGVuZXIoIHRoaXMgKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXJ2ZXIuc2h1dGRvd24oKTsKKyAgICAgICAgcnVubmVyLnN0b3AoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU2VydmVyIGNyZWF0ZVNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFNlcnZlcihQT1JUKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVGVzdFJ1bm5lciBjcmVhdGVDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdFJ1bm5lciBjbGllbnQgPSBuZXcgVGVzdFJ1bm5lcigpOworICAgICAgICBjbGllbnQuc2V0RGVidWcodHJ1ZSk7CisgICAgICAgIGNsaWVudC5zZXRIb3N0KCIxMjcuMC4wLjEiKTsKKyAgICAgICAgY2xpZW50LnNldFBvcnQoUE9SVCk7CisgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5uZXIuYWRkVGVzdENsYXNzTmFtZShUZXN0Q2FzZXMuTnVsbFRlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSk7CisvLyAgICAgICAgc2VydmVyLmFkZExpc3RlbmVyKCBuZXcgUGxhaW5Gb3JtYXR0ZXIoKSApOworICAgICAgICBydW5uZXIucnVuKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKXsgd2hpbGUgKCFkb25lKXsgd2FpdCgpOyB9IH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlY29yZGVyLnJ1blN0YXJ0ZWQuc2l6ZSgpKTsKKyAgICAgICAgLyoKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWNvcmRlci5ydW5TdGFydGVkLmVsZW1lbnRBdCgwKS50b1N0KCJ0ZXN0U3VjY2VzcyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGFydGVkLmNvbnRhaW5zKCJ0ZXN0RmFpbHVyZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGFydGVkLmNvbnRhaW5zKCJ0ZXN0RXJyb3IiKSk7Ki8KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsU2V0dXBUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5uZXIuYWRkVGVzdENsYXNzTmFtZShUZXN0Q2FzZXMuRmFpbFNldHVwVGVzdFN1aXRlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHJ1bm5lci5ydW4oKTsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpeyB3aGlsZSAoIWRvbmUpeyB3YWl0KCk7IH0gfQorCisgICAgICAgIGFzc2VydEVxdWFscygxLCByZWNvcmRlci5ydW5TdGFydGVkLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZWNvcmRlci5ydW5FbmRlZC5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsU2V0dXBUZXN0U3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVubmVyLmFkZFRlc3RDbGFzc05hbWUoVGVzdENhc2VzLkZhaWxTZXR1cFRlc3RTdWl0ZS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBydW5uZXIucnVuKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKXsgd2hpbGUgKCFkb25lKXsgd2FpdCgpOyB9IH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlY29yZGVyLnJ1blN0YXJ0ZWQuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlY29yZGVyLnJ1bkVuZGVkLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoVGVzdFJ1bm5lclRlc3QuY2xhc3MpOworICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oc3VpdGUpOworICAgIH0KKworLy8gVGVzdFJ1bkxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgcHVibGljIHZvaWQgb25UZXN0U3RhcnRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIG9uVGVzdEVuZGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICB9CisgICAgcHVibGljIHZvaWQgb25UZXN0RmFpbHVyZShUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIG9uUnVuU3RhcnRlZChUZXN0UnVuRXZlbnQgY291bnQpIHsKKyAgICB9CisgICAgcHVibGljIHZvaWQgb25SdW5FbmRlZChUZXN0UnVuRXZlbnQgZXZ0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKXsKKyAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgb25SdW5TdG9wcGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpeworICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU3VpdGVTdGFydGVkKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN1aXRlRW5kZWQoVGVzdFJ1bkV2ZW50IGV2dCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGVzdEVycm9yKFRlc3RSdW5FdmVudCBldnQpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9SRUFETUUgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlOGVhYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvc2VsZWN0b3JzL1JFQURNRQpAQCAtMCwwICsxLDM0IEBACitTZWxlY3RvciBBUEkKKz09PT09PT09PT09PQorCitDdXJyZW50bHkgb3VyIGZpbGVzZXRzIGFsbG93IHVzIHRvIHNlbGVjdCBhIHNldCBvZiBmaWxlcyBiYXNlZCBvbiBuYW1lIHBhdHRlcm5zLgorRm9yIGluc3RhbmNlIHdlIGNvdWxkIGNyZWF0ZSBhIHNldCBvZiBhbGwgdGhlIGZpbGVzIHRoYXQgZW5kIHdpdGggIi5qYXZhIi4gCitIb3dldmVyIHRoZXJlIGFyZSBjYXNlcyB3aGVuIHlvdSB3aXNoIHRvIHNlbGVjdCBmaWxlcyBiYXNlZCBvbiB0aGVpciBvdGhlciAKK2F0dHJpYnV0ZXMsIHN1Y2ggYXMgaWYgdGhleSBhcmUgcmVhZCBvbmx5IG9yIGlmIHRoZXkgYXJlIG9sZGVyIHRoYW4gYSBzcGVjaWZpZWQgCitkYXRlIGV0Yy4gCisKK1RoZSBzZWxlY3RvciBBUEkgaXMgb25lIHN1Y2ggbWVjaGFuaXNtIHRvIGRvIHRoaXMuIFRoZSBzZWxlY3RvciBBUEkgd2lsbCBhbGxvdyAKK3lvdSB0byBidWlsZCBmaWxlIHNldHMgYmFzZWQgb24gY3JpdGVyaWEgb3RoZXIgdGhhbiBuYW1lLiBTb21lIHBvc3NpYmxlIGNyaXRlcmlhIAord291bGQgYmUgCisKK0lzIHRoZSBmaWxlIHJlYWRhYmxlPyAKK0lzIHRoZSBmaWxlIHdyaXRlYWJsZT8gCitXaGF0IGRhdGUgd2FzIHRoZSBmaWxlIG1vZGlmaWVkIG9uPyAKK1doYXQgc2l6ZSBpcyB0aGUgZmlsZT8gCitEb2VzIHRoZSBjb250ZW50cyBjb250YWluIHRoZSBzdHJpbmcgIm1hZ2ljIj8gCisKK0lmIHdlIGVuZCB1cCBzdXBwb3J0aW5nIGEgVkZTIHRoZW4gd2UgY291bGQgZXhwYW5kIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIAorY29uc2lkZXJhYmx5LiBBIG1vY2sgcmVwcmVzZW50YXRpb24gdGhhdCBoYXMgYmVlbiBwcm9wb3NlZCBiZWZvcmUgaXMgdGhlIAorZm9sbG93aW5nLiBPZiBjb3Vyc2UgdGhpcyBpcyBzdWJqZWN0IHRvIGNoYW5nZSBhcyBzb29uIGFzIHNvbWVvbmUgd2FudHMgdG8gCit0YWNrbGUgdGhpcyBhY3Rpb24gOykgCisKKyA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiPgorICAgPHNlbGVjdG9yIHR5cGU9InBlcm1pc3Npb24iIHZhbHVlPSJyIi8+CisKKyAgIDwhLS0gY291bGQgb3B0aW9uYWxseSBiZSBkaXJlY3Rvcnkvb3Igc29tZSBvdGhlciBzeXN0ZW0gc3BlY2lmaWMgZmVhdHVyZXMgLS0+CisgICA8c2VsZWN0b3IgdHlwZT0idHlwZSIgdmFsdWU9ImZpbGUiLz4gCisgICA8c2VsZWN0b3IgdHlwZT0ibW9kaWZ5LXRpbWUiIAorICAgICAgICAgICAgIG9wZXJhdGlvbj0iZ3JlYXRlci10aGFuIiAKKyAgICAgICAgICAgICB2YWx1ZT0iMjl0aCBGZWIgMjAwMyIvPgorIDwvaW5jbHVkZT4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGlyZWN0b3J5U2Nhbm5lci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGlyZWN0b3J5U2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMWI3MzcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyLmphdmEKQEAgLTAsMCArMSwxMjA0IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm47CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKKworLyoqCisgKiBDbGFzcyBmb3Igc2Nhbm5pbmcgYSBkaXJlY3RvcnkgZm9yIGZpbGVzL2RpcmVjdG9yaWVzIHRoYXQgbWF0Y2ggYSBjZXJ0YWluCisgKiBjcml0ZXJpYS4KKyAqIDxwPgorICogVGhlc2UgY3JpdGVyaWEgY29uc2lzdCBvZiBhIHNldCBvZiBpbmNsdWRlIGFuZCBleGNsdWRlIHBhdHRlcm5zLiBXaXRoIHRoZXNlCisgKiBwYXR0ZXJucywgeW91IGNhbiBzZWxlY3Qgd2hpY2ggZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCwgYW5kIHdoaWNoCisgKiBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLgorICogPHA+CisgKiBUaGUgaWRlYSBpcyBzaW1wbGUuIEEgZ2l2ZW4gZGlyZWN0b3J5IGlzIHJlY3Vyc2l2ZWx5IHNjYW5uZWQgZm9yIGFsbCBmaWxlcworICogYW5kIGRpcmVjdG9yaWVzLiBFYWNoIGZpbGUvZGlyZWN0b3J5IGlzIG1hdGNoZWQgYWdhaW5zdCBhIHNldCBvZiBpbmNsdWRlCisgKiBhbmQgZXhjbHVkZSBwYXR0ZXJucy4gT25seSBmaWxlcy9kaXJlY3RvcmllcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZQorICogcGF0dGVybiBvZiB0aGUgaW5jbHVkZSBwYXR0ZXJuIGxpc3QsIGFuZCBkb24ndCBtYXRjaCBhIHBhdHRlcm4gb2YgdGhlCisgKiBleGNsdWRlIHBhdHRlcm4gbGlzdCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgbGlzdCBvZiBmaWxlcy9kaXJlY3RvcmllcyBmb3VuZC4KKyAqIDxwPgorICogV2hlbiBubyBsaXN0IG9mIGluY2x1ZGUgcGF0dGVybnMgaXMgc3VwcGxpZWQsICIqKiIgd2lsbCBiZSB1c2VkLCB3aGljaAorICogbWVhbnMgdGhhdCBldmVyeXRoaW5nIHdpbGwgYmUgbWF0Y2hlZC4gV2hlbiBubyBsaXN0IG9mIGV4Y2x1ZGUgcGF0dGVybnMgaXMKKyAqIHN1cHBsaWVkLCBhbiBlbXB0eSBsaXN0IGlzIHVzZWQsIHN1Y2ggdGhhdCBub3RoaW5nIHdpbGwgYmUgZXhjbHVkZWQuCisgKiA8cD4KKyAqIFRoZSBwYXR0ZXJuIG1hdGNoaW5nIGlzIGRvbmUgYXMgZm9sbG93czoKKyAqIFRoZSBuYW1lIHRvIGJlIG1hdGNoZWQgaXMgc3BsaXQgdXAgaW4gcGF0aCBzZWdtZW50cy4gQSBwYXRoIHNlZ21lbnQgaXMgdGhlCisgKiBuYW1lIG9mIGEgZGlyZWN0b3J5IG9yIGZpbGUsIHdoaWNoIGlzIGJvdW5kZWQgYnkKKyAqIDxjb2RlPkZpbGUuc2VwYXJhdG9yPC9jb2RlPiAoJy8nIHVuZGVyIFVOSVgsICdcJyB1bmRlciBXaW5kb3dzKS4KKyAqIEUuZy4gImFiYy9kZWYvZ2hpL3h5ei5qYXZhIiBpcyBzcGxpdCB1cCBpbiB0aGUgc2VnbWVudHMgImFiYyIsICJkZWYiLCAiZ2hpIgorICogYW5kICJ4eXouamF2YSIuCisgKiBUaGUgc2FtZSBpcyBkb25lIGZvciB0aGUgcGF0dGVybiBhZ2FpbnN0IHdoaWNoIHNob3VsZCBiZSBtYXRjaGVkLgorICogPHA+CisgKiBUaGVuIHRoZSBzZWdtZW50cyBvZiB0aGUgbmFtZSBhbmQgdGhlIHBhdHRlcm4gd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgZWFjaAorICogb3RoZXIuIFdoZW4gJyoqJyBpcyB1c2VkIGZvciBhIHBhdGggc2VnbWVudCBpbiB0aGUgcGF0dGVybiwgdGhlbiBpdCBtYXRjaGVzCisgKiB6ZXJvIG9yIG1vcmUgcGF0aCBzZWdtZW50cyBvZiB0aGUgbmFtZS4KKyAqIDxwPgorICogVGhlcmUgYXJlIHNwZWNpYWwgY2FzZSByZWdhcmRpbmcgdGhlIHVzZSBvZiA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT5zIGF0CisgKiB0aGUgYmVnaW5uaW5nb2YgdGhlIHBhdHRlcm4gYW5kIHRoZSBzdHJpbmcgdG8gbWF0Y2g6PGJyPgorICogV2hlbiBhIHBhdHRlcm4gc3RhcnRzIHdpdGggYSA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT4sIHRoZSBzdHJpbmcKKyAqIHRvIG1hdGNoIG11c3QgYWxzbyBzdGFydCB3aXRoIGEgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+LgorICogV2hlbiBhIHBhdHRlcm4gZG9lcyBub3Qgc3RhcnQgd2l0aCBhIDxjb2RlPkZpbGUuc2VwYXJhdG9yPC9jb2RlPiwgdGhlCisgKiBzdHJpbmcgdG8gbWF0Y2ggbWF5IG5vdCBzdGFydCB3aXRoIGEgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+LgorICogV2hlbiBvbmUgb2YgdGhlc2UgcnVsZXMgaXMgbm90IG9iZXllZCwgdGhlIHN0cmluZyB3aWxsIG5vdAorICogbWF0Y2guCisgKiA8cD4KKyAqIFdoZW4gYSBuYW1lIHBhdGggc2VnbWVudCBpcyBtYXRjaGVkIGFnYWluc3QgYSBwYXR0ZXJuIHBhdGggc2VnbWVudCwgdGhlCisgKiBmb2xsb3dpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzIGNhbiBiZSB1c2VkOgorICogJyonIG1hdGNoZXMgemVybyBvciBtb3JlIGNoYXJhY3RlcnMsCisgKiAnPycgbWF0Y2hlcyBvbmUgY2hhcmFjdGVyLgorICogPHA+CisgKiBFeGFtcGxlczoKKyAqIDxwPgorICogIioqXCouY2xhc3MiIG1hdGNoZXMgYWxsIC5jbGFzcyBmaWxlcy9kaXJzIGluIGEgZGlyZWN0b3J5IHRyZWUuCisgKiA8cD4KKyAqICJ0ZXN0XGE/Py5qYXZhIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHdoaWNoIHN0YXJ0IHdpdGggYW4gJ2EnLCB0aGVuIHR3bworICogbW9yZSBjaGFyYWN0ZXJzIGFuZCB0aGVuICIuamF2YSIsIGluIGEgZGlyZWN0b3J5IGNhbGxlZCB0ZXN0LgorICogPHA+CisgKiAiKioiIG1hdGNoZXMgZXZlcnl0aGluZyBpbiBhIGRpcmVjdG9yeSB0cmVlLgorICogPHA+CisgKiAiKipcdGVzdFwqKlxYWVoqIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHRoYXQgc3RhcnQgd2l0aCAiWFlaIiBhbmQgd2hlcmUKKyAqIHRoZXJlIGlzIGEgcGFyZW50IGRpcmVjdG9yeSBjYWxsZWQgdGVzdCAoZS5nLiAiYWJjXHRlc3RcZGVmXGdoaVxYWVoxMjMiKS4KKyAqIDxwPgorICogQ2FzZSBzZW5zaXRpdml0eSBtYXkgYmUgdHVybmVkIG9mZiBpZiBuZWNlc3NhcnkuICBCeSBkZWZhdWx0LCBpdCBpcworICogdHVybmVkIG9uLgorICogPHA+CisgKiBFeGFtcGxlIG9mIHVzYWdlOgorICogPHByZT4KKyAqICAgU3RyaW5nW10gaW5jbHVkZXMgPSB7IioqXFwqLmNsYXNzIn07CisgKiAgIFN0cmluZ1tdIGV4Y2x1ZGVzID0geyJtb2R1bGVzXFwqXFwqKiJ9OworICogICBkcy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7CisgKiAgIGRzLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKKyAqICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZSgidGVzdCIpKTsKKyAqICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZSh0cnVlKTsKKyAqICAgZHMuc2NhbigpOworICoKKyAqICAgU3lzdGVtLm91dC5wcmludGxuKCJGSUxFUzoiKTsKKyAqICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisgKiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoO2krKykgeworICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihmaWxlc1tpXSk7CisgKiAgIH0KKyAqIDwvcHJlPgorICogVGhpcyB3aWxsIHNjYW4gYSBkaXJlY3RvcnkgY2FsbGVkIHRlc3QgZm9yIC5jbGFzcyBmaWxlcywgYnV0IGV4Y2x1ZGVzIGFsbAorICogLmNsYXNzIGZpbGVzIGluIGFsbCBkaXJlY3RvcmllcyB1bmRlciBhIGRpcmVjdG9yeSBjYWxsZWQgIm1vZHVsZXMiCisgKgorICovCitwdWJsaWMgY2xhc3MgRGlyZWN0b3J5U2Nhbm5lciBpbXBsZW1lbnRzIEZpbGVTY2FubmVyIHsKKworICAgIC8qKgorICAgICAqIFBhdHRlcm5zIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAc2VlICNhZGREZWZhdWx0RXhjbHVkZXMoKQorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gREVGQVVMVEVYQ0xVREVTID0geworICAgICAgICAiKiovKn4iLAorICAgICAgICAiKiovIyojIiwKKyAgICAgICAgIioqLy4jKiIsCisgICAgICAgICIqKi8lKiUiLAorICAgICAgICAiKiovQ1ZTIiwKKyAgICAgICAgIioqL0NWUy8qKiIsCisgICAgICAgICIqKi8uY3ZzaWdub3JlIiwKKyAgICAgICAgIioqL1NDQ1MiLAorICAgICAgICAiKiovU0NDUy8qKiIsCisgICAgICAgICIqKi92c3N2ZXIuc2NjIgorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBkaXJlY3Rvcnkgd2hpY2ggc2hvdWxkIGJlIHNjYW5uZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgYmFzZWRpcjsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXR0ZXJucyBmb3IgdGhlIGZpbGVzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBQYXR0ZXJuW10gaW5jbHVkZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0dGVybnMgZm9yIHRoZSBmaWxlcyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGF0dGVybltdIGV4Y2x1ZGVzOworCisgICAgLyoqCisgICAgICogVGhlIGZpbGVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGluY2x1ZGVzLCBhbmQgbWF0Y2hlZAorICAgICAqIG5vIGV4Y2x1ZGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNJbmNsdWRlZDsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlcyB0aGF0IHdoZXJlIGZvdW5kIGFuZCBkaWQgbm90IG1hdGNoIGFueSBpbmNsdWRlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzTm90SW5jbHVkZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZXMgdGhhdCB3aGVyZSBmb3VuZCBhbmQgbWF0Y2hlZCBhdCBsZWFzdCBvbmUgaW5jbHVkZXMsIGFuZCBhbHNvCisgICAgICogbWF0Y2hlZCBhdCBsZWFzdCBvbmUgZXhjbHVkZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlY3RvciBmaWxlc0V4Y2x1ZGVkOworCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yaWVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGluY2x1ZGVzLCBhbmQKKyAgICAgKiBtYXRjaGVkIG5vIGV4Y2x1ZGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZGlyc0luY2x1ZGVkOworCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yaWVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIGRpZCBub3QgbWF0Y2ggYW55IGluY2x1ZGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZGlyc05vdEluY2x1ZGVkOworCisgICAgLyoqCisgICAgICogVGhlIGZpbGVzIHRoYXQgd2hlcmUgZm91bmQgYW5kIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGluY2x1ZGVzLCBhbmQgYWxzbworICAgICAqIG1hdGNoZWQgYXQgbGVhc3Qgb25lIGV4Y2x1ZGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZGlyc0V4Y2x1ZGVkOworCisgICAgLyoqCisgICAgICogSGF2ZSB0aGUgVmVjdG9ycyBob2xkaW5nIG91ciByZXN1bHRzIGJlZW4gYnVpbHQgYnkgYSBzbG93IHNjYW4/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGF2ZVNsb3dSZXN1bHRzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgdGhlIGZpbGUgc3lzdGVtIGJlIHRyZWF0ZWQgYXMgYSBjYXNlIHNlbnNpdGl2ZSBvbmU/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIElzIGV2ZXJ5dGhpbmcgd2UndmUgc2VlbiBzbyBmYXIgaW5jbHVkZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZlcnl0aGluZ0luY2x1ZGVkID0gdHJ1ZTsKKworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBzZWxlY3RvckNsYXNzZXMgPSBudWxsOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3RyaW5nIGRlZnMgPSAiL29yZy9hcGFjaGUvdG9vbHMvYW50L3NlbGVjdG9ycy9kZWZhdWx0cy5wcm9wZXJ0aWVzIjsKKyAgICAgICAgc2VsZWN0b3JDbGFzc2VzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gRGlyZWN0b3J5U2Nhbm5lci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGRlZnMpOworICAgICAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbid0IGxvYWQgZGVmYXVsdCBzZWxlY3RvciBsaXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0gPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgICAgICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckNsYXNzZXMucHV0KGtleSwgQ2xhc3MuZm9yTmFtZSh2YWx1ZSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgbG9hZCBkZWZhdWx0IHNlbGVjdG9yIGxpc3QiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBEaXJlY3RvcnlTY2FubmVyKCkgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgcGF0aCBtYXRjaCB0aGUgc3RhcnQgb2YgdGhpcyBwYXR0ZXJuIHVwIHRvIHRoZSBmaXJzdCAiKioiLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgdGVzdCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKKyAgICAgKiBjYW4gbGl2ZSB3aXRoIGZhbHNlIHBvc2l0aXZlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD48Y29kZT5wYXR0ZXJuPSoqXFxhPC9jb2RlPiBhbmQgPGNvZGU+c3RyPWI8L2NvZGU+IHdpbGwgeWllbGQgdHJ1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSAobm9uLW51bGwpIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdAorICAgICAqIEBwYXJhbSBzdHIgICAgIHRoZSAobm9uLW51bGwpIHN0cmluZyAocGF0aCkgdG8gbWF0Y2gKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuU3RhcnQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIpIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoUGF0dGVyblN0YXJ0KHBhdHRlcm4sIHN0ciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgcGF0aCBtYXRjaCB0aGUgc3RhcnQgb2YgdGhpcyBwYXR0ZXJuIHVwIHRvIHRoZSBmaXJzdCAiKioiLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgdGVzdCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKKyAgICAgKiBjYW4gbGl2ZSB3aXRoIGZhbHNlIHBvc2l0aXZlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD48Y29kZT5wYXR0ZXJuPSoqXFxhPC9jb2RlPiBhbmQgPGNvZGU+c3RyPWI8L2NvZGU+IHdpbGwgeWllbGQgdHJ1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuICAgICAgICAgICAgIHRoZSAobm9uLW51bGwpIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdAorICAgICAqIEBwYXJhbSBzdHIgICAgICAgICAgICAgICAgIHRoZSAobm9uLW51bGwpIHN0cmluZyAocGF0aCkgdG8gbWF0Y2gKKyAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlICAgICBtdXN0IG1hdGNoZXMgYmUgY2FzZSBzZW5zaXRpdmU/CisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoUGF0dGVyblN0YXJ0KFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworICAgICAgICAvLyBXaGVuIHN0ciBzdGFydHMgd2l0aCBhIEZpbGUuc2VwYXJhdG9yLCBwYXR0ZXJuIGhhcyB0byBzdGFydCB3aXRoIGEKKyAgICAgICAgLy8gRmlsZS5zZXBhcmF0b3IuCisgICAgICAgIC8vIFdoZW4gcGF0dGVybiBzdGFydHMgd2l0aCBhIEZpbGUuc2VwYXJhdG9yLCBzdHIgaGFzIHRvIHN0YXJ0IHdpdGggYQorICAgICAgICAvLyBGaWxlLnNlcGFyYXRvci4KKyAgICAgICAgaWYgKHN0ci5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSAhPQorICAgICAgICAgICAgcGF0dGVybi5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yIHBhdERpcnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybixGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIHBhdERpcnMuYWRkRWxlbWVudChzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3Igc3RyRGlycyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cixGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIHN0ckRpcnMuYWRkRWxlbWVudChzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcGF0SWR4U3RhcnQgPSAwOworICAgICAgICBpbnQgcGF0SWR4RW5kICAgPSBwYXREaXJzLnNpemUoKS0xOworICAgICAgICBpbnQgc3RySWR4U3RhcnQgPSAwOworICAgICAgICBpbnQgc3RySWR4RW5kICAgPSBzdHJEaXJzLnNpemUoKS0xOworCisgICAgICAgIC8vIHVwIHRvIGZpcnN0ICcqKicKKyAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0IDw9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXREaXIgPSAoU3RyaW5nKXBhdERpcnMuZWxlbWVudEF0KHBhdElkeFN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChwYXREaXIuZXF1YWxzKCIqKiIpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hdGNoKHBhdERpciwoU3RyaW5nKXN0ckRpcnMuZWxlbWVudEF0KHN0cklkeFN0YXJ0KSwgaXNDYXNlU2Vuc2l0aXZlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7CisgICAgICAgICAgICBzdHJJZHhTdGFydCsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7CisgICAgICAgICAgICAvLyBTdHJpbmcgaXMgZXhoYXVzdGVkCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRJZHhTdGFydCA+IHBhdElkeEVuZCkgeworICAgICAgICAgICAgLy8gU3RyaW5nIG5vdCBleGhhdXN0ZWQsIGJ1dCBwYXR0ZXJuIGlzLiBGYWlsdXJlLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcGF0dGVybiBub3cgaG9sZHMgKiogd2hpbGUgc3RyaW5nIGlzIG5vdCBleGhhdXN0ZWQKKyAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBnZW5lcmF0ZSBmYWxzZSBwb3NpdGl2ZXMgYnV0IHdlIGNhbiBsaXZlIHdpdGggdGhhdC4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0ZWQoU3RyaW5nIGZpbGVUb1NjYW4sIFZlY3RvciBzZWxlY3Rvckxpc3QpIHsKKyAgICAgICAgYm9vbGVhbiBpc0luY2x1c2l2ZSA9IHRydWU7CisgICAgICAgIGlmIChzZWxlY3Rvckxpc3QgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIFBhdHRlcm5TZXQuU2VsZWN0b3JFbnRyeVtdIHNlbGVjdG9yRW50cmllcyA9CisgICAgICAgICAgICAgICAgbmV3IFBhdHRlcm5TZXQuU2VsZWN0b3JFbnRyeVtzZWxlY3Rvckxpc3Quc2l6ZSgpXTsKKyAgICAgICAgICAgIHNlbGVjdG9yTGlzdC5jb3B5SW50byhzZWxlY3RvckVudHJpZXMpOworICAgICAgICAgICAgYm9vbGVhbltdIHNlbGVjdG9ySW5kaWNlcyA9IG5ldyBib29sZWFuW3NlbGVjdG9yRW50cmllcy5sZW5ndGhdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdG9yRW50cmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gc2VsZWN0b3JFbnRyaWVzW2ldLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZWxlY3RvckVudHJpZXNbaV0uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gc2VsZWN0b3JFbnRyaWVzW2ldLmdldE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgIENsYXNzIGMgPSAoQ2xhc3MpIHNlbGVjdG9yQ2xhc3Nlcy5nZXQodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlU2VsZWN0b3IgcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gKEZpbGVTZWxlY3RvcikgYy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcy5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLnNldE9wZXJhdGlvbihvcGVyYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgaXNJbmNsdXNpdmUgPSBzLmlzU2VsZWN0ZWQoZmlsZVRvU2Nhbik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNJbmNsdXNpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpc0luY2x1c2l2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVzIGEgcGF0aCBhZ2FpbnN0IGEgcGF0dGVybi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSAobm9uLW51bGwpIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdAorICAgICAqIEBwYXJhbSBzdHIgICAgIHRoZSAobm9uLW51bGwpIHN0cmluZyAocGF0aCkgdG8gbWF0Y2gKKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgcGF0dGVybiBtYXRjaGVzIGFnYWluc3QgdGhlIHN0cmluZy4KKyAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoUGF0aChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0cikgeworICAgICAgICByZXR1cm4gbWF0Y2hQYXRoKHBhdHRlcm4sIG51bGwsIHN0ciwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoUGF0aChTdHJpbmcgcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIHJldHVybiBtYXRjaFBhdGgocGF0dGVybiwgbnVsbCwgc3RyLCBpc0Nhc2VTZW5zaXRpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXMgYSBwYXRoIGFnYWluc3QgYSBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gICAgICAgICAgICB0aGUgKG5vbi1udWxsKSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBAcGFyYW0gc3RyICAgICAgICAgICAgICAgIHRoZSAobm9uLW51bGwpIHN0cmluZyAocGF0aCkgdG8gbWF0Y2gKKyAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlICAgIG11c3QgYSBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBiZSBkb25lPworICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBwYXR0ZXJuIG1hdGNoZXMgYWdhaW5zdCB0aGUgc3RyaW5nLgorICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXRoKFN0cmluZyBwYXR0ZXJuLCBWZWN0b3Igc2VsZWN0b3JMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgLy8gV2hlbiBzdHIgc3RhcnRzIHdpdGggYSBGaWxlLnNlcGFyYXRvciwgcGF0dGVybiBoYXMgdG8gc3RhcnQgd2l0aCBhCisgICAgICAgIC8vIEZpbGUuc2VwYXJhdG9yLgorICAgICAgICAvLyBXaGVuIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBGaWxlLnNlcGFyYXRvciwgc3RyIGhhcyB0byBzdGFydCB3aXRoIGEKKyAgICAgICAgLy8gRmlsZS5zZXBhcmF0b3IuCisgICAgICAgIGlmIChzdHIuc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikgIT0KKyAgICAgICAgICAgIHBhdHRlcm4uc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvciBwYXREaXJzID0gbmV3IFZlY3RvcigpOworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdHRlcm4sRmlsZS5zZXBhcmF0b3IpOworICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBwYXREaXJzLmFkZEVsZW1lbnQoc3QubmV4dFRva2VuKCkpOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yIHN0ckRpcnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsRmlsZS5zZXBhcmF0b3IpOworICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBzdHJEaXJzLmFkZEVsZW1lbnQoc3QubmV4dFRva2VuKCkpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHBhdElkeFN0YXJ0ID0gMDsKKyAgICAgICAgaW50IHBhdElkeEVuZCAgID0gcGF0RGlycy5zaXplKCktMTsKKyAgICAgICAgaW50IHN0cklkeFN0YXJ0ID0gMDsKKyAgICAgICAgaW50IHN0cklkeEVuZCAgID0gc3RyRGlycy5zaXplKCktMTsKKworICAgICAgICAvLyB1cCB0byBmaXJzdCAnKionCisgICAgICAgIHdoaWxlIChwYXRJZHhTdGFydCA8PSBwYXRJZHhFbmQgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0RGlyID0gKFN0cmluZylwYXREaXJzLmVsZW1lbnRBdChwYXRJZHhTdGFydCk7CisgICAgICAgICAgICBpZiAocGF0RGlyLmVxdWFscygiKioiKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtYXRjaChwYXREaXIsKFN0cmluZylzdHJEaXJzLmVsZW1lbnRBdChzdHJJZHhTdGFydCksIGlzQ2FzZVNlbnNpdGl2ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRJZHhTdGFydCsrOworICAgICAgICAgICAgc3RySWR4U3RhcnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIC8vIFN0cmluZyBpcyBleGhhdXN0ZWQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghcGF0RGlycy5lbGVtZW50QXQoaSkuZXF1YWxzKCIqKiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaXNTZWxlY3RlZChzdHIsIHNlbGVjdG9yTGlzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGF0SWR4U3RhcnQgPiBwYXRJZHhFbmQpIHsKKyAgICAgICAgICAgICAgICAvLyBTdHJpbmcgbm90IGV4aGF1c3RlZCwgYnV0IHBhdHRlcm4gaXMuIEZhaWx1cmUuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdXAgdG8gbGFzdCAnKionCisgICAgICAgIHdoaWxlIChwYXRJZHhTdGFydCA8PSBwYXRJZHhFbmQgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0RGlyID0gKFN0cmluZylwYXREaXJzLmVsZW1lbnRBdChwYXRJZHhFbmQpOworICAgICAgICAgICAgaWYgKHBhdERpci5lcXVhbHMoIioqIikpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbWF0Y2gocGF0RGlyLChTdHJpbmcpc3RyRGlycy5lbGVtZW50QXQoc3RySWR4RW5kKSwgaXNDYXNlU2Vuc2l0aXZlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdElkeEVuZC0tOworICAgICAgICAgICAgc3RySWR4RW5kLS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7CisgICAgICAgICAgICAvLyBTdHJpbmcgaXMgZXhoYXVzdGVkCisgICAgICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBhdERpcnMuZWxlbWVudEF0KGkpLmVxdWFscygiKioiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQoc3RyLCBzZWxlY3Rvckxpc3QpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0ICE9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIGludCBwYXRJZHhUbXAgPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydCsxOyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdERpcnMuZWxlbWVudEF0KGkpLmVxdWFscygiKioiKSkgeworICAgICAgICAgICAgICAgICAgICBwYXRJZHhUbXAgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGF0SWR4VG1wID09IHBhdElkeFN0YXJ0KzEpIHsKKyAgICAgICAgICAgICAgICAvLyAnKiovKionIHNpdHVhdGlvbiwgc28gc2tpcCBvbmUKKyAgICAgICAgICAgICAgICBwYXRJZHhTdGFydCsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmluZCB0aGUgcGF0dGVybiBiZXR3ZWVuIHBhZElkeFN0YXJ0ICYgcGFkSWR4VG1wIGluIHN0ciBiZXR3ZWVuCisgICAgICAgICAgICAvLyBzdHJJZHhTdGFydCAmIHN0cklkeEVuZAorICAgICAgICAgICAgaW50IHBhdExlbmd0aCA9IChwYXRJZHhUbXAtcGF0SWR4U3RhcnQtMSk7CisgICAgICAgICAgICBpbnQgc3RyTGVuZ3RoID0gKHN0cklkeEVuZC1zdHJJZHhTdGFydCsxKTsKKyAgICAgICAgICAgIGludCBmb3VuZElkeCAgPSAtMTsKK3N0ckxvb3A6CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHJMZW5ndGggLSBwYXRMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGF0TGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlBhdCA9IChTdHJpbmcpcGF0RGlycy5lbGVtZW50QXQocGF0SWR4U3RhcnQraisxKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlN0ciA9IChTdHJpbmcpc3RyRGlycy5lbGVtZW50QXQoc3RySWR4U3RhcnQraStqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaChzdWJQYXQsc3ViU3RyLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzdHJMb29wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm91bmRJZHggPSBzdHJJZHhTdGFydCtpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm91bmRJZHggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhdElkeFN0YXJ0ID0gcGF0SWR4VG1wOworICAgICAgICAgICAgc3RySWR4U3RhcnQgPSBmb3VuZElkeCtwYXRMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghcGF0RGlycy5lbGVtZW50QXQoaSkuZXF1YWxzKCIqKiIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQoc3RyLCBzZWxlY3Rvckxpc3QpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTWF0Y2hlcyBhIHN0cmluZyBhZ2FpbnN0IGEgcGF0dGVybi4gVGhlIHBhdHRlcm4gY29udGFpbnMgdHdvIHNwZWNpYWwKKyAgICAgKiBjaGFyYWN0ZXJzOgorICAgICAqICcqJyB3aGljaCBtZWFucyB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycywKKyAgICAgKiAnPycgd2hpY2ggbWVhbnMgb25lIGFuZCBvbmx5IG9uZSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgKG5vbi1udWxsKSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBAcGFyYW0gc3RyICAgICB0aGUgKG5vbi1udWxsKSBzdHJpbmcgdGhhdCBtdXN0IGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBwYXR0ZXJuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIHN0cmluZyBtYXRjaGVzIGFnYWluc3QgdGhlIHBhdHRlcm4sCisgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0cikgeworICAgICAgICByZXR1cm4gbWF0Y2gocGF0dGVybiwgc3RyLCB0cnVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1hdGNoZXMgYSBzdHJpbmcgYWdhaW5zdCBhIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIGNvbnRhaW5zIHR3byBzcGVjaWFsCisgICAgICogY2hhcmFjdGVyczoKKyAgICAgKiAnKicgd2hpY2ggbWVhbnMgemVybyBvciBtb3JlIGNoYXJhY3RlcnMsCisgICAgICogJz8nIHdoaWNoIG1lYW5zIG9uZSBhbmQgb25seSBvbmUgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIChub24tbnVsbCkgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0CisgICAgICogQHBhcmFtIHN0ciAgICAgdGhlIChub24tbnVsbCkgc3RyaW5nIHRoYXQgbXVzdCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlCisgICAgICogICAgICAgICAgICAgICAgcGF0dGVybgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBzdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwYXR0ZXJuLAorICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIGNoYXJbXSBwYXRBcnIgPSBwYXR0ZXJuLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGNoYXJbXSBzdHJBcnIgPSBzdHIudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgaW50IHBhdElkeFN0YXJ0ID0gMDsKKyAgICAgICAgaW50IHBhdElkeEVuZCAgID0gcGF0QXJyLmxlbmd0aC0xOworICAgICAgICBpbnQgc3RySWR4U3RhcnQgPSAwOworICAgICAgICBpbnQgc3RySWR4RW5kICAgPSBzdHJBcnIubGVuZ3RoLTE7CisgICAgICAgIGNoYXIgY2g7CisKKyAgICAgICAgYm9vbGVhbiBjb250YWluc1N0YXIgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRBcnIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gPT0gJyonKSB7CisgICAgICAgICAgICAgICAgY29udGFpbnNTdGFyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29udGFpbnNTdGFyKSB7CisgICAgICAgICAgICAvLyBObyAnKidzLCBzbyB3ZSBtYWtlIGEgc2hvcnRjdXQKKyAgICAgICAgICAgIGlmIChwYXRJZHhFbmQgIT0gc3RySWR4RW5kKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBQYXR0ZXJuIGFuZCBzdHJpbmcgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaCA9IHBhdEFycltpXTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz8nKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUgJiYgY2ggIT0gc3RyQXJyW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ly8gQ2hhcmFjdGVyIG1pc21hdGNoCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Nhc2VTZW5zaXRpdmUgJiYgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0ckFycltpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gU3RyaW5nIG1hdGNoZXMgYWdhaW5zdCBwYXR0ZXJuCisgICAgICAgIH0KKworICAgICAgICBpZiAocGF0SWR4RW5kID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBQYXR0ZXJuIGNvbnRhaW5zIG9ubHkgJyonLCB3aGljaCBtYXRjaGVzIGFueXRoaW5nCisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIGNoYXJhY3RlcnMgYmVmb3JlIGZpcnN0IHN0YXIKKyAgICAgICAgd2hpbGUoKGNoID0gcGF0QXJyW3BhdElkeFN0YXJ0XSkgIT0gJyonICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkgeworICAgICAgICAgICAgaWYgKGNoICE9ICc/JykgeworICAgICAgICAgICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUgJiYgY2ggIT0gc3RyQXJyW3N0cklkeFN0YXJ0XSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ly8gQ2hhcmFjdGVyIG1pc21hdGNoCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghaXNDYXNlU2Vuc2l0aXZlICYmIENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCkgIT0KKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0ckFycltzdHJJZHhTdGFydF0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsvLyBDaGFyYWN0ZXIgbWlzbWF0Y2gKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRJZHhTdGFydCsrOworICAgICAgICAgICAgc3RySWR4U3RhcnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIC8vIEFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHVzZWQuIENoZWNrIGlmIG9ubHkgJyoncyBhcmUKKyAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSAhPSAnKicpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyBjaGFyYWN0ZXJzIGFmdGVyIGxhc3Qgc3RhcgorICAgICAgICB3aGlsZSgoY2ggPSBwYXRBcnJbcGF0SWR4RW5kXSkgIT0gJyonICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkgeworICAgICAgICAgICAgaWYgKGNoICE9ICc/JykgeworICAgICAgICAgICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUgJiYgY2ggIT0gc3RyQXJyW3N0cklkeEVuZF0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOy8vIENoYXJhY3RlciBtaXNtYXRjaAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FzZVNlbnNpdGl2ZSAmJiBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpICE9CisgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJBcnJbc3RySWR4RW5kXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOy8vIENoYXJhY3RlciBtaXNtYXRjaAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdElkeEVuZC0tOworICAgICAgICAgICAgc3RySWR4RW5kLS07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7CisgICAgICAgICAgICAvLyBBbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1c2VkLiBDaGVjayBpZiBvbmx5ICcqJ3MgYXJlCisgICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSBwYXR0ZXJuLiBJZiBzbywgd2Ugc3VjY2VlZGVkLiBPdGhlcndpc2UgZmFpbHVyZS4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gIT0gJyonKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgcGF0dGVybiBiZXR3ZWVuIHN0YXJzLiBwYWRJZHhTdGFydCBhbmQgcGF0SWR4RW5kIHBvaW50CisgICAgICAgIC8vIGFsd2F5cyB0byBhICcqJy4KKyAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0ICE9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIGludCBwYXRJZHhUbXAgPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydCsxOyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0SWR4VG1wID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhdElkeFRtcCA9PSBwYXRJZHhTdGFydCsxKSB7CisgICAgICAgICAgICAgICAgLy8gVHdvIHN0YXJzIG5leHQgdG8gZWFjaCBvdGhlciwgc2tpcCB0aGUgZmlyc3Qgb25lLgorICAgICAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBwYXR0ZXJuIGJldHdlZW4gcGFkSWR4U3RhcnQgJiBwYWRJZHhUbXAgaW4gc3RyIGJldHdlZW4KKyAgICAgICAgICAgIC8vIHN0cklkeFN0YXJ0ICYgc3RySWR4RW5kCisgICAgICAgICAgICBpbnQgcGF0TGVuZ3RoID0gKHBhdElkeFRtcC1wYXRJZHhTdGFydC0xKTsKKyAgICAgICAgICAgIGludCBzdHJMZW5ndGggPSAoc3RySWR4RW5kLXN0cklkeFN0YXJ0KzEpOworICAgICAgICAgICAgaW50IGZvdW5kSWR4ICA9IC0xOworICAgICAgICAgICAgc3RyTG9vcDoKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ckxlbmd0aCAtIHBhdExlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXRMZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBjaCA9IHBhdEFycltwYXRJZHhTdGFydCtqKzFdOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz8nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlICYmIGNoICE9IHN0ckFycltzdHJJZHhTdGFydCtpK2pdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgc3RyTG9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNDYXNlU2Vuc2l0aXZlICYmIENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyQXJyW3N0cklkeFN0YXJ0K2kral0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgc3RyTG9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvdW5kSWR4ID0gc3RySWR4U3RhcnQraTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvdW5kSWR4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXRJZHhTdGFydCA9IHBhdElkeFRtcDsKKyAgICAgICAgICAgIHN0cklkeFN0YXJ0ID0gZm91bmRJZHgrcGF0TGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXNlZC4gQ2hlY2sgaWYgb25seSAnKidzIGFyZSBsZWZ0CisgICAgICAgIC8vIGluIHRoZSBwYXR0ZXJuLiBJZiBzbywgd2Ugc3VjY2VlZGVkLiBPdGhlcndpc2UgZmFpbHVyZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGF0QXJyW2ldICE9ICcqJykgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYmFzZWRpciBmb3Igc2Nhbm5pbmcuIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB0aGF0IGlzIHNjYW5uZWQKKyAgICAgKiByZWN1cnNpdmVseS4gQWxsICcvJyBhbmQgJ1wnIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5CisgICAgICogPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4gU28gdGhlIHNlcGFyYXRvciB1c2VkIG5lZWQgbm90IG1hdGNoCisgICAgICogPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlZGlyIHRoZSAobm9uLW51bGwpIGJhc2VkaXIgZm9yIHNjYW5uaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFzZWRpcihTdHJpbmcgYmFzZWRpcikgeworICAgICAgICBzZXRCYXNlZGlyKG5ldyBGaWxlKGJhc2VkaXIucmVwbGFjZSgnLycsRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCdcXCcsRmlsZS5zZXBhcmF0b3JDaGFyKSkpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBiYXNlZGlyIGZvciBzY2FubmluZy4gVGhpcyBpcyB0aGUgZGlyZWN0b3J5IHRoYXQgaXMgc2Nhbm5lZAorICAgICAqIHJlY3Vyc2l2ZWx5LgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VkaXIgdGhlIGJhc2VkaXIgZm9yIHNjYW5uaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFzZWRpcihGaWxlIGJhc2VkaXIpIHsKKyAgICAgICAgdGhpcy5iYXNlZGlyID0gYmFzZWRpcjsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYmFzZWRpciB0aGF0IGlzIHVzZWQgZm9yIHNjYW5uaW5nLiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdAorICAgICAqIGlzIHNjYW5uZWQgcmVjdXJzaXZlbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBiYXNlZGlyIHRoYXQgaXMgdXNlZCBmb3Igc2Nhbm5pbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRCYXNlZGlyKCkgeworICAgICAgICByZXR1cm4gYmFzZWRpcjsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2FzZSBzZW5zaXRpdml0eSBvZiB0aGUgZmlsZSBzeXN0ZW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjaWZpZXMgaWYgdGhlIGZpbGVzeXN0ZW0gaXMgY2FzZSBzZW5zaXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIHRoaXMuaXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNldCBvZiBpbmNsdWRlIHBhdHRlcm5zIHRvIHVzZS4gQWxsICcvJyBhbmQgJ1wnIGNoYXJhY3RlcnMgYXJlCisgICAgICogcmVwbGFjZWQgYnkgPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4gU28gdGhlIHNlcGFyYXRvciB1c2VkIG5lZWQKKyAgICAgKiBub3QgbWF0Y2ggPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIGEgcGF0dGVybiBlbmRzIHdpdGggYSAnLycgb3IgJ1wnLCAiKioiIGlzIGFwcGVuZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVzIGxpc3Qgb2YgaW5jbHVkZSBwYXR0ZXJucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKFN0cmluZ1tdIGluY2x1ZGVzKSB7CisgICAgICAgIGlmIChpbmNsdWRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBhdHRlcm5bXSBwID0gbmV3IFBhdHRlcm5baW5jbHVkZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwW2ldID0gbmV3IFBhdHRlcm4oKTsKKyAgICAgICAgICAgICAgICBwW2ldLnNldFBhdHRlcm4oaW5jbHVkZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0SW5jbHVkZXMocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyhQYXR0ZXJuW10gaW5jbHVkZXMpIHsKKyAgICAgICAgaWYgKGluY2x1ZGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5pbmNsdWRlcyA9IG5ldyBQYXR0ZXJuW2luY2x1ZGVzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm47CisgICAgICAgICAgICAgICAgcGF0dGVybiA9IGluY2x1ZGVzW2ldLmdldFBhdHRlcm4oKS5yZXBsYWNlKCcvJyxGaWxlLnNlcGFyYXRvckNoYXIpLnJlcGxhY2UoJ1xcJyxGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICs9ICIqKiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuaW5jbHVkZXNbaV0gPSBuZXcgUGF0dGVybigpOworICAgICAgICAgICAgICAgIHRoaXMuaW5jbHVkZXNbaV0uc2V0UGF0dGVybihwYXR0ZXJuKTsKKyAgICAgICAgICAgICAgICB0aGlzLmluY2x1ZGVzW2ldLnNldFNlbGVjdG9yTGlzdChpbmNsdWRlc1tpXS5nZXRTZWxlY3Rvckxpc3QoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZXQgb2YgZXhjbHVkZSBwYXR0ZXJucyB0byB1c2UuIEFsbCAnLycgYW5kICdcJyBjaGFyYWN0ZXJzIGFyZQorICAgICAqIHJlcGxhY2VkIGJ5IDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uIFNvIHRoZSBzZXBhcmF0b3IgdXNlZCBuZWVkCisgICAgICogbm90IG1hdGNoIDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uCisgICAgICogPHA+CisgICAgICogV2hlbiBhIHBhdHRlcm4gZW5kcyB3aXRoIGEgJy8nIG9yICdcJywgIioqIiBpcyBhcHBlbmRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsdWRlcyBsaXN0IG9mIGV4Y2x1ZGUgcGF0dGVybnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmdbXSBleGNsdWRlcykgeworICAgICAgICBpZiAoZXhjbHVkZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5leGNsdWRlcyA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQYXR0ZXJuW10gcCA9IG5ldyBQYXR0ZXJuW2V4Y2x1ZGVzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcFtpXSA9IG5ldyBQYXR0ZXJuKCk7CisgICAgICAgICAgICAgICAgcFtpXS5zZXRQYXR0ZXJuKGV4Y2x1ZGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEV4Y2x1ZGVzKHApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoUGF0dGVybltdIGV4Y2x1ZGVzKSB7CisgICAgICAgIGlmIChleGNsdWRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuZXhjbHVkZXMgPSBuZXcgUGF0dGVybltleGNsdWRlcy5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuOworICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBleGNsdWRlc1tpXS5nZXRQYXR0ZXJuKCkucmVwbGFjZSgnLycsRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCdcXCcsRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiArPSAiKioiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzW2ldID0gbmV3IFBhdHRlcm4oKTsKKyAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzW2ldLnNldFBhdHRlcm4ocGF0dGVybik7CisgICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlc1tpXS5zZXRTZWxlY3Rvckxpc3QoZXhjbHVkZXNbaV0uZ2V0U2VsZWN0b3JMaXN0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFzIHRoZSBzY2FubmVyIGV4Y2x1ZGVkIG9yIG9taXR0ZWQgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGl0CisgICAgICogY2FtZSBhY2Nyb3NzPworICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdGhhdCBoYXZlIGJlZW4gZm91bmQsCisgICAgICogYXJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXZlcnl0aGluZ0luY2x1ZGVkKCkgeworICAgICAgICByZXR1cm4gZXZlcnl0aGluZ0luY2x1ZGVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2NhbnMgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBmaWxlcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbmNsdWRlCisgICAgICogcGF0dGVybiwgYW5kIGRvbid0IG1hdGNoIGFueSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2hlbiBiYXNlZGlyIHdhcyBzZXQgaW5jb3JyZWNseQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNjYW4oKSB7CisgICAgICAgIGlmIChiYXNlZGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGJhc2VkaXIgc2V0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFiYXNlZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJiYXNlZGlyICIgKyBiYXNlZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICB9CisgICAgICAgIGlmICghYmFzZWRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJiYXNlZGlyICIgKyBiYXNlZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmNsdWRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBObyBpbmNsdWRlcyBzdXBwbGllZCwgc28gc2V0IGl0IHRvICdtYXRjaGVzIGFsbCcKKyAgICAgICAgICAgIGluY2x1ZGVzID0gbmV3IFBhdHRlcm5bMV07CisgICAgICAgICAgICBpbmNsdWRlc1swXSA9IG5ldyBQYXR0ZXJuKCk7CisgICAgICAgICAgICBpbmNsdWRlc1swXS5zZXRQYXR0ZXJuKCIqKiIpOworICAgICAgICB9CisgICAgICAgIGlmIChleGNsdWRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBleGNsdWRlcyA9IG5ldyBQYXR0ZXJuWzBdOworICAgICAgICB9CisKKyAgICAgICAgZmlsZXNJbmNsdWRlZCAgICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZmlsZXNOb3RJbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZmlsZXNFeGNsdWRlZCAgICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZGlyc0luY2x1ZGVkICAgICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZGlyc05vdEluY2x1ZGVkICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZGlyc0V4Y2x1ZGVkICAgICA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICBpZiAoaXNJbmNsdWRlZCgiIikpIHsKKyAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZCgiIikpIHsKKyAgICAgICAgICAgICAgICBkaXJzSW5jbHVkZWQuYWRkRWxlbWVudCgiIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpcnNFeGNsdWRlZC5hZGRFbGVtZW50KCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpcnNOb3RJbmNsdWRlZC5hZGRFbGVtZW50KCIiKTsKKyAgICAgICAgfQorICAgICAgICBzY2FuZGlyKGJhc2VkaXIsICIiLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUb3BsZXZlbCBpbnZvY2F0aW9uIGZvciB0aGUgc2Nhbi4KKyAgICAgKgorICAgICAqIDxwPlJldHVybnMgaW1tZWRpYXRlbHkgaWYgYSBzbG93IHNjYW4gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2xvd1NjYW4oKSB7CisgICAgICAgIGlmIChoYXZlU2xvd1Jlc3VsdHMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGV4Y2wgPSBuZXcgU3RyaW5nW2RpcnNFeGNsdWRlZC5zaXplKCldOworICAgICAgICBkaXJzRXhjbHVkZWQuY29weUludG8oZXhjbCk7CisKKyAgICAgICAgU3RyaW5nW10gbm90SW5jbCA9IG5ldyBTdHJpbmdbZGlyc05vdEluY2x1ZGVkLnNpemUoKV07CisgICAgICAgIGRpcnNOb3RJbmNsdWRlZC5jb3B5SW50byhub3RJbmNsKTsKKworICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXhjbC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFjb3VsZEhvbGRJbmNsdWRlZChleGNsW2ldKSkgeworICAgICAgICAgICAgICAgIHNjYW5kaXIobmV3IEZpbGUoYmFzZWRpciwgZXhjbFtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICBleGNsW2ldK0ZpbGUuc2VwYXJhdG9yLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8bm90SW5jbC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFjb3VsZEhvbGRJbmNsdWRlZChub3RJbmNsW2ldKSkgeworICAgICAgICAgICAgICAgIHNjYW5kaXIobmV3IEZpbGUoYmFzZWRpciwgbm90SW5jbFtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICBub3RJbmNsW2ldK0ZpbGUuc2VwYXJhdG9yLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBoYXZlU2xvd1Jlc3VsdHMgID0gdHJ1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNjYW5zIHRoZSBwYXNzZWQgZGlyIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuIEZvdW5kIGZpbGVzIGFuZAorICAgICAqIGRpcmVjdG9yaWVzIGFyZSBwbGFjZWQgaW4gdGhlaXIgcmVzcGVjdGl2ZSBjb2xsZWN0aW9ucywgYmFzZWQgb24gdGhlCisgICAgICogbWF0Y2hpbmcgb2YgaW5jbHVkZXMgYW5kIGV4Y2x1ZGVzLiBXaGVuIGEgZGlyZWN0b3J5IGlzIGZvdW5kLCBpdCBpcworICAgICAqIHNjYW5uZWQgcmVjdXJzaXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyICAgdGhlIGRpcmVjdG9yeSB0byBzY2FuCisgICAgICogQHBhcmFtIHZwYXRoIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyIChuZWVkZWQgdG8gcHJldmVudAorICAgICAqICAgICAgICAgICAgICBwcm9ibGVtcyB3aXRoIGFuIGFic29sdXRlIHBhdGggd2hlbiB1c2luZyBkaXIpCisgICAgICoKKyAgICAgKiBAc2VlICNmaWxlc0luY2x1ZGVkCisgICAgICogQHNlZSAjZmlsZXNOb3RJbmNsdWRlZAorICAgICAqIEBzZWUgI2ZpbGVzRXhjbHVkZWQKKyAgICAgKiBAc2VlICNkaXJzSW5jbHVkZWQKKyAgICAgKiBAc2VlICNkaXJzTm90SW5jbHVkZWQKKyAgICAgKiBAc2VlICNkaXJzRXhjbHVkZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuZGlyKEZpbGUgZGlyLCBTdHJpbmcgdnBhdGgsIGJvb2xlYW4gZmFzdCkgeworICAgICAgICBTdHJpbmdbXSBuZXdmaWxlcyA9IGRpci5saXN0KCk7CisKKyAgICAgICAgaWYgKG5ld2ZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiB0d28gcmVhc29ucyBhcmUgbWVudGlvbmVkIGluIHRoZSBBUEkgZG9jcyBmb3IgRmlsZS5saXN0CisgICAgICAgICAgICAgKiAoMSkgZGlyIGlzIG5vdCBhIGRpcmVjdG9yeS4gVGhpcyBpcyBpbXBvc3NpYmxlIGFzCisgICAgICAgICAgICAgKiAgICAgd2Ugd291bGRuJ3QgZ2V0IGhlcmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICogKDIpIGFuIElPIGVycm9yIG9jY3VycmVkICh3aHkgZG9lc24ndCBpdCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICAqICAgICB0aGVuPz8/KQorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIklPIGVycm9yIHNjYW5uaW5nIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB2cGF0aCtuZXdmaWxlc1tpXTsKKyAgICAgICAgICAgIEZpbGUgICBmaWxlID0gbmV3IEZpbGUoZGlyLG5ld2ZpbGVzW2ldKTsKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlZChuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRXhjbHVkZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcnNJbmNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZGlyKGZpbGUsIG5hbWUrRmlsZS5zZXBhcmF0b3IsIGZhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlcnl0aGluZ0luY2x1ZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJzRXhjbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0ICYmIGNvdWxkSG9sZEluY2x1ZGVkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihmaWxlLCBuYW1lK0ZpbGUuc2VwYXJhdG9yLCBmYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmdJbmNsdWRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBkaXJzTm90SW5jbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3QgJiYgY291bGRIb2xkSW5jbHVkZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIoZmlsZSwgbmFtZStGaWxlLnNlcGFyYXRvciwgZmFzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmYXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIoZmlsZSwgbmFtZStGaWxlLnNlcGFyYXRvciwgZmFzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzSW5jbHVkZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0luY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVyeXRoaW5nSW5jbHVkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzRXhjbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmdJbmNsdWRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmaWxlc05vdEluY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgYSBuYW1lIG1hdGNoZXMgYWdhaW5zdCBhdCBsZWFzdCBvbmUgaW5jbHVkZSBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gbWF0Y2gKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZQorICAgICAqICAgICAgICAgaW5jbHVkZSBwYXR0ZXJuLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1hdGNoUGF0aChpbmNsdWRlc1tpXS5nZXRQYXR0ZXJuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzW2ldLmdldFNlbGVjdG9yTGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgYSBuYW1lIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIGF0IGxlYXN0IG9uZSBpbmNsdWRlIHBhdHRlcm4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBtYXRjaAorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgbmFtZSBtYXRjaGVzIGFnYWluc3QgYXQgbGVhc3Qgb25lCisgICAgICogICAgICAgICBpbmNsdWRlIHBhdHRlcm4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY291bGRIb2xkSW5jbHVkZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1hdGNoUGF0dGVyblN0YXJ0KGluY2x1ZGVzW2ldLmdldFBhdHRlcm4oKSxuYW1lLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgYSBuYW1lIG1hdGNoZXMgYWdhaW5zdCBhdCBsZWFzdCBvbmUgZXhjbHVkZSBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gbWF0Y2gKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZQorICAgICAqICAgICAgICAgZXhjbHVkZSBwYXR0ZXJuLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1hdGNoUGF0aChleGNsdWRlc1tpXS5nZXRQYXR0ZXJuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzW2ldLmdldFNlbGVjdG9yTGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgdGhhdCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5jbHVkZQorICAgICAqIHBhdHRlcm5zLCBhbmQgbWF0Y2hlZCBub25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZWRGaWxlcygpIHsKKyAgICAgICAgaW50IGNvdW50ID0gZmlsZXNJbmNsdWRlZC5zaXplKCk7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1tjb3VudF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmlsZXNbaV0gPSAoU3RyaW5nKWZpbGVzSW5jbHVkZWQuZWxlbWVudEF0KGkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgdGhhdCBtYXRjaGVkIGF0IG5vbmUgb2YgdGhlIGluY2x1ZGUgcGF0dGVybnMuCisgICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZWRpci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXROb3RJbmNsdWRlZEZpbGVzKCkgeworICAgICAgICBzbG93U2NhbigpOworICAgICAgICBpbnQgY291bnQgPSBmaWxlc05vdEluY2x1ZGVkLnNpemUoKTsKKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2NvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaWxlc1tpXSA9IChTdHJpbmcpZmlsZXNOb3RJbmNsdWRlZC5lbGVtZW50QXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbmNsdWRlCisgICAgICogcGF0dGVybnMsIGFuIG1hdGNoZWQgYWxzbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZWRpci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZEZpbGVzKCkgeworICAgICAgICBzbG93U2NhbigpOworICAgICAgICBpbnQgY291bnQgPSBmaWxlc0V4Y2x1ZGVkLnNpemUoKTsKKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2NvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaWxlc1tpXSA9IChTdHJpbmcpZmlsZXNFeGNsdWRlZC5lbGVtZW50QXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB0aGF0IG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbmNsdWRlCisgICAgICogcGF0dGVybnMsIGFuIG1hdGNoZWQgbm9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKSB7CisgICAgICAgIGludCBjb3VudCA9IGRpcnNJbmNsdWRlZC5zaXplKCk7CisgICAgICAgIFN0cmluZ1tdIGRpcmVjdG9yaWVzID0gbmV3IFN0cmluZ1tjb3VudF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZGlyZWN0b3JpZXNbaV0gPSAoU3RyaW5nKWRpcnNJbmNsdWRlZC5lbGVtZW50QXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yaWVzOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB0aGF0IG1hdGNoZWQgYXQgbm9uZSBvZiB0aGUgaW5jbHVkZQorICAgICAqIHBhdHRlcm5zLgorICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Tm90SW5jbHVkZWREaXJlY3RvcmllcygpIHsKKyAgICAgICAgc2xvd1NjYW4oKTsKKyAgICAgICAgaW50IGNvdW50ID0gZGlyc05vdEluY2x1ZGVkLnNpemUoKTsKKyAgICAgICAgU3RyaW5nW10gZGlyZWN0b3JpZXMgPSBuZXcgU3RyaW5nW2NvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBkaXJlY3Rvcmllc1tpXSA9IChTdHJpbmcpZGlyc05vdEluY2x1ZGVkLmVsZW1lbnRBdChpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGlyZWN0b3JpZXM7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHRoYXQgbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlIGluY2x1ZGUKKyAgICAgKiBwYXR0ZXJucywgYW4gbWF0Y2hlZCBhbHNvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVkRGlyZWN0b3JpZXMoKSB7CisgICAgICAgIHNsb3dTY2FuKCk7CisgICAgICAgIGludCBjb3VudCA9IGRpcnNFeGNsdWRlZC5zaXplKCk7CisgICAgICAgIFN0cmluZ1tdIGRpcmVjdG9yaWVzID0gbmV3IFN0cmluZ1tjb3VudF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZGlyZWN0b3JpZXNbaV0gPSAoU3RyaW5nKWRpcnNFeGNsdWRlZC5lbGVtZW50QXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yaWVzOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBhcnJheSB3aXRoIGRlZmF1bHQgZXhjbHVzaW9ucyB0byB0aGUgY3VycmVudCBleGNsdXNpb25zIHNldC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERlZmF1bHRFeGNsdWRlcygpIHsKKyAgICAgICAgaW50IGV4Y2x1ZGVzTGVuZ3RoID0gZXhjbHVkZXMgPT0gbnVsbCA/IDAgOiBleGNsdWRlcy5sZW5ndGg7CisgICAgICAgIFBhdHRlcm5bXSBuZXdFeGNsdWRlczsKKyAgICAgICAgbmV3RXhjbHVkZXMgPSBuZXcgUGF0dGVybltleGNsdWRlc0xlbmd0aCArIERFRkFVTFRFWENMVURFUy5sZW5ndGhdOworICAgICAgICBpZiAoZXhjbHVkZXNMZW5ndGggPiAwKSB7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGV4Y2x1ZGVzLDAsbmV3RXhjbHVkZXMsMCxleGNsdWRlc0xlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBERUZBVUxURVhDTFVERVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG5ld0V4Y2x1ZGVzW2krZXhjbHVkZXNMZW5ndGhdID0gbmV3IFBhdHRlcm4oKTsKKyAgICAgICAgICAgIG5ld0V4Y2x1ZGVzW2krZXhjbHVkZXNMZW5ndGhdLnNldFBhdHRlcm4oREVGQVVMVEVYQ0xVREVTW2ldLnJlcGxhY2UoJy8nLEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgnXFwnLEZpbGUuc2VwYXJhdG9yQ2hhcikpOworICAgICAgICB9CisKKyAgICAgICAgUGF0dGVybltdIGVwID0gbmV3IFBhdHRlcm5bbmV3RXhjbHVkZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZXBbaV0gPSBuZXcgUGF0dGVybigpOworICAgICAgICAgICAgZXBbaV0uc2V0UGF0dGVybihuZXdFeGNsdWRlc1tpXS5nZXRQYXR0ZXJuKCkpOworICAgICAgICB9CisKKyAgICAgICAgZXhjbHVkZXMgPSBlcDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9GaWxlU2Nhbm5lci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRmlsZVNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTcxYThjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRmlsZVNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuOworCisvKioKKyAqIEFuIGludGVyZmFjZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBhY3Rpb25zIHJlcXVpcmVkIGJ5IGFueSB0eXBlIG9mCisgKiBkaXJlY3Rvcnkgc2Nhbm5lci4KKyAqLworcHVibGljIGludGVyZmFjZSBGaWxlU2Nhbm5lciB7CisgICAgLyoqCisgICAgICogQWRkcyBhbiBhcnJheSB3aXRoIGRlZmF1bHQgZXhjbHVzaW9ucyB0byB0aGUgY3VycmVudCBleGNsdXNpb25zIHNldC4KKyAgICAgKgorICAgICAqLworICAgIHZvaWQgYWRkRGVmYXVsdEV4Y2x1ZGVzKCk7CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYmFzZWRpciB0aGF0IGlzIHVzZWQgZm9yIHNjYW5uaW5nLiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdAorICAgICAqIGlzIHNjYW5uZWQgcmVjdXJzaXZlbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBiYXNlZGlyIHRoYXQgaXMgdXNlZCBmb3Igc2Nhbm5pbmcKKyAgICAgKi8KKyAgICBGaWxlIGdldEJhc2VkaXIoKTsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB0aGF0IG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbmNsdWRlCisgICAgICogcGF0dGVybnMsIGFuIG1hdGNoZWQgYWxzbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZWRpci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcworICAgICAqLworICAgIFN0cmluZ1tdIGdldEV4Y2x1ZGVkRGlyZWN0b3JpZXMoKTsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB0aGF0IG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbmNsdWRlCisgICAgICogcGF0dGVybnMsIGFuIG1hdGNoZWQgYWxzbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZWRpci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBmaWxlcworICAgICAqLworICAgIFN0cmluZ1tdIGdldEV4Y2x1ZGVkRmlsZXMoKTsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB0aGF0IG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbmNsdWRlCisgICAgICogcGF0dGVybnMsIGFuIG1hdGNoZWQgbm9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzCisgICAgICovCisgICAgU3RyaW5nW10gZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRoYXQgbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlIGluY2x1ZGUKKyAgICAgKiBwYXR0ZXJucywgYW4gbWF0Y2hlZCBub25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKKyAgICAgKi8KKyAgICBTdHJpbmdbXSBnZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgdGhhdCBtYXRjaGVkIGF0IG5vbmUgb2YgdGhlIGluY2x1ZGUKKyAgICAgKiBwYXR0ZXJucy4KKyAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlZGlyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzCisgICAgICovCisgICAgU3RyaW5nW10gZ2V0Tm90SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHRoYXQgbWF0Y2hlZCBhdCBub25lIG9mIHRoZSBpbmNsdWRlIHBhdHRlcm5zLgorICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VkaXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKKyAgICAgKi8KKyAgICBTdHJpbmdbXSBnZXROb3RJbmNsdWRlZEZpbGVzKCk7CisgICAgLyoqCisgICAgICogU2NhbnMgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBmaWxlcyB0aGF0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbmNsdWRlCisgICAgICogcGF0dGVybiwgYW5kIGRvbid0IG1hdGNoIGFueSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2hlbiBiYXNlZGlyIHdhcyBzZXQgaW5jb3JyZWNseQorICAgICAqLworICAgIHZvaWQgc2NhbigpOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJhc2VkaXIgZm9yIHNjYW5uaW5nLiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdCBpcyBzY2FubmVkCisgICAgICogcmVjdXJzaXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciB0aGUgKG5vbi1udWxsKSBiYXNlZGlyIGZvciBzY2FubmluZworICAgICAqLworICAgIHZvaWQgc2V0QmFzZWRpcihTdHJpbmcgYmFzZWRpcik7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYmFzZWRpciBmb3Igc2Nhbm5pbmcuIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB0aGF0IGlzIHNjYW5uZWQKKyAgICAgKiByZWN1cnNpdmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlZGlyIHRoZSBiYXNlZGlyIGZvciBzY2FubmluZworICAgICAqLworICAgIHZvaWQgc2V0QmFzZWRpcihGaWxlIGJhc2VkaXIpOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNldCBvZiBleGNsdWRlIHBhdHRlcm5zIHRvIHVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsdWRlcyBsaXN0IG9mIGV4Y2x1ZGUgcGF0dGVybnMKKyAgICAgKi8KKyAgICB2b2lkIHNldEV4Y2x1ZGVzKFN0cmluZ1tdIGV4Y2x1ZGVzKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZXQgb2YgaW5jbHVkZSBwYXR0ZXJucyB0byB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZXMgbGlzdCBvZiBpbmNsdWRlIHBhdHRlcm5zCisgICAgICovCisgICAgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmdbXSBpbmNsdWRlcyk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMgdG8gdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2x1ZGVzIGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucworICAgICAqLworICAgIHZvaWQgc2V0RXhjbHVkZXMoUGF0dGVybltdIGV4Y2x1ZGVzKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZXQgb2YgaW5jbHVkZSBwYXR0ZXJucyB0byB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZXMgbGlzdCBvZiBpbmNsdWRlIHBhdHRlcm5zCisgICAgICovCisgICAgdm9pZCBzZXRJbmNsdWRlcyhQYXR0ZXJuW10gaW5jbHVkZXMpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2FzZSBzZW5zaXRpdml0eSBvZiB0aGUgZmlsZSBzeXN0ZW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjaWZpZXMgaWYgdGhlIGZpbGVzeXN0ZW0gaXMgY2FzZSBzZW5zaXRpdmUKKyAgICAgKi8KKyAgICB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvc2VsZWN0b3JzL0ZpbGVTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvc2VsZWN0b3JzL0ZpbGVTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmM1NjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9zZWxlY3RvcnMvRmlsZVNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIEZpbGUgU2VsZWN0b3IgQVBJLgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBGaWxlU2VsZWN0b3IgeworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSk7CisgICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uKGZpbmFsIFN0cmluZyBvcGVyYXRpb24pOworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoZmluYWwgU3RyaW5nIGZpbGUpOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvc2VsZWN0b3JzL0ZpbGVUeXBlU2VsZWN0b3IuamF2YSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvc2VsZWN0b3JzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3NlbGVjdG9ycy9GaWxlVHlwZVNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxMmQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvc2VsZWN0b3JzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3NlbGVjdG9ycy9GaWxlVHlwZVNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisgcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogRmlsZSBzZWxlY3RvciB0aGF0IHBlcmZvcm1zIHNlbGVjdGlvbiBiYXNlZCBvbgorICogZmlsZSB0eXBlIC0gZmlsZSBhbmQgZGlyZWN0b3J5LgorICoKKyAqLworcHVibGljIGNsYXNzIEZpbGVUeXBlU2VsZWN0b3IgaW1wbGVtZW50cyBGaWxlU2VsZWN0b3IgeworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBvcGVyYXRpb24gPSAiZXF1YWxzIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG5lZ2F0ZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZvckZpbGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGb3JEaXIgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2b2lkIHNldENhY2hlZChmaW5hbCBib29sZWFuIGNhY2hlZCkgeworICAgICAgICB0aGlzLmNhY2hlZCA9IGNhY2hlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NhY2hlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICBzZXRDYWNoZWQoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbihmaW5hbCBTdHJpbmcgb3BlcmF0aW9uKSB7CisgICAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOworICAgICAgICBzZXRDYWNoZWQoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvQ2FjaGUoKSB7CisgICAgICAgIGlmICghaXNDYWNoZWQoKSkgeworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tGb3JGaWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjaGVja0ZvckRpciA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJkaXJlY3RvcnkiKSkgeworICAgICAgICAgICAgICAgIGNoZWNrRm9yRGlyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjaGVja0ZvckZpbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghb3BlcmF0aW9uLmVxdWFsc0lnbm9yZUNhc2UoImVxdWFscyIpKSB7CisgICAgICAgICAgICAgICAgbmVnYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmVnYXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDYWNoZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKGZpbmFsIFN0cmluZyBmaWxlKSB7CisgICAgICAgIGRvQ2FjaGUoKTsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmaWxlIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmaWxlKTsKKyAgICAgICAgaWYgKGNoZWNrRm9yRmlsZSkgeworICAgICAgICAgICAgcmV0VmFsdWUgPSBmLmlzRmlsZSgpOworICAgICAgICB9IGVsc2UgaWYgKGNoZWNrRm9yRGlyKSB7CisgICAgICAgICAgICByZXRWYWx1ZSA9IGYuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVnYXRlKSB7CisgICAgICAgICAgICByZXRWYWx1ZSA9ICFyZXRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvc2VsZWN0b3JzL2RlZmF1bHRzLnByb3BlcnRpZXMgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9zZWxlY3RvcnMvZGVmYXVsdHMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODg3ZjExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvc2VsZWN0b3JzL2RlZmF1bHRzLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAordHlwZT1vcmcuYXBhY2hlLnRvb2xzLmFudC5zZWxlY3RvcnMuRmlsZVR5cGVTZWxlY3RvcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZVNldC5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zZWxlY3RvcnMvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMWU0MDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0LmphdmEKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkZpbGVTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiBNb3ZlZCBvdXQgb2YgTWF0Y2hpbmdUYXNrIHRvIG1ha2UgaXQgYSBzdGFuZGFsb25lIG9iamVjdCB0aGF0IGNvdWxkCisgKiBiZSByZWZlcmVuY2VkIChieSBzY3JpcHRzIGZvciBleGFtcGxlKS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlU2V0IGV4dGVuZHMgRGF0YVR5cGUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisgICAgcHJpdmF0ZSBQYXR0ZXJuU2V0IGRlZmF1bHRQYXR0ZXJucyA9IG5ldyBQYXR0ZXJuU2V0KCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgYWRkaXRpb25hbFBhdHRlcm5zID0gbmV3IFZlY3RvcigpOworCisgICAgcHJpdmF0ZSBGaWxlIGRpcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKKworICAgIHB1YmxpYyBGaWxlU2V0KCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlU2V0KEZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICB0aGlzLmRpciA9IGZpbGVzZXQuZGlyOworICAgICAgICB0aGlzLmRlZmF1bHRQYXR0ZXJucyA9IGZpbGVzZXQuZGVmYXVsdFBhdHRlcm5zOworICAgICAgICB0aGlzLmFkZGl0aW9uYWxQYXR0ZXJucyA9IGZpbGVzZXQuYWRkaXRpb25hbFBhdHRlcm5zOworICAgICAgICB0aGlzLnVzZURlZmF1bHRFeGNsdWRlcyA9IGZpbGVzZXQudXNlRGVmYXVsdEV4Y2x1ZGVzOworICAgICAgICB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSA9IGZpbGVzZXQuaXNDYXNlU2Vuc2l0aXZlOworICAgICAgICBzZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgUGF0dGVyblNldAorICAgICAqIGluc3RhbmNlLgorICAgICAqCisgICAgICogPHA+WW91IG11c3Qgbm90IHNldCBhbm90aGVyIGF0dHJpYnV0ZSBvciBuZXN0IGVsZW1lbnRzIGluc2lkZQorICAgICAqIHRoaXMgZWxlbWVudCBpZiB5b3UgbWFrZSBpdCBhIHJlZmVyZW5jZS48L3A+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkaXIgIT0gbnVsbCB8fCBkZWZhdWx0UGF0dGVybnMuaGFzUGF0dGVybnMoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFkZGl0aW9uYWxQYXR0ZXJucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgZGlyKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZGlyID0gZGlyOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldERpcihQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYocCkuZ2V0RGlyKHApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkaXI7CisgICAgfQorCisgICAgcHVibGljIFBhdHRlcm5TZXQgY3JlYXRlUGF0dGVyblNldCgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgUGF0dGVyblNldCBwYXR0ZXJucyA9IG5ldyBQYXR0ZXJuU2V0KCk7CisgICAgICAgIGFkZGl0aW9uYWxQYXR0ZXJucy5hZGRFbGVtZW50KHBhdHRlcm5zKTsKKyAgICAgICAgcmV0dXJuIHBhdHRlcm5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVJbmNsdWRlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUluY2x1ZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZXNGaWxlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUluY2x1ZGVzRmlsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUV4Y2x1ZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlRXhjbHVkZXNGaWxlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUV4Y2x1ZGVzRmlsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNldCBvZiBpbmNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKKyAgICAgKiBvciBhIHNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVzIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgaW5jbHVkZSBwYXR0ZXJucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKFN0cmluZyBpbmNsdWRlcykgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHRQYXR0ZXJucy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorICAgICAqIG9yIGEgc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nIGV4Y2x1ZGVzKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdFBhdHRlcm5zLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2wgVGhlIGZpbGUgdG8gZmV0Y2ggdGhlIGluY2x1ZGUgcGF0dGVybnMgZnJvbS4KKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXNmaWxlKEZpbGUgaW5jbCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgIH0KKworICAgICAgICAgZGVmYXVsdFBhdHRlcm5zLnNldEluY2x1ZGVzZmlsZShpbmNsKTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbmNsdWRlcyBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsIFRoZSBmaWxlIHRvIGZldGNoIHRoZSBleGNsdWRlIHBhdHRlcm5zIGZyb20uCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzZmlsZShGaWxlIGV4Y2wpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgICB9CisKKyAgICAgICAgIGRlZmF1bHRQYXR0ZXJucy5zZXRFeGNsdWRlc2ZpbGUoZXhjbCk7CisgICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZURlZmF1bHRFeGNsdWRlcyAidHJ1ZSJ8Im9uInwieWVzIiB3aGVuIGRlZmF1bHQgZXhjbHVzaW9ucworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQsICJmYWxzZSJ8Im9mZiJ8Im5vIiB3aGVuIHRoZXkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZG4ndCBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRleGNsdWRlcyhib29sZWFuIHVzZURlZmF1bHRFeGNsdWRlcykgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMudXNlRGVmYXVsdEV4Y2x1ZGVzID0gdXNlRGVmYXVsdEV4Y2x1ZGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgY2FzZSBzZW5zaXRpdml0eSBvZiB0aGUgZmlsZSBzeXN0ZW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgInRydWUifCJvbiJ8InllcyIgaWYgZmlsZSBzeXN0ZW0gaXMgY2FzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZlLCAiZmFsc2UifCJvZmYifCJubyIgd2hlbiBub3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgeworICAgICAgICB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkaXJlY3Rvcnkgc2Nhbm5lciBuZWVkZWQgdG8gYWNjZXNzIHRoZSBmaWxlcyB0byBwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyBEaXJlY3RvcnlTY2FubmVyIGdldERpcmVjdG9yeVNjYW5uZXIoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKHApLmdldERpcmVjdG9yeVNjYW5uZXIocCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gZGlyZWN0b3J5IHNwZWNpZmllZCBmb3IgZmlsZXNldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZGlyLmdldEFic29sdXRlUGF0aCgpKyIgbm90IGZvdW5kLiIpOworICAgICAgICB9CisgICAgICAgIGlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihkaXIuZ2V0QWJzb2x1dGVQYXRoKCkrIiBpcyBub3QgYSBkaXJlY3RvcnkuIik7CisgICAgICAgIH0KKworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgc2V0dXBEaXJlY3RvcnlTY2FubmVyKGRzLCBwKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICByZXR1cm4gZHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dXBEaXJlY3RvcnlTY2FubmVyKEZpbGVTY2FubmVyIGRzLCBQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRzIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBkcy5zZXRCYXNlZGlyKGRpcik7CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFkZGl0aW9uYWxQYXR0ZXJucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBhZGRpdGlvbmFsUGF0dGVybnMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgZGVmYXVsdFBhdHRlcm5zLmFwcGVuZDIoKFBhdHRlcm5TZXQpIG8sIHApOworICAgICAgICB9CisKKyAgICAgICAgcC5sb2coICJGaWxlU2V0OiBTZXR1cCBmaWxlIHNjYW5uZXIgaW4gZGlyICIgKyBkaXIgKworICAgICAgICAgICAgIiB3aXRoICIgKyBkZWZhdWx0UGF0dGVybnMsIHAuTVNHX0RFQlVHICk7CisKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMoZGVmYXVsdFBhdHRlcm5zLmdldEluY2x1ZGVQYXR0ZXJuczIocCkpOworICAgICAgICBkcy5zZXRFeGNsdWRlcyhkZWZhdWx0UGF0dGVybnMuZ2V0RXhjbHVkZVBhdHRlcm5zMihwKSk7CisgICAgICAgIGlmICh1c2VEZWZhdWx0RXhjbHVkZXMpIHsKKyAgICAgICAgICBkcy5hZGREZWZhdWx0RXhjbHVkZXMoKTsKKyAgICAgICAgfQorICAgICAgICBkcy5zZXRDYXNlU2Vuc2l0aXZlKGlzQ2FzZVNlbnNpdGl2ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQorICAgICAqIHJlZmVyZW5jZWQgRmlsZVNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZVNldCBnZXRSZWYoUHJvamVjdCBwKSB7CisgICAgICAgIGlmICghY2hlY2tlZCkgeworICAgICAgICAgICAgU3RhY2sgc3RrID0gbmV3IFN0YWNrKCk7CisgICAgICAgICAgICBzdGsucHVzaCh0aGlzKTsKKyAgICAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBvID0gcmVmLmdldFJlZmVyZW5jZWRPYmplY3QocCk7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBGaWxlU2V0KSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHJlZi5nZXRSZWZJZCgpKyIgZG9lc25cJ3QgZGVub3RlIGEgZmlsZXNldCI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoRmlsZVNldCkgbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGVTZXQgdGhhdCBoYXMgdGhlIHNhbWUgYmFzZWRpciBhbmQgc2FtZSBwYXR0ZXJuc2V0cworICAgICAqIGFzIHRoaXMgb25lLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVTZXQoZ2V0UmVmKGdldFByb2plY3QoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlU2V0KHRoaXMpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyNzNlMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvc2VsZWN0b3JzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdHRlcm4uamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKyBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIE5hbWVkIGNvbGxlY3Rpb24gb2YgaW5jbHVkZS9leGNsdWRlIHRhZ3MuCisgKgorICovCitwdWJsaWMgY2xhc3MgUGF0dGVybiB7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybiA9IG51bGw7CisgICAgcHJpdmF0ZSBWZWN0b3Igc2VsZWN0b3JMaXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGF0dGVybgorICAgICAqIEBwYXJhbSBwYXR0ZXJuICAgIHRoZSBwYXR0ZXJuIHRvIG1hdGNoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbGlzdCBvZiBTZWxlY3RvciBlbnRyaWVzCisgICAgICogQHBhcmFtIHNlbGVjdG9yTGlzdCAgICB0aGUgdmVjdG9yIGxpc3Qgb2YgJ1NlbGVjdG9yRW50cnkncworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdG9yTGlzdChWZWN0b3Igc2VsZWN0b3JMaXN0KSB7CisgICAgICAgIHRoaXMuc2VsZWN0b3JMaXN0ID0gc2VsZWN0b3JMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGF0dGVybgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKKyAgICAgICAgcmV0dXJuIHBhdHRlcm47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIFNlbGVjdG9yIGVudHJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgVmVjdG9yIGdldFNlbGVjdG9yTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIHNlbGVjdG9yTGlzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0LmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1ZmIwMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvc2VsZWN0b3JzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdHRlcm5TZXQuamF2YQpAQCAtMCwwICsxLDU4NyBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogTmFtZWQgY29sbGVjdGlvbiBvZiBpbmNsdWRlL2V4Y2x1ZGUgdGFncy4KKyAqCisgKiA8cD5Nb3ZlZCBvdXQgb2YgTWF0Y2hpbmdUYXNrIHRvIG1ha2UgaXQgYSBzdGFuZGFsb25lIG9iamVjdCB0aGF0CisgKiBjb3VsZCBiZSByZWZlcmVuY2VkIChieSBzY3JpcHRzIGZvciBleGFtcGxlKS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQYXR0ZXJuU2V0IGV4dGVuZHMgRGF0YVR5cGUgeworICAgIHByaXZhdGUgVmVjdG9yIGluY2x1ZGVMaXN0ID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yIGV4Y2x1ZGVMaXN0ID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yIGluY2x1ZGVzRmlsZUxpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgZXhjbHVkZXNGaWxlTGlzdCA9IG5ldyBWZWN0b3IoKTsKKworCisgICAgIC8qKgorICAgICAqIGlubmVyIGNsYXNzIHRvIGhvbGQgYSBzZWxlY3RvciBsaXN0LiAgQSBTZWxlY3RvckVudHJ5CisgICAgICogaXMgbWFkZSB1cCBvZiB0aGUgcGF0dGVybiBhbmQgc2VsZWN0aW9uIGRldGFpbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlbGVjdG9yRW50cnkgeworICAgICAgICBwcml2YXRlIFN0cmluZyB0eXBlOworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHQpIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uKFN0cmluZyBvcCkgeworICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24gPSBvcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGlubmVyIGNsYXNzIHRvIGhvbGQgYSBuYW1lIG9uIGxpc3QuICAiSWYiIGFuZCAiVW5sZXNzIiBhdHRyaWJ1dGVzCisgICAgICogbWF5IGJlIHVzZWQgdG8gaW52YWxpZGF0ZSB0aGUgZW50cnkgYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZiBhCisgICAgICogcHJvcGVydHkgKHR5cGljYWxseSBzZXQgdGhydSB0aGUgdXNlIG9mIHRoZSBBdmFpbGFibGUgdGFzaykuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIE5hbWVFbnRyeSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGlmQ29uZDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdW5sZXNzQ29uZDsKKyAgICAgICAgcHJpdmF0ZSBWZWN0b3Igc2VsZWN0b3JMaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZihTdHJpbmcgY29uZCkgeworICAgICAgICAgICAgaWZDb25kID0gY29uZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVubGVzcyhTdHJpbmcgY29uZCkgeworICAgICAgICAgICAgdW5sZXNzQ29uZCA9IGNvbmQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5jbHVkZS9FeGNsdWRlIGNhbiBjb250YWluIG5lc3RlZCBzZWxlY3RvcnMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTZWxlY3RvckVudHJ5IGNyZWF0ZVNlbGVjdG9yKCkgeworICAgICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFkZFNlbGVjdG9yVG9MaXN0KHNlbGVjdG9yTGlzdCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogYWRkIGEgc2VsZWN0b3IgZW50cnkgdG8gdGhlIGdpdmVuIGxpc3QKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU2VsZWN0b3JFbnRyeSBhZGRTZWxlY3RvclRvTGlzdChmaW5hbCBWZWN0b3IgbGlzdCkgeworICAgICAgICAgICAgZmluYWwgU2VsZWN0b3JFbnRyeSByZXN1bHQgPSBuZXcgU2VsZWN0b3JFbnRyeSgpOworICAgICAgICAgICAgbGlzdC5hZGRFbGVtZW50KHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmVjdG9yIGdldFNlbGVjdG9yTGlzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3Rvckxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGV2YWxOYW1lKFByb2plY3QgcCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbGlkKHApID8gbmFtZSA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWQoUHJvamVjdCBwKSB7CisgICAgICAgICAgICBpZiAoaWZDb25kICE9IG51bGwgJiYgcC5nZXRQcm9wZXJ0eShpZkNvbmQpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHVubGVzc0NvbmQgIT0gbnVsbCAmJiBwLmdldFByb3BlcnR5KHVubGVzc0NvbmQpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsKKyAgICAgICAgICAgIGlmICgoaWZDb25kICE9IG51bGwpIHx8ICh1bmxlc3NDb25kICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiOiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBjb25uZWN0b3IgPSAiIjsKKworICAgICAgICAgICAgICAgIGlmIChpZkNvbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJpZi0+Iik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoaWZDb25kKTsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gIjsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodW5sZXNzQ29uZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29ubmVjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgidW5sZXNzLT4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh1bmxlc3NDb25kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdG9yTGlzdChWZWN0b3IgbGlzdCkgeworICAgICAgICAgICAgdGhpcy5zZWxlY3Rvckxpc3QgPSBsaXN0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFBhdHRlcm5TZXQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgdGhpcyBpbnN0YW5jZSBpbiBlZmZlY3QgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBQYXR0ZXJuU2V0CisgICAgICogaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFub3RoZXIgYXR0cmlidXRlIG9yIG5lc3QgZWxlbWVudHMgaW5zaWRlCisgICAgICogdGhpcyBlbGVtZW50IGlmIHlvdSBtYWtlIGl0IGEgcmVmZXJlbmNlLjwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbmNsdWRlTGlzdC5pc0VtcHR5KCkgfHwgIWV4Y2x1ZGVMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRQYXR0ZXJuVG9MaXN0KGluY2x1ZGVMaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGVzRmlsZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZFBhdHRlcm5Ub0xpc3QoaW5jbHVkZXNGaWxlTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0CisgICAgICovCisgICAgcHVibGljIE5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRkUGF0dGVyblRvTGlzdChleGNsdWRlTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBmaWxlcyBsaXN0CisgICAgICovCisgICAgcHVibGljIE5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlc0ZpbGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRQYXR0ZXJuVG9MaXN0KGV4Y2x1ZGVzRmlsZUxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNldCBvZiBpbmNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKKyAgICAgKiBvciBhIHNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVzIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgaW5jbHVkZSBwYXR0ZXJucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKFN0cmluZyBpbmNsdWRlcykgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jbHVkZXMgIT0gbnVsbCAmJiBpbmNsdWRlcy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGVzLCAiLCAiLCBmYWxzZSk7CisgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIGNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKHRvay5uZXh0VG9rZW4oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZXQgb2YgZXhjbHVkZSBwYXR0ZXJucy4gUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCisgICAgICogb3IgYSBzcGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsdWRlcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4Y2x1ZGUgcGF0dGVybnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmcgZXhjbHVkZXMpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4Y2x1ZGVzICE9IG51bGwgJiYgZXhjbHVkZXMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihleGNsdWRlcywgIiwgIiwgZmFsc2UpOworICAgICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVFeGNsdWRlKCkuc2V0TmFtZSh0b2submV4dFRva2VuKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSB0byB0aGUgZ2l2ZW4gbGlzdAorICAgICAqLworICAgIHByaXZhdGUgTmFtZUVudHJ5IGFkZFBhdHRlcm5Ub0xpc3QoVmVjdG9yIGxpc3QpIHsKKyAgICAgICAgTmFtZUVudHJ5IHJlc3VsdCA9IG5ldyBOYW1lRW50cnkoKTsKKyAgICAgICAgbGlzdC5hZGRFbGVtZW50KHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbmNsdWRlcyBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlc0ZpbGUgVGhlIGZpbGUgdG8gZmV0Y2ggdGhlIGluY2x1ZGUgcGF0dGVybnMgZnJvbS4KKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXNmaWxlKEZpbGUgaW5jbHVkZXNGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICAgfQorICAgICAgICAgY3JlYXRlSW5jbHVkZXNGaWxlKCkuc2V0TmFtZShpbmNsdWRlc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGV4Y2x1ZGVzIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2x1ZGVzRmlsZSBUaGUgZmlsZSB0byBmZXRjaCB0aGUgZXhjbHVkZSBwYXR0ZXJucyBmcm9tLgorICAgICAqLworICAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlc2ZpbGUoRmlsZSBleGNsdWRlc0ZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgICB9CisgICAgICAgICBjcmVhdGVFeGNsdWRlc0ZpbGUoKS5zZXROYW1lKGV4Y2x1ZGVzRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgIH0KKworICAgIC8qKgorICAgICAqICBSZWFkcyBwYXRoIG1hdGNoaW5nIHBhdHRlcm5zIGZyb20gYSBmaWxlIGFuZCBhZGRzIHRoZW0gdG8gdGhlCisgICAgICogIGluY2x1ZGVzIG9yIGV4Y2x1ZGVzIGxpc3QgKGFzIGFwcHJvcHJpYXRlKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVhZFBhdHRlcm5zKEZpbGUgcGF0dGVybmZpbGUsIFZlY3RvciBwYXR0ZXJubGlzdCwgUHJvamVjdCBwKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHBhdHRlcm5SZWFkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gR2V0IGEgRmlsZVJlYWRlcgorICAgICAgICAgICAgcGF0dGVyblJlYWRlciA9CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHBhdHRlcm5maWxlKSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBvbmUgTmFtZUVudHJ5IGluIHRoZSBhcHByb3ByaWF0ZSBwYXR0ZXJuIGxpc3QgZm9yIGVhY2gKKyAgICAgICAgICAgIC8vIGxpbmUgaW4gdGhlIGZpbGUuCisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHBhdHRlcm5SZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHAucmVwbGFjZVByb3BlcnRpZXMobGluZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm5Ub0xpc3QocGF0dGVybmxpc3QpLnNldE5hbWUobGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmUgPSBwYXR0ZXJuUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSAgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHJlYWRpbmcgZnJvbSBwYXR0ZXJuIGZpbGU6ICIKKyAgICAgICAgICAgICAgICArIHBhdHRlcm5maWxlOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmKCBudWxsICE9IHBhdHRlcm5SZWFkZXIgKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVyblJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIC8vSWdub3JlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZDIoUGF0dGVyblNldCBvdGhlciwgUHJvamVjdCBwKSB7CisgICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGFwcGVuZCB0byBhIHJlZmVyZW5jZSIpOworICAgICAgICAgfQorICAgICAgICBQYXR0ZXJuW10gaW5jbCA9IG90aGVyLmdldEluY2x1ZGVQYXR0ZXJuczIocCk7CisgICAgICAgIGlmIChpbmNsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxpbmNsLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTmFtZUVudHJ5IG5lID0gY3JlYXRlSW5jbHVkZSgpOworICAgICAgICAgICAgICAgIG5lLnNldE5hbWUoaW5jbFtpXS5nZXRQYXR0ZXJuKCkpOworICAgICAgICAgICAgICAgIG5lLnNldFNlbGVjdG9yTGlzdChpbmNsW2ldLmdldFNlbGVjdG9yTGlzdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFBhdHRlcm5bXSBleGNsID0gb3RoZXIuZ2V0RXhjbHVkZVBhdHRlcm5zMihwKTsKKyAgICAgICAgaWYgKGV4Y2wgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGV4Y2wubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOYW1lRW50cnkgbmUgPSBjcmVhdGVFeGNsdWRlKCk7CisgICAgICAgICAgICAgICAgbmUuc2V0TmFtZShleGNsW2ldLmdldFBhdHRlcm4oKSk7CisgICAgICAgICAgICAgICAgbmUuc2V0U2VsZWN0b3JMaXN0KGluY2xbaV0uZ2V0U2VsZWN0b3JMaXN0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgcGF0dGVybnMgb2YgdGhlIG90aGVyIGluc3RhbmNlIHRvIHRoaXMgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGVuZChQYXR0ZXJuU2V0IG90aGVyLCBQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGFwcGVuZCB0byBhIHJlZmVyZW5jZSIpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gaW5jbCA9IG90aGVyLmdldEluY2x1ZGVQYXR0ZXJucyhwKTsKKyAgICAgICAgaWYgKGluY2wgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGluY2wubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVJbmNsdWRlKCkuc2V0TmFtZShpbmNsW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGV4Y2wgPSBvdGhlci5nZXRFeGNsdWRlUGF0dGVybnMocCk7CisgICAgICAgIGlmIChleGNsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxleGNsLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlRXhjbHVkZSgpLnNldE5hbWUoZXhjbFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJlZCBpbmNsdWRlIHBhdHRlcm5zIGFzIGFuIGFycmF5IG9mIFBhdHRlcm5zCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5bXSBnZXRJbmNsdWRlUGF0dGVybnMyKFByb2plY3QgcCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXRJbmNsdWRlUGF0dGVybnMyKHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVhZEZpbGVzKHApOworICAgICAgICAgICAgcmV0dXJuIG1ha2VBcnJheTIoaW5jbHVkZUxpc3QsIHApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlsdGVyZWQgZXhjbHVkZSBwYXR0ZXJucyBhcyBhbiBhcnJheSBvZiBQYXR0ZXJucworICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuW10gZ2V0RXhjbHVkZVBhdHRlcm5zMihQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYocCkuZ2V0RXhjbHVkZVBhdHRlcm5zMihwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWRGaWxlcyhwKTsKKyAgICAgICAgICAgIHJldHVybiBtYWtlQXJyYXkyKGV4Y2x1ZGVMaXN0LCBwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmVkIGluY2x1ZGUgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVQYXR0ZXJucyhQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYocCkuZ2V0SW5jbHVkZVBhdHRlcm5zKHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVhZEZpbGVzKHApOworICAgICAgICAgICAgcmV0dXJuIG1ha2VBcnJheShpbmNsdWRlTGlzdCwgcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJlZCBpbmNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlUGF0dGVybnMoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKHApLmdldEV4Y2x1ZGVQYXR0ZXJucyhwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWRGaWxlcyhwKTsKKyAgICAgICAgICAgIHJldHVybiBtYWtlQXJyYXkoZXhjbHVkZUxpc3QsIHApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaGVscGVyIGZvciBGaWxlU2V0LgorICAgICAqLworICAgIGJvb2xlYW4gaGFzUGF0dGVybnMoKSB7CisgICAgICAgIHJldHVybiBpbmNsdWRlc0ZpbGVMaXN0LnNpemUoKSA+IDAgfHwgZXhjbHVkZXNGaWxlTGlzdC5zaXplKCkgPiAwCisgICAgICAgICAgICB8fCBpbmNsdWRlTGlzdC5zaXplKCkgPiAwIHx8IGV4Y2x1ZGVMaXN0LnNpemUoKSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQorICAgICAqIHJlZmVyZW5jZWQgUGF0dGVyblNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdHRlcm5TZXQgZ2V0UmVmKFByb2plY3QgcCkgeworICAgICAgICBpZiAoIWNoZWNrZWQpIHsKKyAgICAgICAgICAgIFN0YWNrIHN0ayA9IG5ldyBTdGFjaygpOworICAgICAgICAgICAgc3RrLnB1c2godGhpcyk7CisgICAgICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHN0aywgcCk7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgbyA9IHJlZi5nZXRSZWZlcmVuY2VkT2JqZWN0KHApOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgUGF0dGVyblNldCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSByZWYuZ2V0UmVmSWQoKSsiIGRvZXNuXCd0IGRlbm90ZSBhIHBhdHRlcm5zZXQiOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKFBhdHRlcm5TZXQpIG87CisgICAgICAgIH0KKyAgICB9CisKKworICAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgdmVjdG9yIG9mIE5hbWVFbnRyeSBlbGVtZW50cyBpbnRvIGFuIGFycmF5IG9mIFBhdHRlcm5zCisgICAgICovCisgICAgcHJpdmF0ZSBQYXR0ZXJuW10gbWFrZUFycmF5MihWZWN0b3IgbGlzdCwgUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChsaXN0LnNpemUoKSA9PSAwKSByZXR1cm4gbnVsbDsKKworICAgICAgICBWZWN0b3IgdG1wUGF0dGVybnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGxpc3QuZWxlbWVudHMoKSA7IGUuaGFzTW9yZUVsZW1lbnRzKCkgOykgeworICAgICAgICAgICAgTmFtZUVudHJ5IG5lID0gKE5hbWVFbnRyeSllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IG5lLmV2YWxOYW1lKHApOworICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT0gbnVsbCAmJiBwYXR0ZXJuLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIFBhdHRlcm4gcGF0ID0gbmV3IFBhdHRlcm4oKTsKKyAgICAgICAgICAgICAgICBwYXQuc2V0UGF0dGVybihwYXR0ZXJuKTsKKyAgICAgICAgICAgICAgICBwYXQuc2V0U2VsZWN0b3JMaXN0KG5lLmdldFNlbGVjdG9yTGlzdCgpKTsKKyAgICAgICAgICAgICAgICB0bXBQYXR0ZXJucy5hZGRFbGVtZW50KHBhdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBQYXR0ZXJuIHJlc3VsdFtdID0gbmV3IFBhdHRlcm5bdG1wUGF0dGVybnMuc2l6ZSgpXTsKKyAgICAgICAgdG1wUGF0dGVybnMuY29weUludG8ocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgdmVjdG9yIG9mIE5hbWVFbnRyeSBlbGVtZW50cyBpbnRvIGFuIGFycmF5IG9mIFN0cmluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtYWtlQXJyYXkoVmVjdG9yIGxpc3QsIFByb2plY3QgcCkgeworICAgICAgICBpZiAobGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yIHRtcE5hbWVzID0gbmV3IFZlY3RvcigpOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBsaXN0LmVsZW1lbnRzKCkgOyBlLmhhc01vcmVFbGVtZW50cygpIDspIHsKKyAgICAgICAgICAgIE5hbWVFbnRyeSBuZSA9IChOYW1lRW50cnkpZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBuZS5ldmFsTmFtZShwKTsKKyAgICAgICAgICAgIGlmIChwYXR0ZXJuICE9IG51bGwgJiYgcGF0dGVybi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0bXBOYW1lcy5hZGRFbGVtZW50KHBhdHRlcm4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdFtdID0gbmV3IFN0cmluZ1t0bXBOYW1lcy5zaXplKCldOworICAgICAgICB0bXBOYW1lcy5jb3B5SW50byhyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgaW5jbHVkZXNmaWxlIG90IGV4Y2x1ZGVzZmlsZSBpZiBub3QgYWxyZWFkeSBkb25lIHNvLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWFkRmlsZXMoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChpbmNsdWRlc0ZpbGVMaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBpbmNsdWRlc0ZpbGVMaXN0LmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIE5hbWVFbnRyeSBuZSA9IChOYW1lRW50cnkpZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG5lLmV2YWxOYW1lKHApOworICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgaW5jbEZpbGUgPSBwLnJlc29sdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbmNsdWRlc2ZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5jbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGZvdW5kLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlYWRQYXR0ZXJucyhpbmNsRmlsZSwgaW5jbHVkZUxpc3QsIHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluY2x1ZGVzRmlsZUxpc3QucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGNsdWRlc0ZpbGVMaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBleGNsdWRlc0ZpbGVMaXN0LmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIE5hbWVFbnRyeSBuZSA9IChOYW1lRW50cnkpZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG5lLmV2YWxOYW1lKHApOworICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZXhjbEZpbGUgPSBwLnJlc29sdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFleGNsRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGNsdWRlc2ZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXhjbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGZvdW5kLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlYWRQYXR0ZXJucyhleGNsRmlsZSwgZXhjbHVkZUxpc3QsIHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4Y2x1ZGVzRmlsZUxpc3QucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJwYXR0ZXJuU2V0eyBpbmNsdWRlczogIiArIGluY2x1ZGVMaXN0ICsKKyAgICAgICAgICAgICIgZXhjbHVkZXM6ICIgKyBleGNsdWRlTGlzdCArICIgfSI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBTY2FubmVyLmphdmEgYi90cnVuay9wcm9wb3NhbC9zYW5kYm94L3NlbGVjdG9ycy9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxMTkwOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvc2VsZWN0b3JzL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcFNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCisgKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgKgorICogNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVybjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogWmlwU2Nhbm5lciBhY2Nlc3NlcyB0aGUgcGF0dGVybiBtYXRjaGluZyBhbGdvcml0aG0gaW4gRGlyZWN0b3J5U2Nhbm5lciwKKyAqIHdoaWNoIGFyZSBwcm90ZWN0ZWQgbWV0aG9kcyB0aGF0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5IHN1YmNsYXNzaW5nLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgRmlsZVNjYW5uZXIgZGVmaW5lcyBnZXRJbmNsdWRlZEZpbGVzIHRvIHJldHVybgorICogb25seSB0aGUgWmlwIEZpbGUgd2hpY2ggaXMgYmVpbmcgc2Nhbm5lZCwgbm90IHRoZSBtYXRjaGluZyBaaXAgZW50cmllcy4KKyAqIEFyZ3VhYmx5LCBpdCBzaG91bGQgcmV0dXJuIHRoZSBtYXRjaGluZyBlbnRyaWVzLCBob3dldmVyIHRoaXMgd291bGQKKyAqIGNvbXBsaWNhdGUgZXhpc3RpbmcgY29kZSB3aGljaCBhc3N1bWVzIHRoYXQgRmlsZVNjYW5uZXJzIHJldHVybiBhCisgKiBzZXQgb2YgZmlsZSBzeXN0ZW0gZmlsZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkuCisgKgorICovCitwdWJsaWMgY2xhc3MgWmlwU2Nhbm5lciBleHRlbmRzIERpcmVjdG9yeVNjYW5uZXIgeworCisgICAgLyoqCisgICAgICogVGhlIHppcCBmaWxlIHdoaWNoIHNob3VsZCBiZSBzY2FubmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIHNyY0ZpbGU7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzcmNGaWxlIGZvciBzY2FubmluZy4gVGhpcyBpcyB0aGUgamFyIG9yIHppcCBmaWxlIHRoYXQgaXMgc2Nhbm5lZAorICAgICAqIGZvciBtYXRjaGluZyBlbnRyaWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNyY0ZpbGUgdGhlIChub24tbnVsbCkgemlwIGZpbGUgbmFtZSBmb3Igc2Nhbm5pbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzcmNGaWxlKSB7CisgICAgICAgIHRoaXMuc3JjRmlsZSA9IHNyY0ZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgemlwIGZpbGUgaXRzZWxmLCBub3QgdGhlIG1hdGNoaW5nIGVudHJpZXMgd2l0aGluIHRoZSB6aXAgZmlsZS4KKyAgICAgKiBUaGlzIGtlZXBzIHRoZSB1cHRvZGF0ZSB0ZXN0IGluIHRoZSBaaXAgdGFzayBzaW1wbGU7IG90aGVyd2lzZSB3ZSdkIG5lZWQKKyAgICAgKiB0byB0cmVhdCB6aXAgZmlsZXNldHMgc3BlY2lhbGx5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc291cmNlIGZpbGUgZnJvbSB3aGljaCBlbnRyaWVzIHdpbGwgYmUgZXh0cmFjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlZEZpbGVzKCkgeworICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nWzFdOworICAgICAgICByZXN1bHRbMF0gPSBzcmNGaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZW1wdHkgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBjcmVhdGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgRGlyZWN0b3J5U2Nhbm5lciBkYXRhIHN0cnVjdHVyZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYgKGluY2x1ZGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE5vIGluY2x1ZGVzIHN1cHBsaWVkLCBzbyBzZXQgaXQgdG8gJ21hdGNoZXMgYWxsJworICAgICAgICAgICAgaW5jbHVkZXMgPSBuZXcgUGF0dGVyblsxXTsKKyAgICAgICAgICAgIGluY2x1ZGVzWzBdID0gbmV3IFBhdHRlcm4oKTsKKyAgICAgICAgICAgIGluY2x1ZGVzWzBdLnNldFBhdHRlcm4oIioqIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4Y2x1ZGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIGV4Y2x1ZGVzID0gbmV3IFBhdHRlcm5bMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVzIGEgamFyIGVudHJ5IGFnYWluc3QgdGhlIGluY2x1ZGVzL2V4Y2x1ZGVzIGxpc3QsCisgICAgICogbm9ybWFsaXppbmcgdGhlIHBhdGggc2VwYXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggdGhlIChub24tbnVsbCkgcGF0aCBuYW1lIHRvIHRlc3QgZm9yIGluY2x1c2lvbgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGF0aCBzaG91bGQgYmUgaW5jbHVkZWQKKyAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIHZwYXRoID0gcGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS4KKyAgICAgICAgICAgIHJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgcmV0dXJuIGlzSW5jbHVkZWQodnBhdGgpICYmICFpc0V4Y2x1ZGVkKHZwYXRoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvc3ZuL1JFQURNRSBiL3RydW5rL3Byb3Bvc2FsL3NhbmRib3gvc3ZuL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTA3NmQyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwvc2FuZGJveC9zdm4vUkVBRE1FCkBAIC0wLDAgKzEgQEAKK01vdmVkIHRvIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L3NhbmRib3gvYW50bGlicy9zdm4vdHJ1bmsvCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy9idWlsZC54bWwgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkMjg2YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2J1aWxkLnhtbApAQCAtMCwwICsxLDU2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiA/PgorPHByb2plY3QgbmFtZT0ieGRvY3MiIGRlZmF1bHQ9ImRlZmF1bHQiPgorCisgIDwhLS0KKyAgICBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gb3ZlcnJpZGUgd2l0aG91dCBlZGl0aW5nIHRoaXMgZmlsZQorICAgIChhbmQgd2l0aG91dCB0eXBpbmcgLUQgZWFjaCB0aW1lKQorICAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS8uJHthbnQucHJvamVjdC5uYW1lfS5wcm9wZXJ0aWVzIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9InNyYy5yb290IgorICAgICAgICAgICAgbG9jYXRpb249Ii4uLy4uL3NyYy9tYWluIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLnNyYyIKKyAgICAgICAgICAgIGxvY2F0aW9uPSIuLi8uLi94ZG9jcyIvPgorICA8cHJvcGVydHkgbmFtZT0ieGRvY3MuZGlyIgorICAgICAgICAgICAgbG9jYXRpb249Inhkb2NzIi8+CisgICAgICAgICAgICAKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249ImJ1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJhbnRkb2NsZXQuc3JjLmRpciIgbG9jYXRpb249InNyYyIvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9nZW4iLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRvY3MuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2RvY3MiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImFudC5wYWNrYWdlIiB2YWx1ZT0ib3JnL2FwYWNoZS90b29scy9hbnQiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbmFsLnBhY2thZ2UiIHZhbHVlPSIke2FudC5wYWNrYWdlfS90YXNrZGVmcy9vcHRpb25hbCIvPgorICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uYWwudHlwZS5wYWNrYWdlIiB2YWx1ZT0iJHthbnQucGFja2FnZX0vdHlwZXMvb3B0aW9uYWwiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImFwYWNoZS5yZXNvbHZlci50eXBlLnBhY2thZ2UiIHZhbHVlPSIke2FudC5wYWNrYWdlfS90eXBlcy9yZXNvbHZlciIvPgorICA8cHJvcGVydHkgbmFtZT0idXRpbC5wYWNrYWdlIiB2YWx1ZT0iJHthbnQucGFja2FnZX0vdXRpbCIvPgorICA8cHJvcGVydHkgbmFtZT0icmVnZXhwLnBhY2thZ2UiIHZhbHVlPSIke3V0aWwucGFja2FnZX0vcmVnZXhwIi8+CisKKyAgPHBhdGggaWQ9ImNsYXNzcGF0aCI+CisgIDwvcGF0aD4KKworICA8IS0tIGRlcGVuZHMgb24gSkRLIHZlcnNpb24gLS0+CisgIDxzZWxlY3RvciBpZD0ibmVlZHMuamRrMS4zKyI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7YW50LnBhY2thZ2V9L3Rhc2tkZWZzL1Rlc3RQcm9jZXNzKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vZXh0ZW5zaW9uLyoqIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmpkazEuNCsiPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke3JlZ2V4cC5wYWNrYWdlfS9KZGsxNFJlZ2V4cCoiLz4KKyAgICA8L29yPgorICA8L3NlbGVjdG9yPgorCisgIDwhLS0gY2xhc3NlcyB0aGF0IHNob3VsZCBiZSBwcmVzZW50IGluIFN1biBiYXNlZCBKVk1zLCBidXQgbm90IGluCisgIEthZmZlIGZvciBleGFtcGxlIC0tPgorICA8c2VsZWN0b3IgaWQ9Im5lZWRzLnN1bi50b29scyI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vTmF0aXZlMkFzY2lpKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vSmF2YWgqIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLnN1bi51dWUiPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke2FudC5wYWNrYWdlfS90YXNrZGVmcy9lbWFpbC9VVU1haWxlcioiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLnN1bi5iNjQiPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3NwbGFzaC9TcGxhc2hUYXNrKiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPCEtLSBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyAtLT4KKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy50cmF4Ij4KKyAgICA8b3I+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9UcmFYTGlhaXNvbioiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3NpdHJha2EvKioiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L21ldGFtYXRhL01NZXRyaWNzKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vWHNsdFRlc3QqIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHthbnQucGFja2FnZX0vdHlwZXMvWE1MQ2F0YWxvZ0J1aWxkRmlsZVRlc3QqIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLnhhbGFuMSI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vWGFsYW5MaWFpc29uKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vanVuaXQvWGFsYW4xRXhlY3V0b3IqIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLnhhbGFuMiI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vanVuaXQvWGFsYW4yRXhlY3V0b3IqIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy54c2xwIj4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9Yc2xwTGlhaXNvbioiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmFwYWNoZS5yZXNvbHZlciI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7YXBhY2hlLnJlc29sdmVyLnR5cGUucGFja2FnZX0vKioiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmp1bml0Ij4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9qdW5pdC8qKiIvPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuamFrYXJ0YS5yZWdleHAiPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke3JlZ2V4cC5wYWNrYWdlfS9KYWthcnRhUmVnZXhwKiIvPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuamFrYXJ0YS5vcm8iPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke3JlZ2V4cC5wYWNrYWdlfS9KYWthcnRhT3JvKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vcGVyZm9yY2UvKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vbWV0YW1hdGEvTUF1ZGl0KiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5qYWthcnRhLmJjZWwiPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke2FudC5wYWNrYWdlfS9maWx0ZXJzL3V0aWwvSmF2YUNsYXNzSGVscGVyKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7dXRpbC5wYWNrYWdlfS9kZXBlbmQvYmNlbC8qIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC50eXBlLnBhY2thZ2V9L2RlcGVuZC9DbGFzc0ZpbGVTZXRUZXN0KiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5qYWthcnRhLmxvZzRqIj4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHthbnQucGFja2FnZX0vbGlzdGVuZXIvTG9nNGpMaXN0ZW5lcioiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmNvbW1vbnMubG9nZ2luZyI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7YW50LnBhY2thZ2V9L2xpc3RlbmVyL0NvbW1vbnNMb2dnaW5nTGlzdGVuZXIqIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5ic2YiPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1NjcmlwdCoiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3NjcmlwdC8qKi8qIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC50eXBlLnBhY2thZ2V9L1NjcmlwdCoiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke3V0aWwucGFja2FnZX0vU2NyaXB0KiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5zdHlsZWJvb2siPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1N0eWxlQm9vayoiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmphdmFtYWlsIj4KKyAgICA8b3I+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHthbnQucGFja2FnZX0vdGFza2RlZnMvZW1haWwvTWltZU1haWxlcioiLz4KKyAgICA8L29yPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuaWNvbnRyYWN0Ij4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9JQ29udHJhY3QqIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5uZXRyZXh4Ij4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9OZXRSZXh4QyoiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLndlYmxvZ2ljLmVqYmMiPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2VqYi9FamJjKiIvPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMud2VibG9naWMuZGRjcmVhdG9yIj4KKyAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9lamIvRERDcmVhdG9yKiIvPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMud2VibG9naWMuc2VydmVyIj4KKyAgICA8b3I+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9lamIvV0xSdW4qIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9lamIvV0xTdG9wKiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5jb21tb25zLm5ldCI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vbmV0L0ZUUCoiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L25ldC9SRXhlYyoiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L25ldC9UZWxuZXRUYXNrKiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5zdGFydGVhbSI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc2NtL0FudFN0YXJUZWFtKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc3RhcnRlYW0vKiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy52YWoiPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2lkZS9WQUoqIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5hbnRsciI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vQU5UTFIqIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5qbWYiPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3NvdW5kLyoiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmphaSI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vaW1hZ2UvKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7YW50LnBhY2thZ2V9L3R5cGVzL29wdGlvbmFsL2ltYWdlLyoiLz4KKyAgICA8L29yPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuamRlcGVuZCI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vamRlcGVuZC8qIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5zd2luZyI+CisgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc3BsYXNoLyoiLz4KKyAgPC9zZWxlY3Rvcj4KKworICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmpzY2giPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L3NzaC8qIi8+CisgIDwvc2VsZWN0b3I+CisKKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrMS4zKyIgY2xhc3NuYW1lPSJqYXZhLmxhbmcuU3RyaWN0TWF0aCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjQrIiBjbGFzc25hbWU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiLz4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ia2FmZmUiIGNsYXNzbmFtZT0ia2FmZmUudXRpbC5Ob3RJbXBsZW1lbnRlZCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJic2YucHJlc2VudCIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYnNmLkJTRk1hbmFnZXIiCisgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibmV0cmV4eC5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0ibmV0cmV4eC5sYW5nLlJleHgiCisgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idHJheC5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0iamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciIKKyAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0cmF4LmltcGwucHJlc2VudCI+CisgICAgPG9yPgorICAgICAgPGFuZD4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIvPgorICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iJHtqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeX0iCisgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgICAgIDwvYW5kPgorICAgICAgPGF2YWlsYWJsZSByZXNvdXJjZT0iTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiLz4KKyAgICA8L29yPgorICA8L2NvbmRpdGlvbj4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ieHNscC5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0iY29tLmt2aXNjby54c2wuWFNMUHJvY2Vzc29yIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFwYWNoZS5yZXNvbHZlci5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54bWwucmVzb2x2ZXIudG9vbHMuQ2F0YWxvZ1Jlc29sdmVyIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9InhhbGFuLnByZXNlbnQiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhhbGFuLnhzbHQuWFNMVFByb2Nlc3NvckZhY3RvcnkiCisgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ieGFsYW4yLnByZXNlbnQiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbCIKKyAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJlamIuZWpiYy5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0id2VibG9naWMuZWpiYyIKKyAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJlamIuRERDcmVhdG9yLnByZXNlbnQiCisgICAgY2xhc3NuYW1lPSJ3ZWJsb2dpYy5lamIudXRpbHMuRERDcmVhdG9yIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImVqYi53bHMucHJlc2VudCIKKyAgICBjbGFzc25hbWU9IndlYmxvZ2ljLlNlcnZlciIKKyAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqdW5pdC5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0ianVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImNvbW1vbnMubmV0LnByZXNlbnQiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnQiCisgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ic3RhcnRlYW0ucHJlc2VudCIKKyAgICBjbGFzc25hbWU9ImNvbS5zdGFyYmFzZS51dGlsLlBsYXRmb3JtIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFudGxyLnByZXNlbnQiCisgICAgY2xhc3NuYW1lPSJhbnRsci5Ub29sIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9InZhai5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0iY29tLmlibS5pdmoudXRpbC5iYXNlLldvcmtzcGFjZSIKKyAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJzdHlsZWJvb2sucHJlc2VudCIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuc3R5bGVib29rLkVuZ2luZSIKKyAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqYWthcnRhLnJlZ2V4cC5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5yZWdleHAuUkUiCisgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamFrYXJ0YS5vcm8ucHJlc2VudCIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGVybDVNYXRjaGVyIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImptZi5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0iamF2YXguc291bmQuc2FtcGxlZC5DbGlwIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImphaS5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0iamF2YXgubWVkaWEuamFpLkpBSSIKKyAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJpY29udHJhY3QucHJlc2VudCIKKyAgICBjbGFzc25hbWU9ImNvbS5yZWxpYWJsZXN5c3RlbXMuaUNvbnRyYWN0LklDb250cmFjdGVkIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkZXBlbmQucHJlc2VudCIKKyAgICBjbGFzc25hbWU9ImpkZXBlbmQuZnJhbWV3b3JrLkpEZXBlbmQiCisgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibG9nNGoucHJlc2VudCIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUubG9nNGouQ2F0ZWdvcnkiCisgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iY29tbW9ucy5sb2dnaW5nLnByZXNlbnQiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5IgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9InhhbGFuLmVudmNoZWNrIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi54c2x0LkVudmlyb25tZW50Q2hlY2siCisgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0id2hpY2gucHJlc2VudCIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuZW52LldoaWNoIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisKKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ieGVyY2VzLnByZXNlbnQiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlciIKKyAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJiY2VsLnByZXNlbnQiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmJjZWwuQ29uc3RhbnRzIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9InN1bnV1ZS5wcmVzZW50IgorICAgIGNsYXNzbmFtZT0ic3VuLm1pc2MuVVVFbmNvZGVyIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisKKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF2YW1haWwuY29tcGxldGUiPgorICAgIDxhbmQ+CisgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciIKKyAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC5tYWlsLlRyYW5zcG9ydCIKKyAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgICA8L2FuZD4KKyAgPC9jb25kaXRpb24+CisKKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisgICAgPG9yPgorICAgICAgPGlzc2V0IHByb3BlcnR5PSJqZGsxLjQrIi8+CisgICAgICA8aXNzZXQgcHJvcGVydHk9Impha2FydGEucmVnZXhwLnByZXNlbnQiLz4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamFrYXJ0YS5vcm8ucHJlc2VudCIvPgorICAgIDwvb3I+CisgIDwvY29uZGl0aW9uPgorCisgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiPgorICAgIDxvcj4KKyAgICAgIDxlcXVhbHMgYXJnMT0iJHtqdW5pdC5mb3JrfSIgYXJnMj0idHJ1ZSIvPgorICAgICAgPGVxdWFscyBhcmcxPSIke2J1aWxkLnN5c2NsYXNzcGF0aH0iIGFyZzI9Im9ubHkiLz4KKyAgICA8L29yPgorICA8L2NvbmRpdGlvbj4KKworICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzdW4udG9vbHMucHJlc2VudCI+CisgICAgPGFuZD4KKyAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJzdW4udG9vbHMubmF0aXZlMmFzY2lpLk1haW4iLz4KKyAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLmphdmFoLk1haW4iLz4KKyAgICA8L2FuZD4KKyAgPC9jb25kaXRpb24+CisKKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYmFzZTY0LnByZXNlbnQiIGNsYXNzbmFtZT0ic3VuLm1pc2MuQkFTRTY0RW5jb2RlciIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50ZXN0cy5yZXNvbHZlZCIgbG9jYXRpb249IiR7YnVpbGQudGVzdHN9Ii8+CisgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3RzLmFyZS5vbi5zeXN0ZW0uY2xhc3NwYXRoIj4KKyAgICA8b3I+CisgICAgICA8IS0tIHJlbGF0aXZlIHBhdGhzIGluIENMQVNTUEFUSCAtLT4KKyAgICAgIDxjb250YWlucyBzdHJpbmc9IiR7amF2YS5jbGFzcy5wYXRofSIKKyAgICAgICAgc3Vic3RyaW5nPSIke2J1aWxkLnRlc3RzfSIvPgorICAgICAgPCEtLSBhYnNvbHV0ZSBwYXRocyBpbiBDTEFTU1BBVEggLS0+CisgICAgICA8Y29udGFpbnMgc3RyaW5nPSIke2phdmEuY2xhc3MucGF0aH0iCisgICAgICAgIHN1YnN0cmluZz0iJHtidWlsZC50ZXN0cy5yZXNvbHZlZH0iLz4KKyAgICA8L29yPgorICA8L2NvbmRpdGlvbj4KKworICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXNwZXIucHJlc2VudCI+CisgICAgPGFuZD4KKyAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Db21waWxlciIvPgorICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbiIvPgorICAgIDwvYW5kPgorICA8L2NvbmRpdGlvbj4KKworICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzd2luZy5wcmVzZW50Ij4KKyAgICA8b3I+CisgICAgICA8bm90PgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImthZmZlIi8+CisgICAgICA8L25vdD4KKyAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC5zd2luZy5JbWFnZUljb24iCisgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgICAgPC9vcj4KKyAgPC9jb25kaXRpb24+CisgIDxjb25kaXRpb24gcHJvcGVydHk9IndzZGwuZm91bmQiPgorICAgIDxvcj4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0id3NkbCIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9Ii8+CisgICAgICA8YXZhaWxhYmxlIGZpbGU9IndzZGwuZXhlIiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iLz4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0id3NkbC5leGUiIGZpbGVwYXRoPSIke2Vudi5QYXRofSIvPgorICAgIDwvb3I+CisgIDwvY29uZGl0aW9uPgorICA8ZWNobyBsZXZlbD0idmVyYm9zZSI+IHdzZGwuZm91bmQ9JHt3c2RsLmZvdW5kfTwvZWNobz4KKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY3NjLmZvdW5kIj4KKyAgICA8b3I+CisgICAgICA8YXZhaWxhYmxlIGZpbGU9ImNzYyIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9Ii8+CisgICAgICA8YXZhaWxhYmxlIGZpbGU9ImNzYy5leGUiIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIvPgorICAgICAgPGF2YWlsYWJsZSBmaWxlPSJjc2MuZXhlIiBmaWxlcGF0aD0iJHtlbnYuUGF0aH0iLz4KKyAgICA8L29yPgorICA8L2NvbmRpdGlvbj4KKyAgPGVjaG8gbGV2ZWw9InZlcmJvc2UiPiBjc2MuZm91bmQ9JHtjc2MuZm91bmR9PC9lY2hvPgorICA8Y29uZGl0aW9uIHByb3BlcnR5PSJkb3RuZXRhcHBzLmZvdW5kIj4KKyAgICA8YW5kPgorICAgICAgPGlzc2V0IHByb3BlcnR5PSJjc2MuZm91bmQiLz4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0id3NkbC5mb3VuZCIvPgorICAgIDwvYW5kPgorICA8L2NvbmRpdGlvbj4KKyAgPGVjaG8gbGV2ZWw9InZlcmJvc2UiPiBkb3RuZXRhcHBzLmZvdW5kPSR7ZG90bmV0YXBwcy5mb3VuZH08L2VjaG8+CisKKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0icmhpbm8ucHJlc2VudCIKKyAgICBjbGFzc25hbWU9Im9yZy5tb3ppbGxhLmphdmFzY3JpcHQuU2NyaXB0YWJsZSIKKyAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJiZWFuc2hlbGwucHJlc2VudCIKKyAgICBjbGFzc25hbWU9ImJzaC5TdHJpbmdVdGlsIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpzY2gucHJlc2VudCIKKyAgICBjbGFzc25hbWU9ImNvbS5qY3JhZnQuanNjaC5TZXNzaW9uIgorICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIi8+CisKKyAgPHBhdGggaWQ9Inhkb2NsZXQuY2xhc3NwYXRoIj4KKyAgICA8cGF0aD4KKyAgICAgIDxmaWxlc2V0IGRpcj0ibGliIiBpbmNsdWRlcz0iKi5qYXIiLz4KKyAgICA8L3BhdGg+CisgICAgPHBhdGg+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9L2xpYiIgaW5jbHVkZXM9IiouamFyIi8+CisgICAgPC9wYXRoPgorICAgIDwhLS0gZG8gbm90IHJlbW92ZSB0aGlzLiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBwb2ludCB1c2VkIGJ5IHRoaW5ncyBsaWtlIEF4aXMKKyAgICAgIGFuZCBvdGhlciBwcm9qZWN0cyB0aGF0IGF1dG9nZW4gdGhlaXIgdGFzayBkb2NzIC0tPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3hkb2NsZXQuZXh0cmEuY2xhc3NwYXRofSIgLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgorICAgIDxta2RpciBkaXI9IiR7Z2VuLmRpcn0iIC8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kb2NzLmRpcn0iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Inhkb2NsZXQuY2xhc3NwYXRoLmFzcHJvcCIKKyAgICAgICAgcmVmaWQ9Inhkb2NsZXQuY2xhc3NwYXRoIi8+CisgICAgPGVjaG8gbGV2ZWw9InZlcmJvc2UiPgorICAgIHhkb2NsZXQuY2xhc3NwYXRoPSR7eGRvY2xldC5jbGFzc3BhdGh9CisgICAgeGRvY2xldC5leHRyYS5jbGFzc3BhdGg9JHt4ZG9jbGV0LmV4dHJhLmNsYXNzcGF0aH0KKyAgICA8L2VjaG8+CisgICAgPCEtLSA8ZWNob3Byb3BlcnRpZXMvPiAtLT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDxkZWxldGUgZGlyPSIke2dlbi5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGVjbGFyZS10YXNrcyIgZGVwZW5kcz0icGFja2FnZSI+CisgICAgPHRhc2tkZWYgbmFtZT0iYW50ZG9jbGV0IgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5hbnQueGRvY2xldC5BbnREb2NsZXRUYXNrIj4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxwYXRoIHJlZmlkPSJ4ZG9jbGV0LmNsYXNzcGF0aCIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L3Rhc2tkZWY+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJnZW4iIGRlcGVuZHM9ImRlY2xhcmUtdGFza3MiCisgICAgZGVzY3JpcHRpb249ImdlbmVyYXRlIHRoZSBYTUwgZmlsZXMgZnJvbSB0aGUgYW5ub3RhdGVkIHNvdXJjZSI+CisgICAgPGFudGRvY2xldCBkZXN0ZGlyPSIke2dlbi5kaXJ9IgorICAgICAgICAgICAgICAgZXhjbHVkZWR0YWdzPSJAdmVyc2lvbixAYXV0aG9yIgorICAgICAgICAgICAgICAgZm9yY2U9IiR7eGRvY2xldC5mb3JjZX0iCisgICAgICAgICAgICAgICBtZXJnZWRpcj0iJHthbnRkb2NsZXQuc3JjLmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5yb290fSI+CisgICAgICAgIDxzZWxlY3RvciBpZD0iY29uZGl0aW9uYWwtcGF0dGVybnMiPgorICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICA8b3I+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamRrMS4zKyIgdW5sZXNzPSJqZGsxLjMrIi8+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamRrMS40KyIgdW5sZXNzPSJqZGsxLjQrIi8+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuc3VuLnRvb2xzIiB1bmxlc3M9InN1bi50b29scy5wcmVzZW50Ii8+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuc3VuLnV1ZSIgdW5sZXNzPSJzdW51dWUucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnN1bi5iNjQiIHVubGVzcz0iYmFzZTY0LnByZXNlbnQiLz4KKworICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnRyYXgiIHVubGVzcz0idHJheC5wcmVzZW50Ii8+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMueGFsYW4xIiB1bmxlc3M9InhhbGFuLnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy54YWxhbjIiIHVubGVzcz0ieGFsYW4yLnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy54c2xwIiB1bmxlc3M9InhzbHAucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS5yZXNvbHZlciIgdW5sZXNzPSJhcGFjaGUucmVzb2x2ZXIucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmp1bml0IiB1bmxlc3M9Imp1bml0LnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qYWthcnRhLnJlZ2V4cCIKKyAgICAgICAgICAgICAgICB1bmxlc3M9Impha2FydGEucmVnZXhwLnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qYWthcnRhLm9ybyIgdW5sZXNzPSJqYWthcnRhLm9yby5wcmVzZW50Ii8+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamFrYXJ0YS5iY2VsIiB1bmxlc3M9ImJjZWwucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmpha2FydGEubG9nNGoiIHVubGVzcz0ibG9nNGoucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmNvbW1vbnMubG9nZ2luZyIKKyAgICAgICAgICAgICAgICB1bmxlc3M9ImNvbW1vbnMubG9nZ2luZy5wcmVzZW50Ii8+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYnNmIiB1bmxlc3M9ImJzZi5wcmVzZW50Ii8+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuc3R5bGVib29rIiB1bmxlc3M9InN0eWxlYm9vay5wcmVzZW50Ii8+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamF2YW1haWwiIHVubGVzcz0iamF2YW1haWwuY29tcGxldGUiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5pY29udHJhY3QiIHVubGVzcz0iaWNvbnRyYWN0LnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5uZXRyZXh4IiB1bmxlc3M9Im5ldHJleHgucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLndlYmxvZ2ljLmVqYmMiIHVubGVzcz0iZWpiLmVqYmMucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLndlYmxvZ2ljLmRkY3JlYXRvciIKKyAgICAgICAgICAgICAgICB1bmxlc3M9ImVqYi5ERENyZWF0b3IucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLndlYmxvZ2ljLnNlcnZlciIgdW5sZXNzPSJlamIud2xzLnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5jb21tb25zLm5ldCIgdW5sZXNzPSJjb21tb25zLm5ldC5wcmVzZW50Ii8+CisgICAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuc3RhcnRlYW0iIHVubGVzcz0ic3RhcnRlYW0ucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnZhaiIgdW5sZXNzPSJ2YWoucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFudGxyIiB1bmxlc3M9ImFudGxyLnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qbWYiIHVubGVzcz0iam1mLnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qYWkiIHVubGVzcz0iamFpLnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qZGVwZW5kIiB1bmxlc3M9ImpkZXBlbmQucHJlc2VudCIvPgorICAgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnN3aW5nIiB1bmxlc3M9InN3aW5nLnByZXNlbnQiLz4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qc2NoIiB1bmxlc3M9ImpzY2gucHJlc2VudCIvPgorICAgICAgICAgICAgPC9vcj4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9zZWxlY3Rvcj4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDx0YXNrZGVzY3JpcHRvci8+Cis8IS0tICAgICAgPHRhc2tkZWZwcm9wZXJ0aWVzLz4gLS0+CisgICAgPC9hbnRkb2NsZXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icHJlcGFyZS1mb3ItZG9jcyI+CisgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuZG9jcy5kaXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS8uLi8uLi9kb2NzIiBpbmNsdWRlcz0iYXJ0d29yay8qKiIgLz4KKyAgICA8L2NvcHk+CisgICAgPG1rZGlyIGRpcj0iJHt4ZG9jcy5kaXJ9IiAvPgorICAgIDxjb3B5IHRvZGlyPSIke3hkb2NzLmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2RvY3Muc3JjfSIgaW5jbHVkZXM9InN0eWxlc2hlZXRzL3Byb2plY3QueG1sIiAvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0taW5zZXJ0ZWQgZm9yIGV4dGVybmFsIGJ1aWxkIGZpbGVzIHRvIGNhbGwgLS0+CisgIAorICA8dGFyZ2V0IG5hbWU9Imdlbi1hbmQtcHJlcGFyZS1mb3ItZG9jcyIKKyAgIGRlcGVuZHM9ImdlbixwcmVwYXJlLWZvci1kb2NzIiAvPgorICAgCisgIDx0YXJnZXQgbmFtZT0iZG9jcyIgZGVwZW5kcz0icHJlcGFyZS1mb3ItZG9jcyIgPgorICAgIDwhLS0gQ29weSBzdHVmZiBzbyB0aGluZ3MgYXJlIGluIHRoZSBjb3JyZWN0IHJlbGF0aXZlIGxvY2F0aW9uLiAtLT4KKyAgICA8IS0tIEdlbmVyYXRlIEhUTUwgdXNpbmcgRFZTTCAtLT4KKyAgICA8YW50IGRpcj0iZHZzbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+CisgICAgPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIgorICAgICAgICAgICBzcmNkaXI9IiR7YW50ZG9jbGV0LnNyYy5kaXJ9IgorICAgICAgICAgICBkZXByZWNhdGlvbj0ib24iCisgICAgICAgICAgIGRlYnVnPSJ0cnVlIgorICAgICAgICAgICBjbGFzc3BhdGhyZWY9Inhkb2NsZXQuY2xhc3NwYXRoIgorICAgIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icGFja2FnZSIgZGVwZW5kcz0iY29tcGlsZSI+Cis8IS0tICAgIDxqYXIgZGVzdGZpbGU9IiR7YnVpbGQuZGlyfS94ZG9jbGV0LWFudC5qYXIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgorICAgICAgPG1ldGFpbmYgZGlyPSJtZXRhZGF0YSIgaW5jbHVkZXM9Inhkb2NsZXQueG1sIi8+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYyIgaW5jbHVkZXM9IioqLyoueGR0Ii8+CisgICAgPC9qYXI+IC0tPgorCisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMvTUVUQS1JTkYiLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMvTUVUQS1JTkYiPgorICAgICAgICA8ZmlsZXNldCBkaXI9Im1ldGFkYXRhIi8+CisgICAgPC9jb3B5PgorICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjIiBpbmNsdWRlcz0iKiovKi54ZHQiLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5kZXhnZW4iIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDx0YXNrZGVmIG5hbWU9ImluZGV4Z2VuIgorICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmFudC54ZG9jbGV0LkluZGV4R2VuIgorICAgIC8+CisgICAgPGluZGV4Z2VuIHJvb3RkaXI9IiR7YnVpbGQuZGlyfS9kb2NzL21hbnVhbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvY3MtZnJvbS1zY3JhdGNoIiBkZXBlbmRzPSJjbGVhbixnZW4sZG9jcyxpbmRleGdlbiIvPgorCisgIDx0YXJnZXQgbmFtZT0iZGVmYXVsdCIgZGVwZW5kcz0iZ2VuIi8+CisKKzwvcHJvamVjdD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC9SRUFETUUudHh0IGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmFmMWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9kdnNsL1JFQURNRS50eHQKQEAgLTAsMCArMSwxNiBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBIVE1MIHRhc2sgZG9jdW1lbnRhdGlvbgorZnJvbSB0aGUgWERvY2xldCBnZW5lcmF0ZWQgWE1MLiAgRFZTTAorKGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvZHZzbC8pIGlzIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4gIEl0IGhhcworbWFueSBvZiB0aGUgYmVuZWZpdHMgb2YgWFNMVCBidXQgdXNlcyBWZWxvY2l0eSBhcyBpdHMgdGVtcGxhdGUgbGFuZ3VhZ2UuCisKK1RoaXMgaXMgaW4gYSBzdWJkaXJlY3RvcnkgYXMgaXQgaXMgZWZmZWN0aXZlbHkgYSBzdWItcHJvcG9zYWwgZGVtb25zdHJhdGluZworb25lIHdheSB0aGUgdGFzayBYTUwgY2FuIGJlIHRyYW5zZm9ybWVkIGludG8gSFRNTC4KKworRGlyZWN0aW9uczoKKzEuIEdlbmVyYXRlIHRoZSBYTUwgdGFzayBkb2NzIGJ5IHJ1bm5pbmcgdGhlIGJ1aWxkLnhtbCBpbiB0aGUgcGFyZW50CisgICBkaXJlY3RvcnkuCisyLiBHZW5lcmF0ZSB0aGUgSFRNTCBkb2NzIGJ5IHJ1bm5pbmcgdGhlIGJ1aWxkIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuCisgICBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gLi4vYnVpbGQvZG9jcy9tYW51YWwuCisKKy1CaWxsIEJ1cnRvbiA8YmlsbGJAcHJvZ3Jlc3MuY29tPgorCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy9kdnNsL2J1aWxkLnhtbCBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2R2c2wvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwM2FiYzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9kdnNsL2J1aWxkLnhtbApAQCAtMCwwICsxLDQ1IEBACis8cHJvamVjdCBuYW1lPSJBbnRNYW51YWwiIGRlZmF1bHQ9InRhc2tkb2NzIiBiYXNlZGlyPSIuIj4KKworICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L2xpYiIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vYnVpbGQiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLnNyYyIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4vLi4veGRvY3MiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0YXNrZG9jcy5zcmMiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vZ2VuIiAvPgorICA8cHJvcGVydHkgbmFtZT0ic3R5bGVzaGVldCIgbG9jYXRpb249IiR7ZG9jcy5zcmN9L3N0eWxlc2hlZXRzL3Byb2plY3QueG1sIi8+CisKKyAgPCEtLSBUaGUgZG9jcyBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgIC0tPgorICA8cHJvcGVydHkgbmFtZT0iZG9jcy5kZXN0IiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2RvY3MiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im1hbnVhbC5kZXN0IiBsb2NhdGlvbj0iJHtkb2NzLmRlc3R9L21hbnVhbCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9Inhkb2NzLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0veGRvY3MiLz4KKyAgPHByb3BlcnR5IG5hbWU9InN0eWxlc2hlZXQuZGlyIiBsb2NhdGlvbj0iJHt4ZG9jcy5kaXJ9L3N0eWxlc2hlZXRzIi8+CisKKyAgPCEtLSBDb25zdHJ1Y3QgY29tcGlsZSBjbGFzc3BhdGggLS0+CisgIDxwYXRoIGlkPSJjbGFzc3BhdGgiPgorICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgorICAgIDwvZmlsZXNldD4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgPHRhc2tkZWYgbmFtZT0iZHZzbCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmR2c2wuRFZTTFRhc2siPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGggcmVmaWQ9ImNsYXNzcGF0aCIvPgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgPC90YXNrZGVmPgorICAgIDwhLS0gTWFrZSBzdHVmZiBhdmFpbGFibGUgcmVsYXRpdmUgdG8gY3VycmVudCBsb2NhdGlvbiAtLT4KKyAgICA8bWtkaXIgZGlyPSIke3N0eWxlc2hlZXQuZGlyfSIgLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtzdHlsZXNoZWV0LmRpcn0iIGZpbGU9IiR7c3R5bGVzaGVldH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0YXNrZG9jcyIgZGVwZW5kcz0iaW5pdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iR2VuZXJhdGUgVGFzayBEb2N1bWVudGF0aW9uIj4KKyAgICA8ZHZzbCBiYXNlZGlyPSIke3Rhc2tkb2NzLnNyY30iIGRlc3RkaXI9IiR7bWFudWFsLmRlc3R9IgorICAgICAgICAgIHN0eWxlPSJ0YXNrLmR2c2wiIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgdG9vbGJveGZpbGU9InRvb2xib3gucHJvcHMiCisgICAgICAgICAgaW5jbHVkZXM9IioqLyoueG1sIj4KKyAgICAgIDx2ZWxjb25maWcgbmFtZT0idmVsb2NpbWFjcm8ubGlicmFyeSIgdmFsdWU9IiIgLz4KKyAgICA8L2R2c2w+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy9kdnNsL2xpYi9kb200ai0xLjItanAuamFyIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC9saWIvZG9tNGotMS4yLWpwLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmQ0YTEyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC9saWIvZG9tNGotMS4yLWpwLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy9kdnNsL2xpYi9kb200ai1SRUFETUUudHh0IGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC9saWIvZG9tNGotUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M2MWFlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC9saWIvZG9tNGotUkVBRE1FLnR4dApAQCAtMCwwICsxLDE5IEBACitUaGlzIGlzIHRoZSBzdGFuZGFyZCBkb200aiAxLjIgcmVsZWFzZSB3aXRoIGEgcGF0Y2ggYXBwbGllZCB0byBqYXhlbi4gIFRoZQorcGF0Y2ggZml4ZXMgYSBwcm9ibGVtIHdoZXJlIERvY3VtZW50SGVscGVyLmNyZWF0ZVBhdHRlcm4oImFhYSB8IGJiYiIpIHdvdWxkCitmYWlsIG5ldmVyIG1hdGNoaW5nIHRoZSBlbGVtZW50IDxiYmI+IGJlY2F1c2UgdGhlIHBhdHRlcm4gZm9yICJiYmIiIGhhZCBiZWVuCitvdmVyd3JpdHRlbiBieSB0aGUgcGF0dGVybiBmb3IgImFhYSIuCisKKy0tLSBvcmcvamF4ZW4vcGF0dGVybi9VbmlvblBhdHRlcm4uamF2YS5vcmlnICAgIFdlZCBBdWcgIDggMTc6Mjk6NDkgMjAwMQorKysrIG9yZy9qYXhlbi9wYXR0ZXJuL1VuaW9uUGF0dGVybi5qYXZhIFdlZCBNYXIgIDYgMDE6Mzk6NTEgMjAwMgorQEAgLTkxLDcgKzkxLDcgQEAKKyAgICAgcHVibGljIFBhdHRlcm4gc2ltcGxpZnkoKQorICAgICB7CisgICAgICAgICB0aGlzLmxocyA9IGxocy5zaW1wbGlmeSgpOworLSAgICAgICAgdGhpcy5yaHMgPSBsaHMuc2ltcGxpZnkoKTsKKysgICAgICAgIHRoaXMucmhzID0gcmhzLnNpbXBsaWZ5KCk7CisgICAgICAgICBpbml0KCk7CisgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgfQorCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC9saWIvdmVsb2NpdHktZGVwLTEuMy1kZXYuamFyIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC9saWIvdmVsb2NpdHktZGVwLTEuMy1kZXYuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTQwMjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9kdnNsL2xpYi92ZWxvY2l0eS1kZXAtMS4zLWRldi5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC9saWIvdmVsb2NpdHktZHZzbC0wLjQyLmphciBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2R2c2wvbGliL3ZlbG9jaXR5LWR2c2wtMC40Mi5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYzhhZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2R2c2wvbGliL3ZlbG9jaXR5LWR2c2wtMC40Mi5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC90YXNrLmR2c2wgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9kdnNsL3Rhc2suZHZzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjY4NTNiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvZHZzbC90YXNrLmR2c2wKQEAgLTAsMCArMSw1MjQgQEAKKyMqCisgKiAgRFZTTCBTdHlsZXNoZWV0IHRvIGZvcm1hdCB0aGUgQW50IFRhc2sgZG9jdW1lbnRhdGlvbi4KKyAqIworCisjc2V0KCAkcmVsYXRpdmUtcGF0aCA9ICIuLi8uLi8iICkKKyNpZiAoZmFsc2UpCisjc2V0KCAkYm9keS1iZyA9ICcjZmZmZmZmJyApCisjc2V0KCAkYm9keS1mZyA9ICcjMDAwMDAwJyApCisjc2V0KCAkYm9keS1saW5rID0gJyM1MjVENzYnICkKKyMjc2V0KCAkYmFubmVyLWJnID0gJyNFRUVFRUUnKQorI3NldCggJGJhbm5lci1mZyA9ICcjMDAwMDAwJykKKyNzZXQoICRzdWItYmFubmVyLWJnID0gJyM4MjhEQTYnKQorI3NldCggJHN1Yi1iYW5uZXItZmcgPSAnI2ZmZmZmZicpCisjI3NldCggJHRhYmxlLXRoLWJnID0gJyNGRkVFRUUnKQorIyNzZXQoICR0YWJsZS10ZC1iZyA9ICcjRkZFRUVFJykKKyMjc2V0KCAkc291cmNlLWNvbG9yID0gJyNDQ0ZGRkYnKQorCisjc2V0KCAkdGFibGUtdGgtYmcgPSAnI0VFRUVFRScpCisjc2V0KCAkdGFibGUtdGQtYmcgPSAnI0VFRUVFRScpCisjc2V0KCAkYmFubmVyLWJnID0gJyNhMGRkZjAnKQorIyNzZXQoICRiYW5uZXItYmcgPSAnIzUyNUQ3NicpCisjI3NldCggJHRhYmxlLXRoLWJnID0gJyMwMzlhY2MnKQorIyNzZXQoICR0YWJsZS10ZC1iZyA9ICcjYTBkZGYwJykKKyNzZXQoICRzb3VyY2UtY29sb3IgPSAnIzAyMzI2NCcpCisjZW5kCisKKyNzZXQoICRib2R5LWJnID0gJyNmZmZmZmYnICkKKyNzZXQoICRib2R5LWZnID0gJyMwMDAwMDAnICkKKyNzZXQoICRib2R5LWxpbmsgPSAnIzUyNUQ3NicgKQorI3NldCggJGJhbm5lci1iZyA9ICcjNTI1RDc2JykKKyNzZXQoICRiYW5uZXItZmcgPSAnI2ZmZmZmZicpCisjc2V0KCAkc3ViLWJhbm5lci1iZyA9ICcjODI4REE2JykKKyNzZXQoICRzdWItYmFubmVyLWZnID0gJyNmZmZmZmYnKQorI3NldCggJHRhYmxlLXRoLWJnID0gJyNjY2NjY2MnKQorI3NldCggJHRhYmxlLXRkLWJnID0gJyNlZWVlZWUnKQorI3NldCggJHNvdXJjZS1jb2xvciA9ICcjMDIzMjY0JykKKyNzZXQoICRzb3VyY2UtZm9udC1zaXplID0gJyswJykKKworIyMgRG91YmxlIHF1b3RlIGZvciBjb252ZW5pZW5jZQorI3NldCAoJHFxID0gJyInKQorCisjIyBNYWNybyB0byBvdXRwdXQgYXJndW1lbnQgaWYgdGVzdCBldmFsdWF0ZXMgdG8gdHJ1ZQorI21hY3JvKGlmc2V0ICR0ZXN0ICRvdXRwdXQpCisjaWYgKCAkdGVzdCApJG91dHB1dCNlbmQKKyNlbmQKKworIyMgTWFjcm8gdG8gY2FwaXRhbGl6ZSBhIHdvcmQgbWFraW5nIHRoZSBmaXJzdCBsZXR0ZXIgdXBwZXIgY2FzZQorI21hY3JvKGNhcGl0YWxpemUgJHdvcmQpCiskd29yZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpJHdvcmQuc3Vic3RyaW5nKDEpCisjZW5kCisKKworI21hdGNoKCAidGFzayIgKQorICAjc2V0KCAkcHJvamVjdCA9ICRub2RlLnNlbGVjdFNpbmdsZU5vZGUoImRvY3VtZW50KCd4ZG9jcy9zdHlsZXNoZWV0cy9wcm9qZWN0LnhtbCcpL3Byb2plY3QiICkgKQorICAjaWYgKCRub2RlLm5hbWUoKS5lcXVhbHMoInRhc2siKSkKKyAgICAjc2V0KCAkdGl0bGUgPSAiI2NhcGl0YWxpemUoJGF0dHJpYi5uYW1lKSBUYXNrIiApCisgICAgI3NldCggJHN1bW1hcnkgPSAkbm9kZS5zaG9ydC1kZXNjcmlwdGlvbiApICAgCisgICNlbmQKKworPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8dGl0bGU+JHRpdGxlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iJGJvZHktYmciIHRleHQ9IiRib2R5LWZnIiBsaW5rPSIkYm9keS1saW5rIgorICAgICAgYWxpbms9IiRib2R5LWxpbmsiIHZsaW5rPSIkYm9keS1saW5rIj4KKworPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSI0Ij4KKworICA8IS0tIFBBR0UgSEVBREVSIC0tPgorICA8dHI+CisgICAgPHRkPgorICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPjx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgPGZvbnQgc2l6ZT0iKzMiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PHN0cm9uZz4kdGl0bGU8L3N0cm9uZz48L2ZvbnQ+CisjKiAgICAgICAgICAqIyNpZiggJHN1bW1hcnkgKQorICAgICAgICAgICAgPGJyPjxmb250IGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+JHN1bW1hcnk8L2ZvbnQ+CisjKiAgICAgICAgICAqIyNlbmQKKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZD4KKyMqICAgICAgICAqIyNpZiggJHByb2plY3QubG9nbyApCisgICAgICAgICAgICAjc2V0KCAkYWx0ID0gJHByb2plY3QubG9nbyApCisgICAgICAgICAgICAjc2V0KCAkaG9tZSA9ICRwcm9qZWN0LmF0dHJpYnV0ZSgiaHJlZiIpICkKKyAgICAgICAgICAgICNzZXQoICRzcmMgPSAkcHJvamVjdC5sb2dvLmF0dHJpYnV0ZSggImhyZWYiICkgKQorICAgICAgICAgICAgPCEtLSBQUk9KRUNUIExPR08gLS0+CisgICAgICAgICAgICA8YSBocmVmPSIkaG9tZSI+CisgICAgICAgICAgICAgIDxpbWcgc3JjPSIke3JlbGF0aXZlLXBhdGh9JHNyYyIgYWxpZ249InJpZ2h0IiBhbHQ9IiRhbHQiIGJvcmRlcj0iMCIvPgorICAgICAgICAgICAgPC9hPgorIyogICAgICAgICojI2VuZAorICAgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPjwvdGFibGU+CisgICAgPC90ZD4KKyAgPC90cj4KKworICA8IS0tIFNUQVJUIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgorICA8dHI+CisgICAgPHRkICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorIyogICAgKiMjaWYgKCRub2RlLm5hbWUoKS5lcXVhbHMoInRhc2siKSkKKyMqICAgICAgVXNlIGRlc2NyaXB0aW9uIGZyb20gbWVyZ2VkIFhNTCBpZiBhdmFpbGFibGUsIGVsc2UgamF2YWRvYyBjb21tZW50ICojCisjKiAgICAgICojI2lmICgkbm9kZS5leHRlcm5hbC5kZXNjcmlwdGlvbikKKyAgICAgICAgICA8IS0tIEFwcGx5aW5nIHRhc2svZGVzY3JpcHRpb24gLS0+CisjKiAgICAgICAgKiMkY29udGV4dC5hcHBseVRlbXBsYXRlcygiZXh0ZXJuYWwvZGVzY3JpcHRpb24iKQorIyogICAgICAqIyNlbHNlCisgICAgICAgICAgPCEtLSBBcHBseWluZyB0YXNrL2xvbmctZGVzY3JpcHRpb24gLS0+CisjKiAgICAgICAgKiMkY29udGV4dC5hcHBseVRlbXBsYXRlcygibG9uZy1kZXNjcmlwdGlvbiIpCisjKiAgICAgICojI2VuZAorIyogICAgICojJGNvbnRleHQuYXBwbHlUZW1wbGF0ZXMoInNob3J0LWRlc2NyaXB0aW9uIikKKyMqICAgICAqIyRjb250ZXh0LmFwcGx5VGVtcGxhdGVzKCJhdHRyaWJ1dGUvZGVzY3JpcHRpb24iKQorIyogICAgICojJGNvbnRleHQuYXBwbHlUZW1wbGF0ZXMoImVsZW1lbnQvZGVzY3JpcHRpb24iKQorIyogICAgICojJGNvbnRleHQuYXBwbHlUZW1wbGF0ZXMoInN0cnVjdHVyZS9hdHRyaWJ1dGUtZ3JvdXBzIikKKyMqICAgICAqIyRjb250ZXh0LmFwcGx5VGVtcGxhdGVzKCJzdHJ1Y3R1cmUvZWxlbWVudHMiKQorIyogICAgICojJGNvbnRleHQuYXBwbHlUZW1wbGF0ZXMoImV4dGVybmFsL3NlY3Rpb24iKQorIyogICAgKiMjZW5kCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPCEtLSBFTkQgUklHSFQgU0lERSBNQUlOIEJPRFkgLS0+CisKKyAgPCEtLSBGT09URVIgU0VQQVJBVE9SIC0tPgorICA8dHI+CisgICAgPHRkPgorICAgICAgPGhyIG5vc2hhZGU9IiIgc2l6ZT0iMSIvPgorICAgIDwvdGQ+CisgIDwvdHI+CisKKyAgPCEtLSBQQUdFIEZPT1RFUiAtLT4KKyAgPHRyPgorICAgIDx0ZD4KKyAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+PGZvbnQgY29sb3I9IiRib2R5LWxpbmsiIHNpemU9Ii0xIj48ZW0+CisgICAgICAgIENvcHlyaWdodCAmIzE2OTsgMjAwMC0yMDA1LCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICAgICAgPC9lbT48L2ZvbnQ+PC9kaXY+CisgICAgPC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPC9ib2R5PgorPC9odG1sPgorI2VuZAorCisjKgorICAgIE1hY3JvIHRvIGZvcm1hdCBhIHRhYmxlIGhlYWRpbmcgY2VsbAorKiMKKyNtYWNybyggdGggJHRleHQgKQorICAgICAgICA8dGQgYmdjb2xvcj0iJHRhYmxlLXRoLWJnIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj4kdGV4dDwvYj48L2ZvbnQ+CisgICAgICAgIDwvdGQ+CisjZW5kCisKKyMqCisgICAgTWFjcm8gdG8gZm9ybWF0IGEgdGFibGUgYm9keSBjZWxsCisqIworI21hY3JvKCB0ZCAkdGV4dCApCisgICAgICAgIDx0ZCBiZ2NvbG9yPSIkdGFibGUtdGQtYmciIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPiR0ZXh0PC9mb250PgorICAgICAgICA8L3RkPgorI2VuZAorCisjKgorICAgIE1hY3JvIHRvIGZvcm1hdCBhIHRhYmxlIGJvZHkgY2VsbCB0aGF0IHNwYW5zIG11bHRpcGxlIHJvd3MKKyojCisjbWFjcm8oIHRkbXIgJHRleHQgJHJvd3MgICkKKyAgICAgICAgPHRkIGJnY29sb3I9IiR0YWJsZS10ZC1iZyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiByb3dzcGFuPSIkcm93cyI+CisgICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPiR0ZXh0PC9mb250PgorICAgICAgICA8L3RkPgorI2VuZAorCisKKyMqCisgICAgTWFjcm8gdG8gZm9ybWF0IGEgc2VjdGlvbiBiYW5uZXIKKyojCisjbWFjcm8oIHNlY3Rpb24gJGFuY2hvciAkbmFtZSApCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiRiYW5uZXItYmciPgorICAgICAgICA8Zm9udCBjb2xvcj0iJGJhbm5lci1mZyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSIkYW5jaG9yIj4KKyAgICAgICAgICA8c3Ryb25nPiRuYW1lPC9zdHJvbmc+PC9hPjwvZm9udD4KKyAgICAgIDwvdGQ+PC90cj4KKyNlbmQKKworIyoKKyAgICBNYWNybyB0byBmb3JtYXQgYSBzdWJzZWN0aW9uIGJhbm5lcgorKiMKKyNtYWNybyggc3Vic2VjdGlvbiAkYW5jaG9yICRuYW1lICkKKyAgICAgIDx0cj48dGQgYmdjb2xvcj0iJHN1Yi1iYW5uZXItYmciPgorICAgICAgICA8Zm9udCBjb2xvcj0iJHN1Yi1iYW5uZXItZmciIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0iJGFuY2hvciI+CisgICAgICAgICAgPHN0cm9uZz4kbmFtZTwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisjZW5kCisKKworIyoKKyAgICBQcm9jZXNzIGphdmFkb2MgbG9uZyBkZXNjcmlwdGlvbiBzZWN0aW9uCisqIworI21hdGNoKCAibG9uZy1kZXNjcmlwdGlvbiIgKQorICAgIDwhLS0gU3RhcnQgRGVzY3JpcHRpb24gLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKworIyogICAgICAqIyNzZWN0aW9uKCJkZXNjcmlwdGlvbiIgIkRlc2NyaXB0aW9uIikKKworICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KKyAgICAgICAgJG5vZGUudmFsdWUoKS50cmltKCkKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwhLS0gRW5kIERlc2NyaXB0aW9uIC0tPgorI2VuZAorCisjKgorICAgIFByb2Nlc3MgamF2YWRvYyBzaG9ydCBkZXNjcmlwdGlvbiBzZWN0aW9uCisqIworI21hdGNoKCAic2hvcnQtZGVzY3JpcHRpb24iICkKKyA8IS0tIElnbm9yZSAtLT4KKyNlbmQKKworIyoKKyAgICBQcm9jZXNzIGphdmFkb2MgYXR0cmlidXRlL2Rlc2NyaXB0aW9uIHNlY3Rpb24KKyojCisjbWF0Y2goICJhdHRyaWJ1dGUvZGVzY3JpcHRpb24iICkKKyA8IS0tIElnbm9yZSAtLT4KKyNlbmQKKworIyoKKyAgICBQcm9jZXNzIGphdmFkb2MgZWxlbWVudC9kZXNjcmlwdGlvbiBzZWN0aW9uCisqIworI21hdGNoKCAiZWxlbWVudC9kZXNjcmlwdGlvbiIgKQorIDwhLS0gSWdub3JlIC0tPgorI2VuZAorCisKKyMqCisgICAgUHJvY2VzcyBleHRlcm5hbCBkZXNjaXB0aW9uCisqIworI21hdGNoKCAiZXh0ZXJuYWwvZGVzY3JpcHRpb24iICkKKyAgICA8IS0tIFN0YXJ0IERlc2NyaXB0aW9uIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisKKyMqICAgICAgKiMjc2VjdGlvbigiZGVzY3JpcHRpb24iICJEZXNjcmlwdGlvbiIpCisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisjKiAgICAgICojJGNvbnRleHQuYXBwbHlUZW1wbGF0ZXMoIioiKQorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRGVzY3JpcHRpb24gLS0+CisjZW5kCisKKyMqCisgICAgUHJvY2VzcyB0b3AgbGV2ZWwgYXR0cmlidXRlcworKiMKKyNtYXRjaCggInN0cnVjdHVyZS9hdHRyaWJ1dGUtZ3JvdXBzIiApCisgICAgPCEtLSBTdGFydCBBdHRyaWJ1dGVzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisjKiAgICAgICojI3NlY3Rpb24oImF0dHJpYnV0ZXMiICJQYXJhbWV0ZXJzIikgCisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorIyogICAgICAgICAgKiMjdGgoIkF0dHJpYnV0ZSIpCisjKiAgICAgICAgICAqIyN0aCgiRGVzY3JpcHRpb24iKQorIyogICAgICAgICAgKiMjdGgoIlR5cGUiKQorIyogICAgICAgICAgKiMjdGgoIlJlcXVpcmVtZW50IikKKyAgICAgICAgICA8L3RyPgorIyogICAgICAgICojJGNvbnRleHQuYXBwbHlUZW1wbGF0ZXMoIioiKQorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgQXR0cmlidXRlcyAtLT4KKyNlbmQKKworIyoKKyAgICBQcm9jZXNzIGF0dHJpYnV0ZSBncm91cAorKiMKKyNtYXRjaCggInN0cnVjdHVyZS9hdHRyaWJ1dGUtZ3JvdXBzL2F0dHJpYnV0ZS1ncm91cCIgKQorICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKKyAgICAjc2V0ICgkYXR0cmlidXRlR3JvdXAgPSAkYXR0cmliLmRlc2NyaXB0aW9uKQorICAgICNzZXQgKCRudW1Hcm91cHMgPSAkbm9kZS5zZWxlY3ROb2RlcygiYXR0cmlidXRlIikuc2l6ZSgpKQorICAgICNzZXQgKCRpbkdyb3VwID0gdHJ1ZSkKKyMqICAgICAgICAqIyRjb250ZXh0LmFwcGx5VGVtcGxhdGVzKCIqIikKKyNlbmQKKworIyoKKyAgICBQcm9jZXNzIGEgc2luZ2xlIGF0dHJpYnV0ZQorKiMKKyNtYXRjaCggInN0cnVjdHVyZS9hdHRyaWJ1dGUtZ3JvdXBzL2F0dHJpYnV0ZS1ncm91cC9hdHRyaWJ1dGUiICkgICAgCisgICAgPCEtLSBBdHRyaWJ1dGUgLS0+CisgICAgPHRyPgorIyogICAgKiMjdGQoJGF0dHJpYi5uYW1lKQorIyogICAgKiMjdGQoJG5vZGUuZGVzY3JpcHRpb24pCisjKiAgICAqIyN0ZCgkYXR0cmliLmJyaWVmVHlwZSkKKyNpZiAoJGluR3JvdXApCisjKiAgICAqIyN0ZG1yKCRhdHRyaWJ1dGVHcm91cCAkbnVtR3JvdXBzKQorI3NldCAoJGluR3JvdXAgPSBmYWxzZSkKKyNlbmQKKyAgICA8L3RyPgorI2VuZAorCisjKgorICAgIFByb2Nlc3MgYWxsIGVsZW1lbnRzCisqIworI21hdGNoKCAiZWxlbWVudHMiICkKKyAgICA8IS0tIFN0YXJ0IEVsZW1lbnRzIC0tPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisKKyMqICAgICAgKiMjc2VjdGlvbigiZWxlbWVudHMiICJQYXJhbWV0ZXJzIGFzIG5lc3RlZCBlbGVtZW50cyIpCisKKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisjKiAgICAgICojJGNvbnRleHQuYXBwbHlUZW1wbGF0ZXMoIioiKQorICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KKworICAgIDwvdGFibGU+CisgICAgPCEtLSBFbmQgRWxlbWVudHMgLS0+CisjZW5kCisKKyMqCisgICAgUHJvY2VzcyBhIHNpbmdsZSBlbGVtZW50CisqIworI21hdGNoKCAiZWxlbWVudCIgKQorICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIkc3ViLWJhbm5lci1iZyI+CisgICAgICAgIDxmb250IGNvbG9yPSIkc3ViLWJhbm5lci1mZyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIiBzaXplPSItMSI+CisgICAgICAgICAgPHN0cm9uZz4kYXR0cmliLm5hbWU8L3N0cm9uZz4gKCRhdHRyaWIudHlwZSk8L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICAkbm9kZS5kZXNjcmlwdGlvbi50b1N0cmluZygpLnRyaW0oKQorIyogICAgICAqIyRjb250ZXh0LmFwcGx5VGVtcGxhdGVzKCIqIikKKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgorI2VuZAorCisjKgorICAgIFByb2Nlc3MgYXR0cmlidXRlcyB3aXRoaW4gZWxlbWVudHMKKyojCisjbWF0Y2goICJlbGVtZW50L2F0dHJpYnV0ZXMiICkKKyAgICA8IS0tIFN0YXJ0IEF0dHJpYnV0ZXMgLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKworICAgICAgPHRyPjx0ZD4KKyAgICAgICAgPHRhYmxlPgorICAgICAgICAgIDx0cj4KKyMqICAgICAgICAgICojI3RoKCJBdHRyaWJ1dGUiKQorIyogICAgICAgICAgKiMjdGgoIkRlc2NyaXB0aW9uIikKKyMqICAgICAgICAgICojI3RoKCJUeXBlIikKKyAgICAgICAgICA8L3RyPgorIyogICAgICAgICojJGNvbnRleHQuYXBwbHlUZW1wbGF0ZXMoIioiKQorICAgICAgICA8L3RhYmxlPgorICAgICAgPC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyAgICA8IS0tIEVuZCBBdHRyaWJ1dGVzIC0tPgorI2VuZAorCisKKyMqCisgKiAgIFByb2Nlc3MgYSBtZW51IGZvciB0aGUgbmF2aWdhdGlvbiBiYXIKKyAqIworI21hdGNoKCAibWVudSIgKQorICAgIDx0cj48dGQ+CisgICAgPHA+CisgICAgICA8c3Ryb25nPiRhdHRyaWIubmFtZTwvc3Ryb25nPgorICAgIDwvcD4KKyAgICA8L3RkPjx0ZD4KKyAgICA8dWw+CisgICAgICAgICRjb250ZXh0LmFwcGx5VGVtcGxhdGVzKCJpdGVtIikKKyAgICA8L3VsPjwvdGQ+PC90cj4KKyNlbmQKKworCisjKgorICogICBQcm9jZXNzIGEgbWVudSBpdGVtIGZvciB0aGUgbmF2aWdhdGlvbiBiYXIKKyAqIworI21hdGNoKCAiaXRlbSIgKQorI2lmKCAkYXR0cmliLmhyZWYuZW5kc1dpdGgoIiRvdXRwdXRmaWxlbmFtZSIpICYmICEkYXR0cmliLmhyZWYuc3RhcnRzV2l0aCgiaHR0cCIpKQorCTxzdHJvbmc+JGF0dHJpYi5uYW1lPC9zdHJvbmc+CisjZWxzZQorI2lmKCAkYXR0cmliLmhyZWYuc3RhcnRzV2l0aCgiaHR0cCIpICkKKyAgICAgICAgPGEgaHJlZj0iJGF0dHJpYi5ocmVmIj4kYXR0cmliLm5hbWU8L2E+CisgICAgI2Vsc2UKKyAgICAgICAgPGEgaHJlZj0iJHtyZWxhdGl2ZS1wYXRofSRhdHRyaWIuaHJlZiI+JGF0dHJpYi5uYW1lPC9hPgorICAgICNlbmQKKyNlbmQKKyNlbmQKKworIyoKKyAqICBwcm9jZXNzIGEgZG9jdW1lbnRhdGlvbiBzZWN0aW9uCisgKiMKKyNtYXRjaCggInNlY3Rpb24iICkKKyAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkIGJnY29sb3I9IiRiYW5uZXItYmciPgorICAgICAgICAgIDxmb250IGNvbG9yPSIkYmFubmVyLWZnIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgorICAgICAgICAgICNpZiAoICRhdHRyaWIuYW5jaG9yICkKKyAgICAgICAgICAgICAgI3NldCggJGFuY2hvciA9ICRhdHRyaWIuYW5jaG9yICkKKyAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAjc2V0KCAkYW5jaG9yID0gJGF0dHJpYi5uYW1lICkKKyAgICAgICAgICAjZW5kCisgICAgICAgICAgPGEgbmFtZT0iJGFuY2hvciI+CisgICAgICAgICAgPHN0cm9uZz4kYXR0cmliLm5hbWU8L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorCisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICAkY29udGV4dC5hcHBseVRlbXBsYXRlcygiKiIpCisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorCisgICAgPC90YWJsZT4KKyNlbmQKKworI21hdGNoKCAic3Vic2VjdGlvbiIgKQorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgPCEtLSBTdWJzZWN0aW9uIGhlYWRpbmcgLS0+CisgICAgICA8dHI+PHRkIGJnY29sb3I9IiRzdWItYmFubmVyLWJnIj4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iJHN1Yi1iYW5uZXItZmciIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgI2lmICggJGF0dHJpYi5hbmNob3IgKQorICAgICAgICAgICAgICAjc2V0KCAkYW5jaG9yID0gJGF0dHJpYi5hbmNob3IgKQorICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICNzZXQoICRhbmNob3IgPSAkYXR0cmliLm5hbWUgKQorICAgICAgICAgICNlbmQKKyAgICAgICAgICA8YSBuYW1lPSIkYW5jaG9yIj4KKyAgICAgICAgICA8c3Ryb25nPiRhdHRyaWIubmFtZTwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8IS0tIFN1YnNlY3Rpb24gYm9keSAtLT4KKyAgICAgIDx0cj48dGQ+CisgICAgICAgICRjb250ZXh0LmFwcGx5VGVtcGxhdGVzKCIqIikKKyAgICAgIDwvdGQ+PC90cj4KKyAgICA8L3RhYmxlPgorI2VuZAorCisjKgorICogIHByb2Nlc3MgYSB0aGUgcmVxdWlyZW1lbnQgZ3JvdXBzCisgKiMKKyNtYXRjaCggInJlcXVpcmVtZW50LWdyb3VwIiApCisgICAgI2lmICgkcmVnR3JvdXAgPT0gJGF0dHJpYi5uYW1lKQorIyogICAgICAqIyRhdHRyaWIuZGVzY3JpcHRpb24KKyAgICAjZW5kCisjZW5kCisKKyNtYXRjaCggInNvdXJjZSIgKQorICAgIDxkaXYgYWxpZ249ImxlZnQiPgorICAgICAgPHRhYmxlIGNlbGxzcGFjaW5nPSI0IiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIkc291cmNlLWNvbG9yIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2VzL3ZvaWQuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0iJHNvdXJjZS1jb2xvciIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2VzL3ZvaWQuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0iJHNvdXJjZS1jb2xvciIgd2lkdGg9IjEiIGhlaWdodD0iMSI+CisgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlcy92b2lkLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0iJHNvdXJjZS1jb2xvciIgd2lkdGg9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Ii9pbWFnZXMvdm9pZC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIiBoZWlnaHQ9IjEiPgorICAgICAgICAgIDxmb250IHNpemU9IiRzb3VyY2UtZm9udC1zaXplIj48cHJlPiR0b29sYm94Lmh0bWxlc2NhcGUuZ2V0VGV4dCggJG5vZGUudmFsdWUoKSApPC9wcmU+PC9mb250PgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGJnY29sb3I9IiRzb3VyY2UtY29sb3IiIHdpZHRoPSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2VzL3ZvaWQuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIkc291cmNlLWNvbG9yIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2VzL3ZvaWQuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0iJHNvdXJjZS1jb2xvciIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2VzL3ZvaWQuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0iJHNvdXJjZS1jb2xvciIgd2lkdGg9IjEiIGhlaWdodD0iMSI+CisgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlcy92b2lkLmdpZiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICA8L3RhYmxlPgorICAgIDwvZGl2PgorI2VuZAorCisKKyNtYXRjaCgidGFibGUiKQorPHRhYmxlPgorJGNvbnRleHQuYXBwbHlUZW1wbGF0ZXMoIioiKQorPC90YWJsZT4KKyNlbmQKKworI21hdGNoKCJ0ciIpCis8dHI+CiskY29udGV4dC5hcHBseVRlbXBsYXRlcygiKiIpCis8L3RyPgorI2VuZAorCisjbWF0Y2goICJ0ZCIgKQorPHRkIGJnY29sb3I9IiR0YWJsZS10ZC1iZyIgIyoKKyAgICAqIyNpZnNldCgkYXR0cmliLmNvbHNwYW4gImNvbHNwYW49JHFxJGF0dHJpYi5jb2xzcGFuJHFxICIpIyoKKyAgICAqIyNpZnNldCgkYXR0cmliLnJvd3NwYW4gInJvd3NwYW49JHFxJGF0dHJpYi5yb3dzcGFuJHFxICIpIyoKKyAgICAqI3ZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgorICAgICAgICRub2RlLmNvcHkoICRub2RlLmNoaWxkcmVuKCkgKQorICAgIDwvZm9udD4KKzwvdGQ+CisjZW5kCisKKyNtYXRjaCggInRoIiApCis8dGQgYmdjb2xvcj0iJHRhYmxlLXRoLWJnIiAjKgorICAgICojI2lmc2V0KCRhdHRyaWIuY29sc3BhbiAiY29sc3Bhbj0kcXEkYXR0cmliLmNvbHNwYW4kcXEgIikjKgorICAgICojI2lmc2V0KCRhdHRyaWIucm93c3BhbiAicm93c3Bhbj0kcXEkYXR0cmliLnJvd3NwYW4kcXEgIikjKgorICAgICojdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+CisgICAgICAgPGI+JG5vZGUuY29weSggJG5vZGUuY2hpbGRyZW4oKSk8L2I+CisgICAgPC9mb250PgorPC90ZD4KKyNlbmQKKworI21hdGNoKCIqIikKKyRub2RlLmNvcHkoKQorI2VuZAorCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy9kdnNsL3Rvb2xib3gucHJvcHMgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9kdnNsL3Rvb2xib3gucHJvcHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkYTY2OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2R2c2wvdG9vbGJveC5wcm9wcwpAQCAtMCwwICsxLDQgQEAKK3Rvb2xib3guY29udGV4dG5hbWUgPSB0b29sYm94Cit0b29sYm94LnRvb2wuaHRtbGVzY2FwZSA9IG9yZy5hcGFjaGUudmVsb2NpdHkuYW5ha2lhLkVzY2FwZQorCisKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi9MSUNFTlNFLnhkb2NsZXQudHh0IGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvbGliL0xJQ0VOU0UueGRvY2xldC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1ODE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi9MSUNFTlNFLnhkb2NsZXQudHh0CkBAIC0wLDAgKzEsMzcgQEAKKworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMywgWERvY2xldCBUZWFtCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCitSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdAorb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCitSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKK2xpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vcgorb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgWERvY2xldCB0ZWFtIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKK3VzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKK3ByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycKK0FORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitPdGhlciBMaWNlbnNlcworCitMaWNlbnNlcyBvZiB0aGUgcHJvZHVjdHMgWERvY2xldCBkZXBlbmRzIG9uOgorCisgICAgKiBKYWthcnRhIEFudAorICAgICogWGVyY2VzCisKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi9jb21tb25zLWNvbGxlY3Rpb25zLTIuMC5qYXIgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9saWIvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNGY5N2IKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9saWIvY29tbW9ucy1jb2xsZWN0aW9ucy0yLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi9jb21tb25zLWxvZ2dpbmcuamFyIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvbGliL2NvbW1vbnMtbG9nZ2luZy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhMWU0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi9jb21tb25zLWxvZ2dpbmcuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi94ZG9jbGV0LTEuMi5qYXIgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9saWIveGRvY2xldC0xLjIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTcxM2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9saWIveGRvY2xldC0xLjIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi94ZG9jbGV0LWVqYi1tb2R1bGUtMS4yLmphciBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi94ZG9jbGV0LWVqYi1tb2R1bGUtMS4yLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzBkMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvbGliL3hkb2NsZXQtZWpiLW1vZHVsZS0xLjIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi94ZG9jbGV0LXdlYi1tb2R1bGUtMS4yLmphciBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi94ZG9jbGV0LXdlYi1tb2R1bGUtMS4yLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTZmODM2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvbGliL3hkb2NsZXQtd2ViLW1vZHVsZS0xLjIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi94ZG9jbGV0LXhkb2NsZXQtbW9kdWxlLTEuMi5qYXIgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9saWIveGRvY2xldC14ZG9jbGV0LW1vZHVsZS0xLjIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Mjg4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9saWIveGRvY2xldC14ZG9jbGV0LW1vZHVsZS0xLjIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xpYi94amF2YWRvYy0xLjAuMi5qYXIgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9saWIveGphdmFkb2MtMS4wLjIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDI5NGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9saWIveGphdmFkb2MtMS4wLjIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL2xvZzRqLnByb3BlcnRpZXMgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9sb2c0ai5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzYzMTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9sb2c0ai5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzMgQEAKK2xvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDb25zb2xlCitsb2c0ai5hcHBlbmRlci5Db25zb2xlPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5Db25zb2xlLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKKyNsb2c0ai5hcHBlbmRlci5Db25zb2xlLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lbSVuCitsb2c0ai5hcHBlbmRlci5Db25zb2xlLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0oJS0zNWN7Mn0gJS00TCkgJW0lbgorCisjIFVuY29tbWVudCB0byBkZWJ1ZyBhbGwKK2xvZzRqLmNhdGVnb3J5Lnhkb2NsZXQ9REVCVUcKKworIyBVbmNvbW1lbnQgdG8gZGVidWcgYWxsIEVqYiBNb2R1bGUgdGFza3Mgb25seQorI2xvZzRqLmNhdGVnb3J5Lnhkb2NsZXQubW9kdWxlcy5lamI9REVCVUcKKworIyBVbmNvbW1lbnQgdG8gZGVidWcgdGhlIGNsYXNzIFN1YlRhc2sgb25seQorI2xvZzRqLmNhdGVnb3J5Lnhkb2NsZXQuU3ViVGFzaz1ERUJVRworI2xvZzRqLmNhdGVnb3J5Lnhkb2NsZXQuVGVtcGxhdGVTdWJUYXNrPURFQlVHCisjbG9nNGouY2F0ZWdvcnkueGRvY2xldC50ZW1wbGF0ZS5UZW1wbGF0ZUVuZ2luZT1ERUJVRworCisjIFVuY29tbWVudCB0byBkZWJ1ZyB0aGUgZXhlY3V0ZSgpIG1ldGhvZCBvZiBTdWJUYXNrIG9ubHkKKyNsb2c0ai5jYXRlZ29yeS54ZG9jbGV0LlN1YlRhc2suZXhlY3V0ZT1ERUJVRworCisjIFVuY29tbWVudCB0aGlzIGxpbmUgaWYgeW91IHdhbnQgdG8gc2VlIHN0YWNrIHRyYWNlcworIyBQbGVhc2UgYWx3YXlzIGRvIHNvIHdoZW4geW91IHdhbnQgdG8gcmVwb3J0IGEgYnVnCisjbG9nNGouY2F0ZWdvcnkueGRvY2xldC5Eb2NsZXRUYXNrPURFQlVHCisjbG9nNGouY2F0ZWdvcnkueGRvY2xldC5YRG9jbGV0TWFpbj1ERUJVRworCisjIFVuY29tbWVudCB0byBkZWJ1ZyB0aGUgTW9kdWxlRmluZGVyCisjbG9nNGouY2F0ZWdvcnkueGRvY2xldC5sb2FkZXIuTW9kdWxlRmluZGVyLmZpbmRNb2R1bGVzPURFQlVHCisKKyMgVW5jb21tZW50IHRvIGRlYnVnIHRoZSBNZXRob2RUYWdzSGFuZGxlcgorI2xvZzRqLmNhdGVnb3J5Lnhkb2NsZXQudGFnc2hhbmRsZXIuTWV0aG9kVGFnc0hhbmRsZXI9REVCVUcKKworIyBVbmNvbW1lbnQgdG8gZGVidWcgdGhlIEdlbmVyYXRpb25NYW5hZ2VyCisjbG9nNGouY2F0ZWdvcnkueGRvY2xldC5HZW5lcmF0aW9uTWFuYWdlci5nZW5lcmF0aW9uPURFQlVHCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy9tZXRhZGF0YS94ZG9jbGV0LnhtbCBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL21ldGFkYXRhL3hkb2NsZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjkzODkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9tZXRhZGF0YS94ZG9jbGV0LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorCis8IS0tCis8IURPQ1RZUEUgeGRvY2xldC1tb2R1bGUgUFVCTElDICItLy9YRG9jbGV0IFRlYW0vL0RURCBYRG9jbGV0IE1vZHVsZSAxLjAvL0VOIiAiaHR0cDovL3hkb2NsZXQuc291cmNlZm9yZ2UubmV0L2R0ZC94ZG9jbGV0LW1vZHVsZV8xXzAuZHRkIj4KKy0tPgorCis8eGRvY2xldC1tb2R1bGU+CisgICAgPHRhZ2hhbmRsZXIKKyAgICAgICAgbmFtZXNwYWNlPSJBbnQiCisgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmFudC54ZG9jbGV0LlRhc2tUYWdzSGFuZGxlciIKKyAgICAvPgorCisgICAgPHN1YnRhc2sKKyAgICAgICAgbmFtZT0idGFza2Rlc2NyaXB0b3IiCisgICAgICAgIGltcGxlbWVudGF0aW9uLWNsYXNzPSJvcmcuYXBhY2hlLmFudC54ZG9jbGV0LlRhc2tEZXNjcmlwdG9yU3ViVGFzayIKKyAgICAgICAgcGFyZW50LXRhc2stY2xhc3M9Im9yZy5hcGFjaGUuYW50Lnhkb2NsZXQuQW50RG9jbGV0VGFzayIKKyAgICAvPgorICAgIDxzdWJ0YXNrCisgICAgICAgIG5hbWU9InRhc2tkZWZwcm9wZXJ0aWVzIgorICAgICAgICBpbXBsZW1lbnRhdGlvbi1jbGFzcz0ib3JnLmFwYWNoZS5hbnQueGRvY2xldC5UYXNrRGVmUHJvcGVydGllc1N1YlRhc2siCisgICAgICAgIHBhcmVudC10YXNrLWNsYXNzPSJvcmcuYXBhY2hlLmFudC54ZG9jbGV0LkFudERvY2xldFRhc2siCisgICAgLz4KKzwveGRvY2xldC1tb2R1bGU+CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS9hbnQveGRvY2xldC9BbnREb2NsZXRUYXNrLmphdmEgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS9hbnQveGRvY2xldC9BbnREb2NsZXRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwZDhhNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L0FudERvY2xldFRhc2suamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuYW50Lnhkb2NsZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworaW1wb3J0IHhkb2NsZXQuRG9jbGV0VGFzazsKKworLyoqCisgKiBAY3JlYXRlZCAgICAgICBKYW51YXJ5IDUsIDIwMDMKKyAqIEBhbnQuZWxlbWVudCAgIG5hbWU9ImFudGRvY2xldCIgZGlzcGxheS1uYW1lPSJBbnREb2NsZXQgVGFzayIKKyAqLworcHVibGljIGNsYXNzIEFudERvY2xldFRhc2sgZXh0ZW5kcyBEb2NsZXRUYXNrCit7CisgICAgcHVibGljIEFudERvY2xldFRhc2soKQorICAgIHsKKyAgICAgICAgLy8gYnkgZGVmYXVsdCwgYmluYXJ5IGNsYXNzZXMgZG8gbm90IHByb3ZpZGUgdGhlaXIKKyAgICAgICAgLy8gbWV0aG9kcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYnV0IGl0IGlzIG5lZWRlZAorICAgICAgICAvLyBoZXJlIHRvIGNsaW1iIHVwIGFuZCBmaW5kIHRydWUgdGFza3MuCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgieGphdmFkb2MuY29tcGlsZWRtZXRob2RzIiwgInRydWUiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU9wdGlvbnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN1cGVyLnZhbGlkYXRlT3B0aW9ucygpOworICAgICAgICBjaGVja0NsYXNzKCJvcmcuYXBhY2hlLnRvb2xzLmFudC5JbnRyb3NwZWN0aW9uSGVscGVyIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvYW50L3hkb2NsZXQvQW50U3ViVGFzay5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvYW50L3hkb2NsZXQvQW50U3ViVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODdlNmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS9hbnQveGRvY2xldC9BbnRTdWJUYXNrLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKKyAqIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICogICAgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICoKKyAqIDQuIFRoZSBuYW1lcyAiVGhlIEpha2FydGEgUHJvamVjdCIsICJBbnQiLCBhbmQgIkFwYWNoZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKKyAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuYW50Lnhkb2NsZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgeGphdmFkb2MuWENsYXNzOworaW1wb3J0IHhqYXZhZG9jLlhKYXZhRG9jOworaW1wb3J0IHhqYXZhZG9jLlhNZXRob2Q7CisKK2ltcG9ydCB4ZG9jbGV0LlRlbXBsYXRlU3ViVGFzazsKK2ltcG9ydCB4ZG9jbGV0LlhEb2NsZXRFeGNlcHRpb247CitpbXBvcnQgeGRvY2xldC51dGlsLlR5cGVDb252ZXJzaW9uVXRpbDsKKworLyoqCisgKiBAY3JlYXRlZCAgIEphbnVhcnkgNSwgMjAwMworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW50U3ViVGFzayBleHRlbmRzIFRlbXBsYXRlU3ViVGFzaworeworCisgICAgLyoqCisgICAgICogQ2hlY2tzIG1hbnkgZmFjdG9ycyB0byBkZXRlcm1pbmUgaWYgdGhlIGNsYXNzIGlzIGluZGVlZCBhbiBBbnQgdGFzayBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenoKKyAgICAgKiBAcmV0dXJuCisgICAgICogQHRvZG8gICAgICAgICAgICAgICAgICAgICAgICBwZXJoYXBzIG1ha2UgZGVwcmVjYXRpb24gc3dpdGNoIGNvbmZpZ3VyYWJsZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0FudFRhc2soWENsYXNzIGNsYXp6KQorICAgIHsKKyAgICAgICAgaWYgKGNsYXp6LmlzQWJzdHJhY3QoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gaW5uZXIgY2xhc3NlcyAoZm9yIG5vdyAtIGJ1dCBpcyB0aGlzIHBvc3NpYmxlPyBkZXNpcmVkPykKKyAgICAgICAgaWYgKGNsYXp6LmlzSW5uZXIoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGlnbm9yZVZhbHVlID0gY2xhenouZ2V0RG9jKCkuZ2V0VGFnQXR0cmlidXRlVmFsdWUoImFudC50YXNrIiwgImlnbm9yZSIpOworICAgICAgICBib29sZWFuIGlnbm9yZSA9IFR5cGVDb252ZXJzaW9uVXRpbC5zdHJpbmdUb0Jvb2xlYW4oaWdub3JlVmFsdWUsIGZhbHNlKTsKKworICAgICAgICBpZiAoaWdub3JlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUYWdbXSB0YWdzID0gY2xhenoudGFncygpOworICAgICAgICAgKiBmb3IgKGludCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICogaWYgKCJAZGVwcmVjYXRlZCIuZXF1YWxzKHRhZ3NbaV0ubmFtZSgpKSkgeworICAgICAgICAgKiByZXR1cm4gZmFsc2U7CisgICAgICAgICAqIH0KKyAgICAgICAgICogfQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGhhc0V4ZWN1dGVNZXRob2QoY2xhenopKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBmb3IgY2xhc3MgaW1wbGVtZW50aW5nIGFuIGV4ZWN1dGUoKSBtZXRob2QuIFJlY3Vyc2l2ZSBjYWxscyBhcmUgbWFkZSB0byBzdXBlcmNsYXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenoKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNFeGVjdXRlTWV0aG9kKFhDbGFzcyBjbGF6eikKKyAgICB7CisgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBJdCBhaW4ndCBhIHRhc2sgaWYgd2UndmUgY2xpbWJlZCBiYWNrIHRvIFRhc2sgaXRzZWxmLgorICAgICAgICAvLyBBbHNvIGlnbm9yZSBvdGhlciBzcGVjaWFsIEFudCBjbGFzc2VzCisgICAgICAgIGlmICgib3JnLmFwYWNoZS50b29scy5hbnQuVGFzayIuZXF1YWxzKGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKSkgfHwKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQiLmVxdWFscyhjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCkpIHx8CisgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQuVGFza0FkYXB0ZXIiLmVxdWFscyhjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCkpIHx8CisgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQuVW5rbm93bkVsZW1lbnQiLmVxdWFscyhjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIHRoYXQgb25seSBydW50aW1lIGV4Y2VwdGlvbnMgYXJlIHRocm93bj8KKyAgICAgICAgQ29sbGVjdGlvbiBtZXRob2RzID0gY2xhenouZ2V0TWV0aG9kcyh0cnVlKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IG1ldGhvZHMuaXRlcmF0b3IoKTsKKworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFhNZXRob2QgbWV0aG9kID0gKFhNZXRob2QpIGl0ZXIubmV4dCgpOworCisgICAgICAgICAgICBpZiAoImV4ZWN1dGUiLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldFR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJ2b2lkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0UHJvY2VzcygpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBYSmF2YURvYyB4amQgPSBuZXcgWEphdmFEb2MoKTsKKyAgICAgICAgeGpkLnNldFVzZU5vZGVQYXJzZXIoZmFsc2UpOworICAgICAgICB4amQuZ2V0U291cmNlQ2xhc3NlcygpOworCisgICAgICAgIHN1cGVyLnN0YXJ0UHJvY2VzcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xhc3MgaXMgYW4gQW50IHRhc2suIFRoaXMgY2F1c2VzIHRoZSB0YXNrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgWERvY2xldCB0ZW1wbGF0ZSB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6CisgICAgICogQHJldHVybgorICAgICAqIEBleGNlcHRpb24gWERvY2xldEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNHZW5lcmF0aW9uUnVsZXMoWENsYXNzIGNsYXp6KSB0aHJvd3MgWERvY2xldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYm9vbGVhbiBtYXRjaCA9IGlzQW50VGFzayhjbGF6eik7CisKKyAgICAgICAgcmV0dXJuIG1hdGNoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L0luZGV4R2VuLmphdmEgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS9hbnQveGRvY2xldC9JbmRleEdlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YmFmMDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS9hbnQveGRvY2xldC9JbmRleEdlbi5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuYW50Lnhkb2NsZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFF1aWNrIGFuZCBkaXJ0eSBpbmRleC5odG1sIGdlbmVyYXRvciBmb3IgcHJvcG9zYWwveGRvY3MKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJbmRleEdlbiBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgRmlsZSByb290RGlyOworCisgICAgcHVibGljIHZvaWQgc2V0Um9vdERpcihGaWxlIHJvb3REaXIpIHsKKyAgICAgICAgdGhpcy5yb290RGlyID0gcm9vdERpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgVHJlZU1hcCBkYXRhID0gbmV3IFRyZWVNYXAoKTsKKworICAgICAgICBTdHJpbmdbXSBjYXRlZ29yaWVzID0gcm9vdERpci5saXN0KCk7CisKKyAgICAgICAgaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSb290IGRpcmVjdG9yeSBcIiIgKyByb290RGlyLmdldFBhdGgoKSArICJcIiBkb2VzIG5vdCBleGlzdCEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8aHRtbD48aGVhZD48dGl0bGU+eGRvY3MgaW5kZXg8L3RpdGxlPjwvaGVhZD4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8Ym9keT4iKTsKKworICAgICAgICBpbnQgY2F0Q291bnQgPSAwOworICAgICAgICBpbnQgdGFza0NvdW50ID0gMDsKKworICAgICAgICAvLyBncmFiIGFsbCBjYXRlZ29yaWVzIGFuZCB0YXNrcworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzW2ldOworICAgICAgICAgICAgRmlsZSBjYXREaXIgPSBuZXcgRmlsZShyb290RGlyLCBjYXRlZ29yeSk7CisKKyAgICAgICAgICAgIGlmICghY2F0RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nW10gdGFza3MgPSBjYXREaXIubGlzdCgpOworICAgICAgICAgICAgQXJyYXlzLnNvcnQodGFza3MpOworCisgICAgICAgICAgICBkYXRhLnB1dChjYXRlZ29yeSwgdGFza3MpOworICAgICAgICB9CisKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGRhdGEua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBjYXRDb3VudCsrOworICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPGgyPiIgKyBjYXRlZ29yeSArICI8L2gyPiIpOworCisgICAgICAgICAgICBzYi5hcHBlbmQoIjx1bD4iKTsKKworICAgICAgICAgICAgU3RyaW5nW10gdGFza3MgPSAoU3RyaW5nW10pIGRhdGEuZ2V0KGNhdGVnb3J5KTsKKworICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqIDwgdGFza3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICB0YXNrQ291bnQrKzsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFzayA9IHRhc2tzW2pdOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPGxpPiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPGEgaHJlZj1cIiIgKyBjYXRlZ29yeSArICIvIiArIHRhc2sgKyAiXCI+IiArIHRhc2sgKyAiPC9hPiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9saT4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3VsPiIpOworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCI8L2JvZHk+PC9odG1sPiIpOworCisgICAgICAgIEZpbGVXcml0ZXIgZncgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZncgPSBuZXcgRmlsZVdyaXRlcihuZXcgRmlsZShyb290RGlyLCJpbmRleC5odG1sIikpOworICAgICAgICAgICAgZncud3JpdGUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBmdy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICBsb2coIkluZGV4IGdlbmVyYXRlZDogIiArIGNhdENvdW50ICsgIiBjYXRlZ29yaWVzIGFuZCAiICsgdGFza0NvdW50ICsgIiB0YXNrcyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L1Rhc2tEZWZQcm9wZXJ0aWVzU3ViVGFzay5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvYW50L3hkb2NsZXQvVGFza0RlZlByb3BlcnRpZXNTdWJUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyYmYwNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L1Rhc2tEZWZQcm9wZXJ0aWVzU3ViVGFzay5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKyAvKgorICogQ29weXJpZ2h0ICAyMDAzLCAyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuYW50Lnhkb2NsZXQ7CisKK2ltcG9ydCB4ZG9jbGV0LlRlbXBsYXRlU3ViVGFzazsKKworLyoqCisgKiBHZW5lcmF0ZXMgQW50IHRhc2tkZWYgcHJvcGVydGllcyBmaWxlcywgc3VpdGFibGUgZm9yIGJ1bGsgZGVmaW5pbmcgdGFza3Mgd2l0aCBBbnQncyAmbHQ7dGFza2RlZiZndDsgdGFzay4KKyAqCisgKiBAY3JlYXRlZCAgICAgICBKYW51YXJ5IDUsIDIwMDMKKyAqIEBhbnQuZWxlbWVudCAgIGRpc3BsYXktbmFtZT0idGFza2RlZnByb3BlcnRpZXMiIG5hbWU9InRhc2tkZWZwcm9wZXJ0aWVzIgorICogICAgICBwYXJlbnQ9Im9yZy5hcGFjaGUuYW50Lnhkb2NsZXQuQW50RG9jbGV0VGFzayIKKyAqIEBhbnQudGFzayAgICAgIGlnbm9yZT0idHJ1ZSIKKyAqLworcHVibGljIGNsYXNzIFRhc2tEZWZQcm9wZXJ0aWVzU3ViVGFzayBleHRlbmRzIEFudFN1YlRhc2sKK3sKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUZBVUxUX1RFTVBMQVRFX0ZJTEUgPSAicmVzb3VyY2VzL3Rhc2tkZWZfcHJvcGVydGllcy54ZHQiOworCisgICAgcHVibGljIFRhc2tEZWZQcm9wZXJ0aWVzU3ViVGFzaygpCisgICAgeworICAgICAgICBzZXRUZW1wbGF0ZVVSTChnZXRDbGFzcygpLmdldFJlc291cmNlKERFRkFVTFRfVEVNUExBVEVfRklMRSkpOworICAgICAgICBzZXREZXN0aW5hdGlvbkZpbGUoInRhc2tkZWYucHJvcGVydGllcyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L1Rhc2tEZXNjcmlwdG9yU3ViVGFzay5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvYW50L3hkb2NsZXQvVGFza0Rlc2NyaXB0b3JTdWJUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5YTZmOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L1Rhc2tEZXNjcmlwdG9yU3ViVGFzay5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKyAvKgorICAqIENvcHlyaWdodCAgMjAwMywgMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAgKgorICAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgKgorICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICoKKyAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgKgorICAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuYW50Lnhkb2NsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCB4ZG9jbGV0LlhEb2NsZXRFeGNlcHRpb247CitpbXBvcnQgeGphdmFkb2MuWENsYXNzOworCisvKioKKyAqIEdlbmVyYXRlcyBBbnQgdGFzayBkZXNjcmlwdG9ycy4KKyAqCisgKiBAY3JlYXRlZCAgICAgICAgICAgICAgSmFudWFyeSAxLCAyMDAzCisgKiBAYW50LmVsZW1lbnQgICAgICAgICAgZGlzcGxheS1uYW1lPSJ0YXNrZGVzY3JpcHRvciIgbmFtZT0idGFza2Rlc2NyaXB0b3IiCisgKiAgICAgIHBhcmVudD0ieGRvY2xldC5tb2R1bGVzLmFwYWNoZS5hbnQub3JnLmFwYWNoZS5hbnQueGRvY2xldC5BbnREb2NsZXRUYXNrIgorICogQGFudC50YXNrICAgICAgICAgICAgIGlnbm9yZT0idHJ1ZSIKKyAqIEB4ZG9jbGV0Lm1lcmdlLWZpbGUgICBmaWxlPSJ7MH0ueG1sIiByZWxhdGVzLXRvPSJ7MH0ueG1sIiBkZXNjcmlwdGlvbj0iVXNlZCBmb3IgY29kZSBleGFtcGxlcy4gQW4gZXhhbXBsZSBtZXJnZSBmaWxlCisgKiAgICAgIG1heSBiZSBmb3VuZCBpbiBBbnQncyBwcm9wb3NhbC94ZG9jcy9zcmMgZGlyZWN0b3J5LiIKKyAqLworcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yU3ViVGFzayBleHRlbmRzIEFudFN1YlRhc2sKK3sKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUZBVUxUX1RFTVBMQVRFX0ZJTEUgPSAicmVzb3VyY2VzL3Rhc2tfeG1sLnhkdCI7CisKKyAgICBwdWJsaWMgVGFza0Rlc2NyaXB0b3JTdWJUYXNrKCkKKyAgICB7CisgICAgICAgIHNldFRlbXBsYXRlVVJMKGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoREVGQVVMVF9URU1QTEFURV9GSUxFKSk7CisgICAgICAgIHNldERlc3RpbmF0aW9uRmlsZSgiezB9LnhtbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSBmaWxlIG5hbWluZy4gVXNlIHRoZSB0YXNrIG5hbWUgZm9yIHRoZSBmaWxlIG5hbWUgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6egorICAgICAqIEByZXR1cm4KKyAgICAgKiBAZXhjZXB0aW9uIFhEb2NsZXRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEdlbmVyYXRlZEZpbGVOYW1lKFhDbGFzcyBjbGF6eikgdGhyb3dzIFhEb2NsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBkaXIgPSBUYXNrVGFnc0hhbmRsZXIuZ2V0Q2F0ZWdvcnlOYW1lKGNsYXp6KTsKKyAgICAgICAgU3RyaW5nIHRhc2tOYW1lID0gVGFza1RhZ3NIYW5kbGVyLmdldFRhc2tOYW1lKGNsYXp6KTsKKworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGlyLCB0YXNrTmFtZSArICIueG1sIikudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L1Rhc2tUYWdzSGFuZGxlci5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvYW50L3hkb2NsZXQvVGFza1RhZ3NIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiZmY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L1Rhc2tUYWdzSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsODU1IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuYW50Lnhkb2NsZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5JbnRyb3NwZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgeGphdmFkb2MuWENsYXNzOworaW1wb3J0IHhqYXZhZG9jLlhNZXRob2Q7CitpbXBvcnQgeGphdmFkb2MuWFBhcmFtZXRlcjsKK2ltcG9ydCB4amF2YWRvYy5YVGFnOworaW1wb3J0IHhkb2NsZXQuWERvY2xldEV4Y2VwdGlvbjsKK2ltcG9ydCB4ZG9jbGV0LlhEb2NsZXRUYWdTdXBwb3J0OworaW1wb3J0IHhkb2NsZXQudGFnc2hhbmRsZXIuQWJzdHJhY3RQcm9ncmFtRWxlbWVudFRhZ3NIYW5kbGVyOworaW1wb3J0IHhkb2NsZXQudGFnc2hhbmRsZXIuTWV0aG9kVGFnc0hhbmRsZXI7CisKKy8qKgorICogQ3VzdG9tIHRhZyBoYW5kbGVyIGZvciBYRG9jbGV0IHRlbXBsYXRlcyBmb3IgQW50LXNwZWNpZmljIHByb2Nlc3NpbmcuCisgKgorICogQGNyZWF0ZWQgICAgICAgICAgICAgIEphbnVhcnkgMSwgMjAwMworICogQHhkb2NsZXQudGFnaGFuZGxlciAgIG5hbWVzcGFjZT0iQW50IgorICogQHRvZG8gICAgICAgICAgICAgICAgIGNsZWFuIHVwIGxvZ2ljIHNvIHRoYXQgYWxsIHNldHRlcnMgYXJlIGdhdGhlcmVkIGZpcnN0IChldmVuIHN1cGVyY2xhc3MpIGFuZCBzb3J0ZWQgYWxvbmcgd2loCisgKiAgICAgIHRoZW0KKyAqIEB0b2RvICAgICAgICAgICAgICAgICBuZWVkIHRvIGNyZWF0ZSBiZXR0ZXIgbG9naWMgZm9yIGZpbmRpbmcgcHJvcGVyIHNldHRlcnMKKyAqIEB0b2RvICAgICAgICAgICAgICAgICBhZGQgaWZJc0FudFRhc2ssIGFtb25nIG90aGVyIGNvbnZlbmllbmNlIHRhZ3MKKyAqLworcHVibGljIGNsYXNzIFRhc2tUYWdzSGFuZGxlciBleHRlbmRzIFhEb2NsZXRUYWdTdXBwb3J0Cit7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNhdGVnb3J5IGZvciB0YXNrcyB3aXRob3V0IGEgY2F0ZWdvcnkgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQ0FURUdPUlkgPSAib3RoZXIiOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCByZXF1aXJlbWVudCBncm91cCBmb3IgYXR0cmlidXRlcyB3aXRob3V0IGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfR1JPVVAgPSAib3B0aW9uYWwiOworCisgICAgLyoqCisgICAgICogUmVxdWlyZW1lbnQgZ3JvdXAgZGVzY3JpcHRpb24gZm9yIG9wdGlvbmFsIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ19PUFRJT05BTCA9ICJvcHRpb25hbCI7CisKKyAgICAvKioKKyAgICAgKiBSZXF1aXJlbWVudCBncm91cCBkZXNjcmlwdGlvbiBmb3IgcmVxdWlyZWQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERVNDX1JFUVVJUkVEID0gInJlcXVpcmVkIjsKKworICAgIHByaXZhdGUgc3RhdGljIE1hcCBhdHRyaWJ1dGVEaXNwbGF5TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBNYXAgZWxlbWVudERpc3BsYXlNYXAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmx1ZmZQcmVmaXhlcyA9IHsic2V0IGEiLCAic2V0IHRoZSIsICJzZXRzIGEiLCAic2V0cyB0aGUifTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGF0dHJpYnV0ZURpc3BsYXlNYXAucHV0KCJqYXZhLmxhbmcuU3RyaW5nIiwgIlN0cmluZyIpOworICAgICAgICBhdHRyaWJ1dGVEaXNwbGF5TWFwLnB1dCgiYm9vbGVhbiIsICJib29sZWFuIik7CisgICAgICAgIGF0dHJpYnV0ZURpc3BsYXlNYXAucHV0KCJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIiwgIlBhdGgiKTsKKyAgICAgICAgYXR0cmlidXRlRGlzcGxheU1hcC5wdXQoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIsICJSZWZlcmVuY2UiKTsKKyAgICAgICAgYXR0cmlidXRlRGlzcGxheU1hcC5wdXQoImphdmEuaW8uRmlsZSIsICJGaWxlIik7CisgICAgICAgIGF0dHJpYnV0ZURpc3BsYXlNYXAucHV0KCJqYXZhLnV0aWwuRGF0ZSIsICJEYXRlIik7CisgICAgICAgIGF0dHJpYnV0ZURpc3BsYXlNYXAucHV0KCJqYXZhLm5ldC5VUkwiLCAiVVJMIik7CisgICAgICAgIGF0dHJpYnV0ZURpc3BsYXlNYXAucHV0KCJqYXZhLmxhbmcuTG9uZyIsICJsb25nIik7CisgICAgICAgIGF0dHJpYnV0ZURpc3BsYXlNYXAucHV0KCJqYXZhLmxhbmcuSW50ZWdlciIsICJpbnQiKTsKKyAgICAgICAgYXR0cmlidXRlRGlzcGxheU1hcC5wdXQoImphdmEubGFuZy5GbG9hdCIsICJmbG9hdCIpOworICAgICAgICBhdHRyaWJ1dGVEaXNwbGF5TWFwLnB1dCgiamF2YS5sYW5nLkRvdWJsZSIsICJkb3VibGUiKTsKKworICAgICAgICBlbGVtZW50RGlzcGxheU1hcC5wdXQoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiLCAiUGF0aCIpOworICAgICAgICBlbGVtZW50RGlzcGxheU1hcC5wdXQoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiLCAiRmlsZXNldCIpOworICAgICAgICBlbGVtZW50RGlzcGxheU1hcC5wdXQoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlByb3BlcnR5IiwgInNlZSAmbHQ7cHJvcGVydHkmZ3Q7Iik7CisgICAgICAgIGVsZW1lbnREaXNwbGF5TWFwLnB1dCgib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyIiwgIk1hcHBlciIpOworICAgICAgICBlbGVtZW50RGlzcGxheU1hcC5wdXQoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQiLCAiUGF0dGVybnNldCIpOworICAgICAgICBlbGVtZW50RGlzcGxheU1hcC5wdXQoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVMaXN0IiwgIkZpbGVsaXN0Iik7CisgICAgICAgIGVsZW1lbnREaXNwbGF5TWFwLnB1dCgib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyQ2hhaW4iLCAiRmlsdGVyQ2hhaW4iKTsKKyAgICAgICAgZWxlbWVudERpc3BsYXlNYXAucHV0KCJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJTZXQiLCAiRmlsdGVyc2V0Iik7CisgICAgICAgIGVsZW1lbnREaXNwbGF5TWFwLnB1dCgib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldCIsICJaaXBGaWxlc2V0Iik7CisgICAgICAgIGVsZW1lbnREaXNwbGF5TWFwLnB1dCgib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGlyU2V0IiwgIkRpcnNldCIpOworICAgICAgICBlbGVtZW50RGlzcGxheU1hcC5wdXQoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2ciLCAiWE1MQ2F0YWxvZyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIHRoZSBBbnQgdGFzayBuYW1lLiBPcmRlciBvZiBydWxlczoKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6egorICAgICAqIEByZXR1cm4gIExvd2VyY2FzZWQgY2xhc3NuYW1lIHdpdGggIlRhc2siIHN1ZmZpeCByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgZ2V0VGFza05hbWUoWENsYXNzIGNsYXp6KQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRhZ1ZhbHVlID0gY2xhenouZ2V0RG9jKCkuZ2V0VGFnQXR0cmlidXRlVmFsdWUoImFudC50YXNrIiwgIm5hbWUiKTsKKworICAgICAgICBpZiAodGFnVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdXNlIGNsYXNzbmFtZSwgYnV0IHN0cmlwICJUYXNrIiBzdWZmaXggaWYgdGhlcmUKKyAgICAgICAgICAgIHRhZ1ZhbHVlID0gY2xhenouZ2V0TmFtZSgpOworCisgICAgICAgICAgICBpZiAodGFnVmFsdWUuZW5kc1dpdGgoIlRhc2siKSkgeworICAgICAgICAgICAgICAgIHRhZ1ZhbHVlID0gdGFnVmFsdWUuc3Vic3RyaW5nKDAsIHRhZ1ZhbHVlLmluZGV4T2YoIlRhc2siKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRhZ1ZhbHVlID0gdGFnVmFsdWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGFnVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgdGhlIEFudCBjYXRlZ29yeSBuYW1lIGFzIHRoZSBWYWx1ZSBvZiB0aGUgY2F0ZWdvcnkgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6CisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGdldENhdGVnb3J5TmFtZShYQ2xhc3MgY2xhenopCisgICAgeworICAgICAgICBTdHJpbmcgdGFnVmFsdWUgPSBjbGF6ei5nZXREb2MoKS5nZXRUYWdBdHRyaWJ1dGVWYWx1ZSgiYW50LnRhc2siLCAiY2F0ZWdvcnkiKTsKKworICAgICAgICBpZiAodGFnVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGFnVmFsdWUgPSB0YWdWYWx1ZS50b0xvd2VyQ2FzZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGFnVmFsdWUgPSBERUZBVUxUX0NBVEVHT1JZOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0YWdWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBvdmVyIGFsbCBBbnQgdGFza3MKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZQorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBYRG9jbGV0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZm9yQWxsVGFza3MoU3RyaW5nIHRlbXBsYXRlLCBQcm9wZXJ0aWVzIGF0dHJpYnV0ZXMpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2xsZWN0aW9uIGNsYXNzZXMgPSBBYnN0cmFjdFByb2dyYW1FbGVtZW50VGFnc0hhbmRsZXIuZ2V0QWxsQ2xhc3NlcygpOworICAgICAgICBYQ2xhc3MgY3VyX2NsYXNzID0gbnVsbDsKKworICAgICAgICBJdGVyYXRvciBpdGVyID0gY2xhc3Nlcy5pdGVyYXRvcigpOworCisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgY3VyX2NsYXNzID0gKFhDbGFzcykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBzZXRDdXJyZW50Q2xhc3MoY3VyX2NsYXNzKTsKKworICAgICAgICAgICAgaWYgKEFudFN1YlRhc2suaXNBbnRUYXNrKGN1cl9jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZSh0ZW1wbGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBvdmVyIGFsbCBBbnQgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSAgICAgICAgICAgICAgWERvY2xldCB0ZW1wbGF0ZQorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzICAgICAgICAgICAgVGFnIHBhcmFtZXRlcnMKKyAgICAgKiBAZXhjZXB0aW9uIFhEb2NsZXRFeGNlcHRpb24gIE9vcHMhCisgICAgICovCisgICAgcHVibGljIHZvaWQgZm9yQWxsQXR0cmlidXRlc0luR3JvdXAoU3RyaW5nIHRlbXBsYXRlLCBQcm9wZXJ0aWVzIGF0dHJpYnV0ZXMpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyB0aHJvdyBleGNlcHRpb24gaWYgbm90IGFuIEFudCB0YXNrCisKKyAgICAgICAgWENsYXNzIGN1cl9jbGFzcyA9IGdldEN1cnJlbnRDbGFzcygpOworCisgICAgICAgIFhNZXRob2RbXSBtZXRob2RzID0gZ2V0QXR0cmlidXRlTWV0aG9kcyhjdXJfY2xhc3MpOworCisgICAgICAgIFN0cmluZyBncm91cCA9IGF0dHJpYnV0ZXMuZ2V0UHJvcGVydHkoImdyb3VwIiwgREVGQVVMVF9HUk9VUCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtZXRob2RzW2ldLmdldERvYygpLmdldFRhZ0F0dHJpYnV0ZVZhbHVlKCJhbnQuYXR0cmlidXRlIiwgImdyb3VwIik7CisKKyAgICAgICAgICAgIGlmICgodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoZ3JvdXApKSB8fCAodmFsdWUgPT0gbnVsbCAmJiBncm91cC5lcXVhbHMoREVGQVVMVF9HUk9VUCkpKSB7CisgICAgICAgICAgICAgICAgc2V0Q3VycmVudE1ldGhvZChtZXRob2RzW2ldKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZSh0ZW1wbGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIEFudCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVtcGxhdGUgICAgICAgICAgICAgIFhEb2NsZXQgdGVtcGxhdGUKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyAgICAgICAgICAgIFRhZyBwYXJhbWV0ZXJzCisgICAgICogQGV4Y2VwdGlvbiBYRG9jbGV0RXhjZXB0aW9uICBPb3BzIQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGlmSGFzQXR0cmlidXRlcyhTdHJpbmcgdGVtcGxhdGUsIFByb3BlcnRpZXMgYXR0cmlidXRlcykgdGhyb3dzIFhEb2NsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiBub3QgYW4gQW50IHRhc2sKKworICAgICAgICBYQ2xhc3MgY3VyX2NsYXNzID0gZ2V0Q3VycmVudENsYXNzKCk7CisKKyAgICAgICAgWE1ldGhvZFtdIG1ldGhvZHMgPSBnZXRBdHRyaWJ1dGVNZXRob2RzKGN1cl9jbGFzcyk7CisKKyAgICAgICAgaWYgKG1ldGhvZHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZ2VuZXJhdGUodGVtcGxhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciBhbGwgQW50IG5lc3RlZCBlbGVtZW50IG1ldGhvZHMgKGFkZFhYWCwgYWRkQ29uZmlndXJlZFhYWCwgYWRkWFhYKQorICAgICAqCisgICAgICogQHBhcmFtIHRlbXBsYXRlICAgICAgICAgICAgICBYRG9jbGV0IHRlbXBsYXRlCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgICAgICAgICAgICBUYWcgcGFyYW1ldGVycworICAgICAqIEBleGNlcHRpb24gWERvY2xldEV4Y2VwdGlvbiAgT29wcyEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmb3JBbGxFbGVtZW50cyhTdHJpbmcgdGVtcGxhdGUsIFByb3BlcnRpZXMgYXR0cmlidXRlcykgdGhyb3dzIFhEb2NsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiBub3QgYW4gQW50IHRhc2sKKworICAgICAgICBYQ2xhc3MgY3VyX2NsYXNzID0gZ2V0Q3VycmVudENsYXNzKCk7CisKKyAgICAgICAgWE1ldGhvZFtdIG1ldGhvZHMgPSBnZXRFbGVtZW50TWV0aG9kcyhjdXJfY2xhc3MpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2V0Q3VycmVudE1ldGhvZChtZXRob2RzW2ldKTsKKyAgICAgICAgICAgIGdlbmVyYXRlKHRlbXBsYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIG92ZXIgYWxsIGFudC5hdHRyaWJ1dGUuZ3JvdXAgdGFncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSAgICAgICAgICAgWERvY2xldCB0ZW1wbGF0ZQorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzICAgICAgICAgVGFnIHBhcmFtZXRlcnMKKyAgICAgKiBAdGhyb3dzIFhEb2NsZXRFeGNlcHRpb24gIE9vcHMhCisgICAgICovCisgICAgcHVibGljIHZvaWQgZm9yQWxsQXR0cmlidXRlR3JvdXBzKFN0cmluZyB0ZW1wbGF0ZSwgUHJvcGVydGllcyBhdHRyaWJ1dGVzKSB0aHJvd3MgWERvY2xldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29sbGVjdGlvbiB0YWdzID0gZ2V0Q3VycmVudENsYXNzKCkuZ2V0RG9jKCkuZ2V0VGFncygiYW50LmF0dHJpYnV0ZS5ncm91cCIpOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgdCA9IHRhZ3MuaXRlcmF0b3IoKTsgdC5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgc2V0Q3VycmVudENsYXNzVGFnKChYVGFnKSB0Lm5leHQoKSk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlKHRlbXBsYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIHRoZSBuYW1lIG9mIGEgcmVxdWlyZW1lbnQgZ3JvdXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZ3JvdXAsIG9yICdvcHRpb25hbCcgaWYgbm90IGlzIGRlZmluZWQKKyAgICAgKiBAdGhyb3dzIFhEb2NsZXRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGF0dHJpYnV0ZUdyb3VwTmFtZSgpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBYVGFnIHRhZyA9IGdldEN1cnJlbnRDbGFzc1RhZygpOworICAgICAgICBTdHJpbmcgbmFtZSA9IHRhZy5nZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOworCisgICAgICAgIHJldHVybiBuYW1lICE9IG51bGwgPyBuYW1lIDogREVGQVVMVF9HUk9VUDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyB0aGUgZGVzY3JpcHRpb24gZm9yIGEgcmVxdWlyZW1lbnQgZ3JvdXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZ3JvdXAsIG9yICdPcHRpb25hbCcgaWYgbm90IGlzIGRlZmluZWQKKyAgICAgKiBAdGhyb3dzIFhEb2NsZXRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGF0dHJpYnV0ZUdyb3VwRGVzYygpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBYVGFnIHRhZyA9IGdldEN1cnJlbnRDbGFzc1RhZygpOworICAgICAgICBTdHJpbmcgZGVzYyA9IHRhZy5nZXRBdHRyaWJ1dGVWYWx1ZSgiZGVzY3JpcHRpb24iKTsKKworICAgICAgICByZXR1cm4gZGVzYyAhPSBudWxsID8gZGVzYyA6IERFU0NfT1BUSU9OQUw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgdGhlIGVsZW1lbnQgbmFtZSBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogQGV4Y2VwdGlvbiBYRG9jbGV0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbGVtZW50TmFtZSgpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGdldEN1cnJlbnRNZXRob2QoKS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9ICI8bm90IGEgdmFsaWQgZWxlbWVudD4iOworCisgICAgICAgIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImFkZENvbmZpZ3VyZWQiKSkgeworICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBtZXRob2ROYW1lLnN1YnN0cmluZygxMywgbWV0aG9kTmFtZS5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCJhZGQiKSkgeworICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBtZXRob2ROYW1lLnN1YnN0cmluZygzLCBtZXRob2ROYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImNyZWF0ZSIpKSB7CisgICAgICAgICAgICBlbGVtZW50TmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKDYsIG1ldGhvZE5hbWUubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbGVtZW50TmFtZS50b0xvd2VyQ2FzZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZGlzcGxheUF0dHJpYnV0ZVR5cGUoKSB0aHJvd3MgWERvY2xldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29sbGVjdGlvbiBwYXJhbWV0ZXJzID0gZ2V0Q3VycmVudE1ldGhvZCgpLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgWFBhcmFtZXRlciBwYXJhbSA9IChYUGFyYW1ldGVyKSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIFN0cmluZyBtZXRob2RUeXBlID0gcGFyYW0uZ2V0VHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGRpc3BsYXkgPSAoU3RyaW5nKSBhdHRyaWJ1dGVEaXNwbGF5TWFwLmdldChtZXRob2RUeXBlKTsKKworICAgICAgICBpZiAoZGlzcGxheSA9PSBudWxsKSB7CisKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0eXBlID0gIiArIG1ldGhvZFR5cGUpOworCisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGdldEF0dHJpYnV0ZUNsYXNzKG1ldGhvZFR5cGUpOworCisgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RUeXBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwgJiYgaW5zdGFuY2UgaW5zdGFuY2VvZiBFbnVtZXJhdGVkQXR0cmlidXRlKSB7CisgICAgICAgICAgICAgICAgRW51bWVyYXRlZEF0dHJpYnV0ZSBlbnVtMSA9IChFbnVtZXJhdGVkQXR0cmlidXRlKSBpbnN0YW5jZTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBlbnVtMS5nZXRWYWx1ZXMoKTsKKworICAgICAgICAgICAgICAgIGRpc3BsYXkgPSAiIjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ICs9ICImcXVvdDsiICsgdmFsdWVzW2ldICsgIiZxdW90OyI7CisgICAgICAgICAgICAgICAgICAgIGlmIChpICE9ICh2YWx1ZXMubGVuZ3RoIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgKz0gIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzcGxheTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGlzcGxheSA9ICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkaXNwbGF5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZGlzcGxheUVsZW1lbnRUeXBlKCkgdGhyb3dzIFhEb2NsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlKCk7CisgICAgICAgIFN0cmluZyBkaXNwbGF5ID0gKFN0cmluZykgZWxlbWVudERpc3BsYXlNYXAuZ2V0KGVsZW1lbnRUeXBlKTsKKworICAgICAgICBpZiAoZGlzcGxheSA9PSBudWxsKSB7CisgICAgICAgICAgICBkaXNwbGF5ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpc3BsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgdGhlIGVsZW1lbnQgdHlwZSBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogQGV4Y2VwdGlvbiBYRG9jbGV0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbGVtZW50VHlwZSgpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBYQ2xhc3MgY2xhenogPSBlbGVtZW50Q2xhc3NEb2MoKTsKKworICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhEb2NsZXRFeGNlcHRpb24oIk1ldGhvZCBpcyBub3QgYW4gQW50IGVsZW1lbnQhIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyB0aGUgQW50IHRhc2sgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiBAZXhjZXB0aW9uIFhEb2NsZXRFeGNlcHRpb24KKyAgICAgKiBAc2VlICAgICAgICAgICAgICAgICAgICAgICAgICNnZXRUYXNrTmFtZSh4amF2YWRvYy5YQ2xhc3MpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0YXNrTmFtZSgpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZ2V0VGFza05hbWUoZ2V0Q3VycmVudENsYXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcHJvcGVydHlOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNZXRob2RUYWdzSGFuZGxlci5nZXRQcm9wZXJ0eU5hbWVGb3IoZ2V0Q3VycmVudE1ldGhvZCgpKS50b0xvd2VyQ2FzZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgc2hvcnRNZXRob2REZXNjcmlwdGlvbigpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgZGVzYyA9IGdldEN1cnJlbnRNZXRob2QoKS5nZXREb2MoKS5nZXRGaXJzdFNlbnRlbmNlKCk7CisKKyAgICAgICAgaWYgKGRlc2MgPT0gbnVsbCB8fCBkZXNjLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGRlc2MgPSAibm8gZGVzY3JpcHRpb24iOworICAgICAgICB9CisKKyAgICAgICAgZGVzYyA9IGRlc2MudHJpbSgpOworCisgICAgICAgIFN0cmluZyBkZXNjTG93ZXIgPSBkZXNjLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbHVmZlByZWZpeGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZmx1ZmZQcmVmaXhlc1tpXS50b0xvd2VyQ2FzZSgpICsgIiAiOworCisgICAgICAgICAgICBpZiAoZGVzY0xvd2VyLnN0YXJ0c1dpdGgocHJlZml4KSkgeworICAgICAgICAgICAgICAgIGRlc2MgPSBkZXNjLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGVzYyA9IGRlc2Muc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBkZXNjLnN1YnN0cmluZygxKTsKKworICAgICAgICBpZiAoIWRlc2MuZW5kc1dpdGgoIi4iKSkgeworICAgICAgICAgICAgZGVzYyArPSAiLiI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyB0aGUgQW50IGNhdGVnb3J5IG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogQGV4Y2VwdGlvbiBYRG9jbGV0RXhjZXB0aW9uCisgICAgICogQHNlZSAgICAgICAgICAgICAgICAgICAgICAgICAjZ2V0Q2F0ZWdvcnlOYW1lKHhqYXZhZG9jLlhDbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNhdGVnb3J5TmFtZSgpIHRocm93cyBYRG9jbGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q2F0ZWdvcnlOYW1lKGdldEN1cnJlbnRDbGFzcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyB0aGUgcmVxdWlybWVudCBncm91cCBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgIFRoZSBncm91cCBsaXN0ZWQgaW4gdGhlIHNvdXJjZSwgb3IgJ29wdGlvbmFsJyBvZiBub25lIGlzIGxpc3RlZAorICAgICAqIEB0aHJvd3MgWERvY2xldEV4Y2VwdGlvbiAgb29wcworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYXR0cmlidXRlR3JvdXAoKSB0aHJvd3MgWERvY2xldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0Q3VycmVudE1ldGhvZCgpLmdldERvYygpLmdldFRhZ0F0dHJpYnV0ZVZhbHVlKCJhbnQuYXR0cmlidXRlIiwgImdyb3VwIik7CisKKyAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IERFRkFVTFRfR1JPVVA7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGFzcyBnZXRBdHRyaWJ1dGVDbGFzcyhTdHJpbmcgdHlwZSkgdGhyb3dzIFhEb2NsZXRFeGNlcHRpb24KKyAgICB7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0eXBlID0gIiArIHR5cGUpOworCisgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKHR5cGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGludCBsYXN0RG90UG9zaXRpb24gPSB0eXBlLmxhc3RJbmRleE9mKCcuJyk7CisKKyAgICAgICAgICAgIGlmIChsYXN0RG90UG9zaXRpb24gPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgYSBwcmltaXRpdmUKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCBsYXN0RG90UG9zaXRpb24pICsgIiQiICsgdHlwZS5zdWJzdHJpbmcobGFzdERvdFBvc2l0aW9uICsgMSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSh0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhEb2NsZXRFeGNlcHRpb24oZTEuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xheno7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY3VyX2NsYXNzCisgICAgICogQHJldHVybgorICAgICAqIEBleGNlcHRpb24gWERvY2xldEV4Y2VwdGlvbgorICAgICAqIEB0b2RvICAgICAgICAgICAgICAgICAgICAgICAgcmVmYWN0b3IgdG8gY2FjaGUgbWV0aG9kcyBwZXIgY2xhc3MsIGFuZCBzYXZlIHNvbWUgdGltZQorICAgICAqLworICAgIHByaXZhdGUgWE1ldGhvZFtdIGdldEF0dHJpYnV0ZU1ldGhvZHMoWENsYXNzIGN1cl9jbGFzcykgdGhyb3dzIFhEb2NsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIFVzZSBBbnQncyBvd24gaW50cm9zcGVjdGlvbiBtZWNoYW5pc20gdG8gZ2F0aGVyIHRoZQorICAgICAgICAvLyBhdHRyaWJ1dGVzIHRoaXMgY2xhc3Mgc3VwcG9ydHMKKyAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoQ2xhc3MuZm9yTmFtZShjdXJfY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhEb2NsZXRFeGNlcHRpb24oZSwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVncm91cCB0aGUgYXR0cmlidXRlcywgc2luY2UgSW50cm9zcGVjdGlvbkhlbHBlcgorICAgICAgICAvLyBkb2Vzbid0IGdpdmUgdXMgdGhlIHdob2xlIGRhdGEgc3RydWN0dXJlIGRpcmVjdGx5CisgICAgICAgIEVudW1lcmF0aW9uIGVudW0yID0gaXMuZ2V0QXR0cmlidXRlcygpOworICAgICAgICBQcm9wZXJ0aWVzIGF0dHJpYnV0ZVR5cGVNYXAgPSBuZXcgUHJvcGVydGllcygpOworCisgICAgICAgIHdoaWxlIChlbnVtMi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnVtMi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IGlzLmdldEF0dHJpYnV0ZVR5cGUobmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGVNYXAuc2V0UHJvcGVydHkobmFtZSwgdHlwZS5nZXROYW1lKCkpOworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICIgPSAiICsgdHlwZS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byByZXR1cm4gWE1ldGhvZFtdIGZyb20gdGhpcyBtZXRob2QKKyAgICAgICAgLy8gc28gZ2V0IGFsbCBtZXRob2RzIGZyb20gdGhlIGN1cnJlbnQgY2xhc3MKKyAgICAgICAgWE1ldGhvZFtdIGFsbE1ldGhvZHMgPSBnZXRNZXRob2RzKGN1cl9jbGFzcyk7CisKKy8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFsbE1ldGhvZHMgPSAiICsgYWxsTWV0aG9kcy5sZW5ndGgpOworCisgICAgICAgIC8vIEFuZCBub3cgZmlsdGVyIHRoZSBtZXRob2RzIGJhc2VkCisgICAgICAgIC8vIG9uIHdoYXQgSW50cm9zcGVjdGlvbkhlbHBlciBzYXlzCisgICAgICAgIExpc3QgYXR0cmlidXRlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFhNZXRob2QgbWV0aG9kID0gYWxsTWV0aG9kc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKKworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1ldGhvZE5hbWUgPSAiICsgbWV0aG9kTmFtZSk7CisKKyAgICAgICAgICAgIGlmICghbWV0aG9kTmFtZS5zdGFydHNXaXRoKCJzZXQiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKDMpLnRvTG93ZXJDYXNlKCk7CisKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhdHRyaWJ1dGVOYW1lID0gIiArIGF0dHJpYnV0ZU5hbWUpOworCisgICAgICAgICAgICBpZiAoKG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpICE9IDEpIHx8ICghbWV0aG9kLmlzUHVibGljKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSAoKFhQYXJhbWV0ZXIpIGl0Lm5leHQoKSkuZ2V0VHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKTsKKworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImF0dHJpYnV0ZVR5cGUgPSAiICsgYXR0cmlidXRlVHlwZSk7CisKKyAgICAgICAgICAgIFN0cmluZyBtYXBBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVUeXBlTWFwLmdldFByb3BlcnR5KGF0dHJpYnV0ZU5hbWUpOworCisgICAgICAgICAgICBpZiAobWFwQXR0cmlidXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaW5uZXIgY2xhc3NlcyBhcmUgbm90ZWQgd2l0aCAkIGluIG91ciBtYXAsIGJ1dCBub3QKKyAgICAgICAgICAgIC8vIG4gdGhlIHBhcmFtZXRlciB0eXBlIG5hbWUuCisgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZVR5cGUuZXF1YWxzKG1hcEF0dHJpYnV0ZS5yZXBsYWNlKCckJywgJy4nKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWV0aG9kTmFtZSArICIgOiAiICsgYXR0cmlidXRlTmFtZSArICIgOiAiICsgYXR0cmlidXRlVHlwZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZU1ldGhvZHMuYWRkKG1ldGhvZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKFhNZXRob2RbXSkgYXR0cmlidXRlTWV0aG9kcy50b0FycmF5KG5ldyBYTWV0aG9kW2F0dHJpYnV0ZU1ldGhvZHMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGN1cl9jbGFzcworICAgICAqIEByZXR1cm4KKyAgICAgKiBAZXhjZXB0aW9uIFhEb2NsZXRFeGNlcHRpb24KKyAgICAgKiBAdG9kbyAgICAgICAgICAgICAgICAgICAgICAgIGFkZCBjaGVja3MgZm9yIG51bWJlciBwYXJhbWV0ZXJzIGFuZCBhcHByb3ByaWF0ZSByZXR1cm4gdmFsdWUgY2hlY2sgZm9yIHByb3BlcgorICAgICAqICAgICAgZXhjZXB0aW9uIHRvbz8gbWV0aG9kIHByZWZpeGVzOiBhZGQsIGNyZWF0ZSwgYWRkQ29uZmlndXJlZCAoYnV0IG5vdCBhZGRUZXh0KQorICAgICAqIEB0b2RvICAgICAgICAgICAgICAgICAgICAgICAgYWRkIER5bmFtaWNDb25maWd1cmF0b3IgKHRoaXMgc2hvdWxkIGJlIG5vdGVkIGluIHRoZSB0ZW1wbGF0ZSwgbm90IGRlYWx0IHdpdGggaGVyZSkKKyAgICAgKi8KKyAgICBwcml2YXRlIFhNZXRob2RbXSBnZXRFbGVtZW50TWV0aG9kcyhYQ2xhc3MgY3VyX2NsYXNzKSB0aHJvd3MgWERvY2xldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gVXNlIEFudCdzIG93biBpbnRyb3NwZWN0aW9uIG1lY2hhbmlzbSB0byBnYXRoZXIgdGhlCisgICAgICAgIC8vIGVsZW1lbnRzIHRoaXMgY2xhc3Mgc3VwcG9ydHMKKyAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoQ2xhc3MuZm9yTmFtZShjdXJfY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhEb2NsZXRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVncm91cCB0aGUgZWxlbWVudHMsIHNpbmNlIEludHJvc3BlY3Rpb25IZWxwZXIKKyAgICAgICAgLy8gZG9lc24ndCBnaXZlIHVzIHRoZSB3aG9sZSBkYXRhIHN0cnVjdHVyZSBkaXJlY3RseQorICAgICAgICBFbnVtZXJhdGlvbiBlbnVtMyA9IGlzLmdldE5lc3RlZEVsZW1lbnRzKCk7CisgICAgICAgIFByb3BlcnRpZXMgZWxlbWVudFR5cGVNYXAgPSBuZXcgUHJvcGVydGllcygpOworCisgICAgICAgIHdoaWxlIChlbnVtMy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnVtMy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IGlzLmdldEVsZW1lbnRUeXBlKG5hbWUpOworCisgICAgICAgICAgICBlbGVtZW50VHlwZU1hcC5zZXRQcm9wZXJ0eShuYW1lLCB0eXBlLmdldE5hbWUoKSk7CisvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIiA9ICIgKyB0eXBlLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBuZWVkIHRvIHJldHVybiBNZXRob2REb2NbXSBmcm9tIHRoaXMgbWV0aG9kCisgICAgICAgIC8vIHNvIGdldCBhbGwgbWV0aG9kcyBmcm9tIHRoZSBjdXJyZW50IGNsYXNzCisgICAgICAgIFhNZXRob2RbXSBhbGxNZXRob2RzID0gZ2V0TWV0aG9kcyhjdXJfY2xhc3MpOworCisgICAgICAgIC8vIEFuZCBub3cgZmlsdGVyIHRoZSBNZXRob2REb2MncyBiYXNlZAorICAgICAgICAvLyBvbiB3aGF0IEludHJvc3BlY3Rpb25IZWxwZXIgc2F5cworICAgICAgICBMaXN0IGVsZW1lbnRNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgWE1ldGhvZCBtZXRob2QgPSBhbGxNZXRob2RzW2ldOworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAvLyBPYmplY3QgY3JlYXRlKCksIHZvaWQgYWRkKE9iamVjdCksIHZvaWQgYWRkQ29uZmlndXJlZChPYmplY3QpCisgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBudWxsOworCisgICAgICAgICAgICAvLyB0cnVlIGlmIGFkZFhYWCBvciBhZGRDb25maWd1cmVkWFhYCisgICAgICAgICAgICBib29sZWFuIGFkZGVyID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImNyZWF0ZSIpKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBtZXRob2ROYW1lLnN1YnN0cmluZyg2KS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCJhZGQiKSkgeworICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSAzOworCisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiYWRkQ29uZmlndXJlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IDEzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gbWV0aG9kTmFtZS5zdWJzdHJpbmcobGVuZ3RoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgIGFkZGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVsZW1lbnROYW1lID0gIiArIGVsZW1lbnROYW1lKTsKKworICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRUeXBlID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGFkZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlID0gKChYUGFyYW1ldGVyKSBpdC5uZXh0KCkpLmdldFR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0VHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtZXRob2QuaXNQdWJsaWMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbWFwRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZU1hcC5nZXRQcm9wZXJ0eShlbGVtZW50TmFtZSk7CisKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlbGVtZW50VHlwZSA9ICIgKyBlbGVtZW50VHlwZSArICIgbWFwRWxlbWVudFR5cGUgPSAiICsgbWFwRWxlbWVudFR5cGUpOworICAgICAgICAgICAgaWYgKG1hcEVsZW1lbnRUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaW5uZXIgY2xhc3NlcyBhcmUgbm90ZWQgd2l0aCAkIGluIG91ciBtYXAsIGJ1dCBub3QKKyAgICAgICAgICAgIC8vIHRoZSBwYXJhbWV0ZXIgdHlwZSBuYW1lLgorICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZS5lcXVhbHMobWFwRWxlbWVudFR5cGUucmVwbGFjZSgnJCcsICcuJykpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsZW1lbnRNZXRob2RzLmFkZChtZXRob2QpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChYTWV0aG9kW10pIGVsZW1lbnRNZXRob2RzLnRvQXJyYXkobmV3IFhNZXRob2RbZWxlbWVudE1ldGhvZHMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHNsaWdodGx5IHJlZmFjdG9yZWQgKHRoYW5rIHlvdSBJbnRlbGxpSikgdmVyc2lvbiBvZiBzb21lIGN1dC1hbmQtcGFzdGUgZnJvbSBYRG9jbGV0IGNvZGUuIEl0IHNvcnRzIGFsbAorICAgICAqIG1ldGhvZHMgdG9nZXRoZXIgcmF0aGVyIHRoYW4gaW4gYmF0Y2hlcyBvZiBzdXBlcmNsYXNzZXMgbGlrZSBYRG9jbGV0IHN0dWZmIGRvZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VyX2NsYXNzCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByaXZhdGUgWE1ldGhvZFtdIGdldE1ldGhvZHMoWENsYXNzIGN1cl9jbGFzcykKKyAgICB7CisgICAgICAgIE1hcCBhbHJlYWR5ID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICBMaXN0IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgd2hpbGUgKGN1cl9jbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBoYXJkY29kZWQgdG8gc3RvcCB3aGVuIGl0IGhpdHMgVGFzaywgbm90aGluZyB0aGVyZQorICAgICAgICAgICAgLy8gb3IgYWJvdmUgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQKKyAgICAgICAgICAgIGlmIChjdXJfY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygib3JnLmFwYWNoZS50b29scy5hbnQuVGFzayIpIHx8CisgICAgICAgICAgICAgICAgY3VyX2NsYXNzLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzayIpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbGxlY3Rpb24gY3VyTWV0aG9kcyA9IGN1cl9jbGFzcy5nZXRNZXRob2RzKCk7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBjdXJNZXRob2RzLml0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFhNZXRob2QgbWV0aG9kID0gKFhNZXRob2QpIGl0ZXIubmV4dCgpOworCisgICAgICAgICAgICAgICAgaWYgKGlzRGVwcmVjYXRlZChtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlKG1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOworCisvLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1ldGhvZCA9ICIgKyBtZXRob2QgKyAiOiIgKyBtZXRob2ROYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0Q29udGFpbmluZ0NsYXNzKCkgPT0gY3VyX2NsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5LmNvbnRhaW5zS2V5KG1ldGhvZE5hbWUpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5LnB1dChtZXRob2ROYW1lLCBtZXRob2QpOworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcy5hZGQobWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VyX2NsYXNzID0gY3VyX2NsYXNzLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzb3J0TWV0aG9kcyhtZXRob2RzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEZXByZWNhdGVkKFhNZXRob2QgbWV0aG9kKQorICAgIHsKKyAgICAgICAgQ29sbGVjdGlvbiB0YWdzID0gbWV0aG9kLmdldERvYygpLmdldFRhZ3MoKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IHRhZ3MuaXRlcmF0b3IoKTsKKworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFhUYWcgdGFnID0gKFhUYWcpIGl0ZXIubmV4dCgpOworCisgICAgICAgICAgICBpZiAodGFnLmdldE5hbWUoKS5lcXVhbHMoIkBkZXByZWNhdGVkIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgdGhlIGVsZW1lbnQgdHlwZSBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kLiBJZiB0aGUgcmV0dXJuIHR5cGUgaXMgbnVsbCwgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB1c2VkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByaXZhdGUgWENsYXNzIGVsZW1lbnRDbGFzc0RvYygpCisgICAgeworICAgICAgICBYQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGdldEN1cnJlbnRNZXRob2QoKS5nZXROYW1lKCk7CisKKyAgICAgICAgaWYgKG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiYWRkQ29uZmlndXJlZCIpIHx8CisgICAgICAgICAgICBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImFkZCIpIHx8CisgICAgICAgICAgICBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImNyZWF0ZSIpKSB7CisgICAgICAgICAgICBjbGF6eiA9IGdldEN1cnJlbnRNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCkuZ2V0VHlwZSgpOworICAgICAgICAgICAgaWYgKCJ2b2lkIi5lcXVhbHMoY2xhenouZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gcGFyYW1zID0gZ2V0Q3VycmVudE1ldGhvZCgpLmdldFBhcmFtZXRlcnMoKTsKKworICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBwYXJhbXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgY2xhenogPSAoKFhQYXJhbWV0ZXIpaXQubmV4dCgpKS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1ldGhvZE5hbWUgKyAiOiBjbGF6eiA9ICIgKyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICByZXR1cm4gY2xheno7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIG5vdywgbHVtcCBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cyB0b2dldGhlciBzaW5jZSB3ZSB3b24ndCBoYXZlIHRob3NlIHRhZ3Mgb24gdGhlIHNhbWUgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZAorICAgICAqIEByZXR1cm4gICAgICAgIFRydWUgaWYgdGhlIG1ldGhvZCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkSWdub3JlKFhNZXRob2QgbWV0aG9kKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gbWV0aG9kLmdldERvYygpLmdldFRhZ0F0dHJpYnV0ZVZhbHVlKCJhbnQuYXR0cmlidXRlIiwgImlnbm9yZSIpOworCisgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IG1ldGhvZC5nZXREb2MoKS5nZXRUYWdBdHRyaWJ1dGVWYWx1ZSgiYW50LmVsZW1lbnQiLCAiaWdub3JlIik7CisgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgWE1ldGhvZFtdIHNvcnRNZXRob2RzKExpc3QgbWV0aG9kcykKKyAgICB7CisgICAgICAgIC8vc29ydCBtZXRob2RzCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWV0aG9kcywKKyAgICAgICAgICAgIG5ldyBDb21wYXJhdG9yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYTWV0aG9kIG0xID0gKFhNZXRob2QpIG8xOworICAgICAgICAgICAgICAgICAgICBYTWV0aG9kIG0yID0gKFhNZXRob2QpIG8yOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtMS5nZXROYW1lKCkuY29tcGFyZVRvKG0yLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vZHVtYgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqID09IHRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIChYTWV0aG9kW10pIG1ldGhvZHMudG9BcnJheShuZXcgWE1ldGhvZFttZXRob2RzLnNpemUoKV0pOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvYW50L3hkb2NsZXQvcmVzb3VyY2VzL3Rhc2tfeG1sLnhkdCBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L3Jlc291cmNlcy90YXNrX3htbC54ZHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0NTY0YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL2FudC94ZG9jbGV0L3Jlc291cmNlcy90YXNrX3htbC54ZHQKQEAgLTAsMCArMSw5MiBAQAorPHRhc2sgbmFtZT0iPFhEdEFudDp0YXNrTmFtZS8+IiBjYXRlZ29yeT0iPFhEdEFudDpjYXRlZ29yeU5hbWUvPiIKKyAgICAgIGNsYXNzbmFtZT0iPFhEdENsYXNzOmZ1bGxDbGFzc05hbWUvPiIKKyAgICAgIDxYRHRDbGFzczppZkhhc0NsYXNzVGFnIHRhZ05hbWU9ImRlcHJlY2F0ZWQiPmRlcHJlY2F0ZWQ9InRydWUiPC9YRHRDbGFzczppZkhhc0NsYXNzVGFnPgorICAgICAgPFhEdFR5cGU6aWZJc09mVHlwZSB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2siPm1hdGNoaW5nVGFzaz0idHJ1ZSI8L1hEdFR5cGU6aWZJc09mVHlwZT4+CisKKyAgPFhEdE1lcmdlOm1lcmdlIGZpbGU9InswfS54bWwiIGdlbmVyYXRlTWVyZ2VkRmlsZT0iZmFsc2UiPgorICAgIDwhLS0gbm8gbWVyZ2UgZmlsZSBwcmVzZW50IC0tPgorICA8L1hEdE1lcmdlOm1lcmdlPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVs8WER0Q2xhc3M6Zmlyc3RTZW50ZW5jZURlc2NyaXB0aW9uLz5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8bG9uZy1kZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVs8WER0Q2xhc3M6Y2xhc3NDb21tZW50IG5vLWNvbW1lbnQtc2lnbnM9InRydWUiLz5dXT4KKyAgPC9sb25nLWRlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICAgIDxhdHRyaWJ1dGUtZ3JvdXBzPgorCisgICAgICAgIDxhdHRyaWJ1dGUtZ3JvdXAgbmFtZT0icmVxdWlyZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxYRHRBbnQ6Zm9yQWxsQXR0cmlidXRlc0luR3JvdXAgZ3JvdXA9InJlcXVpcmVkIj4KKyAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSI8WER0QW50OnByb3BlcnR5TmFtZS8+IgorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9IjxYRHRQYXJhbWV0ZXI6Zm9yQWxsTWV0aG9kUGFyYW1zPjxYRHRQYXJhbWV0ZXI6bWV0aG9kUGFyYW1UeXBlLz48L1hEdFBhcmFtZXRlcjpmb3JBbGxNZXRob2RQYXJhbXM+IgorICAgICAgICAgICAgICAgICAgICAgICAgIDxYRHRNZXRob2Q6aWZIYXNNZXRob2RUYWcgdGFnTmFtZT0iZGVwcmVjYXRlZCI+ZGVwcmVjYXRlZD0idHJ1ZSI8L1hEdE1ldGhvZDppZkhhc01ldGhvZFRhZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICBicmllZlR5cGU9IjxYRHRBbnQ6ZGlzcGxheUF0dHJpYnV0ZVR5cGUvPiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBWzxYRHRBbnQ6c2hvcnRNZXRob2REZXNjcmlwdGlvbi8+XV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbPFhEdE1ldGhvZDptZXRob2RDb21tZW50IG5vLWNvbW1lbnQtc2lnbnM9InRydWUiLz5dXT48L2Rlc2NyaXB0aW9uPgorICAgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgICAgIDwvWER0QW50OmZvckFsbEF0dHJpYnV0ZXNJbkdyb3VwPgorICAgICAgICA8L2F0dHJpYnV0ZS1ncm91cD4KKworICAgICAgICA8WER0QW50OmZvckFsbEF0dHJpYnV0ZUdyb3Vwcz4KKyAgICAgICAgICA8YXR0cmlidXRlLWdyb3VwIG5hbWU9IjxYRHRBbnQ6YXR0cmlidXRlR3JvdXBOYW1lLz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iPFhEdEFudDphdHRyaWJ1dGVHcm91cERlc2MvPiI+CisgICAgICAgICAgICA8WER0QW50OmZvckFsbEF0dHJpYnV0ZXNJbkdyb3VwIGdyb3VwPSI8WER0QW50OmF0dHJpYnV0ZUdyb3VwTmFtZS8+Ij4KKyAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSI8WER0QW50OnByb3BlcnR5TmFtZS8+IgorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9IjxYRHRQYXJhbWV0ZXI6Zm9yQWxsTWV0aG9kUGFyYW1zPjxYRHRQYXJhbWV0ZXI6bWV0aG9kUGFyYW1UeXBlLz48L1hEdFBhcmFtZXRlcjpmb3JBbGxNZXRob2RQYXJhbXM+IgorICAgICAgICAgICAgICAgICAgICAgICAgIDxYRHRNZXRob2Q6aWZIYXNNZXRob2RUYWcgdGFnTmFtZT0iZGVwcmVjYXRlZCI+ZGVwcmVjYXRlZD0idHJ1ZSI8L1hEdE1ldGhvZDppZkhhc01ldGhvZFRhZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICBicmllZlR5cGU9IjxYRHRBbnQ6ZGlzcGxheUF0dHJpYnV0ZVR5cGUvPiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBWzxYRHRBbnQ6c2hvcnRNZXRob2REZXNjcmlwdGlvbi8+XV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbPFhEdE1ldGhvZDptZXRob2RDb21tZW50IG5vLWNvbW1lbnQtc2lnbnM9InRydWUiLz5dXT48L2Rlc2NyaXB0aW9uPgorICAgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgICAgIDwvWER0QW50OmZvckFsbEF0dHJpYnV0ZXNJbkdyb3VwPgorICAgICAgICAgIDwvYXR0cmlidXRlLWdyb3VwPgorICAgICAgICA8L1hEdEFudDpmb3JBbGxBdHRyaWJ1dGVHcm91cHM+CisKKyAgICAgICAgPGF0dHJpYnV0ZS1ncm91cCBuYW1lPSJvcHRpb25hbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT3B0aW9uYWwiPgorICAgICAgICAgICAgPFhEdEFudDpmb3JBbGxBdHRyaWJ1dGVzSW5Hcm91cCBncm91cD0ib3B0aW9uYWwiPgorICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IjxYRHRBbnQ6cHJvcGVydHlOYW1lLz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iPFhEdFBhcmFtZXRlcjpmb3JBbGxNZXRob2RQYXJhbXM+PFhEdFBhcmFtZXRlcjptZXRob2RQYXJhbVR5cGUvPjwvWER0UGFyYW1ldGVyOmZvckFsbE1ldGhvZFBhcmFtcz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgPFhEdE1ldGhvZDppZkhhc01ldGhvZFRhZyB0YWdOYW1lPSJkZXByZWNhdGVkIj5kZXByZWNhdGVkPSJ0cnVlIjwvWER0TWV0aG9kOmlmSGFzTWV0aG9kVGFnPgorICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iPFhEdEFudDpkaXNwbGF5QXR0cmlidXRlVHlwZS8+Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbPFhEdEFudDpzaG9ydE1ldGhvZERlc2NyaXB0aW9uLz5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVs8WER0TWV0aG9kOm1ldGhvZENvbW1lbnQgbm8tY29tbWVudC1zaWducz0idHJ1ZSIvPl1dPjwvZGVzY3JpcHRpb24+CisgICAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgICAgPC9YRHRBbnQ6Zm9yQWxsQXR0cmlidXRlc0luR3JvdXA+CisgICAgICAgIDwvYXR0cmlidXRlLWdyb3VwPgorCisgICAgICA8L2F0dHJpYnV0ZS1ncm91cHM+CisKKyAgICA8ZWxlbWVudHM+CisKKyAgICAgIDxYRHRBbnQ6Zm9yQWxsRWxlbWVudHM+CisgICAgICAgIDxlbGVtZW50IG5hbWU9IjxYRHRBbnQ6ZWxlbWVudE5hbWUvPiIgdHlwZT0iPFhEdEFudDplbGVtZW50VHlwZS8+IgorICAgICAgICAgICAgICAgICA8WER0TWV0aG9kOmlmSGFzTWV0aG9kVGFnIHRhZ05hbWU9ImRlcHJlY2F0ZWQiPmRlcHJlY2F0ZWQ9InRydWUiPC9YRHRNZXRob2Q6aWZIYXNNZXRob2RUYWc+CisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iPFhEdEFudDpkaXNwbGF5RWxlbWVudFR5cGUvPiIKKyAgICAgICAgICA8WER0Q2xhc3M6cHVzaENsYXNzIHZhbHVlPSI8WER0QW50OmVsZW1lbnRUeXBlLz4iPgorICAgICAgICAgICAgPFhEdENsYXNzOmlmSXNDbGFzc0Fic3RyYWN0PmFic3RyYWN0PSJ0cnVlIjwvWER0Q2xhc3M6aWZJc0NsYXNzQWJzdHJhY3Q+PgorICAgICAgICAgIDwvWER0Q2xhc3M6cHVzaENsYXNzPgorICAgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVs8WER0QW50OnNob3J0TWV0aG9kRGVzY3JpcHRpb24vPl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgPCFbQ0RBVEFbPFhEdE1ldGhvZDptZXRob2RDb21tZW50IG5vLWNvbW1lbnQtc2lnbnM9InRydWUiLz5dXT4KKyAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L2VsZW1lbnQ+CisgICAgICA8L1hEdEFudDpmb3JBbGxFbGVtZW50cz4KKworICAgIDwvZWxlbWVudHM+CisKKyAgICA8WER0TWV0aG9kOnNldEN1cnJlbnRNZXRob2QgbmFtZT0iYWRkVGV4dCIgcGFyYW1ldGVycz0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8Ym9keSA8WER0TWV0aG9kOmlmSGFzTWV0aG9kVGFnIHRhZ05hbWU9ImRlcHJlY2F0ZWQiPmRlcHJlY2F0ZWQ9InRydWUiPC9YRHRNZXRob2Q6aWZIYXNNZXRob2RUYWc+PgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgPFhEdE1ldGhvZDptZXRob2RDb21tZW50IG5vLWNvbW1lbnQtc2lnbnM9InRydWUiLz4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYm9keT4KKyAgICA8L1hEdE1ldGhvZDpzZXRDdXJyZW50TWV0aG9kPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvYW50L3hkb2NsZXQvcmVzb3VyY2VzL3Rhc2tkZWZfcHJvcGVydGllcy54ZHQgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS9hbnQveGRvY2xldC9yZXNvdXJjZXMvdGFza2RlZl9wcm9wZXJ0aWVzLnhkdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQyMWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvYW50L3hkb2NsZXQvcmVzb3VyY2VzL3Rhc2tkZWZfcHJvcGVydGllcy54ZHQKQEAgLTAsMCArMSwyIEBACis8WER0QW50OmZvckFsbFRhc2tzPjxYRHRBbnQ6dGFza05hbWUvPj08WER0Q2xhc3M6ZnVsbENsYXNzTmFtZS8+Cis8L1hEdEFudDpmb3JBbGxUYXNrcz4KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25kaXRpb25UYXNrLnhtbCBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25kaXRpb25UYXNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGIxMTJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmRpdGlvblRhc2sueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzwhLS0gQ29uZGl0aW9uIHRhc2sgLS0+Cis8ZXh0ZXJuYWw+Cis8ZGVzY3JpcHRpb24+CisKKzxwPlNldHMgYSBwcm9wZXJ0eSBpZiBhIGNlcnRhaW4gY29uZGl0aW9uIGhvbGRzIHRydWUgLSB0aGlzIGlzIGEKK2dlbmVyYWxpemF0aW9uIG9mIDxhIGhyZWY9ImF2YWlsYWJsZS5odG1sIj5BdmFpbGFibGU8L2E+IGFuZCA8YQoraHJlZj0idXB0b2RhdGUuaHRtbCI+VXB0b2RhdGU8L2E+LjwvcD4KKzxwPklmIHRoZSBjb25kaXRpb24gaG9sZHMgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCB0byB0cnVlIGJ5CitkZWZhdWx0OyBvdGhlcndpc2UsIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LiBZb3UgY2FuIHNldCB0aGUgdmFsdWUgdG8KK3NvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJ5IHNwZWNpZnlpbmcgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPgorYXR0cmlidXRlLjwvcD4KKzxwPkNvbmRpdGlvbnMgYXJlIHNwZWNpZmllZCBhcyA8YSBocmVmPSIjbmVzdGVkIj5uZXN0ZWQgZWxlbWVudHM8L2E+LAoreW91IG11c3Qgc3BlY2lmeSBleGFjdGx5IG9uZSBjb25kaXRpb24uPC9wPgorCis8L2Rlc2NyaXB0aW9uPgorCis8c2VjdGlvbiBhbmNob3I9ImV4YW1wbGVzIiBuYW1lPSJFeGFtcGxlcyI+CisKKzxwcmU+CisgICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7amF2YW1haWwuY29tcGxldGUmcXVvdDsmZ3Q7CisgICAgJmx0O2FuZCZndDsKKyAgICAgICZsdDthdmFpbGFibGUgY2xhc3NuYW1lPSZxdW90O2phdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXImcXVvdDsgLyZndDsKKyAgICAgICZsdDthdmFpbGFibGUgY2xhc3NuYW1lPSZxdW90O2phdmF4Lm1haWwuVHJhbnNwb3J0JnF1b3Q7IC8mZ3Q7CisgICAgJmx0Oy9hbmQmZ3Q7CisgICZsdDsvY29uZGl0aW9uJmd0OworPC9wcmU+Cis8cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5qYXZhbWFpbC5jb21wbGV0ZTwvY29kZT4gaWYgYm90aCB0aGUKK0phdmFCZWFucyBBY3RpdmF0aW9uIEZyYW1ld29yayBhbmQgSmF2YU1haWwgYXJlIGF2YWlsYWJsZSBpbiB0aGUKK2NsYXNzcGF0aC48L3A+CisKKzxwcmU+CisgICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7aXNNYWNPc0J1dE5vdE1hY09zWCZxdW90OyZndDsKKyAgICAmbHQ7YW5kJmd0OworICAgICAgJmx0O29zIGZhbWlseT0mcXVvdDttYWMmcXVvdDsgLz4KKyAgICAgICZsdDtub3QmZ3Q7CisgICAgICAgICZsdDtvcyBmYW1pbHk9JnF1b3Q7dW5peCZxdW90OyAvPgorICAgICAgJmx0Oy9ub3QmZ3Q7CisgICAgJmx0Oy9hbmQmZ3Q7CisgICZsdDsvY29uZGl0aW9uJmd0OworPC9wcmU+Cis8cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5pc01hY09zQnV0Tm90TWFjT3NYPC9jb2RlPiBpZiB0aGUgY3VycmVudAorb3BlcmF0aW5nIHN5c3RlbSBpcyBNYWNPUywgYnV0IG5vdCBNYWNPUyBYIC0gd2hpY2ggQW50IGNvbnNpZGVycyB0byBiZQoraW4gdGhlIFVuaXggZmFtaWx5IGFzIHdlbGwuPC9wPgorCis8cHJlPgorICAmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSZxdW90O2lzU3VuT1NvblNwYXJjJnF1b3Q7Jmd0OworICAgICZsdDtvcyBuYW1lPSZxdW90O1N1bk9TJnF1b3Q7IGFyY2g9JnF1b3Q7c3BhcmMmcXVvdDsgLz4KKyAgJmx0Oy9jb25kaXRpb24mZ3Q7Cis8L3ByZT4KKzxwPnNldHMgdGhlIHByb3BlcnR5IDxjb2RlPmlzU3VuT1NvblNwYXJjPC9jb2RlPiBpZiB0aGUgY3VycmVudAorb3BlcmF0aW5nIHN5c3RlbSBpcyBTdW5PUyBhbmQgaWYgaXQgaXMgcnVubmluZyBvbiBhIHNwYXJjIGFyY2hpdGVjdHVyZS48L3A+CisKKzwvc2VjdGlvbj4KKzwvZXh0ZXJuYWw+CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWMueG1sIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmIzMTRlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFjLnhtbApAQCAtMCwwICsxLDE5NSBAQAorPCEtLSBqYXZhYyB0YXNrIC0tPgorPGV4dGVybmFsPgorPGRlc2NyaXB0aW9uPgorCis8cD5Db21waWxlcyBhIEphdmEgc291cmNlIHRyZWUuPC9wPgorCis8cD5UaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2lsbCBiZSByZWN1cnNpdmVseSBzY2FubmVkIGZvciBKYXZhCitzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4gT25seSBKYXZhIGZpbGVzIHRoYXQgaGF2ZSBubyBjb3JyZXNwb25kaW5nIGNsYXNzIGZpbGUKK29yIHdoZXJlIHRoZSBjbGFzcyBmaWxlIGlzIG9sZGVyIHRoYW4gdGhlIGphdmEgZmlsZSB3aWxsIGJlIGNvbXBpbGVkLjwvcD4KKworPHA+Tm90ZTogQW50IHVzZXMgb25seSB0aGUgbmFtZXMgb2YgdGhlIHNvdXJjZSBhbmQgY2xhc3MgZmlsZXMgdG8gZmluZAordGhlIGNsYXNzZXMgdGhhdCBuZWVkIGEgcmVidWlsZC4gSXQgd2lsbCBub3Qgc2NhbiB0aGUgc291cmNlIGFuZCB0aGVyZWZvcgord2lsbCBoYXZlIG5vIGtub3dsZWRnZSBhYm91dCBuZXN0ZWQgY2xhc3NlcywgY2xhc3NlcyB0aGF0IGFyZSBuYW1lZCBkaWZmZXJlbnQKK2Zyb20gdGhlIHNvdXJjZSBmaWxlIGFuZCBzbyBvbi48L3A+CisKKzxwPlRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgdHJlZSBzaG91bGQgZm9sbG93IHRoZSBwYWNrYWdlCitoaWVyYXJjaHkuPC9wPgorCis8cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBjb21waWxlZC9jb3BpZWQuCitUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+CithdHRyaWJ1dGVzLiBXaXRoIHRoZSA8aT5pbmNsdWRlczwvaT4gb3IgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCitoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Cit0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCitmaW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKK3dhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiA8YQoraHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCitpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLjwvcD4KKworPHA+SXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBjb21waWxlcnMuIFRoaXMgY2FuIGJlIHNlbGVjdGVkIHdpdGggdGhlCismcXVvdDtidWlsZC5jb21waWxlciZxdW90OyBwcm9wZXJ0eSBvciB0aGUgY29tcGlsZXIgYXR0cmlidXRlLiBIZXJlIGFyZSB0aGUgY2hvaWNlczotPC9wPgorPHVsPgorICA8bGk+Y2xhc3NpYyAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIEpESyAxLjEvMS4yKSAtIGphdmFjMS4xIGFuZAorICAgICBqYXZhYzEuMiBjYW4gYmUgdXNlZCBhcyBhbGlhc2VzPC9saT4KKyAgPGxpPm1vZGVybiAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIEpESyAxLjMvMS40KSAtIGphdmFjMS4zIGFuZAorICAgICBqYXZhYzEuNCBjYW4gYmUgdXNlZCBhcyBhbGlhc2VzPC9saT4KKyAgPGxpPmppa2VzICh0aGUgPGEKKyAgICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9qaWtlcy9wcm9qZWN0IiB0YXJnZXQ9Il90b3AiPkppa2VzPC9hPgorICAgIGNvbXBpbGVyKTwvbGk+CisgIDxsaT5qdmMgKHRoZSBDb21tYW5kLUxpbmUgQ29tcGlsZXIgZnJvbSBNaWNyb3NvZnQncyBTREsgZm9yIEphdmEgLworICAgIFZpc3VhbCBKKyspIC0gbWljcm9zb2Z0IGNhbiBiZSB1c2VkIGFzIGFuIGFsaWFzPC9saT4KKyAgPGxpPmtqYyAodGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZG1zLmF0L2tvcGkvIiB0YXJnZXQ9Il90b3AiPmtvcGk8L2E+CisgICAgY29tcGlsZXIpPC9saT4KKyAgPGxpPmdjaiAodGhlIGdjaiBjb21waWxlciBmcm9tIGdjYyk8L2xpPgorICA8bGk+c2ogKFN5bWFudGVjIGphdmEgY29tcGlsZXIpIC0gc3ltYW50ZWMgY2FuIGJlIHVzZWQgYXMgYW4gYWxpYXM8L2xpPgorICA8bGk+ZXh0SmF2YWMgKHJ1biBlaXRoZXIgbW9kZXJuIG9yIGNsYXNzaWMgaW4gYSBKVk0gb2YgaXRzIG93bik8L2xpPgorPC91bD4KKzxwPkZvciBKREsgMS4xLzEuMiwgY2xhc3NpYyBpcyB0aGUgZGVmYXVsdC4gRm9yIEpESyAxLjMvMS40LCBtb2Rlcm4gaXMgdGhlIGRlZmF1bHQuCitJZiB5b3Ugd2lzaCB0byB1c2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgaW50ZXJmYWNlIHRoYW4gdGhvc2UKK3N1cHBsaWVkLCB3cml0ZSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgQ29tcGlsZXJBZGFwdGVyIGludGVyZmFjZQorKHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzKS4gU3VwcGx5IHRoZSBmdWxsCitjbGFzc25hbWUgaW4gdGhlICZxdW90O2J1aWxkLmNvbXBpbGVyJnF1b3Q7IHByb3BlcnR5LjwvcD4KKworPHA+VGhlIGZvcmsgYXR0cmlidXRlIG92ZXJyaWRlcyB0aGUgYnVpbGQuY29tcGlsZXIgc2V0dGluZyBhbmQgZXhwZWN0cworYSBKREsxLjEgb3IgaGlnaGVyIHRvIGJlIHNldCBpbiBqYXZhLmhvbWUuPC9wPgorCis8cD5UaGlzIHRhc2sgd2lsbCBkcm9wIGFsbCBlbnRyaWVzIHRoYXQgcG9pbnQgdG8gbm9uLWV4aXN0ZW50CitmaWxlcy9kaXJlY3RvcmllcyBmcm9tIHRoZSBDTEFTU1BBVEggaXQgcGFzc2VzIHRvIHRoZSBjb21waWxlci48L3A+CisKKzxwPjxzdHJvbmc+V2luZG93cyBOb3RlOjwvc3Ryb25nPldoZW4gdGhlIG1vZGVybiBjb21waWxlciBpcyB1c2VkCitpbiB1bmZvcmtlZCBtb2RlIG9uIFdpbmRvd3MsIGl0IGxvY2tzIHVwIHRoZSBmaWxlcyBwcmVzZW50IGluIHRoZQorY2xhc3NwYXRoIG9mIHRoZSAmbHQ7amF2YWMmZ3Q7IHRhc2ssIGFuZCBkb2VzIG5vdCByZWxlYXNlIHRoZW0uICBUaGUgc2lkZQorZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBkZWxldGUgb3IgbW92ZQordGhvc2UgZmlsZXMgbGF0ZXIgb24gaW4gdGhlIGJ1aWxkLiAgVGhlIHdvcmthcm91bmQgaXMgdG8gZm9yayB3aGVuCitpbnZva2luZyB0aGUgY29tcGlsZXIuPC9wPgorCis8L2Rlc2NyaXB0aW9uPgorCis8c2VjdGlvbiBhbmNob3I9ImV4YW1wbGVzIiBuYW1lPSJFeGFtcGxlcyI+Cis8cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDt4eXouamFyJnF1b3Q7CisgICAgICAgICBkZWJ1Zz0mcXVvdDtvbiZxdW90OworICAvJmd0OzwvcHJlPgorPHA+Y29tcGlsZXMgYWxsIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcyB1bmRlciB0aGUgPGNvZGU+JHtzcmN9PC9jb2RlPgorZGlyZWN0b3J5LCBhbmQgc3RvcmVzCit0aGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUgPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4KK1RoZSBjbGFzc3BhdGggdXNlZCBjb250YWlucyA8Y29kZT54eXouamFyPC9jb2RlPiwgYW5kIGRlYnVnIGluZm9ybWF0aW9uIGlzIG9uLjwvcD4KKworPHByZT4gICZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7CisgICAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7CisgICAgICAgICBmb3JrPSZxdW90O3RydWUmcXVvdDsKKyAgLyZndDs8L3ByZT4KKzxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KK2RpcmVjdG9yeSwgYW5kIHN0b3JlcyB0aGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUKKzxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuICBUaGlzIHdpbGwgZm9yayBvZmYgdGhlIGphdmFjCitjb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBqYXZhYyBleGVjdXRhYmxlLjwvcD4KKworPHByZT4gICZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7CisgICAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7CisgICAgICAgICBmb3JrPSZxdW90O2phdmEkJGphdmFjLmV4ZSZxdW90OworICAvJmd0OzwvcHJlPgorPHA+Y29tcGlsZXMgYWxsIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcyB1bmRlciB0aGUgPGNvZGU+JHtzcmN9PC9jb2RlPgorZGlyZWN0b3J5LCBhbmQgc3RvcmVzIHRoZSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIGluIHRoZQorPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4gIFRoaXMgd2lsbCBmb3JrIG9mZiB0aGUgamF2YWMKK2NvbXBpbGVyIHVzaW5nIHRoZSBleGVjdXRhYmxlIG5hbWVkIDxjb2RlPmphdmEkamF2YWMuZXhlPC9jb2RlPi4gIE5vdGUKK3RoYXQgdGhlIDxjb2RlPiQ8L2NvZGU+IHNpZ24gbmVlZHMgdG8gYmUgZXNjYXBlZCBieSBhIHNlY29uZCBvbmUuPC9wPgorCis8cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICAgIGluY2x1ZGVzPSZxdW90O215cGFja2FnZS9wMS8qKixteXBhY2thZ2UvcDIvKiomcXVvdDsKKyAgICAgICAgIGV4Y2x1ZGVzPSZxdW90O215cGFja2FnZS9wMS90ZXN0cGFja2FnZS8qKiZxdW90OworICAgICAgICAgY2xhc3NwYXRoPSZxdW90O3h5ei5qYXImcXVvdDsKKyAgICAgICAgIGRlYnVnPSZxdW90O29uJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD5jb21waWxlcyA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KK2RpcmVjdG9yeSwgYW5kIHN0b3JlcyB0aGUKKzxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuCitUaGUgY2xhc3NwYXRoIHVzZWQgY29udGFpbnMgPGNvZGU+eHl6LmphcjwvY29kZT4sIGFuZCBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBvbi4KK09ubHkgZmlsZXMgdW5kZXIgPGNvZGU+bXlwYWNrYWdlL3AxPC9jb2RlPiBhbmQgPGNvZGU+bXlwYWNrYWdlL3AyPC9jb2RlPiBhcmUKK3VzZWQuIEZpbGVzIGluIHRoZSA8Y29kZT5teXBhY2thZ2UvcDEvdGVzdHBhY2thZ2U8L2NvZGU+IGRpcmVjdG9yeSBhcmUgZXhjbHVkZWQKK2Zyb20gY29tcGlsYXRpb24uPC9wPgorCis8cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY306JHtzcmMyfSZxdW90OworICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxLyoqLG15cGFja2FnZS9wMi8qKiZxdW90OworICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlLyoqJnF1b3Q7CisgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7eHl6LmphciZxdW90OworICAgICAgICAgZGVidWc9JnF1b3Q7b24mcXVvdDsKKyAgLyZndDs8L3ByZT4KKworPHA+aXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUsIHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgc2Vjb25kCitzb3VyY2UgcGF0aCwgZGVmaW5lZCBieQordGhlIHByb3BlcnR5IDxjb2RlPnNyYzI8L2NvZGU+LiBUaGlzIGNhbiBhbHNvIGJlIHJlcHJlc2VudGVkIHVzaW5nIG5lc3RlZAorPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IGVsZW1lbnRzIGFzIGZvbGxvd3M6PC9wPgorCis8cHJlPiAgJmx0O2phdmFjIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDt4eXouamFyJnF1b3Q7CisgICAgICAgICBkZWJ1Zz0mcXVvdDtvbiZxdW90OyZndDsKKyAgICAmbHQ7c3JjIHBhdGg9JnF1b3Q7JHtzcmN9JnF1b3Q7LyZndDsKKyAgICAmbHQ7c3JjIHBhdGg9JnF1b3Q7JHtzcmMyfSZxdW90Oy8mZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtteXBhY2thZ2UvcDEvKiomcXVvdDsvJmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7bXlwYWNrYWdlL3AyLyoqJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O215cGFja2FnZS9wMS90ZXN0cGFja2FnZS8qKiZxdW90Oy8mZ3Q7CisgICZsdDsvamF2YWMmZ3Q7PC9wcmU+CisKKzxwPjxiPk5vdGU6PC9iPiBJZiB5b3UgYXJlIHVzaW5nIEFudCBvbiBXaW5kb3dzIGFuZCBhIG5ldyBET1Mgd2luZG93IHBvcHMgdXAKK2ZvciBldmVyeSB1c2Ugb2YgYW4gZXh0ZXJuYWwgY29tcGlsZXIsIHRoaXMgbWF5IGJlIGEgcHJvYmxlbSBvZiB0aGUgSkRLIHlvdSBhcmUgdXNpbmcuCitUaGlzIHByb2JsZW0gbWF5IG9jY3VyIHdpdGggYWxsIEpES3MgJmx0OyAxLjIuPC9wPgorCis8cD48Yj5Ob3RlOjwvYj4gSWYgeW91IHdpc2ggdG8gY29tcGlsZSBvbmx5IHNvdXJjZS1maWxlcyBsb2NhdGVkIGluIHNvbWUgcGFja2FnZXMgYmVsb3cgYQorY29tbW9uIHJvb3QgeW91IHNob3VsZCBub3QgaW5jbHVkZSB0aGVzZSBwYWNrYWdlcyBpbiB0aGUgc3JjZGlyLWF0dHJpYnV0ZS4gVXNlIGluY2x1ZGUvZXhjbHVkZS1hdHRyaWJ1dGVzCitvciBlbGVtZW50cyB0byBmaWx0ZXIgZm9yIHRoZXNlIHBhY2thZ2VzLiBJZiB5b3UgaW5jbHVkZSBwYXJ0IG9mIHlvdXIgcGFja2FnZS1zdHJ1Y3R1cmUgaW5zaWRlIHRoZSBzcmNkaXItYXR0cmlidXRlCisob3IgbmVzdGVkIHNyYy1lbGVtZW50cykgQW50IHdpbGwgc3RhcnQgdG8gcmVjb21waWxlIHlvdXIgc291cmNlcyBldmVyeSB0aW1lIHlvdSBjYWxsIGl0LjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBhbmNob3I9Imppa2VzIiBuYW1lPSJKaWtlcyBOb3RlcyI+CisKKzxwPkppa2VzIHN1cHBvcnRzIHNvbWUgZXh0cmEgb3B0aW9ucywgd2hpY2ggY2FuIGJlIHNldCBiZSBkZWZpbmluZworcHJvcGVydGllcyBwcmlvciB0byBpbnZva2luZyB0aGUgdGFzay4gVGhlIGFudCBkZXZlbG9wZXJzIGFyZSBhd2FyZSB0aGF0Cit0aGlzIGlzIHVnbHkgYW5kIGluZmxleGlibGUgLWV4cGVjdCBhIGJldHRlciBzb2x1dGlvbiBpbiB0aGUgZnV0dXJlLiBBbGwKK3RoZSBvcHRpb25zIGFyZSBib29sZWFuLCBhbmQgbXVzdCBiZSBzZXQgdG8gJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDt5ZXMmcXVvdDsgdG8gYmUKK2ludGVycHJldGVkIGFzIGFueXRoaW5nIG90aGVyIHRoYW4gZmFsc2U7IGJ5IGRlZmF1bHQKK2J1aWxkLmNvbXBpbGVyLndhcm5pbmdzIGlzICZxdW90O3RydWUmcXVvdDsgd2hpbGUgYWxsIG90aGVycyBhcmUgJnF1b3Q7ZmFsc2UmcXVvdDs8L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorCWJ1aWxkLmNvbXBpbGVyLmVtYWNzCisJPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiPgorCUVuYWJsZSBlbWFjcyBjb21wYXRpYmxlIGVycm9yIG1lc3NhZ2VzCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisJYnVpbGQuY29tcGlsZXIud2FybmluZ3M8YnIgLz4KKyAgICAgICAgPGI+VGhpcyBwcm9wZXJ0eSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgdGhlIG5vd2FybiBhdHRyaWJ1dGUKKyAgICAgICAgICBpbnN0ZWFkPC9iPgorCTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIj4KKwlkb24ndCBkaXNhYmxlIHdhcm5pbmcgbWVzc2FnZXMKKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKwlidWlsZC5jb21waWxlci5wZWRhbnRpYworCTwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIj4KKwllbmFibGUgcGVkYW50aWMgd2FybmluZ3MKKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKwlidWlsZC5jb21waWxlci5mdWxsZGVwZW5kCisJPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiPgorCWVuYWJsZSBmdWxsIGRlcGVuZGVuY3kgY2hlY2tpbmcsPGJyIC8+CisJJnF1b3Q7K0YmcXVvdDsgaW4gdGhlIGppa2VzIG1hbnVhbC4KKyAgICA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPC9zZWN0aW9uPgorPC9leHRlcm5hbD4KZGlmZiAtLWdpdCBhL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhZG9jLnhtbCBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhZG9jLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDllYzdmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFkb2MueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzwhLS0gamF2YWRvYyB0YXNrIC0tPgorPGV4dGVybmFsPgorPGRlc2NyaXB0aW9uPgorCis8cD5HZW5lcmF0ZXMgY29kZSBkb2N1bWVudGF0aW9uIHVzaW5nIHRoZSBqYXZhZG9jIHRvb2wuPC9wPgorCis8cD5UaGUgc291cmNlIGRpcmVjdG9yeSB3aWxsIGJlIHJlY3Vyc2l2ZWx5IHNjYW5uZWQgZm9yIEphdmEgc291cmNlIGZpbGVzIHRvIHByb2Nlc3MKK2J1dCBvbmx5IHRob3NlIG1hdGNoaW5nIHRoZSBpbmNsdXNpb24gcnVsZXMsIGFuZCBub3QgbWF0Y2hpbmcgdGhlIGV4Y2x1c2lvbnMgcnVsZXMKK3dpbGwgYmUgcGFzc2VkIHRvIHRoZSBqYXZhZG9jIHRvb2wuIFRoaXMKK2FsbG93cyB3aWxkY2FyZHMgdG8gYmUgdXNlZCB0byBjaG9vc2UgYmV0d2VlbiBwYWNrYWdlIG5hbWVzLCByZWR1Y2luZyB2ZXJib3NpdHkKK2FuZCBtYW5hZ2VtZW50IGNvc3RzIG92ZXIgdGltZS4gVGhpcyB0YXNrLCBob3dldmVyLCBoYXMgbm8gbm90aW9uIG9mCismcXVvdDtjaGFuZ2VkJnF1b3Q7IGZpbGVzLCB1bmxpa2UgdGhlIDxhIGhyZWY9ImphdmFjLmh0bWwiPmphdmFjPC9hPiB0YXNrLiBUaGlzIG1lYW5zCithbGwgcGFja2FnZXMgd2lsbCBiZSBwcm9jZXNzZWQgZWFjaCB0aW1lIHRoaXMgdGFzayBpcyBydW4uIEluIGdlbmVyYWwsIGhvd2V2ZXIsCit0aGlzIHRhc2sgaXMgdXNlZCBtdWNoIGxlc3MgZnJlcXVlbnRseS48L3A+CisKKzxwPlRoaXMgdGFzayB3b3JrcyBzZWFtbGVzc2x5IGJldHdlZW4gZGlmZmVyZW50IGphdmFkb2MgdmVyc2lvbnMgKDEuMSBhbmQgMS4yKSwKK3dpdGggdGhlIG9idmlvdXMgcmVzdHJpY3Rpb24gdGhhdCB0aGUgMS4yIGF0dHJpYnV0ZXMgd2lsbCBiZSBpZ25vcmVkIGlmIHJ1biBpbiBhCisxLjEgVk0uPC9wPgorCis8cD5OT1RFOiBzaW5jZSBqYXZhZG9jIGNhbGxzIFN5c3RlbS5leGl0KCksIGphdmFkb2MgY2Fubm90IGJlIHJ1biBpbnNpZGUgdGhlCitzYW1lIFZNIGFzIGFudCB3aXRob3V0IGJyZWFraW5nIGZ1bmN0aW9uYWxpdHkuIEZvciB0aGlzIHJlYXNvbiwgdGhpcyB0YXNrCithbHdheXMgZm9ya3MgdGhlIFZNLiBUaGlzIG92ZXJoZWFkIGlzIG5vdCBzaWduaWZpY2FudCBzaW5jZSBqYXZhZG9jIGlzIG5vcm1hbGx5IGEgaGVhdnkKK2FwcGxpY2F0aW9uIGFuZCB3aWxsIGJlIGNhbGxlZCBpbmZyZXF1ZW50bHkuPC9wPgorCis8cD5OT1RFOiB0aGUgcGFja2FnZWxpc3QgYXR0cmlidXRlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbGlzdCBvZiBwYWNrYWdlcyB0bworZG9jdW1lbnQgb3V0c2lkZSBvZiB0aGUgQW50IGZpbGUuIEl0J3MgYSBtdWNoIGJldHRlciBwcmFjdGljZSB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcKK2luc2lkZSB0aGUgYnVpbGQueG1sIGZpbGUuIFRoaXMgb3B0aW9uIHdhcyBhZGRlZCBpbiBvcmRlciB0byBtYWtlIGl0IGVhc2llciB0bworbWlncmF0ZSBmcm9tIHJlZ3VsYXIgbWFrZWZpbGVzLCB3aGVyZSB5b3Ugd291bGQgdXNlIHRoaXMgb3B0aW9uIG9mIGphdmFkb2MuCitUaGUgcGFja2FnZXMgbGlzdGVkIGluIHBhY2thZ2VsaXN0IGFyZSBub3QgY2hlY2tlZCwgc28gdGhlIHRhc2sgcGVyZm9ybXMgZXZlbgoraWYgc29tZSBwYWNrYWdlcyBhcmUgbWlzc2luZyBvciBicm9rZW4uIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byBjb252ZXJ0IGZyb20KK2FuIGV4aXN0aW5nIG1ha2VmaWxlLiBPbmNlIHRoaW5ncyBhcmUgcnVubmluZyB5b3Ugc2hvdWxkIHRoZW4gc3dpdGNoIHRvIHRoZSByZWd1bGFyCitub3RhdGlvbi4gPC9wPgorCis8cD48aT48Yj5ERVBSRUNBVElPTjo8L2I+IHRoZSBqYXZhZG9jMiB0YXNrIHNpbXBseSBwb2ludHMgdG8gdGhlIGphdmFkb2MgdGFzayBhbmQgaXQncwordGhlcmUgZm9yIGJhY2sgY29tcGF0aWJpbGl0eSByZWFzb25zLiBTaW5jZSB0aGlzIHRhc2sgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZQordmVyc2lvbnMsIHlvdSBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1c2UgPGEgaHJlZj0iamF2YWRvYy5odG1sIj5qYXZhZG9jPC9hPgoraW5zdGVhZC48L2k+PC9wPgorPC9kZXNjcmlwdGlvbj4KKworPHNlY3Rpb24gYW5jaG9yPSJleGFtcGxlcyIgbmFtZT0iRXhhbXBsZSI+Cis8cHJlPiAgJmx0O2phdmFkb2MgcGFja2FnZW5hbWVzPSZxdW90O2NvbS5kdW1teS50ZXN0LiomcXVvdDsKKyAgICAgICAgICAgc291cmNlcGF0aD0mcXVvdDtzcmMmcXVvdDsKKyAgICAgICAgICAgZXhjbHVkZXBhY2thZ2VuYW1lcz0mcXVvdDtjb20uZHVtbXkudGVzdC5kb2MtZmlsZXMuKiZxdW90OworICAgICAgICAgICBkZWZhdWx0ZXhjbHVkZXM9JnF1b3Q7eWVzJnF1b3Q7CisgICAgICAgICAgIGRlc3RkaXI9JnF1b3Q7ZG9jcy9hcGkmcXVvdDsKKyAgICAgICAgICAgYXV0aG9yPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgICAgdmVyc2lvbj0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgIHVzZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgIHdpbmRvd3RpdGxlPSZxdW90O1Rlc3QgQVBJJnF1b3Q7Jmd0OworICAgICZsdDtkb2N0aXRsZSZndDsmbHQ7IVtDREFUQVsmbHQ7aDEmZ3Q7VGVzdCZsdDsvaDEmZ3Q7XV0mZ3Q7Jmx0Oy9kb2N0aXRsZSZndDsKKyAgICAmbHQ7Ym90dG9tJmd0OyZsdDshW0NEQVRBWyZsdDtpJmd0O0NvcHlyaWdodCAmYW1wOyMxNjk7IDIwMDAgRHVtbXkgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4mbHQ7L2kmZ3Q7XV0mZ3Q7Jmx0Oy9ib3R0b20mZ3Q7CisgICAgJmx0O3RhZyBuYW1lPSZxdW90O3RvZG8mcXVvdDsgc2NvcGU9JnF1b3Q7YWxsJnF1b3Q7IGRlc2NyaXB0aW9uPSZxdW90O1RvIGRvOiZxdW90OyAvJmd0OworICAgICZsdDtncm91cCB0aXRsZT0mcXVvdDtHcm91cCAxIFBhY2thZ2VzJnF1b3Q7IHBhY2thZ2VzPSZxdW90O2NvbS5kdW1teS50ZXN0LmEqJnF1b3Q7LyZndDsKKyAgICAmbHQ7Z3JvdXAgdGl0bGU9JnF1b3Q7R3JvdXAgMiBQYWNrYWdlcyZxdW90OyBwYWNrYWdlcz0mcXVvdDtjb20uZHVtbXkudGVzdC5iKjpjb20uZHVtbXkudGVzdC5jKiZxdW90Oy8mZ3Q7CisgICAgJmx0O2xpbmsgb2ZmbGluZT0mcXVvdDt0cnVlJnF1b3Q7IGhyZWY9JnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvYXBpLyZxdW90OyBwYWNrYWdlbGlzdExvYz0mcXVvdDtDOlx0bXAmcXVvdDsvJmd0OworICAgICZsdDtsaW5rIGhyZWY9JnF1b3Q7aHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL3Byb2R1Y3RzL3htbC9kb2NzL2FwaS8mcXVvdDsvJmd0OworICAmbHQ7L2phdmFkb2MmZ3Q7PC9wcmU+Cis8L3NlY3Rpb24+Cis8L2V4dGVybmFsPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5LnhtbCBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllMmYyZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3NyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eS54bWwKQEAgLTAsMCArMSw2NSBAQAorPCEtLSBwcm9wZXJ0eSB0YXNrIC0tPgorPGV4dGVybmFsPgorPGRlc2NyaXB0aW9uPgorCis8cD5TZXRzIGEgcHJvcGVydHkgKGJ5IG5hbWUgYW5kIHZhbHVlKSwgb3Igc2V0IG9mIHByb3BlcnRpZXMgKGZyb20gZmlsZSBvciByZXNvdXJjZSkgaW4gdGhlIHByb2plY3QuPC9wPgorCis8cD5Qcm9wZXJ0aWVzIGFyZSBjYXNlIHNlbnNpdGl2ZS48L3A+CisKKzxwPlByb3BlcnRpZXMgYXJlIGltbXV0YWJsZTogd2hvZXZlciBzZXRzIGEgcHJvcGVydHkgZmlyc3QgZnJlZXplcyBpdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGJ1aWxkOyB0aGV5IGFyZSBtb3N0IGRlZmluYXRlbHkgbm90IHZhcmlhYmxlLjwvcD4KKworPHA+VGhlcmUgYXJlIGZpdmUgd2F5cyB0byBzZXQgcHJvcGVydGllczoKKyAgPHVsPgorICAgIDxsaT5CeSBzdXBwbHlpbmcgYm90aCB0aGUgbmFtZSBhbmQgdmFsdWUgYXR0cmlidXRlLjwvbGk+CisgICAgPGxpPkJ5IHN1cHBseWluZyBib3RoIHRoZSBuYW1lIGFuZCByZWZpZCBhdHRyaWJ1dGUuPC9saT4KKyAgICA8bGk+Qnkgc2V0dGluZyB0aGUgZmlsZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZmlsZW5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdG8gbG9hZC4gVGhpcyBwcm9wZXJ0eSBmaWxlIGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlIGZpbGUgdXNlZCBpbiB0aGUgY2xhc3MgamF2YS51dGlsLlByb3BlcnRpZXMuPC9saT4KKyAgICA8bGk+Qnkgc2V0dGluZyB0aGUgcmVzb3VyY2UgYXR0cmlidXRlIHdpdGggdGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgdG8gbG9hZC4gVGhpcyBwcm9wZXJ0eSBmaWxlIGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlIGZpbGUgdXNlZCBpbiB0aGUgY2xhc3MgamF2YS51dGlsLlByb3BlcnRpZXMuPC9saT4KKyAgICA8bGk+Qnkgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgYXR0cmlidXRlIHdpdGggYSBwcmVmaXggdG8gdXNlLiBQcm9wZXJ0aWVzIHdpbGwgYmUgZGVmaW5lZCBmb3IgZXZlcnkgZW52aXJvbm1lbnQgdmFyaWFibGUgYnkgcHJlZml4aW5nIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBhIHBlcmlvZCB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuPC9saT4KKyAgPC91bD4KKzwvcD4gIAorPHA+QWx0aG91Z2ggY29tYmluYXRpb25zIG9mIHRoZXNlIHdheXMgYXJlIHBvc3NpYmxlLCBvbmx5IG9uZSBzaG91bGQgYmUgdXNlZCBhdCBhIHRpbWUuIFByb2JsZW1zIG1pZ2h0IG9jY3VyIHdpdGggdGhlIG9yZGVyIGluIHdoaWNoIHByb3BlcnRpZXMgYXJlIHNldCwgZm9yIGluc3RhbmNlLjwvcD4KKworPHA+VGhlIHZhbHVlIHBhcnQgb2YgdGhlIHByb3BlcnRpZXMgYmVpbmcgc2V0LCBtaWdodCBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgcHJvcGVydGllcy4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgdGhlc2UgcHJvcGVydGllcyBhcmUgc2V0LiBUaGlzIGFsc28gaG9sZHMgZm9yIHByb3BlcnRpZXMgbG9hZGVkIGZyb20gYSBwcm9wZXJ0eSBmaWxlLjwvcD4KKworPHA+QSBsaXN0IG9mIHByZWRlZmluZWQgcHJvcGVydGllcyBjYW4gYmUgZm91bmQgaGVyZS48L3A+CisKKzwvZGVzY3JpcHRpb24+CisKKzxzZWN0aW9uIGFuY2hvcj0iZXhhbXBsZXMiIG5hbWU9IkV4YW1wbGVzIj4KKyAgICA8c291cmNlPjwhW0NEQVRBWworICAgIDxwcm9wZXJ0eSBuYW1lPSJmb28uZGlzdCIgdmFsdWU9ImRpc3QiLz4KKyAgICAgICAgXV0+PC9zb3VyY2U+Cis8cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5mb28uZGlzdDwvY29kZT4gdG8gdGhlIHZhbHVlICZxdW90O2Rpc3QmcXVvdDsuPC9wPgorICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgPHByb3BlcnR5IGZpbGU9ImZvby5wcm9wZXJ0aWVzIi8+CisgICAgICAgIF1dPjwvc291cmNlPgorPHA+cmVhZHMgYSBzZXQgb2YgcHJvcGVydGllcyBmcm9tIGEgZmlsZSBjYWxsZWQgJnF1b3Q7Zm9vLnByb3BlcnRpZXMmcXVvdDsuPC9wPgorICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgPHByb3BlcnR5IHJlc291cmNlPSJmb28ucHJvcGVydGllcyIvPgorICAgICAgICBdXT48L3NvdXJjZT4KKzxwPnJlYWRzIGEgc2V0IG9mIHByb3BlcnRpZXMgZnJvbSBhIHJlc291cmNlIGNhbGxlZCAmcXVvdDtmb28ucHJvcGVydGllcyZxdW90Oy48L3A+Cis8cD5Ob3RlIHRoYXQgeW91IGNhbiByZWZlcmVuY2UgYSBnbG9iYWwgcHJvcGVydGllcyBmaWxlIGZvciBhbGwgb2YgeW91ciBBbnQKK2J1aWxkcyB1c2luZyB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICA8c291cmNlPjwhW0NEQVRBWworICAgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vLmFudC1nbG9iYWwucHJvcGVydGllcyIvPgorICAgICAgICBdXT48L3NvdXJjZT4KKzxwPnNpbmNlIHRoZSAmcXVvdDt1c2VyLmhvbWUmcXVvdDsgcHJvcGVydHkgaXMgZGVmaW5lZCBieSB0aGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmUKK3RvIGJlIHlvdXIgaG9tZSBkaXJlY3RvcnkuICBXaGVyZSB0aGUgJnF1b3Q7dXNlci5ob21lJnF1b3Q7IHByb3BlcnR5IHJlc29sdmVzIHRvIGluCit0aGUgZmlsZSBzeXN0ZW0gZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB2ZXJzaW9uIGFuZCB0aGUgSlZNIGltcGxlbWVudGF0aW9uLgorT24gVW5peCBiYXNlZCBzeXN0ZW1zLCB0aGlzIHdpbGwgbWFwIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuIE9uIG1vZGVybiBXaW5kb3dzCit2YXJpYW50cywgdGhpcyB3aWxsIG1vc3QgbGlrZWx5IHJlc29sdmUgdG8gdGhlIHVzZXIncyBkaXJlY3RvcnkgaW4gdGhlICZxdW90O0RvY3VtZW50cworYW5kIFNldHRpbmdzJnF1b3Q7IGZvbGRlci4gT2xkZXIgd2luZG93cyB2YXJpYW50cyBzdWNoIGFzIFdpbmRvd3MgOTgvTUUgYXJlIGxlc3MgCitwcmVkaWN0YWJsZSwgYXMgYXJlIG90aGVyIG9wZXJhdGluZyBzeXN0ZW0vSlZNIGNvbWJpbmF0aW9ucy48L3A+CisKKzxzb3VyY2U+PCFbQ0RBVEFbCisgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ij4KKyAgPGVjaG8gbWVzc2FnZT0iTnVtYmVyIG9mIFByb2Nlc3NvcnMgPSAke2Vudi5OVU1CRVJfT0ZfUFJPQ0VTU09SU30iPgorICA8ZWNobyBtZXNzYWdlPSJBTlRfSE9NRSBpcyBzZXQgdG8gPSAke2Vudi5BTlRfSE9NRX0iPgorXV0+PC9zb3VyY2U+Cis8cD5yZWFkcyB0aGUgc3lzdGVtIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc3RvcmVzIHRoZW0gaW4gcHJvcGVydGllcywgcHJlZml4ZWQgd2l0aCAmcXVvdDtlbnYmcXVvdDsuCitOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIG9uIDxlbT5zZWxlY3Q8L2VtPiBvcGVyYXRpbmcgc3lzdGVtcy4KK1R3byBvZiB0aGUgdmFsdWVzIGFyZSBzaG93biBiZWluZyBlY2hvZWQuIAorPC9wPgorCis8L3NlY3Rpb24+Cis8L2V4dGVybmFsPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N1YkFudC54bWwgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3ViQW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODFlYWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N1YkFudC54bWwKQEAgLTAsMCArMSwxMjkgQEAKKzxleHRlcm5hbD4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIDxwPgorICAgICAgICAgICAgQ2FsbHMgYSBnaXZlbiB0YXJnZXQgZm9yIGFsbCBkZWZpbmVkIHN1Yi1idWlsZHMuCisgICAgICAgICAgICBUaGlzIGlzIGFuIGV4dGVuc2lvbgorICAgICAgICAgICAgb2YgYW50IGZvciBidWxrIHByb2plY3QgZXhlY3V0aW9uLgorCisgICAgICAgICAgICA8c3Ryb25nPlRoaXMgdGFzayBtdXN0IG5vIGJlIHVzZWQgb3V0c2lkZSBvZiBhCisgICAgICAgICAgICAgICAgPGNvZGU+dGFyZ2V0PC9jb2RlPiBpZiBpdCBpbnZva2VzIHRoZSBzYW1lIGJ1aWxkIGZpbGUgaXQgaXMKKyAgICAgICAgICAgICAgICBwYXJ0IG9mLjwvc3Ryb25nPgorICAgICAgICA8L3A+CisgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlVzZSB3aXRoIGRpcmVjdG9yaWVzIj4KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIHN1YmFudCBjYW4gYmUgdXNlZCB3aXRoIGRpcmVjdG9yeSBzZXRzIHRvIGV4ZWN1dGUgYSBidWlsZCBmcm9tIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KKyAgICAgICAgICAgICAgICAyIGRpZmZlcmVudCBvcHRpb25zIGFyZSBvZmZlcmVkIDoKKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgIHRvIHJ1biB0aGUgc2FtZSBidWlsZCBmaWxlIDxjb2RlPi9zb21lcGF0aC9vdGhlcnBhdGgvbXlidWlsZC54bWw8L2NvZGU+CisgICAgICAgICAgICAgICAgICAgIHdpdGggZGlmZmVyZW50IGJhc2UgZGlyZWN0b3JpZXMsIHVzZSB0aGUgZ2VuZXJpY2FudGZpbGUgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+aWYgeW91IHdhbnQgdG8gcnVuIDxjb2RlPmRpcmVjdG9yeTEvbXlidWlsZC54bWw8L2NvZGU+LCA8Y29kZT5kaXJlY3RvcnkyL215YnVpbGQueG1sPC9jb2RlPiwgPGNvZGU+Li4uLjwvY29kZT4sCisgICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgYW50ZmlsZSBhdHRyaWJ1dGUuIFRoZSBzdWJhbnQgdGFzayBkb2VzIG5vdCBzZXQgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciB5b3UgaW4gdGhpcyBjYXNlLCBiZWNhdXNlIHlvdSBjYW4gc3BlY2lmeSBpdCBpbiBlYWNoIGJ1aWxkIGZpbGUuCisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8c2VjdGlvbiBhbmNob3I9ImV4YW1wbGVzIiBuYW1lPSJFeGFtcGxlcyI+CisgICAgICAgIDxwcmU+CisgICAgICAgICZsdDtwcm9qZWN0IG5hbWU9InN1YmFudCIgZGVmYXVsdD0ic3ViYW50MSImZ3Q7CisgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJzdWJhbnQuYnVpbGQiLyZndDsKKyAgICAgICAgJmx0O3RhcmdldCBuYW1lPSJzdWJhbnQxIiZndDsKKyAgICAgICAgICAgICZsdDtzdWJhbnQgdGFyZ2V0PSIiJmd0OworICAgICAgICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0ic3ViYW50MS5idWlsZCIvJmd0OworICAgICAgICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0ibm90Lm92ZXJsb2FkZWQiIHZhbHVlPSJub3Qub3ZlcmxvYWRlZCIvJmd0OworICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqL2J1aWxkLnhtbCIvJmd0OworICAgICAgICAgICAgJmx0Oy9zdWJhbnQmZ3Q7CisgICAgICAgICZsdDsvdGFyZ2V0Jmd0OworICAgICAgICAmbHQ7L3Byb2plY3QmZ3Q7CisgICAgICAgIDwvcHJlPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIHRoaXMgc25pcHBldCBidWlsZCBmaWxlIHdpbGwgcnVuIGFudCBpbiBlYWNoIHN1YmRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBkaXJlY3RvcnksCisgICAgICAgICAgICB3aGVyZSBhIGZpbGUgY2FsbGVkIGJ1aWxkLnhtbCBjYW4gYmUgZm91bmQuCisgICAgICAgICAgICBUaGUgcHJvcGVydHkgYnVpbGQuZGlyIHdpbGwgaGF2ZSB0aGUgdmFsdWUgc3ViYW50MS5idWlsZCBpbiB0aGUgYW50IHByb2plY3RzIGNhbGxlZCBieSBzdWJhbnQuCisgICAgICAgIDwvcD4KKyAgICAgICAgPHByZT4KKyAgICAgICAgICAmbHQ7c3ViYW50IHRhcmdldD0iIiZndDsKKyAgICAgICAgICAgICAmbHQ7cHJvcGVydHlzZXQmZ3Q7CisgICAgICAgICAgICAgICAgICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSJ0b3BsZXZlbCIvJmd0OworICAgICAgICAgICAgICAgICAgJmx0O21hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSJmb28qIiB0bz0iYmFyKiIvJmd0OworICAgICAgICAgICAgICZsdDsvcHJvcGVydHlzZXQmZ3Q7CisgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iKi9idWlsZC54bWwiLyZndDsKKyAgICAgICAgICAmbHQ7L3N1YmFudCZndDsKKyAgICAgICAgPC9wcmU+CisgICAgICAgIDxwPgorICAgICAgICAgICAgdGhpcyBzbmlwcGV0IGJ1aWxkIGZpbGUgd2lsbCBydW4gYW50IGluIGVhY2ggc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwKKyAgICAgICAgICAgIHdoZXJlIGEgZmlsZSBjYWxsZWQgYnVpbGQueG1sIGNhbiBiZSBmb3VuZC4KKyAgICAgICAgICAgIEFsbCBwcm9wZXJ0aWVzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggJnF1b3Q7Zm9vJnF1b3Q7IGFyZSBwYXNzZWQsIHRoZWlyIG5hbWVzIGFyZSBjaGFuZ2VkIHRvIHN0YXJ0IHdpdGggJnF1b3Q7YmFyJnF1b3Q7IGluc3RlYWQKKyAgICAgICAgPC9wPgorICAgICAgICA8cHJlPgorICAgICAgICAgICZsdDtzdWJhbnQgdGFyZ2V0PSJjb21waWxlIiBnZW5lcmljYW50ZmlsZT0iL29wdC9wcm9qZWN0L2J1aWxkMS54bWwiJmd0OworICAgICAgICAgICAgICZsdDtkaXJzZXQgZGlyPSIuIiBpbmNsdWRlcz0icHJvamVjdHMqIi8mZ3Q7CisgICAgICAgICAgJmx0Oy9zdWJhbnQmZ3Q7CisgICAgICAgIDwvcHJlPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIGFzc3VtaW5nIHRoZSBzdWJkaXJzIG9mIHRoZSBwcm9qZWN0IGRpciBhcmUgY2FsbGVkIHByb2plY3RzMSwgcHJvamVjdHMyLCBwcm9qZWN0czMKKyAgICAgICAgICAgIHRoaXMgc25pcHBldCB3aWxsIGV4ZWN1dGUgdGhlIGNvbXBpbGUgdGFyZ2V0IG9mIC9vcHQvcHJvamVjdC9idWlsZDEueG1sLAorICAgICAgICAgICAgc2V0dGluZyB0aGUgYmFzZWRpciB0byBwcm9qZWN0czEsIHByb2plY3RzMiwgcHJvamVjdHMzCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+Tm93IGEgbGl0dGxlIG1vcmUgY29tcGxleCAtIGJ1dCB1c2VmdWwgLSBzY2VuYXJpby4gQXNzdW1lIHRoYXQgd2UgaGF2ZQorICAgICAgICBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOjwvcD4KKyAgICAgICAgPHByZT4KKyAgICAgICAgcm9vdAorICAgICAgICAgIHwgIGNvbW1vbi54bWwKKyAgICAgICAgICB8ICBidWlsZC54bWwKKyAgICAgICAgICB8CisgICAgICAgICAgKy0tIG1vZHVsZXMKKyAgICAgICAgICAgICAgICArLS0gbW9kQQorICAgICAgICAgICAgICAgIHwgICAgICstLSBzcmMKKyAgICAgICAgICAgICAgICArLS0gbW9kQgorICAgICAgICAgICAgICAgICAgICAgICstLSBzcmMKKworICAgICAgICA8dT48Yj5jb21tb24ueG1sOjwvYj48L3U+PGJyLz4KKyAgICAgICAgJmx0O3Byb2plY3QmZ3Q7CisgICAgICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgICAgICB2YWx1ZT0ic3JjIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiAgICB2YWx1ZT0iYnVpbGQiLyZndDsKKyAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzLmRpciIgIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvJmd0OworCisgICAgICAgICAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiJmd0OworICAgICAgICAgICAgICAgICZsdDtta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2phdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iLyZndDsKKyAgICAgICAgICAgICZsdDsvdGFyZ2V0Jmd0OworCisgICAgICAgICAgICAmbHQ7IS0tIG1vcmUgdGFyZ2V0cyAtLSZndDsKKyAgICAgICAgJmx0Oy9wcm9qZWN0Jmd0OworCisgICAgICAgIDx1PjxiPmJ1aWxkLnhtbDo8L2I+PC91Pjxici8+CisgICAgICAgICZsdDtwcm9qZWN0Jmd0OworCisgICAgICAgICAgICAmbHQ7bWFjcm9kZWYgbmFtZT0iaXRlcmF0ZSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3N1YmFudCB0YXJnZXQ9IkB7dGFyZ2V0fSImZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9Im1vZHVsZXMiIGluY2x1ZGVzPSIqL2J1aWxkLnhtbCIvJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7L3N1YmFudCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CisgICAgICAgICAgICAmbHQ7L21hY3JvZGVmJmd0OworCisKKyAgICAgICAgICAgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2l0ZXJhdGUgdGFyZ2V0PSJjb21waWxlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICAgICAgICAgJmx0OyEtLSBtb3JlIHRhcmdldHMgLS0mZ3Q7CisgICAgICAgICZsdDsvcHJvamVjdCZndDsKKworICAgICAgICA8dT48Yj5tb2R1bGVzL21vZEEvYnVpbGQueG1sOjwvYj48L3U+PGJyLz4KKyAgICAgICAgJmx0O3Byb2plY3QgbmFtZT0ibW9kQSImZ3Q7CisgICAgICAgICAgICAmbHQ7aW1wb3J0IGZpbGU9Ii4uLy4uL2NvbW1vbi54bWwiLyZndDsKKyAgICAgICAgJmx0Oy9wcm9qZWN0Jmd0OworICAgICAgICA8L3ByZT4KKworICAgICAgICA8cD5UaGlzIHJlc3VsdHMgaW4gdmVyeSBzbWFsbCBidWlsZGZpbGVzIGluIHRoZSBtb2R1bGVzLCBtYWludGFpbmFibGUKKyAgICAgICAgYnVpbGRmaWxlIChjb21tb24ueG1sKSBhbmQgYSBjbGVhciBwcm9qZWN0IHN0cnVjdHVyZS4gQWRkaXRpb25hbGx5CisgICAgICAgIHRoZSByb290IGJ1aWxkZmlsZSBpcyBjYXBhYmxlIHRvIHJ1biB0aGUgd2hvbGUgYnVpbGQgb3ZlciBhbGwKKyAgICAgICAgbW9kdWxlcy4KKyAgICAgICAgPC9wPgorICAgIDwvc2VjdGlvbj4KKzwvZXh0ZXJuYWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhci54bWwgYi90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTY1MzdhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhci54bWwKQEAgLTAsMCArMSwxMTEgQEAKKzwhLS0gdGFyIHRhc2sgLS0+Cis8ZXh0ZXJuYWw+Cis8ZGVzY3JpcHRpb24+Cis8cD5DcmVhdGVzIGEgdGFyIGFyY2hpdmUuPC9wPgorCis8cD5UaGUgPGk+YmFzZWRpcjwvaT4gYXR0cmlidXRlIGlzIHRoZSByZWZlcmVuY2UgZGlyZWN0b3J5IGZyb20gd2hlcmUgdG8gdGFyLjwvcD4KKworPHA+VGhpcyB0YXNrIGlzIGEgPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFzazwvYT4KK2FuZCwgYXMgc3VjaCwgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZXNldDwvYT4uIFRoaXMKK2RlZmluZXMgd2hpY2ggZmlsZXMsIHJlbGF0aXZlIHRvIHRoZSA8aT5iYXNlZGlyPC9pPiwgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKK2FyY2hpdmUuIFRoZSB0YXIgdGFzayBzdXBwb3J0cyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgRmlsZXNldCB0byByZWZpbmUgdGhlCitzZXQgb2YgZmlsZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGltcGxpY2l0IGZpbGVzZXQuPC9wPgorCis8cD5JbiBhZGRpdGlvbiB0byB0aGUgaW1wbGljaXQgZmlsZXNldCwgdGhlIHRhciB0YXNrIHN1cHBvcnRzIG5lc3RlZCBmaWxlc2V0cy4gVGhlc2UKK2ZpbGVzZXRzIGFyZSBleHRlbmRlZCB0byBhbGxvdyBjb250cm9sIG92ZXIgdGhlIGFjY2VzcyBtb2RlLCB1c2VybmFtZSBhbmQgZ3JvdXBuYW1lCit0byBiZSBhcHBsaWVkIHRvIHRoZSB0YXIgZW50cmllcy4gVGhpcyBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIHByZXBhcmluZyBhcmNoaXZlcyBmb3IKK1VuaXggc3lzdGVtcyB3aGVyZSBzb21lIGZpbGVzIG5lZWQgdG8gaGF2ZSBleGVjdXRlIHBlcm1pc3Npb24uPC9wPgorCis8cD5FYXJseSB2ZXJzaW9ucyBvZiB0YXIgZGlkIG5vdCBzdXBwb3J0IHBhdGggbGVuZ3RocyBncmVhdGVyIHRoYW4gMTAwCitjaGFyYWN0ZXJzLiBNb2Rlcm4gdmVyc2lvbnMgb2YgdGFyIGRvIHNvLCBidXQgaW4gaW5jb21wYXRpYmxlIHdheXMuCitUaGUgYmVoYXZpb3VyIG9mIHRoZSB0YXIgdGFzayB3aGVuIGl0IGVuY291bnRlcnMgc3VjaCBwYXRocyBpcworY29udHJvbGxlZCBieSB0aGUgPGk+bG9uZ2ZpbGU8L2k+IGF0dHJpYnV0ZS4KK0lmIHRoZSBsb25nZmlsZSBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxjb2RlPmZhaWw8L2NvZGU+LCBhbnkgbG9uZyBwYXRocyB3aWxsCitjYXVzZSB0aGUgdGFyIHRhc2sgdG8gZmFpbC4gIElmIHRoZSBsb25nZmlsZSBhdHRyaWJ1dGUgaXMgc2V0IHRvCis8Y29kZT50cnVuY2F0ZTwvY29kZT4sIGFueSBsb25nIHBhdGhzIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSAxMDAgY2hhcmFjdGVyCittYXhpbXVtIGxlbmd0aCBwcmlvciB0byBhZGRpbmcgdG8gdGhlIGFyY2hpdmUuIElmIHRoZSB2YWx1ZSBvZiB0aGUgbG9uZ2ZpbGUKK2F0dHJpYnV0ZSBpcyBzZXQgdG8gPGNvZGU+b21pdDwvY29kZT4gdGhlbiBmaWxlcyBjb250YWluaW5nIGxvbmcgcGF0aHMgd2lsbCBiZQorb21pdHRlZCBmcm9tIHRoZSBhcmNoaXZlLiAgRWl0aGVyIG9wdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGFyY2hpdmUgY2FuIGJlCit1bnRhcnJlZCBieSBhbnkgY29tcGxpYW50IHZlcnNpb24gb2YgdGFyLiBJZiB0aGUgbG9zcyBvZiBwYXRoIG9yIGZpbGUKK2luZm9ybWF0aW9uIGlzIG5vdCBhY2NlcHRhYmxlLCBhbmQgaXQgcmFyZWx5IGlzLCBsb25nZmlsZSBtYXkgYmUgc2V0IHRvIHRoZQordmFsdWUgPGNvZGU+Z251PC9jb2RlPi4gVGhlIHRhciB0YXNrIHdpbGwgdGhlbiBwcm9kdWNlIGEgR05VIHRhciBmaWxlIHdoaWNoCitjYW4gaGF2ZSBhcmJpdHJhcnkgbGVuZ3RoIHBhdGhzLiBOb3RlIGhvd2V2ZXIsIHRoYXQgdGhlIHJlc3VsdGluZyBhcmNoaXZlIHdpbGwKK29ubHkgYmUgYWJsZSB0byBiZSB1bnRhcnJlZCB3aXRoIEdOVSB0YXIuICBUaGUgZGVmYXVsdCBmb3IgdGhlIGxvbmdmaWxlCithdHRyaWJ1dGUgaXMgPGNvZGU+d2FybjwvY29kZT4gd2hpY2ggYmVoYXZlcyBqdXN0IGxpa2UgdGhlIGdudSBvcHRpb24gZXhjZXB0Cit0aGF0IGl0IHByb2R1Y2VzIGEgd2FybmluZyBmb3IgZWFjaCBmaWxlIHBhdGggZW5jb3VudGVyZWQgdGhhdCBkb2VzIG5vdCBtYXRjaAordGhlIGxpbWl0LjwvcD4KKworPHA+Tm90ZSB0aGF0IHRoaXMgdGFzayBkb2VzIG5vdCBwZXJmb3JtIGNvbXByZXNzaW9uLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhlCis8YSBocmVmPSJnemlwLmh0bWwiPkdaaXA8L2E+IHRhc2sgdG8gcHJlcGFyZSBhIC50YXIuZ3ogcGFja2FnZS48L3A+Cis8L2Rlc2NyaXB0aW9uPgorCis8c2VjdGlvbiBhbmNob3I9ImV4YW1wbGVzIiBuYW1lPSJFeGFtcGxlcyI+Cis8cHJlPiAgJmx0O3RhciB0YXJmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnRhciZxdW90OyBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsvJmd0OworICAmbHQ7Z3ppcCB6aXBmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnRhci5neiZxdW90OyBzcmM9JnF1b3Q7JHtkaXN0fS9tYW51YWwudGFyJnF1b3Q7LyZndDs8L3ByZT4KKzxwPnRhcnMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50byBhIGZpbGUgY2FsbGVkIDxjb2RlPm1hbnVhbC50YXI8L2NvZGU+CitpbiB0aGUgPGNvZGU+JHtkaXN0fTwvY29kZT4gIGRpcmVjdG9yeSwgdGhlbiBhcHBsaWVzIHRoZSBnemlwIHRhc2sgdG8gY29tcHJlc3MKK2l0LjwvcD4KKzxwcmU+ICAmbHQ7dGFyIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnRhciZxdW90OworICAgICAgIGJhc2VkaXI9JnF1b3Q7aHRkb2NzL21hbnVhbCZxdW90OworICAgICAgIGV4Y2x1ZGVzPSZxdW90O215ZG9jcy8qKiwgKiovdG9kby5odG1sJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD50YXJzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5IGludG8gYSBmaWxlIGNhbGxlZCA8Y29kZT5tYW51YWwudGFyPC9jb2RlPgoraW4gdGhlIDxjb2RlPiR7ZGlzdH08L2NvZGU+IGRpcmVjdG9yeS4gRmlsZXMgaW4gdGhlIGRpcmVjdG9yeSA8Y29kZT5teWRvY3M8L2NvZGU+LAorb3IgZmlsZXMgd2l0aCB0aGUgbmFtZSA8Y29kZT50b2RvLmh0bWw8L2NvZGU+IGFyZSBleGNsdWRlZC48L3A+CisKKzxwcmU+CismbHQ7dGFyIGRlc3RmaWxlPSZxdW90OyR7YmFzZWRpcn0vZG9jcy50YXImcXVvdDsmZ3Q7CisgICZsdDt0YXJmaWxlc2V0IGRpcj0mcXVvdDske2Rpci5zcmN9L2RvY3MmcXVvdDsKKyAgICAgICAgICAgICAgZnVsbHBhdGg9JnF1b3Q7L3Vzci9kb2MvYW50L1JFQURNRSZxdW90OworICAgICAgICAgICAgICBwcmVzZXJ2ZUxlYWRpbmdTbGFzaGVzPSZxdW90O3RydWUmcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtyZWFkbWUudHh0JnF1b3Q7LyZndDsKKyAgJmx0Oy90YXJmaWxlc2V0Jmd0OworICAmbHQ7dGFyZmlsZXNldCBkaXI9JnF1b3Q7JHtkaXIuc3JjfS9kb2NzJnF1b3Q7CisgICAgICAgICAgICAgIHByZWZpeD0mcXVvdDsvdXNyL2RvYy9hbnQmcXVvdDsKKyAgICAgICAgICAgICAgcHJlc2VydmVMZWFkaW5nU2xhc2hlcz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7Ki5odG1sJnF1b3Q7LyZndDsKKyAgJmx0Oy90YXJmaWxlc2V0Jmd0OworJmx0Oy90YXImZ3Q7PC9wcmU+CisKKzxwPgorICBXcml0ZXMgdGhlIGZpbGUgPGNvZGU+ZG9jcy9yZWFkbWUudHh0PC9jb2RlPiBhcworICA8Y29kZT4vdXNyL2RvYy9hbnQvUkVBRE1FPC9jb2RlPiBpbnRvIHRoZSBhcmNoaXZlLiBBbGwKKyAgPGNvZGU+Ki5odG1sPC9jb2RlPiBmaWxlcyBpbiB0aGUgPGNvZGU+ZG9jczwvY29kZT4gZGlyZWN0b3J5IGFyZQorICBwcmVmaXhlZCBieSA8Y29kZT4vdXNyL2RvYy9hbnQ8L2NvZGU+LCBzbyBmb3IgZXhhbXBsZQorICA8Y29kZT5kb2NzL2luZGV4Lmh0bWw8L2NvZGU+IGlzIHdyaXR0ZW4gYXMKKyAgPGNvZGU+L3Vzci9kb2MvYW50L2luZGV4Lmh0bWw8L2NvZGU+IHRvIHRoZSBhcmNoaXZlLgorPC9wPgorCisKKzxwcmU+Jmx0O3RhciBsb25nZmlsZT0mcXVvdDtnbnUmcXVvdDsKKyAgICAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyJnF1b3Q7ICZndDsKKyAgJmx0O3RhcmZpbGVzZXQgZGlyPSZxdW90OyR7ZGlzdC5uYW1lfS8uLiZxdW90OyBtb2RlPSZxdW90Ozc1NSZxdW90OyB1c2VybmFtZT0mcXVvdDthbnQmcXVvdDsgZ3JvdXA9JnF1b3Q7YW50JnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7JHtkaXN0Lm5hbWV9L2Jvb3RzdHJhcC5zaCZxdW90Oy8mZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDske2Rpc3QubmFtZX0vYnVpbGQuc2gmcXVvdDsvJmd0OworICAmbHQ7L3RhcmZpbGVzZXQmZ3Q7CisgICZsdDt0YXJmaWxlc2V0IGRpcj0mcXVvdDske2Rpc3QubmFtZX0vLi4mcXVvdDsgdXNlcm5hbWU9JnF1b3Q7YW50JnF1b3Q7IGdyb3VwPSZxdW90O2FudCZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyR7ZGlzdC5uYW1lfS8qKiZxdW90Oy8mZ3Q7CisgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDske2Rpc3QubmFtZX0vYm9vdHN0cmFwLnNoJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyR7ZGlzdC5uYW1lfS9idWlsZC5zaCZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZmlsZXNldCZndDsKKyZsdDsvdGFyJmd0OyA8L3ByZT4KKworPHA+VGhpcyBleGFtcGxlIHNob3dzIGJ1aWxkaW5nIGEgdGFyIHdoaWNoIHVzZXMgdGhlIEdOVSBleHRlbnNpb25zIGZvciBsb25nIHBhdGhzIGFuZAord2hlcmUgc29tZSBmaWxlcyBuZWVkIHRvIGJlIG1hcmtlZCBhcyBleGVjdXRhYmxlIChtb2RlIDc1NSkKK2FuZCB0aGUgcmVzdCBhcmUgdXNlIHRoZSBkZWZhdWx0IG1vZGUgKHJlYWQtd3JpdGUgYnkgb3duZXIpLiBUaGUgZmlyc3QKK2ZpbGVzZXQgc2VsZWN0cyBqdXN0IHRoZSBleGVjdXRhYmxlIGZpbGVzLiBUaGUgc2Vjb25kIGZpbGVzZXQgbXVzdCBleGNsdWRlCit0aGUgZXhlY3V0YWJsZSBmaWxlcyBhbmQgaW5jbHVkZSBhbGwgb3RoZXJzLiA8L3A+CisKKzxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFRoZSB0YXIgdGFzayBkb2VzIG5vdCBlbnN1cmUgdGhhdCBhIGZpbGUgaXMgb25seSBzZWxlY3RlZAorYnkgb25lIGZpbGVzZXQuIElmIHRoZSBzYW1lIGZpbGUgaXMgc2VsZWN0ZWQgYnkgbW9yZSB0aGFuIG9uZSBmaWxlc2V0LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQordGFyIGZpbGUgdHdpY2UsIHdpdGggdGhlIHNhbWUgcGF0aC48L3A+CisKKzxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIHBhdHRlcm5zIGluIHRoZSBpbmNsdWRlIGFuZCBleGNsdWRlCitlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSByZWxhdGl2ZSB0byB0aGUgY29ycmVzcG9uZGluZyBkaXIKK2F0dHJpYnV0ZSBhcyB3aXRoIGFsbCBvdGhlciBmaWxlc2V0cy4gIEluIHRoZSBleGFtcGxlIGFib3ZlLAorPGNvZGU+JHtkaXN0Lm5hbWV9PC9jb2RlPiBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCwgYnV0IGEgc2ltcGxlIG5hbWUKK29mIGEgZGlyZWN0b3J5LCBzbyA8Y29kZT4ke2Rpc3QubmFtZX08L2NvZGU+IGlzIGEgdmFsaWQgcGF0aCByZWxhdGl2ZQordG8gPGNvZGU+JHtkaXN0Lm5hbWV9Ly4uPC9jb2RlPi48L3A+CisKKzwvc2VjdGlvbj4KKzwvZXh0ZXJuYWw+CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy9zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGVzdC5qYXZhIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDMwYTgwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3Mvc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rlc3QuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgKiByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogQGFudDp0YXNrIG5hbWU9InRlc3QiCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0IHsKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy90ZW1wbGF0ZXMvZGF0YXR5cGVfeGRvYy50ZW1wbGF0ZSBiL3RydW5rL3Byb3Bvc2FsL3hkb2NzL3RlbXBsYXRlcy9kYXRhdHlwZV94ZG9jLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OGQ1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9wcm9wb3NhbC94ZG9jcy90ZW1wbGF0ZXMvZGF0YXR5cGVfeGRvYy50ZW1wbGF0ZQpAQCAtMCwwICsxLDQ5IEBACis8WER0VGFnRGVmOnRhZ0RlZiBuYW1lc3BhY2U9IkFudERhdGF0eXBlIiBoYW5kbGVyPSJvcmcuYXBhY2hlLnRvb2xzLmFudC54ZG9jbGV0LkRhdGF0eXBlVGFnc0hhbmRsZXIiLz4KKzxYRHRUYWdEZWY6dGFnRGVmIG5hbWVzcGFjZT0iQW50VGFzayIgaGFuZGxlcj0ib3JnLmFwYWNoZS50b29scy5hbnQueGRvY2xldC5UYXNrVGFnc0hhbmRsZXIiLz4KKzxkYXRhdHlwZSBuYW1lPSI8WER0QW50RGF0YXR5cGU6dHlwZU5hbWUvPiIKKyAgICAgICAgICBjbGFzc25hbWU9IjxYRHRDbGFzczpmdWxsQ2xhc3NOYW1lLz4iPgorICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbPFhEdENsYXNzOmZpcnN0U2VudGVuY2VEZXNjcmlwdGlvbi8+XV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGxvbmctZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbPFhEdENsYXNzOmNsYXNzQ29tbWVudCBuby1jb21tZW50LXNpZ25zPSJ0cnVlIi8+XV0+CisgIDwvbG9uZy1kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgPFhEdEFudFRhc2s6Zm9yQWxsQXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iPFhEdE1ldGhvZDpwcm9wZXJ0eU5hbWUvPiIgdHlwZT0iPFhEdFBhcmFtZXRlcjpmb3JBbGxNZXRob2RQYXJhbXM+PFhEdFBhcmFtZXRlcjptZXRob2RQYXJhbVR5cGUvPjwvWER0UGFyYW1ldGVyOmZvckFsbE1ldGhvZFBhcmFtcz4iPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgPFhEdE1ldGhvZDptZXRob2RDb21tZW50IG5vLWNvbW1lbnQtc2lnbnM9InRydWUiLz4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvWER0QW50VGFzazpmb3JBbGxBdHRyaWJ1dGVzPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8WER0QW50VGFzazpmb3JBbGxFbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9IjxYRHRBbnRUYXNrOmVsZW1lbnROYW1lLz4iIHR5cGU9IjxYRHRBbnRUYXNrOmVsZW1lbnRUeXBlLz4iPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbPFhEdE1ldGhvZDptZXRob2RDb21tZW50IG5vLWNvbW1lbnQtc2lnbnM9InRydWUiLz5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPFhEdENsYXNzOnB1c2hDbGFzcyB2YWx1ZT0iPFhEdEFudFRhc2s6ZWxlbWVudFR5cGUvPiI+CisgICAgICAgIDxYRHRBbnRUYXNrOmlmSGFzQXR0cmlidXRlcz4KKyAgICAgICAgPGF0dHJpYnV0ZXM+CisgICAgICAgICAgPFhEdEFudFRhc2s6Zm9yQWxsQXR0cmlidXRlcz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IjxYRHRNZXRob2Q6cHJvcGVydHlOYW1lLz4iIHR5cGU9IjxYRHRQYXJhbWV0ZXI6Zm9yQWxsTWV0aG9kUGFyYW1zPjxYRHRQYXJhbWV0ZXI6bWV0aG9kUGFyYW1UeXBlLz48L1hEdFBhcmFtZXRlcjpmb3JBbGxNZXRob2RQYXJhbXM+Ij4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICAgICAgPFhEdE1ldGhvZDptZXRob2RDb21tZW50IG5vLWNvbW1lbnQtc2lnbnM9InRydWUiLz4KKyAgICAgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICAgPC9YRHRBbnRUYXNrOmZvckFsbEF0dHJpYnV0ZXM+CisgICAgICAgIDwvYXR0cmlidXRlcz4KKyAgICAgICAgPC9YRHRBbnRUYXNrOmlmSGFzQXR0cmlidXRlcz4KKyAgICAgICAgPC9YRHRDbGFzczpwdXNoQ2xhc3M+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L1hEdEFudFRhc2s6Zm9yQWxsRWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICAgIDwvc3RydWN0dXJlPgorPC9kYXRhdHlwZT4KKworCmRpZmYgLS1naXQgYS90cnVuay9wcm9wb3NhbC94ZG9jcy90ZW1wbGF0ZXMvdHlwZV9kZWZhdWx0c19wcm9wZXJ0aWVzLnRlbXBsYXRlIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvdGVtcGxhdGVzL3R5cGVfZGVmYXVsdHNfcHJvcGVydGllcy50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFjZjcyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvcHJvcG9zYWwveGRvY3MvdGVtcGxhdGVzL3R5cGVfZGVmYXVsdHNfcHJvcGVydGllcy50ZW1wbGF0ZQpAQCAtMCwwICsxLDMgQEAKKzxYRHRUYWdEZWY6dGFnRGVmIG5hbWVzcGFjZT0iQW50IiBoYW5kbGVyPSJvcmcuYXBhY2hlLnRvb2xzLmFudC54ZG9jbGV0LkRhdGF0eXBlVGFnc0hhbmRsZXIiLz4KKzxYRHRBbnQ6Zm9yQWxsRGF0YXR5cGVzPjxYRHRBbnQ6dHlwZU5hbWUvPj08WER0Q2xhc3M6ZnVsbENsYXNzTmFtZS8+Cis8L1hEdEFudDpmb3JBbGxEYXRhdHlwZXM+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvYW50aWRvdGUvV0hBVC1JUy1USElTLVAgYi90cnVuay9zcmMvYW50aWRvdGUvV0hBVC1JUy1USElTLVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4NGFkNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9hbnRpZG90ZS9XSEFULUlTLVRISVMtUApAQCAtMCwwICsxLDYgQEAKK1RoaXMgL3VzZWQvIHRvIGJlIHRoZSBob21lIG9mIEFudGlkb3RlLCB0aGUgR1VJIGZvciBBbnQuIEl0IGhhcyBtb3ZlZAorKG9yIHJhdGhlciwgZ3JhZHVhdGUpIHRvIHRoZSBjdnMgbW9kdWxlIGFudC1hbnRpZG90ZSwgYW5kIG11c3QKK2JlIHJldHJpZXZlZCBzZXBhcmF0ZWx5IGZyb20gQW50LCBidXQgY2FuIGJlIGZvdW5kIGluIHRoZSBzYW1lIHBsYWNlIHlvdSBmb3VuZAorc291cmNlIHZlcnNpb24gb2YgQW50LgorCistLSBUaGUgQW50aWRvdGUgVGVhbSAtLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9hbnQtYmluLnd4cyBiL3RydW5rL3NyYy9ldGMvYW50LWJpbi53eHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1MGFhMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvYW50LWJpbi53eHMKQEAgLTAsMCArMSw0NjEgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBnZW5lcmF0ZWQgYnkgdGFsbG93LmV4ZQorCisgICAgIHRhbGxvdy5leGUgLWQgZGlzdC9saWIgLWQgZGlzdC9iaW4gLWQgZGlzdC9ldGMgLWQgZGlzdC9kb2NzIC1kYXYgLW5vbG9nbyA+IHNyYy9ldGMvYW50LWJpbi53eHMKKworICAgICBhZnRlciB0aGF0IEkndmUgcmVtb3ZlZCB0aGUgamF2YWRvY3MgKHRvbyBtYW55IGRpcmVjdG9yaWVzIEkKKyAgICAgd291bGQgaGF2ZSBoYWQgdG8gY3JlYXRlZCBHVUlEcyBmb3IpIGFkZGVkIEdVSURzLCBjaGFuZ2VkIHRoZQorICAgICB0b3AtbGV2ZWwgZGlyZWN0b3J5IHJlZmVyZW5jZSwgY2hhbmdlZCBpZCBvZiB0aGUgbWFudWFsCisgICAgIGRpcmVjdG9yeSwgcmVtb3ZlZCBpbmRleC5odG1sIGZyb20gaXQgYW5kIGZpbmFsbHkgbWFkZSB0aGUgRmlsZQorICAgICBlbnRyaWVzIHZhbGlkIGJ5IGFkZGluZyBEaXNrSWQgYXR0cmlidXRlcy4KKworICAgICBZZXMsIHdlIG5lZWQgYSB0YXNrIHRvIGF1dG9tYXRlIHRoaXMuCistLT4KKzxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDMvMDEvd2kiPgorICA8RnJhZ21lbnQ+CisgICAgPERpcmVjdG9yeVJlZiBJZD0iSU5TVEFMTERJUiI+CisgICAgICA8RGlyZWN0b3J5IElkPSJkaXJlY3RvcnkwIiBOYW1lPSJsaWIiPgorICAgICAgICA8Q29tcG9uZW50IElkPSJjb21wb25lbnQwIiBEaXNrSWQ9IjEiIEd1aWQ9IkYwRDlFREJBLTRDRTMtNDY2MC1BODI2LUExOTdCNTk4REUzMSI+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTAiIE5hbWU9IkFOVC1BTl8xLkpBUiIgTG9uZ05hbWU9ImFudC1hbnRsci5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtYW50bHIuamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxIiBOYW1lPSJBTkZBRkJfMS5KQVIiIExvbmdOYW1lPSJhbnQtYXBhY2hlLWJjZWwuamFyIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9saWJcYW50LWFwYWNoZS1iY2VsLmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMiIgTmFtZT0iQU5EODczXzEuSkFSIiBMb25nTmFtZT0iYW50LWFwYWNoZS1ic2YuamFyIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9saWJcYW50LWFwYWNoZS1ic2YuamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUzIiBOYW1lPSJBTlQtQVBfNC5KQVIiIExvbmdOYW1lPSJhbnQtYXBhY2hlLWxvZzRqLmphciIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvbGliXGFudC1hcGFjaGUtbG9nNGouamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0IiBOYW1lPSJBTlQtQVBfMy5KQVIiIExvbmdOYW1lPSJhbnQtYXBhY2hlLW9yby5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtYXBhY2hlLW9yby5qYXIiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUiIE5hbWU9IkFOVC1BUF8xLkpBUiIgTG9uZ05hbWU9ImFudC1hcGFjaGUtcmVnZXhwLmphciIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvbGliXGFudC1hcGFjaGUtcmVnZXhwLmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNiIgTmFtZT0iQU5ULUFQXzIuSkFSIiBMb25nTmFtZT0iYW50LWFwYWNoZS1yZXNvbHZlci5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtYXBhY2hlLXJlc29sdmVyLmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNyIgTmFtZT0iQU5ULUNPXzEuSkFSIiBMb25nTmFtZT0iYW50LWNvbW1vbnMtbG9nZ2luZy5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtY29tbW9ucy1sb2dnaW5nLmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlOCIgTmFtZT0iQU5ULUNPXzIuSkFSIiBMb25nTmFtZT0iYW50LWNvbW1vbnMtbmV0LmphciIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvbGliXGFudC1jb21tb25zLW5ldC5qYXIiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTkiIE5hbWU9ImFudC1qYWkuamFyIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9saWJcYW50LWphaS5qYXIiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEwIiBOYW1lPSJBTlQtSkFfMS5KQVIiIExvbmdOYW1lPSJhbnQtamF2YW1haWwuamFyIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9saWJcYW50LWphdmFtYWlsLmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTEiIE5hbWU9IkFOVC1KRF8xLkpBUiIgTG9uZ05hbWU9ImFudC1qZGVwZW5kLmphciIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvbGliXGFudC1qZGVwZW5kLmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTIiIE5hbWU9ImFudC1qbWYuamFyIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9saWJcYW50LWptZi5qYXIiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEzIiBOYW1lPSJhbnQtanNjaC5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtanNjaC5qYXIiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTE0IiBOYW1lPSJBTlQtSlVfMS5KQVIiIExvbmdOYW1lPSJhbnQtanVuaXQuamFyIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9saWJcYW50LWp1bml0LmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTUiIE5hbWU9IkFOVC1MQV8xLkpBUiIgTG9uZ05hbWU9ImFudC1sYXVuY2hlci5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtbGF1bmNoZXIuamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxNiIgTmFtZT0iQU5ULU5FXzEuSkFSIiBMb25nTmFtZT0iYW50LW5ldHJleHguamFyIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9saWJcYW50LW5ldHJleHguamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxNyIgTmFtZT0iQU5ULU5PXzEuSkFSIiBMb25nTmFtZT0iYW50LW5vZGVwcy5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtbm9kZXBzLmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTgiIE5hbWU9IkFOVC1TVF8yLkpBUiIgTG9uZ05hbWU9ImFudC1zdGFydGVhbS5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtc3RhcnRlYW0uamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxOSIgTmFtZT0iQU5ULVNUXzEuSkFSIiBMb25nTmFtZT0iYW50LXN0eWxlYm9vay5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtc3R5bGVib29rLmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMjAiIE5hbWU9IkFOVC1TV18xLkpBUiIgTG9uZ05hbWU9ImFudC1zd2luZy5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlxhbnQtc3dpbmcuamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUyMSIgTmFtZT0iYW50LXRyYXguamFyIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9saWJcYW50LXRyYXguamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUyMiIgTmFtZT0iQU5ULVdFXzEuSkFSIiBMb25nTmFtZT0iYW50LXdlYmxvZ2ljLmphciIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvbGliXGFudC13ZWJsb2dpYy5qYXIiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTIzIiBOYW1lPSJBTlQtWEFfMS5KQVIiIExvbmdOYW1lPSJhbnQteGFsYW4xLmphciIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvbGliXGFudC14YWxhbjEuamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUyNCIgTmFtZT0iYW50LmphciIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvbGliXGFudC5qYXIiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTI1IiBOYW1lPSJMSUJSQVJfMS5QUk8iIExvbmdOYW1lPSJsaWJyYXJpZXMucHJvcGVydGllcyIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvbGliXGxpYnJhcmllcy5wcm9wZXJ0aWVzIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUyNiIgTmFtZT0iUkVBRE1FIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9saWJcUkVBRE1FIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUyNyIgTmFtZT0iWEVSQ0VTXzEuSkFSIiBMb25nTmFtZT0ieGVyY2VzSW1wbC5qYXIiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2xpYlx4ZXJjZXNJbXBsLmphciIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMjgiIE5hbWU9InhtbC1hcGlzLmphciIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvbGliXHhtbC1hcGlzLmphciIgLz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICA8L0RpcmVjdG9yeT4KKyAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTEiIE5hbWU9ImJpbiI+CisgICAgICAgIDxDb21wb25lbnQgSWQ9ImNvbXBvbmVudDEiIERpc2tJZD0iMSIgR3VpZD0iQjFDOTNFQkQtOTZCOC00NmM4LTlDQkQtMjQ2Q0I4OTY0Rjg5Ij4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMjkiIE5hbWU9ImFudCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvYmluXGFudCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMzAiIE5hbWU9ImFudC5iYXQiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2JpblxhbnQuYmF0IiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUzMSIgTmFtZT0iYW50LmNtZCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvYmluXGFudC5jbWQiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTMyIiBOYW1lPSJhbnRlbnYuY21kIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9iaW5cYW50ZW52LmNtZCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMzMiIE5hbWU9ImFudFJ1biIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvYmluXGFudFJ1biIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMzQiIE5hbWU9ImFudFJ1bi5iYXQiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2JpblxhbnRSdW4uYmF0IiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUzNSIgTmFtZT0iYW50UnVuLnBsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9iaW5cYW50UnVuLnBsIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUzNiIgTmFtZT0iQ09NUExFXzEuUEwiIExvbmdOYW1lPSJjb21wbGV0ZS1hbnQtY21kLnBsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9iaW5cY29tcGxldGUtYW50LWNtZC5wbCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMzciIE5hbWU9ImVudnNldC5jbWQiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2JpblxlbnZzZXQuY21kIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUzOCIgTmFtZT0ibGNwLmJhdCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvYmluXGxjcC5iYXQiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTM5IiBOYW1lPSJydW5hbnQucGwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2JpblxydW5hbnQucGwiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQwIiBOYW1lPSJydW5hbnQucHkiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2JpblxydW5hbnQucHkiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQxIiBOYW1lPSJydW5yYy5jbWQiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2JpblxydW5yYy5jbWQiIC8+CisgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICA8RGlyZWN0b3J5IElkPSJkaXJlY3RvcnkyIiBOYW1lPSJkb2NzIj4KKyAgICAgICAgPENvbXBvbmVudCBJZD0iY29tcG9uZW50MiIgRGlza0lkPSIxIiBHdWlkPSIzQzRBNUQxOC03RDVGLTRkOTgtQjgxMC04M0VFM0VDNDc0NjgiPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MiIgTmFtZT0iQU5UTkVXXzEuSFRNIiBMb25nTmFtZT0iYW50bmV3cy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudG5ld3MuaHRtbCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDMiIE5hbWU9IkFOVF9JTl8xLkhUTSIgTG9uZ05hbWU9ImFudF9pbl9hbmdlci5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudF9pbl9hbmdlci5odG1sIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NCIgTmFtZT0iQU5UX1RBXzEuSFRNIiBMb25nTmFtZT0iYW50X3Rhc2tfZ3VpZGVsaW5lcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudF90YXNrX2d1aWRlbGluZXMuaHRtbCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDUiIE5hbWU9IkFQUEVORF8xLlBERiIgTG9uZ05hbWU9ImFwcGVuZGl4X2UucGRmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFwcGVuZGl4X2UucGRmIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NiIgTmFtZT0iQlJFQURDXzEuSlMiIExvbmdOYW1lPSJicmVhZGNydW1icy5qcyIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xicmVhZGNydW1icy5qcyIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDciIE5hbWU9IkJVR1NfMS5IVE0iIExvbmdOYW1lPSJidWdzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcYnVncy5odG1sIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0OCIgTmFtZT0iQllMQVdTXzEuSFRNIiBMb25nTmFtZT0iYnlsYXdzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcYnlsYXdzLmh0bWwiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ5IiBOYW1lPSJDT05UUklfMS5IVE0iIExvbmdOYW1lPSJjb250cmlidXRvcnMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xjb250cmlidXRvcnMuaHRtbCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTAiIE5hbWU9IkVYVEVSTl8xLkhUTSIgTG9uZ05hbWU9ImV4dGVybmFsLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcZXh0ZXJuYWwuaHRtbCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTEiIE5hbWU9IkZBUV8xLkhUTSIgTG9uZ05hbWU9ImZhcS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGZhcS5odG1sIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MiIgTmFtZT0iZmF2aWNvbi5pY28iIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcZmF2aWNvbi5pY28iIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUzIiBOYW1lPSJJTkRFWF8xLkhUTSIgTG9uZ05hbWU9ImluZGV4Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW5kZXguaHRtbCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTQiIE5hbWU9IkxFR0FMXzEuSFRNIiBMb25nTmFtZT0ibGVnYWwuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xsZWdhbC5odG1sIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NSIgTmFtZT0iTElDRU5TRSIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xMSUNFTlNFIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NiIgTmFtZT0iTElDRU5TXzEuSFRNIiBMb25nTmFtZT0ibGljZW5zZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGxpY2Vuc2UuaHRtbCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTciIE5hbWU9Ik1BSUxfMS5IVE0iIExvbmdOYW1lPSJtYWlsLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFpbC5odG1sIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OCIgTmFtZT0iTUlTU0lPXzEuSFRNIiBMb25nTmFtZT0ibWlzc2lvbi5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1pc3Npb24uaHRtbCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTkiIE5hbWU9InBhZ2UuY3NzIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXHBhZ2UuY3NzIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2MCIgTmFtZT0iUFJPQkxFXzEuSFRNIiBMb25nTmFtZT0icHJvYmxlbXMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xwcm9ibGVtcy5odG1sIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2MSIgTmFtZT0iUFJPSkVDXzEuSFRNIiBMb25nTmFtZT0icHJvamVjdHMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xwcm9qZWN0cy5odG1sIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2MiIgTmFtZT0iUkVTT1VSXzEuSFRNIiBMb25nTmFtZT0icmVzb3VyY2VzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NccmVzb3VyY2VzLmh0bWwiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTYzIiBOYW1lPSJTVk5fMS5IVE0iIExvbmdOYW1lPSJzdm4uaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xzdm4uaHRtbCIgLz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTMiIE5hbWU9ImFudDIiPgorICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImNvbXBvbmVudDMiIERpc2tJZD0iMSIgR3VpZD0iQjBCNDZFREEtMDc4Qy00MDQyLTgwMkQtMEZENDNFQ0M1MUVDIj4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2NCIgTmFtZT0iQUNUSU9OXzEuSFRNIiBMb25nTmFtZT0iYWN0aW9ubGlzdC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudDJcYWN0aW9ubGlzdC5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTY1IiBOYW1lPSJGRUFUVVJfMS5IVE0iIExvbmdOYW1lPSJmZWF0dXJlcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudDJcZmVhdHVyZXMuaHRtbCIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2NiIgTmFtZT0iRlVOQ1RJXzEuSFRNIiBMb25nTmFtZT0iRnVuY3Rpb25hbFJlcXVpcmVtZW50cy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudDJcRnVuY3Rpb25hbFJlcXVpcmVtZW50cy5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTY3IiBOYW1lPSJPUklHSU5fMS5IVE0iIExvbmdOYW1lPSJvcmlnaW5hbC1zcGVjaWZpY2F0aW9uLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcYW50MlxvcmlnaW5hbC1zcGVjaWZpY2F0aW9uLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNjgiIE5hbWU9IlJFUVVFU18xLkhUTSIgTG9uZ05hbWU9InJlcXVlc3RlZC1mZWF0dXJlcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudDJccmVxdWVzdGVkLWZlYXR1cmVzLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNjkiIE5hbWU9IlJFUVVFU18xLlRYVCIgTG9uZ05hbWU9InJlcXVlc3RlZC1mZWF0dXJlcy50eHQiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcYW50MlxyZXF1ZXN0ZWQtZmVhdHVyZXMudHh0IiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTcwIiBOYW1lPSJWRlMudHh0IiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudDJcVkZTLnR4dCIgLz4KKyAgICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTQiIE5hbWU9ImFudGxpYnMiPgorICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImNvbXBvbmVudDQiIERpc2tJZD0iMSIgR3VpZD0iM0E5NTVBNzctQjQwQy00ZmRmLTg5RjItMEI4RUQ3MUIzQzlCIj4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU3MSIgTmFtZT0iQ0hBUlRFXzEuSFRNIiBMb25nTmFtZT0iY2hhcnRlci5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudGxpYnNcY2hhcnRlci5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTcyIiBOYW1lPSJJTkRFWF8xLkhUTSIgTG9uZ05hbWU9ImluZGV4Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcYW50bGlic1xpbmRleC5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTczIiBOYW1lPSJQUk9QRVJfMS5IVE0iIExvbmdOYW1lPSJwcm9wZXIuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xhbnRsaWJzXHByb3Blci5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTc0IiBOYW1lPSJTQU5EQk9fMS5IVE0iIExvbmdOYW1lPSJzYW5kYm94Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcYW50bGlic1xzYW5kYm94Lmh0bWwiIC8+CisgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgICAgPERpcmVjdG9yeSBJZD0iZGlyZWN0b3J5NSIgTmFtZT0iYW50dW5pdCI+CisgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJjb21wb25lbnQ1IiBEaXNrSWQ9IjEiIEd1aWQ9IjAwMUVDMTU3LTE5NzEtNDM3MS05MUQxLTY3NDM4MTQ4QkU0RiI+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU3NSIgTmFtZT0iSU5ERVhfMS5IVE0iIExvbmdOYW1lPSJpbmRleC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudGxpYnNcYW50dW5pdFxpbmRleC5odG1sIiAvPgorICAgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICAgICAgPERpcmVjdG9yeSBJZD0iZGlyZWN0b3J5NiIgTmFtZT0iZG90bmV0Ij4KKyAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImNvbXBvbmVudDYiIERpc2tJZD0iMSIgR3VpZD0iOTQ2MzI0RDEtN0EwOC00MjliLTk4NjYtQzg4QTdBRkVDMzRCIj4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTc2IiBOYW1lPSJJTkRFWF8xLkhUTSIgTG9uZ05hbWU9ImluZGV4Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcYW50bGlic1xkb3RuZXRcaW5kZXguaHRtbCIgLz4KKyAgICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICAgIDwvRGlyZWN0b3J5PgorICAgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTciIE5hbWU9InN2biI+CisgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJjb21wb25lbnQ3IiBEaXNrSWQ9IjEiIEd1aWQ9IjkyMDY5QkZFLTAwOTUtNDU3MC1BNDlGLTNBRkEyQTM3QzY1QSI+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU3NyIgTmFtZT0iSU5ERVhfMS5IVE0iIExvbmdOYW1lPSJpbmRleC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGFudGxpYnNcc3ZuXGluZGV4Lmh0bWwiIC8+CisgICAgICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgICAgICA8L0RpcmVjdG9yeT4KKyAgICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTgiIE5hbWU9ImltYWdlcyI+CisgICAgICAgICAgPENvbXBvbmVudCBJZD0iY29tcG9uZW50OCIgRGlza0lkPSIxIiBHdWlkPSJDRDc3QkEyRC1CQzg2LTRkZmEtOURCMy1FRDFBMTNGMUM3NDIiPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTc4IiBOYW1lPSJhbnRfbG9nby5pY28iIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXGFudF9sb2dvLmljbyIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU3OSIgTmFtZT0iQU5UX0xPXzMuR0lGIiBMb25nTmFtZT0iYW50X2xvZ29fbGFyZ2UuZ2lmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGltYWdlc1xhbnRfbG9nb19sYXJnZS5naWYiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlODAiIE5hbWU9IkFOVF9MT18xLkdJRiIgTG9uZ05hbWU9ImFudF9sb2dvX21lZGl1bS5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXGFudF9sb2dvX21lZGl1bS5naWYiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlODEiIE5hbWU9IkFOVF9MT18yLkdJRiIgTG9uZ05hbWU9ImFudF9sb2dvX3NtYWxsLmdpZiIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xpbWFnZXNcYW50X2xvZ29fc21hbGwuZ2lmIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTgyIiBOYW1lPSJiZXRhLnBuZyIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xpbWFnZXNcYmV0YS5wbmciIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlODMiIE5hbWU9ImN1cnJlbnQuZ2lmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGltYWdlc1xjdXJyZW50LmdpZiIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU4NCIgTmFtZT0iR1JPVVAtXzEuR0lGIiBMb25nTmFtZT0iZ3JvdXAtbG9nby5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXGdyb3VwLWxvZ28uZ2lmIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTg1IiBOYW1lPSJKREpFRElfMS5KUEciIExvbmdOYW1lPSJKREpFZGl0b3JzQ2hvaWNlQXdhcmQuanBnIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGltYWdlc1xKREpFZGl0b3JzQ2hvaWNlQXdhcmQuanBnIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTg2IiBOYW1lPSJKUF9SQ1dfMS5HSUYiIExvbmdOYW1lPSJqcF9yY3dpbm5lcl8yMDAzLmdpZiIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xpbWFnZXNcanBfcmN3aW5uZXJfMjAwMy5naWYiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlODciIE5hbWU9IkpXX0VDX18yLkdJRiIgTG9uZ05hbWU9Imp3X2VjX2xvZ29fd2lubmVyMjAwMi5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXGp3X2VjX2xvZ29fd2lubmVyMjAwMi5naWYiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlODgiIE5hbWU9IkpXX0VDX18xLkdJRiIgTG9uZ05hbWU9Imp3X2VjX2xvZ29fd2lubmVyMjAwMy5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXGp3X2VjX2xvZ29fd2lubmVyMjAwMy5naWYiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlODkiIE5hbWU9ImxhYmVsLmdpZiIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xpbWFnZXNcbGFiZWwuZ2lmIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTkwIiBOYW1lPSJNRU5VLUxfMS5HSUYiIExvbmdOYW1lPSJtZW51LWxlZnQuZ2lmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGltYWdlc1xtZW51LWxlZnQuZ2lmIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTkxIiBOYW1lPSJNRU5VLVJfMS5HSUYiIExvbmdOYW1lPSJtZW51LXJpZ2h0LmdpZiIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xpbWFnZXNcbWVudS1yaWdodC5naWYiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlOTIiIE5hbWU9InBhZ2UuZ2lmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGltYWdlc1xwYWdlLmdpZiIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU5MyIgTmFtZT0icHJpbnRlci5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXHByaW50ZXIuZ2lmIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTk0IiBOYW1lPSJQUk9KRUNfMS5HSUYiIExvbmdOYW1lPSJwcm9qZWN0LWxvZ28uZ2lmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGltYWdlc1xwcm9qZWN0LWxvZ28uZ2lmIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTk1IiBOYW1lPSJTRE1fUFJfMS5HSUYiIExvbmdOYW1lPSJzZG1fcHJvZHVjdGl2aXR5X2F3YXJkLmdpZiIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xpbWFnZXNcc2RtX3Byb2R1Y3Rpdml0eV9hd2FyZC5naWYiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlOTYiIE5hbWU9IlNFQVJDSF8xLkdJRiIgTG9uZ05hbWU9InNlYXJjaC1sZWZ0LmdpZiIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xpbWFnZXNcc2VhcmNoLWxlZnQuZ2lmIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTk3IiBOYW1lPSJTRUFSQ0hfMi5HSUYiIExvbmdOYW1lPSJzZWFyY2gtcmlnaHQuZ2lmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGltYWdlc1xzZWFyY2gtcmlnaHQuZ2lmIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTk4IiBOYW1lPSJzcGFjZXIuZ2lmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXGltYWdlc1xzcGFjZXIuZ2lmIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTk5IiBOYW1lPSJ0YWItbGVmdC5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXHRhYi1sZWZ0LmdpZiIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxMDAiIE5hbWU9IlRBQi1SSV8xLkdJRiIgTG9uZ05hbWU9InRhYi1yaWdodC5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXHRhYi1yaWdodC5naWYiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTAxIiBOYW1lPSJUQUJTRUxfMS5HSUYiIExvbmdOYW1lPSJ0YWJTZWwtbGVmdC5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXHRhYlNlbC1sZWZ0LmdpZiIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxMDIiIE5hbWU9IlRBQlNFTF8yLkdJRiIgTG9uZ05hbWU9InRhYlNlbC1yaWdodC5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcaW1hZ2VzXHRhYlNlbC1yaWdodC5naWYiIC8+CisgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDwvRGlyZWN0b3J5PgorICAgICAgICA8RGlyZWN0b3J5IElkPSJtYW51YWwiIE5hbWU9Im1hbnVhbCI+CisgICAgICAgICAgPENvbXBvbmVudCBJZD0iY29tcG9uZW50OSIgRGlza0lkPSIxIiBHdWlkPSI3NTEyMTIxNy03NzBGLTRhMzgtOTdGQy04RjQ0Nzc5QUNBOUMiPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEwMyIgTmFtZT0iQU5URVhUXzEuSFRNIiBMb25nTmFtZT0iYW50ZXh0ZXJuYWwuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcYW50ZXh0ZXJuYWwuaHRtbCIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxMDQiIE5hbWU9IkFOVFRBU18xLkhUTSIgTG9uZ05hbWU9ImFudHRhc2tzbGlzdC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxhbnR0YXNrc2xpc3QuaHRtbCIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxMDUiIE5hbWU9IkJBU0VfVF8xLkhUTSIgTG9uZ05hbWU9ImJhc2VfdGFza19jbGFzc2VzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXGJhc2VfdGFza19jbGFzc2VzLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTA2IiBOYW1lPSJDTE9ORVZfMS5IVE0iIExvbmdOYW1lPSJjbG9uZXZtLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXGNsb25ldm0uaHRtbCIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxMDciIE5hbWU9IkNPTkNFUF8xLkhUTSIgTG9uZ05hbWU9ImNvbmNlcHRzdHlwZXNsaXN0Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXGNvbmNlcHRzdHlwZXNsaXN0Lmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTA4IiBOYW1lPSJDT1JFVEFfMS5IVE0iIExvbmdOYW1lPSJjb3JldGFza2xpc3QuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcY29yZXRhc2tsaXN0Lmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTA5IiBOYW1lPSJDT1ZFUl8xLkhUTSIgTG9uZ05hbWU9ImNvdmVyLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXGNvdmVyLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTEwIiBOYW1lPSJDUkVESVRfMS5IVE0iIExvbmdOYW1lPSJjcmVkaXRzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXGNyZWRpdHMuaHRtbCIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxMTEiIE5hbWU9IkRFVkVMT18xLkhUTSIgTG9uZ05hbWU9ImRldmVsb3AuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcZGV2ZWxvcC5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTExMiIgTmFtZT0iREVWRUxPXzIuSFRNIiBMb25nTmFtZT0iZGV2ZWxvcGxpc3QuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcZGV2ZWxvcGxpc3QuaHRtbCIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxMTMiIE5hbWU9IkRJUlRBU18xLkhUTSIgTG9uZ05hbWU9ImRpcnRhc2tzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXGRpcnRhc2tzLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTE0IiBOYW1lPSJmYXZpY29uLmljbyIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcZmF2aWNvbi5pY28iIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTE1IiBOYW1lPSJGRUVEQkFfMS5IVE0iIExvbmdOYW1lPSJmZWVkYmFjay5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxmZWVkYmFjay5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTExNiIgTmFtZT0iSURFXzEuSFRNIiBMb25nTmFtZT0iaWRlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXGlkZS5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTExOCIgTmFtZT0iSU5QVVRIXzEuSFRNIiBMb25nTmFtZT0iaW5wdXRoYW5kbGVyLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXGlucHV0aGFuZGxlci5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTExOSIgTmFtZT0iSU5TVEFMXzEuSFRNIiBMb25nTmFtZT0iaW5zdGFsbC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxpbnN0YWxsLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTIwIiBOYW1lPSJJTlNUQUxfMi5IVE0iIExvbmdOYW1lPSJpbnN0YWxsbGlzdC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxpbnN0YWxsbGlzdC5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEyMSIgTmFtZT0iSU5UUk9fMS5IVE0iIExvbmdOYW1lPSJpbnRyby5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxpbnRyby5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEyMiIgTmFtZT0iSkFWQUNQXzEuSFRNIiBMb25nTmFtZT0iamF2YWNwcm9wcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxqYXZhY3Byb3BzLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTIzIiBOYW1lPSJMSUNFTlNFIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxMSUNFTlNFIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEyNCIgTmFtZT0iTElTVEVOXzEuSFRNIiBMb25nTmFtZT0ibGlzdGVuZXJzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXGxpc3RlbmVycy5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEyNSIgTmFtZT0iT1BUSU9OXzEuSFRNIiBMb25nTmFtZT0ib3B0aW9uYWx0YXNrbGlzdC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxvcHRpb25hbHRhc2tsaXN0Lmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTI2IiBOYW1lPSJQTEFURk9fMS5IVE0iIExvbmdOYW1lPSJwbGF0Zm9ybS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxwbGF0Zm9ybS5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEyNyIgTmFtZT0iUFJPWFlfMS5IVE0iIExvbmdOYW1lPSJwcm94eS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxwcm94eS5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEyOCIgTmFtZT0iUlVOTklOXzIuSFRNIiBMb25nTmFtZT0icnVubmluZy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxydW5uaW5nLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTI5IiBOYW1lPSJSVU5OSU5fMS5IVE0iIExvbmdOYW1lPSJydW5uaW5nbGlzdC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxydW5uaW5nbGlzdC5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEzMCIgTmFtZT0iU1lTQ0xBXzEuSFRNIiBMb25nTmFtZT0ic3lzY2xhc3NwYXRoLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXHN5c2NsYXNzcGF0aC5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEzMSIgTmFtZT0iVEFTS1NPXzEuSFRNIiBMb25nTmFtZT0idGFza3NvdmVydmlldy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFx0YXNrc292ZXJ2aWV3Lmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTMyIiBOYW1lPSJUT0NfMS5IVE0iIExvbmdOYW1lPSJ0b2MuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcdG9jLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTMzIiBOYW1lPSJUVVRPUklfMS5IVE0iIExvbmdOYW1lPSJ0dXRvcmlhbC1IZWxsb1dvcmxkV2l0aEFudC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFx0dXRvcmlhbC1IZWxsb1dvcmxkV2l0aEFudC5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEzNCIgTmFtZT0iVFVUT1JJXzMuSFRNIiBMb25nTmFtZT0idHV0b3JpYWwtdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFx0dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLmh0bWwiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTM1IiBOYW1lPSJUVVRPUklfMS5aSVAiIExvbmdOYW1lPSJ0dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLnppcCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcdHV0b3JpYWwtdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy56aXAiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMTM2IiBOYW1lPSJUVVRPUklfMi5aSVAiIExvbmdOYW1lPSJ0dXRvcmlhbC13cml0aW5nLXRhc2tzLXNyYy56aXAiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXHR1dG9yaWFsLXdyaXRpbmctdGFza3Mtc3JjLnppcCIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGUxMzciIE5hbWU9IlRVVE9SSV8yLkhUTSIgTG9uZ05hbWU9InR1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcdHV0b3JpYWwtd3JpdGluZy10YXNrcy5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEzOCIgTmFtZT0iVVNJTkdfMS5IVE0iIExvbmdOYW1lPSJ1c2luZy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFx1c2luZy5odG1sIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTEzOSIgTmFtZT0iVVNJTkdMXzEuSFRNIiBMb25nTmFtZT0idXNpbmdsaXN0Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXHVzaW5nbGlzdC5odG1sIiAvPgorICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTg5IiBOYW1lPSJDT1JFVEFfMSIgTG9uZ05hbWU9IkNvcmVUYXNrcyI+CisgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJjb21wb25lbnQ4NiIgRGlza0lkPSIxIiBHdWlkPSI1ODUzRjlDRC04QjM0LTQxMGQtODBERC05NTk1QzlFQTlBQjUiPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlMzk5IiBOYW1lPSJBTlRfMS5IVE0iIExvbmdOYW1lPSJhbnQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGFudC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDAwIiBOYW1lPSJBTlRDQUxfMS5IVE0iIExvbmdOYW1lPSJhbnRjYWxsLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xhbnRjYWxsLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MDEiIE5hbWU9IkFOVFNUUl8xLkhUTSIgTG9uZ05hbWU9ImFudHN0cnVjdHVyZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcYW50c3RydWN0dXJlLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MDIiIE5hbWU9IkFQUExZXzEuSFRNIiBMb25nTmFtZT0iYXBwbHkuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGFwcGx5Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MDMiIE5hbWU9IkFQVF8xLkhUTSIgTG9uZ05hbWU9ImFwdC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcYXB0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MDQiIE5hbWU9IkFWQUlMQV8xLkhUTSIgTG9uZ05hbWU9ImF2YWlsYWJsZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcYXZhaWxhYmxlLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MDUiIE5hbWU9IkJBU0VOQV8xLkhUTSIgTG9uZ05hbWU9ImJhc2VuYW1lLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xiYXNlbmFtZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDA2IiBOYW1lPSJCVUlMRE5fMS5IVE0iIExvbmdOYW1lPSJidWlsZG51bWJlci5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcYnVpbGRudW1iZXIuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQwNyIgTmFtZT0iQ0hBTkdFXzEuSFRNIiBMb25nTmFtZT0iY2hhbmdlbG9nLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xjaGFuZ2Vsb2cuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQwOCIgTmFtZT0iQ0hFQ0tTXzEuSFRNIiBMb25nTmFtZT0iY2hlY2tzdW0uaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGNoZWNrc3VtLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MDkiIE5hbWU9IkNITU9EXzEuSFRNIiBMb25nTmFtZT0iY2htb2QuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGNobW9kLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MTAiIE5hbWU9IkNPTU1PTl8xLkhUTSIgTG9uZ05hbWU9ImNvbW1vbi5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcY29tbW9uLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MTEiIE5hbWU9IkNPTkNBVF8xLkhUTSIgTG9uZ05hbWU9ImNvbmNhdC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcY29uY2F0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MTIiIE5hbWU9IkNPTkRJVF8xLkhUTSIgTG9uZ05hbWU9ImNvbmRpdGlvbi5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcY29uZGl0aW9uLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MTMiIE5hbWU9IkNPTkRJVF8yLkhUTSIgTG9uZ05hbWU9ImNvbmRpdGlvbnMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGNvbmRpdGlvbnMuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQxNCIgTmFtZT0iQ09QWV8xLkhUTSIgTG9uZ05hbWU9ImNvcHkuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGNvcHkuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQxNSIgTmFtZT0iQ09QWURJXzEuSFRNIiBMb25nTmFtZT0iY29weWRpci5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcY29weWRpci5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDE2IiBOYW1lPSJDT1BZRklfMS5IVE0iIExvbmdOYW1lPSJjb3B5ZmlsZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcY29weWZpbGUuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQxNyIgTmFtZT0iQ1ZTXzEuSFRNIiBMb25nTmFtZT0iY3ZzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xjdnMuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQxOCIgTmFtZT0iQ1ZTUEFTXzEuSFRNIiBMb25nTmFtZT0iY3ZzcGFzcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcY3ZzcGFzcy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDE5IiBOYW1lPSJDVlNUQUdfMS5IVE0iIExvbmdOYW1lPSJjdnN0YWdkaWZmLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xjdnN0YWdkaWZmLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MjAiIE5hbWU9IkNWU1ZFUl8xLkhUTSIgTG9uZ05hbWU9ImN2c3ZlcnNpb24uaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGN2c3ZlcnNpb24uaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQyMSIgTmFtZT0iREVGQVVMXzEuSFRNIiBMb25nTmFtZT0iZGVmYXVsdGV4Y2x1ZGVzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xkZWZhdWx0ZXhjbHVkZXMuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQyMiIgTmFtZT0iREVMRVRFXzEuSFRNIiBMb25nTmFtZT0iZGVsZXRlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xkZWxldGUuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQyMyIgTmFtZT0iREVMVFJFXzEuSFRNIiBMb25nTmFtZT0iZGVsdHJlZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcZGVsdHJlZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDI0IiBOYW1lPSJERVBFTkRfMS5IVE0iIExvbmdOYW1lPSJkZXBlbmRzZXQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGRlcGVuZHNldC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDI1IiBOYW1lPSJESVJOQU1fMS5IVE0iIExvbmdOYW1lPSJkaXJuYW1lLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xkaXJuYW1lLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MjYiIE5hbWU9IkVBUl8xLkhUTSIgTG9uZ05hbWU9ImVhci5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcZWFyLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MjciIE5hbWU9IkVDSE9fMS5IVE0iIExvbmdOYW1lPSJlY2hvLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xlY2hvLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0MjgiIE5hbWU9IkVDSE9YTV8xLkhUTSIgTG9uZ05hbWU9ImVjaG94bWwuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGVjaG94bWwuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQyOSIgTmFtZT0iRVhFQ18xLkhUTSIgTG9uZ05hbWU9ImV4ZWMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGV4ZWMuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQzMCIgTmFtZT0iRkFJTF8xLkhUTSIgTG9uZ05hbWU9ImZhaWwuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGZhaWwuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQzMSIgTmFtZT0iRklMVEVSXzEuSFRNIiBMb25nTmFtZT0iZmlsdGVyLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xmaWx0ZXIuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQzMiIgTmFtZT0iRklYQ1JMXzEuSFRNIiBMb25nTmFtZT0iZml4Y3JsZi5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcZml4Y3JsZi5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDMzIiBOYW1lPSJHRU5LRVlfMS5IVE0iIExvbmdOYW1lPSJnZW5rZXkuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGdlbmtleS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDM0IiBOYW1lPSJHRVRfMS5IVE0iIExvbmdOYW1lPSJnZXQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGdldC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDM1IiBOYW1lPSJHVU5aSVBfMS5IVE0iIExvbmdOYW1lPSJndW56aXAuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGd1bnppcC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDM2IiBOYW1lPSJHWklQXzEuSFRNIiBMb25nTmFtZT0iZ3ppcC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcZ3ppcC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDM3IiBOYW1lPSJJTVBPUlRfMS5IVE0iIExvbmdOYW1lPSJpbXBvcnQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGltcG9ydC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDM4IiBOYW1lPSJJTlBVVF8xLkhUTSIgTG9uZ05hbWU9ImlucHV0Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xpbnB1dC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDM5IiBOYW1lPSJKQVJfMS5IVE0iIExvbmdOYW1lPSJqYXIuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXGphci5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDQwIiBOYW1lPSJKQVZBXzEuSFRNIiBMb25nTmFtZT0iamF2YS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcamF2YS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDQxIiBOYW1lPSJKQVZBQ18xLkhUTSIgTG9uZ05hbWU9ImphdmFjLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xqYXZhYy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDQyIiBOYW1lPSJKQVZBRE9fMS5IVE0iIExvbmdOYW1lPSJqYXZhZG9jLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xqYXZhZG9jLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NDMiIE5hbWU9IkxFTkdUSF8xLkhUTSIgTG9uZ05hbWU9Imxlbmd0aC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcbGVuZ3RoLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NDQiIE5hbWU9IkxJQlJBUl8xLkhUTSIgTG9uZ05hbWU9ImxpYnJhcmllcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcbGlicmFyaWVzLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NDUiIE5hbWU9IkxPQURGSV8xLkhUTSIgTG9uZ05hbWU9ImxvYWRmaWxlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xsb2FkZmlsZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDQ2IiBOYW1lPSJMT0FEUFJfMS5IVE0iIExvbmdOYW1lPSJsb2FkcHJvcGVydGllcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcbG9hZHByb3BlcnRpZXMuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ0NyIgTmFtZT0iTE9BRFJFXzEuSFRNIiBMb25nTmFtZT0ibG9hZHJlc291cmNlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xsb2FkcmVzb3VyY2UuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ0OCIgTmFtZT0iTUFDUk9EXzEuSFRNIiBMb25nTmFtZT0ibWFjcm9kZWYuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXG1hY3JvZGVmLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NDkiIE5hbWU9Ik1BSUxfMS5IVE0iIExvbmdOYW1lPSJtYWlsLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xtYWlsLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NTAiIE5hbWU9Ik1BS0VVUl8xLkhUTSIgTG9uZ05hbWU9Im1ha2V1cmwuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXG1ha2V1cmwuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ1MSIgTmFtZT0iTUFOSUZFXzEuSFRNIiBMb25nTmFtZT0ibWFuaWZlc3QuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXG1hbmlmZXN0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NTIiIE5hbWU9Ik1BTklGRV8yLkhUTSIgTG9uZ05hbWU9Im1hbmlmZXN0Y2xhc3NwYXRoLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xtYW5pZmVzdGNsYXNzcGF0aC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDUzIiBOYW1lPSJNS0RJUl8xLkhUTSIgTG9uZ05hbWU9Im1rZGlyLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xta2Rpci5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDU0IiBOYW1lPSJNT1ZFXzEuSFRNIiBMb25nTmFtZT0ibW92ZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcbW92ZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDU1IiBOYW1lPSJOSUNFXzEuSFRNIiBMb25nTmFtZT0ibmljZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcbmljZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDU2IiBOYW1lPSJQQUNLXzEuSFRNIiBMb25nTmFtZT0icGFjay5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NccGFjay5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDU3IiBOYW1lPSJQQVJBTExfMS5IVE0iIExvbmdOYW1lPSJwYXJhbGxlbC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NccGFyYWxsZWwuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ1OCIgTmFtZT0iUEFUQ0hfMS5IVE0iIExvbmdOYW1lPSJwYXRjaC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NccGF0Y2guaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ1OSIgTmFtZT0iUEFUSENPXzEuSFRNIiBMb25nTmFtZT0icGF0aGNvbnZlcnQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHBhdGhjb252ZXJ0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NjAiIE5hbWU9IlBSRVNFVF8xLkhUTSIgTG9uZ05hbWU9InByZXNldGRlZi5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NccHJlc2V0ZGVmLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NjEiIE5hbWU9IlBST1BFUl8xLkhUTSIgTG9uZ05hbWU9InByb3BlcnR5Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xwcm9wZXJ0eS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDYyIiBOYW1lPSJSRUNPUkRfMS5IVE0iIExvbmdOYW1lPSJyZWNvcmRlci5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NccmVjb3JkZXIuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ2MyIgTmFtZT0iUkVOQU1FXzEuSFRNIiBMb25nTmFtZT0icmVuYW1lLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xyZW5hbWUuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ2NCIgTmFtZT0iUkVQTEFDXzEuSFRNIiBMb25nTmFtZT0icmVwbGFjZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NccmVwbGFjZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDY1IiBOYW1lPSJSRVNPVVJfMS5IVE0iIExvbmdOYW1lPSJyZXNvdXJjZWNvdW50Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xyZXNvdXJjZWNvdW50Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NjYiIE5hbWU9IlJNSUNfMS5IVE0iIExvbmdOYW1lPSJybWljLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xybWljLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NjciIE5hbWU9IlNFUVVFTl8xLkhUTSIgTG9uZ05hbWU9InNlcXVlbnRpYWwuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHNlcXVlbnRpYWwuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ2OCIgTmFtZT0iU0lHTkpBXzEuSFRNIiBMb25nTmFtZT0ic2lnbmphci5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3Ncc2lnbmphci5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDY5IiBOYW1lPSJTTEVFUF8xLkhUTSIgTG9uZ05hbWU9InNsZWVwLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xzbGVlcC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDcwIiBOYW1lPSJTUUxfMS5IVE0iIExvbmdOYW1lPSJzcWwuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHNxbC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDcxIiBOYW1lPSJTVFlMRV8xLkhUTSIgTG9uZ05hbWU9InN0eWxlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1xzdHlsZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDcyIiBOYW1lPSJTVUJBTlRfMS5IVE0iIExvbmdOYW1lPSJzdWJhbnQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHN1YmFudC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDczIiBOYW1lPSJTWU5DXzEuSFRNIiBMb25nTmFtZT0ic3luYy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3Ncc3luYy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDc0IiBOYW1lPSJUQVJfMS5IVE0iIExvbmdOYW1lPSJ0YXIuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHRhci5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDc1IiBOYW1lPSJUQVNLREVfMS5IVE0iIExvbmdOYW1lPSJ0YXNrZGVmLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1x0YXNrZGVmLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0NzYiIE5hbWU9IlRFTVBGSV8xLkhUTSIgTG9uZ05hbWU9InRlbXBmaWxlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1x0ZW1wZmlsZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDc3IiBOYW1lPSJUT1VDSF8xLkhUTSIgTG9uZ05hbWU9InRvdWNoLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1x0b3VjaC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDc4IiBOYW1lPSJUU1RBTVBfMS5IVE0iIExvbmdOYW1lPSJ0c3RhbXAuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHRzdGFtcC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDc5IiBOYW1lPSJUWVBFREVfMS5IVE0iIExvbmdOYW1lPSJ0eXBlZGVmLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1x0eXBlZGVmLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0ODAiIE5hbWU9IlVOUEFDS18xLkhUTSIgTG9uZ05hbWU9InVucGFjay5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcdW5wYWNrLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0ODEiIE5hbWU9IlVOVEFSXzEuSFRNIiBMb25nTmFtZT0idW50YXIuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHVudGFyLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0ODIiIE5hbWU9IlVOWklQXzEuSFRNIiBMb25nTmFtZT0idW56aXAuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHVuemlwLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0ODMiIE5hbWU9IlVQVE9EQV8xLkhUTSIgTG9uZ05hbWU9InVwdG9kYXRlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1x1cHRvZGF0ZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDg0IiBOYW1lPSJXQUlURk9fMS5IVE0iIExvbmdOYW1lPSJ3YWl0Zm9yLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUYXNrc1x3YWl0Zm9yLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0ODUiIE5hbWU9IldBUl8xLkhUTSIgTG9uZ05hbWU9Indhci5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3Ncd2FyLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0ODYiIE5hbWU9IldISUNIUl8xLkhUTSIgTG9uZ05hbWU9IndoaWNocmVzb3VyY2UuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHdoaWNocmVzb3VyY2UuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ4NyIgTmFtZT0iWE1MUFJPXzEuSFRNIiBMb25nTmFtZT0ieG1scHJvcGVydHkuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVRhc2tzXHhtbHByb3BlcnR5Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0ODgiIE5hbWU9IlpJUF8xLkhUTSIgTG9uZ05hbWU9InppcC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVGFza3NcemlwLmh0bWwiIC8+CisgICAgICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgICAgICA8L0RpcmVjdG9yeT4KKyAgICAgICAgICA8RGlyZWN0b3J5IElkPSJkaXJlY3Rvcnk5MCIgTmFtZT0iQ09SRVRZXzEiIExvbmdOYW1lPSJDb3JlVHlwZXMiPgorICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iY29tcG9uZW50ODciIERpc2tJZD0iMSIgR3VpZD0iMkJEQzI1OTMtNzA1RS00OGMyLUJDODUtMjJCQjRBNEQyNDJDIj4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ4OSIgTmFtZT0iQU5UTElCXzEuSFRNIiBMb25nTmFtZT0iYW50bGliLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUeXBlc1xhbnRsaWIuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ5MCIgTmFtZT0iQVNTRVJUXzEuSFRNIiBMb25nTmFtZT0iYXNzZXJ0aW9ucy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVHlwZXNcYXNzZXJ0aW9ucy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDkxIiBOYW1lPSJDVVNUT01fMS5IVE0iIExvbmdOYW1lPSJjdXN0b20tcHJvZ3JhbW1pbmcuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVR5cGVzXGN1c3RvbS1wcm9ncmFtbWluZy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNDkyIiBOYW1lPSJERVNDUklfMS5IVE0iIExvbmdOYW1lPSJkZXNjcmlwdGlvbi5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVHlwZXNcZGVzY3JpcHRpb24uaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ5MyIgTmFtZT0iRElSU0VUXzEuSFRNIiBMb25nTmFtZT0iZGlyc2V0Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUeXBlc1xkaXJzZXQuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ5NCIgTmFtZT0iRklMRUxJXzEuSFRNIiBMb25nTmFtZT0iZmlsZWxpc3QuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVR5cGVzXGZpbGVsaXN0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0OTUiIE5hbWU9IkZJTEVTRV8xLkhUTSIgTG9uZ05hbWU9ImZpbGVzZXQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVR5cGVzXGZpbGVzZXQuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTQ5NiIgTmFtZT0iRklMVEVSXzEuSFRNIiBMb25nTmFtZT0iZmlsdGVyY2hhaW4uaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVR5cGVzXGZpbHRlcmNoYWluLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0OTciIE5hbWU9IkZJTFRFUl8yLkhUTSIgTG9uZ05hbWU9ImZpbHRlcnNldC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVHlwZXNcZmlsdGVyc2V0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0OTgiIE5hbWU9Ik1BUFBFUl8xLkhUTSIgTG9uZ05hbWU9Im1hcHBlci5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVHlwZXNcbWFwcGVyLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU0OTkiIE5hbWU9Ik5BTUVTUF8xLkhUTSIgTG9uZ05hbWU9Im5hbWVzcGFjZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVHlwZXNcbmFtZXNwYWNlLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MDAiIE5hbWU9IlBBVFRFUl8xLkhUTSIgTG9uZ05hbWU9InBhdHRlcm5zZXQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVR5cGVzXHBhdHRlcm5zZXQuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUwMSIgTmFtZT0iUEVSTUlTXzEuSFRNIiBMb25nTmFtZT0icGVybWlzc2lvbnMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVR5cGVzXHBlcm1pc3Npb25zLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MDIiIE5hbWU9IlBST1BFUl8xLkhUTSIgTG9uZ05hbWU9InByb3BlcnR5c2V0Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUeXBlc1xwcm9wZXJ0eXNldC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTAzIiBOYW1lPSJSRURJUkVfMS5IVE0iIExvbmdOYW1lPSJyZWRpcmVjdG9yLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUeXBlc1xyZWRpcmVjdG9yLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MDQiIE5hbWU9IlJFR0VYUF8xLkhUTSIgTG9uZ05hbWU9InJlZ2V4cC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVHlwZXNccmVnZXhwLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MDUiIE5hbWU9IlJFU09VUl8xLkhUTSIgTG9uZ05hbWU9InJlc291cmNlcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVHlwZXNccmVzb3VyY2VzLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MDYiIE5hbWU9IlNFTEVDVF8xLkhUTSIgTG9uZ05hbWU9InNlbGVjdG9ycy1wcm9ncmFtLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUeXBlc1xzZWxlY3RvcnMtcHJvZ3JhbS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTA3IiBOYW1lPSJTRUxFQ1RfMi5IVE0iIExvbmdOYW1lPSJzZWxlY3RvcnMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVR5cGVzXHNlbGVjdG9ycy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTA4IiBOYW1lPSJUQVJGSUxfMS5IVE0iIExvbmdOYW1lPSJ0YXJmaWxlc2V0Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXENvcmVUeXBlc1x0YXJmaWxlc2V0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MDkiIE5hbWU9IlhNTENBVF8xLkhUTSIgTG9uZ05hbWU9InhtbGNhdGFsb2cuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcQ29yZVR5cGVzXHhtbGNhdGFsb2cuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUxMCIgTmFtZT0iWklQRklMXzEuSFRNIiBMb25nTmFtZT0iemlwZmlsZXNldC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxDb3JlVHlwZXNcemlwZmlsZXNldC5odG1sIiAvPgorICAgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICAgICAgPERpcmVjdG9yeSBJZD0iZGlyZWN0b3J5OTEiIE5hbWU9IklOVEVHUl8xIiBMb25nTmFtZT0iSW50ZWdyYXRpb24iPgorICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iY29tcG9uZW50ODgiIERpc2tJZD0iMSIgR3VpZD0iQkJFODExNzgtNDk4NS00MTAwLUE0MEYtOUU4MkNGOTI5OUIyIj4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUxMSIgTmFtZT0iQU5USURPXzEuSFRNIiBMb25nTmFtZT0iQW50aWRvdGUuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcSW50ZWdyYXRpb25cQW50aWRvdGUuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUxMiIgTmFtZT0iYW50dG9vbDEuZ2lmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxJbnRlZ3JhdGlvblxhbnR0b29sMS5naWYiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MTMiIE5hbWU9IkpFWFQtUF8xLkhUTSIgTG9uZ05hbWU9ImpleHQtcGx1Z2luLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXEludGVncmF0aW9uXGpleHQtcGx1Z2luLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MTQiIE5hbWU9InJlbWFjYy5naWYiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXEludGVncmF0aW9uXHJlbWFjYy5naWYiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MTUiIE5hbWU9InRvb2xtZW51LmdpZiIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcSW50ZWdyYXRpb25cdG9vbG1lbnUuZ2lmIiAvPgorICAgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICAgICAgPERpcmVjdG9yeSBJZD0iZGlyZWN0b3J5OTIiIE5hbWU9Ik9QVElPTl8xIiBMb25nTmFtZT0iT3B0aW9uYWxUYXNrcyI+CisgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJjb21wb25lbnQ4OSIgRGlza0lkPSIxIiBHdWlkPSI4NUE1RTQzMC1GMzBDLTRjODktQjJENC0yNzU4REZBRDY4MUEiPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTE2IiBOYW1lPSJBTlRMUl8xLkhUTSIgTG9uZ05hbWU9ImFudGxyLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcYW50bHIuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUxNyIgTmFtZT0iQVRUUklCXzEuSFRNIiBMb25nTmFtZT0iYXR0cmliLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcYXR0cmliLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MTgiIE5hbWU9IkJPUkxBTl8xLkhUTSIgTG9uZ05hbWU9IkJvcmxhbmRFSkJUYXNrcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXEJvcmxhbmRFSkJUYXNrcy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTE5IiBOYW1lPSJCT1JMQU5fMi5IVE0iIExvbmdOYW1lPSJCb3JsYW5kR2VuZXJhdGVDbGllbnQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1xCb3JsYW5kR2VuZXJhdGVDbGllbnQuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUyMCIgTmFtZT0iQ0FCXzEuSFRNIiBMb25nTmFtZT0iY2FiLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcY2FiLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MjEiIE5hbWU9IkNDTV8xLkhUTSIgTG9uZ05hbWU9ImNjbS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGNjbS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTIyIiBOYW1lPSJDSEdSUF8xLkhUTSIgTG9uZ05hbWU9ImNoZ3JwLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcY2hncnAuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUyMyIgTmFtZT0iQ0hPV05fMS5IVE0iIExvbmdOYW1lPSJjaG93bi5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGNob3duLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MjQiIE5hbWU9IkNMRUFSQ18xLkhUTSIgTG9uZ05hbWU9ImNsZWFyY2FzZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGNsZWFyY2FzZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTI1IiBOYW1lPSJDU0NfMS5IVE0iIExvbmdOYW1lPSJjc2MuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1xjc2MuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUyNiIgTmFtZT0iREVQRU5EXzEuSFRNIiBMb25nTmFtZT0iZGVwZW5kLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcZGVwZW5kLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MjciIE5hbWU9IkRPVE5FVF8xLkhUTSIgTG9uZ05hbWU9ImRvdG5ldC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGRvdG5ldC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTI4IiBOYW1lPSJFQ0hPUFJfMS5IVE0iIExvbmdOYW1lPSJlY2hvcHJvcGVydGllcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGVjaG9wcm9wZXJ0aWVzLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MjkiIE5hbWU9IkVKQl8xLkhUTSIgTG9uZ05hbWU9ImVqYi5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGVqYi5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTMwIiBOYW1lPSJGVFBfMS5IVE0iIExvbmdOYW1lPSJmdHAuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1xmdHAuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTUzMSIgTmFtZT0iSUxBU01fMS5IVE0iIExvbmdOYW1lPSJpbGFzbS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGlsYXNtLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MzIiIE5hbWU9IklMREFTTV8xLkhUTSIgTG9uZ05hbWU9ImlsZGFzbS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGlsZGFzbS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTMzIiBOYW1lPSJJTUFHRS1fMS5HSUYiIExvbmdOYW1lPSJpbWFnZS1jbGFzc2RpYWdyYW0uZ2lmIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGltYWdlLWNsYXNzZGlhZ3JhbS5naWYiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MzQiIE5hbWU9IklNQUdFXzEuSFRNIiBMb25nTmFtZT0iaW1hZ2UuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1xpbWFnZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTM1IiBOYW1lPSJJTVBPUlRfMS5IVE0iIExvbmdOYW1lPSJpbXBvcnR0eXBlbGliLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcaW1wb3J0dHlwZWxpYi5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTM2IiBOYW1lPSJKQVJMSUJfMS5IVE0iIExvbmdOYW1lPSJqYXJsaWItYXZhaWxhYmxlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcamFybGliLWF2YWlsYWJsZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTM3IiBOYW1lPSJKQVJMSUJfMi5IVE0iIExvbmdOYW1lPSJqYXJsaWItZGlzcGxheS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGphcmxpYi1kaXNwbGF5Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1MzgiIE5hbWU9IkpBUkxJQl80LkhUTSIgTG9uZ05hbWU9ImphcmxpYi1tYW5pZmVzdC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGphcmxpYi1tYW5pZmVzdC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTM5IiBOYW1lPSJKQVJMSUJfMy5IVE0iIExvbmdOYW1lPSJqYXJsaWItcmVzb2x2ZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGphcmxpYi1yZXNvbHZlLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NDAiIE5hbWU9IkpBVkFDQ18xLkhUTSIgTG9uZ05hbWU9ImphdmFjYy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGphdmFjYy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTQxIiBOYW1lPSJKQVZBSF8xLkhUTSIgTG9uZ05hbWU9ImphdmFoLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcamF2YWguaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU0MiIgTmFtZT0iSkRFUEVOXzEuSFRNIiBMb25nTmFtZT0iamRlcGVuZC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGpkZXBlbmQuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU0MyIgTmFtZT0iSkpET0NfMS5IVE0iIExvbmdOYW1lPSJqamRvYy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGpqZG9jLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NDQiIE5hbWU9IkpKVFJFRV8xLkhUTSIgTG9uZ05hbWU9ImpqdHJlZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGpqdHJlZS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTQ1IiBOYW1lPSJKTElOS18xLkhUTSIgTG9uZ05hbWU9ImpsaW5rLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcamxpbmsuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU0NiIgTmFtZT0iSlBDT1ZFXzEuSFRNIiBMb25nTmFtZT0ianBjb3ZlcmFnZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGpwY292ZXJhZ2UuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU0NyIgTmFtZT0iSlNIQVJQXzEuSFRNIiBMb25nTmFtZT0ianNoYXJwYy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGpzaGFycGMuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU0OCIgTmFtZT0iSlNQQ18xLkhUTSIgTG9uZ05hbWU9ImpzcGMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1xqc3BjLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NDkiIE5hbWU9IkpVTklUXzEuSFRNIiBMb25nTmFtZT0ianVuaXQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1xqdW5pdC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTUwIiBOYW1lPSJKVU5JVFJfMS5IVE0iIExvbmdOYW1lPSJqdW5pdHJlcG9ydC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXGp1bml0cmVwb3J0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NTEiIE5hbWU9Ik1BVURJVF8xLkhUTSIgTG9uZ05hbWU9Im1hdWRpdC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXG1hdWRpdC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTUyIiBOYW1lPSJNSU1FTUFfMS5IVE0iIExvbmdOYW1lPSJtaW1lbWFpbC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXG1pbWVtYWlsLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NTMiIE5hbWU9Ik1NRVRSSV8xLkhUTSIgTG9uZ05hbWU9Im1tZXRyaWNzLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcbW1ldHJpY3MuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU1NCIgTmFtZT0iTVBBUlNFXzEuSFRNIiBMb25nTmFtZT0ibXBhcnNlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcbXBhcnNlLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NTUiIE5hbWU9Ik5BVElWRV8xLkhUTSIgTG9uZ05hbWU9Im5hdGl2ZTJhc2NpaS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXG5hdGl2ZTJhc2NpaS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTU2IiBOYW1lPSJORVRSRVhfMS5IVE0iIExvbmdOYW1lPSJuZXRyZXh4Yy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXG5ldHJleHhjLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NTciIE5hbWU9IlBFUkZPUl8xLkhUTSIgTG9uZ05hbWU9InBlcmZvcmNlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NccGVyZm9yY2UuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU1OCIgTmFtZT0iUFJPUEVSXzEuSFRNIiBMb25nTmFtZT0icHJvcGVydHlmaWxlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NccHJvcGVydHlmaWxlLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NTkiIE5hbWU9IlBWQ1NUQV8xLkhUTSIgTG9uZ05hbWU9InB2Y3N0YXNrLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NccHZjc3Rhc2suaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU2MCIgTmFtZT0iUkVOQU1FXzEuSFRNIiBMb25nTmFtZT0icmVuYW1lZXh0ZW5zaW9ucy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHJlbmFtZWV4dGVuc2lvbnMuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU2MSIgTmFtZT0iUkVQTEFDXzEuSFRNIiBMb25nTmFtZT0icmVwbGFjZXJlZ2V4cC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHJlcGxhY2VyZWdleHAuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU2MiIgTmFtZT0iUkVYRUNfMS5IVE0iIExvbmdOYW1lPSJyZXhlYy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHJleGVjLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NjMiIE5hbWU9IlJQTV8xLkhUTSIgTG9uZ05hbWU9InJwbS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHJwbS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTY0IiBOYW1lPSJTQ0hFTUFfMS5IVE0iIExvbmdOYW1lPSJzY2hlbWF2YWxpZGF0ZS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHNjaGVtYXZhbGlkYXRlLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NjUiIE5hbWU9IlNDUF8xLkhUTSIgTG9uZ05hbWU9InNjcC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHNjcC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTY2IiBOYW1lPSJTQ1JJUFRfMi5IVE0iIExvbmdOYW1lPSJzY3JpcHQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1xzY3JpcHQuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU2NyIgTmFtZT0iU0NSSVBUXzEuSFRNIiBMb25nTmFtZT0ic2NyaXB0ZGVmLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3Ncc2NyaXB0ZGVmLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NjgiIE5hbWU9IlNFUlZFUl8xLkhUTSIgTG9uZ05hbWU9InNlcnZlcmRlcGxveS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHNlcnZlcmRlcGxveS5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTY5IiBOYW1lPSJTRVRQUk9fMS5IVE0iIExvbmdOYW1lPSJzZXRwcm94eS5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHNldHByb3h5Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NzAiIE5hbWU9IlNPU18xLkhUTSIgTG9uZ05hbWU9InNvcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHNvcy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTcxIiBOYW1lPSJTT1VORF8xLkhUTSIgTG9uZ05hbWU9InNvdW5kLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3Ncc291bmQuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU3MiIgTmFtZT0iU1BMQVNIXzEuSFRNIiBMb25nTmFtZT0ic3BsYXNoLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3Ncc3BsYXNoLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NzMiIE5hbWU9IlNTSEVYRV8xLkhUTSIgTG9uZ05hbWU9InNzaGV4ZWMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1xzc2hleGVjLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NzQiIE5hbWU9IlNUQVJURV8xLkhUTSIgTG9uZ05hbWU9InN0YXJ0ZWFtLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3Ncc3RhcnRlYW0uaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU3NSIgTmFtZT0iU1RZTEVCXzEuSFRNIiBMb25nTmFtZT0ic3R5bGVib29rLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3Ncc3R5bGVib29rLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NzYiIE5hbWU9IlNZTUxJTl8xLkhUTSIgTG9uZ05hbWU9InN5bWxpbmsuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1xzeW1saW5rLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1NzciIE5hbWU9IlRFTE5FVF8xLkhUTSIgTG9uZ05hbWU9InRlbG5ldC5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHRlbG5ldC5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTc4IiBOYW1lPSJUUkFOU0xfMS5IVE0iIExvbmdOYW1lPSJ0cmFuc2xhdGUuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1x0cmFuc2xhdGUuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU3OSIgTmFtZT0iVkJDXzEuSFRNIiBMb25nTmFtZT0idmJjLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NcdmJjLmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1ODAiIE5hbWU9IlZTU18xLkhUTSIgTG9uZ05hbWU9InZzcy5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFRhc2tzXHZzcy5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTgxIiBOYW1lPSJXTEpTUENfMS5IVE0iIExvbmdOYW1lPSJ3bGpzcGMuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUYXNrc1x3bGpzcGMuaHRtbCIgLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU4MiIgTmFtZT0iV1NETFRPXzEuSFRNIiBMb25nTmFtZT0id3NkbHRvZG90bmV0Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3Ncd3NkbHRvZG90bmV0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1ODMiIE5hbWU9IlhNTFZBTF8xLkhUTSIgTG9uZ05hbWU9InhtbHZhbGlkYXRlLmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVGFza3NceG1sdmFsaWRhdGUuaHRtbCIgLz4KKyAgICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICAgIDwvRGlyZWN0b3J5PgorICAgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTkzIiBOYW1lPSJPUFRJT05fMiIgTG9uZ05hbWU9Ik9wdGlvbmFsVHlwZXMiPgorICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iY29tcG9uZW50OTAiIERpc2tJZD0iMSIgR3VpZD0iMDUwN0VENkEtNTBDRS00YzU4LUEwNDYtQjc0RTdDRkNCM0NBIj4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU4NCIgTmFtZT0iQ0xBU1NGXzEuSFRNIiBMb25nTmFtZT0iY2xhc3NmaWxlc2V0Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXE9wdGlvbmFsVHlwZXNcY2xhc3NmaWxlc2V0Lmh0bWwiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1ODUiIE5hbWU9IkVYVEVOU18yLkhUTSIgTG9uZ05hbWU9ImV4dGVuc2lvbi5odG1sIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9kb2NzXG1hbnVhbFxPcHRpb25hbFR5cGVzXGV4dGVuc2lvbi5odG1sIiAvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTg2IiBOYW1lPSJFWFRFTlNfMS5IVE0iIExvbmdOYW1lPSJleHRlbnNpb25zZXQuaHRtbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcT3B0aW9uYWxUeXBlc1xleHRlbnNpb25zZXQuaHRtbCIgLz4KKyAgICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICAgIDwvRGlyZWN0b3J5PgorICAgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTk0IiBOYW1lPSJTVFlMRVNfMSIgTG9uZ05hbWU9InN0eWxlc2hlZXRzIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImNvbXBvbmVudDkxIiBEaXNrSWQ9IjEiIEd1aWQ9IjRCMjVEMTU0LUNDMjUtNGY5My04RDM2LUJGMjNFNEMyOUYwNiI+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1ODciIE5hbWU9IkFOVE1BTl8xLkNTUyIgTG9uZ05hbWU9ImFudG1hbnVhbC5jc3MiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NcbWFudWFsXHN0eWxlc2hlZXRzXGFudG1hbnVhbC5jc3MiIC8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1ODgiIE5hbWU9InN0eWxlLmNzcyIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZG9jc1xtYW51YWxcc3R5bGVzaGVldHNcc3R5bGUuY3NzIiAvPgorICAgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICAgIDwvRGlyZWN0b3J5PgorICAgICAgICA8RGlyZWN0b3J5IElkPSJkaXJlY3Rvcnk5NSIgTmFtZT0icHJvamVjdHMiPgorICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImNvbXBvbmVudDkyIiBEaXNrSWQ9IjEiIEd1aWQ9IkZCMTQ5RTEwLThCN0YtNDIwNi1BQTUwLTg2OThDMDZCRUM2RSI+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTg5IiBOYW1lPSJJTkRFWF8xLkhUTSIgTG9uZ05hbWU9ImluZGV4Lmh0bWwiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3NccHJvamVjdHNcaW5kZXguaHRtbCIgLz4KKyAgICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTk2IiBOYW1lPSJ3ZWJ0ZXN0Ij4KKyAgICAgICAgICA8Q29tcG9uZW50IElkPSJjb21wb25lbnQ5MyIgRGlza0lkPSIxIiBHdWlkPSJBMjZCNDk5RS1FNTdGLTQ3ZTMtODhCMi02NkMxMjkzMzgzQkUiPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU5MCIgTmFtZT0iVEVTVEtFXzEiIExvbmdOYW1lPSJ0ZXN0a2V5c3RvcmUiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3Ncd2VidGVzdFx0ZXN0a2V5c3RvcmUiIC8+CisgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDwvRGlyZWN0b3J5PgorICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICA8RGlyZWN0b3J5IElkPSJkaXJlY3Rvcnk5NyIgTmFtZT0iZXRjIj4KKyAgICAgICAgPENvbXBvbmVudCBJZD0iY29tcG9uZW50OTQiIERpc2tJZD0iMSIgR3VpZD0iOTBCRDVBOTItREE2Mi00OGNlLTg3OTktODY4RTM4N0VDN0M4Ij4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTkxIiBOYW1lPSJBTlQtQk9fMS5KQVIiIExvbmdOYW1lPSJhbnQtYm9vdHN0cmFwLmphciIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXGFudC1ib290c3RyYXAuamFyIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OTIiIE5hbWU9IkNIQU5HRV8xLlhTTCIgTG9uZ05hbWU9ImNoYW5nZWxvZy54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xjaGFuZ2Vsb2cueHNsIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OTMiIE5hbWU9IkNPVkVSQV8xLlhTTCIgTG9uZ05hbWU9ImNvdmVyYWdlLWZyYW1lcy54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xjb3ZlcmFnZS1mcmFtZXMueHNsIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OTQiIE5hbWU9IkpERVBFTl8xLlhTTCIgTG9uZ05hbWU9ImpkZXBlbmQtZnJhbWVzLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXGpkZXBlbmQtZnJhbWVzLnhzbCIgLz4KKyAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTk1IiBOYW1lPSJqZGVwZW5kLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXGpkZXBlbmQueHNsIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OTYiIE5hbWU9IkpVTklULV8zLlhTTCIgTG9uZ05hbWU9Imp1bml0LWZyYW1lcy14YWxhbjEueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcanVuaXQtZnJhbWVzLXhhbGFuMS54c2wiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU5NyIgTmFtZT0iSlVOSVQtXzEuWFNMIiBMb25nTmFtZT0ianVuaXQtZnJhbWVzLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXGp1bml0LWZyYW1lcy54c2wiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU5OCIgTmFtZT0iSlVOSVQtXzIuWFNMIiBMb25nTmFtZT0ianVuaXQtbm9mcmFtZXMueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcanVuaXQtbm9mcmFtZXMueHNsIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OTkiIE5hbWU9ImxvZy54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xsb2cueHNsIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2MDAiIE5hbWU9Ik1BVURJVF8xLlhTTCIgTG9uZ05hbWU9Im1hdWRpdC1mcmFtZXMueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcbWF1ZGl0LWZyYW1lcy54c2wiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTYwMSIgTmFtZT0iTU1FVFJJXzEuWFNMIiBMb25nTmFtZT0ibW1ldHJpY3MtZnJhbWVzLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXG1tZXRyaWNzLWZyYW1lcy54c2wiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTYwMiIgTmFtZT0idGFnZGlmZi54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1x0YWdkaWZmLnhzbCIgLz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTk4IiBOYW1lPSJDSEVDS1NfMSIgTG9uZ05hbWU9ImNoZWNrc3R5bGUiPgorICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImNvbXBvbmVudDk1IiBEaXNrSWQ9IjEiIEd1aWQ9IjJBRUI1OUM3LTVDRUYtNDAxYy05QUI5LTkxMUI5OTVGMDBGQyI+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNjAzIiBOYW1lPSJDSEVDS1NfMS5YU0wiIExvbmdOYW1lPSJjaGVja3N0eWxlLWZyYW1lcy54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xjaGVja3N0eWxlXGNoZWNrc3R5bGUtZnJhbWVzLnhzbCIgLz4KKyAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2MDQiIE5hbWU9IkNIRUNLU18zLlhTTCIgTG9uZ05hbWU9ImNoZWNrc3R5bGUtdGV4dC54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xjaGVja3N0eWxlXGNoZWNrc3R5bGUtdGV4dC54c2wiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNjA1IiBOYW1lPSJDSEVDS1NfMi5YU0wiIExvbmdOYW1lPSJjaGVja3N0eWxlLXhkb2MueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcY2hlY2tzdHlsZVxjaGVja3N0eWxlLXhkb2MueHNsIiAvPgorICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICA8L0RpcmVjdG9yeT4KKyAgICAgIDwvRGlyZWN0b3J5PgorICAgIDwvRGlyZWN0b3J5UmVmPgorICA8L0ZyYWdtZW50PgorPC9XaXg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9hbnQtbXNpLnd4cyBiL3RydW5rL3NyYy9ldGMvYW50LW1zaS53eHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiNTllYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvYW50LW1zaS53eHMKQEAgLTAsMCArMSwxMjIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLQorICAgV2lYIEZpbGUgZGVzY3JpYmluZyB0aGUgTVNJIGZvciBBbnQKKyAgIAorICAgWFNEIGxpdmVzIGF0IGh0dHA6Ly93aXguY3ZzLnNvdXJjZWZvcmdlLm5ldC8qY2hlY2tvdXQqL3dpeC93aXgyLjAvc3JjL3dpeC9Yc2Qvd2l4LnhzZAorLS0+Cis8V2l4IHhtbG5zPSdodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpeC8yMDAzLzAxL3dpJz4KKworICA8UHJvZHVjdCBOYW1lPSJBcGFjaGUgQW50ICQodmFyLnZlcnNpb24pIgorICAgIElkPSI2MUE0MjFDRS1EOTNGLTQ3OGMtOThDOC05QzMxRkNFNDRDN0EiCisgICAgVmVyc2lvbj0iJCh2YXIudmVyc2lvbikiIExhbmd1YWdlPSIxMDMzIgorICAgIE1hbnVmYWN0dXJlcj0iQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iPgorCisgICAgPFBhY2thZ2UgSWQ9Jz8/Pz8/Pz8/LT8/Pz8tPz8/Py0/Pz8/LT8/Pz8/Pz8/Pz8/PycKKyAgICAgIEtleXdvcmRzPSdJbnN0YWxsZXInIExhbmd1YWdlcz0iMTAzMyIKKyAgICAgIERlc2NyaXB0aW9uPSJBcGFjaGUgQW50ICQodmFyLnZlcnNpb24pIGluc3RhbGxlciIKKyAgICAgIENvbW1lbnRzPSdBcGFjaGUgQW50IGlzIGEgSmF2YSBiYXNlZCBidWlsZCB0b29sJworICAgICAgTWFudWZhY3R1cmVyPSdBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbicKKyAgICAgIEluc3RhbGxlclZlcnNpb249JzIwMCcKKyAgICAgIENvbXByZXNzZWQ9J3llcycvPgorCisgICAgPE1lZGlhIElkPScxJyBDYWJpbmV0PSdhbnQuY2FiJyBFbWJlZENhYj0neWVzJyAvPgorCisgICAgPERpcmVjdG9yeSBJZD0nVEFSR0VURElSJyBOYW1lPSdTb3VyY2VEaXInPgorICAgICAgPERpcmVjdG9yeSBJZD0nUHJvZ3JhbUZpbGVzRm9sZGVyJyBOYW1lPSdQRmlsZXMnPgorICAgICAgICA8RGlyZWN0b3J5IElkPSdBU0YnIE5hbWU9J0FwYWNoZScKKyAgICAgICAgICBMb25nTmFtZT0iQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iPgorICAgICAgICAgIDxEaXJlY3RvcnkgSWQ9J0lOU1RBTExESVInIE5hbWU9J0FudCcKKyAgICAgICAgICAgIExvbmdOYW1lPSdBbnQgJCh2YXIudmVyc2lvbiknPgorCisgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJsaWNlbnNlcyIKKyAgICAgICAgICAgICAgR3VpZD0iMDkzNDZFQjMtMDhEMi00YTdmLTlENjQtNDdFNEU0MTRGRTY1Ij4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmV0Y2gueG1sIiBOYW1lPSJmZXRjaC54bWwiCisgICAgICAgICAgICAgICAgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZmV0Y2gueG1sIi8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9IklOU1RBTEwiIE5hbWU9IklOU1RBTEwiCisgICAgICAgICAgICAgICAgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvSU5TVEFMTCIvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJLRVlTIiBOYW1lPSJLRVlTIgorICAgICAgICAgICAgICAgIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL0tFWVMiLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iTElDRU5TRSIgTmFtZT0iTElDRU5TRSIKKyAgICAgICAgICAgICAgICBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9MSUNFTlNFIi8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9IkxJQ0VOU0UuZG9tIiBOYW1lPSJMSUNFTlNFLmRvbSIKKyAgICAgICAgICAgICAgICBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9MSUNFTlNFLmRvbSIvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJMSUNFTlNFLnNheCIgTmFtZT0iTElDRU5TRS5zYXgiCisgICAgICAgICAgICAgICAgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvTElDRU5TRS5zYXgiLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iTElDRU5TRS54ZXIiIE5hbWU9IkxJQ0VOU0UueGVyIgorICAgICAgICAgICAgICAgIExvbmdOYW1lPSJMSUNFTlNFLnhlcmNlcyIKKyAgICAgICAgICAgICAgICBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9MSUNFTlNFLnhlcmNlcyIvPgorICAgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJOT1RJQ0UiIE5hbWU9Ik5PVElDRSIKKyAgICAgICAgICAgICAgICBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9OT1RJQ0UiLz4KKyAgICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iUkVBRE1FIiBOYW1lPSJSRUFETUUiCisgICAgICAgICAgICAgICAgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvUkVBRE1FIi8+CisgICAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9IldIQVRTTkVXIiBOYW1lPSJXSEFUU05FVyIKKyAgICAgICAgICAgICAgICBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9XSEFUU05FVyIvPgorICAgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgICAgPC9EaXJlY3Rvcnk+CisgICAgICAgIDwvRGlyZWN0b3J5PgorICAgICAgPC9EaXJlY3Rvcnk+CisKKyAgICAgIDxEaXJlY3RvcnkgSWQ9IlByb2dyYW1NZW51Rm9sZGVyIiBOYW1lPSJQTWVudSIgTG9uZ05hbWU9IlByb2dyYW1zIj4KKyAgICAgICAgPERpcmVjdG9yeSBJZD0iUHJvZ3JhbU1lbnVEaXIiIE5hbWU9J0FudCcKKyAgICAgICAgICBMb25nTmFtZT0iQXBhY2hlIEFudCAkKHZhci52ZXJzaW9uKSIgLz4KKyAgICAgIDwvRGlyZWN0b3J5PgorCisgICAgPC9EaXJlY3Rvcnk+ICAKKyAgICAgICAgCisgICAgPEZlYXR1cmUgSWQ9IkNvbXBsZXRlIiBMZXZlbD0iMSI+CisgICAgICA8Q29tcG9uZW50UmVmIElkPSJtYW51YWxJbmRleCIvPgorICAgICAgPENvbXBvbmVudFJlZiBJZD0ibGljZW5zZXMiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDAiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDEiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDIiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDMiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDQiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDUiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDYiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDciLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDgiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDkiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDg2Ii8+CisgICAgICA8Q29tcG9uZW50UmVmIElkPSJjb21wb25lbnQ4NyIvPgorICAgICAgPENvbXBvbmVudFJlZiBJZD0iY29tcG9uZW50ODgiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDg5Ii8+CisgICAgICA8Q29tcG9uZW50UmVmIElkPSJjb21wb25lbnQ5MCIvPgorICAgICAgPENvbXBvbmVudFJlZiBJZD0iY29tcG9uZW50OTEiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDkyIi8+CisgICAgICA8Q29tcG9uZW50UmVmIElkPSJjb21wb25lbnQ5MyIvPgorICAgICAgPENvbXBvbmVudFJlZiBJZD0iY29tcG9uZW50OTQiLz4KKyAgICAgIDxDb21wb25lbnRSZWYgSWQ9ImNvbXBvbmVudDk1Ii8+CisgICAgPC9GZWF0dXJlPgorICA8L1Byb2R1Y3Q+CisKKyAgPEZyYWdtZW50PgorICAgIDxEaXJlY3RvcnlSZWYgSWQ9Im1hbnVhbCI+CisgICAgICA8Q29tcG9uZW50IElkPSJtYW51YWxJbmRleCIKKyAgICAgICAgR3VpZD0iMzEyNUFCNjgtMTM4OC00OWFhLTg5RjgtOUY1QjgwRUJFNjRCIj4KKyAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iYW50TWFudWFsSW5kZXgiCisgICAgICAgICAgTmFtZT0iSU5ERVhfMS5IVE0iIExvbmdOYW1lPSJpbmRleC5odG1sIgorICAgICAgICAgIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2RvY3MvbWFudWFsL2luZGV4Lmh0bWwiPgorICAgICAgICAgIDxTaG9ydGN1dCBJZD0ic3RhcnRtZW51QW50RG9jcyIKKyAgICAgICAgICAgIERpcmVjdG9yeT0iUHJvZ3JhbU1lbnVEaXIiIE5hbWU9Ik1hbnVhbCIgLz4KKyAgICAgICAgPC9GaWxlPgorICAgICAgPC9Db21wb25lbnQ+CisgICAgPC9EaXJlY3RvcnlSZWY+CisgIDwvRnJhZ21lbnQ+CisKKzwvV2l4PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9hbnQtdXBkYXRlLnhzbCBiL3RydW5rL3NyYy9ldGMvYW50LXVwZGF0ZS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmODdkOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvYW50LXVwZGF0ZS54c2wKQEAgLTAsMCArMSwxMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzbDpzdHlsZXNoZWV0CXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgorPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorIAorPCEtLQorCisgIFRoZSBwdXJwb3NlIGhhdmUgdGhpcyBYU0wgaXMgdG8gcHJvdmlkZSBhIGZhc3Qgd2F5IHRvIHVwZGF0ZSBhIGJ1aWxkZmlsZQorICBmcm9tIGRlcHJlY2F0ZWQgdGFza3MuCisgIAorICBJdCBzaG91bGQgcGFydGljdWxhcmx5IGJlIHVzZWZ1bCB3aGVuIHRoZXJlIGlzIGEgbG90IG9mIGJ1aWxkIGZpbGVzIHRvIG1pZ3JhdGUuCisgIElmIHlvdSBkbyBub3Qgd2FudCB0byBtaWdyYXRlIHRvIGEgcGFydGljdWxhciB0YXNrIGFuZCB3YW50IHRvIGtlZXAgaXQgZm9yCisgIHZhcmlvdXMgcmVhc29uLCBqdXN0IGNvbW1lbnQgdGhlIGFwcHJvcHJpYXRlIHRlbXBsYXRlLgorICAKKyAgISEhISBVc2UgYXQgeW91ciBvd24gcmlzay4gISEhIQorICAKKyAgQGF1dGhvciA8YSBocmVmPSJzYmFpbGxpZXpAYXBhY2hlLm9yZyI+U3RlcGhhbmUgQmFpbGxpZXo8L2E+CisgIAorLS0+CisgCisgCisgIDwhLS0gKHppcHxqYXJ8d2FyfGVhcilmaWxlIGF0dHJpYnV0ZXMgYXJlIHJlcGxhY2VkIGJ5IGRlc3RmaWxlIGluIHRoZWlyIHJlc3BlY3RpdmUgdGFzayAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iemlwIj4KKyAgICA8emlwIGRlc3RmaWxlPSJ7QHppcGZpbGV9Ij4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCpbbm90KG5hbWUoKT0nemlwZmlsZScpXXxub2RlKCkiLz4KKyAgICA8L3ppcD4KKyAgPC94c2w6dGVtcGxhdGU+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImphciI+CisgICAgPGphciBkZXN0ZmlsZT0ie0BqYXJmaWxlfSI+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqW25vdChuYW1lKCk9J2phcmZpbGUnKV18bm9kZSgpIi8+CisgICAgPC9qYXI+CisgIDwveHNsOnRlbXBsYXRlPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ3YXIiPgorICAgIDx3YXIgZGVzdGZpbGU9IntAd2FyZmlsZX0iPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKltub3QobmFtZSgpPSd3YXJmaWxlJyldfG5vZGUoKSIvPgorICAgIDwvd2FyPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZWFyIj4KKyAgICA8ZWFyIGRlc3RmaWxlPSJ7QGVhcmZpbGV9Ij4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCpbbm90KG5hbWUoKT0nZWFyZmlsZScpXXxub2RlKCkiLz4KKyAgICA8L2Vhcj4KKyAgPC94c2w6dGVtcGxhdGU+CisgICAKKyAKKyAgPCEtLSBjb3B5ZGlyIGlzIHJlcGxhY2VkIGJ5IGNvcHkgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvcHlkaXIiPgorICAgIDxjb3B5IHRvZGlyPSJ7QGRlc3R9Ij4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGZsYXR0ZW58QGZpbHRlcmluZyIvPgorICAgICAgPHhzbDppZiB0ZXN0PSJAZm9yY2VvdmVyd3JpdGUiPgorICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvdmVyd3JpdGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZm9yY2VvdmVyd3JpdGUiLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICA8L3hzbDppZj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ie0BzcmN9Ij4KKyAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBpbmNsdWRlc3xAaW5jbHVkZXNmaWxlfEBleGNsdWRlc3xAZXhjbHVkZXNmaWxlfG5vZGUoKSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBjb3B5ZmlsZSBpcyByZXBsYWNlZCBieSBjb3B5IC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb3B5ZmlsZSI+CisgICAgPGNvcHkgZmlsZT0ie0BzcmN9IiB0b2ZpbGU9IntAZGVzdH0iPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZmlsdGVyaW5nIi8+CisgICAgICA8eHNsOmlmIHRlc3Q9IkBmb3JjZW92ZXJ3cml0ZSI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im92ZXJ3cml0ZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBmb3JjZW92ZXJ3cml0ZSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgIDwveHNsOmlmPgorICAgIDwvY29weT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBkZWx0cmVlIGlzIHJlcGxhY2VkIGJ5IGRlbGV0ZSAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGVsdHJlZSI+CisgICAgPGRlbGV0ZSBkaXI9IntAZGlyfSIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tIGV4ZWNvbiBpcyByZXBsYWNlZCBieSBhcHBseSAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXhlY29uIj4KKyAgICA8YXBwbHk+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgorICAgIDwvYXBwbHk+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gcmVuYW1lIGlzIHJlcGxhY2VkIGJ5IG1vdmUgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJlbmFtZSI+CisgICAgPG1vdmUgZmlsZT0ie0BzcmN9IiB0b2ZpbGU9IntAZGVzdH0iPgorICAgICAgPHhzbDppZiB0ZXN0PSJAcmVwbGFjZSI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im92ZXJ3cml0ZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZXBsYWNlIi8+PC94c2w6YXR0cmlidXRlPgorICAgICAgPC94c2w6aWY+CisgICAgPC9tb3ZlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tIGphdmFkb2MyIGlzIHJlcGxhY2VkIGJ5IGphdmFkb2MgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImphdmFkb2MyIj4KKyAgICA8amF2YWRvYz4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+CisgICAgPC9qYXZhZG9jPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgIDwhLS0gQ29weSBldmVyeSBub2RlIGFuZCBhdHRyaWJ1dGVzIHJlY3Vyc2l2ZWx5IC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJub2RlKCl8QCoiPgorICAgIDx4c2w6Y29weT4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+CisgICAgPC94c2w6Y29weT4KKyAgPC94c2w6dGVtcGxhdGU+CisgIAorPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL2NoYW5nZWxvZy54c2wgYi90cnVuay9zcmMvZXRjL2NoYW5nZWxvZy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvY2hhbmdlbG9nLnhzbApAQCAtMCwwICsxLDE0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorCis8eHNsOnN0eWxlc2hlZXQKKyAgICB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScKKyAgICB2ZXJzaW9uPScxLjAnPgorCis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgCistLT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgorICA8eHNsOnBhcmFtIG5hbWU9Im1vZHVsZSIvPgorICA8eHNsOnBhcmFtIG5hbWU9ImN2c3dlYiIvPgorCisgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIKKyAgICAgICAgICAgICAgZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCisgICAgICAgICAgICAgIGRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL3N0cmljdC5kdGQiLz4KKworICA8IS0tIENvcHkgc3RhbmRhcmQgZG9jdW1lbnQgZWxlbWVudHMuICBFbGVtZW50cyB0aGF0CisgICAgICAgc2hvdWxkIGJlIGlnbm9yZWQgbXVzdCBiZSBmaWx0ZXJlZCBieSBhcHBseS10ZW1wbGF0ZXMKKyAgICAgICB0YWdzLiAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiI+CisgICAgPHhzbDpjb3B5PgorICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iYXR0cmlidXRlOjoqWy4gIT0gJyddIi8+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgPC94c2w6Y29weT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nIj4KKyAgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgICAgYm9keSwgcCB7CisgICAgICAgICAgICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKKyAgICAgICAgICAgIGZvbnQtc2l6ZTogODAlOworICAgICAgICAgICAgY29sb3I6ICMwMDAwMDA7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworICAgICAgICAgIH0KKyAgICAgICAgICB0ciwgdGQgeworICAgICAgICAgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZWVlZWUwOworICAgICAgICAgIH0KKyAgICAgICAgICB0ZCB7CisgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CisgICAgICAgICAgfQorICAgICAgLmRhdGVBbmRBdXRob3IgeworICAgICAgICAgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYTZjYWYwOworICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CisgICAgICB9CisgICAgICAgICAgYSB7CisgICAgICAgICAgICBjb2xvcjogIzAwMDAwMDsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJlIHsKKyAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgIH0KKyAgICAgICAgPC9zdHlsZT4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICA8aDE+CisgICAgICAgICAgPGEgbmFtZT0idG9wIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC9hPgorICAgICAgICA8L2gxPgorICAgICAgICA8cCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BcGFjaGUgQW50PC9hPi48L3A+CisgICAgICAgIDxoci8+CisgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMSI+CisgICAgICAgICAgCisgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLy9lbnRyeSI+CisgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJkYXRlIiBkYXRhLXR5cGU9InRleHQiIG9yZGVyPSJkZXNjZW5kaW5nIi8+CisgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJ0aW1lIiBkYXRhLXR5cGU9InRleHQiIG9yZGVyPSJkZXNjZW5kaW5nIi8+CisgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgIAorICAgICAgICA8L3RhYmxlPgorICAgICAgICAKKyAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisgIDwveHNsOnRlbXBsYXRlPgorICAKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZW50cnkiPgorICAgIDx0cj4KKyAgICAgIDx0ZCBjbGFzcz0iZGF0ZUFuZEF1dGhvciI+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkYXRlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0aW1lIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdXRob3IiLz4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgIDxwcmU+Cis8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1zZyIvPjwvcHJlPgorICAgICAgICA8dWw+CisgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmaWxlIi8+CisgICAgICAgIDwvdWw+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGUiPgorICAgIDxpPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9pPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0aW1lIj4KKyAgICA8aT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvaT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYXV0aG9yIj4KKyAgICA8aT4KKyAgICAgIDxhPgorICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5tYWlsdG86PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9hPgorICAgIDwvaT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZmlsZSI+CisgICAgPGxpPgorICAgICAgPGE+CisgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKHByZXZyZXZpc2lvbikgPSAwICI+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGN2c3dlYiIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kdWxlIiAvPi88eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSIgLz4/cmV2PTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXZpc2lvbiIgLz4mYW1wO2NvbnRlbnQtdHlwZT10ZXh0L3gtY3Zzd2ViLW1hcmt1cDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjdnN3ZWIiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZHVsZSIgLz4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUiIC8+P3IxPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXZpc2lvbiIgLz4mYW1wO3IyPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcmV2cmV2aXNpb24iLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lIiAvPiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJldmlzaW9uIi8+KTwvYT4KKyAgICA8L2xpPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tIEFueSBlbGVtZW50cyB3aXRoaW4gYSBtc2cgYXJlIHByb2Nlc3NlZCwKKyAgICAgICBzbyB0aGF0IHdlIGNhbiBwcmVzZXJ2ZSBIVE1MIHRhZ3MuIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtc2ciPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgPC94c2w6dGVtcGxhdGU+CisgIAorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvY2hlY2tzdHlsZS9SZXF1aXJlZEhlYWRlci50eHQgYi90cnVuay9zcmMvZXRjL2NoZWNrc3R5bGUvUmVxdWlyZWRIZWFkZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhNWJiOWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL2NoZWNrc3R5bGUvUmVxdWlyZWRIZWFkZXIudHh0CkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLWNvbmZpZyBiL3RydW5rL3NyYy9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLWNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzdmYjkwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtY29uZmlnCkBAIC0wLDAgKzEsMTM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBtb2R1bGUgUFVCTElDICItLy9QdXBweSBDcmF3bC8vRFREIENoZWNrIENvbmZpZ3VyYXRpb24gMS4xLy9FTiIgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMS5kdGQiPgorCis8bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgorICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgorICAgIDwhLS0gSmF2YWRvYyByZXF1aXJlbWVudHMgLS0+CisgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVHlwZSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0ic2NvcGUiIHZhbHVlPSJwcm90ZWN0ZWQiLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NNZXRob2QiPgorICAgICAgPHByb3BlcnR5IG5hbWU9InNjb3BlIiB2YWx1ZT0icHJvdGVjdGVkIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dVbmRlY2xhcmVkUlRFIiB2YWx1ZT0idHJ1ZSIvPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY1ZhcmlhYmxlIj4KKyAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NvcGUiIHZhbHVlPSJwdWJsaWMiLz4KKyAgICA8L21vZHVsZT4KKworICAgIDwhLS0gZWxlbWVudCBuYW1pbmcgLS0+CisgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSIvPgorICAgIDxtb2R1bGUgbmFtZT0iVHlwZU5hbWUiLz4KKyAgICA8bW9kdWxlIG5hbWU9IkNvbnN0YW50TmFtZSIvPgorICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxGaW5hbFZhcmlhYmxlTmFtZSIvPgorICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxWYXJpYWJsZU5hbWUiLz4KKyAgICA8bW9kdWxlIG5hbWU9Ik1lbWJlck5hbWUiLz4KKyAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiLz4KKyAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck5hbWUiLz4KKyAgICA8bW9kdWxlIG5hbWU9IlN0YXRpY1ZhcmlhYmxlTmFtZSIvPgorCisgICAgPCEtLSByZXF1aXJlZCBsaWNlbmNlIGZpbGUgLS0+CisgICAgPG1vZHVsZSBuYW1lPSJIZWFkZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyRmlsZSIgdmFsdWU9IiR7Y29uZmlnLmRpcn0vUmVxdWlyZWRIZWFkZXIudHh0Ii8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVMaW5lcyIgdmFsdWU9IjIiLz4KKyAgICA8L21vZHVsZT4KKworICAgIDwhLS0gSW1wb3J0IGNvbnZlbnRpb25zIC0tPgorICAgIDxtb2R1bGUgbmFtZT0iQXZvaWRTdGFySW1wb3J0Ii8+CisgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW1wb3J0Ii8+CisgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KKyAgICA8bW9kdWxlIG5hbWU9IlVudXNlZEltcG9ydHMiLz4KKworICAgIDwhLS0gc2l6ZSBsaW1pdHMgLS0+CisgICAgPG1vZHVsZSBuYW1lPSJGaWxlTGVuZ3RoIi8+CisgICAgPG1vZHVsZSBuYW1lPSJMaW5lTGVuZ3RoIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMDAiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVQYXR0ZXJuIiB2YWx1ZT0iXiAqXCogKlteIF0rJCIvPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTGVuZ3RoIi8+CisgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOdW1iZXIiLz4KKworICAgIDwhLS0gd2hpdGVzcGFjZSBjaGVja3MgLS0+CisgICAgPG1vZHVsZSBuYW1lPSJFbXB0eUZvckl0ZXJhdG9yUGFkIi8+CisgICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VBZnRlciIvPgorICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQmVmb3JlIi8+CisgICAgPG1vZHVsZSBuYW1lPSJPcGVyYXRvcldyYXAiLz4KKyAgICA8bW9kdWxlIG5hbWU9IlBhcmVuUGFkIi8+CisgICAgPG1vZHVsZSBuYW1lPSJUYWJDaGFyYWN0ZXIiLz4KKyAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBZnRlciIvPgorICAgIDxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFyb3VuZCIvPgorCisgICAgPCEtLSBNb2RpZmllciBDaGVja3MgLS0+CisgICAgPG1vZHVsZSBuYW1lPSJNb2RpZmllck9yZGVyIi8+CisgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRNb2RpZmllciIvPgorCisKKyAgICA8IS0tIENoZWNrcyBmb3IgYmxvY2tzIC0tPgorICAgIDxtb2R1bGUgbmFtZT0iQXZvaWROZXN0ZWRCbG9ja3MiLz4KKyAgICA8bW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9InRleHQiLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IkxlZnRDdXJseSIvPgorICAgIDxtb2R1bGUgbmFtZT0iTmVlZEJyYWNlcyIvPgorICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSIvPgorCisKKyAgICA8IS0tIENoZWNrcyBmb3IgY29tbW9uIGNvZGluZyBwcm9ibGVtcyAtLT4KKyAgICA8IS0tPG1vZHVsZSBuYW1lPSJBdm9pZElubGluZUNvbmRpdGlvbmFscyIvPiAtLT4KKyAgICA8bW9kdWxlIG5hbWU9IkRvdWJsZUNoZWNrZWRMb2NraW5nIi8+CisgICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgorICAgIDxtb2R1bGUgbmFtZT0iRXF1YWxzSGFzaENvZGUiLz4KKyAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbnN0YW50aWF0aW9uIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4iLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IklubmVyQXNzaWdubWVudCIvPgorICAgIDxtb2R1bGUgbmFtZT0iTWFnaWNOdW1iZXIiLz4KKyAgICA8bW9kdWxlIG5hbWU9Ik1pc3NpbmdTd2l0Y2hEZWZhdWx0Ii8+CisgICAgPCEtLSBBbGxvdyByZWR1bmRhbnQgdGhyb3cgZGVjbGFyYXRpb25zIGZvciBkb2MgcHVycG9zZXMgCisgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRUaHJvd3MiPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93VW5jaGVja2VkIiB2YWx1ZT0idHJ1ZSIvPgorICAgIDwvbW9kdWxlPgorICAgICAgICAgLS0+CisgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9uIi8+CisgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5SZXR1cm4iLz4KKworICAgIDwhLS0gQ2hlY2tzIGZvciBjbGFzcyBkZXNpZ24gLS0+CisgICAgPCEtLSA8bW9kdWxlIG5hbWU9IkRlc2lnbkZvckV4dGVuc2lvbiIvPiAtLT4KKyAgICA8bW9kdWxlIG5hbWU9IkZpbmFsQ2xhc3MiLz4KKyAgICA8bW9kdWxlIG5hbWU9IkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvciIvPgorICAgIDxtb2R1bGUgbmFtZT0iSW50ZXJmYWNlSXNUeXBlIi8+CisgICAgPG1vZHVsZSBuYW1lPSJWaXNpYmlsaXR5TW9kaWZpZXIiLz4KKworICAgIDwhLS0gTWlzY2VsbGFuZW91cyBvdGhlciBjaGVja3MuIC0tPgorICAgIDxtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLz4KKyAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJccyskIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkxpbmUgaGFzIHRyYWlsaW5nIHNwYWNlcy4iLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlRvZG9Db21tZW50Ii8+CisgICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgorICAgIDwhLS0gYWxsb3cgY29tbWVudCBzdXBwcmVzc2lvbiBvZiBjaGVja3MgLS0+CisgICAgPG1vZHVsZSBuYW1lPSJGaWxlQ29udGVudHNIb2xkZXIiLz4KKyAgPC9tb2R1bGU+CisgIDwhLS0gPG1vZHVsZSBuYW1lPSJhdS5jb20ucmVkaGlsbGNvbnN1bHRpbmcuc2ltaWFuLlNpbWlhbkNoZWNrIi8+IC0tPgorICA8bW9kdWxlIG5hbWU9IlN1cHByZXNzaW9uQ29tbWVudEZpbHRlciI+CisgICAgPHByb3BlcnR5IG5hbWU9Im9mZkNvbW1lbnRGb3JtYXQiIHZhbHVlPSJDaGVja1N0eWxlXDooW1x3XHxdKykgKk9GRiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJvbkNvbW1lbnRGb3JtYXQiIHZhbHVlPSJDaGVja1N0eWxlXDooW1x3XHxdKykgKk9OIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrRm9ybWF0IiB2YWx1ZT0iJDEiLz4KKyAgPC9tb2R1bGU+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLWZyYW1lcy54c2wgYi90cnVuay9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS1mcmFtZXMueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYWFmZDYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS1mcmFtZXMueHNsCkBAIC0wLDAgKzEsMjk5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKyAgICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiCisgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KKworPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisgICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIgZW5jb2Rpbmc9IlVTLUFTQ0lJIi8+CisgICAgPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIiAvPgorCisgICAgPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0iYmFzZWRpciIgc2VsZWN0PSInLiciLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoZWNrc3R5bGUiPgorICAgICAgICA8IS0tIGNyZWF0ZSB0aGUgaW5kZXguaHRtbCAtLT4KKyAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vaW5kZXguaHRtbCI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgorICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgICAgIDwhLS0gY3JlYXRlIHRoZSBzdHlsZXNoZWV0LmNzcyAtLT4KKyAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+CisgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICAgICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LXN1bW1hcnkuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctZnJhbWUuaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9Im92ZXJ2aWV3Ii8+CisgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICAgICAgPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5jbGFzc2VzIi8+CisgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICAgICAgPCEtLSBwcm9jZXNzIGFsbCBmaWxlcyAtLT4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmaWxlW2NvdW50KGVycm9yKSAhPSAwXSIvPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICAgPGh0bWw+CisgICAgICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Q2hlY2tTdHlsZSBBdWRpdDwvdGl0bGU+CisgICAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgICA8ZnJhbWVzZXQgY29scz0iMjAlLDgwJSI+CisgICAgICAgICAgICAgICAgPGZyYW1lIHNyYz0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiBuYW1lPSJmaWxlTGlzdEZyYW1lIi8+CisgICAgICAgICAgICAgICAgPGZyYW1lIHNyYz0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgbmFtZT0iZmlsZUZyYW1lIi8+CisgICAgICAgICAgICA8L2ZyYW1lc2V0PgorICAgICAgICAgICAgPG5vZnJhbWVzPgorICAgICAgICAgICAgICAgIDxoMj5GcmFtZSBBbGVydDwvaDI+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgIDwvbm9mcmFtZXM+CisgICAgICAgIDwvaHRtbD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciI+CisgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGV4dC1hbGlnbjpyaWdodCI+PGgyPkNoZWNrU3R5bGUgQXVkaXQ8L2gyPjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGV4dC1hbGlnbjpyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoCisgICAgICAgICAgICAgICAgICA8YSBocmVmPSdodHRwOi8vY2hlY2tzdHlsZS5zb3VyY2Vmb3JnZS5uZXQvJz5DaGVja1N0eWxlPC9hPiBhbmQKKyAgICAgICAgICAgICAgICAgIDxhIGhyZWY9J2h0dHA6Ly9hbnQuYXBhY2hlLm9yZy8nPkFudDwvYT4uPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDxociBzaXplPSIxIi8+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGVja3N0eWxlIiBtb2RlPSJvdmVydmlldyI+CisgICAgICAgIDxodG1sPgorICAgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldC5jc3MiLz4KKyAgICAgICAgICAgIDwvaGVhZD4KKyAgICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgICAgIDwhLS0gcGFnZSBoZWFkZXIgLS0+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKworICAgICAgICAgICAgICAgIDwhLS0gU3VtbWFyeSBwYXJ0IC0tPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ic3VtbWFyeSIvPgorICAgICAgICAgICAgICAgIDxociBzaXplPSIxIiB3aWR0aD0iMTAwJSIgYWxpZ249ImxlZnQiLz4KKworICAgICAgICAgICAgICAgIDwhLS0gRmlsZSBsaXN0IHBhcnQgLS0+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJmaWxlbGlzdCIvPgorICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIj4KKyAgICAgICAgLmJhbm5lcmNlbGwgeworICAgICAgICBib3JkZXI6IDBweDsKKyAgICAgICAgcGFkZGluZzogMHB4OworICAgICAgICB9CisgICAgICAgIGJvZHkgeworICAgICAgICBtYXJnaW4tbGVmdDogMTA7CisgICAgICAgIG1hcmdpbi1yaWdodDogMTA7CisgICAgICAgIGZvbnQ6bm9ybWFsIDgwJSBhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWY7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsKKyAgICAgICAgY29sb3I6IzAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICAub2Rkcm93IHRkIHsKKyAgICAgICAgYmFja2dyb3VuZDogI2VmZWZlZjsKKyAgICAgICAgfQorICAgICAgICAuZXZlbnJvdyB0ZCB7CisgICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CisgICAgICAgIH0KKyAgICAgICAgdGgsIHRkIHsKKyAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICAgICAgfQorICAgICAgICB0aCB7CisgICAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7CisgICAgICAgIGJhY2tncm91bmQ6ICNjY2M7CisgICAgICAgIGNvbG9yOiBibGFjazsKKyAgICAgICAgfQorICAgICAgICB0YWJsZSwgdGgsIHRkIHsKKyAgICAgICAgZm9udC1zaXplOjEwMCU7CisgICAgICAgIGJvcmRlcjogbm9uZQorICAgICAgICB9CisgICAgICAgIHRhYmxlLmxvZyB0ciB0ZCwgdHIgdGggeworCisgICAgICAgIH0KKyAgICAgICAgaDIgeworICAgICAgICBmb250LXdlaWdodDpib2xkOworICAgICAgICBmb250LXNpemU6MTQwJTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogNTsKKyAgICAgICAgfQorICAgICAgICBoMyB7CisgICAgICAgIGZvbnQtc2l6ZToxMDAlOworICAgICAgICBmb250LXdlaWdodDpib2xkOworICAgICAgICBiYWNrZ3JvdW5kOiAjNTI1RDc2OworICAgICAgICBjb2xvcjogd2hpdGU7CisgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgICAgcGFkZGluZzogNXB4OworICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICAgICAgfQorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLQorICAgIENyZWF0ZXMgYW4gYWxsLWNsYXNzZXMuaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBmaWxlcy4KKyAgICAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGVja3N0eWxlIiBtb2RlPSJhbGwuY2xhc3NlcyI+CisgICAgICAgIDxodG1sPgorICAgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldC5jc3MiLz4KKyAgICAgICAgICAgIDwvaGVhZD4KKyAgICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgICAgIDxoMj5GaWxlczwvaDI+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvciBlYWNoIGZpbGUgY3JlYXRlIGl0cyBwYXJ0IC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmaWxlW2NvdW50KGVycm9yKSAhPSAwXSIgbW9kZT0iYWxsLmNsYXNzZXMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGVja3N0eWxlIiBtb2RlPSJmaWxlbGlzdCI+CisgICAgICAgIDxoMz5GaWxlczwvaDM+CisgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD4KKyAgICAgICAgICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImZpbGVbY291bnQoZXJyb3IpICE9IDBdIiBtb2RlPSJmaWxlbGlzdCI+CisgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iY291bnQoZXJyb3IpIiBvcmRlcj0iZGVzY2VuZGluZyIgZGF0YS10eXBlPSJudW1iZXIiLz4KKyAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiIG1vZGU9ImZpbGVsaXN0Ij4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZWQtcm93Ii8+CisgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5maWxlcy88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoQG5hbWUsICRiYXNlZGlyKSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+CisgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoZXJyb3IpIi8+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9ImZpbGVGcmFtZSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PmZpbGVzLzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+PHhzbDp0ZXh0Pi5odG1sPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKEBuYW1lLCAkYmFzZWRpcikiLz4KKyAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLQorICAgIHRyYW5zZm9ybSBzdHJpbmcgbGlrZSBhL2IvYyB0byAuLi8uLi8uLi8KKyAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgKKyAgICAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgICAgICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KKworICAgICAgICA8IS0tIENvbnZlcnQgYSB3aW5kb3dzIHBhdGggJ1wnIHRvIGEgdW5peCBwYXRoICcvJyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiAtLT4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXRoMiIgc2VsZWN0PSJ0cmFuc2xhdGUoJHBhdGgsJ1wnLCcvJykiLz4KKworICAgICAgICAKKyAgICAgICAgPHhzbDppZiB0ZXN0PSJjb250YWlucygkcGF0aDIsJy8nKSI+CisgICAgICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcGF0aDIsJy8nKSIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoJHBhdGgyLCcvJykpIGFuZCBub3QoJHBhdGgyID0gJycpIj4KKyAgICAgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiPgorICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9maWxlcy97c3Vic3RyaW5nLWFmdGVyKEBuYW1lLCAkYmFzZWRpcil9Lmh0bWwiPgorICAgICAgICAgICAgPGh0bWw+CisgICAgICAgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT48eHNsOnRleHQ+c3R5bGVzaGVldC5jc3M8L3hzbDp0ZXh0PjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9saW5rPgorICAgICAgICAgICAgICAgIDwvaGVhZD4KKyAgICAgICAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPGgzPkZpbGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+PC9oMz4KKyAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkVycm9yIERlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TGluZTpDb2x1bW48L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJlcnJvciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlZC1yb3ciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJ7QHNvdXJjZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPjwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsaW5lIi8+PHhzbDppZiB0ZXN0PSJAY29sdW1uIj46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW4iLz48L3hzbDppZj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICA8L2JvZHk+CisgICAgICAgICAgICA8L2h0bWw+CisgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGVja3N0eWxlIiBtb2RlPSJzdW1tYXJ5Ij4KKyAgICAgICAgPGgzPlN1bW1hcnk8L2gzPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpbGVDb3VudCIgc2VsZWN0PSJjb3VudChmaWxlKSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0iY291bnQoZmlsZS9lcnJvcikiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlRXJyb3JDb3VudCIgc2VsZWN0PSJjb3VudChmaWxlW2NvdW50KGVycm9yKSAhPSAwXSkiLz4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRoPlRvdGFsIEZpbGVzPC90aD4KKyAgICAgICAgICAgICAgICA8dGg+RmlsZXMgV2l0aCBFcnJvcnM8L3RoPgorICAgICAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlZC1yb3ciLz4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaWxlQ291bnQiLz48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpbGVFcnJvckNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZWQtcm93Ij4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+b2Rkcm93PC94c2w6aWY+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAwIj5ldmVucm93PC94c2w6aWY+CisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtdGV4dC54c2wgYi90cnVuay9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS10ZXh0LnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzU5ZTQxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtdGV4dC54c2wKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+CisKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworICAgIDx4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHM9ImNoZWNrc3R5bGUiLz4KKyAgICA8eHNsOnByZXNlcnZlLXNwYWNlIGVsZW1lbnRzPSJmaWxlIi8+CisgICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hlY2tzdHlsZS9maWxlL2Vycm9yIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+CisgICAgICAgIDx4c2w6dGV4dD46PC94c2w6dGV4dD4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsaW5lIi8+CisgICAgICAgIDx4c2w6dGV4dD46PC94c2w6dGV4dD4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW4iLz4KKyAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLXhkb2MueHNsIGIvdHJ1bmsvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUteGRvYy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjNmVhYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLXhkb2MueHNsCkBAIC0wLDAgKzEsMTMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKyAgICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiCisgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KKworPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisgICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+CisgICAgPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIiAvPgorCisgICAgPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0iYmFzZWRpciIgc2VsZWN0PSInLiciLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoZWNrc3R5bGUiPgorICAgICAgPGRvY3VtZW50PgorICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICA8dGl0bGU+Q2hlY2tzdHlsZSBBdWRpdDwvdGl0bGU+CisgICAgICAgIDwvcHJvcGVydGllcz4KKworICAgICAgICA8Ym9keT4KKyAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InN1bW1hcnkiLz4KKyAgICAgICAgICA8IS0tIEZpbGUgbGlzdCBwYXJ0IC0tPgorICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iZmlsZWxpc3QiLz4KKyAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImZpbGVbY291bnQoZXJyb3IpICE9IDBdIi8+CisgICAgICAgIDwvYm9keT4KKyAgICAgIDwvZG9jdW1lbnQ+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGVja3N0eWxlIiBtb2RlPSJmaWxlbGlzdCI+CisgICAgICA8c2VjdGlvbiBuYW1lPSJGaWxlcyI+CisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+CisgICAgICAgICAgICAgICAgPHRoPkVycm9yczwvdGg+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmaWxlW2NvdW50KGVycm9yKSAhPSAwXSIgbW9kZT0iZmlsZWxpc3QiPgorICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9ImNvdW50KGVycm9yKSIgb3JkZXI9ImRlc2NlbmRpbmciIGRhdGEtdHlwZT0ibnVtYmVyIi8+CisgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3NlY3Rpb24+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlIiBtb2RlPSJmaWxlbGlzdCI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGVkLXJvdyIvPgorICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+ZmlsZXM8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoQG5hbWUsICRiYXNlZGlyKSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihAbmFtZSwgJGJhc2VkaXIpIi8+CisgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoZXJyb3IpIi8+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiPgorICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vZmlsZXN7c3Vic3RyaW5nLWFmdGVyKEBuYW1lLCAkYmFzZWRpcil9LnhtbCI+CisgICAgICAgIDxkb2N1bWVudD4KKyAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgIDx0aXRsZT5DaGVja3N0eWxlIEF1ZGl0PC90aXRsZT4KKyAgICAgICAgICA8L3Byb3BlcnRpZXM+CisKKyAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxzZWN0aW9uIG5hbWU9IkRldGFpbHMgZm9yIHtzdWJzdHJpbmctYWZ0ZXIoQG5hbWUsICRiYXNlZGlyKX0iPgorICAgICAgICAgICAgICA8dGFibGU+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRoPkVycm9yIERlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICA8dGg+TGluZTwvdGg+CisgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVycm9yIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGVkLXJvdyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgdGl0bGU9IntAc291cmNlfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXNzYWdlIi8+PC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxpbmUiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvZG9jdW1lbnQ+CisgICAgICA8L3JlZGlyZWN0OndyaXRlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hlY2tzdHlsZSIgbW9kZT0ic3VtbWFyeSI+CisgICAgICA8c2VjdGlvbiBuYW1lPSJTdW1tYXJ5Ij4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlQ291bnQiIHNlbGVjdD0iY291bnQoZmlsZSkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9ImNvdW50KGZpbGUvZXJyb3IpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZUVycm9yQ291bnQiIHNlbGVjdD0iY291bnQoZmlsZVtjb3VudChlcnJvcikgIT0gMF0pIi8+CisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGg+RmlsZXM8L3RoPgorICAgICAgICAgICAgICAgIDx0aD5GaWxlcyBXaXRoIEVycm9yczwvdGg+CisgICAgICAgICAgICAgICAgPHRoPkVycm9yczwvdGg+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGVkLXJvdyIvPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpbGVDb3VudCIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmlsZUVycm9yQ291bnQiLz48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlZC1yb3ciPgorICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAxIj5vZGRyb3c8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDAiPmV2ZW5yb3c8L3hzbDppZj4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgIDwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9jb21tb24ybWFzdGVyLnhzbCBiL3RydW5rL3NyYy9ldGMvY29tbW9uMm1hc3Rlci54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlMzViZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvY29tbW9uMm1hc3Rlci54c2wKQEAgLTAsMCArMSw3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pg0KKzwhLS0gDQorCVRoaXMgc3R5bGVzaGVldCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIG1hc3RlciBidWlsZGZpbGUgZnJvbSBhIGNvbW1vbg0KKwlidWlsZGZpbGUgKHNlZSBtYW51YWwgZm9yIDxzdWJhbnQ+KS4NCisJRm9yZWFjaCA8dGFyZ2V0PiBpbiB0aGUgY29tbW9uIGJ1aWxkZmlsZSBpdCBnZW5lcmF0ZXMgYSBjb3JyZXNwb25kaW5nIA0KKwl0YXJnZXQgaW4gdGhlIG1hc3RlciBidWlsZGZpbGUgZm9yIGl0ZXJhdGluZyBvdmVyIHRoYXQgdGFyZ2V0Lg0KKy0tPg0KKzx4c2w6c3R5bGVzaGVldA0KKyAgdmVyc2lvbj0iMS4wIg0KKyAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KKw0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCisNCisgICAgPHhzbDpvdXRwdXQgaW5kZW50PSJubyIgbWV0aG9kPSJ0ZXh0IiBlbmNvZGluZz0iSVNPLTg4NTktMSIvPg0KKyAgICA8eHNsOnN0cmlwLXNwYWNlIGVsZW1lbnRzPSIqIi8+DQorDQorDQorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+DQorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCis8L3hzbDp0ZW1wbGF0ZT4NCisNCisNCisNCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9qZWN0Ij4NCis8IVtDREFUQVsNCis8cHJvamVjdCBuYW1lPSJtYXN0ZXIiPiANCisNCisgICAgPG1hY3JvZGVmIG5hbWU9Iml0ZXJhdGUiPg0KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiLz4NCisgICAgICAgIDxzZXF1ZW50aWFsPg0KKyAgICAgICAgICAgIDxzdWJhbnQgdGFyZ2V0PSJAe3RhcmdldH0iPg0KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Im1vZHVsZXMiIGluY2x1ZGVzPSIqL2J1aWxkLnhtbCIvPg0KKyAgICAgICAgICAgIDwvc3ViYW50Pg0KKyAgICAgICAgPC9zZXF1ZW50aWFsPg0KKyAgICA8L21hY3JvZGVmPg0KK11dPg0KKyAgIA0KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQorICAgIA0KKzwhW0NEQVRBWw0KKzwvcHJvamVjdD4NCitdXT4NCis8L3hzbDp0ZW1wbGF0ZT4NCisNCisNCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YXJnZXQiPg0KKyAgICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+JnF1b3Q7PHhzbDppZiB0ZXN0PSJAZGVzY3JpcHRpb24iPiBkZXNjcmlwdGlvbj0mcXVvdDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRlc2NyaXB0aW9uIi8+JnF1b3Q7PC94c2w6aWY+Jmd0Ow0KKyAgICAgICAgJmx0O2l0ZXJhdGUgdGFyZ2V0PSZxdW90Ozx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiZxdW90Oy8mZ3Q7DQorICAgICZsdDsvdGFyZ2V0Jmd0Ow0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKw0KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSIvPg0KKw0KKw0KKw0KKzwveHNsOnN0eWxlc2hlZXQ+DQorDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9jb3ZlcmFnZS1mcmFtZXMueHNsIGIvdHJ1bmsvc3JjL2V0Yy9jb3ZlcmFnZS1mcmFtZXMueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NWE1MmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL2NvdmVyYWdlLWZyYW1lcy54c2wKQEAgLTAsMCArMSw0ODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCisgICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgorICAgIHhtbG5zOnJlZGlyZWN0PSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5SZWRpcmVjdCIKKyAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgorPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIvPgorPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIiAvPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCisKKyBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggSlByb2JlIDMuMCBYTUwgb3V0cHV0LgorCisgSXQgY3JlYXRlcyBhIHNldCBvZiBIVE1MIGZpbGVzIGEgbGEgamF2YWRvYyB3aGVyZSB5b3UgY2FuIGJyb3dzZSBlYXNpbHkKKyB0aHJvdWdoIGFsbCBwYWNrYWdlcyBhbmQgY2xhc3Nlcy4KKworIEl0IGlzIGJlc3QgdXNlZCB3aXRoIEpQcm9iZSBDb3ZlcmFnZSBBbnQgdGFzayB0aGF0IGdpdmVzIHlvdSB0aGUgYmVuZWZpdAorIG9mIGEgcmVmZXJlbmNlIGNsYXNzcGF0aCBzbyB0aGF0IHlvdSBoYXZlIHRoZSBsaXN0IG9mIGNsYXNzZXMvbWV0aG9kcworIHRoYXQgYXJlIG5vdCB1c2VkIGF0IGFsbCBpbiBhIGdpdmVuIGNsYXNzcGF0aC4KKworIEBhdXRob3IgU3RlcGhhbmUgQmFpbGxpZXogPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBhcGFjaGUub3JnIi8+CisKKy0tPgorCis8IS0tIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSBpcyBjdXJyZW50IGRpcmVjdG9yeSAtLT4KKzx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm9vdCBlbGVtZW50CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSIvc25hcHNob3QiPgorICAgIDwhLS0gY3JlYXRlIHRoZSBpbmRleC5odG1sIC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2luZGV4Lmh0bWwiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgc3R5bGVzaGVldC5jc3MgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctZnJhbWUuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnBhY2thZ2VzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtY2xhc3Nlcy5odG1sIGF0IHRoZSByb290IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLmNsYXNzZXMiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZSIgbW9kZT0id3JpdGUiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnJhbWVzZXQgZGVmaW5pdGlvbi4gRW50cnkgcG9pbnQgZm9yIHRoZSByZXBvcnQuCisgICAgMyBmcmFtZXM6IHBhY2thZ2VMaXN0RnJhbWUsIGNsYXNzTGlzdEZyYW1lLCBjbGFzc0ZyYW1lCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPgorPGh0bWw+CisgICAgPGhlYWQ+PHRpdGxlPkNvdmVyYWdlIFJlc3VsdHMuPC90aXRsZT48L2hlYWQ+CisgICAgPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgorICAgICAgICA8ZnJhbWVzZXQgcm93cz0iMzAlLDcwJSI+CisgICAgICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+CisgICAgICAgICAgICA8ZnJhbWUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+CisgICAgICAgIDwvZnJhbWVzZXQ+CisgICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgorICAgIDwvZnJhbWVzZXQ+CisgICAgPG5vZnJhbWVzPgorICAgICAgICA8aDI+RnJhbWUgQWxlcnQ8L2gyPgorICAgICAgICA8cD4KKyAgICAgICAgVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCisgICAgICAgIDwvcD4KKyAgICA8L25vZnJhbWVzPgorPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBTdHlsZXNoZWV0IENTUyB1c2VkCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIHRoaXMgaXMgdGhlIHN0eWxlc2hlZXQgY3NzIHRvIHVzZSBmb3IgbmVhcmx5IGV2ZXJ5dGhpbmcgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIj4KKyAgICAuYmFubmVyY2VsbCB7CisgICAgICBib3JkZXI6IDBweDsKKyAgICAgIHBhZGRpbmc6IDBweDsKKyAgICB9CisgICAgYm9keSB7CisgICAgICBtYXJnaW4tbGVmdDogMTA7CisgICAgICBtYXJnaW4tcmlnaHQ6IDEwOworICAgICAgZm9udDpub3JtYWwgODAlIGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsKKyAgICAgIGNvbG9yOiMwMDAwMDA7CisgICAgfQorICAgIC5hIHRkIHsKKyAgICAgIGJhY2tncm91bmQ6ICNlZmVmZWY7CisgICAgfQorICAgIC5iIHRkIHsKKyAgICAgIGJhY2tncm91bmQ6ICNmZmY7CisgICAgfQorICAgIHRoLCB0ZCB7CisgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB9CisgICAgdGggeworICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgICAgIGJhY2tncm91bmQ6ICNjY2M7CisgICAgICBjb2xvcjogYmxhY2s7CisgICAgfQorICAgIHRhYmxlLCB0aCwgdGQgeworICAgICAgZm9udC1zaXplOjEwMCU7CisgICAgICBib3JkZXI6IG5vbmUKKyAgICB9CisgICAgdGFibGUubG9nIHRyIHRkLCB0ciB0aCB7CisKKyAgICB9CisgICAgaDIgeworICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgICAgIGZvbnQtc2l6ZToxNDAlOworICAgICAgbWFyZ2luLWJvdHRvbTogNTsKKyAgICB9CisgICAgaDMgeworICAgICAgZm9udC1zaXplOjEwMCU7CisgICAgICBmb250LXdlaWdodDpib2xkOworICAgICAgYmFja2dyb3VuZDogIzUyNUQ3NjsKKyAgICAgIGNvbG9yOiB3aGl0ZTsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIHBhZGRpbmc6IDVweDsKKyAgICAgIG1hcmdpbi1yaWdodDogMnB4OworICAgICAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgfQorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBMaXN0IG9mIGFsbCBjbGFzc2VzIGluIGFsbCBwYWNrYWdlcworICAgIFRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgcGFnZSBpbiB0aGUgY2xhc3NMaXN0RnJhbWUKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InNuYXBzaG90IiBtb2RlPSJhbGwuY2xhc3NlcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiLz4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhY2thZ2UvY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIoYW5jZXN0b3I6OnBhY2thZ2UpW2xhc3QoKV0vQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJsaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWU9JycpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRwYWNrYWdlLm5hbWUsJy4nLCcvJykiLz48eHNsOnRleHQ+LzwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9ImNsYXNzRnJhbWUiIGhyZWY9InskbGlua30iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gbGlzdCBvZiBhbGwgcGFja2FnZXMgLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJzbmFwc2hvdCIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayIvPgorICAgICAgICA8L2hlYWQ+CisgICAgICAgIDxib2R5PgorICAgICAgICAgICAgPGgyPjxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Ib21lPC9hPjwvaDI+CisgICAgICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFja2FnZSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIiBvcmRlcj0iYXNjZW5kaW5nIi8+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie3RyYW5zbGF0ZShAbmFtZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gb3ZlcnZpZXcgb2Ygc3RhdGlzdGljcyBpbiBwYWNrYWdlcyAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InNuYXBzaG90IiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiLz4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keSBvbmxvYWQ9Im9wZW4oJ2FsbGNsYXNzZXMtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJykiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICA8aDM+U3VtbWFyeTwvaDM+CisgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8IS0tdGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPkRhdGU8L3RoPgorICAgICAgICAgICAgICAgIDx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+RWxhcHNlZCB0aW1lPC90aC0tPgorICAgICAgICAgICAgICAgIDx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+UmVwb3J0ZWQgQ2xhc3NlczwvdGg+CisgICAgICAgICAgICAgICAgPHRoIHdpZHRoPSIxMCUiIG5vd3JhcD0ibm93cmFwIj5NZXRob2RzIEhpdDwvdGg+CisgICAgICAgICAgICAgICAgPHRoIHdpZHRoPSIxMCUiIG5vd3JhcD0ibm93cmFwIj5MaW5lcyBIaXQ8L3RoPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0ciBjbGFzcz0iYSI+CisgICAgICAgICAgICAgICAgPCEtLXRkIG5vd3JhcD0ibm93cmFwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXhlY3V0aW9uX2xvZy9AcHJvZ3JhbV9zdGFydCIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKGV4ZWN1dGlvbl9sb2cvQGVsYXBzZWRfdGltZSBkaXYgMTAwMCwnMC4wJykiLz5zZWNzPC90ZC0tPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQocGFja2FnZS9jbGFzcykiLz48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcihjb3YuZGF0YS9AaGl0X21ldGhvZHMgZGl2IGNvdi5kYXRhL0B0b3RhbF9tZXRob2RzLCcwLjAlJykiLz48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcihjb3YuZGF0YS9AaGl0X2xpbmVzIGRpdiBjb3YuZGF0YS9AdG90YWxfbGluZXMsJzAuMCUnKSIvPjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+CisgICAgICAgIFRvIGVuc3VyZSBhY2N1cmF0ZSB0ZXN0IHJ1bnMgb24gSmF2YSBhcHBsaWNhdGlvbnMsIGRldmVsb3BlcnMgbmVlZCB0byBrbm93IGhvdyBtdWNoIG9mCisgICAgICAgIHRoZSBjb2RlIGhhcyBiZWVuIHRlc3RlZCwgYW5kIHdoZXJlIHRvIGZpbmQgYW55IHVudGVzdGVkIGNvZGUuIENvdmVyYWdlIGhlbHBzIHlvdQorICAgICAgICBsb2NhdGUgdW50ZXN0ZWQgY29kZSwgYW5kIG1lYXN1cmUgcHJlY2lzZWx5IGhvdyBtdWNoIGNvZGUgaGFzIGJlZW4gZXhlcmNpc2VkLgorICAgICAgICBUaGUgcmVzdWx0IGlzIGEgaGlnaGVyIHF1YWxpdHkgYXBwbGljYXRpb24gaW4gYSBzaG9ydGVyIHBlcmlvZCBvZiB0aW1lLgorICAgICAgICA8cC8+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisKKyAgICAgICAgPGgzPlBhY2thZ2VzPC9oMz4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwYWNrYWdlWzFdIiBtb2RlPSJzdGF0cy5oZWFkZXIiLz4KKyAgICAgICAgICAgIDwhLS0gZGlzcGxheSBwYWNrYWdlcyBhbmQgc29ydCB0aGVtIHZpYSB0aGVpciBjb3ZlcmFnZSByYXRlIC0tPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhY2thZ2UiPgorICAgICAgICAgICAgICAgIDx4c2w6c29ydCBkYXRhLXR5cGU9Im51bWJlciIgc2VsZWN0PSJjb3YuZGF0YS9AaGl0X2xpbmVzIGRpdiBjb3YuZGF0YS9AdG90YWxfbGluZXMiLz4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyIvPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ie3RyYW5zbGF0ZShAbmFtZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9tZXRob2RzIGRpdiBjb3YuZGF0YS9AdG90YWxfbWV0aG9kcywnMC4wJScpIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKGNvdi5kYXRhL0BoaXRfbGluZXMgZGl2IGNvdi5kYXRhL0B0b3RhbF9saW5lcywnMC4wJScpIi8+PC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlRm9vdGVyIi8+CisgICAgICAgIDwvYm9keT4KKyAgICAgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0KKyBkZXRhaWxlZCBpbmZvIGZvciBhIHBhY2thZ2UuIEl0IHdpbGwgb3V0cHV0IHRoZSBsaXN0IG9mIGNsYXNzZXMKKywgdGhlIHN1bW1hcnkgcGFnZSwgYW5kIHRoZSBpbmZvIGZvciBlYWNoIGNsYXNzCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9IndyaXRlIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoQG5hbWUsJy4nLCcvJykiLz48L3hzbDppZj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmFtZSA9ICcnIj4uPC94c2w6aWY+CisgICAgPC94c2w6dmFyaWFibGU+CisKKyAgICA8IS0tIGNyZWF0ZSBhIGNsYXNzZXMtbGlzdC5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLWZyYW1lLmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzZXMubGlzdCIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSBhIHBhY2thZ2Utc3VtbWFyeS5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icGFja2FnZS5zdW1tYXJ5Ii8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gZm9yIGVhY2ggY2xhc3MsIGNyZWF0ZXMgYSBAbmFtZS5odG1sIC0tPgorICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjbGFzcyI+CisgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAbmFtZX0uaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiLz4KKyAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgICA8L3hzbDpmb3ItZWFjaD4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIGxpc3Qgb2YgY2xhc3NlcyBpbiBhIHBhY2thZ2UgLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYWNrYWdlIiBtb2RlPSJjbGFzc2VzLmxpc3QiPgorICAgIDxodG1sPgorICAgICAgICA8SEVBRD4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L0hFQUQ+CisgICAgICAgIDxCT0RZPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8SDI+PGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvSDI+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGFibGU+CisKKyAgICAgICAgICAgIDxIMj5DbGFzc2VzPC9IMj4KKyAgICAgICAgICAgIDxUQUJMRSBXSURUSD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNsYXNzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QG5hbWV9Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgIDwvVEFCTEU+CisgICAgICAgIDwvQk9EWT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBzdW1tYXJ5IG9mIGEgcGFja2FnZSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9InBhY2thZ2Uuc3VtbWFyeSI+CisgICAgPEhUTUw+CisgICAgICAgIDxIRUFEPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvSEVBRD4KKyAgICAgICAgPCEtLSB3aGVuIGxvYWRpbmcgdGhpcyBwYWNrYWdlLCBpdCB3aWxsIG9wZW4gdGhlIGNsYXNzZXMgaW50byB0aGUgZnJhbWUgLS0+CisgICAgICAgIDxCT0RZIG9ubG9hZD0ib3BlbigncGFja2FnZS1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKSI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMz4KKyAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InN0YXRzLmhlYWRlciIvPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ic3RhdHMiLz4KKyAgICAgICAgICAgIDwvdGFibGU+CisKKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoY2xhc3MpICZndDsgMCI+CisgICAgICAgICAgICAgICAgPEgzPkNsYXNzZXM8L0gzPgorICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJzdGF0cy5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjbGFzcyIgbW9kZT0ic3RhdHMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IGRhdGEtdHlwZT0ibnVtYmVyIiBzZWxlY3Q9ImNvdi5kYXRhL0BoaXRfbGluZXMgZGl2IGNvdi5kYXRhL0B0b3RhbF9saW5lcyIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VGb290ZXIiLz4KKyAgICAgICAgPC9CT0RZPgorICAgIDwvSFRNTD4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIGRldGFpbHMgb2YgYSBjbGFzcyAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIoYW5jZXN0b3I6OnBhY2thZ2UpW2xhc3QoKV0vQG5hbWUiLz4KKyAgICA8SFRNTD4KKyAgICAgICAgPEhFQUQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L0hFQUQ+CisgICAgICAgIDxCT0RZPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKyAgICAgICAgICAgIDxIMz5DbGFzcyA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPi48L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L0gzPgorCisgICAgICAgICAgICA8IS0tIGNsYXNzIHN1bW1hcnkgLS0+CisgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJzdGF0cy5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InN0YXRzIi8+CisgICAgICAgICAgICA8L3RhYmxlPgorCisgICAgICAgICAgICA8IS0tIGRldGFpbHMgb2YgbWV0aG9kcyAtLT4KKyAgICAgICAgICAgIDxIMz5NZXRob2RzPC9IMz4KKyAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1ldGhvZFsxXSIgbW9kZT0ic3RhdHMuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtZXRob2QiIG1vZGU9InN0YXRzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IGRhdGEtdHlwZT0ibnVtYmVyIiBzZWxlY3Q9ImNvdi5kYXRhL0BoaXRfbGluZXMgZGl2IGNvdi5kYXRhL0B0b3RhbF9saW5lcyIvPgorICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciIvPgorICAgICAgICA8L0JPRFk+CisgICAgPC9IVE1MPgorCis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBQYWdlIEhlYWRlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciI+CisgIDwhLS0gamFrYXJ0YSBsb2dvIC0tPgorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgPHRyPgorICAgIDx0ZCBjbGFzcz0iYmFubmVyY2VsbCIgcm93c3Bhbj0iMiI+CisgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLyI+CisgICAgICA8aW1nIHNyYz0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiIgYWx0PSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIiBhbGlnbj0ibGVmdCIgYm9yZGVyPSIwIi8+CisgICAgICA8L2E+CisgICAgPC90ZD4KKyAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48aDI+U291cmNlIENvZGUgQ292ZXJhZ2U8L2gyPjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cDovL3d3dy5zaXRyYWthLmNvbS9qcHJvYmUnPlNpdHJha2EgSlByb2JlPC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZyc+QW50PC9hPi48L3RkPgorICAgICAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDxociBzaXplPSIxIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBQYWdlIEZvb3RlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8eHNsOnRlbXBsYXRlIG5hbWU9InRhYmxlLmhlYWRlciI+CisgICAgPHRyPgorICAgICAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+CisgICAgICAgIDx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+TWV0aG9kcyBIaXQ8L3RoPgorICAgICAgICA8dGggd2lkdGg9IjEwJSIgbm93cmFwPSJub3dyYXAiPkxpbmVzIEhpdDwvdGg+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRob2QiIG1vZGU9InN0YXRzLmhlYWRlciI+CisgICAgPHRyPgorICAgICAgICA8dGggd2lkdGg9IjkwJSI+TmFtZTwvdGg+CisgICAgICAgIDx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+TGluZXMgSGl0PC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRob2QiIG1vZGU9InN0YXRzIj4KKyAgICA8dHI+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyIvPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcihjb3YuZGF0YS9AaGl0X2xpbmVzIGRpdiBjb3YuZGF0YS9AdG90YWxfbGluZXMsJzAuMCUnKSIvPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFja2FnZXxjbGFzcyIgbW9kZT0ic3RhdHMuaGVhZGVyIj4KKyAgICA8dHI+CisgICAgICAgIDx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KKyAgICAgICAgPHRoIHdpZHRoPSIxMCUiIG5vd3JhcD0ibm93cmFwIj5NZXRob2RzIEhpdDwvdGg+CisgICAgICAgIDx0aCB3aWR0aD0iMTAlIiBub3dyYXA9Im5vd3JhcCI+TGluZXMgSGl0PC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYWNrYWdlfGNsYXNzIiBtb2RlPSJzdGF0cyI+CisgICAgPHRyPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZS1yb3ciLz4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcihjb3YuZGF0YS9AaGl0X21ldGhvZHMgZGl2IGNvdi5kYXRhL0B0b3RhbF9tZXRob2RzLCcwLjAlJykiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoY292LmRhdGEvQGhpdF9saW5lcyBkaXYgY292LmRhdGEvQHRvdGFsX2xpbmVzLCcwLjAlJykiLz48L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLQorICAgIHRyYW5zZm9ybSBzdHJpbmcgbGlrZSBhLmIuYyB0byAuLi8uLi8uLi8KKyAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgKKy0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KKyAgICA8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRwYXRoLCcuJykiPgorICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsJy4nKSIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC94c2w6aWY+CisgICAgPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoJHBhdGgsJy4nKSkgYW5kIG5vdCgkcGF0aCA9ICcnKSI+CisgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICAgIDwveHNsOmlmPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBjcmVhdGUgdGhlIGxpbmsgdG8gdGhlIHN0eWxlc2hlZXQgYmFzZWQgb24gdGhlIHBhY2thZ2UgbmFtZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICA8TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgVElUTEU9IlN0eWxlIj48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJ3VubmFtZWQgcGFja2FnZScpIj48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGF0aCI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+PC94c2w6aWY+c3R5bGVzaGVldC5jc3M8L3hzbDphdHRyaWJ1dGU+PC9MSU5LPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gYWx0ZXJuYXRlZCByb3cgc3R5bGUgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZS1yb3ciPgorPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAxIj5hPC94c2w6aWY+CisgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDAiPmI8L3hzbDppZj4KKzwveHNsOmF0dHJpYnV0ZT4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgorCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvamRlcGVuZC1mcmFtZXMueHNsIGIvdHJ1bmsvc3JjL2V0Yy9qZGVwZW5kLWZyYW1lcy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjOWRjYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvamRlcGVuZC1mcmFtZXMueHNsCkBAIC0wLDAgKzEsNDg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzx4c2w6c3R5bGVzaGVldCAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKKyAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgorICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiCisgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJyZWRpcmVjdCI+Cis8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiLz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAKKy0tPgorPCEtLQorCisgU2FtcGxlIHN0eWxlc2hlZXQgdG8gYmUgdXNlZCB3aXRoIEpEZXBlbmQgWE1MIG91dHB1dC4KKworIEl0IGNyZWF0ZXMgYSBzZXQgb2YgSFRNTCBmaWxlcyBhIGxhIGphdmFkb2Mgd2hlcmUgeW91IGNhbiBicm93c2UgZWFzaWx5CisgdGhyb3VnaCBhbGwgcGFja2FnZXMgYW5kIGNsYXNzZXMuCisKKyBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqdHVsbGV5QG5vdmVsbC5jb20iPkplZmYgVHVsbGV5PC9hPgorCisgIC0tPgorPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJKRGVwZW5kIj4KKyAgIDwhLS0gY3JlYXRlIHRoZSBpbmRleC5odG1sIC0tPgorICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vaW5kZXguaHRtbCI+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgorICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICA8IS0tIGNyZWF0ZSB0aGUgc3R5bGVzaGVldC5jc3MgLS0+CisgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3N0eWxlc2hlZXQuY3NzIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiLz4KKyAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgIDwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgorICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiLz4KKyAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1wYWNrYWdlcy5odG1sIj4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InBhY2thZ2VzLmRldGFpbHMiLz4KKyAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LWN5Y2xlcy5odG1sIGF0IHRoZSByb290IC0tPgorICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctY3ljbGVzLmh0bWwiPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY3ljbGVzLmRldGFpbHMiLz4KKyAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LWN5Y2xlcy5odG1sIGF0IHRoZSByb290IC0tPgorICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwiPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iZXhwbGFuYXRpb25zIi8+CisgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgPCEtLSBjcmVhdGUgdGhlIGFsbC1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgorICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsLXBhY2thZ2VzLmh0bWwiPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iUGFja2FnZXMiIG1vZGU9ImFsbC5wYWNrYWdlcyIvPgorICA8L3JlZGlyZWN0OndyaXRlPgorCisgIDwhLS0gY3JlYXRlIHRoZSBhbGwtY3ljbGVzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbC1jeWNsZXMuaHRtbCI+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJDeWNsZXMiIG1vZGU9ImFsbC5jeWNsZXMiLz4KKyAgPC9yZWRpcmVjdDp3cml0ZT4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCI+Cis8aHRtbD4KKyAgIDxoZWFkPgorICAgICAgPHRpdGxlPkpEZXBlbmQgQW5hbHlzaXM8L3RpdGxlPgorICAgPC9oZWFkPgorICAgICAgPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgorICAgICAgICAgPGZyYW1lc2V0IHJvd3M9IjMwJSw3MCUiPgorICAgICAgICAgICAgPGZyYW1lIHNyYz0iYWxsLXBhY2thZ2VzLmh0bWwiIG5hbWU9InBhY2thZ2VMaXN0RnJhbWUiLz4KKyAgICAgICAgICAgIDxmcmFtZSBzcmM9ImFsbC1jeWNsZXMuaHRtbCIgbmFtZT0iY2xhc3NMaXN0RnJhbWUiLz4KKyAgICAgICAgIDwvZnJhbWVzZXQ+CisgICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIG5hbWU9ImNsYXNzRnJhbWUiLz4KKyAgICAgIDwvZnJhbWVzZXQ+CisgICAgICA8bm9mcmFtZXM+CisgICAgICAgICA8aDI+RnJhbWUgQWxlcnQ8L2gyPgorICAgICAgICAgPHA+CisgICAgICAgICAgICBUaGlzIGRvY3VtZW50IGlzIGRlc2lnbmVkIHRvIGJlIHZpZXdlZCB1c2luZyB0aGUgZnJhbWVzIGZlYXR1cmUuIElmIHlvdSBzZWUgdGhpcyBtZXNzYWdlLCB5b3UgYXJlIHVzaW5nIGEgbm9uLWZyYW1lLWNhcGFibGUgd2ViIGNsaWVudC4KKyAgICAgICAgIDwvcD4KKyAgICAgIDwvbm9mcmFtZXM+Cis8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+CisgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgIGJvZHkgeworICAgIGZvbnQ6bm9ybWFsIDY4JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsKKyAgICBjb2xvcjojMDAwMDAwOworICAgIH0KKyAgICB0YWJsZSB0ciB0ZCwgdHIgdGggeworICAgICAgZm9udC1zaXplOiA2OCU7CisgICAgfQorICAgIHRhYmxlLmRldGFpbHMgdHIgdGh7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjpsZWZ0OworICAgIGJhY2tncm91bmQ6I2E2Y2FmMDsKKyAgICB9CisgICAgdGFibGUuZGV0YWlscyB0ciB0ZHsKKyAgICBiYWNrZ3JvdW5kOiNlZWVlZTA7CisgICAgfQorCisgICAgcCB7CisgICAgbGluZS1oZWlnaHQ6MS41ZW07CisgICAgbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKKyAgICBtYXJnaW4tbGVmdDoyZW07CisgICAgbWFyZ2luLXJpZ2h0OjJlbTsKKyAgICB9CisgICAgaDEgeworICAgIG1hcmdpbjogMHB4IDBweCA1cHg7IGZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICB9CisgICAgaDIgeworICAgIG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTI1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgIH0KKyAgICBoMyB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgIH0KKyAgICBoNCB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgIH0KKyAgICBoNSB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgIH0KKyAgICBoNiB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgIH0KKyAgICAuRXJyb3IgeworICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnJlZDsKKyAgICB9CisgICAgLkZhaWx1cmUgeworICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnB1cnBsZTsKKyAgICB9CisgICAgLlByb3BlcnRpZXMgeworICAgIHRleHQtYWxpZ246cmlnaHQ7CisgICAgfQorICA8L3N0eWxlPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9IkpEZXBlbmQiIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIj4KKyAgIDxodG1sPgorICAgICAgPGhlYWQ+CisgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0LmNzcyIvPgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0ciBhbGlnbj0ibGVmdCI+PGgyPlN1bW1hcnk8L2gyPjx0ZD4KKyAgPC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KKyAgW3N1bW1hcnldCisgIFs8YSBocmVmPSJvdmVydmlldy1wYWNrYWdlcy5odG1sIj5wYWNrYWdlczwvYT5dCisgIFs8YSBocmVmPSJvdmVydmlldy1jeWNsZXMuaHRtbCI+Y3ljbGVzPC9hPl0KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sIj5leHBsYW5hdGlvbnM8L2E+XQorICAgPC90ZD48L3RyPjwvdGFibGU+CisgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNsYXNzPSJkZXRhaWxzIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgIDx0aD5QYWNrYWdlPC90aD4KKyAgICAgICAgICAgICAgIDx0aD5Ub3RhbCBDbGFzc2VzPC90aD4KKyAgICAgICAgICAgICAgIDx0aD48YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCNFWG51bWJlciI+QWJzdHJhY3QgQ2xhc3NlczwvYT48L3RoPgorICAgICAgICAgICAgICAgPHRoPjxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sI0VYbnVtYmVyIj5Db25jcmV0ZSBDbGFzc2VzPC9hPjwvdGg+CisgICAgICAgICAgICAgICA8dGg+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhhZmZlcmVudCI+QWZmZXJlbnQgQ291cGxpbmdzPC9hPjwvdGg+CisgICAgICAgICAgICAgICA8dGg+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhlZmZlcmVudCI+RWZmZXJlbnQgQ291cGxpbmdzPC9hPjwvdGg+CisgICAgICAgICAgICAgICA8dGg+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhhYnN0cmFjdG5lc3MiPkFic3RyYWN0bmVzczwvYT48L3RoPgorICAgICAgICAgICAgICAgPHRoPjxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sI0VYaW5zdGFiaWxpdHkiPkluc3RhYmlsaXR5PC9hPjwvdGg+CisgICAgICAgICAgICAgICA8dGg+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhkaXN0YW5jZSI+RGlzdGFuY2U8L2E+PC90aD4KKworICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL1BhY2thZ2VzL1BhY2thZ2UiPgorICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChlcnJvcikgPSAwIj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPm92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwjUEs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9Ub3RhbENsYXNzZXMiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0Fic3RyYWN0Q2xhc3NlcyIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQ29uY3JldGVDbGFzc2VzIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9DYSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQ2UiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0EiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0kiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0QiLz48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi9QYWNrYWdlcy9QYWNrYWdlIj4KKyAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoZXJyb3IpICZndDsgMCI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiBjb2xzcGFuPSI4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXJyb3IiLz48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICA8L3RhYmxlPgorICAgICAgPC9ib2R5PgorICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9IkpEZXBlbmQiIG1vZGU9InBhY2thZ2VzLmRldGFpbHMiPgorICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0LmNzcyIvPgorICAgICAgPC9oZWFkPgorICAgICAgPGJvZHk+CisgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0ciBhbGlnbj0ibGVmdCI+PGgyPlBhY2thZ2VzPC9oMj48dGQ+CisgIDwvdGQ+PHRkIGFsaWduPSJyaWdodCI+CisgIFs8YSBocmVmPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiPnN1bW1hcnk8L2E+XQorICBbcGFja2FnZXNdCisgIFs8YSBocmVmPSJvdmVydmlldy1jeWNsZXMuaHRtbCI+Y3ljbGVzPC9hPl0KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sIj5leHBsYW5hdGlvbnM8L2E+XQorICAgPC90ZD48L3RyPjwvdGFibGU+CisKKyAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vUGFja2FnZXMvUGFja2FnZSI+CisgICAgPHhzbDppZiB0ZXN0PSJjb3VudChlcnJvcikgPSAwIj4KKyAgICAgIDxoMz48YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj5QSzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L2gzPgorCisgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0cj4KKyAgICAgICAgPHRkPjxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sI0VYYWZmZXJlbnQiPkFmZmVyZW50IENvdXBsaW5nczwvYT46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9DYSIvPjwvdGQ+CisgICAgICAgIDx0ZD48YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCNFWGVmZmVyZW50Ij5FZmZlcmVudCBDb3VwbGluZ3M8L2E+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQ2UiLz48L3RkPgorICAgICAgICA8dGQ+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhhYnN0cmFjdG5lc3MiPkFic3RyYWN0bmVzczwvYT46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9BIi8+PC90ZD4KKyAgICAgICAgPHRkPjxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sI0VYaW5zdGFiaWxpdHkiPkluc3RhYmlsaXR5PC9hPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0kiLz48L3RkPgorICAgICAgICA8dGQ+PGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwjRVhkaXN0YW5jZSI+RGlzdGFuY2U8L2E+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvRCIvPjwvdGQ+CisgICAgICA8L3RyPjwvdGFibGU+CisKKyAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2xhc3M9ImRldGFpbHMiPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoPkFic3RyYWN0IENsYXNzZXM8L3RoPgorICAgICAgICAgIDx0aD5Db25jcmV0ZSBDbGFzc2VzPC90aD4KKyAgICAgICAgICA8dGg+VXNlZCBieSBQYWNrYWdlczwvdGg+CisgICAgICAgICAgPHRoPlVzZXMgUGFja2FnZXM8L3RoPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjUlIj4KKyAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KEFic3RyYWN0Q2xhc3Nlcy9DbGFzcyk9MCI+CisgICAgICAgICAgICAgIDxpPk5vbmU8L2k+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJBYnN0cmFjdENsYXNzZXMvQ2xhc3MiPgorICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+PGJyLz4KKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjUlIj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoQ29uY3JldGVDbGFzc2VzL0NsYXNzKT0wIj4KKyAgICAgICAgICAgICAgPGk+Tm9uZTwvaT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkNvbmNyZXRlQ2xhc3Nlcy9DbGFzcyI+CisgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub2RlKCkiLz48YnIvPgorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNSUiPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChVc2VkQnkvUGFja2FnZSk9MCI+CisgICAgICAgICAgICAgIDxpPk5vbmU8L2k+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJVc2VkQnkvUGFja2FnZSI+CisgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+b3ZlcnZpZXctcGFja2FnZXMuaHRtbCNQSzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub2RlKCkiLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPgorICAgICAgICAgICAgICA8L2E+PGJyLz4KKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjUlIj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoRGVwZW5kc1Vwb24vUGFja2FnZSk9MCI+CisgICAgICAgICAgICAgIDxpPk5vbmU8L2k+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJEZXBlbmRzVXBvbi9QYWNrYWdlIj4KKyAgICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5vdmVydmlldy1wYWNrYWdlcy5odG1sI1BLPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+CisgICAgICAgICAgICAgIDwvYT48YnIvPgorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgIDwvdGFibGU+CisgICAgPC94c2w6aWY+CisgIDwveHNsOmZvci1lYWNoPgorICA8IS0tIHRoaXMgaXMgb2Z0ZW4gYSBsb25nIGxpc3Rpbmc7IHByb3ZpZGUgYSBsb3dlciBuYXZpZ2F0aW9uIHRhYmxlIGFsc28gLS0+CisgIDx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyIGFsaWduPSJsZWZ0Ij48dGQ+PC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+c3VtbWFyeTwvYT5dCisgIFtwYWNrYWdlc10KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LWN5Y2xlcy5odG1sIj5jeWNsZXM8L2E+XQorICBbPGEgaHJlZj0ib3ZlcnZpZXctZXhwbGFuYXRpb25zLmh0bWwiPmV4cGxhbmF0aW9uczwvYT5dCisgICA8L3RkPjwvdHI+PC90YWJsZT4KKyAgICAgIDwvYm9keT4KKyAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJKRGVwZW5kIiBtb2RlPSJjeWNsZXMuZGV0YWlscyI+CisgICA8aHRtbD4KKyAgICAgIDxoZWFkPgorICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldC5jc3MiLz4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKyAgPHRhYmxlIHdpZHRoPSIxMDAlIj48dHIgYWxpZ249ImxlZnQiPjxoMj5DeWNsZXM8L2gyPjx0ZD4KKyAgPC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+c3VtbWFyeTwvYT5dCisgIFs8YSBocmVmPSJvdmVydmlldy1wYWNrYWdlcy5odG1sIj5wYWNrYWdlczwvYT5dCisgIFtjeWNsZXNdCisgIFs8YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCI+ZXhwbGFuYXRpb25zPC9hPl0KKyAgIDwvdGQ+PC90cj48L3RhYmxlPgorICA8IS0tPHRhYmxlIHdpZHRoPSIxMDAlIj48dHI+PHRkPgorICA8L3RkPjx0ZCBhbGlnbj0icmlnaHQiPgorICAgIFs8YSBocmVmPSIjTlZzdW1tYXJ5Ij5zdW1tYXJ5PC9hPl0KKyAgWzxhIGhyZWY9IiNOVnBhY2thZ2VzIj5wYWNrYWdlczwvYT5dCisgIFs8YSBocmVmPSIjTlZjeWNsZXMiPmN5Y2xlczwvYT5dCisgICBbPGEgaHJlZj0iI05WZXhwbGFuYXRpb25zIj5leHBsYW5hdGlvbnM8L2E+XQorICA8L3RkPjwvdHI+PC90YWJsZT4gLS0+CisKKyAgPHhzbDppZiB0ZXN0PSJjb3VudChDeWNsZXMvUGFja2FnZSkgPSAwIj4KKyAgICA8cD5UaGVyZSBhcmUgbm8gY3ljbGljIGRlcGVuZGFuY2llcy48L3A+CisgIDwveHNsOmlmPgorICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQ3ljbGVzL1BhY2thZ2UiPgorICAgICA8aDM+PGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+I0NZPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBOYW1lIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJATmFtZSIvPjwvYT48L2gzPjxwPgorICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJQYWNrYWdlIj4KKyAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PGJyLz4KKyAgICA8L3hzbDpmb3ItZWFjaD48L3A+CisgIDwveHNsOmZvci1lYWNoPgorICA8IS0tIHRoaXMgaXMgb2Z0ZW4gYSBsb25nIGxpc3Rpbmc7IHByb3ZpZGUgYSBsb3dlciBuYXZpZ2F0aW9uIHRhYmxlIGFsc28gLS0+CisgIDx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyIGFsaWduPSJsZWZ0Ij48dGQ+PC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+c3VtbWFyeTwvYT5dCisgIFs8YSBocmVmPSJvdmVydmlldy1wYWNrYWdlcy5odG1sIj5wYWNrYWdlczwvYT5dCisgIFtjeWNsZXNdCisgIFs8YSBocmVmPSJvdmVydmlldy1leHBsYW5hdGlvbnMuaHRtbCI+ZXhwbGFuYXRpb25zPC9hPl0KKyAgIDwvdGQ+PC90cj48L3RhYmxlPgorICA8L2JvZHk+CisgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJKRGVwZW5kIiBtb2RlPSJleHBsYW5hdGlvbnMiPgorICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXQuY3NzIi8+CisgICAgICA8L2hlYWQ+CisgICAgICA8Ym9keT4KKyAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIj48dHIgYWxpZ249ImxlZnQiPjxoMj5FeHBsYW5hdGlvbnM8L2gyPjx0ZD4KKyAgPC90ZD48dGQgYWxpZ249InJpZ2h0Ij4KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+c3VtbWFyeTwvYT5dCisgIFs8YSBocmVmPSJvdmVydmlldy1wYWNrYWdlcy5odG1sIj5wYWNrYWdlczwvYT5dCisgIFs8YSBocmVmPSJvdmVydmlldy1jeWNsZXMuaHRtbCI+Y3ljbGVzPC9hPl0KKyAgW2V4cGxhbmF0aW9uc10KKyAgIDwvdGQ+PC90cj48L3RhYmxlPgorCisgIDxwPlRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb25zIGFyZSBmb3IgcXVpY2sgcmVmZXJlbmNlIGFuZCBhcmUgbGlmdGVkIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPkpEZXBlbmQgZG9jdW1lbnRhdGlvbjwvYT4uPC9wPgorCisgIDxoMz48YSBuYW1lPSJFWG51bWJlciI+TnVtYmVyIG9mIENsYXNzZXM8L2E+PC9oMz4KKyAgICA8cD5UaGUgbnVtYmVyIG9mIGNvbmNyZXRlIGFuZCBhYnN0cmFjdCBjbGFzc2VzIChhbmQgaW50ZXJmYWNlcykgaW4gdGhlIHBhY2thZ2UgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBleHRlbnNpYmlsaXR5IG9mIHRoZSBwYWNrYWdlLjwvcD4KKyAgPGgzPjxhIG5hbWU9IkVYYWZmZXJlbnQiPkFmZmVyZW50IENvdXBsaW5nczwvYT48L2gzPgorICAgIDxwPlRoZSBudW1iZXIgb2Ygb3RoZXIgcGFja2FnZXMgdGhhdCBkZXBlbmQgdXBvbiBjbGFzc2VzIHdpdGhpbiB0aGUgcGFja2FnZSBpcyBhbiBpbmRpY2F0b3Igb2YgdGhlIHBhY2thZ2UncyByZXNwb25zaWJpbGl0eS4gPC9wPgorICA8aDM+PGEgbmFtZT0iRVhlZmZlcmVudCI+RWZmZXJlbnQgQ291cGxpbmdzPC9hPjwvaDM+CisgICAgPHA+VGhlIG51bWJlciBvZiBvdGhlciBwYWNrYWdlcyB0aGF0IHRoZSBjbGFzc2VzIGluIHRoZSBwYWNrYWdlIGRlcGVuZCB1cG9uIGlzIGFuIGluZGljYXRvciBvZiB0aGUgcGFja2FnZSdzIGluZGVwZW5kZW5jZS4gPC9wPgorICA8aDM+PGEgbmFtZT0iRVhhYnN0cmFjdG5lc3MiPkFic3RyYWN0bmVzczwvYT48L2gzPgorICAgIDxwPlRoZSByYXRpbyBvZiB0aGUgbnVtYmVyIG9mIGFic3RyYWN0IGNsYXNzZXMgKGFuZCBpbnRlcmZhY2VzKSBpbiB0aGUgYW5hbHl6ZWQgcGFja2FnZSB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGNsYXNzZXMgaW4gdGhlIGFuYWx5emVkIHBhY2thZ2UuIDwvcD4KKyAgICA8cD5UaGUgcmFuZ2UgZm9yIHRoaXMgbWV0cmljIGlzIDAgdG8gMSwgd2l0aCBBPTAgaW5kaWNhdGluZyBhIGNvbXBsZXRlbHkgY29uY3JldGUgcGFja2FnZSBhbmQgQT0xIGluZGljYXRpbmcgYSBjb21wbGV0ZWx5IGFic3RyYWN0IHBhY2thZ2UuIDwvcD4KKyAgPGgzPjxhIG5hbWU9IkVYaW5zdGFiaWxpdHkiPkluc3RhYmlsaXR5PC9hPjwvaDM+CisgICAgPHA+VGhlIHJhdGlvIG9mIGVmZmVyZW50IGNvdXBsaW5nIChDZSkgdG8gdG90YWwgY291cGxpbmcgKENlIC8gKENlICsgQ2EpKS4gVGhpcyBtZXRyaWMgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBwYWNrYWdlJ3MgcmVzaWxpZW5jZSB0byBjaGFuZ2UuIDwvcD4KKyAgICA8cD5UaGUgcmFuZ2UgZm9yIHRoaXMgbWV0cmljIGlzIDAgdG8gMSwgd2l0aCBJPTAgaW5kaWNhdGluZyBhIGNvbXBsZXRlbHkgc3RhYmxlIHBhY2thZ2UgYW5kIEk9MSBpbmRpY2F0aW5nIGEgY29tcGxldGVseSBpbnN0YWJsZSBwYWNrYWdlLiA8L3A+CisgIDxoMz48YSBuYW1lPSJFWGRpc3RhbmNlIj5EaXN0YW5jZTwvYT48L2gzPgorICAgIDxwPlRoZSBwZXJwZW5kaWN1bGFyIGRpc3RhbmNlIG9mIGEgcGFja2FnZSBmcm9tIHRoZSBpZGVhbGl6ZWQgbGluZSBBICsgSSA9IDEuIFRoaXMgbWV0cmljIGlzIGFuIGluZGljYXRvciBvZiB0aGUgcGFja2FnZSdzIGJhbGFuY2UgYmV0d2VlbiBhYnN0cmFjdG5lc3MgYW5kIHN0YWJpbGl0eS4gPC9wPgorICAgIDxwPkEgcGFja2FnZSBzcXVhcmVseSBvbiB0aGUgbWFpbiBzZXF1ZW5jZSBpcyBvcHRpbWFsbHkgYmFsYW5jZWQgd2l0aCByZXNwZWN0IHRvIGl0cyBhYnN0cmFjdG5lc3MgYW5kIHN0YWJpbGl0eS4gSWRlYWwgcGFja2FnZXMgYXJlIGVpdGhlciBjb21wbGV0ZWx5IGFic3RyYWN0IGFuZCBzdGFibGUgKHg9MCwgeT0xKSBvciBjb21wbGV0ZWx5IGNvbmNyZXRlIGFuZCBpbnN0YWJsZSAoeD0xLCB5PTApLiA8L3A+CisgICAgPHA+VGhlIHJhbmdlIGZvciB0aGlzIG1ldHJpYyBpcyAwIHRvIDEsIHdpdGggRD0wIGluZGljYXRpbmcgYSBwYWNrYWdlIHRoYXQgaXMgY29pbmNpZGVudCB3aXRoIHRoZSBtYWluIHNlcXVlbmNlIGFuZCBEPTEgaW5kaWNhdGluZyBhIHBhY2thZ2UgdGhhdCBpcyBhcyBmYXIgZnJvbSB0aGUgbWFpbiBzZXF1ZW5jZSBhcyBwb3NzaWJsZS4gPC9wPgorCisgICAgICA8L2JvZHk+CisgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCitDcmVhdGVzIGFuIGh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZSBsaW5rcyBpbiBvdmVydmlldy1wYWNrYWdlcy5odG1sLgorICBAYnVnIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIGhlcmUsIEkgZG9uJ3Qga25vdyB5ZXQgaG93IHRvIGhhbmRsZSB1bm5hbWVkIHBhY2thZ2UgOigKKy0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSkRlcGVuZC9QYWNrYWdlcyIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KKyAgPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0LmNzcyIvPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgPHRhYmxlIHdpZHRoPSIxMDAlIj48dHIgYWxpZ249ImxlZnQiPjx0ZD48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCIgYWxpZ249InJpZ2h0Ij4KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5zdW1tYXJ5PC9hPl0KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+cGFja2FnZXM8L2E+XQorICBbPGEgaHJlZj0ib3ZlcnZpZXctY3ljbGVzLmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+Y3ljbGVzPC9hPl0KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPmV4cGxhbmF0aW9uczwvYT5dCisgICA8L3RkPjwvdHI+PC90YWJsZT4KKyAgICAgIDxoMj5QYWNrYWdlczwvaDI+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJQYWNrYWdlW2NvdW50KGVycm9yKT0wXSIgbW9kZT0iYWxsLnBhY2thZ2VzLmxpbmsiPgorICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJQYWNrYWdlW2NvdW50KGVycm9yKSAmZ3Q7IDBdIiBtb2RlPSJhbGwucGFja2FnZXMubm9saW5rIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICA8L3RhYmxlPgorICAgIDwvYm9keT4KKyAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9IkpEZXBlbmQvUGFja2FnZXMvUGFja2FnZSIgbW9kZT0iYWxsLnBhY2thZ2VzLmxpbmsiPgorICA8dHI+CisgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgIDxhIGhyZWY9Im92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwjUEt7QG5hbWV9IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgIDwvYT4KKyAgICA8L3RkPgorICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0KK0kgZG8gbm90IGtub3cgSkRlcGVuZCBlbm91Z2ggdG8ga25vdyBpZiBldmVyeSBlcnJvciByZXN1bHRzIGluIGEgbm9uLWFuYWx5emVkIHBhY2thZ2UsCitidXQgdGhhdCBpcyBob3cgSSBhbSBwcmVzZW50aW5nIGl0IHRvIHRoZSB2aWV3ZXIuICBUaGlzIG1heSBuZWVkIHRvIGNoYW5nZS4KKyAgQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSBoZXJlLCBJIGRvbid0IGtub3cgeWV0IGhvdyB0byBoYW5kbGUgdW5uYW1lZCBwYWNrYWdlIDooCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9IkpEZXBlbmQvUGFja2FnZXMvUGFja2FnZSIgbW9kZT0iYWxsLnBhY2thZ2VzLm5vbGluayI+CisgIDx0cj4KKyAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgIE5vdCBBbmFseXplZDogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgPC90ZD4KKyAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tCitDcmVhdGVzIGFuIGh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZSBsaW5rcyBpbiBvdmVydmlldy1jeWNsZXMuaHRtbC4KKyAgQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSBoZXJlLCBJIGRvbid0IGtub3cgeWV0IGhvdyB0byBoYW5kbGUgdW5uYW1lZCBwYWNrYWdlIDooCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9IkpEZXBlbmQvQ3ljbGVzIiBtb2RlPSJhbGwuY3ljbGVzIj4KKyAgPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0LmNzcyIvPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgPHRhYmxlIHdpZHRoPSIxMDAlIj48dHIgYWxpZ249ImxlZnQiPjx0ZD48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCIgYWxpZ249InJpZ2h0Ij4KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5zdW1tYXJ5PC9hPl0KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+cGFja2FnZXM8L2E+XQorICBbPGEgaHJlZj0ib3ZlcnZpZXctY3ljbGVzLmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+Y3ljbGVzPC9hPl0KKyAgWzxhIGhyZWY9Im92ZXJ2aWV3LWV4cGxhbmF0aW9ucy5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPmV4cGxhbmF0aW9uczwvYT5dCisgICA8L3RkPjwvdHI+PC90YWJsZT4KKyAgICAgIDxoMj5DeWNsZXM8L2gyPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IlBhY2thZ2UiIG1vZGU9ImFsbC5jeWNsZXMiPgorICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQE5hbWUiLz4KKyAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgIDwvdGFibGU+CisgICAgPC9ib2R5PgorICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSkRlcGVuZC9DeWNsZXMvUGFja2FnZSIgbW9kZT0iYWxsLmN5Y2xlcyI+CisgIDx0cj4KKyAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgPGEgaHJlZj0ib3ZlcnZpZXctY3ljbGVzLmh0bWwjQ1l7QE5hbWV9IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJATmFtZSIvPjwvYT4KKyAgICA8L3RkPgorICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gUGFnZSBIRUFERVIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgorICAgPGgxPkpEZXBlbmQgQW5hbHlzaXM8L2gxPgorICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICA8dHI+CisgICAgPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPkpEZXBlbmQ8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIj5BbnQ8L2E+LjwvdGQ+CisgIDwvdHI+CisgIDwvdGFibGU+CisgIDxociBzaXplPSIxIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvamRlcGVuZC54c2wgYi90cnVuay9zcmMvZXRjL2pkZXBlbmQueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTMyOTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL2pkZXBlbmQueHNsCkBAIC0wLDAgKzEsMjc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KKworPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiAgZW5jb2Rpbmc9IlVTLUFTQ0lJIi8+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9IkpEZXBlbmQiPgorICAgIDxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+SkRlcGVuZCBBbmFseXNpczwvdGl0bGU+CisgICAgICAgIAorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICBib2R5IHsKKyAgICAgICAgZm9udDpub3JtYWwgNjglIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhOworICAgICAgICBjb2xvcjojMDAwMDAwOworICAgICAgfQorICAgICAgdGFibGUgdHIgdGQsIHRyIHRoIHsKKyAgICAgICAgICBmb250LXNpemU6IDY4JTsKKyAgICAgIH0KKyAgICAgIHRhYmxlLmRldGFpbHMgdHIgdGh7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICB0ZXh0LWFsaWduOmxlZnQ7CisgICAgICAgIGJhY2tncm91bmQ6I2E2Y2FmMDsKKyAgICAgIH0KKyAgICAgIHRhYmxlLmRldGFpbHMgdHIgdGR7CisgICAgICAgIGJhY2tncm91bmQ6I2VlZWVlMDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgcCB7CisgICAgICAgIGxpbmUtaGVpZ2h0OjEuNWVtOworICAgICAgICBtYXJnaW4tdG9wOjAuNWVtOyBtYXJnaW4tYm90dG9tOjEuMGVtOworICAgICAgICBtYXJnaW4tbGVmdDoyZW07CisgICAgICAgIG1hcmdpbi1yaWdodDoyZW07CisgICAgICB9CisgICAgICBoMSB7CisgICAgICAgIG1hcmdpbjogMHB4IDBweCA1cHg7IGZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIGgyIHsKKyAgICAgICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCisgICAgICB9CisgICAgICBoMyB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIGg0IHsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgICAgfQorICAgICAgaDUgeworICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCisgICAgICB9CisgICAgICBoNiB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIC5FcnJvciB7CisgICAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnJlZDsKKyAgICAgIH0KKyAgICAgIC5GYWlsdXJlIHsKKyAgICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOworICAgICAgfQorICAgICAgLlByb3BlcnRpZXMgeworICAgICAgICB0ZXh0LWFsaWduOnJpZ2h0OworICAgICAgfQorICAgICAgPC9zdHlsZT4KKyAgICAgICAgCisgICAgICAgIAorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICA8IS0taDE+SkRlcGVuZCBSZXBvcnQ8L2gxPgorICAgIDx1bD4KKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi9QYWNrYWdlcy9QYWNrYWdlIj4KKyAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICA8bGk+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9saT4KKyAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3VsLS0+CisgICAgCisgICAgPGgxPjxhIG5hbWU9InRvcCI+SkRlcGVuZCBBbmFseXNpczwvYT48L2gxPgorICAgIDxwIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPkpEZXBlbmQ8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIj5BbnQ8L2E+LjwvcD4KKyAgICA8aHIgc2l6ZT0iMiIgLz4KKyAgICAKKyAgICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0cj48dGQ+CisgICAgPGEgbmFtZT0iTlZzdW1tYXJ5Ij48aDI+U3VtbWFyeTwvaDI+PC9hPgorICAgIDwvdGQ+PHRkIGFsaWduPSJyaWdodCI+CisgICAgWzxhIGhyZWY9IiNOVnN1bW1hcnkiPnN1bW1hcnk8L2E+XQorICAgIFs8YSBocmVmPSIjTlZwYWNrYWdlcyI+cGFja2FnZXM8L2E+XQorICAgIFs8YSBocmVmPSIjTlZjeWNsZXMiPmN5Y2xlczwvYT5dCisgICAgWzxhIGhyZWY9IiNOVmV4cGxhbmF0aW9ucyI+ZXhwbGFuYXRpb25zPC9hPl0KKyAgICA8L3RkPjwvdHI+PC90YWJsZT4KKyAgICAKKyAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGNsYXNzPSJkZXRhaWxzIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlBhY2thZ2U8L3RoPgorICAgICAgICAgICAgPHRoPlRvdGFsIENsYXNzZXM8L3RoPgorICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiNFWG51bWJlciI+QWJzdHJhY3QgQ2xhc3NlczwvYT48L3RoPgorICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiNFWG51bWJlciI+Q29uY3JldGUgQ2xhc3NlczwvYT48L3RoPgorICAgICAgICAgICAgPHRoPjxhIGhyZWY9IiNFWGFmZmVyZW50Ij5BZmZlcmVudCBDb3VwbGluZ3M8L2E+PC90aD4KKyAgICAgICAgICAgIDx0aD48YSBocmVmPSIjRVhlZmZlcmVudCI+RWZmZXJlbnQgQ291cGxpbmdzPC9hPjwvdGg+CisgICAgICAgICAgICA8dGg+PGEgaHJlZj0iI0VYYWJzdHJhY3RuZXNzIj5BYnN0cmFjdG5lc3M8L2E+PC90aD4KKyAgICAgICAgICAgIDx0aD48YSBocmVmPSIjRVhpbnN0YWJpbGl0eSI+SW5zdGFiaWxpdHk8L2E+PC90aD4KKyAgICAgICAgICAgIDx0aD48YSBocmVmPSIjRVhkaXN0YW5jZSI+RGlzdGFuY2U8L2E+PC90aD4KKyAgICAgICAgICAgIAorICAgICAgICA8L3RyPgorICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL1BhY2thZ2VzL1BhY2thZ2UiPgorICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGVycm9yKSA9IDAiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4jUEs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL1RvdGFsQ2xhc3NlcyIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0Fic3RyYWN0Q2xhc3NlcyIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0NvbmNyZXRlQ2xhc3NlcyIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0NhIi8+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQ2UiLz48L3RkPgorICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9BIi8+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvSSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0QiLz48L3RkPgorICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi9QYWNrYWdlcy9QYWNrYWdlIj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChlcnJvcikgJmd0OyAwIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iOCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImVycm9yIi8+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwveHNsOmlmPgorICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvdGFibGU+CisgICAgCisgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj48dHI+PHRkPgorICAgIDxhIG5hbWU9Ik5WcGFja2FnZXMiPjxoMj5QYWNrYWdlczwvaDI+PC9hPgorICAgIDwvdGQ+PHRkIGFsaWduPSJyaWdodCI+CisgICAgWzxhIGhyZWY9IiNOVnN1bW1hcnkiPnN1bW1hcnk8L2E+XQorICAgIFs8YSBocmVmPSIjTlZwYWNrYWdlcyI+cGFja2FnZXM8L2E+XQorICAgIFs8YSBocmVmPSIjTlZjeWNsZXMiPmN5Y2xlczwvYT5dCisgICAgWzxhIGhyZWY9IiNOVmV4cGxhbmF0aW9ucyI+ZXhwbGFuYXRpb25zPC9hPl0KKyAgICA8L3RkPjwvdHI+PC90YWJsZT4KKyAgICAKKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi9QYWNrYWdlcy9QYWNrYWdlIj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChlcnJvcikgPSAwIj4KKyAgICAgICAgICAgIDxoMz48YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj5QSzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L2gzPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0cj4KKyAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iI0VYYWZmZXJlbnQiPkFmZmVyZW50IENvdXBsaW5nczwvYT46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9DYSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiNFWGVmZmVyZW50Ij5FZmZlcmVudCBDb3VwbGluZ3M8L2E+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvQ2UiLz48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjRVhhYnN0cmFjdG5lc3MiPkFic3RyYWN0bmVzczwvYT46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0cy9BIi8+PC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iI0VYaW5zdGFiaWxpdHkiPkluc3RhYmlsaXR5PC9hPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXRzL0kiLz48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIjRVhkaXN0YW5jZSI+RGlzdGFuY2U8L2E+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHMvRCIvPjwvdGQ+CisgICAgICAgICAgICA8L3RyPjwvdGFibGU+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2xhc3M9ImRldGFpbHMiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRoPkFic3RyYWN0IENsYXNzZXM8L3RoPgorICAgICAgICAgICAgICAgICAgICA8dGg+Q29uY3JldGUgQ2xhc3NlczwvdGg+CisgICAgICAgICAgICAgICAgICAgIDx0aD5Vc2VkIGJ5IFBhY2thZ2VzPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPHRoPlVzZXMgUGFja2FnZXM8L3RoPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNSUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KEFic3RyYWN0Q2xhc3Nlcy9DbGFzcyk9MCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+Tm9uZTwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkFic3RyYWN0Q2xhc3Nlcy9DbGFzcyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPjxici8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjUlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoQ29uY3JldGVDbGFzc2VzL0NsYXNzKT0wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aT5Ob25lPC9pPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iQ29uY3JldGVDbGFzc2VzL0NsYXNzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpIi8+PGJyLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNSUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChVc2VkQnkvUGFja2FnZSk9MCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+Tm9uZTwvaT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IlVzZWRCeS9QYWNrYWdlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+I1BLPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT48YnIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI1JSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KERlcGVuZHNVcG9uL1BhY2thZ2UpPTAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpPk5vbmU8L2k+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJEZXBlbmRzVXBvbi9QYWNrYWdlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+I1BLPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT48YnIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwveHNsOmlmPgorICAgIDwveHNsOmZvci1lYWNoPgorICAgIAorICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4KKyAgICA8YSBuYW1lPSJOVmN5Y2xlcyI+PGgyPkN5Y2xlczwvaDI+PC9hPgorICAgIDwvdGQ+PHRkIGFsaWduPSJyaWdodCI+CisgICAgWzxhIGhyZWY9IiNOVnN1bW1hcnkiPnN1bW1hcnk8L2E+XQorICAgIFs8YSBocmVmPSIjTlZwYWNrYWdlcyI+cGFja2FnZXM8L2E+XQorICAgIFs8YSBocmVmPSIjTlZjeWNsZXMiPmN5Y2xlczwvYT5dCisgICAgWzxhIGhyZWY9IiNOVmV4cGxhbmF0aW9ucyI+ZXhwbGFuYXRpb25zPC9hPl0KKyAgICA8L3RkPjwvdHI+PC90YWJsZT4KKyAgICAKKyAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KEN5Y2xlcy9QYWNrYWdlKSA9IDAiPgorICAgICAgICA8cD5UaGVyZSBhcmUgbm8gY3ljbGljIGRlcGVuZGFuY2llcy48L3A+CisgICAgPC94c2w6aWY+CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkN5Y2xlcy9QYWNrYWdlIj4KKyAgICAgICAgPGgzPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJATmFtZSIvPjwvaDM+PHA+CisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJQYWNrYWdlIj4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PGJyLz4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+PC9wPgorICAgIDwveHNsOmZvci1lYWNoPgorICAgIAorICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4KKyAgICA8YSBuYW1lPSJOVmV4cGxhbmF0aW9ucyI+PGgyPkV4cGxhbmF0aW9uczwvaDI+PC9hPgorICAgIDwvdGQ+PHRkIGFsaWduPSJyaWdodCI+CisgICAgWzxhIGhyZWY9IiNOVnN1bW1hcnkiPnN1bW1hcnk8L2E+XQorICAgIFs8YSBocmVmPSIjTlZwYWNrYWdlcyI+cGFja2FnZXM8L2E+XQorICAgIFs8YSBocmVmPSIjTlZjeWNsZXMiPmN5Y2xlczwvYT5dCisgICAgWzxhIGhyZWY9IiNOVmV4cGxhbmF0aW9ucyI+ZXhwbGFuYXRpb25zPC9hPl0KKyAgICA8L3RkPjwvdHI+PC90YWJsZT4KKyAgICAKKyAgICA8cD5UaGUgZm9sbG93aW5nIGV4cGxhbmF0aW9ucyBhcmUgZm9yIHF1aWNrIHJlZmVyZW5jZSBhbmQgYXJlIGxpZnRlZCBkaXJlY3RseSBmcm9tIHRoZSBvcmlnaW5hbCA8YSBocmVmPSJodHRwOi8vd3d3LmNsYXJrd2FyZS5jb20vc29mdHdhcmUvSkRlcGVuZC5odG1sIj5KRGVwZW5kIGRvY3VtZW50YXRpb248L2E+LjwvcD4KKyAgICAKKyAgICA8aDM+PGEgbmFtZT0iRVhudW1iZXIiPk51bWJlciBvZiBDbGFzc2VzPC9hPjwvaDM+CisgICAgICAgIDxwPlRoZSBudW1iZXIgb2YgY29uY3JldGUgYW5kIGFic3RyYWN0IGNsYXNzZXMgKGFuZCBpbnRlcmZhY2VzKSBpbiB0aGUgcGFja2FnZSBpcyBhbiBpbmRpY2F0b3Igb2YgdGhlIGV4dGVuc2liaWxpdHkgb2YgdGhlIHBhY2thZ2UuPC9wPgorICAgIDxoMz48YSBuYW1lPSJFWGFmZmVyZW50Ij5BZmZlcmVudCBDb3VwbGluZ3M8L2E+PC9oMz4KKyAgICAgICAgPHA+VGhlIG51bWJlciBvZiBvdGhlciBwYWNrYWdlcyB0aGF0IGRlcGVuZCB1cG9uIGNsYXNzZXMgd2l0aGluIHRoZSBwYWNrYWdlIGlzIGFuIGluZGljYXRvciBvZiB0aGUgcGFja2FnZSdzIHJlc3BvbnNpYmlsaXR5LiA8L3A+CisgICAgPGgzPjxhIG5hbWU9IkVYZWZmZXJlbnQiPkVmZmVyZW50IENvdXBsaW5nczwvYT48L2gzPgorICAgICAgICA8cD5UaGUgbnVtYmVyIG9mIG90aGVyIHBhY2thZ2VzIHRoYXQgdGhlIGNsYXNzZXMgaW4gdGhlIHBhY2thZ2UgZGVwZW5kIHVwb24gaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBwYWNrYWdlJ3MgaW5kZXBlbmRlbmNlLiA8L3A+CisgICAgPGgzPjxhIG5hbWU9IkVYYWJzdHJhY3RuZXNzIj5BYnN0cmFjdG5lc3M8L2E+PC9oMz4gCisgICAgICAgIDxwPlRoZSByYXRpbyBvZiB0aGUgbnVtYmVyIG9mIGFic3RyYWN0IGNsYXNzZXMgKGFuZCBpbnRlcmZhY2VzKSBpbiB0aGUgYW5hbHl6ZWQgcGFja2FnZSB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGNsYXNzZXMgaW4gdGhlIGFuYWx5emVkIHBhY2thZ2UuIDwvcD4KKyAgICAgICAgPHA+VGhlIHJhbmdlIGZvciB0aGlzIG1ldHJpYyBpcyAwIHRvIDEsIHdpdGggQT0wIGluZGljYXRpbmcgYSBjb21wbGV0ZWx5IGNvbmNyZXRlIHBhY2thZ2UgYW5kIEE9MSBpbmRpY2F0aW5nIGEgY29tcGxldGVseSBhYnN0cmFjdCBwYWNrYWdlLiA8L3A+CisgICAgPGgzPjxhIG5hbWU9IkVYaW5zdGFiaWxpdHkiPkluc3RhYmlsaXR5PC9hPjwvaDM+CisgICAgICAgIDxwPlRoZSByYXRpbyBvZiBlZmZlcmVudCBjb3VwbGluZyAoQ2UpIHRvIHRvdGFsIGNvdXBsaW5nIChDZSAvIChDZSArIENhKSkuIFRoaXMgbWV0cmljIGlzIGFuIGluZGljYXRvciBvZiB0aGUgcGFja2FnZSdzIHJlc2lsaWVuY2UgdG8gY2hhbmdlLiA8L3A+CisgICAgICAgIDxwPlRoZSByYW5nZSBmb3IgdGhpcyBtZXRyaWMgaXMgMCB0byAxLCB3aXRoIEk9MCBpbmRpY2F0aW5nIGEgY29tcGxldGVseSBzdGFibGUgcGFja2FnZSBhbmQgST0xIGluZGljYXRpbmcgYSBjb21wbGV0ZWx5IGluc3RhYmxlIHBhY2thZ2UuIDwvcD4KKyAgICA8aDM+PGEgbmFtZT0iRVhkaXN0YW5jZSI+RGlzdGFuY2U8L2E+PC9oMz4KKyAgICAgICAgPHA+VGhlIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2Ugb2YgYSBwYWNrYWdlIGZyb20gdGhlIGlkZWFsaXplZCBsaW5lIEEgKyBJID0gMS4gVGhpcyBtZXRyaWMgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBwYWNrYWdlJ3MgYmFsYW5jZSBiZXR3ZWVuIGFic3RyYWN0bmVzcyBhbmQgc3RhYmlsaXR5LiA8L3A+CisgICAgICAgIDxwPkEgcGFja2FnZSBzcXVhcmVseSBvbiB0aGUgbWFpbiBzZXF1ZW5jZSBpcyBvcHRpbWFsbHkgYmFsYW5jZWQgd2l0aCByZXNwZWN0IHRvIGl0cyBhYnN0cmFjdG5lc3MgYW5kIHN0YWJpbGl0eS4gSWRlYWwgcGFja2FnZXMgYXJlIGVpdGhlciBjb21wbGV0ZWx5IGFic3RyYWN0IGFuZCBzdGFibGUgKHg9MCwgeT0xKSBvciBjb21wbGV0ZWx5IGNvbmNyZXRlIGFuZCBpbnN0YWJsZSAoeD0xLCB5PTApLiA8L3A+CisgICAgICAgIDxwPlRoZSByYW5nZSBmb3IgdGhpcyBtZXRyaWMgaXMgMCB0byAxLCB3aXRoIEQ9MCBpbmRpY2F0aW5nIGEgcGFja2FnZSB0aGF0IGlzIGNvaW5jaWRlbnQgd2l0aCB0aGUgbWFpbiBzZXF1ZW5jZSBhbmQgRD0xIGluZGljYXRpbmcgYSBwYWNrYWdlIHRoYXQgaXMgYXMgZmFyIGZyb20gdGhlIG1haW4gc2VxdWVuY2UgYXMgcG9zc2libGUuIDwvcD4KKyAgICAKKyAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL2p1bml0LWZyYW1lcy14YWxhbjEueHNsIGIvdHJ1bmsvc3JjL2V0Yy9qdW5pdC1mcmFtZXMteGFsYW4xLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VmNGNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9qdW5pdC1mcmFtZXMteGFsYW4xLnhzbApAQCAtMCwwICsxLDcxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCIKKyAgICB4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCisgICAgeG1sbnM6cmVkaXJlY3Q9Im9yZy5hcGFjaGUueGFsYW4ubGliLlJlZGlyZWN0IgorICAgIHhtbG5zOnN0cmluZ3V0aWxzPSJ4YWxhbjovL29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHMiCisgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KKzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPgorPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIi8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8IS0tCisKKyBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggQW50IEpVbml0UmVwb3J0IG91dHB1dC4KKworIEl0IGNyZWF0ZXMgYSBzZXQgb2YgSFRNTCBmaWxlcyBhIGxhIGphdmFkb2Mgd2hlcmUgeW91IGNhbiBicm93c2UgZWFzaWx5CisgdGhyb3VnaCBhbGwgcGFja2FnZXMgYW5kIGNsYXNzZXMuCisKKy0tPgorPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgorCisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiPgorICAgIDwhLS0gY3JlYXRlIHRoZSBpbmRleC5odG1sIC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2luZGV4Lmh0bWwiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgc3R5bGVzaGVldC5jc3MgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctZnJhbWUuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnBhY2thZ2VzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtY2xhc3Nlcy5odG1sIGF0IHRoZSByb290IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLmNsYXNzZXMiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi90ZXN0c3VpdGVbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6dGVzdHN1aXRlL0BwYWNrYWdlKV0iPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwveHNsOmZvci1lYWNoPgorPC94c2w6dGVtcGxhdGU+CisKKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJG5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJG5hbWUsJy4nLCcvJykiLz48L3hzbDppZj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSIkbmFtZSA9ICcnIj4uPC94c2w6aWY+CisgICAgPC94c2w6dmFyaWFibGU+CisgICAgPCEtLVByb2Nlc3NpbmcgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gaW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXQuZGlyIi8+IC0tPgorICAgIDwhLS0gY3JlYXRlIGEgY2xhc3Nlcy1saXN0Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2UtZnJhbWUuaHRtbCI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzLmxpc3QiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgYSBwYWNrYWdlLXN1bW1hcnkuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gZm9yIGVhY2ggY2xhc3MsIGNyZWF0ZXMgYSBAbmFtZS5odG1sIC0tPgorICAgIDwhLS0gQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSB3aXRoIGlubmVyIGNsYXNzZXMgaGF2aW5nIHRoZSBzYW1lIG5hbWUsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gLS0+CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVtAcGFja2FnZSA9ICRuYW1lXSI+CisgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAbmFtZX0uaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiLz4KKyAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLW91dCkhPTAiPgorICAgICAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BuYW1lfS1vdXQudHh0Ij4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi9zeXN0ZW0tb3V0IiAvPgorICAgICAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1lcnIpIT0wIj4KKyAgICAgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAbmFtZX0tZXJyLnR4dCI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4vc3lzdGVtLWVyciIgLz4KKyAgICAgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisgICAgICAgIDwveHNsOmlmPgorICAgIDwveHNsOmZvci1lYWNoPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCI+Cis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlVuaXQgVGVzdCBSZXN1bHRzLjwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxmcmFtZXNldCBjb2xzPSIyMCUsODAlIj4KKyAgICAgICAgPGZyYW1lc2V0IHJvd3M9IjMwJSw3MCUiPgorICAgICAgICAgICAgPGZyYW1lIHNyYz0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUxpc3RGcmFtZSIvPgorICAgICAgICAgICAgPGZyYW1lIHNyYz0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiBuYW1lPSJjbGFzc0xpc3RGcmFtZSIvPgorICAgICAgICA8L2ZyYW1lc2V0PgorICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIG5hbWU9ImNsYXNzRnJhbWUiLz4KKyAgICAgICAgPG5vZnJhbWVzPgorICAgICAgICAgICAgPGgyPkZyYW1lIEFsZXJ0PC9oMj4KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgorICAgICAgICAgICAgPC9wPgorICAgICAgICA8L25vZnJhbWVzPgorICAgIDwvZnJhbWVzZXQ+Cis8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+Citib2R5IHsKKyAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7CisgICAgY29sb3I6IzAwMDAwMDsKK30KK3RhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7CisgICAgZm9udC1zaXplOiA2OCU7Cit9Cit0YWJsZS5kZXRhaWxzIHRyIHRoeworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICBiYWNrZ3JvdW5kOiNhNmNhZjA7Cit9Cit0YWJsZS5kZXRhaWxzIHRyIHRkeworICAgIGJhY2tncm91bmQ6I2VlZWVlMDsKK30KKworcCB7CisgICAgbGluZS1oZWlnaHQ6MS41ZW07CisgICAgbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKK30KK2gxIHsKKyAgICBtYXJnaW46IDBweCAwcHggNXB4OyBmb250OiAxNjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoMiB7CisgICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoMyB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorfQoraDQgeworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKK30KK2g1IHsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoNiB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorfQorLkVycm9yIHsKKyAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpyZWQ7Cit9CisuRmFpbHVyZSB7CisgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOworfQorLlByb3BlcnRpZXMgeworICB0ZXh0LWFsaWduOnJpZ2h0OworfQorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgVGhpcyBwYWdlIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IHRlc3RzdWl0ZSBjbGFzcy4KKyAgICBJdCBwcmludHMgYSBzdW1tYXJ5IG9mIHRoZSB0ZXN0c3VpdGUgYW5kIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0CisgICAgdGVzdGNhc2UgbWV0aG9kcy4KKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iY2xhc3MuZGV0YWlscyI+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNsYXNzLm5hbWUiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+LjwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IFJlc3VsdHM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisgICAgICAgIHZhciBUZXN0Q2FzZXMgPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgdmFyIGN1cjsKKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9wZXJ0aWVzIi8+CisgICAgICAgPC9zY3JpcHQ+CisgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IVtDREFUQVsKKyAgICAgICAgZnVuY3Rpb24gZGlzcGxheVByb3BlcnRpZXMgKG5hbWUpIHsKKyAgICAgICAgICB2YXIgd2luID0gd2luZG93Lm9wZW4oJycsJ0pVbml0U3lzdGVtUHJvcGVydGllcycsJ3Njcm9sbGJhcnM9MSxyZXNpemFibGU9MScpOworICAgICAgICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7CisgICAgICAgICAgZG9jLm9wZW4oKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxodG1sPjxoZWFkPjx0aXRsZT5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvdGl0bGU+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7IGNvbG9yOiMwMDAwMDA7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7IGZvbnQtc2l6ZTogNjglOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyBib3JkZXItbGVmdDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci10b3A6c29saWQgMSAjY2NjY2NjOyBwYWRkaW5nOjVweDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0ZCB7IGZvbnQ6bm9ybWFsOyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmZmOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJoMyB7IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvaGVhZD48Ym9keT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxoMz5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvaDM+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0YWJsZSBjbGFzcz0ncHJvcGVydGllcyc+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iKTsKKyAgICAgICAgICBmb3IgKHByb3AgaW4gVGVzdENhc2VzW25hbWVdKSB7CisgICAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+IiArIHByb3AgKyAiPC90aD48dGQ+IiArIFRlc3RDYXNlc1tuYW1lXVtwcm9wXSArICI8L3RkPjwvdHI+Iik7CisgICAgICAgICAgfQorICAgICAgICAgIGRvYy53cml0ZSgiPC90YWJsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7CisgICAgICAgICAgZG9jLmNsb3NlKCk7CisgICAgICAgICAgd2luLmZvY3VzKCk7CisgICAgICAgIH0KKyAgICAgIF1dPgorICAgICAgPC9zY3JpcHQ+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgPGgzPkNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjwvaDM+CisKKworICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQudGVzdCIvPgorICAgICAgICAgICAgPC90YWJsZT4KKworICAgICAgICAgICAgPGgyPlRlc3RzPC9oMj4KKyAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICB0ZXN0IGNhbiBldmVuIG5vdCBiZSBzdGFydGVkIGF0IGFsbCAoZmFpbHVyZSB0byBsb2FkIHRoZSBjbGFzcykKKyAgICAgICAgICAgICAgc28gcmVwb3J0IHRoZSBlcnJvciBkaXJlY3RseQorICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii4vZXJyb3IiPgorICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkVycm9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vZXJyb3IiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCIvPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5qYXZhc2NyaXB0OmRpc3BsYXlQcm9wZXJ0aWVzKCc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Jyk7PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzICYjMTg3OworICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLW91dCkhPTAiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LW91dC50eHQ8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0ICYjMTg3OworICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1lcnIpIT0wIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi1lcnIudHh0PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyciAmIzE4NzsKKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tCisgICBXcml0ZSBwcm9wZXJ0aWVzIGludG8gYSBKYXZhU2NyaXB0IGRhdGEgc3RydWN0dXJlLgorICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaWRlYSBieSBFcmlrIEhhdGNoZXIgKGVoYXRjaGVyQGFwYWNoZS5vcmcpCisgICAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvcGVydGllcyI+CisgICAgY3VyID0gVGVzdENhc2VzWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+J10gPSBuZXcgQXJyYXkoKTsKKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgorICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgIGN1clsnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+J10gPSAnPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJAdmFsdWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPic7CisgICAgPC94c2w6Zm9yLWVhY2g+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGZvciBldmVyeSBwYWNrYWdlLgorICAgIEl0IHByaW50cyB0aGUgbmFtZSBvZiBhbGwgY2xhc3NlcyB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBwYWNrYWdlLgorICAgIEBwYXJhbSBuYW1lIHRoZSBwYWNrYWdlIG5hbWUgdG8gcHJpbnQgY2xhc3Nlcy4KKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gbGlzdCBvZiBjbGFzc2VzIGluIGEgcGFja2FnZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iY2xhc3Nlcy5saXN0Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IENsYXNzZXM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2E+PC9oMj4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC90YWJsZT4KKworICAgICAgICAgICAgPGgyPkNsYXNzZXM8L2gyPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAbmFtZX0uaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0KKyAgICBDcmVhdGVzIGFuIGFsbC1jbGFzc2VzLmh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwKKyAgICBvbiBlYWNoIGNsYXNzLgorLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwuY2xhc3NlcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPkFsbCBVbml0IFRlc3QgQ2xhc3NlczwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLmNsYXNzZXMiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+CisgICAgPHRyPgorICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0nJykiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIENyZWF0ZXMgYW4gaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlLXN1bW1hcnkuaHRtbCBmaWxlcyBvbgorICAgIGVhY2ggcGFja2FnZSBleGlzdGluZyBvbiB0ZXN0c3VpdGVzLgorICAgIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KAorLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwucGFja2FnZXMiPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgIDx0aXRsZT5BbGwgVW5pdCBUZXN0IFBhY2thZ2VzPC90aXRsZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L2hlYWQ+CisgICAgICAgIDxib2R5PgorICAgICAgICAgICAgPGgyPjxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Ib21lPC9hPjwvaDI+CisgICAgICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICA8YSBocmVmPSIuL3t0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHBhY2thZ2UgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+CisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIj4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IFJlc3VsdHM6IFN1bW1hcnk8L3RpdGxlPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbignYWxsY2xhc3Nlcy1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKyAgICAgICAgPGgyPlN1bW1hcnk8L2gyPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0B0ZXN0cykiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQGVycm9ycykiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZmFpbHVyZXMpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRpbWUpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2Vzc1JhdGUiIHNlbGVjdD0iKCR0ZXN0Q291bnQgLSAkZmFpbHVyZUNvdW50IC0gJGVycm9yQ291bnQpIGRpdiAkdGVzdENvdW50Ii8+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHRoPlRlc3RzPC90aD4KKyAgICAgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+CisgICAgICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgICAgIDx0aD5TdWNjZXNzIHJhdGU8L3RoPgorICAgICAgICAgICAgPHRoPlRpbWU8L3RoPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvdGQ+CisgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRpbWVDb3VudCIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgPHRyPgorICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KKyAgICAgICAgTm90ZTogPGVtPmZhaWx1cmVzPC9lbT4gYXJlIGFudGljaXBhdGVkIGFuZCBjaGVja2VkIGZvciB3aXRoIGFzc2VydGlvbnMgd2hpbGUgPGVtPmVycm9yczwvZW0+IGFyZSB1bmFudGljaXBhdGVkLgorICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorCisgICAgICAgIDxoMj5QYWNrYWdlczwvaDI+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+CisgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiIG9yZGVyPSJhc2NlbmRpbmciLz4KKyAgICAgICAgICAgICAgICA8IS0tIGdldCB0aGUgbm9kZSBzZXQgY29udGFpbmluZyBhbGwgdGVzdHN1aXRlcyB0aGF0IGhhdmUgdGhlIHNhbWUgcGFja2FnZSAtLT4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imluc2FtZXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIi8+CisgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5IGEgZmFpbHVyZSBpZiB0aGVyZSBpcyBhbnkgZmFpbHVyZS9lcnJvciBpbiB0aGUgcGFja2FnZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZXJyb3JzKSAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BmYWlsdXJlcykgJmd0OyAwIj5GYWlsdXJlPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5QYXNzPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIuL3t0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcGFja2FnZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0B0ZXN0cykiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZXJyb3JzKSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BmYWlsdXJlcykiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AdGltZSkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5zYW1lcGFja2FnZS9AdGltZXN0YW1wIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5zYW1lcGFja2FnZS9AaG9zdG5hbWUiLz48L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+PC9oMz4KKworICAgICAgICAgICAgPCEtLXRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3MubWV0cmljcy5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KKyAgICAgICAgICAgIDwvdGFibGUtLT4KKworICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnNhbWVwYWNrYWdlIiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gJG5hbWVdIi8+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRpbnNhbWVwYWNrYWdlKSAmZ3Q7IDAiPgorICAgICAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRpbnNhbWVwYWNrYWdlIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIHRyYW5zZm9ybSBzdHJpbmcgbGlrZSBhLmIuYyB0byAuLi8uLi8uLi8KKyAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgKKy0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KKyAgICA8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRwYXRoLCcuJykiPgorICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsJy4nKSIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC94c2w6aWY+CisgICAgPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoJHBhdGgsJy4nKSkgYW5kIG5vdCgkcGF0aCA9ICcnKSI+CisgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICAgIDwveHNsOmlmPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBjcmVhdGUgdGhlIGxpbmsgdG8gdGhlIHN0eWxlc2hlZXQgYmFzZWQgb24gdGhlIHBhY2thZ2UgbmFtZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iU3R5bGUiPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJykiPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT48L3hzbDppZj5zdHlsZXNoZWV0LmNzczwveHNsOmF0dHJpYnV0ZT48L2xpbms+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tIFBhZ2UgSEVBREVSIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4KKyAgICA8aDE+VW5pdCBUZXN0IFJlc3VsdHM8L2gxPgorICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZy8iPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3RkPgorICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8aHIgc2l6ZT0iMSIvPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gY2xhc3MgaGVhZGVyIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgIDx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KKyAgICAgICAgPHRoPlRlc3RzPC90aD4KKyAgICAgICAgPHRoPkVycm9yczwvdGg+CisgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+CisgICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+CisgICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZSBTdGFtcDwvdGg+CisgICAgICAgIDx0aD5Ib3N0PC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gbWV0aG9kIGhlYWRlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgIDx0aD5OYW1lPC90aD4KKyAgICAgICAgPHRoPlN0YXR1czwvdGg+CisgICAgICAgIDx0aCB3aWR0aD0iODAlIj5UeXBlPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBjbGFzcyBpbmZvcm1hdGlvbiAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBlcnJvcnNbLiZndDsgMF0iPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGZhaWx1cmVzWy4mZ3Q7IDBdIj5GYWlsdXJlPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5QYXNzPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDx0ZD48YSBocmVmPSJ7QG5hbWV9Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgorICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdGVzdHMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZXJyb3JzIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGZhaWx1cmVzIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRpbWVzdGFtcCIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBob3N0bmFtZSIvPjwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImVycm9yIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlRhYmxlUm93Q29sb3I8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+CisgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPgorICAgICAgICAgICAgICAgIDx0ZD5GYWlsdXJlPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlIi8+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPgorICAgICAgICAgICAgICAgIDx0ZD5FcnJvcjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZXJyb3IiLz48L3RkPgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgIDx0ZD5TdWNjZXNzPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gTm90ZSA6IHRoZSBiZWxvdyB0ZW1wbGF0ZSBlcnJvciBhbmQgZmFpbHVyZSBhcmUgdGhlIHNhbWUgc3R5bGUKKyAgICAgICAgICAgIHNvIGp1c3QgY2FsbCB0aGUgc2FtZSBzdHlsZSBzdG9yZSBpbiB0aGUgdG9vbGtpdCB0ZW1wbGF0ZSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZhaWx1cmUiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3IiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBTdHlsZSBmb3IgdGhlIGVycm9yIGFuZCBmYWlsdXJlIGluIHRoZSB0ZXN0Y2FzZSB0ZW1wbGF0ZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyI+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQG1lc3NhZ2UpIj5OL0E8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPgorICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorICAgIDwhLS0gZGlzcGxheSB0aGUgc3RhY2t0cmFjZSAtLT4KKyAgICA8YnIvPjxici8+CisgICAgPGNvZGU+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9Ii4iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L2NvZGU+CisgICAgPCEtLSB0aGUgbGF0dGVyIGlzIGJldHRlciBidXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgZm9yIG5vbi0yMSIgbW9uaXRvcnMuLi4gLS0+CisgICAgPCEtLXByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvcHJlLS0+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAxIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCRzdHJpbmcpLCdcJywnXFwnKSIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idG1wMiIgc2VsZWN0PSJzdHJpbmd1dGlsczpyZXBsYWNlKHN0cmluZygkdG1wMSksJnF1b3Q7JyZxdW90OywmcXVvdDtcJmFwb3M7JnF1b3Q7KSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG1wMiIvPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIHRlbXBsYXRlIHRoYXQgd2lsbCBjb252ZXJ0IGEgY2FycmlhZ2UgcmV0dXJuIGludG8gYSBiciB0YWcKKyAgICBAcGFyYW0gd29yZCB0aGUgdGV4dCBmcm9tIHdoaWNoIHRvIGNvbnZlcnQgQ1IgdG8gQlIgdGFnCistLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJiciI+PGJyLz48L3hzbDpwYXJhbT4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nc3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHdvcmQpLCImI3hBOyIsJGJyKScvPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwMCcpIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAlJykiLz4KKzwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvanVuaXQtZnJhbWVzLnhzbCBiL3RydW5rL3NyYy9ldGMvanVuaXQtZnJhbWVzLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWEzMjJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9qdW5pdC1mcmFtZXMueHNsCkBAIC0wLDAgKzEsODc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKyAgICB4bWxuczpyZWRpcmVjdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL3JlZGlyZWN0IgorICAgIHhtbG5zOnN0cmluZ3V0aWxzPSJ4YWxhbjovL29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHMiCisgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KKzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPgorPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIi8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8IS0tCisKKyBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggQW50IEpVbml0UmVwb3J0IG91dHB1dC4KKworIEl0IGNyZWF0ZXMgYSBzZXQgb2YgSFRNTCBmaWxlcyBhIGxhIGphdmFkb2Mgd2hlcmUgeW91IGNhbiBicm93c2UgZWFzaWx5CisgdGhyb3VnaCBhbGwgcGFja2FnZXMgYW5kIGNsYXNzZXMuCisKKy0tPgorPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgorPHhzbDpwYXJhbSBuYW1lPSJUSVRMRSI+VW5pdCBUZXN0IFJlc3VsdHMuPC94c2w6cGFyYW0+CisKKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyI+CisgICAgPCEtLSBjcmVhdGUgdGhlIGluZGV4Lmh0bWwgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vaW5kZXguaHRtbCI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBzdHlsZXNoZWV0LmNzcyAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9zdHlsZXNoZWV0LmNzcyI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgb3ZlcnZpZXctcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1mcmFtZS5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwucGFja2FnZXMiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsY2xhc3Nlcy1mcmFtZS5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXRlc3RzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsLXRlc3RzLmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC50ZXN0cyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsdGVzdHMtZmFpbHMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGx0ZXN0cy1mYWlscy5odG1sIj4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnRlc3RzIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InR5cGUiIHNlbGVjdD0iJ2ZhaWxzJyIvPgorICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgPCEtLSBjcmVhdGUgdGhlIGFsbHRlc3RzLWVycm9ycy5odG1sIGF0IHRoZSByb290IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbHRlc3RzLWVycm9ycy5odG1sIj4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnRlc3RzIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InR5cGUiIHNlbGVjdD0iJ2Vycm9ycyciLz4KKyAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgIDwhLS0gcHJvY2VzcyBhbGwgcGFja2FnZXMgLS0+CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2UiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3hzbDpmb3ItZWFjaD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLmRpciI+CisgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRuYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRuYW1lLCcuJywnLycpIi8+PC94c2w6aWY+CisgICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+LjwveHNsOmlmPgorICAgIDwveHNsOnZhcmlhYmxlPgorICAgIDwhLS1Qcm9jZXNzaW5nIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0LmRpciIvPiAtLT4KKyAgICA8IS0tIGNyZWF0ZSBhIGNsYXNzZXMtbGlzdC5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLWZyYW1lLmh0bWwiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3Nlcy5saXN0Ij4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIGEgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGZvciBlYWNoIGNsYXNzLCBjcmVhdGVzIGEgQG5hbWUuaHRtbCAtLT4KKyAgICA8IS0tIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCBpbm5lciBjbGFzc2VzIGhhdmluZyB0aGUgc2FtZSBuYW1lLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIC0tPgorICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlW0BwYWNrYWdlID0gJG5hbWVdIj4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QGlkfV97QG5hbWV9Lmh0bWwiPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tb3V0KSE9MCI+CisgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QGlkfV97QG5hbWV9LW91dC50eHQiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iLi9zeXN0ZW0tb3V0Ii8+CisgICAgICA8L3JlZGlyZWN0OndyaXRlPgorICAgIDwveHNsOmlmPgorICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1lcnIpIT0wIj4KKyAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0tZXJyLnR4dCI+CisgICAgICAgIDx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIuL3N5c3RlbS1lcnIiLz4KKyAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisgICAgPC94c2w6aWY+CisgICAgPHhzbDppZiB0ZXN0PSJAZmFpbHVyZXMgIT0gMCI+CisgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QGlkfV97QG5hbWV9LWZhaWxzLmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidmYWlscyciLz4KKyAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgICA8L3hzbDppZj4KKyAgICA8eHNsOmlmIHRlc3Q9IkBlcnJvcnMgIT0gMCI+CisgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QGlkfV97QG5hbWV9LWVycm9ycy5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInZXJyb3JzJyIvPgorICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICA8L3JlZGlyZWN0OndyaXRlPgorICAgIDwveHNsOmlmPgorICA8L3hzbDpmb3ItZWFjaD4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFRJVExFIi8+PC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgorICAgICAgICA8ZnJhbWVzZXQgcm93cz0iMzAlLDcwJSI+CisgICAgICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+CisgICAgICAgICAgICA8ZnJhbWUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+CisgICAgICAgIDwvZnJhbWVzZXQ+CisgICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgorICAgICAgICA8bm9mcmFtZXM+CisgICAgICAgICAgICA8aDI+RnJhbWUgQWxlcnQ8L2gyPgorICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCisgICAgICAgICAgICA8L3A+CisgICAgICAgIDwvbm9mcmFtZXM+CisgICAgPC9mcmFtZXNldD4KKzwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIHRoaXMgaXMgdGhlIHN0eWxlc2hlZXQgY3NzIHRvIHVzZSBmb3IgbmVhcmx5IGV2ZXJ5dGhpbmcgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIj4KK2JvZHkgeworICAgIGZvbnQ6bm9ybWFsIDY4JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsKKyAgICBjb2xvcjojMDAwMDAwOworfQordGFibGUgdHIgdGQsIHRhYmxlIHRyIHRoIHsKKyAgICBmb250LXNpemU6IDY4JTsKK30KK3RhYmxlLmRldGFpbHMgdHIgdGh7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjpsZWZ0OworICAgIGJhY2tncm91bmQ6I2E2Y2FmMDsKK30KK3RhYmxlLmRldGFpbHMgdHIgdGR7CisgICAgYmFja2dyb3VuZDojZWVlZWUwOworfQorCitwIHsKKyAgICBsaW5lLWhlaWdodDoxLjVlbTsKKyAgICBtYXJnaW4tdG9wOjAuNWVtOyBtYXJnaW4tYm90dG9tOjEuMGVtOworfQoraDEgeworICAgIG1hcmdpbjogMHB4IDBweCA1cHg7IGZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKK30KK2gyIHsKKyAgICBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEyNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKK30KK2gzIHsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMTUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoNCB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorfQoraDUgeworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKK30KK2g2IHsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CisuRXJyb3IgeworICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnJlZDsKK30KKy5GYWlsdXJlIHsKKyAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpwdXJwbGU7Cit9CisuUHJvcGVydGllcyB7CisgIHRleHQtYWxpZ246cmlnaHQ7Cit9Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBDcmVhdGUgbGlzdCBvZiBhbGwvZmFpbGVkL2Vycm9yZWQgdGVzdHMgLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwudGVzdHMiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInYWxsJyIvPgorICAgIDxodG1sPgorCTx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiPgorCSAgICA8eHNsOmNob29zZT4KKwkJPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2ZhaWxzJyI+CisJCSAgICA8eHNsOnRleHQ+QWxsIEZhaWx1cmVzPC94c2w6dGV4dD4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2Vycm9ycyciPgorCQkgICAgPHhzbDp0ZXh0PkFsbCBFcnJvcnM8L3hzbDp0ZXh0PgorCQk8L3hzbDp3aGVuPgorCQk8eHNsOm90aGVyd2lzZT4KKwkJICAgIDx4c2w6dGV4dD5BbGwgVGVzdHM8L3hzbDp0ZXh0PgorCQk8L3hzbDpvdGhlcndpc2U+CisJICAgIDwveHNsOmNob29zZT4KKwk8L3hzbDp2YXJpYWJsZT4KKwk8aGVhZD4KKwkgICAgPHRpdGxlPlVuaXQgVGVzdCBSZXN1bHRzOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KKwkgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisJPC9oZWFkPgorCTxib2R5PgorCSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ2FsbGNsYXNzZXMtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgPGgyPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L2gyPgorCisgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKwkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIj4KKwkJICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93LmNsYXNzIiBzZWxlY3Q9Iid5ZXMnIi8+CisJCTwveHNsOmNhbGwtdGVtcGxhdGU+CisJCTwhLS0KKyAgICAgICAgICAgICAgICB0ZXN0IGNhbiBldmVuIG5vdCBiZSBzdGFydGVkIGF0IGFsbCAoZmFpbHVyZSB0byBsb2FkIHRoZSBjbGFzcykKKwkJc28gcmVwb3J0IHRoZSBlcnJvciBkaXJlY3RseQorCQktLT4KKyAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIuL2Vycm9yIj4KKyAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkVycm9yIj4KKyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL2Vycm9yIi8+CisgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnZmFpbHMnIj4KKyAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vdGVzdGNhc2VbZmFpbHVyZV0iIG1vZGU9InByaW50LnRlc3QiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvdy5jbGFzcyIgc2VsZWN0PSIneWVzJyIvPgorICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2Vycm9ycyciPgorICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLy90ZXN0Y2FzZVtlcnJvcl0iIG1vZGU9InByaW50LnRlc3QiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvdy5jbGFzcyIgc2VsZWN0PSIneWVzJyIvPgorICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL3Rlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJ3llcyciLz4KKyAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHBhZ2UgaXMgY3JlYXRlZCBmb3IgZXZlcnkgdGVzdHN1aXRlIGNsYXNzLgorICAgIEl0IHByaW50cyBhIHN1bW1hcnkgb2YgdGhlIHRlc3RzdWl0ZSBhbmQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQKKyAgICB0ZXN0Y2FzZSBtZXRob2RzLgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InR5cGUiIHNlbGVjdD0iJ2FsbCciLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2xhc3MubmFtZSI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICcnKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4uPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgIDx0aXRsZT5Vbml0IFRlc3QgUmVzdWx0czogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzcy5uYW1lIi8+PC90aXRsZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKyAgICAgICAgdmFyIFRlc3RDYXNlcyA9IG5ldyBBcnJheSgpOworICAgICAgICB2YXIgY3VyOworICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InByb3BlcnRpZXMiLz4KKyAgICAgICA8L3NjcmlwdD4KKyAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhW0NEQVRBWworICAgICAgICBmdW5jdGlvbiBkaXNwbGF5UHJvcGVydGllcyAobmFtZSkgeworICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3cub3BlbignJywnSlVuaXRTeXN0ZW1Qcm9wZXJ0aWVzJywnc2Nyb2xsYmFycz0xLHJlc2l6YWJsZT0xJyk7CisgICAgICAgICAgdmFyIGRvYyA9IHdpbi5kb2N1bWVudDsKKyAgICAgICAgICBkb2Mub3BlbigpOworICAgICAgICAgIGRvYy53cml0ZSgiPGh0bWw+PGhlYWQ+PHRpdGxlPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC90aXRsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoImJvZHkge2ZvbnQ6bm9ybWFsIDY4JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsgY29sb3I6IzAwMDAwMDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUgdHIgdGQsIHRhYmxlIHRyIHRoIHsgZm9udC1zaXplOiA2OCU7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlLnByb3BlcnRpZXMgeyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IGJvcmRlci1sZWZ0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLXRvcDpzb2xpZCAxICNjY2NjY2M7IHBhZGRpbmc6NXB4OyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRoIHsgdGV4dC1hbGlnbjpsZWZ0OyBib3JkZXItcmlnaHQ6c29saWQgMSAjY2NjY2NjOyBib3JkZXItYm90dG9tOnNvbGlkIDEgI2NjY2NjYzsgYmFja2dyb3VuZC1jb2xvcjojZWVlZWVlOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRkIHsgZm9udDpub3JtYWw7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2ZmZmZmZmY7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoImgzIHsgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYSB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8L3N0eWxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9oZWFkPjxib2R5PiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPGgzPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC9oMz4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxkaXYgYWxpZ249XCJyaWdodFwiPjxhIGhyZWY9XCJqYXZhc2NyaXB0OndpbmRvdy5jbG9zZSgpO1wiPkNsb3NlPC9hPjwvZGl2PiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPHRhYmxlIGNsYXNzPSdwcm9wZXJ0aWVzJz4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+TmFtZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIpOworICAgICAgICAgIGZvciAocHJvcCBpbiBUZXN0Q2FzZXNbbmFtZV0pIHsKKyAgICAgICAgICAgIGRvYy53cml0ZSgiPHRyPjx0aD4iICsgcHJvcCArICI8L3RoPjx0ZD4iICsgVGVzdENhc2VzW25hbWVdW3Byb3BdICsgIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZG9jLndyaXRlKCI8L3RhYmxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9ib2R5PjwvaHRtbD4iKTsKKyAgICAgICAgICBkb2MuY2xvc2UoKTsKKyAgICAgICAgICB3aW4uZm9jdXMoKTsKKyAgICAgICAgfQorICAgICAgXV0+CisgICAgICA8L3NjcmlwdD4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisgICAgICAgICAgICA8aDM+Q2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzcy5uYW1lIi8+PC9oMz4KKworCisgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcmludC50ZXN0Ii8+CisgICAgICAgICAgICA8L3RhYmxlPgorCisJICAgIDx4c2w6Y2hvb3NlPgorCQk8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnZmFpbHMnIj4KKwkJICAgIDxoMj5GYWlsdXJlczwvaDI+CisJCTwveHNsOndoZW4+CisJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdlcnJvcnMnIj4KKwkJICAgIDxoMj5FcnJvcnM8L2gyPgorCQk8L3hzbDp3aGVuPgorCQk8eHNsOm90aGVyd2lzZT4KKwkJICAgIDxoMj5UZXN0czwvaDI+CisJCTwveHNsOm90aGVyd2lzZT4KKwkgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciIvPgorCQk8IS0tCisgICAgICAgICAgICAgICAgdGVzdCBjYW4gZXZlbiBub3QgYmUgc3RhcnRlZCBhdCBhbGwgKGZhaWx1cmUgdG8gbG9hZCB0aGUgY2xhc3MpCisJCXNvIHJlcG9ydCB0aGUgZXJyb3IgZGlyZWN0bHkKKwkJLS0+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIuL2Vycm9yIj4KKyAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJFcnJvciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL2Vycm9yIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKwkJPHhzbDpjaG9vc2U+CisJCSAgICA8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnZmFpbHMnIj4KKwkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZVtmYWlsdXJlXSIgbW9kZT0icHJpbnQudGVzdCIvPgorCQkgICAgPC94c2w6d2hlbj4KKwkJICAgIDx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdlcnJvcnMnIj4KKwkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZVtlcnJvcl0iIG1vZGU9InByaW50LnRlc3QiLz4KKwkJICAgIDwveHNsOndoZW4+CisJCSAgICA8eHNsOm90aGVyd2lzZT4KKwkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCIvPgorCQkgICAgPC94c2w6b3RoZXJ3aXNlPgorCQk8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6ZGlzcGxheVByb3BlcnRpZXMoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4nKTs8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgJiMxODc7CisgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tb3V0KSE9MCI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi1vdXQudHh0PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dCAmIzE4NzsKKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tZXJyKSE9MCI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi1lcnIudHh0PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyciAmIzE4NzsKKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tCisgICBXcml0ZSBwcm9wZXJ0aWVzIGludG8gYSBKYXZhU2NyaXB0IGRhdGEgc3RydWN0dXJlLgorICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaWRlYSBieSBFcmlrIEhhdGNoZXIgKGVoYXRjaGVyQGFwYWNoZS5vcmcpCisgICAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvcGVydGllcyI+CisgICAgY3VyID0gVGVzdENhc2VzWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+J10gPSBuZXcgQXJyYXkoKTsKKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgorICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgIGN1clsnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+J10gPSAnPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJAdmFsdWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPic7CisgICAgPC94c2w6Zm9yLWVhY2g+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGZvciBldmVyeSBwYWNrYWdlLgorICAgIEl0IHByaW50cyB0aGUgbmFtZSBvZiBhbGwgY2xhc3NlcyB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBwYWNrYWdlLgorICAgIEBwYXJhbSBuYW1lIHRoZSBwYWNrYWdlIG5hbWUgdG8gcHJpbnQgY2xhc3Nlcy4KKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gbGlzdCBvZiBjbGFzc2VzIGluIGEgcGFja2FnZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iY2xhc3Nlcy5saXN0Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IENsYXNzZXM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2E+PC9oMj4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC90YWJsZT4KKworICAgICAgICAgICAgPGgyPkNsYXNzZXM8L2gyPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAaWR9X3tAbmFtZX0uaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0KKyAgICBDcmVhdGVzIGFuIGFsbC1jbGFzc2VzLmh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwKKyAgICBvbiBlYWNoIGNsYXNzLgorLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwuY2xhc3NlcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPkFsbCBVbml0IFRlc3QgQ2xhc3NlczwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLmNsYXNzZXMiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+CisgICAgPHRyPgorICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0nJykiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgQ3JlYXRlcyBhbiBodG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sIGZpbGVzIG9uCisgICAgZWFjaCBwYWNrYWdlIGV4aXN0aW5nIG9uIHRlc3RzdWl0ZXMuCisgICAgQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSBoZXJlLCBJIGRvbid0IGtub3cgeWV0IGhvdyB0byBoYW5kbGUgdW5uYW1lZCBwYWNrYWdlIDooCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9ImFsbC5wYWNrYWdlcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPkFsbCBVbml0IFRlc3QgUGFja2FnZXM8L3RpdGxlPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8aDI+PGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkhvbWU8L2E+PC9oMj4KKyAgICAgICAgICAgIDxoMj5QYWNrYWdlczwvaDI+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIiBtb2RlPSJhbGwucGFja2FnZXMiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJhbGwucGFja2FnZXMiPgorICAgIDx0cj4KKyAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgIDxhIGhyZWY9Ii4ve3RyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcGFja2FnZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgIDx0aXRsZT5Vbml0IFRlc3QgUmVzdWx0czogU3VtbWFyeTwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ib25sb2FkIj5vcGVuKCdhbGxjbGFzc2VzLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpPC94c2w6YXR0cmlidXRlPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICA8aDI+U3VtbWFyeTwvaDI+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdENvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRlc3RzKSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZXJyb3JzKSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZhaWx1cmVDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0BmYWlsdXJlcykiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aW1lQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGltZSkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWNjZXNzUmF0ZSIgc2VsZWN0PSIoJHRlc3RDb3VudCAtICRmYWlsdXJlQ291bnQgLSAkZXJyb3JDb3VudCkgZGl2ICR0ZXN0Q291bnQiLz4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICAgICAgPHRoPlN1Y2Nlc3MgcmF0ZTwvdGg+CisgICAgICAgICAgICA8dGg+VGltZTwvdGg+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXJyb3JDb3VudCAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRmYWlsdXJlQ291bnQgJmd0OyAwIj5GYWlsdXJlPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIHRlc3RzIiBocmVmPSJhbGwtdGVzdHMuaHRtbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0Q291bnQiLz48L2E+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48YSB0aXRsZT0iRGlzcGxheSBhbGwgZmFpbHVyZXMiIGhyZWY9ImFsbHRlc3RzLWZhaWxzLmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmFpbHVyZUNvdW50Ii8+PC9hPjwvdGQ+CisgICAgICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIGVycm9ycyIgaHJlZj0iYWxsdGVzdHMtZXJyb3JzLmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXJyb3JDb3VudCIvPjwvYT48L3RkPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHN1Y2Nlc3NSYXRlIi8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkdGltZUNvdW50Ii8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI5NSUiPgorICAgICAgICA8dHI+CisgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPgorICAgICAgICBOb3RlOiA8ZW0+ZmFpbHVyZXM8L2VtPiBhcmUgYW50aWNpcGF0ZWQgYW5kIGNoZWNrZWQgZm9yIHdpdGggYXNzZXJ0aW9ucyB3aGlsZSA8ZW0+ZXJyb3JzPC9lbT4gYXJlIHVuYW50aWNpcGF0ZWQuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisKKyAgICAgICAgPGgyPlBhY2thZ2VzPC9oMj4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KKyAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIgb3JkZXI9ImFzY2VuZGluZyIvPgorICAgICAgICAgICAgICAgIDwhLS0gZ2V0IHRoZSBub2RlIHNldCBjb250YWluaW5nIGFsbCB0ZXN0c3VpdGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBwYWNrYWdlIC0tPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5zYW1lcGFja2FnZSIgc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbLi9AcGFja2FnZSA9IGN1cnJlbnQoKS9AcGFja2FnZV0iLz4KKyAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXkgYSBmYWlsdXJlIGlmIHRoZXJlIGlzIGFueSBmYWlsdXJlL2Vycm9yIGluIHRoZSBwYWNrYWdlIC0tPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BlcnJvcnMpICZndDsgMCI+RXJyb3I8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGZhaWx1cmVzKSAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9Ii4ve3RyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwYWNrYWdlID0gJyciPiZsdDtub25lJmd0OzwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICA8L2E+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQHRlc3RzKSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BlcnJvcnMpIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGZhaWx1cmVzKSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0B0aW1lKSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnNhbWVwYWNrYWdlL0B0aW1lc3RhbXAiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnNhbWVwYWNrYWdlL0Bob3N0bmFtZSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbigncGFja2FnZS1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisgICAgICAgICAgICA8aDM+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L2gzPgorCisgICAgICAgICAgICA8IS0tdGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzcy5tZXRyaWNzLmhlYWRlciIvPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQubWV0cmljcyIvPgorICAgICAgICAgICAgPC90YWJsZS0tPgorCisgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imluc2FtZXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iLz4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoJGluc2FtZXBhY2thZ2UpICZndDsgMCI+CisgICAgICAgICAgICAgICAgPGgyPkNsYXNzZXM8L2gyPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGluc2FtZXBhY2thZ2UiIG1vZGU9InByaW50LnRlc3QiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgdHJhbnNmb3JtIHN0cmluZyBsaWtlIGEuYi5jIHRvIC4uLy4uLy4uLworICAgIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRyYW5zZm9ybSBpbnRvIGEgZGVzY2VuZGluZyBkaXJlY3RvcnkgcGF0aAorLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0icGF0aCIvPgorICAgIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoJHBhdGgsJy4nKSI+CisgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGF0aCI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcGF0aCwnLicpIi8+PC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3hzbDppZj4KKyAgICA8eHNsOmlmIHRlc3Q9Im5vdChjb250YWlucygkcGF0aCwnLicpKSBhbmQgbm90KCRwYXRoID0gJycpIj4KKyAgICAgICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+CisgICAgPC94c2w6aWY+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tIGNyZWF0ZSB0aGUgbGluayB0byB0aGUgc3R5bGVzaGVldCBiYXNlZCBvbiB0aGUgcGFja2FnZSBuYW1lIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKSI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvbGluaz4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gUGFnZSBIRUFERVIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgorICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFRJVExFIi8+PC9oMT4KKyAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgorICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cDovL3d3dy5qdW5pdC5vcmcvIj5KVW5pdDwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFudDwvYT4uPC90ZD4KKyAgICA8L3RyPgorICAgIDwvdGFibGU+CisgICAgPGhyIHNpemU9IjEiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIGNsYXNzIGhlYWRlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIj4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+CisgICAgICAgIDx0aD5UZXN0czwvdGg+CisgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICA8dGg+RmFpbHVyZXM8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUgU3RhbXA8L3RoPgorICAgICAgICA8dGg+SG9zdDwvdGg+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIG1ldGhvZCBoZWFkZXIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJyciLz4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorCTx4c2w6aWYgdGVzdD0iYm9vbGVhbigkc2hvdy5jbGFzcykiPgorCSAgICA8dGg+Q2xhc3M8L3RoPgorCTwveHNsOmlmPgorICAgICAgICA8dGg+TmFtZTwvdGg+CisgICAgICAgIDx0aD5TdGF0dXM8L3RoPgorICAgICAgICA8dGggd2lkdGg9IjgwJSI+VHlwZTwvdGg+CisgICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gY2xhc3MgaW5mb3JtYXRpb24gLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9InByaW50LnRlc3QiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZXJyb3JzWy4mZ3Q7IDBdIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmYWlsdXJlc1suJmd0OyAwXSI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIHRlc3RzIiBocmVmPSJ7QGlkfV97QG5hbWV9Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgorICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIHRlc3RzIiBocmVmPSJ7QGlkfV97QG5hbWV9Lmh0bWwiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRlc3RzIi8+PC9hPjwvdGQ+CisgICAgICAgIDx0ZD4KKwkgICAgPHhzbDpjaG9vc2U+CisJCTx4c2w6d2hlbiB0ZXN0PSJAZXJyb3JzICE9IDAiPgorCQkgICAgPGEgdGl0bGU9IkRpc3BsYXkgb25seSBlcnJvcnMiIGhyZWY9IntAaWR9X3tAbmFtZX0tZXJyb3JzLmh0bWwiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGVycm9ycyIvPjwvYT4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDpvdGhlcndpc2U+CisJCSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBlcnJvcnMiLz4KKwkJPC94c2w6b3RoZXJ3aXNlPgorCSAgICA8L3hzbDpjaG9vc2U+CisJPC90ZD4KKyAgICAgICAgPHRkPgorCSAgICA8eHNsOmNob29zZT4KKwkJPHhzbDp3aGVuIHRlc3Q9IkBmYWlsdXJlcyAhPSAwIj4KKwkJICAgIDxhIHRpdGxlPSJEaXNwbGF5IG9ubHkgZmFpbHVyZXMiIGhyZWY9IntAaWR9X3tAbmFtZX0tZmFpbHMuaHRtbCI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZmFpbHVyZXMiLz48L2E+CisJCTwveHNsOndoZW4+CisJCTx4c2w6b3RoZXJ3aXNlPgorCQkgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZmFpbHVyZXMiLz4KKwkJPC94c2w6b3RoZXJ3aXNlPgorCSAgICA8L3hzbDpjaG9vc2U+CisJPC90ZD4KKyAgICAgICAgPHRkPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRpbWVzdGFtcCIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBob3N0bmFtZSIvPjwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJzaG93LmNsYXNzIiBzZWxlY3Q9IicnIi8+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImVycm9yIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlRhYmxlUm93Q29sb3I8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKwk8eHNsOnZhcmlhYmxlIG5hbWU9ImNsYXNzLmhyZWYiPgorCSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KHRyYW5zbGF0ZSguLi9AcGFja2FnZSwnLicsJy8nKSwgJy8nLCAuLi9AaWQsICdfJywgLi4vQG5hbWUsICcuaHRtbCcpIi8+CisJPC94c2w6dmFyaWFibGU+CisJPHhzbDppZiB0ZXN0PSJib29sZWFuKCRzaG93LmNsYXNzKSI+CisJICAgIDx0ZD48YSBocmVmPSJ7JGNsYXNzLmhyZWZ9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz48L2E+PC90ZD4KKwk8L3hzbDppZj4KKyAgICAgICAgPHRkPgorCSAgICA8YSBuYW1lPSJ7QG5hbWV9Ii8+CisJICAgIDx4c2w6Y2hvb3NlPgorCQk8eHNsOndoZW4gdGVzdD0iYm9vbGVhbigkc2hvdy5jbGFzcykiPgorCQkgICAgPGEgaHJlZj0ie2NvbmNhdCgkY2xhc3MuaHJlZiwgJyMnLCBAbmFtZSl9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+CisJCTwveHNsOndoZW4+CisJCTx4c2w6b3RoZXJ3aXNlPgorCQkgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisJCTwveHNsOm90aGVyd2lzZT4KKwkgICAgPC94c2w6Y2hvb3NlPgorCTwvdGQ+CisgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPgorICAgICAgICAgICAgICAgIDx0ZD5GYWlsdXJlPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlIi8+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPgorICAgICAgICAgICAgICAgIDx0ZD5FcnJvcjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZXJyb3IiLz48L3RkPgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgIDx0ZD5TdWNjZXNzPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gTm90ZSA6IHRoZSBiZWxvdyB0ZW1wbGF0ZSBlcnJvciBhbmQgZmFpbHVyZSBhcmUgdGhlIHNhbWUgc3R5bGUKKyAgICAgICAgICAgIHNvIGp1c3QgY2FsbCB0aGUgc2FtZSBzdHlsZSBzdG9yZSBpbiB0aGUgdG9vbGtpdCB0ZW1wbGF0ZSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZhaWx1cmUiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3IiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBTdHlsZSBmb3IgdGhlIGVycm9yIGFuZCBmYWlsdXJlIGluIHRoZSB0ZXN0Y2FzZSB0ZW1wbGF0ZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyI+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQG1lc3NhZ2UpIj5OL0E8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPgorICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorICAgIDwhLS0gZGlzcGxheSB0aGUgc3RhY2t0cmFjZSAtLT4KKyAgICA8YnIvPjxici8+CisgICAgPGNvZGU+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9Ii4iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L2NvZGU+CisgICAgPCEtLSB0aGUgbGF0dGVyIGlzIGJldHRlciBidXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgZm9yIG5vbi0yMSIgbW9uaXRvcnMuLi4gLS0+CisgICAgPCEtLXByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvcHJlLS0+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAxIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCRzdHJpbmcpLCdcJywnXFwnKSIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idG1wMiIgc2VsZWN0PSJzdHJpbmd1dGlsczpyZXBsYWNlKHN0cmluZygkdG1wMSksJnF1b3Q7JyZxdW90OywmcXVvdDtcJmFwb3M7JnF1b3Q7KSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG1wMiIvPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIHRlbXBsYXRlIHRoYXQgd2lsbCBjb252ZXJ0IGEgY2FycmlhZ2UgcmV0dXJuIGludG8gYSBiciB0YWcKKyAgICBAcGFyYW0gd29yZCB0aGUgdGV4dCBmcm9tIHdoaWNoIHRvIGNvbnZlcnQgQ1IgdG8gQlIgdGFnCistLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9J3N0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCR3b3JkKSwiJiN4QTsiLCImbHQ7YnIvPiIpJy8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAwJykiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktcGVyY2VudCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCR2YWx1ZSwnMC4wMCUnKSIvPgorPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9qdW5pdC1ub2ZyYW1lcy54c2wgYi90cnVuay9zcmMvZXRjL2p1bml0LW5vZnJhbWVzLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGFiOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9qdW5pdC1ub2ZyYW1lcy54c2wKQEAgLTAsMCArMSw0NjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCisgICAgICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKyAgICAgICAgeG1sbnM6c3RyaW5ndXRpbHM9InhhbGFuOi8vb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlscyI+Cis8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiCisgIGRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgLz4KKzx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzx4c2w6cGFyYW0gbmFtZT0iVElUTEUiPlVuaXQgVGVzdCBSZXN1bHRzLjwveHNsOnBhcmFtPgorCis8IS0tCisKKyBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggQW50IEpVbml0UmVwb3J0IG91dHB1dC4KKworIEl0IGNyZWF0ZXMgYSBub24tZnJhbWVkIHJlcG9ydCB0aGF0IGNhbiBiZSB1c2VmdWwgdG8gc2VuZCB2aWEKKyBlLW1haWwgb3Igc3VjaC4KKworLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIj4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRUSVRMRSIvPjwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgIGJvZHkgeworICAgICAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7CisgICAgICAgIGNvbG9yOiMwMDAwMDA7CisgICAgICB9CisgICAgICB0YWJsZSB0ciB0ZCwgdGFibGUgdHIgdGggeworICAgICAgICAgIGZvbnQtc2l6ZTogNjglOworICAgICAgfQorICAgICAgdGFibGUuZGV0YWlscyB0ciB0aHsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICAgICAgYmFja2dyb3VuZDojYTZjYWYwOworICAgICAgfQorICAgICAgdGFibGUuZGV0YWlscyB0ciB0ZHsKKyAgICAgICAgYmFja2dyb3VuZDojZWVlZWUwOworICAgICAgfQorCisgICAgICBwIHsKKyAgICAgICAgbGluZS1oZWlnaHQ6MS41ZW07CisgICAgICAgIG1hcmdpbi10b3A6MC41ZW07IG1hcmdpbi1ib3R0b206MS4wZW07CisgICAgICB9CisgICAgICBoMSB7CisgICAgICAgIG1hcmdpbjogMHB4IDBweCA1cHg7IGZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIGgyIHsKKyAgICAgICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCisgICAgICB9CisgICAgICBoMyB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIGg0IHsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgICAgfQorICAgICAgaDUgeworICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCisgICAgICB9CisgICAgICBoNiB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIC5FcnJvciB7CisgICAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnJlZDsKKyAgICAgIH0KKyAgICAgIC5GYWlsdXJlIHsKKyAgICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOworICAgICAgfQorICAgICAgLlByb3BlcnRpZXMgeworICAgICAgICB0ZXh0LWFsaWduOnJpZ2h0OworICAgICAgfQorICAgICAgPC9zdHlsZT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisgICAgICAgIHZhciBUZXN0Q2FzZXMgPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgdmFyIGN1cjsKKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlIj4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvcGVydGllcyIvPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKworICAgICAgIDwvc2NyaXB0PgorICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCFbQ0RBVEFbCisgICAgICAgIGZ1bmN0aW9uIGRpc3BsYXlQcm9wZXJ0aWVzIChuYW1lKSB7CisgICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdy5vcGVuKCcnLCdKVW5pdFN5c3RlbVByb3BlcnRpZXMnLCdzY3JvbGxiYXJzPTEscmVzaXphYmxlPTEnKTsKKyAgICAgICAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50OworICAgICAgICAgIGRvYy5vcGVuKCk7CisgICAgICAgICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48dGl0bGU+UHJvcGVydGllcyBvZiAiICsgbmFtZSArICI8L3RpdGxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPHN0eWxlPiIpCisgICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7IGNvbG9yOiMwMDAwMDA7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7IGZvbnQtc2l6ZTogNjglOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyBib3JkZXItbGVmdDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci10b3A6c29saWQgMSAjY2NjY2NjOyBwYWRkaW5nOjVweDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0ZCB7IGZvbnQ6bm9ybWFsOyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmZmOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJoMyB7IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvaGVhZD48Ym9keT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxoMz5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvaDM+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0YWJsZSBjbGFzcz0ncHJvcGVydGllcyc+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iKTsKKyAgICAgICAgICBmb3IgKHByb3AgaW4gVGVzdENhc2VzW25hbWVdKSB7CisgICAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+IiArIHByb3AgKyAiPC90aD48dGQ+IiArIFRlc3RDYXNlc1tuYW1lXVtwcm9wXSArICI8L3RkPjwvdHI+Iik7CisgICAgICAgICAgfQorICAgICAgICAgIGRvYy53cml0ZSgiPC90YWJsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7CisgICAgICAgICAgZG9jLmNsb3NlKCk7CisgICAgICAgICAgd2luLmZvY3VzKCk7CisgICAgICAgIH0KKyAgICAgIF1dPgorICAgICAgPC9zY3JpcHQ+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8YSBuYW1lPSJ0b3AiPjwvYT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisKKyAgICAgICAgICAgIDwhLS0gU3VtbWFyeSBwYXJ0IC0tPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN1bW1hcnkiLz4KKyAgICAgICAgICAgIDxociBzaXplPSIxIiB3aWR0aD0iOTUlIiBhbGlnbj0ibGVmdCIvPgorCisgICAgICAgICAgICA8IS0tIFBhY2thZ2UgTGlzdCBwYXJ0IC0tPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2VsaXN0Ii8+CisgICAgICAgICAgICA8aHIgc2l6ZT0iMSIgd2lkdGg9Ijk1JSIgYWxpZ249ImxlZnQiLz4KKworICAgICAgICAgICAgPCEtLSBGb3IgZWFjaCBwYWNrYWdlIGNyZWF0ZSBpdHMgcGFydCAtLT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlcyIvPgorICAgICAgICAgICAgPGhyIHNpemU9IjEiIHdpZHRoPSI5NSUiIGFsaWduPSJsZWZ0Ii8+CisKKyAgICAgICAgICAgIDwhLS0gRm9yIGVhY2ggY2xhc3MgY3JlYXRlIHRoZSAgcGFydCAtLT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzIi8+CisKKyAgICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gV3JpdGUgYSBsaXN0IG9mIGFsbCBwYWNrYWdlcyB3aXRoIGFuIGh5cGVybGluayB0byB0aGUgYW5jaG9yIG9mICAgIC0tPgorICAgIDwhLS0gb2YgdGhlIHBhY2thZ2UgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZWxpc3QiPgorICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgorICAgICAgICBOb3RlOiBwYWNrYWdlIHN0YXRpc3RpY3MgYXJlIG5vdCBjb21wdXRlZCByZWN1cnNpdmVseSwgdGhleSBvbmx5IHN1bSB1cCBhbGwgb2YgaXRzIHRlc3RzdWl0ZXMgbnVtYmVycy4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICA8IS0tIGxpc3QgYWxsIHBhY2thZ2VzIHJlY3Vyc2l2ZWx5IC0tPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KKyAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdHN1aXRlcy1pbi1wYWNrYWdlIiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gY3VycmVudCgpL0BwYWNrYWdlXSIvPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdENvdW50IiBzZWxlY3Q9InN1bSgkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0B0ZXN0cykiLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0ic3VtKCR0ZXN0c3VpdGVzLWluLXBhY2thZ2UvQGVycm9ycykiLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZhaWx1cmVDb3VudCIgc2VsZWN0PSJzdW0oJHRlc3RzdWl0ZXMtaW4tcGFja2FnZS9AZmFpbHVyZXMpIi8+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aW1lQ291bnQiIHNlbGVjdD0ic3VtKCR0ZXN0c3VpdGVzLWluLXBhY2thZ2UvQHRpbWUpIi8+CisKKyAgICAgICAgICAgICAgICA8IS0tIHdyaXRlIGEgc3VtbWFyeSBmb3IgdGhlIHBhY2thZ2UgLS0+CisgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBzZXQgYSBuaWNlIGNvbG9yIGRlcGVuZGluZyBpZiB0aGVyZSBpcyBhbiBlcnJvci9mYWlsdXJlIC0tPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGZhaWx1cmVDb3VudCAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXJyb3JDb3VudCAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iI3tAcGFja2FnZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0Q291bnQiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmFpbHVyZUNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkdGltZUNvdW50Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlc3RzdWl0ZXMtaW4tcGFja2FnZS9AdGltZXN0YW1wIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0Bob3N0bmFtZSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICA8L3RhYmxlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIFdyaXRlIGEgcGFja2FnZSBsZXZlbCByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tIEl0IGNyZWF0ZXMgYSB0YWJsZSB3aXRoIHZhbHVlcyBmcm9tIHRoZSBkb2N1bWVudDogICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tIE5hbWUgfCBUZXN0cyB8IEVycm9ycyB8IEZhaWx1cmVzIHwgVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2VzIj4KKyAgICAgICAgPCEtLSBjcmVhdGUgYW4gYW5jaG9yIHRvIHRoaXMgcGFja2FnZSBuYW1lIC0tPgorICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIi8+CisgICAgICAgICAgICAgICAgPGEgbmFtZT0ie0BwYWNrYWdlfSI+PC9hPgorICAgICAgICAgICAgICAgIDxoMz5QYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwvaDM+CisKKyAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0gbWF0Y2ggdGhlIHRlc3RzdWl0ZXMgb2YgdGhpcyBwYWNrYWdlIC0tPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gY3VycmVudCgpL0BwYWNrYWdlXSIgbW9kZT0icHJpbnQudGVzdCIvPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+CisgICAgICAgICAgICAgICAgPHAvPgorICAgICAgICAgICAgICAgIDxwLz4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzZXMiPgorICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idGVzdHN1aXRlIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICA8IS0tIGNyZWF0ZSBhbiBhbmNob3IgdG8gdGhpcyBjbGFzcyBuYW1lIC0tPgorICAgICAgICAgICAgPGEgbmFtZT0ie0BuYW1lfSI+PC9hPgorICAgICAgICAgICAgPGgzPlRlc3RDYXNlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvaDM+CisKKyAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICB0ZXN0IGNhbiBldmVuIG5vdCBiZSBzdGFydGVkIGF0IGFsbCAoZmFpbHVyZSB0byBsb2FkIHRoZSBjbGFzcykKKyAgICAgICAgICAgICAgc28gcmVwb3J0IHRoZSBlcnJvciBkaXJlY3RseQorICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii4vZXJyb3IiPgorICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkVycm9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vZXJyb3IiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCIvPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5qYXZhc2NyaXB0OmRpc3BsYXlQcm9wZXJ0aWVzKCc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Jyk7PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzICYjMTg3OworICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPHAvPgorCisgICAgICAgICAgICA8YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InN1bW1hcnkiPgorICAgICAgICA8aDI+U3VtbWFyeTwvaDI+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdENvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRlc3RzKSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZXJyb3JzKSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZhaWx1cmVDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0BmYWlsdXJlcykiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aW1lQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGltZSkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWNjZXNzUmF0ZSIgc2VsZWN0PSIoJHRlc3RDb3VudCAtICRmYWlsdXJlQ291bnQgLSAkZXJyb3JDb3VudCkgZGl2ICR0ZXN0Q291bnQiLz4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICAgICAgPHRoPlN1Y2Nlc3MgcmF0ZTwvdGg+CisgICAgICAgICAgICA8dGg+VGltZTwvdGg+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXJyb3JDb3VudCAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0Q291bnQiLz48L3RkPgorICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmFpbHVyZUNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L3RkPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHN1Y2Nlc3NSYXRlIi8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkdGltZUNvdW50Ii8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvdGQ+CisKKyAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9Ijk1JSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+CisgICAgICAgIE5vdGU6IDxpPmZhaWx1cmVzPC9pPiBhcmUgYW50aWNpcGF0ZWQgYW5kIGNoZWNrZWQgZm9yIHdpdGggYXNzZXJ0aW9ucyB3aGlsZSA8aT5lcnJvcnM8L2k+IGFyZSB1bmFudGljaXBhdGVkLgorICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0KKyAgIFdyaXRlIHByb3BlcnRpZXMgaW50byBhIEphdmFTY3JpcHQgZGF0YSBzdHJ1Y3R1cmUuCisgICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBpZGVhIGJ5IEVyaWsgSGF0Y2hlciAoZWhhdGNoZXJAYXBhY2hlLm9yZykKKyAgIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9wZXJ0aWVzIj4KKyAgICBjdXIgPSBUZXN0Q2FzZXNbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz4nXSA9IG5ldyBBcnJheSgpOworICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+CisgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgY3VyWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4nXSA9ICc8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj48eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9IkB2YWx1ZSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+JzsKKyAgICA8L3hzbDpmb3ItZWFjaD4KKyAgPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gUGFnZSBIRUFERVIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgorICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFRJVExFIi8+PC9oMT4KKyAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgorICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cDovL3d3dy5qdW5pdC5vcmcnPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2FudC5hcGFjaGUub3JnL2FudCc+QW50PC9hPi48L3RkPgorICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8aHIgc2l6ZT0iMSIvPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iaGVhZGVyIj4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+CisgICAgICAgIDx0aD5UZXN0czwvdGg+CisgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICA8dGg+RmFpbHVyZXM8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBjbGFzcyBoZWFkZXIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgorICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lIFN0YW1wPC90aD4KKyAgICAgICAgPHRoPkhvc3Q8L3RoPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBtZXRob2QgaGVhZGVyIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRoPk5hbWU8L3RoPgorICAgICAgICA8dGg+U3RhdHVzPC90aD4KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPlR5cGU8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tIGNsYXNzIGluZm9ybWF0aW9uIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICA8IS0tIHNldCBhIG5pY2UgY29sb3IgZGVwZW5kaW5nIGlmIHRoZXJlIGlzIGFuIGVycm9yL2ZhaWx1cmUgLS0+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZmFpbHVyZXNbLiZndDsgMF0iPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZXJyb3JzWy4mZ3Q7IDBdIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKworICAgICAgICA8IS0tIHByaW50IHRlc3RzdWl0ZSBpbmZvcm1hdGlvbiAtLT4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiN7QG5hbWV9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGVzdHMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlcnJvcnMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBmYWlsdXJlcyIvPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRpbWVzdGFtcCIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBob3N0bmFtZSIvPjwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUgfCBlcnJvciI+RXJyb3I8L3hzbDp3aGVuPgorICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3RkPgorICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlIj4KKyAgICAgICAgICAgICAgICA8dGQ+RmFpbHVyZTwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmFpbHVyZSIvPjwvdGQ+CisgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImVycm9yIj4KKyAgICAgICAgICAgICAgICA8dGQ+RXJyb3I8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImVycm9yIi8+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8dGQ+U3VjY2VzczwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjwvdGQ+CisgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IkB0aW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJmYWlsdXJlIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVycm9yIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gU3R5bGUgZm9yIHRoZSBlcnJvciBhbmQgZmFpbHVyZSBpbiB0aGUgdGVzY2FzZSB0ZW1wbGF0ZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyI+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQG1lc3NhZ2UpIj5OL0E8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPgorICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorICAgIDwhLS0gZGlzcGxheSB0aGUgc3RhY2t0cmFjZSAtLT4KKyAgICA8Y29kZT4KKyAgICAgICAgPGJyLz48YnIvPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0id29yZCIgc2VsZWN0PSIuIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9jb2RlPgorICAgIDwhLS0gdGhlIGxhdGVyIGlzIGJldHRlciBidXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgZm9yIG5vbi0yMSIgbW9uaXRvcnMuLi4gLS0+CisgICAgPCEtLXByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvcHJlLS0+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAxIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCRzdHJpbmcpLCdcJywnXFwnKSIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idG1wMiIgc2VsZWN0PSJzdHJpbmd1dGlsczpyZXBsYWNlKHN0cmluZygkdG1wMSksJnF1b3Q7JyZxdW90OywmcXVvdDtcJmFwb3M7JnF1b3Q7KSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG1wMiIvPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIHRlbXBsYXRlIHRoYXQgd2lsbCBjb252ZXJ0IGEgY2FycmlhZ2UgcmV0dXJuIGludG8gYSBiciB0YWcKKyAgICBAcGFyYW0gd29yZCB0aGUgdGV4dCBmcm9tIHdoaWNoIHRvIGNvbnZlcnQgQ1IgdG8gQlIgdGFnCistLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9J3N0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCR3b3JkKSwiJiN4QTsiLCImbHQ7YnIvPiIpJy8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAwJykiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktcGVyY2VudCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCR2YWx1ZSwnMC4wMCUnKSIvPgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL2xvZy54c2wgYi90cnVuay9zcmMvZXRjL2xvZy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0MDk5MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvbG9nLnhzbApAQCAtMCwwICsxLDIwMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Cis8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiLz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAKKy0tPgorIAorPCEtLQorCisgIFRoZSBwdXJwb3NlIGhhdmUgdGhpcyBYU0wgaXMgdG8gcHJvdmlkZSBhIG5pY2Ugd2F5IHRvIGxvb2sgYXQgdGhlIG91dHB1dAorICBmcm9tIHRoZSBBbnQgWG1sTG9nZ2VyIChpZTogYW50IC1saXN0ZW5lciBvcmcuYXBhY2hlLnRvb2xzLmFudC5YbWxMb2dnZXIgKQorICAKKyAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGFwYWNoZS5vcmciPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgorICAKKy0tPgorPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIiAvPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgIC5iYW5uZXJjZWxsIHsKKyAgICAgIGJvcmRlcjogMHB4OworICAgICAgcGFkZGluZzogMHB4OworICAgIH0KKyAgICBib2R5IHsKKyAgICAgIG1hcmdpbjogMDsKKyAgICAgIGZvbnQ6bm9ybWFsIDEwMCUgYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmOworICAgICAgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOworICAgICAgY29sb3I6IzAwMDAwMDsKKyAgICB9CisgICAgdGFibGUuc3RhdHVzIHsKKyAgICAgIGZvbnQ6Ym9sZCA4MCUgYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmOworICAgICAgYmFja2dyb3VuZC1jb2xvcjojNTI1RDc2OworICAgICAgY29sb3I6I2ZmZmZmZjsKKyAgICB9CisgICAgdGFibGUubG9nIHRyIHRkLCB0ciB0aCB7CisgICAgICBmb250LXNpemU6IDgwJTsKKyAgICB9CisgICAgLmVycm9yIHsKKyAgICAgIGNvbG9yOnJlZDsKKyAgICB9CisgICAgLndhcm4geworICAgICAgY29sb3I6YnJvd247CisgICAgfQorICAgIC5pbmZvIHsKKyAgICAgIGNvbG9yOmdyYXk7CisgICAgfQorICAgIC5kZWJ1Z3sKKyAgICAgIGNvbG9yOmdyYXk7CisgICAgfQorICAgIC5mYWlsZWQgeworICAgICAgZm9udC1zaXplOjgwJTsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IHJlZDsKKyAgICAgIGNvbG9yOiNGRkZGRkY7CisgICAgICBmb250LXdlaWdodDogYm9sZAorICAgIH0KKyAgICAuY29tcGxldGUgeworICAgICAgZm9udC1zaXplOjgwJTsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6ICM1MjVENzY7CisgICAgICBjb2xvcjojRkZGRkZGOworICAgICAgZm9udC13ZWlnaHQ6IGJvbGQKKyAgICB9CisgICAgLmEgdGQgeyAKKyAgICAgIGJhY2tncm91bmQ6ICNlZmVmZWY7CisgICAgfQorICAgIC5iIHRkIHsgCisgICAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgIH0KKyAgICB0aCwgdGQgeworICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgfQorICAgIHRoIHsKKyAgICAgIGJhY2tncm91bmQ6ICNjY2M7CisgICAgICBjb2xvcjogYmxhY2s7CisgICAgfQorICAgIHRhYmxlLCB0aCwgdGQgeworICAgICAgYm9yZGVyOiBub25lCisgICAgfQorICAgIGgzIHsKKyAgICAgIGZvbnQ6Ym9sZCA4MCUgYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmOworICAgICAgYmFja2dyb3VuZDogIzUyNUQ3NjsKKyAgICAgIGNvbG9yOiB3aGl0ZTsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIHBhZGRpbmc6IDVweDsKKyAgICAgIG1hcmdpbi1yaWdodDogMnB4OworICAgICAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgfQorICAgIDwvc3R5bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPCEtLSBqYWthcnRhIGxvZ28gLS0+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIiBjbGFzcz0iYmFubmVyY2VsbCI+CisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvIj4KKyAgICAgICAgPGltZyBzcmM9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvaW1hZ2VzL2pha2FydGEtbG9nby5naWYiIGFsdD0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZyIgYWxpZ249ImxlZnQiIGJvcmRlcj0iMCIvPgorICAgICAgICA8L2E+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0O3ZlcnRpY2FsLWFsaWduOmJvdHRvbSI+CisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFwYWNoZSBBbnQ8L2E+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICAgIAorICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPjxociBub3NoYWRlPSJ5ZXMiIHNpemU9IjEiLz48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKworICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iYnVpbGQiLz4KKworICA8L2JvZHk+Cis8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYnVpbGQiPgorICA8IS0tIGJ1aWxkIHN0YXR1cyAtLT4KKyAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICA8eHNsOmlmIHRlc3Q9IkBlcnJvciI+ZmFpbGVkPC94c2w6aWY+CisgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAZXJyb3IpIj5jb21wbGV0ZTwveHNsOmlmPgorICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICA8dHI+CisgICAgICA8eHNsOmlmIHRlc3Q9IkBlcnJvciI+CisgICAgICAgIDx0ZCBub3dyYXA9InllcyI+QnVpbGQgRmFpbGVkPC90ZD4gCisgICAgICA8L3hzbDppZj4KKyAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBlcnJvcikiPgorICAgICAgICA8dGQgbm93cmFwPSJ5ZXMiPkJ1aWxkIENvbXBsZXRlPC90ZD4KKyAgICAgIDwveHNsOmlmPgorICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiIG5vd3JhcD0ieWVzIj5Ub3RhbCBUaW1lOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpbWUiLz48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkIGNvbHNwYW49IjIiPgorICAgICAgICA8eHNsOmlmIHRlc3Q9IkBlcnJvciI+CisgICAgICAgICAgPHR0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZXJyb3IiLz48L3R0Pjxici8+CisgICAgICAgICAgPGkgc3R5bGU9ImZvbnQtc2l6ZTo4MCUiPlNlZSB0aGUgPGEgaHJlZj0iI3N0YWNrdHJhY2UiIGFsdD0iQ2xpY2sgZm9yIGRldGFpbHMiPnN0YWNrdHJhY2U8L2E+LjwvaT4KKyAgICAgICAgPC94c2w6aWY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMyIgd2lkdGg9IjEwMCUiIHN0eWxlPSJmb250LXNpemU6ODAlIj4KKyAgICA8dHIgY2xhc3M9ImEiPjx0ZCB3aWR0aD0iMSI+YW50LmZpbGU8L3RkPjx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKC8vbWVzc2FnZVtjb250YWlucyh0ZXh0KCksJ2FudC5maWxlJyldLCAnLT4nKSIvPjwvdGQ+PC90cj4KKyAgICA8dHIgY2xhc3M9ImIiPjx0ZCB3aWR0aD0iMSI+YW50LnZlcnNpb248L3RkPjx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKC8vbWVzc2FnZVtjb250YWlucyh0ZXh0KCksJ2FudC52ZXJzaW9uJyldLCAnLT4nKSIvPjwvdGQ+PC90cj4KKyAgICA8dHIgY2xhc3M9ImEiPjx0ZCB3aWR0aD0iMSI+amF2YS52ZXJzaW9uPC90ZD48dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigvL21lc3NhZ2VbY29udGFpbnModGV4dCgpLCdqYXZhLnZtLnZlcnNpb24nKV0sICctPicpIi8+PC90ZD48L3RyPgorICAgIDx0ciBjbGFzcz0iYiI+PHRkIHdpZHRoPSIxIj5vcy5uYW1lPC90ZD48dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigvL21lc3NhZ2VbY29udGFpbnModGV4dCgpLCdvcy5uYW1lJyldLCAnLT4nKSIvPjwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKyAgPCEtLSBidWlsZCBpbmZvcm1hdGlvbiAtLT4KKyAgPGgzPkJ1aWxkIGV2ZW50czwvaDM+CisgIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIyIiBjZWxscGFkZGluZz0iMyIgd2lkdGg9IjEwMCUiPgorICA8dHI+CisgICAgPHRoIG5vd3JhcD0ieWVzIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjElIj50YXJnZXQ8L3RoPgorICAgIDx0aCBub3dyYXA9InllcyIgYWxpZ249ImxlZnQiIHdpZHRoPSIxJSI+dGFzazwvdGg+CisgICAgPHRoIG5vd3JhcD0ieWVzIiBhbGlnbj0ibGVmdCI+bWVzc2FnZTwvdGg+CisgIDwvdHI+CisgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vbWVzc2FnZVtAcHJpb3JpdHkgIT0gJ2RlYnVnJ10iLz4KKyAgPC90YWJsZT4KKyAgPHA+CisgIDwhLS0gc3RhY2t0cmFjZSAtLT4KKyAgPHhzbDppZiB0ZXN0PSJzdGFja3RyYWNlIj4KKyAgPGEgbmFtZT0ic3RhY2t0cmFjZSIvPgorICA8aDM+RXJyb3IgZGV0YWlsczwvaDM+CisgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD4KKyAgICAgIDxwcmU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN0YWNrdHJhY2UiLz48L3ByZT4KKyAgICA8L3RkPjwvdHI+CisgIDwvdGFibGU+CisgIDwveHNsOmlmPgorICA8L3A+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSByZXBvcnQgZXZlcnkgbWVzc2FnZSBidXQgdGhvc2Ugd2l0aCBkZWJ1ZyBwcmlvcml0eSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lc3NhZ2VbQHByaW9yaXR5IT0nZGVidWcnXSI+CisgIDx0ciB2YWxpZ249InRvcCI+CisgICAgPCEtLSBhbHRlcm5hdGVkIHJvdyBzdHlsZSAtLT4KKyAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAxIj5hPC94c2w6aWY+CisgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAwIj5iPC94c2w6aWY+CisgICAgPC94c2w6YXR0cmlidXRlPgorICAgIDx0ZCBub3dyYXA9InllcyIgd2lkdGg9IjElIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vLi4vQG5hbWUiLz48L3RkPgorICAgIDx0ZCBub3dyYXA9InllcyIgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiIHdpZHRoPSIxJSI+WyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz4gXTwvdGQ+CisgICAgPHRkIGNsYXNzPSJ7QHByaW9yaXR5fSIgbm93cmFwPSJ5ZXMiPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPgorICAgIDwvdGQ+CisgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvbWFuaWZlc3QgYi90cnVuay9zcmMvZXRjL21hbmlmZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OGJjMGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL21hbmlmZXN0CkBAIC0wLDAgKzEsNCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitNYWluLUNsYXNzOiBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9tYXVkaXQtZnJhbWVzLnhzbCBiL3RydW5rL3NyYy9ldGMvbWF1ZGl0LWZyYW1lcy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3YzBjOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvbWF1ZGl0LWZyYW1lcy54c2wKQEAgLTAsMCArMSw1MDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCisgICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgorICAgIHhtbG5zOnJlZGlyZWN0PSJvcmcuYXBhY2hlLnhhbGFuLmxpYi5SZWRpcmVjdCIKKyAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgorPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIgZW5jb2Rpbmc9IlVTLUFTQ0lJIi8+Cis8eHNsOmRlY2ltYWwtZm9ybWF0IGRlY2ltYWwtc2VwYXJhdG9yPSIuIiBncm91cGluZy1zZXBhcmF0b3I9IiwiIC8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisKKyAgICBTdHlsZXNoZWV0IHRvIHRyYW5zZm9ybSBhbiBYTUwgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIEFudCBNQXVkaXQgdGFzayBpbnRvCisgICAgYSBzZXQgb2YgSmF2YURvYy1saWtlIEhUTUwgcGFnZSB0byBtYWtlIHBhZ2VzIG1vcmUgY29udmVuaWVudCB0byBiZSBicm93c2VkLgorCisgICAgSXQgdXNlIHRoZSBYYWxhbiByZWRpcmVjdCBleHRlbnNpb24gdG8gd3JpdGUgdG8gbXVsdGlwbGUgb3V0cHV0IGZpbGVzLgorCisgICAgQGF1dGhvciBTdGVwaGFuZSBCYWlsbGlleiA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGFwYWNoZS5vcmciLz4KKy0tPgorCis8eHNsOnBhcmFtIG5hbWU9Im91dHB1dC5kaXIiIHNlbGVjdD0iJy4nIi8+CisKKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3NlcyI+CisgICAgPCEtLSBjcmVhdGUgdGhlIGluZGV4Lmh0bWwgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vaW5kZXguaHRtbCI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBzdHlsZXNoZWV0LmNzcyAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9zdHlsZXNoZWV0LmNzcyI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgb3ZlcnZpZXctcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1mcmFtZS5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwucGFja2FnZXMiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsY2xhc3Nlcy1mcmFtZS5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwuY2xhc3NlcyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIHByb2Nlc3MgYWxsIHBhY2thZ2VzIC0tPgorICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL2NsYXNzW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OmNsYXNzL0BwYWNrYWdlKV0iPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwveHNsOmZvci1lYWNoPgorPC94c2w6dGVtcGxhdGU+CisKKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJG5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJG5hbWUsJy4nLCcvJykiLz48L3hzbDppZj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSIkbmFtZSA9ICcnIj4uPC94c2w6aWY+CisgICAgPC94c2w6dmFyaWFibGU+CisgICAgPCEtLVByb2Nlc3NpbmcgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gaW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXQuZGlyIi8+IC0tPgorICAgIDwhLS0gY3JlYXRlIGEgY2xhc3Nlcy1saXN0Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2UtZnJhbWUuaHRtbCI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzLmxpc3QiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgYSBwYWNrYWdlLXN1bW1hcnkuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gZm9yIGVhY2ggY2xhc3MsIGNyZWF0ZXMgYSBAbmFtZS5odG1sIC0tPgorICAgIDwhLS0gQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSB3aXRoIGlubmVyIGNsYXNzZXMgaGF2aW5nIHRoZSBzYW1lIG5hbWUsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gLS0+CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii9jbGFzc2VzL2NsYXNzW0BwYWNrYWdlID0gJG5hbWVdIj4KKyAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BuYW1lfS5odG1sIj4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY2xhc3MuZGV0YWlscyIvPgorICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgorICAgIDwveHNsOmZvci1lYWNoPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCI+Cis8SFRNTD4KKyAgICA8SEVBRD48VElUTEU+QXVkaXQgUmVzdWx0cy48L1RJVExFPjwvSEVBRD4KKyAgICA8RlJBTUVTRVQgY29scz0iMjAlLDgwJSI+CisgICAgICAgIDxGUkFNRVNFVCByb3dzPSIzMCUsNzAlIj4KKyAgICAgICAgICAgIDxGUkFNRSBzcmM9Im92ZXJ2aWV3LWZyYW1lLmh0bWwiIG5hbWU9InBhY2thZ2VMaXN0RnJhbWUiLz4KKyAgICAgICAgICAgIDxGUkFNRSBzcmM9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgbmFtZT0iY2xhc3NMaXN0RnJhbWUiLz4KKyAgICAgICAgPC9GUkFNRVNFVD4KKyAgICAgICAgPEZSQU1FIHNyYz0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiBuYW1lPSJjbGFzc0ZyYW1lIi8+CisgICAgPC9GUkFNRVNFVD4KKyAgICA8bm9mcmFtZXM+CisgICAgICAgIDxIMj5GcmFtZSBBbGVydDwvSDI+CisgICAgICAgIDxQPgorICAgICAgICBUaGlzIGRvY3VtZW50IGlzIGRlc2lnbmVkIHRvIGJlIHZpZXdlZCB1c2luZyB0aGUgZnJhbWVzIGZlYXR1cmUuIElmIHlvdSBzZWUgdGhpcyBtZXNzYWdlLCB5b3UgYXJlIHVzaW5nIGEgbm9uLWZyYW1lLWNhcGFibGUgd2ViIGNsaWVudC4KKyAgICAgICAgPC9QPgorICAgIDwvbm9mcmFtZXM+Cis8L0hUTUw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tIHRoaXMgaXMgdGhlIHN0eWxlc2hlZXQgY3NzIHRvIHVzZSBmb3IgbmVhcmx5IGV2ZXJ5dGhpbmcgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIj4KKyAgICAuYmFubmVyY2VsbCB7CisgICAgICBib3JkZXI6IDBweDsKKyAgICAgIHBhZGRpbmc6IDBweDsKKyAgICB9CisgICAgYm9keSB7CisgICAgICBtYXJnaW4tbGVmdDogMTA7CisgICAgICBtYXJnaW4tcmlnaHQ6IDEwOworICAgICAgZm9udDpub3JtYWwgODAlIGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjsKKyAgICAgIGNvbG9yOiMwMDAwMDA7CisgICAgfQorICAgIC5hIHRkIHsKKyAgICAgIGJhY2tncm91bmQ6ICNlZmVmZWY7CisgICAgfQorICAgIC5iIHRkIHsKKyAgICAgIGJhY2tncm91bmQ6ICNmZmY7CisgICAgfQorICAgIHRoLCB0ZCB7CisgICAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB9CisgICAgdGggeworICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgICAgIGJhY2tncm91bmQ6ICNjY2M7CisgICAgICBjb2xvcjogYmxhY2s7CisgICAgfQorICAgIHRhYmxlLCB0aCwgdGQgeworICAgICAgZm9udC1zaXplOjEwMCU7CisgICAgICBib3JkZXI6IG5vbmUKKyAgICB9CisgICAgdGFibGUubG9nIHRyIHRkLCB0ciB0aCB7CisKKyAgICB9CisgICAgaDIgeworICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgICAgIGZvbnQtc2l6ZToxNDAlOworICAgICAgbWFyZ2luLWJvdHRvbTogNTsKKyAgICB9CisgICAgaDMgeworICAgICAgZm9udC1zaXplOjEwMCU7CisgICAgICBmb250LXdlaWdodDpib2xkOworICAgICAgYmFja2dyb3VuZDogIzUyNUQ3NjsKKyAgICAgIGNvbG9yOiB3aGl0ZTsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIHBhZGRpbmc6IDVweDsKKyAgICAgIG1hcmdpbi1yaWdodDogMnB4OworICAgICAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgICAgIG1hcmdpbi1ib3R0b206IDA7CisgICAgfQorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBwcmludCB0aGUgdmlvbGF0aW9ucyBvZiB0aGUgY2xhc3MgLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iY2xhc3MuZGV0YWlscyI+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICA8SFRNTD4KKyAgICAgICAgPEhFQUQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L0hFQUQ+CisgICAgICAgIDxCT0RZPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKyAgICAgICAgICAgIDxIMz5DbGFzcyA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPi48L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L0gzPgorCisgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3MuYXVkaXQuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcmludC5hdWRpdCIvPgorICAgICAgICAgICAgPC90YWJsZT4KKworICAgICAgICAgICAgPEgzPlZpb2xhdGlvbnM8L0gzPgorICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InZpb2xhdGlvbi5hdWRpdC5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdmlvbGF0aW9uIiBtb2RlPSJwcmludC5hdWRpdCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBkYXRhLXR5cGU9Im51bWJlciIgc2VsZWN0PSJAbGluZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciIvPgorICAgICAgICA8L0JPRFk+CisgICAgPC9IVE1MPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBsaXN0IG9mIGNsYXNzZXMgaW4gYSBwYWNrYWdlIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzLmxpc3QiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibmFtZSIvPgorICAgIDxIVE1MPgorICAgICAgICA8SEVBRD4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L0hFQUQ+CisgICAgICAgIDxCT0RZPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8SDI+PGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+PC9hPjwvSDI+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGFibGU+CisKKyAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgIDxUQUJMRSBXSURUSD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIvY2xhc3Nlcy9jbGFzc1suL0BwYWNrYWdlID0gJG5hbWVdIiBtb2RlPSJjbGFzc2VzLmxpc3QiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgIDwvVEFCTEU+CisgICAgICAgIDwvQk9EWT4KKyAgICA8L0hUTUw+Cis8L3hzbDp0ZW1wbGF0ZT4KKzwhLS0gdGhlIGNsYXNzIHRvIGxpc3QgLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iY2xhc3Nlcy5saXN0Ij4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICA8IS0tIEBidWcgbmFtaW5nIHRvIGZpeCBmb3IgaW5uZXIgY2xhc3NlcyAtLT4KKyAgICAgICAgICAgIDxhIGhyZWY9IntAbmFtZX0uaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0KKyAgICBDcmVhdGVzIGFuIGFsbC1jbGFzc2VzLmh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwKKyAgICBvbiBlYWNoIGNsYXNzLgorLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzc2VzIiBtb2RlPSJhbGwuY2xhc3NlcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8aDI+Q2xhc3NlczwvaDI+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vY2xhc3MiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJhbGwuY2xhc3NlcyI+CisgICAgPCEtLSAoYW5jZXN0b3I6OnBhY2thZ2UpW2xhc3QoKV0gaXMgYnVnZ3kgaW4gTVNYTUwzID8gLS0+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICA8YSB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lPScnKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRwYWNrYWdlLm5hbWUsJy4nLCcvJykiLz48eHNsOnRleHQ+LzwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgQ3JlYXRlcyBhbiBodG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sIGZpbGVzIG9uCisgICAgZWFjaCBwYWNrYWdlIGV4aXN0aW5nIG9uIHRlc3RzdWl0ZXMuCisgICAgQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSBoZXJlLCBJIGRvbid0IGtub3cgeWV0IGhvdyB0byBoYW5kbGUgdW5uYW1lZCBwYWNrYWdlIDooCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzZXMiIG1vZGU9ImFsbC5wYWNrYWdlcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8aDI+PGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkhvbWU8L2E+PC9oMj4KKyAgICAgICAgICAgIDxoMj5QYWNrYWdlczwvaDI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjbGFzc1tub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjpjbGFzcy9AcGFja2FnZSldIiBtb2RlPSJhbGwucGFja2FnZXMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiIG9yZGVyPSJhc2NlbmRpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3MiIG1vZGU9ImFsbC5wYWNrYWdlcyI+CisgICAgPHRyPgorICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgPGEgaHJlZj0ie3RyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+CisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzZXMiIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIj4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keSBvbmxvYWQ9Im9wZW4oJ2FsbGNsYXNzZXMtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJykiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICA8aDM+U3VtbWFyeTwvaDM+CisgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXVkaXRlZCBjbGFzc2VzPC90aD4KKyAgICAgICAgICAgIDx0aD5SZXBvcnRlZCBjbGFzc2VzPC90aD4KKyAgICAgICAgICAgIDx0aD5WaW9sYXRpb25zPC90aD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyIGNsYXNzPSJhIj4KKyAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGF1ZGl0ZWQiLz48L3RkPgorICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVwb3J0ZWQiLz48L3RkPgorICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmlvbGF0aW9ucyIvPjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgPHRyPgorICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KKyAgICAgICAgTm90ZTogUnVsZXMgY2hlY2tlZCBoYXZlIG9yaWdpbmF0ZWQgZnJvbSBzdHlsZSBndWlkZWxpbmVzIHN1Z2dlc3RlZCBieSB0aGUgbGFuZ3VhZ2UgZGVzaWduZXJzLAorICAgICAgICBleHBlcmllbmNlIGZyb20gdGhlIEphdmEgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGFuZCBpbnNpdGUgZXhwZXJpZW5jZS4gVmlvbGF0aW9ucyBhcmUgZ2VuZXJhbGx5CisgICAgICAgIHJlcG9ydGVkIHdpdGggYSByZWZlcmVuY2UgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9qVE9DLmRvYy5odG1sIj5KYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb25zPC9hPiAoSkxTIHgueC54KQorICAgICAgICBhbmQgTWV0YW1hdGEgQXVkaXQgcnVsZXMgKHgueCkuCisgICAgICAgIFBsZWFzZSBjb25zdWx0IHRoZXNlIGRvY3VtZW50cyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB2aW9sYXRpb25zLgorICAgICAgICA8cC8+CisgICAgICAgIFJ1bGVzIGNoZWNrZWQgYWxzbyBlbmZvcmNlIGFkaGVyZW5jZSB0byA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvY29kZWNvbnYvaHRtbC9Db2RlQ29udlRPQy5kb2MuaHRtbCI+U3VuIEphdmEgY29kaW5nIGd1aWRlbGluZXM8L2E+IGluIHVzZSBhdCBKYWthcnRhLgorICAgICAgICA8cC8+CisgICAgICAgIE9uZSBzaG91bGQgbm90ZSB0aGF0IHRoZXNlIHZpb2xhdGlvbnMgZG8gbm90IG5lY2Vzc2FyeSB1bmRlcmxpbmUgZXJyb3JzIGJ1dCBzaG91bGQgYmUgdXNlZAorICAgICAgICBhcyBhbiBpbmRpY2F0aW9uIGZvciA8aT5wb3NzaWJsZTwvaT4gZXJyb3JzLiBBcyBhbHdheXMsIHVzZSB5b3VyIGJlc3QganVkZ21lbnQgYW5kIHJldmlldworICAgICAgICB0aGVtIGNhcmVmdWxseSwgaXQgbWlnaHQgc2F2ZSB5b3UgaG91cnMgb2YgZGVidWdnaW5nLgorICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorCisgICAgICAgIDxoMz5QYWNrYWdlczwvaDM+CisgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzLmF1ZGl0LmhlYWRlciIvPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNsYXNzW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OmNsYXNzL0BwYWNrYWdlKV0iPgorICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIiBvcmRlcj0iYXNjZW5kaW5nIi8+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ii8+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJ7dHJhbnNsYXRlKEBwYWNrYWdlLCcuJywnLycpfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+PC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKC9jbGFzc2VzL2NsYXNzWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdL0B2aW9sYXRpb25zKSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciIvPgorICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8SFRNTD4KKyAgICAgICAgPEhFQUQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9IRUFEPgorICAgICAgICA8Qk9EWT4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbigncGFja2FnZS1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisgICAgICAgICAgICA8aDM+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L2gzPgorCisgICAgICAgICAgICA8IS0tdGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3MubWV0cmljcy5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KKyAgICAgICAgICAgIDwvdGFibGUtLT4KKworICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudCgvY2xhc3Nlcy9jbGFzc1suL0BwYWNrYWdlID0gJG5hbWVdKSAmZ3Q7IDAiPgorICAgICAgICAgICAgICAgIDxIMz5DbGFzc2VzPC9IMz4KKyAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzLmF1ZGl0LmhlYWRlciIvPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii9jbGFzc2VzL2NsYXNzWy4vQHBhY2thZ2UgPSAkbmFtZV0iIG1vZGU9InByaW50LmF1ZGl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciIvPgorICAgICAgICA8L0JPRFk+CisgICAgPC9IVE1MPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIHRyYW5zZm9ybSBzdHJpbmcgbGlrZSBhLmIuYyB0byAuLi8uLi8uLi8KKyAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgKKy0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KKyAgICA8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRwYXRoLCcuJykiPgorICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsJy4nKSIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC94c2w6aWY+CisgICAgPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoJHBhdGgsJy4nKSkgYW5kIG5vdCgkcGF0aCA9ICcnKSI+CisgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICAgIDwveHNsOmlmPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBjcmVhdGUgdGhlIGxpbmsgdG8gdGhlIHN0eWxlc2hlZXQgYmFzZWQgb24gdGhlIHBhY2thZ2UgbmFtZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICA8TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgVElUTEU9IlN0eWxlIj48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJ3VubmFtZWQgcGFja2FnZScpIj48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGF0aCI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+PC94c2w6aWY+c3R5bGVzaGVldC5jc3M8L3hzbDphdHRyaWJ1dGU+PC9MSU5LPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gUGFnZSBIRUFERVIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgorCisgIDwhLS0gamFrYXJ0YSBsb2dvIC0tPgorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgPHRyPgorICAgIDx0ZCBjbGFzcz0iYmFubmVyY2VsbCIgcm93c3Bhbj0iMiI+CisgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLyI+CisgICAgICA8aW1nIHNyYz0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiIgYWx0PSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIiBhbGlnbj0ibGVmdCIgYm9yZGVyPSIwIi8+CisgICAgICA8L2E+CisgICAgPC90ZD4KKyAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48aDI+U291cmNlIENvZGUgQXVkaXQ8L2gyPjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cDovL3d3dy53ZWJnYWluLmNvbS9wcm9kdWN0cy9xdWFsaXR5X2FuYWx5emVyLyc+V2ViZ2FpbiBRQS9NZXRhbWF0YSBBdWRpdDwvYT4gYW5kIDxhIGhyZWY9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcnPkFudDwvYT4uPC90ZD4KKyAgICAgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgICA8aHIgc2l6ZT0iMSIvPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gUGFnZSBIRUFERVIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VGb290ZXIiPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBjbGFzcyBoZWFkZXIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzLmF1ZGl0LmhlYWRlciI+CisgICAgPHRyPgorICAgICAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+CisgICAgICAgIDx0aD5WaW9sYXRpb25zPC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gbWV0aG9kIGhlYWRlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0idmlvbGF0aW9uLmF1ZGl0LmhlYWRlciI+CisgICAgPHRyPgorICAgICAgICA8dGg+TGluZTwvdGg+CisgICAgICAgIDx0aD5NZXNzYWdlPC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBjbGFzcyBpbmZvcm1hdGlvbiAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJwcmludC5hdWRpdCI+CisgICAgPHRyPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ii8+CisgICAgICAgIDx0ZD48YSBocmVmPSJ7QG5hbWV9Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgorICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdmlvbGF0aW9ucyIvPjwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ2aW9sYXRpb24iIG1vZGU9InByaW50LmF1ZGl0Ij4KKyAgICA8dHI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZS1yb3ciLz4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGluZSIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBtZXNzYWdlIi8+PC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gYWx0ZXJuYXRlZCByb3cgc3R5bGUgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZS1yb3ciPgorPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAxIj5hPC94c2w6aWY+CisgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDAiPmI8L3hzbDppZj4KKzwveHNsOmF0dHJpYnV0ZT4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL21tZXRyaWNzLWZyYW1lcy54c2wgYi90cnVuay9zcmMvZXRjL21tZXRyaWNzLWZyYW1lcy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0NjQzYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvbW1ldHJpY3MtZnJhbWVzLnhzbApAQCAtMCwwICsxLDEwMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCisgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKyAgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbiIKKyAgeG1sbnM6cmVkaXJlY3Q9Im9yZy5hcGFjaGUueGFsYW4ubGliLlJlZGlyZWN0IgorICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieGFsYW4iCisgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJyZWRpcmVjdCI+Cis8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiLz4KKzx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKyAgQGF1dGhvciBTdGVwaGFuZSBCYWlsbGlleiA8YSBocmVmPSJtYWlsdG86c2JhaWxsaWV6QGFwYWNoZS5vcmciLz4KKyAgLS0+Cis8eHNsOnBhcmFtIG5hbWU9Im91dHB1dC5kaXIiIHNlbGVjdD0iJy4nIi8+CisKKzwhLS0gZGVmYXVsdCBtYXggdmFsdWUgZm9yIHRoZSBtZXRyaWNzIC0tPgorPHhzbDpwYXJhbSBuYW1lPSJ2Zy5tYXgiIHNlbGVjdD0iMTAiLz4KKzx4c2w6cGFyYW0gbmFtZT0ibG9jLm1heCIgc2VsZWN0PSIxMDAwIi8+Cis8eHNsOnBhcmFtIG5hbWU9ImRpdC5tYXgiIHNlbGVjdD0iMTAiLz4KKzx4c2w6cGFyYW0gbmFtZT0ibm9hLm1heCIgc2VsZWN0PSIyNTAiLz4KKzx4c2w6cGFyYW0gbmFtZT0ibnJtLm1heCIgc2VsZWN0PSI1MCIvPgorPHhzbDpwYXJhbSBuYW1lPSJubG0ubWF4IiBzZWxlY3Q9IjI1MCIvPgorPHhzbDpwYXJhbSBuYW1lPSJ3bWMubWF4IiBzZWxlY3Q9IjI1MCIvPgorPHhzbDpwYXJhbSBuYW1lPSJyZmMubWF4IiBzZWxlY3Q9IjUwIi8+Cis8eHNsOnBhcmFtIG5hbWU9ImRhYy5tYXgiIHNlbGVjdD0iMTAiLz4KKzx4c2w6cGFyYW0gbmFtZT0iZmFub3V0Lm1heCIgc2VsZWN0PSIxMCIvPgorPHhzbDpwYXJhbSBuYW1lPSJjYm8ubWF4IiBzZWxlY3Q9IjE1Ii8+Cis8eHNsOnBhcmFtIG5hbWU9Imxjb20ubWF4IiBzZWxlY3Q9IjEwIi8+Cis8eHNsOnBhcmFtIG5hbWU9Im5vY2wubWF4IiBzZWxlY3Q9IjEwIi8+CisKKworPCEtLSBjcmVhdGUgYSB0cmVlIGZyYWdtZW50IHRvIHNwZWVkIHVwIHByb2Nlc3NpbmcgLS0+Cis8eHNsOnZhcmlhYmxlIG5hbWU9ImRvY3RyZWUudmFyIj4KKyAgPHhzbDplbGVtZW50IG5hbWU9ImNsYXNzZXMiPgorICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLy9jbGFzcyI+CisgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY2xhc3MiPgorICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlIj4KKyAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iKGFuY2VzdG9yOjpwYWNrYWdlKVtsYXN0KCldL0BuYW1lIi8+CisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQCoiLz4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+CisgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5uYW1lIi8+CisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0ibWV0aG9kIi8+CisgICAgICA8L3hzbDplbGVtZW50PgorICAgIDwveHNsOmZvci1lYWNoPgorICA8L3hzbDplbGVtZW50PgorPC94c2w6dmFyaWFibGU+CisKKzx4c2w6dmFyaWFibGUgbmFtZT0iZG9jdHJlZSIgc2VsZWN0PSJ4YWxhbjpub2Rlc2V0KCRkb2N0cmVlLnZhcikiLz4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0cmljcyI+CisKKyAgPCEtLSBjcmVhdGUgdGhlIGluZGV4Lmh0bWwgLS0+CisgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2luZGV4Lmh0bWwiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIi8+CisgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgPCEtLSBjcmVhdGUgdGhlIHN0eWxlc2hlZXQuY3NzIC0tPgorICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9zdHlsZXNoZWV0LmNzcyI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+CisgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vbWV0cmljcy1yZWZlcmVuY2UuaHRtbCI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwiLz4KKyAgPC9yZWRpcmVjdDp3cml0ZT4KKworICA8IS0tIGNyZWF0ZSB0aGUgb3ZlcnZpZXctcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIi8+CisgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgPCEtLSBjcmVhdGUgdGhlIGFsbC1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgorICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1mcmFtZS5odG1sIj4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5wYWNrYWdlcyIvPgorICA8L3JlZGlyZWN0OndyaXRlPgorCisgIDwhLS0gY3JlYXRlIHRoZSBhbGwtY2xhc3Nlcy5odG1sIGF0IHRoZSByb290IC0tPgorICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGxjbGFzc2VzLWZyYW1lLmh0bWwiPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLmNsYXNzZXMiLz4KKyAgPC9yZWRpcmVjdDp3cml0ZT4KKworICA8IS0tIHByb2Nlc3MgYWxsIHBhY2thZ2VzIC0tPgorICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL3BhY2thZ2UiLz4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAbmFtZSIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4KKyAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJ3VubmFtZWQgcGFja2FnZScpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRwYWNrYWdlLm5hbWUsJy4nLCcvJykiLz48L3hzbDppZj4KKyAgICA8eHNsOmlmIHRlc3Q9IiRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJyI+LjwveHNsOmlmPgorICA8L3hzbDp2YXJpYWJsZT4KKyAgPCEtLSBjcmVhdGUgYSBjbGFzc2VzLWxpc3QuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+CisgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2UtZnJhbWUuaHRtbCI+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzc2VzLmxpc3QiLz4KKyAgPC9yZWRpcmVjdDp3cml0ZT4KKworICA8IS0tIGNyZWF0ZSBhIHBhY2thZ2Utc3VtbWFyeS5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KKyAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icGFja2FnZS5zdW1tYXJ5Ii8+CisgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgPCEtLSBmb3IgZWFjaCBjbGFzcywgY3JlYXRlcyBhIEBuYW1lLmh0bWwgLS0+CisgIDwhLS0gQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSB3aXRoIGlubmVyIGNsYXNzZXMgaGF2aW5nIHRoZSBzYW1lIG5hbWUsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gLS0+CisgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9jdHJlZS9jbGFzc2VzL2NsYXNzW0BwYWNrYWdlID0gY3VycmVudCgpL0BuYW1lXSI+CisgICAgICA8IS0tUHJvY2Vzc2luZyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNsYXNzLm5hbWUiLz48eHNsOnRleHQ+JiMxMDs8L3hzbDp0ZXh0PiAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QG5hbWV9Lmh0bWwiPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgPC94c2w6Zm9yLWVhY2g+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBsaXR0bGUgdHJpY2sgdG8gY29tcHV0ZSB0aGUgY2xhc3NuYW1lIGZvciBpbm5lciBhbmQgbm9uIGlubmVyIGNsYXNzZXMgLS0+Cis8IS0tIHRoaXMgaXMgYWxsIGluIG9uZSBsaW5lIHRvIGF2b2lkIENSTEYgaW4gdGhlIG5hbWUgLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjbGFzcyIgbW9kZT0iY2xhc3MubmFtZSI+CisgICAgPHhzbDppZiB0ZXN0PSJwYXJlbnQ6OmNsYXNzIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InBhcmVudDo6Y2xhc3MiIG1vZGU9ImNsYXNzLm5hbWUiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6aWY+PHhzbDppZiB0ZXN0PSJub3QocGFyZW50OjpjbGFzcykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmlmPgorPC94c2w6dGVtcGxhdGU+CisKKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIj4KKzxIVE1MPgorICA8SEVBRD48VElUTEU+TWV0cmljcyBSZXN1bHRzLjwvVElUTEU+PC9IRUFEPgorICA8RlJBTUVTRVQgY29scz0iMjAlLDgwJSI+CisgICAgPEZSQU1FU0VUIHJvd3M9IjMwJSw3MCUiPgorICAgICAgPEZSQU1FIHNyYz0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUxpc3RGcmFtZSIvPgorICAgICAgPEZSQU1FIHNyYz0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiBuYW1lPSJjbGFzc0xpc3RGcmFtZSIvPgorICAgIDwvRlJBTUVTRVQ+CisgICAgPEZSQU1FIHNyYz0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiBuYW1lPSJjbGFzc0ZyYW1lIi8+CisgIDwvRlJBTUVTRVQ+CisgIDxub2ZyYW1lcz4KKyAgICA8SDI+RnJhbWUgQWxlcnQ8L0gyPgorICAgIDxQPgorICAgIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgorICAgIDwvUD4KKyAgPC9ub2ZyYW1lcz4KKzwvSFRNTD4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIHRoaXMgaXMgdGhlIHN0eWxlc2hlZXQgY3NzIHRvIHVzZSBmb3IgbmVhcmx5IGV2ZXJ5dGhpbmcgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwiPgorPGh0bWw+Cis8aGVhZD4KKzxsaW5rIHRpdGxlPSJTdHlsZSIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGVzaGVldC5jc3MiLz4KKzwvaGVhZD4KKzxib2R5IHN0eWxlPSJ0ZXh0LWFsaWduOmp1c3RpZnk7Ij4KKzxoMj5NZXRyaWNzIFJlZmVyZW5jZTwvaDI+Cis8YSBocmVmPSIjVihHKSI+VihHKTwvYT4gfAorPGEgaHJlZj0iI0xPQyI+TE9DPC9hPiB8Cis8YSBocmVmPSIjRElUIj5ESVQ8L2E+IHwKKzxhIGhyZWY9IiNOT0EiPk5PQTwvYT4gfAorPGEgaHJlZj0iI05STSI+TlJNPC9hPiB8Cis8YSBocmVmPSIjTkxNIj5OTE08L2E+IHwKKzxhIGhyZWY9IiNXTUMiPldNQzwvYT4gfAorPGEgaHJlZj0iI1JGQyI+UkZDPC9hPiB8Cis8YSBocmVmPSIjREFDIj5EQUM8L2E+IHwKKzxhIGhyZWY9IiNGQU5PVVQiPkZBTk9VVDwvYT4gfAorPGEgaHJlZj0iI0NCTyI+Q0JPPC9hPiB8Cis8YSBocmVmPSIjTENPTSI+TENPTTwvYT4gfAorPGEgaHJlZj0iI05PQyI+Tk9DPC9hPgorCis8YSBuYW1lPSJWKEcpIi8+Cis8aDM+Q3ljbG9tYXRpYyBDb21wbGV4aXR5IC0gVihHKTwvaDM+CitUaGlzIG1ldHJpYyB3YXMgaW50cm9kdWNlZCBpbiB0aGUgMTk3MHMgdG8gbWVhc3VyZSB0aGUgYW1vdW50IG9mIGNvbnRyb2wKK2Zsb3cgY29tcGxleGl0eSBvciBicmFuY2hpbmcgY29tcGxleGl0eSBpbiBhIG1vZHVsZSBzdWNoIGFzIGEKK3N1YnJvdXRpbmUuIEl0IGdpdmVzIHRoZSBudW1iZXIgb2YgcGF0aHMgdGhhdCBtYXkgYmUgdGFrZW4gdGhyb3VnaCB0aGUKK2NvZGUsIGFuZCB3YXMgaW5pdGlhbGx5IGRldmVsb3BlZCB0byBnaXZlIHNvbWUgbWVhc3VyZSBvZiB0aGUgY29zdCBvZgorcHJvZHVjaW5nIGEgdGVzdCBjYXNlIGZvciB0aGUgbW9kdWxlIGJ5IGV4ZWN1dGluZyBlYWNoIHBhdGguCis8cC8+CitNZXRob2RzIHdpdGggYSBoaWdoIGN5Y2xvbWF0aWMgY29tcGxleGl0eSB0ZW5kIHRvIGJlIG1vcmUgZGlmZmljdWx0IHRvCit1bmRlcnN0YW5kIGFuZCBtYWludGFpbi4gSW4gZ2VuZXJhbCB0aGUgbW9yZSBjb21wbGV4IHRoZSBtZXRob2RzIG9mIGFuCithcHBsaWNhdGlvbiwgdGhlIG1vcmUgZGlmZmljdWx0IGl0IHdpbGwgYmUgdG8gdGVzdCBpdCwgYW5kIHRoaXMgd2lsbCBhZHZlcnNlbHkKK2FmZmVjdCBpdHMgcmVsaWFiaWxpdHkuCis8cC8+CitWKEcpIGlzIGEgbWVhc3VyZSBvZiB0aGUgY29udHJvbCBmbG93IGNvbXBsZXhpdHkgb2YgYSBtZXRob2Qgb3IKK2NvbnN0cnVjdG9yLiAgSXQgY291bnRzIHRoZSBudW1iZXIgb2YgYnJhbmNoZXMgaW4gdGhlIGJvZHkgb2YgdGhlIG1ldGhvZCwKK2RlZmluZWQgYXM6Cis8dWw+Cis8bGk+d2hpbGUgc3RhdGVtZW50czs8L2xpPgorPGxpPmlmIHN0YXRlbWVudHM7PC9saT4KKzxsaT5mb3Igc3RhdGVtZW50cy48L2xpPgorPC91bD4KKworVGhlIG1ldHJpYyBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIGNvdW50IGVhY2ggY2FzZSBvZiBhIHN3aXRjaAorc3RhdGVtZW50IGFzIHdlbGwuCisKKzxhIG5hbWU9IkxPQyIvPgorPGgzPkxpbmVzIG9mIENvZGUgLSBMT0M8L2gzPgorCitUaGlzIGlzIHBlcmhhcHMgdGhlIHNpbXBsZXN0IG9mIGFsbCB0aGUgbWV0cmljcyB0byBkZWZpbmUgYW5kIGNvbXB1dGUuCitDb3VudGluZyBsaW5lcyBoYXMgYSBsb25nIGhpc3RvcnkgYXMgYSBzb2Z0d2FyZSBtZXRyaWMgZGF0aW5nIGZyb20gYmVmb3JlCit0aGUgcmlzZSBvZiBzdHJ1Y3R1cmVkIHByb2dyYW1taW5nLCBhbmQgaXQgaXMgc3RpbGwgaW4gd2lkZXNwcmVhZCB1c2UgdG9kYXkuCitUaGUgc2l6ZSBvZiBhIG1ldGhvZCBhZmZlY3RzIHRoZSBlYXNlIHdpdGggd2hpY2ggaXQgY2FuIGJlIHVuZGVyc3Rvb2QsIGl0cworcmV1c2FiaWxpdHkgYW5kIGl0cyBtYWludGFpbmFiaWxpdHkuIFRoZXJlIGFyZSBhIHZhcmlldHkgb2Ygd2F5cyB0aGF0IHRoZSBzaXplCitjYW4gYmUgY2FsY3VsYXRlZC4gVGhlc2UgaW5jbHVkZSBjb3VudGluZyBhbGwgdGhlIGxpbmVzIG9mIGNvZGUsIHRoZSBudW1iZXIKK29mIHN0YXRlbWVudHMsIHRoZSBibGFuayBsaW5lcyBvZiBjb2RlLCB0aGUgbGluZXMgb2YgY29tbWVudGFyeSwgYW5kIHRoZQorbGluZXMgY29uc2lzdGluZyBvbmx5IG9mIHN5bnRheCBzdWNoIGFzIGJsb2NrIGRlbGltaXRlcnMuCis8cC8+CitUaGlzIG1ldHJpYyBjYW4gYWxzbyBiZSB1c2VkIGZvciBzaXppbmcgb3RoZXIgY29uc3RydWN0cyBhcyB3ZWxsLCBmb3IKK2V4YW1wbGUsIHRoZSBvdmVyYWxsIHNpemUgb2YgYSBKYXZhIGNsYXNzIG9yIHBhY2thZ2UgY2FuIGJlIG1lYXN1cmVkIGJ5Citjb3VudGluZyB0aGUgbnVtYmVyIG9mIHNvdXJjZSBsaW5lcyBpdCBjb25zaXN0cyBvZi4KKzxwLz4KK0xPQyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgYSBjb21waWxhdGlvbiB1bml0IChzb3VyY2UgZmlsZSksCitjbGFzcyBvciBpbnRlcmZhY2UsIG1ldGhvZCwgY29uc3RydWN0b3IsIG9yIGZpZWxkLiAgSXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8KK2lnbm9yZToKKzx1bD4KKzxsaT5ibGFuayBsaW5lczs8L2xpPgorPGxpPmxpbmVzIGNvbnNpc3Rpbmcgb25seSBvZiBjb21tZW50czs8L2xpPgorPGxpPmxpbmVzIGNvbnNpc3Rpbmcgb25seSBvZiBvcGVuaW5nIGFuZCBjbG9zaW5nIGJyYWNlcy48L2xpPgorPC91bD4KKworPGEgbmFtZT0iRElUIi8+Cis8aDM+RGVwdGggb2YgSW5oZXJpdGFuY2UgSGllcmFyY2h5IC0gRElUPC9oMz4KKworVGhpcyBtZXRyaWMgY2FsY3VsYXRlcyBob3cgZmFyIGRvd24gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBhIGNsYXNzIGlzCitkZWNsYXJlZC4gSW4gSmF2YSBhbGwgY2xhc3NlcyBoYXZlIGphdmEubGFuZy5PYmplY3QgYXMgdGhlaXIgdWx0aW1hdGUKK3N1cGVyY2xhc3MsIHdoaWNoIGlzIGRlZmluZWQgdG8gaGF2ZSBhIGRlcHRoIG9mIDEuIFNvIGEgY2xhc3MgdGhhdAoraW1tZWRpYXRlbHkgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGhhcyBhIG1ldHJpYyB2YWx1ZSBvZiAyOyBhbnkgb2YgaXRzCitzdWJjbGFzc2VzIHdpbGwgaGF2ZSBhIHZhbHVlIG9mIDMsIGFuZCBzbyBvbi4KKzxwLz4KK0EgY2xhc3MgdGhhdCBpcyBkZWVwIHdpdGhpbiB0aGUgdHJlZSBpbmhlcml0cyBtb3JlIG1ldGhvZHMgYW5kIHN0YXRlCit2YXJpYWJsZXMsIHRoZXJlYnkgaW5jcmVhc2luZyBpdHMgY29tcGxleGl0eSBhbmQgbWFraW5nIGl0IGRpZmZpY3VsdCB0bworcHJlZGljdCBpdHMgYmVoYXZpb3IuIEl0IGNhbiBiZSBoYXJkZXIgdG8gdW5kZXJzdGFuZCBhIHN5c3RlbSB3aXRoIG1hbnkKK2luaGVyaXRhbmNlIGxheWVycy4KKzxwLz4KK0RJVCBpcyBkZWZpbmVkIGZvciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzOgorPHVsPgorPGxpPmFsbCBpbnRlcmZhY2UgdHlwZXMgaGF2ZSBhIGRlcHRoIG9mIDE7PC9saT4KKzxsaT50aGUgY2xhc3MgamF2YS5sYW5nLk9iamVjdCBoYXMgYSBkZXB0aCBvZiAxOzwvbGk+Cis8bGk+YWxsIG90aGVyIGNsYXNzZXMgaGF2ZSBhIGRlcHRoIG9mIDEgKyB0aGUgZGVwdGggb2YgdGhlaXIgc3VwZXIgY2xhc3MuPC9saT4KKzwvdWw+CisKKzxhIG5hbWU9Ik5PQSIvPgorPGgzPk51bWJlciBvZiBBdHRyaWJ1dGVzIC0gTk9BPC9oMz4KKworVGhlIG51bWJlciBvZiBkaXN0aW5jdCBzdGF0ZSB2YXJpYWJsZXMgaW4gYSBjbGFzcyBzZXJ2ZXMgYXMgb25lIG1lYXN1cmUgb2YKK2l0cyBjb21wbGV4aXR5LiBUaGUgbW9yZSBzdGF0ZSBhIGNsYXNzIHJlcHJlc2VudHMgdGhlIG1vcmUgZGlmZmljdWx0IGl0IGlzIHRvCittYWludGFpbiBpbnZhcmlhbnRzIGZvciBpdC4gSXQgYWxzbyBoaW5kZXJzIGNvbXByZWhlbnNpYmlsaXR5IGFuZCByZXVzZS4KKzxwLz4KK0luIEphdmEsIHN0YXRlIGNhbiBiZSBleHBvc2VkIHRvIHN1YmNsYXNzZXMgdGhyb3VnaCBwcm90ZWN0ZWQgZmllbGRzLCB3aGljaAorZW50YWlscyB0aGF0IHRoZSBzdWJjbGFzcyBhbHNvIGJlIGF3YXJlIG9mIGFuZCBtYWludGFpbiBhbnkgaW52YXJpYW50cy4gVGhpcworaW50ZXJmZXJlbmNlIHdpdGggdGhlIGNsYXNzJ3MgZGF0YSBlbmNhcHN1bGF0aW9uIGNhbiBiZSBhIHNvdXJjZSBvZiBkZWZlY3RzCithbmQgaGlkZGVuIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSBzdGF0ZSB2YXJpYWJsZXMuCis8cC8+CitOT0EgaXMgZGVmaW5lZCBmb3IgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4gIEl0IGNvdW50cyB0aGUgbnVtYmVyIG9mIGZpZWxkcworZGVjbGFyZWQgaW4gdGhlIGNsYXNzIG9yIGludGVyZmFjZS4KKworPGEgbmFtZT0iTlJNIi8+Cis8aDM+TnVtYmVyIG9mIFJlbW90ZSBNZXRob2RzIC0gTlJNPC9oMz4KKworTlJNIGlzIGRlZmluZWQgZm9yIGNsYXNzZXMuICBBIHJlbW90ZSBtZXRob2QgY2FsbCBpcyBkZWZpbmVkIGFzIGFuCitpbnZvY2F0aW9uIG9mIGEgbWV0aG9kIHRoYXQgaXMgbm90IGRlY2xhcmVkIGluIGFueSBvZjoKKzx1bD4KKzxsaT50aGUgY2xhc3MgaXRzZWxmOzwvbGk+Cis8bGk+YSBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCB0aGUgY2xhc3MgZXh0ZW5kcyBvciBpbXBsZW1lbnRzOzwvbGk+Cis8bGk+YSBjbGFzcyBvciBtZXRob2QgdGhhdCBleHRlbmRzIHRoZSBjbGFzcy48L2xpPgorPC91bD4KKworVGhlIHZhbHVlIGlzIHRoZSBjb3VudCBvZiBhbGwgdGhlIHJlbW90ZSBtZXRob2QgY2FsbHMgaW4gYWxsIG9mIHRoZSBtZXRob2RzCithbmQgY29uc3RydWN0b3JzIG9mIHRoZSBjbGFzcy4KKworPGEgbmFtZT0iTkxNIi8+Cis8aDM+TnVtYmVyIG9mIExvY2FsIE1ldGhvZHMgLSBOTE08L2gzPgorCitOTE0gaXMgZGVmaW5lZCBmb3IgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4gIEEgbG9jYWwgbWV0aG9kIGlzIGRlZmluZWQgYXMgYQorbWV0aG9kIHRoYXQgaXMgZGVjbGFyZWQgaW4gdGhlIGNsYXNzIG9yIGludGVyZmFjZS4gTkxNIGNhbiBiZSBjb25maWd1cmVkIHRvCitpbmNsdWRlIHRoZSBsb2NhbCBtZXRob2RzIG9mIGFsbCBvZiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuICBNZXRob2RzIHdpdGgKK3B1YmxpYywgcHJvdGVjdGVkLCBwYWNrYWdlIGFuZCBwcml2YXRlIHZpc2liaWxpdHkgY2FuIGJlIGluZGVwZW5kZW50bHkKK2NvdW50ZWQgYnkgc2V0dGluZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisKKzxhIG5hbWU9IldNQyIvPgorPGgzPldlaWdodGVkIE1ldGhvZHMgcGVyIENsYXNzIC0gV01DPC9oMz4KKworSWYgdGhlIG51bWJlciBvZiBtZXRob2RzIGluIGEgY2xhc3MgY2FuIGJlIGRldGVybWluZWQgZHVyaW5nIHRoZSBkZXNpZ24KK2FuZCBtb2RlbGluZyBwaGFzZSBvZiBhIHByb2plY3QsIGl0IGNhbiBiZSB1c2VkIGFzIGEgcHJlZGljdG9yIG9mIGhvdworbXVjaCB0aW1lIGFuZCBlZmZvcnQgaXMgbmVlZGVkIHRvIGRldmVsb3AsIGRlYnVnIGFuZCBtYWludGFpbiBpdC4gVGhpcworbWV0cmljIGNhbiBiZSBmdXJ0aGVyIHJlZmluZWQgYnkgaW5jb3Jwb3JhdGluZyBhIHdlaWdodGluZyBmb3IgdGhlCitjb21wbGV4aXR5IG9mIGVhY2ggbWV0aG9kLiBUaGUgdXN1YWwgd2VpZ2h0aW5nIGlzIGdpdmVuIGJ5IHRoZSBjeWNsb21hdGljCitjb21wbGV4aXR5IG9mIHRoZSBtZXRob2QuCis8cC8+CitUaGUgc3ViY2xhc3NlcyBvZiBhIGNsYXNzIGluaGVyaXQgYWxsIG9mIGl0cyBwdWJsaWMgYW5kIHByb3RlY3RlZCBtZXRob2RzLAorYW5kIHBvc3NpYmx5IGl0cyBwYWNrYWdlIG1ldGhvZHMgYXMgd2VsbCwgc28gdGhlIG51bWJlciBvZiBtZXRob2RzIGEKK2NsYXNzIGhhcyBkaXJlY3RseSBpbXBhY3RzIHRoZSBjb21wbGV4aXR5IG9mIGl0cyBzdWJjbGFzc2VzLiBDbGFzc2VzIHdpdGgKK2xhcmdlIG51bWJlcnMgb2YgbWV0aG9kcyBhcmUgb2Z0ZW4gc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLAorcmVkdWNpbmcgdGhlIGFiaWxpdHkgdG8gcmV1c2UgdGhlbS4KKzxwLz4KK1RoZSBkZWZpbml0aW9uIG9mIFdNQyBpcyBiYXNlZCB1cG9uIE5MTSwgYW5kIGl0IHByb3ZpZGVzIHRoZSBzYW1lCitjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIGNvdW50aW5nIGluaGVyaXRlZCBtZXRob2RzIGFuZCBvZiB2YXJ5aW5nCit2aXNpYmlsaXR5LiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQgTkxNIGFsd2F5cyBjb3VudHMgZWFjaCBtZXRob2QgYXMgMSwKK3doZXJlYXMgV01DIHdpbGwgd2VpZ2h0IGVhY2ggbWV0aG9kLiBUaGVyZSBhcmUgdHdvIHdlaWdodGluZyBzY2hlbWVzOgorPHVsPgorPGxpPlYoRykgdGhlIGN5Y2xvbWF0aWMgY29tcGxleGl0eSBvZiB0aGUgbWV0aG9kIGlzIHVzZWQgYXMgaXRzIHdlaWdodC4KKyAgIE1ldGhvZHMgZnJvbSBjbGFzcyBmaWxlcyBhcmUgZ2l2ZW4gYSBWKEcpIG9mIDEuPC9saT4KKzxsaT50aGUgYXJpdHksIG9yIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBvZiB0aGUgbWV0aG9kIGFyZSB1c2VkIHRvCisgICBkZXRlcm1pbmUgdGhlIHdlaWdodC48L2xpPgorPC91bD4KKworPGEgbmFtZT0iUkZDIi8+Cis8aDM+UmVzcG9uc2UgRm9yIENsYXNzIC0gUkZDPC9oMz4KKworVGhlIHJlc3BvbnNlIHNldCBvZiBhIGNsYXNzIGlzIHRoZSBzZXQgb2YgYWxsIG1ldGhvZHMgdGhhdCBjYW4gYmUgaW52b2tlZCBhcworYSByZXN1bHQgb2YgYSBtZXNzYWdlIHNlbnQgdG8gYW4gb2JqZWN0IG9mIHRoZSBjbGFzcy4gVGhpcyBpbmNsdWRlcyBtZXRob2RzCitpbiB0aGUgY2xhc3MncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgYW5kIG1ldGhvZHMgdGhhdCBjYW4gYmUgaW52b2tlZCBvbgorb3RoZXIgb2JqZWN0cy4gVGhlIFJlc3BvbnNlIEZvciBDbGFzcyBtZXRyaWMgaXMgZGVmaW5lZCB0byBiZSBzaXplIG9mIHRoZQorcmVzcG9uc2Ugc2V0IGZvciB0aGUgY2xhc3MuIEEgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBsYXJnZXIgcmVzcG9uc2Ugc2V0IGlzCitjb25zaWRlcmVkIHRvIGJlIG1vcmUgY29tcGxleCB0aGFuIG9uZSB3aXRoIGEgc21hbGxlciByZXNwb25zZSBzZXQuCis8cC8+CitPbmUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgaWYgYSBtZXRob2QgY2FsbCBvbiBhIGNsYXNzIGNhbiByZXN1bHQgaW4gYSBsYXJnZQorbnVtYmVyIG9mIGRpZmZlcmVudCBtZXRob2QgY2FsbHMgb24gdGhlIHRhcmdldCBhbmQgb3RoZXIgY2xhc3NlcywgdGhlbiBpdAorY2FuIGJlIGhhcmRlciB0byB0ZXN0IHRoZSBiZWhhdmlvciBvZiB0aGUgY2xhc3MgYW5kIGRlYnVnIHByb2JsZW1zLiBJdCB3aWxsCit0eXBpY2FsbHkgcmVxdWlyZSBhIGRlZXBlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBwb3RlbnRpYWwgaW50ZXJhY3Rpb25zIHRoYXQKK29iamVjdHMgb2YgdGhlIGNsYXNzIGNhbiBoYXZlIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KKzxwLz4KK1JGQyBpcyBkZWZpbmVkIGFzIHRoZSBzdW0gb2YgTkxNIGFuZCBOUk0gZm9yIHRoZSBjbGFzcy4gIFRoZSBsb2NhbCBtZXRob2RzCitpbmNsdWRlIGFsbCBvZiB0aGUgcHVibGljLCBwcm90ZWN0ZWQsIHBhY2thZ2UgYW5kIHByaXZhdGUgbWV0aG9kcywgYnV0IG5vdAorbWV0aG9kcyBkZWNsYXJlZCBvbmx5IGluIGEgc3VwZXJjbGFzcy4KKworPGEgbmFtZT0iREFDIi8+Cis8aDM+RGF0YSBBYnN0cmFjdGlvbiBDb3VwbGluZyAtIERBQzwvaDM+CisKK0RBQyBpcyBkZWZpbmVkIGZvciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLiAgSXQgY291bnRzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlCit0eXBlcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBmaWVsZCBkZWNsYXJhdGlvbnMgb2YgdGhlIGNsYXNzIG9yIGludGVyZmFjZS4gIFRoZQorY29tcG9uZW50IHR5cGVzIG9mIGFycmF5cyBhcmUgYWxzbyBjb3VudGVkLiAgQW55IGZpZWxkIHdpdGggYSB0eXBlIHRoYXQgaXMKK2VpdGhlciBhIHN1cGVydHlwZSBvciBhIHN1YnR5cGUgb2YgdGhlIGNsYXNzIGlzIG5vdCBjb3VudGVkLgorCis8YSBuYW1lPSJGQU5PVVQiLz4KKzxoMz5GYW4gT3V0IC0gRkFOT1VUPC9oMz4KKworRkFOT1VUIGlzIGRlZmluZWQgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXMsIGNvbnN0cnVjdG9ycyBhbmQgbWV0aG9kcy4gSXQKK2NvdW50cyB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluOgorPHVsPgorPGxpPmZpZWxkIGRlY2xhcmF0aW9uczs8L2xpPgorPGxpPmZvcm1hbCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHlwZXM7PC9saT4KKzxsaT50aHJvd3MgZGVjbGFyYXRpb25zOzwvbGk+Cis8bGk+bG9jYWwgdmFyaWFibGVzLjwvbGk+Cis8L3VsPgorCitUaGUgY29tcG9uZW50IHR5cGVzIG9mIGFycmF5cyBhcmUgYWxzbyBjb3VudGVkLiBBbnkgdHlwZSB0aGF0IGlzIGVpdGhlciBhCitzdXBlcnR5cGUgb3IgYSBzdWJ0eXBlIG9mIHRoZSBjbGFzcyBpcyBub3QgY291bnRlZC4KKworPGEgbmFtZT0iQ0JPIi8+Cis8aDM+Q291cGxpbmcgQmV0d2VlbiBPYmplY3RzIC0gQ0JPPC9oMz4KKworV2hlbiBvbmUgb2JqZWN0IG9yIGNsYXNzIHVzZXMgYW5vdGhlciBvYmplY3Qgb3IgY2xhc3MgdGhleSBhcmUgc2FpZCB0byBiZQorY291cGxlZC4gT25lIG1ham9yIHNvdXJjZSBvZiBjb3VwbGluZyBpcyB0aGF0IGJldHdlZW4gYSBzdXBlcmNsYXNzIGFuZCBhCitzdWJjbGFzcy4gQSBjb3VwbGluZyBpcyBhbHNvIGludHJvZHVjZWQgd2hlbiBhIG1ldGhvZCBvciBmaWVsZCBpbiBhbm90aGVyCitjbGFzcyBpcyBhY2Nlc3NlZCwgb3Igd2hlbiBhbiBvYmplY3Qgb2YgYW5vdGhlciBjbGFzcyBpcyBwYXNzZWQgaW50byBvciBvdXQKK29mIGEgbWV0aG9kIGludm9jYXRpb24uIENvdXBsaW5nIEJldHdlZW4gT2JqZWN0cyBpcyBhIG1lYXN1cmUgb2YgdGhlCitub24taW5oZXJpdGFuY2UgY291cGxpbmcgYmV0d2VlbiB0d28gb2JqZWN0cy4KKzxwLz4KK0EgaGlnaCB2YWx1ZSBvZiBjb3VwbGluZyByZWR1Y2VzIHRoZSBtb2R1bGFyaXR5IG9mIHRoZSBjbGFzcyBhbmQgbWFrZXMKK3JldXNlIG1vcmUgZGlmZmljdWx0LiBUaGUgbW9yZSBpbmRlcGVuZGVudCBhIGNsYXNzIGlzIHRoZSBtb3JlIGxpa2VseSBpdCBpcwordGhhdCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHJldXNlIGl0IGluIGFub3RoZXIgcGFydCBvZiB0aGUgc3lzdGVtLiBXaGVuIGEKK2NsYXNzIGlzIGNvdXBsZWQgdG8gYW5vdGhlciBjbGFzcyBpdCBiZWNvbWVzIHNlbnNpdGl2ZSB0byBjaGFuZ2VzIGluIHRoYXQKK2NsYXNzLCB0aGVyZWJ5IG1ha2luZyBtYWludGVuYW5jZSBmb3IgZGlmZmljdWx0LiBJbiBhZGRpdGlvbiwgYSBjbGFzcyB0aGF0IGlzCitvdmVybHkgZGVwZW5kZW50IG9uIG90aGVyIGNsYXNzZXMgY2FuIGJlIGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kIGFuZCB0ZXN0IGluCitpc29sYXRpb24uCis8cC8+CitDQk8gaXMgZGVmaW5lZCBmb3IgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcywgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzLiBJdAorY291bnRzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW46Cis8dWw+Cis8bGk+ZmllbGQgZGVjbGFyYXRpb25zPC9saT4KKzxsaT5mb3JtYWwgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzPC9saT4KKzxsaT50aHJvd3MgZGVjbGFyYXRpb25zPC9saT4KKzxsaT5sb2NhbCB2YXJpYWJsZXM8L2xpPgorPC91bD4KKworSXQgYWxzbyBjb3VudHM6Cis8dWw+Cis8bGk+dHlwZXMgZnJvbSB3aGljaCBmaWVsZCBhbmQgbWV0aG9kIHNlbGVjdGlvbnMgYXJlIG1hZGU8L2xpPgorPC91bD4KKworVGhlIGNvbXBvbmVudCB0eXBlcyBvZiBhcnJheXMgYXJlIGFsc28gY291bnRlZC4gQW55IHR5cGUgdGhhdCBpcyBlaXRoZXIgYQorc3VwZXJ0eXBlIG9yIGEgc3VidHlwZSBvZiB0aGUgY2xhc3MgaXMgbm90IGNvdW50ZWQuCisKKzxhIG5hbWU9IkxDT00iLz4KKzxoMz5MYWNrIG9mIENvaGVzaW9uIE9mIE1ldGhvZHMgLSBMQ09NPC9oMz4KKworVGhlIGNvaGVzaW9uIG9mIGEgY2xhc3MgaXMgdGhlIGRlZ3JlZSB0byB3aGljaCBpdHMgbWV0aG9kcyBhcmUgcmVsYXRlZCB0bworZWFjaCBvdGhlci4gSXQgaXMgZGV0ZXJtaW5lZCBieSBleGFtaW5pbmcgdGhlIHBhdHRlcm4gb2Ygc3RhdGUgdmFyaWFibGUKK2FjY2Vzc2VzIHdpdGhpbiB0aGUgc2V0IG9mIG1ldGhvZHMuIElmIGFsbCB0aGUgbWV0aG9kcyBhY2Nlc3MgdGhlIHNhbWUgc3RhdGUKK3ZhcmlhYmxlcyB0aGVuIHRoZXkgaGF2ZSBoaWdoIGNvaGVzaW9uOyBpZiB0aGV5IGFjY2VzcyBkaXNqb2ludCBzZXRzIG9mCit2YXJpYWJsZXMgdGhlbiB0aGUgY29oZXNpb24gaXMgbG93LiBBbiBleHRyZW1lIGV4YW1wbGUgb2YgbG93IGNvaGVzaW9uCit3b3VsZCBiZSBpZiBub25lIG9mIHRoZSBtZXRob2RzIGFjY2Vzc2VkIGFueSBvZiB0aGUgc3RhdGUgdmFyaWFibGVzLgorCitJZiBhIGNsYXNzIGV4aGliaXRzIGxvdyBtZXRob2QgY29oZXNpb24gaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRlc2lnbiBvZiB0aGUKK2NsYXNzIGhhcyBwcm9iYWJseSBiZWVuIHBhcnRpdGlvbmVkIGluY29ycmVjdGx5LCBhbmQgY291bGQgYmVuZWZpdCBieSBiZWluZworc3BsaXQgaW50byBtb3JlIGNsYXNzZXMgd2l0aCBpbmRpdmlkdWFsbHkgaGlnaGVyIGNvaGVzaW9uLiBPbiB0aGUgb3RoZXIKK2hhbmQsIGEgaGlnaCB2YWx1ZSBvZiBjb2hlc2lvbiAoYSBsb3cgbGFjayBvZiBjb2hlc2lvbikgaW1wbGllcyB0aGF0IHRoZQorY2xhc3MgaXMgd2VsbCBkZXNpZ25lZC4gQSBjb2hlc2l2ZSBjbGFzcyB3aWxsIHRlbmQgdG8gcHJvdmlkZSBhIGhpZ2ggZGVncmVlCitvZiBlbmNhcHN1bGF0aW9uLCB3aGVyZWFzIGEgbGFjayBvZiBjb2hlc2lvbiBkZWNyZWFzZXMgZW5jYXBzdWxhdGlvbiBhbmQKK2luY3JlYXNlcyBjb21wbGV4aXR5LgorPHAvPgorQW5vdGhlciBmb3JtIG9mIGNvaGVzaW9uIHRoYXQgaXMgdXNlZnVsIGZvciBKYXZhIHByb2dyYW1zIGlzIGNvaGVzaW9uCitiZXR3ZWVuIG5lc3RlZCBhbmQgZW5jbG9zaW5nIGNsYXNzZXMuIEEgbmVzdGVkIGNsYXNzIHRoYXQgaGFzIHZlcnkgbG93Citjb2hlc2lvbiB3aXRoIGl0cyBlbmNsb3NpbmcgY2xhc3Mgd291bGQgcHJvYmFibHkgYmV0dGVyIGRlc2lnbmVkIGFzIGEgcGVlcgorY2xhc3MgcmF0aGVyIHRoYW4gYSBuZXN0ZWQgY2xhc3MuCis8cC8+CitMQ09NIGlzIGRlZmluZWQgZm9yIGNsYXNzZXMuIE9wZXJhdGlvbmFsbHksIExDT00gdGFrZXMgZWFjaCBwYWlyIG9mCittZXRob2RzIGluIHRoZSBjbGFzcyBhbmQgZGV0ZXJtaW5lcyB0aGUgc2V0IG9mIGZpZWxkcyB0aGV5IGVhY2ggYWNjZXNzLiBJZgordGhleSBoYXZlIGRpc2pvaW50IHNldHMgb2YgZmllbGQgYWNjZXNzZXMgaW5jcmVhc2UgdGhlIGNvdW50IFAgYnkgb25lLiBJZiB0aGV5CitzaGFyZSBhdCBsZWFzdCBvbmUgZmllbGQgYWNjZXNzIHRoZW4gaW5jcmVhc2UgUSBieSBvbmUuIEFmdGVyIGNvbnNpZGVyaW5nCitlYWNoIHBhaXIgb2YgbWV0aG9kcywKK0xDT00gPSAoUCA+IFEpID8gKFAgLSBRKSA6IDAKKzxwLz4KK0luZGlyZWN0IGFjY2VzcyB0byBmaWVsZHMgdmlhIGxvY2FsIG1ldGhvZHMgY2FuIGJlIGNvbnNpZGVyZWQgYnkgc2V0dGluZyBhCittZXRyaWMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuCisKKzxhIG5hbWU9Ik5PQyIvPgorPGgzPk51bWJlciBPZiBDbGFzc2VzIC0gTk9DPC9oMz4KKworVGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgc3lzdGVtIGNhbiBiZSBlc3RpbWF0ZWQgYnkgY2FsY3VsYXRpbmcgdGhlIG51bWJlcgorb2YgY2xhc3NlcyBpdCBjb250YWlucy4gQSBsYXJnZSBzeXN0ZW0gd2l0aCBtb3JlIGNsYXNzZXMgaXMgbW9yZSBjb21wbGV4Cit0aGFuIGEgc21hbGxlciBvbmUgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgYmV0d2Vlbgorb2JqZWN0cyBpcyBoaWdoZXIuIFRoaXMgcmVkdWNlcyB0aGUgY29tcHJlaGVuc2liaWxpdHkgb2YgdGhlIHN5c3RlbSB3aGljaAoraW4gdHVybiBtYWtlcyBpdCBoYXJkZXIgdG8gdGVzdCwgZGVidWcgYW5kIG1haW50YWluLgorPHAvPgorSWYgdGhlIG51bWJlciBvZiBjbGFzc2VzIGluIHRoZSBzeXN0ZW0gY2FuIGJlIHByb2plY3RlZCBkdXJpbmcgdGhlIGluaXRpYWwKK2Rlc2lnbiBwaGFzZSBvZiB0aGUgcHJvamVjdCBpdCBjYW4gc2VydmUgYXMgYSBiYXNlIGZvciBlc3RpbWF0aW5nIHRoZSB0b3RhbAorZWZmb3J0IGFuZCBjb3N0IG9mIGRldmVsb3BpbmcsIGRlYnVnZ2luZyBhbmQgbWFpbnRhaW5pbmcgdGhlIHN5c3RlbS4KKzxwLz4KK1RoZSBOT0MgbWV0cmljIGNhbiBhbHNvIHVzZWZ1bGx5IGJlIGFwcGxpZWQgYXQgdGhlIHBhY2thZ2UgYW5kIGNsYXNzIGxldmVsCithcyB3ZWxsIGFzIHRoZSB0b3RhbCBzeXN0ZW0uCis8cC8+CitOT0NMIGlzIGRlZmluZWQgZm9yIGNsYXNzIGFuZCBpbnRlcmZhY2VzLiBJdCBjb3VudHMgdGhlIG51bWJlciBvZiBjbGFzc2VzIG9yCitpbnRlcmZhY2VzIHRoYXQgYXJlIGRlY2xhcmVkLiBUaGlzIGlzIHVzdWFsbHkgMSwgYnV0IG5lc3RlZCBjbGFzcyBkZWNsYXJhdGlvbnMKK3dpbGwgaW5jcmVhc2UgdGhpcyBudW1iZXIuCis8L2JvZHk+Cis8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+CisgICAgLmJhbm5lcmNlbGwgeworICAgICAgYm9yZGVyOiAwcHg7CisgICAgICBwYWRkaW5nOiAwcHg7CisgICAgfQorICAgIGJvZHkgeworICAgICAgbWFyZ2luLWxlZnQ6IDEwOworICAgICAgbWFyZ2luLXJpZ2h0OiAxMDsKKyAgICAgIGZvbnQ6bm9ybWFsIDgwJSBhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWY7CisgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7CisgICAgICBjb2xvcjojMDAwMDAwOworICAgIH0KKyAgICAuYSB0ZCB7CisgICAgICBiYWNrZ3JvdW5kOiAjZWZlZmVmOworICAgIH0KKyAgICAuYiB0ZCB7CisgICAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgIH0KKyAgICB0aCwgdGQgeworICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgfQorICAgIHRoIHsKKyAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7CisgICAgICBiYWNrZ3JvdW5kOiAjY2NjOworICAgICAgY29sb3I6IGJsYWNrOworICAgIH0KKyAgICB0YWJsZSwgdGgsIHRkIHsKKyAgICAgIGZvbnQtc2l6ZToxMDAlOworICAgICAgYm9yZGVyOiBub25lCisgICAgfQorICAgIHRhYmxlLmxvZyB0ciB0ZCwgdHIgdGggeworCisgICAgfQorICAgIGgyIHsKKyAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7CisgICAgICBmb250LXNpemU6MTQwJTsKKyAgICAgIG1hcmdpbi1ib3R0b206IDU7CisgICAgfQorICAgIGgzIHsKKyAgICAgIGZvbnQtc2l6ZToxMDAlOworICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsKKyAgICAgIGJhY2tncm91bmQ6ICM1MjVENzY7CisgICAgICBjb2xvcjogd2hpdGU7CisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgICBwYWRkaW5nOiA1cHg7CisgICAgICBtYXJnaW4tcmlnaHQ6IDJweDsKKyAgICAgIG1hcmdpbi1sZWZ0OiAycHg7CisgICAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIH0KKyAgICAuRXJyb3IgeworICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cmVkOworICAgIH0KKworPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gcHJpbnQgdGhlIG1ldHJpY3Mgb2YgdGhlIGNsYXNzIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3MiIG1vZGU9ImNsYXNzLmRldGFpbHMiPgorICA8IS0teHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIoYW5jZXN0b3I6OnBhY2thZ2UpW2xhc3QoKV0vQG5hbWUiLy0tPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICA8SFRNTD4KKyAgICA8SEVBRD4KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+CisgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvSEVBRD4KKyAgICA8Qk9EWT4KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisKKyAgICAgIDxIMz5DbGFzcyA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJ3VubmFtZWQgcGFja2FnZScpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPi48L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L0gzPgorICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbGwubWV0cmljcy5oZWFkZXIiLz4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcmludC5tZXRyaWNzIi8+CisgICAgICA8L3RhYmxlPgorCisgICAgICA8SDM+TWV0aG9kczwvSDM+CisgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1ldGhvZC5tZXRyaWNzLmhlYWRlciIvPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1ldGhvZCIgbW9kZT0icHJpbnQubWV0cmljcyIvPgorICAgICAgPC90YWJsZT4KKworICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VGb290ZXIiLz4KKyAgICA8L0JPRFk+CisgIDwvSFRNTD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gbGlzdCBvZiBjbGFzc2VzIGluIGEgcGFja2FnZSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhY2thZ2UiIG1vZGU9ImNsYXNzZXMubGlzdCI+CisgIDxIVE1MPgorICAgIDxIRUFEPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvSEVBRD4KKyAgICA8Qk9EWT4KKyAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgPEgyPjxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L0gyPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICA8L3RhYmxlPgorCisgICAgICA8SDI+Q2xhc3NlczwvSDI+CisgICAgICA8VEFCTEUgV0lEVEg9IjEwMCUiPgorICAgICAgICA8IS0tIHhhbGFuLW5vZGVzZXQ6bm9kZXNldCBmb3IgWGFsYW4gMS4yLjIgLS0+CisgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRvY3RyZWUvY2xhc3Nlcy9jbGFzc1tAcGFja2FnZSA9IGN1cnJlbnQoKS9AbmFtZV0iPgorICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgPGEgaHJlZj0ie0BuYW1lfS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgPC9UQUJMRT4KKyAgICA8L0JPRFk+CisgIDwvSFRNTD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0KKyAgQ3JlYXRlcyBhbiBhbGwtY2xhc3Nlcy5odG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sCisgIG9uIGVhY2ggY2xhc3MuCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1ldHJpY3MiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJyciLz4KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorICAgICAgPGgyPkNsYXNzZXM8L2gyPgorICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRvY3RyZWUvY2xhc3Nlcy9jbGFzcyI+CisgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLmNsYXNzZXMiLz4KKyAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgIDwvdGFibGU+CisgICAgPC9ib2R5PgorICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2xhc3MiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2xhc3MubmFtZSIgc2VsZWN0PSJAbmFtZSIvPgorICA8dHI+CisgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgIDxhIHRhcmdldD0iY2xhc3NGcmFtZSI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgorICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWU9J3VubmFtZWQgcGFja2FnZScpIj4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJHBhY2thZ2UubmFtZSwnLicsJy8nKSIvPjx4c2w6dGV4dD4vPC94c2w6dGV4dD4KKyAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNsYXNzLm5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgorICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPgorICAgICAgPC9hPgorICAgIDwvdGQ+CisgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLQorICBDcmVhdGVzIGFuIGh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgZmlsZXMgb24KKyAgZWFjaCBwYWNrYWdlIGV4aXN0aW5nIG9uIHRlc3RzdWl0ZXMuCisgIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KAorLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRyaWNzIiBtb2RlPSJhbGwucGFja2FnZXMiPgorICA8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIuL3BhY2thZ2UvQG5hbWUiLz4KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorICAgICAgPGgyPjxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Ib21lPC9hPjwvaDI+CisgICAgICA8aDI+UGFja2FnZXM8L2gyPgorICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vcGFja2FnZVtub3QoLi9AbmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKV0iIG1vZGU9ImFsbC5wYWNrYWdlcyI+CisgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYWNrYWdlIiBtb2RlPSJhbGwucGFja2FnZXMiPgorICA8dHI+CisgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgIDxhIGhyZWY9Int0cmFuc2xhdGUoQG5hbWUsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgIDwvYT4KKyAgICA8L3RkPgorICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0cmljcyIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiPgorICA8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSInJyIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHkgb25sb2FkPSJvcGVuKCdhbGxjbGFzc2VzLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgIDxoMz5TdW1tYXJ5PC9oMz4KKyAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNWKEcpIj5WKEcpPC9hPjwvdGg+CisgICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNMT0MiPkxPQzwvYT48L3RoPgorICAgICAgPHRoPjxhIGhyZWY9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwjRElUIj5ESVQ8L2E+PC90aD4KKyAgICAgIDx0aD48YSBocmVmPSJtZXRyaWNzLXJlZmVyZW5jZS5odG1sI05PQSI+Tk9BPC9hPjwvdGg+CisgICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNOUk0iPk5STTwvYT48L3RoPgorICAgICAgPHRoPjxhIGhyZWY9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwjTkxNIj5OTE08L2E+PC90aD4KKyAgICAgIDx0aD48YSBocmVmPSJtZXRyaWNzLXJlZmVyZW5jZS5odG1sI1dNQyI+V01DPC9hPjwvdGg+CisgICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNSRkMiPlJGQzwvYT48L3RoPgorICAgICAgPHRoPjxhIGhyZWY9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwjREFDIj5EQUM8L2E+PC90aD4KKyAgICAgIDx0aD48YSBocmVmPSJtZXRyaWNzLXJlZmVyZW5jZS5odG1sI0ZBTk9VVCI+RkFOT1VUPC9hPjwvdGg+CisgICAgICA8dGg+PGEgaHJlZj0ibWV0cmljcy1yZWZlcmVuY2UuaHRtbCNDQk8iPkNCTzwvYT48L3RoPgorICAgICAgPHRoPjxhIGhyZWY9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwjTENPTSI+TENPTTwvYT48L3RoPgorICAgICAgPHRoPjxhIGhyZWY9Im1ldHJpY3MtcmVmZXJlbmNlLmh0bWwjTk9DTCI+Tk9DTDwvYT48L3RoPgorICAgIDwvdHI+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcmludC5tZXRyaWNzIi8+CisgICAgPC90YWJsZT4KKyAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPgorICAgIE5vdGU6IE1ldHJpY3MgZXZhbHVhdGUgdGhlIHF1YWxpdHkgb2Ygc29mdHdhcmUgYnkgYW5hbHl6aW5nIHRoZSBwcm9ncmFtIHNvdXJjZSBhbmQgcXVhbnRpZnlpbmcKKyAgICB2YXJpb3VzIGtpbmQgb2YgY29tcGxleGl0eS4gQ29tcGxleGl0eSBpcyBhIGNvbW1vbiBzb3VyY2Ugb2YgcHJvYmxlbXMgYW5kIGRlZmVjdHMgaW4gc29mdHdhcmUuCisgICAgSGlnaCBjb21wbGV4aXR5IG1ha2VzIGl0IG1vcmUgZGlmZmljdWx0IHRvIGRldmVsb3AsIHVuZGVyc3RhbmQsIG1haW50YWluLCBleHRlbmQsIHRlc3QgYW5kIGRlYnVnCisgICAgYSBwcm9ncmFtLgorICAgIDxwLz4KKyAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgbWV0cmljcyBpcyB0byBmb2N1cyB5b3VyIGF0dGVudGlvbiBvbiB0aG9zZSBwYXJ0cyBvZiBjb2RlIHRoYXQgcG90ZW50aWFsbHkgYXJlCisgICAgY29tcGxleGl0eSBob3Qgc3BvdHMuIE9uY2UgdGhlIGNvbXBsZXggYXJlYXMgeW91ciBwcm9ncmFtIGhhdmUgYmVlbiB1bmNvdmVyZWQsIHlvdSBjYW4gdGFrZSByZW1lZGlhbAorICAgIGFjdGlvbnMuCisgICAgRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgbWV0cmljcyBhbmQgdGhlaXIgbWVhbmluZywgcGxlYXNlIGNvbnN1bHQKKyAgICBNZXRhbWF0YSBNZXRyaWNzIG1hbnVhbC4KKyAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPC90YWJsZT4KKworICAgIDxoMz5QYWNrYWdlczwvaDM+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWxsLm1ldHJpY3MuaGVhZGVyIi8+CisgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi8vcGFja2FnZVtub3QoQG5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJyldIj4KKyAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiIG9yZGVyPSJhc2NlbmRpbmciLz4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcmludC5tZXRyaWNzIi8+CisgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3RhYmxlPgorICAgIDwhLS0gQGJ1ZyB0aGVyZSBjb3VsZCBzb21lIGNsYXNzZXMgYXQgdGhpcyBsZXZlbCAoY2xhc3NlcyBpbiB1bm5hbWVkIHBhY2thZ2UpIC0tPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlRm9vdGVyIi8+CisgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYWNrYWdlIiBtb2RlPSJwYWNrYWdlLnN1bW1hcnkiPgorICA8SFRNTD4KKyAgICA8SEVBRD4KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L0hFQUQ+CisgICAgPGJvZHkgb25sb2FkPSJvcGVuKCdwYWNrYWdlLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpIj4KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisgICAgICA8IS0tIGNyZWF0ZSBhbiBhbmNob3IgdG8gdGhpcyBwYWNrYWdlIG5hbWUgLS0+CisgICAgICA8aDM+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2gzPgorCisgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsbC5tZXRyaWNzLmhlYWRlciIvPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KKyAgICAgIDwvdGFibGU+CisKKyAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPgorICAgICAgTm90ZTogTWV0cmljcyBldmFsdWF0ZSB0aGUgcXVhbGl0eSBvZiBzb2Z0d2FyZSBieSBhbmFseXppbmcgdGhlIHByb2dyYW0gc291cmNlIGFuZCBxdWFudGlmeWluZworICAgICAgdmFyaW91cyBraW5kIG9mIGNvbXBsZXhpdHkuIENvbXBsZXhpdHkgaXMgYSBjb21tb24gc291cmNlIG9mIHByb2JsZW1zIGFuZCBkZWZlY3RzIGluIHNvZnR3YXJlLgorICAgICAgSGlnaCBjb21wbGV4aXR5IG1ha2VzIGl0IG1vcmUgZGlmZmljdWx0IHRvIGRldmVsb3AsIHVuZGVyc3RhbmQsIG1haW50YWluLCBleHRlbmQsIHRlc3QgYW5kIGRlYnVnCisgICAgICBhIHByb2dyYW0uCisgICAgICA8cC8+CisgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgbWV0cmljcyBpcyB0byBmb2N1cyB5b3VyIGF0dGVudGlvbiBvbiB0aG9zZSBwYXJ0cyBvZiBjb2RlIHRoYXQgcG90ZW50aWFsbHkgYXJlCisgICAgICBjb21wbGV4aXR5IGhvdCBzcG90cy4gT25jZSB0aGUgY29tcGxleCBhcmVhcyB5b3VyIHByb2dyYW0gaGF2ZSBiZWVuIHVuY292ZXJlZCwgeW91IGNhbiB0YWtlIHJlbWVkaWFsCisgICAgICBhY3Rpb25zLgorICAgICAgRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgbWV0cmljcyBhbmQgdGhlaXIgbWVhbmluZywgcGxlYXNlIGNvbnN1bHQKKyAgICAgIE1ldGFtYXRhIE1ldHJpY3MgbWFudWFsLgorICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8L3RhYmxlPgorCisgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNsYXNzZXMtaW4tcGFja2FnZSIgc2VsZWN0PSIkZG9jdHJlZS9jbGFzc2VzL2NsYXNzW0BwYWNrYWdlID0gY3VycmVudCgpL0BuYW1lXSIvPgorICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudCgkY2xhc3Nlcy1pbi1wYWNrYWdlKSAmZ3Q7IDAiPgorICAgICAgICA8SDM+Q2xhc3NlczwvSDM+CisgICAgICAgIDx0YWJsZSBjbGFzcz0ibG9nIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9IjEwMCUiPgorICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbGwubWV0cmljcy5oZWFkZXIiLz4KKyAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNsYXNzZXMtaW4tcGFja2FnZSI+CisgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KKyAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwveHNsOmlmPgorCisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciIvPgorICAgIDwvYm9keT4KKyAgPC9IVE1MPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIHRyYW5zZm9ybSBzdHJpbmcgbGlrZSBhLmIuYyB0byAuLi8uLi8uLi8KKyAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgKKy0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgPHhzbDpwYXJhbSBuYW1lPSJwYXRoIi8+CisgIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoJHBhdGgsJy4nKSI+CisgICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsJy4nKSIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgPC94c2w6aWY+CisgIDx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKCRwYXRoLCcuJykpIGFuZCBub3QoJHBhdGggPSAnJykiPgorICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICA8L3hzbDppZj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gY3JlYXRlIHRoZSBsaW5rIHRvIHRoZSBzdHlsZXNoZWV0IGJhc2VkIG9uIHRoZSBwYWNrYWdlIG5hbWUgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICA8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICA8TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgVElUTEU9IlN0eWxlIj48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJ3VubmFtZWQgcGFja2FnZScpIj48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGF0aCI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+PC94c2w6aWY+c3R5bGVzaGVldC5jc3M8L3hzbDphdHRyaWJ1dGU+PC9MSU5LPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBQYWdlIEhlYWRlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciI+CisKKyAgPCEtLSBqYWthcnRhIGxvZ28gLS0+CisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgorICA8dHI+CisgICAgPHRkIGNsYXNzPSJiYW5uZXJjZWxsIiByb3dzcGFuPSIyIj4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvIj4KKyAgICAgIDxpbWcgc3JjPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2ltYWdlcy9qYWthcnRhLWxvZ28uZ2lmIiBhbHQ9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmciIGFsaWduPSJsZWZ0IiBib3JkZXI9IjAiLz4KKyAgICAgIDwvYT4KKyAgICA8L3RkPgorICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+PGgyPlNvdXJjZSBDb2RlIE1ldHJpY3M8L2gyPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cDovL3d3dy53ZWJnYWluLmNvbS9wcm9kdWN0cy9xdWFsaXR5X2FuYWx5emVyLyc+V2ViZ2FpbiBRQS9NZXRhbWF0YSBNZXRyaWNzPC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZyc+QW50PC9hPi48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgIDxociBzaXplPSIxIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBQYWdlIEZvb3RlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUZvb3RlciI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBjbGFzcyBoZWFkZXIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9ImFsbC5tZXRyaWNzLmhlYWRlciI+CisgIDx0cj4KKyAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+CisgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5WKEcpPC90aD4KKyAgICA8dGg+TE9DPC90aD4KKyAgICA8dGg+RElUPC90aD4KKyAgICA8dGg+Tk9BPC90aD4KKyAgICA8dGg+TlJNPC90aD4KKyAgICA8dGg+TkxNPC90aD4KKyAgICA8dGg+V01DPC90aD4KKyAgICA8dGg+UkZDPC90aD4KKyAgICA8dGg+REFDPC90aD4KKyAgICA8dGg+RkFOT1VUPC90aD4KKyAgICA8dGg+Q0JPPC90aD4KKyAgICA8dGg+TENPTTwvdGg+CisgICAgPHRoPk5PQ0w8L3RoPgorICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gbWV0aG9kIGhlYWRlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0ibWV0aG9kLm1ldHJpY3MuaGVhZGVyIj4KKyAgPHRyPgorICAgIDx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KKyAgICA8dGggbm93cmFwPSJub3dyYXAiPlYoRyk8L3RoPgorICAgIDx0aD5MT0M8L3RoPgorICAgIDx0aD5GQU5PVVQ8L3RoPgorICAgIDx0aD5DQk88L3RoPgorICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gbWV0aG9kIGluZm9ybWF0aW9uIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIiBtb2RlPSJwcmludC5tZXRyaWNzIj4KKyAgPHRyPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ii8+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQG5hbWUiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB2ZyIvPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGxvYyIvPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGZhbm91dCIvPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGNibyIvPjwvdGQ+CisgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBjbGFzcyBpbmZvcm1hdGlvbiAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIiBtb2RlPSJwcmludC5tZXRyaWNzIj4KKyAgPHRyPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ii8+CisgICAgPHRkPjxhIGhyZWY9IntAbmFtZX0uaHRtbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHZnIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbG9jIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZGl0Ii8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbm9hIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbnJtIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbmxtIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAd21jIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAcmZjIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZGFjIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZmFub3V0Ii8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAY2JvIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbGNvbSIvPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQG5vY2wiLz48L3RkPgorICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGV8cGFja2FnZSIgbW9kZT0icHJpbnQubWV0cmljcyI+CisgIDx0cj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyIvPgorICAgIDx0ZD4KKyAgICA8YSBocmVmPSJ7dHJhbnNsYXRlKEBuYW1lLCcuJywnLycpfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICA8L2E+CisgICAgPC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdmciLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBsb2MiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBkaXQiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBub2EiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBucm0iLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBubG0iLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB3bWMiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkByZmMiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBkYWMiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYW5vdXQiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBjYm8iLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBsY29tIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAbm9jbCIvPjwvdGQ+CisgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0cmljcyIgbW9kZT0icHJpbnQubWV0cmljcyI+CisgIDx0cj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlLXJvdyIvPgorICAgICAgPCEtLSB0aGUgZ2xvYmFsIG1ldHJpY3MgaXMgdGhlIHRvcCBwYWNrYWdlIG1ldHJpY3MgLS0+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0B2ZyIvPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0Bsb2MiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AZGl0Ii8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3BhY2thZ2UvQG5vYSIvPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0Bucm0iLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AbmxtIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3BhY2thZ2UvQHdtYyIvPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0ByZmMiLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AZGFjIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3BhY2thZ2UvQGZhbm91dCIvPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0BjYm8iLz48L3RkPgorICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vcGFja2FnZS9AbGNvbSIvPjwvdGQ+CisgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9wYWNrYWdlL0Bub2NsIi8+PC90ZD4KKyAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIGFsdGVybmF0ZWQgcm93IHN0eWxlIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGUtcm93Ij4KKzx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+YTwveHNsOmlmPgorICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgPSAwIj5iPC94c2w6aWY+Cis8L3hzbDphdHRyaWJ1dGU+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tIGhvdyB0byBkaXNwbGF5IHRoZSBtZXRyaWNzIHdpdGggdGhlaXIgbWF4IHZhbHVlIC0tPgorPCEtLSBAdG9kbyB0aGUgbWF4IHZhbHVlcyBtdXN0IGJlIGV4dGVybmFsIHRvIHRoZSB4c2wgLS0+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQHZnIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiR2Zy5tYXgiLz4KKyAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAbG9jIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiRsb2MubWF4Ii8+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQGRpdCI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1heCIgc2VsZWN0PSIkZGl0Lm1heCIvPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBub2EiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJG5vYS5tYXgiLz4KKyAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAbnJtIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiRucm0ubWF4Ii8+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQG5sbSI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1heCIgc2VsZWN0PSIkbmxtLm1heCIvPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkB3bWMiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJHdtYy5tYXgiLz4KKyAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAcmZjIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiRyZmMubWF4Ii8+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQGRhYyI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdmFsdWUiPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9ImN1cnJlbnQoKSIvPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im1heCIgc2VsZWN0PSIkZGFjLm1heCIvPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkBmYW5vdXQiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJGZhbm91dC5tYXgiLz4KKyAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAY2JvIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS12YWx1ZSI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iY3VycmVudCgpIi8+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibWF4IiBzZWxlY3Q9IiRjYm8ubWF4Ii8+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQGxjb20iPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJGxjb20ubWF4Ii8+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQG5vY2wiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJjdXJyZW50KCkiLz4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJtYXgiIHNlbGVjdD0iJG5vY2wubWF4Ii8+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXZhbHVlIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJtYXgiLz4KKyAgICA8eHNsOmlmIHRlc3Q9IiR2YWx1ZSA+ICRtYXgiPgorICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPkVycm9yPC94c2w6YXR0cmlidXRlPgorICAgIDwveHNsOmlmPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFsdWUiLz4KKyAgPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcGVyZm9ybWFuY2UvYnVpbGQueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wZXJmb3JtYW5jZS9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlM2VkOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcGVyZm9ybWFuY2UvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImFsbCIgeG1sbnM6YWM9ImFudGxpYjpuZXQuc2YuYW50Y29udHJpYiI+CisgIDxkZXNjcmlwdGlvbj4KKyAgICBUaGlzIGJ1aWxkIGZpbGUgaXMgZGVzaWduZWQgdG8gcmVwb3J0IHRoZSBwZXJmb3JtYW5jZQorICAgIG9mIGFudCBmcm9tIHZhcmlvdXMgcmVsZWFzZXMuCisgICAgdG8gdXNlOgorICAgICogaW5zdGFsbCBhbnQtY29udHJpYi5qYXIgdG8gKCRBTlRfSE9NRXwkSE9NRS8uYW50KS9saWIKKyAgICAqIGluc3RhbGwgYmVhbnNoZWxsIGphciBhbmQgYnNmIGphcgorICAgICogdXNlIHVuaXggKHdpdGggYmFzaCkgb3IgaW5zdGFsbCBjeWd3aW4KKyAgICAqIHNldCB0aGUgZW52IHZhcmlhYmxlcyB7d2hpY2hldmVyIG5lZWRzIHRlc3Rpbmd9CisgICAgICBBTlRfSE9NRQorICAgICAgQU5UX0hPTUVfNl81ICh0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYW50IDEuNi41KQorICAgICAgQU5UX0hPTUVfNl80CisgICAgICBBTlRfSE9NRV81XzQKKyAgICAKKyAgICAqIHJ1biBhbnQKKyAgICBGb3IgZXhhbXBsZToKKyAgICAgICBleHBvcnQgQU5UX0hPTUU9ImM6L2N5Z3dpbi9ob21lL21lL3N2bi90cnVuay9kaXN0IgorICAgICAgIGV4cG9ydCBBTlRfSE9NRV81XzQ9Imw6L2FwcHMvYXBhY2hlLWFudC0xLjUuNCIKKyAgICAgICBhbnQuYmF0CisKKyAgICBUT0RPOiBtb3JlIGJ1aWxkIGZpbGVzLgorICA8L2Rlc2NyaXB0aW9uPgorICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgorCisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJnZW4sZG8tdGltZXMiLz4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8ZGVsZXRlIHF1aWV0PSJ5ZXMiIGRpcj0iYnVpbGQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPG1hY3JvZGVmIG5hbWU9InJ1bi1hbnQtZmlsZXMiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW52LWFudCIvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGFjOmlmPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9IkB7ZW52LWFudH0iLz4KKyAgICAgICAgPHRoZW4+CisgICAgICAgICAgPGFjOnNoZWxsc2NyaXB0IHNoZWxsPSJiYXNoIj4KKyAgICAgICAgICAgIGV4cG9ydCBBTlRfSE9NRT0ke0B7ZW52LWFudH19CisgICAgICAgICAgICBlY2hvICRBTlRfSE9NRQorICAgICAgICAgICAgZWNobyAtbiAiLS0gIHByb3BzLnhtbCAgICAgLS06ICIKKyAgICAgICAgICAgICRBTlRfSE9NRS9iaW4vYW50IC1mIGJ1aWxkL2dlbi9wcm9wcy54bWwgfCBncmVwIHRpbWUKKyAgICAgICAgICAgIGVjaG8gLW4gIi0tIGFudC1jYWxsLnhtbCAgIC0tOiAiCisgICAgICAgICAgICAkQU5UX0hPTUUvYmluL2FudCAtZiBidWlsZC9nZW4vYW50LWNhbGwueG1sIHwgZ3JlcCB0aW1lCisgICAgICAgICAgPC9hYzpzaGVsbHNjcmlwdD4KKyAgICAgICAgPC90aGVuPgorICAgICAgPC9hYzppZj4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisgIAorICA8dGFyZ2V0IG5hbWU9ImRvLXRpbWVzIj4KKyAgICA8cnVuLWFudC1maWxlcyBlbnYtYW50PSJlbnYuQU5UX0hPTUUiLz4KKyAgICA8cnVuLWFudC1maWxlcyBlbnYtYW50PSJlbnYuQU5UX0hPTUVfNl81Ii8+CisgICAgPHJ1bi1hbnQtZmlsZXMgZW52LWFudD0iZW52LkFOVF9IT01FXzZfMiIvPgorICAgIDxydW4tYW50LWZpbGVzIGVudi1hbnQ9ImVudi5BTlRfSE9NRV81XzQiLz4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9Imdlbi1kaXJzIj4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9nZW4iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhdmFpbCI+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXZhaWwucHJvcHMueG1sIgorICAgICAgICAgICAgICAgZmlsZT0icHJvcHMueG1sIiBmaWxlcGF0aD0iYnVpbGQvZ2VuIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXZhaWwuYW50LWNhbGwueG1sIgorICAgICAgICAgICAgICAgZmlsZT0iYW50LWNhbGwueG1sIiBmaWxlcGF0aD0iYnVpbGQvZ2VuIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuLXByb3BzIiBkZXBlbmRzPSJnZW4tZGlycyxhdmFpbCIgdW5sZXNzPSJhdmFpbC5wcm9wcy54bWwiPgorICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImJlYW5zaGVsbCI+CisgICAgICBpbXBvcnQgamF2YS5pby4qOworICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcigKKyAgICAgICAgICAiYnVpbGQvZ2VuL3Byb3BzLnhtbCIpKSk7CisgICAgICBvdXQucHJpbnRsbigiJmx0O3Byb2plY3QgbmFtZT0ncHJvcHMnIGRlZmF1bHQ9J3Byb3BzJyZndDsiKTsKKyAgICAgIG91dC5wcmludGxuKCIgICZsdDt0YXJnZXQgbmFtZT0ncHJvcHMnJmd0OyIpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyAyMDAwMDsgKytpKSB7CisgICAgICAgICAgb3V0LnByaW50bG4oCisgICAgICAgICAgICAgICIgICAgJmx0O3Byb3BlcnR5IG5hbWU9J3Byb3AiICsgaSArICInIHZhbHVlPSd2YWwnLyZndDsiKTsKKyAgICAgIH0KKyAgICAgIG91dC5wcmludGxuKCIgICZsdDsvdGFyZ2V0Jmd0OyIpOworICAgICAgb3V0LnByaW50bG4oIiZsdDsvcHJvamVjdCZndDsiKTsKKyAgICAgIG91dC5jbG9zZSgpOworICAgICAgc2VsZi5sb2coIkNyZWF0ZWQgYnVpbGQvZ2VuL3Byb3BzLnhtbCIpOworICAgIDwvc2NyaXB0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imdlbi1hbnQtY2FsbCIgZGVwZW5kcz0iZ2VuLWRpcnMsYXZhaWwiCisgICAgICAgICAgdW5sZXNzPSJhdmFpbC5hbnQtY2FsbC54bWwiPgorICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImJlYW5zaGVsbCI+CisgICAgICBpbXBvcnQgamF2YS5pby4qOworICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcigKKyAgICAgICAgICAiYnVpbGQvZ2VuL2FudC1jYWxsLnhtbCIpKSk7CisgICAgICBvdXQucHJpbnRsbigiJmx0O3Byb2plY3QgbmFtZT0nYW50LWNhbGwnIGRlZmF1bHQ9J2NhbGwnJmd0OyIpOworICAgICAgb3V0LnByaW50bG4oIiAgJmx0O3RhcmdldCBuYW1lPSdtZScvJmd0OyIpOworICAgICAgb3V0LnByaW50bG4oIiAgJmx0O3RhcmdldCBuYW1lPSdjYWxsJyZndDsiKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgMTAwMDsgKytpKSB7CisgICAgICAgICAgb3V0LnByaW50bG4oIiAgICAmbHQ7YW50Y2FsbCB0YXJnZXQ9J21lJy8mZ3Q7Iik7CisgICAgICB9CisgICAgICBvdXQucHJpbnRsbigiICAmbHQ7L3RhcmdldCZndDsiKTsKKyAgICAgIG91dC5wcmludGxuKCImbHQ7L3Byb2plY3QmZ3Q7Iik7CisgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgIHNlbGYubG9nKCJDcmVhdGVkIGJ1aWxkL2dlbi9hbnQtY2FsbC54bWwiKTsKKyAgICA8L3NjcmlwdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW4iIGRlcGVuZHM9Imdlbi1hbnQtY2FsbCxnZW4tcHJvcHMiLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9SRUFETUUudHh0IGIvdHJ1bmsvc3JjL2V0Yy9wb21zL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwNDEyOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNTQgQEAKK0J1aWxkaW5nIEFudCB3aXRoIE1hdmVuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgQW50IGphcnMgY2FuIGJlIGJ1aWx0IHVzaW5nIE1hdmVuIGFuZCB0aGUgUE9NUyBwcmVzZW50IGluIHRoaXMgZGlyZWN0b3J5LgorCitMaWJzIG5vdCBhdmFpbGFibGUgaW4gdGhlIG1hdmVuIHJlcG9zaXRvcnkKKworZ3JvdXBJZCAgICAgICAgICBhcnRpZmFjdElkICAgICAgIHZlcnNpb24gICBjb21tZW50Citjb20uYmVhICAgICAgICAgIHdlYmxvZ2ljICAgICAgICAgOC4xLjMuMCAgIGRvd25sb2FkIGl0Citjb20uYmVhICAgICAgICAgIHdlYmxvZ2ljY2xhc3NlcyAgNS4xICAgICAgIGEgbmV3ZXIgdmVyc2lvbiBjYW4gZG8uCitqYWkgICAgICAgICAgICAgIGphaS1jb3JlICAgICAgICAgMS4xLjJfMDEgIGRvd25sb2FkIGphaSBmcm9tIHN1bgoramFpICAgICAgICAgICAgICBqYWktY29kZWMgICAgICAgIDEuMS4yLjEgICBkb3dubG9hZCBqYWkgZnJvbSBzdW4KK2phdmF4Lm1lZGlhICAgICAgam1mICAgICAgICAgICAgICAyLjEuMWUgICAgZG93bWxvYWQgam1mIGZyb20gc3VuCitjb20uaWJtLm5ldHJleHggIG5ldHJleHggICAgICAgICAgMi4wLjUgICAgIEkgdXNlZCB0aGUgZmlsZSBOZXRSZXh4Qy5qYXIgZnJvbSB0aGUgbmV0cmV4eCBkaXN0cmlidXRpb24KK2NvbS5zdGFydGVhbSAgICAgc3RhcnRlYW0tc2RrICAgICA1LjIgICAgICAgdGhlIG9yaWdpbmFsIGZpbGUgaXMgY2FsbGVkIHN0YXJ0ZWFtLXNkay5qYXIKK3N0eWxlYm9vayAgICAgICAgc3R5bGVib29rICAgICAgICAxLjAtYjIgICAgdGhlIG9yaWdpbmFsIGZpbGUgaXMgY2FsbGVkIHN0eWxlYm9vay0xLjAtYjIuamFyCisKK3RvIGluc3RhbGwgYSBqYXIgZmlsZSBpbnRvIHlvdXIgbG9jYWwgTWF2ZW4gY2FjaGUsIGRvIHRoaXMKKworbXZuIGluc3RhbGw6aW5zdGFsbC1maWxlIC1EZ3JvdXBJZD1mb28ub3JnIC1EYXJ0aWZhY3RJZD14eCAtRHZlcnNpb249eC55IC1EcGFja2FnaW5nPWphciAtRGZpbGU9L2EvYi9mb28uamFyCisKK0hPVyBUTyBCVUlMRCA6CisKK2Zyb20gdGhpcyBkaXJlY3RvcnksIHR5cGUgCisKK212biBpbnN0YWxsIChvciBtdm4gcGFja2FnZSkKKworSWYgeW91IGRvIG5vdCBoYXZlIGFsbCB0aGUgZGVwZW5kZW5jaWVzLCB5b3UgY2FuIHJlbW92ZSB0aGUgbW9kdWxlcyB0aGF0IHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGJ1aWxkIAorZnJvbSB0aGUgcG9tLnhtbCBpbiB0aGlzIGRpcmVjdG9yeS4KKworWW91IGFsc28gbWlnaHQgd2FudCB0byBkaXNhYmxlIHRoZSB0ZXN0cy4gCisKK212biBpbnN0YWxsIC1EbWF2ZW4udGVzdC5za2lwPXRydWUgCisKKworCitUT0RPIDoKKworICogc2VlIGlmIHRoZSBkZXBlbmRlbmN5IHRvIHdlYmxvZ2ljY2xhc3Nlcy5qYXIgY2FuIGJlIHJlcGxhY2VkIGJ5IGEgZGVwZW5kZW5jeSB0byBzb21lIGoyZWUuamFyIGZyb20gU3VuLAorYXMgaXQgc3VwcGxpZXMgc29tZSBqYXZheC5lamIgY2xhc3NlcyB3aGljaCBhcmUgcmVxdWlyZWQgYXQgY29tcGlsZSB0aW1lLgorCisKK1BST0JMRU1TIDoKKworICogdGhlIHVuaXQgdGVzdHMgY2Fubm90IHJ1biBwcm9wZXJseSwgdGhlIG1hdmVuLXN1cmVmaXJlLXBsdWdpbiBzZXRzIGEgc3lzdGVtIHByb3BlcnR5IGJhc2VkaXIgCit3aGljaCBtYWtlIGEgbGFyZ2UgcGFydCBvZiBvdXIgdGVzdHMgZmFpbAorCisgKiBKSVJBIGlzc3VlIGh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvTVNVUkVGSVJFLTE3NyBhc2tpbmcgdGhlIE1hdmVuIGNvbGxlYWd1ZXMgdG8gZml4IHRoaXMuIDotKQorCitSRUZFUkVOQ0VTIDoKKworYWJvdXQgc2tpcHBpbmcgdGVzdHMgOgoraHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1zdXJlZmlyZS1wbHVnaW4vZXhhbXBsZXMvc2tpcHBpbmctdGVzdC5odG1sCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtYW50bHIvcG9tLnhtbCBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtYW50bHIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTNkZGUyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1hbnRsci9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LWFudGxyPC9hcnRpZmFjdElkPg0KKyAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8ZGVzY3JpcHRpb24+YW50bHIgc3BlY2lmaWMgdGFzay4NCisgICAgVGhlIGltcGxlbWVudGF0aW9uIGZvcmtzIGEgamF2YSBwcm9jZXNzLCB0aGVyZWZvcmUgdGhlIGFudGxyIGphciBmaWxlIGlzIG9ubHkgbmVlZGVkIGF0IHJ1bnRpbWU8L2Rlc2NyaXB0aW9uPg0KKyAgPGRlcGVuZGVuY2llcz4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPCEtLSBhZGQgYSBkZXBlbmRlbmN5IHdpdGggYW50bHIgMi43LjIgY29uc2lzdGVudCB3aXRoIGxpYnJhcmllcy5wcm9wZXJ0aWVzIGFudGxyIDIuNy42IGlzIGFsc28gYXZhaWxhYmxlIG9uIGliaWJsaW8tLT4NCisgICAgICA8Z3JvdXBJZD5hbnRscjwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5hbnRscjwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4yLjcuMjwvdmVyc2lvbj4NCisgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+DQorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICA8L2RlcGVuZGVuY2llcz4NCisgIDxidWlsZD4NCisgICAgPHBsdWdpbnM+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICA8c291cmNlPjEuMjwvc291cmNlPg0KKyAgICAgICAgICA8dGFyZ2V0PjEuMjwvdGFyZ2V0Pg0KKyAgICAgICAgICA8aW5jbHVkZXM+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQU5UTFIqPC9pbmNsdWRlPg0KKyAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICA8L3BsdWdpbnM+DQorICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4NCisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5Pg0KKyAgPC9idWlsZD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtYmNlbC9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtYmNlbC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjc3MmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1iY2VsL3BvbS54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPCEtLQ0KKyAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uDQorICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uDQorICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcNCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKyAgPHBhcmVudD4NCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPg0KKyAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDwvcGFyZW50Pg0KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICA8YXJ0aWZhY3RJZD5hbnQtYXBhY2hlLWJjZWw8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxkZXBlbmRlbmNpZXM+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+YmNlbDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5iY2VsPC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjUuMTwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90ZmlsdGVycy91dGlsL0phdmFDbGFzc0hlbHBlcio8L2luY2x1ZGU+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHV0aWwvZGVwZW5kL2JjZWwvKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLWJzZi9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtYnNmL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3MWZlNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLWJzZi9wb20ueG1sCkBAIC0wLDAgKzEsNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LWFwYWNoZS1ic2Y8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxkZXBlbmRlbmNpZXM+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+YnNmPC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4yLjQuMDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY3JpcHQqPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC8qKjwvaW5jbHVkZT4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC8qU2NyaXB0KjwvaW5jbHVkZT4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdCo8L2luY2x1ZGU+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9TY3JpcHQqPC9pbmNsdWRlPg0KKyAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICA8L3BsdWdpbnM+DQorICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4NCisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5Pg0KKyAgPC9idWlsZD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtbG9nNGovcG9tLnhtbCBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLWxvZzRqL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzNjU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLWxvZzRqL3BvbS54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPCEtLQ0KKyAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uDQorICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uDQorICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcNCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiANCit4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LWFwYWNoZS1sb2c0ajwvYXJ0aWZhY3RJZD4NCisgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPGRlcGVuZGVuY2llcz4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjIuMTM8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICA8L2RlcGVuZGVuY2llcz4NCisgIDxidWlsZD4NCisgICAgPHBsdWdpbnM+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICA8c291cmNlPjEuMjwvc291cmNlPg0KKyAgICAgICAgICA8dGFyZ2V0PjEuMjwvdGFyZ2V0Pg0KKyAgICAgICAgICA8aW5jbHVkZXM+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvTG9nNGpMaXN0ZW5lcio8L2luY2x1ZGU+DQorICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgPC9wbHVnaW4+DQorICAgIDwvcGx1Z2lucz4NCisgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5Pg0KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5Pg0KKyAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4NCisgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+DQorICA8L2J1aWxkPg0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1vcm8vcG9tLnhtbCBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLW9yby9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTAyNWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1vcm8vcG9tLnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8IS0tDQorICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4NCisgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4NCisgIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZw0KKy0tPg0KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICA8cGFyZW50Pg0KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4NCisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+DQorICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPC9wYXJlbnQ+DQorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgIDxhcnRpZmFjdElkPmFudC1hcGFjaGUtb3JvPC9hcnRpZmFjdElkPg0KKyAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8ZGVwZW5kZW5jaWVzPg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9ybzwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5vcm88L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+Mi4wLjg8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICA8L2RlcGVuZGVuY2llcz4NCisgIDxidWlsZD4NCisgICAgPHBsdWdpbnM+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICA8c291cmNlPjEuMjwvc291cmNlPg0KKyAgICAgICAgICA8dGFyZ2V0PjEuMjwvdGFyZ2V0Pg0KKyAgICAgICAgICA8aW5jbHVkZXM+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9ybyo8L2luY2x1ZGU+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLXJlZ2V4cC9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtcmVnZXhwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjODRkOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLXJlZ2V4cC9wb20ueG1sCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICA8cGFyZW50Pg0KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4NCisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+DQorICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPC9wYXJlbnQ+DQorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgIDxhcnRpZmFjdElkPmFudC1hcGFjaGUtcmVnZXhwPC9hcnRpZmFjdElkPg0KKyAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8ZGVwZW5kZW5jaWVzPg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPnJlZ2V4cDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5yZWdleHA8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgPC9kZXBlbmRlbmNpZXM+DQorICA8YnVpbGQ+DQorICAgIDxwbHVnaW5zPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPHNvdXJjZT4xLjI8L3NvdXJjZT4NCisgICAgICAgICAgPHRhcmdldD4xLjI8L3RhcmdldD4NCisgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHAqPC9pbmNsdWRlPg0KKyAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICA8L3BsdWdpbnM+DQorICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4NCisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5Pg0KKyAgPC9idWlsZD4NCisgIA0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1yZXNvbHZlci9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtcmVzb2x2ZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NThkMGRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtcmVzb2x2ZXIvcG9tLnhtbApAQCAtMCwwICsxLDY5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8IS0tDQorICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4NCisgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4NCisgIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZw0KKy0tPg0KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KK3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKyAgPHBhcmVudD4NCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPg0KKyAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDwvcGFyZW50Pg0KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICA8YXJ0aWZhY3RJZD5hbnQtYXBhY2hlLXJlc29sdmVyPC9hcnRpZmFjdElkPg0KKyAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8ZGVwZW5kZW5jaWVzPg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPnhtbC1yZXNvbHZlcjwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD54bWwtcmVzb2x2ZXI8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgPC9kZXBlbmRlbmNpZXM+DQorICA8YnVpbGQ+DQorICAgIDxwbHVnaW5zPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPHNvdXJjZT4xLjI8L3NvdXJjZT4NCisgICAgICAgICAgPHRhcmdldD4xLjI8L3RhcmdldD4NCisgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc29sdmVyLyoqPC9pbmNsdWRlPg0KKyAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICA8L3BsdWdpbnM+DQorICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4NCisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5Pg0KKyAgPC9idWlsZD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1jb21tb25zLWxvZ2dpbmcvcG9tLnhtbCBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtY29tbW9ucy1sb2dnaW5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwODhjMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtY29tbW9ucy1sb2dnaW5nL3BvbS54bWwKQEAgLTAsMCArMSw3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPCEtLQ0KKyAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uDQorICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uDQorICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcNCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiANCit4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LWNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4NCisgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPGRlc2NyaXB0aW9uPkFudCBMaXN0ZW5lciBiYXNlZCBvbiBjb21tb25zLWxvZ2dpbmc8L2Rlc2NyaXB0aW9uPg0KKyAgPGRlcGVuZGVuY2llcz4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nLWFwaTwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90bGlzdGVuZXIvQ29tbW9uc0xvZ2dpbmdMaXN0ZW5lcio8L2luY2x1ZGU+DQorICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgPC9wbHVnaW4+DQorICAgIDwvcGx1Z2lucz4NCisgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5Pg0KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5Pg0KKyAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4NCisgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+DQorICA8L2J1aWxkPg0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3BvbXMvYW50LWNvbW1vbnMtbmV0L3BvbS54bWwgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LWNvbW1vbnMtbmV0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2YTk2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtY29tbW9ucy1uZXQvcG9tLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8IS0tDQorICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4NCisgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4NCisgIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZw0KKy0tPg0KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KK3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKyAgPHBhcmVudD4NCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPg0KKyAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDwvcGFyZW50Pg0KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICA8YXJ0aWZhY3RJZD5hbnQtY29tbW9ucy1uZXQ8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxkZXNjcmlwdGlvbj5mdHAsIHJleGVjIGFuZCB0ZWxuZXQgdGFza3M8L2Rlc2NyaXB0aW9uPg0KKyAgPGRlcGVuZGVuY2llcz4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5jb21tb25zLW5ldDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLW5ldDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjQuMDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQKjwvaW5jbHVkZT4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvUkV4ZWMqPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9UZWxuZXRUYXNrKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtamFpL3BvbS54bWwgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LWphaS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjY2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LWphaS9wb20ueG1sCkBAIC0wLDAgKzEsODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LWphaTwvYXJ0aWZhY3RJZD4NCisgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPGRlc2NyaXB0aW9uPmltYWdlIHRhc2sgYW5kIGNvcnJlc3BvbmRpbmcgdHlwZXMuDQorICBqYWkgKEphdmEgQWR2YW5jZWQgSW1hZ2luZykgaXMgbm90IGF2YWlsYWJsZSBpbiBwdWJsaWMgTWF2ZW4gcmVwb3NpdG9yaWVzLCB0aGVyZWZvcmUgdGhlIGRlcGVuZGVuY2llcyBhcmUgaW5jbHVkZWQgd2l0aCBhIHNjb3BlIHByb3ZpZGVkDQorICAgIHRoZSBkb3dubG9hZCBVUkwgaXMgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhLW1lZGlhL2phaS8NCisgIDwvZGVzY3JpcHRpb24+DQorICA8ZGVwZW5kZW5jaWVzPg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPmphdmF4Lm1lZGlhPC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmphaS1jb3JlPC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuMS4yXzAxPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+amFpPC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmphaS1jb2RlYzwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjEuMi4xPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS8qPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlLyo8L2luY2x1ZGU+DQorICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgPC9wbHVnaW4+DQorICAgIDwvcGx1Z2lucz4NCisgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5Pg0KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5Pg0KKyAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4NCisgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+DQorICA8L2J1aWxkPg0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3BvbXMvYW50LWphdmFtYWlsL3BvbS54bWwgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LWphdmFtYWlsL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiMTNmYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtamF2YW1haWwvcG9tLnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8IS0tDQorICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4NCisgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4NCisgIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZw0KKy0tPg0KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KK3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKyAgPHBhcmVudD4NCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPg0KKyAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDwvcGFyZW50Pg0KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICA8YXJ0aWZhY3RJZD5hbnQtamF2YW1haWw8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxkZXNjcmlwdGlvbj5pbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWFpbCB0YXNrIGJhc2VkIG9uIGphdmFtYWlsLg0KKyAgICBSZXF1aXJlZCB0byBzZW5kIGVtYWlscyB0byBTTVRQIHNlcnZlcnMgdXNpbmcgdXNlci9wYXNzd29yZCBjb21iaW5hdGlvbnMNCisgIG9yIHRvIHNlbmQgbWFpbCBvdmVyIFNTTDwvZGVzY3JpcHRpb24+DQorICA8ZGVwZW5kZW5jaWVzPg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPmphdmF4Lm1haWw8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+bWFpbDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPmphdmF4LmFjdGl2YXRpb248L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YWN0aXZhdGlvbjwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICA8L2RlcGVuZGVuY2llcz4gDQorICA8YnVpbGQ+DQorICAgIDxwbHVnaW5zPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPHNvdXJjZT4xLjI8L3NvdXJjZT4NCisgICAgICAgICAgPHRhcmdldD4xLjI8L3RhcmdldD4NCisgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50Ly90YXNrZGVmcy9lbWFpbC9NaW1lTWFpbGVyKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtamRlcGVuZC9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1qZGVwZW5kL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmYmQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtamRlcGVuZC9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LWpkZXBlbmQ8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxkZXNjcmlwdGlvbj50YXNrIGpkZXBlbmQgaW52b2tpbmcgdGhlIGpkZXBlbmQgcGFyc2VyLiBUaGVyZSBpcyBhbHNvIGEgdmVyc2lvbiAyLjkuMSBvZiB0aGUNCisgICAgamRlcGVuZCBwYXJzZXIgYXZhaWxhYmxlIG9uIHRoZSBtYXZlbiByZXBvc2l0b3J5PC9kZXNjcmlwdGlvbj4NCisgIDxkZXBlbmRlbmNpZXM+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+amRlcGVuZDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5qZGVwZW5kPC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjIuNzwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC8vdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC8qPC9pbmNsdWRlPg0KKyAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICA8L3BsdWdpbnM+DQorICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4NCisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5Pg0KKyAgPC9idWlsZD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1qbWYvcG9tLnhtbCBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtam1mL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4NzIyNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtam1mL3BvbS54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPCEtLQ0KKyAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uDQorICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uDQorICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcNCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiANCit4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LWptZjwvYXJ0aWZhY3RJZD4NCisgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPGRlc2NyaXB0aW9uPmNvbnRhaW5zIHRoZSBzb3VuZCB0YXNrIGFuZCBhIHNvdW5kcGxheWVyIGxpc3RlbmVyDQorICAgIGRvd25sb2FkIHRoZSBkZXBlbmRlbmN5IGZyb20gaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhLW1lZGlhL2ptZi88L2Rlc2NyaXB0aW9uPg0KKyAgPGRlcGVuZGVuY2llcz4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5qYXZheC5tZWRpYTwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5qbWY8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+Mi4xLjFlPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC8vdGFza2RlZnMvb3B0aW9uYWwvc291bmQvKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorICA8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1qc2NoL3BvbS54bWwgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LWpzY2gvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDkwNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1qc2NoL3BvbS54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPCEtLQ0KKyAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uDQorICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uDQorICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcNCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiANCit4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LWpzY2g8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxkZXNjcmlwdGlvbj5jb250YWlucyB0aGUgc3NoZXhlYyBhbmQgc2NwIHRhc2tzDQorICBqc2NoIDAuMS4yOSBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGZyb20gbWF2ZW48L2Rlc2NyaXB0aW9uPg0KKyAgPGRlcGVuZGVuY2llcz4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5jb20uamNyYWZ0PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmpzY2g8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MC4xLjI5PC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgPC9kZXBlbmRlbmNpZXM+DQorICA8YnVpbGQ+DQorICAgIDxwbHVnaW5zPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPHNvdXJjZT4xLjI8L3NvdXJjZT4NCisgICAgICAgICAgPHRhcmdldD4xLjI8L3RhcmdldD4NCisgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50Ly90YXNrZGVmcy9vcHRpb25hbC9zc2gvKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtanVuaXQvcG9tLnhtbCBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtanVuaXQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzhjM2JkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1qdW5pdC9wb20ueG1sCkBAIC0wLDAgKzEsOTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICA8cGFyZW50Pg0KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4NCisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+DQorICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPC9wYXJlbnQ+DQorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgIDxhcnRpZmFjdElkPmFudC1qdW5pdDwvYXJ0aWZhY3RJZD4NCisgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPGRlc2NyaXB0aW9uPmNvbnRhaW5zIHRoZSBqdW5pdCBhbmQganVuaXJyZXBvcnQgdGFza3M8L2Rlc2NyaXB0aW9uPg0KKyAgPGRlcGVuZGVuY2llcz4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4zLjguMjwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDxleGVjdXRpb25zPg0KKyAgICAgICAgICA8ZXhlY3V0aW9uPg0KKyAgICAgICAgICAgIDxpZD5jcmVhdGUtdGltZXN0YW1wLWZpbGU8L2lkPg0KKyAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1yZXNvdXJjZXM8L3BoYXNlPg0KKyAgICAgICAgICAgIDxnb2Fscz4NCisgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4NCisgICAgICAgICAgICA8L2dvYWxzPg0KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICAgICAgPHRhc2tzPg0KKyAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fSIvPg0KKyAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQveHNsIj4NCisgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5idWlsZC5zb3VyY2VEaXJlY3Rvcnl9Ly4uL2V0YyI+DQorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1mcmFtZXMueHNsIi8+DQorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1ub2ZyYW1lcy54c2wiLz4NCisgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQorICAgICAgICAgICAgICAgIDwvY29weT4gICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgPC90YXNrcz4NCisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDwvZXhlY3V0aW9uPg0KKw0KKyAgICAgICAgPC9leGVjdXRpb25zPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPHNvdXJjZT4xLjI8L3NvdXJjZT4NCisgICAgICAgICAgPHRhcmdldD4xLjI8L3RhcmdldD4NCisgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50Ly90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC8qPC9pbmNsdWRlPg0KKyAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICA8L3BsdWdpbnM+DQorICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4NCisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5Pg0KKyAgPC9idWlsZD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1sYXVuY2hlci9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1sYXVuY2hlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDdjMzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LWxhdW5jaGVyL3BvbS54bWwKQEAgLTAsMCArMSw1NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPCEtLQ0KKyAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uDQorICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uDQorICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcNCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKyAgPHBhcmVudD4NCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPg0KKyAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDwvcGFyZW50Pg0KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxidWlsZD4NCisgICAgPHBsdWdpbnM+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICA8c291cmNlPjEuMjwvc291cmNlPg0KKyAgICAgICAgICA8dGFyZ2V0PjEuMjwvdGFyZ2V0Pg0KKyAgICAgICAgICA8aW5jbHVkZXM+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoLyouamF2YTwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisNCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0L2FudC1sYXVuY2hlci9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC9hbnQtbGF1bmNoZXIvdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC9hbnQtbGF1bmNoZXI8L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtbmV0cmV4eC9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1uZXRyZXh4L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhZjMwNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtbmV0cmV4eC9wb20ueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICA8cGFyZW50Pg0KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4NCisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+DQorICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPC9wYXJlbnQ+DQorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgIDxhcnRpZmFjdElkPmFudC1uZXRyZXh4PC9hcnRpZmFjdElkPg0KKyAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8ZGVzY3JpcHRpb24+TmV0UmV4eEMgdGFzaw0KKyAgICBkZXBlbmRlbmN5IGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5pYm0uY29tL3NvZnR3YXJlL2F3ZHRvb2xzL25ldHJleHgvZG93bmxvYWQuaHRtbDwvZGVzY3JpcHRpb24+DQorICA8ZGVwZW5kZW5jaWVzPg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPmNvbS5pYm0ubmV0cmV4eDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5uZXRyZXh4PC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjIuMC41PC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC8vdGFza2RlZnMvb3B0aW9uYWwvTmV0UmV4eEMqPC9pbmNsdWRlPg0KKyAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICA8L3BsdWdpbnM+DQorICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4NCisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5Pg0KKyAgPC9idWlsZD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1ub2RlcHMvcG9tLnhtbCBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtbm9kZXBzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxMzNiZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtbm9kZXBzL3BvbS54bWwKQEAgLTAsMCArMSwxMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LW5vZGVwczwvYXJ0aWZhY3RJZD4NCisgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPGRlc2NyaXB0aW9uPmNvbnRhaW5zIGFsbCB0aGUgb3B0aW9uYWwgdGFza3MgYW5kIHR5cGVzIHdoaWNoIGRvIG5vdCBoYXZlIHBhcnRpY3VsYXIgZGVwZW5kZW5jaWVzPC9kZXNjcmlwdGlvbj4NCisgIDxkZXBlbmRlbmNpZXM+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPCEtLSB0aGUgaW1wbGVtZW50YXRpb24gamFyIG9mIHRoZSB4ZXJjZXMgamFyIHdpbGwgYmUgdXNlZCBieSBhbnQgdG8gcGFyc2UNCisgICAgICBYTUwgZmlsZXMsIHBhcnRpY3VsYXJseSB0aGUgYnVpbGQgZmlsZXMsIGlmIHRoZSBKREsgZG9lcyBub3QgcHJvdmlkZSBhIHBhcnNlcg0KKyAgICAgIHhlcmNlc0ltcGwuamFyIGlzIHByb3ZpZGVkIHdpdGggYW50IC0tPg0KKyAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjIuOS4wPC92ZXJzaW9uPg0KKyAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4NCisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPCEtLSB4bWwtYXBpcyBjb250YWlucyB0aGUgb3JnLnczYy5kb20gcGFja2FnZSANCisgICAgICAgIHNpbmNlIGFudCBpcyB1c2luZyBET00gQVBJUyB0byBwYXJzZSB0aGUgWE1MIGJ1aWxkIGZpbGUgYW5kIGRvIG90aGVyIFhNTCByZWxhdGVkIGFjdGl2aXRpZXMNCisgICAgICAgIHhtbC1hcGlzIGlzIGEgY29tcGlsZSB0aW1lIGRlcGVuZGVuY3kNCisgICAgICAgIGEgdmVyc2lvbiBvZiB4bWwtYXBpcy5qYXIgaXMgZGVsaXZlcmVkIHdpdGggYW50IC0tPg0KKyAgICAgIDxncm91cElkPnhtbC1hcGlzPC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuMy4wNDwvdmVyc2lvbj4NCisgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorDQorICA8L2RlcGVuZGVuY2llcz4NCisgIDxidWlsZD4NCisgICAgPHBsdWdpbnM+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICA8c291cmNlPjEuMjwvc291cmNlPg0KKyAgICAgICAgICA8dGFyZ2V0PjEuMjwvdGFyZ2V0Pg0KKyAgICAgICAgICA8aW5jbHVkZXM+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvKio8L2luY2x1ZGU+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvKio8L2luY2x1ZGU+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvKjwvaW5jbHVkZT4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsLyoqPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvamF2YTE1LyoqPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgICAgPGV4Y2x1ZGVzPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1RyYVhMaWFpc29uKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC8qKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS8qKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY3JpcHQqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC8qKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL1NjcmlwdCo8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvKlNjcmlwdCo8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU3R5bGVCb29rKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OZXRSZXh4Qyo8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0VqYmMqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9ERENyZWF0b3IqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XTFJ1bio8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dMU3RvcCo8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L1RlbG5ldCo8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUCo8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L1JFeGVjKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zY20vQW50U3RhclRlYW0qPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3N0YXJ0ZWFtLyo8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQU5UTFIqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kLyo8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS8qPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zcGxhc2gvKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvKjwvZXhjbHVkZT4NCisgICAgICAgICAgICANCisgICAgICAgICAgPC9leGNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0L2FudC1ub2RlcHMvY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvYW50LW5vZGVwcy90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0L2FudC1ub2RlcHM8L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtc3RhcnRlYW0vcG9tLnhtbCBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtc3RhcnRlYW0vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODdlY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC1zdGFydGVhbS9wb20ueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LXN0YXJ0ZWFtPC9hcnRpZmFjdElkPg0KKyAgPGRlc2NyaXB0aW9uPlN0YXJ0ZWFtIFNESyB0YXNrczwvZGVzY3JpcHRpb24+DQorICA8ZGVwZW5kZW5jaWVzPg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPmNvbS5zdGFydGVhbTwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5zdGFydGVhbS1zZGs8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+NS4yPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgPC9kZXBlbmRlbmNpZXM+DQorICA8YnVpbGQ+DQorICAgIDxwbHVnaW5zPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPHNvdXJjZT4xLjI8L3NvdXJjZT4NCisgICAgICAgICAgPHRhcmdldD4xLjI8L3RhcmdldD4NCisgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50Ly90YXNrZGVmcy9vcHRpb25hbC9zY20vQW50U3RhclRlYW0qPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50Ly90YXNrZGVmcy9vcHRpb25hbC9zY20vc3RhcnRlYW0vKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtc3R5bGVib29rL3BvbS54bWwgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LXN0eWxlYm9vay9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWUyMDgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LXN0eWxlYm9vay9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LXN0eWxlYm9vazwvYXJ0aWZhY3RJZD4NCisgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPGRlc2NyaXB0aW9uPmV4ZWN1dGVzIHRoZSBBcGFjaGUgU3R5bGVib29rIGRvY3VtZW50IGdlbmVyYXRvci4gRGVwcmVjYXRlZCBzaW5jZSBBbnQgMS43PC9kZXNjcmlwdGlvbj4NCisgIDxkZXBlbmRlbmNpZXM+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+c3R5bGVib29rPC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPnN0eWxlYm9vazwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjAtYjI8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgPC9kZXBlbmRlbmNpZXM+DQorICA8YnVpbGQ+DQorICAgIDxwbHVnaW5zPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPHNvdXJjZT4xLjI8L3NvdXJjZT4NCisgICAgICAgICAgPHRhcmdldD4xLjI8L3RhcmdldD4NCisgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50Ly90YXNrZGVmcy9vcHRpb25hbC9TdHlsZUJvb2sqPC9pbmNsdWRlPg0KKyAgICAgICAgICA8L2luY2x1ZGVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICA8L3BsdWdpbnM+DQorICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4NCisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5Pg0KKyAgPC9idWlsZD4NCisgIA0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3BvbXMvYW50LXN3aW5nL3BvbS54bWwgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LXN3aW5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViNTE2NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtc3dpbmcvcG9tLnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8IS0tDQorICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4NCisgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4NCisgIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZw0KKy0tPg0KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICA8cGFyZW50Pg0KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4NCisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+DQorICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPC9wYXJlbnQ+DQorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgIDxhcnRpZmFjdElkPmFudC1zd2luZzwvYXJ0aWZhY3RJZD4NCisgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgPGRlc2NyaXB0aW9uPmEgbGlzdGVuZXIgYW5kIGEgc3BsYXNoIHRhc2sgYmFzZWQgb24gU3dpbmc8L2Rlc2NyaXB0aW9uPg0KKyAgPGRlcGVuZGVuY2llcz4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgPC9kZXBlbmRlbmNpZXM+DQorICA8YnVpbGQ+DQorICAgIDxwbHVnaW5zPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPHNvdXJjZT4xLjI8L3NvdXJjZT4NCisgICAgICAgICAgPHRhcmdldD4xLjI8L3RhcmdldD4NCisgICAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50Ly90YXNrZGVmcy9vcHRpb25hbC9zcGxhc2gvKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorICANCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC10ZXN0dXRpbC9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC10ZXN0dXRpbC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDk1YmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LXRlc3R1dGlsL3BvbS54bWwKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKyAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uCisgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD5hbnQtdGVzdHV0aWw8L2FydGlmYWN0SWQ+CisgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8ZGVzY3JpcHRpb24+dGVzdCB1dGlsaXR5IGNsYXNzZXM8L2Rlc2NyaXB0aW9uPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHNvdXJjZT4xLjI8L3NvdXJjZT4KKyAgICAgICAgICA8dGFyZ2V0PjEuMjwvdGFyZ2V0PgorICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRmlsZVRlc3QqPC9pbmNsdWRlPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlclRlc3QqPC9pbmNsdWRlPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwVGVzdCo8L2luY2x1ZGU+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdCo8L2luY2x1ZGU+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BYnN0cmFjdEZpbGVTZXRUZXN0KjwvaW5jbHVkZT4KKyAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdHMvanVuaXQ8L3NvdXJjZURpcmVjdG9yeT4KKyAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5PgorICA8L2J1aWxkPgorICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtdHJheC9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC10cmF4L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzNzkyNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQtdHJheC9wb20ueG1sCkBAIC0wLDAgKzEsOTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCisgIDxwYXJlbnQ+DQorICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPg0KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4NCisgICAgPHZlcnNpb24+MS43LjEtU05BUFNIT1Q8L3ZlcnNpb24+DQorICA8L3BhcmVudD4NCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgPGFydGlmYWN0SWQ+YW50LXRyYXg8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxkZXNjcmlwdGlvbj5jb250YWlucyBwYXJ0aWN1bGFybHkgb25lIGNsYXNzIG5lY2Vzc2FyeSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgeHNsdCB0YXNrPC9kZXNjcmlwdGlvbj4NCisgIDxkZXBlbmRlbmNpZXM+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPCEtLSB0aGUgaW1wbGVtZW50YXRpb24gamFyIG9mIHRoZSB4ZXJjZXMgamFyIHdpbGwgYmUgdXNlZCBieSBhbnQgdG8gcGFyc2UNCisgICAgICBYTUwgZmlsZXMsIHBhcnRpY3VsYXJseSB0aGUgYnVpbGQgZmlsZXMsIGlmIHRoZSBKREsgZG9lcyBub3QgcHJvdmlkZSBhIHBhcnNlcg0KKyAgICAgIHhlcmNlc0ltcGwuamFyIGlzIHByb3ZpZGVkIHdpdGggYW50IC0tPg0KKyAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjIuOS4wPC92ZXJzaW9uPg0KKyAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4NCisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPCEtLSB4bWwtYXBpcyBjb250YWlucyB0aGUgb3JnLnczYy5kb20gcGFja2FnZSANCisgICAgICAgIHNpbmNlIGFudCBpcyB1c2luZyBET00gQVBJUyB0byBwYXJzZSB0aGUgWE1MIGJ1aWxkIGZpbGUgYW5kIGRvIG90aGVyIFhNTCByZWxhdGVkIGFjdGl2aXRpZXMNCisgICAgICAgIHhtbC1hcGlzIGlzIGEgY29tcGlsZSB0aW1lIGRlcGVuZGVuY3kNCisgICAgICAgIGEgdmVyc2lvbiBvZiB4bWwtYXBpcy5qYXIgaXMgZGVsaXZlcmVkIHdpdGggYW50IC0tPg0KKyAgICAgIDxncm91cElkPnhtbC1hcGlzPC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuMy4wNDwvdmVyc2lvbj4NCisgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+DQorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDwhLS0geGFsYW4gY29udGFpbnMgYSBUUkFYIGNvbXBsaWFudCBpbXBsZW1lbnRhdGlvbiAtLT4NCisgICAgICA8Z3JvdXBJZD54YWxhbjwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD54YWxhbjwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4yLjcuMDwvdmVyc2lvbj4NCisgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+DQorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICA8L2RlcGVuZGVuY2llcz4NCisgIDxidWlsZD4NCisgICAgPHBsdWdpbnM+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICA8c291cmNlPjEuMjwvc291cmNlPg0KKyAgICAgICAgICA8dGFyZ2V0PjEuMjwvdGFyZ2V0Pg0KKyAgICAgICAgICA8aW5jbHVkZXM+DQorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvL3Rhc2tkZWZzL29wdGlvbmFsL1RyYVhMaWFpc29uKjwvaW5jbHVkZT4NCisgICAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICA8L3BsdWdpbj4NCisgICAgPC9wbHVnaW5zPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+DQorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4NCisgIDwvYnVpbGQ+DQorICA8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC13ZWJsb2dpYy9wb20ueG1sIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL2FudC13ZWJsb2dpYy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmE2YzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50LXdlYmxvZ2ljL3BvbS54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPCEtLQ0KKyAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uDQorICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uDQorICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcNCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKyAgPHBhcmVudD4NCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPg0KKyAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDwvcGFyZW50Pg0KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICA8YXJ0aWZhY3RJZD5hbnQtd2VibG9naWM8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxkZXBlbmRlbmNpZXM+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+Y29tLmJlYTwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD53ZWJsb2dpY2NsYXNzZXM8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+NS4xPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+Y29tLmJlYTwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD53ZWJsb2dpYzwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj44LjEuMy4wPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQorICAgIDwvZGVwZW5kZW5jeT4NCisgIDwvZGVwZW5kZW5jaWVzPg0KKyAgPGJ1aWxkPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC8vdGFza2RlZnMvb3B0aW9uYWwvZWpiL0VqYmMqPC9pbmNsdWRlPg0KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50Ly90YXNrZGVmcy9vcHRpb25hbC9lamIvRERDcmVhdG9yKjwvaW5jbHVkZT4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC8vdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dMUnVuKjwvaW5jbHVkZT4NCisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC8vdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dMU3RvcCo8L2luY2x1ZGU+DQorICAgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgPC9wbHVnaW4+DQorICAgIDwvcGx1Z2lucz4NCisgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5Pg0KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5Pg0KKyAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4NCisgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+DQorICA8L2J1aWxkPg0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3BvbXMvYW50L3BvbS54bWwgYi90cnVuay9zcmMvZXRjL3BvbXMvYW50L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5MzA5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvcG9tcy9hbnQvcG9tLnhtbApAQCAtMCwwICsxLDIzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8IS0tDQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPCEtLQ0KKyAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uDQorICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uDQorICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcNCistLT4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKyAgPHBhcmVudD4NCisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPg0KKyAgICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDwvcGFyZW50Pg0KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxuYW1lPm9yZy5hcGFjaGUudG9vbHMuYW50PC9uYW1lPg0KKyAgPGRlc2NyaXB0aW9uPkFwYWNoZSBBbnQ8L2Rlc2NyaXB0aW9uPg0KKyAgPGRlcGVuZGVuY2llcz4NCisgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPg0KKyAgICAgIDx2ZXJzaW9uPjEuNy4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8ZGVwZW5kZW5jeT4NCisgICAgICA8IS0tIHRoZSBpbXBsZW1lbnRhdGlvbiBqYXIgb2YgdGhlIHhlcmNlcyBqYXIgd2lsbCBiZSB1c2VkIGJ5IGFudCB0byBwYXJzZQ0KKyAgICAgIFhNTCBmaWxlcywgcGFydGljdWxhcmx5IHRoZSBidWlsZCBmaWxlcywgaWYgdGhlIEpESyBkb2VzIG5vdCBwcm92aWRlIGEgcGFyc2VyDQorICAgICAgICB4ZXJjZXNJbXBsLmphciBpcyBwcm92aWRlZCB3aXRoIGFudCAtLT4NCisgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+eGVyY2VzSW1wbDwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4yLjkuMDwvdmVyc2lvbj4NCisgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+DQorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgIDwhLS0geG1sLWFwaXMgY29udGFpbnMgdGhlIG9yZy53M2MuZG9tIHBhY2thZ2UgDQorICAgICAgc2luY2UgYW50IGlzIHVzaW5nIERPTSBBUElTIHRvIHBhcnNlIHRoZSBYTUwgYnVpbGQgZmlsZSBhbmQgZG8gb3RoZXIgWE1MIHJlbGF0ZWQgYWN0aXZpdGllcw0KKyAgICAgIHhtbC1hcGlzIGlzIGEgY29tcGlsZSB0aW1lIGRlcGVuZGVuY3kNCisgICAgICBhIHZlcnNpb24gb2YgeG1sLWFwaXMuamFyIGlzIGRlbGl2ZXJlZCB3aXRoIGFudCAtLT4NCisgICAgICA8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD54bWwtYXBpczwvYXJ0aWZhY3RJZD4NCisgICAgICA8dmVyc2lvbj4xLjMuMDQ8L3ZlcnNpb24+DQorICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPg0KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCisgICAgPC9kZXBlbmRlbmN5Pg0KKyAgPC9kZXBlbmRlbmNpZXM+DQorICA8YnVpbGQ+DQorICAgIDxmaWx0ZXJzPg0KKyAgICAgIDxmaWx0ZXI+Li4vLi4vLi4vLi4vdGFyZ2V0L2FudC8uYnVpbGQudGltZXN0YW1wLnByb3BlcnRpZXM8L2ZpbHRlcj4NCisgICAgPC9maWx0ZXJzPg0KKyAgICA8cGx1Z2lucz4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDxjb25maWd1cmF0aW9uPiA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgPC9wbHVnaW4+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+DQorICAgICAgICA8ZXhlY3V0aW9ucz4NCisgICAgICAgICAgPGV4ZWN1dGlvbj4NCisgICAgICAgICAgICA8aWQ+Y3JlYXRlLXRpbWVzdGFtcC1maWxlPC9pZD4NCisgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4NCisgICAgICAgICAgICA8Z29hbHM+DQorICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+DQorICAgICAgICAgICAgPC9nb2Fscz4NCisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgIDx0YXNrcz4NCisgICAgICAgICAgICAgICAgPHRzdGFtcC8+DQorICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9Ii8+DQorICAgICAgICAgICAgICAgIDx0b3VjaCBmaWxlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8uYnVpbGQudGltZXN0YW1wLnByb3BlcnRpZXMiLz4NCisgICAgICAgICAgICAgICAgPGVjaG8gZmlsZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vLmJ1aWxkLnRpbWVzdGFtcC5wcm9wZXJ0aWVzIiBhcHBlbmQ9ImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IlRPREFZPSR7VE9EQVl9Ii8+DQorICAgICAgICAgICAgICA8L3Rhc2tzPg0KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCisgICAgICAgICAgPC9leGVjdXRpb24+DQorICAgICAgICAgIDxleGVjdXRpb24+DQorICAgICAgICAgICAgPGlkPmRlbGV0ZS10aW1lc3RhbXAtZmlsZTwvaWQ+DQorICAgICAgICAgICAgPHBoYXNlPmNsZWFuPC9waGFzZT4NCisgICAgICAgICAgICA8Z29hbHM+DQorICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+DQorICAgICAgICAgICAgPC9nb2Fscz4NCisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCisgICAgICAgICAgICAgIDx0YXNrcz4NCisgICAgICAgICAgICAgICAgPGRlbGV0ZSBmaWxlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8uYnVpbGQudGltZXN0YW1wLnByb3BlcnRpZXMiLz4NCisgICAgICAgICAgICAgIDwvdGFza3M+DQorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4NCisgICAgICAgIDwvZXhlY3V0aW9ucz4NCisgICAgICA8L3BsdWdpbj4NCisgICAgICA8cGx1Z2luPg0KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQorICAgICAgICAgIDxzb3VyY2U+MS4yPC9zb3VyY2U+DQorICAgICAgICAgIDx0YXJnZXQ+MS4yPC90YXJnZXQ+DQorICAgICAgICAgIDxleGNsdWRlcz4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC8qKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL3V0aWwvSmF2YUNsYXNzSGVscGVyKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC8qKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci8qKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC8qKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsLyoqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0KjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Mb2c0akxpc3RlbmVyKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Db21tb25zTG9nZ2luZ0xpc3RlbmVyKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cCo8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWltZU1haWxlcio8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoLyoqPC9leGNsdWRlPg0KKyAgICAgICAgICA8L2V4Y2x1ZGVzPg0KKyAgICAgICAgICA8dGVzdEV4Y2x1ZGVzPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsLyoqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvdXRpbC9KYXZhQ2xhc3NIZWxwZXIqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsLyoqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc29sdmVyLyoqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kLyoqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvKio8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHQqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0xvZzRqTGlzdGVuZXIqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0NvbW1vbnNMb2dnaW5nTGlzdGVuZXIqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHAqPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm8qPC9leGNsdWRlPg0KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9NaW1lTWFpbGVyKjwvZXhjbHVkZT4NCisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvKio8L2V4Y2x1ZGU+DQorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3R5bGVUZXN0KjwvZXhjbHVkZT4NCisgICAgICAgICAgPC90ZXN0RXhjbHVkZXM+DQorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQorICAgICAgPC9wbHVnaW4+DQorICAgICAgPHBsdWdpbj4NCisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCisgICAgICAgIDxjb25maWd1cmF0aW9uPg0KKyAgICAgICAgICA8b21pdEJhc2VkaXI+dHJ1ZTwvb21pdEJhc2VkaXI+DQorICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPg0KKyAgICAgICAgICAgIDxwcm9wZXJ0eT4NCisgICAgICAgICAgICAgIDxuYW1lPmFudC5ob21lPC9uYW1lPg0KKyAgICAgICAgICAgICAgPHZhbHVlPiR7ZW52LkFOVF9IT01FfTwvdmFsdWU+DQorICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCisgICAgICAgICAgICA8cHJvcGVydHk+DQorICAgICAgICAgICAgICA8bmFtZT5idWlsZC50ZXN0czwvbmFtZT4NCisgICAgICAgICAgICAgIDx2YWx1ZT4uLi8uLi8uLi8uLi90YXJnZXQvYW50L3Rlc3RjYXNlczwvdmFsdWU+DQorICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCisgICAgICAgICAgICA8cHJvcGVydHk+DQorICAgICAgICAgICAgICA8bmFtZT5idWlsZC50ZXN0cy52YWx1ZTwvbmFtZT4NCisgICAgICAgICAgICAgIDx2YWx1ZT4uLi8uLi8uLi8uLi90YXJnZXQvYW50L3Rlc3RjYXNlczwvdmFsdWU+DQorICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCisgICAgICAgICAgICA8cHJvcGVydHk+DQorICAgICAgICAgICAgICA8bmFtZT5vZmZsaW5lPC9uYW1lPg0KKyAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPg0KKyAgICAgICAgICAgIDwvcHJvcGVydHk+DQorICAgICAgICAgICAgPHByb3BlcnR5Pg0KKyAgICAgICAgICAgICAgPG5hbWU+cm9vdDwvbmFtZT4NCisgICAgICAgICAgICAgIDx2YWx1ZT4uLi8uLi8uLi8uLjwvdmFsdWU+DQorICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCisgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPg0KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICAgIDxwbHVnaW4+DQorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1yZXBvcnQtcGx1Z2luPC9hcnRpZmFjdElkPg0KKyAgICAgIDwvcGx1Z2luPg0KKyAgICA8L3BsdWdpbnM+DQorICAgIDxyZXNvdXJjZXM+DQorICAgICAgPHJlc291cmNlPg0KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvZGlyZWN0b3J5Pg0KKyAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+DQorICAgICAgICA8aW5jbHVkZXM+DQorICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHQucHJvcGVydGllczwvaW5jbHVkZT4NCisgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdC5wcm9wZXJ0aWVzPC9pbmNsdWRlPg0KKyAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0LnByb3BlcnRpZXM8L2luY2x1ZGU+DQorICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL2NvbmRpdGlvbnMvYW50bGliLnhtbDwvaW5jbHVkZT4NCisgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvZGVmYXVsdE1hbmlmZXN0Lm1mPC9pbmNsdWRlPg0KKyAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC92ZXJzaW9uLnR4dDwvaW5jbHVkZT4NCisgICAgICAgIDwvaW5jbHVkZXM+DQorICAgICAgPC9yZXNvdXJjZT4NCisgICAgICA8cmVzb3VyY2U+DQorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCisgICAgICAgIDxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPg0KKyAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICA8aW5jbHVkZT4qKi9hbnRsaWIueG1sPC9pbmNsdWRlPg0KKyAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICA8L3Jlc291cmNlPg0KKyAgICAgIDxyZXNvdXJjZT4NCisgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vZG9jczwvZGlyZWN0b3J5Pg0KKyAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPg0KKyAgICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgICA8aW5jbHVkZT5pbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmPC9pbmNsdWRlPg0KKyAgICAgICAgPC9pbmNsdWRlcz4NCisgICAgICA8L3Jlc291cmNlPg0KKyAgICA8L3Jlc291cmNlcz4NCisgICAgPHRlc3RSZXNvdXJjZXM+DQorICAgICAgPHRlc3RSZXNvdXJjZT4NCisgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL2V0Yy90ZXN0Y2FzZXM8L2RpcmVjdG9yeT4NCisgICAgICAgIDxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPg0KKyAgICAgIDwvdGVzdFJlc291cmNlPg0KKyAgICAgIDx0ZXN0UmVzb3VyY2U+DQorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9kaXJlY3Rvcnk+DQorICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4NCisgICAgICAgIDxleGNsdWRlcz4NCisgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPg0KKyAgICAgICAgPC9leGNsdWRlcz4NCisgICAgICA8L3Rlc3RSZXNvdXJjZT4NCisgICAgPC90ZXN0UmVzb3VyY2VzPg0KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0cy9qdW5pdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvYW50L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0L2FudC90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0L2FudDwvZGlyZWN0b3J5Pg0KKyAgPC9idWlsZD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy9wb21zL3BvbS54bWwgYi90cnVuay9zcmMvZXRjL3BvbXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjQwOTRkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy9wb21zL3BvbS54bWwKQEAgLTAsMCArMSwxMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKy0tPg0KKzwhLS0NCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLg0KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLg0KKyAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnDQorLS0+DQorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgDQoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4NCisgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQorICA8dmVyc2lvbj4xLjcuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCisgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQorICA8ZGVzY3JpcHRpb24+bWFzdGVyIFBPTTwvZGVzY3JpcHRpb24+DQorICA8bmFtZT5BcGFjaGUgQW50PC9uYW1lPg0KKyAgPHVybD5odHRwOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+DQorICA8aW5jZXB0aW9uWWVhcj4yMDAwPC9pbmNlcHRpb25ZZWFyPg0KKyAgPG9yZ2FuaXphdGlvbj4NCisgICAgPG5hbWU+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+DQorICA8L29yZ2FuaXphdGlvbj4NCisgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KKyAgICA8IS0tIE51bGwgb3V0IGluaGVyaXRlZCBhcGFjaGUgZGlzdHJpYnV0aW9uIHJlcG8gYnkgZGVmYXVsdCAtLT4NCisgICAgPHJlcG9zaXRvcnk+DQorICAgICAgPGlkPmR1bW15PC9pZD4NCisgICAgICA8bmFtZT5EdW1teSB0byBhdm9pZCBhY2NpZGVudGFsIGRlcGxveXM8L25hbWU+DQorICAgICAgPHVybD48L3VybD4NCisgICAgPC9yZXBvc2l0b3J5Pg0KKyAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50Pg0KKyAgPHNjbT4NCisgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9jb3JlL3RydW5rPC9jb25uZWN0aW9uPg0KKyAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2phbnQvY29yZS90cnVuazwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4NCisgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9jb3JlL3RydW5rPC91cmw+DQorICA8L3NjbT4NCisgIDxtYWlsaW5nTGlzdHM+DQorICAgIDxtYWlsaW5nTGlzdD4NCisgICAgICA8bmFtZT5BbnQgRGV2ZWxvcGVycyBMaXN0PC9uYW1lPg0KKyAgICAgIDxzdWJzY3JpYmU+ZGV2LXN1YnNjcmliZUBhbnQuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPg0KKyAgICAgIDx1bnN1YnNjcmliZT5kZXYtdW5zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPg0KKyAgICAgIDxwb3N0PmRldkBhbnQuYXBhY2hlLm9yZzwvcG9zdD4NCisgICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2FudC1kZXY8L2FyY2hpdmU+DQorICAgIDwvbWFpbGluZ0xpc3Q+DQorICAgIDxtYWlsaW5nTGlzdD4NCisgICAgICA8bmFtZT5BbnQgVXNlcnMgTGlzdDwvbmFtZT4NCisgICAgICA8c3Vic2NyaWJlPnVzZXItc3Vic2NyaWJlQGFudC5hcGFjaGUub3JnPC9zdWJzY3JpYmU+DQorICAgICAgPHVuc3Vic2NyaWJlPnVzZXItdW5zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPg0KKyAgICAgIDxwb3N0PnVzZXJAYW50LmFwYWNoZS5vcmc8L3Bvc3Q+DQorICAgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9hbnQtdXNlcjwvYXJjaGl2ZT4NCisgICAgPC9tYWlsaW5nTGlzdD4NCisgIDwvbWFpbGluZ0xpc3RzPg0KKyAgPGlzc3VlTWFuYWdlbWVudD4NCisgICAgPHN5c3RlbT5idWd6aWxsYTwvc3lzdGVtPg0KKyAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS88L3VybD4NCisgIDwvaXNzdWVNYW5hZ2VtZW50Pg0KKyAgPG1vZHVsZXM+DQorICAgIDxtb2R1bGU+YW50PC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LWFudGxyPC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LWFwYWNoZS1iY2VsPC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LWFwYWNoZS1ic2Y8L21vZHVsZT4NCisgICAgPG1vZHVsZT5hbnQtYXBhY2hlLWxvZzRqPC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LWFwYWNoZS1vcm88L21vZHVsZT4NCisgICAgPG1vZHVsZT5hbnQtYXBhY2hlLXJlZ2V4cDwvbW9kdWxlPg0KKyAgICA8bW9kdWxlPmFudC1hcGFjaGUtcmVzb2x2ZXI8L21vZHVsZT4NCisgICAgPG1vZHVsZT5hbnQtY29tbW9ucy1sb2dnaW5nPC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LWNvbW1vbnMtbmV0PC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LWphaTwvbW9kdWxlPg0KKyAgICA8bW9kdWxlPmFudC1qYXZhbWFpbDwvbW9kdWxlPg0KKyAgICA8bW9kdWxlPmFudC1qZGVwZW5kPC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LWptZjwvbW9kdWxlPg0KKyAgICA8bW9kdWxlPmFudC1qc2NoPC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LWp1bml0PC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LWxhdW5jaGVyPC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LW5ldHJleHg8L21vZHVsZT4NCisgICAgPG1vZHVsZT5hbnQtbm9kZXBzPC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LXN0YXJ0ZWFtPC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LXN0eWxlYm9vazwvbW9kdWxlPg0KKyAgICA8bW9kdWxlPmFudC1zd2luZzwvbW9kdWxlPg0KKyAgICA8bW9kdWxlPmFudC10ZXN0dXRpbDwvbW9kdWxlPg0KKyAgICA8bW9kdWxlPmFudC10cmF4PC9tb2R1bGU+DQorICAgIDxtb2R1bGU+YW50LXdlYmxvZ2ljPC9tb2R1bGU+DQorICA8L21vZHVsZXM+DQorICA8ZGVwZW5kZW5jaWVzPg0KKyAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+DQorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+DQorICAgICAgPHZlcnNpb24+My44LjI8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3k+DQorICA8L2RlcGVuZGVuY2llcz4NCisgIDxidWlsZD4NCisgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5Pg0KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5Pg0KKyAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uL3RhcmdldC9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uL3RhcmdldC90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+DQorICA8L2J1aWxkPg0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3RhZ2RpZmYueHNsIGIvdHJ1bmsvc3JjL2V0Yy90YWdkaWZmLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDQzMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90YWdkaWZmLnhzbApAQCAtMCwwICsxLDE3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIGEgc3R5bGVzaGVldCB0byBkaXNwbGF5IGNoYW5nZWxvZ3MgYWxhIG5ldGJlYW5zIC0tPgorPHhzbDpzdHlsZXNoZWV0CisgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgdmVyc2lvbj0iMS4wIj4KKyAgPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgorICA8eHNsOnBhcmFtIG5hbWU9Im1vZHVsZSIvPgorICA8eHNsOnBhcmFtIG5hbWU9ImN2c3dlYiIvPgorCisgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiLz4KKworICA8IS0tIENvcHkgc3RhbmRhcmQgZG9jdW1lbnQgZWxlbWVudHMuICBFbGVtZW50cyB0aGF0CisgICAgICAgc2hvdWxkIGJlIGlnbm9yZWQgbXVzdCBiZSBmaWx0ZXJlZCBieSBhcHBseS10ZW1wbGF0ZXMKKyAgICAgICB0YWdzLiAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiI+CisgICAgPHhzbDpjb3B5PgorICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iYXR0cmlidXRlOjoqWy4gIT0gJyddIi8+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgPC94c2w6Y29weT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGFnZGlmZiI+CisgICAgPGh0bWw+CisgICAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAgIGJvZHksIHAgeworICAgICAgICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsKKyAgICAgICAgICBmb250LXNpemU6IDgwJTsKKyAgICAgICAgICBjb2xvcjojMDAwMDAwOworICAgICAgICAgIH0KKwkgIC5kYXRlQW5kQXV0aG9yIHsKKyAgICAgICAgICBmb250LWZhbWlseTogdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7CisgICAgICAgICAgZm9udC1zaXplOiA4MCU7CisgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgICAgdGV4dC1hbGlnbjpsZWZ0OworICAgICAgICAgIGJhY2tncm91bmQ6I2E2Y2FmMDsKKwkgIH0KKyAgICAgICAgICB0ciwgdGR7CisgICAgICAgICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhOworICAgICAgICAgIGZvbnQtc2l6ZTogODAlOworICAgICAgICAgIGJhY2tncm91bmQ6I2VlZWVlMDsKKyAgICAgICAgICB9CSAgCisJICA8L3N0eWxlPiAKKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5IGxpbms9IiMwMDAwMDAiIGFsaW5rPSIjMDAwMDAwIiB2bGluaz0iIzAwMDAwMCIgdGV4dD0iIzAwMDAwMCI+ICAgICAgIAorICAgICAgICAgIDxoMT4KKyAgICAgICAgICAgIDxhIG5hbWU9InRvcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvYT4KKyAgICAgICAgICA8L2gxPgorICAgICAgICAgIFRhZ2RpZmYgYmV0d2VlbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0YXJ0VGFnIi8+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3RhcnREYXRlIi8+IGFuZAorCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlbmRUYWciLz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlbmREYXRlIi8+CisgICAgICAgICAgPHAgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3A+CisgICAgICAgICAgPGhyIHNpemU9IjIiLz4KKwk8YSBuYW1lPSJUT1AiLz4KKwk8dGFibGUgd2lkdGg9IjEwMCUiPgorCQk8dHI+CisJCQk8dGQgYWxpZ249InJpZ2h0Ij4KKwkJCQk8YSBocmVmPSIjTmV3Ij5OZXcgRmlsZXM8L2E+IHwKKwkJCQk8YSBocmVmPSIjTW9kaWZpZWQiPk1vZGlmaWVkIEZpbGVzPC9hPiB8CisJCQkJPGEgaHJlZj0iI1JlbW92ZWQiPlJlbW92ZWQgRmlsZXM8L2E+CisJCQk8L3RkPgorCQk8L3RyPgorCTwvdGFibGU+CisgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjEiPgorCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvdy1lbnRyaWVzIj4KKwkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0aXRsZSI+TmV3IEZpbGVzPC94c2w6d2l0aC1wYXJhbT4KKwkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJhbmNob3IiPk5ldzwveHNsOndpdGgtcGFyYW0+CisJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZW50cmllcyIgc2VsZWN0PSIuLy9lbnRyeVtmaWxlL3JldmlzaW9uXVtub3QoZmlsZS9wcmV2cmV2aXNpb24pXSIvPgorCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgorCisJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93LWVudHJpZXMiPgorCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRpdGxlIj5Nb2RpZmllZCBGaWxlczwveHNsOndpdGgtcGFyYW0+CisJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYW5jaG9yIj5Nb2RpZmllZDwveHNsOndpdGgtcGFyYW0+CisJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZW50cmllcyIgc2VsZWN0PSIuLy9lbnRyeVtmaWxlL3JldmlzaW9uXVtmaWxlL3ByZXZyZXZpc2lvbl0iLz4KKwkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKworCQk8IS0tIGNoYW5nZSB0byBlbnRyaWVzIHNlbGVjdCB0byBhZGRyZXNzIGJ1ZyAjMzY4MjcgLS0+CisJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93LWVudHJpZXMiPgorCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRpdGxlIj5SZW1vdmVkIEZpbGVzPC94c2w6d2l0aC1wYXJhbT4KKwkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJhbmNob3IiPlJlbW92ZWQ8L3hzbDp3aXRoLXBhcmFtPgorCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVudHJpZXMiIHNlbGVjdD0iLi8vZW50cnlbbm90KGZpbGUvcmV2aXNpb24pXVtmaWxlL3ByZXZyZXZpc2lvbl0iLz4KKwkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgCisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3ctZW50cmllcyI+CisJPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgorCTx4c2w6cGFyYW0gbmFtZT0iYW5jaG9yIi8+CisJPHhzbDpwYXJhbSBuYW1lPSJlbnRyaWVzIi8+CisJPHRyPgorCQk8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImRhdGVBbmRBdXRob3IiPgorCQkJPGE+CisJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhbmNob3IiLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkZW50cmllcykiLz4gZW50cmllcworCQkJPC9hPgorCQkJPGEgaHJlZj0iI1RPUCI+KGJhY2sgdG8gdG9wKTwvYT4KKwkJPC90ZD4KKwk8L3RyPgorCTx0cj4KKwkJPHRkIHdpZHRoPSIyMCI+CisJCQk8eHNsOnRleHQ+ICAgIDwveHNsOnRleHQ+CisJCTwvdGQ+CisJCTx0ZD4KKwkJICAgICAgICA8dWw+CisJCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkZW50cmllcyIvPgorCQkJPC91bD4KKwkJPC90ZD4KKwk8L3RyPgorICA8L3hzbDp0ZW1wbGF0ZT4gIAorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVudHJ5Ij4KKwk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImZpbGUiLz4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0ZSI+CisgICAgPGk+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L2k+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRpbWUiPgorICAgIDxpPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9pPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJhdXRob3IiPgorICAgIDxpPgorICAgICAgPGE+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPm1haWx0bzo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKyAgICAgIDwvYT4KKyAgICA8L2k+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiPgorICAgIDxsaT4KKyAgICAgIDxhIHRhcmdldD0iX25ldyI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY3Zzd2ViIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb2R1bGUiIC8+Lzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lIiAvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUiIC8+CisgICAgICA8L2E+CisgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgocHJldnJldmlzaW9uKSA+IDAgb3Igc3RyaW5nLWxlbmd0aChyZXZpc2lvbikgPiAwIj4KKyAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KKyAgICAgIDxhIHRhcmdldD0iX25ldyI+CisgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKHByZXZyZXZpc2lvbikgPSAwICI+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGN2c3dlYiIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kdWxlIiAvPi88eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZSIgLz4/cmV2PTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXZpc2lvbiIgLz4mYW1wO2NvbnRlbnQtdHlwZT10ZXh0L3gtY3Zzd2ViLW1hcmt1cDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjdnN3ZWIiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZHVsZSIgLz4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5hbWUiIC8+P3IxPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXZpc2lvbiIgLz4mYW1wO3IyPTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcmV2cmV2aXNpb24iLz4mYW1wO2RpZmZfZm9ybWF0PWg8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICA8L3hzbDpjaG9vc2U+ICg8eHNsOmlmIHRlc3Q9ImNvdW50KHByZXZyZXZpc2lvbikgJmd0OyAwIj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByZXZyZXZpc2lvbiIvPiAtLSZndDsgPC94c2w6aWY+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyZXZpc2lvbiIvPikKKyAgICAgIDwvYT4KKyAgICAgIDwveHNsOmlmPgorICAgIDwvbGk+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gQW55IGVsZW1lbnRzIHdpdGhpbiBhIG1zZyBhcmUgcHJvY2Vzc2VkLAorICAgICAgIHNvIHRoYXQgd2UgY2FuIHByZXNlcnZlIEhUTUwgdGFncy4gLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1zZyI+CisgICAgPGI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYj4KKyAgPC94c2w6dGVtcGxhdGU+CisgIAorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2FzZi1sb2dvLmdpZiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2FzZi1sb2dvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmViOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvYXNmLWxvZ28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvYW50Y2xhc3Nsb2FkZXIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9hbnRjbGFzc2xvYWRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiMzk2NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvYW50Y2xhc3Nsb2FkZXIueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/Pg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8cHJvamVjdCBuYW1lPSJhbnRjbGFzc2xvYWRlci10ZXN0IiBiYXNlZGlyPSIuIj4NCisNCisgICAgPHByb3BlcnR5IG5hbWU9InRtcC5kaXIiIGxvY2F0aW9uPSJ0bXAgc3BhY2UiLz4NCisgICAgPCEtLSBhbnQgZm9yIGdlcm1hbnMgLS0+DQorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0bXAuZGlyLm5vbmFzY2lpIiB2YWx1ZT0iJiMwMjI3O250Ii8+DQorICAgIDxwcm9wZXJ0eSBuYW1lPSJleHQuZGlyLnJlbGF0aXZlIiB2YWx1ZT0iZXh0Ii8+DQorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYWluLmphciIgbG9jYXRpb249IiR7dG1wLmRpcn0vbWFpbi5qYXIiLz4NCisgICAgPHByb3BlcnR5IG5hbWU9ImV4dC5qYXIucmVsYXRpdmUiIHZhbHVlPSIke2V4dC5kaXIucmVsYXRpdmV9L2V4dC5qYXIiLz4NCisgICAgPHByb3BlcnR5IG5hbWU9ImV4dC5qYXIiIGxvY2F0aW9uPSIke3RtcC5kaXJ9LyR7ZXh0Lmphci5yZWxhdGl2ZX0iLz4NCisgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnN5c2NsYXNzcGF0aCIgdmFsdWU9ImZpcnN0Ii8+DQorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYWluLmphci5ub25hc2NpaSIgbG9jYXRpb249IiR7dG1wLmRpci5ub25hc2NpaX0vbWFpbi5qYXIiLz4NCisgICAgPHByb3BlcnR5IG5hbWU9ImV4dC5qYXIubm9uYXNjaWkiIGxvY2F0aW9uPSIke3RtcC5kaXIubm9uYXNjaWl9LyR7ZXh0Lmphci5yZWxhdGl2ZX0iLz4NCisgICAgPHRhcmdldCBuYW1lPSJzZXR1cCIgZGVwZW5kcz0ic2V0dXAud2l0aHNwYWNlLHNldHVwLm5vbmFzY2lpIi8+DQorDQorICAgIDx0YXJnZXQgbmFtZT0ic2V0dXAud2l0aHNwYWNlIj4NCisgICAgICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0vJHtleHQuZGlyLnJlbGF0aXZlfSIvPg0KKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHttYWluLmphcn0iIHdoZW5lbXB0eT0iY3JlYXRlIj4NCisgICAgICAgICAgPG1hbmlmZXN0Pg0KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQ2xhc3MtUGF0aCIgdmFsdWU9IiR7ZXh0Lmphci5yZWxhdGl2ZX0iLz4NCisgICAgICAgICAgPC9tYW5pZmVzdD4NCisgICAgICAgIDwvamFyPg0KKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtleHQuamFyfSIvPg0KKyAgICA8L3RhcmdldD4NCisgICAgPHRhcmdldCBuYW1lPSJzZXR1cC5ub25hc2NpaSI+DQorICAgICAgPG1rZGlyIGRpcj0iJHt0bXAuZGlyLm5vbmFzY2lpfS8ke2V4dC5kaXIucmVsYXRpdmV9Ii8+DQorICAgICAgPGphciBkZXN0ZmlsZT0iJHttYWluLmphci5ub25hc2NpaX0iIHdoZW5lbXB0eT0iY3JlYXRlIj4NCisgICAgICAgIDxtYW5pZmVzdD4NCisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiB2YWx1ZT0iJHtleHQuamFyLnJlbGF0aXZlfSIvPg0KKyAgICAgICAgPC9tYW5pZmVzdD4NCisgICAgICA8L2phcj4NCisgICAgICA8amFyIGRlc3RmaWxlPSIke2V4dC5qYXIubm9uYXNjaWl9Ii8+DQorDQorICAgIDwvdGFyZ2V0Pg0KKw0KKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPg0KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dG1wLmRpcn0iIHF1aWV0PSJ0cnVlIi8+DQorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0bXAuZGlyLm5vbmFzY2lpfSIgcXVpZXQ9InRydWUiLz4NCisgICAgPC90YXJnZXQ+DQorDQorDQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvY2FzZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2Nhc2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNGFjMWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2Nhc2UueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJwYXJzaW5nLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImhlbHAiPgorCisgIDx0YXJnZXQgbmFtZT0iaGVscCI+CisgICAgPGVjaG8+CitUaGlzIGJ1aWxkIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgdGVzdGluZyBBbnQKKyAgICA8L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2FzZS1zZW5zaXRpdml0eSI+CisgICAgPGNvbmNhdD4KKyAgICAgIDxmaWxlU2V0IGRpcj0iLiIgaW5jbHVkZXM9InBhcnNlLnhtbCIvPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRhc2tjYXNlIj4KKyAgICA8ZWNITz5TaG91bGQgZmFpbDwvZWNITz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvY29udGFpbmVyc3JjL3Rlc3QvU3BlY2lhbFNlcS5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9jb250YWluZXJzcmMvdGVzdC9TcGVjaWFsU2VxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2YTNkZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvY29udGFpbmVyc3JjL3Rlc3QvU3BlY2lhbFNlcS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qIAorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqLworcGFja2FnZSB0ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobzsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIFNwZWNpYWxTZXEgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7CisgICAgLyoqIE9wdGlvbmFsIFZlY3RvciBob2xkaW5nIHRoZSBuZXN0ZWQgdGFza3MgKi8KKyAgICBwcml2YXRlIFZlY3RvciBuZXN0ZWRUYXNrcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIHByaXZhdGUgRmlsZVNldCBmaWxlc2V0OworICAgIAorICAgIHByaXZhdGUgRWNobyBuZXN0ZWRFY2hvOworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIG5lc3RlZCB0YXNrLgorICAgICAqIDxwPgorICAgICAqIEBwYXJhbSBuZXN0ZWRUYXNrICBOZXN0ZWQgdGFzayB0byBleGVjdXRlCisgICAgICogPHA+CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrIG5lc3RlZFRhc2spIHsKKyAgICAgICAgbmVzdGVkVGFza3MuYWRkRWxlbWVudChuZXN0ZWRUYXNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGFsbCBuZXN0ZWRUYXNrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGVzZXQgPT0gbnVsbCB8fCBmaWxlc2V0LmdldERpcihnZXRQcm9qZWN0KCkpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZXNldCB3YXMgbm90IGNvbmZpZ3VyZWQiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBuZXN0ZWRUYXNrcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgVGFzayBuZXN0ZWRUYXNrID0gKFRhc2spIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG5lc3RlZFRhc2sucGVyZm9ybSgpOworICAgICAgICB9CisgICAgICAgIG5lc3RlZEVjaG8ucmVjb25maWd1cmUoKTsKKyAgICAgICAgbmVzdGVkRWNoby5wZXJmb3JtKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IGZpbGVzZXQpIHsKKyAgICAgICAgdGhpcy5maWxlc2V0ID0gZmlsZXNldDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkTmVzdGVkKEVjaG8gbmVzdGVkRWNobykgeworICAgICAgICB0aGlzLm5lc3RlZEVjaG8gPSBuZXN0ZWRFY2hvOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZGlyZWN0b3J5c2Nhbm5lci54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2RpcmVjdG9yeXNjYW5uZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjMzOTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2RpcmVjdG9yeXNjYW5uZXIueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iZGlyZWN0b3J5c2Nhbm5lci10ZXN0IiBiYXNlZGlyPSIuIj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJ0bXAuZGlyIiBsb2NhdGlvbj0idG1wIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNldHVwIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0bXAuZGlyfS9hbHBoYS9iZXRhL2dhbW1hIi8+CisgICAgICAgIDx0b3VjaCBmaWxlPSIke3RtcC5kaXJ9L2FscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIi8+CisgICAgICAgIDx0b3VjaCBmaWxlPSIke3RtcC5kaXJ9L2FscGhhL2JldGEvYmV0YS54bWwiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZXh0ZW5kZWQtc2V0dXAiIGRlcGVuZHM9InNldHVwIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0bXAuZGlyfS9kZWx0YSIvPgorICAgICAgICA8dG91Y2ggZmlsZT0iJHt0bXAuZGlyfS9kZWx0YS9kZWx0YS54bWwiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY2hpbGRyZW4tb2YtZXhjbHVkZWQtZGlyLXNldHVwIiBkZXBlbmRzPSJleHRlbmRlZC1zZXR1cCIgLz4KKworICAgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RtcC5kaXJ9IiBxdWlldD0idHJ1ZSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJzeW1saW5rLXNldHVwIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0vZXBzaWxvbi9nYW1tYSIvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0bXAuZGlyfS9hbHBoYS9iZXRhIi8+CisgICAgICAgIDxzeW1saW5rIGxpbms9IiR7dG1wLmRpcn0vYWxwaGEvYmV0YSIgcmVzb3VyY2U9IiR7dG1wLmRpcn0vZXBzaWxvbiIvPgorICAgICAgICA8dG91Y2ggZmlsZT0iJHt0bXAuZGlyfS9hbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCIvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2Rpc3BhdGNoL2Rpc3BhdGNoLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZGlzcGF0Y2gvZGlzcGF0Y2gueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Mjk2NDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2Rpc3BhdGNoL2Rpc3BhdGNoLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0iZGlzcGF0Y2gtdGVzdCIgZGVmYXVsdD0iZGlzcCI+CisKKyAgPHBhdGggaWQ9InRlc3RjbGFzc2VzIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICA8L3BhdGg+CisKKyAgPHRhcmdldCBuYW1lPSJkaXNwIj4KKyAgICA8dGFza2RlZiBuYW1lPSJkaXNwdGFzayIKKyAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlBpY2tPbmVUYXNrIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RjbGFzc2VzIiAvPgorICAgIDwvdGFza2RlZj4KKyAgICA8ZGlzcHRhc2sgYWN0aW9uPSJsaXN0Ii8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2R1cGxpY2F0ZS10YXJnZXQtaW1wb3J0ZWQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0LWltcG9ydGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzk0NWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0LWltcG9ydGVkLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3Q+CisgICAgPHRhcmdldCBuYW1lPSJvbmNlIj4KKyAgICAgICAgPGVjaG8+b25jZSBmcm9tIGltcG9ydGVkPC9lY2hvPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZHVwbGljYXRlLXRhcmdldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyOTUyNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZHVwbGljYXRlLXRhcmdldC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0PgorICAgIDx0YXJnZXQgbmFtZT0ib25jZSI+CisgICAgICAgIDxlY2hvPm9uY2U8L2VjaG8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InR3aWNlIj4KKyAgICAgICAgPGVjaG8+dHdpY2UtYTwvZWNobz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idHdpY2UiPgorICAgICAgICA8ZWNobz50d2ljZS1iPC9lY2hvPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0Mi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2R1cGxpY2F0ZS10YXJnZXQyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk2YmNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0Mi54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0PgorCisgICAgPGltcG9ydCBmaWxlPSJkdXBsaWNhdGUtdGFyZ2V0LWltcG9ydGVkLnhtbCIvPgorCisgICAgPHRhcmdldCBuYW1lPSJvbmNlIj4KKyAgICAgICAgPGVjaG8+b25jZSBmcm9tIGJ1aWxkZmlsZTwvZWNobz4KKyAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZXhlY3V0b3IueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9leGVjdXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwYzhkYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZXhlY3V0b3IueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3Q+CisgIDx0YXJnZXQgbmFtZT0iZm9vIj4KKyAgICA8ZWNobz5mb288L2VjaG8+CisgICAgPGZhaWwgaWY9ImZhaWxmb28iIG1lc3NhZ2U9ImZhaWxmb28iIC8+CisgIDwvdGFyZ2V0PgorICA8dGFyZ2V0IG5hbWU9ImEiIGRlcGVuZHM9ImZvbyI+CisgICAgPGVjaG8+YTwvZWNobz4KKyAgPC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0iYiIgZGVwZW5kcz0iZm9vIj4KKyAgICA8ZWNobz5iPC9lY2hvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZXh0ZW5kZWQtdGFza2RlZi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2V4dGVuZGVkLXRhc2tkZWYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Y2E5NzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2V4dGVuZGVkLXRhc2tkZWYueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iZXh0ZW5kZWQtdGFza2RlZiIgZGVmYXVsdD0idGVzdFJ1biI+CisKKyAgPGRlc2NyaXB0aW9uPgorICAgIFRyeSBhbmQgcmVwbGljYXRlIGEgcmVwb3J0ZWQgcHJvYmxlbS4KKworICA8L2Rlc2NyaXB0aW9uPgorICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iRm9vLmphdmEiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRhc2tkZWZzIiB2YWx1ZT0idGFza3MucHJvcGVydGllcyIvPgorCisgIDx0YXJnZXQgbmFtZT0id3JpdGUiID4KKyAgICA8ZWNobyBmaWxlPSIke3NyY30iPgorICAgICAgaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisgICAgICBwdWJsaWMgY2xhc3MgRm9vIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuV2FpdEZvciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICB0aHJvdyAgbmV3IEJ1aWxkRXhjZXB0aW9uKCJleGVjdXRpbmcgdGhlIEZvbyB0YXNrIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICA8L2VjaG8+CisgICAgPHByb3BlcnR5ZmlsZSBmaWxlPSIke3Rhc2tkZWZzfSI+CisgICAgICA8ZW50cnkga2V5PSJmb28yIiB2YWx1ZT0iRm9vIi8+CisgICAgPC9wcm9wZXJ0eWZpbGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0id3JpdGUiPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSIke3NyY30iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UnVuIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICA8dGFza2RlZiBuYW1lPSJmb28iIGNsYXNzbmFtZT0iRm9vIgorICAgICAgICBjbGFzc3BhdGg9IiR7YmFzZWRpcn0iLz4KKyAgICA8Zm9vIG1heHdhaXQ9IjUiIG1heHdhaXR1bml0PSJzZWNvbmQiCisgICAgICAgIHRpbWVvdXRwcm9wZXJ0eT0iZm9vIj4KKyAgICAgIDxvci8+CisgICAgPC9mb28+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJ1bjIiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDx0YXNrZGVmIHJlc291cmNlPSIke3Rhc2tkZWZzfSIgY2xhc3NwYXRoPSIke2Jhc2VkaXJ9Ii8+CisgICAgPGZvbzIgbWF4d2FpdD0iNSIgbWF4d2FpdHVuaXQ9InNlY29uZCIKKyAgICAgICAgdGltZW91dHByb3BlcnR5PSJmb28iPgorICAgICAgPG9yLz4KKyAgICA8L2ZvbzI+CisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyZG93biI+CisgICAgPGRlbGV0ZT4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIKKyAgICAgICAgICBpbmNsdWRlcz0iJHtzcmN9LCouY2xhc3MiLz4KKyAgICA8L2RlbGV0ZT4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7dGFza2RlZnN9IiAvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbW11dGFibGUueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbW11dGFibGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmRhMDgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2ltbXV0YWJsZS54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImltbXV0YWJsZS10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiIHZhbHVlPSJvcmlnaW5hbCIvPgorICAgIDxhdmFpbGFibGUgZmlsZT0iaW1tdXRhYmxlLnhtbCIgcHJvcGVydHk9InRlc3QiIHZhbHVlPSJvdmVycmlkZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KKyAgICA8dHN0YW1wLz4KKyAgICA8dHN0YW1wIHByZWZpeD0ic3RhcnQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPHByb3BlcnR5IG5hbWU9IkRTVEFNUCIgdmFsdWU9Im9yaWdpbmFsIi8+CisgICAgPHRzdGFtcC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0IiB2YWx1ZT0ib3JpZ2luYWwiLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0IiB2YWx1ZT0ib3ZlcnJpZGUiPgorICAgICAgPGVxdWFscyBhcmcxPSIxIiBhcmcyPSIxIi8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0IiB2YWx1ZT0ib3JpZ2luYWwiLz4KKyAgICA8Y2hlY2tzdW0gZmlsZT0iaW1tdXRhYmxlLnhtbCIgdmVyaWZ5UHJvcGVydHk9InRlc3QiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NiI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3QxIiB2YWx1ZT0ib3JpZ2luYWwiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdDIiIHZhbHVlPSJvcmlnaW5hbCIvPgorICAgIDwhLS0gIEhvdyB0byBtYWtlIHRoaXMgY3Jvc3MtcGxhdGZvcm0/IC0tPgorICAgIDxleGVjIGV4ZWN1dGFibGU9ImNtZC5leGUiIG9zPSJXaW5kb3dzIDIwMDAiIG91dHB1dHByb3BlcnR5PSJ0ZXN0MSIgcmVzdWx0UHJvcGVydHk9InRlc3QyIj4KKyAgICAgIDxhcmcgbGluZT0iL2MgZGlyIi8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q3Ij4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdCIgdmFsdWU9Im9yaWdpbmFsIi8+CisgICAgPHBhdGhjb252ZXJ0IHRhcmdldG9zPSJ1bml4IiBwcm9wZXJ0eT0idGVzdCIgPgorICAgICAgPHBhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iL2xpYi93ZWJsb2dpY2F1eC5qYXIiIC8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iL2NsYXNzZXMiIC8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iL21zc3Fsc2VydmVyNC9jbGFzc2VzIiAvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImM6XHdpbm50XFN5c3RlbTMyIiAvPgorICAgICAgPC9wYXRoPgorICAgIDwvcGF0aGNvbnZlcnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDgiPgorICAgIDxhbnRjYWxsIGluaGVyaXRBbGw9ImZhbHNlIiB0YXJnZXQ9ImVjaG8tdGFyZ2V0Ij4KKyAgICAgIDxwYXJhbSBuYW1lPSJlY2hvLnZhbHVlIiB2YWx1ZT0iTWVlcCBtZWVwISIgLz4KKyAgICA8L2FudGNhbGw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZWNoby10YXJnZXQiPgorICAgIDxlY2hvIG1lc3NhZ2U9IlZhbHVlIG9mIGVjaG89JHtlY2hvLnZhbHVlfSIvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL2luY2x1ZGUuaW5jIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL2luY2x1ZGUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDc5MmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvaW5jbHVkZS5pbmMKQEAgLTAsMCArMSwyMCBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8dGFyZ2V0IG5hbWU9InRlc3QxIj4KKyAgICA8ZWNobyBtZXNzYWdlPSJmcm9tIGluY2x1ZGVkIGVudGl0eSIvPgorPC90YXJnZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvaW5jbHVkZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvaW5jbHVkZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxMzFiMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9pbmNsdWRlLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCFET0NUWVBFIHByb2plY3QgWworICA8IUVOVElUWSBpbmNsdWRlIFNZU1RFTSAiZmlsZTouL2luY2x1ZGUuaW5jIj4KK10+CisKKzxwcm9qZWN0IG5hbWU9ImluY2x1ZGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorICAgICZpbmNsdWRlOworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL3JlbGF0aXZlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9yZWxhdGl2ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3Yzg0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9yZWxhdGl2ZS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKworPCFET0NUWVBFIHByb2plY3QgWworICA8IUVOVElUWSBpbmNsdWRlIFNZU1RFTSAiLi9pbmNsdWRlLmluYyI+CitdPgorCis8cHJvamVjdCBuYW1lPSJpbmNsdWRlLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KKyAgICAmaW5jbHVkZTsKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCAiYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L2luY2x1ZGUuaW5jIiAiYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L2luY2x1ZGUuaW5jIgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA3OTJkCi0tLSAvZGV2L251bGwKKysrICJiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvaW5jbHVkZS5pbmMiCkBAIC0wLDAgKzEsMjAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGVjaG8gbWVzc2FnZT0iZnJvbSBpbmNsdWRlZCBlbnRpdHkiLz4KKzwvdGFyZ2V0PgpkaWZmIC0tZ2l0ICJhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvaW5jbHVkZS54bWwiICJiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvaW5jbHVkZS54bWwiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGExNWMKLS0tIC9kZXYvbnVsbAorKysgImIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9pbmNsdWRlLnhtbCIKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKworPCFET0NUWVBFIHByb2plY3QgWworICA8IUVOVElUWSBpbmNsdWRlIFNZU1RFTSAiZmlsZTppbmNsdWRlLmluYyI+CitdPgorCis8cHJvamVjdCBuYW1lPSJpbmNsdWRlLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KKyAgICAmaW5jbHVkZTsKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCAiYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L3JlbGF0aXZlLnhtbCIgImIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9yZWxhdGl2ZS54bWwiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YmJjOWUKLS0tIC9kZXYvbnVsbAorKysgImIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9yZWxhdGl2ZS54bWwiCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisKKzwhRE9DVFlQRSBwcm9qZWN0IFsKKyAgPCFFTlRJVFkgaW5jbHVkZSBTWVNURU0gImluY2x1ZGUuaW5jIj4KK10+CisKKzxwcm9qZWN0IG5hbWU9ImluY2x1ZGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorICAgICZpbmNsdWRlOworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0ICJhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvc2ltcGxlLnhtbCIgImIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9zaW1wbGUueG1sIgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzM3MjM0Ci0tLSAvZGV2L251bGwKKysrICJiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvc2ltcGxlLnhtbCIKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImluY2x1ZGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGVjaG8gbWVzc2FnZT0iZnJvbSBzaW1wbGUgYnVpbGRmaWxlIi8+Cis8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRlZF9maWxlX3BhcnNlX2Vycm9yL2J1aWxkLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRlZF9maWxlX3BhcnNlX2Vycm9yL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU3NDdjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfcGFyc2VfZXJyb3IvYnVpbGQueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIHByb2plY3QgWworICAgIDwhRU5USVRZIGluY2x1ZGVkX2ZpbGUgU1lTVEVNICJmaWxlOi4vaW5jbHVkZWRfZmlsZS54bWwiPgorXT4KKworPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0idGVzdCIgYmFzZWRpcj0iLiI+CisKKyAgPHRhcmdldCBuYW1lPSJzZXR1cCI+CisgIDwvdGFyZ2V0PgorCisgICZpbmNsdWRlZF9maWxlOworCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0iaW5jbHVkZWQtdGFyZ2V0Ij4KKyAgICA8ZWNobz50ZXN0IHRhcmdldCByYW4uPC9lY2hvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfcGFyc2VfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkZWRfZmlsZV9wYXJzZV9lcnJvci9pbmNsdWRlZF9maWxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmJkM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfcGFyc2VfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dGFyZ2V0IG5hbWU9ImluY2x1ZGVkLXRhcmdldCI+CisgIGV4dHJhbmVvdXNfdGV4dAorICA8ZWNobz5pbmNsdWRlZC10YXJnZXQgcmFuLjwvZWNobz4KKzwvdGFyZ2V0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfdGFza19lcnJvci9idWlsZC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkZWRfZmlsZV90YXNrX2Vycm9yL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU3NDdjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfdGFza19lcnJvci9idWlsZC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgcHJvamVjdCBbCisgICAgPCFFTlRJVFkgaW5jbHVkZWRfZmlsZSBTWVNURU0gImZpbGU6Li9pbmNsdWRlZF9maWxlLnhtbCI+CitdPgorCis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIj4KKworICA8dGFyZ2V0IG5hbWU9InNldHVwIj4KKyAgPC90YXJnZXQ+CisKKyAgJmluY2x1ZGVkX2ZpbGU7CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJpbmNsdWRlZC10YXJnZXQiPgorICAgIDxlY2hvPnRlc3QgdGFyZ2V0IHJhbi48L2VjaG8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkZWRfZmlsZV90YXNrX2Vycm9yL2luY2x1ZGVkX2ZpbGUueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfdGFza19lcnJvci9pbmNsdWRlZF9maWxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDBkMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfdGFza19lcnJvci9pbmNsdWRlZF9maWxlLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0YXJnZXQgbmFtZT0iaW5jbHVkZWQtdGFyZ2V0Ij4KKyAgPGNvcHkgZmlsZT0ibm9uZXhpc3RlbnQtZmlsZSIgdG9kaXI9Ii9ub24vZXhpc3RlbnQvZGlyIi8+CisgIDxlY2hvPmluY2x1ZGVkLXRhcmdldCByYW4uPC9lY2hvPgorPC90YXJnZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfcGFyc2VfZXJyb3IvYnVpbGQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3BhcnNlX2Vycm9yL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU1MjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3BhcnNlX2Vycm9yL2J1aWxkLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBwcm9qZWN0IFsKKyAgICA8IUVOVElUWSBpbmNsdWRlZF9maWxlIFNZU1RFTSAiZmlsZTouL2luY2x1ZGVkX2ZpbGUueG1sIj4KK10+CisKKzxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iPgorCisgIDx0YXJnZXQgbmFtZT0ic2V0dXAiPgorICA8L3RhcmdldD4KKworICAmaW5jbHVkZWRfZmlsZTsKKworICBleHRyYW5lb3VzX3RleHQKKworICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImluY2x1ZGVkLXRhcmdldCI+CisgICAgPGVjaG8+dGVzdCB0YXJnZXQgcmFuLjwvZWNobz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRpbmdfZmlsZV9wYXJzZV9lcnJvci9pbmNsdWRlZF9maWxlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRpbmdfZmlsZV9wYXJzZV9lcnJvci9pbmNsdWRlZF9maWxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjA3YmJjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3BhcnNlX2Vycm9yL2luY2x1ZGVkX2ZpbGUueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHRhcmdldCBuYW1lPSJpbmNsdWRlZC10YXJnZXQiPgorICA8ZWNobz5pbmNsdWRlZC10YXJnZXQgcmFuLjwvZWNobz4KKzwvdGFyZ2V0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3Rhc2tfZXJyb3IvYnVpbGQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3Rhc2tfZXJyb3IvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4N2I4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfdGFza19lcnJvci9idWlsZC54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgcHJvamVjdCBbCisgICAgPCFFTlRJVFkgaW5jbHVkZWRfZmlsZSBTWVNURU0gImZpbGU6Li9pbmNsdWRlZF9maWxlLnhtbCI+CitdPgorCis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIj4KKworICA8dGFyZ2V0IG5hbWU9InNldHVwIj4KKyAgPC90YXJnZXQ+CisKKyAgJmluY2x1ZGVkX2ZpbGU7CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJpbmNsdWRlZC10YXJnZXQiPgorICAgIDxjb3B5IGZpbGU9Im5vbmV4aXN0ZW50LWZpbGUiIHRvZGlyPSIvbm9uL2V4aXN0ZW50L2RpciIvPgorICAgIDxlY2hvPnRlc3QgdGFyZ2V0IHJhbi48L2VjaG8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfdGFza19lcnJvci9pbmNsdWRlZF9maWxlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRpbmdfZmlsZV90YXNrX2Vycm9yL2luY2x1ZGVkX2ZpbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDdiYmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfdGFza19lcnJvci9pbmNsdWRlZF9maWxlLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0YXJnZXQgbmFtZT0iaW5jbHVkZWQtdGFyZ2V0Ij4KKyAgPGVjaG8+aW5jbHVkZWQtdGFyZ2V0IHJhbi48L2VjaG8+Cis8L3RhcmdldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL2luY2x1ZGUuaW5jIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvaW5jbHVkZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmZDYzOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL2luY2x1ZGUuaW5jCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxlY2hvIG1lc3NhZ2U9ImZyb20gaW5jbHVkZWQgZW50aXR5IGluICZhcG9zO3dpdGggc3BhY2UmYXBvczsiLz4KKzwvdGFyZ2V0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvaW5jbHVkZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvd2l0aCBzcGFjZS9pbmNsdWRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY5M2NkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvaW5jbHVkZS54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhRE9DVFlQRSBwcm9qZWN0IFsKKyAgPCFFTlRJVFkgaW5jbHVkZSBTWVNURU0gImZpbGU6aW5jbHVkZS5pbmMiPgorXT4KKworPHByb2plY3QgbmFtZT0iaW5jbHVkZS10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisgICAgJmluY2x1ZGU7Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvd2l0aCBzcGFjZS9yZWxhdGl2ZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvd2l0aCBzcGFjZS9yZWxhdGl2ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmNTAyYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL3JlbGF0aXZlLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCFET0NUWVBFIHByb2plY3QgWworICA8IUVOVElUWSBpbmNsdWRlIFNZU1RFTSAiaW5jbHVkZS5pbmMiPgorXT4KKworPHByb2plY3QgbmFtZT0iaW5jbHVkZS10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisgICAgJmluY2x1ZGU7Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvd2l0aCBzcGFjZS9zaW1wbGUueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2Uvc2ltcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDkyY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2Uvc2ltcGxlLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9ImluY2x1ZGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KKyAgICA8ZWNobyBtZXNzYWdlPSJmcm9tIHNpbXBsZSBidWlsZGZpbGUgaW4gJmFwb3M7d2l0aCBzcGFjZSZhcG9zOyIvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvbG9hZGVycmVmL2xvYWRlcnJlZi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvYWRlcnJlZi9sb2FkZXJyZWYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNmVmZTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvYWRlcnJlZi9sb2FkZXJyZWYueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJsb2FkZXJyZWYtdGVzdCIgZGVmYXVsdD0iaGVscCI+CisKKyAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iY2xhc3NlcyIvPgorCisgIDx0YXJnZXQgbmFtZT0iaGVscCI+CisgICAgPGVjaG8+CitUaGlzIGJ1aWxkIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgdGVzdGluZyBBbnQKKyAgICA8L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2NsYXNzZXMuZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiPgorICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0YmFkcmVmIiBkZXBlbmRzPSJjb21waWxlIiA+CisgICAgPHRhc2tkZWYgbG9hZGVycmVmPSJsb2FkZXJyZWYtdGVzdCIKKyAgICAgICAgICAgICBuYW1lPSJ0ZXN0MSIKKyAgICAgICAgICAgICBjbGFzc25hbWU9IlRlc3QxIgorICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvbG9hZGVycmVmL3NyYy9UYXNrMS5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9sb2FkZXJyZWYvc3JjL1Rhc2sxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzNzRiZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvbG9hZGVycmVmL3NyYy9UYXNrMS5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCitwdWJsaWMgY2xhc3MgVGFzazEgZXh0ZW5kcyBUYXNrIHsKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9sb2NhdGlvbi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvY2F0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThmNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9sb2NhdGlvbi54bWwKQEAgLTAsMCArMSw3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJsb2NhdGlvbiIgZGVmYXVsdD0iYWxsIj4KKyAgPHRhcmdldCBuYW1lPSJhbGwiPgorICAgIDxmYWlsPk9ubHkgdXNlIHRoaXMgYnVpbGQgZmlsZSBmcm9tIHdpdGhpbiB0ZXN0czwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UGxhaW5UYXNrIj4KKyAgICA8ZWNobyBpZD0iZWNobyI+SGVsbG88L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFN0YW5kYWxvbmVUeXBlIj4KKyAgICA8ZWNobyBpZD0iZWNobzIiPkhlbGxvPC9lY2hvPgorICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIuIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENvbmRpdGlvblRhc2siPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImZvbyIgaWQ9ImNvbmQiPgorICAgICAgPGVxdWFscyBhcmcxPSJiYXIiIGFyZzI9ImJheiIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRlZmluZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzIgorICAgICAgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KKyAgICA8dGFza2RlZiBuYW1lPSJlY2hvbG9jIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5Mb2NhdGlvblRlc3QkRWNob0xvY2F0aW9uIj4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Y2xhc3Nlc30iIC8+CisgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvdGFza2RlZj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtYWNyb2RlZiIgZGVwZW5kcz0iZGVmaW5lIj4KKyAgICA8bWFjcm9kZWYgbmFtZT0iZWNob2xvYzIiIGJhY2t0cmFjZT0iZmFsc2UiPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvbG9jLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RNYWNyb2RlZldyYXBwZWRUYXNrIiBkZXBlbmRzPSJtYWNyb2RlZiI+CisgICAgPGVjaG8gaWQ9ImVjaG8zIj5IZWxsbzwvZWNobz4KKyAgICA8ZWNob2xvYzIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InByZXNldGRlZiIgZGVwZW5kcz0iZGVmaW5lIj4KKyAgICA8cHJlc2V0ZGVmIG5hbWU9ImVjaG9sb2MzIj4KKyAgICAgIDxlY2hvbG9jLz4KKyAgICA8L3ByZXNldGRlZj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UHJlc2V0ZGVmV3JhcHBlZFRhc2siIGRlcGVuZHM9InByZXNldGRlZiI+CisgICAgPGVjaG8gaWQ9ImVjaG80Ij5IZWxsbzwvZWNobz4KKyAgICA8ZWNob2xvYzMvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdGFza2NvbnRhaW5lci54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3Rhc2tjb250YWluZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkY2ExMmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3Rhc2tjb250YWluZXIueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0iZG9udC1ydW4tdGhpcyI+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+CisgIAorICA8dGFyZ2V0IG5hbWU9ImRvbnQtcnVuLXRoaXMiPgorICAgIDxmYWlsPlRoaXMgYnVpbGQgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSBydW4gYnkgYSBVbml0IHRlc3Q8L2ZhaWw+CisgIDwvdGFyZ2V0PgorIAorCisgIDx0YXJnZXQgbmFtZT0idGVzdFByb3BlcnR5RXhwYW5zaW9uIj4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb28iIHZhbHVlPSJpdCB3b3JrZWQiLz4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9IkFzIGF0dHJpYnV0ZTogJHtmb299Ii8+CisgICAgICA8ZWNobz5BcyBuZXN0ZWQgdGV4dDogJHtmb299PC9lY2hvPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VGFza2RlZiI+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPGphdmFjIHNyY2Rpcj0iY29udGFpbmVyc3JjIiBkZXN0ZGlyPSIke2J1aWxkLmRpcn0iIGRlYnVnPSJvbiIvPgorCisgICAgPHNlcXVlbnRpYWw+ICAgIAorICAgICAgPHRhc2tkZWYgbmFtZT0ic3NlcSIgY2xhc3NwYXRoPSIke2J1aWxkLmRpcn0iIGNsYXNzbmFtZT0idGVzdC5TcGVjaWFsU2VxIi8+CisgICAgICA8c3NlcT4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIuIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb28iIHZhbHVlPSJpdCB3b3JrZWQiLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iQXMgYXR0cmlidXRlOiAke2Zvb30iLz4KKyAgICAgICAgPGVjaG8+QXMgbmVzdGVkIHRleHQ6ICR7Zm9vfTwvZWNobz4KKyAgICAgICAgPG5lc3RlZCBtZXNzYWdlPSJBcyBuZXN0ZWQgdGFzazogJHtmb299Ii8+CisgICAgICA8L3NzZXE+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDYXNlSW5zZW5zaXRpdmUiPgorICAgIDx0YXNrZGVmIG5hbWU9IlByYXR0bGUiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobyIvPiAgCisgICAgPHRhc2tkZWYgbmFtZT0iU2VxIiAgCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TZXF1ZW50aWFsIi8+ICAKKyAgICA8UHJhdHRsZT5oZWxsbzwvUHJhdHRsZT4gIAorICAgIDxTZXE+ICAKKyAgICAgIDxQcmF0dGxlPiB3b3JsZDwvUHJhdHRsZT4gIAorICAgIDwvU2VxPiAgCisgIDwvdGFyZ2V0PiAgCisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdG9wbGV2ZWx0YXNrcy9ub3RhcmdldC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3Mvbm90YXJnZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDM3NTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3Mvbm90YXJnZXQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0iZm9vIj4KKyAgPGVjaG8gbWVzc2FnZT0iQ2FsbGVkIiAvPgorICA8dGFyZ2V0IG5hbWU9ImZvbyIgLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdG9wbGV2ZWx0YXNrcy90YXJnZXRsZXZlbGFudC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3MvdGFyZ2V0bGV2ZWxhbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMWJiMWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3MvdGFyZ2V0bGV2ZWxhbnQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZm9vIj4KKyAgPHRhcmdldCBuYW1lPSJmb28iPgorICAgIDxhbnQgYW50ZmlsZT0ibm90YXJnZXQueG1sIiAvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdG9wbGV2ZWx0YXNrcy90b3BsZXZlbGFudC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3MvdG9wbGV2ZWxhbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OGFkNmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3MvdG9wbGV2ZWxhbnQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZm9vIj4KKyAgPGFudCBhbnRmaWxlPSJub3RhcmdldC54bWwiIC8+CisgIDx0YXJnZXQgbmFtZT0iZm9vIiAvPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS91bmtub3duZWxlbWVudC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3Vua25vd25lbGVtZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDk3MGFjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS91bmtub3duZWxlbWVudC54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TWF5YmVDb25maWd1cmUiPgorICAgIDx0YXNrZGVmIG5hbWU9InBhcmVudCIgCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5Vbmtub3duRWxlbWVudFRlc3QkUGFyZW50IgorICAgICAgICAgICAgIGxvYWRlcnJlZj0idW5rbm93bi5pZCI+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L3Rhc2tkZWY+CisgICAgPHRhc2tkZWYgbmFtZT0iY2hpbGQiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5Vbmtub3duRWxlbWVudFRlc3QkQ2hpbGQiCisgICAgICAgICAgICAgbG9hZGVycmVmPSJ1bmtub3duLmlkIi8+CisgICAgPHBhcmVudD4KKyAgICAgIDxjaGlsZC8+CisgICAgICA8Y2hpbGQvPgorICAgIDwvcGFyZW50PgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvYnVpbGQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlNjlmYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImNsZWFudXAiIGJhc2VkaXI9Ii4iPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgPG1rZGlyIGRpcj0icmVzdWx0IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZGlyPSJyZXN1bHQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TGluZUNvbnRhaW5zIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSB0b2Rpcj0icmVzdWx0Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iaW5wdXQiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaW5lY29udGFpbnMudGVzdCIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5MaW5lQ29udGFpbnMiPgorICAgICAgICAgIDxwYXJhbSB0eXBlPSJjb250YWlucyIgdmFsdWU9ImJldGEiLz4KKyAgICAgICAgPC9maWx0ZXJyZWFkZXI+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgICA8IS0tPGZpeGNybGYgc3JjZGlyPSJyZXN1bHQiIGVvbD0ibGYiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGluZWNvbnRhaW5zLnRlc3QiLz4KKyAgICA8L2ZpeGNybGY+LS0+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TmVnYXRlTGluZUNvbnRhaW5zIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9saW5lY29udGFpbnMudGVzdCIKKyAgICAgICAgICB0b2ZpbGU9InJlc3VsdC9uZWdhdGVsaW5lY29udGFpbnMudGVzdCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkxpbmVDb250YWlucyI+CisgICAgICAgICAgPHBhcmFtIHR5cGU9Im5lZ2F0ZSIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICA8cGFyYW0gdHlwZT0iY29udGFpbnMiIHZhbHVlPSJiZXRhIi8+CisgICAgICAgIDwvZmlsdGVycmVhZGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxmaWxlc21hdGNoIGZpbGUxPSJyZXN1bHQvbmVnYXRlbGluZWNvbnRhaW5zLnRlc3QiCisgICAgICAgICAgICAgICAgICAgICAgZmlsZTI9ImV4cGVjdGVkL25lZ2F0ZWxpbmVjb250YWlucy50ZXN0IiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RFc2NhcGVVbmljb2RlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSB0b2Rpcj0icmVzdWx0IiBlbmNvZGluZz0iVVRGLTgiPgorICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImVzY2FwZXVuaWNvZGUudGVzdCIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8ZXNjYXBldW5pY29kZS8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9InJlc3VsdCIgZW9sPSJjcmxmIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImVzY2FwZXVuaWNvZGUudGVzdCIvPgorICAgIDwvZml4Y3JsZj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U3RyaXBKYXZhQ29tbWVudHMiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IHRvZGlyPSJyZXN1bHQiPgorICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCIgaW5jbHVkZXM9InN0cmlwamF2YWNvbW1lbnRzLnRlc3QiIC8+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlN0cmlwSmF2YUNvbW1lbnRzIiAvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlcGxhY2VUb2tlbnMiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IHRvZGlyPSJyZXN1bHQiPgorICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCIgaW5jbHVkZXM9InJlcGxhY2V0b2tlbnMudGVzdCIgLz4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHJlcGxhY2V0b2tlbnM+CisgICAgICAgICAgPHRva2VuIGtleT0iZm9vIiB2YWx1ZT0iIi8+CisgICAgICAgIDwvcmVwbGFjZXRva2Vucz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZXBsYWNlVG9rZW5zUHJvcGVydHlGaWxlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSB0b2ZpbGU9InJlc3VsdC9yZXBsYWNldG9rZW5zUHJvcGVydHlGaWxlLnRlc3QiPgorICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCIgaW5jbHVkZXM9InJlcGxhY2V0b2tlbnMudGVzdCIgLz4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKwk8ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5SZXBsYWNlVG9rZW5zIj4KKyAgICAgICAgICA8cGFyYW0gdHlwZT0icHJvcGVydGllc2ZpbGUiIHZhbHVlPSIke2Jhc2VkaXJ9L2lucHV0L3NhbXBsZS5wcm9wZXJ0aWVzIi8+CisgICAgCTwvZmlsdGVycmVhZGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vQWRkTmV3TGluZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L25vbmwiPlRoaXMgaGFzIG5vIG5ldyBsaW5lczwvY29uY2F0PgorICAgIDxjb3B5IGZpbGU9InJlc3VsdC9ub25sIiB0b2ZpbGU9InJlc3VsdC9ub25sLWNvcHlmaWx0ZXIiPgorICAgICAgPGZpbHRlcmNoYWluPjx0b2tlbmZpbHRlci8+PC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZmlsdGVyY2hhaW4uZmlsZXMuYXJlLnNhbWUiPgorICAgICAgPGZpbGVzbWF0Y2ggZmlsZTE9InJlc3VsdC9ub25sIiBmaWxlMj0icmVzdWx0L25vbmwtY29weWZpbHRlciIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxmYWlsIHVubGVzcz0iZmlsdGVyY2hhaW4uZmlsZXMuYXJlLnNhbWUiPkZpbGUgd2FzIG1vZGlmaWVkPC9mYWlsPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9jb25jYXQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9jb25jYXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTEwNjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2NvbmNhdC54bWwKQEAgLTAsMCArMSwxMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0iY2xlYW51cCIgYmFzZWRpcj0iLiI+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8bWtkaXIgZGlyPSJyZXN1bHQiIC8+CisgICAgPGVjaG8gZmlsZT0icmVzdWx0L3ByZXBlbmQudHh0IiBtZXNzYWdlPSJ0aGlzLXNob3VsZC1iZS10aGUtZmlyc3QtbGluZSR7bGluZS5zZXBhcmF0b3J9Ii8+CisgICAgPGVjaG8gZmlsZT0icmVzdWx0L2FwcGVuZC50eHQiIG1lc3NhZ2U9InRoaXMtc2hvdWxkLWJlLXRoZS1sYXN0LWxpbmUke2xpbmUuc2VwYXJhdG9yfSIvPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L2hlYWQtdGFpbC50ZXN0IiB0b2ZpbGU9ImlucHV0L2NvbmNhdGZpbHRlci50ZXN0Ii8+CisgICAgPGZpeGNybGYgc3JjRGlyPSJpbnB1dCIgaW5jbHVkZXM9ImNvbmNhdGZpbHRlci50ZXN0Ii8+CisgICAgPCEtLSB0byBiZSBjb25zaXN0ZW50IG9uIE1hY09TIFguICBmaXhjcmxmIHVzZXMgQ1Igd2hpbGUgbGluZS5zZXAgaXMgTEYgLS0+CisgICAgPGZpeGNybGYgc3JjRGlyPSJyZXN1bHQiIGluY2x1ZGVzPSJhcHBlbmQudHh0LHByZXBlbmQudHh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBkaXI9InJlc3VsdCIvPgorICAgIDxkZWxldGU+CisgICAgICA8ZmlsZXNldCBkaXI9ImlucHV0IiBpbmNsdWRlcz0iY29uY2F0ZmlsdGVyLnRlc3QiLz4KKyAgICA8L2RlbGV0ZT4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXJSZWFkZXJOb0FyZ3MiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L2NvbmNhdGZpbHRlci50ZXN0IgorICAgICAgICAgIHRvZmlsZT0icmVzdWx0L2NvbmNhdC5GaWx0ZXJSZWFkZXJOb0FyZ3MudGVzdCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkNvbmNhdEZpbHRlciIvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbHRlclJlYWRlclByZXBlbmQiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L2NvbmNhdGZpbHRlci50ZXN0IgorICAgICAgICAgIHRvZmlsZT0icmVzdWx0L2NvbmNhdC5GaWx0ZXJSZWFkZXJQcmVwZW5kLnRlc3QiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5Db25jYXRGaWx0ZXIiPgorICAgICAgICAgIDxwYXJhbSBuYW1lPSJwcmVwZW5kIiB2YWx1ZT0icmVzdWx0L3ByZXBlbmQudHh0Ii8+CisgICAgICAgIDwvZmlsdGVycmVhZGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbHRlclJlYWRlckFwcGVuZCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvY29uY2F0ZmlsdGVyLnRlc3QiCisgICAgICAgICAgdG9maWxlPSJyZXN1bHQvY29uY2F0LkZpbHRlclJlYWRlckFwcGVuZC50ZXN0Ij4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGZpbHRlcnJlYWRlciBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuQ29uY2F0RmlsdGVyIj4KKyAgICAgICAgICA8cGFyYW0gbmFtZT0iYXBwZW5kIiB2YWx1ZT0icmVzdWx0L2FwcGVuZC50eHQiLz4KKyAgICAgICAgPC9maWx0ZXJyZWFkZXI+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsdGVyUmVhZGVyUHJlcGVuZEFwcGVuZCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvY29uY2F0ZmlsdGVyLnRlc3QiCisgICAgICAgICAgdG9maWxlPSJyZXN1bHQvY29uY2F0LkZpbHRlclJlYWRlclByZXBlbmRBcHBlbmQudGVzdCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkNvbmNhdEZpbHRlciI+CisgICAgICAgICAgPHBhcmFtIG5hbWU9InByZXBlbmQiIHZhbHVlPSJyZXN1bHQvcHJlcGVuZC50eHQiLz4KKyAgICAgICAgICA8cGFyYW0gbmFtZT0iYXBwZW5kIiAgdmFsdWU9InJlc3VsdC9hcHBlbmQudHh0Ii8+CisgICAgICAgIDwvZmlsdGVycmVhZGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENvbmNhdEZpbHRlciIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHR5cGVkZWYgbmFtZT0iY29uY2F0ZmlsdGVyIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuQ29uY2F0RmlsdGVyIi8+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvY29uY2F0ZmlsdGVyLnRlc3QiCisgICAgICAgICAgdG9maWxlPSJyZXN1bHQvY29uY2F0LkNvbmNhdEZpbHRlci50ZXN0Ij4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGNvbmNhdGZpbHRlci8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q29uY2F0RmlsdGVyUHJlcGVuZCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHR5cGVkZWYgbmFtZT0iY29uY2F0ZmlsdGVyIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuQ29uY2F0RmlsdGVyIi8+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvY29uY2F0ZmlsdGVyLnRlc3QiCisgICAgICAgICAgdG9maWxlPSJyZXN1bHQvY29uY2F0LkNvbmNhdEZpbHRlclByZXBlbmQudGVzdCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxjb25jYXRmaWx0ZXIgcHJlcGVuZD0icmVzdWx0L3ByZXBlbmQudHh0Ii8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q29uY2F0RmlsdGVyQXBwZW5kIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8dHlwZWRlZiBuYW1lPSJjb25jYXRmaWx0ZXIiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5Db25jYXRGaWx0ZXIiLz4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9jb25jYXRmaWx0ZXIudGVzdCIKKyAgICAgICAgICB0b2ZpbGU9InJlc3VsdC9jb25jYXQuQ29uY2F0RmlsdGVyQXBwZW5kLnRlc3QiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8Y29uY2F0ZmlsdGVyIGFwcGVuZD0icmVzdWx0L2FwcGVuZC50eHQiLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDb25jYXRGaWx0ZXJQcmVwZW5kQXBwZW5kIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8dHlwZWRlZiBuYW1lPSJjb25jYXRmaWx0ZXIiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5Db25jYXRGaWx0ZXIiLz4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9jb25jYXRmaWx0ZXIudGVzdCIKKyAgICAgICAgICB0b2ZpbGU9InJlc3VsdC9jb25jYXQuQ29uY2F0RmlsdGVyUHJlcGVuZEFwcGVuZC50ZXN0Ij4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGNvbmNhdGZpbHRlciBwcmVwZW5kPSJyZXN1bHQvcHJlcGVuZC50eHQiIGFwcGVuZD0icmVzdWx0L2FwcGVuZC50eHQiLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9keW5hbWljZmlsdGVyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZHluYW1pY2ZpbHRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5MWUxZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZHluYW1pY2ZpbHRlci54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJjbGVhbnVwIiBiYXNlZGlyPSIuIj4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgIDxta2RpciBkaXI9InJlc3VsdCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVsZXRlIGRpcj0icmVzdWx0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZHluYW1pY2ZpbHRlciI+CisgICAgPHBhdGggaWQ9InRlc3QtY2xhc3NlcyI+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KKyAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgICAgPC9wYXRoPgorICAgIDx0eXBlZGVmIAorICAgICAgbmFtZT0iY3VzdG9tZmlsdGVyIiAKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5EeW5hbWljRmlsdGVyVGVzdCRDdXN0b21GaWx0ZXIiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC1jbGFzc2VzIi8+CisgICAgPC90eXBlZGVmPgorICAgIAorICAgIDxjb25jYXQgZGVzdGZpbGU9InJlc3VsdC9pbnB1dCI+CisgICAgICBoZWxsbyB3b3JsZAorICAgIDwvY29uY2F0PgorCisgICAgPGNvcHkgZmlsZT0icmVzdWx0L2lucHV0IiB0b2ZpbGU9InJlc3VsdC9keW5hbWljZmlsdGVyIj4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGN1c3RvbWZpbHRlciByZXBsYWNlPSJvIiB3aXRoPSJPIi8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvZXNjYXBldW5pY29kZS50ZXN0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9lc2NhcGV1bmljb2RlLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlZGU5OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvZXNjYXBldW5pY29kZS50ZXN0CkBAIC0wLDAgKzEsOSBAQAorI2hlYnJldyBzaGFsb20gb2xhbSAoaGVsbG8gd29ybGQpDQordGV4dC5oZWJyZXc9XHUwNWU5XHUwNWRjXHUwNWQ1XHUwNWRkIFx1MDVlMlx1MDVkNVx1MDVkY1x1MDVkZA0KKyNnb2V0aGUgZ2luZ2tvIGJpbG9iYQ0KK3RleHQuZ2VybWFuLjE9U3BcdTAwZmNyc3QgZHUgbmljaHQgYW4gbWVpbmVuIExpZWRlcm4sDQordGV4dC5nZXJtYW4uMj1EYVx1MDBkZiBpY2ggZWlucyB1bmQgZG9wcGVsdCBiaW4gPw0KKyMgRnJhbmNvaXMgVmlsbG9uIEJhbGxhZGUgZGVzIFBlbmR1cw0KK3RleHQuZnJlbmNoPUZyXHUwMGU4cmVzIGh1bWFpbnMgcXVpIGFwclx1MDBlOHMgbm91cyB2aXZleg0KKyMgVXN1YWwgSVQgZXhhbXBsZQ0KK3RleHQuYmFzaWMubGF0aW49SGVsbG8gV29ybGQgDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwuaGVhZC50ZXN0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwuaGVhZC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC5oZWFkLnRlc3QKQEAgLTAsMCArMSwxMCBAQAorTGluZSAgMQorTGluZSAgMgorTGluZSAgMworTGluZSAgNAorTGluZSAgNQorTGluZSAgNgorTGluZSAgNworTGluZSAgOAorTGluZSAgOQorTGluZSAxMApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwuaGVhZEFsbFNraXAudGVzdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvaGVhZC10YWlsLmhlYWRBbGxTa2lwLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmZmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvaGVhZC10YWlsLmhlYWRBbGxTa2lwLnRlc3QKQEAgLTAsMCArMSw1OCBAQAorTGluZSAgMworTGluZSAgNAorTGluZSAgNQorTGluZSAgNgorTGluZSAgNworTGluZSAgOAorTGluZSAgOQorTGluZSAxMAorTGluZSAxMQorTGluZSAxMgorTGluZSAxMworTGluZSAxNAorTGluZSAxNQorTGluZSAxNgorTGluZSAxNworTGluZSAxOAorTGluZSAxOQorTGluZSAyMAorTGluZSAyMQorTGluZSAyMgorTGluZSAyMworTGluZSAyNAorTGluZSAyNQorTGluZSAyNgorTGluZSAyNworTGluZSAyOAorTGluZSAyOQorTGluZSAzMAorTGluZSAzMQorTGluZSAzMgorTGluZSAzMworTGluZSAzNAorTGluZSAzNQorTGluZSAzNgorTGluZSAzNworTGluZSAzOAorTGluZSAzOQorTGluZSA0MAorTGluZSA0MQorTGluZSA0MgorTGluZSA0MworTGluZSA0NAorTGluZSA0NQorTGluZSA0NgorTGluZSA0NworTGluZSA0OAorTGluZSA0OQorTGluZSA1MAorTGluZSA1MQorTGluZSA1MgorTGluZSA1MworTGluZSA1NAorTGluZSA1NQorTGluZSA1NgorTGluZSA1NworTGluZSA1OAorTGluZSA1OQorTGluZSA2MApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwuaGVhZExpbmVzLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC5oZWFkTGluZXMudGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGZhOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwuaGVhZExpbmVzLnRlc3QKQEAgLTAsMCArMSwyIEBACitMaW5lICAxCitMaW5lICAyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC5oZWFkTGluZXNTa2lwLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC5oZWFkTGluZXNTa2lwLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjYjIzNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvaGVhZC10YWlsLmhlYWRMaW5lc1NraXAudGVzdApAQCAtMCwwICsxLDIgQEAKK0xpbmUgIDMKK0xpbmUgIDQKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvaGVhZC10YWlsLmhlYWRTa2lwLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC5oZWFkU2tpcC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjE3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC5oZWFkU2tpcC50ZXN0CkBAIC0wLDAgKzEsMTAgQEAKK0xpbmUgIDMKK0xpbmUgIDQKK0xpbmUgIDUKK0xpbmUgIDYKK0xpbmUgIDcKK0xpbmUgIDgKK0xpbmUgIDkKK0xpbmUgMTAKK0xpbmUgMTEKK0xpbmUgMTIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvaGVhZC10YWlsLmhlYWR0YWlsLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC5oZWFkdGFpbC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2IyMzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC5oZWFkdGFpbC50ZXN0CkBAIC0wLDAgKzEsMiBAQAorTGluZSAgMworTGluZSAgNApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwudGFpbC50ZXN0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwudGFpbC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTNkYzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC50YWlsLnRlc3QKQEAgLTAsMCArMSwxMCBAQAorTGluZSA1MQorTGluZSA1MgorTGluZSA1MworTGluZSA1NAorTGluZSA1NQorTGluZSA1NgorTGluZSA1NworTGluZSA1OAorTGluZSA1OQorTGluZSA2MApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwudGFpbEFsbFNraXAudGVzdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWxBbGxTa2lwLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyY2YwMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWxBbGxTa2lwLnRlc3QKQEAgLTAsMCArMSw1OCBAQAorTGluZSAgMQorTGluZSAgMgorTGluZSAgMworTGluZSAgNAorTGluZSAgNQorTGluZSAgNgorTGluZSAgNworTGluZSAgOAorTGluZSAgOQorTGluZSAxMAorTGluZSAxMQorTGluZSAxMgorTGluZSAxMworTGluZSAxNAorTGluZSAxNQorTGluZSAxNgorTGluZSAxNworTGluZSAxOAorTGluZSAxOQorTGluZSAyMAorTGluZSAyMQorTGluZSAyMgorTGluZSAyMworTGluZSAyNAorTGluZSAyNQorTGluZSAyNgorTGluZSAyNworTGluZSAyOAorTGluZSAyOQorTGluZSAzMAorTGluZSAzMQorTGluZSAzMgorTGluZSAzMworTGluZSAzNAorTGluZSAzNQorTGluZSAzNgorTGluZSAzNworTGluZSAzOAorTGluZSAzOQorTGluZSA0MAorTGluZSA0MQorTGluZSA0MgorTGluZSA0MworTGluZSA0NAorTGluZSA0NQorTGluZSA0NgorTGluZSA0NworTGluZSA0OAorTGluZSA0OQorTGluZSA1MAorTGluZSA1MQorTGluZSA1MgorTGluZSA1MworTGluZSA1NAorTGluZSA1NQorTGluZSA1NgorTGluZSA1NworTGluZSA1OApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwudGFpbExpbmVzLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC50YWlsTGluZXMudGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUwNjczCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9oZWFkLXRhaWwudGFpbExpbmVzLnRlc3QKQEAgLTAsMCArMSwyIEBACitMaW5lIDU5CitMaW5lIDYwCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC50YWlsTGluZXNTa2lwLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC50YWlsTGluZXNTa2lwLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3NDZkMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWxMaW5lc1NraXAudGVzdApAQCAtMCwwICsxLDIgQEAKK0xpbmUgNTcKK0xpbmUgNTgKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWxTa2lwLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC50YWlsU2tpcC50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MGVlZWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2hlYWQtdGFpbC50YWlsU2tpcC50ZXN0CkBAIC0wLDAgKzEsMTAgQEAKK0xpbmUgNDkKK0xpbmUgNTAKK0xpbmUgNTEKK0xpbmUgNTIKK0xpbmUgNTMKK0xpbmUgNTQKK0xpbmUgNTUKK0xpbmUgNTYKK0xpbmUgNTcKK0xpbmUgNTgKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvbGluZWNvbnRhaW5zLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2xpbmVjb250YWlucy50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYmFhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2xpbmVjb250YWlucy50ZXN0CkBAIC0wLDAgKzEsNCBAQAorVGhpcyBpcyBsaW5lIDIgd2l0aCBiZXRhLgorVGhpcyBpcyBsaW5lIDMgd2l0aCBiZXRhLgorVGhpcyBpcyBsaW5lIDUgd2l0aCBiZXRhLgorVGhpcyBpcyBsaW5lIDcgd2l0aCBiZXRhLgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9uZWdhdGVsaW5lY29udGFpbnMudGVzdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvbmVnYXRlbGluZWNvbnRhaW5zLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0MzdlOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvbmVnYXRlbGluZWNvbnRhaW5zLnRlc3QKQEAgLTAsMCArMSwzIEBACitUaGlzIGlzIGxpbmUgMSB3aXRoIGFscGhhLgorVGhpcyBpcyBsaW5lIDQgd2l0aCBnYW1tYS4KK1RoaXMgaXMgbGluZSA2IHdpdGggZGVsdGEuCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL3JlcGxhY2V0b2tlbnMudGVzdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvcmVwbGFjZXRva2Vucy50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjY0NzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL3JlcGxhY2V0b2tlbnMudGVzdApAQCAtMCwwICsxLDIgQEAKKzEyCiszCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL3N0cmlwamF2YWNvbW1lbnRzLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL3N0cmlwamF2YWNvbW1lbnRzLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkMDY3MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvc3RyaXBqYXZhY29tbWVudHMudGVzdApAQCAtMCwwICsxLDE5IEBACisKKworIAorcHVibGljIGNsYXNzIE5vcm1hbExpbmUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgd2l0aENvbW1lbnQ7IAorCisgICAgCisgICAgcHVibGljIHZvaWQgZG9Ob3RoaW5nKCkgeworICAgICAgICAKKyAgICAgICAgaW50IGk7CisgICAgICAgIAorICAgICAgICBpbnQgajsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB1cmwgPSAiaHR0cDovL2FudC5hcGFjaGUub3JnLyI7IAorICAgIHByaXZhdGUgU3RyaW5nIHVybDIgPSAiXCJodHRwOi8vYW50LmFwYWNoZS5vcmcvXCIiOyAKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9oZWFkLXRhaWwueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9oZWFkLXRhaWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2hlYWQtdGFpbC54bWwKQEAgLTAsMCArMSwxNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0iY2xlYW51cCIgYmFzZWRpcj0iLiI+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8bWtkaXIgZGlyPSJyZXN1bHQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBkaXI9InJlc3VsdCIvPgorICA8L3RhcmdldD4KKworICA8IS0tIFRlc3RjYXNlcyBmb3IgSGVhZEZpbHRlciAtLT4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RIZWFkIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9oZWFkLXRhaWwudGVzdCIgdG9maWxlPSJyZXN1bHQvaGVhZC10YWlsLmhlYWQudGVzdCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxoZWFkZmlsdGVyLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RIZWFkTGluZXMiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L2hlYWQtdGFpbC50ZXN0IiB0b2ZpbGU9InJlc3VsdC9oZWFkLXRhaWwuaGVhZExpbmVzLnRlc3QiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8aGVhZGZpbHRlciBsaW5lcz0iMiIvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEhlYWRTa2lwIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9oZWFkLXRhaWwudGVzdCIgdG9maWxlPSJyZXN1bHQvaGVhZC10YWlsLmhlYWRTa2lwLnRlc3QiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8aGVhZGZpbHRlciBza2lwPSIyIi8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SGVhZExpbmVzU2tpcCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvaGVhZC10YWlsLnRlc3QiIHRvZmlsZT0icmVzdWx0L2hlYWQtdGFpbC5oZWFkTGluZXNTa2lwLnRlc3QiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8aGVhZGZpbHRlciBsaW5lcz0iMiIgc2tpcD0iMiIvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbHRlclJlYWRlckhlYWRMaW5lc1NraXAiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L2hlYWQtdGFpbC50ZXN0IiAKKyAgICAgICAgICB0b2ZpbGU9InJlc3VsdC9oZWFkLXRhaWwuZmlsdGVyUmVhZGVySGVhZExpbmVzU2tpcC50ZXN0Ij4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGZpbHRlcnJlYWRlciBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuSGVhZEZpbHRlciI+CisgICAgICAgICAgPHBhcmFtIG5hbWU9ImxpbmVzIiB2YWx1ZT0iMiIvPgorICAgICAgICAgIDxwYXJhbSBuYW1lPSJza2lwIiB2YWx1ZT0iMiIvPgorICAgICAgICA8L2ZpbHRlcnJlYWRlcj4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RIZWFkQWxsU2tpcCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvaGVhZC10YWlsLnRlc3QiIHRvZmlsZT0icmVzdWx0L2hlYWQtdGFpbC5oZWFkQWxsU2tpcC50ZXN0Ij4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGhlYWRmaWx0ZXIgbGluZXM9Ii0xIiBza2lwPSIyIi8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBUZXN0Y2FzZXMgZm9yIFRhaWxGaWx0ZXIgLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VGFpbCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvaGVhZC10YWlsLnRlc3QiIHRvZmlsZT0icmVzdWx0L2hlYWQtdGFpbC50YWlsLnRlc3QiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8dGFpbGZpbHRlci8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VGFpbExpbmVzIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9oZWFkLXRhaWwudGVzdCIgdG9maWxlPSJyZXN1bHQvaGVhZC10YWlsLnRhaWxMaW5lcy50ZXN0Ij4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRhaWxmaWx0ZXIgbGluZXM9IjIiLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RUYWlsU2tpcCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvaGVhZC10YWlsLnRlc3QiIHRvZmlsZT0icmVzdWx0L2hlYWQtdGFpbC50YWlsU2tpcC50ZXN0Ij4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRhaWxmaWx0ZXIgc2tpcD0iMiIvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFRhaWxMaW5lc1NraXAiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L2hlYWQtdGFpbC50ZXN0IiB0b2ZpbGU9InJlc3VsdC9oZWFkLXRhaWwudGFpbExpbmVzU2tpcC50ZXN0Ij4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRhaWxmaWx0ZXIgbGluZXM9IjIiIHNraXA9IjIiLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXJSZWFkZXJUYWlsTGluZXNTa2lwIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9oZWFkLXRhaWwudGVzdCIgCisgICAgICAgICAgdG9maWxlPSJyZXN1bHQvaGVhZC10YWlsLmZpbHRlclJlYWRlclRhaWxMaW5lc1NraXAudGVzdCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlRhaWxGaWx0ZXIiPgorICAgICAgICAgIDxwYXJhbSBuYW1lPSJsaW5lcyIgdmFsdWU9IjIiLz4KKyAgICAgICAgICA8cGFyYW0gbmFtZT0ic2tpcCIgdmFsdWU9IjIiLz4KKyAgICAgICAgPC9maWx0ZXJyZWFkZXI+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VGFpbEFsbFNraXAiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L2hlYWQtdGFpbC50ZXN0IiB0b2ZpbGU9InJlc3VsdC9oZWFkLXRhaWwudGFpbEFsbFNraXAudGVzdCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDx0YWlsZmlsdGVyIGxpbmVzPSItMSIgc2tpcD0iMiIvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gVGVzdGNhc2VzIGZvciBjb21iaW5lZCBzY2VuYXJpb3MgLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SGVhZFRhaWwiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L2hlYWQtdGFpbC50ZXN0IiB0b2ZpbGU9InJlc3VsdC9oZWFkLXRhaWwuaGVhZHRhaWwudGVzdCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxoZWFkZmlsdGVyIGxpbmVzPSI0Ii8+CisgICAgICAgIDx0YWlsZmlsdGVyIGxpbmVzPSIyIi8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvZXNjYXBldW5pY29kZS50ZXN0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9pbnB1dC9lc2NhcGV1bmljb2RlLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMTE3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvZXNjYXBldW5pY29kZS50ZXN0CkBAIC0wLDAgKzEsOSBAQAorI2hlYnJldyBzaGFsb20gb2xhbSAoaGVsbG8gd29ybGQpDQordGV4dC5oZWJyZXc916nXnNeV150g16LXldec150NCisjZ29ldGhlIGdpbmdrbyBiaWxvYmENCit0ZXh0Lmdlcm1hbi4xPVNww7xyc3QgZHUgbmljaHQgYW4gbWVpbmVuIExpZWRlcm4sDQordGV4dC5nZXJtYW4uMj1EYcOfIGljaCBlaW5zIHVuZCBkb3BwZWx0IGJpbiA/DQorIyBGcmFuY29pcyBWaWxsb24gQmFsbGFkZSBkZXMgUGVuZHVzDQordGV4dC5mcmVuY2g9RnLDqHJlcyBodW1haW5zIHF1aSBhcHLDqHMgbm91cyB2aXZleg0KKyMgVXN1YWwgSVQgZXhhbXBsZQ0KK3RleHQuYmFzaWMubGF0aW49SGVsbG8gV29ybGQgDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9pbnB1dC9oZWFkLXRhaWwuc21hbGwudGVzdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvaGVhZC10YWlsLnNtYWxsLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxZjFkNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvaGVhZC10YWlsLnNtYWxsLnRlc3QKQEAgLTAsMCArMSw1IEBACitMaW5lICAxCitMaW5lICAyCitMaW5lICAzCitMaW5lICA0CitMaW5lICA1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9pbnB1dC9oZWFkLXRhaWwudGVzdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvaGVhZC10YWlsLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhYzc2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvaGVhZC10YWlsLnRlc3QKQEAgLTAsMCArMSw2MCBAQAorTGluZSAgMQorTGluZSAgMgorTGluZSAgMworTGluZSAgNAorTGluZSAgNQorTGluZSAgNgorTGluZSAgNworTGluZSAgOAorTGluZSAgOQorTGluZSAxMAorTGluZSAxMQorTGluZSAxMgorTGluZSAxMworTGluZSAxNAorTGluZSAxNQorTGluZSAxNgorTGluZSAxNworTGluZSAxOAorTGluZSAxOQorTGluZSAyMAorTGluZSAyMQorTGluZSAyMgorTGluZSAyMworTGluZSAyNAorTGluZSAyNQorTGluZSAyNgorTGluZSAyNworTGluZSAyOAorTGluZSAyOQorTGluZSAzMAorTGluZSAzMQorTGluZSAzMgorTGluZSAzMworTGluZSAzNAorTGluZSAzNQorTGluZSAzNgorTGluZSAzNworTGluZSAzOAorTGluZSAzOQorTGluZSA0MAorTGluZSA0MQorTGluZSA0MgorTGluZSA0MworTGluZSA0NAorTGluZSA0NQorTGluZSA0NgorTGluZSA0NworTGluZSA0OAorTGluZSA0OQorTGluZSA1MAorTGluZSA1MQorTGluZSA1MgorTGluZSA1MworTGluZSA1NAorTGluZSA1NQorTGluZSA1NgorTGluZSA1NworTGluZSA1OAorTGluZSA1OQorTGluZSA2MApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9pbnB1dC9saW5lY29udGFpbnMudGVzdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvbGluZWNvbnRhaW5zLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1YjU1MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvbGluZWNvbnRhaW5zLnRlc3QKQEAgLTAsMCArMSw3IEBACitUaGlzIGlzIGxpbmUgMSB3aXRoIGFscGhhLgorVGhpcyBpcyBsaW5lIDIgd2l0aCBiZXRhLgorVGhpcyBpcyBsaW5lIDMgd2l0aCBiZXRhLgorVGhpcyBpcyBsaW5lIDQgd2l0aCBnYW1tYS4KK1RoaXMgaXMgbGluZSA1IHdpdGggYmV0YS4KK1RoaXMgaXMgbGluZSA2IHdpdGggZGVsdGEuCitUaGlzIGlzIGxpbmUgNyB3aXRoIGJldGEuCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2lucHV0L3JlcGxhY2V0b2tlbnMudGVzdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvcmVwbGFjZXRva2Vucy50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjA4ODcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2lucHV0L3JlcGxhY2V0b2tlbnMudGVzdApAQCAtMCwwICsxLDIgQEAKKzFAZm9vQDIKKzMKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvc2FtcGxlLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2lucHV0L3NhbXBsZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MmU3OWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2lucHV0L3NhbXBsZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTYgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZm9vPQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9pbnB1dC9zdHJpcGphdmFjb21tZW50cy50ZXN0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9pbnB1dC9zdHJpcGphdmFjb21tZW50cy50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTM1YmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2lucHV0L3N0cmlwamF2YWNvbW1lbnRzLnRlc3QKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCB0ZXh0CisgKiBoYXMgdG8gYmUgcmVtb3ZlZAorICovCisKKy8qKgorICogSmF2YURvYyB0ZXh0IGFib3V0IHRoZSBjbGFzcy4KKyAqIGhhcyB0byBiZSByZW1vdmVkCisgKi8gCitwdWJsaWMgY2xhc3MgTm9ybWFsTGluZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyB3aXRoQ29tbWVudDsgLy8gdGhpcyBjb21tZW50IHNob3VsZCBiZSByZW1vdmVkCisKKyAgICAvKiB0aGlzIGNvbW1lbnQKKyAgICAgKiBzaG91bGQgYmUKKyAgICAgKiByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9Ob3RoaW5nKCkgeworICAgICAgICAvLyB0aGlzIGNvbW1lbnQgc2hvdWxkIGJlIHJlbW92ZWQKKyAgICAgICAgaW50IGk7CisgICAgICAgIC8qIHRoaXMgY29tbWVudAorICAgICAgICAgICBzaG91bGQgYmUgcmVtb3ZlZAorICAgICAgICAqLworICAgICAgICBpbnQgajsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB1cmwgPSAiaHR0cDovL2FudC5hcGFjaGUub3JnLyI7IC8vIHZlcnkgZGlmZmljdWx0IQorICAgIHByaXZhdGUgU3RyaW5nIHVybDIgPSAiXCJodHRwOi8vYW50LmFwYWNoZS5vcmcvXCIiOyAvLyBldmVuIHdvcnNlCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvdG9rZW5maWx0ZXIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy90b2tlbmZpbHRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiMGI4YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvdG9rZW5maWx0ZXIueG1sCkBAIC0wLDAgKzEsMzU5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImNsZWFudXAiIGJhc2VkaXI9Ii4iPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgPG1rZGlyIGRpcj0icmVzdWx0IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZGlyPSJyZXN1bHQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0b2tlbmZpbHRlciI+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvbGluZWNvbnRhaW5zLnRlc3QiIHRvZmlsZT0icmVzdWx0L2ZpbGUxIj4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRva2VuZmlsdGVyLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRyaW1pZ25vcmUiPgorICAgIDxjb25jYXQgZGVzdGZpbGU9InJlc3VsdC9pbnB1dCI+CisgICAgICBIZWxsbworICAgICAgCisgICAgICBXb3JsZAorICAgIDwvY29uY2F0PgorICAgIDxjb3B5IGZpbGU9InJlc3VsdC9pbnB1dCIgdG9maWxlPSJyZXN1bHQvb3V0cHV0IiBvdmVyd3JpdGU9InllcyI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDx0b2tlbmZpbHRlciBkZWxpbW91dHB1dD0iLSI+CisgICAgICAgICAgPHRyaW0vPgorICAgICAgICAgIDxpZ25vcmVibGFuay8+CisgICAgICAgIDwvdG9rZW5maWx0ZXI+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgICA8Y29uY2F0PgorICAgICAgPGZpbGVsaXN0IGRpcj0iLiIgZmlsZXM9InJlc3VsdC9vdXRwdXQiLz4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0cmltZmlsZSI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L3RyaW1maWxlIj4KKyAgICAgIFRoaXMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmltbWVkIGZpbGUuCisgICAgICBUaGlzIGlzIHRoZSBzZWNvbmQgbGluZS4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRyaW0gYnlsaW5lPSJubyIvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0cmltZmlsZWJ5bGluZSI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L3RyaW1maWxlYnlsaW5lIj4KKyAgICAgIFRoaXMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmltbWVkIGZpbGUuCisgICAgICBUaGlzIGlzIHRoZSBzZWNvbmQgbGluZS4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRyaW0vPgorICAgICAgICA8dG9rZW5maWx0ZXIgZGVsaW1vdXRwdXQ9IlxuIi8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZpbHRlcnJlcGxhY2VzdHJpbmciPgorICAgIDxjb25jYXQgZGVzdGZpbGU9InJlc3VsdC9maWx0ZXJyZXBsYWNlc3RyaW5nIj4KKyAgICAgIFRoaXMgaXMgZm9vIGJhcgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJmb28iIHRvPSJ0aGUiLz4KKyAgICAgICAgPHJlcGxhY2VzdHJpbmcgZnJvbT0iYmFyIiB0bz0ibW9vbiIvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmaWx0ZXJyZXBsYWNlc3RyaW5ncyI+CisgICAgPGNvbmNhdD4KKyAgICAgIGZvbyBmb28gZm9vCisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxyZXBsYWNlc3RyaW5nIGZyb209ImZvbyIgdG89ImJhciIvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzdHJpbmd0b2tlbml6ZXIiPgorICAgIDxjb25jYXQgZGVzdGZpbGU9InJlc3VsdC9pbnB1dCI+CisgICAgICBUaGlzIGlzIGEgbnVtYmVyCisgICAgICBvZiB3b3JkcworICAgIDwvY29uY2F0PgorICAgIDxjb3B5IGZpbGU9InJlc3VsdC9pbnB1dCIgdG9maWxlPSJyZXN1bHQvb3V0cHV0IiBvdmVyd3JpdGU9InllcyI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDx0b2tlbmZpbHRlciBkZWxpbW91dHB1dD0iIyI+CisgICAgICAgICAgPHN0cmluZ3Rva2VuaXplci8+CisgICAgICAgIDwvdG9rZW5maWx0ZXI+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgICA8Y29uY2F0PgorICAgICAgPGZpbGVsaXN0IGRpcj0iLiIgZmlsZXM9InJlc3VsdC9vdXRwdXQiLz4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ1bml4bGluZW91dHB1dCI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L3VuaXhsaW5lb3V0cHV0Ij4KKyAgICAgIFRoaXMgaXMgYSBudW1iZXIKKyAgICAgIG9mIHdvcmRzCisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDx0b2tlbmZpbHRlciBkZWxpbW91dHB1dD0iXG4iPgorICAgICAgICAgIDxzdHJpbmd0b2tlbml6ZXIvPgorICAgICAgICA8L3Rva2VuZmlsdGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkb3NsaW5lb3V0cHV0Ij4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJyZXN1bHQvZG9zbGluZW91dHB1dCI+CisgICAgICBUaGlzIGlzIGEgbnVtYmVyCisgICAgICBvZiB3b3JkcworICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8dG9rZW5maWx0ZXIgZGVsaW1vdXRwdXQ9IlxyXG4iPgorICAgICAgICAgIDxzdHJpbmd0b2tlbml6ZXIvPgorICAgICAgICA8L3Rva2VuZmlsdGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmaWxldG9rZW5pemVyIj4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJyZXN1bHQvaW5wdXQiPgorICAgICAgVGhpcyBpcyBhIG51bWJlcgorICAgICAgb2Ygd29yZHMKKyAgICA8L2NvbmNhdD4KKyAgICA8Y29weSBmaWxlPSJyZXN1bHQvaW5wdXQiIHRvZmlsZT0icmVzdWx0L2ZpbGV0b2tlbml6ZXIiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8dG9rZW5maWx0ZXI+CisgICAgICAgICAgPGZpbGV0b2tlbml6ZXIvPgorICAgICAgICAgIDx0cmltLz4KKyAgICAgICAgPC90b2tlbmZpbHRlcj4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlcGxhY2VzdHJpbmciPgorICAgIDxjb25jYXQgZGVzdGZpbGU9InJlc3VsdC9yZXBsYWNlc3RyaW5nIj4KKyAgICAgIHRoaXMgaXMgdGhlIHN1bgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8dG9rZW5maWx0ZXI+CisgICAgICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJzdW4iIHRvPSJtb29uIi8+CisgICAgICAgIDwvdG9rZW5maWx0ZXI+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlcGxhY2VzdHJpbmdzIj4KKyAgICA8Y29uY2F0PgorICAgICAgZm9vIGZvbyBmb28KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRva2VuZmlsdGVyPgorICAgICAgICAgIDxyZXBsYWNlc3RyaW5nIGZyb209ImZvbyIgdG89ImJhciIvPgorICAgICAgICA8L3Rva2VuZmlsdGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb250YWluc3N0cmluZyI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L2lucHV0Ij4KKyAgICAgIHRoaXMgaXMgYSBsaW5lIGNvbnRhaW5zIGZvbworICAgICAgdGhpcyBsaW5lIGRvZXMgbm90CisgICAgPC9jb25jYXQ+CisgICAgPGNvcHkgZmlsZT0icmVzdWx0L2lucHV0IiB0b2ZpbGU9InJlc3VsdC9jb250YWluc3N0cmluZyI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDx0b2tlbmZpbHRlcj4KKyAgICAgICAgICA8Y29udGFpbnNzdHJpbmcgY29udGFpbnM9ImZvbyIvPgorICAgICAgICA8L3Rva2VuZmlsdGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gbmVlZCB0byBjaGVjayBmb3IgZXhpc3RhbmNlIG9mIHJlZ2V4IC0tPgorICA8dGFyZ2V0IG5hbWU9InJlcGxhY2VyZWdleCI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L2lucHV0Ij4KKyAgICAgIGhlbGxvIEhlbGxvIEhFTExPIGhlbGxvCisgICAgICBjYXQgQ2F0IGNhdAorICAgICAgU3VuIFN1biBTdW4KKyAgICAgIFdoaXRlU3BhY2UgCXRhYgorICAgICAgVGhpcyBpcyBhIGxpbmUgd2l0aCBkaWdpdHMgLSAxMjM0IC0tIHRoZXJlCisgICAgPC9jb25jYXQ+CisgICAgPGNvcHkgZmlsZT0icmVzdWx0L2lucHV0IiB0b2ZpbGU9InJlc3VsdC9yZXBsYWNlcmVnZXgiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8dG9rZW5maWx0ZXI+CisgICAgICAgICAgPHJlcGxhY2VyZWdleCBwYXR0ZXJuPSJoZWxsbyIgcmVwbGFjZT0id29ybGQiIGZsYWdzPSJnaSIvPgorICAgICAgICAgIDxyZXBsYWNlcmVnZXggcGF0dGVybj0iY2F0IiByZXBsYWNlPSJkb2ciIGZsYWdzPSJnIi8+CisgICAgICAgICAgPHJlcGxhY2VyZWdleCBwYXR0ZXJuPSJzdW4iIHJlcGxhY2U9Im1vb24iIGZsYWdzPSJpIi8+CisgICAgICAgICAgPHJlcGxhY2VyZWdleCBwYXR0ZXJuPSJXaGl0ZVNwYWNlWyBcdF0rdGFiIgorICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT0iZm91bmQgV2hpdGVTcGFjZSIvPgorICAgICAgICAgIDxyZXBsYWNlcmVnZXggcGF0dGVybj0iVGhpcyBpcyBhIGxpbmUgd2l0aCBkaWcuKiAoWzAtOV0rKS4qIgorICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT0iRm91bmQgZGlnaXRzIFtcMV0iLz4KKyAgICAgICAgPC90b2tlbmZpbHRlcj4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZpbHRlcnJlcGxhY2VyZWdleCI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L2ZpbHRlcnJlcGxhY2VyZWdleCI+CisgICAgICBoZWxsbyBIZWxsbyBIRUxMTyBoZWxsbworICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8cmVwbGFjZXJlZ2V4IHBhdHRlcm49ImhlbGxvIiByZXBsYWNlPSJ3b3JsZCIgZmxhZ3M9ImdpIi8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvbGxlcm1hdGNoIj4KKyAgICA8Y29uY2F0PgorICAgICAgQGhlbGxvQAorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8cmVwbGFjZXJlZ2V4IHBhdHRlcm49IkAoW15AXSopQCIgcmVwbGFjZT0iJHtcMX0iLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gbmVlZCB0byBjaGVjayBmb3IgZXhpc3RhbmNlIG9mIHJlZ2V4IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNvbnRhaW5zcmVnZXgiPgorICAgIDxjb25jYXQgZGVzdGZpbGU9InJlc3VsdC9pbnB1dCI+CisgICAgICBoZWxsbyB3b3JsZAorICAgICAgdGhpcyBpcyB0aGUgbW9vbgorICAgICAgV29ybGQgaGVyZQorICAgIDwvY29uY2F0PgorICAgIDxjb3B5IGZpbGU9InJlc3VsdC9pbnB1dCIgdG9maWxlPSJyZXN1bHQvY29udGFpbnNyZWdleCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDx0b2tlbmZpbHRlcj4KKyAgICAgICAgICA8Y29udGFpbnNyZWdleCBwYXR0ZXJuPSIoaGVsbG98d29ybGQpIiBmbGFncz0iaSIvPgorICAgICAgICA8L3Rva2VuZmlsdGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmlsdGVyY29udGFpbnNyZWdleCI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L2ZpbHRlcmNvbnRhaW5zcmVnZXgiPgorICAgICAgaGVsbG8gd29ybGQKKyAgICAgIHRoaXMgaXMgdGhlIG1vb24KKyAgICAgIFdvcmxkIGhlcmUKKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRva2VuZmlsdGVyPgorICAgICAgICAgIDxjb250YWluc3JlZ2V4IHBhdHRlcm49IihoZWxsb3x3b3JsZCkiIGZsYWdzPSJpIi8+CisgICAgICAgIDwvdG9rZW5maWx0ZXI+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gbmVlZCB0byBjaGVjayBmb3IgZXhpc3RhbmNlIG9mIHJlZ2V4IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNvbnRhaW5zcmVnZXgyIj4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJyZXN1bHQvaW5wdXQiPgorICAgICAgU1VJVEUoVGVzdFN1aXRlLCBiaXRzKTsKKyAgICAgIGhlcmUKKyAgICA8L2NvbmNhdD4KKyAgICA8Y29weSBmaWxlPSJyZXN1bHQvaW5wdXQiIHRvZmlsZT0icmVzdWx0L2NvbnRhaW5zcmVnZXgyIj4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRva2VuZmlsdGVyPgorICAgICAgICAgIDxjb250YWluc3JlZ2V4CisgICAgICAgICAgICBwYXR0ZXJuPSJeICpTVUlURVwoLiosXHMqKC4qKVxzKlwpLioiCisgICAgICAgICAgICByZXBsYWNlPSJ2b2lkIHJlZ2lzdGVyX1wxKCk7Ii8+CisgICAgICAgIDwvdG9rZW5maWx0ZXI+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkZWxldGVjaGFyYWN0ZXJzIj4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJyZXN1bHQvZGVsZXRlY2hhcnMiPgorICAgICAgVGhpcyBpcyBzb21lICMjIyBzCisgICAgICBzb21lICoqKioKKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRva2VuZmlsdGVyPgorICAgICAgICAgIDxkZWxldGVjaGFyYWN0ZXJzIGNoYXJzPSIjIi8+CisgICAgICAgIDwvdG9rZW5maWx0ZXI+CisgICAgICAgIDxkZWxldGVjaGFyYWN0ZXJzIGNoYXJzPSIqIi8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNjcmlwdGZpbHRlciI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L2lucHV0Ij4KKyAgICAgIGhlbGxvIHdvcmxkCisgICAgPC9jb25jYXQ+CisgICAgPGNvcHkgZmlsZT0icmVzdWx0L2lucHV0IiB0b2ZpbGU9InJlc3VsdC9zY3JpcHRmaWx0ZXIiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8dG9rZW5maWx0ZXI+CisgICAgICAgICAgPHNjcmlwdGZpbHRlciBsYW5ndWFnZT0iamF2YXNjcmlwdCI+CisgICAgICAgICAgICBzZWxmLnNldFRva2VuKHNlbGYuZ2V0VG9rZW4oKS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgICA8L3NjcmlwdGZpbHRlcj4KKyAgICAgICA8L3Rva2VuZmlsdGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2NyaXB0ZmlsdGVyMiI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0icmVzdWx0L2lucHV0Ij4KKyAgICAgIGhlbGxvIG1vb24KKyAgICA8L2NvbmNhdD4KKyAgICA8Y29weSBmaWxlPSJyZXN1bHQvaW5wdXQiIHRvZmlsZT0icmVzdWx0L3NjcmlwdGZpbHRlcjIiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8c2NyaXB0ZmlsdGVyIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgICAgICBzZWxmLnNldFRva2VuKHNlbGYuZ2V0VG9rZW4oKS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgPC9zY3JpcHRmaWx0ZXI+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjdXN0b210b2tlbmZpbHRlciI+CisgICAgPHBhdGggaWQ9InRlc3QtY2xhc3NlcyI+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KKyAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgICAgPC9wYXRoPgorCisKKyAgICA8dHlwZWRlZiAKKyAgICAgIG5hbWU9ImNhcGl0YWxpemUiIAorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlRva2VuRmlsdGVyVGVzdCRDYXBpdGFsaXplIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QtY2xhc3NlcyIvPgorICAgIDwvdHlwZWRlZj4KKyAgICAKKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJyZXN1bHQvaW5wdXQiPgorICAgICAgaGVsbG8gd29ybGQKKyAgICA8L2NvbmNhdD4KKworICAgIDxjb3B5IGZpbGU9InJlc3VsdC9pbnB1dCIgdG9maWxlPSJyZXN1bHQvY3VzdG9tIj4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHRva2VuZmlsdGVyPgorICAgICAgICAgIDxzdHJpbmd0b2tlbml6ZXIvPgorICAgICAgICAgIDxjYXBpdGFsaXplLz4KKyAgICAgICA8L3Rva2VuZmlsdGVyPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaGFzc2NyaXB0Ij4KKyAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgIGkgPSAxOworICAgIDwvc2NyaXB0PgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iaGFzcmVnZXgiPgorICAgIDxjb25jYXQgZGVzdGZpbGU9InJlc3VsdC9yZXBsYWNlcmVnZXhwIj4KKyAgICAgIGhlbGxvIHdvcmxkCisgICAgPC9jb25jYXQ+CisgICAgPHJlcGxhY2VyZWdleHAgZmlsZT0icmVzdWx0L3JlcGxhY2VyZWdleHAiCisgICAgICAgICAgICAgICAgICBtYXRjaD0iaGVsbG8oICl3b3JsZCIKKyAgICAgICAgICAgICAgICAgIHJlcGxhY2U9ImJ5ZVwxd29ybGQiLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Fic3RyYWN0Y3ZzdGFzay54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hYnN0cmFjdGN2c3Rhc2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWJmNmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hYnN0cmFjdGN2c3Rhc2sueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJhYnN0cmFjdGN2c3Rhc2stdGVzdCIgYmFzZWRpcj0iLi4vLi4vLi4vLi4vIiAKKyAgICAgICAgIGRlZmF1bHQ9ImFsbCI+CisKKyAgPHByb3BlcnR5IG5hbWU9ImZpbGUiIHZhbHVlPSJhbnQucHJvcGVydGllcy5zYW1wbGUiIC8+CisgIDx0YXJnZXQgbmFtZT0iYWxsIj4KKyAgICA8Y3ZzIGZhaWxvbmVycm9yPSJ0cnVlIiBjb21tYW5kPSJzdGF0dXMgJHtmaWxlfSIvPgorICAgIDxjdnMgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGNvbW1hbmRsaW5lPgorICAgICAgICA8YXJndW1lbnQgdmFsdWU9InVwIi8+CisgICAgICAgIDxhcmd1bWVudCB2YWx1ZT0iLXIiLz4KKyAgICAgICAgPGFyZ3VtZW50IHZhbHVlPSIxLjEiLz4KKyAgICAgICAgPGFyZ3VtZW50IHZhbHVlPSIke2ZpbGV9Ii8+CisgICAgICA8L2NvbW1hbmRsaW5lPgorICAgIDwvY3ZzPgorICAgIDxjdnMgZmFpbG9uZXJyb3I9InRydWUiIGNvbW1hbmQ9InN0YXR1cyAke2ZpbGV9Ii8+CisgICAgPGN2cyBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8Y29tbWFuZGxpbmU+CisgICAgICAgIDxhcmd1bWVudCBsaW5lPSJ1cCAtciBIRUFEICR7ZmlsZX0iIC8+CisgICAgICA8L2NvbW1hbmRsaW5lPgorICAgIDwvY3ZzPgorICAgIDxjdnMgZmFpbG9uZXJyb3I9InRydWUiIGNvbW1hbmQ9InN0YXR1cyAke2ZpbGV9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icGFja2FnZS1hdHRyaWJ1dGUiPgorICAgIDxta2RpciBkaXI9InRtcGRpciIgLz4KKyAgICA8Y3ZzIGN2c3Jvb3Q9Ijpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIgorICAgICAgICAgcGFja2FnZT0iYW50L2J1aWxkLnhtbCIKKyAgICAgICAgIGRlc3Q9InRtcGRpciIKKyAgICAgICAgIHF1aWV0PSJ0cnVlIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRhZy1hdHRyaWJ1dGUiPgorICAgIDxta2RpciBkaXI9InRtcGRpciIgLz4KKyAgICA8Y3ZzIGN2c3Jvb3Q9Ijpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIgorICAgICAgICAgcGFja2FnZT0iYW50L2J1aWxkLnhtbCIKKyAgICAgICAgIGRlc3Q9InRtcGRpciIKKyAgICAgICAgIHF1aWV0PSJ0cnVlIgorICAgICAgICAgdGFnPSJBTlRfMTQxIiAvPgorICAgIDxjdnMgY3Zzcm9vdD0iOnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMiCisgICAgICAgICBwYWNrYWdlPSJhbnQvYnVpbGQueG1sIgorICAgICAgICAgZGVzdD0idG1wZGlyIgorICAgICAgICAgY29tbWFuZD0ic3RhdHVzIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBkaXI9InRtcGRpciIgLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQudG9wbGV2ZWx0ZXN0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudC50b3BsZXZlbHRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YmM3MjkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQudG9wbGV2ZWx0ZXN0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0PgorICA8ZWNobz5IZWxsbyB3b3JsZDwvZWNobz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMmRjNGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQueG1sCkBAIC0wLDAgKzEsMjU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0iYW50LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KKworICA8cGF0aCBpZD0iaW5oZXJpdGFibGUiPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgIDwvcGF0aD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZmlsZT0idGVzdDEubG9nIiAvPgorICAgIDxkZWxldGUgZmlsZT0idGVzdDIubG9nIiAvPgorICAgIDxkZWxldGUgZmlsZT0iYW50L3Rlc3QzLmxvZyIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9ImFudC90ZXN0NC5sb2ciIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJ0ZXN0MSx0ZXN0Mix0ZXN0Myx0ZXN0NCIvPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCIgZGlyPSIuIiB0YXJnZXQ9InRlc3QxIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxhbnRjYWxsLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPGFudGNhbGwgdGFyZ2V0PSJ0ZXN0MyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q0YiI+CisgICAgPGFudGNhbGwgdGFyZ2V0PSJkb2VzLW5vdC1leGlzdCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9ImR1bW15Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDYiPgorICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCIgZGlyPSIuIiB0YXJnZXQ9ImR1bW15Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZHVtbXkiPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaGVyaXRCYXNlZGlyIj4KKyAgICA8YW50IGFudGZpbGU9ImFudC9hbnQueG1sIiB0YXJnZXQ9ImR1bW15IiBpbmhlcml0QWxsPSJ0cnVlIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvTm90SW5oZXJpdEJhc2VkaXIiPgorICAgIDxhbnQgYW50ZmlsZT0iYW50L2FudC54bWwiIHRhcmdldD0iZHVtbXkiIGluaGVyaXRBbGw9ImZhbHNlIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImV4cGxpY2l0QmFzZWRpcjEiPgorICAgIDxhbnQgYW50ZmlsZT0idGFza2RlZnMvYW50L2FudC54bWwiIHRhcmdldD0iZHVtbXkiIGluaGVyaXRBbGw9InRydWUiIAorICAgICAgICAgZGlyPSIuLiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJleHBsaWNpdEJhc2VkaXIyIj4KKyAgICA8YW50IGFudGZpbGU9InRhc2tkZWZzL2FudC9hbnQueG1sIiB0YXJnZXQ9ImR1bW15IiBpbmhlcml0QWxsPSJmYWxzZSIgCisgICAgICAgICBkaXI9Ii4uIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRyaXBsZUNhbGwiPgorICAgIDxhbnQgYW50ZmlsZT0iYW50L2FudC54bWwiIHRhcmdldD0iY2FsbGJhY2siIGluaGVyaXRBbGw9ImZhbHNlIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJbmhlcml0Ij4KKyAgICA8YW50IGFudGZpbGU9ImFudC9yZWZlcmVuY2VzLnhtbCIgaW5oZXJpdFJlZnM9InRydWUiIHRhcmdldD0iZHVtbXkiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vSW5oZXJpdCI+CisgICAgPGFudCBhbnRmaWxlPSJhbnQvcmVmZXJlbmNlcy54bWwiIGluaGVyaXRSZWZzPSJmYWxzZSIgdGFyZ2V0PSJkdW1teSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVuYW1lIj4KKyAgICA8YW50IGFudGZpbGU9ImFudC9yZWZlcmVuY2VzLnhtbCIgaW5oZXJpdFJlZnM9ImZhbHNlIiB0YXJnZXQ9ImR1bW15Ij4KKyAgICAgIDxyZWZlcmVuY2UgcmVmaWQ9InBhdGgiIHRvcmVmaWQ9Im5ld3BhdGgiIC8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEluaGVyaXRQYXRoIiBkZXNjcmlwdGlvbj0idHJ5IHRvIHBhc3MgYSByZWZlcmVuY2UgdG8gYSBwYXRoLCB3aGljaCByZWZlcnMgaXRzZWxmIHRvIGEgc2Vjb25kIHBhdGgiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290ZGlyIiBsb2NhdGlvbj0iLiIvPgorICAgIDxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzcGF0aCI+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uL2NsYXNzZXMiLz4KKyAgICA8L3BhdGg+CisgICAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtyb290ZGlyfS90ZXN0L3Rlc3RmcmFtZXdvcmsuamFyIi8+CisgICAgICA8cGF0aCByZWZpZD0icHJvamVjdC5jbGFzc3BhdGgiLz4KKyAgICA8L3BhdGg+CisgICAgPGFudCBhbnRmaWxlPSJhbnQvcmVmZXJlbmNlcy54bWwiICB0YXJnZXQ9InRlc3RJbmhlcml0UGF0aCI+CisgICAgICA8cmVmZXJlbmNlIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgorICAgIDwvYW50PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RMb2dmaWxlUGxhY2VtZW50Ij4KKyAgICA8YW50IGFudGZpbGU9ImFudC54bWwiIHRhcmdldD0iZHVtbXkiIG91dHB1dD0idGVzdDEubG9nIgorICAgICAgICAgaW5oZXJpdGFsbD0iZmFsc2UiIC8+CisgICAgPGFudCBhbnRmaWxlPSJhbnQueG1sIiB0YXJnZXQ9ImR1bW15IiBvdXRwdXQ9InRlc3QyLmxvZyIgLz4KKyAgICA8YW50IGFudGZpbGU9ImFudC54bWwiIHRhcmdldD0iZHVtbXkiIG91dHB1dD0idGVzdDMubG9nIgorICAgICAgICAgaW5oZXJpdGFsbD0iZmFsc2UiIGRpcj0iYW50IiAvPgorICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCIgdGFyZ2V0PSJkdW1teSIgb3V0cHV0PSJ0ZXN0NC5sb2ciIAorICAgICAgICAgZGlyPSJhbnQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZmlkIj4KKyAgICA8YW50IGFudGZpbGU9ImFudC9yZWZlcmVuY2VzLnhtbCIgaW5oZXJpdFJlZnM9ImZhbHNlIiB0YXJnZXQ9ImR1bW15Ij4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cHJvcCIgcmVmaWQ9ImluaGVyaXRhYmxlIiAvPgorICAgIDwvYW50PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtcHJvcGVydHktb3ZlcnJpZGUtaW5oZXJpdGFsbC1zdGFydCI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiIHZhbHVlPSIxIiAvPgorICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCIKKyAgICAgICAgIHRhcmdldD0idGVzdC1wcm9wZXJ0eS1vdmVycmlkZS1pbmhlcml0YWxsLWxldmVsLTIiCisgICAgICAgICBpbmhlcml0YWxsPSJ0cnVlIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0IiB2YWx1ZT0iMiIgLz4KKyAgICA8L2FudD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXByb3BlcnR5LW92ZXJyaWRlLWluaGVyaXRhbGwtbGV2ZWwtMiI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiIHZhbHVlPSIzIiAvPgorICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCIKKyAgICAgICAgIHRhcmdldD0idGVzdC1wcm9wZXJ0eS1vdmVycmlkZS1pbmhlcml0YWxsLWxldmVsLTMiCisgICAgICAgICBpbmhlcml0YWxsPSJ0cnVlIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0IiB2YWx1ZT0iNCIgLz4KKyAgICA8L2FudD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXByb3BlcnR5LW92ZXJyaWRlLWluaGVyaXRhbGwtbGV2ZWwtMyI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiIHZhbHVlPSI1IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9IlRoZSB2YWx1ZSBvZiB0ZXN0IGlzICR7dGVzdH0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1wcm9wZXJ0eS1vdmVycmlkZS1uby1pbmhlcml0YWxsLXN0YXJ0Ij4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdCIgdmFsdWU9IjEiIC8+CisgICAgPGFudCBhbnRmaWxlPSJhbnQueG1sIgorICAgICAgICAgdGFyZ2V0PSJ0ZXN0LXByb3BlcnR5LW92ZXJyaWRlLW5vLWluaGVyaXRhbGwtbGV2ZWwtMiIKKyAgICAgICAgIGluaGVyaXRhbGw9ImZhbHNlIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0IiB2YWx1ZT0iMiIgLz4KKyAgICA8L2FudD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXByb3BlcnR5LW92ZXJyaWRlLW5vLWluaGVyaXRhbGwtbGV2ZWwtMiI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiIHZhbHVlPSIzIiAvPgorICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCIKKyAgICAgICAgIHRhcmdldD0idGVzdC1wcm9wZXJ0eS1vdmVycmlkZS1uby1pbmhlcml0YWxsLWxldmVsLTMiCisgICAgICAgICBpbmhlcml0YWxsPSJmYWxzZSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0idGVzdCIgdmFsdWU9IjQiIC8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1wcm9wZXJ0eS1vdmVycmlkZS1uby1pbmhlcml0YWxsLWxldmVsLTMiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0IiB2YWx1ZT0iNSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJUaGUgdmFsdWUgb2YgdGVzdCBpcyAke3Rlc3R9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtcHJvcGVydHlzZXQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0MSIgdmFsdWU9IjEiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdDIiIHZhbHVlPSIyIi8+CisgICAgPHByb3BlcnR5c2V0IGlkPSJzZXQiPgorICAgICAgPHByb3BlcnR5cmVmIG5hbWU9InRlc3QxIi8+CisgICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IioiIHRvPSIqLngiLz4KKyAgICA8L3Byb3BlcnR5c2V0PgorICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCIgdGFyZ2V0PSJlY2hvLWZvci1wcm9wZXJ0eXNldC10ZXN0IiAKKyAgICAgICAgIGluaGVyaXRhbGw9ImZhbHNlIj4KKyAgICAgIDxwcm9wZXJ0eXNldCByZWZpZD0ic2V0Ii8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZWNoby1mb3ItcHJvcGVydHlzZXQtdGVzdCI+CisgICAgPGVjaG8+dGVzdDEgaXMgJHt0ZXN0MX08L2VjaG8+CisgICAgPGVjaG8+dGVzdDIgaXMgJHt0ZXN0Mn08L2VjaG8+CisgICAgPGVjaG8+dGVzdDEueCBpcyAke3Rlc3QxLnh9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluZmluaXRlLWxvb3AtdmlhLWRlcGVuZHMiPgorICAgIDxhbnRjYWxsIHRhcmdldD0iZGVwZW5kZW50Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWlkZGxlbWFuIiBkZXBlbmRzPSJpbmZpbml0ZS1sb29wLXZpYS1kZXBlbmRzIi8+CisgIDx0YXJnZXQgbmFtZT0iZGVwZW5kZW50IiBkZXBlbmRzPSJtaWRkbGVtYW4iLz4KKyAgCisgIDx0YXJnZXQgbmFtZT0ibXVsdGktc2FtZS1wcm9wZXJ0eSI+CisgICAgPGFudCBhbnRmaWxlPSJhbnQueG1sIiB0YXJnZXQ9ImVjaG8tZm9yLW11bHRpLXNhbWUiPgorICAgICAgPHByb3BlcnR5IG5hbWU9InByb3AiIHZhbHVlPSJvbmUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wIiB2YWx1ZT0idHdvIi8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZWNoby1mb3ItbXVsdGktc2FtZSI+CisgICAgPGVjaG8+cHJvcCBpcyAke3Byb3B9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRvcGxldmVsdGFyZ2V0Ij4KKyAgICA8YW50IGFudGZpbGU9ImFudC50b3BsZXZlbHRlc3QueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXVsdGlwbGUtcHJvcGVydHktZmlsZS1jaGlsZHJlbiI+CisgICAgPGFudCB0YXJnZXQ9ImR1bW15IiBhbnRmaWxlPSJhbnQueG1sIj4KKyAgICAgIDxwcm9wZXJ0eSBmaWxlPSJmb28ucHJvcGVydGllcyIvPgorICAgICAgPHByb3BlcnR5IGZpbGU9ImJhci5wcm9wZXJ0aWVzIi8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYmxhbmstdGFyZ2V0Ij4KKyAgICA8YW50IGFudGZpbGU9ImFudC50b3BsZXZlbHRlc3QueG1sIj4KKyAgICAgIDx0YXJnZXQgbmFtZT0iIiAvPgorICAgIDwvYW50PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im11bHRpcGxlLXRhcmdldHMiPgorICAgIDxhbnQgYW50ZmlsZT0iYW50LnhtbCI+CisgICAgICA8dGFyZ2V0IG5hbWU9InRhIiAvPgorICAgICAgPHRhcmdldCBuYW1lPSJ0YiIgLz4KKyAgICAgIDx0YXJnZXQgbmFtZT0idGMiIC8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXVsdGlwbGUtdGFyZ2V0cy0yIj4KKyAgICA8YW50IGFudGZpbGU9ImFudC54bWwiPgorICAgICAgPHRhcmdldCBuYW1lPSJ0YiIgLz4KKyAgICAgIDx0YXJnZXQgbmFtZT0iZGEiIC8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGEiPjxlY2hvPnRhPC9lY2hvPjwvdGFyZ2V0PgorICA8dGFyZ2V0IG5hbWU9InRiIiBkZXBlbmRzPSJkYSxkYyI+PGVjaG8+dGI8L2VjaG8+PC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0idGMiIGRlcGVuZHM9ImRiLGRjIj48ZWNobz50YzwvZWNobz48L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRhIj48ZWNobz5kYTwvZWNobz48L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJkYiI+PGVjaG8+ZGI8L2VjaG8+PC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0iZGMiPjxlY2hvPmRjPC9lY2hvPjwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQvYW50LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudC9hbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYzlhNzAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQvYW50LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9ImRlZiIgYmFzZWRpcj0iLiI+CisKKyAgPHRhcmdldCBuYW1lPSJkZWYiPgorICAgIDxmYWlsPlRoaXMgYnVpbGQgZmlsZSBzaG91bGQgb25seSBiZSBydW4gZnJvbSB3aXRoaW4gdGhlIHRlc3RjYXNlPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImR1bW15Ij4KKyAgICA8ZWNobyBtZXNzYWdlPSIke2Jhc2VkaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNhbGxiYWNrIj4KKyAgICA8YW50IGFudGZpbGU9Ii4uL2FudC54bWwiIHRhcmdldD0iZHVtbXkiIGluaGVyaXRBbGw9ImZhbHNlIiAvPgorICA8L3RhcmdldD4KKworCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50L3JlZmVyZW5jZXMueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50L3JlZmVyZW5jZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmM2E2OTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQvcmVmZXJlbmNlcy54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJkZWYiIGJhc2VkaXI9Ii4iPgorCisgIDxwYXRoIGlkPSJuby1vdmVycmlkZSIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImRlZiI+CisgICAgPGZhaWw+VGhpcyBidWlsZCBmaWxlIHNob3VsZCBvbmx5IGJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgdGVzdGNhc2U8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZHVtbXkiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SW5oZXJpdFBhdGgiPgorICAgIDxwYXRoY29udmVydCByZWZpZD0idGVzdC5jbGFzc3BhdGgiIHBhdGhzZXA9IiR7bGluZS5zZXBhcmF0b3J9IiBwcm9wZXJ0eT0ibXlwcm9wIi8+CisgICAgPGVjaG8+JHtteXByb3B9PC9lY2hvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50bGliLmN1cnJlbnQtdGVzdC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnRsaWIuY3VycmVudC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQ0NGRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50bGliLmN1cnJlbnQtdGVzdC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YW50bGliIHhtbG5zOmM9ImFudDpjdXJyZW50Ij4KKyAgPHR5cGVkZWYgbmFtZT0iZWNobzIiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobyIvPgorICA8cHJlc2V0ZGVmIG5hbWU9InByZXNldC5lY2hvIj4KKyAgICA8dHlwZWRlZiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG8iLz4KKyAgPC9wcmVzZXRkZWY+CisgIDxjOnByZXNldC5lY2hvIG5hbWU9InAiLz4KKyAgPG1hY3JvZGVmIG5hbWU9InVzZWVjaG8yIj4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxjOmVjaG8yPkVjaG8yIGluc2lkZSBhIG1hY3JvPC9jOmVjaG8yPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKzwvYW50bGliPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50bGliLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudGxpYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNDA2MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudGxpYi54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0Ij4KKworICA8cHJvcGVydHkgbmFtZT0idGVzdGNhc2VzLmRpciIgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIvPgorCisgIDxwYXRoIGlkPSJ0ZXN0Y2xhc3NlcyI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3RjYXNlcy5kaXJ9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgIDwvcGF0aD4KKworICA8dGFyZ2V0IG5hbWU9ImFudGxpYi5maWxlIj4KKyAgICA8dHlwZWRlZiBmaWxlPSJ0ZXN0LmFudGxpYi54bWwiCisgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0Y2xhc3NlcyIvPgorICAgIDxteXRhc2svPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImFudGxpYi5yZXNvdXJjZSI+CisgICAgPHR5cGVkZWYgcmVzb3VyY2U9InRhc2tkZWZzL3Rlc3QuYW50bGliLnhtbCI+CisgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICA8IS0tIFRvIGxvYWQgdGhlIHRhc2sgY2xhc3NlczogLS0+CisgICAgICAgICAgICA8cGF0aCByZWZpZD0idGVzdGNsYXNzZXMiLz4KKyAgICAgICAgICAgIDwhLS0gRm9yIHRlc3QuYW50bGliLnhtbDogLS0+CisgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uIi8+CisgICAgICAgICAgICA8IS0tIEZvciB0ZXN0Mi5hbnRsaWIueG1sOiAtLT4KKyAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Y2FzZXMuZGlyfS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy90ZXN0Mi1hbnRsaWIuamFyIi8+CisgICAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvdHlwZWRlZj4KKyAgICA8bXl0YXNrLz4KKyAgICA8ZWNobz4tYW5kLXRoZW4tPC9lY2hvPgorICAgIDxteXRhc2syLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJucy5jdXJyZW50Ij4KKyAgICA8dHlwZWRlZiBmaWxlPSJhbnRsaWIuY3VycmVudC10ZXN0LnhtbCIgdXJpPSJhYmMiLz4KKyAgICA8eDp1c2VlY2hvMiB4bWxuczp4PSJhYmMiLz4KKyAgICA8eDpwcmVzZXQuZWNobyB4bWxuczp4PSJhYmMiIG5hbWU9InAiLz4KKyAgICA8eDpwIHhtbG5zOng9ImFiYyI+SGVsbG8gZnJvbSB4OnA8L3g6cD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbnRsaWJfdXJpIiA+CisgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmV4YW1wbGUudGFza3MiIG9uZXJyb3I9ImZhaWxhbGwiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbnRsaWJfdXJpX2F1dG8iIHhtbG5zOmV4PSJhbnRsaWI6b3JnLmV4YW1wbGUudGFza3MiPgorICAgIDxleDpzaW1wbGU+CisgICAgICA8ZWNobyBtZXNzYWdlPSJpbnNpZGUgc2ltcGxlIiAvPgorICAgIDwvZXg6c2ltcGxlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImFudGxpYl91cmlfYXV0bzIiIHhtbG5zOmV4PSJhbnRsaWI6Ly9vcmcvZXhhbXBsZS90YXNrcy9hbnRsaWIyLnhtbCI+CisgICAgPGV4OnNpbXBsZT4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9Imluc2lkZSBzaW1wbGUiLz4KKyAgICA8L2V4OnNpbXBsZT4KKyAgPC90YXJnZXQ+CisgIAorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudHN0cnVjdHVyZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnRzdHJ1Y3R1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNmE5NzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnRzdHJ1Y3R1cmUueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJhbnRzdHJ1Y3R1cmUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxhbnRzdHJ1Y3R1cmUvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDdXN0b21QcmludGVyIj4KKyAgICA8dHlwZWRlZiBuYW1lPSJteXByaW50ZXIiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnRTdHJ1Y3R1cmVUZXN0JE15UHJpbnRlciI+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0cy1jbGFzc3BhdGgudmFsdWV9Ii8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L3R5cGVkZWY+CisgICAgPGFudHN0cnVjdHVyZSBvdXRwdXQ9ImZvby5kdGQiPgorICAgICAgPG15cHJpbnRlci8+CisgICAgPC9hbnRzdHJ1Y3R1cmU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVhckRvd24iPgorICAgIDxkZWxldGUgZmlsZT0iZm9vLmR0ZCIgcXVpZXQ9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FwdC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hcHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNTliZjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hcHQueG1sCkBAIC0wLDAgKzEsMTMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGJhc2VkaXI9Ii4iPgorICA8IS0tIGFwdCB0ZXN0cyAtLT4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiBsb2NhdGlvbj0iYXB0YnVpbGQiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAvPgorICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlczIuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMyIiAvPgorICA8cHJvcGVydHkgbmFtZT0icHJlcHJvY2Vzcy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vc291cmNlIiAvPgorICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iYXB0IiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJBcHRFeGFtcGxlLmNsYXNzIiBsb2NhdGlvbj0iJHtjbGFzc2VzLmRpcn0vQXB0RXhhbXBsZS5jbGFzcyIgLz4KKworICA8bWFjcm9kZWYgbmFtZT0iYXNzZXJ0Q29tcGlsZWQiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgLz4KKyAgICA8c2VxdWVudGlhbCA+CisgICAgICA8ZmFpbCAgbWVzc2FnZT0ibm90IGZvdW5kOiBAe2ZpbGV9Ij4KKyAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICA8bm90PgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJAe2ZpbGV9IiAvPgorICAgICAgICAgIDwvbm90PgorICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIDwvZmFpbD4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHByZXNldGRlZiBuYW1lPSJhc3NlcnRBcHRFeGFtcGxlQ29tcGlsZWQiPgorICAgIDxhc3NlcnRDb21waWxlZCBmaWxlPSIke0FwdEV4YW1wbGUuY2xhc3N9Ii8+CisgIDwvcHJlc2V0ZGVmPgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7Y2xhc3NlczIuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7cHJlcHJvY2Vzcy5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEFwdCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGFwdCBzcmNkaXI9IiR7c3JjfSIKKyAgICAgICAgIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IgorICAgICAgICAgZGVidWc9Im9uIgorICAgICAgICAgY29tcGlsZT0idHJ1ZSIKKyAgICAgICAgIHByZXByb2Nlc3NkaXI9IiR7cHJlcHJvY2Vzcy5kaXJ9Ij4KKyAgICA8L2FwdD4KKyAgICA8YXNzZXJ0QXB0RXhhbXBsZUNvbXBpbGVkIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEFwdEZvcmsiIGRlcGVuZHM9ImluaXQiPgorICAgIDxhcHQgc3JjZGlyPSIke3NyY30iCisgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKKyAgICAgICAgIGRlYnVnPSJvbiIKKyAgICAgICAgIGNvbXBpbGU9InRydWUiCisgICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICAgcHJlcHJvY2Vzc2Rpcj0iJHtwcmVwcm9jZXNzLmRpcn0iPgorICAgIDwvYXB0PgorICAgIDxhc3NlcnRBcHRFeGFtcGxlQ29tcGlsZWQgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QXB0Rm9ya0ZhbHNlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8YXB0IHNyY2Rpcj0iJHtzcmN9IgorICAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iCisgICAgICAgICBkZWJ1Zz0ib24iCisgICAgICAgICBjb21waWxlPSJ0cnVlIgorICAgICAgICAgZm9yaz0iZmFsc2UiCisgICAgICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSI+CisgICAgPC9hcHQ+CisgICAgPGFzc2VydEFwdEV4YW1wbGVDb21waWxlZCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RMaXN0QW5ub3RhdGlvblR5cGVzIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8YXB0IHNyY2Rpcj0iJHtzcmN9IgorICAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iCisgICAgICAgICBkZWJ1Zz0ib24iCisgICAgICAgICBjb21waWxlPSJ0cnVlIgorICAgICAgICAgcHJlcHJvY2Vzc2Rpcj0iJHtwcmVwcm9jZXNzLmRpcn0iPgorICAgICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWExpc3RBbm5vdGF0aW9uVHlwZXMiIC8+CisgICAgICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIgLz4gCisgICAgPC9hcHQ+CisgIAorICAgIDxhc3NlcnRBcHRFeGFtcGxlQ29tcGlsZWQgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tIHVzZSB0aGUgZmFjdG9yeSB3ZSBjb21waWxlZC4gVG8gYXZvaWQgdHJvdWJsZQorICAgIHdlIGRlbGl2ZXIgaW50byBhIHZlcnNpb24gaW4gYSBuZXcgY2xhc3NwYXRoLCBvdGhlcndpc2UKKyAgICB0aGUgZGVwZW5kZW5jeSBsb2dpYyB3aWxsIG5vdCBydW4gQXB0LS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdEFwdE5ld0ZhY3RvcnkiIGRlcGVuZHM9InRlc3RBcHQiPgorICAgIDxhcHQgc3JjZGlyPSIke3NyY30iCisgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMyLmRpcn0iCisgICAgICAgICBkZWJ1Zz0ib24iCisgICAgICAgICBjb21waWxlPSJ0cnVlIgorICAgICAgICAgZmFjdG9yeT0iRGlzdHJpYnV0ZWRBbm5vdGF0aW9uRmFjdG9yeSIKKyAgICAgICAgIHByZXByb2Nlc3NkaXI9IiR7cHJlcHJvY2Vzcy5kaXJ9Ij4KKyAgICAgICAgIDxmYWN0b3J5cGF0aCBwYXRoPSIke2NsYXNzZXMuZGlyfSIgLz4KKyAgICAgICAgIDxvcHRpb24gbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9IiAvPgorICAgIDwvYXB0PgorICAgIDxhc3NlcnRBcHRFeGFtcGxlQ29tcGlsZWQgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QXB0TmV3RmFjdG9yeUZvcmsiIGRlcGVuZHM9InRlc3RBcHQiPgorICAgIDxhcHQgc3JjZGlyPSIke3NyY30iCisgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMyLmRpcn0iCisgICAgICAgICBkZWJ1Zz0ib24iCisgICAgICAgICBjb21waWxlPSJ0cnVlIgorICAgICAgICAgZm9yaz0idHJ1ZSIKKyAgICAgICAgIGZhY3Rvcnk9IkRpc3RyaWJ1dGVkQW5ub3RhdGlvbkZhY3RvcnkiCisgICAgICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSI+CisgICAgICAgICA8ZmFjdG9yeXBhdGggcGF0aD0iJHtjbGFzc2VzLmRpcn0iIC8+CisgICAgICAgICA8b3B0aW9uIG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8L2FwdD4KKyAgICA8YXNzZXJ0QXB0RXhhbXBsZUNvbXBpbGVkIC8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNmZjYmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKy8qKgorICovCitARGlzdHJpYnV0ZWQoCisgICAgICAgIHByb3RvY29sPSJDT1JCQSIsCisgICAgICAgIGRpc3RyaWJ1dGlvbj1EaXN0cmlidXRlZC5EaXN0cmlidXRpb25UeXBlcy5GRURFUkFURUQKKyAgICAgICAgKQorcHVibGljIGNsYXNzIEFwdEV4YW1wbGUgeworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYXB0L0Rpc3RyaWJ1dGVkLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hcHQvRGlzdHJpYnV0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmMzNDY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYXB0L0Rpc3RyaWJ1dGVkLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKi8KK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHZhbHVlID0gRWxlbWVudFR5cGUuVFlQRSkKK3B1YmxpYyBAaW50ZXJmYWNlIERpc3RyaWJ1dGVkICB7CisKKyAgICBwdWJsaWMgRGlzdHJpYnV0aW9uVHlwZXMgZGlzdHJpYnV0aW9uKCkgZGVmYXVsdCBEaXN0cmlidXRpb25UeXBlcy5MT0NBTDsKKworICAgIHB1YmxpYyBTdHJpbmcgcHJvdG9jb2woKSBkZWZhdWx0ICJSTUkiOworCisgICAgcHVibGljIGVudW0gRGlzdHJpYnV0aW9uVHlwZXMgeyBTSU5HTEVUT04sIExPQ0FMLCBGQVVMVF9UT0xFUkFOVCwgRkVERVJBVEVELCBNT0JJTEV9OworCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FwdC9EaXN0cmlidXRlZEFubm90YXRpb25GYWN0b3J5LmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hcHQvRGlzdHJpYnV0ZWRBbm5vdGF0aW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmI2MzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hcHQvRGlzdHJpYnV0ZWRBbm5vdGF0aW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK2ltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3I7CitpbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKKworLyoqCisgKiBUaGlzIHdhcyB0aGUgZmlyc3QgcGllY2Ugb2YgSmF2YTEuNSBjb2RlIGluIHRoZSBzb3VyY2UgdHJlZS4KKyAqIEBzaW5jZSAyMDA1MC0wMy0wOVQyMToyOToyNVoKKyAqLworcHVibGljIGNsYXNzIERpc3RyaWJ1dGVkQW5ub3RhdGlvbkZhY3RvcnkgaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gc3VwcG9ydGVkQW5ub3RhdGlvbnMKKyAgICAgICAgICAgID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihBcnJheXMuYXNMaXN0KCIqIikpOworCisgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBzdXBwb3J0ZWRPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IHN1cHBvcnRlZEFubm90YXRpb25UeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEFubm90YXRpb25zOworICAgIH0KKworICAgIHB1YmxpYyBBbm5vdGF0aW9uUHJvY2Vzc29yIGdldFByb2Nlc3NvckZvcigKKyAgICAgICAgICAgIFNldDxjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uPiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9ucywKKyAgICAgICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXN0cmlidXRlZEFubm90YXRpb25Qcm9jZXNzb3IoZW52KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hcHQvRGlzdHJpYnV0ZWRBbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hcHQvRGlzdHJpYnV0ZWRBbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0ZmY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FwdC9EaXN0cmlidXRlZEFubm90YXRpb25Qcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8vZm91bmQgaW4gdG9vbHMuamFyLCBub3QgdGhlIEpSRSBydW50aW1lLgoraW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yOworaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQ7CitpbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247CitpbXBvcnQgY29tLnN1bi5taXJyb3IudXRpbC5TaW1wbGVEZWNsYXJhdGlvblZpc2l0b3I7CitpbXBvcnQgc3RhdGljIGNvbS5zdW4ubWlycm9yLnV0aWwuRGVjbGFyYXRpb25WaXNpdG9ycy4qOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBbm5vdGF0aW9uIHByb2Nlc3NvciBvdXRwdXRzIHN0dWZmCisgKi8KKworcHVibGljIGNsYXNzIERpc3RyaWJ1dGVkQW5ub3RhdGlvblByb2Nlc3NvciBpbXBsZW1lbnRzIEFubm90YXRpb25Qcm9jZXNzb3IgeworCisgICAgcHVibGljIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBlbnY7CisKKyAgICBwdWJsaWMgRGlzdHJpYnV0ZWRBbm5vdGF0aW9uUHJvY2Vzc29yKEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpIHsKKyAgICAgICAgdGhpcy5lbnYgPSBlbnY7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZWNobyhTdHJpbmcgdGV4dCkgeworICAgICAgICBlbnYuZ2V0TWVzc2FnZXIoKS5wcmludE5vdGljZSh0ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgeworICAgICAgICBlY2hvKCJEaXN0cmlidXRlZEFubm90YXRpb25Qcm9jZXNzb3ItaXMtZ28iKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnM9ZW52LmdldE9wdGlvbnMoKTsKKyAgICAgICAgZm9yKFN0cmluZyBrZXk6b3B0aW9ucy5rZXlTZXQoKSkgeworICAgICAgICAgICAgZWNobygiT3B0aW9uIFsiK2tleSsiXSA9ICIrb3B0aW9ucy5nZXQoa2V5KSk7CisgICAgICAgIH0KKworICAgICAgICAvL3dvcmsgdGltZQorICAgICAgICBmb3IgKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbCA6IGVudi5nZXRTcGVjaWZpZWRUeXBlRGVjbGFyYXRpb25zKCkpIHsKKyAgICAgICAgICAgIHR5cGVEZWNsLmFjY2VwdChnZXREZWNsYXJhdGlvblNjYW5uZXIobmV3IENsYXNzVmlzaXRvcigpLAorICAgICAgICAgICAgICAgICAgICBOT19PUCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDbGFzc1Zpc2l0b3IgZXh0ZW5kcyBTaW1wbGVEZWNsYXJhdGlvblZpc2l0b3IgeworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzRGVjbGFyYXRpb24oQ2xhc3NEZWNsYXJhdGlvbiBkKSB7CisgICAgICAgICAgICBlY2hvKCJ2aXNpdGluZyAiKyBkLmdldFF1YWxpZmllZE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hdmFpbGFibGUueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYXZhaWxhYmxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjJmYzRjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYXZhaWxhYmxlLnhtbApAQCAtMCwwICsxLDI3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImF2YWlsYWJsZS10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9ImdyZWF0Z3JhbmRwYXJlbnQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGF2YWlsYWJsZS8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPGF2YWlsYWJsZSBmaWxlPSJ0ZXN0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIAorICAgICAgICAgICAgICAgZmlsZT0ic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGhpc19maWxlX2RvZXNfbm90X2V4aXN0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIAorICAgICAgICAgICAgICAgZmlsZT0iYXZhaWxhYmxlLnhtbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKKyAgICAgICAgICAgICAgIHJlc291cmNlPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy90aGlzX3Jlc291cmNlX2RvZXNfbm90X2V4aXN0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDciPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIAorICAgICAgICAgICAgICAgcmVzb3VyY2U9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OCI+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCisgICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnRoaXNfY2xhc3NfZG9lc19ub3RfZXhpc3QiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OSI+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCisgICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFudCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxMCI+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCisgICAgICAgICAgICAgICBmaWxlPSJhdmFpbGFibGUueG1sIgorICAgICAgICAgICAgICAgcmVzb3VyY2U9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMiCisgICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFudCIvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdDExIj4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKKyAgICAgICAgICAgICAgIGZpbGU9InNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2F2YWlsYWJsZS54bWwiCisgICAgICAgICAgICAgICByZXNvdXJjZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGVmYXVsdHMucHJvcGVydGllcyIKKyAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMudGhpc19jbGFzc19kb2VzX25vdF9leGlzdCIvPgorICA8L3RhcmdldD4gIAorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MTIiPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9IiIgCisgICAgICAgICAgICAgICBmaWxlPSJhdmFpbGFibGUueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEzIj4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKKyAgICAgICAgICAgICAgIGZpbGU9IiIgdHlwZT0iZmlsZSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MTNiIj4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKKyAgICAgICAgICAgICAgIGZpbGU9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxNCI+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCisgICAgICAgICAgICAgICByZXNvdXJjZT0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDE1Ij4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKKyAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMudGhpc19jbGFzc19kb2VzX25vdF9leGlzdCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxNiI+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCisgICAgICAgICAgICAgICBmaWxlPSIiIHR5cGU9ImRpciIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxNyI+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgCisgICAgICAgICAgICAgICBmaWxlPSIuLi90YXNrZGVmcyIgdHlwZT0iZGlyIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDE4Ij4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKKyAgICAgICAgICAgICAgIGZpbGU9Ii4uL3RoaXNfZGlyX3Nob3VsZF9uZXZlcl9leGlzdCIgdHlwZT0iZGlyIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDE5Ij4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IiAKKyAgICAgICAgICAgICAgIGZpbGU9ImF2YWlsYWJsZS54bWwiIHR5cGU9IkZvbyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyMCI+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgaWdub3Jlc3lzdGVtY2xhc3Nlcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIGNsYXNzbmFtZT0iamF2YS5hd3QuR3JhcGhpY3MiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MjEiPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InRlc3QiIGlnbm9yZXN5c3RlbWNsYXNzZXM9InRydWUiCisgICAgICAgICAgICAgICBjbGFzc25hbWU9ImphdmEuYXd0LkdyYXBoaWNzIj4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9L2xpYi9ydC5qYXIiIC8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9L2xpYi9jbGFzc2VzLnppcCIgLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phdmEuaG9tZX0vbGliL2dyYXBoaWNzLmphciIgLz4gPCEtLSBJQk0gSkRLIC0tPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudEpESy9DbGFzc2VzL2NsYXNzZXMuamFyIiAvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudEpESy9DbGFzc2VzL3VpLmphciIgLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvYXZhaWxhYmxlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyMiI+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0idGVzdCIgaWdub3Jlc3lzdGVtY2xhc3Nlcz0iZmFsc2UiCisgICAgICAgICAgICAgICBjbGFzc25hbWU9ImphdmEuYXd0LkdyYXBoaWNzIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIzIj4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IgorICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJqYXZhLmF3dC5HcmFwaGljcyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyNCI+CisgICAgPCEtLSBjcmVhdGUgYSBkdW1teSBmaWxlIGFuZCBsb29rIGZvciBpdCAtLT4KKyAgICA8bWtkaXIgZGlyPSIke3VzZXIuZGlyfS90ZXN0Ii8+CisgICAgPGVjaG8gbWVzc2FnZT0icGFja2FnZSB0ZXN0O3B1YmxpYyBjbGFzcyB0ZXN0IHt9IiBmaWxlPSIke3VzZXIuZGlyfS90ZXN0L3Rlc3QuamF2YSIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7dXNlci5kaXJ9IiBpbmNsdWRlcz0idGVzdC90ZXN0LmphdmEiLz4KKyAgICA8amFyIGRlc3RmaWxlPSIke3VzZXIuZGlyfS90ZXN0LmphciIgYmFzZWRpcj0iJHt1c2VyLmRpcn0iIGluY2x1ZGVzPSJ0ZXN0L3Rlc3QuY2xhc3MiLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0ZXN0IgorICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJ0ZXN0LnRlc3QiIGNsYXNzcGF0aD0iJHt1c2VyLmRpcn0vdGVzdC5qYXIiLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHt1c2VyLmRpcn0vdGVzdCIvPgorICAgIDxkZWxldGUgZmlsZT0iJHt1c2VyLmRpcn0vdGVzdC5qYXIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzZWFyY2hJblBhdGhOb3RUaGVyZSI+CisgICAgPGF2YWlsYWJsZSBmaWxlPSJub3RfdGhlcmUiIGZpbGVwYXRoPSIuLjpvcHRpb25hbCIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNlYXJjaEluUGF0aElzVGhlcmUiPgorICAgIDxhdmFpbGFibGUgZmlsZT0icHZjcy54bWwiIGZpbGVwYXRoPSIuLjpvcHRpb25hbCIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REb3VibGVCYXNlZGlyIj4KKyAgICA8ZWNobz50ZXN0aW5nICR7YmFzZWRpcn0ke2ZpbGUuc2VwYXJhdG9yfSR7YW50LmZpbGV9PC9lY2hvPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2VkaXJ9JHtmaWxlLnNlcGFyYXRvcn0ke2FudC5maWxlfSIgLz4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwcmVwLnBhcmVudHMiPgorICAgIDxkZWxldGUgcXVpZXQ9InllcyIgZGlyPSJncmVhdGdyYW5kcGFyZW50Ii8+CisgICAgPG1rZGlyICBkaXI9ImdyZWF0Z3JhbmRwYXJlbnQvZ3JhbmRwYXJlbnQvcGFyZW50L2RpciIvPgorICAgIDx0b3VjaCAgZmlsZT0iZ3JlYXRncmFuZHBhcmVudC9hLnR4dCIvPgorICAgIDx0b3VjaCAgZmlsZT0iZ3JlYXRncmFuZHBhcmVudC9ncmFuZHBhcmVudC9iLnR4dCIvPgorICAgIDx0b3VjaCAgZmlsZT0iZ3JlYXRncmFuZHBhcmVudC9ncmFuZHBhcmVudC9wYXJlbnQvYy50eHQiLz4KKyAgICA8dG91Y2ggIGZpbGU9ImdyZWF0Z3JhbmRwYXJlbnQvZ3JhbmRwYXJlbnQvcGFyZW50L2Rpci9kLnR4dCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhdmFpbGFibGUudGVzdC5kaXIiCisgICAgICAgICAgICAgIHZhbHVlPSJncmVhdGdyYW5kcGFyZW50L2dyYW5kcGFyZW50L3BhcmVudC9kaXIiLz4KKyAgPC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0ic2VhcmNoLXBhcmVudHMiIGRlcGVuZHM9InByZXAucGFyZW50cyI+CisgICAgPGVjaG8+dGVzdGluZyBncmVhdGdyYW5kcGFyZW50IC0gc2hvdWxkIHNlZTwvZWNobz4KKworICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9ImEudHh0IiBzZWFyY2hwYXJlbnRzPSJ5ZXMiPgorICAgICAgICAgICAgPGZpbGVwYXRoIHBhdGg9IiR7YXZhaWxhYmxlLnRlc3QuZGlyfSIvPgorICAgICAgICAgIDwvYXZhaWxhYmxlPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKworICAgIDxlY2hvPnRlc3RpbmcgZ3JhbmRwYXJlbnQgLSBzaG91bGQgc2VlPC9lY2hvPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9ImIudHh0IiBzZWFyY2hwYXJlbnRzPSJ5ZXMiPgorICAgICAgICAgICAgPGZpbGVwYXRoIHBhdGg9IiR7YXZhaWxhYmxlLnRlc3QuZGlyfSIvPgorICAgICAgICAgIDwvYXZhaWxhYmxlPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKworICAgIDxlY2hvPnRlc3RpbmcgcGFyZW50IC0gc2hvdWxkIHNlZTwvZWNobz4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJjLnR4dCIgc2VhcmNocGFyZW50cz0ieWVzIj4KKyAgICAgICAgICAgIDxmaWxlcGF0aCBwYXRoPSIke2F2YWlsYWJsZS50ZXN0LmRpcn0iLz4KKyAgICAgICAgICA8L2F2YWlsYWJsZT4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisKKyAgICA8ZWNobz50ZXN0aW5nIGRpciAtIHNob3VsZCBzZWU8L2VjaG8+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iZC50eHQiIHNlYXJjaHBhcmVudHM9InllcyI+CisgICAgICAgICAgICA8ZmlsZXBhdGggcGF0aD0iJHthdmFpbGFibGUudGVzdC5kaXJ9Ii8+CisgICAgICAgICAgPC9hdmFpbGFibGU+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2VhcmNoLXBhcmVudHMtbm90IiBkZXBlbmRzPSJwcmVwLnBhcmVudHMiPgorICAgIDxlY2hvPnRlc3RpbmcgZ3JhbmRwYXJlbnQgLSBzaG91bGQgbm90IHNlZTwvZWNobz4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iYi50eHQiPgorICAgICAgICAgIDxmaWxlcGF0aCBwYXRoPSIke2F2YWlsYWJsZS50ZXN0LmRpcn0iLz4KKyAgICAgICAgPC9hdmFpbGFibGU+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisKKyAgICA8ZWNobz50ZXN0aW5nIHBhcmVudCAtIHNob3VsZCBub3Qgc2VlPC9lY2hvPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJjLnR4dCI+CisgICAgICAgICAgPGZpbGVwYXRoIHBhdGg9IiR7YXZhaWxhYmxlLnRlc3QuZGlyfSIvPgorICAgICAgICA8L2F2YWlsYWJsZT4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKworICAgIDxlY2hvPnRlc3RpbmcgZGlyIC0gc2hvdWxkIHNlZTwvZWNobz4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJkLnR4dCI+CisgICAgICAgICAgICA8ZmlsZXBhdGggcGF0aD0iJHthdmFpbGFibGUudGVzdC5kaXJ9Ii8+CisgICAgICAgICAgPC9hdmFpbGFibGU+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorCisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYmFyLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9iYXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjRiOTFlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYmFyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorYmFyPUJhcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYmFzZW5hbWUueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYmFzZW5hbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmQyYWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9iYXNlbmFtZS54bWwKQEAgLTAsMCArMSw1NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGJhc2VuYW1lLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPGJhc2VuYW1lIHByb3BlcnR5PSJwcm9wbmFtZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8YmFzZW5hbWUgZmlsZT0iZmlsZW5hbWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+CisgICAgPGJhc2VuYW1lIHByb3BlcnR5PSJmaWxlLncuc3VmIiBmaWxlPSIke3VzZXIuZGlyfS9mb28udHh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDxiYXNlbmFtZSBwcm9wZXJ0eT0iZmlsZS53by5zdWYiIGZpbGU9ImZvby50eHQiIHN1ZmZpeD0idHh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE11bHRpcGxlRG90cyI+CisgICAgPGJhc2VuYW1lIHByb3BlcnR5PSJmaWxlLndvLnN1ZiIgZmlsZT0iZm9vLmJhci50eHQiIHN1ZmZpeD0idHh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vRG90cyI+CisgICAgPGJhc2VuYW1lIHByb3BlcnR5PSJmaWxlLndvLnN1ZiIgZmlsZT0iZm9vLmJhcnR4dCIgc3VmZml4PSJ0eHQiLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RWYWx1ZUVxdWFsc1N1ZmZpeFdpdGhEb3QiPgorICAgIDxiYXNlbmFtZSBwcm9wZXJ0eT0iZmlsZS53by5zdWYiIGZpbGU9Ii50eHQiIHN1ZmZpeD0iLnR4dCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RWYWx1ZUVxdWFsc1N1ZmZpeFdpdGhvdXREb3QiPgorICAgIDxiYXNlbmFtZSBwcm9wZXJ0eT0iZmlsZS53by5zdWYiIGZpbGU9Ii50eHQiIHN1ZmZpeD0idHh0Ii8+CisgIDwvdGFyZ2V0PgorICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2J1bnppcDIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYnVuemlwMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhNDc0YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2J1bnppcDIueG1sCkBAIC0wLDAgKzEsNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJjbGVhbnVwIj4KKworICA8dGFyZ2V0IG5hbWU9InJlYWxUZXN0Ij4KKyAgICA8YnVuemlwMiBzcmM9ImV4cGVjdGVkL2FzZi1sb2dvLWh1Z2UudGFyLmJ6MiIgZGVzdD0iYXNmLWxvZ28taHVnZS50YXIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVhbFRlc3RXaXRoUmVzb3VyY2UiPgorICAgIDxidW56aXAyIGRlc3Q9ImFzZi1sb2dvLWh1Z2UudGFyIj4KKyAgICAgIDxmaWxlIGZpbGU9ImV4cGVjdGVkL2FzZi1sb2dvLWh1Z2UudGFyLmJ6MiIvPgorICAgIDwvYnVuemlwMj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVsZXRlIGZpbGU9ImFzZi1sb2dvLWh1Z2UudGFyIiAvPgorICAgIDxkZWxldGUgZmlsZT0iZXhwZWN0ZWQvYXNmLWxvZ28taHVnZS50YXIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icHJlcGFyZSI+CisgICAgPGd1bnppcCBzcmM9ImV4cGVjdGVkL2FzZi1sb2dvLWh1Z2UudGFyLmd6Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdERvY3VtZW50YXRpb25DbGFpbXNPbkNvcHkiPgorICAgIDxjb3B5IHRvZGlyPSIuIj4KKyAgICAgIDxiemlwMnJlc291cmNlPgorICAgICAgICA8ZmlsZSBmaWxlPSJleHBlY3RlZC9hc2YtbG9nby1odWdlLnRhci5iejIiLz4KKyAgICAgIDwvYnppcDJyZXNvdXJjZT4KKyAgICAgIDxtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5iejIiIHRvPSIqIi8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9iemlwMi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9iemlwMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3ZmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2J6aXAyLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iY2xlYW51cCI+CisKKyAgPHRhcmdldCBuYW1lPSJyZWFsVGVzdCI+CisgICAgPGJ6aXAyIHNyYz0iZXhwZWN0ZWQvYXNmLWxvZ28taHVnZS50YXIiIHppcGZpbGU9ImFzZi1sb2dvLWh1Z2UudGFyLmJ6MiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZWFsVGVzdFdpdGhSZXNvdXJjZSI+CisgICAgPGJ6aXAyIHppcGZpbGU9ImFzZi1sb2dvLWh1Z2UudGFyLmJ6MiI+CisgICAgICA8ZmlsZSBmaWxlPSJleHBlY3RlZC9hc2YtbG9nby1odWdlLnRhciIvPgorICAgIDwvYnppcDI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdERhdGVDaGVjayI+CisgICAgPHRvdWNoIGZpbGU9ImFzZi1sb2dvLmdpZi5iejIiLz4KKyAgICA8YnppcDIgc3JjPSIuLi9hc2YtbG9nby5naWYiIHppcGZpbGU9ImFzZi1sb2dvLmdpZi5iejIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBmaWxlPSJhc2YtbG9nby1odWdlLnRhci5iejIiIC8+CisgICAgPGRlbGV0ZSBmaWxlPSJhc2YtbG9nby5naWYuYnoyIiAvPgorICAgIDxkZWxldGUgZmlsZT0iZXhwZWN0ZWQvYXNmLWxvZ28taHVnZS50YXIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KKyAgICA8Z3VuemlwIHNyYz0iZXhwZWN0ZWQvYXNmLWxvZ28taHVnZS50YXIuZ3oiLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2FsbHRhcmdldC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jYWxsdGFyZ2V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWE3NmExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2FsbHRhcmdldC54bWwKQEAgLTAsMCArMSw5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lID0iY2FsbHRhcmdldC10ZXN0IiBkZWZhdWx0PSJ0ZXN0aW5oZXJpdHJlZmZpbGVzZXQiIGJhc2VkaXI9Ii4iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0bXAuZGlyIiB2YWx1ZT0idG1wLmRpciIgLz4KKyAgICA8dGFyZ2V0IG5hbWU9InNldHVwIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0bXAuZGlyfSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3RtcC5kaXJ9IiBxdWlldD0idHJ1ZSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0ibXl0YXJnZXQiPgorICAgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJteXByb3BlcnR5IiB0YXJnZXRvcz0idW5peCIgcmVmaWQ9Im15ZmlsZXNldCIvPgorICAgICAgPGVjaG8gbWVzc2FnZT0ibXlwcm9wZXJ0eT0ke215cHJvcGVydHl9Ii8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0aW5oZXJpdHJlZmZpbGVzZXQiPgorICAgIDwhLS0gdGhpcyB0ZXN0Y2FzZSBzaG91bGQgc2hvdyB0aGF0IHRoZSBmaWxlc2V0IGRlZmluZWQgaGVyZQorICAgIGNhbiBiZSByZWFkIGluIHRoZSBjYWxsZWQgdGFyZ2V0IC0tPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpZD0ibXlmaWxlc2V0Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY2FsbHRhcmdldC54bWwiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxhbnRjYWxsIHRhcmdldD0ibXl0YXJnZXQiIGluaGVyaXRyZWZzPSJ0cnVlIi8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJjb3B5dGVzdDIiPgorICAgICAgIDxjb3B5IGZpbGU9IiR7dG1wLmRpcn0vY29weXRlc3QuaW4iIHRvRmlsZT0iJHt0bXAuZGlyfS9jb3B5dGVzdDEub3V0IiBvdmVyd3JpdGU9InRydWUiPgorICAgICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9ImZvbyIvPgorICAgICAgIDwvY29weT4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InRlc3Rpbmhlcml0cmVmZmlsdGVyc2V0IiBkZXBlbmRzPSJzZXR1cCI+CisgICAgICAgPGVjaG8gZmlsZT0iJHt0bXAuZGlyfS9jb3B5dGVzdC5pbiI+QEBmb29AQDwvZWNobz4KKyAgICAgICA8ZmlsdGVyc2V0IGlkPSJmb28iIGJlZ2ludG9rZW49IkBAIiBlbmR0b2tlbj0iQEAiPgorICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImZvbyIgdmFsdWU9ImJhciIvPgorICAgICAgIDwvZmlsdGVyc2V0PgorICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29weXRlc3QyIiBpbmhlcml0cmVmcz0idHJ1ZSIvPgorICAgICAgIDxjb3B5IGZpbGU9IiR7dG1wLmRpcn0vY29weXRlc3QuaW4iIHRvRmlsZT0iJHt0bXAuZGlyfS9jb3B5dGVzdDIub3V0IiBvdmVyd3JpdGU9InRydWUiPgorICAgICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9ImZvbyIvPgorICAgICAgIDwvY29weT4KKyAgICAgICA8bG9hZGZpbGUgc3JjRmlsZT0iJHt0bXAuZGlyfS9jb3B5dGVzdDIub3V0IiBwcm9wZXJ0eT0iY29weXRlc3QyIi8+CisgICAgICAgPGxvYWRmaWxlIHNyY0ZpbGU9IiR7dG1wLmRpcn0vY29weXRlc3QxLm91dCIgcHJvcGVydHk9ImNvcHl0ZXN0MSIvPgorICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InN1Y2Nlc3MiPgorICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7Y29weXRlc3QxfSIgYXJnMj0iJHtjb3B5dGVzdDJ9Ii8+CisgICAgICAgPC9jb25kaXRpb24+CisgICAgICAgPGZhaWwgbWVzc2FnZT0iZmlsdGVyc2V0IG5vdCBwcm9wZXJseSBwYXNzZWQgYWNyb3NzIGJ5IGFudGNhbGwiIHVubGVzcz0ic3VjY2VzcyIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHByb3BlcnR5IG5hbWU9Im11bHRpIiB2YWx1ZT0iREVGQVVMVCIvPgorICAgIDx0YXJnZXQgbmFtZT0ibXVsdGkiPgorICAgICAgICA8ZWNobz5tdWx0aSBpcyAke211bHRpfTwvZWNobz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImNhbGwtbXVsdGkiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9Im11bHRpIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJtdWx0aSIgdmFsdWU9IlNFVCIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJsYW5rLXRhcmdldCI+CisgICAgICAgIDxhbnRjYWxsPgorICAgICAgICAgICAgPHRhcmdldCBuYW1lPSIiIC8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ibXVsdGlwbGUtdGFyZ2V0cyI+CisgICAgICAgIDxhbnRjYWxsPgorICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJ0YSIgLz4KKyAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0idGIiIC8+CisgICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InRjIiAvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Im11bHRpcGxlLXRhcmdldHMtMiI+CisgICAgICA8YW50IGFudGZpbGU9ImFudC54bWwiPgorICAgICAgICA8dGFyZ2V0IG5hbWU9InRiIiAvPgorICAgICAgICA8dGFyZ2V0IG5hbWU9ImRhIiAvPgorICAgICAgPC9hbnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRhIj48ZWNobz50YTwvZWNobz48L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InRiIiBkZXBlbmRzPSJkYSxkYyI+PGVjaG8+dGI8L2VjaG8+PC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ0YyIgZGVwZW5kcz0iZGIsZGMiPjxlY2hvPnRjPC9lY2hvPjwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJkYSI+PGVjaG8+ZGE8L2VjaG8+PC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJkYiI+PGVjaG8+ZGI8L2VjaG8+PC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJkYyI+PGVjaG8+ZGM8L2VjaG8+PC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NoZWNrc3VtLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NoZWNrc3VtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJmYjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2hlY2tzdW0ueG1sCkBAIC0wLDAgKzEsMjY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImNsZWFudXAiIGJhc2VkaXI9Ii4iPgorCisgIDxtYWNyb2RlZiBuYW1lPSJjb21wYXJlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImV4cGVjdGVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGxvYWRmaWxlIHByb3BlcnR5PSJleHBlY3RlZCIgc3JjZmlsZT0iQHtleHBlY3RlZH0iPgorICAgICAgICA8ZmlsdGVyY2hhaW4+PHN0cmlwbGluZWJyZWFrcyAvPjwvZmlsdGVyY2hhaW4+CisgICAgICA8L2xvYWRmaWxlPgorICAgICAgPGxvYWRmaWxlIHByb3BlcnR5PSJvdXRwdXQiIHNyY2ZpbGU9IkB7b3V0cHV0fSI+CisgICAgICAgIDxmaWx0ZXJjaGFpbj48c3RyaXBsaW5lYnJlYWtzIC8+PC9maWx0ZXJjaGFpbj4KKyAgICAgIDwvbG9hZGZpbGU+CisgICAgICA8ZmFpbCBtZXNzYWdlPSIke291dHB1dH0gbm90ID0gJHtleHBlY3RlZH0iPgorICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7b3V0cHV0fSIgYXJnMj0iJHtleHBlY3RlZH0iIC8+CisgICAgICAgICAgPC9ub3Q+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgPC9mYWlsPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8bWFjcm9kZWYgbmFtZT0idGVzdHZlcmlmeSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGVja25vbG9nbyIgZGVmYXVsdD0iZmFsc2UiIC8+CisgICAgPGVsZW1lbnQgbmFtZT0ic3R1ZmYiIGltcGxpY2l0PSJ0cnVlIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGZhaWw+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPG9yPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJsb2dvLk1ENSIgLz4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0ibm8ubG9nby5NRDUiIC8+CisgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICA8L2ZhaWw+CisgICAgICA8c3R1ZmYgLz4KKyAgICAgIDxmYWlsPgorICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIke2xvZ28uTUQ1fSIgLz4gCisgICAgICAgICAgPC9ub3Q+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgPC9mYWlsPgorICAgICAgPGZhaWw+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IkB7Y2hlY2tub2xvZ299IiAvPgorICAgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgICAgPGlzZmFsc2UgdmFsdWU9IiR7bm8ubG9nby5NRDV9IiAvPgorICAgICAgICAgICAgPC9ub3Q+CisgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgPC9mYWlsPgorICAgICAgPGZhaWw+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxpc2ZhbHNlIHZhbHVlPSJAe2NoZWNrbm9sb2dvfSIgLz4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0ibm8ubG9nby5NRDUiIC8+CisgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgPC9mYWlsPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZmlsZT0iLi4vYXNmLWxvZ28uZ2lmLk1ENSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9Ii4uL2FzZi1sb2dvLmdpZi5tZDUiIC8+CisgICAgPGRlbGV0ZSBmaWxlPSIuLi9hc2YtbG9nby5naWYuTUQ1U1VNIiAvPgorICAgIDxkZWxldGUgZmlsZT0iLi4vYXNmLWxvZ28uZ2lmLm1kNXN1bSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9Ii4uL2FzZi1sb2dvLmdpZi5TVkYiIC8+CisgICAgPGRlbGV0ZSBmaWxlPSIuLi9hc2YtbG9nby5naWYuc3ZmIiAvPgorICAgIDxkZWxldGUgZmlsZT0iLi4vYXNmLWxvZ28uZ2lmLnBhdHRlcm4iIC8+CisgICAgPGRlbGV0ZSBmaWxlPSIuLi9hc2YtbG9nby5naWYuUEFUVEVSTiIgLz4KKyAgICA8ZGVsZXRlPgorICAgICAgPGZpbGVzZXQgZGlyPSJjaGVja3N1bSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouTUQ1Ii8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9kZWxldGU+CisgICAgPGRlbGV0ZSBkaXI9ImNoZWNrc3VtL2NoZWNrc3VtcyIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjcmVhdGVNZDUiPgorICAgIDxjaGVja3N1bSBmaWxlPSIuLi9hc2YtbG9nby5naWYiIGZpbGVleHQ9Ii5NRDUiIC8+CisgICAgPGNvbXBhcmUgZXhwZWN0ZWQ9ImV4cGVjdGVkL2FzZi1sb2dvLmdpZi5tZDUiIG91dHB1dD0iLi4vYXNmLWxvZ28uZ2lmLk1ENSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjcmVhdGVNRDVTVU1mb3JtYXQiPgorICAgIDxjaGVja3N1bSBmaWxlPSIuLi9hc2YtbG9nby5naWYiIGZvcm1hdD0iTUQ1U1VNIiBmaWxlZXh0PSIuTUQ1U1VNIiAvPgorICAgIDxjb21wYXJlIGV4cGVjdGVkPSJleHBlY3RlZC9hc2YtbG9nby5naWYubWQ1c3VtIiBvdXRwdXQ9Ii4uL2FzZi1sb2dvLmdpZi5NRDVTVU0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY3JlYXRlU1ZGZm9ybWF0Ij4KKyAgICA8Y2hlY2tzdW0gZmlsZT0iLi4vYXNmLWxvZ28uZ2lmIiBmb3JtYXQ9IlNWRiIgZmlsZWV4dD0iLlNWRiIgLz4KKyAgICA8Y29tcGFyZSBleHBlY3RlZD0iZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnN2ZiIgb3V0cHV0PSIuLi9hc2YtbG9nby5naWYuU1ZGIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZVBhdHRlcm4iPgorICAgIDxjaGVja3N1bSBmaWxlPSIuLi9hc2YtbG9nby5naWYiIHBhdHRlcm49ImZvb3swfWJhciIgZmlsZWV4dD0iLlBBVFRFUk4iIC8+CisgICAgPGNvbXBhcmUgZXhwZWN0ZWQ9ImV4cGVjdGVkL2FzZi1sb2dvLmdpZi5wYXR0ZXJuIiBvdXRwdXQ9Ii4uL2FzZi1sb2dvLmdpZi5QQVRURVJOIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNldFByb3BlcnR5Ij4KKyAgICA8Y2hlY2tzdW0gZmlsZT0iLi4vYXNmLWxvZ28uZ2lmIiBwcm9wZXJ0eT0ibG9nby5NRDUiIC8+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8b3I+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iMDU0MWQzZGY0MjUyMDkxMWYyNjhhYmM3MzBmM2FmZTAiCisgICAgICAgICAgICAgICAgICAgIGFyZzI9IiR7bG9nby5NRDV9IiAvPgorICAgICAgICAgIDwvbm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iLi4vYXNmLWxvZ28uZ2lmLk1ENSIgLz4KKyAgICAgICAgPC9vcj4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ2ZXJpZnlBc1Rhc2siPgorICAgIDx0ZXN0dmVyaWZ5IGNoZWNrbm9sb2dvPSJ0cnVlIj4KKyAgICAgIDxjb3B5IGZpbGU9ImV4cGVjdGVkL2FzZi1sb2dvLmdpZi5tZDUiIHRvZGlyPSIuLiIgLz4KKyAgICAgIDxjaGVja3N1bSBmaWxlPSIuLi9hc2YtbG9nby5naWYiIGZpbGVleHQ9Ii5tZDUiCisgICAgICAgICAgICAgICAgdmVyaWZ5cHJvcGVydHk9ImxvZ28uTUQ1IiAvPgorCisgICAgICA8Y29weSBmaWxlPSJjaGVja3N1bS54bWwiIHRvZmlsZT0iLi4vYXNmLWxvZ28uZ2lmLk1ENSIKKyAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KKyAgICAgIDxjaGVja3N1bSBmaWxlPSIuLi9hc2YtbG9nby5naWYiIGZpbGVleHQ9Ii5NRDUiCisgICAgICAgICAgICAgICAgdmVyaWZ5cHJvcGVydHk9Im5vLmxvZ28uTUQ1IiAvPgorICAgIDwvdGVzdHZlcmlmeT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ2ZXJpZnlNRDVTVU1Bc1Rhc2siPgorICAgIDx0ZXN0dmVyaWZ5IGNoZWNrbm9sb2dvPSJ0cnVlIj4KKyAgICAgIDxjb3B5IGZpbGU9ImV4cGVjdGVkL2FzZi1sb2dvLmdpZi5tZDVzdW0iIHRvZGlyPSIuLiIgLz4KKyAgICAgIDxjaGVja3N1bSBmaWxlPSIuLi9hc2YtbG9nby5naWYiIGZpbGVleHQ9Ii5tZDVzdW0iCisgICAgICAgICAgICAgICAgdmVyaWZ5cHJvcGVydHk9ImxvZ28uTUQ1IiBmb3JtYXQ9Ik1ENVNVTSIvPgorCisgICAgICA8Y29weSBmaWxlPSJjaGVja3N1bS54bWwiIHRvZmlsZT0iLi4vYXNmLWxvZ28uZ2lmLk1ENVNVTSIKKyAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KKyAgICAgIDxjaGVja3N1bSBmaWxlPSIuLi9hc2YtbG9nby5naWYiIGZpbGVleHQ9Ii5NRDVTVU0iCisgICAgICAgICAgICAgICAgdmVyaWZ5cHJvcGVydHk9Im5vLmxvZ28uTUQ1IiBmb3JtYXQ9Ik1ENVNVTSIvPgorICAgIDwvdGVzdHZlcmlmeT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ2ZXJpZnlBc0NvbmRpdGlvbiI+CisgICAgPHRlc3R2ZXJpZnk+CisgICAgICA8Y29weSBmaWxlPSJleHBlY3RlZC9hc2YtbG9nby5naWYubWQ1IiB0b2Rpcj0iLi4iIC8+CisgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJsb2dvLk1ENSI+CisgICAgICAgIDxjaGVja3N1bSBmaWxlPSIuLi9hc2YtbG9nby5naWYiIGZpbGVleHQ9Ii5tZDUiIC8+CisgICAgICA8L2NvbmRpdGlvbj4KKworICAgICAgPGNvcHkgZmlsZT0iY2hlY2tzdW0ueG1sIiB0b2ZpbGU9Ii4uL2FzZi1sb2dvLmdpZi5NRDUiCisgICAgICAgICAgICBvdmVyd3JpdGU9InRydWUiIC8+CisgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJuby5sb2dvLk1ENSI+CisgICAgICAgIDxjaGVja3N1bSBmaWxlPSIuLi9hc2YtbG9nby5naWYiIGZpbGVleHQ9Ii5NRDUiIC8+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L3Rlc3R2ZXJpZnk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idmVyaWZ5RnJvbVByb3BlcnR5Ij4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0idmVyaWZ5IiAvPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICAgIDxjaGVja3N1bSBwcm9wZXJ0eT0iY2hlY2tzdW0iIGZpbGU9ImNoZWNrc3VtLnhtbCIvPgorICAgIDxjaGVja3N1bSBwcm9wZXJ0eT0iJHtjaGVja3N1bX0iIGZpbGU9ImNoZWNrc3VtLnhtbCIKKyAgICAgICAgICAgICAgdmVyaWZ5cHJvcGVydHk9InZlcmlmeSIvPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIke3ZlcmlmeX0iIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InZlcmlmeVRvdGFsIj4KKyAgICA8Y2hlY2tzdW0gdG90YWxwcm9wZXJ0eT0idG90YWwiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2NoZWNrc3VtIj4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5NRDUiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NoZWNrc3VtPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9ImVmOGYxNDc3ZmNjOWJmOTM4MzJjMWE3NGY2MjljNjI2IiBhcmcyPSIke3RvdGFsfSIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idmVyaWZ5VG90YWxSQyI+CisgICAgPGNoZWNrc3VtIHRvdGFscHJvcGVydHk9InRvdGFsIj4KKyAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9jaGVja3N1bSI+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5NRDUiLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9yZXNvdXJjZXM+CisgICAgPC9jaGVja3N1bT4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSJlZjhmMTQ3N2ZjYzliZjkzODMyYzFhNzRmNjI5YzYyNiIgYXJnMj0iJHt0b3RhbH0iIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InZlcmlmeUNoZWNrc3VtZGlyIj4KKyAgICA8Y2hlY2tzdW0gdG90YWxwcm9wZXJ0eT0idG90YWwiIHRvZGlyPSIke2Jhc2VkaXJ9L2NoZWNrc3VtL2NoZWNrc3VtcyI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vY2hlY2tzdW0iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLk1ENSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY2hlY2tzdW0+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iZWY4ZjE0NzdmY2M5YmY5MzgzMmMxYTc0ZjYyOWM2MjYiIGFyZzI9IiR7dG90YWx9IiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9InNyY2RpcmZpbGUiPgorICAgICAgPGZpbGUgZmlsZT0iY2hlY2tzdW0vZm9vL3phcC9FZW5pZS5NRDUiIC8+CisgICAgPC9wYXRoY29udmVydD4KKyAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9ImRlc3RkaXJmaWxlIj4KKyAgICAgIDxmaWxlIGZpbGU9ImNoZWNrc3VtL2NoZWNrc3Vtcy9mb28vemFwL0VlbmllLk1ENSIgLz4KKyAgICA8L3BhdGhjb252ZXJ0PgorICAgIDxmYWlsIG1lc3NhZ2U9IkNoZWNrc3VtcyBzaG91bGQgYmUgd3JpdHRlbiB0byAke2Rlc3RkaXJmaWxlfSI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtkZXN0ZGlyZmlsZX0iIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICAgIDxmYWlsIG1lc3NhZ2U9IkNoZWNrc3VtcyBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8gJHtzcmNkaXJmaWxlfSI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7c3JjZGlyZmlsZX0iIC8+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gYnVnIHJlcG9ydCAyNTYwNiAtLT4KKyAgPHRhcmdldCBuYW1lPSJ2ZXJpZnlDaGVja3N1bWRpck5vVG90YWwiPgorICAgIDxjaGVja3N1bSB0b2Rpcj0iJHtiYXNlZGlyfS9jaGVja3N1bS9jaGVja3N1bXMiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2NoZWNrc3VtIj4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5NRDUiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NoZWNrc3VtPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2hlY2tzdW0vZm9vL0JhciBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NoZWNrc3VtL2Zvby9CYXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiYzhlZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NoZWNrc3VtL2Zvby9CYXIKQEAgLTAsMCArMSBAQAorQmFyYmFwYXBhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2hlY2tzdW0vZm9vL3phcC9FZW5pZSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NoZWNrc3VtL2Zvby96YXAvRWVuaWUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDY4OTE3NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NoZWNrc3VtL2Zvby96YXAvRWVuaWUKQEAgLTAsMCArMSBAQAorTWVlbmllIE1pbmllIE1vZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NsYXNzbG9hZGVyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NsYXNzbG9hZGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmU0N2FiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2xhc3Nsb2FkZXIueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iY2xhc3Nsb2FkZXItdGVzdCIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKworICAgIDxwYXRoIGlkPSJteUphcnMiID4KKyAgICAgIDwhLS0gYm90aCBhbnQtanVuaXQuamFyIGFuZCBqdW5pdC5qYXIgbXVzdCBiZSBsb2FkZWQgZnJvbSB0aGUgc2FtZSBwYXRoIC0tPgorICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YW50LmhvbWV9L2xpYi9hbnQtanVuaXQuamFyIiAvPgorICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7anVuaXQuamFyfSIgLz4KKyAgICA8L3BhdGg+CisKKyAgICA8Y2xhc3Nsb2FkZXIgY2xhc3NwYXRoUmVmPSJteUphcnMiIAorICAgICAgICAgICAgICAgICByZXZlcnNlPSJ0cnVlIiA+CisgICAgICAKKyAgICA8L2NsYXNzbG9hZGVyPgorICAgIDxqdW5pdCAvPgorICAKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZWNobyBtZXNzYWdlPSJGb3VuZCBKVU5JVCIgLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmNhdC1pbnB1dC9BIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uY2F0LWlucHV0L0EKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2NWVmZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmNhdC1pbnB1dC9BCkBAIC0wLDAgKzEgQEAKK2EKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25jYXQtaW5wdXQvQiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmNhdC1pbnB1dC9CCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDhkYmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25jYXQtaW5wdXQvQgpAQCAtMCwwICsxIEBACitiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uY2F0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmNhdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmNGUwYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmNhdC54bWwKQEAgLTAsMCArMSwyMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJjb25jYXQtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ0bXAuZmlsZSIgdmFsdWU9ImNvbmNhdC50bXAiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0bXAuZmlsZS4yIiB2YWx1ZT0iY29uY2F0LnRtcC4yIiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ3b3JsZCIgdmFsdWU9IldvcmxkIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBmaWxlPSJURVNUREVTVCIvPgorICAgIDxkZWxldGUgZmlsZT0iJHt0bXAuZmlsZX0iLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7dG1wLmZpbGUuMn0iLz4KKyAgICA8ZGVsZXRlIGZpbGU9ImNvbmNhdC5saW5lNCIvPgorICAgIDxkZWxldGUgZmlsZT0iY29uY2F0Lm5vZW9sIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJjb25jYXQubGluZWNyIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJjb25jYXQudXRmOCIvPgorICAgIDxkZWxldGUgZmlsZT0iY29uY2F0LnVybHMiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGNvbmNhdD4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0iIj5IZWxsbywgJHt3b3JsZH0hPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiPgorICAgIDxjb25jYXQgZGVzdGZpbGU9IiR7dG1wLmZpbGV9Ij5IZWxsbywgJHt3b3JsZH0hPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgIDxjb25jYXQgZGVzdGZpbGU9IiR7dG1wLmZpbGUuMn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iJHt0bXAuZmlsZX0iIC8+CisgICAgICA8ZmlsZWxpc3QgZGlyPSIke2Jhc2VkaXJ9IiBmaWxlcz0iJHt0bXAuZmlsZX0sJHt0bXAuZmlsZX0iIC8+CisgICAgPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDxjb25jYXQ+SGVsbG8sICR7d29ybGR9ITwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJURVNUREVTVCIgYXBwZW5kPSJ0cnVlIj4KKyAgICAgIDxmaWxlbGlzdCBkaXI9IiR7YmFzZWRpcn0iIGZpbGVzPSJ0aGlzZmlsZWRvZXNub3RleGlzdCIvPgorICAgIDwvY29uY2F0PgorICAgIDxhdmFpbGFibGUgZmlsZT0iVEVTVERFU1QiIHByb3BlcnR5PSJURVNUREVTVC53YXMuY3JlYXRlZCIvPgorICAgIDxmYWlsIG1lc3NhZ2U9IlRFU1RERVNUIGNyZWF0ZWQgZm9yIG5vbmV4aXN0YW50IGZpbGVzIgorICAgICAgICAgIGlmPSJURVNUREVTVC53YXMuY3JlYXRlZCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDb25jYXROb05ld2xpbmUiPgorICAgIDxjb25jYXQ+CisgICAgICA8ZmlsZXNldCBkaXI9ImNvbmNhdC1pbnB1dCIvPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDb25jYXROb05ld2xpbmVFbmNvZGluZyI+CisgICAgPGNvbmNhdCBlbmNvZGluZz0iQVNDSUkiPgorICAgICAgPGZpbGVzZXQgZGlyPSJjb25jYXQtaW5wdXQiLz4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UGF0aCI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0iJHt0bXAuZmlsZS4yfSI+CisgICAgICA8cGF0aCBwYXRoPSIke3RtcC5maWxlfSIvPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RBcHBlbmQiPgorICAgIDxjb25jYXQgZGVzdGZpbGU9IiR7dG1wLmZpbGUuMn0iPgorICAgICAgPHBhdGggcGF0aD0iJHt0bXAuZmlsZX0iLz4KKyAgICA8L2NvbmNhdD4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSIke3RtcC5maWxlLjJ9IiBhcHBlbmQ9InRydWUiPgorICAgICAgPHBhdGggcGF0aD0iJHt0bXAuZmlsZX0iLz4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZmlsdGVyIj4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSIke3RtcC5maWxlfSI+QFJFUExBQ0VNRUA8L2NvbmNhdD4KKyAgICA8Y29uY2F0PgorICAgICAgPHBhdGggcGF0aD0iJHt0bXAuZmlsZX0iLz4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPHJlcGxhY2V0b2tlbnM+CisgICAgICAgICAgPHRva2VuIGtleT0iUkVQTEFDRU1FIiB2YWx1ZT0iUkVQTEFDRUQiLz4KKyAgICAgICAgPC9yZXBsYWNldG9rZW5zPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bm9vdmVyd3JpdGUiPgorICAgIDx0b3VjaCBmaWxlPSIke3RtcC5maWxlLjJ9Ii8+CisgICAgPCEtLSBjb25jYXQueG1sIGlzIG5vdyBvbGRlciB0aGFuIHRtcC5maWxlLjIKKyAgICAgICAgIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyAtLT4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSIke3RtcC5maWxlLjJ9IiBmb3JjZT0iZmFsc2UiPgorICAgICAgPHBhdGggcGF0aD0iY29uY2F0LnhtbCIvPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RoZWFkZXJmb290ZXIiPgorICAgIDxjb25jYXQ+CisgICAgICA8aGVhZGVyIGZpbHRlcmluZz0iZmFsc2UiIHRyaW09InllcyI+CisgICAgICAgIGhlYWRlcgorICAgICAgPC9oZWFkZXI+CisgICAgICA8cGF0aCBwYXRoPSIke3RtcC5maWxlfSIvPgorICAgICAgPGZvb3RlciBmaWx0ZXJpbmc9Im5vIj5mb290ZXI8L2Zvb3Rlcj4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZmlsZWhlYWRlciI+CisgICAgPGNvbmNhdD4KKyAgICAgIDxoZWFkZXIgZmlsZT0iJHt0bXAuZmlsZX0iLz4KKyAgICAgIDxwYXRoIHBhdGg9IiR7dG1wLmZpbGV9Ii8+CisgICAgPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2FtZWZpbGUiPgorICAgIDx0b3VjaCBmaWxlPSIke3RtcC5maWxlfSIvPgorICAgIDxjb25jYXQgZGVzdGZpbGU9IiR7dG1wLmZpbGV9Ij4KKyAgICAgIDxwYXRoIHBhdGg9IiR7dG1wLmZpbGV9Ii8+CisgICAgPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGZpbHRlcmlubGluZSI+CisgICAgPGNvbmNhdD4KKyAgICAgIEBSRVBMQUNFTUVACisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxyZXBsYWNldG9rZW5zPgorICAgICAgICAgIDx0b2tlbiBrZXk9IlJFUExBQ0VNRSIgdmFsdWU9IlJFUExBQ0VEIi8+CisgICAgICAgIDwvcmVwbGFjZXRva2Vucz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bXVsdGlyZWFkZXIiPgorICAgIDxjb25jYXQgZGVzdGZpbGU9IiR7dG1wLmZpbGV9Ij5IZWxsbywgV29ybGQKKyAgICA8L2NvbmNhdD4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSIke3RtcC5maWxlLjJ9Ij5CeWUsIFdvcmxkCisgICAgPC9jb25jYXQ+CisgICAgPGNvbmNhdD4KKyAgICAgIDxwYXRoIHBhdGg9IiR7dG1wLmZpbGV9Ii8+CisgICAgICA8cGF0aCBwYXRoPSIke3RtcC5maWxlfSIvPgorICAgICAgPHBhdGggcGF0aD0iJHt0bXAuZmlsZX0iLz4KKyAgICAgIDxwYXRoIHBhdGg9IiR7dG1wLmZpbGV9Ii8+CisgICAgICA8cGF0aCBwYXRoPSIke3RtcC5maWxlfSIvPgorICAgICAgPHBhdGggcGF0aD0iJHt0bXAuZmlsZX0iLz4KKyAgICAgIDxwYXRoIHBhdGg9IiR7dG1wLmZpbGV9Ii8+CisgICAgICA8cGF0aCBwYXRoPSIke3RtcC5maWxlfSIvPgorICAgICAgPHBhdGggcGF0aD0iJHt0bXAuZmlsZX0iLz4KKyAgICAgIDwhLS0gdGFpbGZpbHRlciBzZWVtcyB0byBiZWhhdmUgYSBsaXR0bGUgc3RhbmdlLCBwbGFjZSB0d28KKyAgICAgICAgICAgaGVyZSBpbiBjYXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzIC0tPgorICAgICAgPHBhdGggcGF0aD0iJHt0bXAuZmlsZS4yfSIvPgorICAgICAgPHBhdGggcGF0aD0iJHt0bXAuZmlsZS4yfSIvPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8dGFpbGZpbHRlciBsaW5lcz0iMiIvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZS1ub2VsIj4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJjb25jYXQubm9lb2wiPlRoaXMgaGFzIG5vIGVuZCBvZiBsaW5lPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGZpeGxhc3RsaW5lIiBkZXBlbmRzPSJjcmVhdGUtbm9lbCI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0iY29uY2F0LmxpbmU0IiBmaXhsYXN0bGluZT0ieWVzIj4KKyAgICAgIDxwYXRoIHBhdGg9ImNvbmNhdC5ub2VvbCIvPgorICAgICAgPHBhdGggcGF0aD0iY29uY2F0Lm5vZW9sIi8+CisgICAgICA8cGF0aCBwYXRoPSJjb25jYXQubm9lb2wiLz4KKyAgICAgIDxwYXRoIHBhdGg9ImNvbmNhdC5ub2VvbCIvPgorICAgIDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RmaXhsYXN0bGluZWVvbCIgZGVwZW5kcz0iY3JlYXRlLW5vZWwiPgorICAgIDxjb25jYXQgZGVzdGZpbGU9ImNvbmNhdC5saW5lY3IiIGZpeGxhc3RsaW5lPSJ5ZXMiIGVvbD0ibWFjIj4KKyAgICAgIDxwYXRoIHBhdGg9ImNvbmNhdC5ub2VvbCIvPgorICAgICAgPHBhdGggcGF0aD0iY29uY2F0Lm5vZW9sIi8+CisgICAgPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFRyYW5zY29kaW5nIj4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJjb25jYXQudXRmOCIKKyAgICAgICAgICAgIGVuY29kaW5nPSJJU084ODU5XzEiIG91dHB1dGVuY29kaW5nPSJVVEY4Ij4KKyAgICAgIDxwYXRoIHBhdGg9ImNvcHkvaW5wdXQvaXNvODg1OS0xIi8+CisgICAgPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlc291cmNlcyIgdW5sZXNzPSJvZmZsaW5lIj4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJjb25jYXQudXJscyIgYmluYXJ5PSJ0cnVlIj4KKyAgICAgIDx1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmciIC8+CisgICAgICA8dXJsIHVybD0iaHR0cDovL2FudC5hcGFjaGUub3JnIiAvPgorICAgIDwvY29uY2F0PgorICAgIDxsZW5ndGggcHJvcGVydHk9ImV4cGVjdGVkIj4KKyAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgIDx1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmciIC8+CisgICAgICAgIDx1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmciIC8+CisgICAgICA8L3Jlc291cmNlcz4KKyAgICA8L2xlbmd0aD4KKyAgICA8bGVuZ3RoIHByb3BlcnR5PSJhY3R1YWwiPgorICAgICAgPGZpbGVzZXQgZmlsZT0iY29uY2F0LnVybHMiIC8+CisgICAgPC9sZW5ndGg+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8b3I+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2FjdHVhbH0iIGFyZzI9IjAiIC8+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHthY3R1YWx9IiBhcmcyPSIke2V4cGVjdGVkfSIgLz4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9vcj4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNjYwYWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb24ueG1sCkBAIC0wLDAgKzEsNTIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSB0ZXN0IGNvbmRpdGlvbmluZyAtLT4KKzxwcm9qZWN0IG5hbWU9ImNvbmRpdGlvbi10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJiYXNpYyI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYmFzaWMiPgorICAgICAgPGVxdWFscyBhcmcxPSJhIiBhcmcyPSJhIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7YmFzaWN9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbmRpdGlvbi1pbmNvbXBsZXRlIj4KKyAgICA8Y29uZGl0aW9uID4KKyAgICAgIDxlcXVhbHMgYXJnMT0iYSIgYXJnMj0iYSIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb25kaXRpb24tZW1wdHkiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbmRpdGlvbi1lbXB0eSIvPgorICAgIDxlY2hvPiR7Y29uZGl0aW9uLWVtcHR5fTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzaG9ydGN1dCI+CisgICAgPHByb3BlcnR5IG5hbWU9InNob3J0Y3V0IiB2YWx1ZT0ic2V0Ii8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic2hvcnRjdXQiPgorICAgICAgPGVxdWFscyBhcmcxPSJhIiBhcmcyPSJhIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7c2hvcnRjdXR9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvbnRzZXQiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImRvbnRzZXQiPgorICAgICAgPGVxdWFscyBhcmcxPSJhIiBhcmcyPSJiIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7ZG9udHNldH08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2V0dmFsdWUiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9InNldHZhbHVlIiB2YWx1ZT0id29vd29vIiA+CisgICAgICA8ZXF1YWxzIGFyZzE9ImEiIGFyZzI9ImEiIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHtzZXR2YWx1ZX08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibmVnYXRpb24iPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5lZ2F0aW9uIj4KKyAgICAgIDxub3Q+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iYSIgYXJnMj0iQiIgLz4KKyAgICAgIDwvbm90PgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7bmVnYXRpb259PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5lZ2F0aW9uZmFsc2UiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5lZ2F0aW9uZmFsc2UiPgorICAgICAgPG5vdD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSJhIiBhcmcyPSJhIiAvPgorICAgICAgPC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHtuZWdhdGlvbmZhbHNlfTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJuZWdhdGlvbmluY29tcGxldGUiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im5lZ2F0aW9uaW5jb21wbGV0ZSI+CisgICAgICA8bm90IC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHtuZWdhdGlvbmluY29tcGxldGV9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImFuZCI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYW5kIj4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iYSIgYXJnMj0iYSIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSJCIiBhcmcyPSJCIiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHthbmR9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImFuZGZhaWxzIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJhbmRmYWlscyI+CisgICAgICA8YW5kPgorICAgICAgICA8ZXF1YWxzIGFyZzE9ImEiIGFyZzI9IkIiIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iQiIgYXJnMj0iYSIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7YW5kZmFpbHN9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImFuZGluY29tcGxldGUiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImFuZGluY29tcGxldGUiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSJhIiBhcmcyPSJCIiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHthbmRpbmNvbXBsZXRlfTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbmRlbXB0eSI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYW5kZW1wdHkiPgorICAgICAgPGFuZC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHthbmRlbXB0eX08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ib3IiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im9yIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSJhIiBhcmcyPSJCIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IkIiIGFyZzI9IkIiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7b3J9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im9yaW5jb21wbGV0ZSI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ib3JpbmNvbXBsZXRlIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSJhIiBhcmcyPSJhIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZWNobz4ke29yaW5jb21wbGV0ZX08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ib3JlbXB0eSI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ib3JlbXB0eSI+CisgICAgICA8b3IvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7b3JlbXB0eX08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ib3JmYWlscyI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ib3JmYWlscyI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iYSIgYXJnMj0iQiIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSJCIiBhcmcyPSJhIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZWNobz4ke29yZmFpbHN9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im9yYm90aCI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ib3Jib3RoIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSJhIiBhcmcyPSJhIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IkIiIGFyZzI9IkIiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7b3Jib3RofTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmaWxlc21hdGNoLWlkZW50aWNhbCIgPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImZpbGVzbWF0Y2gtaWRlbnRpY2FsIj4KKyAgICAgICAgPGZpbGVzbWF0Y2gKKyAgICAgICAgICBmaWxlMT0iY29uZGl0aW9uLnhtbCIKKyAgICAgICAgICBmaWxlMj0iY29uZGl0aW9uLnhtbCIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZWNobz4ke2ZpbGVzbWF0Y2gtaWRlbnRpY2FsfTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmaWxlc21hdGNoLWluY29tcGxldGUiID4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJmaWxlc21hdGNoLWluY29tcGxldGUiPgorICAgICAgICA8ZmlsZXNtYXRjaAorICAgICAgICAgIGZpbGUxPSJjb25kaXRpb24ueG1sIi8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHtmaWxlc21hdGNoLWluY29tcGxldGV9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZpbGVzbWF0Y2gtb2Rkc2l6ZXMiID4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJmaWxlc21hdGNoLW9kZHNpemVzIj4KKyAgICAgICAgPGZpbGVzbWF0Y2gKKyAgICAgICAgICBmaWxlMT0iY29uZGl0aW9uLnhtbCIKKyAgICAgICAgICBmaWxlMj0icHJvcGVydHkueG1sIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7ZmlsZXNtYXRjaC1vZGRzaXplc308L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmlsZXNtYXRjaC1leGlzdGVuY2UiID4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJmaWxlc21hdGNoLWV4aXN0ZW5jZSI+CisgICAgICA8ZmlsZXNtYXRjaAorICAgICAgICBmaWxlMT0iY29uZGl0aW9uLnhtbCIKKyAgICAgICAgZmlsZTI9InRoaXMtZmlsZS1kb2VzbnQtZXhpc3QueG1sIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7ZmlsZXNtYXRjaC1leGlzdGVuY2V9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZpbGVzbWF0Y2gtbmVpdGhlcmV4aXN0Ij4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGZpbGVzbWF0Y2ggZmlsZTE9Imlkb25vdGV4aXN0IiBmaWxlMj0iYW5kbmVpdGhlcmRvaSIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmlsZXNtYXRjaC1kaWZmZXJlbnQiPgorICAgIDxlY2hvIGZpbGU9Im1hdGNoMS50eHQiIG1lc3NhZ2U9IjAxMjM0NTY3Njg5MCIgLz4KKyAgICA8ZWNobyBmaWxlPSJtYXRjaDIudHh0IiBtZXNzYWdlPSIwMTIzNDU2NzY4ODkiIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZmlsZXNtYXRjaC1kaWZmZXJlbnQiPgorICAgICAgPGZpbGVzbWF0Y2gKKyAgICAgICAgZmlsZTE9Im1hdGNoMS50eHQiCisgICAgICAgIGZpbGUyPSJtYXRjaDIudHh0IiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7ZmlsZXNtYXRjaC1kaWZmZXJlbnR9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZpbGVzbWF0Y2gtbWF0Y2giID4KKyAgICA8ZWNobyBmaWxlPSJtYXRjaDMudHh0IiBtZXNzYWdlPSIwMTIzNDU2NzY4OTAiIC8+CisgICAgPGVjaG8gZmlsZT0ibWF0Y2g0LnR4dCIgbWVzc2FnZT0iMDEyMzQ1Njc2ODkwIiAvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImZpbGVzbWF0Y2gtbWF0Y2giPgorICAgICAgPGZpbGVzbWF0Y2gKKyAgICAgICAgZmlsZTE9Im1hdGNoMy50eHQiCisgICAgICAgIGZpbGUyPSJtYXRjaDQudHh0IiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7ZmlsZXNtYXRjaC1tYXRjaH08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmlsZXNtYXRjaC1kaWZmZXJlbnQtZW9sIiA+CisgICAgPGVjaG8gZmlsZT0ibWF0Y2g3LnR4dCIgbWVzc2FnZT0iMDEyMzQ1Njc2ODkwIiAvPgorICAgIDxlY2hvIGZpbGU9Im1hdGNoOC50eHQiIG1lc3NhZ2U9IjAxMjM0NTY3Njg5MCIgLz4KKyAgICA8Zml4Y3JsZiBmaWxlPSJtYXRjaDcudHh0IiBlb2w9ImNyIiBmaXhsYXN0PSJ0cnVlIiAvPgorICAgIDxmaXhjcmxmIGZpbGU9Im1hdGNoOC50eHQiIGVvbD0ibGYiIGZpeGxhc3Q9InRydWUiIC8+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8ZmlsZXNtYXRjaCBmaWxlMT0ibWF0Y2g3LnR4dCIgZmlsZTI9Im1hdGNoOC50eHQiIC8+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmlsZXNtYXRjaC1zYW1lLWVvbCIgPgorICAgIDxlY2hvIGZpbGU9Im1hdGNoOS50eHQiIG1lc3NhZ2U9IjAxMjM0NTY3Njg5MCIgLz4KKyAgICA8ZWNobyBmaWxlPSJtYXRjaDEwLnR4dCIgbWVzc2FnZT0iMDEyMzQ1Njc2ODkwIiAvPgorICAgIDxmaXhjcmxmIGZpbGU9Im1hdGNoOS50eHQiIGVvbD0iY3JsZiIgZml4bGFzdD0idHJ1ZSIgLz4KKyAgICA8Zml4Y3JsZiBmaWxlPSJtYXRjaDEwLnR4dCIgZW9sPSJsZiIgZml4bGFzdD0idHJ1ZSIgLz4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGZpbGVzbWF0Y2ggZmlsZTE9Im1hdGNoOS50eHQiIGZpbGUyPSJtYXRjaDEwLnR4dCIgdGV4dGZpbGU9InRydWUiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZpbGVzbWF0Y2gtZGlmZmVyZW50LXNpemVzIj4KKyAgICA8ZWNobyBmaWxlPSJtYXRjaDUudHh0IiBtZXNzYWdlPSIwMTIzNDU2NzY4OTAiIC8+CisgICAgPGVjaG8gZmlsZT0ibWF0Y2g2LnR4dCIgbWVzc2FnZT0iMDEyMzQ1Njc2OCIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJmaWxlc21hdGNoLWRpZmZlcmVudC1zaXplcyI+CisgICAgICA8ZmlsZXNtYXRjaAorICAgICAgICBmaWxlMT0ibWF0Y2g1LnR4dCIKKyAgICAgICAgZmlsZTI9Im1hdGNoNi50eHQiIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHtmaWxlc21hdGNoLWRpZmZlcmVudC1zaXplc308L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmlsZXNtYXRjaC1kaWZmZXJlbnQtb25lbWlzc2luZyI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZmlsZXNtYXRjaC1kaWZmZXJlbnQtc2l6ZXMiPgorICAgICAgPGZpbGVzbWF0Y2gKKyAgICAgICAgZmlsZTE9ImNvbmRpdGlvbi54bWwiCisgICAgICAgIGZpbGUyPSJtaXNzaW5nLWZpbGUudHh0IiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7ZmlsZXNtYXRjaC1kaWZmZXJlbnQtb25lbWlzc2luZ308L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29udGFpbnMiID4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb250YWlucyI+CisgICAgICA8Y29udGFpbnMKKyAgICAgICAgc3RyaW5nPSJhYmNkIgorICAgICAgICBzdWJzdHJpbmc9ImNkIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7Y29udGFpbnN9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbnRhaW5zLWRvZXNudCIgPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbnRhaW5zLWRvZXNudCI+CisgICAgICA8Y29udGFpbnMKKyAgICAgICAgc3RyaW5nPSJhYmNkIgorICAgICAgICBzdWJzdHJpbmc9IkNEIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7Y29udGFpbnMtZG9lc250fTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb250YWlucy1hbnljYXNlIiA+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29udGFpbnMtYW55Y2FzZSI+CisgICAgICA8Y29udGFpbnMgY2FzZXNlbnNpdGl2ZT0iZmFsc2UiCisgICAgICAgIHN0cmluZz0iYWJjZCIKKyAgICAgICAgc3Vic3RyaW5nPSJDRCIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZWNobz4ke2NvbnRhaW5zLWFueWNhc2V9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbnRhaW5zLWluY29tcGxldGUxIiA+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29udGFpbnMtaW5jb21wbGV0ZTEiPgorICAgICAgPGNvbnRhaW5zCisgICAgICAgIHN0cmluZz0iYWJjZCIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZWNobz4ke2NvbnRhaW5zLWluY29tcGxldGUxfTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb250YWlucy1pbmNvbXBsZXRlMiIgPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbnRhaW5zLWluY29tcGxldGUyIj4KKyAgICAgIDxjb250YWlucworICAgICAgICBzdWJzdHJpbmc9IkNEIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7Y29udGFpbnMtaW5jb21wbGV0ZTJ9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImlzdHJ1ZSIgPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0IiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibyIgdmFsdWU9Im8iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9Im4iIHZhbHVlPSJuIiAvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImlzdHJ1ZSI+CisgICAgICA8YW5kPgorICAgICAgICA8aXN0cnVlIHZhbHVlPSIke3R9IiAvPgorICAgICAgICA8aXN0cnVlIHZhbHVlPSJUUlVFIiAvPgorICAgICAgICA8aXN0cnVlIHZhbHVlPSJ5ZXMiIC8+CisgICAgICAgIDxpc3RydWUgdmFsdWU9IlllUyIgLz4KKyAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0ib24iIC8+CisgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7b30ke259IiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHtpc3RydWV9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImlzdHJ1ZS1ub3QiID4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJpc3RydWUtbm90Ij4KKyAgICAgIDxpc3RydWUKKyAgICAgICAgdmFsdWU9InRoaXMgc2VudGVuY2UgaXMgdHJ1ZSIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZWNobz4ke2lzdHJ1ZS1ub3R9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImlzdHJ1ZS1mYWxzZSIgPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImlzdHJ1ZS1mYWxzZSI+CisgICAgICA8b3I+CisgICAgICAgIDxpc3RydWUgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8aXN0cnVlIHZhbHVlPSIiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7aXN0cnVlLWZhbHNlfTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpc3RydWUtaW5jb21wbGV0ZSIgPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImlzdHJ1ZS1pbmNvbXBsZXRlIj4KKyAgICAgIDxpc3RydWUgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZWNobz4ke2lzdHJ1ZS1pbmNvbXBsZXRlfTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpc2ZhbHNlLXRydWUiID4KKyAgICA8cHJvcGVydHkgbmFtZT0idCIgdmFsdWU9InRydWUiIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iaXNmYWxzZS10cnVlIj4KKyAgICAgIDxpc2ZhbHNlCisgICAgICAgIHZhbHVlPSIke3R9IiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7aXNmYWxzZS10cnVlfTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpc2ZhbHNlLW5vdCIgPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImlzZmFsc2Utbm90Ij4KKyAgICAgIDxpc2ZhbHNlCisgICAgICAgIHZhbHVlPSJ0aGlzIHNlbnRlbmNlIGlzIHRydWUiIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHtpc2ZhbHNlLW5vdH08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaXNmYWxzZS1mYWxzZSIgPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImlzZmFsc2UtZmFsc2UiPgorICAgICAgPGlzZmFsc2UKKyAgICAgICAgdmFsdWU9ImZhbHNlIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxlY2hvPiR7aXNmYWxzZS1mYWxzZX08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaXNmYWxzZS1pbmNvbXBsZXRlIiA+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iaXNmYWxzZS1pbmNvbXBsZXRlIj4KKyAgICAgIDxpc2ZhbHNlIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGVjaG8+JHtpc2ZhbHNlLWluY29tcGxldGV9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFbHNlIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ1bnNldCIgdmFsdWU9ImZvbyI+CisgICAgICA8b3IgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2YWx1ZSIgdmFsdWU9ImZvbyIgZWxzZT0iYmFyIj4KKyAgICAgIDxhbmQgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJlbHNlIiB2YWx1ZT0iZm9vIiBlbHNlPSJiYXIiPgorICAgICAgPG9yIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8b3I+CisgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ1bnNldCIgLz4KKyAgICAgICAgICA8bm90PgorICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3ZhbHVlfSIgYXJnMj0iZm9vIiAvPgorICAgICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZWxzZX0iIGFyZzI9ImJhciIgLz4KKyAgICAgICAgICAgIDwvYW5kPgorICAgICAgICAgIDwvbm90PgorICAgICAgICA8L29yPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlc291cmNlc21hdGNoLWVycm9yIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJlcnJvcmV4cGVjdGVkIj4KKyAgICAgIDxyZXNvdXJjZXNtYXRjaCAvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlc291cmNlc21hdGNoLW1hdGNoLWVtcHR5Ij4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJlcnJvcmV4cGVjdGVkIj4KKyAgICAgIDxyZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPHJlc291cmNlcyAvPgorICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZXNvdXJjZXNtYXRjaC1tYXRjaC1vbmUiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImVycm9yZXhwZWN0ZWQiPgorICAgICAgPHJlc291cmNlc21hdGNoPgorICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28iIC8+CisgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlc291cmNlc21hdGNoLW1hdGNoLWJpbmFyeSI+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyIgLz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZXNvdXJjZXNtYXRjaC1tYXRjaC1tdWx0aXBsZS1iaW5hcnkiPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2VzbWF0Y2g+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28iIC8+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28iIC8+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28iIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVzb3VyY2VzbWF0Y2gtZGlmZmVyIj4KKyAgICA8ZWNobyBmaWxlPSJtYXRjaDExLnR4dCIgbWVzc2FnZT0iZm9vIiAvPgorICAgIDxmaXhjcmxmIGZpbGU9Im1hdGNoMTEudHh0IiBlb2w9ImNybGYiIGZpeGxhc3Q9InRydWUiIC8+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8cmVzb3VyY2VzbWF0Y2g+CisgICAgICAgICAgPGZpbGUgZmlsZT0ibWF0Y2gxMS50eHQiIC8+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZm9vIiAvPgorICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlc291cmNlc21hdGNoLW1hdGNoLXRleHQiPgorICAgIDxlY2hvIGZpbGU9Im1hdGNoMTEudHh0IiBtZXNzYWdlPSJmb28iIC8+CisgICAgPGZpeGNybGYgZmlsZT0ibWF0Y2gxMS50eHQiIGVvbD0iY3JsZiIgLz4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgICAgICA8ZmlsZSBmaWxlPSJtYXRjaDExLnR4dCIgLz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZXNvdXJjZXNtYXRjaC1ub25lZXhpc3QiPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2VzbWF0Y2g+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm9vIiBleGlzdHM9ImZhbHNlIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImJhciIgZXhpc3RzPSJmYWxzZSIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJiYXoiIGV4aXN0cz0iZmFsc2UiIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCIgPgorICAgIDxkZWxldGU+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJtYXRjaD8udHh0LG1hdGNoPz8udHh0IiAvPgorICAgIDwvZGVsZXRlPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9hbnR2ZXJzaW9uLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvYW50dmVyc2lvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwNmM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvYW50dmVyc2lvbi54bWwKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0YW50dmVyc2lvbiIgZGVmYXVsdD0idGVzdGF0bGVhc3QiPg0KKw0KKwk8dGFyZ2V0IG5hbWU9InRlc3RhdGxlYXN0Ij4NCisJCTxmYWlsPg0KKwkJCTxjb25kaXRpb24+DQorCQkJCTxub3Q+DQorCQkJCQk8YW50dmVyc2lvbiBhdGxlYXN0PSIxLjciIC8+DQorCQkJCTwvbm90Pg0KKwkJCTwvY29uZGl0aW9uPg0KKyAgICAgIAkJU2hvdWxkIGJlIGF0IGxlYXN0IDEuNw0KKyAgICAJPC9mYWlsPg0KKwk8L3RhcmdldD4NCisNCisJPHRhcmdldCBuYW1lPSJ0ZXN0ZXhhY3RseSI+DQorCQk8ZmFpbD4NCisJCQk8Y29uZGl0aW9uPg0KKwkJCQk8bm90Pg0KKwkJCQkJPGFudHZlcnNpb24gZXhhY3RseT0iMS44LjAiIC8+DQorCQkJCTwvbm90Pg0KKwkJCTwvY29uZGl0aW9uPg0KKwkJCVNob3VsZCBiZSBleGFjdGx5IDEuOC4wDQorDQorICAJCTwvZmFpbD4NCisJPC90YXJnZXQ+DQorDQorCTx0YXJnZXQgbmFtZT0idGVzdGF0bGVhc3RmYWlsIj4NCisJCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iMS44LjkiIC8+DQorCQk8ZmFpbD4NCisJCQk8Y29uZGl0aW9uPg0KKwkJCQk8bm90Pg0KKwkJCQkJPGFudHZlcnNpb24gYXRsZWFzdD0iMS45LjAiIC8+DQorCQkJCTwvbm90Pg0KKwkJCTwvY29uZGl0aW9uPg0KKyAgCSAgCVNob3VsZCBiZSBhdCBsZWFzdCAxLjkuMA0KKyAgCQk8L2ZhaWw+DQorCTwvdGFyZ2V0Pg0KKw0KKwk8dGFyZ2V0IG5hbWU9InRlc3RleGFjdGx5ZmFpbCI+DQorCQk8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjEuOC4wIiAvPg0KKwkJPGZhaWw+DQorCQkJPGNvbmRpdGlvbj4NCisJCQkJPG5vdD4NCisJCQkJCTxhbnR2ZXJzaW9uIGV4YWN0bHk9IjEuOS4wIiAvPg0KKwkJCQk8L25vdD4NCisJCQk8L2NvbmRpdGlvbj4NCisJICAJICBTaG91bGQgYmUgZXhhY3RseSAxLjkuMA0KKwkgIAk8L2ZhaWw+DQorCTwvdGFyZ2V0Pg0KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzZmFpbHVyZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzZmFpbHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkMWE2YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNmYWlsdXJlLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9InRlc3Rpc2ZhaWx1cmUiPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGlzZmFpbHVyZSI+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8b3I+CisgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxvcyBmYW1pbHk9Im9wZW52bXMiIC8+CisgICAgICAgICAgICA8b3I+CisgICAgICAgICAgICAgIDxpc2ZhaWx1cmUgY29kZT0iMSIgLz4KKyAgICAgICAgICAgICAgPGlzZmFpbHVyZSBjb2RlPSIzIiAvPgorICAgICAgICAgICAgICA8aXNmYWlsdXJlIGNvZGU9IjUiIC8+CisgICAgICAgICAgICAgIDxpc2ZhaWx1cmUgY29kZT0iNyIgLz4KKyAgICAgICAgICAgICAgPGlzZmFpbHVyZSBjb2RlPSI5IiAvPgorICAgICAgICAgICAgICA8bm90PgorICAgICAgICAgICAgICAgIDxhbmQ+CisgICAgICAgICAgICAgICAgICA8aXNmYWlsdXJlIGNvZGU9IjAiIC8+CisgICAgICAgICAgICAgICAgICA8aXNmYWlsdXJlIGNvZGU9IjIiIC8+CisgICAgICAgICAgICAgICAgICA8aXNmYWlsdXJlIGNvZGU9IjQiIC8+CisgICAgICAgICAgICAgICAgICA8aXNmYWlsdXJlIGNvZGU9IjYiIC8+CisgICAgICAgICAgICAgICAgICA8aXNmYWlsdXJlIGNvZGU9IjgiIC8+CisgICAgICAgICAgICAgICAgPC9hbmQ+CisgICAgICAgICAgICAgIDwvbm90PgorICAgICAgICAgICAgPC9vcj4KKyAgICAgICAgICA8L2FuZD4KKyAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgICAgPG9zIGZhbWlseT0ib3BlbnZtcyIgLz4KKyAgICAgICAgICAgIDwvbm90PgorICAgICAgICAgICAgPG9yPgorICAgICAgICAgICAgICA8aXNmYWlsdXJlIGNvZGU9IjAiIC8+CisgICAgICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgICAgIDxpc2ZhaWx1cmUgY29kZT0iMSIgLz4KKyAgICAgICAgICAgICAgICAgIDxpc2ZhaWx1cmUgY29kZT0iMTAiIC8+CisgICAgICAgICAgICAgICAgICA8aXNmYWlsdXJlIGNvZGU9IjUwIiAvPgorICAgICAgICAgICAgICAgICAgPGlzZmFpbHVyZSBjb2RlPSIxMDAiIC8+CisgICAgICAgICAgICAgICAgICA8aXNmYWlsdXJlIGNvZGU9IjI1NSIgLz4KKyAgICAgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgICAgICAgPC9ub3Q+CisgICAgICAgICAgICA8L29yPgorICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L29yPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9pc2ZpbGVzZWxlY3RlZC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzZmlsZXNlbGVjdGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI2ZWVkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9pc2ZpbGVzZWxlY3RlZC54bWwKQEAgLTAsMCArMSw3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgPG1hY3JvZGVmIG5hbWU9InBhc3MiPgorICAgIDxlbGVtZW50IG5hbWU9ImNvbmRpdGlvbnMiIGltcGxpY2l0PSJ5ZXMiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxtZXNzYWdlIi8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZmFpbCBtZXNzYWdlPSJAe2ZhaWxtZXNzYWdlfSI+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxjb25kaXRpb25zLz4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICA8L2ZhaWw+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDx0YXJnZXQgbmFtZT0ic2ltcGxlIj4KKyAgICA8cGFzcyBmYWlsbWVzc2FnZT0iYSBzaW1wbGUgdGVzdCI+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iamFycy9wYXNzLmphciI+CisgICAgICAgIDxzaWduZWRzZWxlY3Rvci8+CisgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgIDwvcGFzcz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJuYW1lIj4KKyAgICA8cGFzcyBmYWlsbWVzc2FnZT0ibmFtZSBkaWQgbm90IG1hdGNoIj4KKyAgICAgIDxpc2ZpbGVzZWxlY3RlZCBmaWxlPSJqYXJzL25vc2lnbi5qYXIiPgorICAgICAgICA8ZmlsZW5hbWUgbmFtZT0iamFycy9ub3NpZ24uamFyIi8+CisgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgIDwvcGFzcz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJiYXNlZGlyIj4KKyAgICA8cGFzcyBmYWlsbWVzc2FnZT0ibmFtZSBkaWQgbm90IG1hdGNoIHdpdGggYSBiYXNlZGlyIGNoYW5nZSI+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iamFycy9ub3NpZ24uamFyIiBiYXNlZGlyPSJqYXJzIj4KKyAgICAgICAgPGZpbGVuYW1lIG5hbWU9Im5vc2lnbi5qYXIiLz4KKyAgICAgIDwvaXNmaWxlc2VsZWN0ZWQ+CisgICAgPC9wYXNzPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InR5cGUiPgorICAgIDxwYXNzIGZhaWxtZXNzYWdlPSJ0eXBlIHNlbGVjdG9yIGRpZCBub3Qgd29yayI+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iaXNmaWxlc2VsZWN0ZWQueG1sIj4KKyAgICAgICAgPHR5cGUgdHlwZT0iZmlsZSIvPgorICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICA8L3Bhc3M+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm90LnNlbGVjdG9yIj4KKyAgICA8ZmlsZXNldCBkaXI9Ii4iPgorICAgICAgPGlzZmlsZXNlbGVjdGVkIGZpbGU9Im5vc2lnbmVkLmphciIvPgorICAgIDwvZmlsZXNldD4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzcmVhY2hhYmxlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWFjaGFibGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzRhZWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzcmVhY2hhYmxlLnhtbApAQCAtMCwwICsxLDEwNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdCBuYW1lPSJpc3JlYWNoYWJsZSI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKworICA8bWFjcm9kZWYgbmFtZT0iYXNzZXJ0SG9zdFJlYWNoYWJsZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJob3N0Ii8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZmFpbCBtZXNzYWdlPSJub3QgcmVhY2hhYmxlOiBAe2hvc3R9Ij4KKyAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICA8bm90PgorICAgICAgICAgICAgPGlzcmVhY2hhYmxlIGhvc3Q9IkB7aG9zdH0iLz4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICA8L2ZhaWw+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDxtYWNyb2RlZiBuYW1lPSJhc3NlcnRIb3N0Tm90UmVhY2hhYmxlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9Imhvc3QiLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxmYWlsIG1lc3NhZ2U9InVuZXhwZWN0ZWRseSByZWFjaGFibGU6IEB7aG9zdH0iPgorICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxpc3JlYWNoYWJsZSBob3N0PSJAe2hvc3R9Ii8+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgPC9mYWlsPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8bWFjcm9kZWYgbmFtZT0iYXNzZXJ0VXJsUmVhY2hhYmxlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9InVybCIvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGZhaWwgbWVzc2FnZT0ibm90IHJlYWNoYWJsZTogQHt1cmx9Ij4KKyAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICA8bm90PgorICAgICAgICAgICAgPGlzcmVhY2hhYmxlIHVybD0iQHt1cmx9Ii8+CisgICAgICAgICAgPC9ub3Q+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgPC9mYWlsPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RMb2NhbGhvc3QiPgorICAgIDxhc3NlcnRIb3N0UmVhY2hhYmxlIGhvc3Q9ImxvY2FsaG9zdCIvPgorICA8L3RhcmdldD4KKworICA8IS0tIGJ1Z3MgaW4gWFBTUDIgbWVhbiB0aGlzIGlzIHRoZSBvbmx5IElQdjQgbG9vcGJhY2sgYWRkciBhbGxvd2VkICAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SXB2NGxvY2FsaG9zdCI+CisgICAgPGFzc2VydEhvc3RSZWFjaGFibGUgaG9zdD0iMTI3LjAuMC4xIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEJvdGgiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImJvdGgiPgorICAgICAgPGlzcmVhY2hhYmxlIGhvc3Q9ImxvY2FsaG9zdCIgdXJsPSJodHRwOi8vbG9jYWxob3N0Ii8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGZhaWw+RXhwZWN0ZWQgZmFpbHVyZSBiZWZvcmUgaGVyZTwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TG9jYWxob3N0VVJMIj4KKyAgICA8YXNzZXJ0VXJsUmVhY2hhYmxlIHVybD0iaHR0cDovL2xvY2FsaG9zdCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJcHY0bG9jYWxob3N0VVJMIj4KKyAgICA8YXNzZXJ0VXJsUmVhY2hhYmxlIHVybD0iaHR0cDovLzEyNy4wLjAuMS8iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RlRQVVJMIj4KKyAgICA8YXNzZXJ0VXJsUmVhY2hhYmxlIHVybD0iZnRwOi8vbG9jYWxob3N0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGUiPgorICAgIDxhc3NlcnRVcmxSZWFjaGFibGUgdXJsPSJmaWxlOi8vYnVpbGQueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEJhZFVSTCI+CisgICAgPGFzc2VydFVybFJlYWNoYWJsZSB1cmw9InV1aWQ6MzM0OS00NDA0LTBhYzBkZGVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEJhZFRpbWVvdXQiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3RCYWRUaW1lb3V0Ij4KKyAgICAgIDxpc3JlYWNoYWJsZSBob3N0PSJsb2NhbGhvc3QiIHRpbWVvdXQ9Ii0xIi8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vVGFyZ2V0cyI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibm9uZSI+CisgICAgICA8aXNyZWFjaGFibGUvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWZlcmVuY2UueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9pc3JlZmVyZW5jZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmODZkYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWZlcmVuY2UueG1sCkBAIC0wLDAgKzEsNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0ibm9wZSI+CisgIDxwYXRoIGlkPSJnbG9iYWwtcGF0aC1pZCIvPgorICA8ZWNobyBpZD0iZWNoby1pZCIvPgorCisgIDx0YXJnZXQgbmFtZT0ibm9wZSI+CisgICAgPGZhaWw+VGhpcyBidWlsZCBmaWxlIHNob3VsZCBiZSBydW4gYnkgYSB0ZXN0Y2FzZTwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkZWZpbmUiPgorICAgIDxwYXRoIGlkPSJ0YXJnZXQtcGF0aC1pZCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImJhc2ljIiBkZXBlbmRzPSJkZWZpbmUiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Imdsb2JhbC1wYXRoIj4KKyAgICAgIDxpc3JlZmVyZW5jZSByZWZpZD0iZ2xvYmFsLXBhdGgtaWQiLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0YXJnZXQtcGF0aCI+CisgICAgICA8aXNyZWZlcmVuY2UgcmVmaWQ9InRhcmdldC1wYXRoLWlkIi8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaXNyZWZlcmVuY2UtaW5jb21wbGV0ZSI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZm9vIj4KKyAgICAgIDxpc3JlZmVyZW5jZS8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idHlwZSI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZ2xvYmFsLXBhdGgiPgorICAgICAgPGlzcmVmZXJlbmNlIHJlZmlkPSJnbG9iYWwtcGF0aC1pZCIgdHlwZT0icGF0aCIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Imdsb2JhbC1wYXRoLWFzLWZpbGVzZXQiPgorICAgICAgPGlzcmVmZXJlbmNlIHJlZmlkPSJnbG9iYWwtcGF0aC1pZCIgdHlwZT0iZmlsZXNldCIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Imdsb2JhbC1wYXRoLWFzLWZvbyI+CisgICAgICA8aXNyZWZlcmVuY2UgcmVmaWQ9Imdsb2JhbC1wYXRoLWlkIiB0eXBlPSJmb28iLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJnbG9iYWwtZWNobyI+CisgICAgICA8aXNyZWZlcmVuY2UgcmVmaWQ9ImVjaG8taWQiIHR5cGU9ImVjaG8iLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzc2lnbmVkLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNzaWduZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmYzMjgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzc2lnbmVkLnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImFsbCI+CisgIAorICA8dGFyZ2V0IG5hbWU9InBhc3MiIGRlc2NyaXB0aW9uPSJjaGVjayBpZiBhIG5hbWUgb2YgcGFzcyBpcyBvayI+CisgICAgPGZhaWwgbWVzc2FnZT0ibmFtZSBvZiBwYXNzIG5vdCBzZWVuIGluIHRoZSBzaWduZWQgcGFzcy5qYXIiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8aXNzaWduZWQgZmlsZT0iamFycy9wYXNzLmphciIgbmFtZT0icGFzcyIvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwYXNzd29yZCIgZGVzY3JpcHRpb249ImNoZWNrIGlmIGEgbmFtZSBvZiBwYXNzd29yZCBpcyAqbm90KiBvayI+CisgICAgPGZhaWwgbWVzc2FnZT0ibmFtZSBvZiBwYXNzd29yZCBpcyBzZWVuIGluIHRoZSBzaWduZWQgcGFzcy5qYXIiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPGlzc2lnbmVkIGZpbGU9ImphcnMvcGFzcy5qYXIiIG5hbWU9InBhc3N3b3JkIi8+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYXBhc3N3b3JkIiBkZXNjcmlwdGlvbj0iY2hlY2sgaWYgdGhlIDggbGV0dGVyIHNob3J0aW5nIHdvcmtzIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSI4IGxldHRlciBzaG9ydGluZyBkb2VzIG5vdCB3b3JrIDEiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8aXNzaWduZWQgZmlsZT0iamFycy9hcGFzc3dvcmQuamFyIiBuYW1lPSJhcGFzc3dvciIvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgICA8ZmFpbCBtZXNzYWdlPSI4IGxldHRlciBzaG9ydGluZyBkb2VzIG5vdCB3b3JrIDIiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8aXNzaWduZWQgZmlsZT0iamFycy9hcGFzc3dvcmQuamFyIiBuYW1lPSJhcGFzc3dvcmQiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYWxsc2lnbmVkIiBkZXNjcmlwdGlvbj0iY2hlY2sgdGhlIHNpZ25lZCAvIG5vdCBzaWduZWQgc3RhdHVzIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSJwYXNzLmphciBzaG91bGQgYmUgc2lnbmVkIj4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGlzc2lnbmVkIGZpbGU9ImphcnMvcGFzcy5qYXIiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgICAgPGZhaWwgbWVzc2FnZT0ibm9zaWduLmphciBzaG91bGQgbm90IGJlIHNpZ25lZCI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8aXNzaWduZWQgZmlsZT0iamFycy9ub3NpZ24uamFyIi8+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisKKyAgICA8ZmFpbCBtZXNzYWdlPSJhcGFzc3dvcmQuamFyIHNob3VsZCBiZSBzaWduZWQiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8aXNzaWduZWQgZmlsZT0iamFycy9hcGFzc3dvcmQuamFyIi8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9qYXJzL2FwYXNzd29yZC5qYXIgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2phcnMvYXBhc3N3b3JkLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ0YWYxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9qYXJzL2FwYXNzd29yZC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9qYXJzL25vc2lnbi5qYXIgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2phcnMvbm9zaWduLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWI3ZjhkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9qYXJzL25vc2lnbi5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9qYXJzL3Bhc3MuamFyIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9qYXJzL3Bhc3MuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDlmMTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2phcnMvcGFzcy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9wYXJzZXJzdXBwb3J0cy54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL3BhcnNlcnN1cHBvcnRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBmZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9wYXJzZXJzdXBwb3J0cy54bWwKQEAgLTAsMCArMSw5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdCBuYW1lPSJwYXJzZXJzdXBwb3J0cyIgPgorPCEtLQorICogICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEVtcHR5Ij4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJlbXB0eSI+CisgICAgICA8cGFyc2Vyc3VwcG9ydHMgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZmFpbD5FeHBlY3RlZCBmYWlsdXJlIGJlZm9yZSBoZXJlPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RCb3RoIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJib3RoIj4KKyAgICAgIDxwYXJzZXJzdXBwb3J0cyBwcm9wZXJ0eT0iaHR0cDovL2JhciIgZmVhdHVyZT0iaHR0cDovL2ZvbyIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxmYWlsPkV4cGVjdGVkIGZhaWx1cmUgYmVmb3JlIGhlcmU8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5hbWVzcGFjZXMiPgorICAgIDxmYWlsPgorICAgIDxjb25kaXRpb24gPgorICAgICAgPG5vdD4KKyAgICAgICAgPHBhcnNlcnN1cHBvcnRzIGZlYXR1cmU9Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIi8+CisgICAgICA8L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICAgIEV4cGVjdGVkIG5hbWVzcGFjZSBzdXBwb3J0CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RQcm9wZXJ0eUludmFsaWQiPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cGFyc2Vyc3VwcG9ydHMKKyAgICAgICAgICAgIHByb3BlcnR5PSJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIgorICAgICAgICAgICAgdmFsdWU9InVuZGVmaW5lZCIvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgICAgRXhwZWN0ZWQgRFREIGRlY2xhcmF0aW9uIHByb3BlcnR5IHNldHRhYmxlLgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UHJvcGVydHlOb1ZhbHVlIj4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHBhcnNlcnN1cHBvcnRzCisgICAgICAgICAgICBwcm9wZXJ0eT0iaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIKKyAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIEV4cGVjdGVkIG5vIHByb3BlcnR5CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdFVua25vd25Qcm9wZXJ0eSI+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxwYXJzZXJzdXBwb3J0cyBwcm9wZXJ0eT0iaHR0cDovL29yZy5hcGFjaGUuYW50L3NvbWV0aGluZyIKKyAgICAgICAgICAgICAgdmFsdWU9InVuZGVmaW5lZCIvPgorICAgICAgPC9jb25kaXRpb24+CisgICAgICBFeHBlY3RlZCB1bnN1cHBvcnRlZCBwcm9wZXJ0eS4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0WGVyY2VzUHJvcGVydHkiPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cGFyc2Vyc3VwcG9ydHMKKyAgICAgICAgICBwcm9wZXJ0eT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLW5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iCisgICAgICAgICAgICB2YWx1ZT0icGFyc2Vyc3VwcG9ydHMueG1sIi8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgICBFeHBlY3RlZCBYU0Qgc3VwcG9ydCBvbiBYZXJjZXMuCisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKyAgCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy90eXBlZm91bmQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy90eXBlZm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NGNhNjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL3R5cGVmb3VuZC54bWwKQEAgLTAsMCArMSw3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0eXBlZm91bmQiPgorCisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RUYXNrIj4KKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGVzdFRhc2siPgorICAgICAgICAgICAgPHR5cGVmb3VuZCBuYW1lPSJlY2hvIi8+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvdGFyZ2V0PgorCisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RVbmRlZmluZWQiPgorICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0VW5kZWZpbmVkIj4KKyAgICAgICAgICAgIDx0eXBlZm91bmQgLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RUYXNrVGhhdElzbnREZWZpbmVkIj4KKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGVzdFRhc2tUaGF0SXNudERlZmluZWQiPgorICAgICAgICAgICAgPHR5cGVmb3VuZCBuYW1lPSJpbnZhbGlkLWFuZC11bmRlZmluZWQtdGFzay1uYW1lIi8+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0VGFza1RoYXREb2VzbnRSZWFsbHlFeGlzdCI+CisgICAgIDx0YXNrZGVmIG5hbWU9ImludmFsaWQtdGFzay1uYW1lIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuaW52YWxpZC50YXNrLm5hbWUuaG9wZWZ1bGx5Ii8+CisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3RUYXNrVGhhdERvZXNudFJlYWxseUV4aXN0Ij4KKyAgICAgICAgICAgIDx0eXBlZm91bmQgbmFtZT0iaW52YWxpZC10YXNrLW5hbWUiLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RUeXBlIj4KKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGVzdFR5cGUiPgorICAgICAgICAgICAgPHR5cGVmb3VuZCBuYW1lPSJwYXRoIi8+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0UHJlc2V0Ij4KKyAgICAgICAgPHByZXNldGRlZiBuYW1lPSJpbXBvcnRhbnQtZWNobyI+CisgICAgICAgICAgICA8ZWNobyBsZXZlbD0iZXJyb3IiLz4KKyAgICAgICAgPC9wcmVzZXRkZWY+CisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3RQcmVzZXQiPgorICAgICAgICAgICAgPHR5cGVmb3VuZCBuYW1lPSJpbXBvcnRhbnQtZWNobyIvPgorICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdE1hY3JvIj4KKyAgICAgICAgPG1hY3JvZGVmIG5hbWU9ImVycm9yLW1lc3NhZ2UiPgorICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgb3B0aW9uYWw9ImZhbHNlIi8+CisgICAgICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgICAgICA8ZWNobyBsZXZlbD0iZXJyb3IiPkB7dGV4dH08L2VjaG8+CisgICAgICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgICAgIDwvbWFjcm9kZWY+CisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3RNYWNybyI+CisgICAgICAgICAgICA8dHlwZWZvdW5kIG5hbWU9ImVycm9yLW1lc3NhZ2UiLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL3hvci54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL3hvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1ZGNjZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMveG9yLnhtbApAQCAtMCwwICsxLDExMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbGwiPgorCis8IS0tIAorICBYb3Igc2VtYW50aWNzCisgIAorICBpbiAgb3V0CisgID09ICA9PT0KKyAgMDAgICAwCisgIDAxICAgMQorICAxMCAgIDEKKyAgMDAgICAwCisKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEVtcHR5IiA+CisgICAgPGZhaWwgbWVzc2FnZT0iZW1wdHkgdGVzdCI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDx4b3IvPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxIiA+CisgICAgPGZhaWwgbWVzc2FnZT0idGVzdFRydWUiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8eG9yPgorICAgICAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICA8L3hvcj4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MCIgPgorICAgIDxmYWlsIG1lc3NhZ2U9InRlc3RGYWxzZSI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDx4b3I+CisgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIiIC8+CisgICAgICAgICAgPC94b3I+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3QxMCIgPgorICAgIDxmYWlsIG1lc3NhZ2U9InRlc3QxMCI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDx4b3I+CisgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iIiAvPgorICAgICAgICAgIDwveG9yPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MDEiID4KKyAgICA8ZmFpbCBtZXNzYWdlPSJ0ZXN0MDEiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8eG9yPgorICAgICAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iIiAvPgorICAgICAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgICA8L3hvcj4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MDAiID4KKyAgICA8ZmFpbCBtZXNzYWdlPSJ0ZXN0MTAiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPHhvcj4KKyAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiIgLz4KKyAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiIgLz4KKyAgICAgICAgPC94b3I+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MTEiID4KKyAgICA8ZmFpbCBtZXNzYWdlPSJ0ZXN0MTEiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICA8eG9yPgorICAgICAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iIiAvPgorICAgICAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iIiAvPgorICAgICAgICAgIDwveG9yPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHkuZmlsdGVyc2V0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29weS5maWx0ZXJzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2M2RkOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHkuZmlsdGVyc2V0CkBAIC0wLDAgKzEgQEAKK1RoaXMgaXMgdGhlIEBUSVRMRUAuCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Y2Y3YzIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5LnhtbApAQCAtMCwwICsxLDI4NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImNvcHktdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxjb3B5IGZpbGU9ImNvcHkueG1sIiB0b2ZpbGU9ImNvcHl0ZXN0MS50bXAiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxjb3B5IGZpbGU9ImNvcHkueG1sIiB0b2Rpcj0iY29weXRlc3QxZGlyIiBvdmVyd3JpdGU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmaWx0ZXJ0ZXN0Ij4KKyAgICA8IS0tIGNoZWNrIGZpeCBmb3IgYnVnemlsbGEgMjMxNTQgLS0+CisgICAgPGRlbGV0ZSBxdWlldD0ieWVzIiBmaWxlPSJjb3B5LmZpbHRlci5vdXQiLz4KKyAgICA8ZGVsZXRlIHF1aWV0PSJ5ZXMiIGZpbGU9ImNvcHkuZmlsdGVyLmlucCIvPgorICAgIDxjb25jYXQgZGVzdGZpbGU9ImNvcHkuZmlsdGVyLmlucCI+CitQUk9EVUNUX1ZFUlNJT049Ni4yLjEuNAorUFJPRFVDVF9CVUlMRD02LjUgKEJMRF82NTAzNikKK1BST0RVQ1RfVkVSU0lPTj02LjIuMS40CitQUk9EVUNUX0JVSUxEPTYuNSAoQkxEXzY1MDM2KQorICAgIDwvY29uY2F0PgorICAgIDxjb3B5IGZpbGU9ImNvcHkuZmlsdGVyLmlucCIgdG9maWxlPSJjb3B5LmZpbHRlci5vdXQiPgorICAgICAgPGZpbHRlcnNldCBiZWdpbnRva2VuPSI2IiBlbmR0b2tlbj0iNCI+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49Ii4yLjEuIiB2YWx1ZT0iMi42LjQiIC8+CisgICAgICA8L2ZpbHRlcnNldD4KKyAgICA8L2NvcHk+CisgICAgPGNvbmNhdD48cGF0aCBwYXRoPSJjb3B5LmZpbHRlci5vdXQiLz48L2NvbmNhdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbmZpbml0ZXRlc3QiPgorICAgIDxkZWxldGUgcXVpZXQ9InllcyIgZmlsZT0iY29weS5maWx0ZXIub3V0Ii8+CisgICAgPGRlbGV0ZSBxdWlldD0ieWVzIiBmaWxlPSJjb3B5LmZpbHRlci5pbnAiLz4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSJjb3B5LmZpbHRlci5pbnAiPgorYT1iPQorICAgIDwvY29uY2F0PgorICAgIDxjb3B5IGZpbGU9ImNvcHkuZmlsdGVyLmlucCIgdG9maWxlPSJjb3B5LmZpbHRlci5vdXQiPgorICAgICAgPGZpbHRlcnNldCBiZWdpbnRva2VuPSI9IiBlbmR0b2tlbj0iPSI+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49ImIiIHZhbHVlPSI9Yj0iLz4KKyAgICAgIDwvZmlsdGVyc2V0PgorICAgIDwvY29weT4KKyAgICA8Y29uY2F0PjxwYXRoIHBhdGg9ImNvcHkuZmlsdGVyLm91dCIvPjwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8IS0tIGNyZWF0ZSBhbiBlbXB0eSBmaWxlIC0tPgorICAgIDx0b3VjaCBmaWxlPSJjb3B5dGVzdDMudG1wIi8+CisgICAgPCEtLXdhaXQgLS0+CisgICAgPHNsZWVwIHNlY29uZHM9IjQiLz4KKyAgICA8IS0tIGNvcHkgYSBkaWZmZXJlbnQgZmlsZSB0byB0d28gcGxhY2VzIC0tPgorICAgIDxjb3B5IGZpbGU9ImNvcHkueG1sIiB0b2ZpbGU9ImNvcHl0ZXN0M2EudG1wIiBvdmVyd3JpdGU9InRydWUiLz4KKyAgICA8Y29weSBmaWxlPSJjb3B5LnhtbCIgdG9maWxlPSJjb3B5dGVzdDNiLnRtcCIgb3ZlcndyaXRlPSJ0cnVlIi8+CisgICAgPCEtLXdhaXQgLS0+CisgICAgPHNsZWVwIHNlY29uZHM9IjQiLz4KKyAgICA8IS0tIGNvcHkgYW4gb2xkIGZpbGUgb250byBhIG5ld2VyIGZpbGUgKHNob3VsZCBub3Qgd29yaykgLS0+CisgICAgPGNvcHkgZmlsZT0iY29weXRlc3QzLnRtcCIgdG9maWxlPSJjb3B5dGVzdDNiLnRtcCIgLz4KKyAgICA8IS0tIGNvcHkgYW4gb2xkZXIgZmlsZSBvbnRvIGEgbmV3IG9uZSwgc2hvdWxkIHN1Y2NlZWQgLS0+CisgICAgPGNvcHkgZmlsZT0iY29weXRlc3QzLnRtcCIgdG9maWxlPSJjb3B5dGVzdDNjLnRtcCIKKyAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIKKyAgICAgIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIiAvPgorICAgIDwhLS0gY29weSBhIG5ld2VyIGZpbGUgb250byBhbiBvbGRlciBvbmUgKHNob3VsZCB3b3JrKSAtLT4KKyAgICA8Y29weSBmaWxlPSJjb3B5dGVzdDNhLnRtcCIgdG9maWxlPSJjb3B5dGVzdDMudG1wIgorICAgICAgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiIC8+CisgICAgPCEtLSBleHBlY3RlZCBzdGF0ZSA6CisgICAgICAzYS50bXA9PTMudG1wPT1jb3B5LnhtbAorICAgICAgdGltZW9mKDNhLnRtcCk9PXRpbWVvZigzLnRtcCk9PW5vdygpLTQKKyAgICAgIHNpemVvZigzYyk9PTAKKyAgICAgIHRpbWVvZigzYy50bXApPHRpbWVvZigzYS50bXApOworICAgICAgM2IudG1wPT1jb3B5LnhtbAorICAgIC0tPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rfc2luZ2xlX2ZpbGVfZmlsZXNldCI+CisgICAgPGNvcHkgdG9maWxlPSJjb3B5dGVzdF9zaW5nbGVfZmlsZV9maWxlc2V0LnRtcCI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJjb3B5LnhtbCIvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0X3NpbmdsZV9maWxlX3BhdGgiPgorICAgIDxjb3B5IHRvZmlsZT0iY29weXRlc3Rfc2luZ2xlX2ZpbGVfcGF0aC50bXAiPgorICAgICAgPHBhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iY29weS54bWwiLz4KKyAgICAgIDwvcGF0aD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbHRlclNldCI+CisgICAgPGNvcHkgZmlsZT0iY29weS5maWx0ZXJzZXQiIHRvZmlsZT0iY29weS5maWx0ZXJzZXQudG1wIj4KKyAgICAgIDxmaWx0ZXJzZXQ+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49IlRJVExFIiB2YWx1ZT0iQXBhY2hlIEFudCBQcm9qZWN0Ii8+CisgICAgICA8L2ZpbHRlcnNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbHRlckNoYWluIj4KKyAgICA8Y29weSBmaWxlPSJjb3B5LmZpbHRlcnNldCIgdG9maWxlPSJjb3B5LmZpbHRlcmNoYWluLnRtcCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxyZXBsYWNldG9rZW5zPgorICAgICAgICAgIDx0b2tlbiBrZXk9IlRJVExFIiB2YWx1ZT0iQXBhY2hlIEFudCBQcm9qZWN0Ii8+CisgICAgICAgIDwvcmVwbGFjZXRva2Vucz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RUcmFuc2NvZGluZyI+CisgICAgPGNvcHkgZmlsZT0iY29weS9pbnB1dC9pc284ODU5LTEiIHRvZmlsZT0iY29weXRlc3QxLnRtcCIKKyAgICAgICAgICBlbmNvZGluZz0iSVNPODg1OV8xIiBvdXRwdXRlbmNvZGluZz0iVVRGOCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RNaXNzaW5nRmlsZUlnbm9yZSI+CisgICAgPGNvcHkgZmlsZT0ibm90LXRoZXJlIiB0b2ZpbGU9ImNvcHl0ZXN0MS50bXAiCisgICAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE1pc3NpbmdGaWxlQmFpbCI+CisgICAgPGNvcHkgZmlsZT0ibm90LXRoZXJlIiB0b2ZpbGU9ImNvcHl0ZXN0MS50bXAiCisgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TWlzc2luZ0Rpcklnbm9yZSI+CisgICAgPGNvcHkgdG9kaXI9ImNvcHl0ZXN0MWRpciIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ibm90LXRoZXJlIi8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RNaXNzaW5nRGlyQmFpbCI+CisgICAgPGNvcHkgdG9kaXI9ImNvcHl0ZXN0MWRpciIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSJub3QtdGhlcmUiLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ0by5kaXIiIHZhbHVlPSJjb3B5LXRvZGlyLXRtcCIvPgorICA8cHJvcGVydHkgbmFtZT0iZnJvbS5kaXIiIHZhbHVlPSJjb3B5LWZyb21kaXItdG1wIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVzb3VyY2UucHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHtmcm9tLmRpcn0iLz4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSIke2Zyb20uZGlyfS9maWxlMS50eHQiPlRoaXMgaXMgZmlsZSAxPC9jb25jYXQ+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0iJHtmcm9tLmRpcn0vZmlsZTIudHh0Ij5UaGlzIGlzIGZpbGUgMjwvY29uY2F0PgorICAgIDxjb25jYXQgZGVzdGZpbGU9IiR7ZnJvbS5kaXJ9L2ZpbGUzLnR4dCI+VGhpcyBpcyBmaWxlIDM8L2NvbmNhdD4KKyAgICA8Y29uY2F0IGRlc3RmaWxlPSIke2Zyb20uZGlyfS9maWxlTlIudHh0Ij5UaGlzIGlzIGZpbGUgQE5SQDwvY29uY2F0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlUmVzb3VyY2VQbGFpbiIgZGVwZW5kcz0idGVzdFJlc291cmNlLnByZXBhcmUiPgorICAgIDxjb3B5IHRvZGlyPSIke3RvLmRpcn0iIGZsYXR0ZW49InRydWUiPgorICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgPGZpbGUgZmlsZT0iJHtmcm9tLmRpcn0vZmlsZTEudHh0Ii8+CisgICAgICAgIDxmaWxlIGZpbGU9IiR7ZnJvbS5kaXJ9L2ZpbGUyLnR4dCIvPgorICAgICAgICA8ZmlsZSBmaWxlPSIke2Zyb20uZGlyfS9maWxlMy50eHQiLz4KKyAgICAgIDwvcmVzb3VyY2VzPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZVJlc291cmNlV2l0aE1hcHBlciIgZGVwZW5kcz0idGVzdFJlc291cmNlLnByZXBhcmUiPgorICAgIDxjb3B5IHRvZGlyPSIke3RvLmRpcn0iIGZsYXR0ZW49InRydWUiPgorICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgPGZpbGUgZmlsZT0iJHtmcm9tLmRpcn0vZmlsZTEudHh0Ii8+CisgICAgICAgIDxmaWxlIGZpbGU9IiR7ZnJvbS5kaXJ9L2ZpbGUyLnR4dCIvPgorICAgICAgICA8ZmlsZSBmaWxlPSIke2Zyb20uZGlyfS9maWxlMy50eHQiLz4KKyAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgPHJlZ2V4cG1hcHBlciBmcm9tPSJeKC4qKVwudHh0JCQiIHRvPSJcMS50eHQuYmFrIi8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlUmVzb3VyY2VXaXRoRmlsdGVyIiBkZXBlbmRzPSJ0ZXN0UmVzb3VyY2UucHJlcGFyZSI+CisgICAgPGNvcHkgdG9kaXI9IiR7dG8uZGlyfSIgZmxhdHRlbj0idHJ1ZSI+CisgICAgICA8cmVzb3VyY2VzPgorICAgICAgICA8ZmlsZSBmaWxlPSIke2Zyb20uZGlyfS9maWxlTlIudHh0Ii8+CisgICAgICA8L3Jlc291cmNlcz4KKyAgICAgIDxmaWx0ZXJzZXQ+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49Ik5SIiB2YWx1ZT0iNDIiLz4KKyAgICAgIDwvZmlsdGVyc2V0PgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVzb3VyY2VQbGFpbiI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlc291cmNlUGxhaW5XaXRoTWFwcGVyIj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVzb3VyY2VQbGFpbldpdGhGaWx0ZXIiPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RPbmxpbmVSZXNvdXJjZXMiPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RQYXRoQXNSZXNvdXJjZSIgZGVwZW5kcz0idGVzdFJlc291cmNlLnByZXBhcmUiPgorICAgIDxjb3B5IHRvZGlyPSIke3RvLmRpcn0iPgorICAgICAgPHBhdGg+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtmcm9tLmRpcn0iLz4KKyAgICAgIDwvcGF0aD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFppcGZpbGVzZXQiIGRlcGVuZHM9InRlc3RSZXNvdXJjZS5wcmVwYXJlIj4KKyAgICA8emlwIGRlc3RmaWxlPSIke2Zyb20uZGlyfS90ZXN0LnppcCIgcm91bmR1cD0iZmFsc2UiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Zyb20uZGlyfSIgZXhjbHVkZXM9IiouemlwIi8+CisgICAgPC96aXA+CisgICAgPGNvcHkgdG9kaXI9IiR7dG8uZGlyfSI+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7ZnJvbS5kaXJ9L3Rlc3QuemlwIi8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InByZXBhcmVEaXJzZXQiPgorICAgIDx0b3VjaCBta2RpcnM9InRydWUiPgorICAgICAgPGZpbGVsaXN0IGRpcj0iJHtmcm9tLmRpcn0vZGlyc2V0Ij4KKyAgICAgICAgPGZpbGUgbmFtZT0iYS94L2ZvbyIgLz4KKyAgICAgICAgPGZpbGUgbmFtZT0iYS95L2ZvbyIgLz4KKyAgICAgICAgPGZpbGUgbmFtZT0iYS96L2ZvbyIgLz4KKyAgICAgICAgPGZpbGUgbmFtZT0iYi94L2ZvbyIgLz4KKyAgICAgICAgPGZpbGUgbmFtZT0iYi95L2ZvbyIgLz4KKyAgICAgICAgPGZpbGUgbmFtZT0iYi96L2ZvbyIgLz4KKyAgICAgIDwvZmlsZWxpc3Q+CisgICAgPC90b3VjaD4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxvcj4KKyAgICAgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJuZSIgY291bnQ9IjkiPgorICAgICAgICAgICAgPGRpcnNldCBpZD0iZGlyc2V0IiBkaXI9IiR7ZnJvbS5kaXJ9L2RpcnNldCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgICAgPHJlc291cmNlY291bnQgd2hlbj0ibmUiIGNvdW50PSI2Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtmcm9tLmRpcn0vZGlyc2V0IiAvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9vcj4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0by5kaXJ9L2RpcnNldCIgLz4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0by5kaXJ9L2RpcnNldCIgLz4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RGlyc2V0IiBkZXBlbmRzPSJwcmVwYXJlRGlyc2V0Ij4KKyAgICA8Y29weSB0b2Rpcj0iJHt0by5kaXJ9L2RpcnNldCI+CisgICAgICA8cmVzb3VyY2VzIHJlZmlkPSJkaXJzZXQiIC8+CisgICAgPC9jb3B5PgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG9yPgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49Im5lIiBjb3VudD0iOSI+CisgICAgICAgICAgICA8ZGlyc2V0IGRpcj0iJHt0by5kaXJ9L2RpcnNldCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgICAgPHJlc291cmNlY291bnQgd2hlbj0ibmUiIGNvdW50PSIwIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0by5kaXJ9L2RpcnNldCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgIDwvb3I+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBmaWxlPSJjb3B5dGVzdDEudG1wIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJjb3B5dGVzdDMudG1wIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJjb3B5dGVzdDNhLnRtcCIvPgorICAgIDxkZWxldGUgZmlsZT0iY29weXRlc3QzYi50bXAiLz4KKyAgICA8ZGVsZXRlIGZpbGU9ImNvcHl0ZXN0M2MudG1wIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJjb3B5dGVzdF9zaW5nbGVfZmlsZV9maWxlc2V0LnRtcCIvPgorICAgIDxkZWxldGUgZmlsZT0iY29weXRlc3Rfc2luZ2xlX2ZpbGVfcGF0aC50bXAiLz4KKyAgICA8ZGVsZXRlIGZpbGU9ImNvcHkuZmlsdGVyc2V0LnRtcCIvPgorICAgIDxkZWxldGUgZmlsZT0iY29weS5maWx0ZXJjaGFpbi50bXAiLz4KKyAgICA8ZGVsZXRlIGRpcj0iY29weXRlc3QxZGlyIi8+CisgICAgPGRlbGV0ZSBxdWlldD0ieWVzIiBmaWxlPSJjb3B5LmZpbHRlci5vdXQiLz4KKyAgICA8ZGVsZXRlIHF1aWV0PSJ5ZXMiIGZpbGU9ImNvcHkuZmlsdGVyLmlucCIvPgorICAgIDxkZWxldGUgZGlyPSIke2Zyb20uZGlyfSIvPgorICAgIDxkZWxldGUgZGlyPSIke3RvLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHkvZXhwZWN0ZWQvdXRmLTggYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5L2V4cGVjdGVkL3V0Zi04Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTQ5YmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5L2V4cGVjdGVkL3V0Zi04CkBAIC0wLDAgKzEgQEAKK8Okw7bDvMOEw5bDnMOfCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5L2lucHV0L2lzbzg4NTktMSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHkvaW5wdXQvaXNvODg1OS0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDQ0MDEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5L2lucHV0L2lzbzg4NTktMQpAQCAtMCwwICsxIEBACivk9vzE1tzfCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZGlyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlkaXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjM4YzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZGlyLnhtbApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0iY29weWRpci10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGNvcHlkaXIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KKyAgICA8Y29weWRpciBzcmM9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8Y29weWRpciBkZXN0PSIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+CisgICAgPGNvcHlkaXIgc3JjPSIuIiAKKyAgICAgICAgICAgICBkZXN0PSIuIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDxta2RpciBkaXI9Ii4uL3Rhc2tkZWZzLnRtcCIgLz4KKyAgICA8Y29weWRpciBzcmM9Ii4iIAorICAgICAgICAgICAgIGRlc3Q9Ii4uL3Rhc2tkZWZzLnRtcCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KKyAgICA8Y29weWRpciBzcmM9Ii4iIAorICAgICAgICAgICAgIGRlc3Q9InRlbXBsYXRlLnhtbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZGlyPSIuLi90YXNrZGVmcy50bXAiIC8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZmlsZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZmlsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4NDI5NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlmaWxlLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0iY29weWZpbGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxjb3B5ZmlsZS8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxjb3B5ZmlsZSBzcmM9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8Y29weWZpbGUgZGVzdD0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgIDxjb3B5ZmlsZSBzcmM9InRlbXBsYXRlLnhtbCIgCisgICAgICAgICAgICAgZGVzdD0idGVtcGxhdGUueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDxjb3B5ZmlsZSBzcmM9ImNvcHlmaWxlLnhtbCIgCisgICAgICAgICAgICAgZGVzdD0iY29weWZpbGUudG1wIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDYiPgorICAgIDxkZWxldGUgZmlsZT0idGVzdGRpciIvPgorICAgIDxta2RpciBkaXI9InRlc3RkaXIiIC8+CisgICAgPGNvcHlmaWxlIHNyYz0iY29weWZpbGUueG1sIiAKKyAgICAgICAgICAgICAgZGVzdD0idGVzdGRpciIKKyAgICAgICAgICAgICAgZm9yY2VvdmVyd3JpdGU9InRydWUiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBkaXI9InRlc3RkaXIiIC8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY3ZzcGFzcy54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jdnNwYXNzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmNhMTEwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY3ZzcGFzcy54bWwKQEAgLTAsMCArMSw4NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImN2c3Bhc3MtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDx0YXNrZGVmIG5hbWU9ImN2c3Bhc3MiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ1ZTUGFzcyIvPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxjdnNwYXNzIC8+CisgIDwvdGFyZ2V0PgorIAorICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KKyAgICA8Y3ZzcGFzcworICAgICAgY3Zzcm9vdD0iOnBzZXJ2ZXI6YW5vbmN2c0BqYWthcnRhLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIgorICAgICAgcGFzc2ZpbGU9InRlc3RwYXNzZmlsZS50bXAiCisgICAgLz4KKyAgPC90YXJnZXQ+CisgCisgIDwhLS0gdGVzdFBhc3NGaWxlIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8Y3ZzcGFzcworICAgICAgY3Zzcm9vdD0iOnBzZXJ2ZXI6YW5vbmN2c0BqYWthcnRhLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIgorICAgICAgcGFzc3dvcmQ9ImFub25jdnMiCisgICAgICBwYXNzZmlsZT0idGVzdHBhc3NmaWxlLnRtcCIKKyAgICAvPgorICA8L3RhcmdldD4KKworICA8IS0tIHRlc3RQYXNzRmlsZUR1cGxpY2F0ZUVudHJ5IC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KKyAgICA8Y3ZzcGFzcworICAgICAgY3Zzcm9vdD0iOnBzZXJ2ZXI6YW5vbmN2c0BqYWthcnRhLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIgorICAgICAgcGFzc3dvcmQ9ImFub25jdnMiCisgICAgICBwYXNzZmlsZT0idGVzdHBhc3NmaWxlLnRtcCIKKyAgICAvPgorICAgIDxjdnNwYXNzCisgICAgICBjdnNyb290PSI6cHNlcnZlcjphbm9uY3ZzQGpha2FydGEuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMiCisgICAgICBwYXNzd29yZD0iYW5vbmN2cyIKKyAgICAgIHBhc3NmaWxlPSJ0ZXN0cGFzc2ZpbGUudG1wIgorICAgIC8+CisgICAgPGN2c3Bhc3MKKyAgICAgIGN2c3Jvb3Q9Ijpwc2VydmVyOmd1ZXN0QGN2cy50aWdyaXMub3JnOi9jdnMiCisgICAgICBwYXNzd29yZD0iZ3Vlc3QiCisgICAgICBwYXNzZmlsZT0idGVzdHBhc3NmaWxlLnRtcCIKKyAgICAvPgorICA8L3RhcmdldD4KKworICA8IS0tIHRlc3RQYXNzRmlsZU11bHRpcGxlRW50cnkgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDxjdnNwYXNzCisgICAgICBjdnNyb290PSI6cHNlcnZlcjphbm9uY3ZzQGpha2FydGEuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMiCisgICAgICBwYXNzd29yZD0iYW5vbmN2cyIKKyAgICAgIHBhc3NmaWxlPSJ0ZXN0cGFzc2ZpbGUudG1wIgorICAgIC8+CisgICAgPGN2c3Bhc3MKKyAgICAgIGN2c3Jvb3Q9Ijpwc2VydmVyOmFub25jdnNAeG1sLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIgorICAgICAgcGFzc3dvcmQ9ImFub25jdnMiCisgICAgICBwYXNzZmlsZT0idGVzdHBhc3NmaWxlLnRtcCIKKyAgICAvPgorICAgIDxjdnNwYXNzCisgICAgICBjdnNyb290PSI6cHNlcnZlcjpndWVzdEBjdnMudGlncmlzLm9yZzovY3ZzIgorICAgICAgcGFzc3dvcmQ9Imd1ZXN0IgorICAgICAgcGFzc2ZpbGU9InRlc3RwYXNzZmlsZS50bXAiCisgICAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4gCisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0cGFzc2ZpbGUudG1wIi8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kZWZhdWx0ZXhjbHVkZXMueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVmYXVsdGV4Y2x1ZGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI5MjUwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVmYXVsdGV4Y2x1ZGVzLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0iZWNoby10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVmYXVsdGV4Y2x1ZGVzIGRlZmF1bHQ9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGRlZmF1bHRleGNsdWRlcyBlY2hvPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxkZWZhdWx0ZXhjbHVkZXMgZGVmYXVsdD0idHJ1ZSIgYWRkPSJmb28iIGVjaG89InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPGRlZmF1bHRleGNsdWRlcyBkZWZhdWx0PSJ0cnVlIiByZW1vdmU9IioqL0NWUyIgZWNobz0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsZXRlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbGV0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ZmViNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbGV0ZS54bWwKQEAgLTAsMCArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJkZWxldGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJkaXJuYW1lIiB2YWx1ZT0idGFza2RlZnMudG1wIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZGlyIiBsb2NhdGlvbj0iJHtkaXJuYW1lfSIgLz4KKworICA8bWFjcm9kZWYgbmFtZT0iZXhwZWN0YWJzZW50Ij4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgZGVmYXVsdD0iJHtkaXJ9Ii8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZmFpbD4KKyAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IkB7dGFyZ2V0fSIgLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8bWFjcm9kZWYgbmFtZT0iZXhwZWN0ZGlyc29ubHkiPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGZhaWw+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPG9yPgorICAgICAgICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZ3JlYXRlciIgY291bnQ9IjAiPgorICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlyfSIgLz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIke3NyY2RpcnN9Ij4KKyAgICAgICAgICAgICAgICA8ZGlyc2V0IGRpcj0iJHtkaXJ9IiAvPgorICAgICAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgICAgICA8L25vdD4KKyAgICAgICAgICA8L29yPgorICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIDwvZmFpbD4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8cmVzb3VyY2Vjb3VudCBwcm9wZXJ0eT0ic3JjZGlycyI+CisgICAgICA8ZGlyc2V0IGRpcj0iJHtiYXNlZGlyfSIgLz4KKyAgICA8L3Jlc291cmNlY291bnQ+CisKKyAgICA8cmVzb3VyY2Vjb3VudCBwcm9wZXJ0eT0ic3Jjc2l6ZSI+CisgICAgICA8ZmlsZXMgaW5jbHVkZXM9IiR7YmFzZWRpcn0vIiAvPgorICAgIDwvcmVzb3VyY2Vjb3VudD4KKworICAgIDxta2RpciBkaXI9IiR7ZGlyfSIgLz4KKworICAgIDxjb3B5IHRvZGlyPSIke2Rpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBleGNsdWRlcz0iJHtkaXJuYW1lfSwke2Rpcm5hbWV9LyoqIiAvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGRlbGV0ZSAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7ZGlyfSIgLz4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IiR7c3Jjc2l6ZX0iPgorICAgICAgICAgICAgPGZpbGVzIGluY2x1ZGVzPSIke2Rpcn0vIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiIGRlcGVuZHM9ImluaXQiPgorICAgIDxkZWxldGUgZGlyPSIke2Rpcn0iIC8+CisgICAgPGV4cGVjdGFic2VudCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q1IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZGVsZXRlIGRpcj0iJHtkaXJ9IiBpbmNsdWRlcz0iKioiIC8+CisgICAgPGV4cGVjdGRpcnNvbmx5IC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDYiIGRlcGVuZHM9ImluaXQiPgorICAgIDxkZWxldGUgZGlyPSIke2Rpcn0iIGluY2x1ZGVzPSIqKiIgaW5jbHVkZWVtcHR5ZGlycz0idHJ1ZSIgLz4KKyAgICA8ZXhwZWN0YWJzZW50IC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDciIGRlcGVuZHM9ImluaXQiPgorICAgIDxkZWxldGU+CisgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHtkaXJ9IiAvPgorICAgIDwvZGVsZXRlPgorICAgIDxleHBlY3RkaXJzb25seSAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q4IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZGVsZXRlIGluY2x1ZGVlbXB0eWRpcnM9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpcn0iIC8+CisgICAgPC9kZWxldGU+CisgICAgPGV4cGVjdGFic2VudCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q5IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZGVsZXRlPgorICAgICAgPGZpbGVzIGluY2x1ZGVzPSIke2Rpcn0vKioiIC8+CisgICAgPC9kZWxldGU+CisgICAgPGV4cGVjdGFic2VudCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxMCI+CisgICAgPGRlbGV0ZT4KKyAgICAgIDxmaWxlbGlzdCBkaXI9IiR7ZGlyfSIgZmlsZXM9InRlc3QxMGFic2VudGZpbGUiIC8+CisgICAgPC9kZWxldGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDExIj4KKyAgICA8ZGVsZXRlIGZhaWxvbmVycm9yPSJmYWxzZSI+CisgICAgICA8ZmlsZXNldCBkaXI9InRoaXNkZW5vdGVzYWRpcmVjdG9yeXRoYXR3aWxsbmV2ZXJleGlzdGJsYWgiIC8+CisgICAgPC9kZWxldGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEyIj4KKyAgICA8ZGVsZXRlIGZhaWxvbmVycm9yPSJmYWxzZSIgaW5jbHVkZWVtcHR5ZGlycz0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9InRoaXNkZW5vdGVzYWRpcmVjdG9yeXRoYXR3aWxsbmV2ZXJleGlzdGJsYWgiIC8+CisgICAgPC9kZWxldGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEzIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZGVsZXRlIGluY2x1ZGVlbXB0eWRpcnM9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpcn0iIC8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlyfSIgLz4KKyAgICA8L2RlbGV0ZT4KKyAgICA8ZXhwZWN0YWJzZW50IC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDE0IiBkZXBlbmRzPSJpbml0Ij4KKwk8ZGVsZXRlIHF1aWV0PSJmYWxzZSI+CisJCTxmaWxlc2V0IGRpcj0iJHtkaXJ9IiAvPgorCQk8ZmlsZXNldCBkaXI9IiR7ZGlyfSIgLz4KKwk8L2RlbGV0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MTUiIGRlcGVuZHM9ImluaXQiPgorCTxkZWxldGUgcXVpZXQ9InRydWUiPgorCQk8ZmlsZXNldCBkaXI9IiR7ZGlyfSIgLz4KKwkJPGZpbGVzZXQgZGlyPSIke2Rpcn0iIC8+CisJPC9kZWxldGU+CisgIDwvdGFyZ2V0PgorICA8IS0tIEJ1Z3ppbGxhIDQwMzEzIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QxNi5pbml0Ij4KKyAgICA8bWtkaXIgZGlyPSIke2Rpcn0vQ1ZTIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7ZGlyfS9DVlMvbGFsYSIvPgorICAgIDxta2RpciBkaXI9IiR7ZGlyfS9zdWJkaXIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MTYiIGRlcGVuZHM9InRlc3QxNi5pbml0Ij4KKyAgICA8ZGVsZXRlIGRlZmF1bHRleGNsdWRlcz0iZmFsc2UiIGRpcj0iJHtkaXJ9IiBpbmNsdWRlZW1wdHlkaXJzPSJ0cnVlIi8+CisgICAgPGV4cGVjdGFic2VudC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDE3IiBkZXBlbmRzPSJ0ZXN0MTYuaW5pdCI+CisgICAgPGRlbGV0ZSBkaXI9IiR7ZGlyfSIgZGVmYXVsdGV4Y2x1ZGVzPSJ0cnVlIiBpbmNsdWRlZW1wdHlkaXJzPSJ0cnVlIi8+CisgICAgPGZhaWwgbWVzc2FnZT0iZmlsZSBpbiBDVlMgZGlyIGRlbGV0ZWQiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7ZGlyfS9DVlMvbGFsYSIvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgICA8ZXhwZWN0YWJzZW50IHRhcmdldD0iJHtkaXJ9L3N1YmRpciIvPgorICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCIgZGVwZW5kcz0idGVzdDQiIC8+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbHRyZWUueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsdHJlZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5ZDUxZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbHRyZWUueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJkZWx0cmVlLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KKyAgICA8ZGVsdHJlZS8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxkZWx0cmVlIGRpcj0idGFza2RlZnMudG1wIi8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kaXJuYW1lLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Rpcm5hbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjdkYjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kaXJuYW1lLnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ieHh4LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KKyAgICA8ZGlybmFtZS8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxkaXJuYW1lIHByb3BlcnR5PSJwcm9wbmFtZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8ZGlybmFtZSBmaWxlPSJmaWxlbmFtZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KKyAgICA8ZGlybmFtZSBwcm9wZXJ0eT0ibG9jYWwuZGlyIiBmaWxlPSIvdXNyL2xvY2FsL2Zvby50eHQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NSI+CisgICAgPGRpcm5hbWUgcHJvcGVydHk9ImJhc2UuZGlyIiBmaWxlPSJmb28udHh0Ii8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9keW5hbWljdGFzay54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9keW5hbWljdGFzay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3MTgxZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2R5bmFtaWN0YXNrLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0iZHluYW1pYy10ZXN0IiBkZWZhdWx0PSJzaW1wbGUiPgorCisgIDxwYXRoIGlkPSJ0ZXN0Y2xhc3NlcyI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0ic2ltcGxlIj4KKyAgICA8dGFza2RlZiBuYW1lPSJkeW5hIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRHluYW1pY1Rhc2siPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdGNsYXNzZXMiIC8+CisgICAgPC90YXNrZGVmPgorICAgIDxkeW5hIHByb3AxPSIxIiBwcm9wMj0iMiI+CisgICAgICA8c3ViIHByb3AzPSIzIi8+CisgICAgICA8YW55dGhpbmcgcHJvcDQ9IjQiLz4KKyAgICA8L2R5bmE+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9lY2hvLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VjaG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMmFiZDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9lY2hvLnhtbApAQCAtMCwwICsxLDEwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImVjaG8tdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgbG9jYXRpb249ImVjaG8uZGVzdCIvPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgPG1rZGlyIGRpcj0iJHtkZXN0LmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke2Rlc3QuZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KKyAgICA8ZWNoby8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxlY2hvIG1lc3NhZ2U9Ik9VVFBVVCBPRiBFQ0hPIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiPgorICAgIDxlY2hvPgorICAgIFRoaXMgCisgICAgaXMKKyAgICBhIAorICAgIG11bHRpbGluZQorICAgIG1lc3NhZ2UKKyAgICA8L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJhc3NlcnRDb250YWlucyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHBlY3RlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImFjdHVhbCIgLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxmYWlsPgorICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICA8Y29udGFpbnMgc3RyaW5nPSJAe2FjdHVhbH0iIHN1YnN0cmluZz0iQHtleHBlY3RlZH0iPjwvY29udGFpbnM+CisgICAgICAgICAgPC9ub3Q+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICBEaWQgbm90IGZpbmQgQHtleHBlY3RlZH0gaW4gQHthY3R1YWx9CisgICAgICA8L2ZhaWw+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxlY2hvIGZpbGU9IiR7ZGVzdC5kaXJ9L2VjaG8udHh0Ij5TaW1wbGUgdGV4dDwvZWNobz4KKyAgICA8bG9hZGZpbGUgc3JjZmlsZT0iJHtkZXN0LmRpcn0vZWNoby50eHQiIHByb3BlcnR5PSJlY2hvIiAvPgorICAgIDxhc3NlcnRDb250YWlucyBhY3R1YWw9IiR7ZWNob30iIGV4cGVjdGVkPSJTaW1wbGUgdGV4dCIgLz4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9InRlc3RBcHBlbmQiIGRlcGVuZHM9ImluaXQiPgorICAgIDxlY2hvIGZpbGU9IiR7ZGVzdC5kaXJ9L2VjaG8udHh0Ij5TaW1wbGUgdGV4dDwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSIke2Rlc3QuZGlyfS9lY2hvLnR4dCIgYXBwZW5kPSJ0cnVlIj5BcHBlbmRlZDwvZWNobz4KKyAgICA8bG9hZGZpbGUgc3JjZmlsZT0iJHtkZXN0LmRpcn0vZWNoby50eHQiIHByb3BlcnR5PSJlY2hvIi8+CisgICAgPGFzc2VydENvbnRhaW5zIGFjdHVhbD0iJHtlY2hvfSIgZXhwZWN0ZWQ9IlNpbXBsZSB0ZXh0Ii8+CisgICAgPGFzc2VydENvbnRhaW5zIGFjdHVhbD0iJHtlY2hvfSIgZXhwZWN0ZWQ9IkFwcGVuZGVkIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEVtcHR5RW5jb2RpbmciIGRlcGVuZHM9ImluaXQiPgorICAgIDxlY2hvIGZpbGU9IiR7ZGVzdC5kaXJ9L2VjaG8udHh0IiBlbmNvZGluZz0iIj5TaW1wbGUgdGV4dDwvZWNobz4KKyAgICA8bG9hZGZpbGUgc3JjZmlsZT0iJHtkZXN0LmRpcn0vZWNoby50eHQiIHByb3BlcnR5PSJlY2hvIi8+CisgICAgPGFzc2VydENvbnRhaW5zIGFjdHVhbD0iJHtlY2hvfSIgZXhwZWN0ZWQ9IlNpbXBsZSB0ZXh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFVURjE2RW5jb2RpbmciIGRlcGVuZHM9ImluaXQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGFyIiB2YWx1ZT0iJiMxNjk7IiAvPgorICAgIDxlY2hvIGZpbGU9IiR7ZGVzdC5kaXJ9L2VjaG8xNi50eHQiIGVuY29kaW5nPSJVVEYtMTYiPiR7Y2hhcn08L2VjaG8+CisgICAgPGxvYWRmaWxlIHNyY2ZpbGU9IiR7ZGVzdC5kaXJ9L2VjaG8xNi50eHQiIHByb3BlcnR5PSJlY2hvMTYiIGVuY29kaW5nPSJVVEYxNiIvPgorICAgIDxhc3NlcnRDb250YWlucyBhY3R1YWw9IiR7ZWNobzE2fSIgZXhwZWN0ZWQ9IiR7Y2hhcn0iLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RVVEY4RW5jb2RpbmciIGRlcGVuZHM9ImluaXQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGFyIiB2YWx1ZT0iJiMxNjk7IiAvPgorICAgIDxlY2hvIGZpbGU9IiR7ZGVzdC5kaXJ9L2VjaG84LnR4dCIgZW5jb2Rpbmc9IlVURjgiPiR7Y2hhcn08L2VjaG8+CisgICAgPGxvYWRmaWxlIHNyY2ZpbGU9IiR7ZGVzdC5kaXJ9L2VjaG84LnR4dCIgcHJvcGVydHk9ImVjaG8iIGVuY29kaW5nPSJVVEY4Ii8+CisgICAgPGFzc2VydENvbnRhaW5zIGFjdHVhbD0iJHtlY2hvfSIgZXhwZWN0ZWQ9IiR7Y2hhcn0iLz4KKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VjaG94bWwueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZWNob3htbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1M2FiYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VjaG94bWwueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3Q+CisgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlIiBsb2NhdGlvbj0iZWNob2VkLnhtbCIgLz4KKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8ZWNob3htbCBmaWxlPSIke2ZpbGV9Ij4KKyAgICAgIDxwcm9qZWN0PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iYmFyIiAvPgorICAgICAgICA8ZmFpbCBtZXNzYWdlPSIkJCQke2Zvb309JCR7Zm9vfSI+CisgICAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7bXVzdGZhaWx9IiAvPgorICAgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8L2ZhaWw+CisgICAgICA8L3Byb2plY3Q+CisgICAgPC9lY2hveG1sPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBmaWxlPSIke2ZpbGV9IiAvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UGFzcyIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGFudCBhbnRmaWxlPSIke2ZpbGV9IiAvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmFpbCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGFudCBhbnRmaWxlPSIke2ZpbGV9Ij4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtdXN0ZmFpbCIgdmFsdWU9InRydWUiIC8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorICA8dGFyZ2V0IG5hbWU9InRlc3RFbXB0eSI+CisgICAgPGVjaG94bWwgLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9lbWFpbC9tYWlsLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VtYWlsL21haWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmZkNDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9lbWFpbC9tYWlsLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ibWFpbC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPCEtLSB0aGlzIHRlc3QgaXMgc3VwcG9zZWQgdG8gYnJpbmcgYSBidWlsZCBleGNlcHRpb24gYmVjYXVzZSB1c2VyIGFuZCBwYXNzd29yZCBpcyBub3QgYWxsb3dlZCB3aXRoIHBsYWluIGVuY29kaW5nIC0tPgorICAgIDxtYWlsIGhvc3Q9ImxvY2FsaG9zdCIgcG9ydD0iMjUiIGZyb209ImpvZUBhYmMuY29tIiB0bz0ibGF1cmFAeHl6LmNvbSIgc3ViamVjdD0iaGVsbG8iIGVuY29kaW5nPSJwbGFpbiIgdXNlcj0iam9lIiBwYXNzd29yZD0ic2VjcmV0Ij4KKyAgICAgICAgPG1lc3NhZ2U+CisgICAgICAgICAgICBIaSBMYXVyYSwgaG93IGFyZSB5b3UgZG9pbmcgPworICAgICAgICA8L21lc3NhZ2U+CisgICAgPC9tYWlsPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgICA8IS0tIHRoaXMgdGVzdCBpcyBzdXBwb3NlZCB0byBicmluZyBhIGJ1aWxkIGV4Y2VwdGlvbiBiZWNhdXNlIFNTTCBpcyBub3QgYWxsb3dlZCB3aXRoIHBsYWluIGVuY29kaW5nIC0tPgorICAgICAgPG1haWwgaG9zdD0ibG9jYWxob3N0IiBwb3J0PSI0NjUiIGZyb209ImpvZUBhYmMuY29tIiB0bz0ibGF1cmFAeHl6LmNvbSIgc3ViamVjdD0iaGVsbG8iIGVuY29kaW5nPSJwbGFpbiIgc3NsPSJ0cnVlIj4KKyAgICAgICAgICA8bWVzc2FnZT4KKyAgICAgICAgICAgICAgSGkgTGF1cmEsIGhvdyBhcmUgeW91IGRvaW5nID8KKyAgICAgICAgICA8L21lc3NhZ2U+CisgICAgICA8L21haWw+CisgICAgPC90YXJnZXQ+CisKKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2V4ZWMueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy9leGVjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTYxNTdlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy9leGVjLnhtbApAQCAtMCwwICsxLDM4NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJleGVjLXRlc3QiIGRlZmF1bHQ9InNwYXduIiBiYXNlZGlyPSIuIj4KKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgICAgICA8IS0tIHRoaXMgcHJvcGVydHkgY2FuIGJlIG92ZXJyaWRlbiBwcm9ncmFtYXRpY2FsbHkgaW4gdGhlIEphdmEgdGVzdCBjYXNlIC0tPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idGltZVRvV2FpdCIgdmFsdWU9IjEwIi8+CisgICAgICAgIDwhLS0gdGhpcyBwcm9wZXJ0eSBjYW4gYmUgb3ZlcnJpZGVuIHByb2dyYW1hdGljYWxseSBpbiB0aGUgSmF2YSB0ZXN0IGNhc2UgLS0+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsb2dGaWxlIiB2YWx1ZT0iJHtqYXZhLmlvLnRtcGRpcn0vc3Bhd24ubG9nIi8+CisgICAgICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+CisgICAgICAgIDwhLS0gVU5JWCAtLT4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJzaCIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiBwcm9wZXJ0eT0ic2guZXhlY3V0YWJsZSIvPgorICAgICAgICA8IS0tIENZR1dJTiAtLT4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJzaC5leGUiIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIgcHJvcGVydHk9InNoLmV4ZS5leGVjdXRhYmxlIi8+CisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3QuY2FuLnJ1biI+CisgICAgICAgICAgICA8b3I+CisgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJzaC5leGVjdXRhYmxlIi8+CisgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJzaC5leGUuZXhlY3V0YWJsZSIvPgorICAgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICAgIDwhLS0gVU5JWCAtLT4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJ3YyIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiBwcm9wZXJ0eT0id2MuZXhlY3V0YWJsZSIvPgorICAgICAgICA8IS0tIENZR1dJTiAtLT4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJ3Yy5leGUiIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIgcHJvcGVydHk9IndjLmV4ZS5leGVjdXRhYmxlIi8+CisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9IndjLmNhbi5ydW4iPgorICAgICAgICAgICAgPG9yPgorICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0id2MuZXhlY3V0YWJsZSIvPgorICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0id2MuZXhlLmV4ZWN1dGFibGUiLz4KKyAgICAgICAgICAgIDwvb3I+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8IS0tIFVOSVggLS0+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iY2F0IiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIHByb3BlcnR5PSJjYXQuZXhlY3V0YWJsZSIvPgorICAgICAgICA8IS0tIENZR1dJTiAtLT4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJjYXQuZXhlIiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIHByb3BlcnR5PSJjYXQuZXhlLmV4ZWN1dGFibGUiLz4KKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY2F0LmNhbi5ydW4iPgorICAgICAgICAgICAgPG9yPgorICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iY2F0LmV4ZWN1dGFibGUiLz4KKyAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImNhdC5leGUuZXhlY3V0YWJsZSIvPgorICAgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNwYXduIiBkZXBlbmRzPSJpbml0IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ic2giIHNwYXduPSJ0cnVlIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InNwYXduLnNoIi8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSIke3RpbWVUb1dhaXR9IiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtsb2dGaWxlfSIgLz4KKyAgICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJuby1yZWRpcmVjdCIgZGVwZW5kcz0iaW5pdCIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InNoIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3QxIiBkZXBlbmRzPSJpbml0IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ic2giIG91dHB1dD0icmVkaXJlY3Qub3V0Ij4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3QyIiBkZXBlbmRzPSJpbml0IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ic2giIG91dHB1dD0icmVkaXJlY3Qub3V0IiBlcnJvcj0icmVkaXJlY3QuZXJyIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3QzIiBkZXBlbmRzPSJpbml0IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ic2giIGxvZ2Vycm9yPSJ0cnVlIgorICAgICAgICAgICAgICBvdXRwdXQ9InJlZGlyZWN0Lm91dCIgb3V0cHV0cHJvcGVydHk9InJlZGlyZWN0Lm91dCI+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJwYXJyb3Quc2giLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7YW50LmZpbGV9IiAvPgorICAgICAgICA8L2V4ZWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0NCIgZGVwZW5kcz0iaW5pdCIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InNoIgorICAgICAgICAgICAgICBlcnJvcj0icmVkaXJlY3QuZXJyIiBlcnJvcnByb3BlcnR5PSJyZWRpcmVjdC5lcnIiCisgICAgICAgICAgICAgIG91dHB1dD0icmVkaXJlY3Qub3V0IiBvdXRwdXRwcm9wZXJ0eT0icmVkaXJlY3Qub3V0Ij4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3Q1IiBkZXBlbmRzPSJpbml0IiBpZj0id2MuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9IndjIiBpbnB1dHN0cmluZz0ieCB5IHoiCisgICAgICAgICAgICAgIGVycm9yPSJyZWRpcmVjdC5lcnIiIGVycm9ycHJvcGVydHk9InJlZGlyZWN0LmVyciIKKyAgICAgICAgICAgICAgb3V0cHV0PSJyZWRpcmVjdC5vdXQiIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdC5vdXQiPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLXciLz4KKyAgICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWRpcmVjdDYiIGRlcGVuZHM9ImluaXQiIGlmPSJ3Yy5jYW4ucnVuIj4KKyAgICAgICAgPGVjaG8gZmlsZT0icmVkaXJlY3QuaW4iPnggeSB6PC9lY2hvPgorICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJ3YyIgaW5wdXQ9InJlZGlyZWN0LmluIgorICAgICAgICAgICAgICBlcnJvcj0icmVkaXJlY3QuZXJyIiBlcnJvcnByb3BlcnR5PSJyZWRpcmVjdC5lcnIiCisgICAgICAgICAgICAgIG91dHB1dD0icmVkaXJlY3Qub3V0IiBvdXRwdXRwcm9wZXJ0eT0icmVkaXJlY3Qub3V0Ij4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii13Ii8+CisgICAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3Q3IiBkZXBlbmRzPSJpbml0IiBpZj0id2MuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9IndjIiBpbnB1dHN0cmluZz0ieCB5IHoiCisgICAgICAgICAgICAgIGVycm9yPSJyZWRpcmVjdC5lcnIiCisgICAgICAgICAgICAgIG91dHB1dD0icmVkaXJlY3Qub3V0IiBvdXRwdXRwcm9wZXJ0eT0icmVkaXJlY3Qub3V0Ij4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii13Ii8+CisgICAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3RvcjEiIGRlc2NyaXB0aW9uPSJmYWlsIgorICAgICAgICAgICAgZGVwZW5kcz0iaW5pdCIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InNoIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBvdXRwdXQ9InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICAgICAgPHJlZGlyZWN0b3Igb3V0cHV0PSJ3aG9jYXJlcyIgLz4KKyAgICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWRpcmVjdG9yMiIgZGVwZW5kcz0iaW5pdCIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InNoIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBvdXRwdXQ9InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICA8L2V4ZWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0b3IzIiBkZXBlbmRzPSJpbml0IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ic2giPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0icGFycm90LnNoIi8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSIke2FudC5maWxlfSIgLz4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIG91dHB1dD0icmVkaXJlY3Rvci5vdXQiIGVycm9yPSJyZWRpcmVjdG9yLmVyciIgLz4KKyAgICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWRpcmVjdG9yNCIgZGVwZW5kcz0iaW5pdCIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InNoIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBvdXRwdXQ9InJlZGlyZWN0b3Iub3V0IiBsb2dlcnJvcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdG9yLm91dCIgLz4KKyAgICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWRpcmVjdG9yNSIgZGVwZW5kcz0iaW5pdCIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InNoIj4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIGVycm9yPSJyZWRpcmVjdG9yLmVyciIgZXJyb3Jwcm9wZXJ0eT0icmVkaXJlY3Rvci5lcnIiCisgICAgICAgICAgICAgIG91dHB1dD0icmVkaXJlY3Rvci5vdXQiIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdG9yLm91dCIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3RvcjYiIGRlcGVuZHM9ImluaXQiIGlmPSJ0ZXN0LmNhbi5ydW4iPgorICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJzaCI+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBvdXRwdXRwcm9wZXJ0eT0icmVkaXJlY3Rvci5vdXQiCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnByb3BlcnR5PSJyZWRpcmVjdG9yLmVyciI+CisgICAgICAgICAgICAgICAgPG91dHB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICAgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuZXJyIiAvPgorICAgICAgICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0icGFycm90LnNoIiAvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3RvcjciIGRlcGVuZHM9ImluaXQiIGlmPSJ0ZXN0LmNhbi5ydW4iPgorICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJzaCI+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBvdXRwdXRwcm9wZXJ0eT0icmVkaXJlY3Rvci5vdXQiCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnByb3BlcnR5PSJyZWRpcmVjdG9yLmVyciI+CisgICAgICAgICAgICAgICAgPG91dHB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICAgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuZXJyIiAvPgorICAgICAgICAgICAgICAgIDxlcnJvcmZpbHRlcmNoYWluPgorICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJlcnIiIHRvPSJFUlJPUiEhISIgLz4KKyAgICAgICAgICAgICAgICA8L2Vycm9yZmlsdGVyY2hhaW4+CisgICAgICAgICAgICA8L3JlZGlyZWN0b3I+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJwYXJyb3Quc2giIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSIke2FudC5maWxlfSIgLz4KKyAgICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWRpcmVjdG9yOCIgZGVwZW5kcz0iaW5pdCIgaWY9IndjLmNhbi5ydW4iPgorICAgICAgICA8ZWNobyBmaWxlPSJyZWRpcmVjdG9yLmluIj54IHkgejwvZWNobz4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0id2MiPgorICAgICAgICAgICAgPHJlZGlyZWN0b3Igb3V0cHV0cHJvcGVydHk9InJlZGlyZWN0b3Iub3V0IgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jwcm9wZXJ0eT0icmVkaXJlY3Rvci5lcnIiPgorICAgICAgICAgICAgICAgIDxpbnB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuaW4iIC8+CisgICAgICAgICAgICAgICAgPG91dHB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICAgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuZXJyIiAvPgorICAgICAgICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLXciLz4KKyAgICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWRpcmVjdG9yOSIgZGVwZW5kcz0iaW5pdCIgaWY9ImNhdC5jYW4ucnVuIj4KKyAgICAgICAgPGVjaG8gZmlsZT0icmVkaXJlY3Rvci5pbiI+YmxhaCBiZWZvcmUgYmxhaDwvZWNobz4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iY2F0Ij4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdG9yLm91dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycHJvcGVydHk9InJlZGlyZWN0b3IuZXJyIj4KKyAgICAgICAgICAgICAgICA8aW5wdXRmaWx0ZXJjaGFpbj4KKyAgICAgICAgICAgICAgICAgICAgPHJlcGxhY2VzdHJpbmcgZnJvbT0iYmVmb3JlIiB0bz0iYWZ0ZXIiIC8+CisgICAgICAgICAgICAgICAgPC9pbnB1dGZpbHRlcmNoYWluPgorICAgICAgICAgICAgICAgIDxpbnB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuaW4iIC8+CisgICAgICAgICAgICAgICAgPG91dHB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICAgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuZXJyIiAvPgorICAgICAgICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgICA8L2V4ZWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0b3IxMCIgZGVwZW5kcz0iaW5pdCIgaWY9ImNhdC5jYW4ucnVuIj4KKyAgICAgICAgPGVjaG8gZmlsZT0icmVkaXJlY3Rvci5pbiI+YmxhaCBiZWZvcmUgYmxhaDwvZWNobz4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iY2F0Ij4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdG9yLm91dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycHJvcGVydHk9InJlZGlyZWN0b3IuZXJyIj4KKyAgICAgICAgICAgICAgICA8b3V0cHV0ZmlsdGVyY2hhaW4+CisgICAgICAgICAgICAgICAgICAgIDxyZXBsYWNlc3RyaW5nIGZyb209ImJlZm9yZSIgdG89ImFmdGVyIiAvPgorICAgICAgICAgICAgICAgIDwvb3V0cHV0ZmlsdGVyY2hhaW4+CisgICAgICAgICAgICAgICAgPG91dHB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICAgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuZXJyIiAvPgorICAgICAgICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0icmVkaXJlY3Rvci5pbiIvPgorICAgICAgICA8L2V4ZWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0b3IxMSIgZGVwZW5kcz0iaW5pdCIgaWY9ImNhdC5jYW4ucnVuIj4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iY2F0Ij4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdG9yLm91dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycHJvcGVydHk9InJlZGlyZWN0b3IuZXJyIgorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzdHJpbmc9ImJsYWggYmVmb3JlIGJsYWgiPgorICAgICAgICAgICAgICAgIDxpbnB1dGZpbHRlcmNoYWluPgorICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJiZWZvcmUiIHRvPSJhZnRlciIgLz4KKyAgICAgICAgICAgICAgICA8L2lucHV0ZmlsdGVyY2hhaW4+CisgICAgICAgICAgICAgICAgPG91dHB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICAgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuZXJyIiAvPgorICAgICAgICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgICA8L2V4ZWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0b3IxMiIgZGVwZW5kcz0iaW5pdCIgaWY9ImNhdC5jYW4ucnVuIj4KKyAgICAgICAgPGVjaG8gZmlsZT0icmVkaXJlY3Rvci5pbiI+YmxhaCBiZWZvcmUgYmxhaDwvZWNobz4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iY2F0IiBvdXRwdXQ9InJlZGlyZWN0b3Iub3V0IiBlcnJvcj0icmVkaXJlY3Rvci5lcnIiPgorICAgICAgICAgICAgPHJlZGlyZWN0b3Igb3V0cHV0cHJvcGVydHk9InJlZGlyZWN0b3Iub3V0IgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jwcm9wZXJ0eT0icmVkaXJlY3Rvci5lcnIiPgorICAgICAgICAgICAgICAgIDxvdXRwdXRmaWx0ZXJjaGFpbj4KKyAgICAgICAgICAgICAgICAgICAgPHJlcGxhY2VzdHJpbmcgZnJvbT0iYmVmb3JlIiB0bz0iYWZ0ZXIiIC8+CisgICAgICAgICAgICAgICAgPC9vdXRwdXRmaWx0ZXJjaGFpbj4KKyAgICAgICAgICAgICAgICA8b3V0cHV0bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209Im5vbWF0Y2giIHRvPSJub21hdGNob3V0IiAvPgorICAgICAgICAgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSJub21hdGNoIiB0bz0ibm9tYXRjaGVyciIgLz4KKyAgICAgICAgICAgIDwvcmVkaXJlY3Rvcj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InJlZGlyZWN0b3IuaW4iLz4KKyAgICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWRpcmVjdG9yMTMiIGRlcGVuZHM9ImluaXQiIGlmPSJ0ZXN0LmNhbi5ydW4iPgorICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJzaCI+CisgICAgICAgICAgICA8cmVkaXJlY3Rvcj4KKyAgICAgICAgICAgICAgICA8b3V0cHV0ZmlsdGVyY2hhaW4+CisgICAgICAgICAgICAgICAgICAgIDxyZXBsYWNlc3RyaW5nIGZyb209Im91dCIgdG89Ik9VVFBVVD8/PyIgLz4KKyAgICAgICAgICAgICAgICA8L291dHB1dGZpbHRlcmNoYWluPgorICAgICAgICAgICAgICAgIDxlcnJvcmZpbHRlcmNoYWluPgorICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJlcnIiIHRvPSJFUlJPUiEhISIgLz4KKyAgICAgICAgICAgICAgICA8L2Vycm9yZmlsdGVyY2hhaW4+CisgICAgICAgICAgICA8L3JlZGlyZWN0b3I+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJwYXJyb3Quc2giIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSIke2FudC5maWxlfSIgLz4KKyAgICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWRpcmVjdG9yMTQiIGRlcGVuZHM9ImluaXQiIGlmPSJjYXQuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImNhdCI+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBpbnB1dHN0cmluZz0iYmxhaCBiZWZvcmUgYmxhaCI+CisgICAgICAgICAgICAgICAgPG91dHB1dGZpbHRlcmNoYWluPgorICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJiZWZvcmUiIHRvPSJhZnRlciIgLz4KKyAgICAgICAgICAgICAgICA8L291dHB1dGZpbHRlcmNoYWluPgorICAgICAgICAgICAgICAgIDxvdXRwdXRtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0ibm9tYXRjaCIgdG89Im5vbWF0Y2hvdXQiIC8+CisgICAgICAgICAgICAgICAgPGVycm9ybWFwcGVyIHR5cGU9Imdsb2IiIGZyb209Im5vbWF0Y2giIHRvPSJub21hdGNoZXJyIiAvPgorICAgICAgICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgICA8L2V4ZWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0b3IxNSIgZGVwZW5kcz0iaW5pdCIgaWY9ImNhdC5jYW4ucnVuIj4KKyAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iY2F0Ij4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIGlucHV0PSJpbnB1dC9pc284ODU5LTEiIG91dHB1dD0icmVkaXJlY3Rvci5vdXQiCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dGVuY29kaW5nPSJJU084ODU5XzEiIG91dHB1dGVuY29kaW5nPSJVVEY4IiAvPgorICAgICAgICA8L2V4ZWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0b3IxNiIgZGVwZW5kcz0iaW5pdCIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InNoIj4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIGlucHV0c3RyaW5nPSJleGl0IgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0PSJyZWRpcmVjdG9yMTYub3V0IiBlcnJvcj0icmVkaXJlY3RvcjE2LmVyciIgLz4KKyAgICAgICAgPC9leGVjPgorICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSIxNnBhc3MiPgorICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9InJlZGlyZWN0b3IxNi5vdXQiIHR5cGU9ImZpbGUiIC8+CisgICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJyZWRpcmVjdG9yMTYuZXJyIiB0eXBlPSJmaWxlIiAvPgorICAgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8ZmFpbCB1bmxlc3M9IjE2cGFzcyI+RmlsZXMgd2VyZSBub3QgY3JlYXRlZC48L2ZhaWw+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0b3IxNyIgZGVwZW5kcz0iaW5pdCIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InNoIj4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIGlucHV0c3RyaW5nPSJleGl0IiBjcmVhdGVlbXB0eWZpbGVzPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dD0icmVkaXJlY3RvcjE3Lm91dCIgZXJyb3I9InJlZGlyZWN0b3IxNy5lcnIiIC8+CisgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iMTdmYWlsIj4KKyAgICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9InJlZGlyZWN0b3IxNy5vdXQiIHR5cGU9ImZpbGUiIC8+CisgICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJyZWRpcmVjdG9yMTcuZXJyIiB0eXBlPSJmaWxlIiAvPgorICAgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICAgIDxmYWlsIGlmPSIxN2ZhaWwiPkZpbGVzIHdlcmUgY3JlYXRlZC48L2ZhaWw+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0b3IxOCIgZGVwZW5kcz0iaW5pdCIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9InNoIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBhbHdheXNsb2c9InRydWUiIGxvZ2Vycm9yPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cHJvcGVydHk9InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICA8L2V4ZWM+CisgICAgICAgIDxmYWlsIG1lc3NhZ2U9InByb3BlcnR5IHJlZGlyZWN0b3Iub3V0IGhhcyB1bmV4cGVjdGVkIGNvbnRlbnQiPgorICAgICAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICAgICAgICA8bm90PgorICAgICAgICAgICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmZpbGV9IG91dCIgYXJnMj0iJHtyZWRpcmVjdG9yLm91dH0iIC8+CisgICAgICAgICAgICAgICAgPC9ub3Q+CisgICAgICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgICAgPC9mYWlsPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSB0ZXN0IHdpbGwgc3VjY2VlZCBhcyB0aGUgT1Mgd29udCBtYXRjaC0tPgorICAgIDx0YXJnZXQgbmFtZT0idGVzdEV4ZWNVbmtub3duT1MiPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ibm9uZXhpc3RlbnQtcHJvZ3JhbS13ZS1leHBlY3QiCisgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgICBvcz0iWlg4MSI+CisgICAgICA8L2V4ZWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RFeGVjT1NGYW1pbHkiPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0idXB0aW1lIgorICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSIKKyAgICAgICAgb3NGYW1pbHk9InVuaXgiPgorICAgICAgPC9leGVjPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iY21kLmV4ZSIKKyAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICAgIG9zRmFtaWx5PSJ3aW5udCI+CisgICAgICAgIDxhcmcgdmFsdWU9Ii9jIiAvPgorICAgICAgICA8YXJnIHZhbHVlPSJ0aW1lIC90IiAvPgorICAgICAgPC9leGVjPgorICAgIDwvdGFyZ2V0PiAgICAKKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RFeGVjSW5jb25zaXN0ZW50U2V0dGluZ3MiPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0ibm9uZXhpc3RlbnQtcHJvZ3JhbS13ZS1leHBlY3QiCisgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgICBvc0ZhbWlseT0iV0lOOVgiCisgICAgICAgIG9zPSJsaW51eCB1bml4Ij4KKyAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgICAgICA8ZGVsZXRlPgorICAgICAgICAgICAgPGZpbGVzZXQgZmlsZT0iJHtsb2dGaWxlfSIgLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9InJlZGlyZWN0KiIgLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9InJlZGlyZWN0b3IqIiAvPgorICAgICAgICA8L2RlbGV0ZT4KKyAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvZXhwZWN0ZWQvdXRmLTggYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2V4cGVjdGVkL3V0Zi04Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTQ5YmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2V4cGVjdGVkL3V0Zi04CkBAIC0wLDAgKzEgQEAKK8Okw7bDvMOEw5bDnMOfCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2lucHV0L2lzbzg4NTktMSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvaW5wdXQvaXNvODg1OS0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDQ0MDEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2lucHV0L2lzbzg4NTktMQpAQCAtMCwwICsxIEBACivk9vzE1tzfCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL3BhcnJvdC5zaCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvcGFycm90LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0NjdmMjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL3BhcnJvdC5zaApAQCAtMCwwICsxLDE5IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitmb3IgYXJnIGluICIkQCIgOyBkbworCWVjaG8gJGFyZyBvdXQKKwlzbGVlcCAxCisJZWNobyAkYXJnIGVycj4mMgorZG9uZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy9zcGF3bi5zaCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvc3Bhd24uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMDYzMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvc3Bhd24uc2gKQEAgLTAsMCArMSwyOSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorc2xlZXB0aW1lPTEwCitsb2dmaWxlPXNwYXduLmxvZworaWYgIFsgJCMgLWdlIDEgXTsgdGhlbgorICAgc2xlZXB0aW1lPSQxCisgICBlY2hvICRzbGVlcHRpbWUKK2ZpCitpZiAgWyAkIyAtZ2UgMiBdOyB0aGVuCisgICBsb2dmaWxlPSQyCisgICBlY2hvICRsb2dmaWxlCitmaQorZWNobyBoZWxsbworcm0gICRsb2dmaWxlCitzbGVlcCAkc2xlZXB0aW1lCitlY2hvIGJ5ZSBieWUgPiAkbG9nZmlsZQorZWNobyBieWUgYnllCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby1odWdlLnRhci5iejIgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby1odWdlLnRhci5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyZDIxNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLWh1Z2UudGFyLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby1odWdlLnRhci5neiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLWh1Z2UudGFyLmd6Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTQ3MWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby1odWdlLnRhci5negpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYuYnoyIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTczZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYuZ3ogYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYuZ3oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjYzkxOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi5negpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYubWQ1IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLm1kNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYxMTliCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLm1kNQpAQCAtMCwwICsxIEBACiswNTQxZDNkZjQyNTIwOTExZjI2OGFiYzczMGYzYWZlMApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLm1kNXN1bSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi5tZDVzdW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjNDlkMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi5tZDVzdW0KQEAgLTAsMCArMSBAQAorMDU0MWQzZGY0MjUyMDkxMWYyNjhhYmM3MzBmM2FmZTAgKmFzZi1sb2dvLmdpZgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnBhdHRlcm4gYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYucGF0dGVybgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZlYjgyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnBhdHRlcm4KQEAgLTAsMCArMSBAQAorZm9vMDU0MWQzZGY0MjUyMDkxMWYyNjhhYmM3MzBmM2FmZTBiYXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi5zdmYgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYuc3ZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZjhlYzIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYuc3ZmCkBAIC0wLDAgKzEgQEAKK01ENSAoYXNmLWxvZ28uZ2lmKSA9IDA1NDFkM2RmNDI1MjA5MTFmMjY4YWJjNzMwZjNhZmUwCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYudGFyIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnRhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzBmNzkwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnRhcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYudGFyLmJ6MiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIuYnoyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTkxZmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYudGFyLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYudGFyLmd6IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnRhci5negpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQyM2EyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnRhci5negpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYuemlwIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjk3MGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9jb3B5LmZpbHRlcnNldC5maWx0ZXJlZCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2NvcHkuZmlsdGVyc2V0LmZpbHRlcmVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYmNmNWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9jb3B5LmZpbHRlcnNldC5maWx0ZXJlZApAQCAtMCwwICsxIEBACitUaGlzIGlzIHRoZSBBcGFjaGUgQW50IFByb2plY3QuCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mYWlsLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZhaWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNjU2MWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mYWlsLnhtbApAQCAtMCwwICsxLDEzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImZhaWwtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxmYWlsLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPGZhaWwgbWVzc2FnZT0idGVzdDIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VGV4dCI+CisgICAgPGZhaWw+dGVzdFRleHQ8L2ZhaWw+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SWYiPgorICAgIDxmYWlsIGlmPSJmb28iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFVubGVzcyI+CisgICAgPGZhaWwgdW5sZXNzPSJmb28iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdElmQW5kVW5sZXNzIj4KKyAgICA8ZmFpbCB1bmxlc3M9InVubGVzcyIgaWY9ImlmIi8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TmVzdGVkMSIgZGVzY3JpcHRpb249InNob3VsZCBmYWlsIHdpdGggZGVmYXVsdCBtZXNzYWdlIj4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPGFuZCAvPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROZXN0ZWQyIiBkZXNjcmlwdGlvbj0ic2hvdWxkIHBhc3MiPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICA8b3IgLz4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TmVzdGVkMyIgZGVzY3JpcHRpb249InNob3VsZCBmYWlsIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSJ0ZXN0TmVzdGVkMyI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxhbmQgLz4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TmVzdGVkNGEiIGRlc2NyaXB0aW9uPSJzaG91bGQgZXJyb3IiPgorICAgIDxmYWlsIGlmPSJpZiI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxhbmQgLz4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TmVzdGVkNGIiIGRlc2NyaXB0aW9uPSJzaG91bGQgZXJyb3IiPgorICAgIDxmYWlsIHVubGVzcz0idW5sZXNzIj4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPGFuZCAvPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROZXN0ZWQ0YyIgZGVzY3JpcHRpb249InNob3VsZCBlcnJvciI+CisgICAgPGZhaWwgaWY9ImlmIiB1bmxlc3M9InVubGVzcyI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxhbmQgLz4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TmVzdGVkNSIgZGVzY3JpcHRpb249InNob3VsZCBlcnJvciI+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxvciAvPgorICAgICAgPC9jb25kaXRpb24+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxhbmQgLz4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TmVzdGVkNiIgZGVzY3JpcHRpb249InNob3VsZCBmYWlsIHdpdGggbWVzc2FnZSI+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgIDxhbmQgLz4KKyAgICAgIDwvY29uZGl0aW9uPgordGVzdE5lc3RlZDYKK3Rlc3ROZXN0ZWQ2Cit0ZXN0TmVzdGVkNgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TmVzdGVkN2EiIGRlc2NyaXB0aW9uPSJzaG91bGQgZXJyb3IiPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbiAvPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TmVzdGVkN2IiIGRlc2NyaXB0aW9uPSJzaG91bGQgZXJyb3IiPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICA8YW5kIC8+CisgICAgICAgICAgPGFuZCAvPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZWZhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlci54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImZpbHRlci10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGZpbHRlci8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxmaWx0ZXIgdG9rZW49IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8ZmlsdGVyIHZhbHVlPSIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+CisgICAgPGZpbHRlciB0b2tlbj0iIiB2YWx1ZT0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDxmaWx0ZXIgdG9rZW49InllYXIiIHZhbHVlPSIyMDAwIiAvPgorICAgIDxjb3B5IGZpbGU9ImZpbHRlcjEudHh0IiB0b2ZpbGU9ImZpbHRlcmVkLnRtcCIgZmlsdGVyaW5nPSJ5ZXMiIG92ZXJ3cml0ZT0ieWVzIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KKyAgICA8ZmlsdGVyIHRva2VuPSJ5ZWFyIiB2YWx1ZT0iMjAwMCIgLz4KKyAgICA8Y29weSB0b2Rpcj0iLi90YXNrZGVmcy50bXAiIGZpbHRlcmluZz0ieWVzIiBvdmVyd3JpdGU9InllcyI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJmaWx0ZXIxLnR4dCIgLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDciPgorICAgIDxmaWx0ZXIgdG9rZW49IlJPT1QiIHZhbHVlPSJyb290IiAvPgorICAgIDxjb3B5IGZpbGU9ImZpbHRlcjIudHh0IiB0b2ZpbGU9ImZpbHRlcmVkLnRtcCIgZmlsdGVyaW5nPSJ5ZXMiIG92ZXJ3cml0ZT0ieWVzIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q4Ij4KKyAgICA8ZmlsdGVyIHRva2VuPSJST09UIiB2YWx1ZT0icm9vdCIgLz4KKyAgICA8Y29weSB0b2Rpcj0iLi90YXNrZGVmcy50bXAiIGZpbHRlcmluZz0ieWVzIiBvdmVyd3JpdGU9InllcyI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJmaWx0ZXIyLnR4dCIvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OSI+CisgICAgPGZpbHRlciBmaWx0ZXJzZmlsZT0iZmlsdGVyZGVmcy5wcm9wZXJ0aWVzIiAvPgorICAgIDxjb3B5IHRvZGlyPSIuL3Rhc2tkZWZzLnRtcCIgZmlsdGVyaW5nPSJ5ZXMiIG92ZXJ3cml0ZT0ieWVzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9ImZpbHRlcjMudHh0Ii8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZGlyPSJ0YXNrZGVmcy50bXAiIC8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXIxLnR4dCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlcjEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNGY5NzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXIxLnR4dApAQCAtMCwwICsxIEBACitAeWVhckAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlcjIudHh0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjZDA2YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlcjIudHh0CkBAIC0wLDAgKzEgQEAKKzwlQCBpbmNsdWRlIGZpbGU9IkBST09UQC9zb21lL2luY2x1ZGUuanNwIiU+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXIzLnR4dCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlcjMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDdkMjkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXIzLnR4dApAQCAtMCwwICsxIEBACitAcHJvcGVydHlACmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXJkZWZzLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXJkZWZzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5OWRmMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlcmRlZnMucHJvcGVydGllcwpAQCAtMCwwICsxLDE1IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitwcm9wZXJ0eT1pbmNsdWRlZApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9idWlsZC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ3ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9idWlsZC54bWwKQEAgLTAsMCArMSwzMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iZml4Y3JsZiIgZGVmYXVsdD0iY2xlYW51cCIgYmFzZWRpcj0iLiI+CisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgPG1rZGlyIGRpcj0icmVzdWx0IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZGlyPSJyZXN1bHQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJhc3NlcnRlcXVhbCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJqdW5rIiBkZWZhdWx0PSIiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiBkZWZhdWx0PSJKdW5rQHtqdW5rfS5qYXZhIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZTEiIGRlZmF1bHQ9InJlc3VsdC9Ae25hbWV9IiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZTIiIGRlZmF1bHQ9ImV4cGVjdGVkL0B7bmFtZX0iIC8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZmFpbCBtZXNzYWdlPSJAe2ZpbGUxfSBhbmQgQHtmaWxlMn0gYXJlIGRpZmZlcmVudCI+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxmaWxlc21hdGNoIGZpbGUxPSJAe2ZpbGUxfSIgZmlsZTI9IkB7ZmlsZTJ9IiAvPgorICAgICAgICAgIDwvbm90PgorICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIDwvZmFpbD4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGZpeGNybGYgc3JjZGlyPSJpbnB1dCIgZGVzdGRpcj0icmVzdWx0IgorICAgICAgICAgICAgIGluY2x1ZGVzPSJKdW5rMS5qYXZhIgorICAgICAgICAgICAgIGphdmFmaWxlcz0idHJ1ZSIgdGFiPSJhZGQiIGVvbD0iY3JsZiIgZW9mPSJhc2lzIiAvPgorICAgIDxhc3NlcnRlcXVhbCBqdW5rPSIxIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCisgICAgICAgICAgICAgaW5jbHVkZXM9Ikp1bmsyLmphdmEiCisgICAgICAgICAgICAgamF2YWZpbGVzPSJ0cnVlIiB0YWI9ImFkZCIgY3I9ImFkZCIgZW9sPSJjcmxmIiBlb2Y9ImFzaXMiIC8+CisgICAgPGFzc2VydGVxdWFsIGp1bms9IjIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiIGRlcGVuZHM9ImluaXQiPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iSnVuazMuamF2YSIKKyAgICAgICAgICAgICBqYXZhZmlsZXM9InRydWUiIHRhYj0icmVtb3ZlIiBlb2w9ImxmIiBlb2Y9ImFzaXMiIC8+CisgICAgPGFzc2VydGVxdWFsIGp1bms9IjMiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiIGRlcGVuZHM9ImluaXQiPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iSnVuazQuamF2YSIKKyAgICAgICAgICAgICBqYXZhZmlsZXM9InRydWUiIHRhYj0icmVtb3ZlIiBlb2w9ImxmIiBlb2Y9ImFzaXMiIC8+CisgICAgPGFzc2VydGVxdWFsIGp1bms9IjQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iSnVuazUuamF2YSIKKyAgICAgICAgICAgICB0YWI9InJlbW92ZSIgZW9sPSJsZiIgZW9mPSJhc2lzIiAvPgorICAgIDxhc3NlcnRlcXVhbCBqdW5rPSI1IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q2IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCisgICAgICAgICAgICAgaW5jbHVkZXM9Ikp1bms2LmphdmEiCisgICAgICAgICAgICAgdGFiPSJhZGQiIGNyPSJyZW1vdmUiIGVvbD0iY3JsZiIgZW9mPSJhc2lzIiAvPgorICAgIDxhc3NlcnRlcXVhbCBqdW5rPSI2IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q3IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCisgICAgICAgICAgICAgaW5jbHVkZXM9Ikp1bms3LmphdmEiCisgICAgICAgICAgICAgdGFiPSJhZGQiIGNyPSJhZGQiIGVvZj0iYXNpcyIgLz4KKyAgICA8YXNzZXJ0ZXF1YWwganVuaz0iNyIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGZpeGNybGYgc3JjZGlyPSJpbnB1dCIgZGVzdGRpcj0icmVzdWx0IgorICAgICAgICAgICAgIGluY2x1ZGVzPSJKdW5rOC5qYXZhIgorICAgICAgICAgICAgIGphdmFmaWxlcz0idHJ1ZSIgdGFiPSJhZGQiIGNyPSJhZGQiIGVvZj0iYWRkIiAvPgorICAgIDxhc3NlcnRlcXVhbCBqdW5rPSI4IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q5IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCisgICAgICAgICAgICAgaW5jbHVkZXM9Ikp1bms5LmphdmEiCisgICAgICAgICAgICAgamF2YWZpbGVzPSJ0cnVlIiB0YWI9InJlbW92ZSIgY3I9InJlbW92ZSIgZW9mPSJyZW1vdmUiIC8+CisgICAgPGFzc2VydGVxdWFsIGp1bms9IjkiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE1hY0xpbmVzIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCisgICAgICAgICAgICAgaW5jbHVkZXM9Ik1hYzJVbml4IiBlb2w9ImxmIiAvPgorICAgIDxhc3NlcnRlcXVhbCBuYW1lPSJNYWMyVW5peCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9PdmVyd3JpdGUiIGRlcGVuZHM9InRlc3QxIj4KKyAgICA8dG91Y2ggZmlsZT0icmVzdWx0L0p1bmsxLmphdmEiIG1pbGxpcz0iMCIgLz4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9ImlucHV0IiBkZXN0ZGlyPSJyZXN1bHQiCisgICAgICAgICAgICAgaW5jbHVkZXM9Ikp1bmsxLmphdmEiIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJmYWxzZSIKKyAgICAgICAgICAgICBqYXZhZmlsZXM9InRydWUiIHRhYj0iYWRkIiBlb2w9ImNybGYiIGVvZj0iYXNpcyIgLz4KKyAgICA8ZmFpbCBtZXNzYWdlPSJvdmVyd3JvdGUgdW5jaGFuZ2VkIG91dHB1dCBmaWxlIj5RCisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxpc2ZpbGVzZWxlY3RlZCBmaWxlPSJyZXN1bHQvSnVuazEuamF2YSI+CisgICAgICAgICAgICA8ZGF0ZSB3aGVuPSJlcXVhbCIgbWlsbGlzPSIwIiAvPgorICAgICAgICAgIDwvaXNmaWxlc2VsZWN0ZWQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFbmNvZGluZyIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGZpeGNybGYgc3JjZGlyPSJpbnB1dCIgZGVzdGRpcj0icmVzdWx0IgorICAgICAgICAgICAgIGluY2x1ZGVzPSJpbnB1dC5jcmxmLnV0ZjE2IgorICAgICAgICAgICAgIGphdmFmaWxlcz0iZmFsc2UiIGNyPSJyZW1vdmUiIGVuY29kaW5nPSJVbmljb2RlQmlnIiAvPgorICAgIDxhc3NlcnRlcXVhbCBmaWxlMT0icmVzdWx0L2lucHV0LmNybGYudXRmMTYiCisgICAgICAgICAgICAgICAgIGZpbGUyPSJleHBlY3RlZC9pbnB1dC5sZi51dGYxNiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0T3V0cHV0RW5jb2RpbmciIGRlcGVuZHM9ImluaXQiPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iaW5wdXQuY3JsZi51dGYxNiIKKyAgICAgICAgICAgICBqYXZhZmlsZXM9ImZhbHNlIiBlb2w9ImxmIiBlbmNvZGluZz0iVW5pY29kZUJpZyIKKyAgICAgICAgICAgICBvdXRwdXRlbmNvZGluZz0iYXNjaWkiIC8+CisgICAgPGFzc2VydGVxdWFsIGZpbGUxPSJyZXN1bHQvaW5wdXQuY3JsZi51dGYxNiIKKyAgICAgICAgICAgICAgICAgZmlsZTI9ImV4cGVjdGVkL2lucHV0LmxmLmFzY2lpIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RMb25nTGluZXMiIGRlcGVuZHM9ImluaXQiPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKKyAgICAgICAgICAgICBpbmNsdWRlcz0ibG9uZ2xpbmVzLmNybGYiCisgICAgICAgICAgICAgamF2YWZpbGVzPSJmYWxzZSIgY3I9InJlbW92ZSIgLz4KKyAgICA8YXNzZXJ0ZXF1YWwgZmlsZTE9InJlc3VsdC9sb25nbGluZXMuY3JsZiIKKyAgICAgICAgICAgICAgICAgZmlsZTI9ImV4cGVjdGVkL2xvbmdsaW5lcy5sZiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q3JDckxmU2VxdWVuY2UtdW5peCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGZpeGNybGYgc3JjZGlyPSJpbnB1dCIgZGVzdGRpcj0icmVzdWx0IgorICAgICAgICAgICAgIGluY2x1ZGVzPSJjcmNybGYiIGVvbD0ibGYiIC8+CisgICAgPGFzc2VydGVxdWFsIGZpbGUxPSJyZXN1bHQvY3JjcmxmIgorICAgICAgICAgICAgICAgICBmaWxlMj0iZXhwZWN0ZWQvY3JjcmxmLnVuaXgiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENyQ3JMZlNlcXVlbmNlLWRvcyIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGZpeGNybGYgc3JjZGlyPSJpbnB1dCIgZGVzdGRpcj0icmVzdWx0IgorICAgICAgICAgICAgIGluY2x1ZGVzPSJjcmNybGYiIGVvbD0iY3JsZiIgLz4KKyAgICA8YXNzZXJ0ZXF1YWwgZmlsZTE9InJlc3VsdC9jcmNybGYiCisgICAgICAgICAgICAgICAgIGZpbGUyPSJleHBlY3RlZC9jcmNybGYuZG9zIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDckNyTGZTZXF1ZW5jZS1tYWMiIGRlcGVuZHM9ImluaXQiPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iY3JjcmxmIiBlb2w9ImNyIiAvPgorICAgIDxhc3NlcnRlcXVhbCBmaWxlMT0icmVzdWx0L2NyY3JsZiIKKyAgICAgICAgICAgICAgICAgZmlsZTI9ImV4cGVjdGVkL2NyY3JsZi5tYWMiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpeGxhc3REb3MiIGRlcGVuZHM9ImluaXQiPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iaW5wdXQiIGRlc3RkaXI9InJlc3VsdCIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iZml4bGFzdGZhbHNlLmxmIiBlb2w9ImNybGYiIC8+CisgICAgPGFzc2VydGVxdWFsIGZpbGUxPSJyZXN1bHQvZml4bGFzdGZhbHNlLmxmIgorICAgICAgICAgICAgICAgICBmaWxlMj0iZXhwZWN0ZWQvZml4bGFzdC5kb3MiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpeGxhc3RGYWxzZU1hYyIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGZpeGNybGYgc3JjZGlyPSJpbnB1dCIgZGVzdGRpcj0icmVzdWx0IgorICAgICAgICAgICAgIGluY2x1ZGVzPSJmaXhsYXN0ZmFsc2UubGYiIGVvbD0iY3IiIGZpeGxhc3Q9ImZhbHNlIiAvPgorICAgIDxhc3NlcnRlcXVhbCBmaWxlMT0icmVzdWx0L2ZpeGxhc3RmYWxzZS5sZiIKKyAgICAgICAgICAgICAgICAgZmlsZTI9ImV4cGVjdGVkL2ZpeGxhc3RmYWxzZS5tYWMiIC8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gQnVnemlsbGEgUmVwb3J0IDIwODQwIC0tPgorICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZVBhcmVudERpcnMiIGRlcGVuZHM9ImluaXQiPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iLiIgZGVzdGRpcj0icmVzdWx0IiBpbmNsdWRlcz0iaW5wdXQvSnVuazEuamF2YSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Rml4RmlsZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGZpeGNybGYgZmlsZT0iaW5wdXQvbG9uZ2xpbmVzLmNybGYiIGRlc3RkaXI9InJlc3VsdCIgLz4KKyAgICA8ZmFpbCBtZXNzYWdlPSJkaWRuJ3QgY3JlYXRlIG91dHB1dCBmaWxlIj4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJyZXN1bHQvbG9uZ2xpbmVzLmNybGYiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaXhGaWxlRXhjbHVzaXZlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Zml4Y3JsZiBmaWxlPSJpbnB1dC9sb25nbGluZXMuY3JsZiIgc3JjZGlyPSJpbnB1dCIgZGVzdGRpcj0icmVzdWx0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFByZXNlcnZlTGFzdE1vZGlmaWVkIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Zml4Y3JsZiBmaWxlPSJpbnB1dC9sb25nbGluZXMuY3JsZiIgZGVzdGRpcj0icmVzdWx0IgorICAgICAgICAgICAgIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIiAvPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8dXB0b2RhdGUgc3JjZmlsZT0icmVzdWx0L2xvbmdsaW5lcy5jcmxmIgorICAgICAgICAgICAgICAgICAgICB0YXJnZXRmaWxlPSJpbnB1dC9sb25nbGluZXMuY3JsZiIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisKKyAgICA8dG91Y2ggZmlsZT0icmVzdWx0L2xvbmdsaW5lcy5jcmxmIiBtaWxsaXM9IjAiIC8+CisKKyAgICA8Zml4Y3JsZiBmaWxlPSJyZXN1bHQvbG9uZ2xpbmVzLmNybGYiIGRlc3RkaXI9InJlc3VsdCIgZW9sPSJsZiIKKyAgICAgICAgICAgICBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIgLz4KKworICAgIDxmaWxlc2V0IGlkPSJmcyIgZmlsZT0icmVzdWx0L2xvbmdsaW5lcy5jcmxmIj4KKyAgICAgIDxkYXRlIHdoZW49ImVxdWFsIiBtaWxsaXM9IjAiIC8+CisgICAgPC9maWxlc2V0PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmcyIgcmVmaWQ9ImZzIiAvPgorICAgIDxmYWlsIHVubGVzcz0iZnMiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbHRlcjEiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L0p1bmsxLmphdmEiIHRvZGlyPSJyZXN1bHQiIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxmaXhjcmxmIGphdmFmaWxlcz0idHJ1ZSIgdGFiPSJhZGQiCisgICAgICAgICAgICAgICAgIGVvbD0iY3JsZiIgZW9mPSJhc2lzIiAvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgICAgPGFzc2VydGVxdWFsIGp1bms9IjEiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbHRlcjIiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L0p1bmsyLmphdmEiIHRvZGlyPSJyZXN1bHQiIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxmaXhjcmxmIGphdmFmaWxlcz0idHJ1ZSIgdGFiPSJhZGQiIGNyPSJhZGQiIGVvbD0iY3JsZiIgZW9mPSJhc2lzIiAvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgICAgPGFzc2VydGVxdWFsIGp1bms9IjIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbHRlcjMiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9ImlucHV0L0p1bmszLmphdmEiIHRvZGlyPSJyZXN1bHQiIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxmaXhjcmxmIGphdmFmaWxlcz0idHJ1ZSIgdGFiPSJyZW1vdmUiIGVvbD0ibGYiIGVvZj0iYXNpcyIgLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICAgIDxhc3NlcnRlcXVhbCBqdW5rPSIzIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXI0IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9KdW5rNC5qYXZhIiB0b2Rpcj0icmVzdWx0IiBvdmVyd3JpdGU9InRydWUiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8Zml4Y3JsZiBqYXZhZmlsZXM9InRydWUiIHRhYj0icmVtb3ZlIiBlb2w9ImxmIiBlb2Y9ImFzaXMiIC8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgICA8YXNzZXJ0ZXF1YWwganVuaz0iNCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsdGVyNSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvSnVuazUuamF2YSIgdG9kaXI9InJlc3VsdCIgb3ZlcndyaXRlPSJ0cnVlIj4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGZpeGNybGYgdGFiPSJyZW1vdmUiIGVvbD0ibGYiIGVvZj0iYXNpcyIgLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICAgIDxhc3NlcnRlcXVhbCBqdW5rPSI1IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXI2IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9KdW5rNi5qYXZhIiB0b2Rpcj0icmVzdWx0IiBvdmVyd3JpdGU9InRydWUiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8Zml4Y3JsZiB0YWI9ImFkZCIgY3I9InJlbW92ZSIgZW9sPSJjcmxmIiBlb2Y9ImFzaXMiIC8+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvY29weT4KKyAgICA8YXNzZXJ0ZXF1YWwganVuaz0iNiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsdGVyNyIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGNvcHkgZmlsZT0iaW5wdXQvSnVuazcuamF2YSIgdG9kaXI9InJlc3VsdCIgb3ZlcndyaXRlPSJ0cnVlIj4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGZpeGNybGYgdGFiPSJhZGQiIGNyPSJhZGQiIGVvZj0iYXNpcyIgLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICAgIDxhc3NlcnRlcXVhbCBqdW5rPSI3IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXI4IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9KdW5rOC5qYXZhIiB0b2Rpcj0icmVzdWx0IiBvdmVyd3JpdGU9InRydWUiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8Zml4Y3JsZiBqYXZhZmlsZXM9InRydWUiIHRhYj0iYWRkIiBjcj0iYWRkIiBlb2Y9ImFkZCIgLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICAgIDxhc3NlcnRlcXVhbCBqdW5rPSI4IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXI5IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9KdW5rOS5qYXZhIiB0b2Rpcj0icmVzdWx0IiBvdmVyd3JpdGU9InRydWUiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8Zml4Y3JsZiBqYXZhZmlsZXM9InRydWUiIHRhYj0icmVtb3ZlIiBjcj0icmVtb3ZlIiBlb2Y9InJlbW92ZSIgLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb3B5PgorICAgIDxhc3NlcnRlcXVhbCBqdW5rPSI5IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDYW5ub3REb3VibGVFb2YiIGRlcGVuZHM9InRlc3Q4Ij4KKyAgICA8Zml4Y3JsZiBmaWxlPSJyZXN1bHQvSnVuazguamF2YSIKKyAgICAgICAgICAgICBqYXZhZmlsZXM9InRydWUiIHRhYj0iYWRkIiBjcj0iYWRkIiBlb2Y9ImFkZCIgLz4KKyAgICA8YXNzZXJ0ZXF1YWwganVuaz0iOCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VGFiSW5MaXRlcmFsSW5Db21tZW50Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC90YWJfaW5fbGl0ZXJhbF9pbl9jb21tZW50IiB0b2Rpcj0icmVzdWx0IgorICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxmaXhjcmxmIGphdmFmaWxlcz0idHJ1ZSIgdGFiPSJyZW1vdmUiIGVvbD0ibGYiIGZpeGxhc3Q9ImZhbHNlIiAvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgICAgPGFzc2VydGVxdWFsIG5hbWU9InRhYl9pbl9saXRlcmFsX2luX2NvbW1lbnQiIC8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rMS5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjFiOGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bmsxLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcHVibGljIGNsYXNzIEp1bmsxIHsNCisgICAgcHVibGljIGJvb2xlYW4gbXlib29sOw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgew0KKwlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOw0KKwkvLwlIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYg0KKwlpZiAobXlib29sKSB7CS8qIEhlcmUgaXMgYSBtdWx0aS1saW5lDQorCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpDQorCSAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7CS8vPC10YWItPgk8LQ0KKwl9IC8vIGVuZCBvZiBpZiAobXlib29sKQ0KKwkNCisgICAgfSAvLyBlbmQgb2YgbWFpbiAoKQ0KK30NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bmsyLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bmsyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyMWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazIuamF2YQpAQCAtMCwwICsxLDEyIEBACitwdWJsaWMgY2xhc3MgSnVuazEgew0KKyAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7DQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7DQorCVN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7DQorCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiDQorCWlmIChteWJvb2wpIHsJLyogSGVyZSBpcyBhIG11bHRpLWxpbmUNCisJCQkgICAod2l0aCBlbWJlZGRlZCcJJ3RhYikNCisJICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtDQorCX0gLy8gZW5kIG9mIGlmIChteWJvb2wpDQorCQ0KKyAgICB9IC8vIGVuZCBvZiBtYWluICgpDQorfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazMuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDI3MTY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rMy5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3B1YmxpYyBjbGFzcyBKdW5rMSB7CisgICAgcHVibGljIGJvb2xlYW4gbXlib29sOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7CisgICAgICAgIC8vICAgICAgSGVyZSBpcyBhIGNvbW1lbnQgd2l0aCBhbiBlbWJlZGRlZCB0YWIKKyAgICAgICAgaWYgKG15Ym9vbCkgeyAgIC8qIEhlcmUgaXMgYSBtdWx0aS1saW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aCBlbWJlZGRlZCcgICAgICAndGFiKQorICAgICAgICAgICAgQ29tbWVudCAqL2NoYXIgbXljaGFyID0gJwknOyAgICAgIC8vPC10YWItPiAgICAgICA8LQorICAgICAgICB9IC8vIGVuZCBvZiBpZiAobXlib29sKQorICAgICAgICAKKyAgICB9IC8vIGVuZCBvZiBtYWluICgpCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms0LmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyNzE2NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazQuamF2YQpAQCAtMCwwICsxLDEyIEBACitwdWJsaWMgY2xhc3MgSnVuazEgeworICAgIHB1YmxpYyBib29sZWFuIG15Ym9vbDsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOworICAgICAgICAvLyAgICAgIEhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCisgICAgICAgIGlmIChteWJvb2wpIHsgICAvKiBIZXJlIGlzIGEgbXVsdGktbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGggZW1iZWRkZWQnICAgICAgJ3RhYikKKyAgICAgICAgICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsgICAgICAvLzwtdGFiLT4gICAgICAgPC0KKyAgICAgICAgfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKKyAgICAgICAgCisgICAgfSAvLyBlbmQgb2YgbWFpbiAoKQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNS5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYTAxYTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms1LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcHVibGljIGNsYXNzIEp1bmsxIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJIGhhdmUgICAgICBhIHRhYiIpOworICAgICAgICAvLyAgICAgIEhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCisgICAgICAgIGlmIChteWJvb2wpIHsgICAvKiBIZXJlIGlzIGEgbXVsdGktbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGggZW1iZWRkZWQnICAgICAgJ3RhYikKKyAgICAgICAgICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcgICAnOyAgICAgIC8vPC10YWItPiAgICAgICA8LQorICAgICAgICB9IC8vIGVuZCBvZiBpZiAobXlib29sKQorICAgICAgICAKKyAgICB9IC8vIGVuZCBvZiBtYWluICgpCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms2LmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyMWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazYuamF2YQpAQCAtMCwwICsxLDEyIEBACitwdWJsaWMgY2xhc3MgSnVuazEgew0KKyAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7DQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7DQorCVN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7DQorCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiDQorCWlmIChteWJvb2wpIHsJLyogSGVyZSBpcyBhIG11bHRpLWxpbmUNCisJCQkgICAod2l0aCBlbWJlZGRlZCcJJ3RhYikNCisJICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtDQorCX0gLy8gZW5kIG9mIGlmIChteWJvb2wpDQorCQ0KKyAgICB9IC8vIGVuZCBvZiBtYWluICgpDQorfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazcuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvSnVuazcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIxYjhkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rNy5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3B1YmxpYyBjbGFzcyBKdW5rMSB7DQorICAgIHB1YmxpYyBib29sZWFuIG15Ym9vbDsNCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsNCisJU3lzdGVtLm91dC5wcmludGxuKCJJIGhhdmUJYSB0YWIiKTsNCisJLy8JSGVyZSBpcyBhIGNvbW1lbnQgd2l0aCBhbiBlbWJlZGRlZCB0YWINCisJaWYgKG15Ym9vbCkgewkvKiBIZXJlIGlzIGEgbXVsdGktbGluZQ0KKwkJCSAgICh3aXRoIGVtYmVkZGVkJwkndGFiKQ0KKwkgICAgQ29tbWVudCAqL2NoYXIgbXljaGFyID0gJwknOwkvLzwtdGFiLT4JPC0NCisJfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkNCisJDQorICAgIH0gLy8gZW5kIG9mIG1haW4gKCkNCit9DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rOC5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rOC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYThlODQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms4LmphdmEKQEAgLTAsMCArMSwxMyBAQAorcHVibGljIGNsYXNzIEp1bmsxIHsNCisgICAgcHVibGljIGJvb2xlYW4gbXlib29sOw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgew0KKwlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOw0KKwkvLwlIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYg0KKwlpZiAobXlib29sKSB7CS8qIEhlcmUgaXMgYSBtdWx0aS1saW5lDQorCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpDQorCSAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7CS8vPC10YWItPgk8LQ0KKwl9IC8vIGVuZCBvZiBpZiAobXlib29sKQ0KKwkNCisgICAgfSAvLyBlbmQgb2YgbWFpbiAoKQ0KK30NCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rOS5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9KdW5rOS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjcxNjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL0p1bms5LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcHVibGljIGNsYXNzIEp1bmsxIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJIGhhdmUJYSB0YWIiKTsKKyAgICAgICAgLy8gICAgICBIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYgorICAgICAgICBpZiAobXlib29sKSB7ICAgLyogSGVyZSBpcyBhIG11bHRpLWxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoIGVtYmVkZGVkJyAgICAgICd0YWIpCisgICAgICAgICAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7ICAgICAgLy88LXRhYi0+ICAgICAgIDwtCisgICAgICAgIH0gLy8gZW5kIG9mIGlmIChteWJvb2wpCisgICAgICAgIAorICAgIH0gLy8gZW5kIG9mIG1haW4gKCkKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvTWFjMlVuaXggYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL01hYzJVbml4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTRmNTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL01hYzJVbml4CkBAIC0wLDAgKzEsNCBAQAorbGluZTEKK2xpbmUyCisKK2xpbmUzCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL2NyY3JsZi5kb3MgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL2NyY3JsZi5kb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5NTZlYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvY3JjcmxmLmRvcwpAQCAtMCwwICsxLDIgQEAKKzENCisyDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9jcmNybGYubWFjIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9jcmNybGYubWFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTliMTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL2NyY3JsZi5tYWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9jcmNybGYudW5peCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvY3JjcmxmLnVuaXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5MTI0NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvY3JjcmxmLnVuaXgKQEAgLTAsMCArMSwyIEBACisxCisyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL2ZpeGxhc3QuZG9zIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9maXhsYXN0LmRvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTlkNGZjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9maXhsYXN0LmRvcwpAQCAtMCwwICsxLDIgQEAKKzEyMzQ1DQorNjc4OQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvZml4bGFzdGZhbHNlLm1hYyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvZml4bGFzdGZhbHNlLm1hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdkNmJmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9maXhsYXN0ZmFsc2UubWFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvaW5wdXQubGYuYXNjaWkgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL2lucHV0LmxmLmFzY2lpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMmRkODEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL2lucHV0LmxmLmFzY2lpCkBAIC0wLDAgKzEsMiBAQAorTGluZTEKK0xpbmUyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL2lucHV0LmxmLnV0ZjE2IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9pbnB1dC5sZi51dGYxNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmZiNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9leHBlY3RlZC9pbnB1dC5sZi51dGYxNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL2xvbmdsaW5lcy5sZiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvbG9uZ2xpbmVzLmxmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWYxNzIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL2xvbmdsaW5lcy5sZgpAQCAtMCwwICsxLDIgQEAKK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQorYWJjCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL3RhYl9pbl9saXRlcmFsX2luX2NvbW1lbnQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2V4cGVjdGVkL3RhYl9pbl9saXRlcmFsX2luX2NvbW1lbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzZTlmYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvZXhwZWN0ZWQvdGFiX2luX2xpdGVyYWxfaW5fY29tbWVudApAQCAtMCwwICsxLDIgQEAKKy8vICIgICAgIgorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bmsxLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bmsxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2OTc0NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazEuamF2YQpAQCAtMCwwICsxLDEyIEBACitwdWJsaWMgY2xhc3MgSnVuazEgeworICAgIHB1YmxpYyBib29sZWFuIG15Ym9vbDsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgeworCVN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7CisJLy8JSGVyZSBpcyBhIGNvbW1lbnQgd2l0aCBhbiBlbWJlZGRlZCB0YWIKKwlpZiAobXlib29sKSB7CS8qIEhlcmUgaXMgYSBtdWx0aS1saW5lCisJCQkgICAod2l0aCBlbWJlZGRlZCcJJ3RhYikKKwkgICAgQ29tbWVudCAqL2NoYXIgbXljaGFyID0gJwknOwkvLzwtdGFiLT4JPC0KKwl9IC8vIGVuZCBvZiBpZiAobXlib29sKQorCQorICAgIH0gLy8gZW5kIG9mIG1haW4gKCkKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazIuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY5NzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rMi5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3B1YmxpYyBjbGFzcyBKdW5rMSB7CisgICAgcHVibGljIGJvb2xlYW4gbXlib29sOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7CisJU3lzdGVtLm91dC5wcmludGxuKCJJIGhhdmUJYSB0YWIiKTsKKwkvLwlIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYgorCWlmIChteWJvb2wpIHsJLyogSGVyZSBpcyBhIG11bHRpLWxpbmUKKwkJCSAgICh3aXRoIGVtYmVkZGVkJwkndGFiKQorCSAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7CS8vPC10YWItPgk8LQorCX0gLy8gZW5kIG9mIGlmIChteWJvb2wpCisJCisgICAgfSAvLyBlbmQgb2YgbWFpbiAoKQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rMy5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjk3NDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bmszLmphdmEKQEAgLTAsMCArMSwxMiBAQAorcHVibGljIGNsYXNzIEp1bmsxIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKwlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOworCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCisJaWYgKG15Ym9vbCkgewkvKiBIZXJlIGlzIGEgbXVsdGktbGluZQorCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpCisJICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtCisJfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKKwkKKyAgICB9IC8vIGVuZCBvZiBtYWluICgpCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms0LmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyNzE2NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazQuamF2YQpAQCAtMCwwICsxLDEyIEBACitwdWJsaWMgY2xhc3MgSnVuazEgeworICAgIHB1YmxpYyBib29sZWFuIG15Ym9vbDsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOworICAgICAgICAvLyAgICAgIEhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCisgICAgICAgIGlmIChteWJvb2wpIHsgICAvKiBIZXJlIGlzIGEgbXVsdGktbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGggZW1iZWRkZWQnICAgICAgJ3RhYikKKyAgICAgICAgICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsgICAgICAvLzwtdGFiLT4gICAgICAgPC0KKyAgICAgICAgfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKKyAgICAgICAgCisgICAgfSAvLyBlbmQgb2YgbWFpbiAoKQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rNS5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rNS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjcxNjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms1LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcHVibGljIGNsYXNzIEp1bmsxIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJIGhhdmUJYSB0YWIiKTsKKyAgICAgICAgLy8gICAgICBIZXJlIGlzIGEgY29tbWVudCB3aXRoIGFuIGVtYmVkZGVkIHRhYgorICAgICAgICBpZiAobXlib29sKSB7ICAgLyogSGVyZSBpcyBhIG11bHRpLWxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoIGVtYmVkZGVkJyAgICAgICd0YWIpCisgICAgICAgICAgICBDb21tZW50ICovY2hhciBteWNoYXIgPSAnCSc7ICAgICAgLy88LXRhYi0+ICAgICAgIDwtCisgICAgICAgIH0gLy8gZW5kIG9mIGlmIChteWJvb2wpCisgICAgICAgIAorICAgIH0gLy8gZW5kIG9mIG1haW4gKCkKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazYuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDI3MTY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rNi5qYXZhCkBAIC0wLDAgKzEsMTIgQEAKK3B1YmxpYyBjbGFzcyBKdW5rMSB7CisgICAgcHVibGljIGJvb2xlYW4gbXlib29sOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7CisgICAgICAgIC8vICAgICAgSGVyZSBpcyBhIGNvbW1lbnQgd2l0aCBhbiBlbWJlZGRlZCB0YWIKKyAgICAgICAgaWYgKG15Ym9vbCkgeyAgIC8qIEhlcmUgaXMgYSBtdWx0aS1saW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAod2l0aCBlbWJlZGRlZCcgICAgICAndGFiKQorICAgICAgICAgICAgQ29tbWVudCAqL2NoYXIgbXljaGFyID0gJwknOyAgICAgIC8vPC10YWItPiAgICAgICA8LQorICAgICAgICB9IC8vIGVuZCBvZiBpZiAobXlib29sKQorICAgICAgICAKKyAgICB9IC8vIGVuZCBvZiBtYWluICgpCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms3LmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyNzE2NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazcuamF2YQpAQCAtMCwwICsxLDEyIEBACitwdWJsaWMgY2xhc3MgSnVuazEgeworICAgIHB1YmxpYyBib29sZWFuIG15Ym9vbDsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOworICAgICAgICAvLyAgICAgIEhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCisgICAgICAgIGlmIChteWJvb2wpIHsgICAvKiBIZXJlIGlzIGEgbXVsdGktbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGggZW1iZWRkZWQnICAgICAgJ3RhYikKKyAgICAgICAgICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsgICAgICAvLzwtdGFiLT4gICAgICAgPC0KKyAgICAgICAgfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKKyAgICAgICAgCisgICAgfSAvLyBlbmQgb2YgbWFpbiAoKQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rOC5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9KdW5rOC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjk3NDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms4LmphdmEKQEAgLTAsMCArMSwxMiBAQAorcHVibGljIGNsYXNzIEp1bmsxIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKKwlTeXN0ZW0ub3V0LnByaW50bG4oIkkgaGF2ZQlhIHRhYiIpOworCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiCisJaWYgKG15Ym9vbCkgewkvKiBIZXJlIGlzIGEgbXVsdGktbGluZQorCQkJICAgKHdpdGggZW1iZWRkZWQnCSd0YWIpCisJICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtCisJfSAvLyBlbmQgb2YgaWYgKG15Ym9vbCkKKwkKKyAgICB9IC8vIGVuZCBvZiBtYWluICgpCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms5LmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhOGU4NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvSnVuazkuamF2YQpAQCAtMCwwICsxLDEzIEBACitwdWJsaWMgY2xhc3MgSnVuazEgew0KKyAgICBwdWJsaWMgYm9vbGVhbiBteWJvb2w7DQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7DQorCVN5c3RlbS5vdXQucHJpbnRsbigiSSBoYXZlCWEgdGFiIik7DQorCS8vCUhlcmUgaXMgYSBjb21tZW50IHdpdGggYW4gZW1iZWRkZWQgdGFiDQorCWlmIChteWJvb2wpIHsJLyogSGVyZSBpcyBhIG11bHRpLWxpbmUNCisJCQkgICAod2l0aCBlbWJlZGRlZCcJJ3RhYikNCisJICAgIENvbW1lbnQgKi9jaGFyIG15Y2hhciA9ICcJJzsJLy88LXRhYi0+CTwtDQorCX0gLy8gZW5kIG9mIGlmIChteWJvb2wpDQorCQ0KKyAgICB9IC8vIGVuZCBvZiBtYWluICgpDQorfQ0KKxoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L01hYzJVbml4IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9NYWMyVW5peApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGE3YzVlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9NYWMyVW5peApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L2NyY3JsZiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvY3JjcmxmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTEwZjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L2NyY3JsZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L2ZpeGxhc3RmYWxzZS5sZiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvZml4bGFzdGZhbHNlLmxmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMGNhNmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L2ZpeGxhc3RmYWxzZS5sZgpAQCAtMCwwICsxLDIgQEAKKzEyMzQ1Cis2Nzg5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9pbnB1dC5jcmxmLnV0ZjE2IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9pbnB1dC5jcmxmLnV0ZjE2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYWQ1ODEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L2lucHV0LmNybGYudXRmMTYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZml4Y3JsZi9pbnB1dC9sb25nbGluZXMuY3JsZiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvbG9uZ2xpbmVzLmNybGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3OWQzNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvbG9uZ2xpbmVzLmNybGYKQEAgLTAsMCArMSwyIEBACitBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUENCithYmMNCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L3RhYl9pbl9saXRlcmFsX2luX2NvbW1lbnQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2lucHV0L3RhYl9pbl9saXRlcmFsX2luX2NvbW1lbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4NzhjMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvaW5wdXQvdGFiX2luX2xpdGVyYWxfaW5fY29tbWVudApAQCAtMCwwICsxLDIgQEAKKy8vICIJIgorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mb28ucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Zvby5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTgxNTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mb28ucHJvcGVydGllcwpAQCAtMCwwICsxLDE1IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitmb289Rm9vCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9nZXQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ2V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjk2MjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ2V0LnhtbApAQCAtMCwwICsxLDEwMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGdldC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxnZXQgc3JjPSIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPGdldCBzcmM9IiIgZGVzdD0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgIDxnZXQgc3JjPSIiIGRlc3Q9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KKyAgICA8Z2V0IHNyYz0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgZGVzdD0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDYiPgorICAgIDxnZXQgc3JjPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiBkZXN0PSJnZXQudG1wIi8+CisKKyAgICA8ZmlsZXNldCBpZD0idDYiIGZpbGU9ImdldC50bXAiIC8+CisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJ0NiIgcmVmaWQ9InQ2IiBzZXRvbmVtcHR5PSJmYWxzZSIgLz4KKworICAgIDxmYWlsIG1lc3NhZ2U9ImdldCBmYWlsZWQiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InQ2IiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VXNlVGltZXN0YW1wIiBkZXBlbmRzPSItOTBzLC10aW1lc3RhbXAiIC8+CisKKyAgPHRhcmdldCBuYW1lPSItOTBzIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ib2ZmIiB2YWx1ZT0iLTkwIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1bml0IiB2YWx1ZT0ic2Vjb25kIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RVc2VUb21vcnJvdyIgZGVwZW5kcz0iKzFkLC10aW1lc3RhbXAiIC8+CisKKyAgPHRhcmdldCBuYW1lPSIrMWQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJvZmYiIHZhbHVlPSIxIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1bml0IiB2YWx1ZT0iZGF5IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Ii10aW1lc3RhbXAiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXQiIHZhbHVlPSJ5eXl5TU1kZEhIbW0iIC8+CisKKyAgICA8dHN0YW1wPgorICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0iZHQiIHBhdHRlcm49IiR7cGF0fSIgb2Zmc2V0PSIke29mZn0iIHVuaXQ9IiR7dW5pdH0iIC8+CisgICAgPC90c3RhbXA+CisKKyAgICA8dG91Y2ggZmlsZT0iZ2V0LnRtcCIgZGF0ZXRpbWU9IiR7ZHR9IiBwYXR0ZXJuPSIke3BhdH0iIC8+CisKKyAgICA8Z2V0IHNyYz0iaHR0cDovL3d3dy53My5vcmcvTWFya1VwIiBkZXN0PSJnZXQudG1wIgorICAgICAgICAgdXNldGltZXN0YW1wPSJ0cnVlIiB2ZXJib3NlPSJ0cnVlIiAvPgorCisgICAgPGZpbGVzZXQgaWQ9InRzIiBmaWxlPSJnZXQudG1wIj4KKyAgICAgIDxkYXRlIHdoZW49ImVxdWFsIiBkYXRldGltZT0iJHtkdH0iIHBhdHRlcm49IiR7cGF0fSIgLz4KKyAgICA8L2ZpbGVzZXQ+CisKKyAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9InRzIiByZWZpZD0idHMiIHNldG9uZW1wdHk9ImZhbHNlIiAvPgorCisgICAgPGZhaWwgbWVzc2FnZT0iZ2V0IHcvIHRpbWVzdGFtcCBzaG91bGQgaGF2ZSBmYWlsZWQuIj4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ0cyIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZT4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9ImdldC50bXAiIC8+CisgICAgPC9kZWxldGU+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ndW56aXAueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ3VuemlwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTc1ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ3VuemlwLnhtbApAQCAtMCwwICsxLDU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ieHh4LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KKyAgICA8Z3VuemlwLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPGd1bnppcCBzcmM9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZmlsZT0iYXNmLWxvZ28uZ2lmIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RHemlwVGFzayI+CisgICAgPGFudCBhbnRmaWxlPSJnemlwLnhtbCIgdGFyZ2V0PSJyZWFsVGVzdCIgLz4KKyAgICA8Z3VuemlwIHNyYz0iYXNmLWxvZ28uZ2lmLmd6IiBkZXN0PSJhc2YtbG9nby5naWYiIC8+CisgICAgPGFudCBhbnRmaWxlPSJnemlwLnhtbCIgdGFyZ2V0PSJjbGVhbnVwIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlYWxUZXN0Ij4KKyAgICA8Z3VuemlwIHNyYz0iZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLmd6IiBkZXN0PSJhc2YtbG9nby5naWYiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVhbFRlc3RXaXRoUmVzb3VyY2UiPgorICAgIDxndW56aXAgZGVzdD0iYXNmLWxvZ28uZ2lmIj4KKyAgICAgIDxmaWxlIGZpbGU9ImV4cGVjdGVkL2FzZi1sb2dvLmdpZi5neiIvPgorICAgIDwvZ3VuemlwPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REb2N1bWVudGF0aW9uQ2xhaW1zT25Db3B5Ij4KKyAgICA8Y29weSB0b2Rpcj0iLiI+CisgICAgICA8Z3ppcHJlc291cmNlPgorICAgICAgICA8ZmlsZSBmaWxlPSJleHBlY3RlZC9hc2YtbG9nby5naWYuZ3oiLz4KKyAgICAgIDwvZ3ppcHJlc291cmNlPgorICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqLmd6IiB0bz0iKiIvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d6aXAueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ3ppcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjNDI2MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d6aXAueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJ4eHgtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxnemlwLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPGd6aXAgc3JjPSIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPGd6aXAgemlwZmlsZT0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgIDxnemlwIHNyYz0iZ3ppcC54bWwiIHppcGZpbGU9Ii4iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVhbFRlc3QiPgorICAgIDxnemlwIHNyYz0iLi4vYXNmLWxvZ28uZ2lmIiB6aXBmaWxlPSJhc2YtbG9nby5naWYuZ3oiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVhbFRlc3RXaXRoUmVzb3VyY2UiPgorICAgIDxnemlwIHppcGZpbGU9ImFzZi1sb2dvLmdpZi5neiI+CisgICAgICA8ZmlsZSBmaWxlPSIuLi9hc2YtbG9nby5naWYiLz4KKyAgICA8L2d6aXA+ICAgIAorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REYXRlQ2hlY2siPgorICAgIDx0b3VjaCBmaWxlPSJhc2YtbG9nby5naWYuZ3oiLz4KKyAgICA8Z3ppcCBzcmM9Ii4uL2FzZi1sb2dvLmdpZiIgemlwZmlsZT0iYXNmLWxvZ28uZ2lmLmd6IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZmlsZT0iYXNmLWxvZ28uZ2lmLmd6IiAvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2EueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2EueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGU3YTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvYS54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJBIj4KKyAgPHRhcmdldCBuYW1lPSJ4Ii8+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvYi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1Y2YwMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9iLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9IkIiPgorICAgPGltcG9ydCBmaWxlPSJhLnhtbCIvPgorICAgPHRhcmdldCBuYW1lPSJ4IiBkZXBlbmRzPSJBLngiLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9iYWQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2JhZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhMDY0NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9iYWQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3Q+Cis8PDwKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9jLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9jLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJmYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2MueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iQyI+CisgICA8aW1wb3J0IGZpbGU9ImEueG1sIi8+CisgICA8aW1wb3J0IGZpbGU9ImIueG1sIi8+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGQ4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0LnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9ImltcG9ydC10ZXN0IiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KKyAgPGVjaG8+QmVmb3JlIGltcG9ydDwvZWNobz4gICAgICAgIAorCisgIDxpbXBvcnQgZmlsZT0iaW1wb3J0ZWQueG1sIi8+CisKKyAgPGVjaG8gbWVzc2FnZT0iQWZ0ZXIgaW1wb3J0Ii8+CisgIAorICA8dGFyZ2V0IG5hbWU9ImltcG9ydC1pbml0Ij4KKyAgICAgPGVjaG8gbWVzc2FnZT0iSW4gaW1wb3J0LWluaXQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0iaW1wb3J0ZWQiPgorICAgIDxlY2hvIG1lc3NhZ2U9IkluIG1haW4iLz4KKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydF9iYWRfaW1wb3J0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnRfYmFkX2ltcG9ydC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmNTM2NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnRfYmFkX2ltcG9ydC54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgPGltcG9ydCBmaWxlPSJiYWQueG1sIi8+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0X3NhbWVfdGFyZ2V0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnRfc2FtZV90YXJnZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjE5MzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0X3NhbWVfdGFyZ2V0LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0PgorICA8dGFyZ2V0IG5hbWU9InQiLz4KKyAgPHRhcmdldCBuYW1lPSJ0Ii8+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0ZWQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWRmZGIwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydGVkLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9ImltcG9ydGVkLXRlc3QiIGRlZmF1bHQ9ImltcG9ydGVkIiBiYXNlZGlyPSIuIj4KKworICA8ZWNobyBtZXNzYWdlPSJJbiBpbXBvcnRlZCB0b3AiLz4KKyAKKyAgPHRhcmdldCBuYW1lPSJpbXBvcnRlZCIgZGVwZW5kcz0iaW1wb3J0LWluaXQiID4KKyAgICA8ZWNobyBtZXNzYWdlPSJJbiBpbXBvcnRlZCB0YXJnZXQiIC8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0dGFyZ2V0Zmlyc3QueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydHRhcmdldGZpcnN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzUxOTFiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydHRhcmdldGZpcnN0LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0PgorICA8ZWNobz5JbXBvcnRpbmcgdGFyZ2V0Zmlyc3Q8L2VjaG8+CisgIDxpbXBvcnQgZmlsZT0idGFyZ2V0Zmlyc3QueG1sIi8+CisgIDxlY2hvPkFmdGVyIGltcG9ydGluZzwvZWNobz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9yZWN1cnNpdmUtc2VsZmltcG9ydC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvcmVjdXJzaXZlLXNlbGZpbXBvcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTI4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvcmVjdXJzaXZlLXNlbGZpbXBvcnQueG1sCkBAIC0wLDAgKzEsNSBAQAorPHByb2plY3Q+CisgIDxlY2hvPkJlZm9yZSBpbXBvcnQ6ICR7Zm9vfTwvZWNobz4KKyAgPHByb3BlcnR5IG5hbWU9ImZvbyIgdmFsdWU9ImJhciIvPgorICA8aW1wb3J0IGZpbGU9Ii4vcmVjdXJzaXZlLXNlbGZpbXBvcnQueG1sIi8+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc2FtZV90YXJnZXQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3NhbWVfdGFyZ2V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTE0ZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3NhbWVfdGFyZ2V0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0PgorICA8aW1wb3J0IGZpbGU9ImltcG9ydF9zYW1lX3RhcmdldC54bWwiLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW5zZXF1ZW50aWFsLWlubmVyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW5zZXF1ZW50aWFsLWlubmVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzJhNjgxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnNlcXVlbnRpYWwtaW5uZXIueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3Q+CisgIDx0YXJnZXQgbmFtZT0id2l0aGluLWltcG9ydGVkIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iYmFyIi8+CisgICAgPHBhdGggaWQ9ImJheiI+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4iLz4KKyAgICA8L3BhdGg+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW5zZXF1ZW50aWFsLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW5zZXF1ZW50aWFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQ2OGIwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnNlcXVlbnRpYWwueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3Q+CisgIDxzZXF1ZW50aWFsPgorICAgIDxpbXBvcnQgZmlsZT0iaW1wb3J0aW5zZXF1ZW50aWFsLWlubmVyLnhtbCIvPgorICA8L3NlcXVlbnRpYWw+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGludGFyZ2V0LWlubmVyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW50YXJnZXQtaW5uZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTA4NmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGludGFyZ2V0LWlubmVyLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0PgorICA8cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iYmFyIi8+CisgIDxwYXRoIGlkPSJiYXoiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLiIvPgorICA8L3BhdGg+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnRhcmdldC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGludGFyZ2V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGZhMzcwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnRhcmdldC54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgPHRhcmdldCBuYW1lPSJkby1pbXBvcnQiPgorICAgIDxpbXBvcnQgZmlsZT0iaW1wb3J0aW50YXJnZXQtaW5uZXIueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm8taW1wb3J0Ii8+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL3NlcmlhbC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL3NlcmlhbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwZjlkMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvc2VyaWFsLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InNlcmlhbCI+CisgIDxpbXBvcnQgZmlsZT0iLi4vdW5uYW1lZDEueG1sIi8+CisgIDxpbXBvcnQgZmlsZT0iLi4vdW5uYW1lZDIueG1sIi8+Cis8L3Byb2plY3Q+CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zeW1saW5rcy9kMS9wMS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDEvcDEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjc5MmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDEvcDEueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0icDEiIGRlZmF1bHQ9InJ1biI+CisgICAgPGltcG9ydCBmaWxlPSIuLi9kMi9wMi54bWwiLz4KKyAgICA8aW1wb3J0IGZpbGU9Ii4uL2QzYi9wMy54bWwiLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zeW1saW5rcy9kMi9wMi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDIvcDIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTQ4YzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDIvcDIueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0icDIiLz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zeW1saW5rcy9kM2EvcDMueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QzYS9wMy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4NTg0NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zeW1saW5rcy9kM2EvcDMueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0icDMiLz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC90YXJnZXRmaXJzdC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvdGFyZ2V0Zmlyc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzFmYmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvdGFyZ2V0Zmlyc3QueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3Q+CisgIDx0YXJnZXQgbmFtZT0iZmlyc3QiLz4KKyAgPGVjaG8+QWZ0ZXIgdGFyZ2V0IGZpcnN0PC9lY2hvPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3VubmFtZWQxLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjN2ZkZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkMS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJ0ZXN0Ij4KKyAgPGltcG9ydCBmaWxlPSJ1bm5hbWVkMi54bWwiLz4KKworICA8ZWNobyBtZXNzYWdlPSJVbm5hbWVkMS54bWwiIGxldmVsPSJpbmZvIi8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3VubmFtZWQyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmZDdjNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkMi54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJ0ZXN0Ij4KKyAgPGVjaG8gbWVzc2FnZT0iVW5uYW1lZDIueG1sIiBsZXZlbD0iaW5mbyIvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkSW1wb3J0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkSW1wb3J0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2IzYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3VubmFtZWRJbXBvcnQueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0idW5uYW1lZC1pbXBvcnQiIGRlZmF1bHQ9InRlc3QiPgorCisgIDxpbXBvcnQgZmlsZT0idW5uYW1lZDEueG1sIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Ij4KKyAgICA8ZWNobyBsZXZlbD0iaW5mbyI+VGVzdHMgaW1wb3J0IG9mIHVubmFtZWQgcHJvamVjdHM8L2VjaG8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2luaXRpYWxpemVjbGFzcy54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbml0aWFsaXplY2xhc3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMDc5OTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbml0aWFsaXplY2xhc3MueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0iYWxsIj4KKyAgPHRhcmdldCBuYW1lPSJhbGwiLz4KKworICA8dGFyZ2V0IG5hbWU9ImZvcmtlZCI+CisgICAgPGphdmEgZm9yaz0idHJ1ZSIgb3V0cHV0PSJmb3JrZWRvdXQiIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZGlyMS5CIj4KKworICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YS5ob21lfS9saWIvY2xhc3Nlcy56aXAiIC8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idW5mb3JrZWQiPgorICAgIDxqYXZhIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZGlyMS5CIj4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phdmEuaG9tZX0vbGliL2NsYXNzZXMuemlwIiAvPgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2lucHV0LnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbnB1dC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDI1YTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbnB1dC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjUgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK1ByZXNzXCBSZXR1cm5cIGtleVwgdG9cIGNvbnRpbnVlLi4uPXRlc3QKK0FsbFwgZGF0YVwgaXNcIGdvaW5nXCB0b1wgYmVcIGRlbGV0ZWRcIGZyb21cIERCXCBjb250aW51ZT89dGVzdAorQWxsXCBkYXRhXCBpc1wgZ29pbmdcIHRvXCBiZVwgZGVsZXRlZFwgZnJvbVwgZGJcIGNvbnRpbnVlXCAoeS9uKT89eQorUGxlYXNlXCBlbnRlclwgZGItdXNlcm5hbWVcOj1zY290dAorIworIyBKREsgMS4xIGRvZXNuJ3Qgc2VlbSB0byBoYW5kbGUgYmxhbmtzIGluIHRoZSBwcm9wZXJ0eSBrZXkKKyMKK1ByZXNzX1JldHVybl9rZXlfdG9fY29udGludWUuLi49dGVzdAorQWxsX2RhdGFfaXNfZ29pbmdfdG9fYmVfZGVsZXRlZF9mcm9tX0RCX2NvbnRpbnVlPz10ZXN0CitBbGxfZGF0YV9pc19nb2luZ190b19iZV9kZWxldGVkX2Zyb21fZGJfY29udGludWVfKHkvbik/PXkKK1BsZWFzZV9lbnRlcl9kYl91c2VybmFtZT1zY290dApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW5wdXQuc3RkaW4gYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbnB1dC5zdGRpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmQxZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW5wdXQuc3RkaW4KQEAgLTAsMCArMSwyIEBACitmb28KK2JhcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW5wdXQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW5wdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDRiNzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbnB1dC54bWwKQEAgLTAsMCArMSwxMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJpbnB1dC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGlucHV0PlByZXNzIFJldHVybiBrZXkgdG8gY29udGludWUuLi48L2lucHV0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KKyAgICA8aW5wdXQgbWVzc2FnZT0iUHJlc3MgUmV0dXJuIGtleSB0byBjb250aW51ZS4uLiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPGlucHV0IG1lc3NhZ2U9IkFsbCBkYXRhIGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSBEQiBjb250aW51ZT8iCisgICAgICAgICAgIHZhbGlkYXJncz0ieSxuIgorICAgICAgICAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KKyAgICA8aW5wdXQgbWVzc2FnZT0iQWxsIGRhdGEgaXMgZ29pbmcgdG8gYmUgZGVsZXRlZCBmcm9tIGRiIGNvbnRpbnVlICh5L24pPyIKKyAgICAgICAgICAgdmFsaWRhcmdzPSJ5LG4iCisgICAgICAgICAgIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDYiPgorICAgIDxpbnB1dCBtZXNzYWdlPSJQbGVhc2UgZW50ZXIgZGItdXNlcm5hbWU6IgorICAgICAgICAgICBhZGRwcm9wZXJ0eT0iZGIudXNlciIKKyAgICAgICAgICAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UHJvcGVydHlGaWxlSW5saW5lSGFuZGxlciI+CisgICAgPGlucHV0IG1lc3NhZ2U9IlByZXNzIFJldHVybiBrZXkgdG8gY29udGludWUuLi4iIGFkZHByb3BlcnR5PSJ0ZXN0Ij4KKyAgICAgIDxoYW5kbGVyIHR5cGU9InByb3BlcnR5ZmlsZSIgLz4KKyAgICA8L2lucHV0PgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7dGVzdH0iIGFyZzI9InRlc3QiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REZWZhdWx0SW5saW5lSGFuZGxlciI+CisgICAgPGlucHV0IG1lc3NhZ2U9IlByZXNzIFJldHVybiBrZXkgdG8gY29udGludWUuLi4iIGFkZHByb3BlcnR5PSJ0ZXN0Ij4KKyAgICAgIDxoYW5kbGVyIHR5cGU9ImRlZmF1bHQiIC8+CisgICAgPC9pbnB1dD4KKyAgICA8ZmFpbCBtZXNzYWdlPSIkJHt0ZXN0fSA9ICR7dGVzdH0iPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7dGVzdH0iIGFyZzI9ImZvbyIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEdyZWVkeUlubGluZUhhbmRsZXIiPgorICAgIDxpbnB1dCBtZXNzYWdlPSJQcmVzcyBSZXR1cm4ga2V5IHRvIGNvbnRpbnVlLi4uIiBhZGRwcm9wZXJ0eT0idGVzdCI+CisgICAgICA8aGFuZGxlciB0eXBlPSJncmVlZHkiIC8+CisgICAgPC9pbnB1dD4KKyAgICA8bG9hZGZpbGUgc3JjRmlsZT0iaW5wdXQuc3RkaW4iIHByb3BlcnR5PSJpbnB1dCIgLz4KKyAgICA8ZmFpbCBtZXNzYWdlPSIkJHt0ZXN0fSA9ICR7dGVzdH0iPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7dGVzdH0iIGFyZzI9IiR7aW5wdXR9IiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0R3JlZWR5SW5saW5lSGFuZGxlckNsYXNzbmFtZSI+CisgICAgPGlucHV0IG1lc3NhZ2U9IlByZXNzIFJldHVybiBrZXkgdG8gY29udGludWUuLi4iIGFkZHByb3BlcnR5PSJ0ZXN0Ij4KKyAgICAgIDxoYW5kbGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuR3JlZWR5SW5wdXRIYW5kbGVyIiAvPgorICAgIDwvaW5wdXQ+CisgICAgPGxvYWRmaWxlIHNyY0ZpbGU9ImlucHV0LnN0ZGluIiBwcm9wZXJ0eT0iaW5wdXQiIC8+CisgICAgPGZhaWwgbWVzc2FnZT0iJCR7dGVzdH0gPSAke3Rlc3R9Ij4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3Rlc3R9IiBhcmcyPSIke2lucHV0fSIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEdyZWVkeUlubGluZUhhbmRsZXJSZWZpZCI+CisgICAgPHR5cGVkZWYgbmFtZT0iZ3JlZWR5IgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuR3JlZWR5SW5wdXRIYW5kbGVyIiAvPgorICAgIDxncmVlZHkgaWQ9ImdyZWVkeSIgLz4KKworICAgIDxpbnB1dCBtZXNzYWdlPSJQcmVzcyBSZXR1cm4ga2V5IHRvIGNvbnRpbnVlLi4uIiBhZGRwcm9wZXJ0eT0idGVzdCI+CisgICAgICA8aGFuZGxlciByZWZpZD0iZ3JlZWR5IiAvPgorICAgIDwvaW5wdXQ+CisgICAgPGxvYWRmaWxlIHNyY0ZpbGU9ImlucHV0LnN0ZGluIiBwcm9wZXJ0eT0iaW5wdXQiIC8+CisgICAgPGZhaWwgbWVzc2FnZT0iJCR7dGVzdH0gPSAke3Rlc3R9Ij4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3Rlc3R9IiBhcmcyPSIke2lucHV0fSIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg1OGIyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamFyLnhtbApAQCAtMCwwICsxLDI4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Imphci10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHByb3BlcnR5IG5hbWU9InRtcC5qYXIiIGxvY2F0aW9uPSJ0bXAuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0bXAuZGlyIiBsb2NhdGlvbj0iamFydG1wIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0bXAuemlwIiBsb2NhdGlvbj0idG1wLnppcCIvPgorICA8cHJvcGVydHkgbmFtZT0idG1wMS5kaXIiIGxvY2F0aW9uPSJqYXJ0bXAxIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0bXAyLmRpciIgbG9jYXRpb249ImphcnRtcDIiLz4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KKyAgICA8amFyLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPGphcgorICAgIAlqYXJmaWxlPSJqYXIudG1wIgorICAgIAltYW5pZmVzdD0ibm9uZSIKKyAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8amFyCisgICAgCWRlc3RmaWxlPSJqYXIudG1wIgorCXdoZW5lbXB0eT0iZm9ybWF0IEM6IC95IiAKKyAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KKyAgIDxqYXIKKyAgICAJZGVzdGZpbGU9IiR7dG1wLmphcn0iCisJYmFzZWRpcj0iLiIKKwlpbmNsdWRlcz0iamFyLnhtbCIKKyAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb1JlY3JlYXRlV2l0aFVwZGF0ZSI+CisgICAgPGphcgorICAgICAgICAgZGVzdGZpbGU9IiR7dG1wLmphcn0iCisgICAgICAgICBiYXNlZGlyPSIuIgorICAgICAgICAgaW5jbHVkZXM9Imphci54bWwiCisgICAgICAgICB1cGRhdGU9InRydWUiCisgICAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVjcmVhdGVOZXdlckZpbGVTZXR1cCIgZGVwZW5kcz0idGVzdDQiPgorICAgIDx0b3VjaCBmaWxlPSJqYXIueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlY3JlYXRlV2l0aG91dFVwZGF0ZUFkZGl0aW9uYWxGaWxlcyI+CisgICAgPGphcgorICAgICAgICAgZGVzdGZpbGU9IiR7dG1wLmphcn0iCisgICAgICAgICBpbmNsdWRlcz0iKi54bWwiCisgICAgICAgICBiYXNlZGlyPSIuIgorICAgIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlY3JlYXRlV2l0aFVwZGF0ZUFkZGl0aW9uYWxGaWxlcyI+CisgICAgPGphcgorICAgICAgICAgZGVzdGZpbGU9IiR7dG1wLmphcn0iCisgICAgICAgICBiYXNlZGlyPSIuIgorICAgICAgICAgaW5jbHVkZXM9IioueG1sIgorICAgICAgICAgdXBkYXRlPSJ0cnVlIgorICAgIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlY3JlYXRlV2l0aG91dFVwZGF0ZU5ld2VyRmlsZSI+CisgICAgPGphcgorICAgICAgICAgZGVzdGZpbGU9IiR7dG1wLmphcn0iCisgICAgICAgICBiYXNlZGlyPSIuIgorICAgICAgICAgaW5jbHVkZXM9Imphci54bWwiCisgICAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVjcmVhdGVXaXRoVXBkYXRlTmV3ZXJGaWxlIj4KKyAgICA8amFyCisgICAgICAgICBkZXN0ZmlsZT0iJHt0bXAuamFyfSIKKyAgICAgICAgIGJhc2VkaXI9Ii4iCisgICAgICAgICBpbmNsdWRlcz0iamFyLnhtbCIKKyAgICAgICAgIHVwZGF0ZT0idHJ1ZSIKKyAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RNYW5pZmVzdFN0YXlzSW50YWN0Ij4KKyAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9Ii8+CisgICAgPG1hbmlmZXN0IGZpbGU9IiR7dG1wLmRpcn0vbWFuaWZlc3QiPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJGb28iIHZhbHVlPSJiYXIiLz4KKyAgICA8L21hbmlmZXN0PgorICAgIDxqYXIgZGVzdGZpbGU9IiR7dG1wLmphcn0iIGJhc2VkaXI9Ii4iIGluY2x1ZGVzPSJqYXIueG1sIgorICAgICAgICAgbWFuaWZlc3Q9IiR7dG1wLmRpcn0vbWFuaWZlc3QiLz4KKyAgICA8c2xlZXAgc2Vjb25kcz0iMyIvPgorICAgIDx0b3VjaCBmaWxlPSJqYXIueG1sIi8+CisgICAgPGphciBkZXN0ZmlsZT0iJHt0bXAuamFyfSIgYmFzZWRpcj0iLiIgaW5jbHVkZXM9Imphci54bWwiCisgICAgICAgICB1cGRhdGU9InRydWUiLz4KKyAgICA8dW5qYXIgc3JjPSIke3RtcC5qYXJ9IiBkZXN0PSIke3RtcC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PiAgICAKKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb1JlY3JlYXRlQmFzZWRpckV4Y2x1ZGVzV2l0aFVwZGF0ZSI+CisgICAgPGphcgorICAgICAgICAgZGVzdGZpbGU9IiR7dG1wLmphcn0iCisgICAgICAgICBiYXNlZGlyPSIuIgorICAgICAgICAgaW5jbHVkZXM9ImoqLnhtbCIKKyAgICAgICAgIGV4Y2x1ZGVzPSJqYXZhLnhtbCIKKyAgICAgICAgIHVwZGF0ZT0idHJ1ZSIKKyAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb1JlY3JlYXRlQmFzZWRpckV4Y2x1ZGVzV2l0aG91dFVwZGF0ZSI+CisgICAgPGphcgorICAgICAgICAgZGVzdGZpbGU9IiR7dG1wLmphcn0iCisgICAgICAgICBiYXNlZGlyPSIuIgorICAgICAgICAgaW5jbHVkZXM9ImoqLnhtbCIKKyAgICAgICAgIGV4Y2x1ZGVzPSJqYXZhLnhtbCIKKyAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1ha2V6aXAiPgorICAgIDx6aXAgZGVzdGZpbGU9IiR7dG1wLnppcH0iCisgICAgICAgICBiYXNlZGlyPSIuIiBpbmNsdWRlcz0iaioueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vUmVjcmVhdGVaaXBmaWxlc2V0RXhjbHVkZXNXaXRoVXBkYXRlIgorICAgICAgICAgIGRlcGVuZHM9Im1ha2V6aXAiPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7dG1wLmphcn0iCisgICAgICAgICB1cGRhdGU9InRydWUiPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3RtcC56aXB9IiBleGNsdWRlcz0iamF2YS54bWwiLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9SZWNyZWF0ZVppcGZpbGVzZXRFeGNsdWRlc1dpdGhvdXRVcGRhdGUiCisgICAgICAgICAgZGVwZW5kcz0ibWFrZXppcCI+CisgICAgPGphciBkZXN0ZmlsZT0iJHt0bXAuamFyfSI+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7dG1wLnppcH0iIGV4Y2x1ZGVzPSJqYXZhLnhtbCIvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZWNyZWF0ZVppcGZpbGVzZXRXaXRob3V0VXBkYXRlQWRkaXRpb25hbEZpbGVzIgorICAgICAgICAgIGRlcGVuZHM9Im1ha2V6aXAiPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7dG1wLmphcn0iPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3RtcC56aXB9Ii8+CisgICAgPC9qYXI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlY3JlYXRlWmlwZmlsZXNldFdpdGhVcGRhdGVBZGRpdGlvbmFsRmlsZXMiCisgICAgICAgICAgZGVwZW5kcz0ibWFrZXppcCI+CisgICAgPGphciBkZXN0ZmlsZT0iJHt0bXAuamFyfSIKKyAgICAgICAgIHVwZGF0ZT0idHJ1ZSI+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7dG1wLnppcH0iLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVjcmVhdGVaaXBmaWxlc2V0V2l0aG91dFVwZGF0ZU5ld2VyRmlsZSIKKyAgICAgICAgICBkZXBlbmRzPSJtYWtlemlwIj4KKyAgICA8amFyIGRlc3RmaWxlPSIke3RtcC5qYXJ9Ij4KKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHt0bXAuemlwfSIgaW5jbHVkZXM9Imphci54bWwiLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVjcmVhdGVaaXBmaWxlc2V0V2l0aFVwZGF0ZU5ld2VyRmlsZSIKKyAgICAgICAgICBkZXBlbmRzPSJtYWtlemlwIj4KKyAgICA8amFyIGRlc3RmaWxlPSIke3RtcC5qYXJ9IgorICAgICAgICAgdXBkYXRlPSJ0cnVlIj4KKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHt0bXAuemlwfSIgaW5jbHVkZXM9Imphci54bWwiLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7dG1wLmphcn0iIC8+CisgICAgPGRlbGV0ZSBmaWxlPSIke3RtcC5qYXJ9MiIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0bXAuZGlyfSIvPgorICAgIDxkZWxldGUgZmlsZT0iJHt0bXAuemlwfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0bXAxLmRpcn0iLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0bXAyLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q3JlYXRlV2l0aEVtcHR5RmlsZXNldFNldFVwIj4KKyAgICA8bWtkaXIgZGlyPSIke3RtcDEuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7dG1wMi5kaXJ9Ii8+CisgICAgPGVjaG8gZmlsZT0iJHt0bXAyLmRpcn0vZm9vLnR4dCIgbWVzc2FnZT0iZm9vIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENyZWF0ZVdpdGhFbXB0eUZpbGVzZXQiPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7dG1wLmphcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RtcDEuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZG9lc05vdEV4aXN0Ii8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wMi5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovZm9vLnR4dCIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8IS0tIGJ1ZyAxNzc4MCAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VXBkYXRlSWZPbmx5TWFuaWZlc3RIYXNDaGFuZ2VkIgorICAgICAgICAgIGRlcGVuZHM9InRlc3Q0Ij4KKyAgICA8amFyIGRlc3RmaWxlPSIke3RtcC5qYXJ9IiB1cGRhdGU9InRydWUiPgorICAgICAgPG1hbmlmZXN0PgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkZvbyIgdmFsdWU9ImJhciIvPgorICAgICAgPC9tYW5pZmVzdD4KKyAgICA8L2phcj4KKyAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9Ii8+CisgICAgPHVuemlwIHNyYz0iJHt0bXAuamFyfSIgZGVzdD0iJHt0bXAuZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8IS0tIGJ1Z3MgMTAyNjIgYW5kIDE2OTcyIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RJbmRleFRlc3RzIj4KKyAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9L01FVEEtSU5GIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7dG1wLmRpcn0vTUVUQS1JTkYvSU5ERVguTElTVCIvPgorICAgIDx0b3VjaCBmaWxlPSIke3RtcC5kaXJ9L2ZvbyIvPgorICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0vc3ViIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7dG1wLmRpcn0vc3ViL2ZvbyIvPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7dG1wLmphcn0iIGluZGV4PSJ5ZXMiIGJhc2VkaXI9IiR7dG1wLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisgICAgPCEtLSBidWcgMzI4MDIgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdE1hbmlmZXN0T25seUphciI+CisgICAgPG1rZGlyIGRpcj0iJHt0bXAuZGlyfSIvPiAgCisgICAgPGphciBkZXN0ZmlsZT0iJHt0bXAuamFyfSIgZHVwbGljYXRlPSJwcmVzZXJ2ZSI+CisgICAgICA8bWFuaWZlc3Q+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iRm9vIiB2YWx1ZT0iYmFyIi8+CisgICAgICA8L21hbmlmZXN0PgorICAgIDwvamFyPgorICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0iLz4KKyAgICA8dW56aXAgc3JjPSIke3RtcC5qYXJ9IiBkZXN0PSIke3RtcC5kaXJ9Ii8+CisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBidWcgMzcyMzcgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdEluZGV4SmFyc1BsdXNKYXJNYXJrZXIiPgorICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0vYS9iL2MiLz4KKyAgICA8amFyIGRlc3RmaWxlPSIke3RtcC5qYXJ9IiBiYXNlZGlyPSIke3RtcC5kaXJ9Ii8+CisgICAgPGRlbGV0ZSBkaXI9IiR7dG1wLmRpcn0vYSIgcXVpZXQ9InRydWUiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9L2QvZS9mIi8+CisgICAgPGphciBkZXN0ZmlsZT0iJHt0bXAuamFyfTIiIGJhc2VkaXI9IiR7dG1wLmRpcn0iIGluZGV4PSJ0cnVlIj4KKyAgICAgIDxpbmRleGphcnM+CisgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dG1wLmphcn0iLz4KKyAgICAgIDwvaW5kZXhqYXJzPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKyAgICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9WZXJzaW9uSW5mb05vU3RyaWN0Ij4KKyAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9Ii8+CisgICAgPGphciBkZXN0ZmlsZT0iJHt0bXAuamFyfSIgYmFzZWRpcj0iJHt0bXAuZGlyfSIvPgorICA8L3RhcmdldD4gIAorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vVmVyc2lvbkluZm9GYWlsIj4KKyAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9Ii8+CisgICAgPGphciBkZXN0ZmlsZT0iJHt0bXAuamFyfSIgYmFzZWRpcj0iJHt0bXAuZGlyfSIgc3RyaWN0PSJmYWlsIi8+CisgIDwvdGFyZ2V0PiAgCisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9WZXJzaW9uSW5mb0lnbm9yZSI+CisgICAgPG1rZGlyIGRpcj0iJHt0bXAuZGlyfSIvPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7dG1wLmphcn0iIGJhc2VkaXI9IiR7dG1wLmRpcn0iIHN0cmljdD0iaWdub3JlIi8+CisgIDwvdGFyZ2V0PiAgCisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9WZXJzaW9uSW5mb1dhcm4iPgorICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0iLz4KKyAgICA8amFyIGRlc3RmaWxlPSIke3RtcC5qYXJ9IiBiYXNlZGlyPSIke3RtcC5kaXJ9IiBzdHJpY3Q9Indhcm4iLz4KKyAgPC90YXJnZXQ+ICAKKyAgICAKKyAgPCEtLSBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL3ZlcnNpb25pbmcvc3BlYy9WZXJzaW9uaW5nU3BlY2lmaWNhdGlvbi5odG1sI1BhY2thZ2VWZXJzaW9uaW5nIC0tPiAgCisgIDx0YXJnZXQgbmFtZT0idGVzdEhhc1ZlcnNpb25JbmZvIj4KKyAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9Ii8+CisgICAgPGphciBkZXN0ZmlsZT0iJHt0bXAuamFyfSIgYmFzZWRpcj0iJHt0bXAuZGlyfSIgc3RyaWN0PSJmYWlsIj4KKyAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1UaXRsZSIgICB2YWx1ZT0iUGFja2FnaW5nIFZlcnNpb24gVGVzdCIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iIHZhbHVlPSIxLjAiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1WZW5kb3IiICB2YWx1ZT0iQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iLz4KKyAgICAgIDwvbWFuaWZlc3Q+CisgICAgPC9qYXI+CisgIDwvdGFyZ2V0PiAgCisKKyAgICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phdmEueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamF2YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2NWMxMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phdmEueG1sCkBAIC0wLDAgKzEsMzk3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0iamF2YS10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJmb28iPgorICA8ZmFpbCB1bmxlc3M9InRlc3RzLWNsYXNzcGF0aC52YWx1ZSIKKyAgICAgIG1lc3NhZ2U9InRoZSBwcm9wZXJ0eSB0ZXN0cy1jbGFzc3BhdGgudmFsdWUgaXMgcmVxdWlyZWQgYnkgdGhpcyB0ZXN0IiAvPgorICA8IS0tIHRoaXMgcHJvcGVydHkgZ2V0cyBvdmVycmlkZGVuIHByb2dyYW1tYXRpY2FsbHktLT4KKyAgPHByb3BlcnR5IG5hbWU9InRpbWVUb1dhaXQiIHZhbHVlPSI0Ii8+CisgIDwhLS0gdGhpcyBwcm9wZXJ0eSBnZXRzIG92ZXJyaWRkZW4gcHJvZ3JhbW1hdGljYWxseS0tPgorICA8cHJvcGVydHkgbmFtZT0ibG9nRmlsZSIgdmFsdWU9InNwYXduLmxvZyIvPgorICA8cHJvcGVydHkgbmFtZT0idG1wIiBsb2NhdGlvbj0iJHtqYXZhLmlvLnRtcGRpcn0iLz4KKyAgPHByb3BlcnR5IG5hbWU9ImFwcCIKKyAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YVRlc3QkJEVudHJ5UG9pbnQiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImFwcDIiCisgICAgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFUZXN0JCRFeGNlcHRpbmdFbnRyeVBvaW50IiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJzcGF3bmFwcCIKKyAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YVRlc3QkJFNwYXduRW50cnlQb2ludCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0icGlwZWFwcCIKKyAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YVRlc3QkJFBpcGVFbnRyeVBvaW50IiAvPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vSmFyTm9DbGFzc25hbWUiPgorICAgIDxqYXZhLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SmFyTm9Gb3JrIj4KKyAgICA8amF2YSBqYXI9InRlc3QuamFyIiBmb3JrPSJmYWxzZSIvPgorICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0idGVzdEphckFuZENsYXNzTmFtZSI+CisgICAgPGphdmEgamFyPSJ0ZXN0LmphciIgY2xhc3NuYW1lPSIke2FwcH0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENsYXNzbmFtZUFuZEphciI+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke2FwcH0iIGphcj0idGVzdC5qYXIiICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSdW4iPgorICAgIDxmYWlsIHVubGVzcz0idGVzdHMtY2xhc3NwYXRoLnZhbHVlIiAvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHthcHB9IgorICAgICAgY2xhc3NwYXRoPSIke3Rlc3RzLWNsYXNzcGF0aC52YWx1ZX0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UnVuRmFpbCI+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke2FwcH0iCisgICAgICBjbGFzc3BhdGg9IiR7dGVzdHMtY2xhc3NwYXRoLnZhbHVlfSIKKyAgICAgID4KKyAgICAgIDxhcmcgdmFsdWU9IjIiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJ1bkZhaWxGb2UiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHthcHB9IgorICAgICAgY2xhc3NwYXRoPSIke3Rlc3RzLWNsYXNzcGF0aC52YWx1ZX0iCisgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIHZhbHVlPSIyIi8+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSdW5GYWlsRm9lRm9yayI+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke2FwcH0iCisgICAgICAgIGNsYXNzcGF0aD0iJHt0ZXN0cy1jbGFzc3BhdGgudmFsdWV9IgorICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSIKKyAgICAgICAgZm9yaz0idHJ1ZSI+CisgICAgICAgIDxhcmcgdmFsdWU9IjIiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEV4Y2VwdGluZyI+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke2FwcDJ9IgorICAgICAgICBjbGFzc3BhdGg9IiR7dGVzdHMtY2xhc3NwYXRoLnZhbHVlfSIKKyAgICAgICAgPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RXhjZXB0aW5nRm9yayI+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke2FwcDJ9IgorICAgICAgICAgIGNsYXNzcGF0aD0iJHt0ZXN0cy1jbGFzc3BhdGgudmFsdWV9IgorICAgICAgICAgIGZvcms9InRydWUiPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RXhjZXB0aW5nRm9lIj4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7YXBwMn0iCisgICAgICAgIGNsYXNzcGF0aD0iJHt0ZXN0cy1jbGFzc3BhdGgudmFsdWV9IgorICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFeGNlcHRpbmdGb2VGb3JrIj4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7YXBwMn0iCisgICAgICAgIGNsYXNzcGF0aD0iJHt0ZXN0cy1jbGFzc3BhdGgudmFsdWV9IgorICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSIKKyAgICAgICAgZm9yaz0idHJ1ZSI+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZXN1bHRQcm9wZXJ0eVplcm8iPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHthcHB9IgorICAgICAgICBjbGFzc3BhdGg9IiR7dGVzdHMtY2xhc3NwYXRoLnZhbHVlfSIKKyAgICAgICAgcmVzdWx0cHJvcGVydHk9ImV4aXRjb2RlIgorICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICA+CisgICAgPC9qYXZhPgorICAgIDxlY2hvIG1lc3NhZ2U9ImV4aXRjb2RlID0gJHtleGl0Y29kZX0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVzdWx0UHJvcGVydHlOb25aZXJvIj4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7YXBwfSIKKyAgICAgICAgY2xhc3NwYXRoPSIke3Rlc3RzLWNsYXNzcGF0aC52YWx1ZX0iCisgICAgICAgIHJlc3VsdHByb3BlcnR5PSJleGl0Y29kZSIKKyAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIgorICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICA+CisgICAgICAgIDxhcmcgdmFsdWU9IjIiLz4KKyAgICA8L2phdmE+CisgICAgPGVjaG8gbWVzc2FnZT0iZXhpdGNvZGUgPSAke2V4aXRjb2RlfSIvPgorICA8L3RhcmdldD4KKworICAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVzdWx0UHJvcGVydHlaZXJvTm9Gb3JrIj4KKyAgICAgPGphdmEgY2xhc3NuYW1lPSIke2FwcH0iCisgICAgICAgICBjbGFzc3BhdGg9IiR7dGVzdHMtY2xhc3NwYXRoLnZhbHVlfSIKKyAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJleGl0Y29kZSIKKyAgICAgICAgIGZvcms9ImZhbHNlIgorICAgICAgICAgPgorICAgICAgICAgPHBlcm1pc3Npb25zLz4KKyAgICAgPC9qYXZhPgorICAgICA8ZWNobyBtZXNzYWdlPSJleGl0Y29kZSA9ICR7ZXhpdGNvZGV9Ii8+CisgICA8L3RhcmdldD4KKyAKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RSZXN1bHRQcm9wZXJ0eU5vblplcm9Ob0ZvcmsiPgorICAgICAgICA8amF2YSBjbGFzc25hbWU9IiR7YXBwfSIKKyAgICAgICAgICAgICAgY2xhc3NwYXRoPSIke3Rlc3RzLWNsYXNzcGF0aC52YWx1ZX0iCisgICAgICAgICAgICAgIHJlc3VsdHByb3BlcnR5PSJleGl0Y29kZSIKKyAgICAgICAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIgorICAgICAgICAgICAgICBmb3JrPSJmYWxzZSI+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSItMSIvPgorICAgICAgICAgICAgPHBlcm1pc3Npb25zLz4KKyAgICAgICAgPC9qYXZhPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJleGl0Y29kZSA9ICR7ZXhpdGNvZGV9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RSdW5GYWlsV2l0aEZhaWxPbkVycm9yIj4KKyAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHthcHB9IgorICAgICAgICBjbGFzc3BhdGg9IiR7dGVzdHMtY2xhc3NwYXRoLnZhbHVlfSIKKyAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICAgID4KKyAgICAgICAgPGFyZyB2YWx1ZT0iMiIvPgorICAgICAgPC9qYXZhPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0UnVuU3VjY2Vzc1dpdGhGYWlsT25FcnJvciI+CisgICAgICA8amF2YSBjbGFzc25hbWU9IiR7YXBwfSIKKyAgICAgICAgY2xhc3NwYXRoPSIke3Rlc3RzLWNsYXNzcGF0aC52YWx1ZX0iCisgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgICA+CisgICAgICAgIDxhcmcgdmFsdWU9IjAiLz4KKyAgICAgIDwvamF2YT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdFNwYXduIj4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NwYXduYXBwfSIgZm9yaz0idHJ1ZSIgc3Bhd249InRydWUiIGNsYXNzcGF0aD0iJHt0ZXN0cy1jbGFzc3BhdGgudmFsdWV9Ij4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7dGltZVRvV2FpdH0iLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7bG9nRmlsZX0iIC8+CisgICAgICAgIDwvamF2YT4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS1yZWRpcmVjdGlvbiB0ZXN0Y2FzZXMgZG9uJ3Qgd2FudCB0byBydW4gdW5kZXIganVuaXQgdW5sZXNzIGZvcmtlZC0tPgorICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3QxIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGZpbGUiIGxvY2F0aW9uPSIke3RtcH0vcmVkaXJlY3Qub3V0IiAvPgorCisgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtwaXBlYXBwfSIKKyAgICAgICAgICAgICAgY2xhc3NwYXRoPSIke3Rlc3RzLWNsYXNzcGF0aC52YWx1ZX0iCisgICAgICAgICAgICAgIGlucHV0c3RyaW5nPSJmb28iCisgICAgICAgICAgICAgIGZvcms9InRydWUiCisgICAgICAgICAgICAgIG91dHB1dD0iJHtvdXRmaWxlfSIKKyAgICAgICAgICAgICAgZXJyb3Jwcm9wZXJ0eT0icmVkaXJlY3QuZXJyIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Im91dCIgLz4KKyAgICAgICAgPC9qYXZhPgorCisgICAgICAgIDwhLS0gbGV0IGR1bWIgV2luZG93cyBjYXRjaCB1cCAtLT4KKyAgICAgICAgPHdhaXRmb3IgbWF4d2FpdD0iMzAwMDAiPgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke291dGZpbGV9IiAvPgorICAgICAgICA8L3dhaXRmb3I+CisgICAgICAgIDx3YWl0Zm9yIG1heHdhaXQ9IjMwMDAwIj4KKyAgICAgICAgICAgIDxsZW5ndGggZmlsZT0iJHtvdXRmaWxlfSIgbGVuZ3RoPSIxIiB3aGVuPSJncmVhdGVyIiAvPgorICAgICAgICA8L3dhaXRmb3I+CisKKyAgICAgICAgPGxvYWRmaWxlIHByb3BlcnR5PSJyZWRpcmVjdC5vdXQuY29udGVudHMiIHNyY2ZpbGU9IiR7b3V0ZmlsZX0iIC8+CisKKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0icjFmaWxlIj4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtyZWRpcmVjdC5vdXQuY29udGVudHN9IiBhcmcyPSJmb28iIC8+CisgICAgICAgIDwvY29uZGl0aW9uPgorCisgICAgICAgIDxmYWlsIHVubGVzcz0icjFmaWxlIj4ke291dGZpbGV9OgorJnF1b3Q7JHtyZWRpcmVjdC5vdXQuY29udGVudHN9JnF1b3Q7IGV4cGVjdGVkICZxdW90O2ZvbyZxdW90OzwvZmFpbD4KKworICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJyMXByb3AiPgorICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3JlZGlyZWN0LmVycn0iIGFyZzI9IiIgLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisKKyAgICAgICAgPGZhaWwgdW5sZXNzPSJyMXByb3AiPgorcmVkaXJlY3QuZXJyPSZxdW90OyR7cmVkaXJlY3QuZXJyfSZxdW90OyBzaG91bGQgYmUgZW1wdHk8L2ZhaWw+CisKKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3QyIiBkZXBlbmRzPSJyZWRpcmVjdDEiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0ZmlsZSIgbG9jYXRpb249IiR7dG1wfS9yZWRpcmVjdC5vdXQiIC8+CisKKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3BpcGVhcHB9IgorICAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7dGVzdHMtY2xhc3NwYXRoLnZhbHVlfSIKKyAgICAgICAgICAgICAgaW5wdXRzdHJpbmc9ImJhciIKKyAgICAgICAgICAgICAgYXBwZW5kPSJ0cnVlIgorICAgICAgICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICAgICAgICBvdXRwdXQ9IiR7b3V0ZmlsZX0iCisgICAgICAgICAgICAgIGVycm9ycHJvcGVydHk9InJlZGlyZWN0LmVyciI+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJib3RoIiAvPgorICAgICAgICA8L2phdmE+CisKKyAgICAgICAgPCEtLSBsZXQgZHVtYiBXaW5kb3dzIGNhdGNoIHVwIC0tPgorICAgICAgICA8d2FpdGZvciBtYXh3YWl0PSIzMDAwMCI+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7b3V0ZmlsZX0iIC8+CisgICAgICAgIDwvd2FpdGZvcj4KKyAgICAgICAgPHdhaXRmb3IgbWF4d2FpdD0iMzAwMDAiPgorICAgICAgICAgICAgPGxlbmd0aCBmaWxlPSIke291dGZpbGV9IiBsZW5ndGg9IjEiIHdoZW49ImdyZWF0ZXIiIC8+CisgICAgICAgIDwvd2FpdGZvcj4KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA8bG9hZGZpbGUgcHJvcGVydHk9InJlZGlyZWN0Lm91dC5jb250ZW50czIiIHNyY2ZpbGU9IiR7b3V0ZmlsZX0iIC8+CisKKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0icjJmaWxlIj4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtyZWRpcmVjdC5vdXQuY29udGVudHMyfSIgYXJnMj0iZm9vYmFyIiAvPgorICAgICAgICA8L2NvbmRpdGlvbj4KKworICAgICAgICA8ZmFpbCB1bmxlc3M9InIyZmlsZSI+JHtvdXRmaWxlfToKKyZxdW90OyR7cmVkaXJlY3Qub3V0LmNvbnRlbnRzMn0mcXVvdDsgZXhwZWN0ZWQgJnF1b3Q7Zm9vYmFyJnF1b3Q7PC9mYWlsPgorCisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InIycHJvcCI+CisgICAgICAgICAgICA8IS0tIHByb3BlcnR5IHNob3VsZCBub3QgY2hhbmdlIC0tPgorICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3JlZGlyZWN0LmVycn0iIGFyZzI9IiIgLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisKKyAgICAgICAgPGZhaWwgdW5sZXNzPSJyMnByb3AiPgorcmVkaXJlY3QuZXJyPSZxdW90OyR7cmVkaXJlY3QuZXJyfSZxdW90OyBzaG91bGQgYmUgZW1wdHk8L2ZhaWw+CisKKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3QzIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGZpbGUiIGxvY2F0aW9uPSIke3RtcH0vcmVkaXJlY3Qub3V0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZXJyZmlsZSIgbG9jYXRpb249IiR7dG1wfS9yZWRpcmVjdC5lcnIiIC8+CisKKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3BpcGVhcHB9IgorICAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7dGVzdHMtY2xhc3NwYXRoLnZhbHVlfSIKKyAgICAgICAgICAgICAgaW5wdXRzdHJpbmc9ImZvbyIKKyAgICAgICAgICAgICAgZm9yaz0idHJ1ZSIKKyAgICAgICAgICAgICAgb3V0cHV0PSIke291dGZpbGV9IgorICAgICAgICAgICAgICBlcnJvcj0iJHtlcnJmaWxlfSI+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJib3RoIiAvPgorICAgICAgICA8L2phdmE+CisKKyAgICAgICAgPCEtLSBsZXQgZHVtYiBXaW5kb3dzIGNhdGNoIHVwIC0tPgorICAgICAgICA8d2FpdGZvcj4KKyAgICAgICAgICAgIDxhbmQ+CisgICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke291dGZpbGV9IiAvPgorICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtlcnJmaWxlfSIgLz4KKyAgICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L3dhaXRmb3I+CisKKyAgICAgICAgPGxvYWRmaWxlIHByb3BlcnR5PSJyZWRpcmVjdC5vdXQuY29udGVudHMiIHNyY2ZpbGU9IiR7b3V0ZmlsZX0iIC8+CisKKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0icjNmaWxlIj4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtyZWRpcmVjdC5vdXQuY29udGVudHN9IiBhcmcyPSJmb28iIC8+CisgICAgICAgIDwvY29uZGl0aW9uPgorCisgICAgICAgIDxmYWlsIHVubGVzcz0icjNmaWxlIj4ke291dGZpbGV9OgorJnF1b3Q7JHtyZWRpcmVjdC5vdXQuY29udGVudHN9JnF1b3Q7IGV4cGVjdGVkICZxdW90O2ZvbyZxdW90OzwvZmFpbD4KKworICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJyM21hdGNoIj4KKyAgICAgICAgICAgIDxmaWxlc21hdGNoIGZpbGUxPSIke291dGZpbGV9IiBmaWxlMj0iJHtlcnJmaWxlfSIgLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisKKyAgICAgICAgPGZhaWwgdW5sZXNzPSJyM2ZpbGUiPiR7ZXJyZmlsZX0gZGlmZmVycyBmcm9tICR7b3V0ZmlsZX08L2ZhaWw+CisKKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVkaXJlY3RvcjEiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0ZmlsZSIgbG9jYXRpb249IiR7dG1wfS9yZWRpcmVjdG9yLm91dCIgLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVycmZpbGUiIGxvY2F0aW9uPSIke3RtcH0vcmVkaXJlY3Rvci5lcnIiIC8+CisKKyAgICAgICAgPGphdmEgdGFza25hbWU9ImZvbyIgY2xhc3NuYW1lPSIke3BpcGVhcHB9IiBmb3JrPSJ0cnVlIgorICAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7dGVzdHMtY2xhc3NwYXRoLnZhbHVlfSI+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBpbnB1dHN0cmluZz0iZm9vIgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0PSIke291dGZpbGV9IgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I9IiR7ZXJyZmlsZX0iCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVlbXB0eWZpbGVzPSJmYWxzZSIgLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Im91dCIgLz4KKyAgICAgICAgPC9qYXZhPgorCisgICAgICAgIDwhLS0gbGV0IGR1bWIgV2luZG93cyBjYXRjaCB1cCAtLT4KKyAgICAgICAgPHdhaXRmb3I+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7b3V0ZmlsZX0iIC8+CisgICAgICAgIDwvd2FpdGZvcj4KKworICAgICAgICA8bG9hZGZpbGUgcHJvcGVydHk9InJlZGlyZWN0b3Iub3V0LmNvbnRlbnRzIiBzcmNmaWxlPSIke291dGZpbGV9IiAvPgorCisgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InJvcjFvdXQiPgorICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3JlZGlyZWN0b3Iub3V0LmNvbnRlbnRzfSIgYXJnMj0iZm9vIiAvPgorICAgICAgICA8L2NvbmRpdGlvbj4KKworICAgICAgICA8ZmFpbCB1bmxlc3M9InJvcjFvdXQiPiR7b3V0ZmlsZX06CismcXVvdDske3JlZGlyZWN0b3Iub3V0LmNvbnRlbnRzfSZxdW90OyBleHBlY3RlZCAmcXVvdDtmb28mcXVvdDs8L2ZhaWw+CisKKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0icm9yMW5vZXJyIj4KKyAgICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2VycmZpbGV9IiAvPgorICAgICAgICAgICAgPC9ub3Q+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8ZmFpbCB1bmxlc3M9InJvcjFub2VyciI+JHtlcnJmaWxlfSBleGlzdHMgYnV0IHNob3VsZCBub3Q8L2ZhaWw+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlZGlyZWN0b3IyIiBkZXBlbmRzPSJyZWRpcmVjdG9yMSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRmaWxlIiBsb2NhdGlvbj0iJHt0bXB9L3JlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZXJyZmlsZSIgbG9jYXRpb249IiR7dG1wfS9yZWRpcmVjdG9yLmVyciIgLz4KKworICAgICAgICA8IS0tIGZvcmsgaGVyZTsgc29tZSBWTXMgY2FuIGJlIGlsbC1iZWhhdmVkIHdpdGggZmlsZXMsCisgICAgICAgICAgICBzdWNoIGFzIFchbmQwd3MgLS0+CisgICAgICAgIDxqYXZhIHRhc2tuYW1lPSJmb28iIGNsYXNzbmFtZT0iJHtwaXBlYXBwfSIgZm9yaz0idHJ1ZSIKKyAgICAgICAgICAgICAgY2xhc3NwYXRoPSIke3Rlc3RzLWNsYXNzcGF0aC52YWx1ZX0iPgorICAgICAgICAgICAgPHJlZGlyZWN0b3IgaW5wdXRzdHJpbmc9ImZvbyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dD0iJHtvdXRmaWxlfSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yPSIke2VycmZpbGV9IgorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZW1wdHlmaWxlcz0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDxlcnJvcmZpbHRlcmNoYWluPgorICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJmb28iIHRvPSJiYXIiIC8+CisgICAgICAgICAgICAgICAgPC9lcnJvcmZpbHRlcmNoYWluPgorICAgICAgICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iYm90aCIgLz4KKyAgICAgICAgPC9qYXZhPgorCisgICAgICAgIDwhLS0gbGV0IGR1bWIgV2luZG93cyBjYXRjaCB1cCAtLT4KKyAgICAgICAgPHdhaXRmb3I+CisgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtvdXRmaWxlfSIgLz4KKyAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7ZXJyZmlsZX0iIC8+CisgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgPC93YWl0Zm9yPgorCisgICAgICAgIDxsb2FkZmlsZSBwcm9wZXJ0eT0icmVkaXJlY3Rvci5vdXQuY29udGVudHMyIgorICAgICAgICAgICAgICAgICAgc3JjZmlsZT0iJHtvdXRmaWxlfSIgLz4KKworICAgICAgICA8bG9hZGZpbGUgcHJvcGVydHk9InJlZGlyZWN0b3IuZXJyLmNvbnRlbnRzIgorICAgICAgICAgICAgICAgICAgc3JjZmlsZT0iJHtlcnJmaWxlfSIgLz4KKworICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJyb3Iyb3V0Ij4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtyZWRpcmVjdG9yLm91dC5jb250ZW50czJ9IiBhcmcyPSJmb29mb28iIC8+CisgICAgICAgIDwvY29uZGl0aW9uPgorCisgICAgICAgIDxmYWlsIHVubGVzcz0icm9yMW91dCI+JHtvdXRmaWxlfToKKyZxdW90OyR7cmVkaXJlY3Rvci5vdXQuY29udGVudHN9JnF1b3Q7IGV4cGVjdGVkICZxdW90O2Zvb2ZvbyZxdW90OzwvZmFpbD4KKworICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJyb3IyZXJyIj4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtyZWRpcmVjdG9yLmVyci5jb250ZW50c30iIGFyZzI9ImJhciIgLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisKKyAgICAgICAgPGZhaWwgdW5sZXNzPSJyb3Ixb3V0Ij4ke2VycmZpbGV9OgorJnF1b3Q7JHtyZWRpcmVjdG9yLmVyci5jb250ZW50c30mcXVvdDsgZXhwZWN0ZWQgJnF1b3Q7YmFyJnF1b3Q7PC9mYWlsPgorCisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgICAgICA8ZGVsZXRlPgorICAgICAgICAgICAgPGZpbGVzZXQgZmlsZT0iJHtsb2dGaWxlfSIgLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0bXB9IiBpbmNsdWRlcz0icmVkaXJlY3QqIiAvPgorICAgICAgICA8L2RlbGV0ZT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZm9vIiAvPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamF2YWRvYy9qYXZhL0NsYXNzVG9KYXZhZG9jLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhZG9jL2phdmEvQ2xhc3NUb0phdmFkb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDFiZGMxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamF2YWRvYy9qYXZhL0NsYXNzVG9KYXZhZG9jLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBldGMudGVzdGNhc2VzLnRhc2tkZWZzLmphdmFkb2MuamF2YTsKKworLyoqCisgKiBUaGlzIGlzIGEgc2ltcGxlIGNsYXNzIHRvIHByb3ZpZGUgZ3Jpc3QgZm9yIHRoZSBqYXZhZG9jIG1pbGwKKyAqIHdoaWxlIHRlc3RpbmcgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc1RvSmF2YWRvYyB7CisgICAgLyoqCisgICAgICogQHBhcmFtIGFuQXJndW1lbnQgQSBTdHJpbmcgdGhhdCBpcyBpZ25vcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWV0aG9kVG9KYXZhZG9jKFN0cmluZyBhbkFyZ3VtZW50KSB7IH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7IH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEFuIGFyYml0cmFyeSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhbm90aGVyU3RyaW5nKCkge3JldHVybiAiQW4gYXJiaXRyYXJ5IHN0cmluZy4iO30KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phdmFkb2MvamF2YWRvYy54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhZG9jL2phdmFkb2MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyZTMzOTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhZG9jL2phdmFkb2MueG1sCkBAIC0wLDAgKzEsMTU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAqICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCistLT4KKzxwcm9qZWN0IG5hbWU9ImphdmFkb2MiIGJhc2VkaXI9Ii4iPgorICA8cGF0aCBpZD0icGF0aC5kaXJzZXQiPgorICAgIDxkaXJzZXQgZGlyPSIuIiAvPgorICA8L3BhdGg+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jIiBsb2NhdGlvbj0iamF2YWRvYyIvPgorCisgIDx0YXJnZXQgbmFtZT0idGVhckRvd24iPgorICAgIDxkZWxldGUgZGlyPSIke2phdmFkb2N9IiBxdWlldD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpcnNldFBhdGgiPgorICAgIDxqYXZhZG9jIHNvdXJjZXBhdGhyZWY9InBhdGguZGlyc2V0IiBwYWNrYWdlbmFtZXM9IioiIGRlc3RkaXI9IiR7amF2YWRvY30iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGlyc2V0UGF0aFdpdGhvdXRQYWNrYWdlbmFtZXMiPgorICAgIDxqYXZhZG9jIHNvdXJjZXBhdGhyZWY9InBhdGguZGlyc2V0IiBkZXN0ZGlyPSIke2phdmFkb2N9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5lc3RlZERpcnNldFBhdGgiPgorICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0iKiIgZGVzdGRpcj0iJHtqYXZhZG9jfSI+CisgICAgICA8c291cmNlcGF0aCByZWZpZD0icGF0aC5kaXJzZXQiIC8+CisgICAgPC9qYXZhZG9jPgorICA8L3RhcmdldD4KKworICA8cGF0aCBpZD0icGF0aC5maWxlc2V0Ij4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4iLz4KKyAgICA8ZmlsZXNldCBkaXI9ImphdmEvIiBpZD0iZmlsZXNldC5pbnBhdGgiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgorICAgIDwvZmlsZXNldD4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iZmlsZXNldFBhdGgiPgorICAgIDxqYXZhZG9jIHNvdXJjZXBhdGhyZWY9InBhdGguZmlsZXNldCIgcGFja2FnZW5hbWVzPSIqIiBkZXN0ZGlyPSIke2phdmFkb2N9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5lc3RlZEZpbGVzZXRQYXRoIj4KKyAgICA8amF2YWRvYyBwYWNrYWdlbmFtZXM9IioiIGRlc3RkaXI9IiR7amF2YWRvY30iPgorICAgICAgPHNvdXJjZXBhdGggcmVmaWQ9InBhdGguZmlsZXNldCIgLz4KKyAgICA8L2phdmFkb2M+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibmVzdGVkRmlsZXNldFJlZkluUGF0aCI+CisgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSIqIiBkZXN0ZGlyPSIke2phdmFkb2N9Ij4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJmaWxlc2V0LmlucGF0aCIgLz4KKyAgICA8L2phdmFkb2M+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibmVzdGVkRmlsZXNldE5vUGF0dGVybnMiPgorICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0iKiIgZGVzdGRpcj0iJHtqYXZhZG9jfSI+CisgICAgICA8ZmlsZXNldCBkaXI9ImphdmEvIi8+CisgICAgPC9qYXZhZG9jPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvdWJseU5lc3RlZEZpbGVzZXQiPgorICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0iKiIgZGVzdGRpcj0iJHtqYXZhZG9jfSI+CisgICAgICA8c291cmNlZmlsZXM+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iamF2YS8iIGluY2x1ZGVzPSIqKi8qLmphdmEiLz4KKyAgICAgIDwvc291cmNlZmlsZXM+CisgICAgPC9qYXZhZG9jPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRvdWJseU5lc3RlZEZpbGVzZXROb1BhdHRlcm5zIj4KKyAgICA8amF2YWRvYyBwYWNrYWdlbmFtZXM9IioiIGRlc3RkaXI9IiR7amF2YWRvY30iPgorICAgICAgPHNvdXJjZWZpbGVzPgorICAgICAgICA8ZmlsZXNldCBkaXI9ImphdmEvIi8+CisgICAgICA8L3NvdXJjZWZpbGVzPgorICAgIDwvamF2YWRvYz4KKyAgPC90YXJnZXQ+CisKKyAgPHBhdGggaWQ9InBhdGguZmlsZWxpc3QiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLiIvPgorICAgIDxmaWxlbGlzdCBkaXI9ImphdmEvIj4KKyAgICAgIDxmaWxlIG5hbWU9IkNsYXNzVG9KYXZhZG9jLmphdmEiIC8+CisgICAgPC9maWxlbGlzdD4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iZmlsZWxpc3RQYXRoIj4KKyAgICA8amF2YWRvYyBzb3VyY2VwYXRocmVmPSJwYXRoLmZpbGVsaXN0IiBwYWNrYWdlbmFtZXM9IioiCisgICAgICBkZXN0ZGlyPSIke2phdmFkb2N9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5lc3RlZEZpbGVsaXN0UGF0aCI+CisgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSIqIiBkZXN0ZGlyPSIke2phdmFkb2N9Ij4KKyAgICAgIDxzb3VyY2VwYXRoIHJlZmlkPSJwYXRoLmZpbGVsaXN0IiAvPgorICAgIDwvamF2YWRvYz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSB0aGlzIHByb3BlcnR5IGlzIHNldCB3aGVuIHRoZSB0ZXN0cyBhcmUgcnVuIHVzaW5nIGFudCdzIGJ1aWxkLnhtbCAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8uLi8uLiIvPgorCisgIDxwYXRoIGlkPSJwYXRoLnBhdGhlbGVtZW50LnBhdGgiPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3Jvb3R9L3NyYyIgLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0icGF0aGVsZW1lbnRQYXRoIj4KKyAgICA8amF2YWRvYyBzb3VyY2VwYXRocmVmPSJwYXRoLnBhdGhlbGVtZW50LnBhdGgiCisgICAgICBwYWNrYWdlbmFtZXM9ImV0Yy50ZXN0Y2FzZXMudGFza2RlZnMuamF2YWRvYy4qIiBkZXN0ZGlyPSIke2phdmFkb2N9IiAvPgorICA8L3RhcmdldD4KKworICA8cGF0aCBpZD0icGF0aC5wYXRoZWxlbWVudC5sb2NhdGlvbiI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuIi8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9ImphdmEvQ2xhc3NUb0phdmFkb2MuamF2YSIgLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0icGF0aGVsZW1lbnRMb2NhdGlvblBhdGgiPgorICAgIDxqYXZhZG9jIHNvdXJjZXBhdGhyZWY9InBhdGgucGF0aGVsZW1lbnQubG9jYXRpb24iCisgICAgICBwYWNrYWdlbmFtZXM9IioiIGRlc3RkaXI9IiR7amF2YWRvY30iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibmVzdGVkU291cmNlIj4KKyAgICA8amF2YWRvYyBkZXN0ZGlyPSIke2phdmFkb2N9Ij4KKyAgICAgIDxzb3VyY2UgZmlsZT0iamF2YS9DbGFzc1RvSmF2YWRvYy5qYXZhIiAvPgorICAgIDwvamF2YWRvYz4KKyAgPC90YXJnZXQ+CisKKyAgPGZpbGVzZXQgZGlyPSJqYXZhLyIgaWQ9ImZpbGVzZXQuc2ltcGxlIj4KKyAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+CisgIDwvZmlsZXNldD4KKworICA8dGFyZ2V0IG5hbWU9Im5lc3RlZEZpbGVzZXRSZWYiPgorICAgIDxqYXZhZG9jIGRlc3RkaXI9IiR7amF2YWRvY30iPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9ImZpbGVzZXQuc2ltcGxlIiAvPgorICAgIDwvamF2YWRvYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJub25KYXZhSW5jbHVkZXMiPgorICAgIDxkZWxldGUgZGlyPSIke2phdmFkb2N9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jfSIvPgorICAgIDxlY2hvIGZpbGU9IiR7amF2YWRvY30vc3R1ZmYxLmphdmEiPnB1YmxpYyBjbGFzcyBzdHVmZjEge308L2VjaG8+CisgICAgPGVjaG8gZmlsZT0iJHtqYXZhZG9jfS9zdHVmZjIuamF2YSI+cHVibGljIGNsYXNzIHN0dWZmMiB7fTwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSIke2phdmFkb2N9L3N0dWZmLnByb3BlcnRpZXMiPng9NDwvZWNobz4KKyAgICA8amF2YWRvYyBkZXN0ZGlyPSIke2phdmFkb2N9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YWRvY30iLz4KKyAgICA8L2phdmFkb2M+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9sb2FkZmlsZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9sb2FkZmlsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjOWNlNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2xvYWRmaWxlLnhtbApAQCAtMCwwICsxLDE2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0ibG9hZGZpbGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdExvYWRBRmlsZSI+CisKKworICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb1NvdXJjZWZpbGVEZWZpbmVkIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8bG9hZGZpbGUgcHJvcGVydHk9ImZvbyIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9Qcm9wZXJ0eURlZmluZWQiCisgICAgZGVwZW5kcz0iaW5pdCI+CisgICAgPGxvYWRmaWxlIHNyY0ZpbGU9InNvbWVmaWxlIiAvPgorICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vU291cmNlZmlsZWZvdW5kIgorICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxsb2FkZmlsZSBwcm9wZXJ0eT0ibWlzc2luZyIgc3JjRmlsZT0ic29tZWZpbGUiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZhaWxPbkVycm9yIgorICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxsb2FkZmlsZQorICAgICAgcHJvcGVydHk9InRlc3RGYWlsT25FcnJvciIKKyAgICAgIHNyY0ZpbGU9InNvbWVmaWxlIgorICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdExvYWRBRmlsZSIKKyAgICBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZWNobworICAgICAgbWVzc2FnZT0iV2hhdCdzIGl0IGdvaW5nIHRvIGJlIHRoZW4sIGVoPyIKKyAgICAgIGZpbGU9ImxvYWRmaWxlMS50bXAiCisgICAgICAvPgorICAgIDxsb2FkZmlsZSBwcm9wZXJ0eT0idGVzdExvYWRBRmlsZSIgc3JjRmlsZT0ibG9hZGZpbGUxLnRtcCIgLz4KKyAgICA8ZWNobz4ke3Rlc3RMb2FkQUZpbGV9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RMb2FkQUZpbGVFbmMiCisgICAgZGVwZW5kcz0iaW5pdCI+CisgICAgPGxvYWRmaWxlIHByb3BlcnR5PSJ0ZXN0TG9hZEFGaWxlRW5jIgorICAgICAgc3JjRmlsZT0ibG9hZGZpbGUueG1sIgorICAgICAgZW5jb2Rpbmc9IklTTy04ODU5LTEiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RXZhbFByb3BzIgorICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWF0aGVyIiB2YWx1ZT0icmFpbiIgLz4KKyAgICA8ZWNobworICAgICAgbWVzc2FnZT0iQWxsIHRoZXNlIG1vbWVudHMgd2lsbCBiZSBsb3N0IGluIHRpbWUsIGxpa2UgdGVhcmRyb3BzIGluIHRoZSAke3dlYXRoZXJ9IgorICAgICAgZmlsZT0ibG9hZGZpbGUxLnRtcCIKKyAgICAgIC8+CisgICAgPGxvYWRmaWxlIHByb3BlcnR5PSJ0ZXN0RXZhbFByb3BzIgorICAgICAgICBzcmNGaWxlPSJsb2FkZmlsZTEudG1wIj4KKyAgICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICAgIDxleHBhbmRwcm9wZXJ0aWVzLz4KKyAgICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2xvYWRmaWxlPgorICAgIDxlY2hvPiR7dGVzdEV2YWxQcm9wc308L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbHRlckNoYWluIgorICAgIGRlcGVuZHM9ImluaXQiPgorICAgICAgPGVjaG8gZmlsZT0ibG9hZGZpbGUxLnRtcCI+I0xpbmUgMQorUkVNIExpbmUgMgorLS1MaW5lIDMKK0xpbmUgNAorSGVsbG8gV29ybGQhPC9lY2hvPgorICAgICAgPGxvYWRmaWxlIHNyY0ZpbGU9ImxvYWRmaWxlMS50bXAiIAorICAgICAgICBwcm9wZXJ0eT0idGVzdEZpbHRlckNoYWluIj4KKyAgICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICAgIDxoZWFkZmlsdGVyIGxpbmVzPSI1Ii8+CisgICAgICAgICAgPHN0cmlwbGluZWNvbW1lbnRzPgorICAgICAgICAgICAgPGNvbW1lbnQgdmFsdWU9Ii0tIi8+CisgICAgICAgICAgICA8Y29tbWVudCB2YWx1ZT0iUkVNICIvPgorICAgICAgICAgICAgPGNvbW1lbnQgdmFsdWU9IiMiLz4KKyAgICAgICAgICA8L3N0cmlwbGluZWNvbW1lbnRzPgorICAgICAgICAgIDxmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlRhaWxGaWx0ZXIiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImxpbmVzIiB2YWx1ZT0iMSIvPgorICAgICAgICAgIDwvZmlsdGVycmVhZGVyPgorICAgICAgICAgIDxsaW5lY29udGFpbnM+CisgICAgICAgICAgICA8Y29udGFpbnMgdmFsdWU9IldvcmxkISIvPgorICAgICAgICAgIDwvbGluZWNvbnRhaW5zPgorICAgICAgICA8L2ZpbHRlcmNoYWluPgorICAgICAgPC9sb2FkZmlsZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U3RyaXBKYXZhQ29tbWVudHMiCisgICAgZGVwZW5kcz0iaW5pdCI+CisgICAgICA8ZWNobyBmaWxlPSJsb2FkZmlsZTEudG1wIj4KKy8qCitDb21tZW50ICIxIgorKi8KK3B1YmxpYyBjbGFzcyB0ZXN0MSB7CisgICAgLy9Tb21lIGNvbW1lbnQKKyAgICBpbnQgeCA9IDEvMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRVRJTkc9IiovSGVsbG8vKiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVUSU5HMT0iLypIZWxsbyovIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmcgYXJnc1tdICkgeworICAgIH0KK308L2VjaG8+CisgICAgICA8ZWNobyBmaWxlPSJub2NvbW1lbnRzLnRtcCI+CisKK3B1YmxpYyBjbGFzcyB0ZXN0MSB7CisgICAgCisgICAgaW50IHggPSAxLzI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVUSU5HPSIqL0hlbGxvLyoiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVFVElORzE9Ii8qSGVsbG8qLyI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nIGFyZ3NbXSApIHsKKyAgICB9Cit9PC9lY2hvPgorICAgICAgPGxvYWRmaWxlIHNyY0ZpbGU9ImxvYWRmaWxlMS50bXAiIAorICAgICAgICBwcm9wZXJ0eT0idGVzdFN0cmlwSmF2YUNvbW1lbnRzIj4KKyAgICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICAgIDxzdHJpcGphdmFjb21tZW50cy8+CisgICAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgICA8L2xvYWRmaWxlPgorICAgICAgPGxvYWRmaWxlIHNyY0ZpbGU9Im5vY29tbWVudHMudG1wIiAKKyAgICAgICAgcHJvcGVydHk9ImV4cGVjdGVkIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE9uZUxpbmUiCisgICAgZGVwZW5kcz0iaW5pdCI+CisgICAgPGVjaG8KKyAgICAgIG1lc3NhZ2U9IjEsJiMxMDsyLCYjMTM7MywmIzEzOyYjMTA7NCIKKyAgICAgIGZpbGU9ImxvYWRmaWxlMS50bXAiCisgICAgICAvPgorICAgIDxsb2FkZmlsZSBwcm9wZXJ0eT0idGVzdE9uZUxpbmUiCisgICAgICAgIHNyY0ZpbGU9ImxvYWRmaWxlMS50bXAiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8c3RyaXBsaW5lYnJlYWtzLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9sb2FkZmlsZT4KKyAgICA8ZWNobz4ke3Rlc3RPbmVMaW5lfTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZmlsZT0ibG9hZGZpbGUxLnRtcCIvPgorICAgIDxkZWxldGUgZmlsZT0ibm9jb21tZW50cy50bXAiLz4KKyAgPC90YXJnZXQ+CisKKyAgPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbG9hZHByb3BlcnRpZXMueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbG9hZHByb3BlcnRpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGM2NDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9sb2FkcHJvcGVydGllcy54bWwKQEAgLTAsMCArMSw5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0ibG9hZHByb3BlcnRpZXMtdGVzdCIgCisgICAgICAgICBiYXNlZGlyPSIuIiAKKyAgICAgICAgIGRlZmF1bHQ9InRlc3RQcmVmaXhlZFByb3BlcnRpZXMiPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFByZWZpeGVkUHJvcGVydGllcyIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHByb3BlcnR5IG5hbWU9InNlcnZlciIgdmFsdWU9ImxvY2FsaG9zdCIvPgorICAgIDxlY2hvIGZpbGU9InByb3BlcnRpZXMudG1wIj4KKyNodHRwLkBQT1JUQCA9IDkwCitodHRwLkBQT1JUQCA9IDgwCitodHRwLkBTRVJWRVJAID0gJHtzZXJ2ZXJ9CisgICAgPC9lY2hvPgorICAgIDxsb2FkcHJvcGVydGllcyBzcmNGaWxlPSJwcm9wZXJ0aWVzLnRtcCI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxzdHJpcGxpbmVjb21tZW50cz4KKyAgICAgICAgICA8Y29tbWVudCB2YWx1ZT0iIyIvPgorICAgICAgICA8L3N0cmlwbGluZWNvbW1lbnRzPgorICAgICAgICA8cHJlZml4bGluZXMgcHJlZml4PSJzZXJ2ZXIxLiIvPgorICAgICAgICA8cmVwbGFjZXRva2Vucz4KKyAgICAgICAgICA8dG9rZW4ga2V5PSJQT1JUIiB2YWx1ZT0icG9ydCIvPgorICAgICAgICAgIDx0b2tlbiBrZXk9IlNFUlZFUiIgdmFsdWU9InNlcnZlciIvPgorICAgICAgICA8L3JlcGxhY2V0b2tlbnM+CisgICAgICAgIDxleHBhbmRwcm9wZXJ0aWVzLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9sb2FkcHJvcGVydGllcz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2VydmVyMS5odHRwLnVybCIgCisgICAgICB2YWx1ZT0iaHR0cDovLyR7c2VydmVyMS5odHRwLnNlcnZlcn06JHtzZXJ2ZXIxLmh0dHAucG9ydH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ3cml0ZSBwcm9wZXJ0aWVzLnRtcCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGVjaG8gZmlsZT0icHJvcGVydGllcy50bXAiPgorI3RwZnIuYT1hCit0cGZyLmE9QQordHBmci5iPWJcCisgICAgICAgZQordHBmci5jPUBDQAorICAgIDwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UHJvcGVydGllc0Zyb21SZXNvdXJjZSIgZGVwZW5kcz0id3JpdGUgcHJvcGVydGllcy50bXAiPgorICAgIDxsb2FkcHJvcGVydGllcyByZXNvdXJjZT0icHJvcGVydGllcy50bXAiIGNsYXNzcGF0aD0iJHtiYXNlZGlyfSI+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxyZXBsYWNldG9rZW5zPgorICAgICAgICAgIDx0b2tlbiBrZXk9IkMiIHZhbHVlPSJzZWEiLz4KKyAgICAgICAgPC9yZXBsYWNldG9rZW5zPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2xvYWRwcm9wZXJ0aWVzPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RQcm9wZXJ0aWVzRnJvbUZpbGVTZXQiIGRlcGVuZHM9IndyaXRlIHByb3BlcnRpZXMudG1wIj4KKyAgICA8bG9hZHByb3BlcnRpZXM+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJwcm9wZXJ0aWVzLnRtcCIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8cmVwbGFjZXRva2Vucz4KKyAgICAgICAgICA8dG9rZW4ga2V5PSJDIiB2YWx1ZT0ic2VhIi8+CisgICAgICAgIDwvcmVwbGFjZXRva2Vucz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9sb2FkcHJvcGVydGllcz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJsb2FkUHJvcGVydGllc0NoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0UHJvcGVydGllc0Zyb21SZXNvdXJjZS5vayI+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iQWJlc2VhIiBhcmcyPSIke3RwZnIuYX0ke3RwZnIuYn0ke3RwZnIuY30iIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGZhaWwgdW5sZXNzPSJ0ZXN0UHJvcGVydGllc0Zyb21SZXNvdXJjZS5vayI+CiskJHt0cGZyLmF9JCR7dHBmci5ifSQke3RwZnIuY309JnF1b3Q7JHt0cGZyLmF9JHt0cGZyLmJ9JHt0cGZyLmN9JnF1b3Q7CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZmlsZT0icHJvcGVydGllcy50bXAiLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hY3JvZGVmLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hY3JvZGVmLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2EzNTZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFjcm9kZWYueG1sCkBAIC0wLDAgKzEsMjkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0PgorCisgIDx0YXJnZXQgbmFtZT0ic2ltcGxlIj4KKyAgICA8bWFjcm9kZWYgbmFtZT0ibXkuZWNobyI+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRleHQiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJAe3RleHR9Ii8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICA8bXkuZWNobyB0ZXh0PSJIZWxsbyBXb3JsZCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRleHQiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJteS5lY2hvIj4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGV4dCIvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvPkB7dGV4dH08L2VjaG8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICA8bXkuZWNobyB0ZXh0PSJJbm5lciBUZXh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZHVwbGljYXRlLmF0dHJpYnV0ZSI+CisgICAgPG1hY3JvZGVmIG5hbWU9Im15LmVjaG8iPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXh0Ii8+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRleHQiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobz5Ae3RleHR9PC9lY2hvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZHVwbGljYXRlLmVsZW1lbnQiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJteS5lY2hvIj4KKyAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8dGV4dC8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ1cmkiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJlY2hvIiB1cmk9ImFiYyI+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRleHQiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJAe3RleHR9Ii8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICA8eDplY2hvIHhtbG5zOng9ImFiYyIgdGV4dD0iSGVsbG8gV29ybGQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJuZXN0ZWQiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJuZXN0ZWQiPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibmVzdGVkIi8+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPG5lc3RlZC8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxuZXN0ZWQ+CisgICAgICA8bmVzdGVkPgorICAgICAgICA8ZWNobz5BIG5lc3RlZCBlbGVtZW50PC9lY2hvPgorICAgICAgPC9uZXN0ZWQ+CisgICAgPC9uZXN0ZWQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZG91YmxlIj4KKyAgICA8bWFjcm9kZWYgbmFtZT0iZG91YmxlIj4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcCIvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvPkBAe3Byb3B9IGlzICdAe3Byb3B9JywgdmFsdWUgb2YgJCR7QHtwcm9wfX0gaXMgJyR7QHtwcm9wfX0nPC9lY2hvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5IiB2YWx1ZT0iQSBwcm9wZXJ0eSB2YWx1ZSIvPgorICAgIDxkb3VibGUgcHJvcD0icHJvcGVydHkiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpZ25vcmVjYXNlIj4KKyAgICA8bWFjcm9kZWYgbmFtZT0iaWdub3JlIj4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTXlBdHRyaWJ1dGUiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobz5Ae215YXR0cmlidXRlfSBpcyBAe01ZQVRUUklCVVRFfTwvZWNobz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIDxpZ25vcmUgbXlhdHRyaWJ1dGU9ImEiLz4KKyAgICA8aWdub3JlIE15YXR0cmlidXRlPSJiIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaWdub3JlLWVsZW1lbnQtY2FzZSI+CisgICAgPG1hY3JvZGVmIG5hbWU9Imlnbm9yZSI+CisgICAgICA8ZWxlbWVudCBuYW1lPSJNeUVsZW1lbnQiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8bXlFbGVtZW50Lz4KKyAgICAgICAgPE15RWxFbUVuVC8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICA8aWdub3JlPgorICAgICAgPE1ZRUxFTUVOVD4KKyAgICAgICAgPGVjaG8+bmVzdGVkIGVsZW1lbnQ8L2VjaG8+CisgICAgICA8L01ZRUxFTUVOVD4KKyAgICA8L2lnbm9yZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXh0ZWxlbWVudCI+CisgICAgPG1hY3JvZGVmIG5hbWU9ImVjaG90ZXN0Ij4KKyAgICAgIDx0ZXh0IG5hbWU9InRleHQiIG9wdGlvbmFsPSJ5ZXMiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobz5Ae3RleHR9PC9lY2hvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgPGVjaG90ZXN0PgorICAgICAgSGVsbG8gd29ybGQKKyAgICA8L2VjaG90ZXN0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRleHQudHJpbSI+CisgICAgPG1hY3JvZGVmIG5hbWU9ImVjaG90ZXN0Ij4KKyAgICAgIDx0ZXh0IG5hbWU9InRleHQiIHRyaW09InllcyIvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvPltAe3RleHR9XTwvZWNobz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIDxlY2hvdGVzdD4KKyAgICAgIEhlbGxvIHdvcmxkCisgICAgPC9lY2hvdGVzdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkdXBsaWNhdGV0ZXh0bmFtZSI+CisgICAgPG1hY3JvZGVmIG5hbWU9ImVjaG90ZXN0Ij4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGV4dCIvPgorICAgICAgPHRleHQgbmFtZT0idGV4dCIvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvPkB7dGV4dH08L2VjaG8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkdXBsaWNhdGV0ZXh0bmFtZTIiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJlY2hvdGVzdCI+CisgICAgICA8dGV4dCBuYW1lPSJ0ZXh0Ii8+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRleHQiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobz5Ae3RleHR9PC9lY2hvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZXNjYXBlIj4KKyAgICA8bWFjcm9kZWYgbmFtZT0iZXNjYXBlIj4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYSIvPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiIi8+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGVjaG8+YUBiIG9yIGFAQGIgaXMgQHthfUBAQHtifTwvZWNobz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIDxlc2NhcGUgYT0iYXZhbHVlIiBiPSJidmFsdWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhdHRyaWJ1dGUuZGVzY3JpcHRpb24iPgorICAgIDxtYWNyb2RlZiBuYW1lPSJkIj4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iLz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZCIgZGVmYXVsdD0icCIvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvPmRlc2NyaXB0aW9uIGlzIEB7ZGVzY3JpcHRpb259PC9lY2hvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgPGQgZGVzY3JpcHRpb249ImhlbGxvIHdvcmxkIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW1wbGljaXQiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJpbXBsaWNpdCI+CisgICAgICA8ZWxlbWVudCBuYW1lPSJpbXBsaWNpdCIgaW1wbGljaXQ9InllcyIvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvPkJlZm9yZSBpbXBsaWNpdDwvZWNobz4KKyAgICAgICAgPGltcGxpY2l0Lz4KKyAgICAgICAgPGVjaG8+QWZ0ZXIgaW1wbGljaXQ8L2VjaG8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxpbXBsaWNpdD4KKyAgICAgIDxlY2hvPkluIGltcGxpY2l0PC9lY2hvPgorICAgIDwvaW1wbGljaXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW1wbGljaXQubm90b3B0aW9uYWwiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJpbXBsaWNpdCI+CisgICAgICA8ZWxlbWVudCBuYW1lPSJpbXBsaWNpdCIgaW1wbGljaXQ9InllcyIvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvPkJlZm9yZSBpbXBsaWNpdDwvZWNobz4KKyAgICAgICAgPGltcGxpY2l0Lz4KKyAgICAgICAgPGVjaG8+QWZ0ZXIgaW1wbGljaXQ8L2VjaG8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxpbXBsaWNpdD4KKyAgICA8L2ltcGxpY2l0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImltcGxpY2l0Lm9wdGlvbmFsIj4KKyAgICA8bWFjcm9kZWYgbmFtZT0iaW1wbGljaXQiPgorICAgICAgPGVsZW1lbnQgbmFtZT0iaW1wbGljaXQiIG9wdGlvbmFsPSJ5ZXMiIGltcGxpY2l0PSJ5ZXMiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobz5CZWZvcmUgaW1wbGljaXQ8L2VjaG8+CisgICAgICAgIDxpbXBsaWNpdC8+CisgICAgICAgIDxlY2hvPkFmdGVyIGltcGxpY2l0PC9lY2hvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8aW1wbGljaXQ+CisgICAgPC9pbXBsaWNpdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbXBsaWNpdC5leHBsaWNpdCI+CisgICAgPG1hY3JvZGVmIG5hbWU9ImltcGxpY2l0Ij4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImV4cGxpY2l0IiBvcHRpb25hbD0ieWVzIi8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJpbXBsaWNpdCIgb3B0aW9uYWw9InllcyIgaW1wbGljaXQ9InllcyIvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxpbXBsaWNpdC8+CisgICAgICAgIDxleHBsaWNpdC8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgPC90YXJnZXQ+CisKKyAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHQub3ZlcnJpZGUiIHZhbHVlPSJvbGQiLz4KKyAgPG1hY3JvZGVmIG5hbWU9InNpbXBsZS5vdmVycmlkZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdHRyIiBkZWZhdWx0PSIke2RlZmF1bHQub3ZlcnJpZGV9Ii8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZWNobz52YWx1ZSBpcyBAe2F0dHJ9PC9lY2hvPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8dGFyZ2V0IG5hbWU9Im92ZXJyaWRlLmRlZmF1bHQiPgorICAgIDxhbnRjYWxsIHRhcmdldD0ib3ZlcnJpZGUuY2FsbCI+CisgICAgICA8cGFyYW0gbmFtZT0iZGVmYXVsdC5vdmVycmlkZSIgdmFsdWU9Im5ldyIvPgorICAgIDwvYW50Y2FsbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJvdmVycmlkZS5jYWxsIj4KKyAgICA8c2ltcGxlLm92ZXJyaWRlLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJiYWNrdHJhY2VvZmYiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJub2JhY2t0cmFjZSIgYmFja3RyYWNlPSJmYWxzZSI+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGZhaWw+VGhpcyBpcyBhIGZhaWx1cmU8L2ZhaWw+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICA8bm9iYWNrdHJhY2UvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJiYWNrdHJhY2VvbiI+CisgICAgPG1hY3JvZGVmIG5hbWU9Im5vYmFja3RyYWNlIiBiYWNrdHJhY2U9InRydWUiPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxmYWlsPlRoaXMgaXMgYSBmYWlsdXJlPC9mYWlsPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgPG5vYmFja3RyYWNlLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0b3AtbGV2ZWwtdGV4dCI+CisgICAgPG1hY3JvZGVmIG5hbWU9InRvcCI+CisgICAgICA8ZWxlbWVudCBuYW1lPSJlbSIvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvPjxlbS8+PC9lY2hvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgPHRvcD4KKyAgICAgIDxlbT4KKyAgICAgICAgSGVsbG8gV29ybGQKKyAgICAgIDwvZW0+CisgICAgPC90b3A+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFrZXVybC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYWtldXJsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWZkMDBhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFrZXVybC54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0by11cmwiID4KKworCisgIDx0YXJnZXQgbmFtZT0idGVzdEVtcHR5Ij4KKyAgICA8bWFrZXVybC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vUHJvcGVydHkiPgorICAgIDxtYWtldXJsIGZpbGU9ImZvbyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb0ZpbGUiPgorICAgIDxtYWtldXJsIHByb3BlcnR5PSJmb28iLz4KKyAgPC90YXJnZXQ+CisgICAgCisgIDx0YXJnZXQgbmFtZT0idGVzdFdvcmtzIj4KKyAgICA8bWFrZXVybCBwcm9wZXJ0eT0idGVzdFdvcmtzIiBmaWxlPSJmb28iIHZhbGlkYXRlPSJmYWxzZSIvPgorICAgIDxmYWlsIHVubGVzcz0idGVzdFdvcmtzIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJbGxlZ2FsQ2hhcnMiPgorICAgIDxtYWtldXJsIHByb3BlcnR5PSJ0ZXN0SWxsZWdhbENoYXJzIiBmaWxlPSJmbyBvJSIgdmFsaWRhdGU9ImZhbHNlIi8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Um91bmRUcmlwIj4KKyAgICA8bWFrZXVybCBwcm9wZXJ0eT0idGVzdFJvdW5kVHJpcCIgZmlsZT0iJHthbnQuZmlsZX0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SWxsZWdhbENvbWJpbmF0aW9ucyI+CisgICAgPG1ha2V1cmwgcHJvcGVydHk9InRlc3RJbGxlZ2FsQ29tYmluYXRpb25zIiBmaWxlPSJmb28iIHZhbGlkYXRlPSJmYWxzZSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqLnhtbCIgLz4KKyAgICA8L21ha2V1cmw+CisgIDwvdGFyZ2V0PgorICAKKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVzZXQiPgorICAgIDxtYWtldXJsIHByb3BlcnR5PSJ0ZXN0RmlsZXNldCI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqLnhtbCIgLz4KKyAgICA8L21ha2V1cmw+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZXNldFNlcGFyYXRvciI+CisgICAgPG1ha2V1cmwgcHJvcGVydHk9InRlc3RGaWxlc2V0U2VwYXJhdG9yIiBzZXBhcmF0b3I9JyIsIic+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqLnhtbCIgLz4KKyAgICA8L21ha2V1cmw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFZhbGlkYXRpb24iPgorICAgIDxtYWtldXJsIHByb3BlcnR5PSJ0ZXN0VmFsaWRhdGlvbiIgZmlsZT0iYWJzZW50IiB2YWxpZGF0ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RQYXRoIj4KKyAgICA8cGF0aCBpZD0idGVzdC5wYXRoIj4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLiIgLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IioueG1sIi8+CisgICAgPC9wYXRoPgorICAgIDxtYWtldXJsIHByb3BlcnR5PSJ0ZXN0UGF0aCI+CisgICAgICA8cGF0aCByZWZpZD0idGVzdC5wYXRoIiAvPgorICAgIDwvbWFrZXVybD4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWZhZjUwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBNYW5pZmVzdCB0ZXN0cyBidWlsZCBmaWxlCisgICAgIGF1dGhvcjogQ29ub3IgTWFjTmVpbGwgLS0+Cis8cHJvamVjdCBuYW1lPSJtYW5pZmVzdC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGphciBmaWxlPSJtZnRlc3QxLmphciIgbWFuaWZlc3Q9Im1hbmlmZXN0cy90ZXN0MS5tZiIvPgorICAgIDx1bmphciBzcmM9Im1mdGVzdDEuamFyIiBkZXN0PSJtYW5pZmVzdHMiPgorICAgICAgPHBhdHRlcm5zZXQ+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GL01BTklGRVNULk1GIi8+CisgICAgICA8L3BhdHRlcm5zZXQ+CisgICAgPC91bmphcj4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KKyAgICA8amFyIGZpbGU9Im1mdGVzdDIuamFyIiBtYW5pZmVzdD0ibWFuaWZlc3RzL3Rlc3QyLm1mIi8+CisgICAgPHVuamFyIHNyYz0ibWZ0ZXN0Mi5qYXIiIGRlc3Q9Im1hbmlmZXN0cyI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvTUFOSUZFU1QuTUYiLz4KKyAgICAgIDwvcGF0dGVybnNldD4KKyAgICA8L3VuamFyPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiPgorICAgIDxqYXIgZmlsZT0ibWZ0ZXN0My5qYXIiIG1hbmlmZXN0PSJtYW5pZmVzdHMvdGVzdDMubWYiLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KKyAgICA8amFyIGZpbGU9Im1mdGVzdDQuamFyIiBtYW5pZmVzdD0ibWFuaWZlc3RzL3Rlc3Q0Lm1mIi8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NSI+CisgICAgPGphciBmaWxlPSJtZnRlc3Q1LmphciIgbWFuaWZlc3Q9Im1hbmlmZXN0cy90ZXN0NS5tZiIvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdDYiPgorICAgIDxqYXIgZmlsZT0ibWZ0ZXN0Ni5qYXIiIG1hbmlmZXN0PSJtYW5pZmVzdHMvdGVzdDYubWYiLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3Q3Ij4KKyAgICA8amFyIGZpbGU9Im1mdGVzdDcuamFyIiBtYW5pZmVzdD0ibWFuaWZlc3RzL3Rlc3Q3Lm1mIi8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OCI+CisgICAgPGphciBmaWxlPSJtZnRlc3Q4LmphciI+CisgICAgICA8bWFuaWZlc3Q+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQ2xhc3MtUGF0aCIgdmFsdWU9ImZ1YmFyIi8+CisgICAgICAgIDxzZWN0aW9uIG5hbWU9IlRlc3QiPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iVGVzdEF0dHIiIHZhbHVlPSJUZXN0Ii8+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgIDwvbWFuaWZlc3Q+CisgICAgPC9qYXI+CisgICAgPHVuamFyIHNyYz0ibWZ0ZXN0OC5qYXIiIGRlc3Q9Im1hbmlmZXN0cyI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvTUFOSUZFU1QuTUYiLz4KKyAgICAgIDwvcGF0dGVybnNldD4KKyAgICA8L3VuamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q5Ij4KKyAgICA8amFyIGZpbGU9Im1mdGVzdDkuamFyIj4KKyAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiB2YWx1ZT0iZnViYXIiLz4KKyAgICAgICAgPHNlY3Rpb24gbmFtZT0iVGVzdCI+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJOYW1lIiB2YWx1ZT0iVGVzdCIvPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICA8L21hbmlmZXN0PgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxMCI+CisgICAgPGphciBmaWxlPSJtZnRlc3QxMC5qYXIiPgorICAgICAgPG1hbmlmZXN0PgorICAgICAgICA8YXR0cmlidXRlIHZhbHVlPSJmdWJhciIvPgorICAgICAgPC9tYW5pZmVzdD4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MTEiPgorICAgIDxqYXIgZmlsZT0ibWZ0ZXN0MTEuamFyIj4KKyAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJUZXN0Ii8+CisgICAgICA8L21hbmlmZXN0PgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxMiI+CisgICAgPGphciBmaWxlPSJtZnRlc3QxMi5qYXIiPgorICAgICAgPG1hbmlmZXN0PgorICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlRlc3RBdHRyIiB2YWx1ZT0iVGVzdCIvPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICA8L21hbmlmZXN0PgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxMyI+CisgICAgPGphciBmaWxlPSJtZnRlc3QxMy5qYXIiPgorICAgICAgPG1hbmlmZXN0PgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlRlc3QiIHZhbHVlPSJUZXN0MSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlRlc3QiIHZhbHVlPSJUZXN0MiIvPgorICAgICAgPC9tYW5pZmVzdD4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MTQiPgorICAgIDxqYXIgZmlsZT0ibWZ0ZXN0MTQuamFyIj4KKyAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1wYXRoIiB2YWx1ZT0iVGVzdDEiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1wYXRoIiB2YWx1ZT0iVGVzdDIiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiB2YWx1ZT0iVGVzdDMiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcy1QYXRoIiB2YWx1ZT0iVGVzdDQiLz4KKyAgICAgIDwvbWFuaWZlc3Q+CisgICAgPC9qYXI+CisgICAgPHVuamFyIHNyYz0ibWZ0ZXN0MTQuamFyIiBkZXN0PSJtYW5pZmVzdHMiPgorICAgICAgPHBhdHRlcm5zZXQ+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GL01BTklGRVNULk1GIi8+CisgICAgICA8L3BhdHRlcm5zZXQ+CisgICAgPC91bmphcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9GaWxlIj4KKyAgICA8bWFuaWZlc3QgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TG9uZ0xpbmUiPgorICAgIDxqYXIgZmlsZT0ibWZ0ZXN0TG9uZ0xpbmUuamFyIj4KKyAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1wYXRoIiAKKyAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0LmxvbmdsaW5lfSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7dGVzdC5sb25nNjhuYW1lfSIgdmFsdWU9IiR7dGVzdC52YWx1ZX0iIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHt0ZXN0Lmxvbmc3MG5hbWV9IiB2YWx1ZT0iJHt0ZXN0LnZhbHVlfSIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke3Rlc3Qubm90bG9uZ25hbWV9IiB2YWx1ZT0iJHt0ZXN0LnZhbHVlfSIgLz4KKyAgICAgIDwvbWFuaWZlc3Q+CisgICAgPC9qYXI+CisgICAgPHVuamFyIHNyYz0ibWZ0ZXN0TG9uZ0xpbmUuamFyIiBkZXN0PSJtYW5pZmVzdHMiPgorICAgICAgPHBhdHRlcm5zZXQ+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GL01BTklGRVNULk1GIi8+CisgICAgICA8L3BhdHRlcm5zZXQ+CisgICAgPC91bmphcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0T3JkZXIxIj4KKyAgICA8amFyIGZpbGU9Im1mdGVzdE9yZGVyMS5qYXIiPgorICAgICAgPG1hbmlmZXN0PgorICAgICAgICA8c2VjdGlvbiBuYW1lPSJUZXN0MSI+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJUZXN0QXR0cjEiIHZhbHVlPSJUZXN0MSIvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iVGVzdEF0dHIyIiB2YWx1ZT0iVGVzdDIiLz4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiBuYW1lPSJUZXN0MiI+CisgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJUZXN0QXR0cngiIHZhbHVlPSJUZXN0eCIvPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICA8L21hbmlmZXN0PgorICAgIDwvamFyPgorICAgIDx1bmphciBzcmM9Im1mdGVzdE9yZGVyMS5qYXIiIGRlc3Q9Im1hbmlmZXN0cyI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvTUFOSUZFU1QuTUYiLz4KKyAgICAgIDwvcGF0dGVybnNldD4KKyAgICA8L3VuamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RPcmRlcjIiPgorICAgIDxqYXIgZmlsZT0ibWZ0ZXN0T3JkZXIyLmphciI+CisgICAgICA8bWFuaWZlc3Q+CisgICAgICAgIDxzZWN0aW9uIG5hbWU9IlRlc3QyIj4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlRlc3RBdHRyeCIgdmFsdWU9IlRlc3R4Ii8+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24gbmFtZT0iVGVzdDEiPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iVGVzdEF0dHIyIiB2YWx1ZT0iVGVzdDIiLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlRlc3RBdHRyMSIgdmFsdWU9IlRlc3QxIi8+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgIDwvbWFuaWZlc3Q+CisgICAgPC9qYXI+CisgICAgPHVuamFyIHNyYz0ibWZ0ZXN0T3JkZXIyLmphciIgZGVzdD0ibWFuaWZlc3RzIj4KKyAgICAgIDxwYXR0ZXJuc2V0PgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi9NQU5JRkVTVC5NRiIvPgorICAgICAgPC9wYXR0ZXJuc2V0PgorICAgIDwvdW5qYXI+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVwbGFjZSI+CisgICAgPGNvcHkgZmlsZT0ibWFuaWZlc3RzL3Rlc3QyLm1mIiB0b0ZpbGU9Im1mdGVzdC5tZiIgLz4KKyAgICA8bWFuaWZlc3QgZmlsZT0ibWZ0ZXN0Lm1mIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RVcGRhdGUiPgorICAgIDxjb3B5IGZpbGU9Im1hbmlmZXN0cy90ZXN0Mi5tZiIgdG9GaWxlPSJtZnRlc3QubWYiIC8+CisgICAgPG1hbmlmZXN0IGZpbGU9Im1mdGVzdC5tZiIgbW9kZT0idXBkYXRlIj4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iRm9vIiB2YWx1ZT0iQmFyIiAvPgorICAgIDwvbWFuaWZlc3Q+CisKKyAgICA8Y29weSBmaWxlPSJtYW5pZmVzdHMvdGVzdDIubWYiIHRvRmlsZT0ibWZ0ZXN0Mi5tZiIgLz4KKyAgICA8bWFuaWZlc3QgZmlsZT0ibWZ0ZXN0Mi5tZiIgbW9kZT0idXBkYXRlIj4KKyAgICAgIDxzZWN0aW9uIG5hbWU9IlRlc3QiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkZvbyIgdmFsdWU9IkJhciIgLz4KKyAgICAgIDwvc2VjdGlvbj4KKyAgICA8L21hbmlmZXN0PgorICAgIDxtYW5pZmVzdCBmaWxlPSJtZnRlc3QyLm1mIiBtb2RlPSJ1cGRhdGUiPgorICAgICAgPHNlY3Rpb24gbmFtZT0iVGVzdCI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iRm9vIiB2YWx1ZT0iQmF6IiAvPgorICAgICAgPC9zZWN0aW9uPgorICAgIDwvbWFuaWZlc3Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZyb20iPgorICAgIDxtYW5pZmVzdCBmaWxlPSJtZnRlc3Rmcm9tLm1mIiA+CisgICAgICA8c2VjdGlvbiBuYW1lPSJUZXN0Ij4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiZWZvcmUiIHZhbHVlPSJiZWZvcmUiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iRnJvbSIgdmFsdWU9ImlsbGVnYWwiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhZnRlciIgdmFsdWU9ImFmdGVyIiAvPgorICAgICAgPC9zZWN0aW9uPgorICAgIDwvbWFuaWZlc3Q+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SWxsZWdhbE5hbWUiPgorICAgIDxtYW5pZmVzdCBmaWxlPSJtZnRlc3RpbGxlZ2FsbmFtZS5tZiI+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImhhcyBibGFuayIgdmFsdWU9InZhbHVlIi8+CisgICAgPC9tYW5pZmVzdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SWxsZWdhbE5hbWVJblNlY3Rpb24iPgorICAgIDxtYW5pZmVzdCBmaWxlPSJtZnRlc3RpbGxlZ2FsbmFtZWluc2VjdGlvbi5tZiI+CisgICAgICA8c2VjdGlvbiBuYW1lPSJzMSI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGFzIGJsYW5rIiB2YWx1ZT0idmFsdWUiLz4KKyAgICAgIDwvc2VjdGlvbj4KKyAgICA8L21hbmlmZXN0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJbGxlZ2FsTmFtZUJlZ2luIj4KKyAgICA8bWFuaWZlc3QgZmlsZT0ibWZ0ZXN0aWxsZWdhbG5hbWViZWdpbi5tZiI+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Ii1uYW1lIiB2YWx1ZT0idmFsdWUiLz4KKyAgICA8L21hbmlmZXN0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJbGxlZ2FsTmFtZTIiPgorICAgIDxtYW5pZmVzdCBmaWxlPSJtZnRlc3RpbGxlZ2FsbmFtZWJlZ2luLm1mIj4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGFzLnBvaW50IiB2YWx1ZT0idmFsdWUiLz4KKyAgICA8L21hbmlmZXN0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJbGxlZ2FsTmFtZTMiPgorICAgIDxtYW5pZmVzdCBmaWxlPSJtZnRlc3RpbGxlZ2FsbmFtZWJlZ2luLm1mIj4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGFzKnN0YXIiIHZhbHVlPSJ2YWx1ZSIvPgorICAgIDwvbWFuaWZlc3Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGU+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJtZnRlc3QqIi8+CisgICAgPC9kZWxldGU+CisgICAgPGRlbGV0ZSBkaXI9Im1hbmlmZXN0cy9NRVRBLUlORiIvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg2MjEzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgueG1sCkBAIC0wLDAgKzEsMjE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisNCis8cHJvamVjdCBuYW1lPSJtYW5pZmVzdGNsYXNzcGF0aCIgZGVmYXVsdD0idGVhckRvd24iPg0KKyAgPCEtLSBoZWJyZXcgLS0+DQorICA8cHJvcGVydHkgbmFtZT0iam9tIiB2YWx1ZT0iJiMxNTAxOyYjMTQ5MzsmIzE0OTc7Ii8+DQorICA8IS0tIGdlcm1hbiAtLT4NCisgIDxwcm9wZXJ0eSBuYW1lPSJhZW50IiB2YWx1ZT0iJiMyMjc7bnQiLz4gDQorICA8dGFyZ2V0IG5hbWU9InNldFVwIj4NCisgICAgPHByb3BlcnR5IG5hbWU9InRtcCIgbG9jYXRpb249IiR7YmFzZWRpcn0vJHthbnQucHJvamVjdC5uYW1lfS50bXAiIC8+DQorICAgIDxta2RpciBkaXI9IiR7dG1wfSIgLz4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJmdWxsU2V0VXAiIGRlcGVuZHM9InNldFVwIj4NCisgICAgPG1rZGlyIGRpcj0iJHt0bXB9L2xpYiIgLz4NCisgICAgPHRvdWNoIGZpbGU9IiR7dG1wfS9saWIvYWNtZS1jb3JlLmphciIgLz4NCisgICAgPHRvdWNoIGZpbGU9IiR7dG1wfS9saWIvYWNtZS1wcmVzLmphciIgLz4NCisNCisgICAgPG1rZGlyIGRpcj0iJHt0bXB9L2NsYXNzZXMvZHNwLWNvcmUvY29tL2xnYy9pbmZyYS9jb3JlIiAvPg0KKyAgICA8bWtkaXIgZGlyPSIke3RtcH0vY2xhc3Nlcy9kc3AtcHJlcy9jb20vbGdjL2luZnJhL3ByZXMiIC8+DQorICAgIDxta2RpciBkaXI9IiR7dG1wfS9jbGFzc2VzL2RzcC12b2lkIiAvPg0KKyAgICA8bWtkaXIgZGlyPSIke3RtcH0vZ2VuZXJhdGVkL2RzcC1jb3JlL2NvbS9sZ2MvaW5mcmEvY29yZS9nZW5lcmF0ZWQiIC8+DQorICAgIDxta2RpciBkaXI9IiR7dG1wfS9nZW5lcmF0ZWQvZHNwLXByZXMiIC8+DQorICAgIDxta2RpciBkaXI9IiR7dG1wfS9nZW5lcmF0ZWQvZHNwLXZvaWQiIC8+DQorICAgIDxta2RpciBkaXI9IiR7dG1wfS9yZXNvdXJjZXMvZHNwLWNvcmUvY29tL2xnYy9pbmZyYS9jb3JlIiAvPg0KKyAgICA8bWtkaXIgZGlyPSIke3RtcH0vcmVzb3VyY2VzL2RzcC1wcmVzL2NvbS9sZ2MvaW5mcmEvcHJlcyIgLz4NCisgICAgPG1rZGlyIGRpcj0iJHt0bXB9L3Jlc291cmNlcy9kc3Atdm9pZCIgLz4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+DQorICAgIDxkZWxldGUgZGlyPSIke3RtcH0iIC8+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdC1iYWQtZGlyZWN0b3J5Ij4NCisgICAgPG1hbmlmZXN0Y2xhc3NwYXRoIHByb3BlcnR5PSJqYXIuY2xhc3NwYXRoIg0KKyAgICAgICAgICAgICAgICAgICAgICAgamFyZmlsZT0iJHt0bXB9L2NsYXNzcGF0aC5qYXIiPg0KKyAgICAgIDxjbGFzc3BhdGggLz4NCisgICAgPC9tYW5pZmVzdGNsYXNzcGF0aD4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWJhZC1uby1wcm9wZXJ0eSIgZGVwZW5kcz0ic2V0VXAiPg0KKyAgICA8bWFuaWZlc3RjbGFzc3BhdGggamFyZmlsZT0iJHt0bXB9L2NsYXNzcGF0aC5qYXIiPg0KKyAgICAgIDxjbGFzc3BhdGggLz4NCisgICAgPC9tYW5pZmVzdGNsYXNzcGF0aD4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWJhZC1wcm9wZXJ0eS1leGlzdHMiIGRlcGVuZHM9InNldFVwIj4NCisgICAgPHByb3BlcnR5IG5hbWU9Imphci5jbGFzc3BhdGgiIHZhbHVlPSJleGlzdHMiIC8+DQorICAgIDxtYW5pZmVzdGNsYXNzcGF0aCBwcm9wZXJ0eT0iamFyLmNsYXNzcGF0aCINCisgICAgICAgICAgICAgICAgICAgICAgIGphcmZpbGU9IiR7dG1wfS9jbGFzc3BhdGguamFyIj4NCisgICAgICA8Y2xhc3NwYXRoIC8+DQorICAgIDwvbWFuaWZlc3RjbGFzc3BhdGg+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdC1iYWQtbm8tamFyZmlsZSIgZGVwZW5kcz0ic2V0VXAiPg0KKyAgICA8bWFuaWZlc3RjbGFzc3BhdGggcHJvcGVydHk9Imphci5jbGFzc3BhdGgiPg0KKyAgICAgIDxjbGFzc3BhdGggLz4NCisgICAgPC9tYW5pZmVzdGNsYXNzcGF0aD4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWJhZC1uby1jbGFzc3BhdGgiIGRlcGVuZHM9InNldFVwIj4NCisgICAgPG1hbmlmZXN0Y2xhc3NwYXRoIHByb3BlcnR5PSJqYXIuY2xhc3NwYXRoIg0KKyAgICAgICAgICAgICAgICAgICAgICAgamFyZmlsZT0iJHt0bXB9L2NsYXNzcGF0aC5qYXIiIC8+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdC1wc2V1ZG8tdGFob2UtcmVmaWQiIGRlcGVuZHM9ImZ1bGxTZXRVcCI+DQorICAgIDxwYXRoIGlkPSJjbGFzc3BhdGgiPg0KKyAgICAgIDwhLS0gQWxsIHRoZSBjbGFzc2VzLyBkaXJlY3RvcmllcyAtLT4NCisgICAgICA8ZGlyc2V0IGRpcj0iJHt0bXB9L2NsYXNzZXMiICAgaW5jbHVkZXM9ImRzcC0qIiAvPg0KKw0KKyAgICAgIDwhLS0gQWxsIHRoZSBKQVhCIGdlbmVyYXRlZC8gZGlyZWN0b3JpZXMgLS0+DQorICAgICAgPGRpcnNldCBkaXI9IiR7dG1wfS9nZW5lcmF0ZWQiIGluY2x1ZGVzPSJkc3AtKiI+DQorICAgICAgICA8IS0tIEFkZCBvbmx5IG5vbi1lbXB0eSBkaXJlY3RvcmllcyB0byB0aGUgY2xhc3NwYXRoIC0tPg0KKyAgICAgICAgPHByZXNlbnQgdGFyZ2V0ZGlyPSIke3RtcH0vZ2VuZXJhdGVkIiBwcmVzZW50PSJib3RoIj4NCisgICAgICAgICAgPG1hcHBlciB0eXBlPSJyZWdleHAiIGZyb209IiguKikiIHRvPSJcMS9jb20iIC8+DQorICAgICAgICA8L3ByZXNlbnQ+DQorICAgICAgPC9kaXJzZXQ+DQorDQorICAgICAgPCEtLSBBbGwgdGhlIHJlc291cmNlcy8gZGlyZWN0b3JpZXMgLS0+DQorICAgICAgPGRpcnNldCBkaXI9IiR7dG1wfS9yZXNvdXJjZXMiIGluY2x1ZGVzPSJkc3AtKiI+DQorICAgICAgICA8IS0tIEFkZCBvbmx5IG5vbi1lbXB0eSBkaXJlY3RvcmllcyB0byB0aGUgY2xhc3NwYXRoIC0tPg0KKyAgICAgICAgPHByZXNlbnQgdGFyZ2V0ZGlyPSIke3RtcH0vcmVzb3VyY2VzIiBwcmVzZW50PSJib3RoIj4NCisgICAgICAgICAgPG1hcHBlciB0eXBlPSJyZWdleHAiIGZyb209IiguKikiIHRvPSJcMS9jb20iIC8+DQorICAgICAgICA8L3ByZXNlbnQ+DQorICAgICAgPC9kaXJzZXQ+DQorICAgIDwvcGF0aD4NCisNCisgICAgPG1hbmlmZXN0Y2xhc3NwYXRoIHByb3BlcnR5PSJqYXIuY2xhc3NwYXRoIg0KKyAgICAgICAgICAgICAgICAgICAgICAgamFyZmlsZT0iJHt0bXB9L2NsYXNzcGF0aC5qYXIiPg0KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aCIgLz4NCisgICAgPC9tYW5pZmVzdGNsYXNzcGF0aD4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXBzZXVkby10YWhvZS1uZXN0ZWQiIGRlcGVuZHM9ImZ1bGxTZXRVcCI+DQorICAgIDxtYW5pZmVzdGNsYXNzcGF0aCBwcm9wZXJ0eT0iamFyLmNsYXNzcGF0aCINCisgICAgICAgICAgICAgICAgICAgICAgIGphcmZpbGU9IiR7dG1wfS9jbGFzc3BhdGguamFyIj4NCisgICAgICA8Y2xhc3NwYXRoPg0KKyAgICAgICAgPCEtLSBBbGwgdGhlIGNsYXNzZXMvIGRpcmVjdG9yaWVzIC0tPg0KKyAgICAgICAgPGRpcnNldCBkaXI9IiR7dG1wfS9jbGFzc2VzIiAgIGluY2x1ZGVzPSJkc3AtKiIgLz4NCisNCisgICAgICAgIDwhLS0gQWxsIHRoZSBKQVhCIGdlbmVyYXRlZC8gZGlyZWN0b3JpZXMgLS0+DQorICAgICAgICA8ZGlyc2V0IGRpcj0iJHt0bXB9L2dlbmVyYXRlZCIgaW5jbHVkZXM9ImRzcC0qIj4NCisgICAgICAgICAgPCEtLSBBZGQgb25seSBub24tZW1wdHkgZGlyZWN0b3JpZXMgdG8gdGhlIGNsYXNzcGF0aCAtLT4NCisgICAgICAgICAgPHByZXNlbnQgdGFyZ2V0ZGlyPSIke3RtcH0vZ2VuZXJhdGVkIiBwcmVzZW50PSJib3RoIj4NCisgICAgICAgICAgICA8bWFwcGVyIHR5cGU9InJlZ2V4cCIgZnJvbT0iKC4qKSIgdG89IlwxL2NvbSIgLz4NCisgICAgICAgICAgPC9wcmVzZW50Pg0KKyAgICAgICAgPC9kaXJzZXQ+DQorDQorICAgICAgICA8IS0tIEFsbCB0aGUgcmVzb3VyY2VzLyBkaXJlY3RvcmllcyAtLT4NCisgICAgICAgIDxkaXJzZXQgZGlyPSIke3RtcH0vcmVzb3VyY2VzIiBpbmNsdWRlcz0iZHNwLSoiPg0KKyAgICAgICAgICA8IS0tIEFkZCBvbmx5IG5vbi1lbXB0eSBkaXJlY3RvcmllcyB0byB0aGUgY2xhc3NwYXRoIC0tPg0KKyAgICAgICAgICA8cHJlc2VudCB0YXJnZXRkaXI9IiR7dG1wfS9yZXNvdXJjZXMiIHByZXNlbnQ9ImJvdGgiPg0KKyAgICAgICAgICAgIDxtYXBwZXIgdHlwZT0icmVnZXhwIiBmcm9tPSIoLiopIiB0bz0iXDEvY29tIiAvPg0KKyAgICAgICAgICA8L3ByZXNlbnQ+DQorICAgICAgICA8L2RpcnNldD4NCisgICAgICA8L2NsYXNzcGF0aD4NCisgICAgPC9tYW5pZmVzdGNsYXNzcGF0aD4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXBhcmVudC1sZXZlbDEiIGRlcGVuZHM9ImZ1bGxTZXRVcCI+DQorICAgIDxtYW5pZmVzdGNsYXNzcGF0aCBwcm9wZXJ0eT0iamFyLmNsYXNzcGF0aCINCisgICAgICAgICAgICAgICAgICAgICAgIGphcmZpbGU9IiR7dG1wfS9jbGFzc2VzL2NsYXNzcGF0aC5qYXIiPg0KKyAgICAgIDxjbGFzc3BhdGg+DQorICAgICAgICA8ZGlyc2V0IGRpcj0iJHt0bXB9L2NsYXNzZXMiICAgaW5jbHVkZXM9ImRzcC0qIiAvPg0KKyAgICAgICAgPGRpcnNldCBkaXI9IiR7dG1wfS9nZW5lcmF0ZWQiIGluY2x1ZGVzPSJkc3AtKiIgLz4NCisgICAgICAgIDxkaXJzZXQgZGlyPSIke3RtcH0vcmVzb3VyY2VzIiBpbmNsdWRlcz0iZHNwLSoiIC8+DQorICAgICAgPC9jbGFzc3BhdGg+DQorICAgIDwvbWFuaWZlc3RjbGFzc3BhdGg+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdC1wYXJlbnQtbGV2ZWwyIiBkZXBlbmRzPSJmdWxsU2V0VXAiPg0KKyAgICA8bWtkaXIgZGlyPSIke3RtcH0vY2xhc3Nlcy9sZXZlbDIiIC8+DQorICAgIDxtYW5pZmVzdGNsYXNzcGF0aCBwcm9wZXJ0eT0iamFyLmNsYXNzcGF0aCINCisgICAgICAgICAgICAgICAgICAgICAgIGphcmZpbGU9IiR7dG1wfS9jbGFzc2VzL2xldmVsMi9jbGFzc3BhdGguamFyIj4NCisgICAgICA8Y2xhc3NwYXRoPg0KKyAgICAgICAgPGRpcnNldCBkaXI9IiR7dG1wfS9jbGFzc2VzIiAgIGluY2x1ZGVzPSJkc3AtKiIgLz4NCisgICAgICAgIDxkaXJzZXQgZGlyPSIke3RtcH0vZ2VuZXJhdGVkIiBpbmNsdWRlcz0iZHNwLSoiIC8+DQorICAgICAgICA8ZGlyc2V0IGRpcj0iJHt0bXB9L3Jlc291cmNlcyIgaW5jbHVkZXM9ImRzcC0qIiAvPg0KKyAgICAgIDwvY2xhc3NwYXRoPg0KKyAgICA8L21hbmlmZXN0Y2xhc3NwYXRoPg0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3QtcGFyZW50LWxldmVsMi10b28tZGVlcCIgZGVwZW5kcz0iZnVsbFNldFVwIj4NCisgICAgPG1rZGlyIGRpcj0iJHt0bXB9L2NsYXNzZXMvbGV2ZWwyIiAvPg0KKyAgICA8bWFuaWZlc3RjbGFzc3BhdGggcHJvcGVydHk9Imphci5jbGFzc3BhdGgiIG1heFBhcmVudExldmVscz0iMSINCisgICAgICAgICAgICAgICAgICAgICAgIGphcmZpbGU9IiR7dG1wfS9jbGFzc2VzL2xldmVsMi9jbGFzc3BhdGguamFyIj4NCisgICAgICA8Y2xhc3NwYXRoPg0KKyAgICAgICAgPGRpcnNldCBkaXI9IiR7dG1wfS9jbGFzc2VzIiAgIGluY2x1ZGVzPSJkc3AtKiIgLz4NCisgICAgICAgIDxkaXJzZXQgZGlyPSIke3RtcH0vZ2VuZXJhdGVkIiBpbmNsdWRlcz0iZHNwLSoiIC8+DQorICAgICAgICA8ZGlyc2V0IGRpcj0iJHt0bXB9L3Jlc291cmNlcyIgaW5jbHVkZXM9ImRzcC0qIiAvPg0KKyAgICAgIDwvY2xhc3NwYXRoPg0KKyAgICA8L21hbmlmZXN0Y2xhc3NwYXRoPg0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3QtcGFyZW50LWxldmVsMi13aXRoLWphcnMiIGRlcGVuZHM9ImZ1bGxTZXRVcCI+DQorICAgIDxta2RpciBkaXI9IiR7dG1wfS9jbGFzc2VzL2xldmVsMiIgLz4NCisgICAgPG1hbmlmZXN0Y2xhc3NwYXRoIHByb3BlcnR5PSJqYXIuY2xhc3NwYXRoIg0KKyAgICAgICAgICAgICAgICAgICAgICAgamFyZmlsZT0iJHt0bXB9L2NsYXNzZXMvbGV2ZWwyL2NsYXNzcGF0aC5qYXIiPg0KKyAgICAgIDxjbGFzc3BhdGg+DQorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wfS9saWIiIGluY2x1ZGVzPSIqLmphciIgLz4NCisgICAgICAgIDxkaXJzZXQgZGlyPSIke3RtcH0vY2xhc3NlcyIgICBpbmNsdWRlcz0iZHNwLSoiIC8+DQorICAgICAgICA8ZGlyc2V0IGRpcj0iJHt0bXB9L2dlbmVyYXRlZCIgaW5jbHVkZXM9ImRzcC0qIiAvPg0KKyAgICAgICAgPGRpcnNldCBkaXI9IiR7dG1wfS9yZXNvdXJjZXMiIGluY2x1ZGVzPSJkc3AtKiIgLz4NCisgICAgICA8L2NsYXNzcGF0aD4NCisgICAgPC9tYW5pZmVzdGNsYXNzcGF0aD4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJpbnRlcm5hdGlvbmFsLWdlcm1hbiIgZGVwZW5kcz0ic2V0VXAiPg0KKyAgICAgIDxhbnRjYWxsIHRhcmdldD0icnVuLXR3by1qYXJzIj4NCisgICAgICAgICAgPHBhcmFtIG5hbWU9ImV4dC5kaXIiIHZhbHVlPSIke2FlbnR9Ii8+DQorICAgICAgPC9hbnRjYWxsPg0KKyAgPC90YXJnZXQ+DQorICA8dGFyZ2V0IG5hbWU9ImludGVybmF0aW9uYWwtaGVicmV3IiBkZXBlbmRzPSJzZXRVcCI+DQorICAgICAgPGFudGNhbGwgdGFyZ2V0PSJydW4tdHdvLWphcnMiPg0KKyAgICAgICAgICA8cGFyYW0gbmFtZT0iZXh0LmRpciIgdmFsdWU9IiR7am9tfSIvPg0KKyAgICAgIDwvYW50Y2FsbD4NCisgIDwvdGFyZ2V0Pg0KKyAgPHRhcmdldCBuYW1lPSJydW4tdHdvLWphcnMiPg0KKyAgICAgPG1rZGlyIGRpcj0iJHt0bXB9LyR7ZXh0LmRpcn0iLz4NCisgICAgICA8amF2YWMgc3JjZGlyPSJtYW5pZmVzdGNsYXNzcGF0aCIgZGVzdGRpcj0iJHt0bXB9IiAvPg0KKyAgICAgICA8amFyIGRlc3RmaWxlPSIke3RtcH0vJHtleHQuZGlyfS9hbHBoYS5qYXIiPg0KKyAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wfSI+DQorICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJBbHBoYS5jbGFzcyIvPg0KKyAgICAgICAgICA8L2ZpbGVzZXQ+DQorICAgICAgIDwvamFyPg0KKyAgICAgICAgPG1hbmlmZXN0Y2xhc3NwYXRoIHByb3BlcnR5PSJqYXIuY2xhc3NwYXRoIg0KKyAgICAgICAgICAgICAgICAgICAgICAgamFyZmlsZT0iJHt0bXB9L2JldGEuamFyIj4NCisgICAgICAgIDxjbGFzc3BhdGg+DQorICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG1wfS9iZXRhLmphciIvPg0KKyAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RtcH0vJHtleHQuZGlyfS9hbHBoYS5qYXIiLz4NCisgICAgICAgIDwvY2xhc3NwYXRoPg0KKyAgICAgICA8L21hbmlmZXN0Y2xhc3NwYXRoPg0KKyAgICAgIDxqYXIgZGVzdGZpbGU9IiR7dG1wfS9iZXRhLmphciIgPg0KKyAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wfSI+DQorICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJCZXRhLmNsYXNzIi8+DQorICAgICAgICAgIDwvZmlsZXNldD4NCisgICAgICAgICAgPG1hbmlmZXN0Pg0KKyAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiIHZhbHVlPSJCZXRhIi8+DQorICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQ2xhc3MtUGF0aCIgdmFsdWU9IiR7amFyLmNsYXNzcGF0aH0iLz4NCisgICAgICAgICAgPC9tYW5pZmVzdD4NCisgICAgICA8L2phcj4NCisgICAgICA8amF2YSBmb3JrPSJ0cnVlIiBqYXI9IiR7dG1wfS9iZXRhLmphciIvPg0KKyAgICA8L3RhcmdldD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgvQWxwaGEuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoL0FscGhhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxMjRkNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoL0FscGhhLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcHVibGljIGNsYXNzIEFscGhhIHsKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiYWxwaGEiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoL0JldGEuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoL0JldGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWI0NDZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgvQmV0YS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3B1YmxpYyBjbGFzcyBCZXRhIGV4dGVuZHMgQWxwaGEgeworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJiZXRhICIgKyBzdXBlci50b1N0cmluZygpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgeworCUJldGEgbXlCZXRhID0gbmV3IEJldGEoKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4obXlCZXRhLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0cy90ZXN0MS5tZiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0cy90ZXN0MS5tZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL3Rlc3QxLm1mCkBAIC0wLDAgKzEgQEAKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL3Rlc3QyLm1mIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL3Rlc3QyLm1mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTg4YmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdHMvdGVzdDIubWYKQEAgLTAsMCArMSwyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAyLjAKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL3Rlc3QzLm1mIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL3Rlc3QzLm1mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTgyY2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdHMvdGVzdDMubWYKQEAgLTAsMCArMSwzIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0hlYWRlci13aXRob3V0LWNvbG9uIG1heWJlIG1pc3R5cGVkCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0cy90ZXN0NC5tZiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0cy90ZXN0NC5tZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FmYjE4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL3Rlc3Q0Lm1mCkBAIC0wLDAgKzEsNCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCisKKyBDYW4ndCBzdGFydCB3aXRoIGEgY29udGludWF0aW9uIGxpbmUKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL3Rlc3Q1Lm1mIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL3Rlc3Q1Lm1mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjhkZWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdHMvdGVzdDUubWYKQEAgLTAsMCArMSwzIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK05hbWU6IHRlc3Q1IAorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdHMvdGVzdDYubWYgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdHMvdGVzdDYubWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5ODhjNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0cy90ZXN0Ni5tZgpAQCAtMCwwICsxLDUgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorCitUZXN0OiB0ZXN0NgorQ2xhc3MtUGF0aDogZnViYXIgCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0cy90ZXN0Ny5tZiBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0cy90ZXN0Ny5tZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmFhY2UwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL3Rlc3Q3Lm1mCkBAIC0wLDAgKzEsNCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitDbGFzcy1QYXRoOiBmdWJhcgorRnJvbTogSmFjayAKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWtkaXIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWtkaXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYTRlMjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ta2Rpci54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPG1rZGlyLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPG1rZGlyIGRpcj0idGVtcGxhdGUueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiPgorICAgIDxta2RpciBkaXI9InRlc3RkaXIudG1wIi8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tb3ZlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21vdmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMWRmZjgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tb3ZlLnhtbApAQCAtMCwwICsxLDI2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Im1vdmUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdEZpbHRlclNldCI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsdGVyU2V0Ij4KKyAgICA8Y29weSBmaWxlPSJjb3B5LmZpbHRlcnNldCIgdG9maWxlPSJtb3ZlLmZpbHRlcnNldCIvPgorICAgIDxtb3ZlIGZpbGU9Im1vdmUuZmlsdGVyc2V0IiB0b2ZpbGU9Im1vdmUuZmlsdGVyc2V0LnRtcCI+CisgICAgICA8ZmlsdGVyc2V0PgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJUSVRMRSIgdmFsdWU9IkFwYWNoZSBBbnQgUHJvamVjdCIvPgorICAgICAgPC9maWx0ZXJzZXQ+CisgICAgPC9tb3ZlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXJDaGFpbiI+CisgICAgPGNvcHkgZmlsZT0iY29weS5maWx0ZXJzZXQiIHRvZmlsZT0ibW92ZS5maWx0ZXJjaGFpbiIvPgorICAgIDxtb3ZlIGZpbGU9Im1vdmUuZmlsdGVyY2hhaW4iIHRvZmlsZT0ibW92ZS5maWx0ZXJjaGFpbi50bXAiPgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8cmVwbGFjZXRva2Vucz4KKyAgICAgICAgICA8dG9rZW4ga2V5PSJUSVRMRSIgdmFsdWU9IkFwYWNoZSBBbnQgUHJvamVjdCIvPgorICAgICAgICA8L3JlcGxhY2V0b2tlbnM+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvbW92ZT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBCdWd6aWxsYSBSZXBvcnQgMTE3MzIgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdERpcmVjdG9yeVJlbW92YWwiPgorICAgIDxta2RpciBkaXI9IkEvQiIvPgorICAgIDxta2RpciBkaXI9IkEvQyIvPgorICAgIDxta2RpciBkaXI9IkEvRCIvPgorICAgIDx0b3VjaCBmaWxlPSJBL0IvMSIvPgorICAgIDx0b3VjaCBmaWxlPSJBL0MvMiIvPgorICAgIDx0b3VjaCBmaWxlPSJBL0QvMyIvPgorICAgIDxta2RpciBkaXI9IkUiLz4KKyAgICA8bW92ZSB0b2Rpcj0iRSIgaW5jbHVkZWVtcHR5ZGlycz0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IkEiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJDIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iQy8qKiIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJELyoqIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9tb3ZlPgorICA8L3RhcmdldD4KKworICA8IS0tIEJ1Z3ppbGxhIFJlcG9ydCAxODg4NiAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RGlyZWN0b3J5UmV0YWluaW5nIj4KKyAgICA8bWtkaXIgZGlyPSJBIi8+CisgICAgPHRvdWNoIGZpbGU9IkEvMSIvPgorICAgIDxta2RpciBkaXI9IkUiLz4KKyAgICA8bW92ZSB0b2Rpcj0iRSIgaW5jbHVkZWVtcHR5ZGlycz0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IkEiIGluY2x1ZGVzPSIxIi8+CisgICAgPC9tb3ZlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUiPgorICAgIDxta2RpciBkaXI9IkEiLz4KKyAgICA8dG91Y2ggZmlsZT0iQS8xIi8+CisgICAgPG1vdmUgdG9kaXI9IkUiPgorICAgICAgPGZpbGVzZXQgZGlyPSJBIi8+CisgICAgPC9tb3ZlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUyIj4KKyAgICA8bWtkaXIgZGlyPSJBIi8+CisgICAgPHRvdWNoIGZpbGU9IkEvMSIvPgorICAgIDxtb3ZlIHRvZGlyPSJFIj4KKyAgICAgIDxwYXRoPgorICAgICAgICA8ZmlsZXNldCBkaXI9IkEiLz4KKyAgICAgIDwvcGF0aD4KKyAgICA8L21vdmU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFBhdGhFbGVtZW50TW92ZSI+CisgICAgPG1rZGlyIGRpcj0iQSIvPgorICAgIDx0b3VjaCBmaWxlPSJBLzEiLz4KKyAgICA8bW92ZSB0b2Rpcj0iRSIgZmxhdHRlbj0idHJ1ZSI+CisgICAgICA8cGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJBLzEiLz4KKyAgICAgIDwvcGF0aD4KKyAgICA8L21vdmU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE1vdmVGaWxlQW5kRmlsZXNldCI+CisgICAgPG1rZGlyIGRpcj0iQSIgLz4KKyAgICA8dG91Y2g+CisgICAgICA8ZmlsZWxpc3QgZGlyPSJBIiBmaWxlcz0iMSwyLDMiIC8+CisgICAgPC90b3VjaD4KKyAgICA8bW92ZSB0b2Rpcj0iRSIgZmlsZT0iQS8xIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iQSIgaW5jbHVkZXM9IjIsMyIgLz4KKyAgICA8L21vdmU+CisgICAgPGZhaWwgbWVzc2FnZT0iQSB1bmF2YWlsYWJsZSI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iQSIgdHlwZT0iZGlyIiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgICA8ZmFpbCBtZXNzYWdlPSJBLzEgbm90IG1vdmVkIj4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxvcj4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IkEvMSIgdHlwZT0iZmlsZSIgLz4KKyAgICAgICAgICA8bm90PgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJFLzEiIHR5cGU9ImZpbGUiIC8+CisgICAgICAgICAgPC9ub3Q+CisgICAgICAgIDwvb3I+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgICAgPGZhaWwgbWVzc2FnZT0iQS8yIG5vdCBtb3ZlZCI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8b3I+CisgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJBLzIiIHR5cGU9ImZpbGUiIC8+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iRS8yIiB0eXBlPSJmaWxlIiAvPgorICAgICAgICAgIDwvbm90PgorICAgICAgICA8L29yPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICAgIDxmYWlsIG1lc3NhZ2U9IkEvMyBub3QgbW92ZWQiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG9yPgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iQS8zIiB0eXBlPSJmaWxlIiAvPgorICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IkUvMyIgdHlwZT0iZmlsZSIgLz4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9vcj4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPG1hY3JvZGVmIG5hbWU9InZlcmlmeW1vdmUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmV3ZmlsZSIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im9sZGRpciIgLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGZhaWwgbWVzc2FnZT0iQHtuZXdmaWxlfSBub3QgYXZhaWxhYmxlIj4KKyAgICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJAe25ld2ZpbGV9IiB0eXBlPSJmaWxlIiAvPgorICAgICAgICAgICAgPC9ub3Q+CisgICAgICAgICAgPC9jb25kaXRpb24+CisgICAgICAgIDwvZmFpbD4KKyAgICAgICAgPGZhaWwgbWVzc2FnZT0iQHtvbGRkaXJ9IHJlbWFpbnMiPgorICAgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IkB7b2xkZGlyfSIgdHlwZT0iZGlyIiAvPgorICAgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8L2ZhaWw+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZVRvRXhpc3RpbmdEaXIiPgorICAgIDxta2RpciBkaXI9IkEiIC8+CisgICAgPHRvdWNoIGZpbGU9IkEvMSIgLz4KKyAgICA8bWtkaXIgZGlyPSJFIiAvPgorICAgIDx0b3VjaCBmaWxlPSJFLzIiIC8+CisgICAgPG1vdmUgdG9kaXI9IkUiPgorICAgICAgPGZpbGVzZXQgZGlyPSJBIiAvPgorICAgIDwvbW92ZT4KKyAgICA8dmVyaWZ5bW92ZSBuZXdmaWxlPSJFLzEiIG9sZGRpcj0iQSIgLz4KKyAgICA8ZmFpbCBtZXNzYWdlPSJFLzIgdW5hdmFpbGFibGUiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IkUvMiIgdHlwZT0iZmlsZSIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0ZpbGUiPgorICAgIDxta2RpciBkaXI9IkEiLz4KKyAgICA8dG91Y2ggZmlsZT0iQS8xIi8+CisgICAgPG1vdmUgZmlsZT0iQSIgdG9maWxlPSJFIiAvPgorICAgIDx2ZXJpZnltb3ZlIG5ld2ZpbGU9IkUvMSIgb2xkZGlyPSJBIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmVGaWxlVG9EaXIiPgorICAgIDxta2RpciBkaXI9IkEiLz4KKyAgICA8dG91Y2ggZmlsZT0iQS8xIi8+CisgICAgPG1vdmUgZmlsZT0iQSIgdG9kaXI9IkUiIC8+CisgICAgPHZlcmlmeW1vdmUgbmV3ZmlsZT0iRS9BLzEiIG9sZGRpcj0iQSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q29tcGxldGVEaXJlY3RvcnlNb3ZlRmlsZUFuZEZpbGVzZXQiPgorICAgIDxta2RpciBkaXI9IkEvMSIgLz4KKyAgICA8dG91Y2ggZmlsZT0iQS8yIiAvPgorICAgIDxtb3ZlIGZpbGU9IkEvMSIgdG9kaXI9IkUiPgorICAgICAgPGZpbGVzZXQgZGlyPSJBIiBpbmNsdWRlcz0iMiIgLz4KKyAgICA8L21vdmU+CisgICAgPGZhaWwgbWVzc2FnZT0iQSB1bmF2YWlsYWJsZSI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iQSIgdHlwZT0iZGlyIiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgICA8ZmFpbCBtZXNzYWdlPSJFLzEgdW5hdmFpbGFibGUiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IkUvMSIgdHlwZT0iZGlyIiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgICA8ZmFpbCBtZXNzYWdlPSJFLzIgdW5hdmFpbGFibGUiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IkUvMiIgdHlwZT0iZmlsZSIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0V4aXN0aW5nRmlsZSI+CisgICAgPG1rZGlyIGRpcj0iQSIvPgorICAgIDx0b3VjaCBmaWxlPSJBLzEiLz4KKyAgICA8dG91Y2ggZmlsZT0iRSIvPgorICAgIDxtb3ZlIGZpbGU9IkEiIHRvZmlsZT0iRSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q29tcGxldGVEaXJlY3RvcnlNb3ZlRmlsZVRvRXhpc3RpbmdEaXIiPgorICAgIDxta2RpciBkaXI9IkEiLz4KKyAgICA8dG91Y2ggZmlsZT0iQS8xIi8+CisgICAgPG1rZGlyIGRpcj0iRSIvPgorICAgIDxtb3ZlIGZpbGU9IkEiIHRvZmlsZT0iRSIgLz4KKyAgICA8dmVyaWZ5bW92ZSBuZXdmaWxlPSJFLzEiIG9sZGRpcj0iQSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q29tcGxldGVEaXJlY3RvcnlNb3ZlRmlsZVRvRGlyV2l0aEV4aXN0aW5nRmlsZSI+CisgICAgPG1rZGlyIGRpcj0iQSIvPgorICAgIDx0b3VjaCBmaWxlPSJBLzEiLz4KKyAgICA8bWtkaXIgZGlyPSJFIi8+CisgICAgPHRvdWNoIGZpbGU9IkUvQSIvPgorICAgIDxtb3ZlIGZpbGU9IkEiIHRvZGlyPSJFIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmVGaWxlVG9EaXJXaXRoRXhpc3RpbmdEaXIiPgorICAgIDxta2RpciBkaXI9IkEiLz4KKyAgICA8dG91Y2ggZmlsZT0iQS8xIi8+CisgICAgPG1rZGlyIGRpcj0iRSIvPgorICAgIDxta2RpciBkaXI9IkUvQSIvPgorICAgIDxtb3ZlIGZpbGU9IkEiIHRvZGlyPSJFIiAvPgorICAgIDx2ZXJpZnltb3ZlIG5ld2ZpbGU9IkUvQS8xIiBvbGRkaXI9IkEiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+IAorICAgIDxkZWxldGUgZmlsZT0ibW92ZS5maWx0ZXJzZXQudG1wIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJtb3ZlLmZpbHRlcmNoYWluLnRtcCIvPgorICAgIDxkZWxldGUgZGlyPSJBIiAvPgorICAgIDxkZWxldGUgZmlsZT0iQiIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iRSIgLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL211bHRpbWFwLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL211bHRpbWFwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM2MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbXVsdGltYXAueG1sCkBAIC0wLDAgKzEsMTkyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3QiIGJhc2VkaXI9Ii4iPgorICA8cGF0aCBpZD0idGVzdGNsYXNzZXMiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgIDwvcGF0aD4KKworICA8bWFwcGVyIGlkPSJ0ZXN0bWFwcGVyIgorICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTXVsdGlNYXBUZXN0JFRlc3RNYXBwZXIiCisgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0Y2xhc3NlcyIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJtYXAuZXh0IiB2YWx1ZT0iLmNvcHkyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJyb290U2NyYXRjaERpciIgdmFsdWU9InRlc3RfbXVsdGlfbWFwcGVyX3NjcmF0Y2hfYXJlYSIvPgorICA8cHJvcGVydHkgbmFtZT0iYmFzZVNjcmF0Y2hTcmMiIHZhbHVlPSIke3Jvb3RTY3JhdGNoRGlyfS9zcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJhc2VTY3JhdGNoRGVzdCIgdmFsdWU9IiR7cm9vdFNjcmF0Y2hEaXJ9L2Rlc3QiLz4KKworICA8dGFyZ2V0IG5hbWU9InNldHVwIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtiYXNlU2NyYXRjaFNyY30iLz4KKyAgICA8bWtkaXIgZGlyPSIke2Jhc2VTY3JhdGNoU3JjfSIvPgorICAgIDxkZWxldGUgZGlyPSIke2Jhc2VTY3JhdGNoRGVzdH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2Jhc2VTY3JhdGNoRGVzdH0iLz4KKyAgICA8dG91Y2ggZmlsZT0iJHtiYXNlU2NyYXRjaFNyY30vc29tZWZpbGUudHh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gdGVzdCBzaW1wbGUgc2luZ2xlIGZpbGUgdG8gbXVsdGlwbGUgZmlsZSBtb3ZlIC0tPgorICA8dGFyZ2V0IG5hbWU9Im11bHRpY29weSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxjb3B5IHRvZGlyPSIke2Jhc2VTY3JhdGNoRGVzdH0iIGVuYWJsZW11bHRpcGxlbWFwcGluZ3M9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VTY3JhdGNoU3JjfSIgaW5jbHVkZXM9InNvbWVmaWxlLnR4dCIvPgorICAgICAgPG1hcHBlciByZWZpZD0idGVzdG1hcHBlciIvPgorICAgIDwvY29weT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdWx0aWNvcHkub3V0Y29tZSI+CisgICAgICA8YW5kPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9zb21lZmlsZS50eHQiLz4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2VTY3JhdGNoRGVzdH0vc29tZWZpbGUudHh0JHttYXAuZXh0fSIvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGZhaWwgdW5sZXNzPSJtdWx0aWNvcHkub3V0Y29tZSI+bXVsdGljb3B5IGZhaWxlZDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdWx0aW1vdmUiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8bW92ZSB0b2Rpcj0iJHtiYXNlU2NyYXRjaERlc3R9IiBlbmFibGVtdWx0aXBsZW1hcHBpbmdzPSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlU2NyYXRjaFNyY30iIGluY2x1ZGVzPSJzb21lZmlsZS50eHQiLz4KKyAgICAgIDxtYXBwZXIgcmVmaWQ9InRlc3RtYXBwZXIiLz4KKyAgICA8L21vdmU+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGVzdDIub3V0Y29tZSI+CisgICAgICA8YW5kPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9zb21lZmlsZS50eHQiLz4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2VTY3JhdGNoRGVzdH0vc29tZWZpbGUudHh0JHttYXAuZXh0fSIvPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaFNyY30vc29tZWZpbGUudHh0Ii8+CisgICAgICAgIDwvbm90PgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaFNyY30vc29tZWZpbGUudHh0JHttYXAuZXh0fSIvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxmYWlsIHVubGVzcz0idGVzdDIub3V0Y29tZSI+bXVsaXRtb3ZlIGZhaWxlZDwvZmFpbD4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0tIAorICAgICAgIHRlc3QgdHJhZGl0aW9uYWwgc2luZ2xlIGZpbGUgdG8gc2luZ2xlIGZpbGUgY29weSBleHBsaWNpdGx5IHRlbGxpbmcKKyAgICAgICB0YXNrIHRvIGlnbm9yZSBtdWx0aXBsZSBtYXBwaW5ncworICAgICAgIC0tPgorCisgIDx0YXJnZXQgbmFtZT0ic2luZ2xlY29weSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxjb3B5IHRvZGlyPSIke2Jhc2VTY3JhdGNoRGVzdH0iIGVuYWJsZW11bHRpcGxlbWFwcGluZ3M9ImZhbHNlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlU2NyYXRjaFNyY30iIGluY2x1ZGVzPSJzb21lZmlsZS50eHQiLz4KKyAgICAgIDxtYXBwZXIgcmVmaWQ9InRlc3RtYXBwZXIiLz4KKyAgICA8L2NvcHk+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic2luZ2xlY29weS5vdXRjb21lIj4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaERlc3R9L3NvbWVmaWxlLnR4dCIvPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaERlc3R9L3NvbWVmaWxlLnR4dCR7bWFwLmV4dH0iLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaFNyY30vc29tZWZpbGUudHh0Ii8+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZmFpbCB1bmxlc3M9InNpbmdsZWNvcHkub3V0Y29tZSI+c2luZ2xlY29weSBmYWlsZWQ8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2luZ2xlbW92ZSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxtb3ZlIHRvZGlyPSIke2Jhc2VTY3JhdGNoRGVzdH0iIGVuYWJsZW11bHRpcGxlbWFwcGluZ3M9ImZhbHNlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlU2NyYXRjaFNyY30iIGluY2x1ZGVzPSJzb21lZmlsZS50eHQiLz4KKyAgICAgIDxtYXBwZXIgcmVmaWQ9InRlc3RtYXBwZXIiLz4KKyAgICA8L21vdmU+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic2luZ2xlbW92ZS5vdXRjb21lIj4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaERlc3R9L3NvbWVmaWxlLnR4dCIvPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaERlc3R9L3NvbWVmaWxlLnR4dCR7bWFwLmV4dH0iLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2VTY3JhdGNoU3JjfS9zb21lZmlsZS50eHQiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZmFpbCB1bmxlc3M9InNpbmdsZW1vdmUub3V0Y29tZSI+c2luZ2xlbW92ZSBmYWlsZWQ8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gdGVzdCBkaXIgdy8gZmlsZSArIGVtcHR5IGRpciBtdWx0aW1hcCBjb3B5IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNvcHl3aXRoZW1wdHkiPgorICAgIDxkZWxldGUgZGlyPSIke2Jhc2VTY3JhdGNoU3JjfSIvPgorICAgIDxta2RpciBkaXI9IiR7YmFzZVNjcmF0Y2hTcmN9L2RpcndpdGhmaWxlIi8+CisgICAgPG1rZGlyIGRpcj0iJHtiYXNlU2NyYXRjaFNyY30vZW1wdHlkaXIiLz4KKyAgICA8dG91Y2ggZmlsZT0iJHtiYXNlU2NyYXRjaFNyY30vZGlyd2l0aGZpbGUvc29tZWZpbGUudHh0Ii8+CisKKyAgICA8ZGVsZXRlIGRpcj0iJHtiYXNlU2NyYXRjaERlc3R9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtiYXNlU2NyYXRjaERlc3R9Ii8+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtiYXNlU2NyYXRjaERlc3R9IiBlbmFibGVtdWx0aXBsZW1hcHBpbmdzPSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlU2NyYXRjaFNyY30iIGluY2x1ZGVzPSIqKi8qIi8+CisgICAgICA8bWFwcGVyIHJlZmlkPSJ0ZXN0bWFwcGVyIi8+CisgICAgPC9jb3B5PgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvcHl3aXRoZW1wdHkub3V0Y29tZSI+CisgICAgICA8YW5kPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9kaXJ3aXRoZmlsZSIvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9kaXJ3aXRoZmlsZSR7bWFwLmV4dH0iLz4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2VTY3JhdGNoRGVzdH0vZGlyd2l0aGZpbGUvc29tZWZpbGUudHh0Ii8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaERlc3R9L2RpcndpdGhmaWxlL3NvbWVmaWxlLnR4dCR7bWFwLmV4dH0iLz4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9kaXJ3aXRoZmlsZSR7bWFwLmV4dH0vc29tZWZpbGUudHh0Ii8+CisgICAgICAgIDwvbm90PgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaERlc3R9L2RpcndpdGhmaWxlJHttYXAuZXh0fS9zb21lZmlsZS50eHQke21hcC5leHR9Ii8+CisgICAgICAgIDwvbm90PgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9lbXB0eWRpciIvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9lbXB0eWRpciR7bWFwLmV4dH0iLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxmYWlsIHVubGVzcz0iY29weXdpdGhlbXB0eS5vdXRjb21lIj5jb3B5d2l0aGVtcHR5IGZhaWxlZDwvZmFpbD4KKyAgPC90YXJnZXQ+CisgIDwhLS0gdGVzdCBkaXIgdy8gZmlsZSArIGVtcHR5IGRpciBtdWx0aW1hcCBtb3ZlIC0tPgorICA8dGFyZ2V0IG5hbWU9Im1vdmV3aXRoZW1wdHkiPgorICAgIDxkZWxldGUgZGlyPSIke2Jhc2VTY3JhdGNoU3JjfSIvPgorICAgIDxta2RpciBkaXI9IiR7YmFzZVNjcmF0Y2hTcmN9L2RpcndpdGhmaWxlIi8+CisgICAgPG1rZGlyIGRpcj0iJHtiYXNlU2NyYXRjaFNyY30vZW1wdHlkaXIiLz4KKyAgICA8dG91Y2ggZmlsZT0iJHtiYXNlU2NyYXRjaFNyY30vZGlyd2l0aGZpbGUvc29tZWZpbGUudHh0Ii8+CisKKyAgICA8ZGVsZXRlIGRpcj0iJHtiYXNlU2NyYXRjaERlc3R9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtiYXNlU2NyYXRjaERlc3R9Ii8+CisKKyAgICA8bW92ZSB0b2Rpcj0iJHtiYXNlU2NyYXRjaERlc3R9IiBlbmFibGVtdWx0aXBsZW1hcHBpbmdzPSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlU2NyYXRjaFNyY30iIGluY2x1ZGVzPSIqKi8qIi8+CisgICAgICA8bWFwcGVyIHJlZmlkPSJ0ZXN0bWFwcGVyIi8+CisgICAgPC9tb3ZlPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im1vdmV3aXRoZW1wdHkub3V0Y29tZSI+CisgICAgICA8YW5kPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9kaXJ3aXRoZmlsZSIvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9kaXJ3aXRoZmlsZSR7bWFwLmV4dH0iLz4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2VTY3JhdGNoRGVzdH0vZGlyd2l0aGZpbGUvc29tZWZpbGUudHh0Ii8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaERlc3R9L2RpcndpdGhmaWxlL3NvbWVmaWxlLnR4dCR7bWFwLmV4dH0iLz4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9kaXJ3aXRoZmlsZSR7bWFwLmV4dH0vc29tZWZpbGUudHh0Ii8+CisgICAgICAgIDwvbm90PgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaERlc3R9L2RpcndpdGhmaWxlJHttYXAuZXh0fS9zb21lZmlsZS50eHQke21hcC5leHR9Ii8+CisgICAgICAgIDwvbm90PgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9lbXB0eWRpciIvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hEZXN0fS9lbXB0eWRpciR7bWFwLmV4dH0iLz4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZVNjcmF0Y2hTcmN9L2RpcndpdGhmaWxlIi8+CisgICAgICAgIDwvbm90PgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtiYXNlU2NyYXRjaFNyY30vZW1wdHlkaXIiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZmFpbCB1bmxlc3M9Im1vdmV3aXRoZW1wdHkub3V0Y29tZSI+bW92ZXdpdGhlbXB0eSBmYWlsZWQ8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBkaXI9IiR7cm9vdFNjcmF0Y2hEaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9uaWNlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL25pY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2VlMTkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9uaWNlLnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9Im5pY2UiIGJhc2VkaXI9Ii4iPgorCis8ZGVzY3JpcHRpb24+CitUZXN0IG5pY2luZy4gVG8gbWFrZSB0aGUgdGVzdCBtb3JlIGNvbXBsZXggd2UgbWF5IGJlIHJ1bm5pbmcgaW4gYSBuaWNlIG1vZGUKK3RvIHN0YXJ0IHdpdGgsIGFuZCB3ZSB3YW50IHRvIHJlc3RvcmUgdGhhdCB2YWx1ZSBhdCB0aGUgZW5kLiBTbyBldmVyeSB0ZXN0Cit0aGF0IHN1Y2NlZWRzIG11c3QgcmVzdG9yZSB0aGUgc2F2ZWQgdmFsdWUuCis8L2Rlc2NyaXB0aW9uPgorICA8dGFyZ2V0IG5hbWU9Im5vb3AiPgorICAgIDxuaWNlLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImN1cnJlbnQiPgorICAgIDxuaWNlIGN1cnJlbnRQcmlvcml0eT0ibmljZS5ub3ciLz4KKyAgICA8ZmFpbCB1bmxlc3M9Im5pY2Uubm93Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmFzdGVyIj4KKyAgICA8bmljZSBuZXdQcmlvcml0eT0iOCIgY3VycmVudFByaW9yaXR5PSJuaWNlLm9sZCIvPgorICAgIDxuaWNlIGN1cnJlbnRQcmlvcml0eT0ibmljZS5ub3ciLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0LnN1Y2NlZWRlZCI+CisgICAgICA8ZXF1YWxzIGFyZzE9IiR7bmljZS5ub3d9IiBhcmcyPSI4IiAvPiAKKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8bmljZSBuZXdQcmlvcml0eT0iJHtuaWNlLm9sZH0iLz4KKyAgICA8ZmFpbCB1bmxlc3M9InRlc3Quc3VjY2VlZGVkIi8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJzbG93ZXIiPgorICAgIDxuaWNlIG5ld1ByaW9yaXR5PSIzIiBjdXJyZW50UHJpb3JpdHk9Im5pY2Uub2xkIi8+CisgICAgPG5pY2UgY3VycmVudFByaW9yaXR5PSJuaWNlLm5vdyIvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3Quc3VjY2VlZGVkIj4KKyAgICAgIDxlcXVhbHMgYXJnMT0iJHtuaWNlLm5vd30iIGFyZzI9IjMiIC8+IAorICAgIDwvY29uZGl0aW9uPgorICAgIDxuaWNlIG5ld1ByaW9yaXR5PSIke25pY2Uub2xkfSIvPgorICAgIDxmYWlsIHVubGVzcz0idGVzdC5zdWNjZWVkZWQiLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRvb19zbG93Ij4KKyAgICA8bmljZSBjdXJyZW50UHJpb3JpdHk9Im5pY2Uub2xkIi8+CisgICAgPG5pY2UgbmV3UHJpb3JpdHk9IjAiLz4KKyAgICA8bmljZSBuZXdQcmlvcml0eT0iJHtuaWNlLm9sZH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0b29fZmFzdCI+CisgICAgPG5pY2UgY3VycmVudFByaW9yaXR5PSJuaWNlLm9sZCIvPgorICAgIDxuaWNlIG5ld1ByaW9yaXR5PSIyMCIvPgorICAgIDxuaWNlIG5ld1ByaW9yaXR5PSIke25pY2Uub2xkfSIvPgorICA8L3RhcmdldD4KKyAgCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvV3NkbFRvRG90bmV0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL1dzZGxUb0RvdG5ldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5YjdkNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL1dzZGxUb0RvdG5ldC54bWwKQEAgLTAsMCArMSwyNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJ3c2RsLXRvLWphdmEtanRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImluaXQiPgorCisKKyAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249IndzZGwvYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNhY2hlLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9jYWNoZSIvPgorICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9zcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImxvY2FsLndzZGwiIAorICAgIGxvY2F0aW9uPSJ3c2RsL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJvdXQuY3NjIiBsb2NhdGlvbj0iJHtzcmMuZGlyfS9vdXQuY3MiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im91dC5hcHAiIGxvY2F0aW9uPSIke2NsYXNzZXMuZGlyfS9vdXQuZGxsIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJvdXQudHlwZSIgdmFsdWU9Im1vZHVsZSIvPgorICA8cHJvcGVydHkgbmFtZT0ib3V0LnZiYyIgbG9jYXRpb249IiR7c3JjLmRpcn0vb3V0LnZiIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJlbmRwb2ludCIKKyAgICB2YWx1ZT0iaHR0cDovL25hZ295YS5hcGFjaGUub3JnOjUwNDkvQXhpcy9TdG9ja1F1b3RlU2VydmljZS5qd3MiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJlbmRwb2ludC53c2RsIiAKKyAgICB2YWx1ZT0iaHR0cDovL25hZ295YS5hcGFjaGUub3JnOjUwNDkvQXhpcy9TdG9ja1F1b3RlU2VydmljZS5qd3M/d3NkbCIgLz4KKyAgCisgIDxwcm9wZXJ0eSBuYW1lPSJ2Yi5yZWZlcmVuY2VzIiAKKyAgICB2YWx1ZT0iU3lzdGVtLldlYi5kbGwsU3lzdGVtLnhtbC5kbGwsU3lzdGVtLmRsbCxTeXN0ZW0uV2ViLlNlcnZpY2VzLmRsbCIvPgorICAgIAorICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InZhbGlkYXRlIj4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhY2hlLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3NyYy5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InByb2JlX2Zvcl9hcHBzIiA+CisgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ3c2RsLmZvdW5kIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJ3c2RsIiAgICAgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IndzZGwuZXhlIiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0id3NkbC5leGUiIGZpbGVwYXRoPSIke2Vudi5QYXRofSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICA8ZWNobz4gd3NkbC5mb3VuZD0ke3dzZGwuZm91bmR9PC9lY2hvPgorICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY3NjLmZvdW5kIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJtY3MiICAgICBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iY3NjIiAgICAgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9ImNzYy5leGUiIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIgLz4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJjc2MuZXhlIiBmaWxlcGF0aD0iJHtlbnYuUGF0aH0iIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgPGVjaG8+IGNzYy5mb3VuZD0ke2NzYy5mb3VuZH08L2VjaG8+CisgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2YmMuZm91bmQiPgorICAgICAgPG9yPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9InZiYyIgICAgIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIgLz4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJ2YmMuZXhlIiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0idmJjLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBhdGh9IiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgIDxlY2hvPiB2YmMuZm91bmQ9JHt2YmMuZm91bmR9PC9lY2hvPgorICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZG90bmV0YXBwcy5mb3VuZCI+CisgICAgICA8YW5kPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImNzYy5mb3VuZCIvPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9IndzZGwuZm91bmQiLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgPGVjaG8+IGRvdG5ldGFwcHMuZm91bmQ9JHtkb3RuZXRhcHBzLmZvdW5kfTwvZWNobz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlYXJkb3duIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PiAgCisKKyAgPHRhcmdldCBuYW1lPSJ2YWxpZGF0ZSIgZGVwZW5kcz0icHJvYmVfZm9yX2FwcHMiID4KKyAgICA8ZmFpbCB1bmxlc3M9ImRvdG5ldGFwcHMuZm91bmQiPk5lZWRlZCAubmV0IGFwcHMgYXJlIG1pc3Npbmc8L2ZhaWw+CisgIDwvdGFyZ2V0PiAgCisgIAorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9QYXJhbXMiPgorICAgIDx3c2RsdG9kb3RuZXQvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb1NyYyI+CisgICAgPHdzZGx0b2RvdG5ldCBkZXN0RmlsZT0iJHtvdXQuY3NjfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REZXN0SXNEaXIiIGRlcGVuZHM9ImluaXQiPgorICAgIDx3c2RsdG9kb3RuZXQgZGVzdEZpbGU9IiR7YnVpbGQuZGlyfSIKKyAgICAgIHNyY0ZpbGU9IiR7bG9jYWwud3NkbH0iLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RCb3RoU3JjIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8d3NkbHRvZG90bmV0IGRlc3RGaWxlPSIke291dC5jc2N9IgorICAgICAgc3JjRmlsZT0iJHtsb2NhbC53c2RsfSIKKyAgICAgIHVybD0iJHtlbmRwb2ludC53c2RsfSIKKyAgICAgIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFNyY0lzRGlyIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8d3NkbHRvZG90bmV0IGRlc3RGaWxlPSIke291dC5jc2N9IgorICAgICAgc3JjRmlsZT0iJHtidWlsZC5kaXJ9IgorICAgICAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U3JjSXNNaXNzaW5nIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8d3NkbHRvZG90bmV0IGRlc3RGaWxlPSIke291dC5jc2N9IgorICAgICAgc3JjRmlsZT0iJHtidWlsZC5kaXJ9L2ludmFsaWRmaWxlLndzZGwiCisgICAgICAvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdExvY2FsV3NkbCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHdzZGx0b2RvdG5ldCBkZXN0RmlsZT0iJHtvdXQuY3NjfSIKKyAgICAgIHNyY0ZpbGU9IiR7bG9jYWwud3NkbH0iCisgICAgICAvPgorICAgIDxjc2MgCisgICAgICBzcmNEaXI9IiR7c3JjLmRpcn0iCisgICAgICBkZXN0RmlsZT0iJHtvdXQuYXBwfSIKKyAgICAgIHRhcmdldFR5cGU9IiR7b3V0LnR5cGV9IgorICAgICAgcmVmZXJlbmNlcz0iU3lzdGVtLldlYi5TZXJ2aWNlcy5kbGwiCisgICAgICAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFwcC5jcmVhdGVkIiBmaWxlPSIke291dC5hcHB9Ii8+CisgICAgPGZhaWwgdW5sZXNzPSJhcHAuY3JlYXRlZCI+Tm8gYXBwIGNyZWF0ZWQ8L2ZhaWw+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TG9jYWxXc2RsU2VydmVyIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8d3NkbHRvZG90bmV0IGRlc3RGaWxlPSIke291dC5jc2N9IgorICAgICAgc3JjRmlsZT0iJHtsb2NhbC53c2RsfSIKKyAgICAgIHNlcnZlcj0idHJ1ZSIKKyAgICAgIC8+CisgICAgPGNzYyAKKyAgICAgIHNyY0Rpcj0iJHtzcmMuZGlyfSIKKyAgICAgIGRlc3RGaWxlPSIke291dC5hcHB9IgorICAgICAgdGFyZ2V0VHlwZT0iJHtvdXQudHlwZX0iIAorICAgICAgZmlsZUFsaWduPSI1MTIiCisgICAgICByZWZlcmVuY2VzPSJTeXN0ZW0uV2ViLlNlcnZpY2VzLmRsbCIKKyAgICAgIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXBwLmNyZWF0ZWQiIGZpbGU9IiR7b3V0LmFwcH0iLz4KKyAgICA8ZmFpbCB1bmxlc3M9ImFwcC5jcmVhdGVkIj5ObyBhcHAgY3JlYXRlZDwvZmFpbD4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RJbnZhbGlkRXh0cmFPcHMiIGRlcGVuZHM9ImluaXQiPgorICAgIDx3c2RsdG9kb3RuZXQgZGVzdEZpbGU9IiR7b3V0LmNzY30iCisgICAgICBzcmNGaWxlPSIke2xvY2FsLndzZGx9IgorICAgICAgZXh0cmFPcHRpb25zPSIvbmV3T3B0aW9uOm5vdC1vbmUta25vd24tb2YiCisgICAgICAvPgorICA8L3RhcmdldD4KKworCisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RMb2NhbFdzZGxWQiIgZGVwZW5kcz0iaW5pdCIgaWY9InZiYy5mb3VuZCI+CisgICAgPHdzZGx0b2RvdG5ldCBkZXN0RmlsZT0iJHtvdXQudmJjfSIKKyAgICAgIGxhbmd1YWdlPSJWQiIKKyAgICAgIHNyY0ZpbGU9IiR7bG9jYWwud3NkbH0iCisgICAgICAvPgorICAgIDx2YmMgCisgICAgICBzcmNEaXI9IiR7c3JjLmRpcn0iCisgICAgICBkZXN0RmlsZT0iJHtvdXQuYXBwfSIKKyAgICAgIHRhcmdldFR5cGU9IiR7b3V0LnR5cGV9IgorICAgICAgcmVmZXJlbmNlcz0iJHt2Yi5yZWZlcmVuY2VzfSIKKyAgICAgID4KKyAgICAgIAorICAgICAgPC92YmM+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXBwLmNyZWF0ZWQiIGZpbGU9IiR7b3V0LmFwcH0iLz4KKyAgICA8ZmFpbCB1bmxlc3M9ImFwcC5jcmVhdGVkIj5ObyBhcHAgY3JlYXRlZDwvZmFpbD4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RMb2NhbFdzZGxTZXJ2ZXJWQiIgCisgICAgZGVwZW5kcz0iaW5pdCIgaWY9InZiYy5mb3VuZCI+CisgICAgPHdzZGx0b2RvdG5ldCBkZXN0RmlsZT0iJHtvdXQudmJjfSIKKyAgICAgIGxhbmd1YWdlPSJWQiIKKyAgICAgIHNyY0ZpbGU9IiR7bG9jYWwud3NkbH0iCisgICAgICBzZXJ2ZXI9InRydWUiCisgICAgICAvPgorICAgIDx2YmMgCisgICAgICBzcmNEaXI9IiR7c3JjLmRpcn0iCisgICAgICBkZXN0RmlsZT0iJHtvdXQuYXBwfSIKKyAgICAgIHRhcmdldFR5cGU9IiR7b3V0LnR5cGV9IiAKKyAgICAgIG9wdGlvbkV4cGxpY2l0PSJ0cnVlIgorICAgICAgb3B0aW9uU3RyaWN0PSJmYWxzZSIKKyAgICAgIG9wdGlvbkNvbXBhcmU9InRleHQiCisgICAgICByZWZlcmVuY2VzPSIke3ZiLnJlZmVyZW5jZXN9IgorICAgICAgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJhcHAuY3JlYXRlZCIgZmlsZT0iJHtvdXQuYXBwfSIvPgorICAgIDxmYWlsIHVubGVzcz0iYXBwLmNyZWF0ZWQiPk5vIGFwcCBjcmVhdGVkPC9mYWlsPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdEludmFsaWRFeHRyYU9wc1ZCIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8d3NkbHRvZG90bmV0IGRlc3RGaWxlPSIke291dC52YmN9IgorICAgICAgbGFuZ3VhZ2U9IlZCIgorICAgICAgc3JjRmlsZT0iJHtsb2NhbC53c2RsfSIKKyAgICAgIGV4dHJhT3B0aW9ucz0iL25ld09wdGlvbjpub3Qtb25lLWtub3duLW9mIgorICAgICAgLz4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9InRlc3RpZGVFcnJvcnNJZ25vcmVkV2hlbkZhbHNlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8d3NkbHRvZG90bmV0IGRlc3RGaWxlPSIke291dC5jc2N9IgorICAgICAgc3JjRmlsZT0iJHtsb2NhbC53c2RsfSIKKyAgICAgIGlkZUVycm9ycz0iZmFsc2UiCisgICAgICA+CisgICAgPC93c2RsdG9kb3RuZXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFNjaGVtYU11c3RCZVNldCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHdzZGx0b2RvdG5ldCBkZXN0RmlsZT0iJHtvdXQuY3NjfSIKKyAgICAgIHNyY0ZpbGU9IiR7bG9jYWwud3NkbH0iCisgICAgICA+CisgICAgICA8c2NoZW1hLz4KKyAgICA8L3dzZGx0b2RvdG5ldD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U2NoZW1hRmlsZU11c3RFeGlzdCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHdzZGx0b2RvdG5ldCBkZXN0RmlsZT0iJHtvdXQuY3NjfSIKKyAgICAgIHNyY0ZpbGU9IiR7bG9jYWwud3NkbH0iCisgICAgICA+CisgICAgICA8c2NoZW1hIGZpbGU9InRoaXMtZmlsZS1kb2VzLW5vdC1leGlzdC54c2QiLz4KKyAgICA8L3dzZGx0b2RvdG5ldD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U2NoZW1hRmlsZU11c3RIYXZlT25lT3B0aW9uT25seSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHdzZGx0b2RvdG5ldCBkZXN0RmlsZT0iJHtvdXQuY3NjfSIKKyAgICAgIHNyY0ZpbGU9IiR7bG9jYWwud3NkbH0iCisgICAgICA+CisgICAgICA8c2NoZW1hIGZpbGU9IldzZGxUb0RvdG5ldC54bWwiCisgICAgICAgIHVybD0iaHR0cDovL2FudC5hcGFjaGUub3JnL3htbC9BbnRTY2hlbWEueHNkIi8+CisgICAgPC93c2RsdG9kb3RuZXQ+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9hbnRsci5nIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjcyNDkzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIuZwpAQCAtMCwwICsxLDc2IEBACisvKgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitjbGFzcyBDYWxjUGFyc2VyIGV4dGVuZHMgUGFyc2VyOworb3B0aW9ucyB7CisJYnVpbGRBU1QgPSB0cnVlOwkvLyB1c2VzIENvbW1vbkFTVCBieSBkZWZhdWx0Cit9CisKK2V4cHIKKwk6CW1leHByIChQTFVTXiBtZXhwcikqIFNFTUkhCisJOworCittZXhwcgorCToJYXRvbSAoU1RBUl4gYXRvbSkqCisJOworCithdG9tOglJTlQKKwk7CisKK2NsYXNzIENhbGNMZXhlciBleHRlbmRzIExleGVyOworCitXUwk6CSgnICcKKwl8CSdcdCcKKwl8CSdcbicKKwl8CSdccicpCisJCXsgX3R0eXBlID0gVG9rZW4uU0tJUDsgfQorCTsKKworTFBBUkVOOgknKCcKKwk7CisKK1JQQVJFTjoJJyknCisJOworCitTVEFSOgknKicKKwk7CisKK1BMVVM6CScrJworCTsKKworU0VNSToJJzsnCisJOworCitwcm90ZWN0ZWQKK0RJR0lUCisJOgknMCcuLic5JworCTsKKworSU5UCToJKERJR0lUKSsKKwk7CisKK2NsYXNzIENhbGNUcmVlV2Fsa2VyIGV4dGVuZHMgVHJlZVBhcnNlcjsKKworZXhwciByZXR1cm5zIFtmbG9hdCByXQoreworCWZsb2F0IGEsYjsKKwlyPTA7Cit9CisJOgkjKFBMVVMgYT1leHByIGI9ZXhwcikJe3IgPSBhK2I7fQorCXwJIyhTVEFSIGE9ZXhwciBiPWV4cHIpCXtyID0gYSpiO30KKwl8CWk6SU5UCQkJe3IgPSAoZmxvYXQpSW50ZWdlci5wYXJzZUludChpLmdldFRleHQoKSk7fQorCTsKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwN2ExOGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9hbnRsci54bWwKQEAgLTAsMCArMSwxMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJhbnRsci10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHByb3BlcnR5IG5hbWU9InRtcC5kaXIiIGxvY2F0aW9uPSJhbnRsci50bXAiLz4KKworCisgIDx0YXJnZXQgbmFtZT0ic2V0dXAiPgorICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGFudGxyLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPGFudGxyIHRhcmdldD0iYW50bHIuZyIgb3V0cHV0ZGlyZWN0b3J5PSIke3RtcC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8YW50bHIgdGFyZ2V0PSJhbnRsci5nIiBvdXRwdXRkaXJlY3Rvcnk9IiR7dG1wLmRpcn0iLz4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDwhLS0gdG8gcHJvdmUgZWFjaCBvZiB0aGVzZSBmaWxlcyBleGlzdHM7CisgICAgICAgICAgICAgQU5UTFIgPj0gMi43LjYgbGVhdmVzIGJlaGluZCBuZXcgKC5zbWFwKSBmaWxlcyBhcyB3ZWxsLiAtLT4KKyAgICAgICAgPHJlc291cmNlY291bnQgd2hlbj0ibmUiIGNvdW50PSI1Ij4KKyAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wLmRpcn0iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iQ2FsY1BhcnNlclRva2VuVHlwZXMudHh0IiAvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iQ2FsY1BhcnNlclRva2VuVHlwZXMuamF2YSIgLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGNMZXhlci5qYXZhIiAvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iQ2FsY1BhcnNlci5qYXZhIiAvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iQ2FsY1RyZWVXYWxrZXIuamF2YSIgLz4KKyAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxhbnRsciB0YXJnZXQ9ImphdmEuZyIgb3V0cHV0ZGlyZWN0b3J5PSIke3RtcC5kaXJ9Ii8+CisgICAgPGFudGxyIGRpcj0iJHt0bXAuZGlyfSIgdGFyZ2V0PSJqYXZhLnRyZWUuZyIgb3V0cHV0ZGlyZWN0b3J5PSIke3RtcC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8YW50bHIgdGFyZ2V0PSJqYXZhLnRyZWUuZyIgb3V0cHV0ZGlyZWN0b3J5PSIke3RtcC5kaXJ9IiBmb3JrPSJ5ZXMiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NiIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxhbnRsciB0YXJnZXQ9ImphdmEuZyIgb3V0cHV0ZGlyZWN0b3J5PSIke3RtcC5kaXJ9IiAvPgorICAgIDxhbnRsciBkaXI9IiR7dG1wLmRpcn0iCisgICAgICAgICAgIHRhcmdldD0iamF2YS50cmVlLmciCisgICAgICAgICAgIG91dHB1dGRpcmVjdG9yeT0iJHt0bXAuZGlyfSIKKyAgICAgICAgICAgZm9yaz0ieWVzIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDciPgorICAgIDxhbnRsciB0YXJnZXQ9ImFudGxyLnhtbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q4IiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGFudGxyIHRhcmdldD0iZXh0ZW5kZWQuY2FsYy5nIiBvdXRwdXRkaXJlY3Rvcnk9IiR7dG1wLmRpcn0iIGdsaWI9Im5vbi1leGlzdGFudC1maWxlLmciLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDwhLS0gTm90ZSB0aGF0IEkgaGFkIHRvIGNvcHkgdGhlIGdyYW1tYXJzIG92ZXIgdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuICAtLT4KKyAgICA8IS0tIFRoaXMgaXMgYmVjYXVzZSBBTlRMUiBleHBlY3RzIHRoZSBzdXBlciBncmFtbWFyIGFuZCBpdHMgZ2VuZXJhdGVkIGphdmEgLS0+CisgICAgPCEtLSBmaWxlcyB0byBiZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIHdoaWNoIHdvbid0IGJlIHRoZSBjYXNlIGlmIEkgdXNlICAgIC0tPgorICAgIDwhLS0gdGhlIG91dHB1dCBkaXJlY3Rvcnkgb3B0aW9uLiAtLT4KKyAgICA8Y29weSBmaWxlPSJhbnRsci5nIiB0b2Rpcj0iJHt0bXAuZGlyfSIvPgorICAgIDxjb3B5IGZpbGU9ImV4dGVuZGVkLmNhbGMuZyIgdG9kaXI9IiR7dG1wLmRpcn0iLz4KKyAgICA8YW50bHIgdGFyZ2V0PSIke3RtcC5kaXJ9L2FudGxyLmciLz4KKyAgICA8YW50bHIgdGFyZ2V0PSIke3RtcC5kaXJ9L2V4dGVuZGVkLmNhbGMuZyIgZ2xpYj0iJHt0bXAuZGlyfS9hbnRsci5nIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEwIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGFudGxyIHRhcmdldD0iYW50bHIuZyIgb3V0cHV0ZGlyZWN0b3J5PSIke3RtcC5kaXJ9IiBodG1sPSJ5ZXMiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MTEiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8YW50bHIgdGFyZ2V0PSJhbnRsci5nIiBvdXRwdXRkaXJlY3Rvcnk9IiR7dG1wLmRpcn0iIGRpYWdub3N0aWM9InllcyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxMiIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxhbnRsciB0YXJnZXQ9ImFudGxyLmciIG91dHB1dGRpcmVjdG9yeT0iJHt0bXAuZGlyfSIgdHJhY2U9InllcyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxMyIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxhbnRsciB0YXJnZXQ9ImFudGxyLmciIG91dHB1dGRpcmVjdG9yeT0iJHt0bXAuZGlyfSIgdHJhY2VMZXhlcj0ieWVzIiB0cmFjZVBhcnNlcj0ieWVzIiB0cmFjZVRyZWVXYWxrZXI9InllcyIvPgorICA8L3RhcmdldD4KKworICA8IS0tIHRlc3Q5IHdpbGwgaGF2ZSBiZWVuIHJ1biBiZWZvcmUgdGhhdCAtLT4KKyAgPHRhcmdldCBuYW1lPSJub1JlY29tcGlsZSI+CisgICAgPGFudGxyIHRhcmdldD0iJHt0bXAuZGlyfS9leHRlbmRlZC5jYWxjLmciIGdsaWI9IiR7dG1wLmRpcn0vYW50bHIuZyIvPgorICA8L3RhcmdldD4KKworICA8IS0tIHRlc3Q5IHdpbGwgaGF2ZSBiZWVuIHJ1biBiZWZvcmUgdGhhdCAtLT4KKyAgPHRhcmdldCBuYW1lPSJub3JtYWxSZWNvbXBpbGUiPgorICAgIDxzbGVlcCBzZWNvbmRzPSIyIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7dG1wLmRpcn0vZXh0ZW5kZWQuY2FsYy5nIi8+CisgICAgPGFudGxyIHRhcmdldD0iJHt0bXAuZGlyfS9leHRlbmRlZC5jYWxjLmciIGdsaWI9IiR7dG1wLmRpcn0vYW50bHIuZyIvPgorICA8L3RhcmdldD4KKworICA8IS0tIHRlc3Q5IHdpbGwgaGF2ZSBiZWVuIHJ1biBiZWZvcmUgdGhhdCAtLT4KKyAgPHRhcmdldCBuYW1lPSJzdXBlcmdyYW1tYXJDaGFuZ2VSZWNvbXBpbGUiPgorICAgIDxzbGVlcCBzZWNvbmRzPSIyIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7dG1wLmRpcn0vYW50bHIuZyIvPgorICAgIDxhbnRsciB0YXJnZXQ9IiR7dG1wLmRpcn0vZXh0ZW5kZWQuY2FsYy5nIiBnbGliPSIke3RtcC5kaXJ9L2FudGxyLmciLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0bXAuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9Ii4uLy4uLy4uLy4uLy4uLy4uL0NhbGNQYXJzZXJUb2tlblR5cGVzLnR4dCIvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvZXh0ZW5kZWQuY2FsYy5nIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvZXh0ZW5kZWQuY2FsYy5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzE5OTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9leHRlbmRlZC5jYWxjLmcKQEAgLTAsMCArMSwyMyBAQAorLyoKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLy8gTm90IHJlYWxseSBhIGdyZWF0IGV4dGVuc2lvbiwgYnV0IGl0IGlzIG9ubHkgYSB0ZXN0IGFmdGVyIGFsbCEKKworY2xhc3MgRXh0ZW5kZWRDYWxjUGFyc2VyIGV4dGVuZHMgQ2FsY1BhcnNlcjsKKworZXhwckxpc3QKKyAgICA6IExQQVJFTiAoZXhwcikqIFJQQVJFTgorICAgIDsKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2phdmEuZyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2phdmEuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTg1NzUwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvamF2YS5nCkBAIC0wLDAgKzEsMTE2MiBAQAorLyoqIEphdmEgMS4yIFJlY29nbml6ZXIKKyAqCisgKiBSdW4gJ2phdmEgTWFpbiA8ZGlyZWN0b3J5IGZ1bGwgb2YgamF2YSBmaWxlcz4nCisgKgorICogQ29udHJpYnV0aW5nIGF1dGhvcnM6CisgKgkJSm9obiBNaXRjaGVsbAkJam9obm1Abm9uLm5ldAorICoJCVRlcmVuY2UgUGFycgkJcGFycnRAbWFnZWxhbmcuY29tCisgKgkJSm9obiBMaWxsZXkJCQlqbGlsbGV5QGVtcGF0aHkuY29tCisgKgkJU2NvdHQgU3RhbmNoZmllbGQJdGhldGlja0BtYWdlbGFuZy5jb20KKyAqCQlNYXJrdXMgTW9obmVuICAgICAgIG1vaG5lbkBpbmZvcm1hdGlrLnJ3dGgtYWFjaGVuLmRlCisgKgkJUGV0ZXIgV2lsbGlhbXMJCXB3aWxsaWFtc0BuZXRkeW5hbWljcy5jb20KKyAqCisgKiBWZXJzaW9uIDEuMDAgRGVjZW1iZXIgOSwgMTk5NyAtLSBpbml0aWFsIHJlbGVhc2UKKyAqIFZlcnNpb24gMS4wMSBEZWNlbWJlciAxMCwgMTk5NworICoJCWZpeGVkIGJ1ZyBpbiBvY3RhbCBkZWYgKDAuLjcgbm90IDAuLjgpCisgKiBWZXJzaW9uIDEuMTAgQXVndXN0IDE5OTggKHBhcnJ0KQorICoJCWFkZGVkIHRyZWUgY29uc3RydWN0aW9uCisgKgkJZml4ZWQgZGVmaW5pdGlvbiBvZiBXUyxjb21tZW50cyBmb3IgbWFjLHBjLHVuaXggbmV3bGluZXMKKyAqCQlhZGRlZCB1bmFyeSBwbHVzCisgKiBWZXJzaW9uIDEuMTEgKE5vdiAyMCwgMTk5OCkKKyAqCQlBZGRlZCAic2h1dHVwIiBvcHRpb24gdG8gdHVybiBvZmYgbGFzdCBhbWJpZyB3YXJuaW5nLgorICoJCUZpeGVkIGlubmVyIGNsYXNzIGRlZiB0byBhbGxvdyBuYW1lZCBjbGFzcyBkZWZzIGFzIHN0YXRlbWVudHMKKyAqCQlzeW5jaHJvbml6ZWQgcmVxdWlyZXMgY29tcG91bmQgbm90IHNpbXBsZSBzdGF0ZW1lbnQKKyAqCQlhZGQgW10gYWZ0ZXIgYnVpbHRJblR5cGUgRE9UIGNsYXNzIGluIHByaW1hcnlFeHByZXNzaW9uCisgKgkJImNvbnN0IiBpcyByZXNlcnZlZCBidXQgbm90IHZhbGlkLi5yZW1vdmVkIGZyb20gbW9kaWZpZXJzCisgKiBWZXJzaW9uIDEuMTIgKEZlYiAyLCAxOTk5KQorICoJCUNoYW5nZWQgTElURVJBTF94eHggdG8geHh4IGluIHRyZWUgZ3JhbW1hci4KKyAqCQlVcGRhdGVkIGphdmEuZyB0byB1c2UgdG9rZW5zIHsuLi59IG5vdyBmb3IgMi42LjAgKG5ldyBmZWF0dXJlKS4KKyAqCisgKiBWZXJzaW9uIDEuMTMgKEFwciAyMywgMTk5OSkKKyAqCQlEaWRuJ3QgaGF2ZSAoc3RhdCk/IGZvciBlbHNlIGNsYXVzZSBpbiB0cmVlIHBhcnNlci4KKyAqCQlEaWRuJ3QgZ2VuIEFTVHMgZm9yIGludGVyZmFjZSBleHRlbmRzLiAgVXBkYXRlZCB0cmVlIHBhcnNlciB0b28uCisgKgkJVXBkYXRlZCB0byAyLjYuMC4KKyAqIFZlcnNpb24gMS4xNCAoSnVuIDIwLCAxOTk5KQorICoJCUFsbG93ZWQgZmluYWwvYWJzdHJhY3Qgb24gbG9jYWwgY2xhc3Nlcy4KKyAqCQlSZW1vdmVkIGxvY2FsIGludGVyZmFjZXMgZnJvbSBtZXRob2RzCisgKgkJUHV0IGluc3RhbmNlb2YgcHJlY2VkZW5jZSB3aGVyZSBpdCBiZWxvbmdzLi4uaW4gcmVsYXRpb25hbEV4cHIKKyAqCQkJSXQgYWxzbyBoYWQgZXhwciBub3QgdHlwZSBhcyBhcmc7IGZpeGVkIGl0LgorICoJCU1pc3NpbmcgISBvbiBTRU1JIGluIGNsYXNzQmxvY2sKKyAqCQlmaXhlZDogKGV4cHIpICsgInN0cmluZyIgd2FzIHBhcnNlZCBpbmNvcnJlY3RseSAoKyBhcyB1bmFyeSBwbHVzKS4KKyAqCQlmaXhlZDogZGlkbid0IGxpa2UgT2JqZWN0W10uY2xhc3MgaW4gcGFyc2VyIG9yIHRyZWUgcGFyc2VyCisgKiBWZXJzaW9uIDEuMTUgKEp1biAyNiwgMTk5OSkKKyAqCQlTY3Jld2VkIHVwIHJ1bGUgd2l0aCBpbnN0YW5jZW9mIGluIGl0LiA6KCAgRml4ZWQuCisgKgkJVHJlZSBwYXJzZXIgZGlkbid0IGxpa2UgKGV4cHIpLnNvbWV0aGluZzsgZml4ZWQuCisgKgkJQWxsb3dlZCBtdWx0aXBsZSBpbmhlcml0YW5jZSBpbiB0cmVlIGdyYW1tYXIuIG9vcHMuCisgKiBWZXJzaW9uIDEuMTYgKEF1Z3VzdCAyMiwgMTk5OSkKKyAqCQlFeHRlbmRpbmcgYW4gaW50ZXJmYWNlIGJ1aWx0IGEgd2Fja3kgdHJlZTogaGFkIGV4dHJhIEVYVEVORFMuCisgKgkJVHJlZSBncmFtbWFyIGRpZG4ndCBhbGxvdyBtdWx0aXBsZSBzdXBlcmludGVyZmFjZXMuCisgKgkJVHJlZSBncmFtbWFyIGRpZG4ndCBhbGxvdyBlbXB0eSB2YXIgaW5pdGlhbGl6ZXI6IHt9CisgKiBWZXJzaW9uIDEuMTcgKE9jdG9iZXIgMTIsIDE5OTkpCisgKgkJRVNDIGxleGVyIHJ1bGUgYWxsb3dlZCAzOTkgbWF4IG5vdCAzNzcgbWF4LgorICoJCWphdmEudHJlZS5nIGRpZG4ndCBoYW5kbGUgdGhlIGV4cHJlc3Npb24gb2Ygc3luY2hyb25pemVkCisgKgkJCXN0YXRlbWVudHMuCisgKgorICogQlVHOgorICogCQlEb2Vzbid0IGxpa2UgYm9vbGVhbi5jbGFzcyEKKyAqCisgKiBjbGFzcyBUZXN0IHsKKyAqICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZyBhcmdzW10gKSB7CisgKiAgICAgaWYgKGJvb2xlYW4uY2xhc3MuZXF1YWxzKGJvb2xlYW4uY2xhc3MpKSB7CisgKiAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIndvcmtzIik7CisgKiAgICAgfQorICogICB9CisgKiB9CisgKgorICogVGhpcyBncmFtbWFyIGlzIGluIHRoZSBQVUJMSUMgRE9NQUlOCisgKi8KK2NsYXNzIEphdmFSZWNvZ25pemVyIGV4dGVuZHMgUGFyc2VyOworb3B0aW9ucyB7CisJayA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHdvIHRva2VuIGxvb2thaGVhZAorCWV4cG9ydFZvY2FiPUphdmE7ICAgICAgICAgICAgICAgIC8vIENhbGwgaXRzIHZvY2FidWxhcnkgIkphdmEiCisJY29kZUdlbk1ha2VTd2l0Y2hUaHJlc2hvbGQgPSAyOyAgLy8gU29tZSBvcHRpbWl6YXRpb25zCisJY29kZUdlbkJpdHNldFRlc3RUaHJlc2hvbGQgPSAzOworCWRlZmF1bHRFcnJvckhhbmRsZXIgPSBmYWxzZTsgICAgIC8vIERvbid0IGdlbmVyYXRlIHBhcnNlciBlcnJvciBoYW5kbGVycworCWJ1aWxkQVNUID0gdHJ1ZTsKK30KKwordG9rZW5zIHsKKwlCTE9DSzsgTU9ESUZJRVJTOyBPQkpCTE9DSzsgU0xJU1Q7IENUT1JfREVGOyBNRVRIT0RfREVGOyBWQVJJQUJMRV9ERUY7IAorCUlOU1RBTkNFX0lOSVQ7IFNUQVRJQ19JTklUOyBUWVBFOyBDTEFTU19ERUY7IElOVEVSRkFDRV9ERUY7IAorCVBBQ0tBR0VfREVGOyBBUlJBWV9ERUNMQVJBVE9SOyBFWFRFTkRTX0NMQVVTRTsgSU1QTEVNRU5UU19DTEFVU0U7CisJUEFSQU1FVEVSUzsgUEFSQU1FVEVSX0RFRjsgTEFCRUxFRF9TVEFUOyBUWVBFQ0FTVDsgSU5ERVhfT1A7IAorCVBPU1RfSU5DOyBQT1NUX0RFQzsgTUVUSE9EX0NBTEw7IEVYUFI7IEFSUkFZX0lOSVQ7IAorCUlNUE9SVDsgVU5BUllfTUlOVVM7IFVOQVJZX1BMVVM7IENBU0VfR1JPVVA7IEVMSVNUOyBGT1JfSU5JVDsgRk9SX0NPTkRJVElPTjsgCisJRk9SX0lURVJBVE9SOyBFTVBUWV9TVEFUOyBGSU5BTD0iZmluYWwiOyBBQlNUUkFDVD0iYWJzdHJhY3QiOworfQorCQorLy8gQ29tcGlsYXRpb24gVW5pdDogSW4gSmF2YSwgdGhpcyBpcyBhIHNpbmdsZSBmaWxlLiAgVGhpcyBpcyB0aGUgc3RhcnQKKy8vICAgcnVsZSBmb3IgdGhpcyBwYXJzZXIKK2NvbXBpbGF0aW9uVW5pdAorCToJLy8gQSBjb21waWxhdGlvbiB1bml0IHN0YXJ0cyB3aXRoIGFuIG9wdGlvbmFsIHBhY2thZ2UgZGVmaW5pdGlvbgorCQkoCXBhY2thZ2VEZWZpbml0aW9uCisJCXwJLyogbm90aGluZyAqLworCQkpCisKKwkJLy8gTmV4dCB3ZSBoYXZlIGEgc2VyaWVzIG9mIHplcm8gb3IgbW9yZSBpbXBvcnQgc3RhdGVtZW50cworCQkoIGltcG9ydERlZmluaXRpb24gKSoKKworCQkvLyBXcmFwcGluZyB0aGluZ3MgdXAgd2l0aCBhbnkgbnVtYmVyIG9mIGNsYXNzIG9yIGludGVyZmFjZQorCQkvLyAgICBkZWZpbml0aW9ucworCQkoIHR5cGVEZWZpbml0aW9uICkqCisKKwkJRU9GIQorCTsKKworCisvLyBQYWNrYWdlIHN0YXRlbWVudDogInBhY2thZ2UiIGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXIuCitwYWNrYWdlRGVmaW5pdGlvbgorCW9wdGlvbnMge2RlZmF1bHRFcnJvckhhbmRsZXIgPSB0cnVlO30gLy8gbGV0IEFOVExSIGhhbmRsZSBlcnJvcnMKKwk6CXA6InBhY2thZ2UiXiB7I3Auc2V0VHlwZShQQUNLQUdFX0RFRik7fSBpZGVudGlmaWVyIFNFTUkhCisJOworCisKKy8vIEltcG9ydCBzdGF0ZW1lbnQ6IGltcG9ydCBmb2xsb3dlZCBieSBhIHBhY2thZ2Ugb3IgY2xhc3MgbmFtZQoraW1wb3J0RGVmaW5pdGlvbgorCW9wdGlvbnMge2RlZmF1bHRFcnJvckhhbmRsZXIgPSB0cnVlO30KKwk6CWk6ImltcG9ydCJeIHsjaS5zZXRUeXBlKElNUE9SVCk7fSBpZGVudGlmaWVyU3RhciBTRU1JIQorCTsKKworLy8gQSB0eXBlIGRlZmluaXRpb24gaW4gYSBmaWxlIGlzIGVpdGhlciBhIGNsYXNzIG9yIGludGVyZmFjZSBkZWZpbml0aW9uLgordHlwZURlZmluaXRpb24KKwlvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9CisJOgltOm1vZGlmaWVycyEKKwkJKCBjbGFzc0RlZmluaXRpb25bI21dCisJCXwgaW50ZXJmYWNlRGVmaW5pdGlvblsjbV0KKwkJKQorCXwJU0VNSSEKKwk7CisKKy8qKiBBIGRlY2xhcmF0aW9uIGlzIHRoZSBjcmVhdGlvbiBvZiBhIHJlZmVyZW5jZSBvciBwcmltaXRpdmUtdHlwZSB2YXJpYWJsZQorICogIENyZWF0ZSBhIHNlcGFyYXRlIFR5cGUvVmFyIHRyZWUgZm9yIGVhY2ggdmFyIGluIHRoZSB2YXIgbGlzdC4KKyAqLworZGVjbGFyYXRpb24hCisJOgltOm1vZGlmaWVycyB0OnR5cGVTcGVjW2ZhbHNlXSB2OnZhcmlhYmxlRGVmaW5pdGlvbnNbI20sI3RdCisJCXsjZGVjbGFyYXRpb24gPSAjdjt9CisJOworCisvLyBBIGxpc3Qgb2YgemVybyBvciBtb3JlIG1vZGlmaWVycy4gIFdlIGNvdWxkIGhhdmUgdXNlZCAobW9kaWZpZXIpKiBpbgorLy8gICBwbGFjZSBvZiBhIGNhbGwgdG8gbW9kaWZpZXJzLCBidXQgSSB0aG91Z2h0IGl0IHdhcyBhIGdvb2QgaWRlYSB0byBrZWVwCisvLyAgIHRoaXMgcnVsZSBzZXBhcmF0ZSBzbyB0aGV5IGNhbiBlYXNpbHkgYmUgY29sbGVjdGVkIGluIGEgVmVjdG9yIGlmCisvLyAgIHNvbWVvbmUgc28gZGVzaXJlcworbW9kaWZpZXJzCisJOgkoIG1vZGlmaWVyICkqCisJCXsjbW9kaWZpZXJzID0gIyhbTU9ESUZJRVJTLCAiTU9ESUZJRVJTIl0sICNtb2RpZmllcnMpO30KKwk7CisKKworLy8gQSB0eXBlIHNwZWNpZmljYXRpb24gaXMgYSB0eXBlIG5hbWUgd2l0aCBwb3NzaWJsZSBicmFja2V0cyBhZnRlcndhcmRzCisvLyAgICh3aGljaCB3b3VsZCBtYWtlIGl0IGFuIGFycmF5IHR5cGUpLgordHlwZVNwZWNbYm9vbGVhbiBhZGRJbWFnTm9kZV0KKwk6IGNsYXNzVHlwZVNwZWNbYWRkSW1hZ05vZGVdCisJfCBidWlsdEluVHlwZVNwZWNbYWRkSW1hZ05vZGVdCisJOworCisvLyBBIGNsYXNzIHR5cGUgc3BlY2lmaWNhdGlvbiBpcyBhIGNsYXNzIHR5cGUgd2l0aCBwb3NzaWJsZSBicmFja2V0cyBhZnRlcndhcmRzCisvLyAgICh3aGljaCB3b3VsZCBtYWtlIGl0IGFuIGFycmF5IHR5cGUpLgorY2xhc3NUeXBlU3BlY1tib29sZWFuIGFkZEltYWdOb2RlXQorCToJaWRlbnRpZmllciAobGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shKSoKKwkJeworCQkJaWYgKCBhZGRJbWFnTm9kZSApIHsKKwkJCQkjY2xhc3NUeXBlU3BlYyA9ICMoI1tUWVBFLCJUWVBFIl0sICNjbGFzc1R5cGVTcGVjKTsKKwkJCX0KKwkJfQorCTsKKworLy8gQSBidWlsdGluIHR5cGUgc3BlY2lmaWNhdGlvbiBpcyBhIGJ1aWx0aW4gdHlwZSB3aXRoIHBvc3NpYmxlIGJyYWNrZXRzCisvLyBhZnRlcndhcmRzICh3aGljaCB3b3VsZCBtYWtlIGl0IGFuIGFycmF5IHR5cGUpLgorYnVpbHRJblR5cGVTcGVjW2Jvb2xlYW4gYWRkSW1hZ05vZGVdCisJOglidWlsdEluVHlwZSAobGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shKSoKKwkJeworCQkJaWYgKCBhZGRJbWFnTm9kZSApIHsKKwkJCQkjYnVpbHRJblR5cGVTcGVjID0gIygjW1RZUEUsIlRZUEUiXSwgI2J1aWx0SW5UeXBlU3BlYyk7CisJCQl9CisJCX0KKwk7CisKKy8vIEEgdHlwZSBuYW1lLiB3aGljaCBpcyBlaXRoZXIgYSAocG9zc2libHkgcXVhbGlmaWVkKSBjbGFzcyBuYW1lIG9yCisvLyAgIGEgcHJpbWl0aXZlIChidWlsdGluKSB0eXBlCit0eXBlCisJOglpZGVudGlmaWVyCisJfAlidWlsdEluVHlwZQorCTsKKworLy8gVGhlIHByaW1pdGl2ZSB0eXBlcy4KK2J1aWx0SW5UeXBlCisJOgkidm9pZCIKKwl8CSJib29sZWFuIgorCXwJImJ5dGUiCisJfAkiY2hhciIKKwl8CSJzaG9ydCIKKwl8CSJpbnQiCisJfAkiZmxvYXQiCisJfAkibG9uZyIKKwl8CSJkb3VibGUiCisJOworCisvLyBBIChwb3NzaWJseS1xdWFsaWZpZWQpIGphdmEgaWRlbnRpZmllci4gIFdlIHN0YXJ0IHdpdGggdGhlIGZpcnN0IElERU5UCisvLyAgIGFuZCBleHBhbmQgaXRzIG5hbWUgYnkgYWRkaW5nIGRvdHMgYW5kIGZvbGxvd2luZyBJREVOVFMKK2lkZW50aWZpZXIKKwk6CUlERU5UICAoIERPVF4gSURFTlQgKSoKKwk7CisKK2lkZW50aWZpZXJTdGFyCisJOglJREVOVAorCQkoIERPVF4gSURFTlQgKSoKKwkJKCBET1ReIFNUQVIgICk/CisJOworCisKKy8vIG1vZGlmaWVycyBmb3IgSmF2YSBjbGFzc2VzLCBpbnRlcmZhY2VzLCBjbGFzcy9pbnN0YW5jZSB2YXJzIGFuZCBtZXRob2RzCittb2RpZmllcgorCToJInByaXZhdGUiCisJfAkicHVibGljIgorCXwJInByb3RlY3RlZCIKKwl8CSJzdGF0aWMiCisJfAkidHJhbnNpZW50IgorCXwJImZpbmFsIgorCXwJImFic3RyYWN0IgorCXwJIm5hdGl2ZSIKKwl8CSJ0aHJlYWRzYWZlIgorCXwJInN5bmNocm9uaXplZCIKKy8vCXwJImNvbnN0IgkJCS8vIHJlc2VydmVkIHdvcmQ7IGxlYXZlIG91dAorCXwJInZvbGF0aWxlIgorCTsKKworCisvLyBEZWZpbml0aW9uIG9mIGEgSmF2YSBjbGFzcworY2xhc3NEZWZpbml0aW9uIVtBU1QgbW9kaWZpZXJzXQorCToJImNsYXNzIiBJREVOVAorCQkvLyBpdCBfbWlnaHRfIGhhdmUgYSBzdXBlcmNsYXNzLi4uCisJCXNjOnN1cGVyQ2xhc3NDbGF1c2UKKwkJLy8gaXQgbWlnaHQgaW1wbGVtZW50IHNvbWUgaW50ZXJmYWNlcy4uLgorCQlpYzppbXBsZW1lbnRzQ2xhdXNlCisJCS8vIG5vdyBwYXJzZSB0aGUgYm9keSBvZiB0aGUgY2xhc3MKKwkJY2I6Y2xhc3NCbG9jaworCQl7I2NsYXNzRGVmaW5pdGlvbiA9ICMoI1tDTEFTU19ERUYsIkNMQVNTX0RFRiJdLAorCQkJCQkJCSAgIG1vZGlmaWVycyxJREVOVCxzYyxpYyxjYik7fQorCTsKKworc3VwZXJDbGFzc0NsYXVzZSEKKwk6CSggImV4dGVuZHMiIGlkOmlkZW50aWZpZXIgKT8KKwkJeyNzdXBlckNsYXNzQ2xhdXNlID0gIygjW0VYVEVORFNfQ0xBVVNFLCJFWFRFTkRTX0NMQVVTRSJdLGlkKTt9CisJOworCisvLyBEZWZpbml0aW9uIG9mIGEgSmF2YSBJbnRlcmZhY2UKK2ludGVyZmFjZURlZmluaXRpb24hW0FTVCBtb2RpZmllcnNdCisJOgkiaW50ZXJmYWNlIiBJREVOVAorCQkvLyBpdCBtaWdodCBleHRlbmQgc29tZSBvdGhlciBpbnRlcmZhY2VzCisJCWllOmludGVyZmFjZUV4dGVuZHMKKwkJLy8gbm93IHBhcnNlIHRoZSBib2R5IG9mIHRoZSBpbnRlcmZhY2UgKGxvb2tzIGxpa2UgYSBjbGFzcy4uLikKKwkJY2I6Y2xhc3NCbG9jaworCQl7I2ludGVyZmFjZURlZmluaXRpb24gPSAjKCNbSU5URVJGQUNFX0RFRiwiSU5URVJGQUNFX0RFRiJdLAorCQkJCQkJCQkJbW9kaWZpZXJzLElERU5ULGllLGNiKTt9CisJOworCisKKy8vIFRoaXMgaXMgdGhlIGJvZHkgb2YgYSBjbGFzcy4gIFlvdSBjYW4gaGF2ZSBmaWVsZHMgYW5kIGV4dHJhIHNlbWljb2xvbnMsCisvLyBUaGF0J3MgYWJvdXQgaXQgKHVudGlsIHlvdSBzZWUgd2hhdCBhIGZpZWxkIGlzLi4uKQorY2xhc3NCbG9jaworCToJTENVUkxZIQorCQkJKCBmaWVsZCB8IFNFTUkhICkqCisJCVJDVVJMWSEKKwkJeyNjbGFzc0Jsb2NrID0gIyhbT0JKQkxPQ0ssICJPQkpCTE9DSyJdLCAjY2xhc3NCbG9jayk7fQorCTsKKworLy8gQW4gaW50ZXJmYWNlIGNhbiBleHRlbmQgc2V2ZXJhbCBvdGhlciBpbnRlcmZhY2VzLi4uCitpbnRlcmZhY2VFeHRlbmRzCisJOgkoCisJCWU6ImV4dGVuZHMiIQorCQlpZGVudGlmaWVyICggQ09NTUEhIGlkZW50aWZpZXIgKSoKKwkJKT8KKwkJeyNpbnRlcmZhY2VFeHRlbmRzID0gIygjW0VYVEVORFNfQ0xBVVNFLCJFWFRFTkRTX0NMQVVTRSJdLAorCQkJCQkJCSNpbnRlcmZhY2VFeHRlbmRzKTt9CisJOworCisvLyBBIGNsYXNzIGNhbiBpbXBsZW1lbnQgc2V2ZXJhbCBpbnRlcmZhY2VzLi4uCitpbXBsZW1lbnRzQ2xhdXNlCisJOgkoCisJCQlpOiJpbXBsZW1lbnRzIiEgaWRlbnRpZmllciAoIENPTU1BISBpZGVudGlmaWVyICkqCisJCSk/CisJCXsjaW1wbGVtZW50c0NsYXVzZSA9ICMoI1tJTVBMRU1FTlRTX0NMQVVTRSwiSU1QTEVNRU5UU19DTEFVU0UiXSwKKwkJCQkJCQkJICNpbXBsZW1lbnRzQ2xhdXNlKTt9CisJOworCisvLyBOb3cgdGhlIHZhcmlvdXMgdGhpbmdzIHRoYXQgY2FuIGJlIGRlZmluZWQgaW5zaWRlIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLi4uCisvLyBOb3RlIHRoYXQgbm90IGFsbCBvZiB0aGVzZSBhcmUgcmVhbGx5IHZhbGlkIGluIGFuIGludGVyZmFjZSAoY29uc3RydWN0b3JzLAorLy8gICBmb3IgZXhhbXBsZSksIGFuZCBpZiB0aGlzIGdyYW1tYXIgd2VyZSB1c2VkIGZvciBhIGNvbXBpbGVyIHRoZXJlIHdvdWxkCisvLyAgIG5lZWQgdG8gYmUgc29tZSBzZW1hbnRpYyBjaGVja3MgdG8gbWFrZSBzdXJlIHdlJ3JlIGRvaW5nIHRoZSByaWdodCB0aGluZy4uLgorZmllbGQhCisJOgkvLyBtZXRob2QsIGNvbnN0cnVjdG9yLCBvciB2YXJpYWJsZSBkZWNsYXJhdGlvbgorCQltb2RzOm1vZGlmaWVycworCQkoCWg6Y3RvckhlYWQgczpjb21wb3VuZFN0YXRlbWVudCAvLyBjb25zdHJ1Y3RvcgorCQkJeyNmaWVsZCA9ICMoI1tDVE9SX0RFRiwiQ1RPUl9ERUYiXSwgbW9kcywgaCwgcyk7fQorCisJCXwJY2Q6Y2xhc3NEZWZpbml0aW9uWyNtb2RzXSAgICAgICAvLyBpbm5lciBjbGFzcworCQkJeyNmaWVsZCA9ICNjZDt9CisJCQkKKwkJfAlpZDppbnRlcmZhY2VEZWZpbml0aW9uWyNtb2RzXSAgIC8vIGlubmVyIGludGVyZmFjZQorCQkJeyNmaWVsZCA9ICNpZDt9CisKKwkJfAl0OnR5cGVTcGVjW2ZhbHNlXSAgLy8gbWV0aG9kIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9uKHMpCisJCQkoCUlERU5UICAvLyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCisKKwkJCQkvLyBwYXJzZSB0aGUgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCisJCQkJTFBBUkVOISBwYXJhbTpwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgUlBBUkVOIQorCisJCQkJcnQ6cmV0dXJuVHlwZUJyYWNrZXJzT25FbmRPZk1ldGhvZEhlYWRbI3RdCisKKwkJCQkvLyBnZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IHRoaXMgbWV0aG9kIGlzIGRlY2xhcmVkIHRvIHRocm93CisJCQkJKHRjOnRocm93c0NsYXVzZSk/CisKKwkJCQkoIHMyOmNvbXBvdW5kU3RhdGVtZW50IHwgU0VNSSApCisJCQkJeyNmaWVsZCA9ICMoI1tNRVRIT0RfREVGLCJNRVRIT0RfREVGIl0sCisJCQkJCQkgICAgIG1vZHMsCisJCQkJCQkJICMoI1tUWVBFLCJUWVBFIl0scnQpLAorCQkJCQkJCSBJREVOVCwKKwkJCQkJCQkgcGFyYW0sCisJCQkJCQkJIHRjLAorCQkJCQkJCSBzMik7fQorCQkJfAl2OnZhcmlhYmxlRGVmaW5pdGlvbnNbI21vZHMsI3RdIFNFTUkKKy8vCQkJCXsjZmllbGQgPSAjKCNbVkFSSUFCTEVfREVGLCJWQVJJQUJMRV9ERUYiXSwgdik7fQorCQkJCXsjZmllbGQgPSAjdjt9CisJCQkpCisJCSkKKworICAgIC8vICJzdGF0aWMgeyAuLi4gfSIgY2xhc3MgaW5pdGlhbGl6ZXIKKwl8CSJzdGF0aWMiIHMzOmNvbXBvdW5kU3RhdGVtZW50CisJCXsjZmllbGQgPSAjKCNbU1RBVElDX0lOSVQsIlNUQVRJQ19JTklUIl0sIHMzKTt9CisKKyAgICAvLyAieyAuLi4gfSIgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKKwl8CXM0OmNvbXBvdW5kU3RhdGVtZW50CisJCXsjZmllbGQgPSAjKCNbSU5TVEFOQ0VfSU5JVCwiSU5TVEFOQ0VfSU5JVCJdLCBzNCk7fQorCTsKKwordmFyaWFibGVEZWZpbml0aW9uc1tBU1QgbW9kcywgQVNUIHRdCisJOgl2YXJpYWJsZURlY2xhcmF0b3JbZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUobW9kcyksCisJCQkJCQkgICBnZXRBU1RGYWN0b3J5KCkuZHVwVHJlZSh0KV0KKwkJKAlDT01NQSEKKwkJCXZhcmlhYmxlRGVjbGFyYXRvcltnZXRBU1RGYWN0b3J5KCkuZHVwVHJlZShtb2RzKSwKKwkJCQkJCQkgICBnZXRBU1RGYWN0b3J5KCkuZHVwVHJlZSh0KV0KKwkJKSoKKwk7CisKKy8qKiBEZWNsYXJhdGlvbiBvZiBhIHZhcmlhYmxlLiAgVGhpcyBjYW4gYmUgYSBjbGFzcy9pbnN0YW5jZSB2YXJpYWJsZSwKKyAqICAgb3IgYSBsb2NhbCB2YXJpYWJsZSBpbiBhIG1ldGhvZAorICogSXQgY2FuIGFsc28gaW5jbHVkZSBwb3NzaWJsZSBpbml0aWFsaXphdGlvbi4KKyAqLwordmFyaWFibGVEZWNsYXJhdG9yIVtBU1QgbW9kcywgQVNUIHRdCisJOglpZDpJREVOVCBkOmRlY2xhcmF0b3JCcmFja2V0c1t0XSB2OnZhckluaXRpYWxpemVyCisJCXsjdmFyaWFibGVEZWNsYXJhdG9yID0gIygjW1ZBUklBQkxFX0RFRiwiVkFSSUFCTEVfREVGIl0sIG1vZHMsICMoI1tUWVBFLCJUWVBFIl0sZCksIGlkLCB2KTt9CisJOworCitkZWNsYXJhdG9yQnJhY2tldHNbQVNUIHR5cF0KKwk6CXsjZGVjbGFyYXRvckJyYWNrZXRzPXR5cDt9CisJCShsYjpMQlJBQ0teIHsjbGIuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9IFJCUkFDSyEpKgorCTsKKwordmFySW5pdGlhbGl6ZXIKKwk6CSggQVNTSUdOXiBpbml0aWFsaXplciApPworCTsKKworLy8gVGhpcyBpcyBhbiBpbml0aWFsaXplciB1c2VkIHRvIHNldCB1cCBhbiBhcnJheS4KK2FycmF5SW5pdGlhbGl6ZXIKKwk6CWxjOkxDVVJMWV4geyNsYy5zZXRUeXBlKEFSUkFZX0lOSVQpO30KKwkJCSgJaW5pdGlhbGl6ZXIKKwkJCQkoCisJCQkJCS8vIENPTkZMSUNUOiBkb2VzIGEgQ09NTUEgYWZ0ZXIgYW4gaW5pdGlhbGl6ZXIgc3RhcnQgYSBuZXcKKwkJCQkJLy8gICAgICAgICAgIGluaXRpYWxpemVyIG9yIHN0YXJ0IHRoZSBvcHRpb24gJywnIGF0IGVuZD8KKwkJCQkJLy8gICAgICAgICAgIEFOVExSIGdlbmVyYXRlcyBwcm9wZXIgY29kZSBieSBtYXRjaGluZworCQkJCQkvLwkJCSB0aGUgY29tbWEgYXMgc29vbiBhcyBwb3NzaWJsZS4KKwkJCQkJb3B0aW9ucyB7CisJCQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7CisJCQkJCX0KKwkJCQk6CisJCQkJCUNPTU1BISBpbml0aWFsaXplcgorCQkJCSkqCisJCQkJKENPTU1BISk/CisJCQkpPworCQlSQ1VSTFkhCisJOworCisKKy8vIFRoZSB0d28gInRoaW5ncyIgdGhhdCBjYW4gaW5pdGlhbGl6ZSBhbiBhcnJheSBlbGVtZW50IGFyZSBhbiBleHByZXNzaW9uCisvLyAgIGFuZCBhbm90aGVyIChuZXN0ZWQpIGFycmF5IGluaXRpYWxpemVyLgoraW5pdGlhbGl6ZXIKKwk6CWV4cHJlc3Npb24KKwl8CWFycmF5SW5pdGlhbGl6ZXIKKwk7CisKKy8vIFRoaXMgaXMgdGhlIGhlYWRlciBvZiBhIG1ldGhvZC4gIEl0IGluY2x1ZGVzIHRoZSBuYW1lIGFuZCBwYXJhbWV0ZXJzCisvLyAgIGZvciB0aGUgbWV0aG9kLgorLy8gICBUaGlzIGFsc28gd2F0Y2hlcyBmb3IgYSBsaXN0IG9mIGV4Y2VwdGlvbiBjbGFzc2VzIGluIGEgInRocm93cyIgY2xhdXNlLgorY3RvckhlYWQKKwk6CUlERU5UICAvLyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCisKKwkJLy8gcGFyc2UgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgorCQlMUEFSRU4hIHBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCBSUEFSRU4hCisKKwkJLy8gZ2V0IHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWNsYXJlZCB0byB0aHJvdworCQkodGhyb3dzQ2xhdXNlKT8KKwk7CisKKy8vIFRoaXMgaXMgYSBsaXN0IG9mIGV4Y2VwdGlvbiBjbGFzc2VzIHRoYXQgdGhlIG1ldGhvZCBpcyBkZWNsYXJlZCB0byB0aHJvdwordGhyb3dzQ2xhdXNlCisJOgkidGhyb3dzIl4gaWRlbnRpZmllciAoIENPTU1BISBpZGVudGlmaWVyICkqCisJOworCisKK3JldHVyblR5cGVCcmFja2Vyc09uRW5kT2ZNZXRob2RIZWFkW0FTVCB0eXBdCisJOgl7I3JldHVyblR5cGVCcmFja2Vyc09uRW5kT2ZNZXRob2RIZWFkID0gdHlwO30KKwkJKGxiOkxCUkFDS14geyNsYi5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLISkqCisJOworCisvLyBBIGxpc3Qgb2YgZm9ybWFsIHBhcmFtZXRlcnMKK3BhcmFtZXRlckRlY2xhcmF0aW9uTGlzdAorCToJKCBwYXJhbWV0ZXJEZWNsYXJhdGlvbiAoIENPTU1BISBwYXJhbWV0ZXJEZWNsYXJhdGlvbiApKiApPworCQl7I3BhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCA9ICMoI1tQQVJBTUVURVJTLCJQQVJBTUVURVJTIl0sCisJCQkJCQkJCQkjcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0KTt9CisJOworCisvLyBBIGZvcm1hbCBwYXJhbWV0ZXIuCitwYXJhbWV0ZXJEZWNsYXJhdGlvbiEKKwk6CXBtOnBhcmFtZXRlck1vZGlmaWVyIHQ6dHlwZVNwZWNbZmFsc2VdIGlkOklERU5UCisJCXBkOnBhcmFtZXRlckRlY2xhcmF0b3JCcmFja2V0c1sjdF0KKwkJeyNwYXJhbWV0ZXJEZWNsYXJhdGlvbiA9ICMoI1tQQVJBTUVURVJfREVGLCJQQVJBTUVURVJfREVGIl0sCisJCQkJCQkJCQlwbSwgIyhbVFlQRSwiVFlQRSJdLHBkKSwgaWQpO30KKwk7CisKK3BhcmFtZXRlckRlY2xhcmF0b3JCcmFja2V0c1tBU1QgdF0KKwk6CXsjcGFyYW1ldGVyRGVjbGFyYXRvckJyYWNrZXRzID0gdDt9CisJCShsYjpMQlJBQ0teIHsjbGIuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9IFJCUkFDSyEpKgorCTsKKworcGFyYW1ldGVyTW9kaWZpZXIKKwk6CShmOiJmaW5hbCIpPworCQl7I3BhcmFtZXRlck1vZGlmaWVyID0gIygjW01PRElGSUVSUywiTU9ESUZJRVJTIl0sIGYpO30KKwk7CisKKy8vIENvbXBvdW5kIHN0YXRlbWVudC4gIFRoaXMgaXMgdXNlZCBpbiBtYW55IGNvbnRleHRzOgorLy8gICBJbnNpZGUgYSBjbGFzcyBkZWZpbml0aW9uIHByZWZpeGVkIHdpdGggInN0YXRpYyI6CisvLyAgICAgIGl0IGlzIGEgY2xhc3MgaW5pdGlhbGl6ZXIKKy8vICAgSW5zaWRlIGEgY2xhc3MgZGVmaW5pdGlvbiB3aXRob3V0ICJzdGF0aWMiOgorLy8gICAgICBpdCBpcyBhbiBpbnN0YW5jZSBpbml0aWFsaXplcgorLy8gICBBcyB0aGUgYm9keSBvZiBhIG1ldGhvZAorLy8gICBBcyBhIGNvbXBsZXRlbHkgaW5kZXBkZW50IGJyYWNlZCBibG9jayBvZiBjb2RlIGluc2lkZSBhIG1ldGhvZAorLy8gICAgICBpdCBzdGFydHMgYSBuZXcgc2NvcGUgZm9yIHZhcmlhYmxlIGRlZmluaXRpb25zCisKK2NvbXBvdW5kU3RhdGVtZW50CisJOglsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShTTElTVCk7fQorCQkJLy8gaW5jbHVkZSB0aGUgKHBvc3NpYmx5LWVtcHR5KSBsaXN0IG9mIHN0YXRlbWVudHMKKwkJCShzdGF0ZW1lbnQpKgorCQlSQ1VSTFkhCisJOworCisKK3N0YXRlbWVudAorCS8vIEEgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIGN1cmx5IGJyYWNlcyAtLSBzdGFydCBhIG5ldyBzY29wZSEKKwk6CWNvbXBvdW5kU3RhdGVtZW50CisKKwkvLyBjbGFzcyBkZWZpbml0aW9uCisJfAljbGFzc0RlZmluaXRpb25bI1tNT0RJRklFUlMsICJNT0RJRklFUlMiXV0KKworCS8vIGZpbmFsIGNsYXNzIGRlZmluaXRpb24KKwl8CSJmaW5hbCIhIGNsYXNzRGVmaW5pdGlvblsjKCNbTU9ESUZJRVJTLCAiTU9ESUZJRVJTIl0sI1tGSU5BTCwiZmluYWwiXSldCisKKwkvLyBhYnN0cmFjdCBjbGFzcyBkZWZpbml0aW9uCisJfAkiYWJzdHJhY3QiISBjbGFzc0RlZmluaXRpb25bIygjW01PRElGSUVSUywgIk1PRElGSUVSUyJdLCNbQUJTVFJBQ1QsImFic3RyYWN0Il0pXQorCisJLy8gZGVjbGFyYXRpb25zIGFyZSBhbWJpZ3VvdXMgd2l0aCAiSUQgRE9UIiByZWxhdGl2ZSB0byBleHByZXNzaW9uCisJLy8gc3RhdGVtZW50cy4gIE11c3QgYmFja3RyYWNrIHRvIGJlIHN1cmUuICBDb3VsZCB1c2UgYSBzZW1hbnRpYworCS8vIHByZWRpY2F0ZSB0byB0ZXN0IHN5bWJvbCB0YWJsZSB0byBzZWUgd2hhdCB0aGUgdHlwZSB3YXMgY29taW5nCisJLy8gdXAsIGJ1dCB0aGF0J3MgcHJldHR5IGhhcmQgd2l0aG91dCBhIHN5bWJvbCB0YWJsZSA7KQorCXwJKGRlY2xhcmF0aW9uKT0+IGRlY2xhcmF0aW9uIFNFTUkhCisKKwkvLyBBbiBleHByZXNzaW9uIHN0YXRlbWVudC4gIFRoaXMgY291bGQgYmUgYSBtZXRob2QgY2FsbCwKKwkvLyBhc3NpZ25tZW50IHN0YXRlbWVudCwgb3IgYW55IG90aGVyIGV4cHJlc3Npb24gZXZhbHVhdGVkIGZvcgorCS8vIHNpZGUtZWZmZWN0cy4KKwl8CWV4cHJlc3Npb24gU0VNSSEKKworCS8vIEF0dGFjaCBhIGxhYmVsIHRvIHRoZSBmcm9udCBvZiBhIHN0YXRlbWVudAorCXwJSURFTlQgYzpDT0xPTl4geyNjLnNldFR5cGUoTEFCRUxFRF9TVEFUKTt9IHN0YXRlbWVudAorCisJLy8gSWYtZWxzZSBzdGF0ZW1lbnQKKwl8CSJpZiJeIExQQVJFTiEgZXhwcmVzc2lvbiBSUEFSRU4hIHN0YXRlbWVudAorCQkoCisJCQkvLyBDT05GTElDVDogdGhlIG9sZCAiZGFuZ2xpbmctZWxzZSIgcHJvYmxlbS4uLgorCQkJLy8gICAgICAgICAgIEFOVExSIGdlbmVyYXRlcyBwcm9wZXIgY29kZSBtYXRjaGluZworCQkJLy8JCQkgYXMgc29vbiBhcyBwb3NzaWJsZS4gIEh1c2ggd2FybmluZy4KKwkJCW9wdGlvbnMgeworCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKKwkJCX0KKwkJOgorCQkJImVsc2UiISBzdGF0ZW1lbnQKKwkJKT8KKworCS8vIEZvciBzdGF0ZW1lbnQKKwl8CSJmb3IiXgorCQkJTFBBUkVOIQorCQkJCWZvckluaXQgU0VNSSEgICAvLyBpbml0aWFsaXplcgorCQkJCWZvckNvbmQJU0VNSSEgICAvLyBjb25kaXRpb24gdGVzdAorCQkJCWZvckl0ZXIgICAgICAgICAvLyB1cGRhdGVyCisJCQlSUEFSRU4hCisJCQlzdGF0ZW1lbnQgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnQgdG8gbG9vcCBvdmVyCisKKwkvLyBXaGlsZSBzdGF0ZW1lbnQKKwl8CSJ3aGlsZSJeIExQQVJFTiEgZXhwcmVzc2lvbiBSUEFSRU4hIHN0YXRlbWVudAorCisJLy8gZG8td2hpbGUgc3RhdGVtZW50CisJfAkiZG8iXiBzdGF0ZW1lbnQgIndoaWxlIiEgTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgU0VNSSEKKworCS8vIGdldCBvdXQgb2YgYSBsb29wIChvciBzd2l0Y2gpCisJfAkiYnJlYWsiXiAoSURFTlQpPyBTRU1JIQorCisJLy8gZG8gbmV4dCBpdGVyYXRpb24gb2YgYSBsb29wCisJfAkiY29udGludWUiXiAoSURFTlQpPyBTRU1JIQorCisJLy8gUmV0dXJuIGFuIGV4cHJlc3Npb24KKwl8CSJyZXR1cm4iXiAoZXhwcmVzc2lvbik/IFNFTUkhCisKKwkvLyBzd2l0Y2gvY2FzZSBzdGF0ZW1lbnQKKwl8CSJzd2l0Y2giXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBMQ1VSTFkhCisJCQkoIGNhc2VzR3JvdXAgKSoKKwkJUkNVUkxZIQorCisJLy8gZXhjZXB0aW9uIHRyeS1jYXRjaCBibG9jaworCXwJdHJ5QmxvY2sKKworCS8vIHRocm93IGFuIGV4Y2VwdGlvbgorCXwJInRocm93Il4gZXhwcmVzc2lvbiBTRU1JIQorCisJLy8gc3luY2hyb25pemUgYSBzdGF0ZW1lbnQKKwl8CSJzeW5jaHJvbml6ZWQiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBjb21wb3VuZFN0YXRlbWVudAorCisJLy8gZW1wdHkgc3RhdGVtZW50CisJfAlzOlNFTUkgeyNzLnNldFR5cGUoRU1QVFlfU1RBVCk7fQorCTsKKworCitjYXNlc0dyb3VwCisJOgkoCS8vIENPTkZMSUNUOiB0byB3aGljaCBjYXNlIGdyb3VwIGRvIHRoZSBzdGF0ZW1lbnRzIGJpbmQ/CisJCQkvLyAgICAgICAgICAgQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlOiBpdCBncm91cHMgdGhlCisJCQkvLyAgICAgICAgICAgbWFueSAiY2FzZSIvImRlZmF1bHQiIGxhYmVscyB0b2dldGhlciB0aGVuCisJCQkvLyAgICAgICAgICAgZm9sbG93cyB0aGVtIHdpdGggdGhlIHN0YXRlbWVudHMKKwkJCW9wdGlvbnMgeworCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKKwkJCX0KKwkJCToKKwkJCWFDYXNlCisJCSkrCisJCWNhc2VTTGlzdAorCQl7I2Nhc2VzR3JvdXAgPSAjKFtDQVNFX0dST1VQLCAiQ0FTRV9HUk9VUCJdLCAjY2FzZXNHcm91cCk7fQorCTsKKworYUNhc2UKKwk6CSgiY2FzZSJeIGV4cHJlc3Npb24gfCAiZGVmYXVsdCIpIENPTE9OIQorCTsKKworY2FzZVNMaXN0CisJOgkoc3RhdGVtZW50KSoKKwkJeyNjYXNlU0xpc3QgPSAjKCNbU0xJU1QsIlNMSVNUIl0sI2Nhc2VTTGlzdCk7fQorCTsKKworLy8gVGhlIGluaXRpYWxpemVyIGZvciBhIGZvciBsb29wCitmb3JJbml0CisJCS8vIGlmIGl0IGxvb2tzIGxpa2UgYSBkZWNsYXJhdGlvbiwgaXQgaXMKKwk6CSgJKGRlY2xhcmF0aW9uKT0+IGRlY2xhcmF0aW9uCisJCS8vIG90aGVyd2lzZSBpdCBjb3VsZCBiZSBhbiBleHByZXNzaW9uIGxpc3QuLi4KKwkJfAlleHByZXNzaW9uTGlzdAorCQkpPworCQl7I2ZvckluaXQgPSAjKCNbRk9SX0lOSVQsIkZPUl9JTklUIl0sI2ZvckluaXQpO30KKwk7CisKK2ZvckNvbmQKKwk6CShleHByZXNzaW9uKT8KKwkJeyNmb3JDb25kID0gIygjW0ZPUl9DT05ESVRJT04sIkZPUl9DT05ESVRJT04iXSwjZm9yQ29uZCk7fQorCTsKKworZm9ySXRlcgorCToJKGV4cHJlc3Npb25MaXN0KT8KKwkJeyNmb3JJdGVyID0gIygjW0ZPUl9JVEVSQVRPUiwiRk9SX0lURVJBVE9SIl0sI2Zvckl0ZXIpO30KKwk7CisKKy8vIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRyeS9jYXRjaCBibG9jawordHJ5QmxvY2sKKwk6CSJ0cnkiXiBjb21wb3VuZFN0YXRlbWVudAorCQkoaGFuZGxlcikqCisJCSggImZpbmFsbHkiXiBjb21wb3VuZFN0YXRlbWVudCApPworCTsKKworCisvLyBhbiBleGNlcHRpb24gaGFuZGxlcgoraGFuZGxlcgorCToJImNhdGNoIl4gTFBBUkVOISBwYXJhbWV0ZXJEZWNsYXJhdGlvbiBSUEFSRU4hIGNvbXBvdW5kU3RhdGVtZW50CisJOworCisKKy8vIGV4cHJlc3Npb25zCisvLyBOb3RlIHRoYXQgbW9zdCBvZiB0aGVzZSBleHByZXNzaW9ucyBmb2xsb3cgdGhlIHBhdHRlcm4KKy8vICAgdGhpc0xldmVsRXhwcmVzc2lvbiA6CisvLyAgICAgICBuZXh0SGlnaGVyUHJlY2VkZW5jZUV4cHJlc3Npb24KKy8vICAgICAgICAgICAoT1BFUkFUT1IgbmV4dEhpZ2hlclByZWNlZGVuY2VFeHByZXNzaW9uKSoKKy8vIHdoaWNoIGlzIGEgc3RhbmRhcmQgcmVjdXJzaXZlIGRlZmluaXRpb24gZm9yIGEgcGFyc2luZyBhbiBleHByZXNzaW9uLgorLy8gVGhlIG9wZXJhdG9ycyBpbiBqYXZhIGhhdmUgdGhlIGZvbGxvd2luZyBwcmVjZWRlbmNlczoKKy8vICAgIGxvd2VzdCAgKDEzKSAgPSAqPSAvPSAlPSArPSAtPSA8PD0gPj49ID4+Pj0gJj0gXj0gfD0KKy8vICAgICAgICAgICAgKDEyKSAgPzoKKy8vICAgICAgICAgICAgKDExKSAgfHwKKy8vICAgICAgICAgICAgKDEwKSAgJiYKKy8vICAgICAgICAgICAgKCA5KSAgfAorLy8gICAgICAgICAgICAoIDgpICBeCisvLyAgICAgICAgICAgICggNykgICYKKy8vICAgICAgICAgICAgKCA2KSAgPT0gIT0KKy8vICAgICAgICAgICAgKCA1KSAgPCA8PSA+ID49CisvLyAgICAgICAgICAgICggNCkgIDw8ID4+CisvLyAgICAgICAgICAgICggMykgICsoYmluYXJ5KSAtKGJpbmFyeSkKKy8vICAgICAgICAgICAgKCAyKSAgKiAvICUKKy8vICAgICAgICAgICAgKCAxKSAgKysgLS0gKyh1bmFyeSkgLSh1bmFyeSkgIH4gICEgICh0eXBlKQorLy8gICAgICAgICAgICAgICAgICBbXSAgICgpIChtZXRob2QgY2FsbCkgIC4gKGRvdCAtLSBpZGVudGlmaWVyIHF1YWxpZmljYXRpb24pCisvLyAgICAgICAgICAgICAgICAgIG5ldyAgICgpICAoZXhwbGljaXQgcGFyZW50aGVzaXMpCisvLworLy8gdGhlIGxhc3QgdHdvIGFyZSBub3QgdXN1YWxseSBvbiBhIHByZWNlZGVuY2UgY2hhcnQ7IEkgcHV0IHRoZW0gaW4KKy8vIHRvIHBvaW50IG91dCB0aGF0IG5ldyBoYXMgYSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuICcuJywgc28geW91CisvLyBjYW4gdmFsaWR5IHVzZQorLy8gICAgIG5ldyBGcmFtZSgpLnNob3coKQorLy8gCisvLyBOb3RlIHRoYXQgdGhlIGFib3ZlIHByZWNlZGVuY2UgbGV2ZWxzIG1hcCB0byB0aGUgcnVsZXMgYmVsb3cuLi4KKy8vIE9uY2UgeW91IGhhdmUgYSBwcmVjZWRlbmNlIGNoYXJ0LCB3cml0aW5nIHRoZSBhcHByb3ByaWF0ZSBydWxlcyBhcyBiZWxvdworLy8gICBpcyB1c3VhbGx5IHZlcnkgc3RyYWlnaHRmb3dhcmQKKworCisKKy8vIHRoZSBtb3RoZXIgb2YgYWxsIGV4cHJlc3Npb25zCitleHByZXNzaW9uCisJOglhc3NpZ25tZW50RXhwcmVzc2lvbgorCQl7I2V4cHJlc3Npb24gPSAjKCNbRVhQUiwiRVhQUiJdLCNleHByZXNzaW9uKTt9CisJOworCisKKy8vIFRoaXMgaXMgYSBsaXN0IG9mIGV4cHJlc3Npb25zLgorZXhwcmVzc2lvbkxpc3QKKwk6CWV4cHJlc3Npb24gKENPTU1BISBleHByZXNzaW9uKSoKKwkJeyNleHByZXNzaW9uTGlzdCA9ICMoI1tFTElTVCwiRUxJU1QiXSwgZXhwcmVzc2lvbkxpc3QpO30KKwk7CisKKworLy8gYXNzaWdubWVudCBleHByZXNzaW9uIChsZXZlbCAxMykKK2Fzc2lnbm1lbnRFeHByZXNzaW9uCisJOgljb25kaXRpb25hbEV4cHJlc3Npb24KKwkJKAkoCUFTU0lHTl4KKyAgICAgICAgICAgIHwgICBQTFVTX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBNSU5VU19BU1NJR05eCisgICAgICAgICAgICB8ICAgU1RBUl9BU1NJR05eCisgICAgICAgICAgICB8ICAgRElWX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBNT0RfQVNTSUdOXgorICAgICAgICAgICAgfCAgIFNSX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBCU1JfQVNTSUdOXgorICAgICAgICAgICAgfCAgIFNMX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBCQU5EX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBCWE9SX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBCT1JfQVNTSUdOXgorICAgICAgICAgICAgKQorCQkJYXNzaWdubWVudEV4cHJlc3Npb24KKwkJKT8KKwk7CisKKworLy8gY29uZGl0aW9uYWwgdGVzdCAobGV2ZWwgMTIpCitjb25kaXRpb25hbEV4cHJlc3Npb24KKwk6CWxvZ2ljYWxPckV4cHJlc3Npb24KKwkJKCBRVUVTVElPTl4gYXNzaWdubWVudEV4cHJlc3Npb24gQ09MT04hIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiApPworCTsKKworCisvLyBsb2dpY2FsIG9yICh8fCkgIChsZXZlbCAxMSkKK2xvZ2ljYWxPckV4cHJlc3Npb24KKwk6CWxvZ2ljYWxBbmRFeHByZXNzaW9uIChMT1JeIGxvZ2ljYWxBbmRFeHByZXNzaW9uKSoKKwk7CisKKworLy8gbG9naWNhbCBhbmQgKCYmKSAgKGxldmVsIDEwKQorbG9naWNhbEFuZEV4cHJlc3Npb24KKwk6CWluY2x1c2l2ZU9yRXhwcmVzc2lvbiAoTEFORF4gaW5jbHVzaXZlT3JFeHByZXNzaW9uKSoKKwk7CisKKworLy8gYml0d2lzZSBvciBub24tc2hvcnQtY2lyY3VpdGluZyBvciAofCkgIChsZXZlbCA5KQoraW5jbHVzaXZlT3JFeHByZXNzaW9uCisJOglleGNsdXNpdmVPckV4cHJlc3Npb24gKEJPUl4gZXhjbHVzaXZlT3JFeHByZXNzaW9uKSoKKwk7CisKKworLy8gZXhjbHVzaXZlIG9yICheKSAgKGxldmVsIDgpCitleGNsdXNpdmVPckV4cHJlc3Npb24KKwk6CWFuZEV4cHJlc3Npb24gKEJYT1JeIGFuZEV4cHJlc3Npb24pKgorCTsKKworCisvLyBiaXR3aXNlIG9yIG5vbi1zaG9ydC1jaXJjdWl0aW5nIGFuZCAoJikgIChsZXZlbCA3KQorYW5kRXhwcmVzc2lvbgorCToJZXF1YWxpdHlFeHByZXNzaW9uIChCQU5EXiBlcXVhbGl0eUV4cHJlc3Npb24pKgorCTsKKworCisvLyBlcXVhbGl0eS9pbmVxdWFsaXR5ICg9PS8hPSkgKGxldmVsIDYpCitlcXVhbGl0eUV4cHJlc3Npb24KKwk6CXJlbGF0aW9uYWxFeHByZXNzaW9uICgoTk9UX0VRVUFMXiB8IEVRVUFMXikgcmVsYXRpb25hbEV4cHJlc3Npb24pKgorCTsKKworCisvLyBib29sZWFuIHJlbGF0aW9uYWwgZXhwcmVzc2lvbnMgKGxldmVsIDUpCityZWxhdGlvbmFsRXhwcmVzc2lvbgorCToJc2hpZnRFeHByZXNzaW9uCisJCSgJKAkoCUxUXgorCQkJCXwJR1ReCisJCQkJfAlMRV4KKwkJCQl8CUdFXgorCQkJCSkKKwkJCQlzaGlmdEV4cHJlc3Npb24KKwkJCSkqCisJCXwJImluc3RhbmNlb2YiXiB0eXBlU3BlY1t0cnVlXQorCQkpCisJOworCisKKy8vIGJpdCBzaGlmdCBleHByZXNzaW9ucyAobGV2ZWwgNCkKK3NoaWZ0RXhwcmVzc2lvbgorCToJYWRkaXRpdmVFeHByZXNzaW9uICgoU0xeIHwgU1JeIHwgQlNSXikgYWRkaXRpdmVFeHByZXNzaW9uKSoKKwk7CisKKworLy8gYmluYXJ5IGFkZGl0aW9uL3N1YnRyYWN0aW9uIChsZXZlbCAzKQorYWRkaXRpdmVFeHByZXNzaW9uCisJOgltdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKChQTFVTXiB8IE1JTlVTXikgbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKSoKKwk7CisKKworLy8gbXVsdGlwbGljYXRpb24vZGl2aXNpb24vbW9kdWxvIChsZXZlbCAyKQorbXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisJOgl1bmFyeUV4cHJlc3Npb24gKChTVEFSXiB8IERJVl4gfCBNT0ReICkgdW5hcnlFeHByZXNzaW9uKSoKKwk7CisKK3VuYXJ5RXhwcmVzc2lvbgorCToJSU5DXiB1bmFyeUV4cHJlc3Npb24KKwl8CURFQ14gdW5hcnlFeHByZXNzaW9uCisJfAlNSU5VU14geyNNSU5VUy5zZXRUeXBlKFVOQVJZX01JTlVTKTt9IHVuYXJ5RXhwcmVzc2lvbgorCXwJUExVU14gIHsjUExVUy5zZXRUeXBlKFVOQVJZX1BMVVMpO30gdW5hcnlFeHByZXNzaW9uCisJfAl1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKKwk7CisKK3VuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cworCToJQk5PVF4gdW5hcnlFeHByZXNzaW9uCisJfAlMTk9UXiB1bmFyeUV4cHJlc3Npb24KKworCXwJKAkvLyBzdWJydWxlIGFsbG93cyBvcHRpb24gdG8gc2h1dCBvZmYgd2FybmluZ3MKKwkJCW9wdGlvbnMgeworCQkJCS8vICIoaW50IiBhbWJpZyB3aXRoIHBvc3RmaXhFeHByIGR1ZSB0byBsYWNrIG9mIHNlcXVlbmNlCisJCQkJLy8gaW5mbyBpbiBsaW5lYXIgYXBwcm94aW1hdGUgTEwoaykuICBJdCdzIG9rLiAgU2h1dCB1cC4KKwkJCQlnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7CisJCQl9CisJCToJLy8gSWYgdHlwZWNhc3QgaXMgYnVpbHQgaW4gdHlwZSwgbXVzdCBiZSBudW1lcmljIG9wZXJhbmQKKwkJCS8vIEFsc28sIG5vIHJlYXNvbiB0byBiYWNrdHJhY2sgaWYgdHlwZSBrZXl3b3JkIGxpa2UgaW50LCBmbG9hdC4uLgorCQkJbHBiOkxQQVJFTl4geyNscGIuc2V0VHlwZShUWVBFQ0FTVCk7fSBidWlsdEluVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIQorCQkJdW5hcnlFeHByZXNzaW9uCisKKwkJCS8vIEhhdmUgdG8gYmFja3RyYWNrIHRvIHNlZSBpZiBvcGVyYXRvciBmb2xsb3dzLiAgSWYgbm8gb3BlcmF0b3IKKwkJCS8vIGZvbGxvd3MsIGl0J3MgYSB0eXBlY2FzdC4gIE5vIHNlbWFudGljIGNoZWNraW5nIG5lZWRlZCB0byBwYXJzZS4KKwkJCS8vIGlmIGl0IF9sb29rc18gbGlrZSBhIGNhc3QsIGl0IF9pc18gYSBjYXN0OyBlbHNlIGl0J3MgYSAiKGV4cHIpIgorCQl8CShMUEFSRU4gY2xhc3NUeXBlU3BlY1t0cnVlXSBSUEFSRU4gdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzKT0+CisJCQlscDpMUEFSRU5eIHsjbHAuc2V0VHlwZShUWVBFQ0FTVCk7fSBjbGFzc1R5cGVTcGVjW3RydWVdIFJQQVJFTiEKKwkJCXVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cworCisJCXwJcG9zdGZpeEV4cHJlc3Npb24KKwkJKQorCTsKKworLy8gcXVhbGlmaWVkIG5hbWVzLCBhcnJheSBleHByZXNzaW9ucywgbWV0aG9kIGludm9jYXRpb24sIHBvc3QgaW5jL2RlYworcG9zdGZpeEV4cHJlc3Npb24KKwk6CXByaW1hcnlFeHByZXNzaW9uIC8vIHN0YXJ0IHdpdGggYSBwcmltYXJ5CisKKwkJKAkvLyBxdWFsaWZpZWQgaWQgKGlkLmlkLmlkLmlkLi4uKSAtLSBidWlsZCB0aGUgbmFtZQorCQkJRE9UXiAoIElERU5UCisJCQkJfCAidGhpcyIKKwkJCQl8ICJjbGFzcyIKKwkJCQl8IG5ld0V4cHJlc3Npb24KKwkJCQl8ICJzdXBlciIgTFBBUkVOICggZXhwcmVzc2lvbkxpc3QgKT8gUlBBUkVOCisJCQkJKQorCQkJLy8gdGhlIGFib3ZlIGxpbmUgbmVlZHMgYSBzZW1hbnRpYyBjaGVjayB0byBtYWtlIHN1cmUgImNsYXNzIgorCQkJLy8gICBpcyB0aGUgX2xhc3RfIHF1YWxpZmllci4KKworCQkJLy8gYWxsb3cgQ2xhc3NOYW1lW10uY2xhc3MKKwkJfAkoIGxiYzpMQlJBQ0teIHsjbGJjLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shICkrCisJCQlET1ReICJjbGFzcyIKKworCQkJLy8gYW4gYXJyYXkgaW5kZXhpbmcgb3BlcmF0aW9uCisJCXwJbGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoSU5ERVhfT1ApO30gZXhwcmVzc2lvbiBSQlJBQ0shCisKKwkJCS8vIG1ldGhvZCBpbnZvY2F0aW9uCisJCQkvLyBUaGUgbmV4dCBsaW5lIGlzIG5vdCBzdHJpY3RseSBwcm9wZXI7IGl0IGFsbG93cyB4KDMpKDQpIG9yCisJCQkvLyAgeFsyXSg0KSB3aGljaCBhcmUgbm90IHZhbGlkIGluIEphdmEuICBJZiB0aGlzIGdyYW1tYXIgd2VyZSB1c2VkCisJCQkvLyAgdG8gdmFsaWRhdGUgYSBKYXZhIHByb2dyYW0gYSBzZW1hbnRpYyBjaGVjayB3b3VsZCBiZSBuZWVkZWQsIG9yCisJCQkvLyAgIHRoaXMgcnVsZSB3b3VsZCBnZXQgcmVhbGx5IHVnbHkuLi4KKwkJfAlscDpMUEFSRU5eIHsjbHAuc2V0VHlwZShNRVRIT0RfQ0FMTCk7fQorCQkJCWFyZ0xpc3QKKwkJCVJQQVJFTiEKKwkJKSoKKworCQkvLyBwb3NzaWJseSBhZGQgb24gYSBwb3N0LWluY3JlbWVudCBvciBwb3N0LWRlY3JlbWVudC4KKwkJLy8gYWxsb3dzIElOQy9ERUMgb24gdG9vIG11Y2gsIGJ1dCBzZW1hbnRpY3MgY2FuIGNoZWNrCisJCSgJaW46SU5DXiB7I2luLnNldFR5cGUoUE9TVF9JTkMpO30KKwkgCXwJZGU6REVDXiB7I2RlLnNldFR5cGUoUE9TVF9ERUMpO30KKwkJfAkvLyBub3RoaW5nCisJCSkKKworCQkvLyBsb29rIGZvciBpbnQuY2xhc3MgYW5kIGludFtdLmNsYXNzCisJfAlidWlsdEluVHlwZSAKKwkJKCBsYnQ6TEJSQUNLXiB7I2xidC5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLISApKgorCQlET1ReICJjbGFzcyIKKwk7CisKKy8vIHRoZSBiYXNpYyBlbGVtZW50IG9mIGFuIGV4cHJlc3Npb24KK3ByaW1hcnlFeHByZXNzaW9uCisJOglJREVOVAorCXwJbmV3RXhwcmVzc2lvbgorCXwJY29uc3RhbnQKKwl8CSJzdXBlciIKKwl8CSJ0cnVlIgorCXwJImZhbHNlIgorCXwJInRoaXMiCisJfAkibnVsbCIKKwl8CUxQQVJFTiEgYXNzaWdubWVudEV4cHJlc3Npb24gUlBBUkVOIQorCTsKKworLyoqIG9iamVjdCBpbnN0YW50aWF0aW9uLgorICogIFRyZWVzIGFyZSBidWlsdCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIGlucHV0L3RyZWUgcGFpcnM6CisgKiAgCisgKiAgbmV3IFQoKQorICogIAorICogIG5ldworICogICB8CisgKiAgIFQgLS0gIEVMSVNUCisgKiAgICAgICAgICAgfAorICogICAgICAgICAgYXJnMSAtLSBhcmcyIC0tIC4uIC0tIGFyZ24KKyAqICAKKyAqICBuZXcgaW50W10KKyAqCisgKiAgbmV3CisgKiAgIHwKKyAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUgorICogIAorICogIG5ldyBpbnRbXSB7MSwyfQorICoKKyAqICBuZXcKKyAqICAgfAorICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SIC0tIEFSUkFZX0lOSVQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBSIC0tIEVYUFIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgMgorICogIAorICogIG5ldyBpbnRbM10KKyAqICBuZXcKKyAqICAgfAorICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SCisgKiAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgRVhQUgorICogICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgMworICogIAorICogIG5ldyBpbnRbMV1bMl0KKyAqICAKKyAqICBuZXcKKyAqICAgfAorICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SCisgKiAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgQVJSQVlfREVDTEFSQVRPUiAtLSBFWFBSCisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgIEVYUFIgICAgICAgICAgICAgMQorICogICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgIDIKKyAqICAKKyAqLworbmV3RXhwcmVzc2lvbgorCToJIm5ldyJeIHR5cGUKKwkJKAlMUEFSRU4hIGFyZ0xpc3QgUlBBUkVOISAoY2xhc3NCbG9jayk/CisKKwkJCS8vamF2YSAxLjEKKwkJCS8vIE5vdGU6IFRoaXMgd2lsbCBhbGxvdyBiYWQgY29uc3RydWN0cyBsaWtlCisJCQkvLyAgICBuZXcgaW50WzRdW11bM10ge2V4cCxleHB9LgorCQkJLy8gICAgVGhlcmUgbmVlZHMgdG8gYmUgYSBzZW1hbnRpYyBjaGVjayBoZXJlLi4uCisJCQkvLyB0byBtYWtlIHN1cmU6CisJCQkvLyAgIGEpIFsgZXhwciBdIGFuZCBbIF0gYXJlIG5vdCBtaXhlZAorCQkJLy8gICBiKSBbIGV4cHIgXSBhbmQgYW4gaW5pdCBhcmUgbm90IHVzZWQgdG9nZXRoZXIKKworCQl8CW5ld0FycmF5RGVjbGFyYXRvciAoYXJyYXlJbml0aWFsaXplcik/CisJCSkKKwk7CisKK2FyZ0xpc3QKKwk6CSgJZXhwcmVzc2lvbkxpc3QKKwkJfAkvKm5vdGhpbmcqLworCQkJeyNhcmdMaXN0ID0gI1tFTElTVCwiRUxJU1QiXTt9CisJCSkKKwk7CisKK25ld0FycmF5RGVjbGFyYXRvcgorCToJKAorCQkJLy8gQ09ORkxJQ1Q6CisJCQkvLyBuZXdFeHByZXNzaW9uIGlzIGEgcHJpbWFyeUV4cHJlc3Npb24gd2hpY2ggY2FuIGJlCisJCQkvLyBmb2xsb3dlZCBieSBhbiBhcnJheSBpbmRleCByZWZlcmVuY2UuICBUaGlzIGlzIG9rLAorCQkJLy8gYXMgdGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgc3RheSBpbiB0aGlzIGxvb3AgYXMKKwkJCS8vIGxvbmcgYXMgaXQgc2VlcyBhbiBMQlJBQ0sgKHByb3BlciBiZWhhdmlvcikKKwkJCW9wdGlvbnMgeworCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKKwkJCX0KKwkJOgorCQkJbGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fQorCQkJCShleHByZXNzaW9uKT8KKwkJCVJCUkFDSyEKKwkJKSsKKwk7CisKK2NvbnN0YW50CisJOglOVU1fSU5UCisJfAlDSEFSX0xJVEVSQUwKKwl8CVNUUklOR19MSVRFUkFMCisJfAlOVU1fRkxPQVQKKwk7CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgSmF2YSBzY2FubmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIEphdmFMZXhlciBleHRlbmRzIExleGVyOworCitvcHRpb25zIHsKKwlleHBvcnRWb2NhYj1KYXZhOyAgICAgIC8vIGNhbGwgdGhlIHZvY2FidWxhcnkgIkphdmEiCisJdGVzdExpdGVyYWxzPWZhbHNlOyAgICAvLyBkb24ndCBhdXRvbWF0aWNhbGx5IHRlc3QgZm9yIGxpdGVyYWxzCisJaz00OyAgICAgICAgICAgICAgICAgICAvLyBmb3VyIGNoYXJhY3RlcnMgb2YgbG9va2FoZWFkCit9CisKKworCisvLyBPUEVSQVRPUlMKK1FVRVNUSU9OCQk6CSc/JwkJOworTFBBUkVOCQkJOgknKCcJCTsKK1JQQVJFTgkJCToJJyknCQk7CitMQlJBQ0sJCQk6CSdbJwkJOworUkJSQUNLCQkJOgknXScJCTsKK0xDVVJMWQkJCToJJ3snCQk7CitSQ1VSTFkJCQk6CSd9JwkJOworQ09MT04JCQk6CSc6JwkJOworQ09NTUEJCQk6CScsJwkJOworLy9ET1QJCQk6CScuJwkJOworQVNTSUdOCQkJOgknPScJCTsKK0VRVUFMCQkJOgkiPT0iCTsKK0xOT1QJCQk6CSchJwkJOworQk5PVAkJCToJJ34nCQk7CitOT1RfRVFVQUwJCToJIiE9Igk7CitESVYJCQkJOgknLycJCTsKK0RJVl9BU1NJR04JCToJIi89Igk7CitQTFVTCQkJOgknKycJCTsKK1BMVVNfQVNTSUdOCQk6CSIrPSIJOworSU5DCQkJCToJIisrIgk7CitNSU5VUwkJCToJJy0nCQk7CitNSU5VU19BU1NJR04JOgkiLT0iCTsKK0RFQwkJCQk6CSItLSIJOworU1RBUgkJCToJJyonCQk7CitTVEFSX0FTU0lHTgkJOgkiKj0iCTsKK01PRAkJCQk6CSclJwkJOworTU9EX0FTU0lHTgkJOgkiJT0iCTsKK1NSCQkJCToJIj4+Igk7CitTUl9BU1NJR04JCToJIj4+PSIJOworQlNSCQkJCToJIj4+PiIJOworQlNSX0FTU0lHTgkJOgkiPj4+PSIJOworR0UJCQkJOgkiPj0iCTsKK0dUCQkJCToJIj4iCQk7CitTTAkJCQk6CSI8PCIJOworU0xfQVNTSUdOCQk6CSI8PD0iCTsKK0xFCQkJCToJIjw9Igk7CitMVAkJCQk6CSc8JwkJOworQlhPUgkJCToJJ14nCQk7CitCWE9SX0FTU0lHTgkJOgkiXj0iCTsKK0JPUgkJCQk6CSd8JwkJOworQk9SX0FTU0lHTgkJOgkifD0iCTsKK0xPUgkJCQk6CSJ8fCIJOworQkFORAkJCToJJyYnCQk7CitCQU5EX0FTU0lHTgkJOgkiJj0iCTsKK0xBTkQJCQk6CSImJiIJOworU0VNSQkJCToJJzsnCQk7CisKKworLy8gV2hpdGVzcGFjZSAtLSBpZ25vcmVkCitXUwk6CSgJJyAnCisJCXwJJ1x0JworCQl8CSdcZicKKwkJLy8gaGFuZGxlIG5ld2xpbmVzCisJCXwJKAkiXHJcbiIgIC8vIEV2aWwgRE9TCisJCQl8CSdccicgICAgLy8gTWFjaW50b3NoCisJCQl8CSdcbicgICAgLy8gVW5peCAodGhlIHJpZ2h0IHdheSkKKwkJCSkKKwkJCXsgbmV3bGluZSgpOyB9CisJCSkKKwkJeyBfdHR5cGUgPSBUb2tlbi5TS0lQOyB9CisJOworCisvLyBTaW5nbGUtbGluZSBjb21tZW50cworU0xfQ09NTUVOVAorCToJIi8vIgorCQkofignXG4nfCdccicpKSogKCdcbid8J1xyJygnXG4nKT8pCisJCXskc2V0VHlwZShUb2tlbi5TS0lQKTsgbmV3bGluZSgpO30KKwk7CisKKy8vIG11bHRpcGxlLWxpbmUgY29tbWVudHMKK01MX0NPTU1FTlQKKwk6CSIvKiIKKwkJKAkvKgknXHInICdcbicgY2FuIGJlIG1hdGNoZWQgaW4gb25lIGFsdGVybmF0aXZlIG9yIGJ5IG1hdGNoaW5nCisJCQkJJ1xyJyBpbiBvbmUgaXRlcmF0aW9uIGFuZCAnXG4nIGluIGFub3RoZXIuICBJIGFtIHRyeWluZyB0bworCQkJCWhhbmRsZSBhbnkgZmxhdm9yIG9mIG5ld2xpbmUgdGhhdCBjb21lcyBpbiwgYnV0IHRoZSBsYW5ndWFnZQorCQkJCXRoYXQgYWxsb3dzIGJvdGggIlxyXG4iIGFuZCAiXHIiIGFuZCAiXG4iIHRvIGFsbCBiZSB2YWxpZAorCQkJCW5ld2xpbmUgaXMgYW1iaWd1b3VzLiAgQ29uc2VxdWVudGx5LCB0aGUgcmVzdWx0aW5nIGdyYW1tYXIKKwkJCQltdXN0IGJlIGFtYmlndW91cy4gIEknbSBzaHV0dGluZyB0aGlzIHdhcm5pbmcgb2ZmLgorCQkJICovCisJCQlvcHRpb25zIHsKKwkJCQlnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7CisJCQl9CisJCToKKwkJCXsgTEEoMikhPScvJyB9PyAnKicKKwkJfAknXHInICdcbicJCXtuZXdsaW5lKCk7fQorCQl8CSdccicJCQl7bmV3bGluZSgpO30KKwkJfAknXG4nCQkJe25ld2xpbmUoKTt9CisJCXwJfignKid8J1xuJ3wnXHInKQorCQkpKgorCQkiKi8iCisJCXskc2V0VHlwZShUb2tlbi5TS0lQKTt9CisJOworCisKKy8vIGNoYXJhY3RlciBsaXRlcmFscworQ0hBUl9MSVRFUkFMCisJOgknXCcnICggRVNDIHwgfidcJycgKSAnXCcnCisJOworCisvLyBzdHJpbmcgbGl0ZXJhbHMKK1NUUklOR19MSVRFUkFMCisJOgknIicgKEVTQ3x+KCciJ3wnXFwnKSkqICciJworCTsKKworCisvLyBlc2NhcGUgc2VxdWVuY2UgLS0gbm90ZSB0aGF0IHRoaXMgaXMgcHJvdGVjdGVkOyBpdCBjYW4gb25seSBiZSBjYWxsZWQKKy8vICAgZnJvbSBhbm90aGVyIGxleGVyIHJ1bGUgLS0gaXQgd2lsbCBub3QgZXZlciBkaXJlY3RseSByZXR1cm4gYSB0b2tlbiB0bworLy8gICB0aGUgcGFyc2VyCisvLyBUaGVyZSBhcmUgdmFyaW91cyBhbWJpZ3VpdGllcyBodXNoZWQgaW4gdGhpcyBydWxlLiAgVGhlIG9wdGlvbmFsCisvLyAnMCcuLi4nOScgZGlnaXQgbWF0Y2hlcyBzaG91bGQgYmUgbWF0Y2hlZCBoZXJlIHJhdGhlciB0aGFuIGxldHRpbmcKKy8vIHRoZW0gZ28gYmFjayB0byBTVFJJTkdfTElURVJBTCB0byBiZSBtYXRjaGVkLiAgQU5UTFIgZG9lcyB0aGUKKy8vIHJpZ2h0IHRoaW5nIGJ5IG1hdGNoaW5nIGltbWVkaWF0ZWx5OyBoZW5jZSwgaXQncyBvayB0byBzaHV0IG9mZgorLy8gdGhlIEZPTExPVyBhbWJpZyB3YXJuaW5ncy4KK3Byb3RlY3RlZAorRVNDCisJOgknXFwnCisJCSgJJ24nCisJCXwJJ3InCisJCXwJJ3QnCisJCXwJJ2InCisJCXwJJ2YnCisJCXwJJyInCisJCXwJJ1wnJworCQl8CSdcXCcKKwkJfAkoJ3UnKSsgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUIAorCQl8CSgnMCcuLiczJykKKwkJCSgKKwkJCQlvcHRpb25zIHsKKwkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworCQkJCX0KKwkJCToJKCcwJy4uJzcnKQorCQkJCSgJCisJCQkJCW9wdGlvbnMgeworCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworCQkJCQl9CisJCQkJOgknMCcuLic3JworCQkJCSk/CisJCQkpPworCQl8CSgnNCcuLic3JykKKwkJCSgKKwkJCQlvcHRpb25zIHsKKwkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworCQkJCX0KKwkJCToJKCcwJy4uJzknKQorCQkJKT8KKwkJKQorCTsKKworCisvLyBoZXhhZGVjaW1hbCBkaWdpdCAoYWdhaW4sIG5vdGUgaXQncyBwcm90ZWN0ZWQhKQorcHJvdGVjdGVkCitIRVhfRElHSVQKKwk6CSgnMCcuLic5J3wnQScuLidGJ3wnYScuLidmJykKKwk7CisKKworLy8gYSBkdW1teSBydWxlIHRvIGZvcmNlIHZvY2FidWxhcnkgdG8gYmUgYWxsIGNoYXJhY3RlcnMgKGV4Y2VwdCBzcGVjaWFsCisvLyAgIG9uZXMgdGhhdCBBTlRMUiB1c2VzIGludGVybmFsbHkgKDAgdG8gMikKK3Byb3RlY3RlZAorVk9DQUIKKwk6CSdcMycuLidcMzc3JworCTsKKworCisvLyBhbiBpZGVudGlmaWVyLiAgTm90ZSB0aGF0IHRlc3RMaXRlcmFscyBpcyBzZXQgdG8gdHJ1ZSEgIFRoaXMgbWVhbnMKKy8vIHRoYXQgYWZ0ZXIgd2UgbWF0Y2ggdGhlIHJ1bGUsIHdlIGxvb2sgaW4gdGhlIGxpdGVyYWxzIHRhYmxlIHRvIHNlZQorLy8gaWYgaXQncyBhIGxpdGVyYWwgb3IgcmVhbGx5IGFuIGlkZW50aWZlcgorSURFTlQKKwlvcHRpb25zIHt0ZXN0TGl0ZXJhbHM9dHJ1ZTt9CisJOgkoJ2EnLi4neid8J0EnLi4nWid8J18nfCckJykgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5J3wnJCcpKgorCTsKKworCisvLyBhIG51bWVyaWMgbGl0ZXJhbAorTlVNX0lOVAorCXtib29sZWFuIGlzRGVjaW1hbD1mYWxzZTt9CisJOgknLicge190dHlwZSA9IERPVDt9CisJCQkoKCcwJy4uJzknKSsgKEVYUE9ORU5UKT8gKEZMT0FUX1NVRkZJWCk/IHsgX3R0eXBlID0gTlVNX0ZMT0FUOyB9KT8KKwl8CSgJJzAnIHtpc0RlY2ltYWwgPSB0cnVlO30gLy8gc3BlY2lhbCBjYXNlIGZvciBqdXN0ICcwJworCQkJKAkoJ3gnfCdYJykKKwkJCQkoCQkJCQkJCQkJCQkvLyBoZXgKKwkJCQkJLy8gdGhlICdlJ3wnRScgYW5kIGZsb2F0IHN1ZmZpeCBzdHVmZiBsb29rCisJCQkJCS8vIGxpa2UgaGV4IGRpZ2l0cywgaGVuY2UgdGhlICguLi4pKyBkb2Vzbid0CisJCQkJCS8vIGtub3cgd2hlbiB0byBzdG9wOiBhbWJpZy4gIEFOVExSIHJlc29sdmVzCisJCQkJCS8vIGl0IGNvcnJlY3RseSBieSBtYXRjaGluZyBpbW1lZGlhdGVseS4gIEl0CisJCQkJCS8vIGlzIHRoZXJlZm9yIG9rIHRvIGh1c2ggd2FybmluZy4KKwkJCQkJb3B0aW9ucyB7CisJCQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnPWZhbHNlOworCQkJCQl9CisJCQkJOglIRVhfRElHSVQKKwkJCQkpKworCQkJfAkoJzAnLi4nNycpKwkJCQkJCQkJCS8vIG9jdGFsCisJCQkpPworCQl8CSgnMScuLic5JykgKCcwJy4uJzknKSogIHtpc0RlY2ltYWw9dHJ1ZTt9CQkvLyBub24temVybyBkZWNpbWFsCisJCSkKKwkJKAkoJ2wnfCdMJykKKwkJCisJCS8vIG9ubHkgY2hlY2sgdG8gc2VlIGlmIGl0J3MgYSBmbG9hdCBpZiBsb29rcyBsaWtlIGRlY2ltYWwgc28gZmFyCisJCXwJe2lzRGVjaW1hbH0/CisJCQkoCScuJyAoJzAnLi4nOScpKiAoRVhQT05FTlQpPyAoRkxPQVRfU1VGRklYKT8KKwkJCXwJRVhQT05FTlQgKEZMT0FUX1NVRkZJWCk/CisJCQl8CUZMT0FUX1NVRkZJWAorCQkJKQorCQkJeyBfdHR5cGUgPSBOVU1fRkxPQVQ7IH0KKwkJKT8KKwk7CisKKworLy8gYSBjb3VwbGUgcHJvdGVjdGVkIG1ldGhvZHMgdG8gYXNzaXN0IGluIG1hdGNoaW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKK3Byb3RlY3RlZAorRVhQT05FTlQKKwk6CSgnZSd8J0UnKSAoJysnfCctJyk/ICgnMCcuLic5JykrCisJOworCisKK3Byb3RlY3RlZAorRkxPQVRfU1VGRklYCisJOgknZid8J0YnfCdkJ3wnRCcKKwk7CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2phdmEudHJlZS5nIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvamF2YS50cmVlLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2NWMzNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2phdmEudHJlZS5nCkBAIC0wLDAgKzEsMzEyIEBACisvKiogSmF2YSAxLjIgQVNUIFJlY29nbml6ZXIgR3JhbW1hcgorICoKKyAqIEF1dGhvcjoKKyAqCVRlcmVuY2UgUGFycglwYXJydEBqZ3VydS5jb20KKyAqCisgKiBWZXJzaW9uIHRyYWNraW5nIG5vdyBkb25lIHdpdGggZm9sbG93aW5nIElEOgorICoKKyAqIFRoaXMgZ3JhbW1hciBpcyBpbiB0aGUgUFVCTElDIERPTUFJTgorICoKKyAqIEJVR1MKKyAqLworY2xhc3MgSmF2YVRyZWVQYXJzZXIgZXh0ZW5kcyBUcmVlUGFyc2VyOworCitvcHRpb25zIHsKKwlpbXBvcnRWb2NhYiA9IEphdmE7Cit9CisKK2NvbXBpbGF0aW9uVW5pdAorCToJKHBhY2thZ2VEZWZpbml0aW9uKT8KKwkJKGltcG9ydERlZmluaXRpb24pKgorCQkodHlwZURlZmluaXRpb24pKgorCTsKKworcGFja2FnZURlZmluaXRpb24KKwk6CSMoIFBBQ0tBR0VfREVGIGlkZW50aWZpZXIgKQorCTsKKworaW1wb3J0RGVmaW5pdGlvbgorCToJIyggSU1QT1JUIGlkZW50aWZpZXJTdGFyICkKKwk7CisKK3R5cGVEZWZpbml0aW9uCisJOgkjKENMQVNTX0RFRiBtb2RpZmllcnMgSURFTlQgZXh0ZW5kc0NsYXVzZSBpbXBsZW1lbnRzQ2xhdXNlIG9iakJsb2NrICkKKwl8CSMoSU5URVJGQUNFX0RFRiBtb2RpZmllcnMgSURFTlQgZXh0ZW5kc0NsYXVzZSBpbnRlcmZhY2VCbG9jayApCisJOworCit0eXBlU3BlYworCToJIyhUWVBFIHR5cGVTcGVjQXJyYXkpCisJOworCit0eXBlU3BlY0FycmF5CisJOgkjKCBBUlJBWV9ERUNMQVJBVE9SIHR5cGVTcGVjQXJyYXkgKQorCXwJdHlwZQorCTsKKwordHlwZToJaWRlbnRpZmllcgorCXwJYnVpbHRJblR5cGUKKwk7CisKK2J1aWx0SW5UeXBlCisgICAgOiAgICJ2b2lkIgorICAgIHwgICAiYm9vbGVhbiIKKyAgICB8ICAgImJ5dGUiCisgICAgfCAgICJjaGFyIgorICAgIHwgICAic2hvcnQiCisgICAgfCAgICJpbnQiCisgICAgfCAgICJmbG9hdCIKKyAgICB8ICAgImxvbmciCisgICAgfCAgICJkb3VibGUiCisgICAgOworCittb2RpZmllcnMKKwk6CSMoIE1PRElGSUVSUyAobW9kaWZpZXIpKiApCisJOworCittb2RpZmllcgorICAgIDogICAicHJpdmF0ZSIKKyAgICB8ICAgInB1YmxpYyIKKyAgICB8ICAgInByb3RlY3RlZCIKKyAgICB8ICAgInN0YXRpYyIKKyAgICB8ICAgInRyYW5zaWVudCIKKyAgICB8ICAgImZpbmFsIgorICAgIHwgICAiYWJzdHJhY3QiCisgICAgfCAgICJuYXRpdmUiCisgICAgfCAgICJ0aHJlYWRzYWZlIgorICAgIHwgICAic3luY2hyb25pemVkIgorICAgIHwgICAiY29uc3QiCisgICAgfCAgICJ2b2xhdGlsZSIKKyAgICA7CisKK2V4dGVuZHNDbGF1c2UKKwk6CSMoRVhURU5EU19DTEFVU0UgKGlkZW50aWZpZXIpKiApCisJOworCitpbXBsZW1lbnRzQ2xhdXNlCisJOgkjKElNUExFTUVOVFNfQ0xBVVNFIChpZGVudGlmaWVyKSogKQorCTsKKworCitpbnRlcmZhY2VCbG9jaworCToJIygJT0JKQkxPQ0sKKwkJCSgJbWV0aG9kRGVjbAorCQkJfAl2YXJpYWJsZURlZgorCQkJKSoKKwkJKQorCTsKKwkKK29iakJsb2NrCisJOgkjKAlPQkpCTE9DSworCQkJKAljdG9yRGVmCisJCQl8CW1ldGhvZERlZgorCQkJfAl2YXJpYWJsZURlZgorCQkJfAl0eXBlRGVmaW5pdGlvbgorCQkJfAkjKFNUQVRJQ19JTklUIHNsaXN0KQorCQkJfAkjKElOU1RBTkNFX0lOSVQgc2xpc3QpCisJCQkpKgorCQkpCisJOworCitjdG9yRGVmCisJOgkjKENUT1JfREVGIG1vZGlmaWVycyBtZXRob2RIZWFkIHNsaXN0KQorCTsKKworbWV0aG9kRGVjbAorCToJIyhNRVRIT0RfREVGIG1vZGlmaWVycyB0eXBlU3BlYyBtZXRob2RIZWFkKQorCTsKKworbWV0aG9kRGVmCisJOgkjKE1FVEhPRF9ERUYgbW9kaWZpZXJzIHR5cGVTcGVjIG1ldGhvZEhlYWQgKHNsaXN0KT8pCisJOworCit2YXJpYWJsZURlZgorCToJIyhWQVJJQUJMRV9ERUYgbW9kaWZpZXJzIHR5cGVTcGVjIHZhcmlhYmxlRGVjbGFyYXRvciB2YXJJbml0aWFsaXplcikKKwk7CisKK3BhcmFtZXRlckRlZgorCToJIyhQQVJBTUVURVJfREVGIG1vZGlmaWVycyB0eXBlU3BlYyBJREVOVCApCisJOworCitvYmplY3Rpbml0aWFsaXplcgorCToJIyhJTlNUQU5DRV9JTklUIHNsaXN0KQorCTsKKwordmFyaWFibGVEZWNsYXJhdG9yCisJOglJREVOVAorCXwJTEJSQUNLIHZhcmlhYmxlRGVjbGFyYXRvcgorCTsKKwordmFySW5pdGlhbGl6ZXIKKwk6CSMoQVNTSUdOIGluaXRpYWxpemVyKQorCXwKKwk7CisKK2luaXRpYWxpemVyCisJOglleHByZXNzaW9uCisJfAlhcnJheUluaXRpYWxpemVyCisJOworCithcnJheUluaXRpYWxpemVyCisJOgkjKEFSUkFZX0lOSVQgKGluaXRpYWxpemVyKSopCisJOworCittZXRob2RIZWFkCisJOglJREVOVCAjKCBQQVJBTUVURVJTIChwYXJhbWV0ZXJEZWYpKiApICh0aHJvd3NDbGF1c2UpPworCTsKKwordGhyb3dzQ2xhdXNlCisJOgkjKCAidGhyb3dzIiAoaWRlbnRpZmllcikqICkKKwk7CisKK2lkZW50aWZpZXIKKwk6CUlERU5UCisJfAkjKCBET1QgaWRlbnRpZmllciBJREVOVCApCisJOworCitpZGVudGlmaWVyU3RhcgorCToJSURFTlQKKwl8CSMoIERPVCBpZGVudGlmaWVyIChTVEFSfElERU5UKSApCisJOworCitzbGlzdAorCToJIyggU0xJU1QgKHN0YXQpKiApCisJOworCitzdGF0Ogl0eXBlRGVmaW5pdGlvbgorCXwJdmFyaWFibGVEZWYKKwl8CWV4cHJlc3Npb24KKwl8CSMoTEFCRUxFRF9TVEFUIElERU5UIHN0YXQpCisJfAkjKCJpZiIgZXhwcmVzc2lvbiBzdGF0IChzdGF0KT8gKQorCXwJIygJImZvciIKKwkJCSMoRk9SX0lOSVQgKHZhcmlhYmxlRGVmIHwgZWxpc3QpPykKKwkJCSMoRk9SX0NPTkRJVElPTiAoZXhwcmVzc2lvbik/KQorCQkJIyhGT1JfSVRFUkFUT1IgKGVsaXN0KT8pCisJCQlzdGF0CisJCSkKKwl8CSMoIndoaWxlIiBleHByZXNzaW9uIHN0YXQpCisJfAkjKCJkbyIgc3RhdCBleHByZXNzaW9uKQorCXwJIygiYnJlYWsiIChJREVOVCk/ICkKKwl8CSMoImNvbnRpbnVlIiAoSURFTlQpPyApCisJfAkjKCJyZXR1cm4iIChleHByZXNzaW9uKT8gKQorCXwJIygic3dpdGNoIiBleHByZXNzaW9uIChjYXNlR3JvdXApKikKKwl8CSMoInRocm93IiBleHByZXNzaW9uKQorCXwJIygic3luY2hyb25pemVkIiBleHByZXNzaW9uIHN0YXQpCisJfAl0cnlCbG9jaworCXwJc2xpc3QgLy8gbmVzdGVkIFNMSVNUCisJfAlFTVBUWV9TVEFUCisJOworCitjYXNlR3JvdXAKKwk6CSMoQ0FTRV9HUk9VUCAoIygiY2FzZSIgZXhwcmVzc2lvbikgfCAiZGVmYXVsdCIpKyBzbGlzdCkKKwk7CisKK3RyeUJsb2NrCisJOgkjKCAidHJ5IiBzbGlzdCAoaGFuZGxlcikqICgjKCJmaW5hbGx5IiBzbGlzdCkpPyApCisJOworCitoYW5kbGVyCisJOgkjKCAiY2F0Y2giIHBhcmFtZXRlckRlZiBzbGlzdCApCisJOworCitlbGlzdAorCToJIyggRUxJU1QgKGV4cHJlc3Npb24pKiApCisJOworCitleHByZXNzaW9uCisJOgkjKEVYUFIgZXhwcikKKwk7CisKK2V4cHI6CSMoUVVFU1RJT04gZXhwciBleHByIGV4cHIpCS8vIHRyaW5hcnkgb3BlcmF0b3IKKwl8CSMoQVNTSUdOIGV4cHIgZXhwcikJCQkvLyBiaW5hcnkgb3BlcmF0b3JzLi4uCisJfAkjKFBMVVNfQVNTSUdOIGV4cHIgZXhwcikKKwl8CSMoTUlOVVNfQVNTSUdOIGV4cHIgZXhwcikKKwl8CSMoU1RBUl9BU1NJR04gZXhwciBleHByKQorCXwJIyhESVZfQVNTSUdOIGV4cHIgZXhwcikKKwl8CSMoTU9EX0FTU0lHTiBleHByIGV4cHIpCisJfAkjKFNSX0FTU0lHTiBleHByIGV4cHIpCisJfAkjKEJTUl9BU1NJR04gZXhwciBleHByKQorCXwJIyhTTF9BU1NJR04gZXhwciBleHByKQorCXwJIyhCQU5EX0FTU0lHTiBleHByIGV4cHIpCisJfAkjKEJYT1JfQVNTSUdOIGV4cHIgZXhwcikKKwl8CSMoQk9SX0FTU0lHTiBleHByIGV4cHIpCisJfAkjKExPUiBleHByIGV4cHIpCisJfAkjKExBTkQgZXhwciBleHByKQorCXwJIyhCT1IgZXhwciBleHByKQorCXwJIyhCWE9SIGV4cHIgZXhwcikKKwl8CSMoQkFORCBleHByIGV4cHIpCisJfAkjKE5PVF9FUVVBTCBleHByIGV4cHIpCisJfAkjKEVRVUFMIGV4cHIgZXhwcikKKwl8CSMoTFQgZXhwciBleHByKQorCXwJIyhHVCBleHByIGV4cHIpCisJfAkjKExFIGV4cHIgZXhwcikKKwl8CSMoR0UgZXhwciBleHByKQorCXwJIyhTTCBleHByIGV4cHIpCisJfAkjKFNSIGV4cHIgZXhwcikKKwl8CSMoQlNSIGV4cHIgZXhwcikKKwl8CSMoUExVUyBleHByIGV4cHIpCisJfAkjKE1JTlVTIGV4cHIgZXhwcikKKwl8CSMoRElWIGV4cHIgZXhwcikKKwl8CSMoTU9EIGV4cHIgZXhwcikKKwl8CSMoU1RBUiBleHByIGV4cHIpCisJfAkjKElOQyBleHByKQorCXwJIyhERUMgZXhwcikKKwl8CSMoUE9TVF9JTkMgZXhwcikKKwl8CSMoUE9TVF9ERUMgZXhwcikKKwl8CSMoQk5PVCBleHByKQorCXwJIyhMTk9UIGV4cHIpCisJfAkjKCJpbnN0YW5jZW9mIiBleHByIGV4cHIpCisJfAkjKFVOQVJZX01JTlVTIGV4cHIpCisJfAkjKFVOQVJZX1BMVVMgZXhwcikKKwl8CXByaW1hcnlFeHByZXNzaW9uCisJOworCitwcmltYXJ5RXhwcmVzc2lvbgorICAgIDogICBJREVOVAorICAgIHwgICAjKAlET1QKKwkJCSgJZXhwcgorCQkJCSgJSURFTlQKKwkJCQl8CWFycmF5SW5kZXgKKwkJCQl8CSJ0aGlzIgorCQkJCXwJImNsYXNzIgorCQkJCXwJIyggIm5ldyIgSURFTlQgZWxpc3QgKQorCQkJCSkKKwkJCXwJIyhBUlJBWV9ERUNMQVJBVE9SIHR5cGUpCisJCQl8CWJ1aWx0SW5UeXBlICgiY2xhc3MiKT8KKwkJCSkKKwkJKQorCXwJYXJyYXlJbmRleAorCXwJIyhNRVRIT0RfQ0FMTCBwcmltYXJ5RXhwcmVzc2lvbiBlbGlzdCkKKwl8CSMoVFlQRUNBU1QgdHlwZVNwZWMgZXhwcikKKwl8ICAgbmV3RXhwcmVzc2lvbgorCXwgICBjb25zdGFudAorICAgIHwgICAic3VwZXIiCisgICAgfCAgICJ0cnVlIgorICAgIHwgICAiZmFsc2UiCisgICAgfCAgICJ0aGlzIgorICAgIHwgICAibnVsbCIKKwl8CXR5cGVTcGVjIC8vIHR5cGUgbmFtZSB1c2VkIHdpdGggaW5zdGFuY2VvZgorCTsKKworYXJyYXlJbmRleAorCToJIyhJTkRFWF9PUCBwcmltYXJ5RXhwcmVzc2lvbiBleHByZXNzaW9uKQorCTsKKworY29uc3RhbnQKKyAgICA6ICAgTlVNX0lOVAorICAgIHwgICBDSEFSX0xJVEVSQUwKKyAgICB8ICAgU1RSSU5HX0xJVEVSQUwKKyAgICB8ICAgTlVNX0ZMT0FUCisgICAgOworCituZXdFeHByZXNzaW9uCisJOgkjKAkibmV3IiB0eXBlCisJCQkoCW5ld0FycmF5RGVjbGFyYXRvciAoYXJyYXlJbml0aWFsaXplcik/CisJCQl8CWVsaXN0CisJCQkpCisJCSkKKwkJCQorCTsKKworbmV3QXJyYXlEZWNsYXJhdG9yCisJOgkjKCBBUlJBWV9ERUNMQVJBVE9SIChuZXdBcnJheURlY2xhcmF0b3IpPyAoZXhwcmVzc2lvbik/ICkKKwk7CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvZGVwZW5kLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9kZXBlbmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzE2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvZGVwZW5kLnhtbApAQCAtMCwwICsxLDIwMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImRlcGVuZCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCI+CisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMxLmRpciIgdmFsdWU9InNyYzEiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNyYzIuZGlyIiB2YWx1ZT0ic3JjMiIvPgorICA8cHJvcGVydHkgbmFtZT0ic3JjMy5kaXIiIHZhbHVlPSJzcmMzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzcmM0LmRpciIgdmFsdWU9InNyYzQiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNyYzUuZGlyIiB2YWx1ZT0ic3JjNSIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZW1wc3JjLmRpciIgdmFsdWU9IndvcmtpbmciLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNhY2hlLmRpciIgdmFsdWU9IndvcmtpbmciLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iY2xhc3NlcyIvPgorICA8dGFyZ2V0IG5hbWU9ImhlbHAiPgorICAgIDxlY2hvPlRoaXMgYnVpbGRmaWxlIGlzIHVzZWQgYXMgcGFydCBvZiBBbnQncyB0ZXN0IHN1aXRlLjwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJiYXNlc2V0dXAiIGRlcGVuZHM9ImNsZWFuIj4KKyAgICA8bWtkaXIgZGlyPSIke3RlbXBzcmMuZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNyYzFzZXR1cCIgZGVwZW5kcz0iYmFzZXNldHVwIj4KKyAgICA8Y29weSB0b2Rpcj0iJHt0ZW1wc3JjLmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYzEuZGlyfSIvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzcmMyc2V0dXAiIGRlcGVuZHM9ImJhc2VzZXR1cCI+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVtcHNyYy5kaXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMyLmRpcn0iLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic3JjM3NldHVwIiBkZXBlbmRzPSJiYXNlc2V0dXAiPgorICAgIDxjb3B5IHRvZGlyPSIke3RlbXBzcmMuZGlyfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjMy5kaXJ9Ii8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNyYzRzZXR1cCIgZGVwZW5kcz0iYmFzZXNldHVwIj4KKyAgICA8Y29weSB0b2Rpcj0iJHt0ZW1wc3JjLmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYzQuZGlyfSIvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzcmM1c2V0dXAiIGRlcGVuZHM9ImJhc2VzZXR1cCI+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVtcHNyYy5kaXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmM1LmRpcn0iLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSI+CisgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICA8amF2YWMgc3JjZGlyPSIke3RlbXBzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgPGRlbGV0ZSBkaXI9IiR7dGVtcHNyYy5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGRpcmVjdCIgZGVwZW5kcz0ic3JjMXNldHVwLCBjb21waWxlIj4KKyAgICA8c2xlZXAgc2Vjb25kcz0iMyIvPgorICAgIDxkZWxldGUgZmlsZT0iJHt0ZW1wc3JjLmRpcn0vQy5qYXZhIi8+CisgICAgPGNvcHkgZmlsZT0iJHtzcmMxLmRpcn0vQy5qYXZhIiB0b2ZpbGU9IiR7dGVtcHNyYy5kaXJ9L0MuamF2YSIvPgorICAgIDxkZXBlbmQgc3JjZGlyPSIke3RlbXBzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICA8ZmlsZXNldCBpZD0icmVzdWx0IiBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGNsb3N1cmUiIGRlcGVuZHM9InNyYzFzZXR1cCwgY29tcGlsZSI+CisgICAgPHNsZWVwIHNlY29uZHM9IjMiLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7dGVtcHNyYy5kaXJ9L0MuamF2YSIvPgorICAgIDxjb3B5IGZpbGU9IiR7c3JjMS5kaXJ9L0MuamF2YSIgdG9maWxlPSIke3RlbXBzcmMuZGlyfS9DLmphdmEiLz4KKyAgICA8ZGVwZW5kIHNyY2Rpcj0iJHt0ZW1wc3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBjbG9zdXJlPSJ5ZXMiLz4KKyAgICA8ZmlsZXNldCBpZD0icmVzdWx0IiBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGJhc2ljc2V0IiBkZXBlbmRzPSJzcmMxc2V0dXAsIGNvbXBpbGUiPgorICAgIDxjbGFzc2ZpbGVzZXQgaWQ9InJlc3VsdCIgZGlyPSIke2NsYXNzZXMuZGlyfSIgcm9vdGNsYXNzPSJBIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHNtYWxsc2V0IiBkZXBlbmRzPSJzcmMxc2V0dXAsIGNvbXBpbGUiPgorICAgIDxjbGFzc2ZpbGVzZXQgaWQ9InJlc3VsdCIgZGlyPSIke2NsYXNzZXMuZGlyfSIgcm9vdGNsYXNzPSJCIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHJlc291cmNlY29sbGVjdGlvbiIgZGVwZW5kcz0idGVzdHNtYWxsc2V0Ij4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIyIiByZWZpZD0icmVzdWx0IiAvPgorICAgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICAgICAgICA8aW50ZXJzZWN0PgorICAgICAgICAgICAgICAgIDxyZXNvdXJjZXMgcmVmaWQ9InJlc3VsdCIgLz4KKyAgICAgICAgICAgICAgICA8ZmlsZSBmaWxlPSIke2NsYXNzZXMuZGlyfS9CLmNsYXNzIiAvPgorICAgICAgICAgICAgICA8L2ludGVyc2VjdD4KKyAgICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KKyAgICAgICAgICAgICAgPGludGVyc2VjdD4KKyAgICAgICAgICAgICAgICA8cmVzb3VyY2VzIHJlZmlkPSJyZXN1bHQiIC8+CisgICAgICAgICAgICAgICAgPGZpbGUgZmlsZT0iJHtjbGFzc2VzLmRpcn0vQy5jbGFzcyIgLz4KKyAgICAgICAgICAgICAgPC9pbnRlcnNlY3Q+CisgICAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rjb21ib3NldCIgZGVwZW5kcz0ic3JjMXNldHVwLCBjb21waWxlIj4KKyAgICA8Y2xhc3NmaWxlc2V0IGlkPSJyZXN1bHQiIGRpcj0iJHtjbGFzc2VzLmRpcn0iIHJvb3RjbGFzcz0iQiI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9DLmNsYXNzIi8+CisgICAgPC9jbGFzc2ZpbGVzZXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGJ5cmVmZXJlbmNlIiBkZXBlbmRzPSJzcmMxc2V0dXAsIGNvbXBpbGUiPgorICAgIDxjbGFzc2ZpbGVzZXQgaWQ9ImNsYXNzU2V0IiBkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiByb290Y2xhc3M9IkEiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKiovQy5jbGFzcyIvPgorICAgIDwvY2xhc3NmaWxlc2V0PgorICAgIDxqYXIgZGVzdGZpbGU9IiR7dGVtcHNyYy5kaXJ9L3Rlc3QuamFyIj4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJjbGFzc1NldCIvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RtZXRob2RwYXJhbSIgZGVwZW5kcz0ic3JjMXNldHVwLCBjb21waWxlIj4KKyAgICA8Y2xhc3NmaWxlc2V0IGlkPSJyZXN1bHQiIGRpcj0iJHtjbGFzc2VzLmRpcn0iIHJvb3RjbGFzcz0iRSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rpbm5lciIgZGVwZW5kcz0ic3JjMnNldHVwLCBjb21waWxlIj4KKyAgICA8c2xlZXAgc2Vjb25kcz0iMyIvPgorICAgIDxkZWxldGUgZmlsZT0iJHt0ZW1wc3JjLmRpcn0vQi5qYXZhIi8+CisgICAgPGNvcHkgZmlsZT0iJHtzcmMyLmRpcn0vQi5qYXZhIiB0b2ZpbGU9IiR7dGVtcHNyYy5kaXJ9L0IuamF2YSIvPgorICAgIDxkZXBlbmQgc3JjZGlyPSIke3RlbXBzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGNsb3N1cmU9InllcyIvPgorICAgIDxmaWxlc2V0IGlkPSJyZXN1bHQiIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0aW5uZXJpbm5lciIgZGVwZW5kcz0ic3JjM3NldHVwLCBjb21waWxlIj4KKyAgICA8c2xlZXAgc2Vjb25kcz0iMyIvPgorICAgIDxkZWxldGUgZmlsZT0iJHt0ZW1wc3JjLmRpcn0vQi5qYXZhIi8+CisgICAgPGNvcHkgZmlsZT0iJHtzcmMzLmRpcn0vQi5qYXZhIiB0b2ZpbGU9IiR7dGVtcHNyYy5kaXJ9L0IuamF2YSIvPgorICAgIDxkZXBlbmQgc3JjZGlyPSIke3RlbXBzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGNsb3N1cmU9InllcyIvPgorICAgIDxmaWxlc2V0IGlkPSJyZXN1bHQiIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bWV0aG9kcGFyYW1pbm5lciIgZGVwZW5kcz0ic3JjNHNldHVwLCBjb21waWxlIj4KKyAgICA8Y2xhc3NmaWxlc2V0IGlkPSJyZXN1bHQiIGRpcj0iJHtjbGFzc2VzLmRpcn0iIHJvb3RjbGFzcz0idGVzdC5NZXRob2RQYXJhbSIvPgorICA8L3RhcmdldD4gIAorCisgIDx0YXJnZXQgbmFtZT0idGVzdG5vc291cmNlIiBkZXBlbmRzPSJzcmMxc2V0dXAsIGNvbXBpbGUiPgorICAgIDxkZXBlbmQgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGNsb3N1cmU9InllcyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RlbXB0eXNvdXJjZSIgZGVwZW5kcz0ic3JjMXNldHVwLCBjb21waWxlIj4KKyAgICA8ZGVwZW5kIHNyY2Rpcj0iIiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIgY2xvc3VyZT0ieWVzIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGlubmVyY2xvc3VyZSIgZGVwZW5kcz0ic3JjNHNldHVwIj4KKyAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIvPgorICAgIDxwYXRoIGlkPSJwYXRoLmNvbXBpbGUiPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgPC9wYXRoPgorCisgICAgPGphdmFjIHNyY2Rpcj0iJHt0ZW1wc3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IgorICAgICAgICAgICBjbGFzc3BhdGhyZWY9InBhdGguY29tcGlsZSIvPgorCisgICAgPHNsZWVwIHNlY29uZHM9IjMiLz4KKyAgICA8ZGVwZW5kIHNyY2Rpcj0iJHt0ZW1wc3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiAKKyAgICAgICAgICAgIGNsb3N1cmU9InllcyIgZHVtcD0ieWVzIgorICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJwYXRoLmNvbXBpbGUiLz4KKworICAgIDxmaWxlc2V0IGlkPSJyZXN1bHQiIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Y2FjaGUiIGRlcGVuZHM9InNyYzFzZXR1cCwgY29tcGlsZSI+CisgICAgPGRlcGVuZCBjYWNoZT0iJHtjYWNoZS5kaXJ9IiBzcmNkaXI9IiR7dGVtcHNyYy5kaXJ9IiAKKyAgICAgICAgICAgIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBjbG9zdXJlPSJ5ZXMiLz4KKyAgICA8ZGVwZW5kIGNhY2hlPSIke2NhY2hlLmRpcn0iIHNyY2Rpcj0iJHt0ZW1wc3JjLmRpcn0iIAorICAgICAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGNsb3N1cmU9InllcyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rub25wdWJsaWMiIGRlcGVuZHM9InNyYzVzZXR1cCwgY29tcGlsZSI+CisgICAgPHNsZWVwIHNlY29uZHM9IjMiLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7dGVtcHNyYy5kaXJ9L0IuamF2YSIvPgorICAgIDxjb3B5IGZpbGU9IiR7c3JjMi5kaXJ9L0IuamF2YSIgdG9maWxlPSIke3RlbXBzcmMuZGlyfS9CLmphdmEiLz4KKyAgICA8ZGVwZW5kIHNyY2Rpcj0iJHt0ZW1wc3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBjbG9zdXJlPSJ5ZXMiLz4KKyAgICA8ZmlsZXNldCBpZD0icmVzdWx0IiBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvQS5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvQS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNmRmMjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9BLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcHVibGljIGNsYXNzIEEgZXh0ZW5kcyBCIHsKKyAgICBwcml2YXRlIEQgZCA9IG5ldyBEKCk7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0IuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU1MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvQi5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3B1YmxpYyBjbGFzcyBCIGV4dGVuZHMgQyB7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0MuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJmY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvQy5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3B1YmxpYyBjbGFzcyBDIHsKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvRC5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvRC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyN2RlNTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9ELmphdmEKQEAgLTAsMCArMSwxOSBAQAorLyoKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcHVibGljIGNsYXNzIEQgeworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9FLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9FLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmZDYxMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0UuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwdWJsaWMgY2xhc3MgRSB7CisgICAgRSgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEEuY2xhc3MpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzIvQS5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzIvQS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjM1YmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMi9BLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcHVibGljIGNsYXNzIEEgeworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIElubmVyIGV4dGVuZHMgQiB7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMi9CLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMi9CLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3YjdkMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMyL0IuamF2YQpAQCAtMCwwICsxLDE5IEBACisvKgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwdWJsaWMgY2xhc3MgQiB7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMzL0EuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMzL0EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDk3M2IxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzMvQS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3B1YmxpYyBjbGFzcyBBIHsKKyAgICBzdGF0aWMgcHJpdmF0ZSBjbGFzcyBJbm5lciB7CisgICAgICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIElubmVyMiBleHRlbmRzIEIgeworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMy9CLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMy9CLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3YjdkMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMzL0IuamF2YQpAQCAtMCwwICsxLDE5IEBACisvKgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwdWJsaWMgY2xhc3MgQiB7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM0L3Rlc3QvQ29udGFpbnNPbmx5SW5uZXIuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM0L3Rlc3QvQ29udGFpbnNPbmx5SW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDAyNTRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzQvdGVzdC9Db250YWluc09ubHlJbm5lci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgdGVzdDsKKworcHVibGljIGNsYXNzIENvbnRhaW5zT25seUlubmVyIHsKKyAgICB2b2lkIG1ldGhvZDEoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihPdXRlci5Jbm5lci5jbGFzcyk7CisgICAgfSAgICAKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzQvdGVzdC9NZXRob2RQYXJhbS5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzQvdGVzdC9NZXRob2RQYXJhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NmYwMTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNC90ZXN0L01ldGhvZFBhcmFtLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSB0ZXN0OworCitwdWJsaWMgY2xhc3MgTWV0aG9kUGFyYW0geworICAgIHZvaWQgbWV0aG9kMSgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludChDb250YWluc09ubHlJbm5lci5jbGFzcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNC90ZXN0L091dGVyLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNC90ZXN0L091dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3MDkwMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM0L3Rlc3QvT3V0ZXIuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIHRlc3Q7CisKK3B1YmxpYyBjbGFzcyBPdXRlciB7CisgICAgc3RhdGljIGNsYXNzIElubmVyIHsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM1L0EuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM1L0EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTUyMWExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzUvQS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3B1YmxpYyBjbGFzcyBBIHsKKyAgICBBUHJpdmF0ZSBkZXBlbmRlbmN5ID0gbmV3IEFQcml2YXRlKCk7Cit9CisKK2NsYXNzIEFQcml2YXRlIGV4dGVuZHMgQiB7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNS9CLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNS9CLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3YjdkMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM1L0IuamF2YQpAQCAtMCwwICsxLDE5IEBACisvKgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwdWJsaWMgY2xhc3MgQiB7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTAwODgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQueG1sCkBAIC0wLDAgKzEsNDU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0iZG90bmV0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJpbml0Ij4KKyAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249ImRvdG5ldC9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgbG9jYXRpb249ImRvdG5ldCIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJvdXQuY3NjIiBsb2NhdGlvbj0iJHtzcmMuZGlyfS9vdXQuY3MiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im91dC5hcHAiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vb3V0LmV4ZSIvPgorICA8cHJvcGVydHkgbmFtZT0ib3V0LnR5cGUiIHZhbHVlPSJleGUiLz4KKworICA8dGFyZ2V0IG5hbWU9InByb2JlX2Zvcl9hcHBzIiA+CisgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJpbGFzbS5mb3VuZCI+CisgICAgICA8b3I+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iaWxhc20iICAgICBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iaWxhc20uZXhlIiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iaWxhc20uZXhlIiBmaWxlcGF0aD0iJHtlbnYuUGF0aH0iIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgPGVjaG8+IGlsYXNtLmZvdW5kPSR7aWxhc20uZm91bmR9PC9lY2hvPgorICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY3NjLmZvdW5kIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJjc2MiICAgICBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iY3NjLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9ImNzYy5leGUiIGZpbGVwYXRoPSIke2Vudi5QYXRofSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICA8ZWNobz4gY3NjLmZvdW5kPSR7Y3NjLmZvdW5kfTwvZWNobz4KKyAgIDwhLS0gdmlzdWFsIGJhc2ljIGNvbXBpbGVyIC0tPgorICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmJjLmZvdW5kIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJ2YmMiICAgICBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0idmJjLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9InZiYy5leGUiIGZpbGVwYXRoPSIke2Vudi5QYXRofSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICA8ZWNobz4gdmJjLmZvdW5kPSR7dmJjLmZvdW5kfTwvZWNobz4KKyAgIDwhLS0gdmlzdWFsIEojIGNvbXBpbGVyIC0tPgorICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianNoYXJwLmZvdW5kIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJ2amMiICAgICBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0idmpjLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9InZqYy5leGUiIGZpbGVwYXRoPSIke2Vudi5QYXRofSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICA8ZWNobz4ganNoYXJwLmZvdW5kPSR7anNoYXJwLmZvdW5kfTwvZWNobz4KKworICAgPCEtLSBNb25vIEMjIGNvbXBpbGVyIC0tPgorICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibWNzLmZvdW5kIj4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0ibWNzIiAgICAgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgPGVjaG8+IG1jcy5mb3VuZD0ke21jcy5mb3VuZH08L2VjaG8+CisKKyAgIDwhLS0gYW55IEMjIGNvbXBpbGVyIC0tPgorICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYyMuZm91bmQiPgorICAgICAgPG9yPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImNzYy5mb3VuZCIvPgorICAgICAgICA8aXNzZXQgcHJvcGVydHk9Im1jcy5mb3VuZCIvPgorICAgICAgPC9vcj4KKyAgIDwvY29uZGl0aW9uPgorCisgICA8IS0tIE1vbm8ncyBpbGFzbSAtLT4KKyAgIDxjb25kaXRpb24gcHJvcGVydHk9Im1vbm8uaWxhc20uZm91bmQiPgorICAgICAgPGF2YWlsYWJsZSBmaWxlPSJpbGFzbSIgICAgIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIgLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgIDxlY2hvPiBtb25vLmlsYXNtLmZvdW5kPSR7bW9uby5pbGFzbS5mb3VuZH08L2VjaG8+CisKKyAgIDxjb25kaXRpb24gcHJvcGVydHk9ImlsZGFzbS5mb3VuZCI+CisgICAgICA8b3I+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iaWxkYXNtIiAgICAgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9ImlsZGFzbS5leGUiIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIgLz4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJpbGRhc20uZXhlIiBmaWxlcGF0aD0iJHtlbnYuUGF0aH0iIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgPGVjaG8+IGlsZGFzbS5mb3VuZD0ke2lsZGFzbS5mb3VuZH08L2VjaG8+CisKKyAgIDxjb25kaXRpb24gcHJvcGVydHk9ImRvdG5ldGFwcHMuZm91bmQiPgorICAgICAgPG9yPgorICAgICAgICA8YW5kPgorICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0ibWNzLmZvdW5kIi8+CisgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJtb25vLmlsYXNtLmZvdW5kIi8+CisgICAgICAgIDwvYW5kPgorICAgICAgICA8YW5kPgorICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iY3NjLmZvdW5kIi8+Cis8IS0tICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ2YmMuZm91bmQiLz4gLS0+CisgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJpbGFzbS5mb3VuZCIvPgorICAgICAgICA8L2FuZD4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICA8ZWNobz4gZG90bmV0YXBwcy5mb3VuZD0ke2RvdG5ldGFwcHMuZm91bmR9PC9lY2hvPgorCisgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtb25vLmV4ZWN1dGFibGUiIHZhbHVlPSJtb25vIj4KKyAgICAgICAgPG9yPgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0ibW9ubyIgICAgIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIgLz4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9Im1vbm8uZXhlIiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIC8+CisgICAgICAgIDwvb3I+CisgICA8L2NvbmRpdGlvbj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJtb25vLmV4ZWN1dGFibGUiIHZhbHVlPSJtaW50Ii8+CisKKyAgIDwhLS0gbm93IHNldCBhIHByb3Agb2YgdGhlIGNvbXBpbGVyIG5hbWUgdG8gd2hhdGV2ZXIgd2UgZm91bmQgLS0+CisgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjcy5jb21waWxlciIgdmFsdWU9ImNzYyI+CisgICAgICA8aXNzZXQgcHJvcGVydHk9ImNzYy5mb3VuZCIvPgorICAgPC9jb25kaXRpb24+CisKKyAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNzLmNvbXBpbGVyIiB2YWx1ZT0ibWNzIj4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0ibWNzLmZvdW5kIi8+CisgICA8L2NvbmRpdGlvbj4KKworICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb2JlX2Zvcl9hcHBzIj4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyZG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlX2NzYyIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGZhaWwgdW5sZXNzPSJjIy5mb3VuZCI+TmVlZGVkIEMjIGNvbXBpbGVyIGlzIG1pc3Npbmc8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGVfaWxhc20iIGRlcGVuZHM9ImluaXQiPgorICAgIDxmYWlsIHVubGVzcz0iaWxhc20uZm91bmQiPk5lZWRlZCBpbGFzbSBpcyBtaXNzaW5nPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlX2pzaGFycCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGZhaWwgdW5sZXNzPSJqc2hhcnAuZm91bmQiPk5vIHZqYyBvbiB0aGUgcGF0aDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9InRlc3RDU0MiIGRlcGVuZHM9InRlc3RDU0MtTW9ubyx0ZXN0Q1NDLU1TIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q1NDLU1TIiBkZXBlbmRzPSJ2YWxpZGF0ZV9jc2MiIGlmPSJjc2MuZm91bmQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Q1NDLmV4ZSIKKyAgICAgIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vRXhhbXBsZUNzYy5leGUiIC8+CisgICAgPGNzYworICAgICAgZGVzdEZpbGU9IiR7dGVzdENTQy5leGV9IgorICAgICAgdGFyZ2V0VHlwZT0iZXhlIgorICAgICAgc3JjRGlyPSIke3NyYy5kaXJ9IgorICAgICAgPgorICAgIDwvY3NjPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFwcC5jcmVhdGVkIiBmaWxlPSIke3Rlc3RDU0MuZXhlfSIvPgorICAgIDxmYWlsIHVubGVzcz0iYXBwLmNyZWF0ZWQiPk5vIGFwcCAke3Rlc3RDU0MuZXhlfSBjcmVhdGVkPC9mYWlsPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGVzdENTQy5leGV9IiBmYWlsb25lcnJvcj0idHJ1ZSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7dGVzdENTQy5leGV9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENTQy1Nb25vIiBkZXBlbmRzPSJ2YWxpZGF0ZV9jc2MiIGlmPSJtY3MuZm91bmQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Q1NDLmV4ZSIKKyAgICAgIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vRXhhbXBsZUNzYy5leGUiIC8+CisgICAgPGNzYworICAgICAgZGVzdEZpbGU9IiR7dGVzdENTQy5leGV9IgorICAgICAgdGFyZ2V0VHlwZT0iZXhlIgorICAgICAgaW5jbHVkZWRlZmF1bHRyZWZlcmVuY2VzPSJ0cnVlIgorICAgICAgc3JjRGlyPSIke3NyYy5kaXJ9IgorICAgICAgPgorICAgIDwvY3NjPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFwcC5jcmVhdGVkIiBmaWxlPSIke3Rlc3RDU0MuZXhlfSIvPgorICAgIDxmYWlsIHVubGVzcz0iYXBwLmNyZWF0ZWQiPk5vIGFwcCAke3Rlc3RDU0MuZXhlfSBjcmVhdGVkPC9mYWlsPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7bW9uby5leGVjdXRhYmxlfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0Q1NDLmV4ZX0iLz4KKyAgICA8L2V4ZWM+CisgICAgPGRlbGV0ZSBmaWxlPSIke3Rlc3RDU0MuZXhlfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDU0NSZXNvdXJjZXMiIGRlcGVuZHM9InRlc3RDU0NSZXNvdXJjZXMtTW9ubyx0ZXN0Q1NDUmVzb3VyY2VzLU1TIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q1NDUmVzb3VyY2VzLU1TIiBkZXBlbmRzPSJ2YWxpZGF0ZV9jc2MiIGlmPSJjc2MuZm91bmQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Q1NDUmVzLmV4ZSIKKyAgICAgIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vRXhhbXBsZUNzY1Jlcy5leGUiIC8+CisgICAgPGNzYworICAgICAgZGVzdEZpbGU9IiR7dGVzdENTQ1Jlcy5leGV9IgorICAgICAgdGFyZ2V0VHlwZT0iZXhlIgorICAgICAgc3JjRGlyPSIke3NyYy5kaXJ9IgorICAgICAgPgorICAgICAgPHJlc291cmNlIGZpbGU9IiR7c3JjLmRpcn0vcmVzLnJlc291cmNlcyIvPgorICAgIDwvY3NjPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFwcC1yZXMuY3JlYXRlZCIgZmlsZT0iJHt0ZXN0Q1NDUmVzLmV4ZX0iLz4KKyAgICA8ZmFpbCB1bmxlc3M9ImFwcC1yZXMuY3JlYXRlZCI+Tm8gYXBwICR7dGVzdENTQy5leGV9IGNyZWF0ZWQ8L2ZhaWw+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0ZXN0Q1NDUmVzLmV4ZX0iIGZhaWxvbmVycm9yPSJ0cnVlIiAvPgorICAgIDxkZWxldGUgZmlsZT0iJHt0ZXN0Q1NDUmVzLmV4ZX0iLz4KKyAgICA8Y3NjCisgICAgICBkZXN0RmlsZT0iJHt0ZXN0Q1NDUmVzLmV4ZX0iCisgICAgICB0YXJnZXRUeXBlPSJleGUiCisgICAgICBzcmNEaXI9IiR7c3JjLmRpcn0iCisgICAgICA+CisgICAgICA8cmVzb3VyY2UgbmFtZXNwYWNlPSJzb21lLm5hbWVzcGFjZSIgZW1iZWQ9InRydWUiPgorICAgICAgICA8ZmlsZXNldCBmaWxlPSIke3NyYy5kaXJ9L3Jlcy5yZXNvdXJjZXMiLz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9jc2M+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXBwLXJlcy0yLmNyZWF0ZWQiIGZpbGU9IiR7dGVzdENTQ1Jlcy5leGV9Ii8+CisgICAgPGZhaWwgdW5sZXNzPSJhcHAtcmVzLTIuY3JlYXRlZCI+Tm8gYXBwICR7dGVzdENTQy5leGV9IGNyZWF0ZWQ8L2ZhaWw+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0ZXN0Q1NDUmVzLmV4ZX0iIGZhaWxvbmVycm9yPSJ0cnVlIiAvPgorICAgIDxkZWxldGUgZmlsZT0iJHt0ZXN0Q1NDUmVzLmV4ZX0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q1NDUmVzb3VyY2VzLU1vbm8iIGRlcGVuZHM9InZhbGlkYXRlX2NzYyIgaWY9Im1jcy5mb3VuZCI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3RDU0NSZXMuZXhlIgorICAgICAgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9FeGFtcGxlQ3NjUmVzLmV4ZSIgLz4KKyAgICA8Y3NjCisgICAgICBkZXN0RmlsZT0iJHt0ZXN0Q1NDUmVzLmV4ZX0iCisgICAgICB0YXJnZXRUeXBlPSJleGUiCisgICAgICBpbmNsdWRlZGVmYXVsdHJlZmVyZW5jZXM9InRydWUiCisgICAgICBzcmNEaXI9IiR7c3JjLmRpcn0iCisgICAgICA+CisgICAgICA8cmVzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9yZXMucmVzb3VyY2VzIi8+CisgICAgPC9jc2M+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXBwLXJlcy5jcmVhdGVkIiBmaWxlPSIke3Rlc3RDU0NSZXMuZXhlfSIvPgorICAgIDxmYWlsIHVubGVzcz0iYXBwLXJlcy5jcmVhdGVkIj5ObyBhcHAgJHt0ZXN0Q1NDLmV4ZX0gY3JlYXRlZDwvZmFpbD4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke21vbm8uZXhlY3V0YWJsZX0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdENTQ1Jlcy5leGV9Ii8+CisgICAgPC9leGVjPgorICAgIDxkZWxldGUgZmlsZT0iJHt0ZXN0Q1NDUmVzLmV4ZX0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q1NDaW50cmluc2ljRmlsZXNldCIKKyAgICAgICAgICBkZXBlbmRzPSJ0ZXN0Q1NDaW50cmluc2ljRmlsZXNldC1NUyx0ZXN0Q1NDaW50cmluc2ljRmlsZXNldC1Nb25vIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q1NDaW50cmluc2ljRmlsZXNldC1NUyIgZGVwZW5kcz0idmFsaWRhdGVfY3NjIiBpZj0iY3NjLmZvdW5kIj4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdENTQy5leGUiCisgICAgICBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L0V4YW1wbGVDc2MuZXhlIi8+CisgICAgPGNzYworICAgICAgZGVzdEZpbGU9IiR7dGVzdENTQy5leGV9IgorICAgICAgdGFyZ2V0VHlwZT0iZXhlIgorICAgICAgc3JjRGlyPSIke3NyYy5kaXJ9IgorICAgICAgaW5jbHVkZXM9IioqLyouY3MiCisgICAgICA+CisgICAgPC9jc2M+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXBwLmNyZWF0ZWQiIGZpbGU9IiR7dGVzdENTQy5leGV9Ii8+CisgICAgPGZhaWwgdW5sZXNzPSJhcHAuY3JlYXRlZCI+Tm8gYXBwICR7dGVzdENTQy5leGV9IGNyZWF0ZWQ8L2ZhaWw+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0ZXN0Q1NDLmV4ZX0iIGZhaWxvbmVycm9yPSJ0cnVlIiAvPgorICAgIDxkZWxldGUgZmlsZT0iJHt0ZXN0Q1NDLmV4ZX0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q1NDaW50cmluc2ljRmlsZXNldC1Nb25vIiBkZXBlbmRzPSJ2YWxpZGF0ZV9jc2MiIGlmPSJtY3MuZm91bmQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Q1NDLmV4ZSIKKyAgICAgIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vRXhhbXBsZUNzYy5leGUiLz4KKyAgICA8Y3NjCisgICAgICBkZXN0RmlsZT0iJHt0ZXN0Q1NDLmV4ZX0iCisgICAgICB0YXJnZXRUeXBlPSJleGUiCisgICAgICBzcmNEaXI9IiR7c3JjLmRpcn0iCisgICAgICBpbmNsdWRlcz0iKiovKi5jcyIKKyAgICAgIGluY2x1ZGVkZWZhdWx0cmVmZXJlbmNlcz0idHJ1ZSIKKyAgICAgID4KKyAgICA8L2NzYz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJhcHAuY3JlYXRlZCIgZmlsZT0iJHt0ZXN0Q1NDLmV4ZX0iLz4KKyAgICA8ZmFpbCB1bmxlc3M9ImFwcC5jcmVhdGVkIj5ObyBhcHAgJHt0ZXN0Q1NDLmV4ZX0gY3JlYXRlZDwvZmFpbD4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke21vbm8uZXhlY3V0YWJsZX0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdENTQy5leGV9Ii8+CisgICAgPC9leGVjPgorICAgIDxkZWxldGUgZmlsZT0iJHt0ZXN0Q1NDLmV4ZX0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q1NDZGxsIiBkZXBlbmRzPSJ0ZXN0Q1NDZGxsLU1TLHRlc3RDU0NkbGwtTW9ubyIvPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENTQ2RsbC1NUyIgZGVwZW5kcz0idmFsaWRhdGVfY3NjIiBpZj0iY3NjLmZvdW5kIj4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdENTQy5kbGwiCisgICAgICBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L0V4YW1wbGUyLmRsbCIgLz4KKyAgICA8Y3NjCisgICAgICBkZXN0RmlsZT0iJHt0ZXN0Q1NDLmRsbH0iCisgICAgICB0YXJnZXRUeXBlPSJsaWJyYXJ5IgorICAgICAgZXhlY3V0YWJsZT0iY3NjIgorICAgICAgPgorICAgICAgPHNyYyBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSJleGFtcGxlMi5jcyIvPgorICAgIDwvY3NjPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImRsbC5jcmVhdGVkIiBmaWxlPSIke3Rlc3RDU0MuZGxsfSIvPgorICAgIDxmYWlsIHVubGVzcz0iZGxsLmNyZWF0ZWQiPk5vIGZpbGUgJHt0ZXN0Q1NDLmRsbH0gY3JlYXRlZDwvZmFpbD4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdENTQzIuZGxsIgorICAgICAgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9mb2xkZXIgIHdpdGggZGlyL0V4YW1wbGUzLmRsbCIgLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vZm9sZGVyICB3aXRoIGRpciIvPgorICAgIDxjc2MKKyAgICAgIGRlc3RGaWxlPSIke3Rlc3RDU0MyLmRsbH0iCisgICAgICB0YXJnZXRUeXBlPSJsaWJyYXJ5IgorICAgICAgZXhlY3V0YWJsZT0iY3NjIgorICAgICAgPgorICAgICAgPHNyYyBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSJleGFtcGxlMy5jcyIvPgorICAgIDwvY3NjPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImRsbDIuY3JlYXRlZCIgZmlsZT0iJHt0ZXN0Q1NDMi5kbGx9Ii8+CisgICAgPGZhaWwgdW5sZXNzPSJkbGwyLmNyZWF0ZWQiPk5vIGZpbGUgJHt0ZXN0Q1NDMi5kbGx9IGNyZWF0ZWQ8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENTQ2RsbC1Nb25vIiBkZXBlbmRzPSJ2YWxpZGF0ZV9jc2MiIGlmPSJtY3MuZm91bmQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Q1NDLmRsbCIKKyAgICAgIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vRXhhbXBsZTIuZGxsIiAvPgorICAgIDxjc2MKKyAgICAgIGRlc3RGaWxlPSIke3Rlc3RDU0MuZGxsfSIKKyAgICAgIHRhcmdldFR5cGU9ImxpYnJhcnkiCisgICAgICBpbmNsdWRlZGVmYXVsdHJlZmVyZW5jZXM9InRydWUiCisgICAgICA+CisgICAgICA8c3JjIGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9ImV4YW1wbGUyLmNzIi8+CisgICAgPC9jc2M+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iZGxsLmNyZWF0ZWQiIGZpbGU9IiR7dGVzdENTQy5kbGx9Ii8+CisgICAgPGZhaWwgdW5sZXNzPSJkbGwuY3JlYXRlZCI+Tm8gZmlsZSAke3Rlc3RDU0MuZGxsfSBjcmVhdGVkPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDc2NSZWZlcmVuY2VzIgorICAgIGRlcGVuZHM9InRlc3RDc2NSZWZlcmVuY2VzLU1TLHRlc3RDc2NSZWZlcmVuY2VzLU1vbm8iLz4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDc2NSZWZlcmVuY2VzLU1TIiBkZXBlbmRzPSJ2YWxpZGF0ZV9jc2MsdGVzdENTQ2RsbC1NUyIKKyAgICAgICAgICBpZj0iY3NjLmZvdW5kIj4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdENzY1JlZmVyZW5jZXMuZXhlIgorICAgICAgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9FeGFtcGxlQ3NjMi5leGUiIC8+CisgICAgPGNzYworICAgICAgZGVzdEZpbGU9IiR7dGVzdENzY1JlZmVyZW5jZXMuZXhlfSIKKyAgICAgIHRhcmdldFR5cGU9ImV4ZSIKKyAgICAgID4KKyAgICAgIDxzcmMgZmlsZT0iJHtzcmMuZGlyfS9leGFtcGxlLmNzIi8+CisgICAgICA8cmVmZXJlbmNlIGZpbGU9IiR7dGVzdENTQy5kbGx9IiAvPgorICAgICAgPHJlZmVyZW5jZSBmaWxlPSIke3Rlc3RDU0MyLmRsbH0iIC8+CisgICAgICA8ZGVmaW5lIG5hbWU9IlJFTEVBU0UiIC8+CisgICAgICA8ZGVmaW5lIG5hbWU9IkRFQlVHIiBpZj0idW5kZWZpbmVkLnByb3BlcnR5Ii8+CisgICAgICA8ZGVmaW5lIG5hbWU9ImRlZjMiIHVubGVzcz0idW5kZWZpbmVkLnByb3BlcnR5Ii8+CisgICAgPC9jc2M+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0icmVmYXBwLmNyZWF0ZWQiIGZpbGU9IiR7dGVzdENzY1JlZmVyZW5jZXMuZXhlfSIvPgorICAgIDxmYWlsIHVubGVzcz0icmVmYXBwLmNyZWF0ZWQiPk5vIGFwcCAke3Rlc3RDc2NSZWZlcmVuY2VzLmV4ZX0gY3JlYXRlZDwvZmFpbD4KKyAgICA8Y29weSBmaWxlPSIke3Rlc3RDU0MyLmRsbH0iIHRvZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3Rlc3RDc2NSZWZlcmVuY2VzLmV4ZX0iIGZhaWxvbmVycm9yPSJ0cnVlIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDc2NSZWZlcmVuY2VzLU1vbm8iIGRlcGVuZHM9InZhbGlkYXRlX2NzYyx0ZXN0Q1NDZGxsLU1vbm8iCisgICAgICAgICAgaWY9Im1jcy5mb3VuZCI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3RDc2NSZWZlcmVuY2VzLmV4ZSIKKyAgICAgIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vRXhhbXBsZUNzYzIuZXhlIiAvPgorICAgIDxjc2MKKyAgICAgIGRlc3RGaWxlPSIke3Rlc3RDc2NSZWZlcmVuY2VzLmV4ZX0iCisgICAgICB0YXJnZXRUeXBlPSJleGUiCisgICAgICBpbmNsdWRlZGVmYXVsdHJlZmVyZW5jZXM9InRydWUiCisgICAgICA+CisgICAgICA8c3JjIGZpbGU9IiR7c3JjLmRpcn0vZXhhbXBsZS5jcyIvPgorICAgICAgPHJlZmVyZW5jZSBmaWxlPSIke3Rlc3RDU0MuZGxsfSIgLz4KKyAgICAgIDxkZWZpbmUgbmFtZT0iUkVMRUFTRSIgLz4KKyAgICAgIDxkZWZpbmUgbmFtZT0iREVCVUciIGlmPSJ1bmRlZmluZWQucHJvcGVydHkiLz4KKyAgICAgIDxkZWZpbmUgbmFtZT0iZGVmMyIgdW5sZXNzPSJ1bmRlZmluZWQucHJvcGVydHkiLz4KKyAgICA8L2NzYz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJyZWZhcHAuY3JlYXRlZCIgZmlsZT0iJHt0ZXN0Q3NjUmVmZXJlbmNlcy5leGV9Ii8+CisgICAgPGZhaWwgdW5sZXNzPSJyZWZhcHAuY3JlYXRlZCI+Tm8gYXBwICR7dGVzdENzY1JlZmVyZW5jZXMuZXhlfSBjcmVhdGVkPC9mYWlsPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7bW9uby5leGVjdXRhYmxlfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0Q3NjUmVmZXJlbmNlcy5leGV9Ii8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJTEFTTSIKKyAgICBkZXBlbmRzPSJ0ZXN0SUxBU00tTW9ubyx0ZXN0SUxBU00tTVMiCisgICAgaWY9ImlsYXNtLmZvdW5kIi8+CisKKyAgPHRhcmdldCBuYW1lPSJpbGFzbSIgZGVwZW5kcz0idmFsaWRhdGVfaWxhc20iCisgICAgICBpZj0iaWxhc20uZm91bmQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0SUxBU00uZXhlIgorICAgICAgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9FeGFtcGxlSWxhc20uZXhlIiAvPgorICAgIDxpbGFzbQorICAgICAgZGVzdEZpbGU9IiR7dGVzdElMQVNNLmV4ZX0iCisgICAgICB0YXJnZXRUeXBlPSJleGUiCisgICAgICA+CisgICAgICA8c3JjIGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IiouaWwiLz4KKyAgICA8L2lsYXNtPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImlsYXNtLmNyZWF0ZWQiIGZpbGU9IiR7dGVzdElMQVNNLmV4ZX0iLz4KKyAgICA8ZmFpbCB1bmxlc3M9ImlsYXNtLmNyZWF0ZWQiPk5vIGFwcCAke3Rlc3RJTEFTTS5leGV9IGNyZWF0ZWQ8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0SUxBU00tTVMiIGRlcGVuZHM9ImlsYXNtIgorICAgICAgaWY9ImlsYXNtLmZvdW5kIiB1bmxlc3M9Im1vbm8uaWxhc20uZm91bmQiPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0ZXN0SUxBU00uZXhlfSIKKyAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdElMQVNNLU1vbm8iIGRlcGVuZHM9ImlsYXNtIgorICAgICAgaWY9Im1vbm8uaWxhc20uZm91bmQiPgorICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHttb25vLmV4ZWN1dGFibGV9IgorICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdElMQVNNLmV4ZX0iLz4KKyAgICAgIDwvZXhlYz4KKyAgICA8L3RhcmdldD4KKworICA8IS0tIG5vdCBpbmNsdWRpbmcgdGhpcyBpbiB0aGUgdGVzdCBhcyBpdCBjcmVhdGVzIGFuIGV4ZSBpbiB0aGUgc3JjIGRpciAtLT4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJbGFzbU5vRGVzdEZpbGUiICBkZXBlbmRzPSJ2YWxpZGF0ZV9pbGFzbSI+CisgICAgPGlsYXNtCisgICAgICB0YXJnZXRUeXBlPSJleGUiCisgICAgICA+CisgICAgICA8c3JjIGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IioqLyouaWwiLz4KKyAgICA8L2lsYXNtPgorICA8L3RhcmdldD4KKworICA8IS0tIGp1c3QgaGVyZSB0byBsb29rIGF0IGZpbGVzZXQgcmVmaWQgY29udmVyc2lvbiBieSBoYW5kIC0tPgorICA8dGFyZ2V0IG5hbWU9ImVjaG9GaWxlc2V0Ij4KKyAgICA8ZmlsZXNldCBpZD0iaWxhc20iIGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IioqLyouaWwiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImlsYXNtLnN0cmluZyIgcmVmaWQ9ImlsYXNtIi8+CisgICAgPGVjaG8+JHtpbGFzbS5zdHJpbmd9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJTERBU00iICAgZGVwZW5kcz0idGVzdElMQVNNIiBpZj0iaWxkYXNtLmZvdW5kIj4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdElMREFTTS5pbCIKKyAgICAgIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vRXhhbXBsZUlsZGFzbS5pbCIgLz4KKyAgICA8aWxkYXNtCisgICAgICBzcmNGaWxlPSIke3Rlc3RJTEFTTS5leGV9IgorICAgICAgZGVzdEZpbGU9IiR7dGVzdElMREFTTS5pbH0iCisgICAgICBtZXRhZGF0YT0idHJ1ZSIKKyAgICAgIGhlYWRlcj0idHJ1ZSIKKyAgICAgIGxpbmVudW1iZXJzPSJ0cnVlIgorICAgICAgZW5jb2Rpbmc9ImFzY2lpIgorICAgICAgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJpbGRhc20uY3JlYXRlZCIgZmlsZT0iJHt0ZXN0SUxEQVNNLmlsfSIvPgorICAgIDxmYWlsIHVubGVzcz0iaWxkYXNtLmNyZWF0ZWQiPk5vIGZpbGUgJHt0ZXN0SUxEQVNNLmlsfSBjcmVhdGVkPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8IS0tIHRoaXMgaXMgYW4gZXJyb3IgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdElMREFTTV9lbXB0eSIgICBkZXBlbmRzPSJ2YWxpZGF0ZV9pbGFzbSIgPgorICAgIDxpbGRhc20vPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImpzaGFycCIgZGVwZW5kcz0iaW5pdCIgaWY9ImpzaGFycC5mb3VuZCIgPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqc2hhcnAuZXhlIgorICAgICAgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9qc2hhcnAuZXhlIiAvPgorICAgIDxqc2hhcnBjCisgICAgICAgIGRlc3RGaWxlPSIke2pzaGFycC5leGV9IgorICAgICAgICB0YXJnZXRUeXBlPSJleGUiCisgICAgICAgID4KKyAgICAgIDxzcmMgZGlyPSIke3NyYy5kaXJ9IiBpbmNsdWRlcz0iKi5qYXZhIi8+CisgICAgPC9qc2hhcnBjPgorICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7anNoYXJwLmV4ZX0iIGZhaWxvbmVycm9yPSJ0cnVlIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDU0NyZXNwb25zZUZpbGUiIGRlcGVuZHM9InZhbGlkYXRlX2NzYyIgPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Q1NDcmVzcG9uc2VGaWxlLmV4ZSIKKyAgICAgIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdGVzdENTQ3Jlc3BvbnNlRmlsZS5leGUiIC8+CisgICAgPGNzYworICAgICAgZGVzdEZpbGU9IiR7dGVzdENTQ3Jlc3BvbnNlRmlsZS5leGV9IgorICAgICAgdGFyZ2V0VHlwZT0iZXhlIgorICAgICAgZXhlY3V0YWJsZT0iJHtjcy5jb21waWxlcn0iCisgICAgICB1c2VSZXNwb25zZUZpbGU9InRydWUiCisgICAgICBzcmNEaXI9IiR7c3JjLmRpcn0iCisgICAgICA+CisgICAgPC9jc2M+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYXBwLmNyZWF0ZWQiIGZpbGU9IiR7dGVzdENTQ3Jlc3BvbnNlRmlsZS5leGV9Ii8+CisgICAgPGZhaWwgdW5sZXNzPSJhcHAuY3JlYXRlZCI+Tm8gYXBwICR7dGVzdENTQ3Jlc3BvbnNlRmlsZS5leGV9IGNyZWF0ZWQ8L2ZhaWw+CisgICAgPGRlbGV0ZSBmaWxlPSIke3Rlc3RDU0NyZXNwb25zZUZpbGUuZXhlfSIvPgorICA8L3RhcmdldD4KKworCis8L3Byb2plY3Q+CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9IZWxsb1dvcmxkLndzZGwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvSGVsbG9Xb3JsZC53c2RsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNTZhNjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvSGVsbG9Xb3JsZC53c2RsCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZGVmaW5pdGlvbnMgbmFtZT0iSGVsbG9Xb3JsZCIKK3RhcmdldE5hbWVzcGFjZT0iaHR0cDovL2hlbGxvLmpheHJwYy5zYW1wbGVzLyIKK3htbG5zOnRucz0iaHR0cDovL2hlbGxvLmpheHJwYy5zYW1wbGVzLyIKK3htbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKK3htbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCit4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KKyAgPHR5cGVzIC8+CisKKyAgPG1lc3NhZ2UgbmFtZT0ic2F5SGVsbG8iPgorICAgIDxwYXJ0IG5hbWU9IlN0cmluZ18xIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICA8L21lc3NhZ2U+CisKKyAgPG1lc3NhZ2UgbmFtZT0ic2F5SGVsbG9SZXNwb25zZSI+CisgICAgPHBhcnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgorICA8L21lc3NhZ2U+CisKKyAgPHBvcnRUeXBlIG5hbWU9IkhlbGxvIj4KKyAgICA8b3BlcmF0aW9uIG5hbWU9InNheUhlbGxvIiBwYXJhbWV0ZXJPcmRlcj0iU3RyaW5nXzEiPgorICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpzYXlIZWxsbyIgLz4KKworICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6c2F5SGVsbG9SZXNwb25zZSIgLz4KKyAgICA8L29wZXJhdGlvbj4KKyAgPC9wb3J0VHlwZT4KKworICA8YmluZGluZyBuYW1lPSJIZWxsb0JpbmRpbmciIHR5cGU9InRuczpIZWxsbyI+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzYXlIZWxsbyI+CisgICAgICA8aW5wdXQ+CisgICAgICAgIDxzb2FwOmJvZHkKKyAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCisgICAgICAgIHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vaGVsbG8uamF4cnBjLnNhbXBsZXMvIiAvPgorICAgICAgPC9pbnB1dD4KKworICAgICAgPG91dHB1dD4KKyAgICAgICAgPHNvYXA6Ym9keQorICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKKyAgICAgICAgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9oZWxsby5qYXhycGMuc2FtcGxlcy8iIC8+CisgICAgICA8L291dHB1dD4KKworICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiCisgICAgc3R5bGU9InJwYyIgLz4KKyAgPC9iaW5kaW5nPgorCisgIDxzZXJ2aWNlIG5hbWU9IkhlbGxvV29ybGQiPgorICAgIDxwb3J0IG5hbWU9IkhlbGxvUG9ydCIgYmluZGluZz0idG5zOkhlbGxvQmluZGluZyI+CisgICAgICA8c29hcDphZGRyZXNzCisgICAgICBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMvSGVsbG8iIC8+CisgICAgPC9wb3J0PgorICA8L3NlcnZpY2U+Cis8L2RlZmluaXRpb25zPgorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvZXhhbXBsZS5jcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9leGFtcGxlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2I4NzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvZXhhbXBsZS5jcwpAQCAtMCwwICsxLDI3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3VzaW5nIFN5c3RlbTsKKworcHVibGljIGNsYXNzIEV4YW1wbGUgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICAgICAgRXhhbXBsZTIuZWNobygpOworICAgICAgICAgICAgRXhhbXBsZTMuZWNobygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9leGFtcGxlLmlsIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L2V4YW1wbGUuaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhNmQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9leGFtcGxlLmlsCkBAIC0wLDAgKzEsOTIgQEAKKy8vY3JlYXRlZCBmcm9tIGlsZGFzbSBvZiBleGFtcGxlLmNzCisvLyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorLy8gICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKy8vICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorLy8gICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorLy8gICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorLy8gICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisKKy5hc3NlbWJseSBleHRlcm4gLyoyMzAwMDAwMSovIG1zY29ybGliCit7CisgIC5wdWJsaWNrZXl0b2tlbiA9IChCNyA3QSA1QyA1NiAxOSAzNCBFMCA4OSApICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC56XFYuNC4uCisgIC52ZXIgMTowOjMzMDA6MAorfQorLmFzc2VtYmx5IC8qMjAwMDAwMDEqLyBleGFtcGxlCit7CisgIC8vIC0tLSBUaGUgZm9sbG93aW5nIGN1c3RvbSBhdHRyaWJ1dGUgaXMgYWRkZWQgYXV0b21hdGljYWxseSwgZG8gbm90IHVuY29tbWVudCAtLS0tLS0tCisgIC8vICAuY3VzdG9tIC8qMEMwMDAwMDE6MEEwMDAwMDEqLyBpbnN0YW5jZSB2b2lkIFttc2NvcmxpYi8qIDIzMDAwMDAxICovXVN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dhYmxlQXR0cmlidXRlLyogMDEwMDAwMDIgKi86Oi5jdG9yKGJvb2wsCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wpIC8qIDBBMDAwMDAxICovID0gKCAwMSAwMCAwMCAwMSAwMCAwMCApIAorICAuaGFzaCBhbGdvcml0aG0gMHgwMDAwODAwNAorICAudmVyIDA6MDowOjAKK30KKy5tb2R1bGUgZXhhbXBsZS5leGUKKy8vIE1WSUQ6IHs2NDFFNDcwOS1GN0I2LTRCQjAtQkM1RC00OUMyQ0YxRjFDRjh9CisuaW1hZ2ViYXNlIDB4MDA0MDAwMDAKKy5zdWJzeXN0ZW0gMHgwMDAwMDAwMworLmZpbGUgYWxpZ25tZW50IDUxMgorLmNvcmZsYWdzIDB4MDAwMDAwMDEKKy8vIEltYWdlIGJhc2U6IDB4MDMxODAwMDAKKy8vCisvLyA9PT09PT09PT09PT09PSBDTEFTUyBTVFJVQ1RVUkUgREVDTEFSQVRJT04gPT09PT09PT09PT09PT09PT09CisvLworLmNsYXNzIC8qMDIwMDAwMDIqLyBwdWJsaWMgYXV0byBhbnNpIGJlZm9yZWZpZWxkaW5pdCBFeGFtcGxlCisgICAgICAgZXh0ZW5kcyBbbXNjb3JsaWIvKiAyMzAwMDAwMSAqL11TeXN0ZW0uT2JqZWN0LyogMDEwMDAwMDEgKi8KK3sKK30gLy8gZW5kIG9mIGNsYXNzIEV4YW1wbGUKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09IEdMT0JBTCBGSUVMRFMgQU5EIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT0gQ0xBU1MgTUVNQkVSUyBERUNMQVJBVElPTiA9PT09PT09PT09PT09PT09PT09CisvLyAgIG5vdGUgdGhhdCBjbGFzcyBmbGFncywgJ2V4dGVuZHMnIGFuZCAnaW1wbGVtZW50cycgY2xhdXNlcworLy8gICAgICAgICAgYXJlIHByb3ZpZGVkIGhlcmUgZm9yIGluZm9ybWF0aW9uIG9ubHkKKworLmNsYXNzIC8qMDIwMDAwMDIqLyBwdWJsaWMgYXV0byBhbnNpIGJlZm9yZWZpZWxkaW5pdCBFeGFtcGxlCisgICAgICAgZXh0ZW5kcyBbbXNjb3JsaWIvKiAyMzAwMDAwMSAqL11TeXN0ZW0uT2JqZWN0LyogMDEwMDAwMDEgKi8KK3sKKyAgLm1ldGhvZCAvKjA2MDAwMDAxKi8gcHVibGljIGhpZGVieXNpZyBzdGF0aWMgCisgICAgICAgICAgdm9pZCAgTWFpbihzdHJpbmdbXSBhcmdzKSBjaWwgbWFuYWdlZAorICAvLyBTSUc6IDAwIDAxIDAxIDFEIDBFCisgIHsKKyAgICAuZW50cnlwb2ludAorICAgIC8vIE1ldGhvZCBiZWdpbnMgYXQgUlZBIDB4MjA1MAorICAgIC8vIENvZGUgc2l6ZSAgICAgICAxMSAoMHhiKQorICAgIC5tYXhzdGFjayAgMQorICAgIElMXzAwMDA6ICAvKiA3MiAgIHwgKDcwKTAwMDAwMSAgICAgICAqLyBsZHN0ciAgICAgICJoZWxsbywgSSBsb29rIGxpa2UgSmF2YSwgYnV0IEknbSByZWFsbHkgLk5FVCIgLyogNzAwMDAwMDEgKi8KKyAgICBJTF8wMDA1OiAgLyogMjggICB8ICgwQSkwMDAwMDIgICAgICAgKi8gY2FsbCAgICAgICB2b2lkIFttc2NvcmxpYi8qIDIzMDAwMDAxICovXVN5c3RlbS5Db25zb2xlLyogMDEwMDAwMDMgKi86OldyaXRlTGluZShzdHJpbmcpIC8qIDBBMDAwMDAyICovCisgICAgSUxfMDAwYTogIC8qIDJBICAgfCAgICAgICAgICAgICAgICAgICovIHJldAorICB9IC8vIGVuZCBvZiBtZXRob2QgRXhhbXBsZTo6TWFpbgorCisgIC5tZXRob2QgLyowNjAwMDAwMiovIHB1YmxpYyBoaWRlYnlzaWcgc3BlY2lhbG5hbWUgcnRzcGVjaWFsbmFtZSAKKyAgICAgICAgICBpbnN0YW5jZSB2b2lkICAuY3RvcigpIGNpbCBtYW5hZ2VkCisgIC8vIFNJRzogMjAgMDAgMDEKKyAgeworICAgIC8vIE1ldGhvZCBiZWdpbnMgYXQgUlZBIDB4MjA2OAorICAgIC8vIENvZGUgc2l6ZSAgICAgICA3ICgweDcpCisgICAgLm1heHN0YWNrICAxCisgICAgSUxfMDAwMDogIC8qIDAyICAgfCAgICAgICAgICAgICAgICAgICovIGxkYXJnLjAKKyAgICBJTF8wMDAxOiAgLyogMjggICB8ICgwQSkwMDAwMDMgICAgICAgKi8gY2FsbCAgICAgICBpbnN0YW5jZSB2b2lkIFttc2NvcmxpYi8qIDIzMDAwMDAxICovXVN5c3RlbS5PYmplY3QvKiAwMTAwMDAwMSAqLzo6LmN0b3IoKSAvKiAwQTAwMDAwMyAqLworICAgIElMXzAwMDY6ICAvKiAyQSAgIHwgICAgICAgICAgICAgICAgICAqLyByZXQKKyAgfSAvLyBlbmQgb2YgbWV0aG9kIEV4YW1wbGU6Oi5jdG9yCisKK30gLy8gZW5kIG9mIGNsYXNzIEV4YW1wbGUKKworCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9leGFtcGxlMi5jcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9leGFtcGxlMi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ1OTcxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L2V4YW1wbGUyLmNzCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKyAKK3VzaW5nIFN5c3RlbTsKKworLyoqCisgKiB0aGlzIGlzIGp1c3QgaGVyZSB0byBjcmVhdGUgY29uZnVzaW9uCisgKi8KK3B1YmxpYyBjbGFzcyBFeGFtcGxlMiB7CisKKyAgICBwdWJsaWMgaW50IHNvbWVfdmFyaWFibGU9MzsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZWNobygpIHsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImhlbGxvLCBJIGxvb2sgbGlrZSBKYXZhLCBidXQgSSdtIHJlYWxseSAuTkVUIik7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L2V4YW1wbGUyLmlsIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L2V4YW1wbGUyLmlsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWMwMmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvZXhhbXBsZTIuaWwKQEAgLTAsMCArMSw0NSBAQAorLy8gICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKy8vICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisvLyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKy8vICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKy8vICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKy8vICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy5jbGFzcyBwdWJsaWMgYXV0byBhbnNpIGJlZm9yZWZpZWxkaW5pdCBFeGFtcGxlMgorICAgICAgIGV4dGVuZHMgW21zY29ybGliXVN5c3RlbS5PYmplY3QKK3sKK30gLy8gZW5kIG9mIGNsYXNzIEV4YW1wbGUyCisKKy8vID09PT09PT09PT09PT09PSBDTEFTUyBNRU1CRVJTIERFQ0xBUkFUSU9OID09PT09PT09PT09PT09PT09PT0KKy8vICAgbm90ZSB0aGF0IGNsYXNzIGZsYWdzLCAnZXh0ZW5kcycgYW5kICdpbXBsZW1lbnRzJyBjbGF1c2VzCisvLyAgICAgICAgICBhcmUgcHJvdmlkZWQgaGVyZSBmb3IgaW5mb3JtYXRpb24gb25seQorCisuY2xhc3MgcHVibGljIGF1dG8gYW5zaSBiZWZvcmVmaWVsZGluaXQgRXhhbXBsZTIKKyAgICAgICBleHRlbmRzIFttc2NvcmxpYl1TeXN0ZW0uT2JqZWN0Cit7CisgIC5maWVsZCBwdWJsaWMgaW50MzIgc29tZV92YXJpYWJsZQorICAubWV0aG9kIHB1YmxpYyBoaWRlYnlzaWcgc3BlY2lhbG5hbWUgcnRzcGVjaWFsbmFtZSAKKyAgICAgICAgICBpbnN0YW5jZSB2b2lkICAuY3RvcigpIGNpbCBtYW5hZ2VkCisgIHsKKyAgICAvLyBDb2RlIHNpemUgICAgICAgMTQgKDB4ZSkKKyAgICAubWF4c3RhY2sgIDIKKyAgICBJTF8wMDAwOiAgbGRhcmcuMAorICAgIElMXzAwMDE6ICBsZGMuaTQuMworICAgIElMXzAwMDI6ICBzdGZsZCAgICAgIGludDMyIEV4YW1wbGUyOjpzb21lX3ZhcmlhYmxlCisgICAgSUxfMDAwNzogIGxkYXJnLjAKKyAgICBJTF8wMDA4OiAgY2FsbCAgICAgICBpbnN0YW5jZSB2b2lkIFttc2NvcmxpYl1TeXN0ZW0uT2JqZWN0OjouY3RvcigpCisgICAgSUxfMDAwZDogIHJldAorICB9IC8vIGVuZCBvZiBtZXRob2QgRXhhbXBsZTI6Oi5jdG9yCisKK30gLy8gZW5kIG9mIGNsYXNzIEV4YW1wbGUyCisKKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvZXhhbXBsZTMuY3MgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvZXhhbXBsZTMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmNjk4MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9leGFtcGxlMy5jcwpAQCAtMCwwICsxLDMwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3VzaW5nIFN5c3RlbTsKKworLyoqCisgKiB0aGlzIGlzIGp1c3QgaGVyZSB0byBjcmVhdGUgY29uZnVzaW9uCisgKi8KK3B1YmxpYyBjbGFzcyBFeGFtcGxlMyB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZWNobygpIHsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImhlbGxvLCBJIGxvb2sgbGlrZSBKYXZhLCBidXQgSSdtIHJlYWxseSAuTkVUIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvanNoYXJwLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvanNoYXJwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzNzAzNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9qc2hhcnAuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKiAKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogCisgKi8KKyAKKworLyoqCisgKiB0aGlzIGlzIGEgaiMgY2xhc3MsIG5vdCBhIGphdmEgb25lLgorICovCitwdWJsaWMgY2xhc3MganNoYXJwIHsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiaGVsbG8sIEkgbG9vayBsaWtlIEphdmEsIGJ1dCBJJ20gcmVhbGx5IEojIik7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L3Jlcy5yZXNvdXJjZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvcmVzLnJlc291cmNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGUyNjVkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L3Jlcy5yZXNvdXJjZXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZWNob3Byb3BlcnRpZXMucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2VjaG9wcm9wZXJ0aWVzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5NzBlNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2VjaG9wcm9wZXJ0aWVzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgordGVzdC5pbmZpbGU9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2VjaG9wcm9wZXJ0aWVzLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2VjaG9wcm9wZXJ0aWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjFiOGJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZWNob3Byb3BlcnRpZXMueG1sCkBAIC0wLDAgKzEsMTMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9ImRlZiIgYmFzZWRpcj0iLiI+CisKKyAgPHRhcmdldCBuYW1lPSJkZWYiPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNldHVwIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iYS5zZXQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJiLnNldCIgdmFsdWU9ImZhbHNlIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvVG9Mb2ciIGRlcGVuZHM9InNldHVwIj4KKyAgICA8ZWNob3Byb3BlcnRpZXMgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RWNob1dpdGhFbXB0eVByZWZpeFRvTG9nIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGVjaG9wcm9wZXJ0aWVzIHByZWZpeD0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEVjaG9Ub0xvZ1htbCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBmb3JtYXQ9InhtbCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVhZEFuZEVjaG9Ub0xvZyIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBzcmNmaWxlPSJlY2hvcHJvcGVydGllcy5wcm9wZXJ0aWVzIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZWFkQmFkRmlsZSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBzcmNmaWxlPSIuIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZWFkQmFkRmlsZUZhaWwiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8ZWNob3Byb3BlcnRpZXMgc3JjZmlsZT0iLiIgZmFpbG9uZXJyb3I9InllcyIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVhZEJhZEZpbGVOb0ZhaWwiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8ZWNob3Byb3BlcnRpZXMgc3JjZmlsZT0iLiIgZmFpbG9uZXJyb3I9Im5vIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvVG9CYWRGaWxlIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGVjaG9wcm9wZXJ0aWVzIGRlc3RmaWxlPSIuIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvVG9CYWRGaWxlRmFpbCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0iLiIgZmFpbG9uZXJyb3I9InllcyIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RWNob1RvQmFkRmlsZU5vRmFpbCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0iLiIgZmFpbG9uZXJyb3I9Im5vIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvVG9Hb29kRmlsZSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0idGVzdC5wcm9wZXJ0aWVzIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvVG9Hb29kRmlsZVhtbCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0idGVzdC54bWwiIGZvcm1hdD0ieG1sIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvVG9Hb29kRmlsZUZhaWwiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8ZWNob3Byb3BlcnRpZXMgZGVzdGZpbGU9InRlc3QucHJvcGVydGllcyIgZmFpbG9uZXJyb3I9InllcyIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RWNob1RvR29vZEZpbGVOb0ZhaWwiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8ZWNob3Byb3BlcnRpZXMgZGVzdGZpbGU9InRlc3QucHJvcGVydGllcyIgZmFpbG9uZXJyb3I9Im5vIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvUHJlZml4IiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGVjaG9wcm9wZXJ0aWVzIGRlc3RmaWxlPSJ0ZXN0LXByZWZpeC5wcm9wZXJ0aWVzIiBwcmVmaXg9ImEuIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvUHJlZml4QXNQcm9wZXJ0eXNldCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0idGVzdC1wcmVmaXgucHJvcGVydGllcyI+CisgICAgICA8cHJvcGVydHlzZXQ+CisgICAgICAgIDxwcm9wZXJ0eXJlZiBwcmVmaXg9ImEuIi8+CisgICAgICA8L3Byb3BlcnR5c2V0PgorICAgIDwvZWNob3Byb3BlcnRpZXM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEVjaG9QcmVmaXhBc05lZ2F0ZWRQcm9wZXJ0eXNldCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0idGVzdC1wcmVmaXgucHJvcGVydGllcyI+CisgICAgICA8cHJvcGVydHlzZXQgbmVnYXRlPSJ0cnVlIj4KKyAgICAgICAgPHByb3BlcnR5cmVmIHByZWZpeD0iYi4iLz4KKyAgICAgIDwvcHJvcGVydHlzZXQ+CisgICAgPC9lY2hvcHJvcGVydGllcz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RWNob1ByZWZpeEFzRG91Ymx5TmVnYXRlZFByb3BlcnR5c2V0IiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGVjaG9wcm9wZXJ0aWVzIGRlc3RmaWxlPSJ0ZXN0LXByZWZpeC5wcm9wZXJ0aWVzIj4KKyAgICAgIDxwcm9wZXJ0eXNldCBuZWdhdGU9InRydWUiPgorICAgICAgICA8cHJvcGVydHlzZXQgbmVnYXRlPSJ0cnVlIj4KKyAgICAgICAgICA8cHJvcGVydHlyZWYgcHJlZml4PSJhLiIvPgorICAgICAgICA8L3Byb3BlcnR5c2V0PgorICAgICAgPC9wcm9wZXJ0eXNldD4KKyAgICA8L2VjaG9wcm9wZXJ0aWVzPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RXaXRoUHJlZml4QW5kUmVnZXgiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8ZWNob3Byb3BlcnRpZXMgcHJlZml4PSJhbnQuIiByZWdleD0iLiphbnQuKiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RXaXRoRW1wdHlQcmVmaXhBbmRSZWdleCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxlY2hvcHJvcGVydGllcyBwcmVmaXg9IiIgcmVnZXg9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RXaXRoUmVnZXgiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8ZWNob3Byb3BlcnRpZXMgcmVnZXg9Ii4qYW50LioiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVsZXRlIGZpbGU9InRlc3QucHJvcGVydGllcyIgZmFpbG9uZXJyb3I9Im5vIiAvPgorICAgIDxkZWxldGUgZmlsZT0idGVzdC1wcmVmaXgucHJvcGVydGllcyIgZmFpbG9uZXJyb3I9Im5vIiAvPgorICAgIDxkZWxldGUgZmlsZT0idGVzdC54bWwiIGZhaWxvbmVycm9yPSJubyIgLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi90cmFuc2xhdGUvZXhwZWN0ZWQvZGUvdGVtcGxhdGUudHh0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi90cmFuc2xhdGUvZXhwZWN0ZWQvZGUvdGVtcGxhdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhN2FmNGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pMThuL3RyYW5zbGF0ZS9leHBlY3RlZC9kZS90ZW1wbGF0ZS50eHQKQEAgLTAsMCArMSBAQAorRGllc2UgaXN0IGVpbmUgRGVtbyBEYXRlaSBm/HIgZGllIHRyYW5zbGF0ZV9BdWZnYWJlIEBtaXNzaW5nX3Rva2VuQC4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vdHJhbnNsYXRlL2lucHV0L3Jlc291cmNlc19nZXJfREUucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vdHJhbnNsYXRlL2lucHV0L3Jlc291cmNlc19nZXJfREUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWZlOWIwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi90cmFuc2xhdGUvaW5wdXQvcmVzb3VyY2VzX2dlcl9ERS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK1RoaXM9RGllc2UKK2lzPWlzdAorYT1laW5lCitkZW1vPURlbW8KK2ZpbGU9RGF0ZWkKKyNub3RlIGZvciBwZW9wbGUgdW5kZXJzdGFuZGluZyBnZXJtYW4KKyMgXHUwMGZjID0gdSB1bWxhdXQKK2Zvcj1m/HIKK3RoZT1kaWUKK190YXNrPV9BdWZnYWJlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pMThuL3RyYW5zbGF0ZS9pbnB1dC90ZW1wbGF0ZS50eHQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pMThuL3RyYW5zbGF0ZS9pbnB1dC90ZW1wbGF0ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhNDEzYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vdHJhbnNsYXRlL2lucHV0L3RlbXBsYXRlLnR4dApAQCAtMCwwICsxIEBACitAVGhpc0AgQGlzQCBAYUAgQGRlbW9AIEBmaWxlQCBAZm9yQCBAdGhlQCB0cmFuc2xhdGVAX3Rhc2tAIEBtaXNzaW5nX3Rva2VuQC4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vdHJhbnNsYXRlL3RyYW5zbGF0ZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pMThuL3RyYW5zbGF0ZS90cmFuc2xhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MmU1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pMThuL3RyYW5zbGF0ZS90cmFuc2xhdGUueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0idHJhbnNsYXRlLXRlc3QiIGRlZmF1bHQ9InRlc3QxIiBiYXNlZGlyPSIuIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5wdXQuZGlyIiB2YWx1ZT0iaW5wdXQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LmRpciIgdmFsdWU9Im91dHB1dCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJleHBlY3RlZC5kaXIiIHZhbHVlPSJleHBlY3RlZCIvPgorICAgIDx0YXJnZXQgbmFtZT0ic2V0dXAiPgorICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dC5kaXJ9L2RlIi8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0MSIgZGVwZW5kcz0ic2V0dXAiPgorICAgICAgPHRyYW5zbGF0ZSB0b0Rpcj0iJHtvdXRwdXQuZGlyfS9kZSIKKyAgICAgICAgc3RhcnR0b2tlbj0iQCIKKyAgICAgICAgZW5kdG9rZW49IkAiCisgICAgICAgIGJ1bmRsZT0iJHtpbnB1dC5kaXJ9L3Jlc291cmNlcyIKKyAgICAgICAgYnVuZGxlY291bnRyeT0iREUiCisgICAgICAgIGJ1bmRsZWxhbmd1YWdlPSJnZXIiCisgICAgICAgIGZvcmNlb3ZlcndyaXRlPSJ5ZXMiCisgICAgICAgIHNyY2VuY29kaW5nPSJJU084ODU5XzEiCisgICAgICAgIGRlc3RlbmNvZGluZz0iSVNPODg1OV8xIgorICAgICAgICBidW5kbGVlbmNvZGluZz0iQ3AxMjUyIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2lucHV0LmRpcn0iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVtcGxhdGUudHh0Ii8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgIDwvdHJhbnNsYXRlPgorICAgICA8L3RhcmdldD4KKyAgICAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICAgICAgIDxkZWxldGUgZGlyPSIke291dHB1dC5kaXJ9IiBxdWlldD0idHJ1ZSIvPgorICAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvaW1hZ2UueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvaW1hZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGIzOTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS9pbWFnZS54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImltYWdlLXRlc3QiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgorCisgICA8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InRlc3RTaW1wbGVTY2FsZSI+CisgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS9zcmMiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS9kZXN0Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7ZGVzdC5kaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisgICAgCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7ZGVzdC5kaXJ9Ii8+ICAgCisgICAgPC90YXJnZXQ+CisgICAKKyAgIAk8IS0tIHRoaXMgc2hvdWxkIHByb2R1Y2UgYSBzaW5nbGUgZmlsZSBpbiB0aGUgZGVzdCBkaXIgLS0+CisJIAk8dGFyZ2V0IG5hbWU9InRlc3RTaW1wbGVTY2FsZSIgZGVwZW5kcz0iaW5pdCI+CisJCQk8aW1hZ2UgaW5jbHVkZXM9IiouanBnIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7ZGVzdC5kaXJ9IiBvdmVyd3JpdGU9Im5vIiBmYWlsb25lcnJvcj0ibm8iPgorCQkJCTxzY2FsZSB3aWR0aD0iMzAwIiBwcm9wb3J0aW9ucz0id2lkdGgiLz4KKwkJCTwvaW1hZ2U+ICAgCisJCTwvdGFyZ2V0PiAgIAorCisgICAJPCEtLSB0aGlzIHNob3VsZCBwdXQgc29tZSB0ZXh0IGluIHRoZSBsb2cgLS0+CisJIAk8dGFyZ2V0IG5hbWU9InRlc3RFY2hvVG9Mb2ciIGRlcGVuZHM9ImluaXQiPgorCQkJPGltYWdlIGluY2x1ZGVzPSIqLmpwZyIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2Rlc3QuZGlyfSIgb3ZlcndyaXRlPSJubyIgZmFpbG9uZXJyb3I9Im5vIj4KKwkJCQk8c2NhbGUgd2lkdGg9IjMwMCIgcHJvcG9ydGlvbnM9IndpZHRoIi8+CisJCQk8L2ltYWdlPiAgIAorCQk8L3RhcmdldD4gICAKKwkJCisgICAJPCEtLSB0aGlzIHNob3VsZCBwcm9kdWNlIGEgc2luZ2xlIGZpbGUgaW4gdGhlIGRlc3QgZGlyIC0tPgorCSAJPHRhcmdldCBuYW1lPSJ0ZXN0RmFpbE9uRXJyb3IiIGRlcGVuZHM9ImluaXQiPgorCQkJPGltYWdlIGluY2x1ZGVzPSIqLmpwZyIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2Rlc3QuZGlyfSIgb3ZlcndyaXRlPSJubyIgZmFpbG9uZXJyb3I9InllcyI+CisJCQkJPHNjYWxlIHdpZHRoPSIzMDAiIHByb3BvcnRpb25zPSJ3aWR0aCIvPgorCQkJPC9pbWFnZT4gICAKKwkJPC90YXJnZXQ+ICAgCQkKKwkJCisJCTwhLS0gdGhpcyBzaG91bGQgcHJvZHVjZSBhIHNpbmdsZSBmaWxlIGluIHRoZSBkZXN0IGRpciwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGZpbGUgLS0+CisJCTx0YXJnZXQgbmFtZT0idGVzdE92ZXJ3cml0ZVRydWUiIGRlcGVuZHM9ImluaXQiPgorCQkJPGltYWdlIGluY2x1ZGVzPSIqLmpwZyIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2Rlc3QuZGlyfSIgb3ZlcndyaXRlPSJ0cnVlIiBmYWlsb25lcnJvcj0ibm8iPgorCQkJCTxzY2FsZSB3aWR0aD0iMzAwIiBwcm9wb3J0aW9ucz0id2lkdGgiLz4KKwkJCTwvaW1hZ2U+ICAgCisJCTwvdGFyZ2V0PiAgIAorCisJCTwhLS0gdGhpcyBzaG91bGQgbm90IG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZmlsZSAtLT4KKwkJPHRhcmdldCBuYW1lPSJ0ZXN0T3ZlcndyaXRlRmFsc2UiIGRlcGVuZHM9ImluaXQiPgorCQkJPGltYWdlIGluY2x1ZGVzPSIqLmpwZyIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2Rlc3QuZGlyfSIgb3ZlcndyaXRlPSJmYWxzZSIgZmFpbG9uZXJyb3I9Im5vIj4KKwkJCQk8c2NhbGUgd2lkdGg9IjMwMCIgcHJvcG9ydGlvbnM9IndpZHRoIi8+CisJCQk8L2ltYWdlPiAgIAorCQk8L3RhcmdldD4gICAKKyAgIAorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2Uvc3JjL2JhZGltYWdlLmpwZyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL3NyYy9iYWRpbWFnZS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhNzg2ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL3NyYy9iYWRpbWFnZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2Uvc3JjL2xhcmdlaW1hZ2UuanBnIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2Uvc3JjL2xhcmdlaW1hZ2UuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMDQwNTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS9zcmMvbGFyZ2VpbWFnZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvYnVpbGQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTRiMzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9idWlsZC54bWwKQEAgLTAsMCArMSw1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0ibm8iPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJvdXQiIGxvY2F0aW9uPSJvdXRwdXQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImluIiBsb2NhdGlvbj0iaW5wdXQiLz4KKworICA8dGFyZ2V0IG5hbWU9Im5vIj4KKyAgICA8ZmFpbD5Gb3IgdGVzdHMgb25seTwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzZXRVcCI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXR9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVhckRvd24iPgorICAgIDxkZWxldGUgZGlyPSIke291dH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtpbn0iIGRlc3RkaXI9IiR7b3V0fSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNpbXBsZS1jb21waWxlIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICA8amF2YWggZGVzdGRpcj0iJHtvdXR9Ij4KKyAgICAgIDxjbGFzcyBuYW1lPSJvcmcuZXhhbXBsZS5Gb28iLz4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtvdXR9Ii8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L2phdmFoPgorICA8L3RhcmdldD4KKwkKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWZpbGVzZXQiIGRlcGVuZHM9ImNvbXBpbGUiPgorICAJPGphdmFoIGRlc3RkaXI9IiR7b3V0fSI+CisgIAkgIDxmaWxlc2V0IGRpcj0iJHtvdXR9Ij4KKyAgCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmNsYXNzIi8+CisgIAkgIDwvZmlsZXNldD4KKyAgCSAgPGNsYXNzcGF0aD4KKyAgCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7b3V0fSIvPgorICAJICA8L2NsYXNzcGF0aD4KKyAgCTwvamF2YWg+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvaW5wdXQvb3JnL2V4YW1wbGUvRm9vLmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9pbnB1dC9vcmcvZXhhbXBsZS9Gb28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQwM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvaW5wdXQvb3JnL2V4YW1wbGUvRm9vLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuZXhhbXBsZTsKKworcHVibGljIGNsYXNzIEZvbyB7CisKKyAgICBwdWJsaWMgRm9vKCkge30KKworICAgIHB1YmxpYyBuYXRpdmUgU3RyaW5nIGJhcihPYmplY3QgYmF6KTsKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC9qZGVwZW5kLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvamRlcGVuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxODIyNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvamRlcGVuZC54bWwKQEAgLTAsMCArMSw3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3RjbGFzc2VzIiBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIi8+CisgIAorICA8cGF0aCBpZD0iYWxsLXRlc3QtY2xhc3Nlcy5pZCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KKyAgPC9wYXRoPgorCisgIDxwYXRoIGlkPSJleGFtcGxlLWNsYXNzZXMuaWQiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Y2xhc3Nlc30vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUiIC8+CisgIDwvcGF0aD4KKworICA8cGF0aCBpZD0idGVzdC1jbGFzc2VzLmlkIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdGNsYXNzZXN9IiAvPgorICA8L3BhdGg+CisKKyAgPHRhcmdldCBuYW1lPSJzaW1wbGUiPgorICAgIDxqZGVwZW5kPgorICAgICAgPGNsYXNzZXNwYXRoIHJlZmlkPSJleGFtcGxlLWNsYXNzZXMuaWQiLz4KKyAgICA8L2pkZXBlbmQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ieG1sIj4KKyAgICA8amRlcGVuZCBmb3JtYXQ9InhtbCI+CisgICAgICA8Y2xhc3Nlc3BhdGggcmVmaWQ9ImV4YW1wbGUtY2xhc3Nlcy5pZCIvPgorICAgIDwvamRlcGVuZD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmb3JrIj4KKyAgICA8amRlcGVuZCBmb3JrPSJ5ZXMiIGluY2x1ZGVydW50aW1lPSJ5ZXMiPgorICAgICAgPGNsYXNzZXNwYXRoIHJlZmlkPSJleGFtcGxlLWNsYXNzZXMuaWQiLz4KKyAgICA8L2pkZXBlbmQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZm9yay14bWwiPgorICAgIDxqZGVwZW5kIGZvcms9InllcyIgZm9ybWF0PSJ4bWwiIGluY2x1ZGVydW50aW1lPSJ5ZXMiPgorICAgICAgPGNsYXNzZXNwYXRoIHJlZmlkPSJleGFtcGxlLWNsYXNzZXMuaWQiLz4KKyAgICA8L2pkZXBlbmQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZm9yay10aW1lb3V0Ij4KKyAgICA8amRlcGVuZCBmb3JrPSJ5ZXMiIHRpbWVvdXQ9IjEwIiBpbmNsdWRlcnVudGltZT0ieWVzIj4KKyAgICAgIDxjbGFzc2VzcGF0aCByZWZpZD0idGVzdC1jbGFzc2VzLmlkIi8+CisgICAgPC9qZGVwZW5kPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZvcmstdGltZW91dC1ub3QiPgorICAgIDxqZGVwZW5kIGZvcms9InllcyIgdGltZW91dD0iMTAwMDAwIiBpbmNsdWRlcnVudGltZT0ieWVzIj4KKyAgICAgIDxjbGFzc2VzcGF0aCByZWZpZD0iZXhhbXBsZS1jbGFzc2VzLmlkIi8+CisgICAgPC9qZGVwZW5kPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC8xbnZhbGlkLWNsYXNzbmFtZS5qc3AgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvMW52YWxpZC1jbGFzc25hbWUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjQyZTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvMW52YWxpZC1jbGFzc25hbWUuanNwCkBAIC0wLDAgKzEsMjUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiAlPgorPGh0bWw+Cis8aGVhZC8+Cis8Ym9keT4KKworbXkgbmFtZSBpcyA8JT0gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSAgJT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL1dFQi1JTkYvd2ViLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMTk5ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4iCisgICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy93ZWItYXBwXzJfMi5kdGQiPgorPHdlYi1hcHAvPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL2RlZmF1bHQuanNwIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL2RlZmF1bHQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Mjk2YjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvZGVmYXVsdC5qc3AKQEAgLTAsMCArMSwyNSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiICU+Cis8aHRtbD4KKzxoZWFkLz4KKzxib2R5PgorCitJdCBpcyBub3cgPCU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9taXNzaW5nX3RsZC5qc3AgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvbWlzc2luZ190bGQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzdmYjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvbWlzc2luZ190bGQuanNwCkBAIC0wLDAgKzEsMzIgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3RsZHMvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvdGxkcy9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi90bGRzL3N0cnV0cy10ZW1wbGF0ZS50bGQiIHByZWZpeD0idGVtcGxhdGUiICU+Cis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+Cis8aGVhZD4KKzx0aXRsZT5zaG91bGRudCBjb21waWxlPC90aXRsZT4KKzxodG1sOmJhc2UvPgorPC9oZWFkPgorPGJvZHk+CisKK1RoaXMgcGFnZSBzaG91bGQgbm90IGNvbXBpbGUgYmVjYXVzZSByZWZlcnMgdG8gVExEcyB0aGF0IGFyZW50IGFyb3VuZC4KKworPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9zaW1wbGUuanNwIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL3NpbXBsZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyOTZiMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9zaW1wbGUuanNwCkBAIC0wLDAgKzEsMjUgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiAlPgorPGh0bWw+Cis8aGVhZC8+Cis8Ym9keT4KKworSXQgaXMgbm93IDwlPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvdXJpcm9vdC5qc3AgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvdXJpcm9vdC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyOTZiMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC91cmlyb290LmpzcApAQCAtMCwwICsxLDI1IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgJT4KKzxodG1sPgorPGhlYWQvPgorPGJvZHk+CisKK0l0IGlzIG5vdyA8JT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgJT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL3htbC5qc3AgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AveG1sLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDlhOWVkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL3htbC5qc3AKQEAgLTAsMCArMSwzMiBAQAorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPD94bWwgdmVyc2lvbj0iMS4wIiA/PgorPCEtLSA6bW9kZT14bWw6aW5kZW50U2l6ZT0yIC0tPgorPCEtLSBub3RlIHRoZSBsYWNrIG9mIGEgbGFuZ3VhZ2Ugc2V0dGluZyBoZXJlLiBjcmltc29uIHdoaW5lZCB3aGVuIElTTy04ODU5LTEgd2FzIHNldCwKKwkgdGhhdCBpdCB0aG91Z2h0IGl0IHdhcyBsb2FkaW5nIGEgZmlsZSBvZiB0eXBlIElTT184ODU5XzEgYW5kCisJIHNvIHRoZXJlIHdhcyBhIG1pc21hdGNoLCBldmVuIHRob3VnaCB0aGUgbWlzbWF0Y2ggaXMgb25seSAKKwkgYmV0d2VlbiBoeXBoZW4gdHlwZXMgLS0+Cis8anNwOnJvb3QKKyAgeG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIgorICB2ZXJzaW9uPSIxLjIiCisgID4KKzxqc3A6ZGlyZWN0aXZlLnBhZ2UgbGFuZ3VhZ2U9ImphdmEiIC8+Cis8anNwOmRpcmVjdGl2ZS5wYWdlIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiIC8+Cis8dGltZXN0YW1wPgorPGpzcDpleHByZXNzaW9uPlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpPC9qc3A6ZXhwcmVzc2lvbj4KKzwvdGltZXN0YW1wPgorPC9qc3A6cm9vdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcGMueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjMWVmMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcGMueG1sCkBAIC0wLDAgKzEsMTMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ianNwYy10ZXN0IiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KKworICAgPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJ0ZXN0U2ltcGxlIj4KKyAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImpzcC5kaXIiIGxvY2F0aW9uPSJqc3AiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImpzcC5vdXRwdXQuZGlyIiBsb2NhdGlvbj0iJHtqc3AuZGlyfS9qYXZhIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqc3AudmVyYm9zaXR5IiB2YWx1ZT0iMyIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ianNwLmNvbXBpbGVyIiB2YWx1ZT0iamFzcGVyNDEiLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqc3Aub3V0cHV0LmRpcn0iLz4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtqc3Aub3V0cHV0LmRpcn0iLz4gICAKKyAgICA8L3RhcmdldD4KKyAgIAorICAgPCEtLSB0aGlzIHNob3VsZCBmYWlsIC0tPgorICAgPCEtLSBpdCBzaG91bGQgbm90IGNyZWF0ZSBhbiBvdXRwdXQgZmlsZSwgYnV0IGl0IGRvZXMsIHdoaWNoIG5lZWRzCisgICAgICAgIGNsZWFudXAgLS0+CisgICA8dGFyZ2V0IG5hbWU9InRlc3ROb1RsZCIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxqc3BjCisgICAgICAgICAgIGRlc3RkaXI9IiR7anNwLm91dHB1dC5kaXJ9IgorICAgICAgICAgICBzcmNkaXI9IiR7anNwLmRpcn0iCisgICAgICAgICAgIGNvbXBpbGVyPSIke2pzcC5jb21waWxlcn0iCisgICAgICAgICAgIHZlcmJvc2U9IiR7anNwLnZlcmJvc2l0eX0iPgorICAgICAgICAgICAgPGluY2x1ZGUKKyAgICAgICAgICAgICAgIG5hbWU9Im1pc3NpbmdfdGxkLmpzcCIvPgorICAgICAgICA8L2pzcGM+CisgICA8L3RhcmdldD4KKworICAgPCEtLSB0aGlzIHNob3VsZCBjb21waWxlIHRvIHNpbXBsZS5qYXZhIC0tPgorICAgIDwhLS0gYWxzbywgc3RpY2sgdG8gdGhlIGRlZmF1bHQgY29tcGlsZXIgaGVyZSB0byBlbnN1cmUgaXQgc3RpbGwgd29ya3MtLT4KKyAgIDx0YXJnZXQgbmFtZT0idGVzdFNpbXBsZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxqc3BjCisgICAgICAgICAgIGRlc3RkaXI9IiR7anNwLm91dHB1dC5kaXJ9IgorICAgICAgICAgICBzcmNkaXI9IiR7anNwLmRpcn0iCisgICAgICAgICAgIHZlcmJvc2U9IiR7anNwLnZlcmJvc2l0eX0iPgorICAgICAgICAgICAgPGluY2x1ZGUKKyAgICAgICAgICAgICAgIG5hbWU9InNpbXBsZS5qc3AiLz4KKyAgICAgICAgPC9qc3BjPgorICAgPC90YXJnZXQ+ICAgCisKKyAgICA8IS0tIHRoaXMgc2hvdWxkIGNvbXBpbGUgdG8gdXJpcm9vdC5qYXZhIC0tPgorICAgIDx0YXJnZXQgbmFtZT0idGVzdFVyaXJvb3QiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8anNwYworICAgICAgICAgICBkZXN0ZGlyPSIke2pzcC5vdXRwdXQuZGlyfSIKKyAgICAgICAgICAgdXJpcm9vdD0iJHtqc3AuZGlyfSIKKyAgICAgICAgICAgc3JjZGlyPSIke2pzcC5kaXJ9IgorICAgICAgICAgICBjb21waWxlcj0iJHtqc3AuY29tcGlsZXJ9IgorICAgICAgICAgICB2ZXJib3NlPSIke2pzcC52ZXJib3NpdHl9Ij4KKyAgICAgICAgICAgIDxpbmNsdWRlCisgICAgICAgICAgICAgICAgbmFtZT0idXJpcm9vdC5qc3AiLz4KKyAgICAgICAgPC9qc3BjPgorICAgIDwvdGFyZ2V0PiAKKyAgIAorICAgPCEtLSB0aGlzIHNob3VsZCBjb21waWxlIGFuIHhtbCBmb3JtYXQganNwIHBhZ2UgdG8geG1sLmphdmEgLS0+CisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0WG1sIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgIDxqc3BjCisgICAgICAgIGRlc3RkaXI9IiR7anNwLm91dHB1dC5kaXJ9IgorICAgICAgICB1cmlyb290PSIke2pzcC5kaXJ9IgorICAgICAgICBzcmNkaXI9IiR7anNwLmRpcn0iCisgICAgICAgIGNvbXBpbGVyPSIke2pzcC5jb21waWxlcn0iCisgICAgICAgIHZlcmJvc2U9IiR7anNwLnZlcmJvc2l0eX0iPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InhtbC5qc3AiLz4KKyAgICAgIDwvanNwYz4KKyAgIDwvdGFyZ2V0PgorICAgCisgICA8IS0tIHRoaXMgc2hvdWxkIGNvbXBpbGUgZGVmYXVsdC5qc3AgdG8gbWFuZ2xlZCglZGVmYXVsdCkuamF2YSAtLT4KKyAgIDx0YXJnZXQgbmFtZT0idGVzdEtleXdvcmQiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8anNwYworICAgICAgICAgICBkZXN0ZGlyPSIke2pzcC5vdXRwdXQuZGlyfSIKKyAgICAgICAgICAgc3JjZGlyPSIke2pzcC5kaXJ9IgorICAgICAgICAgICBjb21waWxlcj0iJHtqc3AuY29tcGlsZXJ9IgorICAgICAgICAgICB2ZXJib3NlPSIke2pzcC52ZXJib3NpdHl9Ij4KKyAgICAgICAgICAgIDxpbmNsdWRlCisgICAgICAgICAgICAgICBuYW1lPSJkZWZhdWx0LmpzcCIvPgorICAgICAgICA8L2pzcGM+CisgICA8L3RhcmdldD4gIAorICAgCisgICA8IS0tIHRoaXMgc2hvdWxkIGNvbXBpbGUgZGVmYXVsdC5qc3AgdG8gbWFuZ2xlZCglZGVmYXVsdCkuamF2YSAtLT4KKyAgIDx0YXJnZXQgbmFtZT0idGVzdEludmFsaWRDbGFzc25hbWUiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8anNwYworICAgICAgICAgICBkZXN0ZGlyPSIke2pzcC5vdXRwdXQuZGlyfSIKKyAgICAgICAgICAgc3JjZGlyPSIke2pzcC5kaXJ9IgorICAgICAgICAgICBjb21waWxlcj0iJHtqc3AuY29tcGlsZXJ9IgorICAgICAgICAgICB2ZXJib3NlPSIke2pzcC52ZXJib3NpdHl9Ij4KKyAgICAgICAgICAgIDxpbmNsdWRlCisgICAgICAgICAgICAgICBuYW1lPSIxbnZhbGlkLWNsYXNzbmFtZS5qc3AiLz4KKyAgICAgICAgPC9qc3BjPgorICAgPC90YXJnZXQ+ICAKKworICAgPCEtLSBub24ganNwIHBhZ2VzIHNob3VsZCBiZSBpZ25vcmVkIC0tPgorICAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm90QUpzcEZpbGUiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8anNwYworICAgICAgICAgICBkZXN0ZGlyPSIke2pzcC5vdXRwdXQuZGlyfSIKKyAgICAgICAgICAgc3JjZGlyPSIke2pzcC5kaXJ9IgorICAgICAgICAgICBjb21waWxlcj0iJHtqc3AuY29tcGlsZXJ9IgorICAgICAgICAgICB2ZXJib3NlPSIke2pzcC52ZXJib3NpdHl9Ij4KKyAgICAgICAgICAgIDxpbmNsdWRlCisgICAgICAgICAgICAgICBuYW1lPSJ3cm9uZ190eXBlLnR4dCIvPgorICAgICAgICA8L2pzcGM+CisgICA8L3RhcmdldD4KKyAgIAorICAgPCEtLSB0ZXN0IGZvciB3ZWJhcHAgY29tcGlsYXRpb24gLS0+CisgICA8dGFyZ2V0IG5hbWU9InRlc3RXZWJhcHAiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8anNwYworICAgICAgICAgICBkZXN0ZGlyPSIke2pzcC5vdXRwdXQuZGlyfSIKKyAgICAgICAgICAgY29tcGlsZXI9IiR7anNwLmNvbXBpbGVyfSIKKyAgICAgICAgICAgdmVyYm9zZT0iJHtqc3AudmVyYm9zaXR5fSI+CisgICAgICAgICAgICA8d2ViYXBwIGJhc2VkaXI9IiR7anNwLmRpcn0iIC8+CisgICAgICAgIDwvanNwYz4KKyAgIDwvdGFyZ2V0PiAgCisgICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQyMjFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQueG1sCkBAIC0wLDAgKzEsMjYxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ianVuaXQtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ib3V0cHV0VGVzdHMiPgorICA8cHJvcGVydHkgbmFtZT0ic2hvd291dHB1dCIgdmFsdWU9ImZhbHNlIiAvPgorICA8cGF0aCBpZD0idGVzdCI+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0bG9nLnR4dCIvPgorICAgIDxkZWxldGUgZGlyPSJvdXQiIGluY2x1ZGVlbXB0eWRpcnM9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGb3JrZWRPdXRwdXQiPgorICAgIDxqdW5pdCBmb3JrPSJ5ZXMiIGhhbHRvbmVycm9yPSJ0cnVlIiBoYWx0b25mYWlsdXJlPSJ0cnVlIiAKKyAgICAgICAgICAgc2hvd291dHB1dD0iJHtzaG93b3V0cHV0fSI+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdC5PdXRwdXQiIC8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0IiAvPgorICAgIDwvanVuaXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vbkZvcmtlZE91dHB1dCI+CisgICAgPGp1bml0IGZvcms9ImZhbHNlIiBoYWx0b25lcnJvcj0idHJ1ZSIgaGFsdG9uZmFpbHVyZT0idHJ1ZSIKKyAgICAgICAgICAgc2hvd291dHB1dD0iJHtzaG93b3V0cHV0fSI+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdC5PdXRwdXQiIC8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0IiAvPgorICAgIDwvanVuaXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZvcmtlZFRocmVhZGVkT3V0cHV0Ij4KKyAgICA8anVuaXQgZm9yaz0ieWVzIiBoYWx0b25lcnJvcj0idHJ1ZSIgaGFsdG9uZmFpbHVyZT0idHJ1ZSIKKyAgICAgICAgICAgc2hvd291dHB1dD0iJHtzaG93b3V0cHV0fSI+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdC5UaHJlYWRlZE91dHB1dCIgLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiIC8+CisgICAgPC9qdW5pdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9uRm9ya2VkVGhyZWFkZWRPdXRwdXQiPgorICAgIDxqdW5pdCBmb3JrPSJmYWxzZSIgaGFsdG9uZXJyb3I9InRydWUiIGhhbHRvbmZhaWx1cmU9InRydWUiCisgICAgICAgICAgIHNob3dvdXRwdXQ9IiR7c2hvd291dHB1dH0iPgorICAgICAgPHRlc3QgbmFtZT0ib3JnLmV4YW1wbGUuanVuaXQuVGhyZWFkZWRPdXRwdXQiIC8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0IiAvPgorICAgIDwvanVuaXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ib3V0cHV0VGVzdHMiIAorICAgICAgICAgIGRlcGVuZHM9InRlc3RGb3JrZWRPdXRwdXQsdGVzdE5vbkZvcmtlZE91dHB1dCx0ZXN0Rm9ya2VkVGhyZWFkZWRPdXRwdXQsdGVzdE5vbkZvcmtlZFRocmVhZGVkT3V0cHV0IiAvPgorCisgIDx0YXJnZXQgbmFtZT0iY3Jhc2giPgorICAgIDxqdW5pdCBmb3JrPSJ0cnVlIiBlcnJvcnByb3BlcnR5PSJjcmFzaGVkIj4KKyAgICAgIDx0ZXN0IG5hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlZtQ3Jhc2giLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiIC8+CisgICAgPC9qdW5pdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJub2NyYXNoIj4KKyAgICA8anVuaXQgZm9yaz0idHJ1ZSIgZXJyb3Jwcm9wZXJ0eT0iY3Jhc2hlZCI+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5Ob1ZtQ3Jhc2giLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiIC8+CisgICAgPC9qdW5pdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0aW1lb3V0Ij4KKyAgICA8anVuaXQgZm9yaz0idHJ1ZSIgZXJyb3Jwcm9wZXJ0eT0idGltZW91dCIgdGltZW91dD0iMTAwMCI+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5TbGVlcGVyIi8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0IiAvPgorICAgIDwvanVuaXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm90aW1lb3V0Ij4KKyAgICA8anVuaXQgZm9yaz0idHJ1ZSIgZXJyb3Jwcm9wZXJ0eT0idGltZW91dCIgdGltZW91dD0iMTUwMDAiPgorICAgICAgPHRlc3QgbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuU2xlZXBlciIvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIgLz4KKyAgICA8L2p1bml0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNhcHR1cmUiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JrIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8anVuaXQgZm9yaz0iJHtmb3JrfSI+CisgICAgICA8dGVzdAorICAgICAgICBuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5QcmludGVyIgorICAgICAgICBvdXRmaWxlPSJ0ZXN0bG9nIi8+CisgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Ii8+CisgICAgPC9qdW5pdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjYXB0dXJlVG9TdW1tYXJ5Ij4KKyAgICA8cHJvcGVydHkgbmFtZT0iZm9yayIgdmFsdWU9InRydWUiLz4KKyAgICA8anVuaXQgZm9yaz0iJHtmb3JrfSIgcHJpbnRTdW1tYXJ5PSJ3aXRoT3V0QW5kRXJyIj4KKyAgICAgIDx0ZXN0IG5hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlByaW50ZXIiLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiLz4KKyAgICA8L2p1bml0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RCYXRjaFRlc3RGb3JrT25jZVRvRGlyIj4KKyAgICA8bWtkaXIgZGlyPSJvdXQiLz4KKyAgICA8anVuaXQgZm9yaz0idHJ1ZSIgZm9ya21vZGU9Im9uY2UiPgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiLz4KKyAgICAgIDxiYXRjaHRlc3QgdG9kaXI9Im91dCI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vLi4vLi4vdGVzdHMvanVuaXQiPgorICAgICAgICAgIDxpbmNsdWRlCisgICAgICAgICAgICBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC8qVGVzdC5qYXZhIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovSlVuaXRUYXNrVGVzdC5qYXZhIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovSlVuaXRSZXBvcnRUZXN0LmphdmEiLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9iYXRjaHRlc3Q+CisgICAgPC9qdW5pdD4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBCdWd6aWxsYSBSZXBvcnQgMzI5NzMgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdEJhdGNoVGVzdEZvcmtPbmNlRXh0ZW5zaW9uIj4KKyAgICA8bWtkaXIgZGlyPSJvdXQiLz4KKyAgICA8anVuaXQgZm9yaz0idHJ1ZSIgZm9ya21vZGU9Im9uY2UiPgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiIGV4dGVuc2lvbj0iLmZvbyIvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgorICAgICAgPGJhdGNodGVzdCB0b2Rpcj0ib3V0Ij4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi8uLi8uLi90ZXN0cy9qdW5pdCI+CisgICAgICAgICAgPGluY2x1ZGUKKyAgICAgICAgICAgIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LypUZXN0LmphdmEiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9KVW5pdFRhc2tUZXN0LmphdmEiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9KVW5pdFJlcG9ydFRlc3QuamF2YSIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2JhdGNodGVzdD4KKyAgICA8L2p1bml0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RCYXRjaFRlc3RGb3JrT25jZUN1c3RvbUZvcm1hdHRlciI+CisgICAgPG1rZGlyIGRpcj0ib3V0Ii8+CisgICAgPGp1bml0IGZvcms9InRydWUiIGZvcmttb2RlPSJvbmNlIj4KKyAgICAgIDxmb3JtYXR0ZXIgZXh0ZW5zaW9uPSJmb28iCisgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuVGVzdEZvcm1hdHRlciIvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgorICAgICAgPGJhdGNodGVzdCB0b2Rpcj0ib3V0Ij4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi8uLi8uLi90ZXN0cy9qdW5pdCI+CisgICAgICAgICAgPGluY2x1ZGUKKyAgICAgICAgICAgIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LypUZXN0LmphdmEiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9KVW5pdFRhc2tUZXN0LmphdmEiLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9KVW5pdFJlcG9ydFRlc3QuamF2YSIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2JhdGNodGVzdD4KKyAgICA8L2p1bml0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZhaWx1cmVSZWNvcmRlci5wcmVwYXJlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0idG1wLmRpciIgdmFsdWU9Im91dCIvPgorICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0vb3JnIi8+CisgICAgPGVjaG8gZmlsZT0iJHt0bXAuZGlyfS9BLmphdmEiPgorICAgICAgICBpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisgICAgICAgIHB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgVGVzdENhc2UgeworICAgICAgICAgICAgcHVibGljIEEoU3RyaW5nIHMpIHsgc3VwZXIocyk7IH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3QwMSgpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBLnRlc3QwMSIpOyB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0MDIoKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQS50ZXN0MDIiKTsgZmFpbCgpOyB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0MDMoKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQS50ZXN0MDMiKTsgZmFpbCgpOyB9CisgICAgICAgIH0KKyAgICA8L2VjaG8+CisgICAgPGVjaG8gZmlsZT0iJHt0bXAuZGlyfS9CLmphdmEiPgorICAgICAgICBpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisgICAgICAgIHB1YmxpYyBjbGFzcyBCIGV4dGVuZHMgVGVzdENhc2UgeworICAgICAgICAgICAgcHVibGljIEIoU3RyaW5nIHMpIHsgc3VwZXIocyk7IH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3QwNCgpIHsgU3lzdGVtLm91dC5wcmludGxuKCJCLnRlc3QwNCIpOyBmYWlsKCk7IH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3QwNSgpIHsgU3lzdGVtLm91dC5wcmludGxuKCJCLnRlc3QwNSIpOyB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0MDYoKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQi50ZXN0MDYiKTsgfQorICAgICAgICB9CisgICAgPC9lY2hvPgorICAgIDxlY2hvIGZpbGU9IiR7dG1wLmRpcn0vQy5qYXZhIj4KKyAgICAgICAgaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworICAgICAgICBwdWJsaWMgY2xhc3MgQyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAgICAgICAgIHB1YmxpYyBDKFN0cmluZyBzKSB7IHN1cGVyKHMpOyB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0MDcoKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQy50ZXN0MDciKTsgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdDA4KCkgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkMudGVzdDA4Iik7IH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3QwOSgpIHsgU3lzdGVtLm91dC5wcmludGxuKCJDLnRlc3QwOSIpOyB9CisgICAgICAgIH0KKyAgICA8L2VjaG8+CisgICAgPGVjaG8gZmlsZT0iJHt0bXAuZGlyfS9vcmcvRC5qYXZhIj4KKyAgICAJcGFja2FnZSBvcmc7CisgICAgICAgIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKKyAgICAgICAgcHVibGljIGNsYXNzIEQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgICAgICAgICBwdWJsaWMgRChTdHJpbmcgcykgeyBzdXBlcihzKTsgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdDEwKCkgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkQudGVzdDEwIik7IGZhaWwoKTsgfQorICAgICAgICB9CisgICAgPC9lY2hvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7dG1wLmRpcn0iIGRlc3RkaXI9IiR7dG1wLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmYWlsdXJlUmVjb3JkZXIuaW50ZXJuYWwiPiAgCisgICAgPHByb3BlcnR5IG5hbWU9InRtcC5kaXIiIHZhbHVlPSJvdXQiLz4KKyAgICA8ZGVsZXRlPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RtcC5kaXJ9IiBpbmNsdWRlcz0iRmFpbGVkVGVzdHMqLmNsYXNzIi8+CisgICAgPC9kZWxldGU+CisgICAgPCEtLSBjb21waWxlIHRoZSBGYWlsZWRUZXN0cyBjbGFzcyBpZiBwcmVzZW50IC0tPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7dG1wLmRpcn0iIGRlc3RkaXI9IiR7dG1wLmRpcn0iLz4KKyAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dG1wLmRpcn0vRmFpbGVkVGVzdHMuY2xhc3MiIHByb3BlcnR5PSJoYXNGYWlsaW5nVGVzdHMiLz4KKyAgICAKKyAgICA8cHJvcGVydHkgbmFtZT0iYW50Lmp1bml0LmZhaWx1cmVDb2xsZWN0b3IiIHZhbHVlPSIke3RtcC5kaXJ9L0ZhaWxlZFRlc3RzIi8+CisgICAgPGp1bml0IGhhbHRvbmVycm9yPSJmYWxzZSIgaGFsdG9uZmFpbHVyZT0iZmFsc2UiPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RtcC5kaXJ9Ii8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dG1wLmRpcn0iIHVubGVzcz0iaGFzRmFpbGluZ1Rlc3RzIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RtcC5kaXJ9IiBpbmNsdWRlcz0iKiovKi5qYXZhIiBleGNsdWRlcz0iKiovRmFpbGVkVGVzdHMuKiIvPgorICAgICAgICA8IS0tIGZvciBpbml0aWFsIGNyZWF0aW9uIG9mIHRoZSBGYWlsaW5nVGVzdHMuamF2YSAtLT4KKyAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJmYWlsdXJlIi8+CisgICAgICAgIDwhLS0gSSB3YW50IHRvIHNlZSBzb21ldGhpbmcgLi4uIC0tPgorICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB1c2VmaWxlPSJmYWxzZSIvPgorICAgICAgPC9iYXRjaHRlc3Q+CisgICAgICA8dGVzdCBuYW1lPSJGYWlsZWRUZXN0cyIgaWY9Imhhc0ZhaWxpbmdUZXN0cyI+CisgICAgICAJPCEtLSB1cGRhdGUgdGhlIEZhaWxpbmdUZXN0cy5qYXZhIC0tPgorICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9ImZhaWx1cmUiLz4KKyAgICAgICAgPCEtLSBhZ2FpbiwgSSB3YW50IHRvIHNlZSBzb21ldGhpbmcgLS0+CisgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIi8+CisgICAgICA8L3Rlc3Q+CisgICAgPC9qdW5pdD4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImZhaWx1cmVSZWNvcmRlci5ydW50ZXN0Ij4KKyAgCTxhbnQgdGFyZ2V0PSJmYWlsdXJlUmVjb3JkZXIuaW50ZXJuYWwiCisgICAgICAgICBhbnRmaWxlPSJqdW5pdC54bWwiIAorICAgICAgICAgaW5oZXJpdEFsbD0iZmFsc2UiCisgICAgICAgICBpbmhlcml0UmVmcz0iZmFsc2UiIAorICAgIC8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJmYWlsdXJlUmVjb3JkZXIuZml4aW5nIj4KKyAgICA8cHJvcGVydHkgbmFtZT0idG1wLmRpciIgdmFsdWU9Im91dCIvPgorICAgIDxlY2hvIGZpbGU9IiR7dG1wLmRpcn0vQS5qYXZhIj4KKyAgICAgICAgaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworICAgICAgICBwdWJsaWMgY2xhc3MgQSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAgICAgICAgIHB1YmxpYyBBKFN0cmluZyBzKSB7IHN1cGVyKHMpOyB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0MDEoKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQS50ZXN0MDEiKTsgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdDAyKCkgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkEudGVzdDAyIik7IH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3QwMygpIHsgU3lzdGVtLm91dC5wcmludGxuKCJBLnRlc3QwMyIpOyB9CisgICAgICAgIH0KKyAgICA8L2VjaG8+CisgIDwvdGFyZ2V0PgorICAKKzx0YXJnZXQgbmFtZT0iY29weSI+CisgIDxta2RpciBkaXI9ImM6L3RlbXAvYW50LWxvZyIvPgorICA8Y29weSBmaWxlPSJvdXQvJHtmaWxlfSIgdG9maWxlPSJjOi90ZW1wL2FudC1sb2cvJHtucn0tJHtmaWxlfSIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+Cis8L3RhcmdldD4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9jZGF0YW91dHB1dC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9jZGF0YW91dHB1dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1NDA5YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L2NkYXRhb3V0cHV0LnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGJhc2VkaXI9Ii4iPgorICA8dGFyZ2V0IG5hbWU9InJ1bi1qdW5pdCI+CisgICAgPGp1bml0IGZvcms9InRydWUiPgorICAgICAgPGNsYXNzcGF0aCBwYXRoPSIke3Rlc3RzLWNsYXNzcGF0aC52YWx1ZX0iLz4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImNkYXRhLmlubmVyIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHRlc3QKKyAgICAgICAgbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuWE1MRm9ybWF0dGVyV2l0aENEQVRBT25TeXN0ZW1PdXQiLz4KKyAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIi8+CisgICAgPC9qdW5pdD4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvbWF0Y2hlcy54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9tYXRjaGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDcyMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvbWF0Y2hlcy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWF0Y2hlcz4NCisgIDxmb28+DQorICAgIDxhYmM+DQorICAgICAgPGZvby8+DQorICAgICAgPGZvby8+DQorICAgIDwvYWJjPg0KKyAgPC9mb28+DQorPC9tYXRjaGVzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LXdpdGgtaW5jbHVkZS9qdW5pdC1mcmFtZXMueHNsIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQtd2l0aC1pbmNsdWRlL2p1bml0LWZyYW1lcy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkNjZjNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LXdpdGgtaW5jbHVkZS9qdW5pdC1mcmFtZXMueHNsCkBAIC0wLDAgKzEsODc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIg0KKyAgICB4bWxuczpseHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiDQorICAgIHhtbG5zOnJlZGlyZWN0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4vcmVkaXJlY3QiDQorICAgIHhtbG5zOnN0cmluZ3V0aWxzPSJ4YWxhbjovL29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHMiDQorICAgIGV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJyZWRpcmVjdCI+DQorPHhzbDppbXBvcnQgaHJlZj0ianVuaXQtaW1wb3J0LnhzbCIvPg0KKzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPg0KKzx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIvPg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgLS0+DQorDQorPCEtLQ0KKw0KKyBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggQW50IEpVbml0UmVwb3J0IG91dHB1dC4NCisNCisgSXQgY3JlYXRlcyBhIHNldCBvZiBIVE1MIGZpbGVzIGEgbGEgamF2YWRvYyB3aGVyZSB5b3UgY2FuIGJyb3dzZSBlYXNpbHkNCisgdGhyb3VnaCBhbGwgcGFja2FnZXMgYW5kIGNsYXNzZXMuDQorDQorLS0+DQorPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPg0KKzx4c2w6cGFyYW0gbmFtZT0ia2V5MSIgc2VsZWN0PSInZGVmYXVsdFZhbHVlMSciLz4NCis8eHNsOnBhcmFtIG5hbWU9ImtleTIiIHNlbGVjdD0iJ2RlZmF1bHRWYWx1ZTInIi8+DQorDQorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyI+DQorICAgIDwhLS0gY3JlYXRlIHRoZSBpbmRleC5odG1sIC0tPg0KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9pbmRleC5odG1sIj4NCisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIi8+DQorICAgIDwvcmVkaXJlY3Q6d3JpdGU+DQorDQorICAgIDwhLS0gY3JlYXRlIHRoZSBzdHlsZXNoZWV0LmNzcyAtLT4NCisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPg0KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+DQorICAgIDwvcmVkaXJlY3Q6d3JpdGU+DQorDQorICAgIDwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPg0KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9vdmVydmlldy1zdW1tYXJ5Lmh0bWwiPg0KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyIvPg0KKyAgICA8L3JlZGlyZWN0OndyaXRlPg0KKw0KKyAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+DQorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LWZyYW1lLmh0bWwiPg0KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwucGFja2FnZXMiLz4NCisgICAgPC9yZWRpcmVjdDp3cml0ZT4NCisNCisgICAgPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+DQorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+DQorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5jbGFzc2VzIi8+DQorICAgIDwvcmVkaXJlY3Q6d3JpdGU+DQorDQorICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtdGVzdHMuaHRtbCBhdCB0aGUgcm9vdCAtLT4NCisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsLXRlc3RzLmh0bWwiPg0KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwudGVzdHMiLz4NCisgICAgPC9yZWRpcmVjdDp3cml0ZT4NCisNCisgICAgPCEtLSBjcmVhdGUgdGhlIGFsbHRlc3RzLWZhaWxzLmh0bWwgYXQgdGhlIHJvb3QgLS0+DQorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbHRlc3RzLWZhaWxzLmh0bWwiPg0KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnRlc3RzIj4NCisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidmYWlscyciLz4NCisgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+DQorICAgIDwvcmVkaXJlY3Q6d3JpdGU+DQorDQorICA8IS0tIGNyZWF0ZSB0aGUgYWxsdGVzdHMtZXJyb3JzLmh0bWwgYXQgdGhlIHJvb3QgLS0+DQorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbHRlc3RzLWVycm9ycy5odG1sIj4NCisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC50ZXN0cyI+DQorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInZXJyb3JzJyIvPg0KKyAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4NCisgICAgPC9yZWRpcmVjdDp3cml0ZT4NCisNCisgIDwhLS0gcHJvY2VzcyBhbGwgcGFja2FnZXMgLS0+DQorICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL3Rlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+DQorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZSI+DQorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4NCisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQorICAgIDwveHNsOmZvci1lYWNoPg0KKzwveHNsOnRlbXBsYXRlPg0KKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2UiPg0KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+DQorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4NCisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkbmFtZSA9ICcnKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkbmFtZSwnLicsJy8nKSIvPjwveHNsOmlmPg0KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+LjwveHNsOmlmPg0KKyAgICAgICAgPC94c2w6dmFyaWFibGU+DQorICAgICAgICA8IS0tUHJvY2Vzc2luZyBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dC5kaXIiLz4gLS0+DQorICAgICAgICA8IS0tIGNyZWF0ZSBhIGNsYXNzZXMtbGlzdC5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4NCisgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2UtZnJhbWUuaHRtbCI+DQorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzZXMubGlzdCI+DQorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+DQorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCisgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+DQorDQorICAgICAgICA8IS0tIGNyZWF0ZSBhIHBhY2thZ2Utc3VtbWFyeS5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4NCisgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4NCisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4NCisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iJG5hbWUiLz4NCisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KKyAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4NCisNCisgICAgICAgIDwhLS0gZm9yIGVhY2ggY2xhc3MsIGNyZWF0ZXMgYSBAbmFtZS5odG1sIC0tPg0KKyAgICAgICAgPCEtLSBAYnVnIHRoZXJlIHdpbGwgYmUgYSBwcm9ibGVtIHdpdGggaW5uZXIgY2xhc3NlcyBoYXZpbmcgdGhlIHNhbWUgbmFtZSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiAtLT4NCisgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlW0BwYWNrYWdlID0gJG5hbWVdIj4NCisgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0uaHRtbCI+DQorICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY2xhc3MuZGV0YWlscyIvPg0KKyAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4NCisgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1vdXQpIT0wIj4NCisgICAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BpZH1fe0BuYW1lfS1vdXQudHh0Ij4NCisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iLi9zeXN0ZW0tb3V0Ii8+DQorICAgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+DQorICAgICAgICA8L3hzbDppZj4NCisgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1lcnIpIT0wIj4NCisgICAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BpZH1fe0BuYW1lfS1lcnIudHh0Ij4NCisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iLi9zeXN0ZW0tZXJyIi8+DQorICAgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+DQorICAgICAgICA8L3hzbDppZj4NCisgICAgICAgIDx4c2w6aWYgdGVzdD0iQGZhaWx1cmVzICE9IDAiPg0KKyAgICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QGlkfV97QG5hbWV9LWZhaWxzLmh0bWwiPg0KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY2xhc3MuZGV0YWlscyI+DQorICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInZmFpbHMnIi8+DQorICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPg0KKyAgICAgICAgICA8L3JlZGlyZWN0OndyaXRlPg0KKyAgICAgICAgPC94c2w6aWY+DQorICAgICAgICA8eHNsOmlmIHRlc3Q9IkBlcnJvcnMgIT0gMCI+DQorICAgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0tZXJyb3JzLmh0bWwiPg0KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY2xhc3MuZGV0YWlscyI+DQorICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInZXJyb3JzJyIvPg0KKyAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4NCisgICAgICAgICAgPC9yZWRpcmVjdDp3cml0ZT4NCisgICAgICAgIDwveHNsOmlmPg0KKyAgICAgIDwveHNsOmZvci1lYWNoPg0KKyAgICA8L3hzbDp0ZW1wbGF0ZT4NCisNCisNCis8eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPg0KKzxodG1sPg0KKyAgICA8aGVhZD4NCisgICAgICAgIDx0aXRsZT4NCisgICAgICAgICAgICBVbml0IFRlc3QgUmVzdWx0cy4ga2V5MT08eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGtleTEiLz4sa2V5Mj08eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGtleTIiLz4NCisgICAgICAgIDwvdGl0bGU+DQorICAgIDwvaGVhZD4NCisgICAgPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPg0KKyAgICAgICAgPGZyYW1lc2V0IHJvd3M9IjMwJSw3MCUiPg0KKyAgICAgICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LWZyYW1lLmh0bWwiIG5hbWU9InBhY2thZ2VMaXN0RnJhbWUiLz4NCisgICAgICAgICAgICA8ZnJhbWUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+DQorICAgICAgICA8L2ZyYW1lc2V0Pg0KKyAgICAgICAgPGZyYW1lIHNyYz0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiBuYW1lPSJjbGFzc0ZyYW1lIi8+DQorICAgICAgICA8bm9mcmFtZXM+DQorICAgICAgICAgICAgPGgyPkZyYW1lIEFsZXJ0PC9oMj4NCisgICAgICAgICAgICA8cD4NCisgICAgICAgICAgICAgICAgVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuDQorICAgICAgICAgICAgPC9wPg0KKyAgICAgICAgPC9ub2ZyYW1lcz4NCisgICAgPC9mcmFtZXNldD4NCis8L2h0bWw+DQorPC94c2w6dGVtcGxhdGU+DQorDQorPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPg0KKzx4c2w6dGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiPg0KK2JvZHkgew0KKyAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7DQorICAgIGNvbG9yOiMwMDAwMDA7DQorfQ0KK3RhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7DQorICAgIGZvbnQtc2l6ZTogNjglOw0KK30NCit0YWJsZS5kZXRhaWxzIHRyIHRoew0KKyAgICBmb250LXdlaWdodDogYm9sZDsNCisgICAgdGV4dC1hbGlnbjpsZWZ0Ow0KKyAgICBiYWNrZ3JvdW5kOiNhNmNhZjA7DQorfQ0KK3RhYmxlLmRldGFpbHMgdHIgdGR7DQorICAgIGJhY2tncm91bmQ6I2VlZWVlMDsNCit9DQorDQorcCB7DQorICAgIGxpbmUtaGVpZ2h0OjEuNWVtOw0KKyAgICBtYXJnaW4tdG9wOjAuNWVtOyBtYXJnaW4tYm90dG9tOjEuMGVtOw0KK30NCitoMSB7DQorICAgIG1hcmdpbjogMHB4IDBweCA1cHg7IGZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2ENCit9DQoraDIgew0KKyAgICBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEyNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2ENCit9DQoraDMgew0KKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMTUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhDQorfQ0KK2g0IHsNCisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQ0KK30NCitoNSB7DQorICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2ENCit9DQoraDYgew0KKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhDQorfQ0KKy5FcnJvciB7DQorICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnJlZDsNCit9DQorLkZhaWx1cmUgew0KKyAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpwdXJwbGU7DQorfQ0KKy5Qcm9wZXJ0aWVzIHsNCisgIHRleHQtYWxpZ246cmlnaHQ7DQorfQ0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKzwhLS0gQ3JlYXRlIGxpc3Qgb2YgYWxsL2ZhaWxlZC9lcnJvcmVkIHRlc3RzIC0tPg0KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9ImFsbC50ZXN0cyI+DQorICAgIDx4c2w6cGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInYWxsJyIvPg0KKyAgICA8aHRtbD4NCisJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aXRsZSI+DQorCSAgICA8eHNsOmNob29zZT4NCisJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdmYWlscyciPg0KKwkJICAgIDx4c2w6dGV4dD5BbGwgRmFpbHVyZXM8L3hzbDp0ZXh0Pg0KKwkJPC94c2w6d2hlbj4NCisJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdlcnJvcnMnIj4NCisJCSAgICA8eHNsOnRleHQ+QWxsIEVycm9yczwveHNsOnRleHQ+DQorCQk8L3hzbDp3aGVuPg0KKwkJPHhzbDpvdGhlcndpc2U+DQorCQkgICAgPHhzbDp0ZXh0PkFsbCBUZXN0czwveHNsOnRleHQ+DQorCQk8L3hzbDpvdGhlcndpc2U+DQorCSAgICA8L3hzbDpjaG9vc2U+DQorCTwveHNsOnZhcmlhYmxlPg0KKwk8aGVhZD4NCisJICAgIDx0aXRsZT5Vbml0IFRlc3QgUmVzdWx0czogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+DQorCSAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+DQorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4NCisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KKwk8L2hlYWQ+DQorCTxib2R5Pg0KKwkgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ib25sb2FkIj5vcGVuKCdhbGxjbGFzc2VzLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpPC94c2w6YXR0cmlidXRlPg0KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+DQorICAgICAgICAgICAgPGgyPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L2gyPg0KKw0KKyAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPg0KKwkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIj4NCisJCSAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvdy5jbGFzcyIgc2VsZWN0PSIneWVzJyIvPg0KKwkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCisJCTwhLS0NCisgICAgICAgICAgICAgICAgdGVzdCBjYW4gZXZlbiBub3QgYmUgc3RhcnRlZCBhdCBhbGwgKGZhaWx1cmUgdG8gbG9hZCB0aGUgY2xhc3MpDQorCQlzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5DQorCQktLT4NCisgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iLi9lcnJvciI+DQorICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRXJyb3IiPg0KKyAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPg0KKyAgICAgICAgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgICAgICAgIDwvdHI+DQorICAgICAgICAgICAgICA8L3hzbDppZj4NCisgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnZmFpbHMnIj4NCisgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL3Rlc3RjYXNlW2ZhaWx1cmVdIiBtb2RlPSJwcmludC50ZXN0Ij4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93LmNsYXNzIiBzZWxlY3Q9Iid5ZXMnIi8+DQorICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPg0KKyAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnZXJyb3JzJyI+DQorICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLy90ZXN0Y2FzZVtlcnJvcl0iIG1vZGU9InByaW50LnRlc3QiPg0KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJ3llcyciLz4NCisgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+DQorICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQorICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KKyAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vdGVzdGNhc2UiIG1vZGU9InByaW50LnRlc3QiPg0KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJ3llcyciLz4NCisgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+DQorICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCisgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCisgICAgICAgICAgICA8L3RhYmxlPg0KKyAgICAgICAgPC9ib2R5Pg0KKyAgICA8L2h0bWw+DQorPC94c2w6dGVtcGxhdGU+DQorDQorDQorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICAgIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGZvciBldmVyeSB0ZXN0c3VpdGUgY2xhc3MuDQorICAgIEl0IHByaW50cyBhIHN1bW1hcnkgb2YgdGhlIHRlc3RzdWl0ZSBhbmQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQNCisgICAgdGVzdGNhc2UgbWV0aG9kcy4NCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4NCisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidhbGwnIi8+DQorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+DQorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2xhc3MubmFtZSI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICcnKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4uPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+DQorICAgIDxodG1sPg0KKyAgICAgICAgPGhlYWQ+DQorICAgICAgICAgIDx0aXRsZT5Vbml0IFRlc3QgUmVzdWx0czogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzcy5uYW1lIi8+PC90aXRsZT4NCisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+DQorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPg0KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQorICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+DQorICAgICAgICB2YXIgVGVzdENhc2VzID0gbmV3IEFycmF5KCk7DQorICAgICAgICB2YXIgY3VyOw0KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9wZXJ0aWVzIi8+DQorICAgICAgIDwvc2NyaXB0Pg0KKyAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhW0NEQVRBWw0KKyAgICAgICAgZnVuY3Rpb24gZGlzcGxheVByb3BlcnRpZXMgKG5hbWUpIHsNCisgICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdy5vcGVuKCcnLCdKVW5pdFN5c3RlbVByb3BlcnRpZXMnLCdzY3JvbGxiYXJzPTEscmVzaXphYmxlPTEnKTsNCisgICAgICAgICAgdmFyIGRvYyA9IHdpbi5kb2N1bWVudDsNCisgICAgICAgICAgZG9jLm9wZW4oKTsNCisgICAgICAgICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48dGl0bGU+UHJvcGVydGllcyBvZiAiICsgbmFtZSArICI8L3RpdGxlPiIpOw0KKyAgICAgICAgICBkb2Mud3JpdGUoIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4iKTsNCisgICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7IGNvbG9yOiMwMDAwMDA7IH0iKTsNCisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZSB0ciB0ZCwgdGFibGUgdHIgdGggeyBmb250LXNpemU6IDY4JTsgfSIpOw0KKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlLnByb3BlcnRpZXMgeyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IGJvcmRlci1sZWZ0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLXRvcDpzb2xpZCAxICNjY2NjY2M7IHBhZGRpbmc6NXB4OyB9Iik7DQorICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOw0KKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlLnByb3BlcnRpZXMgdGQgeyBmb250Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyBib3JkZXItcmlnaHQ6c29saWQgMSAjY2NjY2NjOyBib3JkZXItYm90dG9tOnNvbGlkIDEgI2NjY2NjYzsgYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmZjsgfSIpOw0KKyAgICAgICAgICBkb2Mud3JpdGUoImgzIHsgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYSB9Iik7DQorICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsNCisgICAgICAgICAgZG9jLndyaXRlKCI8L2hlYWQ+PGJvZHk+Iik7DQorICAgICAgICAgIGRvYy53cml0ZSgiPGgzPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC9oMz4iKTsNCisgICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsNCisgICAgICAgICAgZG9jLndyaXRlKCI8dGFibGUgY2xhc3M9J3Byb3BlcnRpZXMnPiIpOw0KKyAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+TmFtZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIpOw0KKyAgICAgICAgICBmb3IgKHByb3AgaW4gVGVzdENhc2VzW25hbWVdKSB7DQorICAgICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPiIgKyBwcm9wICsgIjwvdGg+PHRkPiIgKyBUZXN0Q2FzZXNbbmFtZV1bcHJvcF0gKyAiPC90ZD48L3RyPiIpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGRvYy53cml0ZSgiPC90YWJsZT4iKTsNCisgICAgICAgICAgZG9jLndyaXRlKCI8L2JvZHk+PC9odG1sPiIpOw0KKyAgICAgICAgICBkb2MuY2xvc2UoKTsNCisgICAgICAgICAgd2luLmZvY3VzKCk7DQorICAgICAgICB9DQorICAgICAgXV0+DQorICAgICAgPC9zY3JpcHQ+DQorICAgICAgICA8L2hlYWQ+DQorICAgICAgICA8Ym9keT4NCisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPg0KKyAgICAgICAgICAgIDxoMz5DbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNsYXNzLm5hbWUiLz48L2gzPg0KKw0KKw0KKyAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPg0KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+DQorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQudGVzdCIvPg0KKyAgICAgICAgICAgIDwvdGFibGU+DQorDQorCSAgICA8eHNsOmNob29zZT4NCisJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdmYWlscyciPg0KKwkJICAgIDxoMj5GYWlsdXJlczwvaDI+DQorCQk8L3hzbDp3aGVuPg0KKwkJPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2Vycm9ycyciPg0KKwkJICAgIDxoMj5FcnJvcnM8L2gyPg0KKwkJPC94c2w6d2hlbj4NCisJCTx4c2w6b3RoZXJ3aXNlPg0KKwkJICAgIDxoMj5UZXN0czwvaDI+DQorCQk8L3hzbDpvdGhlcndpc2U+DQorCSAgICA8L3hzbDpjaG9vc2U+DQorICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+DQorCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiLz4NCisJCTwhLS0NCisgICAgICAgICAgICAgICAgdGVzdCBjYW4gZXZlbiBub3QgYmUgc3RhcnRlZCBhdCBhbGwgKGZhaWx1cmUgdG8gbG9hZCB0aGUgY2xhc3MpDQorCQlzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5DQorCQktLT4NCisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIuL2Vycm9yIj4NCisgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRXJyb3IiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vZXJyb3IiLz48L3RkPg0KKyAgICAgICAgICAgICAgICAgICAgPC90cj4NCisgICAgICAgICAgICAgICAgPC94c2w6aWY+DQorCQk8eHNsOmNob29zZT4NCisJCSAgICA8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnZmFpbHMnIj4NCisJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2VbZmFpbHVyZV0iIG1vZGU9InByaW50LnRlc3QiLz4NCisJCSAgICA8L3hzbDp3aGVuPg0KKwkJICAgIDx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdlcnJvcnMnIj4NCisJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2VbZXJyb3JdIiBtb2RlPSJwcmludC50ZXN0Ii8+DQorCQkgICAgPC94c2w6d2hlbj4NCisJCSAgICA8eHNsOm90aGVyd2lzZT4NCisJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2UiIG1vZGU9InByaW50LnRlc3QiLz4NCisJCSAgICA8L3hzbDpvdGhlcndpc2U+DQorCQk8L3hzbDpjaG9vc2U+DQorICAgICAgICAgICAgPC90YWJsZT4NCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcm9wZXJ0aWVzIj4NCisgICAgICAgICAgICAgICAgPGE+DQorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5qYXZhc2NyaXB0OmRpc3BsYXlQcm9wZXJ0aWVzKCc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Jyk7PC94c2w6YXR0cmlidXRlPg0KKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyAmIzE4NzsNCisgICAgICAgICAgICAgICAgPC9hPg0KKyAgICAgICAgICAgIDwvZGl2Pg0KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1vdXQpIT0wIj4NCisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+DQorICAgICAgICAgICAgICAgICAgICA8YT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LW91dC50eHQ8L3hzbDphdHRyaWJ1dGU+DQorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dCAmIzE4NzsNCisgICAgICAgICAgICAgICAgICAgIDwvYT4NCisgICAgICAgICAgICAgICAgPC9kaXY+DQorICAgICAgICAgICAgPC94c2w6aWY+DQorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLWVycikhPTAiPg0KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcm9wZXJ0aWVzIj4NCisgICAgICAgICAgICAgICAgICAgIDxhPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4tZXJyLnR4dDwveHNsOmF0dHJpYnV0ZT4NCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyICYjMTg3Ow0KKyAgICAgICAgICAgICAgICAgICAgPC9hPg0KKyAgICAgICAgICAgICAgICA8L2Rpdj4NCisgICAgICAgICAgICA8L3hzbDppZj4NCisgICAgICAgIDwvYm9keT4NCisgICAgPC9odG1sPg0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKyAgPCEtLQ0KKyAgIFdyaXRlIHByb3BlcnRpZXMgaW50byBhIEphdmFTY3JpcHQgZGF0YSBzdHJ1Y3R1cmUuDQorICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaWRlYSBieSBFcmlrIEhhdGNoZXIgKGVoYXRjaGVyQGFwYWNoZS5vcmcpDQorICAgLS0+DQorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9wZXJ0aWVzIj4NCisgICAgY3VyID0gVGVzdENhc2VzWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+J10gPSBuZXcgQXJyYXkoKTsNCisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4NCisgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4NCisgICAgICAgIGN1clsnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+J10gPSAnPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJAdmFsdWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPic7DQorICAgIDwveHNsOmZvci1lYWNoPg0KKyAgPC94c2w6dGVtcGxhdGU+DQorDQorDQorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICAgIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGZvciBldmVyeSBwYWNrYWdlLg0KKyAgICBJdCBwcmludHMgdGhlIG5hbWUgb2YgYWxsIGNsYXNzZXMgdGhhdCBiZWxvbmdzIHRvIHRoaXMgcGFja2FnZS4NCisgICAgQHBhcmFtIG5hbWUgdGhlIHBhY2thZ2UgbmFtZSB0byBwcmludCBjbGFzc2VzLg0KKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCis8IS0tIGxpc3Qgb2YgY2xhc3NlcyBpbiBhIHBhY2thZ2UgLS0+DQorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzLmxpc3QiPg0KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4NCisgICAgPGh0bWw+DQorICAgICAgICA8aGVhZD4NCisgICAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IENsYXNzZXM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvdGl0bGU+DQorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPg0KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRuYW1lIi8+DQorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCisgICAgICAgIDwvaGVhZD4NCisgICAgICAgIDxib2R5Pg0KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+DQorICAgICAgICAgICAgICAgIDx0cj4NCisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbmFtZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L2E+PC9oMj4NCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgICAgICAgIDwvdHI+DQorICAgICAgICAgICAgPC90YWJsZT4NCisNCisgICAgICAgICAgICA8aDI+Q2xhc3NlczwvaDI+DQorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4NCisgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gJG5hbWVdIj4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+DQorICAgICAgICAgICAgICAgICAgICA8dHI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0BpZH1fe0BuYW1lfS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPg0KKyAgICAgICAgICAgICAgICAgICAgPC90cj4NCisgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQorICAgICAgICAgICAgPC90YWJsZT4NCisgICAgICAgIDwvYm9keT4NCisgICAgPC9odG1sPg0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKw0KKzwhLS0NCisgICAgQ3JlYXRlcyBhbiBhbGwtY2xhc3Nlcy5odG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sDQorICAgIG9uIGVhY2ggY2xhc3MuDQorLS0+DQorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0iYWxsLmNsYXNzZXMiPg0KKyAgICA8aHRtbD4NCisgICAgICAgIDxoZWFkPg0KKyAgICAgICAgICAgIDx0aXRsZT5BbGwgVW5pdCBUZXN0IENsYXNzZXM8L3RpdGxlPg0KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4NCisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPg0KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQorICAgICAgICA8L2hlYWQ+DQorICAgICAgICA8Ym9keT4NCisgICAgICAgICAgICA8aDI+Q2xhc3NlczwvaDI+DQorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4NCisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+DQorICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4NCisgICAgICAgICAgICA8L3RhYmxlPg0KKyAgICAgICAgPC9ib2R5Pg0KKyAgICA8L2h0bWw+DQorPC94c2w6dGVtcGxhdGU+DQorDQorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJhbGwuY2xhc3NlcyI+DQorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+DQorICAgIDx0cj4NCisgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+DQorICAgICAgICAgICAgPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4NCisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+DQorICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lPScnKSI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0Pg0KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0Pg0KKyAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+DQorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KKyAgICAgICAgICAgIDwvYT4NCisgICAgICAgIDwvdGQ+DQorICAgIDwvdHI+DQorPC94c2w6dGVtcGxhdGU+DQorDQorDQorPCEtLQ0KKyAgICBDcmVhdGVzIGFuIGh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgZmlsZXMgb24NCisgICAgZWFjaCBwYWNrYWdlIGV4aXN0aW5nIG9uIHRlc3RzdWl0ZXMuDQorICAgIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KA0KKy0tPg0KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9ImFsbC5wYWNrYWdlcyI+DQorICAgIDxodG1sPg0KKyAgICAgICAgPGhlYWQ+DQorICAgICAgICAgICAgPHRpdGxlPkFsbCBVbml0IFRlc3QgUGFja2FnZXM8L3RpdGxlPg0KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4NCisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPg0KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQorICAgICAgICA8L2hlYWQ+DQorICAgICAgICA8Ym9keT4NCisgICAgICAgICAgICA8aDI+PGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkhvbWU8L2E+PC9oMj4NCisgICAgICAgICAgICA8aDI+UGFja2FnZXM8L2gyPg0KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+DQorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIiBtb2RlPSJhbGwucGFja2FnZXMiPg0KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4NCisgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPg0KKyAgICAgICAgICAgIDwvdGFibGU+DQorICAgICAgICA8L2JvZHk+DQorICAgIDwvaHRtbD4NCis8L3hzbDp0ZW1wbGF0ZT4NCisNCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5wYWNrYWdlcyI+DQorICAgIDx0cj4NCisgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+DQorICAgICAgICAgICAgPGEgaHJlZj0iLi97dHJhbnNsYXRlKEBwYWNrYWdlLCcuJywnLycpfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4NCisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+DQorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHBhY2thZ2UgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+DQorICAgICAgICAgICAgPC9hPg0KKyAgICAgICAgPC90ZD4NCisgICAgPC90cj4NCis8L3hzbDp0ZW1wbGF0ZT4NCisNCisNCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyI+DQorICAgIDxodG1sPg0KKyAgICAgICAgPGhlYWQ+DQorICAgICAgICAgICAgPHRpdGxlPlVuaXQgVGVzdCBSZXN1bHRzOiBTdW1tYXJ5PC90aXRsZT4NCisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+DQorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4NCisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KKyAgICAgICAgPC9oZWFkPg0KKyAgICAgICAgPGJvZHk+DQorICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ2FsbGNsYXNzZXMtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+DQorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPg0KKyAgICAgICAgPGgyPlN1bW1hcnk8L2gyPg0KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Q291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGVzdHMpIi8+DQorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZXJyb3JzKSIvPg0KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZmFpbHVyZXMpIi8+DQorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpbWVDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0B0aW1lKSIvPg0KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWNjZXNzUmF0ZSIgc2VsZWN0PSIoJHRlc3RDb3VudCAtICRmYWlsdXJlQ291bnQgLSAkZXJyb3JDb3VudCkgZGl2ICR0ZXN0Q291bnQiLz4NCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPg0KKyAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4NCisgICAgICAgICAgICA8dGg+VGVzdHM8L3RoPg0KKyAgICAgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+DQorICAgICAgICAgICAgPHRoPkVycm9yczwvdGg+DQorICAgICAgICAgICAgPHRoPlN1Y2Nlc3MgcmF0ZTwvdGg+DQorICAgICAgICAgICAgPHRoPlRpbWU8L3RoPg0KKyAgICAgICAgPC90cj4NCisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+DQorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPg0KKyAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXJyb3JDb3VudCAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+DQorICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5QYXNzPC94c2w6b3RoZXJ3aXNlPg0KKyAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQorICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPg0KKyAgICAgICAgICAgIDx0ZD48YSB0aXRsZT0iRGlzcGxheSBhbGwgdGVzdHMiIGhyZWY9ImFsbC10ZXN0cy5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlc3RDb3VudCIvPjwvYT48L3RkPg0KKyAgICAgICAgICAgIDx0ZD48YSB0aXRsZT0iRGlzcGxheSBhbGwgZmFpbHVyZXMiIGhyZWY9ImFsbHRlc3RzLWZhaWxzLmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmFpbHVyZUNvdW50Ii8+PC9hPjwvdGQ+DQorICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJEaXNwbGF5IGFsbCBlcnJvcnMiIGhyZWY9ImFsbHRlc3RzLWVycm9ycy5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L2E+PC90ZD4NCisgICAgICAgICAgICA8dGQ+DQorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPg0KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPg0KKyAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KKyAgICAgICAgICAgIDwvdGQ+DQorICAgICAgICAgICAgPHRkPg0KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkdGltZUNvdW50Ii8+DQorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQorICAgICAgICAgICAgPC90ZD4NCisgICAgICAgIDwvdHI+DQorICAgICAgICA8L3RhYmxlPg0KKyAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9Ijk1JSI+DQorICAgICAgICA8dHI+DQorICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4NCisgICAgICAgIE5vdGU6IDxlbT5mYWlsdXJlczwvZW0+IGFyZSBhbnRpY2lwYXRlZCBhbmQgY2hlY2tlZCBmb3Igd2l0aCBhc3NlcnRpb25zIHdoaWxlIDxlbT5lcnJvcnM8L2VtPiBhcmUgdW5hbnRpY2lwYXRlZC4NCisgICAgICAgIDwvdGQ+DQorICAgICAgICA8L3RyPg0KKyAgICAgICAgPC90YWJsZT4NCisNCisgICAgICAgIDxoMj5QYWNrYWdlczwvaDI+DQorICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4NCisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+DQorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+DQorICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIiBvcmRlcj0iYXNjZW5kaW5nIi8+DQorICAgICAgICAgICAgICAgIDwhLS0gZ2V0IHRoZSBub2RlIHNldCBjb250YWluaW5nIGFsbCB0ZXN0c3VpdGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBwYWNrYWdlIC0tPg0KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imluc2FtZXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIi8+DQorICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+DQorICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXkgYSBmYWlsdXJlIGlmIHRoZXJlIGlzIGFueSBmYWlsdXJlL2Vycm9yIGluIHRoZSBwYWNrYWdlIC0tPg0KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BlcnJvcnMpICZndDsgMCI+RXJyb3I8L3hzbDp3aGVuPg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BmYWlsdXJlcykgJmd0OyAwIj5GYWlsdXJlPC94c2w6d2hlbj4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4NCisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQorICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+DQorICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iLi97dHJhbnNsYXRlKEBwYWNrYWdlLCcuJywnLycpfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+DQorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcGFja2FnZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4NCisgICAgICAgICAgICAgICAgICAgIDwvYT48L3RkPg0KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQHRlc3RzKSIvPjwvdGQ+DQorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZXJyb3JzKSIvPjwvdGQ+DQorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZmFpbHVyZXMpIi8+PC90ZD4NCisgICAgICAgICAgICAgICAgICAgIDx0ZD4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQHRpbWUpIi8+DQorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4NCisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluc2FtZXBhY2thZ2UvQHRpbWVzdGFtcCIvPjwvdGQ+DQorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnNhbWVwYWNrYWdlL0Bob3N0bmFtZSIvPjwvdGQ+DQorICAgICAgICAgICAgICAgIDwvdHI+DQorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQorICAgICAgICA8L3RhYmxlPg0KKyAgICAgICAgPC9ib2R5Pg0KKyAgICAgICAgPC9odG1sPg0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKw0KKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4NCisgICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+DQorICAgIDxodG1sPg0KKyAgICAgICAgPGhlYWQ+DQorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPg0KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRuYW1lIi8+DQorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCisgICAgICAgIDwvaGVhZD4NCisgICAgICAgIDxib2R5Pg0KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbigncGFja2FnZS1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPg0KKyAgICAgICAgICAgIDxoMz5QYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvaDM+DQorDQorICAgICAgICAgICAgPCEtLXRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4NCisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzLm1ldHJpY3MuaGVhZGVyIi8+DQorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQubWV0cmljcyIvPg0KKyAgICAgICAgICAgIDwvdGFibGUtLT4NCisNCisgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imluc2FtZXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iLz4NCisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRpbnNhbWVwYWNrYWdlKSAmZ3Q7IDAiPg0KKyAgICAgICAgICAgICAgICA8aDI+Q2xhc3NlczwvaDI+DQorICAgICAgICAgICAgICAgIDxwPg0KKyAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiLz4NCisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGluc2FtZXBhY2thZ2UiIG1vZGU9InByaW50LnRlc3QiPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+DQorICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+DQorICAgICAgICAgICAgICAgIDwvdGFibGU+DQorICAgICAgICAgICAgICAgIDwvcD4NCisgICAgICAgICAgICA8L3hzbDppZj4NCisgICAgICAgIDwvYm9keT4NCisgICAgPC9odG1sPg0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKw0KKzwhLS0NCisgICAgdHJhbnNmb3JtIHN0cmluZyBsaWtlIGEuYi5jIHRvIC4uLy4uLy4uLw0KKyAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgNCistLT4NCis8eHNsOnRlbXBsYXRlIG5hbWU9InBhdGgiPg0KKyAgICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4NCisgICAgPHhzbDppZiB0ZXN0PSJjb250YWlucygkcGF0aCwnLicpIj4NCisgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0Pg0KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPg0KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRwYXRoLCcuJykiLz48L3hzbDp3aXRoLXBhcmFtPg0KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCisgICAgPC94c2w6aWY+DQorICAgIDx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKCRwYXRoLCcuJykpIGFuZCBub3QoJHBhdGggPSAnJykiPg0KKyAgICAgICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+DQorICAgIDwveHNsOmlmPg0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKw0KKzwhLS0gY3JlYXRlIHRoZSBsaW5rIHRvIHRoZSBzdHlsZXNoZWV0IGJhc2VkIG9uIHRoZSBwYWNrYWdlIG5hbWUgLS0+DQorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4NCisgICAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4NCisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgdGl0bGU9IlN0eWxlIj48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOmlmIHRlc3Q9Im5vdCgkcGFja2FnZS5uYW1lID0gJ3VubmFtZWQgcGFja2FnZScpIj48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGF0aCI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPjwveHNsOmNhbGwtdGVtcGxhdGU+PC94c2w6aWY+c3R5bGVzaGVldC5jc3M8L3hzbDphdHRyaWJ1dGU+PC9saW5rPg0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKw0KKzwhLS0gUGFnZSBIRUFERVIgLS0+DQorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4NCisgICAgPGgxPlVuaXQgVGVzdCBSZXN1bHRzPC9oMT4NCisgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4NCisgICAgPHRyPg0KKyAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48L3RkPg0KKyAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnLyI+SlVuaXQ8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BbnQ8L2E+LjwvdGQ+DQorICAgIDwvdHI+DQorICAgIDwvdGFibGU+DQorICAgIDxociBzaXplPSIxIi8+DQorPC94c2w6dGVtcGxhdGU+DQorDQorICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIj4NCisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+DQorICAgICAgICAgICAgPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPg0KKyAgICAgICAgICAgIDx0aD5UZXN0czwvdGg+DQorICAgICAgICAgICAgPHRoPkVycm9yczwvdGg+DQorICAgICAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4NCisgICAgICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPg0KKyAgICAgICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZSBTdGFtcDwvdGg+DQorICAgICAgICAgICAgPHRoPkhvc3Q8L3RoPg0KKyAgICAgICAgPC90cj4NCisgICAgPC94c2w6dGVtcGxhdGU+DQorPCEtLSBtZXRob2QgaGVhZGVyIC0tPg0KKzx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiPg0KKyAgICA8eHNsOnBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJyciLz4NCisgICAgPHRyIHZhbGlnbj0idG9wIj4NCisJPHhzbDppZiB0ZXN0PSJib29sZWFuKCRzaG93LmNsYXNzKSI+DQorCSAgICA8dGg+Q2xhc3M8L3RoPg0KKwk8L3hzbDppZj4NCisgICAgICAgIDx0aD5OYW1lPC90aD4NCisgICAgICAgIDx0aD5TdGF0dXM8L3RoPg0KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPlR5cGU8L3RoPg0KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4NCisgICAgPC90cj4NCis8L3hzbDp0ZW1wbGF0ZT4NCisNCisNCis8IS0tIGNsYXNzIGluZm9ybWF0aW9uIC0tPg0KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0icHJpbnQudGVzdCI+DQorICAgIDx0ciB2YWxpZ249InRvcCI+DQorICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+DQorICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZXJyb3JzWy4mZ3Q7IDBdIj5FcnJvcjwveHNsOndoZW4+DQorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZmFpbHVyZXNbLiZndDsgMF0iPkZhaWx1cmU8L3hzbDp3aGVuPg0KKyAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5QYXNzPC94c2w6b3RoZXJ3aXNlPg0KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4NCisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4NCisgICAgICAgIDx0ZD48YSB0aXRsZT0iRGlzcGxheSBhbGwgdGVzdHMiIGhyZWY9IntAaWR9X3tAbmFtZX0uaHRtbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvdGQ+DQorICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIHRlc3RzIiBocmVmPSJ7QGlkfV97QG5hbWV9Lmh0bWwiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRlc3RzIi8+PC9hPjwvdGQ+DQorICAgICAgICA8dGQ+DQorCSAgICA8eHNsOmNob29zZT4NCisJCTx4c2w6d2hlbiB0ZXN0PSJAZXJyb3JzICE9IDAiPg0KKwkJICAgIDxhIHRpdGxlPSJEaXNwbGF5IG9ubHkgZXJyb3JzIiBocmVmPSJ7QGlkfV97QG5hbWV9LWVycm9ycy5odG1sIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBlcnJvcnMiLz48L2E+DQorCQk8L3hzbDp3aGVuPg0KKwkJPHhzbDpvdGhlcndpc2U+DQorCQkgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZXJyb3JzIi8+DQorCQk8L3hzbDpvdGhlcndpc2U+DQorCSAgICA8L3hzbDpjaG9vc2U+DQorCTwvdGQ+DQorICAgICAgICA8dGQ+DQorCSAgICA8eHNsOmNob29zZT4NCisJCTx4c2w6d2hlbiB0ZXN0PSJAZmFpbHVyZXMgIT0gMCI+DQorCQkgICAgPGEgdGl0bGU9IkRpc3BsYXkgb25seSBmYWlsdXJlcyIgaHJlZj0ie0BpZH1fe0BuYW1lfS1mYWlscy5odG1sIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYWlsdXJlcyIvPjwvYT4NCisJCTwveHNsOndoZW4+DQorCQk8eHNsOm90aGVyd2lzZT4NCisJCSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYWlsdXJlcyIvPg0KKwkJPC94c2w6b3RoZXJ3aXNlPg0KKwkgICAgPC94c2w6Y2hvb3NlPg0KKwk8L3RkPg0KKyAgICAgICAgPHRkPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPg0KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4NCisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KKyAgICAgICAgPC90ZD4NCisgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB0aW1lc3RhbXAiLz48L3RkPg0KKyAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGhvc3RuYW1lIi8+PC90ZD4NCisgICAgPC90cj4NCis8L3hzbDp0ZW1wbGF0ZT4NCisNCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+DQorICAgIDx4c2w6cGFyYW0gbmFtZT0ic2hvdy5jbGFzcyIgc2VsZWN0PSInJyIvPg0KKyAgICA8dHIgdmFsaWduPSJ0b3AiPg0KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPg0KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPkVycm9yPC94c2w6d2hlbj4NCisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPkZhaWx1cmU8L3hzbDp3aGVuPg0KKyAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5UYWJsZVJvd0NvbG9yPC94c2w6b3RoZXJ3aXNlPg0KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4NCisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4NCisJPHhzbDp2YXJpYWJsZSBuYW1lPSJjbGFzcy5ocmVmIj4NCisJICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQodHJhbnNsYXRlKC4uL0BwYWNrYWdlLCcuJywnLycpLCAnLycsIC4uL0BpZCwgJ18nLCAuLi9AbmFtZSwgJy5odG1sJykiLz4NCisJPC94c2w6dmFyaWFibGU+DQorCTx4c2w6aWYgdGVzdD0iYm9vbGVhbigkc2hvdy5jbGFzcykiPg0KKwkgICAgPHRkPjxhIGhyZWY9InskY2xhc3MuaHJlZn0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIvPjwvYT48L3RkPg0KKwk8L3hzbDppZj4NCisgICAgICAgIDx0ZD4NCisJICAgIDxhIG5hbWU9IntAbmFtZX0iLz4NCisJICAgIDx4c2w6Y2hvb3NlPg0KKwkJPHhzbDp3aGVuIHRlc3Q9ImJvb2xlYW4oJHNob3cuY2xhc3MpIj4NCisJCSAgICA8YSBocmVmPSJ7Y29uY2F0KCRjbGFzcy5ocmVmLCAnIycsIEBuYW1lKX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4NCisJCTwveHNsOndoZW4+DQorCQk8eHNsOm90aGVyd2lzZT4NCisJCSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCisJCTwveHNsOm90aGVyd2lzZT4NCisJICAgIDwveHNsOmNob29zZT4NCisJPC90ZD4NCisgICAgICAgIDx4c2w6Y2hvb3NlPg0KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlIj4NCisgICAgICAgICAgICAgICAgPHRkPkZhaWx1cmU8L3RkPg0KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlIi8+PC90ZD4NCisgICAgICAgICAgICA8L3hzbDp3aGVuPg0KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJlcnJvciI+DQorICAgICAgICAgICAgICAgIDx0ZD5FcnJvcjwvdGQ+DQorICAgICAgICAgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImVycm9yIi8+PC90ZD4NCisgICAgICAgICAgICA8L3hzbDp3aGVuPg0KKyAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KKyAgICAgICAgICAgICAgICA8dGQ+U3VjY2VzczwvdGQ+DQorICAgICAgICAgICAgICAgIDx0ZD48L3RkPg0KKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCisgICAgICAgIDwveHNsOmNob29zZT4NCisgICAgICAgIDx0ZD4NCisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4NCisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IkB0aW1lIi8+DQorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCisgICAgICAgIDwvdGQ+DQorICAgIDwvdHI+DQorPC94c2w6dGVtcGxhdGU+DQorDQorDQorPCEtLSBOb3RlIDogdGhlIGJlbG93IHRlbXBsYXRlIGVycm9yIGFuZCBmYWlsdXJlIGFyZSB0aGUgc2FtZSBzdHlsZQ0KKyAgICAgICAgICAgIHNvIGp1c3QgY2FsbCB0aGUgc2FtZSBzdHlsZSBzdG9yZSBpbiB0aGUgdG9vbGtpdCB0ZW1wbGF0ZSAtLT4NCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJmYWlsdXJlIj4NCisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiLz4NCis8L3hzbDp0ZW1wbGF0ZT4NCisNCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJlcnJvciI+DQorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+DQorPC94c2w6dGVtcGxhdGU+DQorDQorPCEtLSBTdHlsZSBmb3IgdGhlIGVycm9yIGFuZCBmYWlsdXJlIGluIHRoZSB0ZXN0Y2FzZSB0ZW1wbGF0ZSAtLT4NCis8eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiPg0KKyAgICA8eHNsOmNob29zZT4NCisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQG1lc3NhZ2UpIj5OL0E8L3hzbDp3aGVuPg0KKyAgICAgICAgPHhzbDpvdGhlcndpc2U+DQorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXNzYWdlIi8+DQorICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQorICAgIDwveHNsOmNob29zZT4NCisgICAgPCEtLSBkaXNwbGF5IHRoZSBzdGFja3RyYWNlIC0tPg0KKyAgICA8YnIvPjxici8+DQorICAgIDxjb2RlPg0KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPg0KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9Ii4iLz4NCisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQorICAgIDwvY29kZT4NCisgICAgPCEtLSB0aGUgbGF0dGVyIGlzIGJldHRlciBidXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgZm9yIG5vbi0yMSIgbW9uaXRvcnMuLi4gLS0+DQorICAgIDwhLS1wcmU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L3ByZS0tPg0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKzx4c2w6dGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj4NCisgICAgPHhzbDpwYXJhbSBuYW1lPSJzdHJpbmciLz4NCisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAxIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCRzdHJpbmcpLCdcJywnXFwnKSIvPg0KKyAgICA8eHNsOnBhcmFtIG5hbWU9InRtcDIiIHNlbGVjdD0ic3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHRtcDEpLCZxdW90OycmcXVvdDssJnF1b3Q7XCZhcG9zOyZxdW90OykiLz4NCisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0bXAyIi8+DQorPC94c2w6dGVtcGxhdGU+DQorDQorDQorPCEtLQ0KKyAgICB0ZW1wbGF0ZSB0aGF0IHdpbGwgY29udmVydCBhIGNhcnJpYWdlIHJldHVybiBpbnRvIGEgYnIgdGFnDQorICAgIEBwYXJhbSB3b3JkIHRoZSB0ZXh0IGZyb20gd2hpY2ggdG8gY29udmVydCBDUiB0byBCUiB0YWcNCistLT4NCis8eHNsOnRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPg0KKyAgICA8eHNsOnBhcmFtIG5hbWU9IndvcmQiLz4NCisgICAgPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9J3N0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCR3b3JkKSwiJiN4QTsiLCImbHQ7YnIvPiIpJy8+DQorPC94c2w6dGVtcGxhdGU+DQorDQorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPg0KKyAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+DQorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCR2YWx1ZSwnMC4wMDAnKSIvPg0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4NCisgICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPg0KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAlJykiLz4NCis8L3hzbDp0ZW1wbGF0ZT4NCisNCisNCis8L3hzbDpzdHlsZXNoZWV0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LXdpdGgtaW5jbHVkZS9qdW5pdC1pbXBvcnQueHNsIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQtd2l0aC1pbmNsdWRlL2p1bml0LWltcG9ydC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3MDlkZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LXdpdGgtaW5jbHVkZS9qdW5pdC1pbXBvcnQueHNsCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiDQorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCINCisgICAgeG1sbnM6cmVkaXJlY3Q9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9yZWRpcmVjdCINCisgICAgeG1sbnM6c3RyaW5ndXRpbHM9InhhbGFuOi8vb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlscyINCisgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4NCisgICAgPCEtLQ0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAgICAgLS0+DQorICAgIDwhLS0gY2xhc3MgaGVhZGVyIC0tPg0KKzwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTIxZDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC54bWwKQEAgLTAsMCArMSwxODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ianVuaXRyZXBvcnQtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0icmVwb3J0cyI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ianJkaXIiIGxvY2F0aW9uPSJqdW5pdHJlcG9ydCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXRkaXIiIGxvY2F0aW9uPSIke2pyZGlyfS90ZXN0Ii8+CisKKyAgICA8IS0tIHJlcG9ydHMxIHRha2UgY2FyZSBvZiB0cmFuc2Zvcm1hdGlvbiBvZiAyIHRlc3QgcmVzdWx0IGZpbGVzIGFuZAorICAgICAgICAgcHJvZHVjZSByZXBvcnRzIGFjY29yZGluZyB0byB0aGUgZGVmYXVsdCBmb3JtYXQgKGZyYW1lcykKKyAgICAgICAgIG5lZWRlZCBmb3IgdGVzdE5vRmlsZUp1bml0Tm9GcmFtZXMgLS0+CisgICAgPHRhcmdldCBuYW1lPSJyZXBvcnRzMSI+CisgICAgICAgIDxta2RpciBkaXI9IiR7b3V0cHV0ZGlyfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dGRpcn0vaHRtbCIvPgorICAgICAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7anJkaXJ9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJURVNULSoueG1sIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8cmVwb3J0IHRvZGlyPSIke291dHB1dGRpcn0vaHRtbCIvPgorICAgICAgICA8L2p1bml0cmVwb3J0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0RW1wdHlGaWxlIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXRkaXJ9L2h0bWwiLz4KKyAgICAgICAgPGp1bml0cmVwb3J0IHRvZGlyPSIke291dHB1dGRpcn0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2pyZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iWkVST0JZVEVTLSoueG1sIi8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iVEVTVC0qLnhtbCIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPHJlcG9ydCB0b2Rpcj0iJHtvdXRwdXRkaXJ9L2h0bWwiLz4KKyAgICAgICAgPC9qdW5pdHJlcG9ydD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdEluY29tcGxldGVGaWxlIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXRkaXJ9L2h0bWwiLz4KKyAgICAgICAgPGp1bml0cmVwb3J0IHRvZGlyPSIke291dHB1dGRpcn0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2pyZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iSU5DT01QTEVURS0qLnhtbCIvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfS9odG1sIi8+CisgICAgICAgIDwvanVuaXRyZXBvcnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RXcm9uZ0VsZW1lbnQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dGRpcn0vaHRtbCIvPgorICAgICAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7anJkaXJ9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJXUk9OR0VMRU1FTlQtKi54bWwiLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJURVNULSoueG1sIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8cmVwb3J0IHRvZGlyPSIke291dHB1dGRpcn0vaHRtbCIvPgorICAgICAgICA8L2p1bml0cmVwb3J0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0TmFtZXNwYWNlIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXRkaXJ9L2h0bWwiLz4KKyAgICAgICAgPGp1bml0cmVwb3J0IHRvZGlyPSIke291dHB1dGRpcn0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2pyZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTkFNRVNQQUNFLSoueG1sIi8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iVEVTVC0qLnhtbCIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPHJlcG9ydCB0b2Rpcj0iJHtvdXRwdXRkaXJ9L2h0bWwiLz4KKyAgICAgICAgPC9qdW5pdHJlcG9ydD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtvdXRwdXRkaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RTdGFja1RyYWNlTGluZUJyZWFrcyI+CisgICAgICAgIDxta2RpciBkaXI9IiR7b3V0cHV0ZGlyfS9odG1sIi8+CisgICAgICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHtvdXRwdXRkaXJ9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqcmRpcn0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfS9odG1sIi8+CisgICAgICAgIDwvanVuaXRyZXBvcnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RTcGVjaWFsU2lnbnNJblNyY1BhdGgiPgorICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dGRpcn0vaHRtbCIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dGRpcn0vdGVzdCMgJCQlpyZhbXA7LSFjYXNlcyIvPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHtvdXRwdXRkaXJ9L3Rlc3QjICQkJacmYW1wOy0hY2FzZXMiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJqdW5pdHJlcG9ydCIgaW5jbHVkZXM9IlRFU1QtKi54bWwiLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfS9odG1sIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtvdXRwdXRkaXJ9L3Rlc3QjICQkJacmYW1wOy0hY2FzZXMiPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfS9odG1sIi8+CisgICAgICAgIDwvanVuaXRyZXBvcnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RTcGVjaWFsU2lnbnNJbkh0bWxQYXRoIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXRkaXJ9L2h0bWwjICQkJacmYW1wOy0hcmVwb3J0Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7b3V0cHV0ZGlyfS90ZXN0Ii8+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke291dHB1dGRpcn0vdGVzdCI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Imp1bml0cmVwb3J0IiBpbmNsdWRlcz0iVEVTVC0qLnhtbCIvPgorICAgICAgICA8L2NvcHk+CisgICAgICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHtvdXRwdXRkaXJ9L2h0bWwjICQkJacmYW1wOy0hcmVwb3J0Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtvdXRwdXRkaXJ9L3Rlc3QiPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfS9odG1sIyAkJCWnJmFtcDstIXJlcG9ydCIvPgorICAgICAgICA8L2p1bml0cmVwb3J0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0V2l0aFN0eWxlRnJvbUNsYXNzcGF0aCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7b3V0cHV0ZGlyfS9odG1sIi8+CisgICAgICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHtvdXRwdXRkaXJ9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqcmRpcn0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfS9odG1sIi8+CisgICAgICAgIDwvanVuaXRyZXBvcnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3ROb0ZyYW1lcyI+CisgICAgICAgIDxta2RpciBkaXI9IiR7b3V0cHV0ZGlyfS9odG1sIi8+CisgICAgICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHtvdXRwdXRkaXJ9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqcmRpcn0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfS9odG1sIiBmb3JtYXQ9Im5vZnJhbWVzIi8+CisgICAgICAgIDwvanVuaXRyZXBvcnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RXaXRoU3R5bGVGcm9tRGlyIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXRkaXJ9L2h0bWwiLz4KKyAgICAgICAgPGp1bml0cmVwb3J0IHRvZGlyPSIke291dHB1dGRpcn0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2pyZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iVEVTVC0qLnhtbCIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPHJlcG9ydCB0b2Rpcj0iJHtvdXRwdXRkaXJ9L2h0bWwiCisgICAgICAgICAgICAgICAgc3R5bGVkaXI9Imp1bml0cmVwb3J0IgorICAgICAgICAgICAgICAgIGZvcm1hdD0iZnJhbWVzIi8+CisgICAgICAgIDwvanVuaXRyZXBvcnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIGJ1ZyByZXBvcnQgNDAwMjIgLS0+CisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0V2l0aFN0eWxlRnJvbURpckFuZFhzbEltcG9ydCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7b3V0cHV0ZGlyfS9odG1sIi8+CisgICAgICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHtvdXRwdXRkaXJ9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqcmRpcn0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IlRFU1QtKi54bWwiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfS9odG1sIgorICAgICAgICAgICAgICAgIHN0eWxlZGlyPSJqdW5pdHJlcG9ydC13aXRoLWluY2x1ZGUiCisgICAgICAgICAgICAgICAgZm9ybWF0PSJmcmFtZXMiLz4KKyAgICAgICAgPC9qdW5pdHJlcG9ydD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdFdpdGhQYXJhbXMiPgorICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dGRpcn0vaHRtbCIvPgorICAgICAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7b3V0cHV0ZGlyfSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7anJkaXJ9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJURVNULSoueG1sIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8cmVwb3J0IHRvZGlyPSIke291dHB1dGRpcn0vaHRtbCIKKyAgICAgICAgICAgICAgICBzdHlsZWRpcj0ianVuaXRyZXBvcnQiCisgICAgICAgICAgICAgICAgZm9ybWF0PSJmcmFtZXMiPgorICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJrZXkxIiBleHByZXNzaW9uPSJ2YWx1ZTEiLz4KKyAgICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0ia2V5MiIgZXhwcmVzc2lvbj0idmFsdWUyIi8+CisgICAgICAgICAgICA8L3JlcG9ydD4KKyAgICAgICAgPC9qdW5pdHJlcG9ydD4KKyAgICAgICAgPGNvbmNhdD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7b3V0cHV0ZGlyfS9odG1sL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPC9jb25jYXQ+ICAgICAgICAKKyAgICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9JTkNPTVBMRVRFLXNhbXBsZXByb2plY3QuaW5jb21wbGV0ZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9JTkNPTVBMRVRFLXNhbXBsZXByb2plY3QuaW5jb21wbGV0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhZjAxNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L0lOQ09NUExFVEUtc2FtcGxlcHJvamVjdC5pbmNvbXBsZXRlLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx0ZXN0c3VpdGUgZXJyb3JzPSIwIiBmYWlsdXJlcz0iMCIgbmFtZT0ic2FtcGxlcHJvamVjdC5pbmNvbXBsZXRlIiB0ZXN0cz0iNSIgdGltZT0iMC4wMzgiPgorICA8L3Byb3BlcnRpZXM+CisgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0RXF1YWxzIiB0aW1lPSIwLjAiPjwvdGVzdGNhc2U+CisgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0SGFzaENvZGUiIHRpbWU9IjAuMCI+PC90ZXN0Y2FzZT4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RUb1N0cmluZyIgdGltZT0iMC4wMDEwIj48L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdGdldFVuaXF1ZVN0cmluZyIgdGltZT0iMC4wIj48L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdFNlcmlhbGl6YXRpb24iIHRpbWU9IjAuMDI0Ij48L3Rlc3RjYXNlPgorICA8c3lzdGVtLW91dD48IVtDREFUQVt0ZXN0RXF1YWxzCit0ZXN0SGFzaENvZGUKK3Rlc3RUb1N0cmluZwordGVzdGdldFVuaXF1ZVN0cmluZwordGVzdFNlcmlhbGl6YXRpb24KK11dPjwvc3lzdGVtLW91dD4KKyAgPHN5c3RlbS1lcnI+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9OQU1FU1BBQ0Utc2FtcGxlcHJvamVjdC5uYW1lc3BhY2UueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvTkFNRVNQQUNFLXNhbXBsZXByb2plY3QubmFtZXNwYWNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU3ZGJmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvTkFNRVNQQUNFLXNhbXBsZXByb2plY3QubmFtZXNwYWNlLnhtbApAQCAtMCwwICsxLDExNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bnM6dGVzdHN1aXRlIGVycm9ycz0iMSIgZmFpbHVyZXM9IjEiIG5hbWU9InNhbXBsZXByb2plY3QubmFtZXNwYWNlIiB0ZXN0cz0iMTEiIHRpbWU9IjAuMTcxIiB4bWxuczpucz0iZnVubnktbmFtZXNwYWNlIj4KKyAgPHByb3BlcnRpZXM+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3RzcmMiIHZhbHVlPSJ0ZXN0LyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5ydW50aW1lLm5hbWUiIHZhbHVlPSJKYXZhKFRNKSAyIFJ1bnRpbWUgRW52aXJvbm1lbnQsIFN0YW5kYXJkIEVkaXRpb24iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1bi5ib290LmxpYnJhcnkucGF0aCIgdmFsdWU9Ii91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvbGliL2kzODYiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudm0udmVyc2lvbiIgdmFsdWU9IjEuMy4xXzAzLWIwMyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iYW50LnZlcnNpb24iIHZhbHVlPSJBcGFjaGUgQW50IHZlcnNpb24gMS41IGNvbXBpbGVkIG9uIEp1bHkgOSAyMDAyIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuamF2YS52ZXJzaW9uIiB2YWx1ZT0iMS4zIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnZtLnZlbmRvciIgdmFsdWU9IlN1biBNaWNyb3N5c3RlbXMgSW5jLiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52ZW5kb3IudXJsIiB2YWx1ZT0iaHR0cDovL2phdmEuc3VuLmNvbS8iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InBhdGguc2VwYXJhdG9yIiB2YWx1ZT0iOiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52bS5uYW1lIiB2YWx1ZT0iSmF2YSBIb3RTcG90KFRNKSBDbGllbnQgVk0iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImZpbGUuZW5jb2RpbmcucGtnIiB2YWx1ZT0ic3VuLmlvIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iY2xhc3NlcyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52bS5zcGVjaWZpY2F0aW9uLm5hbWUiIHZhbHVlPSJKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VyLmRpciIgdmFsdWU9Ii9ob21lL2prZi9wcm9ncmFtbWluZy9ncmV0YW50X3NvdXJjZWZvcmdlL3NhbXBsZXByb2plY3QiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEucnVudGltZS52ZXJzaW9uIiB2YWx1ZT0iMS4zLjFfMDMtYjAzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmF3dC5ncmFwaGljc2VudiIgdmFsdWU9InN1bi5hd3QuWDExR3JhcGhpY3NFbnZpcm9ubWVudCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iYmFzZWRpciIgdmFsdWU9Ii9ob21lL2prZi9wcm9ncmFtbWluZy9ncmV0YW50X3NvdXJjZWZvcmdlL3NhbXBsZXByb2plY3QiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9Im9zLmFyY2giIHZhbHVlPSJpMzg2Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmlvLnRtcGRpciIgdmFsdWU9Ii90bXAiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImxpbmUuc2VwYXJhdG9yIiB2YWx1ZT0iCisiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudm0uc3BlY2lmaWNhdGlvbi52ZW5kb3IiIHZhbHVlPSJTdW4gTWljcm9zeXN0ZW1zIEluYy4iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuYXd0LmZvbnRzIiB2YWx1ZT0iIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJvcy5uYW1lIiB2YWx1ZT0iTGludXgiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImFudC5ob21lIiB2YWx1ZT0iL29wdC9qYWthcnRhLWFudC0xLjUvIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQucHJvamVjdC5uYW1lIiB2YWx1ZT0ic2FtcGxlIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRkaXIiIHZhbHVlPSJyZXBvcnRzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmxpYnJhcnkucGF0aCIgdmFsdWU9Ii91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvbGliL2kzODY6L3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvaTM4Ni9uYXRpdmVfdGhyZWFkcy86L3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvaTM4Ni9jbGllbnQ6L3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS8uLi9saWIvaTM4NiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iY29kZS8iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlYnVnIiB2YWx1ZT0ib24iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuc3BlY2lmaWNhdGlvbi5uYW1lIiB2YWx1ZT0iSmF2YSBQbGF0Zm9ybSBBUEkgU3BlY2lmaWNhdGlvbiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5jbGFzcy52ZXJzaW9uIiB2YWx1ZT0iNDcuMCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ib3MudmVyc2lvbiIgdmFsdWU9IjIuNC4xOC01Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuZmlsZSIgdmFsdWU9Ii9ob21lL2prZi9wcm9ncmFtbWluZy9ncmV0YW50X3NvdXJjZWZvcmdlL3NhbXBsZXByb2plY3QvYnVpbGQueG1sIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1bml0cmVwb3J0IiB2YWx1ZT0iY2wtdW5pdC54bWwiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InVzZXIuaG9tZSIgdmFsdWU9Ii9ob21lL2prZiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idXNlci50aW1lem9uZSIgdmFsdWU9IkV1cm9wZS9BbXN0ZXJkYW0iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuYXd0LnByaW50ZXJqb2IiIHZhbHVlPSJzdW4uYXd0Lm1vdGlmLlBTUHJpbnRlckpvYiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iIHZhbHVlPSIxLjMiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImZpbGUuZW5jb2RpbmciIHZhbHVlPSJJU08tODg1OS0xNSI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5jbGFzcy5wYXRoIiB2YWx1ZT0iL29wdC9qYWthcnRhLWFudC0xLjUvL2xpYi94bWwtYXBpcy5qYXI6L29wdC9qYWthcnRhLWFudC0xLjUvL2xpYi94ZXJjZXNJbXBsLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL3hhbGFuLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL29wdGlvbmFsLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL2p1bml0Lmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL0dyZXRlbC5qYXI6L29wdC9qYWthcnRhLWFudC0xLjUvL2xpYi9ncmV0YW50Lmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL2N1cC1ydW50aW1lLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL2JjZWwuamFyOi9vcHQvamFrYXJ0YS1hbnQtMS41Ly9saWIvYW50LmphcjovdXNyL2phdmEvamRrMS4zL2xpYi90b29scy5qYXIiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InVzZXIubmFtZSIgdmFsdWU9ImprZiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iY292ZXJyZXBvcnQiIHZhbHVlPSJjbC1jb3Zlci54bWwiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudm0uc3BlY2lmaWNhdGlvbi52ZXJzaW9uIiB2YWx1ZT0iMS4wIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmhvbWUiIHZhbHVlPSIvdXNyL2phdmEvamRrMS4zLjFfMDMvanJlIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnNwZWNpZmljYXRpb24udmVuZG9yIiB2YWx1ZT0iU3VuIE1pY3Jvc3lzdGVtcyBJbmMuIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VyLmxhbmd1YWdlIiB2YWx1ZT0iZW4iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudm0uaW5mbyIgdmFsdWU9Im1peGVkIG1vZGUiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudmVyc2lvbiIgdmFsdWU9IjEuMy4xXzAzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmV4dC5kaXJzIiB2YWx1ZT0iL3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvZXh0Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdW4uYm9vdC5jbGFzcy5wYXRoIiB2YWx1ZT0iL3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvcnQuamFyOi91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvbGliL2kxOG4uamFyOi91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvbGliL3N1bnJzYXNpZ24uamFyOi91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvY2xhc3NlcyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52ZW5kb3IiIHZhbHVlPSJTdW4gTWljcm9zeXN0ZW1zIEluYy4iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImZpbGUuc2VwYXJhdG9yIiB2YWx1ZT0iLyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXMiIHZhbHVlPSJ0ZXN0Y2xhc3NlcyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52ZW5kb3IudXJsLmJ1ZyIgdmFsdWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20vY2dpLWJpbi9idWdyZXBvcnQuY2dpIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdW4uaW8udW5pY29kZS5lbmNvZGluZyIgdmFsdWU9IlVuaWNvZGVMaXR0bGUiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1bi5jcHUuZW5kaWFuIiB2YWx1ZT0ibGl0dGxlIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJncmV0Y2xhc3NlcyIgdmFsdWU9ImdyZXRjbGFzc2VzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VyLnJlZ2lvbiIgdmFsdWU9IlVTIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdW4uY3B1LmlzYWxpc3QiIHZhbHVlPSIiPjwvcHJvcGVydHk+CisgIDwvcHJvcGVydGllcz4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RFcXVhbHMiIHRpbWU9IjAuMDE0Ij48L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEhhc2hDb2RlIiB0aW1lPSIwLjAwMTAiPjwvdGVzdGNhc2U+CisgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0VG9TdHJpbmciIHRpbWU9IjAuMDAxMCI+PC90ZXN0Y2FzZT4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RHZXRJbWFnZVVSTCIgdGltZT0iMC4wIj48L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEdldENvdW50cnkiIHRpbWU9IjAuMDAxMCI+PC90ZXN0Y2FzZT4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RHZXREZW5vbWluYXRpb24iIHRpbWU9IjAuMCI+PC90ZXN0Y2FzZT4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RHZXRZZWFyIiB0aW1lPSIwLjAiPjwvdGVzdGNhc2U+CisgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0R2V0U3ViVHlwZSIgdGltZT0iMC4wIj48L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEZhaWwiIHRpbWU9IjAuMDA4MCI+CisgICAgPGZhaWx1cmUgbWVzc2FnZT0iRE9FRyIgdHlwZT0ianVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yIj5qdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I6IERPRUcKKwlhdCBzYW1wbGVwcm9qZWN0LmNvaW5zLkNvaW5UZXN0LnRlc3RGYWlsKENvaW5UZXN0LmphdmE6MjI5KQorPC9mYWlsdXJlPgorICA8L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEV4Y2VwdGlvbiIgdGltZT0iMC4wMDEwIj4KKyAgICA8ZXJyb3IgbWVzc2FnZT0iUlRFIiB0eXBlPSJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiI+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IFJURQorCWF0IHNhbXBsZXByb2plY3QuY29pbnMuQ29pblRlc3QudGVzdEV4Y2VwdGlvbihDb2luVGVzdC5qYXZhOjIzNCkKKzwvZXJyb3I+CisgIDwvdGVzdGNhc2U+CisgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0U3VjY2VzcyIgdGltZT0iMC4wIj48L3Rlc3RjYXNlPgorICA8c3lzdGVtLW91dD48IVtDREFUQVt0ZXN0RXF1YWxzCit0ZXN0SGFzaENvZGUKK0hhc2hjb2RlczogMTQzNDU1NzIyNSAxNDM0NTU3MjI1IDE0MzQ1NTcyMjYgMTQ2MzE4NjM3NiAxNDM0NTU2OTA4IDE1MTY5ODA0MDEgMTQzNDU1NzIyNQordGVzdFRvU3RyaW5nCis8Q29pbj1OTCwxIEV1cm8sMTk5OSxWYXIgYS8+Cis8Q29pbj1OTCwxIEV1cm8sMTk5OSxudWxsLz4KK3Rlc3RHZXRJbWFnZVVSTAordGVzdEdldENvdW50cnkKK3Rlc3RHZXREZW5vbWluYXRpb24KK3Rlc3RHZXRZZWFyCit0ZXN0R2V0U3ViVHlwZQordGVzdEZhaWwKK3Rlc3RFeGNlcHRpb24KK3Rlc3RTdWNjZXNzCitdXT48L3N5c3RlbS1vdXQ+CisgIDxzeXN0ZW0tZXJyPjwhW0NEQVRBW11dPjwvc3lzdGVtLWVycj4KKzwvbnM6dGVzdHN1aXRlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvVEVTVC1zYW1wbGVwcm9qZWN0LmNvaW5zLkNvaW5UZXN0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L1RFU1Qtc2FtcGxlcHJvamVjdC5jb2lucy5Db2luVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjZTQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L1RFU1Qtc2FtcGxlcHJvamVjdC5jb2lucy5Db2luVGVzdC54bWwKQEAgLTAsMCArMSwxMTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHRlc3RzdWl0ZSBlcnJvcnM9IjEiIGZhaWx1cmVzPSIxIiBuYW1lPSJzYW1wbGVwcm9qZWN0LmNvaW5zLkNvaW5UZXN0IiB0ZXN0cz0iMTEiIHRpbWU9IjAuMTcxIj4KKyAgPHByb3BlcnRpZXM+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3RzcmMiIHZhbHVlPSJ0ZXN0LyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5ydW50aW1lLm5hbWUiIHZhbHVlPSJKYXZhKFRNKSAyIFJ1bnRpbWUgRW52aXJvbm1lbnQsIFN0YW5kYXJkIEVkaXRpb24iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1bi5ib290LmxpYnJhcnkucGF0aCIgdmFsdWU9Ii91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvbGliL2kzODYiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudm0udmVyc2lvbiIgdmFsdWU9IjEuMy4xXzAzLWIwMyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iYW50LnZlcnNpb24iIHZhbHVlPSJBcGFjaGUgQW50IHZlcnNpb24gMS41IGNvbXBpbGVkIG9uIEp1bHkgOSAyMDAyIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuamF2YS52ZXJzaW9uIiB2YWx1ZT0iMS4zIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnZtLnZlbmRvciIgdmFsdWU9IlN1biBNaWNyb3N5c3RlbXMgSW5jLiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52ZW5kb3IudXJsIiB2YWx1ZT0iaHR0cDovL2phdmEuc3VuLmNvbS8iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InBhdGguc2VwYXJhdG9yIiB2YWx1ZT0iOiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52bS5uYW1lIiB2YWx1ZT0iSmF2YSBIb3RTcG90KFRNKSBDbGllbnQgVk0iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImZpbGUuZW5jb2RpbmcucGtnIiB2YWx1ZT0ic3VuLmlvIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iY2xhc3NlcyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52bS5zcGVjaWZpY2F0aW9uLm5hbWUiIHZhbHVlPSJKYXZhIFZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VyLmRpciIgdmFsdWU9Ii9ob21lL2prZi9wcm9ncmFtbWluZy9ncmV0YW50X3NvdXJjZWZvcmdlL3NhbXBsZXByb2plY3QiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEucnVudGltZS52ZXJzaW9uIiB2YWx1ZT0iMS4zLjFfMDMtYjAzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmF3dC5ncmFwaGljc2VudiIgdmFsdWU9InN1bi5hd3QuWDExR3JhcGhpY3NFbnZpcm9ubWVudCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iYmFzZWRpciIgdmFsdWU9Ii9ob21lL2prZi9wcm9ncmFtbWluZy9ncmV0YW50X3NvdXJjZWZvcmdlL3NhbXBsZXByb2plY3QiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9Im9zLmFyY2giIHZhbHVlPSJpMzg2Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmlvLnRtcGRpciIgdmFsdWU9Ii90bXAiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImxpbmUuc2VwYXJhdG9yIiB2YWx1ZT0iCisiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudm0uc3BlY2lmaWNhdGlvbi52ZW5kb3IiIHZhbHVlPSJTdW4gTWljcm9zeXN0ZW1zIEluYy4iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuYXd0LmZvbnRzIiB2YWx1ZT0iIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJvcy5uYW1lIiB2YWx1ZT0iTGludXgiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImFudC5ob21lIiB2YWx1ZT0iL29wdC9qYWthcnRhLWFudC0xLjUvIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQucHJvamVjdC5uYW1lIiB2YWx1ZT0ic2FtcGxlIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRkaXIiIHZhbHVlPSJyZXBvcnRzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmxpYnJhcnkucGF0aCIgdmFsdWU9Ii91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvbGliL2kzODY6L3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvaTM4Ni9uYXRpdmVfdGhyZWFkcy86L3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvaTM4Ni9jbGllbnQ6L3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS8uLi9saWIvaTM4NiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iY29kZS8iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlYnVnIiB2YWx1ZT0ib24iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuc3BlY2lmaWNhdGlvbi5uYW1lIiB2YWx1ZT0iSmF2YSBQbGF0Zm9ybSBBUEkgU3BlY2lmaWNhdGlvbiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5jbGFzcy52ZXJzaW9uIiB2YWx1ZT0iNDcuMCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ib3MudmVyc2lvbiIgdmFsdWU9IjIuNC4xOC01Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuZmlsZSIgdmFsdWU9Ii9ob21lL2prZi9wcm9ncmFtbWluZy9ncmV0YW50X3NvdXJjZWZvcmdlL3NhbXBsZXByb2plY3QvYnVpbGQueG1sIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1bml0cmVwb3J0IiB2YWx1ZT0iY2wtdW5pdC54bWwiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InVzZXIuaG9tZSIgdmFsdWU9Ii9ob21lL2prZiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idXNlci50aW1lem9uZSIgdmFsdWU9IkV1cm9wZS9BbXN0ZXJkYW0iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuYXd0LnByaW50ZXJqb2IiIHZhbHVlPSJzdW4uYXd0Lm1vdGlmLlBTUHJpbnRlckpvYiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iIHZhbHVlPSIxLjMiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImZpbGUuZW5jb2RpbmciIHZhbHVlPSJJU08tODg1OS0xNSI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5jbGFzcy5wYXRoIiB2YWx1ZT0iL29wdC9qYWthcnRhLWFudC0xLjUvL2xpYi94bWwtYXBpcy5qYXI6L29wdC9qYWthcnRhLWFudC0xLjUvL2xpYi94ZXJjZXNJbXBsLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL3hhbGFuLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL29wdGlvbmFsLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL2p1bml0Lmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL0dyZXRlbC5qYXI6L29wdC9qYWthcnRhLWFudC0xLjUvL2xpYi9ncmV0YW50Lmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL2N1cC1ydW50aW1lLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL2JjZWwuamFyOi9vcHQvamFrYXJ0YS1hbnQtMS41Ly9saWIvYW50LmphcjovdXNyL2phdmEvamRrMS4zL2xpYi90b29scy5qYXIiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InVzZXIubmFtZSIgdmFsdWU9ImprZiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iY292ZXJyZXBvcnQiIHZhbHVlPSJjbC1jb3Zlci54bWwiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudm0uc3BlY2lmaWNhdGlvbi52ZXJzaW9uIiB2YWx1ZT0iMS4wIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmhvbWUiIHZhbHVlPSIvdXNyL2phdmEvamRrMS4zLjFfMDMvanJlIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnNwZWNpZmljYXRpb24udmVuZG9yIiB2YWx1ZT0iU3VuIE1pY3Jvc3lzdGVtcyBJbmMuIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VyLmxhbmd1YWdlIiB2YWx1ZT0iZW4iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudm0uaW5mbyIgdmFsdWU9Im1peGVkIG1vZGUiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudmVyc2lvbiIgdmFsdWU9IjEuMy4xXzAzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmV4dC5kaXJzIiB2YWx1ZT0iL3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvZXh0Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdW4uYm9vdC5jbGFzcy5wYXRoIiB2YWx1ZT0iL3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvcnQuamFyOi91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvbGliL2kxOG4uamFyOi91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvbGliL3N1bnJzYXNpZ24uamFyOi91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUvY2xhc3NlcyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52ZW5kb3IiIHZhbHVlPSJTdW4gTWljcm9zeXN0ZW1zIEluYy4iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImZpbGUuc2VwYXJhdG9yIiB2YWx1ZT0iLyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdGNsYXNzZXMiIHZhbHVlPSJ0ZXN0Y2xhc3NlcyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52ZW5kb3IudXJsLmJ1ZyIgdmFsdWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20vY2dpLWJpbi9idWdyZXBvcnQuY2dpIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdW4uaW8udW5pY29kZS5lbmNvZGluZyIgdmFsdWU9IlVuaWNvZGVMaXR0bGUiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1bi5jcHUuZW5kaWFuIiB2YWx1ZT0ibGl0dGxlIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJncmV0Y2xhc3NlcyIgdmFsdWU9ImdyZXRjbGFzc2VzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VyLnJlZ2lvbiIgdmFsdWU9IlVTIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdW4uY3B1LmlzYWxpc3QiIHZhbHVlPSIiPjwvcHJvcGVydHk+CisgIDwvcHJvcGVydGllcz4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RFcXVhbHMiIHRpbWU9IjAuMDE0Ij48L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEhhc2hDb2RlIiB0aW1lPSIwLjAwMTAiPjwvdGVzdGNhc2U+CisgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0VG9TdHJpbmciIHRpbWU9IjAuMDAxMCI+PC90ZXN0Y2FzZT4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RHZXRJbWFnZVVSTCIgdGltZT0iMC4wIj48L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEdldENvdW50cnkiIHRpbWU9IjAuMDAxMCI+PC90ZXN0Y2FzZT4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RHZXREZW5vbWluYXRpb24iIHRpbWU9IjAuMCI+PC90ZXN0Y2FzZT4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RHZXRZZWFyIiB0aW1lPSIwLjAiPjwvdGVzdGNhc2U+CisgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0R2V0U3ViVHlwZSIgdGltZT0iMC4wIj48L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEZhaWwiIHRpbWU9IjAuMDA4MCI+CisgICAgPGZhaWx1cmUgbWVzc2FnZT0iRE9FRyIgdHlwZT0ianVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yIj5qdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I6IERPRUcKKwlhdCBzYW1wbGVwcm9qZWN0LmNvaW5zLkNvaW5UZXN0LnRlc3RGYWlsKENvaW5UZXN0LmphdmE6MjI5KQorPC9mYWlsdXJlPgorICA8L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEV4Y2VwdGlvbiIgdGltZT0iMC4wMDEwIj4KKyAgICA8ZXJyb3IgbWVzc2FnZT0iUlRFIiB0eXBlPSJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiI+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IFJURQorCWF0IHNhbXBsZXByb2plY3QuY29pbnMuQ29pblRlc3QudGVzdEV4Y2VwdGlvbihDb2luVGVzdC5qYXZhOjIzNCkKKzwvZXJyb3I+CisgIDwvdGVzdGNhc2U+CisgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0U3VjY2VzcyIgdGltZT0iMC4wIj48L3Rlc3RjYXNlPgorICA8c3lzdGVtLW91dD48IVtDREFUQVt0ZXN0RXF1YWxzCit0ZXN0SGFzaENvZGUKK0hhc2hjb2RlczogMTQzNDU1NzIyNSAxNDM0NTU3MjI1IDE0MzQ1NTcyMjYgMTQ2MzE4NjM3NiAxNDM0NTU2OTA4IDE1MTY5ODA0MDEgMTQzNDU1NzIyNQordGVzdFRvU3RyaW5nCis8Q29pbj1OTCwxIEV1cm8sMTk5OSxWYXIgYS8+Cis8Q29pbj1OTCwxIEV1cm8sMTk5OSxudWxsLz4KK3Rlc3RHZXRJbWFnZVVSTAordGVzdEdldENvdW50cnkKK3Rlc3RHZXREZW5vbWluYXRpb24KK3Rlc3RHZXRZZWFyCit0ZXN0R2V0U3ViVHlwZQordGVzdEZhaWwKK3Rlc3RFeGNlcHRpb24KK3Rlc3RTdWNjZXNzCitdXT48L3N5c3RlbS1vdXQ+CisgIDxzeXN0ZW0tZXJyPjwhW0NEQVRBW11dPjwvc3lzdGVtLWVycj4KKzwvdGVzdHN1aXRlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvVEVTVC1zYW1wbGVwcm9qZWN0LnV0aWwuVW5pcXVlU3RyaW5nVGVzdC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9URVNULXNhbXBsZXByb2plY3QudXRpbC5VbmlxdWVTdHJpbmdUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDAxNmMyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvVEVTVC1zYW1wbGVwcm9qZWN0LnV0aWwuVW5pcXVlU3RyaW5nVGVzdC54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dGVzdHN1aXRlIGVycm9ycz0iMCIgZmFpbHVyZXM9IjAiIG5hbWU9InNhbXBsZXByb2plY3QudXRpbC5VbmlxdWVTdHJpbmdUZXN0IiB0ZXN0cz0iNSIgdGltZT0iMC4wMzgiPgorICA8cHJvcGVydGllcz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdHNyYyIgdmFsdWU9InRlc3QvIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnJ1bnRpbWUubmFtZSIgdmFsdWU9IkphdmEoVE0pIDIgUnVudGltZSBFbnZpcm9ubWVudCwgU3RhbmRhcmQgRWRpdGlvbiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3VuLmJvb3QubGlicmFyeS5wYXRoIiB2YWx1ZT0iL3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvaTM4NiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52bS52ZXJzaW9uIiB2YWx1ZT0iMS4zLjFfMDMtYjAzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQudmVyc2lvbiIgdmFsdWU9IkFwYWNoZSBBbnQgdmVyc2lvbiAxLjUgY29tcGlsZWQgb24gSnVseSA5IDIwMDIiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImFudC5qYXZhLnZlcnNpb24iIHZhbHVlPSIxLjMiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEudm0udmVuZG9yIiB2YWx1ZT0iU3VuIE1pY3Jvc3lzdGVtcyBJbmMuIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnZlbmRvci51cmwiIHZhbHVlPSJodHRwOi8vamF2YS5zdW4uY29tLyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icGF0aC5zZXBhcmF0b3IiIHZhbHVlPSI6Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnZtLm5hbWUiIHZhbHVlPSJKYXZhIEhvdFNwb3QoVE0pIENsaWVudCBWTSI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iZmlsZS5lbmNvZGluZy5wa2ciIHZhbHVlPSJzdW4uaW8iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMiIHZhbHVlPSJjbGFzc2VzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnZtLnNwZWNpZmljYXRpb24ubmFtZSIgdmFsdWU9IkphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb24iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InVzZXIuZGlyIiB2YWx1ZT0iL2hvbWUvamtmL3Byb2dyYW1taW5nL2dyZXRhbnRfc291cmNlZm9yZ2Uvc2FtcGxlcHJvamVjdCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5ydW50aW1lLnZlcnNpb24iIHZhbHVlPSIxLjMuMV8wMy1iMDMiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuYXd0LmdyYXBoaWNzZW52IiB2YWx1ZT0ic3VuLmF3dC5YMTFHcmFwaGljc0Vudmlyb25tZW50Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJiYXNlZGlyIiB2YWx1ZT0iL2hvbWUvamtmL3Byb2dyYW1taW5nL2dyZXRhbnRfc291cmNlZm9yZ2Uvc2FtcGxlcHJvamVjdCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ib3MuYXJjaCIgdmFsdWU9ImkzODYiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuaW8udG1wZGlyIiB2YWx1ZT0iL3RtcCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ibGluZS5zZXBhcmF0b3IiIHZhbHVlPSIKKyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52bS5zcGVjaWZpY2F0aW9uLnZlbmRvciIgdmFsdWU9IlN1biBNaWNyb3N5c3RlbXMgSW5jLiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5hd3QuZm9udHMiIHZhbHVlPSIiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9Im9zLm5hbWUiIHZhbHVlPSJMaW51eCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iYW50LmhvbWUiIHZhbHVlPSIvb3B0L2pha2FydGEtYW50LTEuNS8iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImFudC5wcm9qZWN0Lm5hbWUiIHZhbHVlPSJzYW1wbGUiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydGRpciIgdmFsdWU9InJlcG9ydHMiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEubGlicmFyeS5wYXRoIiB2YWx1ZT0iL3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvaTM4NjovdXNyL2phdmEvamRrMS4zLjFfMDMvanJlL2xpYi9pMzg2L25hdGl2ZV90aHJlYWRzLzovdXNyL2phdmEvamRrMS4zLjFfMDMvanJlL2xpYi9pMzg2L2NsaWVudDovdXNyL2phdmEvamRrMS4zLjFfMDMvanJlLy4uL2xpYi9pMzg2Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSJjb2RlLyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVidWciIHZhbHVlPSJvbiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5zcGVjaWZpY2F0aW9uLm5hbWUiIHZhbHVlPSJKYXZhIFBsYXRmb3JtIEFQSSBTcGVjaWZpY2F0aW9uIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmNsYXNzLnZlcnNpb24iIHZhbHVlPSI0Ny4wIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJvcy52ZXJzaW9uIiB2YWx1ZT0iMi40LjE4LTUiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImFudC5maWxlIiB2YWx1ZT0iL2hvbWUvamtmL3Byb2dyYW1taW5nL2dyZXRhbnRfc291cmNlZm9yZ2Uvc2FtcGxlcHJvamVjdC9idWlsZC54bWwiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InVuaXRyZXBvcnQiIHZhbHVlPSJjbC11bml0LnhtbCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idXNlci5ob21lIiB2YWx1ZT0iL2hvbWUvamtmIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VyLnRpbWV6b25lIiB2YWx1ZT0iRXVyb3BlL0Ftc3RlcmRhbSI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5hd3QucHJpbnRlcmpvYiIgdmFsdWU9InN1bi5hd3QubW90aWYuUFNQcmludGVySm9iIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiIgdmFsdWU9IjEuMyI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iZmlsZS5lbmNvZGluZyIgdmFsdWU9IklTTy04ODU5LTE1Ij48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLmNsYXNzLnBhdGgiIHZhbHVlPSIvb3B0L2pha2FydGEtYW50LTEuNS8vbGliL3htbC1hcGlzLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL3hlcmNlc0ltcGwuamFyOi9vcHQvamFrYXJ0YS1hbnQtMS41Ly9saWIveGFsYW4uamFyOi9vcHQvamFrYXJ0YS1hbnQtMS41Ly9saWIvb3B0aW9uYWwuamFyOi9vcHQvamFrYXJ0YS1hbnQtMS41Ly9saWIvanVuaXQuamFyOi9vcHQvamFrYXJ0YS1hbnQtMS41Ly9saWIvR3JldGVsLmphcjovb3B0L2pha2FydGEtYW50LTEuNS8vbGliL2dyZXRhbnQuamFyOi9vcHQvamFrYXJ0YS1hbnQtMS41Ly9saWIvY3VwLXJ1bnRpbWUuamFyOi9vcHQvamFrYXJ0YS1hbnQtMS41Ly9saWIvYmNlbC5qYXI6L29wdC9qYWthcnRhLWFudC0xLjUvL2xpYi9hbnQuamFyOi91c3IvamF2YS9qZGsxLjMvbGliL3Rvb2xzLmphciI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idXNlci5uYW1lIiB2YWx1ZT0iamtmIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb3ZlcnJlcG9ydCIgdmFsdWU9ImNsLWNvdmVyLnhtbCI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52bS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iIHZhbHVlPSIxLjAiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuaG9tZSIgdmFsdWU9Ii91c3IvamF2YS9qZGsxLjMuMV8wMy9qcmUiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuc3BlY2lmaWNhdGlvbi52ZW5kb3IiIHZhbHVlPSJTdW4gTWljcm9zeXN0ZW1zIEluYy4iPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InVzZXIubGFuZ3VhZ2UiIHZhbHVlPSJlbiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52bS5pbmZvIiB2YWx1ZT0ibWl4ZWQgbW9kZSI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS52ZXJzaW9uIiB2YWx1ZT0iMS4zLjFfMDMiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuZXh0LmRpcnMiIHZhbHVlPSIvdXNyL2phdmEvamRrMS4zLjFfMDMvanJlL2xpYi9leHQiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1bi5ib290LmNsYXNzLnBhdGgiIHZhbHVlPSIvdXNyL2phdmEvamRrMS4zLjFfMDMvanJlL2xpYi9ydC5qYXI6L3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvaTE4bi5qYXI6L3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9saWIvc3VucnNhc2lnbi5qYXI6L3Vzci9qYXZhL2pkazEuMy4xXzAzL2pyZS9jbGFzc2VzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnZlbmRvciIgdmFsdWU9IlN1biBNaWNyb3N5c3RlbXMgSW5jLiI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iZmlsZS5zZXBhcmF0b3IiIHZhbHVlPSIvIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3NlcyIgdmFsdWU9InRlc3RjbGFzc2VzIj48L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnZlbmRvci51cmwuYnVnIiB2YWx1ZT0iaHR0cDovL2phdmEuc3VuLmNvbS9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2kiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1bi5pby51bmljb2RlLmVuY29kaW5nIiB2YWx1ZT0iVW5pY29kZUxpdHRsZSI+PC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3VuLmNwdS5lbmRpYW4iIHZhbHVlPSJsaXR0bGUiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImdyZXRjbGFzc2VzIiB2YWx1ZT0iZ3JldGNsYXNzZXMiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InVzZXIucmVnaW9uIiB2YWx1ZT0iVVMiPjwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InN1bi5jcHUuaXNhbGlzdCIgdmFsdWU9IiI+PC9wcm9wZXJ0eT4KKyAgPC9wcm9wZXJ0aWVzPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEVxdWFscyIgdGltZT0iMC4wIj48L3Rlc3RjYXNlPgorICA8dGVzdGNhc2UgbmFtZT0idGVzdEhhc2hDb2RlIiB0aW1lPSIwLjAiPjwvdGVzdGNhc2U+CisgIDx0ZXN0Y2FzZSBuYW1lPSJ0ZXN0VG9TdHJpbmciIHRpbWU9IjAuMDAxMCI+PC90ZXN0Y2FzZT4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RnZXRVbmlxdWVTdHJpbmciIHRpbWU9IjAuMCI+PC90ZXN0Y2FzZT4KKyAgPHRlc3RjYXNlIG5hbWU9InRlc3RTZXJpYWxpemF0aW9uIiB0aW1lPSIwLjAyNCI+PC90ZXN0Y2FzZT4KKyAgPHN5c3RlbS1vdXQ+PCFbQ0RBVEFbdGVzdEVxdWFscwordGVzdEhhc2hDb2RlCit0ZXN0VG9TdHJpbmcKK3Rlc3RnZXRVbmlxdWVTdHJpbmcKK3Rlc3RTZXJpYWxpemF0aW9uCitdXT48L3N5c3RlbS1vdXQ+CisgIDxzeXN0ZW0tZXJyPjwhW0NEQVRBW11dPjwvc3lzdGVtLWVycj4KKzwvdGVzdHN1aXRlPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvV1JPTkdFTEVNRU5ULXNhbXBsZXByb2plY3Qud3JvbmdlbGVtZW50LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L1dST05HRUxFTUVOVC1zYW1wbGVwcm9qZWN0Lndyb25nZWxlbWVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiNWExNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L1dST05HRUxFTUVOVC1zYW1wbGVwcm9qZWN0Lndyb25nZWxlbWVudC54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8d2lsZGViZWFzdC8+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9aRVJPQllURVMtc2FtcGxlcHJvamVjdC5wYWNrYWdlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L1pFUk9CWVRFUy1zYW1wbGVwcm9qZWN0LnBhY2thZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzUxYzcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9aRVJPQllURVMtc2FtcGxlcHJvamVjdC5wYWNrYWdlLnhtbApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L2p1bml0LWZyYW1lcy54c2wgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9qdW5pdC1mcmFtZXMueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzEzYWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9qdW5pdC1mcmFtZXMueHNsCkBAIC0wLDAgKzEsODc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKyAgICB4bWxuczpyZWRpcmVjdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL3JlZGlyZWN0IgorICAgIHhtbG5zOnN0cmluZ3V0aWxzPSJ4YWxhbjovL29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHMiCisgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KKzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPgorPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIi8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8IS0tCisKKyBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggQW50IEpVbml0UmVwb3J0IG91dHB1dC4KKworIEl0IGNyZWF0ZXMgYSBzZXQgb2YgSFRNTCBmaWxlcyBhIGxhIGphdmFkb2Mgd2hlcmUgeW91IGNhbiBicm93c2UgZWFzaWx5CisgdGhyb3VnaCBhbGwgcGFja2FnZXMgYW5kIGNsYXNzZXMuCisKKy0tPgorPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgorPHhzbDpwYXJhbSBuYW1lPSJrZXkxIiBzZWxlY3Q9IidkZWZhdWx0VmFsdWUxJyIvPgorPHhzbDpwYXJhbSBuYW1lPSJrZXkyIiBzZWxlY3Q9IidkZWZhdWx0VmFsdWUyJyIvPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIj4KKyAgICA8IS0tIGNyZWF0ZSB0aGUgaW5kZXguaHRtbCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9pbmRleC5odG1sIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIHN0eWxlc2hlZXQuY3NzIC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3N0eWxlc2hlZXQuY3NzIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIGFsbC1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LWZyYW1lLmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5wYWNrYWdlcyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLWNsYXNzZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGxjbGFzc2VzLWZyYW1lLmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5jbGFzc2VzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtdGVzdHMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGwtdGVzdHMuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnRlc3RzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBhbGx0ZXN0cy1mYWlscy5odG1sIGF0IHRoZSByb290IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbHRlc3RzLWZhaWxzLmh0bWwiPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwudGVzdHMiPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInZmFpbHMnIi8+CisgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICA8IS0tIGNyZWF0ZSB0aGUgYWxsdGVzdHMtZXJyb3JzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsdGVzdHMtZXJyb3JzLmh0bWwiPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwudGVzdHMiPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInZXJyb3JzJyIvPgorICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi90ZXN0c3VpdGVbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6dGVzdHN1aXRlL0BwYWNrYWdlKV0iPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwveHNsOmZvci1lYWNoPgorPC94c2w6dGVtcGxhdGU+CisKKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJG5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJG5hbWUsJy4nLCcvJykiLz48L3hzbDppZj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSIkbmFtZSA9ICcnIj4uPC94c2w6aWY+CisgICAgPC94c2w6dmFyaWFibGU+CisgICAgPCEtLVByb2Nlc3NpbmcgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gaW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXQuZGlyIi8+IC0tPgorICAgIDwhLS0gY3JlYXRlIGEgY2xhc3Nlcy1saXN0Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2UtZnJhbWUuaHRtbCI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzLmxpc3QiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgYSBwYWNrYWdlLXN1bW1hcnkuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gZm9yIGVhY2ggY2xhc3MsIGNyZWF0ZXMgYSBAbmFtZS5odG1sIC0tPgorICAgIDwhLS0gQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSB3aXRoIGlubmVyIGNsYXNzZXMgaGF2aW5nIHRoZSBzYW1lIG5hbWUsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gLS0+CisgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbQHBhY2thZ2UgPSAkbmFtZV0iPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0uaHRtbCI+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1vdXQpIT0wIj4KKyAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0tb3V0LnR4dCI+CisgICAgICAgIDx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIuL3N5c3RlbS1vdXQiLz4KKyAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisgICAgPC94c2w6aWY+CisgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLWVycikhPTAiPgorICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BpZH1fe0BuYW1lfS1lcnIudHh0Ij4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9Ii4vc3lzdGVtLWVyciIvPgorICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgICA8L3hzbDppZj4KKyAgICA8eHNsOmlmIHRlc3Q9IkBmYWlsdXJlcyAhPSAwIj4KKyAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0tZmFpbHMuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iY2xhc3MuZGV0YWlscyI+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InR5cGUiIHNlbGVjdD0iJ2ZhaWxzJyIvPgorICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICA8L3JlZGlyZWN0OndyaXRlPgorICAgIDwveHNsOmlmPgorICAgIDx4c2w6aWYgdGVzdD0iQGVycm9ycyAhPSAwIj4KKyAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0tZXJyb3JzLmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImNsYXNzLmRldGFpbHMiPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidlcnJvcnMnIi8+CisgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisgICAgPC94c2w6aWY+CisgIDwveHNsOmZvci1lYWNoPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCI+Cis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgVW5pdCBUZXN0IFJlc3VsdHMuIGtleTE9PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRrZXkxIi8+LGtleTI9PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRrZXkyIi8+CisgICAgICAgIDwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxmcmFtZXNldCBjb2xzPSIyMCUsODAlIj4KKyAgICAgICAgPGZyYW1lc2V0IHJvd3M9IjMwJSw3MCUiPgorICAgICAgICAgICAgPGZyYW1lIHNyYz0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUxpc3RGcmFtZSIvPgorICAgICAgICAgICAgPGZyYW1lIHNyYz0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiBuYW1lPSJjbGFzc0xpc3RGcmFtZSIvPgorICAgICAgICA8L2ZyYW1lc2V0PgorICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIG5hbWU9ImNsYXNzRnJhbWUiLz4KKyAgICAgICAgPG5vZnJhbWVzPgorICAgICAgICAgICAgPGgyPkZyYW1lIEFsZXJ0PC9oMj4KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgorICAgICAgICAgICAgPC9wPgorICAgICAgICA8L25vZnJhbWVzPgorICAgIDwvZnJhbWVzZXQ+Cis8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+Citib2R5IHsKKyAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7CisgICAgY29sb3I6IzAwMDAwMDsKK30KK3RhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7CisgICAgZm9udC1zaXplOiA2OCU7Cit9Cit0YWJsZS5kZXRhaWxzIHRyIHRoeworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICBiYWNrZ3JvdW5kOiNhNmNhZjA7Cit9Cit0YWJsZS5kZXRhaWxzIHRyIHRkeworICAgIGJhY2tncm91bmQ6I2VlZWVlMDsKK30KKworcCB7CisgICAgbGluZS1oZWlnaHQ6MS41ZW07CisgICAgbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKK30KK2gxIHsKKyAgICBtYXJnaW46IDBweCAwcHggNXB4OyBmb250OiAxNjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoMiB7CisgICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoMyB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorfQoraDQgeworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKK30KK2g1IHsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoNiB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorfQorLkVycm9yIHsKKyAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpyZWQ7Cit9CisuRmFpbHVyZSB7CisgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOworfQorLlByb3BlcnRpZXMgeworICB0ZXh0LWFsaWduOnJpZ2h0OworfQorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gQ3JlYXRlIGxpc3Qgb2YgYWxsL2ZhaWxlZC9lcnJvcmVkIHRlc3RzIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0iYWxsLnRlc3RzIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InR5cGUiIHNlbGVjdD0iJ2FsbCciLz4KKyAgICA8aHRtbD4KKwk8eHNsOnZhcmlhYmxlIG5hbWU9InRpdGxlIj4KKwkgICAgPHhzbDpjaG9vc2U+CisJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdmYWlscyciPgorCQkgICAgPHhzbDp0ZXh0PkFsbCBGYWlsdXJlczwveHNsOnRleHQ+CisJCTwveHNsOndoZW4+CisJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdlcnJvcnMnIj4KKwkJICAgIDx4c2w6dGV4dD5BbGwgRXJyb3JzPC94c2w6dGV4dD4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDpvdGhlcndpc2U+CisJCSAgICA8eHNsOnRleHQ+QWxsIFRlc3RzPC94c2w6dGV4dD4KKwkJPC94c2w6b3RoZXJ3aXNlPgorCSAgICA8L3hzbDpjaG9vc2U+CisJPC94c2w6dmFyaWFibGU+CisJPGhlYWQ+CisJICAgIDx0aXRsZT5Vbml0IFRlc3QgUmVzdWx0czogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+CisJICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorCTwvaGVhZD4KKwk8Ym9keT4KKwkgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ib25sb2FkIj5vcGVuKCdhbGxjbGFzc2VzLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKyAgICAgICAgICAgIDxoMj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC9oMj4KKworICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciI+CisJCSAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvdy5jbGFzcyIgc2VsZWN0PSIneWVzJyIvPgorCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgorCQk8IS0tCisgICAgICAgICAgICAgICAgdGVzdCBjYW4gZXZlbiBub3QgYmUgc3RhcnRlZCBhdCBhbGwgKGZhaWx1cmUgdG8gbG9hZCB0aGUgY2xhc3MpCisJCXNvIHJlcG9ydCB0aGUgZXJyb3IgZGlyZWN0bHkKKwkJLS0+CisgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iLi9lcnJvciI+CisgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJFcnJvciI+CisgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPgorICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2ZhaWxzJyI+CisgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL3Rlc3RjYXNlW2ZhaWx1cmVdIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJ3llcyciLz4KKyAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdlcnJvcnMnIj4KKyAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vdGVzdGNhc2VbZXJyb3JdIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJ3llcyciLz4KKyAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLy90ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93LmNsYXNzIiBzZWxlY3Q9Iid5ZXMnIi8+CisgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgVGhpcyBwYWdlIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IHRlc3RzdWl0ZSBjbGFzcy4KKyAgICBJdCBwcmludHMgYSBzdW1tYXJ5IG9mIHRoZSB0ZXN0c3VpdGUgYW5kIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0CisgICAgdGVzdGNhc2UgbWV0aG9kcy4KKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iY2xhc3MuZGV0YWlscyI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidhbGwnIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNsYXNzLm5hbWUiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+LjwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IFJlc3VsdHM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisgICAgICAgIHZhciBUZXN0Q2FzZXMgPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgdmFyIGN1cjsKKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9wZXJ0aWVzIi8+CisgICAgICAgPC9zY3JpcHQ+CisgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IVtDREFUQVsKKyAgICAgICAgZnVuY3Rpb24gZGlzcGxheVByb3BlcnRpZXMgKG5hbWUpIHsKKyAgICAgICAgICB2YXIgd2luID0gd2luZG93Lm9wZW4oJycsJ0pVbml0U3lzdGVtUHJvcGVydGllcycsJ3Njcm9sbGJhcnM9MSxyZXNpemFibGU9MScpOworICAgICAgICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7CisgICAgICAgICAgZG9jLm9wZW4oKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxodG1sPjxoZWFkPjx0aXRsZT5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvdGl0bGU+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7IGNvbG9yOiMwMDAwMDA7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7IGZvbnQtc2l6ZTogNjglOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyBib3JkZXItbGVmdDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci10b3A6c29saWQgMSAjY2NjY2NjOyBwYWRkaW5nOjVweDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0ZCB7IGZvbnQ6bm9ybWFsOyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmZmOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJoMyB7IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvaGVhZD48Ym9keT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxoMz5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvaDM+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0YWJsZSBjbGFzcz0ncHJvcGVydGllcyc+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iKTsKKyAgICAgICAgICBmb3IgKHByb3AgaW4gVGVzdENhc2VzW25hbWVdKSB7CisgICAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+IiArIHByb3AgKyAiPC90aD48dGQ+IiArIFRlc3RDYXNlc1tuYW1lXVtwcm9wXSArICI8L3RkPjwvdHI+Iik7CisgICAgICAgICAgfQorICAgICAgICAgIGRvYy53cml0ZSgiPC90YWJsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7CisgICAgICAgICAgZG9jLmNsb3NlKCk7CisgICAgICAgICAgd2luLmZvY3VzKCk7CisgICAgICAgIH0KKyAgICAgIF1dPgorICAgICAgPC9zY3JpcHQ+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgPGgzPkNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjwvaDM+CisKKworICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQudGVzdCIvPgorICAgICAgICAgICAgPC90YWJsZT4KKworCSAgICA8eHNsOmNob29zZT4KKwkJPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2ZhaWxzJyI+CisJCSAgICA8aDI+RmFpbHVyZXM8L2gyPgorCQk8L3hzbDp3aGVuPgorCQk8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnZXJyb3JzJyI+CisJCSAgICA8aDI+RXJyb3JzPC9oMj4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDpvdGhlcndpc2U+CisJCSAgICA8aDI+VGVzdHM8L2gyPgorCQk8L3hzbDpvdGhlcndpc2U+CisJICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiLz4KKwkJPCEtLQorICAgICAgICAgICAgICAgIHRlc3QgY2FuIGV2ZW4gbm90IGJlIHN0YXJ0ZWQgYXQgYWxsIChmYWlsdXJlIHRvIGxvYWQgdGhlIGNsYXNzKQorCQlzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5CisJCS0tPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iLi9lcnJvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRXJyb3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisJCTx4c2w6Y2hvb3NlPgorCQkgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2ZhaWxzJyI+CisJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2VbZmFpbHVyZV0iIG1vZGU9InByaW50LnRlc3QiLz4KKwkJICAgIDwveHNsOndoZW4+CisJCSAgICA8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnZXJyb3JzJyI+CisJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2VbZXJyb3JdIiBtb2RlPSJwcmludC50ZXN0Ii8+CisJCSAgICA8L3hzbDp3aGVuPgorCQkgICAgPHhzbDpvdGhlcndpc2U+CisJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2UiIG1vZGU9InByaW50LnRlc3QiLz4KKwkJICAgIDwveHNsOm90aGVyd2lzZT4KKwkJPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5qYXZhc2NyaXB0OmRpc3BsYXlQcm9wZXJ0aWVzKCc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Jyk7PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzICYjMTg3OworICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLW91dCkhPTAiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4tb3V0LnR4dDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQgJiMxODc7CisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLWVycikhPTAiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4tZXJyLnR4dDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIgJiMxODc7CisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLQorICAgV3JpdGUgcHJvcGVydGllcyBpbnRvIGEgSmF2YVNjcmlwdCBkYXRhIHN0cnVjdHVyZS4KKyAgIFRoaXMgaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGlkZWEgYnkgRXJpayBIYXRjaGVyIChlaGF0Y2hlckBhcGFjaGUub3JnKQorICAgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb3BlcnRpZXMiPgorICAgIGN1ciA9IFRlc3RDYXNlc1snPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIvPiddID0gbmV3IEFycmF5KCk7CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KKyAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICBjdXJbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiddID0gJzx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iQHZhbHVlIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4nOworICAgIDwveHNsOmZvci1lYWNoPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHBhZ2UgaXMgY3JlYXRlZCBmb3IgZXZlcnkgcGFja2FnZS4KKyAgICBJdCBwcmludHMgdGhlIG5hbWUgb2YgYWxsIGNsYXNzZXMgdGhhdCBiZWxvbmdzIHRvIHRoaXMgcGFja2FnZS4KKyAgICBAcGFyYW0gbmFtZSB0aGUgcGFja2FnZSBuYW1lIHRvIHByaW50IGNsYXNzZXMuCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIGxpc3Qgb2YgY2xhc3NlcyBpbiBhIHBhY2thZ2UgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzZXMubGlzdCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPlVuaXQgVGVzdCBDbGFzc2VzOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L3RpdGxlPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoMj48YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRuYW1lID0gJyciPiZsdDtub25lJmd0OzwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9hPjwvaDI+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGFibGU+CisKKyAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gJG5hbWVdIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGlkfV97QG5hbWV9Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgQ3JlYXRlcyBhbiBhbGwtY2xhc3Nlcy5odG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sCisgICAgb24gZWFjaCBjbGFzcy4KKy0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0iYWxsLmNsYXNzZXMiPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgIDx0aXRsZT5BbGwgVW5pdCBUZXN0IENsYXNzZXM8L3RpdGxlPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8aDI+Q2xhc3NlczwvaDI+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGVzdHN1aXRlIiBtb2RlPSJhbGwuY2xhc3NlcyI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgIDx0cj4KKyAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgIDxhIHRhcmdldD0iY2xhc3NGcmFtZSI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWU9JycpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJHBhY2thZ2UubmFtZSwnLicsJy8nKSIvPjx4c2w6dGV4dD4vPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIENyZWF0ZXMgYW4gaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlLXN1bW1hcnkuaHRtbCBmaWxlcyBvbgorICAgIGVhY2ggcGFja2FnZSBleGlzdGluZyBvbiB0ZXN0c3VpdGVzLgorICAgIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KAorLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwucGFja2FnZXMiPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgIDx0aXRsZT5BbGwgVW5pdCBUZXN0IFBhY2thZ2VzPC90aXRsZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L2hlYWQ+CisgICAgICAgIDxib2R5PgorICAgICAgICAgICAgPGgyPjxhIGhyZWY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj5Ib21lPC9hPjwvaDI+CisgICAgICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICA8YSBocmVmPSIuL3t0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHBhY2thZ2UgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+CisgICAgICAgICAgICA8L2E+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIj4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IFJlc3VsdHM6IFN1bW1hcnk8L3RpdGxlPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbignYWxsY2xhc3Nlcy1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKyAgICAgICAgPGgyPlN1bW1hcnk8L2gyPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0B0ZXN0cykiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQGVycm9ycykiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZmFpbHVyZXMpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRpbWUpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2Vzc1JhdGUiIHNlbGVjdD0iKCR0ZXN0Q291bnQgLSAkZmFpbHVyZUNvdW50IC0gJGVycm9yQ291bnQpIGRpdiAkdGVzdENvdW50Ii8+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHRoPlRlc3RzPC90aD4KKyAgICAgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+CisgICAgICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgICAgIDx0aD5TdWNjZXNzIHJhdGU8L3RoPgorICAgICAgICAgICAgPHRoPlRpbWU8L3RoPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJEaXNwbGF5IGFsbCB0ZXN0cyIgaHJlZj0iYWxsLXRlc3RzLmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC9hPjwvdGQ+CisgICAgICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIGZhaWx1cmVzIiBocmVmPSJhbGx0ZXN0cy1mYWlscy5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvYT48L3RkPgorICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJEaXNwbGF5IGFsbCBlcnJvcnMiIGhyZWY9ImFsbHRlc3RzLWVycm9ycy5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L2E+PC90ZD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRpbWVDb3VudCIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgPHRyPgorICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KKyAgICAgICAgTm90ZTogPGVtPmZhaWx1cmVzPC9lbT4gYXJlIGFudGljaXBhdGVkIGFuZCBjaGVja2VkIGZvciB3aXRoIGFzc2VydGlvbnMgd2hpbGUgPGVtPmVycm9yczwvZW0+IGFyZSB1bmFudGljaXBhdGVkLgorICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorCisgICAgICAgIDxoMj5QYWNrYWdlczwvaDI+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+CisgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiIG9yZGVyPSJhc2NlbmRpbmciLz4KKyAgICAgICAgICAgICAgICA8IS0tIGdldCB0aGUgbm9kZSBzZXQgY29udGFpbmluZyBhbGwgdGVzdHN1aXRlcyB0aGF0IGhhdmUgdGhlIHNhbWUgcGFja2FnZSAtLT4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imluc2FtZXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIi8+CisgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5IGEgZmFpbHVyZSBpZiB0aGVyZSBpcyBhbnkgZmFpbHVyZS9lcnJvciBpbiB0aGUgcGFja2FnZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZXJyb3JzKSAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BmYWlsdXJlcykgJmd0OyAwIj5GYWlsdXJlPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5QYXNzPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSIuL3t0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcGFja2FnZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0B0ZXN0cykiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZXJyb3JzKSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BmYWlsdXJlcykiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AdGltZSkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5zYW1lcGFja2FnZS9AdGltZXN0YW1wIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5zYW1lcGFja2FnZS9AaG9zdG5hbWUiLz48L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+PC9oMz4KKworICAgICAgICAgICAgPCEtLXRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3MubWV0cmljcy5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KKyAgICAgICAgICAgIDwvdGFibGUtLT4KKworICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnNhbWVwYWNrYWdlIiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gJG5hbWVdIi8+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRpbnNhbWVwYWNrYWdlKSAmZ3Q7IDAiPgorICAgICAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRpbnNhbWVwYWNrYWdlIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIHRyYW5zZm9ybSBzdHJpbmcgbGlrZSBhLmIuYyB0byAuLi8uLi8uLi8KKyAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgKKy0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KKyAgICA8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKCRwYXRoLCcuJykiPgorICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHBhdGgsJy4nKSIvPjwveHNsOndpdGgtcGFyYW0+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC94c2w6aWY+CisgICAgPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMoJHBhdGgsJy4nKSkgYW5kIG5vdCgkcGF0aCA9ICcnKSI+CisgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICAgIDwveHNsOmlmPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBjcmVhdGUgdGhlIGxpbmsgdG8gdGhlIHN0eWxlc2hlZXQgYmFzZWQgb24gdGhlIHBhY2thZ2UgbmFtZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iU3R5bGUiPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAndW5uYW1lZCBwYWNrYWdlJykiPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT48L3hzbDppZj5zdHlsZXNoZWV0LmNzczwveHNsOmF0dHJpYnV0ZT48L2xpbms+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tIFBhZ2UgSEVBREVSIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIj4KKyAgICA8aDE+VW5pdCBUZXN0IFJlc3VsdHM8L2gxPgorICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZy8iPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3RkPgorICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8aHIgc2l6ZT0iMSIvPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gY2xhc3MgaGVhZGVyIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgIDx0aCB3aWR0aD0iODAlIj5OYW1lPC90aD4KKyAgICAgICAgPHRoPlRlc3RzPC90aD4KKyAgICAgICAgPHRoPkVycm9yczwvdGg+CisgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+CisgICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+CisgICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZSBTdGFtcDwvdGg+CisgICAgICAgIDx0aD5Ib3N0PC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gbWV0aG9kIGhlYWRlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ic2hvdy5jbGFzcyIgc2VsZWN0PSInJyIvPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisJPHhzbDppZiB0ZXN0PSJib29sZWFuKCRzaG93LmNsYXNzKSI+CisJICAgIDx0aD5DbGFzczwvdGg+CisJPC94c2w6aWY+CisgICAgICAgIDx0aD5OYW1lPC90aD4KKyAgICAgICAgPHRoPlN0YXR1czwvdGg+CisgICAgICAgIDx0aCB3aWR0aD0iODAlIj5UeXBlPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBjbGFzcyBpbmZvcm1hdGlvbiAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBlcnJvcnNbLiZndDsgMF0iPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGZhaWx1cmVzWy4mZ3Q7IDBdIj5GYWlsdXJlPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5QYXNzPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDx0ZD48YSB0aXRsZT0iRGlzcGxheSBhbGwgdGVzdHMiIGhyZWY9IntAaWR9X3tAbmFtZX0uaHRtbCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvdGQ+CisgICAgICAgIDx0ZD48YSB0aXRsZT0iRGlzcGxheSBhbGwgdGVzdHMiIGhyZWY9IntAaWR9X3tAbmFtZX0uaHRtbCI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdGVzdHMiLz48L2E+PC90ZD4KKyAgICAgICAgPHRkPgorCSAgICA8eHNsOmNob29zZT4KKwkJPHhzbDp3aGVuIHRlc3Q9IkBlcnJvcnMgIT0gMCI+CisJCSAgICA8YSB0aXRsZT0iRGlzcGxheSBvbmx5IGVycm9ycyIgaHJlZj0ie0BpZH1fe0BuYW1lfS1lcnJvcnMuaHRtbCI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZXJyb3JzIi8+PC9hPgorCQk8L3hzbDp3aGVuPgorCQk8eHNsOm90aGVyd2lzZT4KKwkJICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGVycm9ycyIvPgorCQk8L3hzbDpvdGhlcndpc2U+CisJICAgIDwveHNsOmNob29zZT4KKwk8L3RkPgorICAgICAgICA8dGQ+CisJICAgIDx4c2w6Y2hvb3NlPgorCQk8eHNsOndoZW4gdGVzdD0iQGZhaWx1cmVzICE9IDAiPgorCQkgICAgPGEgdGl0bGU9IkRpc3BsYXkgb25seSBmYWlsdXJlcyIgaHJlZj0ie0BpZH1fe0BuYW1lfS1mYWlscy5odG1sIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYWlsdXJlcyIvPjwvYT4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDpvdGhlcndpc2U+CisJCSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYWlsdXJlcyIvPgorCQk8L3hzbDpvdGhlcndpc2U+CisJICAgIDwveHNsOmNob29zZT4KKwk8L3RkPgorICAgICAgICA8dGQ+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IkB0aW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdGltZXN0YW1wIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGhvc3RuYW1lIi8+PC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJyciLz4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+VGFibGVSb3dDb2xvcjwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorCTx4c2w6dmFyaWFibGUgbmFtZT0iY2xhc3MuaHJlZiI+CisJICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQodHJhbnNsYXRlKC4uL0BwYWNrYWdlLCcuJywnLycpLCAnLycsIC4uL0BpZCwgJ18nLCAuLi9AbmFtZSwgJy5odG1sJykiLz4KKwk8L3hzbDp2YXJpYWJsZT4KKwk8eHNsOmlmIHRlc3Q9ImJvb2xlYW4oJHNob3cuY2xhc3MpIj4KKwkgICAgPHRkPjxhIGhyZWY9InskY2xhc3MuaHJlZn0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIvPjwvYT48L3RkPgorCTwveHNsOmlmPgorICAgICAgICA8dGQ+CisJICAgIDxhIG5hbWU9IntAbmFtZX0iLz4KKwkgICAgPHhzbDpjaG9vc2U+CisJCTx4c2w6d2hlbiB0ZXN0PSJib29sZWFuKCRzaG93LmNsYXNzKSI+CisJCSAgICA8YSBocmVmPSJ7Y29uY2F0KCRjbGFzcy5ocmVmLCAnIycsIEBuYW1lKX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDpvdGhlcndpc2U+CisJCSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKwkJPC94c2w6b3RoZXJ3aXNlPgorCSAgICA8L3hzbDpjaG9vc2U+CisJPC90ZD4KKyAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSI+CisgICAgICAgICAgICAgICAgPHRkPkZhaWx1cmU8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImZhaWx1cmUiLz48L3RkPgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJlcnJvciI+CisgICAgICAgICAgICAgICAgPHRkPkVycm9yPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJlcnJvciIvPjwvdGQ+CisgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgPHRkPlN1Y2Nlc3M8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48L3RkPgorICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBOb3RlIDogdGhlIGJlbG93IHRlbXBsYXRlIGVycm9yIGFuZCBmYWlsdXJlIGFyZSB0aGUgc2FtZSBzdHlsZQorICAgICAgICAgICAgc28ganVzdCBjYWxsIHRoZSBzYW1lIHN0eWxlIHN0b3JlIGluIHRoZSB0b29sa2l0IHRlbXBsYXRlIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZmFpbHVyZSI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJlcnJvciI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIFN0eWxlIGZvciB0aGUgZXJyb3IgYW5kIGZhaWx1cmUgaW4gdGhlIHRlc3RjYXNlIHRlbXBsYXRlIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIj4KKyAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAbWVzc2FnZSkiPk4vQTwveHNsOndoZW4+CisgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXNzYWdlIi8+CisgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICA8L3hzbDpjaG9vc2U+CisgICAgPCEtLSBkaXNwbGF5IHRoZSBzdGFja3RyYWNlIC0tPgorICAgIDxici8+PGJyLz4KKyAgICA8Y29kZT4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0iLiIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvY29kZT4KKyAgICA8IS0tIHRoZSBsYXR0ZXIgaXMgYmV0dGVyIGJ1dCBtaWdodCBiZSBwcm9ibGVtYXRpYyBmb3Igbm9uLTIxIiBtb25pdG9ycy4uLiAtLT4KKyAgICA8IS0tcHJlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9wcmUtLT4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJzdHJpbmciLz4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InRtcDEiIHNlbGVjdD0ic3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHN0cmluZyksJ1wnLCdcXCcpIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAyIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCR0bXAxKSwmcXVvdDsnJnF1b3Q7LCZxdW90O1wmYXBvczsmcXVvdDspIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0bXAyIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgdGVtcGxhdGUgdGhhdCB3aWxsIGNvbnZlcnQgYSBjYXJyaWFnZSByZXR1cm4gaW50byBhIGJyIHRhZworICAgIEBwYXJhbSB3b3JkIHRoZSB0ZXh0IGZyb20gd2hpY2ggdG8gY29udmVydCBDUiB0byBCUiB0YWcKKy0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9IndvcmQiLz4KKyAgICA8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0nc3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHdvcmQpLCImI3hBOyIsIiZsdDtici8+IiknLz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCR2YWx1ZSwnMC4wMDAnKSIvPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwJScpIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvYnVpbGQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzAxNjVhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL2J1aWxkLnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKworPCEtLQorICAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJubyI+CisKKyAgPHByb3BlcnR5IG5hbWU9Im91dCIgbG9jYXRpb249Im91dHB1dCIvPgorICA8cHJvcGVydHkgbmFtZT0iaW4iIGxvY2F0aW9uPSJpbnB1dCIvPgorCisgIDx0YXJnZXQgbmFtZT0ibm8iPgorICAgIDxmYWlsPkZvciB0ZXN0cyBvbmx5PC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNldFVwIj4KKyAgICA8bWtkaXIgZGlyPSIke291dH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7b3V0fSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJc284ODU5LTEiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8bmF0aXZlMmFzY2lpIGVuY29kaW5nPSJJU084ODU5LTEiIGRlc3Q9IiR7b3V0fSIKKyAgICAgICAgICAgICAgICAgIHNyYz0iJHtpbn0iIGluY2x1ZGVzPSJpc284ODU5LTEuKiIvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvZXhwZWN0ZWQvaXNvODg1OS0xLnRlc3QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvZXhwZWN0ZWQvaXNvODg1OS0xLnRlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwYWNjOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9leHBlY3RlZC9pc284ODU5LTEudGVzdApAQCAtMCwwICsxIEBACitcdTAwZTRcdTAwZjZcdTAwZmNcdTAwYzRcdTAwZDZcdTAwZGNcdTAwZGYKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9pbnB1dC9pc284ODU5LTEudGVzdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9pbnB1dC9pc284ODU5LTEudGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWIzOTM0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL2lucHV0L2lzbzg4NTktMS50ZXN0CkBAIC0wLDAgKzEgQEAKK+T2/MTW3N8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uZXQvZnRwLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL25ldC9mdHAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjRiOGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uZXQvZnRwLnhtbApAQCAtMCwwICsxLDMzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJmdHAtdGVzdCIgYmFzZWRpcj0iLiI+CisgICAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uLy4uLy4uLy4uLy4uL2Z0cC5wcm9wZXJ0aWVzIi8+CisgICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KKyAgICA8cHJvcGVydHkgZmlsZT0iJHtlbnYuSE9NRX0vYW50LWZ0cC5wcm9wZXJ0aWVzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZ0cC51c2VyIiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZ0cC5ob3N0IiB2YWx1ZT0ibG9jYWxob3N0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZ0cC5wb3J0IiB2YWx1ZT0iMjEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZ0cC5wYXNzd29yZCIgdmFsdWU9InN1bnNoaW5lIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmdHAuZmlsZXNlcCIgdmFsdWU9Ii8iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idG1wLmRpciIgbG9jYXRpb249InRtcCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0bXAuZ2V0LmRpciIgbG9jYXRpb249InRtcC5nZXQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idG1wLmxvY2FsIiBsb2NhdGlvbj0iJHt0bXAuZ2V0LmRpcn0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idG1wLnJlbW90ZSIgbG9jYXRpb249IiR7dG1wLmRpcn0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idHN0YW1wLmZvcm1hdCIgdmFsdWU9Inl5eXktTU0tZGQgSEg6bW0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2VydmVyLnRpbWVzdGFtcC5ncmFudWxhcml0eS5taWxsaXMiIHZhbHVlPSI2MDAwMCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmdHAuc2VydmVyLnRpbWV6b25lIiB2YWx1ZT0iR01UIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZ0cC5saXN0aW5nLmZpbGUiIHZhbHVlPSIvZGV2L251bGwiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZnRwLnJldHJpZXMiIHZhbHVlPSIyIi8+CisKKyAgICA8ZmlsZXNldCBkaXI9IiR7dG1wLmdldC5kaXJ9IiBpZD0iZmlsZXNldC1kZXN0aW5hdGlvbi13aXRoLXNlbGVjdG9yIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iYWxwaGEvKioiLz4KKyAgICAgICAgPGZpbGVuYW1lIG5hbWU9IioqL2FscGhhLnhtbCIgLz4KKyAgICA8L2ZpbGVzZXQ+CisgICAgPGZpbGVzZXQgZGlyPSIke3RtcC5kaXJ9IiBpZD0iZmlsZXNldC1zb3VyY2Utd2l0aG91dC1zZWxlY3RvciI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImFscGhhLyoqIi8+CisgICAgPC9maWxlc2V0PgorICAgIDxmaWxlc2V0IGRpcj0iJHt0bXAuZ2V0LmRpcn0iIGlkPSJmaWxlc2V0LWRlc3RpbmF0aW9uLXdpdGhvdXQtc2VsZWN0b3IiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJhbHBoYS8qKiIvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dG1wLmdldC5kaXJ9IiBpZD0iZmlsZXNldC1kZXN0aW5hdGlvbi1mb2xsb3dzeW1saW5rcyIgZm9sbG93c3ltbGlua3M9InRydWUiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJhbHBoYS8qKiIvPgorICAgIDwvZmlsZXNldD4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dG1wLmdldC5kaXJ9IiBpZD0iZmlsZXNldC1kZXN0aW5hdGlvbi1ub2ZvbGxvd3N5bWxpbmtzIiBmb2xsb3dzeW1saW5rcz0iZmFsc2UiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJhbHBoYS8qKiIvPgorICAgIDwvZmlsZXNldD4KKworICAgIDxmaWxlbGlzdCBkaXI9IiR7dG1wLmxvY2FsfSIgaWQ9InRpbWVkLWZpbGVzIiBmaWxlcz0iQS50aW1lZCxCLnRpbWVkLEMudGltZWQsRC50aW1lZCIvPgorCisgICAgPHBhdHRlcm5zZXQgaWQ9InRpbWVkLXRlc3QtZmlsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJBLnRpbWVkIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkIudGltZWQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iQy50aW1lZCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJELnRpbWVkIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJzZXR1cCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7dG1wLmdldC5kaXJ9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0vYWxwaGEvYmV0YS9nYW1tYSIvPgorICAgICAgICA8dG91Y2ggZmlsZT0iJHt0bXAuZGlyfS9hbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCIvPgorICAgICAgICA8dG91Y2ggZmlsZT0iJHt0bXAuZGlyfS9hbHBoYS9iZXRhL2JldGEueG1sIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImZ0cC1nZXQtd2l0aC1zZWxlY3RvciI+CisgICAgICAgIDxmdHAgYWN0aW9uPSJnZXQiCisgICAgICAgICAgICBzZXJ2ZXI9IiR7ZnRwLmhvc3R9IgorICAgICAgICAgICAgdXNlcmlkPSIke2Z0cC51c2VyfSIKKyAgICAgICAgICAgIHBhc3N3b3JkPSIke2Z0cC5wYXNzd29yZH0iCisgICAgICAgICAgICBzZXBhcmF0b3I9IiR7ZnRwLmZpbGVzZXB9IgorICAgICAgICAgICAgcmVtb3RlZGlyPSIke3RtcC5kaXJ9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJmaWxlc2V0LWRlc3RpbmF0aW9uLXdpdGgtc2VsZWN0b3IiLz4KKyAgICAgICAgPC9mdHA+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJjaGlsZHJlbi1vZi1leGNsdWRlZC1kaXItc2V0dXAiIGRlcGVuZHM9InNldHVwIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0bXAuZGlyfS9kZWx0YSIvPgorICAgICAgICA8dG91Y2ggZmlsZT0iJHt0bXAuZGlyfS9kZWx0YS9kZWx0YS54bWwiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0bXAuZGlyfSIgcXVpZXQ9InRydWUiLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dG1wLmdldC5kaXJ9IiBxdWlldD0idHJ1ZSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0ic3ltbGluay1zZXR1cCIgZGVwZW5kcz0ic2V0dXAiPgorICAgICAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9L2Vwc2lsb24vZ2FtbWEiLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dG1wLmRpcn0vYWxwaGEvYmV0YSIvPgorICAgICAgICA8c3ltbGluayBsaW5rPSIke3RtcC5kaXJ9L2FscGhhL2JldGEiIHJlc291cmNlPSIke3RtcC5kaXJ9L2Vwc2lsb24iLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9IiR7dG1wLmRpcn0vYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImZ0cC1nZXQtZGlyZWN0b3J5LXN5bWJvbGljLWxpbmsiIGRlcGVuZHM9InN5bWxpbmstc2V0dXAiPgorICAgICAgICA8ZnRwIGFjdGlvbj0iZ2V0IgorICAgICAgICAgICAgc2VydmVyPSIke2Z0cC5ob3N0fSIKKyAgICAgICAgICAgIHVzZXJpZD0iJHtmdHAudXNlcn0iCisgICAgICAgICAgICBwYXNzd29yZD0iJHtmdHAucGFzc3dvcmR9IgorICAgICAgICAgICAgc2VwYXJhdG9yPSIke2Z0cC5maWxlc2VwfSIKKyAgICAgICAgICAgIHJlbW90ZWRpcj0iJHt0bXAuZGlyfSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJmaWxlc2V0LWRlc3RpbmF0aW9uLWZvbGxvd3N5bWxpbmtzIi8+CisgICAgICAgIDwvZnRwPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iZnRwLWdldC1kaXJlY3Rvcnktbm8tc3ltYm9saWMtbGluayIgZGVwZW5kcz0ic3ltbGluay1zZXR1cCI+CisgICAgICAgIDxmdHAgYWN0aW9uPSJnZXQiCisgICAgICAgICAgICBzZXJ2ZXI9IiR7ZnRwLmhvc3R9IgorICAgICAgICAgICAgdXNlcmlkPSIke2Z0cC51c2VyfSIKKyAgICAgICAgICAgIHBhc3N3b3JkPSIke2Z0cC5wYXNzd29yZH0iCisgICAgICAgICAgICBzZXBhcmF0b3I9IiR7ZnRwLmZpbGVzZXB9IgorICAgICAgICAgICAgcmVtb3RlZGlyPSIke3RtcC5kaXJ9IgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9ImZpbGVzZXQtZGVzdGluYXRpb24tbm9mb2xsb3dzeW1saW5rcyIvPgorICAgICAgICA8L2Z0cD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InN5bWxpbmstZmlsZS1zZXR1cCIgZGVwZW5kcz0ic2V0dXAiPgorICAgICAgICA8ZGVsZXRlIGZpbGU9IiR7dG1wLmRpcn0vYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwiLz4KKyAgICAgICAgPHN5bWxpbmsgbGluaz0iJHt0bXAuZGlyfS9hbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCIKKyAgICAgICAgICAgIHJlc291cmNlPSIke3RtcC5kaXJ9L2FscGhhL2JldGEvYmV0YS54bWwiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImZ0cC1kZWxldGUiPgorICAgICAgICA8IS0tIHRoaXMgdGFyZ2V0IGNhbiBwcm9kdWNlIGFuIGVycm9yIGlmIHRoZSBybWRpciBkb2VzIG5vdCB3b3JrIC0tPgorICAgICAgICA8IS0tIHRoZXJlIGNhbiBiZSBwcm9ibGVtcyB3aXRoIHRoZSBybWRpciBhY3Rpb24gaWYgdGhlIGRpcmVjdG9yaWVzIGFyZSBub3QgcmVtb3ZlZCBpbiBhIHByb3BlciBvcmRlciAtLT4KKyAgICAgICAgPCEtLSB3aGljaCBtZWFucyBiZWdpbm5pbmcgYnkgdGhlIGxlYXZlcyBvZiB0aGUgdHJlZSwgZ29pbmcgYmFjayB0byB0aGUgdHJ1bmsgLS0+CisgICAgICAgIDxmdHAgYWN0aW9uPSJkZWwiCisgICAgICAgICAgICBzZXJ2ZXI9IiR7ZnRwLmhvc3R9IgorICAgICAgICAgICAgdXNlcmlkPSIke2Z0cC51c2VyfSIKKyAgICAgICAgICAgIHBhc3N3b3JkPSIke2Z0cC5wYXNzd29yZH0iCisgICAgICAgICAgICByZW1vdGVkaXI9IiR7dG1wLmRpcn0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RtcC5nZXQuZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKioiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9mdHA+CisgICAgICAgIDxmdHAgYWN0aW9uPSJybWRpciIKKyAgICAgICAgICAgIHNlcnZlcj0iJHtmdHAuaG9zdH0iCisgICAgICAgICAgICB1c2VyaWQ9IiR7ZnRwLnVzZXJ9IgorICAgICAgICAgICAgcGFzc3dvcmQ9IiR7ZnRwLnBhc3N3b3JkfSIKKyAgICAgICAgICAgIHJlbW90ZWRpcj0iJHt0bXAuZGlyfSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wLmdldC5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2Z0cD4KKyAgICA8L3RhcmdldD4gICAKKworICAgIDx0YXJnZXQgbmFtZT0idGltZWQudGVzdC5zZXR1cCI+CisgICAgICAgIDx0b3VjaD4KKyAgICAgICAgICAgIDxmaWxlbGlzdCByZWZpZD0idGltZWQtZmlsZXMiLz4KKyAgICAgICAgPC90b3VjaD4gICAgCisgICAgICAgIDxmdHAgYWN0aW9uPSJwdXQiCisgICAgICAgICAgICBzZXJ2ZXI9IiR7ZnRwLmhvc3R9IgorICAgICAgICAgICAgdXNlcmlkPSIke2Z0cC51c2VyfSIKKyAgICAgICAgICAgIHBhc3N3b3JkPSIke2Z0cC5wYXNzd29yZH0iCisgICAgICAgICAgICBzZXBhcmF0b3I9IiR7ZnRwLmZpbGVzZXB9IgorICAgICAgICAgICAgcmVtb3RlZGlyPSIke3RtcC5yZW1vdGV9IgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RtcC5sb2NhbH0iPgorICAgICAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJ0aW1lZC10ZXN0LWZpbGVzIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvZnRwPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0aW1lZC50ZXN0LnB1dC5vbGRlciI+CisgICAgICAgIDx0c3RhbXA+CisgICAgICAgICAgICA8Zm9ybWF0IHByb3BlcnR5PSJvbmUubWludXRlLm9sZGVyIiBwYXR0ZXJuPSIke3RzdGFtcC5mb3JtYXR9IiBvZmZzZXQ9Ii02MCIgdW5pdD0ic2Vjb25kIi8+CisgICAgICAgIDwvdHN0YW1wPgorCisgICAgICAgIDx0b3VjaCBkYXRldGltZT0iJHtvbmUubWludXRlLm9sZGVyfSIgcGF0dGVybj0iJHt0c3RhbXAuZm9ybWF0fSIgdmVyYm9zZT0idHJ1ZSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wLnJlbW90ZX0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkEudGltZWQiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC90b3VjaD4KKyAgICAgICAgPGZ0cCBhY3Rpb249InB1dCIKKyAgICAgICAgICAgIHNlcnZlcj0iJHtmdHAuaG9zdH0iCisgICAgICAgICAgICB1c2VyaWQ9IiR7ZnRwLnVzZXJ9IgorICAgICAgICAgICAgcGFzc3dvcmQ9IiR7ZnRwLnBhc3N3b3JkfSIKKyAgICAgICAgICAgIHNlcGFyYXRvcj0iJHtmdHAuZmlsZXNlcH0iCisgICAgICAgICAgICByZW1vdGVkaXI9IiR7dG1wLnJlbW90ZX0iCisgICAgICAgICAgICBuZXdlcj0idHJ1ZSIKKyAgICAgICAgICAgIHNlcnZlclRpbWVab25lQ29uZmlnPSIke2Z0cC5zZXJ2ZXIudGltZXpvbmV9IgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RtcC5sb2NhbH0iPgorICAgICAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJ0aW1lZC10ZXN0LWZpbGVzIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvZnRwPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0idGltZWQudGVzdC5nZXQub2xkZXIiPgorICAgICAgICA8dHN0YW1wPgorICAgICAgICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0iZml2ZS5taW51dGVzLm9sZGVyIiBwYXR0ZXJuPSIke3RzdGFtcC5mb3JtYXR9IiBvZmZzZXQ9Ii01IiB1bml0PSJtaW51dGUiLz4KKyAgICAgICAgPC90c3RhbXA+CisKKyAgICAgICAgPHRvdWNoIGRhdGV0aW1lPSIke2ZpdmUubWludXRlcy5vbGRlcn0iIHBhdHRlcm49IiR7dHN0YW1wLmZvcm1hdH0iIHZlcmJvc2U9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RtcC5sb2NhbH0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkEudGltZWQiLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJDLnRpbWVkIi8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iRC50aW1lZCIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L3RvdWNoPgorICAgICAgICA8ZnRwIGFjdGlvbj0iZ2V0IgorICAgICAgICAgICAgc2VydmVyPSIke2Z0cC5ob3N0fSIKKyAgICAgICAgICAgIHVzZXJpZD0iJHtmdHAudXNlcn0iCisgICAgICAgICAgICBwYXNzd29yZD0iJHtmdHAucGFzc3dvcmR9IgorICAgICAgICAgICAgc2VwYXJhdG9yPSIke2Z0cC5maWxlc2VwfSIKKyAgICAgICAgICAgIHJlbW90ZWRpcj0iJHt0bXAucmVtb3RlfSIKKyAgICAgICAgICAgIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIgorICAgICAgICAgICAgbmV3ZXI9InRydWUiCisgICAgICAgICAgICBzZXJ2ZXJUaW1lWm9uZUNvbmZpZz0iJHtmdHAuc2VydmVyLnRpbWV6b25lfSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0bXAubG9jYWx9Ij4KKyAgICAgICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0idGltZWQtdGVzdC1maWxlcyIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2Z0cD4KKyAgICA8L3RhcmdldD4KKyAgICAKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbmZpZ3VyYXRpb24uMSI+CisgICAgICAgIDxmdHAgYWN0aW9uPSJsaXN0IgorICAgICAgICAgICAgc2VydmVyPSIke2Z0cC5ob3N0fSIKKyAgICAgICAgICAgIHVzZXJpZD0iJHtmdHAudXNlcn0iCisgICAgICAgICAgICBwYXNzd29yZD0iJHtmdHAucGFzc3dvcmR9IgorICAgICAgICAgICAgc2VwYXJhdG9yPSIke2Z0cC5maWxlc2VwfSIKKyAgICAgICAgICAgIHJlbW90ZWRpcj0iJHt0bXAucmVtb3RlfSIKKyAgICAgICAgICAgIHNlcnZlclRpbWVab25lQ29uZmlnPSIke2Z0cC5zZXJ2ZXIudGltZXpvbmV9IgorICAgICAgICAgICAgbGlzdGluZz0iJHtmdHAubGlzdGluZy5maWxlfSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wLmxvY2FsfSIvPgorICAgICAgICAgPC9mdHA+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJjb25maWd1cmF0aW9uLjIiPgorICAgICAgICA8ZnRwIGFjdGlvbj0ibGlzdCIKKyAgICAgICAgICAgIHNlcnZlcj0iJHtmdHAuaG9zdH0iCisgICAgICAgICAgICB1c2VyaWQ9IiR7ZnRwLnVzZXJ9IgorICAgICAgICAgICAgcGFzc3dvcmQ9IiR7ZnRwLnBhc3N3b3JkfSIKKyAgICAgICAgICAgIHNlcGFyYXRvcj0iJHtmdHAuZmlsZXNlcH0iCisgICAgICAgICAgICByZW1vdGVkaXI9IiR7dG1wLnJlbW90ZX0iCisgICAgICAgICAgICBzZXJ2ZXJUaW1lWm9uZUNvbmZpZz0iJHtmdHAuc2VydmVyLnRpbWV6b25lfSIKKyAgICAgICAgICAgIGxpc3Rpbmc9IiR7ZnRwLmxpc3RpbmcuZmlsZX0iCisgICAgICAgICAgICBzeXN0ZW1UeXBlS2V5PSJXSU5ET1dTIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0bXAubG9jYWx9Ii8+CisgICAgICAgICA8L2Z0cD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImNvbmZpZ3VyYXRpb24uMyI+CisgICAgICAgIDxmdHAgYWN0aW9uPSJsaXN0IgorICAgICAgICAgICAgc2VydmVyPSIke2Z0cC5ob3N0fSIKKyAgICAgICAgICAgIHVzZXJpZD0iJHtmdHAudXNlcn0iCisgICAgICAgICAgICBwYXNzd29yZD0iJHtmdHAucGFzc3dvcmR9IgorICAgICAgICAgICAgc2VwYXJhdG9yPSIke2Z0cC5maWxlc2VwfSIKKyAgICAgICAgICAgIHJlbW90ZWRpcj0iJHt0bXAucmVtb3RlfSIKKyAgICAgICAgICAgIGRlZmF1bHREYXRlRm9ybWF0Q29uZmlnPSJ5eXl5L01NL2RkIEhIOm1tIgorICAgICAgICAgICAgbGlzdGluZz0iJHtmdHAubGlzdGluZy5maWxlfSIKKyAgICAgICAgICAgIHN5c3RlbVR5cGVLZXk9IlVOSVgiCisgICAgICAgICAgICA+CisgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RtcC5sb2NhbH0iLz4KKyAgICAgICAgIDwvZnRwPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iY29uZmlndXJhdGlvbi5sYW5nLmdvb2QiPgorICAgICAgICA8ZnRwIGFjdGlvbj0ibGlzdCIKKyAgICAgICAgICAgIHNlcnZlcj0iJHtmdHAuaG9zdH0iCisgICAgICAgICAgICB1c2VyaWQ9IiR7ZnRwLnVzZXJ9IgorICAgICAgICAgICAgcGFzc3dvcmQ9IiR7ZnRwLnBhc3N3b3JkfSIKKyAgICAgICAgICAgIHNlcGFyYXRvcj0iJHtmdHAuZmlsZXNlcH0iCisgICAgICAgICAgICByZW1vdGVkaXI9IiR7dG1wLnJlbW90ZX0iCisgICAgICAgICAgICBzZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWc9ImRlIgorICAgICAgICAgICAgbGlzdGluZz0iJHtmdHAubGlzdGluZy5maWxlfSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wLmxvY2FsfSIvPgorICAgICAgICAgPC9mdHA+CisgICAgPC90YXJnZXQ+ICAgIAorICAgIDx0YXJnZXQgbmFtZT0iY29uZmlndXJhdGlvbi5sYW5nLmJhZCI+CisgICAgICAgIDxmdHAgYWN0aW9uPSJsaXN0IgorICAgICAgICAgICAgc2VydmVyPSIke2Z0cC5ob3N0fSIKKyAgICAgICAgICAgIHVzZXJpZD0iJHtmdHAudXNlcn0iCisgICAgICAgICAgICBwYXNzd29yZD0iJHtmdHAucGFzc3dvcmR9IgorICAgICAgICAgICAgc2VwYXJhdG9yPSIke2Z0cC5maWxlc2VwfSIKKyAgICAgICAgICAgIHJlbW90ZWRpcj0iJHt0bXAucmVtb3RlfSIKKyAgICAgICAgICAgIHNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZz0iUVEiCisgICAgICAgICAgICBsaXN0aW5nPSIke2Z0cC5saXN0aW5nLmZpbGV9IgorICAgICAgICAgICAgPgorICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0bXAubG9jYWx9Ii8+CisgICAgICAgICA8L2Z0cD4KKyAgICA8L3RhcmdldD4gICAgCisgICAgPHRhcmdldCBuYW1lPSJjb25maWd1cmF0aW9uLm5vbmUiPgorICAgICAgICA8ZnRwIGFjdGlvbj0ibGlzdCIKKyAgICAgICAgICAgIHNlcnZlcj0iJHtmdHAuaG9zdH0iCisgICAgICAgICAgICB1c2VyaWQ9IiR7ZnRwLnVzZXJ9IgorICAgICAgICAgICAgcGFzc3dvcmQ9IiR7ZnRwLnBhc3N3b3JkfSIKKyAgICAgICAgICAgIHNlcGFyYXRvcj0iJHtmdHAuZmlsZXNlcH0iCisgICAgICAgICAgICByZW1vdGVkaXI9IiR7dG1wLnJlbW90ZX0iCisgICAgICAgICAgICBsaXN0aW5nPSIke2Z0cC5saXN0aW5nLmZpbGV9IgorICAgICAgICAgICAgPgorICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0bXAubG9jYWx9Ii8+CisgICAgICAgICA8L2Z0cD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImZ0cC1nZXQtd2l0aC1zZWxlY3Rvci1yZXRyeWFibGUiPgorICAgICAgICA8ZnRwIGFjdGlvbj0iZ2V0IgorICAgICAgICAgICAgc2VydmVyPSIke2Z0cC5ob3N0fSIKKyAgICAgICAgICAgIHVzZXJpZD0iJHtmdHAudXNlcn0iCisgICAgICAgICAgICBwYXNzd29yZD0iJHtmdHAucGFzc3dvcmR9IgorICAgICAgICAgICAgc2VwYXJhdG9yPSIke2Z0cC5maWxlc2VwfSIKKyAgICAgICAgICAgIHJlbW90ZWRpcj0iJHt0bXAuZGlyfSIKKyAgICAgICAgICAgIHJldHJpZXNBbGxvd2VkPSIke2Z0cC5yZXRyaWVzfSIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJmaWxlc2V0LWRlc3RpbmF0aW9uLXdpdGgtc2VsZWN0b3IiLz4KKyAgICAgICAgPC9mdHA+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWluaXRpYWwtY29tbWFuZCI+CisgICAgICAgIDxmdHAgYWN0aW9uPSJwdXQiCisgICAgICAgICAgICBzZXJ2ZXI9IiR7ZnRwLmhvc3R9IgorICAgICAgICAgICAgdXNlcmlkPSIke2Z0cC51c2VyfSIKKyAgICAgICAgICAgIHBhc3N3b3JkPSIke2Z0cC5wYXNzd29yZH0iCisgICAgICAgICAgICBzZXBhcmF0b3I9IiR7ZnRwLmZpbGVzZXB9IgorICAgICAgICAgICAgcmVtb3RlZGlyPSIke3RtcC5yZW1vdGV9IgorICAgICAgICAgICAgaW5pdGlhbFNpdGVDb21tYW5kPSJ1bWFzayAyMjIiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG1wLmxvY2FsfSI+CisgICAgICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9InRpbWVkLXRlc3QtZmlsZXMiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9mdHA+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3Qtc2l0ZS1hY3Rpb24iPgorICAgICAgICA8ZnRwIGFjdGlvbj0ic2l0ZSIKKyAgICAgICAgICAgIHNlcnZlcj0iJHtmdHAuaG9zdH0iCisgICAgICAgICAgICB1c2VyaWQ9IiR7ZnRwLnVzZXJ9IgorICAgICAgICAgICAgcGFzc3dvcmQ9IiR7ZnRwLnBhc3N3b3JkfSIKKyAgICAgICAgICAgIHNlcGFyYXRvcj0iJHtmdHAuZmlsZXNlcH0iCisgICAgICAgICAgICByZW1vdGVkaXI9IiR7dG1wLnJlbW90ZX0iCisgICAgICAgICAgICBzaXRlQ29tbWFuZD0idW1hc2sgMjIyIgorICAgICAgICAgICAgPgorICAgICAgICA8L2Z0cD4KKyAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9jaGFuZ2VyZW51bWJlcmVkLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL2NoYW5nZXJlbnVtYmVyZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5N2YwNTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9jaGFuZ2VyZW51bWJlcmVkLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gYXV0aG9yIEFudG9pbmUgTGV2eS1MYW1iZXJ0ICAtLT4KKzwhLS0gdGhpcyBmaWxlIGRlbW9uc3RyYXRlcyB0aGF0IHA0LmNoYW5nZSB3aWxsIGJlIG1vZGlmaWVkIGJ5IHA0c3VibWl0IC0tPgorPCEtLSBpZiB0aGUgY2hhbmdlIG51bWJlciBpcyBtb2RpZmllZCBieSB0aGUgUGVyZm9yY2UgZGFlbW9uIGR1cmluZyB0aGUgc3VibWlzc2lvbiAtLT4KKzxwcm9qZWN0IG5hbWU9ImJ1aWxkMSIgZGVmYXVsdD0icnVudGVzdCI+CisgIDx0YXJnZXQgbmFtZT0icnVudGVzdCI+CisgICAgPHA0Y2hhbmdlLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2hhbmdlMSIgdmFsdWU9IiR7cDQuY2hhbmdlfSIgLz4KKyAgICA8ZWNobz4KK2RvaW5nIGEgZmlyc3QgY2hhbmdlICR7Y2hhbmdlMX0KKzwvZWNobz4KKyAgICA8cDRjaGFuZ2UvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGFuZ2UyIiB2YWx1ZT0iJHtwNC5jaGFuZ2V9IiAvPgorICAgIDxlY2hvPgorZG9pbmcgYSBzZWNvbmQgY2hhbmdlICR7Y2hhbmdlMn0KKzwvZWNobz4KKyAgICA8cDRlZGl0IHZpZXc9Ii8vZGVwb3QvZm9vYmFyIiBjaGFuZ2U9IiR7Y2hhbmdlMX0iIC8+CisgICAgPHA0ZWRpdCB2aWV3PSIvL2RlcG90L2hlbGxvIiBjaGFuZ2U9IiR7Y2hhbmdlMn0iIC8+CisgICAgPGVjaG8+CitiZWZvcmUgc3VibWl0dGluZyBvZiBoZWxsbyBjaGFuZ2UgJHtjaGFuZ2UyfSBwNC5jaGFuZ2UgaXMgbm93ICR7cDQuY2hhbmdlfQorPC9lY2hvPgorICAgIDxwNHN1Ym1pdCBjaGFuZ2U9IiR7Y2hhbmdlMn0iLz4KKyAgICA8ZWNobz4KK2FmdGVyIHN1Ym1pdHRpbmcgb2YgaGVsbG8gcDQuY2hhbmdlIGlzIG5vdyAke3A0LmNoYW5nZX0KKzwvZWNobz4KKyAgICA8ZWNobz4KK2JlZm9yZSBzdWJtaXR0aW5nIG9mIGZvb2JhciBjaGFuZ2UgJHtjaGFuZ2UxfQorPC9lY2hvPgorICAgIDxwNHN1Ym1pdCBjaGFuZ2U9IiR7Y2hhbmdlMX0iLz4KKyAgICA8ZWNobz4KK2FmdGVyIHN1Ym1pdHRpbmcgb2YgZm9vYmFyIHA0LmNoYW5nZSBpcyBub3cgJHtwNC5jaGFuZ2V9Cis8L2VjaG8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvbmVlZHNyZXNvbHZlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL25lZWRzcmVzb2x2ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjOTBlNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL25lZWRzcmVzb2x2ZS54bWwKQEAgLTAsMCArMSw3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIGF1dGhvciBBbnRvaW5lIExldnktTGFtYmVydCAtLT4KKzwhLS0gdGhpcyB0ZXN0IHNob3dzIHRoYXQgcDQgc3VibWl0IGNhbiBub3cgaW5kaWNhdGUgdGhhdCBhIGZpbGUgbmVlZHMgdG8gYmUgcmVzb2x2ZWQgLS0+Cis8IS0tIGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0LCBlZGl0IHRoaXMgeG1sIGFuZCBjaGFuZ2UgdGhlIDUgcHJvcGVydGllcyBhdCB0aGUgdG9wIHRvIHZhbHVlcyB3aGljaCBtYWtlIHNlbnNlIG9uIHlvdXIgc3lzdGVtLS0+Cis8IS0tIHRoZSB0ZXN0IHVzZXMgdHdvIFBlcmZvcmNlIGNsaWVudCBzcGVjcyB3aGljaCBtdXN0IGV4aXN0IGJlZm9yZWhhbmQgLS0+Cis8IS0tIGFsc28gdXNpbmcgYm90aCBjbGllbnQgc3BlY3MgeW91IHNob3VsZCBiZSBhYmxlIHRvIGVkaXQgdGhlIGZpbGUgJHtkZXBvdF9maWxlX3NwZWN9IC0tPgorPHByb2plY3QgbmFtZT0idGVzdHJlc29sdmUiIGRlZmF1bHQ9ICJ0ZXN0Ij4KKyAgPHByb3BlcnR5IG5hbWU9ImZpcnN0X2NsaWVudCIgdmFsdWU9ImxldnlhbnRfZGV2X2FudCIvPgorICA8cHJvcGVydHkgbmFtZT0iZmlyc3RfY2xpZW50X3Jvb3QiIHZhbHVlPSJDOlxkZXZcZGVwb3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNlY29uZF9jbGllbnQiIHZhbHVlPSJsZXZ5YW50X2N5Z3dpbl90ZXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZWNvbmRfY2xpZW50X3Jvb3QiIHZhbHVlPSJDOlxkZXZcdGVzdCIvPgorICA8cHJvcGVydHkgbmFtZT0iZGVwb3RfZmlsZV9zcGVjIiB2YWx1ZT0iLy9kZXBvdC9mb29iYXIiLz4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Ij4KKyAgICA8cDRjaGFuZ2UgY2xpZW50PSIke2ZpcnN0X2NsaWVudH0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2hhbmdlMSIgdmFsdWU9IiR7cDQuY2hhbmdlfSIgLz4KKyAgICA8cDRjaGFuZ2UgY2xpZW50PSIke3NlY29uZF9jbGllbnR9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNoYW5nZTIiIHZhbHVlPSIke3A0LmNoYW5nZX0iIC8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImVkaXQiPgorCTxwYXJhbSBuYW1lPSJwNC5jbGllbnQiIHZhbHVlPSIke2ZpcnN0X2NsaWVudH0iLz4KKwk8cGFyYW0gbmFtZT0iY2xpZW50X3Jvb3QiIHZhbHVlPSIke2ZpcnN0X2NsaWVudF9yb290fSIvPgorCTxwYXJhbSBuYW1lPSJjaGFuZ2UiIHZhbHVlPSIke2NoYW5nZTF9Ii8+CisgICAgICA8L2FudGNhbGw+CisgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImVkaXQiPgorCTxwYXJhbSBuYW1lPSJwNC5jbGllbnQiIHZhbHVlPSIke3NlY29uZF9jbGllbnR9Ii8+CisJPHBhcmFtIG5hbWU9ImNsaWVudF9yb290IiB2YWx1ZT0iJHtzZWNvbmRfY2xpZW50X3Jvb3R9Ii8+CisJPHBhcmFtIG5hbWU9ImNoYW5nZSIgdmFsdWU9IiR7Y2hhbmdlMn0iLz4KKyAgICAgIDwvYW50Y2FsbD4KKyAgICAgIDxhbnRjYWxsIHRhcmdldD0ic3VibWl0Ij4KKwk8cGFyYW0gbmFtZT0icDQuY2xpZW50IiB2YWx1ZT0iJHtmaXJzdF9jbGllbnR9Ii8+CisJPHBhcmFtIG5hbWU9ImNoYW5nZSIgdmFsdWU9IiR7Y2hhbmdlMX0iLz4KKyAgICAgIDwvYW50Y2FsbD4KKyAgICAgIDxhbnRjYWxsIHRhcmdldD0ic3VibWl0Ij4KKwk8cGFyYW0gbmFtZT0icDQuY2xpZW50IiB2YWx1ZT0iJHtzZWNvbmRfY2xpZW50fSIvPgorCTxwYXJhbSBuYW1lPSJjaGFuZ2UiIHZhbHVlPSIke2NoYW5nZTJ9Ii8+CisgICAgICA8L2FudGNhbGw+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJlZGl0Ij4KKyAgICA8ZWNobz4KK2RvaW5nIGEgIGNoYW5nZSAke2NoYW5nZX0gb24gIGNsaWVudCAke3A0LmNsaWVudH0KKzwvZWNobz4KKyAgICA8cDRlZGl0IGNoYW5nZT0iJHtjaGFuZ2V9IiB2aWV3PSIke2RlcG90X2ZpbGVfc3BlY30iLz4KKyAgICA8bWtkaXIgZGlyPSIke2NsaWVudF9yb290fS9kZXBvdCIvPgorICAgIDxlY2hvIGZpbGU9IiR7Y2xpZW50X3Jvb3R9L2RlcG90L2Zvb2JhciI+CitoZWxsbyAke3A0LmNsaWVudH0gJHtjaGFuZ2V9Cis8L2VjaG8+CisgIDwvdGFyZ2V0PgorICA8dGFyZ2V0IG5hbWU9InN1Ym1pdCI+CisgICAgPHA0c3VibWl0IGNoYW5nZT0iJHtjaGFuZ2V9IiBuZWVkc3Jlc29sdmVwcm9wZXJ0eT0ibmVlZHNyZXNvbHZlIiBjaGFuZ2Vwcm9wZXJ0eT0ibXljaGFuZ2UiLz4KKyAgICA8ZWNobz4KK3A0Lm5lZWRzcmVzb2x2ZSAke3A0Lm5lZWRzcmVzb2x2ZX0gYWZ0ZXIgc3VibWl0CisgICAgICAgIG5lZWRzcmVzb2x2ZXByb3BlcnR5ICR7bmVlZHNyZXNvbHZlfSBhZnRlciBzdWJtaXQKKyAgICAgICAgY2hhbmdlcHJvcGVydHkgJHtteWNoYW5nZX0gYWZ0ZXIgc3VibWl0Cis8L2VjaG8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Byb3BlcnR5ZmlsZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wcm9wZXJ0eWZpbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTM2ODEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wcm9wZXJ0eWZpbGUueG1sCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0icHJvcGVydHlmaWxlLXRlc3QiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgorCisgICA8cHJvcGVydHkgZmlsZT0icHJvcGVydHlmaWxlLmJ1aWxkLnByb3BlcnRpZXMiLz4KKworICAgPHRhcmdldCBuYW1lPSJtYWluIj4KKyAgICAgIDxmYWlsPgorICAgICAgICAgVGhpcyBmaWxlIGlzIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuLi4KKyAgICAgICAgIEBzZWUgUHJvcGVydHlGaWxlVGVzdC5qYXZhIGZvciBtb3JlIGluZm8uCisgICAgICA8L2ZhaWw+CisgICA8L3RhcmdldD4KKworICAgPHRhcmdldCBuYW1lPSJ1cGRhdGUtZXhpc3RpbmctcHJvcGVydGllcyI+CisgICAgICA8cHJvcGVydHlmaWxlCisgICAgICAgICAgZmlsZT0iJHt0ZXN0LnByb3BlcnR5ZmlsZX0iCisgICAgICAgICAgY29tbWVudD0idW5pdCB0ZXN0IGZvciB0aGUgcHJvcGVydHkgZmlsZSB0YXNrLi4uIiA+CisgICAgICAgIDxlbnRyeSAga2V5PSJmaXJzdG5hbWUiIHZhbHVlPSIke2ZpcnN0bmFtZX0iIC8+CisgICAgICAgIDxlbnRyeSAga2V5PSJsYXN0bmFtZSIgIHZhbHVlPSIke2xhc3RuYW1lfSIgLz4KKyAgICAgICAgPGVudHJ5ICBrZXk9ImVtYWlsIiAgICAgdmFsdWU9IiR7ZW1haWx9IiAvPgorICAgICAgICA8ZW50cnkgIGtleT0icGhvbmUiICAgICBkZWZhdWx0PSIke3Bob25lfSIgLz4KKyAgICAgICAgPGVudHJ5ICBrZXk9ImFnZSIgICAgICAgZGVmYXVsdD0iJHthZ2V9IiB0eXBlPSJpbnQiLz4KKyAgICAgICAgPGVudHJ5ICBrZXk9ImRhdGUiICAgICAgZGVmYXVsdD0iJHtkYXRlfSIgdHlwZT0iZGF0ZSIvPgorICAgICAgPC9wcm9wZXJ0eWZpbGU+CisKKyAgIDwvdGFyZ2V0PgorCisgICA8dGFyZ2V0IG5hbWU9ImV4ZXJjaXNlIj4KKyAgICAgPHByb3BlcnR5ZmlsZSBmaWxlPSIke3Rlc3QucHJvcGVydHlmaWxlfSI+CisgICAgICAgIDxlbnRyeSBrZXk9ImV4aXN0aW5nLnByb3AiCisgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICBkZWZhdWx0PSIyMyIvPgorICAgICAgICA8ZW50cnkga2V5PSJldGhhbnMuYmlydGgiCisgICAgICAgICAgICAgICB2YWx1ZT0iMjAwMi8wMS8yMSAxMjoxOCIKKyAgICAgICAgICAgICAgIHR5cGU9ImRhdGUiLz4KKyAgICAgICAgPGVudHJ5IGtleT0iZmlyc3QuYmlydGhkYXkiCisgICAgICAgICAgICAgICB2YWx1ZT0iMSIKKyAgICAgICAgICAgICAgIGRlZmF1bHQ9IjIwMDIvMDEvMjEiCisgICAgICAgICAgICAgICBwYXR0ZXJuPSJ5eXl5L01NL2RkIgorICAgICAgICAgICAgICAgdW5pdD0ieWVhciIKKyAgICAgICAgICAgICAgIHR5cGU9ImRhdGUiCisgICAgICAgICAgICAgICBvcGVyYXRpb249IisiLz4KKyAgICAgICAgPGVudHJ5IGtleT0iaW50LndpdGguZGVmYXVsdCIKKyAgICAgICAgICAgICAgIHZhbHVlPSIxIgorICAgICAgICAgICAgICAgZGVmYXVsdD0iMiIKKyAgICAgICAgICAgICAgIG9wZXJhdGlvbj0iKyIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgICAgICA8ZW50cnkga2V5PSJpbnQud2l0aG91dC52YWx1ZSIKKyAgICAgICAgICAgICAgIGRlZmF1bHQ9IjUiCisgICAgICAgICAgICAgICBvcGVyYXRpb249IisiCisgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICAgICAgPGVudHJ5IGtleT0iaW50LndpdGhvdXQuZGVmYXVsdCIKKyAgICAgICAgICAgICAgIHZhbHVlPSIxIgorICAgICAgICAgICAgICAgb3BlcmF0aW9uPSIrIgorICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgICAgIDxlbnRyeSBrZXk9InN0cmluZy53aXRoLmRlZmF1bHQiCisgICAgICAgICAgICAgICB2YWx1ZT0iJmd0OyIKKyAgICAgICAgICAgICAgIGRlZmF1bHQ9Ii0tIgorICAgICAgICAgICAgICAgb3BlcmF0aW9uPSIrIi8+CisgICAgICAgIDxlbnRyeSBrZXk9InN0cmluZy53aXRob3V0LmRlZmF1bHQiCisgICAgICAgICAgICAgICB2YWx1ZT0iLiIKKyAgICAgICAgICAgICAgIG9wZXJhdGlvbj0iKyIvPgorICAgICAgICA8ZW50cnkga2V5PSJvbGRlclRoYW5BV2VlayIKKyAgICAgICAgICAgICAgIHR5cGU9ImRhdGUiCisgICAgICAgICAgICAgICBkZWZhdWx0PSIwMjAxIgorICAgICAgICAgICAgICAgb3BlcmF0aW9uPSItIgorICAgICAgICAgICAgICAgdmFsdWU9IjgiCisgICAgICAgICAgICAgICBwYXR0ZXJuPSJNTWRkIi8+CisgICAgIDwvcHJvcGVydHlmaWxlPgorICAgICA8cHJvcGVydHkgZmlsZT0iJHt0ZXN0LnByb3BlcnR5ZmlsZX0iLz4KKyAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iY3JlYXRlZmlsZSI+CisgICAgICAgPGVjaG8gZmlsZT0iJHtvdmVyd3JpdGUudGVzdC5wcm9wZXJ0eWZpbGV9Ij4KKyBmb289MworICAgICAgIDwvZWNobz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImJ1Z0RlbW8xIiBkZXBlbmRzPSJjcmVhdGVmaWxlLGJ1Z0RlbW9Jbml0Ii8+CisgICAgPHRhcmdldCBuYW1lPSJidWdEZW1vMiIgZGVwZW5kcz0iYnVnRGVtb0luaXQiPgorICAgICAgICA8cHJvcGVydHkgZmlsZT0iJHtvdmVyd3JpdGUudGVzdC5wcm9wZXJ0eWZpbGV9Ii8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJidWdEZW1vSW5pdCI+CisgICAgICAgPHByb3BlcnR5ZmlsZSBmaWxlPSIke292ZXJ3cml0ZS50ZXN0LnByb3BlcnR5ZmlsZX0iPgorICAgICAgICAgIDxlbnRyeSBrZXk9ImZvbyIgZGVmYXVsdD0iMCIgdmFsdWU9IjEiIG9wZXJhdGlvbj0iKyIgdHlwZT0iaW50Ii8+CisgICAgICAgPC9wcm9wZXJ0eWZpbGU+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wdmNzLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3B2Y3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YmZjZmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wdmNzLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0icHZjcy10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhc2tkZWYgbmFtZT0icHZjcyIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QdmNzIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPHB2Y3MvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KKyAgICA8cHZjcyBwdmNzYmluPSIvaG9tZS90Yy9wcm9qZWN0cy9wdmNzYW50L3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzIiByZXBvc2l0b3J5PSIvbW50L3B2Y3MiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPHB2Y3MgcHZjc2Jpbj0iXGhvbWVcY3ZzXHB2Y3NhbnRcc3JjXGV0Y1x0ZXN0Y2FzZXNcdGFza2RlZnMiIHJlcG9zaXRvcnk9Ii9tbnQvcHZjcyIgcHZjc3Byb2plY3Q9Ii9xdmlrbmV0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgIDxwdmNzIHB2Y3NiaW49Ilxob21lXGN2c1xwdmNzYW50XHNyY1xldGNcdGVzdGNhc2VzXHRhc2tkZWZzIiByZXBvc2l0b3J5PSIvbW50L3B2Y3MiIHB2Y3Nwcm9qZWN0PSIvcXZpa25ldCIgd29ya3NwYWNlPSIvQC9QdWJsaWMvYnVpbGR3cyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q1IiBkZXNjcmlwdGlvbj0iR2V0IHRoZSBsYXRlc3QgZnJvbSBQVkNTIj4KKyAgICA8cHZjcyBwdmNzYmluPSIvaG9tZS9jdnMvcHZjc2FudC9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcyIgCisJCQkgcmVwb3NpdG9yeT0iLy9jdDRzZXJ2Mi9wdmNzL21vbml0b3IiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NiIgZGVzY3JpcHRpb249Ik5vIHBjbGkgdG8gYmUgZm91bmQiPgorICAgIDxwdmNzIHB2Y3NiaW49Ii9uZXZlci9oZWFyZC9vZi9hL2RpcmVjdG9yeS9zdHJ1Y3R1cmUvbGlrZS90aGlzIiAKKwkJCSByZXBvc2l0b3J5PSIvL2N0NHNlcnYyL3B2Y3MvbW9uaXRvciIvPgorICA8L3RhcmdldD4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmMDU3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3JlcGxhY2VyZWdleHAucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitPbGRBYmM9RGVmCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3JlcGxhY2VyZWdleHAueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4ZGQ3YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3JlcGxhY2VyZWdleHAueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0iZGVmIiBiYXNlZGlyPSIuIj4KKyAgPHByb3BlcnR5IG5hbWU9InRtcHJlZ2V4cCIgdmFsdWU9InRtcHJlZ2V4cCIvPgorICA8dGFyZ2V0IG5hbWU9ImRlZiI+CisgICAgPGZhaWw+VGhpcyBidWlsZCBmaWxlIHNob3VsZCBvbmx5IGJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgdGVzdGNhc2U8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2V0dXAiPgorICAgIDxjb3B5IGZpbGU9InJlcGxhY2VyZWdleHAucHJvcGVydGllcyIgdG9maWxlPSJ0ZXN0LnByb3BlcnRpZXMiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2V0dXAtbmwiPgorICAgIDxjb3B5IGZpbGU9InJlcGxhY2VyZWdleHAyLnByb3BlcnRpZXMiIHRvZmlsZT0idGVzdC5wcm9wZXJ0aWVzIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZXBsYWNlIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPHJlcGxhY2VyZWdleHAgZmlsZT0idGVzdC5wcm9wZXJ0aWVzIiBieWxpbmU9InRydWUiPgorICAgICAgPHJlZ2V4cCBwYXR0ZXJuPSJPbGQoLiopPSguKikiIC8+CisgICAgICA8c3Vic3RpdHV0aW9uIGV4cHJlc3Npb249Ik5ld1Byb3A9XDFcMiIgLz4KKyAgICA8L3JlcGxhY2VyZWdleHA+CisgIDwvdGFyZ2V0PgorICA8IS0tIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRlc3REaXJlY3RvcnlEYXRlRG9lc05vdENoYW5nZSB0byBtYWtlIHN1cmUgc29tZXRoaW5nIHdpbGwgaGFwcGVuIC0tPgorICA8dGFyZ2V0IG5hbWU9InRvdWNoRGlyZWN0b3J5Ij4KKyAgICA8bWtkaXIgZGlyPSIke3RtcHJlZ2V4cH0iLz4KKyAgICA8Y29weSBmaWxlPSJyZXBsYWNlcmVnZXhwLnByb3BlcnRpZXMiIHRvZmlsZT0iJHt0bXByZWdleHB9L3Rlc3QucHJvcGVydGllcyIgLz4KKyAgICA8c2xlZXAgc2Vjb25kcz0iMiIvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RGlyZWN0b3J5RGF0ZURvZXNOb3RDaGFuZ2UiPgorICAgIDxyZXBsYWNlcmVnZXhwIGZpbGU9IiR7dG1wcmVnZXhwfS90ZXN0LnByb3BlcnRpZXMiIGJ5bGluZT0idHJ1ZSI+CisgICAgICA8cmVnZXhwIHBhdHRlcm49ImZvbyIgLz4KKyAgICAgICAgPHN1YnN0aXR1dGlvbiBleHByZXNzaW9uPSJiYXIiLz4KKyAgICAgIDwvcmVwbGFjZXJlZ2V4cD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RG9udEFkZE5ld2xpbmUxIiBkZXBlbmRzPSJzZXR1cC1ubCI+CisgICAgPHJlcGxhY2VyZWdleHAgZmlsZT0idGVzdC5wcm9wZXJ0aWVzIiBieWxpbmU9ImZhbHNlIj4KKyAgICAgIDxyZWdleHAgcGF0dGVybj0iT2xkKC4qKT0oLiopIiAvPgorICAgICAgPHN1YnN0aXR1dGlvbiBleHByZXNzaW9uPSJOZXdQcm9wPVwxXDIiIC8+CisgICAgPC9yZXBsYWNlcmVnZXhwPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REb250QWRkTmV3bGluZTIiIGRlcGVuZHM9InNldHVwLW5sIj4KKyAgICA8cmVwbGFjZXJlZ2V4cCBmaWxlPSJ0ZXN0LnByb3BlcnRpZXMiIGJ5bGluZT0idHJ1ZSI+CisgICAgICA8cmVnZXhwIHBhdHRlcm49Ik9sZCguKik9KC4qKSIgLz4KKyAgICAgIDxzdWJzdGl0dXRpb24gZXhwcmVzc2lvbj0iTmV3UHJvcD1cMVwyIiAvPgorICAgIDwvcmVwbGFjZXJlZ2V4cD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVsZXRlIGZpbGU9InRlc3QucHJvcGVydGllcyIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0bXByZWdleHB9IiBxdWlldD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwMi5wcm9wZXJ0aWVzIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cDIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGE3NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cDIucHJvcGVydGllcwpAQCAtMCwwICsxLDE1IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitPbGRBYmM9RGVmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cDIucmVzdWx0LnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwMi5yZXN1bHQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzkzY2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cDIucmVzdWx0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorTmV3UHJvcD1BYmNEZWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY2hlbWF2YWxpZGF0ZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY2hlbWF2YWxpZGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzMjAxZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjaGVtYXZhbGlkYXRlLnhtbApAQCAtMCwwICsxLDEwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ2YWxpZGF0ZSIgZGVmYXVsdD0iZGVmYXVsdCIgYmFzZWRpcj0iLiI+CisKKworICA8cHJvcGVydHkgbmFtZT0iZG9jLnhzZCIgbG9jYXRpb249InhtbC9kb2MueHNkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkb2MtaW4tbnMueHNkIiBsb2NhdGlvbj0ieG1sL2RvYy1pbi1ucy54c2QiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im5hbWVzcGFjZSIgdmFsdWU9Imh0dHA6Ly9hcGFjaGUub3JnL2FudC9kb2MvIiAvPgorICAKKyAgPHByb3BlcnR5IG5hbWU9ImVuZHBpZWNlLW5zLW5vLWxvY2F0aW9uLnhtbCIgCisgICAgbG9jYXRpb249InhtbC9lbmRwaWVjZS1ucy1uby1sb2NhdGlvbi54bWwiLz4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb05hbWVzcGFjZSI+CisgICAgPHNjaGVtYXZhbGlkYXRlCisgICAgICBub05hbWVzcGFjZUZpbGU9IiR7ZG9jLnhzZH0iCisgICAgICBmaWxlPSJ4bWwvZW5kcGllY2Utbm9TY2hlbWEueG1sIj4KKyAgICA8L3NjaGVtYXZhbGlkYXRlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROU01hcHBpbmciPgorICAgIDxzY2hlbWF2YWxpZGF0ZQorICAgICAgZmlsZT0iJHtlbmRwaWVjZS1ucy1uby1sb2NhdGlvbi54bWx9Ij4KKyAgICAgIDxzY2hlbWEgbmFtZXNwYWNlPSIke25hbWVzcGFjZX0iIGZpbGU9IiR7ZG9jLWluLW5zLnhzZH0iIC8+CisgICAgICA8c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYW50LzIiIAorICAgICAgICB1cmw9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iIC8+CisgICAgPC9zY2hlbWF2YWxpZGF0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9FbXB0eVNjaGVtYU5hbWVzcGFjZSI+CisgICAgPHNjaGVtYXZhbGlkYXRlCisgICAgICBmaWxlPSIke2VuZHBpZWNlLW5zLW5vLWxvY2F0aW9uLnhtbH0iPgorICAgICAgPHNjaGVtYSBuYW1lc3BhY2U9IiIgZmlsZT0iJHtkb2MtaW4tbnMueHNkfSIgLz4KKyAgICA8L3NjaGVtYXZhbGlkYXRlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb0VtcHR5U2NoZW1hTG9jYXRpb24iPgorICAgIDxzY2hlbWF2YWxpZGF0ZQorICAgICAgZmlsZT0iJHtlbmRwaWVjZS1ucy1uby1sb2NhdGlvbi54bWx9Ij4KKyAgICAgIDxzY2hlbWEgbmFtZXNwYWNlPSIke25hbWVzcGFjZX0iIC8+CisgICAgPC9zY2hlbWF2YWxpZGF0ZT4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3ROb0ZpbGUiPgorICAgIDxzY2hlbWF2YWxpZGF0ZQorICAgICAgZmlsZT0iJHtlbmRwaWVjZS1ucy1uby1sb2NhdGlvbi54bWx9Ij4KKyAgICAgIDxzY2hlbWEgbmFtZXNwYWNlPSIke25hbWVzcGFjZX0iIGZpbGU9IiR7bmFtZXNwYWNlfSIgLz4KKyAgICA8L3NjaGVtYXZhbGlkYXRlPgorICA8L3RhcmdldD4gIAorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9Eb3VibGVTY2hlbWFMb2NhdGlvbiI+CisgICAgPHNjaGVtYXZhbGlkYXRlCisgICAgICBmaWxlPSIke2VuZHBpZWNlLW5zLW5vLWxvY2F0aW9uLnhtbH0iPgorICAgICAgPHNjaGVtYSBuYW1lc3BhY2U9IiR7bmFtZXNwYWNlfSIgZmlsZT0iJHtkb2MtaW4tbnMueHNkfSIgdXJsPSIke25hbWVzcGFjZX0iLz4KKyAgICA8L3NjaGVtYXZhbGlkYXRlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb0R1cGxpY2F0ZVNjaGVtYSI+CisgICAgPHNjaGVtYXZhbGlkYXRlCisgICAgICBmaWxlPSIke2VuZHBpZWNlLW5zLW5vLWxvY2F0aW9uLnhtbH0iPgorICAgICAgPHNjaGVtYSBuYW1lc3BhY2U9IiR7bmFtZXNwYWNlfSIgZmlsZT0iJHtkb2MtaW4tbnMueHNkfSIgLz4KKyAgICAgIDxzY2hlbWEgbmFtZXNwYWNlPSIke25hbWVzcGFjZX0iIAorICAgICAgICB1cmw9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iIC8+CisgICAgPC9zY2hlbWF2YWxpZGF0ZT4KKyAgPC90YXJnZXQ+ICAKKworICA8dGFyZ2V0IG5hbWU9InRlc3RFcXVhbHNTY2hlbWFzT0siPgorICAgIDxzY2hlbWF2YWxpZGF0ZQorICAgICAgZmlsZT0iJHtlbmRwaWVjZS1ucy1uby1sb2NhdGlvbi54bWx9Ij4KKyAgICAgIDxzY2hlbWEgbmFtZXNwYWNlPSIke25hbWVzcGFjZX0iIGZpbGU9IiR7ZG9jLWluLW5zLnhzZH0iIC8+CisgICAgICA8c2NoZW1hIG5hbWVzcGFjZT0iJHtuYW1lc3BhY2V9IiBmaWxlPSIke2RvYy1pbi1ucy54c2R9IiAvPgorICAgIDwvc2NoZW1hdmFsaWRhdGU+CisgIDwvdGFyZ2V0PiAgCisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlc2V0Ij4KKyAgICA8c2NoZW1hdmFsaWRhdGUgbm9OYW1lc3BhY2VGaWxlPSIke2RvYy54c2R9IgorICAgICAgPgorICAgICAgPHNjaGVtYSBuYW1lc3BhY2U9IiR7bmFtZXNwYWNlfSIgZmlsZT0iJHtkb2MtaW4tbnMueHNkfSIgLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0ieG1sIiAKKyAgICAgICAgaW5jbHVkZXM9ImVuZHBpZWNlLnhtbCwgZW5kcGllY2UtbnMtbm8tbG9jYXRpb24ueG1sLCBlbmRwaWVjZS1uby1zY2hlbWEueG1sIiAvPgorICAgIDwvc2NoZW1hdmFsaWRhdGU+CisgIDwvdGFyZ2V0PiAgCisgIAorICAKKyAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiBkZXBlbmRzPSJ0ZXN0Tm9OYW1lc3BhY2UsdGVzdE5TTWFwcGluZyIgLz4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFmNzBkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0LnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3Rwcm9qZWN0IiBkZWZhdWx0PSJkZWYiIGJhc2VkaXI9Ii4iPgorCisgIDx0YXJnZXQgbmFtZT0iZGVmIj4KKyAgICA8ZmFpbD5UaGlzIGJ1aWxkLWZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgcnVuIGZyb20gdGhlIHRlc3QgY2FzZXM8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2V0dXAxIj4KKworICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPiA8IVtDREFUQVsKKworICAgICAgZm9yIChpPTE7IGk8PTEwOyBpKyspIHsKKyAgICAgICAgZWNobyA9IHRlc3Rwcm9qZWN0LmNyZWF0ZVRhc2soImVjaG8iKTsKKyAgICAgICAgc2V0dXAxLmFkZFRhc2soZWNobyk7CisgICAgICAgIGVjaG8uc2V0TWVzc2FnZShpKmkpOworICAgICAgfQorCisgICAgXV0+IDwvc2NyaXB0PgorCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZXhhbXBsZTEiIGRlcGVuZHM9InNldHVwMSIvPgorCisgIDx0YXJnZXQgbmFtZT0idXNlQmVhbnNoZWxsIj4KKyAgICA8c2NyaXB0IGxhbmd1YWdlPSJiZWFuc2hlbGwiPjwhW0NEQVRBWworICAgICAgIHNlbGYubG9nKCJJJ20gaGVyZSIsIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuTVNHX0lORk8pOworICAgIF1dPjwvc2NyaXB0PgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9zY3JpcHRkZWYueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L3NjcmlwdGRlZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwNTFlYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9zY3JpcHRkZWYueG1sCkBAIC0wLDAgKzEsMTQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3Rwcm9qZWN0IiBkZWZhdWx0PSJkZWYiIGJhc2VkaXI9Ii4iPgorCisgIDx0YXJnZXQgbmFtZT0iZGVmIj4KKyAgICA8ZmFpbD5UaGlzIGJ1aWxkLWZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgcnVuIGZyb20gdGhlIHRlc3QgY2FzZXM8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2ltcGxlIj4KKyAgICA8c2NyaXB0ZGVmIG5hbWU9InNjcmlwdHRlc3QiIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXR0cjEiLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9ImZpbGVzZXQiLz4KKyAgICAgIDwhW0NEQVRBWworICAgICAgICAKKyAgICAgICAgcHJvamVjdC5sb2coIkF0dHJpYnV0ZSBhdHRyMSA9ICIgKyBhdHRyaWJ1dGVzLmdldCgiYXR0cjEiKSk7CisgICAgICAgIHByb2plY3QubG9nKCJGaWxlc2V0IGJhc2VkaXIgPSAiCisgICAgICAgICAgKyBlbGVtZW50cy5nZXQoImZpbGVzZXQiKS5nZXQoMCkuZ2V0RGlyKHByb2plY3QpKTsKKyAgICAgICAgCisgICAgICBdXT4KKyAgICA8L3NjcmlwdGRlZj4KKyAgICAKKyAgICA8ZmlsZXNldCBpZD0idGVzdGZpbGVzZXQiIGRpcj0iLiIvPgorICAgIDxzY3JpcHR0ZXN0IGF0dHIxPSJ0ZXN0Ij4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJ0ZXN0ZmlsZXNldCIvPgorICAgIDwvc2NyaXB0dGVzdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJub2xhbmciPgorICAgIDxzY3JpcHRkZWYgbmFtZT0ibm9sYW5nIj4KKyAgICAgIDwhW0NEQVRBWworICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyIpOworICAgICAgXV0+CisgICAgPC9zY3JpcHRkZWY+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm9uYW1lIj4KKyAgICA8c2NyaXB0ZGVmIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgIDwhW0NEQVRBWworICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyIpOworICAgICAgXV0+CisgICAgPC9zY3JpcHRkZWY+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibmVzdGVkYnljbGFzc25hbWUiPgorICAgIDxzY3JpcHRkZWYgbmFtZT0ic2NyaXB0dGVzdCIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdHRyMSIvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0Ii8+CisgICAgICA8IVtDREFUQVsKKyAgICAgICAgCisgICAgICAgIHByb2plY3QubG9nKCJBdHRyaWJ1dGUgYXR0cjEgPSAiICsgYXR0cmlidXRlcy5nZXQoImF0dHIxIikpOworICAgICAgICBwcm9qZWN0LmxvZygiRmlsZXNldCBiYXNlZGlyID0gIgorICAgICAgICAgICsgZWxlbWVudHMuZ2V0KCJmaWxlc2V0IikuZ2V0KDApLmdldERpcihwcm9qZWN0KSk7CisgICAgICAgIAorICAgICAgXV0+CisgICAgPC9zY3JpcHRkZWY+CisgICAgCisgICAgPGZpbGVzZXQgaWQ9InRlc3RmaWxlc2V0IiBkaXI9Ii4iLz4KKyAgICA8c2NyaXB0dGVzdCBhdHRyMT0idGVzdCI+CisgICAgICA8ZmlsZXNldCByZWZpZD0idGVzdGZpbGVzZXQiLz4KKyAgICA8L3NjcmlwdHRlc3Q+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJub2VsZW1lbnQiPgorICAgIDxzY3JpcHRkZWYgbmFtZT0ic2NyaXB0dGVzdCIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdHRyMSIvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0iZmlsZXNldCIvPgorICAgICAgPCFbQ0RBVEFbCisgICAgICAgIGphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkF0dHJpYnV0ZSBhdHRyMSA9ICIgKyBhdHRyaWJ1dGVzLmdldCgiYXR0cjEiKSk7CisgICAgICBdXT4KKyAgICA8L3NjcmlwdGRlZj4KKyAgICAKKyAgICA8c2NyaXB0dGVzdCBhdHRyMT0idGVzdCI+CisgICAgPC9zY3JpcHR0ZXN0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImV4Y2VwdGlvbiI+CisgICAgPHNjcmlwdGRlZiBuYW1lPSJzY3JpcHR0ZXN0IiBsYW5ndWFnZT0iamF2YXNjcmlwdCI+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImF0dHIxIi8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiLz4KKyAgICAgIDwhW0NEQVRBWworICAgICAgICAKKyAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQXR0cmlidXRlIGF0dHIxID0gIiArIGF0dHJpYnV0ZXMuZ2V0KCJhdHRyMSIpKTsKKyAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiRmlsZXNldCBiYXNlZGlyID0gIgorICAgICAgICAgICsgZWxlbWVudHMuZ2V0KCJmaWxlc2V0IikuZ2V0KDApLmdldERpcihwcm9qZWN0KSk7CisgICAgICAgIAorICAgICAgXV0+CisgICAgPC9zY3JpcHRkZWY+CisgICAgCisgICAgPHNjcmlwdHRlc3QgYXR0cjE9InRlc3QiPgorICAgIDwvc2NyaXB0dGVzdD4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImRvdWJsZWRlZiI+CisgICAgPHNjcmlwdGRlZiBuYW1lPSJ0YXNrMSIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgPCFbQ0RBVEFbCisgICAgICAgIHByb2plY3QubG9nKCJUYXNrMSIpOworICAgICAgXV0+CisgICAgPC9zY3JpcHRkZWY+CisgICAgPHNjcmlwdGRlZiBuYW1lPSJ0YXNrMiIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgPCFbQ0RBVEFbCisgICAgICAgIHByb2plY3QubG9nKCJUYXNrMiIpOworICAgICAgXV0+CisgICAgPC9zY3JpcHRkZWY+CisgICAgPHRhc2sxLz4KKyAgICA8dGFzazIvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iZG91YmxlQXR0cmlidXRlRGVmIj4KKyAgICA8c2NyaXB0ZGVmIG5hbWU9InNjcmlwdHRlc3QiIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXR0cjEiLz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXR0cjEiLz4KKyAgICA8L3NjcmlwdGRlZj4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InByb3BlcnR5Ij4KKyAgICA8c2NyaXB0ZGVmIG5hbWU9InNjcmlwdHRlc3QiIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXR0cjEiLz4KKyAgICAgIDwhW0NEQVRBWworICAgICAgICAKKyAgICAgICAgcHJvamVjdC5sb2coIkF0dHJpYnV0ZSB2YWx1ZSA9ICIgKyBhdHRyaWJ1dGVzLmdldCgiYXR0cjEiKSk7CisgICAgICBdXT4KKyAgICA8L3NjcmlwdGRlZj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cHJvcGVydHkiIHZhbHVlPSJ0ZXN0Ii8+ICAgIAorICAgIDxzY3JpcHR0ZXN0IGF0dHIxPSIke3Rlc3Rwcm9wZXJ0eX0iPgorICAgIDwvc2NyaXB0dGVzdD4KKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0X3JlZmVyZW5jZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHRfcmVmZXJlbmNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmNjYjFmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0X3JlZmVyZW5jZS54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0LXJlZmVyZW5jZSIgZGVmYXVsdD0ic2NyaXB0Ij4KKyAgPHRhcmdldCBuYW1lPSJzY3JpcHQiPgorICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgIDwvc2NyaXB0PgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJkZWYiPgorICAgIDx0YXNrZGVmIG5hbWU9Im15LmVjaG8iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobyIvPgorICAgIDxteS5lY2hvIGlkPSJteS5lY2hvLnJlZiIgbWVzc2FnZT0iaGVsbG8gd29ybGQiLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zb3Mvc29zLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9zb3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MmI0N2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zb3Mvc29zLnhtbApAQCAtMCwwICsxLDEyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9InNvcy10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJzb3NnZXQuMSI+CisKKyAgICA8IS0tCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFRlc3QgU09TR2V0IG1pc3NpbmcgYXR0cmlidXRlcworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ic29zZ2V0LjEiPgorICAgICAgICA8c29zZ2V0Lz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic29zZ2V0LjIiPgorICAgICAgICA8c29zZ2V0IHNvc3NlcnZlcnBhdGg9IjE5Mi4xNjguMC4xOjg4ODgiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic29zZ2V0LjMiPgorICAgICAgICA8c29zZ2V0IHNvc3NlcnZlcnBhdGg9IjE5Mi4xNjguMC4xOjg4ODgiCisgICAgICAgICAgICB1c2VybmFtZT0iYW50Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNvc2dldC40Ij4KKyAgICAgICAgPHNvc2dldCBzb3NzZXJ2ZXJwYXRoPSIxOTIuMTY4LjAuMTo4ODg4IgorICAgICAgICAgICAgdXNlcm5hbWU9ImFudCIKKyAgICAgICAgICAgIHZzc3NlcnZlcnBhdGg9Ilxcc2VydmVyXHZzc1xzcmNzYWZlLmluaSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBUZXN0IFNPU0NoZWNraW4gbWlzc2luZyBhdHRyaWJ1dGVzCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLS0+CisgICAgPHRhcmdldCBuYW1lPSJzb3NjaGVja2luLjEiPgorICAgICAgICA8c29zY2hlY2tpbi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNvc2NoZWNraW4uMiI+CisgICAgICAgIDxzb3NjaGVja2luIHNvc3NlcnZlcnBhdGg9IjE5Mi4xNjguMC4xOjg4ODgiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic29zY2hlY2tpbi4zIj4KKyAgICAgICAgPHNvc2NoZWNraW4gc29zc2VydmVycGF0aD0iMTkyLjE2OC4wLjE6ODg4OCIKKyAgICAgICAgICAgIHVzZXJuYW1lPSJhbnQiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic29zY2hlY2tpbi40Ij4KKyAgICAgICAgPHNvc2NoZWNraW4gc29zc2VydmVycGF0aD0iMTkyLjE2OC4wLjE6ODg4OCIKKyAgICAgICAgICAgIHVzZXJuYW1lPSJhbnQiCisgICAgICAgICAgICB2c3NzZXJ2ZXJwYXRoPSJcXHNlcnZlclx2c3Ncc3Jjc2FmZS5pbmkiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgVGVzdCBTT1NDaGVja291dCBtaXNzaW5nIGF0dHJpYnV0ZXMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9InNvc2NoZWNrb3V0LjEiPgorICAgICAgICA8c29zY2hlY2tvdXQvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJzb3NjaGVja291dC4yIj4KKyAgICAgICAgPHNvc2NoZWNrb3V0IHNvc3NlcnZlcnBhdGg9IjE5Mi4xNjguMC4xOjg4ODgiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic29zY2hlY2tvdXQuMyI+CisgICAgICAgIDxzb3NjaGVja291dCBzb3NzZXJ2ZXJwYXRoPSIxOTIuMTY4LjAuMTo4ODg4IgorICAgICAgICAgICAgdXNlcm5hbWU9ImFudCIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJzb3NjaGVja291dC40Ij4KKyAgICAgICAgPHNvc2NoZWNrb3V0IHNvc3NlcnZlcnBhdGg9IjE5Mi4xNjguMC4xOjg4ODgiCisgICAgICAgICAgICB1c2VybmFtZT0iYW50IgorICAgICAgICAgICAgdnNzc2VydmVycGF0aD0iXFxzZXJ2ZXJcdnNzXHNyY3NhZmUuaW5pIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFRlc3QgU09TTGFiZWwgbWlzc2luZyBhdHRyaWJ1dGVzCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLS0+CisgICAgPHRhcmdldCBuYW1lPSJzb3NsYWJlbC4xIj4KKyAgICAgICAgPHNvc2xhYmVsLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic29zbGFiZWwuMiI+CisgICAgICAgIDxzb3NsYWJlbCBzb3NzZXJ2ZXJwYXRoPSIxOTIuMTY4LjAuMTo4ODg4Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNvc2xhYmVsLjMiPgorICAgICAgICA8c29zbGFiZWwgc29zc2VydmVycGF0aD0iMTkyLjE2OC4wLjE6ODg4OCIKKyAgICAgICAgICAgIHVzZXJuYW1lPSJhbnQiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic29zbGFiZWwuNCI+CisgICAgICAgIDxzb3NsYWJlbCBzb3NzZXJ2ZXJwYXRoPSIxOTIuMTY4LjAuMTo4ODg4IgorICAgICAgICAgICAgdXNlcm5hbWU9ImFudCIKKyAgICAgICAgICAgIHZzc3NlcnZlcnBhdGg9Ilxcc2VydmVyXHZzc1xzcmNzYWZlLmluaSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJzb3NsYWJlbC41Ij4KKyAgICAgICAgPHNvc2xhYmVsIHNvc3NlcnZlcnBhdGg9IjE5Mi4xNjguMC4xOjg4ODgiCisgICAgICAgICAgICB1c2VybmFtZT0iYW50IgorICAgICAgICAgICAgdnNzc2VydmVycGF0aD0iXFxzZXJ2ZXJcdnNzXHNyY3NhZmUuaW5pIgorICAgICAgICAgICAgcHJvamVjdHBhdGg9IiQvU291cmNlUm9vdC9Qcm9qZWN0Ii8+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvc3ltbGluay54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC91bml4L3N5bWxpbmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDg4MWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC91bml4L3N5bWxpbmsueG1sCkBAIC0wLDAgKzEsMzQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLQorCisvKgorICogU2luY2UgdGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlzIGZpbGUgd2FzIGRldmVvbHBlZCBvbiB0aGUgY2xvY2sgb24KKyAqIGFuIE5TRiBncmFudCBJIHNob3VsZCBzYXkgdGhlIGZvbGxvd2luZyBib2lsZXJwbGF0ZToKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIGJhc2VkIHVwb24gd29yayBzdXBwb3J0ZWQgYnkgdGhlIE5hdGlvbmFsIFNjaWVuY2UKKyAqIEZvdW5kYXRvbiB1bmRlciBHcmFudCBOby4gRUlBLTAxOTY0MDQuIEFueSBvcGluaW9ucywgZmluZGluZ3MsIGFuZAorICogY29uY2x1c2lvbnMgb3IgcmVjb21tZW5kYXRpb25zIGV4cHJlc3NlZCBpbiB0aGlzIG1hdGVyaWFsIGFyZSB0aG9zZQorICogb2YgdGhlIGF1dGhvciBhbmQgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIHZpZXdzIG9mIHRoZQorICogTmF0aW9uYWwgU2NpZW5jZSBGb3VuZGF0aW9uLgorICovCisKKy0tPgorCis8cHJvamVjdCBuYW1lPSJzeW1saW5rLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImFsbCI+CisKKyAgPCEtLSAKKyAgICAgICBTaW5jZSB0aGUgc3ltbGluayB0YXNrIGFuZCBzb21lIG9mIHRoZXNlIHRhcmdldHMgcmVseSBvbgorICAgICAgIGNhbGxzIHRvIGV4ZWMsIGl0IG1heSBiZSBwb3NzaWJsZSBmb3IgdGhlIEpWTSB0byBvdXRydW4gdGhlIAorICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lICBzeXN0ZW0gY2FsbHMsIHNvIHRoaXMgdmFsdWUgaXMKKyAgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgd2UgZ2l2ZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0bworICAgICAgIGNhdGNoIHVwIGJlZm9yZSBleGVjdXRpbmcgYSB0YXNrIHRoYXQgZGVwZW5kcyBvbiB0aGUgCisgICAgICAgY29tcGxldGlvbiBvZiBwcmV2aW91cyB0YXNrcy4gVGhpcyBkZWxheSBpcyBhbHNvIGFkZGVkIHRvCisgICAgICAgdGhlIGVuZCBvZiBlYWNoIHRhcmdldCBzbyBqdW5pdCBkb2Vzbid0IGdvIHRlc3RpbmcgdGhpbmdzCisgICAgICAgYmVmb3JlIHRoZXkgaGF2ZSBmaW5uaXNoZWQgKGhvcGVmdWxseSkuIFR3ZWFrIGlmIG5lZWRlZC4KKyAgLS0+CisKKyAgPHByb3BlcnR5IG5hbWU9ImRlbGF5IiB2YWx1ZT0iMyIvPgorIAorICA8cHJvcGVydHkgbmFtZT0idGRpciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVzdC13b3JraW5nIi8+CisKKyAgPHRhcmdldCBuYW1lPSJzZXR1cCI+CisgICAgICA8ZGVsZXRlIGRpcj0iJHt0ZGlyfSIvPgorICAgICAgPG1rZGlyIGRpcj0iJHt0ZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImFsbCIKKwkgICAgICBkZXBlbmRzPSJzZXR1cCwgdGVzdC1zaW5nbGUsIHRlc3QtZGVsZXRlLCB0ZXN0LXJlY29yZCwgdGVzdC1yZWNyZWF0ZSwgdGVhcmRvd24iLz4KKwkKKyAgPCEtLSB0ZXN0IGZvciBhY3Rpb24gPSBzaW5nbGUgLS0+CisgIDwhLS0gCisgICAgQ3JlYXRlczoKKyAgICAgICAgIEZpbGU6ICR7dGRpcn0vc3ltbGluay50ZXN0CisgICAgICAgICBMaW5rOiAke3RkaXJ9L3NpbmdsZXRlc3QKKyAgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdC1zaW5nbGUiPgorICAgIDx0b3VjaCBmaWxlPSIke3RkaXJ9L3N5bWxpbmsudGVzdCIvPgorICAgIDxzeW1saW5rIHJlc291cmNlPSIke3RkaXJ9L3N5bWxpbmsudGVzdCIgCisgICAgICAgICAgICAgbGluaz0iJHt0ZGlyfS9zaW5nbGV0ZXN0IiAKKyAgICAgICAgICAgICBmYWlsb25lcnJvcj0ieWVzIi8+CisgICAgPHNsZWVwIHNlY29uZHM9IiR7ZGVsYXl9Ii8+IDwhLS0gbWFrZSBzdXJlIE9TIGhhcyB0aW1lIHRvIGNhdGNoIHVwIC0tPgorICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW1saW5rLnRlc3QiIAorICAgICAgICAgICAgICAgcHJvcGVydHk9InRlc3Quc2luZ2xlLmZpbGUuY3JlYXRlZCIvPgorICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zaW5nbGV0ZXN0IiAKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnNpbmdsZS5saW5rLmNyZWF0ZWQiLz4KKyAgPC90YXJnZXQ+CisKKworCisgIDwhLS0gdGVzdCBmb3IgYWN0aW9uID0gZGVsZXRlICAobm8gY2FsbHMgdG8gY29tbWFuZCBsaW5lIHNvIG5vIHNsZWVwKSAtLT4KKworICA8IS0tIAorICAgIENyZWF0ZXM6CisgICAgICAgICAobm9uZSkKKyAgICBEZWxldGVzOgorICAgICAgICAgTGluazogJHt0ZGlyfS9zaW5nbGV0ZXN0CisgIC0tPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1kZWxldGUiPgorICAgIDx0b3VjaCBmaWxlPSIke3RkaXJ9L3N5bWxpbmsudGVzdCIvPgorICAgIDxzeW1saW5rIHJlc291cmNlPSIke3RkaXJ9L3N5bWxpbmsudGVzdCIgCisgICAgICAgICAgICAgbGluaz0iJHt0ZGlyfS9zaW5nbGV0ZXN0IiAKKyAgICAgICAgICAgICBmYWlsb25lcnJvcj0ieWVzIi8+CisgICAgPHNsZWVwIHNlY29uZHM9IiR7ZGVsYXl9Ii8+IDwhLS0gbWFrZSBzdXJlIE9TIGhhcyB0aW1lIHRvIGNhdGNoIHVwIC0tPgorCisgICAgPHN5bWxpbmsgYWN0aW9uPSJkZWxldGUiIGxpbms9IiR7dGRpcn0vc2luZ2xldGVzdCIgZmFpbG9uZXJyb3I9InllcyIvPgorICAgIDxzeW1saW5rIGFjdGlvbj0iZGVsZXRlIiBsaW5rPSIke3RkaXJ9L3N5bWxpbmsudGVzdCIgZmFpbG9uZXJyb3I9Im5vIi8+CisgICAgPHNsZWVwIHNlY29uZHM9IiR7ZGVsYXl9Ii8+IDwhLS0gbWFrZSBzdXJlIE9TIGhhcyB0aW1lIHRvIGNhdGNoIHVwIC0tPgorCisgICAgPGF2YWlsYWJsZSBmaWxlPSIke3RkaXJ9L3N5bWxpbmsudGVzdCIgCisgICAgICAgICAgICAgICBwcm9wZXJ0eT0idGVzdC5kZWxldGUuZmlsZS5zdGlsbC50aGVyZSIvPgorICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zaW5nbGV0ZXN0IiAKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LmRlbGV0ZS5saW5rLnN0aWxsLnRoZXJlIgorICAgICAgICAgICAgICAgdmFsdWU9IkVSUk9SOiBsaW5rIGRlbGV0aW9uIGZhaWxlZCIvPgorICAgIAorICA8L3RhcmdldD4KKworCisKKyAgPCEtLSB0ZXN0IGZvciBhY3Rpb24gPSByZWNvcmQgLS0+CisKKyAgPCEtLSAKKyAgICBDcmVhdGVzOgorICAgICAgICAgRGlyOiAgJHt0ZGlyfS9zeW10ZXN0MQorICAgICAgICAgRGlyOiAgJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MgorICAgICAgICAgRGlyOiAgJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MworICAgICAgICAgRmlsZTogJHt0ZGlyfS9zeW10ZXN0MS9maWxlMQorICAgICAgICAgRmlsZTogJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0Mi9maWxlMgorICAgICAgICAgRmlsZTogJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0My9maWxlQQorICAgICAgICAgRmlsZTogJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0My9maWxlQgorICAgICAgICAgRmlsZTogJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0My9maWxlQworICAgICAgICAgTGluazogJHt0ZGlyfS9zeW10ZXN0MS9saW5rMT09PiR7dGRpcn0vc3ltdGVzdDEvZmlsZTEKKyAgICAgICAgIExpbms6ICR7dGRpcn0vc3ltdGVzdDEvbGluazI9PT4ke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QyL2ZpbGUyCisgICAgICAgICBMaW5rOiAke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QyL2xpbmszPT0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0Mi9maWxlMgorICAgICAgICAgTGluazogJHt0ZGlyfS9zeW10ZXN0MS9kaXJsaW5rPT0+JHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MworICAgICAgICAgTGluazogJHt0ZGlyfS9zeW10ZXN0MS9kaXJsaW5rMj09PiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDMKKyAgICAgICAgIExpbms6ICR7dGRpcn0vc3ltdGVzdDEvZGlybGluazM9PT4ke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QzCisgICAgICAgICBGaWxlOiAke3RkaXJ9L3N5bXRlc3QxL3JlY29yZGVkLmxpbmtzCisgICAgICAgICBGaWxlOiAke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QyL3JlY29yZGVkLmxpbmtzCisgICAgRGVsZXRlczoKKyAgICAgICAgIChub25lKQorICAtLT4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtcmVjb3JkIj4KKworICAgIDxta2RpciBkaXI9IiR7dGRpcn0vc3ltdGVzdDEiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QyIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MyIvPgorICAgIDx0b3VjaCBmaWxlPSIke3RkaXJ9L3N5bXRlc3QxL2ZpbGUxIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDIvZmlsZTIiLz4KKworICAgIDx0b3VjaCBmaWxlPSIke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QzL2ZpbGVBIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDMvZmlsZUIiLz4KKyAgICA8dG91Y2ggZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0My9maWxlQyIvPgorCisgICAgPHN5bWxpbmsgcmVzb3VyY2U9IiR7dGRpcn0vc3ltdGVzdDEvZmlsZTEiIAorICAgICAgICAgICAgIGxpbms9IiR7dGRpcn0vc3ltdGVzdDEvbGluazEiIAorICAgICAgICAgICAgIGZhaWxvbmVycm9yPSJubyIgLz4KKyAgICA8c3ltbGluayByZXNvdXJjZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0Mi9maWxlMiIgCisgICAgICAgICAgICAgbGluaz0iJHt0ZGlyfS9zeW10ZXN0MS9saW5rMiIgCisgICAgICAgICAgICAgZmFpbG9uZXJyb3I9Im5vIiAvPgorICAgIDxzeW1saW5rIHJlc291cmNlPSIke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QyL2ZpbGUyIiAKKyAgICAgICAgICAgICBsaW5rPSIke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QyL2xpbmszIiAKKyAgICAgICAgICAgICBmYWlsb25lcnJvcj0ibm8iIC8+CisgICAgPHN5bWxpbmsgcmVzb3VyY2U9IiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDMiCisgICAgICAgICAgICAgbGluaz0iJHt0ZGlyfS9zeW10ZXN0MS9kaXJsaW5rIgorICAgICAgICAgICAgIGZhaWxvbmVycm9yPSJubyIgLz4KKyAgICA8c3ltbGluayByZXNvdXJjZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MyIgCisgICAgICAgICAgICAgbGluaz0iJHt0ZGlyfS9zeW10ZXN0MS9kaXJsaW5rMiIKKyAgICAgICAgICAgICBmYWlsb25lcnJvcj0ibm8iLz4KKyAgICA8c3ltbGluayByZXNvdXJjZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MyIgCisgICAgICAgICAgICAgbGluaz0iJHt0ZGlyfS9zeW10ZXN0MS9kaXJsaW5rMyIKKyAgICAgICAgICAgICBmYWlsb25lcnJvcj0ibm8iLz4KKworICAgIDxzbGVlcCBzZWNvbmRzPSIke2RlbGF5fSIvPiA8IS0tIG1ha2Ugc3VyZSBPUyBoYXMgdGltZSB0byBjYXRjaCB1cCAtLT4KKworICAgIDxzeW1saW5rIGFjdGlvbj0icmVjb3JkIiBsaW5rZmlsZW5hbWU9InJlY29yZGVkLmxpbmtzIj4KKyAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGRpcn0vc3ltdGVzdDEiIGluY2x1ZGVzPSIqKi8qKiIvPgorICAgIDwvc3ltbGluaz4KKworICAgIDxzbGVlcCBzZWNvbmRzPSIke2RlbGF5fSIvPiA8IS0tIG1ha2Ugc3VyZSBPUyBoYXMgdGltZSB0byBjYXRjaCB1cCAtLT4KKworICAgIDwhLS0gVGVzdCB0byBzZWUgaWYgdGhlIGRpcmVjdG9yaWVzIHdlcmUgY3JlYXRlZCAtLT4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MSIKKyAgICAgICAgICAgICAgIHR5cGU9ImRpciIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY29yZC5kaXIxLmNyZWF0ZWQiLz4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MiIKKyAgICAgICAgICAgICAgIHR5cGU9ImRpciIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY29yZC5kaXIyLmNyZWF0ZWQiLz4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MyIKKyAgICAgICAgICAgICAgIHR5cGU9ImRpciIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY29yZC5kaXIzLmNyZWF0ZWQiLz4KKworICAgIDwhLS0gVGVzdCB0byBzZWUgaWYgdGhlIEZpbGVzIHdlcmUgY3JlYXRlZCAtLT4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9maWxlMSIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY29yZC5maWxlMS5jcmVhdGVkIi8+CisKKyAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDIvZmlsZTIiCisgICAgICAgICAgICAgICBwcm9wZXJ0eT0idGVzdC5yZWNvcmQuZmlsZTIuY3JlYXRlZCIvPgorCisgICAgPGF2YWlsYWJsZSBmaWxlPSIke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QzL2ZpbGVBIgorICAgICAgICAgICAgICAgcHJvcGVydHk9InRlc3QucmVjb3JkLmZpbGVBLmNyZWF0ZWQiLz4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0My9maWxlQiIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY29yZC5maWxlQi5jcmVhdGVkIi8+CisKKyAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDMvZmlsZUMiCisgICAgICAgICAgICAgICBwcm9wZXJ0eT0idGVzdC5yZWNvcmQuZmlsZUMuY3JlYXRlZCIvPgorCisgICAgPCEtLSBUZXN0IHRvIHNlZSBpZiB0aGUgbGlua3Mgd2VyZSBjcmVhdGVkIC0tPgorCisgICAgPGF2YWlsYWJsZSBmaWxlPSIke3RkaXJ9L3N5bXRlc3QxL2xpbmsxIgorICAgICAgICAgICAgICAgcHJvcGVydHk9InRlc3QucmVjb3JkLmxpbmsxLmNyZWF0ZWQiLz4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9saW5rMiIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY29yZC5saW5rMi5jcmVhdGVkIi8+CisKKyAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDIvbGluazMiCisgICAgICAgICAgICAgICBwcm9wZXJ0eT0idGVzdC5yZWNvcmQubGluazMuY3JlYXRlZCIvPgorCisgICAgPGF2YWlsYWJsZSBmaWxlPSIke3RkaXJ9L3N5bXRlc3QxL2RpcmxpbmsiCisgICAgICAgICAgICAgICBwcm9wZXJ0eT0idGVzdC5yZWNvcmQuZGlybGluay5jcmVhdGVkIi8+CisKKyAgICA8IS0tIHRoaXMgaXMgcmVkdW5kYW50IGZvciB0aGlzIHRlc3QsIGJ1dCB1c2VkIGluIHRoZSByZWNyZWF0ZSB0ZXN0IC0tPgorCisgICAgPGF2YWlsYWJsZSBmaWxlPSIke3RkaXJ9L3N5bXRlc3QxL2RpcmxpbmsyIiAKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY29yZC5kaXJsaW5rMi5jcmVhdGVkIi8+CisKKyAgICA8IS0tIFRlc3QgdG8gc2VlIGlmIHRoZSBsaW5rZmlsZXMgd2VyZSBjcmVhdGVkIC0tPgorCisgICAgPGF2YWlsYWJsZSBmaWxlPSIke3RkaXJ9L3N5bXRlc3QxL3JlY29yZGVkLmxpbmtzIgorICAgICAgICAgICAgICAgcHJvcGVydHk9InRlc3QucmVjb3JkLmRpcjEucmVjb3JkZWQiLz4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0Mi9yZWNvcmRlZC5saW5rcyIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY29yZC5kaXIyLnJlY29yZGVkIi8+CisKKyAgICA8IS0tIFRISVMgc2hvdWxkIG5vdCBiZSBzZXQgLS0+CisKKyAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDMvcmVjb3JkZWQubGlua3MiCisgICAgICAgICAgICAgICBwcm9wZXJ0eT0idGVzdC5yZWNvcmQuZGlyMy5yZWNvcmRlZCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJFUlJPUjogc3ltdGVzdDMvcmVjb3JkZWQubGlua3Mgc2hvdWxkIG5vdCBleGlzdCIvPgorCisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSB0ZXN0IGZvciBhY3Rpb24gPSByZWNyZWF0ZSAtLT4KKworICA8IS0tIAorICAgIERlbGV0ZXM6CisgICAgICAgICBMaW5rOiAke3RkaXJ9L3N5bXRlc3QxL2xpbmsxPT0+JHt0ZGlyfS9zeW10ZXN0MS9maWxlMQorICAgICAgICAgTGluazogJHt0ZGlyfS9zeW10ZXN0MS9saW5rMj09PiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDIvZmlsZTIKKyAgICAgICAgIExpbms6ICR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDIvbGluazM9PT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QyL2ZpbGUyCisgICAgICAgICBMaW5rOiAke3RkaXJ9L3N5bXRlc3QxL2Rpcmxpbms9PT4ke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QzCisgICAgICAgICBMaW5rOiAke3RkaXJ9L3N5bXRlc3QxL2RpcmxpbmszPT0+JHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MworCisgICAgQ3JlYXRlcworICAgICAgICAgTGluazogJHt0ZGlyfS9zeW10ZXN0MS9kaXJsaW5rMz09PiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDIKKworICAgIFJlY3JlYXRlczoKKyAgICAgICAgIExpbms6ICR7dGRpcn0vc3ltdGVzdDEvbGluazE9PT4ke3RkaXJ9L3N5bXRlc3QxL2ZpbGUxCisgICAgICAgICBMaW5rOiAke3RkaXJ9L3N5bXRlc3QxL2xpbmsyPT0+JHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0Mi9maWxlMgorICAgICAgICAgTGluazogJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0Mi9saW5rMz09PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDIvZmlsZTIKKyAgICAgICAgIExpbms6ICR7dGRpcn0vc3ltdGVzdDEvZGlybGluaz09PiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDMKKworICAgIFNob3VsZCBDaGFuZ2U6CisgICAgICAgICBMaW5rOiAke3RkaXJ9L3N5bXRlc3QxL2RpcmxpbmszPT0+JHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0MgorICAgICAgICAgICAgICAgdG8KKyAgICAgICAgICAgICAgICR7dGRpcn0vc3ltdGVzdDEvZGlybGluazM9PT4ke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QzCisKKyAgICBTaG91bGQgTm90IENyZWF0ZSAoYnVnIDI1MTgxKToKKyAgICAgICAgIExpbms6ICR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDMvZGlybGluazI9PT4ke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QzCisgIC0tPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1yZWNyZWF0ZSIgZGVwZW5kcz0idGVzdC1yZWNvcmQiPgorCisgICAgPHN5bWxpbmsgYWN0aW9uPSJkZWxldGUiIGxpbms9IiR7dGRpcn0vc3ltdGVzdDEvbGluazEiLz4KKyAgICA8c3ltbGluayBhY3Rpb249ImRlbGV0ZSIgbGluaz0iJHt0ZGlyfS9zeW10ZXN0MS9saW5rMiIvPgorICAgIDxzeW1saW5rIGFjdGlvbj0iZGVsZXRlIiBsaW5rPSIke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QyL2xpbmszIi8+CisgICAgPHN5bWxpbmsgYWN0aW9uPSJkZWxldGUiIGxpbms9IiR7dGRpcn0vc3ltdGVzdDEvZGlybGluayIvPgorICAgIDwhLS0gZGlybGluazIgaW50ZW50aW9uYWxseSBub3QgZGVsZXRlZCB0byB0ZXN0IGJ1ZyAyNTE4MSAtLT4KKyAgICA8c3ltbGluayBhY3Rpb249ImRlbGV0ZSIgbGluaz0iJHt0ZGlyfS9zeW10ZXN0MS9kaXJsaW5rMyIvPgorCisgICAgPHNsZWVwIHNlY29uZHM9IiR7ZGVsYXl9Ii8+ICA8IS0tIG1ha2Ugc3VyZSBPUyBoYXMgdGltZSB0byBjYXRjaCB1cCAtLT4KKworICAgIDxzeW1saW5rIHJlc291cmNlPSIke3RkaXJ9L3N5bXRlc3QxL3N5bXRlc3QyIiAKKyAgICAgICAgICAgICBsaW5rPSIke3RkaXJ9L3N5bXRlc3QxL2RpcmxpbmszIgorICAgICAgICAgICAgIGZhaWxvbmVycm9yPSJubyIvPgorCisgICAgPHNsZWVwIHNlY29uZHM9IiR7ZGVsYXl9Ii8+ICA8IS0tIG1ha2Ugc3VyZSBPUyBoYXMgdGltZSB0byBjYXRjaCB1cCAtLT4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9saW5rMSIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY3JlYXRlLmxpbmsxLm5vdC5yZW1vdmVkIgorICAgICAgICAgICAgICAgdmFsdWU9IkVSUk9SOiBybSAtZiBzeW10ZXN0MS9saW5rMSBmYWlsZWQiLz4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9saW5rMiIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY3JlYXRlLmxpbmsyLm5vdC5yZW1vdmVkIgorICAgICAgICAgICAgICAgdmFsdWU9IkVSUk9SOiBybSAtZiBzeW10ZXN0MS9saW5rMiBmYWlsZWQiLz4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0Mi9saW5rMyIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY3JlYXRlLmxpbmszLm5vdC5yZW1vdmVkIgorICAgICAgICAgICAgICAgdmFsdWU9IkVSUk9SOiBybSAtZiBzeW10ZXN0MS9zeW10ZXN0Mi9saW5rMyBmYWlsZWQiLz4KKworICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvemRpcmxpbmsiCisgICAgICAgICAgICAgICBwcm9wZXJ0eT0idGVzdC5yZWNyZWF0ZS56ZGlybGluay5ub3QucmVtb3ZlZCIKKyAgICAgICAgICAgICAgIHZhbHVlPSJFUlJPUjogcm0gLWYgc3ltdGVzdDEvemRpcmxpbmsgZmFpbGVkIi8+CisKKyAgICA8c2xlZXAgc2Vjb25kcz0iJHtkZWxheX0iLz4gIDwhLS0gbWFrZSBzdXJlIE9TIGhhcyB0aW1lIHRvIGRvIHRoZSBleGVjcyAtLT4KKworICAgIDxzeW1saW5rIGFjdGlvbj0icmVjcmVhdGUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RkaXJ9L3N5bXRlc3QxIiBpbmNsdWRlcz0iKiovcmVjb3JkZWQubGlua3MiLz4KKyAgICA8L3N5bWxpbms+CisKKyAgICA8c2xlZXAgc2Vjb25kcz0iJHtkZWxheX0iLz4gIDwhLS0gbWFrZSBzdXJlIE9TIGhhcyB0aW1lIHRvIGNhdGNoIHVwIC0tPgorCisgICAgPGF2YWlsYWJsZSBmaWxlPSIke3RkaXJ9L3N5bXRlc3QxL2xpbmsxIgorICAgICAgICAgICAgICAgcHJvcGVydHk9InRlc3QucmVjcmVhdGUubGluazEucmVjcmVhdGVkIi8+CisKKyAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvbGluazIiCisgICAgICAgICAgICAgICBwcm9wZXJ0eT0idGVzdC5yZWNyZWF0ZS5saW5rMi5yZWNyZWF0ZWQiLz4KKworICAgIDxhdmFpbGFibGUgZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9zeW10ZXN0Mi9saW5rMyIKKyAgICAgICAgICAgICAgIHByb3BlcnR5PSJ0ZXN0LnJlY3JlYXRlLmxpbmszLnJlY3JlYXRlZCIvPgorCisgICAgPGF2YWlsYWJsZSBmaWxlPSIke3RkaXJ9L3N5bXRlc3QxL2RpcmxpbmsiCisgICAgICAgICAgICAgICBwcm9wZXJ0eT0idGVzdC5yZWNyZWF0ZS5kaXJsaW5rLnJlY3JlYXRlZCIvPgorCisgICAgPCEtLSB0aGlzIHNob3VsZCBub3QgZ2V0IHNldCAtLT4KKyAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDMvc3ltdGVzdDMiIAorICAgICAgICAgICAgICAgcHJvcGVydHk9InRlc3QucmVjcmVhdGUuZGlybGluazIucmVjcmVhdGVkLnR3aWNlIgorICAgICAgICAgICAgICAgdmFsdWU9IkVSUk9SOiBkaXJsaW5rMiB3YXMgY3JlYXRlZCBhIHNlY29uZCB0aW1lIChidWcgMjUxODEpIi8+CisKKyAgICA8dG91Y2ggZmlsZT0iJHt0ZGlyfS9zeW10ZXN0MS9kaXJsaW5rMy9XaGVyZUFtSSIvPgorCisgICAgPHNsZWVwIHNlY29uZHM9IiR7ZGVsYXl9Ii8+ICA8IS0tIG1ha2Ugc3VyZSBPUyBoYXMgdGltZSB0byBkbyB0aGUgZXhlY3MgLS0+CisKKyAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dGRpcn0vc3ltdGVzdDEvc3ltdGVzdDMvV2hlcmVBbUkiIAorICAgICAgICAgICAgICAgcHJvcGVydHk9InRlc3QucmVjcmVhdGUuZGlybGluazMud2FzLmFsdGVyZWQiLz4KKyAgPC90YXJnZXQ+CisKKworPCEtLSBDQUxMIFRISVMgdG8gY2xlYW4gdGhpbmdzIHVwIGFmdGVyd2FyZHMgLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyZG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dGRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy92c3MueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2YzBkMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy92c3MueG1sCkBAIC0wLDAgKzEsNjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJ2c3MtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idnNzZ2V0LjEiPgorCisgICAgPCEtLQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBUZXN0IHJlcXVpcmVkIGF0dHJpYnV0ZXMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9InZzc2dldC4xIj4KKyAgICAgICAgPHZzc2dldC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InZzc2xhYmVsLjEiPgorICAgICAgICA8dnNzbGFiZWwvPgorICAgIDwvdGFyZ2V0PgorCisgICA8dGFyZ2V0IG5hbWU9InZzc2xhYmVsLjIiPgorICAgICAgICA8dnNzbGFiZWwgdnNzcGF0aD0iJC9Tb3VyY2VSb290L1Byb2plY3QiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idnNzaGlzdG9yeS4xIj4KKyAgICAgICAgPHZzc2hpc3RvcnkvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ2c3NjaGVja2luLjEiPgorICAgICAgICA8dnNzY2hlY2tpbi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InZzc2NoZWNrb3V0LjEiPgorICAgICAgICA8dnNzY2hlY2tvdXQvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ2c3NjaGVja291dC4yIj4KKyAgICAgICAgPHZzc2NoZWNrb3V0CisgICAgICAgICAgICB2c3NwYXRoPSIkL1NvdXJjZVJvb3QvUHJvamVjdCIKKyAgICAgICAgICAgIGZpbGV0aW1lc3RhbXA9ImJsYWgiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idnNzYWRkLjEiPgorICAgICAgICA8dnNzYWRkLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idnNzY3AuMSI+CisgICAgICAgIDx2c3NjcC8+CisgICAgPC90YXJnZXQ+CisKKyAgICAgPHRhcmdldCBuYW1lPSJ2c3NjcmVhdGUuMSI+CisgICAgICAgIDx2c3NjcmVhdGUvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC93c2RsL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC93c2RsL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxMjkyYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3dzZGwvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpcy9TdG9ja1F1b3RlU2VydmljZS5qd3MiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6U09BUC1FTkM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB4bWxuczppbXBsPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpcy9TdG9ja1F1b3RlU2VydmljZS5qd3MtaW1wbCIgeG1sbnM6aW50Zj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMvU3RvY2tRdW90ZVNlcnZpY2UuandzIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFF1b3RlUmVzcG9uc2UiPgorICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KKyAgPC93c2RsOm1lc3NhZ2U+CisgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UXVvdGVSZXF1ZXN0Ij4KKyAgICA8d3NkbDpwYXJ0IG5hbWU9InN5bWJvbCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICA8L3dzZGw6bWVzc2FnZT4KKyAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFeGNlcHRpb24iPgorICA8L3dzZGw6bWVzc2FnZT4KKyAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiPgorICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRRdW90ZSIgcGFyYW1ldGVyT3JkZXI9InN5bWJvbCI+CisgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbnRmOmdldFF1b3RlUmVxdWVzdCIvPgorICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImludGY6Z2V0UXVvdGVSZXNwb25zZSIvPgorICAgICAgPHdzZGw6ZmF1bHQgbWVzc2FnZT0iaW50ZjpFeGNlcHRpb24iIG5hbWU9IkV4Y2VwdGlvbiIvPgorICAgIDwvd3NkbDpvcGVyYXRpb24+CisgIDwvd3NkbDpwb3J0VHlwZT4KKyAgPHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNvYXBCaW5kaW5nIiB0eXBlPSJpbnRmOlN0b2NrUXVvdGVTZXJ2aWNlIj4KKyAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgorICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRRdW90ZSI+CisgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgorICAgICAgPHdzZGw6aW5wdXQ+CisgICAgICAgIDx3c2Rsc29hcDpib2R5IGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiBuYW1lc3BhY2U9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzL1N0b2NrUXVvdGVTZXJ2aWNlLmp3cyIgdXNlPSJlbmNvZGVkIi8+CisgICAgICA8L3dzZGw6aW5wdXQ+CisgICAgICA8d3NkbDpvdXRwdXQ+CisgICAgICAgIDx3c2Rsc29hcDpib2R5IGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiBuYW1lc3BhY2U9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzL1N0b2NrUXVvdGVTZXJ2aWNlLmp3cyIgdXNlPSJlbmNvZGVkIi8+CisgICAgICA8L3dzZGw6b3V0cHV0PgorICAgIDwvd3NkbDpvcGVyYXRpb24+CisgIDwvd3NkbDpiaW5kaW5nPgorICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU2VydmljZSI+CisgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJpbnRmOlN0b2NrUXVvdGVTZXJ2aWNlU29hcEJpbmRpbmciIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIj4KKyAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpcy9TdG9ja1F1b3RlU2VydmljZS5qd3MiLz4KKyAgICA8L3dzZGw6cG9ydD4KKyAgPC93c2RsOnNlcnZpY2U+Cis8L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94YWxhbi1yZWRpcmVjdC1pbi54c2wgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94YWxhbi1yZWRpcmVjdC1pbi54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiNWQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hhbGFuLXJlZGlyZWN0LWluLnhzbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2w6c3R5bGVzaGVldAl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorCXhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKwl4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi54c2x0LmV4dGVuc2lvbnMuUmVkaXJlY3QiCisJZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KKzwhLS0KK1RoaXMgaXMgYSB0ZXN0IHRvIGVuc3VyZSB0aGF0IHN5c3RlbWlkIGlzIHNldCBjb3JyZWN0bHkKK2ZvciBhIHhzbC4uLnRoZSBiZWhhdmlvciBtaWdodCBiZSBkZXBlbmRlbnQgb24gWGFsYW4xCithbmQgWGFsYW4yLi4udGhpcyB3aWxsIGJlIGEgcHJvYmxlbSB0byBlcmFzZSB0aGUgZmlsZXMgOigKK0NhbiB0YWtlIGFzIGEgc3lzdGVtaWQgdGhlIGJhc2UgZm9yIHRoZSB4c2wgZG9jdW1lbnQgb3IKK3RoZSBiYXNlIG9yIHRoZSBKVk0gd29ya2luZyBkaXIganVzdCBsaWtlOiBuZXcgRmlsZSgieGFsYW4tcmVkaXJlY3Qtb3V0LnRtcCIpCistLT4JCis8eHNsOnBhcmFtIG5hbWU9InhhbGFuLXZlcnNpb24iIHNlbGVjdD0iJ3gnIi8+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorPHJlZGlyZWN0OndyaXRlIGZpbGU9Ii4veGFsYW57JHhhbGFuLXZlcnNpb259LXJlZGlyZWN0LW91dC50bXAiPgorCTx0ZXN0PlRoaXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGU8L3Rlc3Q+Cis8L3JlZGlyZWN0OndyaXRlPgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvYWJvdXQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2Fib3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE5ZGFiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2Fib3V0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBkb2MgUFVCTElDCisgICItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIgorICAiaHR0cDovL2NoZW1pY2FsL2Jyb3RoZXJzIgorICA+Cis8ZG9jPgorICA8c2VjdGlvbiB0aXRsZT0iQWJvdXQiPgorICBpbiB0aGUgYWJzZW5jZSBvZiB0ZWNobm9sb2d5LCB0aGVyZSBpcyBvbmx5IG1hcmtldGluZworICA8L3NlY3Rpb24+Cis8L2RvYz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9hcGFjaGUueHNsIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2FwYWNoZS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwYWRkZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9hcGFjaGUueHNsCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KKworICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIvPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgIDxhdXRob3JzPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgPC9hdXRob3JzPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYXV0aG9yIj4KKyAgICA8YXV0aG9yPgorICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgIDwvYXV0aG9yPgorICA8L3hzbDp0ZW1wbGF0ZT4gCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2Jvb2tzLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9ib29rcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyMDgyOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9ib29rcy54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxib29rcz4NCisgIDxib29rIG5hbWU9ImhhbWxldCI+DQorICAgICAgPGF1dGhvciBuYW1lPSJzaGFrZXNwZWFyZSIvPg0KKyAgPC9ib29rPg0KKyAgIDxib29rIG5hbWU9InRoZSBsb3JkIG9mIHJpbmdzIj4NCisgICAgICAgPGF1dGhvciBuYW1lPSJ0b2xraWVuIi8+DQorICAgPC9ib29rPg0KKyAgIDxib29rIG5hbWU9ImxlIG1hbGFkZSBpbWFnaW5haXJlIj4NCisgICAgICAgPGF1dGhvciBuYW1lPSJtb2xpZXJlIi8+DQorICAgPC9ib29rPg0KKzwvYm9va3M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2NhdGFsb2cgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvY2F0YWxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzliZGRmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2NhdGFsb2cKQEAgLTAsMCArMSwyIEBACitQVUJMSUMgIi0vL3N0ZXZvLy9EVEQgZG9jIDEuMC8vRU4iICJkb2MuZHRkIgorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLWluLW5zLnhzZCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MtaW4tbnMueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDE0N2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLWluLW5zLnhzZApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAorCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYW50L2RvYy8iCisJeG1sbnM6dG5zPSJodHRwOi8vYXBhY2hlLm9yZy9hbnQvZG9jLyIKKwllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisJPHhzOmVsZW1lbnQgbmFtZT0iZG9jIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0idG5zOnNlY3Rpb24iLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9InNlY3Rpb24iPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idGl0bGUiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy5kdGQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTYyOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy5kdGQKQEAgLTAsMCArMSwyNCBAQAorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFFTEVNRU5UIGRvYyAoc2VjdGlvbikgPgorPCFFTEVNRU5UIHNlY3Rpb24gKCNQQ0RBVEEpPgorPCFBVFRMSVNUIHNlY3Rpb24gdGl0bGUgQ0RBVEEgI0lNUExJRUQ+CisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy54c2QgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWVkYmNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy54c2QKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4czpzY2hlbWEgCisgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCisgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKyAgPHhzOmVsZW1lbnQgbmFtZT0iZG9jIj4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0ic2VjdGlvbiIvPgorICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisgIDx4czplbGVtZW50IG5hbWU9InNlY3Rpb24iPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzaW1wbGVDb250ZW50PgorICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgICAgPC94czpzaW1wbGVDb250ZW50PgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy54c2wgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDljMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy54c2wKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8eHNsOnN0eWxlc2hlZXQgCisgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgeG1sbnM6dGVtcGxhdGU9InN0cnV0cyB0ZW1wbGF0ZSIgCisgICAgdmVyc2lvbj0iMS4wIj4KKzx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Cis8eHNsOnZhbHVlLW9mIHNlbGVjdD0iL2RvYy9zZWN0aW9uIi8+Cis8L3hzbDp0ZW1wbGF0ZT4gCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvY3dpdGhlbnRpdHkueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvY3dpdGhlbnRpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzVjMzIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jd2l0aGVudGl0eS54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIGJvb2tzIFsKKyAgIDwhRU5USVRZIGdsb2JhbGRlZmluaXRpb25zIFNZU1RFTSAiZW50aXR5LnhtbCI+CitdPgorPGJvb2tzPgorICAgJmdsb2JhbGRlZmluaXRpb25zOworICAgPGJvb2sgbmFtZT0idGhlIGxvcmQgb2YgcmluZ3MiPgorICAgICAgIDxhdXRob3IgbmFtZT0idG9sa2llbiIvPgorICAgPC9ib29rPgorICAgPGJvb2sgbmFtZT0ibGUgbWFsYWRlIGltYWdpbmFpcmUiPgorICAgICAgIDxhdXRob3IgbmFtZT0ibW9saWVyZSIvPgorICAgPC9ib29rPgorPC9ib29rcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2Utbm9TY2hlbWEtaW52YWxpZC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2Utbm9TY2hlbWEtaW52YWxpZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1ODA4NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9lbmRwaWVjZS1ub1NjaGVtYS1pbnZhbGlkLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIAorICAgIEludmFsaWQgdGVzdCBYTUwgZmlsZSB3aXRob3V0IGFueSBzY2hlbWEgcmVmZWZlcmVuY2VzIAorLS0+Cis8ZG9jPgorICAgIDxzZWN0aW9uIHRpdGxlPSJlbmRwaWVjZSI+CisgICAgICAgIFdpdGggYSBsaXR0bGUgbHVjaywgdGhlIG5ldHdvcmsgd2lsbCBwaWNrIG1lIHVwLiAKKyAgICAgICAgVGhpcyBpcyBSaXBsZXkgLSBsYXN0IHN1cnZpdm9yIG9mIFRoZSBOb3N0cm9tbyAtIHNpZ25pbmcgb2ZmLgorICAgIDwvc2VjdGlvbj4KKyAgICAKKyAgICA8aW52YWxpZGVsZW1lbnQvPgorICAgIAorPC9kb2M+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2Utbm9TY2hlbWEueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLW5vU2NoZW1hLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWU1NTlkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLW5vU2NoZW1hLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIAorICAgIFRlc3QgWE1MIGZpbGUgd2l0aG91dCBhbnkgc2NoZW1hIHJlZmVmZXJlbmNlcyAKKy0tPgorPGRvYz4KKyAgICA8c2VjdGlvbiB0aXRsZT0iZW5kcGllY2UiPgorICAgICAgICBXaXRoIGEgbGl0dGxlIGx1Y2ssIHRoZSBuZXR3b3JrIHdpbGwgcGljayBtZSB1cC4gCisgICAgICAgIFRoaXMgaXMgUmlwbGV5IC0gbGFzdCBzdXJ2aXZvciBvZiBUaGUgTm9zdHJvbW8gLSBzaWduaW5nIG9mZi4KKyAgICA8L3NlY3Rpb24+CisgICAgCis8L2RvYz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9lbmRwaWVjZS1ucy1uby1sb2NhdGlvbi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2UtbnMtbm8tbG9jYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTkzYzcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2UtbnMtbm8tbG9jYXRpb24ueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJkb2MtaW4tbnMueHNkIiB4bWxucz0iaHR0cDovL2FwYWNoZS5vcmcvYW50L2RvYy8iPgorCTxzZWN0aW9uIHRpdGxlPSJlbmRwaWVjZSI+CisgV2l0aCBhIGxpdHRsZSBsdWNrLCB0aGUgbmV0d29yayB3aWxsIHBpY2sgbWUgdXAuIAorIFRoaXMgaXMgUmlwbGV5IC0gbGFzdCBzdXJ2aXZvciBvZiBUaGUgTm9zdHJvbW8gLSBzaWduaW5nIG9mZi4KKyAgPC9zZWN0aW9uPgorPC9kb2M+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2UueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmU5M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRvYyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iZG9jLWluLW5zLnhzZCIgeG1sbnM9Imh0dHA6Ly9hcGFjaGUub3JnL2FudC9kb2MvIj4KKwk8c2VjdGlvbiB0aXRsZT0iZW5kcGllY2UiPgorIFdpdGggYSBsaXR0bGUgbHVjaywgdGhlIG5ldHdvcmsgd2lsbCBwaWNrIG1lIHVwLiAKKyBUaGlzIGlzIFJpcGxleSAtIGxhc3Qgc3Vydml2b3Igb2YgVGhlIE5vc3Ryb21vIC0gc2lnbmluZyBvZmYuCisgIDwvc2VjdGlvbj4KKzwvZG9jPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlMi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2UyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWM0OWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlMi54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2MgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCisgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249ImRvYy54c2QiCisgICAgeG1sbnM9Imh0dHA6Ly9NYXNzaXZlL0F0dGFjaytNZXp6YW5pbmUiPgorICA8c2VjdGlvbiB0aXRsZT0iZW5kcGllY2UiPgorIFdpdGggYSBsaXR0bGUgbHVjaywgdGhlIG5ldHdvcmsgd2lsbCBwaWNrIG1lIHVwLiAKKyBUaGlzIGlzIFJpcGxleSAtIGxhc3Qgc3Vydml2b3Igb2YgVGhlIE5vc3Ryb21vIC0gc2lnbmluZyBvZmYuCisgPGlsbGVnYWwtZWxlbWVudC8+CisgIDwvc2VjdGlvbj4KKzwvZG9jPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VudGl0eS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW50aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTA2NTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VudGl0eS54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgICA8Ym9vayBuYW1lPSJoYW1sZXQiPgorICAgICAgIDxhdXRob3IgbmFtZT0ic2hha2VzcGVhcmUiLz4KKyAgIDwvYm9vaz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9pc28tMjAyMi1qcC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvaXNvLTIwMjItanAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjVlNmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvaXNvLTIwMjItanAueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby0yMDIyLWpwIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgdGVzdCBbCisgIDwhRUxFTUVOVCB0ZXN0ICgjUENEQVRBKT4KK10+Cis8dGVzdD4KK0lTTy0yMDIyLUpQIBskQiROJVUlISUkJWshIxsoQgorPC90ZXN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3N0eWxlc2hlZXRfaW5jbHVkZS54c2wgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvc3R5bGVzaGVldF9pbmNsdWRlLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc0YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3N0eWxlc2hlZXRfaW5jbHVkZS54c2wKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iDQorICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCI+DQorDQorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJhdXRob3IiPg0KKyAgICA8YXV0aG9yPg0KKyAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPg0KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQorICAgICAgPC94c2w6YXR0cmlidXRlPg0KKyAgICA8L2F1dGhvcj4NCisgIDwveHNsOnRlbXBsYXRlPiANCis8L3hzbDpzdHlsZXNoZWV0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9zdHlsZXNoZWV0X3dpdGhfaW5jbHVkZS54c2wgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvc3R5bGVzaGVldF93aXRoX2luY2x1ZGUueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NWZjOGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvc3R5bGVzaGVldF93aXRoX2luY2x1ZGUueHNsCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIg0KKyAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPg0KKw0KKyAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiLz4NCisgIDx4c2w6aW5jbHVkZSBocmVmPSJzdHlsZXNoZWV0X2luY2x1ZGUueHNsIi8+DQorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4NCisgICAgPGF1dGhvcnM+DQorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQorICAgIDwvYXV0aG9ycz4NCisgIDwveHNsOnRlbXBsYXRlPg0KKzwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3Rlc3QueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmFiZTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdGVzdC54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cm9vdD4KKyAgPGE+dGhpcyBpcyB0aGUgZmlyc3QgbGluZTwvYT4KKyAgPGI+PGM+bm90IGluZGVudGVkPC9jPjwvYj4KKyAgPGI+CisgICAgPGM+aW5kZW50ZWQ8L2M+CisgIDwvYj4KKzwvcm9vdD4KKyAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3Rlc3QueHNsIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3Rlc3QueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjhlYjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdGVzdC54c2wKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8eHNsOnN0eWxlc2hlZXQJeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Cis8IS0tIENvcHkgZXZlcnkgbm9kZSBhbmQgYXR0cmlidXRlcyByZWN1cnNpdmVseSAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm9kZSgpfEAqIj4KKyAgICA8eHNsOmNvcHk+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgorICAgIDwveHNsOmNvcHk+CisgIDwveHNsOnRlbXBsYXRlPiAgCis8L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC91dGYtOC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdXRmLTgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdXRmLTgueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgdGVzdCBbCisgIDwhRUxFTUVOVCB0ZXN0ICgjUENEQVRBKT4KK10+Cis8dGVzdD4KK0xpYmVydOksIOlnYWxpdOksIGZyYXRlcm5pdOkhCis8L3Rlc3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdmFsaWRhdGUueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3ZhbGlkYXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRlNzIyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3ZhbGlkYXRlLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InZhbGlkYXRlIiBkZWZhdWx0PSJ0ZXN0VmFsaWRhdGUiIGJhc2VkaXI9Ii4iPgorCisgPHRhcmdldCBuYW1lPSJ0ZXN0VmFsaWRhdGUiPgorICAgIDx4bWx2YWxpZGF0ZSB3YXJuPSJmYWxzZSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJhYm91dC54bWwiLz4gIAorICAgICAgIDxkdGQgcHVibGljSUQ9Ii0vL3N0ZXZvLy9EVEQgZG9jIDEuMC8vRU4iCisgICAgICAgICBsb2NhdGlvbj0iZG9jLmR0ZCIvPgorICAgIDwveG1sdmFsaWRhdGU+CisgIDwvdGFyZ2V0PgorICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbHZhbGlkYXRlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbHZhbGlkYXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdjYzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sdmFsaWRhdGUueG1sCkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InZhbGlkYXRlIiBkZWZhdWx0PSJ0ZXN0VmFsaWRhdGUiIGJhc2VkaXI9Ii4iPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFZhbGlkYXRlIj4KKyAgICA8eG1sdmFsaWRhdGUgd2Fybj0iZmFsc2UiPgorICAgICAgPGZpbGVzZXQgZGlyPSJ4bWwiIGluY2x1ZGVzPSIqKi9hYm91dC54bWwiLz4gIAorICAgICAgIDxkdGQgcHVibGljSUQ9Ii0vL3N0ZXZvLy9EVEQgZG9jIDEuMC8vRU4iCisgICAgICAgICBsb2NhdGlvbj0ieG1sL2RvYy5kdGQiLz4KKyAgICA8L3htbHZhbGlkYXRlPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdERlZXBWYWxpZGF0ZSI+CisgICAgPGFudCBkaXI9InhtbCIgCisgICAgICBhbnRmaWxlPSJ2YWxpZGF0ZS54bWwiCisgICAgICB0YXJnZXQ9InRlc3RWYWxpZGF0ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InhtbGNhdGFsb2ciPgorICAgIDx4bWx2YWxpZGF0ZSB3YXJuPSJmYWxzZSI+CisgICAgICA8ZmlsZXNldCBkaXI9InhtbCIgaW5jbHVkZXM9IioqL2Fib3V0LnhtbCIvPgorICAgICAgPHhtbGNhdGFsb2cgY2xhc3NwYXRoPSJ4bWwiPgorICAgICAgICA8ZHRkIHB1YmxpY0lEPSItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIgorICAgICAgICAgICAgIGxvY2F0aW9uPSJkb2MuZHRkIi8+CisgICAgICA8L3htbGNhdGFsb2c+CisgICAgPC94bWx2YWxpZGF0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ4bWxjYXRhbG9nVmlhUmVmaWQiPgorICAgIDx4bWxjYXRhbG9nIGNsYXNzcGF0aD0ieG1sIiBpZD0iY2F0Ij4KKyAgICAgIDxkdGQgcHVibGljSUQ9Ii0vL3N0ZXZvLy9EVEQgZG9jIDEuMC8vRU4iIGxvY2F0aW9uPSJkb2MuZHRkIi8+CisgICAgPC94bWxjYXRhbG9nPgorICAgIDx4bWx2YWxpZGF0ZSB3YXJuPSJmYWxzZSI+CisgICAgICA8eG1sY2F0YWxvZyByZWZpZD0iY2F0Ii8+CisgICAgICA8ZmlsZXNldCBkaXI9InhtbCIgaW5jbHVkZXM9IioqL2Fib3V0LnhtbCIvPgorICAgIDwveG1sdmFsaWRhdGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ieG1sY2F0YWxvZ25lc3RlZCI+CisgICAgPHhtbHZhbGlkYXRlIHdhcm49ImZhbHNlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ieG1sIiBpbmNsdWRlcz0iKiovYWJvdXQueG1sIi8+CisgICAgICA8eG1sY2F0YWxvZyBjbGFzc3BhdGg9InhtbCI+CisgICAgICAgIDxlbnRpdHkgcHVibGljSUQgPSAiYm9ndXNJbWFnZSIKKyAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSAiL2kvZG9udC9leGlzdC5qcGciLz4KKyAgICAgICAgPHhtbGNhdGFsb2c+CisgICAgICAgICAgPGR0ZCBwdWJsaWNJRD0iLS8vc3Rldm8vL0RURCBkb2MgMS4wLy9FTiIKKyAgICAgICAgICAgICAgIGxvY2F0aW9uPSJkb2MuZHRkIi8+CisgICAgICAgIDwveG1sY2F0YWxvZz4KKyAgICAgIDwveG1sY2F0YWxvZz4KKyAgICA8L3htbHZhbGlkYXRlPgorICA8L3RhcmdldD4KKworICA8IS0tIFRoZSAtb3ZlcnJpZGUgdGVzdHMgc2hvdWxkIHBhc3Mgd2l0aG91dCByZXNvbHZlci5qYXIgLS0+CisgIDx0YXJnZXQgbmFtZT0ieG1sY2F0YWxvZ2ZpbGVzLW92ZXJyaWRlIj4KKyAgICA8eG1sdmFsaWRhdGUgd2Fybj0iZmFsc2UiPgorICAgICAgPGZpbGVzZXQgZGlyPSJ4bWwiIGluY2x1ZGVzPSIqKi9hYm91dC54bWwiLz4KKyAgICAgIDx4bWxjYXRhbG9nIGNsYXNzcGF0aD0ieG1sIj4KKyAgICAgICAgPGNhdGFsb2dwYXRoPgorICAgICAgICAgIDxmaWxlc2V0IGRpcj0ieG1sIiBpbmNsdWRlcz0iY2F0YWxvZyIvPgorICAgICAgICA8L2NhdGFsb2dwYXRoPgorICAgICAgICA8ZHRkIHB1YmxpY0lEPSItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIgorICAgICAgICAgICAgIGxvY2F0aW9uPSJkb2MuZHRkIi8+CisgICAgICA8L3htbGNhdGFsb2c+CisgICAgPC94bWx2YWxpZGF0ZT4KKyAgPC90YXJnZXQ+CisgCisgIDx0YXJnZXQgbmFtZT0ieG1sY2F0YWxvZ3BhdGgtb3ZlcnJpZGUiPgorICAgIDx4bWx2YWxpZGF0ZSB3YXJuPSJmYWxzZSI+CisgICAgICA8ZmlsZXNldCBkaXI9InhtbCIgaW5jbHVkZXM9IioqL2Fib3V0LnhtbCIvPgorICAgICAgPHhtbGNhdGFsb2cgY2xhc3NwYXRoPSJ4bWwiPgorICAgICAgICA8Y2F0YWxvZ3BhdGg+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ4bWwvY2F0YWxvZyIvPgorICAgICAgICA8L2NhdGFsb2dwYXRoPgorICAgICAgICA8ZHRkIHB1YmxpY0lEPSItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIgorICAgICAgICAgIGxvY2F0aW9uPSJkb2MuZHRkIi8+CisgICAgICA8L3htbGNhdGFsb2c+CisgICAgPC94bWx2YWxpZGF0ZT4KKyAgPC90YXJnZXQ+CisgCisgIDx0YXJnZXQgbmFtZT0ieG1sY2F0YWxvZ2ZpbGVzIj4KKyAgICA8eG1sdmFsaWRhdGUgd2Fybj0iZmFsc2UiPgorICAgICAgPGZpbGVzZXQgZGlyPSJ4bWwiIGluY2x1ZGVzPSIqKi9hYm91dC54bWwiLz4KKyAgICAgIDx4bWxjYXRhbG9nIGNsYXNzcGF0aD0ieG1sIj4KKyAgICAgICAgPGNhdGFsb2dwYXRoPgorICAgICAgICAgIDxmaWxlc2V0IGRpcj0ieG1sIiBpbmNsdWRlcz0iY2F0YWxvZyIvPgorICAgICAgICA8L2NhdGFsb2dwYXRoPgorICAgICAgPC94bWxjYXRhbG9nPgorICAgIDwveG1sdmFsaWRhdGU+CisgIDwvdGFyZ2V0PgorIAorICA8dGFyZ2V0IG5hbWU9InhtbGNhdGFsb2dwYXRoIj4KKyAgICA8eG1sdmFsaWRhdGUgd2Fybj0iZmFsc2UiPgorICAgICAgPGZpbGVzZXQgZGlyPSJ4bWwiIGluY2x1ZGVzPSIqKi9hYm91dC54bWwiLz4KKyAgICAgIDx4bWxjYXRhbG9nIGNsYXNzcGF0aD0ieG1sIj4KKyAgICAgICAgPGNhdGFsb2dwYXRoPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ieG1sL2NhdGFsb2ciLz4KKyAgICAgICAgPC9jYXRhbG9ncGF0aD4KKyAgICAgIDwveG1sY2F0YWxvZz4KKyAgICA8L3htbHZhbGlkYXRlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RTY2hlbWFHb29kIj4KKyAgICA8eG1sdmFsaWRhdGUgd2Fybj0iZmFsc2UiIGxlbmllbnQ9Im5vIiA+CisgICAgICA8ZmlsZXNldCBkaXI9InhtbCIgaW5jbHVkZXM9ImVuZHBpZWNlLnhtbCIvPgorCisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iCisgICAgICAgICAgICAgICAgICAgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIgorICAgICAgICAgICAgICAgICAgIHZhbHVlPSJmYWxzZSIvPgorCisgICAgPC94bWx2YWxpZGF0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U2NoZW1hQmFkIj4KKyAgICA8eG1sdmFsaWRhdGUgd2Fybj0iZmFsc2UiPgorICAgICAgPGZpbGVzZXQgZGlyPSJ4bWwiIGluY2x1ZGVzPSJlbmRwaWVjZTIueG1sIi8+CisgICAgICAKKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIKKyAgICAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIKKyAgICAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSIvPgorICAgIDwveG1sdmFsaWRhdGU+CisgIDwvdGFyZ2V0PgorICAgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RJc28yMDIySnAiPgorICAgIDx4bWx2YWxpZGF0ZSB3YXJuPSJmYWxzZSIgZmlsZT0ieG1sL2lzby0yMDIyLWpwLnhtbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RVdGY4Ij4KKyAgICA8eG1sdmFsaWRhdGUgd2Fybj0iZmFsc2UiIGZpbGU9InhtbC91dGYtOC54bWwiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tIFRlc3RzIHByb3BlcnR5IGVsZW1lbnQgd2l0aCBYTUwgZmlsZSB0aGF0IHNhdGlzZmllcyBzY2hlbWEgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdFByb3BlcnR5LnZhbGlkWE1MIj4KKworICAgIDwhLS0gQ29udmVydHMgcGF0aCB0byBVUkwgZm9ybWF0IC0tPgorICAgIDxwYXRoY29udmVydCBkaXJzZXA9Ii8iIHByb3BlcnR5PSJ4c2QuZmlsZSI+CisgICAgPHBhdGg+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJ4bWwvZG9jLnhzZCIvPgorICAgIDwvcGF0aD4KKyAgICA8L3BhdGhjb252ZXJ0PgorCisgICAgPHhtbHZhbGlkYXRlIGZpbGU9InhtbC9lbmRwaWVjZS1ub1NjaGVtYS54bWwiIGxlbmllbnQ9ImZhbHNlIgorICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSIgd2Fybj0idHJ1ZSI+CisKKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiCisgICAgICAgICAgICB2YWx1ZT0idHJ1ZSIvPgorCisgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICBuYW1lPSJodHRwOi8vYXBhY2hlLm9yZy94bWwvcHJvcGVydGllcy9zY2hlbWEvZXh0ZXJuYWwtbm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIKKyAgICAgICAgdmFsdWU9IiR7eHNkLmZpbGV9Ii8+CisgICAgPC94bWx2YWxpZGF0ZT4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tIFRlc3RzIHByb3BlcnR5IGVsZW1lbnQgd2l0aCBYTUwgZmlsZSB0aGF0IGZhaWxzIHNjaGVtYSB2YWxpZGF0aW9uIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RQcm9wZXJ0eS5pbnZhbGlkWE1MIj4KKworICAgICAgPCEtLSBDb252ZXJ0cyBwYXRoIHRvIFVSTCBmb3JtYXQgLS0+CisgICAgICA8cGF0aGNvbnZlcnQgZGlyc2VwPSIvIiBwcm9wZXJ0eT0ieHNkLmZpbGUiPgorICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InhtbC9kb2MueHNkIi8+CisgICAgICAgICAgPC9wYXRoPgorICAgICAgPC9wYXRoY29udmVydD4KKworICAgICAgPHhtbHZhbGlkYXRlIGZpbGU9InhtbC9lbmRwaWVjZS1ub1NjaGVtYS1pbnZhbGlkLnhtbCIgbGVuaWVudD0iZmFsc2UiCisgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiB3YXJuPSJ0cnVlIj4KKworICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIKKyAgICAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSIvPgorCisgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgbmFtZT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLW5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iCisgICAgICAgICAgICB2YWx1ZT0iJHt4c2QuZmlsZX0iLz4KKyAgICAgIDwveG1sdmFsaWRhdGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFNjaGVtYVdpdGhYU0QiPgorICAgIDx4bWx2YWxpZGF0ZSB3YXJuPSJmYWxzZSIgbGVuaWVudD0iZmFsc2UiIAorICAgICAgICBmaWxlPSJ4bWwvZW5kcGllY2Utbm9TY2hlbWEueG1sIj4KKyAgICAgIAorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIKKyAgICAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8cHJvcGVydHkKKyAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9hcGFjaGUub3JnL3htbC9wcm9wZXJ0aWVzL3NjaGVtYS9leHRlcm5hbC1ub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIgorICAgICAgICAgICAgdmFsdWU9IiR7eHNkLmZpbGV9Ii8+CisKKyAgICAgICA8L3htbHZhbGlkYXRlPgorICA8L3RhcmdldD4KKyAgCis8L3Byb2plY3Q+CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2YmYwYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHQueG1sCkBAIC0wLDAgKzEsMTA0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ieHNsdCIgZGVmYXVsdD0ieHNsdCIgYmFzZWRpcj0iLiI+CisgIDxwcm9wZXJ0eSBuYW1lPSJub25hc2NpaWRpciIgdmFsdWU9InhtbC8mIzAyMjc7bnQiLz4KKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICAgIDxta2RpciBkaXI9InhtbC9vdXQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Tm9uQXNjaWkiPgorICAgICAgPG1rZGlyIGRpcj0iJHtub25hc2NpaWRpcn0iLz4KKyAgICAgIDxjb3B5IHRvZGlyPSIke25vbmFzY2lpZGlyfSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ieG1sIj4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJkb2N3aXRoZW50aXR5LnhtbCIvPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImVudGl0eS54bWwiLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlYXJkb3duIj4KKyAgICAgIDxkZWxldGUgZGlyPSJ4bWwvb3V0Ii8+CisgICAgICA8ZGVsZXRlIGRpcj0iJHtub25hc2NpaWRpcn0iIHF1aWV0PSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q2F0Y2hOb0R0ZCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHhzbHQgYmFzZWRpcj0ieG1sIiBkZXN0ZGlyPSJ4bWwvb3V0IgorICAgICAgICAgICBpbmNsdWRlcz0iYWJvdXQueG1sIgorICAgICAgICAgICBleHRlbnNpb249Ii50eHQiCisgICAgICAgICAgIHN0eWxlPSJ4bWwvZG9jLnhzbCI+CisgICAgIDwveHNsdD4KKyAgPC90YXJnZXQ+CisgIAorICA8eG1sY2F0YWxvZyBpZD0ieGRvY3MuY2F0YWxvZyI+CisgICA8ZHRkIHB1YmxpY0lEPSItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIgorICAgICBsb2NhdGlvbj0ieG1sL2RvYy5kdGQiLz4KKyAgPC94bWxjYXRhbG9nPiAgCisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RDYXRhbG9nIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8eHNsdCBkZXN0ZGlyPSJ4bWwvb3V0IgorICAgICAgICAgICBpbmNsdWRlcz0iYWJvdXQueG1sIgorICAgICAgICAgICBleHRlbnNpb249Ii50eHQiCisgICAgICAgICAgIHN0eWxlPSJ4bWwvZG9jLnhzbCI+CisgICAgICAgPHhtbGNhdGFsb2cgcmVmaWQ9Inhkb2NzLmNhdGFsb2ciLz4KKyAgICAgPC94c2x0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RPdXRwdXRQcm9wZXJ0eSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHhzbHQgaW49InhtbC90ZXN0LnhtbCIKKyAgICAgICAgICAgb3V0PSJ4bWwvb3V0L3Rlc3Qtb3V0LnhtbCIKKyAgICAgICAgICAgc3R5bGU9InhtbC90ZXN0LnhzbCI+CisgICAgICA8b3V0cHV0cHJvcGVydHkgbmFtZT0ibWV0aG9kIiB2YWx1ZT0ieG1sIi8+CisgICAgICA8b3V0cHV0cHJvcGVydHkgbmFtZT0ic3RhbmRhbG9uZSIgdmFsdWU9InllcyIvPgorICAgICAgPG91dHB1dHByb3BlcnR5IG5hbWU9ImVuY29kaW5nIiB2YWx1ZT0iaXNvODg1OV8xIi8+CisgICAgICA8b3V0cHV0cHJvcGVydHkgbmFtZT0iaW5kZW50IiB2YWx1ZT0ieWVzIi8+CisgICAgPC94c2x0PgorICA8L3RhcmdldD4KKyAgCisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RGYWN0b3J5IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8eHNsdCBpbj0ieG1sL3Rlc3QueG1sIgorICAgICAgICAgICBvdXQ9InhtbC9vdXQvdGVzdC1vdXQueG1sIgorICAgICAgICAgICBzdHlsZT0ieG1sL3Rlc3QueHNsIj4KKyAgICAgICAgICAgPGZhY3RvcnkgbmFtZT0ib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCIvPgorICAgIDwveHNsdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QXR0cmlidXRlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8eHNsdCBpbj0ieG1sL3Rlc3QueG1sIgorICAgICAgICAgICBvdXQ9InhtbC9vdXQvdGVzdC1vdXQueG1sIgorICAgICAgICAgICBzdHlsZT0ieG1sL3Rlc3QueHNsIj4KKyAgICAgICAgICAgPGZhY3RvcnkgbmFtZT0ib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCI+CisgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9vcHRpbWl6ZSIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgPC9mYWN0b3J5PgorICAgIDwveHNsdD4KKyAgPC90YXJnZXQ+CisgIDwhLS0gaW5zcGlyZWQgYnkgYnVnIHJlcG9ydCAzNzM0OCAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0WE1MV2l0aEVudGl0aWVzSW5Ob25Bc2NpaVBhdGgiIGRlcGVuZHM9ImluaXROb25Bc2NpaSI+CisgICAgPHhzbHQgaW49IiR7bm9uYXNjaWlkaXJ9L2RvY3dpdGhlbnRpdHkueG1sIgorICAgICAgICAgICBvdXQ9InhtbC9vdXQvdGVzdC1vdXQueG1sIgorICAgICAgICAgICBzdHlsZT0ieG1sL2FwYWNoZS54c2wiPgorICAgIDwveHNsdD4KKyAgPC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0idGVzdFN0eWxlU2hlZXRXaXRoSW5jbHVkZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHhzbHQgaW49InhtbC9ib29rcy54bWwiCisgICAgICAgICAgIG91dD0ieG1sL291dC90ZXN0LW91dC54bWwiCisgICAgICAgICAgIHN0eWxlPSJ4bWwvc3R5bGVzaGVldF93aXRoX2luY2x1ZGUueHNsIj4KKyAgICA8L3hzbHQ+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDkzMzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1lbmNvZGluZy1pbi54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJvb3Q+CisgICAgPG1lc3NhZ2U+6eDo7/k8L21lc3NhZ2U+Cis8L3Jvb3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1lbmNvZGluZy1pbi54c2wgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1lbmNvZGluZy1pbi54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5YmY4MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWVuY29kaW5nLWluLnhzbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgICAgPHJvb3Q+CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii9yb290L21lc3NhZ2UiPgorICAgICAgICA8bWVzc2FnZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvbWVzc2FnZT4KKyAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3Jvb3Q+Cis8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiMDI0NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBwcm9qZWN0IFsKKyAgICA8IUVOVElUWSBpbmNsdWRlIFNZU1RFTSAieHNsdGxpYWlzb24taW5jbHVkZS54bWwiPgorXT4KKzxwcm9qZWN0PgorICAgICZpbmNsdWRlOworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueHNsIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MmQzOGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54c2wKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Cis8eHNsOmluY2x1ZGUgaHJlZj0ieHNsdGxpYWlzb24taW5jbHVkZS54c2wiLz4KKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbmNsdWRlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluY2x1ZGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzEzZTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbmNsdWRlLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gdG8gYmUgaW5jbHVkZWQgYnkgeHNsdGxpYWlzb24taW5jbHVkZS54c2wgLS0+Cis8dGFzay8+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbmNsdWRlLnhzbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluY2x1ZGUueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NmYxYjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbmNsdWRlLnhzbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KKzwhLS0gdG8gYmUgaW5jbHVkZWQgYnkgeHNsdGxpYWlzb24taW4ueHNsIC0tPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3BhcmFsbGVsLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3BhcmFsbGVsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzE2ODFjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcGFyYWxsZWwueG1sCkBAIC0wLDAgKzEsMTQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0icGFyYWxsZWwtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCI+CisgIDx0YXJnZXQgbmFtZT0idGVzdEJhc2ljIj4KKyAgICA8cGFyYWxsZWw+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPHNsZWVwIHNlY29uZHM9IjEiLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHt0ZXN0LmRlbGF5ZWR9Ii8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgICA8ZWNobyBtZXNzYWdlPSIke3Rlc3QuZGlyZWN0fSIvPgorICAgIDwvcGFyYWxsZWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZhaWwiPgorICAgIDxwYXJhbGxlbD4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8c2xlZXAgc2Vjb25kcz0iMSIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIke3Rlc3QuZGVsYXllZH0iLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICAgIDxmYWlsIG1lc3NhZ2U9IiR7dGVzdC5mYWlsdXJlfSIvPgorICAgIDwvcGFyYWxsZWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFRocmVhZENvdW50Ij4KKyAgICA8ZWNobz58MS88L2VjaG8+CisgICAgPHBhcmFsbGVsIHRocmVhZENvdW50PScxJyBwb2xsSW50ZXJ2YWw9IjYwIj4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIrIi8+CisgICAgICAgIDxzbGVlcCBtaWxsaXNlY29uZHM9IjMwIi8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9Ii0iLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIrIi8+CisgICAgICAgIDxzbGVlcCBtaWxsaXNlY29uZHM9IjYwIi8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9Ii0iLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIrIi8+CisgICAgICAgIDxzbGVlcCBtaWxsaXNlY29uZHM9IjkwIi8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9Ii0iLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L3BhcmFsbGVsPgorICAgIDxlY2hvPnwyLzwvZWNobz4KKyAgICA8cGFyYWxsZWwgdGhyZWFkQ291bnQ9JzInIHBvbGxJbnRlcnZhbD0iMzAiPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IisiLz4KKyAgICAgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iMzAiLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iLSIvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IisiLz4KKyAgICAgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iNjAiLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iLSIvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IisiLz4KKyAgICAgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iOTAiLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iLSIvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvcGFyYWxsZWw+CisgICAgPGVjaG8+fDMvPC9lY2hvPgorICAgIDxwYXJhbGxlbCB0aHJlYWRDb3VudD0nMycgcG9sbEludGVydmFsPSIzMCI+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iKyIvPgorICAgICAgICA8c2xlZXAgbWlsbGlzZWNvbmRzPSIzMCIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSItIi8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iKyIvPgorICAgICAgICA8c2xlZXAgbWlsbGlzZWNvbmRzPSI2MCIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSItIi8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iKyIvPgorICAgICAgICA8c2xlZXAgbWlsbGlzZWNvbmRzPSI5MCIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSItIi8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9wYXJhbGxlbD4KKyAgICA8ZWNobz58NC88L2VjaG8+CisgICAgPHBhcmFsbGVsIHRocmVhZENvdW50PSc0JyBwb2xsSW50ZXJ2YWw9IjMwIj4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIrIi8+CisgICAgICAgIDxzbGVlcCBtaWxsaXNlY29uZHM9IjMwIi8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9Ii0iLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIrIi8+CisgICAgICAgIDxzbGVlcCBtaWxsaXNlY29uZHM9IjYwIi8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9Ii0iLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIrIi8+CisgICAgICAgIDxzbGVlcCBtaWxsaXNlY29uZHM9IjkwIi8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9Ii0iLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L3BhcmFsbGVsPgorICAgIDxlY2hvPnw0LzwvZWNobz4KKyAgICA8cGFyYWxsZWwgdGhyZWFkc1BlclByb2Nlc3Nvcj0nMScgdGhyZWFkY291bnQ9JzQnIHBvbGxJbnRlcnZhbD0iMzAiPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IisiLz4KKyAgICAgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iMzAiLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iLSIvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IisiLz4KKyAgICAgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iNjAiLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iLSIvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IisiLz4KKyAgICAgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iOTAiLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iLSIvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvcGFyYWxsZWw+CisgICAgPGVjaG8+fDwvZWNobz4KKyAgICAKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RGVtdXgiPgorICAgIDxwYXJhbGxlbD4KKyAgICAgIDxkZW11eHRlc3QvPgorICAgICAgPGRlbXV4dGVzdC8+CisgICAgICA8ZGVtdXh0ZXN0Lz4KKyAgICAgIDxkZW11eHRlc3QvPgorICAgICAgPGRlbXV4dGVzdC8+CisgICAgPC9wYXJhbGxlbD4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImhlbHAiPgorICAgIDxlY2hvPlRlc3QgYnVpbGQgZmlsZSBmb3IgdGhlICZsdDtwYXJhbGxlbCZndDsgdGFzay48L2VjaG8+IAorICAgIDxlY2hvPlVzZSB0aGUgdmFyaW91cyB0YXJnZXRzIHRvIHJ1biB0aGUgdGVzdHMuPC9lY2hvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3BhdGhjb252ZXJ0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3BhdGhjb252ZXJ0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTAwYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcGF0aGNvbnZlcnQueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0icGF0aGNvbnZlcnQiPgorCisgICAgPHBhdGggaWQ9InRlc3RwYXRoIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YW50LmZpbGV9IiAvPgorICAgIDwvcGF0aD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdG1hcCI+CisgICAgICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0icmVzdWx0IiBkaXJzZXA9IiMiPgorICAgICAgICAgICAgPHBhdGggcmVmaWQ9InRlc3RwYXRoIiAvPgorICAgICAgICAgICAgPG1hcCBmcm9tPSIke2Jhc2VkaXJ9IiB0bz0idGVzdCIgLz4KKyAgICAgICAgPC9wYXRoY29udmVydD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdG1hcHBlciI+CisgICAgICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0icmVzdWx0IiBkaXJzZXA9IiMiPgorICAgICAgICAgICAgPHBhdGggcmVmaWQ9InRlc3RwYXRoIiAvPgorICAgICAgICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIke2Jhc2VkaXJ9IiB0bz0idGVzdCIgLz4KKyAgICAgICAgPC9wYXRoY29udmVydD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdG5vdGFyZ2V0b3MiPgorICAgICAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9InJlc3VsdCIgcmVmaWQ9InRlc3RwYXRoIiAvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcmVzZXRkZWYueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJlc2V0ZGVmLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTU3NDdlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJlc2V0ZGVmLnhtbApAQCAtMCwwICsxLDE0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgPHBhdGggaWQ9InRlc3QtY2xhc3NlcyI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KKyAgPC9wYXRoPgorICAKKyAgPHRhcmdldCBuYW1lPSJzaW1wbGUiPgorICAgIDxwcmVzZXRkZWYgbmFtZT0ibXkuZWNobyI+CisgICAgICA8ZWNobyBtZXNzYWdlPSJIZWxsbyB3b3JsZCIvPgorICAgIDwvcHJlc2V0ZGVmPgorICAgIDxteS5lY2hvLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXh0Ij4KKyAgICA8cHJlc2V0ZGVmIG5hbWU9Im15LmVjaG8iPgorICAgICAgPGVjaG8+SW5uZXIgVGV4dDwvZWNobz4KKyAgICA8L3ByZXNldGRlZj4KKyAgICA8bXkuZWNoby8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idXJpIj4KKyAgICA8cHJlc2V0ZGVmIG5hbWU9ImVjaG8iIHVyaT0iYWJjIj4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9IkhlbGxvIHdvcmxkIi8+CisgICAgPC9wcmVzZXRkZWY+CisgICAgPHg6ZWNobyB4bWxuczp4PSJhYmMiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkZWZhdWx0dGVzdCI+CisgICAgPHRhc2tkZWYgbmFtZT0iZGVmYXVsdHRlc3QiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QcmVTZXREZWZUZXN0JERlZmF1bHRUZXN0IgorICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC1jbGFzc2VzIi8+CisgICAgPHByZXNldGRlZiBuYW1lPSJkIj4KKyAgICAgIDxkZWZhdWx0dGVzdCBhdHRyaWJ1dGU9InRydWUiLz4KKyAgICA8L3ByZXNldGRlZj4KKyAgICA8ZCBhdHRyaWJ1dGU9ImZhbHNlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZG91YmxlZGVmYXVsdCI+CisgICAgPHRhc2tkZWYgbmFtZT0iZGVmYXVsdHRlc3QiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QcmVTZXREZWZUZXN0JERlZmF1bHRUZXN0IgorICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC1jbGFzc2VzIi8+CisgICAgPHByZXNldGRlZiBuYW1lPSJkIj4KKyAgICAgIDxkZWZhdWx0dGVzdCBhdHRyaWJ1dGU9InRydWUiLz4KKyAgICA8L3ByZXNldGRlZj4KKyAgICA8cHJlc2V0ZGVmIG5hbWU9ImRkIj4KKyAgICAgIDxkIGF0dHJpYnV0ZT0iZmFsc2UiLz4KKyAgICA8L3ByZXNldGRlZj4KKyAgICA8ZGQvPgorICAgIDxkZCBhdHRyaWJ1dGU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbnRUeXBlVGVzdCI+CisgICAgPHRhc2tkZWYgbmFtZT0iYW50dHlwZXRlc3QiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QcmVTZXREZWZUZXN0JEFudFR5cGVUZXN0IgorICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC1jbGFzc2VzIi8+CisgICAgPHByZXNldGRlZiBuYW1lPSJqYXZhLmZpbGVzZXQiPgorICAgICAgPGZpbGVzZXQ+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvcHJlc2V0ZGVmPgorICAgIAorICAgIDxhbnR0eXBldGVzdD4KKyAgICAgIDxmaWxlc2V0IGFudC10eXBlPSJqYXZhLmZpbGVzZXQiIGRpcj0iLiIvPgorICAgICAgPGNvbmZpZ3VyZWQgYW50LXR5cGU9ImphdmEuZmlsZXNldCIgZGlyPSIuIi8+CisgICAgPC9hbnR0eXBldGVzdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXh0Lm9wdGlvbmFsIj4KKyAgICA8cHJlc2V0ZGVmIG5hbWU9ImVjaG8ubXl0ZXh0Ij4KKyAgICAgIDxlY2hvPk15VGV4dDwvZWNobz4KKyAgICA8L3ByZXNldGRlZj4KKyAgICA8ZWNoby5teXRleHQvPgorICAgIDxlY2hvLm15dGV4dD5vdmVycmlkZSB0ZXh0PC9lY2hvLm15dGV4dD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJlbGVtZW50Lm9yZGVyIj4KKyAgICA8cHJlc2V0ZGVmIG5hbWU9ImVsLm9yZGVyIj4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZWNobz5MaW5lIDE8L2VjaG8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9wcmVzZXRkZWY+CisgICAgPGVsLm9yZGVyPgorICAgICAgPGVjaG8+TGluZSAyPC9lY2hvPgorICAgIDwvZWwub3JkZXI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZWxlbWVudC5vcmRlcjIiPgorICAgIDxwcmVzZXRkZWYgbmFtZT0iZWwub3JkZXIiPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxlY2hvPkxpbmUgMTwvZWNobz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L3ByZXNldGRlZj4KKyAgICA8cHJlc2V0ZGVmIG5hbWU9ImVsLm9yZGVyMiI+CisgICAgICA8ZWwub3JkZXI+CisgICAgICAgIDxlY2hvPkxpbmUgMjwvZWNobz4KKyAgICAgIDwvZWwub3JkZXI+CisgICAgPC9wcmVzZXRkZWY+CisgICAgPGVsLm9yZGVyMj4KKyAgICAgIDxlY2hvPkxpbmUgMzwvZWNobz4KKyAgICA8L2VsLm9yZGVyMj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb3JyZWN0X3Rhc2tuYW1lX2JhZGF0dHIiPgorICAgIDxwcmVzZXRkZWYgbmFtZT0ibXl0YXNrIj4KKyAgICAgICA8amF2YWMgc3JjZGlyPSJ3aGF0ZXZlciIvPgorICAgIDwvcHJlc2V0ZGVmPgorCisgICAgPGphdmFjIHNyY2Rpcj0id2hhdGV2ZXIiIGJhZGF0dHI9IndoYXRldmVyIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29ycmVjdF90YXNrbmFtZV9iYWRlbCI+CisgICAgPHByZXNldGRlZiBuYW1lPSJteXRhc2siPgorICAgICAgIDxqYXZhYyBzcmNkaXI9IndoYXRldmVyIi8+CisgICAgPC9wcmVzZXRkZWY+CisKKyAgICA8amF2YWMgc3JjZGlyPSJ3aGF0ZXZlciI+CisgICAgICA8YmFkZWwvPgorICAgIDwvamF2YWM+CisgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJwcmVzZXRkZWYtd2l0aC1uZXN0ZWQtZWxlbWVudC10d2ljZSI+CisgICAgICAgIDxjb3B5IHRvZGlyPSIuIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9Im5vbmV4aXN0ZW50Ii8+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPHByZXNldGRlZiBuYW1lPSJjb3B5Ij4KKyAgICAgICAgICAgIDxjb3B5IHZlcmJvc2U9InRydWUiLz4KKyAgICAgICAgPC9wcmVzZXRkZWY+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQ5ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkueG1sCkBAIC0wLDAgKzEsOTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJwcm9wZXJ0eS10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHByb3BlcnR5IG5hbWU9InRtcC5kaXIiIHZhbHVlPSJfdG1wZGlyXyIvPgorICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqYXZhNSsiIGNsYXNzbmFtZT0iamF2YS5sYW5nLkl0ZXJhYmxlIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dG1wLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJ0ZXN0ZW52Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cHJvcDEiIHZhbHVlPSJhYSIvPgorICAgIDxwcm9wZXJ0eSBmaWxlPSJwcm9wZXJ0eTEucHJvcGVydGllcyIvPgorICAgIDxlY2hvIG1lc3NhZ2U9InRlc3Rwcm9wMT0ke3Rlc3Rwcm9wMX0sIHRlc3Rwcm9wMz0ke3Rlc3Rwcm9wM30sIHRlc3Rwcm9wND0ke3Rlc3Rwcm9wNH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPHByb3BlcnR5IGZpbGU9InByb3BlcnR5Mi5wcm9wZXJ0aWVzIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJodHRwLnBvcnQiIHZhbHVlPSI5OTkiIC8+CisgICAgPHByb3BlcnR5IGZpbGU9InByb3BlcnR5My5wcm9wZXJ0aWVzIi8+CisgICAgPGVjaG8gbWVzc2FnZT0iaHR0cC51cmwgaXMgJHtodHRwLnVybH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NSI+CisgICAgPHByb3BlcnR5IG5hbWU9Imh0dHAucG9ydCIgdmFsdWU9Ijk5OSIgLz4KKyAgICA8cHJvcGVydHkgdXJsPSIke3Rlc3Q1LnVybH0iLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJodHRwLnVybCBpcyAke2h0dHAudXJsfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InByZWZpeC5zdWNjZXNzIj4KKyAgICA8cHJvcGVydHkgZmlsZT0icHJvcGVydHkzLnByb3BlcnRpZXMiIHByZWZpeD0ic2VydmVyMSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InByZWZpeC5mYWlsIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic29tZXByb3AiIHZhbHVlPSJ2YWx1ZSIgcHJlZml4PSJwcmVmaXgiLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBjYXVzZWQgYW4gZW5kbGVzcyBsb29wLCBQUiAyMTgyNSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q2lyY3VsYXJSZWZlcmVuY2UiPgorICAgIDxwcm9wZXJ0eSBmaWxlPSJwcm9wZXJ0eTQucHJvcGVydGllcyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRoaXNJc05vdEFDaXJjdWxhclJlZmVyZW5jZSI+CisgICAgPHByb3BlcnR5IGZpbGU9InByb3BlcnR5NS5wcm9wZXJ0aWVzIi8+CisgICAgPGVjaG8+YiBpcyAke2J9PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImdlblhtbFByb3BGaWxlIj4KKyAgICA8bWtkaXIgZGlyPSIke3RtcC5kaXJ9Ii8+ICAKKyAgICA8ZWNobyBmaWxlPSIke3RtcC5kaXJ9L3Byb3BzLnhtbCI+Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OworJmx0OyFET0NUWVBFIHByb3BlcnRpZXMgU1lTVEVNICZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3Byb3BlcnRpZXMuZHRkJnF1b3Q7Jmd0OworJmx0O3Byb3BlcnRpZXMgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsmZ3Q7CisgICAgJmx0O2NvbW1lbnQmZ3Q7CisgICAgICAgIEV4YW1wbGUgb2YgcHJvcGVydHkgZGVmaW5pdGlvbiBhY2NvcmRpbmcgdG8gU3VucyBEVEQgYXMKKyAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBKYXZhNSBkb2NzIGFuZCBodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcm9wZXJ0aWVzLmR0ZC4KKyAgICAmbHQ7L2NvbW1lbnQmZ3Q7CisgICAgJmx0O2VudHJ5IGtleT0mcXVvdDt4bWwub25lJnF1b3Q7Jmd0O09ORSZsdDsvZW50cnkmZ3Q7CisgICAgJmx0O2VudHJ5IGtleT0mcXVvdDt4bWwudHdvJnF1b3Q7Jmd0O1RXTyZsdDsvZW50cnkmZ3Q7CismbHQ7L3Byb3BlcnRpZXMmZ3Q7CisgICAgPC9lY2hvPiAgCisgIDwvdGFyZ2V0PiAgICAgIAorCisgIDx0YXJnZXQgbmFtZT0idGVzdFhtbFByb3BlcnR5LmludGVybmFsIiBkZXBlbmRzPSJnZW5YbWxQcm9wRmlsZSIgaWY9ImphdmE1KyI+CisgICAgICA8cHJvcGVydHkgZmlsZT0iJHt0bXAuZGlyfS9wcm9wcy54bWwiLz4KKyAgPC90YXJnZXQ+ICAgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RYbWxQcm9wZXJ0eSIgZGVwZW5kcz0idGVzdFhtbFByb3BlcnR5LmludGVybmFsIi8+ICAKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkxLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjNlYmQzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkxLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgordGVzdHByb3AyPXh4Cit0ZXN0cHJvcDM9JHt0ZXN0cHJvcDJ9eXkKK3Rlc3Rwcm9wND0ke3Rlc3Rwcm9wMX16egpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkyLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTI1MzEyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgordGVzdHByb3AxPWFhJHt0ZXN0cHJvcDJ9YmIKK3Rlc3Rwcm9wMj1jYyR7dGVzdHByb3AxfWRkCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5My5wcm9wZXJ0aWVzIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyMTYxMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5My5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK2h0dHAucG9ydCA9IDgwCitodHRwLnVybCA9IGh0dHA6Ly9sb2NhbGhvc3Q6JHtodHRwLnBvcnR9CisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHk0LnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTUyNzEwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHk0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorYT0ke2F9CitiPSR7YX0vYgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHk1LnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWViY2QzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHk1LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorYT1BCitiPSR7YX0vJHtjfS8ke2F9CitjPSR7YX0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlY29yZGVyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlY29yZGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjI2MDAwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVjb3JkZXIueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0icmVjb3JkZXItdGVzdCIgZGVmYXVsdD0iYWxsIiBiYXNlZGlyPSIuIj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJyZWNpbiIgbG9jYXRpb249InJlY29yZGVyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlY2RpciIgbG9jYXRpb249InJlY29yZGVyLW91dCIvPgorCisgICAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9Im5vYXBwZW5kLGFwcGVuZCxyZXN0YXJ0LGRlbGV0ZXJlc3RhcnQiLz4KKworICAgIDx0YXJnZXQgbmFtZT0icHJlcGFyZSI+CisgICAgICA8bWtkaXIgZGlyPSIke3JlY2Rpcn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ibm9hcHBlbmQiPgorICAgICAgICA8Y29weSBmaWxlPSIke3JlY2lufS9yZWN0ZXN0Mi5yZXN1bHQiIHRvZmlsZT0iJHtyZWNkaXJ9L3JlY3Rlc3QxLmxvZyIvPgorICAgICAgICA8cmVjb3JkIG5hbWU9IiR7cmVjZGlyfS9yZWN0ZXN0MS5sb2ciIGFjdGlvbj0ic3RhcnQiIC8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9InNvbWUgbWVzc2FnZTEiLz4KKyAgICAgICAgPHJlY29yZCBuYW1lPSIke3JlY2Rpcn0vcmVjdGVzdDEubG9nIiBhY3Rpb249InN0b3AiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImFwcGVuZCI+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cmVjaW59L3JlY3Rlc3QxLnJlc3VsdCIgdG9maWxlPSIke3JlY2Rpcn0vcmVjdGVzdDIubG9nIi8+CisgICAgICAgIDxyZWNvcmQgbmFtZT0iJHtyZWNkaXJ9L3JlY3Rlc3QyLmxvZyIgYXBwZW5kPSJ0cnVlIiBhY3Rpb249InN0YXJ0Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9InNvbWUgbWVzc2FnZTIiLz4KKyAgICAgICAgPHJlY29yZCBuYW1lPSIke3JlY2Rpcn0vcmVjdGVzdDIubG9nIiBhY3Rpb249InN0b3AiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVzdGFydCI+CisgICAgICAgIDxyZWNvcmQgbmFtZT0iJHtyZWNkaXJ9L3JlY3Rlc3QzLmxvZyIgYWN0aW9uPSJzdGFydCIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJzb21lIG1lc3NhZ2UxIi8+CisgICAgICAgIDxyZWNvcmQgbmFtZT0iJHtyZWNkaXJ9L3JlY3Rlc3QzLmxvZyIgYWN0aW9uPSJzdG9wIi8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9InNvbWUgbWVzc2FnZTIiLz4KKyAgICAgICAgPHJlY29yZCBuYW1lPSIke3JlY2Rpcn0vcmVjdGVzdDMubG9nIiBhY3Rpb249InN0YXJ0Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9InNvbWUgbWVzc2FnZTMiLz4KKyAgICAgICAgPHJlY29yZCBuYW1lPSIke3JlY2Rpcn0vcmVjdGVzdDMubG9nIiBhY3Rpb249InN0b3AiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZGVsZXRlcmVzdGFydCI+CisgICAgICAgIDxyZWNvcmQgbmFtZT0iJHtyZWNkaXJ9L3JlY3Rlc3Q0LmxvZyIgYWN0aW9uPSJzdGFydCIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJzb21lIG1lc3NhZ2UxIi8+CisgICAgICAgIDxyZWNvcmQgbmFtZT0iJHtyZWNkaXJ9L3JlY3Rlc3Q0LmxvZyIgYWN0aW9uPSJzdG9wIi8+CisgICAgICAgIDxkZWxldGUgZmlsZT0iJHtyZWNkaXJ9L3JlY3Rlc3Q0LmxvZyIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJzb21lIG1lc3NhZ2UyIi8+CisgICAgICAgIDxyZWNvcmQgbmFtZT0iJHtyZWNkaXJ9L3JlY3Rlc3Q0LmxvZyIgYWN0aW9uPSJzdGFydCIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJzb21lIG1lc3NhZ2UzIi8+CisgICAgICAgIDxyZWNvcmQgbmFtZT0iJHtyZWNkaXJ9L3JlY3Rlc3Q0LmxvZyIgYWN0aW9uPSJzdG9wIi8+CisgICAgPC90YXJnZXQ+CisKKworICAgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgICAgPGRlbGV0ZSBkaXI9IiR7cmVjZGlyfSIvPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZWNvcmRlci9yZWN0ZXN0MS5yZXN1bHQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZWNvcmRlci9yZWN0ZXN0MS5yZXN1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4MDEzZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlY29yZGVyL3JlY3Rlc3QxLnJlc3VsdApAQCAtMCwwICsxIEBACisgICAgIFtlY2hvXSBzb21lIG1lc3NhZ2UxCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZWNvcmRlci9yZWN0ZXN0Mi5yZXN1bHQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZWNvcmRlci9yZWN0ZXN0Mi5yZXN1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1NTBmZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlY29yZGVyL3JlY3Rlc3QyLnJlc3VsdApAQCAtMCwwICsxLDIgQEAKKyAgICAgW2VjaG9dIHNvbWUgbWVzc2FnZTEKKyAgICAgW2VjaG9dIHNvbWUgbWVzc2FnZTIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlY29yZGVyL3JlY3Rlc3QzLnJlc3VsdCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlY29yZGVyL3JlY3Rlc3QzLnJlc3VsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDk2MTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVjb3JkZXIvcmVjdGVzdDMucmVzdWx0CkBAIC0wLDAgKzEsMiBAQAorICAgICBbZWNob10gc29tZSBtZXNzYWdlMQorICAgICBbZWNob10gc29tZSBtZXNzYWdlMwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVjb3JkZXIvcmVjdGVzdDQucmVzdWx0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVjb3JkZXIvcmVjdGVzdDQucmVzdWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjIzOWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZWNvcmRlci9yZWN0ZXN0NC5yZXN1bHQKQEAgLTAsMCArMSBAQAorICAgICBbZWNob10gc29tZSBtZXNzYWdlMwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVuYW1lLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlbmFtZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzYTgxZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlbmFtZS54bWwKQEAgLTAsMCArMSw1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPHJlbmFtZS8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxyZW5hbWUgc3JjPSIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPHJlbmFtZSBkZXN0PSIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+CisgICAgPHJlbmFtZSBzcmM9InRlc3RkaXIiIAorICAgICAgICAgICAgZGVzdD0idGVzdGRpciIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KKyAgICA8cmVuYW1lIHNyYz0idGVtcGxhdGUueG1sIiAKKyAgICAgICAgICAgIGRlc3Q9Ii4iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NiI+CisgICAgPHJlbmFtZSBzcmM9InRlbXBsYXRlLnhtbCIgCisgICAgICAgICAgICBkZXN0PSJ0ZW1wbGF0ZS50bXAiLz4KKyAgICA8cmVuYW1lIHNyYz0idGVtcGxhdGUudG1wIiAKKyAgICAgICAgICAgIGRlc3Q9InRlbXBsYXRlLnhtbCIvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVwbGFjZS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzIxNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVwbGFjZS54bWwKQEAgLTAsMCArMSw4MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Inh4eC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHByb3BlcnR5IG5hbWU9InRtcC5kaXIiIGxvY2F0aW9uPSJyZXBsYWNlL3RtcCIvPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxyZXBsYWNlLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPHJlcGxhY2UgZmlsZT0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiPgorICAgIDxyZXBsYWNlIGZpbGU9InRlbXBsYXRlLnhtbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KKyAgICA8cmVwbGFjZSBmaWxlPSJ0ZW1wbGF0ZS54bWwiIHRva2VuPSIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NSI+CisgICAgPHJlcGxhY2UgZmlsZT0idGVtcGxhdGUueG1sIiAKKyAgICAgICAgICAgICB0b2tlbj0iZG9udF93YW50X3RvX3JlYWxseV9yZXBsYWNlX3NvbWV0aGluZyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KKyAgICA8cmVwbGFjZSBmaWxlPSJ0ZW1wbGF0ZS54bWwiPgorICAgICAgPHJlcGxhY2VmaWx0ZXIgLz4KKyAgICA8L3JlcGxhY2U+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDciPgorICAgIDxyZXBsYWNlIGZpbGU9InRlbXBsYXRlLnhtbCI+CisgICAgICA8cmVwbGFjZWZpbHRlciB0b2tlbj0iIiAvPgorICAgIDwvcmVwbGFjZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OCI+CisgICAgPHJlcGxhY2UgZmlsZT0idGVtcGxhdGUueG1sIj4KKyAgICAgIDxyZXBsYWNlZmlsdGVyIHRva2VuPSJkb250X3dhbnRfdG9fcmVhbGx5X3JlcGxhY2Vfc29tZXRoaW5nIiAvPgorICAgIDwvcmVwbGFjZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OS1zZXR1cCI+CisgICAgPCEtLSB0aGlzIGZpeGluZyBvZiBsaW5lIGVuZGluZ3MgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHJlcGxhY2UgdGFzayBpcyB0cmFuc2Zvcm1pbmcgdGhlIGxpbmUgZW5kaW5ncyAtLT4KKyAgICA8IS0tIG9mIHRoZSByZXBsYWNlbWVudCB0b2tlbnMgYW5kIHZhbHVlcyB0byB0aGUgcGxhdGZvcm0gZGVmYXVsdCAtLT4KKyAgICA8IS0tIGluIGNlcnRhaW4gY2FzZXMgKGNoZWNrb3V0IGRvbmUgd2l0aCBjdnMgb2YgY3lnd2luLCB0aGUgbGluZSBlbmRpbmdzIG9mIHRoZSB2YXJpb3VzIGZpbGVzIGRvIG5vdCBtYXRjaC0tPgorICAgIDwhLS0gdGhlIHN5c3RlbSBwcm9wZXJ0eSBsaW5lLnNlcGFyYXRvciAtLT4KKyAgICA8Y29weSBmaWxlPSJyZXBsYWNlL3NvdXJjZS50eHQiIHRvZmlsZT0iJHt0bXAuZGlyfS9vdXRwdXQudHh0Ii8+CisgICAgPGNvcHkgZmlsZT0icmVwbGFjZS92YWx1ZS50eHQiIHRvZmlsZT0iJHt0bXAuZGlyfS92YWx1ZS50eHQiIC8+CisgICAgPGNvcHkgZmlsZT0icmVwbGFjZS9yZXN1bHQudHh0IiB0b2ZpbGU9IiR7dG1wLmRpcn0vcmVzdWx0LnR4dCIgLz4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7dG1wLmRpcn0iIGluY2x1ZGVzPSIqLnR4dCIvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OSIgZGVwZW5kcz0idGVzdDktc2V0dXAiPgorICAgIDxsb2FkZmlsZSBzcmNGaWxlPSIke3RtcC5kaXJ9L3ZhbHVlLnR4dCIgcHJvcGVydHk9ImNvbnRlbnQiLz4KKyAgICA8cmVwbGFjZSBmaWxlPSIke3RtcC5kaXJ9L291dHB1dC50eHQiIHRva2VuPSJAQEBSZXBsYWNlIHRoaXNAQEAiIHZhbHVlPSIke2NvbnRlbnR9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgICA8ZGVsZXRlIGRpcj0iJHt0bXAuZGlyfSIgcXVpZXQ9InRydWUiLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlL3Jlc3VsdC50eHQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlL3Jlc3VsdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0ZTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlcGxhY2UvcmVzdWx0LnR4dApAQCAtMCwwICsxLDcgQEAKK1RoaXMgaXMgbGluZSBvbmUKK1RoaXMgaXMgbGluZSB0d28KK1RoaXMgaXMgbGluZSB0aHJlZQorVGhpcyBpcyBsaW5lIGZvdXIKK1RoaXMgaXMgbGluZSBmaXZlCitUaGlzIGlzIGxpbmUgc2l4CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlcGxhY2Uvc291cmNlLnR4dCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlcGxhY2Uvc291cmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDczZjMxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVwbGFjZS9zb3VyY2UudHh0CkBAIC0wLDAgKzEsNCBAQAorVGhpcyBpcyBsaW5lIG9uZQorVGhpcyBpcyBsaW5lIHR3bworVGhpcyBpcyBsaW5lIHRocmVlCitAQEBSZXBsYWNlIHRoaXNAQEAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlcGxhY2UvdmFsdWUudHh0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVwbGFjZS92YWx1ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1YjU1MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlcGxhY2UvdmFsdWUudHh0CkBAIC0wLDAgKzEsMyBAQAorVGhpcyBpcyBsaW5lIGZvdXIKK1RoaXMgaXMgbGluZSBmaXZlCitUaGlzIGlzIGxpbmUgc2l4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9ybWljLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvcm1pYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiMWU1OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvcm1pYy54bWwKQEAgLTAsMCArMSwzMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0icm1pYyIgZGVmYXVsdD0idGVhcmRvd24iIGJhc2VkaXI9Ii4iPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJybWljLmRpciIgbG9jYXRpb249Ii4iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiBsb2NhdGlvbj0iJHtybWljLmRpcn0vc3JjIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSIke3JtaWMuZGlyfS9idWlsZCIvPgorCisgIDx0YXJnZXQgbmFtZT0idGVhcmRvd24iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBpbml0IGJ1aWxkcyB0aGUgamF2YSBzb3VyY2UgLS0+CisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvYmUtcm1pYyI+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisKKyAgICA8amF2YWMKKyAgICAgIGRlc3RkaXI9IiR7YnVpbGQuZGlyfSIKKyAgICAgIHNyY2Rpcj0iJHtzcmMuZGlyfSIKKyAgICAgIGluY2x1ZGVzPSJSZW1vdGUqLmphdmEiPgorICAgIDwvamF2YWM+CisKKyAgICA8cHJlc2V0ZGVmIG5hbWU9ImJhc2Utcm1pYyI+CisgICAgICA8cm1pYworICAgICAgICBiYXNlPSIke2J1aWxkLmRpcn0iCisgICAgICAgIHZlcmlmeT0idHJ1ZSIKKyAgICAgICAgaW5jbHVkZXM9IioqLyouY2xhc3MiLz4KKyAgICA8L3ByZXNldGRlZj4KKworICAgIDxwcmVzZXRkZWYgbmFtZT0icm1pYy1iYWQtY2xhc3MiPgorICAgICAgPHJtaWMKKyAgICAgICAgYmFzZT0iJHtidWlsZC5kaXJ9IgorICAgICAgICB2ZXJpZnk9ImZhbHNlIgorICAgICAgICBjbGFzc25hbWU9InVuaW1wbGVtZW50ZWQuY2xhc3MiCisgICAgICAgIC8+CisgICAgPC9wcmVzZXRkZWY+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0iYXNzZXJ0RmlsZUNyZWF0ZWQiPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiAvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxmYWlsPk5vdCBmb3VuZCA6ICR7YnVpbGQuZGlyfS9Ae2ZpbGV9CisgICAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICAgIDxub3Q+PGF2YWlsYWJsZSBmaWxlPSIke2J1aWxkLmRpcn0vQHtmaWxlfSIvPjwvbm90PgorICAgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8L2ZhaWw+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJhc3NlcnRGaWxlQWJzZW50Ij4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZmFpbD5FeHBlY3RlZCB0byBiZSBtaXNzaW5nIDogJHtidWlsZC5kaXJ9L0B7ZmlsZX0KKyAgICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2J1aWxkLmRpcn0vQHtmaWxlfSIvPgorICAgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8L2ZhaWw+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIAorICAgIDxtYWNyb2RlZiBuYW1lPSJhc3NlcnRTdHViQ29tcGlsZWQiPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxhc3NlcnRGaWxlQ3JlYXRlZCBmaWxlPSJSZW1vdGVUaW1lc3RhbXBJbXBsX1N0dWIuY2xhc3MiICAvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0iYXNzZXJ0U2tlbENvbXBpbGVkIj4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8YXNzZXJ0RmlsZUNyZWF0ZWQgZmlsZT0iUmVtb3RlVGltZXN0YW1wSW1wbF9Ta2VsLmNsYXNzIiAgLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPG1hY3JvZGVmIG5hbWU9ImFzc2VydFNrZWxBYnNlbnQiPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxhc3NlcnRGaWxlQWJzZW50IGZpbGU9IlJlbW90ZVRpbWVzdGFtcEltcGxfU2tlbC5jbGFzcyIgIC8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICAKKyAgICA8bWFjcm9kZWYgbmFtZT0iYXNzZXJ0QmFzZUNvbXBpbGVkIj4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8YXNzZXJ0U3R1YkNvbXBpbGVkIC8+CisgICAgICAgIDxhc3NlcnRTa2VsQ29tcGlsZWQgLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgCisgICAgPG1hY3JvZGVmIG5hbWU9ImFzc2VydEFudFN0dWJDb21waWxlZCI+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGFzc2VydEZpbGVDcmVhdGVkIGZpbGU9IkFudFRpbWVzdGFtcF9TdHViLmNsYXNzIi8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICAKKyAgICA8bWFjcm9kZWYgbmFtZT0iYXNzZXJ0QW50U2tlbENvbXBpbGVkIj4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8YXNzZXJ0RmlsZUNyZWF0ZWQgZmlsZT0iQW50VGltZXN0YW1wX1NrZWwuY2xhc3MiLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPG1hY3JvZGVmIG5hbWU9ImFzc2VydEFudENvbXBpbGVkIj4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8YXNzZXJ0QW50U3R1YkNvbXBpbGVkIC8+CisgICAgICAgIDxhc3NlcnRBbnRTa2VsQ29tcGlsZWQgLz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJwcm9iZS1ybWljIj4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJrYWZmZS5wcmVzZW50IiBjbGFzc25hbWU9ImprYWZmZS5ybWkucm1pYy5STUlDIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0icm1pYy5wcmVzZW50IiBjbGFzc25hbWU9InN1bi5ybWkucm1pYy5NYWluIi8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0id2xybWljLnByZXNlbnQiIGNsYXNzbmFtZT0id2VibG9naWMucm1pYyIvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9InJtaWM1LnByZXNlbnQiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJybWljLnByZXNlbnQiLz4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmEubmV0LlByb3h5Ii8+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJybWljNi5wcmVzZW50Ij4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0icm1pYy5wcmVzZW50Ii8+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZhLnV0aWwuU2VydmljZUxvYWRlciIvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdERlZmF1bHQiIGRlcGVuZHM9ImluaXQiPgorICAgIDxiYXNlLXJtaWMgY29tcGlsZXI9ImRlZmF1bHQiLz4KKyAgICA8YXNzZXJ0QmFzZUNvbXBpbGVkLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RW1wdHkiIGRlcGVuZHM9ImluaXQiPgorICAgIDxiYXNlLXJtaWMgY29tcGlsZXI9IiIvPgorICAgIDxhc3NlcnRCYXNlQ29tcGlsZWQvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RWZXJzaW9uMTEiIGRlcGVuZHM9ImluaXQiPgorICAgIDxiYXNlLXJtaWMgY29tcGlsZXI9ImRlZmF1bHQiIHN0dWJ2ZXJzaW9uPSIxLjEiIC8+CisgICAgPGFzc2VydEJhc2VDb21waWxlZC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFZlcnNpb24xMiIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGJhc2Utcm1pYyBjb21waWxlcj0iZGVmYXVsdCIgc3R1YnZlcnNpb249IjEuMiIgLz4KKyAgICA8YXNzZXJ0U3R1YkNvbXBpbGVkLz4KKyAgICA8YXNzZXJ0U2tlbEFic2VudC8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VmVyc2lvbkNvbXBhdCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGJhc2Utcm1pYyBjb21waWxlcj0iZGVmYXVsdCIgc3R1YnZlcnNpb249ImNvbXBhdCIgLz4KKyAgICA8YXNzZXJ0QmFzZUNvbXBpbGVkLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RSbWljIiBpZj0icm1pYy5wcmVzZW50IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8YmFzZS1ybWljIGNvbXBpbGVyPSJzdW4iLz4KKyAgICA8YXNzZXJ0QmFzZUNvbXBpbGVkLz4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9InRlc3RSbWljSkFyZyIgaWY9InJtaWMucHJlc2VudCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGJhc2Utcm1pYyBjb21waWxlcj0ic3VuIj4KKyAgICAgIDxjb21waWxlcmFyZyB2YWx1ZT0iLUotbXgyNTZtIiAvPgorICAgIDwvYmFzZS1ybWljPgorICAgIDxhc3NlcnRCYXNlQ29tcGlsZWQvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RLYWZmZSIgaWY9ImthZmZlLnByZXNlbnQiIGRlcGVuZHM9ImluaXQiPgorICAgIDxiYXNlLXJtaWMKKyAgICAgIGNvbXBpbGVyPSJrYWZmZSIKKyAgICAgIC8+CisgICAgPGFzc2VydEJhc2VDb21waWxlZC8+CisgIDwvdGFyZ2V0PgorCQorPCEtLSB3ZWJsb2dpYy5ybWljIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgZ2xvYmFsIENMQVNTUEFUSAorICA8dGFyZ2V0IG5hbWU9InRlc3RXbHJtaWMiIGlmPSJ3bHJtaWMucHJlc2VudCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGJhc2Utcm1pYworICAgICAgY29tcGlsZXI9IndlYmxvZ2ljIgorICAgICAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0V2xybWljSkFyZyIgaWY9Indscm1pYy5wcmVzZW50IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8YmFzZS1ybWljCisgICAgICAgIGNvbXBpbGVyPSJ3ZWJsb2dpYyIKKyAgICAgICAgPgorICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItSi1teDI1Nm0iIC8+CisgICAgPC9iYXNlLXJtaWM+CisgIDwvdGFyZ2V0PgorLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdEZvcmtpbmciIGlmPSJybWljLnByZXNlbnQiIGRlcGVuZHM9ImluaXQiPgorICAgIDxiYXNlLXJtaWMKKyAgICAgIGNvbXBpbGVyPSJmb3JraW5nIgorICAgICAgLz4KKyAgICA8YXNzZXJ0QmFzZUNvbXBpbGVkLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QmFkTmFtZSIgaWY9InJtaWMucHJlc2VudCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGJhc2Utcm1pYworICAgICAgY29tcGlsZXI9Im5vLXN1Y2gtY29tcGlsZXIiCisgICAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFeHBsaWNpdENsYXNzIiBpZj0icm1pYy5wcmVzZW50IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8YmFzZS1ybWljCisgICAgICAgIGNvbXBpbGVyPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5ybWljLlN1blJtaWMiCisgICAgICAgIC8+CisgICAgPGFzc2VydEJhc2VDb21waWxlZC8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0V3JvbmdDbGFzcyIgaWY9InJtaWMucHJlc2VudCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGJhc2Utcm1pYworICAgICAgY29tcGlsZXI9Im9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIgorICAgICAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9CYXNlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8cm1pYworICAgICAgdmVyaWZ5PSJ0cnVlIgorICAgICAgaW5jbHVkZXM9IioqLyouY2xhc3MiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QmFzZURvZXNudEV4aXN0IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8cm1pYworICAgICAgYmFzZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiCisgICAgICB2ZXJpZnk9InRydWUiCisgICAgICBpbmNsdWRlcz0iKiovKi5jbGFzcyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RCYXNlSXNudERpciIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHJtaWMKKyAgICAgIGJhc2U9IiR7YW50LmZpbGV9IgorICAgICAgdmVyaWZ5PSJ0cnVlIgorICAgICAgaW5jbHVkZXM9IioqLyouY2xhc3MiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmFpbGluZ0FkYXB0ZXIiIGRlcGVuZHM9ImluaXQiPgorICAgIDxiYXNlLXJtaWMKKyAgICAgIGNvbXBpbGVyPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5ybWljLlJtaWNBZHZhbmNlZFRlc3QkRmFpbGluZ1JtaWNBZGFwdGVyIgorICAgICAgLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGVBbnRUaW1lc3RhbXAiIGRlcGVuZHM9ImluaXQiPgorICAgIDxqYXZhYworICAgICAgZGVzdGRpcj0iJHtidWlsZC5kaXJ9IgorICAgICAgc3JjZGlyPSIke3NyYy5kaXJ9IgorICAgICAgaW5jbHVkZXM9IkFudCouamF2YSI+CisgICAgPC9qYXZhYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QW50Q2xhc3NwYXRoIiBkZXBlbmRzPSJjb21waWxlQW50VGltZXN0YW1wIj4KKyAgICA8YmFzZS1ybWljCisgICAgICBjb21waWxlcj0iZGVmYXVsdCIKKyAgICAgIC8+CisgICAgPGFzc2VydEFudENvbXBpbGVkLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Rm9ya2luZ0FudENsYXNzcGF0aCIgaWY9InJtaWMucHJlc2VudCIgZGVwZW5kcz0iY29tcGlsZUFudFRpbWVzdGFtcCI+CisgICAgPGJhc2Utcm1pYworICAgICAgY29tcGlsZXI9ImZvcmtpbmciCisgICAgICAvPgorICAgIDxhc3NlcnRBbnRDb21waWxlZCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REZWZhdWx0QmFkQ2xhc3MiIGRlcGVuZHM9ImluaXQiPgorICAgIDxybWljLWJhZC1jbGFzcyBjb21waWxlcj0iZGVmYXVsdCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RNYWdpY1Byb3BlcnR5IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQucm1pYyIgdmFsdWU9Im5vLXN1Y2gtYWRhcHRlciIvPgorICAgIDxiYXNlLXJtaWMKKyAgICAgIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE1hZ2ljUHJvcGVydHlPdmVycmlkZXNFbXB0eVN0cmluZyIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJtaWMiIHZhbHVlPSJuby1zdWNoLWFkYXB0ZXIiLz4KKyAgICA8YmFzZS1ybWljIGNvbXBpbGVyPSIiCisgICAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RNYWdpY1Byb3BlcnR5SXNFbXB0eVN0cmluZyIgZGVwZW5kcz0iaW5pdCI+CisgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJtaWMiIHZhbHVlPSIiLz4KKyAgICA8YmFzZS1ybWljIC8+CisgICAgPGFzc2VydEJhc2VDb21waWxlZC8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0KKyAgVGhpcyB0ZXN0IHN0YW1wcyBvbiB0aGUgWE1MIHBhcnNlciBzZXR0aW5ncyBvbiBqYXZhNiwgc28gaXQgaXMgZGlzYWJsZWQuCisgIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RYbmV3IiBpZj0icm1pYzUucHJlc2VudCIgdW5sZXNzPSJybWljNi5wcmVzZW50IiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8YmFzZS1ybWljIGNvbXBpbGVyPSJzdW4iPgorICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWG5ldyIvPgorICAgIDwvYmFzZS1ybWljPgorICAgIDxhc3NlcnRCYXNlQ29tcGlsZWQvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RYbmV3Rm9ya2VkIiBpZj0icm1pYzUucHJlc2VudCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGJhc2Utcm1pYyBjb21waWxlcj0iZm9ya2luZyI+CisgICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbmV3Ii8+CisgICAgPC9iYXNlLXJtaWM+CisgICAgPGFzc2VydEJhc2VDb21waWxlZC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFhuZXdDb21waWxlciIgaWY9InJtaWM1LnByZXNlbnQiIGRlcGVuZHM9ImluaXQiPgorICAgIDxiYXNlLXJtaWMgY29tcGlsZXI9InhuZXciPgorICAgIDwvYmFzZS1ybWljPgorICAgIDxhc3NlcnRCYXNlQ29tcGlsZWQvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJREwiIGRlcGVuZHM9ImluaXQiPgorICAgIDxiYXNlLXJtaWMgY29tcGlsZXI9ImRlZmF1bHQiIGlkbD0idHJ1ZSIvPgorICAgIDxhc3NlcnRGaWxlQ3JlYXRlZCBmaWxlPSJSZW1vdGVUaW1lc3RhbXAuaWRsIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdElJT1AiIGRlcGVuZHM9ImluaXQiPgorICAgIDxiYXNlLXJtaWMgY29tcGlsZXI9ImRlZmF1bHQiIGlpb3A9InRydWUiLz4KKyAgICA8YXNzZXJ0RmlsZUNyZWF0ZWQgZmlsZT0iX1JlbW90ZVRpbWVzdGFtcF9TdHViLmNsYXNzIi8+CisgICAgPGFzc2VydEZpbGVDcmVhdGVkIGZpbGU9Il9SZW1vdGVUaW1lc3RhbXBJbXBsX1RpZS5jbGFzcyIvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL0FudFRpbWVzdGFtcC5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9zcmMvQW50VGltZXN0YW1wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliYTc4NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL0FudFRpbWVzdGFtcC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5EYXRlVXRpbHM7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcG9ydHMgYSBkZXBlbmRlbmN5IG9uIHRoZSBBbnQgcnVudGltZSBjbGFzc2VzLAorICogc28gdGVzdHMgdGhhdCBjbGFzc3BhdGggc2V0dXAgaW5jbHVkZSB0aGVtCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRUaW1lc3RhbXAgaW1wbGVtZW50cyBSZW1vdGVUaW1lc3RhbXAgeworCisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gdGhlIHBoYXNlIG9mIHRoZSBtb29uLgorICAgICAqIE5vdGUgdGhlIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljcyBvZiB0aGUgb3RoZXIgaW1wbGVtZW50YXRpb24sCisgICAgICogd2hpY2ggZ29lcyB0byBzaG93IHdoeSBzaWduYXR1cmUgaXMgYW4gaW5hZGVxdWF0ZSB3YXkgb2YgdmVyaWZ5aW5nCisgICAgICogaG93IHdlbGwgYW4gaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGxvbmcgd2hlbigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBDYWxlbmRhciBjYWw9Q2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgcmV0dXJuIERhdGVVdGlscy5nZXRQaGFzZU9mTW9vbihjYWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL1JlbW90ZVRpbWVzdGFtcC5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9zcmMvUmVtb3RlVGltZXN0YW1wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgzNGU0YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL1JlbW90ZVRpbWVzdGFtcC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247CisKKy8qKgorICogdGhpcyBpcyB0aGUgaW50ZXJmYWNlIHdlIHJlbW90ZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlbW90ZVRpbWVzdGFtcCBleHRlbmRzIFJlbW90ZSB7CisgICAgbG9uZyB3aGVuKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiA7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL1JlbW90ZVRpbWVzdGFtcEltcGwuamF2YSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL1JlbW90ZVRpbWVzdGFtcEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzYxNDUyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9zcmMvUmVtb3RlVGltZXN0YW1wSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKK2ltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247CisKKy8qKgorICogdGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24KKyAqLworcHVibGljIGNsYXNzIFJlbW90ZVRpbWVzdGFtcEltcGwgaW1wbGVtZW50cyBSZW1vdGVUaW1lc3RhbXAgeworCisgICAgcHVibGljIGxvbmcgd2hlbigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc2lnbmphci54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zaWduamFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDgzYWVkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc2lnbmphci54bWwKQEAgLTAsMCArMSwyODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0ic2lnbmphcnRlc3QiIGRlZmF1bHQ9ImhlbHAiIGJhc2VkaXI9Ii4uIj4KKworICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIHZhbHVlPSIuLi8uLi8uLi9idWlsZC9jbGFzc2VzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzaWduLmRpciIgbG9jYXRpb249InNpZ25lZGphcnMiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzdWJkaXIiIGxvY2F0aW9uPSIke3NpZ24uZGlyfS9zdWJkaXIiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmphciIgbG9jYXRpb249IiR7c2lnbi5kaXJ9L3NpZ250ZXN0LmphciIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InN1YmRpcnRlc3QuamFyIiBsb2NhdGlvbj0iJHtzdWJkaXJ9L3NpZ250ZXN0LmphciIgLz4KKyAgCisgIAorICA8bWFjcm9kZWYgbmFtZT0iYXNzZXJ0U2lnbmVkIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImphciIgZGVmYXVsdD0iJHt0ZXN0Lmphcn0iIC8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZmFpbCBtZXNzYWdlPSJub3Qgc2lnbmVkOiBAe2phcn0iID4KKyAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICA8bm90Pjxpc3NpZ25lZCBmaWxlPSJAe2phcn0iIC8+PC9ub3Q+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgPC9mYWlsPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8cHJlc2V0ZGVmIG5hbWU9InNpZ24tYmFzZSI+CisgICAgPHNpZ25qYXIgYWxpYXM9InRlc3Rvbmx5IiBrZXlzdG9yZT0idGVzdGtleXN0b3JlIgorICAgICAgICAgICBzdG9yZXBhc3M9ImFwYWNoZWFudCIvPgorICA8L3ByZXNldGRlZj4KKworICA8cHJlc2V0ZGVmIG5hbWU9InZlcmlmeS1iYXNlIj4KKyAgICA8dmVyaWZ5amFyIGtleXN0b3JlPSJ0ZXN0a2V5c3RvcmUiCisgICAgICAgICAgIHN0b3JlcGFzcz0iYXBhY2hlYW50Ii8+CisgIDwvcHJlc2V0ZGVmPgorCisKKyAgCisgIDxwcmVzZXRkZWYgbmFtZT0ic2lnbiI+CisgICAgPHNpZ24tYmFzZSBqYXI9IiR7dGVzdC5qYXJ9IiAvPgorICA8L3ByZXNldGRlZj4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgIDxta2RpciBkaXI9IiR7c2lnbi5kaXJ9IiAvPgorICAgIDxta2RpciBkaXI9IiR7c3ViZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGphciBqYXJmaWxlPSIke3Rlc3QuamFyfSIgYmFzZWRpcj0iJHtjbGFzc2VzLmRpcn0iIGluY2x1ZGVzPSIqKi9UYXNrLmNsYXNzIi8+CisgIDwvdGFyZ2V0PiAgCisKKyAgCisgIAorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtzaWduLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJoZWxwIj4KKyAgICA8ZWNobz5UaGlzIGJ1aWxkIGlzIGZvciB1c2Ugd2l0aCBBbnQncyB0ZXN0IGNhc2VzPC9lY2hvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0iYmFzaWMiIGRlcGVuZHM9ImphciI+CisgICAgPHNpZ24gLz4KKyAgICA8YXNzZXJ0U2lnbmVkLz4gICAgICAgICAgICAgCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2lnZmlsZSIgZGVwZW5kcz0iamFyIj4KKyAgICA8c2lnbiBzaWdmaWxlPSJURVNUIi8+CisgICAgPGFzc2VydFNpZ25lZC8+ICAgICAgICAgICAgIAorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1heG1lbW9yeSIgZGVwZW5kcz0iamFyIj4KKyAgICA8c2lnbiBtYXhtZW1vcnk9IjEyOG0iLz4KKyAgICA8YXNzZXJ0U2lnbmVkLz4gICAgICAgICAgICAgCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idXJsS2V5c3RvcmVGaWxlIiBkZXBlbmRzPSJqYXIiPgorICAgIDxzaWduIGtleXN0b3JlPSJmaWxlOi8vLi4vdGVzdGtleXN0b3JlIgorICAgICAgIG1heG1lbW9yeT0iMTI4bSIvPgorICAgIDxhc3NlcnRTaWduZWQvPiAgICAgICAgICAgICAKKyAgPC90YXJnZXQ+CisKKyAgCisgIDx0YXJnZXQgbmFtZT0idXJsS2V5c3RvcmVIVFRQIiBkZXBlbmRzPSJqYXIiPgorICAgIDxzaWduCisgICAgICBrZXlzdG9yZT0iaHR0cDovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvdGVzdGtleXN0b3JlIgorICAgICAgLz4KKyAgICA8YXNzZXJ0U2lnbmVkLz4gICAgICAgICAgICAgCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icHJlc2VydmVMYXN0TW9kaWZpZWQiIGRlcGVuZHM9ImphciI+CisgICAgPHRvdWNoIGZpbGU9IiR7dGVzdC5qYXJ9IiBkYXRldGltZT0iMDYvMjgvMjAwMCAyOjAyIHBtIi8+CisgICAgPHNpZ24gCisgICAgCXByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgPGFzc2VydFNpZ25lZCAvPgorICAgIDxmYWlsIG1lc3NhZ2U9InByZXNlcnZlTGFzdE1vZGlmaWVkIGRpZCBub3QgcHJlc2VydmUgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxpc2ZpbGVzZWxlY3RlZCBmaWxlPSIke3Rlc3QuamFyfSIgPgorICAgICAgICAgICAgPGRhdGUgZGF0ZXRpbWU9IjA2LzI4LzIwMDAgMjowMiBwbSIgd2hlbj0iZXF1YWwiLz4KKyAgICAgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZXNldCIgZGVwZW5kcz0iamFyIj4KKyAgICA8c2lnbi1iYXNlPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHt0ZXN0Lmphcn0iIC8+CisgICAgPC9zaWduLWJhc2U+CisgICAgPGFzc2VydFNpZ25lZC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVzZXRBbmRKYXIiIGRlcGVuZHM9ImphciI+CisgICAgPHNpZ24tYmFzZSBqYXI9IiR7dGVzdC5qYXJ9IiBsYXp5PSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dGVzdC5qYXJ9IiAvPgorICAgIDwvc2lnbi1iYXNlPgorICAgIDxhc3NlcnRTaWduZWQvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVzZXRBbmRTaWduZWRKYXIiIGRlcGVuZHM9ImphciI+CisgICAgPHNpZ24tYmFzZSBzaWduZWRqYXI9IiR7c2lnbi5kaXJ9L25ld2ZpbGUuamFyIj4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dGVzdC5qYXJ9IiAvPgorICAgIDwvc2lnbi1iYXNlPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdFBhdGgiIGRlcGVuZHM9ImphciI+CisgICAgPHNpZ24tYmFzZT4KKyAgICAgIDxwYXRoPgorICAgICAgICA8ZmlsZXNldCBmaWxlPSIke3Rlc3QuamFyfSIgLz4KKyAgICAgIDwvcGF0aD4KKyAgICA8L3NpZ24tYmFzZT4KKyAgICA8YXNzZXJ0U2lnbmVkLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UGF0aEFuZEphciIgZGVwZW5kcz0iamFyIj4KKyAgICA8c2lnbi1iYXNlIGphcj0iJHt0ZXN0Lmphcn0iIGxhenk9InRydWUiPgorICAgICAgPHBhdGg+CisgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dGVzdC5qYXJ9IiAvPgorICAgICAgPC9wYXRoPgorICAgIDwvc2lnbi1iYXNlPgorICAgIDxhc3NlcnRTaWduZWQvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdFBhdGhBbmRTaWduZWRKYXIiIGRlcGVuZHM9ImphciI+CisgICAgPHNpZ24tYmFzZSBzaWduZWRqYXI9IiR7c2lnbi5kaXJ9L25ld2ZpbGUuamFyIj4KKyAgICAgIDxwYXRoPgorICAgICAgICA8ZmlsZXNldCBmaWxlPSIke3Rlc3QuamFyfSIgLz4KKyAgICAgIDwvcGF0aD4KKyAgICA8L3NpZ24tYmFzZT4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RTaWduZWRKYXIiIGRlcGVuZHM9ImphciI+CisgICAgPHNpZ24gc2lnbmVkamFyPSIke3N1YmRpcnRlc3QuamFyfSIvPgorICAgIDxhc3NlcnRTaWduZWQgamFyPSIke3N1YmRpcnRlc3QuamFyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REZXN0RGlyQW5kU2lnbmVkSmFyIiBkZXBlbmRzPSJqYXIiPgorICAgIDxzaWduIGRlc3REaXI9IiR7c3ViZGlyfSIgc2lnbmVkamFyPSIke3NpZ24uZGlyfS9uZXdmaWxlLmphciIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REZXN0RGlyIiBkZXBlbmRzPSJqYXIiPgorICAgIDxzaWduIGRlc3REaXI9IiR7c3ViZGlyfSIgLz4KKyAgICA8YXNzZXJ0U2lnbmVkIGphcj0iJHtzdWJkaXJ0ZXN0Lmphcn0iLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3REZXN0RGlyRmlsZXNldCIgZGVwZW5kcz0iamFyIj4KKyAgICA8c2lnbi1iYXNlIGRlc3REaXI9IiR7c3ViZGlyfSI+CisgICAgICA8ZmlsZXNldCBmaWxlPSIke3Rlc3QuamFyfSIgLz4KKyAgICA8L3NpZ24tYmFzZT4KKyAgICA8YXNzZXJ0U2lnbmVkIGphcj0iJHtzdWJkaXJ0ZXN0Lmphcn0iLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3REZXN0RGlyUGF0aCIgZGVwZW5kcz0iamFyIj4KKyAgICA8c2lnbi1iYXNlIGRlc3REaXI9IiR7c3ViZGlyfSI+CisgICAgICA8cGF0aD4KKyAgICAgICAgPGZpbGVzZXQgZmlsZT0iJHt0ZXN0Lmphcn0iIC8+CisgICAgICA8L3BhdGg+CisgICAgPC9zaWduLWJhc2U+CisgICAgPGFzc2VydFNpZ25lZCBqYXI9IiR7c3ViZGlydGVzdC5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TWFwcGVyTm9EZXN0IiBkZXBlbmRzPSJqYXIiPgorICAgIDxzaWduLWJhc2UgPgorICAgICAgPGZsYXR0ZW5tYXBwZXIgLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dGVzdC5qYXJ9IiAvPgorICAgIDwvc2lnbi1iYXNlPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdE1hcHBlckZpbGVzZXQiIGRlcGVuZHM9ImphciI+CisgICAgPHNpZ24tYmFzZSBkZXN0RGlyPSIke3N1YmRpcn0iPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHt0ZXN0Lmphcn0iIC8+CisgICAgICA8ZmxhdHRlbm1hcHBlciAvPgorICAgIDwvc2lnbi1iYXNlPgorICAgIDxhc3NlcnRTaWduZWQgamFyPSIke3N1YmRpcnRlc3QuamFyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RNYXBwZXJQYXRoIiBkZXBlbmRzPSJqYXIiPgorICAgIDxzaWduLWJhc2UgZGVzdERpcj0iJHtzdWJkaXJ9Ij4KKyAgICAgIDxwYXRoPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5qYXJ9IiAvPgorICAgICAgPC9wYXRoPgorICAgICAgPGZsYXR0ZW5tYXBwZXIgLz4KKyAgICA8L3NpZ24tYmFzZT4KKyAgICA8YXNzZXJ0U2lnbmVkIGphcj0iJHtzdWJkaXJ0ZXN0Lmphcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VHdvTWFwcGVycyIgZGVwZW5kcz0iamFyIj4KKyAgICA8c2lnbi1iYXNlIGRlc3REaXI9IiR7c3ViZGlyfSI+CisgICAgICA8ZmlsZXNldCBmaWxlPSIke3Rlc3QuamFyfSIgLz4KKyAgICAgIDxmbGF0dGVubWFwcGVyIC8+CisgICAgICA8ZmxhdHRlbm1hcHBlciAvPgorICAgIDwvc2lnbi1iYXNlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb0FsaWFzIiBkZXBlbmRzPSJqYXIiPgorICAgIDxzaWduamFyIGtleXN0b3JlPSJ0ZXN0a2V5c3RvcmUiCisgICAgICAgamFyPSIke3Rlc3QuamFyfSIKKyAgICAgICBzdG9yZXBhc3M9ImFwYWNoZWFudCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb0ZpbGVzIiA+CisgICAgPHNpZ24tYmFzZSAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb1N0b3JlUGFzcyIgZGVwZW5kcz0iamFyIj4KKyAgICA8c2lnbmphciBrZXlzdG9yZT0idGVzdGtleXN0b3JlIgorICAgICAgIGFsaWFzPSJ0ZXN0b25seSIKKyAgICAgICBqYXI9IiR7dGVzdC5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFRzYUxvY2FsaG9zdCIgZGVwZW5kcz0iamFyIj4KKyAgICA8c2lnbiB0c2F1cmw9Imh0dHA6Ly9sb2NhbGhvc3Q6MC8iIC8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U3lzUHJvcGVydHkiIGRlcGVuZHM9ImphciI+CisgICAgPHNpZ24+CisgICAgICA8c3lzcHJvcGVydHkga2V5PSJhbnQuaG9tZSIgdmFsdWU9IiR7YW50LmhvbWV9IiAvPgorICAgIDwvc2lnbj4KKyAgICA8YXNzZXJ0U2lnbmVkLz4gICAgCisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VmVyaWZ5SmFyIiBkZXBlbmRzPSJiYXNpYyI+CisgICAgPHZlcmlmeS1iYXNlIGphcj0iJHt0ZXN0Lmphcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VmVyaWZ5SmFyQ2VydGlmaWNhdGVzIiBkZXBlbmRzPSJiYXNpYyI+CisgICAgPHZlcmlmeS1iYXNlIGphcj0iJHt0ZXN0Lmphcn0iIGNlcnRpZmljYXRlcz0idHJ1ZSIgdmVyYm9zZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdFZlcmlmeUphclVuc2lnbmVkIiBkZXBlbmRzPSJqYXIiPgorICAgIDx2ZXJpZnktYmFzZSBqYXI9IiR7dGVzdC5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VmVyaWZ5SmFyTm90SW5LZXlzdG9yZSIgZGVwZW5kcz0iYmFzaWMiPgorICAgIDx2ZXJpZnlqYXIgamFyPSIke3Rlc3QuamFyfSIgY2VydGlmaWNhdGVzPSJ0cnVlIiB2ZXJib3NlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorICAgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RWZXJpZnlGaWxlc2V0IiBkZXBlbmRzPSJiYXNpYyI+CisgICAgPHZlcmlmeS1iYXNlID4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dGVzdC5qYXJ9IiAvPgorICAgIDwvdmVyaWZ5LWJhc2U+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFZlcmlmeVBhdGgiIGRlcGVuZHM9ImJhc2ljIj4KKyAgICA8dmVyaWZ5LWJhc2UgPgorICAgICAgPHBhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Lmphcn0iIC8+CisgICAgICA8L3BhdGg+CisgICAgPC92ZXJpZnktYmFzZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VmVyaWZ5Tm9BcmdzIj4KKyAgICA8dmVyaWZ5LWJhc2UgLz4KKyAgPC90YXJnZXQ+CisgIAorPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9za2luY29uZmlnLmR0ZCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NraW5jb25maWcuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMWI0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9za2luY29uZmlnLmR0ZApAQCAtMCwwICsxLDE5IEBACis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IUVMRU1FTlQgc2tpbmNvbmZpZyAoZm9vLCBiYXI/KT4KKzwhRUxFTUVOVCBmb28gKCNQQ0RBVEEpPgorPCFFTEVNRU5UIGJhciAoI1BDREFUQSk+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zbGVlcC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zbGVlcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2MTMyMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NsZWVwLnhtbApAQCAtMCwwICsxLDQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InNsZWVwdGVzdCIgZGVmYXVsdD0iYWxsIiA+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KKyAgICAgICAgPHNsZWVwIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KKyAgICAgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iMTAiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdDMiPgorICAgICAgICA8c2xlZXAgc2Vjb25kcz0iMiIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+CisgICAgICAgIDxzbGVlcCBob3Vycz0iMSIgbWludXRlcz0iLTU5IiBzZWNvbmRzPSItNTgiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgICAgICA8c2xlZXAgbWludXRlcz0iLTU5IiBzZWNvbmRzPSItNTgiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdDYiPgorICAgICAgICA8c2xlZXAgbWludXRlcz0iLTU5IiBzZWNvbmRzPSItNTgiIGZhaWxvbmVycm9yPSJubyIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJhbGwiCisgICAgICAgIGRlcGVuZHM9InRlc3QxLHRlc3QyLHRlc3QzLHRlc3Q0LHRlc3Q1IiAvPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdHlsZS9idWlsZC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdHlsZS9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwZDM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL2J1aWxkLnhtbApAQCAtMCwwICsxLDIwNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9InhzbHQtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibm90aGluZyI+CisKKyAgPHByb3BlcnR5IG5hbWU9Im91dC5kaXIiIHZhbHVlPSJvdXQiLz4KKworCisgIDx0YXJnZXQgbmFtZT0ic2V0dXAiPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlYXJkb3duIj4KKyAgICAgIDxkZWxldGUgZGlyPSIke291dC5kaXJ9IiBmYWlsb25lcnJvcj0iZmFsc2UiIC8+CisgIDwvdGFyZ2V0PgorICAKKworICA8dGFyZ2V0IG5hbWU9InRlc3RTdHlsZUlzU2V0Ij4KKyAgICAgIDx4c2x0IGluPSJkYXRhLnhtbCIgb3V0PSIke291dC5kaXJ9L291dC54bWwiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VHJhbnNmZXJQYXJhbWV0ZXJTZXQiPgorICAgICAgPHByb3BlcnR5IG5hbWU9InZhbHVlIiB2YWx1ZT0ibXl2YWx1ZSIvPgorICAgICAgPHhzbHQgaW49ImRhdGEueG1sIiBvdXQ9IiR7b3V0LmRpcn0vb3V0LnhtbCIgc3R5bGU9InByaW50UGFyYW1zLnhzbCI+CisgICAgICAgICAgPHBhcmFtIG5hbWU9InNldCIgZXhwcmVzc2lvbj0iJHt2YWx1ZX0iLz4KKyAgICAgIDwveHNsdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VHJhbnNmZXJQYXJhbWV0ZXJFbXB0eSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0idmFsdWUiIHZhbHVlPSIiLz4KKyAgICAgIDx4c2x0IGluPSJkYXRhLnhtbCIgb3V0PSIke291dC5kaXJ9L291dC54bWwiIHN0eWxlPSJwcmludFBhcmFtcy54c2wiPgorICAgICAgICAgIDxwYXJhbSBuYW1lPSJlbXB0eSIgZXhwcmVzc2lvbj0iJHt2YWx1ZX0iLz4KKyAgICAgIDwveHNsdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VHJhbnNmZXJQYXJhbWV0ZXJVbnNldCI+CisgICAgICA8eHNsdCBpbj0iZGF0YS54bWwiIG91dD0iJHtvdXQuZGlyfS9vdXQueG1sIiBzdHlsZT0icHJpbnRQYXJhbXMueHNsIj4KKyAgICAgICAgICA8cGFyYW0gbmFtZT0idW5kZWZpbmVkIiBleHByZXNzaW9uPSIke3ZhbHVlfSIvPgorICAgICAgPC94c2x0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RUcmFuc2ZlclBhcmFtZXRlclVuc2V0V2l0aElmIj4KKyAgICAgIDx4c2x0IGluPSJkYXRhLnhtbCIgb3V0PSIke291dC5kaXJ9L291dC54bWwiIHN0eWxlPSJwcmludFBhcmFtcy54c2wiPgorICAgICAgICAgIDxwYXJhbSBuYW1lPSJ1bmRlZmluZWQiIGV4cHJlc3Npb249IiR7dmFsdWV9IiBpZj0idmFsdWUiIC8+CisgICAgICA8L3hzbHQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdERlZmF1bHRNYXBwZXIiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWx1ZSIgdmFsdWU9Im15dmFsdWUiLz4KKyAgICA8eHNsdCBzdHlsZT0icHJpbnRQYXJhbXMueHNsIiBkZXN0RGlyPSIke291dC5kaXJ9IiBiYXNlZGlyPSIuIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJzZXQiIGV4cHJlc3Npb249IiR7dmFsdWV9Ii8+CisgICAgPC94c2x0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDdXN0b21NYXBwZXIiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWx1ZSIgdmFsdWU9Im15dmFsdWUiLz4KKyAgICA8eHNsdCBzdHlsZT0icHJpbnRQYXJhbXMueHNsIiBkZXN0RGlyPSIke291dC5kaXJ9IiBiYXNlZGlyPSIuIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJzZXQiIGV4cHJlc3Npb249IiR7dmFsdWV9Ii8+CisgICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209ImRhdGEuKiIgdG89Im91dC4qIi8+CisgICAgPC94c2x0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RUeXBlZE1hcHBlciI+CisgICAgPHByb3BlcnR5IG5hbWU9InZhbHVlIiB2YWx1ZT0ibXl2YWx1ZSIvPgorICAgIDx4c2x0IHN0eWxlPSJwcmludFBhcmFtcy54c2wiIGRlc3REaXI9IiR7b3V0LmRpcn0iIGJhc2VkaXI9Ii4iPgorICAgICAgPHBhcmFtIG5hbWU9InNldCIgZXhwcmVzc2lvbj0iJHt2YWx1ZX0iLz4KKyAgICAgIDxnbG9ibWFwcGVyIGZyb209ImRhdGEuKiIgdG89Im91dC4qIi8+CisgICAgPC94c2x0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFeHBsaWNpdEZpbGVzZXQiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWx1ZSIgdmFsdWU9Im15dmFsdWUiLz4KKyAgICA8eHNsdCBzdHlsZT0icHJpbnRQYXJhbXMueHNsIiBkZXN0RGlyPSIke291dC5kaXJ9IgorICAgICAgICAgIHVzZUltcGxpY2l0RmlsZXNldD0iZmFsc2UiIGJhc2VkaXI9Ii4uIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJzZXQiIGV4cHJlc3Npb249IiR7dmFsdWV9Ii8+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iLz4KKyAgICA8L3hzbHQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5ld2VyU3R5bGVzaGVldCI+CisgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvcHlYc2wiPgorICAgICAgICA8cGFyYW0gbmFtZT0ieHNsLnZhbHVlIiB2YWx1ZT0ib2xkLXZhbHVlIi8+CisgICAgICA8L2FudGNhbGw+CisgICAgICA8eHNsdCBpbj0iZGF0YS54bWwiIG91dD0iJHtvdXQuZGlyfS9vdXQueG1sIiBzdHlsZT0idG1wLnhzbCIvPgorCisgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvcHlYc2wiPgorICAgICAgICA8cGFyYW0gbmFtZT0ieHNsLnZhbHVlIiB2YWx1ZT0ibmV3LXZhbHVlIi8+CisgICAgICA8L2FudGNhbGw+CisgICAgICA8eHNsdCBpbj0iZGF0YS54bWwiIG91dD0iJHtvdXQuZGlyfS9vdXQueG1sIiBzdHlsZT0idG1wLnhzbCIvPgorICAgICAgPGRlbGV0ZSBmaWxlPSJ0bXAueHNsIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdERpcmVjdG9yeUhpZXJhcmNoeVdpdGhEaXJNYXRjaGluZyI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXQuZGlyfS9zcmMvbGV2ZWwxLyIvPgorICAgIDxjb3B5IGZpbGU9ImRhdGEueG1sIiB0b2Rpcj0iJHtvdXQuZGlyfS9zcmMvbGV2ZWwxLyIvPgorICAgIDx4c2x0IGJhc2VkaXI9IiR7b3V0LmRpcn0vc3JjIiBkZXN0ZGlyPSIke291dC5kaXJ9L2Rlc3QiCisgICAgICAgICAgIHN0eWxlPSJwcmludFBhcmFtcy54c2wiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RGlyc1dpdGhTcGFjZXMiPgorICAgIDxta2RpciBkaXI9IiR7b3V0LmRpcn0vcyByYy8iLz4KKyAgICA8Y29weSBmaWxlPSJkYXRhLnhtbCIgdG9kaXI9IiR7b3V0LmRpcn0vcyByYy8iLz4KKyAgICA8eHNsdCBiYXNlZGlyPSIke291dC5kaXJ9L3MgcmMiIGRlc3RkaXI9IiR7b3V0LmRpcn0vZCBlc3QiCisgICAgICAgICAgIHN0eWxlPSJwcmludFBhcmFtcy54c2wiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb3B5WHNsIiBpZj0ieHNsLnZhbHVlIj4KKyAgICAgIDxjb3B5IGZpbGU9InRlc3ROZXdlclN0eWxlc2hlZXQueHNsIiB0b2ZpbGU9InRtcC54c2wiIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgICAgICAgPGZpbHRlcmNoYWluPjxleHBhbmRwcm9wZXJ0aWVzLz48L2ZpbHRlcmNoYWluPgorICAgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RXaXRoU3R5bGVBdHRyQW5kUmVzb3VyY2UiPgorICAgICAgPCEtLSBhbHNvIHRlc3Rpbmcgc3R5bGUgYXMgcmVzb3VyY2VzLCB3aXRoIHJlZmlkIC0tPgorICAgICAgPGZpbGUgaWQ9InhzbEZpbGUiIGZpbGU9InByaW50UGFyYW1zLnhzbCIvPgorICAgICAgPHhzbHQgaW49ImRhdGEueG1sIiBvdXQ9IiR7b3V0LmRpcn0vb3V0LnhtbCIgc3R5bGU9InByaW50UGFyYW1zLnhzbCI+CisgICAgICAgIDxzdHlsZSByZWZpZD0ieHNsRmlsZSIgLz4KKyAgICAgIDwveHNsdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0V2l0aEZpbGVSZXNvdXJjZSI+CisgICAgICA8eHNsdCBpbj0iZGF0YS54bWwiIG91dD0iJHtvdXQuZGlyfS9vdXQueG1sIj4KKyAgICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAgIDxmaWxlIGZpbGU9InByaW50UGFyYW1zLnhzbCIvPgorICAgICAgICAgIDwvc3R5bGU+CisgICAgICAgICAgPHBhcmFtIG5hbWU9InNldCIgZXhwcmVzc2lvbj0idmFsdWUiLz4KKyAgICAgIDwveHNsdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0V2l0aFVybFJlc291cmNlIj4KKyAgICAgIDxtYWtldXJsIGZpbGU9InByaW50UGFyYW1zLnhzbCIgcHJvcGVydHk9InByaW50UGFyYW1zLnhzbC51cmwiLz4KKyAgICAgIDx4c2x0IGluPSJkYXRhLnhtbCIgb3V0PSIke291dC5kaXJ9L291dC54bWwiPgorICAgICAgICAgIDxzdHlsZT4KKyAgICAgICAgICAgICAgPHVybCB1cmw9IiR7cHJpbnRQYXJhbXMueHNsLnVybH0iLz4KKyAgICAgICAgICA8L3N0eWxlPgorICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZXQiIGV4cHJlc3Npb249InZhbHVlIi8+CisgICAgICA8L3hzbHQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVuYW1lQW5kRmlsZWRpckFzUGFyYW0iPgorICAgICAgPG1rZGlyIGRpcj0iJHtvdXQuZGlyfS94bWwvZGlyIi8+CisgICAgICA8bWtkaXIgZGlyPSIke291dC5kaXJ9L291dCIvPgorICAgICAgPGNvcHkgZmlsZT0iZGF0YS54bWwiIHRvZmlsZT0iJHtvdXQuZGlyfS94bWwvb25lLnhtbCIvPgorICAgICAgPGNvcHkgZmlsZT0iZGF0YS54bWwiIHRvZmlsZT0iJHtvdXQuZGlyfS94bWwvdHdvLnhtbCIvPgorICAgICAgPGNvcHkgZmlsZT0iZGF0YS54bWwiIHRvZmlsZT0iJHtvdXQuZGlyfS94bWwvdGhyZWUueG1sIi8+CisgICAgICA8Y29weSBmaWxlPSJkYXRhLnhtbCIgdG9maWxlPSIke291dC5kaXJ9L3htbC9kaXIvZm91ci54bWwiLz4KKyAgICAgIDx4c2x0IHN0eWxlPSJwcmludEZpbGVuYW1lLnhzbCIKKyAgICAgICAgICAgIGRlc3RkaXI9IiR7b3V0LmRpcn0vb3V0IgorICAgICAgICAgICAgYmFzZWRpcj0iJHtvdXQuZGlyfS94bWwiCisgICAgICAgICAgICBpbmNsdWRlcz0iKiovKi54bWwiCisgICAgICAgICAgICBleHRlbnNpb249Ii50eHQiCisKKyAgICAgICAgICAgIGZpbGVuYW1lcGFyYW1ldGVyPSJmaWxlbmFtZSIKKyAgICAgICAgICAgIGZpbGVkaXJwYXJhbWV0ZXI9ImZpbGVkaXIiCisgICAgICAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlbmFtZUFzUGFyYW0iPgorICAgICAgPG1rZGlyIGRpcj0iJHtvdXQuZGlyfS94bWwvZGlyIi8+CisgICAgICA8bWtkaXIgZGlyPSIke291dC5kaXJ9L291dCIvPgorICAgICAgPGNvcHkgZmlsZT0iZGF0YS54bWwiIHRvZmlsZT0iJHtvdXQuZGlyfS94bWwvb25lLnhtbCIvPgorICAgICAgPGNvcHkgZmlsZT0iZGF0YS54bWwiIHRvZmlsZT0iJHtvdXQuZGlyfS94bWwvdHdvLnhtbCIvPgorICAgICAgPGNvcHkgZmlsZT0iZGF0YS54bWwiIHRvZmlsZT0iJHtvdXQuZGlyfS94bWwvdGhyZWUueG1sIi8+CisgICAgICA8Y29weSBmaWxlPSJkYXRhLnhtbCIgdG9maWxlPSIke291dC5kaXJ9L3htbC9kaXIvZm91ci54bWwiLz4KKyAgICAgIDx4c2x0IHN0eWxlPSJwcmludEZpbGVuYW1lLnhzbCIKKyAgICAgICAgICAgIGRlc3RkaXI9IiR7b3V0LmRpcn0vb3V0IgorICAgICAgICAgICAgYmFzZWRpcj0iJHtvdXQuZGlyfS94bWwiCisgICAgICAgICAgICBpbmNsdWRlcz0iKiovKi54bWwiCisgICAgICAgICAgICBleHRlbnNpb249Ii50eHQiCisKKyAgICAgICAgICAgIGZpbGVuYW1lcGFyYW1ldGVyPSJmaWxlbmFtZSIKKyAgICAgIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVuYW1lQXNQYXJhbU5vU2V0dGluZyI+CisgICAgICA8bWtkaXIgZGlyPSIke291dC5kaXJ9L3htbC9kaXIiLz4KKyAgICAgIDxta2RpciBkaXI9IiR7b3V0LmRpcn0vb3V0Ii8+CisgICAgICA8Y29weSBmaWxlPSJkYXRhLnhtbCIgdG9maWxlPSIke291dC5kaXJ9L3htbC9vbmUueG1sIi8+CisgICAgICA8Y29weSBmaWxlPSJkYXRhLnhtbCIgdG9maWxlPSIke291dC5kaXJ9L3htbC90d28ueG1sIi8+CisgICAgICA8Y29weSBmaWxlPSJkYXRhLnhtbCIgdG9maWxlPSIke291dC5kaXJ9L3htbC90aHJlZS54bWwiLz4KKyAgICAgIDxjb3B5IGZpbGU9ImRhdGEueG1sIiB0b2ZpbGU9IiR7b3V0LmRpcn0veG1sL2Rpci9mb3VyLnhtbCIvPgorICAgICAgPHhzbHQgc3R5bGU9InByaW50RmlsZW5hbWUueHNsIgorICAgICAgICAgICAgZGVzdGRpcj0iJHtvdXQuZGlyfS9vdXQiCisgICAgICAgICAgICBiYXNlZGlyPSIke291dC5kaXJ9L3htbCIKKyAgICAgICAgICAgIGluY2x1ZGVzPSIqKi8qLnhtbCIKKyAgICAgICAgICAgIGV4dGVuc2lvbj0iLnR4dCIKKyAgICAgIC8+IDwhLS0gd2l0aG91dCAnZmlsZW5hbWVwYXJhbWV0ZXInIHRvIGNoZWNrLCB0aGF0IHRoZSB4c2w6cGFyYW0gaXMgTk9UIHNldCAtLT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL2RhdGEueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvZGF0YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlMjM5NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL2RhdGEueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRhdGEvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL3ByaW50RmlsZW5hbWUueHNsIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvcHJpbnRGaWxlbmFtZS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3OWFiNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL3ByaW50RmlsZW5hbWUueHNsCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/Pg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCisNCis8eHNsOnN0eWxlc2hlZXQNCisgIHZlcnNpb249IjEuMCINCisgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCisNCisgICAgPHhzbDpvdXRwdXQgaW5kZW50PSJubyIgbWV0aG9kPSJ0ZXh0Ii8+DQorICAgIDx4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHM9IioiLz4NCisNCisgICAgPHhzbDpwYXJhbSBuYW1lPSJmaWxlbmFtZSI+LW5vdC1zZXQtPC94c2w6cGFyYW0+DQorICAgIDx4c2w6cGFyYW0gbmFtZT0iZmlsZWRpciI+LW5vdC1zZXQtPC94c2w6cGFyYW0+DQorDQorPCEtLSB1c2UgdGhlIHhzbC1wYXJhbWV0ZXIgLS0+DQorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+DQorICAgIGZpbGVuYW1lPSc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpbGVuYW1lIi8+Jw0KKyAgICBmaWxlZGlyID0nPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaWxlZGlyIi8+Jw0KKzwveHNsOnRlbXBsYXRlPg0KKw0KKzwhLS0gZGVsZXRlIHRoZSByYXcgeG1sIGRhdGEgLS0+DQorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKiIvPg0KKw0KKzwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvcHJpbnRQYXJhbXMueHNsIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvcHJpbnRQYXJhbXMueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGU0OWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdHlsZS9wcmludFBhcmFtcy54c2wKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzx4c2w6c3R5bGVzaGVldAorICB2ZXJzaW9uPSIxLjAiCisgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICB4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0Ij4KKworPCEtLSBnZXQgdGhlIHhzbC1wYXJhbWV0ZXIgLS0+Cis8eHNsOnBhcmFtIG5hbWU9InNldCI+c2V0IGRlZmF1bHQgdmFsdWU8L3hzbDpwYXJhbT4KKzx4c2w6cGFyYW0gbmFtZT0iZW1wdHkiPmVtcHR5IGRlZmF1bHQgdmFsdWU8L3hzbDpwYXJhbT4KKzx4c2w6cGFyYW0gbmFtZT0idW5kZWZpbmVkIj51bmRlZmluZWQgZGVmYXVsdCB2YWx1ZTwveHNsOnBhcmFtPgorCis8IS0tIHVzZSB0aGUgeHNsLXBhcmFtZXRlciAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorc2V0PSc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldCIvPicKK2VtcHR5PSc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVtcHR5Ii8+JwordW5kZWZpbmVkPSc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVuZGVmaW5lZCIvPicKKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvdGVzdE5ld2VyU3R5bGVzaGVldC54c2wgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdHlsZS90ZXN0TmV3ZXJTdHlsZXNoZWV0LnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmY4MTIwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvdGVzdE5ld2VyU3R5bGVzaGVldC54c2wKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8eHNsOnN0eWxlc2hlZXQKKyAgdmVyc2lvbj0iMS4wIgorICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisKKzx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyR7eHNsLnZhbHVlfQorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdWJhbnQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGI1NDdhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50LnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ic3ViYW50LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3RnZW5lcmljYW50ZmlsZSI+CisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0bm9kaXJzIiBkZXBlbmRzPSJ0ZWFyRG93biI+CisgICAgICAgIDxzdWJhbnQgZ2VuZXJpY2FudGZpbGU9InN1YmFudC9nZW5lcmljc3ViYW50LnhtbCI+CisgICAgICAgICAgICA8ZGlyc2V0IGRpcj0iLiIgaW5jbHVkZXM9InN1YmFudC10ZXN0KiIvPgorICAgICAgICA8L3N1YmFudD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdGdlbmVyaWNhbnRmaWxlIj4KKyAgICAgICAgPHN1YmFudCBnZW5lcmljYW50ZmlsZT0ic3ViYW50L2dlbmVyaWNzdWJhbnQueG1sIj4KKyAgICAgICAgICAgIDxkaXJzZXQgZGlyPSJzdWJhbnQiIGluY2x1ZGVzPSJzdWJhbnQtdGVzdCoiLz4KKyAgICAgICAgPC9zdWJhbnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RhbnRmaWxlIj4KKyAgICAgICAgPHN1YmFudCBhbnRmaWxlPSJteXN1YmFudC54bWwiPgorICAgICAgICAgICAgPGRpcnNldCBkaXI9Ii4iIGluY2x1ZGVzPSJzdWJhbnQvc3ViYW50LXRlc3QqIi8+CisgICAgICAgIDwvc3ViYW50PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJtdWx0aXBsZVRhcmdldHMiPgorICAgICAgICA8c3ViYW50IGFudGZpbGU9Im15c3ViYW50LnhtbCI+CisgICAgICAgICAgICA8ZGlyc2V0IGRpcj0iLiIgaW5jbHVkZXM9InN1YmFudC9zdWJhbnQtdGVzdCoiLz4KKyAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0ib25lIi8+CisgICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InR3byIvPgorICAgICAgICA8L3N1YmFudD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ibXVsdGlwbGVUYXJnZXRzT25lRG9lc250RXhpc3RfRk9FZmFsc2UiPgorICAgICAgICA8c3ViYW50IGFudGZpbGU9Im15c3ViYW50LnhtbCIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KKyAgICAgICAgICAgIDxkaXJzZXQgZGlyPSIuIiBpbmNsdWRlcz0ic3ViYW50L3N1YmFudC10ZXN0KiIvPgorICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJvbmUiLz4KKyAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0idGhyZWUiLz4KKyAgICAgICAgPC9zdWJhbnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Im11bHRpcGxlVGFyZ2V0c09uZURvZXNudEV4aXN0X0ZPRXRydWUiPgorICAgICAgICA8c3ViYW50IGFudGZpbGU9Im15c3ViYW50LnhtbCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgPGRpcnNldCBkaXI9Ii4iIGluY2x1ZGVzPSJzdWJhbnQvc3ViYW50LXRlc3QqIi8+CisgICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Im9uZSIvPgorICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJ0aHJlZSIvPgorICAgICAgICA8L3N1YmFudD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVhckRvd24iPgorICAgICAgICA8IS0tIG5vdGhpbmcgdG8gZG8gLS0+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50L2dlbmVyaWNzdWJhbnQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50L2dlbmVyaWNzdWJhbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmZiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdWJhbnQvZ2VuZXJpY3N1YmFudC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJnZW5lcmljc3ViYW50IiBiYXNlZGlyPSIuLiIgZGVmYXVsdD0ibXlzdWJhbnQiPgorICAgIDx0YXJnZXQgbmFtZT0ibXlzdWJhbnQiPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIke2Jhc2VkaXJ9Ii8+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50L3N1YmFudC10ZXN0MS9teXN1YmFudC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdWJhbnQvc3ViYW50LXRlc3QxL215c3ViYW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M2Mjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50L3N1YmFudC10ZXN0MS9teXN1YmFudC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJteXN1YmFudCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibXlzdWJhbnQiPgorICAgIDx0YXJnZXQgbmFtZT0ibXlzdWJhbnQiPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIke2Jhc2VkaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJvbmUiPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJ0ZXN0MS1vbmUiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InR3byI+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9InRlc3QxLXR3byIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0idGhyZWUiPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJ0ZXN0MS10aHJlZSIvPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9zdWJhbnQtdGVzdDIvbXlzdWJhbnQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50L3N1YmFudC10ZXN0Mi9teXN1YmFudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlODc1ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9zdWJhbnQtdGVzdDIvbXlzdWJhbnQueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0ic3ViYW50IiBiYXNlZGlyPSIuLiIgZGVmYXVsdD0ibXlzdWJhbnQiPgorICAgIDx0YXJnZXQgbmFtZT0ibXlzdWJhbnQiPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSIke2Jhc2VkaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJvbmUiPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJ0ZXN0Mi1vbmUiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InR3byI+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9InRlc3QyLXR3byIvPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N5bmMueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3luYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkMTBkMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N5bmMueG1sCkBAIC0wLDAgKzEsMTQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InN5bmMtdGVzdCIgZGVmYXVsdD0ibm90LW1lIj4KKyAgPHByb3BlcnR5IG5hbWU9InNjcmF0Y2giIGxvY2F0aW9uPSJzeW5jdGVzdCIvPgorCisgIDx0YXJnZXQgbmFtZT0ibm90LW1lIj4KKyAgICA8ZmFpbD5UaGlzIGZpbGUgbXVzdCBiZSB1c2VkIGZyb20gYSB0ZXN0IGNhc2U8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBkaXI9IiR7c2NyYXRjaH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzZXR1cCI+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249IiR7c2NyYXRjaH0vc291cmNlIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRlc3QiIGxvY2F0aW9uPSIke3NjcmF0Y2h9L3RhcmdldCIvPgorICAgIDxta2RpciBkaXI9IiR7c3JjfSIvPgorICAgIDxta2RpciBkaXI9IiR7ZGVzdH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzaW1wbGVjb3B5IiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPG1rZGlyIGRpcj0iJHtzcmN9L2EvYi9jIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7c3JjfS9hL2IvYy9kIi8+CisgICAgPHN5bmMgdG9kaXI9IiR7ZGVzdH0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30iLz4KKyAgICA8L3N5bmM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29weWFuZHJlbW92ZSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxta2RpciBkaXI9IiR7c3JjfS9hL2IvYyIvPgorICAgIDx0b3VjaCBmaWxlPSIke3NyY30vYS9iL2MvZCIvPgorICAgIDxta2RpciBkaXI9IiR7ZGVzdH0vZSIvPgorICAgIDx0b3VjaCBmaWxlPSIke2Rlc3R9L2UvZiIvPgorICAgIDxzeW5jIHRvZGlyPSIke2Rlc3R9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9Ii8+CisgICAgPC9zeW5jPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvcHlhbmRyZW1vdmUtd2l0aC1maWxlbGlzdCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxta2RpciBkaXI9IiR7c3JjfS9hL2IvYyIvPgorICAgIDx0b3VjaCBmaWxlPSIke3NyY30vYS9iL2MvZCIvPgorICAgIDxta2RpciBkaXI9IiR7ZGVzdH0vZSIvPgorICAgIDx0b3VjaCBmaWxlPSIke2Rlc3R9L2UvZiIvPgorICAgIDxzeW5jIHRvZGlyPSIke2Rlc3R9Ij4KKyAgICAgIDxmaWxlbGlzdCBkaXI9IiR7c3JjfSI+CisgICAgICAgIDxmaWxlIG5hbWU9ImEvYi9jL2QiLz4KKyAgICAgICAgPGZpbGUgbmFtZT0ibm90LXRoZXJlIi8+CisgICAgICA8L2ZpbGVsaXN0PgorICAgIDwvc3luYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb3B5YW5kcmVtb3ZlLXdpdGgtemlwZmlsZXNldCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxta2RpciBkaXI9IiR7c3JjfS9hL2IvYyIvPgorICAgIDx0b3VjaCBmaWxlPSIke3NyY30vYS9iL2MvZCIvPgorICAgIDxta2RpciBkaXI9IiR7ZGVzdH0vZSIvPgorICAgIDx0b3VjaCBmaWxlPSIke2Rlc3R9L2UvZiIvPgorICAgIDx6aXAgZGVzdGZpbGU9IiR7c3JjfS90ZXN0LnppcCI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSIgZXhjbHVkZXM9IiouemlwIi8+CisgICAgPC96aXA+CisgICAgPHN5bmMgdG9kaXI9IiR7ZGVzdH0iPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3NyY30vdGVzdC56aXAiLz4KKyAgICA8L3N5bmM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29weWFuZHJlbW92ZS1lbXB0eXByZXNlcnZlIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPG1rZGlyIGRpcj0iJHtzcmN9L2EvYi9jIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7c3JjfS9hL2IvYy9kIi8+CisgICAgPG1rZGlyIGRpcj0iJHtkZXN0fS9lIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7ZGVzdH0vZS9mIi8+CisgICAgPHN5bmMgdG9kaXI9IiR7ZGVzdH0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30iLz4KKyAgICAgIDxwcmVzZXJ2ZWludGFyZ2V0Lz4KKyAgICA8L3N5bmM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZW1wdHljb3B5IiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPG1rZGlyIGRpcj0iJHtzcmN9L2EvYi9jIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7c3JjfS9hL2IvYy9kIi8+CisgICAgPHN5bmMgdG9kaXI9IiR7ZGVzdH0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30iIGV4Y2x1ZGVzPSIqKi9kIi8+CisgICAgPC9zeW5jPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImVtcHR5ZGlyY29weSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxta2RpciBkaXI9IiR7c3JjfS9hL2IvYyIvPgorICAgIDx0b3VjaCBmaWxlPSIke3NyY30vYS9iL2MvZCIvPgorICAgIDxzeW5jIHRvZGlyPSIke2Rlc3R9IgorICAgICAgICAgaW5jbHVkZWVtcHR5ZGlycz0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSIgZXhjbHVkZXM9IioqL2QiLz4KKyAgICA8L3N5bmM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZW1wdHlkaXJjb3B5YW5kcmVtb3ZlIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPG1rZGlyIGRpcj0iJHtzcmN9L2EvYi9jIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7c3JjfS9hL2IvYy9kIi8+CisgICAgPG1rZGlyIGRpcj0iJHtkZXN0fS9lL2YiLz4KKyAgICA8c3luYyB0b2Rpcj0iJHtkZXN0fSIKKyAgICAgICAgIGluY2x1ZGVlbXB0eWRpcnM9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30iIGV4Y2x1ZGVzPSIqKi9kIi8+CisgICAgPC9zeW5jPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvcHlub3JlbW92ZSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxta2RpciBkaXI9IiR7c3JjfS9hL2IvYyIvPgorICAgIDx0b3VjaCBmaWxlPSIke3NyY30vYS9iL2MvZCIvPgorICAgIDxta2RpciBkaXI9IiR7ZGVzdH0vZSIvPgorICAgIDx0b3VjaCBmaWxlPSIke2Rlc3R9L2UvZiIvPgorICAgIDxzeW5jIHRvZGlyPSIke2Rlc3R9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9Ii8+CisgICAgICA8cHJlc2VydmVpbnRhcmdldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iZS9mIi8+CisgICAgICA8L3ByZXNlcnZlaW50YXJnZXQ+CisgICAgPC9zeW5jPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvcHlub3JlbW92ZS1zZWxlY3RvcnMiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8bWtkaXIgZGlyPSIke3NyY30vYS9iL2MiLz4KKyAgICA8dG91Y2ggZmlsZT0iJHtzcmN9L2EvYi9jL2QiLz4KKyAgICA8bWtkaXIgZGlyPSIke2Rlc3R9L2UiLz4KKyAgICA8dG91Y2ggZmlsZT0iJHtkZXN0fS9lL2YiLz4KKyAgICA8c3luYyB0b2Rpcj0iJHtkZXN0fSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSIvPgorICAgICAgPHByZXNlcnZlaW50YXJnZXQ+CisgICAgICAgIDxmaWxlbmFtZSBuYW1lPSJlL2YiLz4KKyAgICAgIDwvcHJlc2VydmVpbnRhcmdldD4KKyAgICA8L3N5bmM+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGFyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5MmE3NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rhci54bWwKQEAgLTAsMCArMSwyMDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJ0YXItdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDx0YXIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KKyAgICA8dGFyIHRhcmZpbGU9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8dGFyIGJhc2VkaXI9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q0Ij4KKyAgICA8dG91Y2ggZmlsZT0idGVzdDQudGFyIi8+CisgICAgPHRhciBkZXN0ZmlsZT0idGVzdDQudGFyIgorICAgICAgICAgYmFzZWRpcj0iLiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KKyAgICA8bWtkaXIgZGlyPSJ0ZXN0NWRpciIvPgorICAgIDx0YXIgZGVzdGZpbGU9InRlc3Q1LnRhciIKKyAgICAgICAgIGJhc2VkaXI9Ii4iCisgICAgICAgICBpbmNsdWRlcz0idGVzdDVkaXIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NiI+CisgICAgPHRhciBkZXN0ZmlsZT0iYmxhaCIgbG9uZ2ZpbGU9IkZvbyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q3Ij4KKyAgICA8bWtkaXIgZGlyPSJ0ZXN0N2RpciIvPgorICAgIDx0YXIgZGVzdGZpbGU9InRlc3Q3LnRhciI+CisgICAgICA8dGFyZmlsZXNldCBkaXI9Ii4iIHByZWZpeD0idGVzdDctcHJlZml4LyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9InRlc3Q3ZGlyIi8+CisgICAgICA8L3RhcmZpbGVzZXQ+CisgICAgICA8dGFyZmlsZXNldCBkaXI9Ii4iIHByZWZpeD0iIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdDdkaXIiLz4KKyAgICAgIDwvdGFyZmlsZXNldD4KKyAgICA8L3Rhcj4KKyAgICA8dW50YXIgc3JjPSJ0ZXN0Ny50YXIiIGRlc3Q9Ii4iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0N1VzaW5nUGxhaW5GaWxlU2V0Ij4KKyAgICA8bWtkaXIgZGlyPSJ0ZXN0N2RpciIvPgorICAgIDx0YXIgZGVzdGZpbGU9InRlc3Q3LnRhciI+CisgICAgICA8dGFyZmlsZXNldCBkaXI9Ii4iIHByZWZpeD0idGVzdDctcHJlZml4LyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9InRlc3Q3ZGlyIi8+CisgICAgICA8L3RhcmZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0ZXN0N2RpciIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvdGFyPgorICAgIDx1bnRhciBzcmM9InRlc3Q3LnRhciIgZGVzdD0iLiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q3VXNpbmdGaWxlTGlzdCI+CisgICAgPG1rZGlyIGRpcj0idGVzdDdkaXIiLz4KKyAgICA8dGFyIGRlc3RmaWxlPSJ0ZXN0Ny50YXIiPgorICAgICAgPHRhcmZpbGVzZXQgZGlyPSIuIiBwcmVmaXg9InRlc3Q3LXByZWZpeC8iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0ZXN0N2RpciIvPgorICAgICAgPC90YXJmaWxlc2V0PgorICAgICAgPGZpbGVsaXN0IGRpcj0iLiI+CisgICAgICAgIDxmaWxlIG5hbWU9InRlc3Q3ZGlyIi8+CisgICAgICA8L2ZpbGVsaXN0PgorICAgIDwvdGFyPgorICAgIDx1bnRhciBzcmM9InRlc3Q3LnRhciIgZGVzdD0iLiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q4Ij4KKyAgICA8dGFyIGRlc3RmaWxlPSJ0ZXN0OC50YXIiPgorICAgICAgPHRhcmZpbGVzZXQgZGlyPSIuIiBmdWxscGF0aD0iL3Rlc3Q4LnhtbCI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9InRhci54bWwiLz4KKyAgICAgIDwvdGFyZmlsZXNldD4KKyAgICA8L3Rhcj4KKyAgICA8dW50YXIgc3JjPSJ0ZXN0OC50YXIiIGRlc3Q9Ii4iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OFVzaW5nWmlwRmlsZXNldCI+CisgICAgPHRhciBkZXN0ZmlsZT0idGVzdDgudGFyIj4KKyAgICAgIDx6aXBmaWxlc2V0IGRpcj0iLiIgZnVsbHBhdGg9Ii90ZXN0OC54bWwiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJ0YXIueG1sIi8+CisgICAgICA8L3ppcGZpbGVzZXQ+CisgICAgPC90YXI+CisgICAgPHVudGFyIHNyYz0idGVzdDgudGFyIiBkZXN0PSIuIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDhVc2luZ1ppcEZpbGVzZXRTcmMiPgorICAgIDx6aXAgZGVzdGZpbGU9InRlc3Q3LnRhciIgYmFzZWRpcj0iLiIgaW5jbHVkZXM9InRhci54bWwiLz4KKyAgICA8dGFyIGRlc3RmaWxlPSJ0ZXN0OC50YXIiPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSJ0ZXN0Ny50YXIiIGZ1bGxwYXRoPSIvdGVzdDgueG1sIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0idGFyLnhtbCIvPgorICAgICAgPC96aXBmaWxlc2V0PgorICAgIDwvdGFyPgorICAgIDx1bnRhciBzcmM9InRlc3Q4LnRhciIgZGVzdD0iLiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q4VXNpbmdUYXJGaWxlc2V0U3JjIj4KKyAgICA8dGFyIGRlc3RmaWxlPSJ0ZXN0Ny50YXIiIGJhc2VkaXI9Ii4iIGluY2x1ZGVzPSJ0YXIueG1sIi8+CisgICAgPHRhciBkZXN0ZmlsZT0idGVzdDgudGFyIj4KKyAgICAgIDx0YXJmaWxlc2V0IHNyYz0idGVzdDcudGFyIiBmdWxscGF0aD0iL3Rlc3Q4LnhtbCI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9InRhci54bWwiLz4KKyAgICAgIDwvdGFyZmlsZXNldD4KKyAgICA8L3Rhcj4KKyAgICA8dW50YXIgc3JjPSJ0ZXN0OC50YXIiIGRlc3Q9Ii4iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OFVzaW5nWmlwRW50cnkiPgorICAgIDx6aXAgZGVzdGZpbGU9InRlc3Q3LnRhciI+CisgICAgICA8emlwZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJ0YXIueG1sIiBmdWxscGF0aD0iL3Rlc3Q4LnhtbCIvPgorICAgIDwvemlwPgorICAgIDx0YXIgZGVzdGZpbGU9InRlc3Q4LnRhciI+CisgICAgICA8emlwZW50cnkgYXJjaGl2ZT0idGVzdDcudGFyIiBuYW1lPSIvdGVzdDgueG1sIi8+CisgICAgPC90YXI+CisgICAgPHVudGFyIHNyYz0idGVzdDgudGFyIiBkZXN0PSIuIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDkiPgorICAgIDx0YXIgZGVzdGZpbGU9ImJsYWgiIGNvbXByZXNzaW9uPSJGb28iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MTAiPgorICAgIDx0YXIgZGVzdGZpbGU9InRlc3QxMC50YXIuZ3oiIGNvbXByZXNzaW9uPSJnemlwIj4KKyAgICAgIDx0YXJmaWxlc2V0IGRpcj0iLiIgZnVsbHBhdGg9Ii90ZXN0MTAueG1sIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0idGFyLnhtbCIvPgorICAgICAgPC90YXJmaWxlc2V0PgorICAgIDwvdGFyPgorICAgIDx1bnRhciBzcmM9InRlc3QxMC50YXIuZ3oiIGRlc3Q9Ii4iIGNvbXByZXNzaW9uPSJnemlwIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDExIj4KKyAgICA8dGFyIGRlc3RmaWxlPSJ0ZXN0MTEudGFyLmJ6MiIgY29tcHJlc3Npb249ImJ6aXAyIj4KKyAgICAgIDx0YXJmaWxlc2V0IGRpcj0iLiIgZnVsbHBhdGg9Ii90ZXN0MTEueG1sIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0idGFyLnhtbCIvPgorICAgICAgPC90YXJmaWxlc2V0PgorICAgIDwvdGFyPgorICAgIDx1bnRhciBzcmM9InRlc3QxMS50YXIuYnoyIiBkZXN0PSIuIiBjb21wcmVzc2lvbj0iYnppcDIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4gCisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0NC50YXIiLz4KKyAgICA8ZGVsZXRlIGZpbGU9InRlc3Q1LnRhciIvPgorICAgIDxkZWxldGUgZmlsZT0iYXNmLWxvZ28uZ2lmLnRhciIvPgorICAgIDxkZWxldGUgZGlyPSJ0ZXN0b3V0Ii8+CisgICAgPGRlbGV0ZSBkaXI9InRlc3Q1ZGlyIi8+CisgICAgPGRlbGV0ZSBkaXI9InRlc3Q3ZGlyIi8+CisgICAgPGRlbGV0ZSBkaXI9InRlc3Q3LXByZWZpeCIvPgorICAgIDxkZWxldGUgZmlsZT0idGVzdDcudGFyIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0OC50YXIiLz4KKyAgICA8ZGVsZXRlIGZpbGU9InRlc3Q4LnhtbCIvPgorICAgIDxkZWxldGUgZmlsZT0idGVzdDEwLnRhci5neiIvPgorICAgIDxkZWxldGUgZmlsZT0idGVzdDEwLnhtbCIvPgorICAgIDxkZWxldGUgZmlsZT0idGVzdDExLnRhci5iejIiLz4KKyAgICA8ZGVsZXRlIGZpbGU9InRlc3QxMS54bWwiLz4KKyAgICA8ZGVsZXRlIGZpbGU9ImFzZi1sb2dvLmdpZi50YXIuZ3oiLz4KKyAgICA8ZGVsZXRlIGZpbGU9ImFzZi1sb2dvLmdpZi50YXIuYnoyIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmVhdGhlciI+CisgICAgPHRhciBkZXN0ZmlsZT0iYXNmLWxvZ28uZ2lmLnRhciIKKyAgICAgICAgIGJhc2VkaXI9Ii4uIgorICAgICAgICAgaW5jbHVkZXM9ImFzZi1sb2dvLmdpZiIgLz4KKyAgICA8dGFyIGRlc3RmaWxlPSJhc2YtbG9nby5naWYudGFyLmd6IgorICAgICAgICAgYmFzZWRpcj0iLi4iCisgICAgICAgICBpbmNsdWRlcz0iYXNmLWxvZ28uZ2lmIiAKKyAgICAgICAgIGNvbXByZXNzaW9uPSJnemlwIi8+CisgICAgPHRhciBkZXN0ZmlsZT0iYXNmLWxvZ28uZ2lmLnRhci5iejIiCisgICAgICAgICBiYXNlZGlyPSIuLiIKKyAgICAgICAgIGluY2x1ZGVzPSJhc2YtbG9nby5naWYiCisgICAgICAgICBjb21wcmVzc2lvbj0iYnppcDIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEdaaXBSZXNvdXJjZSI+CisgICAgPG1rZGlyIGRpcj0idGVzdG91dCIvPgorICAgIDx0YXIgZGVzdGZpbGU9InRlc3RvdXQvdGVzdC50YXIiPgorICAgICAgPGd6aXByZXNvdXJjZT4KKyAgICAgICAgPGZpbGUgZmlsZT0iZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLmd6Ii8+CisgICAgICA8L2d6aXByZXNvdXJjZT4KKyAgICA8L3Rhcj4KKyAgICA8dW50YXIgc3JjPSJ0ZXN0b3V0L3Rlc3QudGFyIiBkZXN0PSJ0ZXN0b3V0Ii8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90YXNrZGVmLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rhc2tkZWYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDY1OGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90YXNrZGVmLnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ieHh4LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KKworICA8cGF0aCBpZD0idGVzdGNsYXNzZXMiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgIDwvcGF0aD4KKworICA8dGFza2RlZiBuYW1lPSJnbG9iYWwiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUudGFza3MuVGFza2RlZlRlc3RDb250YWluZXJUYXNrIj4KKyAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIgLz4KKyAgPC90YXNrZGVmPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDx0YXNrZGVmLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPHRhc2tkZWYgbmFtZT0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiPgorICAgIDx0YXNrZGVmIGNsYXNzbmFtZT0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgIDx0YXNrZGVmIG5hbWU9IiIgY2xhc3NuYW1lPSJvb3BzIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDx0YXNrZGVmIG5hbWU9InRlc3QiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NWEiPgorICAgIDx0YXNrZGVmIG5hbWU9InRlc3QiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NiI+CisgICAgPHRhc2tkZWYgbmFtZT0idGVzdDYiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS50YXNrcy5UYXNrZGVmVGVzdFNpbXBsZVRhc2siPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdGNsYXNzZXMiIC8+CisgICAgPC90YXNrZGVmPgorICAgIDx0ZXN0Nj4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9IndvcmtlZCIgLz4KKyAgICA8L3Rlc3Q2PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q3Ij4KKyAgICA8dGFza2RlZiBuYW1lPSJ0ZXN0NyIKKyAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5leGFtcGxlLnRhc2tzLlRhc2tkZWZUZXN0Q29udGFpbmVyVGFzayI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIgLz4KKyAgICA8L3Rhc2tkZWY+CisgICAgPHRlc3Q3PgorICAgICAgPGVjaG8gbWVzc2FnZT0id29ya2VkIiAvPgorICAgIDwvdGVzdDc+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEdsb2JhbCI+CisgICAgPGdsb2JhbD4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9IndvcmtlZCIgLz4KKyAgICA8L2dsb2JhbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0T3ZlcnJpZGUiPgorICAgIDx0YXNrZGVmIG5hbWU9ImNvcHkiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobyIgLz4KKyAgICA8Y29weT5JbiB0YXJnZXQ8L2NvcHk+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8Y29weT5JbiBUYXNrQ29udGFpbmVyPC9jb3B5PgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RlbXBsYXRlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RlbXBsYXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM1MWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVtcGxhdGUueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVzdC5hbnRsaWIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVzdC5hbnRsaWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZmY3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZXN0LmFudGxpYi54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8YW50bGliPgorICA8dHlwZWRlZiAKKyAgICBuYW1lPSJteXRhc2siIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFudGxpYlRlc3QkTXlUYXNrIi8+Cis8L2FudGxpYj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rlc3QyLmFudGxpYi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZXN0Mi5hbnRsaWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjUwOWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZXN0Mi5hbnRsaWIueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFudGxpYj4KKyAgPHR5cGVkZWYgCisgICAgbmFtZT0ibXl0YXNrMiIgb25lcnJvcj0iaWdub3JlIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50bGliVGVzdCRNeVRhc2syIi8+Cis8L2FudGxpYj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsYW50LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsYW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmI0NjZhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG9wbGV2ZWxhbnQueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJhbnQtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iYmFyIj4KKyAgPGFudCBhbnRmaWxlPSJ0b3BsZXZlbGFudC54bWwiIHRhcmdldD0iZm9vIi8+CisKKyAgPHRhcmdldCBuYW1lPSJmb28iLz4KKyAgPHRhcmdldCBuYW1lPSJiYXIiLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsYW50Y2FsbC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbGFudGNhbGwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjY2FiZTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbGFudGNhbGwueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJhbnQtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iYmFyIj4KKyAgPGFudGNhbGwgdGFyZ2V0PSJmb28iLz4KKworICA8dGFyZ2V0IG5hbWU9ImZvbyIvPgorICA8dGFyZ2V0IG5hbWU9ImJhciIvPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG9wbGV2ZWxzdWJhbnQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG9wbGV2ZWxzdWJhbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTNhMzUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbHN1YmFudC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImFudC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJiYXIiPgorICA8c3ViYW50IHRhcmdldD0iZm9vIj4KKyAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJ0b3BsZXZlbHN1YmFudC54bWwiLz4KKyAgPC9zdWJhbnQ+CisKKyAgPHRhcmdldCBuYW1lPSJmb28iLz4KKyAgPHRhcmdldCBuYW1lPSJiYXIiLz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvdWNoLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvdWNoLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQyNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG91Y2gueG1sCkBAIC0wLDAgKzEsMjE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImNsZWFudXAiIGJhc2VkaXI9Ii4iPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJtYXBwZXJtaWxsaXMiIHZhbHVlPSIxMDcyMjI0MDAwMDAwIiAvPgorICAKKyAgPHNlbGVjdG9yIGlkPSJtYXAuc2VsZWN0b3IiPgorICAgIDxkYXRlIG1pbGxpcz0iJHttYXBwZXJtaWxsaXN9IiAvPgorICA8L3NlbGVjdG9yPgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZT4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9InRvdWNodGVzdCoiIC8+CisgICAgPC9kZWxldGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm9TZWNvbmRzIj4KKyAgICA8dG91Y2ggZmlsZT0idG91Y2h0ZXN0IiBkYXRldGltZT0iMDYvMjQvMjAwMyAyOjIwIHBtIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2Vjb25kcyI+CisgICAgPHRvdWNoIGZpbGU9InRvdWNodGVzdCIgZGF0ZXRpbWU9IjA2LzI0LzIwMDMgMjoyMDoxMiBwbSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb3ciPgorICAgIDx0b3VjaCBmaWxlPSJ0b3VjaHRlc3QiIC8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TWlsbGlzIj4KKyAgICA8IS0tIHRoaXMgb25lIGlzIGFib3V0IDIxIHllYXJzIGFmdGVyIHRoZSBlcG9jaCAtLT4KKyAgICA8IS0tIGxlc3MgdGhhbiAyMCB5ZWFycyBhZnRlciB0aGUgZXBvY2gsIHRlc3QgZG9lcyBub3QgcGFzcyBvbiBteSBXaW4ySy9GQVQgLS0+CisgICAgPCEtLSBBbnRvaW5lIEZlYnJ1YXJ5IDgsIDIwMDQgLS0+CisgICAgPCEtLSBzZWUgaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQxNzc0MzIuaHRtbCAtLT4KKyAgICA8IS0tIGFuZCBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDY5Nzc5Mi5odG1sIC0tPgorICAgIDwhLS0gbm90IHN1cmUgd2h5IC0tPgorICAgIDx0b3VjaCBmaWxlPSJ0b3VjaHRlc3QiIG1pbGxpcz0iNjYyMjU2MDAwMDAwIiAvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdDIwMDAiPgorICAgIDwhLS0gdGhpcyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGlzIDMwICogMzY1ICogMjQgKiAzNjAwICogMTAwMCAtLT4KKyAgICA8IS0tIHNvIHRoZSBjb3JyZXNwb25kaW5nIHRpbWUgaXMgYXQgdGhlIGVuZCBvZiAxOTk5IC0tPgorICAgIDx0b3VjaCBmaWxlPSJ0b3VjaHRlc3QiIG1pbGxpcz0iOTQ2MDgwMDAwMDAwIiAvPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVsaXN0Ij4KKyAgICA8dG91Y2ggbWlsbGlzPSI2NjIyNTYwMDAwMDAiID4KKyAgICAgIDxmaWxlbGlzdCBkaXI9Ii4iIGZpbGVzPSJ0b3VjaHRlc3QiLz4KKyAgICA8L3RvdWNoPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlc2V0IiBkZXBlbmRzPSJ0ZXN0Tm93Ij4KKyAgICA8dG91Y2ggbWlsbGlzPSI5NDYwODAwMDAwMDAiID4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9InRvdWNodGVzdCIvPgorICAgIDwvdG91Y2g+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlc291cmNlQ29sbGVjdGlvbiI+CisgICAgPHRvdWNoIG1pbGxpcz0iMTY2MjI1NjAwMDAwMCI+CisgICAgICA8ZmlsZSBmaWxlPSJ0b3VjaHRlc3QiLz4KKyAgICA8L3RvdWNoPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RNYXBwZWRGaWxlc2V0Ij4KKyAgICA8dG91Y2ggZmlsZT0idG91Y2h0ZXN0IiBtaWxsaXM9IiR7bWFwcGVybWlsbGlzfSIgLz4KKyAgICA8dG91Y2g+CisgICAgICA8ZmlsZXNldCBmaWxlPSJ0b3VjaHRlc3QiIC8+CisgICAgICA8Y29tcG9zaXRlbWFwcGVyPgorICAgICAgICA8Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0iKmZvbyIgLz4KKyAgICAgICAgPGdsb2JtYXBwZXIgZnJvbT0iKiIgdG89IipiYXIiIC8+CisgICAgICA8L2NvbXBvc2l0ZW1hcHBlcj4KKyAgICA8L3RvdWNoPgorCisgICAgPGZpbGVzZXQgaWQ9InRvdWNodGVzdCIgZmlsZT0idG91Y2h0ZXN0Ij4KKyAgICAgIDxzZWxlY3RvciByZWZpZD0ibWFwLnNlbGVjdG9yIiAvPgorICAgIDwvZmlsZXNldD4KKworICAgIDxmaWxlc2V0IGlkPSJ0b3VjaHRlc3Rmb28iIGZpbGU9InRvdWNodGVzdGZvbyI+CisgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im1hcC5zZWxlY3RvciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisKKyAgICA8ZmlsZXNldCBpZD0idG91Y2h0ZXN0YmFyIiBmaWxlPSJ0b3VjaHRlc3RiYXIiPgorICAgICAgPHNlbGVjdG9yIHJlZmlkPSJtYXAuc2VsZWN0b3IiIC8+CisgICAgPC9maWxlc2V0PgorCisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJ0b3VjaHRlc3QiIHBhdGhzZXA9IiAiCisgICAgICAgICAgICAgICAgIHJlZmlkPSJ0b3VjaHRlc3QiIHNldG9uZW1wdHk9ImZhbHNlIiAvPgorCisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJ0b3VjaHRlc3Rmb28iIHBhdGhzZXA9IiAiCisgICAgICAgICAgICAgICAgIHJlZmlkPSJ0b3VjaHRlc3Rmb28iIHNldG9uZW1wdHk9ImZhbHNlIiAvPgorCisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJ0b3VjaHRlc3RiYXIiIHBhdGhzZXA9IiAiCisgICAgICAgICAgICAgICAgIHJlZmlkPSJ0b3VjaHRlc3RiYXIiIHNldG9uZW1wdHk9ImZhbHNlIiAvPgorCisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhbmQ+CisgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InRvdWNodGVzdCIgLz4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0idG91Y2h0ZXN0Zm9vIiAvPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ0b3VjaHRlc3RiYXIiIC8+CisgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEV4cGxpY2l0TWFwcGVkRmlsZXNldCI+CisgICAgPHRvdWNoIGZpbGU9InRvdWNodGVzdCIgbWlsbGlzPSIke21hcHBlcm1pbGxpc30iIC8+CisgICAgPHRvdWNoPgorICAgICAgPGZpbGVzZXQgZmlsZT0idG91Y2h0ZXN0IiAvPgorICAgICAgPG1hcHBlcj4KKyAgICAgICAgPGNvbXBvc2l0ZW1hcHBlcj4KKyAgICAgICAgICA8Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0iKmZvbyIgLz4KKyAgICAgICAgICA8Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0iKmJhciIgLz4KKyAgICAgICAgPC9jb21wb3NpdGVtYXBwZXI+CisgICAgICA8L21hcHBlcj4KKyAgICA8L3RvdWNoPgorCisgICAgPGZpbGVzZXQgaWQ9InRvdWNodGVzdCIgZmlsZT0idG91Y2h0ZXN0Ij4KKyAgICAgIDxzZWxlY3RvciByZWZpZD0ibWFwLnNlbGVjdG9yIiAvPgorICAgIDwvZmlsZXNldD4KKworICAgIDxmaWxlc2V0IGlkPSJ0b3VjaHRlc3Rmb28iIGZpbGU9InRvdWNodGVzdGZvbyI+CisgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im1hcC5zZWxlY3RvciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisKKyAgICA8ZmlsZXNldCBpZD0idG91Y2h0ZXN0YmFyIiBmaWxlPSJ0b3VjaHRlc3RiYXIiPgorICAgICAgPHNlbGVjdG9yIHJlZmlkPSJtYXAuc2VsZWN0b3IiIC8+CisgICAgPC9maWxlc2V0PgorCisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJ0b3VjaHRlc3QiIHBhdGhzZXA9IiAiCisgICAgICAgICAgICAgICAgIHJlZmlkPSJ0b3VjaHRlc3QiIHNldG9uZW1wdHk9ImZhbHNlIiAvPgorCisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJ0b3VjaHRlc3Rmb28iIHBhdGhzZXA9IiAiCisgICAgICAgICAgICAgICAgIHJlZmlkPSJ0b3VjaHRlc3Rmb28iIHNldG9uZW1wdHk9ImZhbHNlIiAvPgorCisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJ0b3VjaHRlc3RiYXIiIHBhdGhzZXA9IiAiCisgICAgICAgICAgICAgICAgIHJlZmlkPSJ0b3VjaHRlc3RiYXIiIHNldG9uZW1wdHk9ImZhbHNlIiAvPgorCisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxhbmQ+CisgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InRvdWNodGVzdCIgLz4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0idG91Y2h0ZXN0Zm9vIiAvPgorICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ0b3VjaHRlc3RiYXIiIC8+CisgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE1hcHBlZEZpbGVsaXN0Ij4KKyAgICA8dG91Y2ggbWlsbGlzPSIke21hcHBlcm1pbGxpc30iPgorICAgICAgPGZpbGVsaXN0IGRpcj0iLiIgZmlsZXM9Imlkb25vdGV4aXN0IiAvPgorICAgICAgPG1lcmdlbWFwcGVyIHRvPSJ0b3VjaHRlc3QiIC8+CisgICAgPC90b3VjaD4KKworICAgIDxmaWxlc2V0IGlkPSJ0b3VjaHRlc3QiIGZpbGU9InRvdWNodGVzdCI+CisgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im1hcC5zZWxlY3RvciIgLz4KKyAgICA8L2ZpbGVzZXQ+CisKKyAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9InRvdWNodGVzdCIgcGF0aHNlcD0iICIKKyAgICAgICAgICAgICAgICAgcmVmaWQ9InRvdWNodGVzdCIgc2V0b25lbXB0eT0iZmFsc2UiIC8+CisKKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ0b3VjaHRlc3QiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEdvb2RQYXR0ZXJuIj4KKyAgICA8dG91Y2ggZmlsZT0idG91Y2h0ZXN0IiBkYXRldGltZT0iMDYyNDIwMDMxNDIwMTJHTVRmb28iIHBhdHRlcm49Ik1NZGR5eXl5SEhtbXNzeidmb28nIiAvPgorCisgICAgPGZpbGVzZXQgaWQ9InRvdWNodGVzdCIgZmlsZT0idG91Y2h0ZXN0Ij4KKyAgICAgIDxkYXRlIG1pbGxpcz0iMTA1NjQ2NDQxMjAwMCIgLz4KKyAgICA8L2ZpbGVzZXQ+CisKKyAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9InRvdWNodGVzdCIgcGF0aHNlcD0iICIKKyAgICAgICAgICAgICAgICAgcmVmaWQ9InRvdWNodGVzdCIgc2V0b25lbXB0eT0iZmFsc2UiIC8+CisKKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ0b3VjaHRlc3QiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RCYWRQYXR0ZXJuIj4KKyAgICA8dG91Y2ggZmlsZT0idG91Y2h0ZXN0IiBkYXRldGltZT0iMDYyNDIwMDMxNDIwMTJHTVRmb28iIHBhdHRlcm49Ik1NZGR5eXl5SEhtbXNzeidiYXInIiAvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWFkYXB0ZXIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWFkYXB0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYWE3MGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90eXBlYWRhcHRlci54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9InRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImludmFsaWQiPgorICA8cHJvcGVydHkgbmFtZT0idGVzdGNhc2VzLmRpciIgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIvPgorICA8cGF0aCBpZD0idGVzdGNsYXNzZXMiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Y2FzZXMuZGlyfSIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICA8L3BhdGg+CisKKyAgPHRhcmdldCBuYW1lPSJ0YXNrYWRhcHRlciI+CisgICAgPHR5cGVkZWYgbmFtZT0ibXlleGVjIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHlwZUFkYXB0ZXJUZXN0JE15RXhlYyIKKyAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3RjbGFzc2VzIgorICAgICAgICAgICAgIGFkYXB0ZXI9Im9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tBZGFwdGVyIi8+CisgICAgPG15ZXhlYy8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icnVuYWRhcHRlciI+CisgICAgPHR5cGVkZWYKKyAgICAgIG5hbWU9Im15cnVubmFibGUiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlR5cGVBZGFwdGVyVGVzdCRNeVJ1bm5hYmxlIgorICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0Y2xhc3NlcyIKKyAgICAgIGFkYXB0ZXI9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlR5cGVBZGFwdGVyVGVzdCRSdW5uYWJsZUFkYXB0ZXIiLz4KKyAgICA8bXlydW5uYWJsZS8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icnVuYWRhcHRlcmVycm9yIj4KKyAgICA8dHlwZWRlZgorICAgICAgbmFtZT0ibXlydW5uYWJsZSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHlwZUFkYXB0ZXJUZXN0JE15RXhlYyIKKyAgICAgIGNsYXNzcGF0aHJlZj0idGVzdGNsYXNzZXMiCisgICAgICBhZGFwdGVyPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UeXBlQWRhcHRlclRlc3QkUnVubmFibGVBZGFwdGVyIi8+CisgICAgPG15cnVubmFibGUvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRlbGF5Ij4KKyAgICA8dHlwZWRlZgorICAgICAgbmFtZT0ibXl0YXNrIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UeXBlQWRhcHRlclRlc3QkTXlUYXNrIgorICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0Y2xhc3NlcyIKKyAgICAgIG9uZXJyb3I9Imlnbm9yZSIvPgorICAgIDxteXRhc2svPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im9uZXJyb3IucmVwb3J0Ij4KKyAgICA8dHlwZWRlZgorICAgICAgbmFtZT0ibXl0YXNrIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UeXBlQWRhcHRlclRlc3QkTXlUYXNrTm90UHJlc2VudCIKKyAgICAgIGNsYXNzcGF0aHJlZj0idGVzdGNsYXNzZXMiCisgICAgICBvbmVycm9yPSJyZXBvcnQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJvbmVycm9yLmlnbm9yZSI+CisgICAgPHR5cGVkZWYKKyAgICAgIG5hbWU9Im15dGFzayIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHlwZUFkYXB0ZXJUZXN0JE15VGFza05vdFByZXNlbnQiCisgICAgICBjbGFzc3BhdGhyZWY9InRlc3RjbGFzc2VzIgorICAgICAgb25lcnJvcj0iaWdub3JlIi8+CisgIDwvdGFyZ2V0PgorCisKKzwvcHJvamVjdD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWRlZi54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90eXBlZGVmLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzc5MjJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWRlZi54bWwKQEAgLTAsMCArMSw4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9InRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImludmFsaWQiPgorCisgIDx0YXJnZXQgbmFtZT0iaW52YWxpZCI+CisgICAgPGZhaWw+VGhpcyBmaWxlIHNob3VsZCBvbmx5IGJlIHJ1biB2aWEgYSB0ZXN0Y2FzZTwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJlbXB0eSI+CisgICAgPHR5cGVkZWYgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJub0NsYXNzbmFtZSI+CisgICAgPHR5cGVkZWYgbmFtZT0iZHVtbXkiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm9OYW1lIj4KKyAgICA8dHlwZWRlZiBjbGFzc25hbWU9Im9yZy5leGFtcGxlLnR5cGVzLlR5cGVkZWZUZXN0VHlwZSI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIgLz4KKyAgICA8L3R5cGVkZWY+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xhc3NOb3RGb3VuZCI+CisgICAgPHR5cGVkZWYgbmFtZT0iIiBjbGFzc25hbWU9Im9vcHMiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHBhdGggaWQ9InRlc3RjbGFzc2VzIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICA8L3BhdGg+CisKKyAgPHR5cGVkZWYgbmFtZT0iZ2xvYmFsIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5leGFtcGxlLnR5cGVzLlR5cGVkZWZUZXN0VHlwZSI+CisgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdGNsYXNzZXMiIC8+CisgIDwvdHlwZWRlZj4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RHbG9iYWwiPgorICAgIDxnbG9iYWwgaWQ9Imdsb2JhbCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TG9jYWwiPgorICAgIDx0eXBlZGVmIG5hbWU9ImxvY2FsdHlwZSIKKyAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5leGFtcGxlLnR5cGVzLlR5cGVkZWZUZXN0VHlwZSI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIgLz4KKyAgICA8L3R5cGVkZWY+CisgICAgPGxvY2FsdHlwZSBpZD0ibG9jYWwiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZG91YmxlLW5vdHByZXNlbnQiPgorICAgIDx0eXBlZGVmIG5hbWU9Im15dGFzayIgY2xhc3NuYW1lPSJub3RwcmVzZW50IiBvbmVycm9yPSJpZ25vcmUiLz4KKyAgICA8dHlwZWRlZiBuYW1lPSJteXRhc2siIGNsYXNzbmFtZT0ibm90cHJlc2VudCIgb25lcnJvcj0iaWdub3JlIi8+CisgICAgPHR5cGVkZWYgbmFtZT0ibXl0YXNrIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG8iCisgICAgICAgICAgICAgb25lcnJvcj0iaWdub3JlIi8+CisgICAgPG15dGFzaz5oaTwvbXl0YXNrPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0ibm9yZXNvdXJjZWZhaWxhbGwiPgorICAJPHR5cGVkZWYgcmVzb3VyY2U9InNvbWVub3RwcmVzZW50ZmlsZS5wcm9wZXJ0aWVzIiBvbmVycm9yPSJmYWlsYWxsIi8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJub3Jlc291cmNlZmFpbCI+CisgIAk8dHlwZWRlZiByZXNvdXJjZT0ic29tZW5vdHByZXNlbnRmaWxlLnByb3BlcnRpZXMiIG9uZXJyb3I9ImZhaWwiLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9Im5vcmVzb3VyY2Vub3RmYWlsIj4KKyAgCTx0eXBlZGVmIHJlc291cmNlPSJzb21lbm90cHJlc2VudGZpbGUucHJvcGVydGllcyIgLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91bnRhci54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91bnRhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0NmYzNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VudGFyLnhtbApAQCAtMCwwICsxLDEwMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImNsZWFudXAiPgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBmaWxlPSJhc2YtbG9nby5naWYiIC8+CisgICAgPGRlbGV0ZSBmaWxlPSJ1bnRhcnRlc3QudGFyIiAvPgorICAgIDxkZWxldGUgZGlyPSJ1bnRhcnRlc3RpbiIvPgorICAgIDxkZWxldGUgZGlyPSJ1bnRhcnRlc3RvdXQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VGFyVGFzayI+CisgICAgPGFudCBhbnRmaWxlPSJ0YXIueG1sIiB0YXJnZXQ9ImZlYXRoZXIiIC8+CisgICAgPHVudGFyIHNyYz0iYXNmLWxvZ28uZ2lmLnRhciIgZGVzdD0iLiIgLz4KKyAgICA8YW50IGFudGZpbGU9InRhci54bWwiIHRhcmdldD0iY2xlYW51cCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0R3ppcFRhclRhc2siPgorICAgIDxhbnQgYW50ZmlsZT0idGFyLnhtbCIgdGFyZ2V0PSJmZWF0aGVyIiAvPgorICAgIDx1bnRhciBzcmM9ImFzZi1sb2dvLmdpZi50YXIuZ3oiIGRlc3Q9Ii4iIGNvbXByZXNzaW9uPSJnemlwIiAvPgorICAgIDxhbnQgYW50ZmlsZT0idGFyLnhtbCIgdGFyZ2V0PSJjbGVhbnVwIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RCemlwMlRhclRhc2siPgorICAgIDxhbnQgYW50ZmlsZT0idGFyLnhtbCIgdGFyZ2V0PSJmZWF0aGVyIiAvPgorICAgIDx1bnRhciBzcmM9ImFzZi1sb2dvLmdpZi50YXIuYnoyIiBkZXN0PSIuIiBjb21wcmVzc2lvbj0iYnppcDIiLz4KKyAgICA8YW50IGFudGZpbGU9InRhci54bWwiIHRhcmdldD0iY2xlYW51cCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZWFsVGVzdCI+CisgICAgPHVudGFyIHNyYz0iZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnRhciIgZGVzdD0iLiIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZWFsR3ppcFRlc3QiPgorICAgIDx1bnRhciBzcmM9ImV4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIuZ3oiIGRlc3Q9Ii4iIGNvbXByZXNzaW9uPSJnemlwIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlYWxCemlwMlRlc3QiPgorICAgIDx1bnRhciBzcmM9ImV4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIuYnoyIiBkZXN0PSIuIiBjb21wcmVzc2lvbj0iYnppcDIiLz4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9InNyY0RpclRlc3QiPgorICAgIDx1bnRhciBzcmM9Ii4iIGRlc3Q9Ii4iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZW5jb2RpbmciPgorICAgIDx1bnRhciBzcmM9ImV4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIiIGRlc3Q9Ii4iIGVuY29kaW5nPSJmb28iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZXNvdXJjZUNvbGxlY3Rpb24iPgorICAgIDxta2RpciBkaXI9InVudGFydGVzdG91dCIvPgorICAgIDx6aXAgZGVzdGZpbGU9InVudGFydGVzdG91dC90ZXN0LnppcCI+CisgICAgICA8ZmlsZXNldCBkaXI9ImV4cGVjdGVkIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iYXNmLWxvZ28uZ2lmLnRhciIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvemlwPgorICAgIDx1bnRhciBkZXN0PSIuIj4KKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0idW50YXJ0ZXN0b3V0L3Rlc3QuemlwIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi50YXIiLz4KKyAgICAgIDwvemlwZmlsZXNldD4KKyAgICA8L3VudGFyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InByZXBhcmVUZXN0VGFyIj4KKyAgICA8bWtkaXIgZGlyPSJ1bnRhcnRlc3Rpbi8xIi8+CisgICAgPG1rZGlyIGRpcj0idW50YXJ0ZXN0aW4vMiIvPgorICAgIDx0b3VjaCBmaWxlPSJ1bnRhcnRlc3Rpbi8xL2ZvbyIvPgorICAgIDx0b3VjaCBmaWxlPSJ1bnRhcnRlc3Rpbi8yL2JhciIvPgorICAgIDxjb3B5IHRvZGlyPSJ1bnRhcnRlc3Rpbi8yIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhwZWN0ZWQiIGluY2x1ZGVzPSIqbWQ1KiIvPgorICAgIDwvY29weT4KKyAgICA8dGFyIGRlc3RmaWxlPSJ1bnRhcnRlc3QudGFyIiBiYXNlZGlyPSJ1bnRhcnRlc3RpbiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REb2N1bWVudGF0aW9uQ2xhaW1zT25Db3B5IiBkZXBlbmRzPSJwcmVwYXJlVGVzdFRhciI+CisgICAgPGNvcHkgdG9kaXI9InVudGFydGVzdG91dCIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiPiAKKyAgICAgIDx0YXJmaWxlc2V0IHNyYz0idW50YXJ0ZXN0LnRhciI+CisgICAgICAgIDxwYXR0ZXJuc2V0PgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IjIvIi8+CisgICAgICAgIDwvcGF0dGVybnNldD4KKyAgICAgIDwvdGFyZmlsZXNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VuemlwLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VuemlwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRhZmNlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdW56aXAueG1sCkBAIC0wLDAgKzEsMTg2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0ieHh4LXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QxIj4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgZmlsZT0iYXNmLWxvZ28uZ2lmIiAvPgorICAgIDxkZWxldGUgZmlsZT0idW56aXB0ZXN0LnppcCIvPgorICAgIDxkZWxldGUgZGlyPSJ1bnppcHRlc3RpbiIvPgorICAgIDxkZWxldGUgZGlyPSJ1bnppcHRlc3RvdXQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPHVuemlwLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MiI+CisgICAgPHVuemlwIHNyYz0iIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiPgorICAgIDx1bnppcCBkZXN0PSIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0WmlwVGFzayI+CisgICAgPGFudCBhbnRmaWxlPSJ6aXAueG1sIiB0YXJnZXQ9ImZlYXRoZXIiIC8+CisgICAgPHVuemlwIHNyYz0iYXNmLWxvZ28uZ2lmLnppcCIgZGVzdD0iLiIgLz4KKyAgICA8YW50IGFudGZpbGU9InppcC54bWwiIHRhcmdldD0iY2xlYW51cCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VW5jb21wcmVzc2VkWmlwVGFzayI+CisgICAgPGFudCBhbnRmaWxlPSJ6aXAueG1sIiB0YXJnZXQ9InVuY29tcHJlc3NlZC1mZWF0aGVyIiAvPgorICAgIDx1bnppcCBzcmM9ImFzZi1sb2dvLmdpZi56aXAiIGRlc3Q9Ii4iIC8+CisgICAgPGFudCBhbnRmaWxlPSJ6aXAueG1sIiB0YXJnZXQ9ImNsZWFudXAiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVhbFRlc3QiPgorICAgIDx1bnppcCBzcmM9ImV4cGVjdGVkL2FzZi1sb2dvLmdpZi56aXAiIGRlc3Q9Ii4iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icHJlcGFyZVRlc3RaaXAiPgorICAgIDxta2RpciBkaXI9InVuemlwdGVzdGluLzEiLz4KKyAgICA8bWtkaXIgZGlyPSJ1bnppcHRlc3Rpbi8yIi8+CisgICAgPHRvdWNoIGZpbGU9InVuemlwdGVzdGluLzEvZm9vIi8+CisgICAgPHRvdWNoIGZpbGU9InVuemlwdGVzdGluLzIvYmFyIi8+CisgICAgPHppcCBkZXN0ZmlsZT0idW56aXB0ZXN0LnppcCIgYmFzZWRpcj0idW56aXB0ZXN0aW4iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UGF0dGVyblNldEV4Y2x1ZGVPbmx5IiBkZXBlbmRzPSJwcmVwYXJlVGVzdFppcCI+CisgICAgPHVuemlwIGRlc3Q9InVuemlwdGVzdG91dCIgc3JjPSJ1bnppcHRlc3QuemlwIj4KKyAgICAgIDxwYXR0ZXJuc2V0PgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIxLyoqIi8+CisgICAgICA8L3BhdHRlcm5zZXQ+CisgICAgPC91bnppcD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UGF0dGVyblNldEluY2x1ZGVPbmx5IiBkZXBlbmRzPSJwcmVwYXJlVGVzdFppcCI+CisgICAgPHVuemlwIGRlc3Q9InVuemlwdGVzdG91dCIgc3JjPSJ1bnppcHRlc3QuemlwIj4KKyAgICAgIDxwYXR0ZXJuc2V0PgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIyLyoqIi8+CisgICAgICA8L3BhdHRlcm5zZXQ+CisgICAgPC91bnppcD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UGF0dGVyblNldEluY2x1ZGVBbmRFeGNsdWRlIiBkZXBlbmRzPSJwcmVwYXJlVGVzdFppcCI+CisgICAgPHVuemlwIGRlc3Q9InVuemlwdGVzdG91dCIgc3JjPSJ1bnppcHRlc3QuemlwIj4KKyAgICAgIDxwYXR0ZXJuc2V0PgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIyLyoqIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IjIvKioiLz4KKyAgICAgIDwvcGF0dGVybnNldD4KKyAgICA8L3VuemlwPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RUd29QYXR0ZXJuU2V0cyIgZGVwZW5kcz0icHJlcGFyZVRlc3RaaXAiPgorICAgIDx1bnppcCBkZXN0PSJ1bnppcHRlc3RvdXQiIHNyYz0idW56aXB0ZXN0LnppcCI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iMi8qKiIvPgorICAgICAgPC9wYXR0ZXJuc2V0PgorICAgICAgPHBhdHRlcm5zZXQ+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IjMvKioiLz4KKyAgICAgIDwvcGF0dGVybnNldD4KKyAgICA8L3VuemlwPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RUd29QYXR0ZXJuU2V0c1dpdGhFeGNsdWRlcyIgZGVwZW5kcz0icHJlcGFyZVRlc3RaaXAiPgorICAgIDx1bnppcCBkZXN0PSJ1bnppcHRlc3RvdXQiIHNyYz0idW56aXB0ZXN0LnppcCI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iMi8qKiIvPgorICAgICAgPC9wYXR0ZXJuc2V0PgorICAgICAgPHBhdHRlcm5zZXQ+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IjEvKioiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iMi8qKiIvPgorICAgICAgPC9wYXR0ZXJuc2V0PgorICAgIDwvdW56aXA+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2VsZkV4dHJhY3RpbmdBcmNoaXZlIj4KKyAgICA8bWtkaXIgZGlyPSJ1bnppcHRlc3RvdXQiLz4KKyAgICA8dW56aXAgZGVzdD0idW56aXB0ZXN0b3V0IiBzcmM9InppcC90ZXN0LmV4ZSIvPgorICA8L3RhcmdldD4KKworICA8IS0tIEJ1Z3ppbGxhIFJlcG9ydCAyMDk2OSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UGF0dGVyblNldFNsYXNoT25seSIgZGVwZW5kcz0icHJlcGFyZVRlc3RaaXAiPgorICAgIDx1bnppcCBkZXN0PSJ1bnppcHRlc3RvdXQiIHNyYz0idW56aXB0ZXN0LnppcCI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iMi8iLz4KKyAgICAgIDwvcGF0dGVybnNldD4KKyAgICA8L3VuemlwPgorICA8L3RhcmdldD4KKworICA8IS0tIEJ1Z3ppbGxhIFJlcG9ydCAxMDUwNCAtLT4KKyAgPHRhcmdldCBuYW1lPSJlbmNvZGluZ1Rlc3QiPgorICAgIDxta2RpciBkaXI9InVuemlwdGVzdGluIi8+CisgICAgPHRvdWNoIGZpbGU9InVuemlwdGVzdGluL2ZvbyIvPgorICAgIDx6aXAgemlwZmlsZT0idW56aXB0ZXN0LnppcCIgYmFzZWRpcj0idW56aXB0ZXN0aW4iIGVuY29kaW5nPSJVbmljb2RlQmlnIi8+CisgICAgPG1rZGlyIGRpcj0idW56aXB0ZXN0b3V0Ii8+CisgICAgPHVuemlwIHNyYz0idW56aXB0ZXN0LnppcCIgZGVzdD0idW56aXB0ZXN0b3V0IiBlbmNvZGluZz0iVW5pY29kZUJpZyIvPgorICA8L3RhcmdldD4KKworICA8IS0tIEJ1Z3ppbGxhIFJlcG9ydCAyMTk5NiAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmxhdHRlbk1hcHBlciIgZGVwZW5kcz0icHJlcGFyZVRlc3RaaXAiPgorICAgIDx1bnppcCBkZXN0PSJ1bnppcHRlc3RvdXQiIHNyYz0idW56aXB0ZXN0LnppcCI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iMS8qKiIvPgorICAgICAgPC9wYXR0ZXJuc2V0PgorICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+CisgICAgPC91bnppcD4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBCdWd6aWxsYSBSZXBvcnQgMjE5OTYgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdEdsb2JNYXBwZXIiIGRlcGVuZHM9InByZXBhcmVUZXN0WmlwIj4KKyAgICA8dW56aXAgZGVzdD0idW56aXB0ZXN0b3V0IiBzcmM9InVuemlwdGVzdC56aXAiPgorICAgICAgPHBhdHRlcm5zZXQ+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IjEvKioiLz4KKyAgICAgIDwvcGF0dGVybnNldD4KKyAgICAgIDxtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKiIgdG89IioudHh0Ii8+CisgICAgPC91bnppcD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VHdvTWFwcGVycyIgZGVwZW5kcz0icHJlcGFyZVRlc3RaaXAiPgorICAgIDx1bnppcCBkZXN0PSJ1bnppcHRlc3RvdXQiIHNyYz0idW56aXB0ZXN0LnppcCI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iMS8qKiIvPgorICAgICAgPC9wYXR0ZXJuc2V0PgorICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqIiB0bz0iKi50eHQiLz4KKyAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPiAgICAgIAorICAgIDwvdW56aXA+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlc291cmNlQ29sbGVjdGlvbiI+CisgICAgPHVuemlwIGRlc3Q9InVuemlwdGVzdG91dCI+CisgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ianVuaXQvKioiLz4KKyAgICAgIDwvcGF0dGVybnNldD4KKyAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgPHBhdGggcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CisgICAgICAgIDx0eXBlIHR5cGU9ImZpbGUiIHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyIvPgorICAgICAgPC9yZXN0cmljdD4KKyAgICA8L3VuemlwPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REb2N1bWVudGF0aW9uQ2xhaW1zT25Db3B5IiBkZXBlbmRzPSJwcmVwYXJlVGVzdFppcCI+CisgICAgPGNvcHkgdG9kaXI9InVuemlwdGVzdG91dCIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiPiAKKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0idW56aXB0ZXN0LnppcCI+CisgICAgICAgIDxwYXR0ZXJuc2V0PgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IjIvIi8+CisgICAgICAgIDwvcGF0dGVybnNldD4KKyAgICAgIDwvemlwZmlsZXNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdXB0b2RhdGUueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdXB0b2RhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlNmNlODYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91cHRvZGF0ZS54bWwKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBiYXNlZGlyPSIuIj4KKworICA8dGFyZ2V0IG5hbWU9InNldFVwIj4KKyAgICA8dG91Y2ggZmlsZT0ic291cmNlIi8+CisgICAgPHNsZWVwIHNlY29uZHM9IjMiLz4KKyAgICA8dG91Y2ggZmlsZT0idGFyZ2V0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVhckRvd24iPgorICAgIDxkZWxldGUgZmlsZT0ic291cmNlIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJ0YXJnZXQiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZXNldFVwVG9EYXRlIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJmb28iIHRhcmdldGZpbGU9InRhcmdldCI+CisgICAgICA8c3JjZmlsZXMgZGlyPSIuIiBpbmNsdWRlcz0ic291cmNlIi8+CisgICAgPC91cHRvZGF0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZXNldE91dE9mRGF0ZSIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iZm9vIiB0YXJnZXRmaWxlPSJzb3VyY2UiPgorICAgICAgPHNyY2ZpbGVzIGRpcj0iLiIgaW5jbHVkZXM9InRhcmdldCIvPgorICAgIDwvdXB0b2RhdGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJDVXBUb0RhdGUiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImZvbyIgdGFyZ2V0ZmlsZT0idGFyZ2V0Ij4KKyAgICAgIDxzcmNyZXNvdXJjZXM+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9InNvdXJjZSIvPgorICAgICAgPC9zcmNyZXNvdXJjZXM+CisgICAgPC91cHRvZGF0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UkNPdXRPZkRhdGUiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImZvbyIgdGFyZ2V0ZmlsZT0ic291cmNlIj4KKyAgICAgIDxzcmNyZXNvdXJjZXM+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9InRhcmdldCIvPgorICAgICAgPC9zcmNyZXNvdXJjZXM+CisgICAgPC91cHRvZGF0ZT4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvd2FyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3dhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiY2E0OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3dhci54bWwKQEAgLTAsMCArMSw0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Indhci10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJoZWxwIj4KKyAgPHByb3BlcnR5IG5hbWU9IndvcmtpbmcuZGlyIiB2YWx1ZT0id29ya2luZyIvPgorCisgIDx0YXJnZXQgbmFtZT0iaGVscCI+CisgICAgPGVjaG8gbWVzc2FnZT0iVGVzdCBmaWxlIGZvciB0aGUgd2FyIHRhc2siLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzZXR1cCI+CisgICAgPG1rZGlyIGRpcj0iJHt3b3JraW5nLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RsaWJyZWZzIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGZpbGVzZXQgaWQ9InRlc3QiIGRpcj0iLiIgaW5jbHVkZXM9Indhci54bWwiLz4KKyAgICA8d2FyIHdlYnhtbD0id2FyLnhtbCIgZGVzdGZpbGU9IiR7d29ya2luZy5kaXJ9L3Rlc3Qud2FyIj4KKyAgICAgIDxsaWIgcmVmaWQ9InRlc3QiLz4KKyAgICA8L3dhcj4KKyAgICA8dW56aXAgc3JjPSIke3dvcmtpbmcuZGlyfS90ZXN0LndhciIgZGVzdD0iJHt3b3JraW5nLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3b3JraW5nLmRpcn0iLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy93aGljaHJlc291cmNlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3doaWNocmVzb3VyY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MmU5YzAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy93aGljaHJlc291cmNlLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImZhaWwiPgorICA8dGFyZ2V0IG5hbWU9ImZhaWwiPgorICAgIDxmYWlsPlJ1biB2aWEgdGVzdGNhc2VzIG9ubHk8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENsYXNzbmFtZSI+CisgICAgPHdoaWNocmVzb3VyY2UgY2xhc3M9Im9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4iCisgICAgICBwcm9wZXJ0eT0iYW50bWFpbiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZXNvdXJjZW5hbWUiPgorICAgIDx3aGljaHJlc291cmNlIHJlc291cmNlPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIgorICAgICAgcHJvcGVydHk9ImRlZmF1bHRzIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlc291cmNlbmFtZVdpdGhMZWFkaW5nU2xhc2giPgorICAgIDx3aGljaHJlc291cmNlIHJlc291cmNlPSIvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGVmYXVsdHMucHJvcGVydGllcyIKKyAgICAgIHByb3BlcnR5PSJkZWZhdWx0cyIvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxucy54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5OTE2NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbG5zLnhtbApAQCAtMCwwICsxLDY3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3QiIHhtbG5zOm90aGVyPSJ0aGlzIGlzIHRoZSBvdGhlciB1cmkiCisgICAgICAgICBvdGhlcjphdHRyPSJ0aGlzIHNob3VsZCBiZSBpZ25vcmVkIGJ5IGFudCI+CisKKyAgPHByb3BlcnR5IG5hbWU9InRlc3RjYXNlcy5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiLz4KKworICA8cGF0aCBpZD0idGVzdGNsYXNzZXMiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Y2FzZXMuZGlyfSIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICA8L3BhdGg+CisKKyAgPHRhcmdldCBuYW1lPSJ4bWxucyIgeG1sbnM6dGVzdD0idGhpcy5pcy5hbm90aGVyLnRlc3QudXJpIj4KKyAgICA8dHlwZWRlZiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhtbG5zVGVzdCRNeVRhc2siCisgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0Y2xhc3NlcyIKKyAgICAgICAgICAgICBuYW1lPSJteXRhc2siCisgICAgICAgICAgICAgdXJpPSJ0aGlzLmlzLmFub3RoZXIudGVzdC51cmkiIC8+CisgICAgPHRlc3Q6bXl0YXNrLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJvdGhlciIgb3RoZXI6YT0idGhpcyBpcyBhbm90aGVyIGF0dHJpYnV0ZSI+CisgICAgPGVjaG8gb3RoZXI6Zz0iYWJjIiBtZXNzYWdlPSJhIG1lc3NhZ2UiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJucy5hdHRyaWJ1dGVzIj4KKyAgICA8dGFza2RlZiBuYW1lPSJteS5lY2hvIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG8iCisgICAgICAgICAgICAgdXJpPSJ4LXVyaSIvPgorICAgIDx4Om15LmVjaG8geDptZXNzYWdlPSJoZWxsbyB3b3JsZCIgeG1sbnM6eD0ieC11cmkiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ4bWxucy5maWxlIiB4bWxuczp0ZXN0PSJ0aGlzLmlzLmEudGVzdC51cmkiPgorICAgIDx0eXBlZGVmIGZpbGU9InRlc3QuYW50bGliLnhtbCIKKyAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3RjbGFzc2VzIgorICAgICAgICAgICAgIHVyaT0idGhpcy5pcy5hLnRlc3QudXJpIiAvPgorICAgIDx0ZXN0Om15dGFzay8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29yZSI+CisgICAgPHR5cGVkZWYgZmlsZT0idGVzdC5hbnRsaWIueG1sIgorICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdGNsYXNzZXMiCisgICAgICAgICAgICAgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQiIC8+CisgICAgPG15dGFzay8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZXhjbHVkZWQiPgorICAgIDx0eXBlZGVmIGZpbGU9InRlc3QuYW50bGliLnhtbCIKKyAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3RjbGFzc2VzIgorICAgICAgICAgICAgIHVyaT0iYW50Om5vdGFsbG93ZWQiIC8+CisgIDwvdGFyZ2V0PgorCisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5ZWI2YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5LnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCI+CisgICAgPHhtbHByb3BlcnR5IGZpbGU9InhtbHByb3BlcnR5X2RhdGEueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGR0ZCI+CisgICAgPHhtbHByb3BlcnR5IGZpbGU9InhtbHByb3BlcnR5X3dpdGhkdGQueG1sIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlc291cmNlIj4KKyAgICA8bG9hZGZpbGUgc3JjZmlsZT0ieG1scHJvcGVydHlfZGF0YS54bWwiIHByb3BlcnR5PSJwcm9wIi8+CisgICAgPHhtbHByb3BlcnR5PgorICAgICAgPHN0cmluZyB2YWx1ZT0iJHtwcm9wfSIvPgorICAgIDwveG1scHJvcGVydHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdG5lZWRzY2F0Ij4KKyAgICA8eG1scHJvcGVydHkgZmlsZT0ieG1scHJvcGVydHlfbmVlZHNjYXQueG1sIj4KKyAgICAgIDx4bWxjYXRhbG9nPgorICAgICAgICA8ZHRkIHB1YmxpY0lkPSItLy9GT08vL0RURCBTa2luIENvbmZpZ3VyYXRpb24gVjAuMS8vRU4iCisgICAgICAgICAgICAgbG9jYXRpb249InNraW5jb25maWcuZHRkIi8+CisgICAgICA8L3htbGNhdGFsb2c+CisgICAgPC94bWxwcm9wZXJ0eT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBjYmFiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LWNvbGxhcHNlLWlucHV0MS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjEgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcHJvcGVydGllcy5yb290PWZvbyxiYXIKK3Byb3BlcnRpZXMuYS5iLmM9ZAorcHJvcGVydGllcy5hLmI9ZQorcHJvcGVydGllcy5mb28uYmFyPXF1dXgscXV1eDEKK3Byb3BlcnRpZXMuZm9vLnF1dXg9YmFyCitwcm9wZXJ0aWVzLnRhZy52YWx1ZT1mb28KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1jb2xsYXBzZS1vcmlnaW5hbC5wcm9wZXJ0aWVzIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LWNvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwNWUxOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1jb2xsYXBzZS1vcmlnaW5hbC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcm9vdC10YWcubXlhdHRyPXRydWUKK3Jvb3QtdGFnLmlubmVyLXRhZz1UZXh0Cityb290LXRhZy5pbm5lci10YWcuc29tZWF0dHI9dmFsCityb290LXRhZy5hMi5hMy5hND1mYWxzZQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3QtY29sbGFwc2Utb3ZlcnJpZGUucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1jb2xsYXBzZS1vdmVycmlkZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjg2MTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3QtY29sbGFwc2Utb3ZlcnJpZGUucHJvcGVydGllcwpAQCAtMCwwICsxLDE3IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgTWF0Y2ggdmFsdWUgaGFyZHdpcmVkIGluIGNvZGUsIE5PVCBpbiB0aGUgaW5wdXQuLi4KK292ZXJyaWRlLnByb3BlcnR5LnRlc3Q9Zm9vCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3Qtbm9jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1ub2NvbGxhcHNlLWlucHV0MS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2FjNzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3Qtbm9jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcwpAQCAtMCwwICsxLDggQEAKK3Byb3BlcnRpZXMucm9vdD1mb28sYmFyCitwcm9wZXJ0aWVzLmEuYihjKT1kCitwcm9wZXJ0aWVzLmEuYj1lCitwcm9wZXJ0aWVzLmZvbyhiYXIpPXF1dXgKK3Byb3BlcnRpZXMuZm9vLmJhcj1xdXV4MQorcHJvcGVydGllcy5mb28ucXV1eD1iYXIKK3Byb3BlcnRpZXMudGFnKHZhbHVlKT1mb28KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LW5vY29sbGFwc2Utb3JpZ2luYWwucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1ub2NvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlMGMyZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1ub2NvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityb290LXRhZyhteWF0dHIpPXRydWUKK3Jvb3QtdGFnLmlubmVyLXRhZz1UZXh0Cityb290LXRhZy5pbm5lci10YWcoc29tZWF0dHIpPXZhbAorcm9vdC10YWcuYTIuYTMuYTQ9ZmFsc2UKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLWluY2x1ZGUucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1zZW1hbnRpYy1pbmNsdWRlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwY2JhYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1zZW1hbnRpYy1pbmNsdWRlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwcm9wZXJ0aWVzLnJvb3Q9Zm9vLGJhcgorcHJvcGVydGllcy5hLmIuYz1kCitwcm9wZXJ0aWVzLmEuYj1lCitwcm9wZXJ0aWVzLmZvby5iYXI9cXV1eCxxdXV4MQorcHJvcGVydGllcy5mb28ucXV1eD1iYXIKK3Byb3BlcnRpZXMudGFnLnZhbHVlPWZvbwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLWlucHV0MS5wcm9wZXJ0aWVzIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLWlucHV0MS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YjgwN2IKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3Qtc2VtYW50aWMtaW5wdXQxLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwcm9wZXJ0aWVzLnJvb3Q9Zm9vLGJhcgorcHJvcGVydGllcy5hLmIuYz1kCitwcm9wZXJ0aWVzLmEuYj1lCitwcm9wZXJ0aWVzLmZvby5iYXI9cXV1eCxxdXV4MQorcHJvcGVydGllcy5mb28ucXV1eD1iYXIKK3Byb3BlcnRpZXMudGFnPWZvbwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLW92ZXJyaWRlLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3Qtc2VtYW50aWMtb3ZlcnJpZGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Y4NjExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLW92ZXJyaWRlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE1hdGNoIHZhbHVlIGhhcmR3aXJlZCBpbiBjb2RlLCBOT1QgaW4gdGhlIGlucHV0Li4uCitvdmVycmlkZS5wcm9wZXJ0eS50ZXN0PWZvbwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3QtY29sbGFwc2UtaW5wdXQxLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2ZkMjllCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3QtY29sbGFwc2UtaW5wdXQxLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityb290PWZvbyxiYXIKK2EuYi5jPWQKK2EuYj1lCitmb28uYmFyPXF1dXgscXV1eDEKK2Zvby5xdXV4PWJhcgordGFnLnZhbHVlPWZvbwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3QtY29sbGFwc2Utb3JpZ2luYWwucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LWNvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0MmMzOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LWNvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbm5lci10YWc9VGV4dAoraW5uZXItdGFnLnNvbWVhdHRyPXZhbAorYTIuYTMuYTQ9ZmFsc2UKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtbm9jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LW5vY29sbGFwc2UtaW5wdXQxLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjYTM2OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LW5vY29sbGFwc2UtaW5wdXQxLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3IEBACityb290PWZvbyxiYXIKK2EuYihjKT1kCithLmI9ZQorZm9vKGJhcik9cXV1eAorZm9vLmJhcj1xdXV4MQorZm9vLnF1dXg9YmFyCit0YWcodmFsdWUpPWZvbwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtbm9jb2xsYXBzZS1tdWx0aS5wcm9wZXJ0aWVzIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtbm9jb2xsYXBzZS1tdWx0aS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjkwZWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1ub2NvbGxhcHNlLW11bHRpLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmb28uYmFyPTEsMiwzLDQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1ub2NvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1ub2NvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwZjIxMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LW5vY29sbGFwc2Utb3JpZ2luYWwucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2lubmVyLXRhZz1UZXh0Citpbm5lci10YWcoc29tZWF0dHIpPXZhbAorYTIuYTMuYTQ9ZmFsc2UKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtaW5jbHVkZS1pbnB1dDEucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLWluY2x1ZGUtaW5wdXQxLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmZDI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLWluY2x1ZGUtaW5wdXQxLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityb290PWZvbyxiYXIKK2EuYi5jPWQKK2EuYj1lCitmb28uYmFyPXF1dXgscXV1eDEKK2Zvby5xdXV4PWJhcgordGFnLnZhbHVlPWZvbwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtaW5wdXQxLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1zZW1hbnRpYy1pbnB1dDEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGZjZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtaW5wdXQxLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityb290PWZvbyxiYXIKK2EuYi5jPWQKK2EuYj1lCitmb28uYmFyPXF1dXgscXV1eDEKK2Zvby5xdXV4PWJhcgordGFnPWZvbwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtbG9jYXRpb25zLnByb3BlcnRpZXMgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1zZW1hbnRpYy1sb2NhdGlvbnMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTQ1ZDdjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtbG9jYXRpb25zLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmaWxlPUZJTEUuZm9vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtcGF0aHMucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLXBhdGhzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmNTFkZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLXBhdGhzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmb289SUQucGF0aApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLXJlZmVyZW5jZXMucHJvcGVydGllcyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLXJlZmVyZW5jZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTU5MTNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtcmVmZXJlbmNlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcHJvcGVydHk9Zm9vCitmb28uYmFyPWZvbworZm9vLnF1dXg9Zm9vCitmb28udGh1bms9Zm9vCitmb28ucHJvcGVydHk9SUQuZm9vCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvaW5wdXQxLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9pbnB1dDEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzI4YzUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvaW5wdXQxLnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9wZXJ0aWVzPgorICA8cm9vdD5mb288L3Jvb3Q+CisgIDxyb290PmJhcjwvcm9vdD4KKyAgPGE+PGIgYz0iZCI+ZTwvYj48L2E+CisgIDxmb28gYmFyPSJxdXV4Ij4KKyAgICA8YmFyPnF1dXgxPC9iYXI+CisgICAgPHF1dXg+YmFyPC9xdXV4PgorICA8L2Zvbz4KKyAgPHRhZyB2YWx1ZT0iZm9vIi8+Cis8L3Byb3BlcnRpZXM+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvbG9jYXRpb25zLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9sb2NhdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2FjZTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvbG9jYXRpb25zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxsb2NhdGlvbnM+CisgIDxmaWxlIGxvY2F0aW9uPSJmb28iLz4KKzwvbG9jYXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9tdWx0aS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvbXVsdGkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTA0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvbXVsdGkueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb3BlcnRpZXM+CisgIDxmb28+CisgICAgPGJhcj4xPC9iYXI+CisgICAgPGJhcj4yPC9iYXI+CisgICAgPGJhcj4zPC9iYXI+CisgICAgPGJhcj40PC9iYXI+CisgIDwvZm9vPgorPC9wcm9wZXJ0aWVzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9vcmlnaW5hbC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvb3JpZ2luYWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMjYwM2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvb3JpZ2luYWwueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJvb3QtdGFnIG15YXR0cj0idHJ1ZSI+CisgIDxpbm5lci10YWcgc29tZWF0dHI9InZhbCI+VGV4dDwvaW5uZXItdGFnPgorICA8YTI+PGEzPjxhND5mYWxzZTwvYTQ+PC9hMz48L2EyPgorPC9yb290LXRhZz4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL292ZXJyaWRlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9vdmVycmlkZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkYTljNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9vdmVycmlkZS54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cm9vdD4KKyAgPG92ZXJyaWRlPgorICAgIDwhLS0gVGhpcyBwcm9wZXJ0eSBzaG91bGQgbm90IGdldCBzZXQuICBUaGUKKyAgICAgICAgIFhtbFByb3BlcnR5VGVzdCBjb2RlIGV4cGxpY2l0bHkgc2V0cworICAgICAgICAgb3ZlcnJpZGUucHJvcGVydHkudGVzdCB0byBmb28gdG8gbWFrZQorICAgICAgICAgc3VyZSB0aGF0IGF0dGVtcHRzIHRvIHJlc2V0IGl0IHZpYQorICAgICAgICAgcHJvcGVydHkgZmlsZSBsb2FkcyAqZmFpbCouIC0tPgorICAgIDxwcm9wZXJ0eSB0ZXN0PSJiYXIiLz4KKyAgPC9vdmVycmlkZT4KKzwvcm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvcGF0aHMueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL3BhdGhzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQyMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL3BhdGhzLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwYXRocz4KKyAgPGNsYXNzcGF0aCBwYXRoaWQ9ImZvbyI+CisgICAgPHBhdGggdmFsdWU9ImJhciIvPgorICA8L2NsYXNzcGF0aD4KKzwvcGF0aHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL3JlZmVyZW5jZXMueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL3JlZmVyZW5jZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODhiN2IKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvcmVmZXJlbmNlcy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cmVmZXJlbmNlcz4KKyAgPHByb3BlcnR5IHZhbHVlPSJmb28iIGlkPSJmb28ucHJvcGVydHkiLz4KKyAgPGZvbyBiYXI9IiR7cHJvcGVydHl9Ij4KKyAgICA8cXV1eCByZWZpZD0iZm9vLnByb3BlcnR5Ii8+CisgICAgPHRodW5rPiR7cHJvcGVydHl9PC90aHVuaz4KKyAgPC9mb28+Cis8L3JlZmVyZW5jZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfZGF0YS5kdGQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9kYXRhLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDc1ZDZlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfZGF0YS5kdGQKQEAgLTAsMCArMSwzMCBAQAorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFFTEVNRU5UIHJvb3QtdGFnIChpbm5lci10YWcsIGEyLCBjZGF0YXRhZyk+Cis8IUFUVExJU1Qgcm9vdC10YWcgbXlhdHRyIENEQVRBICIiPgorCis8IUVMRU1FTlQgaW5uZXItdGFnICgjUENEQVRBKT4KKzwhQVRUTElTVCBpbm5lci10YWcgc29tZWF0dHIgQ0RBVEEgIiI+CisKKzwhRUxFTUVOVCBhMiAoYTMpPgorCis8IUVMRU1FTlQgYTMgKGE0KT4KKworPCFFTEVNRU5UIGE0ICgjUENEQVRBKT4KKworPCFFTEVNRU5UIGNkYXRhdGFnICgjUENEQVRBKT4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfZGF0YS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9kYXRhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjkyMjIxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfZGF0YS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisgPHJvb3QtdGFnIG15YXR0cj0idHJ1ZSI+CisgICA8aW5uZXItdGFnIHNvbWVhdHRyPSJ2YWwiPlRleHQ8L2lubmVyLXRhZz4KKyAgIDxhMj48YTM+PGE0PmZhbHNlPC9hND48L2EzPjwvYTI+CisgICA8Y2RhdGF0YWc+PCFbQ0RBVEFbPHRlc3Q+XV0+PC9jZGF0YXRhZz4KKyA8L3Jvb3QtdGFnPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfbmVlZHNjYXQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfbmVlZHNjYXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmExODMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9uZWVkc2NhdC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgc2tpbmNvbmZpZyBQVUJMSUMgIi0vL0ZPTy8vRFREIFNraW4gQ29uZmlndXJhdGlvbiBWMC4xLy9FTiIgImh0dHA6Ly9leGFtcGxlLW5vLWR0ZC5jb20vZHRkL3NraW5jb25maWcuZHRkIj4KKzxza2luY29uZmlnPgorICA8Zm9vPnRydWU8L2Zvbz4KKyAgPGJhcj5mYWxzZTwvYmFyPgorPC9za2luY29uZmlnPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfd2l0aGR0ZC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV93aXRoZHRkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTk2Y2RiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfd2l0aGR0ZC54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgcm9vdC10YWcgU1lTVEVNICJ4bWxwcm9wZXJ0eV9kYXRhLmR0ZCI+CisKKyA8cm9vdC10YWcgbXlhdHRyPSJ0cnVlIj4KKyAgIDxpbm5lci10YWcgc29tZWF0dHI9InZhbCI+VGV4dDwvaW5uZXItdGFnPgorICAgPGEyPjxhMz48YTQ+ZmFsc2U8L2E0PjwvYTM+PC9hMj4KKyAgIDxjZGF0YXRhZz48IVtDREFUQVs8dGVzdD5dXT48L2NkYXRhdGFnPgorIDwvcm9vdC10YWc+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy96aXAueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvemlwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmZhMTEzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvemlwLnhtbApAQCAtMCwwICsxLDI2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9InppcC10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0MSI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPHppcC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDx6aXAgZGVzdEZpbGU9InppcC50bXAiLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBUZXN0IHdoZW4gdGhlIHppcCBmaWxlIGluY2x1ZGVzIGl0c2VsZgorICB3aGVuIHRhcmdldCBmaWxlIGV4aXN0cyBiZWZvcmUgdGhlIHppcCB0YXNrIGlzIHJ1biAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MyI+CisgICAgPHRvdWNoIGZpbGU9InRlc3QzLnppcCIvPgorICAgIDx6aXAgZGVzdEZpbGU9InRlc3QzLnppcCIKKyAgICAgICAgIGJhc2VkaXI9Ii4iLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBUZXN0IHdoZW4gdGhlIHppcCBmaWxlIGluY2x1ZGVzIGl0c2VsZgorICB3aGVuIHRhcmdldCBmaWxlIGRvZXMgbm90IGV4aXN0IGJlZm9yZSB0aGUgemlwIHRhc2sgaXMgcnVuCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiPgorICAgICA8emlwIGRlc3RGaWxlPSJ0ZXN0NC56aXAiCisgICAgICAgICBiYXNlZGlyPSIuIi8+CisgIDwvdGFyZ2V0PgorICAtLT4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4KKyAgICA8emlwIHppcGZpbGU9InRlc3Q1LnppcCIgYmFzZWRpcj0iLiIgPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0idGVzdDUuemlwIiAvPgorICAgIDwvemlwPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KKyAgICA8emlwIGRlc3RGaWxlPSJ0ZXN0Ni56aXAiIGJhc2VkaXI9Ii4iPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKi54bWwiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJ6aXAuKiIgLz4KKyAgICA8L3ppcD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NyI+CisgICAgPHppcCBkZXN0RmlsZT0iaW5uZXI3LnppcCIgYmFzZWRpcj0iLiIgPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0iaW5uZXI3LnppcCIgLz4KKyAgICA8L3ppcD4KKyAgICA8emlwIGRlc3RGaWxlPSJ0ZXN0Ny56aXAiIGJhc2VkaXI9Ii4iPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi4qIiAvPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSJpbm5lcjcuemlwIiAvPgorICAgIDwvemlwPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZlYXRoZXIiPgorICAgIDx6aXAgZGVzdEZpbGU9ImFzZi1sb2dvLmdpZi56aXAiCisgICAgICAgICBiYXNlZGlyPSIuLiIKKyAgICAgICAgIGluY2x1ZGVzPSJhc2YtbG9nby5naWYiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idW5jb21wcmVzc2VkLWZlYXRoZXIiPgorICAgIDx6aXAgZGVzdEZpbGU9ImFzZi1sb2dvLmdpZi56aXAiCisgICAgICAgICBiYXNlZGlyPSIuLiIKKyAgICAgICAgIGluY2x1ZGVzPSJhc2YtbG9nby5naWYiIGNvbXByZXNzPSJmYWxzZSIvPgorICA8L3RhcmdldD4KKworICA8IS0tIGxlZ2FjeSBhdHRyaWJ1dGUgc3VwcG9ydCAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0OCI+CisgICAgPHppcCB6aXBmaWxlPSJ0ZXN0OC56aXAiIGJhc2VkaXI9Ii4iID4KKyAgICAgIDxleGNsdWRlIG5hbWU9InRlc3Q4LnppcCIgLz4KKyAgICA8L3ppcD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0WmlwZ3JvdXBmaWxlc2V0Ij4KKworICAgIDx6aXAgemlwZmlsZT0iemlwZ3JvdXBmaWxlc2V0LnppcCIgYmFzZWRpcj0iLiI+CisgICAgICA8emlwZ3JvdXBmaWxlc2V0IGRpcj0iemlwIiAKKyAgICAgICAgaW5jbHVkZXM9InppcGdyb3VwZmlsZXNldCouemlwIiAKKyAgICAgICAgZXhjbHVkZXM9InppcGdyb3VwZmlsZXNldDMuemlwIiAvPgorICAgICAgPGluY2x1ZGUgbmFtZT0iemlwL3ppcGdyb3VwZmlsZXNldDMuemlwIiAvPgorICAgIDwvemlwPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REdXBsaWNhdGVGYWlsIj4KKworICAgIDx6aXAgemlwZmlsZT0iZHVwbGljYXRlRmFpbC56aXAiIGJhc2VkaXI9Ii4iIGR1cGxpY2F0ZT0iZmFpbCI+CisgICAgICA8emlwZ3JvdXBmaWxlc2V0IGRpcj0iZHVwbGljYXRlIiBpbmNsdWRlcz0iZHVwbGljYXRlKi56aXAiIC8+CisgICAgPC96aXA+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFVwZGF0ZU5vdE5lY2Vzc2FyeSIgZGVwZW5kcz0iZmVhdGhlciI+CisgICAgPHppcCBkZXN0RmlsZT0iYXNmLWxvZ28uZ2lmLnppcCIKKyAgICAgICAgIGJhc2VkaXI9Ii4uIgorICAgICAgICAgaW5jbHVkZXM9ImFzZi1sb2dvLmdpZiIKKyAgICAgICAgIHVwZGF0ZT0idHJ1ZSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VXBkYXRlSXNOZWNlc3NhcnkiIGRlcGVuZHM9ImZlYXRoZXIiPgorICAgIDxzbGVlcCBzZWNvbmRzPSI1IiAvPgorICAgIDx0b3VjaCBmaWxlPSIuLi9kdW1teWZpbGUiIC8+CisgICAgPHppcCBkZXN0RmlsZT0iYXNmLWxvZ28uZ2lmLnppcCIKKyAgICAgICAgIGJhc2VkaXI9Ii4uIgorICAgICAgICAgaW5jbHVkZXM9ImFzZi1sb2dvLmdpZixkdW1teWZpbGUiCisgICAgICAgICB1cGRhdGU9InRydWUiIC8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gQnVnemlsbGEgUmVwb3J0IDE4NDAzIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RQcmVmaXhBZGRzRGlyIj4KKyAgICA8emlwIGRlc3RmaWxlPSJ0ZXN0My56aXAiIGZpbGVzb25seT0iZmFsc2UiPgorICAgICAgPHppcGZpbGVzZXQgZGlyPSIuIiBwcmVmaXg9InRlc3QiIGluY2x1ZGVzPSJ6aXAueG1sIi8+CisgICAgPC96aXA+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gQnVnemlsbGEgUmVwb3J0IDE5NDQ5IC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlc09ubHlEb2VzbnRDYXVzZVJlY3JlYXRlU2V0dXAiPgorICAgIDxta2RpciBkaXI9InppcHRlc3QiLz4KKyAgICA8dG91Y2ggZmlsZT0iemlwdGVzdC96aXB0ZXN0Ii8+CisgICAgPHppcCBkZXN0ZmlsZT0idGVzdDMuemlwIiBiYXNlZGlyPSIuIgorICAgICAgICAgaW5jbHVkZXM9InppcHRlc3QvKioiIGZpbGVzb25seT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8IS0tIEJ1Z3ppbGxhIFJlcG9ydCAxOTQ0OSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZXNPbmx5RG9lc250Q2F1c2VSZWNyZWF0ZSI+CisgICAgPHppcCBkZXN0ZmlsZT0idGVzdDMuemlwIiBiYXNlZGlyPSIuIgorICAgICAgICAgaW5jbHVkZXM9InppcHRlc3QvKioiIGZpbGVzb25seT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8IS0tIEJ1Z3ppbGxhIFJlcG9ydCAyMjg2NSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RW1wdHlTa2lwIj4KKyAgICA8bWtkaXIgZGlyPSJ6aXB0ZXN0Ii8+CisgICAgPHppcCBkZXN0ZmlsZT0idGVzdDMuemlwIiBiYXNlZGlyPSJ6aXB0ZXN0IiB3aGVuZW1wdHk9InNraXAiLz4KKyAgICA8ZmFpbCBtZXNzYWdlPSJhcmNoaXZlIHNob3VsZCBnZXQgc2tpcHBlZCI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9InRlc3QzLnppcCIgLz4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBCdWd6aWxsYSBSZXBvcnQgMzAzNjUgLS0+CisgIDx0YXJnZXQgbmFtZT0iemlwRW1wdHlEaXIiPgorICAgIDxta2RpciBkaXI9ImVtcHR5L2VtcHR5MiIvPgorICAgIDx6aXAgZGVzdGZpbGU9InRlc3QzLnppcCIgYmFzZWRpcj0iZW1wdHkiIHVwZGF0ZT0idHJ1ZSIvPgorICAgIDxmYWlsIG1lc3NhZ2U9InNpbmdsZS1kaXJlY3RvcnkgYXJjaGl2ZSBzaG91bGQgYmUgY3JlYXRlZCI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8b3I+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0idGVzdDMuemlwIiAvPgorICAgICAgICAgIDwvbm90PgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49Imd0IiBjb3VudD0iMCI+CisgICAgICAgICAgICA8emlwZmlsZXNldCBzcmM9InRlc3QzLnppcCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgICAgPHJlc291cmNlY291bnQgd2hlbj0ibmUiIGNvdW50PSIxIj4KKyAgICAgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICAgICAgPGV4aXN0cyB4bWxucz0iYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMiIC8+CisgICAgICAgICAgICAgIDx6aXBlbnRyeSB6aXBmaWxlPSJ0ZXN0My56aXAiIG5hbWU9ImVtcHR5Mi8iIC8+CisgICAgICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9vcj4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBCdWd6aWxsYSBSZXBvcnQgNDAyNTggLS0+CisgIDx0YXJnZXQgbmFtZT0iemlwRW1wdHlEaXJGaWxlc09ubHkiPgorICAgIDxta2RpciBkaXI9ImVtcHR5L2VtcHR5MiIgLz4KKyAgICA8emlwIGRlc3RmaWxlPSJ0ZXN0My56aXAiIGJhc2VkaXI9ImVtcHR5IiB1cGRhdGU9InRydWUiIGZpbGVzb25seT0idHJ1ZSIgLz4KKyAgICA8ZmFpbCBtZXNzYWdlPSJhcmNoaXZlIHNob3VsZCBnZXQgc2tpcHBlZCI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9InRlc3QzLnppcCIgLz4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ6aXBFbXB0eUNyZWF0ZSI+CisgICAgPG1rZGlyIGRpcj0iZW1wdHkiLz4KKyAgICA8emlwIGRlc3RmaWxlPSJ0ZXN0My56aXAiIGJhc2VkaXI9ImVtcHR5IiB3aGVuZW1wdHk9ImNyZWF0ZSIgaW5jbHVkZXM9IioueHl6Ii8+CisgICAgPGZhaWwgbWVzc2FnZT0iZW1wdHkgYXJjaGl2ZSBzaG91bGQgYmUgY3JlYXRlZCI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8b3I+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJ0ZXN0My56aXAiIC8+CisgICAgICAgICAgPC9ub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZ3QiIGNvdW50PSIwIj4KKyAgICAgICAgICAgIDx6aXBmaWxlc2V0IHNyYz0idGVzdDMuemlwIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9vcj4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q29tcHJlc3Npb25MZXZlbCIgZGVwZW5kcz0idGVzdDYiPgorICAgIDxsZW5ndGggcHJvcGVydHk9InRlc3Q2Lmxlbmd0aCIgZmlsZT0idGVzdDYuemlwIiAvPgorICAgIDx6aXAgZGVzdEZpbGU9InRlc3RMZXZlbC56aXAiIGJhc2VkaXI9Ii4iIGxldmVsPSI5Ij4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IioueG1sIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0iemlwLioiIC8+CisgICAgPC96aXA+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxpc2ZpbGVzZWxlY3RlZCBmaWxlPSJ0ZXN0TGV2ZWwuemlwIj4KKyAgICAgICAgICAgIDxzaXplIHdoZW49Imxlc3MiIHZhbHVlPSIke3Rlc3Q2Lmxlbmd0aH0iIC8+CisgICAgICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gQnVnemlsbGEgUmVwb3J0IDMzNDEyIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3REZWZhdWx0RXhjbHVkZXNBbmRVcGRhdGUiPgorICAgIDxta2RpciBkaXI9InppcHRlc3QiLz4KKyAgICA8dG91Y2ggZmlsZT0iemlwdGVzdC96aXB0ZXN0fiIvPgorICAgIDx6aXAgZGVzdGZpbGU9InRlc3QzLnppcCIgYmFzZWRpcj0iemlwdGVzdCIgZGVmYXVsdGV4Y2x1ZGVzPSJmYWxzZSIvPgorICAgIDx0b3VjaCBmaWxlPSJ6aXB0ZXN0L3ppcHRlc3QyIi8+CisgICAgPHppcCBkZXN0ZmlsZT0idGVzdDMuemlwIiBiYXNlZGlyPSJ6aXB0ZXN0IgorICAgICAgZGVmYXVsdGV4Y2x1ZGVzPSJmYWxzZSIKKyAgICAgIHVwZGF0ZT0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlUmVzb3VyY2UiPgorICAgIDx6aXAgZGVzdGZpbGU9InRlc3QzLnppcCI+CisgICAgICA8ZmlsZSBmaWxlPSJ6aXAueG1sIi8+CisgICAgPC96aXA+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vbkZpbGVSZXNvdXJjZSI+CisgICAgPHppcCBkZXN0ZmlsZT0idGVzdDMuemlwIj4KKyAgICAgIDxqYXZhcmVzb3VyY2UgbmFtZT0iTUVUQS1JTkYvTUFOSUZFU1QuTUYiLz4KKyAgICA8L3ppcD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VGFyRmlsZVNldCI+CisgICAgPGFudCBhbnRmaWxlPSJ0YXIueG1sIiB0YXJnZXQ9ImZlYXRoZXIiLz4KKyAgICA8emlwIGRlc3RmaWxlPSJ0ZXN0My56aXAiPgorICAgICAgPHRhcmZpbGVzZXQgc3JjPSJhc2YtbG9nby5naWYudGFyIiBmaWxlbW9kZT0iNDQ2Ii8+CisgICAgPC96aXA+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0TGV2ZWwuemlwIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0My56aXAiLz4KKyAgICA8ZGVsZXRlIGZpbGU9InRlc3Q0LnppcCIvPgorICAgIDxkZWxldGUgZmlsZT0idGVzdDUuemlwIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0Ni56aXAiLz4KKyAgICA8ZGVsZXRlIGZpbGU9ImlubmVyNy56aXAiLz4KKyAgICA8ZGVsZXRlIGZpbGU9InRlc3Q3LnppcCIvPgorICAgIDxkZWxldGUgZmlsZT0idGVzdDguemlwIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJhc2YtbG9nby5naWYuemlwIi8+CisgICAgPGRlbGV0ZSBmaWxlPSJ6aXBncm91cGZpbGVzZXQuemlwIi8+CisgICAgPGRlbGV0ZSBmaWxlPSIuLi9kdW1teWZpbGUiIC8+CisgICAgPGRlbGV0ZSBkaXI9InppcHRlc3QiLz4KKyAgICA8ZGVsZXRlIGRpcj0iZW1wdHkiLz4KKyAgICA8YW50IGFudGZpbGU9InRhci54bWwiIHRhcmdldD0iY2xlYW51cCIvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC90ZXN0LmV4ZSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC90ZXN0LmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzcyZGZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvemlwL3Rlc3QuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC96aXBncm91cGZpbGVzZXQxLnppcCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC96aXBncm91cGZpbGVzZXQxLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I5NmZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvemlwL3ppcGdyb3VwZmlsZXNldDEuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC96aXBncm91cGZpbGVzZXQyLnppcCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC96aXBncm91cGZpbGVzZXQyLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUwOWZkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvemlwL3ppcGdyb3VwZmlsZXNldDIuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC96aXBncm91cGZpbGVzZXQzLnppcCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC96aXBncm91cGZpbGVzZXQzLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFkOWMxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvemlwL3ppcGdyb3VwZmlsZXNldDMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rlc3RrZXlzdG9yZSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3Rlc3RrZXlzdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQyMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdGVzdGtleXN0b3JlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2FkZHR5cGUueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvYWRkdHlwZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4ZmYyNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2FkZHR5cGUueG1sCkBAIC0wLDAgKzEsMTYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3QiIGJhc2VkaXI9Ii4iPgorCisgIDx0YXJnZXQgbmFtZT0iYWRkcGF0aCI+CisgICAgPHR5cGVkZWYgbmFtZT0ibXlwYXRoIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiLz4KKyAgICA8cGF0aD4KKyAgICAgIDxteXBhdGggcGF0aD0iYnVpbGQueG1sIi8+CisgICAgPC9wYXRoPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImFkZGNvbmRpdGlvbiI+CisgICAgPHR5cGVkZWYgbmFtZT0ibXljb25kaXRpb24iCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uRXF1YWxzIi8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXljb25kaXRpb24uc2V0Ij4KKyAgICAgIDxteWNvbmRpdGlvbiBhcmcxPSJzdHJpbmciIGFyZzI9InN0cmluZyIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxmYWlsIHVubGVzcz0ibXljb25kaXRpb24uc2V0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYWRkZmlsdGVyIj4KKyAgICA8dHlwZWRlZiBuYW1lPSJoZWFkZmlsdGVyMiIKKyAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuSGVhZEZpbHRlciIvPgorICAgIDxjb25jYXQ+VGhpcyBpcyBsaW5lIDEKKyAgICAgIFRoaXMgaXMgbGluZSAyCisgICAgICBUaGlzIGlzIGxpbmUgMworICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8aGVhZGZpbHRlcjIgbGluZXM9IjIiLz4KKyAgICAgIDwvZmlsdGVyY2hhaW4+CisgICAgPC9jb25jYXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYWRkc2VsZWN0b3IiPgorICAgIDx0eXBlZGVmCisgICAgICBuYW1lPSJteXNlbGVjdG9yIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQ29udGFpbnNTZWxlY3RvciIvPgorICAgIDxmaWxlc2V0IGlkPSJteXNlbGVjdG9yLnRlc3QiIGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IioiPgorICAgICAgPG15c2VsZWN0b3IgdGV4dD0ibXlzZWxlY3RvciIvPgorICAgIDwvZmlsZXNldD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8cHJvcGVydHkgbmFtZT0ibmVzdGVkLnBhY2thZ2UiIHZhbHVlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4iLz4KKyAgICA8cGF0aCBpZD0idGVzdC1jbGFzc2VzIj4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgorICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KKyAgICA8L3BhdGg+CisgICAgPHR5cGVkZWYgbG9hZGVycmVmPSJuZXN0ZWQubG9hZGVyIiBjbGFzc3BhdGhyZWY9InRlc3QtY2xhc3NlcyIKKyAgICAgICAgICAgICBuYW1lID0gIm5lc3RlZC5hIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0iJHtuZXN0ZWQucGFja2FnZX1BZGRUeXBlVGVzdCRBSW1wbCIvPgorICAgIDx0eXBlZGVmIGxvYWRlcnJlZj0ibmVzdGVkLmxvYWRlciIKKyAgICAgICAgICAgICBuYW1lID0gIm5lc3RlZC5iIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0iJHtuZXN0ZWQucGFja2FnZX1BZGRUeXBlVGVzdCRCSW1wbCIvPgorICAgIDx0eXBlZGVmIGxvYWRlcnJlZj0ibmVzdGVkLmxvYWRlciIKKyAgICAgICAgICAgICBuYW1lID0gIm5lc3RlZC5jIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0iJHtuZXN0ZWQucGFja2FnZX1BZGRUeXBlVGVzdCRDSW1wbCIvPgorICAgIDx0eXBlZGVmIGxvYWRlcnJlZj0ibmVzdGVkLmxvYWRlciIKKyAgICAgICAgICAgICBuYW1lID0gIm5lc3RlZC5hYiIKKyAgICAgICAgICAgICBjbGFzc25hbWU9IiR7bmVzdGVkLnBhY2thZ2V9QWRkVHlwZVRlc3QkQUJJbXBsIi8+CisgICAgPHRhc2tkZWYgbG9hZGVycmVmPSJuZXN0ZWQubG9hZGVyIgorICAgICAgICAgICAgIG5hbWUgPSAibmVzdGVkLmNvbnRhaW5lciIgCisgICAgICAgICAgICAgY2xhc3NuYW1lPSIke25lc3RlZC5wYWNrYWdlfUFkZFR5cGVUZXN0JE5lc3RlZENvbnRhaW5lciIvPgorICAgIDx0YXNrZGVmIGxvYWRlcnJlZj0ibmVzdGVkLmxvYWRlciIKKyAgICAgICAgICAgICBuYW1lID0gIm5lc3RlZC5jb25kaXRpb24udGFzayIgCisgICAgICAgICAgICAgY2xhc3NuYW1lPSIke25lc3RlZC5wYWNrYWdlfUFkZFR5cGVUZXN0JE15Q29uZGl0aW9uIi8+CisgICAgPHR5cGVkZWYgbG9hZGVycmVmPSJuZXN0ZWQubG9hZGVyIgorICAgICAgICAgICAgIG5hbWUgPSAibmVzdGVkLmNvbmRpdGlvbi50eXBlIiAKKyAgICAgICAgICAgICBjbGFzc25hbWU9IiR7bmVzdGVkLnBhY2thZ2V9QWRkVHlwZVRlc3QkTXlDb25kaXRpb24iLz4KKyAgICA8dHlwZWRlZiBsb2FkZXJyZWY9Im5lc3RlZC5sb2FkZXIiCisgICAgICAgICAgICAgbmFtZSA9ICJteWFkZGNvbmZpZ3VyZWQiIAorICAgICAgICAgICAgIGNsYXNzbmFtZT0iJHtuZXN0ZWQucGFja2FnZX1BZGRUeXBlVGVzdCRNeUFkZENvbmZpZ3VyZWQiLz4KKyAgICA8dHlwZWRlZiBsb2FkZXJyZWY9Im5lc3RlZC5sb2FkZXIiCisgICAgICAgICAgICAgbmFtZSA9ICJteWFkZGNvbmZpZ3VyZWR2YWx1ZSIgCisgICAgICAgICAgICAgY2xhc3NuYW1lPSIke25lc3RlZC5wYWNrYWdlfUFkZFR5cGVUZXN0JE15QWRkQ29uZmlndXJlZFZhbHVlIi8+CisgICAgPHR5cGVkZWYgbG9hZGVycmVmPSJuZXN0ZWQubG9hZGVyIgorICAgICAgICAgICAgIG5hbWUgPSAibXl2YWx1ZSIgCisgICAgICAgICAgICAgY2xhc3NuYW1lPSIke25lc3RlZC5wYWNrYWdlfUFkZFR5cGVUZXN0JE15VmFsdWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJuZXN0ZWQuYSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPG5lc3RlZC5jb250YWluZXI+CisgICAgICA8bmVzdGVkLmEvPgorICAgIDwvbmVzdGVkLmNvbnRhaW5lcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJuZXN0ZWQuYiIgZGVwZW5kcz0iaW5pdCI+CisgICAgPG5lc3RlZC5jb250YWluZXI+CisgICAgICA8bmVzdGVkLmIvPgorICAgIDwvbmVzdGVkLmNvbnRhaW5lcj4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9Im5lc3RlZC5jIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8bmVzdGVkLmNvbnRhaW5lcj4KKyAgICAgIDxuZXN0ZWQuYy8+CisgICAgPC9uZXN0ZWQuY29udGFpbmVyPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5lc3RlZC5hYiIgZGVwZW5kcz0iaW5pdCI+CisgICAgPG5lc3RlZC5jb250YWluZXI+CisgICAgICA8bmVzdGVkLmFiLz4KKyAgICA8L25lc3RlZC5jb250YWluZXI+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gdGVzdHMgZm9yIHRhc2sgYWRhcHRvciAtLT4KKyAgPHRhcmdldCBuYW1lPSJjb25kaXRpb24udHlwZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGVjaG8+YmVmb3JlPC9lY2hvPgorICAgIDxuZXN0ZWQuY29uZGl0aW9uLnR5cGUvPgorICAgIDxlY2hvPmFmdGVyPC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbmRpdGlvbi50YXNrIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZWNobz5iZWZvcmU8L2VjaG8+CisgICAgPG5lc3RlZC5jb25kaXRpb24udGFzay8+CisgICAgPGVjaG8+YWZ0ZXI8L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29uZGl0aW9uLmNvbmRpdGlvbi50eXBlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb25kaXRpb24uY29uZGl0aW9uLnR5cGUiPgorICAgICAgPG5lc3RlZC5jb25kaXRpb24udHlwZS8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29uZGl0aW9uLmNvbmRpdGlvbi50YXNrIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb25kaXRpb24uY29uZGl0aW9uLnRhc2siPgorICAgICAgPG5lc3RlZC5jb25kaXRpb24udGFzay8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXlhZGRjb25maWd1cmVkIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8bXlhZGRjb25maWd1cmVkPgorICAgICAgPG15dmFsdWU+VmFsdWUgU2V0PC9teXZhbHVlPgorICAgIDwvbXlhZGRjb25maWd1cmVkPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im15YWRkY29uZmlndXJlZHZhbHVlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8bXlhZGRjb25maWd1cmVkdmFsdWU+CisgICAgICA8dmFsdWU+VmFsdWUgU2V0PC92YWx1ZT4KKyAgICA8L215YWRkY29uZmlndXJlZHZhbHVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5hbWVzcGFjZXRlc3QiIHhtbG5zOnByZWZpeD0idXJpIj4KKyAgICA8dHlwZWRlZiBuYW1lPSJlcSIgdXJpPSJ1cmkiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uRXF1YWxzIi8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0icCI+CisgICAgICA8cHJlZml4OmVxIGFyZzE9ImEiIGFyZzI9ImIiLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hc3NlcnRpb25zLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Fzc2VydGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyODcyMTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hc3NlcnRpb25zLnhtbApAQCAtMCwwICsxLDIwMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImFzc2VydGlvbnMiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImluaXQiPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSJhc3NlcnRpb25zL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiBsb2NhdGlvbj0iYXNzZXJ0aW9ucyIvPgorICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0iQXNzZXJ0aW9uTWFpbiIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdC5jbGFzc25hbWUiIHZhbHVlPSJBc3NlcnRpb25UZXN0Ii8+CisgIAorICA8cGF0aCBpZD0iYXNzZXJ0LmNsYXNzcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmRpcn0iLz4KKyAgPC9wYXRoPgorICAKKyAgPHRhcmdldCBuYW1lPSJzZXR1cCIgPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iCisgICAgICBpbmNsdWRlcz0iKi5qYXZhIgorICAgICAgc291cmNlPSIxLjQiCisgICAgICBkZWJ1Zz0idHJ1ZSIKKyAgICAgIGRlc3RkaXI9IiR7YnVpbGQuZGlyfSIKKyAgICAgIC8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyZG93biIgPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBpZiBwZXItY2xhc3MgYXNzZXJ0aW9ucyB3b3JrLCB0aGlzIHJ1biBhc3NlcnRzIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QtY2xhc3NuYW1lIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGphdmEgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICBjbGFzc25hbWU9IiR7Y2xhc3NuYW1lfSIKKyAgICAgIGNsYXNzcGF0aHJlZj0iYXNzZXJ0LmNsYXNzcGF0aCI+CisgICAgICA8YXNzZXJ0aW9ucyBlbmFibGVzeXN0ZW1hc3NlcnRpb25zPSJ0cnVlIj4KKyAgICAgICAgPGVuYWJsZSBjbGFzcz0iJHtjbGFzc25hbWV9IiAvPgorICAgICAgPC9hc3NlcnRpb25zPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0tIGlmIHBhY2thZ2Ugd29ya3MsIHRoaXMgcnVuIGFzc2VydHMgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdC1wYWNrYWdlIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGphdmEgZm9yaz0idHJ1ZSIgIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgY2xhc3NuYW1lPSIke2NsYXNzbmFtZX0iCisgICAgICBjbGFzc3BhdGhyZWY9ImFzc2VydC5jbGFzc3BhdGgiPgorICAgICAgPGFzc2VydGlvbnMgZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucz0iZmFsc2UiID4KKyAgICAgICAgPGVuYWJsZSBwYWNrYWdlPSIuLi4iIC8+CisgICAgICA8L2Fzc2VydGlvbnM+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8IS0tIHRoaXMgdGVzdCBzaG91bGQgcnVuIHRoZSBhcHAgc3VjY2Vzc2Z1bGx5IC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QtZW1wdHktYXNzZXJ0aW9ucyIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxqYXZhIGZvcms9InRydWUiICBmYWlsb25lcnJvcj0idHJ1ZSIKKyAgICAgIGNsYXNzbmFtZT0iJHtjbGFzc25hbWV9IgorICAgICAgY2xhc3NwYXRocmVmPSJhc3NlcnQuY2xhc3NwYXRoIj4KKyAgICAgIDxhc3NlcnRpb25zLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PiAgCisKKyAgPCEtLSB0aGlzIHRlc3Qgc2hvdWxkIHJ1biB0aGUgYXBwIHN1Y2Nlc3NmdWxseSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWRpc2FibGUiIGRlcGVuZHM9InNldHVwIj4KKyAgICA8amF2YSBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSIKKyAgICAgIGNsYXNzbmFtZT0iJHtjbGFzc25hbWV9IgorICAgICAgY2xhc3NwYXRocmVmPSJhc3NlcnQuY2xhc3NwYXRoIj4KKyAgICAgIDxhc3NlcnRpb25zIGVuYWJsZVN5c3RlbUFzc2VydGlvbnM9ImZhbHNlIiA+CisgICAgICAgIDxlbmFibGUgcGFja2FnZT0iLi4uIiAvPgorICAgICAgICA8ZGlzYWJsZSBjbGFzcz0iJHtjbGFzc25hbWV9IiAvPgorICAgICAgPC9hc3NlcnRpb25zPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+ICAKKworICA8IS0tIHJlcGVhdGVkIHNldHRpZ25zIHJlc3VsdCBpbiB0aGUgbGFzdCBkZWNsYXJhdGlvbiB3aW5uaW5nCisgICAgZXhjZXB0IHRoYXQgdGhlIHJ1bGUgJ2NsYXNzZXMgd2luIG92ZXIgcGFja2FnZXMgdGFrZXMgcHJpb3JpdHkKKyAgICB0aGlzIHJ1biB3aWxsIGFzc2VydCAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LW92ZXJyaWRlIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGphdmEgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICBjbGFzc25hbWU9IiR7Y2xhc3NuYW1lfSIKKyAgICAgIGNsYXNzcGF0aHJlZj0iYXNzZXJ0LmNsYXNzcGF0aCI+CisgICAgICA8YXNzZXJ0aW9ucyBlbmFibGVTeXN0ZW1Bc3NlcnRpb25zPSJmYWxzZSIgPgorICAgICAgICA8ZW5hYmxlIHBhY2thZ2U9Ii4uLiIgLz4KKyAgICAgICAgPGRpc2FibGUgY2xhc3M9IiR7Y2xhc3NuYW1lfSIgLz4KKyAgICAgICAgPGVuYWJsZSBjbGFzcz0iJHtjbGFzc25hbWV9IiAvPgorICAgICAgICA8ZGlzYWJsZSBwYWNrYWdlPSIuLi4iIC8+CisgICAgICA8L2Fzc2VydGlvbnM+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4gIAorCisgIDwhLS0gcmVwZWF0ZWQgc2V0dGlnbnMgcmVzdWx0IGluIHRoZSBsYXN0IGRlY2xhcmF0aW9uIHdpbm5pbmc7CisgICAgdGhpcyBydW4gd2lsbCBub3QgYXNzZXJ0IC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3Qtb3ZlcnJpZGUyIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGphdmEgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICBjbGFzc25hbWU9IiR7Y2xhc3NuYW1lfSIKKyAgICAgIGNsYXNzcGF0aHJlZj0iYXNzZXJ0LmNsYXNzcGF0aCI+CisgICAgICA8YXNzZXJ0aW9ucyBlbmFibGVTeXN0ZW1Bc3NlcnRpb25zPSJmYWxzZSIgPgorICAgICAgICA8ZW5hYmxlIHBhY2thZ2U9Ii4uLiIgLz4KKyAgICAgICAgPGVuYWJsZSBjbGFzcz0iJHtjbGFzc25hbWV9IiAvPgorICAgICAgICA8ZGlzYWJsZSBjbGFzcz0iJHtjbGFzc25hbWV9IiAvPgorICAgICAgPC9hc3NlcnRpb25zPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+ICAKKyAgCisgIDwhLS0gaWYgcmVmZXJlbmNlcyB3b3JrLCB0aGlzIHJ1biBhc3NlcnRzIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QtcmVmZXJlbmNlcyI+CisgIDxhc3NlcnRpb25zIGlkPSJwcm9qZWN0LmFzc2VydGlvbnMiID4KKyAgICA8ZW5hYmxlIHBhY2thZ2U9Im9yZy5hcGFjaGUudGVzdCIgLz4KKyAgICA8ZGlzYWJsZSBwYWNrYWdlPSJvcmcuYXBhY2hlLmxvZzRqIi8+CisgICAgPGVuYWJsZSBwYWNrYWdlPSIuLi4iLz4KKyAgPC9hc3NlcnRpb25zPiAgCisgICAgPGphdmEgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICBjbGFzc25hbWU9IiR7Y2xhc3NuYW1lfSIKKyAgICAgIGNsYXNzcGF0aHJlZj0iYXNzZXJ0LmNsYXNzcGF0aCI+CisgICAgICA8YXNzZXJ0aW9ucyByZWZpZD0icHJvamVjdC5hc3NlcnRpb25zIi8+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKyAgCisgIDwhLS0gd2hlbiBmb3JrPWZhbHNlOyB3ZSBuZWVkIHRvIHJlamVjdCB0aGUgY29uc3RydWN0IC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3Qtbm9mb3JrIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGphdmEgZm9yaz0iZmFsc2UiIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgY2xhc3NuYW1lPSIke2NsYXNzbmFtZX0iCisgICAgICBjbGFzc3BhdGhyZWY9ImFzc2VydC5jbGFzc3BhdGgiPgorICAgICAgPGFzc2VydGlvbnMgZW5hYmxlc3lzdGVtYXNzZXJ0aW9ucz0idHJ1ZSI+CisgICAgICAgIDxlbmFibGUgY2xhc3M9IiR7Y2xhc3NuYW1lfSIgLz4KKyAgICAgIDwvYXNzZXJ0aW9ucz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PiAgCisKKyAgPCEtLSB0aGlzIHRocm93cyBhIGJ1aWxkIGVycm9yIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QtbXVsdGlwbGUtYXNzZXJ0aW9ucyIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxqYXZhIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgY2xhc3NuYW1lPSIke2NsYXNzbmFtZX0iCisgICAgICBjbGFzc3BhdGhyZWY9ImFzc2VydC5jbGFzc3BhdGgiPgorICAgICAgPGFzc2VydGlvbnMgZW5hYmxlc3lzdGVtYXNzZXJ0aW9ucz0idHJ1ZSI+CisgICAgICAgIDxlbmFibGUgY2xhc3M9IiR7Y2xhc3NuYW1lfSIgLz4KKyAgICAgIDwvYXNzZXJ0aW9ucz4KKyAgICAgIDxhc3NlcnRpb25zLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PiAgCisgIAorICA8IS0tIHNob3VsZCB0aHJvdyBhIGJ1aWxkIGV4Y2VwdGlvbiAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXJlZmVyZW5jZS1hYnVzZSIgZGVwZW5kcz0ic2V0dXAiPgorICA8YXNzZXJ0aW9ucyBpZD0icHJvamVjdC5hc3NlcnRpb25zMiIgPgorICAgIDxlbmFibGUgcGFja2FnZT0ib3JnLmFwYWNoZS50ZXN0IiAvPgorICAgIDxkaXNhYmxlIHBhY2thZ2U9Im9yZy5hcGFjaGUubG9nNGoiLz4KKyAgICA8ZW5hYmxlIHBhY2thZ2U9Ii4uLiIvPgorICA8L2Fzc2VydGlvbnM+ICAKKyAgICA8amF2YSBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSIKKyAgICAgIGNsYXNzbmFtZT0iJHtjbGFzc25hbWV9IgorICAgICAgY2xhc3NwYXRocmVmPSJhc3NlcnQuY2xhc3NwYXRoIj4KKyAgICAgIDxhc3NlcnRpb25zIHJlZmlkPSJwcm9qZWN0LmFzc2VydGlvbnMyIj4KKyAgICAgICAgPGRpc2FibGUgY2xhc3M9IiR7Y2xhc3NuYW1lfSIgLz4KKyAgICAgIDwvYXNzZXJ0aW9ucz4gICAgICAKKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PiAgICAKKyAgCisgICAgCisgIDx0YXJnZXQgbmFtZT0idGVzdC1qdW5pdCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxqdW5pdCBmb3JrPSJ0cnVlIiAKKyAgICAgIGhhbHRvbmVycm9yPSJ0cnVlIiBoYWx0b25mYWlsdXJlPSJ0cnVlIgorICAgICAgPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGggcmVmaWQ9ImFzc2VydC5jbGFzc3BhdGgiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgICAgIHVzZWZpbGU9ImZhbHNlIi8+CisgICAgICA8YXNzZXJ0aW9ucyA+CisgICAgICAgIDxlbmFibGUgY2xhc3M9IiR7dGVzdC5jbGFzc25hbWV9IiAvPgorICAgICAgPC9hc3NlcnRpb25zPiAKKyAgICAgIDx0ZXN0IG5hbWU9IiR7dGVzdC5jbGFzc25hbWV9Ii8+CisgICAgPC9qdW5pdD4KKyAgPC90YXJnZXQ+CisgICAgCisgIDwhLS0gVGhpcyBpcyBoZXJlIHRvIHNob3cgdGhhdCBzZXR0aW5nIGl0IGFzIGEgcHJvcGVydHkgd29ya3MKKyAgc28gdGhlcmUgaXMgc29tZSBkZWZlY3QgaW4gcGFzcy1vbiBvZiBhc3NlcnRpb25zIHRoYXQKKyAgaXMgY2F1c2luZyB0aGUgcHJvYmxlbSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWp1bml0LW1hbnVhbC1zZXR1cCIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxqdW5pdCBmb3JrPSJ0cnVlIiAKKyAgICAgIGhhbHRvbmVycm9yPSJ0cnVlIiBoYWx0b25mYWlsdXJlPSJ0cnVlIgorICAgICAgPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGggcmVmaWQ9ImFzc2VydC5jbGFzc3BhdGgiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgICAgIHVzZWZpbGU9ImZhbHNlIi8+CisgICAgICA8dGVzdCBuYW1lPSIke3Rlc3QuY2xhc3NuYW1lfSIvPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhOkFzc2VydGlvblRlc3QiLz4KKyAgICA8L2p1bml0PgorICA8L3RhcmdldD4gIAorICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Fzc2VydGlvbnMvQXNzZXJ0aW9uTWFpbi5qYXZhIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvYXNzZXJ0aW9ucy9Bc3NlcnRpb25NYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhYTY5MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Fzc2VydGlvbnMvQXNzZXJ0aW9uTWFpbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qIAorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqLworIAorCisvKioKKyAqIHRoaXMgaXMgYW4gYXNzZXJ0aW9uIHRlc3RlcgorICogSXQgaGFzIGEgbWFpbigpIGVudHJ5CisgKi8KK3B1YmxpYyBjbGFzcyBBc3NlcnRpb25NYWluIHsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJCWFzc2VydCB0cnVlID09IGZhbHNlIDogInRoZXJlIGV4aXN0IG5vIGZhY3RzIHRoYXQgYXJlIGJvdGggdHJ1ZSBhbmQgZmFsc2UiOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFzc2VydGlvbnMgYXJlIGRpc2FibGVkIik7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvYXNzZXJ0aW9ucy9Bc3NlcnRpb25UZXN0LmphdmEgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hc3NlcnRpb25zL0Fzc2VydGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWVkMmRmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvYXNzZXJ0aW9ucy9Bc3NlcnRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyogCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIAorICovCisgCisgaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiB0aGlzIGlzIGFuIGFzc2VydGlvbiB0ZXN0ZXIgZm9yIGp1bml0IAorICovCitwdWJsaWMgY2xhc3MgQXNzZXJ0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAKKwlwdWJsaWMgQXNzZXJ0aW9uVGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFzc2VydFJhaXNlZCgpIHsKKwkJdHJ5IHsKKwkJCWFzc2VydCB0cnVlID09IGZhbHNlOworCQkJZmFpbCgiZXhwZWN0ZWQgYW4gYXNzZXJ0aW9uIik7CisJCX0gY2F0Y2goQXNzZXJ0aW9uRXJyb3IgYXNzZXJ0bykgeworCQkJLy9pZiB3ZSBnb3QgaGVyZSwgYWxsIHdhcyB3ZWxsCisJCX0KKwl9CisJCisJCisJcHVibGljIHZvaWQgdGVzdEFzc2VydE5vdFJhaXNlZCgpIHsKKwkJYXNzZXJ0KDIrMj09NCk7CisJfQorCQorICAgIAorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzY3JpcHRpb24xLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhMmExNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KKyAgPGRlc2NyaXB0aW9uPlRlc3QgUHJvamVjdCBEZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+CisgIDx0YXJnZXQgbmFtZT0ibWFpbiI+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzY3JpcHRpb24yLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1YmMyMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMi54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KKyAgPGRlc2NyaXB0aW9uPk11bHRpIExpbmUKK1Byb2plY3QgRGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgorICA8dGFyZ2V0IG5hbWU9Im1haW4iPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMy54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNWRkYTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjMueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+CisgIDxkZXNjcmlwdGlvbj5NdWx0aSBJbnN0YW5jZSA8L2Rlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+UHJvamVjdCBEZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+CisgIDx0YXJnZXQgbmFtZT0ibWFpbiI+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzY3JpcHRpb240LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uNC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkZjljMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uNC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KKyAgPGRlc2NyaXB0aW9uPk11bHRpIEluc3RhbmNlIDwvZGVzY3JpcHRpb24+CisgIDx0YXJnZXQgbmFtZT0ibWFpbiI+CisgICAgICA8ZGVzY3JpcHRpb24+TmVzdGVkIFByb2plY3QgRGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbGVsaXN0LnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbGVsaXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODU0ZGRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsZWxpc3QueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0idGVzdCI+CisgIDx0YXJnZXQgbmFtZT0ic2ltcGxlIj4KKyAgICA8ZmlsZWxpc3QgaWQ9ImZpbGVsaXN0IgorICAgICAgICAgICAgICBkaXI9IiR7YmFzZWRpcn0iCisgICAgICAgICAgICAgIGZpbGVzPSJhIi8+CisgICAgPHBhdGhjb252ZXJ0IHRhcmdldG9zPSJ1bml4IiByZWZpZD0iZmlsZWxpc3QiCisgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJwcm9wZXJ0eSI+CisgICAgICA8bWFwIGZyb209IiR7YmFzZWRpcn0iIHRvPSIvYWJjIi8+CisgICAgPC9wYXRoY29udmVydD4KKyAgICA8ZWNobz4ke3Byb3BlcnR5fTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkb3VibGUiPgorICAgIDxmaWxlbGlzdCBpZD0iZmlsZWxpc3QiCisgICAgICAgICAgICAgIGRpcj0iJHtiYXNlZGlyfSIKKyAgICAgICAgICAgICAgZmlsZXM9ImEgYiIvPgorICAgIDxwYXRoY29udmVydCB0YXJnZXRvcz0idW5peCIgcmVmaWQ9ImZpbGVsaXN0IgorICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0icHJvcGVydHkiPgorICAgICAgPG1hcCBmcm9tPSIke2Jhc2VkaXJ9IiB0bz0iL2FiYyIvPgorICAgIDwvcGF0aGNvbnZlcnQ+CisgICAgPGVjaG8+JHtwcm9wZXJ0eX08L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibmVzdGVkIj4KKyAgICA8ZmlsZWxpc3QgaWQ9ImZpbGVsaXN0IgorICAgICAgICAgICAgICBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgPGZpbGUgbmFtZT0iYSIvPgorICAgICAgPGZpbGUgbmFtZT0iYiIvPgorICAgIDwvZmlsZWxpc3Q+CisgICAgPHBhdGhjb252ZXJ0IHRhcmdldG9zPSJ1bml4IiByZWZpZD0iZmlsZWxpc3QiCisgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJwcm9wZXJ0eSI+CisgICAgICA8bWFwIGZyb209IiR7YmFzZWRpcn0iIHRvPSIvYWJjIi8+CisgICAgPC9wYXRoY29udmVydD4KKyAgICA8ZWNobz4ke3Byb3BlcnR5fTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNldC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjkxZTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXQueG1sCkBAIC0wLDAgKzEsMTQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9Im5ldyIgYmFzZWRpcj0iLiI+CisgIDxmaWx0ZXJzZXQgaWQ9InRlc3RzZXQub25lIj4KKyAgICA8ZmlsdGVyIHRva2VuPSJhYWFhIiB2YWx1ZT0iMTExMSIvPgorICAgIDxmaWx0ZXIgdG9rZW49ImJiYmIiIHZhbHVlPSIyMjIyIi8+CisgIDwvZmlsdGVyc2V0PgorICAKKyAgPGZpbHRlcnNldCBpZD0idGVzdHNldC50d28iIGJlZ2luVG9rZW49IiUiIGVuZFRva2VuPSJeIj4KKyAgICA8ZmlsdGVyIHRva2VuPSJjY2NjIiB2YWx1ZT0iMzMzMyIvPgorICAgIDxmaWx0ZXIgdG9rZW49ImRkZGQiIHZhbHVlPSI0NDQ0Ii8+CisgIDwvZmlsdGVyc2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0MSI+CisgICAgPGRlbGV0ZSBmaWxlPSJkZXN0MS50eHQiLz4KKyAgICA8Y29weSBmaWxlPSJmaWx0ZXJzZXRhLnR4dCIgdG9maWxlPSJkZXN0MS50eHQiPgorICAgICAgICA8ZmlsdGVyc2V0IHJlZmlkPSJ0ZXN0c2V0Lm9uZSIvPiAKKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPgorICAgIDxkZWxldGUgZmlsZT0iZGVzdDIudHh0Ii8+CisgICAgPGNvcHkgZmlsZT0iZmlsdGVyc2V0Yi50eHQiIHRvZmlsZT0iZGVzdDIudHh0Ij4KKyAgICAgICAgPGZpbHRlcnNldCByZWZpZD0idGVzdHNldC50d28iLz4gCisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4KKyAgICA8ZGVsZXRlIGZpbGU9ImRlc3QzLnR4dCIvPgorICAgIDxjb3B5IGZpbGU9ImZpbHRlcnNldGMudHh0IiB0b2ZpbGU9ImRlc3QzLnR4dCI+CisgICAgICAgIDxmaWx0ZXJzZXQgcmVmaWQ9InRlc3RzZXQub25lIi8+IAorICAgICAgICA8ZmlsdGVyc2V0IHJlZmlkPSJ0ZXN0c2V0LnR3byIvPiAKKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LW5lc3RlZC1maWx0ZXJzZXRzIj4KKyAgICA8ZmlsdGVyc2V0IGlkPSIxIj4KKyAgICAgIDxmaWx0ZXIgdG9rZW49InRva2VuMSIgdmFsdWU9InZhbHVlMSIvPgorICAgIDwvZmlsdGVyc2V0PgorICAgIDxmaWx0ZXJzZXQgaWQ9IjIiPgorICAgICAgPGZpbHRlcnNldCByZWZpZD0idGVzdHNldC5vbmUiLz4KKyAgICA8L2ZpbHRlcnNldD4KKyAgICA8ZmlsdGVyc2V0IGlkPSIzIj4KKyAgICAgIDxmaWx0ZXJzZXQgaWQ9IjQiPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJ0b2tlbjQiIHZhbHVlPSJ2YWx1ZTQiLz4KKyAgICAgIDwvZmlsdGVyc2V0PgorICAgIDwvZmlsdGVyc2V0PgorICAgIDxmaWx0ZXJzZXQgaWQ9IjUiPgorICAgICAgPGZpbHRlcnNldCByZWZpZD0iMSIvPgorICAgIDwvZmlsdGVyc2V0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXJzRmlsZUVsZW1lbnQiPgorICAgIDxjb3B5IGZpbGU9ImZpbHRlcnNldGQudHh0IiB0b2ZpbGU9ImRlc3Q0LnR4dCI+CisgICAgICA8ZmlsdGVyc2V0PgorICAgICAgICA8ZmlsdGVyc2ZpbGUgZmlsZT0iZmlsdGVyc2ZpbGUxIiAvPgorICAgICAgPC9maWx0ZXJzZXQ+CisgICAgPC9jb3B5PgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXNUZXh0PSJ0cnVlIj4KKyAgICAgICAgICAgIDxmaWxlIGZpbGU9ImRlc3Q0LnR4dCIgLz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9IkZPTyBCQVIgQGJhekAgQGJsYWhAIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXJzRmlsZUF0dHJpYnV0ZSI+CisgICAgPGNvcHkgZmlsZT0iZmlsdGVyc2V0ZC50eHQiIHRvZmlsZT0iZGVzdDUudHh0Ij4KKyAgICAgIDxmaWx0ZXJzZXQgZmlsdGVyc2ZpbGU9ImZpbHRlcnNmaWxlMSIgLz4KKyAgICA8L2NvcHk+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZXNtYXRjaCBhc1RleHQ9InRydWUiPgorICAgICAgICAgICAgPGZpbGUgZmlsZT0iZGVzdDUudHh0IiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iRk9PIEJBUiBAYmF6QCBAYmxhaEAiIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE11bHRpcGxlRmlsdGVyc0ZpbGVzIj4KKyAgICA8Y29weSBmaWxlPSJmaWx0ZXJzZXRkLnR4dCIgdG9maWxlPSJkZXN0Ni50eHQiPgorICAgICAgPGZpbHRlcnNldCBmaWx0ZXJzZmlsZT0iZmlsdGVyc2ZpbGUxIj4KKyAgICAgICAgPGZpbHRlcnNmaWxlIGZpbGU9ImZpbHRlcnNmaWxlMiIgLz4KKyAgICAgIDwvZmlsdGVyc2V0PgorICAgIDwvY29weT4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlc21hdGNoIGFzVGV4dD0idHJ1ZSI+CisgICAgICAgICAgICA8ZmlsZSBmaWxlPSJkZXN0Ni50eHQiIC8+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJGT08gQkFSIEJBWiBAYmxhaEAiIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE1pc3NpbmdGaWx0ZXJzRmlsZSI+CisgICAgPGNvcHkgZmlsZT0iZmlsdGVyc2V0ZC50eHQiIHRvZmlsZT0iZGVzdDcudHh0Ij4KKyAgICAgIDxmaWx0ZXJzZXQgZmlsdGVyc2ZpbGU9Im5vbmV4aXN0ZW50ZmlsdGVyc2ZpbGUiIC8+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RBbGxvd01pc3NpbmdGaWx0ZXJzRmlsZSI+CisgICAgPGNvcHkgZmlsZT0iZmlsdGVyc2V0ZC50eHQiIHRvZmlsZT0iZGVzdDgudHh0Ij4KKyAgICAgIDxmaWx0ZXJzZXQgZmlsdGVyc2ZpbGU9Im5vbmV4aXN0ZW50ZmlsdGVyc2ZpbGUiCisgICAgICAgICAgICAgICAgIG9ubWlzc2luZ2ZpbHRlcnNmaWxlPSJpZ25vcmUiIC8+CisgICAgPC9jb3B5PgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZmlsZXNtYXRjaCBmaWxlMT0iZmlsdGVyc2V0ZC50eHQiIGZpbGUyPSJkZXN0OC50eHQiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgorICAgIDxkZWxldGUgcXVpZXQ9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iZGVzdD8udHh0IiAvPgorICAgIDwvZGVsZXRlPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2V0YS50eHQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDA0OTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2V0YS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIGlzIGEgdGVzdCBmaWxlIGZvciBmaWx0ZXJzIEBhYWFhQAorSXQgaGFzIHR3byBsaW5lcyBAYmJiYkAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNldGIudHh0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2V0Yi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5NjQwYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNldGIudHh0CkBAIC0wLDAgKzEsNSBAQAorVGhpcyBpcyBhIHRlc3QgZmlsZSBmb3IgZmlsdGVycyB3aXRoIG5vbiBkZWZhdWx0IG1hcmtlcnMKK0BjY2NjQCAtIHNob3VsZCBub3QgY2hhbmdlCislY2NjY14gLSBzaG91bGQgY2hhbmdlCiteZGRkZCUgLSBzaG91bGQgbm90IGNoYW5nZQorJWRkZGReIC0gc2hvdWxkIGNoYW5nZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2V0Yy50eHQgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXRjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTIyZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2V0Yy50eHQKQEAgLTAsMCArMSw3IEBACitDb21iaW5lZCBmaWx0ZXIgdGVzdAorQGFhYWFAIC0gc2hvdWxkIGNoYW5nZQorQGJiYmJAIC0gc2hvdWxkIGNoYW5nZQorQGNjY2NAIC0gc2hvdWxkIG5vdCBjaGFuZ2UKKyVjY2NjXiAtIHNob3VsZCBjaGFuZ2UKK15kZGRkJSAtIHNob3VsZCBub3QgY2hhbmdlCislZGRkZF4gLSBzaG91bGQgY2hhbmdlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXRkLnR4dCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNldGQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzQ4NDkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXRkLnR4dApAQCAtMCwwICsxIEBACitAZm9vQCBAYmFyQCBAYmF6QCBAYmxhaEAKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNmaWxlMSBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNmaWxlMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGZlMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2ZpbGUxCkBAIC0wLDAgKzEsMiBAQAorZm9vPUZPTworYmFyPUJBUgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2ZpbGUyIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2ZpbGUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzk3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZmlsZTIKQEAgLTAsMCArMSBAQAorYmF6PUJBWgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmxleGludGVnZXIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmxleGludGVnZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMTBhYTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9mbGV4aW50ZWdlci54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIj4KKworICA8cGF0aCBpZD0idGVzdGNsYXNzZXMiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgIDwvcGF0aD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QiPgorICAgIDx0YXNrZGVmIG5hbWU9ImZsZXhpbnQiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GbGV4SW50ZWdlclRlc3QiCisgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0Y2xhc3NlcyIKKyAgICAvPgorICAgICAgICAgICAgCisgICAgPGZsZXhpbnQgcHJvcG5hbWU9ImZsZXhpbnQudmFsdWUxIiB2YWx1ZT0iMHhBIi8+CisgICAgPGZsZXhpbnQgcHJvcG5hbWU9ImZsZXhpbnQudmFsdWUyIiB2YWx1ZT0iMDEwIi8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9nb2xkL2ZpbHRlcnNldDEudHh0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzU0MTZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQxLnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgaXMgYSB0ZXN0IGZpbGUgZm9yIGZpbHRlcnMgMTExMQorSXQgaGFzIHR3byBsaW5lcyAyMjIyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9nb2xkL2ZpbHRlcnNldDIudHh0IGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWFiMDIxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQyLnR4dApAQCAtMCwwICsxLDUgQEAKK1RoaXMgaXMgYSB0ZXN0IGZpbGUgZm9yIGZpbHRlcnMgd2l0aCBub24gZGVmYXVsdCBtYXJrZXJzCitAY2NjY0AgLSBzaG91bGQgbm90IGNoYW5nZQorMzMzMyAtIHNob3VsZCBjaGFuZ2UKK15kZGRkJSAtIHNob3VsZCBub3QgY2hhbmdlCis0NDQ0IC0gc2hvdWxkIGNoYW5nZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQzLnR4dCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2dvbGQvZmlsdGVyc2V0My50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNmU2MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2dvbGQvZmlsdGVyc2V0My50eHQKQEAgLTAsMCArMSw3IEBACitDb21iaW5lZCBmaWx0ZXIgdGVzdAorMTExMSAtIHNob3VsZCBjaGFuZ2UKKzIyMjIgLSBzaG91bGQgY2hhbmdlCitAY2NjY0AgLSBzaG91bGQgbm90IGNoYW5nZQorMzMzMyAtIHNob3VsZCBjaGFuZ2UKK15kZGRkJSAtIHNob3VsZCBub3QgY2hhbmdlCis0NDQ0IC0gc2hvdWxkIGNoYW5nZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4NDJkOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlci54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImNvcHktdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgorICAgIDxta2RpciBkaXI9ImNvcHl0ZXN0IiAvPgorICAgIDxjb3B5IHRvZGlyPSJjb3B5dGVzdCI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uLy4uL21haW4iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi90YXNrZGVmcy8qLmphdmEiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uLy4uL3Rlc3RzL2p1bml0Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovdGFza2RlZnMvKi5qYXZhIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIiAvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVsZXRlIGRpcj0iY29weXRlc3QiIC8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL2RlZmluZS5tYXBwZXJyZXN1bHQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVycy9kZWZpbmUubWFwcGVycmVzdWx0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTE1MmExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVycy9kZWZpbmUubWFwcGVycmVzdWx0LnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0PgorICA8dHlwZWRlZiBuYW1lPSJtYXBwZXJyZXN1bHQiCisgICAgICAgICAgIGNsYXNzcGF0aD0iLi4vLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm1hcHBlcnMuTWFwcGVyUmVzdWx0Ii8+CisKKyAgPCEtLSB0aGlzIGlzIHdoYXQgeW91IGdldCB3aXRoIG5vIHJlc3VsdCAtLT4gICAgICAgICAgIAorICA8cHJvcGVydHkgbmFtZT0ibm8tcmVzdWx0cyIgdmFsdWU9IiZsdDtOVUxMJmd0OyIgLz4gICAgICAgICAgIAorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVycy9nbG9ibWFwcGVyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvZ2xvYm1hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2NmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvZ2xvYm1hcHBlci54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgPGltcG9ydCBmaWxlPSJkZWZpbmUubWFwcGVycmVzdWx0LnhtbCIvPgorCisgIDx0YXJnZXQgbmFtZT0iaGFuZGxlLmRpcnNlcCI+CisgICAgPG1hcHBlcnJlc3VsdCBpbnB1dD0iZFxlL2Yvai5qYXZhIiBvdXRwdXQ9ImYvai5qYXZhIj4KKyAgICAgIDxnbG9ibWFwcGVyIGZyb209ImQvZVwqIiB0bz0iKiIgaGFuZGxlZGlyc2VwPSJ5ZXMiLz4KKyAgICA8L21hcHBlcnJlc3VsdD4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9Imlnbm9yZS5jYXNlIj4KKyAgICA8bWFwcGVycmVzdWx0IGlucHV0PSJBYmNEZWYuSmFWYSIgb3V0cHV0PSJiY0RlZi5qYXZhLmJhayI+CisgICAgICA8Z2xvYm1hcHBlciBmcm9tPSJhKi5qYXZhIiB0bz0iKi5qYXZhLmJhayIgY2FzZXNlbnNpdGl2ZT0ibm8iLz4KKyAgICA8L21hcHBlcnJlc3VsdD4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL3JlZ2V4cG1hcHBlci54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL3JlZ2V4cG1hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1YzQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvcmVnZXhwbWFwcGVyLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0PgorICA8aW1wb3J0IGZpbGU9ImRlZmluZS5tYXBwZXJyZXN1bHQueG1sIi8+CisKKyAgPHRhcmdldCBuYW1lPSJpZ25vcmUuY2FzZSI+CisgICAgPG1hcHBlcnJlc3VsdCBpbnB1dD0iQWJjRGVmLmphdkEiIG91dHB1dD0iYmNEZWYuamF2YS5iYWsiPgorICAgICAgPHJlZ2V4cG1hcHBlciBmcm9tPSJhKC4qKS5KYVZhIiB0bz0iXDEuamF2YS5iYWsiIGNhc2VzZW5zaXRpdmU9Im5vIi8+CisgICAgPC9tYXBwZXJyZXN1bHQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaGFuZGxlLmRpcnNlcCI+CisgICAgPG1hcHBlcnJlc3VsdCBpbnB1dD0iZFxlL2Zcai5qYXZhIiBvdXRwdXQ9ImYvai5qYXZhIj4KKyAgICAgIDxyZWdleHBtYXBwZXIgZnJvbT0iZC9lLyguKikiIHRvPSJcMSIgaGFuZGxlZGlyc2VwPSJ5ZXMiLz4KKyAgICA8L21hcHBlcnJlc3VsdD4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL3NjcmlwdG1hcHBlci54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL3NjcmlwdG1hcHBlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlN2E4ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvc2NyaXB0bWFwcGVyLnhtbApAQCAtMCwwICsxLDU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InNjcmlwdG1hcHBlciI+CisgIDxpbXBvcnQgZmlsZT0iZGVmaW5lLm1hcHBlcnJlc3VsdC54bWwiLz4KKworICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U2V0U2luZ2xlIj4KKyAgICA8bWFwcGVycmVzdWx0IGlucHV0PSIiIG91dHB1dD0iYSI+CisgICAgICA8c2NyaXB0bWFwcGVyIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgICAgc2VsZi5hZGRNYXBwZWROYW1lKCJhIik7CisgICAgICA8L3NjcmlwdG1hcHBlcj4KKyAgICA8L21hcHBlcnJlc3VsdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q2xlYXIiPgorICAgIDxtYXBwZXJyZXN1bHQgaW5wdXQ9IiIgb3V0cHV0PSIke25vLXJlc3VsdHN9Ij4KKyAgICAgIDxzY3JpcHRtYXBwZXIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgICBzZWxmLmFkZE1hcHBlZE5hbWUoImEiKTsKKyAgICAgICAgc2VsZi5jbGVhcigpOworICAgICAgPC9zY3JpcHRtYXBwZXI+CisgICAgPC9tYXBwZXJyZXN1bHQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFNldE11bHRpcGxlIj4KKyAgICA8bWFwcGVycmVzdWx0IGlucHV0PSIiIG91dHB1dD0iYXxiIj4KKyAgICAgIDxzY3JpcHRtYXBwZXIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgICBzZWxmLmFkZE1hcHBlZE5hbWUoImEiKTsKKyAgICAgICAgc2VsZi5hZGRNYXBwZWROYW1lKCJiIik7CisgICAgICA8L3NjcmlwdG1hcHBlcj4KKyAgICA8L21hcHBlcnJlc3VsdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UGFzc3Rocm91Z2giPgorICAgIDxtYXBwZXJyZXN1bHQgaW5wdXQ9ImEiIG91dHB1dD0iQXxhIj4KKyAgICAgIDxzY3JpcHRtYXBwZXIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgICAvL3JlbHlpbmcgb24gImEiIHRvIG1hcCB0byAiQSIgb24gYWxsIGxvY2FsZXMuCisgICAgICAgIHNlbGYuYWRkTWFwcGVkTmFtZShzb3VyY2UudG9VcHBlckNhc2UoKSk7CisgICAgICAgIHNlbGYuYWRkTWFwcGVkTmFtZShzb3VyY2UudG9Mb3dlckNhc2UoKSk7CisgICAgICA8L3NjcmlwdG1hcHBlcj4KKyAgICA8L21hcHBlcnJlc3VsdD4KKyAgPC90YXJnZXQ+CisgIAorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcG9seS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9wb2x5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJmOWVjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcG9seS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBiYXNlZGlyPSIuIj4KKyAgCisgIDxwcm9wZXJ0eSBuYW1lPSJjIiB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUG9seVRlc3QiLz4KKyAgCisgIDxwYXRoIGlkPSJ0ZXN0LWMiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgIDwvcGF0aD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgIDx0eXBlZGVmIGxvYWRlcnJlZj0icG9seSIgICBjbGFzc3BhdGhyZWY9InRlc3QtYyIKKyAgICAgICAgICAgICBuYW1lID0gIm15ZmlsZXNldCIgY2xhc3NuYW1lPSIke2N9JE15RmlsZVNldCIvPgorCisgICAgPHR5cGVkZWYgbG9hZGVycmVmPSJwb2x5IiBjbGFzc3BhdGhyZWY9InRlc3QtYyIKKyAgICAgICAgICAgICBuYW1lID0gIm15cGF0aCIgIGNsYXNzbmFtZT0iJHtjfSRNeVBhdGgiLz4KKworICAgIDx0eXBlZGVmIGxvYWRlcnJlZj0icG9seSIgY2xhc3NwYXRocmVmPSJ0ZXN0LWMiCisgICAgICAgICAgICAgbmFtZSA9ICJteXRhc2siICBjbGFzc25hbWU9IiR7Y30kTXlUYXNrIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZmlsZXNldCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPG15dGFzaz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIvPgorICAgIDwvbXl0YXNrPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImZpbGVzZXQtYW50LXR5cGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxteXRhc2s+CisgICAgICA8ZmlsZXNldCBhbnQtdHlwZT0ibXlmaWxlc2V0IiBkaXI9Ii4iLz4KKyAgICA8L215dGFzaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwYXRoIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8bXl0YXNrPgorICAgICAgPHBhdGggcGF0aD0iLiIvPgorICAgIDwvbXl0YXNrPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InBhdGgtYW50LXR5cGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxteXRhc2s+CisgICAgICA8cGF0aCBhbnQtdHlwZT0ibXlwYXRoIiBwYXRoPSIuIi8+CisgICAgPC9teXRhc2s+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9wcm9wZXJ0eXNldC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9wcm9wZXJ0eXNldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1YmE5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3Byb3BlcnR5c2V0LnhtbApAQCAtMCwwICsxLDk2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAqICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCistLT4KKworPHByb2plY3Q+CisgIDxwcm9wZXJ0eSBuYW1lPSJmb29BIiB2YWx1ZT0iRm9vQSIvPgorICA8cHJvcGVydHkgbmFtZT0iYmFyQiIgdmFsdWU9IkJhckIiLz4KKworICA8cHJvcGVydHlzZXQgaWQ9InByb3BlcnRpZXMtc3RhcnRpbmctd2l0aC1mb28iPgorICAgIDxwcm9wZXJ0eXJlZiBwcmVmaXg9ImZvbyIvPgorICA8L3Byb3BlcnR5c2V0PgorICA8cHJvcGVydHlzZXQgaWQ9InByb3BlcnRpZXMtc3RhcnRpbmctd2l0aC1iYXIiPgorICAgIDxwcm9wZXJ0eXJlZiBwcmVmaXg9ImJhciIvPgorICA8L3Byb3BlcnR5c2V0PgorICA8cHJvcGVydHlzZXQgaWQ9Im15LXNldCI+CisgICAgPHByb3BlcnR5c2V0IHJlZmlkPSJwcm9wZXJ0aWVzLXN0YXJ0aW5nLXdpdGgtZm9vIi8+CisgICAgPHByb3BlcnR5c2V0IHJlZmlkPSJwcm9wZXJ0aWVzLXN0YXJ0aW5nLXdpdGgtYmFyIi8+CisgIDwvcHJvcGVydHlzZXQ+CisgIAorICA8bWFjcm9kZWYgbmFtZT0iZXhwZWN0LmVxdWFscyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXN0Ii8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHAiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImdvdCIvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGZhaWwgbWVzc2FnZT0KKyAgICAgICAgICAiQHt0ZXN0fSBmYWlsZWQ6IGV4cGVjdGVkICZxdW90O0B7ZXhwfSZxdW90OyBnb3QgJnF1b3Q7QHtnb3R9JnF1b3Q7Ij4KKyAgICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgICA8bm90PgorICAgICAgICAgICAgPGVxdWFscyBhcmcxPSJAe2V4cH0iIGFyZzI9IkB7Z290fSIvPgorICAgICAgICAgIDwvbm90PgorICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIDwvZmFpbD4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHRhcmdldCBuYW1lPSJyZWZlcmVuY2UtdG8tdHdvLXJlZmVyZW5jZXMiPgorICAgIDxleHBlY3QuZXF1YWxzCisgICAgICB0ZXN0PSJyZWZlcmVuY2UgdG8gdHdvIHJlZmVyZW5jZXMiCisgICAgICBleHA9ImJhckI9QmFyQiwgZm9vQT1Gb29BIgorICAgICAgZ290PSIke3RvU3RyaW5nOm15LXNldH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJuZXN0ZWQtbWFwcGVkIj4KKyAgICA8cHJvcGVydHlzZXQgaWQ9Im5lc3RlZC1tYXBwZWQiPgorICAgICAgPHByb3BlcnR5c2V0PgorICAgICAgICA8cHJvcGVydHlzZXQgcmVmaWQ9InByb3BlcnRpZXMtc3RhcnRpbmctd2l0aC1mb28iLz4KKyAgICAgICAgPGdsb2JtYXBwZXIgZnJvbT0iZm9vKiIgdG89ImJvbyoiIC8+CisgICAgICA8L3Byb3BlcnR5c2V0PgorICAgICAgPHByb3BlcnR5c2V0PgorICAgICAgICA8cHJvcGVydHlzZXQgcmVmaWQ9InByb3BlcnRpZXMtc3RhcnRpbmctd2l0aC1iYXIiLz4KKyAgICAgICAgPGdsb2JtYXBwZXIgZnJvbT0iYmFyKiIgdG89ImZhcioiIC8+CisgICAgICA8L3Byb3BlcnR5c2V0PgorICAgIDwvcHJvcGVydHlzZXQ+CisgICAgPGV4cGVjdC5lcXVhbHMKKyAgICAgIHRlc3Q9Im5lc3RlZCBtYXBwZWQgcHJvcGVydHlzZXRzIgorICAgICAgZXhwPSJib29BPUZvb0EsIGZhckI9QmFyQiIKKyAgICAgIGdvdD0iJHt0b1N0cmluZzpuZXN0ZWQtbWFwcGVkfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5lc3RlZC1tYXBwZWQtbWFwcGVkIj4KKyAgICA8cHJvcGVydHlzZXQgaWQ9Im5lc3RlZC1tYXBwZWQtbWFwcGVkIj4KKyAgICAgIDxwcm9wZXJ0eXNldD4KKyAgICAgICAgPHByb3BlcnR5c2V0IHJlZmlkPSJwcm9wZXJ0aWVzLXN0YXJ0aW5nLXdpdGgtZm9vIi8+CisgICAgICAgIDxnbG9ibWFwcGVyIGZyb209ImZvbyoiIHRvPSJib28qIiAvPgorICAgICAgPC9wcm9wZXJ0eXNldD4KKyAgICAgIDxwcm9wZXJ0eXNldD4KKyAgICAgICAgPHByb3BlcnR5c2V0IHJlZmlkPSJwcm9wZXJ0aWVzLXN0YXJ0aW5nLXdpdGgtYmFyIi8+CisgICAgICAgIDxnbG9ibWFwcGVyIGZyb209ImJhcioiIHRvPSJmYXIqIiAvPgorICAgICAgPC9wcm9wZXJ0eXNldD4KKyAgICAgIDxtYXBwZXI+CisgICAgICAgIDxnbG9ibWFwcGVyIGZyb209ImJvbyoiIHRvPSJob28qIiAvPgorICAgICAgICA8Z2xvYm1hcHBlciBmcm9tPSJmYXIqIiB0bz0ibmVhcioiIC8+CisgICAgICA8L21hcHBlcj4KKyAgICA8L3Byb3BlcnR5c2V0PgorICAgIDxleHBlY3QuZXF1YWxzCisgICAgICB0ZXN0PSJuZXN0ZWQgbWFwcGVkIHByb3BlcnR5c2V0cyIKKyAgICAgIGV4cD0iaG9vQT1Gb29BLCBuZWFyQj1CYXJCIgorICAgICAgZ290PSIke3RvU3RyaW5nOm5lc3RlZC1tYXBwZWQtbWFwcGVkfSIvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcXVvdGUxLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3F1b3RlMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3NzEyMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3F1b3RlMS54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyAgPCEtLSBJIGJlbG9uZyB0bzoKKyAgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5YTUxDYXRhbG9nQnVpbGRGaWxlVGVzdC5qYXZhIAorICAgICAgIC0tPgorCis8cGFyYT4KKyAgQSBzdGl0Y2ggaW4gdGltZSBzYXZlcyBuaW5lCis8L3BhcmE+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9xdW90ZTIueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcXVvdGUyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjlhM2MzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcXVvdGUyLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworICA8IS0tIEkgYmVsb25nIHRvOgorICAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2dCdWlsZEZpbGVUZXN0LmphdmEgCisgICAgICAgLS0+CisKKzxwYXJhPgorICBObyBuZXdzIGlzIGdvb2QgbmV3cworPC9wYXJhPgorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZWRpcmVjdG9yLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3JlZGlyZWN0b3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ3ODRlOWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZWRpcmVjdG9yLnhtbApAQCAtMCwwICsxLDc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InJlZGlyZWN0b3IiIGJhc2VkaXI9Ii4iPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiIGRlc2NyaXB0aW9uPSJjcmVhdGUgcmVmIj4KKyAgICA8cmVkaXJlY3RvciBpZD0idGVzdDEiIG91dHB1dD0ib3V0IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyIiBkZXBlbmRzPSJ0ZXN0MSIgZGVzY3JpcHRpb249ImZhaWwiPgorICAgIDxyZWRpcmVjdG9yIHJlZmlkPSJ0ZXN0MSIgb3V0cHV0PSJvdXQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiIGRlcGVuZHM9InRlc3QxIiBkZXNjcmlwdGlvbj0iZmFpbCI+CisgICAgPHJlZGlyZWN0b3IgcmVmaWQ9InRlc3QxIj4KKyAgICAgIDxvdXRwdXRtYXBwZXIgdHlwZT0iZmxhdHRlbiIgLz4KKyAgICA8L3JlZGlyZWN0b3I+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDQiIGRlcGVuZHM9InRlc3QxIiBkZXNjcmlwdGlvbj0icGFzcyI+CisgICAgPHJlZGlyZWN0b3I+CisgICAgICA8b3V0cHV0bWFwcGVyIHR5cGU9ImZsYXR0ZW4iIC8+CisgICAgPC9yZWRpcmVjdG9yPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RMb2dJbnB1dFN0cmluZyIgZGVwZW5kcz0iY2F0LWNoZWNrIiBpZj0iY2FuLWNhdCI+CisgICAgPGVjaG8+CisgICAgICAgIHRlc3RMb2dJbnB1dFN0cmluZyBjYW4tY2F0CisgICAgPC9lY2hvPgorICAgIDxleGVjIGV4ZWN1dGFibGU9ImNhdCI+CisgICAgICA8cmVkaXJlY3RvciBpbnB1dHN0cmluZz0iZm9vIiBsb2dpbnB1dHN0cmluZz0iZmFsc2UiIC8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZWZpZCIgZGVwZW5kcz0iY2F0LWNoZWNrIiBpZj0iY2FuLWNhdCI+CisgICAgPGZhaWwgbWVzc2FnZT0iUHJvcGVydHkgdGVzdFJlZmlkLm91dCBpcyBhbHJlYWR5IHNldCEiPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ0ZXN0UmVmaWQub3V0IiAvPgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICAgIDxyZWRpcmVjdG9yIGlkPSJyIiBvdXRwdXRwcm9wZXJ0eT0idGVzdFJlZmlkLm91dCIgaW5wdXRzdHJpbmc9ImZvbyIgLz4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSJjYXQiPgorICAgICAgPHJlZGlyZWN0b3IgcmVmaWQ9InIiIC8+CisgICAgPC9leGVjPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7dGVzdFJlZmlkLm91dH0iIGFyZzI9ImZvbyIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2F0LWNoZWNrIj4KKyAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjYW4tY2F0Ij4KKyAgICAgIDxvcj4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJjYXQiIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIgcHJvcGVydHk9ImNhbi1jYXQiIC8+CisgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iY2F0LmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiBwcm9wZXJ0eT0iY2FuLWNhdCIgLz4KKyAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJjYXQuZXhlIiBmaWxlcGF0aD0iJHtlbnYuUGF0aH0iIHByb3BlcnR5PSJjYW4tY2F0IiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9idWlsZC54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEzYjIwYmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvYnVpbGQueG1sCkBAIC0wLDAgKzEsMzQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9InNvcnQiCisgICAgICAgICB4bWxuczpyY21wPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzIj4KKworICA8cHJvcGVydHkgbmFtZT0iZGlybmFtZSIgdmFsdWU9IndvcmsiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXIiIGxvY2F0aW9uPSIke2Rpcm5hbWV9IiAvPgorICA8cHJvcGVydHkgbmFtZT0iZWNob2xldmVsIiB2YWx1ZT0iZGVidWciIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7ZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7emlwfSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7amFyfSIgZGVsZXRlb25leGl0PSJ0cnVlIiAvPgorICAgIDxkZWxldGUgZmlsZT0iJHtmaWxlfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzb3J0c2V0dXAiIHVubGVzcz0ic29ydHNldHVwLmRvbmUiPgorICAgIDxta2RpciBkaXI9IiR7ZGlyfSIgLz4KKworICAgIDxlY2hvIGZpbGU9IiR7ZGlyfS9iIiBtZXNzYWdlPSJ5eXkiIC8+CisgICAgPGVjaG8gZmlsZT0iJHtkaXJ9L2UiIG1lc3NhZ2U9ImFhYSIgLz4KKyAgICA8c2xlZXAgc2Vjb25kcz0iMiIgLz4KKyAgICA8ZWNobyBmaWxlPSIke2Rpcn0vYyIgbWVzc2FnZT0ieCIgLz4KKyAgICA8ZWNobyBmaWxlPSIke2Rpcn0vZCIgbWVzc2FnZT0ieCIgLz4KKyAgICA8c2xlZXAgc2Vjb25kcz0iMiIgLz4KKyAgICA8ZWNobyBmaWxlPSIke2Rpcn0vYSIgbWVzc2FnZT0ienoiIC8+CisgICAgPGVjaG8gZmlsZT0iJHtkaXJ9L2YiIG1lc3NhZ2U9Inp6IiAvPgorCisgICAgPG1rZGlyIGRpcj0iJHtkaXJ9L2EuZGlyIiAvPgorICAgIDxta2RpciBkaXI9IiR7ZGlyfS9iLmRpciIgLz4KKyAgICA8bWtkaXIgZGlyPSIke2Rpcn0vYy5kaXIiIC8+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0ibXlzb3J0Ij4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIC8+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcGFyYXRvciIgZGVmYXVsdD0iLCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImNtcCIgb3B0aW9uYWw9InRydWUiIGltcGxpY2l0PSJ0cnVlIiAvPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0iQHtwcm9wZXJ0eX0iIHBhdGhzZXA9IkB7c2VwYXJhdG9yfSI+CisgICAgICAgICAgPHNvcnQ+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlyfSIgaW5jbHVkZXM9ImEsYixjIiAvPgorICAgICAgICAgICAgPGNtcCAvPgorICAgICAgICAgIDwvc29ydD4KKyAgICAgICAgICA8ZmxhdHRlbm1hcHBlciAvPgorICAgICAgICA8L3BhdGhjb252ZXJ0PgorICAgICAgICA8ZWNobyBsZXZlbD0iJHtlY2hvbGV2ZWx9Ij5Ae3Byb3BlcnR5fT0ke0B7cHJvcGVydHl9fTwvZWNobz4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPHByb3BlcnR5IG5hbWU9InNvcnRzZXR1cC5kb25lIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0c29ydGRlZmF1bHQiIGRlcGVuZHM9InNvcnRzZXR1cCI+CisgICAgPG15c29ydCBwcm9wZXJ0eT0ic29ydGRmIiAvPgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7c29ydGRmfSIgYXJnMj0iYSxiLGMiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RydmRlZmF1bHQiIGRlcGVuZHM9InNvcnRzZXR1cCI+CisgICAgPG15c29ydCBwcm9wZXJ0eT0ic29ydGRmLXJldiI+CisgICAgICA8cmNtcDpyZXZlcnNlIC8+CisgICAgPC9teXNvcnQ+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtzb3J0ZGYtcmV2fSIgYXJnMj0iYyxiLGEiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RuYW1lIiBkZXBlbmRzPSJzb3J0c2V0dXAiPgorICAgIDxteXNvcnQgcHJvcGVydHk9InNvcnRubSI+CisgICAgICA8cmNtcDpuYW1lIC8+CisgICAgPC9teXNvcnQ+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtzb3J0bm19IiBhcmcyPSJhLGIsYyIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHJ2bmFtZSIgZGVwZW5kcz0ic29ydHNldHVwIj4KKyAgICA8bXlzb3J0IHByb3BlcnR5PSJzb3J0bm0tcmV2Ij4KKyAgICAgIDxyY21wOnJldmVyc2U+CisgICAgICAgIDxyY21wOm5hbWUgLz4KKyAgICAgIDwvcmNtcDpyZXZlcnNlPgorICAgIDwvbXlzb3J0PgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7c29ydG5tLXJldn0iIGFyZzI9ImMsYixhIiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZGF0ZSIgZGVwZW5kcz0ic29ydHNldHVwIj4KKyAgICA8bXlzb3J0IHByb3BlcnR5PSJzb3J0bG0iPgorICAgICAgPHJjbXA6ZGF0ZSAvPgorICAgIDwvbXlzb3J0PgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7c29ydGxtfSIgYXJnMj0iYixjLGEiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RydmRhdGUiIGRlcGVuZHM9InNvcnRzZXR1cCI+CisgICAgPG15c29ydCBwcm9wZXJ0eT0ic29ydGxtLXJldiI+CisgICAgICA8cmNtcDpyZXZlcnNlPgorICAgICAgICA8cmNtcDpkYXRlIC8+CisgICAgICA8L3JjbXA6cmV2ZXJzZT4KKyAgICA8L215c29ydD4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3NvcnRsbS1yZXZ9IiBhcmcyPSJhLGMsYiIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHNpemUiIGRlcGVuZHM9InNvcnRzZXR1cCI+CisgICAgPG15c29ydCBwcm9wZXJ0eT0ic29ydHN6Ij4KKyAgICAgIDxyY21wOnNpemUgLz4KKyAgICA8L215c29ydD4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3NvcnRzen0iIGFyZzI9ImMsYSxiIiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0cnZzaXplIiBkZXBlbmRzPSJzb3J0c2V0dXAiPgorICAgIDxteXNvcnQgcHJvcGVydHk9InNvcnRzei1yZXYiPgorICAgICAgPHJjbXA6cmV2ZXJzZT4KKyAgICAgICAgPHJjbXA6c2l6ZSAvPgorICAgICAgPC9yY21wOnJldmVyc2U+CisgICAgPC9teXNvcnQ+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtzb3J0c3otcmV2fSIgYXJnMj0iYixhLGMiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rjb250ZW50IiBkZXBlbmRzPSJzb3J0c2V0dXAiPgorICAgIDxteXNvcnQgcHJvcGVydHk9InNvcnRjdCI+CisgICAgICA8cmNtcDpjb250ZW50IC8+CisgICAgPC9teXNvcnQ+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtzb3J0Y3R9IiBhcmcyPSJjLGIsYSIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHJ2Y29udGVudCIgZGVwZW5kcz0ic29ydHNldHVwIj4KKyAgICA8bXlzb3J0IHByb3BlcnR5PSJzb3J0Y3QtcmV2Ij4KKyAgICAgIDxyY21wOnJldmVyc2U+CisgICAgICAgIDxyY21wOmNvbnRlbnQgLz4KKyAgICAgIDwvcmNtcDpyZXZlcnNlPgorICAgIDwvbXlzb3J0PgorICAgIDxmYWlsPgorICAgICAgPGNvbmRpdGlvbj4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7c29ydGN0LXJldn0iIGFyZzI9ImEsYixjIiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZXhpc3RzIiBkZXBlbmRzPSJzb3J0c2V0dXAiPgorICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0ic29ydGV4IiBwYXRoc2VwPSIsIj4KKyAgICAgIDxzb3J0PgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgIDxmaWxlIGZpbGU9IiR7ZGlyfS9hIiAvPgorICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJyZWRoZXJyaW5nIiBleGlzdHM9ImZhbHNlIiAvPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPHJjbXA6ZXhpc3RzIC8+CisgICAgICA8L3NvcnQ+CisgICAgICA8ZmxhdHRlbm1hcHBlciAvPgorICAgIDwvcGF0aGNvbnZlcnQ+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtzb3J0ZXh9IiBhcmcyPSJyZWRoZXJyaW5nLGEiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RydmV4aXN0cyIgZGVwZW5kcz0ic29ydHNldHVwIj4KKyAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9InNvcnRleC1yZXYiIHBhdGhzZXA9IiwiPgorICAgICAgPHNvcnQ+CisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgPGZpbGUgZmlsZT0iJHtkaXJ9L2EiIC8+CisgICAgICAgICAgPHJlc291cmNlIG5hbWU9InJlZGhlcnJpbmciIGV4aXN0cz0iZmFsc2UiIC8+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8cmNtcDpyZXZlcnNlPgorICAgICAgICAgIDxyY21wOmV4aXN0cyAvPgorICAgICAgICA8L3JjbXA6cmV2ZXJzZT4KKyAgICAgIDwvc29ydD4KKyAgICAgIDxmbGF0dGVubWFwcGVyIC8+CisgICAgPC9wYXRoY29udmVydD4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3NvcnRleC1yZXZ9IiBhcmcyPSJhLHJlZGhlcnJpbmciIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3R0eXBlIiBkZXBlbmRzPSJzb3J0c2V0dXAiPgorICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0ic29ydHRwIiBwYXRoc2VwPSIsIj4KKyAgICAgIDxzb3J0PgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgIDxmaWxlIGZpbGU9IiR7ZGlyfS9hIiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9IiR7ZGlyfS9hLmRpciIgLz4KKyAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgIDxyY21wOnR5cGUgLz4KKyAgICAgIDwvc29ydD4KKyAgICAgIDxmbGF0dGVubWFwcGVyIC8+CisgICAgPC9wYXRoY29udmVydD4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3NvcnR0cH0iIGFyZzI9ImEsYS5kaXIiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RydnR5cGUiIGRlcGVuZHM9InNvcnRzZXR1cCI+CisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJzb3J0dHAtcmV2IiBwYXRoc2VwPSIsIj4KKyAgICAgIDxzb3J0PgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgIDxmaWxlIGZpbGU9IiR7ZGlyfS9hIiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9IiR7ZGlyfS9hLmRpciIgLz4KKyAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgIDxyY21wOnJldmVyc2U+CisgICAgICAgICAgPHJjbXA6dHlwZSAvPgorICAgICAgICA8L3JjbXA6cmV2ZXJzZT4KKyAgICAgIDwvc29ydD4KKyAgICAgIDxmbGF0dGVubWFwcGVyIC8+CisgICAgPC9wYXRoY29udmVydD4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3NvcnR0cC1yZXZ9IiBhcmcyPSJhLmRpcixhIiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJmb3J3YXJkc29ydCIKKyAgICBkZXBlbmRzPSJ0ZXN0c29ydGRlZmF1bHQsdGVzdG5hbWUsdGVzdGRhdGUsdGVzdHNpemUsdGVzdGNvbnRlbnQsdGVzdGV4aXN0cyx0ZXN0dHlwZSIgLz4KKworICA8dGFyZ2V0IG5hbWU9InJldmVyc2Vzb3J0IgorICAgIGRlcGVuZHM9InRlc3RydmRlZmF1bHQsdGVzdHJ2bmFtZSx0ZXN0cnZkYXRlLHRlc3RydnNpemUsdGVzdHJ2Y29udGVudCx0ZXN0cnZleGlzdHMsdGVzdHJ2dHlwZSIgLz4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rjb21wb3VuZHNvcnQxIiBkZXBlbmRzPSJzb3J0c2V0dXAiPgorICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0ic29ydGNtcDEiIHBhdGhzZXA9IiwiPgorICAgICAgPHNvcnQ+CisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgPGZpbGUgZmlsZT0iJHtkaXJ9L2MiIC8+CisgICAgICAgICAgPGZpbGUgZmlsZT0iJHtkaXJ9L2IuZGlyIiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9IiR7ZGlyfS9hIiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9IiR7ZGlyfS9jLmRpciIgLz4KKyAgICAgICAgICA8ZmlsZSBmaWxlPSIke2Rpcn0vYiIgLz4KKyAgICAgICAgICA8ZmlsZSBmaWxlPSIke2Rpcn0vYS5kaXIiIC8+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8cmNtcDpyZXZlcnNlPgorICAgICAgICAgIDxyY21wOnR5cGUgLz4KKyAgICAgICAgPC9yY21wOnJldmVyc2U+CisgICAgICAgIDxyY21wOm5hbWUgLz4KKyAgICAgIDwvc29ydD4KKyAgICAgIDxmbGF0dGVubWFwcGVyIC8+CisgICAgPC9wYXRoY29udmVydD4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3NvcnRjbXAxfSIgYXJnMj0iYS5kaXIsYi5kaXIsYy5kaXIsYSxiLGMiIC8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rjb21wb3VuZHNvcnQyIiBkZXBlbmRzPSJzb3J0c2V0dXAiPgorICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0ic29ydGNtcDIiIHBhdGhzZXA9IiwiPgorICAgICAgPHNvcnQ+CisgICAgICAgIDxmaWxlcyBpbmNsdWRlcz0iJHtkaXJ9Lz8iIC8+CisgICAgICAgIDxyY21wOnNpemUgLz4KKyAgICAgICAgPHJjbXA6Y29udGVudCAvPgorICAgICAgICA8cmNtcDpyZXZlcnNlPgorICAgICAgICAgIDxyY21wOm5hbWUgLz4KKyAgICAgICAgPC9yY21wOnJldmVyc2U+CisgICAgICA8L3NvcnQ+CisgICAgICA8ZmxhdHRlbm1hcHBlciAvPgorICAgIDwvcGF0aGNvbnZlcnQ+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtzb3J0Y21wMn0iIGFyZzI9ImQsYyxmLGEsZSxiIiAvPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21wb3VuZHNvcnQiIGRlcGVuZHM9InRlc3Rjb21wb3VuZHNvcnQxLHRlc3Rjb21wb3VuZHNvcnQyIiAvPgorCisgIDx0YXJnZXQgbmFtZT0ic29ydCIgZGVwZW5kcz0iZm9yd2FyZHNvcnQscmV2ZXJzZXNvcnQsY29tcG91bmRzb3J0IiAvPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvamF2YXJlc291cmNlLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3Jlc291cmNlcy9qYXZhcmVzb3VyY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzMjY3NjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvamF2YXJlc291cmNlLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0PgorICA8dGFyZ2V0IG5hbWU9ImxvYWRNYW5pZmVzdCI+CisgICAgPGxvYWRyZXNvdXJjZSBwcm9wZXJ0eT0ibWFuaWZlc3QiPgorICAgICAgPGphdmFyZXNvdXJjZSBuYW1lPSJNRVRBLUlORi9NQU5JRkVTVC5NRiIvPgorICAgIDwvbG9hZHJlc291cmNlPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3Jlc291cmNlcy90YXJlbnRyeS54bWwgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvdGFyZW50cnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5OTAyZmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvdGFyZW50cnkueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0ibm90IG1lIj4KKyAgPHRhcmdldCBuYW1lPSJub3QgbWUiPgorICAgIDxmYWlsPm9ubHkgdXNlIGZyb20gd2l0aGluIHVuaXQgdGVzdHM8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0b3V0IiBsb2NhdGlvbj0idGVzdG91dCIvPgorICA8dGFyZ2V0IG5hbWU9InNldFVwIj4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3RvdXR9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idW5jb21wcmVzc1NvdXJjZSIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDxhbnQgYW50ZmlsZT0iLi4vLi4vdGFza2RlZnMvdGFyLnhtbCIgdGFyZ2V0PSJmZWF0aGVyIiAvPgorICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RvdXR9Ij4KKyAgICAgIDx0YXJlbnRyeSBuYW1lPSJhc2YtbG9nby5naWYiPgorICAgICAgICA8Z3ppcHJlc291cmNlPgorICAgICAgICAgIDxmaWxlIGZpbGU9Ii4uLy4uL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIuZ3oiLz4KKyAgICAgICAgPC9nemlwcmVzb3VyY2U+CisgICAgICA8L3RhcmVudHJ5PgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdG91dH0iLz4KKyAgICA8YW50IGFudGZpbGU9Ii4uLy4uL3Rhc2tkZWZzL3Rhci54bWwiIHRhcmdldD0iY2xlYW51cCIgLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvc2VsZWN0b3JzLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhN2Q4MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy54bWwKQEAgLTAsMCArMSwzNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJzZWxlY3RvcnMtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ic2V0dXBmaWxlcyI+CisKKyAgPHByb3BlcnR5IG5hbWU9ImV0Yy5kaXIiIHZhbHVlPSIuLiIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdC5kaXIiCisgICAgICAgICAgdmFsdWU9InNlbGVjdG9ydGVzdCIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdHJlZ2V4cHNyYy5kaXIiCisgICAgICAgICAgdmFsdWU9InJlZ2V4cHNlbHRlc3RzcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3RyZWdleHBkZXN0LmRpciIKKyAgICAgICAgICB2YWx1ZT0icmVnZXhwc2VsdGVzdGRlc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im1pcnJvci5kaXIiCisgICAgICAgICAgdmFsdWU9InNlbGVjdG9ydGVzdDIiLz4KKworICA8dGFyZ2V0IG5hbWU9InNldHVwZmlsZXMiPgorICAgIDxta2RpciBkaXI9IiR7dGVzdC5kaXJ9IiAvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdC5kaXJ9L3ppcCIgLz4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3QuZGlyfS90YXIiIC8+CisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0LmRpcn0vdGFyL2d6IiAvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdC5kaXJ9L3Rhci9iejIiIC8+CisgICAgPGNvcHkgZmlsZT0iJHtldGMuZGlyfS90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYubWQ1IgorICAgICAgICAgICAgdG9maWxlPSIke3Rlc3QuZGlyfS9hc2YtbG9nby5naWYubWQ1IiAvPgorICAgIDxjb3B5IGZpbGU9IiR7ZXRjLmRpcn0vdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLmJ6MiIKKyAgICAgICAgICAgIHRvZmlsZT0iJHt0ZXN0LmRpcn0vYXNmLWxvZ28uZ2lmLmJ6MiIgLz4KKyAgICA8Y29weSBmaWxlPSIke2V0Yy5kaXJ9L3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi5neiIKKyAgICAgICAgICAgIHRvZmlsZT0iJHt0ZXN0LmRpcn0vYXNmLWxvZ28uZ2lmLmd6IiAvPgorICAgIDxjb3B5IGZpbGU9IiR7ZXRjLmRpcn0vdGFza2RlZnMvZXhwZWN0ZWQvY29weS5maWx0ZXJzZXQuZmlsdGVyZWQiCisgICAgICAgICAgICB0b2ZpbGU9IiR7dGVzdC5kaXJ9L2NvcHkuZmlsdGVyc2V0LmZpbHRlcmVkIiAvPgorICAgIDxjb3B5IGZpbGU9IiR7ZXRjLmRpcn0vdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnppcCIKKyAgICAgICAgICAgIHRvZmlsZT0iJHt0ZXN0LmRpcn0vemlwL2FzZi1sb2dvLmdpZi56aXAiIC8+CisgICAgPGNvcHkgZmlsZT0iJHtldGMuZGlyfS90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYudGFyIgorICAgICAgICAgICAgdG9maWxlPSIke3Rlc3QuZGlyfS90YXIvYXNmLWxvZ28uZ2lmLnRhciIgLz4KKyAgICA8Y29weSBmaWxlPSIke2V0Yy5kaXJ9L3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLWh1Z2UudGFyLmd6IgorICAgICAgICAgICAgdG9maWxlPSIke3Rlc3QuZGlyfS90YXIvYXNmLWxvZ28taHVnZS50YXIuZ3oiIC8+CisgICAgPGNvcHkgZmlsZT0iJHtldGMuZGlyfS90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYudGFyLmd6IgorICAgICAgICAgICAgdG9maWxlPSIke3Rlc3QuZGlyfS90YXIvZ3ovYXNmLWxvZ28uZ2lmLnRhci5neiIgLz4KKyAgICA8Y29weSBmaWxlPSIke2V0Yy5kaXJ9L3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIuYnoyIgorICAgICAgICAgICAgdG9maWxlPSIke3Rlc3QuZGlyfS90YXIvYnoyL2FzZi1sb2dvLmdpZi50YXIuYnoyIiAvPgorICAgIDxjb3B5IGZpbGU9IiR7ZXRjLmRpcn0vdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28taHVnZS50YXIuYnoyIgorICAgICAgICAgICAgdG9maWxlPSIke3Rlc3QuZGlyfS90YXIvYnoyL2FzZi1sb2dvLWh1Z2UudGFyLmJ6MiIgLz4KKyAgICA8IS0tIE1ha2UgbGluZWZlZWRzIGNvbnNpc3RlbnQgYmV0d2VlbiBwbGF0Zm9ybXMgLS0+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke3Rlc3QuZGlyfSIgaW5jbHVkZXM9IiouZmlsdGVyZWQiIGVvbD0ibGYiLz4KKyAgICA8IS0tIFNldCBhIGtub3duIGJhc2UgdGltZSBmb3IgYWxsIGZpbGVzIC0tPgorICAgIDx0b3VjaCBkYXRldGltZT0iMTEvMjEvMjAwMSA0OjU1IEFNIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QuZGlyfSI+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qIi8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICA8L3RvdWNoPgorICAgIDwhLS0gVGhlbiBhZGp1c3QgaW5kaXZpZHVhbCBvbmVzIC0tPgorICAgIDx0b3VjaCBmaWxlPSIke3Rlc3QuZGlyfS9hc2YtbG9nby5naWYuYnoyIgorICAgICAgICAgICAgZGF0ZXRpbWU9IjAxLzAxLzIwMDEgMTI6MDAgQU0iLz4KKyAgICA8dG91Y2ggZmlsZT0iJHt0ZXN0LmRpcn0vYXNmLWxvZ28uZ2lmLmd6IgorICAgICAgICAgICAgZGF0ZXRpbWU9IjA0LzE1LzIwMDIgMjozMCBQTSIvPgorICAgIDx0b3VjaCBmaWxlPSIke3Rlc3QuZGlyfS96aXAvYXNmLWxvZ28uZ2lmLnppcCIKKyAgICAgICAgICAgIGRhdGV0aW1lPSIwNS8xMC8yMDAyIDI6MzAgUE0iLz4KKyAgICA8dG91Y2ggZmlsZT0iJHt0ZXN0LmRpcn0vdGFyL2FzZi1sb2dvLmdpZi50YXIiCisgICAgICAgICAgICBkYXRldGltZT0iMDUvMTAvMjAwMiAyOjI5IFBNIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7dGVzdC5kaXJ9L3Rhci9hc2YtbG9nby1odWdlLnRhci5neiIKKyAgICAgICAgICAgIGRhdGV0aW1lPSIwNS8xMC8yMDAyIDI6MjkgQU0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0LmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWlycm9yZmlsZXMiPgorICAgIDxta2RpciBkaXI9IiR7bWlycm9yLmRpcn0iIC8+CisgICAgPG1rZGlyIGRpcj0iJHttaXJyb3IuZGlyfS96aXAiIC8+CisgICAgPG1rZGlyIGRpcj0iJHttaXJyb3IuZGlyfS90YXIiIC8+CisgICAgPG1rZGlyIGRpcj0iJHttaXJyb3IuZGlyfS90YXIvZ3oiIC8+CisgICAgPG1rZGlyIGRpcj0iJHttaXJyb3IuZGlyfS90YXIvYnoyIiAvPgorICAgIDx0b3VjaCBmaWxlPSIke21pcnJvci5kaXJ9L2FzZi1sb2dvLmdpZi5tZDUiLz4KKyAgICA8dG91Y2ggZmlsZT0iJHttaXJyb3IuZGlyfS9hc2YtbG9nby5naWYuYnoyIi8+CisgICAgPHNsZWVwIHNlY29uZHM9IjIiLz4KKyAgICA8dG91Y2ggZmlsZT0iJHttaXJyb3IuZGlyfS96aXAvYXNmLWxvZ28uZ2lmLnppcCIvPgorICAgIDxzbGVlcCBzZWNvbmRzPSIzIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7bWlycm9yLmRpcn0vdGFyL2FzZi1sb2dvLmdpZi50YXIiLz4KKyAgICA8c2xlZXAgc2Vjb25kcz0iMiIvPgorICAgIDx0b3VjaCBmaWxlPSIke21pcnJvci5kaXJ9L3Rhci9hc2YtbG9nby1odWdlLnRhci5neiIvPgorICAgIDx0b3VjaCBmaWxlPSIke21pcnJvci5kaXJ9L3Rhci9nei9hc2YtbG9nby5naWYudGFyLmd6Ii8+CisgICAgPHRvdWNoIGZpbGU9IiR7bWlycm9yLmRpcn0vdGFyL2J6Mi9hc2YtbG9nby5naWYudGFyLmJ6MiIvPgorICAgIDx0b3VjaCBmaWxlPSIke21pcnJvci5kaXJ9L3Rhci9iejIvYXNmLWxvZ28taHVnZS50YXIuYnoyIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cC5taXJyb3JmaWxlcyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7bWlycm9yLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cHJlZ2V4cCI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdHJlZ2V4cHNyYy5kaXJ9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke3Rlc3RyZWdleHBkZXN0LmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29udGFpbnNyZWdleHAiPgorICAgIDxta2RpciBkaXI9IiR7dGVzdHJlZ2V4cHNyYy5kaXJ9IiAvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdHJlZ2V4cGRlc3QuZGlyfSIgLz4KKyAgICA8IS0tIE1ha2UgdHdvIHRlc3QgZmlsZXMsIHNob3VsZGNvcHkudHh0IHdpbGwgZ2V0IHNlbGVjdGVkIGlmIGV2ZXJ5dGhpbmcgd29ya3MKKyAgICAgICAgIHNob3VsZG5vdGNvcHkudHh0IHdpbGwgbm90IGdldCBzZWxlY3RlZCBmb3IgY29weS4gIFRoZSB0ZXN0IGxvb2tzIHRvIHNlZQorICAgICAgICAgdGhhdCBvbmx5IG9uZSBmaWxlIGlzIGNvcGllZAorICAgIC0tPgorICAgIDxlY2hvIG1lc3NhZ2U9IlNvbWUgdGVzdHJlZ2V4cCB0ZXh0IDIuMCIgZmlsZT0iJHt0ZXN0cmVnZXhwc3JjLmRpcn0vc2hvdWxkY29weS50eHQiIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iU29tZSB0ZXN0cmVnZXhwIHRleHQgMjAiIGZpbGU9IiR7dGVzdHJlZ2V4cHNyYy5kaXJ9L3Nob3VsZG5vdGNvcHkudHh0IiAvPgorICAgIDxjb3B5IHRvZGlyPSIke3Rlc3RyZWdleHBkZXN0LmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3RyZWdleHBzcmMuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioudHh0IiAvPgorICAgICAgICA8Y29udGFpbnNyZWdleHAgZXhwcmVzc2lvbj0iWzAtOV1cLlswLDEsMl0iIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8IS0tID09PT09PT09PT0gIFRlc3QgZm9yIE1vZGlmaWVkU2VsZWN0b3IgID09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJtb2RpZmllZHNlbGVjdG9ydGVzdC1tYWtlRGlydHkiPgorICAgICAgPCEtLSBMb2FkIHByb3BlcnR5ZmlsZSBnZW5lcmF0ZWQgYnkgU2VsZWN0b3JUZXN0LWNsYXNzIC0tPgorICAgICAgPHByb3BlcnR5IGZpbGU9Ik1vZGlmaWVkU2VsZWN0b3JUZXN0LnByb3BlcnRpZXMiLz4KKworICAgICAgPCEtLSBNb2RpZnkgb25seSB0aW1lc3RhbXAgLS0+CisgICAgICA8dG91Y2ggZmlsZT0iJHt0ZXN0LmRpcn0vJHtmMm5hbWV9IiBkYXRldGltZT0iMDIvMjgvMjAwMyA5OjU1IEFNIi8+CisgICAgICA8IS0tIENoYW5nZSBjb250ZW50IGJ1dCBrZWVwIHRpbWVzdGFtcCAtLT4KKyAgICAgIDxlY2hvIGZpbGU9IiR7dGVzdC5kaXJ9LyR7ZjNuYW1lfSIgYXBwZW5kPSJ0cnVlIiBtZXNzYWdlPSJuZXcgY29udGVudCIvPgorICAgICAgPHRvdWNoIGZpbGU9IiR7dGVzdC5kaXJ9LyR7ZjNuYW1lfSIgZGF0ZXRpbWU9IjExLzIxLzIwMDEgNDo1NSBBTSIvPgorICAgICAgPCEtLSBDaGFuZ2UgY29udGVudCBhbmQgdGltZXN0YW1wIC0tPgorICAgICAgPGVjaG8gZmlsZT0iJHt0ZXN0LmRpcn0vJHtmNG5hbWV9IiBhcHBlbmQ9InRydWUiIG1lc3NhZ2U9Im5ldyBjb250ZW50Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tY2xlYW4iPgorICAgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tcHJlcGFyZSI+CisgICAgICA8bWtkaXIgZGlyPSIke3Rlc3QuZGlyfS9zcmMiLz4KKyAgICAgIDxjb3B5IHRvZGlyPSIke3Rlc3QuZGlyfS9zcmMiPgorICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0vbGliIiBpbmNsdWRlcz0iYW50LmphciI+CisgICAgICAgICAgICAgIDx0eXBlIHR5cGU9ImZpbGUiLz4KKyAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2FudC5ob21lfS9iaW4iPgorICAgICAgICAgICAgICAgIDx0eXBlIHR5cGU9ImZpbGUiLz4KKyAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2NvcHk+CisgICAgICA8dG91Y2ggZGF0ZXRpbWU9IjEyLzI0LzIwMDIgNDowMCBwbSI+CisgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QuZGlyfSIvPgorICAgICAgPC90b3VjaD4KKyAgICAgIDxta2RpciBkaXI9IiR7dGVzdC5kaXJ9L3RvLTEiLz4KKyAgICAgIDxta2RpciBkaXI9IiR7dGVzdC5kaXJ9L3RvLTIiLz4KKyAgICAgIDxta2RpciBkaXI9IiR7dGVzdC5kaXJ9L3RvLTMiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtb2RpZmllZHNlbGVjdG9ydGVzdC1zY2VuYXJpby1tYWtlRGlydHkiPgorICAgICAgPHRvdWNoIGZpbGU9IiR7dGVzdC5kaXJ9L3NyYy9hbnQuamFyIi8+CisgICAgICA8ZWNobyBmaWxlPSIke3Rlc3QuZGlyfS9zcmMvYW50LmJhdCIgYXBwZW5kPSJ0cnVlIiBtZXNzYWdlPSJuZXctY29udGVudCIvPgorICAgICAgPGVjaG8gZmlsZT0iJHt0ZXN0LmRpcn0vc3JjL2FudFJ1bi5wbCIgYXBwZW5kPSJ0cnVlIiBtZXNzYWdlPSJuZXctY29udGVudCIvPgorICAgICAgPHRvdWNoIGZpbGU9IiR7dGVzdC5kaXJ9L3NyYy9hbnRSdW4ucGwiIGRhdGV0aW1lPSIxMi8yNC8yMDAyIDQ6MDAgcG0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtb2RpZmllZHNlbGVjdG9ydGVzdC1zY2VuYXJpby1jb3Jlc2VsZWN0b3ItZGVmYXVsdHMiIGRlcGVuZHM9Im1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLXByZXBhcmUiPgorICAgICAgPCEtLSBjb3B5IGZpcnN0IHRpbWUgYW5kIGNyZWF0ZSBjYWNoZWZpbGUgLS0+CisgICAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0LmRpcn0vdG8tMSI+CisgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QuZGlyfS9zcmMiPgorICAgICAgICAgICAgICA8bW9kaWZpZWQvPgorICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgIDwvY29weT4KKyAgICAgIDwhLS0gY29weSBzZWNvbmQgdGltZTogbm90aGluZyBzaG91bGQgYmUgY29waWVkIC0tPgorICAgICAgPGNvcHkgdG9kaXI9IiR7dGVzdC5kaXJ9L3RvLTIiPgorICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LmRpcn0vc3JjIj4KKyAgICAgICAgICAgICAgPG1vZGlmaWVkLz4KKyAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2NvcHk+CisgICAgICA8IS0tICdtb2RpZnknIHRoZSBzb3VyY2UgZmlsZXMgLS0+CisgICAgICA8YW50Y2FsbCB0YXJnZXQ9Im1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLW1ha2VEaXJ0eSIvPgorICAgICAgPCEtLSBjb3B5IHRoaXJkIHRpbWU6IG9ubHkgdGhlIGZpbGVzIHdpdGggbmV3IENPTlRFTlQgc2hvdWxkIGJlIGNvcGllZCAtLT4KKyAgICAgIDxjb3B5IHRvZGlyPSIke3Rlc3QuZGlyfS90by0zIj4KKyAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5kaXJ9L3NyYyI+CisgICAgICAgICAgICAgIDxtb2RpZmllZC8+CisgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLWNvcmVzZWxlY3Rvci1zZXR0aW5ncyIgZGVwZW5kcz0ibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tcHJlcGFyZSI+CisgICAgICA8IS0tIGNvcHkgZmlyc3QgdGltZSBhbmQgY3JlYXRlIGNhY2hlZmlsZSAtLT4KKyAgICAgIDxjb3B5IHRvZGlyPSIke3Rlc3QuZGlyfS90by0xIj4KKyAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5kaXJ9L3NyYyI+CisgICAgICAgICAgICAgIDxtb2RpZmllZCBjYWNoZT0icHJvcGVydHlmaWxlIiBhbGdvcml0aG09Imhhc2h2YWx1ZSIgdXBkYXRlPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWNoZS5jYWNoZWZpbGUiIHZhbHVlPSJjb3JlLmNhY2hlLnByb3BlcnRpZXMiIC8+CisgICAgICAgICAgICAgIDwvbW9kaWZpZWQ+CisgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9jb3B5PgorICAgICAgPCEtLSBjb3B5IHNlY29uZCB0aW1lOiBub3RoaW5nIHNob3VsZCBiZSBjb3BpZWQgLS0+CisgICAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0LmRpcn0vdG8tMiI+CisgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QuZGlyfS9zcmMiPgorICAgICAgICAgICAgICA8bW9kaWZpZWQgY2FjaGU9InByb3BlcnR5ZmlsZSIgYWxnb3JpdGhtPSJoYXNodmFsdWUiIHVwZGF0ZT0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FjaGUuY2FjaGVmaWxlIiB2YWx1ZT0iY29yZS5jYWNoZS5wcm9wZXJ0aWVzIiAvPgorICAgICAgICAgICAgICA8L21vZGlmaWVkPgorICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgIDwvY29weT4KKyAgICAgIDwhLS0gJ21vZGlmeScgdGhlIHNvdXJjZSBmaWxlcyAtLT4KKyAgICAgIDxhbnRjYWxsIHRhcmdldD0ibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tbWFrZURpcnR5Ii8+CisgICAgICA8IS0tIGNvcHkgdGhpcmQgdGltZTogb25seSB0aGUgZmlsZXMgd2l0aCBuZXcgQ09OVEVOVCBzaG91bGQgYmUgY29waWVkIC0tPgorICAgICAgPGNvcHkgdG9kaXI9IiR7dGVzdC5kaXJ9L3RvLTMiPgorICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LmRpcn0vc3JjIj4KKyAgICAgICAgICAgICAgPG1vZGlmaWVkIGNhY2hlPSJwcm9wZXJ0eWZpbGUiIGFsZ29yaXRobT0iaGFzaHZhbHVlIiB1cGRhdGU9InRydWUiPgorICAgICAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNhY2hlLmNhY2hlZmlsZSIgdmFsdWU9ImNvcmUuY2FjaGUucHJvcGVydGllcyIgLz4KKyAgICAgICAgICAgICAgPC9tb2RpZmllZD4KKyAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tY3VzdG9tc2VsZWN0b3Itc2V0dGluZ3MiIGRlcGVuZHM9Im1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLXByZXBhcmUiPgorICAgICAgPCEtLSBjb3B5IGZpcnN0IHRpbWUgYW5kIGNyZWF0ZSBjYWNoZWZpbGUgLS0+CisgICAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0LmRpcn0vdG8tMSI+CisgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QuZGlyfS9zcmMiPgorICAgICAgICAgICAgICA8Y3VzdG9tIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3IuTW9kaWZpZWRTZWxlY3RvciI+CisgICAgICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FjaGUiICAgICAgdmFsdWU9InByb3BlcnR5ZmlsZSIvPgorICAgICAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFsZ29yaXRobSIgIHZhbHVlPSJoYXNodmFsdWUiLz4KKyAgICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJ1cGRhdGUiICAgICB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNhY2hlLmNhY2hlZmlsZSIgdmFsdWU9ImNvcmUuY2FjaGUucHJvcGVydGllcyIvPgorICAgICAgICAgICAgICA8L2N1c3RvbT4KKyAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2NvcHk+CisgICAgICA8IS0tIGNvcHkgc2Vjb25kIHRpbWU6IG5vdGhpbmcgc2hvdWxkIGJlIGNvcGllZCAtLT4KKyAgICAgIDxjb3B5IHRvZGlyPSIke3Rlc3QuZGlyfS90by0yIj4KKyAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5kaXJ9L3NyYyI+CisgICAgICAgICAgICAgIDxjdXN0b20gY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yIj4KKyAgICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWNoZSIgICAgICB2YWx1ZT0icHJvcGVydHlmaWxlIi8+CisgICAgICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iYWxnb3JpdGhtIiAgdmFsdWU9Imhhc2h2YWx1ZSIvPgorICAgICAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9InVwZGF0ZSIgICAgIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY2FjaGUuY2FjaGVmaWxlIiB2YWx1ZT0iY29yZS5jYWNoZS5wcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICAgIDwvY3VzdG9tPgorICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgIDwvY29weT4KKyAgICAgIDwhLS0gJ21vZGlmeScgdGhlIHNvdXJjZSBmaWxlcyAtLT4KKyAgICAgIDxhbnRjYWxsIHRhcmdldD0ibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tbWFrZURpcnR5Ii8+CisgICAgICA8IS0tIGNvcHkgdGhpcmQgdGltZTogb25seSB0aGUgZmlsZXMgd2l0aCBuZXcgQ09OVEVOVCBzaG91bGQgYmUgY29waWVkIC0tPgorICAgICAgPGNvcHkgdG9kaXI9IiR7dGVzdC5kaXJ9L3RvLTMiPgorICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LmRpcn0vc3JjIj4KKyAgICAgICAgICAgICAgPGN1c3RvbSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLk1vZGlmaWVkU2VsZWN0b3IiPgorICAgICAgICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNhY2hlIiAgICAgIHZhbHVlPSJwcm9wZXJ0eWZpbGUiLz4KKyAgICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhbGdvcml0aG0iICB2YWx1ZT0iaGFzaHZhbHVlIi8+CisgICAgICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0idXBkYXRlIiAgICAgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWNoZS5jYWNoZWZpbGUiIHZhbHVlPSJjb3JlLmNhY2hlLnByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgICAgPC9jdXN0b20+CisgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1vZGlmaWVkc2VsZWN0b3J0ZXN0LWN1c3RvbUNsYXNzZXMiIGRlcGVuZHM9Im1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLXByZXBhcmUiPgorICAgICAgPHByb3BlcnR5IG5hbWU9InBrZy5saXZlIiB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3IiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwa2cudGVzdCIgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycyIvPgorICAgICAgPGZpbGVzZXQgaWQ9ImZzLm1vZCIgZGlyPSIke3Rlc3QuZGlyfS9zcmMiPgorICAgICAgICAgIDxtb2RpZmllZAorICAgICAgICAgICAgICBhbGdvcml0aG1jbGFzcz0iJHtwa2cudGVzdH0uTW9ja0FsZ29yaXRobSIKKyAgICAgICAgICAgICAgY2FjaGVjbGFzcz0iJHtwa2cudGVzdH0uTW9ja0NhY2hlIgorICAgICAgICAgICAgICBjb21wYXJhdG9yY2xhc3M9IiR7cGtnLnRlc3R9Lk1vY2tDb21wYXJhdG9yIgorICAgICAgICAgID4KKyAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC50ZXN0cy52YWx1ZX0iLz4KKyAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgPC9tb2RpZmllZD4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxmaWxlc2V0IGlkPSJmcy5mdWxsIiBkaXI9IiR7dGVzdC5kaXJ9L3NyYyIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZzLm1vZC52YWx1ZSIgIHJlZmlkPSJmcy5tb2QiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmcy5mdWxsLnZhbHVlIiByZWZpZD0iZnMuZnVsbCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1vZGlmaWVkc2VsZWN0b3J0ZXN0LVJlc291cmNlU2ltcGxlIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSJEaWRudCBnZXQgdGhlIHJlcXVpcmVkIG51bWJlcnMgb2YgUmVzb3VyY2VzLiI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMyI+CisgICAgICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICAgICAgPGZpbGUgZmlsZT0iZm9vIiAvPgorICAgICAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmb28iIC8+CisgICAgICAgICAgICAgICAgPGZpbGUgZmlsZT0iZm9vIiBiYXNlZGlyPSIke2Jhc2VkaXJ9IiAvPgorICAgICAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICAgICAgPG1vZGlmaWVkIHNlbHJlcz0idHJ1ZSIgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIi8+CisgICAgICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kaWZpZWRzZWxlY3RvcnRlc3QtUmVzb3VyY2VTZWxyZXNUcnVlIj4KKyAgICA8ZmFpbCBtZXNzYWdlPSJHb3QgdGhlIFJlc291cmNlLCBidXQgc2hvdWxkLiI+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMSI+CisgICAgICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9Im5vdEV4aXN0aW5nIiAvPgorICAgICAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICAgICAgPG1vZGlmaWVkIHNlbHJlcz0idHJ1ZSIgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIi8+CisgICAgICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kaWZpZWRzZWxlY3RvcnRlc3QtUmVzb3VyY2VTZWxyZXNGYWxzZSI+CisgICAgPGZhaWwgbWVzc2FnZT0iR290IHRoZSBSZXNvdXJjZSwgYnV0IHNob3VsZCBub3QuIj4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIwIj4KKyAgICAgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0ibm90RXhpc3RpbmciIC8+CisgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgICAgICA8bW9kaWZpZWQgc2VscmVzPSJmYWxzZSIgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIi8+CisgICAgICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tcmVzb3VyY2VTaW1wbGUiIGRlcGVuZHM9Im1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLXByZXBhcmUiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJjaGVjayI+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvdW50Ii8+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZmFpbCBtZXNzYWdlPSJAe21lc3NhZ2V9Ij4KKyAgICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSJAe2NvdW50fSI+CisgICAgICAgICAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QuZGlyfS9zcmMiLz4KKyAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgICAgICAgICAgPG1vZGlmaWVkIHNlbHJlcz0iZmFsc2UiIHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyIvPgorICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgICAgIDwvbm90PgorICAgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8L2ZhaWw+CQorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgPCEtLSBzZWxlY3QgZmlyc3QgdGltZSBhbmQgY3JlYXRlIGNhY2hlZmlsZSAtLT4KKyAgICA8Y2hlY2sgY291bnQ9IjE0IiBtZXNzYWdlPSJJbml0aWFsIHNldCBvZiBmaWxlcyBub3Qgb2suIi8+CisKKyAgICA8IS0tIGNoZWNrIHNlY29uZCB0aW1lOiBub3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCAtLT4KKyAgICA8Y2hlY2sgY291bnQ9IjAiIG1lc3NhZ2U9IlNlbGVjdGVkIGZpbGVzIGJ1dCBzaG91bGRudC4iLz4KKworICAgIDwhLS0gJ21vZGlmeScgdGhlIHNvdXJjZSBmaWxlcyAtLT4KKyAgICA8YW50Y2FsbCB0YXJnZXQ9Im1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLW1ha2VEaXJ0eSIvPgorCisgICAgPCEtLSBjb3B5IHRoaXJkIHRpbWU6IG9ubHkgdGhlIGZpbGVzIHdpdGggbmV3IENPTlRFTlQgc2hvdWxkIGJlIGNvcGllZCAtLT4KKyAgICA8Y2hlY2sgY291bnQ9IjIiIG1lc3NhZ2U9IkRpZG50IHNlbGVjdCB0aGUgMiBtb2RpZmllZCBmaWxlcy4iLz4KKyAgPC90YXJnZXQ+CQorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3RvcnMvc2NyaXB0c2VsZWN0b3IueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvc2VsZWN0b3JzL3NjcmlwdHNlbGVjdG9yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGFmZTMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvc2VsZWN0b3JzL3NjcmlwdHNlbGVjdG9yLnhtbApAQCAtMCwwICsxLDEzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJzY3JpcHRzZWxlY3RvciIgZGVmYXVsdD0iZGVmIiBiYXNlZGlyPSIuIj4KKworICA8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIGxvY2F0aW9uPSIke2FudC5maWxlfSIgLz4KKyAgCisgIDxtYWNyb2RlZiBuYW1lPSJ0ZXN0c2VsZWN0ZWQiPgorICAgIDxlbGVtZW50IG5hbWU9InNlbGVjdG9yIiBpbXBsaWNpdD0ieWVzIiBvcHRpb25hbD0idHJ1ZSIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSIvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGZhaWwgbWVzc2FnZT0iQHttZXNzYWdlfSBmYWlsZWQ6IGZpbGUgd2FzIG5vdCBzZWxlY3RlZCI+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxpc2ZpbGVzZWxlY3RlZCBmaWxlPSJ7c3JjLmZpbGV9Ij4KKyAgICAgICAgICAgICAgPHNlbGVjdG9yLz4KKyAgICAgICAgICAgIDwvaXNmaWxlc2VsZWN0ZWQ+CisgICAgICAgICAgPC9ub3Q+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgPC9mYWlsPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4gIAorICAKKyAgPG1hY3JvZGVmIG5hbWU9InRlc3Rub3NlbGVjdGVkIj4KKyAgICA8ZWxlbWVudCBuYW1lPSJzZWxlY3RvciIgaW1wbGljaXQ9InllcyIgb3B0aW9uYWw9InRydWUiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxmYWlsIG1lc3NhZ2U9IkB7bWVzc2FnZX0gZmFpbGVkOiBmaWxlIHdhcyBzZWxlY3RlZCI+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPGlzZmlsZXNlbGVjdGVkIGZpbGU9IntzcmMuZmlsZX0iPgorICAgICAgICAgICAgPHNlbGVjdG9yLz4KKyAgICAgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgICAgICA8L2NvbmRpdGlvbj4KKyAgICAgIDwvZmFpbD4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+ICAgIAorCisgIDwhLS0gdGhpcyBpcyBoZXJlIHRvIHRlc3QgdGhlIG1hY3JvIGlzIHdlbGwgY29kZWQgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdE5vU2VsZWN0b3IiPgorICAgIDx0ZXN0c2VsZWN0ZWQgbWVzc2FnZT0idGVzdE5vU2VsZWN0b3IiID4KKyAgICA8L3Rlc3RzZWxlY3RlZD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9sYW5ndWFnZSI+CisgICAgPHRlc3RzZWxlY3RlZCBtZXNzYWdlPSJ0ZXN0Tm9sYW5ndWFnZSIgPgorICAgICAgPHNlbGVjdG9yPgorICAgICAgICA8c2NyaXB0c2VsZWN0b3IgPgorICAgICAgICAgIHNlbGYuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgIDwvc2NyaXB0c2VsZWN0b3I+CisgICAgICA8L3NlbGVjdG9yPgorICAgIDwvdGVzdHNlbGVjdGVkPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RTZWxlY3Rpb25TZXRCeURlZmF1bHQiPgorICAgIDx0ZXN0c2VsZWN0ZWQgbWVzc2FnZT0idGVzdFNlbGVjdGlvblNldEJ5RGVmYXVsdCIgPgorICAgICAgPHNlbGVjdG9yPgorICAgICAgICA8c2NyaXB0c2VsZWN0b3IgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgICA8L3NjcmlwdHNlbGVjdG9yPgorICAgICAgPC9zZWxlY3Rvcj4KKyAgICA8L3Rlc3RzZWxlY3RlZD4KKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9InRlc3RTZWxlY3Rpb25TZXRXb3JrcyI+CisgICAgPHRlc3RzZWxlY3RlZCBtZXNzYWdlPSJ0ZXN0U2VsZWN0aW9uU2V0V29ya3MiID4KKyAgICAgIDxzZWxlY3Rvcj4KKyAgICAgICAgPHNjcmlwdHNlbGVjdG9yIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgICAgICBzZWxmLnNldFNlbGVjdGVkKGZhbHNlKTsKKyAgICAgICAgICBzZWxmLnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICA8L3NjcmlwdHNlbGVjdG9yPgorICAgICAgPC9zZWxlY3Rvcj4KKyAgICA8L3Rlc3RzZWxlY3RlZD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U2VsZWN0aW9uQ2xlYXJXb3JrcyI+CisgICAgPHRlc3Rub3NlbGVjdGVkIG1lc3NhZ2U9InRlc3RTZWxlY3Rpb25DbGVhcldvcmtzIj4KKyAgICAgIDxzZWxlY3Rvcj4KKyAgICAgICAgPHNjcmlwdHNlbGVjdG9yIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgICAgICBzZWxmLnNldFNlbGVjdGVkKGZhbHNlKTsKKyAgICAgICAgPC9zY3JpcHRzZWxlY3Rvcj4KKyAgICAgIDwvc2VsZWN0b3I+CisgICAgPC90ZXN0bm9zZWxlY3RlZD4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlQXR0cmlidXRlIj4KKyAgICA8dGVzdHNlbGVjdGVkIG1lc3NhZ2U9InRlc3RGaWxlQXR0cmlidXRlIiA+CisgICAgICA8c2VsZWN0b3I+CisgICAgICAgIDxzY3JpcHRzZWxlY3RvciBsYW5ndWFnZT0iamF2YXNjcmlwdCI+CisgICAgICAgICAgc2VsZi5zZXRTZWxlY3RlZChmaWxlLmVxdWFscyhzZWxmLmdldEZpbGUoKSkpOworICAgICAgICA8L3NjcmlwdHNlbGVjdG9yPgorICAgICAgPC9zZWxlY3Rvcj4KKyAgICA8L3Rlc3RzZWxlY3RlZD4KKyAgPC90YXJnZXQ+ICAKKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlbmFtZUF0dHJpYnV0ZSI+CisgICAgPHRlc3RzZWxlY3RlZCBtZXNzYWdlPSJ0ZXN0RmlsZW5hbWVBdHRyaWJ1dGUiID4KKyAgICAgIDxzZWxlY3Rvcj4KKyAgICAgICAgPHNjcmlwdHNlbGVjdG9yIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgICAgICBzZWxmLnNldFNlbGVjdGVkKGZpbGVuYW1lLmVxdWFscyhzZWxmLmdldEZpbGVuYW1lKCkpKTsKKyAgICAgICAgPC9zY3JpcHRzZWxlY3Rvcj4KKyAgICAgIDwvc2VsZWN0b3I+CisgICAgPC90ZXN0c2VsZWN0ZWQ+CisgIDwvdGFyZ2V0PiAgICAKKyAgCisgIDx0YXJnZXQgbmFtZT0idGVzdEJhc2VkaXJBdHRyaWJ1dGUiPgorICAgIDx0ZXN0c2VsZWN0ZWQgbWVzc2FnZT0idGVzdEJhc2VkaXJBdHRyaWJ1dGUiID4KKyAgICAgIDxzZWxlY3Rvcj4KKyAgICAgICAgPHNjcmlwdHNlbGVjdG9yIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgICAgICBzZWxmLnNldFNlbGVjdGVkKGJhc2VkaXIuZXF1YWxzKHNlbGYuZ2V0QmFzZWRpcigpKSk7CisgICAgICAgIDwvc2NyaXB0c2VsZWN0b3I+CisgICAgICA8L3NlbGVjdG9yPgorICAgIDwvdGVzdHNlbGVjdGVkPgorICA8L3RhcmdldD4KKyAgCisgIDx0YXJnZXQgbmFtZT0ibm90ZXN0RmlsZW5hbWVMZW5ndGgiPgorICAgIDx0ZXN0c2VsZWN0ZWQgbWVzc2FnZT0ibm90ZXN0RmlsZW5hbWVMZW5ndGgiID4KKyAgICAgIDxzZWxlY3Rvcj4KKyAgICAgICAgPHNjcmlwdHNlbGVjdG9yIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgICAgICBzZWxmLnNldFNlbGVjdGVkKChmaWxlbmFtZS5sZW5ndGglMik9PTApOworICAgICAgICA8L3NjcmlwdHNlbGVjdG9yPgorICAgICAgPC9zZWxlY3Rvcj4KKyAgICA8L3Rlc3RzZWxlY3RlZD4KKyAgPC90YXJnZXQ+ICAgIAorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvc2VsZWN0b3JzL3NpZ25lZHNlbGVjdG9yLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy9zaWduZWRzZWxlY3Rvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmZTk0MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy9zaWduZWRzZWxlY3Rvci54bWwKQEAgLTAsMCArMSw2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgPG1hY3JvZGVmIG5hbWU9InBhc3MiPgorICAgIDxlbGVtZW50IG5hbWU9ImNvbmRpdGlvbnMiIGltcGxpY2l0PSJ5ZXMiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxtZXNzYWdlIi8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8ZmFpbCBtZXNzYWdlPSJAe2ZhaWxtZXNzYWdlfSI+CisgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgIDxjb25kaXRpb25zLz4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICA8L2ZhaWw+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJpc3NpZ25lZC5kaXIiIGxvY2F0aW9uPSIuLi8uLi90YXNrZGVmcy9jb25kaXRpb25zL2phcnMiLz4KKyAgCisgIDx0YXJnZXQgbmFtZT0ic2VsZWN0c2lnbmVkIj4KKyAgICA8cGFzcyBmYWlsbWVzc2FnZT0iYXBhc3N3b3JkLmphciBzaG91bGQgYmUgYSBzaWduZWQgZmlsZSI+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iJHtpc3NpZ25lZC5kaXJ9L2FwYXNzd29yZC5qYXIiPgorICAgICAgICA8c2lnbmVkc2VsZWN0b3IvPgorICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICA8L3Bhc3M+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm90c2VsZWN0ZWQiPgorICAgIDxwYXNzIGZhaWxtZXNzYWdlPSJub3NpZ24uamFyIHNob3VsZCBub3QgYmUgc2VsZWN0ZWQgYXMgYSBzaWduZWQgamFyIj4KKyAgICAgIDxub3Q+CisgICAgICAgIDxpc2ZpbGVzZWxlY3RlZCBmaWxlPSIke2lzc2lnbmVkLmRpcn0vbm9zaWduLmphciI+CisgICAgICAgICAgPHNpZ25lZHNlbGVjdG9yLz4KKyAgICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICAgIDwvbm90PgorICAgIDwvcGFzcz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJuYW1lIj4KKyAgICA8cGFzcyBmYWlsbWVzc2FnZT0iYXBhc3N3b3JkLmphciBzaG91bGQgYmUgYSBzaWduZWQgZmlsZSB3aXRoIHRoZSBuYW1lIGFwYXNzd29yZCI+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iJHtpc3NpZ25lZC5kaXJ9L2FwYXNzd29yZC5qYXIiPgorICAgICAgICA8c2lnbmVkc2VsZWN0b3IgbmFtZT0iYXBhc3N3b3JkIi8+CisgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgIDwvcGFzcz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sY2F0YWxvZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyNjlmNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sCkBAIC0wLDAgKzEsMTUwIEBACis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBwcm9qZWN0PgorCis8cHJvamVjdCBuYW1lPSJ4bWxjYXRhbG9nIiBkZWZhdWx0PSJhbGwiIGJhc2VkaXI9Ii4iPgorCisgIDxkZXNjcmlwdGlvbj4KKyAgICBUaGlzIGlzIHRvIHRlc3QgWE1MQ2F0YWxvZyBmb3IgZXh0ZXJuYWwgZW50aXR5IHJlc29sdXRpb24gZnJvbSB0aGUKKyAgICB4c2x0IHRhc2ssIGJvdGggdGhlIHNpbXBsZSBjYXNlIGFuZCB1c2luZyB0aGUgZG9jdW1lbnQoKSBmdW5jdGlvbgorICAgIHRvIHJlZmVyIHRvIGEgc2Vjb25kIGZpbGUgKHdoaWNoIHJlZmVycyB0byB0aGUgZW50aXR5KS4gVGhpcworICAgIGJ1aWxkZmlsZSBpcyBjYWxsZWQgYnkKKyAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5YTUxDYXRhbG9nQnVpbGRGaWxlVGVzdC5qYXZhCisgICAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSB0cnkgaXQgb3V0IGJ5IGhhbmQgYnkgZmlyc3QgcmVtb3ZpbmcgdGhlCisgICAgY29tbWVudCBzeW1ib2xzIGFyb3VuZCB0aGUgZWNobyBzdGF0ZW1lbnRzIGFuZCB0aGVuIGNhbGxpbmcgCisgICAgYW50IC1idWlsZGZpbGUgeG1sY2F0YWxvZy54bWwKKyAgPC9kZXNjcmlwdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0idHJhbnNmb3JtZXIiIHZhbHVlID0gInhtbGNhdGFsb2cueHNsIi8+CisKKyAgPHRhcmdldCAKKyAgICBuYW1lICAgID0gImFsbCIgCisgICAgZGVwZW5kcyA9ICJ0ZXN0ZW50aXR5bm9jYXRhbG9nLCB0ZXN0ZW50aXR5d2l0aGNhdGFsb2csIAorICAgIHRlc3Rkb2N1bWVudG5vY2F0YWxvZywgdGVzdGRvY3VtZW50d2l0aGNhdGFsb2ciLz4KKworICA8dGFyZ2V0IAorICAgIG5hbWUgICAgICAgID0gInRlc3RlbnRpdHlub2NhdGFsb2ciCisgICAgZGVzY3JpcHRpb24gPSAiVGVzdCBleHRlcm5hbCBlbnRpdHkgcmVzb2x2ZXIgZm9yIHNpbXBsZSBYTUwKK2RvY3VtZW50IHdpdGhvdXQgdXNpbmcgWE1MQ2F0YWxvZyI+CisgICAgPGRlbGV0ZQorICAgICAgcXVpZXQgPSAieWVzIgorICAgICAgZmlsZSAgPSAicmVzdWx0Lm91dCIvPgorICAgIDx4c2x0CisgICAgICBiYXNlZGlyICAgPSAiJHtiYXNlZGlyfSIKKyAgICAgIGRlc3RkaXIgICA9ICIke2Jhc2VkaXJ9IgorICAgICAgZXh0ZW5zaW9uID0gIi50ZXh0IgorICAgICAgc3R5bGUgICAgID0gIiR7dHJhbnNmb3JtZXJ9IgorICAgICAgaW4gICAgICAgID0gInhtbGNhdGFsb2cxLnhtbCIKKyAgICAgIG91dCAgICAgICA9ICJyZXN1bHQub3V0Ij4KKyAgICAgIDxwYXJhbQorICAgICAgICBuYW1lICAgICAgID0gIm91dHByb3AiCisgICAgICAgIGV4cHJlc3Npb24gPSAidmFsMSIvPgorICAgIDwveHNsdD4KKyAgICA8cHJvcGVydHkgZmlsZSA9ICJyZXN1bHQub3V0Ii8+CisgICAgPCEtLSA8ZWNobyBtZXNzYWdlID0gIiR7dmFsMX0iLz4gLS0+CisgICAgPGRlbGV0ZQorICAgICAgcXVpZXQgPSAieWVzIgorICAgICAgZmlsZSAgPSAicmVzdWx0Lm91dCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IAorICAgIG5hbWUgICAgICAgID0gInRlc3RlbnRpdHl3aXRoY2F0YWxvZyIKKyAgICBkZXNjcmlwdGlvbiA9ICJUZXN0IGV4dGVybmFsIGVudGl0eSByZXNvbHZlciBmb3Igc2ltcGxlCitYTUwgZG9jdW1lbnQgdXNpbmcgWE1MQ2F0YWxvZyI+CisgICAgPGRlbGV0ZQorICAgICAgcXVpZXQgPSAieWVzIgorICAgICAgZmlsZSAgPSAicmVzdWx0Lm91dCIvPgorICAgIDx4c2x0CisgICAgICBiYXNlZGlyICAgPSAiJHtiYXNlZGlyfSIKKyAgICAgIGRlc3RkaXIgICA9ICIke2Jhc2VkaXJ9IgorICAgICAgZXh0ZW5zaW9uID0gIi50ZXh0IgorICAgICAgc3R5bGUgICAgID0gIiR7dHJhbnNmb3JtZXJ9IgorICAgICAgaW4gICAgICAgID0gInhtbGNhdGFsb2cxLnhtbCIKKyAgICAgIG91dCAgICAgICA9ICJyZXN1bHQub3V0Ij4KKyAgICAgIDxwYXJhbQorICAgICAgICBuYW1lICAgICAgID0gIm91dHByb3AiCisgICAgICAgIGV4cHJlc3Npb24gPSAidmFsMiIvPgorICAgICAgPHhtbGNhdGFsb2c+CisgICAgICAgIDxlbnRpdHkgCisgICAgICAgICAgcHVibGljSWQgPSAibXlxdW90ZSIKKyAgICAgICAgICBsb2NhdGlvbiA9ICJxdW90ZTIueG1sIi8+CisgICAgICA8L3htbGNhdGFsb2c+CisgICAgPC94c2x0PgorICAgIDxwcm9wZXJ0eSBmaWxlID0gInJlc3VsdC5vdXQiLz4KKyAgICA8IS0tIDxlY2hvIG1lc3NhZ2UgPSAiJHt2YWwyfSIvPiAtLT4KKyAgICA8ZGVsZXRlCisgICAgICBxdWlldCA9ICJ5ZXMiCisgICAgICBmaWxlICA9ICJyZXN1bHQub3V0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgCisgICAgbmFtZSAgICAgICAgPSAidGVzdGRvY3VtZW50bm9jYXRhbG9nIgorICAgIGRlc2NyaXB0aW9uID0gIlRlc3QgZW50aXR5IHJlc29sdXRpb24gaW4gWE1MIGRvY3VtZW50IGNhbGxlZAorZnJvbSBYU0xUIGRvY3VtZW50KCkgZnVuY3Rpb24gd2l0aG91dCB1c2luZyBYTUxDYXRhbG9nIj4KKyAgICA8ZGVsZXRlCisgICAgICBxdWlldCA9ICJ5ZXMiCisgICAgICBmaWxlICA9ICJyZXN1bHQub3V0Ii8+CisgICAgPHhzbHQKKyAgICAgIGJhc2VkaXIgICA9ICIke2Jhc2VkaXJ9IgorICAgICAgZGVzdGRpciAgID0gIiR7YmFzZWRpcn0iCisgICAgICBleHRlbnNpb24gPSAiLnRleHQiCisgICAgICBzdHlsZSAgICAgPSAiJHt0cmFuc2Zvcm1lcn0iCisgICAgICBpbiAgICAgICAgPSAieG1sY2F0YWxvZzIueG1sIgorICAgICAgb3V0ICAgICAgID0gInJlc3VsdC5vdXQiPgorICAgICAgPHBhcmFtCisgICAgICAgIG5hbWUgICAgICAgPSAib3V0cHJvcCIKKyAgICAgICAgZXhwcmVzc2lvbiA9ICJ2YWwzIi8+CisgICAgPC94c2x0PgorICAgIDxwcm9wZXJ0eSBmaWxlID0gInJlc3VsdC5vdXQiLz4KKyAgICA8IS0tIDxlY2hvIG1lc3NhZ2UgPSAiJHt2YWwzfSIvPiAtLT4KKyAgICA8ZGVsZXRlCisgICAgICBxdWlldCA9ICJ5ZXMiCisgICAgICBmaWxlICA9ICJyZXN1bHQub3V0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgCisgICAgbmFtZSAgICAgICAgPSAidGVzdGRvY3VtZW50d2l0aGNhdGFsb2ciIAorICAgIGRlc2NyaXB0aW9uID0gIlRlc3QgZW50aXR5IHJlc29sdXRpb24gaW4gWE1MIGRvY3VtZW50IGNhbGxlZAorZnJvbSBYU0xUIGRvY3VtZW50KCkgZnVuY3Rpb24gdXNpbmcgWE1MQ2F0YWxvZyI+CisgICAgPGRlbGV0ZQorICAgICAgcXVpZXQgPSAieWVzIgorICAgICAgZmlsZSAgPSAicmVzdWx0Lm91dCIvPgorICAgIDx4c2x0CisgICAgICBiYXNlZGlyICAgPSAiJHtiYXNlZGlyfSIKKyAgICAgIGRlc3RkaXIgICA9ICIke2Jhc2VkaXJ9IgorICAgICAgZXh0ZW5zaW9uID0gIi50ZXh0IgorICAgICAgc3R5bGUgICAgID0gIiR7dHJhbnNmb3JtZXJ9IgorICAgICAgaW4gICAgICAgID0gInhtbGNhdGFsb2cyLnhtbCIKKyAgICAgIG91dCAgICAgICA9ICJyZXN1bHQub3V0Ij4KKyAgICAgIDxwYXJhbQorICAgICAgICBuYW1lICAgICAgID0gIm91dHByb3AiCisgICAgICAgIGV4cHJlc3Npb24gPSAidmFsNCIvPgorICAgICAgPHhtbGNhdGFsb2c+CisgICAgICAgIDxlbnRpdHkgCisgICAgICAgICAgcHVibGljSWQgPSAibXlxdW90ZSIKKyAgICAgICAgICBsb2NhdGlvbiA9ICJxdW90ZTIueG1sIi8+CisgICAgICA8L3htbGNhdGFsb2c+CisgICAgPC94c2x0PgorICAgIDxwcm9wZXJ0eSBmaWxlID0gInJlc3VsdC5vdXQiLz4KKyAgICA8IS0tIDxlY2hvIG1lc3NhZ2UgPSAiJHt2YWw0fSIvPiAtLT4KKyAgICA8ZGVsZXRlCisgICAgICBxdWlldCA9ICJ5ZXMiCisgICAgICBmaWxlICA9ICJyZXN1bHQub3V0Ii8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxjYXRhbG9nLnhzbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzgzOWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxjYXRhbG9nLnhzbApAQCAtMCwwICsxLDQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHhzbDpzdHlsZXNoZWV0IAorICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgdmVyc2lvbj0iMS4wIj4KKworICA8IS0tIEkgYmVsb25nIHRvOgorICAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2dCdWlsZEZpbGVUZXN0LmphdmEgCisgICAgICAgLS0+CisKKyAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+CisKKyAgPCEtLSBuYW1lIG9mIHRoZSBvdXRwdXQgcGFyYW1ldGVyIHRvIHdyaXRlIC0tPgorICA8eHNsOnBhcmFtIG5hbWU9Im91dHByb3AiPnZhbHVlPC94c2w6cGFyYW0+CisKKyAgPHhzbDpzdHJpcC1zcGFjZSBlbGVtZW50cz0iKiIvPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHJvcCIvPjogPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIvZnJhZ21lbnQvcGFyYSIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tIFRoaXMgd2lsbCBvbmx5IGJlIG1hdGNoZWQgaW4gZG9jMi54bWwgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IlJlZiI+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJkb2N1bWVudChAZmlsZSkvZnJhZ21lbnQvcGFyYSIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tIFRoaXMgd2lsbCBvbmx5IGJlIG1hdGNoZWQgaW4gZG9jMS54bWwgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSI+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vcm1hbGl6ZS1zcGFjZSguKSIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cxLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGI1NDYxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sY2F0YWxvZzEueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIGZyYWdtZW50IFsKKyAgPCFFTlRJVFkgcXVvdGUgUFVCTElDICJteXF1b3RlIiAicXVvdGUxLnhtbCI+CitdPgorCisgIDwhLS0gSSBiZWxvbmcgdG86CisgICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZ0J1aWxkRmlsZVRlc3QuamF2YSAKKyAgICAgICAtLT4KKworPGZyYWdtZW50PgorICA8cGFyYT4KKyAgICAgICZxdW90ZTsKKyAgPC9wYXJhPgorPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cyLnhtbCBiL3RydW5rL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJiZWQwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sY2F0YWxvZzIueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisgIDwhLS0gSSBiZWxvbmcgdG86CisgICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZ0J1aWxkRmlsZVRlc3QuamF2YSAKKyAgICAgICAtLT4KKworPGZyYWdtZW50PgorICA8cGFyYT4KKyAgICA8UmVmIGZpbGU9InhtbGNhdGFsb2cxLnhtbCIvPgorICA8L3BhcmE+Cis8L2ZyYWdtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sZnJhZ21lbnQueG1sIGIvdHJ1bmsvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sZnJhZ21lbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjE0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxmcmFnbWVudC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdD4KKyAgPHR5cGVkZWYgbmFtZT0iZnJhZ21lbnQiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5YTUxGcmFnbWVudCIvPgorCisgIDxmcmFnbWVudCBpZD0ibmVzdGVkLXRleHQiPmZvbzwvZnJhZ21lbnQ+CisKKyAgPGZyYWdtZW50IGlkPSJ3aXRoLWNoaWxkcmVuIj4KKyAgICA8Y2hpbGQxPmZvbzwvY2hpbGQxPgorICAgIDxjaGlsZDIgZm9vPSJiYXIiLz4KKyAgICA8Y2hpbGQzPgorICAgICAgPGNoaWxkNC8+CisgICAgPC9jaGlsZDM+CisgIDwvZnJhZ21lbnQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvZXRjL3llYXJjaGVjay5zaCBiL3RydW5rL3NyYy9ldGMveWVhcmNoZWNrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhNTEwZmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvZXRjL3llYXJjaGVjay5zaApAQCAtMCwwICsxLDEwMSBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBTaW1wbGUgc2hlbGwgc2NyaXB0IHRoYXQgY2hlY2tzIHdoZXRoZXIgY2hhbmdlZCBmaWxlcyBjb250YWluIGEgY29weXJpZ2h0CisjIHN0YXRlbWVudCBmb3IgYSBnaXZlbiB5ZWFyLgorIworIyBSZW5hbWUgKG9yIHN5bWxpbmspIHRoaXMgc2NyaXB0IHRvIHRoZSB5ZWFyIHlvdSB3YW50IHRvIGNoZWNrLCBpLmUuIG5hbWUgaXQKKyMgMjAwMiBpZiB5b3Ugd2FudCB0byBjaGVjayBmb3IgY29weXJpZ2h0IHN0YXRlbWVudHMgdGhhdCBkbyBub3QgY29udGFpbgorIyB0aGUgeWVhciAyMDAyLgorIworIyBVc2UgdGhpcyBzY3JpcHQgaW5zdGVhZCBvZiB5b3VyIHVzdWFsIGN2cyB1cGRhdGUgY29tbWFuZC4KKyMKKyMgVXNhZ2UgWUVBUiBbcHJlY29tbWl0XQorIworIyBJZiB0aGUgb3B0aW9uYWwgYWxsIGFyZ3VtZW50IGhhcyBiZWVuIG9taXR0ZWQsIHRoZSBwcm9wb3NhbCBkaXJlY3Rvcnkgd2lsbAorIyBiZSBza2lwcGVkLgorIworCitpZiBbIC1uICIkVE1QIiBdOyB0aGVuCisgIFRFTVBfRElSPSIkVE1QIgorZWxzZQorICBpZiBbIC1uICIkVEVNUCIgXTsgdGhlbgorICAgIFRFTVBfRElSPSIkVEVNUCIKKyAgZWxzZQorICAgIFRFTVBfRElSPS90bXAKKyAgZmkKK2ZpCisKK1lFQVI9YGJhc2VuYW1lICQwYAorCitpZiBbICRZRUFSID0geWVhcmNoZWNrLnNoIF07IHRoZW4KKyAgICBZRUFSPWBkYXRlIC1SIHwgY3V0IC1kICcgJyAtZiA0YAorZmkKKworcHJlY29tbWl0X2NhbGw9ZmFsc2UKK2ZvciBhcmcgaW4gIiRAIiA7IGRvCisgIGlmIFsgIiRhcmciID0gInByZWNvbW1pdCIgXSA7IHRoZW4KKyAgICBwcmVjb21taXRfY2FsbD10cnVlCisgIGZpCitkb25lCisKK2lmIFsgLWQgIi5zdm4iIF07IHRoZW4KKyAgU0NNX0NPTU1BTkQ9c3ZuCisgIGlmICRwcmVjb21taXRfY2FsbCA7IHRoZW4KKyAgICBTQ01fQVJHUz1zdGF0dXMKKyAgICBDVVRfQVJHUz0iLWMgOC0iCisgIGVsc2UKKyAgICBTQ01fQVJHUz11cAorICAgIENVVF9BUkdTPSItYyA0LSIKKyAgZmkKK2Vsc2UKKyAgU0NNX0NPTU1BTkQ9Y3ZzCisgIFNDTV9BUkdTPSItejMgdXBkYXRlIC1kUCIKKyAgQ1VUX0FSR1M9Ii1kICcgJyAtZiAyIgorZmkKKworIiRTQ01fQ09NTUFORCIgJFNDTV9BUkdTID4gIiRURU1QX0RJUiIvdXBkYXRlLXByZWZpbHRlcgorCisjIGZpbHRlciBvdXQgYm9yaW5nIGxpbmVzCitpZiBbICIkU0NNX0NPTU1BTkQiID0gInN2biIgXTsgdGhlbgorICA8ICIkVEVNUF9ESVIiL3VwZGF0ZS1wcmVmaWx0ZXIgZmdyZXAgLXYgJ0F0IHJldmlzaW9uJyB8IGZncmVwIC12ICdVcGRhdGVkIHRvIHJldmlzaW9uJyB8IGVncmVwIC12ICdeXD8nID4gIiRURU1QX0RJUiIvdXBkYXRlCitlbHNlCisgIGNwICIkVEVNUF9ESVIiL3VwZGF0ZS1wcmVmaWx0ZXIgIiRURU1QX0RJUiIvdXBkYXRlCitmaQorCitjdXQgJENVVF9BUkdTIDwgIiRURU1QX0RJUiIvdXBkYXRlID4gIiRURU1QX0RJUiIvY2hhbmdlZC1maWxlcworCitlY2hvICJDaGFuZ2VkOiIKK2VjaG8gIj09PT09PT09IgorY2F0ICIkVEVNUF9ESVIiL2NoYW5nZWQtZmlsZXMKK2VjaG8KKworeGFyZ3MgZmdyZXAgLUwgQ29weXJpZ2h0IDwgIiRURU1QX0RJUiIvY2hhbmdlZC1maWxlcyA+ICIkVEVNUF9ESVIiL25vLWNvcHlyaWdodAorCitlY2hvICJObyBDb3B5cmlnaHQgbGluZSIKK2VjaG8gIj09PT09PT09PT09PT09PT09IgorY2F0ICIkVEVNUF9ESVIiL25vLWNvcHlyaWdodAorZWNobworCit4YXJncyBlZ3JlcCAtTCAiQ29weXJpZ2h0LiokWUVBUiIgPCAiJFRFTVBfRElSIi9jaGFuZ2VkLWZpbGVzIHwgY3V0IC1mIDEgLWQgOiA+ICIkVEVNUF9ESVIiL25vLSRZRUFSCisKK2VjaG8gIk5vIENvcHlyaWdodCBsaW5lIGZvciB5ZWFyICRZRUFSIgorZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCitjYXQgIiRURU1QX0RJUiIvbm8tJFlFQVIKKworcm0gIiRURU1QX0RJUiIvbm8tJFlFQVIgIiRURU1QX0RJUiIvbm8tY29weXJpZ2h0ICIkVEVNUF9ESVIiL2NoYW5nZWQtZmlsZXMgIiRURU1QX0RJUiIvdXBkYXRlICIkVEVNUF9ESVIiL3VwZGF0ZS1wcmVmaWx0ZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTIwNmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ2MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMuTmFtZTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ29sbGVjdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTG9hZGVyVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxvY2F0b3I7CisKKy8qKgorICogVXNlZCB0byBsb2FkIGNsYXNzZXMgd2l0aGluIGFudCB3aXRoIGEgZGlmZmVyZW50IGNsYXNzcGF0aCBmcm9tCisgKiB0aGF0IHVzZWQgdG8gc3RhcnQgYW50LiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZm9yY2UgYSBjbGFzcworICogaW50byB0aGlzIGxvYWRlciBldmVuIHdoZW4gdGhhdCBjbGFzcyBpcyBvbiB0aGUgc3lzdGVtIGNsYXNzcGF0aCBieQorICogdXNpbmcgdGhlIGZvcmNlTG9hZENsYXNzIG1ldGhvZC4gQW55IHN1YnNlcXVlbnQgY2xhc3NlcyBsb2FkZWQgYnkgdGhhdAorICogY2xhc3Mgd2lsbCB0aGVuIHVzZSB0aGlzIGxvYWRlciByYXRoZXIgdGhhbiB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlci4KKyAqCisgKiA8cD4KKyAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzbG9hZGVyIGhhcyBhIGZlYXR1cmUgdG8gYWxsb3cgbG9hZGluZworICogaW4gcmV2ZXJzZSBvcmRlciBhbmQgZm9yICJpc29sYXRpb24iLgorICogRHVlIHRvIHRoZSBmYWN0IHRoYXQgYSBudW1iZXIgb2YKKyAqIG1ldGhvZHMgaW4gamF2YS5sYW5nLkNsYXNzTG9hZGVyIGFyZSBmaW5hbCAoYXQgbGVhc3QKKyAqIGluIGphdmEgMS40IGdldFJlc291cmNlcykgdGhpcyBtZWFucyB0aGF0IHRoZQorICogY2xhc3MgaGFzIHRvIGZha2UgdGhlIGdpdmVuIHBhcmVudC4KKyAqIDwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIGltcGxlbWVudHMgU3ViQnVpbGRMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIEFuIGVudW1lcmF0aW9uIG9mIGFsbCByZXNvdXJjZXMgb2YgYSBnaXZlbiBuYW1lIGZvdW5kIHdpdGhpbiB0aGUKKyAgICAgKiBjbGFzc3BhdGggb2YgdGhpcyBjbGFzcyBsb2FkZXIuIFRoaXMgZW51bWVyYXRpb24gaXMgdXNlZCBieSB0aGUKKyAgICAgKiBDbGFzc0xvYWRlci5maW5kUmVzb3VyY2VzIG1ldGhvZCwgd2hpY2ggaXMgaW4KKyAgICAgKiB0dXJuIHVzZWQgYnkgdGhlIENsYXNzTG9hZGVyLmdldFJlc291cmNlcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAc2VlIEFudENsYXNzTG9hZGVyI2ZpbmRSZXNvdXJjZXMoU3RyaW5nKQorICAgICAqIEBzZWUgamF2YS5sYW5nLkNsYXNzTG9hZGVyI2dldFJlc291cmNlcyhTdHJpbmcpCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZUVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24geworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJlaW5nIHNlYXJjaGVkIGZvci4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlTmFtZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBuZXh0IGNsYXNzcGF0aCBlbGVtZW50IHRvIHNlYXJjaC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IHBhdGhFbGVtZW50c0luZGV4OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBuZXh0IHJlc291cmNlIHRvIHJldHVybiBpbiB0aGUgZW51bWVyYXRpb24uIElmIHRoaXMKKyAgICAgICAgICogZmllbGQgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB0aGUgZW51bWVyYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLAorICAgICAgICAgKiBpLmUuLCB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyB0byByZXR1cm4uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFVSTCBuZXh0UmVzb3VyY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW51bWVyYXRpb24gb2YgcmVzb3VyY2VzIG9mIHRoZSBnaXZlbiBuYW1lIGZvdW5kCisgICAgICAgICAqIHdpdGhpbiB0aGlzIGNsYXNzIGxvYWRlcidzIGNsYXNzcGF0aC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIHNlYXJjaCBmb3IuCisgICAgICAgICAqLworICAgICAgICBSZXNvdXJjZUVudW1lcmF0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlTmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLnBhdGhFbGVtZW50c0luZGV4ID0gMDsKKyAgICAgICAgICAgIGZpbmROZXh0UmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cyBpbiB0aGUgZW51bWVyYXRpb24gdG8KKyAgICAgICAgICogcmV0dXJuLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICAgKiAgICAgICAgIGVudW1lcmF0aW9uOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuICh0aGlzLm5leHRSZXNvdXJjZSAhPSBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHJlc291cmNlIGluIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgbmV4dCByZXNvdXJjZSBpbiB0aGUgZW51bWVyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7CisgICAgICAgICAgICBVUkwgcmV0ID0gdGhpcy5uZXh0UmVzb3VyY2U7CisgICAgICAgICAgICBmaW5kTmV4dFJlc291cmNlKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvY2F0ZXMgdGhlIG5leHQgcmVzb3VyY2Ugb2YgdGhlIGNvcnJlY3QgbmFtZSBpbiB0aGUgY2xhc3NwYXRoIGFuZAorICAgICAgICAgKiBzZXRzIDxjb2RlPm5leHRSZXNvdXJjZTwvY29kZT4gdG8gdGhlIFVSTCBvZiB0aGF0IHJlc291cmNlLiBJZiBubworICAgICAgICAgKiBtb3JlIHJlc291cmNlcyBjYW4gYmUgZm91bmQsIDxjb2RlPm5leHRSZXNvdXJjZTwvY29kZT4gaXMgc2V0IHRvCisgICAgICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmROZXh0UmVzb3VyY2UoKSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlICgocGF0aEVsZW1lbnRzSW5kZXggPCBwYXRoQ29tcG9uZW50cy5zaXplKCkpICYmICh1cmwgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIHBhdGhDb21wb25lbnQgPSAoRmlsZSkgcGF0aENvbXBvbmVudHMuZWxlbWVudEF0KHBhdGhFbGVtZW50c0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgdXJsID0gZ2V0UmVzb3VyY2VVUkwocGF0aENvbXBvbmVudCwgdGhpcy5yZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBwYXRoRWxlbWVudHNJbmRleCsrOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHBhdGggZWxlbWVudHMgd2hpY2ggYXJlIG5vdCB2YWxpZCByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvamVjdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMubmV4dFJlc291cmNlID0gdXJsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNpemUgb2YgYnVmZmVycyB0byBiZSB1c2VkIGluIHRoaXMgY2xhc3Nsb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gODE5MjsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBhcnJheSBlbGVtZW50cyBpbiBhIHRlc3QgYXJyYXkgb2Ygc3RyaW5ncworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1CRVJfT0ZfU1RSSU5HUyA9IDI1NjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21wb25lbnRzIG9mIHRoZSBjbGFzc3BhdGggdGhhdCB0aGUgY2xhc3Nsb2FkZXIgc2VhcmNoZXMKKyAgICAgKiBmb3IgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBwYXRoQ29tcG9uZW50cyAgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvamVjdCB0byB3aGljaCB0aGlzIGNsYXNzIGxvYWRlciBiZWxvbmdzLgorICAgICAqLworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgc2hvdWxkIGJlCisgICAgICogY29uc3VsdGVkIGJlZm9yZSB0cnlpbmcgdG8gbG9hZCB3aXRoIHRoaXMgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJlbnRGaXJzdCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBhcmUgdGhlIHBhY2thZ2Ugcm9vdHMgdGhhdCBhcmUgdG8gYmUgbG9hZGVkIGJ5IHRoZSBwYXJlbnQgY2xhc3MKKyAgICAgKiBsb2FkZXIgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIGlzIGJlaW5nIHNlYXJjaGVkCisgICAgICogZmlyc3Qgb3Igbm90LgorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIHN5c3RlbVBhY2thZ2VzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogVGhlc2UgYXJlIHRoZSBwYWNrYWdlIHJvb3RzIHRoYXQgYXJlIHRvIGJlIGxvYWRlZCBieSB0aGlzIGNsYXNzIGxvYWRlcgorICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciBpcyBiZWluZyBzZWFyY2hlZCBmaXJzdAorICAgICAqIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBsb2FkZXJQYWNrYWdlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgY2xhc3Nsb2FkZXIgd2lsbCBpZ25vcmUgdGhlIGJhc2UKKyAgICAgKiBjbGFzc2xvYWRlciBpZiBpdCBjYW4ndCBmaW5kIGEgY2xhc3MuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRJc29sYXRlZChib29sZWFuKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVCYXNlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50IGNsYXNzIGxvYWRlciwgaWYgb25lIGlzIGdpdmVuIG9yIGNhbiBiZSBkZXRlcm1pbmVkLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgcGFyZW50ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEEgaGFzaHRhYmxlIG9mIHppcCBmaWxlcyBvcGVuZWQgYnkgdGhlIGNsYXNzbG9hZGVyIChGaWxlIHRvIFppcEZpbGUpLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHppcEZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgLyoqIFN0YXRpYyBtYXAgb2YgamFyIGZpbGUvdGltZSB0byBtYW5pZmVzdCBjbGFzcy1wYXRoIGVudHJpZXMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNYXAvKjxTdHJpbmcsU3RyaW5nPiovIHBhdGhNYXAgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBsb2FkZXIgc2F2ZWQgd2hlbiBzZXR0aW5nIHRoZSB0aHJlYWQncyBjdXJyZW50CisgICAgICogY29udGV4dCBsb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBzYXZlZENvbnRleHRMb2FkZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdGhlIGNvbnRleHQgbG9hZGVyIGlzIGN1cnJlbnRseSBzYXZlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb250ZXh0TG9hZGVyU2F2ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBBbnQgQ2xhc3NMb2FkZXIgZm9yIGEgZ2l2ZW4gcHJvamVjdCwgd2l0aAorICAgICAqIGEgcGFyZW50IGNsYXNzbG9hZGVyIGFuZCBhbiBpbml0aWFsIGNsYXNzcGF0aC4KKyAgICAgKiBAc2luY2UgQW50IDEuNy4KKyAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgZm9yIHRoaXMgY2xhc3Nsb2FkZXIuCisgICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBjbGFzc2xvYWRlciBpcyB0bworICAgICAqICAgICAgICAgICAgICAgIGJlbG9uZy4KKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIFRoZSBjbGFzc3BhdGggdG8gdXNlIHRvIGxvYWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50LCBQcm9qZWN0IHByb2plY3QsIFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIHNldFBhcmVudChwYXJlbnQpOworICAgICAgICBzZXRDbGFzc1BhdGgoY2xhc3NwYXRoKTsKKyAgICAgICAgc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gQW50IENsYXNzIExvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgc2V0UGFyZW50KG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjbGFzc2xvYWRlciBmb3IgdGhlIGdpdmVuIHByb2plY3QgdXNpbmcgdGhlIGNsYXNzcGF0aCBnaXZlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgY2xhc3Nsb2FkZXIgaXMgdG8gYmVsb25nLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggVGhlIGNsYXNzcGF0aCB0byB1c2UgdG8gbG9hZCB0aGUgY2xhc3Nlcy4gIFRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICBpcyBjb21iaW5lZCB3aXRoIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIGluIGEgbWFubmVyCisgICAgICogICAgICAgICAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgdmFsdWUgb2YgJHtidWlsZC5zeXNjbGFzc3BhdGh9LgorICAgICAqICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZSBubyBwYXRoCisgICAgICogICAgICAgICAgICAgICAgZWxlbWVudHMgYXJlIHNldCB1cCB0byBzdGFydCB3aXRoLgorICAgICAqLworICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlcihQcm9qZWN0IHByb2plY3QsIFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIHNldFBhcmVudChudWxsKTsKKyAgICAgICAgc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgc2V0Q2xhc3NQYXRoKGNsYXNzcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNsYXNzbG9hZGVyIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCB1c2luZyB0aGUgY2xhc3NwYXRoIGdpdmVuLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNsYXNzbG9hZGVyIHRvIHdoaWNoIHVuc2F0aXNmaWVkIGxvYWRpbmcKKyAgICAgKiAgICAgICAgICAgICAgIGF0dGVtcHRzIGFyZSBkZWxlZ2F0ZWQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwKKyAgICAgKiAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgdGhlIGNsYXNzbG9hZGVyIHdoaWNoIGxvYWRlZCB0aGlzCisgICAgICogICAgICAgICAgICAgICBjbGFzcyBpcyB1c2VkIGFzIHRoZSBwYXJlbnQuCisgICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBjbGFzc2xvYWRlciBpcyB0byBiZWxvbmcuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB0byBsb2FkIHRoZSBjbGFzc2VzLgorICAgICAqICAgICAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbiB3aGljaCBjYXNlIG5vIHBhdGgKKyAgICAgKiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFyZSBzZXQgdXAgdG8gc3RhcnQgd2l0aC4KKyAgICAgKiBAcGFyYW0gcGFyZW50Rmlyc3QgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGluZGljYXRlcyB0aGF0IHRoZSBwYXJlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY2xhc3Nsb2FkZXIgc2hvdWxkIGJlIGNvbnN1bHRlZCAgYmVmb3JlIHRyeWluZyB0bworICAgICAqICAgICAgICAgICAgICAgICAgICBsb2FkIHRoZSBhIGNsYXNzIHRocm91Z2ggdGhpcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIEFudENsYXNzTG9hZGVyKAorICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQsIFByb2plY3QgcHJvamVjdCwgUGF0aCBjbGFzc3BhdGgsIGJvb2xlYW4gcGFyZW50Rmlyc3QpIHsKKyAgICAgICAgdGhpcyhwcm9qZWN0LCBjbGFzc3BhdGgpOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFBhcmVudChwYXJlbnQpOworICAgICAgICB9CisgICAgICAgIHNldFBhcmVudEZpcnN0KHBhcmVudEZpcnN0KTsKKyAgICAgICAgYWRkSmF2YUxpYnJhcmllcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjbGFzc2xvYWRlciBmb3IgdGhlIGdpdmVuIHByb2plY3QgdXNpbmcgdGhlIGNsYXNzcGF0aCBnaXZlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgY2xhc3Nsb2FkZXIgaXMgdG8gYmVsb25nLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggVGhlIGNsYXNzcGF0aCB0byB1c2UgdG8gbG9hZCB0aGUgY2xhc3Nlcy4gTWF5IGJlCisgICAgICogICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZSBubyBwYXRoCisgICAgICogICAgICAgICAgICAgICAgICBlbGVtZW50cyBhcmUgc2V0IHVwIHRvIHN0YXJ0IHdpdGguCisgICAgICogQHBhcmFtIHBhcmVudEZpcnN0IElmIDxjb2RlPnRydWU8L2NvZGU+LCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFyZW50CisgICAgICogICAgICAgICAgICAgICAgICAgIGNsYXNzbG9hZGVyIHNob3VsZCBiZSBjb25zdWx0ZWQgYmVmb3JlIHRyeWluZyB0bworICAgICAqICAgICAgICAgICAgICAgICAgICBsb2FkIHRoZSBhIGNsYXNzIHRocm91Z2ggdGhpcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIEFudENsYXNzTG9hZGVyKFByb2plY3QgcHJvamVjdCwgUGF0aCBjbGFzc3BhdGgsIGJvb2xlYW4gcGFyZW50Rmlyc3QpIHsKKyAgICAgICAgdGhpcyhudWxsLCBwcm9qZWN0LCBjbGFzc3BhdGgsIHBhcmVudEZpcnN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGNsYXNzIGxvYWRlci4gVGhlIGNsYXNzbG9hZGVyIHNob3VsZCBiZSBjb25maWd1cmVkCisgICAgICogd2l0aCBwYXRoIGVsZW1lbnRzIHRvIHNwZWNpZnkgd2hlcmUgdGhlIGxvYWRlciBpcyB0byBsb29rIGZvcgorICAgICAqIGNsYXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY2xhc3Nsb2FkZXIgdG8gd2hpY2ggdW5zYXRpc2ZpZWQgbG9hZGluZworICAgICAqICAgICAgICAgICAgICAgYXR0ZW1wdHMgYXJlIGRlbGVnYXRlZC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB0aGUgY2xhc3Nsb2FkZXIgd2hpY2ggbG9hZGVkIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgIGNsYXNzIGlzIHVzZWQgYXMgdGhlIHBhcmVudC4KKyAgICAgKiBAcGFyYW0gcGFyZW50Rmlyc3QgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGluZGljYXRlcyB0aGF0IHRoZSBwYXJlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY2xhc3Nsb2FkZXIgc2hvdWxkIGJlIGNvbnN1bHRlZCBiZWZvcmUgdHJ5aW5nIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgIGxvYWQgdGhlIGEgY2xhc3MgdGhyb3VnaCB0aGlzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50LCBib29sZWFuIHBhcmVudEZpcnN0KSB7CisgICAgICAgIHNldFBhcmVudChwYXJlbnQpOworICAgICAgICBwcm9qZWN0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5wYXJlbnRGaXJzdCA9IHBhcmVudEZpcnN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcyBsb2FkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvamVjdC5hZGRCdWlsZExpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gc2VhcmNoIGZvciBjbGFzc2VzIHRvIGxvYWQuIFRoaXMgc2hvdWxkIG5vdCBiZQorICAgICAqIGNoYW5nZWQgb25jZSB0aGUgY2xhc3Nsb2FkZXIgc3RhcnRzIHRvIHNlcnZlciBjbGFzc2VzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIHRoZSBzZWFyY2ggY2xhc3NwYXRoIGNvbnNpc3Rpbmcgb2YgZGlyZWN0b3JpZXMgYW5kCisgICAgICogICAgICAgIGphci96aXAgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NQYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIHBhdGhDb21wb25lbnRzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgUGF0aCBhY3R1YWxDbGFzc3BhdGggPSBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhFbGVtZW50cyA9IGFjdHVhbENsYXNzcGF0aC5saXN0KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhFbGVtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFBhdGhFbGVtZW50KHBhdGhFbGVtZW50c1tpXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgcGF0aCBlbGVtZW50cyB3aGljaCBhcmUgaW52YWxpZAorICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSB0byB0aGUgcHJvamVjdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFyZW50IGZvciB0aGlzIGNsYXNzIGxvYWRlci4gVGhpcyBpcyB0aGUgY2xhc3MgbG9hZGVyIHRvIHdoaWNoCisgICAgICogdGhpcyBjbGFzcyBsb2FkZXIgd2lsbCBkZWxlZ2F0ZSB0byBsb2FkIGNsYXNzZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudCA9PSBudWxsID8gQW50Q2xhc3NMb2FkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSA6IHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9sIHdoZXRoZXIgY2xhc3MgbG9va3VwIGlzIGRlbGVnYXRlZCB0byB0aGUgcGFyZW50IGxvYWRlciBmaXJzdAorICAgICAqIG9yIGFmdGVyIHRoaXMgbG9hZGVyLiBVc2Ugd2l0aCBleHRyZW1lIGNhdXRpb24uIFNldHRpbmcgdGhpcyB0bworICAgICAqIGZhbHNlIHZpb2xhdGVzIHRoZSBjbGFzcyBsb2FkZXIgaGllcmFyY2h5IGFuZCBjYW4gbGVhZCB0byBMaW5rYWdlIGVycm9ycworICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudEZpcnN0IGlmIHRydWUsIGRlbGVnYXRlIGluaXRpYWwgY2xhc3Mgc2VhcmNoIHRvIHRoZSBwYXJlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY2xhc3Nsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50Rmlyc3QoYm9vbGVhbiBwYXJlbnRGaXJzdCkgeworICAgICAgICB0aGlzLnBhcmVudEZpcnN0ID0gcGFyZW50Rmlyc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9ncyBhIG1lc3NhZ2UgdGhyb3VnaCB0aGUgcHJvamVjdCBvYmplY3QgaWYgb25lIGhhcyBiZWVuIHByb3ZpZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9nLgorICAgICAqICAgICAgICAgICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIGxvZ2dpbmcgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvamVjdC5sb2cobWVzc2FnZSwgcHJpb3JpdHkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCB0aHJlYWQncyBjb250ZXh0IGxvYWRlciB0byB0aGlzIGNsYXNzbG9hZGVyLCBzdG9yaW5nCisgICAgICogdGhlIGN1cnJlbnQgbG9hZGVyIHZhbHVlIGZvciBsYXRlciByZXNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGhyZWFkQ29udGV4dExvYWRlcigpIHsKKyAgICAgICAgaWYgKGlzQ29udGV4dExvYWRlclNhdmVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvbnRleHQgbG9hZGVyIGhhcyBub3QgYmVlbiByZXNldCIpOworICAgICAgICB9CisgICAgICAgIGlmIChMb2FkZXJVdGlscy5pc0NvbnRleHRMb2FkZXJBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgc2F2ZWRDb250ZXh0TG9hZGVyID0gTG9hZGVyVXRpbHMuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSB0aGlzOworICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiAib25seSIuZXF1YWxzKHByb2plY3QuZ2V0UHJvcGVydHkoImJ1aWxkLnN5c2NsYXNzcGF0aCIpKSkgeworICAgICAgICAgICAgICAgIGxvYWRlciA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9hZGVyVXRpbHMuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgICAgICAgICBpc0NvbnRleHRMb2FkZXJTYXZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgY29udGV4dCBsb2FkZXIgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0VGhyZWFkQ29udGV4dExvYWRlcigpIHsKKyAgICAgICAgaWYgKExvYWRlclV0aWxzLmlzQ29udGV4dExvYWRlckF2YWlsYWJsZSgpICYmIGlzQ29udGV4dExvYWRlclNhdmVkKSB7CisgICAgICAgICAgICBMb2FkZXJVdGlscy5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoc2F2ZWRDb250ZXh0TG9hZGVyKTsKKyAgICAgICAgICAgIHNhdmVkQ29udGV4dExvYWRlciA9IG51bGw7CisgICAgICAgICAgICBpc0NvbnRleHRMb2FkZXJTYXZlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGVsZW1lbnQgdG8gdGhlIGNsYXNzcGF0aCB0byBiZSBzZWFyY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoRWxlbWVudCBUaGUgcGF0aCBlbGVtZW50IHRvIGFkZC4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBwYXRoIGVsZW1lbnQgY2Fubm90IGJlIHJlc29sdmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0IHRoZSBwcm9qZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBhdGhFbGVtZW50KFN0cmluZyBwYXRoRWxlbWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBwYXRoQ29tcG9uZW50ID0gcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5yZXNvbHZlRmlsZShwYXRoRWxlbWVudCkgOiBuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICBwYXRoRWxlbWVudCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhZGRQYXRoRmlsZShwYXRoQ29tcG9uZW50KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcGF0aCBjb21wb25lbnQuCisgICAgICogVGhpcyBzaW1wbHkgYWRkcyB0aGUgZmlsZSwgdW5saWtlIGFkZFBhdGhFbGVtZW50CisgICAgICogaXQgZG9lcyBub3Qgb3BlbiBqYXIgZmlsZXMgYW5kIGxvYWQgZmlsZXMgZnJvbQorICAgICAqIHRoZWlyIENMQVNTUEFUSCBlbnRyeSBpbiB0aGUgbWFuaWZlc3QgZmlsZS4KKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgamFyIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQ29tcG9uZW50KEZpbGUgZmlsZSkgeworICAgICAgICBpZiAocGF0aENvbXBvbmVudHMuY29udGFpbnMoZmlsZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwYXRoQ29tcG9uZW50cy5hZGRFbGVtZW50KGZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbGUgdG8gdGhlIHBhdGguCisgICAgICogUmVhZHMgdGhlIG1hbmlmZXN0LCBpZiBhdmFpbGFibGUsIGFuZCBhZGRzIGFueSBhZGRpdGlvbmFsIGNsYXNzIHBhdGggamFycworICAgICAqIHNwZWNpZmllZCBpbiB0aGUgbWFuaWZlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aENvbXBvbmVudCB0aGUgZmlsZSB3aGljaCBpcyB0byBiZSBhZGRlZCB0byB0aGUgcGF0aCBmb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGlzIGNsYXNzIGxvYWRlcgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBkYXRhIG5lZWRlZCBmcm9tIHRoZSBmaWxlIGNhbm5vdCBiZSByZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFBhdGhGaWxlKEZpbGUgcGF0aENvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcGF0aENvbXBvbmVudHMuYWRkRWxlbWVudChwYXRoQ29tcG9uZW50KTsKKyAgICAgICAgaWYgKHBhdGhDb21wb25lbnQuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGFic1BhdGhQbHVzVGltZUFuZExlbmd0aCA9IHBhdGhDb21wb25lbnQuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICArIHBhdGhDb21wb25lbnQubGFzdE1vZGlmaWVkKCkgKyAiLSIgKyBwYXRoQ29tcG9uZW50Lmxlbmd0aCgpOworICAgICAgICBTdHJpbmcgY2xhc3NwYXRoID0gKFN0cmluZykgcGF0aE1hcC5nZXQoYWJzUGF0aFBsdXNUaW1lQW5kTGVuZ3RoKTsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBaaXBGaWxlIGphckZpbGUgPSBudWxsOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gbWFuaWZlc3RTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqYXJGaWxlID0gbmV3IFppcEZpbGUocGF0aENvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgbWFuaWZlc3RTdHJlYW0gPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKG5ldyBaaXBFbnRyeSgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSk7CisKKyAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3RTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFJlYWRlciBtYW5pZmVzdFJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihtYW5pZmVzdFN0cmVhbSwgIlVURi04Iik7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWFuaWZlc3QgbWFuaWZlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hbmlmZXN0KG1hbmlmZXN0UmVhZGVyKTsKKyAgICAgICAgICAgICAgICBjbGFzc3BhdGggPSBtYW5pZmVzdC5nZXRNYWluU2VjdGlvbigpLmdldEF0dHJpYnV0ZVZhbHVlKCJDbGFzcy1QYXRoIik7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYW5pZmVzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShtYW5pZmVzdFN0cmVhbSk7CisgICAgICAgICAgICAgICAgaWYgKGphckZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBqYXJGaWxlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xhc3NwYXRoID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRoTWFwLnB1dChhYnNQYXRoUGx1c1RpbWVBbmRMZW5ndGgsIGNsYXNzcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISIiLmVxdWFscyhjbGFzc3BhdGgpKSB7CisgICAgICAgICAgICBVUkwgYmFzZVVSTCA9IEZJTEVfVVRJTFMuZ2V0RmlsZVVSTChwYXRoQ29tcG9uZW50KTsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NwYXRoKTsKKyAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NwYXRoRWxlbWVudCA9IHN0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIFVSTCBsaWJyYXJ5VVJMID0gbmV3IFVSTChiYXNlVVJMLCBjbGFzc3BhdGhFbGVtZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpYnJhcnlVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nIGphciBsaWJyYXJ5ICIgKyBjbGFzc3BhdGhFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNpbmNlIG9ubHkgcmVsYXRpdmUgVVJMcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMiICsgIiBsb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGRlY29kZWRQYXRoID0gTG9jYXRvci5kZWNvZGVVcmkobGlicmFyeVVSTC5nZXRGaWxlKCkpOworICAgICAgICAgICAgICAgIEZpbGUgbGlicmFyeUZpbGUgPSBuZXcgRmlsZShkZWNvZGVkUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKGxpYnJhcnlGaWxlLmV4aXN0cygpICYmICFpc0luUGF0aChsaWJyYXJ5RmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUGF0aEZpbGUobGlicmFyeUZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCB0aGlzIGNsYXNzbG9hZGVyIHdpbGwgY29uc3VsdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzcGF0aCB1c2VkIGZvciB0aGlzIGNsYXNzbG9hZGVyLCB3aXRoIGVsZW1lbnRzCisgICAgICogICAgICAgICBzZXBhcmF0ZWQgYnkgdGhlIHBhdGggc2VwYXJhdG9yIGZvciB0aGUgc3lzdGVtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJvb2xlYW4gZmlyc3RQYXNzID0gdHJ1ZTsKKyAgICAgICAgRW51bWVyYXRpb24gY29tcG9uZW50RW51bSA9IHBhdGhDb21wb25lbnRzLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChjb21wb25lbnRFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0UGFzcykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaXJzdFBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgoKEZpbGUpIGNvbXBvbmVudEVudW0ubmV4dEVsZW1lbnQoKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIGNsYXNzbG9hZGVyIHNob3VsZCBydW4gaW4gaXNvbGF0ZWQgbW9kZS4gSW4KKyAgICAgKiBpc29sYXRlZCBtb2RlLCBjbGFzc2VzIG5vdCBmb3VuZCBvbiB0aGUgZ2l2ZW4gY2xhc3NwYXRoIHdpbGwKKyAgICAgKiBub3QgYmUgcmVmZXJyZWQgdG8gdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgYnV0IHdpbGwgY2F1c2UgYQorICAgICAqIENsYXNzTm90Rm91bmRFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNvbGF0ZWQgV2hldGhlciBvciBub3QgdGhpcyBjbGFzc2xvYWRlciBzaG91bGQgcnVuIGluCisgICAgICogICAgICAgICAgICAgICAgIGlzb2xhdGVkIG1vZGUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElzb2xhdGVkKGJvb2xlYW4gaXNvbGF0ZWQpIHsKKyAgICAgICAgaWdub3JlQmFzZSA9IGlzb2xhdGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlcyBpbml0aWFsaXphdGlvbiBvZiBhIGNsYXNzIGluIGEgSkRLIDEuMSBjb21wYXRpYmxlLCBhbGJlaXQgaGFja3kKKyAgICAgKiB3YXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlQ2xhc3MgVGhlIGNsYXNzIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICogICAgICAgICAgICAgVXNlIENsYXNzLmZvck5hbWUgd2l0aCBpbml0aWFsaXplPXRydWUgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUNsYXNzKENsYXNzIHRoZUNsYXNzKSB7CisgICAgICAgIC8vICoqKkhBQ0sqKiogV2UgYXNrIHRoZSBWTSB0byBjcmVhdGUgYW4gaW5zdGFuY2UKKyAgICAgICAgLy8gYnkgdm9sdW50YXJpbHkgcHJvdmlkaW5nIGlsbGVnYWwgYXJndW1lbnRzIHRvIGZvcmNlCisgICAgICAgIC8vIHRoZSBWTSB0byBydW4gdGhlIGNsYXNzJyBzdGF0aWMgaW5pdGlhbGl6ZXIsIHdoaWxlCisgICAgICAgIC8vIGF0IHRoZSBzYW1lIHRpbWUgbm90IHJ1bm5pbmcgYSB2YWxpZCBjb25zdHJ1Y3Rvci4KKworICAgICAgICBmaW5hbCBDb25zdHJ1Y3RvcltdIGNvbnMgPSB0aGVDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOworICAgICAgICAvL0F0IGxlYXN0IG9uZSBjb25zdHJ1Y3RvciBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZXJlLCBidXQgY2hlY2sgYW55d2F5LgorICAgICAgICBpZiAoY29ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29ucy5sZW5ndGggPiAwICYmIGNvbnNbMF0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHN0cnMgPSBuZXcgU3RyaW5nW05VTUJFUl9PRl9TVFJJTkdTXTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25zWzBdLm5ld0luc3RhbmNlKChPYmplY3RbXSkgc3Rycyk7CisgICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGluZyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIGJ5IHRoaXMgY2FsbDoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOiB3cm9uZyBudW1iZXIgb2YgQXJndW1lbnRzCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIC0gd2UgYXJlIGludGVyZXN0ZWQgb25seSBpbiB0aGUgc2lkZQorICAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3QgLSB0aGF0IG9mIGdldHRpbmcgdGhlIHN0YXRpYyBpbml0aWFsaXplcnMKKyAgICAgICAgICAgICAgICAgICAgLy8gaW52b2tlZC4gIEFzIHdlIGRvIG5vdCB3YW50IHRvIGNhbGwgYSB2YWxpZAorICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3RvciB0byBnZXQgdGhpcyBzaWRlIGVmZmVjdCwgYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCBpcyBtYWRlIHRvIGNhbGwgYSBob3BlZnVsbHkKKyAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCBjb25zdHJ1Y3RvciAtIGNvbWUgb24sIG5vYm9keQorICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBoYXZlIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBpbgorICAgICAgICAgICAgICAgICAgICAvLyAyNTYgU3RyaW5nIGFyZ3VtZW50cyA7LSkKKyAgICAgICAgICAgICAgICAgICAgLy8gKEluIGZhY3QsIHRoZXkgY2FuJ3QgLSBhY2NvcmRpbmcgdG8gSlZNIHNwZWMKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VjdGlvbiA0LjEwLCB0aGUgbnVtYmVyIG9mIG1ldGhvZCBwYXJhbWV0ZXJzIGlzIGxpbWl0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gMjU1IGJ5IHRoZSBkZWZpbml0aW9uIG9mIGEgbWV0aG9kIGRlc2NyaXB0b3IuCisgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9ycyBjb3VudCBhcyBtZXRob2RzIGhlcmUuKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYWNrYWdlIHJvb3QgdG8gdGhlIGxpc3Qgb2YgcGFja2FnZXMgd2hpY2ggbXVzdCBiZSBsb2FkZWQgb24gdGhlCisgICAgICogcGFyZW50IGxvYWRlci4KKyAgICAgKgorICAgICAqIEFsbCBzdWJwYWNrYWdlcyBhcmUgYWxzbyBpbmNsdWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlUm9vdCBUaGUgcm9vdCBvZiBhbGwgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU3lzdGVtUGFja2FnZVJvb3QoU3RyaW5nIHBhY2thZ2VSb290KSB7CisgICAgICAgIHN5c3RlbVBhY2thZ2VzLmFkZEVsZW1lbnQocGFja2FnZVJvb3QgKyAocGFja2FnZVJvb3QuZW5kc1dpdGgoIi4iKSA/ICIiIDogIi4iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhY2thZ2Ugcm9vdCB0byB0aGUgbGlzdCBvZiBwYWNrYWdlcyB3aGljaCBtdXN0IGJlIGxvYWRlZCB1c2luZworICAgICAqIHRoaXMgbG9hZGVyLgorICAgICAqCisgICAgICogQWxsIHN1YnBhY2thZ2VzIGFyZSBhbHNvIGluY2x1ZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VSb290IFRoZSByb290IG9mIGFsbCBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2FkZXJQYWNrYWdlUm9vdChTdHJpbmcgcGFja2FnZVJvb3QpIHsKKyAgICAgICAgbG9hZGVyUGFja2FnZXMuYWRkRWxlbWVudChwYWNrYWdlUm9vdCArIChwYWNrYWdlUm9vdC5lbmRzV2l0aCgiLiIpID8gIiIgOiAiLiIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhIGNsYXNzIHRocm91Z2ggdGhpcyBjbGFzcyBsb2FkZXIgZXZlbiBpZiB0aGF0IGNsYXNzIGlzIGF2YWlsYWJsZQorICAgICAqIG9uIHRoZSBwYXJlbnQgY2xhc3NwYXRoLgorICAgICAqCisgICAgICogVGhpcyBlbnN1cmVzIHRoYXQgYW55IGNsYXNzZXMgd2hpY2ggYXJlIGxvYWRlZCBieSB0aGUgcmV0dXJuZWQgY2xhc3MKKyAgICAgKiB3aWxsIHVzZSB0aGlzIGNsYXNzbG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgbG9hZGVkLgorICAgICAqICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBDbGFzcyBvYmplY3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgcmVxdWVzdGVkIGNsYXNzIGRvZXMgbm90IGV4aXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoaXMgbG9hZGVyJ3MgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBmb3JjZUxvYWRDbGFzcyhTdHJpbmcgY2xhc3NuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiZm9yY2UgbG9hZGluZyAiICsgY2xhc3NuYW1lLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBmaW5kTG9hZGVkQ2xhc3MoY2xhc3NuYW1lKTsKKworICAgICAgICBpZiAodGhlQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhlQ2xhc3MgPSBmaW5kQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhlQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYSBjbGFzcyB0aHJvdWdoIHRoaXMgY2xhc3MgbG9hZGVyIGJ1dCBkZWZlciB0byB0aGUgcGFyZW50IGNsYXNzCisgICAgICogbG9hZGVyLgorICAgICAqCisgICAgICogVGhpcyBlbnN1cmVzIHRoYXQgaW5zdGFuY2VzIG9mIHRoZSByZXR1cm5lZCBjbGFzcyB3aWxsIGJlIGNvbXBhdGlibGUKKyAgICAgKiB3aXRoIGluc3RhbmNlcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgb24gdGhlIHBhcmVudAorICAgICAqIGxvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGxvYWRlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVxdWlyZWQgQ2xhc3Mgb2JqZWN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIHJlcXVlc3RlZCBjbGFzcyBkb2VzIG5vdCBleGlzdAorICAgICAqIG9uIHRoaXMgbG9hZGVyJ3MgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBmb3JjZUxvYWRTeXN0ZW1DbGFzcyhTdHJpbmcgY2xhc3NuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiZm9yY2Ugc3lzdGVtIGxvYWRpbmcgIiArIGNsYXNzbmFtZSwgUHJvamVjdC5NU0dfREVCVUcpOworCisgICAgICAgIENsYXNzIHRoZUNsYXNzID0gZmluZExvYWRlZENsYXNzKGNsYXNzbmFtZSk7CisKKyAgICAgICAgaWYgKHRoZUNsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoZUNsYXNzID0gZmluZEJhc2VDbGFzcyhjbGFzc25hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGVDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyZWFtIHRvIHJlYWQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCBhIHN0cmVhbSBpcyByZXF1aXJlZC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJlYW0gdG8gdGhlIHJlcXVpcmVkIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICAgICAqICAgICAgICAgcmVzb3VyY2UgY2Fubm90IGJlIGZvdW5kIG9uIHRoZSBsb2FkZXIncyBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVzb3VyY2VTdHJlYW0gPSBudWxsOworICAgICAgICBpZiAoaXNQYXJlbnRGaXJzdChuYW1lKSkgeworICAgICAgICAgICAgcmVzb3VyY2VTdHJlYW0gPSBsb2FkQmFzZVJlc291cmNlKG5hbWUpOworICAgICAgICAgICAgaWYgKHJlc291cmNlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2coIlJlc291cmNlU3RyZWFtIGZvciAiICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICIgbG9hZGVkIGZyb20gcGFyZW50IGxvYWRlciIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VTdHJlYW0gPSBsb2FkUmVzb3VyY2UobmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJSZXNvdXJjZVN0cmVhbSBmb3IgIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBsb2FkZWQgZnJvbSBhbnQgbG9hZGVyIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc291cmNlU3RyZWFtID0gbG9hZFJlc291cmNlKG5hbWUpOworICAgICAgICAgICAgaWYgKHJlc291cmNlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2coIlJlc291cmNlU3RyZWFtIGZvciAiICsgbmFtZSArICIgbG9hZGVkIGZyb20gYW50IGxvYWRlciIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VTdHJlYW0gPSBsb2FkQmFzZVJlc291cmNlKG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiUmVzb3VyY2VTdHJlYW0gZm9yICIgKyBuYW1lICsgIiBsb2FkZWQgZnJvbSBwYXJlbnQgbG9hZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZXNvdXJjZVN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkNvdWxkbid0IGxvYWQgUmVzb3VyY2VTdHJlYW0gZm9yICIgKyBuYW1lLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc291cmNlU3RyZWFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJlYW0gdG8gcmVhZCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIG5hbWUgZnJvbSB0aGlzIGxvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggYSBzdHJlYW0gaXMgcmVxdWlyZWQuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIHRvIHRoZSByZXF1aXJlZCByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqICAgICAgICAgdGhlIHJlc291cmNlIGNhbm5vdCBiZSBmb3VuZCBvbiB0aGUgbG9hZGVyJ3MgY2xhc3NwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbG9hZFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIC8vIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBjb21wb25lbnRzIG9mIHRoZSBwYXRoIHRvIHNlZSBpZiB3ZSBjYW4KKyAgICAgICAgLy8gZmluZCB0aGUgY2xhc3Mgd2Ugd2FudC4KKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKworICAgICAgICBFbnVtZXJhdGlvbiBlID0gcGF0aENvbXBvbmVudHMuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkgJiYgc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgcGF0aENvbXBvbmVudCA9IChGaWxlKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBzdHJlYW0gPSBnZXRSZXNvdXJjZVN0cmVhbShwYXRoQ29tcG9uZW50LCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyZWFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgc3lzdGVtIHJlc291cmNlICh3aGljaCBzaG91bGQgYmUgbG9hZGVkIGZyb20gdGhlIHBhcmVudAorICAgICAqIGNsYXNzbG9hZGVyKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeXN0ZW0gcmVzb3VyY2UgdG8gbG9hZC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJlYW0gdG8gdGhlIG5hbWVkIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqICAgICAgICAgdGhlIHJlc291cmNlIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGxvYWRCYXNlUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudCA9PSBudWxsID8gZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShuYW1lKSA6IHBhcmVudC5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW5wdXRzdHJlYW0gdG8gYSBnaXZlbiByZXNvdXJjZSBpbiB0aGUgZ2l2ZW4gZmlsZSB3aGljaCBtYXkKKyAgICAgKiBlaXRoZXIgYmUgYSBkaXJlY3Rvcnkgb3IgYSB6aXAgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIChkaXJlY3Rvcnkgb3IgamFyKSBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZQorICAgICAqICAgICAgICAgICAgIHJlc291cmNlLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggYSBzdHJlYW0gaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJlYW0gdG8gdGhlIHJlcXVpcmVkIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisgICAgICogICAgICAgICB0aGUgcmVzb3VyY2UgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBnaXZlbiBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VTdHJlYW0oRmlsZSBmaWxlLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSAoWmlwRmlsZSkgemlwRmlsZXMuZ2V0KGZpbGUpOworICAgICAgICAgICAgaWYgKHppcEZpbGUgPT0gbnVsbCAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIHJlc291cmNlID0gbmV3IEZpbGUoZmlsZSwgcmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHppcEZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZXMucHV0KGZpbGUsIHppcEZpbGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy90byBlbGltaW5hdGUgYSByYWNlIGNvbmRpdGlvbiwgcmV0cmlldmUgdGhlIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIC8vdGhhdCBpcyBpbiB0aGUgaGFzaCB0YWJsZSB1bmRlciB0aGF0IGZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgIHppcEZpbGUgPSAoWmlwRmlsZSkgemlwRmlsZXMuZ2V0KGZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJJZ25vcmluZyBFeGNlcHRpb24gIiArIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHJlYWRpbmcgcmVzb3VyY2UgIiArIHJlc291cmNlTmFtZSArICIgZnJvbSAiICsgZmlsZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBvciBub3QgdGhlIHBhcmVudCBjbGFzc2xvYWRlciBzaG91bGQgYmUgY2hlY2tlZCBmb3IgYQorICAgICAqIHJlc291cmNlIGJlZm9yZSB0aGlzIG9uZS4gSWYgdGhlIHJlc291cmNlIG1hdGNoZXMgYm90aCB0aGUgInVzZSBwYXJlbnQKKyAgICAgKiBjbGFzc2xvYWRlciBmaXJzdCIgYW5kIHRoZSAidXNlIHRoaXMgY2xhc3Nsb2FkZXIgZmlyc3QiIGxpc3RzLCB0aGUgbGF0dGVyCisgICAgICogdGFrZXMgcHJpb3JpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lCisgICAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gY2hlY2suIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHBhcmVudCBjbGFzc2xvYWRlciBzaG91bGQgYmUgY2hlY2tlZCBmb3IgYQorICAgICAqICAgICAgICAgcmVzb3VyY2UgYmVmb3JlIHRoaXMgb25lIGlzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1BhcmVudEZpcnN0KFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKyAgICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZ2xvYmFsIHNldHRpbmcgYW5kIHRoZW4gc2VlCisgICAgICAgIC8vIGlmIHRoaXMgY2xhc3MgYmVsb25ncyB0byBhIHBhY2thZ2Ugd2hpY2ggaGFzIGJlZW4KKyAgICAgICAgLy8gZGVzaWduYXRlZCB0byB1c2UgYSBzcGVjaWZpYyBsb2FkZXIgZmlyc3QKKyAgICAgICAgLy8gKHRoaXMgb25lIG9yIHRoZSBwYXJlbnQgb25lKQorCisgICAgICAgIC8vIFhYWCAtIHNob3VsZG4ndCB0aGlzIGFsd2F5cyByZXR1cm4gZmFsc2UgaW4gaXNvbGF0ZWQgbW9kZT8KKworICAgICAgICBib29sZWFuIHVzZVBhcmVudEZpcnN0ID0gcGFyZW50Rmlyc3Q7CisKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gc3lzdGVtUGFja2FnZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZU5hbWUuc3RhcnRzV2l0aChwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB1c2VQYXJlbnRGaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gbG9hZGVyUGFja2FnZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZU5hbWUuc3RhcnRzV2l0aChwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB1c2VQYXJlbnRGaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB1c2VQYXJlbnRGaXJzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGZvciBpc29sYXRlZCByZXNvdXJjZSBzZWFjaGluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSByb290IGNsYXNzbG9hZGVyIG9mIEFudENsYXNzTG9hZGVyLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgZ2V0Um9vdExvYWRlcigpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgcmV0ID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICB3aGlsZSAocmV0ICE9IG51bGwgJiYgcmV0LmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldCA9IHJldC5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBBIHJlc291cmNlIGlzCisgICAgICogc29tZSBkYXRhIChpbWFnZXMsIGF1ZGlvLCB0ZXh0LCBldGMpIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGJ5IGNsYXNzCisgICAgICogY29kZSBpbiBhIHdheSB0aGF0IGlzIGluZGVwZW5kZW50IG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggYSBzdHJlYW0gaXMgcmVxdWlyZWQuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgVVJMIGZvciByZWFkaW5nIHRoZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCisgICAgICogICAgICAgICByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgdGhlIGNhbGxlciBkb2Vzbid0IGhhdmUKKyAgICAgKiAgICAgICAgIGFkZXF1YXRlIHByaXZpbGVnZXMgdG8gZ2V0IHRoZSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIC8vIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBjb21wb25lbnRzIG9mIHRoZSBwYXRoIHRvIHNlZSBpZgorICAgICAgICAvLyB3ZSBjYW4gZmluZCB0aGUgY2xhc3Mgd2Ugd2FudC4KKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIGlmIChpc1BhcmVudEZpcnN0KG5hbWUpKSB7CisgICAgICAgICAgICB1cmwgPSBwYXJlbnQgPT0gbnVsbCA/IHN1cGVyLmdldFJlc291cmNlKG5hbWUpIDogcGFyZW50LmdldFJlc291cmNlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJSZXNvdXJjZSAiICsgbmFtZSArICIgbG9hZGVkIGZyb20gcGFyZW50IGxvYWRlciIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRyeSBhbmQgbG9hZCBmcm9tIHRoaXMgbG9hZGVyIGlmIHRoZSBwYXJlbnQgZWl0aGVyIGRpZG4ndCBmaW5kCisgICAgICAgICAgICAvLyBpdCBvciB3YXNuJ3QgY29uc3VsdGVkLgorICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHBhdGhDb21wb25lbnRzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSAmJiB1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGUgcGF0aENvbXBvbmVudCA9IChGaWxlKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgdXJsID0gZ2V0UmVzb3VyY2VVUkwocGF0aENvbXBvbmVudCwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiUmVzb3VyY2UgIiArIG5hbWUgKyAiIGxvYWRlZCBmcm9tIGFudCBsb2FkZXIiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCAmJiAhaXNQYXJlbnRGaXJzdChuYW1lKSkgeworICAgICAgICAgICAgLy8gdGhpcyBsb2FkZXIgd2FzIGZpcnN0IGJ1dCBpdCBkaWRuJ3QgZmluZCBpdCAtIHRyeSB0aGUgcGFyZW50CisgICAgICAgICAgICBpZiAoaWdub3JlQmFzZSkgeworICAgICAgICAgICAgICAgIHVybCA9IGdldFJvb3RMb2FkZXIoKSA9PSBudWxsID8gbnVsbCA6IGdldFJvb3RMb2FkZXIoKS5nZXRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXJsID0gcGFyZW50ID09IG51bGwgPyBzdXBlci5nZXRSZXNvdXJjZShuYW1lKSA6IHBhcmVudC5nZXRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygiUmVzb3VyY2UgIiArIG5hbWUgKyAiIGxvYWRlZCBmcm9tIHBhcmVudCBsb2FkZXIiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkNvdWxkbid0IGxvYWQgUmVzb3VyY2UgIiArIG5hbWUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgVVJMcyByZXByZXNlbnRpbmcgYWxsIHRoZSByZXNvdXJjZXMgd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBuYW1lIGJ5IHNlYXJjaGluZyB0aGUgY2xhc3MgbG9hZGVyJ3MgY2xhc3NwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHJlc291cmNlIG5hbWUgdG8gc2VhcmNoIGZvci4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIFVSTHMgZm9yIHRoZSByZXNvdXJjZXMKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIEkvTyBlcnJvcnMgb2NjdXJzIChjYW4ndCBoYXBwZW4pCisgICAgICovCisgICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uLyo8VVJMPiovIGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEVudW1lcmF0aW9uLyo8VVJMPiovIG1pbmUgPSBuZXcgUmVzb3VyY2VFbnVtZXJhdGlvbihuYW1lKTsKKyAgICAgICAgRW51bWVyYXRpb24vKjxVUkw+Ki8gYmFzZTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSBnZXRQYXJlbnQoKSkgeworICAgICAgICAgICAgLy8gRGVsZWdhdGUgdG8gdGhlIHBhcmVudDoKKyAgICAgICAgICAgIGJhc2UgPSBwYXJlbnQuZ2V0UmVzb3VyY2VzKG5hbWUpOworICAgICAgICAgICAgLy8gTm90ZTogY291bGQgY2F1c2Ugb3ZlcmxhcHMgaW4gY2FzZSBDbGFzc0xvYWRlci50aGlzLnBhcmVudCBoYXMgbWF0Y2hlcy4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENsYXNzTG9hZGVyLnRoaXMucGFyZW50IGlzIGFscmVhZHkgZGVsZWdhdGVkIHRvIGZyb20KKyAgICAgICAgICAgIC8vIENsYXNzTG9hZGVyLmdldFJlc291cmNlcywgbm8gbmVlZDoKKyAgICAgICAgICAgIGJhc2UgPSBuZXcgQ29sbGVjdGlvblV0aWxzLkVtcHR5RW51bWVyYXRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQYXJlbnRGaXJzdChuYW1lKSkgeworICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2UuCisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvblV0aWxzLmFwcGVuZChiYXNlLCBtaW5lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaWdub3JlQmFzZSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJvb3RMb2FkZXIoKSA9PSBudWxsID8gbWluZSA6IENvbGxlY3Rpb25VdGlscy5hcHBlbmQobWluZSwgZ2V0Um9vdExvYWRlcigpCisgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZXMobmFtZSkpOworICAgICAgICB9CisgICAgICAgIC8vIHBhcmVudCBsYXN0OgorICAgICAgICByZXR1cm4gQ29sbGVjdGlvblV0aWxzLmFwcGVuZChtaW5lLCBiYXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBVUkwgb2YgYSBnaXZlbiByZXNvdXJjZSBpbiB0aGUgZ2l2ZW4gZmlsZSB3aGljaCBtYXkKKyAgICAgKiBlaXRoZXIgYmUgYSBkaXJlY3Rvcnkgb3IgYSB6aXAgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIChkaXJlY3Rvcnkgb3IgamFyKSBpbiB3aGljaCB0byBzZWFyY2ggZm9yCisgICAgICogICAgICAgICAgICAgdGhlIHJlc291cmNlLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggYSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGlzIHJlcXVpcmVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJlYW0gdG8gdGhlIHJlcXVpcmVkIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICAgICAqICAgICAgICAgcmVzb3VyY2UgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBnaXZlbiBmaWxlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVVJMIGdldFJlc291cmNlVVJMKEZpbGUgZmlsZSwgU3RyaW5nIHJlc291cmNlTmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgWmlwRmlsZSB6aXBGaWxlID0gKFppcEZpbGUpIHppcEZpbGVzLmdldChmaWxlKTsKKyAgICAgICAgICAgIGlmICh6aXBGaWxlID09IG51bGwgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgRmlsZSByZXNvdXJjZSA9IG5ldyBGaWxlKGZpbGUsIHJlc291cmNlTmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGSUxFX1VUSUxTLmdldEZpbGVVUkwocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoemlwRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB6aXBGaWxlcy5wdXQoZmlsZSwgemlwRmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoImphcjoiICsgRklMRV9VVElMUy5nZXRGaWxlVVJMKGZpbGUpICsgIiEvIiArIGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYSBjbGFzcyB3aXRoIHRoaXMgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogVGhpcyBjbGFzcyBhdHRlbXB0cyB0byBsb2FkIHRoZSBjbGFzcyBpbiBhbiBvcmRlciBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIKKyAgICAgKiBvciBub3QgdGhlIGNsYXNzIG1hdGNoZXMgdGhlIHN5c3RlbS9sb2FkZXIgcGFja2FnZSBsaXN0cywgd2l0aCB0aGUKKyAgICAgKiBsb2FkZXIgcGFja2FnZSBsaXN0IHRha2luZyBwcmlvcml0eS4gSWYgdGhlIGNsYXNzbG9hZGVyIGlzIGluIGlzb2xhdGVkCisgICAgICogbW9kZSwgZmFpbHVyZSB0byBsb2FkIHRoZSBjbGFzcyBpbiB0aGlzIGxvYWRlciB3aWxsIHJlc3VsdCBpbiBhCisgICAgICogQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGxvYWRlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSByZXNvbHZlIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBjbGFzc2VzIHVwb24gd2hpY2ggdGhpcyBjbGFzcworICAgICAqICAgICAgICAgICAgICAgIGRlcGVuZHMgYXJlIHRvIGJlIGxvYWRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVpcmVkIENsYXNzIG9iamVjdAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgY2xhc3MgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBvbiB0aGUgc3lzdGVtIGNsYXNzcGF0aCAod2hlbiBub3QgaW4gaXNvbGF0ZWQgbW9kZSkgb3IgdGhpcyBsb2FkZXIncworICAgICAqIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NuYW1lLCBib29sZWFuIHJlc29sdmUpCisgICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vICdzeW5jJyBpcyBuZWVkZWQgLSBvdGhlcndpc2UgMiB0aHJlYWRzIGNhbiBsb2FkIHRoZSBzYW1lIGNsYXNzCisgICAgICAgIC8vIHR3aWNlLCByZXN1bHRpbmcgaW4gTGlua2FnZUVycm9yOiBkdXBsaWNhdGVkIGNsYXNzIGRlZmluaXRpb24uCisgICAgICAgIC8vIGZpbmRMb2FkZWRDbGFzcyBhdm9pZHMgdGhhdCwgYnV0IHdpdGhvdXQgc3luYyBpdCB3b24ndCB3b3JrLgorCisgICAgICAgIENsYXNzIHRoZUNsYXNzID0gZmluZExvYWRlZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgIGlmICh0aGVDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhlQ2xhc3M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUGFyZW50Rmlyc3QoY2xhc3NuYW1lKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGVDbGFzcyA9IGZpbmRCYXNlQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICBsb2coIkNsYXNzICIgKyBjbGFzc25hbWUgKyAiIGxvYWRlZCBmcm9tIHBhcmVudCBsb2FkZXIgIiArICIocGFyZW50Rmlyc3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gZmluZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgbG9nKCJDbGFzcyAiICsgY2xhc3NuYW1lICsgIiBsb2FkZWQgZnJvbSBhbnQgbG9hZGVyICIgKyAiKHBhcmVudEZpcnN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gZmluZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgbG9nKCJDbGFzcyAiICsgY2xhc3NuYW1lICsgIiBsb2FkZWQgZnJvbSBhbnQgbG9hZGVyIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICAgICAgaWYgKGlnbm9yZUJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY25mZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhlQ2xhc3MgPSBmaW5kQmFzZUNsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgbG9nKCJDbGFzcyAiICsgY2xhc3NuYW1lICsgIiBsb2FkZWQgZnJvbSBwYXJlbnQgbG9hZGVyIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZXNvbHZlKSB7CisgICAgICAgICAgICByZXNvbHZlQ2xhc3ModGhlQ2xhc3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGVDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgY2xhc3MgZG90IG5vdGF0aW9uIHRvIGEgZmlsZXN5c3RlbSBlcXVpdmFsZW50IGZvcgorICAgICAqIHNlYXJjaGluZyBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgVGhlIGNsYXNzIG5hbWUgaW4gZG90IGZvcm1hdCAoZWcgamF2YS5sYW5nLkludGVnZXIpLgorICAgICAqICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc25hbWUgaW4gZmlsZXN5c3RlbSBmb3JtYXQgKGVnIGphdmEvbGFuZy9JbnRlZ2VyLmNsYXNzKQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldENsYXNzRmlsZW5hbWUoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICByZXR1cm4gY2xhc3NuYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lIGEgY2xhc3MgZ2l2ZW4gaXRzIGJ5dGVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIgZnJvbSB3aGljaCB0aGUgY2xhc3MgZGF0YSBoYXMgYmVlbiByZWFkCisgICAgICogICAgICAgICAgICAgICAgICBtYXkgYmUgYSBkaXJlY3Rvcnkgb3IgYSBqYXIvemlwIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NEYXRhIHRoZSBieXRlY29kZSBkYXRhIGZvciB0aGUgY2xhc3MKKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqCisgICAgICogQHJldHVybiB0aGUgQ2xhc3MgaW5zdGFuY2UgY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBkYXRhCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBkYXRhIGNhbm5vdCBiZSByZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyBkZWZpbmVDbGFzc0Zyb21EYXRhKEZpbGUgY29udGFpbmVyLCBieXRlW10gY2xhc3NEYXRhLCBTdHJpbmcgY2xhc3NuYW1lKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZGVmaW5lUGFja2FnZShjb250YWluZXIsIGNsYXNzbmFtZSk7CisgICAgICAgIC8vIFhYWCBzaG91bGQgaW5zdGVhZCBtYWtlIGEgbmV3IFByb3RlY3Rpb25Eb21haW4gd2l0aCBhIENvZGVTb3VyY2UKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byBjb250YWluZXIudG9VUkkoKS50b1VSTCgpIGFuZCB0aGUgc2FtZQorICAgICAgICAvLyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBhcyBQcm9qZWN0LmNsYXNzLnByb3RlY3Rpb25Eb21haW4gaGFkCisgICAgICAgIHJldHVybiBkZWZpbmVDbGFzcyhjbGFzc25hbWUsIGNsYXNzRGF0YSwgMCwgY2xhc3NEYXRhLmxlbmd0aCwgUHJvamVjdC5jbGFzcworICAgICAgICAgICAgICAgIC5nZXRQcm90ZWN0aW9uRG9tYWluKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZSB0aGUgcGFja2FnZSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBjbGFzcyBuYW1lIG9mIGZvciB3aGljaCB0aGUgcGFja2FnZSBpbmZvcm1hdGlvbgorICAgICAqICAgICAgICBpcyB0byBiZSBkZXRlcm1pbmVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgcGFja2FnZSBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgcmVhZCBmcm9tIHRoZQorICAgICAqICAgICAgICAgICAgY29udGFpbmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlZmluZVBhY2thZ2UoRmlsZSBjb250YWluZXIsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjbGFzc0luZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChjbGFzc0luZGV4ID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc0luZGV4KTsKKyAgICAgICAgaWYgKGdldFBhY2thZ2UocGFja2FnZU5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGFscmVhZHkgZGVmaW5lZAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIGRlZmluZSB0aGUgcGFja2FnZSBub3cKKyAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBnZXRKYXJNYW5pZmVzdChjb250YWluZXIpOworCisgICAgICAgIGlmIChtYW5pZmVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBkZWZpbmVQYWNrYWdlKHBhY2thZ2VOYW1lLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlZmluZVBhY2thZ2UoY29udGFpbmVyLCBwYWNrYWdlTmFtZSwgbWFuaWZlc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtYW5pZmVzdCBmcm9tIHRoZSBnaXZlbiBqYXIsIGlmIGl0IGlzIGluZGVlZCBhIGphciBhbmQgaXQgaGFzIGEKKyAgICAgKiBtYW5pZmVzdAorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgRmlsZSBmcm9tIHdoaWNoIGEgbWFuaWZlc3QgaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBqYXIncyBtYW5pZmVzdCBvciBudWxsIGlzIHRoZSBjb250YWluZXIgaXMgbm90IGEgamFyIG9yIGl0CisgICAgICogICAgICAgICBoYXMgbm8gbWFuaWZlc3QuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBtYW5pZmVzdCBjYW5ub3QgYmUgcmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hbmlmZXN0IGdldEphck1hbmlmZXN0KEZpbGUgY29udGFpbmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY29udGFpbmVyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIEphckZpbGUgamFyRmlsZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXJGaWxlID0gbmV3IEphckZpbGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIHJldHVybiBqYXJGaWxlLmdldE1hbmlmZXN0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoamFyRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgamFyRmlsZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lIHRoZSBwYWNrYWdlIGluZm9ybWF0aW9uIHdoZW4gdGhlIGNsYXNzIGNvbWVzIGZyb20gYQorICAgICAqIGphciB3aXRoIGEgbWFuaWZlc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgdGhlIGphciBmaWxlIGNvbnRhaW5pbmcgdGhlIG1hbmlmZXN0CisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGJlaW5nIGRlZmluZWQuCisgICAgICogQHBhcmFtIG1hbmlmZXN0IHRoZSBqYXIncyBtYW5pZmVzdAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlZmluZVBhY2thZ2UoRmlsZSBjb250YWluZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgTWFuaWZlc3QgbWFuaWZlc3QpIHsKKyAgICAgICAgU3RyaW5nIHNlY3Rpb25OYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLyI7CisKKyAgICAgICAgU3RyaW5nIHNwZWNpZmljYXRpb25UaXRsZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVuZG9yID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNwZWNpZmljYXRpb25WZXJzaW9uID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGltcGxlbWVudGF0aW9uVGl0bGUgPSBudWxsOworICAgICAgICBTdHJpbmcgaW1wbGVtZW50YXRpb25WZW5kb3IgPSBudWxsOworICAgICAgICBTdHJpbmcgaW1wbGVtZW50YXRpb25WZXJzaW9uID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNlYWxlZFN0cmluZyA9IG51bGw7CisgICAgICAgIFVSTCBzZWFsQmFzZSA9IG51bGw7CisKKyAgICAgICAgQXR0cmlidXRlcyBzZWN0aW9uQXR0cmlidXRlcyA9IG1hbmlmZXN0LmdldEF0dHJpYnV0ZXMoc2VjdGlvbk5hbWUpOworICAgICAgICBpZiAoc2VjdGlvbkF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3BlY2lmaWNhdGlvblRpdGxlID0gc2VjdGlvbkF0dHJpYnV0ZXMuZ2V0VmFsdWUoTmFtZS5TUEVDSUZJQ0FUSU9OX1RJVExFKTsKKyAgICAgICAgICAgIHNwZWNpZmljYXRpb25WZW5kb3IgPSBzZWN0aW9uQXR0cmlidXRlcy5nZXRWYWx1ZShOYW1lLlNQRUNJRklDQVRJT05fVkVORE9SKTsKKyAgICAgICAgICAgIHNwZWNpZmljYXRpb25WZXJzaW9uID0gc2VjdGlvbkF0dHJpYnV0ZXMuZ2V0VmFsdWUoTmFtZS5TUEVDSUZJQ0FUSU9OX1ZFUlNJT04pOworICAgICAgICAgICAgaW1wbGVtZW50YXRpb25UaXRsZSA9IHNlY3Rpb25BdHRyaWJ1dGVzLmdldFZhbHVlKE5hbWUuSU1QTEVNRU5UQVRJT05fVElUTEUpOworICAgICAgICAgICAgaW1wbGVtZW50YXRpb25WZW5kb3IgPSBzZWN0aW9uQXR0cmlidXRlcy5nZXRWYWx1ZShOYW1lLklNUExFTUVOVEFUSU9OX1ZFTkRPUik7CisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvblZlcnNpb24gPSBzZWN0aW9uQXR0cmlidXRlcy5nZXRWYWx1ZShOYW1lLklNUExFTUVOVEFUSU9OX1ZFUlNJT04pOworICAgICAgICAgICAgc2VhbGVkU3RyaW5nID0gc2VjdGlvbkF0dHJpYnV0ZXMuZ2V0VmFsdWUoTmFtZS5TRUFMRUQpOworICAgICAgICB9CisgICAgICAgIEF0dHJpYnV0ZXMgbWFpbkF0dHJpYnV0ZXMgPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpOworICAgICAgICBpZiAobWFpbkF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNwZWNpZmljYXRpb25UaXRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvblRpdGxlID0gbWFpbkF0dHJpYnV0ZXMuZ2V0VmFsdWUoTmFtZS5TUEVDSUZJQ0FUSU9OX1RJVExFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcGVjaWZpY2F0aW9uVmVuZG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVuZG9yID0gbWFpbkF0dHJpYnV0ZXMuZ2V0VmFsdWUoTmFtZS5TUEVDSUZJQ0FUSU9OX1ZFTkRPUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3BlY2lmaWNhdGlvblZlcnNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb25WZXJzaW9uID0gbWFpbkF0dHJpYnV0ZXMuZ2V0VmFsdWUoTmFtZS5TUEVDSUZJQ0FUSU9OX1ZFUlNJT04pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uVGl0bGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uVGl0bGUgPSBtYWluQXR0cmlidXRlcy5nZXRWYWx1ZShOYW1lLklNUExFTUVOVEFUSU9OX1RJVExFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvblZlbmRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25WZW5kb3IgPSBtYWluQXR0cmlidXRlcy5nZXRWYWx1ZShOYW1lLklNUExFTUVOVEFUSU9OX1ZFTkRPUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25WZXJzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvblZlcnNpb24gPSBtYWluQXR0cmlidXRlcy5nZXRWYWx1ZShOYW1lLklNUExFTUVOVEFUSU9OX1ZFUlNJT04pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlYWxlZFN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VhbGVkU3RyaW5nID0gbWFpbkF0dHJpYnV0ZXMuZ2V0VmFsdWUoTmFtZS5TRUFMRUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzZWFsZWRTdHJpbmcgIT0gbnVsbCAmJiBzZWFsZWRTdHJpbmcudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLmVxdWFscygidHJ1ZSIpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlYWxCYXNlID0gbmV3IFVSTChGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkudG9VUkkoY29udGFpbmVyLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlZmluZVBhY2thZ2UocGFja2FnZU5hbWUsIHNwZWNpZmljYXRpb25UaXRsZSwgc3BlY2lmaWNhdGlvblZlcnNpb24sIHNwZWNpZmljYXRpb25WZW5kb3IsCisgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25UaXRsZSwgaW1wbGVtZW50YXRpb25WZXJzaW9uLCBpbXBsZW1lbnRhdGlvblZlbmRvciwgc2VhbEJhc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgY2xhc3MgZGVmaW5pdGlvbiBmcm9tIGEgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgc3RyZWFtIGZyb20gd2hpY2ggdGhlIGNsYXNzIGlzIHRvIGJlIHJlYWQuCisgICAgICogICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpbiB0aGUgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgZmlsZSBvciBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBDbGFzcyBvYmplY3QgcmVhZCBmcm9tIHRoZSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBjbGFzcyBmcm9tIHRoZQorICAgICAqIHN0cmVhbS4KKyAgICAgKiBAZXhjZXB0aW9uIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgc2VjdXJpdHkgcHJvYmxlbSB3aGlsZQorICAgICAqIHJlYWRpbmcgdGhlIGNsYXNzIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzIGdldENsYXNzRnJvbVN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBjbGFzc25hbWUsIEZpbGUgY29udGFpbmVyKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBpbnQgYnl0ZXNSZWFkID0gLTE7CisgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisKKyAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBzdHJlYW0ucmVhZChidWZmZXIsIDAsIEJVRkZFUl9TSVpFKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGJhb3Mud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBjbGFzc0RhdGEgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIHJldHVybiBkZWZpbmVDbGFzc0Zyb21EYXRhKGNvbnRhaW5lciwgY2xhc3NEYXRhLCBjbGFzc25hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGZvciBhbmQgbG9hZCBhIGNsYXNzIG9uIHRoZSBjbGFzc3BhdGggb2YgdGhpcyBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgbG9hZGVkLiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVxdWlyZWQgQ2xhc3Mgb2JqZWN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIHJlcXVlc3RlZCBjbGFzcyBkb2VzIG5vdCBleGlzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGlzIGxvYWRlcidzIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiRmluZGluZyBjbGFzcyAiICsgbmFtZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICByZXR1cm4gZmluZENsYXNzSW5Db21wb25lbnRzKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGluIHRoaXMgbG9hZGVyJ3MgcGF0aAorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgZmlsZSB3aGljaCBpcyB0byBiZSBjaGVja2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgaXMgaW4gdGhlIGNsYXNzIHBhdGgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luUGF0aChGaWxlIGNvbXBvbmVudCkgeworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBwYXRoQ29tcG9uZW50cy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgRmlsZSBwYXRoQ29tcG9uZW50ID0gKEZpbGUpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChwYXRoQ29tcG9uZW50LmVxdWFscyhjb21wb25lbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgY2xhc3Mgb24gdGhlIGdpdmVuIGNsYXNzcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSBsb2FkZWQuIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBDbGFzcyBvYmplY3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgcmVxdWVzdGVkIGNsYXNzIGRvZXMgbm90IGV4aXN0CisgICAgICogb24gdGhpcyBsb2FkZXIncyBjbGFzc3BhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBmaW5kQ2xhc3NJbkNvbXBvbmVudHMoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gd2UgbmVlZCB0byBzZWFyY2ggdGhlIGNvbXBvbmVudHMgb2YgdGhlIHBhdGggdG8gc2VlIGlmCisgICAgICAgIC8vIHdlIGNhbiBmaW5kIHRoZSBjbGFzcyB3ZSB3YW50LgorICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICBTdHJpbmcgY2xhc3NGaWxlbmFtZSA9IGdldENsYXNzRmlsZW5hbWUobmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcGF0aENvbXBvbmVudHMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBwYXRoQ29tcG9uZW50ID0gKEZpbGUpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBnZXRSZXNvdXJjZVN0cmVhbShwYXRoQ29tcG9uZW50LCBjbGFzc0ZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkxvYWRlZCBmcm9tICIgKyBwYXRoQ29tcG9uZW50ICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc0ZpbGVuYW1lLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NGcm9tU3RyZWFtKHN0cmVhbSwgbmFtZSwgcGF0aENvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW9lLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICBsb2coIkV4Y2VwdGlvbiByZWFkaW5nIGNvbXBvbmVudCAiICsgcGF0aENvbXBvbmVudCArICIgKHJlYXNvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW9lLmdldE1lc3NhZ2UoKSArICIpIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uoc3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgc3lzdGVtIGNsYXNzICh3aGljaCBzaG91bGQgYmUgbG9hZGVkIGZyb20gdGhlIHNhbWUgY2xhc3Nsb2FkZXIKKyAgICAgKiBhcyB0aGUgQW50IGNvcmUpLgorICAgICAqCisgICAgICogRm9yIEpESyAxLjEgY29tcGF0aWJpbGl0eSwgdGhpcyB1c2VzIHRoZSBmaW5kU3lzdGVtQ2xhc3MgbWV0aG9kIGlmCisgICAgICogbm8gcGFyZW50IGNsYXNzbG9hZGVyIGhhcyBiZWVuIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSBsb2FkZWQuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBDbGFzcyBvYmplY3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgcmVxdWVzdGVkIGNsYXNzIGRvZXMgbm90IGV4aXN0CisgICAgICogb24gdGhpcyBsb2FkZXIncyBjbGFzc3BhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBmaW5kQmFzZUNsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwYXJlbnQgPT0gbnVsbCA/IGZpbmRTeXN0ZW1DbGFzcyhuYW1lKSA6IHBhcmVudC5sb2FkQ2xhc3MobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYW5zIHVwIGFueSByZXNvdXJjZXMgaGVsZCBieSB0aGlzIGNsYXNzbG9hZGVyLiBBbnkgb3BlbiBhcmNoaXZlCisgICAgICogZmlsZXMgYXJlIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gemlwRmlsZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFppcEZpbGUgemlwRmlsZSA9IChaaXBGaWxlKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHppcEZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBwcm9qZWN0LnJlbW92ZUJ1aWxkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcHJvamVjdCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW1wdHkgaW1wbGVtZW50YXRpb24gdG8gc2F0aXNmeSB0aGUgQnVpbGRMaXN0ZW5lciBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGJ1aWxkU3RhcnRlZCBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIE5vdCBzaWduaWZpY2FudCBmb3IgdGhlIGNsYXNzIGxvYWRlci4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhbnMgdXAgYW55IHJlc291cmNlcyBoZWxkIGJ5IHRoaXMgY2xhc3Nsb2FkZXIgYXQgdGhlIGVuZAorICAgICAqIG9mIGEgYnVpbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGJ1aWxkRmluaXNoZWQgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFucyB1cCBhbnkgcmVzb3VyY2VzIGhlbGQgYnkgdGhpcyBjbGFzc2xvYWRlciBhdCB0aGUgZW5kIG9mCisgICAgICogYSBzdWJidWlsZCBpZiBpdCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgc3ViYnVpbGQncyBwcm9qZWN0CisgICAgICogaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGJ1aWxkRmluaXNoZWQgZXZlbnQKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdWJCdWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldFByb2plY3QoKSA9PSBwcm9qZWN0KSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiB0byBzYXRpc2Z5IHRoZSBCdWlsZExpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCB0aGUgYnVpbGRTdGFydGVkIGV2ZW50CisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3ViQnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gTm90IHNpZ25pZmljYW50IGZvciB0aGUgY2xhc3MgbG9hZGVyLgorICAgIH0KKworICAgIC8qKgorICAgICAqIEVtcHR5IGltcGxlbWVudGF0aW9uIHRvIHNhdGlzZnkgdGhlIEJ1aWxkTGlzdGVuZXIgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IHRoZSB0YXJnZXRTdGFydGVkIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIE5vdCBzaWduaWZpY2FudCBmb3IgdGhlIGNsYXNzIGxvYWRlci4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiB0byBzYXRpc2Z5IHRoZSBCdWlsZExpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCB0aGUgdGFyZ2V0RmluaXNoZWQgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIE5vdCBzaWduaWZpY2FudCBmb3IgdGhlIGNsYXNzIGxvYWRlci4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiB0byBzYXRpc2Z5IHRoZSBCdWlsZExpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCB0aGUgdGFza1N0YXJ0ZWQgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIE5vdCBzaWduaWZpY2FudCBmb3IgdGhlIGNsYXNzIGxvYWRlci4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiB0byBzYXRpc2Z5IHRoZSBCdWlsZExpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCB0aGUgdGFza0ZpbmlzaGVkIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gTm90IHNpZ25pZmljYW50IGZvciB0aGUgY2xhc3MgbG9hZGVyLgorICAgIH0KKworICAgIC8qKgorICAgICAqIEVtcHR5IGltcGxlbWVudGF0aW9uIHRvIHNhdGlzZnkgdGhlIEJ1aWxkTGlzdGVuZXIgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IHRoZSBtZXNzYWdlTG9nZ2VkIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIE5vdCBzaWduaWZpY2FudCBmb3IgdGhlIGNsYXNzIGxvYWRlci4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW55IGxpYnJhcmllcyB0aGF0IGNvbWUgd2l0aCBkaWZmZXJlbnQgamF2YSB2ZXJzaW9ucworICAgICAqIGhlcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRKYXZhTGlicmFyaWVzKCkgeworICAgICAgICBWZWN0b3IgcGFja2FnZXMgPSBKYXZhRW52VXRpbHMuZ2V0SnJlUGFja2FnZXMoKTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHBhY2thZ2VzLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBhZGRTeXN0ZW1QYWNrYWdlUm9vdChwYWNrYWdlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiByZXByZXNlbnRpbmcgdGhpcyBsb2FkZXIuCisgICAgICogQHJldHVybiB0aGUgcGF0aCB0aGF0IHRoaXMgY2xhc3Nsb2FkZXIgaGFzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiQW50Q2xhc3NMb2FkZXJbIiArIGdldENsYXNzcGF0aCgpICsgIl0iOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudFR5cGVEZWZpbml0aW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRUeXBlRGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTQ4MmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRUeXBlRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworCisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uCisgKiBvbiBhIHBhcnRpY3VsYXIgYW50IHR5cGUsCisgKiB0aGUgY2xhc3NuYW1lLCBhZGFwdG9yIGFuZCB0aGUgY2xhc3MKKyAqIGl0IHNob3VsZCBiZSBhc3NpZ25hYmxlIGZyb20uCisgKiBUaGlzIHR5cGUgcmVwbGFjZXMgdGhlIHRhc2svZGF0YXR5cGUgc3BsaXQKKyAqIG9mIHByZSBhbnQgMS42LgorICoKKyAqLworcHVibGljIGNsYXNzIEFudFR5cGVEZWZpbml0aW9uIHsKKyAgICBwcml2YXRlIFN0cmluZyAgICAgIG5hbWU7CisgICAgcHJpdmF0ZSBDbGFzcyAgICAgICBjbGF6ejsKKyAgICBwcml2YXRlIENsYXNzICAgICAgIGFkYXB0ZXJDbGFzczsKKyAgICBwcml2YXRlIENsYXNzICAgICAgIGFkYXB0VG9DbGFzczsKKyAgICBwcml2YXRlIFN0cmluZyAgICAgIGNsYXNzTmFtZTsKKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgcmVzdHJpY3QgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzdHJpY3QgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSByZXN0cmljdCB0aGUgdmFsdWUgdG8gc2V0LgorICAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0UmVzdHJpY3QoYm9vbGVhbiByZXN0cmljdCkgeworICAgICAgICAgdGhpcy5yZXN0cmljdCA9IHJlc3RyaWN0OworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlc3RyaWN0IGF0dHJpYnV0ZS4KKyAgICAgICogQHJldHVybiB0aGUgcmVzdHJpY3QgYXR0cmlidXRlLgorICAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0KCkgeworICAgICAgICByZXR1cm4gcmVzdHJpY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZpbml0aW9uJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZpbml0aW9uJ3MgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkZWZpbml0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzcyBvZiB0aGUgZGVmaW5pdGlvbi4KKyAgICAgKiBBcyBhIHNpZGUtZWZmZWN0IG1heSBzZXQgdGhlIGNsYXNzbG9hZGVyIGFuZCBjbGFzc25hbWUuCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyBvZiB0aGlzIGRlZmluaXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3MoQ2xhc3MgY2xhenopIHsKKyAgICAgICAgdGhpcy5jbGF6eiA9IGNsYXp6OworICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSAoY2xhc3NMb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgID8gY2xhenouZ2V0Q2xhc3NMb2FkZXIoKSA6IGNsYXNzTG9hZGVyOworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IChjbGFzc05hbWUgPT0gbnVsbCkgPyBjbGF6ei5nZXROYW1lKCkgOiBjbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc25hbWUgb2YgdGhlIGRlZmluaXRpb24uCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3NuYW1lIG9mIHRoaXMgZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzbmFtZSBvZiB0aGUgZGVmaW5pdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGlzIGRlZmluaXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhZGFwdGVyIGNsYXNzIGZvciB0aGlzIGRlZmluaXRpb24uCisgICAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFkYXB0IHRoZSBkZWZpbml0aW9ucyBjbGFzcyBpZgorICAgICAqIHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBhZGFwdGVyQ2xhc3MgdGhlIGFkYXB0ZXJDbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyQ2xhc3MoQ2xhc3MgYWRhcHRlckNsYXNzKSB7CisgICAgICAgIHRoaXMuYWRhcHRlckNsYXNzID0gYWRhcHRlckNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXNzaWduYWJsZSBjbGFzcyBmb3IgdGhpcyBkZWZpbml0aW9uLgorICAgICAqIEBwYXJhbSBhZGFwdFRvQ2xhc3MgdGhlIGFzc2lnbmFibGUgY2xhc3MuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdFRvQ2xhc3MoQ2xhc3MgYWRhcHRUb0NsYXNzKSB7CisgICAgICAgIHRoaXMuYWRhcHRUb0NsYXNzID0gYWRhcHRUb0NsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZQorICAgICAqIG9mIHRoZSBkZWZpbml0aW9uLgorICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciB0aGUgQ2xhc3NMb2FkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2xhc3Nsb2FkZXIgZm9yIHRoaXMgZGVmaW5pdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc2xvYWRlciBmb3IgdGhpcyBkZWZpbml0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZXhwb3NlZCBjbGFzcyBmb3IgdGhpcworICAgICAqIGRlZmluaXRpb24uIFRoaXMgd2lsbCBiZSBhIHByb3h5IGNsYXNzCisgICAgICogKGFkYXB0ZWQgY2xhc3MpIGlmIHRoZXJlIGlzIGFuIGFkYXB0ZXIKKyAgICAgKiBjbGFzcyBhbmQgdGhlIGRlZmluaXRpb24gY2xhc3MgaXMgbm90CisgICAgICogYXNzaWduYWJsZSBmcm9tIHRoZSBhc3NpZ25hYmxlIGNsYXNzLgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICogQHJldHVybiB0aGUgZXhwb3NlZCBjbGFzcyAtIG1heSByZXR1cm4gbnVsbCBpZiB1cGFibGUgdG8gbG9hZCB0aGUgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RXhwb3NlZENsYXNzKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBpZiAoYWRhcHRUb0NsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzIHogPSBnZXRUeXBlQ2xhc3MocHJvamVjdCk7CisgICAgICAgICAgICBpZiAoeiA9PSBudWxsIHx8IGFkYXB0VG9DbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHopKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChhZGFwdGVyQ2xhc3MgPT0gbnVsbCkgPyBnZXRUeXBlQ2xhc3MocHJvamVjdCkgOiAgYWRhcHRlckNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVmaW5pdGlvbiBjbGFzcy4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGRlZmluaXRpb24uCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFR5cGVDbGFzcyhQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBpbm5lckdldFR5cGVDbGFzcygpOworICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBuY2RmZSkgeworICAgICAgICAgICAgcHJvamVjdC5sb2coIkNvdWxkIG5vdCBsb2FkIGEgZGVwZW5kZW50IGNsYXNzICgiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5jZGZlLmdldE1lc3NhZ2UoKSArICIpIGZvciB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgIHByb2plY3QubG9nKCJDb3VsZCBub3QgbG9hZCBjbGFzcyAoIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBmb3IgdHlwZSAiICsgbmFtZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSBhbmQgbG9hZCBhIGNsYXNzLCB3aXRoIG5vIGF0dGVtcHQgdG8gY2F0Y2ggYW55IGZhdWx0LgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbXBvbmVudAorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGZvdW5kLgorICAgICAqIEB0aHJvd3MgTm9DbGFzc0RlZkZvdW5kRXJyb3IgICBpZiB0aGUgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZGluZyB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGlubmVyR2V0VHlwZUNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXp6OworICAgICAgICB9CisgICAgICAgIGlmIChjbGFzc0xvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsYXp6ID0gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXp6OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZGVmaW5pdGlvbi4KKyAgICAgKiBUaGUgaW5zdGFuY2UgbWF5IGJlIHdyYXBwZWQgaW4gYSBwcm94eSBjbGFzcy4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICByZXR1cm4gaWNyZWF0ZShwcm9qZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjb21wb25lbnQgb2JqZWN0IGJhc2VkIG9uCisgICAgICogaXRzIGRlZmluaXRpb24uCisgICAgICogQHJldHVybiB0aGUgY29tcG9uZW50IGFzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgaWNyZWF0ZShQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgQ2xhc3MgYyA9IGdldFR5cGVDbGFzcyhwcm9qZWN0KTsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IG8gPSBjcmVhdGVBbmRTZXQocHJvamVjdCwgYyk7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgYWRhcHRlckNsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisgICAgICAgIGlmIChhZGFwdFRvQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGFkYXB0VG9DbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG8uZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBUeXBlQWRhcHRlciBhZGFwdGVyT2JqZWN0ID0gKFR5cGVBZGFwdGVyKSBjcmVhdGVBbmRTZXQoCisgICAgICAgICAgICBwcm9qZWN0LCBhZGFwdGVyQ2xhc3MpOworICAgICAgICBpZiAoYWRhcHRlck9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhZGFwdGVyT2JqZWN0LnNldFByb3h5KG8pOworICAgICAgICByZXR1cm4gYWRhcHRlck9iamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIGNvcnJlY3QuCisgICAgICogPGRsPgorICAgICAqICAgPGxpPmlmIHRoZSBjbGFzcyBjYW4gYmUgY3JlYXRlZC48L2xpPgorICAgICAqICAgPGxpPmlmIGFuIGFkYXB0ZXIgY2xhc3MgY2FuIGJlIGNyZWF0ZWQ8L2xpPgorICAgICAqICAgPGxpPmlmIHRoZSB0eXBlIGlzIGFzc2lnbmFibGUgZnJvbSBhZGFwdG88L2xpPgorICAgICAqICAgPGxpPmlmIHRoZSB0eXBlIGNhbiBiZSB1c2VkIHdpdGggdGhlIGFkYXB0ZXIgY2xhc3M8L2xpPgorICAgICAqIDwvZGw+CisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVja0NsYXNzKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhenogPSBnZXRUeXBlQ2xhc3MocHJvamVjdCk7CisgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgY2xhc3MgZm9yICIgKyBnZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIGFkYXB0ZXIKKyAgICAgICAgaWYgKGFkYXB0ZXJDbGFzcyAhPSBudWxsICYmIChhZGFwdFRvQ2xhc3MgPT0gbnVsbAorICAgICAgICAgICAgfHwgIWFkYXB0VG9DbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkpIHsKKyAgICAgICAgICAgIFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoVHlwZUFkYXB0ZXIpIGNyZWF0ZUFuZFNldCgKKyAgICAgICAgICAgICAgICBwcm9qZWN0LCBhZGFwdGVyQ2xhc3MpOworICAgICAgICAgICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBhZGFwdGVyIG9iamVjdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRhcHRlci5jaGVja1Byb3h5Q2xhc3MoY2xhenopOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZGVmaW5pdGlvbgorICAgICAqIGFuZCBpbnZva2UgaXQuCisgICAgICogQHJldHVybiB0aGUgaW5zdGFudGlhdGVkIDxjb2RlPk9iamVjdDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlQW5kU2V0KFByb2plY3QgcHJvamVjdCwgQ2xhc3MgYykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBpbm5lckNyZWF0ZUFuZFNldChjLCBwcm9qZWN0KTsKKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGV4LmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIHR5cGUgIiArIG5hbWUgKyAiIGR1ZSB0byAiICsgdCwgdCk7CisgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlR5cGUgIiArIG5hbWUgKyAiOiBBIGNsYXNzIG5lZWRlZCBieSBjbGFzcyAiCisgICAgICAgICAgICAgICAgKyBjICsgIiBjYW5ub3QgYmUgZm91bmQ6ICIgKyBuY2RmZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBuY2RmZSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgdHlwZSAiICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICIgYXMgdGhlIGNsYXNzICIgKyBjICsgIiBoYXMgbm8gY29tcGF0aWJsZSBjb25zdHJ1Y3RvciIpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiBhcyB0aGUgY2xhc3MgIiArIGMgKyAiIGlzIGFic3RyYWN0Iik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiIGFzIHRoZSBjb25zdHJ1Y3RvciAiICsgYyArICIgaXMgbm90IGFjY2Vzc2libGUiKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSB0eXBlICIgKyBuYW1lICsgIiBkdWUgdG8gIiArIHQsIHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5uZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayAjY3JlYXRlQW5kU2V0KFByb2plY3QsIENsYXNzKX0gbG9naWMsIHdpdGggbm8KKyAgICAgKiBleGNlcHRpb24gY2F0Y2hpbmcKKyAgICAgKiBAcGFyYW0gbmV3Y2xhc3MgY2xhc3MgdG8gY3JlYXRlCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gdXNlCisgICAgICogQHJldHVybiBhIG5ld2x5IGNvbnN0cnVjdGVkIGFuZCBib3VuZCBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiAgbm8gZ29vZCBjb25zdHJ1dG9yLgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBjYW5ub3QgaW5pdGlhbGl6ZSB0aGUgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBjYW5ub3QgYWNjZXNzIHRoZSBvYmplY3QuCisgICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGVycm9yIGluIGludm9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbm5lckNyZWF0ZUFuZFNldChDbGFzcyBuZXdjbGFzcywgUHJvamVjdCBwcm9qZWN0KQorICAgICAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAorICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnN0cnVjdG9yIGN0b3IgPSBudWxsOworICAgICAgICBib29sZWFuIG5vQXJnID0gZmFsc2U7CisgICAgICAgIC8vIERhdGFUeXBlIGNhbiBoYXZlIGEgIm5vIGFyZyIgY29uc3RydWN0b3Igb3IgdGFrZSBhIHNpbmdsZQorICAgICAgICAvLyBQcm9qZWN0IGFyZ3VtZW50LgorICAgICAgICB0cnkgeworICAgICAgICAgICAgY3RvciA9IG5ld2NsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1swXSk7CisgICAgICAgICAgICBub0FyZyA9IHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc2UpIHsKKyAgICAgICAgICAgIC8vY2FuIHRocm93IHRoZSBzYW1lIGV4Y2VwdGlvbiwgaWYgdGhlcmUgaXMgbm8gdGhpcyhQcm9qZWN0KSBjdG9yLgorICAgICAgICAgICAgY3RvciA9IG5ld2NsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtQcm9qZWN0LmNsYXNzfSk7CisgICAgICAgICAgICBub0FyZyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vbm93IHdlIGluc3RhbnRpYXRlCisgICAgICAgIE9iamVjdCBvID0gY3Rvci5uZXdJbnN0YW5jZSgKKyAgICAgICAgICAgICgobm9BcmcpID8gbmV3IE9iamVjdFswXSA6IG5ldyBPYmplY3RbXSB7cHJvamVjdH0pKTsKKworICAgICAgICAvL3NldCB1cCBwcm9qZWN0IHJlZmVyZW5jZXMuCisgICAgICAgIHByb2plY3Quc2V0UHJvamVjdFJlZmVyZW5jZShvKTsKKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1YWxpdHkgbWV0aG9kIGZvciB0aGlzIGRlZmluaXRpb24gKGFzc3VtZXMgdGhlIG5hbWVzIGFyZSB0aGUgc2FtZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3RoZXIgYW5vdGhlciBkZWZpbml0aW9uLgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoZSBkZWZpbml0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNhbWVEZWZpbml0aW9uKEFudFR5cGVEZWZpbml0aW9uIG90aGVyLCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgcmV0dXJuIChvdGhlciAhPSBudWxsICYmIG90aGVyLmdldENsYXNzKCkgPT0gZ2V0Q2xhc3MoKQorICAgICAgICAgICAgJiYgb3RoZXIuZ2V0VHlwZUNsYXNzKHByb2plY3QpLmVxdWFscyhnZXRUeXBlQ2xhc3MocHJvamVjdCkpCisgICAgICAgICAgICAmJiBvdGhlci5nZXRFeHBvc2VkQ2xhc3MocHJvamVjdCkuZXF1YWxzKGdldEV4cG9zZWRDbGFzcyhwcm9qZWN0KSkKKyAgICAgICAgICAgICYmIG90aGVyLnJlc3RyaWN0ID09IHJlc3RyaWN0CisgICAgICAgICAgICAmJiBvdGhlci5hZGFwdGVyQ2xhc3MgPT0gYWRhcHRlckNsYXNzCisgICAgICAgICAgICAmJiBvdGhlci5hZGFwdFRvQ2xhc3MgPT0gYWRhcHRUb0NsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1pbGFyIGRlZmluaXRpb247CisgICAgICogdXNlZCB0byBjb21wYXJlIHR3byBkZWZpbml0aW9ucyBkZWZpbmVkIHR3aWNlIHdpdGggdGhlIHNhbWUKKyAgICAgKiBuYW1lIGFuZCB0aGUgc2FtZSB0eXBlcy4KKyAgICAgKiBUaGUgY2xhc3Nsb2FkZXIgbWF5IGJlIGRpZmZlcmVudCBidXQgaGF2ZSB0aGUgc2FtZQorICAgICAqIHBhdGggc28gI3NhbWVEZWZpbml0aW9uIGNhbm5vdAorICAgICAqIGJlIHVzZWQuCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBkZWZpbml0aW9uIHRvIGNvbXBhcmUgdG8uCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRlZmluaXRpb25zIGFyZSB0aGUgc2FtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzaW1pbGFyRGVmaW5pdGlvbihBbnRUeXBlRGVmaW5pdGlvbiBvdGhlciwgUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIGlmIChvdGhlciA9PSBudWxsCisgICAgICAgICAgICB8fCBnZXRDbGFzcygpICE9IG90aGVyLmdldENsYXNzKCkKKyAgICAgICAgICAgIHx8ICFnZXRDbGFzc05hbWUoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3NOYW1lKCkpCisgICAgICAgICAgICB8fCAhZXh0cmFjdENsYXNzbmFtZShhZGFwdGVyQ2xhc3MpLmVxdWFscygKKyAgICAgICAgICAgIGV4dHJhY3RDbGFzc25hbWUob3RoZXIuYWRhcHRlckNsYXNzKSkKKyAgICAgICAgICAgIHx8ICFleHRyYWN0Q2xhc3NuYW1lKGFkYXB0VG9DbGFzcykuZXF1YWxzKAorICAgICAgICAgICAgZXh0cmFjdENsYXNzbmFtZShvdGhlci5hZGFwdFRvQ2xhc3MpKQorICAgICAgICAgICAgfHwgcmVzdHJpY3QgIT0gb3RoZXIucmVzdHJpY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBhbGwgdGhlIG5hbWVzIGFyZSB0aGUgc2FtZTogY2hlY2sgaWYgdGhlIGNsYXNzIHBhdGggb2YgdGhlIGxvYWRlcgorICAgICAgICAvLyBpcyB0aGUgc2FtZQorICAgICAgICBDbGFzc0xvYWRlciBvbGRMb2FkZXIgPSBvdGhlci5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBDbGFzc0xvYWRlciBuZXdMb2FkZXIgPSBnZXRDbGFzc0xvYWRlcigpOworICAgICAgICByZXR1cm4gb2xkTG9hZGVyID09IG5ld0xvYWRlcgorICAgICAgICAgICAgfHwgKG9sZExvYWRlciBpbnN0YW5jZW9mIEFudENsYXNzTG9hZGVyCisgICAgICAgICAgICAmJiBuZXdMb2FkZXIgaW5zdGFuY2VvZiBBbnRDbGFzc0xvYWRlcgorICAgICAgICAgICAgJiYgKChBbnRDbGFzc0xvYWRlcikgb2xkTG9hZGVyKS5nZXRDbGFzc3BhdGgoKQorICAgICAgICAgICAgLmVxdWFscygoKEFudENsYXNzTG9hZGVyKSBuZXdMb2FkZXIpLmdldENsYXNzcGF0aCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdENsYXNzbmFtZShDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiAoYyA9PSBudWxsKSA/ICI8bnVsbD4iIDogYy5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV2ZW50LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjOTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXZlbnQuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKKworLyoqCisgKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZXZlbnQgb2NjdXJyaW5nIGR1cmluZyBhIGJ1aWxkLiBBbgorICogZXZlbnQgaXMgYnVpbHQgYnkgc3BlY2lmeWluZyBlaXRoZXIgYSBwcm9qZWN0LCBhIHRhc2sgb3IgYSB0YXJnZXQuCisgKiBBIHByb2plY3QgbGV2ZWwgZXZlbnQgd2lsbCBvbmx5IGhhdmUgYSBwcm9qZWN0IHJlZmVyZW5jZTsKKyAqIGEgdGFyZ2V0IGxldmVsIGV2ZW50IHdpbGwgaGF2ZSBwcm9qZWN0IGFuZCB0YXJnZXQgcmVmZXJlbmNlczsKKyAqIGEgdGFzayBsZXZlbCBldmVudCB3aWxsIGhhdmUgcHJvamVjdCwgdGFyZ2V0IGFuZCB0YXNrIHJlZmVyZW5jZXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgQnVpbGRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ1MzgwNTAwNzU5NTIyODg0ODZMOworCisgICAgLyoqIFByb2plY3Qgd2hpY2ggZW1pdHRlZCB0aGUgZXZlbnQuICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisgICAgLyoqIFRhcmdldCB3aGljaCBlbWl0dGVkIHRoZSBldmVudCwgaWYgc3BlY2lmaWVkLiAqLworICAgIHByaXZhdGUgVGFyZ2V0IHRhcmdldDsKKyAgICAvKiogVGFzayB3aGljaCBlbWl0dGVkIHRoZSBldmVudCwgaWYgc3BlY2lmaWVkLiAqLworICAgIHByaXZhdGUgVGFzayB0YXNrOworICAgIC8qKgorICAgICAqIE1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4gVGhpcyBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogIm1lc3NhZ2VMb2dnZWQiIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworICAgIC8qKgorICAgICAqIFRoZSBwcmlvcml0eSBvZiB0aGUgbWVzc2FnZSwgZm9yICJtZXNzYWdlTG9nZ2VkIiBldmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcHJpb3JpdHkgPSBQcm9qZWN0Lk1TR19WRVJCT1NFOworICAgIC8qKgorICAgICAqIFRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQsIGlmIGFueS4KKyAgICAgKiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgIm1lc3NhZ2VMb2dnZWQiLCAidGFza0ZpbmlzaGVkIiwgInRhcmdldEZpbmlzaGVkIiwKKyAgICAgKiBhbmQgImJ1aWxkRmluaXNoZWQiIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRocm93YWJsZSBleGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBCdWlsZEV2ZW50IGZvciBhIHByb2plY3QgbGV2ZWwgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LgorICAgICAqICAgICAgICAgICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkRXZlbnQoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHN1cGVyKHByb2plY3QpOworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgICAgICB0aGlzLnRhcmdldCA9IG51bGw7CisgICAgICAgIHRoaXMudGFzayA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgQnVpbGRFdmVudCBmb3IgYSB0YXJnZXQgbGV2ZWwgZXZlbnQuCisgICAgICogVGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCBpcyBkZXJpdmVkCisgICAgICogZnJvbSB0aGUgZ2l2ZW4gdGFyZ2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuCisgICAgICogICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRFdmVudChUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIHN1cGVyKHRhcmdldCk7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHRhcmdldC5nZXRQcm9qZWN0KCk7CisgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICB0aGlzLnRhc2sgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIEJ1aWxkRXZlbnQgZm9yIGEgdGFzayBsZXZlbCBldmVudC4KKyAgICAgKiBUaGUgcHJvamVjdCBhbmQgdGFyZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQKKyAgICAgKiBhcmUgZGVyaXZlZCBmcm9tIHRoZSBnaXZlbiB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgdGhlIHRhc2sgdGhhdCBlbWl0dGVkIHRoZSBldmVudC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRFdmVudChUYXNrIHRhc2spIHsKKyAgICAgICAgc3VwZXIodGFzayk7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHRhc2suZ2V0UHJvamVjdCgpOworICAgICAgICB0aGlzLnRhcmdldCA9IHRhc2suZ2V0T3duaW5nVGFyZ2V0KCk7CisgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVzc2FnZSBhbmQgcHJpb3JpdHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuCisgICAgICogVGhpcyBpcyB1c2VkIGZvciAibWVzc2FnZUxvZ2dlZCIgZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuCisgICAgICogICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIHByaW9yaXR5IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LAorICAgICAqICAgICAgICAgICAgICAgICBhcyBkZWZpbmVkIGluIHRoZSB7QGxpbmsgUHJvamVjdCBQcm9qZWN0fSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciNtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuIFRoaXMgaXMgdXNlZAorICAgICAqIGZvciAibWVzc2FnZUxvZ2dlZCIsICJ0YXNrRmluaXNoZWQiLCAidGFyZ2V0RmluaXNoZWQiLCBhbmQgImJ1aWxkRmluaXNoZWQiCisgICAgICogZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgorICAgICAqICAgICAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI21lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCkKKyAgICAgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQpCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQpCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI2J1aWxkRmluaXNoZWQoQnVpbGRFdmVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRoYXQgZmlyZWQgdGhpcyBldmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgdGhhdCBmaXJlZCB0aGlzIGV2ZW50CisgICAgICovCisgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHRoYXQgZmlyZWQgdGhpcyBldmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgdGhhdCBmaXJlZCB0aGlzIGV2ZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgIGlmIHRoaXMgZXZlbnQgaXMgYSBwcm9qZWN0IGxldmVsIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBUYXJnZXQgZ2V0VGFyZ2V0KCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhc2sgdGhhdCBmaXJlZCB0aGlzIGV2ZW50LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGFzayB0aGF0IGZpcmVkIHRoaXMgZXZlbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogICAgICAgICBpZiB0aGlzIGV2ZW50IGlzIGEgcHJvamVjdCBvciB0YXJnZXQgbGV2ZWwgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIFRhc2sgZ2V0VGFzaygpIHsKKyAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG9nZ2luZyBtZXNzYWdlLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBzZXQKKyAgICAgKiBmb3IgIm1lc3NhZ2VMb2dnZWQiIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogICAgICAgICBpZiBubyBtZXNzYWdlIGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciNtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmlvcml0eSBvZiB0aGUgbG9nZ2luZyBtZXNzYWdlLiBUaGlzIGZpZWxkIHdpbGwgb25seQorICAgICAqIGJlIHNldCBmb3IgIm1lc3NhZ2VMb2dnZWQiIGV2ZW50cy4gVGhlIG1lYW5pbmcgb2YgdGhpcyBwcmlvcml0eQorICAgICAqIGlzIGFzIHNwZWNpZmllZCBieSB0aGUgY29uc3RhbnRzIGluIHRoZSB7QGxpbmsgUHJvamVjdCBQcm9qZWN0fSBjbGFzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgorICAgICAqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI21lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgeworICAgICAgICByZXR1cm4gcHJpb3JpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93biwgaWYgYW55LiBUaGlzIGZpZWxkIHdpbGwgb25seQorICAgICAqIGJlIHNldCBmb3IgIm1lc3NhZ2VMb2dnZWQiLCAidGFza0ZpbmlzaGVkIiwgInRhcmdldEZpbmlzaGVkIiwgYW5kICJidWlsZEZpbmlzaGVkIgorICAgICAqIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24sIG9yCisgICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBleGNlcHRpb24gaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI21lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCkKKyAgICAgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQpCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQpCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI2J1aWxkRmluaXNoZWQoQnVpbGRFdmVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjcwMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBTaWduYWxzIGFuIGVycm9yIGNvbmRpdGlvbiBkdXJpbmcgYSBidWlsZAorICovCitwdWJsaWMgY2xhc3MgQnVpbGRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NDE5MDE0NTY1MzU0NjY0MjQwTDsKKworICAgIC8qKiBFeGNlcHRpb24gdGhhdCBtaWdodCBoYXZlIGNhdXNlZCB0aGlzIG9uZS4gKi8KKyAgICBwcml2YXRlIFRocm93YWJsZSBjYXVzZTsKKworICAgIC8qKiBMb2NhdGlvbiBpbiB0aGUgYnVpbGQgZmlsZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkICovCisgICAgcHJpdmF0ZSBMb2NhdGlvbiBsb2NhdGlvbiA9IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT047CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgYnVpbGQgZXhjZXB0aW9uIHdpdGggbm8gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aXZlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24gYXMKKyAgICAgKiBhIHJvb3QgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyBhIGNhdXNlIGlzIHNwZWNpZmllZC4KKyAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIHRoaXMgb25lLgorICAgICAqICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24gYXMKKyAgICAgKiBhIHJvb3QgY2F1c2UgYW5kIGEgbG9jYXRpb24gaW4gYSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBBIGRlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyBhIGNhdXNlIGlzIHNwZWNpZmllZC4KKyAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIHRoaXMgb25lLgorICAgICAqICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBpbiB0aGUgcHJvamVjdCBmaWxlIHdoZXJlIHRoZSBlcnJvcgorICAgICAqICAgICAgICAgICAgICAgICBvY2N1cnJlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSwgTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgdGhpcyhtc2csIGNhdXNlKTsKKyAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGV4Y2VwdGlvbiBhcyBhIHJvb3QgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIHRoaXMgb25lLgorICAgICAqICAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UudG9TdHJpbmcoKSk7CisgICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdGl2ZSBtZXNzYWdlIGFuZCBhCisgICAgICogbG9jYXRpb24gaW4gYSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBkZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIGluIHRoZSBwcm9qZWN0IGZpbGUgd2hlcmUgdGhlIGVycm9yCisgICAgICogICAgICAgICAgICAgICAgIG9jY3VycmVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGFzCisgICAgICogYSByb290IGNhdXNlIGFuZCBhIGxvY2F0aW9uIGluIGEgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgZXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZWQgdGhpcyBvbmUuCisgICAgICogICAgICAgICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBpbiB0aGUgcHJvamVjdCBmaWxlIHdoZXJlIHRoZSBlcnJvcgorICAgICAqICAgICAgICAgICAgICAgICBvY2N1cnJlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSwgTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgdGhpcyhjYXVzZSk7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXN0ZWQgZXhjZXB0aW9uLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgZXhjZXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubworICAgICAqICAgICAgICAgZXhjZXB0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9uZQorICAgICAqLworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gY2F1c2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmVzdGVkIGV4Y2VwdGlvbiwgaWYgYW55LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmVzdGVkIGV4Y2VwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KKyAgICAgKiAgICAgICAgIGV4Y2VwdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBvbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgeworICAgICAgICByZXR1cm4gZ2V0RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yIGFuZCB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBhbmQgdGhlIGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbG9jYXRpb24udG9TdHJpbmcoKSArIGdldE1lc3NhZ2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgZmlsZSBsb2NhdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbG9jYXRpb24gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2UgZm9yIHRoaXMgZXhjZXB0aW9uIGFuZCBhbnkKKyAgICAgKiBuZXN0ZWQgZXhjZXB0aW9uIHRvIDxjb2RlPlN5c3RlbS5lcnI8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKKyAgICAgICAgcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhpcyBleGNlcHRpb24gYW5kIGFueSBuZXN0ZWQKKyAgICAgKiBleGNlcHRpb24gdG8gdGhlIHNwZWNpZmllZCBQcmludFN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcyBUaGUgUHJpbnRTdHJlYW0gdG8gcHJpbnQgdGhlIHN0YWNrIHRyYWNlIHRvLgorICAgICAqICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcHMpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChwcykgeworICAgICAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHBzKTsKKyAgICAgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHMucHJpbnRsbigiLS0tIE5lc3RlZCBFeGNlcHRpb24gLS0tIik7CisgICAgICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKHBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhpcyBleGNlcHRpb24gYW5kIGFueSBuZXN0ZWQKKyAgICAgKiBleGNlcHRpb24gdG8gdGhlIHNwZWNpZmllZCBQcmludFdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwdyBUaGUgUHJpbnRXcml0ZXIgdG8gcHJpbnQgdGhlIHN0YWNrIHRyYWNlIHRvLgorICAgICAqICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcHcpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChwdykgeworICAgICAgICAgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICAgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiLS0tIE5lc3RlZCBFeGNlcHRpb24gLS0tIik7CisgICAgICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkTGlzdGVuZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODAxYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworLyoqCisgKiBJbnN0YW5jZXMgb2YgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBjYW4gcmVnaXN0ZXIKKyAqIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhpbmdzIGhhcHBlbmVkIGR1cmluZyBhIGJ1aWxkLgorICoKKyAqIEBzZWUgQnVpbGRFdmVudAorICogQHNlZSBQcm9qZWN0I2FkZEJ1aWxkTGlzdGVuZXIoQnVpbGRMaXN0ZW5lcikKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQnVpbGRMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogU2lnbmFscyB0aGF0IGEgYnVpbGQgaGFzIHN0YXJ0ZWQuIFRoaXMgZXZlbnQKKyAgICAgKiBpcyBmaXJlZCBiZWZvcmUgYW55IHRhcmdldHMgaGF2ZSBzdGFydGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIFNpZ25hbHMgdGhhdCB0aGUgbGFzdCB0YXJnZXQgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50CisgICAgICogd2lsbCBzdGlsbCBiZSBmaXJlZCBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGJ1aWxkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRFdmVudCNnZXRFeGNlcHRpb24oKQorICAgICAqLworICAgIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIFNpZ25hbHMgdGhhdCBhIHRhcmdldCBpcyBzdGFydGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBBbiBldmVudCB3aXRoIGFueSByZWxldmFudCBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFyZ2V0KCkKKyAgICAgKi8KKyAgICB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIHRoYXQgYSB0YXJnZXQgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50IHdpbGwKKyAgICAgKiBzdGlsbCBiZSBmaXJlZCBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGJ1aWxkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRFdmVudCNnZXRFeGNlcHRpb24oKQorICAgICAqLworICAgIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIHRoYXQgYSB0YXNrIGlzIHN0YXJ0aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRFdmVudCNnZXRUYXNrKCkKKyAgICAgKi8KKyAgICB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpOworCisgICAgLyoqCisgICAgICogU2lnbmFscyB0aGF0IGEgdGFzayBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQgd2lsbCBzdGlsbAorICAgICAqIGJlIGZpcmVkIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgYnVpbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHNlZSBCdWlsZEV2ZW50I2dldEV4Y2VwdGlvbigpCisgICAgICovCisgICAgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIGEgbWVzc2FnZSBsb2dnaW5nIGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRFdmVudCNnZXRNZXNzYWdlKCkKKyAgICAgKiBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKKyAgICAgKiBAc2VlIEJ1aWxkRXZlbnQjZ2V0UHJpb3JpdHkoKQorICAgICAqLworICAgIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkTG9nZ2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZExvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OWQ4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZExvZ2dlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CisKKy8qKgorICogSW50ZXJmYWNlIHVzZWQgYnkgQW50IHRvIGxvZyB0aGUgYnVpbGQgb3V0cHV0LgorICoKKyAqIEEgYnVpbGQgbG9nZ2VyIGlzIGEgYnVpbGQgbGlzdGVuZXIgd2hpY2ggaGFzIHRoZSAncmlnaHQnIHRvIHNlbmQgb3V0cHV0IHRvCisgKiB0aGUgYW50IGxvZywgd2hpY2ggaXMgdXN1YWxseSA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPiB1bmxlc3MgcmVkaXJlY3RlZCBieQorICogdGhlIDxjb2RlPi1sb2dmaWxlPC9jb2RlPiBvcHRpb24uCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIEJ1aWxkTG9nZ2VyIGV4dGVuZHMgQnVpbGRMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBoaWdoZXN0IGxldmVsIG9mIG1lc3NhZ2UgdGhpcyBsb2dnZXIgc2hvdWxkIHJlc3BvbmQgdG8uCisgICAgICoKKyAgICAgKiBPbmx5IG1lc3NhZ2VzIHdpdGggYSBtZXNzYWdlIGxldmVsIGxvd2VyIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisgICAgICogZ2l2ZW4gbGV2ZWwgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZy4KKyAgICAgKiA8UD4KKyAgICAgKiBDb25zdGFudHMgZm9yIHRoZSBtZXNzYWdlIGxldmVscyBhcmUgaW4gdGhlCisgICAgICoge0BsaW5rIFByb2plY3QgUHJvamVjdH0gY2xhc3MuIFRoZSBvcmRlciBvZiB0aGUgbGV2ZWxzLCBmcm9tIGxlYXN0CisgICAgICogdG8gbW9zdCB2ZXJib3NlLCBpcyA8Y29kZT5NU0dfRVJSPC9jb2RlPiwgPGNvZGU+TVNHX1dBUk48L2NvZGU+LAorICAgICAqIDxjb2RlPk1TR19JTkZPPC9jb2RlPiwgPGNvZGU+TVNHX1ZFUkJPU0U8L2NvZGU+LAorICAgICAqIDxjb2RlPk1TR19ERUJVRzwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGV2ZWwgdGhlIGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBsb2dnZXIuCisgICAgICovCisgICAgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50IGxldmVsKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhpcyBsb2dnZXIgaXMgdG8gc2VuZCBpdHMgb3V0cHV0LgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHN0cmVhbSBmb3IgdGhlIGxvZ2dlci4KKyAgICAgKiAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHZvaWQgc2V0T3V0cHV0UHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gb3V0cHV0KTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyBsb2dnZXIgdG8gcHJvZHVjZSBlbWFjcyAoYW5kIG90aGVyIGVkaXRvcikgZnJpZW5kbHkgb3V0cHV0LgorICAgICAqCisgICAgICogQHBhcmFtIGVtYWNzTW9kZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBvdXRwdXQgaXMgdG8gYmUgdW5hZG9ybmVkIHNvIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgIGVtYWNzIGFuZCBvdGhlciBlZGl0b3JzIGNhbiBwYXJzZSBmaWxlcyBuYW1lcywgZXRjLgorICAgICAqLworICAgIHZvaWQgc2V0RW1hY3NNb2RlKGJvb2xlYW4gZW1hY3NNb2RlKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhpcyBsb2dnZXIgaXMgdG8gc2VuZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnIgVGhlIGVycm9yIHN0cmVhbSBmb3IgdGhlIGxvZ2dlci4KKyAgICAgKiAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHZvaWQgc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSBlcnIpOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQ29tcG9uZW50SGVscGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Db21wb25lbnRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjE4YzJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQ29tcG9uZW50SGVscGVyLmphdmEKQEAgLTAsMCArMSwxMTA1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlR5cGVkZWY7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGVmaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogQ29tcG9uZW50IGNyZWF0aW9uIGFuZCBjb25maWd1cmF0aW9uLgorICoKKyAqIFRoZSBjbGFzcyBpcyBiYXNlZCBhcm91bmQgaGFuZGluZyBjb21wb25lbnQKKyAqIGRlZmluaXRpb25zIGluIGFuIEFudFR5cGVUYWJsZS4KKyAqCisgKiBUaGUgb2xkIHRhc2svdHlwZSBtZXRob2RzIGhhdmUgYmVlbiBrZXB0CisgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJseS4KKyAqIFByb2plY3Qgd2lsbCBqdXN0IGRlbGVnYXRlIGl0cyBjYWxscyB0byB0aGlzIGNsYXNzLgorICoKKyAqIEEgdmVyeSBzaW1wbGUgaG9vayBtZWNoYW5pc20gaXMgcHJvdmlkZWQgdGhhdCBhbGxvd3MgdXNlcnMgdG8gcGx1ZworICogaW4gY3VzdG9tIGNvZGUuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcmVwbGFjZSB0aGUgZGVmYXVsdCBiZWhhdmlvcgorICogKCBmb3IgZXhhbXBsZSBpbiBhbiBhcHAgZW1iZWRkaW5nIGFudCApCisgKgorICogQHNpbmNlIEFudDEuNgorICovCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50SGVscGVyICB7CisgICAgLyoqIE1hcCBvZiBjb21wb25lbnQgbmFtZSB0byBsaXN0cyBvZiByZXN0cmljdGVkIGRlZmluaXRpb25zICovCisgICAgcHJpdmF0ZSBNYXAgICAgICAgICAgcmVzdHJpY3RlZERlZmluaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKiBNYXAgZnJvbSBjb21wb25lbnQgbmFtZSB0byBhbnR0eXBlZGVmaW5pdGlvbiAqLworICAgIHByaXZhdGUgQW50VHlwZVRhYmxlIGFudFR5cGVUYWJsZTsKKworICAgIC8qKiBNYXAgb2YgdGFza3MgZ2VuZXJhdGVkIGZyb20gYW50VHlwZVRhYmxlICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgdGFza0NsYXNzRGVmaW5pdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKiogZmxhZyB0byByZWJ1aWxkIHRhc2tDbGFzc0RlZmluaXRpb25zICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlYnVpbGRUYXNrQ2xhc3NEZWZpbml0aW9ucyA9IHRydWU7CisKKyAgICAvKiogTWFwIG9mIHR5cGVzIGdlbmVyYXRlZCBmcm9tIGFudFR5cGVUYWJsZSAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHR5cGVDbGFzc0RlZmluaXRpb25zID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgLyoqIGZsYWcgdG8gcmVidWlsZCB0eXBlQ2xhc3NEZWZpbml0aW9ucyAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZWJ1aWxkVHlwZUNsYXNzRGVmaW5pdGlvbnMgPSB0cnVlOworCisgICAgLyoqIFNldCBvZiBuYW1lc3BhY2VzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgZm9yIGFudGxpYnMgKi8KKyAgICBwcml2YXRlIFNldCBjaGVja2VkTmFtZXNwYWNlcyA9IG5ldyBIYXNoU2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBTdGFjayBvZiBhbnRsaWIgY29udGV4dHMgdXNlZCB0byByZXNvbHZlIGRlZmluaXRpb25zIHdoaWxlCisgICAgICogICBwcm9jZXNzaW5nIGFudGxpYgorICAgICAqLworICAgIHByaXZhdGUgU3RhY2sgYW50TGliU3RhY2sgPSBuZXcgU3RhY2soKTsKKworICAgIC8qKiBjdXJyZW50IGFudGxpYiB1cmkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhbnRMaWJDdXJyZW50VXJpID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIHRoaXMgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHVzZWQgYW55d2hlcmUgaW4gdGhlIEFudCBjb2RlYmFzZQorICAgICAqIGV2ZW4gdmlhIGl0cyBhY2Nlc3NvcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIENvbXBvbmVudEhlbHBlciBuZXh0OworCisgICAgLyoqCisgICAgICogUHJvamVjdCB0aGF0IG93bnMgYSBjb21wb25lbnQgaGVscGVyCisgICAgICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKioKKyAgICAgKiBFcnJvciBzdHJpbmcgd2hlbiB0aGUgZmlsZSB0YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIGNhbm5vdCBiZSBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19UQVNLX0xJU1RfTE9BRCA9ICJDYW4ndCBsb2FkIGRlZmF1bHQgdGFzayBsaXN0IjsKKworICAgIC8qKgorICAgICAqIEVycm9yIHN0cmluZyB3aGVuIHRoZSB0eXBlZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIGNhbm5vdCBiZSBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19UWVBFX0xJU1RfTE9BRCA9ICJDYW4ndCBsb2FkIGRlZmF1bHQgdHlwZSBsaXN0IjsKKworICAgIC8qKgorICAgICAqIHJlZmVyZW5jZSB1bmRlciB3aGljaCB3ZSByZWdpc3RlciBvdXJzZWx2ZXMgd2l0aCBhIHByb2plY3QgLXtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0hFTFBFUl9SRUZFUkVOQ0UgPSAiYW50LkNvbXBvbmVudEhlbHBlciI7CisKKyAgICAvKioKKyAgICAgKiBzdHJpbmcgdXNlZCB0byBjb250cm9sIGJ1aWxkLnN5c3BhdGggcG9saWN5IHtAdmFsdWV9CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1NZU0NMQVNTUEFUSF9PTkxZID0gIm9ubHkiOworCisgICAgLyoqCisgICAgICogc3BlY2lhbCBuYW1lIG9mIGFudCdzIHByb3BlcnR5IHRhc2sgLXtAdmFsdWV9LiBUaGVyZSBpcyBzb21lCisgICAgICogY29udHJpdmVkIHdvcmsgaGVyZSB0byBlbmFibGUgdGhpcyBlYXJseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1BST1BFUlRZX1RBU0sgPSAicHJvcGVydHkiOworCisgICAgLy8ge3Rhc2tzLCB0eXBlc30KKyAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzW10gZGVmYXVsdERlZmluaXRpb25zID0gbmV3IFByb3BlcnRpZXNbMl07CisKKyAgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm9qZWN0LgorICAgICAqIEByZXR1cm4gdGhlIHByb2plY3Qgb3duZXIgb2YgdGhpcyBoZWxwZXIuCisgICAgICovCisgICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgICByZXR1cm4gcHJvamVjdDsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhIHByb2plY3QgY29tcG9uZW50IGZvciBhIHNwZWNpZmljIHByb2plY3QsIGNyZWF0aW5nCisgICAgICogaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QuCisgICAgICogQHJldHVybiB0aGUgcHJvamVjdCBjb21wb25lbnQgZm9yIGEgc3BlY2lmaWMgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudEhlbHBlciBnZXRDb21wb25lbnRIZWxwZXIoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIFNpbmdsZXRvbiBmb3Igbm93LCBpdCBtYXkgY2hhbmdlICggcGVyL2NsYXNzbG9hZGVyICkKKyAgICAgICAgQ29tcG9uZW50SGVscGVyIHBoID0gKENvbXBvbmVudEhlbHBlcikgcHJvamVjdC5nZXRSZWZlcmVuY2UoQ09NUE9ORU5UX0hFTFBFUl9SRUZFUkVOQ0UpOworICAgICAgICBpZiAocGggIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHBoOworICAgICAgICB9CisgICAgICAgIHBoID0gbmV3IENvbXBvbmVudEhlbHBlcigpOworICAgICAgICBwaC5zZXRQcm9qZWN0KHByb2plY3QpOworCisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKENPTVBPTkVOVF9IRUxQRVJfUkVGRVJFTkNFLCBwaCk7CisgICAgICAgIHJldHVybiBwaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IENvbXBvbmVudEhlbHBlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tcG9uZW50SGVscGVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmV4dCBjaGFpbmVkIGNvbXBvbmVudCBoZWxwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV4dCB0aGUgbmV4dCBjaGFpbmVkIGNvbXBvbmVudCBoZWxwZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmV4dChDb21wb25lbnRIZWxwZXIgbmV4dCkgeworICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmV4dCBjaGFpbmVkIGNvbXBvbmVudCBoZWxwZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYWluZWQgY29tcG9uZW50IGhlbHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcG9uZW50SGVscGVyIGdldE5leHQoKSB7CisgICAgICAgIHJldHVybiBuZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb2plY3QgZm9yIHRoaXMgY29tcG9uZW50IGhlbHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGZvciB0aGlzIGhlbHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgICAgICBhbnRUeXBlVGFibGUgPSBuZXcgQW50VHlwZVRhYmxlKHByb2plY3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgd2l0aCBjcmVhdGluZyBjaGlsZCBwcm9qZWN0cy4gRWFjaCBjaGlsZAorICAgICAqIHByb2plY3QgaW5oZXJpdHMgdGhlIGNvbXBvbmVudCBkZWZpbml0aW9ucworICAgICAqIGZyb20gaXRzIHBhcmVudC4KKyAgICAgKiBAcGFyYW0gaGVscGVyIHRoZSBjb21wb25lbnQgaGVscGVyIG9mIHRoZSBwYXJlbnQgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0U3ViUHJvamVjdChDb21wb25lbnRIZWxwZXIgaGVscGVyKSB7CisgICAgICAgIC8vIGFkZCB0aGUgdHlwZXMgb2YgdGhlIHBhcmVudCBwcm9qZWN0CisgICAgICAgIEFudFR5cGVUYWJsZSB0eXBlVGFibGUgPSBoZWxwZXIuYW50VHlwZVRhYmxlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSAoQW50VHlwZURlZmluaXRpb24pIGkubmV4dCgpOworICAgICAgICAgICAgYW50VHlwZVRhYmxlLnB1dChkZWYuZ2V0TmFtZSgpLCBkZWYpOworICAgICAgICB9CisgICAgICAgIC8vIGFkZCB0aGUgcGFyc2VkIG5hbWVzcGFjZXMgb2YgdGhlIHBhcmVudCBwcm9qZWN0CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGhlbHBlci5jaGVja2VkTmFtZXNwYWNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGNoZWNrZWROYW1lc3BhY2VzLmFkZChpLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhlIHJlc3RyaWN0ZWQgZGVmaW5pdGlvbnMKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaGVscGVyLnJlc3RyaWN0ZWREZWZpbml0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKyAgICAgICAgICAgIHJlc3RyaWN0ZWREZWZpbml0aW9ucy5wdXQoCisgICAgICAgICAgICAgICAgZW50cnkuZ2V0S2V5KCksIG5ldyBBcnJheUxpc3QoKExpc3QpIGVudHJ5LmdldFZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBVbmtub3duRWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1ZSBUaGUgVW5rbm93biBFbGVtZW50IGNyZWF0aW5nIHRoaXMgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBucyBOYW1lc3BhY2UgVVJJLiBBbHNvIGF2YWlsYWJsZSBhcyB1ZS5nZXROYW1lc3BhY2UoKS4KKyAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSBUaGUgY29tcG9uZW50IHR5cGUsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIEFsc28gYXZhaWxhYmxlIGFzIHVlLmdldENvbXBvbmVudE5hbWUoKS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbXBvbmVudC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUNvbXBvbmVudChVbmtub3duRWxlbWVudCB1ZSwgU3RyaW5nIG5zLCBTdHJpbmcgY29tcG9uZW50VHlwZSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBjb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7CisgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICBUYXNrIHRhc2sgPSAoVGFzaykgY29tcG9uZW50OworICAgICAgICAgICAgdGFzay5zZXRMb2NhdGlvbih1ZS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIHRhc2suc2V0VGFza1R5cGUoY29tcG9uZW50VHlwZSk7CisgICAgICAgICAgICB0YXNrLnNldFRhc2tOYW1lKHVlLmdldFRhc2tOYW1lKCkpOworICAgICAgICAgICAgdGFzay5zZXRPd25pbmdUYXJnZXQodWUuZ2V0T3duaW5nVGFyZ2V0KCkpOworICAgICAgICAgICAgdGFzay5pbml0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gb2JqZWN0IGZvciBhIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQsIGlmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBpcyBpbiBhIG5hbWVzcGFjZSwgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbmFtZSBpcyBwcmVmaXhlZCB3aXRoIHRoZSBuYW1lc3BhY2UgdXJpIGFuZCAiOiIuCisgICAgICogQHJldHVybiB0aGUgY2xhc3MgaWYgZm91bmQgb3IgbnVsbCBpZiBub3QuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjcmVhdGVDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKKyAgICAgICAgQW50VHlwZURlZmluaXRpb24gZGVmID0gZ2V0RGVmaW5pdGlvbihjb21wb25lbnROYW1lKTsKKyAgICAgICAgcmV0dXJuIGRlZiA9PSBudWxsID8gbnVsbCA6IGRlZi5jcmVhdGUocHJvamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjbGFzcyBvZiB0aGUgY29tcG9uZW50IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LCBpZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQgaXMgaW4gYSBuYW1lc3BhY2UsIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaXMgcHJlZml4ZWQgd2l0aCB0aGUgbmFtZXNwYWNlIHVyaSBhbmQgIjoiLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIGlmIGZvdW5kIG9yIG51bGwgaWYgbm90LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRDb21wb25lbnRDbGFzcyhTdHJpbmcgY29tcG9uZW50TmFtZSkgeworICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXREZWZpbml0aW9uKGNvbXBvbmVudE5hbWUpOworICAgICAgICByZXR1cm4gZGVmID09IG51bGwgPyBudWxsIDogZGVmLmdldEV4cG9zZWRDbGFzcyhwcm9qZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFudFR5cGVEZWZpbml0aW9uIGZvciBhIGNvbXBvbmVudE5hbWUuCisgICAgICogQHBhcmFtIGNvbXBvbmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhbnQgZGVmaW5pdGlvbiBvciBudWxsIGlmIG5vdCBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBBbnRUeXBlRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKFN0cmluZyBjb21wb25lbnROYW1lKSB7CisgICAgICAgIGNoZWNrTmFtZXNwYWNlKGNvbXBvbmVudE5hbWUpOworICAgICAgICByZXR1cm4gYW50VHlwZVRhYmxlLmdldERlZmluaXRpb24oY29tcG9uZW50TmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgaW5pdGlhbGl6YXRpb24gY29kZSBpbXBsZW1lbnRpbmcgdGhlIG9yaWdpbmFsIGFudCBjb21wb25lbnQKKyAgICAgKiBsb2FkaW5nIGZyb20gL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHQucHJvcGVydGllcworICAgICAqIGFuZCAvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdC5wcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXREZWZhdWx0RGVmaW5pdGlvbnMoKSB7CisgICAgICAgIGluaXRUYXNrcygpOworICAgICAgICBpbml0VHlwZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IHRhc2sgZGVmaW5pdGlvbiB0byB0aGUgcHJvamVjdC4KKyAgICAgKiBBdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGFuIGV4aXN0aW5nIGRlZmluaXRpb24gd2l0aCBhbgorICAgICAqIGVxdWl2YWxlbnQgb25lIChpLmUuIHdpdGggdGhlIHNhbWUgY2xhc3NuYW1lKSByZXN1bHRzIGluCisgICAgICogYSB2ZXJib3NlIGxvZyBtZXNzYWdlLiBBdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGFuIGV4aXN0aW5nIGRlZmluaXRpb24KKyAgICAgKiB3aXRoIGEgZGlmZmVyZW50IG9uZSByZXN1bHRzIGluIGEgd2FybmluZyBsb2cgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFzayB0byBhZGQuCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0YXNrQ2xhc3MgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSB0YXNrLgorICAgICAqICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBpcyB1bnN1aXRhYmxlIGZvciBiZWluZyBhbiBBbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suIEFuIGVycm9yIGxldmVsIG1lc3NhZ2UgaXMgbG9nZ2VkIGJlZm9yZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqCisgICAgICogQHNlZSAjY2hlY2tUYXNrQ2xhc3MoQ2xhc3MpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGFza0RlZmluaXRpb24oU3RyaW5nIHRhc2tOYW1lLCBDbGFzcyB0YXNrQ2xhc3MpIHsKKyAgICAgICAgY2hlY2tUYXNrQ2xhc3ModGFza0NsYXNzKTsKKyAgICAgICAgQW50VHlwZURlZmluaXRpb24gZGVmID0gbmV3IEFudFR5cGVEZWZpbml0aW9uKCk7CisgICAgICAgIGRlZi5zZXROYW1lKHRhc2tOYW1lKTsKKyAgICAgICAgZGVmLnNldENsYXNzTG9hZGVyKHRhc2tDbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgZGVmLnNldENsYXNzKHRhc2tDbGFzcyk7CisgICAgICAgIGRlZi5zZXRBZGFwdGVyQ2xhc3MoVGFza0FkYXB0ZXIuY2xhc3MpOworICAgICAgICBkZWYuc2V0Q2xhc3NOYW1lKHRhc2tDbGFzcy5nZXROYW1lKCkpOworICAgICAgICBkZWYuc2V0QWRhcHRUb0NsYXNzKFRhc2suY2xhc3MpOworICAgICAgICB1cGRhdGVEYXRhVHlwZURlZmluaXRpb24oZGVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgYSBjbGFzcyBpcyBzdWl0YWJsZSBmb3Igc2VydmluZyBhcyBBbnQgdGFzay4KKyAgICAgKiBBbnQgdGFzayBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIG11c3QgYmUgcHVibGljLCBjb25jcmV0ZSwgYW5kIGhhdmUKKyAgICAgKiBhIG5vLWFyZyBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrQ2xhc3MgVGhlIGNsYXNzIHRvIGJlIGNoZWNrZWQuCisgICAgICogICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNsYXNzIGlzIHVuc3VpdGFibGUgZm9yIGJlaW5nIGFuIEFudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay4gQW4gZXJyb3IgbGV2ZWwgbWVzc2FnZSBpcyBsb2dnZWQgYmVmb3JlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hlY2tUYXNrQ2xhc3MoZmluYWwgQ2xhc3MgdGFza0NsYXNzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKHRhc2tDbGFzcy5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gdGFza0NsYXNzICsgIiBpcyBub3QgcHVibGljIjsKKyAgICAgICAgICAgIHByb2plY3QubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QodGFza0NsYXNzLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSB0YXNrQ2xhc3MgKyAiIGlzIGFic3RyYWN0IjsKKyAgICAgICAgICAgIHByb2plY3QubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhc2tDbGFzcy5nZXRDb25zdHJ1Y3RvcigoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgICAgICAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciBwdWJsaWMsIHNpbmNlCisgICAgICAgICAgICAvLyBnZXRDb25zdHJ1Y3RvciBmaW5kcyBwdWJsaWMgY29uc3RydWN0b3JzIG9ubHkuCisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJObyBwdWJsaWMgbm8tYXJnIGNvbnN0cnVjdG9yIGluICIgKyB0YXNrQ2xhc3M7CisgICAgICAgICAgICBwcm9qZWN0LmxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIGlmICghVGFzay5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhc2tDbGFzcykpIHsKKyAgICAgICAgICAgIFRhc2tBZGFwdGVyLmNoZWNrVGFza0NsYXNzKHRhc2tDbGFzcywgcHJvamVjdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRhc2sgZGVmaW5pdGlvbiBoYXNodGFibGUuIFRoZSByZXR1cm5lZCBoYXNodGFibGUgaXMKKyAgICAgKiAibGl2ZSIgYW5kIHNvIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIGZyb20gdGFzayBuYW1lIHRvIGltcGxlbWVudGluZyBjbGFzcworICAgICAqICAgICAgICAgKFN0cmluZyB0byBDbGFzcykuCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRUYXNrRGVmaW5pdGlvbnMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGFza0NsYXNzRGVmaW5pdGlvbnMpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoYW50VHlwZVRhYmxlKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYnVpbGRUYXNrQ2xhc3NEZWZpbml0aW9ucykgeworICAgICAgICAgICAgICAgICAgICB0YXNrQ2xhc3NEZWZpbml0aW9ucy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhbnRUeXBlVGFibGUua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBhbnRUeXBlVGFibGUuZ2V0RXhwb3NlZENsYXNzKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXp6ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUYXNrLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza0NsYXNzRGVmaW5pdGlvbnMucHV0KG5hbWUsIGFudFR5cGVUYWJsZS5nZXRUeXBlQ2xhc3MobmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlYnVpbGRUYXNrQ2xhc3NEZWZpbml0aW9ucyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGFza0NsYXNzRGVmaW5pdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0eXBlIGRlZmluaXRpb24gaGFzaHRhYmxlLiBUaGUgcmV0dXJuZWQgaGFzaHRhYmxlIGlzCisgICAgICogImxpdmUiIGFuZCBzbyBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgorICAgICAqCisgICAgICogQHJldHVybiBhIG1hcCBvZiBmcm9tIHR5cGUgbmFtZSB0byBpbXBsZW1lbnRpbmcgY2xhc3MKKyAgICAgKiAgICAgICAgIChTdHJpbmcgdG8gQ2xhc3MpLgorICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0eXBlQ2xhc3NEZWZpbml0aW9ucykgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChhbnRUeXBlVGFibGUpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVidWlsZFR5cGVDbGFzc0RlZmluaXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVDbGFzc0RlZmluaXRpb25zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGFudFR5cGVUYWJsZS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGFudFR5cGVUYWJsZS5nZXRFeHBvc2VkQ2xhc3MobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoVGFzay5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQ2xhc3NEZWZpbml0aW9ucy5wdXQobmFtZSwgYW50VHlwZVRhYmxlLmdldFR5cGVDbGFzcyhuYW1lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVidWlsZFR5cGVDbGFzc0RlZmluaXRpb25zID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlQ2xhc3NEZWZpbml0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHJldHVybnMgYSBsaXN0IG9mIHJlc3RyaWN0ZWQgZGVmaW5pdGlvbnMgZm9yIGEgbmFtZS4KKyAgICAgKiBAcGFyYW0gY29tcG9uZW50TmFtZSB0aGUgbmFtZSB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiByZXN0cmljdGVkIGRlZmluaXRpb25zIGZvciBhIHBhcnRpY3VsYXIgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRSZXN0cmljdGVkRGVmaW5pdGlvbnMoU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIChMaXN0KSByZXN0cmljdGVkRGVmaW5pdGlvbnMuZ2V0KGNvbXBvbmVudE5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgZGF0YXR5cGUgZGVmaW5pdGlvbi4KKyAgICAgKiBBdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGFuIGV4aXN0aW5nIGRlZmluaXRpb24gd2l0aCBhbgorICAgICAqIGVxdWl2YWxlbnQgb25lIChpLmUuIHdpdGggdGhlIHNhbWUgY2xhc3NuYW1lKSByZXN1bHRzIGluCisgICAgICogYSB2ZXJib3NlIGxvZyBtZXNzYWdlLiBBdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGFuIGV4aXN0aW5nIGRlZmluaXRpb24KKyAgICAgKiB3aXRoIGEgZGlmZmVyZW50IG9uZSByZXN1bHRzIGluIGEgd2FybmluZyBsb2cgbWVzc2FnZSwgYnV0IHRoZQorICAgICAqIGRlZmluaXRpb24gaXMgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlTmFtZSBUaGUgbmFtZSBvZiB0aGUgZGF0YXR5cGUuCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0eXBlQ2xhc3MgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBkYXRhdHlwZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERhdGFUeXBlRGVmaW5pdGlvbihTdHJpbmcgdHlwZU5hbWUsIENsYXNzIHR5cGVDbGFzcykgeworICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSBuZXcgQW50VHlwZURlZmluaXRpb24oKTsKKyAgICAgICAgZGVmLnNldE5hbWUodHlwZU5hbWUpOworICAgICAgICBkZWYuc2V0Q2xhc3ModHlwZUNsYXNzKTsKKyAgICAgICAgdXBkYXRlRGF0YVR5cGVEZWZpbml0aW9uKGRlZik7CisgICAgICAgIHByb2plY3QubG9nKCIgK1VzZXIgZGF0YXR5cGU6ICIgKyB0eXBlTmFtZSArICIgICAgICIgKyB0eXBlQ2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmliZSA8Y29kZT5hZGREYXRhVHlwZURlZmluaXRpb248L2NvZGU+IG1ldGhvZCBoZXJlLgorICAgICAqCisgICAgICogQHBhcmFtIGRlZiBhbiA8Y29kZT5BbnRUeXBlRGVmaW5pdGlvbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGF0YVR5cGVEZWZpbml0aW9uKEFudFR5cGVEZWZpbml0aW9uIGRlZikgeworICAgICAgICBpZiAoIWRlZi5pc1Jlc3RyaWN0KCkpIHsKKyAgICAgICAgICAgdXBkYXRlRGF0YVR5cGVEZWZpbml0aW9uKGRlZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cGRhdGVSZXN0cmljdGVkRGVmaW5pdGlvbihkZWYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBkYXRhdHlwZSBkZWZpbml0aW9uIGhhc2h0YWJsZS4gVGhlIHJldHVybmVkCisgICAgICogaGFzaHRhYmxlIGlzICJsaXZlIiBhbmQgc28gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBtYXAgb2YgZnJvbSBkYXRhdHlwZSBuYW1lIHRvIGltcGxlbWVudGluZyBjbGFzcworICAgICAqICAgICAgICAgKFN0cmluZyB0byBDbGFzcykuCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRBbnRUeXBlVGFibGUoKSB7CisgICAgICAgIHJldHVybiBhbnRUeXBlVGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIHRhc2suCisgICAgICoKKyAgICAgKiAgQ2FsbGVkIGZyb20gUHJvamVjdC5jcmVhdGVUYXNrKCksIHdoaWNoIGNhbiBiZSBjYWxsZWQgYnkgdGFza3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFza1R5cGUgVGhlIG5hbWUgb2YgdGhlIHRhc2sgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mLgorICAgICAqICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCB0YXNrLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqICAgICAgICAgdGhlIHRhc2sgbmFtZSBpcyBub3QgcmVjb2duaXNlZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHRhc2sgbmFtZSBpcyByZWNvZ25pc2VkIGJ1dCB0YXNrCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbiBmYWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFzayBjcmVhdGVUYXNrKFN0cmluZyB0YXNrVHlwZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgVGFzayB0YXNrID0gY3JlYXRlTmV3VGFzayh0YXNrVHlwZSk7CisgICAgICAgIGlmICh0YXNrID09IG51bGwgJiYgdGFza1R5cGUuZXF1YWxzKEFOVF9QUk9QRVJUWV9UQVNLKSkgeworICAgICAgICAgICAgLy8gcXVpY2sgZml4IGZvciBBbnQuamF2YSB1c2Ugb2YgcHJvcGVydHkgYmVmb3JlCisgICAgICAgICAgICAvLyBpbml0aWFsaXppbmcgdGhlIHByb2plY3QKKyAgICAgICAgICAgIGFkZFRhc2tEZWZpbml0aW9uKEFOVF9QUk9QRVJUWV9UQVNLLCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Qcm9wZXJ0eS5jbGFzcyk7CisgICAgICAgICAgICB0YXNrID0gY3JlYXRlTmV3VGFzayh0YXNrVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIHRhc2suCisgICAgICogQHNpbmNlIGFudDEuNgorICAgICAqIEBwYXJhbSB0YXNrVHlwZSBUaGUgbmFtZSBvZiB0aGUgdGFzayB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIHRhc2ssIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisgICAgICogICAgICAgICB0aGUgdGFzayBuYW1lIGlzIG5vdCByZWNvZ25pc2VkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgdGFzayBuYW1lIGlzIHJlY29nbmlzZWQgYnV0IHRhc2sKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uIGZhaWxzLgorICAgICAqLworICAgIHByaXZhdGUgVGFzayBjcmVhdGVOZXdUYXNrKFN0cmluZyB0YXNrVHlwZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgYyA9IGdldENvbXBvbmVudENsYXNzKHRhc2tUeXBlKTsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCB8fCAhKFRhc2suY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBvYmogPSBjcmVhdGVDb21wb25lbnQodGFza1R5cGUpOworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFRhc2spKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4cGVjdGVkIGEgVGFzayBmcm9tICciICsgdGFza1R5cGUKKyAgICAgICAgICAgICAgICAgICAgKyAiJyBidXQgZ290IGFuIGluc3RhbmNlIG9mICIgKyBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGluc3RlYWQiKTsKKyAgICAgICAgfQorICAgICAgICBUYXNrIHRhc2sgPSAoVGFzaykgb2JqOworICAgICAgICB0YXNrLnNldFRhc2tUeXBlKHRhc2tUeXBlKTsKKworICAgICAgICAvLyBzZXQgZGVmYXVsdCB2YWx1ZSwgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIKKyAgICAgICAgdGFzay5zZXRUYXNrTmFtZSh0YXNrVHlwZSk7CisKKyAgICAgICAgcHJvamVjdC5sb2coIiAgICtUYXNrOiAiICsgdGFza1R5cGUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIGRhdGEgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlTmFtZSBUaGUgbmFtZSBvZiB0aGUgZGF0YSB0eXBlIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZi4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgZGF0YSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqICAgICAgICAgdGhlIGRhdGEgdHlwZSBuYW1lIGlzIG5vdCByZWNvZ25pc2VkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZGF0YSB0eXBlIG5hbWUgaXMgcmVjb2duaXNlZCBidXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGNyZWF0aW9uIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRGF0YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlQ29tcG9uZW50KHR5cGVOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBkZXNjcmliZS4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudCB0eXBlLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIHJldHVybiBnZXRFbGVtZW50TmFtZShlbGVtZW50LCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG8gICAgIFRoZSBlbGVtZW50IHRvIGRlc2NyaWJlLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYnJpZWYgd2hldGhlciB0byB1c2UgYSBicmllZiBkZXNjcmlwdGlvbi4KKyAgICAgKiBAcmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQgdHlwZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZShPYmplY3QgbywgYm9vbGVhbiBicmllZikgeworICAgICAgICAvLyAgUFI6IEkgZG8gbm90IGtub3cgd2hhdCB0byBkbyBpZiB0aGUgb2JqZWN0IGNsYXNzCisgICAgICAgIC8vICAgICAgaGFzIG11bHRpcGxlIGRlZmluZXMKKyAgICAgICAgLy8gICAgICBidXQgdGhpcyBpcyBmb3IgbG9nZ2luZyBvbmx5Li4uCisgICAgICAgIENsYXNzIGVsZW1lbnRDbGFzcyA9IG8uZ2V0Q2xhc3MoKTsKKyAgICAgICAgU3RyaW5nIGVsZW1lbnRDbGFzc25hbWUgPSBlbGVtZW50Q2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhbnRUeXBlVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSAoQW50VHlwZURlZmluaXRpb24pIGkubmV4dCgpOworICAgICAgICAgICAgaWYgKGVsZW1lbnRDbGFzc25hbWUuZXF1YWxzKGRlZi5nZXRDbGFzc05hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW1lbnRDbGFzcyA9PSBkZWYuZ2V0RXhwb3NlZENsYXNzKHByb2plY3QpKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZGVmLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnJpZWYgPyBuYW1lIDogIlRoZSA8IiArIG5hbWUgKyAiPiB0eXBlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0VW5tYXBwZWRFbGVtZW50TmFtZShvLmdldENsYXNzKCksIGJyaWVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW50IHdheSB0byBnZXQgc29tZSBlbGVtZW50IG5hbWUgZXZlbiB3aGVuIHlvdSBtYXkgbm90IGhhdmUgYQorICAgICAqIFByb2plY3QgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gcCAgICAgICBUaGUgb3B0aW9uYWwgUHJvamVjdCBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gbyAgICAgICBUaGUgZWxlbWVudCB0byBkZXNjcmliZS4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYnJpZWYgICB3aGV0aGVyIHRvIHVzZSBhIGJyaWVmIGRlc2NyaXB0aW9uLgorICAgICAqIEByZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudCB0eXBlLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoUHJvamVjdCBwLCBPYmplY3QgbywgYm9vbGVhbiBicmllZikgeworICAgICAgICBpZiAocCA9PSBudWxsKSB7CisgICAgICAgICAgICBwID0gUHJvamVjdC5nZXRQcm9qZWN0KG8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwID09IG51bGwgPyBnZXRVbm1hcHBlZEVsZW1lbnROYW1lKG8uZ2V0Q2xhc3MoKSwgYnJpZWYpIDogZ2V0Q29tcG9uZW50SGVscGVyKHApCisgICAgICAgICAgICAgICAgLmdldEVsZW1lbnROYW1lKG8sIGJyaWVmKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VW5tYXBwZWRFbGVtZW50TmFtZShDbGFzcyBjLCBib29sZWFuIGJyaWVmKSB7CisgICAgICAgIGlmIChicmllZikgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYy50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGRlZmluaXRpb24gaXMgYSB2YWxpZCBkZWZpbml0aW9uLS1pdCBtYXkgYmUgYQorICAgICAqIGRlZmluaXRpb24gb2YgYW4gb3B0aW9uYWwgdGFzayB0aGF0IGRvZXMgbm90IGV4aXN0LgorICAgICAqIEBwYXJhbSBkZWYgdGhlIGRlZmluaXRpb24gdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXhwb3NlZCB0eXBlIG9mIGRlZmluaXRpb24gaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWREZWZpbml0aW9uKEFudFR5cGVEZWZpbml0aW9uIGRlZikgeworICAgICAgICByZXR1cm4gIShkZWYuZ2V0VHlwZUNsYXNzKHByb2plY3QpID09IG51bGwgfHwgZGVmLmdldEV4cG9zZWRDbGFzcyhwcm9qZWN0KSA9PSBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0d28gZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lLgorICAgICAqIEBwYXJhbSBkZWYgIHRoZSBuZXcgZGVmaW5pdGlvbi4KKyAgICAgKiBAcGFyYW0gb2xkIHRoZSBvbGQgZGVmaW5pdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBkZWZpbml0aW9ucyBhcmUgdGhlIHNhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNhbWVEZWZpbml0aW9uKEFudFR5cGVEZWZpbml0aW9uIGRlZiwgQW50VHlwZURlZmluaXRpb24gb2xkKSB7CisgICAgICAgIGJvb2xlYW4gZGVmVmFsaWQgPSB2YWxpZERlZmluaXRpb24oZGVmKTsKKyAgICAgICAgYm9vbGVhbiBzYW1lVmFsaWRpdHkgPSAoZGVmVmFsaWQgPT0gdmFsaWREZWZpbml0aW9uKG9sZCkpOworICAgICAgICAvL211c3QgaGF2ZSBzYW1lIHZhbGlkaXR5OyB0aGVuIGlmIHRoZXkgYXJlIHZhbGlkIHRoZXkgbXVzdCBhbHNvIGJlIHRoZSBzYW1lOgorICAgICAgICByZXR1cm4gc2FtZVZhbGlkaXR5ICYmICghZGVmVmFsaWQgfHwgZGVmLnNhbWVEZWZpbml0aW9uKG9sZCwgcHJvamVjdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAgKiB1cGRhdGUgdGhlIHJlc3RyaWN0ZWQgZGVmaW5pdGlvbiB0YWJsZSB3aXRoIGEgbmV3IG9yCisgICAgICAqIG1vZGlmaWVkIGRlZmluaXRpb24uCisgICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSZXN0cmljdGVkRGVmaW5pdGlvbihBbnRUeXBlRGVmaW5pdGlvbiBkZWYpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBkZWYuZ2V0TmFtZSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc3RyaWN0ZWREZWZpbml0aW9ucykgeworICAgICAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpIHJlc3RyaWN0ZWREZWZpbml0aW9ucy5nZXQobmFtZSk7CisgICAgICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICByZXN0cmljdGVkRGVmaW5pdGlvbnMucHV0KG5hbWUsIGxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNsYXNzbmFtZSBpcyBhbHJlYWR5IHByZXNlbnQgYW5kIHJlbW92ZSBpdAorICAgICAgICAgICAgLy8gaWYgaXQgaXMKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgQW50VHlwZURlZmluaXRpb24gY3VycmVudCA9IChBbnRUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGRlZi5nZXRDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5hZGQoZGVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgY29tcG9uZW50IGRlZmluaXRpb24gdGFibGUgd2l0aCBhIG5ldyBvcgorICAgICAqIG1vZGlmaWVkIGRlZmluaXRpb24uCisgICAgICogQHBhcmFtIGRlZiB0aGUgZGVmaW5pdGlvbiB0byB1cGRhdGUgb3IgaW5zZXJ0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEYXRhVHlwZURlZmluaXRpb24oQW50VHlwZURlZmluaXRpb24gZGVmKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZGVmLmdldE5hbWUoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhbnRUeXBlVGFibGUpIHsKKyAgICAgICAgICAgIHJlYnVpbGRUYXNrQ2xhc3NEZWZpbml0aW9ucyA9IHRydWU7CisgICAgICAgICAgICByZWJ1aWxkVHlwZUNsYXNzRGVmaW5pdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgQW50VHlwZURlZmluaXRpb24gb2xkID0gYW50VHlwZVRhYmxlLmdldERlZmluaXRpb24obmFtZSk7CisgICAgICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2FtZURlZmluaXRpb24oZGVmLCBvbGQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ2xhc3Mgb2xkQ2xhc3MgPSBhbnRUeXBlVGFibGUuZ2V0RXhwb3NlZENsYXNzKG5hbWUpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUYXNrID0gb2xkQ2xhc3MgIT0gbnVsbCAmJiBUYXNrLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2xkQ2xhc3MpOworICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJUcnlpbmcgdG8gb3ZlcnJpZGUgb2xkIGRlZmluaXRpb24gb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoaXNUYXNrID8gInRhc2sgIiA6ICJkYXRhdHlwZSAiKSArIG5hbWUsIChkZWYuc2ltaWxhckRlZmluaXRpb24ob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCkpID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvamVjdC5sb2coIiArRGF0YXR5cGUgIiArIG5hbWUgKyAiICIgKyBkZWYuZ2V0Q2xhc3NOYW1lKCksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIGFudFR5cGVUYWJsZS5wdXQobmFtZSwgZGVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgcHJvY2Vzc2luZyBhbiBhbnRsaWIuCisgICAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYW50bGliLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVudGVyQW50TGliKFN0cmluZyB1cmkpIHsKKyAgICAgICAgYW50TGliQ3VycmVudFVyaSA9IHVyaTsKKyAgICAgICAgYW50TGliU3RhY2sucHVzaCh1cmkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYW50bGliIHVyaS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRBbnRsaWJVcmkoKSB7CisgICAgICAgIHJldHVybiBhbnRMaWJDdXJyZW50VXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcgYW4gYW50bGliLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4aXRBbnRMaWIoKSB7CisgICAgICAgIGFudExpYlN0YWNrLnBvcCgpOworICAgICAgICBhbnRMaWJDdXJyZW50VXJpID0gKGFudExpYlN0YWNrLnNpemUoKSA9PSAwKSA/IG51bGwgOiAoU3RyaW5nKSBhbnRMaWJTdGFjay5wZWVrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBhbnQncyB0YXNrcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdFRhc2tzKCkgeworICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGdldENsYXNzTG9hZGVyKG51bGwpOworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZ2V0RGVmYXVsdERlZmluaXRpb25zKGZhbHNlKTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KG5hbWUpOworICAgICAgICAgICAgQW50VHlwZURlZmluaXRpb24gZGVmID0gbmV3IEFudFR5cGVEZWZpbml0aW9uKCk7CisgICAgICAgICAgICBkZWYuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIGRlZi5zZXRDbGFzc05hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGRlZi5zZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CisgICAgICAgICAgICBkZWYuc2V0QWRhcHRUb0NsYXNzKFRhc2suY2xhc3MpOworICAgICAgICAgICAgZGVmLnNldEFkYXB0ZXJDbGFzcyhUYXNrQWRhcHRlci5jbGFzcyk7CisgICAgICAgICAgICBhbnRUeXBlVGFibGUucHV0KG5hbWUsIGRlZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7CisgICAgICAgIFN0cmluZyBidWlsZFN5c2NsYXNzcGF0aCA9IHByb2plY3QuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9TWVNDTEFTU1BBVEgpOworICAgICAgICBpZiAocHJvamVjdC5nZXRDb3JlTG9hZGVyKCkgIT0gbnVsbAorICAgICAgICAgICAgJiYgIShCVUlMRF9TWVNDTEFTU1BBVEhfT05MWS5lcXVhbHMoYnVpbGRTeXNjbGFzc3BhdGgpKSkgeworICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBwcm9qZWN0LmdldENvcmVMb2FkZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBkZWZhdWx0IHRhc2sgb3IgdHlwZSBkZWZpbml0aW9ucyAtIGp1c3QgdGhlIG5hbWVzLAorICAgICAqICBubyBjbGFzcyBsb2FkaW5nLgorICAgICAqIENhY2hlcyByZXN1bHRzIGJldHdlZW4gY2FsbHMgdG8gcmVkdWNlIG92ZXJoZWFkLgorICAgICAqIEBwYXJhbSB0eXBlIHRydWUgZm9yIHR5cGVkZWZzLCBmYWxzZSBmb3IgdGFza2RlZnMKKyAgICAgKiBAcmV0dXJuIGEgbWFwcGluZyBmcm9tIGRlZmluaXRpb24gbmFtZXMgdG8gY2xhc3MgbmFtZXMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBzb21lIHByb2JsZW0gbG9hZGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgcGFyc2luZyB0aGUgZGVmaW5pdGlvbnMgbGlzdAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBQcm9wZXJ0aWVzIGdldERlZmF1bHREZWZpbml0aW9ucyhib29sZWFuIHR5cGUpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpbnQgaWR4ID0gdHlwZSA/IDEgOiAwOworICAgICAgICBpZiAoZGVmYXVsdERlZmluaXRpb25zW2lkeF0gPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlID0gdHlwZSA/IE1hZ2ljTmFtZXMuVFlQRURFRlNfUFJPUEVSVElFU19SRVNPVVJDRQorICAgICAgICAgICAgICAgICAgICA6IE1hZ2ljTmFtZXMuVEFTS0RFRl9QUk9QRVJUSUVTX1JFU09VUkNFOworICAgICAgICAgICAgU3RyaW5nIGVycm9yU3RyaW5nID0gdHlwZSA/IEVSUk9SX05PX1RZUEVfTElTVF9MT0FEIDogRVJST1JfTk9fVEFTS19MSVNUX0xPQUQ7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluID0gQ29tcG9uZW50SGVscGVyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlcnJvclN0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgcC5sb2FkKGluKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0RGVmaW5pdGlvbnNbaWR4XSA9IHA7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycm9yU3RyaW5nLCBlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdERlZmluaXRpb25zW2lkeF07CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBhbnQncyBkYXRhdHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUeXBlcygpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBnZXRDbGFzc0xvYWRlcihudWxsKTsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGdldERlZmF1bHREZWZpbml0aW9ucyh0cnVlKTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KG5hbWUpOworICAgICAgICAgICAgQW50VHlwZURlZmluaXRpb24gZGVmID0gbmV3IEFudFR5cGVEZWZpbml0aW9uKCk7CisgICAgICAgICAgICBkZWYuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIGRlZi5zZXRDbGFzc05hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGRlZi5zZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CisgICAgICAgICAgICBhbnRUeXBlVGFibGUucHV0KG5hbWUsIGRlZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZm9yIGVhY2ggY29tcG9uZW50IG5hbWUsIGNoZWNrIGlmIHRoZQorICAgICAqIGFzc29jaWF0ZWQgVVJJIGhhcyBiZWVuIGV4YW1pbmVkIGZvciBhbnRsaWJzLgorICAgICAqIEBwYXJhbSBjb21wb25lbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQsIHdoaWNoIHNob3VsZCBpbmNsdWRlIGEgVVJJCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcHJlZml4IGlmIGl0IGlzIGluIGEgbmFtZXNwYWNlCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjaGVja05hbWVzcGFjZShTdHJpbmcgY29tcG9uZW50TmFtZSkgeworICAgICAgICBTdHJpbmcgdXJpID0gUHJvamVjdEhlbHBlci5leHRyYWN0VXJpRnJvbUNvbXBvbmVudE5hbWUoY29tcG9uZW50TmFtZSk7CisgICAgICAgIGlmICgiIi5lcXVhbHModXJpKSkgeworICAgICAgICAgICAgdXJpID0gUHJvamVjdEhlbHBlci5BTlRfQ09SRV9VUkk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF1cmkuc3RhcnRzV2l0aChQcm9qZWN0SGVscGVyLkFOVExJQl9VUkkpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIG5hbWVzcGFjZSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW50bGliCisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoZWNrZWROYW1lc3BhY2VzLmNvbnRhaW5zKHVyaSkpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSBwcm9jZXNzZWQKKyAgICAgICAgfQorICAgICAgICBjaGVja2VkTmFtZXNwYWNlcy5hZGQodXJpKTsKKyAgICAgICAgVHlwZWRlZiBkZWZpbmVyID0gbmV3IFR5cGVkZWYoKTsKKyAgICAgICAgZGVmaW5lci5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBkZWZpbmVyLmluaXQoKTsKKyAgICAgICAgZGVmaW5lci5zZXRVUkkodXJpKTsKKyAgICAgICAgLy90aGVyZSB0byBzdG9wIGVycm9yIG1lc3NhZ2VzIGJlaW5nICJudWxsIgorICAgICAgICBkZWZpbmVyLnNldFRhc2tOYW1lKHVyaSk7CisgICAgICAgIC8vaWYgdGhpcyBpcyBsZWZ0IG91dCwgYmFkIHRoaW5ncyBoYXBwZW4uIGxpa2UgYWxsIGJ1aWxkIGZpbGVzIGJyZWFrCisgICAgICAgIC8vb24gdGhlIGZpcnN0IGVsZW1lbnQgZW5jb3VudGVyZWQuCisgICAgICAgIGRlZmluZXIuc2V0UmVzb3VyY2UoRGVmaW5lci5tYWtlUmVzb3VyY2VGcm9tVVJJKHVyaSkpOworICAgICAgICAvLyBhIGZpc2hpbmcgZXhwZWRpdGlvbiA6LSBpZ25vcmUgZXJyb3JzIGlmIGFudGxpYiBub3QgcHJlc2VudAorICAgICAgICBkZWZpbmVyLnNldE9uRXJyb3IobmV3IFR5cGVkZWYuT25FcnJvcihUeXBlZGVmLk9uRXJyb3IuUE9MSUNZX0lHTk9SRSkpOworICAgICAgICBkZWZpbmVyLmV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGNhbGxlZCB0byBkbyBkZWNlbnQgZGlhZ25vc2lzIG9uIGluc3RhbnRpYXRpb24gZmFpbHVyZS4KKyAgICAgKiBAcGFyYW0gY29tcG9uZW50TmFtZSBjb21wb25lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gdHlwZSBjb21wb25lbnQgdHlwZSwgdXNlZCBpbiBlcnJvciBtZXNzYWdlcworICAgICAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhcyBtdWNoIGRpYWdub3N0aWNzIGluZm8gYXMgcG9zc2libGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBkaWFnbm9zZUNyZWF0aW9uRmFpbHVyZShTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIGVycm9yVGV4dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKGVycm9yVGV4dCk7CisgICAgICAgIG91dC5wcmludGxuKCJQcm9ibGVtOiBmYWlsZWQgdG8gY3JlYXRlICIgKyB0eXBlICsgIiAiICsgY29tcG9uZW50TmFtZSk7CisgICAgICAgIC8vY2xhc3Mgb2YgcHJvYmxlbQorICAgICAgICBib29sZWFuIGxvd2xldmVsID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gamFycyA9IGZhbHNlOworICAgICAgICBib29sZWFuIGRlZmluaXRpb25zID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gYW50VGFzazsKKyAgICAgICAgU3RyaW5nIGhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoTGF1bmNoZXIuVVNFUl9IT01FRElSKTsKKyAgICAgICAgRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShob21lLCBMYXVuY2hlci5VU0VSX0xJQkRJUik7CisgICAgICAgIFN0cmluZyBhbnRIb21lTGliOworICAgICAgICBib29sZWFuIHByb2JhYmx5SURFID0gZmFsc2U7CisgICAgICAgIFN0cmluZyBhbnRob21lID0gU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0hPTUUpOworICAgICAgICBpZiAoYW50aG9tZSAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWxlIGFudEhvbWVMaWJEaXIgPSBuZXcgRmlsZShhbnRob21lLCAibGliIik7CisgICAgICAgICAgICBhbnRIb21lTGliID0gYW50SG9tZUxpYkRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vcnVubmluZyB1bmRlciBhbiBJREUgdGhhdCBkb2Vzbid0IHNldCBBTlRfSE9NRQorICAgICAgICAgICAgcHJvYmFibHlJREUgPSB0cnVlOworICAgICAgICAgICAgYW50SG9tZUxpYiA9ICJBTlRfSE9NRSIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAibGliIjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgZGlyTGlzdGluZ1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyB0YWIgPSAiICAgICAgICAtIjsKKyAgICAgICAgZGlyTGlzdGluZ1RleHQuYXBwZW5kKHRhYik7CisgICAgICAgIGRpckxpc3RpbmdUZXh0LmFwcGVuZChhbnRIb21lTGliKTsKKyAgICAgICAgZGlyTGlzdGluZ1RleHQuYXBwZW5kKCdcbicpOworICAgICAgICBpZiAocHJvYmFibHlJREUpIHsKKyAgICAgICAgICAgIGRpckxpc3RpbmdUZXh0LmFwcGVuZCh0YWIpOworICAgICAgICAgICAgZGlyTGlzdGluZ1RleHQuYXBwZW5kKCJ0aGUgSURFIEFudCBjb25maWd1cmF0aW9uIGRpYWxvZ3MiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpckxpc3RpbmdUZXh0LmFwcGVuZCh0YWIpOworICAgICAgICAgICAgZGlyTGlzdGluZ1RleHQuYXBwZW5kKGxpYkRpcik7CisgICAgICAgICAgICBkaXJMaXN0aW5nVGV4dC5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICBkaXJMaXN0aW5nVGV4dC5hcHBlbmQodGFiKTsKKyAgICAgICAgICAgIGRpckxpc3RpbmdUZXh0LmFwcGVuZCgiYSBkaXJlY3RvcnkgYWRkZWQgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoIHRoZSAtbGliIGFyZ3VtZW50Iik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRpckxpc3RpbmcgPSBkaXJMaXN0aW5nVGV4dC50b1N0cmluZygpOworCisgICAgICAgIC8vbG9vayB1cCB0aGUgbmFtZQorICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXREZWZpbml0aW9uKGNvbXBvbmVudE5hbWUpOworICAgICAgICBpZiAoZGVmID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vbm90IGEga25vd24gdHlwZQorICAgICAgICAgICAgcHJpbnRVbmtub3duRGVmaW5pdGlvbihvdXQsIGNvbXBvbmVudE5hbWUsIGRpckxpc3RpbmcpOworICAgICAgICAgICAgZGVmaW5pdGlvbnMgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy93ZSBhcmUgZGVmaW5lZCwgc28gaXQgaXMgYW4gaW5zdGFudGlhdGlvbiBwcm9ibGVtCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NuYW1lID0gZGVmLmdldENsYXNzTmFtZSgpOworICAgICAgICAgICAgYW50VGFzayA9IGNsYXNzbmFtZS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLnRvb2xzLmFudC4iKTsKKyAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwgPSBjbGFzc25hbWUuc3RhcnRzV2l0aCgib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwiKTsKKyAgICAgICAgICAgIG9wdGlvbmFsIHw9IGNsYXNzbmFtZS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbCIpOworCisgICAgICAgICAgICAvL3N0YXJ0IHdpdGggaW5zdGFudGlhdGluZyB0aGUgY2xhc3MuCisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gZGVmLmlubmVyR2V0VHlwZUNsYXNzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBqYXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRDbGFzc05vdEZvdW5kKG91dCwgY2xhc3NuYW1lLCBvcHRpb25hbCwgZGlyTGlzdGluZyk7CisgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBuY2RmZSkgeworICAgICAgICAgICAgICAgIGphcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIHByaW50Tm90TG9hZERlcGVuZGVudENsYXNzKG91dCwgb3B0aW9uYWwsIG5jZGZlLCBkaXJMaXN0aW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vaGVyZSB3ZSBzdWNjZXNzZnVsbHkgbG9hZGVkIHRoZSBjbGFzcyBvciBmYWlsZWQuCisgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vc3VjY2VzczogcHJvY2VlZCB3aXRoIG1vcmUgc3RlcHMKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkZWYuaW5uZXJDcmVhdGVBbmRTZXQoY2xhenosIHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICAvL2hleSwgdGhlcmUgaXMgbm90aGluZyB3cm9uZyB3aXRoIHVzCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJUaGUgY29tcG9uZW50IGNvdWxkIGJlIGluc3RhbnRpYXRlZC4iKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb3dsZXZlbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJDYXVzZTogVGhlIGNsYXNzICIgKyBjbGFzc25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaGFzIG5vIGNvbXBhdGlibGUgY29uc3RydWN0b3IuIik7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG93bGV2ZWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ2F1c2U6IFRoZSBjbGFzcyAiICsgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGFic3RyYWN0IGFuZCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb3dsZXZlbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJDYXVzZTogVGhlIGNvbnN0cnVjdG9yIGZvciAiICsgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIHByaXZhdGUgYW5kIGNhbm5vdCBiZSBpbnZva2VkLiIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbG93bGV2ZWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGV4LmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ2F1c2U6IFRoZSBjb25zdHJ1Y3RvciB0aHJldyB0aGUgZXhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKHQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKG91dCk7CisgICAgICAgICAgICAgICAgfSAgY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7CisgICAgICAgICAgICAgICAgICAgIGphcnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ2F1c2U6ICBBIGNsYXNzIG5lZWRlZCBieSBjbGFzcyAiICsgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBiZSBmb3VuZDogIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgIiArIG5jZGZlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJBY3Rpb246IERldGVybWluZSB3aGF0IGV4dHJhIEpBUiBmaWxlcyBhcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5lZWRlZCwgYW5kIHBsYWNlIHRoZW0gaW46Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGRpckxpc3RpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiRG8gbm90IHBhbmljLCB0aGlzIGlzIGEgY29tbW9uIHByb2JsZW0uIik7CisgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiSXQgbWF5IGp1c3QgYmUgYSB0eXBvZ3JhcGhpY2FsIGVycm9yIGluIHRoZSBidWlsZCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIm9yIHRoZSB0YXNrL3R5cGUgZGVjbGFyYXRpb24uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoamFycykgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJUaGUgY29tbW9uZXN0IGNhdXNlIGlzIGEgbWlzc2luZyBKQVIuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG93bGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiVGhpcyBpcyBxdWl0ZSBhIGxvdyBsZXZlbCBwcm9ibGVtLCB3aGljaCBtYXkgbmVlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJjb25zdWx0YXRpb24gd2l0aCB0aGUgYXV0aG9yIG9mIHRoZSB0YXNrLiIpOworICAgICAgICAgICAgICAgIGlmIChhbnRUYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJUaGlzIG1heSBiZSB0aGUgQW50IHRlYW0uIFBsZWFzZSBmaWxlIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRlZmVjdCBvciBjb250YWN0IHRoZSBkZXZlbG9wZXIgdGVhbS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiVGhpcyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB0YXNrIGJ1bmRsZWQgd2l0aCBBbnQuIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJQbGVhc2UgdGFrZSBpdCB1cCB3aXRoIHRoZSBzdXBwbGllciBvZiB0aGUgdGhpcmQtcGFydHkgIiArIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJJZiB5b3UgaGF2ZSB3cml0dGVuIGl0IHlvdXJzZWxmLCB5b3UgcHJvYmFibHkgaGF2ZSBhIGJ1ZyB0byBmaXguIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJUaGlzIGlzIG5vdCBhIGJ1ZzsgaXQgaXMgYSBjb25maWd1cmF0aW9uIHByb2JsZW0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIHJldHVybiBlcnJvclRleHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCB1bmtub3duIGRlZmluaXRpb24uZm9ya2luZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcmludFVua25vd25EZWZpbml0aW9uKFByaW50V3JpdGVyIG91dCwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBkaXJMaXN0aW5nKSB7CisgICAgICAgIGJvb2xlYW4gaXNBbnRsaWIgPSBjb21wb25lbnROYW1lLmluZGV4T2YoTWFnaWNOYW1lcy5BTlRMSUJfUFJFRklYKSA9PSAwOworICAgICAgICBTdHJpbmcgdXJpID0gUHJvamVjdEhlbHBlci5leHRyYWN0VXJpRnJvbUNvbXBvbmVudE5hbWUoY29tcG9uZW50TmFtZSk7CisgICAgICAgIG91dC5wcmludGxuKCJDYXVzZTogVGhlIG5hbWUgaXMgdW5kZWZpbmVkLiIpOworICAgICAgICBvdXQucHJpbnRsbigiQWN0aW9uOiBDaGVjayB0aGUgc3BlbGxpbmcuIik7CisgICAgICAgIG91dC5wcmludGxuKCJBY3Rpb246IENoZWNrIHRoYXQgYW55IGN1c3RvbSB0YXNrcy90eXBlcyBoYXZlIGJlZW4gZGVjbGFyZWQuIik7CisgICAgICAgIG91dC5wcmludGxuKCJBY3Rpb246IENoZWNrIHRoYXQgYW55IDxwcmVzZXRkZWY+LzxtYWNyb2RlZj4iCisgICAgICAgICAgICAgICAgKyAiIGRlY2xhcmF0aW9ucyBoYXZlIHRha2VuIHBsYWNlLiIpOworICAgICAgICBpZiAodXJpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgTGlzdCBtYXRjaGVzID0gYW50VHlwZVRhYmxlLmZpbmRNYXRjaGVzKHVyaSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiVGhlIGRlZmluaXRpb25zIGluIHRoZSBuYW1lc3BhY2UgIiArIHVyaSArICIgYXJlOiIpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgQW50VHlwZURlZmluaXRpb24gZGVmID0gKEFudFR5cGVEZWZpbml0aW9uKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IFByb2plY3RIZWxwZXIuZXh0cmFjdE5hbWVGcm9tQ29tcG9uZW50TmFtZShkZWYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgICAiICsgbG9jYWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIk5vIHR5cGVzIG9yIHRhc2tzIGhhdmUgYmVlbiBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIHlldCIpOworICAgICAgICAgICAgICAgIGlmIChpc0FudGxpYikgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiVGhpcyBhcHBlYXJzIHRvIGJlIGFuIGFudGxpYiBkZWNsYXJhdGlvbi4gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJBY3Rpb246IENoZWNrIHRoYXQgdGhlIGltcGxlbWVudGluZyBsaWJyYXJ5IGV4aXN0cyBpbiBvbmUgb2Y6Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGRpckxpc3RpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGNsYXNzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJpbnRDbGFzc05vdEZvdW5kKFByaW50V3JpdGVyIG91dCwgU3RyaW5nIGNsYXNzbmFtZSwgYm9vbGVhbiBvcHRpb25hbCwKKyAgICAgICAgICAgIFN0cmluZyBkaXJMaXN0aW5nKSB7CisgICAgICAgIG91dC5wcmludGxuKCJDYXVzZTogdGhlIGNsYXNzICIgKyBjbGFzc25hbWUgKyAiIHdhcyBub3QgZm91bmQuIik7CisgICAgICAgIGlmIChvcHRpb25hbCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgVGhpcyBsb29rcyBsaWtlIG9uZSBvZiBBbnQncyBvcHRpb25hbCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIkFjdGlvbjogQ2hlY2sgdGhhdCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9uYWwgSkFSIGV4aXN0cyBpbiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oZGlyTGlzdGluZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiQWN0aW9uOiBDaGVjayB0aGF0IHRoZSBjb21wb25lbnQgaGFzIGJlZW4gY29ycmVjdGx5IGRlY2xhcmVkIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgICAgICBhbmQgdGhhdCB0aGUgaW1wbGVtZW50aW5nIEpBUiBpcyBpbiBvbmUgb2Y6Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbihkaXJMaXN0aW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGNvdWxkIG5vdCBsb2FkIGRlcGVuZGVudCBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJpbnROb3RMb2FkRGVwZW5kZW50Q2xhc3MoUHJpbnRXcml0ZXIgb3V0LCBib29sZWFuIG9wdGlvbmFsLAorICAgICAgICAgICAgTm9DbGFzc0RlZkZvdW5kRXJyb3IgbmNkZmUsIFN0cmluZyBkaXJMaXN0aW5nKSB7CisgICAgICAgIG91dC5wcmludGxuKCJDYXVzZTogQ291bGQgbm90IGxvYWQgYSBkZXBlbmRlbnQgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICArICBuY2RmZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgSXQgaXMgbm90IGVub3VnaCB0byBoYXZlIEFudCdzIG9wdGlvbmFsIEpBUnMiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgeW91IG5lZWQgdGhlIEpBUiBmaWxlcyB0aGF0IHRoZSIgKyAiIG9wdGlvbmFsIHRhc2tzIGRlcGVuZCB1cG9uLiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICBBbnQncyBvcHRpb25hbCB0YXNrIGRlcGVuZGVuY2llcyBhcmUiICsgIiBsaXN0ZWQgaW4gdGhlIG1hbnVhbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgVGhpcyBjbGFzcyBtYXkgYmUgaW4gYSBzZXBhcmF0ZSBKQVIiICsgIiB0aGF0IGlzIG5vdCBpbnN0YWxsZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIkFjdGlvbjogRGV0ZXJtaW5lIHdoYXQgZXh0cmEgSkFSIGZpbGVzIGFyZSIKKyAgICAgICAgICAgICAgICArICIgbmVlZGVkLCBhbmQgcGxhY2UgdGhlbSBpbiBvbmUgb2Y6Iik7CisgICAgICAgIG91dC5wcmludGxuKGRpckxpc3RpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcCB0aGF0IGNvbnRhaW5zIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW50VHlwZVRhYmxlIGV4dGVuZHMgSGFzaHRhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMwNjA0NDIzMjA0Nzc3NzIwMjhMOworICAgICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgICAgICBBbnRUeXBlVGFibGUoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgICAgICB9CisKKyAgICAgICAgQW50VHlwZURlZmluaXRpb24gZ2V0RGVmaW5pdGlvbihTdHJpbmcga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gKEFudFR5cGVEZWZpbml0aW9uKSAoc3VwZXIuZ2V0KGtleSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVDbGFzcygoU3RyaW5nKSBrZXkpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IGNyZWF0ZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgQW50VHlwZURlZmluaXRpb24gZGVmID0gZ2V0RGVmaW5pdGlvbihuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAoZGVmID09IG51bGwpID8gbnVsbCA6IGRlZi5jcmVhdGUocHJvamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBDbGFzcyBnZXRUeXBlQ2xhc3MoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIEFudFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldERlZmluaXRpb24obmFtZSk7CisgICAgICAgICAgICByZXR1cm4gKGRlZiA9PSBudWxsKSA/IG51bGwgOiBkZWYuZ2V0VHlwZUNsYXNzKHByb2plY3QpOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3MgZ2V0RXhwb3NlZENsYXNzKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXREZWZpbml0aW9uKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGRlZiA9PSBudWxsID8gbnVsbCA6IGRlZi5nZXRFeHBvc2VkQ2xhc3MocHJvamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgY2xhenopIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChjbGF6eiBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkgJiYgIWZvdW5kOykgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICgoKEFudFR5cGVEZWZpbml0aW9uKSAoaS5uZXh0KCkpKS5nZXRFeHBvc2VkQ2xhc3MocHJvamVjdCkgPT0gY2xhenopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmb3VuZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIGRlZmluaXRpb25zIHRoYXQgbWF0Y2ggYSBwcmVmaXgsIHVzdWFsbHkgdGhlIFVSSQorICAgICAgICAgKiBvZiBhIGxpYnJhcnkKKyAgICAgICAgICogQHBhcmFtIHByZWZpeCBwcmVmaXggdG8gbWF0Y2ggb2ZmCisgICAgICAgICAqIEByZXR1cm4gdGhlIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiBkZWZpbml0aW9ucworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3QvKjxBbnRUeXBlRGVmaW5pdGlvbj4qLyBmaW5kTWF0Y2hlcyhTdHJpbmcgcHJlZml4KSB7CisgICAgICAgICAgICBBcnJheUxpc3QgbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEFudFR5cGVEZWZpbml0aW9uIGRlZiA9IChBbnRUeXBlRGVmaW5pdGlvbikgKGkubmV4dCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVmLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQoZGVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlZmF1bHRMb2dnZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlZmF1bHRMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTY4N2M3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGVmYXVsdExvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMzczIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRGF0ZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogV3JpdGVzIGJ1aWxkIGV2ZW50cyB0byBhIFByaW50U3RyZWFtLiBDdXJyZW50bHksIGl0CisgKiBvbmx5IHdyaXRlcyB3aGljaCB0YXJnZXRzIGFyZSBiZWluZyBleGVjdXRlZCwgYW5kCisgKiBhbnkgbWVzc2FnZXMgdGhhdCBnZXQgbG9nZ2VkLgorICoKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRMb2dnZXIgaW1wbGVtZW50cyBCdWlsZExvZ2dlciB7CisgICAgLyoqCisgICAgICogU2l6ZSBvZiBsZWZ0LWhhbmQgY29sdW1uIGZvciByaWdodC1qdXN0aWZpZWQgdGFzayBuYW1lLgorICAgICAqIEBzZWUgI21lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX0NPTFVNTl9TSVpFID0gMTI7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8qKiBQcmludFN0cmVhbSB0byB3cml0ZSBub24tZXJyb3IgbWVzc2FnZXMgdG8gKi8KKyAgICBwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gb3V0OworCisgICAgLyoqIFByaW50U3RyZWFtIHRvIHdyaXRlIGVycm9yIG1lc3NhZ2VzIHRvICovCisgICAgcHJvdGVjdGVkIFByaW50U3RyZWFtIGVycjsKKworICAgIC8qKiBMb3dlc3QgbGV2ZWwgb2YgbWVzc2FnZSB0byB3cml0ZSBvdXQgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1zZ091dHB1dExldmVsID0gUHJvamVjdC5NU0dfRVJSOworCisgICAgLyoqIFRpbWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBidWlsZCAqLworICAgIHByaXZhdGUgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgIC8vIENoZWNrU3R5bGU6Q29uc3RhbnROYW1lQ2hlY2sgT0ZGIC0gYmMKKyAgICAvKiogTGluZSBzZXBhcmF0b3IgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBsU2VwID0gU3RyaW5nVXRpbHMuTElORV9TRVA7CisgICAgLy8gQ2hlY2tTdHlsZTpDb25zdGFudE5hbWVDaGVjayBPTgorCisgICAgLyoqIFdoZXRoZXIgb3Igbm90IHRvIHVzZSBlbWFjcy1zdHlsZSBvdXRwdXQgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbWFjc01vZGUgPSBmYWxzZTsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBEZWZhdWx0TG9nZ2VyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgbWVzc2FnZSB0aGlzIGxvZ2dlciBzaG91bGQgcmVzcG9uZCB0by4KKyAgICAgKgorICAgICAqIE9ubHkgbWVzc2FnZXMgd2l0aCBhIG1lc3NhZ2UgbGV2ZWwgbG93ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUKKyAgICAgKiBnaXZlbiBsZXZlbCBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgbG9nLgorICAgICAqIDxwPgorICAgICAqIENvbnN0YW50cyBmb3IgdGhlIG1lc3NhZ2UgbGV2ZWxzIGFyZSBpbiB0aGUKKyAgICAgKiB7QGxpbmsgUHJvamVjdCBQcm9qZWN0fSBjbGFzcy4gVGhlIG9yZGVyIG9mIHRoZSBsZXZlbHMsIGZyb20gbGVhc3QKKyAgICAgKiB0byBtb3N0IHZlcmJvc2UsIGlzIDxjb2RlPk1TR19FUlI8L2NvZGU+LCA8Y29kZT5NU0dfV0FSTjwvY29kZT4sCisgICAgICogPGNvZGU+TVNHX0lORk88L2NvZGU+LCA8Y29kZT5NU0dfVkVSQk9TRTwvY29kZT4sCisgICAgICogPGNvZGU+TVNHX0RFQlVHPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBtZXNzYWdlIGxldmVsIGZvciBEZWZhdWx0TG9nZ2VyIGlzIFByb2plY3QuTVNHX0VSUi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZXZlbCB0aGUgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIGxvZ2dlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50IGxldmVsKSB7CisgICAgICAgIHRoaXMubXNnT3V0cHV0TGV2ZWwgPSBsZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoaXMgbG9nZ2VyIGlzIHRvIHNlbmQgaXRzIG91dHB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgVGhlIG91dHB1dCBzdHJlYW0gZm9yIHRoZSBsb2dnZXIuCisgICAgICogICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcmludFN0cmVhbShQcmludFN0cmVhbSBvdXRwdXQpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBuZXcgUHJpbnRTdHJlYW0ob3V0cHV0LCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoaXMgbG9nZ2VyIGlzIHRvIHNlbmQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyIFRoZSBlcnJvciBzdHJlYW0gZm9yIHRoZSBsb2dnZXIuCisgICAgICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvclByaW50U3RyZWFtKFByaW50U3RyZWFtIGVycikgeworICAgICAgICB0aGlzLmVyciA9IG5ldyBQcmludFN0cmVhbShlcnIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyBsb2dnZXIgdG8gcHJvZHVjZSBlbWFjcyAoYW5kIG90aGVyIGVkaXRvcikgZnJpZW5kbHkgb3V0cHV0LgorICAgICAqCisgICAgICogQHBhcmFtIGVtYWNzTW9kZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBvdXRwdXQgaXMgdG8gYmUgdW5hZG9ybmVkIHNvIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgIGVtYWNzIGFuZCBvdGhlciBlZGl0b3JzIGNhbiBwYXJzZSBmaWxlcyBuYW1lcywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVtYWNzTW9kZShib29sZWFuIGVtYWNzTW9kZSkgeworICAgICAgICB0aGlzLmVtYWNzTW9kZSA9IGVtYWNzTW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNwb25kcyB0byBhIGJ1aWxkIGJlaW5nIHN0YXJ0ZWQgYnkganVzdCByZW1lbWJlcmluZyB0aGUgY3VycmVudCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IElnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHdoZXRoZXIgdGhlIGJ1aWxkIHN1Y2NlZWRlZCBvciBmYWlsZWQsCisgICAgICogYW55IGVycm9ycyB0aGUgb2NjdXJyZWQgZHVyaW5nIHRoZSBidWlsZCwgYW5kCisgICAgICogaG93IGxvbmcgdGhlIGJ1aWxkIHRvb2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBUaHJvd2FibGUgZXJyb3IgPSBldmVudC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChnZXRCdWlsZFN1Y2Nlc3NmdWxNZXNzYWdlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZ2V0QnVpbGRGYWlsZWRNZXNzYWdlKCkpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworCisgICAgICAgICAgICB3aGlsZSAoZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeyAvLyAjNDMzOTgKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSAoKEJ1aWxkRXhjZXB0aW9uKSBlcnJvcikuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCAmJiBjYXVzZS50b1N0cmluZygpLmVxdWFscyhlcnJvci5nZXRNZXNzYWdlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gY2F1c2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoUHJvamVjdC5NU0dfVkVSQk9TRSA8PSBtc2dPdXRwdXRMZXZlbAorICAgICAgICAgICAgICAgIHx8ICEoZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChTdHJpbmdVdGlscy5nZXRTdGFja1RyYWNlKGVycm9yKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGVycm9yLnRvU3RyaW5nKCkpLmFwcGVuZChsU2VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZXNzYWdlLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJUb3RhbCB0aW1lOiAiKTsKKyAgICAgICAgbWVzc2FnZS5hcHBlbmQoZm9ybWF0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkpOworCisgICAgICAgIFN0cmluZyBtc2cgPSBtZXNzYWdlLnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CisgICAgICAgICAgICBwcmludE1lc3NhZ2UobXNnLCBvdXQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRNZXNzYWdlKG1zZywgZXJyLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICB9CisgICAgICAgIGxvZyhtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYW4gb3ZlcnJpZGUgcG9pbnQ6IHRoZSBtZXNzYWdlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgYSBidWlsZCBmYWlsZWQuCisgICAgICogU3ViY2xhc3NlcyBjYW4gY2hhbmdlL2VuaGFuY2UgdGhlIG1lc3NhZ2UuCisgICAgICogQHJldHVybiBUaGUgY2xhc3NpYyAiQlVJTEQgRkFJTEVEIgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVpbGRGYWlsZWRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gIkJVSUxEIEZBSUxFRCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludDogdGhlIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIGJ1aWxkIHN1Y2NlZWRlZC4KKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBjaGFuZ2UvZW5oYW5jZSB0aGUgbWVzc2FnZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBjbGFzc2ljICJCVUlMRCBTVUNDRVNTRlVMIgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVpbGRTdWNjZXNzZnVsTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuICJCVUlMRCBTVUNDRVNTRlVMIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2dzIGEgbWVzc2FnZSB0byBzYXkgdGhhdCB0aGUgdGFyZ2V0IGhhcyBzdGFydGVkIGlmIHRoaXMKKyAgICAgKiBsb2dnZXIgYWxsb3dzIGluZm9ybWF0aW9uLWxldmVsIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICovCisgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChQcm9qZWN0Lk1TR19JTkZPIDw9IG1zZ091dHB1dExldmVsCisgICAgICAgICAgICAmJiAhZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmdVdGlscy5MSU5FX1NFUAorICAgICAgICAgICAgICAgICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpICsgIjoiOworICAgICAgICAgICAgcHJpbnRNZXNzYWdlKG1zZywgb3V0LCBldmVudC5nZXRQcmlvcml0eSgpKTsKKyAgICAgICAgICAgIGxvZyhtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8tb3AgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgSWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8tb3AgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgSWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8tb3AgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgSWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZ3MgYSBtZXNzYWdlLCBpZiB0aGUgcHJpb3JpdHkgaXMgc3VpdGFibGUuCisgICAgICogSW4gbm9uLWVtYWNzIG1vZGUsIHRhc2sgbGV2ZWwgbWVzc2FnZXMgYXJlIHByZWZpeGVkIGJ5IHRoZQorICAgICAqIHRhc2sgbmFtZSB3aGljaCBpcyByaWdodC1qdXN0aWZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgQSBCdWlsZEV2ZW50IGNvbnRhaW5pbmcgbWVzc2FnZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGludCBwcmlvcml0eSA9IGV2ZW50LmdldFByaW9yaXR5KCk7CisgICAgICAgIC8vIEZpbHRlciBvdXQgbWVzc2FnZXMgYmFzZWQgb24gcHJpb3JpdHkKKyAgICAgICAgaWYgKHByaW9yaXR5IDw9IG1zZ091dHB1dExldmVsKSB7CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRhc2soKSAhPSBudWxsICYmICFlbWFjc01vZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIG5hbWUgb2YgdGhlIHRhc2sgaWYgd2UncmUgaW4gb25lCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBldmVudC5nZXRUYXNrKCkuZ2V0VGFza05hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAiWyIgKyBuYW1lICsgIl0gIjsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IExFRlRfQ09MVU1OX1NJWkUgLSBsYWJlbC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgdG1wID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZChsYWJlbCk7CisgICAgICAgICAgICAgICAgbGFiZWwgPSB0bXAudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHIgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcihldmVudC5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQobGFiZWwpLmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSByLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxpbmUgIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGRuJ3QgYmUgcG9zc2libGUKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQobGFiZWwpLmFwcGVuZChldmVudC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL2VtYWNzIG1vZGUgb3IgdGhlcmUgaXMgbm8gdGFzaworICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGV2ZW50LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUaHJvd2FibGUgZXggPSBldmVudC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChQcm9qZWN0Lk1TR19ERUJVRyA8PSBtc2dPdXRwdXRMZXZlbCAmJiBleCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZ1V0aWxzLmdldFN0YWNrVHJhY2UoZXgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG1zZyA9IG1lc3NhZ2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChwcmlvcml0eSAhPSBQcm9qZWN0Lk1TR19FUlIpIHsKKyAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UobXNnLCBvdXQsIHByaW9yaXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKG1zZywgZXJyLCBwcmlvcml0eSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBmb3JtYXQgYSBzcGVjaWZpZWQgbGVuZ3RoIG9mIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWlsbGlzIExlbmd0aCBvZiB0aW1lIHRvIGZvcm1hdCwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGltZSBhcyBhIGZvcm1hdHRlZCBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlIERhdGVVdGlscyNmb3JtYXRFbGFwc2VkVGltZShsb25nKQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGZvcm1hdFRpbWUoZmluYWwgbG9uZyBtaWxsaXMpIHsKKyAgICAgICAgcmV0dXJuIERhdGVVdGlscy5mb3JtYXRFbGFwc2VkVGltZShtaWxsaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyBhIG1lc3NhZ2UgdG8gYSBQcmludFN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlICBUaGUgbWVzc2FnZSB0byBwcmludC4KKyAgICAgKiAgICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RyZWFtICAgQSBQcmludFN0cmVhbSB0byBwcmludCB0aGUgbWVzc2FnZSB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHByaW9yaXR5IFRoZSBwcmlvcml0eSBvZiB0aGUgbWVzc2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgKElnbm9yZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4pCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcmludFN0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwcmlvcml0eSkgeworICAgICAgICBzdHJlYW0ucHJpbnRsbihtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiB3aGljaCBhbGxvd3Mgc3ViY2xhc3NlcyB0byByZWNlaXZlIHRoZQorICAgICAqIHNhbWUgb3V0cHV0IHRoYXQgaXMgZ2VuZXJhdGVkIGhlcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIGJlaW5nIGxvZ2dlZC4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgdGltZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgYXMgYSBmb3JtYXR0ZWQgc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbnQxLjcuMQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIERhdGVGb3JtYXQgZm9ybWF0dGVyID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKERhdGVGb3JtYXQuU0hPUlQsIERhdGVGb3JtYXQuU0hPUlQpOworICAgICAgICBTdHJpbmcgZmluaXNoVGltZSA9IGZvcm1hdHRlci5mb3JtYXQoZGF0ZSk7CisgICAgICAgIHJldHVybiBmaW5pc2hUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJvamVjdCBuYW1lIG9yIG51bGwKKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50CisgICAgICogQHJldHVybiB0aGUgcHJvamVjdCB0aGF0IHJhaXNlZCB0aGlzIGV2ZW50CisgICAgICogQHNpbmNlIEFudDEuNy4xCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0UHJvamVjdE5hbWUoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBldmVudC5nZXRQcm9qZWN0KCk7CisgICAgICAgIHJldHVybiAocHJvamVjdCAhPSBudWxsKSA/IHByb2plY3QuZ2V0TmFtZSgpIDogbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZW11eElucHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZW11eElucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzZmY4NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlbXV4SW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICoKKyAqIFBhc3NlcyBpbnB1dCByZXF1ZXN0cyB0byB0aGUgcHJvamVjdCBvYmplY3QgZm9yIGRlbXV4aW5nIGludG8KKyAqIGluZGl2aWR1YWwgdGFza3MgYW5kIHRocmVhZHMuCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIERlbXV4SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvamVjdCB0byBmcm9tIHdoaWNoIHRvIGdldCBpbnB1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIERlbXV4SW5wdXRTdHJlYW0gZm9yIHRoZSBnaXZlbiBwcm9qZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBEZW11eElucHV0U3RyZWFtKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBieXRlIGZyb20gdGhlIHByb2plY3QncyBkZW11eGVkIGlucHV0LgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgYnl0ZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMV07CisgICAgICAgIGlmIChwcm9qZWN0LmRlbXV4SW5wdXQoYnVmZmVyLCAwLCAxKSA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXJbMF07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIHByb2plY3QncyBkZW11eGVkIGlucHV0LgorICAgICAqIEBwYXJhbSBidWZmZXIgYW4gYXJyYXkgb2YgYnl0ZXMgdG8gcmVhZCBpbnRvCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheSBvZiBieXRlcworICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYXJyYXkKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3QuZGVtdXhJbnB1dChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlbXV4T3V0cHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZW11eE91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDdmOTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZW11eE91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworLyoqCisgKiBMb2dzIGNvbnRlbnQgd3JpdHRlbiBieSBhIHRocmVhZCBhbmQgZm9yd2FyZHMgdGhlIGJ1ZmZlcnMgb250byB0aGUKKyAqIHByb2plY3Qgb2JqZWN0IHdoaWNoIHdpbGwgZm9yd2FyZCB0aGUgY29udGVudCB0byB0aGUgYXBwcm9wcmlhdGUKKyAqIHRhc2suCisgKgorICogQHNpbmNlIDEuNAorICovCitwdWJsaWMgY2xhc3MgRGVtdXhPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisgICAgLyoqCisgICAgICogQSBkYXRhIGNsYXNzIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGEgYnVmZmVyLiBTdWNoIGluZm9ybWF0aW9uCisgICAgICogaXMgc3RvcmVkIG9uIGEgcGVyLXRocmVhZCBiYXNpcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCdWZmZXJJbmZvIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwZXItdGhyZWFkIG91dHB1dCBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB3ZSBoYXZlIGp1c3Qgc2VlbiBhIGNhcnJpYWdlIHJldHVybi4gSXQgbWF5IGJlIHBhcnQgb2YKKyAgICAgICAgICogYSBjcmxmIHBhaXIgb3IgYSBzaW5nbGUgY3IgaW52b2tpbmcgcHJvY2Vzc0J1ZmZlciB0d2ljZS4KKyAgICAgICAgICovCisgICAgICAgICBwcml2YXRlIGJvb2xlYW4gY3JTZWVuID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqIE1heGltdW0gYnVmZmVyIHNpemUuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TSVpFID0gMTAyNDsKKworICAgIC8qKiBJbml0aWFsIGJ1ZmZlciBzaXplLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlRJQUxfU0laRSA9IDEzMjsKKworICAgIC8qKiBDYXJyaWFnZSByZXR1cm4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1IgPSAweDBkOworCisgICAgLyoqIExpbmVmZWVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExGID0gMHgwYTsKKworICAgIC8qKiBNYXBwaW5nIGZyb20gdGhyZWFkIHRvIGJ1ZmZlciAoVGhyZWFkIHRvIEJ1ZmZlckluZm8pLiAqLworICAgIHByaXZhdGUgV2Vha0hhc2hNYXAgYnVmZmVycyA9IG5ldyBXZWFrSGFzaE1hcCgpOworCisgICAgLyoqCisgICAgICogVGhlIHByb2plY3QgdG8gc2VuZCBvdXRwdXQgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIHN0cmVhbSByZXByZXNlbnRzIGFuIGVycm9yIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFcnJvclN0cmVhbTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IGluc3RhbmNlIGZvciB3aGljaCBvdXRwdXQgaXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICBkZW11bHRpcGxleGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gaXNFcnJvclN0cmVhbSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIHRoZSBlcnJvciBzdHJpbmcsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGEgbm9ybWFsIG91dHB1dCBzdHJlYW0uIFRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIHByb2plY3Qgc28gaXQga25vd3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aGljaCBzdHJlYW0gaXQgaXMgcmVjZWl2aW5nLgorICAgICAqLworICAgIHB1YmxpYyBEZW11eE91dHB1dFN0cmVhbShQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaXNFcnJvclN0cmVhbSkgeworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgICAgICB0aGlzLmlzRXJyb3JTdHJlYW0gPSBpc0Vycm9yU3RyZWFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBhIEJ1ZmZlckluZm8gZm9yIHRoZSBjdXJyZW50IHRocmVhZCB0byB3cml0ZSBkYXRhIHRvCisgICAgICovCisgICAgcHJpdmF0ZSBCdWZmZXJJbmZvIGdldEJ1ZmZlckluZm8oKSB7CisgICAgICAgIFRocmVhZCBjdXJyZW50ID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgQnVmZmVySW5mbyBidWZmZXJJbmZvID0gKEJ1ZmZlckluZm8pIGJ1ZmZlcnMuZ2V0KGN1cnJlbnQpOworICAgICAgICBpZiAoYnVmZmVySW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBidWZmZXJJbmZvID0gbmV3IEJ1ZmZlckluZm8oKTsKKyAgICAgICAgICAgIGJ1ZmZlckluZm8uYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShJTlRJQUxfU0laRSk7CisgICAgICAgICAgICBidWZmZXJJbmZvLmNyU2VlbiA9IGZhbHNlOworICAgICAgICAgICAgYnVmZmVycy5wdXQoY3VycmVudCwgYnVmZmVySW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlckluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBidWZmZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzZXRCdWZmZXJJbmZvKCkgeworICAgICAgICBUaHJlYWQgY3VycmVudCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIEJ1ZmZlckluZm8gYnVmZmVySW5mbyA9IChCdWZmZXJJbmZvKSBidWZmZXJzLmdldChjdXJyZW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1ZmZlckluZm8uYnVmZmVyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNob3VsZG4ndCBoYXBwZW4KKyAgICAgICAgfQorICAgICAgICBidWZmZXJJbmZvLmJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgYnVmZmVySW5mby5jclNlZW4gPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBidWZmZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQnVmZmVyKCkgeworICAgICAgICBUaHJlYWQgY3VycmVudCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIGJ1ZmZlcnMucmVtb3ZlIChjdXJyZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciBhbmQgZmx1c2hlcyB0aGUgYnVmZmVyIGlmIGEgbGluZQorICAgICAqIHNlcGFyYXRvciBpcyBkZXRlY3RlZCBvciBpZiB0aGUgYnVmZmVyIGhhcyByZWFjaGVkIGl0cyBtYXhpbXVtIHNpemUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2MgZGF0YSB0byBsb2cgKGJ5dGUpLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGRhdGEgY2Fubm90IGJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYnl0ZSBjID0gKGJ5dGUpIGNjOworCisgICAgICAgIEJ1ZmZlckluZm8gYnVmZmVySW5mbyA9IGdldEJ1ZmZlckluZm8oKTsKKworICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAvLyBMRiBpcyBhbHdheXMgZW5kIG9mIGxpbmUgKGkuZS4gQ1JMRiBvciBzaW5nbGUgTEYpCisgICAgICAgICAgICBidWZmZXJJbmZvLmJ1ZmZlci53cml0ZShjYyk7CisgICAgICAgICAgICBwcm9jZXNzQnVmZmVyKGJ1ZmZlckluZm8uYnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJJbmZvLmNyU2VlbikgeworICAgICAgICAgICAgICAgIC8vIENSIHdpdGhvdXQgTEYgLSBzZW5kIGJ1ZmZlciB0aGVuIGFkZCBjaGFyCisgICAgICAgICAgICAgICAgcHJvY2Vzc0J1ZmZlcihidWZmZXJJbmZvLmJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhZGQgaW50byBidWZmZXIKKyAgICAgICAgICAgIGJ1ZmZlckluZm8uYnVmZmVyLndyaXRlKGNjKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJJbmZvLmNyU2VlbiA9IChjID09ICdccicpOworICAgICAgICBpZiAoIWJ1ZmZlckluZm8uY3JTZWVuICYmIGJ1ZmZlckluZm8uYnVmZmVyLnNpemUoKSA+IE1BWF9TSVpFKSB7CisgICAgICAgICAgICBwcm9jZXNzQnVmZmVyKGJ1ZmZlckluZm8uYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBidWZmZXIgdG8gYSBzdHJpbmcgYW5kIHNlbmRzIGl0IHRvIHRoZSBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlciB0aGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHVzZWQgdG8gY29sbGVjdCB0aGUgb3V0cHV0CisgICAgICogdW50aWwgYSBsaW5lIHNlcGFyYXRvciBpcyBzZWVuLgorICAgICAqCisgICAgICogQHNlZSBQcm9qZWN0I2RlbXV4T3V0cHV0KFN0cmluZyxib29sZWFuKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCdWZmZXIoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlcikgeworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIHByb2plY3QuZGVtdXhPdXRwdXQob3V0cHV0LCBpc0Vycm9yU3RyZWFtKTsKKyAgICAgICAgcmVzZXRCdWZmZXJJbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGJ1ZmZlciB0byBhIHN0cmluZyBhbmQgc2VuZHMgaXQgdG8gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyIHRoZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gdXNlZCB0byBjb2xsZWN0IHRoZSBvdXRwdXQKKyAgICAgKiB1bnRpbCBhIGxpbmUgc2VwYXJhdG9yIGlzIHNlZW4uCisgICAgICoKKyAgICAgKiBAc2VlIFByb2plY3QjZGVtdXhPdXRwdXQoU3RyaW5nLGJvb2xlYW4pCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZsdXNoKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIpIHsKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IGJ1ZmZlci50b1N0cmluZygpOworICAgICAgICBwcm9qZWN0LmRlbXV4Rmx1c2gob3V0cHV0LCBpc0Vycm9yU3RyZWFtKTsKKyAgICAgICAgcmVzZXRCdWZmZXJJbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBmbHVzaGluZyB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gY2xvc2luZyB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQHNlZSAjZmx1c2gKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIHJlbW92ZUJ1ZmZlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbGwgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGUgY3VycmVudCB0aHJlYWQgdG8gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBmbHVzaGluZyB0aGUgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVySW5mbyBidWZmZXJJbmZvID0gZ2V0QnVmZmVySW5mbygpOworICAgICAgICBpZiAoYnVmZmVySW5mby5idWZmZXIuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcHJvY2Vzc0ZsdXNoKGJ1ZmZlckluZm8uYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgYmxvY2sgb2YgY2hhcmFjdGVycyB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtIGIgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkgd2hlcmUgZGF0YSBzdGFydHMKKyAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgYmxvY2sKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGRhdGEgY2Fubm90IGJlIHdyaXR0ZW4gaW50byB0aGUgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBmaW5kIHRoZSBsaW5lIGJyZWFrcyBhbmQgcGFzcyBvdGhlciBjaGFycyB0aHJvdWdoIGluIGJsb2NrcworICAgICAgICBpbnQgb2Zmc2V0ID0gb2ZmOworICAgICAgICBpbnQgYmxvY2tTdGFydE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgaW50IHJlbWFpbmluZyA9IGxlbjsKKyAgICAgICAgQnVmZmVySW5mbyBidWZmZXJJbmZvID0gZ2V0QnVmZmVySW5mbygpOworICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDAgJiYgYltvZmZzZXRdICE9IExGICYmIGJbb2Zmc2V0XSAhPSBDUikgeworICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgICAgIHJlbWFpbmluZy0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZWl0aGVyIGVuZCBvZiBidWZmZXIgb3IgYSBsaW5lIHNlcGFyYXRvciBjaGFyCisgICAgICAgICAgICBpbnQgYmxvY2tMZW5ndGggPSBvZmZzZXQgLSBibG9ja1N0YXJ0T2Zmc2V0OworICAgICAgICAgICAgaWYgKGJsb2NrTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlckluZm8uYnVmZmVyLndyaXRlKGIsIGJsb2NrU3RhcnRPZmZzZXQsIGJsb2NrTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwICYmIChiW29mZnNldF0gPT0gTEYgfHwgYltvZmZzZXRdID09IENSKSkgeworICAgICAgICAgICAgICAgIHdyaXRlKGJbb2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9ja1N0YXJ0T2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGlhZ25vc3RpY3MuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RpYWdub3N0aWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwOTczMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RpYWdub3N0aWNzLmphdmEKQEAgLTAsMCArMSw2MzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkxvYWRlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSkFYUFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUHJveHlTZXR1cDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCisvKioKKyAqIEEgbGl0dGxlIGRpYWdub3N0aWMgaGVscGVyIHRoYXQgb3V0cHV0IHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtYXkgaGVscAorICogaW4gc3VwcG9ydC4gSXQgc2hvdWxkIHF1aWNrbHkgZ2l2ZSBjb3JyZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogamFyIGV4aXN0aW5nIGluIGFudC5ob21lL2xpYiBhbmQgdGhlIGphciB2ZXJzaW9ucy4uLgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEaWFnbm9zdGljcyB7CisKKyAgICAvKiogdGhlIHZlcnNpb24gbnVtYmVyIGZvciBqYXZhIDEuNSByZXR1cm5lZCBmcm9tIEphdmFFbnZVdGlscyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBXzFfNV9OVU1CRVIgPSAxNTsKKworICAgIC8qKgorICAgICAqIHZhbHVlIGZvciB3aGljaCBhIGRpZmZlcmVuY2UgYmV0d2VlbiBjbG9jayBhbmQgdGVtcCBmaWxlIHRpbWUgdHJpZ2dlcnMKKyAgICAgKiBhIHdhcm5pbmcuCisgICAgICoge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklHX0RSSUZUX0xJTUlUID0gMTAwMDA7CisKKyAgICAvKioKKyAgICAgKiBIb3cgYmlnIGEgdGVzdCBmaWxlIHRvIHdyaXRlLgorICAgICAqIHtAdmFsdWV9CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfRklMRV9TSVpFID0gMzI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtJTE9CWVRFID0gMTAyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VDT05EU19QRVJfTUlMTElTRUNPTkQgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUNPTkRTX1BFUl9NSU5VVEUgPSA2MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVRFU19QRVJfSE9VUiA9IDYwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTID0gIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlRlc3QiOworCisgICAgLyoqCisgICAgICogVGhlIGVycm9yIHRleHQgd2hlbiBhIHNlY3VyaXR5IG1hbmFnZXIgYmxvY2tzIGFjY2VzcyB0byBhIHByb3BlcnR5LgorICAgICAqIHtAdmFsdWV9CisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfUFJPUEVSVFlfQUNDRVNTX0JMT0NLRUQKKyAgICAgICAgICAgID0gIkFjY2VzcyB0byB0aGlzIHByb3BlcnR5IGJsb2NrZWQgYnkgYSBzZWN1cml0eSBtYW5hZ2VyIjsKKworICAgIC8qKiB1dGlsaXR5IGNsYXNzICovCisgICAgcHJpdmF0ZSBEaWFnbm9zdGljcygpIHsKKyAgICAgICAgLy8gaGlkZGVuIGNvbnN0cnVjdG9yCisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgb3B0aW9uYWwgdGFza3MgYXJlIGF2YWlsYWJsZS4gTm90IHRoYXQgaXQgZG9lcyBub3QgY2hlY2sKKyAgICAgKiBmb3IgaW1wbGVtZW50YXRpb24gdmVyc2lvbi4gVXNlIDx0dD52YWxpZGF0ZVZlcnNpb24oKTwvdHQ+IGZvciB0aGlzLgorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiBvcHRpb25hbCB0YXNrcyBhcmUgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc09wdGlvbmFsQXZhaWxhYmxlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShURVNUX0NMQVNTKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgY29yZSBhbmQgb3B0aW9uYWwgaW1wbGVtZW50YXRpb24gdmVyc2lvbiBkbyBtYXRjaC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uIG9mIG9wdGlvbmFsIHRhc2tzCisgICAgICogZG9lcyBub3QgbWF0Y2ggdGhlIGNvcmUgaW1wbGVtZW50YXRpb24gdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWZXJzaW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIG9wdGlvbmFsID0gQ2xhc3MuZm9yTmFtZShURVNUX0NMQVNTKTsKKyAgICAgICAgICAgIFN0cmluZyBjb3JlVmVyc2lvbiA9IGdldEltcGxlbWVudGF0aW9uVmVyc2lvbihNYWluLmNsYXNzKTsKKyAgICAgICAgICAgIFN0cmluZyBvcHRpb25hbFZlcnNpb24gPSBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24ob3B0aW9uYWwpOworCisgICAgICAgICAgICBpZiAoY29yZVZlcnNpb24gIT0gbnVsbCAmJiAhY29yZVZlcnNpb24uZXF1YWxzKG9wdGlvbmFsVmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgaW1wbGVtZW50YXRpb24gdmVyc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJiZXR3ZWVuIEFudCBjb3JlIGFuZCBBbnQgb3B0aW9uYWwgdGFza3MuXG4iICsgIiBjb3JlICAgIDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjb3JlVmVyc2lvbiArICJcbiIgKyAiIG9wdGlvbmFsOiAiICsgb3B0aW9uYWxWZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIGlnbm9yZVRocm93YWJsZShlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiB0aGUgbGlzdCBvZiBqYXIgZmlsZXMgZXhpc3RpbmcgaW4gQU5UX0hPTUUvbGliCisgICAgICogYW5kIHRoYXQgbXVzdCBoYXZlIGJlZW4gcGlja2VkIHVwIGJ5IEFudCBzY3JpcHQuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBqYXIgZmlsZXMgZXhpc3RpbmcgaW4gYW50LmhvbWUvbGliIG9yCisgICAgICogPHR0Pm51bGw8L3R0PiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlW10gbGlzdExpYnJhcmllcygpIHsKKyAgICAgICAgU3RyaW5nIGhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfSE9NRSk7CisgICAgICAgIGlmIChob21lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIEZpbGUgbGliRGlyID0gbmV3IEZpbGUoaG9tZSwgImxpYiIpOworICAgICAgICByZXR1cm4gbGlzdEphckZpbGVzKGxpYkRpcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYSBsaXN0IG9mIGFsbCBKQVIgZmlsZXMgaW4gYSBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gbGliRGlyIGRpcmVjdG9yeQorICAgICAqIEByZXR1cm4gYXJyYXkgb2YgZmlsZXMgKG9yIG51bGwgZm9yIG5vIHN1Y2ggZGlyZWN0b3J5KQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEZpbGVbXSBsaXN0SmFyRmlsZXMoRmlsZSBsaWJEaXIpIHsKKyAgICAgICAgRmlsZW5hbWVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKCIuamFyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIEZpbGVbXSBmaWxlcyAgPSBsaWJEaXIubGlzdEZpbGVzKGZpbHRlcik7CisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtYWluIGVudHJ5IHBvaW50IGZvciBjb21tYW5kIGxpbmUKKyAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgZG9SZXBvcnQoU3lzdGVtLm91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGltcGxlbWVudGF0aW9uIHZlcnNpb24uCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBjbGFzcyB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20uCisgICAgICogQHJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIHBhY2thZ2Ugb3IgaW1wbGVtZW50YXRpb24gdmVyc2lvbi4KKyAgICAgKiAnPy4/JyBmb3IgSkRLIDEuMCBvciAxLjEuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVyc2lvbihDbGFzcyBjbGF6eikgeworICAgICAgICByZXR1cm4gY2xhenouZ2V0UGFja2FnZSgpLmdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHdoYXQgcGFyc2VyIGFyZSB3ZSB1c2luZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc25hbWUgb2YgdGhlIHBhcnNlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRYbWxQYXJzZXJOYW1lKCkgeworICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gZ2V0U0FYUGFyc2VyKCk7CisgICAgICAgIGlmIChzYXhQYXJzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICJDb3VsZCBub3QgY3JlYXRlIGFuIFhNTCBQYXJzZXIiOworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIHRvIHdoYXQgaXMgaW4gdGhlIGNsYXNzbmFtZQorICAgICAgICBTdHJpbmcgc2F4UGFyc2VyTmFtZSA9IHNheFBhcnNlci5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIHNheFBhcnNlck5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgSkFYUCBTQVhQYXJzZXIKKyAgICAgKiBAcmV0dXJuIHBhcnNlciBvciBudWxsIGZvciB0cm91YmxlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU0FYUGFyc2VyIGdldFNBWFBhcnNlcigpIHsKKyAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhQYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBpZiAoc2F4UGFyc2VyRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNheFBhcnNlciA9IHNheFBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIGlnbm9yZVRocm93YWJsZShlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2F4UGFyc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIHBhcnNlcgorICAgICAqIEByZXR1cm4gcGF0aCBvciBudWxsIGZvciB0cm91YmxlIGluIHRyYWNraW5nIGl0IGRvd24KKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRYTUxQYXJzZXJMb2NhdGlvbigpIHsKKyAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IGdldFNBWFBhcnNlcigpOworICAgICAgICBpZiAoc2F4UGFyc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGdldENsYXNzTG9jYXRpb24oc2F4UGFyc2VyLmdldENsYXNzKCkpOworICAgICAgICByZXR1cm4gbG9jYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZVBhcnNlck5hbWUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gSkFYUFV0aWxzLmdldE5hbWVzcGFjZVhNTFJlYWRlcigpOworICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgICAgIGlnbm9yZVRocm93YWJsZShlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZVBhcnNlckxvY2F0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IEpBWFBVdGlscy5nZXROYW1lc3BhY2VYTUxSZWFkZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRDbGFzc0xvY2F0aW9uKHJlYWRlci5nZXRDbGFzcygpKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgICAgIGlnbm9yZVRocm93YWJsZShlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaWdub3JlIGV4Y2VwdGlvbnMuIFRoaXMgaXMgdG8gYWxsb3cgZnV0dXJlCisgICAgICogaW1wbGVtZW50YXRpb25zIHRvIGxvZyBhdCBhIHZlcmJvc2UgbGV2ZWwKKyAgICAgKiBAcGFyYW0gdGhyb3duCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpZ25vcmVUaHJvd2FibGUoVGhyb3dhYmxlIHRocm93bikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgbG9jYXRpb24gb2YgYSBjbGFzcy4gU3RvbGVuIGZyb20gYXhpcy93ZWJhcHBzL2hhcHB5YXhpcy5qc3AKKyAgICAgKiBAcGFyYW0gY2xhenoKKyAgICAgKiBAcmV0dXJuIHRoZSBqYXIgZmlsZSBvciBwYXRoIHdoZXJlIGEgY2xhc3Mgd2FzIGZvdW5kLCBvciBudWxsCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NMb2NhdGlvbihDbGFzcyBjbGF6eikgeworICAgICAgICBGaWxlIGYgPSBMb2FkZXJVdGlscy5nZXRDbGFzc1NvdXJjZShjbGF6eik7CisgICAgICAgIHJldHVybiBmID09IG51bGwgPyBudWxsIDogZi5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByaW50IGEgcmVwb3J0IHRvIHRoZSBnaXZlbiBzdHJlYW0uCisgICAgICogQHBhcmFtIG91dCB0aGUgc3RyZWFtIHRvIHByaW50IHRoZSByZXBvcnQgdG8uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvUmVwb3J0KFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBvdXQucHJpbnRsbigiLS0tLS0tLSBBbnQgZGlhZ25vc3RpY3MgcmVwb3J0IC0tLS0tLS0iKTsKKyAgICAgICAgb3V0LnByaW50bG4oTWFpbi5nZXRBbnRWZXJzaW9uKCkpOworICAgICAgICBoZWFkZXIob3V0LCAiSW1wbGVtZW50YXRpb24gVmVyc2lvbiIpOworCisgICAgICAgIG91dC5wcmludGxuKCJjb3JlIHRhc2tzICAgICA6ICIgKyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oTWFpbi5jbGFzcykpOworCisgICAgICAgIENsYXNzIG9wdGlvbmFsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wdGlvbmFsID0gQ2xhc3MuZm9yTmFtZShURVNUX0NMQVNTKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJvcHRpb25hbCB0YXNrcyA6ICIgKyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24ob3B0aW9uYWwpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZ25vcmVUaHJvd2FibGUoZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigib3B0aW9uYWwgdGFza3MgOiBub3QgYXZhaWxhYmxlIik7CisgICAgICAgIH0KKworICAgICAgICBoZWFkZXIob3V0LCAiQU5UIFBST1BFUlRJRVMiKTsKKyAgICAgICAgZG9SZXBvcnRBbnRQcm9wZXJ0aWVzKG91dCk7CisKKyAgICAgICAgaGVhZGVyKG91dCwgIkFOVF9IT01FL2xpYiBqYXIgbGlzdGluZyIpOworICAgICAgICBkb1JlcG9ydEFudEhvbWVMaWJyYXJpZXMob3V0KTsKKworICAgICAgICBoZWFkZXIob3V0LCAiVVNFUl9IT01FLy5hbnQvbGliIGphciBsaXN0aW5nIik7CisgICAgICAgIGRvUmVwb3J0VXNlckhvbWVMaWJyYXJpZXMob3V0KTsKKworICAgICAgICBoZWFkZXIob3V0LCAiVGFza3MgYXZhaWxhYmlsaXR5Iik7CisgICAgICAgIGRvUmVwb3J0VGFza3NBdmFpbGFiaWxpdHkob3V0KTsKKworICAgICAgICBoZWFkZXIob3V0LCAib3JnLmFwYWNoZS5lbnYuV2hpY2ggZGlhZ25vc3RpY3MiKTsKKyAgICAgICAgZG9SZXBvcnRXaGljaChvdXQpOworCisgICAgICAgIGhlYWRlcihvdXQsICJYTUwgUGFyc2VyIGluZm9ybWF0aW9uIik7CisgICAgICAgIGRvUmVwb3J0UGFyc2VySW5mbyhvdXQpOworCisgICAgICAgIGhlYWRlcihvdXQsICJTeXN0ZW0gcHJvcGVydGllcyIpOworICAgICAgICBkb1JlcG9ydFN5c3RlbVByb3BlcnRpZXMob3V0KTsKKworICAgICAgICBoZWFkZXIob3V0LCAiVGVtcCBkaXIiKTsKKyAgICAgICAgZG9SZXBvcnRUZW1wRGlyKG91dCk7CisKKyAgICAgICAgaGVhZGVyKG91dCwgIkxvY2FsZSBpbmZvcm1hdGlvbiIpOworICAgICAgICBkb1JlcG9ydExvY2FsZShvdXQpOworCisgICAgICAgIGhlYWRlcihvdXQsICJQcm94eSBpbmZvcm1hdGlvbiIpOworICAgICAgICBkb1JlcG9ydFByb3h5KG91dCk7CisKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGhlYWRlcihQcmludFN0cmVhbSBvdXQsIFN0cmluZyBzZWN0aW9uKSB7CisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIG91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIG91dC5wcmludCgiICIpOworICAgICAgICBvdXQucHJpbnRsbihzZWN0aW9uKTsKKyAgICAgICAgb3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBvcnQgYSBsaXN0aW5nIG9mIHN5c3RlbSBwcm9wZXJ0aWVzIGV4aXN0aW5nIGluIHRoZSBjdXJyZW50IHZtLgorICAgICAqIEBwYXJhbSBvdXQgdGhlIHN0cmVhbSB0byBwcmludCB0aGUgcHJvcGVydGllcyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvUmVwb3J0U3lzdGVtUHJvcGVydGllcyhQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgUHJvcGVydGllcyBzeXNwcm9wcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeXNwcm9wcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uICBlKSB7CisgICAgICAgICAgICBpZ25vcmVUaHJvd2FibGUoZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiQWNjZXNzIHRvIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkgYmxvY2tlZCAiICsgImJ5IGEgc2VjdXJpdHkgbWFuYWdlciIpOworICAgICAgICB9CisgICAgICAgIGZvciAoRW51bWVyYXRpb24ga2V5cyA9IHN5c3Byb3BzLnByb3BlcnR5TmFtZXMoKTsKKyAgICAgICAgICAgIGtleXMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGtleSArICIgOiAiICsgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIHN5c3RlbSBwcm9wZXJ0eS4gSWYgYSBzZWN1cml0eSBtYW5hZ2VyCisgICAgICogYmxvY2tzIGFjY2VzcyB0byBhIHByb3BlcnR5IGl0IGZpbGxzIHRoZSByZXN1bHQgaW4gd2l0aCBhbiBlcnJvcgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydHkncyB2YWx1ZSBvciBlcnJvciB0ZXh0CisgICAgICogQHNlZSAjRVJST1JfUFJPUEVSVFlfQUNDRVNTX0JMT0NLRUQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgeworICAgICAgICBTdHJpbmcgdmFsdWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB2YWx1ZSA9IEVSUk9SX1BST1BFUlRZX0FDQ0VTU19CTE9DS0VEOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBvcnQgdGhlIGNvbnRlbnQgb2YgQU5UX0hPTUUvbGliIGRpcmVjdG9yeQorICAgICAqIEBwYXJhbSBvdXQgdGhlIHN0cmVhbSB0byBwcmludCB0aGUgY29udGVudCB0bworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZG9SZXBvcnRBbnRQcm9wZXJ0aWVzKFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBQcm9qZWN0IHAgPSBuZXcgUHJvamVjdCgpOworICAgICAgICBwLmluaXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIG91dC5wcmludGxuKE1hZ2ljTmFtZXMuQU5UX1ZFUlNJT04gKyAiOiAiICsgcC5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9WRVJTSU9OKSk7CisgICAgICAgIG91dC5wcmludGxuKE1hZ2ljTmFtZXMuQU5UX0pBVkFfVkVSU0lPTiArICI6ICIKKyAgICAgICAgICAgICAgICArIHAuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfSkFWQV9WRVJTSU9OKSk7CisgICAgICAgIG91dC5wcmludGxuKE1hZ2ljTmFtZXMuQU5UX0xJQiArICI6ICIgKyBwLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0xJQikpOworICAgICAgICBvdXQucHJpbnRsbihNYWdpY05hbWVzLkFOVF9IT01FICsgIjogIiArIHAuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfSE9NRSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcG9ydCB0aGUgY29udGVudCBvZiBBTlRfSE9NRS9saWIgZGlyZWN0b3J5CisgICAgICogQHBhcmFtIG91dCB0aGUgc3RyZWFtIHRvIHByaW50IHRoZSBjb250ZW50IHRvCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1JlcG9ydEFudEhvbWVMaWJyYXJpZXMoUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIG91dC5wcmludGxuKE1hZ2ljTmFtZXMuQU5UX0hPTUUgKyAiOiAiICsgU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0hPTUUpKTsKKyAgICAgICAgRmlsZVtdIGxpYnMgPSBsaXN0TGlicmFyaWVzKCk7CisgICAgICAgIHByaW50TGlicmFyaWVzKGxpYnMsIG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwb3J0IHRoZSBjb250ZW50IG9mIH4vLmFudC9saWIgZGlyZWN0b3J5CisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBzdHJlYW0gdG8gcHJpbnQgdGhlIGNvbnRlbnQgdG8KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvUmVwb3J0VXNlckhvbWVMaWJyYXJpZXMoUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIFN0cmluZyBob21lID0gU3lzdGVtLmdldFByb3BlcnR5KExhdW5jaGVyLlVTRVJfSE9NRURJUik7CisgICAgICAgIG91dC5wcmludGxuKCJ1c2VyLmhvbWU6ICIgKyBob21lKTsKKyAgICAgICAgRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShob21lLCBMYXVuY2hlci5VU0VSX0xJQkRJUik7CisgICAgICAgIEZpbGVbXSBsaWJzID0gbGlzdEphckZpbGVzKGxpYkRpcik7CisgICAgICAgIHByaW50TGlicmFyaWVzKGxpYnMsIG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbGlzdCB0aGUgbGlicmFyaWVzCisgICAgICogQHBhcmFtIGxpYnMgYXJyYXkgb2YgbGlicmFyaWVzIChjYW4gYmUgbnVsbCkKKyAgICAgKiBAcGFyYW0gb3V0IG91dHB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50TGlicmFyaWVzKEZpbGVbXSBsaWJzLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgaWYgKGxpYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIk5vIHN1Y2ggZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgb3V0LnByaW50bG4obGlic1tpXS5nZXROYW1lKCkgKyAiICgiICsgbGlic1tpXS5sZW5ndGgoKSArICIgYnl0ZXMpIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENhbGwgb3JnLmFwYWNoZS5lbnYuV2hpY2ggaWYgYXZhaWxhYmxlCisgICAgICogQHBhcmFtIG91dCB0aGUgc3RyZWFtIHRvIHByaW50IHRoZSBjb250ZW50IHRvLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZG9SZXBvcnRXaGljaChQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgVGhyb3dhYmxlIGVycm9yID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIHdoaWNoID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS5lbnYuV2hpY2giKTsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSB3aGljaC5nZXRNZXRob2QoCisgICAgICAgICAgICAgICAgIm1haW4iLCBuZXcgQ2xhc3NbXSB7U3RyaW5nW10uY2xhc3N9KTsKKyAgICAgICAgICAgIG1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde25ldyBTdHJpbmdbXXt9fSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIk5vdCBhdmFpbGFibGUuIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiRG93bmxvYWQgaXQgYXQgaHR0cDovL3htbC5hcGFjaGUub3JnL2NvbW1vbnMvIik7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3IgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpID09IG51bGwgPyBlIDogZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGVycm9yID0gZTsKKyAgICAgICAgfQorICAgICAgICAvLyByZXBvcnQgZXJyb3IgaWYgc29tZXRoaW5nIHdlaXJkIGhhcHBlbnMuLi50aGlzIGlzIGRpYWdub3N0aWMuCisgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiRXJyb3Igd2hpbGUgcnVubmluZyBvcmcuYXBhY2hlLmVudi5XaGljaCIpOworICAgICAgICAgICAgZXJyb3IucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSByZXBvcnQgYWJvdXQgbm9uLWF2YWlsYWJsZSB0YXNrcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZQorICAgICAqIG1hcHBpbmcgYnV0IGNvdWxkIG5vdCBiZSBmb3VuZCB2aWEgbG9va3VwLiBJdCBtaWdodCBnZW5lcmFsbHkgaGFwcGVuCisgICAgICogYmVjYXVzZSBBbnQgcmVxdWlyZXMgbXVsdGlwbGUgbGlicmFyaWVzIHRvIGNvbXBpbGUgYW5kIG9uZSBvZiB0aGVtCisgICAgICogd2FzIG1pc3Npbmcgd2hlbiBjb21waWxpbmcgQW50LgorICAgICAqIEBwYXJhbSBvdXQgdGhlIHN0cmVhbSB0byBwcmludCB0aGUgdGFza3MgcmVwb3J0IHRvCisgICAgICogPHR0Pm51bGw8L3R0PiBmb3IgYSBtaXNzaW5nIHN0cmVhbSAoaWUgbWFwcGluZykuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1JlcG9ydFRhc2tzQXZhaWxhYmlsaXR5KFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IE1haW4uY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICBNYWdpY05hbWVzLlRBU0tERUZfUFJPUEVSVElFU19SRVNPVVJDRSk7CisgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiTm9uZSBhdmFpbGFibGUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGlzKTsKKyAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGtleXMgPSBwcm9wcy5rZXlzKCk7IGtleXMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oa2V5ICsgIiA6IE5vdCBBdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIodGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGlzIG5vdCBwcmVzZW50KSIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gZS5nZXRNZXNzYWdlKCkucmVwbGFjZSgnLycsICcuJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihrZXkgKyAiIDogTWlzc2luZyBkZXBlbmRlbmN5ICIgKyBwa2cpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oa2V5ICsgIiA6IEluaXRpYWxpemF0aW9uIGVycm9yIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb3BzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJBbGwgZGVmaW5lZCB0YXNrcyBhcmUgYXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIkEgdGFzayBiZWluZyBtaXNzaW5nL3VuYXZhaWxhYmxlIHNob3VsZCBvbmx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtYXR0ZXIgaWYgeW91IGFyZSB0cnlpbmcgdG8gdXNlIGl0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRlbGwgdGhlIHVzZXIgYWJvdXQgdGhlIFhNTCBwYXJzZXIKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1JlcG9ydFBhcnNlckluZm8oUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIFN0cmluZyBwYXJzZXJOYW1lID0gZ2V0WG1sUGFyc2VyTmFtZSgpOworICAgICAgICBTdHJpbmcgcGFyc2VyTG9jYXRpb24gPSBnZXRYTUxQYXJzZXJMb2NhdGlvbigpOworICAgICAgICBwcmludFBhcnNlckluZm8ob3V0LCAiWE1MIFBhcnNlciIsIHBhcnNlck5hbWUsIHBhcnNlckxvY2F0aW9uKTsKKyAgICAgICAgcHJpbnRQYXJzZXJJbmZvKG91dCwgIk5hbWVzcGFjZS1hd2FyZSBwYXJzZXIiLCBnZXROYW1lc3BhY2VQYXJzZXJOYW1lKCksCisgICAgICAgICAgICAgICAgZ2V0TmFtZXNwYWNlUGFyc2VyTG9jYXRpb24oKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBhcnNlckluZm8oUHJpbnRTdHJlYW0gb3V0LCBTdHJpbmcgcGFyc2VyVHlwZSwgU3RyaW5nIHBhcnNlck5hbWUsCisgICAgICAgICAgICBTdHJpbmcgcGFyc2VyTG9jYXRpb24pIHsKKyAgICAgICAgaWYgKHBhcnNlck5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyc2VyTmFtZSA9ICJ1bmtub3duIjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyc2VyTG9jYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyc2VyTG9jYXRpb24gPSAidW5rbm93biI7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4ocGFyc2VyVHlwZSArICIgOiAiICsgcGFyc2VyTmFtZSk7CisgICAgICAgIG91dC5wcmludGxuKHBhcnNlclR5cGUgKyAiIExvY2F0aW9uOiAiICsgcGFyc2VyTG9jYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRyeSBhbmQgY3JlYXRlIGEgdGVtcCBmaWxlIGluIG91ciB0ZW1wIGRpcjsgdGhpcworICAgICAqIGNoZWNrcyB0aGF0IGl0IGhhcyBzcGFjZSBhbmQgYWNjZXNzLgorICAgICAqIFdlIGFsc28gZG8gc29tZSBjbG9jayByZXBvcnRpbmcuCisgICAgICogQHBhcmFtIG91dAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZG9SZXBvcnRUZW1wRGlyKFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBTdHJpbmcgdGVtcGRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKKyAgICAgICAgaWYgKHRlbXBkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIldhcm5pbmc6IGphdmEuaW8udG1wZGlyIGlzIHVuZGVmaW5lZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCJUZW1wIGRpciBpcyAiICsgdGVtcGRpcik7CisgICAgICAgIEZpbGUgdGVtcERpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXBkaXIpOworICAgICAgICBpZiAoIXRlbXBEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJXYXJuaW5nLCBqYXZhLmlvLnRtcGRpciBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICIgKyB0ZW1wZGlyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvL2NyZWF0ZSB0aGUgZmlsZQorICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBGaWxlIHRlbXBGaWxlID0gbnVsbDsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaWxlb3V0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZGlhZyIsICJ0eHQiLCB0ZW1wRGlyZWN0b3J5KTsKKyAgICAgICAgICAgIC8vZG8gc29tZSB3cml0aW5nIHRvIGl0CisgICAgICAgICAgICBmaWxlb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0tJTE9CWVRFXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVEVTVF9GSUxFX1NJWkU7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbGVvdXQud3JpdGUoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbGVvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIGZpbGVvdXQgPSBudWxsOworICAgICAgICAgICAgbG9uZyBmaWxldGltZSA9IHRlbXBGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgdGVtcEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiVGVtcCBkaXIgaXMgd3JpdGVhYmxlIik7CisgICAgICAgICAgICBsb25nIGRyaWZ0ID0gZmlsZXRpbWUgLSBub3c7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiVGVtcCBkaXIgYWxpZ25tZW50IHdpdGggc3lzdGVtIGNsb2NrIGlzICIgKyBkcmlmdCArICIgbXMiKTsKKyAgICAgICAgICAgIGlmIChNYXRoLmFicyhkcmlmdCkgPiBCSUdfRFJJRlRfTElNSVQpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiV2FybmluZzogYmlnIGNsb2NrIGRyaWZ0IC1tYXliZSBhIG5ldHdvcmsgZmlsZXN5c3RlbSIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZ25vcmVUaHJvd2FibGUoZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiRmFpbGVkIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSB0ZW1wIGRpciAiICsgdGVtcGRpcik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiRmlsZSAgIiArIHRlbXBGaWxlICsgIiBjb3VsZCBub3QgYmUgY3JlYXRlZC93cml0dGVuIHRvIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZmlsZW91dCk7CisgICAgICAgICAgICBpZiAodGVtcEZpbGUgIT0gbnVsbCAmJiB0ZW1wRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRlbXBGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwb3J0IGxvY2FsZSBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbSBvdXQgc3RyZWFtIHRvIHByaW50IHRvCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1JlcG9ydExvY2FsZShQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgLy9jYWxlbmRhciBzdHVmZi4KKyAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgVGltZVpvbmUgdHogPSBjYWwuZ2V0VGltZVpvbmUoKTsKKyAgICAgICAgb3V0LnByaW50bG4oIlRpbWV6b25lICIKKyAgICAgICAgICAgICAgICArIHR6LmdldERpc3BsYXlOYW1lKCkKKyAgICAgICAgICAgICAgICArICIgb2Zmc2V0PSIKKyAgICAgICAgICAgICAgICArIHR6LmdldE9mZnNldChjYWwuZ2V0KENhbGVuZGFyLkVSQSksIGNhbC5nZXQoQ2FsZW5kYXIuWUVBUiksIGNhbAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldChDYWxlbmRhci5NT05USCksIGNhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSwgY2FsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KENhbGVuZGFyLkRBWV9PRl9XRUVLKSwgKChjYWwuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKQorICAgICAgICAgICAgICAgICAgICAgICAgKiBNSU5VVEVTX1BFUl9IT1VSICsgY2FsLmdldChDYWxlbmRhci5NSU5VVEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgKiBTRUNPTkRTX1BFUl9NSU5VVEUgKyBjYWwuZ2V0KENhbGVuZGFyLlNFQ09ORCkpCisgICAgICAgICAgICAgICAgICAgICAgICAqIFNFQ09ORFNfUEVSX01JTExJU0VDT05EICsgY2FsLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcmludCBhIHByb3BlcnR5IG5hbWU9InZhbHVlIiBwYWlyIGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQ7CisgICAgICogcHJpbnQgbm90aGluZyBpZiBpdCBpcyBudWxsCisgICAgICogQHBhcmFtIG91dCBzdHJlYW0gdG8gcHJpbnQgb24KKyAgICAgKiBAcGFyYW0ga2V5IHByb3BlcnR5IG5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UHJvcGVydHkoUHJpbnRTdHJlYW0gb3V0LCBTdHJpbmcga2V5KSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFByb3BlcnR5KGtleSk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoa2V5KTsKKyAgICAgICAgICAgIG91dC5wcmludCgiID0gIik7CisgICAgICAgICAgICBvdXQucHJpbnQoJyInKTsKKyAgICAgICAgICAgIG91dC5wcmludCh2YWx1ZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbignIicpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwb3J0IHByb3h5IGluZm9ybWF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0IHN0cmVhbSB0byBwcmludCB0bworICAgICAqIEBzaW5jZSBBbnQxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvUmVwb3J0UHJveHkoUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIHByaW50UHJvcGVydHkob3V0LCBQcm94eVNldHVwLkhUVFBfUFJPWFlfSE9TVCk7CisgICAgICAgIHByaW50UHJvcGVydHkob3V0LCBQcm94eVNldHVwLkhUVFBfUFJPWFlfUE9SVCk7CisgICAgICAgIHByaW50UHJvcGVydHkob3V0LCBQcm94eVNldHVwLkhUVFBfUFJPWFlfVVNFUk5BTUUpOworICAgICAgICBwcmludFByb3BlcnR5KG91dCwgUHJveHlTZXR1cC5IVFRQX1BST1hZX1BBU1NXT1JEKTsKKyAgICAgICAgcHJpbnRQcm9wZXJ0eShvdXQsIFByb3h5U2V0dXAuSFRUUF9OT05fUFJPWFlfSE9TVFMpOworICAgICAgICBwcmludFByb3BlcnR5KG91dCwgUHJveHlTZXR1cC5IVFRQU19QUk9YWV9IT1NUKTsKKyAgICAgICAgcHJpbnRQcm9wZXJ0eShvdXQsIFByb3h5U2V0dXAuSFRUUFNfUFJPWFlfUE9SVCk7CisgICAgICAgIHByaW50UHJvcGVydHkob3V0LCBQcm94eVNldHVwLkhUVFBTX05PTl9QUk9YWV9IT1NUUyk7CisgICAgICAgIHByaW50UHJvcGVydHkob3V0LCBQcm94eVNldHVwLkZUUF9QUk9YWV9IT1NUKTsKKyAgICAgICAgcHJpbnRQcm9wZXJ0eShvdXQsIFByb3h5U2V0dXAuRlRQX1BST1hZX1BPUlQpOworICAgICAgICBwcmludFByb3BlcnR5KG91dCwgUHJveHlTZXR1cC5GVFBfTk9OX1BST1hZX0hPU1RTKTsKKyAgICAgICAgcHJpbnRQcm9wZXJ0eShvdXQsIFByb3h5U2V0dXAuU09DS1NfUFJPWFlfSE9TVCk7CisgICAgICAgIHByaW50UHJvcGVydHkob3V0LCBQcm94eVNldHVwLlNPQ0tTX1BST1hZX1BPUlQpOworICAgICAgICBwcmludFByb3BlcnR5KG91dCwgUHJveHlTZXR1cC5TT0NLU19QUk9YWV9VU0VSTkFNRSk7CisgICAgICAgIHByaW50UHJvcGVydHkob3V0LCBQcm94eVNldHVwLlNPQ0tTX1BST1hZX1BBU1NXT1JEKTsKKworICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmdldEphdmFWZXJzaW9uTnVtYmVyKCkgPCBKQVZBXzFfNV9OVU1CRVIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwcmludFByb3BlcnR5KG91dCwgUHJveHlTZXR1cC5VU0VfU1lTVEVNX1BST1hJRVMpOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJveHlEaWFnQ2xhc3NuYW1lID0gIm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuamF2YTE1LlByb3h5RGlhZ25vc3RpY3MiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgcHJveHlEaWFnQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHByb3h5RGlhZ0NsYXNzbmFtZSk7CisgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UgPSBwcm94eURpYWdDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIkphdmExLjUrIHByb3h5IHNldHRpbmdzOiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5zdGFuY2UudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9ub3QgaW5jbHVkZWQsIGRvIG5vdGhpbmcKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL25vdCBpbmNsdWRlZCwgZG8gbm90aGluZworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vbm90IGluY2x1ZGVkLCBkbyBub3RoaW5nCisgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbmNsdWRlZCwgdG8gbm90aGluZworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmMGM2NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RpcmVjdG9yeVNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDE3MTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TZWxlY3RvclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIENsYXNzIGZvciBzY2FubmluZyBhIGRpcmVjdG9yeSBmb3IgZmlsZXMvZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2ggY2VydGFpbgorICogY3JpdGVyaWEuCisgKiA8cD4KKyAqIFRoZXNlIGNyaXRlcmlhIGNvbnNpc3Qgb2Ygc2VsZWN0b3JzIGFuZCBwYXR0ZXJucyB3aGljaCBoYXZlIGJlZW4gc3BlY2lmaWVkLgorICogV2l0aCB0aGUgc2VsZWN0b3JzIHlvdSBjYW4gc2VsZWN0IHdoaWNoIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgaW5jbHVkZWQuCisgKiBGaWxlcyB3aGljaCBhcmUgbm90IHNlbGVjdGVkIGFyZSBleGNsdWRlZC4gV2l0aCBwYXR0ZXJucyB5b3UgY2FuIGluY2x1ZGUKKyAqIG9yIGV4Y2x1ZGUgZmlsZXMgYmFzZWQgb24gdGhlaXIgZmlsZW5hbWUuCisgKiA8cD4KKyAqIFRoZSBpZGVhIGlzIHNpbXBsZS4gQSBnaXZlbiBkaXJlY3RvcnkgaXMgcmVjdXJzaXZlbHkgc2Nhbm5lZCBmb3IgYWxsIGZpbGVzCisgKiBhbmQgZGlyZWN0b3JpZXMuIEVhY2ggZmlsZS9kaXJlY3RvcnkgaXMgbWF0Y2hlZCBhZ2FpbnN0IGEgc2V0IG9mIHNlbGVjdG9ycywKKyAqIGluY2x1ZGluZyBzcGVjaWFsIHN1cHBvcnQgZm9yIG1hdGNoaW5nIGFnYWluc3QgZmlsZW5hbWVzIHdpdGggaW5jbHVkZSBhbmQKKyAqIGFuZCBleGNsdWRlIHBhdHRlcm5zLiBPbmx5IGZpbGVzL2RpcmVjdG9yaWVzIHdoaWNoIG1hdGNoIGF0IGxlYXN0IG9uZQorICogcGF0dGVybiBvZiB0aGUgaW5jbHVkZSBwYXR0ZXJuIGxpc3Qgb3Igb3RoZXIgZmlsZSBzZWxlY3RvciwgYW5kIGRvbid0IG1hdGNoCisgKiBhbnkgcGF0dGVybiBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJuIGxpc3Qgb3IgZmFpbCB0byBtYXRjaCBhZ2FpbnN0IGEgcmVxdWlyZWQKKyAqIHNlbGVjdG9yIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBsaXN0IG9mIGZpbGVzL2RpcmVjdG9yaWVzIGZvdW5kLgorICogPHA+CisgKiBXaGVuIG5vIGxpc3Qgb2YgaW5jbHVkZSBwYXR0ZXJucyBpcyBzdXBwbGllZCwgIioqIiB3aWxsIGJlIHVzZWQsIHdoaWNoCisgKiBtZWFucyB0aGF0IGV2ZXJ5dGhpbmcgd2lsbCBiZSBtYXRjaGVkLiBXaGVuIG5vIGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucyBpcworICogc3VwcGxpZWQsIGFuIGVtcHR5IGxpc3QgaXMgdXNlZCwgc3VjaCB0aGF0IG5vdGhpbmcgd2lsbCBiZSBleGNsdWRlZC4gV2hlbgorICogbm8gc2VsZWN0b3JzIGFyZSBzdXBwbGllZCwgbm9uZSBhcmUgYXBwbGllZC4KKyAqIDxwPgorICogVGhlIGZpbGVuYW1lIHBhdHRlcm4gbWF0Y2hpbmcgaXMgZG9uZSBhcyBmb2xsb3dzOgorICogVGhlIG5hbWUgdG8gYmUgbWF0Y2hlZCBpcyBzcGxpdCB1cCBpbiBwYXRoIHNlZ21lbnRzLiBBIHBhdGggc2VnbWVudCBpcyB0aGUKKyAqIG5hbWUgb2YgYSBkaXJlY3Rvcnkgb3IgZmlsZSwgd2hpY2ggaXMgYm91bmRlZCBieQorICogPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+ICgnLycgdW5kZXIgVU5JWCwgJ1wnIHVuZGVyIFdpbmRvd3MpLgorICogRm9yIGV4YW1wbGUsICJhYmMvZGVmL2doaS94eXouamF2YSIgaXMgc3BsaXQgdXAgaW4gdGhlIHNlZ21lbnRzICJhYmMiLAorICogImRlZiIsImdoaSIgYW5kICJ4eXouamF2YSIuCisgKiBUaGUgc2FtZSBpcyBkb25lIGZvciB0aGUgcGF0dGVybiBhZ2FpbnN0IHdoaWNoIHNob3VsZCBiZSBtYXRjaGVkLgorICogPHA+CisgKiBUaGUgc2VnbWVudHMgb2YgdGhlIG5hbWUgYW5kIHRoZSBwYXR0ZXJuIGFyZSB0aGVuIG1hdGNoZWQgYWdhaW5zdCBlYWNoCisgKiBvdGhlci4gV2hlbiAnKionIGlzIHVzZWQgZm9yIGEgcGF0aCBzZWdtZW50IGluIHRoZSBwYXR0ZXJuLCBpdCBtYXRjaGVzCisgKiB6ZXJvIG9yIG1vcmUgcGF0aCBzZWdtZW50cyBvZiB0aGUgbmFtZS4KKyAqIDxwPgorICogVGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgcmVnYXJkaW5nIHRoZSB1c2Ugb2YgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+cworICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0dGVybiBhbmQgdGhlIHN0cmluZyB0byBtYXRjaDo8YnI+CisgKiBXaGVuIGEgcGF0dGVybiBzdGFydHMgd2l0aCBhIDxjb2RlPkZpbGUuc2VwYXJhdG9yPC9jb2RlPiwgdGhlIHN0cmluZworICogdG8gbWF0Y2ggbXVzdCBhbHNvIHN0YXJ0IHdpdGggYSA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT4uCisgKiBXaGVuIGEgcGF0dGVybiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+LCB0aGUKKyAqIHN0cmluZyB0byBtYXRjaCBtYXkgbm90IHN0YXJ0IHdpdGggYSA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT4uCisgKiBXaGVuIG9uZSBvZiB0aGVzZSBydWxlcyBpcyBub3Qgb2JleWVkLCB0aGUgc3RyaW5nIHdpbGwgbm90CisgKiBtYXRjaC4KKyAqIDxwPgorICogV2hlbiBhIG5hbWUgcGF0aCBzZWdtZW50IGlzIG1hdGNoZWQgYWdhaW5zdCBhIHBhdHRlcm4gcGF0aCBzZWdtZW50LCB0aGUKKyAqIGZvbGxvd2luZyBzcGVjaWFsIGNoYXJhY3RlcnMgY2FuIGJlIHVzZWQ6PGJyPgorICogJyonIG1hdGNoZXMgemVybyBvciBtb3JlIGNoYXJhY3RlcnM8YnI+CisgKiAnPycgbWF0Y2hlcyBvbmUgY2hhcmFjdGVyLgorICogPHA+CisgKiBFeGFtcGxlczoKKyAqIDxwPgorICogIioqXCouY2xhc3MiIG1hdGNoZXMgYWxsIC5jbGFzcyBmaWxlcy9kaXJzIGluIGEgZGlyZWN0b3J5IHRyZWUuCisgKiA8cD4KKyAqICJ0ZXN0XGE/Py5qYXZhIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHdoaWNoIHN0YXJ0IHdpdGggYW4gJ2EnLCB0aGVuIHR3bworICogbW9yZSBjaGFyYWN0ZXJzIGFuZCB0aGVuICIuamF2YSIsIGluIGEgZGlyZWN0b3J5IGNhbGxlZCB0ZXN0LgorICogPHA+CisgKiAiKioiIG1hdGNoZXMgZXZlcnl0aGluZyBpbiBhIGRpcmVjdG9yeSB0cmVlLgorICogPHA+CisgKiAiKipcdGVzdFwqKlxYWVoqIiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJzIHdoaWNoIHN0YXJ0IHdpdGggIlhZWiIgYW5kIHdoZXJlCisgKiB0aGVyZSBpcyBhIHBhcmVudCBkaXJlY3RvcnkgY2FsbGVkIHRlc3QgKGUuZy4gImFiY1x0ZXN0XGRlZlxnaGlcWFlaMTIzIikuCisgKiA8cD4KKyAqIENhc2Ugc2Vuc2l0aXZpdHkgbWF5IGJlIHR1cm5lZCBvZmYgaWYgbmVjZXNzYXJ5LiBCeSBkZWZhdWx0LCBpdCBpcworICogdHVybmVkIG9uLgorICogPHA+CisgKiBFeGFtcGxlIG9mIHVzYWdlOgorICogPHByZT4KKyAqICAgU3RyaW5nW10gaW5jbHVkZXMgPSB7IioqXFwqLmNsYXNzIn07CisgKiAgIFN0cmluZ1tdIGV4Y2x1ZGVzID0geyJtb2R1bGVzXFwqXFwqKiJ9OworICogICBkcy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7CisgKiAgIGRzLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKKyAqICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZSgidGVzdCIpKTsKKyAqICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZSh0cnVlKTsKKyAqICAgZHMuc2NhbigpOworICoKKyAqICAgU3lzdGVtLm91dC5wcmludGxuKCJGSUxFUzoiKTsKKyAqICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisgKiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZXNbaV0pOworICogICB9CisgKiA8L3ByZT4KKyAqIFRoaXMgd2lsbCBzY2FuIGEgZGlyZWN0b3J5IGNhbGxlZCB0ZXN0IGZvciAuY2xhc3MgZmlsZXMsIGJ1dCBleGNsdWRlcyBhbGwKKyAqIGZpbGVzIGluIGFsbCBwcm9wZXIgc3ViZGlyZWN0b3JpZXMgb2YgYSBkaXJlY3RvcnkgY2FsbGVkICJtb2R1bGVzIgorICoKKyAqLworcHVibGljIGNsYXNzIERpcmVjdG9yeVNjYW5uZXIKKyAgICAgICBpbXBsZW1lbnRzIEZpbGVTY2FubmVyLCBTZWxlY3RvclNjYW5uZXIsIFJlc291cmNlRmFjdG9yeSB7CisKKyAgICAvKiogSXMgT3BlblZNUyB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3ZSdyZSBydW5uaW5nIG9uPyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gT05fVk1TID0gT3MuaXNGYW1pbHkoIm9wZW52bXMiKTsKKworICAgIC8qKgorICAgICAqIFBhdHRlcm5zIHdoaWNoIHNob3VsZCBiZSBleGNsdWRlZCBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHlvdSBjYW4gbm93IGFkZCBwYXR0ZXJucyB0byB0aGUgbGlzdCBvZiBkZWZhdWx0CisgICAgICogZXhjbHVkZXMuICBBZGRlZCBwYXR0ZXJucyB3aWxsIG5vdCBiZWNvbWUgcGFydCBvZiB0aGlzIGFycmF5CisgICAgICogdGhhdCBoYXMgb25seSBiZWVuIGtlcHQgYXJvdW5kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAqIHJlYXNvbnMuPC9wPgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICogICAgICAgICAgICAgVXNlIHRoZSB7QGxpbmsgI2dldERlZmF1bHRFeGNsdWRlcyBnZXREZWZhdWx0RXhjbHVkZXN9CisgICAgICogICAgICAgICAgICAgbWV0aG9kIGluc3RlYWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxURVhDTFVERVMgPSB7CisgICAgICAgIC8vIE1pc2NlbGxhbmVvdXMgdHlwaWNhbCB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgICAgIioqLyp+IiwKKyAgICAgICAgIioqLyMqIyIsCisgICAgICAgICIqKi8uIyoiLAorICAgICAgICAiKiovJSolIiwKKyAgICAgICAgIioqLy5fKiIsCisKKyAgICAgICAgLy8gQ1ZTCisgICAgICAgICIqKi9DVlMiLAorICAgICAgICAiKiovQ1ZTLyoqIiwKKyAgICAgICAgIioqLy5jdnNpZ25vcmUiLAorCisgICAgICAgIC8vIFNDQ1MKKyAgICAgICAgIioqL1NDQ1MiLAorICAgICAgICAiKiovU0NDUy8qKiIsCisKKyAgICAgICAgLy8gVmlzdWFsIFNvdXJjZVNhZmUKKyAgICAgICAgIioqL3Zzc3Zlci5zY2MiLAorCisgICAgICAgIC8vIFN1YnZlcnNpb24KKyAgICAgICAgIioqLy5zdm4iLAorICAgICAgICAiKiovLnN2bi8qKiIsCisKKyAgICAgICAgLy8gTWFjCisgICAgICAgICIqKi8uRFNfU3RvcmUiCisgICAgfTsKKworICAgIC8qKiBIZWxwZXIuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKiogaXRlcmF0aW9ucyBmb3IgY2FzZS1zZW5zaXRpdmUgc2Nhbm5pbmcuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbltdIENTX1NDQU5fT05MWSA9IG5ldyBib29sZWFuW10ge3RydWV9OworCisgICAgLyoqIGl0ZXJhdGlvbnMgZm9yIG5vbi1jYXNlLXNlbnNpdGl2ZSBzY2FubmluZy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuW10gQ1NfVEhFTl9OT05fQ1MgPSBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZX07CisKKyAgICAvKioKKyAgICAgKiBQYXR0ZXJucyB3aGljaCBzaG91bGQgYmUgZXhjbHVkZWQgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEBzZWUgI2FkZERlZmF1bHRFeGNsdWRlcygpCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGRlZmF1bHRFeGNsdWRlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICBzdGF0aWMgeworICAgICAgICByZXNldERlZmF1bHRFeGNsdWRlcygpOworICAgIH0KKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisKKyAgICAvKiogVGhlIGJhc2UgZGlyZWN0b3J5IHRvIGJlIHNjYW5uZWQuICovCisgICAgcHJvdGVjdGVkIEZpbGUgYmFzZWRpcjsKKworICAgIC8qKiBUaGUgcGF0dGVybnMgZm9yIHRoZSBmaWxlcyB0byBiZSBpbmNsdWRlZC4gKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gaW5jbHVkZXM7CisKKyAgICAvKiogVGhlIHBhdHRlcm5zIGZvciB0aGUgZmlsZXMgdG8gYmUgZXhjbHVkZWQuICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4Y2x1ZGVzOworCisgICAgLyoqIFNlbGVjdG9ycyB0aGF0IHdpbGwgZmlsdGVyIHdoaWNoIGZpbGVzIGFyZSBpbiBvdXIgY2FuZGlkYXRlIGxpc3QuICovCisgICAgcHJvdGVjdGVkIEZpbGVTZWxlY3RvcltdIHNlbGVjdG9ycyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgaW5jbHVkZSBhbmQgbm8gZXhjbHVkZXMKKyAgICAgKiBhbmQgd2VyZSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzSW5jbHVkZWQ7CisKKyAgICAvKiogVGhlIGZpbGVzIHdoaWNoIGRpZCBub3QgbWF0Y2ggYW55IGluY2x1ZGVzIG9yIHNlbGVjdG9ycy4gKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzTm90SW5jbHVkZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgaW5jbHVkZSBhbmQgYXQgbGVhc3QKKyAgICAgKiBvbmUgZXhjbHVkZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzRXhjbHVkZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgaW5jbHVkZSBhbmQgbm8gZXhjbHVkZXMKKyAgICAgKiBhbmQgd2VyZSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGRpcnNJbmNsdWRlZDsKKworICAgIC8qKiBUaGUgZGlyZWN0b3JpZXMgd2hpY2ggd2VyZSBmb3VuZCBhbmQgZGlkIG5vdCBtYXRjaCBhbnkgaW5jbHVkZXMuICovCisgICAgcHJvdGVjdGVkIFZlY3RvciBkaXJzTm90SW5jbHVkZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgaW5jbHVkZSBhbmQgYXQgbGVhc3Qgb25lCisgICAgICogZXhjbHVkZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGRpcnNFeGNsdWRlZDsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBpbmNsdWRlIGFuZCBubyBleGNsdWRlcyBhbmQKKyAgICAgKiB3aGljaCBhIHNlbGVjdG9yIGRpc2NhcmRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzRGVzZWxlY3RlZDsKKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcmllcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBpbmNsdWRlIGFuZCBubyBleGNsdWRlcworICAgICAqIGJ1dCB3aGljaCBhIHNlbGVjdG9yIGRpc2NhcmRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGRpcnNEZXNlbGVjdGVkOworCisgICAgLyoqIFdoZXRoZXIgb3Igbm90IG91ciByZXN1bHRzIHdlcmUgYnVpbHQgYnkgYSBzbG93IHNjYW4uICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGF2ZVNsb3dSZXN1bHRzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBjYXNlIHNlbnNpdGl2ZQorICAgICAqIG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogV2hldGhlciBhIG1pc3NpbmcgYmFzZSBkaXJlY3RvcnkgaXMgYW4gZXJyb3IuCisgICAgICogQHNpbmNlIEFudCAxLjcuMQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGVycm9yT25NaXNzaW5nRGlyID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHN5bWJvbGljIGxpbmtzIHNob3VsZCBiZSBmb2xsb3dlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZvbGxvd1N5bWxpbmtzID0gdHJ1ZTsKKworICAgIC8qKiBXaGV0aGVyIG9yIG5vdCBldmVyeXRoaW5nIHRlc3RlZCBzbyBmYXIgaGFzIGJlZW4gaW5jbHVkZWQuICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXZlcnl0aGluZ0luY2x1ZGVkID0gdHJ1ZTsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBUZW1wb3JhcnkgdGFibGUgdG8gc3BlZWQgdXAgdGhlIHZhcmlvdXMgc2Nhbm5pbmcgbWV0aG9kcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJpdmF0ZSBNYXAgZmlsZUxpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBhbGwgc2Nhbm5lZCBkaXJlY3Rvcmllcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJpdmF0ZSBTZXQgc2Nhbm5lZERpcnMgPSBuZXcgSGFzaFNldCgpOworCisgICAgLyoqCisgICAgICogU2V0IG9mIGFsbCBpbmNsdWRlIHBhdHRlcm5zIHRoYXQgYXJlIGZ1bGwgZmlsZSBuYW1lcyBhbmQgZG9uJ3QKKyAgICAgKiBjb250YWluIGFueSB3aWxkY2FyZHMuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGlzIGluc3RhbmNlIGlzIG5vdCBjYXNlIHNlbnNpdGl2ZSwgdGhlIGZpbGUgbmFtZXMgZ2V0CisgICAgICogdHVybmVkIHRvIGxvd2VyIGNhc2UuPC9wPgorICAgICAqCisgICAgICogPHA+R2V0cyBsYXppbHkgaW5pdGlhbGl6ZWQgb24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YKKyAgICAgKiBpc0luY2x1ZGVkIG9yIGlzRXhjbHVkZWQgYW5kIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbgorICAgICAqIG1ldGhvZCAoY2xlYXJlZCBpbiBjbGVhckNhY2hlcywgYWN0dWFsbHkpLjwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldCBpbmNsdWRlTm9uUGF0dGVybnMgPSBuZXcgSGFzaFNldCgpOworCisgICAgLyoqCisgICAgICogU2V0IG9mIGFsbCBpbmNsdWRlIHBhdHRlcm5zIHRoYXQgYXJlIGZ1bGwgZmlsZSBuYW1lcyBhbmQgZG9uJ3QKKyAgICAgKiBjb250YWluIGFueSB3aWxkY2FyZHMuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGlzIGluc3RhbmNlIGlzIG5vdCBjYXNlIHNlbnNpdGl2ZSwgdGhlIGZpbGUgbmFtZXMgZ2V0CisgICAgICogdHVybmVkIHRvIGxvd2VyIGNhc2UuPC9wPgorICAgICAqCisgICAgICogPHA+R2V0cyBsYXppbHkgaW5pdGlhbGl6ZWQgb24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YKKyAgICAgKiBpc0luY2x1ZGVkIG9yIGlzRXhjbHVkZWQgYW5kIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbgorICAgICAqIG1ldGhvZCAoY2xlYXJlZCBpbiBjbGVhckNhY2hlcywgYWN0dWFsbHkpLjwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldCBleGNsdWRlTm9uUGF0dGVybnMgPSBuZXcgSGFzaFNldCgpOworCisgICAgLyoqCisgICAgICogQXJyYXkgb2YgYWxsIGluY2x1ZGUgcGF0dGVybnMgdGhhdCBjb250YWluIHdpbGRjYXJkcy4KKyAgICAgKgorICAgICAqIDxwPkdldHMgbGF6aWx5IGluaXRpYWxpemVkIG9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mCisgICAgICogaXNJbmNsdWRlZCBvciBpc0V4Y2x1ZGVkIGFuZCBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgdGhlIHNjYW4KKyAgICAgKiBtZXRob2QgKGNsZWFyZWQgaW4gY2xlYXJDYWNoZXMsIGFjdHVhbGx5KS48L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBpbmNsdWRlUGF0dGVybnM7CisKKyAgICAvKioKKyAgICAgKiBBcnJheSBvZiBhbGwgZXhjbHVkZSBwYXR0ZXJucyB0aGF0IGNvbnRhaW4gd2lsZGNhcmRzLgorICAgICAqCisgICAgICogPHA+R2V0cyBsYXppbHkgaW5pdGlhbGl6ZWQgb24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YKKyAgICAgKiBpc0luY2x1ZGVkIG9yIGlzRXhjbHVkZWQgYW5kIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbgorICAgICAqIG1ldGhvZCAoY2xlYXJlZCBpbiBjbGVhckNhY2hlcywgYWN0dWFsbHkpLjwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIGV4Y2x1ZGVQYXR0ZXJuczsKKworICAgIC8qKgorICAgICAqIEhhdmUgdGhlIG5vbi1wYXR0ZXJuIHNldHMgYW5kIHBhdHRlcm4gYXJyYXlzIGZvciBpbi0gYW5kCisgICAgICogZXhjbHVkZXMgYmVlbiBpbml0aWFsaXplZD8KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYXJlTm9uUGF0dGVyblNldHNSZWFkeSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogU2Nhbm5pbmcgZmxhZy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2Nhbm5pbmcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFNjYW5uaW5nIGxvY2suCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3Qgc2NhbkxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiBTbG93IHNjYW5uaW5nIGZsYWcuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNsb3dTY2FubmluZyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogU2xvdyBzY2FubmluZyBsb2NrLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IHNsb3dTY2FuTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIC8qKgorICAgICAqIEV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIHNjYW4uCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHJpdmF0ZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWxsZWdhbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBEaXJlY3RvcnlTY2FubmVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2hldGhlciBvciBub3QgYSBnaXZlbiBwYXRoIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4KKyAgICAgKiBwYXR0ZXJuIHVwIHRvIHRoZSBmaXJzdCAiKioiLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgbm90IGEgZ2VuZXJhbCBwdXJwb3NlIHRlc3QgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91CisgICAgICogY2FuIGxpdmUgd2l0aCBmYWxzZSBwb3NpdGl2ZXMuIEZvciBleGFtcGxlLCA8Y29kZT5wYXR0ZXJuPSoqXGE8L2NvZGU+CisgICAgICogYW5kIDxjb2RlPnN0cj1iPC9jb2RlPiB3aWxsIHlpZWxkIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdC4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RyICAgICBUaGUgcGF0aCB0byBtYXRjaCwgYXMgYSBTdHJpbmcuIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gcGF0aCBtYXRjaGVzIHRoZSBzdGFydCBvZiBhIGdpdmVuCisgICAgICogcGF0dGVybiB1cCB0byB0aGUgZmlyc3QgIioqIi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuU3RhcnQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIpIHsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9yVXRpbHMubWF0Y2hQYXR0ZXJuU3RhcnQocGF0dGVybiwgc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gcGF0aCBtYXRjaGVzIHRoZSBzdGFydCBvZiBhIGdpdmVuCisgICAgICogcGF0dGVybiB1cCB0byB0aGUgZmlyc3QgIioqIi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIG5vdCBhIGdlbmVyYWwgcHVycG9zZSB0ZXN0IGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdQorICAgICAqIGNhbiBsaXZlIHdpdGggZmFsc2UgcG9zaXRpdmVzLiBGb3IgZXhhbXBsZSwgPGNvZGU+cGF0dGVybj0qKlxhPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5zdHI9YjwvY29kZT4gd2lsbCB5aWVsZCA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QuIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHN0ciAgICAgVGhlIHBhdGggdG8gbWF0Y2gsIGFzIGEgU3RyaW5nLiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgV2hldGhlciBvciBub3QgbWF0Y2hpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzZW5zaXRpdmVseS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgYSBnaXZlbiBwYXRoIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4KKyAgICAgKiBwYXR0ZXJuIHVwIHRvIHRoZSBmaXJzdCAiKioiLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtYXRjaFBhdHRlcm5TdGFydChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9yVXRpbHMubWF0Y2hQYXR0ZXJuU3RhcnQocGF0dGVybiwgc3RyLCBpc0Nhc2VTZW5zaXRpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2hldGhlciBvciBub3QgYSBnaXZlbiBwYXRoIG1hdGNoZXMgYSBnaXZlbiBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdC4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RyICAgICBUaGUgcGF0aCB0byBtYXRjaCwgYXMgYSBTdHJpbmcuIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgYWdhaW5zdCB0aGUgc3RyaW5nLAorICAgICAqICAgICAgICAgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXRoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyKSB7CisgICAgICAgIHJldHVybiBTZWxlY3RvclV0aWxzLm1hdGNoUGF0aChwYXR0ZXJuLCBzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2hldGhlciBvciBub3QgYSBnaXZlbiBwYXRoIG1hdGNoZXMgYSBnaXZlbiBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdC4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RyICAgICBUaGUgcGF0aCB0byBtYXRjaCwgYXMgYSBTdHJpbmcuIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSBXaGV0aGVyIG9yIG5vdCBtYXRjaGluZyBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNlbnNpdGl2ZWx5LgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIGFnYWluc3QgdGhlIHN0cmluZywKKyAgICAgKiAgICAgICAgIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoUGF0aChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIHJldHVybiBTZWxlY3RvclV0aWxzLm1hdGNoUGF0aChwYXR0ZXJuLCBzdHIsIGlzQ2FzZVNlbnNpdGl2ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aGV0aGVyIG9yIG5vdCBhIHN0cmluZyBtYXRjaGVzIGFnYWluc3QgYSBwYXR0ZXJuLgorICAgICAqIFRoZSBwYXR0ZXJuIG1heSBjb250YWluIHR3byBzcGVjaWFsIGNoYXJhY3RlcnM6PGJyPgorICAgICAqICcqJyBtZWFucyB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVyczxicj4KKyAgICAgKiAnPycgbWVhbnMgb25lIGFuZCBvbmx5IG9uZSBjaGFyYWN0ZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHN0ciAgICAgVGhlIHN0cmluZyB3aGljaCBtdXN0IGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgcGF0dGVybi4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0cmluZyBtYXRjaGVzIGFnYWluc3QgdGhlIHBhdHRlcm4sCisgICAgICogICAgICAgICBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0cikgeworICAgICAgICByZXR1cm4gU2VsZWN0b3JVdGlscy5tYXRjaChwYXR0ZXJuLCBzdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2hldGhlciBvciBub3QgYSBzdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IGEgcGF0dGVybi4KKyAgICAgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiB0d28gc3BlY2lhbCBjaGFyYWN0ZXJzOjxicj4KKyAgICAgKiAnKicgbWVhbnMgemVybyBvciBtb3JlIGNoYXJhY3RlcnM8YnI+CisgICAgICogJz8nIG1lYW5zIG9uZSBhbmQgb25seSBvbmUgY2hhcmFjdGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0LgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzdHIgICAgIFRoZSBzdHJpbmcgd2hpY2ggbXVzdCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHBhdHRlcm4uCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSBXaGV0aGVyIG9yIG5vdCBtYXRjaGluZyBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNlbnNpdGl2ZWx5LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwYXR0ZXJuLAorICAgICAqICAgICAgICAgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIHJldHVybiBTZWxlY3RvclV0aWxzLm1hdGNoKHBhdHRlcm4sIHN0ciwgaXNDYXNlU2Vuc2l0aXZlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBwYXR0ZXJucyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogQHJldHVybiBBbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IGJhc2VkIG9uIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICBjb250ZW50cyBvZiB0aGUgPGNvZGU+ZGVmYXVsdEV4Y2x1ZGVzPC9jb2RlPgorICAgICAqICAgICAgICAgPGNvZGU+VmVjdG9yPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXREZWZhdWx0RXhjbHVkZXMoKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nW10pIGRlZmF1bHRFeGNsdWRlcy50b0FycmF5KG5ldyBTdHJpbmdbZGVmYXVsdEV4Y2x1ZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHBhdHRlcm4gdG8gdGhlIGRlZmF1bHQgZXhjbHVkZXMgdW5sZXNzIGl0IGlzIGFscmVhZHkgYQorICAgICAqIGRlZmF1bHQgZXhjbHVkZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzICAgQSBzdHJpbmcgdG8gYWRkIGFzIGFuIGV4Y2x1ZGUgcGF0dGVybi4KKyAgICAgKiBAcmV0dXJuICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdHJpbmcgd2FzIGFkZGVkOworICAgICAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGFscmVhZHkgZXhpc3RlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFkZERlZmF1bHRFeGNsdWRlKFN0cmluZyBzKSB7CisgICAgICAgIGlmIChkZWZhdWx0RXhjbHVkZXMuaW5kZXhPZihzKSA9PSAtMSkgeworICAgICAgICAgICAgZGVmYXVsdEV4Y2x1ZGVzLmFkZChzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBzdHJpbmcgaWYgaXQgaXMgYSBkZWZhdWx0IGV4Y2x1ZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyAgIFRoZSBzdHJpbmcgdG8gYXR0ZW1wdCB0byByZW1vdmUuCisgICAgICogQHJldHVybiAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5zPC9jb2RlPiB3YXMgYSBkZWZhdWx0CisgICAgICogICAgICAgICAgICBleGNsdWRlIChhbmQgdGh1cyB3YXMgcmVtb3ZlZCk7CisgICAgICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgPGNvZGU+czwvY29kZT4gd2FzIG5vdAorICAgICAqICAgICAgICAgICAgaW4gdGhlIGRlZmF1bHQgZXhjbHVkZXMgbGlzdCB0byBiZWdpbiB3aXRoLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRGVmYXVsdEV4Y2x1ZGUoU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRFeGNsdWRlcy5yZW1vdmUocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR28gYmFjayB0byB0aGUgaGFyZHdpcmVkIGRlZmF1bHQgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0RGVmYXVsdEV4Y2x1ZGVzKCkgeworICAgICAgICBkZWZhdWx0RXhjbHVkZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREVGQVVMVEVYQ0xVREVTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBkZWZhdWx0RXhjbHVkZXMuYWRkKERFRkFVTFRFWENMVURFU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGJlIHNjYW5uZWQuIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGljaCBpcworICAgICAqIHNjYW5uZWQgcmVjdXJzaXZlbHkuIEFsbCAnLycgYW5kICdcJyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCBieQorICAgICAqIDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4sIHNvIHRoZSBzZXBhcmF0b3IgdXNlZCBuZWVkIG5vdCBtYXRjaAorICAgICAqIDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciBUaGUgYmFzZSBkaXJlY3RvcnkgdG8gc2Nhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKFN0cmluZyBiYXNlZGlyKSB7CisgICAgICAgIHNldEJhc2VkaXIoYmFzZWRpciA9PSBudWxsID8gKEZpbGUpIG51bGwKKyAgICAgICAgICAgIDogbmV3IEZpbGUoYmFzZWRpci5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKAorICAgICAgICAgICAgJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gYmUgc2Nhbm5lZC4gVGhpcyBpcyB0aGUgZGlyZWN0b3J5IHdoaWNoIGlzCisgICAgICogc2Nhbm5lZCByZWN1cnNpdmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlZGlyIFRoZSBiYXNlIGRpcmVjdG9yeSBmb3Igc2Nhbm5pbmcuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEJhc2VkaXIoRmlsZSBiYXNlZGlyKSB7CisgICAgICAgIHRoaXMuYmFzZWRpciA9IGJhc2VkaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiYXNlIGRpcmVjdG9yeSB0byBiZSBzY2FubmVkLgorICAgICAqIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGljaCBpcyBzY2FubmVkIHJlY3Vyc2l2ZWx5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gYmUgc2Nhbm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEZpbGUgZ2V0QmFzZWRpcigpIHsKKyAgICAgICAgcmV0dXJuIGJhc2VkaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBvdXQgd2hldGhlciBpbmNsdWRlIGV4Y2x1ZGUgcGF0dGVybnMgYXJlIG1hdGNoZWQgaW4gYQorICAgICAqIGNhc2Ugc2Vuc2l0aXZlIHdheS4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzY2FubmluZyBpcyBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7CisgICAgICAgIHJldHVybiBpc0Nhc2VTZW5zaXRpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgb3Igbm90IGluY2x1ZGUgYW5kIGV4Y2x1ZGUgcGF0dGVybnMgYXJlIG1hdGNoZWQKKyAgICAgKiBpbiBhIGNhc2Ugc2Vuc2l0aXZlIHdheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUgd2hldGhlciBvciBub3QgdGhlIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgcmVnYXJkZWQgYXMgYSBjYXNlIHNlbnNpdGl2ZSBvbmUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCBhIG1pc3NpbmcgYmFzZSBkaXJlY3RvcnkgaXMgYW4gZXJyb3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvck9uTWlzc2luZ0RpciB3aGV0aGVyIG9yIG5vdCBhIG1pc3NpbmcgYmFzZSBkaXJlY3RvcnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVycm9yCisgICAgICogQHNpbmNlIEFudCAxLjcuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yT25NaXNzaW5nRGlyKGJvb2xlYW4gZXJyb3JPbk1pc3NpbmdEaXIpIHsKKyAgICAgICAgdGhpcy5lcnJvck9uTWlzc2luZ0RpciA9IGVycm9yT25NaXNzaW5nRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB3aGV0aGVyIG9yIG5vdCBhIERpcmVjdG9yeVNjYW5uZXIgZm9sbG93cyBzeW1ib2xpYyBsaW5rcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgc3ltYm9saWMgbGlua3Mgc2hvdWxkIGJlIGZvbGxvd2VkLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGb2xsb3dTeW1saW5rcygpIHsKKyAgICAgICAgcmV0dXJuIGZvbGxvd1N5bWxpbmtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIG9yIG5vdCBzeW1ib2xpYyBsaW5rcyBzaG91bGQgYmUgZm9sbG93ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9sbG93U3ltbGlua3Mgd2hldGhlciBvciBub3Qgc3ltYm9saWMgbGlua3Mgc2hvdWxkIGJlIGZvbGxvd2VkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRGb2xsb3dTeW1saW5rcyhib29sZWFuIGZvbGxvd1N5bWxpbmtzKSB7CisgICAgICAgIHRoaXMuZm9sbG93U3ltbGlua3MgPSBmb2xsb3dTeW1saW5rczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxpc3Qgb2YgaW5jbHVkZSBwYXR0ZXJucyB0byB1c2UuIEFsbCAnLycgYW5kICdcJyBjaGFyYWN0ZXJzCisgICAgICogYXJlIHJlcGxhY2VkIGJ5IDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4sIHNvIHRoZSBzZXBhcmF0b3IgdXNlZAorICAgICAqIG5lZWQgbm90IG1hdGNoIDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uCisgICAgICogPHA+CisgICAgICogV2hlbiBhIHBhdHRlcm4gZW5kcyB3aXRoIGEgJy8nIG9yICdcJywgIioqIiBpcyBhcHBlbmRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlcyBBIGxpc3Qgb2YgaW5jbHVkZSBwYXR0ZXJucy4KKyAgICAgKiAgICAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbmRpY2F0aW5nIHRoYXQgYWxsIGZpbGVzCisgICAgICogICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpbmNsdWRlZC4gSWYgYSBub24tPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgbGlzdCBpcyBnaXZlbiwgYWxsIGVsZW1lbnRzIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgbm9uLTxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmdbXSBpbmNsdWRlcykgeworICAgICAgICBpZiAoaW5jbHVkZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5pbmNsdWRlcyA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gbmV3IFN0cmluZ1tpbmNsdWRlcy5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRoaXMuaW5jbHVkZXNbaV0gPSBub3JtYWxpemVQYXR0ZXJuKGluY2x1ZGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbGlzdCBvZiBleGNsdWRlIHBhdHRlcm5zIHRvIHVzZS4gQWxsICcvJyBhbmQgJ1wnIGNoYXJhY3RlcnMKKyAgICAgKiBhcmUgcmVwbGFjZWQgYnkgPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPiwgc28gdGhlIHNlcGFyYXRvciB1c2VkCisgICAgICogbmVlZCBub3QgbWF0Y2ggPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIGEgcGF0dGVybiBlbmRzIHdpdGggYSAnLycgb3IgJ1wnLCAiKioiIGlzIGFwcGVuZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2x1ZGVzIEEgbGlzdCBvZiBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqICAgICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluZGljYXRpbmcgdGhhdCBubyBmaWxlcworICAgICAqICAgICAgICAgICAgICAgICBzaG91bGQgYmUgZXhjbHVkZWQuIElmIGEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IGxpc3QgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgZ2l2ZW4sIGFsbCBlbGVtZW50cyBtdXN0IGJlIG5vbi08Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nW10gZXhjbHVkZXMpIHsKKyAgICAgICAgaWYgKGV4Y2x1ZGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZXhjbHVkZXMgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5leGNsdWRlcyA9IG5ldyBTdHJpbmdbZXhjbHVkZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzW2ldID0gbm9ybWFsaXplUGF0dGVybihleGNsdWRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdG8gdGhlIGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucyB0byB1c2UuIEFsbCAnLycgYW5kICdcJworICAgICAqIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5IDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4sIHNvCisgICAgICogdGhlIHNlcGFyYXRvciB1c2VkIG5lZWQgbm90IG1hdGNoIDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uCisgICAgICogPHA+CisgICAgICogV2hlbiBhIHBhdHRlcm4gZW5kcyB3aXRoIGEgJy8nIG9yICdcJywgIioqIiBpcyBhcHBlbmRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsdWRlcyBBIGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKiAgICAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbiB3aGljaCBjYXNlIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBleGNsdWRlIHBhdHRlcm5zIGRvbid0IGdldCBjaGFuZ2VkIGF0IGFsbC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRXhjbHVkZXMoU3RyaW5nW10gZXhjbHVkZXMpIHsKKyAgICAgICAgaWYgKGV4Y2x1ZGVzICE9IG51bGwgJiYgZXhjbHVkZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZXMgIT0gbnVsbCAmJiB0aGlzLmV4Y2x1ZGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSB0bXAgPSBuZXcgU3RyaW5nW2V4Y2x1ZGVzLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmV4Y2x1ZGVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLmV4Y2x1ZGVzLCAwLCB0bXAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0bXBbdGhpcy5leGNsdWRlcy5sZW5ndGggKyBpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVQYXR0ZXJuKGV4Y2x1ZGVzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlcyA9IHRtcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0RXhjbHVkZXMoZXhjbHVkZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsICcvJyBhbmQgJ1wnIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5CisgICAgICogPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPiwgc28gdGhlIHNlcGFyYXRvciB1c2VkIG5lZWQgbm90CisgICAgICogbWF0Y2ggPGNvZGU+RmlsZS5zZXBhcmF0b3JDaGFyPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPiBXaGVuIGEgcGF0dGVybiBlbmRzIHdpdGggYSAnLycgb3IgJ1wnLCAiKioiIGlzIGFwcGVuZGVkLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBub3JtYWxpemVQYXR0ZXJuKFN0cmluZyBwKSB7CisgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gcC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKQorICAgICAgICAgICAgLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7CisgICAgICAgICAgICBwYXR0ZXJuICs9ICIqKiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdHRlcm47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZWxlY3RvcnMgdGhhdCB3aWxsIHNlbGVjdCB0aGUgZmlsZWxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3JzIHNwZWNpZmllcyB0aGUgc2VsZWN0b3JzIHRvIGJlIGludm9rZWQgb24gYSBzY2FuLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTZWxlY3RvcnMoRmlsZVNlbGVjdG9yW10gc2VsZWN0b3JzKSB7CisgICAgICAgIHRoaXMuc2VsZWN0b3JzID0gc2VsZWN0b3JzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc2Nhbm5lciBoYXMgaW5jbHVkZWQgYWxsIHRoZSBmaWxlcyBvcgorICAgICAqIGRpcmVjdG9yaWVzIGl0IGhhcyBjb21lIGFjcm9zcyBzbyBmYXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggaGF2ZQorICAgICAqICAgICAgICAgYmVlbiBmb3VuZCBzbyBmYXIgaGF2ZSBiZWVuIGluY2x1ZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0V2ZXJ5dGhpbmdJbmNsdWRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGV2ZXJ5dGhpbmdJbmNsdWRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FuIGZvciBmaWxlcyB3aGljaCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5jbHVkZSBwYXR0ZXJuIGFuZCBkb24ndCBtYXRjaAorICAgICAqIGFueSBleGNsdWRlIHBhdHRlcm5zLiBJZiB0aGVyZSBhcmUgc2VsZWN0b3JzIHRoZW4gdGhlIGZpbGVzIG11c3QgcGFzcworICAgICAqIG11c3RlciB0aGVyZSwgYXMgd2VsbC4gIFNjYW5zIHVuZGVyIGJhc2VkaXIsIGlmIHNldDsgb3RoZXJ3aXNlIHRoZQorICAgICAqIGluY2x1ZGUgcGF0dGVybnMgd2l0aG91dCBsZWFkaW5nIHdpbGRjYXJkcyBzcGVjaWZ5IHRoZSBhYnNvbHV0ZSBwYXRocyBvZgorICAgICAqIHRoZSBmaWxlcyB0aGF0IG1heSBiZSBpbmNsdWRlZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBiYXNlIGRpcmVjdG9yeSB3YXMgc2V0CisgICAgICogICAgICAgICAgICBpbmNvcnJlY3RseSAoaS5lLiBpZiBpdCBkb2Vzbid0IGV4aXN0IG9yIGlzbid0IGEgZGlyZWN0b3J5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzY2FuKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc2NhbkxvY2spIHsKKyAgICAgICAgICAgIGlmIChzY2FubmluZykgeworICAgICAgICAgICAgICAgIHdoaWxlIChzY2FubmluZykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NhbkxvY2sud2FpdCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaWxsZWdhbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGlsbGVnYWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWxsZWdhbCA9IG51bGw7CisgICAgICAgICAgICAgICAgY2xlYXJSZXN1bHRzKCk7CisKKyAgICAgICAgICAgICAgICAvLyBzZXQgaW4vZXhjbHVkZXMgdG8gcmVhc29uYWJsZSBkZWZhdWx0cyBpZiBuZWVkZWQ6CisgICAgICAgICAgICAgICAgYm9vbGVhbiBudWxsSW5jbHVkZXMgPSAoaW5jbHVkZXMgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSBudWxsSW5jbHVkZXMgPyBuZXcgU3RyaW5nW10geyIqKiJ9IDogaW5jbHVkZXM7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBudWxsRXhjbHVkZXMgPSAoZXhjbHVkZXMgPT0gbnVsbCk7CisgICAgICAgICAgICAgICAgZXhjbHVkZXMgPSBudWxsRXhjbHVkZXMgPyBuZXcgU3RyaW5nWzBdIDogZXhjbHVkZXM7CisKKyAgICAgICAgICAgICAgICBpZiAoYmFzZWRpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGJhc2VkaXIgYW5kIG5vIGluY2x1ZGVzLCBub3RoaW5nIHRvIGRvOgorICAgICAgICAgICAgICAgICAgICBpZiAobnVsbEluY2x1ZGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvck9uTWlzc2luZ0RpcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsbGVnYWwgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZWRpciAiICsgYmFzZWRpciArICIgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyAtIGJhc2VkaXIgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlsbGVnYWwgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJiYXNlZGlyICIgKyBiYXNlZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlsbGVnYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaWxsZWdhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlZCgiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWQoIiIsIGJhc2VkaXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyc0luY2x1ZGVkLmFkZEVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzRGVzZWxlY3RlZC5hZGRFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcnNFeGNsdWRlZC5hZGRFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRpcnNOb3RJbmNsdWRlZC5hZGRFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hlY2tJbmNsdWRlUGF0dGVybnMoKTsKKyAgICAgICAgICAgICAgICBjbGVhckNhY2hlcygpOworICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gbnVsbEluY2x1ZGVzID8gbnVsbCA6IGluY2x1ZGVzOworICAgICAgICAgICAgICAgIGV4Y2x1ZGVzID0gbnVsbEV4Y2x1ZGVzID8gbnVsbCA6IGV4Y2x1ZGVzOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzY2FuTG9jaykgeworICAgICAgICAgICAgICAgIHNjYW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2NhbkxvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHJvdXRpbmUgaXMgYWN0dWFsbHkgY2hlY2tpbmcgYWxsIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGluCisgICAgICogb3JkZXIgdG8gYXZvaWQgc2Nhbm5pbmcgZXZlcnl0aGluZyB1bmRlciBiYXNlIGRpci4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja0luY2x1ZGVQYXR0ZXJucygpIHsKKyAgICAgICAgTWFwIG5ld3Jvb3RzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgLy8gcHV0IGluIHRoZSBuZXdyb290cyBtYXAgdGhlIGluY2x1ZGUgcGF0dGVybnMgd2l0aG91dAorICAgICAgICAvLyB3aWxkY2FyZCB0b2tlbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKEZpbGVVdGlscy5pc0Fic29sdXRlUGF0aChpbmNsdWRlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAvL3NraXAgYWJzLiBwYXRocyBub3QgdW5kZXIgYmFzZWRpciwgaWYgc2V0OgorICAgICAgICAgICAgICAgIGlmIChiYXNlZGlyICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgIVNlbGVjdG9yVXRpbHMubWF0Y2hQYXR0ZXJuU3RhcnQoaW5jbHVkZXNbaV0sCisgICAgICAgICAgICAgICAgICAgIGJhc2VkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGlzQ2FzZVNlbnNpdGl2ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJhc2VkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vc2tpcCBub24tYWJzLiBwYXRocyBpZiBiYXNlZGlyID09IG51bGw6CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdyb290cy5wdXQoU2VsZWN0b3JVdGlscy5ydHJpbVdpbGRjYXJkVG9rZW5zKAorICAgICAgICAgICAgICAgIGluY2x1ZGVzW2ldKSwgaW5jbHVkZXNbaV0pOworICAgICAgICB9CisgICAgICAgIGlmIChuZXdyb290cy5jb250YWluc0tleSgiIikgJiYgYmFzZWRpciAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gc2NhbiBldmVyeXRoaW5nIGFueXdheQorICAgICAgICAgICAgc2NhbmRpcihiYXNlZGlyLCAiIiwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBvbmx5IHNjYW4gZGlyZWN0b3JpZXMgdGhhdCBjYW4gaW5jbHVkZSBtYXRjaGVkIGZpbGVzIG9yCisgICAgICAgICAgICAvLyBkaXJlY3RvcmllcworICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBuZXdyb290cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgIEZpbGUgY2Fub25CYXNlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChiYXNlZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYW5vbkJhc2UgPSBiYXNlZGlyLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRlbGVtZW50ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgaWYgKGJhc2VkaXIgPT0gbnVsbCAmJiAhRmlsZVV0aWxzLmlzQWJzb2x1dGVQYXRoKGN1cnJlbnRlbGVtZW50KSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFscGF0dGVybiA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgRmlsZSBteWZpbGUgPSBuZXcgRmlsZShiYXNlZGlyLCBjdXJyZW50ZWxlbWVudCk7CisKKyAgICAgICAgICAgICAgICBpZiAobXlmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG1heSBiZSBvbiBhIGNhc2UgaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW0uICBXZSB3YW50CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN1bHRzIHRvIHNob3cgd2hhdCdzIHJlYWxseSBvbiB0aGUgZGlzaywgc28KKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBkb3VibGUgY2hlY2suCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IChiYXNlZGlyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBteWZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKGNhbm9uQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteWZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGF0aC5lcXVhbHMoY3VycmVudGVsZW1lbnQpIHx8IE9OX1ZNUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ZmlsZSA9IGZpbmRGaWxlKGJhc2VkaXIsIGN1cnJlbnRlbGVtZW50LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlmaWxlICE9IG51bGwgJiYgYmFzZWRpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRlbGVtZW50ID0gRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXIsIG15ZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG15ZmlsZSA9PSBudWxsIHx8ICFteWZpbGUuZXhpc3RzKCkpICYmICFpc0Nhc2VTZW5zaXRpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBmaW5kRmlsZShiYXNlZGlyLCBjdXJyZW50ZWxlbWVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkYXB0IGN1cnJlbnRlbGVtZW50IHRvIHRoZSBjYXNlIHdlJ3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGVsZW1lbnQgPSAoYmFzZWRpciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZi5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChiYXNlZGlyLCBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ZmlsZSA9IGY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG15ZmlsZSAhPSBudWxsICYmIG15ZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbGxvd1N5bWxpbmtzCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1N5bWxpbmsoYmFzZWRpciwgY3VycmVudGVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXlmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKGN1cnJlbnRlbGVtZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGN1cnJlbnRlbGVtZW50Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZERpcihjdXJyZW50ZWxlbWVudCwgbXlmaWxlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ZWxlbWVudC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRlbGVtZW50LmNoYXJBdChjdXJyZW50ZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBGaWxlLnNlcGFyYXRvckNoYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRlbGVtZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ZWxlbWVudCArIEZpbGUuc2VwYXJhdG9yQ2hhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZGlyKG15ZmlsZSwgY3VycmVudGVsZW1lbnQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlZCA9IGlzQ2FzZVNlbnNpdGl2ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvcmlnaW5hbHBhdHRlcm4uZXF1YWxzKGN1cnJlbnRlbGVtZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3JpZ2luYWxwYXR0ZXJuLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudEZvckluY2x1ZGVkRmlsZShjdXJyZW50ZWxlbWVudCwgbXlmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSByZXN1bHQgY2FjaGVzIGZvciBhIHNjYW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyUmVzdWx0cygpIHsKKyAgICAgICAgZmlsZXNJbmNsdWRlZCAgICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZmlsZXNOb3RJbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZmlsZXNFeGNsdWRlZCAgICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZmlsZXNEZXNlbGVjdGVkICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZGlyc0luY2x1ZGVkICAgICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZGlyc05vdEluY2x1ZGVkICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZGlyc0V4Y2x1ZGVkICAgICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZGlyc0Rlc2VsZWN0ZWQgICA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZXZlcnl0aGluZ0luY2x1ZGVkID0gKGJhc2VkaXIgIT0gbnVsbCk7CisgICAgICAgIHNjYW5uZWREaXJzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG9wIGxldmVsIGludm9jYXRpb24gZm9yIGEgc2xvdyBzY2FuLiBBIHNsb3cgc2NhbiBidWlsZHMgdXAgYSBmdWxsCisgICAgICogbGlzdCBvZiBleGNsdWRlZC9pbmNsdWRlZCBmaWxlcy9kaXJlY3Rvcmllcywgd2hlcmVhcyBhIGZhc3Qgc2NhbgorICAgICAqIHdpbGwgb25seSBoYXZlIGZ1bGwgcmVzdWx0cyBmb3IgaW5jbHVkZWQgZmlsZXMsIGFzIGl0IGlnbm9yZXMKKyAgICAgKiBkaXJlY3RvcmllcyB3aGljaCBjYW4ndCBwb3NzaWJseSBob2xkIGFueSBpbmNsdWRlZCBmaWxlcy9kaXJlY3Rvcmllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXR1cm5zIGltbWVkaWF0ZWx5IGlmIGEgc2xvdyBzY2FuIGhhcyBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNsb3dTY2FuKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNsb3dTY2FuTG9jaykgeworICAgICAgICAgICAgaWYgKGhhdmVTbG93UmVzdWx0cykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzbG93U2Nhbm5pbmcpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc2xvd1NjYW5uaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbG93U2NhbkxvY2sud2FpdCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbXB0eQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsb3dTY2FubmluZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworCisgICAgICAgICAgICAgICAgLy8gc2V0IGluL2V4Y2x1ZGVzIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMgaWYgbmVlZGVkOgorICAgICAgICAgICAgICAgIGJvb2xlYW4gbnVsbEluY2x1ZGVzID0gKGluY2x1ZGVzID09IG51bGwpOworICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gbnVsbEluY2x1ZGVzID8gbmV3IFN0cmluZ1tdIHsiKioifSA6IGluY2x1ZGVzOworICAgICAgICAgICAgICAgIGJvb2xlYW4gbnVsbEV4Y2x1ZGVzID0gKGV4Y2x1ZGVzID09IG51bGwpOworICAgICAgICAgICAgICAgIGV4Y2x1ZGVzID0gbnVsbEV4Y2x1ZGVzID8gbmV3IFN0cmluZ1swXSA6IGV4Y2x1ZGVzOworCisgICAgICAgICAgICAgICAgU3RyaW5nW10gZXhjbCA9IG5ldyBTdHJpbmdbZGlyc0V4Y2x1ZGVkLnNpemUoKV07CisgICAgICAgICAgICAgICAgZGlyc0V4Y2x1ZGVkLmNvcHlJbnRvKGV4Y2wpOworCisgICAgICAgICAgICAgICAgU3RyaW5nW10gbm90SW5jbCA9IG5ldyBTdHJpbmdbZGlyc05vdEluY2x1ZGVkLnNpemUoKV07CisgICAgICAgICAgICAgICAgZGlyc05vdEluY2x1ZGVkLmNvcHlJbnRvKG5vdEluY2wpOworCisgICAgICAgICAgICAgICAgcHJvY2Vzc1Nsb3dTY2FuKGV4Y2wpOworICAgICAgICAgICAgICAgIHByb2Nlc3NTbG93U2Nhbihub3RJbmNsKTsKKyAgICAgICAgICAgICAgICBjbGVhckNhY2hlcygpOworICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gbnVsbEluY2x1ZGVzID8gbnVsbCA6IGluY2x1ZGVzOworICAgICAgICAgICAgICAgIGV4Y2x1ZGVzID0gbnVsbEV4Y2x1ZGVzID8gbnVsbCA6IGV4Y2x1ZGVzOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzbG93U2NhbkxvY2spIHsKKyAgICAgICAgICAgICAgICBoYXZlU2xvd1Jlc3VsdHMgPSB0cnVlOworICAgICAgICAgICAgICAgIHNsb3dTY2FubmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNsb3dTY2FuTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU2xvd1NjYW4oU3RyaW5nW10gYXJyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWNvdWxkSG9sZEluY2x1ZGVkKGFycltpXSkpIHsKKyAgICAgICAgICAgICAgICBzY2FuZGlyKG5ldyBGaWxlKGJhc2VkaXIsIGFycltpXSksCisgICAgICAgICAgICAgICAgICAgICAgICBhcnJbaV0gKyBGaWxlLnNlcGFyYXRvciwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuIEZvdW5kIGZpbGVzIGFuZAorICAgICAqIGRpcmVjdG9yaWVzIGFyZSBwbGFjZWQgaW4gdGhlaXIgcmVzcGVjdGl2ZSBjb2xsZWN0aW9ucywgYmFzZWQgb24gdGhlCisgICAgICogbWF0Y2hpbmcgb2YgaW5jbHVkZXMsIGV4Y2x1ZGVzLCBhbmQgdGhlIHNlbGVjdG9ycy4gIFdoZW4gYSBkaXJlY3RvcnkKKyAgICAgKiBpcyBmb3VuZCwgaXQgaXMgc2Nhbm5lZCByZWN1cnNpdmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgICBUaGUgZGlyZWN0b3J5IHRvIHNjYW4uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2cGF0aCBUaGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkgKG5lZWRlZCB0bworICAgICAqICAgICAgICAgICAgICBwcmV2ZW50IHByb2JsZW1zIHdpdGggYW4gYWJzb2x1dGUgcGF0aCB3aGVuIHVzaW5nCisgICAgICogICAgICAgICAgICAgIGRpcikuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmYXN0ICBXaGV0aGVyIG9yIG5vdCB0aGlzIGNhbGwgaXMgcGFydCBvZiBhIGZhc3Qgc2Nhbi4KKyAgICAgKgorICAgICAqIEBzZWUgI2ZpbGVzSW5jbHVkZWQKKyAgICAgKiBAc2VlICNmaWxlc05vdEluY2x1ZGVkCisgICAgICogQHNlZSAjZmlsZXNFeGNsdWRlZAorICAgICAqIEBzZWUgI2RpcnNJbmNsdWRlZAorICAgICAqIEBzZWUgI2RpcnNOb3RJbmNsdWRlZAorICAgICAqIEBzZWUgI2RpcnNFeGNsdWRlZAorICAgICAqIEBzZWUgI3Nsb3dTY2FuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2NhbmRpcihGaWxlIGRpciwgU3RyaW5nIHZwYXRoLCBib29sZWFuIGZhc3QpIHsKKyAgICAgICAgaWYgKGRpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRpciBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIG5ld2ZpbGVzID0gZGlyLmxpc3QoKTsKKyAgICAgICAgaWYgKG5ld2ZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGRpciArICIgZG9lc24ndCBleGlzdC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGRpciArICIgaXMgbm90IGEgZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIklPIGVycm9yIHNjYW5uaW5nIGRpcmVjdG9yeSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArICInIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2NhbmRpcihkaXIsIHZwYXRoLCBmYXN0LCBuZXdmaWxlcyk7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBzY2FuZGlyKEZpbGUgZGlyLCBTdHJpbmcgdnBhdGgsIGJvb2xlYW4gZmFzdCwgU3RyaW5nW10gbmV3ZmlsZXMpIHsKKyAgICAgICAgLy8gYXZvaWQgZG91YmxlIHNjYW5uaW5nIG9mIGRpcmVjdG9yaWVzLCBjYW4gb25seSBoYXBwZW4gaW4gZmFzdCBtb2RlCisgICAgICAgIGlmIChmYXN0ICYmIGhhc0JlZW5TY2FubmVkKHZwYXRoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghZm9sbG93U3ltbGlua3MpIHsKKyAgICAgICAgICAgIFZlY3RvciBub0xpbmtzID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChGSUxFX1VUSUxTLmlzU3ltYm9saWNMaW5rKGRpciwgbmV3ZmlsZXNbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHZwYXRoICsgbmV3ZmlsZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIG5ld2ZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlLmlzRGlyZWN0b3J5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRpcnNFeGNsdWRlZCA6IGZpbGVzRXhjbHVkZWQpLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub0xpbmtzLmFkZEVsZW1lbnQobmV3ZmlsZXNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSU9FeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGNoZWNraW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImZvciBsaW5rcywgY291bGRuJ3QgZ2V0IGNhbm9uaWNhbCBwYXRoISI7CisgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgY2F1Z2h0IGFuZCByZWRpcmVjdGVkIHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtc2cpOworICAgICAgICAgICAgICAgICAgICBub0xpbmtzLmFkZEVsZW1lbnQobmV3ZmlsZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld2ZpbGVzID0gKFN0cmluZ1tdKSAobm9MaW5rcy50b0FycmF5KG5ldyBTdHJpbmdbbm9MaW5rcy5zaXplKCldKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB2cGF0aCArIG5ld2ZpbGVzW2ldOworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBuZXdmaWxlc1tpXSk7CisgICAgICAgICAgICBTdHJpbmdbXSBjaGlsZHJlbiA9IGZpbGUubGlzdCgpOworICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsgLy8gcHJvYmFibHkgZmlsZQorICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZEZpbGUobmFtZSwgZmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlcnl0aGluZ0luY2x1ZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzTm90SW5jbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBkaXIKKyAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlZChuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBhY2NvdW50Rm9ySW5jbHVkZWREaXIobmFtZSwgZmlsZSwgZmFzdCwgY2hpbGRyZW4pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmdJbmNsdWRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBkaXJzTm90SW5jbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3QgJiYgY291bGRIb2xkSW5jbHVkZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIoZmlsZSwgbmFtZSArIEZpbGUuc2VwYXJhdG9yLCBmYXN0LCBjaGlsZHJlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFmYXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIoZmlsZSwgbmFtZSArIEZpbGUuc2VwYXJhdG9yLCBmYXN0LCBjaGlsZHJlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBpbmNsdWRlZCBmaWxlLgorICAgICAqIEBwYXJhbSBuYW1lICBwYXRoIG9mIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIEZpbGVTZXQuCisgICAgICogQHBhcmFtIGZpbGUgIGluY2x1ZGVkIEZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFjY291bnRGb3JJbmNsdWRlZEZpbGUoU3RyaW5nIG5hbWUsIEZpbGUgZmlsZSkgeworICAgICAgICBwcm9jZXNzSW5jbHVkZWQobmFtZSwgZmlsZSwgZmlsZXNJbmNsdWRlZCwgZmlsZXNFeGNsdWRlZCwgZmlsZXNEZXNlbGVjdGVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGluY2x1ZGVkIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gbmFtZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBvZgorICAgICAqICAgICAgICAgICAgIHRoZSBGaWxlU2V0LgorICAgICAqIEBwYXJhbSBmaWxlIGRpcmVjdG9yeSBhcyBGaWxlLgorICAgICAqIEBwYXJhbSBmYXN0IHdoZXRoZXIgdG8gcGVyZm9ybSBmYXN0IHNjYW5zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhY2NvdW50Rm9ySW5jbHVkZWREaXIoU3RyaW5nIG5hbWUsIEZpbGUgZmlsZSwgYm9vbGVhbiBmYXN0KSB7CisgICAgICAgIHByb2Nlc3NJbmNsdWRlZChuYW1lLCBmaWxlLCBkaXJzSW5jbHVkZWQsIGRpcnNFeGNsdWRlZCwgZGlyc0Rlc2VsZWN0ZWQpOworICAgICAgICBpZiAoZmFzdCAmJiBjb3VsZEhvbGRJbmNsdWRlZChuYW1lKSAmJiAhY29udGVudHNFeGNsdWRlZChuYW1lKSkgeworICAgICAgICAgICAgc2NhbmRpcihmaWxlLCBuYW1lICsgRmlsZS5zZXBhcmF0b3IsIGZhc3QpOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBhY2NvdW50Rm9ySW5jbHVkZWREaXIoU3RyaW5nIG5hbWUsIEZpbGUgZmlsZSwgYm9vbGVhbiBmYXN0LCBTdHJpbmdbXSBjaGlsZHJlbikgeworICAgICAgICBwcm9jZXNzSW5jbHVkZWQobmFtZSwgZmlsZSwgZGlyc0luY2x1ZGVkLCBkaXJzRXhjbHVkZWQsIGRpcnNEZXNlbGVjdGVkKTsKKyAgICAgICAgaWYgKGZhc3QgJiYgY291bGRIb2xkSW5jbHVkZWQobmFtZSkgJiYgIWNvbnRlbnRzRXhjbHVkZWQobmFtZSkpIHsKKyAgICAgICAgICAgIHNjYW5kaXIoZmlsZSwgbmFtZSArIEZpbGUuc2VwYXJhdG9yLCBmYXN0LCBjaGlsZHJlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0luY2x1ZGVkKFN0cmluZyBuYW1lLCBGaWxlIGZpbGUsIFZlY3RvciBpbmMsIFZlY3RvciBleGMsIFZlY3RvciBkZXMpIHsKKworICAgICAgICBpZiAoaW5jLmNvbnRhaW5zKG5hbWUpIHx8IGV4Yy5jb250YWlucyhuYW1lKSB8fCBkZXMuY29udGFpbnMobmFtZSkpIHsgcmV0dXJuOyB9CisKKyAgICAgICAgYm9vbGVhbiBpbmNsdWRlZCA9IGZhbHNlOworICAgICAgICBpZiAoaXNFeGNsdWRlZChuYW1lKSkgeworICAgICAgICAgICAgZXhjLmFkZChuYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1NlbGVjdGVkKG5hbWUsIGZpbGUpKSB7CisgICAgICAgICAgICBpbmNsdWRlZCA9IHRydWU7CisgICAgICAgICAgICBpbmMuYWRkKG5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzLmFkZChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBldmVyeXRoaW5nSW5jbHVkZWQgJj0gaW5jbHVkZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aGV0aGVyIG9yIG5vdCBhIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZSBpbmNsdWRlCisgICAgICogcGF0dGVybi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIG1hdGNoLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZQorICAgICAqICAgICAgICAgaW5jbHVkZSBwYXR0ZXJuLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZW5zdXJlTm9uUGF0dGVyblNldHNSZWFkeSgpOworCisgICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUoKQorICAgICAgICAgICAgPyBpbmNsdWRlTm9uUGF0dGVybnMuY29udGFpbnMobmFtZSkKKyAgICAgICAgICAgIDogaW5jbHVkZU5vblBhdHRlcm5zLmNvbnRhaW5zKG5hbWUudG9VcHBlckNhc2UoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZVBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWF0Y2hQYXRoKGluY2x1ZGVQYXR0ZXJuc1tpXSwgbmFtZSwgaXNDYXNlU2Vuc2l0aXZlKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2hldGhlciBvciBub3QgYSBuYW1lIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIGF0IGxlYXN0IG9uZSBpbmNsdWRlCisgICAgICogcGF0dGVybi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIG1hdGNoLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBzdGFydCBvZiBhdAorICAgICAqICAgICAgICAgbGVhc3Qgb25lIGluY2x1ZGUgcGF0dGVybiwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb3VsZEhvbGRJbmNsdWRlZChTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWF0Y2hQYXR0ZXJuU3RhcnQoaW5jbHVkZXNbaV0sIG5hbWUsIGlzQ2FzZVNlbnNpdGl2ZSgpKQorICAgICAgICAgICAgICAgICYmIGlzTW9yZVBvd2VyZnVsVGhhbkV4Y2x1ZGVzKG5hbWUsIGluY2x1ZGVzW2ldKQorICAgICAgICAgICAgICAgICYmIGlzRGVlcGVyKGluY2x1ZGVzW2ldLCBuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCBhIHBhdHRlcm4gc3BlY2lmaWVzIGZpbGVzIGRlZXBlcgorICAgICAqIHRoYW4gdGhlIGxldmVsIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KKyAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiB0byBjaGVjay4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHBhdHRlcm4gaXMgZGVlcGVyIHRoYW4gdGhlIG5hbWUuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZXBlcihTdHJpbmcgcGF0dGVybiwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgVmVjdG9yIHAgPSBTZWxlY3RvclV0aWxzLnRva2VuaXplUGF0aChwYXR0ZXJuKTsKKyAgICAgICAgVmVjdG9yIG4gPSBTZWxlY3RvclV0aWxzLnRva2VuaXplUGF0aChuYW1lKTsKKyAgICAgICAgcmV0dXJuIHAuY29udGFpbnMoIioqIikgfHwgcC5zaXplKCkgPiBuLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgRmluZCBvdXQgd2hldGhlciBvbmUgcGFydGljdWxhciBpbmNsdWRlIHBhdHRlcm4gaXMgbW9yZSBwb3dlcmZ1bAorICAgICAqICB0aGFuIGFsbCB0aGUgZXhjbHVkZXMuCisgICAgICogIE5vdGU6ICB0aGUgcG93ZXIgY29tcGFyaXNvbiBpcyBiYXNlZCBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbmNsdWRlIHBhdHRlcm4KKyAgICAgKiAgYW5kIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zIHdpdGhvdXQgdGhlIHdpbGRjYXJkcy4KKyAgICAgKiAgSWRlYWxseSB0aGUgY29tcGFyaXNvbiBzaG91bGQgYmUgZG9uZSBiYXNlZCBvbiB0aGUgZGVwdGgKKyAgICAgKiAgb2YgdGhlIG1hdGNoOyB0aGF0IGlzIHRvIHNheSBob3cgbWFueSBmaWxlIHNlcGFyYXRvcnMgaGF2ZSBiZWVuIG1hdGNoZWQKKyAgICAgKiAgYmVmb3JlIHRoZSBmaXJzdCAqKiBvciB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLgorICAgICAqCisgICAgICogIElNUE9SVEFOVCA6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBmYWxzZSAid2l0aCBjYXJlIi4KKyAgICAgKgorICAgICAqICBAcGFyYW0gbmFtZSB0aGUgcmVsYXRpdmUgcGF0aCB0byB0ZXN0LgorICAgICAqICBAcGFyYW0gaW5jbHVkZXBhdHRlcm4gb25lIGluY2x1ZGUgcGF0dGVybi4KKyAgICAgKiAgQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vIGV4Y2x1ZGUgcGF0dGVybiBtb3JlIHBvd2VyZnVsIHRoYW4gdGhpcyBpbmNsdWRlIHBhdHRlcm4uCisgICAgICogIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTW9yZVBvd2VyZnVsVGhhbkV4Y2x1ZGVzKFN0cmluZyBuYW1lLCBTdHJpbmcgaW5jbHVkZXBhdHRlcm4pIHsKKyAgICAgICAgU3RyaW5nIHNvdWdodGV4Y2x1ZGUgPSBuYW1lICsgRmlsZS5zZXBhcmF0b3IgKyAiKioiOworICAgICAgICBmb3IgKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IGV4Y2x1ZGVzLmxlbmd0aDsgY291bnRlcisrKSB7CisgICAgICAgICAgICBpZiAoZXhjbHVkZXNbY291bnRlcl0uZXF1YWxzKHNvdWdodGV4Y2x1ZGUpKSAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IG11c3QgYmUgZXhjbHVkZWQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGRpcmVjdG9yeSBuYW1lIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gd2hldGhlciBhbGwgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkncyBjb250ZW50cyBhcmUgZXhjbHVkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRlbnRzRXhjbHVkZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbmFtZSA9IChuYW1lLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgPyBuYW1lIDogbmFtZSArIEZpbGUuc2VwYXJhdG9yOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgZSA9IGV4Y2x1ZGVzW2ldOworICAgICAgICAgICAgaWYgKGUuZW5kc1dpdGgoIioqIikgJiYgU2VsZWN0b3JVdGlscy5tYXRjaFBhdGgoCisgICAgICAgICAgICAgICAgZS5zdWJzdHJpbmcoMCwgZS5sZW5ndGgoKSAtIDIpLCBuYW1lLCBpc0Nhc2VTZW5zaXRpdmUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aGV0aGVyIG9yIG5vdCBhIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZSBleGNsdWRlCisgICAgICogcGF0dGVybi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIG1hdGNoLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHdoZW4gdGhlIG5hbWUgbWF0Y2hlcyBhZ2FpbnN0IGF0IGxlYXN0IG9uZQorICAgICAqICAgICAgICAgZXhjbHVkZSBwYXR0ZXJuLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZW5zdXJlTm9uUGF0dGVyblNldHNSZWFkeSgpOworCisgICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUoKQorICAgICAgICAgICAgPyBleGNsdWRlTm9uUGF0dGVybnMuY29udGFpbnMobmFtZSkKKyAgICAgICAgICAgIDogZXhjbHVkZU5vblBhdHRlcm5zLmNvbnRhaW5zKG5hbWUudG9VcHBlckNhc2UoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZVBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWF0Y2hQYXRoKGV4Y2x1ZGVQYXR0ZXJuc1tpXSwgbmFtZSwgaXNDYXNlU2Vuc2l0aXZlKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2hldGhlciBhIGZpbGUgc2hvdWxkIGJlIHNlbGVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZpbGVuYW1lIHRvIGNoZWNrIGZvciBzZWxlY3RpbmcuCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGphdmEuaW8uRmlsZSBvYmplY3QgZm9yIHRoaXMgZmlsZW5hbWUuCisgICAgICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gd2hlbiB0aGUgc2VsZWN0b3JzIHNheXMgdGhhdCB0aGUgZmlsZQorICAgICAqICAgICAgICAgc2hvdWxkIG5vdCBiZSBzZWxlY3RlZCwgPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0ZWQoU3RyaW5nIG5hbWUsIEZpbGUgZmlsZSkgeworICAgICAgICBpZiAoc2VsZWN0b3JzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RvcnNbaV0uaXNTZWxlY3RlZChiYXNlZGlyLCBuYW1lLCBmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdoaWNoIG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAqIGluY2x1ZGUgcGF0dGVybnMgYW5kIG5vbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICogICAgICAgICBpbmNsdWRlIHBhdHRlcm5zIGFuZCBub25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0SW5jbHVkZWRGaWxlcygpIHsKKyAgICAgICAgaWYgKGZpbGVzSW5jbHVkZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTXVzdCBjYWxsIHNjYW4oKSBmaXJzdCIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1tmaWxlc0luY2x1ZGVkLnNpemUoKV07CisgICAgICAgIGZpbGVzSW5jbHVkZWQuY29weUludG8oZmlsZXMpOworICAgICAgICBBcnJheXMuc29ydChmaWxlcyk7CisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvdW50IG9mIGluY2x1ZGVkIGZpbGVzLgorICAgICAqIEByZXR1cm4gPGNvZGU+aW50PC9jb2RlPi4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0SW5jbHVkZWRGaWxlc0NvdW50KCkgeworICAgICAgICBpZiAoZmlsZXNJbmNsdWRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNdXN0IGNhbGwgc2NhbigpIGZpcnN0Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVzSW5jbHVkZWQuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdoaWNoIG1hdGNoZWQgbm9uZSBvZiB0aGUgaW5jbHVkZQorICAgICAqIHBhdHRlcm5zLiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGRpcmVjdG9yeS4gVGhpcyBpbnZvbHZlcworICAgICAqIHBlcmZvcm1pbmcgYSBzbG93IHNjYW4gaWYgb25lIGhhcyBub3QgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB3aGljaCBtYXRjaGVkIG5vbmUgb2YgdGhlIGluY2x1ZGUKKyAgICAgKiAgICAgICAgIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHNlZSAjc2xvd1NjYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ1tdIGdldE5vdEluY2x1ZGVkRmlsZXMoKSB7CisgICAgICAgIHNsb3dTY2FuKCk7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1tmaWxlc05vdEluY2x1ZGVkLnNpemUoKV07CisgICAgICAgIGZpbGVzTm90SW5jbHVkZWQuY29weUludG8oZmlsZXMpOworICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICogaW5jbHVkZSBwYXR0ZXJucyBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5LiBUaGlzIGludm9sdmVzCisgICAgICogcGVyZm9ybWluZyBhIHNsb3cgc2NhbiBpZiBvbmUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdoaWNoIG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAqICAgICAgICAgaW5jbHVkZSBwYXR0ZXJucyBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHNlZSAjc2xvd1NjYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ1tdIGdldEV4Y2x1ZGVkRmlsZXMoKSB7CisgICAgICAgIHNsb3dTY2FuKCk7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1tmaWxlc0V4Y2x1ZGVkLnNpemUoKV07CisgICAgICAgIGZpbGVzRXhjbHVkZWQuY29weUludG8oZmlsZXMpOworICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgd2hpY2ggd2VyZSBzZWxlY3RlZCBvdXQgYW5kCisgICAgICogdGhlcmVmb3JlIG5vdCB1bHRpbWF0ZWx5IGluY2x1ZGVkLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5LiBUaGlzIGludm9sdmVzCisgICAgICogcGVyZm9ybWluZyBhIHNsb3cgc2NhbiBpZiBvbmUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY29tcGxldGVkLjwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB3aGljaCB3ZXJlIGRlc2VsZWN0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNzbG93U2NhbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0RGVzZWxlY3RlZEZpbGVzKCkgeworICAgICAgICBzbG93U2NhbigpOworICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbZmlsZXNEZXNlbGVjdGVkLnNpemUoKV07CisgICAgICAgIGZpbGVzRGVzZWxlY3RlZC5jb3B5SW50byhmaWxlcyk7CisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUKKyAgICAgKiBpbmNsdWRlIHBhdHRlcm5zIGFuZCBub25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHdoaWNoIG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAqIGluY2x1ZGUgcGF0dGVybnMgYW5kIG5vbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkgeworICAgICAgICBpZiAoZGlyc0luY2x1ZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk11c3QgY2FsbCBzY2FuKCkgZmlyc3QiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBkaXJlY3RvcmllcyA9IG5ldyBTdHJpbmdbZGlyc0luY2x1ZGVkLnNpemUoKV07CisgICAgICAgIGRpcnNJbmNsdWRlZC5jb3B5SW50byhkaXJlY3Rvcmllcyk7CisgICAgICAgIEFycmF5cy5zb3J0KGRpcmVjdG9yaWVzKTsKKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yaWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY291bnQgb2YgaW5jbHVkZWQgZGlyZWN0b3JpZXMuCisgICAgICogQHJldHVybiA8Y29kZT5pbnQ8L2NvZGU+LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRJbmNsdWRlZERpcnNDb3VudCgpIHsKKyAgICAgICAgaWYgKGRpcnNJbmNsdWRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNdXN0IGNhbGwgc2NhbigpIGZpcnN0Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpcnNJbmNsdWRlZC5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2hlZCBub25lIG9mIHRoZSBpbmNsdWRlCisgICAgICogcGF0dGVybnMuIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5LiBUaGlzIGludm9sdmVzCisgICAgICogcGVyZm9ybWluZyBhIHNsb3cgc2NhbiBpZiBvbmUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHdoaWNoIG1hdGNoZWQgbm9uZSBvZiB0aGUgaW5jbHVkZQorICAgICAqIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHNlZSAjc2xvd1NjYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ1tdIGdldE5vdEluY2x1ZGVkRGlyZWN0b3JpZXMoKSB7CisgICAgICAgIHNsb3dTY2FuKCk7CisgICAgICAgIFN0cmluZ1tdIGRpcmVjdG9yaWVzID0gbmV3IFN0cmluZ1tkaXJzTm90SW5jbHVkZWQuc2l6ZSgpXTsKKyAgICAgICAgZGlyc05vdEluY2x1ZGVkLmNvcHlJbnRvKGRpcmVjdG9yaWVzKTsKKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yaWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHdoaWNoIG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAqIGluY2x1ZGUgcGF0dGVybnMgYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGRpcmVjdG9yeS4gVGhpcyBpbnZvbHZlcworICAgICAqIHBlcmZvcm1pbmcgYSBzbG93IHNjYW4gaWYgb25lIGhhcyBub3QgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUKKyAgICAgKiBpbmNsdWRlIHBhdHRlcm5zIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAc2VlICNzbG93U2NhbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0RXhjbHVkZWREaXJlY3RvcmllcygpIHsKKyAgICAgICAgc2xvd1NjYW4oKTsKKyAgICAgICAgU3RyaW5nW10gZGlyZWN0b3JpZXMgPSBuZXcgU3RyaW5nW2RpcnNFeGNsdWRlZC5zaXplKCldOworICAgICAgICBkaXJzRXhjbHVkZWQuY29weUludG8oZGlyZWN0b3JpZXMpOworICAgICAgICByZXR1cm4gZGlyZWN0b3JpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgd2hpY2ggd2VyZSBzZWxlY3RlZCBvdXQgYW5kCisgICAgICogdGhlcmVmb3JlIG5vdCB1bHRpbWF0ZWx5IGluY2x1ZGVkLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5LiBUaGlzIGludm9sdmVzCisgICAgICogcGVyZm9ybWluZyBhIHNsb3cgc2NhbiBpZiBvbmUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY29tcGxldGVkLjwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB3aGljaCB3ZXJlIGRlc2VsZWN0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNzbG93U2NhbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0RGVzZWxlY3RlZERpcmVjdG9yaWVzKCkgeworICAgICAgICBzbG93U2NhbigpOworICAgICAgICBTdHJpbmdbXSBkaXJlY3RvcmllcyA9IG5ldyBTdHJpbmdbZGlyc0Rlc2VsZWN0ZWQuc2l6ZSgpXTsKKyAgICAgICAgZGlyc0Rlc2VsZWN0ZWQuY29weUludG8oZGlyZWN0b3JpZXMpOworICAgICAgICByZXR1cm4gZGlyZWN0b3JpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGRlZmF1bHQgZXhjbHVzaW9ucyB0byB0aGUgY3VycmVudCBleGNsdXNpb25zIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRGVmYXVsdEV4Y2x1ZGVzKCkgeworICAgICAgICBpbnQgZXhjbHVkZXNMZW5ndGggPSBleGNsdWRlcyA9PSBudWxsID8gMCA6IGV4Y2x1ZGVzLmxlbmd0aDsKKyAgICAgICAgU3RyaW5nW10gbmV3RXhjbHVkZXM7CisgICAgICAgIG5ld0V4Y2x1ZGVzID0gbmV3IFN0cmluZ1tleGNsdWRlc0xlbmd0aCArIGRlZmF1bHRFeGNsdWRlcy5zaXplKCldOworICAgICAgICBpZiAoZXhjbHVkZXNMZW5ndGggPiAwKSB7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGV4Y2x1ZGVzLCAwLCBuZXdFeGNsdWRlcywgMCwgZXhjbHVkZXNMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGRlZmF1bHRFeGNsdWRlc1RlbXAgPSBnZXREZWZhdWx0RXhjbHVkZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0RXhjbHVkZXNUZW1wLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBuZXdFeGNsdWRlc1tpICsgZXhjbHVkZXNMZW5ndGhdID0KKyAgICAgICAgICAgICAgICBkZWZhdWx0RXhjbHVkZXNUZW1wW2ldLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpCisgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgfQorICAgICAgICBleGNsdWRlcyA9IG5ld0V4Y2x1ZGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZWQgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIG5hbWUgcGF0aCBuYW1lIG9mIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBkaXIgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZShiYXNlZGlyLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjYWNoZWQgcmVzdWx0IG9mIGxpc3QgcGVyZm9ybWVkIG9uIGZpbGUsIGlmCisgICAgICogYXZhaWxhYmxlLiAgSW52b2tlcyB0aGUgbWV0aG9kIGFuZCBjYWNoZXMgdGhlIHJlc3VsdCBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBGaWxlIChkaXIpIHRvIGxpc3QuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIGxpc3QoRmlsZSBmaWxlKSB7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gKFN0cmluZ1tdKSBmaWxlTGlzdE1hcC5nZXQoZmlsZSk7CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWxlcyA9IGZpbGUubGlzdCgpOworICAgICAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaWxlTGlzdE1hcC5wdXQoZmlsZSwgZmlsZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGcm9tIDxjb2RlPmJhc2U8L2NvZGU+IHRyYXZlcnNlIHRoZSBmaWxlc3lzdGVtIGluIG9yZGVyIHRvIGZpbmQKKyAgICAgKiBhIGZpbGUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2UgYmFzZSBGaWxlIChkaXIpLgorICAgICAqIEBwYXJhbSBwYXRoIGZpbGUgcGF0aC4KKyAgICAgKiBAcGFyYW0gY3Mgd2hldGhlciB0byBzY2FuIGNhc2Utc2Vuc2l0aXZlbHkuCisgICAgICogQHJldHVybiBGaWxlIG9iamVjdCB0aGF0IHBvaW50cyB0byB0aGUgZmlsZSBpbiBxdWVzdGlvbiBvciBudWxsLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHByaXZhdGUgRmlsZSBmaW5kRmlsZShGaWxlIGJhc2UsIFN0cmluZyBwYXRoLCBib29sZWFuIGNzKSB7CisgICAgICAgIGlmIChGaWxlVXRpbHMuaXNBYnNvbHV0ZVBhdGgocGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBzID0gRklMRV9VVElMUy5kaXNzZWN0KHBhdGgpOworICAgICAgICAgICAgICAgIGJhc2UgPSBuZXcgRmlsZShzWzBdKTsKKyAgICAgICAgICAgICAgICBwYXRoID0gc1sxXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gRklMRV9VVElMUy5ub3JtYWxpemUocGF0aCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKGJhc2UsIGYpOworICAgICAgICAgICAgICAgIGlmIChzLmVxdWFscyhmLmdldEFic29sdXRlUGF0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICAvL3JlbW92aW5nIGJhc2UgZnJvbSBwYXRoIHlpZWxkcyBubyBjaGFuZ2U7IHBhdGggbm90IGNoaWxkIG9mIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGggPSBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5kRmlsZShiYXNlLCBTZWxlY3RvclV0aWxzLnRva2VuaXplUGF0aChwYXRoKSwgY3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZyb20gPGNvZGU+YmFzZTwvY29kZT4gdHJhdmVyc2UgdGhlIGZpbGVzeXN0ZW0gaW4gb3JkZXIgdG8gZmluZAorICAgICAqIGEgZmlsZSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHN0YWNrIG9mIG5hbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2UgYmFzZSBGaWxlIChkaXIpLgorICAgICAqIEBwYXJhbSBwYXRoRWxlbWVudHMgVmVjdG9yIG9mIHBhdGggZWxlbWVudHMgKGRpcnMuLi5maWxlKS4KKyAgICAgKiBAcGFyYW0gY3Mgd2hldGhlciB0byBzY2FuIGNhc2Utc2Vuc2l0aXZlbHkuCisgICAgICogQHJldHVybiBGaWxlIG9iamVjdCB0aGF0IHBvaW50cyB0byB0aGUgZmlsZSBpbiBxdWVzdGlvbiBvciBudWxsLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHByaXZhdGUgRmlsZSBmaW5kRmlsZShGaWxlIGJhc2UsIFZlY3RvciBwYXRoRWxlbWVudHMsIGJvb2xlYW4gY3MpIHsKKyAgICAgICAgaWYgKHBhdGhFbGVtZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGJhc2U7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSAoU3RyaW5nKSBwYXRoRWxlbWVudHMucmVtb3ZlKDApOworICAgICAgICBpZiAoYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmluZEZpbGUobmV3IEZpbGUoY3VycmVudCksIHBhdGhFbGVtZW50cywgY3MpOworICAgICAgICB9CisgICAgICAgIGlmICghYmFzZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGxpc3QoYmFzZSk7CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIklPIGVycm9yIHNjYW5uaW5nIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiYXNlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuW10gbWF0Y2hDYXNlID0gY3MgPyBDU19TQ0FOX09OTFkgOiBDU19USEVOX05PTl9DUzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaENhc2UubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hDYXNlW2ldID8gZmlsZXNbal0uZXF1YWxzKGN1cnJlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpbGVzW2pdLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRGaWxlKG5ldyBGaWxlKGJhc2UsIGZpbGVzW2pdKSwgcGF0aEVsZW1lbnRzLCBjcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHdlIGhhdmUgdG8gdHJhdmVyc2UgYSBzeW1saW5rIHdoZW4gdHJ5aW5nIHRvIHJlYWNoIHBhdGggZnJvbQorICAgICAqIGJhc2VkaXI/CisgICAgICogQHBhcmFtIGJhc2UgYmFzZSBGaWxlIChkaXIpLgorICAgICAqIEBwYXJhbSBwYXRoIGZpbGUgcGF0aC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5bWxpbmsoRmlsZSBiYXNlLCBTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gaXNTeW1saW5rKGJhc2UsIFNlbGVjdG9yVXRpbHMudG9rZW5pemVQYXRoKHBhdGgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB3ZSBoYXZlIHRvIHRyYXZlcnNlIGEgc3ltbGluayB3aGVuIHRyeWluZyB0byByZWFjaCBwYXRoIGZyb20KKyAgICAgKiBiYXNlZGlyPworICAgICAqIEBwYXJhbSBiYXNlIGJhc2UgRmlsZSAoZGlyKS4KKyAgICAgKiBAcGFyYW0gcGF0aEVsZW1lbnRzIFZlY3RvciBvZiBwYXRoIGVsZW1lbnRzIChkaXJzLi4uZmlsZSkuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTeW1saW5rKEZpbGUgYmFzZSwgVmVjdG9yIHBhdGhFbGVtZW50cykgeworICAgICAgICBpZiAocGF0aEVsZW1lbnRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gKFN0cmluZykgcGF0aEVsZW1lbnRzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZJTEVfVVRJTFMuaXNTeW1ib2xpY0xpbmsoYmFzZSwgY3VycmVudCkKKyAgICAgICAgICAgICAgICAgICAgfHwgaXNTeW1saW5rKG5ldyBGaWxlKGJhc2UsIGN1cnJlbnQpLCBwYXRoRWxlbWVudHMpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJT0V4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgY2hlY2tpbmcgIgorICAgICAgICAgICAgICAgICAgICArICJmb3IgbGlua3MsIGNvdWxkbid0IGdldCBjYW5vbmljYWwgcGF0aCEiOworICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgY2F1Z2h0IGFuZCByZWRpcmVjdGVkIHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtCisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgZGlyZWN0b3J5IHdpdGggdGhlIGdpdmVuIHBhdGggcmVsYXRpdmUgdG8gdGhlIGJhc2UKKyAgICAgKiBkaXJlY3RvcnkgYWxyZWFkeSBiZWVuIHNjYW5uZWQ/CisgICAgICoKKyAgICAgKiA8cD5SZWdpc3RlcnMgdGhlIGdpdmVuIGRpcmVjdG9yeSBhcyBzY2FubmVkIGFzIGEgc2lkZSBlZmZlY3QuPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzQmVlblNjYW5uZWQoU3RyaW5nIHZwYXRoKSB7CisgICAgICAgIHJldHVybiAhc2Nhbm5lZERpcnMuYWRkKHZwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBvZiBpbnRlcmVzdCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gIFRoZSByZXR1cm5lZAorICAgICAqIFNldCBpcyBsaXZlIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgorICAgICAqIEByZXR1cm4gdGhlIFNldCBvZiByZWxhdGl2ZSBkaXJlY3RvcnkgbmFtZXMgdGhhdCBoYXZlIGJlZW4gc2Nhbm5lZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlLXByaXZhdGUgKi8gU2V0IGdldFNjYW5uZWREaXJzKCkgeworICAgICAgICByZXR1cm4gc2Nhbm5lZERpcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgaW50ZXJuYWwgY2FjaGVzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyQ2FjaGVzKCkgeworICAgICAgICBmaWxlTGlzdE1hcC5jbGVhcigpOworICAgICAgICBpbmNsdWRlTm9uUGF0dGVybnMuY2xlYXIoKTsKKyAgICAgICAgZXhjbHVkZU5vblBhdHRlcm5zLmNsZWFyKCk7CisgICAgICAgIGluY2x1ZGVQYXR0ZXJucyA9IG51bGw7CisgICAgICAgIGV4Y2x1ZGVQYXR0ZXJucyA9IG51bGw7CisgICAgICAgIGFyZU5vblBhdHRlcm5TZXRzUmVhZHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCB0aGUgaW58ZXhjbHVkZSAmcXVvdDtwYXR0ZXJucyZxdW90OworICAgICAqIGhhdmUgYmVlbiBwcm9wZXJseSBkaXZpZGVkIHVwLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZW5zdXJlTm9uUGF0dGVyblNldHNSZWFkeSgpIHsKKyAgICAgICAgaWYgKCFhcmVOb25QYXR0ZXJuU2V0c1JlYWR5KSB7CisgICAgICAgICAgICBpbmNsdWRlUGF0dGVybnMgPSBmaWxsTm9uUGF0dGVyblNldChpbmNsdWRlTm9uUGF0dGVybnMsIGluY2x1ZGVzKTsKKyAgICAgICAgICAgIGV4Y2x1ZGVQYXR0ZXJucyA9IGZpbGxOb25QYXR0ZXJuU2V0KGV4Y2x1ZGVOb25QYXR0ZXJucywgZXhjbHVkZXMpOworICAgICAgICAgICAgYXJlTm9uUGF0dGVyblNldHNSZWFkeSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYWxsIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCByZWFsIHBhdHRlcm5zIChkbyBub3QgY29udGFpbgorICAgICAqIHdpbGRjYXJkcykgdG8gdGhlIHNldCBhbmQgcmV0dXJucyB0aGUgcmVhbCBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXQgU2V0IHRvIHBvcHVsYXRlLgorICAgICAqIEBwYXJhbSBwYXR0ZXJucyBTdHJpbmdbXSBvZiBwYXR0ZXJucy4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBmaWxsTm9uUGF0dGVyblNldChTZXQgc2V0LCBTdHJpbmdbXSBwYXR0ZXJucykgeworICAgICAgICBBcnJheUxpc3QgYWwgPSBuZXcgQXJyYXlMaXN0KHBhdHRlcm5zLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghU2VsZWN0b3JVdGlscy5oYXNXaWxkY2FyZHMocGF0dGVybnNbaV0pKSB7CisgICAgICAgICAgICAgICAgc2V0LmFkZChpc0Nhc2VTZW5zaXRpdmUoKSA/IHBhdHRlcm5zW2ldCisgICAgICAgICAgICAgICAgICAgIDogcGF0dGVybnNbaV0udG9VcHBlckNhc2UoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsLmFkZChwYXR0ZXJuc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNldC5zaXplKCkgPT0gMCA/IHBhdHRlcm5zCisgICAgICAgICAgICA6IChTdHJpbmdbXSkgYWwudG9BcnJheShuZXcgU3RyaW5nW2FsLnNpemUoKV0pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0F0dHJpYnV0ZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0F0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NWMzM2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCisvKioKKyAqIEVuYWJsZXMgYSB0YXNrIHRvIGNvbnRyb2wgdW5rbm93biBhdHRyaWJ1dGVzCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGludGVyZmFjZSBEeW5hbWljQXR0cmlidXRlIHsKKworICAgIC8qKgorICAgICAqIFNldCBhIG5hbWVkIGF0dHJpYnV0ZSB0byB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiB3aGVuIGFueSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICB2b2lkIHNldER5bmFtaWNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0F0dHJpYnV0ZU5TLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljQXR0cmlidXRlTlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDZlODRlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0F0dHJpYnV0ZU5TLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworLyoqCisgKiBFbmFibGVzIGEgdGFzayB0byBjb250cm9sIHVua25vd24gYXR0cmlidXRlcy4KKyAqCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgaW50ZXJmYWNlIER5bmFtaWNBdHRyaWJ1dGVOUyB7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBuYW1lZCBhdHRyaWJ1dGUgdG8gdGhlIGdpdmVuIHZhbHVlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBuYW1lc3BhY2UgdXJpIGZvciB0aGlzIGF0dHJpYnV0ZSwgIiIgaXMKKyAgICAgKiAgICAgICAgICAgIHVzZWQgaWYgdGhlcmUgaXMgbm8gbmFtZXNwYWNlIHVyaS4KKyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHFOYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhpcyBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gd2hlbiBhbnkgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgdm9pZCBzZXREeW5hbWljQXR0cmlidXRlKAorICAgICAgICBTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0NvbmZpZ3VyYXRvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0NvbmZpZ3VyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODA2MmIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljQ29uZmlndXJhdG9yLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCisvKioKKyAqIEVuYWJsZXMgYSB0YXNrIHRvIGNvbnRyb2wgdW5rbm93biBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cy4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgaW50ZXJmYWNlIER5bmFtaWNDb25maWd1cmF0b3IKKyAgICBleHRlbmRzIER5bmFtaWNBdHRyaWJ1dGUsIER5bmFtaWNFbGVtZW50IHsKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0NvbmZpZ3VyYXRvck5TLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljQ29uZmlndXJhdG9yTlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGIzZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0NvbmZpZ3VyYXRvck5TLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworLyoqCisgKiBFbmFibGVzIGEgdGFzayB0byBjb250cm9sIHVua25vd24gYXR0cmlidXRlcyBhbmQgZWxlbWVudHMuCisgKgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGludGVyZmFjZSBEeW5hbWljQ29uZmlndXJhdG9yTlMKKyAgICBleHRlbmRzIER5bmFtaWNBdHRyaWJ1dGVOUywgRHluYW1pY0VsZW1lbnROUyB7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljRWxlbWVudC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0VsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2UzNTNmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0VsZW1lbnQuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKKy8qKgorICogRW5hYmxlcyBhIHRhc2sgdG8gY29udHJvbCB1bmtub3duIGVsZW1lbnRzLgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRHluYW1pY0VsZW1lbnQgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGVsZW1lbnQgbmJhbWUKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHdoZW4gYW55IGVycm9yIG9jY3VycworICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgY3JlYXRlZAorICAgICAqLworICAgIE9iamVjdCBjcmVhdGVEeW5hbWljRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0VsZW1lbnROUy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0VsZW1lbnROUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YmZhNTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljRWxlbWVudE5TLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworLyoqCisgKiBFbmFibGVzIGEgdGFzayB0byBjb250cm9sIHVua25vd24gZWxlbWVudHMuCisgKgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGludGVyZmFjZSBEeW5hbWljRWxlbWVudE5TIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBuYW1lc3BhY2UgdXJpIGZvciB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIFRoZSBsb2NhbG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHFOYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gd2hlbiBhbnkgZXJyb3Igb2NjdXJzCisgICAgICogQHJldHVybiB0aGUgZWxlbWVudCBjcmVhdGVkIGZvciB0aGlzIGVsZW1lbnQuCisgICAgICovCisgICAgT2JqZWN0IGNyZWF0ZUR5bmFtaWNFbGVtZW50KAorICAgICAgICBTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4ZWN1dG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkOTJlN2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworLyoqCisgKiBUYXJnZXQgZXhlY3V0b3IgYWJzdHJhY3Rpb24uCisgKiBAc2luY2UgQW50IDEuNi4zCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhlY3V0b3IgeworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIFRhcmdldHMgZm9yIHRoZSBzcGVjaWZpZWQgUHJvamVjdC4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCAgICAgICB0aGUgQW50IFByb2plY3QuCisgICAgICogQHBhcmFtIHRhcmdldE5hbWVzICAgU3RyaW5nW10gb2YgVGFyZ2V0IG5hbWVzIGFzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICB2b2lkIGV4ZWN1dGVUYXJnZXRzKFByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gdGFyZ2V0TmFtZXMpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgc3VicHJvamVjdCBFeGVjdXRvciBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGFuIEV4ZWN1dG9yIGluc3RhbmNlLgorICAgICAqLworICAgIEV4ZWN1dG9yIGdldFN1YlByb2plY3RFeGVjdXRvcigpOworCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGl0RXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGl0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlMWJjOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4aXRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCisvKioKKyAqIFVzZWQgdG8gcmVwb3J0IGV4aXQgc3RhdHVzIG9mIGNsYXNzZXMgd2hpY2ggY2FsbCBTeXN0ZW0uZXhpdCgpLgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5vcHRpb25hbC5Ob0V4aXRTZWN1cml0eU1hbmFnZXIKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGVybWlzc2lvbnMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFeGl0RXhjZXB0aW9uIGV4dGVuZHMgU2VjdXJpdHlFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjc3MjQ4Nzg1NDI4MDU0MzM2M0w7CisKKyAgICAvKiogU3RhdHVzIGNvZGUgKi8KKyAgICBwcml2YXRlIGludCBzdGF0dXM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4aXQgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyBjb2RlIHJldHVybmVkIHZpYSBTeXN0ZW0uZXhpdCgpCisgICAgICovCisgICAgcHVibGljIEV4aXRFeGNlcHRpb24oaW50IHN0YXR1cykgeworICAgICAgICBzdXBlcigiRXhpdEV4Y2VwdGlvbjogc3RhdHVzICIgKyBzdGF0dXMpOworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4aXQgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyBjb2RlIHJldHVybmVkIHZpYSBTeXN0ZW0uZXhpdCgpCisgICAgICovCisgICAgcHVibGljIEV4aXRFeGNlcHRpb24oU3RyaW5nIG1zZywgaW50IHN0YXR1cykgeworICAgICAgICBzdXBlcihtc2cpOworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgU3lzdGVtLmV4aXQoKQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgU3lzdGVtLmV4aXQoKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4aXRTdGF0dXNFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4aXRTdGF0dXNFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWI1MTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXhpdFN0YXR1c0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKKy8qKgorICogQnVpbGRFeGNlcHRpb24gKyBleGl0IHN0YXR1cy4KKyAqCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgRXhpdFN0YXR1c0V4Y2VwdGlvbiBleHRlbmRzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc3NjA4NDY4MDY4ODY1ODU5NjhMOworCisgICAgLyoqIFN0YXR1cyBjb2RlICovCisgICAgcHJpdmF0ZSBpbnQgc3RhdHVzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiA8Y29kZT5FeGl0U3RhdHVzRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBhc3NvY2lhdGVkIHN0YXR1cyBjb2RlCisgICAgICovCisgICAgcHVibGljIEV4aXRTdGF0dXNFeGNlcHRpb24oaW50IHN0YXR1cykgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIDxjb2RlPkV4aXRTdGF0dXNFeGNlcHRpb248L2NvZGU+LgorICAgICAqIEBwYXJhbSBtc2cgdGhlIGFzc29jaWF0ZWQgbWVzc2FnZQorICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGFzc29jaWF0ZWQgc3RhdHVzIGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRXhpdFN0YXR1c0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBpbnQgc3RhdHVzKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBleGl0IHN0YXR1cyBleGNlcHRpb24gd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0b28KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBtZXNzYWdlCisgICAgICogQHBhcmFtIHN0YXR1cyBleGl0IHN0YXR1cworICAgICAqIEBwYXJhbSBsb2NhdGlvbiBleGl0IGxvY2F0aW9uCisgICAgICovCisgICAgcHVibGljIEV4aXRTdGF0dXNFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIGludCBzdGF0dXMsIExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGxvY2F0aW9uKTsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdGF0dXMgY29kZS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPmludDwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9GaWxlU2Nhbm5lci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRmlsZVNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NiOWRlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRmlsZVNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgdXNlZCB0byBkZXNjcmliZSB0aGUgYWN0aW9ucyByZXF1aXJlZCBvZiBhbnkgdHlwZSBvZgorICogZGlyZWN0b3J5IHNjYW5uZXIuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIEZpbGVTY2FubmVyIHsKKyAgICAvKioKKyAgICAgKiBBZGRzIGRlZmF1bHQgZXhjbHVzaW9ucyB0byB0aGUgY3VycmVudCBleGNsdXNpb25zIHNldC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZERlZmF1bHRFeGNsdWRlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gYmUgc2Nhbm5lZC4KKyAgICAgKiBUaGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hpY2ggaXMgc2Nhbm5lZCByZWN1cnNpdmVseS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGJlIHNjYW5uZWQKKyAgICAgKi8KKyAgICBGaWxlIGdldEJhc2VkaXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUKKyAgICAgKiBpbmNsdWRlIHBhdHRlcm5zIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICogaW5jbHVkZSBwYXR0ZXJucyBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIFN0cmluZ1tdIGdldEV4Y2x1ZGVkRGlyZWN0b3JpZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUKKyAgICAgKiBpbmNsdWRlIHBhdHRlcm5zIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICogICAgICAgICBpbmNsdWRlIHBhdHRlcm5zIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICoKKyAgICAgKi8KKyAgICBTdHJpbmdbXSBnZXRFeGNsdWRlZEZpbGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICogaW5jbHVkZSBwYXR0ZXJucyBhbmQgbm9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKiBUaGUgbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUKKyAgICAgKiBpbmNsdWRlIHBhdHRlcm5zIGFuZCBub25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIFN0cmluZ1tdIGdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUKKyAgICAgKiBpbmNsdWRlIHBhdHRlcm5zIGFuZCBub25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdoaWNoIG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAqICAgICAgICAgaW5jbHVkZSBwYXR0ZXJucyBhbmQgbm9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBTdHJpbmdbXSBnZXRJbmNsdWRlZEZpbGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2hlZCBub25lIG9mIHRoZSBpbmNsdWRlCisgICAgICogcGF0dGVybnMuIFRoZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHdoaWNoIG1hdGNoZWQgbm9uZSBvZiB0aGUgaW5jbHVkZQorICAgICAqIHBhdHRlcm5zLgorICAgICAqLworICAgIFN0cmluZ1tdIGdldE5vdEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB3aGljaCBtYXRjaGVkIG5vbmUgb2YgdGhlIGluY2x1ZGUKKyAgICAgKiBwYXR0ZXJucy4gVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgd2hpY2ggbWF0Y2hlZCBub25lIG9mIHRoZSBpbmNsdWRlCisgICAgICogICAgICAgICBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBTdHJpbmdbXSBnZXROb3RJbmNsdWRlZEZpbGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBTY2FucyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGZpbGVzIHdoaWNoIG1hdGNoIGF0IGxlYXN0IG9uZSBpbmNsdWRlCisgICAgICogcGF0dGVybiBhbmQgZG9uJ3QgbWF0Y2ggYW55IGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgYmFzZSBkaXJlY3Rvcnkgd2FzIHNldAorICAgICAqICAgICAgICAgICAgaW5jb3JyZWN0bHkgKGkuZS4gaWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGRvZXNuJ3QgZXhpc3QsCisgICAgICogICAgICAgICAgICBvciBpc24ndCBhIGRpcmVjdG9yeSkuCisgICAgICovCisgICAgdm9pZCBzY2FuKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGJlIHNjYW5uZWQuIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGljaCBpcworICAgICAqIHNjYW5uZWQgcmVjdXJzaXZlbHkuIEFsbCAnLycgYW5kICdcJyBjaGFyYWN0ZXJzIHNob3VsZCBiZSByZXBsYWNlZCBieQorICAgICAqIDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4sIHNvIHRoZSBzZXBhcmF0b3IgdXNlZCBuZWVkIG5vdCBtYXRjaAorICAgICAqIDxjb2RlPkZpbGUuc2VwYXJhdG9yQ2hhcjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciBUaGUgYmFzZSBkaXJlY3RvcnkgdG8gc2Nhbi4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICB2b2lkIHNldEJhc2VkaXIoU3RyaW5nIGJhc2VkaXIpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gYmUgc2Nhbm5lZC4gVGhpcyBpcyB0aGUgZGlyZWN0b3J5IHdoaWNoIGlzCisgICAgICogc2Nhbm5lZCByZWN1cnNpdmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlZGlyIFRoZSBiYXNlIGRpcmVjdG9yeSBmb3Igc2Nhbm5pbmcuCisgICAgICogICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICB2b2lkIHNldEJhc2VkaXIoRmlsZSBiYXNlZGlyKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucyB0byB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjbHVkZXMgQSBsaXN0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW5kaWNhdGluZyB0aGF0IG5vIGZpbGVzCisgICAgICogICAgICAgICAgICAgICAgIHNob3VsZCBiZSBleGNsdWRlZC4gSWYgYSBub24tPGNvZGU+bnVsbDwvY29kZT4gbGlzdCBpcworICAgICAqICAgICAgICAgICAgICAgICBnaXZlbiwgYWxsIGVsZW1lbnRzIG11c3QgYmUgbm9uLTxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nW10gZXhjbHVkZXMpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdHRlcm5zIHRvIHVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlcyBBIGxpc3Qgb2YgaW5jbHVkZSBwYXR0ZXJucy4KKyAgICAgKiAgICAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbmRpY2F0aW5nIHRoYXQgYWxsIGZpbGVzCisgICAgICogICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpbmNsdWRlZC4gSWYgYSBub24tPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgbGlzdCBpcyBnaXZlbiwgYWxsIGVsZW1lbnRzIG11c3QgYmUKKyAgICAgKiBub24tPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmdbXSBpbmNsdWRlcyk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIHN5c3RlbSBzaG91bGQgYmUgcmVnYXJkZWQgYXMgY2FzZSBzZW5zaXRpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIHN5c3RlbSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2FyZGVkIGFzIGEgY2FzZSBzZW5zaXRpdmUgb25lCisgICAgICovCisgICAgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTk5ZDkwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvSW50cm9zcGVjdGlvbkhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTYyNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlByZVNldERlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0aGF0IGNvbGxlY3RzIHRoZSBtZXRob2RzIGEgdGFzayBvciBuZXN0ZWQgZWxlbWVudAorICogaG9sZHMgdG8gc2V0IGF0dHJpYnV0ZXMsIGNyZWF0ZSBuZXN0ZWQgZWxlbWVudHMgb3IgaG9sZCBQQ0RBVEEKKyAqIGVsZW1lbnRzLgorICoKKyAqIEl0IGNvbnRhaW5zIGhhc2h0YWJsZXMgY29udGFpbmluZyBjbGFzc2VzIHRoYXQgdXNlIGludHJvc3BlY3Rpb24KKyAqIHRvIGhhbmRsZSBhbGwgdGhlIGludm9jYXRpb24gb2YgdGhlIHByb2plY3QtY29tcG9uZW50IHNwZWNpZmljIG1ldGhvZHMuCisgKgorICogVGhpcyBjbGFzcyBpcyBzb21ld2hhdCBjb21wbGV4LCBhcyBpdCBpbXBsZW1lbnRzIHRoZSBPL1ggbWFwcGluZyBiZXR3ZWVuCisgKiBBbnQgWE1MIGFuZCBKYXZhIGNsYXNzIGluc3RhbmNlcy4gVGhpcyBpcyBub3QgdGhlIGJlc3QgcGxhY2UgZm9yIHNvbWVvbmUgbmV3CisgKiB0byBBbnQgdG8gc3RhcnQgY29udHJpYnV0aW5nIHRvIHRoZSBjb2RlYmFzZSwgYXMgYSBjaGFuZ2UgaGVyZSBjYW4gYnJlYWsgdGhlCisgKiBlbnRpcmUgc3lzdGVtIGluIGludGVyZXN0aW5nIHdheXMuIEFsd2F5cyBydW4gYSBmdWxsIHRlc3Qgb2YgQW50IGJlZm9yZSBjaGVja2luZworICogaW4vc3VibWl0dGluZyBjaGFuZ2VzIHRvIHRoaXMgZmlsZS4KKyAqCisgKiBUaGUgY2xhc3MgaXMgZmluYWwgYW5kIGhhcyBhIHByaXZhdGUgY29uc3RydWN0b3IuCisgKiBUbyBnZXQgYW4gaW5zdGFuY2UgZm9yIGEgc3BlY2lmaWMgKGNsYXNzLHByb2plY3QpIGNvbWJpbmF0aW9uLAorICogdXNlIHtAbGluayAjZ2V0SGVscGVyKFByb2plY3QsQ2xhc3MpfS4KKyAqIFRoaXMgbWF5IHJldHVybiBhbiBleGlzdGluZyB2ZXJzaW9uLCBvciBhIG5ldyBvbmUKKyAqIC4uLmRvIG5vdCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCBpdHMgdW5pcXVlbmVzcywgb3IgaXRzIHZhbGlkaXR5IGFmdGVyIHRoZSBQcm9qZWN0CisgKiBpbnN0YW5jZSBoYXMgZmluaXNoZWQgaXRzIGJ1aWxkLgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEludHJvc3BlY3Rpb25IZWxwZXIgIHsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBpbnN0YW5jZXMgd2UndmUgYWxyZWFkeSBjcmVhdGVkIChDbGFzcy5nZXROYW1lKCkgdG8gSW50cm9zcGVjdGlvbkhlbHBlcikuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIEhFTFBFUlMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXAgZnJvbSBwcmltaXRpdmUgdHlwZXMgdG8gd3JhcHBlciBjbGFzc2VzIGZvciB1c2UgaW4KKyAgICAgKiBjcmVhdGVBdHRyaWJ1dGVTZXR0ZXIgKENsYXNzIHRvIENsYXNzKS4gTm90ZSB0aGF0IGNoYXIKKyAgICAgKiBhbmQgYm9vbGVhbiBhcmUgaW4gaGVyZSBldmVuIHRob3VnaCB0aGV5IGdldCBzcGVjaWFsIHRyZWF0bWVudAorICAgICAqIC0gdGhpcyB3YXkgd2Ugb25seSBuZWVkIHRvIHRlc3QgZm9yIHRoZSB3cmFwcGVyIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBQUklNSVRJVkVfVFlQRV9NQVAgPSBuZXcgSGFzaE1hcCg4KTsKKworICAgIC8vIFNldCB1cCBQUklNSVRJVkVfVFlQRV9NQVAKKyAgICBzdGF0aWMgeworICAgICAgICBDbGFzc1tdIHByaW1pdGl2ZXMgPSB7Qm9vbGVhbi5UWVBFLCBCeXRlLlRZUEUsIENoYXJhY3Rlci5UWVBFLCBTaG9ydC5UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5UWVBFLCBMb25nLlRZUEUsIEZsb2F0LlRZUEUsIERvdWJsZS5UWVBFfTsKKyAgICAgICAgQ2xhc3NbXSB3cmFwcGVycyA9IHtCb29sZWFuLmNsYXNzLCBCeXRlLmNsYXNzLCBDaGFyYWN0ZXIuY2xhc3MsIFNob3J0LmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuY2xhc3MsIExvbmcuY2xhc3MsIEZsb2F0LmNsYXNzLCBEb3VibGUuY2xhc3N9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByaW1pdGl2ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFBSSU1JVElWRV9UWVBFX01BUC5wdXQgKHByaW1pdGl2ZXNbaV0sIHdyYXBwZXJzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVQT1JUX05FU1RFRF9URVhUID0gMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMTElQU0lTID0gIi4uLiI7CisKKyAgICAvKioKKyAgICAgKiBNYXAgZnJvbSBhdHRyaWJ1dGUgbmFtZXMgdG8gYXR0cmlidXRlIHR5cGVzCisgICAgICogKFN0cmluZyB0byBDbGFzcykuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgYXR0cmlidXRlVHlwZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXAgZnJvbSBhdHRyaWJ1dGUgbmFtZXMgdG8gYXR0cmlidXRlIHNldHRlciBtZXRob2RzCisgICAgICogKFN0cmluZyB0byBBdHRyaWJ1dGVTZXR0ZXIpLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIGF0dHJpYnV0ZVNldHRlcnMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXAgZnJvbSBhdHRyaWJ1dGUgbmFtZXMgdG8gbmVzdGVkIHR5cGVzCisgICAgICogKFN0cmluZyB0byBDbGFzcykuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgbmVzdGVkVHlwZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXAgZnJvbSBhdHRyaWJ1dGUgbmFtZXMgdG8gbWV0aG9kcyB0byBjcmVhdGUgbmVzdGVkIHR5cGVzCisgICAgICogKFN0cmluZyB0byBOZXN0ZWRDcmVhdG9yKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBuZXN0ZWRDcmVhdG9ycyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiBtZXRob2RzIG1hdGNoaW5nIGFkZFtDb25maWd1cmVkXShDbGFzcykgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgYWRkVHlwZU1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kIHRvIGludm9rZSB0byBhZGQgUENEQVRBLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIGFkZFRleHQgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIGludHJvc3BlY3RlZCBieSB0aGlzIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgYmVhbjsKKworICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IsIHdoaWNoIGlzIHByaXZhdGUgdG8gZW5zdXJlIHRoYXQgYWxsCisgICAgICogSW50cm9zcGVjdGlvbkhlbHBlcnMgYXJlIGNyZWF0ZWQgdmlhIHtAbGluayAjZ2V0SGVscGVyKENsYXNzKSBnZXRIZWxwZXJ9LgorICAgICAqIEludHJvc3BlY3RzIHRoZSBnaXZlbiBjbGFzcyBmb3IgYmVhbi1saWtlIG1ldGhvZHMuCisgICAgICogRWFjaCBtZXRob2QgaXMgZXhhbWluZWQgaW4gdHVybiwgYW5kIHRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIGFwcGxpZWQ6CisgICAgICogPHA+CisgICAgICogPHVsPgorICAgICAqIDxsaT5JZiB0aGUgbWV0aG9kIGlzIDxjb2RlPlRhc2suc2V0TG9jYXRpb24oTG9jYXRpb24pPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5UYXNrLnNldFRhc2tUeXBlKFN0cmluZyk8L2NvZGU+CisgICAgICogb3IgPGNvZGU+VGFza0NvbnRhaW5lci5hZGRUYXNrKFRhc2spPC9jb2RlPiwgaXQgaXMgaWdub3JlZC4gVGhlc2UKKyAgICAgKiBtZXRob2RzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGVsc2V3aGVyZS4KKyAgICAgKiA8bGk+PGNvZGU+dm9pZCBhZGRUZXh0KFN0cmluZyk8L2NvZGU+IGlzIHJlY29nbmlzZWQgYXMgdGhlIG1ldGhvZCBmb3IKKyAgICAgKiBhZGRpbmcgUENEQVRBIHRvIGEgYmVhbi4KKyAgICAgKiA8bGk+PGNvZGU+dm9pZCBzZXRGb28oQmFyKTwvY29kZT4gaXMgcmVjb2duaXNlZCBhcyBhIG1ldGhvZCBmb3IKKyAgICAgKiBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBhdHRyaWJ1dGUgPGNvZGU+Zm9vPC9jb2RlPiwgc28gbG9uZyBhcworICAgICAqIDxjb2RlPkJhcjwvY29kZT4gaXMgbm9uLXZvaWQgYW5kIGlzIG5vdCBhbiBhcnJheSB0eXBlLiBOb24tU3RyaW5nCisgICAgICogcGFyYW1ldGVyIHR5cGVzIGFsd2F5cyBvdmVybG9hZCBTdHJpbmcgcGFyYW1ldGVyIHR5cGVzLCBidXQgdGhhdCBpcworICAgICAqIHRoZSBvbmx5IGd1YXJhbnRlZSBtYWRlIGluIHRlcm1zIG9mIHByaW9yaXR5LgorICAgICAqIDxsaT48Y29kZT5Gb28gY3JlYXRlQmFyKCk8L2NvZGU+IGlzIHJlY29nbmlzZWQgYXMgYSBtZXRob2QgZm9yCisgICAgICogY3JlYXRpbmcgYSBuZXN0ZWQgZWxlbWVudCBjYWxsZWQgPGNvZGU+YmFyPC9jb2RlPiBvZiB0eXBlCisgICAgICogPGNvZGU+Rm9vPC9jb2RlPiwgc28gbG9uZyBhcyA8Y29kZT5Gb288L2NvZGU+IGlzIG5vdCBhIHByaW1pdGl2ZSBvcgorICAgICAqIGFycmF5IHR5cGUuCisgICAgICogPGxpPjxjb2RlPnZvaWQgYWRkQ29uZmlndXJlZEZvbyhCYXIpPC9jb2RlPiBpcyByZWNvZ25pc2VkIGFzIGEKKyAgICAgKiBtZXRob2QgZm9yIHN0b3JpbmcgYSBwcmUtY29uZmlndXJlZCBlbGVtZW50IGNhbGxlZAorICAgICAqIDxjb2RlPmZvbzwvY29kZT4gYW5kIG9mIHR5cGUgPGNvZGU+QmFyPC9jb2RlPiwgc28gbG9uZyBhcworICAgICAqIDxjb2RlPkJhcjwvY29kZT4gaXMgbm90IGFuIGFycmF5LCBwcmltaXRpdmUgb3IgU3RyaW5nIHR5cGUuCisgICAgICogPGNvZGU+QmFyPC9jb2RlPiBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSBjb25zdHJ1Y3RvciB0YWtpbmcgbm8KKyAgICAgKiBhcmd1bWVudHMuCisgICAgICogPGxpPjxjb2RlPnZvaWQgYWRkRm9vKEJhcik8L2NvZGU+IGlzIHJlY29nbmlzZWQgYXMgYSBtZXRob2QgZm9yIHN0b3JpbmcKKyAgICAgKiBhbiBlbGVtZW50IGNhbGxlZCA8Y29kZT5mb288L2NvZGU+IGFuZCBvZiB0eXBlIDxjb2RlPkJhcjwvY29kZT4sIHNvCisgICAgICogbG9uZyBhcyA8Y29kZT5CYXI8L2NvZGU+IGlzIG5vdCBhbiBhcnJheSwgcHJpbWl0aXZlIG9yIFN0cmluZyB0eXBlLgorICAgICAqIDxjb2RlPkJhcjwvY29kZT4gbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgY29uc3RydWN0b3IgdGFraW5nIG5vCisgICAgICogYXJndW1lbnRzLiBUaGlzIGlzIGRpc3RpbmN0IGZyb20gdGhlICdhZGRDb25maWd1cmVkJyBpZGlvbSBpbiB0aGF0CisgICAgICogdGhlIG5lc3RlZCBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBwYXJlbnQgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMKKyAgICAgKiBjb25zdHJ1Y3RlZDsgaW4gcHJhY3RpY2UgdGhpcyBtZWFucyB0aGF0IDxjb2RlPmFkZEZvbyhCYXIpPC9jb2RlPiBzaG91bGQKKyAgICAgKiBkbyBsaXR0bGUgb3Igbm90aGluZyB3aXRoIGl0cyBhcmd1bWVudCBiZXNpZGVzIHN0b3JpbmcgaXQgZm9yIGxhdGVyIHVzZS4KKyAgICAgKiA8L3VsPgorICAgICAqIE5vdGUgdGhhdCBvbmx5IG9uZSBtZXRob2QgaXMgcmV0YWluZWQgdG8gY3JlYXRlL3NldC9hZGRDb25maWd1cmVkL2FkZAorICAgICAqIGFueSBlbGVtZW50IG9yIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWFuIFRoZSBiZWFuIHR5cGUgdG8gaW50cm9zcGVjdC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEhlbHBlcihDbGFzcykKKyAgICAgKi8KKyAgICBwcml2YXRlIEludHJvc3BlY3Rpb25IZWxwZXIoZmluYWwgQ2xhc3MgYmVhbikgeworICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOworICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gYmVhbi5nZXRNZXRob2RzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmluYWwgTWV0aG9kIG0gPSBtZXRob2RzW2ldOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBtLmdldE5hbWUoKTsKKyAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBtLmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgICAgIENsYXNzW10gYXJncyA9IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgb2YgYWRkW0NvbmZpZ3VyZWRdKENsYXNzKSBwYXR0ZXJuCisgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMSAmJiBqYXZhLmxhbmcuVm9pZC5UWVBFLmVxdWFscyhyZXR1cm5UeXBlKQorICAgICAgICAgICAgICAgICAgICAmJiAoImFkZCIuZXF1YWxzKG5hbWUpIHx8ICJhZGRDb25maWd1cmVkIi5lcXVhbHMobmFtZSkpKSB7CisgICAgICAgICAgICAgICAgaW5zZXJ0QWRkVHlwZU1ldGhvZChtKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vdCByZWFsbHkgdXNlciBzZXR0YWJsZSBwcm9wZXJ0aWVzIG9uIHRhc2tzL3Byb2plY3QgY29tcG9uZW50cworICAgICAgICAgICAgaWYgKG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiZWFuKQorICAgICAgICAgICAgICAgICAgICAmJiBhcmdzLmxlbmd0aCA9PSAxICYmIGlzSGlkZGVuU2V0TWV0aG9kKG5hbWUsIGFyZ3NbMF0pKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBoaWRlIGFkZFRhc2sgZm9yIFRhc2tDb250YWluZXJzCisgICAgICAgICAgICBpZiAoaXNDb250YWluZXIoKSAmJiBhcmdzLmxlbmd0aCA9PSAxICYmICJhZGRUYXNrIi5lcXVhbHMobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzay5jbGFzcy5lcXVhbHMoYXJnc1swXSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgiYWRkVGV4dCIuZXF1YWxzKG5hbWUpICYmIGphdmEubGFuZy5Wb2lkLlRZUEUuZXF1YWxzKHJldHVyblR5cGUpCisgICAgICAgICAgICAgICAgICAgICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgamF2YS5sYW5nLlN0cmluZy5jbGFzcy5lcXVhbHMoYXJnc1swXSkpIHsKKyAgICAgICAgICAgICAgICBhZGRUZXh0ID0gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJzZXQiKSAmJiBqYXZhLmxhbmcuVm9pZC5UWVBFLmVxdWFscyhyZXR1cm5UeXBlKQorICAgICAgICAgICAgICAgICAgICAmJiBhcmdzLmxlbmd0aCA9PSAxICYmICFhcmdzWzBdLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IGdldFByb3BlcnR5TmFtZShuYW1lLCAic2V0Iik7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNldHRlcnMuZ2V0KHByb3BOYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmVxdWFscyhhcmdzWzBdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmUgbWV0aG9kIG0sIGFzIHRoZXJlIGlzIGFuIG92ZXJsb2FkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtIG9mIHRoaXMgbWV0aG9kIHRoYXQgdGFrZXMgaW4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1zdHJpbmcgYXJndW1lbnQsIHdoaWNoIGdhaW5zIGhpZ2hlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYXJndW1lbnQgaXMgbm90IGEgU3RyaW5nIGFuZCBpZiB0aGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgaXMgYW4gb3ZlcmxvYWRlZCBmb3JtIG9mIHRoaXMgbWV0aG9kIGFscmVhZHkgZGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlIGp1c3Qgb3ZlcnJpZGUgdGhhdCB3aXRoIHRoZSBuZXcgb25lLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZWNoYW5pc20gZG9lcyBub3QgZ3VhcmFudGVlIGFueSBzcGVjaWZpYyBvcmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgaW4gd2hpY2ggdGhlIG1ldGhvZHMgd2lsbCBiZSBzZWxlY3RlZDogc28gYW55IGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZGVwZW5kcyBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggInNldCIgbWV0aG9kcyBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIGRlZmluZWQsIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHNlbGVjdGVkIGluIGFueQorICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljdWxhciBvcmRlci4KKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXR0cmlidXRlU2V0dGVyIGFzID0gY3JlYXRlQXR0cmlidXRlU2V0dGVyKG0sIGFyZ3NbMF0sIHByb3BOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVUeXBlcy5wdXQocHJvcE5hbWUsIGFyZ3NbMF0pOworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVTZXR0ZXJzLnB1dChwcm9wTmFtZSwgYXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJjcmVhdGUiKSAmJiAhcmV0dXJuVHlwZS5pc0FycmF5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIXJldHVyblR5cGUuaXNQcmltaXRpdmUoKSAmJiBhcmdzLmxlbmd0aCA9PSAwKSB7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUobmFtZSwgImNyZWF0ZSIpOworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGEgY3JlYXRlIG9mIHRoaXMgcHJvcGVydHkgaXMgYWxyZWFkeSBwcmVzZW50CisgICAgICAgICAgICAgICAgLy8gYWRkIHRha2VzIHByZWZlcmVuY2Ugb3ZlciBjcmVhdGUgZm9yIENCIHB1cnBvc2VzCisgICAgICAgICAgICAgICAgaWYgKG5lc3RlZENyZWF0b3JzLmdldChwcm9wTmFtZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuZXN0ZWRUeXBlcy5wdXQocHJvcE5hbWUsIHJldHVyblR5cGUpOworICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDcmVhdG9ycy5wdXQocHJvcE5hbWUsIG5ldyBDcmVhdGVOZXN0ZWRDcmVhdG9yKG0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiYWRkQ29uZmlndXJlZCIpCisgICAgICAgICAgICAgICAgICAgICYmIGphdmEubGFuZy5Wb2lkLlRZUEUuZXF1YWxzKHJldHVyblR5cGUpICYmIGFyZ3MubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgIWphdmEubGFuZy5TdHJpbmcuY2xhc3MuZXF1YWxzKGFyZ3NbMF0pCisgICAgICAgICAgICAgICAgICAgICYmICFhcmdzWzBdLmlzQXJyYXkoKSAmJiAhYXJnc1swXS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSBhcmdzWzBdLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHt9KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IGFyZ3NbMF0uZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge1Byb2plY3QuY2xhc3N9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUobmFtZSwgImFkZENvbmZpZ3VyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbmVzdGVkVHlwZXMucHV0KHByb3BOYW1lLCBhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ3JlYXRvcnMucHV0KHByb3BOYW1lLCBuZXcgQWRkTmVzdGVkQ3JlYXRvcihtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IsIEFkZE5lc3RlZENyZWF0b3IuQUREX0NPTkZJR1VSRUQpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJhZGQiKQorICAgICAgICAgICAgICAgICAgICAmJiBqYXZhLmxhbmcuVm9pZC5UWVBFLmVxdWFscyhyZXR1cm5UeXBlKSAmJiBhcmdzLmxlbmd0aCA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmICFqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmVxdWFscyhhcmdzWzBdKQorICAgICAgICAgICAgICAgICAgICAmJiAhYXJnc1swXS5pc0FycmF5KCkgJiYgIWFyZ3NbMF0uaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gYXJnc1swXS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSBhcmdzWzBdLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtQcm9qZWN0LmNsYXNzfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gZ2V0UHJvcGVydHlOYW1lKG5hbWUsICJhZGQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5lc3RlZFR5cGVzLmdldChwcm9wTmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICBJZ25vcmUgdGhpcyBtZXRob2QgYXMgdGhlcmUgaXMgYW4gYWRkQ29uZmlndXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICogIGZvcm0gb2YgdGhpcyBtZXRob2QgdGhhdCBoYXMgYSBoaWdoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXN0ZWRUeXBlcy5wdXQocHJvcE5hbWUsIGFyZ3NbMF0pOworICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDcmVhdG9ycy5wdXQocHJvcE5hbWUsIG5ldyBBZGROZXN0ZWRDcmVhdG9yKG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IsIEFkZE5lc3RlZENyZWF0b3IuQUREKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDZXJ0YWluIHNldCBtZXRob2RzIGFyZSBwYXJ0IG9mIHRoZSBBbnQgY29yZSBpbnRlcmZhY2UgdG8gdGFza3MgYW5kCisgICAgICogdGhlcmVmb3JlIG5vdCB0byBiZSBjb25zaWRlcmVkIGZvciBpbnRyb3NwZWN0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc2V0IG1ldGhvZAorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBzZXQgbWV0aG9kJ3MgcGFyYW1ldGVyCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZXQgbWV0aG9kIGlzIHRvIGJlIGhpZGRlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNIaWRkZW5TZXRNZXRob2QoU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKCJzZXRMb2NhdGlvbiIuZXF1YWxzKG5hbWUpICYmIG9yZy5hcGFjaGUudG9vbHMuYW50LkxvY2F0aW9uLmNsYXNzLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJzZXRUYXNrVHlwZSIuZXF1YWxzKG5hbWUpICYmIGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhlbHBlciBmb3IgdGhlIGdpdmVuIGNsYXNzLCBlaXRoZXIgZnJvbSB0aGUgY2FjaGUKKyAgICAgKiBvciBieSBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjbGFzcyBmb3Igd2hpY2ggYSBoZWxwZXIgaXMgcmVxdWlyZWQuCisgICAgICogICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgaGVscGVyIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgSW50cm9zcGVjdGlvbkhlbHBlciBnZXRIZWxwZXIoQ2xhc3MgYykgeworICAgICAgICByZXR1cm4gZ2V0SGVscGVyKG51bGwsIGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBoZWxwZXIgZm9yIHRoZSBnaXZlbiBjbGFzcywgZWl0aGVyIGZyb20gdGhlIGNhY2hlCisgICAgICogb3IgYnkgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBUaGUgbWV0aG9kIHdpbGwgbWFrZSBzdXJlIHRoZSBoZWxwZXIgd2lsbCBiZSBjbGVhbmVkIHVwIGF0IHRoZSBlbmQgb2YKKyAgICAgKiB0aGUgcHJvamVjdCwgYW5kIG9ubHkgb25lIGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwIHRoZSBwcm9qZWN0IGluc3RhbmNlLiBDYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGUgaGVscGVyIGlzIG5vdCBjYWNoZWQuCisgICAgICogQHBhcmFtIGMgVGhlIGNsYXNzIGZvciB3aGljaCBhIGhlbHBlciBpcyByZXF1aXJlZC4KKyAgICAgKiAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBoZWxwZXIgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEludHJvc3BlY3Rpb25IZWxwZXIgZ2V0SGVscGVyKFByb2plY3QgcCwgQ2xhc3MgYykgeworICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gKEludHJvc3BlY3Rpb25IZWxwZXIpIEhFTFBFUlMuZ2V0KGMuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gSWYgYSBoZWxwZXIgY2Fubm90IGJlIGZvdW5kLCBvciBpZiB0aGUgaGVscGVyIGlzIGZvciBhbm90aGVyCisgICAgICAgIC8vIGNsYXNzbG9hZGVyLCBjcmVhdGUgYSBuZXcgSUgKKyAgICAgICAgaWYgKGloID09IG51bGwgfHwgaWguYmVhbiAhPSBjKSB7CisgICAgICAgICAgICBpaCA9IG5ldyBJbnRyb3NwZWN0aW9uSGVscGVyKGMpOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vICMzMDE2MjogZG8gKm5vdCogY2FjaGUgdGhpcyBpZiB0aGVyZSBpcyBubyBwcm9qZWN0LCBhcyB3ZQorICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBndWFyYW50ZWUgdGhhdCB0aGUgY2FjaGUgd2lsbCBiZSBjbGVhcmVkLgorICAgICAgICAgICAgICAgIEhFTFBFUlMucHV0KGMuZ2V0TmFtZSgpLCBpaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGloOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWVkIGF0dHJpYnV0ZSBpbiB0aGUgZ2l2ZW4gZWxlbWVudCwgd2hpY2ggaXMgcGFydCBvZiB0aGUKKyAgICAgKiBnaXZlbiBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHAgVGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgZWxlbWVudC4gVGhpcyBpcyB1c2VkIHdoZW4gZmlsZXMKKyAgICAgKiAgICAgICAgICBuZWVkIHRvIGJlIHJlc29sdmVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBpbi4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldC4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgYXR0cmlidXRlIHRvLiBUaGlzIG1heSBiZSBpbnRlcnByZXRlZAorICAgICAqICAgICAgICAgICAgICBvciBjb252ZXJ0ZWQgdG8gdGhlIG5lY2Vzc2FyeSB0eXBlIGlmIHRoZSBzZXR0ZXIgbWV0aG9kCisgICAgICogICAgICAgICAgICAgIGRvZXNuJ3QgYWNjZXB0IGFuIG9iamVjdCBvZiB0aGUgc3VwcGxpZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGludHJvc3BlY3RlZCBjbGFzcyBkb2Vzbid0IHN1cHBvcnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBhdHRyaWJ1dGUsIG9yIGlmIHRoZSBzZXR0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFByb2plY3QgcCwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBBdHRyaWJ1dGVTZXR0ZXIgYXMgPSAoQXR0cmlidXRlU2V0dGVyKSBhdHRyaWJ1dGVTZXR0ZXJzLmdldCgKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICBpZiAoYXMgPT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIER5bmFtaWNBdHRyaWJ1dGVOUykgeworICAgICAgICAgICAgICAgIER5bmFtaWNBdHRyaWJ1dGVOUyBkYyA9IChEeW5hbWljQXR0cmlidXRlTlMpIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaVBsdXNQcmVmaXggPSBQcm9qZWN0SGVscGVyLmV4dHJhY3RVcmlGcm9tQ29tcG9uZW50TmFtZShhdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gUHJvamVjdEhlbHBlci5leHRyYWN0VXJpRnJvbUNvbXBvbmVudE5hbWUodXJpUGx1c1ByZWZpeCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IFByb2plY3RIZWxwZXIuZXh0cmFjdE5hbWVGcm9tQ29tcG9uZW50TmFtZShhdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSAiIi5lcXVhbHModXJpKSA/IGxvY2FsTmFtZSA6IHVyaSArICI6IiArIGxvY2FsTmFtZTsKKyAgICAgICAgICAgICAgICBkYy5zZXREeW5hbWljQXR0cmlidXRlKHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgdmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEeW5hbWljQXR0cmlidXRlKSB7CisgICAgICAgICAgICAgICAgRHluYW1pY0F0dHJpYnV0ZSBkYyA9IChEeW5hbWljQXR0cmlidXRlKSBlbGVtZW50OworICAgICAgICAgICAgICAgIGRjLnNldER5bmFtaWNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5pbmRleE9mKCc6JykgPj0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JlIGF0dHJpYnV0ZSBmcm9tIHVua25vd24gdXJpJ3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSBnZXRFbGVtZW50TmFtZShwLCBlbGVtZW50KQorICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCBzdXBwb3J0IHRoZSBcIiIgKyBhdHRyaWJ1dGVOYW1lICsgIlwiIGF0dHJpYnV0ZS4iOworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQXR0cmlidXRlRXhjZXB0aW9uKG1zZywgYXR0cmlidXRlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzLnNldE9iamVjdChwLCBlbGVtZW50LCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIC8vIGltcG9zc2libGUgYXMgZ2V0TWV0aG9kcyBzaG91bGQgb25seSByZXR1cm4gcHVibGljIG1ldGhvZHMKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpZSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7CisgICAgICAgICAgICB0aHJvdyBleHRyYWN0QnVpbGRFeGNlcHRpb24oaXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWVkIGF0dHJpYnV0ZSBpbiB0aGUgZ2l2ZW4gZWxlbWVudCwgd2hpY2ggaXMgcGFydCBvZiB0aGUKKyAgICAgKiBnaXZlbiBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHAgVGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgZWxlbWVudC4gVGhpcyBpcyB1c2VkIHdoZW4gZmlsZXMKKyAgICAgKiAgICAgICAgICBuZWVkIHRvIGJlIHJlc29sdmVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBpbi4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldC4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgYXR0cmlidXRlIHRvLiBUaGlzIG1heSBiZSBpbnRlcnByZXRlZAorICAgICAqICAgICAgICAgICAgICBvciBjb252ZXJ0ZWQgdG8gdGhlIG5lY2Vzc2FyeSB0eXBlIGlmIHRoZSBzZXR0ZXIgbWV0aG9kCisgICAgICogICAgICAgICAgICAgIGRvZXNuJ3QganVzdCB0YWtlIGEgc3RyaW5nLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGludHJvc3BlY3RlZCBjbGFzcyBkb2Vzbid0IHN1cHBvcnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBhdHRyaWJ1dGUsIG9yIGlmIHRoZSBzZXR0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFByb2plY3QgcCwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHNldEF0dHJpYnV0ZShwLCBlbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCAoT2JqZWN0KSB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBQQ0RBVEEgdG8gYW4gZWxlbWVudCwgdXNpbmcgdGhlIGVsZW1lbnQncworICAgICAqIDxjb2RlPnZvaWQgYWRkVGV4dChTdHJpbmcpPC9jb2RlPiBtZXRob2QsIGlmIGl0IGhhcyBvbmUuIElmIG5vCisgICAgICogc3VjaCBtZXRob2QgaXMgcHJlc2VudCwgYSBCdWlsZEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlCisgICAgICogZ2l2ZW4gdGV4dCBjb250YWlucyBub24td2hpdGVzcGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHdoaWNoIHRoZSBlbGVtZW50IGlzIHBhcnQgb2YuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gYWRkIHRoZSB0ZXh0IHRvLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0ZXh0ICAgIFRoZSB0ZXh0IHRvIGFkZC4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgbm9uLXdoaXRlc3BhY2UgdGV4dCBpcyBwcm92aWRlZCBhbmQgbm8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBpcyBhdmFpbGFibGUgdG8gaGFuZGxlIGl0LCBvciBpZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhhbmRsaW5nIG1ldGhvZCBmYWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFByb2plY3QgcHJvamVjdCwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyB0ZXh0KQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoYWRkVGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC50cmltKCk7CisgICAgICAgICAgICAvLyBFbGVtZW50IGRvZXNuJ3QgaGFuZGxlIHRleHQgY29udGVudAorICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgd2hpdGVzcGFjZSAtIGlnbm9yZQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdCB3aGl0ZXNwYWNlIC0gZmFpbAorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHByb2plY3QuZ2V0RWxlbWVudE5hbWUoZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3Qgc3VwcG9ydCBuZXN0ZWQgdGV4dCBkYXRhIChcIiIgKyBjb25kZW5zZVRleHQodGV4dCkgKyAiXCIpLiIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhZGRUZXh0Lmludm9rZShlbGVtZW50LCBuZXcgT2JqZWN0W10ge3RleHR9KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSBhcyBnZXRNZXRob2RzIHNob3VsZCBvbmx5IHJldHVybiBwdWJsaWMgbWV0aG9kcworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGllKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKyAgICAgICAgICAgIHRocm93IGV4dHJhY3RCdWlsZEV4Y2VwdGlvbihpdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gdGhyb3cgYSBOb3RTdXBwb3J0ZWQgZXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgUHJvamVjdCBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBvYmplY3Qgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGEgcmVxdWVzdGVkIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIEVsZW1lbnQgd2hpY2ggaXMgdHJ5aW5nIHRvIGJlIGNyZWF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGhyb3dOb3RTdXBwb3J0ZWQoUHJvamVjdCBwcm9qZWN0LCBPYmplY3QgcGFyZW50LCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9IHByb2plY3QuZ2V0RWxlbWVudE5hbWUocGFyZW50KQorICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCBcIiIgKyBlbGVtZW50TmFtZSArICJcIiBlbGVtZW50LiI7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVsZW1lbnRFeGNlcHRpb24obXNnLCBlbGVtZW50TmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzcGVjaWZpYyBOZXN0ZWRDcmVhdG9yIGZvciBhIGdpdmVuIHByb2plY3QvcGFyZW50L2VsZW1lbnQgY29tYmluYXRpb24KKyAgICAgKiBAcGFyYW0gcHJvamVjdCBhbnQgcHJvamVjdAorICAgICAqIEBwYXJhbSBwYXJlbnRVcmkgVVJJIG9mIHRoZSBwYXJlbnQuCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNsYXNzCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lIGVsZW1lbnQgdG8gd29yayB3aXRoLiBUaGlzIGNhbiBjb250YWluCisgICAgICogIGEgVVJJLGxvY2FsbmFtZSB0dXBsZSBvZiBvZiB0aGUgZm9ybSB1cmk6bG9jYWxuYW1lCisgICAgICogQHBhcmFtIGNoaWxkIHRoZSBiaXQgb2YgWE1MIHRvIHdvcmsgd2l0aAorICAgICAqIEByZXR1cm4gYSBuZXN0ZWQgY3JlYXRvciB0aGF0IGNhbiBoYW5kbGUgdGhlIGNoaWxkIGVsZW1lbnRzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHBhcmVudCBkb2VzIG5vdCBzdXBwb3J0IGNoaWxkIGVsZW1lbnRzIG9mIHRoYXQgbmFtZQorICAgICAqLworICAgIHByaXZhdGUgTmVzdGVkQ3JlYXRvciBnZXROZXN0ZWRDcmVhdG9yKAorICAgICAgICBQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwYXJlbnRVcmksIE9iamVjdCBwYXJlbnQsCisgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSwgVW5rbm93bkVsZW1lbnQgY2hpbGQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHVyaSA9IFByb2plY3RIZWxwZXIuZXh0cmFjdFVyaUZyb21Db21wb25lbnROYW1lKGVsZW1lbnROYW1lKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBQcm9qZWN0SGVscGVyLmV4dHJhY3ROYW1lRnJvbUNvbXBvbmVudE5hbWUoZWxlbWVudE5hbWUpOworCisgICAgICAgIGlmICh1cmkuZXF1YWxzKFByb2plY3RIZWxwZXIuQU5UX0NPUkVfVVJJKSkgeworICAgICAgICAgICAgdXJpID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmVudFVyaS5lcXVhbHMoUHJvamVjdEhlbHBlci5BTlRfQ09SRV9VUkkpKSB7CisgICAgICAgICAgICBwYXJlbnRVcmkgPSAiIjsKKyAgICAgICAgfQorICAgICAgICBOZXN0ZWRDcmVhdG9yIG5jID0gbnVsbDsKKyAgICAgICAgaWYgKHVyaS5lcXVhbHMocGFyZW50VXJpKSB8fCB1cmkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgbmMgPSAoTmVzdGVkQ3JlYXRvcikgbmVzdGVkQ3JlYXRvcnMuZ2V0KG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5jID09IG51bGwpIHsKKyAgICAgICAgICAgIG5jID0gY3JlYXRlQWRkVHlwZUNyZWF0b3IocHJvamVjdCwgcGFyZW50LCBlbGVtZW50TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5jID09IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgRHluYW1pY0VsZW1lbnROUykgeworICAgICAgICAgICAgRHluYW1pY0VsZW1lbnROUyBkYyA9IChEeW5hbWljRWxlbWVudE5TKSBwYXJlbnQ7CisgICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSBjaGlsZCA9PSBudWxsID8gbmFtZSA6IGNoaWxkLmdldFFOYW1lKCk7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmVzdGVkRWxlbWVudCA9IGRjLmNyZWF0ZUR5bmFtaWNFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICBjaGlsZCA9PSBudWxsID8gIiIgOiBjaGlsZC5nZXROYW1lc3BhY2UoKSwgbmFtZSwgcU5hbWUpOworICAgICAgICAgICAgaWYgKG5lc3RlZEVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5jID0gbmV3IE5lc3RlZENyZWF0b3IobnVsbCkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgY3JlYXRlKFByb2plY3QgcHJvamVjdCwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5lc3RlZEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuYyA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIER5bmFtaWNFbGVtZW50KSB7CisgICAgICAgICAgICBEeW5hbWljRWxlbWVudCBkYyA9IChEeW5hbWljRWxlbWVudCkgcGFyZW50OworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG5lc3RlZEVsZW1lbnQgPSBkYy5jcmVhdGVEeW5hbWljRWxlbWVudChuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICAgICAgaWYgKG5lc3RlZEVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5jID0gbmV3IE5lc3RlZENyZWF0b3IobnVsbCkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgY3JlYXRlKFByb2plY3QgcHJvamVjdCwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5lc3RlZEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuYyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvd05vdFN1cHBvcnRlZChwcm9qZWN0LCBwYXJlbnQsIGVsZW1lbnROYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5hbWVkIG5lc3RlZCBlbGVtZW50LiBEZXBlbmRpbmcgb24gdGhlIHJlc3VsdHMgb2YgdGhlCisgICAgICogaW5pdGlhbCBpbnRyb3NwZWN0aW9uLCBlaXRoZXIgYSBtZXRob2QgaW4gdGhlIGdpdmVuIHBhcmVudCBpbnN0YW5jZQorICAgICAqIG9yIGEgc2ltcGxlIG5vLWFyZyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgZWxlbWVudCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgUHJvamVjdCB0byB3aGljaCB0aGUgcGFyZW50IG9iamVjdCBiZWxvbmdzLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGUgcmVzdWx0aW5nCisgICAgICogICAgICAgICAgICAgICAgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIFByb2plY3RDb21wb25lbnQsIGl0cworICAgICAqICAgICAgICAgICAgICAgIFByb2plY3QgcmVmZXJlbmNlIGlzIHNldCB0byB0aGlzIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcGFyZW50ICBQYXJlbnQgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBpbnN0YW5jZS4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgTmFtZSBvZiB0aGUgZWxlbWVudCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YuCisgICAgICogICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdHlwZQorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgorICAgICAqICAgICAgICAgICAgIFRoaXMgaXMgbm90IGEgbmFtZXNwYWNlIGF3YXJlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgbm8gbWV0aG9kIGlzIGF2YWlsYWJsZSB0byBjcmVhdGUgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlLCBvciBpZiB0aGUgY3JlYXRpbmcgbWV0aG9kIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRWxlbWVudChQcm9qZWN0IHByb2plY3QsIE9iamVjdCBwYXJlbnQsIFN0cmluZyBlbGVtZW50TmFtZSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIE5lc3RlZENyZWF0b3IgbmMgPSBnZXROZXN0ZWRDcmVhdG9yKHByb2plY3QsICIiLCBwYXJlbnQsIGVsZW1lbnROYW1lLCBudWxsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBuZXN0ZWRFbGVtZW50ID0gbmMuY3JlYXRlKHByb2plY3QsIHBhcmVudCwgbnVsbCk7CisgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRQcm9qZWN0UmVmZXJlbmNlKG5lc3RlZEVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5lc3RlZEVsZW1lbnQ7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIC8vIGltcG9zc2libGUgYXMgZ2V0TWV0aG9kcyBzaG91bGQgb25seSByZXR1cm4gcHVibGljIG1ldGhvZHMKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpZSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaW5lKSB7CisgICAgICAgICAgICAvLyBpbXBvc3NpYmxlIGFzIGdldE1ldGhvZHMgc2hvdWxkIG9ubHkgcmV0dXJuIHB1YmxpYyBtZXRob2RzCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW5lKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKyAgICAgICAgICAgIHRocm93IGV4dHJhY3RCdWlsZEV4Y2VwdGlvbihpdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJucyBhbiBvYmplY3QgdGhhdCBjcmVhdGVzIGFuZCBzdG9yZXMgYW4gb2JqZWN0CisgICAgICogZm9yIGFuIGVsZW1lbnQgb2YgYSBwYXJlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCAgICAgIFByb2plY3QgdG8gd2hpY2ggdGhlIHBhcmVudCBvYmplY3QgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gcGFyZW50VXJpICAgIFRoZSBuYW1lc3BhY2UgdXJpIG9mIHRoZSBwYXJlbnQgb2JqZWN0LgorICAgICAqIEBwYXJhbSBwYXJlbnQgICAgICAgUGFyZW50IG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgY3JlYXRvciBvYmplY3QgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSBhbmQgc3RvcmUgYW5kIGluc3RhbmNlIG9mIGEgc3ViZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgIE5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mLgorICAgICAqIEBwYXJhbSB1ZSAgICAgICAgICAgVGhlIHVua25vd24gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQuCisgICAgICogQHJldHVybiBhIGNyZWF0b3Igb2JqZWN0IHRvIGNyZWF0ZSBhbmQgc3RvcmUgdGhlIGVsZW1lbnQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIENyZWF0b3IgZ2V0RWxlbWVudENyZWF0b3IoCisgICAgICAgIFByb2plY3QgcHJvamVjdCwgU3RyaW5nIHBhcmVudFVyaSwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIGVsZW1lbnROYW1lLCBVbmtub3duRWxlbWVudCB1ZSkgeworICAgICAgICBOZXN0ZWRDcmVhdG9yIG5jID0gZ2V0TmVzdGVkQ3JlYXRvcihwcm9qZWN0LCBwYXJlbnRVcmksIHBhcmVudCwgZWxlbWVudE5hbWUsIHVlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDcmVhdG9yKHByb2plY3QsIHBhcmVudCwgbmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3MgaXMgYSBkeW5hbWljIG9uZSwKKyAgICAgKiBzdXBwb3J0aW5nIGFyYml0cmFyeSBuZXN0ZWQgZWxlbWVudHMgYW5kL29yIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8Y29kZT4gaWYgdGhlIGludHJvc3BlY3RlZCBjbGFzcyBpcyBkeW5hbWljOworICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8Y29kZT4gb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKgorICAgICAqIEBzZWUgRHluYW1pY0VsZW1lbnQKKyAgICAgKiBAc2VlIER5bmFtaWNFbGVtZW50TlMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7CisgICAgICAgIHJldHVybiBEeW5hbWljRWxlbWVudC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJlYW4pCisgICAgICAgICAgICAgICAgfHwgRHluYW1pY0VsZW1lbnROUy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJlYW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3MgaXMgYSB0YXNrIGNvbnRhaW5lciwKKyAgICAgKiBzdXBwb3J0aW5nIGFyYml0cmFyeSBuZXN0ZWQgdGFza3MvdHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8Y29kZT4gaWYgdGhlIGludHJvc3BlY3RlZCBjbGFzcyBpcyBhIGNvbnRhaW5lcjsKKyAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPGNvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICoKKyAgICAgKiBAc2VlIFRhc2tDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKKyAgICAgICAgcmV0dXJuIFRhc2tDb250YWluZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiZWFuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBlbGVtZW50IHN1cHBvcnRzIGEgbmVzdGVkIGVsZW1lbnQgb2YgdGhlCisgICAgICogZ2l2ZW4gbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIGVsZW1lbnQgYmVpbmcgY2hlY2tlZAorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBuZXN0ZWQgZWxlbWVudCBpcyBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c05lc3RlZEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0c05lc3RlZEVsZW1lbnQoIiIsIGVsZW1lbnROYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSBpZiB0aGlzIGVsZW1lbnQgc3VwcG9ydHMgYSBuZXN0ZWQgZWxlbWVudCBvZiB0aGUKKyAgICAgKiBnaXZlbiBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudFVyaSAgIHRoZSB1cmkgb2YgdGhlIHBhcmVudAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIGVsZW1lbnQgYmVpbmcgY2hlY2tlZAorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBuZXN0ZWQgZWxlbWVudCBpcyBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c05lc3RlZEVsZW1lbnQoU3RyaW5nIHBhcmVudFVyaSwgU3RyaW5nIGVsZW1lbnROYW1lKSB7CisgICAgICAgIGlmIChpc0R5bmFtaWMoKSB8fCBhZGRUeXBlTWV0aG9kcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwcG9ydHNSZWZsZWN0RWxlbWVudChwYXJlbnRVcmksIGVsZW1lbnROYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGlzIGVsZW1lbnQgc3VwcG9ydHMgYSBuZXN0ZWQgZWxlbWVudCBmcm9tIHJlZmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRVcmkgICB0aGUgdXJpIG9mIHRoZSBwYXJlbnQKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIG5lc3RlZCBlbGVtZW50IGJlaW5nIGNoZWNrZWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmVzdGVkIGVsZW1lbnQgaXMgc3VwcG9ydGVkCisgICAgICogQHNpbmNlIEFudCAxLjguMAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUmVmbGVjdEVsZW1lbnQoCisgICAgICAgIFN0cmluZyBwYXJlbnRVcmksIFN0cmluZyBlbGVtZW50TmFtZSkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IFByb2plY3RIZWxwZXIuZXh0cmFjdE5hbWVGcm9tQ29tcG9uZW50TmFtZShlbGVtZW50TmFtZSk7CisgICAgICAgIGlmICghbmVzdGVkQ3JlYXRvcnMuY29udGFpbnNLZXkobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB1cmkgPSBQcm9qZWN0SGVscGVyLmV4dHJhY3RVcmlGcm9tQ29tcG9uZW50TmFtZShlbGVtZW50TmFtZSk7CisgICAgICAgIGlmICh1cmkuZXF1YWxzKFByb2plY3RIZWxwZXIuQU5UX0NPUkVfVVJJKSkgeworICAgICAgICAgICAgdXJpID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCIiLmVxdWFscyh1cmkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyZW50VXJpLmVxdWFscyhQcm9qZWN0SGVscGVyLkFOVF9DT1JFX1VSSSkpIHsKKyAgICAgICAgICAgIHBhcmVudFVyaSA9ICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cmkuZXF1YWxzKHBhcmVudFVyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmVzIGEgbmFtZWQgbmVzdGVkIGVsZW1lbnQgdXNpbmcgYSBzdG9yYWdlIG1ldGhvZCBkZXRlcm1pbmVkCisgICAgICogYnkgdGhlIGluaXRpYWwgaW50cm9zcGVjdGlvbi4gSWYgbm8gYXBwcm9wcmlhdGUgc3RvcmFnZSBtZXRob2QKKyAgICAgKiBpcyBhdmFpbGFibGUsIHRoaXMgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCBJZ25vcmVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICogICAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCAgUGFyZW50IGluc3RhbmNlIHRvIHN0b3JlIHRoZSBjaGlsZCBpbi4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZCAgIENoaWxkIGluc3RhbmNlIHRvIHN0b3JlIGluIHRoZSBwYXJlbnQuCisgICAgICogICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSAgTmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudCB0byBzdG9yZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhpcyBtZXRob2QgcmV0dXJucyBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHN0b3JhZ2UgbWV0aG9kIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3JlRWxlbWVudChQcm9qZWN0IHByb2plY3QsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCwKKyAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZWxlbWVudE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE5lc3RlZENyZWF0b3IgbnMgPSAoTmVzdGVkQ3JlYXRvcikgbmVzdGVkQ3JlYXRvcnMuZ2V0KGVsZW1lbnROYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICBpZiAobnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBucy5zdG9yZShwYXJlbnQsIGNoaWxkKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSBhcyBnZXRNZXRob2RzIHNob3VsZCBvbmx5IHJldHVybiBwdWJsaWMgbWV0aG9kcworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGllKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpbmUpIHsKKyAgICAgICAgICAgIC8vIGltcG9zc2libGUgYXMgZ2V0TWV0aG9kcyBzaG91bGQgb25seSByZXR1cm4gcHVibGljIG1ldGhvZHMKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpbmUpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgeworICAgICAgICAgICAgdGhyb3cgZXh0cmFjdEJ1aWxkRXhjZXB0aW9uKGl0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGV4dHJhY3QgdGhlIGlubmVyIGZhdWx0IGZyb20gYW4ge0BsaW5rIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb259LCBhbmQgdHVybgorICAgICAqIGl0IGludG8gYSBCdWlsZEV4Y2VwdGlvbi4gSWYgaXQgaXMgYWxyZWFkeSBhIEJ1aWxkRXhjZXB0aW9uLCBpdCBpcyB0eXBlIGNhc3QgYW5kIHJldHVybmVkOyBpZgorICAgICAqIG5vdCBhIG5ldyBCdWlsZEV4Y2VwdGlvbiBpcyBjcmVhdGVkIGNvbnRhaW5pbmcgdGhlIGNoaWxkIGFzIG5lc3RlZCB0ZXh0LgorICAgICAqIEBwYXJhbSBpdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgZXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQnVpbGRFeGNlcHRpb24gZXh0cmFjdEJ1aWxkRXhjZXB0aW9uKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7CisgICAgICAgIFRocm93YWJsZSB0ID0gaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKEJ1aWxkRXhjZXB0aW9uKSB0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24odCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiBhIG5hbWVkIG5lc3RlZCBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHR5cGUgb2YuCisgICAgICogICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgbmVzdGVkIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICogICAgICAgICBUaGlzIHdpbGwgbmV2ZXIgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3MgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIG5hbWVkIG5lc3RlZCBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRFbGVtZW50VHlwZShTdHJpbmcgZWxlbWVudE5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzIG50ID0gKENsYXNzKSBuZXN0ZWRUeXBlcy5nZXQoZWxlbWVudE5hbWUpOworICAgICAgICBpZiAobnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRWxlbWVudEV4Y2VwdGlvbigiQ2xhc3MgIgorICAgICAgICAgICAgICAgICAgICArIGJlYW4uZ2V0TmFtZSgpICsgIiBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCBcIiIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50TmFtZSArICJcIiBlbGVtZW50LiIsIGVsZW1lbnROYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiBhIG5hbWVkIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gZmluZCB0aGUgdHlwZSBvZi4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiAgICAgICAgIFRoaXMgd2lsbCBuZXZlciBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGludHJvc3BlY3RlZCBjbGFzcyBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgbmFtZWQgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDbGFzcyBhdCA9IChDbGFzcykgYXR0cmlidXRlVHlwZXMuZ2V0KGF0dHJpYnV0ZU5hbWUpOworICAgICAgICBpZiAoYXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQXR0cmlidXRlRXhjZXB0aW9uKCJDbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICsgYmVhbi5nZXROYW1lKCkgKyAiIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgXCIiCisgICAgICAgICAgICAgICAgICAgICsgYXR0cmlidXRlTmFtZSArICJcIiBhdHRyaWJ1dGUuIiwgYXR0cmlidXRlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFkZFRleHQgbWV0aG9kIHdoZW4gdGhlIGludHJvc3BlY3RlZAorICAgICAqIGNsYXNzIHN1cHBvcnRzIG5lc3RlZCB0ZXh0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kIG9uIHRoaXMgaW50cm9zcGVjdGVkIGNsYXNzIHRoYXQgYWRkcyBuZXN0ZWQgdGV4dC4KKyAgICAgKiAgICAgICAgIENhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3MgZG9lcyBub3QKKyAgICAgKiAgICAgICAgIHN1cHBvcnQgdGhlIG5lc3RlZCB0ZXh0LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldEFkZFRleHRNZXRob2QoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoIXN1cHBvcnRzQ2hhcmFjdGVycygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNsYXNzICIgKyBiZWFuLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCBzdXBwb3J0IG5lc3RlZCB0ZXh0IGRhdGEuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZFRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWRkZXIgb3IgY3JlYXRvciBtZXRob2Qgb2YgYSBuYW1lZCBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgZWxlbWVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBmaW5kIHRoZSBzZXR0ZXIKKyAgICAgKiAgICAgICAgIG1ldGhvZCBvZi4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kIG9uIHRoaXMgaW50cm9zcGVjdGVkIGNsYXNzIHRoYXQgYWRkcyBvciBjcmVhdGVzIHRoaXMKKyAgICAgKiAgICAgICAgIG5lc3RlZCBlbGVtZW50LiBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB0aGUgaW50cm9zcGVjdGVkCisgICAgICogICAgICAgICBjbGFzcyBpcyBhIGR5bmFtaWMgY29uZmlndXJhdG9yIQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGludHJvc3BlY3RlZCBjbGFzcyBkb2VzIG5vdAorICAgICAqICAgICAgICAgc3VwcG9ydCB0aGUgbmFtZWQgbmVzdGVkIGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgZ2V0RWxlbWVudE1ldGhvZChTdHJpbmcgZWxlbWVudE5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBjcmVhdG9yID0gbmVzdGVkQ3JlYXRvcnMuZ2V0KGVsZW1lbnROYW1lKTsKKyAgICAgICAgaWYgKGNyZWF0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRWxlbWVudEV4Y2VwdGlvbigiQ2xhc3MgIgorICAgICAgICAgICAgICAgICAgICArIGJlYW4uZ2V0TmFtZSgpICsgIiBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCBcIiIKKyAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50TmFtZSArICJcIiBlbGVtZW50LiIsIGVsZW1lbnROYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChOZXN0ZWRDcmVhdG9yKSBjcmVhdG9yKS5tZXRob2Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0dGVyIG1ldGhvZCBvZiBhIG5hbWVkIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgYXR0cmlidXRlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGZpbmQgdGhlIHNldHRlcgorICAgICAqICAgICAgICAgbWV0aG9kIG9mLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2Qgb24gdGhpcyBpbnRyb3NwZWN0ZWQgY2xhc3MgdGhhdCBzZXRzIHRoaXMgYXR0cmlidXRlLgorICAgICAqICAgICAgICAgVGhpcyB3aWxsIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGludHJvc3BlY3RlZCBjbGFzcyBkb2VzIG5vdAorICAgICAqICAgICAgICAgc3VwcG9ydCB0aGUgbmFtZWQgYXR0cmlidXRlLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldEF0dHJpYnV0ZU1ldGhvZChTdHJpbmcgYXR0cmlidXRlTmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHNldHRlciA9IGF0dHJpYnV0ZVNldHRlcnMuZ2V0KGF0dHJpYnV0ZU5hbWUpOworICAgICAgICBpZiAoc2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEF0dHJpYnV0ZUV4Y2VwdGlvbigiQ2xhc3MgIgorICAgICAgICAgICAgICAgICAgICArIGJlYW4uZ2V0TmFtZSgpICsgIiBkb2Vzbid0IHN1cHBvcnQgdGhlIFwiIgorICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZU5hbWUgKyAiXCIgYXR0cmlidXRlLiIsIGF0dHJpYnV0ZU5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEF0dHJpYnV0ZVNldHRlcikgc2V0dGVyKS5tZXRob2Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgaW50cm9zcGVjdGVkIGNsYXNzIHN1cHBvcnRzIFBDREFUQS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGludHJvc3BlY3RlZCBjbGFzcyBzdXBwb3J0cyBQQ0RBVEEuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDaGFyYWN0ZXJzKCkgeworICAgICAgICByZXR1cm4gYWRkVGV4dCAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGVzIHN1cHBvcnRlZCBieSB0aGUgaW50cm9zcGVjdGVkIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZXMgc3VwcG9ydGVkIGJ5IHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3MuCisgICAgICogQHNlZSAjZ2V0QXR0cmlidXRlTWFwCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVTZXR0ZXJzLmtleXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IG1hcCBvZiBhdHRyaWJ1dGVzIHN1cHBvcnRlZCBieSB0aGUgaW50cm9zcGVjdGVkIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBhdHRyaWJ1dGUgbmFtZSB0byBhdHRyaWJ1dGUgPGNvZGU+Q2xhc3M8L2NvZGU+CisgICAgICogICAgICAgICB1bm1vZGlmaWFibGUgbWFwLiBDYW4gYmUgZW1wdHksIGJ1dCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRBdHRyaWJ1dGVNYXAoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVUeXBlcy5pc0VtcHR5KCkKKyAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuRU1QVFlfTUFQIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGF0dHJpYnV0ZVR5cGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBuYW1lcyBvZiB0aGUgbmVzdGVkIGVsZW1lbnRzIHN1cHBvcnRlZAorICAgICAqIGJ5IHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBuYW1lcyBvZiB0aGUgbmVzdGVkIGVsZW1lbnRzIHN1cHBvcnRlZAorICAgICAqICAgICAgICAgYnkgdGhlIGludHJvc3BlY3RlZCBjbGFzcy4KKyAgICAgKiBAc2VlICNnZXROZXN0ZWRFbGVtZW50TWFwCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldE5lc3RlZEVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbmVzdGVkVHlwZXMua2V5cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSByZWFkLW9ubHkgbWFwIG9mIG5lc3RlZCBlbGVtZW50cyBzdXBwb3J0ZWQKKyAgICAgKiBieSB0aGUgaW50cm9zcGVjdGVkIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5lc3RlZC1lbGVtZW50IG5hbWUgdG8gbmVzdGVkLWVsZW1lbnQgPGNvZGU+Q2xhc3M8L2NvZGU+CisgICAgICogICAgICAgICB1bm1vZGlmaWFibGUgbWFwLiBDYW4gYmUgZW1wdHksIGJ1dCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXROZXN0ZWRFbGVtZW50TWFwKCkgeworICAgICAgICByZXR1cm4gbmVzdGVkVHlwZXMuaXNFbXB0eSgpCisgICAgICAgICAgICA/IENvbGxlY3Rpb25zLkVNUFRZX01BUCA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChuZXN0ZWRUeXBlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHJlYWQtb25seSBsaXN0IG9mIGV4dGVuc2lvbiBwb2ludHMgc3VwcG9ydGVkCisgICAgICogYnkgdGhlIGludHJvc3BlY3RlZCBjbGFzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHRhc2svdHlwZSBvciBuZXN0ZWQgZWxlbWVudCB3aXRoIHZvaWQgbWV0aG9kcyBuYW1lZCA8Y29kZT5hZGQoKTxjb2RlPgorICAgICAqIG9yIDxjb2RlPmFkZENvbmZpZ3VyZWQoKTwvY29kZT4sIHRha2luZyBhIHNpbmdsZSBjbGFzcyBvciBpbnRlcmZhY2UKKyAgICAgKiBhcmd1bWVudCwgc3VwcG9ydHMgZXh0ZW5zaW9ucyBwb2ludC4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbGlzdCBvZgorICAgICAqIGFsbCB0aGVzZSA8ZW0+dm9pZCBhZGRbQ29uZmlndXJlZF0odHlwZSk8L2VtPiBtZXRob2RzLgorICAgICAqCisgICAgICogQHJldHVybiBhIGxpc3Qgb2Ygdm9pZCwgc2luZ2xlIGFyZ3VtZW50IGFkZCgpIG9yIGFkZENvbmZpZ3VyZWQoKQorICAgICAqICAgICAgICAgPGNvZGU+TWV0aG9kPGNvZGU+cyBvZiBhbGwgc3VwcG9ydGVkIGV4dGVuc2lvbiBwb2ludHMuCisgICAgICogICAgICAgICBUaGVzZSBtZXRob2RzIGFyZSBzb3J0ZWQgc3VjaCB0aGF0IGlmIHRoZSBhcmd1bWVudCB0eXBlIG9mIGEKKyAgICAgKiAgICAgICAgIG1ldGhvZCBkZXJpdmVzIGZyb20gYW5vdGhlciB0eXBlIGFsc28gYW4gYXJndW1lbnQgb2YgYSBtZXRob2QKKyAgICAgKiAgICAgICAgIG9mIHRoaXMgbGlzdCwgdGhlIG1ldGhvZCB3aXRoIHRoZSBtb3N0IGRlcml2ZWQgYXJndW1lbnQgd2lsbAorICAgICAqICAgICAgICAgYWx3YXlzIGFwcGVhciBmaXJzdC4gQ2FuIGJlIGVtcHR5LCBidXQgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldEV4dGVuc2lvblBvaW50cygpIHsKKyAgICAgICAgcmV0dXJuIGFkZFR5cGVNZXRob2RzLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoYWRkVHlwZU1ldGhvZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgQXR0cmlidXRlU2V0dGVyIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiBhdHRyaWJ1dGUgdHlwZS4gQ29udmVyc2lvbnMgKHdoZXJlIG5lY2Vzc2FyeSkgYXJlIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBtYWRlIGZvciB0aGUgZm9sbG93aW5nIHR5cGVzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+U3RyaW5nIChsZWZ0IGFzIGl0IGlzKQorICAgICAqIDxsaT5DaGFyYWN0ZXIvY2hhciAoZmlyc3QgY2hhcmFjdGVyIGlzIHVzZWQpCisgICAgICogPGxpPkJvb2xlYW4vYm9vbGVhbgorICAgICAqICh7QGxpbmsgUHJvamVjdCN0b0Jvb2xlYW4oU3RyaW5nKSBQcm9qZWN0LnRvQm9vbGVhbihTdHJpbmcpfSBpcyB1c2VkKQorICAgICAqIDxsaT5DbGFzcyAoQ2xhc3MuZm9yTmFtZSBpcyB1c2VkKQorICAgICAqIDxsaT5GaWxlIChyZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgYXBwcm9wcmlhdGUgcHJvamVjdCkKKyAgICAgKiA8bGk+UGF0aCAocmVzb2x2ZSByZWxhdGl2ZSB0byB0aGUgYXBwcm9wcmlhdGUgcHJvamVjdCkKKyAgICAgKiA8bGk+RW51bWVyYXRlZEF0dHJpYnV0ZSAodXNlcyBpdHMgb3duCisgICAgICoge0BsaW5rIEVudW1lcmF0ZWRBdHRyaWJ1dGUjc2V0VmFsdWUoU3RyaW5nKSBzZXRWYWx1ZX0gbWV0aG9kKQorICAgICAqIDxsaT5PdGhlciBwcmltaXRpdmUgdHlwZXMgKHdyYXBwZXIgY2xhc3NlcyBhcmUgdXNlZCB3aXRoIGNvbnN0cnVjdG9ycworICAgICAqIHRha2luZyBTdHJpbmcpCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIElmIG5vbmUgb2YgdGhlIGFib3ZlIGNvdmVycyB0aGUgZ2l2ZW4gcGFyYW1ldGVycywgYSBjb25zdHJ1Y3RvciBmb3IgdGhlCisgICAgICogYXBwcm9wcmlhdGUgY2xhc3MgdGFraW5nIGEgU3RyaW5nIHBhcmFtZXRlciBpcyB1c2VkIGlmIGl0IGlzIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIFRoZSBtZXRob2QgdG8gaW52b2tlIG9uIHRoZSBiZWFuIHdoZW4gdGhlIHNldHRlciBpcyBpbnZva2VkLgorICAgICAqICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhcmcgVGhlIHR5cGUgb2YgdGhlIHNpbmdsZSBhcmd1bWVudCBvZiB0aGUgYmVhbidzIG1ldGhvZC4KKyAgICAgKiAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGZvciB3aGljaCB0aGUgc2V0dGVyIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGFwcHJvcHJpYXRlIEF0dHJpYnV0ZVNldHRlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICAgICAgIGlmIG5vIGFwcHJvcHJpYXRlIGNvbnZlcnNpb24gaXMgYXZhaWxhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgQXR0cmlidXRlU2V0dGVyIGNyZWF0ZUF0dHJpYnV0ZVNldHRlcihmaW5hbCBNZXRob2QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXR0ck5hbWUpIHsKKyAgICAgICAgLy8gdXNlIHdyYXBwZXJzIGZvciBwcmltaXRpdmUgY2xhc3NlcywgZS5nLiBpbnQgYW5kCisgICAgICAgIC8vIEludGVnZXIgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHkKKyAgICAgICAgZmluYWwgQ2xhc3MgcmVmbGVjdGVkQXJnID0gUFJJTUlUSVZFX1RZUEVfTUFQLmNvbnRhaW5zS2V5KGFyZykKKyAgICAgICAgICAgID8gKENsYXNzKSBQUklNSVRJVkVfVFlQRV9NQVAuZ2V0KGFyZykgOiBhcmc7CisKKyAgICAgICAgLy8gT2JqZWN0LmNsYXNzIC0gaXQgZ2V0cyBoYW5kbGVkIGRpZmZlcmVudGx5IGJ5IEF0dHJpYnV0ZVNldHRlcgorICAgICAgICBpZiAoamF2YS5sYW5nLk9iamVjdC5jbGFzcyA9PSByZWZsZWN0ZWRBcmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKG0sIGFyZykgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9qZWN0IHAsIE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsIGFudCBwcm9ibGVtIC0gdGhpcyBzaG91bGQgbm90IGdldCBjYWxsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIC8vIHNpbXBsZXN0IGNhc2UgLSBzZXRBdHRyaWJ1dGUgZXhwZWN0cyBTdHJpbmcKKyAgICAgICAgaWYgKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZXF1YWxzKHJlZmxlY3RlZEFyZykpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKG0sIGFyZykgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9qZWN0IHAsIE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCAoT2JqZWN0W10pIG5ldyBTdHJpbmdbXSB7dmFsdWV9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIC8vIGNoYXIgYW5kIENoYXJhY3RlciBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgLSB0YWtlIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgICAgaWYgKGphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MuZXF1YWxzKHJlZmxlY3RlZEFyZykpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKG0sIGFyZykgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChQcm9qZWN0IHAsIE9iamVjdCBwYXJlbnQsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHZhbHVlIFwiXCIgaXMgbm90IGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJsZWdhbCB2YWx1ZSBmb3IgYXR0cmlidXRlIFwiIiArIGF0dHJOYW1lICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCAoT2JqZWN0W10pIG5ldyBDaGFyYWN0ZXJbXSB7bmV3IENoYXJhY3Rlcih2YWx1ZS5jaGFyQXQoMCkpfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICAvLyBib29sZWFuIGFuZCBCb29sZWFuIGdldCBzcGVjaWFsIHRyZWF0bWVudCBiZWNhdXNlIHdlIGhhdmUgYSBuaWNlIG1ldGhvZCBpbiBQcm9qZWN0CisgICAgICAgIGlmIChqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5lcXVhbHMocmVmbGVjdGVkQXJnKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIobSwgYXJnKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIChPYmplY3RbXSkgbmV3IEJvb2xlYW5bXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC50b0Jvb2xlYW4odmFsdWUpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIC8vIENsYXNzIGRvZXNuJ3QgaGF2ZSBhIFN0cmluZyBjb25zdHJ1Y3RvciBidXQgYSBkZWNlbnQgZmFjdG9yeSBtZXRob2QKKyAgICAgICAgaWYgKGphdmEubGFuZy5DbGFzcy5jbGFzcy5lcXVhbHMocmVmbGVjdGVkQXJnKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIobSwgYXJnKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHtDbGFzcy5mb3JOYW1lKHZhbHVlKX0pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oY2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICAvLyByZXNvbHZlIHJlbGF0aXZlIHBhdGhzIHRocm91Z2ggUHJvamVjdAorICAgICAgICBpZiAoamF2YS5pby5GaWxlLmNsYXNzLmVxdWFscyhyZWZsZWN0ZWRBcmcpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcihtLCBhcmcpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoUHJvamVjdCBwLCBPYmplY3QgcGFyZW50LCBTdHJpbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHtwLnJlc29sdmVGaWxlKHZhbHVlKX0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgLy8gRW51bWVyYXRlZEF0dHJpYnV0ZXMgaGF2ZSB0aGVpciBvd24gaGVscGVyIGNsYXNzCisgICAgICAgIGlmIChFbnVtZXJhdGVkQXR0cmlidXRlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmVmbGVjdGVkQXJnKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIobSwgYXJnKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0ZWRBdHRyaWJ1dGUgZWEgPSAoRW51bWVyYXRlZEF0dHJpYnV0ZSkgcmVmbGVjdGVkQXJnLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlYS5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7ZWF9KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGllKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBBdHRyaWJ1dGVTZXR0ZXIgc2V0dGVyID0gZ2V0RW51bVNldHRlcihyZWZsZWN0ZWRBcmcsIG0sIGFyZyk7CisgICAgICAgIGlmIChzZXR0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHNldHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqYXZhLmxhbmcuTG9uZy5jbGFzcy5lcXVhbHMocmVmbGVjdGVkQXJnKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIobSwgYXJnKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoU3RyaW5nVXRpbHMucGFyc2VIdW1hblNpemVzKHZhbHVlKSkgfSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICAvLyB3b3JzdCBjYXNlLiBsb29rIGZvciBhIHB1YmxpYyBTdHJpbmcgY29uc3RydWN0b3IgYW5kIHVzZSBpdAorICAgICAgICAvLyBhbHNvIHN1cHBvcnRzIG5ldyBXaGF0ZXZlcihQcm9qZWN0LCBTdHJpbmcpIGFzIGZvciBQYXRoIG9yIFJlZmVyZW5jZQorICAgICAgICAvLyBUaGlzIGlzIHVzZWQgKGRlbGliZXJhdGVseSkgZm9yIGFsbCBwcmltaXRpdmVzL3dyYXBwZXJzIG90aGVyIHRoYW4KKyAgICAgICAgLy8gY2hhciwgYm9vbGVhbiwgYW5kIGxvbmcuCisgICAgICAgIGJvb2xlYW4gaW5jbHVkZVByb2plY3Q7CisgICAgICAgIENvbnN0cnVjdG9yIGM7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBGaXJzdCB0cnkgd2l0aCBQcm9qZWN0LgorICAgICAgICAgICAgYyA9IHJlZmxlY3RlZEFyZy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7UHJvamVjdC5jbGFzcywgU3RyaW5nLmNsYXNzfSk7CisgICAgICAgICAgICBpbmNsdWRlUHJvamVjdCA9IHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBubWUpIHsKKyAgICAgICAgICAgIC8vIE9LLCB0cnkgd2l0aG91dC4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYyA9IHJlZmxlY3RlZEFyZy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzfSk7CisgICAgICAgICAgICAgICAgaW5jbHVkZVByb2plY3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBubWUyKSB7CisgICAgICAgICAgICAgICAgLy8gV2VsbCwgbm8gbWF0Y2hpbmcgY29uc3RydWN0b3IuCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBmaW5hbEluY2x1ZGVQcm9qZWN0ID0gaW5jbHVkZVByb2plY3Q7CisgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yIGZpbmFsQ29uc3RydWN0b3IgPSBjOworCisgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKG0sIGFyZykgeworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBmaW5hbEluY2x1ZGVQcm9qZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgT2JqZWN0W10ge3AsIHZhbHVlfSA6IG5ldyBPYmplY3RbXSB7dmFsdWV9OworCisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhdHRyaWJ1dGUgPSBmaW5hbENvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGFyZ3MpOworICAgICAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwLnNldFByb2plY3RSZWZlcmVuY2UoYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7YXR0cmlidXRlfSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIEF0dHJpYnV0ZVNldHRlciBnZXRFbnVtU2V0dGVyKAorICAgICAgICBmaW5hbCBDbGFzcyByZWZsZWN0ZWRBcmcsIGZpbmFsIE1ldGhvZCBtLCBDbGFzcyBhcmcpIHsKKyAgICAgICAgQ2xhc3MgZW51bUNsYXNzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudW1DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5FbnVtIik7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgfQorICAgICAgICBpZiAoZW51bUNsYXNzICE9IG51bGwgJiYgZW51bUNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmVmbGVjdGVkQXJnKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZXR0ZXIobSwgYXJnKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBuZXcgT2JqZWN0W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0ZWRBcmcuZ2V0TWV0aG9kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlT2YiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzfSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge3ZhbHVlfSl9KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3RoZXJlIGlzIHNwZWNpZmljIGxvZ2ljIGhlcmUgZm9yIHRoZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVpbmcgb3V0IG9mIHRoZSBhbGxvd2VkIHNldCBvZiBlbnVtZXJhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiciICsgdmFsdWUgKyAiJyBpcyBub3QgYSBwZXJtaXR0ZWQgdmFsdWUgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZWZsZWN0ZWRBcmcuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vb25seSBpZiB0aGUgZXhjZXB0aW9uIGlzIG5vdCBhbiBJbGxlZ2FsQXJndW1lbnQgZG8gd2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvL0J1aWxkRXhjZXB0aW9uIHZpYSBleHRyYWN0QnVpbGRFeGNlcHRpb24oKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4dHJhY3RCdWlsZEV4Y2VwdGlvbih4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYW55IG90aGVyIGZhaWx1cmUgb2YgaW52b2tlKCkgdG8gd29yay4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBlbGVtZW50IGluCisgICAgICogcmVsYXRpb24gdG8gYSBnaXZlbiBwcm9qZWN0LiBUaGlzIGlzIHVzZWQgZm9yIGxvZ2dpbmcgcHVycG9zZXMKKyAgICAgKiB3aGVuIHRoZSBlbGVtZW50IGlzIGFza2VkIHRvIGNvcGUgd2l0aCBzb21lIGRhdGEgaXQgaGFzIG5vIHdheSBvZiBoYW5kbGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRoZSBlbGVtZW50IGlzIGRlZmluZWQgaW4uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gZGVzY3JpYmUuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50IHR5cGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRFbGVtZW50TmFtZShQcm9qZWN0IHByb2plY3QsIE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldEVsZW1lbnROYW1lKGVsZW1lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIHRoZSBuYW1lIG9mIGEgcHJvcGVydHkgZnJvbSBhIG1ldGhvZCBuYW1lIGJ5IHN1YnRyYWN0aW5nCisgICAgICogYSBnaXZlbiBwcmVmaXggYW5kIGNvbnZlcnRpbmcgaW50byBsb3dlciBjYXNlLiBJdCBpcyB1cCB0byBjYWxsaW5nCisgICAgICogY29kZSB0byBtYWtlIHN1cmUgdGhlIG1ldGhvZCBuYW1lIGRvZXMgYWN0dWFsbHkgYmVnaW4gd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcHJlZml4IC0gbm8gY2hlY2tpbmcgaXMgZG9uZSBpbiB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gcXVlc3Rpb24uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBwcmVmaXggICAgIFRoZSBwcmVmaXggdG8gcmVtb3ZlLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxvd2VyLWNhc2VkIG1ldGhvZCBuYW1lIHdpdGggdGhlIHByZWZpeCByZW1vdmVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWUuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdG9yIC0gYWxsb3dzIHVzZSBvZiBjcmVhdGUvc3RvcmUgZXh0ZXJuYWwKKyAgICAgKiB0byBJbnRyb3NwZWN0aW9uSGVscGVyLgorICAgICAqIFRoZSBjbGFzcyBpcyBmaW5hbCBhcyBpdCBoYXMgYSBwcml2YXRlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ3JlYXRvciB7CisgICAgICAgIHByaXZhdGUgTmVzdGVkQ3JlYXRvciBuZXN0ZWRDcmVhdG9yOworICAgICAgICBwcml2YXRlIE9iamVjdCBwYXJlbnQ7CisgICAgICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworICAgICAgICBwcml2YXRlIE9iamVjdCBuZXN0ZWRPYmplY3Q7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBvbHlUeXBlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IENyZWF0b3IgaW5zdGFuY2UuCisgICAgICAgICAqIFRoaXMgb2JqZWN0IGlzIGdpdmVuIHRvIHRoZSBVbmtub3duRWxlbWVudCB0byBjcmVhdGUKKyAgICAgICAgICogb2JqZWN0cyBmb3Igc3ViLWVsZW1lbnRzLiBVbmtub3duRWxlbWVudCBjYWxscworICAgICAgICAgKiBjcmVhdGUgdG8gY3JlYXRlIGFuIG9iamVjdCwgdGhlIG9iamVjdCB0aGVuIGdldHMKKyAgICAgICAgICogY29uZmlndXJlZCBhbmQgdGhlbiBVbmtub3duRWxlbWVudCBjYWxscyBzdG9yZS4KKyAgICAgICAgICogU2V0UG9seVR5cGUgbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIHR5cGUgdXNlZAorICAgICAgICAgKiB0byBjcmVhdGUgdGhlIG9iamVjdCB3aXRoLiBTZXRQb2x5VHlwZSBnZXRzIGNhbGxlZCBiZWZvcmUgY3JlYXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICAgICAqIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgb2JqZWN0IGluCisgICAgICAgICAqIEBwYXJhbSBuZXN0ZWRDcmVhdG9yIHRoZSBuZXN0ZWQgY3JlYXRvciBvYmplY3QgdG8gdXNlCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIENyZWF0b3IoUHJvamVjdCBwcm9qZWN0LCBPYmplY3QgcGFyZW50LCBOZXN0ZWRDcmVhdG9yIG5lc3RlZENyZWF0b3IpIHsKKyAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgICAgIHRoaXMubmVzdGVkQ3JlYXRvciA9IG5lc3RlZENyZWF0b3I7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB0byBvdmVycmlkZSB0aGUgY2xhc3MgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvbHlUeXBlIGEgYW50IGNvbXBvbmVudCB0eXBlIG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBvbHlUeXBlKFN0cmluZyBwb2x5VHlwZSkgeworICAgICAgICAgICAgdGhpcy5wb2x5VHlwZSA9IHBvbHlUeXBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBvYmplY3QgdXNpbmcgdGhpcyBjcmVhdG9yLCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IGludHJvc3BlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZSgpIHsKKyAgICAgICAgICAgIGlmIChwb2x5VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWRDcmVhdG9yLmlzUG9seU1vcnBoaWMoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBhbGxvd2VkIHRvIHVzZSB0aGUgcG9seW1vcnBoaWMgZm9ybSBmb3IgdGhpcyBlbGVtZW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKHByb2plY3QpOworICAgICAgICAgICAgICAgIG5lc3RlZE9iamVjdCA9IGhlbHBlci5jcmVhdGVDb21wb25lbnQocG9seVR5cGUpOworICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRPYmplY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgb2JqZWN0IG9mIHR5cGUgIiArIHBvbHlUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5lc3RlZE9iamVjdCA9IG5lc3RlZENyZWF0b3IuY3JlYXRlKHByb2plY3QsIHBhcmVudCwgbmVzdGVkT2JqZWN0KTsKKyAgICAgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0UHJvamVjdFJlZmVyZW5jZShuZXN0ZWRPYmplY3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmVzdGVkT2JqZWN0OworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGlmIChwb2x5VHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgdHlwZSB1c2VkICIgKyBwb2x5VHlwZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZXh0cmFjdEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSByZWFsIG9iamVjdCAodXNlZCBjdXJyZW50bHkgb25seSBmb3IgcHJlc2V0ZGVmKS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVhbE9iamVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXN0ZWRDcmVhdG9yLmdldFJlYWxPYmplY3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9yZXMgdGhlIG5lc3RlZCBlbGVtZW50IG9iamVjdCB1c2luZyBhIHN0b3JhZ2UgbWV0aG9kIGRldGVybWluZWQgYnkgaW50cm9zcGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuZXN0ZWRDcmVhdG9yLnN0b3JlKHBhcmVudCwgbmVzdGVkT2JqZWN0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAocG9seVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUgdXNlZCAiICsgcG9seVR5cGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IGV4dHJhY3RCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCB0byBjcmVhdGUgbmVzdGVkIGVsZW1lbnRzLiBOb3QgZG9jdW1lbnRlZAorICAgICAqIGluIGRldGFpbCBmb3IgcmVhc29ucyBvZiBzb3VyY2UgY29kZSByZWFkYWJpbGl0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBOZXN0ZWRDcmVhdG9yIHsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbWV0aG9kOyAvLyB0aGUgbWV0aG9kIGNhbGxlZCB0byBhZGQvY3JlYXRlIHRoZSBuZXN0ZWQgZWxlbWVudAorCisgICAgICAgIHByb3RlY3RlZCBOZXN0ZWRDcmVhdG9yKE1ldGhvZCBtKSB7CisgICAgICAgICAgICBtZXRob2QgPSBtOworICAgICAgICB9CisgICAgICAgIE1ldGhvZCBnZXRNZXRob2QoKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gaXNQb2x5TW9ycGhpYygpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgZ2V0UmVhbE9iamVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGFic3RyYWN0IE9iamVjdCBjcmVhdGUoUHJvamVjdCBwcm9qZWN0LCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpCisgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb247CisKKyAgICAgICAgdm9pZCBzdG9yZShPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpCisgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIERPIE5PVEhJTkcKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENyZWF0ZU5lc3RlZENyZWF0b3IgZXh0ZW5kcyBOZXN0ZWRDcmVhdG9yIHsKKyAgICAgICAgQ3JlYXRlTmVzdGVkQ3JlYXRvcihNZXRob2QgbSkgeworICAgICAgICAgICAgc3VwZXIobSk7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgY3JlYXRlKFByb2plY3QgcHJvamVjdCwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGlnbm9yZSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKCkuaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHt9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBWZXJzaW9uIHRvIHVzZSBmb3IgYWRkWFhYIGFuZCBhZGRDb25maWd1cmVkWFhYICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWRkTmVzdGVkQ3JlYXRvciBleHRlbmRzIE5lc3RlZENyZWF0b3IgeworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gMTsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBBRERfQ09ORklHVVJFRCA9IDI7CisKKyAgICAgICAgcHJpdmF0ZSBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYmVoYXZpb3I7IC8vIEFERCBvciBBRERfQ09ORklHVVJFRAorCisgICAgICAgIEFkZE5lc3RlZENyZWF0b3IoTWV0aG9kIG0sIENvbnN0cnVjdG9yIGMsIGludCBiZWhhdmlvcikgeworICAgICAgICAgICAgc3VwZXIobSk7CisgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gYzsKKyAgICAgICAgICAgIHRoaXMuYmVoYXZpb3IgPSBiZWhhdmlvcjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNQb2x5TW9ycGhpYygpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IGNyZWF0ZShQcm9qZWN0IHByb2plY3QsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoaWxkID0gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IE9iamVjdFtdIHt9IDogbmV3IE9iamVjdFtdIHtwcm9qZWN0fSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBQcmVTZXREZWYuUHJlU2V0RGVmaW5pdGlvbikgeworICAgICAgICAgICAgICAgIGNoaWxkID0gKChQcmVTZXREZWYuUHJlU2V0RGVmaW5pdGlvbikgY2hpbGQpLmNyZWF0ZU9iamVjdChwcm9qZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiZWhhdmlvciA9PSBBREQpIHsKKyAgICAgICAgICAgICAgICBpc3RvcmUocGFyZW50LCBjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hpbGQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0b3JlKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoYmVoYXZpb3IgPT0gQUREX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgICAgICBpc3RvcmUocGFyZW50LCBjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaXN0b3JlKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBnZXRNZXRob2QoKS5pbnZva2UocGFyZW50LCBuZXcgT2JqZWN0W10ge2NoaWxkfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCB0byBzZXR0aW5nIGVsZW1lbnQgYXR0cmlidXRlcy4gTm90IGRvY3VtZW50ZWQKKyAgICAgKiBpbiBkZXRhaWwgZm9yIHJlYXNvbnMgb2Ygc291cmNlIGNvZGUgcmVhZGFiaWxpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQXR0cmlidXRlU2V0dGVyIHsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbWV0aG9kOyAvLyB0aGUgbWV0aG9kIGNhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZQorICAgICAgICBwcml2YXRlIENsYXNzIHR5cGU7CisgICAgICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVTZXR0ZXIoTWV0aG9kIG0sIENsYXNzIHR5cGUpIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IG07CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0T2JqZWN0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IHZhbHVlKQorICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgdXNlVHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHNldCBwcmltaXRpdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0UHJvcGVydHlOYW1lKG1ldGhvZC5nZXROYW1lKCksICJzZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBudWxsIG9uICIgKyBwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVzZVR5cGUgPSAoQ2xhc3MpIFBSSU1JVElWRV9UWVBFX01BUC5nZXQodHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHVzZVR5cGUuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7dmFsdWV9KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldChwLCBwYXJlbnQsIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGFic3RyYWN0IHZvaWQgc2V0KFByb2plY3QgcCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIHN0YXRpYyBjYWNoZSBvZiBvbiBidWlsZCBmaW5pc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKKyAgICAgICAgSEVMUEVSUy5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIE5lc3RlZENyZWF0b3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgorICAgICAqIEBwYXJhbSBwcm9qZWN0IG93bmluZyBwcm9qZWN0CisgICAgICogQHBhcmFtIHBhcmVudCBQYXJlbnQgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgbmFtZSBvZiB0aGUgZWxlbWVudAorICAgICAqIEByZXR1cm4gYSBuZXN0ZWQgY3JlYXRvciwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBjb21wb25lbnQgb2YgdGhlIGdpdmVuIG5hbWUsIG9yIGl0CisgICAgICogICAgICAgIGhhcyBubyBtYXRjaGluZyBhZGQgdHlwZSBtZXRob2RzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgTmVzdGVkQ3JlYXRvciBjcmVhdGVBZGRUeXBlQ3JlYXRvcigKKyAgICAgICAgICAgIFByb2plY3QgcHJvamVjdCwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoYWRkVHlwZU1ldGhvZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKHByb2plY3QpOworCisgICAgICAgIE1ldGhvZEFuZE9iamVjdCByZXN0cmljdGVkID0gIGNyZWF0ZVJlc3RyaWN0ZWQoCisgICAgICAgICAgICBoZWxwZXIsIGVsZW1lbnROYW1lLCBhZGRUeXBlTWV0aG9kcyk7CisgICAgICAgIE1ldGhvZEFuZE9iamVjdCB0b3BMZXZlbCA9IGNyZWF0ZVRvcExldmVsKAorICAgICAgICAgICAgaGVscGVyLCBlbGVtZW50TmFtZSwgYWRkVHlwZU1ldGhvZHMpOworCisgICAgICAgIGlmIChyZXN0cmljdGVkID09IG51bGwgJiYgdG9wTGV2ZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdHJpY3RlZCAhPSBudWxsICYmIHRvcExldmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiYW1iaWd1b3VzOiB0eXBlIGFuZCBjb21wb25lbnQgZGVmaW5pdGlvbnMgZm9yICIKKyAgICAgICAgICAgICAgICArIGVsZW1lbnROYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIE1ldGhvZEFuZE9iamVjdCBtZXRob2RBbmRPYmplY3QKKyAgICAgICAgICAgID0gcmVzdHJpY3RlZCAhPSBudWxsID8gcmVzdHJpY3RlZCA6IHRvcExldmVsOworCisgICAgICAgIE9iamVjdCByT2JqZWN0ID0gbWV0aG9kQW5kT2JqZWN0Lm9iamVjdDsKKyAgICAgICAgaWYgKG1ldGhvZEFuZE9iamVjdC5vYmplY3QgaW5zdGFuY2VvZiBQcmVTZXREZWYuUHJlU2V0RGVmaW5pdGlvbikgeworICAgICAgICAgICAgck9iamVjdCA9ICgoUHJlU2V0RGVmLlByZVNldERlZmluaXRpb24pIG1ldGhvZEFuZE9iamVjdC5vYmplY3QpCisgICAgICAgICAgICAgICAgLmNyZWF0ZU9iamVjdChwcm9qZWN0KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBPYmplY3QgbmVzdGVkT2JqZWN0ID0gbWV0aG9kQW5kT2JqZWN0Lm9iamVjdDsKKyAgICAgICAgZmluYWwgT2JqZWN0IHJlYWxPYmplY3QgPSByT2JqZWN0OworCisgICAgICAgIHJldHVybiBuZXcgTmVzdGVkQ3JlYXRvcihtZXRob2RBbmRPYmplY3QubWV0aG9kKSB7CisgICAgICAgICAgICBPYmplY3QgY3JlYXRlKFByb2plY3QgcHJvamVjdCwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGlnbm9yZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmICghZ2V0TWV0aG9kKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCJDb25maWd1cmVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TWV0aG9kKCkuaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHtyZWFsT2JqZWN0fSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXN0ZWRPYmplY3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE9iamVjdCBnZXRSZWFsT2JqZWN0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZWFsT2JqZWN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHN0b3JlKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChnZXRNZXRob2QoKS5nZXROYW1lKCkuZW5kc1dpdGgoIkNvbmZpZ3VyZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBnZXRNZXRob2QoKS5pbnZva2UocGFyZW50LCBuZXcgT2JqZWN0W10ge3JlYWxPYmplY3R9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyBhbiBhZGQgb3IgYWRkQ29uZmlndXJlZCBtZXRob2QgaW50bworICAgICAqIHRoZSBhZGRUeXBlTWV0aG9kcyBhcnJheS4gVGhlIGFycmF5IGlzCisgICAgICogb3JkZXJlZCBzbyB0aGF0IHRoZSBtb3JlIGRlcml2ZWQgY2xhc3NlcyBhcmUgZmlyc3QuCisgICAgICogSWYgYm90aCBhZGQgYW5kIGFkZENvbmZpZ3VyZWQgYXJlIHByZXNlbnQsIHRoZSBhZGRDb25maWd1cmVkIHdpbGwgdGFrZSBwcmlvcml0eS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IHRvIGluc2VydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5zZXJ0QWRkVHlwZU1ldGhvZChNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIENsYXNzIGFyZ0NsYXNzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbMF07CisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgYWRkVHlwZU1ldGhvZHMuc2l6ZSgpOyArK2MpIHsKKyAgICAgICAgICAgIE1ldGhvZCBjdXJyZW50ID0gKE1ldGhvZCkgYWRkVHlwZU1ldGhvZHMuZ2V0KGMpOworICAgICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXS5lcXVhbHMoYXJnQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJhZGRDb25maWd1cmVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGNvbmZpZ3VyZWQgcmVwbGFjZXMgdGhlIGFkZCBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgYWRkVHlwZU1ldGhvZHMuc2V0KGMsIG1ldGhvZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSBwcmVzZW50CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3VycmVudC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLmlzQXNzaWduYWJsZUZyb20oYXJnQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgYWRkVHlwZU1ldGhvZHMuYWRkKGMsIG1ldGhvZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBoaWdoZXIgZGVyaXZlZAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFkZFR5cGVNZXRob2RzLmFkZChtZXRob2QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlYXJjaCB0aGUgbGlzdCBvZiBtZXRob2RzIHRvIGZpbmQgdGhlIGZpcnN0IG1ldGhvZAorICAgICAqIHRoYXQgaGFzIGEgcGFyYW1ldGVyIHRoYXQgYWNjZXB0cyB0aGUgbmVzdGVkIGVsZW1lbnQgb2JqZWN0LgorICAgICAqIEBwYXJhbSBwYXJhbUNsYXNzIHRoZSA8Y29kZT5DbGFzczwvY29kZT4gdHlwZSB0byBzZWFyY2ggZm9yLgorICAgICAqIEBwYXJhbSBtZXRob2RzIHRoZSA8Y29kZT5MaXN0PC9jb2RlPiBvZiBtZXRob2RzIHRvIHNlYXJjaC4KKyAgICAgKiBAcmV0dXJuIGEgbWF0Y2hpbmcgPGNvZGU+TWV0aG9kPC9jb2RlPjsgbnVsbCBpZiBub25lIGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIGZpbmRNYXRjaGluZ01ldGhvZChDbGFzcyBwYXJhbUNsYXNzLCBMaXN0IG1ldGhvZHMpIHsKKyAgICAgICAgaWYgKHBhcmFtQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3MgbWF0Y2hlZENsYXNzID0gbnVsbDsKKyAgICAgICAgTWV0aG9kIG1hdGNoZWRNZXRob2QgPSBudWxsOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOworICAgICAgICAgICAgQ2xhc3MgIG1ldGhvZENsYXNzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbMF07CisgICAgICAgICAgICBpZiAobWV0aG9kQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJhbUNsYXNzKSkgeworICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtYXRjaGVkQ2xhc3MgPSBtZXRob2RDbGFzczsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZE1ldGhvZCA9IG1ldGhvZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtZXRob2RDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG1hdGNoZWRDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJhbWJpZ3VvdXM6IHR5cGVzICIgKyBtYXRjaGVkQ2xhc3MuZ2V0TmFtZSgpICsgIiBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWV0aG9kQ2xhc3MuZ2V0TmFtZSgpICsgIiBtYXRjaCAiICsgcGFyYW1DbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF0Y2hlZE1ldGhvZDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjb25kZW5zZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPD0gTUFYX1JFUE9SVF9ORVNURURfVEVYVCkgeworICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KKyAgICAgICAgaW50IGVuZHMgPSAoTUFYX1JFUE9SVF9ORVNURURfVEVYVCAtIEVMTElQU0lTLmxlbmd0aCgpKSAvIDI7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVmZmVyKHRleHQpLnJlcGxhY2UoZW5kcywgdGV4dC5sZW5ndGgoKSAtIGVuZHMsIEVMTElQU0lTKS50b1N0cmluZygpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBjbGFzcyBNZXRob2RBbmRPYmplY3QgeworICAgICAgICBwcml2YXRlIE1ldGhvZCBtZXRob2Q7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IG9iamVjdDsKKyAgICAgICAgcHVibGljIE1ldGhvZEFuZE9iamVjdChNZXRob2QgbWV0aG9kLCBPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKyAgICAgICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIEFudFR5cGVEZWZpbml0aW9uIGZpbmRSZXN0cmljdGVkRGVmaW5pdGlvbigKKyAgICAgICAgQ29tcG9uZW50SGVscGVyIGhlbHBlciwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIExpc3QgbWV0aG9kcykgeworICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKKyAgICAgICAgQ2xhc3MgbWF0Y2hlZERlZmluaXRpb25DbGFzcyA9IG51bGw7CisKKyAgICAgICAgTGlzdCBkZWZpbml0aW9ucyA9IGhlbHBlci5nZXRSZXN0cmljdGVkRGVmaW5pdGlvbnMoY29tcG9uZW50TmFtZSk7CisgICAgICAgIGlmIChkZWZpbml0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlZmluaXRpb25zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkID0gKEFudFR5cGVEZWZpbml0aW9uKSBkZWZpbml0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICBDbGFzcyBleHBvc2VkQ2xhc3MgPSBkLmdldEV4cG9zZWRDbGFzcyhoZWxwZXIuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGlmIChleHBvc2VkQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCAgPSBmaW5kTWF0Y2hpbmdNZXRob2QoZXhwb3NlZENsYXNzLCBtZXRob2RzKTsKKyAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hdGNoZWREZWZpbml0aW9uQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImFtYmlndW91czogcmVzdHJpY3RlZCBkZWZpbml0aW9ucyBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIGNvbXBvbmVudE5hbWUgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaGVkRGVmaW5pdGlvbkNsYXNzICsgIiBhbmQgIiArIGV4cG9zZWRDbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaGVkRGVmaW5pdGlvbkNsYXNzID0gZXhwb3NlZENsYXNzOworICAgICAgICAgICAgZGVmaW5pdGlvbiA9IGQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZmluaXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRob2RBbmRPYmplY3QgY3JlYXRlUmVzdHJpY3RlZCgKKyAgICAgICAgQ29tcG9uZW50SGVscGVyIGhlbHBlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBMaXN0IGFkZFR5cGVNZXRob2RzKSB7CisKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gaGVscGVyLmdldFByb2plY3QoKTsKKworICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiByZXN0cmljdGVkRGVmaW5pdGlvbiA9CisgICAgICAgICAgICBmaW5kUmVzdHJpY3RlZERlZmluaXRpb24oaGVscGVyLCBlbGVtZW50TmFtZSwgYWRkVHlwZU1ldGhvZHMpOworCisgICAgICAgIGlmIChyZXN0cmljdGVkRGVmaW5pdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIE1ldGhvZCBhZGRNZXRob2QgPSBmaW5kTWF0Y2hpbmdNZXRob2QoCisgICAgICAgICAgICByZXN0cmljdGVkRGVmaW5pdGlvbi5nZXRFeHBvc2VkQ2xhc3MocHJvamVjdCksIGFkZFR5cGVNZXRob2RzKTsKKyAgICAgICAgaWYgKGFkZE1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkFudCBJbnRlcm5hbCBFcnJvciAtIGNvbnRyYWN0IG1pc21hdGNoIGZvciAiCisgICAgICAgICAgICAgICAgKyBlbGVtZW50TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IGFkZGVkT2JqZWN0ID0gcmVzdHJpY3RlZERlZmluaXRpb24uY3JlYXRlKHByb2plY3QpOworICAgICAgICBpZiAoYWRkZWRPYmplY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIG9iamVjdCAiICsgZWxlbWVudE5hbWUKKyAgICAgICAgICAgICAgICArICIgb2YgdHlwZSAiICsgcmVzdHJpY3RlZERlZmluaXRpb24uZ2V0VHlwZUNsYXNzKHByb2plY3QpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE1ldGhvZEFuZE9iamVjdChhZGRNZXRob2QsIGFkZGVkT2JqZWN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1ldGhvZEFuZE9iamVjdCBjcmVhdGVUb3BMZXZlbCgKKyAgICAgICAgQ29tcG9uZW50SGVscGVyIGhlbHBlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBMaXN0IG1ldGhvZHMpIHsKKyAgICAgICAgQ2xhc3MgY2xhenogPSBoZWxwZXIuZ2V0Q29tcG9uZW50Q2xhc3MoZWxlbWVudE5hbWUpOworICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgTWV0aG9kIGFkZE1ldGhvZCA9IGZpbmRNYXRjaGluZ01ldGhvZChjbGF6eiwgYWRkVHlwZU1ldGhvZHMpOworICAgICAgICBpZiAoYWRkTWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBhZGRlZE9iamVjdCA9IGhlbHBlci5jcmVhdGVDb21wb25lbnQoZWxlbWVudE5hbWUpOworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZEFuZE9iamVjdChhZGRNZXRob2QsIGFkZGVkT2JqZWN0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0xvY2F0aW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2NhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDMxMTkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworCisvKioKKyAqIFN0b3JlcyB0aGUgbG9jYXRpb24gb2YgYSBwaWVjZSBvZiB0ZXh0IHdpdGhpbiBhIGZpbGUgKGZpbGUgbmFtZSwKKyAqIGxpbmUgbnVtYmVyIGFuZCBjb2x1bW4gbnVtYmVyKS4gTm90ZSB0aGF0IHRoZSBjb2x1bW4gbnVtYmVyIGlzCisgKiBjdXJyZW50bHkgaWdub3JlZC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKiogTmFtZSBvZiB0aGUgZmlsZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKKyAgICAvKiogTGluZSBudW1iZXIgd2l0aGluIHRoZSBmaWxlLiAqLworICAgIHByaXZhdGUgaW50IGxpbmVOdW1iZXI7CisgICAgLyoqIENvbHVtbiBudW1iZXIgd2l0aGluIHRoZSBmaWxlLiAqLworICAgIHByaXZhdGUgaW50IGNvbHVtbk51bWJlcjsKKworICAgIC8qKiBMb2NhdGlvbiB0byB1c2Ugd2hlbiBvbmUgaXMgbmVlZGVkIGJ1dCBubyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2F0aW9uIFVOS05PV05fTE9DQVRJT04gPSBuZXcgTG9jYXRpb24oKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiAidW5rbm93biIgbG9jYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBMb2NhdGlvbigpIHsKKyAgICAgICAgdGhpcyhudWxsLCAwLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbG9jYXRpb24gY29uc2lzdGluZyBvZiBhIGZpbGUgbmFtZSBidXQgbm8gbGluZSBudW1iZXIgb3IKKyAgICAgKiBjb2x1bW4gbnVtYmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sCisgICAgICogICAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgdGhlIGxvY2F0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAge0BsaW5rICNVTktOT1dOX0xPQ0FUSU9OIFVOS05PV05fTE9DQVRJT059LgorICAgICAqLworICAgIHB1YmxpYyBMb2NhdGlvbihTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgdGhpcyhmaWxlTmFtZSwgMCwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvY2F0aW9uIGZyb20gdGhlIFNBWCBsb2NhdG9yIHVzaW5nIHRoZSBzeXN0ZW0gSUQgYXMKKyAgICAgKiB0aGUgZmlsZW5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYXRpb24oTG9jYXRvciBsb2MpIHsKKyAgICAgICAgdGhpcyhsb2MuZ2V0U3lzdGVtSWQoKSwgbG9jLmdldExpbmVOdW1iZXIoKSwgbG9jLmdldENvbHVtbk51bWJlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbG9jYXRpb24gY29uc2lzdGluZyBvZiBhIGZpbGUgbmFtZSwgbGluZSBudW1iZXIgYW5kCisgICAgICogY29sdW1uIG51bWJlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHRoZSBsb2NhdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgICAgICogICAgICAgICAgICAgICAgIHtAbGluayAjVU5LTk9XTl9MT0NBVElPTiBVTktOT1dOX0xPQ0FUSU9OfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lTnVtYmVyIExpbmUgbnVtYmVyIHdpdGhpbiB0aGUgZmlsZS4gVXNlIDAgZm9yIHVua25vd24KKyAgICAgKiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnMgd2l0aGluIGEgZmlsZS4KKyAgICAgKiBAcGFyYW0gY29sdW1uTnVtYmVyIENvbHVtbiBudW1iZXIgd2l0aGluIHRoZSBsaW5lLgorICAgICAqLworICAgIHB1YmxpYyBMb2NhdGlvbihTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyKSB7CisgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsICYmIGZpbGVOYW1lLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBGSUxFX1VUSUxTLmZyb21VUkkoZmlsZU5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOworICAgICAgICB9CisgICAgICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7CisgICAgICAgIHRoaXMuY29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGZpbGVuYW1lIHBvcnRpb24gb2YgdGhlIGxvY2F0aW9uCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworICAgICAgICByZXR1cm4gZmlsZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbGluZSBudW1iZXIKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY29sdW1uIG51bWJlcgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBjb2x1bW5OdW1iZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlsZSBuYW1lLCBsaW5lIG51bWJlciwgYSBjb2xvbiBhbmQgYSB0cmFpbGluZyBzcGFjZS4KKyAgICAgKiBBbiBlcnJvciBtZXNzYWdlIGNhbiBiZSBhcHBlbmRlZCBlYXNpbHkuIEZvciB1bmtub3duIGxvY2F0aW9ucywgYW4KKyAgICAgKiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIG9mIHRoZSBmb3JtIDxjb2RlPiJmaWxlTmFtZTpsaW5lTnVtYmVyOiAiPC9jb2RlPgorICAgICAqICAgICAgICAgaWYgYm90aCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZSBrbm93biwKKyAgICAgKiAgICAgICAgIDxjb2RlPiJmaWxlTmFtZTogIjwvY29kZT4gaWYgb25seSB0aGUgZmlsZSBuYW1lIGlzIGtub3duLAorICAgICAqICAgICAgICAgYW5kIHRoZSBlbXB0eSBzdHJpbmcgZm9yIHVua25vd24gbG9jYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZmlsZU5hbWUpOworCisgICAgICAgICAgICBpZiAobGluZU51bWJlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiOiIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZU51bWJlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjogIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1YWxpdHkgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBvdGhlciB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvdGhlciBvYmplY3QgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgYXMgdGhpcyBvYmplY3QuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEob3RoZXIuZ2V0Q2xhc3MoKSA9PSBnZXRDbGFzcygpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b1N0cmluZygpLmVxdWFscyhvdGhlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYXNoIG9wZXJhdGlvbi4KKyAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIGxvY2F0aW9uLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5oYXNoQ29kZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L01hZ2ljTmFtZXMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L01hZ2ljTmFtZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y4NTJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTWFnaWNOYW1lcy5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyOworCisvKioKKyAqIE1hZ2ljIG5hbWVzIHVzZWQgd2l0aGluIEFudC4KKyAqCisgKiBOb3QgYWxsIG1hZ2ljIG5hbWVzIGFyZSBoZXJlIHlldC4KKyAqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWFnaWNOYW1lcyB7CisKKyAgICBwcml2YXRlIE1hZ2ljTmFtZXMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJlZml4IGZvciBhbnRsaWIgVVJJczoKKyAgICAgKiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVExJQl9QUkVGSVggPSAiYW50bGliOiI7CisKKyAgICAvKioKKyAgICAgKiBBbnQgdmVyc2lvbiBwcm9wZXJ0eS4KKyAgICAgKiBWYWx1ZToge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfVkVSU0lPTiA9ICJhbnQudmVyc2lvbiI7CisKKyAgICAvKioKKyAgICAgKiBTeXN0ZW0gY2xhc3NwYXRoIHBvbGljeS4KKyAgICAgKiBWYWx1ZToge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9TWVNDTEFTU1BBVEggPSAiYnVpbGQuc3lzY2xhc3NwYXRoIjsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBzY3JpcHQgcmVwb3NpdG9yeSB1c2VkIGJ5IHRoZSBzY3JpcHQgcmVwbyB0YXNrLgorICAgICAqIFZhbHVlIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX1JFUE9TSVRPUlkgPSAib3JnLmFwYWNoZS5hbnQuc2NyaXB0cmVwbyI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlIHRvIHRoZSBTeXN0ZW0gQ2xhc3MgTG9hZGVyLgorICAgICAqIFZhbHVlIHtAdmFsdWV9CisgICAgICoqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9MT0FERVJfUkVGID0gImFudC5jb3JlTG9hZGVyIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGNhbiBwcm92aWRlIGFuIG92ZXJyaWRlIG9mIHRoZSByZXBvc2l0b3J5IGRpci4KKyAgICAgKiBmb3IgdGhlIGxpYnJhcmllcyB0YXNrCisgICAgICogVmFsdWUge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX0RJUl9QUk9QRVJUWSA9ICJhbnQubWF2ZW4ucmVwb3NpdG9yeS5kaXIiOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgcHJvcGVydHkgd2hpY2ggY2FuIHByb3ZpZGUgYW4gb3ZlcnJpZGUgb2YgdGhlIHJlcG9zaXRvcnkgVVJMLgorICAgICAqIGZvciB0aGUgbGlicmFyaWVzIHRhc2sKKyAgICAgKiBWYWx1ZSB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfVVJMX1BST1BFUlRZID0gImFudC5tYXZlbi5yZXBvc2l0b3J5LnVybCI7CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIHRoZSByZXNvdXJjZSB0aGF0IHRhc2tkZWZzIGFyZSBzdG9yZWQgdW5kZXIuCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS0RFRl9QUk9QRVJUSUVTX1JFU09VUkNFID0KKyAgICAgICAgICAgICIvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGVmYXVsdHMucHJvcGVydGllcyI7CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIHRoZSByZXNvdXJjZSB0aGF0IHR5cGVkZWZzIGFyZSBzdG9yZWQgdW5kZXIuCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRURFRlNfUFJPUEVSVElFU19SRVNPVVJDRSA9CisgICAgICAgICAgICAiL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL2RlZmF1bHRzLnByb3BlcnRpZXMiOworCisgICAgLyoqCisgICAgICogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IEFudCBleGVjdXRvci4KKyAgICAgKiBWYWx1ZToge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfRVhFQ1VUT1JfUkVGRVJFTkNFID0gImFudC5leGVjdXRvciI7CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSBkZWZpbmluZyB0aGUgY2xhc3NuYW1lIG9mIGFuIGV4ZWN1dG9yLgorICAgICAqIFZhbHVlOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9FWEVDVVRPUl9DTEFTU05BTUUgPSAiYW50LmV4ZWN1dG9yLmNsYXNzIjsKKworICAgIC8qKgorICAgICAqIHByb3BlcnR5IG5hbWUgZm9yIGJhc2VkaXIgb2YgdGhlIHByb2plY3QuCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9CQVNFRElSID0gImJhc2VkaXIiOworCisgICAgLyoqCisgICAgICogcHJvcGVydHkgZm9yIGFudCBmaWxlIG5hbWUuCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0ZJTEUgPSAiYW50LmZpbGUiOworCisgICAgLyoqCisgICAgICogUHJvcGVydHkgdXNlZCB0byBzdG9yZSB0aGUgamF2YSB2ZXJzaW9uIGFudCBpcyBydW5uaW5nIGluLgorICAgICAqIFZhbHVlOiB7QHZhbHVlfQorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0pBVkFfVkVSU0lPTiA9ICJhbnQuamF2YS52ZXJzaW9uIjsKKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IHVzZWQgdG8gc3RvcmUgdGhlIGxvY2F0aW9uIG9mIGFudC4KKyAgICAgKiBWYWx1ZToge0B2YWx1ZX0KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9IT01FID0gTGF1bmNoZXIuQU5USE9NRV9QUk9QRVJUWTsKKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IHVzZWQgdG8gc3RvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBhbnQgbGlicmFyeSAodHlwaWNhbGx5IHRoZSBhbnQuamFyIGZpbGUuKQorICAgICAqIFZhbHVlOiB7QHZhbHVlfQorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0xJQiA9ICJhbnQuY29yZS5saWIiOworCisgICAgLyoqCisgICAgICogcHJvcGVydHkgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBWYWx1ZToge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfSU1QTCA9ICJhbnQucmVnZXhwLnJlZ2V4cGltcGwiOworCisgICAgLyoqCisgICAgICogcHJvcGVydHkgdGhhdCBwcm92aWRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgamF2YWMncyBhbmQKKyAgICAgKiBqYXZhZG9jJ3Mgc291cmNlIGF0dHJpYnV0ZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqIFZhbHVlOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX0pBVkFDX1NPVVJDRSA9ICJhbnQuYnVpbGQuamF2YWMuc291cmNlIjsKKworICAgIC8qKgorICAgICAqIHByb3BlcnR5IHRoYXQgcHJvdmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGphdmFjJ3MgdGFyZ2V0IGF0dHJpYnV0ZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqIFZhbHVlOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX0pBVkFDX1RBUkdFVCA9ICJhbnQuYnVpbGQuamF2YWMudGFyZ2V0IjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIG1hZ2ljIHByb3BlcnR5IHRoYXQgY29udHJvbHMgY2xhc3Nsb2FkZXIgcmV1c2UuCisgICAgICogQHNpbmNlIEFudCAxLjQuCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSURfQ0xBU1NQQVRIX1JFVVNFX0xPQURFUiA9ICJhbnQucmV1c2UubG9hZGVyIjsKKworICAgIC8qKgorICAgICAqIFByZWZpeCB1c2VkIHRvIHN0b3JlIGNsYXNzbG9hZGVyIHJlZmVyZW5jZXMuCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSURfQ0xBU1NQQVRIX0xPQURFUl9QUkVGSVggPSAiYW50LmxvYWRlci4iOworCisgICAgLyoqCisgICAgICogUmVmZXJlbmNlIHVzZWQgdG8gc3RvcmUgdGhlIHByb3BlcnR5IGhlbHBlci4KKyAgICAgKiBWYWx1ZToge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZJRF9QUk9QRVJUWV9IRUxQRVIgPSAiYW50LlByb3BlcnR5SGVscGVyIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgSlZNIHN5c3RlbSBwcm9wZXJ0eSB3aGljaCBwcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgUHJvamVjdEhlbHBlciBjbGFzcyB0byB1c2UuCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9IRUxQRVJfQ0xBU1MgPSAib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmljZSBpZGVudGlmaWVyIGluIGphcnMgd2hpY2ggcHJvdmlkZSBQcm9qZWN0SGVscGVyIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBWYWx1ZToge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0hFTFBFUl9TRVJWSUNFID0KKyAgICAgICAgIk1FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXIiOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiBQcm9qZWN0SGVscGVyIHJlZmVyZW5jZSB0aGF0IHdlIGFkZCB0byBhIHByb2plY3QuCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSURfUFJPSkVDVF9IRUxQRVIgPSAiYW50LnByb2plY3RIZWxwZXIiOworCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L01haW4uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGZiMDYzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTEzOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkFudE1haW47CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5DbGFzc3BhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlByb3h5U2V0dXA7CisKKworLyoqCisgKiBDb21tYW5kIGxpbmUgZW50cnkgcG9pbnQgaW50byBBbnQuIFRoaXMgY2xhc3MgaXMgZW50ZXJlZCB2aWEgdGhlCisgKiBjYW5vbmljYWwgYHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluYCBlbnRyeSBwb2ludCBhbmQgcmVhZHMgdGhlCisgKiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBJdCB0aGVuIGFzc2VtYmxlcyBhbmQgZXhlY3V0ZXMgYW4gQW50CisgKiBwcm9qZWN0LgorICogPHA+CisgKiBJZiB5b3UgaW50ZWdyYXRpbmcgQW50IGludG8gc29tZSBvdGhlciB0b29sLCB0aGlzIGlzIG5vdCB0aGUgY2xhc3MKKyAqIHRvIHVzZSBhcyBhbiBlbnRyeSBwb2ludC4gUGxlYXNlIHNlZSB0aGUgc291cmNlIGNvZGUgb2YgdGhpcworICogY2xhc3MgdG8gc2VlIGhvdyBpdCBtYW5pcHVsYXRlcyB0aGUgQW50IHByb2plY3QgY2xhc3Nlcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluIGltcGxlbWVudHMgQW50TWFpbiB7CisKKyAgICAvKioKKyAgICAgKiBBIFNldCBvZiBhcmdzIGFyZSBhcmUgaGFuZGxlZCBieSB0aGUgbGF1bmNoZXIgYW5kIHNob3VsZAorICAgICAqIG5vdCBiZSBzZWVuIGJ5IE1haW4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0IExBVU5DSF9DT01NQU5EUyA9IG5ldyBIYXNoU2V0KCk7CisgICAgc3RhdGljIHsKKyAgICAgICAgTEFVTkNIX0NPTU1BTkRTLmFkZCgiLWxpYiIpOworICAgICAgICBMQVVOQ0hfQ09NTUFORFMuYWRkKCItY3AiKTsKKyAgICAgICAgTEFVTkNIX0NPTU1BTkRTLmFkZCgiLW5vY2xhc3NwYXRoIik7CisgICAgICAgIExBVU5DSF9DT01NQU5EUy5hZGQoIi0tbm9jbGFzc3BhdGgiKTsKKyAgICAgICAgTEFVTkNIX0NPTU1BTkRTLmFkZCgiLW5vdXNlcmxpYiIpOworICAgICAgICBMQVVOQ0hfQ09NTUFORFMuYWRkKCItbWFpbiIpOworICAgIH0KKworICAgIC8qKiBUaGUgZGVmYXVsdCBidWlsZCBmaWxlIG5hbWUuIHtAdmFsdWV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CVUlMRF9GSUxFTkFNRSA9ICJidWlsZC54bWwiOworCisgICAgLyoqIE91ciBjdXJyZW50IG1lc3NhZ2Ugb3V0cHV0IHN0YXR1cy4gRm9sbG93cyBQcm9qZWN0Lk1TR19YWFguICovCisgICAgcHJpdmF0ZSBpbnQgbXNnT3V0cHV0TGV2ZWwgPSBQcm9qZWN0Lk1TR19JTkZPOworCisgICAgLyoqIEZpbGUgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIGNvbmZpZ3VyYXRpb24uICovCisgICAgcHJpdmF0ZSBGaWxlIGJ1aWxkRmlsZTsgLyogbnVsbCAqLworCisgICAgLyoqIFN0cmVhbSB0byB1c2UgZm9yIGxvZ2dpbmcuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJpbnRTdHJlYW0gb3V0ID0gU3lzdGVtLm91dDsKKworICAgIC8qKiBTdHJlYW0gdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIGxvZ2dpbmcgZXJyb3IgbWVzc2FnZXMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJpbnRTdHJlYW0gZXJyID0gU3lzdGVtLmVycjsKKworICAgIC8qKiBUaGUgYnVpbGQgdGFyZ2V0cy4gKi8KKyAgICBwcml2YXRlIFZlY3RvciB0YXJnZXRzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIFNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGFza3MuICovCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGRlZmluZWRQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKyAgICAvKiogTmFtZXMgb2YgY2xhc3NlcyB0byBhZGQgYXMgbGlzdGVuZXJzIHRvIHByb2plY3QuICovCisgICAgcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzID0gbmV3IFZlY3RvcigxKTsKKworICAgIC8qKiBGaWxlIG5hbWVzIG9mIHByb3BlcnR5IGZpbGVzIHRvIGxvYWQgb24gc3RhcnR1cC4gKi8KKyAgICBwcml2YXRlIFZlY3RvciBwcm9wZXJ0eUZpbGVzID0gbmV3IFZlY3RvcigxKTsKKworICAgIC8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGJ1aWxkIGlzIHRvIHN1cHBvcnQgaW50ZXJhY3RpdmUgaW5wdXQgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYWxsb3dJbnB1dCA9IHRydWU7CisKKyAgICAvKioga2VlcCBnb2luZyBtb2RlICovCisgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBHb2luZ01vZGUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoZSBBbnQgbG9nZ2VyIGNsYXNzLiBUaGVyZSBtYXkgYmUgb25seSBvbmUgbG9nZ2VyLiBJdCB3aWxsIGhhdmUKKyAgICAgKiB0aGUgcmlnaHQgdG8gdXNlIHRoZSAnb3V0JyBQcmludFN0cmVhbS4gVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50cyB0aGUKKyAgICAgKiBCdWlsZExvZ2dlciBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9nZ2VyQ2xhc3NuYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBBbnQgSW5wdXRIYW5kbGVyIGNsYXNzLiAgVGhlcmUgbWF5IGJlIG9ubHkgb25lIGlucHV0CisgICAgICogaGFuZGxlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbnB1dEhhbmRsZXJDbGFzc25hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3Qgb3V0cHV0IHRvIHRoZSBsb2cgaXMgdG8gYmUgdW5hZG9ybmVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBlbWFjc01vZGUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgaW5zdGFuY2UgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuCisgICAgICogY29uc3RydWN0ZWQgYW5kIGlzIHJlYWR5IHRvIHJ1bi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVhZHlUb1J1biA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIG9ubHkgcGFyc2UgYW5kIGRpc3BsYXkgdGhlIHByb2plY3QgaGVscAorICAgICAqIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwcm9qZWN0SGVscCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgYSBsb2dmaWxlIGlzIGJlaW5nIHVzZWQuIFRoaXMgaXMgdXNlZCB0bworICAgICAqIGNoZWNrIGlmIHRoZSBvdXRwdXQgc3RyZWFtcyBtdXN0IGJlIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG9nRmlsZVVzZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIG9wdGlvbmFsIHRocmVhZCBwcmlvcml0eQorICAgICAqLworICAgIHByaXZhdGUgSW50ZWdlciB0aHJlYWRQcmlvcml0eSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBwcm94eSBmbGFnOiBkZWZhdWx0IGlzIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHByb3h5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIG1lc3NhZ2Ugb2YgdGhlIFRocm93YWJsZSBpZiBpdCAodGhlIG1lc3NhZ2UpIGlzIG5vdAorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHQgVGhyb3dhYmxlIHRvIHByaW50IHRoZSBtZXNzYWdlIG9mLgorICAgICAqICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRNZXNzYWdlKFRocm93YWJsZSB0KSB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gdC5nZXRNZXNzYWdlKCk7CisgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB1c2luZyB0aGUKKyAgICAgKiBhcmd1bWVudHMgc3BlY2lmaWVkLCBnaXZlcyBpdCBhbnkgZXh0cmEgdXNlciBwcm9wZXJ0aWVzIHdoaWNoIGhhdmUgYmVlbgorICAgICAqIHNwZWNpZmllZCwgYW5kIHRoZW4gcnVucyB0aGUgYnVpbGQgdXNpbmcgdGhlIGNsYXNzbG9hZGVyIHByb3ZpZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGFkZGl0aW9uYWxVc2VyUHJvcGVydGllcyBBbnkgZXh0cmEgcHJvcGVydGllcyB0byB1c2UgaW4gdGhpcworICAgICAqICAgICAgICBidWlsZC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBpcyB0aGUgZXF1aXZhbGVudCB0bworICAgICAqICAgICAgICBwYXNzaW5nIGluIGFuIGVtcHR5IHNldCBvZiBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSBjb3JlTG9hZGVyIENsYXNzbG9hZGVyIHVzZWQgZm9yIGNvcmUgY2xhc3Nlcy4gTWF5IGJlCisgICAgICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGluIHdoaWNoIGNhc2UgdGhlIHN5c3RlbSBjbGFzc2xvYWRlciBpcyB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydChTdHJpbmdbXSBhcmdzLCBQcm9wZXJ0aWVzIGFkZGl0aW9uYWxVc2VyUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY29yZUxvYWRlcikgeworICAgICAgICBNYWluIG0gPSBuZXcgTWFpbigpOworICAgICAgICBtLnN0YXJ0QW50KGFyZ3MsIGFkZGl0aW9uYWxVc2VyUHJvcGVydGllcywgY29yZUxvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgQW50CisgICAgICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3MKKyAgICAgKiBAcGFyYW0gYWRkaXRpb25hbFVzZXJQcm9wZXJ0aWVzIHByb3BlcnRpZXMgdG8gc2V0IGJleW9uZCB0aG9zZSB0aGF0CisgICAgICogICAgICAgIG1heSBiZSBzcGVjaWZpZWQgb24gdGhlIGFyZ3MgbGlzdAorICAgICAqIEBwYXJhbSBjb3JlTG9hZGVyIC0gbm90IHVzZWQKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBbnQoU3RyaW5nW10gYXJncywgUHJvcGVydGllcyBhZGRpdGlvbmFsVXNlclByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY29yZUxvYWRlcikgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEaWFnbm9zdGljcy52YWxpZGF0ZVZlcnNpb24oKTsKKyAgICAgICAgICAgIHByb2Nlc3NBcmdzKGFyZ3MpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXhjKSB7CisgICAgICAgICAgICBoYW5kbGVMb2dmaWxlKCk7CisgICAgICAgICAgICBwcmludE1lc3NhZ2UoZXhjKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWRkaXRpb25hbFVzZXJQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGFkZGl0aW9uYWxVc2VyUHJvcGVydGllcy5rZXlzKCk7CisgICAgICAgICAgICAgICAgICAgIGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBhZGRpdGlvbmFsVXNlclByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgICAgICAgICBkZWZpbmVkUHJvcHMucHV0KGtleSwgcHJvcGVydHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZXhwZWN0IHRoZSB3b3JzdAorICAgICAgICBpbnQgZXhpdENvZGUgPSAxOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBydW5CdWlsZChjb3JlTG9hZGVyKTsKKyAgICAgICAgICAgICAgICBleGl0Q29kZSA9IDA7CisgICAgICAgICAgICB9IGNhdGNoIChFeGl0U3RhdHVzRXhjZXB0aW9uIGVzZSkgeworICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gZXNlLmdldFN0YXR1cygpOworICAgICAgICAgICAgICAgIGlmIChleGl0Q29kZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGVzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBpZiAoZXJyICE9IFN5c3RlbS5lcnIpIHsKKyAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoYmUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXhjKSB7CisgICAgICAgICAgICBleGMucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBwcmludE1lc3NhZ2UoZXhjKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGhhbmRsZUxvZ2ZpbGUoKTsKKyAgICAgICAgfQorICAgICAgICBleGl0KGV4aXRDb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBleHBlY3RlZCB0byBjYWxsIHtAbGluayBTeXN0ZW0jZXhpdChpbnQpfSwgd2hpY2gKKyAgICAgKiBpcyB3aGF0IHRoZSBiYXNlIHZlcnNpb24gZG9lcy4KKyAgICAgKiBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byBkbyBzb21ldGhpbmcgZWxzZS4KKyAgICAgKiBAcGFyYW0gZXhpdENvZGUgY29kZSB0byBleGl0IHdpdGgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleGl0KGludCBleGl0Q29kZSkgeworICAgICAgICBTeXN0ZW0uZXhpdChleGl0Q29kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgbG9nZmlsZXMsIGlmIHdlIGhhdmUgYmVlbiB3cml0aW5nIHRvIHRoZW0uCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlTG9nZmlsZSgpIHsKKyAgICAgICAgaWYgKGlzTG9nRmlsZVVzZWQpIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21tYW5kIGxpbmUgZW50cnkgcG9pbnQuIFRoaXMgbWV0aG9kIGtpY2tzIG9mZiB0aGUgYnVpbGRpbmcKKyAgICAgKiBvZiBhIHByb2plY3Qgb2JqZWN0IGFuZCBleGVjdXRlcyBhIGJ1aWxkIHVzaW5nIGVpdGhlciBhIGdpdmVuCisgICAgICogdGFyZ2V0IG9yIHRoZSBkZWZhdWx0IHRhcmdldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIENvbW1hbmQgbGluZSBhcmd1bWVudHMuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgc3RhcnQoYXJncywgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB3aGVuIGNyZWF0aW5nIE1haW4gZm9yIGxhdGVyIGFyZyBwcm9jZXNzaW5nCisgICAgICogYW5kIHN0YXJ0dXAKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFpbigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLCB3aGljaCBwYXJzZXMgYW5kIGRlYWxzIHdpdGggY29tbWFuZCBsaW5lCisgICAgICogYXJndW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgYnVpbGQgZmlsZSBkb2Vzbid0IGV4aXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpcyBhIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54CisgICAgICovCisgICAgcHJvdGVjdGVkIE1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvY2Vzc0FyZ3MoYXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAqIFdoZW4gYW50IGlzIHN0YXJ0ZWQgZnJvbSBMYXVuY2hlciwgbGF1bmNoZXItb25seSBhcmd1bWVudHMgZG8gbm90IGdldAorICAgICAqIHBhc3NlZCB0aHJvdWdoIHRvIHRoaXMgcm91dGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FyZ3MoU3RyaW5nW10gYXJncykgeworICAgICAgICBTdHJpbmcgc2VhcmNoRm9yVGhpcyA9IG51bGw7CisgICAgICAgIFByaW50U3RyZWFtIGxvZ1RvID0gbnVsbDsKKworICAgICAgICAvLyBjeWNsZSB0aHJvdWdoIGdpdmVuIGFyZ3MKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBhcmcgPSBhcmdzW2ldOworCisgICAgICAgICAgICBpZiAoYXJnLmVxdWFscygiLWhlbHAiKSB8fCBhcmcuZXF1YWxzKCItaCIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiLXZlcnNpb24iKSkgeworICAgICAgICAgICAgICAgIHByaW50VmVyc2lvbigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiLWRpYWdub3N0aWNzIikpIHsKKyAgICAgICAgICAgICAgICBEaWFnbm9zdGljcy5kb1JlcG9ydChTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1xdWlldCIpIHx8IGFyZy5lcXVhbHMoIi1xIikpIHsKKyAgICAgICAgICAgICAgICBtc2dPdXRwdXRMZXZlbCA9IFByb2plY3QuTVNHX1dBUk47CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi12ZXJib3NlIikgfHwgYXJnLmVxdWFscygiLXYiKSkgeworICAgICAgICAgICAgICAgIHByaW50VmVyc2lvbigpOworICAgICAgICAgICAgICAgIG1zZ091dHB1dExldmVsID0gUHJvamVjdC5NU0dfVkVSQk9TRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiLWRlYnVnIikgfHwgYXJnLmVxdWFscygiLWQiKSkgeworICAgICAgICAgICAgICAgIHByaW50VmVyc2lvbigpOworICAgICAgICAgICAgICAgIG1zZ091dHB1dExldmVsID0gUHJvamVjdC5NU0dfREVCVUc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1ub2lucHV0IikpIHsKKyAgICAgICAgICAgICAgICBhbGxvd0lucHV0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1sb2dmaWxlIikgfHwgYXJnLmVxdWFscygiLWwiKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgbG9nRmlsZSA9IG5ldyBGaWxlKGFyZ3NbaSArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBsb2dUbyA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShsb2dGaWxlKSk7CisgICAgICAgICAgICAgICAgICAgIGlzTG9nRmlsZVVzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNhbm5vdCB3cml0ZSBvbiB0aGUgc3BlY2lmaWVkIGxvZyBmaWxlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJNYWtlIHN1cmUgdGhlIHBhdGggZXhpc3RzIGFuZCB5b3UgaGF2ZSB3cml0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJwZXJtaXNzaW9ucy4iOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2JlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiWW91IG11c3Qgc3BlY2lmeSBhIGxvZyBmaWxlIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAidXNpbmcgdGhlIC1sb2cgYXJndW1lbnQiOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1idWlsZGZpbGUiKSB8fCBhcmcuZXF1YWxzKCItZmlsZSIpCisgICAgICAgICAgICAgICAgICAgICAgIHx8IGFyZy5lcXVhbHMoIi1mIikpIHsKKyAgICAgICAgICAgICAgICBpID0gaGFuZGxlQXJnQnVpbGRGaWxlKGFyZ3MsIGkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItbGlzdGVuZXIiKSkgeworICAgICAgICAgICAgICAgIGkgPSBoYW5kbGVBcmdMaXN0ZW5lcihhcmdzLCBpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoIi1EIikpIHsKKyAgICAgICAgICAgICAgICBpID0gaGFuZGxlQXJnRGVmaW5lKGFyZ3MsIGkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItbG9nZ2VyIikpIHsKKyAgICAgICAgICAgICAgICBpID0gaGFuZGxlQXJnTG9nZ2VyKGFyZ3MsIGkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItaW5wdXRoYW5kbGVyIikpIHsKKyAgICAgICAgICAgICAgICBpID0gaGFuZGxlQXJnSW5wdXRIYW5kbGVyKGFyZ3MsIGkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItZW1hY3MiKSB8fCBhcmcuZXF1YWxzKCItZSIpKSB7CisgICAgICAgICAgICAgICAgZW1hY3NNb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiLXByb2plY3RoZWxwIikgfHwgYXJnLmVxdWFscygiLXAiKSkgeworICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgZmxhZyB0byBkaXNwbGF5IHRoZSB0YXJnZXRzIGFuZCBxdWl0CisgICAgICAgICAgICAgICAgcHJvamVjdEhlbHAgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItZmluZCIpIHx8IGFyZy5lcXVhbHMoIi1zIikpIHsKKyAgICAgICAgICAgICAgICAvLyBlYXQgdXAgbmV4dCBhcmcgaWYgcHJlc2VudCwgZGVmYXVsdCB0byBidWlsZC54bWwKKyAgICAgICAgICAgICAgICBpZiAoaSA8IGFyZ3MubGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBzZWFyY2hGb3JUaGlzID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlYXJjaEZvclRoaXMgPSBERUZBVUxUX0JVSUxEX0ZJTEVOQU1FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoIi1wcm9wZXJ0eWZpbGUiKSkgeworICAgICAgICAgICAgICAgIGkgPSBoYW5kbGVBcmdQcm9wZXJ0eUZpbGUoYXJncywgaSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi1rIikgfHwgYXJnLmVxdWFscygiLWtlZXAtZ29pbmciKSkgeworICAgICAgICAgICAgICAgIGtlZXBHb2luZ01vZGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItbmljZSIpKSB7CisgICAgICAgICAgICAgICAgaSA9IGhhbmRsZUFyZ05pY2UoYXJncywgaSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKExBVU5DSF9DT01NQU5EUy5jb250YWlucyhhcmcpKSB7CisgICAgICAgICAgICAgICAgLy9jYXRjaCBzY3JpcHQvYW50IG1pc21hdGNoIHdpdGggYSBtZWFuaW5nZnVsIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAvL3dlIGNvdWxkIGlnbm9yZSBpdCwgYnV0IHRoZXJlIGFyZSBsaWtlbHkgdG8gYmUgb3RoZXIKKyAgICAgICAgICAgICAgICAvL3ZlcnNpb24gcHJvYmxlbXMsIHNvIHdlIHN0YW1wIGRvd24gb24gdGhlIGNvbmZpZ3VyYXRpb24gbm93CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJBbnQncyBNYWluIG1ldGhvZCBpcyBiZWluZyBoYW5kZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiYW4gb3B0aW9uICIgKyBhcmcgKyAiIHRoYXQgaXMgb25seSBmb3IgdGhlIGxhdW5jaGVyIGNsYXNzLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGEgdmVyc2lvbiBtaXNtYXRjaCBiZXR3ZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInRoZSBhbnQgc2NyaXB0Ly5iYXQgZmlsZSBhbmQgQW50IGl0c2VsZi4iOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItYXV0b3Byb3h5IikpIHsKKyAgICAgICAgICAgICAgICBwcm94eSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGFyZ3MgdG8gcmVjb2duaXplIQorICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVW5rbm93biBhcmd1bWVudDogIiArIGFyZzsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKKyAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaWYgaXQncyBubyBvdGhlciBhcmcsIGl0IG1heSBiZSB0aGUgdGFyZ2V0CisgICAgICAgICAgICAgICAgdGFyZ2V0cy5hZGRFbGVtZW50KGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBidWlsZEZpbGUgd2FzIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwKKyAgICAgICAgaWYgKGJ1aWxkRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBidXQgLWZpbmQgdGhlbiBzZWFyY2ggZm9yIGl0CisgICAgICAgICAgICBpZiAoc2VhcmNoRm9yVGhpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRGaWxlID0gZmluZEJ1aWxkRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hGb3JUaGlzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVpbGRGaWxlID0gbmV3IEZpbGUoREVGQVVMVF9CVUlMRF9GSUxFTkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHN1cmUgYnVpbGRmaWxlIGV4aXN0cworICAgICAgICBpZiAoIWJ1aWxkRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZGZpbGU6ICIgKyBidWlsZEZpbGUgKyAiIGRvZXMgbm90IGV4aXN0ISIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCdWlsZCBmYWlsZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCdzIG5vdCBhIGRpcmVjdG9yeSAodGhpcyBmYWxscyBpbnRvIHRoZSB1bHRyYQorICAgICAgICAvLyBwYXJhbm9pZCBsZXRzIGNoZWNrIGV2ZXJ5dGhpbmcgY2F0ZWdvcnkKKworICAgICAgICBpZiAoYnVpbGRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2hhdD8gQnVpbGRmaWxlOiAiICsgYnVpbGRGaWxlICsgIiBpcyBhIGRpciEiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQnVpbGQgZmFpbGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3JtYWxpemUgYnVpbGRGaWxlIGZvciByZS1pbXBvcnQgZGV0ZWN0aW9uCisgICAgICAgIGJ1aWxkRmlsZSA9CisgICAgICAgICAgICBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkubm9ybWFsaXplKGJ1aWxkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgLy8gTG9hZCB0aGUgcHJvcGVydHkgZmlsZXMgc3BlY2lmaWVkIGJ5IC1wcm9wZXJ0eWZpbGUKKyAgICAgICAgbG9hZFByb3BlcnR5RmlsZXMoKTsKKworICAgICAgICBpZiAobXNnT3V0cHV0TGV2ZWwgPj0gUHJvamVjdC5NU0dfSU5GTykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCdWlsZGZpbGU6ICIgKyBidWlsZEZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvZ1RvICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dCA9IGxvZ1RvOworICAgICAgICAgICAgZXJyID0gbG9nVG87CisgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KG91dCk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKGVycik7CisgICAgICAgIH0KKyAgICAgICAgcmVhZHlUb1J1biA9IHRydWU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICBNZXRob2RzIGZvciBoYW5kbGluZyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKiogSGFuZGxlIHRoZSAtYnVpbGRmaWxlLCAtZmlsZSwgLWYgYXJndW1lbnQgKi8KKyAgICBwcml2YXRlIGludCBoYW5kbGVBcmdCdWlsZEZpbGUoU3RyaW5nW10gYXJncywgaW50IHBvcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVpbGRGaWxlID0gbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgYXJnc1srK3Bvc10ucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOworICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2JlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBidWlsZGZpbGUgd2hlbiB1c2luZyB0aGUgLWJ1aWxkZmlsZSBhcmd1bWVudCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgLyoqIEhhbmRsZSAtbGlzdGVuZXIgYXJndW1lbnQgKi8KKyAgICBwcml2YXRlIGludCBoYW5kbGVBcmdMaXN0ZW5lcihTdHJpbmdbXSBhcmdzLCBpbnQgcG9zKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaXN0ZW5lcnMuYWRkRWxlbWVudChhcmdzW3BvcyArIDFdKTsKKyAgICAgICAgICAgIHBvcysrOworICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2JlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIllvdSBtdXN0IHNwZWNpZnkgYSBjbGFzc25hbWUgd2hlbiAiCisgICAgICAgICAgICAgICAgKyAidXNpbmcgdGhlIC1saXN0ZW5lciBhcmd1bWVudCI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG9zOworICAgIH0KKworICAgIC8qKiBIYW5kbGVyIC1EIGFyZ3VtZW50ICovCisgICAgcHJpdmF0ZSBpbnQgaGFuZGxlQXJnRGVmaW5lKFN0cmluZ1tdIGFyZ3MsIGludCBhcmdQb3MpIHsKKyAgICAgICAgLyogSW50ZXJlc3RpbmdseSBlbm91Z2gsIHdlIGdldCB0byBoZXJlIHdoZW4gYSB1c2VyCisgICAgICAgICAqIHVzZXMgLURuYW1lPXZhbHVlLiBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCB0aGUgT1MKKyAgICAgICAgICogZ29lcyBhaGVhZCBhbmQgcGFyc2VzIHRoaXMgb3V0IHRvIGFyZ3MKKyAgICAgICAgICogICB7Ii1EbmFtZSIsICJ2YWx1ZSJ9CisgICAgICAgICAqIHNvIGluc3RlYWQgb2YgcGFyc2luZyBvbiAiPSIsIHdlIGp1c3QgbWFrZSB0aGUgIi1EIgorICAgICAgICAgKiBjaGFyYWN0ZXJzIGdvIGF3YXkgYW5kIHNraXAgb25lIGFyZ3VtZW50IGZvcndhcmQuCisgICAgICAgICAqCisgICAgICAgICAqIEkgZG9uJ3Qga25vdyBob3cgdG8gcHJlZGljdCB3aGVuIHRoZSBKREsgaXMgZ29pbmcKKyAgICAgICAgICogdG8gaGVscCBvciBub3QsIHNvIHdlIHNpbXBseSBsb29rIGZvciB0aGUgZXF1YWxzIHNpZ24uCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgYXJnID0gYXJnc1thcmdQb3NdOworICAgICAgICBTdHJpbmcgbmFtZSA9IGFyZy5zdWJzdHJpbmcoMiwgYXJnLmxlbmd0aCgpKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKyAgICAgICAgaW50IHBvc0VxID0gbmFtZS5pbmRleE9mKCI9Iik7CisgICAgICAgIGlmIChwb3NFcSA+IDApIHsKKyAgICAgICAgICAgIHZhbHVlID0gbmFtZS5zdWJzdHJpbmcocG9zRXEgKyAxKTsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBwb3NFcSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnUG9zIDwgYXJncy5sZW5ndGggLSAxKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGFyZ3NbKythcmdQb3NdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNaXNzaW5nIHZhbHVlIGZvciBwcm9wZXJ0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBkZWZpbmVkUHJvcHMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGFyZ1BvczsKKyAgICB9CisKKyAgICAvKiogSGFuZGxlIHRoZSAtbG9nZ2VyIGFyZ3VtZW50LiAqLworICAgIHByaXZhdGUgaW50IGhhbmRsZUFyZ0xvZ2dlcihTdHJpbmdbXSBhcmdzLCBpbnQgcG9zKSB7CisgICAgICAgIGlmIChsb2dnZXJDbGFzc25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJPbmx5IG9uZSBsb2dnZXIgY2xhc3MgbWF5IGJlIHNwZWNpZmllZC4iKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nZ2VyQ2xhc3NuYW1lID0gYXJnc1srK3Bvc107CisgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBhaW9vYmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHRoZSAtbG9nZ2VyIGFyZ3VtZW50Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICAvKiogSGFuZGxlIHRoZSAtaW5wdXRoYW5kbGVyIGFyZ3VtZW50LiAqLworICAgIHByaXZhdGUgaW50IGhhbmRsZUFyZ0lucHV0SGFuZGxlcihTdHJpbmdbXSBhcmdzLCBpbnQgcG9zKSB7CisgICAgICAgIGlmIChpbnB1dEhhbmRsZXJDbGFzc25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBpbnB1dCBoYW5kbGVyIGNsYXNzIG1heSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmUgc3BlY2lmaWVkLiIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnB1dEhhbmRsZXJDbGFzc25hbWUgPSBhcmdzWysrcG9zXTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFpb29iZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHVzaW5nIHRoZSAtaW5wdXRoYW5kbGVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcmd1bWVudCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgLyoqIEhhbmRsZSB0aGUgLXByb3BlcnR5ZmlsZSBhcmd1bWVudC4gKi8KKyAgICBwcml2YXRlIGludCBoYW5kbGVBcmdQcm9wZXJ0eUZpbGUoU3RyaW5nW10gYXJncywgaW50IHBvcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvcGVydHlGaWxlcy5hZGRFbGVtZW50KGFyZ3NbKytwb3NdKTsKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFpb29iZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJZb3UgbXVzdCBzcGVjaWZ5IGEgcHJvcGVydHkgZmlsZW5hbWUgd2hlbiAiCisgICAgICAgICAgICAgICAgKyAidXNpbmcgdGhlIC1wcm9wZXJ0eWZpbGUgYXJndW1lbnQiOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICAvKiogSGFuZGxlIHRoZSAtbmljZSBhcmd1bWVudC4gKi8KKyAgICBwcml2YXRlIGludCBoYW5kbGVBcmdOaWNlKFN0cmluZ1tdIGFyZ3MsIGludCBwb3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRocmVhZFByaW9yaXR5ID0gSW50ZWdlci5kZWNvZGUoYXJnc1srK3Bvc10pOworICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2JlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIllvdSBtdXN0IHN1cHBseSBhIG5pY2VuZXNzIHZhbHVlICgxLTEwKSIKKyAgICAgICAgICAgICAgICArICIgYWZ0ZXIgdGhlIC1uaWNlIG9wdGlvbiIpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgbmljZW5lc3MgdmFsdWU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFyZ3NbcG9zXSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhyZWFkUHJpb3JpdHkuaW50VmFsdWUoKSA8IFRocmVhZC5NSU5fUFJJT1JJVFkKKyAgICAgICAgICAgIHx8IHRocmVhZFByaW9yaXR5LmludFZhbHVlKCkgPiBUaHJlYWQuTUFYX1BSSU9SSVRZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk5pY2VuZXNzIHZhbHVlIGlzIG91dCBvZiB0aGUgcmFuZ2UgMS0xMCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICBvdGhlciBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKiBMb2FkIHRoZSBwcm9wZXJ0eSBmaWxlcyBzcGVjaWZpZWQgYnkgLXByb3BlcnR5ZmlsZSAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkUHJvcGVydHlGaWxlcygpIHsKKyAgICAgICAgZm9yIChpbnQgcHJvcGVydHlGaWxlSW5kZXggPSAwOworICAgICAgICAgICAgIHByb3BlcnR5RmlsZUluZGV4IDwgcHJvcGVydHlGaWxlcy5zaXplKCk7CisgICAgICAgICAgICAgcHJvcGVydHlGaWxlSW5kZXgrKykgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lCisgICAgICAgICAgICAgICAgPSAoU3RyaW5nKSBwcm9wZXJ0eUZpbGVzLmVsZW1lbnRBdChwcm9wZXJ0eUZpbGVJbmRleCk7CisgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGZpcyk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgbG9hZCBwcm9wZXJ0eSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlbmFtZSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShmaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCAtRCBwcm9wZXJ0aWVzIHRha2UgcHJlY2VkZW5jZQorICAgICAgICAgICAgRW51bWVyYXRpb24gcHJvcGVydHlOYW1lcyA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChwcm9wZXJ0eU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0eU5hbWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGRlZmluZWRQcm9wcy5nZXRQcm9wZXJ0eShuYW1lKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmluZWRQcm9wcy5wdXQobmFtZSwgcHJvcHMuZ2V0UHJvcGVydHkobmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciB0byBnZXQgdGhlIHBhcmVudCBmaWxlIGZvciBhIGdpdmVuIGZpbGUuCisgICAgICogPHA+CisgICAgICogQWRkZWQgdG8gc2ltdWxhdGUgRmlsZS5nZXRQYXJlbnRGaWxlKCkgZnJvbSBKREsgMS4yLgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgIEZpbGUgdG8gZmluZCBwYXJlbnQgb2YuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEByZXR1cm4gICAgICAgUGFyZW50IGZpbGUgb3IgbnVsbCBpZiBub25lCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGdldFBhcmVudEZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIEZpbGUgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CisKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIG1zZ091dHB1dExldmVsID49IFByb2plY3QuTVNHX1ZFUkJPU0UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoaW5nIGluICIgKyBwYXJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2ggcGFyZW50IGRpcmVjdG9yaWVzIGZvciB0aGUgYnVpbGQgZmlsZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUYWtlcyB0aGUgZ2l2ZW4gdGFyZ2V0IGFzIGEgc3VmZml4IHRvIGFwcGVuZCB0byBlYWNoCisgICAgICogcGFyZW50IGRpcmVjdG9yeSBpbiBzZWFyY2ggb2YgYSBidWlsZCBmaWxlLiAgT25jZSB0aGUKKyAgICAgKiByb290IG9mIHRoZSBmaWxlLXN5c3RlbSBoYXMgYmVlbiByZWFjaGVkIGFuIGV4Y2VwdGlvbgorICAgICAqIGlzIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCAgTGVhZiBkaXJlY3Rvcnkgb2Ygc2VhcmNoLgorICAgICAqICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHN1ZmZpeCAgU3VmZml4IGZpbGVuYW1lIHRvIGxvb2sgZm9yIGluIHBhcmVudHMuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgaGFuZGxlIHRvIHRoZSBidWlsZCBmaWxlIGlmIG9uZSBpcyBmb3VuZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBubyBidWlsZCBmaWxlIGlzIGZvdW5kCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGZpbmRCdWlsZEZpbGUoU3RyaW5nIHN0YXJ0LCBTdHJpbmcgc3VmZml4KQorICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1zZ091dHB1dExldmVsID49IFByb2plY3QuTVNHX0lORk8pIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoaW5nIGZvciAiICsgc3VmZml4ICsgIiAuLi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgcGFyZW50ID0gbmV3IEZpbGUobmV3IEZpbGUoc3RhcnQpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGFyZW50LCBzdWZmaXgpOworCisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0YXJnZXQgZmlsZSBleGlzdHMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgICAgICAgIHdoaWxlICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgLy8gY2hhbmdlIHRvIHBhcmVudCBkaXJlY3RvcnkKKyAgICAgICAgICAgIHBhcmVudCA9IGdldFBhcmVudEZpbGUocGFyZW50KTsKKworICAgICAgICAgICAgLy8gaWYgcGFyZW50IGlzIG51bGwsIHRoZW4gd2UgYXJlIGF0IHRoZSByb290IG9mIHRoZSBmcywKKyAgICAgICAgICAgIC8vIGNvbXBsYWluIHRoYXQgd2UgY2FuJ3QgZmluZCB0aGUgYnVpbGQgZmlsZS4KKyAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGxvY2F0ZSBhIGJ1aWxkIGZpbGUhIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlZnJlc2ggb3VyIGZpbGUgaGFuZGxlCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUocGFyZW50LCBzdWZmaXgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGJ1aWxkLiBJZiB0aGUgY29uc3RydWN0b3IgZm9yIHRoaXMgaW5zdGFuY2UgZmFpbGVkCisgICAgICogKGUuZy4gcmV0dXJuZWQgYWZ0ZXIgaXNzdWluZyBhIHdhcm5pbmcpLCB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29yZUxvYWRlciBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGZpbmQgY29yZSBjbGFzc2VzLgorICAgICAqICAgICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBzeXN0ZW0gY2xhc3Nsb2FkZXIgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGJ1aWxkIGZhaWxzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkJ1aWxkKENsYXNzTG9hZGVyIGNvcmVMb2FkZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFyZWFkeVRvUnVuKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgpOworICAgICAgICBwcm9qZWN0LnNldENvcmVMb2FkZXIoY29yZUxvYWRlcik7CisKKyAgICAgICAgVGhyb3dhYmxlIGVycm9yID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWRkQnVpbGRMaXN0ZW5lcnMocHJvamVjdCk7CisgICAgICAgICAgICBhZGRJbnB1dEhhbmRsZXIocHJvamVjdCk7CisKKyAgICAgICAgICAgIFByaW50U3RyZWFtIHNhdmVkRXJyID0gU3lzdGVtLmVycjsKKyAgICAgICAgICAgIFByaW50U3RyZWFtIHNhdmVkT3V0ID0gU3lzdGVtLm91dDsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHNhdmVkSW4gPSBTeXN0ZW0uaW47CisKKyAgICAgICAgICAgIC8vIHVzZSBhIHN5c3RlbSBtYW5hZ2VyIHRoYXQgcHJldmVudHMgZnJvbSBTeXN0ZW0uZXhpdCgpCisgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkc20gPSBudWxsOworICAgICAgICAgICAgb2xkc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisKKyAgICAgICAgICAgICAgICAvL1NlY3VyaXR5TWFuYWdlciBjYW4gbm90IGJlIGluc3RhbGxlZCBoZXJlIGZvciBiYWNrd2FyZHMKKyAgICAgICAgICAgICAgICAvL2NvbXBhdGliaWxpdHkgcmVhc29ucyAoUEQpLiBOZWVkcyB0byBiZSBsb2FkZWQgcHJpb3IgdG8KKyAgICAgICAgICAgICAgICAvL2FudCBjbGFzcyBpZiB3ZSBhcmUgZ29pbmcgdG8gaW1wbGVtZW50IGl0LgorICAgICAgICAgICAgICAgIC8vU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgTm9FeGl0U2VjdXJpdHlNYW5hZ2VyKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoYWxsb3dJbnB1dCkgeworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldERlZmF1bHRJbnB1dFN0cmVhbShTeXN0ZW0uaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0SW4obmV3IERlbXV4SW5wdXRTdHJlYW0ocHJvamVjdCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQobmV3IFByaW50U3RyZWFtKG5ldyBEZW11eE91dHB1dFN0cmVhbShwcm9qZWN0LCBmYWxzZSkpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShuZXcgRGVtdXhPdXRwdXRTdHJlYW0ocHJvamVjdCwgdHJ1ZSkpKTsKKworCisgICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0SGVscCkgeworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmZpcmVCdWlsZFN0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHRocmVhZCBwcmlvcml0aWVzCisgICAgICAgICAgICAgICAgaWYgKHRocmVhZFByaW9yaXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJTZXR0aW5nIEFudCdzIHRocmVhZCBwcmlvcml0eSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhyZWFkUHJpb3JpdHksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRQcmlvcml0eSh0aHJlYWRQcmlvcml0eS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc3dhbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3dlIGNhbm5vdCBzZXQgdGhlIHByaW9yaXR5IGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZygiQSBzZWN1cml0eSBtYW5hZ2VyIHJlZnVzZWQgdG8gc2V0IHRoZSAtbmljZSB2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKworICAgICAgICAgICAgICAgIHByb2plY3QuaW5pdCgpOworCisgICAgICAgICAgICAgICAgLy8gc2V0IHVzZXItZGVmaW5lIHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZGVmaW5lZFByb3BzLmtleXMoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBkZWZpbmVkUHJvcHMuZ2V0KGFyZyk7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KGFyZywgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAgICAgICAgIHByb2plY3Quc2V0S2VlcEdvaW5nTW9kZShrZWVwR29pbmdNb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAocHJveHkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9wcm94eSBzZXR1cCBpZiBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgIFByb3h5U2V0dXAgcHJveHlTZXR1cCA9IG5ldyBQcm94eVNldHVwKHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICBwcm94eVNldHVwLmVuYWJsZVByb3hpZXMoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBQcm9qZWN0SGVscGVyLmNvbmZpZ3VyZVByb2plY3QocHJvamVjdCwgYnVpbGRGaWxlKTsKKworICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0SGVscCkgeworICAgICAgICAgICAgICAgICAgICBwcmludERlc2NyaXB0aW9uKHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICBwcmludFRhcmdldHMocHJvamVjdCwgbXNnT3V0cHV0TGV2ZWwgPiBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSB0YXJnZXQgdG8gZXhlY3V0ZQorICAgICAgICAgICAgICAgIGlmICh0YXJnZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmdldERlZmF1bHRUYXJnZXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZEVsZW1lbnQocHJvamVjdC5nZXREZWZhdWx0VGFyZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0cyh0YXJnZXRzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gcHV0IGJhY2sgdGhlIG9yaWdpbmFsIHNlY3VyaXR5IG1hbmFnZXIKKyAgICAgICAgICAgICAgICAvL1RoZSBmb2xsb3dpbmcgd2lsbCBuZXZlciBldmFsIHRvIHRydWUuIChQRCkKKyAgICAgICAgICAgICAgICBpZiAob2xkc20gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9sZHNtKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KHNhdmVkT3V0KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKHNhdmVkRXJyKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0SW4oc2F2ZWRJbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICBlcnJvciA9IGV4YzsKKyAgICAgICAgICAgIHRocm93IGV4YzsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZSkgeworICAgICAgICAgICAgZXJyb3IgPSBlOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICghcHJvamVjdEhlbHApIHsKKyAgICAgICAgICAgICAgICBwcm9qZWN0LmZpcmVCdWlsZEZpbmlzaGVkKGVycm9yKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb2plY3QubG9nKGVycm9yLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgc3BlY2lmaWVkIGluIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLAorICAgICAqIGFsb25nIHdpdGggdGhlIGRlZmF1bHQgbGlzdGVuZXIsIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIGFkZCBsaXN0ZW5lcnMgdG8uCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQnVpbGRMaXN0ZW5lcnMoUHJvamVjdCBwcm9qZWN0KSB7CisKKyAgICAgICAgLy8gQWRkIHRoZSBkZWZhdWx0IGxpc3RlbmVyCisgICAgICAgIHByb2plY3QuYWRkQnVpbGRMaXN0ZW5lcihjcmVhdGVMb2dnZXIoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBsaXN0ZW5lcnMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAgIChCdWlsZExpc3RlbmVyKSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZShjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLCBCdWlsZExpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgICAgIHByb2plY3Quc2V0UHJvamVjdFJlZmVyZW5jZShsaXN0ZW5lcik7CisKKyAgICAgICAgICAgIHByb2plY3QuYWRkQnVpbGRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBJbnB1dEhhbmRsZXIgYW5kIGFkZHMgaXQgdG8gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYSBzcGVjaWZpZWQgSW5wdXRIYW5kbGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjb3VsZCBub3QgYmUgbG9hZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRJbnB1dEhhbmRsZXIoUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBJbnB1dEhhbmRsZXIgaGFuZGxlciA9IG51bGw7CisgICAgICAgIGlmIChpbnB1dEhhbmRsZXJDbGFzc25hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBEZWZhdWx0SW5wdXRIYW5kbGVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYW5kbGVyID0gKElucHV0SGFuZGxlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIGlucHV0SGFuZGxlckNsYXNzbmFtZSwgTWFpbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgICAgICBJbnB1dEhhbmRsZXIuY2xhc3MpOworICAgICAgICAgICAgcHJvamVjdC5zZXRQcm9qZWN0UmVmZXJlbmNlKGhhbmRsZXIpOworICAgICAgICB9CisgICAgICAgIHByb2plY3Quc2V0SW5wdXRIYW5kbGVyKGhhbmRsZXIpOworICAgIH0KKworICAgIC8vIFhYWDogKEpvbiBTa2VldCkgQW55IHJlYXNvbiBmb3Igd3JpdGluZyBhIG1lc3NhZ2UgYW5kIHRoZW4gdXNpbmcgYSBiYXJlCisgICAgLy8gUnVudGltZUV4Y2VwdGlvbiByYXRoZXIgdGhhbiBqdXN0IHVzaW5nIGEgQnVpbGRFeGNlcHRpb24gaGVyZT8gSXMgaXQKKyAgICAvLyBpbiBjYXNlIHRoZSBtZXNzYWdlIGNvdWxkIGVuZCB1cCBiZWluZyB3cml0dGVuIHRvIG5vIGxvZ2dlcnMgKGFzIHRoZQorICAgIC8vIGxvZ2dlcnMgY291bGQgaGF2ZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBkdWUgdG8gdGhpcyBmYWlsdXJlKT8KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGJ1aWxkIGxvZ2dlciBmb3Igc2VuZGluZyBidWlsZCBldmVudHMgdG8gdGhlIGFudAorICAgICAqIGxvZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhpcyBidWlsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ1aWxkTG9nZ2VyIGNyZWF0ZUxvZ2dlcigpIHsKKyAgICAgICAgQnVpbGRMb2dnZXIgbG9nZ2VyID0gbnVsbDsKKyAgICAgICAgaWYgKGxvZ2dlckNsYXNzbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvZ2dlciA9IChCdWlsZExvZ2dlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXJDbGFzc25hbWUsIE1haW4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkTG9nZ2VyLmNsYXNzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBzcGVjaWZpZWQgbG9nZ2VyIGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgKyBsb2dnZXJDbGFzc25hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvdWxkIG5vdCBiZSB1c2VkIGJlY2F1c2UgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZ2dlci5zZXRNZXNzYWdlT3V0cHV0TGV2ZWwobXNnT3V0cHV0TGV2ZWwpOworICAgICAgICBsb2dnZXIuc2V0T3V0cHV0UHJpbnRTdHJlYW0ob3V0KTsKKyAgICAgICAgbG9nZ2VyLnNldEVycm9yUHJpbnRTdHJlYW0oZXJyKTsKKyAgICAgICAgbG9nZ2VyLnNldEVtYWNzTW9kZShlbWFjc01vZGUpOworCisgICAgICAgIHJldHVybiBsb2dnZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjbGFzcyB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7CisgICAgICAgIFN0cmluZyBsU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICBTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBtc2cuYXBwZW5kKCJhbnQgW29wdGlvbnNdIFt0YXJnZXQgW3RhcmdldDIgW3RhcmdldDNdIC4uLl1dIiArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCJPcHRpb25zOiAiICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgLWhlbHAsIC1oICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UiICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgLXByb2plY3RoZWxwLCAtcCAgICAgICBwcmludCBwcm9qZWN0IGhlbHAgaW5mb3JtYXRpb24iICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIgKyBsU2VwKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiICAtZGlhZ25vc3RpY3MgICAgICAgICAgIHByaW50IGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgYmUgaGVscGZ1bCB0byIgKyBsU2VwKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdub3NlIG9yIHJlcG9ydCBwcm9ibGVtcy4iICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgLXF1aWV0LCAtcSAgICAgICAgICAgICBiZSBleHRyYSBxdWlldCIgKyBsU2VwKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiICAtdmVyYm9zZSwgLXYgICAgICAgICAgIGJlIGV4dHJhIHZlcmJvc2UiICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgLWRlYnVnLCAtZCAgICAgICAgICAgICBwcmludCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgLWVtYWNzLCAtZSAgICAgICAgICAgICBwcm9kdWNlIGxvZ2dpbmcgaW5mb3JtYXRpb24gd2l0aG91dCBhZG9ybm1lbnRzIgorICAgICAgICAgICAgICAgICAgICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgLWxpYiA8cGF0aD4gICAgICAgICAgICBzcGVjaWZpZXMgYSBwYXRoIHRvIHNlYXJjaCBmb3IgamFycyBhbmQgY2xhc3NlcyIKKyAgICAgICAgICAgICAgICAgICArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgIC1sb2dmaWxlIDxmaWxlPiAgICAgICAgdXNlIGdpdmVuIGZpbGUgZm9yIGxvZyIgKyBsU2VwKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiICAgIC1sICAgICA8ZmlsZT4gICAgICAgICAgICAgICAgJyciICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgLWxvZ2dlciA8Y2xhc3NuYW1lPiAgICB0aGUgY2xhc3Mgd2hpY2ggaXMgdG8gcGVyZm9ybSBsb2dnaW5nIiArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgIC1saXN0ZW5lciA8Y2xhc3NuYW1lPiAgYWRkIGFuIGluc3RhbmNlIG9mIGNsYXNzIGFzIGEgcHJvamVjdCBsaXN0ZW5lciIKKyAgICAgICAgICAgICAgICAgICArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgIC1ub2lucHV0ICAgICAgICAgICAgICAgZG8gbm90IGFsbG93IGludGVyYWN0aXZlIGlucHV0IiArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgIC1idWlsZGZpbGUgPGZpbGU+ICAgICAgdXNlIGdpdmVuIGJ1aWxkZmlsZSIgKyBsU2VwKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiICAgIC1maWxlICAgIDxmaWxlPiAgICAgICAgICAgICAgJyciICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgICAtZiAgICAgICA8ZmlsZT4gICAgICAgICAgICAgICcnIiArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgIC1EPHByb3BlcnR5Pj08dmFsdWU+ICAgdXNlIHZhbHVlIGZvciBnaXZlbiBwcm9wZXJ0eSIgKyBsU2VwKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiICAta2VlcC1nb2luZywgLWsgICAgICAgIGV4ZWN1dGUgYWxsIHRhcmdldHMgdGhhdCBkbyBub3QgZGVwZW5kIiArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgICAgICAgICAgICAgICAgICAgICAgICAgb24gZmFpbGVkIHRhcmdldChzKSIgKyBsU2VwKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiICAtcHJvcGVydHlmaWxlIDxuYW1lPiAgIGxvYWQgYWxsIHByb3BlcnRpZXMgZnJvbSBmaWxlIHdpdGggLUQiICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHRha2luZyBwcmVjZWRlbmNlIiArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgIC1pbnB1dGhhbmRsZXIgPGNsYXNzPiAgdGhlIGNsYXNzIHdoaWNoIHdpbGwgaGFuZGxlIGlucHV0IHJlcXVlc3RzIiArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgIC1maW5kIDxmaWxlPiAgICAgICAgICAgKHMpZWFyY2ggZm9yIGJ1aWxkZmlsZSB0b3dhcmRzIHRoZSByb290IG9mIiArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgICAgLXMgIDxmaWxlPiAgICAgICAgICAgdGhlIGZpbGVzeXN0ZW0gYW5kIHVzZSBpdCIgKyBsU2VwKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiICAtbmljZSAgbnVtYmVyICAgICAgICAgIEEgbmljZW5lc3MgdmFsdWUgZm9yIHRoZSBtYWluIHRocmVhZDoiICsgbFNlcAorICAgICAgICAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAxIChsb3dlc3QpIHRvIDEwIChoaWdoZXN0KTsgNSBpcyB0aGUgZGVmYXVsdCIKKyAgICAgICAgICAgICAgICAgICArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgIC1ub3VzZXJsaWIgICAgICAgICAgICAgUnVuIGFudCB3aXRob3V0IHVzaW5nIHRoZSBqYXIgZmlsZXMgZnJvbSIgKyBsU2VwCisgICAgICAgICAgICAgICAgICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgICR7dXNlci5ob21lfS8uYW50L2xpYiIgKyBsU2VwKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiICAtbm9jbGFzc3BhdGggICAgICAgICAgIFJ1biBhbnQgd2l0aG91dCB1c2luZyBDTEFTU1BBVEgiICsgbFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoIiAgLWF1dG9wcm94eSAgICAgICAgICAgICBKYXZhMS41KzogdXNlIHRoZSBPUyBwcm94eSBzZXR0aW5ncyIKKyAgICAgICAgICAgICAgICArIGxTZXApOworICAgICAgICBtc2cuYXBwZW5kKCIgIC1tYWluIDxjbGFzcz4gICAgICAgICAgb3ZlcnJpZGUgQW50J3Mgbm9ybWFsIGVudHJ5IHBvaW50Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBBbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgdW5hdmFpbGFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VmVyc2lvbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRBbnRWZXJzaW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhY2hlIG9mIHRoZSBBbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiB3aGVuIGl0IGhhcyBiZWVuIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYW50VmVyc2lvbiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBBbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiwgaWYgYXZhaWxhYmxlLiBPbmNlIHRoZSBpbmZvcm1hdGlvbgorICAgICAqIGhhcyBiZWVuIGxvYWRlZCBvbmNlLCBpdCdzIGNhY2hlZCBhbmQgcmV0dXJuZWQgZnJvbSB0aGUgY2FjaGUgb24gZnV0dXJlCisgICAgICogY2FsbHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBBbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcyBhIFN0cmluZworICAgICAqICAgICAgICAgKGFsd2F5cyBub24tPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHVuYXZhaWxhYmxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEFudFZlcnNpb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoYW50VmVyc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0KKyAgICAgICAgICAgICAgICAgICAgTWFpbi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvb3JnL2FwYWNoZS90b29scy9hbnQvdmVyc2lvbi50eHQiKTsKKyAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCJBcGFjaGUgQW50IHZlcnNpb24gIik7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZChwcm9wcy5nZXRQcm9wZXJ0eSgiVkVSU0lPTiIpKTsKKyAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCIgY29tcGlsZWQgb24gIik7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZChwcm9wcy5nZXRQcm9wZXJ0eSgiREFURSIpKTsKKyAgICAgICAgICAgICAgICBhbnRWZXJzaW9uID0gbXNnLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFudFZlcnNpb247CisgICAgfQorCisgICAgIC8qKgorICAgICAgKiBQcmludHMgdGhlIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCAoaWYgdGhlcmUgaXMgb25lKSB0bworICAgICAgKiA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPi4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gZGlzcGxheSBhIGRlc2NyaXB0aW9uIG9mLgorICAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludERlc2NyaXB0aW9uKFByb2plY3QgcHJvamVjdCkgeworICAgICAgIGlmIChwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgIHByb2plY3QubG9nKHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRhcmdldHMgaW4gaW1wb3J0ZWQgZmlsZXMgd2l0aCBhIHByb2plY3QgbmFtZQorICAgICAqIGFuZCBub3Qgb3ZlcmxvYWRlZCBieSB0aGUgbWFpbiBidWlsZCBmaWxlIHdpbGwKKyAgICAgKiBiZSBpbiB0aGUgdGFyZ2V0IG1hcCB0d2ljZS4gVGhpcyBtZXRob2QKKyAgICAgKiByZW1vdmVzIHRoZSBkdXBsaWNhdGUgdGFyZ2V0LgorICAgICAqIEBwYXJhbSB0YXJnZXRzIHRoZSB0YXJnZXRzIHRvIGZpbHRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCB0YXJnZXRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1hcCByZW1vdmVEdXBsaWNhdGVUYXJnZXRzKE1hcCB0YXJnZXRzKSB7CisgICAgICAgIE1hcCBsb2NhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRhcmdldHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIFRhcmdldCB0YXJnZXQgPSAoVGFyZ2V0KSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgVGFyZ2V0IG90aGVyVGFyZ2V0ID0KKyAgICAgICAgICAgICAgICAoVGFyZ2V0KSBsb2NhdGlvbk1hcC5nZXQodGFyZ2V0LmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgLy8gUGxhY2UgdGhpcyBlbnRyeSBpbiB0aGUgbG9jYXRpb24gbWFwIGlmCisgICAgICAgICAgICAvLyAgYSkgbG9jYXRpb24gaXMgbm90IGluIHRoZSBtYXAKKyAgICAgICAgICAgIC8vICBiKSBsb2NhdGlvbiBpcyBpbiBtYXAsIGJ1dCBpdCdzIG5hbWUgaXMgbG9uZ2VyCisgICAgICAgICAgICAvLyAgICAgKGFuIGltcG9ydGVkIHRhcmdldCB3aWxsIGhhdmUgYSBuYW1lLiBwcmVmaXgpCisgICAgICAgICAgICBpZiAob3RoZXJUYXJnZXQgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IG90aGVyVGFyZ2V0LmdldE5hbWUoKS5sZW5ndGgoKSA+IG5hbWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBsb2NhdGlvbk1hcC5wdXQoCisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRMb2NhdGlvbigpLCB0YXJnZXQpOyAvLyBTbWFsbGVzdCBuYW1lIHdpbnMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBNYXAgcmV0ID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbG9jYXRpb25NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldCkgaS5uZXh0KCk7CisgICAgICAgICAgICByZXQucHV0KHRhcmdldC5nZXROYW1lKCksIHRhcmdldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgYSBsaXN0IG9mIGFsbCB0YXJnZXRzIGluIHRoZSBzcGVjaWZpZWQgcHJvamVjdCB0bworICAgICAqIDxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+LCBvcHRpb25hbGx5IGluY2x1ZGluZyBzdWJ0YXJnZXRzLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gZGlzcGxheSBhIGRlc2NyaXB0aW9uIG9mLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBwcmludFN1YlRhcmdldHMgV2hldGhlciBvciBub3Qgc3VidGFyZ2V0IG5hbWVzIHNob3VsZCBhbHNvIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBwcmludGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRUYXJnZXRzKFByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBwcmludFN1YlRhcmdldHMpIHsKKyAgICAgICAgLy8gZmluZCB0aGUgdGFyZ2V0IHdpdGggdGhlIGxvbmdlc3QgbmFtZQorICAgICAgICBpbnQgbWF4TGVuZ3RoID0gMDsKKyAgICAgICAgTWFwIHB0YXJnZXRzID0gcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhwcm9qZWN0LmdldFRhcmdldHMoKSk7CisgICAgICAgIFN0cmluZyB0YXJnZXROYW1lOworICAgICAgICBTdHJpbmcgdGFyZ2V0RGVzY3JpcHRpb247CisgICAgICAgIFRhcmdldCBjdXJyZW50VGFyZ2V0OworICAgICAgICAvLyBzcGxpdCB0aGUgdGFyZ2V0cyBpbiB0b3AtbGV2ZWwgYW5kIHN1Yi10YXJnZXRzIGRlcGVuZGluZworICAgICAgICAvLyBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBkZXNjcmlwdGlvbgorICAgICAgICBWZWN0b3IgdG9wTmFtZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFZlY3RvciB0b3BEZXNjcmlwdGlvbnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFZlY3RvciBzdWJOYW1lcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwdGFyZ2V0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSAoVGFyZ2V0KSBpLm5leHQoKTsKKyAgICAgICAgICAgIHRhcmdldE5hbWUgPSBjdXJyZW50VGFyZ2V0LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXROYW1lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldERlc2NyaXB0aW9uID0gY3VycmVudFRhcmdldC5nZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgLy8gbWFpbnRhaW4gYSBzb3J0ZWQgbGlzdCBvZiB0YXJnZXRzCisgICAgICAgICAgICBpZiAodGFyZ2V0RGVzY3JpcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBwb3MgPSBmaW5kVGFyZ2V0UG9zaXRpb24oc3ViTmFtZXMsIHRhcmdldE5hbWUpOworICAgICAgICAgICAgICAgIHN1Yk5hbWVzLmluc2VydEVsZW1lbnRBdCh0YXJnZXROYW1lLCBwb3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9zID0gZmluZFRhcmdldFBvc2l0aW9uKHRvcE5hbWVzLCB0YXJnZXROYW1lKTsKKyAgICAgICAgICAgICAgICB0b3BOYW1lcy5pbnNlcnRFbGVtZW50QXQodGFyZ2V0TmFtZSwgcG9zKTsKKyAgICAgICAgICAgICAgICB0b3BEZXNjcmlwdGlvbnMuaW5zZXJ0RWxlbWVudEF0KHRhcmdldERlc2NyaXB0aW9uLCBwb3MpOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXROYW1lLmxlbmd0aCgpID4gbWF4TGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCA9IHRhcmdldE5hbWUubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRUYXJnZXRzKHByb2plY3QsIHRvcE5hbWVzLCB0b3BEZXNjcmlwdGlvbnMsICJNYWluIHRhcmdldHM6IiwKKyAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCk7CisgICAgICAgIC8vaWYgdGhlcmUgd2VyZSBubyBtYWluIHRhcmdldHMsIHdlIGxpc3QgYWxsIHN1YnRhcmdldHMKKyAgICAgICAgLy9hcyBpdCBtZWFucyBub3RoaW5nIGhhcyBhIGRlc2NyaXB0aW9uCisgICAgICAgIGlmICh0b3BOYW1lcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRTdWJUYXJnZXRzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJpbnRTdWJUYXJnZXRzKSB7CisgICAgICAgICAgICBwcmludFRhcmdldHMocHJvamVjdCwgc3ViTmFtZXMsIG51bGwsICJPdGhlciB0YXJnZXRzOiIsIDApOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRUYXJnZXQgPSBwcm9qZWN0LmdldERlZmF1bHRUYXJnZXQoKTsKKyAgICAgICAgaWYgKGRlZmF1bHRUYXJnZXQgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGRlZmF1bHRUYXJnZXQpKSB7CisgICAgICAgICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBjaGVjayBidXQuLi4KKyAgICAgICAgICAgIHByb2plY3QubG9nKCJEZWZhdWx0IHRhcmdldDogIiArIGRlZmF1bHRUYXJnZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgZm9yIHRoZSBjb3JyZWN0IHBsYWNlIHRvIGluc2VydCBhIG5hbWUgaW50byBhIGxpc3Qgc28gYXMKKyAgICAgKiB0byBrZWVwIHRoZSBsaXN0IHNvcnRlZCBhbHBoYWJldGljYWxseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lcyBUaGUgY3VycmVudCBsaXN0IG9mIG5hbWVzLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbmFtZSAgVGhlIG5hbWUgdG8gZmluZCBhIHBsYWNlIGZvci4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZWN0IHBsYWNlIGluIHRoZSBsaXN0IGZvciB0aGUgZ2l2ZW4gbmFtZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kVGFyZ2V0UG9zaXRpb24oVmVjdG9yIG5hbWVzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpbnQgcmVzID0gbmFtZXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKSAmJiByZXMgPT0gbmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuYW1lLmNvbXBhcmVUbygoU3RyaW5nKSBuYW1lcy5lbGVtZW50QXQoaSkpIDwgMCkgeworICAgICAgICAgICAgICAgIHJlcyA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBmb3JtYXR0ZWQgbGlzdCBvZiB0YXJnZXQgbmFtZXMgdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4KKyAgICAgKiB3aXRoIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gbmFtZXMgVGhlIG5hbWVzIHRvIGJlIHByaW50ZWQuCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbnMgVGhlIGFzc29jaWF0ZWQgdGFyZ2V0IGRlc2NyaXB0aW9ucy4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgbm8gZGVzY3JpcHRpb25zIGFyZSBkaXNwbGF5ZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICBJZiBub24tPGNvZGU+bnVsbDwvY29kZT4sIHRoaXMgc2hvdWxkIGhhdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFzIG1hbnkgZWxlbWVudHMgYXMgPGNvZGU+bmFtZXM8L2NvZGU+LgorICAgICAqIEBwYXJhbSBoZWFkaW5nIFRoZSBoZWFkaW5nIHRvIGRpc3BsYXkuCisgICAgICogICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbWF4bGVuIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgbmFtZXMgb2YgdGhlIHRhcmdldHMuCisgICAgICogICAgICAgICAgICAgICBJZiBkZXNjcmlwdGlvbnMgYXJlIGdpdmVuLCB0aGV5IGFyZSBwYWRkZWQgdG8gdGhpcworICAgICAqICAgICAgICAgICAgICAgcG9zaXRpb24gc28gdGhleSBsaW5lIHVwIChzbyBsb25nIGFzIHRoZSBuYW1lcyByZWFsbHkKKyAgICAgKiAgICAgICAgICAgICAgIDxpPmFyZTwvaT4gc2hvcnRlciB0aGFuIHRoaXMpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRUYXJnZXRzKFByb2plY3QgcHJvamVjdCwgVmVjdG9yIG5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBkZXNjcmlwdGlvbnMsIFN0cmluZyBoZWFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhsZW4pIHsKKyAgICAgICAgLy8gbm93LCBzdGFydCBwcmludGluZyB0aGUgdGFyZ2V0cyBhbmQgdGhlaXIgZGVzY3JpcHRpb25zCisgICAgICAgIFN0cmluZyBsU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICAvLyBnb3QgYSBiaXQgYW5ub3llZCB0aGF0IEkgY291bGRuJ3QgZmluZCBhIHBhZCBmdW5jdGlvbgorICAgICAgICBTdHJpbmcgc3BhY2VzID0gIiAgICAiOworICAgICAgICB3aGlsZSAoc3BhY2VzLmxlbmd0aCgpIDw9IG1heGxlbikgeworICAgICAgICAgICAgc3BhY2VzICs9IHNwYWNlczsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBtc2cuYXBwZW5kKGhlYWRpbmcgKyBsU2VwICsgbFNlcCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1zZy5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIG1zZy5hcHBlbmQobmFtZXMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIHNwYWNlcy5zdWJzdHJpbmcoMCwgbWF4bGVuIC0gKChTdHJpbmcpIG5hbWVzLmVsZW1lbnRBdChpKSkubGVuZ3RoKCkgKyAyKSk7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZChkZXNjcmlwdGlvbnMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy5hcHBlbmQobFNlcCk7CisgICAgICAgIH0KKyAgICAgICAgcHJvamVjdC5sb2cobXNnLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1dBUk4pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L05vQmFubmVyTG9nZ2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Ob0Jhbm5lckxvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmUzYzUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Ob0Jhbm5lckxvZ2dlci5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogRXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHRvIHN0cmlwIG91dCBlbXB0eSB0YXJnZXRzLgorICoKKyAqLworcHVibGljIGNsYXNzIE5vQmFubmVyTG9nZ2VyIGV4dGVuZHMgRGVmYXVsdExvZ2dlciB7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGN1cnJlbnQgdGFyZ2V0LCBpZiBpdCBzaG91bGQKKyAgICAgKiBiZSBkaXNwbGF5ZWQgb24gdGhlIG5leHQgbWVzc2FnZS4gVGhpcyBpcworICAgICAqIHNldCB3aGVuIGEgdGFyZ2V0IHN0YXJ0cyBidWlsZGluZywgYW5kIHJlc2V0CisgICAgICogdG8gPGNvZGU+bnVsbDwvY29kZT4gYWZ0ZXIgdGhlIGZpcnN0IG1lc3NhZ2UgZm9yCisgICAgICogdGhlIHRhcmdldCBpcyBsb2dnZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKiogU29sZSBjb25zdHJ1Y3Rvci4gKi8KKyAgICBwdWJsaWMgTm9CYW5uZXJMb2dnZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZXMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBzbyBpdCBjYW4gYmUgbG9nZ2VkCisgICAgICogaWYgaXQgZ2VuZXJhdGVzIGFueSBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBBIEJ1aWxkRXZlbnQgY29udGFpbmluZyB0YXJnZXQgaW5mb3JtYXRpb24uCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICB0YXJnZXROYW1lID0gZXh0cmFjdFRhcmdldE5hbWUoZXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHBvaW50LCBleHRyYWN0IHRoZSB0YXJnZXQgbmFtZQorICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdG8gd29yayBvbgorICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCBuYW1lIHRvIHByaW50CisgICAgICogQHNpbmNlIEFudDEuNy4xCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0VGFyZ2V0TmFtZShCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHJldHVybiBldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjdXJyZW50IHRhcmdldCBuYW1lIHRvIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IElnbm9yZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHRhcmdldE5hbWUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZ3MgYSBtZXNzYWdlIGZvciBhIHRhcmdldCBpZiBpdCBpcyBvZiBhbiBhcHByb3ByaWF0ZQorICAgICAqIHByaW9yaXR5LCBhbHNvIGxvZ2dpbmcgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBpZiB0aGlzCisgICAgICogaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggbmVlZHMgdG8gYmUgbG9nZ2VkIGZvciB0aGUKKyAgICAgKiB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgQSBCdWlsZEV2ZW50IGNvbnRhaW5pbmcgbWVzc2FnZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgaWYgKGV2ZW50LmdldFByaW9yaXR5KCkgPiBtc2dPdXRwdXRMZXZlbAorICAgICAgICAgICAgfHwgbnVsbCA9PSBldmVudC5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgIHx8ICIiLmVxdWFscyhldmVudC5nZXRNZXNzYWdlKCkudHJpbSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IHRhcmdldE5hbWUpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKFN0cmluZ1V0aWxzLkxJTkVfU0VQICsgdGFyZ2V0TmFtZSArICI6Iik7CisgICAgICAgICAgICB0YXJnZXROYW1lID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLm1lc3NhZ2VMb2dnZWQoZXZlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1BhdGhUb2tlbml6ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1BhdGhUb2tlbml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQzZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUGF0aFRva2VuaXplci5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworCisvKioKKyAqIEEgUGF0aCB0b2tlbml6ZXIgdGFrZXMgYSBwYXRoIGFuZCByZXR1cm5zIHRoZSBjb21wb25lbnRzIHRoYXQgbWFrZSB1cAorICogdGhhdCBwYXRoLgorICoKKyAqIFRoZSBwYXRoIGNhbiB1c2UgcGF0aCBzZXBhcmF0b3JzIG9mIGVpdGhlciAnOicgb3IgJzsnIGFuZCBmaWxlIHNlcGFyYXRvcnMKKyAqIG9mIGVpdGhlciAnLycgb3IgJ1wnLgorICoKKyAqLworcHVibGljIGNsYXNzIFBhdGhUb2tlbml6ZXIgeworICAgIC8qKgorICAgICAqIEEgdG9rZW5pemVyIHRvIGJyZWFrIHRoZSBzdHJpbmcgdXAgYmFzZWQgb24gdGhlICc6JyBvciAnOycgc2VwYXJhdG9ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXI7CisKKyAgICAvKioKKyAgICAgKiBBIFN0cmluZyB3aGljaCBzdG9yZXMgYW55IHBhdGggY29tcG9uZW50cyB3aGljaCBoYXZlIGJlZW4gcmVhZCBhaGVhZAorICAgICAqIGR1ZSB0byBET1MgZmlsZXN5c3RlbSBjb21wZW5zYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9va2FoZWFkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEEgYm9vbGVhbiB0aGF0IGRldGVybWluZXMgaWYgd2UgYXJlIHJ1bm5pbmcgb24gTm92ZWxsIE5ldFdhcmUsIHdoaWNoCisgICAgICogZXhoaWJpdHMgc2xpZ2h0bHkgZGlmZmVyZW50IHBhdGggbmFtZSBjaGFyYWN0ZXJpc3RpY3MgKG11bHRpLWNoYXJhY3RlcgorICAgICAqIHZvbHVtZSAvIGRyaXZlIG5hbWVzKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBvbk5ldFdhcmUgPSBPcy5pc0ZhbWlseSgibmV0d2FyZSIpOworCisgICAgLyoqCisgICAgICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgcnVubmluZyBvbiBhIHBsYXRmb3JtIHdpdGggYQorICAgICAqIERPUyBzdHlsZSBmaWxlc3lzdGVtCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRvc1N0eWxlRmlsZXN5c3RlbTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBwYXRoIHRva2VuaXplciBmb3IgdGhlIHNwZWNpZmllZCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdG9rZW5pemUuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBQYXRoVG9rZW5pemVyKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChvbk5ldFdhcmUpIHsKKyAgICAgICAgICAgIC8vIEZvciBOZXRXYXJlLCB1c2UgdGhlIGJvb2xlYW49dHJ1ZSBtb2RlLCBzbyB3ZSBjYW4gdXNlIGRlbGltaXRlcgorICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gdG8gbWFrZSBhIGJldHRlciBkZWNpc2lvbiBsYXRlci4KKyAgICAgICAgICAgIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0aCwgIjo7IiwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBvbiBXaW5kb3dzIGFuZCBVbml4LCB3ZSBjYW4gaWdub3JlIGRlbGltaXRlcnMgYW5kIHN0aWxsIGhhdmUKKyAgICAgICAgICAgIC8vIGVub3VnaCBpbmZvcm1hdGlvbiB0byB0b2tlbml6ZSBjb3JyZWN0bHkuCisgICAgICAgICAgICB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgsICI6OyIsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBkb3NTdHlsZUZpbGVzeXN0ZW0gPSBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyID09ICc7JzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiB0aGVyZSBhcmUgbW9yZSBwYXRoIGVsZW1lbnRzIGF2YWlsYWJsZSBmcm9tIHRoaXMgdG9rZW5pemVyJ3MKKyAgICAgKiBwYXRoLiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIGEgc3Vic2VxdWVudCBjYWxsCisgICAgICogdG8gbmV4dFRva2VuIHdpbGwgc3VjY2Vzc2Z1bGx5IHJldHVybiBhIHRva2VuLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdG9rZW4KKyAgICAgKiBpbiB0aGUgc3RyaW5nIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7CisgICAgICAgIGlmIChsb29rYWhlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHBhdGggZWxlbWVudCBmcm9tIHRoaXMgdG9rZW5pemVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmV4dCBwYXRoIGVsZW1lbnQgZnJvbSB0aGlzIHRva2VuaXplci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyBpbiB0aGlzCisgICAgICogICAgICAgICAgICB0b2tlbml6ZXIncyBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmV4dFRva2VuKCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdG9rZW4gPSBudWxsOworICAgICAgICBpZiAobG9va2FoZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRva2VuID0gbG9va2FoZWFkOworICAgICAgICAgICAgbG9va2FoZWFkID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghb25OZXRXYXJlKSB7CisgICAgICAgICAgICBpZiAodG9rZW4ubGVuZ3RoKCkgPT0gMSAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodG9rZW4uY2hhckF0KDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZG9zU3R5bGVGaWxlc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgYXJlIG9uIGEgZG9zIHN0eWxlIHN5c3RlbSBzbyB0aGlzIHBhdGggY291bGQgYmUgYSBkcml2ZQorICAgICAgICAgICAgICAgIC8vIHNwZWMuIFdlIGxvb2sgYXQgdGhlIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICBTdHJpbmcgbmV4dFRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dFRva2VuLnN0YXJ0c1dpdGgoIlxcIikgfHwgbmV4dFRva2VuLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBrbm93IHdlIGFyZSBvbiBhIERPUyBzdHlsZSBwbGF0Zm9ybSBhbmQgdGhlIG5leHQgcGF0aAorICAgICAgICAgICAgICAgICAgICAvLyBzdGFydHMgd2l0aCBhIHNsYXNoIG9yIGJhY2tzbGFzaCwgc28gd2Uga25vdyB0aGlzIGlzIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gZHJpdmUgc3BlYworICAgICAgICAgICAgICAgICAgICB0b2tlbiArPSAiOiIgKyBuZXh0VG9rZW47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHRva2VuIGp1c3QgcmVhZCBmb3IgbmV4dCB0aW1lCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IG5leHRUb2tlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgb24gTmV0V2FyZSwgdG9rZW5pemluZyBpcyBoYW5kbGVkIGEgbGl0dGxlIGRpZmZlcmVudGx5LAorICAgICAgICAgICAgLy8gZHVlIHRvIHRoZSBmYWN0IHRoYXQgTmV0V2FyZSBoYXMgbXVsdGlwbGUtY2hhcmFjdGVyIHZvbHVtZSBuYW1lcy4KKyAgICAgICAgICAgIGlmICh0b2tlbi5lcXVhbHMoRmlsZS5wYXRoU2VwYXJhdG9yKSB8fCB0b2tlbi5lcXVhbHMoIjoiKSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSAiOyIgYW5kIGdldCB0aGUgbmV4dCB0b2tlbgorICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHBhdGggY291bGQgYmUgYSBkcml2ZSBzcGVjLCBzbyBsb29rIGF0IHRoZSBuZXh0IHRva2VuCisgICAgICAgICAgICAgICAgU3RyaW5nIG5leHRUb2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7CisKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgYXJlbid0IGdvaW5nIHRvIGdldCB0aGUgcGF0aCBzZXBhcmF0b3IgbmV4dAorICAgICAgICAgICAgICAgIGlmICghbmV4dFRva2VuLmVxdWFscyhGaWxlLnBhdGhTZXBhcmF0b3IpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0VG9rZW4uZXF1YWxzKCI6IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rZW4uc3RhcnRzV2l0aCgiLyIpICYmICF0b2tlbi5zdGFydHNXaXRoKCJcXCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRva2VuLnN0YXJ0c1dpdGgoIi4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0b2tlbi5zdGFydHNXaXRoKCIuLiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaW5kZWVkIGlzIGEgZHJpdmUgc3BlYywgZ2V0IHRoZSBuZXh0IGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvbmVNb3JlID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9uZU1vcmUuZXF1YWxzKEZpbGUucGF0aFNlcGFyYXRvcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gKz0gIjoiICsgb25lTW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiArPSAiOiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IG9uZU1vcmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wbGljaXQgZWxzZTogaWdub3JlIHRoZSAnOicgc2luY2Ugd2UgaGF2ZSBlaXRoZXIgYQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVU5JWCBvciBhIHJlbGF0aXZlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSB0b2tlbiBqdXN0IHJlYWQgZm9yIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gbmV4dFRva2VuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3QuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTJkYmNlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdC5qYXZhCkBAIC0wLDAgKzEsMjM4MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuRGVmYXVsdEV4ZWN1dG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJTZXRDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBDZW50cmFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIEFudCBwcm9qZWN0LiBUaGlzIGNsYXNzIGRlZmluZXMgYW4KKyAqIEFudCBwcm9qZWN0IHdpdGggYWxsIG9mIGl0cyB0YXJnZXRzLCB0YXNrcyBhbmQgdmFyaW91cyBvdGhlcgorICogcHJvcGVydGllcy4gSXQgYWxzbyBwcm92aWRlcyB0aGUgbWVjaGFuaXNtIHRvIGtpY2sgb2ZmIGEgYnVpbGQgdXNpbmcKKyAqIGEgcGFydGljdWxhciB0YXJnZXQgbmFtZS4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBhbHNvIGVuY2Fwc3VsYXRlcyBtZXRob2RzIHdoaWNoIGFsbG93IGZpbGVzIHRvIGJlIHJlZmVycmVkCisgKiB0byB1c2luZyBhYnN0cmFjdCBwYXRoIG5hbWVzIHdoaWNoIGFyZSB0cmFuc2xhdGVkIHRvIG5hdGl2ZSBzeXN0ZW0KKyAqIGZpbGUgcGF0aHMgYXQgcnVudGltZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9qZWN0IGltcGxlbWVudHMgUmVzb3VyY2VGYWN0b3J5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKyAgICAvKiogTWVzc2FnZSBwcmlvcml0eSBvZiAmcXVvdDtlcnJvciZxdW90Oy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfRVJSID0gMDsKKyAgICAvKiogTWVzc2FnZSBwcmlvcml0eSBvZiAmcXVvdDt3YXJuaW5nJnF1b3Q7LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19XQVJOID0gMTsKKyAgICAvKiogTWVzc2FnZSBwcmlvcml0eSBvZiAmcXVvdDtpbmZvcm1hdGlvbiZxdW90Oy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfSU5GTyA9IDI7CisgICAgLyoqIE1lc3NhZ2UgcHJpb3JpdHkgb2YgJnF1b3Q7dmVyYm9zZSZxdW90Oy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfVkVSQk9TRSA9IDM7CisgICAgLyoqIE1lc3NhZ2UgcHJpb3JpdHkgb2YgJnF1b3Q7ZGVidWcmcXVvdDsuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFQlVHID0gNDsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB0aGUgJnF1b3Q7dmlzaXRpbmcmcXVvdDsgc3RhdGUsIHVzZWQgd2hlbgorICAgICAqIHRyYXZlcnNpbmcgYSBERlMgb2YgdGFyZ2V0IGRlcGVuZGVuY2llcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSVRJTkcgPSAiVklTSVRJTkciOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB0aGUgJnF1b3Q7dmlzaXRlZCZxdW90OyBzdGF0ZSwgdXNlZCB3aGVuCisgICAgICogdHJhdmVyc2luZyBhIERGUyBvZiB0YXJnZXQgZGVwZW5kZW5jaWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJVEVEID0gIlZJU0lURUQiOworCisgICAgLyoqCisgICAgICogVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxLjAgLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS41LnguCisgICAgICogICAgICAgICAgICAgVXNlIHtAbGluayBKYXZhRW52VXRpbHMjSkFWQV8xXzB9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xXzAgPSBKYXZhRW52VXRpbHMuSkFWQV8xXzA7CisgICAgLyoqCisgICAgICogVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxLjEgLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS41LnguCisgICAgICogICAgICAgICAgICAgVXNlIHtAbGluayBKYXZhRW52VXRpbHMjSkFWQV8xXzF9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xXzEgPSBKYXZhRW52VXRpbHMuSkFWQV8xXzE7CisgICAgLyoqCisgICAgICogVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxLjIgLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS41LnguCisgICAgICogICAgICAgICAgICAgVXNlIHtAbGluayBKYXZhRW52VXRpbHMjSkFWQV8xXzJ9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xXzIgPSBKYXZhRW52VXRpbHMuSkFWQV8xXzI7CisgICAgLyoqCisgICAgICogVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxLjMgLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS41LnguCisgICAgICogICAgICAgICAgICAgVXNlIHtAbGluayBKYXZhRW52VXRpbHMjSkFWQV8xXzN9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xXzMgPSBKYXZhRW52VXRpbHMuSkFWQV8xXzM7CisgICAgLyoqCisgICAgICogVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxLjQgLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS41LnguCisgICAgICogICAgICAgICAgICAgVXNlIHtAbGluayBKYXZhRW52VXRpbHMjSkFWQV8xXzR9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xXzQgPSBKYXZhRW52VXRpbHMuSkFWQV8xXzQ7CisKKyAgICAvKiogRGVmYXVsdCBmaWx0ZXIgc3RhcnQgdG9rZW4uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fU1RBUlQgPSBGaWx0ZXJTZXQuREVGQVVMVF9UT0tFTl9TVEFSVDsKKyAgICAvKiogRGVmYXVsdCBmaWx0ZXIgZW5kIHRva2VuLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0VORCA9IEZpbHRlclNldC5ERUZBVUxUX1RPS0VOX0VORDsKKworICAgIC8qKiBJbnN0YW5jZSBvZiBhIHV0aWxpdHkgY2xhc3MgdG8gdXNlIGZvciBmaWxlIG9wZXJhdGlvbnMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKiogTmFtZSBvZiB0aGlzIHByb2plY3QuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAvKiogRGVzY3JpcHRpb24gZm9yIHRoaXMgcHJvamVjdCAoaWYgYW55KS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCisgICAgLyoqIE1hcCBvZiByZWZlcmVuY2VzIHdpdGhpbiB0aGUgcHJvamVjdCAocGF0aHMgZXRjKSAoU3RyaW5nIHRvIE9iamVjdCkuICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgcmVmZXJlbmNlcyA9IG5ldyBBbnRSZWZUYWJsZSgpOworCisgICAgLyoqIE1hcCBvZiBpZCByZWZlcmVuY2VzIC0gdXNlZCBmb3IgaW5kaWNhdGluZyBicm9rZW4gYnVpbGQgZmlsZXMgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgaWRSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKiB0aGUgcGFyZW50IHByb2plY3QgZm9yIG9sZCBpZCByZXNvbHV0aW9uIChpZiBpbmhlcml0cmVmZXJlbmNlcyBpcyBzZXQpICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHBhcmVudElkUHJvamVjdCA9IG51bGw7CisKKyAgICAvKiogTmFtZSBvZiB0aGUgcHJvamVjdCdzIGRlZmF1bHQgdGFyZ2V0LiAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRUYXJnZXQ7CisKKyAgICAvKiogTWFwIGZyb20gdGFyZ2V0IG5hbWVzIHRvIHRhcmdldHMgKFN0cmluZyB0byBUYXJnZXQpLiAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhcmdldHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgLyoqIFNldCBvZiBnbG9iYWwgZmlsdGVycy4gKi8KKyAgICBwcml2YXRlIEZpbHRlclNldCBnbG9iYWxGaWx0ZXJTZXQgPSBuZXcgRmlsdGVyU2V0KCk7CisgICAgeworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBnbG9iYWxGaWxlU2V0J3MgcHJvamVjdAorICAgICAgICBnbG9iYWxGaWx0ZXJTZXQuc2V0UHJvamVjdCh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGFyb3VuZCBnbG9iYWxGaWx0ZXJTZXQuIFRoaXMgY29sbGVjdGlvbiBvbmx5IGV2ZXIKKyAgICAgKiBjb250YWlucyBvbmUgRmlsdGVyU2V0LCBidXQgdGhlIHdyYXBwZXIgaXMgbmVlZGVkIGluIG9yZGVyIHRvCisgICAgICogbWFrZSBpdCBlYXNpZXIgdG8gdXNlIHRoZSBGaWxlVXRpbHMgaW50ZXJmYWNlLgorICAgICAqLworICAgIHByaXZhdGUgRmlsdGVyU2V0Q29sbGVjdGlvbiBnbG9iYWxGaWx0ZXJzCisgICAgICAgID0gbmV3IEZpbHRlclNldENvbGxlY3Rpb24oZ2xvYmFsRmlsdGVyU2V0KTsKKworICAgIC8qKiBQcm9qZWN0IGJhc2UgZGlyZWN0b3J5LiAqLworICAgIHByaXZhdGUgRmlsZSBiYXNlRGlyOworCisgICAgLyoqIExpc3Qgb2YgbGlzdGVuZXJzIHRvIG5vdGlmeSBvZiBidWlsZCBldmVudHMuICovCisgICAgcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogVGhlIEFudCBjb3JlIGNsYXNzbG9hZGVyLS1tYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdXNpbmcKKyAgICAgKiBwYXJlbnQgY2xhc3Nsb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjb3JlTG9hZGVyID0gbnVsbDsKKworICAgIC8qKiBSZWNvcmRzIHRoZSBsYXRlc3QgdGFzayB0byBiZSBleGVjdXRlZCBvbiBhIHRocmVhZC4gKi8KKyAgICBwcml2YXRlIE1hcC8qPFRocmVhZCxUYXNrPiovIHRocmVhZFRhc2tzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcCgpKTsKKworICAgIC8qKiBSZWNvcmRzIHRoZSBsYXRlc3QgdGFzayB0byBiZSBleGVjdXRlZCBvbiBhIHRocmVhZCBncm91cC4gKi8KKyAgICBwcml2YXRlIE1hcC8qPFRocmVhZEdyb3VwLFRhc2s+Ki8gdGhyZWFkR3JvdXBUYXNrcworICAgICAgICA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgV2Vha0hhc2hNYXAoKSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gaGFuZGxlIGFueSBpbnB1dCByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIElucHV0SGFuZGxlciBpbnB1dEhhbmRsZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgaW5wdXQgc3RyZWFtIHVzZWQgdG8gcmVhZCBhbnkgaW5wdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBkZWZhdWx0SW5wdXRTdHJlYW0gPSBudWxsOworCisgICAgLyoqCisgICAgICogS2VlcCBnb2luZyBmbGFnLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwR29pbmdNb2RlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHdoaWNoIGNhdGNoZXMgTGlzdGVuZXJzIHdoaWNoIHRyeSB0byB1c2UgU3lzdGVtLm91dCBvciBTeXN0ZW0uZXJyIC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbG9nZ2luZ01lc3NhZ2UgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW5wdXQgaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIHRoZSBJbnB1dEhhbmRsZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBnYXRoZXJpbmcgaW5wdXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5wdXRIYW5kbGVyKElucHV0SGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIGlucHV0SGFuZGxlciA9IGhhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IFN5c3RlbSBpbnB1dCBzdHJlYW0uIE5vcm1hbGx5IHRoaXMgc3RyZWFtIGlzIHNldCB0bworICAgICAqIFN5c3RlbS5pbi4gVGhpcyBpbnB1dFN0cmVhbSBpcyB1c2VkIHdoZW4gbm8gdGFzayBpbnB1dCByZWRpcmVjdGlvbiBpcworICAgICAqIGJlaW5nIHBlcmZvcm1lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWZhdWx0SW5wdXRTdHJlYW0gdGhlIGRlZmF1bHQgaW5wdXQgc3RyZWFtIHRvIHVzZSB3aGVuIGlucHV0CisgICAgICogICAgICAgIGlzIHJlcXVlc3RlZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBkZWZhdWx0SW5wdXRTdHJlYW0pIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0SW5wdXRTdHJlYW0gPSBkZWZhdWx0SW5wdXRTdHJlYW07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoaXMgcHJvamVjdCdzIGlucHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIElucHV0U3RyZWFtIGluc3RhbmNlIGluIHVzZSBieSB0aGlzIFByb2plY3QgaW5zdGFuY2UgdG8KKyAgICAgKiByZWFkIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXREZWZhdWx0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0SW5wdXRTdHJlYW07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgaW5wdXQgaGFuZGxlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIElucHV0SGFuZGxlciBpbnN0YW5jZSBjdXJyZW50bHkgaW4gcGxhY2UgZm9yIHRoZSBwcm9qZWN0CisgICAgICogICAgICAgICBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRIYW5kbGVyIGdldElucHV0SGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0SGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQW50IHByb2plY3QuCisgICAgICovCisgICAgcHVibGljIFByb2plY3QoKSB7CisgICAgICAgIGlucHV0SGFuZGxlciA9IG5ldyBEZWZhdWx0SW5wdXRIYW5kbGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgc3VicHJvamVjdC4gQnkgZGVmYXVsdCB0aGUgc3VicHJvamVjdCB3aWxsIGJlIG9mCisgICAgICogdGhlIHNhbWUgdHlwZSBhcyBpdHMgcGFyZW50LiBJZiBhIG5vLWFyZyBjb25zdHJ1Y3RvciBpcyB1bmF2YWlsYWJsZSwgdGhlCisgICAgICogPGNvZGU+UHJvamVjdDwvY29kZT4gY2xhc3Mgd2lsbCBiZSB1c2VkLgorICAgICAqIEByZXR1cm4gYSBQcm9qZWN0IGluc3RhbmNlIGNvbmZpZ3VyZWQgYXMgYSBzdWJwcm9qZWN0IG9mIHRoaXMgUHJvamVjdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBQcm9qZWN0IGNyZWF0ZVN1YlByb2plY3QoKSB7CisgICAgICAgIFByb2plY3Qgc3ViUHJvamVjdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdWJQcm9qZWN0ID0gKFByb2plY3QpIChnZXRDbGFzcygpLm5ld0luc3RhbmNlKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc3ViUHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAgaW5pdFN1YlByb2plY3Qoc3ViUHJvamVjdCk7CisgICAgICAgIHJldHVybiBzdWJQcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYSBzdWJwcm9qZWN0LgorICAgICAqIEBwYXJhbSBzdWJQcm9qZWN0IHRoZSBzdWJwcm9qZWN0IHRvIGluaXRpYWxpemUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdFN1YlByb2plY3QoUHJvamVjdCBzdWJQcm9qZWN0KSB7CisgICAgICAgIENvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRIZWxwZXIoc3ViUHJvamVjdCkKKyAgICAgICAgICAgIC5pbml0U3ViUHJvamVjdChDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKHRoaXMpKTsKKyAgICAgICAgc3ViUHJvamVjdC5zZXREZWZhdWx0SW5wdXRTdHJlYW0oZ2V0RGVmYXVsdElucHV0U3RyZWFtKCkpOworICAgICAgICBzdWJQcm9qZWN0LnNldEtlZXBHb2luZ01vZGUodGhpcy5pc0tlZXBHb2luZ01vZGUoKSk7CisgICAgICAgIHN1YlByb2plY3Quc2V0RXhlY3V0b3IoZ2V0RXhlY3V0b3IoKS5nZXRTdWJQcm9qZWN0RXhlY3V0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGlzZSB0aGUgcHJvamVjdC4KKyAgICAgKgorICAgICAqIFRoaXMgaW52b2x2ZXMgc2V0dGluZyB0aGUgZGVmYXVsdCB0YXNrIGRlZmluaXRpb25zIGFuZCBsb2FkaW5nIHRoZQorICAgICAqIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZGVmYXVsdCB0YXNrIGxpc3QgY2Fubm90IGJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdFByb3BlcnRpZXMoKTsKKworICAgICAgICBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKHRoaXMpLmluaXREZWZhdWx0RGVmaW5pdGlvbnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcy4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIHZpdGFsIHByb3BlcnR5IGNvdWxkIG5vdCBiZSBzZXQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0UHJvcGVydGllcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHNldEphdmFWZXJzaW9uUHJvcGVydHkoKTsKKyAgICAgICAgc2V0U3lzdGVtUHJvcGVydGllcygpOworICAgICAgICBzZXRQcm9wZXJ0eUludGVybmFsKE1hZ2ljTmFtZXMuQU5UX1ZFUlNJT04sIE1haW4uZ2V0QW50VmVyc2lvbigpKTsKKyAgICAgICAgc2V0QW50TGliKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgcHJvcGVydHkgdG8gdGhlIGxvY2F0aW9uIG9mIGFudC5qYXIuCisgICAgICogVXNlIHRoZSBsb2NhdG9yIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBQcm9qZWN0LmNsYXNzLCBhbmQKKyAgICAgKiBpZiB0aGlzIGlzIG5vdCBudWxsLCBzZXQgdGhlIHByb3BlcnR5IHtAbGluayBNYWdpY05hbWVzI0FOVF9MSUJ9CisgICAgICogdG8gdGhlIHJlc3VsdAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRBbnRMaWIoKSB7CisgICAgICAgIEZpbGUgYW50bGliID0gb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxvY2F0b3IuZ2V0Q2xhc3NTb3VyY2UoCisgICAgICAgICAgICBQcm9qZWN0LmNsYXNzKTsKKyAgICAgICAgaWYgKGFudGxpYiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eUludGVybmFsKE1hZ2ljTmFtZXMuQU5UX0xJQiwgYW50bGliLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBjbGFzcyBsb2FkZXIgZm9yIGxvYWRpbmcgY2xhc3NlcyBmcm9tCisgICAgICogYSBnaXZlbiBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggZnJvbSB3aGljaCBjbGFzc2VzIGFyZSB0byBiZSBsb2FkZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGNsYXNzbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcihQYXRoIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbnRDbGFzc0xvYWRlcigKKyAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgdGhpcywgcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgY2xhc3MgbG9hZGVyIGZvciBsb2FkaW5nIGNsYXNzZXMgZnJvbQorICAgICAqIGEgZ2l2ZW4gcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjbGFzc2xvYWRlciBmb3IgdGhlIG5ldyBsb2FkZXIuCisgICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggZnJvbSB3aGljaCBjbGFzc2VzIGFyZSB0byBiZSBsb2FkZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGNsYXNzbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcigKKyAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50LCBQYXRoIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbnRDbGFzc0xvYWRlcihwYXJlbnQsIHRoaXMsIHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29yZSBjbGFzc2xvYWRlciBmb3IgdGhlIHByb2plY3QuIElmIGEgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiBjbGFzc2xvYWRlciBpcyBzcGVjaWZpZWQsIHRoZSBwYXJlbnQgY2xhc3Nsb2FkZXIgc2hvdWxkIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29yZUxvYWRlciBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIGZvciB0aGUgcHJvamVjdC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29yZUxvYWRlcihDbGFzc0xvYWRlciBjb3JlTG9hZGVyKSB7CisgICAgICAgIHRoaXMuY29yZUxvYWRlciA9IGNvcmVMb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb3JlIGNsYXNzbG9hZGVyIHRvIHVzZSBmb3IgdGhpcyBwcm9qZWN0LgorICAgICAqIFRoaXMgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbmRpY2F0aW5nIHRoYXQKKyAgICAgKiB0aGUgcGFyZW50IGNsYXNzbG9hZGVyIHNob3VsZCBiZSB1c2VkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29yZSBjbGFzc2xvYWRlciB0byB1c2UgZm9yIHRoaXMgcHJvamVjdC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDb3JlTG9hZGVyKCkgeworICAgICAgICByZXR1cm4gY29yZUxvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBidWlsZCBsaXN0ZW5lciB0byB0aGUgbGlzdC4gVGhpcyBsaXN0ZW5lciB3aWxsCisgICAgICogYmUgbm90aWZpZWQgb2YgYnVpbGQgZXZlbnRzIGZvciB0aGlzIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZCB0byB0aGUgbGlzdC4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEJ1aWxkTGlzdGVuZXIoQnVpbGRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAvLyBJZiB0aGUgbGlzdGVuZXJzIGFscmVhZHkgaGFzIHRoaXMgbGlzdGVuZXIsIGRvIG5vdGhpbmcKKyAgICAgICAgaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBjcmVhdGUgYSBuZXcgVmVjdG9yIHRvIGF2b2lkIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGMgd2hlbgorICAgICAgICAvLyB0aGUgbGlzdGVuZXJzIGdldCBhZGRlZC9yZW1vdmVkIHdoaWxlIHdlIGFyZSBpbiBmaXJlCisgICAgICAgIFZlY3RvciBuZXdMaXN0ZW5lcnMgPSBnZXRCdWlsZExpc3RlbmVycygpOworICAgICAgICBuZXdMaXN0ZW5lcnMuYWRkRWxlbWVudChsaXN0ZW5lcik7CisgICAgICAgIGxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBidWlsZCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0LiBUaGlzIGxpc3RlbmVyCisgICAgICogd2lsbCBubyBsb25nZXIgYmUgbm90aWZpZWQgb2YgYnVpbGQgZXZlbnRzIGZvciB0aGlzIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZSBmcm9tIHRoZSBsaXN0LgorICAgICAqICAgICAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVCdWlsZExpc3RlbmVyKEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgbmV3IFZlY3RvciB0byBhdm9pZCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjIHdoZW4KKyAgICAgICAgLy8gdGhlIGxpc3RlbmVycyBnZXQgYWRkZWQvcmVtb3ZlZCB3aGlsZSB3ZSBhcmUgaW4gZmlyZQorICAgICAgICBWZWN0b3IgbmV3TGlzdGVuZXJzID0gZ2V0QnVpbGRMaXN0ZW5lcnMoKTsKKyAgICAgICAgbmV3TGlzdGVuZXJzLnJlbW92ZUVsZW1lbnQobGlzdGVuZXIpOworICAgICAgICBsaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiB0aGUgbGlzdCBvZiBidWlsZCBsaXN0ZW5lcnMgZm9yIHRoZSBwcm9qZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgYnVpbGQgbGlzdGVuZXJzIGZvciB0aGUgcHJvamVjdAorICAgICAqLworICAgIHB1YmxpYyBWZWN0b3IgZ2V0QnVpbGRMaXN0ZW5lcnMoKSB7CisgICAgICAgIHJldHVybiAoVmVjdG9yKSBsaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIG1lc3NhZ2UgdG8gdGhlIGxvZyB3aXRoIHRoZSBkZWZhdWx0IGxvZyBsZXZlbAorICAgICAqIG9mIE1TR19JTkZPIC4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdGV4dCB0byBsb2cuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgbG9nKG1lc3NhZ2UsIE1TR19JTkZPKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHByb2plY3QgbGV2ZWwgbWVzc2FnZSB0byB0aGUgbG9nIHdpdGggdGhlIGdpdmVuIGxvZyBsZXZlbC4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdGV4dCB0byBsb2cuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIG1zZ0xldmVsIFRoZSBsb2cgcHJpb3JpdHkgbGV2ZWwgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgaW50IG1zZ0xldmVsKSB7CisgICAgICAgIGxvZyhtZXNzYWdlLCBudWxsLCBtc2dMZXZlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBwcm9qZWN0IGxldmVsIG1lc3NhZ2UgdG8gdGhlIGxvZyB3aXRoIHRoZSBnaXZlbiBsb2cgbGV2ZWwuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHRleHQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIGV4Y2VwdGlvbiBjYXVzaW5nIHRoaXMgbG9nLCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIG1zZ0xldmVsIFRoZSBsb2cgcHJpb3JpdHkgbGV2ZWwgdG8gdXNlLgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUsIGludCBtc2dMZXZlbCkgeworICAgICAgICBmaXJlTWVzc2FnZUxvZ2dlZCh0aGlzLCBtZXNzYWdlLCB0aHJvd2FibGUsIG1zZ0xldmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHRhc2sgbGV2ZWwgbWVzc2FnZSB0byB0aGUgbG9nIHdpdGggdGhlIGdpdmVuIGxvZyBsZXZlbC4KKyAgICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byB1c2UgaW4gdGhlIGxvZy4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHRleHQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtc2dMZXZlbCBUaGUgbG9nIHByaW9yaXR5IGxldmVsIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coVGFzayB0YXNrLCBTdHJpbmcgbWVzc2FnZSwgaW50IG1zZ0xldmVsKSB7CisgICAgICAgIGZpcmVNZXNzYWdlTG9nZ2VkKHRhc2ssIG1lc3NhZ2UsIG51bGwsIG1zZ0xldmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHRhc2sgbGV2ZWwgbWVzc2FnZSB0byB0aGUgbG9nIHdpdGggdGhlIGdpdmVuIGxvZyBsZXZlbC4KKyAgICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byB1c2UgaW4gdGhlIGxvZy4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHRleHQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIGV4Y2VwdGlvbiBjYXVzaW5nIHRoaXMgbG9nLCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIG1zZ0xldmVsIFRoZSBsb2cgcHJpb3JpdHkgbGV2ZWwgdG8gdXNlLgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coVGFzayB0YXNrLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSwgaW50IG1zZ0xldmVsKSB7CisgICAgICAgIGZpcmVNZXNzYWdlTG9nZ2VkKHRhc2ssIG1lc3NhZ2UsIHRocm93YWJsZSwgbXNnTGV2ZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgdGFyZ2V0IGxldmVsIG1lc3NhZ2UgdG8gdGhlIGxvZyB3aXRoIHRoZSBnaXZlbiBsb2cgbGV2ZWwuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHRvIHVzZSBpbiB0aGUgbG9nLgorICAgICAqICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHRleHQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtc2dMZXZlbCBUaGUgbG9nIHByaW9yaXR5IGxldmVsIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coVGFyZ2V0IHRhcmdldCwgU3RyaW5nIG1lc3NhZ2UsIGludCBtc2dMZXZlbCkgeworICAgICAgICBsb2codGFyZ2V0LCBtZXNzYWdlLCBudWxsLCBtc2dMZXZlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSB0YXJnZXQgbGV2ZWwgbWVzc2FnZSB0byB0aGUgbG9nIHdpdGggdGhlIGdpdmVuIGxvZyBsZXZlbC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gdXNlIGluIHRoZSBsb2cuCisgICAgICogICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdGV4dCB0byBsb2cuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgZXhjZXB0aW9uIGNhdXNpbmcgdGhpcyBsb2csIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbXNnTGV2ZWwgVGhlIGxvZyBwcmlvcml0eSBsZXZlbCB0byB1c2UuCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvZyhUYXJnZXQgdGFyZ2V0LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSwKKyAgICAgICAgICAgIGludCBtc2dMZXZlbCkgeworICAgICAgICBmaXJlTWVzc2FnZUxvZ2dlZCh0YXJnZXQsIG1lc3NhZ2UsIHRocm93YWJsZSwgbXNnTGV2ZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGdsb2JhbCBmaWx0ZXJzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIGdsb2JhbCBmaWx0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJTZXQgZ2V0R2xvYmFsRmlsdGVyU2V0KCkgeworICAgICAgICByZXR1cm4gZ2xvYmFsRmlsdGVyU2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHByb3BlcnR5LiBBbnkgZXhpc3RpbmcgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZQorICAgICAqIGlzIG92ZXJ3cml0dGVuLCB1bmxlc3MgaXQgaXMgYSB1c2VyIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIodGhpcykuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHByb3BlcnR5IGlmIG5vIHZhbHVlIGN1cnJlbnRseSBleGlzdHMuIElmIHRoZSBwcm9wZXJ0eQorICAgICAqIGV4aXN0cyBhbHJlYWR5LCBhIG1lc3NhZ2UgaXMgbG9nZ2VkIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgd2l0aAorICAgICAqIG5vIG90aGVyIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXdQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHRoaXMpLnNldE5ld1Byb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSB1c2VyIHByb3BlcnR5LCB3aGljaCBjYW5ub3QgYmUgb3ZlcndyaXR0ZW4gYnkKKyAgICAgKiBzZXQvdW5zZXQgcHJvcGVydHkgY2FsbHMuIEFueSBwcmV2aW91cyB2YWx1ZSBpcyBvdmVyd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiBwcm9wZXJ0eSB0byBzZXQuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHRoaXMpLnNldFVzZXJQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgdXNlciBwcm9wZXJ0eSwgd2hpY2ggY2Fubm90IGJlIG92ZXJ3cml0dGVuIGJ5IHNldC91bnNldAorICAgICAqIHByb3BlcnR5IGNhbGxzLiBBbnkgcHJldmlvdXMgdmFsdWUgaXMgb3ZlcndyaXR0ZW4uIEFsc28gbWFya3MKKyAgICAgKiB0aGVzZSBwcm9wZXJ0aWVzIGFzIHByb3BlcnRpZXMgdGhhdCBoYXZlIG5vdCBjb21lIGZyb20gdGhlCisgICAgICogY29tbWFuZCBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0LgorICAgICAqICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmhlcml0ZWRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHRoaXMpLnNldEluaGVyaXRlZFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBwcm9wZXJ0eSB1bmxlc3MgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgdXNlciBwcm9wZXJ0eQorICAgICAqIChpbiB3aGljaCBjYXNlIHRoZSBtZXRob2QgcmV0dXJucyBzaWxlbnRseSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBwcm9wZXJ0eSB2YWx1ZS4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5SW50ZXJuYWwoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcih0aGlzKS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSwgaWYgaXQgaXMgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbiB3aGljaCBjYXNlCisgICAgICogICAgICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gbWF0Y2gKKyAgICAgKiAgICAgICAgIG9yIGlmIGEgPGNvZGU+bnVsbDwvY29kZT4gbmFtZSBpcyBwcm92aWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIodGhpcykuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBudWxsIDogU3RyaW5nLnZhbHVlT2YodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2UgJHt9IHN0eWxlIGNvbnN0cnVjdGlvbnMgaW4gdGhlIGdpdmVuIHZhbHVlIHdpdGggdGhlCisgICAgICogc3RyaW5nIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB0byBiZSBzY2FubmVkIGZvciBwcm9wZXJ0eSByZWZlcmVuY2VzLgorICAgICAqICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCBlbWJlZGRlZCBwcm9wZXJ0eSBuYW1lcyByZXBsYWNlZAorICAgICAqICAgICAgICAgYnkgdmFsdWVzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzCisgICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHZhbHVlIGhhcyBhbiB1bmNsb3NlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgbmFtZSwgZS5nLiA8Y29kZT4ke3h4eDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZXBsYWNlUHJvcGVydGllcyhTdHJpbmcgdmFsdWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcih0aGlzKS5yZXBsYWNlUHJvcGVydGllcyhudWxsLCB2YWx1ZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHVzZXIgcHJvcGVydHksIGlmIGl0IGlzIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZQorICAgICAqICAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIG1hdGNoCisgICAgICogICAgICAgICBvciBpZiBhIDxjb2RlPm51bGw8L2NvZGU+IG5hbWUgaXMgcHJvdmlkZWQuCisgICAgICovCisgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHRoaXMpLmdldFVzZXJQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvcHkgb2YgdGhlIHByb3BlcnRpZXMgdGFibGUuCisgICAgICogQHJldHVybiBhIGhhc2h0YWJsZSBjb250YWluaW5nIGFsbCBwcm9wZXJ0aWVzCisgICAgICogICAgICAgICAoaW5jbHVkaW5nIHVzZXIgcHJvcGVydGllcykuCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIodGhpcykuZ2V0UHJvcGVydGllcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvcHkgb2YgdGhlIHVzZXIgcHJvcGVydHkgaGFzaHRhYmxlLgorICAgICAqIEByZXR1cm4gYSBoYXNodGFibGUgY29udGFpbmluZyBqdXN0IHRoZSB1c2VyIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRVc2VyUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHRoaXMpLmdldFVzZXJQcm9wZXJ0aWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBhbGwgdXNlciBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBvbiB0aGUgY29tbWFuZAorICAgICAqIGxpbmUgb3IgYSBHVUkgdG9vbCBmcm9tIHRoaXMgaW5zdGFuY2UgdG8gdGhlIFByb2plY3QgaW5zdGFuY2UKKyAgICAgKiBnaXZlbiBhcyB0aGUgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiA8cD5UbyBjb3B5IGFsbCAmcXVvdDt1c2VyJnF1b3Q7IHByb3BlcnRpZXMsIHlvdSB3aWxsIGFsc28gaGF2ZSB0byBjYWxsCisgICAgICoge0BsaW5rICNjb3B5SW5oZXJpdGVkUHJvcGVydGllcyBjb3B5SW5oZXJpdGVkUHJvcGVydGllc30uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBwcm9qZWN0IHRvIGNvcHkgdGhlIHByb3BlcnRpZXMgdG8uICBNdXN0IG5vdCBiZSBudWxsLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5VXNlclByb3BlcnRpZXMoUHJvamVjdCBvdGhlcikgeworICAgICAgICBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcih0aGlzKS5jb3B5VXNlclByb3BlcnRpZXMob3RoZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgYWxsIHVzZXIgcHJvcGVydGllcyB0aGF0IGhhdmUgbm90IGJlZW4gc2V0IG9uIHRoZQorICAgICAqIGNvbW1hbmQgbGluZSBvciBhIEdVSSB0b29sIGZyb20gdGhpcyBpbnN0YW5jZSB0byB0aGUgUHJvamVjdAorICAgICAqIGluc3RhbmNlIGdpdmVuIGFzIHRoZSBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIDxwPlRvIGNvcHkgYWxsICZxdW90O3VzZXImcXVvdDsgcHJvcGVydGllcywgeW91IHdpbGwgYWxzbyBoYXZlIHRvIGNhbGwKKyAgICAgKiB7QGxpbmsgI2NvcHlVc2VyUHJvcGVydGllcyBjb3B5VXNlclByb3BlcnRpZXN9LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdGhlciB0aGUgcHJvamVjdCB0byBjb3B5IHRoZSBwcm9wZXJ0aWVzIHRvLiAgTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29weUluaGVyaXRlZFByb3BlcnRpZXMoUHJvamVjdCBvdGhlcikgeworICAgICAgICBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcih0aGlzKS5jb3B5SW5oZXJpdGVkUHJvcGVydGllcyhvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IHRhcmdldCBvZiB0aGUgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWZhdWx0VGFyZ2V0IFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHRhcmdldCBmb3IgdGhpcyBwcm9qZWN0LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm8gZGVmYXVsdCB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KKyAgICAgKiAgICAgICAgICAgICBVc2Ugc2V0RGVmYXVsdC4KKyAgICAgKiBAc2VlICNzZXREZWZhdWx0KFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VGFyZ2V0KFN0cmluZyBkZWZhdWx0VGFyZ2V0KSB7CisgICAgICAgIHRoaXMuZGVmYXVsdFRhcmdldCA9IGRlZmF1bHRUYXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHRhcmdldCBvZiB0aGUgcHJvamVjdC4KKyAgICAgKiBAcmV0dXJuIG5hbWUgb2YgdGhlIGRlZmF1bHQgdGFyZ2V0IG9yCisgICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBkZWZhdWx0IGhhcyBiZWVuIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFRhcmdldCBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCB0YXJnZXQgZm9yIHRoaXMgcHJvamVjdC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluZGljYXRpbmcgdGhhdCB0aGVyZSBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vIGRlZmF1bHQgdGFyZ2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIGRlZmF1bHRUYXJnZXQpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0VGFyZ2V0ID0gZGVmYXVsdFRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QsIGFsc28gc2V0dGluZyB0aGUgdXNlcgorICAgICAqIHByb3BlcnR5IDxjb2RlPmFudC5wcm9qZWN0Lm5hbWU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXRVc2VyUHJvcGVydHkoImFudC5wcm9qZWN0Lm5hbWUiLCAgbmFtZSk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm9qZWN0IG5hbWUsIGlmIG9uZSBoYXMgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhc24ndCBiZWVuIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvamVjdCBkZXNjcmlwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHByb2plY3QuCisgICAgICogICAgICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvamVjdCBkZXNjcmlwdGlvbiwgaWYgb25lIGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgZGVzY3JpcHRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhc24ndAorICAgICAqICAgICAgICAgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gRGVzY3JpcHRpb24uZ2V0RGVzY3JpcHRpb24odGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbHRlciB0byB0aGUgc2V0IG9mIGdsb2JhbCBmaWx0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBmaWx0ZXIuCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgcmVwbGFjZW1lbnQgdmFsdWUuCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNC54LgorICAgICAqICAgICAgICAgICAgIFVzZSBnZXRHbG9iYWxGaWx0ZXJTZXQoKS5hZGRGaWx0ZXIodG9rZW4sdmFsdWUpCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRHbG9iYWxGaWx0ZXJTZXQoKQorICAgICAqIEBzZWUgRmlsdGVyU2V0I2FkZEZpbHRlcihTdHJpbmcsU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbHRlcihTdHJpbmcgdG9rZW4sIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGdsb2JhbEZpbHRlclNldC5hZGRGaWx0ZXIobmV3IEZpbHRlclNldC5GaWx0ZXIodG9rZW4sIHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgaGFzaHRhYmxlIG9mIGdsb2JhbCBmaWx0ZXJzLCBtYXBwaW5nIHRva2VucyB0byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgaGFzaHRhYmxlIG9mIGdsb2JhbCBmaWx0ZXJzLCBtYXBwaW5nIHRva2VucyB0byB2YWx1ZXMKKyAgICAgKiAgICAgICAgIChTdHJpbmcgdG8gU3RyaW5nKS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNC54CisgICAgICogICAgICAgICAgICAgVXNlIGdldEdsb2JhbEZpbHRlclNldCgpLmdldEZpbHRlckhhc2goKS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEdsb2JhbEZpbHRlclNldCgpCisgICAgICogQHNlZSBGaWx0ZXJTZXQjZ2V0RmlsdGVySGFzaCgpCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRGaWx0ZXJzKCkgeworICAgICAgICAvLyB3ZSBuZWVkIHRvIGJ1aWxkIHRoZSBoYXNodGFibGUgZHluYW1pY2FsbHkKKyAgICAgICAgcmV0dXJuIGdsb2JhbEZpbHRlclNldC5nZXRGaWx0ZXJIYXNoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHByb2plY3QsIGNoZWNraW5nIHRoYXQKKyAgICAgKiB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlRCBUaGUgcHJvamVjdCBiYXNlIGRpcmVjdG9yeS4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBkaXJlY3RvcnkgaWYgaW52YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKFN0cmluZyBiYXNlRCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0QmFzZURpcihuZXcgRmlsZShiYXNlRCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBwcm9qZWN0LCBjaGVja2luZyB0aGF0CisgICAgICogdGhlIGdpdmVuIGZpbGUgZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlRGlyIFRoZSBwcm9qZWN0IGJhc2UgZGlyZWN0b3J5LgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzbid0IGEgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VEaXIoRmlsZSBiYXNlRGlyKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBiYXNlRGlyID0gRklMRV9VVElMUy5ub3JtYWxpemUoYmFzZURpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGlmICghYmFzZURpci5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCYXNlZGlyICIgKyBiYXNlRGlyLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFiYXNlRGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQmFzZWRpciAiICsgYmFzZURpci5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJhc2VEaXIgPSBiYXNlRGlyOworICAgICAgICBzZXRQcm9wZXJ0eUludGVybmFsKE1hZ2ljTmFtZXMuUFJPSkVDVF9CQVNFRElSLCB0aGlzLmJhc2VEaXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgU3RyaW5nIG1zZyA9ICJQcm9qZWN0IGJhc2UgZGlyIHNldCB0bzogIiArIHRoaXMuYmFzZURpcjsKKyAgICAgICAgIGxvZyhtc2csIE1TR19WRVJCT1NFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IGFzIGEgZmlsZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGJhc2UgZGlyZWN0b3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAgICAgKiAgICAgICAgIGJhc2UgZGlyZWN0b3J5IGhhcyBub3QgYmVlbiBzdWNjZXNzZnVsbHkgc2V0IHRvIGEgdmFsaWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0QmFzZURpcigpIHsKKyAgICAgICAgaWYgKGJhc2VEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXRCYXNlZGlyKCIuIik7CisgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBiYXNlRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCAmcXVvdDtrZWVwLWdvaW5nJnF1b3Q7IG1vZGUuIEluIHRoaXMgbW9kZSBBbnQgd2lsbCB0cnkgdG8gZXhlY3V0ZQorICAgICAqIGFzIG1hbnkgdGFyZ2V0cyBhcyBwb3NzaWJsZS4gQWxsIHRhcmdldHMgdGhhdCBkbyBub3QgZGVwZW5kCisgICAgICogb24gZmFpbGVkIHRhcmdldChzKSB3aWxsIGJlIGV4ZWN1dGVkLiAgSWYgdGhlIGtlZXBHb2luZyBzZXR0b3IvZ2V0dGVyCisgICAgICogbWV0aG9kcyBhcmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSA8Y29kZT5hbnQuZXhlY3V0b3IuY2xhc3M8L2NvZGU+CisgICAgICogcHJvcGVydHksIHRoZXkgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAgICAgKiBAcGFyYW0ga2VlcEdvaW5nTW9kZSAmcXVvdDtrZWVwLWdvaW5nJnF1b3Q7IG1vZGUKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBHb2luZ01vZGUoYm9vbGVhbiBrZWVwR29pbmdNb2RlKSB7CisgICAgICAgIHRoaXMua2VlcEdvaW5nTW9kZSA9IGtlZXBHb2luZ01vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBrZWVwLWdvaW5nIG1vZGUuICBJZiB0aGUga2VlcEdvaW5nIHNldHRvci9nZXR0ZXIKKyAgICAgKiBtZXRob2RzIGFyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIDxjb2RlPmFudC5leGVjdXRvci5jbGFzczwvY29kZT4KKyAgICAgKiBwcm9wZXJ0eSwgdGhleSB3aWxsIGhhdmUgbm8gZWZmZWN0LgorICAgICAqIEByZXR1cm4gJnF1b3Q7a2VlcC1nb2luZyZxdW90OyBtb2RlCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0tlZXBHb2luZ01vZGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmtlZXBHb2luZ01vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIEphdmEgdGhpcyBjbGFzcyBpcyBydW5uaW5nIHVuZGVyLgorICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgSmF2YSBhcyBhIFN0cmluZywgZS5nLiAiMS4xIiAuCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlscyNnZXRKYXZhVmVyc2lvbgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFVzZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlscyBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gSmF2YUVudlV0aWxzLmdldEphdmFWZXJzaW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5hbnQuamF2YS52ZXJzaW9uPC9jb2RlPiBwcm9wZXJ0eSBhbmQgdGVzdHMgZm9yCisgICAgICogdW5zdXBwb3J0ZWQgSlZNIHZlcnNpb25zLiBJZiB0aGUgdmVyc2lvbiBpcyBzdXBwb3J0ZWQsCisgICAgICogdmVyYm9zZSBsb2cgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZCB0byByZWNvcmQgdGhlIEphdmEgdmVyc2lvbgorICAgICAqIGFuZCBvcGVyYXRpbmcgc3lzdGVtIG5hbWUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoaXMgSmF2YSB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzI2dldEphdmFWZXJzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SmF2YVZlcnNpb25Qcm9wZXJ0eSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqYXZhVmVyc2lvbiA9IEphdmFFbnZVdGlscy5nZXRKYXZhVmVyc2lvbigpOworICAgICAgICBzZXRQcm9wZXJ0eUludGVybmFsKE1hZ2ljTmFtZXMuQU5UX0pBVkFfVkVSU0lPTiwgamF2YVZlcnNpb24pOworCisgICAgICAgIC8vIHNhbml0eSBjaGVjaworICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV8wKQorICAgICAgICAgICAgICAgIHx8IEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMSkpICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkFudCBjYW5ub3Qgd29yayBvbiBKYXZhIDEuMCAvIDEuMSIpOworICAgICAgICB9CisgICAgICAgIGxvZygiRGV0ZWN0ZWQgSmF2YSB2ZXJzaW9uOiAiICsgamF2YVZlcnNpb24gKyAiIGluOiAiCisgICAgICAgICAgICArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIiksIE1TR19WRVJCT1NFKTsKKworICAgICAgICBsb2coIkRldGVjdGVkIE9TOiAiICsgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIiksIE1TR19WRVJCT1NFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYWxsIHN5c3RlbSBwcm9wZXJ0aWVzIHdoaWNoIGFyZW4ndCBhbHJlYWR5IGRlZmluZWQgYXMKKyAgICAgKiB1c2VyIHByb3BlcnRpZXMgdG8gdGhlIHByb2plY3QgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0aWVzKCkgeworICAgICAgICBQcm9wZXJ0aWVzIHN5c3RlbVAgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gc3lzdGVtUC5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc3lzdGVtUC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNldFByb3BlcnR5SW50ZXJuYWwocHJvcGVydHlOYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgdGFzayBkZWZpbml0aW9uIHRvIHRoZSBwcm9qZWN0LgorICAgICAqIEF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYW4gZXhpc3RpbmcgZGVmaW5pdGlvbiB3aXRoIGFuCisgICAgICogZXF1aXZhbGVudCBvbmUgKGkuZS4gd2l0aCB0aGUgc2FtZSBjbGFzc25hbWUpIHJlc3VsdHMgaW4KKyAgICAgKiBhIHZlcmJvc2UgbG9nIG1lc3NhZ2UuIEF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYW4gZXhpc3RpbmcgZGVmaW5pdGlvbgorICAgICAqIHdpdGggYSBkaWZmZXJlbnQgb25lIHJlc3VsdHMgaW4gYSB3YXJuaW5nIGxvZyBtZXNzYWdlIGFuZAorICAgICAqIGludmFsaWRhdGVzIGFueSB0YXNrcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIHdpdGggdGhlCisgICAgICogb2xkIGRlZmluaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFza05hbWUgVGhlIG5hbWUgb2YgdGhlIHRhc2sgdG8gYWRkLgorICAgICAqICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdGFza0NsYXNzIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgdGFzay4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3MgaXMgdW5zdWl0YWJsZSBmb3IgYmVpbmcgYW4gQW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLiBBbiBlcnJvciBsZXZlbCBtZXNzYWdlIGlzIGxvZ2dlZCBiZWZvcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKgorICAgICAqIEBzZWUgI2NoZWNrVGFza0NsYXNzKENsYXNzKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRhc2tEZWZpbml0aW9uKFN0cmluZyB0YXNrTmFtZSwgQ2xhc3MgdGFza0NsYXNzKQorICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEhlbHBlcih0aGlzKS5hZGRUYXNrRGVmaW5pdGlvbih0YXNrTmFtZSwKKyAgICAgICAgICAgICAgICB0YXNrQ2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgb3Igbm90IGEgY2xhc3MgaXMgc3VpdGFibGUgZm9yIHNlcnZpbmcgYXMgQW50IHRhc2suCisgICAgICogQW50IHRhc2sgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBtdXN0IGJlIHB1YmxpYywgY29uY3JldGUsIGFuZCBoYXZlCisgICAgICogYSBuby1hcmcgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFza0NsYXNzIFRoZSBjbGFzcyB0byBiZSBjaGVja2VkLgorICAgICAqICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBpcyB1bnN1aXRhYmxlIGZvciBiZWluZyBhbiBBbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suIEFuIGVycm9yIGxldmVsIG1lc3NhZ2UgaXMgbG9nZ2VkIGJlZm9yZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrVGFza0NsYXNzKGZpbmFsIENsYXNzIHRhc2tDbGFzcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEhlbHBlcih0aGlzKS5jaGVja1Rhc2tDbGFzcyh0YXNrQ2xhc3MpOworCisgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWModGFza0NsYXNzLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSB0YXNrQ2xhc3MgKyAiIGlzIG5vdCBwdWJsaWMiOworICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QodGFza0NsYXNzLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSB0YXNrQ2xhc3MgKyAiIGlzIGFic3RyYWN0IjsKKyAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXNrQ2xhc3MuZ2V0Q29uc3RydWN0b3IoKENsYXNzW10pIG51bGwpOworICAgICAgICAgICAgLy8gZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IgcHVibGljLCBzaW5jZQorICAgICAgICAgICAgLy8gZ2V0Q29uc3RydWN0b3IgZmluZHMgcHVibGljIGNvbnN0cnVjdG9ycyBvbmx5LgorICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiTm8gcHVibGljIG5vLWFyZyBjb25zdHJ1Y3RvciBpbiAiCisgICAgICAgICAgICAgICAgKyB0YXNrQ2xhc3M7CisgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkNvdWxkIG5vdCBsb2FkICIgKyB0YXNrQ2xhc3MgKyAiOiAiICsgZTsKKyAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGUpOworICAgICAgICB9CisgICAgICAgIGlmICghVGFzay5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhc2tDbGFzcykpIHsKKyAgICAgICAgICAgIFRhc2tBZGFwdGVyLmNoZWNrVGFza0NsYXNzKHRhc2tDbGFzcywgdGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGFzayBkZWZpbml0aW9uIGhhc2h0YWJsZS4gVGhlIHJldHVybmVkIGhhc2h0YWJsZSBpcworICAgICAqICZxdW90O2xpdmUmcXVvdDsgYW5kIHNvIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIGZyb20gdGFzayBuYW1lIHRvIGltcGxlbWVudGluZyBjbGFzcworICAgICAqICAgICAgICAgKFN0cmluZyB0byBDbGFzcykuCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRUYXNrRGVmaW5pdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKHRoaXMpLmdldFRhc2tEZWZpbml0aW9ucygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBkYXRhdHlwZSBkZWZpbml0aW9uLgorICAgICAqIEF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYW4gZXhpc3RpbmcgZGVmaW5pdGlvbiB3aXRoIGFuCisgICAgICogZXF1aXZhbGVudCBvbmUgKGkuZS4gd2l0aCB0aGUgc2FtZSBjbGFzc25hbWUpIHJlc3VsdHMgaW4KKyAgICAgKiBhIHZlcmJvc2UgbG9nIG1lc3NhZ2UuIEF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYW4gZXhpc3RpbmcgZGVmaW5pdGlvbgorICAgICAqIHdpdGggYSBkaWZmZXJlbnQgb25lIHJlc3VsdHMgaW4gYSB3YXJuaW5nIGxvZyBtZXNzYWdlLCBidXQgdGhlCisgICAgICogZGVmaW5pdGlvbiBpcyBjaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBkYXRhdHlwZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHR5cGVDbGFzcyBUaGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGRhdGF0eXBlLgorICAgICAqICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGF0YVR5cGVEZWZpbml0aW9uKFN0cmluZyB0eXBlTmFtZSwgQ2xhc3MgdHlwZUNsYXNzKSB7CisgICAgICAgIENvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRIZWxwZXIodGhpcykuYWRkRGF0YVR5cGVEZWZpbml0aW9uKHR5cGVOYW1lLAorICAgICAgICAgICAgICAgIHR5cGVDbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IGRhdGF0eXBlIGRlZmluaXRpb24gaGFzaHRhYmxlLiBUaGUgcmV0dXJuZWQKKyAgICAgKiBoYXNodGFibGUgaXMgJnF1b3Q7bGl2ZSZxdW90OyBhbmQgc28gc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBtYXAgb2YgZnJvbSBkYXRhdHlwZSBuYW1lIHRvIGltcGxlbWVudGluZyBjbGFzcworICAgICAqICAgICAgICAgKFN0cmluZyB0byBDbGFzcykuCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXREYXRhVHlwZURlZmluaXRpb25zKCkgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEhlbHBlcih0aGlzKS5nZXREYXRhVHlwZURlZmluaXRpb25zKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgPGVtPm5ldzwvZW0+IHRhcmdldCB0byB0aGUgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB0byBiZSBhZGRlZCB0byB0aGUgcHJvamVjdC4KKyAgICAgKiAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBwcm9qZWN0CisgICAgICoKKyAgICAgKiBAc2VlIFByb2plY3QjYWRkT3JSZXBsYWNlVGFyZ2V0KFRhcmdldCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUYXJnZXQoVGFyZ2V0IHRhcmdldCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkVGFyZ2V0KHRhcmdldC5nZXROYW1lKCksIHRhcmdldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgPGVtPm5ldzwvZW0+IHRhcmdldCB0byB0aGUgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXROYW1lIFRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIHRhcmdldC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gYmUgYWRkZWQgdG8gdGhlIHByb2plY3QuCisgICAgICogICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHRhcmdldCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBzZWUgUHJvamVjdCNhZGRPclJlcGxhY2VUYXJnZXQoU3RyaW5nLCBUYXJnZXQpCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIGFkZFRhcmdldChTdHJpbmcgdGFyZ2V0TmFtZSwgVGFyZ2V0IHRhcmdldCkKKyAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICBpZiAodGFyZ2V0cy5nZXQodGFyZ2V0TmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRHVwbGljYXRlIHRhcmdldDogYCIgKyB0YXJnZXROYW1lICsgIiciKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGFkZE9yUmVwbGFjZVRhcmdldCh0YXJnZXROYW1lLCB0YXJnZXQpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB0YXJnZXQgdG8gdGhlIHByb2plY3QsIG9yIHJlcGxhY2VzIG9uZSB3aXRoIHRoZSBzYW1lCisgICAgICogbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB0byBiZSBhZGRlZCBvciByZXBsYWNlZCBpbiB0aGUgcHJvamVjdC4KKyAgICAgKiAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9yUmVwbGFjZVRhcmdldChUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIGFkZE9yUmVwbGFjZVRhcmdldCh0YXJnZXQuZ2V0TmFtZSgpLCB0YXJnZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHRhcmdldCB0byB0aGUgcHJvamVjdCwgb3IgcmVwbGFjZXMgb25lIHdpdGggdGhlIHNhbWUKKyAgICAgKiBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldE5hbWUgVGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgdGFyZ2V0LgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB0byBiZSBhZGRlZCBvciByZXBsYWNlZCBpbiB0aGUgcHJvamVjdC4KKyAgICAgKiAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9yUmVwbGFjZVRhcmdldChTdHJpbmcgdGFyZ2V0TmFtZSwgVGFyZ2V0IHRhcmdldCkgeworICAgICAgICBTdHJpbmcgbXNnID0gIiArVGFyZ2V0OiAiICsgdGFyZ2V0TmFtZTsKKyAgICAgICAgbG9nKG1zZywgTVNHX0RFQlVHKTsKKyAgICAgICAgdGFyZ2V0LnNldFByb2plY3QodGhpcyk7CisgICAgICAgIHRhcmdldHMucHV0KHRhcmdldE5hbWUsIHRhcmdldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBoYXNodGFibGUgb2YgdGFyZ2V0cy4gVGhlIHJldHVybmVkIGhhc2h0YWJsZQorICAgICAqIGlzICZxdW90O2xpdmUmcXVvdDsgYW5kIHNvIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCisgICAgICogQHJldHVybiBhIG1hcCBmcm9tIG5hbWUgdG8gdGFyZ2V0IChTdHJpbmcgdG8gVGFyZ2V0KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldFRhcmdldHMoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIHRhc2ssIGFkZGluZyBpdCB0byBhIGxpc3Qgb2YKKyAgICAgKiBjcmVhdGVkIHRhc2tzIGZvciBsYXRlciBpbnZhbGlkYXRpb24uIFRoaXMgY2F1c2VzIGFsbCB0YXNrcworICAgICAqIHRvIGJlIHJlbWVtYmVyZWQgdW50aWwgdGhlIGNvbnRhaW5pbmcgcHJvamVjdCBpcyByZW1vdmVkCisgICAgICogQHBhcmFtIHRhc2tUeXBlIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZi4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgdGFzaywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiAgICAgICAgIHRoZSB0YXNrIG5hbWUgaXMgbm90IHJlY29nbmlzZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSB0YXNrIG5hbWUgaXMgcmVjb2duaXNlZCBidXQgdGFzaworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24gZmFpbHMuCisgICAgICovCisgICAgcHVibGljIFRhc2sgY3JlYXRlVGFzayhTdHJpbmcgdGFza1R5cGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKHRoaXMpLmNyZWF0ZVRhc2sodGFza1R5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIGRhdGEgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlTmFtZSBUaGUgbmFtZSBvZiB0aGUgZGF0YSB0eXBlIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZi4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgZGF0YSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqICAgICAgICAgdGhlIGRhdGEgdHlwZSBuYW1lIGlzIG5vdCByZWNvZ25pc2VkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZGF0YSB0eXBlIG5hbWUgaXMgcmVjb2duaXNlZCBidXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGNyZWF0aW9uIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRGF0YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEhlbHBlcih0aGlzKS5jcmVhdGVEYXRhVHlwZSh0eXBlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBFeGVjdXRvciBpbnN0YW5jZSBmb3IgdGhpcyBQcm9qZWN0LgorICAgICAqIEBwYXJhbSBlIHRoZSBFeGVjdXRvciB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0b3IoRXhlY3V0b3IgZSkgeworICAgICAgICBhZGRSZWZlcmVuY2UoTWFnaWNOYW1lcy5BTlRfRVhFQ1VUT1JfUkVGRVJFTkNFLCBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhpcyBQcm9qZWN0J3MgRXhlY3V0b3IgKHNldHRpbmcgaXQgaWYgbmVjZXNzYXJ5KS4KKyAgICAgKiBAcmV0dXJuIGFuIEV4ZWN1dG9yIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBFeGVjdXRvciBnZXRFeGVjdXRvcigpIHsKKyAgICAgICAgT2JqZWN0IG8gPSBnZXRSZWZlcmVuY2UoTWFnaWNOYW1lcy5BTlRfRVhFQ1VUT1JfUkVGRVJFTkNFKTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0VYRUNVVE9SX0NMQVNTTkFNRSk7CisgICAgICAgICAgICBpZiAoY2xhc3NuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSBEZWZhdWx0RXhlY3V0b3IuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJBdHRlbXB0aW5nIHRvIGNyZWF0ZSBvYmplY3Qgb2YgdHlwZSAiICsgY2xhc3NuYW1lLCBNU0dfREVCVUcpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUsIHRydWUsIGNvcmVMb2FkZXIpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHNlYUVuRWZFeCkgeworICAgICAgICAgICAgICAgIC8vdHJ5IHRoZSBjdXJyZW50IGNsYXNzbG9hZGVyCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbyA9IENsYXNzLmZvck5hbWUoY2xhc3NuYW1lKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBsb2coZXgudG9TdHJpbmcoKSwgTVNHX0VSUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbG9nKGV4LnRvU3RyaW5nKCksIE1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBvYnRhaW4gYSBUYXJnZXQgRXhlY3V0b3IgaW5zdGFuY2UuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRFeGVjdXRvcigoRXhlY3V0b3IpIG8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoRXhlY3V0b3IpIG87CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIHNlcXVlbmNlIG9mIHRhcmdldHMsIGFuZCB0aGUgdGFyZ2V0cworICAgICAqIHRoZXkgZGVwZW5kIG9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWVzIEEgdmVjdG9yIG9mIHRhcmdldCBuYW1lIHN0cmluZ3MgdG8gZXhlY3V0ZS4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBidWlsZCBmYWlsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhcmdldHMoVmVjdG9yIG5hbWVzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBnZXRFeGVjdXRvcigpLmV4ZWN1dGVUYXJnZXRzKHRoaXMsCisgICAgICAgICAgICAoU3RyaW5nW10pIChuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZW11bHRpcGxleCBvdXRwdXQgc28gdGhhdCBlYWNoIHRhc2sgcmVjZWl2ZXMgdGhlIGFwcHJvcHJpYXRlCisgICAgICogbWVzc2FnZXMuIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgY3VycmVudGx5IGV4ZWN1dGluZyBhIHRhc2ssCisgICAgICogdGhlIG1lc3NhZ2UgaXMgbG9nZ2VkIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBNZXNzYWdlIHRvIGhhbmRsZS4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gaXNXYXJuaW5nIFdoZXRoZXIgdGhlIHRleHQgcmVwcmVzZW50cyBhbiB3YXJuaW5nICg8Y29kZT50cnVlPC9jb2RlPikKKyAgICAgKiAgICAgICAgb3IgaW5mb3JtYXRpb24gKDxjb2RlPmZhbHNlPC9jb2RlPikuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVtdXhPdXRwdXQoU3RyaW5nIG91dHB1dCwgYm9vbGVhbiBpc1dhcm5pbmcpIHsKKyAgICAgICAgVGFzayB0YXNrID0gZ2V0VGhyZWFkVGFzayhUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgaWYgKHRhc2sgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKG91dHB1dCwgaXNXYXJuaW5nID8gTVNHX1dBUk4gOiBNU0dfSU5GTyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXNXYXJuaW5nKSB7CisgICAgICAgICAgICAgICAgdGFzay5oYW5kbGVFcnJvck91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0YXNrLmhhbmRsZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBkYXRhIGZyb20gdGhlIGRlZmF1bHQgaW5wdXQgc3RyZWFtLiBJZiBubyBkZWZhdWx0IGhhcyBiZWVuCisgICAgICogc3BlY2lmaWVkLCBTeXN0ZW0uaW4gaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgaXMgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGF0IHdoaWNoIGRhdGEgaXMgc3RvcmVkLgorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGRhdGEgY2Fubm90IGJlIHJlYWQuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlZmF1bHRJbnB1dChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGVmYXVsdElucHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0SW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oIk5vIGlucHV0IHByb3ZpZGVkIGZvciBwcm9qZWN0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZW11eCBhbiBpbnB1dCByZXF1ZXN0IHRvIHRoZSBjb3JyZWN0IHRhc2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgaW50byB3aGljaCBkYXRhIGlzIHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBhdCB3aGljaCBkYXRhIGlzIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBhbW91bnQgb2YgZGF0YSB0byByZWFkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBkYXRhIGNhbm5vdCBiZSByZWFkLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIGludCBkZW11eElucHV0KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFRhc2sgdGFzayA9IGdldFRocmVhZFRhc2soVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGlmICh0YXNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0SW5wdXQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGFzay5oYW5kbGVJbnB1dChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbXVsdGlwbGV4IGZsdXNoIG9wZXJhdGlvbnMgc28gdGhhdCBlYWNoIHRhc2sgcmVjZWl2ZXMgdGhlIGFwcHJvcHJpYXRlCisgICAgICogbWVzc2FnZXMuIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgY3VycmVudGx5IGV4ZWN1dGluZyBhIHRhc2ssCisgICAgICogdGhlIG1lc3NhZ2UgaXMgbG9nZ2VkIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBNZXNzYWdlIHRvIGhhbmRsZS4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gaXNFcnJvciBXaGV0aGVyIHRoZSB0ZXh0IHJlcHJlc2VudHMgYW4gZXJyb3IgKDxjb2RlPnRydWU8L2NvZGU+KQorICAgICAqICAgICAgICBvciBpbmZvcm1hdGlvbiAoPGNvZGU+ZmFsc2U8L2NvZGU+KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZW11eEZsdXNoKFN0cmluZyBvdXRwdXQsIGJvb2xlYW4gaXNFcnJvcikgeworICAgICAgICBUYXNrIHRhc2sgPSBnZXRUaHJlYWRUYXNrKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOworICAgICAgICBpZiAodGFzayA9PSBudWxsKSB7CisgICAgICAgICAgICBmaXJlTWVzc2FnZUxvZ2dlZCh0aGlzLCBvdXRwdXQsIGlzRXJyb3IgPyBNU0dfRVJSIDogTVNHX0lORk8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzRXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0YXNrLmhhbmRsZUVycm9yRmx1c2gob3V0cHV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGFzay5oYW5kbGVGbHVzaChvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIHRhcmdldCBhbmQgYW55IHRhcmdldHMgaXQgZGVwZW5kcyBvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXROYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdG8gZXhlY3V0ZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGJ1aWxkIGZhaWxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0KFN0cmluZyB0YXJnZXROYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIHNhbml0eSBjaGVjayBvdXJzZWx2ZXMsIGlmIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYnVpbGQgbm90aGluZworICAgICAgICAvLyB0aGVuIHdlIHNob3VsZCBjb21wbGFpbgorCisgICAgICAgIGlmICh0YXJnZXROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiTm8gdGFyZ2V0IHNwZWNpZmllZCI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvcnQgYW5kIHJ1biB0aGUgZGVwZW5kZW5jeSB0cmVlLgorICAgICAgICAvLyBTb3J0aW5nIGNoZWNrcyBpZiBhbGwgdGhlIHRhcmdldHMgKGFuZCBkZXBlbmRlbmNpZXMpCisgICAgICAgIC8vIGV4aXN0LCBhbmQgaWYgdGhlcmUgaXMgYW55IGN5Y2xlIGluIHRoZSBkZXBlbmRlbmN5CisgICAgICAgIC8vIGdyYXBoLgorICAgICAgICBleGVjdXRlU29ydGVkVGFyZ2V0cyh0b3BvU29ydCh0YXJnZXROYW1lLCB0YXJnZXRzLCBmYWxzZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSA8Y29kZT5WZWN0b3I8L2NvZGU+IG9mIHNvcnRlZCB0YXJnZXRzLgorICAgICAqIEBwYXJhbSBzb3J0ZWRUYXJnZXRzICAgdGhlIGFmb3JlbWVudGlvbmVkIDxjb2RlPlZlY3RvcjwvY29kZT4uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlU29ydGVkVGFyZ2V0cyhWZWN0b3Igc29ydGVkVGFyZ2V0cykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0IHN1Y2NlZWRlZFRhcmdldHMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBCdWlsZEV4Y2VwdGlvbiBidWlsZEV4Y2VwdGlvbiA9IG51bGw7IC8vIGZpcnN0IGJ1aWxkIGV4Y2VwdGlvbgorICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGl0ZXIgPSBzb3J0ZWRUYXJnZXRzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgaXRlci5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFRhcmdldCBjdXJ0YXJnZXQgPSAoVGFyZ2V0KSBpdGVyLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBib29sZWFuIGNhbkV4ZWN1dGUgPSB0cnVlOworICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBkZXBJdGVyID0gY3VydGFyZ2V0LmdldERlcGVuZGVuY2llcygpOworICAgICAgICAgICAgICAgICBkZXBJdGVyLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBkZXBlbmRlbmN5TmFtZSA9ICgoU3RyaW5nKSBkZXBJdGVyLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgIGlmICghc3VjY2VlZGVkVGFyZ2V0cy5jb250YWlucyhkZXBlbmRlbmN5TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuRXhlY3V0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBsb2coY3VydGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBleGVjdXRlICciICsgY3VydGFyZ2V0LmdldE5hbWUoKSArICInIC0gJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGVwZW5kZW5jeU5hbWUgKyAiJyBmYWlsZWQgb3Igd2FzIG5vdCBleGVjdXRlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTVNHX0VSUik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYW5FeGVjdXRlKSB7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93bkV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY3VydGFyZ2V0LnBlcmZvcm1UYXNrcygpOworICAgICAgICAgICAgICAgICAgICBzdWNjZWVkZWRUYXJnZXRzLmFkZChjdXJ0YXJnZXQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGtlZXBHb2luZ01vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsgLy8gdGhyb3cgZnVydGhlcgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93bkV4Y2VwdGlvbiA9IGV4OworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIShrZWVwR29pbmdNb2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvd25FeGNlcHRpb24gPSBleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRocm93bkV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvd25FeGNlcHRpb24gaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGN1cnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0ICciICsgY3VydGFyZ2V0LmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgZmFpbGVkIHdpdGggbWVzc2FnZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhyb3duRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSArICInLiIsIE1TR19FUlIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB0aGUgZmlyc3QgYnVpbGQgZXhjZXB0aW9uIGlzIHJlcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRFeGNlcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkRXhjZXB0aW9uID0gKEJ1aWxkRXhjZXB0aW9uKSB0aHJvd25FeGNlcHRpb247CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coY3VydGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYXJnZXQgJyIgKyBjdXJ0YXJnZXQuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBmYWlsZWQgd2l0aCBtZXNzYWdlICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aHJvd25FeGNlcHRpb24uZ2V0TWVzc2FnZSgpICsgIicuIiwgTVNHX0VSUik7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd25FeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkRXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEV4Y2VwdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdWlsZEV4Y2VwdGlvbih0aHJvd25FeGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWlsZEV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBidWlsZEV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBmaWxlbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSBpcyByZWxhdGl2ZSBpdCBpcyByZXNvbHZlZAorICAgICAqIHdpdGggcmVzcGVjdCB0byB0aGUgZ2l2ZW4gcm9vdCBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmVzb2x2ZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdERpciAgVGhlIGRpcmVjdG9yeSByZXNwZWN0aXZlIHRvIHdoaWNoIHJlbGF0aXZlIGZpbGUgbmFtZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgYXJlIHJlc29sdmVkLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBGaWxlLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS40LngKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSByZXNvbHZlRmlsZShTdHJpbmcgZmlsZU5hbWUsIEZpbGUgcm9vdERpcikgeworICAgICAgICByZXR1cm4gRklMRV9VVElMUy5yZXNvbHZlRmlsZShyb290RGlyLCBmaWxlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjYW5vbmljYWwgZm9ybSBvZiBhIGZpbGVuYW1lLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGlzIHJlbGF0aXZlIGl0IGlzIHJlc29sdmVkCisgICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSBwcm9qZWN0J3MgYmFzZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmVzb2x2ZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBGaWxlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIEZpbGUgcmVzb2x2ZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIHJldHVybiBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGJhc2VEaXIsIGZpbGVOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGUgYSBwYXRoIGludG8gaXRzIG5hdGl2ZSAocGxhdGZvcm0gc3BlY2lmaWMpIGZvcm1hdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIFBhdGhUb2tlbml6ZXIgdG8gc2VwYXJhdGUgdGhlIGlucHV0IHBhdGgKKyAgICAgKiBpbnRvIGl0cyBjb21wb25lbnRzLiBUaGlzIGhhbmRsZXMgRE9TIHN0eWxlIHBhdGhzIGluIGEgcmVsYXRpdmVseQorICAgICAqIHNlbnNpYmxlIHdheS4gVGhlIGZpbGUgc2VwYXJhdG9ycyBhcmUgdGhlbiBjb252ZXJ0ZWQgdG8gdGhlaXIgcGxhdGZvcm0KKyAgICAgKiBzcGVjaWZpYyB2ZXJzaW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b1Byb2Nlc3MgVGhlIHBhdGggdG8gYmUgdHJhbnNsYXRlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgcGF0aCBvcgorICAgICAqICAgICAgICAgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBwYXRoIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43CisgICAgICogICAgICAgICAgICAgVXNlIEZpbGVVdGlscy50cmFuc2xhdGVQYXRoIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAc2VlIFBhdGhUb2tlbml6ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVQYXRoKFN0cmluZyB0b1Byb2Nlc3MpIHsKKyAgICAgICAgcmV0dXJuIEZpbGVVdGlscy50cmFuc2xhdGVQYXRoKHRvUHJvY2Vzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYSBkZXN0aW5hdGlvbi4KKyAgICAgKiBObyBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGUgTmFtZSBvZiBmaWxlIHRvIGNvcHkgZnJvbS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgTmFtZSBvZiBmaWxlIHRvIGNvcHkgdG8uCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgY29weWluZyBmYWlscy4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNC54CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29weUZpbGUoU3RyaW5nIHNvdXJjZUZpbGUsIFN0cmluZyBkZXN0RmlsZSkKKyAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGSUxFX1VUSUxTLmNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uCisgICAgICogc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZSBOYW1lIG9mIGZpbGUgdG8gY29weSBmcm9tLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBkZXN0RmlsZSBOYW1lIG9mIGZpbGUgdG8gY29weSB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGZpbHRlcmluZyBXaGV0aGVyIG9yIG5vdCB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIGJlIHVzZWQgZHVyaW5nCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgY29weS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGNvcHlpbmcgZmFpbHMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjQueAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGaWxlLCBTdHJpbmcgZGVzdEZpbGUsIGJvb2xlYW4gZmlsdGVyaW5nKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGSUxFX1VUSUxTLmNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlLAorICAgICAgICAgICAgZmlsdGVyaW5nID8gZ2xvYmFsRmlsdGVycyA6IG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb3B5IGEgZmlsZSBmcm9tIGEgc291cmNlIHRvIGEKKyAgICAgKiBkZXN0aW5hdGlvbiBzcGVjaWZ5aW5nIGlmIHRva2VuIGZpbHRlcmluZyBzaG91bGQgYmUgdXNlZCBhbmQgaWYKKyAgICAgKiBzb3VyY2UgZmlsZXMgbWF5IG92ZXJ3cml0ZSBuZXdlciBkZXN0aW5hdGlvbiBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIE5hbWUgb2YgZmlsZSB0byBjb3B5IGZyb20uCisgICAgICogICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGRlc3RGaWxlIE5hbWUgb2YgZmlsZSB0byBjb3B5IHRvLgorICAgICAqICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmlsdGVyaW5nIFdoZXRoZXIgb3Igbm90IHRva2VuIGZpbHRlcmluZyBzaG91bGQgYmUgdXNlZCBkdXJpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBjb3B5LgorICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hldGhlciBvciBub3QgdGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGNvcHlpbmcgZmFpbHMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjQueAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGaWxlLCBTdHJpbmcgZGVzdEZpbGUsIGJvb2xlYW4gZmlsdGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGSUxFX1VUSUxTLmNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlLAorICAgICAgICAgICAgZmlsdGVyaW5nID8gZ2xvYmFsRmlsdGVycyA6IG51bGwsIG92ZXJ3cml0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYQorICAgICAqIGRlc3RpbmF0aW9uIHNwZWNpZnlpbmcgaWYgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCBiZSB1c2VkLCBpZgorICAgICAqIHNvdXJjZSBmaWxlcyBtYXkgb3ZlcndyaXRlIG5ld2VyIGRlc3RpbmF0aW9uIGZpbGVzLCBhbmQgaWYgdGhlCisgICAgICogbGFzdCBtb2RpZmllZCB0aW1lIG9mIHRoZSByZXN1bHRpbmcgZmlsZSBzaG91bGQgYmUgc2V0IHRvCisgICAgICogdGhhdCBvZiB0aGUgc291cmNlIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZSBOYW1lIG9mIGZpbGUgdG8gY29weSBmcm9tLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBkZXN0RmlsZSBOYW1lIG9mIGZpbGUgdG8gY29weSB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGZpbHRlcmluZyBXaGV0aGVyIG9yIG5vdCB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIGJlIHVzZWQgZHVyaW5nCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgY29weS4KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIFdoZXRoZXIgb3Igbm90IHRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuCisgICAgICogQHBhcmFtIHByZXNlcnZlTGFzdE1vZGlmaWVkIFdoZXRoZXIgb3Igbm90IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdGluZyBmaWxlIHNob3VsZCBiZSBzZXQgdG8gdGhhdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc291cmNlIGZpbGUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBjb3B5aW5nIGZhaWxzLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS40LngKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc291cmNlRmlsZSwgU3RyaW5nIGRlc3RGaWxlLCBib29sZWFuIGZpbHRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRklMRV9VVElMUy5jb3B5RmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSwKKyAgICAgICAgICAgIGZpbHRlcmluZyA/IGdsb2JhbEZpbHRlcnMgOiBudWxsLCBvdmVyd3JpdGUsIHByZXNlcnZlTGFzdE1vZGlmaWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uLgorICAgICAqIE5vIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZSBGaWxlIHRvIGNvcHkgZnJvbS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgRmlsZSB0byBjb3B5IHRvLgorICAgICAqICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGNvcHlpbmcgZmFpbHMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjQueAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRklMRV9VVElMUy5jb3B5RmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYSBkZXN0aW5hdGlvbgorICAgICAqIHNwZWNpZnlpbmcgaWYgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCBiZSB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGUgRmlsZSB0byBjb3B5IGZyb20uCisgICAgICogICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGRlc3RGaWxlIEZpbGUgdG8gY29weSB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGZpbHRlcmluZyBXaGV0aGVyIG9yIG5vdCB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIGJlIHVzZWQgZHVyaW5nCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgY29weS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGNvcHlpbmcgZmFpbHMuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjQueAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwgYm9vbGVhbiBmaWx0ZXJpbmcpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZJTEVfVVRJTFMuY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsCisgICAgICAgICAgICBmaWx0ZXJpbmcgPyBnbG9iYWxGaWx0ZXJzIDogbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYQorICAgICAqIGRlc3RpbmF0aW9uIHNwZWNpZnlpbmcgaWYgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCBiZSB1c2VkIGFuZCBpZgorICAgICAqIHNvdXJjZSBmaWxlcyBtYXkgb3ZlcndyaXRlIG5ld2VyIGRlc3RpbmF0aW9uIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGUgRmlsZSB0byBjb3B5IGZyb20uCisgICAgICogICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGRlc3RGaWxlIEZpbGUgdG8gY29weSB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGZpbHRlcmluZyBXaGV0aGVyIG9yIG5vdCB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIGJlIHVzZWQgZHVyaW5nCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgY29weS4KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIFdoZXRoZXIgb3Igbm90IHRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBjb3BpZWQuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjQueAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwgYm9vbGVhbiBmaWx0ZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZJTEVfVVRJTFMuY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsCisgICAgICAgICAgICBmaWx0ZXJpbmcgPyBnbG9iYWxGaWx0ZXJzIDogbnVsbCwgb3ZlcndyaXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhCisgICAgICogZGVzdGluYXRpb24gc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIGJlIHVzZWQsIGlmCisgICAgICogc291cmNlIGZpbGVzIG1heSBvdmVyd3JpdGUgbmV3ZXIgZGVzdGluYXRpb24gZmlsZXMsIGFuZCBpZiB0aGUKKyAgICAgKiBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgdGhlIHJlc3VsdGluZyBmaWxlIHNob3VsZCBiZSBzZXQgdG8KKyAgICAgKiB0aGF0IG9mIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIEZpbGUgdG8gY29weSBmcm9tLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBkZXN0RmlsZSBGaWxlIHRvIGNvcHkgdG8uCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWx0ZXJpbmcgV2hldGhlciBvciBub3QgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCBiZSB1c2VkIGR1cmluZworICAgICAqICAgICAgICAgICAgICAgICAgdGhlIGNvcHkuCisgICAgICogQHBhcmFtIG92ZXJ3cml0ZSBXaGV0aGVyIG9yIG5vdCB0aGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICAgICAqIEBwYXJhbSBwcmVzZXJ2ZUxhc3RNb2RpZmllZCBXaGV0aGVyIG9yIG5vdCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgZmlsZSBzaG91bGQgYmUgc2V0IHRvIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNvdXJjZSBmaWxlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgY29waWVkLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS40LngKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUsIGJvb2xlYW4gZmlsdGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3ZlcndyaXRlLCBib29sZWFuIHByZXNlcnZlTGFzdE1vZGlmaWVkKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGSUxFX1VUSUxTLmNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlLAorICAgICAgICAgICAgZmlsdGVyaW5nID8gZ2xvYmFsRmlsdGVycyA6IG51bGwsIG92ZXJ3cml0ZSwgcHJlc2VydmVMYXN0TW9kaWZpZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgRmlsZS5zZXRMYXN0TW9kaWZpZWQobG9uZyB0aW1lKSBvbiBKYXZhIGFib3ZlIDEuMSwgYW5kIGxvZ3MKKyAgICAgKiBhIHdhcm5pbmcgb24gSmF2YSAxLjEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBzZXQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvbi4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lIHRoZSByZXF1aXJlZCBtb2RpZmljYXRpb24gdGltZS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNC54CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgY2Fubm90IGJlIHNldAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzcGl0ZSBydW5uaW5nIG9uIGEgcGxhdGZvcm0gd2l0aCBhIHZlcnNpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIDEuMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTGFzdE1vZGlmaWVkKEZpbGUgZmlsZSwgbG9uZyB0aW1lKQorICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgRklMRV9VVElMUy5zZXRGaWxlTGFzdE1vZGlmaWVkKGZpbGUsIHRpbWUpOworICAgICAgICBsb2coIlNldHRpbmcgbW9kaWZpY2F0aW9uIHRpbWUgZm9yICIgKyBmaWxlLCBNU0dfVkVSQk9TRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBib29sZWFuIGVxdWl2YWxlbnQgb2YgYSBzdHJpbmcsIHdoaWNoIGlzIGNvbnNpZGVyZWQKKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlaXRoZXIgPGNvZGU+Im9uIjwvY29kZT4sIDxjb2RlPiJ0cnVlIjwvY29kZT4sCisgICAgICogb3IgPGNvZGU+InllcyI8L2NvZGU+IGlzIGZvdW5kLCBpZ25vcmluZyBjYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBjb252ZXJ0IHRvIGEgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHN0cmluZyBpcyA8Y29kZT4ib24iPC9jb2RlPiwKKyAgICAgKiAgICAgICAgIDxjb2RlPiJ0cnVlIjwvY29kZT4gb3IgPGNvZGU+InllcyI8L2NvZGU+LCBvcgorICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdG9Cb29sZWFuKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiAoIm9uIi5lcXVhbHNJZ25vcmVDYXNlKHMpCisgICAgICAgICAgICAgICAgfHwgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UocykKKyAgICAgICAgICAgICAgICB8fCAieWVzIi5lcXVhbHNJZ25vcmVDYXNlKHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFByb2plY3QgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgdG8gcXVlcnkuCisgICAgICogQHJldHVybiBQcm9qZWN0IGluc3RhbmNlLCBpZiBhbnkuCisgICAgICogQHNpbmNlIEFudCAxLjcuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdCBnZXRQcm9qZWN0KE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgUHJvamVjdENvbXBvbmVudCkgeworICAgICAgICAgICAgcmV0dXJuICgoUHJvamVjdENvbXBvbmVudCkgbykuZ2V0UHJvamVjdCgpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbSA9IG8uZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldFByb2plY3QiLCAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgICAgICBpZiAoUHJvamVjdC5jbGFzcyA9PSBtLmdldFJldHVyblR5cGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoUHJvamVjdCkgbS5pbnZva2UobywgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vdG9vIGJhZAorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvcG9sb2dpY2FsbHkgc29ydCBhIHNldCBvZiB0YXJnZXRzLiAgRXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICogPGNvZGU+dG9wb1NvcnQobmV3IFN0cmluZ1tdIHtyb290fSwgdGFyZ2V0cywgdHJ1ZSk8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3QgVGhlIG5hbWUgb2YgdGhlIHJvb3QgdGFyZ2V0LiBUaGUgc29ydCBpcyBjcmVhdGVkIGluIHN1Y2gKKyAgICAgKiAgICAgICAgICAgICBhIHdheSB0aGF0IHRoZSBzZXF1ZW5jZSBvZiBUYXJnZXRzIHVwIHRvIHRoZSByb290CisgICAgICogICAgICAgICAgICAgdGFyZ2V0IGlzIHRoZSBtaW5pbXVtIHBvc3NpYmxlIHN1Y2ggc2VxdWVuY2UuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHRhcmdldFRhYmxlIEEgSGFzaHRhYmxlIG1hcHBpbmcgbmFtZXMgdG8gVGFyZ2V0cy4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIGEgVmVjdG9yIG9mIEFMTCBUYXJnZXQgb2JqZWN0cyBpbiBzb3J0ZWQgb3JkZXIuCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIGN5Y2xpYyBkZXBlbmRlbmN5IGFtb25nIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cywgb3IgaWYgYSBuYW1lZCB0YXJnZXQgZG9lcyBub3QgZXhpc3QuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFZlY3RvciB0b3BvU29ydChTdHJpbmcgcm9vdCwgSGFzaHRhYmxlIHRhcmdldFRhYmxlKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdG9wb1NvcnQobmV3IFN0cmluZ1tdIHtyb290fSwgdGFyZ2V0VGFibGUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvcG9sb2dpY2FsbHkgc29ydCBhIHNldCBvZiB0YXJnZXRzLiAgRXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICogPGNvZGU+dG9wb1NvcnQobmV3IFN0cmluZ1tdIHtyb290fSwgdGFyZ2V0cywgcmV0dXJuQWxsKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCBUaGUgbmFtZSBvZiB0aGUgcm9vdCB0YXJnZXQuIFRoZSBzb3J0IGlzIGNyZWF0ZWQgaW4gc3VjaAorICAgICAqICAgICAgICAgICAgIGEgd2F5IHRoYXQgdGhlIHNlcXVlbmNlIG9mIFRhcmdldHMgdXAgdG8gdGhlIHJvb3QKKyAgICAgKiAgICAgICAgICAgICB0YXJnZXQgaXMgdGhlIG1pbmltdW0gcG9zc2libGUgc3VjaCBzZXF1ZW5jZS4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0VGFibGUgQSBIYXNodGFibGUgbWFwcGluZyBuYW1lcyB0byBUYXJnZXRzLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSByZXR1cm5BbGwgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHVybiBhbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRhcmdldHMsIG9yIHRoZSBleGVjdXRpb24gc2VxdWVuY2Ugb25seS4KKyAgICAgKiBAcmV0dXJuIGEgVmVjdG9yIG9mIFRhcmdldCBvYmplY3RzIGluIHNvcnRlZCBvcmRlci4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgY3ljbGljIGRlcGVuZGVuY3kgYW1vbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLCBvciBpZiBhIG5hbWVkIHRhcmdldCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFZlY3RvciB0b3BvU29ydChTdHJpbmcgcm9vdCwgSGFzaHRhYmxlIHRhcmdldFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXR1cm5BbGwpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0b3BvU29ydChuZXcgU3RyaW5nW10ge3Jvb3R9LCB0YXJnZXRUYWJsZSwgcmV0dXJuQWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUb3BvbG9naWNhbGx5IHNvcnQgYSBzZXQgb2YgdGFyZ2V0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290IDxjb2RlPlN0cmluZ1tdPC9jb2RlPiBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgcm9vdCB0YXJnZXRzLgorICAgICAqICAgICAgICAgICAgIFRoZSBzb3J0IGlzIGNyZWF0ZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBvcmRlcmVkIHNlcXVlbmNlIG9mCisgICAgICogICAgICAgICAgICAgVGFyZ2V0cyBpcyB0aGUgbWluaW11bSBwb3NzaWJsZSBzdWNoIHNlcXVlbmNlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgICByb290IHRhcmdldHMuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHRhcmdldFRhYmxlIEEgbWFwIG9mIG5hbWVzIHRvIHRhcmdldHMgKFN0cmluZyB0byBUYXJnZXQpLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSByZXR1cm5BbGwgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHVybiBhbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRhcmdldHMsIG9yIHRoZSBleGVjdXRpb24gc2VxdWVuY2Ugb25seS4KKyAgICAgKiBAcmV0dXJuIGEgVmVjdG9yIG9mIFRhcmdldCBvYmplY3RzIGluIHNvcnRlZCBvcmRlci4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgY3ljbGljIGRlcGVuZGVuY3kgYW1vbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLCBvciBpZiBhIG5hbWVkIHRhcmdldCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFZlY3RvciB0b3BvU29ydChTdHJpbmdbXSByb290LCBIYXNodGFibGUgdGFyZ2V0VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJldHVybkFsbCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIHJldCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgSGFzaHRhYmxlIHN0YXRlID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBTdGFjayB2aXNpdGluZyA9IG5ldyBTdGFjaygpOworCisgICAgICAgIC8vIFdlIGZpcnN0IHJ1biBhIERGUyBiYXNlZCBzb3J0IHVzaW5nIGVhY2ggcm9vdCBhcyBhIHN0YXJ0aW5nIG5vZGUuCisgICAgICAgIC8vIFRoaXMgY3JlYXRlcyB0aGUgbWluaW11bSBzZXF1ZW5jZSBvZiBUYXJnZXRzIHRvIHRoZSByb290IG5vZGUocykuCisgICAgICAgIC8vIFdlIHRoZW4gZG8gYSBzb3J0IG9uIGFueSByZW1haW5pbmcgdW5WSVNJVEVEIHRhcmdldHMuCisgICAgICAgIC8vIFRoaXMgaXMgdW5uZWNlc3NhcnkgZm9yIGRvaW5nIG91ciBidWlsZCwgYnV0IGl0IGNhdGNoZXMKKyAgICAgICAgLy8gY2lyY3VsYXIgZGVwZW5kZW5jaWVzIG9yIG1pc3NpbmcgVGFyZ2V0cyBvbiB0aGUgZW50aXJlCisgICAgICAgIC8vIGRlcGVuZGVuY3kgdHJlZSwgbm90IGp1c3Qgb24gdGhlIFRhcmdldHMgdGhhdCBkZXBlbmQgb24gdGhlCisgICAgICAgIC8vIGJ1aWxkIFRhcmdldC4KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvb3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBzdCA9IChTdHJpbmcpIChzdGF0ZS5nZXQocm9vdFtpXSkpOworICAgICAgICAgICAgaWYgKHN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0c29ydChyb290W2ldLCB0YXJnZXRUYWJsZSwgc3RhdGUsIHZpc2l0aW5nLCByZXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdCA9PSBWSVNJVElORykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIG5vZGUgaW4gdmlzaXRpbmcgc3RhdGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyByb290W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiQnVpbGQgc2VxdWVuY2UgZm9yIHRhcmdldChzKSIpOworCisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcm9vdC5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgoaiA9PSAwKSA/ICIgYCIgOiAiLCBgIikuYXBwZW5kKHJvb3Rbal0pLmFwcGVuZCgnXCcnKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIgaXMgIiArIHJldCk7CisgICAgICAgIGxvZyhidWYudG9TdHJpbmcoKSwgTVNHX1ZFUkJPU0UpOworCisgICAgICAgIFZlY3RvciBjb21wbGV0ZSA9IChyZXR1cm5BbGwpID8gcmV0IDogbmV3IFZlY3RvcihyZXQpOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGVuID0gdGFyZ2V0VGFibGUua2V5cygpOyBlbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBjdXJUYXJnZXQgPSAoU3RyaW5nKSBlbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHN0ID0gKFN0cmluZykgc3RhdGUuZ2V0KGN1clRhcmdldCk7CisgICAgICAgICAgICBpZiAoc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRzb3J0KGN1clRhcmdldCwgdGFyZ2V0VGFibGUsIHN0YXRlLCB2aXNpdGluZywgY29tcGxldGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdCA9PSBWSVNJVElORykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIG5vZGUgaW4gdmlzaXRpbmcgc3RhdGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjdXJUYXJnZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZygiQ29tcGxldGUgYnVpbGQgc2VxdWVuY2UgaXMgIiArIGNvbXBsZXRlLCBNU0dfVkVSQk9TRSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIHNpbmdsZSBzdGVwIGluIGEgcmVjdXJzaXZlIGRlcHRoLWZpcnN0LXNlYXJjaCB0cmF2ZXJzYWwgb2YKKyAgICAgKiB0aGUgdGFyZ2V0IGRlcGVuZGVuY3kgdHJlZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY3VycmVudCB0YXJnZXQgaXMgZmlyc3Qgc2V0IHRvIHRoZSAmcXVvdDt2aXNpdGluZyZxdW90OyBzdGF0ZSwgYW5kCisgICAgICogcHVzaGVkIG9udG8gdGhlICZxdW90O3Zpc2l0aW5nJnF1b3Q7IHN0YWNrLgorICAgICAqIDxwPgorICAgICAqIEFuIGV4Y2VwdGlvbiBpcyB0aGVuIHRocm93biBpZiBhbnkgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbm9kZSBpcyBpbiB0aGUKKyAgICAgKiB2aXNpdGluZyBzdGF0ZSwgYXMgdGhhdCBpbXBsaWVzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS4gVGhlIGV4Y2VwdGlvbgorICAgICAqIGNvbnRhaW5zIGRldGFpbHMgb2YgdGhlIGN5Y2xlLCB1c2luZyBlbGVtZW50cyBvZiB0aGUgJnF1b3Q7dmlzaXRpbmcmcXVvdDsKKyAgICAgKiBzdGFjay4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhbnkgY2hpbGQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gJnF1b3Q7dmlzaXRlZCZxdW90OywgdGhpcyBtZXRob2QgaXMKKyAgICAgKiBjYWxsZWQgcmVjdXJzaXZlbHkgb24gaXQuCisgICAgICogPHA+CisgICAgICogVGhlIGN1cnJlbnQgdGFyZ2V0IGlzIHRoZW4gYWRkZWQgdG8gdGhlIG9yZGVyZWQgbGlzdCBvZiB0YXJnZXRzLiBOb3RlCisgICAgICogdGhhdCB0aGlzIGlzIHBlcmZvcm1lZCBhZnRlciB0aGUgY2hpbGRyZW4gaGF2ZSBiZWVuIHZpc2l0ZWQgaW4gb3JkZXIKKyAgICAgKiB0byBnZXQgdGhlIGNvcnJlY3Qgb3JkZXIuIFRoZSBjdXJyZW50IHRhcmdldCBpcyBzZXQgdG8gdGhlCisgICAgICogJnF1b3Q7dmlzaXRlZCZxdW90OyBzdGF0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBCeSB0aGUgdGltZSB0aGlzIG1ldGhvZCByZXR1cm5zLCB0aGUgb3JkZXJlZCBsaXN0IGNvbnRhaW5zIHRoZSBzZXF1ZW5jZQorICAgICAqIG9mIHRhcmdldHMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgY3VycmVudCB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCBUaGUgY3VycmVudCB0YXJnZXQgdG8gaW5zcGVjdC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0VGFibGUgQSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gdGFyZ2V0cyAoU3RyaW5nIHRvIFRhcmdldCkuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHN0YXRlICAgQSBtYXBwaW5nIGZyb20gdGFyZ2V0IG5hbWVzIHRvIHN0YXRlcyAoU3RyaW5nIHRvIFN0cmluZykuCisgICAgICogICAgICAgICAgICAgICAgVGhlIHN0YXRlcyBpbiBxdWVzdGlvbiBhcmUgJnF1b3Q7VklTSVRJTkcmcXVvdDsgYW5kCisgICAgICogICAgICAgICAgICAgICAgJnF1b3Q7VklTSVRFRCZxdW90Oy4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHZpc2l0aW5nIEEgc3RhY2sgb2YgdGFyZ2V0cyB3aGljaCBhcmUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQuCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSByZXQgICAgIFRoZSBsaXN0IHRvIGFkZCB0YXJnZXQgbmFtZXMgdG8uIFRoaXMgd2lsbCBlbmQgdXAKKyAgICAgKiAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBpbgorICAgICAqICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgb3JkZXIuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGEgbm9uLWV4aXN0ZW50IHRhcmdldCBpcyBzcGVjaWZpZWQgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBpcyBkZXRlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdHNvcnQoU3RyaW5nIHJvb3QsIEhhc2h0YWJsZSB0YXJnZXRUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIHN0YXRlLCBTdGFjayB2aXNpdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIHJldCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhdGUucHV0KHJvb3QsIFZJU0lUSU5HKTsKKyAgICAgICAgdmlzaXRpbmcucHVzaChyb290KTsKKworICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gKFRhcmdldCkgdGFyZ2V0VGFibGUuZ2V0KHJvb3QpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBleGlzdAorICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlRhcmdldCBcIiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHJvb3QpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcHJvamVjdCBcIiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJcIi4gIik7CisgICAgICAgICAgICB2aXNpdGluZy5wb3AoKTsKKyAgICAgICAgICAgIGlmICghdmlzaXRpbmcuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSAoU3RyaW5nKSB2aXNpdGluZy5wZWVrKCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJJdCBpcyB1c2VkIGZyb20gdGFyZ2V0IFwiIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmVudCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihuZXcgU3RyaW5nKHNiKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlbiA9IHRhcmdldC5nZXREZXBlbmRlbmNpZXMoKTsgZW4uaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgY3VyID0gKFN0cmluZykgZW4ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBtID0gKFN0cmluZykgc3RhdGUuZ2V0KGN1cik7CisgICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IGJlZW4gdmlzaXRlZAorICAgICAgICAgICAgICAgIHRzb3J0KGN1ciwgdGFyZ2V0VGFibGUsIHN0YXRlLCB2aXNpdGluZywgcmV0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobSA9PSBWSVNJVElORykgeworICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSB2aXNpdGluZyB0aGlzIG5vZGUsIHNvIGhhdmUgYSBjeWNsZQorICAgICAgICAgICAgICAgIHRocm93IG1ha2VDaXJjdWxhckV4Y2VwdGlvbihjdXIsIHZpc2l0aW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcCA9IChTdHJpbmcpIHZpc2l0aW5nLnBvcCgpOworICAgICAgICBpZiAocm9vdCAhPSBwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvcjogZXhwZWN0ZWQgdG8gIgorICAgICAgICAgICAgICAgICsgInBvcCAiICsgcm9vdCArICIgYnV0IGdvdCAiICsgcCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUucHV0KHJvb3QsIFZJU0lURUQpOworICAgICAgICByZXQuYWRkRWxlbWVudCh0YXJnZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBkZXRhaWxpbmcgYSBzcGVjaWZpZWQgY2lyY3VsYXIKKyAgICAgKiBkZXBlbmRlbmN5LgorICAgICAqCisgICAgICogQHBhcmFtIGVuZCBUaGUgZGVwZW5kZW5jeSB0byBzdG9wIGF0LiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RrIEEgc3RhY2sgb2YgZGVwZW5kZW5jaWVzLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBCdWlsZEV4Y2VwdGlvbiBkZXRhaWxpbmcgdGhlIHNwZWNpZmllZCBjaXJjdWxhciBkZXBlbmRlbmN5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJ1aWxkRXhjZXB0aW9uIG1ha2VDaXJjdWxhckV4Y2VwdGlvbihTdHJpbmcgZW5kLCBTdGFjayBzdGspIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiQ2lyY3VsYXIgZGVwZW5kZW5jeTogIik7CisgICAgICAgIHNiLmFwcGVuZChlbmQpOworICAgICAgICBTdHJpbmcgYzsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYyA9IChTdHJpbmcpIHN0ay5wb3AoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIDwtICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICB9IHdoaWxlICghYy5lcXVhbHMoZW5kKSk7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24obmV3IFN0cmluZyhzYikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaGVyaXQgdGhlIGlkIHJlZmVyZW5jZXMuCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IHByb2plY3Qgb2YgdGhpcyBwcm9qZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaGVyaXRJRFJlZmVyZW5jZXMoUHJvamVjdCBwYXJlbnQpIHsKKyAgICAgICAgcGFyZW50SWRQcm9qZWN0ID0gcGFyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBpZCByZWZlcmVuY2UuCisgICAgICogVXNlZCBmb3IgYnJva2VuIGJ1aWxkIGZpbGVzLgorICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgdG8gc2V0LgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0IGl0IHRvIChVbmtub3duIGVsZW1lbnQgaW4gdGhpcyBjYXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZElkUmVmZXJlbmNlKFN0cmluZyBpZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlkUmVmZXJlbmNlcy5wdXQoaWQsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZWZlcmVuY2UgdG8gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKFN0cmluZyByZWZlcmVuY2VOYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChyZWZlcmVuY2VzKSB7CisgICAgICAgICAgICBPYmplY3Qgb2xkID0gKChBbnRSZWZUYWJsZSkgcmVmZXJlbmNlcykuZ2V0UmVhbChyZWZlcmVuY2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChvbGQgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyBubyB3YXJuaW5nLCB0aGlzIGlzIG5vdCBjaGFuZ2luZyBhbnl0aGluZworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbGQgIT0gbnVsbCAmJiAhKG9sZCBpbnN0YW5jZW9mIFVua25vd25FbGVtZW50KSkgeworICAgICAgICAgICAgICAgIGxvZygiT3ZlcnJpZGluZyBwcmV2aW91cyBkZWZpbml0aW9uIG9mIHJlZmVyZW5jZSB0byAiICsgcmVmZXJlbmNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJBZGRpbmcgcmVmZXJlbmNlOiAiICsgcmVmZXJlbmNlTmFtZSwgTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIHJlZmVyZW5jZXMucHV0KHJlZmVyZW5jZU5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG1hcCBvZiB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgcHJvamVjdCAoU3RyaW5nIHRvIE9iamVjdCkuCisgICAgICogVGhlIHJldHVybmVkIGhhc2h0YWJsZSBpcyAmcXVvdDtsaXZlJnF1b3Q7IGFuZCBzbyBtdXN0IG5vdCBiZSBtb2RpZmllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBtYXAgb2YgdGhlIHJlZmVyZW5jZXMgaW4gdGhlIHByb2plY3QgKFN0cmluZyB0byBPYmplY3QpLgorICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0UmVmZXJlbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9vayB1cCBhIHJlZmVyZW5jZSBieSBpdHMga2V5IChJRCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBkZXNpcmVkIHJlZmVyZW5jZS4KKyAgICAgKiAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBJRCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiAgICAgICAgIHRoZXJlIGlzIG5vIHN1Y2ggcmVmZXJlbmNlIGluIHRoZSBwcm9qZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKFN0cmluZyBrZXkpIHsKKyAgICAgICAgT2JqZWN0IHJldCA9IHJlZmVyZW5jZXMuZ2V0KGtleSk7CisgICAgICAgIGlmIChyZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWtleS5lcXVhbHMoTWFnaWNOYW1lcy5SRUZJRF9QUk9QRVJUWV9IRUxQRVIpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcih0aGlzKS5jb250YWluc1Byb3BlcnRpZXMoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIlVucmVzb2x2YWJsZSByZWZlcmVuY2UgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtaWdodCBiZSBhIG1pc3VzZSBvZiBwcm9wZXJ0eSBleHBhbnNpb24gc3ludGF4LiIsIE1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgd2l0aAorICAgICAqIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGluc3RhbmNlcyBvZiB0YXNrcyBhbmQgZGF0YSB0eXBlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbG9nZ2luZyBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGRlc2NyaWJlLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50IHR5cGUuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS45NSwgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRIZWxwZXIodGhpcykuZ2V0RWxlbWVudE5hbWUoZWxlbWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhICZxdW90O2J1aWxkIHN0YXJ0ZWQmcXVvdDsgZXZlbnQKKyAgICAgKiB0byB0aGUgYnVpbGQgbGlzdGVuZXJzIGZvciB0aGlzIHByb2plY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUJ1aWxkU3RhcnRlZCgpIHsKKyAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRoaXMpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9IChCdWlsZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLmJ1aWxkU3RhcnRlZChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGEgJnF1b3Q7YnVpbGQgZmluaXNoZWQmcXVvdDsgZXZlbnQgdG8gdGhlIGJ1aWxkIGxpc3RlbmVycworICAgICAqIGZvciB0aGlzIHByb2plY3QuCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBhbiBleGNlcHRpb24gaW5kaWNhdGluZyBhIHJlYXNvbiBmb3IgYSBidWlsZAorICAgICAqICAgICAgICAgICAgICAgICAgZmFpbHVyZS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbmRpY2F0aW5nCisgICAgICogICAgICAgICAgICAgICAgICBhIHN1Y2Nlc3NmdWwgYnVpbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUJ1aWxkRmluaXNoZWQoVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworICAgICAgICBCdWlsZEV2ZW50IGV2ZW50ID0gbmV3IEJ1aWxkRXZlbnQodGhpcyk7CisgICAgICAgIGV2ZW50LnNldEV4Y2VwdGlvbihleGNlcHRpb24pOworICAgICAgICBJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgQnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9IChCdWlsZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLmJ1aWxkRmluaXNoZWQoZXZlbnQpOworICAgICAgICB9CisgICAgICAgIC8vIEluZm9ybSBJSCB0byBjbGVhciB0aGUgY2FjaGUKKyAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlci5jbGVhckNhY2hlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhICZxdW90O3N1YmJ1aWxkIHN0YXJ0ZWQmcXVvdDsgZXZlbnQgdG8gdGhlIGJ1aWxkIGxpc3RlbmVycyBmb3IKKyAgICAgKiB0aGlzIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZVN1YkJ1aWxkU3RhcnRlZCgpIHsKKyAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRoaXMpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBTdWJCdWlsZExpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgKChTdWJCdWlsZExpc3RlbmVyKSBsaXN0ZW5lcikuc3ViQnVpbGRTdGFydGVkKGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgYSAmcXVvdDtzdWJidWlsZCBmaW5pc2hlZCZxdW90OyBldmVudCB0byB0aGUgYnVpbGQgbGlzdGVuZXJzIGZvcgorICAgICAqIHRoaXMgcHJvamVjdC4KKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGEgcmVhc29uIGZvciBhIGJ1aWxkCisgICAgICogICAgICAgICAgICAgICAgICBmYWlsdXJlLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluZGljYXRpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgIGEgc3VjY2Vzc2Z1bCBidWlsZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlU3ViQnVpbGRGaW5pc2hlZChUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0aGlzKTsKKyAgICAgICAgZXZlbnQuc2V0RXhjZXB0aW9uKGV4Y2VwdGlvbik7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBPYmplY3QgbGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFN1YkJ1aWxkTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAoKFN1YkJ1aWxkTGlzdGVuZXIpIGxpc3RlbmVyKS5zdWJCdWlsZEZpbmlzaGVkKGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgYSAmcXVvdDt0YXJnZXQgc3RhcnRlZCZxdW90OyBldmVudCB0byB0aGUgYnVpbGQgbGlzdGVuZXJzCisgICAgICogZm9yIHRoaXMgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB3aGljaCBpcyBzdGFydGluZyB0byBidWlsZC4KKyAgICAgKiAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVUYXJnZXRTdGFydGVkKFRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgQnVpbGRFdmVudCBldmVudCA9IG5ldyBCdWlsZEV2ZW50KHRhcmdldCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBCdWlsZExpc3RlbmVyIGxpc3RlbmVyID0gKEJ1aWxkTGlzdGVuZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgbGlzdGVuZXIudGFyZ2V0U3RhcnRlZChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGEgJnF1b3Q7dGFyZ2V0IGZpbmlzaGVkJnF1b3Q7IGV2ZW50IHRvIHRoZSBidWlsZCBsaXN0ZW5lcnMKKyAgICAgKiBmb3IgdGhpcyBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCAgICBUaGUgdGFyZ2V0IHdoaWNoIGhhcyBmaW5pc2hlZCBidWlsZGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBleGNlcHRpb24gYW4gZXhjZXB0aW9uIGluZGljYXRpbmcgYSByZWFzb24gZm9yIGEgYnVpbGQKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW5kaWNhdGluZworICAgICAqICAgICAgICAgICAgICAgICAgYSBzdWNjZXNzZnVsIGJ1aWxkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVUYXJnZXRGaW5pc2hlZChUYXJnZXQgdGFyZ2V0LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0YXJnZXQpOworICAgICAgICBldmVudC5zZXRFeGNlcHRpb24oZXhjZXB0aW9uKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBsaXN0ZW5lci50YXJnZXRGaW5pc2hlZChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGEgJnF1b3Q7dGFzayBzdGFydGVkJnF1b3Q7IGV2ZW50IHRvIHRoZSBidWlsZCBsaXN0ZW5lcnMKKyAgICAgKiBmb3IgdGhpcyBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgVGhlIHRhcmdldCB3aGljaCBpcyBzdGFydGluZyB0byBleGVjdXRlLgorICAgICAqICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmlyZVRhc2tTdGFydGVkKFRhc2sgdGFzaykgeworICAgICAgICAvLyByZWdpc3RlciB0aGlzIGFzIHRoZSBjdXJyZW50IHRhc2sgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgICAgICByZWdpc3RlclRocmVhZFRhc2soVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgdGFzayk7CisgICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0YXNrKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBsaXN0ZW5lci50YXNrU3RhcnRlZChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGEgJnF1b3Q7dGFzayBmaW5pc2hlZCZxdW90OyBldmVudCB0byB0aGUgYnVpbGQgbGlzdGVuZXJzIGZvciB0aGlzCisgICAgICogcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrICAgICAgVGhlIHRhc2sgd2hpY2ggaGFzIGZpbmlzaGVkIGV4ZWN1dGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBleGNlcHRpb24gYW4gZXhjZXB0aW9uIGluZGljYXRpbmcgYSByZWFzb24gZm9yIGEgYnVpbGQKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW5kaWNhdGluZworICAgICAqICAgICAgICAgICAgICAgICAgYSBzdWNjZXNzZnVsIGJ1aWxkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVUYXNrRmluaXNoZWQoVGFzayB0YXNrLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgIHJlZ2lzdGVyVGhyZWFkVGFzayhUaHJlYWQuY3VycmVudFRocmVhZCgpLCBudWxsKTsKKyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOworICAgICAgICBTeXN0ZW0uZXJyLmZsdXNoKCk7CisgICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0YXNrKTsKKyAgICAgICAgZXZlbnQuc2V0RXhjZXB0aW9uKGV4Y2VwdGlvbik7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBCdWlsZExpc3RlbmVyIGxpc3RlbmVyID0gKEJ1aWxkTGlzdGVuZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgbGlzdGVuZXIudGFza0ZpbmlzaGVkKGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgYSAmcXVvdDttZXNzYWdlIGxvZ2dlZCZxdW90OyBldmVudCB0byB0aGUgYnVpbGQgbGlzdGVuZXJzCisgICAgICogZm9yIHRoaXMgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCAgICBUaGUgZXZlbnQgdG8gc2VuZC4gVGhpcyBzaG91bGQgYmUgYnVpbHQgdXAgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgdGFzay90YXJnZXQvcHJvamVjdCBieSB0aGUgY2FsbGVyLCBzbyB0aGF0CisgICAgICogICAgICAgICAgICAgICAgIHRoaXMgbWV0aG9kIGNhbiBzZXQgdGhlIG1lc3NhZ2UgYW5kIHByaW9yaXR5LCB0aGVuIHNlbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgdGhlIGV2ZW50LiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAgVGhlIG1lc3NhZ2UgdG8gc2VuZC4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaXJlTWVzc2FnZUxvZ2dlZEV2ZW50KEJ1aWxkRXZlbnQgZXZlbnQsIFN0cmluZyBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSkgeworCisgICAgICAgIGlmIChtZXNzYWdlLmVuZHNXaXRoKFN0cmluZ1V0aWxzLkxJTkVfU0VQKSkgeworICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gbWVzc2FnZS5sZW5ndGgoKSAtIFN0cmluZ1V0aWxzLkxJTkVfU0VQLmxlbmd0aCgpOworICAgICAgICAgICAgZXZlbnQuc2V0TWVzc2FnZShtZXNzYWdlLnN1YnN0cmluZygwLCBlbmRJbmRleCksIHByaW9yaXR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV2ZW50LnNldE1lc3NhZ2UobWVzc2FnZSwgcHJpb3JpdHkpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKGxvZ2dpbmdNZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBPbmUgb2YgdGhlIExpc3RlbmVycyBoYXMgYXR0ZW1wdGVkIHRvIGFjY2VzcworICAgICAgICAgICAgICAgICAqIFN5c3RlbS5lcnIgb3IgU3lzdGVtLm91dC4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFdlIHVzZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGluIHRoaXMgY2FzZSwgYnV0CisgICAgICAgICAgICAgICAgICogc29tZXRpbWVzIExpc3RlbmVycyBjYW4ndCBwcmV2ZW50IGl0KGxpa2Ugb3VyIG93bgorICAgICAgICAgICAgICAgICAqIExvZzRqTGlzdGVuZXIgd2hpY2ggaW52b2tlcyBnZXRMb2dnZXIoKSB3aGljaCBpbgorICAgICAgICAgICAgICAgICAqIHR1cm4gd2FudHMgdG8gd3JpdGUgdG8gdGhlIGNvbnNvbGUpLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQHNlZSBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz90PTExMDUzODYyNDIwMDAwNiZyPTEmdz0yCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBXZSBub3cgKEFudCAxLjcgYW5kIDEuNi4zKSBzaW1wbHkgc3dhbGxvdyB0aGUgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvZ2dpbmdNZXNzYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgPSAoQnVpbGRMaXN0ZW5lcikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm1lc3NhZ2VMb2dnZWQoZXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbG9nZ2luZ01lc3NhZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgYSAmcXVvdDttZXNzYWdlIGxvZ2dlZCZxdW90OyBwcm9qZWN0IGxldmVsIGV2ZW50CisgICAgICogdG8gdGhlIGJ1aWxkIGxpc3RlbmVycyBmb3IgdGhpcyBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgIFRoZSBwcm9qZWN0IGdlbmVyYXRpbmcgdGhlIGV2ZW50LgorICAgICAqICAgICAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtZXNzYWdlICBUaGUgbWVzc2FnZSB0byBzZW5kLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmlyZU1lc3NhZ2VMb2dnZWQoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgZmlyZU1lc3NhZ2VMb2dnZWQocHJvamVjdCwgbWVzc2FnZSwgbnVsbCwgcHJpb3JpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgYSAmcXVvdDttZXNzYWdlIGxvZ2dlZCZxdW90OyBwcm9qZWN0IGxldmVsIGV2ZW50CisgICAgICogdG8gdGhlIGJ1aWxkIGxpc3RlbmVycyBmb3IgdGhpcyBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgIFRoZSBwcm9qZWN0IGdlbmVyYXRpbmcgdGhlIGV2ZW50LgorICAgICAqICAgICAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtZXNzYWdlICBUaGUgbWVzc2FnZSB0byBzZW5kLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIG1lc3NhZ2UuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlLgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlTWVzc2FnZUxvZ2dlZChQcm9qZWN0IHByb2plY3QsIFN0cmluZyBtZXNzYWdlLAorICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudChwcm9qZWN0KTsKKyAgICAgICAgZXZlbnQuc2V0RXhjZXB0aW9uKHRocm93YWJsZSk7CisgICAgICAgIGZpcmVNZXNzYWdlTG9nZ2VkRXZlbnQoZXZlbnQsIG1lc3NhZ2UsIHByaW9yaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGEgJnF1b3Q7bWVzc2FnZSBsb2dnZWQmcXVvdDsgdGFyZ2V0IGxldmVsIGV2ZW50CisgICAgICogdG8gdGhlIGJ1aWxkIGxpc3RlbmVycyBmb3IgdGhpcyBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCAgIFRoZSB0YXJnZXQgZ2VuZXJhdGluZyB0aGUgZXZlbnQuCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtZXNzYWdlICBUaGUgbWVzc2FnZSB0byBzZW5kLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmlyZU1lc3NhZ2VMb2dnZWQoVGFyZ2V0IHRhcmdldCwgU3RyaW5nIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5KSB7CisgICAgICAgIGZpcmVNZXNzYWdlTG9nZ2VkKHRhcmdldCwgbWVzc2FnZSwgbnVsbCwgcHJpb3JpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgYSAmcXVvdDttZXNzYWdlIGxvZ2dlZCZxdW90OyB0YXJnZXQgbGV2ZWwgZXZlbnQKKyAgICAgKiB0byB0aGUgYnVpbGQgbGlzdGVuZXJzIGZvciB0aGlzIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0ICAgVGhlIHRhcmdldCBnZW5lcmF0aW5nIHRoZSBldmVudC4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIG1lc3NhZ2UgIFRoZSBtZXNzYWdlIHRvIHNlbmQuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoaXMgbWVzc2FnZS4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIG1lc3NhZ2UuCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVNZXNzYWdlTG9nZ2VkKFRhcmdldCB0YXJnZXQsIFN0cmluZyBtZXNzYWdlLAorICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0YXJnZXQpOworICAgICAgICBldmVudC5zZXRFeGNlcHRpb24odGhyb3dhYmxlKTsKKyAgICAgICAgZmlyZU1lc3NhZ2VMb2dnZWRFdmVudChldmVudCwgbWVzc2FnZSwgcHJpb3JpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgYSAmcXVvdDttZXNzYWdlIGxvZ2dlZCZxdW90OyB0YXNrIGxldmVsIGV2ZW50CisgICAgICogdG8gdGhlIGJ1aWxkIGxpc3RlbmVycyBmb3IgdGhpcyBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgICAgIFRoZSB0YXNrIGdlbmVyYXRpbmcgdGhlIGV2ZW50LgorICAgICAqICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAgVGhlIG1lc3NhZ2UgdG8gc2VuZC4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVNZXNzYWdlTG9nZ2VkKFRhc2sgdGFzaywgU3RyaW5nIG1lc3NhZ2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBmaXJlTWVzc2FnZUxvZ2dlZCh0YXNrLCBtZXNzYWdlLCBudWxsLCBwcmlvcml0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhICZxdW90O21lc3NhZ2UgbG9nZ2VkJnF1b3Q7IHRhc2sgbGV2ZWwgZXZlbnQKKyAgICAgKiB0byB0aGUgYnVpbGQgbGlzdGVuZXJzIGZvciB0aGlzIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFzayAgICAgVGhlIHRhc2sgZ2VuZXJhdGluZyB0aGUgZXZlbnQuCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtZXNzYWdlICBUaGUgbWVzc2FnZSB0byBzZW5kLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIG1lc3NhZ2UuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkgVGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlLgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlTWVzc2FnZUxvZ2dlZChUYXNrIHRhc2ssIFN0cmluZyBtZXNzYWdlLAorICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIEJ1aWxkRXZlbnQgZXZlbnQgPSBuZXcgQnVpbGRFdmVudCh0YXNrKTsKKyAgICAgICAgZXZlbnQuc2V0RXhjZXB0aW9uKHRocm93YWJsZSk7CisgICAgICAgIGZpcmVNZXNzYWdlTG9nZ2VkRXZlbnQoZXZlbnQsIG1lc3NhZ2UsIHByaW9yaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIHRhc2sgYXMgdGhlIGN1cnJlbnQgdGFzayBmb3IgYSB0aHJlYWQuCisgICAgICogSWYgdGhlIHRhc2sgaXMgbnVsbCwgdGhlIHRocmVhZCdzIGVudHJ5IGlzIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyZWFkIHRoZSB0aHJlYWQgb24gd2hpY2ggdGhlIHRhc2sgaXMgcmVnaXN0ZXJlZC4KKyAgICAgKiBAcGFyYW0gdGFzayB0aGUgdGFzayB0byBiZSByZWdpc3RlcmVkLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyVGhyZWFkVGFzayhUaHJlYWQgdGhyZWFkLCBUYXNrIHRhc2spIHsKKyAgICAgICAgaWYgKHRhc2sgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyZWFkVGFza3MucHV0KHRocmVhZCwgdGFzayk7CisgICAgICAgICAgICB0aHJlYWRHcm91cFRhc2tzLnB1dCh0aHJlYWQuZ2V0VGhyZWFkR3JvdXAoKSwgdGFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJlYWRUYXNrcy5yZW1vdmUodGhyZWFkKTsKKyAgICAgICAgICAgIHRocmVhZEdyb3VwVGFza3MucmVtb3ZlKHRocmVhZC5nZXRUaHJlYWRHcm91cCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCB0YXNrIGFzc29jaWF0ZWQgd2l0aCBhIHRocmVhZCwgaWYgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIHRocmVhZCB0aGUgdGhyZWFkIGZvciB3aGljaCB0aGUgdGFzayBpcyByZXF1aXJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0YXNrIHdoaWNoIGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gdGhyZWFkIG9yCisgICAgICogICAgICAgICBudWxsIGlmIG5vIHRhc2sgaXMgcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFzayBnZXRUaHJlYWRUYXNrKFRocmVhZCB0aHJlYWQpIHsKKyAgICAgICAgVGFzayB0YXNrID0gKFRhc2spIHRocmVhZFRhc2tzLmdldCh0aHJlYWQpOworICAgICAgICBpZiAodGFzayA9PSBudWxsKSB7CisgICAgICAgICAgICBUaHJlYWRHcm91cCBncm91cCA9IHRocmVhZC5nZXRUaHJlYWRHcm91cCgpOworICAgICAgICAgICAgd2hpbGUgKHRhc2sgPT0gbnVsbCAmJiBncm91cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGFzayA9IChUYXNrKSB0aHJlYWRHcm91cFRhc2tzLmdldChncm91cCk7CisgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGFzazsKKyAgICB9CisKKworICAgIC8vIFNob3VsZCBtb3ZlIHRvIGEgc2VwYXJhdGUgcHVibGljIGNsYXNzIC0gYW5kIGhhdmUgQVBJIHRvIGFkZAorICAgIC8vIGxpc3RlbmVycywgZXRjLgorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFudFJlZlRhYmxlIGV4dGVuZHMgSGFzaHRhYmxlIHsKKworICAgICAgICBBbnRSZWZUYWJsZSgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgdW5tb2RpZmllZCBvcmlnaW5hbCBvYmplY3QuCisgICAgICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW50ZXJuYWxseSB0bworICAgICAgICAgKiBnZXQgdGhlICZxdW90O3JlYWwmcXVvdDsgb2JqZWN0LgorICAgICAgICAgKiBUaGUgbm9ybWFsIGdldCBtZXRob2Qgd2lsbCBkbyB0aGUgcmVwbGFjZW1lbnQKKyAgICAgICAgICogb2YgVW5rbm93bkVsZW1lbnQgKHRoaXMgaXMgc2ltaWxhciB3aXRoIHRoZSBKRE5JCisgICAgICAgICAqIHJlZnMgYmVoYXZpb3IpLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgZ2V0UmVhbChPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogR2V0IG1ldGhvZCBmb3IgdGhlIHJlZmVyZW5jZSB0YWJsZS4KKyAgICAgICAgICogIEl0IGNhbiBiZSB1c2VkIHRvIGhvb2sgZHluYW1pYyByZWZlcmVuY2VzIGFuZCB0byBtb2RpZnkKKyAgICAgICAgICogc29tZSByZWZlcmVuY2VzIG9uIHRoZSBmbHktLWZvciBleGFtcGxlIGZvciBkZWxheWVkCisgICAgICAgICAqIGV2YWx1YXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEl0IGlzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcHJvY2Vzc2luZyB0aGF0IGlzCisgICAgICAgICAqIGRvbmUgaW5zaWRlIGlzIG5vdCBjYWxsaW5nIGdldCBpbmRpcmVjdGx5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ga2V5IGxvb2t1cCBrZXkuCisgICAgICAgICAqIEByZXR1cm4gbWFwcGVkIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFudFJlZlRhYmxlLmdldCAiICsga2V5KTsKKyAgICAgICAgICAgIE9iamVjdCBvID0gZ2V0UmVhbChrZXkpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0CisgICAgICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgdWUgPSAoVW5rbm93bkVsZW1lbnQpIG87CisgICAgICAgICAgICAgICAgdWUubWF5YmVDb25maWd1cmUoKTsKKyAgICAgICAgICAgICAgICBvID0gdWUuZ2V0UmVhbFRoaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHJlZmVyZW5jZSB0byB0aGlzIFByb2plY3Qgb24gdGhlIHBhcmFtZXRlcml6ZWQgb2JqZWN0LgorICAgICAqIE5lZWQgdG8gc2V0IHRoZSBwcm9qZWN0IGJlZm9yZSBvdGhlciBzZXQvYWRkIGVsZW1lbnRzCisgICAgICogYXJlIGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gaW52b2tlIHNldFByb2plY3QodGhpcykgb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0UHJvamVjdFJlZmVyZW5jZShmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQcm9qZWN0Q29tcG9uZW50KSB7CisgICAgICAgICAgICAoKFByb2plY3RDb21wb25lbnQpIG9iaikuc2V0UHJvamVjdCh0aGlzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9CisgICAgICAgICAgICAgICAgb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKAorICAgICAgICAgICAgICAgICAgICAic2V0UHJvamVjdCIsIG5ldyBDbGFzc1tdIHtQcm9qZWN0LmNsYXNzfSk7CisgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKG9iaiwgbmV3IE9iamVjdFtdIHt0aGlzfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBpZiB0aGUgb2JqZWN0IGRvZXMgbm90IGhhdmUKKyAgICAgICAgICAgIC8vIGEgc2V0IHByb2plY3QgbWV0aG9kIG9yIHRoZSBtZXRob2QKKyAgICAgICAgICAgIC8vIGlzIHByaXZhdGUvcHJvdGVjdGVkLgorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCdzIGJhc2VkaXIgYW5kIHJldHVybiBpdCBhcyBhCisgICAgICogRmlsZVJlc291cmNlLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHJlc29sdmUuCisgICAgICogQHJldHVybiB0aGUgZmlsZSByZXNvdXJjZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZShnZXRCYXNlRGlyKCksIG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RDb21wb25lbnQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFhOGVjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBjb21wb25lbnRzIG9mIGEgcHJvamVjdCwgaW5jbHVkaW5nIHRhc2tzIGFuZCBkYXRhIHR5cGVzLgorICogUHJvdmlkZXMgY29tbW9uIGZhY2lsaXRpZXMuCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdENvbXBvbmVudCBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8qKgorICAgICAqIFByb2plY3Qgb2JqZWN0IG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgorICAgICAqICAgICAgICAgICAgIFlvdSBzaG91bGQgbm90IGJlIGRpcmVjdGx5IGFjY2Vzc2luZyB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5LgorICAgICAqICAgICAgICAgICAgIFlvdSBzaG91bGQgYWNjZXNzIHByb2plY3Qgb2JqZWN0IHZpYSB0aGUgZ2V0UHJvamVjdCgpCisgICAgICogICAgICAgICAgICAgb3Igc2V0UHJvamVjdCgpIGFjY2Vzc29yL211dGF0b3JzLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGlvbiB3aXRoaW4gdGhlIGJ1aWxkIGZpbGUgb2YgdGhpcyB0YXNrIGRlZmluaXRpb24uCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICogICAgICAgICAgICAgWW91IHNob3VsZCBub3QgYmUgYWNjZXNzaW5nIHRoaXMgdmFyaWFibGUgZGlyZWN0bHkuCisgICAgICogICAgICAgICAgICAgUGxlYXNlIHVzZSB0aGUge0BsaW5rICNnZXRMb2NhdGlvbigpfSBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIExvY2F0aW9uIGxvY2F0aW9uID0gTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTjsKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIG9mIHRoaXMgY29tcG9uZW50LCBpZiBhbnkuCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICogICAgICAgICAgICAgWW91IHNob3VsZCBub3QgYmUgYWNjZXNzaW5nIHRoaXMgdmFyaWFibGUgZGlyZWN0bHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqIFNvbGUgY29uc3RydWN0b3IuICovCisgICAgcHVibGljIFByb2plY3RDb21wb25lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvamVjdCBvYmplY3Qgb2YgdGhpcyBjb21wb25lbnQuIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkKKyAgICAgKiBQcm9qZWN0IHdoZW4gYSBjb21wb25lbnQgaXMgYWRkZWQgdG8gaXQgc28gdGhhdCB0aGUgY29tcG9uZW50IGhhcworICAgICAqIGFjY2VzcyB0byB0aGUgZnVuY3Rpb25zIG9mIHRoZSBwcm9qZWN0LiBJdCBzaG91bGQgbm90IGJlIHVzZWQKKyAgICAgKiBmb3IgYW55IG90aGVyIHB1cnBvc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCBQcm9qZWN0IGluIHdob3NlIHNjb3BlIHRoaXMgY29tcG9uZW50IGJlbG9uZ3MuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgY29tcG9uZW50IGJlbG9uZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb25lbnRzJ3MgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgeworICAgICAgICByZXR1cm4gcHJvamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaWxlL2xvY2F0aW9uIHdoZXJlIHRoaXMgdGFzayB3YXMgZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUvbG9jYXRpb24gd2hlcmUgdGhpcyB0YXNrIHdhcyBkZWZpbmVkLgorICAgICAqICAgICAgICAgU2hvdWxkIG5vdCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uIExvY2F0aW9uLlVOS05PV05fTE9DQVRJT04KKyAgICAgKiAgICAgICAgIGlzIHVzZWQgZm9yIHVua25vd24gbG9jYXRpb25zLgorICAgICAqCisgICAgICogQHNlZSBMb2NhdGlvbiNVTktOT1dOX0xPQ0FUSU9OCisgICAgICovCisgICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbG9jYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZmlsZS9sb2NhdGlvbiB3aGVyZSB0aGlzIHRhc2sgd2FzIGRlZmluZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGZpbGUvbG9jYXRpb24gd2hlcmUgdGhpcyB0YXNrIHdhcyBkZWZpbmVkLgorICAgICAqICAgICAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LS11c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTiBpZiB0aGUgbG9jYXRpb24gaXNuJ3Qga25vd24uCisgICAgICoKKyAgICAgKiBAc2VlIExvY2F0aW9uI1VOS05PV05fTE9DQVRJT04KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IGFjdGlvbi4gVGhpcyBtYXkgYmUgdXNlZCBmb3IgbG9nZ2luZworICAgICAqIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MgRGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgYWN0aW9uLgorICAgICAqICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW5kaWNhdGluZyB0aGF0IG5vIGRlc2NyaXB0aW9uIGlzCisgICAgICogICAgICAgICAgICAgYXZhaWxhYmxlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IGFjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IGFjdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiAgICAgICAgIG5vIGRlc2NyaXB0aW9uIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCB0aGUgZGVmYXVsdCAoSU5GTykgcHJpb3JpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBwcmlvcml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtc2dMZXZlbCB0aGUgbWVzc2FnZSBwcmlvcml0eSBhdCB3aGljaCB0aGlzIG1lc3NhZ2UgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgdG8gYmUgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBpbnQgbXNnTGV2ZWwpIHsKKyAgICAgICAgaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKG1zZywgbXNnTGV2ZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gJ3JlYXNvbmFibGUnIGRlZmF1bHQsIGlmIHRoZSBjb21wb25lbnQgaXMgdXNlZCB3aXRob3V0CisgICAgICAgICAgICAvLyBhIFByb2plY3QgKCBmb3IgZXhhbXBsZSBhcyBhIHN0YW5kYWxvbmUgQmVhbiApLgorICAgICAgICAgICAgLy8gTW9zdCBhbnQgY29tcG9uZW50cyBjYW4gYmUgdXNlZCB0aGlzIHdheS4KKyAgICAgICAgICAgIGlmIChtc2dMZXZlbCA8PSBQcm9qZWN0Lk1TR19JTkZPKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgcHJvamVjdGNvbXBvbmVudC4KKyAgICAgKiBAdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGRvZXMgbm90IGhhcHBlbiwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpcyBkZWNsYXJlZCB0byBhbGxvdyBzdWJjbGFzc2VzIHRvIGRvIHNvLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBQcm9qZWN0Q29tcG9uZW50IHBjID0gKFByb2plY3RDb21wb25lbnQpIHN1cGVyLmNsb25lKCk7CisgICAgICAgIHBjLnNldExvY2F0aW9uKGdldExvY2F0aW9uKCkpOworICAgICAgICBwYy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIHJldHVybiBwYzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0SGVscGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5MGI5NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RIZWxwZXIuamF2YQpAQCAtMCwwICsxLDUxMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuUHJvamVjdEhlbHBlcjI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Mb2FkZXJVdGlsczsKKworLyoqCisgKiBDb25maWd1cmVzIGEgUHJvamVjdCAoY29tcGxldGUgd2l0aCBUYXJnZXRzIGFuZCBUYXNrcykgYmFzZWQgb24KKyAqIGEgWE1MIGJ1aWxkIGZpbGUuIEl0J2xsIHJlbHkgb24gYSBwbHVnaW4gdG8gZG8gdGhlIGFjdHVhbCBwcm9jZXNzaW5nCisgKiBvZiB0aGUgeG1sIGZpbGUuCisgKgorICogVGhpcyBjbGFzcyBhbHNvIHByb3ZpZGUgc3RhdGljIHdyYXBwZXJzIGZvciBjb21tb24gaW50cm9zcGVjdGlvbi4KKyAqCisgKiBBbGwgaGVscGVyIHBsdWdpbnMgbXVzdCBwcm92aWRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUKKyAqIG9yaWdpbmFsIGFudCBwYXR0ZXJucywgdW5sZXNzIGEgZGlmZmVyZW50IGJlaGF2aW9yIGlzIGV4cGxpY2l0bHkKKyAqIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUsIGlmIG5hbWVzcGFjZSBpcyB1c2VkIG9uIHRoZSAmbHQ7cHJvamVjdCZndDsgdGFnCisgKiB0aGUgaGVscGVyIGNhbiBleHBlY3QgdGhlIGVudGlyZSBidWlsZCBmaWxlIHRvIGJlIG5hbWVzcGFjZS1lbmFibGVkLgorICogTmFtZXNwYWNlcyBvciBoZWxwZXItc3BlY2lmaWMgdGFncyBjYW4gcHJvdmlkZSBtZXRhLWluZm9ybWF0aW9uIHRvCisgKiB0aGUgaGVscGVyLCBhbGxvd2luZyBpdCB0byB1c2UgbmV3ICggb3IgZGlmZmVyZW50IHBvbGljaWVzICkuCisgKgorICogSG93ZXZlciwgaWYgbm8gbmFtZXNwYWNlIGlzIHVzZWQgdGhlIGJlaGF2aW9yIHNob3VsZCBiZSBleGFjdGx5CisgKiBpZGVudGljYWwgd2l0aCB0aGUgZGVmYXVsdCBoZWxwZXIuCisgKgorICovCitwdWJsaWMgY2xhc3MgUHJvamVjdEhlbHBlciB7CisgICAgLyoqIFRoZSBVUkkgZm9yIGFudCBuYW1lIHNwYWNlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0NPUkVfVVJJICAgID0gImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudCI7CisKKyAgICAvKiogVGhlIFVSSSBmb3IgYW50bGliIGN1cnJlbnQgZGVmaW5pdGlvbnMgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfQ1VSUkVOVF9VUkkgICAgICA9ICJhbnQ6Y3VycmVudCI7CisKKyAgICAvKiogVGhlIFVSSSBmb3IgZGVmaW5lZCB0eXBlcy90YXNrcyAtIHRoZSBmb3JtYXQgaXMgYW50bGliOjxwYWNrYWdlPiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVExJQl9VUkkgICAgID0gImFudGxpYjoiOworCisgICAgLyoqIFBvbHltb3JwaGljIGF0dHJpYnV0ZSAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfVFlQRSA9ICJhbnQtdHlwZSI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIEpWTSBzeXN0ZW0gcHJvcGVydHkgd2hpY2ggcHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlCisgICAgICogUHJvamVjdEhlbHBlciBjbGFzcyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUEVSX1BST1BFUlRZID0gTWFnaWNOYW1lcy5QUk9KRUNUX0hFTFBFUl9DTEFTUzsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2aWNlIGlkZW50aWZpZXIgaW4gamFycyB3aGljaCBwcm92aWRlIFByb2plY3QgSGVscGVyCisgICAgICogaW1wbGVtZW50YXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSUQgPSBNYWdpY05hbWVzLlBST0pFQ1RfSEVMUEVSX1NFUlZJQ0U7CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIHByb2plY3QgaGVscGVyIHJlZmVyZW5jZSB0aGF0IHdlIGFkZCB0byBhIHByb2plY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUSEVMUEVSX1JFRkVSRU5DRSA9IE1hZ2ljTmFtZXMuUkVGSURfUFJPSkVDVF9IRUxQRVI7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIHRoZSBwcm9qZWN0IHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgWE1MIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0byBjb25maWd1cmUuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBidWlsZEZpbGUgQW4gWE1MIGZpbGUgZ2l2aW5nIHRoZSBwcm9qZWN0J3MgY29uZmlndXJhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIG9yIGNhbm5vdCBiZSByZWFkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZVByb2plY3QoUHJvamVjdCBwcm9qZWN0LCBGaWxlIGJ1aWxkRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvamVjdEhlbHBlciBoZWxwZXIgPSBQcm9qZWN0SGVscGVyLmdldFByb2plY3RIZWxwZXIoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoUFJPSkVDVEhFTFBFUl9SRUZFUkVOQ0UsIGhlbHBlcik7CisgICAgICAgIGhlbHBlci5wYXJzZShwcm9qZWN0LCBidWlsZEZpbGUpOworICAgIH0KKworICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yICovCisgICAgcHVibGljIFByb2plY3RIZWxwZXIoKSB7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29tbW9uIHByb3BlcnRpZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSByZXF1aXJlZCBieSBpbXBvcnQgKCBhbmQgb3RoZXIgdGFza3MKKyAgICAvLyB0aGF0IHJlYWQgYnVpbGQgZmlsZXMgdXNpbmcgUHJvamVjdEhlbHBlciApLgorCisgICAgLy8gQSBwcm9qZWN0IGhlbHBlciBtYXkgcHJvY2VzcyBtdWx0aXBsZSBmaWxlcy4gV2UnbGwga2VlcCB0cmFjaworICAgIC8vIG9mIHRoZW0gLSB0byBhdm9pZCBsb29wcyBhbmQgdG8gYWxsb3cgY2FjaGluZy4gVGhlIGNhY2hpbmcgd2lsbAorICAgIC8vIHByb2JhYmx5IGFjY2VsZXJhdGUgdGhpbmdzIGxpa2UgPGFudENhbGw+LgorICAgIC8vIFRoZSBrZXkgaXMgdGhlIGFic29sdXRlIGZpbGUsIHRoZSB2YWx1ZSBpcyBhIHByb2Nlc3NlZCB0cmVlLgorICAgIC8vIFNpbmNlIHRoZSB0cmVlIGlzIGNvbXBvc2VkIG9mIFVFIGFuZCBSQyAtIGl0IGNhbiBiZSByZXVzZWQgIQorICAgIC8vIHByb3RlY3RlZCBIYXNodGFibGUgcHJvY2Vzc2VkRmlsZXM9bmV3IEhhc2h0YWJsZSgpOworCisgICAgcHJpdmF0ZSBWZWN0b3IgaW1wb3J0U3RhY2sgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvLyBUZW1wb3JhcnkgLSB1bnRpbCB3ZSBmaWd1cmUgYSBiZXR0ZXIgQVBJCisgICAgLyoqIEVYUEVSSU1FTlRBTCBXSUxMX0NIQU5HRQorICAgICAqCisgICAgICovCisvLyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldFByb2Nlc3NlZEZpbGVzKCkgeworLy8gICAgICAgIHJldHVybiBwcm9jZXNzZWRGaWxlczsKKy8vICAgIH0KKworICAgIC8qKiBFWFBFUklNRU5UQUwgV0lMTF9DSEFOR0UKKyAgICAgKiAgSW1wb3J0IHN0YWNrLgorICAgICAqICBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgaW1wb3J0ZWQgZmlsZXMuIEVycm9yIHJlcG9ydGluZyBzaG91bGQKKyAgICAgKiAgZGlzcGxheSB0aGUgaW1wb3J0IHBhdGguCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFjayBvZiBpbXBvcnQgc291cmNlIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIFZlY3RvciBnZXRJbXBvcnRTdGFjaygpIHsKKyAgICAgICAgcmV0dXJuIGltcG9ydFN0YWNrOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tICBQYXJzZSBtZXRob2QgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBwcm9qZWN0IGZpbGUsIGNvbmZpZ3VyaW5nIHRoZSBwcm9qZWN0IGFzIGl0IGdvZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCBmb3IgdGhlIHJlc3VsdGluZyBQcm9qZWN0SGVscGVyIHRvIGNvbmZpZ3VyZS4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgZm9yIFhNTCBjb25maWd1cmF0aW9uLiBBIGhlbHBlciBtdXN0IHN1cHBvcnQKKyAgICAgKiAgICAgICAgICAgICAgIGF0IGxlYXN0IEZpbGUsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBIZWxwZXJzIG1heQorICAgICAqICAgICAgICAgICAgICAgc3VwcG9ydCBVUkwsIElucHV0U3RyZWFtLCBldGMgb3Igc3BlY2lhbGl6ZWQgdHlwZXMuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50MS41CisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIG9yIGNhbm5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlKFByb2plY3QgcHJvamVjdCwgT2JqZWN0IHNvdXJjZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9qZWN0SGVscGVyLnBhcnNlKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCAiCisgICAgICAgICAgICArICJpbiBhIGhlbHBlciBwbHVnaW4gIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2NvdmVycyBhIHByb2plY3QgaGVscGVyIGluc3RhbmNlLiBVc2VzIHRoZSBzYW1lIHBhdHRlcm5zCisgICAgICogYXMgSkFYUCwgY29tbW9ucy1sb2dnaW5nLCBldGM6IGEgc3lzdGVtIHByb3BlcnR5LCBhIEpESzEuMworICAgICAqIHNlcnZpY2UgZGlzY292ZXJ5LCBkZWZhdWx0LgorICAgICAqCisgICAgICogQHJldHVybiBhIFByb2plY3RIZWxwZXIsIGVpdGhlciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbgorICAgICAqIGlmIG9uZSBpcyBhdmFpbGFibGUgYW5kIGNvbmZpZ3VyZWQsIG9yIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhIHNwZWNpZmllZCBoZWxwZXIgY2xhc3MgY2Fubm90CisgICAgICogYmUgbG9hZGVkL2luc3RhbnRpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByb2plY3RIZWxwZXIgZ2V0UHJvamVjdEhlbHBlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIElkZW50aWZ5IHRoZSBjbGFzcyBsb2FkZXIgd2Ugd2lsbCBiZSB1c2luZy4gQW50IG1heSBiZQorICAgICAgICAvLyBpbiBhIHdlYmFwcCBvciBlbWJlZGRlZCBpbiBhIGRpZmZlcmVudCBhcHAKKyAgICAgICAgUHJvamVjdEhlbHBlciBoZWxwZXIgPSBudWxsOworCisgICAgICAgIC8vIEZpcnN0LCB0cnkgdGhlIHN5c3RlbSBwcm9wZXJ0eQorICAgICAgICBTdHJpbmcgaGVscGVyQ2xhc3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSEVMUEVSX1BST1BFUlRZKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChoZWxwZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGVscGVyID0gbmV3SGVscGVyKGhlbHBlckNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gbG9hZCBQcm9qZWN0SGVscGVyIGNsYXNzIFwiIgorICAgICAgICAgICAgICAgICsgaGVscGVyQ2xhc3MgKyAiIHNwZWNpZmllZCBpbiBzeXN0ZW0gcHJvcGVydHkgIgorICAgICAgICAgICAgICAgICsgSEVMUEVSX1BST1BFUlRZKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEEgSkRLMS4zICdzZXJ2aWNlJyAoIGxpa2UgaW4gSkFYUCApLiBUaGF0IHdpbGwgcGx1ZyBhIGhlbHBlcgorICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGlmIGluIENMQVNTUEFUSCwgd2l0aCB0aGUgcmlnaHQgTUVUQS1JTkYvc2VydmljZXMuCisgICAgICAgIGlmIChoZWxwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IExvYWRlclV0aWxzLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpcyA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oU0VSVklDRV9JRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlzID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShTRVJWSUNFX0lEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGlzIG5lZWRlZCBieSBFQkNESUMgYW5kIG90aGVyIHN0cmFuZ2Ugc3lzdGVtcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBhIGZpeCBmb3IgYnVncyByZXBvcnRlZCBpbiB4ZXJjZXMKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmQgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscGVyQ2xhc3NOYW1lID0gcmQucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmQuY2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaGVscGVyQ2xhc3NOYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhoZWxwZXJDbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIgPSBuZXdIZWxwZXIoaGVscGVyQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGxvYWQgUHJvamVjdEhlbHBlciBmcm9tIHNlcnZpY2UgIiArIFNFUlZJQ0VfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBoZWxwZXIgPT0gbnVsbCA/IG5ldyBQcm9qZWN0SGVscGVyMigpIDogaGVscGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaGVscGVyIGluc3RhbmNlIGZyb20gdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgorICAgICAqIEl0J2xsIGZpcnN0IHRyeSB0aGUgdGhyZWFkIGNsYXNzIGxvYWRlciwgdGhlbiBDbGFzcy5mb3JOYW1lKCkKKyAgICAgKiB3aWxsIGxvYWQgZnJvbSB0aGUgc2FtZSBsb2FkZXIgdGhhdCBsb2FkZWQgdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWxwZXJDbGFzcyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY3JlYXRlIGFuIGluc3RhbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgIG9mLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBmb3VuZCBvcgorICAgICAqIGNhbm5vdCBiZSBhcHByb3ByaWF0ZSBpbnN0YW50aWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvamVjdEhlbHBlciBuZXdIZWxwZXIoU3RyaW5nIGhlbHBlckNsYXNzKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IExvYWRlclV0aWxzLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhoZWxwZXJDbGFzcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAvLyB0cnkgbmV4dCBtZXRob2QKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShoZWxwZXJDbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKChQcm9qZWN0SGVscGVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEpESzEuMSBjb21wYXRpYmxlIGFjY2VzcyB0byB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIuIEN1dCAmIHBhc3RlIGZyb20gSkFYUC4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgorICAgICAqICAgICAgICAgICAgIFVzZSBMb2FkZXJVdGlscy5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBjb250ZXh0IGNsYXNzIGxvYWRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiBpZiB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgaXMgdW5hdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBMb2FkZXJVdGlscy5pc0NvbnRleHRMb2FkZXJBdmFpbGFibGUoKSA/IExvYWRlclV0aWxzLmdldENvbnRleHRDbGFzc0xvYWRlcigpIDogbnVsbDsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgdXRpbHMsIHVzZWQgYnkgbW9zdCBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgYW4gb2JqZWN0IHVzaW5nIGFuIGludHJvc3BlY3Rpb24gaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKiAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhdHRycyAgQSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gY29uZmlndXJlIHdpdGhpbiB0aGUgdGFyZ2V0LgorICAgICAqICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgdGFyZ2V0LgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICogICAgICAgICAgICAgVXNlIEludHJvc3BlY3Rpb25IZWxwZXIgZm9yIGVhY2ggcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgYXR0cmlidXRlcyBjYW4ndCBiZSBoYW5kbGVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFyZ2V0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZShPYmplY3QgdGFyZ2V0LCBBdHRyaWJ1dGVMaXN0IGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIHRhcmdldCA9ICgoVHlwZUFkYXB0ZXIpIHRhcmdldCkuZ2V0UHJveHkoKTsKKyAgICAgICAgfQorICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIocHJvamVjdCwgdGFyZ2V0LmdldENsYXNzKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhdHRycy5nZXRMZW5ndGgoKTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyByZWZsZWN0IHRoZXNlIGludG8gdGhlIHRhcmdldAorICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVwbGFjZVByb3BlcnRpZXMocHJvamVjdCwgYXR0cnMuZ2V0VmFsdWUoaSksIHByb2plY3QuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHByb2plY3QsIHRhcmdldCwgYXR0cnMuZ2V0TmFtZShpKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLCB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgICAgIC8vIGlkIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBleHRlcm5hbGx5CisgICAgICAgICAgICAgICAgaWYgKCFhdHRycy5nZXROYW1lKGkpLmVxdWFscygiaWQiKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBiZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBjb250ZW50IG9mICNQQ0RBVEEgc2VjdGlvbnMgdG8gYW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHRhcmdldC4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0ICBUaGUgdGFyZ2V0IG9iamVjdCB0byBiZSBjb25maWd1cmVkLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBidWYgQSBjaGFyYWN0ZXIgYXJyYXkgb2YgdGhlIHRleHQgd2l0aGluIHRoZSBlbGVtZW50LgorICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBlbGVtZW50IGluIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgb2JqZWN0IGRvZXNuJ3QgYWNjZXB0IHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGV4dChQcm9qZWN0IHByb2plY3QsIE9iamVjdCB0YXJnZXQsIGNoYXJbXSBidWYsCisgICAgICAgIGludCBzdGFydCwgaW50IGNvdW50KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBhZGRUZXh0KHByb2plY3QsIHRhcmdldCwgbmV3IFN0cmluZyhidWYsIHN0YXJ0LCBjb3VudCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGNvbnRlbnQgb2YgI1BDREFUQSBzZWN0aW9ucyB0byBhbiBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgdGFyZ2V0LgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0YXJnZXQgIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHRleHQgICAgVGV4dCB0byBhZGQgdG8gdGhlIHRhcmdldC4KKyAgICAgKiAgICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UgdGhpcworICAgICAqICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxsIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgb2JqZWN0IGRvZXNuJ3QgYWNjZXB0IHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGV4dChQcm9qZWN0IHByb2plY3QsIE9iamVjdCB0YXJnZXQsIFN0cmluZyB0ZXh0KQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIHRhcmdldCA9ICgoVHlwZUFkYXB0ZXIpIHRhcmdldCkuZ2V0UHJveHkoKTsKKyAgICAgICAgfQorICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyLmdldEhlbHBlcihwcm9qZWN0LCB0YXJnZXQuZ2V0Q2xhc3MoKSkuYWRkVGV4dChwcm9qZWN0LCB0YXJnZXQsIHRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhIGNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCBQcm9qZWN0IGNvbnRhaW5pbmcgdGhlIG9iamVjdHMuCisgICAgICogICAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBwYXJlbnQgIFBhcmVudCBvYmplY3QgdG8gYWRkIGNoaWxkIHRvLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBjaGlsZCAgIENoaWxkIG9iamVjdCB0byBzdG9yZSBpbiBwYXJlbnQuCisgICAgICogICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdGFnICAgICBOYW1lIG9mIGVsZW1lbnQgd2hpY2ggZ2VuZXJhdGVkIHRoZSBjaGlsZC4KKyAgICAgKiAgICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgY2hpbGQgaXMgbm90IHN0b3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RvcmVDaGlsZChQcm9qZWN0IHByb2plY3QsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCwgU3RyaW5nIHRhZykgeworICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIocHJvamVjdCwgcGFyZW50LmdldENsYXNzKCkpOworICAgICAgICBpaC5zdG9yZUVsZW1lbnQocHJvamVjdCwgcGFyZW50LCBjaGlsZCwgdGFnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyA8Y29kZT4ke3h4eH08L2NvZGU+IHN0eWxlIGNvbnN0cnVjdGlvbnMgaW4gdGhlIGdpdmVuIHZhbHVlIHdpdGgKKyAgICAgKiB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIHJlcGxhY2UuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB0byBiZSBzY2FubmVkIGZvciBwcm9wZXJ0eSByZWZlcmVuY2VzLgorICAgICAqICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gb3BlbmluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+JHs8L2NvZGU+IHdpdGhvdXQgYSBjbG9zaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT59PC9jb2RlPgorICAgICAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyB3aXRoIHRoZSBwcm9wZXJ0aWVzIHJlcGxhY2VkLCBvcgorICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG9yaWdpbmFsIHN0cmluZyBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgorICAgICAqICAgICAgICAgICAgIFVzZSBwcm9qZWN0LnJlcGxhY2VQcm9wZXJ0aWVzKCkuCisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlUHJvcGVydGllcyhQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbmVlZGVkIHNpbmNlIHByb2plY3QgcHJvcGVydGllcyBhcmUgbm90IGFjY2Vzc2libGUKKyAgICAgICAgIHJldHVybiBwcm9qZWN0LnJlcGxhY2VQcm9wZXJ0aWVzKHZhbHVlKTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgPGNvZGU+JHt4eHh9PC9jb2RlPiBzdHlsZSBjb25zdHJ1Y3Rpb25zIGluIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgVGhlIGNvbnRhaW5lciBwcm9qZWN0LiBUaGlzIGlzIHVzZWQgc29sZWx5IGZvcgorICAgICAqICAgICAgICAgICAgICAgIGxvZ2dpbmcgcHVycG9zZXMuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHRvIGJlIHNjYW5uZWQgZm9yIHByb3BlcnR5IHJlZmVyZW5jZXMuCisgICAgICogICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZSB0aGlzCisgICAgICogICAgICAgICAgICAgIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggbm8gZWZmZWN0LgorICAgICAqIEBwYXJhbSBrZXlzICBNYXBwaW5nIChTdHJpbmcgdG8gU3RyaW5nKSBvZiBwcm9wZXJ0eSBuYW1lcyB0byB0aGVpcgorICAgICAqICAgICAgICAgICAgICB2YWx1ZXMuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGFuIG9wZW5pbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPiR7PC9jb2RlPiB3aXRob3V0IGEgY2xvc2luZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+fTwvY29kZT4KKyAgICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgd2l0aCB0aGUgcHJvcGVydGllcyByZXBsYWNlZCwgb3IKKyAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICogICAgICAgICAgICAgVXNlIFByb3BlcnR5SGVscGVyLgorICAgICAqLworICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlUHJvcGVydGllcyhQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2YWx1ZSwgSGFzaHRhYmxlIGtleXMpCisgICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydHlIZWxwZXIgcGggPSBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihwcm9qZWN0KTsKKyAgICAgICAgcmV0dXJuIHBoLnJlcGxhY2VQcm9wZXJ0aWVzKG51bGwsIHZhbHVlLCBrZXlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBzdHJpbmcgY29udGFpbmluZyA8Y29kZT4ke3h4eH08L2NvZGU+IHN0eWxlIHByb3BlcnR5CisgICAgICogcmVmZXJlbmNlcyBpbnRvIHR3byBsaXN0cy4gVGhlIGZpcnN0IGxpc3QgaXMgYSBjb2xsZWN0aW9uCisgICAgICogb2YgdGV4dCBmcmFnbWVudHMsIHdoaWxlIHRoZSBvdGhlciBpcyBhIHNldCBvZiBzdHJpbmcgcHJvcGVydHkgbmFtZXMuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gZW50cmllcyBpbiB0aGUgZmlyc3QgbGlzdCBpbmRpY2F0ZSBhIHByb3BlcnR5CisgICAgICogcmVmZXJlbmNlIGZyb20gdGhlIHNlY29uZCBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlICAgICBUZXh0IHRvIHBhcnNlLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnRzIExpc3QgdG8gYWRkIHRleHQgZnJhZ21lbnRzIHRvLgorICAgICAqICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHByb3BlcnR5UmVmcyBMaXN0IHRvIGFkZCBwcm9wZXJ0eSBuYW1lcyB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICogICAgICAgICAgICAgVXNlIFByb3BlcnR5SGVscGVyLgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBjb250YWlucyBhbiBvcGVuaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT4kezwvY29kZT4gd2l0aG91dCBhIGNsb3NpbmcgPGNvZGU+fTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2VQcm9wZXJ0eVN0cmluZyhTdHJpbmcgdmFsdWUsIFZlY3RvciBmcmFnbWVudHMsIFZlY3RvciBwcm9wZXJ0eVJlZnMpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0eUhlbHBlci5wYXJzZVByb3BlcnR5U3RyaW5nRGVmYXVsdCh2YWx1ZSwgZnJhZ21lbnRzLCBwcm9wZXJ0eVJlZnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcCBhIG5hbWVzcGFjZWQge3VyaSxuYW1lfSB0byBhbiBpbnRlcm5hbCBzdHJpbmcgZm9ybWF0LgorICAgICAqIEZvciBCQyBwdXJwb3NlcyB0aGUgbmFtZXMgZnJvbSB0aGUgYW50IGNvcmUgdXJpIHdpbGwgYmUKKyAgICAgKiBtYXBwZWQgdG8gIm5hbWUiLCBvdGhlciBuYW1lcyB3aWxsIGJlIG1hcHBlZCB0bworICAgICAqIHVyaSArICI6IiArIG5hbWUuCisgICAgICogQHBhcmFtIHVyaSAgIFRoZSBuYW1lcGFjZSBVUkkKKyAgICAgKiBAcGFyYW0gbmFtZSAgVGhlIGxvY2FsbmFtZQorICAgICAqIEByZXR1cm4gICAgICBUaGUgc3RyaW5naWZpZWQgZm9ybSBvZiB0aGUgbnMgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbkNvbXBvbmVudE5hbWUoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHMoIiIpIHx8IHVyaS5lcXVhbHMoQU5UX0NPUkVfVVJJKSkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVyaSArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXh0cmFjdCBhIHVyaSBmcm9tIGEgY29tcG9uZW50IG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnROYW1lICBUaGUgc3RyaW5naWZpZWQgZm9ybSBmb3Ige3VyaSwgbmFtZX0KKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgVGhlIHVyaSBvciAiIiBpZiBub3QgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RVcmlGcm9tQ29tcG9uZW50TmFtZShTdHJpbmcgY29tcG9uZW50TmFtZSkgeworICAgICAgICBpZiAoY29tcG9uZW50TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgaW50IGluZGV4ID0gY29tcG9uZW50TmFtZS5sYXN0SW5kZXhPZignOicpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcG9uZW50TmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGV4dHJhY3QgdGhlIGVsZW1lbnQgbmFtZSBmcm9tIGEgY29tcG9uZW50IG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnROYW1lICBUaGUgc3RyaW5naWZpZWQgZm9ybSBmb3Ige3VyaSwgbmFtZX0KKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgVGhlIGVsZW1lbnQgbmFtZSBvZiB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdE5hbWVGcm9tQ29tcG9uZW50TmFtZShTdHJpbmcgY29tcG9uZW50TmFtZSkgeworICAgICAgICBpbnQgaW5kZXggPSBjb21wb25lbnROYW1lLmxhc3RJbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGxvY2F0aW9uIHRvIGJ1aWxkIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gZXggdGhlIGJ1aWxkIGV4Y2VwdGlvbiwgaWYgdGhlIGJ1aWxkIGV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICBkb2VzIG5vdCBpbmNsdWRlCisgICAgICogQHBhcmFtIG5ld0xvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2FsbGluZyB0YXNrIChtYXkgYmUgbnVsbCkKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGJ1aWxkIGV4Y2VwdGlvbiBiYXNlZCBpbiB0aGUgYnVpbGQgZXhjZXB0aW9uIHdpdGgKKyAgICAgKiAgICAgICAgIGxvY2F0aW9uIHNldCB0byBuZXdMb2NhdGlvbi4gSWYgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbgorICAgICAqICAgICAgICAgZGlkIG5vdCBoYXZlIGEgbG9jYXRpb24sIGp1c3QgcmV0dXJuIHRoZSBidWlsZCBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkRXhjZXB0aW9uIGFkZExvY2F0aW9uVG9CdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgIEJ1aWxkRXhjZXB0aW9uIGV4LCBMb2NhdGlvbiBuZXdMb2NhdGlvbikgeworICAgICAgICBpZiAoZXguZ2V0TG9jYXRpb24oKSA9PSBudWxsIHx8IGV4LmdldE1lc3NhZ2UoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZXg7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZQorICAgICAgICAgICAgPSAiVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBsaW5lOiIKKyAgICAgICAgICAgICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpCisgICAgICAgICAgICArIGV4LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKQorICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCk7CisgICAgICAgIGlmIChuZXdMb2NhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKGVycm9yTWVzc2FnZSwgZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24oZXJyb3JNZXNzYWdlLCBleCwgbmV3TG9jYXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb3BlcnR5SGVscGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9wZXJ0eUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjkyNmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9wZXJ0eUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsOTk5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnByb3BlcnR5Lk51bGxSZXR1cm47CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHkuR2V0UHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHkuUGFyc2VOZXh0UHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHkuUHJvcGVydHlFeHBhbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5wcm9wZXJ0eS5QYXJzZVByb3BlcnRpZXM7CisKKy8qIElTU1VFUzoKKyAtIG5zIHBhcmFtLiBJdCBjb3VsZCBiZSB1c2VkIHRvIHByb3ZpZGUgIm5hbWVzcGFjZXMiIGZvciBwcm9wZXJ0aWVzLCB3aGljaAorIG1heSBiZSBtb3JlIGZsZXhpYmxlLgorIC0gT2JqZWN0IHZhbHVlLiBJbiBhbnQxLjUgU3RyaW5nIGlzIHVzZWQgZm9yIFByb3BlcnRpZXMgLSBidXQgaXQgd291bGQgYmUgbmljZQorIHRvIHN1cHBvcnQgZ2VuZXJpYyBPYmplY3RzICh0aGUgcHJvcGVydHkgcmVtYWlucyBpbW11dGFibGUgLSB5b3UgY2FuJ3QgY2hhbmdlCisgdGhlIGFzc29jaWF0ZWQgb2JqZWN0KS4gVGhpcyB3aWxsIGFsc28gYWxsb3cgSlNQLUVMIHN0eWxlIHNldHRpbmcgdXNpbmcgdGhlCisgT2JqZWN0IGlmIGFuIGF0dHJpYnV0ZSBjb250YWlucyBvbmx5IHRoZSBwcm9wZXJ0eSAobmFtZT0iJHtwcm9wZXJ0eX0iIGNvdWxkCisgYXZvaWQgT2JqZWN0LT5TdHJpbmctPk9iamVjdCBjb252ZXJzaW9uKQorIC0gQ3VycmVudGx5IHdlICJjaGFpbiIgb25seSBmb3IgZ2V0IGFuZCBzZXQgcHJvcGVydHkgKHByb2JhYmx5IG1vc3QgdXNlcnMKKyB3aWxsIG9ubHkgbmVlZCB0aGF0IC0gaWYgdGhleSBuZWVkIG1vcmUgdGhleSBjYW4gcmVwbGFjZSB0aGUgdG9wIGhlbHBlcikuCisgTmVlZCB0byBkaXNjdXNzIHRoaXMgYW5kIGZpbmQgaWYgd2UgbmVlZCBtb3JlLgorICovCisKKy8qIHVwZGF0ZSBmb3IgaW1wZW5kaW5nIEFudCAxLjg6CisKKyAgIC0gSSBjYW4ndCBzZWUgYW55IHJlYXNvbiBmb3IgbnMgYW5kIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIGl0LgorICAgLSBSZXBsYWNpbmcgY2hhaW5pbmcgd2l0aCBkZWxlZ2F0ZXMgZm9yIGNlcnRhaW4gYmVoYXZpb3JhbCBhc3BlY3RzLgorICAgLSBPYmplY3QgdmFsdWUgc2VlbXMgdmFsdWFibGUgYXMgb3V0bGluZWQuCisKKyAqLworCisvKiogTk9UIEZJTkFMLiBBUEkgTUFZIENIQU5HRQorICoKKyAqIERlYWxzIHdpdGggcHJvcGVydGllcyAtIHN1YnN0aXR1dGlvbiwgZHluYW1pYyBwcm9wZXJ0aWVzLCBldGMuCisgKgorICogVGhpcyBpcyB0aGUgc2FtZSBjb2RlIGFzIGluIEFudDEuNS4gVGhlIG1haW4gYWRkaXRpb24gaXMgdGhlIGFiaWxpdHkKKyAqIHRvIGNoYWluIG11bHRpcGxlIFByb3BlcnR5SGVscGVycyBhbmQgdG8gcmVwbGFjZSB0aGUgZGVmYXVsdC4KKyAqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgUHJvcGVydHlIZWxwZXIgaW1wbGVtZW50cyBHZXRQcm9wZXJ0eSB7CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLworICAgIC8vICAgIFRoZSBwcm9wZXJ0eSBkZWxlZ2F0ZSBpbnRlcmZhY2VzCisgICAgLy8KKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIE1hcmtlciBpbnRlcmZhY2UgZm9yIGEgUHJvcGVydHlIZWxwZXIgZGVsZWdhdGUuCisgICAgICogQHNpbmNlIEFudCAxLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIERlbGVnYXRlIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmliZXMgYW4gZW50aXR5IGNhcGFibGUgb2YgZXZhbHVhdGluZyBhIHByb3BlcnR5IG5hbWUgZm9yIHZhbHVlLgorICAgICAqIEBzaW5jZSBBbnQgMS44CisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUV2YWx1YXRvciBleHRlbmRzIERlbGVnYXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV2YWx1YXRlIGEgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkncyBTdHJpbmcgImlkZW50aWZpZXIiLgorICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlIZWxwZXIgdGhlIGludm9raW5nIFByb3BlcnR5SGVscGVyLgorICAgICAgICAgKiBAcmV0dXJuIE9iamVjdCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIE9iamVjdCBldmFsdWF0ZShTdHJpbmcgcHJvcGVydHksIFByb3BlcnR5SGVscGVyIHByb3BlcnR5SGVscGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmliZXMgYW4gZW50aXR5IGNhcGFibGUgb2Ygc2V0dGluZyBhIHByb3BlcnR5IHRvIGEgdmFsdWUuCisgICAgICogQHNpbmNlIEFudCAxLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5U2V0dGVyIGV4dGVuZHMgRGVsZWdhdGUgeworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgKm5ldyIgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkncyBTdHJpbmcgImlkZW50aWZpZXIiLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgICAgdGhlIHZhbHVlIHRvIHNldC4KKyAgICAgICAgICogQHBhcmFtIHByb3BlcnR5SGVscGVyIHRoZSBpbnZva2luZyBQcm9wZXJ0eUhlbHBlci4KKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgZW50aXR5ICdvd25zJyB0aGUgcHJvcGVydHkuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIHNldE5ldygKKyAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlLCBQcm9wZXJ0eUhlbHBlciBwcm9wZXJ0eUhlbHBlcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5J3MgU3RyaW5nICJpZGVudGlmaWVyIi4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlICAgIHRoZSB2YWx1ZSB0byBzZXQuCisgICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUhlbHBlciB0aGUgaW52b2tpbmcgUHJvcGVydHlIZWxwZXIuCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVudGl0eSAnb3ducycgdGhlIHByb3BlcnR5LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBzZXQoCisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSwgUHJvcGVydHlIZWxwZXIgcHJvcGVydHlIZWxwZXIpOworICAgIH0KKworCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8KKyAgICAvLyAgICBUaGUgcHJlZGVmaW5lZCBwcm9wZXJ0eSBkZWxlZ2F0ZXMKKyAgICAvLworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlFdmFsdWF0b3IgVE9fU1RSSU5HID0gbmV3IFByb3BlcnR5RXZhbHVhdG9yKCkgeworICAgICAgICBwcml2YXRlIFN0cmluZyBwcmVmaXggPSAidG9TdHJpbmc6IjsKKyAgICAgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShTdHJpbmcgcHJvcGVydHksIFByb3BlcnR5SGVscGVyIHByb3BlcnR5SGVscGVyKSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IG51bGw7CisgICAgICAgICAgICBpZiAocHJvcGVydHkuc3RhcnRzV2l0aChwcmVmaXgpICYmIHByb3BlcnR5SGVscGVyLmdldFByb2plY3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbyA9IHByb3BlcnR5SGVscGVyLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UocHJvcGVydHkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG8gPT0gbnVsbCA/IG51bGwgOiBvLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlFeHBhbmRlciBERUZBVUxUX0VYUEFOREVSID0gbmV3IFByb3BlcnR5RXhwYW5kZXIoKSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgcGFyc2VQcm9wZXJ0eU5hbWUoCisgICAgICAgICAgICBTdHJpbmcgcywgUGFyc2VQb3NpdGlvbiBwb3MsIFBhcnNlTmV4dFByb3BlcnR5IG5vdFVzZWQpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHBvcy5nZXRJbmRleCgpOworICAgICAgICAgICAgaWYgKHMuaW5kZXhPZigiJHsiLCBpbmRleCkgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5kID0gcy5pbmRleE9mKCd9JywgaW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChlbmQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3ludGF4IGVycm9yIGluIHByb3BlcnR5OiAiICsgcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGluZGV4ICsgMjsKKyAgICAgICAgICAgICAgICBwb3Muc2V0SW5kZXgoZW5kICsgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqIGR1bW15ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlFeHBhbmRlciBTS0lQX0RPVUJMRV9ET0xMQVIKKyAgICAgICAgPSBuZXcgUHJvcGVydHlFeHBhbmRlcigpIHsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TGluZUxlbmd0aENoZWNrIE9GRiBzZWUgdG9vIGxvbmcKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlci5Qcm9wZXJ0eUV4cGFuZGVyI3BhcnNlUHJvcGVydHlOYW1lKGphdmEubGFuZy5TdHJpbmcsIGphdmEudGV4dC5QYXJzZVBvc2l0aW9uLCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlcikKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpMaW5lTGVuZ3RoQ2hlY2sgT04KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcGFyc2VQcm9wZXJ0eU5hbWUoCisgICAgICAgICAgICAgICAgU3RyaW5nIHMsIFBhcnNlUG9zaXRpb24gcG9zLCBQYXJzZU5leHRQcm9wZXJ0eSBub3RVc2VkKSB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInBhcnNlcHJvcGVydHkgIiArIHMpOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHBvcy5nZXRJbmRleCgpOworICAgICAgICAgICAgICAgIGlmIChzLmluZGV4T2YoIiQkIiwgaW5kZXgpID09IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHBvcy5zZXRJbmRleCgrK2luZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKyAgICBwcml2YXRlIFByb3BlcnR5SGVscGVyIG5leHQ7CisgICAgcHJpdmF0ZSBIYXNodGFibGUgZGVsZWdhdGVzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgLyoqIFByb2plY3QgcHJvcGVydGllcyBtYXAgKHVzdWFsbHkgU3RyaW5nIHRvIFN0cmluZykuICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgcHJvcGVydGllcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIE1hcCBvZiAidXNlciIgcHJvcGVydGllcyAoYXMgY3JlYXRlZCBpbiB0aGUgQW50IHRhc2ssIGZvciBleGFtcGxlKS4KKyAgICAgKiBOb3RlIHRoYXQgdGhlc2Uga2V5L3ZhbHVlIHBhaXJzIGFyZSBhbHNvIGFsd2F5cyBwdXQgaW50byB0aGUKKyAgICAgKiBwcm9qZWN0IHByb3BlcnRpZXMsIHNvIG9ubHkgdGhlIHByb2plY3QgcHJvcGVydGllcyBuZWVkIHRvIGJlIHF1ZXJpZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgdXNlclByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXAgb2YgaW5oZXJpdGVkICJ1c2VyIiBwcm9wZXJ0aWVzIC0gdGhhdCBhcmUgdGhvc2UgInVzZXIiCisgICAgICogcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRhc2tzIGFuZCBub3QgYmVlbiBzZXQKKyAgICAgKiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgYSBHVUkgdG9vbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBpbmhlcml0ZWRQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlIZWxwZXIoKSB7CisgICAgICAgIGFkZChUT19TVFJJTkcpOworICAgICAgICBhZGQoU0tJUF9ET1VCTEVfRE9MTEFSKTsKKyAgICAgICAgYWRkKERFRkFVTFRfRVhQQU5ERVIpOworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vCisgICAgLy8gICAgU29tZSBoZWxwZXIgc3RhdGljIG1ldGhvZHMgdG8gZ2V0IGFuZCBzZXQgcHJvcGVydGllcworICAgIC8vCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBzdGF0aWMgbWV0aG9kIHRvIGdldCBhIHByb3BlcnR5CisgICAgICogZnJvbSBhIHBhcnRpY3VsYXIgcHJvamVjdC4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBpbiBxdWVzdGlvbi4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkgbmFtZQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpZiBwcmVzZW50LCBudWxsIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgQW50IDEuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFByb3BlcnR5KFByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHByb2plY3QpCisgICAgICAgICAgICAuZ2V0UHJvcGVydHkobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgc3RhdGljIG1ldGhvZCB0byBzZXQgYSBwcm9wZXJ0eQorICAgICAqIGZyb20gYSBwYXJ0aWN1bGFyIHByb2plY3QuCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgaW4gcXVlc3Rpb24uCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKiBAc2luY2UgQW50IDEuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIocHJvamVjdCkKKyAgICAgICAgICAgIC5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgc3RhdGljIG1ldGhvZCB0byBzZXQgYSBuZXcgcHJvcGVydHkKKyAgICAgKiBmcm9tIGEgcGFydGljdWxhciBwcm9qZWN0LgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGluIHF1ZXN0aW9uLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICogQHNpbmNlIEFudCAxLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmV3UHJvcGVydHkoCisgICAgICAgIFByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihwcm9qZWN0KQorICAgICAgICAgICAgLnNldE5ld1Byb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvL292ZXJyaWRlIGZhY2lsaXR5IGZvciBzdWJjbGFzc2VzIHRvIHB1dCBjdXN0b20gaGFzaHRhYmxlcyBpbgorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEhvb2sgbWFuYWdlbWVudCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvamVjdCBmb3Igd2hpY2ggdGhpcyBoZWxwZXIgaXMgcGVyZm9ybWluZyBwcm9wZXJ0eSByZXNvbHV0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHApIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhpcyBQcm9wZXJ0eUhlbHBlcidzIFByb2plY3QuCisgICAgICogQHJldHVybiBQcm9qZWN0CisgICAgICovCisgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoZXJlIGFyZSAyIHdheXMgdG8gaG9vayBpbnRvIHByb3BlcnR5IGhhbmRsaW5nOgorICAgICAqICAtIHlvdSBjYW4gcmVwbGFjZSB0aGUgbWFpbiBQcm9wZXJ0eUhlbHBlci4gVGhlIHJlcGxhY2VtZW50IGlzIHJlcXVpcmVkCisgICAgICogdG8gc3VwcG9ydCB0aGUgc2FtZSBzZW1hbnRpY3MgKG9mIGNvdXJzZSA6LSkKKyAgICAgKgorICAgICAqICAtIHlvdSBjYW4gY2hhaW4gYSBwcm9wZXJ0eSBoZWxwZXIgY2FwYWJsZSBvZiBzdG9yaW5nIHNvbWUgcHJvcGVydGllcy4KKyAgICAgKiAgQWdhaW4sIHlvdSBhcmUgcmVxdWlyZWQgdG8gcmVzcGVjdCB0aGUgaW1tdXRhYmlsaXR5IHNlbWFudGljcyAoYXQKKyAgICAgKiAgbGVhc3QgZm9yIG5vbi1keW5hbWljIHByb3BlcnRpZXMpCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV4dCB0aGUgbmV4dCBwcm9wZXJ0eSBoZWxwZXIgaW4gdGhlIGNoYWluLgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmV4dChQcm9wZXJ0eUhlbHBlciBuZXh0KSB7CisgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuZXh0IHByb3BlcnR5IGhlbHBlciBpbiB0aGUgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHByb3BlcnR5IGhlbHBlci4KKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eUhlbHBlciBnZXROZXh0KCkgeworICAgICAgICByZXR1cm4gbmV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBwcm9wZXJ0eSBwcm9jZXNzb3IuCisgICAgICogVXNlcnMgY2FuIHByb3ZpZGUgdGhlaXIgb3duIG9yIHJlcGxhY2UgaXQgdXNpbmcgImFudC5Qcm9wZXJ0eUhlbHBlciIKKyAgICAgKiByZWZlcmVuY2UuIFVzZXIgdGFza3MgY2FuIGFsc28gYWRkIHRoZW1zZWx2ZXMgdG8gdGhlIGNoYWluLCBhbmQgcHJvdmlkZQorICAgICAqIGR5bmFtaWMgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGZvciB3aGljaCB0aGUgcHJvcGVydHkgaGVscGVyIGlzIHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvamVjdCdzIHByb3BlcnR5IGhlbHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBQcm9wZXJ0eUhlbHBlciBnZXRQcm9wZXJ0eUhlbHBlcihQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgUHJvcGVydHlIZWxwZXIgaGVscGVyCisgICAgICAgICAgICAgICAgPSAoUHJvcGVydHlIZWxwZXIpIHByb2plY3QuZ2V0UmVmZXJlbmNlKE1hZ2ljTmFtZXMuUkVGSURfUFJPUEVSVFlfSEVMUEVSKTsKKyAgICAgICAgaWYgKGhlbHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gaGVscGVyOworICAgICAgICB9CisgICAgICAgIGhlbHBlciA9IG5ldyBQcm9wZXJ0eUhlbHBlcigpOworICAgICAgICBoZWxwZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKKworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZShNYWdpY05hbWVzLlJFRklEX1BST1BFUlRZX0hFTFBFUiwgaGVscGVyKTsKKyAgICAgICAgcmV0dXJuIGhlbHBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGV4cGFuZGVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBleGFwYW5kZXJzLgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEV4cGFuZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlcyhQcm9wZXJ0eUV4cGFuZGVyLmNsYXNzKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tICBNZXRob2RzIHRvIG92ZXJyaWRlICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogU2V0cyBhIHByb3BlcnR5LiBBbnkgZXhpc3RpbmcgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZQorICAgICAqIGlzIG92ZXJ3cml0dGVuLCB1bmxlc3MgaXQgaXMgYSB1c2VyIHByb3BlcnR5LiBXaWxsIGJlIGNhbGxlZAorICAgICAqIGZyb20gc2V0UHJvcGVydHkoKS4KKyAgICAgKgorICAgICAqIElmIGFsbCBoZWxwZXJzIHJldHVybiBmYWxzZSwgdGhlIHByb3BlcnR5IHdpbGwgYmUgc2F2ZWQgaW4KKyAgICAgKiB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIHRhYmxlIGJ5IHNldFByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIG5zICAgVGhlIG5hbWVzcGFjZSB0aGF0IHRoZSBwcm9wZXJ0eSBpcyBpbiAoY3VycmVudGx5CisgICAgICogICAgICAgICAgICAgbm90IHVzZWQuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0LgorICAgICAqICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGluaGVyaXRlZCBUcnVlIGlmIHRoaXMgcHJvcGVydHkgaXMgaW5oZXJpdGVkIChhbiBbc3ViXWFudFtjYWxsXSBwcm9wZXJ0eSkuCisgICAgICogQHBhcmFtIHVzZXIgICAgICBUcnVlIGlmIHRoaXMgcHJvcGVydHkgaXMgYSB1c2VyIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBpc05ldyAgICAgVHJ1ZSBpcyB0aGlzIGlzIGEgbmV3IHByb3BlcnR5LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGhlbHBlciBoYXMgc3RvcmVkIHRoZSBwcm9wZXJ0eSwgZmFsc2UgaWYgaXQKKyAgICAgKiAgICBjb3VsZG4ndC4gRWFjaCBoZWxwZXIgc2hvdWxkIGRlbGVnYXRlIHRvIHRoZSBuZXh0IG9uZSAodW5sZXNzIGl0CisgICAgICogICAgaGFzIGEgZ29vZCByZWFzb24gbm90IHRvKS4KKyAgICAgKiBAZGVwcmVjYXRlZCBQcm9wZXJ0eUhlbHBlciBjaGFpbmluZyBpcyBkZXByZWNhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldFByb3BlcnR5SG9vayhTdHJpbmcgbnMsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5oZXJpdGVkLCBib29sZWFuIHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNOZXcpIHsKKyAgICAgICAgaWYgKGdldE5leHQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIHN1YnN0ID0gZ2V0TmV4dCgpLnNldFByb3BlcnR5SG9vayhucywgbmFtZSwgdmFsdWUsIGluaGVyaXRlZCwgdXNlciwgaXNOZXcpOworICAgICAgICAgICAgLy8gSWYgbmV4dCBoYXMgaGFuZGxlZCB0aGUgcHJvcGVydHkKKyAgICAgICAgICAgIGlmIChzdWJzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBwcm9wZXJ0eS4gSWYgYWxsIGhvb2tzIHJldHVybiBudWxsLCB0aGUgZGVmYXVsdAorICAgICAqIHRhYmxlcyB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbnMgbmFtZXNwYWNlIG9mIHRoZSBzb3VnaHQgcHJvcGVydHkuCisgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgc291Z2h0IHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB1c2VyIFRydWUgaWYgdGhpcyBpcyBhIHVzZXIgcHJvcGVydHkuCisgICAgICogQHJldHVybiBUaGUgcHJvcGVydHksIGlmIHJldHVybmVkIGJ5IGEgaG9vaywgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBkZXByZWNhdGVkIFByb3BlcnR5SGVscGVyIGNoYWluaW5nIGlzIGRlcHJlY2F0ZWQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eUhvb2soU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB1c2VyKSB7CisgICAgICAgIGlmIChnZXROZXh0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBnZXROZXh0KCkuZ2V0UHJvcGVydHlIb29rKG5zLCBuYW1lLCB1c2VyKTsKKyAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBFeHBlcmltZW50YWwvVGVzdGluZywgd2lsbCBiZSByZW1vdmVkCisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInRvU3RyaW5nOiIpKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoInRvU3RyaW5nOiIubGVuZ3RoKCkpOworICAgICAgICAgICAgT2JqZWN0IHYgPSBwcm9qZWN0LmdldFJlZmVyZW5jZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAodiA9PSBudWxsKSA/IG51bGwgOiB2LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3B0aW9uYWwgbWV0aG9kcyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gWW91IGNhbiBvdmVycmlkZSB0aG9zZSBtZXRob2RzIGlmIHlvdSB3YW50IHRvIG9wdGltaXplIG9yCisgICAgLy8gZG8gYWR2YW5jZWQgdGhpbmdzIChsaWtlIHN1cHBvcnQgYSBzcGVjaWFsIHN5bnRheCkuCisgICAgLy8gVGhlIG1ldGhvZHMgZG8gbm90IGNoYWluIC0geW91IHNob3VsZCB1c2UgdGhlbSB3aGVuIGVtYmVkZGluZyBhbnQKKyAgICAvLyAoYnkgcmVwbGFjaW5nIHRoZSBtYWluIGhlbHBlcikKKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIHN0cmluZyBjb250YWluaW5nIDxjb2RlPiR7eHh4fTwvY29kZT4gc3R5bGUgcHJvcGVydHkKKyAgICAgKiByZWZlcmVuY2VzIGludG8gdHdvIGxpc3RzLiBUaGUgZmlyc3QgbGlzdCBpcyBhIGNvbGxlY3Rpb24KKyAgICAgKiBvZiB0ZXh0IGZyYWdtZW50cywgd2hpbGUgdGhlIG90aGVyIGlzIGEgc2V0IG9mIHN0cmluZyBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBlbnRyaWVzIGluIHRoZSBmaXJzdCBsaXN0IGluZGljYXRlIGEgcHJvcGVydHkKKyAgICAgKiByZWZlcmVuY2UgZnJvbSB0aGUgc2Vjb25kIGxpc3QuCisgICAgICoKKyAgICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIGEgbW9yZSBlZmZpY2llbnQgb3IgY3VzdG9taXplZCB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlICAgICBUZXh0IHRvIHBhcnNlLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnRzIExpc3QgdG8gYWRkIHRleHQgZnJhZ21lbnRzIHRvLgorICAgICAqICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHByb3BlcnR5UmVmcyBMaXN0IHRvIGFkZCBwcm9wZXJ0eSBuYW1lcyB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGFuIG9wZW5pbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPiR7PC9jb2RlPiB3aXRob3V0IGEgY2xvc2luZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+fTwvY29kZT4KKyAgICAgKiBAZGVwcmVjYXRlZCBXZSBjYW4gZG8gYmV0dGVyIHRoYW4gdGhpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZVByb3BlcnR5U3RyaW5nKFN0cmluZyB2YWx1ZSwgVmVjdG9yIGZyYWdtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBwcm9wZXJ0eVJlZnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlUHJvcGVydHlTdHJpbmdEZWZhdWx0KHZhbHVlLCBmcmFnbWVudHMsIHByb3BlcnR5UmVmcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgPGNvZGU+JHt4eHh9PC9jb2RlPiBzdHlsZSBjb25zdHJ1Y3Rpb25zIGluIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5zICAgIFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB0byBiZSBzY2FubmVkIGZvciBwcm9wZXJ0eSByZWZlcmVuY2VzLgorICAgICAqICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UgdGhpcworICAgICAqICAgICAgICAgICAgICBtZXRob2QgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIG5vIGVmZmVjdC4KKyAgICAgKiBAcGFyYW0ga2V5cyAgTWFwcGluZyAoU3RyaW5nIHRvIFN0cmluZykgb2YgcHJvcGVydHkgbmFtZXMgdG8gdGhlaXIKKyAgICAgKiAgICAgICAgICAgICAgdmFsdWVzLiBJZiA8Y29kZT5udWxsPC9jb2RlPiwgb25seSBwcm9qZWN0IHByb3BlcnRpZXMgd2lsbAorICAgICAqICAgICAgICAgICAgICBiZSB1c2VkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGFuIG9wZW5pbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPiR7PC9jb2RlPiB3aXRob3V0IGEgY2xvc2luZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+fTwvY29kZT4KKyAgICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgd2l0aCB0aGUgcHJvcGVydGllcyByZXBsYWNlZCwgb3IKKyAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZXBsYWNlUHJvcGVydGllcyhTdHJpbmcgbnMsIFN0cmluZyB2YWx1ZSwgSGFzaHRhYmxlIGtleXMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZXBsYWNlUHJvcGVydGllcyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgPGNvZGU+JHt4eHh9PC9jb2RlPiBzdHlsZSBjb25zdHJ1Y3Rpb25zIGluIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdG8gYmUgc2Nhbm5lZCBmb3IgcHJvcGVydHkgcmVmZXJlbmNlcy4KKyAgICAgKiAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbiB3aGljaCBjYXNlIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgY29udGFpbnMgYW4gb3BlbmluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+JHs8L2NvZGU+IHdpdGhvdXQgYSBjbG9zaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT59PC9jb2RlPgorICAgICAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyB3aXRoIHRoZSBwcm9wZXJ0aWVzIHJlcGxhY2VkLCBvcgorICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG9yaWdpbmFsIHN0cmluZyBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHJlcGxhY2VQcm9wZXJ0aWVzKFN0cmluZyB2YWx1ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IG8gPSBwYXJzZVByb3BlcnRpZXModmFsdWUpOworICAgICAgICByZXR1cm4gbyA9PSBudWxsIHx8IG8gaW5zdGFuY2VvZiBTdHJpbmcgPyAoU3RyaW5nKSBvIDogby50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZSBwcm9wZXJ0aWVzIGZyb20gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24uICBJZiB0aGUgZW50aXJlCisgICAgICogY29udGVudHMgb2YgdGhlIFN0cmluZyByZXNvbHZlIHRvIGEgc2luZ2xlIHByb3BlcnR5LCB0aGF0IHZhbHVlCisgICAgICogaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgYSBTdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB0byBiZSBzY2FubmVkIGZvciBwcm9wZXJ0eSByZWZlcmVuY2VzLgorICAgICAqICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UgdGhpcworICAgICAqICAgICAgICAgICAgICBtZXRob2QgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIG5vIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBjb250YWlucyBhbiBvcGVuaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT4kezwvY29kZT4gd2l0aG91dCBhIGNsb3NpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPn08L2NvZGU+CisgICAgICogQHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nIHdpdGggdGhlIHByb3BlcnRpZXMgcmVwbGFjZWQsIG9yCisgICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgb3JpZ2luYWwgc3RyaW5nIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcGFyc2VQcm9wZXJ0aWVzKFN0cmluZyB2YWx1ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJzZVByb3BlcnRpZXMoZ2V0UHJvamVjdCgpLCBnZXRFeHBhbmRlcnMoKSwgdGhpcykKKyAgICAgICAgICAgIC5wYXJzZVByb3BlcnRpZXModmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlYXJuIHdoZXRoZXIgYSBTdHJpbmcgY29udGFpbnMgcmVwbGFjZWFibGUgcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIFN0cmluZyB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPnZhbHVlPC9jb2RlPiBjb250YWlucyBwcm9wZXJ0eSBub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1Byb3BlcnRpZXMoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgUGFyc2VQcm9wZXJ0aWVzKGdldFByb2plY3QoKSwgZ2V0RXhwYW5kZXJzKCksIHRoaXMpCisgICAgICAgICAgICAuY29udGFpbnNQcm9wZXJ0aWVzKHZhbHVlKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWZhdWx0IGltcGxlbWVudGF0aW9uICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIE1ldGhvZHMgdXNlZCB0byBzdXBwb3J0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZCBwcm92aWRlIGJhY2t3YXJkCisgICAgLy8gY29tcGF0aWJpbGl0eS4gU29tZSB3aWxsIGJlIGRlcHJlY2F0ZWQsIHlvdSBzaG91bGQgYXZvaWQgY2FsbGluZyB0aGVtLgorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBzZXRQcm9wZXJ0eS4gV2lsbCBiZSBjYWxsZWQgZnJvbSBQcm9qZWN0LgorICAgICAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIDEuNSBpbXBsZW1lbnRhdGlvbiwgd2l0aCBjYWxscyB0byB0aGUgaG9vaworICAgICAqIGFkZGVkLgorICAgICAqIEBwYXJhbSBucyAgICAgIFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBwcm9wZXJ0eSAoY3VycmVudGx5IG5vdCB1c2VkKS4KKyAgICAgKiBAcGFyYW0gbmFtZSAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHZhbHVlICAgVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8uCisgICAgICogQHBhcmFtIHZlcmJvc2UgSWYgdGhpcyBpcyB0cnVlIG91dHB1dCBleHRyYSBsb2cgbWVzc2FnZXMuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQuCisgICAgICogQGRlcHJlY2F0ZWQgbmFtZXNwYWNlcyBhcmUgdW5uZWNlc3NhcnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0UHJvcGVydHkoU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgcmV0dXJuIHNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCB2ZXJib3NlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHNldFByb3BlcnR5LiBXaWxsIGJlIGNhbGxlZCBmcm9tIFByb2plY3QuCisgICAgICogIFRoaXMgaXMgdGhlIG9yaWdpbmFsIDEuNSBpbXBsZW1lbnRhdGlvbiwgd2l0aCBjYWxscyB0byB0aGUgaG9vaworICAgICAqICBhZGRlZC4KKyAgICAgKiAgQHBhcmFtIG5hbWUgICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICBAcGFyYW0gdmFsdWUgICBUaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by4KKyAgICAgKiAgQHBhcmFtIHZlcmJvc2UgSWYgdGhpcyBpcyB0cnVlIG91dHB1dCBleHRyYSBsb2cgbWVzc2FnZXMuCisgICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RGVsZWdhdGVzKFByb3BlcnR5U2V0dGVyLmNsYXNzKS5pdGVyYXRvcigpOworICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgUHJvcGVydHlTZXR0ZXIgc2V0dGVyID0gKFByb3BlcnR5U2V0dGVyKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChzZXR0ZXIuc2V0KG5hbWUsIHZhbHVlLCB0aGlzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHVzZXIgKENMSSkgcHJvcGVydGllcyB0YWtlIHByZWNlZGVuY2UKKyAgICAgICAgaWYgKG51bGwgIT0gdXNlclByb3BlcnRpZXMuZ2V0KG5hbWUpKSB7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJPdmVycmlkZSBpZ25vcmVkIGZvciB1c2VyIHByb3BlcnR5IFwiIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworLy8gICAgICAgIGJvb2xlYW4gZG9uZSA9IHNldFByb3BlcnR5SG9vayhucywgbmFtZSwgdmFsdWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworLy8gICAgICAgIGlmIChkb25lKSB7CisvLyAgICAgICAgICAgIHJldHVybiB0cnVlOworLy8gICAgICAgIH0KKworICAgICAgICBpZiAobnVsbCAhPSBwcm9wZXJ0aWVzLmdldChuYW1lKSAmJiB2ZXJib3NlKSB7CisgICAgICAgICAgICBwcm9qZWN0LmxvZygiT3ZlcnJpZGluZyBwcmV2aW91cyBkZWZpbml0aW9uIG9mIHByb3BlcnR5IFwiIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBwcm9qZWN0LmxvZygiU2V0dGluZyBwcm9qZWN0IHByb3BlcnR5OiAiICsgbmFtZSArICIgLT4gIgorICAgICAgICAgICAgICAgICAgICArIHZhbHVlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIHByb3BlcnR5IGlmIG5vIHZhbHVlIGN1cnJlbnRseSBleGlzdHMuIElmIHRoZSBwcm9wZXJ0eQorICAgICAqIGV4aXN0cyBhbHJlYWR5LCBhIG1lc3NhZ2UgaXMgbG9nZ2VkIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgd2l0aAorICAgICAqIG5vIG90aGVyIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBucyAgIFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBwcm9wZXJ0eSAoY3VycmVudGx5IG5vdCB1c2VkKS4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiBwcm9wZXJ0eSB0byBzZXQuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqIEBkZXByZWNhdGVkIG5hbWVzcGFjZXMgYXJlIHVubmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5ld1Byb3BlcnR5KFN0cmluZyBucywgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZXROZXdQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIHByb3BlcnR5IGlmIG5vIHZhbHVlIGN1cnJlbnRseSBleGlzdHMuIElmIHRoZSBwcm9wZXJ0eQorICAgICAqIGV4aXN0cyBhbHJlYWR5LCBhIG1lc3NhZ2UgaXMgbG9nZ2VkIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgd2l0aAorICAgICAqIG5vIG90aGVyIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBzaW5jZSBBbnQgMS44CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE5ld1Byb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RGVsZWdhdGVzKFByb3BlcnR5U2V0dGVyLmNsYXNzKS5pdGVyYXRvcigpOworICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgUHJvcGVydHlTZXR0ZXIgc2V0dGVyID0gKFByb3BlcnR5U2V0dGVyKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChzZXR0ZXIuc2V0TmV3KG5hbWUsIHZhbHVlLCB0aGlzKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCAhPSBwcm9wZXJ0aWVzLmdldChuYW1lKSkgeworICAgICAgICAgICAgcHJvamVjdC5sb2coIk92ZXJyaWRlIGlnbm9yZWQgZm9yIHByb3BlcnR5IFwiIiArIG5hbWUgKyAiXCIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorLy8gICAgICAgIGJvb2xlYW4gZG9uZSA9IHNldFByb3BlcnR5SG9vayhucywgbmFtZSwgdmFsdWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisvLyAgICAgICAgaWYgKGRvbmUpIHsKKy8vICAgICAgICAgICAgcmV0dXJuOworLy8gICAgICAgIH0KKyAgICAgICAgcHJvamVjdC5sb2coIlNldHRpbmcgcHJvamVjdCBwcm9wZXJ0eTogIiArIG5hbWUgKyAiIC0+ICIgKyB2YWx1ZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSB1c2VyIHByb3BlcnR5LCB3aGljaCBjYW5ub3QgYmUgb3ZlcndyaXR0ZW4gYnkKKyAgICAgKiBzZXQvdW5zZXQgcHJvcGVydHkgY2FsbHMuIEFueSBwcmV2aW91cyB2YWx1ZSBpcyBvdmVyd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbnMgICBUaGUgbmFtZXNwYWNlIGZvciB0aGUgcHJvcGVydHkgKGN1cnJlbnRseSBub3QgdXNlZCkuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0LgorICAgICAqICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQGRlcHJlY2F0ZWQgbmFtZXNwYWNlcyBhcmUgdW5uZWNlc3NhcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclByb3BlcnR5KFN0cmluZyBucywgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZXRVc2VyUHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSB1c2VyIHByb3BlcnR5LCB3aGljaCBjYW5ub3QgYmUgb3ZlcndyaXR0ZW4gYnkKKyAgICAgKiBzZXQvdW5zZXQgcHJvcGVydHkgY2FsbHMuIEFueSBwcmV2aW91cyB2YWx1ZSBpcyBvdmVyd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiBwcm9wZXJ0eSB0byBzZXQuCisgICAgICogICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXNlclByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcHJvamVjdC5sb2coIlNldHRpbmcgcm8gcHJvamVjdCBwcm9wZXJ0eTogIiArIG5hbWUgKyAiIC0+ICIgKyB2YWx1ZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICB1c2VyUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworCisvLyAgICAgICAgYm9vbGVhbiBkb25lID0gc2V0UHJvcGVydHlIb29rKG5zLCBuYW1lLCB2YWx1ZSwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKy8vICAgICAgICBpZiAoZG9uZSkgeworLy8gICAgICAgICAgICByZXR1cm47CisvLyAgICAgICAgfQorICAgICAgICBwcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBpbmhlcml0ZWQgdXNlciBwcm9wZXJ0eSwgd2hpY2ggY2Fubm90IGJlIG92ZXJ3cml0dGVuIGJ5IHNldC91bnNldAorICAgICAqIHByb3BlcnR5IGNhbGxzLiBBbnkgcHJldmlvdXMgdmFsdWUgaXMgb3ZlcndyaXR0ZW4uIEFsc28gbWFya3MKKyAgICAgKiB0aGVzZSBwcm9wZXJ0aWVzIGFzIHByb3BlcnRpZXMgdGhhdCBoYXZlIG5vdCBjb21lIGZyb20gdGhlCisgICAgICogY29tbWFuZCBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIG5zICAgVGhlIG5hbWVzcGFjZSBmb3IgdGhlIHByb3BlcnR5IChjdXJyZW50bHkgbm90IHVzZWQpLgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldC4KKyAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBkZXByZWNhdGVkIG5hbWVzcGFjZXMgYXJlIHVubmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluaGVyaXRlZFByb3BlcnR5KFN0cmluZyBucywgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZXRJbmhlcml0ZWRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBpbmhlcml0ZWQgdXNlciBwcm9wZXJ0eSwgd2hpY2ggY2Fubm90IGJlIG92ZXJ3cml0dGVuIGJ5IHNldC91bnNldAorICAgICAqIHByb3BlcnR5IGNhbGxzLiBBbnkgcHJldmlvdXMgdmFsdWUgaXMgb3ZlcndyaXR0ZW4uIEFsc28gbWFya3MKKyAgICAgKiB0aGVzZSBwcm9wZXJ0aWVzIGFzIHByb3BlcnRpZXMgdGhhdCBoYXZlIG5vdCBjb21lIGZyb20gdGhlCisgICAgICogY29tbWFuZCBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0LgorICAgICAqICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEluaGVyaXRlZFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaW5oZXJpdGVkUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworCisgICAgICAgIHByb2plY3QubG9nKCJTZXR0aW5nIHJvIHByb2plY3QgcHJvcGVydHk6ICIgKyBuYW1lICsgIiAtPiAiICsgdmFsdWUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgdXNlclByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKKworLy8gICAgICAgIGJvb2xlYW4gZG9uZSA9IHNldFByb3BlcnR5SG9vayhucywgbmFtZSwgdmFsdWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisvLyAgICAgICAgaWYgKGRvbmUpIHsKKy8vICAgICAgICAgICAgcmV0dXJuOworLy8gICAgICAgIH0KKyAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEdldHRpbmcgcHJvcGVydGllcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHksIGlmIGl0IGlzIHNldC4gIFlvdSBjYW4gb3ZlcnJpZGUKKyAgICAgKiB0aGlzIG1ldGhvZCBpbiBvcmRlciB0byBwbHVnIHlvdXIgb3duIHN0b3JhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbnMgICBUaGUgbmFtZXNwYWNlIGZvciB0aGUgcHJvcGVydHkgKGN1cnJlbnRseSBub3QgdXNlZCkuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZQorICAgICAqICAgICAgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIG1hdGNoCisgICAgICogICAgICAgICBvciBpZiBhIDxjb2RlPm51bGw8L2NvZGU+IG5hbWUgaXMgcHJvdmlkZWQuCisgICAgICogQGRlcHJlY2F0ZWQgbmFtZXNwYWNlcyBhcmUgdW5uZWNlc3NhcnkuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHkobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSwgaWYgaXQgaXMgc2V0LiAgWW91IGNhbiBvdmVycmlkZQorICAgICAqIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHBsdWcgeW91ciBvd24gc3RvcmFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UKKyAgICAgKiAgICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBtYXRjaAorICAgICAqICAgICAgICAgb3IgaWYgYSA8Y29kZT5udWxsPC9jb2RlPiBuYW1lIGlzIHByb3ZpZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldERlbGVnYXRlcyhQcm9wZXJ0eUV2YWx1YXRvci5jbGFzcykuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgbyA9ICgoUHJvcGVydHlFdmFsdWF0b3IpIGl0ZXIubmV4dCgpKS5ldmFsdWF0ZShuYW1lLCB0aGlzKTsKKyAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE51bGxSZXR1cm4pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICAgICAgfQorICAgICAgICB9CisvLyAgICAgICAgT2JqZWN0IG8gPSBnZXRQcm9wZXJ0eUhvb2sobnMsIG5hbWUsIGZhbHNlKTsKKy8vICAgICAgICBpZiAobyAhPSBudWxsKSB7CisvLyAgICAgICAgICAgIHJldHVybiBvOworLy8gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgdXNlciBwcm9wZXJ0eSwgaWYgaXQgaXMgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIG5zICAgVGhlIG5hbWVzcGFjZSBmb3IgdGhlIHByb3BlcnR5IChjdXJyZW50bHkgbm90IHVzZWQpLgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UKKyAgICAgKiAgICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBtYXRjaAorICAgICAqICAgICAgICAgb3IgaWYgYSA8Y29kZT5udWxsPC9jb2RlPiBuYW1lIGlzIHByb3ZpZGVkLgorICAgICAqIEBkZXByZWNhdGVkIG5hbWVzcGFjZXMgYXJlIHVubmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlclByb3BlcnR5KFN0cmluZyBucywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldFVzZXJQcm9wZXJ0eShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHVzZXIgcHJvcGVydHksIGlmIGl0IGlzIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UKKyAgICAgKiAgICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBtYXRjaAorICAgICAqICAgICAgICAgb3IgaWYgYSA8Y29kZT5udWxsPC9jb2RlPiBuYW1lIGlzIHByb3ZpZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldFVzZXJQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorLyoKKyAgICAgICAgT2JqZWN0IG8gPSBnZXRQcm9wZXJ0eUhvb2sobnMsIG5hbWUsIHRydWUpOworICAgICAgICBpZiAobyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorKi8KKyAgICAgICAgcmV0dXJuIHVzZXJQcm9wZXJ0aWVzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBBY2Nlc3MgdG8gcHJvcGVydHkgdGFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IGFudCBjYWxsIGFuZCBzaW1pbGFyIHRhc2tzLiBJdCBzaG91bGQgYmUKKyAgICAvLyBkZXByZWNhdGVkLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgYSBiZXR0ZXIgKG1vcmUgZWZmaWNpZW50KQorICAgIC8vIG1lY2hhbmlzbSB0byBwcmVzZXJ2ZSB0aGUgY29udGV4dC4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzIHRhYmxlLgorICAgICAqIEByZXR1cm4gYSBoYXNodGFibGUgY29udGFpbmluZyBhbGwgcHJvcGVydGllcyAoaW5jbHVkaW5nIHVzZXIgcHJvcGVydGllcykuCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICAvL2F2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uOgorICAgICAgICBzeW5jaHJvbml6ZWQgKHByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaHRhYmxlKHByb3BlcnRpZXMpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZXJlIGlzIGEgYmV0dGVyIHdheSB0byBzYXZlIHRoZSBjb250ZXh0LiBUaGlzIHNob3VsZG4ndAorICAgICAgICAvLyBkZWxlZ2F0ZSB0byBuZXh0LCBpdCdzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkuCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIHVzZXIgcHJvcGVydHkgaGFzaHRhYmxlCisgICAgICogQHJldHVybiBhIGhhc2h0YWJsZSBjb250YWluaW5nIGp1c3QgdGhlIHVzZXIgcHJvcGVydGllcworICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0VXNlclByb3BlcnRpZXMoKSB7CisgICAgICAgIC8vYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb246CisgICAgICAgIHN5bmNocm9uaXplZCAodXNlclByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaHRhYmxlKHVzZXJQcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHNwZWNpYWwgYmFjayBkb29yIGZvciBzdWJjbGFzc2VzLCBpbnRlcm5hbCBhY2Nlc3MgdG8gdGhlIGhhc2h0YWJsZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXZlIGhhc2h0YWJsZSBvZiBhbGwgcHJvcGVydGllcworICAgICAqLworICAgIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0SW50ZXJuYWxQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzcGVjaWFsIGJhY2sgZG9vciBmb3Igc3ViY2xhc3NlcywgaW50ZXJuYWwgYWNjZXNzIHRvIHRoZSBoYXNodGFibGVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXZlIGhhc2h0YWJsZSBvZiB1c2VyIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldEludGVybmFsVXNlclByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiB1c2VyUHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzcGVjaWFsIGJhY2sgZG9vciBmb3Igc3ViY2xhc3NlcywgaW50ZXJuYWwgYWNjZXNzIHRvIHRoZSBoYXNodGFibGVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXZlIGhhc2h0YWJsZSBpbmhlcml0ZWQgcHJvcGVydGllcworICAgICAqLworICAgIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0SW50ZXJuYWxJbmhlcml0ZWRQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gaW5oZXJpdGVkUHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgYWxsIHVzZXIgcHJvcGVydGllcyB0aGF0IGhhdmUgbm90IGJlZW4gc2V0IG9uIHRoZQorICAgICAqIGNvbW1hbmQgbGluZSBvciBhIEdVSSB0b29sIGZyb20gdGhpcyBpbnN0YW5jZSB0byB0aGUgUHJvamVjdAorICAgICAqIGluc3RhbmNlIGdpdmVuIGFzIHRoZSBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIDxwPlRvIGNvcHkgYWxsICJ1c2VyIiBwcm9wZXJ0aWVzLCB5b3Ugd2lsbCBhbHNvIGhhdmUgdG8gY2FsbAorICAgICAqIHtAbGluayAjY29weVVzZXJQcm9wZXJ0aWVzIGNvcHlVc2VyUHJvcGVydGllc30uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBwcm9qZWN0IHRvIGNvcHkgdGhlIHByb3BlcnRpZXMgdG8uICBNdXN0IG5vdCBiZSBudWxsLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5SW5oZXJpdGVkUHJvcGVydGllcyhQcm9qZWN0IG90aGVyKSB7CisgICAgICAgIC8vYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb246CisgICAgICAgIHN5bmNocm9uaXplZCAoaW5oZXJpdGVkUHJvcGVydGllcykgeworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGluaGVyaXRlZFByb3BlcnRpZXMua2V5cygpOworICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXJnID0gZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKG90aGVyLmdldFVzZXJQcm9wZXJ0eShhcmcpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGluaGVyaXRlZFByb3BlcnRpZXMuZ2V0KGFyZyk7CisgICAgICAgICAgICAgICAgb3RoZXIuc2V0SW5oZXJpdGVkUHJvcGVydHkoYXJnLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllcyBhbGwgdXNlciBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBvbiB0aGUgY29tbWFuZAorICAgICAqIGxpbmUgb3IgYSBHVUkgdG9vbCBmcm9tIHRoaXMgaW5zdGFuY2UgdG8gdGhlIFByb2plY3QgaW5zdGFuY2UKKyAgICAgKiBnaXZlbiBhcyB0aGUgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiA8cD5UbyBjb3B5IGFsbCAidXNlciIgcHJvcGVydGllcywgeW91IHdpbGwgYWxzbyBoYXZlIHRvIGNhbGwKKyAgICAgKiB7QGxpbmsgI2NvcHlJbmhlcml0ZWRQcm9wZXJ0aWVzIGNvcHlJbmhlcml0ZWRQcm9wZXJ0aWVzfS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIHByb2plY3QgdG8gY29weSB0aGUgcHJvcGVydGllcyB0by4gIE11c3Qgbm90IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlVc2VyUHJvcGVydGllcyhQcm9qZWN0IG90aGVyKSB7CisgICAgICAgIC8vYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb246CisgICAgICAgIHN5bmNocm9uaXplZCAodXNlclByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB1c2VyUHJvcGVydGllcy5rZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBhcmcgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGluaGVyaXRlZFByb3BlcnRpZXMuY29udGFpbnNLZXkoYXJnKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdXNlclByb3BlcnRpZXMuZ2V0KGFyZyk7CisgICAgICAgICAgICAgICAgb3RoZXIuc2V0VXNlclByb3BlcnR5KGFyZy50b1N0cmluZygpLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnR5IHBhcnNpbmcgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gTW92ZWQgZnJvbSBQcm9qZWN0SGVscGVyLiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBzdGF0aWMgbWV0aG9kIC0KKyAgICAvLyB0aGlzIGlzIHVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKGZvciBjb2RlIHRoYXQgY2FsbHMKKyAgICAvLyB0aGUgcGFyc2UgbWV0aG9kIGluIFByb2plY3RIZWxwZXIpLgorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBwYXJzaW5nIG1ldGhvZC4gSXQgaXMgaGVyZSBvbmx5IHRvIHN1cHBvcnQgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgICAqIGZvciB0aGUgc3RhdGljIFByb2plY3RIZWxwZXIucGFyc2VQcm9wZXJ0eVN0cmluZygpLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHBhcnNlUHJvcGVydHlTdHJpbmdEZWZhdWx0KFN0cmluZyB2YWx1ZSwgVmVjdG9yIGZyYWdtZW50cywgVmVjdG9yIHByb3BlcnR5UmVmcykKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBwcmV2ID0gMDsKKyAgICAgICAgaW50IHBvczsKKyAgICAgICAgLy9zZWFyY2ggZm9yIHRoZSBuZXh0IGluc3RhbmNlIG9mICQgZnJvbSB0aGUgJ3ByZXYnIHBvc2l0aW9uCisgICAgICAgIHdoaWxlICgocG9zID0gdmFsdWUuaW5kZXhPZigiJCIsIHByZXYpKSA+PSAwKSB7CisKKyAgICAgICAgICAgIC8vaWYgdGhlcmUgd2FzIGFueSB0ZXh0IGJlZm9yZSB0aGlzLCBhZGQgaXQgYXMgYSBmcmFnbWVudAorICAgICAgICAgICAgLy9UT0RPLCB0aGlzIGNoZWNrIGNvdWxkIGJlIG1vZGlmaWVkIHRvIGdvIGlmIHBvcz5wcmV2OworICAgICAgICAgICAgLy9zZWVtcyBsaWtlIHRoaXMgY3VycmVudCB2ZXJzaW9uIGNvdWxkIHN0aWNrIGVtcHR5IHN0cmluZ3MKKyAgICAgICAgICAgIC8vaW50byB0aGUgbGlzdAorICAgICAgICAgICAgaWYgKHBvcyA+IDApIHsKKyAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkRWxlbWVudCh2YWx1ZS5zdWJzdHJpbmcocHJldiwgcG9zKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2lmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHdlIHRhY2sgb24gYSAkCisgICAgICAgICAgICAvL3RoZW4gbW92ZSBwYXN0IGl0CisgICAgICAgICAgICBpZiAocG9zID09ICh2YWx1ZS5sZW5ndGgoKSAtIDEpKSB7CisgICAgICAgICAgICAgICAgZnJhZ21lbnRzLmFkZEVsZW1lbnQoIiQiKTsKKyAgICAgICAgICAgICAgICBwcmV2ID0gcG9zICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuY2hhckF0KHBvcyArIDEpICE9ICd7JykgeworICAgICAgICAgICAgICAgIC8vcGVlayBhaGVhZCB0byBzZWUgaWYgdGhlIG5leHQgY2hhciBpcyBhIHByb3BlcnR5IG9yIG5vdAorICAgICAgICAgICAgICAgIC8vbm90IGEgcHJvcGVydHk6IGluc2VydCB0aGUgY2hhciBhcyBhIGxpdGVyYWwKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KHZhbHVlLnN1YnN0cmluZyhwb3MgKyAxLCBwb3MgKyAyKSk7CisgICAgICAgICAgICAgICAgcHJldiA9IHBvcyArIDI7CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuY2hhckF0KHBvcyArIDEpID09ICckJykgeworICAgICAgICAgICAgICAgICAgICAvL2JhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHR3byAkIG1hcCB0byBvbmUgbW9kZQorICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkRWxlbWVudCgiJCIpOworICAgICAgICAgICAgICAgICAgICBwcmV2ID0gcG9zICsgMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvL25ldyBiZWhhdmlvdXI6ICRYIG1hcHMgdG8gJFggZm9yIGFsbCB2YWx1ZXMgb2YgWCE9JyQnCisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KHZhbHVlLnN1YnN0cmluZyhwb3MsIHBvcyArIDIpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IHBvcyArIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL3Byb3BlcnR5IGZvdW5kLCBleHRyYWN0IGl0cyBuYW1lIG9yIGJhaWwgb24gYSB0eXBvCisgICAgICAgICAgICAgICAgaW50IGVuZE5hbWUgPSB2YWx1ZS5pbmRleE9mKCd9JywgcG9zKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kTmFtZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTeW50YXggZXJyb3IgaW4gcHJvcGVydHk6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcocG9zICsgMiwgZW5kTmFtZSk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnRzLmFkZEVsZW1lbnQobnVsbCk7CisgICAgICAgICAgICAgICAgcHJvcGVydHlSZWZzLmFkZEVsZW1lbnQocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAgICBwcmV2ID0gZW5kTmFtZSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9ubyBtb3JlICQgc2lnbnMgZm91bmQKKyAgICAgICAgLy9pZiB0aGVyZSBpcyBhbnkgdGFpbCB0byB0aGUgZmlsZSwgYXBwZW5kIGl0CisgICAgICAgIGlmIChwcmV2IDwgdmFsdWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGZyYWdtZW50cy5hZGRFbGVtZW50KHZhbHVlLnN1YnN0cmluZyhwcmV2KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCBkZWxlZ2F0ZSBvYmplY3QgdG8gdGhpcyBQcm9wZXJ0eUhlbHBlci4KKyAgICAgKiBEZWxlZ2F0ZXMgYXJlIHByb2Nlc3NlZCBpbiBMSUZPIG9yZGVyLgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSB0aGUgZGVsZWdhdGUgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbnQgMS44CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChEZWxlZ2F0ZSBkZWxlZ2F0ZSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXREZWxlZ2F0ZUludGVyZmFjZXMoZGVsZWdhdGUpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpIGRlbGVnYXRlcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIGRlbGVnYXRlcy5wdXQoa2V5LCBsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaXN0LmNvbnRhaW5zKGRlbGVnYXRlKSkgeworICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKGRlbGVnYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QuYWRkKDAsIGRlbGVnYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgQ29sbGVjdGlvbiBvZiBkZWxlZ2F0ZXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlIGRlbGVnYXRlIHR5cGUuCisgICAgICogQHJldHVybiBDb2xsZWN0aW9uLgorICAgICAqIEBzaW5jZSBBbnQgMS44CisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBMaXN0IGdldERlbGVnYXRlcyhDbGFzcyB0eXBlKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZXMuY29udGFpbnNLZXkodHlwZSkKKyAgICAgICAgICAgICAgICA/IChMaXN0KSBuZXcgQXJyYXlMaXN0KChMaXN0KSBkZWxlZ2F0ZXMuZ2V0KHR5cGUpKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCBEZWxlZ2F0ZSBpbnRlcmZhY2VzIChleGNsdWRpbmcgRGVsZWdhdGUgaXRzZWxmKSBmcm9tIHRoZSBzcGVjaWZpZWQgRGVsZWdhdGUuCisgICAgICogQHBhcmFtIGQgdGhlIERlbGVnYXRlIHRvIGluc3BlY3QuCisgICAgICogQHJldHVybiBTZXQ8Q2xhc3M+CisgICAgICogQHNpbmNlIEFudCAxLjgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2V0IGdldERlbGVnYXRlSW50ZXJmYWNlcyhEZWxlZ2F0ZSBkKSB7CisgICAgICAgIEhhc2hTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgQ2xhc3MgYyA9IGQuZ2V0Q2xhc3MoKTsKKyAgICAgICAgd2hpbGUgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3NbXSBpZnMgPSBjLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKERlbGVnYXRlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaWZzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGlmc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYyA9IGMuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5yZW1vdmUoRGVsZWdhdGUuY2xhc3MpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUnVudGltZUNvbmZpZ3VyYWJsZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUnVudGltZUNvbmZpZ3VyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWRlN2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9SdW50aW1lQ29uZmlndXJhYmxlLmphdmEKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbGxlY3Rpb25VdGlsczsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlTGlzdEltcGw7CisKKy8qKgorICogV3JhcHBlciBjbGFzcyB0aGF0IGhvbGRzIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGVsZW1lbnQsIGl0cyBjaGlsZHJlbiwgYW5kCisgKiBhbnkgdGV4dCB3aXRoaW4gaXQuIEl0IHRoZW4gdGFrZXMgY2FyZSBvZiBjb25maWd1cmluZyB0aGF0IGVsZW1lbnQgYXQKKyAqIHJ1bnRpbWUuCisgKgorICovCitwdWJsaWMgY2xhc3MgUnVudGltZUNvbmZpZ3VyYWJsZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKiogRW1wdHkgSGFzaHRhYmxlLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2h0YWJsZSBFTVBUWV9IQVNIVEFCTEUgPSBuZXcgSGFzaHRhYmxlKDApOworCisgICAgLyoqIE5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gY29uZmlndXJlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGVsZW1lbnRUYWcgPSBudWxsOworCisgICAgLyoqIExpc3Qgb2YgY2hpbGQgZWxlbWVudCB3cmFwcGVycy4gKi8KKyAgICBwcml2YXRlIExpc3QvKjxSdW50aW1lQ29uZmlndXJhYmxlPiovIGNoaWxkcmVuID0gbnVsbDsKKworICAgIC8qKiBUaGUgZWxlbWVudCB0byBjb25maWd1cmUuIEl0IGlzIG9ubHkgdXNlZCBkdXJpbmcKKyAgICAgKiBtYXliZUNvbmZpZ3VyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3Qgd3JhcHBlZE9iamVjdCA9IG51bGw7CisKKyAgICAvKiogdGhlIGNyZWF0b3IgdXNlZCB0byBtYWtlIHRoZSB3cmFwcGVkIG9iamVjdCAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IEludHJvc3BlY3Rpb25IZWxwZXIuQ3JlYXRvciBjcmVhdG9yOworCisgICAgLyoqCisgICAgICogWE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50LgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54CisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgQXR0cmlidXRlTGlzdCBhdHRyaWJ1dGVzOworCisgICAgLyoqIEF0dHJpYnV0ZSBuYW1lcyBhbmQgdmFsdWVzLiBXaGlsZSB0aGUgWE1MIHNwZWMgZG9lc24ndCByZXF1aXJlCisgICAgICogIHByZXNlcnZpbmcgdGhlIG9yZGVyICggQUZBSUsgKSwgc29tZSBhbnQgdGVzdHMgZG8gcmVseSBvbiB0aGUKKyAgICAgKiAgZXhhY3Qgb3JkZXIuIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBjb3BpZWQgZnJvbSBBdHRyaWJ1dGVJbXBsLgorICAgICAqICBXZSBjb3VsZCBhbHNvIGp1c3QgdXNlIFNBWDIgQXR0cmlidXRlcyBhbmQgY29udmVydCB0byBTQVgxICggRE9NCisgICAgICogIGF0dHJpYnV0ZSBOb2RlcyBjYW4gYWxzbyBiZSBzdG9yZWQgaW4gU0FYMiBBdHRyaWJ1dGVzICkKKyAgICAgKiAgWFhYIHVuZGVyIEpESyAxLjQgeW91IGNhbiBqdXN0IHVzZSBhIExpbmtlZEhhc2hNYXAgZm9yIHRoaXMgcHVycG9zZSAtamdsaWNrCisgICAgICogVGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgb3JkZXIgaXMgdGhlIHRyZWF0bWVudCBvZgorICAgICAqIHJlZmlkLiBBIG51bWJlciBvZiBkYXRhdHlwZXMgY2hlY2sgaWYgcmVmaWQgaXMgc2V0CisgICAgICogd2hlbiBvdGhlciBhdHRyaWJ1dGVzIGFyZSBzZXQuIFRoaXMgY2hlY2sgd2lsbCBub3QKKyAgICAgKiB3b3JrIGlmIHRoZSBidWlsZCBzY3JpcHQgaGFzIHRoZSBvdGhlciBhdHRyaWJ1dGUgYmVmb3JlCisgICAgICogdGhlICJyZWZpZCIgYXR0cmlidXRlLCBzbyBub3cgKEFOVCAxLjcpIHRoZSByZWZpZAorICAgICAqIGF0dHJpYnV0ZSB3aWxsIGJlIHByb2Nlc3NlZCBmaXJzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QvKjxTdHJpbmc+Ki8gYXR0cmlidXRlTmFtZXMgPSBudWxsOworCisgICAgLyoqIE1hcCBvZiBhdHRyaWJ1dGUgbmFtZXMgdG8gdmFsdWVzICovCisgICAgcHJpdmF0ZSBNYXAvKjxTdHJpbmcsU3RyaW5nPiovIGF0dHJpYnV0ZU1hcCA9IG51bGw7CisKKyAgICAvKiogVGV4dCBhcHBlYXJpbmcgd2l0aGluIHRoZSBlbGVtZW50LiAqLworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGNoYXJhY3RlcnMgPSBudWxsOworCisgICAgLyoqIEluZGljYXRlcyBpZiB0aGUgd3JhcHBlZCBvYmplY3QgaGFzIGJlZW4gY29uZmlndXJlZCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwcm94eUNvbmZpZ3VyZWQgPSBmYWxzZTsKKworICAgIC8qKiB0aGUgcG9seW1vcnBoaWMgdHlwZSAqLworICAgIHByaXZhdGUgU3RyaW5nIHBvbHlUeXBlID0gbnVsbDsKKworICAgIC8qKiB0aGUgImlkIiBvZiB0aGlzIEVsZW1lbnQgaWYgaXQgaGFzIG9uZSAqLworICAgIHByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IgY3JlYXRpbmcgYSB3cmFwcGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm94eSBUaGUgZWxlbWVudCB0byBjb25maWd1cmUuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBlbGVtZW50VGFnIFRoZSB0YWcgbmFtZSBnZW5lcmF0aW5nIHRoaXMgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVudGltZUNvbmZpZ3VyYWJsZShPYmplY3QgcHJveHksIFN0cmluZyBlbGVtZW50VGFnKSB7CisgICAgICAgIHNldFByb3h5KHByb3h5KTsKKyAgICAgICAgc2V0RWxlbWVudFRhZyhlbGVtZW50VGFnKTsKKyAgICAgICAgLy8gTW9zdCBsaWtlbHkgYW4gVW5rbm93bkVsZW1lbnQKKyAgICAgICAgaWYgKHByb3h5IGluc3RhbmNlb2YgVGFzaykgeworICAgICAgICAgICAgKChUYXNrKSBwcm94eSkuc2V0UnVudGltZUNvbmZpZ3VyYWJsZVdyYXBwZXIodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBlbGVtZW50IHRvIGNvbmZpZ3VyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm94eSBUaGUgZWxlbWVudCB0byBjb25maWd1cmUuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQcm94eShPYmplY3QgcHJveHkpIHsKKyAgICAgICAgd3JhcHBlZE9iamVjdCA9IHByb3h5OworICAgICAgICBwcm94eUNvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjcmVhdG9yIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiB1c2VkIHRvIHN0b3JlIHRoZSBlbGVtZW50IGluIHRoZSBwYXJlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JlYXRvciB0aGUgY3JlYXRvciBvYmplY3QuCisgICAgICovCisgICAgc3luY2hyb25pemVkIHZvaWQgc2V0Q3JlYXRvcihJbnRyb3NwZWN0aW9uSGVscGVyLkNyZWF0b3IgY3JlYXRvcikgeworICAgICAgICB0aGlzLmNyZWF0b3IgPSBjcmVhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgb2JqZWN0IGZvciB3aGljaCB0aGlzIFJ1bnRpbWVDb25maWd1cmFibGUgaG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCB3aG9zZSBjb25maWd1cmUgaXMgaGVsZCBieSB0aGlzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldFByb3h5KCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZE9iamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpZCBmb3IgdGhpcyBlbGVtZW50LgorICAgICAqIEByZXR1cm4gdGhlIGlkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwb2x5bW9ycGhpYyB0eXBlIGZvciB0aGlzIGVsZW1lbnQuCisgICAgICogQHJldHVybiB0aGUgYW50IGNvbXBvbmVudCB0eXBlIG5hbWUsIG51bGwgaWYgbm90IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRQb2x5VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHBvbHlUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9seW1vcnBoaWMgdHlwZSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAqIEBwYXJhbSBwb2x5VHlwZSB0aGUgYW50IGNvbXBvbmVudCB0eXBlIG5hbWUsIG51bGwgaWYgbm90IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UG9seVR5cGUoU3RyaW5nIHBvbHlUeXBlKSB7CisgICAgICAgIHRoaXMucG9seVR5cGUgPSBwb2x5VHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgd3JhcHBlZCBlbGVtZW50LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgTGlzdCBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhlIFhNTCBmb3IgdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0IGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUxpc3RJbXBsKGF0dHJpYnV0ZXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgc2V0QXR0cmlidXRlKGF0dHJpYnV0ZXMuZ2V0TmFtZShpKSwgYXR0cmlidXRlcy5nZXRWYWx1ZShpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gYXR0cmlidXRlIHRvIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoUHJvamVjdEhlbHBlci5BTlRfVFlQRSkpIHsKKyAgICAgICAgICAgIHRoaXMucG9seVR5cGUgPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZXF1YWxzKCJyZWZpZCIpKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZXMuYWRkKDAsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lcy5hZGQobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyaWJ1dGVNYXAucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiaWQiKSkgeworICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhbiBhdHRyaWJ1dGUuICBOb3QgZm9yIHRoZSBmYWludCBvZiBoZWFydC4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBhdHRyaWJ1dGVOYW1lcy5yZW1vdmUobmFtZSk7CisgICAgICAgIGF0dHJpYnV0ZU1hcC5yZW1vdmUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUgbWFwLgorICAgICAqCisgICAgICogQHJldHVybiBBdHRyaWJ1dGUgbmFtZSB0byBhdHRyaWJ1dGUgdmFsdWUgbWFwLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBIYXNodGFibGUgZ2V0QXR0cmlidXRlTWFwKCkgeworICAgICAgICByZXR1cm4gKGF0dHJpYnV0ZU1hcCA9PSBudWxsKQorICAgICAgICAgICAgPyBFTVBUWV9IQVNIVEFCTEUgOiBuZXcgSGFzaHRhYmxlKGF0dHJpYnV0ZU1hcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgd3JhcHBlZCBlbGVtZW50LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBzaW5jZSBBbnQgMS42IGluIGZhdm9yIG9mIHtAbGluayAjZ2V0QXR0cmlidXRlTWFwfS4KKyAgICAgKiBAcmV0dXJuIEFuIEF0dHJpYnV0ZUxpc3QgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhlCisgICAgICogICAgICAgICBYTUwgZm9yIHRoaXMgZWxlbWVudC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQXR0cmlidXRlTGlzdCBnZXRBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY2hpbGQgZWxlbWVudCB0byB0aGUgd3JhcHBlZCBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBjaGlsZCBlbGVtZW50IHdyYXBwZXIgdG8gYWRkIHRvIHRoaXMgb25lLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ2hpbGQoUnVudGltZUNvbmZpZ3VyYWJsZSBjaGlsZCkgeworICAgICAgICBjaGlsZHJlbiA9IChjaGlsZHJlbiA9PSBudWxsKSA/IG5ldyBBcnJheUxpc3QoKSA6IGNoaWxkcmVuOworICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNoaWxkIHdyYXBwZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB3aXRoaW4gdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byByZXR1cm4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjaGlsZCB3cmFwcGVyIGF0IHBvc2l0aW9uIDxjb2RlPmluZGV4PC9jb2RlPiB3aXRoaW4gdGhlCisgICAgICogICAgICAgICBsaXN0LgorICAgICAqLworICAgIHN5bmNocm9uaXplZCBSdW50aW1lQ29uZmlndXJhYmxlIGdldENoaWxkKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKFJ1bnRpbWVDb25maWd1cmFibGUpIGNoaWxkcmVuLmdldChpbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgY2hpbGQgd3JhcHBlcnMuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgY2hpbGQgd3JhcHBlcnMuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEVudW1lcmF0aW9uIGdldENoaWxkcmVuKCkgeworICAgICAgICByZXR1cm4gKGNoaWxkcmVuID09IG51bGwpID8gbmV3IENvbGxlY3Rpb25VdGlscy5FbXB0eUVudW1lcmF0aW9uKCkKKyAgICAgICAgICAgIDogQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oY2hpbGRyZW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgY2hhcmFjdGVycyBmcm9tICNQQ0RBVEEgYXJlYXMgdG8gdGhlIHdyYXBwZWQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRleHQgdG8gYWRkIHRvIHRoZSB3cmFwcGVkIGVsZW1lbnQuCisgICAgICogICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFRleHQoU3RyaW5nIGRhdGEpIHsKKyAgICAgICAgaWYgKGRhdGEubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNoYXJhY3RlcnMgPSAoY2hhcmFjdGVycyA9PSBudWxsKQorICAgICAgICAgICAgPyBuZXcgU3RyaW5nQnVmZmVyKGRhdGEpIDogY2hhcmFjdGVycy5hcHBlbmQoZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBjaGFyYWN0ZXJzIGZyb20gI1BDREFUQSBhcmVhcyB0byB0aGUgd3JhcHBlZCBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiBBIGNoYXJhY3RlciBhcnJheSBvZiB0aGUgdGV4dCB3aXRoaW4gdGhlIGVsZW1lbnQuCisgICAgICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUZXh0KGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50KSB7CisgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY2hhcmFjdGVycyA9ICgoY2hhcmFjdGVycyA9PSBudWxsKQorICAgICAgICAgICAgPyBuZXcgU3RyaW5nQnVmZmVyKGNvdW50KSA6IGNoYXJhY3RlcnMpLmFwcGVuZChidWYsIHN0YXJ0LCBjb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhpcyBlbGVtZW50LiBWYXJpb3VzIHRleHQgY2h1bmtzIGFyZQorICAgICAqIGNvbmNhdGVuYXRlZCwgdGhlcmUgaXMgbm8gd2F5ICggY3VycmVudGx5ICkgb2Yga2VlcGluZyB0cmFjayBvZgorICAgICAqIG11bHRpcGxlIGZyYWdtZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRleHQgY29udGVudCBvZiB0aGlzIGVsZW1lbnQuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ0J1ZmZlciBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gKGNoYXJhY3RlcnMgPT0gbnVsbCkgPyBuZXcgU3RyaW5nQnVmZmVyKDApIDogY2hhcmFjdGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVsZW1lbnQgdGFnLgorICAgICAqIEBwYXJhbSBlbGVtZW50VGFnIFRoZSB0YWcgbmFtZSBnZW5lcmF0aW5nIHRoaXMgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RWxlbWVudFRhZyhTdHJpbmcgZWxlbWVudFRhZykgeworICAgICAgICB0aGlzLmVsZW1lbnRUYWcgPSBlbGVtZW50VGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhZyBuYW1lIG9mIHRoZSB3cmFwcGVkIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0YWcgbmFtZSBvZiB0aGUgd3JhcHBlZCBlbGVtZW50LiBUaGlzIGlzIHVubGlrZWx5CisgICAgICogICAgICAgICB0byBiZSA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IG1heSBiZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRFbGVtZW50VGFnKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudFRhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIHRoZSB3cmFwcGVkIGVsZW1lbnQgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCisgICAgICogVGhlIGF0dHJpYnV0ZXMgYW5kIHRleHQgZm9yIHRoZSB3cmFwcGVkIGVsZW1lbnQgYXJlIGNvbmZpZ3VyZWQsCisgICAgICogYW5kIHRoZW4gZWFjaCBjaGlsZCBpcyBjb25maWd1cmVkIGFuZCBhZGRlZC4gRWFjaCB0aW1lIHRoZQorICAgICAqIHdyYXBwZXIgaXMgY29uZmlndXJlZCwgdGhlIGF0dHJpYnV0ZXMgYW5kIHRleHQgZm9yIGl0IGFyZQorICAgICAqIHJlc2V0LgorICAgICAqCisgICAgICogSWYgdGhlIGVsZW1lbnQgaGFzIGFuIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUsIGEgcmVmZXJlbmNlCisgICAgICogaXMgYWRkZWQgdG8gdGhlIHByb2plY3QgYXMgd2VsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwIFRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHdyYXBwZWQgZWxlbWVudC4KKyAgICAgKiAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmFpbHMsIGZvciBpbnN0YW5jZSBkdWUKKyAgICAgKiAgICAgICAgICAgIHRvIGludmFsaWQgYXR0cmlidXRlcyBvciBjaGlsZHJlbiwgb3IgdGV4dCBiZWluZyBhZGRlZCB0bworICAgICAqICAgICAgICAgICAgYW4gZWxlbWVudCB3aGljaCBkb2Vzbid0IGFjY2VwdCBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtYXliZUNvbmZpZ3VyZShQcm9qZWN0IHApIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIG1heWJlQ29uZmlndXJlKHAsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgdGhlIHdyYXBwZWQgZWxlbWVudC4gIFRoZSBhdHRyaWJ1dGVzIGFuZCB0ZXh0IGZvcgorICAgICAqIHRoZSB3cmFwcGVkIGVsZW1lbnQgYXJlIGNvbmZpZ3VyZWQuICBFYWNoIHRpbWUgdGhlIHdyYXBwZXIgaXMKKyAgICAgKiBjb25maWd1cmVkLCB0aGUgYXR0cmlidXRlcyBhbmQgdGV4dCBmb3IgaXQgYXJlIHJlc2V0LgorICAgICAqCisgICAgICogSWYgdGhlIGVsZW1lbnQgaGFzIGFuIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUsIGEgcmVmZXJlbmNlCisgICAgICogaXMgYWRkZWQgdG8gdGhlIHByb2plY3QgYXMgd2VsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwIFRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHdyYXBwZWQgZWxlbWVudC4KKyAgICAgKiAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWd1cmVDaGlsZHJlbiBpZ25vcmVkLgorCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb25maWd1cmF0aW9uIGZhaWxzLCBmb3IgaW5zdGFuY2UgZHVlCisgICAgICogICAgICAgICAgICB0byBpbnZhbGlkIGF0dHJpYnV0ZXMgLCBvciB0ZXh0IGJlaW5nIGFkZGVkIHRvCisgICAgICogICAgICAgICAgICBhbiBlbGVtZW50IHdoaWNoIGRvZXNuJ3QgYWNjZXB0IGl0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXliZUNvbmZpZ3VyZShQcm9qZWN0IHAsIGJvb2xlYW4gY29uZmlndXJlQ2hpbGRyZW4pCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHByb3h5Q29uZmlndXJlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBvYmplY3QKKyAgICAgICAgT2JqZWN0IHRhcmdldCA9ICh3cmFwcGVkT2JqZWN0IGluc3RhbmNlb2YgVHlwZUFkYXB0ZXIpCisgICAgICAgICAgICA/ICgoVHlwZUFkYXB0ZXIpIHdyYXBwZWRPYmplY3QpLmdldFByb3h5KCkgOiB3cmFwcGVkT2JqZWN0OworCisgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIgaWggPQorICAgICAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIocCwgdGFyZ2V0LmdldENsYXNzKCkpOworCisgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZU5hbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBhdHRyaWJ1dGVOYW1lcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChuYW1lKTsKKworICAgICAgICAgICAgICAgIC8vIHJlZmxlY3QgdGhlc2UgaW50byB0aGUgdGFyZ2V0CisgICAgICAgICAgICAgICAgT2JqZWN0IGF0dHJWYWx1ZSA9IFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHApLnBhcnNlUHJvcGVydGllcyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRhcmdldCwgbmFtZSwgYXR0clZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEF0dHJpYnV0ZUV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZXh0ZXJuYWxseQorICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoImlkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlICBpZiAoZ2V0RWxlbWVudFRhZygpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGJlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRUYWcoKSArICAiIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiZS5nZXRBdHRyaWJ1dGUoKSArICJcIiBhdHRyaWJ1dGUiLCBiZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoImlkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoaXMgaXMgYW4gbm90IHN1cHBvcnRlZCBhdHRyaWJ1dGUgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3duIGZvciBleGFtcGxlIGJ5IGEgZHltYW5pYyBhdHRyaWJ1dGUgdGFzaworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hhcmFjdGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBQcm9qZWN0SGVscGVyLmFkZFRleHQocCwgd3JhcHBlZE9iamVjdCwgY2hhcmFjdGVycy5zdWJzdHJpbmcoMCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHAuYWRkUmVmZXJlbmNlKGlkLCB3cmFwcGVkT2JqZWN0KTsKKyAgICAgICAgfQorICAgICAgICBwcm94eUNvbmZpZ3VyZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29uZmlndXJlIHRoZSBlbGVtZW50LCBldmVuIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwIHRoZSBwcm9qZWN0IGluc3RhbmNlIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjb25maWd1cmUoUHJvamVjdCBwKSB7CisgICAgICAgIHByb3h5Q29uZmlndXJlZCA9IGZhbHNlOworICAgICAgICBtYXliZUNvbmZpZ3VyZShwKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFwcGx5IHByZXNldHMsIGF0dHJpYnV0ZXMgYW5kIHRleHQgYXJlIHNldCBpZiBub3QgY3VycmVudGx5IHNldC4KKyAgICAgKiBOZXN0ZWQgZWxlbWVudHMgYXJlIHByZXBlbmRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIGEgPGNvZGU+UnVudGltZUNvbmZpZ3VyYWJsZTwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwbHlQcmVTZXQoUnVudGltZUNvbmZpZ3VyYWJsZSByKSB7CisgICAgICAgIC8vIEF0dHJpYnV0ZXMKKyAgICAgICAgaWYgKHIuYXR0cmlidXRlTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHIuYXR0cmlidXRlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU1hcCA9PSBudWxsIHx8IGF0dHJpYnV0ZU1hcC5nZXQobmFtZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXRBdHRyaWJ1dGUobmFtZSwgKFN0cmluZykgci5hdHRyaWJ1dGVNYXAuZ2V0KG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcG9seSB0eXBlCisKKyAgICAgICAgcG9seVR5cGUgPSAocG9seVR5cGUgPT0gbnVsbCkgPyByLnBvbHlUeXBlIDogcG9seVR5cGU7CisKKyAgICAgICAgLy8gQ2hpbGRyZW4gKHRoaXMgaXMgYSBzaGFkb3cgb2YgVW5rbm93bkVsZW1lbnQjY2hpbGRyZW4pCisgICAgICAgIGlmIChyLmNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIExpc3QgbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBuZXdDaGlsZHJlbi5hZGRBbGwoci5jaGlsZHJlbik7CisgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGlsZHJlbiA9IG5ld0NoaWxkcmVuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGV4dAorICAgICAgICBpZiAoci5jaGFyYWN0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJzID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBjaGFyYWN0ZXJzLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzID0gbmV3IFN0cmluZ0J1ZmZlcihyLmNoYXJhY3RlcnMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9TdWJCdWlsZExpc3RlbmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9TdWJCdWlsZExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2YTg4YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1N1YkJ1aWxkTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKKy8qKgorICogSW5zdGFuY2VzIG9mIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgY2FuIHJlZ2lzdGVyCisgKiB0byBiZSBhbHNvIG5vdGlmaWVkIHdoZW4gdGhpbmdzIGhhcHBlbmVkIGR1cmluZyBhIHN1YmJ1aWxkLgorICoKKyAqIDxwPkEgc3ViYnVpbGQgaXMgYSBzZXBhcmF0ZSBwcm9qZWN0IGluc3RhbmNlIGNyZWF0ZWQgYnkgdGhlCisgKiA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFzayBmYW1pbHkuICBUaGVzZSBwcm9qZWN0IGluc3RhbmNlcyB3aWxsCisgKiBuZXZlciBmaXJlIHRoZSBidWlsZFN0YXJ0ZWQgYW5kIGJ1aWxkRmluaXNoZWQgZXZlbnRzLCBidXQgdGhleSB3aWxsCisgKiBmaXJlIHN1YkJ1aWxkU3RhcnRlZC8gYW5kIHN1YkJ1aWxkRmluaXNoZWQuICBUaGUgbWFpbiBwcm9qZWN0CisgKiBpbnN0YW5jZSAtIHRoZSBvbmUgY3JlYXRlZCBieSBydW5uaW5nIEFudCBpbiB0aGUgZmlyc3QgcGxhY2UgLSB3aWxsCisgKiBuZXZlciBpbnZva2Ugb25lIG9mIHRoZSBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlLjwvcD4KKyAqCisgKiBAc2VlIEJ1aWxkRXZlbnQKKyAqIEBzZWUgUHJvamVjdCNhZGRCdWlsZExpc3RlbmVyKEJ1aWxkTGlzdGVuZXIpCisgKgorICogQHNpbmNlIEFudCAxLjYuMgorICovCitwdWJsaWMgaW50ZXJmYWNlIFN1YkJ1aWxkTGlzdGVuZXIgZXh0ZW5kcyBCdWlsZExpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIFNpZ25hbHMgdGhhdCBhIHN1YmJ1aWxkIGhhcyBzdGFydGVkLiBUaGlzIGV2ZW50CisgICAgICogaXMgZmlyZWQgYmVmb3JlIGFueSB0YXJnZXRzIGhhdmUgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBBbiBldmVudCB3aXRoIGFueSByZWxldmFudCBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgdm9pZCBzdWJCdWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIHRoYXQgdGhlIGxhc3QgdGFyZ2V0IGhhcyBmaW5pc2hlZC4gVGhpcyBldmVudAorICAgICAqIHdpbGwgc3RpbGwgYmUgZmlyZWQgaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBidWlsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBBbiBldmVudCB3aXRoIGFueSByZWxldmFudCBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKKyAgICAgKi8KKyAgICB2b2lkIHN1YkJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXJnZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1RhcmdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDk5MzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXJnZXQuamF2YQpAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKioKKyAqIENsYXNzIHRvIGltcGxlbWVudCBhIHRhcmdldCBvYmplY3Qgd2l0aCByZXF1aXJlZCBwYXJhbWV0ZXJzLgorICoKKyAqLworcHVibGljIGNsYXNzIFRhcmdldCBpbXBsZW1lbnRzIFRhc2tDb250YWluZXIgeworCisgICAgLyoqIE5hbWUgb2YgdGhpcyB0YXJnZXQuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIC8qKiBUaGUgImlmIiBjb25kaXRpb24gdG8gdGVzdCBvbiBleGVjdXRpb24uICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaWZDb25kaXRpb24gPSAiIjsKKworICAgIC8qKiBUaGUgInVubGVzcyIgY29uZGl0aW9uIHRvIHRlc3Qgb24gZXhlY3V0aW9uLiAqLworICAgIHByaXZhdGUgU3RyaW5nIHVubGVzc0NvbmRpdGlvbiA9ICIiOworCisgICAgLyoqIExpc3Qgb2YgdGFyZ2V0cyB0aGlzIHRhcmdldCBpcyBkZXBlbmRlbnQgb24uICovCisgICAgcHJpdmF0ZSBMaXN0IGRlcGVuZGVuY2llcyA9IG51bGw7CisKKyAgICAvKiogQ2hpbGRyZW4gb2YgdGhpcyB0YXJnZXQgKHRhc2tzIGFuZCBkYXRhIHR5cGVzKS4gKi8KKyAgICBwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKiogU2luY2UgQW50IDEuNi4yICovCisgICAgcHJpdmF0ZSBMb2NhdGlvbiBsb2NhdGlvbiA9IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT047CisKKyAgICAvKiogUHJvamVjdCB0aGlzIHRhcmdldCBiZWxvbmdzIHRvLiAqLworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgLyoqIERlc2NyaXB0aW9uIG9mIHRoaXMgdGFyZ2V0LCBpZiBhbnkuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisgICAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCisgICAgcHVibGljIFRhcmdldCgpIHsKKyAgICAgICAgLy9lbXB0eQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb25pbmcgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBUYXJnZXQgdG8gY2xvbmUuCisgICAgICovCisgICAgcHVibGljIFRhcmdldChUYXJnZXQgb3RoZXIpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gb3RoZXIubmFtZTsKKyAgICAgICAgdGhpcy5pZkNvbmRpdGlvbiA9IG90aGVyLmlmQ29uZGl0aW9uOworICAgICAgICB0aGlzLnVubGVzc0NvbmRpdGlvbiA9IG90aGVyLnVubGVzc0NvbmRpdGlvbjsKKyAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBvdGhlci5kZXBlbmRlbmNpZXM7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBvdGhlci5sb2NhdGlvbjsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gb3RoZXIucHJvamVjdDsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IG90aGVyLmRlc2NyaXB0aW9uOworICAgICAgICAvLyBUaGUgY2hpbGRyZW4gYXJlIGFkZGVkIHRvIGFmdGVyIHRoaXMgY2xvbmluZworICAgICAgICB0aGlzLmNoaWxkcmVuID0gb3RoZXIuY2hpbGRyZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvamVjdCB0aGlzIHRhcmdldCBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdGhpcyB0YXJnZXQgYmVsb25ncyB0by4KKyAgICAgKiAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByb2plY3QgdGhpcyB0YXJnZXQgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHByb2plY3QgdGhpcyB0YXJnZXQgYmVsb25ncyB0bywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiAgICAgICAgIHRoZSBwcm9qZWN0IGhhcyBub3QgYmVlbiBzZXQgeWV0LgorICAgICAqLworICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoaXMgdGFyZ2V0J3MgZGVmaW5pdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiAgIDxjb2RlPkxvY2F0aW9uPC9jb2RlPgorICAgICAqIEBzaW5jZSAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgdGFyZ2V0J3MgZGVmaW5pdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+TG9jYXRpb248L2NvZGU+CisgICAgICogQHNpbmNlIDEuNi4yCisgICAgICovCisgICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbG9jYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdCBvZiB0YXJnZXRzIHRoaXMgdGFyZ2V0IGlzIGRlcGVuZGVudCBvbi4KKyAgICAgKiBUaGUgdGFyZ2V0cyB0aGVtc2VsdmVzIGFyZSBub3QgcmVzb2x2ZWQgYXQgdGhpcyB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGRlcFMgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzIHRoaXMgdGFyZ2V0CisgICAgICogICAgICAgICAgICAgZGVwZW5kcyBvbi4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVwZW5kcyhTdHJpbmcgZGVwUykgeworICAgICAgICBpZiAoZGVwUy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPQorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoZGVwUywgIiwiLCB0cnVlKTsKKyAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKKworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVwZW5kZW5jeSBpcyBub3QgZW1wdHkgc3RyaW5nCisgICAgICAgICAgICAgICAgaWYgKCIiLmVxdWFscyh0b2tlbikgfHwgIiwiLmVxdWFscyh0b2tlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTeW50YXggRXJyb3I6IGRlcGVuZHMgIiArICJhdHRyaWJ1dGUgb2YgdGFyZ2V0IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0TmFtZSgpICsgIlwiIGhhcyBhbiBlbXB0eSBzdHJpbmcgYXMgZGVwZW5kZW5jeS4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhZGREZXBlbmRlbmN5KHRva2VuKTsKKworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGRlcGVuZHMgYXR0cmlidXRlIGRvZXMgbm90CisgICAgICAgICAgICAgICAgLy8gZW5kIGluIGEgLAorICAgICAgICAgICAgICAgIGlmICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgICAgIHRva2VuID0gdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5oYXNNb3JlVG9rZW5zKCkgfHwgISIsIi5lcXVhbHModG9rZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlN5bnRheCBFcnJvcjogRGVwZW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlIGZvciB0YXJnZXQgXCIiICsgZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGVuZHMgd2l0aCBhICwgY2hhcmFjdGVyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgdGFyZ2V0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXJnZXQuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdGFyZ2V0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAgICAgKiAgICAgICAgIG5hbWUgaGFzIG5vdCBiZWVuIHNldCB5ZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgdGFzayB0byB0aGlzIHRhcmdldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHRvIGJlIGFkZGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgdGFzaykgeworICAgICAgICBjaGlsZHJlbi5hZGQodGFzayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgd3JhcHBlciBmb3IgYSBkYXRhIHR5cGUgZWxlbWVudCB0byB0aGlzIHRhcmdldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIFRoZSB3cmFwcGVyIGZvciB0aGUgZGF0YSB0eXBlIGVsZW1lbnQgdG8gYmUgYWRkZWQuCisgICAgICogICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGF0YVR5cGUoUnVudGltZUNvbmZpZ3VyYWJsZSByKSB7CisgICAgICAgIGNoaWxkcmVuLmFkZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldCBvZiB0YXNrcyB0byBiZSBleGVjdXRlZCBieSB0aGlzIHRhcmdldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHRhc2tzIGN1cnJlbnRseSB3aXRoaW4gdGhpcyB0YXJnZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFza1tdIGdldFRhc2tzKCkgeworICAgICAgICBMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbi5zaXplKCkpOworICAgICAgICBJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICAgICAgdGFza3MuYWRkKG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoVGFza1tdKSB0YXNrcy50b0FycmF5KG5ldyBUYXNrW3Rhc2tzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBkZXBlbmRlbmN5IHRvIHRoaXMgdGFyZ2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGRlcGVuZGVuY3kgVGhlIG5hbWUgb2YgYSB0YXJnZXQgdGhpcyB0YXJnZXQgaXMgZGVwZW5kZW50IG9uLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERlcGVuZGVuY3koU3RyaW5nIGRlcGVuZGVuY3kpIHsKKyAgICAgICAgaWYgKGRlcGVuZGVuY2llcyA9PSBudWxsKSB7CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0KDIpOworICAgICAgICB9CisgICAgICAgIGRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgdGFyZ2V0LgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgdGFyZ2V0CisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldERlcGVuZGVuY2llcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zCisgICAgICAgICAgICAgICAgLmVudW1lcmF0aW9uKGRlcGVuZGVuY2llcyA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IGRlcGVuZGVuY2llcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGlzIHRhcmdldCBkZXBlbmQgb24gdGhlIG5hbWVkIHRhcmdldD8KKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIG5hbWVkIHRhcmdldC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBkb2VzIGRlcGVuZCBvbiB0aGUgbmFtZWQgdGFyZ2V0CisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkZXBlbmRzT24oU3RyaW5nIG90aGVyKSB7CisgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgSGFzaHRhYmxlIHQgPSBwID09IG51bGwgPyBudWxsIDogcC5nZXRUYXJnZXRzKCk7CisgICAgICAgIHJldHVybiBwICE9IG51bGwgJiYgcC50b3BvU29ydChnZXROYW1lKCksIHQsIGZhbHNlKS5jb250YWlucyh0LmdldChvdGhlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlICJpZiIgY29uZGl0aW9uIHRvIHRlc3Qgb24gZXhlY3V0aW9uLiBUaGlzIGlzIHRoZQorICAgICAqIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byB0ZXN0IGZvciBleGlzdGVuY2UgLSBpZiB0aGUgcHJvcGVydHkKKyAgICAgKiBpcyBub3Qgc2V0LCB0aGUgdGFzayB3aWxsIG5vdCBleGVjdXRlLiBUaGUgcHJvcGVydHkgZ29lcworICAgICAqIHRocm91Z2ggcHJvcGVydHkgc3Vic3RpdHV0aW9uIG9uY2UgYmVmb3JlIHRlc3RpbmcsIHNvIGlmCisgICAgICogcHJvcGVydHkgPGNvZGU+Zm9vPC9jb2RlPiBoYXMgdmFsdWUgPGNvZGU+YmFyPC9jb2RlPiwgc2V0dGluZworICAgICAqIHRoZSAiaWYiIGNvbmRpdGlvbiB0byA8Y29kZT4ke2Zvb31feDwvY29kZT4gd2lsbCBtZWFuIHRoYXQgdGhlCisgICAgICogdGFzayB3aWxsIG9ubHkgZXhlY3V0ZSBpZiBwcm9wZXJ0eSA8Y29kZT5iYXJfeDwvY29kZT4gaXMgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBjb25kaXRpb24gdG8gdGVzdCBvbiBleGVjdXRpb24uCisgICAgICogICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZQorICAgICAqICAgICAgICAgICAgICAgICBubyAiaWYiIHRlc3QgaXMgcGVyZm9ybWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElmKFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBpZkNvbmRpdGlvbiA9IHByb3BlcnR5ID09IG51bGwgPyAiIiA6IHByb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlICJpZiIgcHJvcGVydHkgY29uZGl0aW9uIG9mIHRoaXMgdGFyZ2V0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgImlmIiBwcm9wZXJ0eSBjb25kaXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KKyAgICAgKiAgICAgICAgICJpZiIgY29uZGl0aW9uIGhhZCBiZWVuIGRlZmluZWQuCisgICAgICogQHNpbmNlIDEuNi4yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZigpIHsKKyAgICAgICAgcmV0dXJuICIiLmVxdWFscyhpZkNvbmRpdGlvbikgPyBudWxsIDogaWZDb25kaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgInVubGVzcyIgY29uZGl0aW9uIHRvIHRlc3Qgb24gZXhlY3V0aW9uLiBUaGlzIGlzIHRoZQorICAgICAqIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byB0ZXN0IGZvciBleGlzdGVuY2UgLSBpZiB0aGUgcHJvcGVydHkKKyAgICAgKiBpcyBzZXQsIHRoZSB0YXNrIHdpbGwgbm90IGV4ZWN1dGUuIFRoZSBwcm9wZXJ0eSBnb2VzCisgICAgICogdGhyb3VnaCBwcm9wZXJ0eSBzdWJzdGl0dXRpb24gb25jZSBiZWZvcmUgdGVzdGluZywgc28gaWYKKyAgICAgKiBwcm9wZXJ0eSA8Y29kZT5mb288L2NvZGU+IGhhcyB2YWx1ZSA8Y29kZT5iYXI8L2NvZGU+LCBzZXR0aW5nCisgICAgICogdGhlICJ1bmxlc3MiIGNvbmRpdGlvbiB0byA8Y29kZT4ke2Zvb31feDwvY29kZT4gd2lsbCBtZWFuIHRoYXQgdGhlCisgICAgICogdGFzayB3aWxsIG9ubHkgZXhlY3V0ZSBpZiBwcm9wZXJ0eSA8Y29kZT5iYXJfeDwvY29kZT4gaXNuJ3Qgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBjb25kaXRpb24gdG8gdGVzdCBvbiBleGVjdXRpb24uCisgICAgICogICAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZQorICAgICAqICAgICAgICAgICAgICAgICBubyAidW5sZXNzIiB0ZXN0IGlzIHBlcmZvcm1lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHVubGVzc0NvbmRpdGlvbiA9IHByb3BlcnR5ID09IG51bGwgPyAiIiA6IHByb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlICJ1bmxlc3MiIHByb3BlcnR5IGNvbmRpdGlvbiBvZiB0aGlzIHRhcmdldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlICJ1bmxlc3MiIHByb3BlcnR5IGNvbmRpdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgaWYgbm8gInVubGVzcyIgY29uZGl0aW9uIGhhZCBiZWVuIGRlZmluZWQuCisgICAgICogQHNpbmNlIDEuNi4yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVbmxlc3MoKSB7CisgICAgICAgIHJldHVybiAiIi5lcXVhbHModW5sZXNzQ29uZGl0aW9uKSA/IG51bGwgOiB1bmxlc3NDb25kaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIHRhcmdldC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LCBpbmRpY2F0aW5nIHRoYXQgbm8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gaXMgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHRhcmdldCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KKyAgICAgKiAgICAgICAgIGRlc2NyaXB0aW9uIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHRhcmdldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0YXJnZXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICAgICAqICAgICAgICAgbmFtZSBoYXMgbm90IGJlZW4gc2V0IHlldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFyZ2V0IGlmIHRoZSAiaWYiIGFuZCAidW5sZXNzIiBjb25kaXRpb25zIGFyZQorICAgICAqIHNhdGlzZmllZC4gRGVwZW5kZW5jeSBjaGVja2luZyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyB0aGlzCisgICAgICogbWV0aG9kLCBhcyBpdCBkb2VzIG5vIGNoZWNraW5nIG9mIGl0cyBvd24uIElmIGVpdGhlciB0aGUgImlmIgorICAgICAqIG9yICJ1bmxlc3MiIHRlc3QgcHJldmVudHMgdGhpcyB0YXJnZXQgZnJvbSBiZWluZyBleGVjdXRlZCwgYSB2ZXJib3NlCisgICAgICogbWVzc2FnZSBpcyBsb2dnZWQgZ2l2aW5nIHRoZSByZWFzb24uIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgY2xpZW50cworICAgICAqIG9mIHRoaXMgY2xhc3MgY2FsbCBwZXJmb3JtVGFza3MgcmF0aGVyIHRoYW4gdGhpcyBtZXRob2Qgc28gdGhhdAorICAgICAqIGFwcHJvcHJpYXRlIGJ1aWxkIGV2ZW50cyBhcmUgZmlyZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgdGFza3MgZmFpbCBvciBpZiBhIGRhdGEgdHlwZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmYWlscy4KKyAgICAgKgorICAgICAqIEBzZWUgI3BlcmZvcm1UYXNrcygpCisgICAgICogQHNlZSAjc2V0SWYoU3RyaW5nKQorICAgICAqIEBzZWUgI3NldFVubGVzcyhTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0ZXN0SWZDb25kaXRpb24oKSAmJiB0ZXN0VW5sZXNzQ29uZGl0aW9uKCkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHRhc2tQb3NpdGlvbiA9IDA7IHRhc2tQb3NpdGlvbiA8IGNoaWxkcmVuLnNpemUoKTsgKyt0YXNrUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGNoaWxkcmVuLmdldCh0YXNrUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFzaykgeworICAgICAgICAgICAgICAgICAgICBUYXNrIHRhc2sgPSAoVGFzaykgbzsKKyAgICAgICAgICAgICAgICAgICAgdGFzay5wZXJmb3JtKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKChSdW50aW1lQ29uZmlndXJhYmxlKSBvKS5tYXliZUNvbmZpZ3VyZShwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXRlc3RJZkNvbmRpdGlvbigpKSB7CisgICAgICAgICAgICBwcm9qZWN0LmxvZyh0aGlzLCAiU2tpcHBlZCBiZWNhdXNlIHByb3BlcnR5ICciICsgcHJvamVjdC5yZXBsYWNlUHJvcGVydGllcyhpZkNvbmRpdGlvbikKKyAgICAgICAgICAgICAgICAgICAgKyAiJyBub3Qgc2V0LiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvamVjdC5sb2codGhpcywgIlNraXBwZWQgYmVjYXVzZSBwcm9wZXJ0eSAnIgorICAgICAgICAgICAgICAgICAgICArIHByb2plY3QucmVwbGFjZVByb3BlcnRpZXModW5sZXNzQ29uZGl0aW9uKSArICInIHNldC4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSB0YXNrcyB3aXRoaW4gdGhpcyB0YXJnZXQgKGlmIHRoZSBjb25kaXRpb25zIGFyZSBtZXQpLAorICAgICAqIGZpcmluZyB0YXJnZXQgc3RhcnRlZC90YXJnZXQgZmluaXNoZWQgbWVzc2FnZXMgYXJvdW5kIGEgY2FsbCB0bworICAgICAqIGV4ZWN1dGUuCisgICAgICoKKyAgICAgKiBAc2VlICNleGVjdXRlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBwZXJmb3JtVGFza3MoKSB7CisgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gdGhyb3duID0gbnVsbDsKKyAgICAgICAgcHJvamVjdC5maXJlVGFyZ2V0U3RhcnRlZCh0aGlzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIHRocm93biA9IGV4YzsKKyAgICAgICAgICAgIHRocm93IGV4YzsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb2plY3QuZmlyZVRhcmdldEZpbmlzaGVkKHRoaXMsIHRocm93bik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIGdpdmVuIHRhc2sgaW4gdGhlIGxpc3QKKyAgICAgKiBvZiBjaGlsZHJlbiB3aXRoIHRoZSByZXBsYWNlbWVudCBkYXRhIHR5cGUgd3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbCBUaGUgdGFzayB0byByZXBsYWNlLgorICAgICAqICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbyAgVGhlIGRhdGEgdHlwZSB3cmFwcGVyIHRvIHJlcGxhY2UgPGNvZGU+ZWw8L2NvZGU+IHdpdGguCisgICAgICovCisgICAgdm9pZCByZXBsYWNlQ2hpbGQoVGFzayBlbCwgUnVudGltZUNvbmZpZ3VyYWJsZSBvKSB7CisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgd2hpbGUgKChpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZWwpKSA+PSAwKSB7CisgICAgICAgICAgICBjaGlsZHJlbi5zZXQoaW5kZXgsIG8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiB0YXNrIGluIHRoZSBsaXN0CisgICAgICogb2YgY2hpbGRyZW4gd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGFzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbCBUaGUgdGFzayB0byByZXBsYWNlLgorICAgICAqICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbyAgVGhlIHRhc2sgdG8gcmVwbGFjZSA8Y29kZT5lbDwvY29kZT4gd2l0aC4KKyAgICAgKi8KKyAgICB2b2lkIHJlcGxhY2VDaGlsZChUYXNrIGVsLCBUYXNrIG8pIHsKKyAgICAgICAgaW50IGluZGV4OworICAgICAgICB3aGlsZSAoKGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbCkpID49IDApIHsKKyAgICAgICAgICAgIGNoaWxkcmVuLnNldChpbmRleCwgbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgImlmIiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgImlmIiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLiBJZiBubworICAgICAqICAgICAgICAgY29uZGl0aW9uIChvciBhbiBlbXB0eSBjb25kaXRpb24pIGhhcyBiZWVuIHNldCwKKyAgICAgKiAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHNlZSAjc2V0SWYoU3RyaW5nKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0SWZDb25kaXRpb24oKSB7CisgICAgICAgIGlmICgiIi5lcXVhbHMoaWZDb25kaXRpb24pKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdGVzdCA9IHByb2plY3QucmVwbGFjZVByb3BlcnRpZXMoaWZDb25kaXRpb24pOworICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRQcm9wZXJ0eSh0ZXN0KSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IHRoZSAidW5sZXNzIiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgInVubGVzcyIgY29uZGl0aW9uIGlzIHNhdGlzZmllZC4gSWYgbm8KKyAgICAgKiAgICAgICAgIGNvbmRpdGlvbiAob3IgYW4gZW1wdHkgY29uZGl0aW9uKSBoYXMgYmVlbiBzZXQsCisgICAgICogICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFVubGVzcyhTdHJpbmcpCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHRlc3RVbmxlc3NDb25kaXRpb24oKSB7CisgICAgICAgIGlmICgiIi5lcXVhbHModW5sZXNzQ29uZGl0aW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHRlc3QgPSBwcm9qZWN0LnJlcGxhY2VQcm9wZXJ0aWVzKHVubGVzc0NvbmRpdGlvbik7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnR5KHRlc3QpID09IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MjU0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrLmphdmEKQEAgLTAsMCArMSw0ODIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmRpc3BhdGNoLkRpc3BhdGNoVXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgdGFza3MuCisgKgorICogVXNlIFByb2plY3QuY3JlYXRlVGFzayB0byBjcmVhdGUgYSBuZXcgdGFzayBpbnN0YW5jZSByYXRoZXIgdGhhbgorICogdXNpbmcgdGhpcyBjbGFzcyBkaXJlY3RseSBmb3IgY29uc3RydWN0aW9uLgorICoKKyAqIEBzZWUgUHJvamVjdCNjcmVhdGVUYXNrCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYXNrIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiBUYXJnZXQgdGhpcyB0YXNrIGJlbG9uZ3MgdG8sIGlmIGFueS4KKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KKyAgICAgKiAgICAgICAgICAgICBZb3Ugc2hvdWxkIG5vdCBiZSBhY2Nlc3NpbmcgdGhpcyB2YXJpYWJsZSBkaXJlY3RseS4KKyAgICAgKiAgICAgICAgICAgICBQbGVhc2UgdXNlIHRoZSB7QGxpbmsgI2dldE93bmluZ1RhcmdldCgpfSBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFRhcmdldCB0YXJnZXQ7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoaXMgdGFzayB0byBiZSB1c2VkIGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICAgICAqIFRoaXMgZGVmYXVsdHMgdG8gdGhlIHNhbWUgYXMgdGhlIHR5cGUsIGJ1dCBtYXkgYmUKKyAgICAgKiBvdmVycmlkZGVuIGJ5IHRoZSB1c2VyLiBGb3IgaW5zdGFuY2UsIHRoZSBuYW1lICJqYXZhIgorICAgICAqIGlzbid0IHRlcnJpYmx5IGRlc2NyaXB0aXZlIGZvciBhIHRhc2sgdXNlZCB3aXRoaW4KKyAgICAgKiBhbm90aGVyIHRhc2sgLSB0aGUgb3V0ZXIgdGFzayBjb2RlIGNhbiBwcm9iYWJseQorICAgICAqIHByb3ZpZGUgYSBiZXR0ZXIgb25lLgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgorICAgICAqICAgICAgICAgICAgIFlvdSBzaG91bGQgbm90IGJlIGFjY2Vzc2luZyB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5LgorICAgICAqICAgICAgICAgICAgIFBsZWFzZSB1c2UgdGhlIHtAbGluayAjZ2V0VGFza05hbWUoKX0gbWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdGFza05hbWU7CisKKyAgICAvKioKKyAgICAgKiBUeXBlIG9mIHRoaXMgdGFzay4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgorICAgICAqICAgICAgICAgICAgIFlvdSBzaG91bGQgbm90IGJlIGFjY2Vzc2luZyB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5LgorICAgICAqICAgICAgICAgICAgIFBsZWFzZSB1c2UgdGhlIHtAbGluayAjZ2V0VGFza1R5cGUoKX0gbWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdGFza1R5cGU7CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGZvciB0aGlzIG9iamVjdCwgdXNlZCB0byBjb25maWd1cmUgaXQgYXQgcnVudGltZS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgorICAgICAqICAgICAgICAgICAgIFlvdSBzaG91bGQgbm90IGJlIGFjY2Vzc2luZyB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5LgorICAgICAqICAgICAgICAgICAgIFBsZWFzZSB1c2UgdGhlIHtAbGluayAjZ2V0V3JhcHBlcigpfSBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJ1bnRpbWVDb25maWd1cmFibGUgd3JhcHBlcjsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIHRhc2sgaXMgaW52YWxpZC4gQSB0YXNrIGJlY29tZXMgaW52YWxpZAorICAgICAqIGlmIGEgY29uZmxpY3RpbmcgY2xhc3MgaXMgc3BlY2lmaWVkIGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IKKyAgICAgKiBpdHMgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW52YWxpZDsKKworICAgIC8qKiBTb2xlIGNvbnN0cnVjdG9yLiAqLworICAgIHB1YmxpYyBUYXNrKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBjb250YWluZXIgb2YgdGhpcyB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUYXJnZXQgaW4gd2hvc2Ugc2NvcGUgdGhpcyB0YXNrIGJlbG9uZ3MuCisgICAgICogICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluZGljYXRpbmcgYSB0b3AtbGV2ZWwgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPd25pbmdUYXJnZXQoVGFyZ2V0IHRhcmdldCkgeworICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb250YWluZXIgdGFyZ2V0IG9mIHRoaXMgdGFzay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRhcmdldCBjb250YWluaW5nIHRoaXMgdGFzaywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiAgICAgICAgIHRoaXMgdGFzayBpcyBhIHRvcC1sZXZlbCB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyBUYXJnZXQgZ2V0T3duaW5nVGFyZ2V0KCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgdG8gdXNlIGluIGxvZ2dpbmcgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byB1c2UgaW4gbG9nZ2luZyBtZXNzYWdlcy4KKyAgICAgKiAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMudGFza05hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgdG8gdXNlIGluIGxvZ2dpbmcgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIHRvIHVzZSBpbiBsb2dnaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFza05hbWUoKSB7CisgICAgICAgIHJldHVybiB0YXNrTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIHdpdGggd2hpY2ggdGhlIHRhc2sgaGFzIGJlZW4gaW52b2tlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuYW1lIHRoZSB0YXNrIGhhcyBiZWVuIGludm9rZWQgYXMuCisgICAgICogICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXNrVHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnRhc2tUeXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHByb2plY3QgdG8gbGV0IHRoZSB0YXNrIGluaXRpYWxpemUgcHJvcGVybHkuCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYSBuby1vcC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHByb2plY3QgdG8gbGV0IHRoZSB0YXNrIGRvIGl0cyB3b3JrLiBUaGlzIG1ldGhvZCBtYXkgYmUKKyAgICAgKiBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIGlmIHRoZSB0YXNrIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UuCisgICAgICogRm9yIGV4YW1wbGUsCisgICAgICogaWYgdGFyZ2V0MSBhbmQgdGFyZ2V0MiBib3RoIGRlcGVuZCBvbiB0YXJnZXQzLCB0aGVuIHJ1bm5pbmcKKyAgICAgKiAiYW50IHRhcmdldDEgdGFyZ2V0MiIgd2lsbCBydW4gYWxsIHRhc2tzIGluIHRhcmdldDMgdHdpY2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHdyYXBwZXIgdXNlZCBmb3IgcnVudGltZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgd3JhcHBlciB1c2VkIGZvciBydW50aW1lIGNvbmZpZ3VyYXRpb24uIFRoaXMKKyAgICAgKiAgICAgICAgIG1ldGhvZCB3aWxsIGdlbmVyYXRlIGEgbmV3IHdyYXBwZXIgKGFuZCBjYWNoZSBpdCkKKyAgICAgKiAgICAgICAgIGlmIG9uZSBpc24ndCBzZXQgYWxyZWFkeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVudGltZUNvbmZpZ3VyYWJsZSBnZXRSdW50aW1lQ29uZmlndXJhYmxlV3JhcHBlcigpIHsKKyAgICAgICAgaWYgKHdyYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JhcHBlciA9IG5ldyBSdW50aW1lQ29uZmlndXJhYmxlKHRoaXMsIGdldFRhc2tOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3cmFwcGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdyYXBwZXIgdG8gYmUgdXNlZCBmb3IgcnVudGltZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBieSB0aGUgUHJvamVjdEhlbHBlciBhbmQgQW50IGludGVybmFscy4KKyAgICAgKiBJdCBpcyBwdWJsaWMgdG8gYWxsb3cgaGVscGVyIHBsdWdpbnMgdG8gb3BlcmF0ZSBvbiB0YXNrcywgbm9ybWFsIHRhc2tzCisgICAgICogc2hvdWxkIG5ldmVyIHVzZSBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGJlIHVzZWQgZm9yIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHdoaWNoIGNhc2UgdGhlIG5leHQgY2FsbAorICAgICAqICAgICAgICAgICAgICAgIHRvIGdldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyIHdpbGwgZ2VuZXJhdGUgYSBuZXcKKyAgICAgKiAgICAgICAgICAgICAgICB3cmFwcGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyKFJ1bnRpbWVDb25maWd1cmFibGUgd3JhcHBlcikgeworICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgIH0KKworICAgIC8vIFhYWDogKEpvbiBTa2VldCkgVGhlIGNvbW1lbnQgImlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSIgbWF5CisgICAgLy8gbm90IGJlIHN0cmljdGx5IHRydWUuIHdyYXBwZXIubWF5YmVDb25maWd1cmUoKSB3b24ndCBjb25maWd1cmUgdGhlIHNhbWUKKyAgICAvLyBhdHRyaWJ1dGVzL3RleHQgbW9yZSB0aGFuIG9uY2UsIGJ1dCBpdCBtYXkgd2VsbCBhZGQgdGhlIGNoaWxkcmVuIGFnYWluLAorICAgIC8vIHVubGVzcyBJJ3ZlIG1pc3NlZCBzb21ldGhpbmcuCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGlzIHRhc2sgLSBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHkuCisgICAgICogSWYgdGhlIHRhc2sgaGFzIGJlZW4gaW52YWxpZGF0ZWQsIGl0IGlzIHJlcGxhY2VkIHdpdGggYW4KKyAgICAgKiBVbmtub3duRWxlbWVudCB0YXNrIHdoaWNoIHVzZXMgdGhlIG5ldyBkZWZpbml0aW9uIGluIHRoZSBwcm9qZWN0LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgdGFzayBjYW5ub3QgYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtYXliZUNvbmZpZ3VyZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyYXBwZXIubWF5YmVDb25maWd1cmUoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldFJlcGxhY2VtZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSB0aGUgdGFzayB0byBiZSByZWNvbmZpZ3VyZWQgZnJvbSBpdHMgUnVudGltZUNvbmZpZ3VyYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWNvbmZpZ3VyZSgpIHsKKyAgICAgICAgaWYgKHdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JhcHBlci5yZWNvbmZpZ3VyZShnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlcyBvdXRwdXQgYnkgbG9nZ2luZyBpdCB3aXRoIHRoZSBJTkZPIHByaW9yaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHRvIGxvZy4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPdXRwdXQoU3RyaW5nIG91dHB1dCkgeworICAgICAgICBsb2cob3V0cHV0LCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIG91dHB1dCBieSBsb2dnaW5nIGl0IHdpdGggdGhlIElORk8gcHJpb3JpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUZsdXNoKFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaGFuZGxlT3V0cHV0KG91dHB1dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlIGFuIGlucHV0IHJlcXVlc3QgYnkgdGhpcyB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIGludG8gd2hpY2ggZGF0YSBpcyB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgYXQgd2hpY2ggZGF0YSBpcyBzdG9yZWQuCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgZGF0YSBjYW5ub3QgYmUgcmVhZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgaGFuZGxlSW5wdXQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2plY3QoKS5kZWZhdWx0SW5wdXQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlcyBhbiBlcnJvciBvdXRwdXQgYnkgbG9nZ2luZyBpdCB3aXRoIHRoZSBXQVJOIHByaW9yaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGUgZXJyb3Igb3V0cHV0IHRvIGxvZy4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFcnJvck91dHB1dChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGxvZyhvdXRwdXQsIFByb2plY3QuTVNHX1dBUk4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgYW4gZXJyb3IgbGluZSBieSBsb2dnaW5nIGl0IHdpdGggdGhlIFdBUk4gcHJpb3JpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBlcnJvciBvdXRwdXQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yRmx1c2goU3RyaW5nIG91dHB1dCkgeworICAgICAgICBoYW5kbGVFcnJvck91dHB1dChvdXRwdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZ3MgYSBtZXNzYWdlIHdpdGggdGhlIGRlZmF1bHQgKElORk8pIHByaW9yaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gcHJpb3JpdHkuIFRoaXMgZGVsZWdhdGVzCisgICAgICogdGhlIGFjdHVhbCBsb2dnaW5nIHRvIHRoZSBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIG1zZ0xldmVsIFRoZSBtZXNzYWdlIHByaW9yaXR5IGF0IHdoaWNoIHRoaXMgbWVzc2FnZSBpcyB0bworICAgICAqICAgICAgICAgICAgICAgICBiZSBsb2dnZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2csIGludCBtc2dMZXZlbCkgeworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2codGhpcywgbXNnLCBtc2dMZXZlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5sb2cobXNnLCBtc2dMZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBwcmlvcml0eS4gVGhpcyBkZWxlZ2F0ZXMKKyAgICAgKiB0aGUgYWN0dWFsIGxvZ2dpbmcgdG8gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCBUaGUgZXhjZXB0aW9uIHRvIGJlIGxvZ2dlZC4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbXNnTGV2ZWwgVGhlIG1lc3NhZ2UgcHJpb3JpdHkgYXQgd2hpY2ggdGhpcyBtZXNzYWdlIGlzIHRvCisgICAgICogICAgICAgICAgICAgICAgIGJlIGxvZ2dlZC4KKyAgICAgKiBAc2luY2UgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nKFRocm93YWJsZSB0LCBpbnQgbXNnTGV2ZWwpIHsKKyAgICAgICAgaWYgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKHQuZ2V0TWVzc2FnZSgpLCB0LCBtc2dMZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBwcmlvcml0eS4gVGhpcyBkZWxlZ2F0ZXMKKyAgICAgKiB0aGUgYWN0dWFsIGxvZ2dpbmcgdG8gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdCBUaGUgZXhjZXB0aW9uIHRvIGJlIGxvZ2dlZC4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtc2dMZXZlbCBUaGUgbWVzc2FnZSBwcmlvcml0eSBhdCB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgYmUgbG9nZ2VkLgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZywgVGhyb3dhYmxlIHQsIGludCBtc2dMZXZlbCkgeworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2codGhpcywgbXNnLCB0LCBtc2dMZXZlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5sb2cobXNnLCBtc2dMZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGlzIHRhc2sgaWYgaXQncyBzdGlsbCB2YWxpZCwgb3IgZ2V0cyBhIHJlcGxhY2VtZW50CisgICAgICogdmVyc2lvbiBhbmQgcGVyZm9ybXMgdGhhdCBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBQZXJmb3JtaW5nIGEgdGFzayBjb25zaXN0cyBvZiBmaXJpbmcgYSB0YXNrIHN0YXJ0ZWQgZXZlbnQsCisgICAgICogY29uZmlndXJpbmcgdGhlIHRhc2ssIGV4ZWN1dGluZyBpdCwgYW5kIHRoZW4gZmlyaW5nIHRhc2sgZmluaXNoZWQKKyAgICAgKiBldmVudC4gSWYgYSBydW50aW1lIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZSB0YXNrIGZpbmlzaGVkIGV2ZW50CisgICAgICogaXMgc3RpbGwgZmlyZWQsIGJ1dCB3aXRoIHRoZSBleGNlcHRpb24gYXMgdGhlIGNhdXNlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm0oKSB7CisgICAgICAgIGlmICghaW52YWxpZCkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmZpcmVUYXNrU3RhcnRlZCh0aGlzKTsKKyAgICAgICAgICAgIFRocm93YWJsZSByZWFzb24gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYXliZUNvbmZpZ3VyZSgpOworICAgICAgICAgICAgICAgIERpc3BhdGNoVXRpbHMuZXhlY3V0ZSh0aGlzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGV4LmdldExvY2F0aW9uKCkgPT0gTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTikgeworICAgICAgICAgICAgICAgICAgICBleC5zZXRMb2NhdGlvbihnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVhc29uID0gZXg7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gPSBleDsKKyAgICAgICAgICAgICAgICBCdWlsZEV4Y2VwdGlvbiBiZSA9IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgYmUuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgYmU7CisgICAgICAgICAgICB9IGNhdGNoIChFcnJvciBleCkgeworICAgICAgICAgICAgICAgIHJlYXNvbiA9IGV4OworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZmlyZVRhc2tGaW5pc2hlZCh0aGlzLCByZWFzb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgdWUgPSBnZXRSZXBsYWNlbWVudCgpOworICAgICAgICAgICAgVGFzayB0YXNrID0gdWUuZ2V0VGFzaygpOworICAgICAgICAgICAgdGFzay5wZXJmb3JtKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGlzIHRhc2sgYXMgaW52YWxpZC4gQW55IGZ1cnRoZXIgdXNlIG9mIHRoaXMgdGFzaworICAgICAqIHdpbGwgZ28gdGhyb3VnaCBhIHJlcGxhY2VtZW50IHdpdGggdGhlIHVwZGF0ZWQgZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBmaW5hbCB2b2lkIG1hcmtJbnZhbGlkKCkgeworICAgICAgICBpbnZhbGlkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyB0YXNrIGJlZW4gbWFya2VkIGludmFsaWQ/CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0YXNrIGlzIG5vIGxvbmdlciB2YWxpZC4gQSBuZXcgdGFzayBzaG91bGQgYmUKKyAgICAgKiBjb25maWd1cmVkIGluIHRoaXMgY2FzZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNJbnZhbGlkKCkgeworICAgICAgICByZXR1cm4gaW52YWxpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlbWVudCBlbGVtZW50IHVzZWQgaWYgdGhpcyB0YXNrIGlzIGludmFsaWRhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgVW5rbm93bkVsZW1lbnQgcmVwbGFjZW1lbnQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIFVua25vd25FbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGlzIHRhc2suCisgICAgICogT25jZSB0aGlzIGhhcyBiZWVuIGNyZWF0ZWQgb25jZSwgaXQgaXMgY2FjaGVkIGFuZCByZXR1cm5lZCBieQorICAgICAqIGZ1dHVyZSBjYWxscy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIFVua25vd25FbGVtZW50IGluc3RhbmNlIGZvciB0aGUgbmV3IGRlZmluaXRpb24gb2YgdGhpcyB0YXNrLgorICAgICAqLworICAgIHByaXZhdGUgVW5rbm93bkVsZW1lbnQgZ2V0UmVwbGFjZW1lbnQoKSB7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXBsYWNlbWVudCA9IG5ldyBVbmtub3duRWxlbWVudCh0YXNrVHlwZSk7CisgICAgICAgICAgICByZXBsYWNlbWVudC5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgICAgICByZXBsYWNlbWVudC5zZXRUYXNrVHlwZSh0YXNrVHlwZSk7CisgICAgICAgICAgICByZXBsYWNlbWVudC5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7CisgICAgICAgICAgICByZXBsYWNlbWVudC5zZXRMb2NhdGlvbihsb2NhdGlvbik7CisgICAgICAgICAgICByZXBsYWNlbWVudC5zZXRPd25pbmdUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgICAgIHJlcGxhY2VtZW50LnNldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyKHdyYXBwZXIpOworICAgICAgICAgICAgd3JhcHBlci5zZXRQcm94eShyZXBsYWNlbWVudCk7CisgICAgICAgICAgICByZXBsYWNlQ2hpbGRyZW4od3JhcHBlciwgcmVwbGFjZW1lbnQpOworICAgICAgICAgICAgdGFyZ2V0LnJlcGxhY2VDaGlsZCh0aGlzLCByZXBsYWNlbWVudCk7CisgICAgICAgICAgICByZXBsYWNlbWVudC5tYXliZUNvbmZpZ3VyZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN1cnNpdmVseSBhZGRzIGFuIFVua25vd25FbGVtZW50IGluc3RhbmNlIGZvciBlYWNoIGNoaWxkCisgICAgICogZWxlbWVudCBvZiByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41LjEKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZUNoaWxkcmVuKFJ1bnRpbWVDb25maWd1cmFibGUgd3JhcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25FbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHdyYXBwZXIuZ2V0Q2hpbGRyZW4oKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgY2hpbGRXcmFwcGVyID0KKyAgICAgICAgICAgICAgICAoUnVudGltZUNvbmZpZ3VyYWJsZSkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgY2hpbGRFbGVtZW50ID0KKyAgICAgICAgICAgICAgICBuZXcgVW5rbm93bkVsZW1lbnQoY2hpbGRXcmFwcGVyLmdldEVsZW1lbnRUYWcoKSk7CisgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmFkZENoaWxkKGNoaWxkRWxlbWVudCk7CisgICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyKGNoaWxkV3JhcHBlcik7CisgICAgICAgICAgICBjaGlsZFdyYXBwZXIuc2V0UHJveHkoY2hpbGRFbGVtZW50KTsKKyAgICAgICAgICAgIHJlcGxhY2VDaGlsZHJlbihjaGlsZFdyYXBwZXIsIGNoaWxkRWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGFzay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhc2tUeXBlKCkgeworICAgICAgICByZXR1cm4gdGFza1R5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBydW50aW1lIGNvbmZpZ3VyYWJsZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgdGFzay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgc3RydWN0dXJlIGZvciB0aGlzIHRhc2suCisgICAgICovCisgICAgcHJvdGVjdGVkIFJ1bnRpbWVDb25maWd1cmFibGUgZ2V0V3JhcHBlcigpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZCBhIHRhc2sgdG8gYW5vdGhlcjsgdXNlIHRoaXMgd2hlbiBjb25maWd1cmluZyBhIG5ld2x5IGNyZWF0ZWQKKyAgICAgKiB0YXNrIHRvIGRvIHdvcmsgb24gYmVoYWxmIG9mIGFub3RoZXIuCisgICAgICogUHJvamVjdCwgT3duaW5nVGFyZ2V0LCBUYXNrTmFtZSwgTG9jYXRpb24gYW5kIERlc2NyaXB0aW9uIGFyZSBhbGwgY29waWVkCisgICAgICoKKyAgICAgKiBJbXBvcnRhbnQ6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNhbGwge0BsaW5rIFRhc2sjaW5pdCgpfS4KKyAgICAgKiBJZiB5b3UgYXJlIGNyZWF0aW5nIGEgdGFzayB0byBkZWxlZ2F0ZSB3b3JrIHRvLCBjYWxsIHtAbGluayBUYXNrI2luaXQoKX0KKyAgICAgKiB0byBpbml0aWFsaXplIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyIG93bmluZyB0YXJnZXQKKyAgICAgKiBAc2luY2UgQW50MS43CisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgYmluZFRvT3duZXIoVGFzayBvd25lcikgeworICAgICAgICBzZXRQcm9qZWN0KG93bmVyLmdldFByb2plY3QoKSk7CisgICAgICAgIHNldE93bmluZ1RhcmdldChvd25lci5nZXRPd25pbmdUYXJnZXQoKSk7CisgICAgICAgIHNldFRhc2tOYW1lKG93bmVyLmdldFRhc2tOYW1lKCkpOworICAgICAgICBzZXREZXNjcmlwdGlvbihvd25lci5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgc2V0TG9jYXRpb24ob3duZXIuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIHNldFRhc2tUeXBlKG93bmVyLmdldFRhc2tUeXBlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tBZGFwdGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3M2Q0MzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZGlzcGF0Y2guRGlzcGF0Y2hhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmRpc3BhdGNoLkRpc3BhdGNoVXRpbHM7CisKKy8qKgorICogVXNlcyBpbnRyb3NwZWN0aW9uIHRvICJhZGFwdCIgYW4gYXJiaXRyYXJ5IEJlYW4gd2hpY2ggZG9lc24ndAorICogaXRzZWxmIGV4dGVuZCBUYXNrLCBidXQgc3RpbGwgY29udGFpbnMgYW4gZXhlY3V0ZSBtZXRob2QgYW5kIG9wdGlvbmFsbHkKKyAqIGEgc2V0UHJvamVjdCBtZXRob2QuCisgKgorICovCitwdWJsaWMgY2xhc3MgVGFza0FkYXB0ZXIgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgVHlwZUFkYXB0ZXIgeworCisgICAgLyoqIE9iamVjdCB0byBhY3QgYXMgYSBwcm94eSBmb3IuICovCisgICAgcHJpdmF0ZSBPYmplY3QgcHJveHk7CisKKyAgICAvKioKKyAgICAgKiBOby1hcmcgY29uc3RydWN0b3IgZm9yIHJlZmxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFRhc2tBZGFwdGVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBnaXZlbiBwcm94eS4KKyAgICAgKiBTbyB5b3UgY291bGQgd3JpdGUgZWFzaWVyIGNvZGUKKyAgICAgKiA8cHJlPgorICAgICAqIG15VGFza0NvbnRhaW5lci5hZGRUYXNrKCBuZXcgVGFza0FkYXB0ZXIobXlQcm94eSkgKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm94eSBUaGUgb2JqZWN0IHdoaWNoIEFudCBzaG91bGQgdXNlIGFzIHRhc2suCisgICAgICovCisgICAgcHVibGljIFRhc2tBZGFwdGVyKE9iamVjdCBwcm94eSkgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIHNldFByb3h5KHByb3h5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgYSBjbGFzcyBpcyBzdWl0YWJsZSB0byBiZSBhZGFwdGVkIGJ5IFRhc2tBZGFwdGVyLgorICAgICAqIElmIHRoZSBjbGFzcyBpcyBvZiB0eXBlIERpc3BhdGNoYWJsZSwgdGhlIGNoZWNrIGlzIG5vdCBwZXJmb3JtZWQgYmVjYXVzZQorICAgICAqIHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdpbGwgYmUgZGV0ZXJtaW5lZCBvbmx5IGF0IHJ1bnRpbWUgb2YKKyAgICAgKiB0aGUgYWN0dWFsIHRhc2sgYW5kIG5vdCBkdXJpbmcgcGFyc2UgdGltZS4KKyAgICAgKgorICAgICAqIFRoaXMgb25seSBjaGVja3MgY29uZGl0aW9ucyB3aGljaCBhcmUgYWRkaXRpb25hbGx5IHJlcXVpcmVkIGZvcgorICAgICAqIHRhc2tzIGFkYXB0ZWQgYnkgVGFza0FkYXB0ZXIuIFRodXMsIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkKKyAgICAgKiBQcm9qZWN0LmNoZWNrVGFza0NsYXNzLgorICAgICAqCisgICAgICogVGhyb3dzIGEgQnVpbGRFeGNlcHRpb24gYW5kIGxvZ3MgYXMgUHJvamVjdC5NU0dfRVJSIGZvcgorICAgICAqIGNvbmRpdGlvbnMgdGhhdCB3aWxsIGNhdXNlIHRoZSB0YXNrIGV4ZWN1dGlvbiB0byBmYWlsLgorICAgICAqIExvZ3Mgb3RoZXIgc3VzcGljaW91cyBjb25kaXRpb25zIHdpdGggUHJvamVjdC5NU0dfV0FSTi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrQ2xhc3MgQ2xhc3MgdG8gdGVzdCBmb3Igc3VpdGFiaWxpdHkuCisgICAgICogICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCAgIFByb2plY3QgdG8gbG9nIHdhcm5pbmdzL2Vycm9ycyB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHNlZSBQcm9qZWN0I2NoZWNrVGFza0NsYXNzKENsYXNzKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1Rhc2tDbGFzcyhmaW5hbCBDbGFzcyB0YXNrQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBpZiAoIURpc3BhdGNoYWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhc2tDbGFzcykpIHsKKyAgICAgICAgICAgIC8vIGRvbid0IGhhdmUgdG8gY2hlY2sgZm9yIGludGVyZmFjZSwgc2luY2UgdGhlbgorICAgICAgICAgICAgLy8gdGFza0NsYXNzIHdvdWxkIGJlIGFic3RyYWN0IHRvby4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIGV4ZWN1dGVNID0gdGFza0NsYXNzLmdldE1ldGhvZCgiZXhlY3V0ZSIsIChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciBwdWJsaWMsIHNpbmNlCisgICAgICAgICAgICAgICAgLy8gZ2V0TWV0aG9kIGZpbmRzIHB1YmxpYyBtZXRob2Qgb25seS4KKyAgICAgICAgICAgICAgICAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciBhYnN0cmFjdCwgc2luY2UgdGhlbgorICAgICAgICAgICAgICAgIC8vIHRhc2tDbGFzcyB3b3VsZCBiZSBhYnN0cmFjdCB0b28uCisgICAgICAgICAgICAgICAgaWYgKCFWb2lkLlRZUEUuZXF1YWxzKGV4ZWN1dGVNLmdldFJldHVyblR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAicmV0dXJuIHR5cGUgb2YgZXhlY3V0ZSgpIHNob3VsZCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJ2b2lkIGJ1dCB3YXMgXCIiICsgZXhlY3V0ZU0uZ2V0UmV0dXJuVHlwZSgpICsgIlwiIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGFza0NsYXNzOworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIk5vIHB1YmxpYyBleGVjdXRlKCkgaW4gIiArIHRhc2tDbGFzczsKKyAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKExpbmthZ2VFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IGxvYWQgIiArIHRhc2tDbGFzcyArICI6ICIgKyBlOworICAgICAgICAgICAgICAgIHByb2plY3QubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHByb3h5IGNsYXNzIGlzIGEgdmFsaWQgY2xhc3MgdG8gdXNlCisgICAgICogd2l0aCB0aGlzIGFkYXB0ZXIuCisgICAgICogVGhlIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBuby1hcmcgImV4ZWN1dGUoKSIgbWV0aG9kLgorICAgICAqIEBwYXJhbSBwcm94eUNsYXNzIHRoZSBjbGFzcyB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVja1Byb3h5Q2xhc3MoQ2xhc3MgcHJveHlDbGFzcykgeworICAgICAgICBjaGVja1Rhc2tDbGFzcyhwcm94eUNsYXNzLCBnZXRQcm9qZWN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBwcm94aWVkIHRhc2suCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBwcm9qZWN0IGNvdWxkIG5vdCBiZSBzZXQKKyAgICAgKiBvciB0aGUgbWV0aG9kIGNvdWxkIG5vdCBiZSBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBzZXRMb2NhdGlvbk0gPSBwcm94eS5nZXRDbGFzcygpLmdldE1ldGhvZCgKKyAgICAgICAgICAgICAgICAic2V0TG9jYXRpb24iLCBuZXcgQ2xhc3NbXSB7TG9jYXRpb24uY2xhc3N9KTsKKyAgICAgICAgICAgIGlmIChzZXRMb2NhdGlvbk0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldExvY2F0aW9uTS5pbnZva2UocHJveHksIG5ldyBPYmplY3RbXSB7Z2V0TG9jYXRpb24oKX0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgaWYgdGhlIGNsYXNzIGJlaW5nIHVzZWQgYXMgYSB0YXNrIGRvZXMgbm90IGhhdmUKKyAgICAgICAgICAgIC8vIGEgc2V0IGxvY2F0aW9uIG1ldGhvZC4KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBsb2coIkVycm9yIHNldHRpbmcgbG9jYXRpb24gaW4gIiArIHByb3h5LmdldENsYXNzKCksCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIHNldFByb2plY3RNID0gcHJveHkuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoCisgICAgICAgICAgICAgICAgInNldFByb2plY3QiLCBuZXcgQ2xhc3NbXSB7UHJvamVjdC5jbGFzc30pOworICAgICAgICAgICAgaWYgKHNldFByb2plY3RNICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXRQcm9qZWN0TS5pbnZva2UocHJveHksIG5ldyBPYmplY3RbXSB7Z2V0UHJvamVjdCgpfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBpZiB0aGUgY2xhc3MgYmVpbmcgdXNlZCBhcyBhIHRhc2sgZG9lcyBub3QgaGF2ZQorICAgICAgICAgICAgLy8gYSBzZXQgcHJvamVjdCBtZXRob2QuCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgbG9nKCJFcnJvciBzZXR0aW5nIHByb2plY3QgaW4gIiArIHByb3h5LmdldENsYXNzKCksCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGlzcGF0Y2hVdGlscy5leGVjdXRlKHByb3h5KTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIHRocm93IGJlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGxvZygiRXJyb3IgaW4gIiArIHByb3h5LmdldENsYXNzKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBvYmplY3QgdG8gcHJveHkgZm9yLgorICAgICAqCisgICAgICogQHBhcmFtIG8gVGhlIHRhcmdldCBvYmplY3QuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3h5KE9iamVjdCBvKSB7CisgICAgICAgIHRoaXMucHJveHkgPSBvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBvYmplY3QgYmVpbmcgcHJveGllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCBwcm94eSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm94eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3h5OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbmZpZ3VyYXRpb25DaGVja2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQ29uZmlndXJhdGlvbkNoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWVhMGQwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbmZpZ3VyYXRpb25DaGVja2VyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qDQorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCisvKioNCisgKiA8cD5IZWxwZXIgY2xhc3MgZm9yIHRoZSBjaGVjayBvZiB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhc2suDQorICogVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBtYWtpbmcgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHRhc2sgY29uZmlndXJhdGlvbi4NCisgKiBBZnRlciBjb2xsZWN0aW5nIGFsbCB2aW9sYXRpb25zIHdpdGggPHR0PmFzc2VydCo8L3R0PiBhbmQgPHR0PmZhaWw8L3R0Pg0KKyAqIG1ldGhvZHMgdGhlIDx0dD5jaGVja0Vycm9yczwvdHQ+IHdpbGwgdGhyb3cgYSBCdWlsZEV4Y2VwdGlvbiB3aXRoIGFsbCBjb2xsZWN0ZWQNCisgKiBtZXNzYWdlcyBvciBkb2VzIG5vdGhpbmcgaWYgdGhlcmUgd2Fzbid0IGFueSBlcnJvci48L3A+DQorICoNCisgKiA8cD5FeGFtcGxlOjwvcD4NCisgKg0KKyAqIDxwcmU+DQorICogICAgIHB1YmxpYyBjbGFzcyBNeVRhc2sgZXh0ZW5kcyBUYXNrIHsNCisgKiAgICAgICAgIC4uLg0KKyAqICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsNCisgKiAgICAgICAgICAgICBUYXNrQ29uZmlndXJhdGlvbkNoZWNrZXIgY2hlY2tlciA9IFRhc2tDb25maWd1cmF0aW9uQ2hlY2tlcih0aGlzKTsNCisgKiAgICAgICAgICAgICBjaGVja2VyLmFzc2VydENvbmZpZygNCisgKiAgICAgICAgICAgICAgICAgc3JjZGlyICE9IG51bGwsDQorICogICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgJ3NyY2RpcicgbXVzdCBiZSBzZXQuDQorICogICAgICAgICAgICAgKTsNCisgKiAgICAgICAgICAgICBjaGVja2VyLmFzc2VydENvbmZpZygNCisgKiAgICAgICAgICAgICAgICAgc3JjZGlyLmV4aXN0cygpLA0KKyAqICAgICAgICAgICAgICAgICAiU3JjZGlyICgiICsgc3JjZGlyICsgIikgbXVzdCBleGlzdC4iDQorICogICAgICAgICAgICAgKTsNCisgKiAgICAgICAgICAgICBpZiAoc29tZUNvbXBsZXhDb25kaXRpb24oKSkgew0KKyAqICAgICAgICAgICAgICAgICBmYWlsKCJDb21wbGV4IGNvbmRpdGlvbiBmYWlsZWQuIik7DQorICogICAgICAgICAgICAgfQ0KKyAqICAgICAgICAgICAgIGNoZWNrZXIuY2hlY2tFcnJvcnMoKTsNCisgKiAgICAgICAgIH0NCisgKiAgICAgfQ0KKyAqIDwvcHJlPg0KKyAqDQorICogQHNlZSA8YSBocmVmPSJodHRwOi8vbWFydGluZm93bGVyLmNvbS9lYWFEZXYvTm90aWZpY2F0aW9uLmh0bWwiPk5vdGlmaWNhdGlvbiBQYXR0ZXJuPC9hPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUYXNrQ29uZmlndXJhdGlvbkNoZWNrZXIgew0KKw0KKyAgICAvKiogTGlzdCBvZiBhbGwgY29sbGVjdGVkIGVycm9yIG1lc3NhZ2VzLiAqLw0KKyAgICBwcml2YXRlIExpc3QvKjxTdHJpbmc+Ki8gZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOw0KKw0KKyAgICAvKiogVGFzayBmb3Igd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGNoZWNrZWQuICovDQorICAgIHByaXZhdGUgVGFzayB0YXNrOw0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3IuDQorICAgICAqIEBwYXJhbSB0YXNrIHdoaWNoIHRhc2sgc2hvdWxkIGJlIGNoZWNrZWQNCisgICAgICovDQorICAgIHB1YmxpYyBUYXNrQ29uZmlndXJhdGlvbkNoZWNrZXIoVGFzayB0YXNrKSB7DQorICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4NCisgICAgICogQHBhcmFtIGNvbmRpdGlvbiAgICAgd2hpY2ggY29uZGl0aW9uIHRvIGNoZWNrDQorICAgICAqIEBwYXJhbSBlcnJvcm1lc3NhZ2UgIGVycm9ybWVzc2FnZSB0byB0aHJvdyBpZiBhIGNvbmRpdGlvbiBmYWlsZWQNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGFzc2VydENvbmZpZyhib29sZWFuIGNvbmRpdGlvbiwgU3RyaW5nIGVycm9ybWVzc2FnZSkgew0KKyAgICAgICAgaWYgKCFjb25kaXRpb24pIHsNCisgICAgICAgICAgICBlcnJvcnMuYWRkKGVycm9ybWVzc2FnZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlZ2lzdGVycyBhbiBlcnJvci4NCisgICAgICogQHBhcmFtIGVycm9ybWVzc2FnZSB0aGUgbWVzc2FnZSBmb3IgdGhlIHJlZ2lzdGVyZWQgZXJyb3INCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGZhaWwoU3RyaW5nIGVycm9ybWVzc2FnZSkgew0KKyAgICAgICAgZXJyb3JzLmFkZChlcnJvcm1lc3NhZ2UpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgYXJlIGFueSBjb2xsZWN0ZWQgZXJyb3JzIGFuZCB0aHJvd3MgYSBCdWlsZEV4Y2VwdGlvbg0KKyAgICAgKiB3aXRoIGFsbCBtZXNzYWdlcyBpZiB0aGVyZSB3YXMgb25lIG9yIG1vcmUuDQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgb25lIG9yIG1vcmUgZXJyb3JzIHdlcmUgcmVnaXN0ZXJlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgY2hlY2tFcnJvcnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gew0KKyAgICAgICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgiQ29uZmlndXJhdGlvbmVycm9yIG9uIDwiKTsNCisgICAgICAgICAgICBzYi5hcHBlbmQodGFzay5nZXRUYXNrTmFtZSgpKTsNCisgICAgICAgICAgICBzYi5hcHBlbmQoIj46Iik7DQorICAgICAgICAgICAgc2IuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7DQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGVycm9ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAoU3RyaW5nKSBpdC5uZXh0KCk7DQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLSAiKTsNCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1zZyk7DQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oc2IudG9TdHJpbmcoKSwgdGFzay5nZXRMb2NhdGlvbigpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQ29udGFpbmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0MmU5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBvYmplY3RzIHdoaWNoIGNhbiBjb250YWluIHRhc2tzLgorICogPHA+CisgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBjYWxsIHBlcmZvcm0gcmF0aGVyIHRoYW4KKyAqIGV4ZWN1dGUgZm9yIHRoZSB0YXNrcyB0aGV5IGNvbnRhaW4sIGFzIHRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUKKyAqIGFwcHJvcHJpYXRlIEJ1aWxkRXZlbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLgorICoKKyAqIEBzZWUgVGFzayNwZXJmb3JtCisgKiBAc2VlIFRhc2sjZXhlY3V0ZQorICogQHNlZSBCdWlsZEV2ZW50CisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhc2tDb250YWluZXIgeworICAgIC8qKgorICAgICAqIEFkZHMgYSB0YXNrIHRvIHRoaXMgdGFzayBjb250YWluZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHRvIGJlIGFkZGVkIHRvIHRoaXMgY29udGFpbmVyLgorICAgICAqICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHZvaWQgYWRkVGFzayhUYXNrIHRhc2spOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1R5cGVBZGFwdGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UeXBlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZDRhMjgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UeXBlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworLyoqCisgKiBVc2VkIHRvIHdyYXAgdHlwZXMuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVBZGFwdGVyIHsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb2plY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBwIHRoZSBwcm9qZWN0IGluc3RhbmNlLgorICAgICAqLworICAgIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHApOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcHJvamVjdAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvamVjdCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBQcm9qZWN0IGdldFByb2plY3QoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3h5IG9iamVjdCwgd2hvc2UgbWV0aG9kcyBhcmUgZ29pbmcgdG8gYmUKKyAgICAgKiBpbnZva2VkIGJ5IGFudC4KKyAgICAgKiBBIHByb3h5IG9iamVjdCBpcyBub3JtYWxseSB0aGUgb2JqZWN0IGRlZmluZWQgYnkKKyAgICAgKiBhICZsdDt0eXBlZGVmLyZndDsgdGFzayB0aGF0IGlzIGFkYXB0ZWQgYnkgdGhlICJhZGFwdGVyIgorICAgICAqIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvIFRoZSB0YXJnZXQgb2JqZWN0LiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICB2b2lkIHNldFByb3h5KE9iamVjdCBvKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByb3h5IG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCBwcm94eSBvYmplY3QKKyAgICAgKi8KKyAgICBPYmplY3QgZ2V0UHJveHkoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBwcm94eSBjbGFzcyBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBhZGFwdGVyIC0gaS5lLgorICAgICAqIHRoZSBhZGFwdGVyIHdpbGwgYmUgYWJsZSB0byBhZGFwdCBpbnN0YW5jZXMgb2YgdGhlIGdpdmUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJveHlDbGFzcyB0aGUgY2xhc3MgdG8gYmUgY2hlY2tlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNoZWNrUHJveHlDbGFzcyhDbGFzcyBwcm94eUNsYXNzKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vua25vd25FbGVtZW50LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Vbmtub3duRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzMyNDMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Vbmtub3duRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsNjcyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlByZVNldERlZjsKKworLyoqCisgKiBXcmFwcGVyIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgdGFzaworICogb3IgZGF0YSB0eXBlIHRoYXQgZGlkIG5vdCBleGlzdCB3aGVuIEFudCBzdGFydGVkLCBvciBvbmUgd2hpY2gKKyAqIGhhcyBoYWQgaXRzIGRlZmluaXRpb24gdXBkYXRlZCB0byB1c2UgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gY2xhc3MuCisgKgorICovCitwdWJsaWMgY2xhc3MgVW5rbm93bkVsZW1lbnQgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8qKgorICAgICAqIEhvbGRzIHRoZSBuYW1lIG9mIHRoZSB0YXNrL3R5cGUgb3IgbmVzdGVkIGNoaWxkIGVsZW1lbnQgb2YgYQorICAgICAqIHRhc2svdHlwZSB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQgYXQgcGFyc2VyIHRpbWUgb3IgaGFzCisgICAgICogYmVlbiByZWRlZmluZWQgc2luY2Ugb3JpZ2luYWwgY3JlYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWU7CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyB0aGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9ICIiOworCisgICAgLyoqCisgICAgICogSG9sZHMgdGhlIG5hbWVzcGFjZSBxbmFtZSBvZiB0aGUgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBxbmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSByZWFsIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBsb2FkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgcmVhbFRoaW5nOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBjaGlsZCBlbGVtZW50cyAoVW5rbm93bkVsZW1lbnRzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QvKjxVbmtub3duRWxlbWVudD4qLyBjaGlsZHJlbiA9IG51bGw7CisKKyAgICAvKiogU3BlY2lmaWVzIGlmIGEgcHJlZGVmaW5lZCBkZWZpbml0aW9uIGhhcyBiZWVuIGRvbmUgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcHJlc2V0RGVmZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gVW5rbm93bkVsZW1lbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIHVua25vd24gZWxlbWVudC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFVua25vd25FbGVtZW50IChTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgbmVzdGVkIFVua25vd25FbGVtZW50cyBmb3IgdGhpcyBVbmtub3duRWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKKyAgICAgICAgcmV0dXJuIGNoaWxkcmVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFhNTCBlbGVtZW50IHdoaWNoIGdlbmVyYXRlZCB0aGlzIHVua25vd24KKyAgICAgKiBlbGVtZW50LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgWE1MIGVsZW1lbnQgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgdW5rbm93bgorICAgICAqICAgICAgICAgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhZygpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lOworICAgIH0KKworICAgIC8qKiBSZXR1cm4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgWE1MIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHJldHVybiBOYW1lc3BhY2UgVVJJIHVzZWQgaW4gdGhlIHhtbG5zIGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgeworICAgICAgICByZXR1cm4gbmFtZXNwYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZXNwYWNlIG9mIHRoZSBYTUwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb25lbnQuCisgICAgICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZCBieSB0aGUgWE1MIHByb2Nlc3Nvci4KKyAgICAgKiBJZiB0aGUgbmFtZXNwYWNlIGlzICJhbnQ6Y3VycmVudCIsIHRoZSBjb21wb25lbnQgaGVscGVyCisgICAgICogaXMgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgYW50bGliIHVyaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgVVJJIHVzZWQgaW4gdGhlIHhtbG5zIGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7CisgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKFByb2plY3RIZWxwZXIuQU5UX0NVUlJFTlRfVVJJKSkgeworICAgICAgICAgICAgQ29tcG9uZW50SGVscGVyIGhlbHBlciA9IENvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRIZWxwZXIoCisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIG5hbWVzcGFjZSA9IGhlbHBlci5nZXRDdXJyZW50QW50bGliVXJpKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2UgPT0gbnVsbCA/ICIiIDogbmFtZXNwYWNlOworICAgIH0KKworICAgIC8qKiBSZXR1cm4gdGhlIHFuYW1lIG9mIHRoZSBYTUwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5hbWVzcGFjZSBRbmFtZSB1c2VkIGluIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UU5hbWUoKSB7CisgICAgICAgIHJldHVybiBxbmFtZTsKKyAgICB9CisKKyAgICAvKiogU2V0IHRoZSBuYW1lc3BhY2UgcW5hbWUgb2YgdGhlIFhNTCBlbGVtZW50LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWQgYnkgdGhlIFhNTCBwcm9jZXNzb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcW5hbWUgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UU5hbWUoU3RyaW5nIHFuYW1lKSB7CisgICAgICAgIHRoaXMucW5hbWUgPSBxbmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgUnVudGltZUNvbmZpZ3VyYWJsZSBpbnN0YW5jZSBmb3IgdGhpcyBVbmtub3duRWxlbWVudCwgY29udGFpbmluZworICAgICAqIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbiBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBSdW50aW1lQ29uZmlndXJhYmxlIGdldFdyYXBwZXIoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRXcmFwcGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgcmVhbCBvYmplY3QgaW5zdGFuY2UgYW5kIGNoaWxkIGVsZW1lbnRzLCB0aGVuIGNvbmZpZ3VyZXMKKyAgICAgKiB0aGUgYXR0cmlidXRlcyBhbmQgdGV4dCBvZiB0aGUgcmVhbCBvYmplY3QuIFRoaXMgdW5rbm93biBlbGVtZW50CisgICAgICogaXMgdGhlbiByZXBsYWNlZCB3aXRoIHRoZSByZWFsIG9iamVjdCBpbiB0aGUgY29udGFpbmluZyB0YXJnZXQncyBsaXN0CisgICAgICogb2YgY2hpbGRyZW4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb25maWd1cmF0aW9uIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWF5YmVDb25maWd1cmUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAocmVhbFRoaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb25maWd1cmUobWFrZU9iamVjdCh0aGlzLCBnZXRXcmFwcGVyKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIGdpdmVuIG9iamVjdCBmcm9tIHRoaXMgVW5rbm93bkVsZW1lbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsT2JqZWN0IHRoZSByZWFsIG9iamVjdCB0aGlzIFVua25vd25FbGVtZW50IGlzIHJlcHJlc2VudGluZy4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShPYmplY3QgcmVhbE9iamVjdCkgeworICAgICAgICByZWFsVGhpbmcgPSByZWFsT2JqZWN0OworCisgICAgICAgIGdldFdyYXBwZXIoKS5zZXRQcm94eShyZWFsVGhpbmcpOworICAgICAgICBUYXNrIHRhc2sgPSBudWxsOworICAgICAgICBpZiAocmVhbFRoaW5nIGluc3RhbmNlb2YgVGFzaykgeworICAgICAgICAgICAgdGFzayA9IChUYXNrKSByZWFsVGhpbmc7CisKKyAgICAgICAgICAgIHRhc2suc2V0UnVudGltZUNvbmZpZ3VyYWJsZVdyYXBwZXIoZ2V0V3JhcHBlcigpKTsKKworICAgICAgICAgICAgLy8gRm9yIFNjcmlwdCBleGFtcGxlIHRoYXQgbW9kaWZpZXMgaWQnZWQgdGFza3MgaW4gb3RoZXIKKyAgICAgICAgICAgIC8vIHRhcmdldHMgdG8gd29yay4gKnZlcnkqIFVnbHkKKyAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2UgaXMgcmVwbGFjZWQgYnkgUnVudGltZUNvbmZpZ3VyYWJsZQorICAgICAgICAgICAgaWYgKGdldFdyYXBwZXIoKS5nZXRJZCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmdldE93bmluZ1RhcmdldCgpLnJlcGxhY2VDaGlsZCh0aGlzLCAoVGFzaykgcmVhbFRoaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICB9CisKKworICAgICAgICAvLyBjb25maWd1cmUgYXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0IGFuZCBpdCdzIGNoaWxkcmVuLiBJZiBpdCBpcworICAgICAgICAvLyBhIHRhc2sgY29udGFpbmVyLCBkZWZlciB0aGUgY29uZmlndXJhdGlvbiB0aWxsIHRoZSB0YXNrIGNvbnRhaW5lcgorICAgICAgICAvLyBhdHRlbXB0cyB0byB1c2UgdGhlIHRhc2sKKworICAgICAgICBpZiAodGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICB0YXNrLm1heWJlQ29uZmlndXJlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRXcmFwcGVyKCkubWF5YmVDb25maWd1cmUoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZUNoaWxkcmVuKHJlYWxUaGluZywgZ2V0V3JhcHBlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIG91dHB1dCBzZW50IHRvIFN5c3RlbS5vdXQgYnkgdGhpcyB0YXNrIG9yIGl0cyByZWFsIHRhc2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU91dHB1dChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICAoKFRhc2spIHJlYWxUaGluZykuaGFuZGxlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlIHRvIHJlYWxUaGluZyBpZiBwcmVzZW50IGFuZCBpZiBpdCBhcyB0YXNrLgorICAgICAqIEBzZWUgVGFzayNoYW5kbGVJbnB1dChieXRlW10sIGludCwgaW50KQorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgaXMgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGF0IHdoaWNoIGRhdGEgaXMgc3RvcmVkLgorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGRhdGEgY2Fubm90IGJlIHJlYWQuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGhhbmRsZUlucHV0KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICByZXR1cm4gKChUYXNrKSByZWFsVGhpbmcpLmhhbmRsZUlucHV0KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZUlucHV0KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9CisKKyAgICB9CisgICAgLyoqCisgICAgICogSGFuZGxlcyBvdXRwdXQgc2VudCB0byBTeXN0ZW0ub3V0IGJ5IHRoaXMgdGFzayBvciBpdHMgcmVhbCB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHRvIGxvZy4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGbHVzaChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICAoKFRhc2spIHJlYWxUaGluZykuaGFuZGxlRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUZsdXNoKG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIGVycm9yIG91dHB1dCBzZW50IHRvIFN5c3RlbS5lcnIgYnkgdGhpcyB0YXNrIG9yIGl0cyByZWFsIHRhc2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBlcnJvciBvdXRwdXQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yT3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKHJlYWxUaGluZyBpbnN0YW5jZW9mIFRhc2spIHsKKyAgICAgICAgICAgICgoVGFzaykgcmVhbFRoaW5nKS5oYW5kbGVFcnJvck91dHB1dChvdXRwdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuaGFuZGxlRXJyb3JPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogSGFuZGxlcyBlcnJvciBvdXRwdXQgc2VudCB0byBTeXN0ZW0uZXJyIGJ5IHRoaXMgdGFzayBvciBpdHMgcmVhbCB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGUgZXJyb3Igb3V0cHV0IHRvIGxvZy4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFcnJvckZsdXNoKFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKHJlYWxUaGluZyBpbnN0YW5jZW9mIFRhc2spIHsKKyAgICAgICAgICAgICgoVGFzaykgcmVhbFRoaW5nKS5oYW5kbGVFcnJvck91dHB1dChvdXRwdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuaGFuZGxlRXJyb3JPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSByZWFsIG9iamVjdCBpZiBpdCdzIGEgdGFzay4gSWYgaXQncyBub3QgYSB0YXNrCisgICAgICogKGUuZy4gYSBkYXRhIHR5cGUpIHRoZW4gdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIGlmIChyZWFsVGhpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcGxhaW4gaW1wb3NzaWJsZSB0byBnZXQgaGVyZSwgbWF5YmVDb25maWd1cmUgc2hvdWxkCisgICAgICAgICAgICAvLyBoYXZlIHRocm93biBhbiBleGNlcHRpb24uCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgdGFzayBvZiB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50TmFtZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICAgICAgKChUYXNrKSByZWFsVGhpbmcpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIEZpbmlzaGVkIGV4ZWN1dGluZyB0aGUgdGFzaywgbnVsbCBpdCB0byBhbGxvdworICAgICAgICAgICAgLy8gR0MgZG8gaXRzIGpvYgorICAgICAgICAgICAgLy8gSWYgdGhpcyBVRSBpcyB1c2VkIGFnYWluLCBhIG5ldyAicmVhbHRoaW5nIiB3aWxsIGJlIG1hZGUKKyAgICAgICAgICAgIHJlYWxUaGluZyA9IG51bGw7CisgICAgICAgICAgICBnZXRXcmFwcGVyKCkuc2V0UHJveHkobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY2hpbGQgZWxlbWVudCB0byB0aGlzIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIGNoaWxkIGVsZW1lbnQgdG8gYWRkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChVbmtub3duRWxlbWVudCBjaGlsZCkgeworICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgY2hpbGRyZW4uYWRkKGNoaWxkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGNoaWxkIGVsZW1lbnRzLCBjcmVhdGVzIGNoaWxkcmVuIG9mIHRoZSBjaGlsZHJlbgorICAgICAqIChyZWN1cnNpdmVseSksIGFuZCBzZXRzIGF0dHJpYnV0ZXMgb2YgdGhlIGNoaWxkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgY29uZmlndXJlZCBvYmplY3QgZm9yIHRoZSBwYXJlbnQuCisgICAgICogICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRXcmFwcGVyIFRoZSB3cmFwcGVyIGNvbnRhaW5pbmcgY2hpbGQgd3JhcHBlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjb25maWd1cmVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBhbnkgY2hpbGRyZW4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjaGlsZHJlbiBjYW5ub3QgYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGlsZHJlbigKKyAgICAgICAgT2JqZWN0IHBhcmVudCwKKyAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZSBwYXJlbnRXcmFwcGVyKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVHlwZUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIHBhcmVudCA9ICgoVHlwZUFkYXB0ZXIpIHBhcmVudCkuZ2V0UHJveHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwYXJlbnRVcmkgPSBnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgQ2xhc3MgcGFyZW50Q2xhc3MgPSBwYXJlbnQuZ2V0Q2xhc3MoKTsKKyAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKGdldFByb2plY3QoKSwgcGFyZW50Q2xhc3MpOworCisKKyAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpdC5oYXNOZXh0KCk7IGkrKykgeworICAgICAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgY2hpbGRXcmFwcGVyID0gcGFyZW50V3JhcHBlci5nZXRDaGlsZChpKTsKKyAgICAgICAgICAgICAgICBVbmtub3duRWxlbWVudCBjaGlsZCA9IChVbmtub3duRWxlbWVudCkgaXQubmV4dCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlQ2hpbGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50VXJpLCBpaCwgcGFyZW50LCBjaGlsZCwgY2hpbGRXcmFwcGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgVGFza0NvbnRhaW5lcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaC50aHJvd05vdFN1cHBvcnRlZChnZXRQcm9qZWN0KCksIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRUYWcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgdGFzayBjb250YWluZXIgLSBhbnl0aGluZyBjb3VsZCBoYXBwZW4gLSBqdXN0IGFkZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGlsZCB0byB0aGUgY29udGFpbmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0NvbnRhaW5lciBjb250YWluZXIgPSAoVGFza0NvbnRhaW5lcikgcGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRUYXNrKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRWxlbWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRXcmFwcGVyLmdldEVsZW1lbnRUYWcoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVzdGVkIFwiIiArIGV4LmdldEVsZW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgZWxlbWVudC4iLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY29tcG9uZW50IG5hbWUgLSB1c2VzIFByb2plY3RIZWxwZXIjZ2VuQ29tcG9uZW50TmFtZSgpCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgeworICAgICAgICByZXR1cm4gUHJvamVjdEhlbHBlci5nZW5Db21wb25lbnROYW1lKGdldE5hbWVzcGFjZSgpLCBnZXRUYWcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB1c2VkIHRoZW4gdGhlIHJlYWxvYmplY3Qgb2YgdGhlIFVFIGlzIGEgUHJlU2V0RGVmaW5pdGlvbi4KKyAgICAgKiBUaGlzIGlzIGFsc28gdXNlZCB3aGVuIGEgcHJlc2V0ZGVmIGlzIHVzZWQgb24gYSBwcmVzZXRkZWYKKyAgICAgKiBUaGUgYXR0cmlidXRlcywgZWxlbWVudHMgYW5kIHRleHQgYXJlIGFwcGxpZWQgdG8gdGhpcworICAgICAqIFVFLgorICAgICAqCisgICAgICogQHBhcmFtIHUgYW4gVW5rbm93bkVsZW1lbnQgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcywgZWxlbWVudHMgYW5kIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBseVByZVNldChVbmtub3duRWxlbWVudCB1KSB7CisgICAgICAgIGlmIChwcmVzZXREZWZlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIERvIHRoZSBydW50aW1lCisgICAgICAgIGdldFdyYXBwZXIoKS5hcHBseVByZVNldCh1LmdldFdyYXBwZXIoKSk7CisgICAgICAgIGlmICh1LmNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIExpc3QgbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBuZXdDaGlsZHJlbi5hZGRBbGwodS5jaGlsZHJlbik7CisgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGlsZHJlbiA9IG5ld0NoaWxkcmVuOworICAgICAgICB9CisgICAgICAgIHByZXNldERlZmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmFtZWQgdGFzayBvciBkYXRhIHR5cGUuIElmIHRoZSByZWFsIG9iamVjdCBpcyBhIHRhc2ssCisgICAgICogaXQgaXMgY29uZmlndXJlZCB1cCB0byB0aGUgaW5pdCgpIHN0YWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHVlIFRoZSB1bmtub3duIGVsZW1lbnQgdG8gY3JlYXRlIHRoZSByZWFsIG9iamVjdCBmb3IuCisgICAgICogICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSB3ICBJZ25vcmVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0YXNrIG9yIGRhdGEgdHlwZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gdW5rbm93biBlbGVtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgbWFrZU9iamVjdChVbmtub3duRWxlbWVudCB1ZSwgUnVudGltZUNvbmZpZ3VyYWJsZSB3KSB7CisgICAgICAgIENvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSB1ZS5nZXRDb21wb25lbnROYW1lKCk7CisgICAgICAgIE9iamVjdCBvID0gaGVscGVyLmNyZWF0ZUNvbXBvbmVudCh1ZSwgdWUuZ2V0TmFtZXNwYWNlKCksIG5hbWUpOworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBnZXROb3RGb3VuZEV4Y2VwdGlvbigidGFzayBvciB0eXBlIiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBQcmVTZXREZWYuUHJlU2V0RGVmaW5pdGlvbikgeworICAgICAgICAgICAgUHJlU2V0RGVmLlByZVNldERlZmluaXRpb24gZGVmID0gKFByZVNldERlZi5QcmVTZXREZWZpbml0aW9uKSBvOworICAgICAgICAgICAgbyA9IGRlZi5jcmVhdGVPYmplY3QodWUuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBnZXROb3RGb3VuZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInByZXNldCAiICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZGVmLmdldFByZVNldHMoKS5nZXRDb21wb25lbnROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWUuYXBwbHlQcmVTZXQoZGVmLmdldFByZVNldHMoKSk7CisgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhc2spIHsKKyAgICAgICAgICAgICAgICBUYXNrIHRhc2sgPSAoVGFzaykgbzsKKyAgICAgICAgICAgICAgICB0YXNrLnNldFRhc2tUeXBlKHVlLmdldFRhc2tUeXBlKCkpOworICAgICAgICAgICAgICAgIHRhc2suc2V0VGFza05hbWUodWUuZ2V0VGFza05hbWUoKSk7CisgICAgICAgICAgICAgICAgdGFzay5pbml0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgbyA9ICgoVW5rbm93bkVsZW1lbnQpIG8pLm1ha2VPYmplY3QoKFVua25vd25FbGVtZW50KSBvLCB3KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhc2spIHsKKyAgICAgICAgICAgICgoVGFzaykgbykuc2V0T3duaW5nVGFyZ2V0KGdldE93bmluZ1RhcmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFByb2plY3RDb21wb25lbnQpIHsKKyAgICAgICAgICAgICgoUHJvamVjdENvbXBvbmVudCkgbykuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5hbWVkIHRhc2sgYW5kIGNvbmZpZ3VyZXMgaXQgdXAgdG8gdGhlIGluaXQoKSBzdGFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1ZSBUaGUgVW5rbm93bkVsZW1lbnQgdG8gY3JlYXRlIHRoZSByZWFsIHRhc2sgZm9yLgorICAgICAqICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdyAgSWdub3JlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRhc2sgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiB1bmtub3duIGVsZW1lbnQsIG9yCisgICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdGFzayBuYW1lIGlzIG5vdCByZWNvZ25pc2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBUYXNrIG1ha2VUYXNrKFVua25vd25FbGVtZW50IHVlLCBSdW50aW1lQ29uZmlndXJhYmxlIHcpIHsKKyAgICAgICAgVGFzayB0YXNrID0gZ2V0UHJvamVjdCgpLmNyZWF0ZVRhc2sodWUuZ2V0VGFnKCkpOworCisgICAgICAgIGlmICh0YXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRhc2suc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAvLyBVbmtub3duRWxlbWVudCBhbHdheXMgaGFzIGFuIGFzc29jaWF0ZWQgdGFyZ2V0CisgICAgICAgICAgICB0YXNrLnNldE93bmluZ1RhcmdldChnZXRPd25pbmdUYXJnZXQoKSk7CisgICAgICAgICAgICB0YXNrLmluaXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGFzazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmVyeSB2ZXJib3NlIGV4Y2VwdGlvbiBmb3Igd2hlbiBhIHRhc2svZGF0YSB0eXBlIGNhbm5vdAorICAgICAqIGJlIGZvdW5kLgorICAgICAqCisgICAgICogQHBhcmFtIHdoYXQgVGhlIGtpbmQgb2YgdGhpbmcgYmVpbmcgY3JlYXRlZC4gRm9yIGV4YW1wbGUsIHdoZW4KKyAgICAgKiAgICAgICAgICAgICBhIHRhc2sgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQsIHRoaXMgd291bGQgYmUKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT4idGFzayI8L2NvZGU+LiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNvdWxkIG5vdCBiZSBmb3VuZC4KKyAgICAgKiAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHdoYXQgbWlnaHQgaGF2ZSBjYXVzZWQgdGhlIHByb2JsZW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIEJ1aWxkRXhjZXB0aW9uIGdldE5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyB3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSkgeworICAgICAgICBDb21wb25lbnRIZWxwZXIgaGVscGVyID0gQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEhlbHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICBTdHJpbmcgbXNnID0gaGVscGVyLmRpYWdub3NlQ3JlYXRpb25GYWlsdXJlKG5hbWUsIHdoYXQpOworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSB0byB1c2UgaW4gbG9nZ2luZyBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgdG8gdXNlIGluIGxvZ2dpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYXNrTmFtZSgpIHsKKyAgICAgICAgLy9yZXR1cm4gZWxlbWVudE5hbWU7CisgICAgICAgIHJldHVybiByZWFsVGhpbmcgPT0gbnVsbAorICAgICAgICAgICAgfHwgIShyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSA/IHN1cGVyLmdldFRhc2tOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKFRhc2spIHJlYWxUaGluZykuZ2V0VGFza05hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0YXNrIGluc3RhbmNlIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGlmIGl0IGlzIGEgdGFzay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB0YXNrIGluc3RhbmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZWFsIG9iamVjdCBpcyBub3QKKyAgICAgKiAgICAgICAgIGEgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFzayBnZXRUYXNrKCkgeworICAgICAgICBpZiAocmVhbFRoaW5nIGluc3RhbmNlb2YgVGFzaykgeworICAgICAgICAgICAgcmV0dXJuIChUYXNrKSByZWFsVGhpbmc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25maWd1cmVkIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVhbCB0aGluZyB3aGF0ZXZlciBpdCBpcworICAgICAqCisgICAgICogQHNpbmNlIGFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlYWxUaGluZygpIHsKKyAgICAgICAgcmV0dXJuIHJlYWxUaGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbmZpZ3VyZWQgb2JqZWN0CisgICAgICogQHBhcmFtIHJlYWxUaGluZyB0aGUgY29uZmlndXJlZCBvYmplY3QKKyAgICAgKiBAc2luY2UgYW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWxUaGluZyhPYmplY3QgcmVhbFRoaW5nKSB7CisgICAgICAgIHRoaXMucmVhbFRoaW5nID0gcmVhbFRoaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBjcmVhdGUgYSBuZXN0ZWQgZWxlbWVudCBvZiA8Y29kZT5wYXJlbnQ8L2NvZGU+IGZvciB0aGUKKyAgICAgKiBnaXZlbiB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWwKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ2hpbGQoCisgICAgICAgIFN0cmluZyBwYXJlbnRVcmksCisgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIgaWgsCisgICAgICAgIE9iamVjdCBwYXJlbnQsIFVua25vd25FbGVtZW50IGNoaWxkLAorICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIGNoaWxkV3JhcHBlcikgeworICAgICAgICBTdHJpbmcgY2hpbGROYW1lID0gUHJvamVjdEhlbHBlci5nZW5Db21wb25lbnROYW1lKAorICAgICAgICAgICAgY2hpbGQuZ2V0TmFtZXNwYWNlKCksIGNoaWxkLmdldFRhZygpKTsKKyAgICAgICAgaWYgKGloLnN1cHBvcnRzTmVzdGVkRWxlbWVudChwYXJlbnRVcmksIGNoaWxkTmFtZSkpIHsKKyAgICAgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIuQ3JlYXRvciBjcmVhdG9yID0KKyAgICAgICAgICAgICAgICBpaC5nZXRFbGVtZW50Q3JlYXRvcigKKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLCBwYXJlbnRVcmksIHBhcmVudCwgY2hpbGROYW1lLCBjaGlsZCk7CisgICAgICAgICAgICBjcmVhdG9yLnNldFBvbHlUeXBlKGNoaWxkV3JhcHBlci5nZXRQb2x5VHlwZSgpKTsKKyAgICAgICAgICAgIE9iamVjdCByZWFsQ2hpbGQgPSBjcmVhdG9yLmNyZWF0ZSgpOworICAgICAgICAgICAgaWYgKHJlYWxDaGlsZCBpbnN0YW5jZW9mIFByZVNldERlZi5QcmVTZXREZWZpbml0aW9uKSB7CisgICAgICAgICAgICAgICAgUHJlU2V0RGVmLlByZVNldERlZmluaXRpb24gZGVmID0KKyAgICAgICAgICAgICAgICAgICAgKFByZVNldERlZi5QcmVTZXREZWZpbml0aW9uKSByZWFsQ2hpbGQ7CisgICAgICAgICAgICAgICAgcmVhbENoaWxkID0gY3JlYXRvci5nZXRSZWFsT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgY2hpbGQuYXBwbHlQcmVTZXQoZGVmLmdldFByZVNldHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGlsZFdyYXBwZXIuc2V0Q3JlYXRvcihjcmVhdG9yKTsKKyAgICAgICAgICAgIGNoaWxkV3JhcHBlci5zZXRQcm94eShyZWFsQ2hpbGQpOworICAgICAgICAgICAgaWYgKHJlYWxDaGlsZCBpbnN0YW5jZW9mIFRhc2spIHsKKyAgICAgICAgICAgICAgICBUYXNrIGNoaWxkVGFzayA9IChUYXNrKSByZWFsQ2hpbGQ7CisgICAgICAgICAgICAgICAgY2hpbGRUYXNrLnNldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyKGNoaWxkV3JhcHBlcik7CisgICAgICAgICAgICAgICAgY2hpbGRUYXNrLnNldFRhc2tOYW1lKGNoaWxkTmFtZSk7CisgICAgICAgICAgICAgICAgY2hpbGRUYXNrLnNldFRhc2tUeXBlKGNoaWxkTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVhbENoaWxkIGluc3RhbmNlb2YgUHJvamVjdENvbXBvbmVudCkgeworICAgICAgICAgICAgICAgICgoUHJvamVjdENvbXBvbmVudCkgcmVhbENoaWxkKS5zZXRMb2NhdGlvbihjaGlsZC5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoaWxkV3JhcHBlci5tYXliZUNvbmZpZ3VyZShnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgY2hpbGQuaGFuZGxlQ2hpbGRyZW4ocmVhbENoaWxkLCBjaGlsZFdyYXBwZXIpOworICAgICAgICAgICAgY3JlYXRvci5zdG9yZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGxpa2UgY29udGVudHMgZXF1YWxzLCBidXQgaWdub3JlcyBwcm9qZWN0CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGNoZWNrIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB1bmtub3duZWxlbWVudCBoYXMgdGhlIHNhbWUgY29udGVudHMgdGhlIG90aGVyCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2ltaWxhcihPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBVbmtub3duRWxlbWVudCBvdGhlciA9IChVbmtub3duRWxlbWVudCkgb2JqOworICAgICAgICAvLyBBcmUgdGhlIG5hbWVzIHRoZSBzYW1lID8KKyAgICAgICAgaWYgKCFlcXVhbHNTdHJpbmcoZWxlbWVudE5hbWUsIG90aGVyLmVsZW1lbnROYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghbmFtZXNwYWNlLmVxdWFscyhvdGhlci5uYW1lc3BhY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFxbmFtZS5lcXVhbHMob3RoZXIucW5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gQXJlIGF0dHJpYnV0ZXMgdGhlIHNhbWUgPworICAgICAgICBpZiAoIWdldFdyYXBwZXIoKS5nZXRBdHRyaWJ1dGVNYXAoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgb3RoZXIuZ2V0V3JhcHBlcigpLmdldEF0dHJpYnV0ZU1hcCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIElzIHRoZSB0ZXh0IHRoZSBzYW1lPworICAgICAgICAvLyAgIE5lZWQgdG8gdXNlIGVxdWFscyBvbiB0aGUgc3RyaW5nIGFuZCBub3QKKyAgICAgICAgLy8gICBvbiB0aGUgc3RyaW5nYnVmZmVyIGFzIGVxdWFscyBvbiB0aGUgc3RyaW5nIGJ1ZmZlcgorICAgICAgICAvLyAgIGRvZXMgbm90IGNvbXBhcmUgdGhlIGNvbnRlbnRzLgorICAgICAgICBpZiAoIWdldFdyYXBwZXIoKS5nZXRUZXh0KCkudG9TdHJpbmcoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgb3RoZXIuZ2V0V3JhcHBlcigpLmdldFRleHQoKS50b1N0cmluZygpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIEFyZSB0aGUgc3ViIGVsZW1lbnRzIHRoZSBzYW1lID8KKyAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4uc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBvdGhlci5jaGlsZHJlbiA9PSBudWxsIHx8IG90aGVyLmNoaWxkcmVuLnNpemUoKSA9PSAwOworICAgICAgICB9CisgICAgICAgIGlmIChvdGhlci5jaGlsZHJlbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoaWxkcmVuLnNpemUoKSAhPSBvdGhlci5jaGlsZHJlbi5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBVbmtub3duRWxlbWVudCBjaGlsZCA9IChVbmtub3duRWxlbWVudCkgY2hpbGRyZW4uZ2V0KGkpOworICAgICAgICAgICAgaWYgKCFjaGlsZC5zaW1pbGFyKG90aGVyLmNoaWxkcmVuLmdldChpKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNTdHJpbmcoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisgICAgICAgIHJldHVybiAoYSA9PSBudWxsKSA/IChiID09IG51bGwpIDogYS5lcXVhbHMoYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBhIGNvcHkgb2YgdGhlIHVua25vd24gZWxlbWVudCBhbmQgc2V0IGl0IGluIHRoZSBuZXcgcHJvamVjdC4KKyAgICAgKiBAcGFyYW0gbmV3UHJvamVjdCB0aGUgcHJvamVjdCB0byBjcmVhdGUgdGhlIFVFIGluLgorICAgICAqIEByZXR1cm4gdGhlIGNvcGllZCBVRS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVW5rbm93bkVsZW1lbnQgY29weShQcm9qZWN0IG5ld1Byb2plY3QpIHsKKyAgICAgICAgVW5rbm93bkVsZW1lbnQgcmV0ID0gbmV3IFVua25vd25FbGVtZW50KGdldFRhZygpKTsKKyAgICAgICAgcmV0LnNldE5hbWVzcGFjZShnZXROYW1lc3BhY2UoKSk7CisgICAgICAgIHJldC5zZXRQcm9qZWN0KG5ld1Byb2plY3QpOworICAgICAgICByZXQuc2V0UU5hbWUoZ2V0UU5hbWUoKSk7CisgICAgICAgIHJldC5zZXRUYXNrVHlwZShnZXRUYXNrVHlwZSgpKTsKKyAgICAgICAgcmV0LnNldFRhc2tOYW1lKGdldFRhc2tOYW1lKCkpOworICAgICAgICByZXQuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIGlmIChnZXRPd25pbmdUYXJnZXQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBUYXJnZXQgdCA9IG5ldyBUYXJnZXQoKTsKKyAgICAgICAgICAgIHQuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgcmV0LnNldE93bmluZ1RhcmdldCh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldC5zZXRPd25pbmdUYXJnZXQoZ2V0T3duaW5nVGFyZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgY29weVJDID0gbmV3IFJ1bnRpbWVDb25maWd1cmFibGUoCisgICAgICAgICAgICByZXQsIGdldFRhc2tOYW1lKCkpOworICAgICAgICBjb3B5UkMuc2V0UG9seVR5cGUoZ2V0V3JhcHBlcigpLmdldFBvbHlUeXBlKCkpOworICAgICAgICBNYXAgbSA9IGdldFdyYXBwZXIoKS5nZXRBdHRyaWJ1dGVNYXAoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgICAgICBjb3B5UkMuc2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgIChTdHJpbmcpIGVudHJ5LmdldEtleSgpLCAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjb3B5UkMuYWRkVGV4dChnZXRXcmFwcGVyKCkuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGdldFdyYXBwZXIoKS5nZXRDaGlsZHJlbigpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZSByID0gKFJ1bnRpbWVDb25maWd1cmFibGUpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFVua25vd25FbGVtZW50IHVlQ2hpbGQgPSAoVW5rbm93bkVsZW1lbnQpIHIuZ2V0UHJveHkoKTsKKyAgICAgICAgICAgIFVua25vd25FbGVtZW50IGNvcHlDaGlsZCA9IHVlQ2hpbGQuY29weShuZXdQcm9qZWN0KTsKKyAgICAgICAgICAgIGNvcHlSQy5hZGRDaGlsZChjb3B5Q2hpbGQuZ2V0V3JhcHBlcigpKTsKKyAgICAgICAgICAgIHJldC5hZGRDaGlsZChjb3B5Q2hpbGQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVW5zdXBwb3J0ZWRBdHRyaWJ1dGVFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vuc3VwcG9ydGVkQXR0cmlidXRlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwODJkMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vuc3VwcG9ydGVkQXR0cmlidXRlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworLyoqCisgKiBVc2VkIHRvIHJlcG9ydCBhdHRlbXB0cyB0byBzZXQgYW4gdW5zdXBwb3J0ZWQgYXR0cmlidXRlCisgKgorICogQHNpbmNlIEFudCAxLjYuMworICovCitwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRBdHRyaWJ1dGVFeGNlcHRpb24gZXh0ZW5kcyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHVuc3VwcG9ydGVkIGF0dHJpYnV0ZSBleGNlcHRpb24uCisgICAgICogQHBhcmFtIG1zZyAgICAgICBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgdW5zdXBwb3J0ZWQgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBVbnN1cHBvcnRlZEF0dHJpYnV0ZUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXR0cmlidXRlIHRoYXQgaXMgd3JvbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vuc3VwcG9ydGVkRWxlbWVudEV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVW5zdXBwb3J0ZWRFbGVtZW50RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzYmI0NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vuc3VwcG9ydGVkRWxlbWVudEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKKy8qKgorICogVXNlZCB0byByZXBvcnQgYXR0ZW1wdHMgdG8gc2V0IGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQKKyAqIFdoZW4gdGhlIGF0dGVtcHQgdG8gc2V0IHRoZSBlbGVtZW50IGlzIG1hZGUsCisgKiB0aGUgY29kZSBkb2VzIG5vdCBub3Qga25vdyB0aGUgbmFtZSBvZiB0aGUgdGFzay90eXBlCisgKiBiYXNlZCBvbiBhIG1hcHBpbmcgZnJvbSB0aGUgY2xhc3NuYW1lIHRvIHRoZSB0YXNrL3R5cGUuCisgKiBIb3dldmVyIG9uZSBjbGFzcyBtYXkgYmUgdXNlZCBieSBhIGxvdCBvZiB0YXNrL3R5cGVzLgorICogVGhpcyBleGNlcHRpb24gbWF5IGJlIGNhdWdodCBieSBjb2RlIHRoYXQgZG9lcyBrbm93CisgKiB0aGUgdGFzay90eXBlIGFuZCBpdCB3aWxsIHJlc2V0IHRoZSBtZXNzYWdlIHRvIHRoZQorICogY29ycmVjdCBtZXNzYWdlLgorICogVGhpcyB3aWxsIGJlIGRvbmUgb25jZSAoaW4gdGhlIGNhc2Ugb2YgYSByZWN1cnNpdmUKKyAqIGNhbGwgdG8gaGFuZGxlY2hpbGRyZW4pLgorICoKKyAqIEBzaW5jZSBBbnQgMS42LjMKKyAqLworcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkRWxlbWVudEV4Y2VwdGlvbiBleHRlbmRzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGVsZW1lbnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBtc2cgVGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBuYW1lIG9mIHRoZSBpbmNvcnJlY3QgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVW5zdXBwb3J0ZWRFbGVtZW50RXhjZXB0aW9uKFN0cmluZyBtc2csIFN0cmluZyBlbGVtZW50KSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBlbGVtZW50IHRoYXQgaXMgd3JvbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50KCkgeworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9YbWxMb2dnZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1htbExvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmE2YjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9YbWxMb2dnZXIuamF2YQpAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NRWxlbWVudFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aXRoCisgKiBhbiBYTUwgZGVzY3JpcHRpb24gb2Ygd2hhdCBoYXBwZW5lZCBkdXJpbmcgYSBidWlsZC4KKyAqIFRoZSBkZWZhdWx0IGZpbGVuYW1lIGlzICJsb2cueG1sIiwgYnV0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4KKyAqIHdpdGggdGhlIHByb3BlcnR5IDxjb2RlPlhtbExvZ2dlci5maWxlPC9jb2RlPi4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgaW4gaXRzIHNhbml0eSBjaGVja2luZyB0aGF0IG9ubHkgb25lCisgKiB0aHJlYWQgcnVucyBhIHBhcnRpY3VsYXIgdGFyZ2V0L3Rhc2sgYXQgYSB0aW1lLiBUaGlzIGlzIGVuZm9yY2VkCisgKiBieSB0aGUgd2F5IHRoYXQgcGFyYWxsZWwgYnVpbGRzIGFuZCBhbnRjYWxscyBhcmUgZG9uZSAtIGFuZAorICogaW5kZWVkIGFsbCBidXQgdGhlIHNpbXBsZXN0IG9mIHRhc2tzIGNvdWxkIHJ1biBpbnRvIHByb2JsZW1zCisgKiBpZiBleGVjdXRlZCBpbiBwYXJhbGxlbC4KKyAqCisgKiBAc2VlIFByb2plY3QjYWRkQnVpbGRMaXN0ZW5lcihCdWlsZExpc3RlbmVyKQorICovCitwdWJsaWMgY2xhc3MgWG1sTG9nZ2VyIGltcGxlbWVudHMgQnVpbGRMb2dnZXIgeworCisgICAgcHJpdmF0ZSBpbnQgbXNnT3V0cHV0TGV2ZWwgPSBQcm9qZWN0Lk1TR19ERUJVRzsKKyAgICBwcml2YXRlIFByaW50U3RyZWFtIG91dFN0cmVhbTsKKworICAgIC8qKiBEb2N1bWVudEJ1aWxkZXIgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIGRvY3VtZW50IHRvIHN0YXJ0IHdpdGguICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBnZXREb2N1bWVudEJ1aWxkZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBkZWZhdWx0IERvY3VtZW50QnVpbGRlciBpbnN0YW5jZSBvciB0aHJvd3MgYW4KKyAgICAgKiBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IgaWYgaXQgY2FuJ3QgYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBkZWZhdWx0IERvY3VtZW50QnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcihleGMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFhNTCBlbGVtZW50IG5hbWUgZm9yIGEgYnVpbGQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1RBRyA9ICJidWlsZCI7CisKKyAgICAvKiogWE1MIGVsZW1lbnQgbmFtZSBmb3IgYSB0YXJnZXQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9UQUcgPSAidGFyZ2V0IjsKKworICAgIC8qKiBYTUwgZWxlbWVudCBuYW1lIGZvciBhIHRhc2suICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfVEFHID0gInRhc2siOworCisgICAgLyoqIFhNTCBlbGVtZW50IG5hbWUgZm9yIGEgbWVzc2FnZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9UQUcgPSAibWVzc2FnZSI7CisKKyAgICAvKiogWE1MIGF0dHJpYnV0ZSBuYW1lIGZvciBhIG5hbWUuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUiA9ICJuYW1lIjsKKworICAgIC8qKiBYTUwgYXR0cmlidXRlIG5hbWUgZm9yIGEgdGltZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRV9BVFRSID0gInRpbWUiOworCisgICAgLyoqIFhNTCBhdHRyaWJ1dGUgbmFtZSBmb3IgYSBtZXNzYWdlIHByaW9yaXR5LiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9BVFRSID0gInByaW9yaXR5IjsKKworICAgIC8qKiBYTUwgYXR0cmlidXRlIG5hbWUgZm9yIGEgZmlsZSBsb2NhdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fQVRUUiA9ICJsb2NhdGlvbiI7CisKKyAgICAvKiogWE1MIGF0dHJpYnV0ZSBuYW1lIGZvciBhbiBlcnJvciBkZXNjcmlwdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQVRUUiA9ICJlcnJvciI7CisKKyAgICAvKiogWE1MIGVsZW1lbnQgbmFtZSBmb3IgYSBzdGFjayB0cmFjZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBQ0tUUkFDRV9UQUcgPSAic3RhY2t0cmFjZSI7CisKKyAgICAvKiogVGhlIGNvbXBsZXRlIGxvZyBkb2N1bWVudCBmb3IgdGhpcyBidWlsZC4gKi8KKyAgICBwcml2YXRlIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKKworICAgIC8qKiBNYXBwaW5nIGZvciB3aGVuIHRhc2tzIHN0YXJ0ZWQgKFRhc2sgdG8gVGltZWRFbGVtZW50KS4gKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSB0YXNrcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKiBNYXBwaW5nIGZvciB3aGVuIHRhcmdldHMgc3RhcnRlZCAoVGFzayB0byBUaW1lZEVsZW1lbnQpLiAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhcmdldHMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXBwaW5nIG9mIHRocmVhZHMgdG8gc3RhY2tzIG9mIGVsZW1lbnRzCisgICAgICogKFRocmVhZCB0byBTdGFjayBvZiBUaW1lZEVsZW1lbnQpLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHRocmVhZFN0YWNrcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGJ1aWxkIHN0YXJ0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBUaW1lZEVsZW1lbnQgYnVpbGRFbGVtZW50ID0gbnVsbDsKKworICAgIC8qKiBVdGlsaXR5IGNsYXNzIHJlcHJlc2VudGluZyB0aGUgdGltZSBhbiBlbGVtZW50IHN0YXJ0ZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGltZWRFbGVtZW50IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgICAqIChhcyByZXR1cm5lZCBieSA8Y29kZT5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTwvY29kZT4pLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKKyAgICAgICAgLyoqIEVsZW1lbnQgY3JlYXRlZCBhdCB0aGUgc3RhcnQgdGltZS4gKi8KKyAgICAgICAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRUYWdOYW1lKCkgKyAiOiIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIENvbnN0cnVjdHMgYSBuZXcgQnVpbGRMaXN0ZW5lciB0aGF0IGxvZ3MgYnVpbGQgZXZlbnRzIHRvIGFuIFhNTCBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBYbWxMb2dnZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZWQgd2hlbiB0aGUgYnVpbGQgc3RhcnRzLCB0aGlzIGJ1aWxkcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgZm9yIHRoZQorICAgICAqIGRvY3VtZW50IGFuZCByZW1lbWJlcnMgdGhlIHRpbWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBidWlsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBJZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGJ1aWxkRWxlbWVudCA9IG5ldyBUaW1lZEVsZW1lbnQoKTsKKyAgICAgICAgYnVpbGRFbGVtZW50LnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBidWlsZEVsZW1lbnQuZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KEJVSUxEX1RBRyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZWQgd2hlbiB0aGUgYnVpbGQgZmluaXNoZXMsIHRoaXMgYWRkcyB0aGUgdGltZSB0YWtlbiBhbmQgYW55CisgICAgICogZXJyb3Igc3RhY2t0cmFjZSB0byB0aGUgYnVpbGQgZWxlbWVudCBhbmQgd3JpdGVzIHRoZSBkb2N1bWVudCB0byBkaXNrLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLgorICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgbG9uZyB0b3RhbFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJ1aWxkRWxlbWVudC5zdGFydFRpbWU7CisgICAgICAgIGJ1aWxkRWxlbWVudC5lbGVtZW50LnNldEF0dHJpYnV0ZShUSU1FX0FUVFIsIERlZmF1bHRMb2dnZXIuZm9ybWF0VGltZSh0b3RhbFRpbWUpKTsKKworICAgICAgICBpZiAoZXZlbnQuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVpbGRFbGVtZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKEVSUk9SX0FUVFIsIGV2ZW50LmdldEV4Y2VwdGlvbigpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gcHJpbnQgdGhlIHN0YWNrdHJhY2UgaW4gdGhlIGJ1aWxkIGZpbGUgaXQgaXMgYWx3YXlzIHVzZWZ1bC4uLgorICAgICAgICAgICAgLy8gYmV0dGVyIGhhdmUgdG9vIG11Y2ggaW5mbyB0aGFuIG5vdCBlbm91Z2guCisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGV2ZW50LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgVGV4dCBlcnJUZXh0ID0gZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihTdHJpbmdVdGlscy5nZXRTdGFja1RyYWNlKHQpKTsKKyAgICAgICAgICAgIEVsZW1lbnQgc3RhY2t0cmFjZSA9IGRvYy5jcmVhdGVFbGVtZW50KFNUQUNLVFJBQ0VfVEFHKTsKKyAgICAgICAgICAgIHN0YWNrdHJhY2UuYXBwZW5kQ2hpbGQoZXJyVGV4dCk7CisgICAgICAgICAgICBidWlsZEVsZW1lbnQuZWxlbWVudC5hcHBlbmRDaGlsZChzdGFja3RyYWNlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgb3V0RmlsZW5hbWUgPSBldmVudC5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIlhtbExvZ2dlci5maWxlIik7CisgICAgICAgIGlmIChvdXRGaWxlbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRGaWxlbmFtZSA9ICJsb2cueG1sIjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgeHNsVXJpID0gZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuWG1sTG9nZ2VyLnN0eWxlc2hlZXQudXJpIik7CisgICAgICAgIGlmICh4c2xVcmkgPT0gbnVsbCkgeworICAgICAgICAgICAgeHNsVXJpID0gImxvZy54c2wiOworICAgICAgICB9CisgICAgICAgIFdyaXRlciBvdXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gc3BlY2lmeSBvdXRwdXQgaW4gVVRGOCBvdGhlcndpc2UgYWNjZW50ZWQgY2hhcmFjdGVycyB3aWxsIGJsb3cKKyAgICAgICAgICAgIC8vIHVwIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBzdHJlYW0gPSBvdXRTdHJlYW07CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSwgIlVURjgiKTsKKyAgICAgICAgICAgIG91dC53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKTsKKyAgICAgICAgICAgIGlmICh4c2xVcmkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI8P3htbC1zdHlsZXNoZWV0IHR5cGU9XCJ0ZXh0L3hzbFwiIGhyZWY9XCIiICsgeHNsVXJpICsgIlwiPz5cblxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXcgRE9NRWxlbWVudFdyaXRlcigpLndyaXRlKGJ1aWxkRWxlbWVudC5lbGVtZW50LCBvdXQsIDAsICJcdCIpOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgbG9nIGZpbGUiLCBleGMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRFbGVtZW50ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGFjayBvZiB0aW1lZCBlbGVtZW50cyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgICAqIEByZXR1cm4gdGhlIHN0YWNrIG9mIHRpbWVkIGVsZW1lbnRzIGZvciB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0YWNrIGdldFN0YWNrKCkgeworICAgICAgICBTdGFjayB0aHJlYWRTdGFjayA9IChTdGFjaykgdGhyZWFkU3RhY2tzLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgaWYgKHRocmVhZFN0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocmVhZFN0YWNrID0gbmV3IFN0YWNrKCk7CisgICAgICAgICAgICB0aHJlYWRTdGFja3MucHV0KFRocmVhZC5jdXJyZW50VGhyZWFkKCksIHRocmVhZFN0YWNrKTsKKyAgICAgICAgfQorICAgICAgICAvKiBGb3IgZGVidWdnaW5nIHB1cnBvc2VzIHVuY29tbWVudDoKKyAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudCBzID0gZG9jLmNyZWF0ZUNvbW1lbnQoInN0YWNrPSIgKyB0aHJlYWRTdGFjayk7CisgICAgICAgIGJ1aWxkRWxlbWVudC5lbGVtZW50LmFwcGVuZENoaWxkKHMpOworICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIHRocmVhZFN0YWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmVkIHdoZW4gYSB0YXJnZXQgc3RhcnRzIGJ1aWxkaW5nLCB0aGlzIHB1c2hlcyBhIHRpbWVkIGVsZW1lbnQKKyAgICAgKiBmb3IgdGhlIHRhcmdldCBvbnRvIHRoZSBzdGFjayBvZiBlbGVtZW50cyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLAorICAgICAqIHJlbWVtYmVyaW5nIHRoZSBjdXJyZW50IHRpbWUgYW5kIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uCisgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gZXZlbnQuZ2V0VGFyZ2V0KCk7CisgICAgICAgIFRpbWVkRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gbmV3IFRpbWVkRWxlbWVudCgpOworICAgICAgICB0YXJnZXRFbGVtZW50LnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB0YXJnZXRFbGVtZW50LmVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChUQVJHRVRfVEFHKTsKKyAgICAgICAgdGFyZ2V0RWxlbWVudC5lbGVtZW50LnNldEF0dHJpYnV0ZShOQU1FX0FUVFIsIHRhcmdldC5nZXROYW1lKCkpOworICAgICAgICB0YXJnZXRzLnB1dCh0YXJnZXQsIHRhcmdldEVsZW1lbnQpOworICAgICAgICBnZXRTdGFjaygpLnB1c2godGFyZ2V0RWxlbWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZWQgd2hlbiBhIHRhcmdldCBmaW5pc2hlcyBidWlsZGluZywgdGhpcyBhZGRzIHRoZSB0aW1lIHRha2VuCisgICAgICogYW5kIGFueSBlcnJvciBzdGFja3RyYWNlIHRvIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQgZWxlbWVudCBpbiB0aGUgbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLgorICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIFRhcmdldCB0YXJnZXQgPSBldmVudC5nZXRUYXJnZXQoKTsKKyAgICAgICAgVGltZWRFbGVtZW50IHRhcmdldEVsZW1lbnQgPSAoVGltZWRFbGVtZW50KSB0YXJnZXRzLmdldCh0YXJnZXQpOworICAgICAgICBpZiAodGFyZ2V0RWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBsb25nIHRvdGFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGFyZ2V0RWxlbWVudC5zdGFydFRpbWU7CisgICAgICAgICAgICB0YXJnZXRFbGVtZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKFRJTUVfQVRUUiwgRGVmYXVsdExvZ2dlci5mb3JtYXRUaW1lKHRvdGFsVGltZSkpOworCisgICAgICAgICAgICBUaW1lZEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7CisgICAgICAgICAgICBTdGFjayB0aHJlYWRTdGFjayA9IGdldFN0YWNrKCk7CisgICAgICAgICAgICBpZiAoIXRocmVhZFN0YWNrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBUaW1lZEVsZW1lbnQgcG9wcGVkU3RhY2sgPSAoVGltZWRFbGVtZW50KSB0aHJlYWRTdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICBpZiAocG9wcGVkU3RhY2sgIT0gdGFyZ2V0RWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzbWF0Y2ggLSBwb3BwZWQgZWxlbWVudCA9ICIgKyBwb3BwZWRTdGFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmaW5pc2hlZCB0YXJnZXQgZWxlbWVudCA9ICIgKyB0YXJnZXRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF0aHJlYWRTdGFjay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSAoVGltZWRFbGVtZW50KSB0aHJlYWRTdGFjay5wZWVrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkRWxlbWVudC5lbGVtZW50LmFwcGVuZENoaWxkKHRhcmdldEVsZW1lbnQuZWxlbWVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuZWxlbWVudC5hcHBlbmRDaGlsZCh0YXJnZXRFbGVtZW50LmVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRhcmdldHMucmVtb3ZlKHRhcmdldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZWQgd2hlbiBhIHRhc2sgc3RhcnRzIGJ1aWxkaW5nLCB0aGlzIHB1c2hlcyBhIHRpbWVkIGVsZW1lbnQKKyAgICAgKiBmb3IgdGhlIHRhc2sgb250byB0aGUgc3RhY2sgb2YgZWxlbWVudHMgZm9yIHRoZSBjdXJyZW50IHRocmVhZCwKKyAgICAgKiByZW1lbWJlcmluZyB0aGUgY3VycmVudCB0aW1lIGFuZCB0aGUgbmFtZSBvZiB0aGUgdGFzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBBbiBldmVudCB3aXRoIGFueSByZWxldmFudCBleHRyYSBpbmZvcm1hdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBUaW1lZEVsZW1lbnQgdGFza0VsZW1lbnQgPSBuZXcgVGltZWRFbGVtZW50KCk7CisgICAgICAgIHRhc2tFbGVtZW50LnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB0YXNrRWxlbWVudC5lbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoVEFTS19UQUcpOworCisgICAgICAgIFRhc2sgdGFzayA9IGV2ZW50LmdldFRhc2soKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBldmVudC5nZXRUYXNrKCkuZ2V0VGFza05hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbmFtZSA9ICIiOworICAgICAgICB9CisgICAgICAgIHRhc2tFbGVtZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKE5BTUVfQVRUUiwgbmFtZSk7CisgICAgICAgIHRhc2tFbGVtZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKExPQ0FUSU9OX0FUVFIsIGV2ZW50LmdldFRhc2soKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOworICAgICAgICB0YXNrcy5wdXQodGFzaywgdGFza0VsZW1lbnQpOworICAgICAgICBnZXRTdGFjaygpLnB1c2godGFza0VsZW1lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmVkIHdoZW4gYSB0YXNrIGZpbmlzaGVzIGJ1aWxkaW5nLCB0aGlzIGFkZHMgdGhlIHRpbWUgdGFrZW4KKyAgICAgKiBhbmQgYW55IGVycm9yIHN0YWNrdHJhY2UgdG8gdGhlIGFwcHJvcHJpYXRlIHRhc2sgZWxlbWVudCBpbiB0aGUgbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLgorICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBUYXNrIHRhc2sgPSBldmVudC5nZXRUYXNrKCk7CisgICAgICAgIFRpbWVkRWxlbWVudCB0YXNrRWxlbWVudCA9IChUaW1lZEVsZW1lbnQpIHRhc2tzLmdldCh0YXNrKTsKKyAgICAgICAgaWYgKHRhc2tFbGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhc2sgIiArIHRhc2sgKyAiIG5vdCBpbiAiICsgdGFza3MpOworICAgICAgICB9CisgICAgICAgIGxvbmcgdG90YWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0YXNrRWxlbWVudC5zdGFydFRpbWU7CisgICAgICAgIHRhc2tFbGVtZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKFRJTUVfQVRUUiwgRGVmYXVsdExvZ2dlci5mb3JtYXRUaW1lKHRvdGFsVGltZSkpOworICAgICAgICBUYXJnZXQgdGFyZ2V0ID0gdGFzay5nZXRPd25pbmdUYXJnZXQoKTsKKyAgICAgICAgVGltZWRFbGVtZW50IHRhcmdldEVsZW1lbnQgPSBudWxsOworICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRhcmdldEVsZW1lbnQgPSAoVGltZWRFbGVtZW50KSB0YXJnZXRzLmdldCh0YXJnZXQpOworICAgICAgICB9CisgICAgICAgIGlmICh0YXJnZXRFbGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkRWxlbWVudC5lbGVtZW50LmFwcGVuZENoaWxkKHRhc2tFbGVtZW50LmVsZW1lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFyZ2V0RWxlbWVudC5lbGVtZW50LmFwcGVuZENoaWxkKHRhc2tFbGVtZW50LmVsZW1lbnQpOworICAgICAgICB9CisgICAgICAgIFN0YWNrIHRocmVhZFN0YWNrID0gZ2V0U3RhY2soKTsKKyAgICAgICAgaWYgKCF0aHJlYWRTdGFjay5lbXB0eSgpKSB7CisgICAgICAgICAgICBUaW1lZEVsZW1lbnQgcG9wcGVkU3RhY2sgPSAoVGltZWRFbGVtZW50KSB0aHJlYWRTdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGlmIChwb3BwZWRTdGFjayAhPSB0YXNrRWxlbWVudCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNaXNtYXRjaCAtIHBvcHBlZCBlbGVtZW50ID0gIiArIHBvcHBlZFN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZmluaXNoZWQgdGFzayBlbGVtZW50ID0gIiArIHRhc2tFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0YXNrcy5yZW1vdmUodGFzayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBUaW1lZEVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgdGFzay4KKyAgICAgKgorICAgICAqIFdoZXJlIHRoZSB0YXNrIGlzIG5vdCBmb3VuZCBkaXJlY3RseSwgc2VhcmNoIGZvciB1bmtub3duIGVsZW1lbnRzIHdoaWNoCisgICAgICogbWF5IGJlIGhpZGluZyB0aGUgcmVhbCB0YXNrCisgICAgICovCisgICAgcHJpdmF0ZSBUaW1lZEVsZW1lbnQgZ2V0VGFza0VsZW1lbnQoVGFzayB0YXNrKSB7CisgICAgICAgIFRpbWVkRWxlbWVudCBlbGVtZW50ID0gKFRpbWVkRWxlbWVudCkgdGFza3MuZ2V0KHRhc2spOworICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSB0YXNrcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBUYXNrIGtleSA9IChUYXNrKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoa2V5IGluc3RhbmNlb2YgVW5rbm93bkVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKChVbmtub3duRWxlbWVudCkga2V5KS5nZXRUYXNrKCkgPT0gdGFzaykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFRpbWVkRWxlbWVudCkgdGFza3MuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpcmVkIHdoZW4gYSBtZXNzYWdlIGlzIGxvZ2dlZCwgdGhpcyBhZGRzIGEgbWVzc2FnZSBlbGVtZW50IHRvIHRoZQorICAgICAqIG1vc3QgYXBwcm9wcmlhdGUgcGFyZW50IGVsZW1lbnQgKHRhc2ssIHRhcmdldCBvciBidWlsZCkgYW5kIHJlY29yZHMKKyAgICAgKiB0aGUgcHJpb3JpdHkgYW5kIHRleHQgb2YgdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uCisgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBpbnQgcHJpb3JpdHkgPSBldmVudC5nZXRQcmlvcml0eSgpOworICAgICAgICBpZiAocHJpb3JpdHkgPiBtc2dPdXRwdXRMZXZlbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEVsZW1lbnQgbWVzc2FnZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChNRVNTQUdFX1RBRyk7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAiZGVidWciOworICAgICAgICBzd2l0Y2ggKHByaW9yaXR5KSB7CisgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX0VSUjoKKyAgICAgICAgICAgICAgICBuYW1lID0gImVycm9yIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfV0FSTjoKKyAgICAgICAgICAgICAgICBuYW1lID0gIndhcm4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQcm9qZWN0Lk1TR19JTkZPOgorICAgICAgICAgICAgICAgIG5hbWUgPSAiaW5mbyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG5hbWUgPSAiZGVidWciOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1lc3NhZ2VFbGVtZW50LnNldEF0dHJpYnV0ZShQUklPUklUWV9BVFRSLCBuYW1lKTsKKworICAgICAgICBUaHJvd2FibGUgZXggPSBldmVudC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKFByb2plY3QuTVNHX0RFQlVHIDw9IG1zZ091dHB1dExldmVsICYmIGV4ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFRleHQgZXJyVGV4dCA9IGRvYy5jcmVhdGVDREFUQVNlY3Rpb24oU3RyaW5nVXRpbHMuZ2V0U3RhY2tUcmFjZShleCkpOworICAgICAgICAgICAgRWxlbWVudCBzdGFja3RyYWNlID0gZG9jLmNyZWF0ZUVsZW1lbnQoU1RBQ0tUUkFDRV9UQUcpOworICAgICAgICAgICAgc3RhY2t0cmFjZS5hcHBlbmRDaGlsZChlcnJUZXh0KTsKKyAgICAgICAgICAgIGJ1aWxkRWxlbWVudC5lbGVtZW50LmFwcGVuZENoaWxkKHN0YWNrdHJhY2UpOworICAgICAgICB9CisgICAgICAgIFRleHQgbWVzc2FnZVRleHQgPSBkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKGV2ZW50LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIG1lc3NhZ2VFbGVtZW50LmFwcGVuZENoaWxkKG1lc3NhZ2VUZXh0KTsKKworICAgICAgICBUaW1lZEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7CisKKyAgICAgICAgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOworCisgICAgICAgIFRhcmdldCB0YXJnZXQgPSBldmVudC5nZXRUYXJnZXQoKTsKKyAgICAgICAgaWYgKHRhc2sgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IGdldFRhc2tFbGVtZW50KHRhc2spOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSAoVGltZWRFbGVtZW50KSB0YXJnZXRzLmdldCh0YXJnZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuZWxlbWVudC5hcHBlbmRDaGlsZChtZXNzYWdlRWxlbWVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWlsZEVsZW1lbnQuZWxlbWVudC5hcHBlbmRDaGlsZChtZXNzYWdlRWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCdWlsZExvZ2dlciBpbnRlcmZhY2UKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9nZ2luZyBsZXZlbCB3aGVuIHVzaW5nIHRoaXMgYXMgYSBMb2dnZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBsZXZlbCB0aGUgbG9nZ2luZyBsZXZlbCAtCisgICAgICogICAgICAgIHNlZSB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCNNU0dfRVJSIFByb2plY3R9CisgICAgICogICAgICAgIGNsYXNzIGZvciBsZXZlbCBkZWZpbml0aW9ucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VPdXRwdXRMZXZlbChpbnQgbGV2ZWwpIHsKKyAgICAgICAgbXNnT3V0cHV0TGV2ZWwgPSBsZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggbG9nZ2luZyBvdXRwdXQgaXMgc2VudCB3aGVuIG9wZXJhdGluZworICAgICAqIGFzIGEgbG9nZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IFByaW50U3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dFByaW50U3RyZWFtKFByaW50U3RyZWFtIG91dHB1dCkgeworICAgICAgICB0aGlzLm91dFN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShvdXRwdXQsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yZSBlbWFjcyBtb2RlLCBhcyBpdCBoYXMgbm8gbWVhbmluZyBpbiBYTUwgZm9ybWF0CisgICAgICoKKyAgICAgKiBAcGFyYW0gZW1hY3NNb2RlIHRydWUgaWYgbG9nZ2VyIHNob3VsZCBwcm9kdWNlIGVtYWNzIGNvbXBhdGlibGUKKyAgICAgKiAgICAgICAgb3V0cHV0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW1hY3NNb2RlKGJvb2xlYW4gZW1hY3NNb2RlKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3JlIGVycm9yIHByaW50IHN0cmVhbS4gQWxsIG91dHB1dCB3aWxsIGJlIHdyaXR0ZW4gdG8KKyAgICAgKiBlaXRoZXIgdGhlIFhNTCBsb2cgZmlsZSBvciB0aGUgUHJpbnRTdHJlYW0gcHJvdmlkZWQgdG8KKyAgICAgKiBzZXRPdXRwdXRQcmludFN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtIGVyciB0aGUgc3RyZWFtIHdlIGFyZSBnb2luZyB0byBpZ25vcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSBlcnIpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2FudGxpYi54bWwgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hbnRsaWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzRkMDkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hbnRsaWIueG1sCkBAIC0wLDAgKzEsMTM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKyAgPCEtLQorLyoKKyAqICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKy0tPgorPGFudGxpYj4KKyAgPCEtLQorICAgICAgIFRoaXMgaXMgdGhlIGFudCBsaWIgZGVmaW5pdGlvbiBmb3IgYW50LgorICAgICAgIEN1cnJlbnRseSBpdCBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudGRlZmluaXRpb25zIChyZXN0cmljdGVkCisgICAgICAgdHlwZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQgYXQgdGhlIHRvcCBsZXZlbCkKKyAgICAgICAtIGNvbmRpdGlvbnMsIHNlbGVjdG9ycyBhbmQgY29tcGFyYXRvcnMKKyAgICAgICAodGhvc2UgdGhhdCBhcmUgbm90IHRvcC1sZXZlbCB0eXBlcyAodGFza2RlZnMgb3IgdHlwZWRlZnMpLgorICAgICAgIGRlZmluZWQgaW4gZGVmYXVsdHMucHJvcGVydGllcyBvZiB0YXNrZGVmcyBhbmQgdHlwZXMKKyAgICAgICBwYWNrYWdlcykuCisKKyAgICAgICBUaGlzIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwgYW5kIGl0IGlzIG1vc3QKKyAgICAgICBsaWtlbHkgdGhhdCB0aGVzZSBkZWZpbml0aW9ucyB3aWxsIGJlIHBsYWNlZAorICAgICAgIGluIGEgSmF2YSBBbnQgZGVmaW5pdGlvbiBjbGFzcy4KKyAgLS0+CisgIDwhLS0gY29uZGl0aW9ucyAtLT4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJhbmQiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5BbmQiLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJjb250YWlucyIgb25lcnJvcj0iaWdub3JlIgorICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbnRhaW5zIi8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0iZXF1YWxzIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uRXF1YWxzIi8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0iZmlsZXNtYXRjaCIgb25lcnJvcj0iaWdub3JlIgorICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkZpbGVzTWF0Y2giLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJoYXNmcmVlc3BhY2UiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSGFzRnJlZVNwYWNlIi8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0iaGFzbWV0aG9kIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSGFzTWV0aG9kIi8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0iaHR0cCIgb25lcnJvcj0iaWdub3JlIgorICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkh0dHAiLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJpc2ZhaWx1cmUiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc0ZhaWx1cmUiLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJpc2ZhbHNlIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSXNGYWxzZSIvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9ImlzcmVhY2hhYmxlIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSXNSZWFjaGFibGUiLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJpc3JlZmVyZW5jZSIgb25lcnJvcj0iaWdub3JlIgorICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzUmVmZXJlbmNlIi8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0iaXNzZXQiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc1NldCIvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9Imlzc2lnbmVkIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSXNTaWduZWQiLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJpc3RydWUiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc1RydWUiLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJtYXRjaGVzIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk1hdGNoZXMiLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJub3QiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuTm90Ii8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0ib3IiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PciIvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9Im9zIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3MiLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJwYXJzZXJzdXBwb3J0cyIgb25lcnJvcj0iaWdub3JlIgorICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLlBhcnNlclN1cHBvcnRzIi8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0icmVzb3VyY2Vjb250YWlucyIgb25lcnJvcj0iaWdub3JlIgorICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLlJlc291cmNlQ29udGFpbnMiLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJyZXNvdXJjZXNtYXRjaCIgb25lcnJvcj0iaWdub3JlIgorICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLlJlc291cmNlc01hdGNoIi8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0ic29ja2V0IiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uU29ja2V0Ii8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0idHlwZWZvdW5kIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uVHlwZUZvdW5kIi8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0ieG9yIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uWG9yIi8+CisKKyAgPCEtLSBzZWxlY3RvcnMgLS0+CisgIDxjb21wb25lbnRkZWYgbmFtZT0iYW5kIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkFuZCIgLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJjb21wYXJlIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkNvbXBhcmUiIC8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0iY29udGFpbnMiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5Db250YWluc1NlbGVjdG9yIiAvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9ImNvbnRhaW5zcmVnZXhwIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQ29udGFpbnNSZWdleHBTZWxlY3RvciIgLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJkYXRlIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkRhdGUiIC8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0iZXhpc3RzIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkV4aXN0cyIgLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJpbnN0YW5jZW9mIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkluc3RhbmNlT2YiIC8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0ibWFqb3JpdHkiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuTWFqb3JpdHkiIC8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0ibW9kaWZpZWQiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLk1vZGlmaWVkU2VsZWN0b3IiIC8+CisgIDxjb21wb25lbnRkZWYgbmFtZT0ibmFtZSIgb25lcnJvcj0iaWdub3JlIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5OYW1lIiAvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9Im5vbmUiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuTm9uZSIgLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJub3QiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuTm90IiAvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9Im9yIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLk9yIiAvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9InNpemUiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuU2l6ZSIgLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJ0eXBlIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLlR5cGUiIC8+CisKKworICA8IS0tIGNvbXBhcmF0b3JzIC0tPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9Im5hbWUiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycy5OYW1lIiAvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9InNpemUiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycy5TaXplIiAvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9ImRhdGUiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycy5EYXRlIiAvPgorICA8Y29tcG9uZW50ZGVmIG5hbWU9ImV4aXN0cyIgb25lcnJvcj0iaWdub3JlIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzLkV4aXN0cyIgLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJ0eXBlIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuVHlwZSIgLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJjb250ZW50IiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuQ29udGVudCIgLz4KKyAgPGNvbXBvbmVudGRlZiBuYW1lPSJyZXZlcnNlIiBvbmVycm9yPSJpZ25vcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuUmV2ZXJzZSIgLz4KKworPC9hbnRsaWI+CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2RlZmF1bHRNYW5pZmVzdC5tZiBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2RlZmF1bHRNYW5pZmVzdC5tZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDMwYTIzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZGVmYXVsdE1hbmlmZXN0Lm1mCkBAIC0wLDAgKzEsNCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitBbnQtVmVyc2lvbjogQXBhY2hlIEFudCAke3Byb2plY3QudmVyc2lvbn0KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kaXNwYXRjaC9EaXNwYXRjaFRhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2Rpc3BhdGNoL0Rpc3BhdGNoVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2I5MGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kaXNwYXRjaC9EaXNwYXRjaFRhc2suamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmRpc3BhdGNoOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworLyoqCisgKiBUYXNrcyBleHRlbmRpbmcgdGhpcyBjbGFzcyBtYXkgY29udGFpbiBtdWx0aXBsZSBhY3Rpb25zLgorICogVGhlIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgZm9yIGV4ZWN1dGlvbiBkZXBlbmRzIHVwb24gdGhlCisgKiB2YWx1ZSBvZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSBvZiB0aGUgdGFzay4KKyAqIDxici8+CisgKiBFeGFtcGxlOjxici8+CisgKiAmbHQ7bXl0YXNrIGFjdGlvbj0mcXVvdDtsaXN0JnF1b3Q7LyZndDsgd2lsbCBpbnZva2UgdGhlIG1ldGhvZAorICogd2l0aCB0aGUgc2lnbmF0dXJlIHB1YmxpYyB2b2lkIGxpc3QoKSBpbiBteXRhc2sncyBjbGFzcy4KKyAqIElmIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkIGluIHRoZSB0YXNrIG9yIGlzIGVtcHR5LAorICogdGhlIGV4ZWN1dGUoKSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaXNwYXRjaFRhc2sgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgRGlzcGF0Y2hhYmxlIHsKKyAgICBwcml2YXRlIFN0cmluZyBhY3Rpb247CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+ICJhY3Rpb24iIGJ5IGRlZmF1bHQgKGNhbiBiZSBvdmVycmlkZGVuKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvblBhcmFtZXRlck5hbWUoKSB7CisgICAgICAgIHJldHVybiAiYWN0aW9uIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbi4KKyAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBtZXRob2QgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFjdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBhY3Rpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZGlzcGF0Y2gvRGlzcGF0Y2hVdGlscy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZGlzcGF0Y2gvRGlzcGF0Y2hVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTRiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kaXNwYXRjaC9EaXNwYXRjaFV0aWxzLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZGlzcGF0Y2g7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Vbmtub3duRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogRGV0ZXJtaW5lcyBhbmQgRXhlY3V0ZXMgdGhlIGFjdGlvbiBtZXRob2QgZm9yIHRoZSB0YXNrLgorICovCisvLyBDaGVja1N0eWxlOkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvckNoZWNrIE9GRiAtIChiYykKK3B1YmxpYyBjbGFzcyBEaXNwYXRjaFV0aWxzIHsKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGFuZCBFeGVjdXRlcyB0aGUgYWN0aW9uIG1ldGhvZCBmb3IgdGhlIHRhc2suCisgICAgICogQHBhcmFtIHRhc2sgdGhlIHRhc2sgdG8gZXhlY3V0ZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBleGVjdXRlKE9iamVjdCB0YXNrKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9ICJleGVjdXRlIjsKKyAgICAgICAgRGlzcGF0Y2hhYmxlIGRpc3BhdGNoYWJsZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGFzayBpbnN0YW5jZW9mIERpc3BhdGNoYWJsZSkgeworICAgICAgICAgICAgICAgIGRpc3BhdGNoYWJsZSA9IChEaXNwYXRjaGFibGUpIHRhc2s7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgICAgIFVua25vd25FbGVtZW50IHVlID0gKFVua25vd25FbGVtZW50KSB0YXNrOworICAgICAgICAgICAgICAgIE9iamVjdCByZWFsVGhpbmcgPSB1ZS5nZXRSZWFsVGhpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVhbFRoaW5nICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgcmVhbFRoaW5nIGluc3RhbmNlb2YgRGlzcGF0Y2hhYmxlCisgICAgICAgICAgICAgICAgICAgICYmIHJlYWxUaGluZyBpbnN0YW5jZW9mIFRhc2spIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hhYmxlID0gKERpc3BhdGNoYWJsZSkgcmVhbFRoaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkaXNwYXRjaGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBkaXNwYXRjaGFibGUuZ2V0QWN0aW9uUGFyYW1ldGVyTmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIG5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUgPSAiZ2V0IiArIG5hbWUudHJpbSgpLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUgKz0gbmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBjID0gZGlzcGF0Y2hhYmxlLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgYWN0aW9uTSA9IGMuZ2V0TWV0aG9kKG1OYW1lLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbk0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvID0gYWN0aW9uTS5pbnZva2UoZGlzcGF0Y2hhYmxlLCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSBvLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwgJiYgcy50cmltKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gcy50cmltKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgZXhlY3V0ZU0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU0gPSBkaXNwYXRjaGFibGUuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRlTSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcHVibGljICIgKyBtZXRob2ROYW1lICsgIigpIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXNwYXRjaGFibGUuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTS5pbnZva2UoZGlzcGF0Y2hhYmxlLCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVW5rbm93bkVsZW1lbnQpIHRhc2spLnNldFJlYWxUaGluZyhudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzcGF0Y2hhYmxlIFRhc2sgYXR0cmlidXRlICciICsgbmFtZS50cmltKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIG5vdCBzZXQgb3IgdmFsdWUgaXMgZW1wdHkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNwYXRjaGFibGUgVGFzayBhdHRyaWJ1dGUgJyIgKyBuYW1lLnRyaW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgbm90IHNldCBvciB2YWx1ZSBpcyBlbXB0eS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbiBQYXJhbWV0ZXIgTmFtZSBtdXN0IG5vdCBiZSBlbXB0eSBmb3IgRGlzcGF0Y2hhYmxlIFRhc2suIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHB1YmxpYyAiICsgbU5hbWUgKyAiKCkgaW4gIiArIHRhc2suZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZXRob2QgZXhlY3V0ZU0gPSBudWxsOworICAgICAgICAgICAgICAgIGV4ZWN1dGVNID0gdGFzay5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICAgICAgICAgIGlmIChleGVjdXRlTSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcHVibGljICIgKyBtZXRob2ROYW1lICsgIigpIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGFzay5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXhlY3V0ZU0uaW52b2tlKHRhc2ssIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICAoKFVua25vd25FbGVtZW50KSB0YXNrKS5zZXRSZWFsVGhpbmcobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGllLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93ICgoQnVpbGRFeGNlcHRpb24pIHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZGlzcGF0Y2gvRGlzcGF0Y2hhYmxlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kaXNwYXRjaC9EaXNwYXRjaGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTY4NGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZGlzcGF0Y2gvRGlzcGF0Y2hhYmxlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5kaXNwYXRjaDsKKworLyoqCisgKiBDbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBzcGVjaWZ5IHRoZQorICogbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgY29udGFpbnMgdGhlIG5hbWUKKyAqIG9mIHRoZSB0YXNrJ3MgbWV0aG9kIHRvIGV4ZWN1dGUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGlzcGF0Y2hhYmxlIHsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdGhhdCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIFN0cmluZyBnZXRBY3Rpb25QYXJhbWV0ZXJOYW1lKCk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0Jhc2VGaWx0ZXJSZWFkZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQmFzZUZpbHRlclJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWNlMzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0Jhc2VGaWx0ZXJSZWFkZXIuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5GaWx0ZXJSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGNvcmUgZmlsdGVyIHJlYWRlcnMuCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUZpbHRlclJlYWRlciBleHRlbmRzIEZpbHRlclJlYWRlciB7CisgICAgLyoqIEJ1ZmZlciBzaXplIHVzZWQgd2hlbiByZWFkaW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gODE5MjsKKworICAgIC8qKiBIYXZlIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBiZWVuIGludGVycHJldGVkPyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgLyoqIFRoZSBBbnQgcHJvamVjdCB0aGlzIGZpbHRlciBpcyBwYXJ0IG9mLiAqLworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgYnkgQW50J3MgaW50cm9zcGVjdGlvbiBtZWNoYW5pc20uCisgICAgICogVGhlIG9yaWdpbmFsIGZpbHRlciByZWFkZXIgaXMgb25seSB1c2VkIGZvciBjaGFpbmluZworICAgICAqIHB1cnBvc2VzLCBuZXZlciBmb3IgZmlsdGVyaW5nIHB1cnBvc2VzIChhbmQgaW5kZWVkCisgICAgICogaXQgd291bGQgYmUgdXNlbGVzcyBmb3IgZmlsdGVyaW5nIHB1cnBvc2VzLCBhcyBpdCBoYXMKKyAgICAgKiBubyByZWFsIGRhdGEgdG8gZmlsdGVyKS4gQ2hhaW5lZFJlYWRlckhlbHBlciB1c2VzCisgICAgICogdGhpcyBwbGFjZWhvbGRlciBpbnN0YW5jZSB0byBjcmVhdGUgYSBjaGFpbiBvZiByZWFsIGZpbHRlcnMuCisgICAgICovCisgICAgcHVibGljIEJhc2VGaWx0ZXJSZWFkZXIoKSB7CisgICAgICAgIHN1cGVyKG5ldyBTdHJpbmdSZWFkZXIoIiIpKTsKKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsdGVyZWQgcmVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGluIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBCYXNlRmlsdGVyUmVhZGVyKGZpbmFsIFJlYWRlciBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgY2hhcmFjdGVycyBpbnRvIGEgcG9ydGlvbiBvZiBhbiBhcnJheS4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKKyAgICAgKiB1bnRpbCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBzdHJlYW0gaXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGNidWYgIERlc3RpbmF0aW9uIGJ1ZmZlciB0byB3cml0ZSBjaGFyYWN0ZXJzIHRvLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSAgICAgIG9mZiAgIE9mZnNldCBhdCB3aGljaCB0byBzdGFydCBzdG9yaW5nIGNoYXJhY3RlcnMuCisgICAgICogQHBhcmFtICAgICAgbGVuICAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkLgorICAgICAqCisgICAgICogQHJldHVybiAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlCisgICAgICogICAgICAgICAgICAgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCByZWFkKGZpbmFsIGNoYXJbXSBjYnVmLCBmaW5hbCBpbnQgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2ggPSByZWFkKCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYnVmW29mZiArIGldID0gKGNoYXIpIGNoOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2tpcHMgY2hhcmFjdGVycy4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgc29tZSBjaGFyYWN0ZXJzIGFyZQorICAgICAqIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIG4gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSBza2lwcGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIDxjb2RlPm48L2NvZGU+IGlzIG5lZ2F0aXZlLgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGxvbmcgc2tpcChmaW5hbCBsb25nIG4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG4gPCAwTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2tpcCB2YWx1ZSBpcyBuZWdhdGl2ZSIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChsb25nIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAocmVhZCgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaW5pdGlhbGl6ZWQgc3RhdHVzLgorICAgICAqCisgICAgICogQHBhcmFtIGluaXRpYWxpemVkIFdoZXRoZXIgb3Igbm90IHRoZSBmaWx0ZXIgaXMgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0SW5pdGlhbGl6ZWQoZmluYWwgYm9vbGVhbiBpbml0aWFsaXplZCkgeworICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gaW5pdGlhbGl6ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgc3RhdHVzLgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsdGVyIGlzIGluaXRpYWxpemVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZ2V0SW5pdGlhbGl6ZWQoKSB7CisgICAgICAgIHJldHVybiBpbml0aWFsaXplZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcm9qZWN0IHRvIHdvcmsgd2l0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRoaXMgZmlsdGVyIGlzIHBhcnQgb2YuCisgICAgICogICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQcm9qZWN0KGZpbmFsIFByb2plY3QgcHJvamVjdCkgeworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByb2plY3QgdGhpcyBmaWx0ZXIgaXMgcGFydCBvZi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QgdGhpcyBmaWx0ZXIgaXMgcGFydCBvZgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgbGluZSBvZiB0ZXh0IGVuZGluZyB3aXRoICdcbicgKG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSkuCisgICAgICogVGhlIHJldHVybmVkIFN0cmluZyByZXRhaW5zIHRoZSAnXG4nLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGluZSByZWFkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgcmVhZGVyIHRocm93cyBvbmUgZHVyaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICByZWFkaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjaCA9IGluLnJlYWQoKTsKKworICAgICAgICBpZiAoY2ggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGxpbmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgd2hpbGUgKGNoICE9IC0xKSB7CisgICAgICAgICAgICBsaW5lLmFwcGVuZCAoKGNoYXIpIGNoKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGluZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgcmV0dXJuaW5nIHRoZSBjb250ZW50cyBhcyBhIFN0cmluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlbWFpbmluZyBjb250ZW50cyBvZiB0aGUgcmVhZGVyLCBhcyBhIFN0cmluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyByZWFkZXIgdGhyb3dzIG9uZSBkdXJpbmcKKyAgICAgKiAgICAgICAgICAgIHJlYWRpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHJlYWRGdWxseSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBGaWxlVXRpbHMucmVhZEZ1bGx5KGluLCBCVUZGRVJfU0laRSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9CYXNlUGFyYW1GaWx0ZXJSZWFkZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQmFzZVBhcmFtRmlsdGVyUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4YWE5YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQmFzZVBhcmFtRmlsdGVyUmVhZGVyLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcml6YWJsZTsKKworLyoqCisgKiBQYXJhbWV0ZXJpemVkIGJhc2UgY2xhc3MgZm9yIGNvcmUgZmlsdGVyIHJlYWRlcnMuCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVBhcmFtRmlsdGVyUmVhZGVyCisgICAgZXh0ZW5kcyBCYXNlRmlsdGVyUmVhZGVyCisgICAgaW1wbGVtZW50cyBQYXJhbWV0ZXJpemFibGUgeworICAgIC8qKiBUaGUgcGFzc2VkIGluIHBhcmFtZXRlciBhcnJheS4gKi8KKyAgICBwcml2YXRlIFBhcmFtZXRlcltdIHBhcmFtZXRlcnM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgImR1bW15IiBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAc2VlIEJhc2VGaWx0ZXJSZWFkZXIjQmFzZUZpbHRlclJlYWRlcigpCisgICAgICovCisgICAgcHVibGljIEJhc2VQYXJhbUZpbHRlclJlYWRlcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbHRlcmVkIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJhc2VQYXJhbUZpbHRlclJlYWRlcihmaW5hbCBSZWFkZXIgaW4pIHsKKyAgICAgICAgc3VwZXIoaW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhcmFtZXRlcnMgdXNlZCBieSB0aGlzIGZpbHRlciwgYW5kIHNldHMKKyAgICAgKiB0aGUgZmlsdGVyIHRvIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdHVzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBieSB0aGlzIGZpbHRlci4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFBhcmFtZXRlcnMoZmluYWwgUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgICAgICBzZXRJbml0aWFsaXplZChmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyB0byBiZSB1c2VkIGJ5IHRoaXMgZmlsdGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVycyB0byBiZSB1c2VkIGJ5IHRoaXMgZmlsdGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFBhcmFtZXRlcltdIGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ2hhaW5hYmxlUmVhZGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NoYWluYWJsZVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDYwMzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NoYWluYWJsZVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCisvKioKKyAqIEludGVyZmFjZSBpbmRpY2F0aW5nIHRoYXQgYSByZWFkZXIgbWF5IGJlIGNoYWluZWQgdG8gYW5vdGhlciBvbmUuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIENoYWluYWJsZVJlYWRlciB7CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHJlYWRlciB3aXRoIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gYXMgdGhpcyBvbmUsCisgICAgICogYnV0IGZpbHRlcmluZyBpbnB1dCBmcm9tIHRoZSBzcGVjaWZpZWQgcmVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJkciB0aGUgcmVhZGVyIHdoaWNoIHRoZSByZXR1cm5lZCByZWFkZXIgc2hvdWxkIGJlIGZpbHRlcmluZworICAgICAqCisgICAgICogQHJldHVybiBhIHJlYWRlciB3aXRoIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gYXMgdGhpcyBvbmUsIGJ1dAorICAgICAqICAgICAgICAgZmlsdGVyaW5nIGlucHV0IGZyb20gdGhlIHNwZWNpZmllZCByZWFkZXIKKyAgICAgKi8KKyAgICBSZWFkZXIgY2hhaW4oUmVhZGVyIHJkcik7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NsYXNzQ29uc3RhbnRzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NsYXNzQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmNzY0OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ2xhc3NDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFzc2VtYmxlcyB0aGUgY29uc3RhbnRzIGRlY2xhcmVkIGluIGEgSmF2YSBjbGFzcyBpbgorICogPGNvZGU+a2V5MT12YWx1ZTEobGluZSBzZXBhcmF0b3Ipa2V5Mj12YWx1ZTI8L2NvZGU+CisgKiBmb3JtYXQuCisgKjxwPgorICogTm90ZXM6CisgKiA8b2w+CisgKiA8bGk+VGhpcyBmaWx0ZXIgdXNlcyB0aGUgQkNFTCBleHRlcm5hbCB0b29sa2l0LgorICogPGxpPlRoaXMgYXNzZW1ibGVzIG9ubHkgdGhvc2UgY29uc3RhbnRzIHRoYXQgYXJlIG5vdCBjcmVhdGVkCisgKiB1c2luZyB0aGUgc3ludGF4IDxjb2RlPm5ldyB3aGF0ZXZlcigpPC9jb2RlPgorICogPGxpPlRoaXMgYXNzZW1ibGVzIGNvbnN0YW50cyBkZWNsYXJlZCB1c2luZyB0aGUgYmFzaWMgZGF0YXR5cGVzCisgKiBhbmQgU3RyaW5nIG9ubHkuPC9saT4KKyAqIDxsaT5UaGUgYWNjZXNzIG1vZGlmaWVycyBvZiB0aGUgZGVjbGFyZWQgY29uc3RhbnRzIGRvIG5vdCBtYXR0ZXIuPC9saT4KKyAqPC9vbD4KKyAqIEV4YW1wbGU6PGJyPgorICogPHByZT4mbHQ7Y2xhc3Njb25zdGFudHMvJmd0OzwvcHJlPgorICogT3I6CisgKiA8cHJlPiZsdDtmaWx0ZXJyZWFkZXIKKyAqICAgIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkNsYXNzQ29uc3RhbnRzJnF1b3Q7LyZndDs8L3ByZT4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENsYXNzQ29uc3RhbnRzCisgICAgZXh0ZW5kcyBCYXNlRmlsdGVyUmVhZGVyCisgICAgaW1wbGVtZW50cyBDaGFpbmFibGVSZWFkZXIgeworICAgIC8qKiBEYXRhIHRoYXQgbXVzdCBiZSByZWFkIGZyb20sIGlmIG5vdCBudWxsLiAqLworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXVlZERhdGEgPSBudWxsOworCisgICAgLyoqIEhlbHBlciBDbGFzcyB0byBiZSBpbnZva2VkIHZpYSByZWZsZWN0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0NMQVNTX0hFTFBFUiA9CisgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLnV0aWwuSmF2YUNsYXNzSGVscGVyIjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciAiZHVtbXkiIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBzZWUgQmFzZUZpbHRlclJlYWRlciNCYXNlRmlsdGVyUmVhZGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NDb25zdGFudHMoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXJlZCByZWFkZXIuIFRoZSBjb250ZW50cyBvZiB0aGUgcGFzc2VkLWluIHJlYWRlcgorICAgICAqIGFyZSBleHBlY3RlZCB0byBiZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZnJvbSB3aGljaCB0byBwcm9kdWNlIGEKKyAgICAgKiBsaXN0IG9mIGNvbnN0YW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIENsYXNzQ29uc3RhbnRzKGZpbmFsIFJlYWRlciBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYW5kIGFzc2VtYmxlcyB0aGUgY29uc3RhbnRzIGRlY2xhcmVkIGluIGEgY2xhc3MgZmlsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBsaXN0IG9mIGNvbnN0YW50cywgb3IgLTEKKyAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbgorICAgICAqIGR1cmluZyByZWFkaW5nLCBvciBpZiB0aGUgY29uc3RhbnRzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNhbm5vdAorICAgICAqIGJlIHJlYWQgKGZvciBleGFtcGxlIGR1ZSB0byB0aGUgY2xhc3Mgbm90IGJlaW5nIGZvdW5kKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGludCBjaCA9IC0xOworCisgICAgICAgIGlmIChxdWV1ZWREYXRhICE9IG51bGwgJiYgcXVldWVkRGF0YS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBxdWV1ZWREYXRhID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZWREYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoID0gcXVldWVkRGF0YS5jaGFyQXQoMCk7CisgICAgICAgICAgICBxdWV1ZWREYXRhID0gcXVldWVkRGF0YS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICBpZiAocXVldWVkRGF0YS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcXVldWVkRGF0YSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhenogPSByZWFkRnVsbHkoKTsKKyAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsIHx8IGNsYXp6Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjaCA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBjbGF6ei5nZXRCeXRlcygiSVNPLTg4NTktMSIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGphdmFDbGFzc0hlbHBlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKEpBVkFfQ0xBU1NfSEVMUEVSKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGphdmFDbGFzc0hlbHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1tdIHBhcmFtcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10uY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgZ2V0Q29uc3RhbnRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3NIZWxwZXIuZ2V0TWV0aG9kKCJnZXRDb25zdGFudHMiLCBwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gYXJncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldENvbnN0YW50cyBpcyBhIHN0YXRpYyBtZXRob2QsIG5vIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgaW4gdGhlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gKFN0cmluZ0J1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RhbnRzLmludm9rZShudWxsLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWREYXRhID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgTm9DbGFzc0RlZkZvdW5kRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChOb0NsYXNzRGVmRm91bmRFcnJvcikgdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgQ2xhc3NDb25zdGFudHMgdXNpbmcgdGhlIHBhc3NlZCBpbgorICAgICAqIFJlYWRlciBmb3IgaW5zdGFudGlhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZHIgQSBSZWFkZXIgb2JqZWN0IHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGJhc2VkIG9uIHRoaXMgY29uZmlndXJhdGlvbiwgYnV0IGZpbHRlcmluZworICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCByZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhZGVyIGNoYWluKGZpbmFsIFJlYWRlciByZHIpIHsKKyAgICAgICAgQ2xhc3NDb25zdGFudHMgbmV3RmlsdGVyID0gbmV3IENsYXNzQ29uc3RhbnRzKHJkcik7CisgICAgICAgIHJldHVybiBuZXdGaWx0ZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Db25jYXRGaWx0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ29uY2F0RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwOTQzYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ29uY2F0RmlsdGVyLmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKKworLyoqCisgKiBDb25jYXRzIGEgZmlsZSBiZWZvcmUgYW5kL29yIGFmdGVyIHRoZSBmaWxlLgorICoKKyAqIDxwPkV4YW1wbGU6PHByZT4KKyAqIDxjb3B5IHRvZGlyPSJidWlsZCI+CisgKiAgICAgPGZpbGVzZXQgZGlyPSJzcmMiIGluY2x1ZGVzPSIqLmphdmEiLz4KKyAqICAgICA8ZmlsdGVyY2hhaW4+CisgKiAgICAgICAgIDxjb25jYXRmaWx0ZXIgcHJlcGVuZD0iYXBhY2hlLWxpY2Vuc2UtamF2YS50eHQiLz4KKyAqICAgICA8L2ZpbHRlcmNoYWluPgorICogPC9jb3B5PgorICogPC9wcmU+CisgKiBDb3BpZXMgYWxsIGphdmEgc291cmNlcyBmcm9tIDxpPnNyYzwvaT4gdG8gPGk+YnVpbGQ8L2k+IGFuZCBhZGRzIHRoZQorICogY29udGVudCBvZiA8aT5hcGFjaGUtbGljZW5zZS1qYXZhLnR4dDwvaT4gYWRkIHRoZSBiZWdpbm5pbmcgb2YgZWFjaAorICogZmlsZS48L3A+CisgKgorICogQHNpbmNlIDEuNgorICogQHZlcnNpb24gMjAwMy0wOS0yMworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uY2F0RmlsdGVyIGV4dGVuZHMgQmFzZVBhcmFtRmlsdGVyUmVhZGVyCisgICAgaW1wbGVtZW50cyBDaGFpbmFibGVSZWFkZXIgeworCisgICAgLyoqIEZpbGUgdG8gYWRkIGJlZm9yZSB0aGUgY29udGVudC4gKi8KKyAgICBwcml2YXRlIEZpbGUgcHJlcGVuZDsKKworICAgIC8qKiBGaWxlIHRvIGFkZCBhZnRlciB0aGUgY29udGVudC4gKi8KKyAgICBwcml2YXRlIEZpbGUgYXBwZW5kOworCisgICAgLyoqIFJlYWRlciBmb3IgcHJlcGVuZC1maWxlLiAqLworICAgIHByaXZhdGUgUmVhZGVyIHByZXBlbmRSZWFkZXIgPSBudWxsOworCisgICAgLyoqIFJlYWRlciBmb3IgYXBwZW5kLWZpbGUuICovCisgICAgcHJpdmF0ZSBSZWFkZXIgYXBwZW5kUmVhZGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciAiZHVtbXkiIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBzZWUgQmFzZUZpbHRlclJlYWRlciNCYXNlRmlsdGVyUmVhZGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uY2F0RmlsdGVyKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsdGVyZWQgcmVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGluIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uY2F0RmlsdGVyKGZpbmFsIFJlYWRlciBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4gSWYgdGhlIGRlc2lyZWQKKyAgICAgKiBudW1iZXIgb2YgbGluZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCwgdGhlIHJlc3VsdGluZyBzdHJlYW0gaXMKKyAgICAgKiBlZmZlY3RpdmVseSBhdCBhbiBlbmQuIE90aGVyd2lzZSwgdGhlIG5leHQgY2hhcmFjdGVyIGZyb20gdGhlCisgICAgICogdW5kZXJseWluZyBzdHJlYW0gaXMgcmVhZCBhbmQgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbSwgb3IgLTEKKyAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbgorICAgICAqIGR1cmluZyByZWFkaW5nCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZG8gdGhlICJzaW5nbGV0b24iIGluaXRpYWxpemF0aW9uCisgICAgICAgIGlmICghZ2V0SW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY2ggPSAtMTsKKworICAgICAgICAvLyBUaGUgcmVhZGVycyByZXR1cm4gLTEgaWYgdGhleSBlbmQuIFNvIHNpbXBseSByZWFkIHRoZSAicHJlcGVuZCIKKyAgICAgICAgLy8gYWZ0ZXIgdGhhdCB0aGUgImNvbnRlbnQiIGFuZCBhdCB0aGUgZW5kIHRoZSAiYXBwZW5kIiBmaWxlLgorICAgICAgICBpZiAocHJlcGVuZFJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBjaCA9IHByZXBlbmRSZWFkZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKGNoID09IC0xKSB7CisgICAgICAgICAgICAgICAgLy8gSSBhbSB0aGUgb25seSBvbmUgc28gSSBoYXZlIHRvIGNsb3NlIHRoZSByZWFkZXIKKyAgICAgICAgICAgICAgICBwcmVwZW5kUmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcHJlcGVuZFJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoID09IC0xKSB7CisgICAgICAgICAgICBjaCA9IHN1cGVyLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIGRvbid0IGNhbGwgc3VwZXIuY2xvc2UoKSBiZWNhdXNlIHRoYXQgcmVhZGVyIGlzIHVzZWQKKyAgICAgICAgICAgIC8vIG9uIG90aGVyIHBsYWNlcyAuLi4KKyAgICAgICAgICAgIGlmIChhcHBlbmRSZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoID0gYXBwZW5kUmVhZGVyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSSBhbSB0aGUgb25seSBvbmUgc28gSSBoYXZlIHRvIGNsb3NlIHRoZSByZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kUmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZFJlYWRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgPGk+cHJlcGVuZDwvaT4gYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBwcmVwZW5kIG5ldyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZXBlbmQoZmluYWwgRmlsZSBwcmVwZW5kKSB7CisgICAgICAgIHRoaXMucHJlcGVuZCA9IHByZXBlbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8aT5wcmVwZW5kPC9pPiBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiBwcmVwZW5kIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFByZXBlbmQoKSB7CisgICAgICAgIHJldHVybiBwcmVwZW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgPGk+YXBwZW5kPC9pPiBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGFwcGVuZCBuZXcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBlbmQoZmluYWwgRmlsZSBhcHBlbmQpIHsKKyAgICAgICAgdGhpcy5hcHBlbmQgPSBhcHBlbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8aT5hcHBlbmQ8L2k+IGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIGFwcGVuZCBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRBcHBlbmQoKSB7CisgICAgICAgIHJldHVybiBhcHBlbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBDb25jYXRSZWFkZXIgdXNpbmcgdGhlIHBhc3NlZCBpbgorICAgICAqIFJlYWRlciBmb3IgaW5zdGFudGlhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZHIgQSBSZWFkZXIgb2JqZWN0IHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGJhc2VkIG9uIHRoaXMgY29uZmlndXJhdGlvbiwgYnV0IGZpbHRlcmluZworICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCByZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhZGVyIGNoYWluKGZpbmFsIFJlYWRlciByZHIpIHsKKyAgICAgICAgQ29uY2F0RmlsdGVyIG5ld0ZpbHRlciA9IG5ldyBDb25jYXRGaWx0ZXIocmRyKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldFByZXBlbmQoZ2V0UHJlcGVuZCgpKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldEFwcGVuZChnZXRBcHBlbmQoKSk7CisgICAgICAgIC8vIFVzdWFsbHkgdGhlIGluaXRpYWxpemVkIGlzIHNldCB0byB0cnVlLiBCdXQgaGVyZSBpdCBtdXN0IG5vdC4KKyAgICAgICAgLy8gQmVjYXVzZSB0aGUgcHJlcGVuZCBhbmQgYXBwZW5kIHJlYWRlcnMgaGF2ZSB0byBiZSBpbnN0YW50aWF0ZWQKKyAgICAgICAgLy8gb24gcnVudGltZQorICAgICAgICAvL25ld0ZpbHRlci5zZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG5ld0ZpbHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FucyB0aGUgcGFyYW1ldGVycyBsaXN0IGZvciB0aGUgImxpbmVzIiBwYXJhbWV0ZXIgYW5kIHVzZXMKKyAgICAgKiBpdCB0byBzZXQgdGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmlsdGVyZWQgc3RyZWFtLgorICAgICAqIGFsc28gc2NhbiBmb3Igc2tpcCBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBnZXQgcGFyYW1ldGVycworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoInByZXBlbmQiLmVxdWFscyhwYXJhbXNbaV0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRQcmVwZW5kKG5ldyBGaWxlKHBhcmFtc1tpXS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoImFwcGVuZCIuZXF1YWxzKHBhcmFtc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEFwcGVuZChuZXcgRmlsZShwYXJhbXNbaV0uZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXBlbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFwcmVwZW5kLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIHByZXBlbmQgPSBuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBwcmVwZW5kLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmVwZW5kUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHByZXBlbmQpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwZW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghYXBwZW5kLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGFwcGVuZCA9IG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIGFwcGVuZC5nZXRQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwZW5kUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFwcGVuZCkpOworICAgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0VzY2FwZVVuaWNvZGUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvRXNjYXBlVW5pY29kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OGFkMzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0VzY2FwZVVuaWNvZGUuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworLyoqCisgKiBUaGlzIG1ldGhvZCBjb252ZXJ0cyBub24tbGF0aW4gY2hhcmFjdGVycyB0byB1bmljb2RlIGVzY2FwZXMuCisgKiBVc2VmdWwgdG8gbG9hZCBwcm9wZXJ0aWVzIGNvbnRhaW5pbmcgbm9uIGxhdGluCisgKiBFeGFtcGxlOgorICoKKyAqIDxwcmU+Jmx0O2VzY2FwZXVuaWNvZGUmZ3Q7PC9wcmU+CisgKgorICogT3I6CisgKgorICogPHByZT4mbHQ7ZmlsdGVycmVhZGVyCisgICAgICAgIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkVzY2FwZVVuaWNvZGUmcXVvdDsvJmd0OworICogIDwvcHJlPgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBFc2NhcGVVbmljb2RlCisgICAgZXh0ZW5kcyBCYXNlUGFyYW1GaWx0ZXJSZWFkZXIKKyAgICBpbXBsZW1lbnRzIENoYWluYWJsZVJlYWRlciB7CisgICAgLy90aGlzIGZpZWxkIHdpbGwgaG9sZCB1bm5ubiByaWdodCBhZnRlciByZWFkaW5nIGEgbm9uIGxhdGluIGNoYXJhY3RlcgorICAgIC8vYWZ0ZXJ3YXJkcyBpdCB3aWxsIGJlIHRydW5jYXRlZCBvZiBvbmUgY2hhciBldmVyeSBjYWxsIHRvIHJlYWQKKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciB1bmljb2RlQnVmOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yICJkdW1teSIgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNlZSBCYXNlRmlsdGVyUmVhZGVyI0Jhc2VGaWx0ZXJSZWFkZXIoKQorICAgICAqLworICAgIHB1YmxpYyBFc2NhcGVVbmljb2RlKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICB1bmljb2RlQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsdGVyZWQgcmVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGluIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXNjYXBlVW5pY29kZShmaW5hbCBSZWFkZXIgaW4pIHsKKyAgICAgICAgc3VwZXIoaW4pOworICAgICAgICB1bmljb2RlQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0sIGNvbnZlcnRpbmcgbm9uIGxhdGluCisgICAgICogY2hhcmFjdGVycyB0byB1bmljb2RlIGVzY2FwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbSwgb3IgLTEKKyAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cworICAgICAqIGFuIElPRXhjZXB0aW9uIGR1cmluZyByZWFkaW5nCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFnZXRJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgICAgICBzZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjaCA9IC0xOworICAgICAgICBpZiAodW5pY29kZUJ1Zi5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGNoYXIgYWNoYXIgPSAoY2hhcikgY2g7CisgICAgICAgICAgICAgICAgaWYgKGFjaGFyID49ICdcdTAwODAnKSB7CisgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1MDAwMCIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IEludGVnZXIudG9IZXhTdHJpbmcoY2gpOworICAgICAgICAgICAgICAgICAgICAvL3JlcGxhY2UgdGhlIGxhc3QgMHMgYnkgdGhlIGNoYXJzIGNvbnRhaW5lZCBpbiBzCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlQnVmLnNldENoYXJBdCh1bmljb2RlQnVmLmxlbmd0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHMubGVuZ3RoKCkgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jaGFyQXQoaSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoID0gJ1xcJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaCA9IChpbnQpIHVuaWNvZGVCdWYuY2hhckF0KDApOworICAgICAgICAgICAgdW5pY29kZUJ1Zi5kZWxldGVDaGFyQXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgRXNjYXBlVW5pY29kZSB1c2luZyB0aGUgcGFzc2VkIGluCisgICAgICogUmVhZGVyIGZvciBpbnN0YW50aWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJkciBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyBmaWx0ZXIgYmFzZWQgb24gdGhpcyBjb25maWd1cmF0aW9uLCBidXQgZmlsdGVyaW5nCisgICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIHJlYWRlcgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZWFkZXIgY2hhaW4oZmluYWwgUmVhZGVyIHJkcikgeworICAgICAgICBFc2NhcGVVbmljb2RlIG5ld0ZpbHRlciA9IG5ldyBFc2NhcGVVbmljb2RlKHJkcik7CisgICAgICAgIG5ld0ZpbHRlci5zZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG5ld0ZpbHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHBhcmFtZXRlcnMgKGN1cnJlbnRseSB1bnVzZWQpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0V4cGFuZFByb3BlcnRpZXMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvRXhwYW5kUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2NlNWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0V4cGFuZFByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIEV4cGFuZHMgQW50IHByb3BlcnRpZXMsIGlmIGFueSwgaW4gdGhlIGRhdGEuCisgKiA8cD4KKyAqIEV4YW1wbGU6PGJyPgorICogPHByZT4mbHQ7ZXhwYW5kcHJvcGVydGllcy8mZ3Q7PC9wcmU+CisgKiBPcjoKKyAqIDxwcmU+Jmx0O2ZpbHRlcnJlYWRlcgorICogICAgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuRXhwYW5kUHJvcGVydGllcyZxdW90Oy8mZ3Q7PC9wcmU+CisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXhwYW5kUHJvcGVydGllcworICAgIGV4dGVuZHMgQmFzZUZpbHRlclJlYWRlcgorICAgIGltcGxlbWVudHMgQ2hhaW5hYmxlUmVhZGVyIHsKKyAgICAvKiogRGF0YSB0aGF0IG11c3QgYmUgcmVhZCBmcm9tLCBpZiBub3QgbnVsbC4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBxdWV1ZWREYXRhID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciAiZHVtbXkiIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBzZWUgQmFzZUZpbHRlclJlYWRlciNCYXNlRmlsdGVyUmVhZGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwYW5kUHJvcGVydGllcygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbHRlcmVkIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEV4cGFuZFByb3BlcnRpZXMoZmluYWwgUmVhZGVyIGluKSB7CisgICAgICAgIHN1cGVyKGluKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgZmlsdGVyZWQgc3RyZWFtLiBUaGUgb3JpZ2luYWwKKyAgICAgKiBzdHJlYW0gaXMgZmlyc3QgcmVhZCBpbiBmdWxseSwgYW5kIHRoZSBBbnQgcHJvcGVydGllcyBhcmUgZXhwYW5kZWQuCisgICAgICogVGhlIHJlc3VsdHMgb2YgdGhpcyBleHBhbnNpb24gYXJlIHRoZW4gcXVldWVkIHNvIHRoZXkgY2FuIGJlIHJlYWQKKyAgICAgKiBjaGFyYWN0ZXItYnktY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHJlc3VsdGluZyBzdHJlYW0sIG9yIC0xCisgICAgICogaWYgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSB0aHJvd3MgYW4gSU9FeGNlcHRpb24KKyAgICAgKiBkdXJpbmcgcmVhZGluZworICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGNoID0gLTE7CisKKyAgICAgICAgaWYgKHF1ZXVlZERhdGEgIT0gbnVsbCAmJiBxdWV1ZWREYXRhLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHF1ZXVlZERhdGEgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHF1ZXVlZERhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgY2ggPSBxdWV1ZWREYXRhLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIHF1ZXVlZERhdGEgPSBxdWV1ZWREYXRhLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIGlmIChxdWV1ZWREYXRhLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBxdWV1ZWREYXRhID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHF1ZXVlZERhdGEgPSByZWFkRnVsbHkoKTsKKyAgICAgICAgICAgIGlmIChxdWV1ZWREYXRhID09IG51bGwgfHwgcXVldWVkRGF0YS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2ggPSAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgICAgIHF1ZXVlZERhdGEgPSBwcm9qZWN0LnJlcGxhY2VQcm9wZXJ0aWVzKHF1ZXVlZERhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiByZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgRXhwYW5kUHJvcGVydGllcyBmaWx0ZXIgdXNpbmcgdGhlIHBhc3NlZCBpbgorICAgICAqIFJlYWRlciBmb3IgaW5zdGFudGlhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZHIgQSBSZWFkZXIgb2JqZWN0IHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGJhc2VkIG9uIHRoaXMgY29uZmlndXJhdGlvbiwgYnV0IGZpbHRlcmluZworICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCByZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhZGVyIGNoYWluKGZpbmFsIFJlYWRlciByZHIpIHsKKyAgICAgICAgRXhwYW5kUHJvcGVydGllcyBuZXdGaWx0ZXIgPSBuZXcgRXhwYW5kUHJvcGVydGllcyhyZHIpOworICAgICAgICBuZXdGaWx0ZXIuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICByZXR1cm4gbmV3RmlsdGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvRml4Q3JMZkZpbHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9GaXhDckxmRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWI4OGQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvRml4Q3JMZkZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTAwOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKKworLyoqCisgKiBDb252ZXJ0cyB0ZXh0IHRvIGxvY2FsIE9TIGZvcm1hdHRpbmcgY29udmVudGlvbnMsIGFzIHdlbGwgYXMgcmVwYWlyIHRleHQKKyAqIGRhbWFnZWQgYnkgbWlzY29uZmlndXJlZCBvciBtaXNndWlkZWQgZWRpdG9ycyBvciBmaWxlIHRyYW5zZmVyIHByb2dyYW1zLgorICogPHA+CisgKiBUaGlzIGZpbHRlciBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyAqIDx1bD4KKyAqIDxsaT5lb2YKKyAqIDxsaT5lb2wKKyAqIDxsaT5maXhsYXN0CisgKiA8bGk+amF2YWZpbGVzCisgKiA8bGk+dGFiCisgKiA8bGk+dGFibGVuZ3RoCisgKiA8L3VsPgorICogTm9uZSBvZiB3aGljaCBhcmUgcmVxdWlyZWQuCisgKiA8cD4KKyAqIFRoaXMgdmVyc2lvbiBnZW5lcmFsaXNlcyB0aGUgaGFuZGxpbmcgb2YgRU9MIGNoYXJhY3RlcnMsIGFuZCBhbGxvd3MgZm9yCisgKiBDUi1vbmx5IGxpbmUgZW5kaW5ncyAodGhlIHN0YW5kYXJkIG9uIE1hYyBzeXN0ZW1zIHByaW9yIHRvIE9TIFgpLiBUYWIKKyAqIGhhbmRsaW5nIGhhcyBhbHNvIGJlZW4gZ2VuZXJhbGlzZWQgdG8gYWNjb21tb2RhdGUgYW55IHRhYndpZHRoIGZyb20gMiB0byA4MCwKKyAqIGluY2x1c2l2ZS4gSW1wb3J0YW50bHksIGl0IGNhbiBsZWF2ZSB1bnRvdWNoZWQgYW55IGxpdGVyYWwgVEFCIGNoYXJhY3RlcnMKKyAqIGVtYmVkZGVkIHdpdGhpbiBKYXZhIHN0cmluZyBvciBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICogPHA+CisgKiA8ZW0+Q2F1dGlvbjo8L2VtPiBydW4gd2l0aCBjYXJlIG9uIGNhcmVmdWxseSBmb3JtYXR0ZWQgZmlsZXMuIFRoaXMgbWF5CisgKiBzb3VuZCBvYnZpb3VzLCBidXQgaWYgeW91IGRvbid0IHNwZWNpZnkgYXNpcywgcHJlc3VtZSB0aGF0IHlvdXIgZmlsZXMgYXJlCisgKiBnb2luZyB0byBiZSBtb2RpZmllZC4gSWYgInRhYnMiIGlzICJhZGQiIG9yICJyZW1vdmUiLCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKKyAqIG1heSBiZSBhZGRlZCBvciByZW1vdmVkIGFzIG5lY2Vzc2FyeS4gU2ltaWxhcmx5LCBmb3IgRU9McywgZW9sPSJhc2lzIgorICogYWN0dWFsbHkgbWVhbnMgY29udmVydCB0byB5b3VyIG5hdGl2ZSBPL1MgRU9MIGNvbnZlbnRpb24gd2hpbGUgZW9sPSJjcmxmIiBvcgorICogY3I9ImFkZCIgY2FuIHJlc3VsdCBpbiBDUiBjaGFyYWN0ZXJzIGJlaW5nIHJlbW92ZWQgaW4gb25lIHNwZWNpYWwgY2FzZQorICogYWNjb21tb2RhdGVkLCBpLmUuLCBDUkNSTEYgaXMgcmVnYXJkZWQgYXMgYSBzaW5nbGUgRU9MIHRvIGhhbmRsZSBjYXNlcyB3aGVyZQorICogb3RoZXIgcHJvZ3JhbXMgaGF2ZSBjb252ZXJ0ZWQgQ1JMRiBpbnRvIENSQ1JMRi4KKyAqCisgKiA8UD4KKyAqIEV4YW1wbGU6CisgKgorICogPHByZT4KKyAqICZsdDsmbHQ7Zml4Y3JsZiB0YWI9JnF1b3Q7YWRkJnF1b3Q7IGVvbD0mcXVvdDtjcmxmJnF1b3Q7IGVvZj0mcXVvdDthc2lzJnF1b3Q7LyZndDsKKyAqIDwvcHJlPgorICoKKyAqIE9yOgorICoKKyAqIDxwcmU+CisgKiAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkZpeENyTGZGaWx0ZXImcXVvdDsmZ3Q7CisgKiAgICZsdDtwYXJhbSBlb2w9JnF1b3Q7Y3JsZiZxdW90OyB0YWI9JnF1b3Q7YXNpcyZxdW90Oy8mZ3Q7CisgKiAgJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7CisgKiA8L3ByZT4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGaXhDckxmRmlsdGVyIGV4dGVuZHMgQmFzZVBhcmFtRmlsdGVyUmVhZGVyIGltcGxlbWVudHMgQ2hhaW5hYmxlUmVhZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9UQUJfTEVOR1RIID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1RBQl9MRU5HVEggPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVEFCX0xFTkdUSCA9IDgwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ1RSTFogPSAnXHUwMDFBJzsKKworICAgIHByaXZhdGUgaW50IHRhYkxlbmd0aCA9IERFRkFVTFRfVEFCX0xFTkdUSDsKKworICAgIHByaXZhdGUgQ3JMZiBlb2w7CisKKyAgICBwcml2YXRlIEFkZEFzaXNSZW1vdmUgY3RybHo7CisKKyAgICBwcml2YXRlIEFkZEFzaXNSZW1vdmUgdGFiczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBqYXZhZmlsZXMgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBmaXhsYXN0ID0gdHJ1ZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yICJkdW1teSIgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNlZSBCYXNlRmlsdGVyUmVhZGVyI0Jhc2VGaWx0ZXJSZWFkZXIoKQorICAgICAqLworICAgIHB1YmxpYyBGaXhDckxmRmlsdGVyKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBmaWx0ZXJlZCByZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4KKyAgICAgKiAgICAgICAgICAgIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRml4Q3JMZkZpbHRlcihmaW5hbCBSZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGluKTsKKyAgICB9CisKKyAgICAvLyBJbnN0YW5jZSBpbml0aWFsaXplcjogRXhlY3V0ZXMganVzdCBhZnRlciB0aGUgc3VwZXIoKSBjYWxsIGluIHRoaXMKKyAgICAvLyBjbGFzcydzIGNvbnN0cnVjdG9yLgorICAgIHsKKyAgICAgICAgdGFicyA9IEFkZEFzaXNSZW1vdmUuQVNJUzsKKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJtYWMiKSAmJiAhT3MuaXNGYW1pbHkoInVuaXgiKSkgeworICAgICAgICAgICAgY3RybHogPSBBZGRBc2lzUmVtb3ZlLlJFTU9WRTsKKyAgICAgICAgICAgIHNldEVvbChDckxmLk1BQyk7CisgICAgICAgIH0gZWxzZSBpZiAoT3MuaXNGYW1pbHkoImRvcyIpKSB7CisgICAgICAgICAgICBjdHJseiA9IEFkZEFzaXNSZW1vdmUuQVNJUzsKKyAgICAgICAgICAgIHNldEVvbChDckxmLkRPUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdHJseiA9IEFkZEFzaXNSZW1vdmUuUkVNT1ZFOworICAgICAgICAgICAgc2V0RW9sKENyTGYuVU5JWCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgRml4Q3JMZkZpbHRlciB1c2luZyB0aGUgcGFzc2VkIGluIFJlYWRlciBmb3IgaW5zdGFudGlhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZHIKKyAgICAgKiAgICAgICAgICAgIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBiYXNlZCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24sIGJ1dCBmaWx0ZXJpbmcgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgcmVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBSZWFkZXIgY2hhaW4oZmluYWwgUmVhZGVyIHJkcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRml4Q3JMZkZpbHRlciBuZXdGaWx0ZXIgPSBuZXcgRml4Q3JMZkZpbHRlcihyZHIpOworCisgICAgICAgICAgICBuZXdGaWx0ZXIuc2V0SmF2YWZpbGVzKGdldEphdmFmaWxlcygpKTsKKyAgICAgICAgICAgIG5ld0ZpbHRlci5zZXRFb2woZ2V0RW9sKCkpOworICAgICAgICAgICAgbmV3RmlsdGVyLnNldFRhYihnZXRUYWIoKSk7CisgICAgICAgICAgICBuZXdGaWx0ZXIuc2V0VGFibGVuZ3RoKGdldFRhYmxlbmd0aCgpKTsKKyAgICAgICAgICAgIG5ld0ZpbHRlci5zZXRFb2YoZ2V0RW9mKCkpOworICAgICAgICAgICAgbmV3RmlsdGVyLnNldEZpeGxhc3QoZ2V0Rml4bGFzdCgpKTsKKyAgICAgICAgICAgIG5ld0ZpbHRlci5pbml0SW50ZXJuYWxGaWx0ZXJzKCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXdGaWx0ZXI7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBob3cgRE9TIEVPRiAoY29udHJvbC16KSBjaGFyYWN0ZXJzIGFyZSBiZWluZyBoYW5kbGVkLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZXM6CisgICAgICogICAgICAgICA8dWw+CisgICAgICogICAgICAgICA8bGk+YWRkOiBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhbiBlb2YgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZQorICAgICAqICAgICAgICAgPGxpPmFzaXM6IGxlYXZlIGVvZiBjaGFyYWN0ZXJzIGFsb25lCisgICAgICogICAgICAgICA8bGk+cmVtb3ZlOiByZW1vdmUgYW55IGVvZiBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZAorICAgICAqICAgICAgICAgPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWRkQXNpc1JlbW92ZSBnZXRFb2YoKSB7CisgICAgICAgIC8vIFJldHVybiBjb3B5IHNvIHRoYXQgdGhlIGNhbGwgbXVzdCBjYWxsIHNldEVvZigpIHRvIGNoYW5nZSB0aGUgc3RhdGUKKyAgICAgICAgLy8gb2YgZml4Q1JMRgorICAgICAgICByZXR1cm4gY3RybHoubmV3SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgaG93IEVuZE9mTGluZSBjaGFyYWN0ZXJzIGFyZSBiZWluZyBoYW5kbGVkLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZXM6CisgICAgICogICAgICAgICA8dWw+CisgICAgICogICAgICAgICA8bGk+YXNpczogY29udmVydCBsaW5lIGVuZGluZ3MgdG8geW91ciBPL1MgY29udmVudGlvbgorICAgICAqICAgICAgICAgPGxpPmNyOiBjb252ZXJ0IGxpbmUgZW5kaW5ncyB0byBDUgorICAgICAqICAgICAgICAgPGxpPmxmOiBjb252ZXJ0IGxpbmUgZW5kaW5ncyB0byBMRgorICAgICAqICAgICAgICAgPGxpPmNybGY6IGNvbnZlcnQgbGluZSBlbmRpbmdzIHRvIENSTEYKKyAgICAgKiAgICAgICAgIDwvdWw+CisgICAgICovCisgICAgcHVibGljIENyTGYgZ2V0RW9sKCkgeworICAgICAgICAvLyBSZXR1cm4gY29weSBzbyB0aGF0IHRoZSBjYWxsIG11c3QgY2FsbCBzZXRFb2woKSB0byBjaGFuZ2UgdGhlIHN0YXRlCisgICAgICAgIC8vIG9mIGZpeENSTEYKKyAgICAgICAgcmV0dXJuIGVvbC5uZXdJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB3aGV0aGVyIGEgbWlzc2luZyBFT0wgYmUgYWRkZWQgdG8gdGhlIGZpbmFsIGxpbmUgb2YgdGhlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIGZpbHRlcmVkIGZpbGUgd2lsbCBhbHdheXMgZW5kIHdpdGggYW4gRU9MCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Rml4bGFzdCgpIHsKKyAgICAgICAgcmV0dXJuIGZpeGxhc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHdoZXRoZXIgdGhlIHN0cmVhbSBpcyB0byBiZSB0cmVhdGVkIGFzIHRob3VnaCBpdCBjb250YWlucyBKYXZhCisgICAgICogc291cmNlLgorICAgICAqIDxQPgorICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIG9ubHkgdXNlZCBpbiBhc3NvY2F0aW9uIHdpdGggdGhlICZxdW90OzxpPjxiPnRhYjwvYj48L2k+JnF1b3Q7CisgICAgICogYXR0cmlidXRlLiBUYWJzIGZvdW5kIGluIEphdmEgbGl0ZXJhbHMgYXJlIHByb3RlY3RlZCBmcm9tIGNoYW5nZXMgYnkgdGhpcworICAgICAqIGZpbHRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3aGl0ZXNwYWNlIGluIEphdmEgY2hhcmFjdGVyIGFuZCBzdHJpbmcgbGl0ZXJhbHMgaXMKKyAgICAgKiAgICAgICAgIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SmF2YWZpbGVzKCkgeworICAgICAgICByZXR1cm4gamF2YWZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBob3cgdGFiIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGhhbmRsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbHVlczoKKyAgICAgKiAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgIDxsaT5hZGQ6IGNvbnZlcnQgc2VxdWVuY2VzIG9mIHNwYWNlcyB3aGljaCBzcGFuIGEgdGFiIHN0b3AgdG8KKyAgICAgKiAgICAgICAgIHRhYnMKKyAgICAgKiAgICAgICAgIDxsaT5hc2lzOiBsZWF2ZSB0YWIgYW5kIHNwYWNlIGNoYXJhY3RlcnMgYWxvbmUKKyAgICAgKiAgICAgICAgIDxsaT5yZW1vdmU6IGNvbnZlcnQgdGFicyB0byBzcGFjZXMKKyAgICAgKiAgICAgICAgIDwvdWw+CisgICAgICovCisgICAgcHVibGljIEFkZEFzaXNSZW1vdmUgZ2V0VGFiKCkgeworICAgICAgICAvLyBSZXR1cm4gY29weSBzbyB0aGF0IHRoZSBjYWxsZXIgbXVzdCBjYWxsIHNldFRhYigpIHRvIGNoYW5nZSB0aGUgc3RhdGUKKyAgICAgICAgLy8gb2YgZml4Q1JMRi4KKyAgICAgICAgcmV0dXJuIHRhYnMubmV3SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRhYiBsZW5ndGggdG8gdXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRhYiBpbiBzcGFjZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRhYmxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRhYkxlbmd0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2FsY3VsYXRlRW9sU3RyaW5nKENyTGYgZW9sKSB7CisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgRU9MIHN0cmluZyBwZXIgdGhlIGN1cnJlbnQgY29uZmlnCisgICAgICAgIGlmIChlb2wgPT0gQ3JMZi5BU0lTKSB7CisgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICB9CisgICAgICAgIGlmIChlb2wgPT0gQ3JMZi5DUiB8fCBlb2wgPT0gQ3JMZi5NQUMpIHsKKyAgICAgICAgICAgIHJldHVybiAiXHIiOworICAgICAgICB9CisgICAgICAgIGlmIChlb2wgPT0gQ3JMZi5DUkxGIHx8IGVvbCA9PSBDckxmLkRPUykgeworICAgICAgICAgICAgcmV0dXJuICJcclxuIjsKKyAgICAgICAgfQorICAgICAgICAvLyBhc3N1bWUgKGVvbCA9PSBDckxmLkxGIHx8IGVvbCA9PSBDckxmLlVOSVgpCisgICAgICAgIHJldHVybiAiXG4iOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgdGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBpbnRlcm5hbCBmaWx0ZXJzIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRJbnRlcm5hbEZpbHRlcnMoKSB7CisKKyAgICAgICAgLy8gSWYgSSdtIHJlbW92aW5nIGFuIEVPRiBjaGFyYWN0ZXIsIGRvIHNvIGZpcnN0IHNvIHRoYXQgdGhlIG90aGVyCisgICAgICAgIC8vIGZpbHRlcnMgZG9uJ3Qgc2VlIHRoYXQgY2hhcmFjdGVyLgorICAgICAgICBpbiA9IChjdHJseiA9PSBBZGRBc2lzUmVtb3ZlLlJFTU9WRSkgPyBuZXcgUmVtb3ZlRW9mRmlsdGVyKGluKSA6IGluOworCisgICAgICAgIC8vIENoYW5nZSBhbGwgRU9MIGNoYXJhY3RlcnMgdG8gbWF0Y2ggdGhlIGNhbGN1bGF0ZWQgRU9MIHN0cmluZy4gSWYKKyAgICAgICAgLy8gY29uZmlndXJlZCB0byBkbyBzbywgYXBwZW5kIGEgdHJhaWxpbmcgRU9MIHNvIHRoYXQgdGhlIGZpbGUgZW5kcyBvbgorICAgICAgICAvLyBhIEVPTC4KKyAgICAgICAgaW4gPSBuZXcgTm9ybWFsaXplRW9sRmlsdGVyKGluLCBjYWxjdWxhdGVFb2xTdHJpbmcoZW9sKSwgZ2V0Rml4bGFzdCgpKTsKKworICAgICAgICBpZiAodGFicyAhPSBBZGRBc2lzUmVtb3ZlLkFTSVMpIHsKKyAgICAgICAgICAgIC8vIElmIGZpbHRlcmluZyBKYXZhIHNvdXJjZSwgcHJldmVudCBjaGFuZ2VzIHRvIHdoaXRlc3BhY2UgaW4KKyAgICAgICAgICAgIC8vIGNoYXJhY3RlciBhbmQgc3RyaW5nIGxpdGVyYWxzLgorICAgICAgICAgICAgaWYgKGdldEphdmFmaWxlcygpKSB7CisgICAgICAgICAgICAgICAgaW4gPSBuZXcgTWFza0phdmFUYWJMaXRlcmFsc0ZpbHRlcihpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBZGQvUmVtb3ZlIHRhYnMKKyAgICAgICAgICAgIGluID0gKHRhYnMgPT0gQWRkQXNpc1JlbW92ZS5BREQpID8gKFJlYWRlcikgbmV3IEFkZFRhYkZpbHRlcihpbiwgZ2V0VGFibGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIDogKFJlYWRlcikgbmV3IFJlbW92ZVRhYkZpbHRlcihpbiwgZ2V0VGFibGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCBtaXNzaW5nIEVPRiBjaGFyYWN0ZXIKKyAgICAgICAgaW4gPSAoY3RybHogPT0gQWRkQXNpc1JlbW92ZS5BREQpID8gbmV3IEFkZEVvZkZpbHRlcihpbikgOiBpbjsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSByZXN1bHRpbmcgc3RyZWFtLCBvciAtMSBpZiB0aGUgZW5kIG9mCisgICAgICogICAgICAgICB0aGUgcmVzdWx0aW5nIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSB0aHJvd3MgYW4gSU9FeGNlcHRpb24gZHVyaW5nCisgICAgICogICAgICAgICAgICAgICAgcmVhZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAgICAgICAgICAgaW5pdEludGVybmFsRmlsdGVycygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbi5yZWFkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmeSBob3cgRE9TIEVPRiAoY29udHJvbC16KSBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHIKKyAgICAgKiAgICAgICAgICAgIHZhbGlkIHZhbHVlczoKKyAgICAgKiAgICAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgICAgIDxsaT5hZGQ6IGVuc3VyZSB0aGF0IHRoZXJlIGlzIGFuIGVvZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCisgICAgICogICAgICAgICAgICA8bGk+YXNpczogbGVhdmUgZW9mIGNoYXJhY3RlcnMgYWxvbmUKKyAgICAgKiAgICAgICAgICAgIDxsaT5yZW1vdmU6IHJlbW92ZSBhbnkgZW9mIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kCisgICAgICogICAgICAgICAgICA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVvZihBZGRBc2lzUmVtb3ZlIGF0dHIpIHsKKyAgICAgICAgY3RybHogPSBhdHRyLnJlc29sdmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IGhvdyBlbmQgb2YgbGluZSAoRU9MKSBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHIKKyAgICAgKiAgICAgICAgICAgIHZhbGlkIHZhbHVlczoKKyAgICAgKiAgICAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgICAgIDxsaT5hc2lzOiBjb252ZXJ0IGxpbmUgZW5kaW5ncyB0byB5b3VyIE8vUyBjb252ZW50aW9uCisgICAgICogICAgICAgICAgICA8bGk+Y3I6IGNvbnZlcnQgbGluZSBlbmRpbmdzIHRvIENSCisgICAgICogICAgICAgICAgICA8bGk+bGY6IGNvbnZlcnQgbGluZSBlbmRpbmdzIHRvIExGCisgICAgICogICAgICAgICAgICA8bGk+Y3JsZjogY29udmVydCBsaW5lIGVuZGluZ3MgdG8gQ1JMRgorICAgICAqICAgICAgICAgICAgPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFb2woQ3JMZiBhdHRyKSB7CisgICAgICAgIGVvbCA9IGF0dHIucmVzb2x2ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgd2hldGhlciBhIG1pc3NpbmcgRU9MIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpbmFsIGxpbmUgb2YgaW5wdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZml4bGFzdAorICAgICAqICAgICAgICAgICAgaWYgdHJ1ZSBhIG1pc3NpbmcgRU9MIHdpbGwgYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rml4bGFzdChib29sZWFuIGZpeGxhc3QpIHsKKyAgICAgICAgdGhpcy5maXhsYXN0ID0gZml4bGFzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgc3RyZWFtIGNvbnRhaW5zIEphdmEgc291cmNlLgorICAgICAqCisgICAgICogVGhpcyBhdHRyaWJ1dGUgaXMgb25seSB1c2VkIGluIGFzc29jYXRpb24gd2l0aCB0aGUgJnF1b3Q7PGk+PGI+dGFiPC9iPjwvaT4mcXVvdDsKKyAgICAgKiBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YWZpbGVzCisgICAgICogICAgICAgICAgICBzZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IHRoaXMgZmlsdGVyIGZyb20gY2hhbmdpbmcgdGFicyBmb3VuZCBpbgorICAgICAqICAgICAgICAgICAgSmF2YSBsaXRlcmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhZmlsZXMoYm9vbGVhbiBqYXZhZmlsZXMpIHsKKyAgICAgICAgdGhpcy5qYXZhZmlsZXMgPSBqYXZhZmlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmeSBob3cgdGFiIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cgorICAgICAqICAgICAgICAgICAgdmFsaWQgdmFsdWVzOgorICAgICAqICAgICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgICAgPGxpPmFkZDogY29udmVydCBzZXF1ZW5jZXMgb2Ygc3BhY2VzIHdoaWNoIHNwYW4gYSB0YWIgc3RvcCB0bworICAgICAqICAgICAgICAgICAgdGFicworICAgICAqICAgICAgICAgICAgPGxpPmFzaXM6IGxlYXZlIHRhYiBhbmQgc3BhY2UgY2hhcmFjdGVycyBhbG9uZQorICAgICAqICAgICAgICAgICAgPGxpPnJlbW92ZTogY29udmVydCB0YWJzIHRvIHNwYWNlcworICAgICAqICAgICAgICAgICAgPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWIoQWRkQXNpc1JlbW92ZSBhdHRyKSB7CisgICAgICAgIHRhYnMgPSBhdHRyLnJlc29sdmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHRhYiBsZW5ndGggaW4gY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWJMZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHNwZWNpZnkgdGhlIGxlbmd0aCBvZiB0YWIgaW4gc3BhY2VzLiBWYWxpZCB2YWx1ZXMgYXJlIGJldHdlZW4KKyAgICAgKiAgICAgICAgICAgIDIgYW5kIDgwIGluY2x1c2l2ZS4gVGhlIGRlZmF1bHQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIDguCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZW5ndGgoaW50IHRhYkxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRhYkxlbmd0aCA8IE1JTl9UQUJfTEVOR1RICisgICAgICAgICAgICB8fCB0YWJMZW5ndGggPiBNQVhfVEFCX0xFTkdUSCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJ0YWJsZW5ndGggbXVzdCBiZSBiZXR3ZWVuICIgKyBNSU5fVEFCX0xFTkdUSAorICAgICAgICAgICAgICAgICsgIiBhbmQgIiArIE1BWF9UQUJfTEVOR1RIKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRhYkxlbmd0aCA9IHRhYkxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZpbHRlciByZWFkZXIgcmVkaXJlY3RzIGFsbCByZWFkIEkvTyBtZXRob2RzIHRocm91Z2ggaXRzIG93biByZWFkKCkKKyAgICAgKiBtZXRob2QuCisgICAgICoKKyAgICAgKiA8UD4KKyAgICAgKiBUaGUgaW5wdXQgc3RyZWFtIGlzIGFscmVhZHkgYnVmZmVyZWQgYnkgdGhlIGNvcHkgdGFzayBzbyB0aGlzIGRvZXNuJ3QKKyAgICAgKiBzaWduaWZpY2FudGx5IGltcGFjdCBwZXJmb3JtYW5jZSB3aGlsZSBpdCBtYWtlcyB3cml0aW5nIHRoZSBpbmRpdmlkdWFsCisgICAgICogZml4IGZpbHRlcnMgbXVjaCBlYXNpZXIuCisgICAgICogPC9QPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNpbXBsZUZpbHRlclJlYWRlciBleHRlbmRzIFJlYWRlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVFTVBUX0JVRkZFUl9MRU5HVEggPSAxNjsKKyAgICAgICAgcHJpdmF0ZSBSZWFkZXIgaW47CisKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBwcmVlbXB0ID0gbmV3IGludFtQUkVFTVBUX0JVRkZFUl9MRU5HVEhdOworCisgICAgICAgIHByaXZhdGUgaW50IHByZWVtcHRJbmRleCA9IDA7CisKKyAgICAgICAgcHVibGljIFNpbXBsZUZpbHRlclJlYWRlcihSZWFkZXIgaW4pIHsKKyAgICAgICAgICAgIHRoaXMuaW4gPSBpbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHB1c2goY2hhciBjKSB7CisgICAgICAgICAgICBwdXNoKChpbnQpIGMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHVzaChpbnQgYykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcmVlbXB0W3ByZWVtcHRJbmRleCsrXSA9IGM7CisgICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGludFtdIHAyID0gbmV3IGludFtwcmVlbXB0Lmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocHJlZW1wdCwgMCwgcDIsIDAsIHByZWVtcHQubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwcmVlbXB0ID0gcDI7CisgICAgICAgICAgICAgICAgcHVzaChjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHB1c2goY2hhcltdIGNzLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIGxlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICAgICAgcHVzaChjc1tpLS1dKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHB1c2goY2hhcltdIGNzKSB7CisgICAgICAgICAgICBwdXNoKGNzLCAwLCBjcy5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHVzaChTdHJpbmcgcykgeworICAgICAgICAgICAgcHVzaChzLnRvQ2hhckFycmF5KCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERvZXMgdGhpcyBmaWx0ZXIgd2FudCB0byBibG9jayBlZGl0cyBvbiB0aGUgbGFzdCBjaGFyYWN0ZXIgcmV0dXJuZWQKKyAgICAgICAgICogYnkgcmVhZCgpPworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZWRpdHNCbG9ja2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIGluIGluc3RhbmNlb2YgU2ltcGxlRmlsdGVyUmVhZGVyICYmICgoU2ltcGxlRmlsdGVyUmVhZGVyKSBpbikuZWRpdHNCbG9ja2VkKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gcHJlZW1wdEluZGV4ID4gMCA/IHByZWVtcHRbLS1wcmVlbXB0SW5kZXhdIDogaW4ucmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW4ucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaW4ubWFya1N1cHBvcnRlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gaW4ucmVhZHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IGkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGluLm1hcmsoaSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgaSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGluLnNraXAoaSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHJlYWQoY2hhcltdIGJ1ZikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBpbnQgYyA9IDA7CisKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6SW5uZXJBc3NpZ25tZW50IE9GRiAtIGxlYXZlIGFsb25lCisgICAgICAgICAgICB3aGlsZSAobGVuZ3RoLS0gPiAwICYmIChjID0gdGhpcy5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgYnVmW3N0YXJ0KytdID0gKGNoYXIpIGM7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIGF0IEVPRiB3aXRoIG5vIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciwgcmV0dXJuIEVPRgorICAgICAgICAgICAgcmV0dXJuIChjb3VudCA9PSAwICYmIGMgPT0gLTEpID8gLTEgOiBjb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hc2tKYXZhVGFiTGl0ZXJhbHNGaWx0ZXIgZXh0ZW5kcyBTaW1wbGVGaWx0ZXJSZWFkZXIgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZWRpdHNCbG9ja2VkID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkEgPSAxOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTl9DSEFSX0NPTlNUID0gMjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5fU1RSX0NPTlNUID0gMzsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5fU0lOR0xFX0NPTU1FTlQgPSA0OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTl9NVUxUSV9DT01NRU5UID0gNTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNfVE9fQ09NTUVOVCA9IDY7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQU5TX0ZST01fTVVMVEkgPSA4OworCisgICAgICAgIHByaXZhdGUgaW50IHN0YXRlOworCisgICAgICAgIHB1YmxpYyBNYXNrSmF2YVRhYkxpdGVyYWxzRmlsdGVyKFJlYWRlciBpbikgeworICAgICAgICAgICAgc3VwZXIoaW4pOworICAgICAgICAgICAgc3RhdGUgPSBKQVZBOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZWRpdHNCbG9ja2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIGVkaXRzQmxvY2tlZCB8fCBzdXBlci5lZGl0c0Jsb2NrZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgdGhpc0NoYXIgPSBzdXBlci5yZWFkKCk7CisgICAgICAgICAgICAvLyBNYXNrLCBibG9jayBmcm9tIGJlaW5nIGVkaXRlZCwgYWxsIGNoYXJhY3RlcnMgaW4gY29uc3RhbnRzLgorICAgICAgICAgICAgZWRpdHNCbG9ja2VkID0gKHN0YXRlID09IElOX0NIQVJfQ09OU1QgfHwgc3RhdGUgPT0gSU5fU1RSX0NPTlNUKTsKKworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBKQVZBOgorICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhbHdheXMgZW1pdHRlZC4KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNDaGFyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0NIQVJfQ09OU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX1NUUl9DT05TVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gVFJBTlNfVE9fQ09NTUVOVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0cnUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOX0NIQVJfQ09OU1Q6CisgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzQ2hhcikgeworICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBKQVZBOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIHRydQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSU5fU1RSX0NPTlNUOgorICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc0NoYXIpIHsKKyAgICAgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBKQVZBOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIHRydQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSU5fU0lOR0xFX0NPTU1FTlQ6CisgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGFsd2F5cyBlbWl0dGVkLgorICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc0NoYXIpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOiAvLyBFT0wKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBKQVZBOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIHRydQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSU5fTVVMVElfQ09NTUVOVDoKKyAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYWx3YXlzIGVtaXR0ZWQuCisgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzQ2hhcikgeworICAgICAgICAgICAgICAgIGNhc2UgJyonOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFRSQU5TX0ZST01fTVVMVEk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIEZhbGwgdHJ1CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUUkFOU19UT19DT01NRU5UOgorICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhbHdheXMgZW1pdHRlZC4KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNDaGFyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fTVVMVElfQ09NTUVOVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fU0lOR0xFX0NPTU1FTlQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBJTl9DSEFSX0NPTlNUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBJTl9TVFJfQ09OU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSkFWQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRSQU5TX0ZST01fTVVMVEk6CisgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGFsd2F5cyBlbWl0dGVkLgorICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc0NoYXIpIHsKKyAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBKQVZBOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIHRydQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gRmFsbCB0cnUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzQ2hhcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vcm1hbGl6ZUVvbEZpbHRlciBleHRlbmRzIFNpbXBsZUZpbHRlclJlYWRlciB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcmV2aW91c1dhc0VPTDsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZml4TGFzdDsKKworICAgICAgICBwcml2YXRlIGludCBub3JtYWxpemVkRU9MID0gMDsKKworICAgICAgICBwcml2YXRlIGNoYXJbXSBlb2wgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBOb3JtYWxpemVFb2xGaWx0ZXIoUmVhZGVyIGluLCBTdHJpbmcgZW9sU3RyaW5nLCBib29sZWFuIGZpeExhc3QpIHsKKyAgICAgICAgICAgIHN1cGVyKGluKTsKKyAgICAgICAgICAgIGVvbCA9IGVvbFN0cmluZy50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgdGhpcy5maXhMYXN0ID0gZml4TGFzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgdGhpc0NoYXIgPSBzdXBlci5yZWFkKCk7CisKKyAgICAgICAgICAgIGlmIChub3JtYWxpemVkRU9MID09IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtRU9MID0gMDsKKyAgICAgICAgICAgICAgICBib29sZWFuIGF0RW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzQ2hhcikgeworICAgICAgICAgICAgICAgIGNhc2UgQ1RSTFo6CisgICAgICAgICAgICAgICAgICAgIGludCBjID0gc3VwZXIucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXRFbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpeExhc3QgJiYgIXByZXZpb3VzV2FzRU9MKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRU9MID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHRoaXNDaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgICAgICAgYXRFbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoZml4TGFzdCAmJiAhcHJldmlvdXNXYXNFT0wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUVPTCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAvLyBFT0wgd2FzICJcbiIKKyAgICAgICAgICAgICAgICAgICAgbnVtRU9MID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBudW1FT0wgPSAxOworICAgICAgICAgICAgICAgICAgICBpbnQgYzEgPSBzdXBlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBjMiA9IHN1cGVyLnJlYWQoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYzEgPT0gJ1xyJyAmJiBjMiA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFT0wgd2FzICJcclxyXG4iCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYzEgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRU9MIHdhcyAiXHJcciIgLSBoYW5kbGUgYXMgdHdvIGNvbnNlY3V0aXZlICJcciIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAiXHIiCisgICAgICAgICAgICAgICAgICAgICAgICBudW1FT0wgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChjMik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYzEgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRU9MIHdhcyAiXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goYzIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRU9MIHdhcyAiXHIiCisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goYzEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0cnUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG51bUVPTCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG51bUVPTC0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChlb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVPTCArPSBlb2wubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzV2FzRU9MID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc0NoYXIgPSByZWFkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXRFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNXYXNFT0wgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFT0wtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzQ2hhcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFkZEVvZkZpbHRlciBleHRlbmRzIFNpbXBsZUZpbHRlclJlYWRlciB7CisgICAgICAgIHByaXZhdGUgaW50IGxhc3RDaGFyID0gLTE7CisKKyAgICAgICAgcHVibGljIEFkZEVvZkZpbHRlcihSZWFkZXIgaW4pIHsKKyAgICAgICAgICAgIHN1cGVyKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgdGhpc0NoYXIgPSBzdXBlci5yZWFkKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHNvdXJjZSBpcyBFT0YgYnV0IGxhc3QgY2hhcmFjdGVyIHdhcyBOT1QgY3RybC16LCByZXR1cm4gY3RybC16CisgICAgICAgICAgICBpZiAodGhpc0NoYXIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdENoYXIgIT0gQ1RSTFopIHsKKyAgICAgICAgICAgICAgICAgICAgbGFzdENoYXIgPSBDVFJMWjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RDaGFyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGFzdENoYXIgPSB0aGlzQ2hhcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzQ2hhcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbW92ZUVvZkZpbHRlciBleHRlbmRzIFNpbXBsZUZpbHRlclJlYWRlciB7CisgICAgICAgIHByaXZhdGUgaW50IGxvb2tBaGVhZCA9IC0xOworCisgICAgICAgIHB1YmxpYyBSZW1vdmVFb2ZGaWx0ZXIoUmVhZGVyIGluKSB7CisgICAgICAgICAgICBzdXBlcihpbik7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9va0FoZWFkID0gaW4ucmVhZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBsb29rQWhlYWQyID0gc3VwZXIucmVhZCgpOworCisgICAgICAgICAgICAvLyBJZiBzb3VyY2UgYXQgRU9GIGFuZCBsb29rQWhlYWQgaXMgY3RybC16LCByZXR1cm4gRU9GIChOT1QgY3RybC16KQorICAgICAgICAgICAgaWYgKGxvb2tBaGVhZDIgPT0gLTEgJiYgbG9va0FoZWFkID09IENUUkxaKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmV0dXJuIGN1cnJlbnQgbG9vay1haGVhZAorICAgICAgICAgICAgaW50IGkgPSBsb29rQWhlYWQ7CisgICAgICAgICAgICBsb29rQWhlYWQgPSBsb29rQWhlYWQyOworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBZGRUYWJGaWx0ZXIgZXh0ZW5kcyBTaW1wbGVGaWx0ZXJSZWFkZXIgeworICAgICAgICBwcml2YXRlIGludCBjb2x1bW5OdW1iZXIgPSAwOworCisgICAgICAgIHByaXZhdGUgaW50IHRhYkxlbmd0aCA9IDA7CisKKyAgICAgICAgcHVibGljIEFkZFRhYkZpbHRlcihSZWFkZXIgaW4sIGludCB0YWJMZW5ndGgpIHsKKyAgICAgICAgICAgIHN1cGVyKGluKTsKKyAgICAgICAgICAgIHRoaXMudGFiTGVuZ3RoID0gdGFiTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBjID0gc3VwZXIucmVhZCgpOworCisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyKys7CisgICAgICAgICAgICAgICAgaWYgKCFlZGl0c0Jsb2NrZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29sTmV4dFRhYiA9ICgoY29sdW1uTnVtYmVyICsgdGFiTGVuZ3RoIC0gMSkgLyB0YWJMZW5ndGgpICogdGFiTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpbnQgY291bnRTcGFjZXMgPSAxOworICAgICAgICAgICAgICAgICAgICBpbnQgbnVtVGFicyA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgc2NhbldoaXRlc3BhY2U6IHdoaWxlICgoYyA9IHN1cGVyLnJlYWQoKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrY29sdW1uTnVtYmVyID09IGNvbE5leHRUYWIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGFicysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudFNwYWNlcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbE5leHRUYWIgKz0gdGFiTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50U3BhY2VzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlciA9IGNvbE5leHRUYWI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGFicysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50U3BhY2VzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xOZXh0VGFiICs9IHRhYkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuV2hpdGVzcGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY291bnRTcGFjZXMtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlci0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChudW1UYWJzLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCdcdCcpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyIC09IHRhYkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjID0gc3VwZXIucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIgKz0gdGFiTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIHRydQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlciA9ICgoY29sdW1uTnVtYmVyICsgdGFiTGVuZ3RoIC0gMSkgLyB0YWJMZW5ndGgpICogdGFiTGVuZ3RoOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVtb3ZlVGFiRmlsdGVyIGV4dGVuZHMgU2ltcGxlRmlsdGVyUmVhZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY29sdW1uTnVtYmVyID0gMDsKKworICAgICAgICBwcml2YXRlIGludCB0YWJMZW5ndGggPSAwOworCisgICAgICAgIHB1YmxpYyBSZW1vdmVUYWJGaWx0ZXIoUmVhZGVyIGluLCBpbnQgdGFiTGVuZ3RoKSB7CisgICAgICAgICAgICBzdXBlcihpbik7CisKKyAgICAgICAgICAgIHRoaXMudGFiTGVuZ3RoID0gdGFiTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBjID0gc3VwZXIucmVhZCgpOworCisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IHRhYkxlbmd0aCAtIGNvbHVtbk51bWJlciAlIHRhYkxlbmd0aDsKKworICAgICAgICAgICAgICAgIGlmICghZWRpdHNCbG9ja2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IHdpZHRoID4gMTsgd2lkdGgtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCgnICcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMgPSAnICc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlciArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZWQgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlcyAiYXNpcyIsICJhZGQiIGFuZCAicmVtb3ZlIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFkZEFzaXNSZW1vdmUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRkQXNpc1JlbW92ZSBBU0lTID0gbmV3SW5zdGFuY2UoImFzaXMiKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGRBc2lzUmVtb3ZlIEFERCA9IG5ld0luc3RhbmNlKCJhZGQiKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGRBc2lzUmVtb3ZlIFJFTU9WRSA9IG5ld0luc3RhbmNlKCJyZW1vdmUiKTsKKworICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJhZGQiLCAiYXNpcyIsICJyZW1vdmUifTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFcXVhbGl0eSBkZXBlbmRpbmcgaW4gdGhlIGluZGV4LgorICAgICAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG9iamVjdCB0byB0ZXN0IGVxdWFsaXR5IGFnYWluc3QuCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyB0aGUgc2FtZSBpbmRleCBhcyB0aGlzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgQWRkQXNpc1JlbW92ZQorICAgICAgICAgICAgICAgICAgICAmJiBnZXRJbmRleCgpID09ICgoQWRkQXNpc1JlbW92ZSkgb3RoZXIpLmdldEluZGV4KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFzaGNvZGUgZGVwZW5kaW5nIG9uIHRoZSBpbmRleC4KKyAgICAgICAgICogQHJldHVybiB0aGUgaW5kZXggYXMgdGhlIGhhc2hjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJbmRleCgpOworICAgICAgICB9CisKKyAgICAgICAgQWRkQXNpc1JlbW92ZSByZXNvbHZlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAodGhpcy5lcXVhbHMoQVNJUykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVNJUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLmVxdWFscyhBREQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFERDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLmVxdWFscyhSRU1PVkUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJFTU9WRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIHJlcGxhY2VtZW50IGZvciAiICsgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXb3JrcyBsaWtlIGNsb25lKCkgYnV0IGRvZXNuJ3Qgc2hvdyB1cCBpbiB0aGUgSmF2YWRvY3MKKyAgICAgICAgcHJpdmF0ZSBBZGRBc2lzUmVtb3ZlIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGVudW1lcmF0ZWQgdmFsdWUgYmFzZWQgb24gdGhlIHN0cmluZyB2YWx1ZS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRlZCBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQWRkQXNpc1JlbW92ZSBuZXdJbnN0YW5jZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIEFkZEFzaXNSZW1vdmUgYSA9IG5ldyBBZGRBc2lzUmVtb3ZlKCk7CisgICAgICAgICAgICBhLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWVzICJhc2lzIiwgImNyIiwgImxmIiBhbmQgImNybGYiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3JMZiBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDckxmIEFTSVMgPSBuZXdJbnN0YW5jZSgiYXNpcyIpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENyTGYgQ1IgPSBuZXdJbnN0YW5jZSgiY3IiKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDckxmIENSTEYgPSBuZXdJbnN0YW5jZSgiY3JsZiIpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENyTGYgRE9TID0gbmV3SW5zdGFuY2UoImRvcyIpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENyTGYgTEYgPSBuZXdJbnN0YW5jZSgibGYiKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDckxmIE1BQyA9IG5ld0luc3RhbmNlKCJtYWMiKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDckxmIFVOSVggPSBuZXdJbnN0YW5jZSgidW5peCIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzCisgICAgICAgICAqLworICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJhc2lzIiwgImNyIiwgImxmIiwgImNybGYiLCAibWFjIiwgInVuaXgiLCAiZG9zIn07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRXF1YWxpdHkgZGVwZW5kaW5nIGluIHRoZSBpbmRleC4KKyAgICAgICAgICogQHBhcmFtIG90aGVyIHRoZSBvYmplY3QgdG8gdGVzdCBlcXVhbGl0eSBhZ2FpbnN0LgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBoYXMgdGhlIHNhbWUgaW5kZXggYXMgdGhpcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIENyTGYgJiYgZ2V0SW5kZXgoKSA9PSAoKENyTGYpIG90aGVyKS5nZXRJbmRleCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhc2hjb2RlIGRlcGVuZGluZyBvbiB0aGUgaW5kZXguCisgICAgICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGFzIHRoZSBoYXNoY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SW5kZXgoKTsKKyAgICAgICAgfQorCisgICAgICAgIENyTGYgcmVzb2x2ZSgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmVxdWFscyhBU0lTKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBU0lTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMuZXF1YWxzKENSKSB8fCB0aGlzLmVxdWFscyhNQUMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMuZXF1YWxzKENSTEYpIHx8IHRoaXMuZXF1YWxzKERPUykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1JMRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLmVxdWFscyhMRikgfHwgdGhpcy5lcXVhbHMoVU5JWCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTEY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyByZXBsYWNlbWVudCBmb3IgIiArIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV29ya3MgbGlrZSBjbG9uZSgpIGJ1dCBkb2Vzbid0IHNob3cgdXAgaW4gdGhlIEphdmFkb2NzCisgICAgICAgIHByaXZhdGUgQ3JMZiBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZShnZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBlbnVtZXJhdGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBzdHJpbmcgdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0ZWQgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIENyTGYgbmV3SW5zdGFuY2UoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBDckxmIGMgPSBuZXcgQ3JMZigpOworICAgICAgICAgICAgYy5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvSGVhZEZpbHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9IZWFkRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlZWUwMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvSGVhZEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTGluZVRva2VuaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CisKKy8qKgorICogUmVhZHMgdGhlIGZpcnN0IDxjb2RlPm48L2NvZGU+IGxpbmVzIG9mIGEgc3RyZWFtLgorICogKERlZmF1bHQgaXMgZmlyc3QgMTAgbGluZXMuKQorICogPHA+CisgKiBFeGFtcGxlOgorICogPHByZT4mbHQ7aGVhZGZpbHRlciBsaW5lcz0mcXVvdDszJnF1b3Q7LyZndDs8L3ByZT4KKyAqIE9yOgorICogPHByZT4mbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkhlYWRGaWx0ZXImcXVvdDsmZ3Q7CisgKiAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtsaW5lcyZxdW90OyB2YWx1ZT0mcXVvdDszJnF1b3Q7LyZndDsKKyAqICZsdDsvZmlsdGVycmVhZGVyJmd0OzwvcHJlPgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEhlYWRGaWx0ZXIgZXh0ZW5kcyBCYXNlUGFyYW1GaWx0ZXJSZWFkZXIKKyAgICBpbXBsZW1lbnRzIENoYWluYWJsZVJlYWRlciB7CisgICAgLyoqIFBhcmFtZXRlciBuYW1lIGZvciB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHJldHVybmVkLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FU19LRVkgPSAibGluZXMiOworCisgICAgLyoqIFBhcmFtZXRlciBuYW1lIGZvciB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNraXBwZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfS0VZID0gInNraXAiOworCisgICAgLyoqIE51bWJlciBvZiBsaW5lcyBjdXJyZW50bHkgcmVhZCBpbi4gKi8KKyAgICBwcml2YXRlIGxvbmcgbGluZXNSZWFkID0gMDsKKworICAgIC8qKiBEZWZhdWx0IG51bWJlciBvZiBsaW5lcyB0byBzaG93ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTlVNX0xJTkVTID0gMTA7CisKKyAgICAvKiogTnVtYmVyIG9mIGxpbmVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0uICovCisgICAgcHJpdmF0ZSBsb25nIGxpbmVzID0gREVGQVVMVF9OVU1fTElORVM7CisKKyAgICAvKiogTnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNraXBwZWQuICovCisgICAgcHJpdmF0ZSBsb25nIHNraXAgPSAwOworCisgICAgLyoqIEEgbGluZSB0b2tlbml6ZXIgKi8KKyAgICBwcml2YXRlIExpbmVUb2tlbml6ZXIgbGluZVRva2VuaXplciA9IG51bGw7CisKKyAgICAvKiogdGhlIGN1cnJlbnQgbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gKi8KKyAgICBwcml2YXRlIFN0cmluZyAgICBsaW5lICAgICAgPSBudWxsOworICAgIC8qKiB0aGUgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgbGluZSAqLworICAgIHByaXZhdGUgaW50ICAgICAgIGxpbmVQb3MgICA9IDA7CisKKyAgICAvKiogV2hldGhlciB0aGlzIGZpbHRlciBpcyBmaW5pc2hlZCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBlb2Y7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgImR1bW15IiBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAc2VlIEJhc2VGaWx0ZXJSZWFkZXIjQmFzZUZpbHRlclJlYWRlcigpCisgICAgICovCisgICAgcHVibGljIEhlYWRGaWx0ZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXJlZCByZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gQSBSZWFkZXIgb2JqZWN0IHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBIZWFkRmlsdGVyKGZpbmFsIFJlYWRlciBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgICAgIGxpbmVUb2tlbml6ZXIgPSBuZXcgTGluZVRva2VuaXplcigpOworICAgICAgICBsaW5lVG9rZW5pemVyLnNldEluY2x1ZGVEZWxpbXModHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4gSWYgdGhlIGRlc2lyZWQKKyAgICAgKiBudW1iZXIgb2YgbGluZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCwgdGhlIHJlc3VsdGluZyBzdHJlYW0gaXMKKyAgICAgKiBlZmZlY3RpdmVseSBhdCBhbiBlbmQuIE90aGVyd2lzZSwgdGhlIG5leHQgY2hhcmFjdGVyIGZyb20gdGhlCisgICAgICogdW5kZXJseWluZyBzdHJlYW0gaXMgcmVhZCBhbmQgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbSwgb3IgLTEKKyAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbgorICAgICAqIGR1cmluZyByZWFkaW5nCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFnZXRJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgICAgICBzZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChsaW5lID09IG51bGwgfHwgbGluZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBsaW5lID0gbGluZVRva2VuaXplci5nZXRUb2tlbihpbik7CisgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZSA9IGhlYWRGaWx0ZXIobGluZSk7CisgICAgICAgICAgICBpZiAoZW9mKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZVBvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY2ggPSBsaW5lLmNoYXJBdChsaW5lUG9zKTsKKyAgICAgICAgbGluZVBvcysrOworICAgICAgICBpZiAobGluZVBvcyA9PSBsaW5lLmxlbmd0aCgpKSB7CisgICAgICAgICAgICBsaW5lID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZXMgdGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmlsdGVyZWQgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGluZXMoZmluYWwgbG9uZyBsaW5lcykgeworICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbQorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBnZXRMaW5lcygpIHsKKyAgICAgICAgcmV0dXJuIGxpbmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSBza2lwcGVkIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2tpcCB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNraXBwZWQgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNraXAoZmluYWwgbG9uZyBza2lwKSB7CisgICAgICAgIHRoaXMuc2tpcCA9IHNraXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNraXBwZWQgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSBza2lwcGVkIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgZ2V0U2tpcCgpIHsKKyAgICAgICAgcmV0dXJuIHNraXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBIZWFkRmlsdGVyIHVzaW5nIHRoZSBwYXNzZWQgaW4KKyAgICAgKiBSZWFkZXIgZm9yIGluc3RhbnRpYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmRyIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBiYXNlZCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24sIGJ1dCBmaWx0ZXJpbmcKKyAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgcmVhZGVyCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBjaGFpbihmaW5hbCBSZWFkZXIgcmRyKSB7CisgICAgICAgIEhlYWRGaWx0ZXIgbmV3RmlsdGVyID0gbmV3IEhlYWRGaWx0ZXIocmRyKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldExpbmVzKGdldExpbmVzKCkpOworICAgICAgICBuZXdGaWx0ZXIuc2V0U2tpcChnZXRTa2lwKCkpOworICAgICAgICBuZXdGaWx0ZXIuc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7CisgICAgICAgIHJldHVybiBuZXdGaWx0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbnMgdGhlIHBhcmFtZXRlcnMgbGlzdCBmb3IgdGhlICJsaW5lcyIgcGFyYW1ldGVyIGFuZCB1c2VzCisgICAgICogaXQgdG8gc2V0IHRoZSBudW1iZXIgb2YgbGluZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4KKyAgICAgKiBhbHNvIHNjYW4gZm9yIHNraXAgcGFyYW1ldGVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoTElORVNfS0VZLmVxdWFscyhwYXJhbXNbaV0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IExvbmcucGFyc2VMb25nKHBhcmFtc1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChTS0lQX0tFWS5lcXVhbHMocGFyYW1zW2ldLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCA9IExvbmcucGFyc2VMb25nKHBhcmFtc1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaW1wbGVtZW50cyBhIGhlYWQgZmlsdGVyIG9uIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBoZWFkRmlsdGVyKFN0cmluZyBsaW5lKSB7CisgICAgICAgIGxpbmVzUmVhZCsrOworICAgICAgICBpZiAoc2tpcCA+IDApIHsKKyAgICAgICAgICAgIGlmICgobGluZXNSZWFkIC0gMSkgPCBza2lwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobGluZXMgPiAwKSB7CisgICAgICAgICAgICBpZiAobGluZXNSZWFkID4gKGxpbmVzICsgc2tpcCkpIHsKKyAgICAgICAgICAgICAgICBlb2YgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTGluZUNvbnRhaW5zLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0xpbmVDb250YWlucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmMwM2QKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0xpbmVDb250YWlucy5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CisKKy8qKgorICogRmlsdGVyIHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIGFsbCB0aGUgdXNlci1zcGVjaWZpZWQKKyAqIHN0cmluZ3MuCisgKgorICogRXhhbXBsZToKKyAqCisgKiA8cHJlPiZsdDtsaW5lY29udGFpbnMmZ3Q7CisgKiAgICZsdDtjb250YWlucyB2YWx1ZT0mcXVvdDtmb28mcXVvdDsmZ3Q7CisgKiAgICZsdDtjb250YWlucyB2YWx1ZT0mcXVvdDtiYXImcXVvdDsmZ3Q7CisgKiAmbHQ7L2xpbmVjb250YWlucyZndDs8L3ByZT4KKyAqCisgKiBPcjoKKyAqCisgKiA8cHJlPiZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuTGluZUNvbnRhaW5zJnF1b3Q7Jmd0OworICogICAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7Y29udGFpbnMmcXVvdDsgdmFsdWU9JnF1b3Q7Zm9vJnF1b3Q7LyZndDsKKyAqICAgICZsdDtwYXJhbSB0eXBlPSZxdW90O2NvbnRhaW5zJnF1b3Q7IHZhbHVlPSZxdW90O2JhciZxdW90Oy8mZ3Q7CisgKiAmbHQ7L2ZpbHRlcnJlYWRlciZndDs8L3ByZT4KKyAqCisgKiBUaGlzIHdpbGwgaW5jbHVkZSBvbmx5IHRob3NlIGxpbmVzIHRoYXQgY29udGFpbiA8Y29kZT5mb288L2NvZGU+IGFuZAorICogPGNvZGU+YmFyPC9jb2RlPi4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBMaW5lQ29udGFpbnMKKyAgICBleHRlbmRzIEJhc2VQYXJhbUZpbHRlclJlYWRlcgorICAgIGltcGxlbWVudHMgQ2hhaW5hYmxlUmVhZGVyIHsKKyAgICAvKiogUGFyYW1ldGVyIG5hbWUgZm9yIHRoZSB3b3JkcyB0byBmaWx0ZXIgb24uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBSU5TX0tFWSA9ICJjb250YWlucyI7CisKKyAgICAvKiogUGFyYW1ldGVyIG5hbWUgZm9yIHRoZSB3b3JkcyB0byBmaWx0ZXIgb24uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FR0FURV9LRVkgPSAibmVnYXRlIjsKKworICAgIC8qKiBWZWN0b3IgdGhhdCBob2xkcyB0aGUgc3RyaW5ncyB0aGF0IGlucHV0IGxpbmVzIG11c3QgY29udGFpbi4gKi8KKyAgICBwcml2YXRlIFZlY3RvciBjb250YWlucyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIFJlbWFpbmluZyBsaW5lIHRvIGJlIHJlYWQgZnJvbSB0aGlzIGZpbHRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiB0aGUgbmV4dCBjYWxsIHRvIDxjb2RlPnJlYWQoKTwvY29kZT4gc2hvdWxkIHJlYWQgdGhlIG9yaWdpbmFsIHN0cmVhbQorICAgICAqIHRvIGZpbmQgdGhlIG5leHQgbWF0Y2hpbmcgbGluZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsaW5lID0gbnVsbDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBuZWdhdGUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciAiZHVtbXkiIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBzZWUgQmFzZUZpbHRlclJlYWRlciNCYXNlRmlsdGVyUmVhZGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGluZUNvbnRhaW5zKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZmlsdGVyZWQgcmVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGluIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGluZUNvbnRhaW5zKGZpbmFsIFJlYWRlciBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbSwgb25seSBpbmNsdWRpbmcKKyAgICAgKiBsaW5lcyBmcm9tIHRoZSBvcmlnaW5hbCBzdHJlYW0gd2hpY2ggY29udGFpbiBhbGwgb2YgdGhlIHNwZWNpZmllZCB3b3Jkcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSByZXN1bHRpbmcgc3RyZWFtLCBvciAtMQorICAgICAqIGlmIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyBzdHJlYW0gdGhyb3dzIGFuIElPRXhjZXB0aW9uCisgICAgICogZHVyaW5nIHJlYWRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWdldEluaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIHNldEluaXRpYWxpemVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNoID0gLTE7CisKKyAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgY2ggPSBsaW5lLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgaW50IGNvbnRhaW5zU2l6ZSA9IGNvbnRhaW5zLnNpemUoKTsKKworICAgICAgICAgICAgZm9yIChsaW5lID0gcmVhZExpbmUoKTsgbGluZSAhPSBudWxsOyBsaW5lID0gcmVhZExpbmUoKSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IG1hdGNoZXMgJiYgaSA8IGNvbnRhaW5zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250YWluc1N0ciA9IChTdHJpbmcpIGNvbnRhaW5zLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IGxpbmUuaW5kZXhPZihjb250YWluc1N0cikgPj0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgXiBpc05lZ2F0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIDxjb2RlPmNvbnRhaW5zPC9jb2RlPiBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5zIFRoZSA8Y29kZT5jb250YWluczwvY29kZT4gZWxlbWVudCB0byBhZGQuCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRDb250YWlucyhmaW5hbCBDb250YWlucyBjb250YWlucykgeworICAgICAgICB0aGlzLmNvbnRhaW5zLmFkZEVsZW1lbnQoY29udGFpbnMuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuZWdhdGlvbiBtb2RlLiAgRGVmYXVsdCBmYWxzZSAobm8gbmVnYXRpb24pLgorICAgICAqIEBwYXJhbSBiIHRoZSBib29sZWFuIG5lZ2F0aW9uIG1vZGUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5lZ2F0ZShib29sZWFuIGIpIHsKKyAgICAgICAgbmVnYXRlID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIG91dCB3aGV0aGVyIHdlIGhhdmUgYmVlbiBuZWdhdGVkLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBuZWdhdGlvbiBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTmVnYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG5lZ2F0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2ZWN0b3Igb2Ygd29yZHMgd2hpY2ggbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgbGluZSByZWFkCisgICAgICogZnJvbSB0aGUgb3JpZ2luYWwgc3RyZWFtIGluIG9yZGVyIGZvciBpdCB0byBtYXRjaCB0aGlzIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWlucyBBIHZlY3RvciBvZiB3b3JkcyB3aGljaCBtdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBsaW5lCisgICAgICogaW4gb3JkZXIgZm9yIGl0IHRvIG1hdGNoIGluIHRoaXMgZmlsdGVyLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Q29udGFpbnMoZmluYWwgVmVjdG9yIGNvbnRhaW5zKSB7CisgICAgICAgIHRoaXMuY29udGFpbnMgPSBjb250YWluczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2ZWN0b3Igb2Ygd29yZHMgd2hpY2ggbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgbGluZSByZWFkCisgICAgICogZnJvbSB0aGUgb3JpZ2luYWwgc3RyZWFtIGluIG9yZGVyIGZvciBpdCB0byBtYXRjaCB0aGlzIGZpbHRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZlY3RvciBvZiB3b3JkcyB3aGljaCBtdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBsaW5lIHJlYWQKKyAgICAgKiBmcm9tIHRoZSBvcmlnaW5hbCBzdHJlYW0gaW4gb3JkZXIgZm9yIGl0IHRvIG1hdGNoIHRoaXMgZmlsdGVyLiBUaGUKKyAgICAgKiByZXR1cm5lZCBvYmplY3QgaXMgImxpdmUiIC0gaW4gb3RoZXIgd29yZHMsIGNoYW5nZXMgbWFkZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBvYmplY3QgYXJlIG1pcnJvcmVkIGluIHRoZSBmaWx0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3IgZ2V0Q29udGFpbnMoKSB7CisgICAgICAgIHJldHVybiBjb250YWluczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IExpbmVDb250YWlucyB1c2luZyB0aGUgcGFzc2VkIGluCisgICAgICogUmVhZGVyIGZvciBpbnN0YW50aWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJkciBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyBmaWx0ZXIgYmFzZWQgb24gdGhpcyBjb25maWd1cmF0aW9uLCBidXQgZmlsdGVyaW5nCisgICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIHJlYWRlcgorICAgICAqLworICAgIHB1YmxpYyBSZWFkZXIgY2hhaW4oZmluYWwgUmVhZGVyIHJkcikgeworICAgICAgICBMaW5lQ29udGFpbnMgbmV3RmlsdGVyID0gbmV3IExpbmVDb250YWlucyhyZHIpOworICAgICAgICBuZXdGaWx0ZXIuc2V0Q29udGFpbnMoZ2V0Q29udGFpbnMoKSk7CisgICAgICAgIG5ld0ZpbHRlci5zZXROZWdhdGUoaXNOZWdhdGVkKCkpOworICAgICAgICByZXR1cm4gbmV3RmlsdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgcGFyYW1ldGVycyB0byBhZGQgdXNlci1kZWZpbmVkIGNvbnRhaW5zIHN0cmluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChDT05UQUlOU19LRVkuZXF1YWxzKHBhcmFtc1tpXS5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zLmFkZEVsZW1lbnQocGFyYW1zW2ldLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTkVHQVRFX0tFWS5lcXVhbHMocGFyYW1zW2ldLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0TmVnYXRlKFByb2plY3QudG9Cb29sZWFuKHBhcmFtc1tpXS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSG9sZHMgYSBjb250YWlucyBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250YWlucyB7CisKKyAgICAgICAgLyoqIFVzZXIgZGVmaW5lZCBjb250YWlucyBzdHJpbmcgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGNvbnRhaW5zIHN0cmluZworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGFpbnMgVGhlIGNvbnRhaW5zIHN0cmluZyB0byBzZXQuCisgICAgICAgICAqICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZhbHVlKFN0cmluZyBjb250YWlucykgeworICAgICAgICAgICAgdmFsdWUgPSBjb250YWluczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb250YWlucyBzdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNvbnRhaW5zIHN0cmluZyBmb3IgdGhpcyBlbGVtZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9MaW5lQ29udGFpbnNSZWdFeHAuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTGluZUNvbnRhaW5zUmVnRXhwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllZjM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTGluZUNvbnRhaW5zUmVnRXhwLmphdmEKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWd1bGFyRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHA7CisKKy8qKgorICogRmlsdGVyIHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIHRoZSB1c2VyLXNwZWNpZmllZAorICogcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIHN0cmluZ3MuCisgKgorICogRXhhbXBsZToKKyAqIDxwcmU+Jmx0O2xpbmVjb250YWluc3JlZ2V4cCZndDsKKyAqICAgJmx0O3JlZ2V4cCBwYXR0ZXJuPSZxdW90O2ZvbyomcXVvdDsmZ3Q7CisgKiAmbHQ7L2xpbmVjb250YWluc3JlZ2V4cCZndDs8L3ByZT4KKyAqCisgKiBPcjoKKyAqCisgKiA8cHJlPiZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuTGluZUNvbnRhaW5zUmVnRXhwJnF1b3Q7Jmd0OworICogICAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7cmVnZXhwJnF1b3Q7IHZhbHVlPSZxdW90O2ZvbyomcXVvdDsvJmd0OworICogJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7PC9wcmU+CisgKgorICogVGhpcyB3aWxsIGZldGNoIGFsbCB0aG9zZSBsaW5lcyB0aGF0IGNvbnRhaW4gdGhlIHBhdHRlcm4gPGNvZGU+Zm9vPC9jb2RlPgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIExpbmVDb250YWluc1JlZ0V4cAorICAgIGV4dGVuZHMgQmFzZVBhcmFtRmlsdGVyUmVhZGVyCisgICAgaW1wbGVtZW50cyBDaGFpbmFibGVSZWFkZXIgeworICAgIC8qKiBQYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBmaWx0ZXIgb24uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYUF9LRVkgPSAicmVnZXhwIjsKKworICAgIC8qKiBQYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHdvcmRzIHRvIGZpbHRlciBvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVHQVRFX0tFWSA9ICJuZWdhdGUiOworCisgICAgLyoqIFZlY3RvciB0aGF0IGhvbGRzIHRoZSBleHByZXNzaW9ucyB0aGF0IGlucHV0IGxpbmVzIG11c3QgY29udGFpbi4gKi8KKyAgICBwcml2YXRlIFZlY3RvciByZWdleHBzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogUmVtYWluaW5nIGxpbmUgdG8gYmUgcmVhZCBmcm9tIHRoaXMgZmlsdGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqIHRoZSBuZXh0IGNhbGwgdG8gPGNvZGU+cmVhZCgpPC9jb2RlPiBzaG91bGQgcmVhZCB0aGUgb3JpZ2luYWwgc3RyZWFtCisgICAgICogdG8gZmluZCB0aGUgbmV4dCBtYXRjaGluZyBsaW5lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxpbmUgPSBudWxsOworCisgICAgcHJpdmF0ZSBib29sZWFuIG5lZ2F0ZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yICJkdW1teSIgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNlZSBCYXNlRmlsdGVyUmVhZGVyI0Jhc2VGaWx0ZXJSZWFkZXIoKQorICAgICAqLworICAgIHB1YmxpYyBMaW5lQ29udGFpbnNSZWdFeHAoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXJlZCByZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gQSBSZWFkZXIgb2JqZWN0IHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBMaW5lQ29udGFpbnNSZWdFeHAoZmluYWwgUmVhZGVyIGluKSB7CisgICAgICAgIHN1cGVyKGluKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgZmlsdGVyZWQgc3RyZWFtLCBvbmx5IGluY2x1ZGluZworICAgICAqIGxpbmVzIGZyb20gdGhlIG9yaWdpbmFsIHN0cmVhbSB3aGljaCBtYXRjaCBhbGwgb2YgdGhlIHNwZWNpZmllZAorICAgICAqIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbSwgb3IgLTEKKyAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbgorICAgICAqIGR1cmluZyByZWFkaW5nCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFnZXRJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgICAgICBzZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjaCA9IC0xOworCisgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoID0gbGluZS5jaGFyQXQoMCk7CisgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIGludCByZWdleHBzU2l6ZSA9IHJlZ2V4cHMuc2l6ZSgpOworCisgICAgICAgICAgICBmb3IgKGxpbmUgPSByZWFkTGluZSgpOyBsaW5lICE9IG51bGw7IGxpbmUgPSByZWFkTGluZSgpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXRjaGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgbWF0Y2hlcyAmJiBpIDwgcmVnZXhwc1NpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBSZWd1bGFyRXhwcmVzc2lvbiByZWdleHAKKyAgICAgICAgICAgICAgICAgICAgICAgID0gKFJlZ3VsYXJFeHByZXNzaW9uKSByZWdleHBzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgUmVnZXhwIHJlID0gcmVnZXhwLmdldFJlZ2V4cChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gcmUubWF0Y2hlcyhsaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgXiBpc05lZ2F0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIDxjb2RlPnJlZ2V4cDwvY29kZT4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWdFeHAgVGhlIDxjb2RlPnJlZ2V4cDwvY29kZT4gZWxlbWVudCB0byBhZGQuCisgICAgICogICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkUmVnZXhwKGZpbmFsIFJlZ3VsYXJFeHByZXNzaW9uIHJlZ0V4cCkgeworICAgICAgICB0aGlzLnJlZ2V4cHMuYWRkRWxlbWVudChyZWdFeHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZlY3RvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHdoaWNoIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbgorICAgICAqIGEgbGluZSByZWFkIGZyb20gdGhlIG9yaWdpbmFsIHN0cmVhbSBpbiBvcmRlciBmb3IgaXQgdG8gbWF0Y2ggdGhpcworICAgICAqIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWdleHBzIEEgdmVjdG9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hpY2ggbXVzdCBiZSBjb250YWluZWQKKyAgICAgKiB3aXRoaW4gYSBsaW5lIGluIG9yZGVyIGZvciBpdCB0byBtYXRjaCBpbiB0aGlzIGZpbHRlci4gTXVzdCBub3QgYmUKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0UmVnZXhwcyhmaW5hbCBWZWN0b3IgcmVnZXhwcykgeworICAgICAgICB0aGlzLnJlZ2V4cHMgPSByZWdleHBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZlY3RvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHdoaWNoIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbgorICAgICAqIGEgbGluZSByZWFkIGZyb20gdGhlIG9yaWdpbmFsIHN0cmVhbSBpbiBvcmRlciBmb3IgaXQgdG8gbWF0Y2ggdGhpcworICAgICAqIGZpbHRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZlY3RvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHdoaWNoIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbgorICAgICAqIGEgbGluZSByZWFkIGZyb20gdGhlIG9yaWdpbmFsIHN0cmVhbSBpbiBvcmRlciBmb3IgaXQgdG8gbWF0Y2ggdGhpcworICAgICAqIGZpbHRlci4gVGhlIHJldHVybmVkIG9iamVjdCBpcyAibGl2ZSIgLSBpbiBvdGhlciB3b3JkcywgY2hhbmdlcyBtYWRlIHRvCisgICAgICogdGhlIHJldHVybmVkIG9iamVjdCBhcmUgbWlycm9yZWQgaW4gdGhlIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBnZXRSZWdleHBzKCkgeworICAgICAgICByZXR1cm4gcmVnZXhwczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IExpbmVDb250YWluc1JlZ0V4cCB1c2luZyB0aGUgcGFzc2VkIGluCisgICAgICogUmVhZGVyIGZvciBpbnN0YW50aWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJkciBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyBmaWx0ZXIgYmFzZWQgb24gdGhpcyBjb25maWd1cmF0aW9uLCBidXQgZmlsdGVyaW5nCisgICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIHJlYWRlcgorICAgICAqLworICAgIHB1YmxpYyBSZWFkZXIgY2hhaW4oZmluYWwgUmVhZGVyIHJkcikgeworICAgICAgICBMaW5lQ29udGFpbnNSZWdFeHAgbmV3RmlsdGVyID0gbmV3IExpbmVDb250YWluc1JlZ0V4cChyZHIpOworICAgICAgICBuZXdGaWx0ZXIuc2V0UmVnZXhwcyhnZXRSZWdleHBzKCkpOworICAgICAgICBuZXdGaWx0ZXIuc2V0TmVnYXRlKGlzTmVnYXRlZCgpKTsKKyAgICAgICAgcmV0dXJuIG5ld0ZpbHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5lZ2F0aW9uIG1vZGUuICBEZWZhdWx0IGZhbHNlIChubyBuZWdhdGlvbikuCisgICAgICogQHBhcmFtIGIgdGhlIGJvb2xlYW4gbmVnYXRpb24gbW9kZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmVnYXRlKGJvb2xlYW4gYikgeworICAgICAgICBuZWdhdGUgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgb3V0IHdoZXRoZXIgd2UgaGF2ZSBiZWVuIG5lZ2F0ZWQuCisgICAgICogQHJldHVybiBib29sZWFuIG5lZ2F0aW9uIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNOZWdhdGVkKCkgeworICAgICAgICByZXR1cm4gbmVnYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBwYXJhbWV0ZXJzIHRvIGFkZCB1c2VyIGRlZmluZWQgcmVndWxhciBleHByZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOworICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKFJFR0VYUF9LRVkuZXF1YWxzKHBhcmFtc1tpXS5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gcGFyYW1zW2ldLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIHJlZ2V4cCA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICByZWdleHAuc2V0UGF0dGVybihwYXR0ZXJuKTsKKyAgICAgICAgICAgICAgICAgICAgcmVnZXhwcy5hZGRFbGVtZW50KHJlZ2V4cCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChORUdBVEVfS0VZLmVxdWFscyhwYXJhbXNbaV0uZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzZXROZWdhdGUoUHJvamVjdC50b0Jvb2xlYW4ocGFyYW1zW2ldLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1ByZWZpeExpbmVzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1ByZWZpeExpbmVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiYjgyNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUHJlZml4TGluZXMuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CisKKy8qKgorICogQXR0YWNoZXMgYSBwcmVmaXggdG8gZXZlcnkgbGluZS4KKyAqCisgKiBFeGFtcGxlOgorICogPHByZT4mbHQ7cHJlZml4bGluZXMgcHJlZml4PSZxdW90O0ZvbyZxdW90Oy8mZ3Q7PC9wcmU+CisgKgorICogT3I6CisgKgorICogPHByZT4mbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlByZWZpeExpbmVzJnF1b3Q7Jmd0OworICogICZsdDtwYXJhbSBuYW1lPSZxdW90O3ByZWZpeCZxdW90OyB2YWx1ZT0mcXVvdDtGb28mcXVvdDsvJmd0OworICogJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7PC9wcmU+CisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJlZml4TGluZXMKKyAgICBleHRlbmRzIEJhc2VQYXJhbUZpbHRlclJlYWRlcgorICAgIGltcGxlbWVudHMgQ2hhaW5hYmxlUmVhZGVyIHsKKyAgICAvKiogUGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBwcmVmaXguICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9LRVkgPSAicHJlZml4IjsKKworICAgIC8qKiBUaGUgcHJlZml4IHRvIGJlIHVzZWQuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKworICAgIC8qKiBEYXRhIHRoYXQgbXVzdCBiZSByZWFkIGZyb20sIGlmIG5vdCBudWxsLiAqLworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXVlZERhdGEgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yICJkdW1teSIgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNlZSBCYXNlRmlsdGVyUmVhZGVyI0Jhc2VGaWx0ZXJSZWFkZXIoKQorICAgICAqLworICAgIHB1YmxpYyBQcmVmaXhMaW5lcygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbHRlcmVkIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFByZWZpeExpbmVzKGZpbmFsIFJlYWRlciBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4gT25lIGxpbmUgaXMgcmVhZAorICAgICAqIGZyb20gdGhlIG9yaWdpbmFsIGlucHV0LCBhbmQgdGhlIHByZWZpeCBhZGRlZC4gVGhlIHJlc3VsdGluZworICAgICAqIGxpbmUgaXMgdGhlbiB1c2VkIHVudGlsIGl0IGVuZHMsIGF0IHdoaWNoIHBvaW50IHRoZSBuZXh0IG9yaWdpbmFsIGxpbmUKKyAgICAgKiBpcyByZWFkLCBldGMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbSwgb3IgLTEKKyAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbgorICAgICAqIGR1cmluZyByZWFkaW5nCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFnZXRJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgICAgICBzZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjaCA9IC0xOworCisgICAgICAgIGlmIChxdWV1ZWREYXRhICE9IG51bGwgJiYgcXVldWVkRGF0YS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBxdWV1ZWREYXRhID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZWREYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoID0gcXVldWVkRGF0YS5jaGFyQXQoMCk7CisgICAgICAgICAgICBxdWV1ZWREYXRhID0gcXVldWVkRGF0YS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICBpZiAocXVldWVkRGF0YS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcXVldWVkRGF0YSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBxdWV1ZWREYXRhID0gcmVhZExpbmUoKTsKKyAgICAgICAgICAgIGlmIChxdWV1ZWREYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaCA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcXVldWVkRGF0YSA9IHByZWZpeCArIHF1ZXVlZERhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByZWZpeCB0byBhZGQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggaW5wdXQgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggVGhlIHByZWZpeCB0byBhZGQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggaW5wdXQgbGluZS4KKyAgICAgKiAgICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZSBubyBwcmVmaXgKKyAgICAgKiAgICAgICAgICAgICAgIGlzIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChmaW5hbCBTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByZWZpeCB3aGljaCB3aWxsIGJlIGFkZGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIGlucHV0IGxpbmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmVmaXggd2hpY2ggd2lsbCBiZSBhZGRlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBpbnB1dCBsaW5lCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICByZXR1cm4gcHJlZml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgUHJlZml4TGluZXMgZmlsdGVyIHVzaW5nIHRoZSBwYXNzZWQgaW4KKyAgICAgKiBSZWFkZXIgZm9yIGluc3RhbnRpYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmRyIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBiYXNlZCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24sIGJ1dCBmaWx0ZXJpbmcKKyAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgcmVhZGVyCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBjaGFpbihmaW5hbCBSZWFkZXIgcmRyKSB7CisgICAgICAgIFByZWZpeExpbmVzIG5ld0ZpbHRlciA9IG5ldyBQcmVmaXhMaW5lcyhyZHIpOworICAgICAgICBuZXdGaWx0ZXIuc2V0UHJlZml4KGdldFByZWZpeCgpKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldEluaXRpYWxpemVkKHRydWUpOworICAgICAgICByZXR1cm4gbmV3RmlsdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBwcmVmaXggaWYgaXQgaXMgYXZhaWxhYmxlIGZyb20gdGhlIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChQUkVGSVhfS0VZLmVxdWFscyhwYXJhbXNbaV0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJhbXNbaV0uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9SZXBsYWNlVG9rZW5zLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1JlcGxhY2VUb2tlbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2ZmZTExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9SZXBsYWNlVG9rZW5zLmphdmEKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFJlcGxhY2VzIHRva2VucyBpbiB0aGUgb3JpZ2luYWwgaW5wdXQgd2l0aCB1c2VyLXN1cHBsaWVkIHZhbHVlcy4KKyAqCisgKiBFeGFtcGxlOgorICoKKyAqIDxwcmU+Jmx0O3JlcGxhY2V0b2tlbnMgYmVnaW50b2tlbj0mcXVvdDsjJnF1b3Q7IGVuZHRva2VuPSZxdW90OyMmcXVvdDsmZ3Q7CisgKiAgICZsdDt0b2tlbiBrZXk9JnF1b3Q7REFURSZxdW90OyB2YWx1ZT0mcXVvdDske1RPREFZfSZxdW90Oy8mZ3Q7CisgKiAmbHQ7L3JlcGxhY2V0b2tlbnMmZ3Q7PC9wcmU+CisgKgorICogT3I6CisgKgorICogPHByZT4mbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5SZXBsYWNlVG9rZW5zIiZndDsKKyAqICAgJmx0O3BhcmFtIHR5cGU9InRva2VuY2hhciIgbmFtZT0iYmVnaW50b2tlbiIgdmFsdWU9IiMiLyZndDsKKyAqICAgJmx0O3BhcmFtIHR5cGU9InRva2VuY2hhciIgbmFtZT0iZW5kdG9rZW4iIHZhbHVlPSIjIi8mZ3Q7CisgKiAgICZsdDtwYXJhbSB0eXBlPSJ0b2tlbiIgbmFtZT0iREFURSIgdmFsdWU9IiR7VE9EQVl9Ii8mZ3Q7CisgKiAmbHQ7L2ZpbHRlcnJlYWRlciZndDs8L3ByZT4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXBsYWNlVG9rZW5zCisgICAgZXh0ZW5kcyBCYXNlUGFyYW1GaWx0ZXJSZWFkZXIKKyAgICBpbXBsZW1lbnRzIENoYWluYWJsZVJlYWRlciB7CisgICAgLyoqIERlZmF1bHQgImJlZ2luIHRva2VuIiBjaGFyYWN0ZXIuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBERUZBVUxUX0JFR0lOX1RPS0VOID0gJ0AnOworCisgICAgLyoqIERlZmF1bHQgImVuZCB0b2tlbiIgY2hhcmFjdGVyLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgREVGQVVMVF9FTkRfVE9LRU4gPSAnQCc7CisKKyAgICAvKiogRGF0YSB0byBiZSB1c2VkIGJlZm9yZSByZWFkaW5nIGZyb20gc3RyZWFtIGFnYWluICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVldWVkRGF0YSA9IG51bGw7CisKKyAgICAvKiogcmVwbGFjZW1lbnQgdGVzdCBmcm9tIGEgdG9rZW4gKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXBsYWNlRGF0YSA9IG51bGw7CisKKyAgICAvKiogSW5kZXggaW50byByZXBsYWNlbWVudCBkYXRhICovCisgICAgcHJpdmF0ZSBpbnQgcmVwbGFjZUluZGV4ID0gLTE7CisKKyAgICAvKiogSW5kZXggaW50byBxdWV1ZSBkYXRhICovCisgICAgcHJpdmF0ZSBpbnQgcXVldWVJbmRleCA9IC0xOworCisgICAgLyoqIEhhc2h0YWJsZSB0byBob2xkIHRoZSByZXBsYWNlZS1yZXBsYWNlciBwYWlycyAoU3RyaW5nIHRvIFN0cmluZykuICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgaGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKiBDaGFyYWN0ZXIgbWFya2luZyB0aGUgYmVnaW5uaW5nIG9mIGEgdG9rZW4uICovCisgICAgcHJpdmF0ZSBjaGFyIGJlZ2luVG9rZW4gPSBERUZBVUxUX0JFR0lOX1RPS0VOOworCisgICAgLyoqIENoYXJhY3RlciBtYXJraW5nIHRoZSBlbmQgb2YgYSB0b2tlbi4gKi8KKyAgICBwcml2YXRlIGNoYXIgZW5kVG9rZW4gPSBERUZBVUxUX0VORF9UT0tFTjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciAiZHVtbXkiIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBzZWUgQmFzZUZpbHRlclJlYWRlciNCYXNlRmlsdGVyUmVhZGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVwbGFjZVRva2VucygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbHRlcmVkIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFJlcGxhY2VUb2tlbnMoZmluYWwgUmVhZGVyIGluKSB7CisgICAgICAgIHN1cGVyKGluKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXROZXh0Q2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChxdWV1ZUluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2ggPSBxdWV1ZWREYXRhLmNoYXJBdChxdWV1ZUluZGV4KyspOworICAgICAgICAgICAgaWYgKHF1ZXVlSW5kZXggPj0gcXVldWVkRGF0YS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXggPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbi5yZWFkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbSwgcmVwbGFjaW5nIHRva2VucworICAgICAqIGZyb20gdGhlIG9yaWdpbmFsIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSByZXN1bHRpbmcgc3RyZWFtLCBvciAtMQorICAgICAqIGlmIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyBzdHJlYW0gdGhyb3dzIGFuIElPRXhjZXB0aW9uCisgICAgICogZHVyaW5nIHJlYWRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWdldEluaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIHNldEluaXRpYWxpemVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcGxhY2VJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgZmluYWwgaW50IGNoID0gcmVwbGFjZURhdGEuY2hhckF0KHJlcGxhY2VJbmRleCsrKTsKKyAgICAgICAgICAgIGlmIChyZXBsYWNlSW5kZXggPj0gcmVwbGFjZURhdGEubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICByZXBsYWNlSW5kZXggPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjaCA9IGdldE5leHRDaGFyKCk7CisKKyAgICAgICAgaWYgKGNoID09IGJlZ2luVG9rZW4pIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBrZXkgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgICAgIGRvICB7CisgICAgICAgICAgICAgICAgY2ggPSBnZXROZXh0Q2hhcigpOworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBrZXkuYXBwZW5kKChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoY2ggIT0gZW5kVG9rZW4pOworCisgICAgICAgICAgICBpZiAoY2ggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVldWVkRGF0YSA9PSBudWxsIHx8IHF1ZXVlSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcXVldWVkRGF0YSA9IGtleS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHF1ZXVlZERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgID0ga2V5LnRvU3RyaW5nKCkgKyBxdWV1ZWREYXRhLnN1YnN0cmluZyhxdWV1ZUluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcXVldWVJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJlZ2luVG9rZW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGtleS5zZXRMZW5ndGgoa2V5Lmxlbmd0aCgpIC0gMSk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVwbGFjZVdpdGggPSAoU3RyaW5nKSBoYXNoLmdldChrZXkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VXaXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VXaXRoLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZURhdGEgPSByZXBsYWNlV2l0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3RGF0YSA9IGtleS50b1N0cmluZygpICsgZW5kVG9rZW47CisgICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZWREYXRhID09IG51bGwgfHwgcXVldWVJbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVkRGF0YSA9IG5ld0RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWREYXRhID0gbmV3RGF0YSArIHF1ZXVlZERhdGEuc3Vic3RyaW5nKHF1ZXVlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHF1ZXVlSW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVnaW5Ub2tlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlICJiZWdpbiB0b2tlbiIgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGJlZ2luVG9rZW4gdGhlIGNoYXJhY3RlciB1c2VkIHRvIGRlbm90ZSB0aGUgYmVnaW5uaW5nIG9mIGEgdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCZWdpblRva2VuKGZpbmFsIGNoYXIgYmVnaW5Ub2tlbikgeworICAgICAgICB0aGlzLmJlZ2luVG9rZW4gPSBiZWdpblRva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlICJiZWdpbiB0b2tlbiIgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gZGVub3RlIHRoZSBiZWdpbm5pbmcgb2YgYSB0b2tlbgorICAgICAqLworICAgIHByaXZhdGUgY2hhciBnZXRCZWdpblRva2VuKCkgeworICAgICAgICByZXR1cm4gYmVnaW5Ub2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSAiZW5kIHRva2VuIiBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5kVG9rZW4gdGhlIGNoYXJhY3RlciB1c2VkIHRvIGRlbm90ZSB0aGUgZW5kIG9mIGEgdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmRUb2tlbihmaW5hbCBjaGFyIGVuZFRva2VuKSB7CisgICAgICAgIHRoaXMuZW5kVG9rZW4gPSBlbmRUb2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSAiZW5kIHRva2VuIiBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBkZW5vdGUgdGhlIGVuZCBvZiBhIHRva2VuCisgICAgICovCisgICAgcHJpdmF0ZSBjaGFyIGdldEVuZFRva2VuKCkgeworICAgICAgICByZXR1cm4gZW5kVG9rZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHRva2VuIGVsZW1lbnQgdG8gdGhlIG1hcCBvZiB0b2tlbnMgdG8gcmVwbGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gdG8gYWRkIHRvIHRoZSBtYXAgb2YgcmVwbGFjZW1lbnRzLgorICAgICAqICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkVG9rZW4oZmluYWwgVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgaGFzaC5wdXQodG9rZW4uZ2V0S2V5KCksIHRva2VuLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgcHJvcGVydGllcyBmcm9tIGEgc3BlY2lmaWVkIHByb3BlcnRpZXMgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgZmlsZSB0byBsb2FkIHByb3BlcnRpZXMgZnJvbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllc0Zyb21GaWxlIChTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOworICAgICAgICAgICAgcHJvcHMubG9hZChpbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9wczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXAgb2YgdG9rZW5zIHRvIHJlcGxhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFzaCBBIG1hcCAoU3RyaW5nLT5TdHJpbmcpIG9mIHRva2VuIGtleXMgdG8gcmVwbGFjZW1lbnQKKyAgICAgKiB2YWx1ZXMuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRUb2tlbnMoZmluYWwgSGFzaHRhYmxlIGhhc2gpIHsKKyAgICAgICAgdGhpcy5oYXNoID0gaGFzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXAgb2YgdG9rZW5zIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbWFwIChTdHJpbmctPlN0cmluZykgb2YgdG9rZW4ga2V5cyB0byByZXBsYWNlbWVudAorICAgICAqIHZhbHVlcworICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIGdldFRva2VucygpIHsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBSZXBsYWNlVG9rZW5zIHVzaW5nIHRoZSBwYXNzZWQgaW4KKyAgICAgKiBSZWFkZXIgZm9yIGluc3RhbnRpYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmRyIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBiYXNlZCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24sIGJ1dCBmaWx0ZXJpbmcKKyAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgcmVhZGVyCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBjaGFpbihmaW5hbCBSZWFkZXIgcmRyKSB7CisgICAgICAgIFJlcGxhY2VUb2tlbnMgbmV3RmlsdGVyID0gbmV3IFJlcGxhY2VUb2tlbnMocmRyKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldEJlZ2luVG9rZW4oZ2V0QmVnaW5Ub2tlbigpKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldEVuZFRva2VuKGdldEVuZFRva2VuKCkpOworICAgICAgICBuZXdGaWx0ZXIuc2V0VG9rZW5zKGdldFRva2VucygpKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldEluaXRpYWxpemVkKHRydWUpOworICAgICAgICByZXR1cm4gbmV3RmlsdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRva2VucyBhbmQgbG9hZHMgdGhlIHJlcGxhY2VlLXJlcGxhY2VyIGhhc2h0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOworICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlID0gcGFyYW1zW2ldLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJ0b2tlbmNoYXIiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBwYXJhbXNbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyYW1zW2ldLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoImJlZ2ludG9rZW4iLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQmVnaW4gdG9rZW4gY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlIGVtcHR5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luVG9rZW4gPSBwYXJhbXNbaV0uZ2V0VmFsdWUoKS5jaGFyQXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJlbmR0b2tlbiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFbmQgdG9rZW4gY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlIGVtcHR5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRva2VuID0gcGFyYW1zW2ldLmdldFZhbHVlKCkuY2hhckF0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJ0b2tlbiIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBwYXJhbXNbaV0uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc2gucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicHJvcGVydGllc2ZpbGUiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGdldFByb3BlcnRpZXNGcm9tRmlsZShwYXJhbXNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBwcm9wcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2gucHV0KGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSG9sZHMgYSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVG9rZW4geworCisgICAgICAgIC8qKiBUb2tlbiBrZXkgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcga2V5OworCisgICAgICAgIC8qKiBUb2tlbiB2YWx1ZSAqLworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgdG9rZW4ga2V5CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhpcyB0b2tlbi4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgdG9rZW4gdmFsdWUKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhpcyB0b2tlbi4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgdG9rZW4uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyB0b2tlbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGlzIHRva2VuLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhpcyB0b2tlbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaW5nSW5wdXRTdHJlYW0uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaW5nSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTUwZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpbmdJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZWFkZXJJbnB1dFN0cmVhbTsKKworLyoqCisgKiBXcmFwcyBhIFN0cmluZyBhcyBhbiBJbnB1dFN0cmVhbS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdJbnB1dFN0cmVhbSBleHRlbmRzIFJlYWRlcklucHV0U3RyZWFtIHsKKworICAgIC8qKgorICAgICAqIENvbXBvc2VzIGEgc3RyZWFtIGZyb20gYSBTdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmluZyB0byByZWFkIGZyb20uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdJbnB1dFN0cmVhbShTdHJpbmcgc291cmNlKSB7CisgICAgICAgIHN1cGVyKG5ldyBTdHJpbmdSZWFkZXIoc291cmNlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgYSBzdHJlYW0gZnJvbSBhIFN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmluZyB0byByZWFkIGZyb20uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgc2NoZW1lLiAgQWxzbyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nSW5wdXRTdHJlYW0oU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHN1cGVyKG5ldyBTdHJpbmdSZWFkZXIoc291cmNlKSwgZW5jb2RpbmcpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcEphdmFDb21tZW50cy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcEphdmFDb21tZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YmNjZDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmlwSmF2YUNvbW1lbnRzLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKKy8qKgorICogVGhpcyBpcyBhIEphdmEgY29tbWVudCBhbmQgc3RyaW5nIHN0cmlwcGVyIHJlYWRlciB0aGF0IGZpbHRlcnMKKyAqIHRob3NlIGxleGljYWwgdG9rZW5zIG91dCBmb3IgcHVycG9zZXMgb2Ygc2ltcGxlIEphdmEgcGFyc2luZy4KKyAqIChpZiB5b3UgaGF2ZSBtb3JlIGNvbXBsZXggSmF2YSBwYXJzaW5nIG5lZWRzLCB1c2UgYSByZWFsIGxleGVyKS4KKyAqIFNpbmNlIHRoaXMgY2xhc3MgaGVhdmlseSByZWxpZXMgb24gdGhlIHNpbmdsZSBjaGFyIHJlYWQgZnVuY3Rpb24sCisgKiB5b3UgYXJlIHJlY29tbWVuZGVkIHRvIG1ha2UgaXQgd29yayBvbiB0b3Agb2YgYSBidWZmZXJlZCByZWFkZXIuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3RyaXBKYXZhQ29tbWVudHMKKyAgICBleHRlbmRzIEJhc2VGaWx0ZXJSZWFkZXIKKyAgICBpbXBsZW1lbnRzIENoYWluYWJsZVJlYWRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhZC1haGVhZCBjaGFyYWN0ZXIsIHVzZWQgZm9yIGVmZmVjdGl2ZWx5IHB1c2hpbmcgYSBzaW5nbGUKKyAgICAgKiBjaGFyYWN0ZXIgYmFjay4gQSB2YWx1ZSBvZiAtMSBpbmRpY2F0ZXMgdGhhdCBubyBjaGFyYWN0ZXIgaXMgaW4gdGhlCisgICAgICogYnVmZmVyLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlYWRBaGVhZENoID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFyc2VyIGlzIGN1cnJlbnRseSBpbiB0aGUgbWlkZGxlIG9mIGEgc3RyaW5nCisgICAgICogbGl0ZXJhbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW5TdHJpbmcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBsYXN0IGNoYXIgaGFzIGJlZW4gYSBiYWNrc2xhc2guCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHF1b3RlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yICJkdW1teSIgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNlZSBCYXNlRmlsdGVyUmVhZGVyI0Jhc2VGaWx0ZXJSZWFkZXIoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpcEphdmFDb21tZW50cygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbHRlcmVkIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmlwSmF2YUNvbW1lbnRzKGZpbmFsIFJlYWRlciBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbSwgbm90IGluY2x1ZGluZworICAgICAqIEphdmEgY29tbWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbSwgb3IgLTEKKyAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbgorICAgICAqIGR1cmluZyByZWFkaW5nCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGNoID0gLTE7CisgICAgICAgIGlmIChyZWFkQWhlYWRDaCAhPSAtMSkgeworICAgICAgICAgICAgY2ggPSByZWFkQWhlYWRDaDsKKyAgICAgICAgICAgIHJlYWRBaGVhZENoID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnIicgJiYgIXF1b3RlZCkgeworICAgICAgICAgICAgICAgIGluU3RyaW5nID0gIWluU3RyaW5nOworICAgICAgICAgICAgICAgIHF1b3RlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgcXVvdGVkID0gIXF1b3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVvdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKCFpblN0cmluZykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2ggIT0gJ1xuJyAmJiBjaCAhPSAtMSAmJiBjaCAhPSAnXHInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gaW4ucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyonKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gaW4ucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyonKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaCA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcvJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gcmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQWhlYWRDaCA9IGNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJy8nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgU3RyaXBKYXZhQ29tbWVudHMgdXNpbmcgdGhlIHBhc3NlZCBpbgorICAgICAqIFJlYWRlciBmb3IgaW5zdGFudGlhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZHIgQSBSZWFkZXIgb2JqZWN0IHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGJhc2VkIG9uIHRoaXMgY29uZmlndXJhdGlvbiwgYnV0IGZpbHRlcmluZworICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCByZWFkZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyBSZWFkZXIgY2hhaW4oZmluYWwgUmVhZGVyIHJkcikgeworICAgICAgICBTdHJpcEphdmFDb21tZW50cyBuZXdGaWx0ZXIgPSBuZXcgU3RyaXBKYXZhQ29tbWVudHMocmRyKTsKKyAgICAgICAgcmV0dXJuIG5ld0ZpbHRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmlwTGluZUJyZWFrcy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcExpbmVCcmVha3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWJkYTYzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcExpbmVCcmVha3MuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CisKKy8qKgorICogRmlsdGVyIHRvIGZsYXR0ZW4gdGhlIHN0cmVhbSB0byBhIHNpbmdsZSBsaW5lLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogPHByZT4mbHQ7c3RyaXBsaW5lYnJlYWtzLyZndDs8L3ByZT4KKyAqCisgKiBPcjoKKyAqCisgKiA8cHJlPiZsdDtmaWx0ZXJyZWFkZXIKKyAqICAgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuU3RyaXBMaW5lQnJlYWtzJnF1b3Q7LyZndDs8L3ByZT4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdHJpcExpbmVCcmVha3MKKyAgICBleHRlbmRzIEJhc2VQYXJhbUZpbHRlclJlYWRlcgorICAgIGltcGxlbWVudHMgQ2hhaW5hYmxlUmVhZGVyIHsKKyAgICAvKioKKyAgICAgKiBMaW5lLWJyZWFraW5nIGNoYXJhY3RlcnMuCisgICAgICogV2hhdCBzaG91bGQgd2UgZG8gb24gZnVubnkgSUJNIG1haW5mcmFtZXMgd2l0aCBvZGQgbGluZSBlbmRpbmdzPworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJTkVfQlJFQUtTID0gIlxyXG4iOworCisgICAgLyoqIFBhcmFtZXRlciBuYW1lIGZvciB0aGUgbGluZS1icmVha2luZyBjaGFyYWN0ZXJzIHBhcmFtZXRlci4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9CUkVBS1NfS0VZID0gImxpbmVicmVha3MiOworCisgICAgLyoqIFRoZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHJlY29nbml6ZWQgYXMgbGluZSBicmVha3MuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbGluZUJyZWFrcyA9IERFRkFVTFRfTElORV9CUkVBS1M7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgImR1bW15IiBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAc2VlIEJhc2VGaWx0ZXJSZWFkZXIjQmFzZUZpbHRlclJlYWRlcigpCisgICAgICovCisgICAgcHVibGljIFN0cmlwTGluZUJyZWFrcygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbHRlcmVkIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmlwTGluZUJyZWFrcyhmaW5hbCBSZWFkZXIgaW4pIHsKKyAgICAgICAgc3VwZXIoaW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0sIG9ubHkgaW5jbHVkaW5nCisgICAgICogY2hhcmFjdGVycyBub3QgaW4gdGhlIHNldCBvZiBsaW5lLWJyZWFraW5nIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbSwgb3IgLTEKKyAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbgorICAgICAqIGR1cmluZyByZWFkaW5nCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFnZXRJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgICAgICBzZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgd2hpbGUgKGNoICE9IC0xKSB7CisgICAgICAgICAgICBpZiAobGluZUJyZWFrcy5pbmRleE9mKGNoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGluZS1icmVha2luZyBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmVCcmVha3MgQSBTdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIGNoYXJhY3RlcnMgdG8gYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBjb25zaWRlcmVkIGFzIGxpbmUtYnJlYWtpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGluZUJyZWFrcyhmaW5hbCBTdHJpbmcgbGluZUJyZWFrcykgeworICAgICAgICB0aGlzLmxpbmVCcmVha3MgPSBsaW5lQnJlYWtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpbmUtYnJlYWtpbmcgY2hhcmFjdGVycyBhcyBhIFN0cmluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBhcworICAgICAqICAgICAgICAgbGluZS1icmVha2luZworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldExpbmVCcmVha3MoKSB7CisgICAgICAgIHJldHVybiBsaW5lQnJlYWtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgU3RyaXBMaW5lQnJlYWtzIHVzaW5nIHRoZSBwYXNzZWQgaW4KKyAgICAgKiBSZWFkZXIgZm9yIGluc3RhbnRpYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmRyIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBiYXNlZCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24sIGJ1dCBmaWx0ZXJpbmcKKyAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgcmVhZGVyCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBjaGFpbihmaW5hbCBSZWFkZXIgcmRyKSB7CisgICAgICAgIFN0cmlwTGluZUJyZWFrcyBuZXdGaWx0ZXIgPSBuZXcgU3RyaXBMaW5lQnJlYWtzKHJkcik7CisgICAgICAgIG5ld0ZpbHRlci5zZXRMaW5lQnJlYWtzKGdldExpbmVCcmVha3MoKSk7CisgICAgICAgIG5ld0ZpbHRlci5zZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG5ld0ZpbHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHBhcmFtZXRlcnMgdG8gc2V0IHRoZSBsaW5lLWJyZWFraW5nIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIFN0cmluZyB1c2VyRGVmaW5lZExpbmVCcmVha3MgPSBudWxsOworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoTElORV9CUkVBS1NfS0VZLmVxdWFscyhwYXJhbXNbaV0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICB1c2VyRGVmaW5lZExpbmVCcmVha3MgPSBwYXJhbXNbaV0uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh1c2VyRGVmaW5lZExpbmVCcmVha3MgIT0gbnVsbCkgeworICAgICAgICAgICAgbGluZUJyZWFrcyA9IHVzZXJEZWZpbmVkTGluZUJyZWFrczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaXBMaW5lQ29tbWVudHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaXBMaW5lQ29tbWVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg4ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcExpbmVDb21tZW50cy5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworCisvKioKKyAqIFRoaXMgZmlsdGVyIHN0cmlwcyBsaW5lIGNvbW1lbnRzLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogPHByZT4mbHQ7c3RyaXBsaW5lY29tbWVudHMmZ3Q7CisgKiAgICZsdDtjb21tZW50IHZhbHVlPSZxdW90OyMmcXVvdDsvJmd0OworICogICAmbHQ7Y29tbWVudCB2YWx1ZT0mcXVvdDstLSZxdW90Oy8mZ3Q7CisgKiAgICZsdDtjb21tZW50IHZhbHVlPSZxdW90O1JFTSAmcXVvdDsvJmd0OworICogICAmbHQ7Y29tbWVudCB2YWx1ZT0mcXVvdDtyZW0gJnF1b3Q7LyZndDsKKyAqICAgJmx0O2NvbW1lbnQgdmFsdWU9JnF1b3Q7Ly8mcXVvdDsvJmd0OworICogJmx0Oy9zdHJpcGxpbmVjb21tZW50cyZndDs8L3ByZT4KKyAqCisgKiBPcjoKKyAqCisgKiA8cHJlPiZsdDtmaWx0ZXJyZWFkZXIKKyAqICAgICAgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuU3RyaXBMaW5lQ29tbWVudHMmcXVvdDsmZ3Q7CisgKiAgICZsdDtwYXJhbSB0eXBlPSZxdW90O2NvbW1lbnQmcXVvdDsgdmFsdWU9IiMmcXVvdDsvJmd0OworICogICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb21tZW50JnF1b3Q7IHZhbHVlPSZxdW90Oy0tJnF1b3Q7LyZndDsKKyAqICAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7Y29tbWVudCZxdW90OyB2YWx1ZT0mcXVvdDtSRU0gJnF1b3Q7LyZndDsKKyAqICAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7Y29tbWVudCZxdW90OyB2YWx1ZT0mcXVvdDtyZW0gJnF1b3Q7LyZndDsKKyAqICAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7Y29tbWVudCZxdW90OyB2YWx1ZT0mcXVvdDsvLyZxdW90Oy8mZ3Q7CisgKiAmbHQ7L2ZpbHRlcnJlYWRlciZndDs8L3ByZT4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdHJpcExpbmVDb21tZW50cworICAgIGV4dGVuZHMgQmFzZVBhcmFtRmlsdGVyUmVhZGVyCisgICAgaW1wbGVtZW50cyBDaGFpbmFibGVSZWFkZXIgeworICAgIC8qKiBQYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIGNvbW1lbnQgcHJlZml4LiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UU19LRVkgPSAiY29tbWVudCI7CisKKyAgICAvKiogVmVjdG9yIHRoYXQgaG9sZHMgdGhlIGNvbW1lbnQgcHJlZml4ZXMuICovCisgICAgcHJpdmF0ZSBWZWN0b3IgY29tbWVudHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiogVGhlIGxpbmUgdGhhdCBoYXMgYmVlbiByZWFkIGFoZWFkLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGxpbmUgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yICJkdW1teSIgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNlZSBCYXNlRmlsdGVyUmVhZGVyI0Jhc2VGaWx0ZXJSZWFkZXIoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpcExpbmVDb21tZW50cygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbHRlcmVkIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmlwTGluZUNvbW1lbnRzKGZpbmFsIFJlYWRlciBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbSwgb25seSBpbmNsdWRpbmcKKyAgICAgKiBsaW5lcyBmcm9tIHRoZSBvcmlnaW5hbCBzdHJlYW0gd2hpY2ggZG9uJ3Qgc3RhcnQgd2l0aCBhbnkgb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGNvbW1lbnQgcHJlZml4ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbSwgb3IgLTEKKyAgICAgKiBpZiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbgorICAgICAqIGR1cmluZyByZWFkaW5nCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFnZXRJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgICAgICBzZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjaCA9IC0xOworCisgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoID0gbGluZS5jaGFyQXQoMCk7CisgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpbmUgPSByZWFkTGluZSgpOworICAgICAgICAgICAgZmluYWwgaW50IGNvbW1lbnRzU2l6ZSA9IGNvbW1lbnRzLnNpemUoKTsKKworICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWVudHNTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1lbnQgPSAoU3RyaW5nKSBjb21tZW50cy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoY29tbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgc3RhcnRlZCB3aXRoIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgPGNvZGU+Y29tbWVudDwvY29kZT4gZWxlbWVudCB0byB0aGUgbGlzdCBvZiBwcmVmaXhlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tZW50IFRoZSA8Y29kZT5jb21tZW50PC9jb2RlPiBlbGVtZW50IHRvIGFkZCB0byB0aGUKKyAgICAgKiBsaXN0IG9mIGNvbW1lbnQgcHJlZml4ZXMgdG8gc3RyaXAuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRDb21tZW50KGZpbmFsIENvbW1lbnQgY29tbWVudCkgeworICAgICAgICBjb21tZW50cy5hZGRFbGVtZW50KGNvbW1lbnQuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdCBvZiBjb21tZW50IHByZWZpeGVzIHRvIHN0cmlwLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnRzIEEgbGlzdCBvZiBzdHJpbmdzLCBlYWNoIG9mIHdoaWNoIGlzIGEgcHJlZml4CisgICAgICogZm9yIGEgY29tbWVudCBsaW5lLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Q29tbWVudHMoZmluYWwgVmVjdG9yIGNvbW1lbnRzKSB7CisgICAgICAgIHRoaXMuY29tbWVudHMgPSBjb21tZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNvbW1lbnQgcHJlZml4ZXMgdG8gc3RyaXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvbW1lbnQgcHJlZml4ZXMgdG8gc3RyaXAuCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3IgZ2V0Q29tbWVudHMoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFN0cmlwTGluZUNvbW1lbnRzIHVzaW5nIHRoZSBwYXNzZWQgaW4KKyAgICAgKiBSZWFkZXIgZm9yIGluc3RhbnRpYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmRyIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBiYXNlZCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24sIGJ1dCBmaWx0ZXJpbmcKKyAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgcmVhZGVyCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBjaGFpbihmaW5hbCBSZWFkZXIgcmRyKSB7CisgICAgICAgIFN0cmlwTGluZUNvbW1lbnRzIG5ld0ZpbHRlciA9IG5ldyBTdHJpcExpbmVDb21tZW50cyhyZHIpOworICAgICAgICBuZXdGaWx0ZXIuc2V0Q29tbWVudHMoZ2V0Q29tbWVudHMoKSk7CisgICAgICAgIG5ld0ZpbHRlci5zZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG5ld0ZpbHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHBhcmFtZXRlcnMgdG8gc2V0IHRoZSBjb21tZW50IHByZWZpeGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoQ09NTUVOVFNfS0VZLmVxdWFscyhwYXJhbXNbaV0uZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5hZGRFbGVtZW50KHBhcmFtc1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgdGhhdCBob2xkcyBhIGNvbW1lbnQgcmVwcmVzZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tZW50IHsKKworICAgICAgICAvKiogVGhlIHByZWZpeCBmb3IgYSBsaW5lIGNvbW1lbnQuICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBwcmVmaXggZm9yIHRoaXMgdHlwZSBvZiBsaW5lIGNvbW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb21tZW50IFRoZSBwcmVmaXggZm9yIGEgbGluZSBjb21tZW50IG9mIHRoaXMgdHlwZS4KKyAgICAgICAgICogTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWYWx1ZShTdHJpbmcgY29tbWVudCkgeworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb21tZW50IHZhbHVlIGFscmVhZHkgc2V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBjb21tZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHByZWZpeCBmb3IgdGhpcyB0eXBlIG9mIGxpbmUgY29tbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgcHJlZml4IGZvciB0aGlzIHR5cGUgb2YgbGluZSBjb21tZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbHQuIHN5bnRheCB0byBzZXQgdGhlIHByZWZpeCBmb3IgdGhpcyB0eXBlIG9mIGxpbmUgY29tbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbW1lbnQgVGhlIHByZWZpeCBmb3IgYSBsaW5lIGNvbW1lbnQgb2YgdGhpcyB0eXBlLgorICAgICAgICAgKiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgICAgIHNldFZhbHVlKGNvbW1lbnQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9UYWJzVG9TcGFjZXMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVGFic1RvU3BhY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzODk5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVGFic1RvU3BhY2VzLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworCisvKioKKyAqIENvbnZlcnRzIHRhYnMgdG8gc3BhY2VzLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogPHByZT4mbHQ7dGFidG9zcGFjZXMgdGFibGVuZ3RoPSZxdW90OzgmcXVvdDsvJmd0OzwvcHJlPgorICoKKyAqIE9yOgorICoKKyAqIDxwcmU+Jmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5UYWJzVG9TcGFjZXMmcXVvdDsmZ3Q7CisgKiAgICZsdDtwYXJhbSBuYW1lPSZxdW90O3RhYmxlbmd0aCZxdW90OyB2YWx1ZT0mcXVvdDs4JnF1b3Q7LyZndDsKKyAqICZsdDsvZmlsdGVycmVhZGVyJmd0OzwvcHJlPgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRhYnNUb1NwYWNlcworICAgIGV4dGVuZHMgQmFzZVBhcmFtRmlsdGVyUmVhZGVyCisgICAgaW1wbGVtZW50cyBDaGFpbmFibGVSZWFkZXIgeworICAgIC8qKiBUaGUgZGVmYXVsdCB0YWIgbGVuZ3RoLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RBQl9MRU5HVEggPSA4OworCisgICAgLyoqIFBhcmFtZXRlciBuYW1lIGZvciB0aGUgbGVuZ3RoIG9mIGEgdGFiLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJfTEVOR1RIX0tFWSA9ICJ0YWJsZW5ndGgiOworCisgICAgLyoqIFRhYiBsZW5ndGggaW4gdGhpcyBmaWx0ZXIuICovCisgICAgcHJpdmF0ZSBpbnQgdGFiTGVuZ3RoID0gREVGQVVMVF9UQUJfTEVOR1RIOworCisgICAgLyoqIFRoZSBudW1iZXIgb2Ygc3BhY2VzIHN0aWxsIHRvIGJlIHJlYWQgdG8gcmVwcmVzZW50IHRoZSBsYXN0LXJlYWQgdGFiLiAqLworICAgIHByaXZhdGUgaW50IHNwYWNlc1JlbWFpbmluZyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgImR1bW15IiBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAc2VlIEJhc2VGaWx0ZXJSZWFkZXIjQmFzZUZpbHRlclJlYWRlcigpCisgICAgICovCisgICAgcHVibGljIFRhYnNUb1NwYWNlcygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbHRlcmVkIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBBIFJlYWRlciBvYmplY3QgcHJvdmlkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFRhYnNUb1NwYWNlcyhmaW5hbCBSZWFkZXIgaW4pIHsKKyAgICAgICAgc3VwZXIoaW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0sIGNvbnZlcnRpbmcgdGFicworICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNwYWNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSByZXN1bHRpbmcgc3RyZWFtLCBvciAtMQorICAgICAqIGlmIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyBzdHJlYW0gdGhyb3dzIGFuIElPRXhjZXB0aW9uCisgICAgICogZHVyaW5nIHJlYWRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWdldEluaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIHNldEluaXRpYWxpemVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNoID0gLTE7CisKKyAgICAgICAgaWYgKHNwYWNlc1JlbWFpbmluZyA+IDApIHsKKyAgICAgICAgICAgIHNwYWNlc1JlbWFpbmluZy0tOworICAgICAgICAgICAgY2ggPSAnICc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgc3BhY2VzUmVtYWluaW5nID0gdGFiTGVuZ3RoIC0gMTsKKyAgICAgICAgICAgICAgICBjaCA9ICcgJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFiIGxlbmd0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWJMZW5ndGggdGhlIG51bWJlciBvZiBzcGFjZXMgdG8gYmUgdXNlZCB3aGVuIGNvbnZlcnRpbmcgYSB0YWIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFibGVuZ3RoKGZpbmFsIGludCB0YWJMZW5ndGgpIHsKKyAgICAgICAgdGhpcy50YWJMZW5ndGggPSB0YWJMZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFiIGxlbmd0aC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzcGFjZXMgdXNlZCB3aGVuIGNvbnZlcnRpbmcgYSB0YWIKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRUYWJsZW5ndGgoKSB7CisgICAgICAgIHJldHVybiB0YWJMZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBUYWJzVG9TcGFjZXMgdXNpbmcgdGhlIHBhc3NlZCBpbgorICAgICAqIFJlYWRlciBmb3IgaW5zdGFudGlhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZHIgQSBSZWFkZXIgb2JqZWN0IHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGJhc2VkIG9uIHRoaXMgY29uZmlndXJhdGlvbiwgYnV0IGZpbHRlcmluZworICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCByZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhZGVyIGNoYWluKGZpbmFsIFJlYWRlciByZHIpIHsKKyAgICAgICAgVGFic1RvU3BhY2VzIG5ld0ZpbHRlciA9IG5ldyBUYWJzVG9TcGFjZXMocmRyKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldFRhYmxlbmd0aChnZXRUYWJsZW5ndGgoKSk7CisgICAgICAgIG5ld0ZpbHRlci5zZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG5ld0ZpbHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHBhcmFtZXRlcnMgdG8gc2V0IHRoZSB0YWIgbGVuZ3RoLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1zW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRBQl9MRU5HVEhfS0VZLmVxdWFscyhwYXJhbXNbaV0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFiTGVuZ3RoID0gSW50ZWdlci5wYXJzZUludChwYXJhbXNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVGFpbEZpbHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9UYWlsRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyODFmMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVGFpbEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkxpbmVUb2tlbml6ZXI7CisKKy8qKgorICogUmVhZHMgdGhlIGxhc3QgPGNvZGU+bjwvY29kZT4gbGluZXMgb2YgYSBzdHJlYW0uIChEZWZhdWx0IGlzIGxhc3QxMCBsaW5lcy4pCisgKgorICogRXhhbXBsZToKKyAqCisgKiA8cHJlPiZsdDt0YWlsZmlsdGVyIGxpbmVzPSZxdW90OzMmcXVvdDsvJmd0OzwvcHJlPgorICoKKyAqIE9yOgorICoKKyAqIDxwcmU+Jmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5UYWlsRmlsdGVyJnF1b3Q7Jmd0OworICogICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtsaW5lcyZxdW90OyB2YWx1ZT0mcXVvdDszJnF1b3Q7LyZndDsKKyAqICZsdDsvZmlsdGVycmVhZGVyJmd0OzwvcHJlPgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRhaWxGaWx0ZXIgZXh0ZW5kcyBCYXNlUGFyYW1GaWx0ZXJSZWFkZXIKKyAgICBpbXBsZW1lbnRzIENoYWluYWJsZVJlYWRlciB7CisgICAgLyoqIFBhcmFtZXRlciBuYW1lIGZvciB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHJldHVybmVkLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FU19LRVkgPSAibGluZXMiOworCisgICAgLyoqIFBhcmFtZXRlciBuYW1lIGZvciB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNraXBwZWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfS0VZID0gInNraXAiOworCisgICAgLyoqIERlZmF1bHQgbnVtYmVyIG9mIGxpbmVzIHRvIHNob3cgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9OVU1fTElORVMgPSAxMDsKKworICAgIC8qKiBOdW1iZXIgb2YgbGluZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4gKi8KKyAgICBwcml2YXRlIGxvbmcgbGluZXMgPSBERUZBVUxUX05VTV9MSU5FUzsKKworICAgIC8qKiBOdW1iZXIgb2YgbGluZXMgdG8gYmUgc2tpcHBlZC4gKi8KKyAgICBwcml2YXRlIGxvbmcgc2tpcCA9IDA7CisKKyAgICAvKiogV2hldGhlciBvciBub3QgcmVhZC1haGVhZCBiZWVuIGNvbXBsZXRlZC4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29tcGxldGVkUmVhZEFoZWFkID0gZmFsc2U7CisKKyAgICAvKiogQSBsaW5lIHRva2VuaXplciAqLworICAgIHByaXZhdGUgTGluZVRva2VuaXplciBsaW5lVG9rZW5pemVyID0gbnVsbDsKKworICAgIC8qKiB0aGUgY3VycmVudCBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmVhbSAqLworICAgIHByaXZhdGUgU3RyaW5nICAgIGxpbmUgICAgICA9IG51bGw7CisgICAgLyoqIHRoZSBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBsaW5lICovCisgICAgcHJpdmF0ZSBpbnQgICAgICAgbGluZVBvcyAgID0gMDsKKworICAgIHByaXZhdGUgTGlua2VkTGlzdCBsaW5lTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgImR1bW15IiBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAc2VlIEJhc2VGaWx0ZXJSZWFkZXIjQmFzZUZpbHRlclJlYWRlcigpCisgICAgICovCisgICAgcHVibGljIFRhaWxGaWx0ZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXJlZCByZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gQSBSZWFkZXIgb2JqZWN0IHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBUYWlsRmlsdGVyKGZpbmFsIFJlYWRlciBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgICAgIGxpbmVUb2tlbml6ZXIgPSBuZXcgTGluZVRva2VuaXplcigpOworICAgICAgICBsaW5lVG9rZW5pemVyLnNldEluY2x1ZGVEZWxpbXModHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4gSWYgdGhlIHJlYWQtYWhlYWQKKyAgICAgKiBoYXMgYmVlbiBjb21wbGV0ZWQsIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyIGlzIHJldHVybmVkLgorICAgICAqIE90aGVyd2lzZSwgdGhlIHN0cmVhbSBpcyByZWFkIHRvIHRoZSBlbmQgYW5kIGJ1ZmZlcmVkICh3aXRoIHRoZSBidWZmZXIKKyAgICAgKiBncm93aW5nIGFzIG5lY2Vzc2FyeSksIHRoZW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uIGluIHRoZSBidWZmZXIgaXMKKyAgICAgKiBzZXQgdG8gcmVhZCBmcm9tLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHJlc3VsdGluZyBzdHJlYW0sIG9yIC0xCisgICAgICogaWYgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSB0aHJvd3MgYW4gSU9FeGNlcHRpb24KKyAgICAgKiBkdXJpbmcgcmVhZGluZworICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZ2V0SW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAobGluZSA9PSBudWxsIHx8IGxpbmUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgbGluZSA9IGxpbmVUb2tlbml6ZXIuZ2V0VG9rZW4oaW4pOworICAgICAgICAgICAgbGluZSA9IHRhaWxGaWx0ZXIobGluZSk7CisgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZVBvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY2ggPSBsaW5lLmNoYXJBdChsaW5lUG9zKTsKKyAgICAgICAgbGluZVBvcysrOworICAgICAgICBpZiAobGluZVBvcyA9PSBsaW5lLmxlbmd0aCgpKSB7CisgICAgICAgICAgICBsaW5lID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZXMgdGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSByZXR1cm5lZCBpbiB0aGUgZmlsdGVyZWQgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGluZXMoZmluYWwgbG9uZyBsaW5lcykgeworICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHJldHVybmVkIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbQorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBnZXRMaW5lcygpIHsKKyAgICAgICAgcmV0dXJuIGxpbmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSBza2lwcGVkIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2tpcCB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNraXBwZWQgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNraXAoZmluYWwgbG9uZyBza2lwKSB7CisgICAgICAgIHRoaXMuc2tpcCA9IHNraXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNraXBwZWQgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyB0byBiZSBza2lwcGVkIGluIHRoZSBmaWx0ZXJlZCBzdHJlYW0KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgZ2V0U2tpcCgpIHsKKyAgICAgICAgcmV0dXJuIHNraXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBUYWlsRmlsdGVyIHVzaW5nIHRoZSBwYXNzZWQgaW4KKyAgICAgKiBSZWFkZXIgZm9yIGluc3RhbnRpYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmRyIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBiYXNlZCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24sIGJ1dCBmaWx0ZXJpbmcKKyAgICAgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgcmVhZGVyCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBjaGFpbihmaW5hbCBSZWFkZXIgcmRyKSB7CisgICAgICAgIFRhaWxGaWx0ZXIgbmV3RmlsdGVyID0gbmV3IFRhaWxGaWx0ZXIocmRyKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldExpbmVzKGdldExpbmVzKCkpOworICAgICAgICBuZXdGaWx0ZXIuc2V0U2tpcChnZXRTa2lwKCkpOworICAgICAgICBuZXdGaWx0ZXIuc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7CisgICAgICAgIHJldHVybiBuZXdGaWx0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbnMgdGhlIHBhcmFtZXRlcnMgbGlzdCBmb3IgdGhlICJsaW5lcyIgcGFyYW1ldGVyIGFuZCB1c2VzCisgICAgICogaXQgdG8gc2V0IHRoZSBudW1iZXIgb2YgbGluZXMgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbS4KKyAgICAgKiBhbHNvIHNjYW4gZm9yICJza2lwIiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChMSU5FU19LRVkuZXF1YWxzKHBhcmFtc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldExpbmVzKExvbmcucGFyc2VMb25nKHBhcmFtc1tpXS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoU0tJUF9LRVkuZXF1YWxzKHBhcmFtc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXAgPSBMb25nLnBhcnNlTG9uZyhwYXJhbXNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGltcGxlbWVudCBhIHRhaWwgZmlsdGVyIG9uIGEgc3RyZWFtIG9mIGxpbmVzLgorICAgICAqIGxpbmUgPSBudWxsIGlzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuICIiIHdoaWxlIHJlYWRpbmcgaW4gdGhlIGxpbmVzLAorICAgICAqICAgICAgICAgbGluZSB3aGlsZSBvdXRwdXR0aW5nIHRoZSBsaW5lcworICAgICAqICAgICAgICAgbnVsbCBhdCB0aGUgZW5kIG9mIG91dHB1dHRpbmcgdGhlIGxpbmVzCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFpbEZpbHRlcihTdHJpbmcgbGluZSkgeworICAgICAgICBpZiAoIWNvbXBsZXRlZFJlYWRBaGVhZCkgeworICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpbmVMaXN0LmFkZChsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZXMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVMaXN0LnNpemUoKSA+IHNraXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBsaW5lTGlzdC5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBsaW5lc1RvS2VlcCA9IGxpbmVzICsgKHNraXAgPiAwID8gc2tpcCA6IDApOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZXNUb0tlZXAgPCBsaW5lTGlzdC5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVMaXN0LnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tcGxldGVkUmVhZEFoZWFkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChza2lwID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2tpcDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVMaXN0LnJlbW92ZUxhc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZXMgPiAtMSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChsaW5lTGlzdC5zaXplKCkgPiBsaW5lcykgeworICAgICAgICAgICAgICAgICAgICBsaW5lTGlzdC5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGluZUxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGxpbmVMaXN0LnJlbW92ZUZpcnN0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Ub2tlbkZpbHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Ub2tlbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTE1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1Rva2VuRmlsdGVyLmphdmEKQEAgLTAsMCArMSw3MjYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWd1bGFyRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5TdWJzdGl0dXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Ub2tlbml6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5MaW5lVG9rZW5pemVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwOworCisvKioKKyAqIFRoaXMgc3BsaXRzIHVwIGlucHV0IGludG8gdG9rZW5zIGFuZCBwYXNzZXMKKyAqIHRoZSB0b2tlbnMgdG8gYSBzZXF1ZW5jZSBvZiBmaWx0ZXJzLgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKiBAc2VlIEJhc2VGaWx0ZXJSZWFkZXIKKyAqIEBzZWUgQ2hhaW5hYmxlUmVhZGVyCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkR5bmFtaWNDb25maWd1cmF0b3IKKyAqLworcHVibGljIGNsYXNzIFRva2VuRmlsdGVyIGV4dGVuZHMgQmFzZUZpbHRlclJlYWRlcgorICAgIGltcGxlbWVudHMgQ2hhaW5hYmxlUmVhZGVyIHsKKyAgICAvKioKKyAgICAgKiBzdHJpbmcgZmlsdGVycyBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEZpbHRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBmaWx0ZXIgYW5kL29mIG1vZGlmeSBhIHN0cmluZworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gZmlsdGVyCisgICAgICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWVkIHN0cmluZyBvciBudWxsIGlmIHRoZQorICAgICAgICAgKiAgICAgICAgIHN0cmluZyBkaWQgbm90IHBhc3MgdGhlIGZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGZpbHRlcihTdHJpbmcgc3RyaW5nKTsKKyAgICB9CisKKworICAgIC8qKiBzdHJpbmcgZmlsdGVycyAqLworICAgIHByaXZhdGUgVmVjdG9yICAgIGZpbHRlcnMgICA9IG5ldyBWZWN0b3IoKTsKKyAgICAvKiogdGhlIHRva2VuaXplciB0byB1c2Ugb24gdGhlIGlucHV0IHN0cmVhbSAqLworICAgIHByaXZhdGUgVG9rZW5pemVyIHRva2VuaXplciA9IG51bGw7CisgICAgLyoqIHRoZSBvdXRwdXQgdG9rZW4gdGVybWluYXRpb24gKi8KKyAgICBwcml2YXRlIFN0cmluZyAgICBkZWxpbU91dHB1dCA9IG51bGw7CisgICAgLyoqIHRoZSBjdXJyZW50IHN0cmluZyB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gKi8KKyAgICBwcml2YXRlIFN0cmluZyAgICBsaW5lICAgICAgPSBudWxsOworICAgIC8qKiB0aGUgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgc3RyaW5nIHRva2VuICovCisgICAgcHJpdmF0ZSBpbnQgICAgICAgbGluZVBvcyAgID0gMDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciAiZHVtbXkiIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBzZWUgQmFzZUZpbHRlclJlYWRlciNCYXNlRmlsdGVyUmVhZGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgVG9rZW5GaWx0ZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXJlZCByZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gQSBSZWFkZXIgb2JqZWN0IHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBUb2tlbkZpbHRlcihmaW5hbCBSZWFkZXIgaW4pIHsKKyAgICAgICAgc3VwZXIoaW4pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGZpbHRlcmVkIHN0cmVhbSwgb25seSBpbmNsdWRpbmcKKyAgICAgKiBsaW5lcyBmcm9tIHRoZSBvcmlnaW5hbCBzdHJlYW0gd2hpY2ggbWF0Y2ggYWxsIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByZWd1bGFyIGV4cHJlc3Npb25zLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHJlc3VsdGluZyBzdHJlYW0sIG9yIC0xCisgICAgICogaWYgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSB0aHJvd3MgYW4gSU9FeGNlcHRpb24KKyAgICAgKiBkdXJpbmcgcmVhZGluZworICAgICAqLworCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRva2VuaXplciA9PSBudWxsKSB7CisgICAgICAgICAgICB0b2tlbml6ZXIgPSBuZXcgTGluZVRva2VuaXplcigpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsaW5lID09IG51bGwgfHwgbGluZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBsaW5lID0gdG9rZW5pemVyLmdldFRva2VuKGluKTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWx0ZXJzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgRmlsdGVyIGZpbHRlciA9IChGaWx0ZXIpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBsaW5lID0gZmlsdGVyLmZpbHRlcihsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVQb3MgPSAwOworICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZXIuZ2V0UG9zdFRva2VuKCkubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsaW1PdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyBkZWxpbU91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgdG9rZW5pemVyLmdldFBvc3RUb2tlbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBjaCA9IGxpbmUuY2hhckF0KGxpbmVQb3MpOworICAgICAgICBsaW5lUG9zKys7CisgICAgICAgIGlmIChsaW5lUG9zID09IGxpbmUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGxpbmUgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFRva2VuRmlsdGVyIHVzaW5nIHRoZSBwYXNzZWQgaW4KKyAgICAgKiBSZWFkZXIgZm9yIGluc3RhbnRpYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIEEgUmVhZGVyIG9iamVjdCBwcm92aWRpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyBmaWx0ZXIgYmFzZWQgb24gdGhpcyBjb25maWd1cmF0aW9uCisgICAgICovCisKKyAgICBwdWJsaWMgZmluYWwgUmVhZGVyIGNoYWluKGZpbmFsIFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgVG9rZW5GaWx0ZXIgbmV3RmlsdGVyID0gbmV3IFRva2VuRmlsdGVyKHJlYWRlcik7CisgICAgICAgIG5ld0ZpbHRlci5maWx0ZXJzID0gZmlsdGVyczsKKyAgICAgICAgbmV3RmlsdGVyLnRva2VuaXplciA9IHRva2VuaXplcjsKKyAgICAgICAgbmV3RmlsdGVyLmRlbGltT3V0cHV0ID0gZGVsaW1PdXRwdXQ7CisgICAgICAgIG5ld0ZpbHRlci5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIHJldHVybiBuZXdGaWx0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHRoZSBvdXRwdXQgZGVsaW1pdGVyLgorICAgICAqIEBwYXJhbSBkZWxpbU91dHB1dCByZXBsYWNlcyB0aGUgZGVsaW0gc3RyaW5nIHJldHVybmVkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXIsIGlmIHByZXNlbnQuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWxpbU91dHB1dChTdHJpbmcgZGVsaW1PdXRwdXQpIHsKKyAgICAgICAgdGhpcy5kZWxpbU91dHB1dCA9IHJlc29sdmVCYWNrU2xhc2goZGVsaW1PdXRwdXQpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gIFByZWRlZmluZWQgdG9rZW5pemVycworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBsaW5lIHRva2VuaXplciAtIHRoaXMgaXMgdGhlIGRlZmF1bHQuCisgICAgICogQHBhcmFtIHRva2VuaXplciB0aGUgbGluZSB0b2tlbml6ZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZExpbmVUb2tlbml6ZXIoTGluZVRva2VuaXplciB0b2tlbml6ZXIpIHsKKyAgICAgICAgYWRkKHRva2VuaXplcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgc3RyaW5nIHRva2VuaXplcgorICAgICAqIEBwYXJhbSB0b2tlbml6ZXIgdGhlIHN0cmluZyB0b2tlbml6ZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZFN0cmluZ1Rva2VuaXplcihTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyKSB7CisgICAgICAgIGFkZCh0b2tlbml6ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIGZpbGUgdG9rZW5pemVyCisgICAgICogQHBhcmFtIHRva2VuaXplciB0aGUgZmlsZSB0b2tlbml6ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlVG9rZW5pemVyKEZpbGVUb2tlbml6ZXIgdG9rZW5pemVyKSB7CisgICAgICAgIGFkZCh0b2tlbml6ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbiBhcmJpdHJhcnkgdG9rZW5pemVyCisgICAgICogQHBhcmFtIHRva2VuaXplciB0aGUgdG9rZW5pemVyIHRvIGFsbCwgb25seSBvbmUgYWxsb3dlZAorICAgICAqLworCisgICAgcHVibGljIHZvaWQgYWRkKFRva2VuaXplciB0b2tlbml6ZXIpIHsKKyAgICAgICAgaWYgKHRoaXMudG9rZW5pemVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgdG9rZW5pemVyIGFsbG93ZWQiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRva2VuaXplciA9IHRva2VuaXplcjsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICBQcmVkZWZpbmVkIGZpbHRlcnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogcmVwbGFjZSBzdHJpbmcgZmlsdGVyCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgcmVwbGFjZSBzdHJpbmcgZmlsdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVwbGFjZVN0cmluZyhSZXBsYWNlU3RyaW5nIGZpbHRlcikgeworICAgICAgICBmaWx0ZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb250YWlucyBzdHJpbmcgZmlsdGVyCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgY29udGFpbnMgc3RyaW5nIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnRhaW5zU3RyaW5nKENvbnRhaW5zU3RyaW5nIGZpbHRlcikgeworICAgICAgICBmaWx0ZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXBsYWNlIHJlZ2V4IGZpbHRlcgorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIHJlcGxhY2UgcmVnZXggZmlsdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVwbGFjZVJlZ2V4KFJlcGxhY2VSZWdleCBmaWx0ZXIpIHsKKyAgICAgICAgZmlsdGVycy5hZGRFbGVtZW50KGZpbHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29udGFpbnMgcmVnZXggZmlsdGVyCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgY29udGFpbnMgcmVnZXggZmlsdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29udGFpbnNSZWdleChDb250YWluc1JlZ2V4IGZpbHRlcikgeworICAgICAgICBmaWx0ZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0cmltIGZpbHRlcgorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIHRyaW0gZmlsdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVHJpbShUcmltIGZpbHRlcikgeworICAgICAgICBmaWx0ZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZ25vcmUgYmxhbmsgZmlsdGVyCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgaWdub3JlIGJsYW5rIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZElnbm9yZUJsYW5rKElnbm9yZUJsYW5rIGZpbHRlcikgeworICAgICAgICBmaWx0ZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkZWxldGUgY2hhcnMKKyAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBkZWxldGUgY2hhcmFjdGVycyBmaWx0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREZWxldGVDaGFyYWN0ZXJzKERlbGV0ZUNoYXJhY3RlcnMgZmlsdGVyKSB7CisgICAgICAgIGZpbHRlcnMuYWRkRWxlbWVudChmaWx0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhcmJpdHJhcnkgZmlsdGVyCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChGaWx0ZXIgZmlsdGVyKSB7CisgICAgICAgIGZpbHRlcnMuYWRkRWxlbWVudChmaWx0ZXIpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLworICAgIC8vICAgICAgVG9rZW5pemVyIENsYXNzZXMgKGltcGxzIG1vdmVkIHRvIG9hdGEudXRpbCkKKyAgICAvLworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBjbGFzcyB0byByZWFkIHRoZSBjb21wbGV0ZSBpbnB1dCBpbnRvIGEgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlVG9rZW5pemVyCisgICAgICAgIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVG9rZW5pemVyIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjbGFzcyB0byB0b2tlbml6ZSB0aGUgaW5wdXQgYXMgYXJlYXMgc2VwYXJhdGVkCisgICAgICogYnkgd2hpdGUgc3BhY2UsIG9yIGJ5IGEgc3BlY2lmaWVkIGxpc3Qgb2YKKyAgICAgKiBkZWxpbSBjaGFyYWN0ZXJzLiBCZWhhdmVzIGxpa2UgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplci4KKyAgICAgKiBpZiB0aGUgc3RyZWFtIHN0YXJ0cyB3aXRoIGRlbGltIGNoYXJhY3RlcnMsIHRoZSBmaXJzdAorICAgICAqIHRva2VuIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nICh1bmxlc3MgdGhlIHRyZWF0IGRlbGltcworICAgICAqIGFzIHRva2VucyBmbGFnIGlzIHNldCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdUb2tlbml6ZXIKKyAgICAgICAgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1Rva2VuaXplciB7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLworICAgIC8vICAgICAgRmlsdGVyIGNsYXNzZXMKKyAgICAvLworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdCBjbGFzcyB0aGF0IGNvbnZlcnRzIGRlcml2ZWQgZmlsdGVyIGNsYXNzZXMgaW50bworICAgICAqIENoYWluYWJsZVJlYWRlckZpbHRlcidzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBDaGFpbmFibGVSZWFkZXJGaWx0ZXIgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50CisgICAgICAgIGltcGxlbWVudHMgQ2hhaW5hYmxlUmVhZGVyLCBGaWx0ZXIgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gYnlMaW5lID0gdHJ1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogc2V0IHdoZXRoZXIgdG8gdXNlIGZpbGV0b2tlbml6ZXIgb3IgbGluZSB0b2tlbml6ZXIKKyAgICAgICAgICogQHBhcmFtIGJ5TGluZSBpZiB0cnVlIHVzZSBhIGxpbmV0b2tlbml6ZXIgKGRlZmF1bHQpIG90aGVyd2lzZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHVzZSBhIGZpbGV0b2tlbml6ZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEJ5TGluZShib29sZWFuIGJ5TGluZSkgeworICAgICAgICAgICAgdGhpcy5ieUxpbmUgPSBieUxpbmU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hhaW4gYSB0b2tlbmZpbHRlciByZWFkZXIgdG8gYSByZWFkZXIsCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZWFkZXIgdGhlIGlucHV0IHJlYWRlciBvYmplY3QKKyAgICAgICAgICogQHJldHVybiB0aGUgY2hhaW5lZCByZWFkZXIgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUmVhZGVyIGNoYWluKFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIFRva2VuRmlsdGVyIHRva2VuRmlsdGVyID0gbmV3IFRva2VuRmlsdGVyKHJlYWRlcik7CisgICAgICAgICAgICBpZiAoIWJ5TGluZSkgeworICAgICAgICAgICAgICAgIHRva2VuRmlsdGVyLmFkZChuZXcgRmlsZVRva2VuaXplcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRva2VuRmlsdGVyLmFkZCh0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbkZpbHRlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSByZXBsYWNlIHN0cmluZyBmaWx0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXBsYWNlU3RyaW5nIGV4dGVuZHMgQ2hhaW5hYmxlUmVhZGVyRmlsdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZnJvbTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG87CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRoZSBmcm9tIGF0dHJpYnV0ZQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZnJvbSB0aGUgc3RyaW5nIHRvIHJlcGxhY2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHsKKyAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogdGhlIHRvIGF0dHJpYnV0ZQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdG8gdGhlIHN0cmluZyB0byByZXBsYWNlICdmcm9tJyB3aXRoCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKKyAgICAgICAgICAgIHRoaXMudG8gPSB0bzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWx0ZXIgYSBzdHJpbmcgJ2xpbmUnIHJlcGxhY2luZyBmcm9tIHdpdGggdG8KKyAgICAgICAgICogKEMmUCBmcm9tIHRoZSBSZXBsYWNlIHRhc2spCisgICAgICAgICAqIEBwYXJhbSBsaW5lIHRoZSBzdHJpbmcgdG8gYmUgZmlsdGVyZWQKKyAgICAgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgbGluZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgZnJvbSBpbiBzdHJpbmdyZXBsYWNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGludCBmb3VuZCA9IGxpbmUuaW5kZXhPZihmcm9tKTsKKyAgICAgICAgICAgIHdoaWxlIChmb3VuZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gd3JpdGUgZXZlcnl0aGluZyB1cCB0byB0aGUgZnJvbQorICAgICAgICAgICAgICAgIGlmIChmb3VuZCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQobGluZS5zdWJzdHJpbmcoc3RhcnQsIGZvdW5kKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHJlcGxhY2VtZW50IHRvCisgICAgICAgICAgICAgICAgaWYgKHRvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCh0byk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGFnYWluCisgICAgICAgICAgICAgICAgc3RhcnQgPSBmb3VuZCArIGZyb20ubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgZm91bmQgPSBsaW5lLmluZGV4T2YoZnJvbSwgc3RhcnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3cml0ZSB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMKKyAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKHN0YXJ0LCBsaW5lLmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBmaWx0ZXIgdG8gZmlsdGVyIGxpbmVzIGNvbnRhaW5zIHN0cmluZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRhaW5zU3RyaW5nIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudAorICAgICAgICBpbXBsZW1lbnRzIEZpbHRlciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvbnRhaW5zOworCisgICAgICAgIC8qKgorICAgICAgICAgKiB0aGUgY29udGFpbnMgYXR0cmlidXRlCisgICAgICAgICAqIEBwYXJhbSBjb250YWlucyB0aGUgc3RyaW5nIHRoYXQgdGhlIHRva2VuIHNob3VsZCBjb250YWluCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb250YWlucyhTdHJpbmcgY29udGFpbnMpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGFpbnMgPSBjb250YWluczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWx0ZXIgc3RyaW5ncyB0aGF0IGNvbnRhaW4gdGhlIGNvbnRhaW5zIGF0dHJpYnV0ZQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gYmUgZmlsdGVyZWQKKyAgICAgICAgICogQHJldHVybiBudWxsIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgY29udGFpbiAiY29udGFpbnMiLAorICAgICAgICAgKiAgICAgICAgICAgICAgc3RyaW5nIG90aGVyd2lzZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgY29udGFpbnMgaW4gY29udGFpbnNzdHJpbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJpbmcuaW5kZXhPZihjb250YWlucykgPiAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGZpbHRlciB0byByZXBsYWNlIHJlZ2V4LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVwbGFjZVJlZ2V4IGV4dGVuZHMgQ2hhaW5hYmxlUmVhZGVyRmlsdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgZnJvbTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgdG87CisgICAgICAgIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb24gIHJlZ3VsYXJFeHByZXNzaW9uOworICAgICAgICBwcml2YXRlIFN1YnN0aXR1dGlvbiAgICAgICBzdWJzdGl0dXRpb247CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgIGluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIGZsYWdzID0gIiI7CisgICAgICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgIG9wdGlvbnM7CisgICAgICAgIHByaXZhdGUgUmVnZXhwICAgICAgICAgICAgIHJlZ2V4cDsKKworICAgICAgICAvKioKKyAgICAgICAgICogdGhlIGZyb20gYXR0cmlidXRlCisgICAgICAgICAqIEBwYXJhbSBmcm9tIHRoZSByZWdleCBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIGZyb20pIHsKKyAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIHRoZSB0byBhdHRyaWJ1dGUKKyAgICAgICAgICogQHBhcmFtIHRvIHRoZSByZXBsYWNlbWVudCBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2UoU3RyaW5nIHRvKSB7CisgICAgICAgICAgICB0aGlzLnRvID0gdG87CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGZsYWdzIHRoZSByZWdleCBmbGFncworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmxhZ3MoU3RyaW5nIGZsYWdzKSB7CisgICAgICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wdGlvbnMgPSBjb252ZXJ0UmVnZXhPcHRpb25zKGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgcGF0dGVybiBpbiByZXBsYWNlcmVnZXgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZ3VsYXJFeHByZXNzaW9uID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKCk7CisgICAgICAgICAgICByZWd1bGFyRXhwcmVzc2lvbi5zZXRQYXR0ZXJuKGZyb20pOworICAgICAgICAgICAgcmVnZXhwID0gcmVndWxhckV4cHJlc3Npb24uZ2V0UmVnZXhwKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBpZiAodG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRvID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdWJzdGl0dXRpb24gPSBuZXcgU3Vic3RpdHV0aW9uKCk7CisgICAgICAgICAgICBzdWJzdGl0dXRpb24uc2V0RXhwcmVzc2lvbih0byk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGxpbmUgdGhlIHN0cmluZyB0byBtb2RpZnkKKyAgICAgICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgc3RyaW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGZpbHRlcihTdHJpbmcgbGluZSkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICAgICAgICBpZiAoIXJlZ2V4cC5tYXRjaGVzKGxpbmUsIG9wdGlvbnMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVnZXhwLnN1YnN0aXR1dGUoCisgICAgICAgICAgICAgICAgbGluZSwgc3Vic3RpdHV0aW9uLmdldEV4cHJlc3Npb24oZ2V0UHJvamVjdCgpKSwgb3B0aW9ucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmaWx0ZXIgdG8gZmlsdGVyIHRva2VucyBtYXRjaGluZyByZWd1bGFyIGV4cHJlc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGFpbnNSZWdleCBleHRlbmRzIENoYWluYWJsZVJlYWRlckZpbHRlciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIGZyb207CisgICAgICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIHRvOworICAgICAgICBwcml2YXRlIFJlZ3VsYXJFeHByZXNzaW9uICByZWd1bGFyRXhwcmVzc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBTdWJzdGl0dXRpb24gICAgICAgc3Vic3RpdHV0aW9uOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICBpbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICBmbGFncyA9ICIiOworICAgICAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICBvcHRpb25zOworICAgICAgICBwcml2YXRlIFJlZ2V4cCAgICAgICAgICAgICByZWdleHA7CisKKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGZyb20gdGhlIHJlZ2V4IHBhdHRlcm4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIGZyb20pIHsKKyAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIHRvIHRoZSByZXBsYWNlbWVudCBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2UoU3RyaW5nIHRvKSB7CisgICAgICAgICAgICB0aGlzLnRvID0gdG87CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGZsYWdzIHRoZSByZWdleCBmbGFncworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmxhZ3MoU3RyaW5nIGZsYWdzKSB7CisgICAgICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wdGlvbnMgPSBjb252ZXJ0UmVnZXhPcHRpb25zKGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgZnJvbSBpbiBjb250YWluc3JlZ2V4Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWd1bGFyRXhwcmVzc2lvbiA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbigpOworICAgICAgICAgICAgcmVndWxhckV4cHJlc3Npb24uc2V0UGF0dGVybihmcm9tKTsKKyAgICAgICAgICAgIHJlZ2V4cCA9IHJlZ3VsYXJFeHByZXNzaW9uLmdldFJlZ2V4cChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgaWYgKHRvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdWJzdGl0dXRpb24gPSBuZXcgU3Vic3RpdHV0aW9uKCk7CisgICAgICAgICAgICBzdWJzdGl0dXRpb24uc2V0RXhwcmVzc2lvbih0byk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogYXBwbHkgcmVnZXggYW5kIHN1YnN0aXR1dGlvbiBvbiBhIHN0cmluZworICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gYXBwbHkgZmlsdGVyIG9uCisgICAgICAgICAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIHN0cmluZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgaWYgKCFyZWdleHAubWF0Y2hlcyhzdHJpbmcsIG9wdGlvbnMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3Vic3RpdHV0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlZ2V4cC5zdWJzdGl0dXRlKAorICAgICAgICAgICAgICAgIHN0cmluZywgc3Vic3RpdHV0aW9uLmdldEV4cHJlc3Npb24oZ2V0UHJvamVjdCgpKSwgb3B0aW9ucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogRmlsdGVyIHRvIHRyaW0gd2hpdGUgc3BhY2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyaW0gZXh0ZW5kcyBDaGFpbmFibGVSZWFkZXJGaWx0ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGxpbmUgdGhlIHN0cmluZyB0byBiZSB0cmltbWVkCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRyaW1tZWQgc3RyaW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGZpbHRlcihTdHJpbmcgbGluZSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbmUudHJpbSgpOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qKiBGaWx0ZXIgcmVtb3ZlIGVtcHR5IHRva2VucyAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSWdub3JlQmxhbmsgZXh0ZW5kcyBDaGFpbmFibGVSZWFkZXJGaWx0ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gbW9kaWZ5CisgICAgICAgICAqIEByZXR1cm4gdGhlIHRyaW1tZWQgbGluZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciB0byBkZWxldGUgY2hhcmFjdGVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVsZXRlQ2hhcmFjdGVycyBleHRlbmRzIFByb2plY3RDb21wb25lbnQKKyAgICAgICAgaW1wbGVtZW50cyBGaWx0ZXIsIENoYWluYWJsZVJlYWRlciB7CisgICAgICAgIC8vIEF0dHJpYnV0ZXMKKyAgICAgICAgLyoqIHRoZSBsaXN0IG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIGZyb20gdGhlIGlucHV0ICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRlbGV0ZUNoYXJzID0gIiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGRlbGV0ZQorICAgICAgICAgKiBAcGFyYW0gZGVsZXRlQ2hhcnMgdGhlIGxpc3Qgb2YgY2hhcmFjdGVycworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hhcnMoU3RyaW5nIGRlbGV0ZUNoYXJzKSB7CisgICAgICAgICAgICB0aGlzLmRlbGV0ZUNoYXJzID0gcmVzb2x2ZUJhY2tTbGFzaChkZWxldGVDaGFycyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogcmVtb3ZlIGNoYXJhY3RlcnMgZnJvbSBhIHN0cmluZworICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gcmVtb3ZlIHRoZSBjaGFyYWN0ZXJzIGZyb20KKyAgICAgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIHN0cmluZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoID0gc3RyaW5nLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoIShpc0RlbGV0ZUNoYXJhY3RlcihjaCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBmYWN0b3J5IG1ldGhvZCB0byBwcm92aWRlIGEgcmVhZGVyIHRoYXQgcmVtb3ZlcworICAgICAgICAgKiB0aGUgY2hhcmFjdGVycyBmcm9tIGEgcmVhZGVyIGFzIHBhcnQgb2YgYSBmaWx0ZXIKKyAgICAgICAgICogY2hhaW4KKyAgICAgICAgICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIG9iamVjdAorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjaGFpbmVkIHJlYWRlciBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZWFkZXIgY2hhaW4oUmVhZGVyIHJlYWRlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCYXNlRmlsdGVyUmVhZGVyKHJlYWRlcikgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEByZXR1cm4gdGhlIG5leHQgbm9uIGRlbGV0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGMgPSBpbi5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaXNEZWxldGVDaGFyYWN0ZXIoKGNoYXIpIGMpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiAgY2hlY2sgaWYgdGhlIGNoYXJhY3RlciBjIGlzIHRvIGJlIGRlbGV0ZWQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGMgY2hhciB0byB0ZXN0CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3VwcGxpZWQgY2hhciBpcyBpbiB0aGUgbGlzdCB0byBiZSBzdHJpcHBlZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlbGV0ZUNoYXJhY3RlcihjaGFyIGMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgZGVsZXRlQ2hhcnMubGVuZ3RoKCk7ICsrZCkgeworICAgICAgICAgICAgICAgIGlmIChkZWxldGVDaGFycy5jaGFyQXQoZCkgPT0gIGMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgc3RhdGljIHV0aWxpdHkgbWV0aG9kcyAtIGNvdWxkIGJlIHBsYWNlZCBzb21ld2hlcmUgZWxzZQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiB4bWwgZG9lcyBub3QgZG8gImMiIGxpa2UgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5ncy4KKyAgICAgKiBpLmUuIFxuXHJcdCBldGMuCisgICAgICogdGhpcyBtZXRob2QgcHJvY2Vzc2VzIFxuLCBcciwgXHQsIFxmLCBcXAorICAgICAqIGFsc28gc3VicyBccyAtPiAiIFxuXHJcdFxmIgorICAgICAqIGEgdHJhaWxpbmcgJ1wnIHdpbGwgYmUgaWdub3JlZAorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IHJhdyBzdHJpbmcgd2l0aCBwb3NzaWJsZSBlbWJlZGRlZCAnXCdzCisgICAgICogQHJldHVybiBjb252ZXJ0ZWQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZUJhY2tTbGFzaChTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnJlc29sdmVCYWNrU2xhc2goaW5wdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnZlcnQgcmVnZXggb3B0aW9uIGZsYWcgY2hhcmFjdGVycyB0byByZWdleCBvcHRpb25zCisgICAgICogPGRsPgorICAgICAqICAgPGxpPmcgLSAgUmVnZXhwLlJFUExBQ0VfQUxMPC9saT4KKyAgICAgKiAgIDxsaT5pIC0gIFJlZ2V4cC5NQVRDSF9DQVNFX0lOU0VOU0lUSVZFPC9saT4KKyAgICAgKiAgIDxsaT5tIC0gIFJlZ2V4cC5NQVRDSF9NVUxUSUxJTkU8L2xpPgorICAgICAqICAgPGxpPnMgLSAgUmVnZXhwLk1BVENIX1NJTkdMRUxJTkU8L2xpPgorICAgICAqIDwvZGw+CisgICAgICogQHBhcmFtIGZsYWdzIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmxhZ3MKKyAgICAgKiBAcmV0dXJuIHRoZSBSZWdleHAgb3B0aW9uIGJpdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0UmVnZXhPcHRpb25zKFN0cmluZyBmbGFncykgeworICAgICAgICBpZiAoZmxhZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaW50IG9wdGlvbnMgPSAwOworICAgICAgICBpZiAoZmxhZ3MuaW5kZXhPZignZycpICE9IC0xKSB7CisgICAgICAgICAgICBvcHRpb25zIHw9IFJlZ2V4cC5SRVBMQUNFX0FMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MuaW5kZXhPZignaScpICE9IC0xKSB7CisgICAgICAgICAgICBvcHRpb25zIHw9IFJlZ2V4cC5NQVRDSF9DQVNFX0lOU0VOU0lUSVZFOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFncy5pbmRleE9mKCdtJykgIT0gLTEpIHsKKyAgICAgICAgICAgIG9wdGlvbnMgfD0gUmVnZXhwLk1BVENIX01VTFRJTElORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MuaW5kZXhPZigncycpICE9IC0xKSB7CisgICAgICAgICAgICBvcHRpb25zIHw9IFJlZ2V4cC5NQVRDSF9TSU5HTEVMSU5FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvdXRpbC9DaGFpblJlYWRlckhlbHBlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy91dGlsL0NoYWluUmVhZGVySGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3NmMyZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvdXRpbC9DaGFpblJlYWRlckhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVyUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5CYXNlRmlsdGVyUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuQ2hhaW5hYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkFudEZpbHRlclJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyaXphYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogUHJvY2VzcyBhIEZpbHRlclJlYWRlciBjaGFpbi4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDaGFpblJlYWRlckhlbHBlciB7CisKKyAgICAvLyBkZWZhdWx0IGJ1ZmZlciBzaXplCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA4MTkyOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgLyoqCisgICAgICogVGhlIHByaW1hcnkgcmVhZGVyIHRvIHdoaWNoIHRoZSByZWFkZXIgY2hhaW4gaXMgdG8gYmUgYXR0YWNoZWQuCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBwcmltYXJ5UmVhZGVyOworCisgICAgLyoqCisgICAgICogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB0byBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgYnVmZmVyU2l6ZSA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisKKyAgICAvKioKKyAgICAgKiBDaGFpbiBvZiBmaWx0ZXJzCisgICAgICovCisgICAgcHVibGljIFZlY3RvciBmaWx0ZXJDaGFpbnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiogVGhlIEFudCBwcm9qZWN0ICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3QgPSBudWxsOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByaW1hcnkgcmVhZGVyCisgICAgICogQHBhcmFtIHJkciB0aGUgcmVhZGVyIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlSZWFkZXIoUmVhZGVyIHJkcikgeworICAgICAgICBwcmltYXJ5UmVhZGVyID0gcmRyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvamVjdCB0byB3b3JrIHdpdGgKKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChmaW5hbCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByb2plY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcHJvamVjdAorICAgICAqLworICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJ1ZmZlciBzaXplIHRvIGJlIHVzZWQuICBEZWZhdWx0cyB0byA4MTkyLAorICAgICAqIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbnZva2VkLgorICAgICAqIEBwYXJhbSBzaXplIHRoZSBidWZmZXIgc2l6ZSB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzaXplKSB7CisgICAgICAgIGJ1ZmZlclNpemUgPSBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbGxlY3Rpb24gb2YgZmlsdGVyIHJlYWRlciBzZXRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmNoYWluIHRoZSBmaWx0ZXIgY2hhaW5zIGNvbGxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJDaGFpbnMoVmVjdG9yIGZjaGFpbikgeworICAgICAgICBmaWx0ZXJDaGFpbnMgPSBmY2hhaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZW1ibGUgdGhlIHJlYWRlcgorICAgICAqIEByZXR1cm4gdGhlIGFzc2VtYmxlZCByZWFkZXIKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBSZWFkZXIgZ2V0QXNzZW1ibGVkUmVhZGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByaW1hcnlSZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwcmltYXJ5UmVhZGVyIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKworICAgICAgICBSZWFkZXIgaW5zdHJlYW0gPSBwcmltYXJ5UmVhZGVyOworICAgICAgICBmaW5hbCBpbnQgZmlsdGVyUmVhZGVyc0NvdW50ID0gZmlsdGVyQ2hhaW5zLnNpemUoKTsKKyAgICAgICAgZmluYWwgVmVjdG9yIGZpbmFsRmlsdGVycyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlclJlYWRlcnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBGaWx0ZXJDaGFpbiBmaWx0ZXJjaGFpbiA9CisgICAgICAgICAgICAgICAgKEZpbHRlckNoYWluKSBmaWx0ZXJDaGFpbnMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgZmluYWwgVmVjdG9yIGZpbHRlclJlYWRlcnMgPSBmaWx0ZXJjaGFpbi5nZXRGaWx0ZXJSZWFkZXJzKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVhZGVyQ291bnQgPSBmaWx0ZXJSZWFkZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVhZGVyQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgIGZpbmFsRmlsdGVycy5hZGRFbGVtZW50KGZpbHRlclJlYWRlcnMuZWxlbWVudEF0KGopKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBmaWx0ZXJzQ291bnQgPSBmaW5hbEZpbHRlcnMuc2l6ZSgpOworCisgICAgICAgIGlmIChmaWx0ZXJzQ291bnQgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnNDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBmaW5hbEZpbHRlcnMuZWxlbWVudEF0KGkpOworCisgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBbnRGaWx0ZXJSZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQW50RmlsdGVyUmVhZGVyIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPSAoQW50RmlsdGVyUmVhZGVyKSBmaW5hbEZpbHRlcnMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gZmlsdGVyLmdldENsYXNzTmFtZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoIGNsYXNzcGF0aCA9IGZpbHRlci5nZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdCBwcm8gPSBmaWx0ZXIuZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwcm8uY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUZpbHRlclJlYWRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleHRlbmQgamF2YS5pby5GaWx0ZXJSZWFkZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ei5nZXRDb25zdHJ1Y3RvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbnNQcmVzZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgY29uc3RydWN0b3JzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIHR5cGVzID0gY29uc3RydWN0b3JzW2pdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGVzWzBdLmlzQXNzaWduYWJsZUZyb20oUmVhZGVyLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNQcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnNQcmVzZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oY2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGRlZmluZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGhhdCB0YWtlcyBpbiBhIFJlYWRlciBhcyBpdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNpbmdsZSBhcmd1bWVudC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWFkZXJbXSByZHIgPSB7aW5zdHJlYW19OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVhZGVyKSBjb25zdHJ1Y3RvcnNbal0ubmV3SW5zdGFuY2UoKE9iamVjdFtdKSByZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9qZWN0T25PYmplY3QoaW5zdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGFyYW1ldGVyaXphYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBmaWx0ZXIuZ2V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBhcmFtZXRlcml6YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cmVhbSkuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNuZmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpYWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIENoYWluYWJsZVJlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBzZXRQcm9qZWN0T25PYmplY3Qobyk7CisgICAgICAgICAgICAgICAgICAgIGluc3RyZWFtID0gKChDaGFpbmFibGVSZWFkZXIpIG8pLmNoYWluKGluc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UHJvamVjdE9uT2JqZWN0KGluc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluc3RyZWFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIGhlbHBlciBtZXRob2QgdG8gc2V0IHRoZSBwcm9qZWN0IG9uIGFuIG9iamVjdC4KKyAgICAgKiB0aGUgcmVmbGVjdGlvbiBzZXRQcm9qZWN0IGRvZXMgbm90IHdvcmsgZm9yIGFub255bW91cy9wcm90ZWN0ZWQvcHJpdmF0ZQorICAgICAqIGNsYXNzZXMsIGV2ZW4gaWYgdGhleSBoYXZlIHB1YmxpYyBtZXRob2RzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRQcm9qZWN0T25PYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2VGaWx0ZXJSZWFkZXIpIHsKKyAgICAgICAgICAgICgoQmFzZUZpbHRlclJlYWRlcikgb2JqKS5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHByb2plY3Quc2V0UHJvamVjdFJlZmVyZW5jZShvYmopOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZGF0YSBmcm9tIHRoZSByZWFkZXIgYW5kIHJldHVybiB0aGUKKyAgICAgKiBjb250ZW50cyBhcyBhIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gcmRyIHRoZSByZWFkZXIgb2JqZWN0CisgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXMgYSBzdHJpbmcKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgcmVhZEZ1bGx5KFJlYWRlciByZHIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBGaWxlVXRpbHMucmVhZEZ1bGx5KHJkciwgYnVmZmVyU2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy91dGlsL0phdmFDbGFzc0hlbHBlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy91dGlsL0phdmFDbGFzc0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWM2NGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL3V0aWwvSmF2YUNsYXNzSGVscGVyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5DbGFzc1BhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLkNvbnN0YW50VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLkphdmFDbGFzczsKKworLy8gQ2hlY2tTdHlsZTpIaWRlVXRpbGl0eUNsYXNzQ29uc3RydWN0b3JDaGVjayBPRkYgLSBiYworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBmaWx0ZXJzIGNvbnN0YW50cyBmcm9tIGEgSmF2YSBDbGFzcworICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEphdmFDbGFzc0hlbHBlciB7CisgICAgLyoqIFN5c3RlbSBzcGVjaWZpYyBsaW5lIHNlcGFyYXRvci4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnN0YW50cyBkZWNsYXJlZCBpbiBhIGZpbGUgYXMgbmFtZT12YWx1ZQorICAgICAqCisgICAgICogQHBhcmFtIGJ5dGVzIHRoZSBjbGFzcyBhcyBhIGFycmF5IG9mIGJ5dGVzCisgICAgICogQHJldHVybiBhIFN0cmluZ0J1ZmZlciBjb250YWlucyB0aGUgbmFtZT12YWx1ZSBwYWlycworICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgZ2V0Q29uc3RhbnRzKGJ5dGVbXSBieXRlcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmaW5hbCBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOworICAgICAgICBmaW5hbCBDbGFzc1BhcnNlciBwYXJzZXIgPSBuZXcgQ2xhc3NQYXJzZXIoYmlzLCAiIik7CisgICAgICAgIGZpbmFsIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSBwYXJzZXIucGFyc2UoKTsKKyAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBqYXZhQ2xhc3MuZ2V0RmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RhbnRWYWx1ZSBjdiA9IGZpZWxkLmdldENvbnN0YW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY3YgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3ZzID0gY3YudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgc3RhcnQgYW5kIGVuZCBxdW90ZXMgaWYgZmllbGQgaXMgYSBTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN2cy5zdGFydHNXaXRoKCJcIiIpICYmIGN2cy5lbmRzV2l0aCgiXCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3ZzID0gY3ZzLnN1YnN0cmluZygxLCBjdnMubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZmllbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc9Jyk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjdnMpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoTFMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL0FudFhNTENvbnRleHQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9BbnRYTUxDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyZDQwNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9BbnRYTUxDb250ZXh0LmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5SdW50aW1lQ29uZmlndXJhYmxlOworCisKKy8qKgorICogQ29udGV4dCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFudCBwcm9jZXNzaW5nLgorICoKKyAqLworcHVibGljIGNsYXNzIEFudFhNTENvbnRleHQgeworICAgIC8qKiBUaGUgcHJvamVjdCB0byBjb25maWd1cmUuICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBwYXJzZS4gKi8KKyAgICBwcml2YXRlIEZpbGUgYnVpbGRGaWxlOworCisgICAgLyoqIFZlY3RvciB3aXRoIGFsbCB0aGUgdGFyZ2V0cywgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCisgICAgICogZGVmaW5lZC4gUHJvamVjdCBtYWludGFpbnMgYSBIYXNodGFibGUsIHdoaWNoIGlzIG5vdCBvcmRlcmVkLgorICAgICAqIFRoaXMgd2lsbCBhbGxvdyBkZXNjcmlwdGlvbiB0byBrbm93IHRoZSBvcmlnaW5hbCBvcmRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciB0YXJnZXRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBQYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBidWlsZCBmaWxlLiBVc2VkIGZvciByZXNvbHZpbmcgZW50aXRpZXMKKyAgICAgKiBhbmQgc2V0dGluZyB0aGUgcHJvamVjdCdzIGJhc2UgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBidWlsZEZpbGVQYXJlbnQ7CisKKyAgICAvKiogTmFtZSBvZiB0aGUgY3VycmVudCBwcm9qZWN0ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFByb2plY3ROYW1lOworCisgICAgLyoqCisgICAgICogTG9jYXRvciBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIuCisgICAgICogVXNlZCBmb3IgZ2l2aW5nIGxvY2F0aW9ucyBvZiBlcnJvcnMgZXRjLgorICAgICAqLworICAgIHByaXZhdGUgTG9jYXRvciBsb2NhdG9yOworCisgICAgIC8qKgorICAgICAgKiBUYXJnZXQgdGhhdCBhbGwgb3RoZXIgdGFyZ2V0cyB3aWxsIGRlcGVuZCB1cG9uIGltcGxpY2l0bHkuCisgICAgICAqCisgICAgICAqIDxwPlRoaXMgaG9sZHMgYWxsIHRhc2tzIGFuZCBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBoYXZlCisgICAgICAqIGJlZW4gcGxhY2VkIG91dHNpZGUgb2YgdGFyZ2V0cy48L3A+CisgICAgICAqLworICAgIHByaXZhdGUgVGFyZ2V0IGltcGxpY2l0VGFyZ2V0ID0gbmV3IFRhcmdldCgpOworCisgICAgLyoqIEN1cnJlbnQgdGFyZ2V0ICggbm8gbmVlZCBmb3IgYSBzdGFjayBhcyB0aGUgcHJvY2Vzc2luZyBtb2RlbAorICAgICAgICBhbGxvd3Mgb25seSBvbmUgbGV2ZWwgb2YgdGFyZ2V0ICkgKi8KKyAgICBwcml2YXRlIFRhcmdldCBjdXJyZW50VGFyZ2V0ID0gbnVsbDsKKworICAgIC8qKiBUaGUgc3RhY2sgb2YgUnVudGltZUNvbmZpZ3VyYWJsZTIgd3JhcHBpbmcgdGhlCisgICAgICAgIG9iamVjdHMuCisgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciB3U3RhY2sgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvamVjdCB0YWcgYXR0cmlidXRlcyBhcmUgdG8gYmUgaWdub3JlZAorICAgICAqIHdoZW4gcHJvY2Vzc2luZyBhIHBhcnRpY3VsYXIgYnVpbGQgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlUHJvamVjdFRhZyA9IGZhbHNlOworCisgICAgLyoqIEtlZXBzIHRyYWNrIG9mIHByZWZpeCAtPiB1cmkgbWFwcGluZyBkdXJpbmcgcGFyc2luZyAqLworICAgIHByaXZhdGUgTWFwIHByZWZpeE1hcHBpbmcgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKiogS2VlcHMgdHJhY2sgb2YgdGFyZ2V0cyBpbiBmaWxlcyAqLworICAgIHByaXZhdGUgTWFwIGN1cnJlbnRUYXJnZXRzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBhbnR4bWwgY29udGV4dCBiZWxvbmdzIHRvCisgICAgICovCisgICAgcHVibGljIEFudFhNTENvbnRleHQoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgICAgIGltcGxpY2l0VGFyZ2V0LnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIGltcGxpY2l0VGFyZ2V0LnNldE5hbWUoIiIpOworICAgICAgICB0YXJnZXRWZWN0b3IuYWRkRWxlbWVudChpbXBsaWNpdFRhcmdldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgYnVpbGQgZmlsZSB0byB3aGljaCB0aGUgWE1MIGNvbnRleHQgYmVsb25ncworICAgICAqIEBwYXJhbSBidWlsZEZpbGUgIGFudCBidWlsZCBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVpbGRGaWxlKEZpbGUgYnVpbGRGaWxlKSB7CisgICAgICAgIHRoaXMuYnVpbGRGaWxlID0gYnVpbGRGaWxlOworICAgICAgICB0aGlzLmJ1aWxkRmlsZVBhcmVudCA9IG5ldyBGaWxlKGJ1aWxkRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgIGltcGxpY2l0VGFyZ2V0LnNldExvY2F0aW9uKG5ldyBMb2NhdGlvbihidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmaW5kIG91dCB0aGUgYnVpbGQgZmlsZQorICAgICAqIEByZXR1cm4gIHRoZSBidWlsZCBmaWxlIHRvIHdoaWNoIHRoZSB4bWwgY29udGV4dCBiZWxvbmdzCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0QnVpbGRGaWxlKCkgeworICAgICAgICByZXR1cm4gYnVpbGRGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZpbmQgb3V0IHRoZSBwYXJlbnQgYnVpbGQgZmlsZSBvZiB0aGlzIGJ1aWxkIGZpbGUKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgYnVpbGQgZmlsZSBvZiB0aGlzIGJ1aWxkIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRCdWlsZEZpbGVQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBidWlsZEZpbGVQYXJlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmluZCBvdXQgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBhbnR4bWwgY29udGV4dCBiZWxvbmdzCisgICAgICogQHJldHVybiBwcm9qZWN0CisgICAgICovCisgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmluZCBvdXQgdGhlIGN1cnJlbnQgcHJvamVjdCBuYW1lCisgICAgICogQHJldHVybiBjdXJyZW50IHByb2plY3QgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFByb2plY3ROYW1lKCkgeworICAgICAgICByZXR1cm4gY3VycmVudFByb2plY3ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFByb2plY3ROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMuY3VycmVudFByb2plY3ROYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGN1cnJlbnQgcnVudGltZSBjb25maWd1cmFibGUgd3JhcHBlcgorICAgICAqIGNhbiByZXR1cm4gbnVsbAorICAgICAqIEByZXR1cm4gcnVudGltZSBjb25maWd1cmFibGUgd3JhcHBlcgorICAgICAqLworICAgIHB1YmxpYyBSdW50aW1lQ29uZmlndXJhYmxlIGN1cnJlbnRXcmFwcGVyKCkgeworICAgICAgICBpZiAod1N0YWNrLnNpemUoKSA8IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoUnVudGltZUNvbmZpZ3VyYWJsZSkgd1N0YWNrLmVsZW1lbnRBdCh3U3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBydW50aW1lIGNvbmZpZ3VyYWJsZSB3cmFwcGVyIG9mIHRoZSBwYXJlbnQgcHJvamVjdAorICAgICAqIGNhbiByZXR1cm4gbnVsbAorICAgICAqIEByZXR1cm4gcnVudGltZSBjb25maWd1cmFibGUgd3JhcHBlciAgb2YgdGhlIHBhcmVudCBwcm9qZWN0CisgICAgICovCisgICAgcHVibGljIFJ1bnRpbWVDb25maWd1cmFibGUgcGFyZW50V3JhcHBlcigpIHsKKyAgICAgICAgaWYgKHdTdGFjay5zaXplKCkgPCAyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFJ1bnRpbWVDb25maWd1cmFibGUpIHdTdGFjay5lbGVtZW50QXQod1N0YWNrLnNpemUoKSAtIDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIHJ1bnRpbWUgY29uZmlndXJhYmxlIHdyYXBwZXIgdG8gdGhlIGludGVybmFsIHN0YWNrCisgICAgICogQHBhcmFtIHdyYXBwZXIgcnVudGltZSBjb25maWd1cmFibGUgd3JhcHBlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1c2hXcmFwcGVyKFJ1bnRpbWVDb25maWd1cmFibGUgd3JhcHBlcikgeworICAgICAgICB3U3RhY2suYWRkRWxlbWVudCh3cmFwcGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgYSBydW50aW1lIGNvbmZpZ3VyYWJsZSB3cmFwcGVyIGZyb20gdGhlIHN0YWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9wV3JhcHBlcigpIHsKKyAgICAgICAgaWYgKHdTdGFjay5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICB3U3RhY2sucmVtb3ZlRWxlbWVudEF0KHdTdGFjay5zaXplKCkgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFjY2VzcyB0aGUgc3RhY2sgb2Ygd3JhcHBlcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFjayBvZiB3cmFwcGVycworICAgICAqLworICAgIHB1YmxpYyBWZWN0b3IgZ2V0V3JhcHBlclN0YWNrKCkgeworICAgICAgICByZXR1cm4gd1N0YWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5ldyB0YXJnZXQKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRhcmdldCB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUYXJnZXQoVGFyZ2V0IHRhcmdldCkgeworICAgICAgICB0YXJnZXRWZWN0b3IuYWRkRWxlbWVudCh0YXJnZXQpOworICAgICAgICBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgY3VycmVudCB0YXJnZXQKKyAgICAgKiBAcmV0dXJuIGN1cnJlbnQgdGFyZ2V0CisgICAgICovCisgICAgcHVibGljIFRhcmdldCBnZXRDdXJyZW50VGFyZ2V0KCkgeworICAgICAgICByZXR1cm4gY3VycmVudFRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGltcGxpY2l0IHRhcmdldAorICAgICAqIEByZXR1cm4gaW1wbGljaXQgdGFyZ2V0CisgICAgICovCisgICAgcHVibGljIFRhcmdldCBnZXRJbXBsaWNpdFRhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIGltcGxpY2l0VGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldHMgdGhlIGN1cnJlbnQgdGFyZ2V0CisgICAgICogQHBhcmFtIHRhcmdldCBjdXJyZW50IHRhcmdldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRUYXJnZXQoVGFyZ2V0IHRhcmdldCkgeworICAgICAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSB0YXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgaW1wbGljaXQgdGFyZ2V0CisgICAgICogQHBhcmFtIHRhcmdldCB0aGUgaW1wbGljaXQgdGFyZ2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXRUYXJnZXQoVGFyZ2V0IHRhcmdldCkgeworICAgICAgICB0aGlzLmltcGxpY2l0VGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIGFjY2VzcyB0aGUgdmVjdG9yIG9mIHRhcmdldHMKKyAgICAgKiBAcmV0dXJuIHZlY3RvciBvZiB0YXJnZXRzCisgICAgICovCisgICAgcHVibGljIFZlY3RvciBnZXRUYXJnZXRzKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0VmVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW5zIGFuIGF0dHJpYnV0ZSBsaXN0IGZvciB0aGUgPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSBhbmQKKyAgICAgKiBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIHRhcmdldCBvYmplY3QgaW4gdGhlIHByb2plY3QgaWYgYW4KKyAgICAgKiBpZCBpcyBmb3VuZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCB3YXMgbW92ZWQgb3V0IG9mIHRoZSBjb25maWd1cmUgbWV0aG9kIHRvIGFsbG93CisgICAgICogaXQgdG8gYmUgZXhlY3V0ZWQgYXQgcGFyc2UgdGltZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgY3VycmVudCBlbGVtZW50CisgICAgICogQHBhcmFtIGF0dHIgYXR0cmlidXRlcyBvZiB0aGUgY3VycmVudCBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlSWQoT2JqZWN0IGVsZW1lbnQsIEF0dHJpYnV0ZXMgYXR0cikgeworICAgICAgICBTdHJpbmcgaWQgPSBhdHRyLmdldFZhbHVlKCJpZCIpOworICAgICAgICBpZiAoaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvamVjdC5hZGRJZFJlZmVyZW5jZShpZCwgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhY2Nlc3MgdGhlIGxvY2F0b3IKKyAgICAgKiBAcmV0dXJuIGxvY2F0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYXRvciBnZXRMb2NhdG9yKCkgeworICAgICAgICByZXR1cm4gbG9jYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSBsb2NhdG9yCisgICAgICogQHBhcmFtIGxvY2F0b3IgbG9jYXRvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVsbHMgd2hldGhlciB0aGUgcHJvamVjdCB0YWcgaXMgYmVpbmcgaWdub3JlZAorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgcHJvamVjdCB0YWcgaXMgYmVpbmcgaWdub3JlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JpbmdQcm9qZWN0VGFnKCkgeworICAgICAgICByZXR1cm4gaWdub3JlUHJvamVjdFRhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgc2V0cyB0aGUgZmxhZyB0byBpZ25vcmUgdGhlIHByb2plY3QgdGFnCisgICAgICogQHBhcmFtIGZsYWcgdG8gaWdub3JlIHRoZSBwcm9qZWN0IHRhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZVByb2plY3RUYWcoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIHRoaXMuaWdub3JlUHJvamVjdFRhZyA9IGZsYWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGR1cmluZyBwYXJzaW5nLCBzdG9yZXMgdGhlIHByZWZpeCB0byB1cmkgbWFwcGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggYSBuYW1lc3BhY2UgcHJlZml4CisgICAgICogQHBhcmFtIHVyaSAgICBhIG5hbWVzcGFjZSB1cmkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgeworICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgcHJlZml4TWFwcGluZy5nZXQocHJlZml4KTsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHByZWZpeE1hcHBpbmcucHV0KHByZWZpeCwgbGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdC5hZGQodXJpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmQgb2YgcHJlZml4IHRvIHVyaSBtYXBwaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgbmFtZXNwYWNlIHByZWZpeAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCkgeworICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgcHJlZml4TWFwcGluZy5nZXQocHJlZml4KTsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIFNob3VsZCBub3QgaGFwcGVuCisgICAgICAgIH0KKyAgICAgICAgbGlzdC5yZW1vdmUobGlzdC5zaXplKCkgLSAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcmVmaXggdG8gbmFtZXNwYWNlIHVyaSBtYXBwaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBwcmVmaXggdG8gbWFwCisgICAgICogQHJldHVybiB0aGUgdXJpIGZvciB0aGlzIHByZWZpeCwgbnVsbCBpZiBub3QgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBwcmVmaXhNYXBwaW5nLmdldChwcmVmaXgpOworICAgICAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoU3RyaW5nKSBsaXN0LmdldChsaXN0LnNpemUoKSAtIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGFyZ2V0cyBpbiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRhcmdldHMuCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRDdXJyZW50VGFyZ2V0cygpIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRUYXJnZXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWFwIG9mIHRoZSB0YXJnZXRzIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlLgorICAgICAqIEBwYXJhbSBjdXJyZW50VGFyZ2V0cyBhIG1hcCBvZiB0YXJnZXRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRUYXJnZXRzKE1hcCBjdXJyZW50VGFyZ2V0cykgeworICAgICAgICB0aGlzLmN1cnJlbnRUYXJnZXRzID0gY3VycmVudFRhcmdldHM7CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL0RlZmF1bHRFeGVjdXRvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL0RlZmF1bHRFeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0MDk5YjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvRGVmYXVsdEV4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRXhlY3V0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogRGVmYXVsdCBUYXJnZXQgZXhlY3V0b3IgaW1wbGVtZW50YXRpb24uIFJ1bnMgZWFjaCB0YXJnZXQgaW5kaXZpZHVhbGx5CisgKiAoaW5jbHVkaW5nIGFsbCBvZiBpdHMgZGVwZW5kZW5jaWVzKS4gSWYgYW4gZXJyb3Igb2NjdXJzLCBiZWhhdmlvciBpcworICogZGV0ZXJtaW5lZCBieSB0aGUgUHJvamVjdCdzICJrZWVwLWdvaW5nIiBtb2RlLgorICogQHNpbmNlIEFudCAxLjYuMworICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdEV4ZWN1dG9yIGltcGxlbWVudHMgRXhlY3V0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2luZ2xlQ2hlY2tFeGVjdXRvciBTVUJfRVhFQ1VUT1IgPSBuZXcgU2luZ2xlQ2hlY2tFeGVjdXRvcigpOworCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhcmdldHMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSB0YXJnZXROYW1lcykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQnVpbGRFeGNlcHRpb24gdGhyb3duRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXROYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9qZWN0LmV4ZWN1dGVUYXJnZXQodGFyZ2V0TmFtZXNbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5pc0tlZXBHb2luZ01vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvd25FeGNlcHRpb24gPSBleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocm93bkV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyB0aHJvd25FeGNlcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0U3ViUHJvamVjdEV4ZWN1dG9yKCkgeworICAgICAgICByZXR1cm4gU1VCX0VYRUNVVE9SOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL0lnbm9yZURlcGVuZGVuY2llc0V4ZWN1dG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvSWdub3JlRGVwZW5kZW5jaWVzRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YWI4NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL0lnbm9yZURlcGVuZGVuY2llc0V4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldDsKKworLyoqCisgKiBUYXJnZXQgZXhlY3V0b3IgaW1wbGVtZW50YXRpb24gdGhhdCBpZ25vcmVzIGRlcGVuZGVuY2llcy4gUnVucyBlYWNoCisgKiB0YXJnZXQgYnkgY2FsbGluZyA8Y29kZT50YXJnZXQucGVyZm9ybVRhc2tzKCk8L2NvZGU+IGRpcmVjdGx5LiBJZiBhbgorICogZXJyb3Igb2NjdXJzLCBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBQcm9qZWN0J3MgImtlZXAtZ29pbmciIG1vZGUuCisgKiBUbyBiZSB1c2VkIHdoZW4geW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuCisgKgorICogQHNpbmNlIEFudCAxLjcuMQorICovCitwdWJsaWMgY2xhc3MgSWdub3JlRGVwZW5kZW5jaWVzRXhlY3V0b3IgaW1wbGVtZW50cyBFeGVjdXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW5nbGVDaGVja0V4ZWN1dG9yIFNVQl9FWEVDVVRPUiA9IG5ldyBTaW5nbGVDaGVja0V4ZWN1dG9yKCk7CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0cyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHRhcmdldE5hbWVzKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBIYXNodGFibGUgdGFyZ2V0cyA9IHByb2plY3QuZ2V0VGFyZ2V0cygpOworICAgICAgICBCdWlsZEV4Y2VwdGlvbiB0aHJvd25FeGNlcHRpb24gPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldE5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRhcmdldCB0ID0gKFRhcmdldCkgdGFyZ2V0cy5nZXQodGFyZ2V0TmFtZXNbaV0pOworICAgICAgICAgICAgICAgIGlmICh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5rbm93biB0YXJnZXQgIiArIHRhcmdldE5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdC5wZXJmb3JtVGFza3MoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaXNLZWVwR29pbmdNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3duRXhjZXB0aW9uID0gZXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0aHJvd25FeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgdGhyb3duRXhjZXB0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIEV4ZWN1dG9yIGdldFN1YlByb2plY3RFeGVjdXRvcigpIHsKKyAgICAgICAgcmV0dXJuIFNVQl9FWEVDVVRPUjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9Qcm9qZWN0SGVscGVyMi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1Byb2plY3RIZWxwZXIyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjYzQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9Qcm9qZWN0SGVscGVyMi5qYXZhCkBAIC0wLDAgKzEsMTA0NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY05hbWVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5SdW50aW1lQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlVua25vd25FbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSkFYUFV0aWxzOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworLyoqCisgKiBTYXgyIGJhc2VkIHByb2plY3QgcmVhZGVyCisgKgorICovCitwdWJsaWMgY2xhc3MgUHJvamVjdEhlbHBlcjIgZXh0ZW5kcyBQcm9qZWN0SGVscGVyIHsKKyAgICAvKiogUmVmZXJlbmNlIGhvbGRpbmcgdGhlIChvcmRlcmVkKSB0YXJnZXQgVmVjdG9yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSURfVEFSR0VUUyA9ICJhbnQudGFyZ2V0cyI7CisKKyAgICAvKiBTdGF0ZWxlc3MgKi8KKworICAgIC8vIHNpbmdsZXRvbnMgLSBzaW5jZSBhbGwgc3RhdGUgaXMgaW4gdGhlIGNvbnRleHQKKyAgICBwcml2YXRlIHN0YXRpYyBBbnRIYW5kbGVyIGVsZW1lbnRIYW5kbGVyID0gbmV3IEVsZW1lbnRIYW5kbGVyKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgQW50SGFuZGxlciB0YXJnZXRIYW5kbGVyID0gbmV3IFRhcmdldEhhbmRsZXIoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBBbnRIYW5kbGVyIG1haW5IYW5kbGVyID0gbmV3IE1haW5IYW5kbGVyKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgQW50SGFuZGxlciBwcm9qZWN0SGFuZGxlciA9IG5ldyBQcm9qZWN0SGFuZGxlcigpOworCisgICAgLyoqIFNwZWNpZmljIHRvIFByb2plY3RIZWxwZXIyIHNvIG5vdCBhIHRydWUgQW50ICJtYWdpYyBuYW1lOiIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSURfQ09OVEVYVCA9ICJhbnQucGFyc2luZy5jb250ZXh0IjsKKworICAgIC8qKgorICAgICAqIGhlbHBlciBmb3IgcGF0aCAtPiBVUkkgYW5kIFVSSSAtPiBwYXRoIGNvbnZlcnNpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogUGFyc2UgYW4gdW5rbm93biBlbGVtZW50IGZyb20gYSB1cmwKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcGFyYW0gc291cmNlICB0aGUgdXJsIGNvbnRhaW5pbmcgdGhlIHRhc2sKKyAgICAgKiBAcmV0dXJuIGEgY29uZmlndXJlZCB0YXNrCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgVW5rbm93bkVsZW1lbnQgcGFyc2VVbmtub3duRWxlbWVudChQcm9qZWN0IHByb2plY3QsIFVSTCBzb3VyY2UpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFRhcmdldCBkdW1teVRhcmdldCA9IG5ldyBUYXJnZXQoKTsKKyAgICAgICAgZHVtbXlUYXJnZXQuc2V0UHJvamVjdChwcm9qZWN0KTsKKworICAgICAgICBBbnRYTUxDb250ZXh0IGNvbnRleHQgPSBuZXcgQW50WE1MQ29udGV4dChwcm9qZWN0KTsKKyAgICAgICAgY29udGV4dC5hZGRUYXJnZXQoZHVtbXlUYXJnZXQpOworICAgICAgICBjb250ZXh0LnNldEltcGxpY2l0VGFyZ2V0KGR1bW15VGFyZ2V0KTsKKworICAgICAgICBwYXJzZShjb250ZXh0LmdldFByb2plY3QoKSwgc291cmNlLCBuZXcgUm9vdEhhbmRsZXIoY29udGV4dCwgZWxlbWVudEhhbmRsZXIpKTsKKyAgICAgICAgVGFza1tdIHRhc2tzID0gZHVtbXlUYXJnZXQuZ2V0VGFza3MoKTsKKyAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHRhc2tzIGRlZmluZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFVua25vd25FbGVtZW50KSB0YXNrc1swXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIHNvdXJjZSB4bWwgaW5wdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICogQHBhcmFtIHNvdXJjZSAgdGhlIHhtbCBzb3VyY2UKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlKFByb2plY3QgcHJvamVjdCwgT2JqZWN0IHNvdXJjZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0SW1wb3J0U3RhY2soKS5hZGRFbGVtZW50KHNvdXJjZSk7CisgICAgICAgIEFudFhNTENvbnRleHQgY29udGV4dCA9IG51bGw7CisgICAgICAgIGNvbnRleHQgPSAoQW50WE1MQ29udGV4dCkgcHJvamVjdC5nZXRSZWZlcmVuY2UoUkVGSURfQ09OVEVYVCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQW50WE1MQ29udGV4dChwcm9qZWN0KTsKKyAgICAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKFJFRklEX0NPTlRFWFQsIGNvbnRleHQpOworICAgICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoUkVGSURfVEFSR0VUUywgY29udGV4dC5nZXRUYXJnZXRzKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRJbXBvcnRTdGFjaygpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIC8vIHdlIGFyZSBpbiBhbiBpbXBvcnRlZCBmaWxlLgorICAgICAgICAgICAgY29udGV4dC5zZXRJZ25vcmVQcm9qZWN0VGFnKHRydWUpOworICAgICAgICAgICAgVGFyZ2V0IGN1cnJlbnRUYXJnZXQgPSBjb250ZXh0LmdldEN1cnJlbnRUYXJnZXQoKTsKKyAgICAgICAgICAgIFRhcmdldCBjdXJyZW50SW1wbGljaXQgPSBjb250ZXh0LmdldEltcGxpY2l0VGFyZ2V0KCk7CisgICAgICAgICAgICBNYXAgICAgY3VycmVudFRhcmdldHMgPSBjb250ZXh0LmdldEN1cnJlbnRUYXJnZXRzKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRhcmdldCBuZXdDdXJyZW50ID0gbmV3IFRhcmdldCgpOworICAgICAgICAgICAgICAgIG5ld0N1cnJlbnQuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICBuZXdDdXJyZW50LnNldE5hbWUoIiIpOworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudFRhcmdldChuZXdDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRUYXJnZXRzKG5ldyBIYXNoTWFwKCkpOworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW1wbGljaXRUYXJnZXQobmV3Q3VycmVudCk7CisgICAgICAgICAgICAgICAgcGFyc2UocHJvamVjdCwgc291cmNlLCBuZXcgUm9vdEhhbmRsZXIoY29udGV4dCwgbWFpbkhhbmRsZXIpKTsKKyAgICAgICAgICAgICAgICBuZXdDdXJyZW50LmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50VGFyZ2V0KGN1cnJlbnRUYXJnZXQpOworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW1wbGljaXRUYXJnZXQoY3VycmVudEltcGxpY2l0KTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRUYXJnZXRzKGN1cnJlbnRUYXJnZXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRvcCBsZXZlbCBmaWxlCisgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRUYXJnZXRzKG5ldyBIYXNoTWFwKCkpOworICAgICAgICAgICAgcGFyc2UocHJvamVjdCwgc291cmNlLCBuZXcgUm9vdEhhbmRsZXIoY29udGV4dCwgbWFpbkhhbmRsZXIpKTsKKyAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIHRvcC1sZXZlbCB0YXJnZXQKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0SW1wbGljaXRUYXJnZXQoKS5leGVjdXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHByb2plY3QgZmlsZSwgY29uZmlndXJpbmcgdGhlIHByb2plY3QgYXMgaXQgZ29lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcGFyYW0gc291cmNlICB0aGUgeG1sIHNvdXJjZQorICAgICAqIEBwYXJhbSBoYW5kbGVyIHRoZSByb290IGhhbmRsZXIgdG8gdXNlIChjb250YWlucyB0aGUgY3VycmVudCBjb250ZXh0KQorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCBvciBjYW5ub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZShQcm9qZWN0IHByb2plY3QsIE9iamVjdCBzb3VyY2UsIFJvb3RIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0ID0gaGFuZGxlci5jb250ZXh0OworCisgICAgICAgIEZpbGUgYnVpbGRGaWxlID0gbnVsbDsKKyAgICAgICAgVVJMICB1cmwgPSBudWxsOworICAgICAgICBTdHJpbmcgYnVpbGRGaWxlTmFtZSA9IG51bGw7CisKKyAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEZpbGUpIHsKKyAgICAgICAgICAgIGJ1aWxkRmlsZSA9IChGaWxlKSBzb3VyY2U7CisgICAgICAgICAgICBidWlsZEZpbGUgPSBGSUxFX1VUSUxTLm5vcm1hbGl6ZShidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgY29udGV4dC5zZXRCdWlsZEZpbGUoYnVpbGRGaWxlKTsKKyAgICAgICAgICAgIGJ1aWxkRmlsZU5hbWUgPSBidWlsZEZpbGUudG9TdHJpbmcoKTsKKy8vICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSApIHsKKyAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBVUkwpIHsKKyAgICAgICAgICAgIHVybCA9IChVUkwpIHNvdXJjZTsKKyAgICAgICAgICAgIGJ1aWxkRmlsZU5hbWUgPSB1cmwudG9TdHJpbmcoKTsKKy8vICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBJbnB1dFNvdXJjZSApIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU291cmNlICIgKyBzb3VyY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbHVnaW4iKTsKKyAgICAgICAgfQorICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBTQVggMiBzdHlsZSBwYXJzZXIgdXNlZCB0byBwYXJzZSB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgWE1MUmVhZGVyIHBhcnNlciA9IEpBWFBVdGlscy5nZXROYW1lc3BhY2VYTUxSZWFkZXIoKTsKKworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7CisgICAgICAgICAgICBpZiAoYnVpbGRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBGSUxFX1VUSUxTLnRvVVJJKGJ1aWxkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGJ1aWxkRmlsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgICAgICB1cmkgPSB1cmwudG9TdHJpbmcoKTsgLy8gPz8gT0sgPz8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQodXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2plY3QubG9nKCJwYXJzaW5nIGJ1aWxkZmlsZSAiICsgYnVpbGRGaWxlTmFtZSArICIgd2l0aCBVUkkgPSAiICsgdXJpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgRGVmYXVsdEhhbmRsZXIgaGIgPSBoYW5kbGVyOworCisgICAgICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoaGIpOworICAgICAgICAgICAgcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKGhiKTsKKyAgICAgICAgICAgIHBhcnNlci5zZXRFcnJvckhhbmRsZXIoaGIpOworICAgICAgICAgICAgcGFyc2VyLnNldERUREhhbmRsZXIoaGIpOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihleGMuZ2V0U3lzdGVtSWQoKSwgZXhjLmdldExpbmVOdW1iZXIoKSwgZXhjCisgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5OdW1iZXIoKSk7CisKKyAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZXhjLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIEJ1aWxkRXhjZXB0aW9uIGJlID0gKEJ1aWxkRXhjZXB0aW9uKSB0OworICAgICAgICAgICAgICAgIGlmIChiZS5nZXRMb2NhdGlvbigpID09IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgYmUuc2V0TG9jYXRpb24obG9jYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBiZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpLCB0ID09IG51bGwgPyBleGMgOiB0LCBsb2NhdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZXhjLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGMuZ2V0TWVzc2FnZSgpLCB0ID09IG51bGwgPyBleGMgOiB0KTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4Yyk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRW5jb2Rpbmcgb2YgcHJvamVjdCBmaWxlICIgKyBidWlsZEZpbGVOYW1lICsgIiBpcyBpbnZhbGlkLiIsCisgICAgICAgICAgICAgICAgICAgIGV4Yyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIHByb2plY3QgZmlsZSAiICsgYnVpbGRGaWxlTmFtZSArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBleGMuZ2V0TWVzc2FnZSgpLCBleGMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGlucHV0U3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgbWFpbiBoYW5kbGVyCisgICAgICogQHJldHVybiBtYWluIGhhbmRsZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIEFudEhhbmRsZXIgZ2V0TWFpbkhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBtYWluSGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIG1haW4gaGFuZGxlcgorICAgICAqIEBwYXJhbSBoYW5kbGVyICBuZXcgbWFpbiBoYW5kbGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldE1haW5IYW5kbGVyKEFudEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBtYWluSGFuZGxlciA9IGhhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBwcm9qZWN0IGhhbmRsZXIKKyAgICAgKiBAcmV0dXJuIHByb2plY3QgaGFuZGxlcgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgQW50SGFuZGxlciBnZXRQcm9qZWN0SGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3RIYW5kbGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgcHJvamVjdCBoYW5kbGVyCisgICAgICogQHBhcmFtIGhhbmRsZXIgIG5ldyBwcm9qZWN0IGhhbmRsZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2V0UHJvamVjdEhhbmRsZXIoQW50SGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIHByb2plY3RIYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRhcmdldCBoYW5kbGVyCisgICAgICogQHJldHVybiB0YXJnZXQgaGFuZGxlcgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgQW50SGFuZGxlciBnZXRUYXJnZXRIYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0SGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRhcmdldCBoYW5kbGVyCisgICAgICogQHBhcmFtIGhhbmRsZXIgIG5ldyB0YXJnZXQgaGFuZGxlcgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXRUYXJnZXRIYW5kbGVyKEFudEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICB0YXJnZXRIYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGVsZW1lbnQgaGFuZGxlcgorICAgICAqIEByZXR1cm4gZWxlbWVudCBoYW5kbGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBBbnRIYW5kbGVyIGdldEVsZW1lbnRIYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudEhhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBlbGVtZW50IGhhbmRsZXIKKyAgICAgKiBAcGFyYW0gaGFuZGxlciAgbmV3IGVsZW1lbnQgaGFuZGxlcgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXRFbGVtZW50SGFuZGxlcihBbnRIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgZWxlbWVudEhhbmRsZXIgPSBoYW5kbGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjb21tb24gc3VwZXJjbGFzcyBmb3IgYWxsIFNBWCBldmVudCBoYW5kbGVycyB1c2VkIHRvIHBhcnNlCisgICAgICogdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIFRoZSBjb250ZXh0IHdpbGwgaG9sZCBhbGwgc3RhdGUgaW5mb3JtYXRpb24uIEF0IGVhY2ggdGltZQorICAgICAqIHRoZXJlIGlzIG9uZSBhY3RpdmUgaGFuZGxlciBmb3IgdGhlIGN1cnJlbnQgZWxlbWVudC4gSXQgY2FuCisgICAgICogdXNlIG9uU3RhcnRDaGlsZCgpIHRvIHNldCBhbiBhbHRlcm5hdGUgaGFuZGxlciBmb3IgdGhlIGNoaWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW50SGFuZGxlciAgeworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudC4gVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIGRvZXMKKyAgICAgICAgICogbm90aGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHVyaSB0aGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIHRhZworICAgICAgICAgKiBAcGFyYW0gdGFnIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBxbmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdGhhdCB0aGlzIGVsZW1lbnQgaXMgaW4uCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgbm90IG92ZXJyaWRkZW4sIG9yIGluCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvZiBlcnJvciBpbiBhbiBvdmVycmlkZGVuIHZlcnNpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyB0YWcsIFN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQuIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBqdXN0CisgICAgICAgICAqIHRocm93cyBhbiBleGNlcHRpb24gLSB5b3UgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB5b3UgZXhwZWN0CisgICAgICAgICAqIGNoaWxkIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBuYW1lc3BhY2UgdXJpIGZvciB0aGlzIGVsZW1lbnQuCisgICAgICAgICAqIEBwYXJhbSB0YWcgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIHFuYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjdXJyZW50IGNvbnRleHQuCisgICAgICAgICAqIEByZXR1cm4gYSBoYW5kbGVyIChpbiB0aGUgZGVyaXZlZCBjbGFzc2VzKQorICAgICAgICAgKgorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBvdmVycmlkZGVuLCBvciBpbgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IgaW4gYW4gb3ZlcnJpZGRlbiB2ZXJzaW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQW50SGFuZGxlciBvblN0YXJ0Q2hpbGQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGVsZW1lbnQgXCIiICsgcW5hbWUgKyAiIFwiIiwgY29udGV4dAorICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdGhlIGVuZCBvZiBhIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmkgdGhlIG5hbWVzcGFjZSB1cmkgb2YgdGhlIGVsZW1lbnQKKyAgICAgICAgICogQHBhcmFtIHRhZyB0aGUgdGFnIG9mIHRoZSBlbGVtZW50CisgICAgICAgICAqIEBwYXJhbSBxbmFtZSB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVsZW1lbnQKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGN1cnJlbnQgY29udGV4dAorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FbmRDaGlsZChTdHJpbmcgdXJpLCBTdHJpbmcgdGFnLCBTdHJpbmcgcW5hbWUsIEFudFhNTENvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoaXMgZWxlbWVudCBhbmQgYWxsIGVsZW1lbnRzIG5lc3RlZCBpbnRvIGl0IGhhdmUgYmVlbgorICAgICAgICAgKiBoYW5kbGVkLiBJLmUuLCB0aGlzIGhhcHBlbnMgYXQgdGhlICZsdDsvZW5kX3RhZ19vZl90aGVfZWxlbWVudCZndDsuCisgICAgICAgICAqIEBwYXJhbSB1cmkgdGhlIG5hbWVzcGFjZSB1cmkgZm9yIHRoaXMgZWxlbWVudAorICAgICAgICAgKiBAcGFyYW0gdGFnIHRoZSBlbGVtZW50IG5hbWUKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGN1cnJlbnQgY29udGV4dAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyB0YWcsIEFudFhNTENvbnRleHQgY29udGV4dCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgdGV4dCB3aXRoaW4gYW4gZWxlbWVudC4gVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIGp1c3QKKyAgICAgICAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbiwgeW91IG11c3Qgb3ZlcnJpZGUgaXQgaWYgeW91IGV4cGVjdCBjb250ZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYnVmIEEgY2hhcmFjdGVyIGFycmF5IG9mIHRoZSB0ZXh0IHdpdGhpbiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBlbGVtZW50IGluIHRoZSBhcnJheS4KKyAgICAgICAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIGZyb20gdGhlIGFycmF5LgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgKgorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBvdmVycmlkZGVuLCBvciBpbgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IgaW4gYW4gb3ZlcnJpZGRlbiB2ZXJzaW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50LCBBbnRYTUxDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhidWYsIHN0YXJ0LCBjb3VudCkudHJpbSgpOworCisgICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGV4dCBcIiIgKyBzICsgIlwiIiwgY29udGV4dC5nZXRMb2NhdG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdpbGwgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBuYW1lc3BhY2UgaXMgcmVhY2hlZC4KKyAgICAgICAgICogSXQnbGwgdmVyaWZ5IGlmIHRoZSBucyB3YXMgcHJvY2Vzc2VkLCBhbmQgaWYgbm90IGxvYWQgdGhlIHRhc2sgZGVmaW5pdGlvbnMuCisgICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIG5hbWVzcGFjZSB1cmkuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja05hbWVzcGFjZShTdHJpbmcgdXJpKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGZvciBhbnQgcHJvY2Vzc2luZy4gVXNlcyBhIHN0YWNrIG9mIEFudEhhbmRsZXJzIHRvCisgICAgICogaW1wbGVtZW50IGVhY2ggZWxlbWVudCAoIHRoZSBvcmlnaW5hbCBwYXJzZXIgdXNlZCBhIHJlY3Vyc2l2ZSBiZWhhdmlvciwKKyAgICAgKiB3aXRoIHRoZSBpbXBsaWNpdCBleGVjdXRpb24gc3RhY2sgKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7CisgICAgICAgIHByaXZhdGUgU3RhY2sgYW50SGFuZGxlcnMgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgcHJpdmF0ZSBBbnRIYW5kbGVyIGN1cnJlbnRIYW5kbGVyID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBBbnRYTUxDb250ZXh0IGNvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgUm9vdEhhbmRsZXIgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgaGFuZGxlci4KKyAgICAgICAgICogQHBhcmFtIHJvb3RIYW5kbGVyIFRoZSBoYW5kbGVyIGZvciB0aGUgcm9vdCBlbGVtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJvb3RIYW5kbGVyKEFudFhNTENvbnRleHQgY29udGV4dCwgQW50SGFuZGxlciByb290SGFuZGxlcikgeworICAgICAgICAgICAgY3VycmVudEhhbmRsZXIgPSByb290SGFuZGxlcjsKKyAgICAgICAgICAgIGFudEhhbmRsZXJzLnB1c2goY3VycmVudEhhbmRsZXIpOworICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFudCBoYW5kbGVyIG9iamVjdC4KKyAgICAgICAgICogQHJldHVybiB0aGUgY3VycmVudCBhbnQgaGFuZGxlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBbnRIYW5kbGVyIGdldEN1cnJlbnRBbnRIYW5kbGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRIYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc29sdmVzIGZpbGU6IFVSSXMgcmVsYXRpdmUgdG8gdGhlIGJ1aWxkIGZpbGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgcHVibGljIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICAgICAqICAgICAgICAgICAgICAgICBpZiBub25lIGlzIGF2YWlsYWJsZS4gSWdub3JlZCBpbiB0aGlzCisgICAgICAgICAqICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBwcm92aWRlZCBpbiB0aGUgWE1MCisgICAgICAgICAqICAgICAgICAgICAgICAgICBkb2N1bWVudC4gV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEByZXR1cm4gYW4gaW5wdXRzb3VyY2UgZm9yIHRoaXMgaWRlbnRpZmllcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKKworICAgICAgICAgICAgY29udGV4dC5nZXRQcm9qZWN0KCkubG9nKCJyZXNvbHZpbmcgc3lzdGVtSWQ6ICIgKyBzeXN0ZW1JZCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgICAgIGlmIChzeXN0ZW1JZC5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBGSUxFX1VUSUxTLmZyb21VUkkoc3lzdGVtSWQpOworCisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICBmaWxlID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShjb250ZXh0LmdldEJ1aWxkRmlsZVBhcmVudCgpLCBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRQcm9qZWN0KCkubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiAnIiArIHN5c3RlbUlkICsgIicgaW4gIiArIGNvbnRleHQuZ2V0QnVpbGRGaWxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgYmUgZXhwcmVzc2VkIHNpbXBseSBhcyAnIiArIHBhdGgucmVwbGFjZSgnXFwnLCAnLycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGZvciBjb21wbGlhbmNlIHdpdGggb3RoZXIgWE1MIHRvb2xzIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UHJvamVjdCgpLmxvZygiZmlsZT0iICsgZmlsZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOworICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZChGSUxFX1VUSUxTLnRvVVJJKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0U291cmNlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRQcm9qZWN0KCkubG9nKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGNvdWxkIG5vdCBiZSBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCBpZiBub3QgZmlsZSBvciBmaWxlIG5vdCBmb3VuZAorICAgICAgICAgICAgY29udGV4dC5nZXRQcm9qZWN0KCkubG9nKCJjb3VsZCBub3QgcmVzb2x2ZSBzeXN0ZW1JZCIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgdGhlIHN0YXJ0IG9mIGEgcHJvamVjdCBlbGVtZW50LiBBIHByb2plY3QgaGFuZGxlciBpcyBjcmVhdGVkCisgICAgICAgICAqIGFuZCBpbml0aWFsaXNlZCB3aXRoIHRoZSBlbGVtZW50IG5hbWUgYW5kIGF0dHJpYnV0ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIG5hbWVzcGFjZSB1cmkgZm9yIHRoaXMgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gcW5hbWUgVGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGlzIGVsZW1lbnQuCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbiBpZiB0aGUgdGFnIGdpdmVuIGlzIG5vdAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPiJwcm9qZWN0IjwvY29kZT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgdGFnLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgICAgICAgICAgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEFudEhhbmRsZXIgbmV4dCA9IGN1cnJlbnRIYW5kbGVyLm9uU3RhcnRDaGlsZCh1cmksIHRhZywgcW5hbWUsIGF0dHJzLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGFudEhhbmRsZXJzLnB1c2goY3VycmVudEhhbmRsZXIpOworICAgICAgICAgICAgY3VycmVudEhhbmRsZXIgPSBuZXh0OworICAgICAgICAgICAgY3VycmVudEhhbmRsZXIub25TdGFydEVsZW1lbnQodXJpLCB0YWcsIHFuYW1lLCBhdHRycywgY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgbG9jYXRvciBpbiB0aGUgcHJvamVjdCBoZWxwZXIgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2NhdG9yIFRoZSBsb2NhdG9yIHVzZWQgYnkgdGhlIHBhcnNlci4KKyAgICAgICAgICogICAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldExvY2F0b3IobG9jYXRvcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyB0aGUgZW5kIG9mIGFuIGVsZW1lbnQuIEFueSByZXF1aXJlZCBjbGVhbi11cCBpcyBwZXJmb3JtZWQKKyAgICAgICAgICogYnkgdGhlIG9uRW5kRWxlbWVudCgpIG1ldGhvZCBhbmQgdGhlbiB0aGUgb3JpZ2luYWwgaGFuZGxlciBpcyByZXN0b3JlZCB0byB0aGUgcGFyc2VyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJpICBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB3aGljaCBpcyBlbmRpbmcuCisgICAgICAgICAqICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGlzIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKG5vdCB0aHJvd24gaW4gdGhpcyBpbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjdXJyZW50SGFuZGxlci5vbkVuZEVsZW1lbnQodXJpLCBuYW1lLCBjb250ZXh0KTsKKyAgICAgICAgICAgIEFudEhhbmRsZXIgcHJldiA9IChBbnRIYW5kbGVyKSBhbnRIYW5kbGVycy5wb3AoKTsKKyAgICAgICAgICAgIGN1cnJlbnRIYW5kbGVyID0gcHJldjsKKyAgICAgICAgICAgIGlmIChjdXJyZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEhhbmRsZXIub25FbmRDaGlsZCh1cmksIG5hbWUsIHFOYW1lLCBjb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdGV4dCB3aXRoaW4gYW4gZWxlbWVudCwgY2FsbHMgY3VycmVudEhhbmRsZXIuY2hhcmFjdGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ1ZiAgQSBjaGFyYWN0ZXIgYXJyYXkgb2YgdGhlIHRlc3QuCisgICAgICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2Zmc2V0IGluIHRoZSBhcnJheS4KKyAgICAgICAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkLgorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBjb3VudCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGN1cnJlbnRIYW5kbGVyLmNoYXJhY3RlcnMoYnVmLCBzdGFydCwgY291bnQsIGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0YXJ0IGEgbmFtZXNwYWNlIHByZWZpeCB0byB1cmkgbWFwcGluZworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBuYW1lc3BhY2UgcHJlZml4CisgICAgICAgICAqIEBwYXJhbSB1cmkgdGhlIG5hbWVzcGFjZSB1cmkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7CisgICAgICAgICAgICBjb250ZXh0LnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIHVyaSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRW5kIGEgbmFtZXBhY2UgcHJlZml4IHRvIHVyaSBtYXBwaW5nCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCB0aGF0IGlzIG5vdCBtYXBwZWQgYW55bW9yZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4KSB7CisgICAgICAgICAgICBjb250ZXh0LmVuZFByZWZpeE1hcHBpbmcocHJlZml4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtYWluIGhhbmRsZXIgLSBpdCBoYW5kbGVzIHRoZSAmbHQ7cHJvamVjdCZndDsgdGFnLgorICAgICAqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuUHJvamVjdEhlbHBlcjIuQW50SGFuZGxlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFpbkhhbmRsZXIgZXh0ZW5kcyBBbnRIYW5kbGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIHRoZSBwcm9qZWN0IHRhZworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBuYW1lc3BhY2UgdXJpLgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZWxlbWVudCB0YWcuCisgICAgICAgICAqIEBwYXJhbSBxbmFtZSBUaGUgZWxlbWVudCBxdWFsaWZpZWQgbmFtZS4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBwcm9qZWN0IGhhbmRsZXIgdGhhdCBoYW5kbGVzIHN1YmVsZW1lbnRzIG9mIHByb2plY3QKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiB0aGUgcXVhbGlmaWVkIG5hbWUgaXMgbm90ICJwcm9qZWN0Ii4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBbnRIYW5kbGVyIG9uU3RhcnRDaGlsZChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJwcm9qZWN0IikKKyAgICAgICAgICAgICAgICAmJiAodXJpLmVxdWFscygiIikgfHwgdXJpLmVxdWFscyhBTlRfQ09SRV9VUkkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0SGVscGVyMi5wcm9qZWN0SGFuZGxlcjsKKyAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgaWYgKGNvbnRleHQuaW1wb3J0bGV2ZWwgPiAwKSB7CisvLyAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgaW4gYW4gaW1wb3J0ZWQgZmlsZS4gQWxsb3cgdG9wLWxldmVsIDx0YXJnZXQ+LgorLy8gICAgICAgICAgICAgICAgaWYgKHFuYW1lLmVxdWFscyggInRhcmdldCIgKSApCisvLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXIyLnRhcmdldEhhbmRsZXI7CisvLyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhxbmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZWxlbWVudCBcInsiICsgdXJpCisgICAgICAgICAgICAgICAgICAgICsgIn0iICsgbmFtZSArICJcIiB7IiArIEFOVF9DT1JFX1VSSSArICJ9IiArIG5hbWUsIGNvbnRleHQuZ2V0TG9jYXRvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBlbGVtZW50IFwiIiArIHFuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIlwiICIgKyBuYW1lLCBjb250ZXh0LmdldExvY2F0b3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGZvciB0aGUgdG9wIGxldmVsICJwcm9qZWN0IiBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvamVjdEhhbmRsZXIgZXh0ZW5kcyBBbnRIYW5kbGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGlzYXRpb24gcm91dGluZSBjYWxsZWQgYWZ0ZXIgaGFuZGxlciBjcmVhdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBlbGVtZW50IG5hbWUgYW5kIGF0dHJpYnV0ZXMuIFRoZSBhdHRyaWJ1dGVzIHdoaWNoCisgICAgICAgICAqIHRoaXMgaGFuZGxlciBjYW4gZGVhbCB3aXRoIGFyZTogPGNvZGU+ImRlZmF1bHQiPC9jb2RlPiwKKyAgICAgICAgICogPGNvZGU+Im5hbWUiPC9jb2RlPiwgPGNvZGU+ImlkIjwvY29kZT4gYW5kIDxjb2RlPiJiYXNlZGlyIjwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIG5hbWVzcGFjZSBVUkkgZm9yIHRoaXMgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIHRhZyBOYW1lIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzIGhhbmRsZXIKKyAgICAgICAgICogICAgICAgICAgICB0byBiZSBjcmVhdGVkLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiAgICAgICAgICAgIElnbm9yZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHFuYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCB3aGljaCBjYXVzZWQgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgaGFuZGxlciB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiBhbiB1bmV4cGVjdGVkIGF0dHJpYnV0ZSBpcworICAgICAgICAgKiAgICAgICAgICAgIGVuY291bnRlcmVkIG9yIGlmIHRoZSA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+IGF0dHJpYnV0ZQorICAgICAgICAgKiAgICAgICAgICAgIGlzIG1pc3NpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgdGFnLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhNTENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbnVsbDsKKyAgICAgICAgICAgIGJvb2xlYW4gbmFtZUF0dHJpYnV0ZVNldCA9IGZhbHNlOworCisgICAgICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBjb250ZXh0LmdldFByb2plY3QoKTsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGltcGxpY2l0IHRhcmdldCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QgdGFnCisgICAgICAgICAgICBjb250ZXh0LmdldEltcGxpY2l0VGFyZ2V0KCkuc2V0TG9jYXRpb24obmV3IExvY2F0aW9uKGNvbnRleHQuZ2V0TG9jYXRvcigpKSk7CisKKyAgICAgICAgICAgIC8qKiBYWFggSSByZWFsbHkgZG9uJ3QgbGlrZSB0aGlzIC0gdGhlIFhNTCBwcm9jZXNzb3IgaXMgc3RpbGwKKyAgICAgICAgICAgICAqIHRvbyAnaW52b2x2ZWQnIGluIHRoZSBwcm9jZXNzaW5nLiBBIGJldHRlciBzb2x1dGlvbiAoSU1PKQorICAgICAgICAgICAgICogd291bGQgYmUgdG8gY3JlYXRlIFVFIGZvciBQcm9qZWN0IGFuZCBUYXJnZXQgdG9vLCBhbmQKKyAgICAgICAgICAgICAqIHRoZW4gcHJvY2VzcyB0aGUgdHJlZSBhbmQgaGF2ZSBQcm9qZWN0L1RhcmdldCBkZWFsIHdpdGgKKyAgICAgICAgICAgICAqIGl0cyBhdHRyaWJ1dGVzICggc2ltaWxhciB3aXRoIERlc2NyaXB0aW9uICkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogSWYgd2UgZXZlbnR1YWxseSBzd2l0Y2ggdG8gKCBvciBhZGQgc3VwcG9ydCBmb3IgKSBET00sCisgICAgICAgICAgICAgKiB0aGluZ3Mgd2lsbCB3b3JrIHNtb290aGx5IC0gVUUgY2FuIGJlIGF2b2lkZWQgYWxtb3N0IGNvbXBsZXRlbHkKKyAgICAgICAgICAgICAqICggaXQgY291bGQgc3RpbGwgYmUgY3JlYXRlZCBvbiBkZW1hbmQsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICkKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clVyaSA9IGF0dHJzLmdldFVSSShpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0clVyaSAhPSBudWxsICYmICFhdHRyVXJpLmVxdWFscygiIikgJiYgIWF0dHJVcmkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIElnbm9yZSBhdHRyaWJ1dGVzIGZyb20gdW5rbm93biB1cmlzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBhdHRycy5nZXRMb2NhbE5hbWUoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7CisKKyAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscygiZGVmYXVsdCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuaXNJZ25vcmluZ1Byb2plY3RUYWcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0RGVmYXVsdCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoIm5hbWUiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50UHJvamVjdE5hbWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUF0dHJpYnV0ZVNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuaXNJZ25vcmluZ1Byb2plY3RUYWcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0TmFtZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UodmFsdWUsIHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJpZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpZCBhbmQgbmFtZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuaXNJZ25vcmluZ1Byb2plY3RUYWcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKHZhbHVlLCBwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiYmFzZWRpciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5pc0lnbm9yaW5nUHJvamVjdFRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRGlyID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBYWFggaWdub3JlIGF0dHJpYnV0ZXMgaW4gYSBkaWZmZXJlbnQgTlMgKCBtYXliZSBzdG9yZSB0aGVtID8gKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgYXR0cmlidXRlIFwiIiArIGF0dHJzLmdldFFOYW1lKGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIiLCBjb250ZXh0LmdldExvY2F0b3IoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBYWFggTW92ZSB0byBQcm9qZWN0ICggc28gaXQgaXMgc2hhcmVkIGJ5IGFsbCBoZWxwZXJzICkKKyAgICAgICAgICAgIFN0cmluZyBhbnRGaWxlUHJvcCA9ICJhbnQuZmlsZS4iICsgY29udGV4dC5nZXRDdXJyZW50UHJvamVjdE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBkdXAgPSBwcm9qZWN0LmdldFByb3BlcnR5KGFudEZpbGVQcm9wKTsKKyAgICAgICAgICAgIGlmIChkdXAgIT0gbnVsbCAmJiBuYW1lQXR0cmlidXRlU2V0KSB7CisgICAgICAgICAgICAgICAgRmlsZSBkdXBGaWxlID0gbmV3IEZpbGUoZHVwKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5pc0lnbm9yaW5nUHJvamVjdFRhZygpICYmICFkdXBGaWxlLmVxdWFscyhjb250ZXh0LmdldEJ1aWxkRmlsZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZygiRHVwbGljYXRlZCBwcm9qZWN0IG5hbWUgaW4gaW1wb3J0LiBQcm9qZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRleHQuZ2V0Q3VycmVudFByb2plY3ROYW1lKCkgKyAiIGRlZmluZWQgZmlyc3QgaW4gIiArIGR1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgYWdhaW4gaW4gIiArIGNvbnRleHQuZ2V0QnVpbGRGaWxlKCksIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldEJ1aWxkRmlsZSgpICE9IG51bGwgJiYgbmFtZUF0dHJpYnV0ZVNldCkgeworICAgICAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgTWFnaWNOYW1lcy5BTlRfRklMRSArICIuIiArIGNvbnRleHQuZ2V0Q3VycmVudFByb2plY3ROYW1lKCksIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJ1aWxkRmlsZSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbnRleHQuaXNJZ25vcmluZ1Byb2plY3RUYWcoKSkgeworICAgICAgICAgICAgICAgIC8vIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNldCBleHBsaWNpdGx5IGJlZm9yZSBzdGFydGluZyA/CisgICAgICAgICAgICBpZiAocHJvamVjdC5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIocHJvamVjdC5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBmb3IgYmFzZURpciBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGJ1aWxkIGZpbGUuCisgICAgICAgICAgICAgICAgaWYgKGJhc2VEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoY29udGV4dC5nZXRCdWlsZEZpbGVQYXJlbnQoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGFuIGFic29sdXRlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgaWYgKChuZXcgRmlsZShiYXNlRGlyKSkuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoYmFzZURpcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldEJhc2VEaXIoRklMRV9VVElMUy5yZXNvbHZlRmlsZShjb250ZXh0LmdldEJ1aWxkRmlsZVBhcmVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRGlyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9qZWN0LmFkZFRhcmdldCgiIiwgY29udGV4dC5nZXRJbXBsaWNpdFRhcmdldCgpKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudFRhcmdldChjb250ZXh0LmdldEltcGxpY2l0VGFyZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgdGhlIHN0YXJ0IG9mIGEgdG9wLWxldmVsIGVsZW1lbnQgd2l0aGluIHRoZSBwcm9qZWN0LiBBbgorICAgICAgICAgKiBhcHByb3ByaWF0ZSBoYW5kbGVyIGlzIGNyZWF0ZWQgYW5kIGluaXRpYWxpc2VkIHdpdGggdGhlIGRldGFpbHMKKyAgICAgICAgICogb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIG5hbWVzcGFjZSBVUkkgZm9yIHRoaXMgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIHFuYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGlzIGVsZW1lbnQuCisgICAgICAgICAqIEByZXR1cm4gYSB0YXJnZXQgb3IgYW4gZWxlbWVudCBoYW5kbGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAZXhjZXB0aW9uIG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uIGlmIHRoZSB0YWcgZ2l2ZW4gaXMgbm90CisgICAgICAgICAqICAgICAgICAgICAgPGNvZGU+InRhc2tkZWYiPC9jb2RlPiwgPGNvZGU+InR5cGVkZWYiPC9jb2RlPiwKKyAgICAgICAgICogICAgICAgICAgICA8Y29kZT4icHJvcGVydHkiPC9jb2RlPiwgPGNvZGU+InRhcmdldCI8L2NvZGU+CisgICAgICAgICAqICAgICAgICAgICAgb3IgYSBkYXRhIHR5cGUgZGVmaW5pdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFudEhhbmRsZXIgb25TdGFydENoaWxkKFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYTUxDb250ZXh0IGNvbnRleHQpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHMoInRhcmdldCIpICYmICh1cmkuZXF1YWxzKCIiKSB8fCB1cmkuZXF1YWxzKEFOVF9DT1JFX1VSSSkpCisgICAgICAgICAgICAgICAgICAgID8gUHJvamVjdEhlbHBlcjIudGFyZ2V0SGFuZGxlciA6IFByb2plY3RIZWxwZXIyLmVsZW1lbnRIYW5kbGVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlciBmb3IgInRhcmdldCIgZWxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYXJnZXRIYW5kbGVyIGV4dGVuZHMgQW50SGFuZGxlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpc2F0aW9uIHJvdXRpbmUgY2FsbGVkIGFmdGVyIGhhbmRsZXIgY3JlYXRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGVzLiBUaGUgYXR0cmlidXRlcyB3aGljaAorICAgICAgICAgKiB0aGlzIGhhbmRsZXIgY2FuIGRlYWwgd2l0aCBhcmU6IDxjb2RlPiJuYW1lIjwvY29kZT4sCisgICAgICAgICAqIDxjb2RlPiJkZXBlbmRzIjwvY29kZT4sIDxjb2RlPiJpZiI8L2NvZGU+LAorICAgICAgICAgKiA8Y29kZT4idW5sZXNzIjwvY29kZT4sIDxjb2RlPiJpZCI8L2NvZGU+IGFuZAorICAgICAgICAgKiA8Y29kZT4iZGVzY3JpcHRpb24iPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gdGFnIE5hbWUgb2YgdGhlIGVsZW1lbnQgd2hpY2ggY2F1c2VkIHRoaXMgaGFuZGxlcgorICAgICAgICAgKiAgICAgICAgICAgIHRvIGJlIGNyZWF0ZWQuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqICAgICAgICAgICAgSWdub3JlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gcW5hbWUgVGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGlzIGVsZW1lbnQuCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzCisgICAgICAgICAqICAgICAgICAgICAgICBoYW5kbGVyIHRvIGJlIGNyZWF0ZWQuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgKgorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIGFuIHVuZXhwZWN0ZWQgYXR0cmlidXRlIGlzIGVuY291bnRlcmVkCisgICAgICAgICAqICAgICAgICAgICAgb3IgaWYgdGhlIDxjb2RlPiJuYW1lIjwvY29kZT4gYXR0cmlidXRlIGlzIG1pc3NpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgdGFnLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhNTENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBkZXBlbmRzID0gIiI7CisKKyAgICAgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGNvbnRleHQuZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQoKTsKKyAgICAgICAgICAgIHRhcmdldC5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICAgICAgdGFyZ2V0LnNldExvY2F0aW9uKG5ldyBMb2NhdGlvbihjb250ZXh0LmdldExvY2F0b3IoKSkpOworICAgICAgICAgICAgY29udGV4dC5hZGRUYXJnZXQodGFyZ2V0KTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJVcmkgPSBhdHRycy5nZXRVUkkoaSk7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJVcmkgIT0gbnVsbCAmJiAhYXR0clVyaS5lcXVhbHMoIiIpICYmICFhdHRyVXJpLmVxdWFscyh1cmkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJZ25vcmUgYXR0cmlidXRlcyBmcm9tIHVua25vd24gdXJpcworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gYXR0cnMuZ2V0TG9jYWxOYW1lKGkpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpOworCisgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoIm5hbWUiKSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmICgiIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibmFtZSBhdHRyaWJ1dGUgbXVzdCAiICsgIm5vdCBiZSBlbXB0eSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJkZXBlbmRzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kcyA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiaWYiKSkgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SWYodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygidW5sZXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFVubGVzcyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJpZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFByb2plY3QoKS5hZGRSZWZlcmVuY2UodmFsdWUsIHRhcmdldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoImRlc2NyaXB0aW9uIikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldERlc2NyaXB0aW9uKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgYXR0cmlidXRlIFwiIiArIGtleSArICJcIiIsIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYXRvcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oInRhcmdldCBlbGVtZW50IGFwcGVhcnMgd2l0aG91dCBhIG5hbWUgYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TG9jYXRvcigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgaXMgaW4gdGhlIGN1cnJlbnQgYnVpbGQgZmlsZQorICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q3VycmVudFRhcmdldHMoKS5nZXQobmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRHVwbGljYXRlIHRhcmdldCAnIiArIG5hbWUgKyAiJyIsIHRhcmdldC5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhhc2h0YWJsZSBwcm9qZWN0VGFyZ2V0cyA9IHByb2plY3QuZ2V0VGFyZ2V0cygpOworICAgICAgICAgICAgYm9vbGVhbiAgIHVzZWRUYXJnZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lIGhhcyBub3QgYWxyZWFkeSBiZWVuIGRlZmluZWQgZGVmaW5lIGl0CisgICAgICAgICAgICBpZiAocHJvamVjdFRhcmdldHMuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBwcm9qZWN0LmxvZygiQWxyZWFkeSBkZWZpbmVkIGluIG1haW4gb3IgYSBwcmV2aW91cyBpbXBvcnQsIGlnbm9yZSAiICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEN1cnJlbnRUYXJnZXRzKCkucHV0KG5hbWUsIHRhcmdldCk7CisgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRPclJlcGxhY2VUYXJnZXQobmFtZSwgdGFyZ2V0KTsKKyAgICAgICAgICAgICAgICB1c2VkVGFyZ2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZXBlbmRzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZXBlbmRzKGRlcGVuZHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbnRleHQuaXNJZ25vcmluZ1Byb2plY3RUYWcoKSAmJiBjb250ZXh0LmdldEN1cnJlbnRQcm9qZWN0TmFtZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgY29udGV4dC5nZXRDdXJyZW50UHJvamVjdE5hbWUoKS5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSW4gYW4gaW1wb3JlZCBmaWxlIChhbmQgbm90IGNvbXBsZXRlbHkKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmluZyB0aGUgcHJvamVjdCB0YWcpCisgICAgICAgICAgICAgICAgU3RyaW5nIG5ld05hbWUgPSBjb250ZXh0LmdldEN1cnJlbnRQcm9qZWN0TmFtZSgpICsgIi4iICsgbmFtZTsKKyAgICAgICAgICAgICAgICBUYXJnZXQgbmV3VGFyZ2V0ID0gdXNlZFRhcmdldCA/IG5ldyBUYXJnZXQodGFyZ2V0KSA6IHRhcmdldDsKKyAgICAgICAgICAgICAgICBuZXdUYXJnZXQuc2V0TmFtZShuZXdOYW1lKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEN1cnJlbnRUYXJnZXRzKCkucHV0KG5ld05hbWUsIG5ld1RhcmdldCk7CisgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRPclJlcGxhY2VUYXJnZXQobmV3TmFtZSwgbmV3VGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50IHdpdGhpbiBhIHRhcmdldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gcW5hbWUgVGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGlzIGVsZW1lbnQuCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dC4KKyAgICAgICAgICogQHJldHVybiBhbiBlbGVtZW50IGhhbmRsZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gaW5pdGlhbGlzaW5nCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIGhhbmRsZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBbnRIYW5kbGVyIG9uU3RhcnRDaGlsZChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXIyLmVsZW1lbnRIYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSB0aGUgZW5kIG9mIHRoZSBwcm9qZWN0LCBzZXRzIHRoZSBjdXJyZW50IHRhcmdldCBvZiB0aGUKKyAgICAgICAgICogY29udGV4dCB0byBiZSB0aGUgaW1wbGljaXQgdGFyZ2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gdGFnIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyB0YWcsIEFudFhNTENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50VGFyZ2V0KGNvbnRleHQuZ2V0SW1wbGljaXRUYXJnZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGZvciBhbGwgcHJvamVjdCBlbGVtZW50cyAoIHRhc2tzLCBkYXRhIHR5cGVzICkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVsZW1lbnRIYW5kbGVyIGV4dGVuZHMgQW50SGFuZGxlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVsZW1lbnRIYW5kbGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpc2F0aW9uIHJvdXRpbmUgY2FsbGVkIGFmdGVyIGhhbmRsZXIgY3JlYXRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGVzLiBUaGlzIGNvbmZpZ3VyZXMKKyAgICAgICAgICogdGhlIGVsZW1lbnQgd2l0aCBpdHMgYXR0cmlidXRlcyBhbmQgc2V0cyBpdCB1cCB3aXRoCisgICAgICAgICAqIGl0cyBwYXJlbnQgY29udGFpbmVyIChpZiBhbnkpLiBOZXN0ZWQgZWxlbWVudHMgYXJlIHRoZW4KKyAgICAgICAgICogYWRkZWQgbGF0ZXIgYXMgdGhlIHBhcnNlciBlbmNvdW50ZXJzIHRoZW0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIG5hbWVzcGFjZSBVUkkgZm9yIHRoaXMgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIHRhZyBOYW1lIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzIGhhbmRsZXIKKyAgICAgICAgICogICAgICAgICAgICB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIHFuYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCB3aGljaCBjYXVzZWQgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgaGFuZGxlciB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVycm9yIChub3QgdGhyb3duIGluCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyB0YWcsIFN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZSBwYXJlbnRXcmFwcGVyID0gY29udGV4dC5jdXJyZW50V3JhcHBlcigpOworICAgICAgICAgICAgT2JqZWN0IHBhcmVudCA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChwYXJlbnRXcmFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRXcmFwcGVyLmdldFByb3h5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFVua25vd25FbGVtZW50IGlzIHVzZWQgZm9yIHRhc2tzIGFuZCBkYXRhIHR5cGVzIC0gd2l0aAorICAgICAgICAgICAgICAgZGVsYXllZCBldmFsICovCisgICAgICAgICAgICBVbmtub3duRWxlbWVudCB0YXNrID0gbmV3IFVua25vd25FbGVtZW50KHRhZyk7CisgICAgICAgICAgICB0YXNrLnNldFByb2plY3QoY29udGV4dC5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgdGFzay5zZXROYW1lc3BhY2UodXJpKTsKKyAgICAgICAgICAgIHRhc2suc2V0UU5hbWUocW5hbWUpOworICAgICAgICAgICAgdGFzay5zZXRUYXNrVHlwZShQcm9qZWN0SGVscGVyLmdlbkNvbXBvbmVudE5hbWUodGFzay5nZXROYW1lc3BhY2UoKSwgdGFnKSk7CisgICAgICAgICAgICB0YXNrLnNldFRhc2tOYW1lKHFuYW1lKTsKKworICAgICAgICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oY29udGV4dC5nZXRMb2NhdG9yKCkuZ2V0U3lzdGVtSWQoKSwgY29udGV4dAorICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYXRvcigpLmdldExpbmVOdW1iZXIoKSwgY29udGV4dC5nZXRMb2NhdG9yKCkuZ2V0Q29sdW1uTnVtYmVyKCkpOworICAgICAgICAgICAgdGFzay5zZXRMb2NhdGlvbihsb2NhdGlvbik7CisgICAgICAgICAgICB0YXNrLnNldE93bmluZ1RhcmdldChjb250ZXh0LmdldEN1cnJlbnRUYXJnZXQoKSk7CisKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIE5lc3RlZCBlbGVtZW50CisgICAgICAgICAgICAgICAgKChVbmtub3duRWxlbWVudCkgcGFyZW50KS5hZGRDaGlsZCh0YXNrKTsKKyAgICAgICAgICAgIH0gIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRhc2sgaW5jbHVkZWQgaW4gYSB0YXJnZXQgKCBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgb25lICkuCisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRDdXJyZW50VGFyZ2V0KCkuYWRkVGFzayh0YXNrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5jb25maWd1cmVJZCh0YXNrLCBhdHRycyk7CisKKyAgICAgICAgICAgIC8vIGNvbnRhaW5lci5hZGRUYXNrKHRhc2spOworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5vcCBpbiBVRTogdGFzay5pbml0KCk7CisKKyAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgd3JhcHBlciA9IG5ldyBSdW50aW1lQ29uZmlndXJhYmxlKHRhc2ssIHRhc2suZ2V0VGFza05hbWUoKSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cnMuZ2V0TG9jYWxOYW1lKGkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyVXJpID0gYXR0cnMuZ2V0VVJJKGkpOworICAgICAgICAgICAgICAgIGlmIChhdHRyVXJpICE9IG51bGwgJiYgIWF0dHJVcmkuZXF1YWxzKCIiKSAmJiAhYXR0clVyaS5lcXVhbHModXJpKSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXR0clVyaSArICI6IiArIGF0dHJzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKKyAgICAgICAgICAgICAgICAvLyBQUjogSGFjayBmb3IgYW50LXR5cGUgdmFsdWUKKyAgICAgICAgICAgICAgICAvLyAgYW4gYW50LXR5cGUgaXMgYSBjb21wb25lbnQgbmFtZSB3aGljaCBjYW4KKyAgICAgICAgICAgICAgICAvLyBiZSBuYW1lc3BhY2VkLCBuZWVkIHRvIGV4dHJhY3QgdGhlIG5hbWUKKyAgICAgICAgICAgICAgICAvLyBhbmQgY29udmVydCBmcm9tIHF1YWxpZmllZCBuYW1lIHRvIHVyaS9uYW1lCisgICAgICAgICAgICAgICAgaWYgKEFOVF9UWVBFLmVxdWFscyhuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKEFOVF9DT1JFX1VSSS5lcXVhbHMoYXR0clVyaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBBTlRfVFlQRS5lcXVhbHMoYXR0cnMuZ2V0TG9jYWxOYW1lKGkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IEFOVF9UWVBFOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB2YWx1ZS5pbmRleE9mKCI6Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtYXBwZWRVcmkgPSBjb250ZXh0LmdldFByZWZpeE1hcHBpbmcocHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRVcmkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgWE1MIE5TIHByZWZpeCBcIiIgKyBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFByb2plY3RIZWxwZXIuZ2VuQ29tcG9uZW50TmFtZShtYXBwZWRVcmksIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoaW5kZXggKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JhcHBlci5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmVudFdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhcmVudFdyYXBwZXIuYWRkQ2hpbGQod3JhcHBlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZXh0LnB1c2hXcmFwcGVyKHdyYXBwZXIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgdGV4dCB0byB0aGUgdGFzaywgdXNpbmcgdGhlIHdyYXBwZXIKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ1ZiBBIGNoYXJhY3RlciBhcnJheSBvZiB0aGUgdGV4dCB3aXRoaW4gdGhlIGVsZW1lbnQuCisgICAgICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgICAgICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IHN1cHBvcnQgdGV4dAorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIFByb2plY3RIZWxwZXIjYWRkVGV4dChQcm9qZWN0LGphdmEubGFuZy5PYmplY3QsY2hhcltdLGludCxpbnQpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhNTENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgd3JhcHBlciA9IGNvbnRleHQuY3VycmVudFdyYXBwZXIoKTsKKyAgICAgICAgICAgIHdyYXBwZXIuYWRkVGV4dChidWYsIHN0YXJ0LCBjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCB3aXRoaW4gYSB0YXJnZXQuIFRhc2sgY29udGFpbmVycworICAgICAgICAgKiB3aWxsIGFsd2F5cyB1c2UgYW5vdGhlciB0YXNrIGhhbmRsZXIsIGFuZCBhbGwgb3RoZXIgdGFza3MKKyAgICAgICAgICogd2lsbCBhbHdheXMgdXNlIGEgbmVzdGVkIGVsZW1lbnQgaGFuZGxlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhpcyBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gdGFnIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBxbmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoaXMgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBoYW5kbGVyIGZvciBlbGVtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiBpbml0aWFsaXNpbmcKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgY2hpbGQgaGFuZGxlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFudEhhbmRsZXIgb25TdGFydENoaWxkKFN0cmluZyB1cmksIFN0cmluZyB0YWcsIFN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhNTENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBQcm9qZWN0SGVscGVyMi5lbGVtZW50SGFuZGxlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuIFRoaXMgcG9wcyB0aGUgd3JhcHBlciBmcm9tCisgICAgICAgICAqIHRoZSBjb250ZXh0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBuYW1lc3BhY2UgVVJJIGZvciB0aGUgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgdGFnLCBBbnRYTUxDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucG9wV3JhcHBlcigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1Byb2plY3RIZWxwZXJJbXBsLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvUHJvamVjdEhlbHBlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzJmMDhlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1Byb2plY3RIZWxwZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxMDI1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkludHJvc3BlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTG9jYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlJ1bnRpbWVDb25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVHlwZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFza0NvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Vbmtub3duRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkpBWFBVdGlsczsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5IYW5kbGVyQmFzZTsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTFJlYWRlckFkYXB0ZXI7CisKKy8qKgorICogT3JpZ2luYWwgaGVscGVyLgorICoKKyAqLworcHVibGljIGNsYXNzIFByb2plY3RIZWxwZXJJbXBsIGV4dGVuZHMgUHJvamVjdEhlbHBlciB7CisKKyAgICAvKioKKyAgICAgKiBoZWxwZXIgZm9yIHBhdGggLT4gVVJJIGFuZCBVUkkgLT4gcGF0aCBjb252ZXJzaW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIFNBWCAxIHN0eWxlIHBhcnNlciB1c2VkIHRvIHBhcnNlIHRoZSBnaXZlbiBmaWxlLiBUaGlzIG1heQorICAgICAqIGluIGZhY3QgYmUgYSBTQVggMiBYTUxSZWFkZXIgd3JhcHBlZCBpbiBhbiBYTUxSZWFkZXJBZGFwdGVyLgorICAgICAqLworICAgIHByaXZhdGUgb3JnLnhtbC5zYXguUGFyc2VyIHBhcnNlcjsKKworICAgIC8qKiBUaGUgcHJvamVjdCB0byBjb25maWd1cmUuICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBwYXJzZS4gKi8KKyAgICBwcml2YXRlIEZpbGUgYnVpbGRGaWxlOworCisgICAgLyoqCisgICAgICogUGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgYnVpbGQgZmlsZS4gVXNlZCBmb3IgcmVzb2x2aW5nIGVudGl0aWVzCisgICAgICogYW5kIHNldHRpbmcgdGhlIHByb2plY3QncyBiYXNlIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgYnVpbGRGaWxlUGFyZW50OworCisgICAgLyoqCisgICAgICogTG9jYXRvciBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIuCisgICAgICogVXNlZCBmb3IgZ2l2aW5nIGxvY2F0aW9ucyBvZiBlcnJvcnMgZXRjLgorICAgICAqLworICAgIHByaXZhdGUgTG9jYXRvciBsb2NhdG9yOworCisgICAgLyoqCisgICAgICogVGFyZ2V0IHRoYXQgYWxsIG90aGVyIHRhcmdldHMgd2lsbCBkZXBlbmQgdXBvbiBpbXBsaWNpdGx5LgorICAgICAqCisgICAgICogPHA+VGhpcyBob2xkcyBhbGwgdGFza3MgYW5kIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGhhdmUKKyAgICAgKiBiZWVuIHBsYWNlZCBvdXRzaWRlIG9mIHRhcmdldHMuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgVGFyZ2V0IGltcGxpY2l0VGFyZ2V0ID0gbmV3IFRhcmdldCgpOworCisgICAgLyoqCisgICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBQcm9qZWN0SGVscGVySW1wbCgpIHsKKyAgICAgICAgaW1wbGljaXRUYXJnZXQuc2V0TmFtZSgiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBwcm9qZWN0IGZpbGUsIGNvbmZpZ3VyaW5nIHRoZSBwcm9qZWN0IGFzIGl0IGdvZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIGZyb20gd2hpY2ggdGhlIHByb2plY3QgaXMgcmVhZC4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQgb3IgY2Fubm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBiZSByZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlKFByb2plY3QgcHJvamVjdCwgT2JqZWN0IHNvdXJjZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgRmlsZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBGaWxlIHNvdXJjZSBzdXBwb3J0ZWQgYnkgIgorICAgICAgICAgICAgICAgICsgImRlZmF1bHQgcGx1Z2luIik7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBiRmlsZSA9IChGaWxlKSBzb3VyY2U7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbnVsbDsKKworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgICAgICB0aGlzLmJ1aWxkRmlsZSA9IG5ldyBGaWxlKGJGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgYnVpbGRGaWxlUGFyZW50ID0gbmV3IEZpbGUodGhpcy5idWlsZEZpbGUuZ2V0UGFyZW50KCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBhcnNlciA9IEpBWFBVdGlscy5nZXRQYXJzZXIoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBuZXcgWE1MUmVhZGVyQWRhcHRlcihKQVhQVXRpbHMuZ2V0WE1MUmVhZGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHVyaSA9IEZJTEVfVVRJTFMudG9VUkkoYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGJGaWxlKTsKKyAgICAgICAgICAgIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgIGlucHV0U291cmNlLnNldFN5c3RlbUlkKHVyaSk7CisgICAgICAgICAgICBwcm9qZWN0LmxvZygicGFyc2luZyBidWlsZGZpbGUgIiArIGJGaWxlICsgIiB3aXRoIFVSSSA9ICIgKyB1cmksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgSGFuZGxlckJhc2UgaGIgPSBuZXcgUm9vdEhhbmRsZXIodGhpcyk7CisgICAgICAgICAgICBwYXJzZXIuc2V0RG9jdW1lbnRIYW5kbGVyKGhiKTsKKyAgICAgICAgICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihoYik7CisgICAgICAgICAgICBwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKGhiKTsKKyAgICAgICAgICAgIHBhcnNlci5zZXREVERIYW5kbGVyKGhiKTsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oZXhjLmdldFN5c3RlbUlkKCksIGV4Yy5nZXRMaW5lTnVtYmVyKCksIGV4YworICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uTnVtYmVyKCkpOworCisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGV4Yy5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBCdWlsZEV4Y2VwdGlvbiBiZSA9IChCdWlsZEV4Y2VwdGlvbikgdDsKKyAgICAgICAgICAgICAgICBpZiAoYmUuZ2V0TG9jYXRpb24oKSA9PSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGJlLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgYmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXhjLmdldE1lc3NhZ2UoKSwgdCwgbG9jYXRpb24pOworICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGV4Yy5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoQnVpbGRFeGNlcHRpb24pIHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXhjLmdldE1lc3NhZ2UoKSwgdCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGMpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFbmNvZGluZyBvZiBwcm9qZWN0IGZpbGUgaXMgaW52YWxpZC4iLCBleGMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyBwcm9qZWN0IGZpbGU6ICIgKyBleGMuZ2V0TWVzc2FnZSgpLCBleGMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGlucHV0U3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjb21tb24gc3VwZXJjbGFzcyBmb3IgYWxsIFNBWCBldmVudCBoYW5kbGVycyB1c2VkIHRvIHBhcnNlCisgICAgICogdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gRWFjaCBtZXRob2QganVzdCB0aHJvd3MgYW4gZXhjZXB0aW9uLAorICAgICAqIHNvIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHdoYXQgdGhleSBjYW4gaGFuZGxlLgorICAgICAqCisgICAgICogRWFjaCB0eXBlIG9mIFhNTCBlbGVtZW50ICh0YXNrLCB0YXJnZXQsIGV0Yy4pIGluIEFudCBoYXMKKyAgICAgKiBhIHNwZWNpZmljIHN1YmNsYXNzLgorICAgICAqCisgICAgICogSW4gdGhlIGNvbnN0cnVjdG9yLCB0aGlzIGNsYXNzIHRha2VzIG92ZXIgdGhlIGhhbmRsaW5nIG9mIFNBWAorICAgICAqIGV2ZW50cyBmcm9tIHRoZSBwYXJlbnQgaGFuZGxlciBhbmQgcmV0dXJucworICAgICAqIGNvbnRyb2wgYmFjayB0byB0aGUgcGFyZW50IGluIHRoZSBlbmRFbGVtZW50IG1ldGhvZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgQWJzdHJhY3RIYW5kbGVyIGV4dGVuZHMgSGFuZGxlckJhc2UgeworICAgICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcmV2aW91cyBoYW5kbGVyIGZvciB0aGUgZG9jdW1lbnQuCisgICAgICAgICAqIFdoZW4gdGhlIG5leHQgZWxlbWVudCBpcyBmaW5pc2hlZCwgY29udHJvbCByZXR1cm5zCisgICAgICAgICAqIHRvIHRoaXMgaGFuZGxlci4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBEb2N1bWVudEhhbmRsZXIgcGFyZW50SGFuZGxlcjsKKworICAgICAgICAvKiogSGVscGVyIGltcGwuIFdpdGggbm9uLXN0YXRpYyBpbnRlcm5hbCBjbGFzc2VzLCB0aGUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZQorICAgICAgICAgICAgdGhpcyBhdXRvbWF0aWNhbGx5IC0gYnV0IHRoaXMgd2lsbCBmYWlsIHdpdGggc29tZSBjb21waWxlcnMgKCByZXBvcnRpbmcKKyAgICAgICAgICAgICJFeHBlY3RpbmcgdG8gZmluZCBvYmplY3QvYXJyYXkgb24gc3RhY2siICkuIElmIHdlIHBhc3MgaXQKKyAgICAgICAgICAgIGV4cGxpY2l0bHkgaXQnbGwgd29yayB3aXRoIG1vcmUgY29tcGlsZXJzLgorICAgICAgICAqLworICAgICAgICBQcm9qZWN0SGVscGVySW1wbCBoZWxwZXJJbXBsOworICAgICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgaGFuZGxlciBhbmQgc2V0cyB0aGUgcGFyc2VyIHRvIHVzZSBpdAorICAgICAgICAgKiBmb3IgdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGhlbHBlckltcGwgdGhlIFByb2plY3RIZWxwZXJJbXBsIGluc3RhbmNlIGFzc29jaWF0ZWQKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgd2l0aCB0aGlzIGhhbmRsZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnRIYW5kbGVyIFRoZSBoYW5kbGVyIHdoaWNoIHNob3VsZCBiZSByZXN0b3JlZCB0byB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyc2VyIGF0IHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFic3RyYWN0SGFuZGxlcihQcm9qZWN0SGVscGVySW1wbCBoZWxwZXJJbXBsLCBEb2N1bWVudEhhbmRsZXIgcGFyZW50SGFuZGxlcikgeworICAgICAgICAgICAgdGhpcy5wYXJlbnRIYW5kbGVyID0gcGFyZW50SGFuZGxlcjsKKyAgICAgICAgICAgIHRoaXMuaGVscGVySW1wbCA9IGhlbHBlckltcGw7CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IGhhbmRsaW5nIFNBWCBldmVudHMKKyAgICAgICAgICAgIGhlbHBlckltcGwucGFyc2VyLnNldERvY3VtZW50SGFuZGxlcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LiBUaGlzIGJhc2UgaW1wbGVtZW50YXRpb24ganVzdAorICAgICAgICAgKiB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGFnIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiwgb3IgaW4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG9mIGVycm9yIGluIGFuIG92ZXJyaWRkZW4gdmVyc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB0YWcsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZWxlbWVudCBcIiIgKyB0YWcgKyAiXCIiLCBoZWxwZXJJbXBsLmxvY2F0b3IpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgdGV4dCB3aXRoaW4gYW4gZWxlbWVudC4gVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIGp1c3QKKyAgICAgICAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ1ZiBBIGNoYXJhY3RlciBhcnJheSBvZiB0aGUgdGV4dCB3aXRoaW4gdGhlIGVsZW1lbnQuCisgICAgICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgICAgICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZSBhcnJheS4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiwgb3IgaW4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG9mIGVycm9yIGluIGFuIG92ZXJyaWRkZW4gdmVyc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBjb3VudCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhidWYsIHN0YXJ0LCBjb3VudCkudHJpbSgpOworCisgICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGV4dCBcIiIgKyBzICsgIlwiIiwgaGVscGVySW1wbC5sb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRoZSBlbmQgb2YgYW4gZWxlbWVudC4gQW55IHJlcXVpcmVkIGNsZWFuLXVwIGlzIHBlcmZvcm1lZAorICAgICAgICAgKiBieSB0aGUgZmluaXNoZWQoKSBtZXRob2QgYW5kIHRoZW4gdGhlIG9yaWdpbmFsIGhhbmRsZXIgaXMgcmVzdG9yZWQgdG8KKyAgICAgICAgICogdGhlIHBhcnNlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgd2hpY2ggaXMgZW5kaW5nLgorICAgICAgICAgKiAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvciAobm90IHRocm93biBpbgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGltcGxlbWVudGF0aW9uKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBMZXQgcGFyZW50IHJlc3VtZSBoYW5kbGluZyBTQVggZXZlbnRzCisgICAgICAgICAgICBoZWxwZXJJbXBsLnBhcnNlci5zZXREb2N1bWVudEhhbmRsZXIocGFyZW50SGFuZGxlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGZvciB0aGUgcm9vdCBlbGVtZW50LiBJdHMgb25seSBjaGlsZCBtdXN0IGJlIHRoZSAicHJvamVjdCIgZWxlbWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgUm9vdEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyQmFzZSB7CisgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgICAgIFByb2plY3RIZWxwZXJJbXBsIGhlbHBlckltcGw7CisgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAgICAgcHVibGljIFJvb3RIYW5kbGVyKFByb2plY3RIZWxwZXJJbXBsIGhlbHBlckltcGwpIHsKKyAgICAgICAgICAgIHRoaXMuaGVscGVySW1wbCA9IGhlbHBlckltcGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb2x2ZXMgZmlsZTogVVJJcyByZWxhdGl2ZSB0byB0aGUgYnVpbGQgZmlsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBwdWJsaWMgaWRlbnRpZmllciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgICAgICogICAgICAgICAgICAgICAgIGlmIG5vbmUgaXMgYXZhaWxhYmxlLiBJZ25vcmVkIGluIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZGVudGlmaWVyIHByb3ZpZGVkIGluIHRoZSBYTUwKKyAgICAgICAgICogICAgICAgICAgICAgICAgIGRvY3VtZW50LiBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7CisKKyAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5sb2coInJlc29sdmluZyBzeXN0ZW1JZDogIiArIHN5c3RlbUlkLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgaWYgKHN5c3RlbUlkLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IEZJTEVfVVRJTFMuZnJvbVVSSShzeXN0ZW1JZCk7CisKKyAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGhlbHBlckltcGwuYnVpbGRGaWxlUGFyZW50LCBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgaGVscGVySW1wbC5wcm9qZWN0LmxvZygiV2FybmluZzogJyIgKyBzeXN0ZW1JZCArICInIGluICIgKyBoZWxwZXJJbXBsLmJ1aWxkRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgYmUgZXhwcmVzc2VkIHNpbXBseSBhcyAnIiArIHBhdGgucmVwbGFjZSgnXFwnLCAnLycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBmb3IgY29tcGxpYW5jZSB3aXRoIG90aGVyIFhNTCB0b29scyIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoRklMRV9VVElMUy50b1VSSShmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dFNvdXJjZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5lKSB7CisgICAgICAgICAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5sb2coZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgY291bGQgbm90IGJlIGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCBpZiBub3QgZmlsZSBvciBmaWxlIG5vdCBmb3VuZAorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYSBwcm9qZWN0IGVsZW1lbnQuIEEgcHJvamVjdCBoYW5kbGVyIGlzIGNyZWF0ZWQKKyAgICAgICAgICogYW5kIGluaXRpYWxpc2VkIHdpdGggdGhlIGVsZW1lbnQgbmFtZSBhbmQgYXR0cmlidXRlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlIHRhZyBnaXZlbiBpcyBub3QKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT4icHJvamVjdCI8L2NvZGU+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHRhZywgQXR0cmlidXRlTGlzdCBhdHRycykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh0YWcuZXF1YWxzKCJwcm9qZWN0IikpIHsKKyAgICAgICAgICAgICAgICBuZXcgUHJvamVjdEhhbmRsZXIoaGVscGVySW1wbCwgdGhpcykuaW5pdCh0YWcsIGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJDb25maWcgZmlsZSBpcyBub3Qgb2YgZXhwZWN0ZWQgIiArICJYTUwgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXJJbXBsLmxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGxvY2F0b3IgaW4gdGhlIHByb2plY3QgaGVscGVyIGZvciBmdXR1cmUgcmVmZXJlbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbG9jYXRvciBUaGUgbG9jYXRvciB1c2VkIGJ5IHRoZSBwYXJzZXIuCisgICAgICAgICAqICAgICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICAgICAgaGVscGVySW1wbC5sb2NhdG9yID0gbG9jYXRvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXIgZm9yIHRoZSB0b3AgbGV2ZWwgInByb2plY3QiIGVsZW1lbnQuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFByb2plY3RIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3Igd2hpY2gganVzdCBkZWxlZ2F0ZXMgdG8gdGhlIHN1cGVyY29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnRIYW5kbGVyIFRoZSBoYW5kbGVyIHdoaWNoIHNob3VsZCBiZSByZXN0b3JlZCB0byB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyc2VyIGF0IHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb2plY3RIYW5kbGVyKFByb2plY3RIZWxwZXJJbXBsIGhlbHBlckltcGwsIERvY3VtZW50SGFuZGxlciBwYXJlbnRIYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoZWxwZXJJbXBsLCBwYXJlbnRIYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXNhdGlvbiByb3V0aW5lIGNhbGxlZCBhZnRlciBoYW5kbGVyIGNyZWF0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGVsZW1lbnQgbmFtZSBhbmQgYXR0cmlidXRlcy4gVGhlIGF0dHJpYnV0ZXMgd2hpY2gKKyAgICAgICAgICogdGhpcyBoYW5kbGVyIGNhbiBkZWFsIHdpdGggYXJlOiA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+LAorICAgICAgICAgKiA8Y29kZT4ibmFtZSI8L2NvZGU+LCA8Y29kZT4iaWQiPC9jb2RlPiBhbmQgPGNvZGU+ImJhc2VkaXIiPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRhZyBOYW1lIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzIGhhbmRsZXIKKyAgICAgICAgICogICAgICAgICAgICB0byBiZSBjcmVhdGVkLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiAgICAgICAgICAgIElnbm9yZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgd2hpY2ggY2F1c2VkIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgIGhhbmRsZXIgdG8gYmUgY3JlYXRlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgYW4gdW5leHBlY3RlZCBhdHRyaWJ1dGUgaXMKKyAgICAgICAgICogICAgICAgICAgICBlbmNvdW50ZXJlZCBvciBpZiB0aGUgPGNvZGU+ImRlZmF1bHQiPC9jb2RlPiBhdHRyaWJ1dGUKKyAgICAgICAgICogICAgICAgICAgICBpcyBtaXNzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChTdHJpbmcgdGFnLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIGRlZiA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgaWQgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBudWxsOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gYXR0cnMuZ2V0TmFtZShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKKworICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKCJkZWZhdWx0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJuYW1lIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiaWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpZCA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiYmFzZWRpciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2VEaXIgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgYXR0cmlidXRlIFwiIiArIGF0dHJzLmdldE5hbWUoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiIsIGhlbHBlckltcGwubG9jYXRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVmICE9IG51bGwgJiYgIWRlZi5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgaGVscGVySW1wbC5wcm9qZWN0LnNldERlZmF1bHRUYXJnZXQoZGVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZGVmYXVsdCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5zZXROYW1lKG5hbWUpOworICAgICAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5hZGRSZWZlcmVuY2UobmFtZSwgaGVscGVySW1wbC5wcm9qZWN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoZWxwZXJJbXBsLnByb2plY3QuYWRkUmVmZXJlbmNlKGlkLCBoZWxwZXJJbXBsLnByb2plY3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaGVscGVySW1wbC5wcm9qZWN0LmdldFByb3BlcnR5KCJiYXNlZGlyIikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5zZXRCYXNlZGlyKGhlbHBlckltcGwucHJvamVjdC5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGJhc2VEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBoZWxwZXJJbXBsLnByb2plY3Quc2V0QmFzZWRpcihoZWxwZXJJbXBsLmJ1aWxkRmlsZVBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGFuIGFic29sdXRlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgaWYgKChuZXcgRmlsZShiYXNlRGlyKSkuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXJJbXBsLnByb2plY3Quc2V0QmFzZWRpcihiYXNlRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgcmVzb2x2ZWRCYXNlRGlyID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShoZWxwZXJJbXBsLmJ1aWxkRmlsZVBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXJJbXBsLnByb2plY3Quc2V0QmFzZURpcihyZXNvbHZlZEJhc2VEaXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoZWxwZXJJbXBsLnByb2plY3QuYWRkVGFyZ2V0KCIiLCBoZWxwZXJJbXBsLmltcGxpY2l0VGFyZ2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhIHRvcC1sZXZlbCBlbGVtZW50IHdpdGhpbiB0aGUgcHJvamVjdC4gQW4KKyAgICAgICAgICogYXBwcm9wcmlhdGUgaGFuZGxlciBpcyBjcmVhdGVkIGFuZCBpbml0aWFsaXNlZCB3aXRoIHRoZSBkZXRhaWxzCisgICAgICAgICAqIG9mIHRoZSBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlIHRhZyBnaXZlbiBpcyBub3QKKyAgICAgICAgICogICAgICAgICAgICA8Y29kZT4idGFza2RlZiI8L2NvZGU+LCA8Y29kZT4idHlwZWRlZiI8L2NvZGU+LAorICAgICAgICAgKiAgICAgICAgICAgIDxjb2RlPiJwcm9wZXJ0eSI8L2NvZGU+LCA8Y29kZT4idGFyZ2V0IjwvY29kZT4KKyAgICAgICAgICogICAgICAgICAgICBvciBhIGRhdGEgdHlwZSBkZWZpbml0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInRhcmdldCIpKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlVGFyZ2V0KG5hbWUsIGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRWxlbWVudChoZWxwZXJJbXBsLCB0aGlzLCBoZWxwZXJJbXBsLmltcGxpY2l0VGFyZ2V0LCBuYW1lLCBhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRhcmdldCBkZWZpbml0aW9uIGVsZW1lbnQgYnkgY3JlYXRpbmcgYSB0YXJnZXQgaGFuZGxlcgorICAgICAgICAgKiBhbmQgaW5pdGlhbGlzaW5nIGlzIHdpdGggdGhlIGRldGFpbHMgb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0YWcgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gYmUgaGFuZGxlZC4KKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgdG8gYmUgaGFuZGxlZC4KKyAgICAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBpbml0aWFsaXNpbmcKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaGFuZGxlcgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRhcmdldChTdHJpbmcgdGFnLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgbmV3IFRhcmdldEhhbmRsZXIoaGVscGVySW1wbCwgdGhpcykuaW5pdCh0YWcsIGF0dHJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXIgZm9yICJ0YXJnZXQiIGVsZW1lbnRzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBUYXJnZXRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBUYXJnZXQgdGFyZ2V0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciB3aGljaCBqdXN0IGRlbGVnYXRlcyB0byB0aGUgc3VwZXJjb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgd2hpY2ggc2hvdWxkIGJlIHJlc3RvcmVkIHRvIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIgYXQgdGhlIGVuZCBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVGFyZ2V0SGFuZGxlcihQcm9qZWN0SGVscGVySW1wbCBoZWxwZXJJbXBsLCBEb2N1bWVudEhhbmRsZXIgcGFyZW50SGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoaGVscGVySW1wbCwgcGFyZW50SGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGlzYXRpb24gcm91dGluZSBjYWxsZWQgYWZ0ZXIgaGFuZGxlciBjcmVhdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBlbGVtZW50IG5hbWUgYW5kIGF0dHJpYnV0ZXMuIFRoZSBhdHRyaWJ1dGVzIHdoaWNoCisgICAgICAgICAqIHRoaXMgaGFuZGxlciBjYW4gZGVhbCB3aXRoIGFyZTogPGNvZGU+Im5hbWUiPC9jb2RlPiwKKyAgICAgICAgICogPGNvZGU+ImRlcGVuZHMiPC9jb2RlPiwgPGNvZGU+ImlmIjwvY29kZT4sCisgICAgICAgICAqIDxjb2RlPiJ1bmxlc3MiPC9jb2RlPiwgPGNvZGU+ImlkIjwvY29kZT4gYW5kCisgICAgICAgICAqIDxjb2RlPiJkZXNjcmlwdGlvbiI8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGFnIE5hbWUgb2YgdGhlIGVsZW1lbnQgd2hpY2ggY2F1c2VkIHRoaXMgaGFuZGxlcgorICAgICAgICAgKiAgICAgICAgICAgIHRvIGJlIGNyZWF0ZWQuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqICAgICAgICAgICAgSWdub3JlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCB3aGljaCBjYXVzZWQgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgaGFuZGxlciB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiBhbiB1bmV4cGVjdGVkIGF0dHJpYnV0ZSBpcyBlbmNvdW50ZXJlZAorICAgICAgICAgKiAgICAgICAgICAgIG9yIGlmIHRoZSA8Y29kZT4ibmFtZSI8L2NvZGU+IGF0dHJpYnV0ZSBpcyBtaXNzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChTdHJpbmcgdGFnLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGRlcGVuZHMgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyBpZkNvbmQgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHVubGVzc0NvbmQgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBhdHRycy5nZXROYW1lKGkpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpOworCisgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoIm5hbWUiKSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibmFtZSBhdHRyaWJ1dGUgbXVzdCBub3QiICsgIiBiZSBlbXB0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhdGlvbihoZWxwZXJJbXBsLmxvY2F0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiZGVwZW5kcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoImlmIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWZDb25kID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJ1bmxlc3MiKSkgeworICAgICAgICAgICAgICAgICAgICB1bmxlc3NDb25kID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJpZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJkZXNjcmlwdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGF0dHJpYnV0ZSBcIiIgKyBrZXkgKyAiXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlckltcGwubG9jYXRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJ0YXJnZXQgZWxlbWVudCBhcHBlYXJzIHdpdGhvdXQgYSBuYW1lIGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXJJbXBsLmxvY2F0b3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YXJnZXQgPSBuZXcgVGFyZ2V0KCk7CisKKyAgICAgICAgICAgIC8vIGltcGxpY2l0IHRhcmdldCBtdXN0IGJlIGZpcnN0IG9uIGRlcGVuZGVuY3kgbGlzdAorICAgICAgICAgICAgdGFyZ2V0LmFkZERlcGVuZGVuY3koIiIpOworCisgICAgICAgICAgICB0YXJnZXQuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIHRhcmdldC5zZXRJZihpZkNvbmQpOworICAgICAgICAgICAgdGFyZ2V0LnNldFVubGVzcyh1bmxlc3NDb25kKTsKKyAgICAgICAgICAgIHRhcmdldC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisgICAgICAgICAgICBoZWxwZXJJbXBsLnByb2plY3QuYWRkVGFyZ2V0KG5hbWUsIHRhcmdldCk7CisKKyAgICAgICAgICAgIGlmIChpZCAhPSBudWxsICYmICFpZC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgaGVscGVySW1wbC5wcm9qZWN0LmFkZFJlZmVyZW5jZShpZCwgdGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIGRlcGVuZGVuY2llcworCisgICAgICAgICAgICBpZiAoZGVwZW5kcy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVwZW5kcyhkZXBlbmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50IHdpdGhpbiBhIHRhcmdldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGluaXRpYWxpc2luZworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBjaGlsZCBoYW5kbGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBoYW5kbGVFbGVtZW50KGhlbHBlckltcGwsIHRoaXMsIHRhcmdldCwgbmFtZSwgYXR0cnMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBuZXcgRGF0YVR5cGVIYW5kbGVyIGlmIGVsZW1lbnQgaXMga25vd24gdG8gYmUgYQorICAgICAqIGRhdGEtdHlwZSBhbmQgYSBUYXNrSGFuZGxlciBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiA8cD5GYWN0b3JlZCBvdXQgb2YgVGFyZ2V0SGFuZGxlci48L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlRWxlbWVudChQcm9qZWN0SGVscGVySW1wbCBoZWxwZXJJbXBsLCBEb2N1bWVudEhhbmRsZXIgcGFyZW50LAorICAgICAgICAgICAgVGFyZ2V0IHRhcmdldCwgU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKCJkZXNjcmlwdGlvbiIpKSB7CisgICAgICAgICAgICBuZXcgRGVzY3JpcHRpb25IYW5kbGVyKGhlbHBlckltcGwsIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySW1wbC5wcm9qZWN0LmdldERhdGFUeXBlRGVmaW5pdGlvbnMoKS5nZXQoZWxlbWVudE5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5ldyBEYXRhVHlwZUhhbmRsZXIoaGVscGVySW1wbCwgcGFyZW50LCB0YXJnZXQpLmluaXQoZWxlbWVudE5hbWUsIGF0dHJzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ldyBUYXNrSGFuZGxlcihoZWxwZXJJbXBsLCBwYXJlbnQsIHRhcmdldCwgbnVsbCwgdGFyZ2V0KS5pbml0KGVsZW1lbnROYW1lLCBhdHRycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGZvciAiZGVzY3JpcHRpb24iIGVsZW1lbnRzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBEZXNjcmlwdGlvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciB3aGljaCBqdXN0IGRlbGVnYXRlcyB0byB0aGUgc3VwZXJjb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgd2hpY2ggc2hvdWxkIGJlIHJlc3RvcmVkIHRvIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIgYXQgdGhlIGVuZCBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRGVzY3JpcHRpb25IYW5kbGVyKFByb2plY3RIZWxwZXJJbXBsIGhlbHBlckltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRIYW5kbGVyIHBhcmVudEhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGhlbHBlckltcGwsIHBhcmVudEhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgdGhlIHRleHQgYXMgZGVzY3JpcHRpb24gdG8gdGhlIHByb2plY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBidWYgQSBjaGFyYWN0ZXIgYXJyYXkgb2YgdGhlIHRleHQgd2l0aGluIHRoZSBlbGVtZW50LgorICAgICAgICAgKiAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgorICAgICAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50KSB7CisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcoYnVmLCBzdGFydCwgY291bnQpOworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnREZXNjcmlwdGlvbiA9IGhlbHBlckltcGwucHJvamVjdC5nZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgaWYgKGN1cnJlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGVscGVySW1wbC5wcm9qZWN0LnNldERlc2NyaXB0aW9uKHRleHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWxwZXJJbXBsLnByb2plY3Quc2V0RGVzY3JpcHRpb24oY3VycmVudERlc2NyaXB0aW9uICsgdGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXIgZm9yIGFsbCB0YXNrIGVsZW1lbnRzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBUYXNrSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisgICAgICAgIC8qKiBDb250YWluaW5nIHRhcmdldCwgaWYgYW55LiAqLworICAgICAgICBwcml2YXRlIFRhcmdldCB0YXJnZXQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnRhaW5lciBmb3IgdGhlIHRhc2ssIGlmIGFueS4gSWYgdGFyZ2V0IGlzCisgICAgICAgICAqIG5vbi08Y29kZT5udWxsPC9jb2RlPiwgdGhpcyBtdXN0IGJlIHRvby4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgVGFza0NvbnRhaW5lciBjb250YWluZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRhc2sgY3JlYXRlZCBieSB0aGlzIGhhbmRsZXIuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFRhc2sgdGFzazsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JhcHBlciBmb3IgdGhlIHBhcmVudCBlbGVtZW50LCBpZiBhbnkuIFRoZSB3cmFwcGVyIGZvciB0aGlzCisgICAgICAgICAqIGVsZW1lbnQgd2lsbCBiZSBhZGRlZCB0byB0aGlzIHdyYXBwZXIgYXMgYSBjaGlsZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgUnVudGltZUNvbmZpZ3VyYWJsZSBwYXJlbnRXcmFwcGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwcGVyIGZvciB0aGlzIGVsZW1lbnQgd2hpY2ggdGFrZXMgY2FyZSBvZiBhY3R1YWxseSBjb25maWd1cmluZworICAgICAgICAgKiB0aGUgZWxlbWVudCwgaWYgdGhpcyBlbGVtZW50IGlzIGNvbnRhaW5lZCB3aXRoaW4gYSB0YXJnZXQuCisgICAgICAgICAqIE90aGVyd2lzZSB0aGUgY29uZmlndXJhdGlvbiBpcyBwZXJmb3JtZWQgd2l0aCB0aGUgY29uZmlndXJlIG1ldGhvZC4KKyAgICAgICAgICogQHNlZSBQcm9qZWN0SGVscGVyI2NvbmZpZ3VyZShPYmplY3QsQXR0cmlidXRlTGlzdCxQcm9qZWN0KQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBSdW50aW1lQ29uZmlndXJhYmxlIHdyYXBwZXIgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgd2hpY2ggc2hvdWxkIGJlIHJlc3RvcmVkIHRvIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIgYXQgdGhlIGVuZCBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250YWluZXIgICAgIENvbnRhaW5lciBmb3IgdGhlIGVsZW1lbnQuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyZW50V3JhcHBlciBXcmFwcGVyIGZvciB0aGUgcGFyZW50IGVsZW1lbnQsIGlmIGFueS4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0ICAgICAgICBUYXJnZXQgdGhpcyBlbGVtZW50IGlzIHBhcnQgb2YuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFRhc2tIYW5kbGVyKFByb2plY3RIZWxwZXJJbXBsIGhlbHBlckltcGwsIERvY3VtZW50SGFuZGxlciBwYXJlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0NvbnRhaW5lciBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIHBhcmVudFdyYXBwZXIsIFRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgICAgIHN1cGVyKGhlbHBlckltcGwsIHBhcmVudEhhbmRsZXIpOworICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgICAgICB0aGlzLnBhcmVudFdyYXBwZXIgPSBwYXJlbnRXcmFwcGVyOworICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGlzYXRpb24gcm91dGluZSBjYWxsZWQgYWZ0ZXIgaGFuZGxlciBjcmVhdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBlbGVtZW50IG5hbWUgYW5kIGF0dHJpYnV0ZXMuIFRoaXMgY29uZmlndXJlcworICAgICAgICAgKiB0aGUgZWxlbWVudCB3aXRoIGl0cyBhdHRyaWJ1dGVzIGFuZCBzZXRzIGl0IHVwIHdpdGgKKyAgICAgICAgICogaXRzIHBhcmVudCBjb250YWluZXIgKGlmIGFueSkuIE5lc3RlZCBlbGVtZW50cyBhcmUgdGhlbgorICAgICAgICAgKiBhZGRlZCBsYXRlciBhcyB0aGUgcGFyc2VyIGVuY291bnRlcnMgdGhlbS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRhZyBOYW1lIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzIGhhbmRsZXIKKyAgICAgICAgICogICAgICAgICAgICB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgd2hpY2ggY2F1c2VkIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgIGhhbmRsZXIgdG8gYmUgY3JlYXRlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvciAobm90IHRocm93biBpbgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaW1wbGVtZW50YXRpb24pCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBpbml0KFN0cmluZyB0YWcsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRhc2sgPSBoZWxwZXJJbXBsLnByb2plY3QuY3JlYXRlVGFzayh0YWcpOworICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHN3YWxsb3cgaGVyZSwgd2lsbCBiZSB0aHJvd24gYWdhaW4gaW4KKyAgICAgICAgICAgICAgICAvLyBVbmtub3duRWxlbWVudC5tYXliZUNvbmZpZ3VyZSBpZiB0aGUgcHJvYmxlbSBwZXJzaXN0cy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0YXNrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0YXNrID0gbmV3IFVua25vd25FbGVtZW50KHRhZyk7CisgICAgICAgICAgICAgICAgdGFzay5zZXRQcm9qZWN0KGhlbHBlckltcGwucHJvamVjdCk7CisgICAgICAgICAgICAgICAgLy9YWFggdGFzay5zZXRUYXNrVHlwZSh0YWcpOworICAgICAgICAgICAgICAgIHRhc2suc2V0VGFza05hbWUodGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhc2suc2V0TG9jYXRpb24obmV3IExvY2F0aW9uKGhlbHBlckltcGwubG9jYXRvcikpOworICAgICAgICAgICAgaGVscGVySW1wbC5jb25maWd1cmVJZCh0YXNrLCBhdHRycyk7CisKKyAgICAgICAgICAgIHRhc2suc2V0T3duaW5nVGFyZ2V0KHRhcmdldCk7CisgICAgICAgICAgICBjb250YWluZXIuYWRkVGFzayh0YXNrKTsKKyAgICAgICAgICAgIHRhc2suaW5pdCgpOworICAgICAgICAgICAgd3JhcHBlciA9IHRhc2suZ2V0UnVudGltZUNvbmZpZ3VyYWJsZVdyYXBwZXIoKTsKKyAgICAgICAgICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICBpZiAocGFyZW50V3JhcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFyZW50V3JhcHBlci5hZGRDaGlsZCh3cmFwcGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIHRleHQgdG8gdGhlIHRhc2ssIHVzaW5nIHRoZSB3cmFwcGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYnVmIEEgY2hhcmFjdGVyIGFycmF5IG9mIHRoZSB0ZXh0IHdpdGhpbiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBlbGVtZW50IGluIHRoZSBhcnJheS4KKyAgICAgICAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIGZyb20gdGhlIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBjb3VudCkgeworICAgICAgICAgICAgd3JhcHBlci5hZGRUZXh0KGJ1Ziwgc3RhcnQsIGNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50IHdpdGhpbiBhIHRhcmdldC4gVGFzayBjb250YWluZXJzCisgICAgICAgICAqIHdpbGwgYWx3YXlzIHVzZSBhbm90aGVyIHRhc2sgaGFuZGxlciwgYW5kIGFsbCBvdGhlciB0YXNrcworICAgICAgICAgKiB3aWxsIGFsd2F5cyB1c2UgYSBuZXN0ZWQgZWxlbWVudCBoYW5kbGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCBiZWluZyBzdGFydGVkLgorICAgICAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gaW5pdGlhbGlzaW5nCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIGhhbmRsZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRycykgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh0YXNrIGluc3RhbmNlb2YgVGFza0NvbnRhaW5lcikgeworICAgICAgICAgICAgICAgIC8vIHRhc2sgY2FuIGNvbnRhaW4gb3RoZXIgdGFza3MgLSBubyBvdGhlciBuZXN0ZWQgZWxlbWVudHMgcG9zc2libGUKKyAgICAgICAgICAgICAgICBuZXcgVGFza0hhbmRsZXIoaGVscGVySW1wbCwgdGhpcywgKFRhc2tDb250YWluZXIpIHRhc2ssIHdyYXBwZXIsIHRhcmdldCkuaW5pdChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXcgTmVzdGVkRWxlbWVudEhhbmRsZXIoaGVscGVySW1wbCwgdGhpcywgdGFzaywgd3JhcHBlciwgdGFyZ2V0KS5pbml0KG5hbWUsIGF0dHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXIgZm9yIGFsbCBuZXN0ZWQgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgTmVzdGVkRWxlbWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworICAgICAgICAvKiogUGFyZW50IG9iamVjdCAodGFzay9kYXRhIHR5cGUvZXRjKS4gKi8KKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgcGFyZW50OworCisgICAgICAgIC8qKiBUaGUgbmVzdGVkIGVsZW1lbnQgaXRzZWxmLiAqLworICAgICAgICBwcml2YXRlIE9iamVjdCBjaGlsZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JhcHBlciBmb3IgdGhlIHBhcmVudCBlbGVtZW50LCBpZiBhbnkuIFRoZSB3cmFwcGVyIGZvciB0aGlzCisgICAgICAgICAqIGVsZW1lbnQgd2lsbCBiZSBhZGRlZCB0byB0aGlzIHdyYXBwZXIgYXMgYSBjaGlsZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgUnVudGltZUNvbmZpZ3VyYWJsZSBwYXJlbnRXcmFwcGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwcGVyIGZvciB0aGlzIGVsZW1lbnQgd2hpY2ggdGFrZXMgY2FyZSBvZiBhY3R1YWxseSBjb25maWd1cmluZworICAgICAgICAgKiB0aGUgZWxlbWVudCwgaWYgYSBwYXJlbnQgd3JhcHBlciBpcyBwcm92aWRlZC4KKyAgICAgICAgICogT3RoZXJ3aXNlIHRoZSBjb25maWd1cmF0aW9uIGlzIHBlcmZvcm1lZCB3aXRoIHRoZSBjb25maWd1cmUgbWV0aG9kLgorICAgICAgICAgKiBAc2VlIFByb2plY3RIZWxwZXIjY29uZmlndXJlKE9iamVjdCxBdHRyaWJ1dGVMaXN0LFByb2plY3QpCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFJ1bnRpbWVDb25maWd1cmFibGUgY2hpbGRXcmFwcGVyID0gbnVsbDsKKworICAgICAgICAvKiogVGFyZ2V0IHRoaXMgZWxlbWVudCBpcyBwYXJ0IG9mLCBpZiBhbnkuICovCisgICAgICAgIHByaXZhdGUgVGFyZ2V0IHRhcmdldDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnRIYW5kbGVyIFRoZSBoYW5kbGVyIHdoaWNoIHNob3VsZCBiZSByZXN0b3JlZCB0byB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyc2VyIGF0IHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICBQYXJlbnQgb2YgdGhpcyBlbGVtZW50ICh0YXNrL2RhdGEgdHlwZS9ldGMpLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudFdyYXBwZXIgV3JhcHBlciBmb3IgdGhlIHBhcmVudCBlbGVtZW50LCBpZiBhbnkuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0ICAgICAgICBUYXJnZXQgdGhpcyBlbGVtZW50IGlzIHBhcnQgb2YuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE5lc3RlZEVsZW1lbnRIYW5kbGVyKFByb2plY3RIZWxwZXJJbXBsIGhlbHBlckltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudEhhbmRsZXIgcGFyZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIHBhcmVudFdyYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgICAgICBzdXBlcihoZWxwZXJJbXBsLCBwYXJlbnRIYW5kbGVyKTsKKworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFR5cGVBZGFwdGVyKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSAoKFR5cGVBZGFwdGVyKSBwYXJlbnQpLmdldFByb3h5KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5wYXJlbnRXcmFwcGVyID0gcGFyZW50V3JhcHBlcjsKKyAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpc2F0aW9uIHJvdXRpbmUgY2FsbGVkIGFmdGVyIGhhbmRsZXIgY3JlYXRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGVzLiBUaGlzIGNvbmZpZ3VyZXMKKyAgICAgICAgICogdGhlIGVsZW1lbnQgd2l0aCBpdHMgYXR0cmlidXRlcyBhbmQgc2V0cyBpdCB1cCB3aXRoCisgICAgICAgICAqIGl0cyBwYXJlbnQgY29udGFpbmVyIChpZiBhbnkpLiBOZXN0ZWQgZWxlbWVudHMgYXJlIHRoZW4KKyAgICAgICAgICogYWRkZWQgbGF0ZXIgYXMgdGhlIHBhcnNlciBlbmNvdW50ZXJzIHRoZW0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcm9wVHlwZSBOYW1lIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzIGhhbmRsZXIKKyAgICAgICAgICogICAgICAgICAgICB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgd2hpY2ggY2F1c2VkIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgIGhhbmRsZXIgdG8gYmUgY3JlYXRlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvciwgc3VjaCBhcyBhCisgICAgICAgICAqICAgICAgICAgICAgQnVpbGRFeGNlcHRpb24gYmVpbmcgdGhyb3duIGR1cmluZyBjb25maWd1cmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChTdHJpbmcgcHJvcFR5cGUsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBDbGFzcyBwYXJlbnRDbGFzcyA9IHBhcmVudC5nZXRDbGFzcygpOworICAgICAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKGhlbHBlckltcGwucHJvamVjdCwgcGFyZW50Q2xhc3MpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IHByb3BUeXBlLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFVua25vd25FbGVtZW50KSB7CisgICAgICAgICAgICAgICAgICAgIFVua25vd25FbGVtZW50IHVjID0gbmV3IFVua25vd25FbGVtZW50KGVsZW1lbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdWMuc2V0UHJvamVjdChoZWxwZXJJbXBsLnByb2plY3QpOworICAgICAgICAgICAgICAgICAgICAoKFVua25vd25FbGVtZW50KSBwYXJlbnQpLmFkZENoaWxkKHVjKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSB1YzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGloLmNyZWF0ZUVsZW1lbnQoaGVscGVySW1wbC5wcm9qZWN0LCBwYXJlbnQsIGVsZW1lbnROYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGVscGVySW1wbC5jb25maWd1cmVJZChjaGlsZCwgYXR0cnMpOworCisgICAgICAgICAgICAgICAgY2hpbGRXcmFwcGVyID0gbmV3IFJ1bnRpbWVDb25maWd1cmFibGUoY2hpbGQsIHByb3BUeXBlKTsKKyAgICAgICAgICAgICAgICBjaGlsZFdyYXBwZXIuc2V0QXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICAgICAgcGFyZW50V3JhcHBlci5hZGRDaGlsZChjaGlsZFdyYXBwZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKGV4Yy5nZXRNZXNzYWdlKCksIGhlbHBlckltcGwubG9jYXRvciwgZXhjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIHRleHQgdG8gdGhlIGVsZW1lbnQsIHVzaW5nIHRoZSB3cmFwcGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYnVmIEEgY2hhcmFjdGVyIGFycmF5IG9mIHRoZSB0ZXh0IHdpdGhpbiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBlbGVtZW50IGluIHRoZSBhcnJheS4KKyAgICAgICAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIGZyb20gdGhlIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gYnVmLCBpbnQgc3RhcnQsIGludCBjb3VudCkgeworICAgICAgICAgICAgY2hpbGRXcmFwcGVyLmFkZFRleHQoYnVmLCBzdGFydCwgY291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoaXMgb25lLiBUYXNrIGNvbnRhaW5lcnMKKyAgICAgICAgICogd2lsbCBhbHdheXMgdXNlIGEgdGFzayBoYW5kbGVyLCBhbmQgYWxsIG90aGVyIGVsZW1lbnRzCisgICAgICAgICAqIHdpbGwgYWx3YXlzIHVzZSBhbm90aGVyIG5lc3RlZCBlbGVtZW50IGhhbmRsZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50IGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiBpbml0aWFsaXNpbmcKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgY2hpbGQgaGFuZGxlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFza0NvbnRhaW5lcikgeworICAgICAgICAgICAgICAgIC8vIHRhc2tjb250YWluZXIgbmVzdGVkIGVsZW1lbnQgY2FuIGNvbnRhaW4gb3RoZXIgdGFza3MgLSBubyBvdGhlcgorICAgICAgICAgICAgICAgIC8vIG5lc3RlZCBlbGVtZW50cyBwb3NzaWJsZQorICAgICAgICAgICAgICAgIG5ldyBUYXNrSGFuZGxlcihoZWxwZXJJbXBsLCB0aGlzLCAoVGFza0NvbnRhaW5lcikgY2hpbGQsIGNoaWxkV3JhcHBlciwgdGFyZ2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgLmluaXQobmFtZSwgYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXcgTmVzdGVkRWxlbWVudEhhbmRsZXIoaGVscGVySW1wbCwgdGhpcywgY2hpbGQsIGNoaWxkV3JhcHBlciwgdGFyZ2V0KS5pbml0KG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIGZvciBhbGwgZGF0YSB0eXBlcyBkaXJlY3RseSBzdWJvcmRpbmF0ZSB0byBwcm9qZWN0IG9yIHRhcmdldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgRGF0YVR5cGVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKKyAgICAgICAgLyoqIFBhcmVudCB0YXJnZXQsIGlmIGFueS4gKi8KKyAgICAgICAgcHJpdmF0ZSBUYXJnZXQgdGFyZ2V0OworCisgICAgICAgIC8qKiBUaGUgZWxlbWVudCBiZWluZyBjb25maWd1cmVkLiAqLworICAgICAgICBwcml2YXRlIE9iamVjdCBlbGVtZW50OworCisgICAgICAgIC8qKiBXcmFwcGVyIGZvciB0aGlzIGVsZW1lbnQsIGlmIGl0J3MgcGFydCBvZiBhIHRhcmdldC4gKi8KKyAgICAgICAgcHJpdmF0ZSBSdW50aW1lQ29uZmlndXJhYmxlIHdyYXBwZXIgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIGEgdGFyZ2V0IHNwZWNpZmllZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgd2hpY2ggc2hvdWxkIGJlIHJlc3RvcmVkIHRvIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIgYXQgdGhlIGVuZCBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHBhcmVudCB0YXJnZXQgb2YgdGhpcyBlbGVtZW50LgorICAgICAgICAgKiAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERhdGFUeXBlSGFuZGxlcihQcm9qZWN0SGVscGVySW1wbCBoZWxwZXJJbXBsLCBEb2N1bWVudEhhbmRsZXIgcGFyZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICBUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgICAgICBzdXBlcihoZWxwZXJJbXBsLCBwYXJlbnRIYW5kbGVyKTsKKyAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpc2F0aW9uIHJvdXRpbmUgY2FsbGVkIGFmdGVyIGhhbmRsZXIgY3JlYXRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGVzLiBUaGlzIGNvbmZpZ3VyZXMKKyAgICAgICAgICogdGhlIGVsZW1lbnQgd2l0aCBpdHMgYXR0cmlidXRlcyBhbmQgc2V0cyBpdCB1cCB3aXRoCisgICAgICAgICAqIGl0cyBwYXJlbnQgY29udGFpbmVyIChpZiBhbnkpLiBOZXN0ZWQgZWxlbWVudHMgYXJlIHRoZW4KKyAgICAgICAgICogYWRkZWQgbGF0ZXIgYXMgdGhlIHBhcnNlciBlbmNvdW50ZXJzIHRoZW0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcm9wVHlwZSBOYW1lIG9mIHRoZSBlbGVtZW50IHdoaWNoIGNhdXNlZCB0aGlzIGhhbmRsZXIKKyAgICAgICAgICogICAgICAgICAgICB0byBiZSBjcmVhdGVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgd2hpY2ggY2F1c2VkIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgIGhhbmRsZXIgdG8gYmUgY3JlYXRlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvciwgc3VjaCBhcyBhCisgICAgICAgICAqICAgICAgICAgICAgQnVpbGRFeGNlcHRpb24gYmVpbmcgdGhyb3duIGR1cmluZyBjb25maWd1cmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChTdHJpbmcgcHJvcFR5cGUsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBoZWxwZXJJbXBsLnByb2plY3QuY3JlYXRlRGF0YVR5cGUocHJvcFR5cGUpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmtub3duIGRhdGEgdHlwZSAiICsgcHJvcFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cmFwcGVyID0gbmV3IFJ1bnRpbWVDb25maWd1cmFibGUoZWxlbWVudCwgcHJvcFR5cGUpOworICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZERhdGFUeXBlKHdyYXBwZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKGV4Yy5nZXRNZXNzYWdlKCksIGhlbHBlckltcGwubG9jYXRvciwgZXhjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIHRleHQgdG8gdGhlIHVzaW5nIHRoZSB3cmFwcGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYnVmIEEgY2hhcmFjdGVyIGFycmF5IG9mIHRoZSB0ZXh0IHdpdGhpbiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBlbGVtZW50IGluIHRoZSBhcnJheS4KKyAgICAgICAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byByZWFkIGZyb20gdGhlIGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIFByb2plY3RIZWxwZXIjYWRkVGV4dChQcm9qZWN0LE9iamVjdCxjaGFyW10saW50LGludCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgIHdyYXBwZXIuYWRkVGV4dChidWYsIHN0YXJ0LCBjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhpcyBvbmUuCisgICAgICAgICAqIFRoaXMgd2lsbCBhbHdheXMgdXNlIGEgbmVzdGVkIGVsZW1lbnQgaGFuZGxlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3RhcnRlZC4KKyAgICAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAZXhjZXB0aW9uIFNBWFBhcnNlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIGluaXRpYWxpc2luZworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjaGlsZCBoYW5kbGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBuZXcgTmVzdGVkRWxlbWVudEhhbmRsZXIoaGVscGVySW1wbCwgdGhpcywgZWxlbWVudCwgd3JhcHBlciwgdGFyZ2V0KS5pbml0KG5hbWUsIGF0dHJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW5zIGFuIGF0dHJpYnV0ZSBsaXN0IGZvciB0aGUgPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSBhbmQKKyAgICAgKiBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlIHRhcmdldCBvYmplY3QgaW4gdGhlIHByb2plY3QgaWYgYW4KKyAgICAgKiBpZCBpcyBmb3VuZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCB3YXMgbW92ZWQgb3V0IG9mIHRoZSBjb25maWd1cmUgbWV0aG9kIHRvIGFsbG93CisgICAgICogaXQgdG8gYmUgZXhlY3V0ZWQgYXQgcGFyc2UgdGltZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2NvbmZpZ3VyZShPYmplY3QsQXR0cmlidXRlTGlzdCxQcm9qZWN0KQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVJZChPYmplY3QgdGFyZ2V0LCBBdHRyaWJ1dGVMaXN0IGF0dHIpIHsKKyAgICAgICAgU3RyaW5nIGlkID0gYXR0ci5nZXRWYWx1ZSgiaWQiKTsKKyAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKGlkLCB0YXJnZXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1NpbmdsZUNoZWNrRXhlY3V0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9TaW5nbGVDaGVja0V4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDRjOTUwMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9TaW5nbGVDaGVja0V4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlcjsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqICJTaW5nbGUtY2hlY2siIFRhcmdldCBleGVjdXRvciBpbXBsZW1lbnRhdGlvbi4KKyAqIERpZmZlcnMgZnJvbSB7QGxpbmsgRGVmYXVsdEV4ZWN1dG9yfSBpbiB0aGF0IHRoZSBkZXBlbmRlbmNpZXMgZm9yIGFsbAorICogdGFyZ2V0cyBhcmUgY29tcHV0ZWQgdG9nZXRoZXIsIHNvIHRoYXQgc2hhcmVkIGRlcGVuZGVuY2llcyBhcmUgcnVuIGp1c3Qgb25jZS4KKyAqIEBzaW5jZSBBbnQgMS42LjMKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZUNoZWNrRXhlY3V0b3IgaW1wbGVtZW50cyBFeGVjdXRvciB7CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0cyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHRhcmdldE5hbWVzKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgcHJvamVjdC5leGVjdXRlU29ydGVkVGFyZ2V0cygKKyAgICAgICAgICAgICAgICBwcm9qZWN0LnRvcG9Tb3J0KHRhcmdldE5hbWVzLCBwcm9qZWN0LmdldFRhcmdldHMoKSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0U3ViUHJvamVjdEV4ZWN1dG9yKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0RlZmF1bHRJbnB1dEhhbmRsZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0RlZmF1bHRJbnB1dEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmJlZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvRGVmYXVsdElucHV0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBQcm9tcHRzIG9uIFN5c3RlbS5lcnIsIHJlYWRzIGlucHV0IGZyb20gU3lzdGVtLmluCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRJbnB1dEhhbmRsZXIgaW1wbGVtZW50cyBJbnB1dEhhbmRsZXIgeworCisgICAgLyoqCisgICAgICogRW1wdHkgbm8tYXJnIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIERlZmF1bHRJbnB1dEhhbmRsZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvbXB0cyBhbmQgcmVxdWVzdHMgaW5wdXQuICBNYXkgbG9vcCB1bnRpbCBhIHZhbGlkIGlucHV0IGhhcworICAgICAqIGJlZW4gZW50ZXJlZC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0byBoYW5kbGUKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG5vdCBwb3NzaWJsZSB0byByZWFkIGZyb20gY29uc29sZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUlucHV0KElucHV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcHJvbXB0ID0gZ2V0UHJvbXB0KHJlcXVlc3QpOworICAgICAgICBCdWZmZXJlZFJlYWRlciByID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocHJvbXB0KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlucHV0ID0gci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldElucHV0KGlucHV0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgaW5wdXQgZnJvbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBDb25zb2xlLiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKCFyZXF1ZXN0LmlzSW5wdXRWYWxpZCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBjbG9zZSBpbnB1dC4iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIHVzZXIgcHJvbXB0IGZyb20gYSByZXF1ZXN0LgorICAgICAqCisgICAgICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBhZGRzIChjaG9pY2UxLGNob2ljZTIsY2hvaWNlMywuLi4pIHRvIHRoZQorICAgICAqIHByb21wdCBmb3IgPGNvZGU+TXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3Q8L2NvZGU+cy48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0byBjb25zdHJ1Y3QgdGhlIHByb21wdCBmb3IuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgcHJvbXB0IHRvIGFzayB0aGUgdXNlcgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvbXB0KElucHV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIFN0cmluZyBwcm9tcHQgPSByZXF1ZXN0LmdldFByb21wdCgpOworICAgICAgICBTdHJpbmcgZGVmID0gcmVxdWVzdC5nZXREZWZhdWx0VmFsdWUoKTsKKyAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdCkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwcm9tcHQpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgKCIpOworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9CisgICAgICAgICAgICAgICAgKChNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdCkgcmVxdWVzdCkuZ2V0Q2hvaWNlcygpLmVsZW1lbnRzKCk7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0ID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmIChuZXh0LmVxdWFscyhkZWYpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmV4dCk7CisgICAgICAgICAgICAgICAgaWYgKG5leHQuZXF1YWxzKGRlZikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCddJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgaWYgKGRlZiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvbXB0ICsgIiBbIiArIGRlZiArICJdIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9tcHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCB0aGUgdXNlciBpbnB1dCBzaG91bGQgYmUgcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCB0aGUgdXNlciBpbnB1dCBzaG91bGQgYmUgcmVhZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uaW47CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0dyZWVkeUlucHV0SGFuZGxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvR3JlZWR5SW5wdXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiMGVkMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0dyZWVkeUlucHV0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuU3RyZWFtUHVtcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFByb21wdHMgb24gU3lzdGVtLmVyciwgcmVhZHMgaW5wdXQgZnJvbSBTeXN0ZW0uaW4gdW50aWwgRU9GCisgKgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEdyZWVkeUlucHV0SGFuZGxlciBleHRlbmRzIERlZmF1bHRJbnB1dEhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAyNDsKKworICAgIC8qKgorICAgICAqIEVtcHR5IG5vLWFyZyBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBHcmVlZHlJbnB1dEhhbmRsZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvbXB0cyBhbmQgcmVxdWVzdHMgaW5wdXQuCisgICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdG8gaGFuZGxlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBub3QgcG9zc2libGUgdG8gcmVhZCBmcm9tIGNvbnNvbGUsCisgICAgICogICAgICAgICBvciBpZiBpbnB1dCBpcyBpbnZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUlucHV0KElucHV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcHJvbXB0ID0gZ2V0UHJvbXB0KHJlcXVlc3QpOworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IGdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocHJvbXB0KTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIuZmx1c2goKTsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgU3RyZWFtUHVtcGVyIHAgPSBuZXcgU3RyZWFtUHVtcGVyKGluLCBiYW9zKTsKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChwKTsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgaWYgKCEocmVxdWVzdC5pc0lucHV0VmFsaWQoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBpbnZhbGlkIGNvbnNvbGUgaW5wdXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCBpbnB1dCBmcm9tIGNvbnNvbGUiLCBwLmdldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9JbnB1dEhhbmRsZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0lucHV0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTYwZmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9JbnB1dEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQ7CisKKy8qKgorICogUGx1Z2luIHRvIEFudCB0byBoYW5kbGUgcmVxdWVzdHMgZm9yIHVzZXIgaW5wdXQuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGludGVyZmFjZSBJbnB1dEhhbmRsZXIgeworCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSByZXF1ZXN0IGVuY2Fwc3VsYXRlZCBpbiB0aGUgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiA8cD5QcmVjb25kaXRpb246IHRoZSByZXF1ZXN0LmdldFByb21wdCB3aWxsIHJldHVybiBhIG5vbi1udWxsCisgICAgICogdmFsdWUuPC9wPgorICAgICAqCisgICAgICogPHA+UG9zdGNvbmRpdGlvbjogcmVxdWVzdC5nZXRJbnB1dCB3aWxsIHJldHVybiBhIG5vbi1udWxsCisgICAgICogdmFsdWUsIHJlcXVlc3QuaXNJbnB1dFZhbGlkIHdpbGwgcmV0dXJuIHRydWUuPC9wPgorICAgICAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb24gaWYgdGhlIGlucHV0IGNhbm5vdCBiZSByZWFkIGZyb20gdGhlIGNvbnNvbGUKKyAgICAgKi8KKyAgICB2b2lkIGhhbmRsZUlucHV0KElucHV0UmVxdWVzdCByZXF1ZXN0KQorICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9JbnB1dFJlcXVlc3QuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0lucHV0UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNmRkODMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9JbnB1dFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQ7CisKKy8qKgorICogRW5jYXBzdWxhdGVzIGFuIGlucHV0IHJlcXVlc3QuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIElucHV0UmVxdWVzdCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvbXB0OworICAgIHByaXZhdGUgU3RyaW5nIGlucHV0OworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBJbnB1dFJlcXVlc3QuCisgICAgICogQHBhcmFtIHByb21wdCBUaGUgcHJvbXB0IHRvIHNob3cgdG8gdGhlIHVzZXIuICBNdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFJlcXVlc3QoU3RyaW5nIHByb21wdCkgeworICAgICAgICBpZiAocHJvbXB0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb21wdCBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnByb21wdCA9IHByb21wdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHByb21wdCB0ZXh0LgorICAgICAqIEByZXR1cm4gdGhlIHByb21wdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb21wdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb21wdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB1c2VyIHByb3ZpZGVkIGlucHV0LgorICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgc3RyaW5nIHRvIGJlIHVzZWQgZm9yIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0KFN0cmluZyBpbnB1dCkgeworICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIHVzZXIgaW5wdXQgdmFsaWQ/CisgICAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB1c2VyIGlucHV0LgorICAgICAqIEByZXR1cm4gdGhlIHVzZXIgaW5wdXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbnB1dCgpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBjb25maWd1cmVkIGRlZmF1bHQgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNy4wCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBhIGRlZmF1bHQgdmFsdWUuCisgICAgICogQHBhcmFtIGQgdGhlIHZhbHVlIHRvIHNldC4KKyAgICAgKiBAc2luY2UgQW50IDEuNy4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkKSB7CisgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9NdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvTXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBlOTdhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvTXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEVuY2Fwc3VsYXRlcyBhbiBpbnB1dCByZXF1ZXN0LgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdCBleHRlbmRzIElucHV0UmVxdWVzdCB7CisgICAgcHJpdmF0ZSBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwcm9tcHQgVGhlIHByb21wdCB0byBzaG93IHRvIHRoZSB1c2VyLiAgTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gY2hvaWNlcyBob2xkcyBhbGwgaW5wdXQgdmFsdWVzIHRoYXQgYXJlIGFsbG93ZWQuCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3QoU3RyaW5nIHByb21wdCwgVmVjdG9yIGNob2ljZXMpIHsKKyAgICAgICAgc3VwZXIocHJvbXB0KTsKKyAgICAgICAgaWYgKGNob2ljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2hvaWNlcyBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jaG9pY2VzID0gY2hvaWNlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBwb3NzaWJsZSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIFZlY3RvciBnZXRDaG9pY2VzKCkgeworICAgICAgICByZXR1cm4gY2hvaWNlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGlucHV0IGlzIG9uZSBvZiB0aGUgYWxsb3dlZCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dFZhbGlkKCkgeworICAgICAgICByZXR1cm4gY2hvaWNlcy5jb250YWlucyhnZXRJbnB1dCgpKSB8fCAoIiIuZXF1YWxzKGdldElucHV0KCkpICYmIGdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L1Byb3BlcnR5RmlsZUlucHV0SGFuZGxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvUHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3OTdlYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L1Byb3BlcnR5RmlsZUlucHV0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogUmVhZHMgaW5wdXQgZnJvbSBhIHByb3BlcnR5IGZpbGUsIHRoZSBmaWxlIG5hbWUgaXMgcmVhZCBmcm9tIHRoZQorICogc3lzdGVtIHByb3BlcnR5IGFudC5pbnB1dC5wcm9wZXJ0aWVzLCB0aGUgcHJvbXB0IGlzIHRoZSBrZXkgZm9yIGlucHV0LgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eUZpbGVJbnB1dEhhbmRsZXIgaW1wbGVtZW50cyBJbnB1dEhhbmRsZXIgeworICAgIHByaXZhdGUgUHJvcGVydGllcyBwcm9wcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBzeXN0ZW0gcHJvcGVydHkgd2UgZXhwZWN0IHRvIGhvbGQgdGhlIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05BTUVfS0VZID0gImFudC5pbnB1dC5wcm9wZXJ0aWVzIjsKKworICAgIC8qKgorICAgICAqIEVtcHR5IG5vLWFyZyBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFBpY2tzIHVwIHRoZSBpbnB1dCBmcm9tIGEgcHJvcGVydHksIHVzaW5nIHRoZSBwcm9tcHQgYXMgdGhlCisgICAgICogbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHJlcXVlc3QgYW4gaW5wdXQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgbm8gcHJvcGVydHkgb2YgdGhhdCBuYW1lIGNhbiBiZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVJbnB1dChJbnB1dFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZFByb3BzKCk7CisKKyAgICAgICAgT2JqZWN0IG8gPSBwcm9wcy5nZXQocmVxdWVzdC5nZXRQcm9tcHQoKSk7CisgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgaW5wdXQgZm9yIFwnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVxdWVzdC5nZXRQcm9tcHQoKSArICJcJyIpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoby50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKCFyZXF1ZXN0LmlzSW5wdXRWYWxpZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZvdW5kIGludmFsaWQgaW5wdXQgIiArIG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIFwnIiArIHJlcXVlc3QuZ2V0UHJvbXB0KCkgKyAiXCciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBwcm9wZXJ0aWVzIGZpbGUgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiByZWFkLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVhZFByb3BzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByb3BzID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wc0ZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoRklMRV9OQU1FX0tFWSk7CisgICAgICAgICAgICBpZiAocHJvcHNGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlN5c3RlbSBwcm9wZXJ0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRklMRV9OQU1FX0tFWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIFByb3BlcnR5RmlsZUlucHV0SGFuZGxlciBub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZXQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wc0ZpbGUpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkbid0IGxvYWQgIiArIHByb3BzRmlsZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L1NlY3VyZUlucHV0SGFuZGxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvU2VjdXJlSW5wdXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkMWNmZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L1NlY3VyZUlucHV0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qDQorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqDQorICovDQorcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVmbGVjdFV0aWw7DQorDQorLyoqDQorICogUHJvbXB0cyBhbmQgcmVxdWVzdHMgaW5wdXQuICBNYXkgbG9vcCB1bnRpbCBhIHZhbGlkIGlucHV0IGhhcw0KKyAqIGJlZW4gZW50ZXJlZC4gRG9lc24ndCBlY2hvIGlucHV0IChyZXF1aXJlcyBKYXZhNikuIElmIEphdmE2IGlzIG5vdA0KKyAqIGF2YWlsYWJsZSwgZmFsbHNiYWNrIHRvIHRoZSBEZWZhdWx0SGFuZGxlciAoaW5zZWN1cmUpLg0KKyAqIEBzaW5jZSBBbnQgMS43LjENCisgKi8NCitwdWJsaWMgY2xhc3MgU2VjdXJlSW5wdXRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdElucHV0SGFuZGxlciB7DQorDQorICAgIC8qKg0KKyAgICAgKiBEZWZhdWx0IG5vLWFyZ3MgY29uc3RydWN0b3INCisgICAgICovDQorICAgIHB1YmxpYyBTZWN1cmVJbnB1dEhhbmRsZXIoKSB7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEhhbmRsZSB0aGUgaW5wdXQNCisgICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdG8gaGFuZGxlDQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgbm90IHBvc3NpYmxlIHRvIHJlYWQgZnJvbSBjb25zb2xlDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVJbnB1dChJbnB1dFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBwcm9tcHQgPSBnZXRQcm9tcHQocmVxdWVzdCk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIENsYXNzIHN5c3RlbSA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5TeXN0ZW0iKTsNCisgICAgICAgICAgICBPYmplY3QgY29uc29sZSA9IFJlZmxlY3RVdGlsLmludm9rZVN0YXRpYyhzeXN0ZW0sICJjb25zb2xlIik7DQorICAgICAgICAgICAgZG8gew0KKyAgICAgICAgICAgICAgICBjaGFyW10gaW5wdXQgPSAoY2hhcltdKSBSZWZsZWN0VXRpbC5pbnZva2UoDQorICAgICAgICAgICAgICAgICAgICBjb25zb2xlLCAicmVhZFBhc3N3b3JkIiwgU3RyaW5nLmNsYXNzLCBwcm9tcHQsDQorICAgICAgICAgICAgICAgICAgICBPYmplY3RbXS5jbGFzcywgKE9iamVjdFtdKSBudWxsKTsNCisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChuZXcgU3RyaW5nKGlucHV0KSk7DQorICAgICAgICAgICAgICAgIC8qIGZvciBzZWN1cml0eSB6ZXJvIGNoYXIgYXJyYXkgYWZ0ZXIgcmV0cmlldmluZyB2YWx1ZSAqLw0KKyAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoaW5wdXQsICcgJyk7DQorICAgICAgICAgICAgfSB3aGlsZSAoIXJlcXVlc3QuaXNJbnB1dFZhbGlkKCkpOw0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICAvKiBKYXZhNiBub3QgcHJlc2VudCB1c2UgZGVmYXVsdCBoYW5kbGVyICovDQorICAgICAgICAgICAgc3VwZXIuaGFuZGxlSW5wdXQocmVxdWVzdCk7DQorICAgICAgICB9DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0FudE1haW4uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9BbnRNYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwM2VhYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9BbnRNYWluLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBJbnRlcmZhY2UgdXNlZCB0byBicmlkZ2UgdG8gdGhlIGFjdHVhbCBNYWluIGNsYXNzIHdpdGhvdXQgYW55CisgKiBtZXNzeSByZWZsZWN0aW9uCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGludGVyZmFjZSBBbnRNYWluIHsKKyAgICAvKioKKyAgICAgKiBTdGFydCBBbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmUgYXJncworICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsVXNlclByb3BlcnRpZXMgcHJvcGVydGllcyB0byBzZXQgYmV5b25kIHRob3NlIHRoYXQKKyAgICAgKiAgICAgICAgbWF5IGJlIHNwZWNpZmllZCBvbiB0aGUgYXJncyBsaXN0CisgICAgICogQHBhcmFtIGNvcmVMb2FkZXIgLSBub3QgdXNlZAorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICB2b2lkIHN0YXJ0QW50KFN0cmluZ1tdIGFyZ3MsIFByb3BlcnRpZXMgYWRkaXRpb25hbFVzZXJQcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY29yZUxvYWRlcik7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9MYXVuY2hFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9MYXVuY2hFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWIwZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0xhdW5jaEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoOworCisvKioKKyAqIFNpZ25hbHMgYW4gZXJyb3IgY29uZGl0aW9uIGR1cmluZyBsYXVuY2hpbmcKKyAqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgTGF1bmNoRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aXZlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBMYXVuY2hFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvTGF1bmNoZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9MYXVuY2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDAzM2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvTGF1bmNoZXIuamF2YQpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2g7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisKKworLyoqCisgKiBUaGlzIGlzIGEgbGF1bmNoZXIgZm9yIEFudC4KKyAqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgTGF1bmNoZXIgeworCisgICAgLyoqCisgICAgICogVGhlIEFudCBIb21lIChpbnN0YWxsYXRpb24pIERpcmVjdG9yeSBwcm9wZXJ0eS4KKyAgICAgKiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVEhPTUVfUFJPUEVSVFkgPSAiYW50LmhvbWUiOworCisgICAgLyoqCisgICAgICogVGhlIEFudCBMaWJyYXJ5IERpcmVjdG9yeSBwcm9wZXJ0eS4KKyAgICAgKiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVExJQkRJUl9QUk9QRVJUWSA9ICJhbnQubGlicmFyeS5kaXIiOworCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yeSBuYW1lIG9mIHRoZSBwZXItdXNlciBhbnQgZGlyZWN0b3J5LgorICAgICAqIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1BSSVZBVEVESVIgPSAiLmFudCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiBhIHBlci11c2VyIGxpYnJhcnkgZGlyZWN0b3J5LgorICAgICAqIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1BSSVZBVEVMSUIgPSAibGliIjsKKworICAgIC8qKgorICAgICAqIGxhdW5jaCBkaWFnbm9zdGljcyBmbGFnOyBmb3IgZGVidWdnaW5nIHRyb3VibGUgYXQgbGF1bmNoIHRpbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxhdW5jaERpYWcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2NhdGlvbiBvZiBhIHBlci11c2VyIGxpYnJhcnkgZGlyZWN0b3J5LgorICAgICAqIDxwPgorICAgICAqIEl0J3MgdmFsdWUgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2Yge0BsaW5rICNBTlRfUFJJVkFURURJUn0KKyAgICAgKiB3aXRoIHtAbGluayAjQU5UX1BSSVZBVEVMSUJ9LCB3aXRoIGFuIGFwcHJvcHJpYXRlIGZpbGUgc2VwYXJhdG9yCisgICAgICogaW4gYmV0d2Vlbi4gRm9yIGV4YW1wbGUsIG9uIFVuaXgsIGl0J3MgPGNvZGU+LmFudC9saWI8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfTElCRElSID0KKyAgICAgICAgQU5UX1BSSVZBVEVESVIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBBTlRfUFJJVkFURUxJQjsKKworICAgIC8qKgorICAgICAqIFRoZSBzdGFydHVwIGNsYXNzIHRoYXQgaXMgdG8gYmUgcnVuLgorICAgICAqIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9DTEFTUyA9ICJvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluIjsKKworICAgIC8qKgorICAgICAqIFN5c3RlbSBwcm9wZXJ0eSB3aXRoIHVzZXIgaG9tZSBkaXJlY3RvcnkuCisgICAgICoge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0hPTUVESVIgPSAidXNlci5ob21lIjsKKworICAgIC8qKgorICAgICAqIFN5c3RlbSBwcm9wZXJ0eSB3aXRoIGFwcGxpY2F0aW9uIGNsYXNzcGF0aC4KKyAgICAgKiB7QHZhbHVlfQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0NMQVNTX1BBVEggPSAiamF2YS5jbGFzcy5wYXRoIjsKKworICAgIC8qKgorICAgICAqIEV4aXQgY29kZSBvbiB0cm91YmxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVhJVF9DT0RFX0VSUk9SID0gMjsKKworICAgIC8qKgorICAgICAqIEVudHJ5IHBvaW50IGZvciBzdGFydGluZyBjb21tYW5kIGxpbmUgQW50LgorICAgICAqCisgICAgICogQHBhcmFtICBhcmdzIGNvbW1hbmRsaW5lIGFyZ3VtZW50cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgaW50IGV4aXRDb2RlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGF1bmNoZXIgbGF1bmNoZXIgPSBuZXcgTGF1bmNoZXIoKTsKKyAgICAgICAgICAgIGV4aXRDb2RlID0gbGF1bmNoZXIucnVuKGFyZ3MpOworICAgICAgICB9IGNhdGNoIChMYXVuY2hFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhpdENvZGUgPSBFWElUX0NPREVfRVJST1I7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZXhpdENvZGUgPSBFWElUX0NPREVfRVJST1I7CisgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhpdENvZGUgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhdW5jaERpYWcpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4aXQgY29kZTogIitleGl0Q29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uZXhpdChleGl0Q29kZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIENMQVNTUEFUSCBvciAtbGliIHRvIGxpYiBwYXRoIHVybHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCAgICAgICAgdGhlIGNsYXNzcGF0aCBvciBsaWIgcGF0aCB0byBhZGQgdG8gdGhlIGxpYlBhdGhVTFJMcworICAgICAqIEBwYXJhbSBnZXRKYXJzICAgICBpZiB0cnVlIGFuZCBhIHBhdGggaXMgYSBkaXJlY3RvcnksIGFkZCB0aGUgamFycyBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgZGlyZWN0b3J5IHRvIHRoZSBwYXRoIHVybHMKKyAgICAgKiBAcGFyYW0gbGliUGF0aFVSTHMgdGhlIGxpc3Qgb2YgcGF0aHMgdG8gYWRkIHRvCisgICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgd2UgY2FuJ3QgY3JlYXRlIGEgVVJMCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFBhdGgoU3RyaW5nIHBhdGgsIGJvb2xlYW4gZ2V0SmFycywgTGlzdCBsaWJQYXRoVVJMcykKKyAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCBGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBGaWxlIGVsZW1lbnQgPSBuZXcgRmlsZShlbGVtZW50TmFtZSk7CisgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUuaW5kZXhPZignJScpICE9IC0xICYmICFlbGVtZW50LmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0SmFycyAmJiBlbGVtZW50LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYW55IGphcnMgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIFVSTFtdIGRpclVSTHMgPSBMb2NhdG9yLmdldExvY2F0aW9uVVJMcyhlbGVtZW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRpclVSTHMubGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhdW5jaERpYWcpIHsgU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgbGlicmFyeSBKQVI6ICIgKyBkaXJVUkxzW2pdKTt9CisgICAgICAgICAgICAgICAgICAgIGxpYlBhdGhVUkxzLmFkZChkaXJVUkxzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFVSTCB1cmwgPSBMb2NhdG9yLmZpbGVUb1VSTChlbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChsYXVuY2hEaWFnKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIGxpYnJhcnkgVVJMOiAiICsgdXJsKSA7fQorICAgICAgICAgICAgbGliUGF0aFVSTHMuYWRkKHVybCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIGxhdW5jaGVyIHRvIGxhdW5jaCBBbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgICAqIEByZXR1cm4gYW4gZXhpdCBjb2RlLiBBcyB0aGUgbm9ybWFsIGFudCBtYWluIGNhbGxzIGV4aXQgd2hlbiBpdCBlbmRzLAorICAgICAqICAgICAgICAgdGhpcyBpcyBmb3IgaGFuZGxpbmcgZmFpbHVyZXMgYXQgYmluZC10aW1lCisgICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIFVSTHMgcmVxdWlyZWQgZm9yIHRoZSBjbGFzc2xvYWRlcgorICAgICAqICAgICAgICAgICAgY2Fubm90IGJlIGNyZWF0ZWQuCisgICAgICogQHRocm93cyBMYXVuY2hFeGNlcHRpb24gZm9yIGxhdW5jaGluZyBwcm9ibGVtcworICAgICAqLworICAgIHByaXZhdGUgaW50IHJ1bihTdHJpbmdbXSBhcmdzKQorICAgICAgICAgICAgdGhyb3dzIExhdW5jaEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGFudEhvbWVQcm9wZXJ0eSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShBTlRIT01FX1BST1BFUlRZKTsKKyAgICAgICAgRmlsZSBhbnRIb21lID0gbnVsbDsKKworICAgICAgICBGaWxlIHNvdXJjZUphciA9IExvY2F0b3IuZ2V0Q2xhc3NTb3VyY2UoZ2V0Q2xhc3MoKSk7CisgICAgICAgIEZpbGUgamFyRGlyID0gc291cmNlSmFyLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgU3RyaW5nIG1haW5DbGFzc25hbWUgPSBNQUlOX0NMQVNTOworCisgICAgICAgIGlmIChhbnRIb21lUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgYW50SG9tZSA9IG5ldyBGaWxlKGFudEhvbWVQcm9wZXJ0eSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYW50SG9tZSA9PSBudWxsIHx8ICFhbnRIb21lLmV4aXN0cygpKSB7CisgICAgICAgICAgICBhbnRIb21lID0gamFyRGlyLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgIHNldFByb3BlcnR5KEFOVEhPTUVfUFJPUEVSVFksIGFudEhvbWUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhbnRIb21lLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTGF1bmNoRXhjZXB0aW9uKCJBbnQgaG9tZSBpcyBzZXQgaW5jb3JyZWN0bHkgb3IgIgorICAgICAgICAgICAgICAgICsgImFudCBjb3VsZCBub3QgYmUgbG9jYXRlZCAoZXN0aW1hdGVkIHZhbHVlPSIrYW50SG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSsiKSIpOworICAgICAgICB9CisKKyAgICAgICAgTGlzdCBsaWJQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgU3RyaW5nIGNwU3RyaW5nID0gbnVsbDsKKyAgICAgICAgTGlzdCBhcmdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBTdHJpbmdbXSBuZXdBcmdzOworICAgICAgICBib29sZWFuICBub1VzZXJMaWIgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiAgbm9DbGFzc1BhdGggPSBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLWxpYiIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMYXVuY2hFeGNlcHRpb24oIlRoZSAtbGliIGFyZ3VtZW50IG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmUgZm9sbG93ZWQgYnkgYSBsaWJyYXJ5IGxvY2F0aW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpYlBhdGhzLmFkZChhcmdzWysraV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWNwIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExhdW5jaEV4Y2VwdGlvbigiVGhlIC1jcCBhcmd1bWVudCBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImJlIGZvbGxvd2VkIGJ5IGEgY2xhc3NwYXRoIGV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNwU3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExhdW5jaEV4Y2VwdGlvbigiVGhlIC1jcCBhcmd1bWVudCBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdCBiZSByZXBlYXRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjcFN0cmluZyA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tbm91c2VybGliIikgfHwgYXJnc1tpXS5lcXVhbHMoIi1ub3VzZXJsaWIiKSkgeworICAgICAgICAgICAgICAgIG5vVXNlckxpYiA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWxhdW5jaGRpYWciKSkgeworICAgICAgICAgICAgICAgIGxhdW5jaERpYWcgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1ub2NsYXNzcGF0aCIpIHx8IGFyZ3NbaV0uZXF1YWxzKCItbm9jbGFzc3BhdGgiKSkgeworICAgICAgICAgICAgICAgIG5vQ2xhc3NQYXRoID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1tYWluIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExhdW5jaEV4Y2VwdGlvbigiVGhlIC1tYWluIGFyZ3VtZW50IG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlIGZvbGxvd2VkIGJ5IGEgbGlicmFyeSBsb2NhdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYWluQ2xhc3NuYW1lID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcmdMaXN0LmFkZChhcmdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxvZ1BhdGgoIkxhdW5jaGVyIEpBUiIsc291cmNlSmFyKTsKKyAgICAgICAgbG9nUGF0aCgiTGF1bmNoZXIgSkFSIGRpcmVjdG9yeSIsIHNvdXJjZUphci5nZXRQYXJlbnRGaWxlKCkpOworICAgICAgICBsb2dQYXRoKCJqYXZhLmhvbWUiLCBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpKSk7CisKKyAgICAgICAgLy9kZWNpZGUgd2hldGhlciB0byBjb3B5IHRoZSBleGlzdGluZyBhcmcgc2V0LCBvcgorICAgICAgICAvL2J1aWxkIGEgbmV3IG9uZSBmcm9tIHRoZSBsaXN0IG9mIGFsbCBhcmdzIGV4Y2x1ZGluZyB0aGUgc3BlY2lhbAorICAgICAgICAvL29wZXJhdGlvbnMgdGhhdCBvbmx5IHdlIGhhbmRsZQorICAgICAgICBpZiAoYXJnTGlzdC5zaXplKCkgPT0gYXJncy5sZW5ndGgpIHsKKyAgICAgICAgICAgIG5ld0FyZ3MgPSBhcmdzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3QXJncyA9IChTdHJpbmdbXSkgYXJnTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbYXJnTGlzdC5zaXplKCldKTsKKyAgICAgICAgfQorCisgICAgICAgIFVSTFtdIGxpYlVSTHMgICAgPSBnZXRMaWJQYXRoVVJMcygKKyAgICAgICAgICAgIG5vQ2xhc3NQYXRoID8gbnVsbCA6IGNwU3RyaW5nLCBsaWJQYXRocyk7CisgICAgICAgIFVSTFtdIHN5c3RlbVVSTHMgPSBnZXRTeXN0ZW1VUkxzKGphckRpcik7CisgICAgICAgIFVSTFtdIHVzZXJVUkxzICAgPSBub1VzZXJMaWIgPyBuZXcgVVJMWzBdIDogZ2V0VXNlclVSTHMoKTsKKworICAgICAgICBGaWxlIHRvb2xzSkFSID0gTG9jYXRvci5nZXRUb29sc0phcigpOworICAgICAgICBsb2dQYXRoKCJ0b29scy5qYXIiLHRvb2xzSkFSKTsKKyAgICAgICAgVVJMW10gamFycyA9IGdldEphckFycmF5KAorICAgICAgICAgICAgbGliVVJMcywgdXNlclVSTHMsIHN5c3RlbVVSTHMsIHRvb2xzSkFSKTsKKworICAgICAgICAvLyBub3cgdXBkYXRlIHRoZSBjbGFzcy5wYXRoIHByb3BlcnR5CisgICAgICAgIFN0cmluZ0J1ZmZlciBiYXNlQ2xhc3NQYXRoCisgICAgICAgICAgICA9IG5ldyBTdHJpbmdCdWZmZXIoU3lzdGVtLmdldFByb3BlcnR5KEpBVkFfQ0xBU1NfUEFUSCkpOworICAgICAgICBpZiAoYmFzZUNsYXNzUGF0aC5jaGFyQXQoYmFzZUNsYXNzUGF0aC5sZW5ndGgoKSAtIDEpCisgICAgICAgICAgICAgICAgPT0gRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcikgeworICAgICAgICAgICAgYmFzZUNsYXNzUGF0aC5zZXRMZW5ndGgoYmFzZUNsYXNzUGF0aC5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBiYXNlQ2xhc3NQYXRoLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICAgIGJhc2VDbGFzc1BhdGguYXBwZW5kKExvY2F0b3IuZnJvbVVSSShqYXJzW2ldLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldFByb3BlcnR5KEpBVkFfQ0xBU1NfUEFUSCwgYmFzZUNsYXNzUGF0aC50b1N0cmluZygpKTsKKworICAgICAgICBVUkxDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoamFycyk7CisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgICAgIENsYXNzIG1haW5DbGFzcyA9IG51bGw7CisgICAgICAgIGludCBleGl0Q29kZSA9IDA7CisgICAgICAgIFRocm93YWJsZSB0aHJvd249bnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1haW5DbGFzcyA9IGxvYWRlci5sb2FkQ2xhc3MobWFpbkNsYXNzbmFtZSk7CisgICAgICAgICAgICBBbnRNYWluIG1haW4gPSAoQW50TWFpbikgbWFpbkNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBtYWluLnN0YXJ0QW50KG5ld0FyZ3MsIG51bGwsIG51bGwpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCisgICAgICAgICAgICAgICAgIkluY29tcGF0aWJsZSB2ZXJzaW9uIG9mICIgKyBtYWluQ2xhc3NuYW1lICsgIiBkZXRlY3RlZCIpOworICAgICAgICAgICAgRmlsZSBtYWluSmFyID0gTG9jYXRvci5nZXRDbGFzc1NvdXJjZShtYWluQ2xhc3MpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAorICAgICAgICAgICAgICAgICJMb2NhdGlvbiBvZiB0aGlzIGNsYXNzICIgKyBtYWluSmFyKTsKKyAgICAgICAgICAgIHRocm93biA9IGV4OworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsb2NhdGUiICsgbWFpbkNsYXNzbmFtZSk7CisgICAgICAgICAgICB0aHJvd24gPSBjbmZlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgICAgICB0aHJvd249dDsKKyAgICAgICAgfQorICAgICAgICBpZih0aHJvd24hPW51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihBTlRIT01FX1BST1BFUlRZKyI6ICIrYW50SG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNsYXNzcGF0aDogIiArIGJhc2VDbGFzc1BhdGgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkxhdW5jaGVyIEpBUjogIiArIHNvdXJjZUphci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkxhdW5jaGVyIERpcmVjdG9yeTogIiArIGphckRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBleGl0Q29kZSA9IEVYSVRfQ09ERV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhpdENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIC1saWIgZW50aWVzIGFuZCAtY3AgZW50cnkgaW50bworICAgICAqIGEgVVJMIGFycmF5LgorICAgICAqIEBwYXJhbSBjcFN0cmluZyB0aGUgY2xhc3NwYXRoIHN0cmluZworICAgICAqIEBwYXJhbSBsaWJQYXRocyB0aGUgbGlzdCBvZiAtbGliIGVudHJpZXMuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBVUkxzLgorICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIHRoZSBVUkxzICBjYW5ub3QgYmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFVSTFtdIGdldExpYlBhdGhVUkxzKFN0cmluZyBjcFN0cmluZywgTGlzdCBsaWJQYXRocykKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3QgbGliUGF0aFVSTHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgaWYgKGNwU3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhdGgoY3BTdHJpbmcsIGZhbHNlLCBsaWJQYXRoVVJMcyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaWJQYXRocy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBsaWJQYXRoID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICBhZGRQYXRoKGxpYlBhdGgsIHRydWUsIGxpYlBhdGhVUkxzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAgKFVSTFtdKSBsaWJQYXRoVVJMcy50b0FycmF5KG5ldyBVUkxbbGliUGF0aFVSTHMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBqYXIgZmlsZXMgaW4gQU5UX0hPTUUvbGliLgorICAgICAqIGRldGVybWluZSBhbnQgbGlicmFyeSBkaXJlY3RvcnkgZm9yIHN5c3RlbSBqYXJzOiB1c2UgcHJvcGVydHkKKyAgICAgKiBvciBkZWZhdWx0IHVzaW5nIGxvY2F0aW9uIG9mIGFudC1sYXVuY2hlci5qYXIKKyAgICAgKiBAcGFyYW0gYW50TGF1bmNoZXJEaXIgdGhlIGRpciB0aGF0IGFudC1sYXVuY2hlciByYW4gZnJvbQorICAgICAqIEByZXR1cm4gdGhlIFVSTHMKKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiB0aGUgVVJMcyBjYW5ub3QgYmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFVSTFtdIGdldFN5c3RlbVVSTHMoRmlsZSBhbnRMYXVuY2hlckRpcikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgYW50TGliRGlyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGFudExpYkRpclByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KEFOVExJQkRJUl9QUk9QRVJUWSk7CisgICAgICAgIGlmIChhbnRMaWJEaXJQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBhbnRMaWJEaXIgPSBuZXcgRmlsZShhbnRMaWJEaXJQcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhbnRMaWJEaXIgPT0gbnVsbCkgfHwgIWFudExpYkRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgYW50TGliRGlyID0gYW50TGF1bmNoZXJEaXI7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eShBTlRMSUJESVJfUFJPUEVSVFksIGFudExpYkRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIExvY2F0b3IuZ2V0TG9jYXRpb25VUkxzKGFudExpYkRpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBqYXIgZmlsZXMgaW4gdXNlci5ob21lLy5hbnQvbGliCisgICAgICogQHJldHVybiB0aGUgVVJMUyBmcm9tIHRoZSB1c2VyJ3MgbGliIGRpcgorICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIHRoZSBVUkxzIGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgVVJMW10gZ2V0VXNlclVSTHMoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSB1c2VyTGliRGlyCisgICAgICAgICAgICA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eShVU0VSX0hPTUVESVIpLCBVU0VSX0xJQkRJUik7CisKKyAgICAgICAgcmV0dXJuIExvY2F0b3IuZ2V0TG9jYXRpb25VUkxzKHVzZXJMaWJEaXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbWJpbmUgdGhlIHZhcmlvdXMgamFyIHNvdXJjZXMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBqYXJzLgorICAgICAqIEBwYXJhbSBsaWJKYXJzIHRoZSBqYXJzIHNwZWNpZmllZCBpbiAtbGliIGNvbW1hbmQgbGluZSBvcHRpb25zCisgICAgICogQHBhcmFtIHVzZXJKYXJzIHRoZSBqYXJzIGluIH4vLmFudC9saWIKKyAgICAgKiBAcGFyYW0gc3lzdGVtSmFycyB0aGUgamFycyBpbiAkQU5UX0hPTUUvbGliCisgICAgICogQHBhcmFtIHRvb2xzSmFyICAgdGhlIHRvb2xzLmphciBmaWxlCisgICAgICogQHJldHVybiBhIGNvbWJpbmVkIGFycmF5CisgICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHByaXZhdGUgVVJMW10gZ2V0SmFyQXJyYXkgKAorICAgICAgICBVUkxbXSBsaWJKYXJzLCBVUkxbXSB1c2VySmFycywgVVJMW10gc3lzdGVtSmFycywgRmlsZSB0b29sc0phcikKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBudW1KYXJzID0gbGliSmFycy5sZW5ndGggKyB1c2VySmFycy5sZW5ndGggKyBzeXN0ZW1KYXJzLmxlbmd0aDsKKyAgICAgICAgaWYgKHRvb2xzSmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG51bUphcnMrKzsKKyAgICAgICAgfQorICAgICAgICBVUkxbXSBqYXJzID0gbmV3IFVSTFtudW1KYXJzXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShsaWJKYXJzLCAwLCBqYXJzLCAwLCBsaWJKYXJzLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodXNlckphcnMsIDAsIGphcnMsIGxpYkphcnMubGVuZ3RoLCB1c2VySmFycy5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHN5c3RlbUphcnMsIDAsIGphcnMsIHVzZXJKYXJzLmxlbmd0aCArIGxpYkphcnMubGVuZ3RoLAorICAgICAgICAgICAgc3lzdGVtSmFycy5sZW5ndGgpOworCisgICAgICAgIGlmICh0b29sc0phciAhPSBudWxsKSB7CisgICAgICAgICAgICBqYXJzW2phcnMubGVuZ3RoIC0gMV0gPSBMb2NhdG9yLmZpbGVUb1VSTCh0b29sc0phcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGphcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IGEgc3lzdGVtIHByb3BlcnR5LCBvcHRpb25hbGx5IGxvZyB3aGF0IGlzIGdvaW5nIG9uCisgICAgICogQHBhcmFtIG5hbWUgcHJvcGVydHkgbmFtZQorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmIChsYXVuY2hEaWFnKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgXCIiICsgbmFtZSArICJcIiB0byBcIiIgKyB2YWx1ZSArICJcIiIpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZ1BhdGgoU3RyaW5nIG5hbWUsRmlsZSBwYXRoKSB7CisgICAgICAgIGlmKGxhdW5jaERpYWcpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lKyI9IFwiIitwYXRoKyJcIiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0xvY2F0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9Mb2NhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwZjI1YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9Mb2NhdG9yLmphdmEKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7CitpbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8vIENoZWNrU3R5bGU6TGluZUxlbmd0aENoZWNrIE9GRiAtIHVybHMgYXJlIGxvbmchCisvKioKKyAqIFRoZSBMb2NhdG9yIGlzIGEgdXRpbGl0eSBjbGFzcyB3aGljaCBpcyB1c2VkIHRvIGZpbmQgY2VydGFpbiBpdGVtcworICogaW4gdGhlIGVudmlyb25tZW50LgorICoKKyAqIEl0IGlzIHVzZWQgYXQgYm9vdCB0aW1lIGluIHRoZSBsYXVuY2hlciwgYW5kIGNhbm5vdCBtYWtlIHVzZSBvZiBhbnkgb2YgQW50J3Mgb3RoZXIgY2xhc3Nlcy4KKyAqCisgKiBUaGlzIGlzIGEgc3VycHJpc2luZ2x5IGJyaXR0bGUgcGllY2Ugb2YgY29kZSwgYW5kIGhhcyBoYWQgbG90cyBvZiBidWdzIGZpbGVkIGFnYWluc3QgaXQuCisgKiB7QGxpbmsgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MjI3NSI+cnVubmluZyBhbnQgb2ZmIGEgbmV0d29yayBzaGFyZSBjYW4gY2F1c2UgQW50IHRvIGZhaWw8L2E+fQorICoge0BsaW5rIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9ODAzMSI+dXNlIEZpbGUudG9VUkkoKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk8L2E+fQorICoge0BsaW5rIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDIyMjIiPkxvY2F0b3IgaW1wbGVtZW50YXRpb24gbm90IGVuY29kaW5nIFVSSSBzdHJpbmdzIHByb3Blcmx5OiBzcGFjZXMgaW4gcGF0aHM8L2E+fQorICogSXQgYWxzbyBicmVha3MgRWNsaXBzZSAzLjMgQmV0YXMKKyAqIHtAbGluayA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzMjgzIj5FeGNlcHRpb24gaWYgaW5zdGFsbGF0aW9uIHBhdGggaGFzIHNwYWNlczwvYT59CisgKgorICogQmUgdmVyeSBjYXJlZnVsIHdoZW4gbWFraW5nIGNoYW5nZXMgdG8gdGhpcyBjbGFzcywgYXMgYSBicmVhayB3aWxsIHVwc2V0IGEgbG90IG9mIHBlb3BsZS4KKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KKy8vIENoZWNrU3R5bGU6TGluZUxlbmd0aENoZWNrIE9OIC0gdXJscyBhcmUgbG9uZyEKK3B1YmxpYyBmaW5hbCBjbGFzcyBMb2NhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOSUJCTEUgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOSUJCTEVfTUFTSyAgID0gMHhGOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJX1NJWkUgPSAxMjg7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQllURV9TSVpFID0gMjU2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdPUkQgPSAxNjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEFDRSA9IDB4MjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTCA9IDB4N0Y7CisKKyAgICAvKioKKyAgICAgKiBlbmNvZGluZyB1c2VkIHRvIHJlcHJlc2VudCBVUklzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0VOQ09ESU5HID0gIlVURi04IjsKKyAgICAvLyBzdG9sZW4gZnJvbSBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIjZ2V0VXNlckRpcigpCisgICAgLy8gb2YgdGhlIFhlcmNlcy1KIHRlYW0KKyAgICAvLyB3aGljaCBBU0NJSSBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZXNjYXBlZAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW5bXSBnTmVlZEVzY2FwaW5nID0gbmV3IGJvb2xlYW5bQVNDSUlfU0laRV07CisgICAgLy8gdGhlIGZpcnN0IGhleCBjaGFyYWN0ZXIgaWYgYSBjaGFyYWN0ZXIgbmVlZHMgdG8gYmUgZXNjYXBlZAorICAgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBnQWZ0ZXJFc2NhcGluZzEgPSBuZXcgY2hhcltBU0NJSV9TSVpFXTsKKyAgICAvLyB0aGUgc2Vjb25kIGhleCBjaGFyYWN0ZXIgaWYgYSBjaGFyYWN0ZXIgbmVlZHMgdG8gYmUgZXNjYXBlZAorICAgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBnQWZ0ZXJFc2NhcGluZzIgPSBuZXcgY2hhcltBU0NJSV9TSVpFXTsKKyAgICBwcml2YXRlIHN0YXRpYyBjaGFyW10gZ0hleENocyA9IHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJ307CisgICAgLyoqIEVycm9yIHN0cmluZyB1c2VkIHdoZW4gYW4gaW52YWxpZCB1cmkgaXMgc2VlbiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PVF9GSUxFX1VSSQorICAgICAgICA9ICJDYW4gb25seSBoYW5kbGUgdmFsaWQgZmlsZTogVVJJcywgbm90ICI7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBhYm92ZSAzIGFycmF5cworICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU1BBQ0U7IGkrKykgeworICAgICAgICAgICAgZ05lZWRFc2NhcGluZ1tpXSA9IHRydWU7CisgICAgICAgICAgICBnQWZ0ZXJFc2NhcGluZzFbaV0gPSBnSGV4Q2hzW2kgPj4gTklCQkxFXTsKKyAgICAgICAgICAgIGdBZnRlckVzY2FwaW5nMltpXSA9IGdIZXhDaHNbaSAmIE5JQkJMRV9NQVNLXTsKKyAgICAgICAgfQorICAgICAgICBnTmVlZEVzY2FwaW5nW0RFTF0gPSB0cnVlOworICAgICAgICBnQWZ0ZXJFc2NhcGluZzFbREVMXSA9ICc3JzsKKyAgICAgICAgZ0FmdGVyRXNjYXBpbmcyW0RFTF0gPSAnRic7CisgICAgICAgIGNoYXJbXSBlc2NDaHMgPSB7JyAnLCAnPCcsICc+JywgJyMnLCAnJScsICciJywgJ3snLCAnfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnLCAnXFwnLCAnXicsICd+JywgJ1snLCAnXScsICdgJ307CisgICAgICAgIGludCBsZW4gPSBlc2NDaHMubGVuZ3RoOworICAgICAgICBjaGFyIGNoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBjaCA9IGVzY0Noc1tpXTsKKyAgICAgICAgICAgIGdOZWVkRXNjYXBpbmdbY2hdID0gdHJ1ZTsKKyAgICAgICAgICAgIGdBZnRlckVzY2FwaW5nMVtjaF0gPSBnSGV4Q2hzW2NoID4+IE5JQkJMRV07CisgICAgICAgICAgICBnQWZ0ZXJFc2NhcGluZzJbY2hdID0gZ0hleENoc1tjaCAmIE5JQkJMRV9NQVNLXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBOb3QgaW5zdGFudGlhYmxlCisgICAgICovCisgICAgcHJpdmF0ZSBMb2NhdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGRpcmVjdG9yeSBvciBqYXIgZmlsZSB0aGUgY2xhc3MgaGFzIGJlZW4gbG9hZGVkIGZyb20uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2xhc3Mgd2hvc2UgbG9jYXRpb24gaXMgcmVxdWlyZWQuCisgICAgICogQHJldHVybiB0aGUgZmlsZSBvciBqYXIgd2l0aCB0aGUgY2xhc3Mgb3IgbnVsbCBpZiB3ZSBjYW5ub3QKKyAgICAgKiAgICAgICAgIGRldGVybWluZSB0aGUgbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRDbGFzc1NvdXJjZShDbGFzcyBjKSB7CisgICAgICAgIFN0cmluZyBjbGFzc1Jlc291cmNlID0gYy5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKKyAgICAgICAgcmV0dXJuIGdldFJlc291cmNlU291cmNlKGMuZ2V0Q2xhc3NMb2FkZXIoKSwgY2xhc3NSZXNvdXJjZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgZGlyZWN0b3J5IG9yIGphciBhIGdpdmVuIHJlc291cmNlIGhhcyBiZWVuIGxvYWRlZCBmcm9tLgorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIGNsYXNzbG9hZGVyIHRvIGJlIGNvbnN1bHRlZCBmb3IgdGhlIHNvdXJjZS4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHdob3NlIGxvY2F0aW9uIGlzIHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlsZSB3aXRoIHRoZSByZXNvdXJjZSBzb3VyY2Ugb3IgbnVsbCBpZgorICAgICAqICAgICAgICAgd2UgY2Fubm90IGRldGVybWluZSB0aGUgbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRSZXNvdXJjZVNvdXJjZShDbGFzc0xvYWRlciBjLCBTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgYyA9IExvY2F0b3IuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgfQorICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgdXJsID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXJsID0gYy5nZXRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdSA9IHVybC50b1N0cmluZygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAodS5zdGFydHNXaXRoKCJqYXI6ZmlsZToiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoZnJvbUphclVSSSh1KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1LnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRhaWwgPSB1LmluZGV4T2YocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlyTmFtZSA9IHUuc3Vic3RyaW5nKDAsIHRhaWwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoZnJvbVVSSShkaXJOYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL3VuYWJsZSB0byBkZXRlcm1pbmUgdGhlIFVSSSBmb3IgcmVhc29ucyB1bmtub3duLgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmlsZSBwYXRoIGZyb20gYSA8Y29kZT5maWxlOjwvY29kZT4gVVJJLgorICAgICAqCisgICAgICogPHA+V2lsbCBiZSBhbiBhYnNvbHV0ZSBwYXRoIGlmIHRoZSBnaXZlbiBVUkkgaXMgYWJzb2x1dGUuPC9wPgorICAgICAqCisgICAgICogPHA+UHJpb3IgdG8gSmF2YSAxLjQsCisgICAgICogc3dhbGxvd3MgJyUnIHRoYXQgYXJlIG5vdCBmb2xsb3dlZCBieSB0d28gY2hhcmFjdGVycy48L3A+CisgICAgICoKKyAgICAgKiBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sMTEvI2R0LXN5c2lkIj5kdC1zeXNpZDwvYT4KKyAgICAgKiB3aGljaCBtYWtlcyBzb21lIG1lbnRpb24gb2YgaG93CisgICAgICogY2hhcmFjdGVycyBub3Qgc3VwcG9ydGVkIGJ5IFVSSSBSZWZlcmVuY2Ugc3ludGF4IHNob3VsZCBiZSBlc2NhcGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSB0aGUgVVJJIGRlc2lnbmF0aW5nIGEgZmlsZSBpbiB0aGUgbG9jYWwgZmlsZXN5c3RlbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBwYXRoIGZvciB0aGUgZmlsZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgVVJJIGlzIG1hbGZvcm1lZCBvciBub3QgYSBsZWdhbCBmaWxlOiBVUkwKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb21VUkkoU3RyaW5nIHVyaSkgeworICAgICAgICAvLyAjYnV6aWxsYTgwMzE6IGZpcnN0IHRyeSBKYXZhIDEuNC4KKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgICAgIC8vcmVzdWx0ID0gZnJvbVVyaUphdmExNCh1cmkpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZyb21VUklKYXZhMTModXJpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogSmF2YTEuNCsgY29kZSB0byBleHRyYWN0IHRoZSBwYXRoIGZyb20gdGhlIFVSSS4KKyAgICAgKiBAcGFyYW0gdXJpCisgICAgICogQHJldHVybiBudWxsIGlmIGEgY29udmVyc2lvbiB3YXMgbm90IHBvc3NpYmxlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZyb21VcmlKYXZhMTQoU3RyaW5nIHVyaSkgeworICAgICAgICBDbGFzcyB1cmlDbGF6eiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmlDbGF6eiA9IENsYXNzLmZvck5hbWUoImphdmEubmV0LlVSSSIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgIC8vIEZpbmUsIEphdmEgMS4zIG9yIGVhcmxpZXIsIGRvIGl0IGJ5IGhhbmQuCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBBbHNvIGNoZWNrIGZvciBwcm9wZXJseSBmb3JtZWQgVVJJcy4gQW50IGZvcm1lcmx5IHJlY29tbWVuZGVkIHVzaW5nCisgICAgICAgIC8vIG5vbnNlbnNlIFVSSXMgc3VjaCBhcyAiZmlsZTouL2Zvby54bWwiIGluIFhNTCBpbmNsdWRlcy4gWW91IHNob3VsZG4ndAorICAgICAgICAvLyBkbyB0aGF0IChqdXN0ICJmb28ueG1sIiBpcyBjb3JyZWN0KSBidXQgZm9yIGNvbXBhdGliaWxpdHkgd2Ugc3BlY2lhbC1jYXNlCisgICAgICAgIC8vIHRoaW5ncyB3aGVuIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSwgYW5kIGZhbGwgYmFjayB0byB0aGUgb2xkIHBhcnNpbmcgYmVoYXZpb3IuCisgICAgICAgIGlmICh1cmlDbGF6eiAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKCJmaWxlOi8iKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgY3JlYXRlTWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICA9IHVyaUNsYXp6LmdldE1ldGhvZCgiY3JlYXRlIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHVyaU9iaiA9IGNyZWF0ZU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde2VuY29kZVVSSSh1cmkpfSk7CisgICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgZmlsZUNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICA9IEZpbGUuY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117dXJpQ2xhenp9KTsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSAoRmlsZSkgZmlsZUNvbnN0Lm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXt1cmlPYmp9KTsKKyAgICAgICAgICAgICAgICAvL2J1ZyAjNDIyMjcgZm9yZ290IHRvIGRlY29kZSBiZWZvcmUgcmV0dXJuaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVyaShmLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFRocm93YWJsZSBlMiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGUyIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJhZCBVUkksIHBhc3MgdGhpcyBvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gbm8sIHRoaXMgaXMgZG93bmdyYWRlZCB0byBhIHdhcm5pbmcgYWZ0ZXIgdmFyaW91cworICAgICAgICAgICAgICAgICAgICAvLyBKUkUgYnVncyBzdXJmYWNlZC4gSGFuZCBvZmYKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gb3VyIGJ1aWx0IGluIGNvZGUgb24gYSBmYWlsdXJlCisgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgLy8gICAiQmFkIFVSSSAiICsgdXJpICsgIjoiICsgZTIuZ2V0TWVzc2FnZSgpLCBlMik7CisgICAgICAgICAgICAgICAgICAgIGUyLnByaW50U3RhY2tUcmFjZSgpOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5leHBlY3RlZCB0YXJnZXQgZXhjZXB0aW9uPyBTaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgZTIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWZsZWN0aW9uIHByb2JsZW1zPyBTaG91bGQgbm90IGhhcHBlbiwgZGVidWcuCisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBwdWJsaWMgZm9yIHRlc3Rpbmc7IHdlIG1heSBkZWxldGUgaXQgd2l0aG91dCBhbnkgd2FybmluZyAtaXQgaXMgbm90IHBhcnQgb2YgQW50J3Mgc3RhYmxlIEFQSS4KKyAgICAgKiBAcGFyYW0gdXJpIHVyaSB0byBleHBhbmQKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIFVSSQorICAgICAqIEBzaW5jZSBBbnQxLjcuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb21VUklKYXZhMTMoU3RyaW5nIHVyaSkgeworICAgICAgICAvLyBGYWxsYmFjayBtZXRob2QgZm9yIEphdmEgMS4zIG9yIGVhcmxpZXIuCisKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVyaSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlbVlvdUVhcmxFeCkgeworICAgICAgICAgICAgLy8gSWdub3JlIG1hbGZvcm1lZCBleGNlcHRpb24KKyAgICAgICAgfQorICAgICAgICBpZiAodXJsID09IG51bGwgfHwgISgiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oRVJST1JfTk9UX0ZJTEVfVVJJICsgdXJpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih1cmwuZ2V0SG9zdCgpKTsKKyAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGJ1Zi5pbnNlcnQoMCwgRmlsZS5zZXBhcmF0b3JDaGFyKS5pbnNlcnQoMCwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZmlsZSA9IHVybC5nZXRGaWxlKCk7CisgICAgICAgIGludCBxdWVyeVBvcyA9IGZpbGUuaW5kZXhPZignPycpOworICAgICAgICBidWYuYXBwZW5kKChxdWVyeVBvcyA8IDApID8gZmlsZSA6IGZpbGUuc3Vic3RyaW5nKDAsIHF1ZXJ5UG9zKSk7CisKKyAgICAgICAgdXJpID0gYnVmLnRvU3RyaW5nKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisKKyAgICAgICAgaWYgKEZpbGUucGF0aFNlcGFyYXRvckNoYXIgPT0gJzsnICYmIHVyaS5zdGFydHNXaXRoKCJcXCIpICYmIHVyaS5sZW5ndGgoKSA+IDIKKyAgICAgICAgICAgICYmIENoYXJhY3Rlci5pc0xldHRlcih1cmkuY2hhckF0KDEpKSAmJiB1cmkubGFzdEluZGV4T2YoJzonKSA+IC0xKSB7CisgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhdGggPSBkZWNvZGVVcmkodXJpKTsKKyAgICAgICAgICAgIC8vY29uc2lkZXIgYWRkaW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gVGhpcyBpcyBub3QgZG9uZSB3aGVuCisgICAgICAgICAgICAvL3RoZSBwYXRoIGlzIGEgVU5DIG5hbWUKKyAgICAgICAgICAgIFN0cmluZyBjd2QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgICAgICBpbnQgcG9zaSA9IGN3ZC5pbmRleE9mKCc6Jyk7CisgICAgICAgICAgICBib29sZWFuIHBhdGhTdGFydHNXaXRoRmlsZVNlcGFyYXRvciA9IHBhdGguc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcik7CisgICAgICAgICAgICBib29sZWFuIHBhdGhTdGFydHNXaXRoVU5DID0gcGF0aC5zdGFydHNXaXRoKCIiICsgRmlsZS5zZXBhcmF0b3IgKyBGaWxlLnNlcGFyYXRvcik7CisgICAgICAgICAgICBpZiAoKHBvc2kgPiAwKSAmJiBwYXRoU3RhcnRzV2l0aEZpbGVTZXBhcmF0b3IgJiYgIXBhdGhTdGFydHNXaXRoVU5DKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9IGN3ZC5zdWJzdHJpbmcoMCwgcG9zaSArIDEpICsgcGF0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIC8vIG5vdCBzdXJlIHdoZXRoZXIgdGhpcyBpcyBjbGVhbiwgYnV0IHRoaXMgbWV0aG9kIGlzCisgICAgICAgICAgICAvLyBkZWNsYXJlZCBub3QgdG8gdGhyb3cgZXhjZXB0aW9ucy4KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjb252ZXJ0IFVSSSAiICsgdXJpICsgIiB0byBwYXRoOiAiCisgICAgICAgICAgICAgICAgKyBleGMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmFjayBhIEpBUiBVUkkuCisgICAgICogVGhpcyBtZXRob2QgaXMgcHVibGljIGZvciB0ZXN0aW5nOyB3ZSBtYXkgZGVsZXRlIGl0IHdpdGhvdXQgYW55IHdhcm5pbmcgLWl0IGlzIG5vdCBwYXJ0IG9mIEFudCdzIHN0YWJsZSBBUEkuCisgICAgICogQHBhcmFtIHVyaSB1cmkgdG8gZXhwYW5kOyBjb250YWlucyBqYXI6IHNvbWV3aGVyZSBpbiBpdAorICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgVVJJCisgICAgICogQHNpbmNlIEFudDEuNy4xCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbUphclVSSShTdHJpbmcgdXJpKSB7CisgICAgICAgIGludCBwbGluZyA9IHVyaS5pbmRleE9mKCchJyk7CisgICAgICAgIFN0cmluZyBqYXJOYW1lID0gdXJpLnN1YnN0cmluZygiamFyOiIubGVuZ3RoKCksIHBsaW5nKTsKKyAgICAgICAgcmV0dXJuIGZyb21VUkkoamFyTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyBhbiBVcmkgd2l0aCAlIGNoYXJhY3RlcnMuCisgICAgICogVGhlIFVSSSBpcyBlc2NhcGVkCisgICAgICogQHBhcmFtIHVyaSBTdHJpbmcgd2l0aCB0aGUgdXJpIHBvc3NpYmx5IGNvbnRhaW5pbmcgJSBjaGFyYWN0ZXJzLgorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgVXJpCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIFVURi04IGlzIG5vdCBhdmFpbGFibGUKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZVVyaShTdHJpbmcgdXJpKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1cmkuaW5kZXhPZignJScpID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gdXJpOworICAgICAgICB9CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0odXJpLmxlbmd0aCgpKTsKKyAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXRlciA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcih1cmkpOworICAgICAgICBmb3IgKGNoYXIgYyA9IGl0ZXIuZmlyc3QoKTsgYyAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FOworICAgICAgICAgICAgIGMgPSBpdGVyLm5leHQoKSkgeworICAgICAgICAgICAgaWYgKGMgPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgY2hhciBjMSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChjMSAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpMSA9IENoYXJhY3Rlci5kaWdpdChjMSwgV09SRCk7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYzIgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMyICE9IENoYXJhY3Rlckl0ZXJhdG9yLkRPTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpMiA9IENoYXJhY3Rlci5kaWdpdChjMiwgV09SRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi53cml0ZSgoY2hhcikgKChpMSA8PCBOSUJCTEUpICsgaTIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2Iud3JpdGUoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKFVSSV9FTkNPRElORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyBhbiBVcmkgd2l0aCAlIGNoYXJhY3RlcnMuCisgICAgICogVGhlIFVSSSBpcyBlc2NhcGVkCisgICAgICogQHBhcmFtIHBhdGggU3RyaW5nIHRvIGVuY29kZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBlbmNvZGVkIHN0cmluZywgYWNjb3JkaW5nIHRvIFVSSSBub3JtcworICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBpZiBVVEYtOCBpcyBub3QgYXZhaWxhYmxlCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVVUkkoU3RyaW5nIHBhdGgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgbGVuID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgaW50IGNoID0gMDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKKyAgICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2ggPSBwYXRoLmNoYXJBdChpKTsKKyAgICAgICAgICAgIC8vIGlmIGl0J3Mgbm90IGFuIEFTQ0lJIGNoYXJhY3RlciwgYnJlYWsgaGVyZSwgYW5kIHVzZSBVVEYtOCBlbmNvZGluZworICAgICAgICAgICAgaWYgKGNoID49IEFTQ0lJX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnTmVlZEVzY2FwaW5nW2NoXSkgeworICAgICAgICAgICAgICAgIGlmIChzYiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwYXRoLnN1YnN0cmluZygwLCBpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnJScpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChnQWZ0ZXJFc2NhcGluZzFbY2hdKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZ0FmdGVyRXNjYXBpbmcyW2NoXSk7CisgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHRoZSBmYWN0IHRoYXQgaXQncyBlc2NhcGVkCisgICAgICAgICAgICB9IGVsc2UgaWYgKHNiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIHNhdyBzb21lIG5vbi1hc2NpaSBjaGFyYWN0ZXIKKyAgICAgICAgaWYgKGkgPCBsZW4pIHsKKyAgICAgICAgICAgIGlmIChzYiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBhdGguc3Vic3RyaW5nKDAsIGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGdldCBVVEYtOCBieXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdWItc3RyaW5nCisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICAgICAgYnl0ZSBiOworICAgICAgICAgICAgYnl0ZXMgPSBwYXRoLnN1YnN0cmluZyhpKS5nZXRCeXRlcyhVUklfRU5DT0RJTkcpOworICAgICAgICAgICAgbGVuID0gYnl0ZXMubGVuZ3RoOworCisgICAgICAgICAgICAvLyBmb3IgZWFjaCBieXRlCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBiID0gYnl0ZXNbaV07CisgICAgICAgICAgICAgICAgLy8gZm9yIG5vbi1hc2NpaSBjaGFyYWN0ZXI6IG1ha2UgaXQgcG9zaXRpdmUsIHRoZW4gZXNjYXBlCisgICAgICAgICAgICAgICAgaWYgKGIgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gYiArIEJZVEVfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCclJyk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChnSGV4Q2hzW2NoID4+IE5JQkJMRV0pOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZ0hleENoc1tjaCAmIE5JQkJMRV9NQVNLXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnTmVlZEVzY2FwaW5nW2JdKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnJScpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZ0FmdGVyRXNjYXBpbmcxW2JdKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGdBZnRlckVzY2FwaW5nMltiXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiID09IG51bGwgPyBwYXRoIDogc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgRmlsZSB0byBhIFVSTC4KKyAgICAgKiBGaWxlLnRvVVJMKCkgZG9lcyBub3QgZW5jb2RlIGNoYXJhY3RlcnMgbGlrZSAjLgorICAgICAqIEZpbGUudG9VUkkoKSBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIGphdmEgMS40LCBzbworICAgICAqIEFOVCBjYW5ub3QgdXNlIGl0IChleGNlcHQgYnkgcmVmbGVjdGlvbikKKyAgICAgKiBGaWxlVXRpbHMudG9VUkkoKSBjYW5ub3QgYmUgdXNlZCBieSBMb2NhdG9yLmphdmEKKyAgICAgKiBJbXBsZW1lbnRlZCB0aGlzIHdheS4KKyAgICAgKiBGaWxlLnRvVVJMKCkgYWRkcyBmaWxlOiBhbmQgY2hhbmdlcyAnXCcgdG8gJy8nIGZvciBkb3MgT1NlcworICAgICAqIGVuY29kZVVSSSBjb252ZXJ0cyBjaGFyYWN0ZXJzIGxpa2UgJyAnIGFuZCAnIycgdG8gJURECisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gY29udmVydAorICAgICAqIEByZXR1cm4gVVJMIHRoZSBjb252ZXJ0ZWQgRmlsZQorICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVUkwgZmlsZVRvVVJMKEZpbGUgZmlsZSkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTChlbmNvZGVVUkkoZmlsZS50b1VSTCgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbihleC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgRmlsZSBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgU3VuIGNvbXBpbGVyIHRvb2xzLiBJZiB0aGUgY2xhc3NlcworICAgICAqIGFyZSBhdmFpbGFibGUgdG8gdGhpcyBjbGFzcywgdGhlbiBubyBhZGRpdGlvbmFsIFVSTCBpcyByZXF1aXJlZCBhbmQKKyAgICAgKiBudWxsIGlzIHJldHVybmVkLiBUaGlzIG1heSBiZSBiZWNhdXNlIHRoZSBjbGFzc2VzIGFyZSBleHBsaWNpdGx5IGluIHRoZQorICAgICAqIGNsYXNzIHBhdGggb3IgcHJvdmlkZWQgYnkgdGhlIEpWTSBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRvb2xzIGphciBhcyBhIEZpbGUgaWYgcmVxdWlyZWQsIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRUb29sc0phcigpIHsKKyAgICAgICAgLy8gZmlyc3RseSBjaGVjayBpZiB0aGUgdG9vbHMgamFyIGlzIGFscmVhZHkgaW4gdGhlIGNsYXNzcGF0aAorICAgICAgICBib29sZWFuIHRvb2xzSmFyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHdoZXRoZXIgdGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnRvb2xzLmphdmFjLk1haW4iKTsKKyAgICAgICAgICAgIHRvb2xzSmFyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgic3VuLnRvb2xzLmphdmFjLk1haW4iKTsKKyAgICAgICAgICAgICAgICB0b29sc0phckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodG9vbHNKYXJBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIGNvdWxkbid0IGZpbmQgY29tcGlsZXIgLSB0cnkgdG8gZmluZCB0b29scy5qYXIKKyAgICAgICAgLy8gYmFzZWQgb24gamF2YS5ob21lIHNldHRpbmcKKyAgICAgICAgU3RyaW5nIGxpYlRvb2xzSmFyCisgICAgICAgICAgICA9IEZpbGUuc2VwYXJhdG9yICsgImxpYiIgKyBGaWxlLnNlcGFyYXRvciArICJ0b29scy5qYXIiOworICAgICAgICBTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOworICAgICAgICBGaWxlIHRvb2xzSmFyID0gbmV3IEZpbGUoamF2YUhvbWUgKyBsaWJUb29sc0phcik7CisgICAgICAgIGlmICh0b29sc0phci5leGlzdHMoKSkgeworICAgICAgICAgICAgLy8gRm91bmQgaW4gamF2YS5ob21lIGFzIGdpdmVuCisgICAgICAgICAgICByZXR1cm4gdG9vbHNKYXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGphdmFIb21lLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IgKyAianJlIikpIHsKKyAgICAgICAgICAgIGphdmFIb21lID0gamF2YUhvbWUuc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgIDAsIGphdmFIb21lLmxlbmd0aCgpIC0gIi9qcmUiLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIHRvb2xzSmFyID0gbmV3IEZpbGUoamF2YUhvbWUgKyBsaWJUb29sc0phcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0b29sc0phci5leGlzdHMoKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gbG9jYXRlIHRvb2xzLmphci4gIgorICAgICAgICAgICAgICAgICArICJFeHBlY3RlZCB0byBmaW5kIGl0IGluICIgKyB0b29sc0phci5nZXRQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvb2xzSmFyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBhcnJheSBvZiBVUkxzIHJlcHJlc2VudGluZyBhbGwgb2YgdGhlIGphciBmaWxlcyBpbiB0aGUKKyAgICAgKiBnaXZlbiBsb2NhdGlvbi4gSWYgdGhlIGxvY2F0aW9uIGlzIGEgZmlsZSwgaXQgaXMgcmV0dXJuZWQgYXMgdGhlIG9ubHkKKyAgICAgKiBlbGVtZW50IG9mIHRoZSBhcnJheS4gSWYgdGhlIGxvY2F0aW9uIGlzIGEgZGlyZWN0b3J5LCBpdCBpcyBzY2FubmVkIGZvcgorICAgICAqIGphciBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gdG8gc2NhbiBmb3IgSmFycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgVVJMcyBmb3IgYWxsIGphcnMgaW4gdGhlIGdpdmVuIGxvY2F0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIFVSTHMgZm9yIHRoZSBqYXJzIGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgZm9ybWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0TG9jYXRpb25VUkxzKEZpbGUgbG9jYXRpb24pCisgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uVVJMcyhsb2NhdGlvbiwgbmV3IFN0cmluZ1tdeyIuamFyIn0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBhcnJheSBvZiBVUkxzIHJlcHJlc2VudGluZyBhbGwgb2YgdGhlIGZpbGVzIG9mIGEgZ2l2ZW4gc2V0IG9mCisgICAgICogZXh0ZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gbG9jYXRpb24uIElmIHRoZSBsb2NhdGlvbiBpcyBhIGZpbGUsIGl0IGlzCisgICAgICogcmV0dXJuZWQgYXMgdGhlIG9ubHkgZWxlbWVudCBvZiB0aGUgYXJyYXkuIElmIHRoZSBsb2NhdGlvbiBpcyBhCisgICAgICogZGlyZWN0b3J5LCBpdCBpcyBzY2FubmVkIGZvciBtYXRjaGluZyBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gdG8gc2NhbiBmb3IgZmlsZXMuCisgICAgICogQHBhcmFtIGV4dGVuc2lvbnMgYW4gYXJyYXkgb2YgZXh0ZW5zaW9uIHRoYXQgYXJlIHRvIG1hdGNoIGluIHRoZQorICAgICAqICAgICAgICBkaXJlY3Rvcnkgc2VhcmNoLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBVUkxzIG9mIG1hdGNoaW5nIGZpbGVzLgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIHRoZSBVUkxzIGZvciB0aGUgZmlsZXMgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICBmb3JtZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVUkxbXSBnZXRMb2NhdGlvblVSTHMoRmlsZSBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBleHRlbnNpb25zKQorICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIFVSTFtdIHVybHMgPSBuZXcgVVJMWzBdOworCisgICAgICAgIGlmICghbG9jYXRpb24uZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB1cmxzOworICAgICAgICB9CisgICAgICAgIGlmICghbG9jYXRpb24uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdXJscyA9IG5ldyBVUkxbMV07CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGxvY2F0aW9uLmdldFBhdGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBsaXR0bGVQYXRoID0gcGF0aC50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpdHRsZVBhdGguZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsc1swXSA9IGZpbGVUb1VSTChsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1cmxzOworICAgICAgICB9CisgICAgICAgIEZpbGVbXSBtYXRjaGVzID0gbG9jYXRpb24ubGlzdEZpbGVzKAorICAgICAgICAgICAgbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpdHRsZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpdHRsZU5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHVybHMgPSBuZXcgVVJMW21hdGNoZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICB1cmxzW2ldID0gZmlsZVRvVVJMKG1hdGNoZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cmxzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0Fuc2lDb2xvckxvZ2dlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvQW5zaUNvbG9yTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljOTZjYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0Fuc2lDb2xvckxvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGVmYXVsdExvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIFVzZXMgQU5TSSBDb2xvciBDb2RlIFNlcXVlbmNlcyB0byBjb2xvcml6ZSBtZXNzYWdlcworICogc2VudCB0byB0aGUgY29uc29sZS4KKyAqCisgKiBJZiB1c2VkIHdpdGggdGhlIC1sb2dmaWxlIG9wdGlvbiwgdGhlIG91dHB1dCBmaWxlCisgKiB3aWxsIGNvbnRhaW4gYWxsIHRoZSBuZWNlc3NhcnkgZXNjYXBlIGNvZGVzIHRvCisgKiBkaXNwbGF5IHRoZSB0ZXh0IGluIGNvbG9yaXplZCBtb2RlIHdoZW4gZGlzcGxheWVkCisgKiBpbiB0aGUgY29uc29sZSB1c2luZyBhcHBsaWNhdGlvbnMgbGlrZSBjYXQsIG1vcmUsCisgKiBldGMuCisgKgorICogVGhpcyBpcyBkZXNpZ25lZCB0byB3b3JrIG9uIHRlcm1pbmFscyB0aGF0IHN1cHBvcnQgQU5TSQorICogY29sb3IgY29kZXMuICBJdCB3b3JrcyBvbiBYVGVybSwgRVRlcm0sIE1pbmR0ZXJtLCBldGMuCisgKiBJdCBhbHNvIHdvcmtzIG9uIFdpbjl4ICh3aXRoIEFOU0kuU1lTIGxvYWRlZC4pCisgKgorICogTk9URToKKyAqIEl0IGRvZXNuJ3Qgd29yayBvbiBXaW5OVCdzIENPTU1BTkQuQ09NIGV2ZW4gd2l0aAorICogQU5TSS5TWVMgbG9hZGVkLgorICoKKyAqIFRoZSBkZWZhdWx0IGNvbG9ycyB1c2VkIGZvciBkaWZmZXJlbnRpYXRpbmcKKyAqIHRoZSBtZXNzYWdlIGxldmVscyBjYW4gYmUgY2hhbmdlZCBieSBlZGl0aW5nIHRoZQorICogL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL2RlZmF1bHRzLnByb3BlcnRpZXMKKyAqIGZpbGUuCisgKiBUaGlzIGZpbGUgY29udGFpbnMgNSBrZXkvdmFsdWUgcGFpcnM6CisgKiBBbnNpQ29sb3JMb2dnZXIuRVJST1JfQ09MT1I9MjszMQorICogQW5zaUNvbG9yTG9nZ2VyLldBUk5JTkdfQ09MT1I9MjszNQorICogQW5zaUNvbG9yTG9nZ2VyLklORk9fQ09MT1I9MjszNgorICogQW5zaUNvbG9yTG9nZ2VyLlZFUkJPU0VfQ09MT1I9MjszMgorICogQW5zaUNvbG9yTG9nZ2VyLkRFQlVHX0NPTE9SPTI7MzQKKyAqCisgKiBBbm90aGVyIG9wdGlvbiBpcyB0byBwYXNzIGEgc3lzdGVtIHZhcmlhYmxlIG5hbWVkCisgKiBhbnQubG9nZ2VyLmRlZmF1bHRzLCB3aXRoIHZhbHVlIHNldCB0byB0aGUgcGF0aCBvZgorICogdGhlIGZpbGUgdGhhdCBjb250YWlucyB1c2VyIGRlZmluZWQgQW5zaSBDb2xvcgorICogQ29kZXMsIHRvIHRoZSA8Qj5qYXZhPC9CPiBjb21tYW5kIHVzaW5nIC1EIG9wdGlvbi4KKyAqCisgKiBUbyBjaGFuZ2UgdGhlc2UgY29sb3JzIHVzZSB0aGUgZm9sbG93aW5nIGNoYXJ0OgorICoKKyAqICAgICAgPEI+QU5TSSBDT0xPUiBMT0dHRVIgQ09ORklHVVJBVElPTjwvQj4KKyAqCisgKiBGb3JtYXQgZm9yIEFuc2lDb2xvckxvZ2dlci4qPQorICogIEF0dHJpYnV0ZTtGb3JlZ3JvdW5kO0JhY2tncm91bmQKKyAqCisgKiAgQXR0cmlidXRlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogIDAgLT4gUmVzZXQgQWxsIEF0dHJpYnV0ZXMgKHJldHVybiB0byBub3JtYWwgbW9kZSkKKyAqICAxIC0+IEJyaWdodCAoVXN1YWxseSB0dXJucyBvbiBCT0xEKQorICogIDIgLT4gRGltCisgKiAgMyAtPiBVbmRlcmxpbmUKKyAqICA1IC0+IGxpbmsKKyAqICA3IC0+IFJldmVyc2UKKyAqICA4IC0+IEhpZGRlbgorICoKKyAqICBGb3JlZ3JvdW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogIDMwIC0+IEJsYWNrCisgKiAgMzEgLT4gUmVkCisgKiAgMzIgLT4gR3JlZW4KKyAqICAzMyAtPiBZZWxsb3cKKyAqICAzNCAtPiBCbHVlCisgKiAgMzUgLT4gTWFnZW50YQorICogIDM2IC0+IEN5YW4KKyAqICAzNyAtPiBXaGl0ZQorICoKKyAqICBCYWNrZ3JvdW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogIDQwIC0+IEJsYWNrCisgKiAgNDEgLT4gUmVkCisgKiAgNDIgLT4gR3JlZW4KKyAqICA0MyAtPiBZZWxsb3cKKyAqICA0NCAtPiBCbHVlCisgKiAgNDUgLT4gTWFnZW50YQorICogIDQ2IC0+IEN5YW4KKyAqICA0NyAtPiBXaGl0ZQorICoKKyAqLworcHVibGljIGNsYXNzIEFuc2lDb2xvckxvZ2dlciBleHRlbmRzIERlZmF1bHRMb2dnZXIgeworICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVFRSX05PUk1BTCA9IDA7CisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFUVFJfQlJJR0hUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVRUUl9ESU0gPSAyOworICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVFRSX1VOREVSTElORSA9IDM7CisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFUVFJfQkxJTksgPSA1OworICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVFRSX1JFVkVSU0UgPSA3OworICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVFRSX0hJRERFTiA9IDg7CisKKyAgICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkdfQkxBQ0sgPSAzMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkdfUkVEID0gMzE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZHX0dSRUVOID0gMzI7CisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZHX1lFTExPVyA9IDMzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGR19CTFVFID0gMzQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZHX01BR0VOVEEgPSAzNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkdfQ1lBTiA9IDM2OworICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGR19XSElURSA9IDM3OworCisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJHX0JMQUNLID0gNDA7CisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJHX1JFRCA9IDQxOworICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCR19HUkVFTiA9IDQyOworICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCR19ZRUxMT1cgPSA0NDsKKyAgICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkdfQkxVRSA9IDQ0OworICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCR19NQUdFTlRBID0gNDU7CisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJHX0NZQU4gPSA0NjsKKyAgICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkdfV0hJVEUgPSA0NzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiXHUwMDFiWyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICJtIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNFUEFSQVRPUiA9ICc7JzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX0NPTE9SID0gUFJFRklYICsgU1VGRklYOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyQ29sb3IKKyAgICAgICAgPSBQUkVGSVggKyBBVFRSX0RJTSArIFNFUEFSQVRPUiArIEZHX1JFRCArIFNVRkZJWDsKKyAgICBwcml2YXRlIFN0cmluZyB3YXJuQ29sb3IKKyAgICAgICAgPSBQUkVGSVggKyBBVFRSX0RJTSArIFNFUEFSQVRPUiArIEZHX01BR0VOVEEgKyBTVUZGSVg7CisgICAgcHJpdmF0ZSBTdHJpbmcgaW5mb0NvbG9yCisgICAgICAgID0gUFJFRklYICsgQVRUUl9ESU0gKyBTRVBBUkFUT1IgKyBGR19DWUFOICsgU1VGRklYOworICAgIHByaXZhdGUgU3RyaW5nIHZlcmJvc2VDb2xvcgorICAgICAgICA9IFBSRUZJWCArIEFUVFJfRElNICsgU0VQQVJBVE9SICsgRkdfR1JFRU4gKyBTVUZGSVg7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVidWdDb2xvcgorICAgICAgICA9IFBSRUZJWCArIEFUVFJfRElNICsgU0VQQVJBVE9SICsgRkdfQkxVRSArIFNVRkZJWDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBjb2xvcnNTZXQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29sb3JzIHRvIHVzZSBmcm9tIGEgcHJvcGVydHkgZmlsZSBzcGVjaWZpZWQgYnkgdGhlCisgICAgICogc3BlY2lhbCBhbnQgcHJvcGVydHkgYW50LmxvZ2dlci5kZWZhdWx0cworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRDb2xvcnMoKSB7CisgICAgICAgIFN0cmluZyB1c2VyQ29sb3JGaWxlID0gU3lzdGVtLmdldFByb3BlcnR5KCJhbnQubG9nZ2VyLmRlZmF1bHRzIik7CisgICAgICAgIFN0cmluZyBzeXN0ZW1Db2xvckZpbGUgPQorICAgICAgICAgICAgIi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9kZWZhdWx0cy5wcm9wZXJ0aWVzIjsKKworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgICAgIGlmICh1c2VyQ29sb3JGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odXNlckNvbG9yRmlsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHN5c3RlbUNvbG9yRmlsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvcC5sb2FkKGluKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGVyckMgPSBwcm9wLmdldFByb3BlcnR5KCJBbnNpQ29sb3JMb2dnZXIuRVJST1JfQ09MT1IiKTsKKyAgICAgICAgICAgIFN0cmluZyB3YXJuID0gcHJvcC5nZXRQcm9wZXJ0eSgiQW5zaUNvbG9yTG9nZ2VyLldBUk5JTkdfQ09MT1IiKTsKKyAgICAgICAgICAgIFN0cmluZyBpbmZvID0gcHJvcC5nZXRQcm9wZXJ0eSgiQW5zaUNvbG9yTG9nZ2VyLklORk9fQ09MT1IiKTsKKyAgICAgICAgICAgIFN0cmluZyB2ZXJib3NlID0gcHJvcC5nZXRQcm9wZXJ0eSgiQW5zaUNvbG9yTG9nZ2VyLlZFUkJPU0VfQ09MT1IiKTsKKyAgICAgICAgICAgIFN0cmluZyBkZWJ1ZyA9IHByb3AuZ2V0UHJvcGVydHkoIkFuc2lDb2xvckxvZ2dlci5ERUJVR19DT0xPUiIpOworICAgICAgICAgICAgaWYgKGVyckMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyckNvbG9yID0gUFJFRklYICsgZXJyQyArIFNVRkZJWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3YXJuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3YXJuQ29sb3IgPSBQUkVGSVggKyB3YXJuICsgU1VGRklYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluZm9Db2xvciA9IFBSRUZJWCArIGluZm8gKyBTVUZGSVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmVyYm9zZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmVyYm9zZUNvbG9yID0gUFJFRklYICsgdmVyYm9zZSArIFNVRkZJWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVidWdDb2xvciA9IFBSRUZJWCArIGRlYnVnICsgU1VGRklYOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIC8vSWdub3JlIC0gd2Ugd2lsbCB1c2UgdGhlIGRlZmF1bHRzLgorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9JZ25vcmUgLSBXZSBkbyBub3Qgd2FudCB0aGlzIHRvIHN0b3AgdGhlIGJ1aWxkLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgRGVmYXVsdExvZ2dlciNwcmludE1lc3NhZ2UKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByaW50U3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghY29sb3JzU2V0KSB7CisgICAgICAgICAgICAgICAgc2V0Q29sb3JzKCk7CisgICAgICAgICAgICAgICAgY29sb3JzU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIobWVzc2FnZSk7CisgICAgICAgICAgICBzd2l0Y2ggKHByaW9yaXR5KSB7CisgICAgICAgICAgICAgICAgY2FzZSBQcm9qZWN0Lk1TR19FUlI6CisgICAgICAgICAgICAgICAgICAgIG1zZy5pbnNlcnQoMCwgZXJyQ29sb3IpOworICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKEVORF9DT0xPUik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfV0FSTjoKKyAgICAgICAgICAgICAgICAgICAgbXNnLmluc2VydCgwLCB3YXJuQ29sb3IpOworICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKEVORF9DT0xPUik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfSU5GTzoKKyAgICAgICAgICAgICAgICAgICAgbXNnLmluc2VydCgwLCBpbmZvQ29sb3IpOworICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKEVORF9DT0xPUik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfVkVSQk9TRToKKyAgICAgICAgICAgICAgICAgICAgbXNnLmluc2VydCgwLCB2ZXJib3NlQ29sb3IpOworICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKEVORF9DT0xPUik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfREVCVUc6CisgICAgICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIG1zZy5pbnNlcnQoMCwgZGVidWdDb2xvcik7CisgICAgICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoRU5EX0NPTE9SKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RybWVzc2FnZSA9IG1zZy50b1N0cmluZygpOworICAgICAgICAgICAgc3RyZWFtLnByaW50bG4oc3RybWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9CaWdQcm9qZWN0TG9nZ2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9CaWdQcm9qZWN0TG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxZGYzYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0JpZ1Byb2plY3RMb2dnZXIuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTm9CYW5uZXJMb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuU3ViQnVpbGRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogVGhpcyBpcyBhIHNwZWNpYWwgbG9nZ2VyIHRoYXQgaXMgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd29yaworICogd2l0aCBiaWcgcHJvamVjdHMsIHRob3NlIHRoYXQgdXNlIGltcG9ydHMgYW5kCisgKiBzdWJhbnQgdG8gYnVpbGQgY29tcGxleCBzeXN0ZW1zLgorICoKKyAqIEBzaW5jZSBBbnQxLjcuMQorICovCisKK3B1YmxpYyBjbGFzcyBCaWdQcm9qZWN0TG9nZ2VyIGV4dGVuZHMgTm9CYW5uZXJMb2dnZXIgaW1wbGVtZW50cyBTdWJCdWlsZExpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIEhlYWRlciBzdHJpbmcgZm9yIHRoZSBsb2cuCisgICAgICoge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVIKKyAgICAgICAgPSAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSI7CisgICAgLyoqCisgICAgICogRm9vdGVyIHN0cmluZyBmb3IgdGhlIGxvZy4KKyAgICAgKiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPT1RFUiA9IEhFQURFUjsKKworICAgIC8qKgorICAgICogVGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludDogdGhlIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXMgd2hldGhlcgorICAgICogYSBidWlsZCBmYWlsZWQuIFN1YmNsYXNzZXMgY2FuIGNoYW5nZS9lbmhhbmNlIHRoZQorICAgICogbWVzc2FnZS4KKyAgICAqCisgICAgKiBAcmV0dXJuIFRoZSBjbGFzc2ljICJCVUlMRCBGQUlMRUQiIHBsdXMgYSB0aW1lc3RhbXAKKyAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVpbGRGYWlsZWRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QnVpbGRGYWlsZWRNZXNzYWdlKCkgKyBUaW1lc3RhbXBlZExvZ2dlci5TUEFDRVIgKyBnZXRUaW1lc3RhbXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGFuIG92ZXJyaWRlIHBvaW50OiB0aGUgbWVzc2FnZSB0aGF0IGluZGljYXRlcyB0aGF0CisgICAgICogYSBidWlsZCBzdWNjZWVkZWQuIFN1YmNsYXNzZXMgY2FuIGNoYW5nZS9lbmhhbmNlIHRoZQorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjbGFzc2ljICJCVUlMRCBTVUNDRVNTRlVMIiBwbHVzIGEgdGltZXN0YW1wCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCdWlsZFN1Y2Nlc3NmdWxNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QnVpbGRTdWNjZXNzZnVsTWVzc2FnZSgpICsgVGltZXN0YW1wZWRMb2dnZXIuU1BBQ0VSICsgZ2V0VGltZXN0YW1wKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBzdXBlci5idWlsZFN0YXJ0ZWQoZXZlbnQpOworICAgICAgICBzdWJCdWlsZFN0YXJ0ZWQoZXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBzdWJCdWlsZEZpbmlzaGVkKGV2ZW50KTsKKyAgICAgICAgc3VwZXIuYnVpbGRGaW5pc2hlZChldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgcG9pbnQsIGV4dHJhY3QgdGhlIHRhcmdldCBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIHdvcmsgb24KKyAgICAgKiBAcmV0dXJuIHRoZSB0YXJnZXQgbmFtZSAtaW5jbHVkaW5nIHRoZSBvd25pbmcgcHJvamVjdCBuYW1lIChpZiBub24tbnVsbCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RUYXJnZXROYW1lKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIHRhcmdldE5hbWUgPSBldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGV4dHJhY3RQcm9qZWN0TmFtZShldmVudCk7CisgICAgICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmIHRhcmdldE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHByb2plY3ROYW1lICsgJy4nICsgdGFyZ2V0TmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXROYW1lOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1YkJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZXh0cmFjdE5hbWVPckRlZmF1bHQoZXZlbnQpOworICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBldmVudC5nZXRQcm9qZWN0KCk7CisKKyAgICAgICAgRmlsZSBiYXNlID0gcHJvamVjdCA9PSBudWxsID8gbnVsbCA6IHByb2plY3QuZ2V0QmFzZURpcigpOworICAgICAgICBTdHJpbmcgcGF0aCA9CisgICAgICAgICAgICAoYmFzZSA9PSBudWxsKQorICAgICAgICAgICAgPyAiV2l0aCBubyBiYXNlIGRpcmVjdG9yeSIKKyAgICAgICAgICAgIDogIkluICIgKyBiYXNlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBwcmludE1lc3NhZ2UoU3RyaW5nVXRpbHMuTElORV9TRVAgKyBnZXRIZWFkZXIoKQorICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAgKyAiRW50ZXJpbmcgcHJvamVjdCAiICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCArIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAgKyBnZXRGb290ZXIoKSwKKyAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgZXZlbnQuZ2V0UHJpb3JpdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIGFuIGV2ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9yIGEgZGVmYXVsdCBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3ROYW1lT3JEZWZhdWx0KEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBleHRyYWN0UHJvamVjdE5hbWUoZXZlbnQpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBuYW1lID0gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYW1lID0gJyInICsgbmFtZSArICciJzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIHN1YkJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGV4dHJhY3ROYW1lT3JEZWZhdWx0KGV2ZW50KTsKKyAgICAgICAgU3RyaW5nIGZhaWxlZCA9IGV2ZW50LmdldEV4Y2VwdGlvbigpICE9IG51bGwgPyAiZmFpbGluZyAiIDogIiI7CisgICAgICAgIHByaW50TWVzc2FnZShTdHJpbmdVdGlscy5MSU5FX1NFUCArIGdldEhlYWRlcigpCisgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCArICJFeGl0aW5nICIgKyBmYWlsZWQgKyAicHJvamVjdCAiCisgICAgICAgICAgICAgICAgKyBuYW1lCisgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCArIGdldEZvb3RlcigpLAorICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICBldmVudC5nZXRQcmlvcml0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBwb2ludDogcmV0dXJuIHRoZSBoZWFkZXIgc3RyaW5nIGZvciB0aGUgZW50cnkvZXhpdCBtZXNzYWdlCisgICAgICogQHJldHVybiB0aGUgaGVhZGVyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gSEVBREVSOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHBvaW50OiByZXR1cm4gdGhlIGZvb3RlciBzdHJpbmcgZm9yIHRoZSBlbnRyeS9leGl0IG1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSBmb290ZXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGb290ZXIoKSB7CisgICAgICAgIHJldHVybiBGT09URVI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Db21tb25zTG9nZ2luZ0xpc3RlbmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Db21tb25zTG9nZ2luZ0xpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4MDg3YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0NvbW1vbnNMb2dnaW5nTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0NvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVW5rbm93bkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCisvKioKKyAqIEpha2FydGEgQ29tbW9ucyBMb2dnaW5nIGxpc3RlbmVyLgorICogTm90ZTogZG8gbm90IHVzZSB0aGUgU2ltcGxlTG9nIGFzIHlvdXIgbG9nZ2VyIGltcGxlbWVudGF0aW9uIGFzIGl0CisgKiBjYXVzZXMgYW4gaW5maW5pdGUgbG9vcCBzaW5jZSBpdCB3cml0ZXMgdG8gU3lzdGVtLmVyciwgd2hpY2ggQW50IHRyYXBzCisgKiBhbmQgcmVyb3V0ZXMgdG8gdGhlIGxvZ2dlci9saXN0ZW5lciBsYXllci4KKyAqCisgKiBUaGUgZm9sbG93aW5nIG5hbWVzIGFyZSB1c2VkIGZvciB0aGUgbG9nOgorICogIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuUFJPSkVDVF9OQU1FICAtIGZvciBwcm9qZWN0IGV2ZW50cworICogIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldC5UQVJHRVRfTkFNRSAtIGZvciB0YXJnZXQgZXZlbnRzCisgKiAgVEFTS19DTEFTU19OQU1FLlRBUkdFVF9OQU1FIC0gZm9yIGV2ZW50cyBpbiBpbmRpdmlkdWFsIHRhcmdldHMuCisgKgorICogSW4gYWxsIHRhcmdldCBhbmQgcHJvamVjdCBuYW1lcyB3ZSByZXBsYWNlICIuIiBhbmQgIiAiIHdpdGggIi0iLgorICoKKyAqIFRPRE86IHdlIHNob3VsZCB1c2UgdGhlIGFkdmFuY2VkIGNvbnRleHQgbG9nZ2luZyBmZWF0dXJlcyAoYW5kIGV4cG9zZSB0aGVtCisgKiBpbiBjLWwgZmlyc3QgOi0pCisgKiBUT0RPOiB0aGlzIGlzIF92ZXJ5XyBpbmVmZmljaWVudC4gU3dpdGNoaW5nIHRoZSBvdXQgYW5kIHRyYWNraW5nIHRoZSBsb2dzCisgKiBjYW4gYmUgb3B0aW1pemVkIGEgbG90IC0gYnV0IG1heSByZXF1aXJlIGZldyBtb3JlIGNoYW5nZXMgdG8gdGhlIGNvcmUuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIENvbW1vbnNMb2dnaW5nTGlzdGVuZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyLCBCdWlsZExvZ2dlciB7CisKKyAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBsaXN0ZW5lciB3YXMgaW5pdGlhbGl6ZWQuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIExvZ0ZhY3RvcnkgbG9nRmFjdG9yeTsKKworICAgIC8qKgorICAgICAqIG5hbWUgb2YgdGhlIGNhdGVnb3J5IHVuZGVyIHdoaWNoIHRhcmdldCBldmVudHMgYXJlIGxvZ2dlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9MT0cgPSAib3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0IjsKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIHRoZSBjYXRlZ29yeSB1bmRlciB3aGljaCBwcm9qZWN0IGV2ZW50cyBhcmUgbG9nZ2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9MT0cgPSAib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgdGhlIGxpc3RlbmVyIGFuZCBtYWtlIHN1cmUgdGhhdCBhIExvZ0ZhY3RvcnkKKyAgICAgKiBjYW4gYmUgb2J0YWluZWQuCisgICAgICovCisgICAgcHVibGljIENvbW1vbnNMb2dnaW5nTGlzdGVuZXIoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBMb2cgZ2V0TG9nKFN0cmluZyBjYXQsIFN0cmluZyBzdWZmaXgpIHsKKyAgICAgICAgaWYgKHN1ZmZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdWZmaXggPSBzdWZmaXgucmVwbGFjZSgnLicsICctJyk7CisgICAgICAgICAgICBzdWZmaXggPSBzdWZmaXgucmVwbGFjZSgnICcsICctJyk7CisgICAgICAgICAgICBjYXQgPSBjYXQgKyAiLiIgKyBzdWZmaXg7CisgICAgICAgIH0KKyAgICAgICAgUHJpbnRTdHJlYW0gdG1wT3V0ID0gU3lzdGVtLm91dDsKKyAgICAgICAgUHJpbnRTdHJlYW0gdG1wRXJyID0gU3lzdGVtLmVycjsKKyAgICAgICAgU3lzdGVtLnNldE91dChvdXQpOworICAgICAgICBTeXN0ZW0uc2V0RXJyKGVycik7CisKKyAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb2dGYWN0b3J5ID0gTG9nRmFjdG9yeS5nZXRGYWN0b3J5KCk7CisgICAgICAgICAgICB9IGNhdGNoIChMb2dDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgTG9nIGxvZyA9IGxvZ0ZhY3RvcnkuZ2V0SW5zdGFuY2UoY2F0KTsKKyAgICAgICAgU3lzdGVtLnNldE91dCh0bXBPdXQpOworICAgICAgICBTeXN0ZW0uc2V0RXJyKHRtcEVycik7CisgICAgICAgIHJldHVybiBsb2c7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIGNhdGVnb3J5U3RyaW5nID0gUFJPSkVDVF9MT0c7CisgICAgICAgIExvZyBsb2cgPSBnZXRMb2coY2F0ZWdvcnlTdHJpbmcsIG51bGwpOworCisgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgcmVhbExvZyhsb2csICJCdWlsZCBzdGFydGVkLiIsIFByb2plY3QuTVNHX0lORk8sIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5U3RyaW5nID0gUFJPSkVDVF9MT0c7CisgICAgICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKGNhdGVnb3J5U3RyaW5nLCBldmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgaWYgKGV2ZW50LmdldEV4Y2VwdGlvbigpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFsTG9nKGxvZywgIkJ1aWxkIGZpbmlzaGVkLiIsIFByb2plY3QuTVNHX0lORk8sIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWFsTG9nKGxvZywgIkJ1aWxkIGZpbmlzaGVkIHdpdGggZXJyb3IuIiwgUHJvamVjdC5NU0dfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RXhjZXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI3RhcmdldFN0YXJ0ZWQKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKFRBUkdFVF9MT0csCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAvLyBTaW5jZSB0YXNrIGxvZyBjYXRlZ29yeSBpbmNsdWRlcyB0YXJnZXQsIHdlIGRvbid0IHJlYWxseQorICAgICAgICAgICAgLy8gbmVlZCB0aGlzIG1lc3NhZ2UKKyAgICAgICAgICAgIHJlYWxMb2cobG9nLCAiU3RhcnQ6ICIgKyBldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgTG9nIGxvZyA9IGdldExvZyhUQVJHRVRfTE9HLAorICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKGV2ZW50LmdldEV4Y2VwdGlvbigpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFsTG9nKGxvZywgIlRhcmdldCBlbmQ6ICIgKyB0YXJnZXROYW1lLCBQcm9qZWN0Lk1TR19ERUJVRywgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlYWxMb2cobG9nLCAiVGFyZ2V0IFwiIiArIHRhcmdldE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGZpbmlzaGVkIHdpdGggZXJyb3IuIiwgUHJvamVjdC5NU0dfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RXhjZXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIFRhc2sgdGFzayA9IGV2ZW50LmdldFRhc2soKTsKKyAgICAgICAgICAgIE9iamVjdCByZWFsID0gdGFzazsKKyAgICAgICAgICAgIGlmICh0YXNrIGluc3RhbmNlb2YgVW5rbm93bkVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgcmVhbE9iaiA9ICgoVW5rbm93bkVsZW1lbnQpIHRhc2spLmdldFRhc2soKTsKKyAgICAgICAgICAgICAgICBpZiAocmVhbE9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWwgPSByZWFsT2JqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZyBsb2cgPSBnZXRMb2cocmVhbC5nZXRDbGFzcygpLmdldE5hbWUoKSwgbnVsbCk7CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZWFsTG9nKGxvZywgIlRhc2sgXCIiICsgdGFzay5nZXRUYXNrTmFtZSgpICsgIlwiIHN0YXJ0ZWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI3Rhc2tGaW5pc2hlZAorICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOworICAgICAgICAgICAgT2JqZWN0IHJlYWwgPSB0YXNrOworICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgICAgIE9iamVjdCByZWFsT2JqID0gKChVbmtub3duRWxlbWVudCkgdGFzaykuZ2V0VGFzaygpOworICAgICAgICAgICAgICAgIGlmIChyZWFsT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhbCA9IHJlYWxPYmo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nIGxvZyA9IGdldExvZyhyZWFsLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRFeGNlcHRpb24oKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWxMb2cobG9nLCAiVGFzayBcIiIgKyB0YXNrLmdldFRhc2tOYW1lKCkgKyAiXCIgZmluaXNoZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlYWxMb2cobG9nLCAiVGFzayBcIiIgKyB0YXNrLmdldFRhc2tOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGZpbmlzaGVkIHdpdGggZXJyb3IuIiwgUHJvamVjdC5NU0dfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RXhjZXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZAorICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIE9iamVjdCBjYXRlZ29yeU9iamVjdCA9IGV2ZW50LmdldFRhc2soKTsKKyAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeVN0cmluZyA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnlEZXRhaWwgPSBudWxsOworCisgICAgICAgICAgICBpZiAoY2F0ZWdvcnlPYmplY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhdGVnb3J5T2JqZWN0ID0gZXZlbnQuZ2V0VGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5T2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlPYmplY3QgPSBldmVudC5nZXRQcm9qZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5U3RyaW5nID0gUFJPSkVDVF9MT0c7CisgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5RGV0YWlsID0gZXZlbnQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVN0cmluZyA9IFRBUkdFVF9MT0c7CisgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5RGV0YWlsID0gZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSXQncyBhIHRhc2sgLSBhcHBlbmQgdGhlIHRhcmdldAorICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRUYXJnZXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5U3RyaW5nID0gY2F0ZWdvcnlPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5RGV0YWlsID0gZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5U3RyaW5nID0gY2F0ZWdvcnlPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZyBsb2cgPSBnZXRMb2coY2F0ZWdvcnlTdHJpbmcsIGNhdGVnb3J5RGV0YWlsKTsKKyAgICAgICAgICAgIGludCBwcmlvcml0eSA9IGV2ZW50LmdldFByaW9yaXR5KCk7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGV2ZW50LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHJlYWxMb2cobG9nLCBtZXNzYWdlLCBwcmlvcml0eSAsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWxMb2coTG9nIGxvZywgU3RyaW5nIG1lc3NhZ2UsIGludCBwcmlvcml0eSwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgUHJpbnRTdHJlYW0gdG1wT3V0ID0gU3lzdGVtLm91dDsKKyAgICAgICAgUHJpbnRTdHJlYW0gdG1wRXJyID0gU3lzdGVtLmVycjsKKyAgICAgICAgU3lzdGVtLnNldE91dChvdXQpOworICAgICAgICBTeXN0ZW0uc2V0RXJyKGVycik7CisgICAgICAgIHN3aXRjaCAocHJpb3JpdHkpIHsKKyAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfRVJSOgorICAgICAgICAgICAgICAgIGlmICh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtZXNzYWdlLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX1dBUk46CisgICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihtZXNzYWdlLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX0lORk86CisgICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhtZXNzYWdlLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX1ZFUkJPU0U6CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQcm9qZWN0Lk1TR19ERUJVRzoKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uc2V0T3V0KHRtcE91dCk7CisgICAgICAgIFN5c3RlbS5zZXRFcnIodG1wRXJyKTsKKyAgICB9CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIFByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7CisgICAgUHJpbnRTdHJlYW0gZXJyID0gU3lzdGVtLmVycjsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aGUgb3V0cHV0IGxldmVsLgorICAgICAqIFRoaXMgaXMgbm90IHVzZWQsIHRoZSBsb2dnZXIgY29uZmlnIGlzIHVzZWQgaW5zdGVhZC4KKyAgICAgKiBAcGFyYW0gbGV2ZWwgaWdub3JlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VPdXRwdXRMZXZlbChpbnQgbGV2ZWwpIHsKKyAgICAgICAgLy8gVXNlIHRoZSBsb2dnZXIgY29uZmlnCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgcHJpbnQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcmludFN0cmVhbShQcmludFN0cmVhbSBvdXRwdXQpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXRwdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGVtYWNzIG1vZGUuCisgICAgICogVGhpcyBpcyBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBlbWFjc01vZGUgaWdub3JlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVtYWNzTW9kZShib29sZWFuIGVtYWNzTW9kZSkgeworICAgICAgICAvLyBEb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIGMtbC4gVXNlIHRoZSBsb2dnZXIgY29uZmlnCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlcnJvciBwcmludCBzdHJlYW0uCisgICAgICogQHBhcmFtIGVyciB0aGUgZXJyb3Igc3RyZWFtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSBlcnIpIHsKKyAgICAgICAgdGhpcy5lcnIgPSBlcnI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Mb2c0akxpc3RlbmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Mb2c0akxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5ZDFlNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0xvZzRqTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLk51bGxFbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworCisvKioKKyAqICBMaXN0ZW5lciB3aGljaCBzZW5kcyBldmVudHMgdG8gTG9nNGogbG9nZ2luZyBzeXN0ZW0KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMb2c0akxpc3RlbmVyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7CisKKyAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBsaXN0ZW5lciB3YXMgaW5pdGlhbGl6ZWQuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBsb2cgY2F0ZWdvcnkgd2UgbG9nIGludG8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfQU5UID0gIm9yZy5hcGFjaGUudG9vbHMuYW50IjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB0aGUgbGlzdGVuZXIgYW5kIG1ha2Ugc3VyZSB0aGVyZSBpcyBhIHZhbGlkIGFwcGVuZGVyLgorICAgICAqLworICAgIHB1YmxpYyBMb2c0akxpc3RlbmVyKCkgeworICAgICAgICBpbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihMT0dfQU5UKTsKKyAgICAgICAgTG9nZ2VyIHJvb3RMb2cgPSBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpOworICAgICAgICBpZiAoIShyb290TG9nLmdldEFsbEFwcGVuZGVycygpIGluc3RhbmNlb2YgTnVsbEVudW1lcmF0aW9uKSkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nLmVycm9yKCJObyBsb2c0ai5wcm9wZXJ0aWVzIGluIGJ1aWxkIGFyZWEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciNidWlsZFN0YXJ0ZWQKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFByb2plY3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJCdWlsZCBzdGFydGVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI2J1aWxkRmluaXNoZWQKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihQcm9qZWN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJCdWlsZCBmaW5pc2hlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJCdWlsZCBmaW5pc2hlZCB3aXRoIGVycm9yLiIsIGV2ZW50LmdldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoVGFyZ2V0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICBsb2cuaW5mbygiVGFyZ2V0IFwiIiArIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSArICJcIiBzdGFydGVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lID0gZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgTG9nZ2VyIGNhdCA9IExvZ2dlci5nZXRMb2dnZXIoVGFyZ2V0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhdC5pbmZvKCJUYXJnZXQgXCIiICsgdGFyZ2V0TmFtZSArICJcIiBmaW5pc2hlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2F0LmVycm9yKCJUYXJnZXQgXCIiICsgdGFyZ2V0TmFtZQorICAgICAgICAgICAgICAgICAgICArICJcIiBmaW5pc2hlZCB3aXRoIGVycm9yLiIsIGV2ZW50LmdldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciN0YXNrU3RhcnRlZAorICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBUYXNrIHRhc2sgPSBldmVudC5nZXRUYXNrKCk7CisgICAgICAgICAgICBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcih0YXNrLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJUYXNrIFwiIiArIHRhc2suZ2V0VGFza05hbWUoKSArICJcIiBzdGFydGVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI3Rhc2tGaW5pc2hlZAorICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOworICAgICAgICAgICAgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIodGFzay5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJUYXNrIFwiIiArIHRhc2suZ2V0VGFza05hbWUoKSArICJcIiBmaW5pc2hlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJUYXNrIFwiIiArIHRhc2suZ2V0VGFza05hbWUoKQorICAgICAgICAgICAgICAgICAgICArICJcIiBmaW5pc2hlZCB3aXRoIGVycm9yLiIsIGV2ZW50LmdldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciNtZXNzYWdlTG9nZ2VkCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgT2JqZWN0IGNhdGVnb3J5T2JqZWN0ID0gZXZlbnQuZ2V0VGFzaygpOworICAgICAgICAgICAgaWYgKGNhdGVnb3J5T2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYXRlZ29yeU9iamVjdCA9IGV2ZW50LmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeU9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5T2JqZWN0ID0gZXZlbnQuZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyIGxvZworICAgICAgICAgICAgICAgID0gTG9nZ2VyLmdldExvZ2dlcihjYXRlZ29yeU9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldFByaW9yaXR5KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX0VSUjoKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGV2ZW50LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvamVjdC5NU0dfV0FSTjoKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oZXZlbnQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQcm9qZWN0Lk1TR19JTkZPOgorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhldmVudC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX1ZFUkJPU0U6CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhldmVudC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX0RFQlVHOgorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoZXZlbnQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGV2ZW50LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvTWFpbExvZ2dlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvTWFpbExvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNzMyYjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9NYWlsTG9nZ2VyLmphdmEKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRlZmF1bHRMb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5FbWFpbEFkZHJlc3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5NYWlsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5DbGFzc3BhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRhdGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZTsKKworLyoqCisgKiAgQnVmZmVycyBsb2cgbWVzc2FnZXMgZnJvbSBEZWZhdWx0TG9nZ2VyLCBhbmQgc2VuZHMgYW4gZS1tYWlsIHdpdGggdGhlCisgKiAgcmVzdWx0cy4gVGhlIGZvbGxvd2luZyBQcm9qZWN0IHByb3BlcnRpZXMgYXJlIHVzZWQgdG8gc2VuZCB0aGUgbWFpbC4KKyAqICA8dWw+CisgKiAgICA8bGk+IE1haWxMb2dnZXIubWFpbGhvc3QgW2RlZmF1bHQ6IGxvY2FsaG9zdF0gLSBNYWlsIHNlcnZlciB0byB1c2U8L2xpPgorICogICAgPGxpPiBNYWlsTG9nZ2VyLnBvcnQgW2RlZmF1bHQ6IDI1XSAtIERlZmF1bHQgcG9ydCBmb3IgU01UUCA8L2xpPgorICogICAgPGxpPiBNYWlsTG9nZ2VyLmZyb20gW3JlcXVpcmVkXSAtIE1haWwgImZyb20iIGFkZHJlc3M8L2xpPgorICogICAgPGxpPiBNYWlsTG9nZ2VyLmZhaWx1cmUubm90aWZ5IFtkZWZhdWx0OiB0cnVlXSAtIFNlbmQgYnVpbGQgZmFpbHVyZQorICogICAgZS1tYWlscz88L2xpPgorICogICAgPGxpPiBNYWlsTG9nZ2VyLnN1Y2Nlc3Mubm90aWZ5IFtkZWZhdWx0OiB0cnVlXSAtIFNlbmQgYnVpbGQgc3VjY2VzcworICogICAgZS1tYWlscz88L2xpPgorICogICAgPGxpPiBNYWlsTG9nZ2VyLmZhaWx1cmUudG8gW3JlcXVpcmVkIGlmIGZhaWx1cmUgbWFpbCB0byBiZSBzZW50XSAtIEFkZHJlc3MKKyAqICAgIHRvIHNlbmQgZmFpbHVyZSBtZXNzYWdlcyB0bzwvbGk+CisgKiAgICA8bGk+IE1haWxMb2dnZXIuc3VjY2Vzcy50byBbcmVxdWlyZWQgaWYgc3VjY2VzcyBtYWlsIHRvIGJlIHNlbnRdIC0gQWRkcmVzcworICogICAgdG8gc2VuZCBzdWNjZXNzIG1lc3NhZ2VzIHRvPC9saT4KKyAqICAgIDxsaT4gTWFpbExvZ2dlci5mYWlsdXJlLnN1YmplY3QgW2RlZmF1bHQ6ICJCdWlsZCBGYWlsdXJlIl0gLSBTdWJqZWN0IG9mCisgKiAgICBmYWlsZWQgYnVpbGQ8L2xpPgorICogICAgPGxpPiBNYWlsTG9nZ2VyLnN1Y2Nlc3Muc3ViamVjdCBbZGVmYXVsdDogIkJ1aWxkIFN1Y2Nlc3MiXSAtIFN1YmplY3Qgb2YKKyAqICAgIHN1Y2Nlc3NmdWwgYnVpbGQ8L2xpPgorICogIDwvdWw+CisgKiAgVGhlc2UgcHJvcGVydGllcyBhcmUgc2V0IHVzaW5nIHN0YW5kYXJkIEFudCBwcm9wZXJ0eSBzZXR0aW5nIG1lY2hhbmlzbXMKKyAqICAoJmx0O3Byb3BlcnR5Jmd0OywgY29tbWFuZC1saW5lIC1ELCBldGMpLiBBbnQgcHJvcGVydGllcyBjYW4gYmUgb3ZlcnJpZGRlbgorICogIGJ5IHNwZWNpZnlpbmcgdGhlIGZpbGVuYW1lIG9mIGEgcHJvcGVydGllcyBmaWxlIGluIHRoZSA8aT4KKyAqICBNYWlsTG9nZ2VyLnByb3BlcnRpZXMuZmlsZSBwcm9wZXJ0eTwvaT4gLiBBbnkgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoYXQKKyAqICBmaWxlIHdpbGwgb3ZlcnJpZGUgQW50IHByb3BlcnRpZXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgTWFpbExvZ2dlciBleHRlbmRzIERlZmF1bHRMb2dnZXIgeworICAgIC8qKiBCdWZmZXIgaW4gd2hpY2ggdGhlIG1lc3NhZ2UgaXMgY29uc3RydWN0ZWQgcHJpb3IgdG8gc2VuZGluZyAqLworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgIC8qKgorICAgICAqICBTZW5kcyBhbiBlLW1haWwgd2l0aCB0aGUgbG9nIHJlc3VsdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGJ1aWxkIGZpbmlzaGVkIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHN1cGVyLmJ1aWxkRmluaXNoZWQoZXZlbnQpOworCisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGV2ZW50LmdldFByb2plY3QoKTsKKyAgICAgICAgSGFzaHRhYmxlIHByb3BlcnRpZXMgPSBwcm9qZWN0LmdldFByb3BlcnRpZXMoKTsKKworICAgICAgICAvLyBvdmVybGF5IHNwZWNpZmllZCBwcm9wZXJ0aWVzIGZpbGUgKGlmIGFueSksIHdoaWNoIG92ZXJyaWRlcyBwcm9qZWN0CisgICAgICAgIC8vIHNldHRpbmdzCisgICAgICAgIFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldCgiTWFpbExvZ2dlci5wcm9wZXJ0aWVzLmZpbGUiKTsKKyAgICAgICAgaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy5sb2FkKGlzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBiZWNhdXNlIHByb3BlcnRpZXMgZmlsZSBpcyBub3QgcmVxdWlyZWQKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZmlsZVByb3BlcnRpZXMua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbGVQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChrZXksIHByb2plY3QucmVwbGFjZVByb3BlcnRpZXModmFsdWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IChldmVudC5nZXRFeGNlcHRpb24oKSA9PSBudWxsKTsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9IHN1Y2Nlc3MgPyAic3VjY2VzcyIgOiAiZmFpbHVyZSI7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJvb2xlYW4gbm90aWZ5ID0gUHJvamVjdC50b0Jvb2xlYW4oZ2V0VmFsdWUocHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgIi5ub3RpZnkiLCAib24iKSk7CisKKyAgICAgICAgICAgIGlmICghbm90aWZ5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVmFsdWVzIHZhbHVlcyA9IG5ldyBWYWx1ZXMoKQorICAgICAgICAgICAgICAgIC5tYWlsaG9zdChnZXRWYWx1ZShwcm9wZXJ0aWVzLCAibWFpbGhvc3QiLCAibG9jYWxob3N0IikpCisgICAgICAgICAgICAgICAgLnBvcnQoSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLCAicG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihNYWlsTWVzc2FnZS5ERUZBVUxUX1BPUlQpKSkpCisgICAgICAgICAgICAgICAgLnVzZXIoZ2V0VmFsdWUocHJvcGVydGllcywgInVzZXIiLCAiIikpCisgICAgICAgICAgICAgICAgLnBhc3N3b3JkKGdldFZhbHVlKHByb3BlcnRpZXMsICJwYXNzd29yZCIsICIiKSkKKyAgICAgICAgICAgICAgICAuc3NsKFByb2plY3QudG9Cb29sZWFuKGdldFZhbHVlKHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3NsIiwgIm9mZiIpKSkKKyAgICAgICAgICAgICAgICAuZnJvbShnZXRWYWx1ZShwcm9wZXJ0aWVzLCAiZnJvbSIsIG51bGwpKQorICAgICAgICAgICAgICAgIC5yZXBseXRvTGlzdChnZXRWYWx1ZShwcm9wZXJ0aWVzLCAicmVwbHl0byIsICIiKSkKKyAgICAgICAgICAgICAgICAudG9MaXN0KGdldFZhbHVlKHByb3BlcnRpZXMsIHByZWZpeCArICIudG8iLCBudWxsKSkKKyAgICAgICAgICAgICAgICAuc3ViamVjdChnZXRWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcywgcHJlZml4ICsgIi5zdWJqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1Y2Nlc3MpID8gIkJ1aWxkIFN1Y2Nlc3MiIDogIkJ1aWxkIEZhaWx1cmUiKSk7CisgICAgICAgICAgICBpZiAodmFsdWVzLnVzZXIoKS5lcXVhbHMoIiIpCisgICAgICAgICAgICAgICAgJiYgdmFsdWVzLnBhc3N3b3JkKCkuZXF1YWxzKCIiKQorICAgICAgICAgICAgICAgICYmICF2YWx1ZXMuc3NsKCkpIHsKKyAgICAgICAgICAgICAgICBzZW5kTWFpbCh2YWx1ZXMsIGJ1ZmZlci5zdWJzdHJpbmcoMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZW5kTWltZU1haWwoCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb2plY3QoKSwgdmFsdWVzLCBidWZmZXIuc3Vic3RyaW5nKDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWFpbExvZ2dlciBmYWlsZWQgdG8gc2VuZCBlLW1haWwhIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZhbHVlcyB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1haWxob3N0OworICAgICAgICBwdWJsaWMgU3RyaW5nIG1haWxob3N0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1haWxob3N0OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBWYWx1ZXMgbWFpbGhvc3QoU3RyaW5nIG1haWxob3N0KSB7CisgICAgICAgICAgICB0aGlzLm1haWxob3N0ID0gbWFpbGhvc3Q7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGludCBwb3J0OworICAgICAgICBwdWJsaWMgaW50IHBvcnQoKSB7CisgICAgICAgICAgICByZXR1cm4gcG9ydDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVmFsdWVzIHBvcnQoaW50IHBvcnQpIHsKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIFN0cmluZyB1c2VyOworICAgICAgICBwdWJsaWMgU3RyaW5nIHVzZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gdXNlcjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVmFsdWVzIHVzZXIoU3RyaW5nIHVzZXIpIHsKKyAgICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKKyAgICAgICAgcHVibGljIFN0cmluZyBwYXNzd29yZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzd29yZDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVmFsdWVzIHBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNzbDsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3NsKCkgeworICAgICAgICAgICAgcmV0dXJuIHNzbDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVmFsdWVzIHNzbChib29sZWFuIHNzbCkgeworICAgICAgICAgICAgdGhpcy5zc2wgPSBzc2w7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIFN0cmluZyBmcm9tOworICAgICAgICBwdWJsaWMgU3RyaW5nIGZyb20oKSB7CisgICAgICAgICAgICByZXR1cm4gZnJvbTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVmFsdWVzIGZyb20oU3RyaW5nIGZyb20pIHsKKyAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIFN0cmluZyByZXBseXRvTGlzdDsKKyAgICAgICAgcHVibGljIFN0cmluZyByZXBseXRvTGlzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXBseXRvTGlzdDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVmFsdWVzIHJlcGx5dG9MaXN0KFN0cmluZyByZXBseXRvTGlzdCkgeworICAgICAgICAgICAgdGhpcy5yZXBseXRvTGlzdCA9IHJlcGx5dG9MaXN0OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG9MaXN0OworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvTGlzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0b0xpc3Q7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFZhbHVlcyB0b0xpc3QoU3RyaW5nIHRvTGlzdCkgeworICAgICAgICAgICAgdGhpcy50b0xpc3QgPSB0b0xpc3Q7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIFN0cmluZyBzdWJqZWN0OworICAgICAgICBwdWJsaWMgU3RyaW5nIHN1YmplY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gc3ViamVjdDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVmFsdWVzIHN1YmplY3QoU3RyaW5nIHN1YmplY3QpIHsKKyAgICAgICAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBSZWNlaXZlcyBhbmQgYnVmZmVycyBsb2cgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBiZWluZyBsb2dnZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChtZXNzYWdlKS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIEdldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHByb3BlcnRpZXMgICAgIFByb3BlcnRpZXMgdG8gb2J0YWluIHZhbHVlIGZyb20KKyAgICAgKiBAcGFyYW0gIG5hbWUgICAgICAgICAgIHN1ZmZpeCBvZiBwcm9wZXJ0eSBuYW1lLiAiTWFpbExvZ2dlci4iIHdpbGwgYmUKKyAgICAgKiAgICAgIHByZXBlbmRlZCBpbnRlcm5hbGx5LgorICAgICAqIEBwYXJhbSAgZGVmYXVsdFZhbHVlICAgdmFsdWUgcmV0dXJuZWQgaWYgbm90IHByZXNlbnQgaW4gdGhlIHByb3BlcnRpZXMuCisgICAgICogICAgICBTZXQgdG8gbnVsbCB0byBtYWtlIHJlcXVpcmVkLgorICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBAZXhjZXB0aW9uICBFeGNlcHRpb24gIHRocm93biBpZiBubyBkZWZhdWx0IHZhbHVlIGlzIHNwZWNpZmllZCBhbmQgdGhlCisgICAgICogICAgICBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCBpbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFZhbHVlKEhhc2h0YWJsZSBwcm9wZXJ0aWVzLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9ICJNYWlsTG9nZ2VyLiIgKyBuYW1lOworICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOworCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogIiArIHByb3BlcnR5TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgU2VuZCB0aGUgbWFpbAorICAgICAqIEBwYXJhbSAgdmFsdWVzICAgICAgICAgICB0aGUgdmFyaW91cyB2YWx1ZXMuCisgICAgICogQHBhcmFtICBtZXNzYWdlICAgICAgICAgIG1haWwgYm9keQorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICB0aHJvd24gaWYgc2VuZGluZyBtZXNzYWdlIGZhaWxzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRNYWlsKFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNYWlsTWVzc2FnZSBtYWlsTWVzc2FnZSA9IG5ldyBNYWlsTWVzc2FnZSgKKyAgICAgICAgICAgIHZhbHVlcy5tYWlsaG9zdCgpLCB2YWx1ZXMucG9ydCgpKTsKKyAgICAgICAgbWFpbE1lc3NhZ2Uuc2V0SGVhZGVyKCJEYXRlIiwgRGF0ZVV0aWxzLmdldERhdGVGb3JIZWFkZXIoKSk7CisKKyAgICAgICAgbWFpbE1lc3NhZ2UuZnJvbSh2YWx1ZXMuZnJvbSgpKTsKKyAgICAgICAgaWYgKCF2YWx1ZXMucmVwbHl0b0xpc3QoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCisgICAgICAgICAgICAgICAgdmFsdWVzLnJlcGx5dG9MaXN0KCksICIsICIsIGZhbHNlKTsKKyAgICAgICAgICAgIHdoaWxlICh0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIG1haWxNZXNzYWdlLnJlcGx5dG8odC5uZXh0VG9rZW4oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHQgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlcy50b0xpc3QoKSwgIiwgIiwgZmFsc2UpOworICAgICAgICB3aGlsZSAodC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIG1haWxNZXNzYWdlLnRvKHQubmV4dFRva2VuKCkpOworICAgICAgICB9CisKKyAgICAgICAgbWFpbE1lc3NhZ2Uuc2V0U3ViamVjdCh2YWx1ZXMuc3ViamVjdCgpKTsKKworICAgICAgICBQcmludFN0cmVhbSBwcyA9IG1haWxNZXNzYWdlLmdldFByaW50U3RyZWFtKCk7CisgICAgICAgIHBzLnByaW50bG4obWVzc2FnZSk7CisKKyAgICAgICAgbWFpbE1lc3NhZ2Uuc2VuZEFuZENsb3NlKCk7CisgICAgfQorICAgIC8qKgorICAgICAqICBTZW5kIHRoZSBtYWlsICAoTWltZU1haWwpCisgICAgICogQHBhcmFtICBwcm9qZWN0ICAgICAgICAgIGN1cnJlbnQgYW50IHByb2plY3QKKyAgICAgKiBAcGFyYW0gIHZhbHVlcyAgICAgICAgICAgdmFyaW91cyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gIG1lc3NhZ2UgICAgICAgICAgbWFpbCBib2R5CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRNaW1lTWFpbChQcm9qZWN0IHByb2plY3QsIFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIC8vIGNvbnZlcnQgdGhlIHJlcGx5VG8gc3RyaW5nIGludG8gYSB2ZWN0b3Igb2YgZW1haWxhZGRyZXNzZXMKKyAgICAgICAgTWFpbGVyIG1haWxlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYWlsZXIgPSAoTWFpbGVyKSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLk1pbWVNYWlsZXIiLAorICAgICAgICAgICAgICAgICAgICBNYWlsTG9nZ2VyLmNsYXNzLmdldENsYXNzTG9hZGVyKCksIE1haWxlci5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZS5nZXRDYXVzZSgpID09IG51bGwgPyBlIDogZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gaW5pdGlhbGlzZSBNSU1FIG1haWw6ICIgKyB0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVmVjdG9yIHJlcGx5VG9MaXN0ID0gdmVjdG9yaXplRW1haWxBZGRyZXNzZXModmFsdWVzLnJlcGx5dG9MaXN0KCkpOworICAgICAgICBtYWlsZXIuc2V0SG9zdCh2YWx1ZXMubWFpbGhvc3QoKSk7CisgICAgICAgIG1haWxlci5zZXRQb3J0KHZhbHVlcy5wb3J0KCkpOworICAgICAgICBtYWlsZXIuc2V0VXNlcih2YWx1ZXMudXNlcigpKTsKKyAgICAgICAgbWFpbGVyLnNldFBhc3N3b3JkKHZhbHVlcy5wYXNzd29yZCgpKTsKKyAgICAgICAgbWFpbGVyLnNldFNTTCh2YWx1ZXMuc3NsKCkpOworICAgICAgICBNZXNzYWdlIG15bWVzc2FnZSA9IG5ldyBNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICBteW1lc3NhZ2Uuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgbWFpbGVyLnNldE1lc3NhZ2UobXltZXNzYWdlKTsKKyAgICAgICAgbWFpbGVyLnNldEZyb20obmV3IEVtYWlsQWRkcmVzcyh2YWx1ZXMuZnJvbSgpKSk7CisgICAgICAgIG1haWxlci5zZXRSZXBseVRvTGlzdChyZXBseVRvTGlzdCk7CisgICAgICAgIFZlY3RvciB0b0xpc3QgPSB2ZWN0b3JpemVFbWFpbEFkZHJlc3Nlcyh2YWx1ZXMudG9MaXN0KCkpOworICAgICAgICBtYWlsZXIuc2V0VG9MaXN0KHRvTGlzdCk7CisgICAgICAgIG1haWxlci5zZXRDY0xpc3QobmV3IFZlY3RvcigpKTsKKyAgICAgICAgbWFpbGVyLnNldEJjY0xpc3QobmV3IFZlY3RvcigpKTsKKyAgICAgICAgbWFpbGVyLnNldEZpbGVzKG5ldyBWZWN0b3IoKSk7CisgICAgICAgIG1haWxlci5zZXRTdWJqZWN0KHZhbHVlcy5zdWJqZWN0KCkpOworICAgICAgICBtYWlsZXIuc2VuZCgpOworICAgIH0KKyAgICBwcml2YXRlIFZlY3RvciB2ZWN0b3JpemVFbWFpbEFkZHJlc3NlcyhTdHJpbmcgbGlzdFN0cmluZykgeworICAgICAgICBWZWN0b3IgZW1haWxMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaXN0U3RyaW5nLCAiLCIpOworICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgZW1haWxMaXN0LmFkZEVsZW1lbnQobmV3IEVtYWlsQWRkcmVzcyh0b2tlbnMubmV4dFRva2VuKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW1haWxMaXN0OworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Qcm9maWxlTG9nZ2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Qcm9maWxlTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxN2I3NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL1Byb2ZpbGVMb2dnZXIuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoNCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICoNCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7DQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRlZmF1bHRMb2dnZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7DQorDQorLyoqDQorICogVGhpcyBpcyBhIHNwZWNpYWwgbG9nZ2VyIHRoYXQgaXMgZGVzaWduZWQgdG8gcHJvZmlsZSBidWlsZHMuDQorICoNCisgKiBAc2luY2UgQW50MS44DQorICovDQorcHVibGljIGNsYXNzIFByb2ZpbGVMb2dnZXIgZXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHsNCisNCisgICAgcHJpdmF0ZSBNYXAgcHJvZmlsZURhdGEgPSBuZXcgSGFzaE1hcCgpOyAvLyA8T2JqZWN0LCBEYXRlPg0KKw0KKyAgICAvKioNCisgICAgICogTG9ncyBhIG1lc3NhZ2UgdG8gc2F5IHRoYXQgdGhlIHRhcmdldCBoYXMgc3RhcnRlZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGV2ZW50DQorICAgICAqICAgICAgICAgICAgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uIE11c3Qgbm90IGJlDQorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsNCisgICAgICAgIERhdGUgbm93ID0gbmV3IERhdGUoKTsNCisgICAgICAgIFN0cmluZyBuYW1lID0gIlRhcmdldCAiICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpOw0KKyAgICAgICAgbG9nU3RhcnQoZXZlbnQsIG5vdywgbmFtZSk7DQorICAgICAgICBwcm9maWxlRGF0YS5wdXQoZXZlbnQuZ2V0VGFyZ2V0KCksIG5vdyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIExvZ3MgYSBtZXNzYWdlIHRvIHNheSB0aGF0IHRoZSB0YXJnZXQgaGFzIGZpbmlzaGVkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZXZlbnQNCisgICAgICogICAgICAgICAgICBBbiBldmVudCB3aXRoIGFueSByZWxldmFudCBleHRyYSBpbmZvcm1hdGlvbi4gTXVzdCBub3QgYmUNCisgICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsNCisgICAgICAgIERhdGUgc3RhcnQgPSAoRGF0ZSkgcHJvZmlsZURhdGEucmVtb3ZlKGV2ZW50LmdldFRhcmdldCgpKTsNCisgICAgICAgIFN0cmluZyBuYW1lID0gIlRhcmdldCAiICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpOw0KKyAgICAgICAgbG9nRmluaXNoKGV2ZW50LCBzdGFydCwgbmFtZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIExvZ3MgYSBtZXNzYWdlIHRvIHNheSB0aGF0IHRoZSB0YXNrIGhhcyBzdGFydGVkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZXZlbnQNCisgICAgICogICAgICAgICAgICBBbiBldmVudCB3aXRoIGFueSByZWxldmFudCBleHRyYSBpbmZvcm1hdGlvbi4gTXVzdCBub3QgYmUNCisgICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsNCisgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCk7DQorICAgICAgICBEYXRlIG5vdyA9IG5ldyBEYXRlKCk7DQorICAgICAgICBsb2dTdGFydChldmVudCwgbm93LCBuYW1lKTsNCisgICAgICAgIHByb2ZpbGVEYXRhLnB1dChldmVudC5nZXRUYXNrKCksIG5vdyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIExvZ3MgYSBtZXNzYWdlIHRvIHNheSB0aGF0IHRoZSB0YXNrIGhhcyBmaW5pc2hlZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGV2ZW50DQorICAgICAqICAgICAgICAgICAgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uIE11c3Qgbm90IGJlDQorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgew0KKyAgICAgICAgRGF0ZSBzdGFydCA9IChEYXRlKSBwcm9maWxlRGF0YS5yZW1vdmUoZXZlbnQuZ2V0VGFzaygpKTsNCisgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCk7DQorICAgICAgICBsb2dGaW5pc2goZXZlbnQsIHN0YXJ0LCBuYW1lKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgbG9nRmluaXNoKEJ1aWxkRXZlbnQgZXZlbnQsIERhdGUgc3RhcnQsIFN0cmluZyBuYW1lKSB7DQorICAgICAgICBEYXRlIG5vdyA9IG5ldyBEYXRlKCk7DQorICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsNCisgICAgICAgIGlmIChzdGFydCAhPSBudWxsKSB7DQorICAgICAgICAgICAgbG9uZyBkaWZmID0gbm93LmdldFRpbWUoKSAtIHN0YXJ0LmdldFRpbWUoKTsNCisgICAgICAgICAgICBtc2cgPSBTdHJpbmdVdGlscy5MSU5FX1NFUCArIG5hbWUgKyAiOiBmaW5pc2hlZCIgKyBub3cgKyAiICgiDQorICAgICAgICAgICAgICAgICAgICArIGRpZmYgKyAibXMpIjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbXNnID0gU3RyaW5nVXRpbHMuTElORV9TRVAgKyBuYW1lICsgIjogZmluaXNoZWQiICsgbm93DQorICAgICAgICAgICAgICAgICAgICArICIgKHVua25vd24gZHVyYXRpb24sIHN0YXJ0IG5vdCBkZXRlY3RlZCkiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJpbnRNZXNzYWdlKG1zZywgb3V0LCBldmVudC5nZXRQcmlvcml0eSgpKTsNCisgICAgICAgIGxvZyhtc2cpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBsb2dTdGFydChCdWlsZEV2ZW50IGV2ZW50LCBEYXRlIHN0YXJ0LCBTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZ1V0aWxzLkxJTkVfU0VQICsgbmFtZSArICI6IHN0YXJ0ZWQgIiArIHN0YXJ0Ow0KKyAgICAgICAgcHJpbnRNZXNzYWdlKG1zZywgb3V0LCBldmVudC5nZXRQcmlvcml0eSgpKTsNCisgICAgICAgIGxvZyhtc2cpOw0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL1RpbWVzdGFtcGVkTG9nZ2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9UaW1lc3RhbXBlZExvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjk2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9UaW1lc3RhbXBlZExvZ2dlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRlZmF1bHRMb2dnZXI7CisKKy8qKgorICogTGlrZSBhIG5vcm1hbCBsb2dnZXIsIGV4Y2VwdCB3aXRoIHRpbWVkIG91dHB1dHMKKyAqLworcHVibGljIGNsYXNzIFRpbWVzdGFtcGVkTG9nZ2VyIGV4dGVuZHMgRGVmYXVsdExvZ2dlciB7CisKKyAgICAvKioKKyAgICAgKiB3aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgb2xkIG1lc3NhZ2UgYW5kIHRoZSBuZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRVIgPSAiIC0gYXQgIjsKKworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludDogdGhlIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBhIGJ1aWxkIGZhaWxlZC4KKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBjaGFuZ2UvZW5oYW5jZSB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNsYXNzaWMgIkJVSUxEIEZBSUxFRCIgcGx1cyBhIHRpbWVzdGFtcAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVpbGRGYWlsZWRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QnVpbGRGYWlsZWRNZXNzYWdlKCkgKyBTUEFDRVIgKyBnZXRUaW1lc3RhbXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGFuIG92ZXJyaWRlIHBvaW50OiB0aGUgbWVzc2FnZSB0aGF0IGluZGljYXRlcyB0aGF0IGEgYnVpbGQgc3VjY2VlZGVkLgorICAgICAqIFN1YmNsYXNzZXMgY2FuIGNoYW5nZS9lbmhhbmNlIHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY2xhc3NpYyAiQlVJTEQgU1VDQ0VTU0ZVTCIgcGx1cyBhIHRpbWVzdGFtcAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVpbGRTdWNjZXNzZnVsTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEJ1aWxkU3VjY2Vzc2Z1bE1lc3NhZ2UoKSArIFNQQUNFUiArIGdldFRpbWVzdGFtcCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvZGVmYXVsdHMucHJvcGVydGllcyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL2RlZmF1bHRzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5NDM4MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL2RlZmF1bHRzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1OCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgICAgICAgICAgQU5TSSBDT0xPUiBMT0dHRVIgQ09ORklHVVJBVElPTgorIworIyBGb3JtYXQgZm9yIEFuc2lDb2xvckxvZ2dlci4qPQorIyAgQXR0cmlidXRlO0ZvcmVncm91bmQ7QmFja2dyb3VuZAorIworIyAgQXR0cmlidXRlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorIyAgMCAtPiBSZXNldCBBbGwgQXR0cmlidXRlcyAocmV0dXJuIHRvIG5vcm1hbCBtb2RlKQorIyAgMSAtPiBCcmlnaHQgKFVzdWFsbHkgdHVybnMgb24gQk9MRCkKKyMgIDIgLT4gRGltCisjICAzIC0+IFVuZGVybGluZQorIyAgNSAtPiBsaW5rCisjICA3IC0+IFJldmVyc2UKKyMgIDggLT4gSGlkZGVuCisjCisjICBGb3JlZ3JvdW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorIyAgMzAgLT4gQmxhY2sKKyMgIDMxIC0+IFJlZAorIyAgMzIgLT4gR3JlZW4KKyMgIDMzIC0+IFllbGxvdworIyAgMzQgLT4gQmx1ZQorIyAgMzUgLT4gTWFnZW50YQorIyAgMzYgLT4gQ3lhbgorIyAgMzcgLT4gV2hpdGUKKyMKKyMgIEJhY2tncm91bmQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisjICA0MCAtPiBCbGFjaworIyAgNDEgLT4gUmVkCisjICA0MiAtPiBHcmVlbgorIyAgNDMgLT4gWWVsbG93CisjICA0NCAtPiBCbHVlCisjICA0NSAtPiBNYWdlbnRhCisjICA0NiAtPiBDeWFuCisjICA0NyAtPiBXaGl0ZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitBbnNpQ29sb3JMb2dnZXIuRVJST1JfQ09MT1I9MjszMQorQW5zaUNvbG9yTG9nZ2VyLldBUk5JTkdfQ09MT1I9MjszNQorQW5zaUNvbG9yTG9nZ2VyLklORk9fQ09MT1I9MjszNgorQW5zaUNvbG9yTG9nZ2VyLlZFUkJPU0VfQ09MT1I9MjszMgorQW5zaUNvbG9yTG9nZ2VyLkRFQlVHX0NPTE9SPTI7MzQKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xvYWRlci9BbnRDbGFzc0xvYWRlcjIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xvYWRlci9BbnRDbGFzc0xvYWRlcjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRjYWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbG9hZGVyL0FudENsYXNzTG9hZGVyMi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5sb2FkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKKworLyoqCisgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjcKKyAqICAgICAgICAgICAgIEp1c3QgdXNlIHtAbGluayBBbnRDbGFzc0xvYWRlcn0gaXRzZWxmLgorICovCitwdWJsaWMgY2xhc3MgQW50Q2xhc3NMb2FkZXIyIGV4dGVuZHMgQW50Q2xhc3NMb2FkZXIgeworICAgIC8qKiBObyBhcmdzIGNvbnN0cnVjdG9yLiAqLworICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlcjIoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvR2V0UHJvcGVydHkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L0dldFByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhMmJhYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L0dldFByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5wcm9wZXJ0eTsKKworLyoqIEludGVyZmFjZSB0byBhIGNsYXNzIChub3JtYWxseSBQcm9wZXJ0eUhlbHBlcikgdG8gZ2V0IGEgcHJvcGVydHkgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR2V0UHJvcGVydHkgeworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgaWYgaXQgaXMgc2V0LgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlLCBvciBudWxsIGZvciBubyBtYXRjaCBvciBmb3IgbmFtZSBiZWluZyBudWxsLgorICAgICAqLworICAgIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9OdWxsUmV0dXJuLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9OdWxsUmV0dXJuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxMmFmZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L051bGxSZXR1cm4uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnByb3BlcnR5OworCisvKiogQ2xhc3MgdG8gcmVwcmVzZW50IGEgbnVsbCBhbmQgdG8gc3RvcCB0aGUgY2hhaW4gb2YgbG9va3Vwcy4gKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsUmV0dXJuIHsKKyAgICAvKiogYSB2YWx1ZSB0byB1c2UgaW4gYSBwcm9wZXJ0eSBoZWxwZXIgdG8gc3RvcCBsb29raW5nIHByb3BlcnRpZXMgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE51bGxSZXR1cm4gTlVMTCA9IG5ldyBOdWxsUmV0dXJuKCk7CisKKyAgICAvKiogUHJpdmF0ZSBjb25zdHJ1Y3RvciAqLworICAgIHByaXZhdGUgTnVsbFJldHVybigpIHsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1BhcnNlTmV4dFByb3BlcnR5LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9QYXJzZU5leHRQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZGRhNzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9QYXJzZU5leHRQcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHk7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKiBJbnRlcmZhY2UgdG8gcGFyc2UgYSBwcm9wZXJ0eSAqLworcHVibGljIGludGVyZmFjZSBQYXJzZU5leHRQcm9wZXJ0eSB7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBhbnQgcHJvamVjdC4KKyAgICAgKi8KKyAgICBQcm9qZWN0IGdldFByb2plY3QoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbnkgcHJvcGVydHkgdGhhdCBjYW4gYmUgcGFyc2VkIGZyb20gdGhlIHNwZWNpZmllZCBwb3NpdGlvbgorICAgICAqIGluIHRoZSBzcGVjaWZpZWQgU3RyaW5nLgorICAgICAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgdG8gcGFyc2UKKyAgICAgKiBAcGFyYW0gcG9zIFBhcnNlUG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIE9iamVjdCBvciBudWxsIGlmIG5vIHByb3BlcnR5IGlzIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgorICAgICAqLworICAgIE9iamVjdCBwYXJzZU5leHRQcm9wZXJ0eShTdHJpbmcgdmFsdWUsIFBhcnNlUG9zaXRpb24gcG9zKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1BhcnNlUHJvcGVydGllcy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvUGFyc2VQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiMjU4NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1BhcnNlUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnByb3BlcnR5OworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogUGFyc2UgcHJvcGVydGllcyB1c2luZyBhIGNvbGxlY3Rpb24gb2YgZXhwYW5kZXJzLgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VQcm9wZXJ0aWVzIGltcGxlbWVudHMgUGFyc2VOZXh0UHJvcGVydHkgeworCisgICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0IHByb2plY3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBHZXRQcm9wZXJ0eSBnZXRQcm9wZXJ0eTsKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gZXhwYW5kZXJzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igd2l0aCBhIGdldFByb3BlcnR5LgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IGFudCBwcm9qZWN0LgorICAgICAqIEBwYXJhbSBleHBhbmRlcnMgYSBzZXF1ZW5jZSBvZiBleGFwYW5kZXJzCisgICAgICogQHBhcmFtIGdldFByb3BlcnR5IHByb3BlcnR5IHJlc29sdmVyLgorICAgICAqLworICAgIHB1YmxpYyBQYXJzZVByb3BlcnRpZXMoCisgICAgICAgIFByb2plY3QgcHJvamVjdCwgQ29sbGVjdGlvbiBleHBhbmRlcnMsIEdldFByb3BlcnR5IGdldFByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgICAgIHRoaXMuZXhwYW5kZXJzID0gZXhwYW5kZXJzOworICAgICAgICB0aGlzLmdldFByb3BlcnR5ID0gZ2V0UHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm9qZWN0LgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYW50IHByb2plY3QuCisgICAgICovCisgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIHByb3BlcnRpZXMgZnJvbSBhIFN0cmluZyByZXByZXNlbnRhdGlvbi4gIElmIHRoZSBlbnRpcmUKKyAgICAgKiBjb250ZW50cyBvZiB0aGUgU3RyaW5nIHJlc29sdmUgdG8gYSBzaW5nbGUgcHJvcGVydHksIHRoYXQgdmFsdWUKKyAgICAgKiBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSBhIFN0cmluZyBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHRvIGJlIHNjYW5uZWQgZm9yIHByb3BlcnR5IHJlZmVyZW5jZXMuCisgICAgICogICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiwgaW4gd2hpY2ggY2FzZSB0aGlzCisgICAgICogICAgICAgICAgICAgIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggbm8gZWZmZWN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nIHdpdGggdGhlIHByb3BlcnRpZXMgcmVwbGFjZWQsIG9yCisgICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgb3JpZ2luYWwgc3RyaW5nIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcGFyc2VQcm9wZXJ0aWVzKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModmFsdWUpIHx8IHZhbHVlLmluZGV4T2YoJyQnKSA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIFBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7CisgICAgICAgIE9iamVjdCBvID0gcGFyc2VOZXh0UHJvcGVydHkodmFsdWUsIHBvcyk7CisgICAgICAgIGlmIChvICE9IG51bGwgJiYgcG9zLmdldEluZGV4KCkgPT0gdmFsdWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUubGVuZ3RoKCkgKiAyKTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmNoYXJBdChwb3MuZ2V0SW5kZXgoKSkpOworICAgICAgICAgICAgcG9zLnNldEluZGV4KHBvcy5nZXRJbmRleCgpICsgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYi5hcHBlbmQobyk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHBvcy5nZXRJbmRleCgpIDwgdmFsdWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIG8gPSBwYXJzZU5leHRQcm9wZXJ0eSh2YWx1ZSwgcG9zKTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuY2hhckF0KHBvcy5nZXRJbmRleCgpKSk7CisgICAgICAgICAgICAgICAgcG9zLnNldEluZGV4KHBvcy5nZXRJbmRleCgpICsgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWFybiB3aGV0aGVyIGEgU3RyaW5nIGNvbnRhaW5zIHJlcGxhY2VhYmxlIHByb3BlcnRpZXMuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBTdHJpbmcgdG8gY2hlY2suCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT52YWx1ZTwvY29kZT4gY29udGFpbnMgcHJvcGVydHkgbm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNQcm9wZXJ0aWVzKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoUGFyc2VQb3NpdGlvbiBwb3MgPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsgcG9zLmdldEluZGV4KCkgPCB2YWx1ZS5sZW5ndGgoKTspIHsKKyAgICAgICAgICAgIGlmIChwYXJzZVByb3BlcnR5TmFtZSh2YWx1ZSwgcG9zKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3Muc2V0SW5kZXgocG9zLmdldEluZGV4KCkgKyAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFueSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBwYXJzZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisgICAgICogaW4gdGhlIHNwZWNpZmllZCBTdHJpbmcuCisgICAgICogQHBhcmFtIHZhbHVlIFN0cmluZyB0byBwYXJzZQorICAgICAqIEBwYXJhbSBwb3MgUGFyc2VQb3NpdGlvbgorICAgICAqIEByZXR1cm4gT2JqZWN0IG9yIG51bGwgaWYgbm8gcHJvcGVydHkgaXMgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwYXJzZU5leHRQcm9wZXJ0eShTdHJpbmcgdmFsdWUsIFBhcnNlUG9zaXRpb24gcG9zKSB7CisgICAgICAgIGludCBzdGFydCA9IHBvcy5nZXRJbmRleCgpOworICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gcGFyc2VQcm9wZXJ0eU5hbWUodmFsdWUsIHBvcyk7CisgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb2plY3QubG9nKAorICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHkgXCIiICsgcHJvcGVydHlOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIlwiIGhhcyBub3QgYmVlbiBzZXQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoc3RhcnQsIHBvcy5nZXRJbmRleCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZVByb3BlcnR5TmFtZShTdHJpbmcgdmFsdWUsIFBhcnNlUG9zaXRpb24gcG9zKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4cGFuZGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoKFByb3BlcnR5RXhwYW5kZXIpIGl0ZXIubmV4dCgpKQorICAgICAgICAgICAgICAgIC5wYXJzZVByb3BlcnR5TmFtZSh2YWx1ZSwgcG9zLCB0aGlzKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1Byb3BlcnR5RXhwYW5kZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1Byb3BlcnR5RXhwYW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmU0NGVlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvUHJvcGVydHlFeHBhbmRlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlcjsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOworCisvKiogSW50ZXJmYWNlIHRvIGEgY2xhc3MgKG5vcm1hbGx5IFByb3BlcnR5SGVscGVyKSB0byBnZXQgYSBwcm9wZXJ0eSAqLworcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUV4cGFuZGVyIGV4dGVuZHMgUHJvcGVydHlIZWxwZXIuRGVsZWdhdGUgeworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBuZXh0IHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIHMgdGhlIFN0cmluZyB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0gcG9zIHRoZSBQYXJzZVBvc2l0aW9uIGluIHVzZS4KKyAgICAgKiBAcGFyYW0gcGFyc2VOZXh0UHJvcGVydHkgcGFyc2UgbmV4dCBwcm9wZXJ0eQorICAgICAqIEByZXR1cm4gcGFyc2VkIFN0cmluZyBpZiBhbnksIGVsc2UgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgU3RyaW5nIHBhcnNlUHJvcGVydHlOYW1lKAorICAgICAgICBTdHJpbmcgcywgUGFyc2VQb3NpdGlvbiBwb3MsIFBhcnNlTmV4dFByb3BlcnR5IHBhcnNlTmV4dFByb3BlcnR5KTsKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvUmVzb2x2ZVByb3BlcnR5TWFwLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9SZXNvbHZlUHJvcGVydHlNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWM5NzI0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvUmVzb2x2ZVByb3BlcnR5TWFwLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5wcm9wZXJ0eTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqICBDbGFzcyB0byByZXNvbHZlIHByb3BlcnRpZXMgaW4gYSBtYXAuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvbHZlUHJvcGVydHlNYXAgaW1wbGVtZW50cyBHZXRQcm9wZXJ0eSB7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQgICAgICAgc2VlbiA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQYXJzZVByb3BlcnRpZXMgcGFyc2VQcm9wZXJ0aWVzOworICAgIHByaXZhdGUgZmluYWwgR2V0UHJvcGVydHkgICAgbWFzdGVyOworICAgIHByaXZhdGUgTWFwIG1hcDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHdpdGggYSBtYXN0ZXIgZ2V0cHJvcGVydHkgYW5kIGEgY29sbGVjdGlvbiBvZiBleHBhbmRlcnMuCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgYW50IHByb2plY3QuCisgICAgICogQHBhcmFtIG1hc3RlciB0aGUgbWFzdGVyIHByb3BlcnR5IGhvbGRlciAodXN1YWxseSBQcm9wZXJ0eUhlbHBlcikKKyAgICAgKiBAcGFyYW0gZXhwYW5kZXJzIGEgY29sbGVjdGlvbiBvZiBleHBhbmRlcnMgKHVzdWFsbHkgZnJvbSBQcm9wZXJ0eUhlbHBlcikuCisgICAgICovCisgICAgcHVibGljIFJlc29sdmVQcm9wZXJ0eU1hcCgKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0LCBHZXRQcm9wZXJ0eSBtYXN0ZXIsIENvbGxlY3Rpb24gZXhwYW5kZXJzKSB7CisgICAgICAgIHRoaXMubWFzdGVyID0gbWFzdGVyOworICAgICAgICB0aGlzLnBhcnNlUHJvcGVydGllcyA9IG5ldyBQYXJzZVByb3BlcnRpZXMocHJvamVjdCwgZXhwYW5kZXJzLCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGlmIGl0IGlzIHNldC4KKyAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSwgb3IgbnVsbCBmb3Igbm8gbWF0Y2ggb3IgZm9yIG5hbWUgYmVpbmcgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChzZWVuLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlByb3BlcnR5ICIgKyBuYW1lICsgIiB3YXMgY2lyY3VsYXJseSAiICsgImRlZmluZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm90ZTogdGhlIG1hc3RlciBvdmVycmlkZXMgKGV2ZW4gaWYgdGhlIG5hbWUgaXMgc3Vic2VxdWVudGx5CisgICAgICAgIC8vICAgICAgIHByZWZpeGVkKQorICAgICAgICBPYmplY3QgbWFzdGVyUHJvcGVydHkgPSBtYXN0ZXIuZ2V0UHJvcGVydHkobmFtZSk7CisgICAgICAgIGlmIChtYXN0ZXJQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbWFzdGVyUHJvcGVydHk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlZW4uYWRkKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHBhcnNlUHJvcGVydGllcy5wYXJzZVByb3BlcnRpZXMoKFN0cmluZykgbWFwLmdldChuYW1lKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZWVuLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhY3Rpb24gbWV0aG9kIC0gcmVzb2x2ZXMgYWxsIHRoZSBwcm9wZXJ0aWVzIGluIGEgbWFwLgorICAgICAqIEBwYXJhbSBtYXAgdGhlIG1hcCB0byByZXNvbHZlIHByb3BlcnRpZXMgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzb2x2ZUFsbFByb3BlcnRpZXMoTWFwIG1hcCkgeworICAgICAgICB0aGlzLm1hcCA9IG1hcDsgLy8gVGhlIG1hcCBnZXRzIHVzZWQgaW4gdGhlIGdldFByb3BlcnR5IGNhbGxiYWNrCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBnZXRQcm9wZXJ0eShrZXkpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVzdWx0ID09IG51bGwgPyAiIiA6IHJlc3VsdC50b1N0cmluZygpOworICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L3BhY2thZ2UuaHRtbCBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQ5N2VjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxib2R5PgorICBDb250YWlucyBoZWxwZXIgY2xhc3NlcyBmb3IgYW50IHByb3BlcnRpZXMuCis8L2JvZHk+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEN2c1Rhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Fic3RyYWN0Q3ZzVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTViYzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEN2c1Rhc2suamF2YQpAQCAtMCwwICsxLDgzMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIG9yaWdpbmFsIEN2cy5qYXZhIDEuMjAKKyAqCisgKiAgTk9URTogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBtb3ZlZCBoZXJlIGZyb20gQ3ZzLmphdmEgd2l0aAorICogIHRoZSBhZGRpdGlvbiBvZiBzb21lIGFjY2Vzc29ycyBmb3IgZXh0ZW5zaWJpbGl0eS4gIEFub3RoZXIgdGFzaworICogIGNhbiBleHRlbmQgdGhpcyB3aXRoIHNvbWUgY3VzdG9taXplZCBvdXRwdXQgcHJvY2Vzc2luZy4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDdnNUYXNrIGV4dGVuZHMgVGFzayB7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2UsIGlmIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgdmlhCisgICAgICogc2V0Q29tcHJlc3Npb24oIHRydWUgKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTVBSRVNTSU9OX0xFVkVMID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DT01SRVNTSU9OX0xFVkVMID0gOTsKKworICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgY21kID0gbmV3IENvbW1hbmRsaW5lKCk7CisKKyAgICAvKiogbGlzdCBvZiBDb21tYW5kbGluZSBjaGlsZHJlbiAqLworICAgIHByaXZhdGUgVmVjdG9yIHZlY0NvbW1hbmRsaW5lcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIHRoZSBDVlNST09UIHZhcmlhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGN2c1Jvb3Q7CisKKyAgICAvKioKKyAgICAgKiB0aGUgQ1ZTX1JTSCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjdnNSc2g7CisKKyAgICAvKioKKyAgICAgKiB0aGUgcGFja2FnZS9tb2R1bGUgdG8gY2hlY2sgb3V0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGN2c1BhY2thZ2U7CisgICAgLyoqCisgICAgICogdGhlIHRhZworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRhZzsKKyAgICAvKioKKyAgICAgKiB0aGUgZGVmYXVsdCBjb21tYW5kLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTU1BTkQgPSAiY2hlY2tvdXQiOworICAgIC8qKgorICAgICAqIHRoZSBDVlMgY29tbWFuZCB0byBleGVjdXRlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbW1hbmQgPSBudWxsOworCisgICAgLyoqCisgICAgICogc3VwcHJlc3MgaW5mb3JtYXRpb24gbWVzc2FnZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHF1aWV0ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBzdXBwcmVzcyBhbGwgbWVzc2FnZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlYWxseXF1aWV0ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY29tcHJlc3Npb24gPSAwOworCisgICAgLyoqCisgICAgICogcmVwb3J0IG9ubHksIGRvbid0IGNoYW5nZSBhbnkgZmlsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5vZXhlYyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ1ZTIHBvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKKworICAgIC8qKgorICAgICAqIENWUyBwYXNzd29yZCBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHBhc3NGaWxlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNoZWNrZWQgb3V0IGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGRlc3Q7CisKKyAgICAvKiogd2hldGhlciBvciBub3QgdG8gYXBwZW5kIHN0ZG91dC9zdGRlcnIgdG8gZXhpc3RpbmcgZmlsZXMgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYXBwZW5kID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiB0aGUgZmlsZSB0byBkaXJlY3Qgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dDsKKworICAgIC8qKgorICAgICAqIHRoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBlcnJvciBmcm9tIHRoZSBjb21tYW5kLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBlcnJvcjsKKworICAgIC8qKgorICAgICAqIElmIHRydWUgaXQgd2lsbCBzdG9wIHRoZSBidWlsZCBpZiBjdnMgZXhpdHMgd2l0aCBlcnJvci4KKyAgICAgKiBEZWZhdWx0IGlzIGZhbHNlLiAoSXVsaWFuKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvciA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFjY2Vzc29ycyBmb3IgdGhlIGZvbGxvd2luZywgdG8gYWxsb3cgZGlmZmVyZW50IGhhbmRsaW5nIG9mCisgICAgICogdGhlIG91dHB1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIGV4ZWN1dGVTdHJlYW1IYW5kbGVyOworICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBlcnJvclN0cmVhbTsKKworICAgIC8qKiBlbXB0eSBuby1hcmcgY29uc3RydWN0b3IqLworICAgIHB1YmxpYyBBYnN0cmFjdEN2c1Rhc2soKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgaGFuZGxlcgorICAgICAqIEBwYXJhbSBoYW5kbGVyIGEgaGFuZGxlciBhYmxlIG9mIHByb2Nlc3NpbmcgdGhlIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtcyBmcm9tIHRoZSBjdnMgZXhlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0ZVN0cmVhbUhhbmRsZXIoRXhlY3V0ZVN0cmVhbUhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICB0aGlzLmV4ZWN1dGVTdHJlYW1IYW5kbGVyID0gaGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmaW5kIHRoZSBoYW5kbGVyIGFuZCBpbnN0YW50aWF0ZSBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQKKyAgICAgKiBAcmV0dXJuIGhhbmRsZXIgZm9yIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtcworICAgICAqLworICAgIHByb3RlY3RlZCBFeGVjdXRlU3RyZWFtSGFuZGxlciBnZXRFeGVjdXRlU3RyZWFtSGFuZGxlcigpIHsKKworICAgICAgICBpZiAodGhpcy5leGVjdXRlU3RyZWFtSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRFeGVjdXRlU3RyZWFtSGFuZGxlcihuZXcgUHVtcFN0cmVhbUhhbmRsZXIoZ2V0T3V0cHV0U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JTdHJlYW0oKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbUhhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyBhIHN0cmVhbSB0byB3aGljaCB0aGUgb3V0cHV0IGZyb20gdGhlIGN2cyBleGVjdXRhYmxlIHNob3VsZCBiZSBzZW50CisgICAgICogQHBhcmFtIG91dHB1dFN0cmVhbSBzdHJlYW0gdG8gd2hpY2ggdGhlIHN0ZG91dCBmcm9tIGN2cyBzaG91bGQgZ28KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgeworCisgICAgICAgIHRoaXMub3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFjY2VzcyB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBzdGRvdXQgZnJvbSBjdnMgc2hvdWxkIGdvCisgICAgICogaWYgdGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBzZXQsIGl0IHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiBpZiB0aGUgc3RyZWFtIGhhcyBub3QgeWV0IGJlZW4gc2V0LCBpZiB0aGUgYXR0cmlidXRlIG91dHB1dAorICAgICAqIGhhcyBiZWVuIHNldCwgdGhlIG91dHB1dCBzdHJlYW0gd2lsbCBnbyB0byB0aGUgb3V0cHV0IGZpbGUKKyAgICAgKiBvdGhlcndpc2UgdGhlIG91dHB1dCB3aWxsIGdvIHRvIGFudCdzIGxvZ2dpbmcgc3lzdGVtCisgICAgICogQHJldHVybiBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIGN2cycgc3Rkb3V0IHNob3VsZCBnbyB0bworICAgICAqLworICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgeworCisgICAgICAgIGlmICh0aGlzLm91dHB1dFN0cmVhbSA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dFN0cmVhbShuZXcgUHJpbnRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKSkpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNldE91dHB1dFN0cmVhbShuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX0lORk8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzLm91dHB1dFN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRzIGEgc3RyZWFtIHRvIHdoaWNoIHRoZSBzdGRlcnIgZnJvbSB0aGUgY3ZzIGV4ZSBzaG91bGQgZ28KKyAgICAgKiBAcGFyYW0gZXJyb3JTdHJlYW0gYW4gb3V0cHV0IHN0cmVhbSB3aWxsaW5nIHRvIHByb2Nlc3Mgc3RkZXJyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JTdHJlYW0oT3V0cHV0U3RyZWFtIGVycm9yU3RyZWFtKSB7CisKKyAgICAgICAgdGhpcy5lcnJvclN0cmVhbSA9IGVycm9yU3RyZWFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFjY2VzcyB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBzdGRlcnIgZnJvbSBjdnMgc2hvdWxkIGdvCisgICAgICogaWYgdGhpcyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBzZXQsIGl0IHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiBpZiB0aGUgc3RyZWFtIGhhcyBub3QgeWV0IGJlZW4gc2V0LCBpZiB0aGUgYXR0cmlidXRlIGVycm9yCisgICAgICogaGFzIGJlZW4gc2V0LCB0aGUgb3V0cHV0IHN0cmVhbSB3aWxsIGdvIHRvIHRoZSBmaWxlIGRlbm90ZWQgYnkgdGhlIGVycm9yIGF0dHJpYnV0ZQorICAgICAqIG90aGVyd2lzZSB0aGUgc3RkZXJyIG91dHB1dCB3aWxsIGdvIHRvIGFudCdzIGxvZ2dpbmcgc3lzdGVtCisgICAgICogQHJldHVybiBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIGN2cycgc3RkZXJyIHNob3VsZCBnbyB0bworICAgICAqLworICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0RXJyb3JTdHJlYW0oKSB7CisKKyAgICAgICAgaWYgKHRoaXMuZXJyb3JTdHJlYW0gPT0gbnVsbCkgeworCisgICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JTdHJlYW0obmV3IFByaW50U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGVycm9yLmdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQpKSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0RXJyb3JTdHJlYW0obmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19XQVJOKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpcy5lcnJvclN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBlbnZpcm9ubWVudCBmb3IgdG9FeGVjdXRlIGFuZCB0aGVuIHJ1bnMgaXQuCisgICAgICogQHBhcmFtIHRvRXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGZhaWxvbkVycm9yIGlzIHNldCB0byB0cnVlIGFuZCB0aGUgY3ZzIGNvbW1hbmQgZmFpbHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBydW5Db21tYW5kKENvbW1hbmRsaW5lIHRvRXhlY3V0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gWFhYOiB3ZSBzaG91bGQgdXNlIEpDVlMgKHd3dy5pY2UuY29tL0pDVlMpIGluc3RlYWQgb2YKKyAgICAgICAgLy8gY29tbWFuZCBsaW5lIGV4ZWN1dGlvbiBzbyB0aGF0IHdlIGRvbid0IHJlbHkgb24gaGF2aW5nCisgICAgICAgIC8vIG5hdGl2ZSBDVlMgc3R1ZmYgYXJvdW5kIChTTSkKKworICAgICAgICAvLyBXZSBjYW4ndCBkbyBpdCBvdXJzZWx2ZXMgYXMgakNWUyBpcyBHUExlZCwgYSB0aGlyZCBwYXJ0eSB0YXNrCisgICAgICAgIC8vIG91dHNpZGUgb2YgamFrYXJ0YSByZXBvc2l0b3JpZXMgd291bGQgYmUgcG9zc2libGUgdGhvdWdoIChTQikuCisKKyAgICAgICAgRW52aXJvbm1lbnQgZW52ID0gbmV3IEVudmlyb25tZW50KCk7CisKKyAgICAgICAgaWYgKHBvcnQgPiAwKSB7CisgICAgICAgICAgICBFbnZpcm9ubWVudC5WYXJpYWJsZSB2YXIgPSBuZXcgRW52aXJvbm1lbnQuVmFyaWFibGUoKTsKKyAgICAgICAgICAgIHZhci5zZXRLZXkoIkNWU19DTElFTlRfUE9SVCIpOworICAgICAgICAgICAgdmFyLnNldFZhbHVlKFN0cmluZy52YWx1ZU9mKHBvcnQpKTsKKyAgICAgICAgICAgIGVudi5hZGRWYXJpYWJsZSh2YXIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5lZWQgYSBiZXR0ZXIgY3Jvc3MgcGxhdGZvcm0gaW50ZWdyYXRpb24gd2l0aCA8Y3ZzcGFzcz4sIHNvCisgICAgICAgICAqIHVzZSB0aGUgc2FtZSBmaWxlbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwYXNzRmlsZSA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIEZpbGUgZGVmYXVsdFBhc3NGaWxlID0gbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJjeWd3aW4udXNlci5ob21lIiwKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSkKKyAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yQ2hhciArICIuY3ZzcGFzcyIpOworCisgICAgICAgICAgICBpZiAoZGVmYXVsdFBhc3NGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zZXRQYXNzZmlsZShkZWZhdWx0UGFzc0ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhc3NGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwYXNzRmlsZS5pc0ZpbGUoKSAmJiBwYXNzRmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5WYXJpYWJsZSB2YXIgPSBuZXcgRW52aXJvbm1lbnQuVmFyaWFibGUoKTsKKyAgICAgICAgICAgICAgICB2YXIuc2V0S2V5KCJDVlNfUEFTU0ZJTEUiKTsKKyAgICAgICAgICAgICAgICB2YXIuc2V0VmFsdWUoU3RyaW5nLnZhbHVlT2YocGFzc0ZpbGUpKTsKKyAgICAgICAgICAgICAgICBlbnYuYWRkVmFyaWFibGUodmFyKTsKKyAgICAgICAgICAgICAgICBsb2coIlVzaW5nIGN2cyBwYXNzZmlsZTogIiArIFN0cmluZy52YWx1ZU9mKHBhc3NGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFwYXNzRmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2coImN2cyBwYXNzZmlsZTogIiArIFN0cmluZy52YWx1ZU9mKHBhc3NGaWxlKQorICAgICAgICAgICAgICAgICAgICArICIgaWdub3JlZCBhcyBpdCBpcyBub3QgcmVhZGFibGUiLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJjdnMgcGFzc2ZpbGU6ICIgKyBTdHJpbmcudmFsdWVPZihwYXNzRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlnbm9yZWQgYXMgaXQgaXMgbm90IGEgZmlsZSIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGN2c1JzaCAhPSBudWxsKSB7CisgICAgICAgICAgICBFbnZpcm9ubWVudC5WYXJpYWJsZSB2YXIgPSBuZXcgRW52aXJvbm1lbnQuVmFyaWFibGUoKTsKKyAgICAgICAgICAgIHZhci5zZXRLZXkoIkNWU19SU0giKTsKKyAgICAgICAgICAgIHZhci5zZXRWYWx1ZShTdHJpbmcudmFsdWVPZihjdnNSc2gpKTsKKyAgICAgICAgICAgIGVudi5hZGRWYXJpYWJsZSh2YXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSnVzdCBjYWxsIHRoZSBnZXRFeGVjdXRlU3RyZWFtSGFuZGxlcigpIGFuZCBsZXQgaXQgaGFuZGxlCisgICAgICAgIC8vICAgICB0aGUgc2VtYW50aWNzIG9mIGluc3RhbnRpYXRpb24gb3IgcmV0cmlldmFsLgorICAgICAgICAvLworICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKGdldEV4ZWN1dGVTdHJlYW1IYW5kbGVyKCksIG51bGwpOworCisgICAgICAgIGV4ZS5zZXRBbnRSdW4oZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaWYgKGRlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdCA9IGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWRlc3QuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGRlc3QubWtkaXJzKCk7CisgICAgICAgIH0KKworICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeShkZXN0KTsKKyAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKHRvRXhlY3V0ZS5nZXRDb21tYW5kbGluZSgpKTsKKyAgICAgICAgZXhlLnNldEVudmlyb25tZW50KGVudi5nZXRWYXJpYWJsZXMoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBhY3R1YWxDb21tYW5kTGluZSA9IGV4ZWN1dGVUb1N0cmluZyhleGUpOworCisgICAgICAgICAgICBsb2coYWN0dWFsQ29tbWFuZExpbmUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgaW50IHJldENvZGUgPSBleGUuZXhlY3V0ZSgpOworICAgICAgICAgICAgbG9nKCJyZXRDb2RlPSIgKyByZXRDb2RlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgICAgIGlmIChmYWlsT25FcnJvciAmJiBFeGVjdXRlLmlzRmFpbHVyZShyZXRDb2RlKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY3ZzIGV4aXRlZCB3aXRoIGVycm9yIGNvZGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJldENvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJDb21tYW5kIGxpbmUgd2FzIFsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWN0dWFsQ29tbWFuZExpbmUgKyAiXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIkNhdWdodCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93KGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHQgPSBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgdC5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZG8gdGhlIHdvcmsKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGZhaWxvbmVycm9yIGlzIHNldCB0byB0cnVlIGFuZCB0aGUKKyAgICAgKiBjdnMgY29tbWFuZCBmYWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgc2F2ZWRDb21tYW5kID0gZ2V0Q29tbWFuZCgpOworCisgICAgICAgIGlmICh0aGlzLmdldENvbW1hbmQoKSA9PSBudWxsICYmIHZlY0NvbW1hbmRsaW5lcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gcmUtaW1wbGVtZW50IGxlZ2FjeSBiZWhhdmlvdXI6CisgICAgICAgICAgICB0aGlzLnNldENvbW1hbmQoQWJzdHJhY3RDdnNUYXNrLkRFRkFVTFRfQ09NTUFORCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYyA9IHRoaXMuZ2V0Q29tbWFuZCgpOworICAgICAgICBDb21tYW5kbGluZSBjbG9uZWQgPSBudWxsOworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBjbG9uZWQgPSAoQ29tbWFuZGxpbmUpIGNtZC5jbG9uZSgpOworICAgICAgICAgICAgY2xvbmVkLmNyZWF0ZUFyZ3VtZW50KHRydWUpLnNldExpbmUoYyk7CisgICAgICAgICAgICB0aGlzLmFkZENvbmZpZ3VyZWRDb21tYW5kbGluZShjbG9uZWQsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjQ29tbWFuZGxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGhpcy5ydW5Db21tYW5kKChDb21tYW5kbGluZSkgdmVjQ29tbWFuZGxpbmVzLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY2xvbmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVDb21tYW5kbGluZShjbG9uZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q29tbWFuZChzYXZlZENvbW1hbmQpOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dHB1dFN0cmVhbSk7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZXJyb3JTdHJlYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZXhlY3V0ZVRvU3RyaW5nKEV4ZWN1dGUgZXhlY3V0ZSkgeworCisgICAgICAgIFN0cmluZyBjbWRMaW5lID0gQ29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKGV4ZWN1dGUKKyAgICAgICAgICAgICAgICAuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSByZW1vdmVDdnNQYXNzd29yZChjbWRMaW5lKTsKKworICAgICAgICBTdHJpbmcgbmV3TGluZSA9IFN0cmluZ1V0aWxzLkxJTkVfU0VQOworICAgICAgICBTdHJpbmdbXSB2YXJpYWJsZUFycmF5ID0gZXhlY3V0ZS5nZXRFbnZpcm9ubWVudCgpOworCisgICAgICAgIGlmICh2YXJpYWJsZUFycmF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobmV3TGluZSk7CisgICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG5ld0xpbmUpOworICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgiZW52aXJvbm1lbnQ6Iik7CisgICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG5ld0xpbmUpOworICAgICAgICAgICAgZm9yIChpbnQgeiA9IDA7IHogPCB2YXJpYWJsZUFycmF5Lmxlbmd0aDsgeisrKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChuZXdMaW5lKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCJcdCIpOworICAgICAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQodmFyaWFibGVBcnJheVt6XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgY3ZzIHBhc3N3b3JkIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaWYgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKKyAgICAgKiBsaW5lLiBUaGlzIHBhc3N3b3JkIGNhbiBiZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIGluIHRoZSBjdnNSb290CisgICAgICogLWQ6cHNlcnZlcjp1c2VyOnBhc3N3b3JkQHNlcnZlcjpwYXRoCisgICAgICogSXQgaGFzIHRvIGJlIG5vdGVkIHRoYXQgdGhlIHBhc3N3b3JkIG1heSBiZSBvbWl0dGVkIGFsdG9nZXRoZXIuCisgICAgICogQHBhcmFtIGNtZExpbmUgdGhlIENWUyBjb21tYW5kIGxpbmUKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nQnVmZmVyIHdoZXJlIHRoZSBwYXNzd29yZCBoYXMgYmVlbiByZW1vdmVkIChpZiBhdmFpbGFibGUpCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcmVtb3ZlQ3ZzUGFzc3dvcmQoU3RyaW5nIGNtZExpbmUpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoY21kTGluZSk7CisKKyAgICAgICAgaW50IHN0YXJ0ID0gY21kTGluZS5pbmRleE9mKCItZDoiKTsKKworICAgICAgICBpZiAoc3RhcnQgPj0gMCkgeworICAgICAgICAgICAgaW50IHN0b3AgPSBjbWRMaW5lLmluZGV4T2YoIkAiLCBzdGFydCk7CisgICAgICAgICAgICBpbnQgc3RhcnRwcm90byA9IGNtZExpbmUuaW5kZXhPZigiOiIsIHN0YXJ0KTsKKyAgICAgICAgICAgIGludCBzdGFydHVzZXIgPSBjbWRMaW5lLmluZGV4T2YoIjoiLCBzdGFydHByb3RvICsgMSk7CisgICAgICAgICAgICBpbnQgc3RhcnRwYXNzID0gY21kTGluZS5pbmRleE9mKCI6Iiwgc3RhcnR1c2VyICsgMSk7CisgICAgICAgICAgICBzdG9wID0gY21kTGluZS5pbmRleE9mKCJAIiwgc3RhcnQpOworICAgICAgICAgICAgaWYgKHN0b3AgPj0gMCAmJiBzdGFydHBhc3MgPiBzdGFydHByb3RvICYmIHN0YXJ0cGFzcyA8IHN0b3ApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnRwYXNzICsgMTsgaSA8IHN0b3A7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWZmZXIucmVwbGFjZShpLCBpICsgMSwgIioiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0cmluZ0J1ZmZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ1ZTUk9PVCB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290CisgICAgICogICAgICAgICAgICB0aGUgQ1ZTUk9PVCB2YXJpYWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN2c1Jvb3QoU3RyaW5nIHJvb3QpIHsKKworICAgICAgICAvLyBDaGVjayBpZiBub3QgcmVhbCBjdnNyb290ID0+IHNldCBpdCB0byBudWxsCisgICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyb290LnRyaW0oKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgcm9vdCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmN2c1Jvb3QgPSByb290OworICAgIH0KKworICAgIC8qKgorICAgICAqIGFjY2VzcyB0aGUgQ1ZTUk9PVCB2YXJpYWJsZQorICAgICAqIEByZXR1cm4gQ1ZTUk9PVAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3ZzUm9vdCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5jdnNSb290OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBDVlNfUlNIIHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJzaCB0aGUgQ1ZTX1JTSCB2YXJpYWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN2c1JzaChTdHJpbmcgcnNoKSB7CisgICAgICAgIC8vIENoZWNrIGlmIG5vdCByZWFsIGN2c3JzaCA9PiBzZXQgaXQgdG8gbnVsbAorICAgICAgICBpZiAocnNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyc2gudHJpbSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICByc2ggPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jdnNSc2ggPSByc2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWNjZXNzIHRoZSBDVlNfUlNIIHZhcmlhYmxlCisgICAgICogQHJldHVybiB0aGUgQ1ZTX1JTSCB2YXJpYWJsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3ZzUnNoKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmN2c1JzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0IHBvcnQgb2YgQ1ZTCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIGFjY2VzcyB0aGUgcG9ydCBvZiBDVlMKKyAgICAgKiBAcmV0dXJuIHRoZSBwb3J0IG9mIENWUworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5wb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3N3b3JkIGZpbGUgdG8gcmVhZCBwYXNzd29yZHMgZnJvbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXNzRmlsZSBwYXNzd29yZCBmaWxlIHRvIHJlYWQgcGFzc3dvcmRzIGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzZmlsZShGaWxlIHBhc3NGaWxlKSB7CisgICAgICAgIHRoaXMucGFzc0ZpbGUgPSBwYXNzRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmaW5kIHRoZSBwYXNzd29yZCBmaWxlCisgICAgICogQHJldHVybiBwYXNzd29yZCBmaWxlCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0UGFzc0ZpbGUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMucGFzc0ZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2hlY2tlZCBvdXQgZmlsZXMgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIENWUydzIC1kIGNvbW1hbmQgbGluZQorICAgICAqIHN3aXRjaCBhcyBBbnQgd2lsbCBuZXZlciBzaG9ydGVuIHBhdGhuYW1lcyB0byBhdm9pZCBlbXB0eQorICAgICAqIGRpcmVjdG9yaWVzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXN0IGRpcmVjdG9yeSB3aGVyZSB0aGUgY2hlY2tlZCBvdXQgZmlsZXMgc2hvdWxkIGJlIHBsYWNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3QoRmlsZSBkZXN0KSB7CisgICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBmaWxlIHdoZXJlIHRoZSBjaGVja2VkIG91dCBmaWxlcyBzaG91bGQgYmUgcGxhY2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2hlY2tlZCBvdXQgZmlsZXMgc2hvdWxkIGJlIHBsYWNlZAorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldERlc3QoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFja2FnZS9tb2R1bGUgdG8gb3BlcmF0ZSB1cG9uLgorICAgICAqCisgICAgICogQHBhcmFtIHAgcGFja2FnZSBvciBtb2R1bGUgdG8gb3BlcmF0ZSB1cG9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZShTdHJpbmcgcCkgeworICAgICAgICB0aGlzLmN2c1BhY2thZ2UgPSBwOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFjY2VzcyB0aGUgcGFja2FnZSBvciBtb2R1bGUgdG8gb3BlcmF0ZSB1cG9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhY2thZ2UvbW9kdWxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmN2c1BhY2thZ2U7CisgICAgfQorICAgIC8qKgorICAgICAqIHRhZyBvciBicmFuY2gKKyAgICAgKiBAcmV0dXJuIHRhZyBvciBicmFuY2gKKyAgICAgKiBAc2luY2UgYW50IDEuNi4xCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHRhZyBvZiB0aGUgcGFja2FnZS9tb2R1bGUgdG8gb3BlcmF0ZSB1cG9uLgorICAgICAqIEBwYXJhbSBwIHRhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhZyhTdHJpbmcgcCkgeworICAgICAgICAvLyBDaGVjayBpZiBub3QgcmVhbCB0YWcgPT4gc2V0IGl0IHRvIG51bGwKKyAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBwLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHRhZyA9IHA7CisgICAgICAgICAgICBhZGRDb21tYW5kQXJndW1lbnQoIi1yIiArIHApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBuZWVkcyB0byBiZSBwdWJsaWMgdG8gYWxsb3cgY29uZmlndXJhdGlvbgorICAgICAqICAgICAgb2YgY29tbWFuZHMgZXh0ZXJuYWxseS4KKyAgICAgKiBAcGFyYW0gYXJnIGNvbW1hbmQgYXJndW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb21tYW5kQXJndW1lbnQoU3RyaW5nIGFyZykgeworICAgICAgICB0aGlzLmFkZENvbW1hbmRBcmd1bWVudChjbWQsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNvbW1hbmQgbGluZSBhcmd1bWVudCB0byBhbiBleHRlcm5hbCBjb21tYW5kLgorICAgICAqCisgICAgICogSSBkbyBub3QgdW5kZXJzdGFuZCB3aGF0IHRoaXMgbWV0aG9kIGRvZXMgaW4gdGhpcyBjbGFzcyA/Pz8KKyAgICAgKiBwYXJ0aWN1bGFybHkgbm90IHdoeSBpdCBpcyBwdWJsaWMgPz8/PworICAgICAqIEFudG9pbmVMTCBKdWx5IDIzZCAyMDAzCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyAgY29tbWFuZCBsaW5lIHRvIHdoaWNoIG9uZSBhcmd1bWVudCBzaG91bGQgYmUgYWRkZWQKKyAgICAgKiBAcGFyYW0gYXJnIGFyZ3VtZW50IHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbW1hbmRBcmd1bWVudChDb21tYW5kbGluZSBjLCBTdHJpbmcgYXJnKSB7CisgICAgICAgIGMuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShhcmcpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlIHRoZSBtb3N0IHJlY2VudCByZXZpc2lvbiBubyBsYXRlciB0aGFuIHRoZSBnaXZlbiBkYXRlLgorICAgICAqIEBwYXJhbSBwIGEgZGF0ZSBhcyBzdHJpbmcgaW4gYSBmb3JtYXQgdGhhdCB0aGUgQ1ZTIGV4ZWN1dGFibGUKKyAgICAgKiBjYW4gdW5kZXJzdGFuZCBzZWUgbWFuIGN2cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERhdGUoU3RyaW5nIHApIHsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBwLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudCgiLUQiKTsKKyAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudChwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBDVlMgY29tbWFuZCB0byBleGVjdXRlLgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgYmUgZGVwcmVjYXRlZCwgaXQgaXMgYmV0dGVyIHRvIHVzZSB0aGUgQ29tbWFuZGxpbmUgY2xhc3MgPworICAgICAqIEFudG9pbmVMTCBKdWx5IDIzZCAyMDAzCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBhIGNvbW1hbmQgYXMgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChTdHJpbmcgYykgeworICAgICAgICB0aGlzLmNvbW1hbmQgPSBjOworICAgIH0KKyAgICAvKioKKyAgICAgKiBhY2Nlc3NvciB0byBhIGNvbW1hbmQgbGluZSBhcyBzdHJpbmcKKyAgICAgKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGRlcHJlY2F0ZWQKKyAgICAgKiBBbnRvaW5lTEwgSnVseSAyM2QgMjAwMworICAgICAqCisgICAgICogQHJldHVybiBjb21tYW5kIGxpbmUgYXMgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tYW5kKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb21tYW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisgICAgICogQHBhcmFtIHEgIGlmIHRydWUsIHN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWlldChib29sZWFuIHEpIHsKKyAgICAgICAgcXVpZXQgPSBxOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHN1cHByZXNzIGFsbCBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcSAgaWYgdHJ1ZSwgc3VwcHJlc3MgYWxsIG1lc3NhZ2VzCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFsbHlxdWlldChib29sZWFuIHEpIHsKKyAgICAgICAgcmVhbGx5cXVpZXQgPSBxOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgcmVwb3J0IG9ubHkgYW5kIGRvbid0IGNoYW5nZSBhbnkgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmUgaWYgdHJ1ZSwgcmVwb3J0IG9ubHkgYW5kIGRvIG5vdCBjaGFuZ2UgYW55IGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZXhlYyhib29sZWFuIG5lKSB7CisgICAgICAgIG5vZXhlYyA9IG5lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IGEgZmlsZSB0byB3aGljaCBzdGRvdXQgc2hvdWxkIGdvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KEZpbGUgb3V0cHV0KSB7CisgICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBlcnJvciBmcm9tIHRoZSBjb21tYW5kLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yIGEgZmlsZSB0byB3aGljaCBzdGRlcnIgc2hvdWxkIGdvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3IoRmlsZSBlcnJvcikgeworICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhcHBlbmQgb3V0cHV0L2Vycm9yIHdoZW4gcmVkaXJlY3RpbmcgdG8gYSBmaWxlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGluZGljYXRlZCB5b3Ugd2FudCB0byBhcHBlbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBlbmQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICB0aGlzLmFwcGVuZCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aAorICAgICAqIGEgcmV0dXJuIGNvZGUgb3RoZXIgdGhhbiAwLgorICAgICAqIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqIEBwYXJhbSBmYWlsT25FcnJvciBzdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGgKKyAgICAgKiBhIHJldHVybiBjb2RlIG90aGVyIHRoYW4gMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgdGhpcy5mYWlsT25FcnJvciA9IGZhaWxPbkVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSBhIGNvbW1hbmRsaW5lIGVsZW1lbnQgZm9yIHRoaW5ncyBsaWtlIGN2c1Jvb3QsIHF1aWV0LCBldGMuCisgICAgICogQHBhcmFtIGMgdGhlIGNvbW1hbmQgbGluZSB3aGljaCB3aWxsIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiBpZiB0aGUgY29tbWFuZGxpbmUgaXMgaW5pdGlhbGx5IG51bGwsIHRoZSBmdW5jdGlvbiBpcyBhIG5vb3AKKyAgICAgKiBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIGFwcGVuZCB0byB0aGUgY29tbWFuZGxpbmUgYXJndW1lbnRzIGNvbmNlcm5pbmcKKyAgICAgKiA8dWw+CisgICAgICogPGxpPgorICAgICAqIGN2cyBwYWNrYWdlCisgICAgICogPC9saT4KKyAgICAgKiA8bGk+CisgICAgICogY29tcHJlc3Npb24KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiBxdWlldCBvciByZWFsbHlxdWlldAorICAgICAqIDwvbGk+CisgICAgICogPGxpPmN2c3Jvb3Q8L2xpPgorICAgICAqIDxsaT5ub2V4ZWM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ29tbWFuZGxpbmUoQ29tbWFuZGxpbmUgYykgeworICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYy5zZXRFeGVjdXRhYmxlKCJjdnMiKTsKKyAgICAgICAgaWYgKGN2c1BhY2thZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgYy5jcmVhdGVBcmd1bWVudCgpLnNldExpbmUoY3ZzUGFja2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuY29tcHJlc3Npb24gPiAwCisgICAgICAgICAgICAmJiB0aGlzLmNvbXByZXNzaW9uIDw9IE1BWElNVU1fQ09NUkVTU0lPTl9MRVZFTCkgeworICAgICAgICAgICAgYy5jcmVhdGVBcmd1bWVudCh0cnVlKS5zZXRWYWx1ZSgiLXoiICsgdGhpcy5jb21wcmVzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1aWV0ICYmICFyZWFsbHlxdWlldCkgeworICAgICAgICAgICAgYy5jcmVhdGVBcmd1bWVudCh0cnVlKS5zZXRWYWx1ZSgiLXEiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVhbGx5cXVpZXQpIHsKKyAgICAgICAgICAgIGMuY3JlYXRlQXJndW1lbnQodHJ1ZSkuc2V0VmFsdWUoIi1RIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZXhlYykgeworICAgICAgICAgICAgYy5jcmVhdGVBcmd1bWVudCh0cnVlKS5zZXRWYWx1ZSgiLW4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3ZzUm9vdCAhPSBudWxsKSB7CisgICAgICAgICAgICBjLmNyZWF0ZUFyZ3VtZW50KHRydWUpLnNldExpbmUoIi1kIiArIGN2c1Jvb3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlIGEgcGFydGljdWxhciBjb21tYW5kIGZyb20gYSB2ZWN0b3Igb2YgY29tbWFuZCBsaW5lcworICAgICAqIEBwYXJhbSBjIGNvbW1hbmQgbGluZSB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbW1hbmRsaW5lKENvbW1hbmRsaW5lIGMpIHsKKyAgICAgICAgdmVjQ29tbWFuZGxpbmVzLnJlbW92ZUVsZW1lbnQoYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBkaXJlY3QgY29tbWFuZC1saW5lIHRvIGV4ZWN1dGUuCisgICAgICogQHBhcmFtIGMgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkQ29tbWFuZGxpbmUoQ29tbWFuZGxpbmUgYykgeworICAgICAgICB0aGlzLmFkZENvbmZpZ3VyZWRDb21tYW5kbGluZShjLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBhbmQgYWRkcyB0aGUgZ2l2ZW4gQ29tbWFuZGxpbmUuCisgICAgICogQHBhcmFtIGMgY29tbWFuZGxpbmUgdG8gaW5zZXJ0CisgICAgICogQHBhcmFtIGluc2VydEF0U3RhcnQgSWYgdHJ1ZSwgYyBpcworICAgICAqIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZlY3RvciBvZiBjb21tYW5kIGxpbmVzCisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkQ29tbWFuZGxpbmUoQ29tbWFuZGxpbmUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbnNlcnRBdFN0YXJ0KSB7CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbmZpZ3VyZUNvbW1hbmRsaW5lKGMpOworICAgICAgICBpZiAoaW5zZXJ0QXRTdGFydCkgeworICAgICAgICAgICAgdmVjQ29tbWFuZGxpbmVzLmluc2VydEVsZW1lbnRBdChjLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZlY0NvbW1hbmRsaW5lcy5hZGRFbGVtZW50KGMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgKiBJZiBzZXQgdG8gYSB2YWx1ZSAxLTkgaXQgYWRkcyAtek4gdG8gdGhlIGN2cyBjb21tYW5kIGxpbmUsIGVsc2UKKyAgICAqIGl0IGRpc2FibGVzIGNvbXByZXNzaW9uLgorICAgICAqIEBwYXJhbSBsZXZlbCBjb21wcmVzc2lvbiBsZXZlbCAxIHRvIDkKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzaW9uTGV2ZWwoaW50IGxldmVsKSB7CisgICAgICAgIHRoaXMuY29tcHJlc3Npb24gPSBsZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGNvbXByZXNzaW9ubGV2ZWw9IjMiLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZWNvbXAgSWYgdHJ1ZSwgdHVybnMgb24gY29tcHJlc3Npb24gdXNpbmcgZGVmYXVsdAorICAgICAqIGxldmVsLCBBYnN0cmFjdEN2c1Rhc2suREVGQVVMVF9DT01QUkVTU0lPTl9MRVZFTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvbihib29sZWFuIHVzZWNvbXApIHsKKyAgICAgICAgc2V0Q29tcHJlc3Npb25MZXZlbCh1c2Vjb21wCisgICAgICAgICAgICA/IEFic3RyYWN0Q3ZzVGFzay5ERUZBVUxUX0NPTVBSRVNTSU9OX0xFVkVMIDogMCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEphclNpZ25lclRhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Fic3RyYWN0SmFyU2lnbmVyVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTAzZDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEphclNpZ25lclRhc2suamF2YQpAQCAtMCwwICsxLDM3OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVkaXJlY3RvckVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CisKKy8qKgorICogVGhpcyBpcyBmYWN0b3JlZCBvdXQgZnJvbSB7QGxpbmsgU2lnbkphcn07IGEgYmFzZSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkCisgKiBmb3IgYm90aCBzaWduaW5nIGFuZCB2ZXJpZnlpbmcgSkFSIGZpbGVzIHVzaW5nIGphcnNpZ25lcgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphclNpZ25lclRhc2sgZXh0ZW5kcyBUYXNrIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBqYXI7CisgICAgLyoqCisgICAgICogVGhlIGFsaWFzIG9mIHNpZ25lci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFsaWFzOworICAgIC8qKgorICAgICAqIFRoZSB1cmwgb3IgcGF0aCBvZiBrZXlzdG9yZSBmaWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5c3RvcmU7CisgICAgLyoqCisgICAgICogcGFzc3dvcmQgZm9yIHRoZSBzdG9yZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcmVwYXNzOworICAgIC8qKgorICAgICAqIHR5cGUgb2Ygc3RvcmUsLXN0b3JldHlwZSBwYXJhbQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcmV0eXBlOworICAgIC8qKgorICAgICAqIHBhc3N3b3JkIGZvciB0aGUga2V5IGluIHRoZSBzdG9yZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5cGFzczsKKyAgICAvKioKKyAgICAgKiB2ZXJib3NlIG91dHB1dAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmJvc2U7CisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgZm9yIEphciBzaWduZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heE1lbW9yeTsKKyAgICAvKioKKyAgICAgKiB0aGUgZmlsZXNldHMgb2YgdGhlIGphcnMgdG8gc2lnbgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgLyoqCisgICAgICogbmFtZSBvZiBKREsgcHJvZ3JhbSB3ZSBhcmUgbG9va2luZyBmb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJTSUdORVJfQ09NTUFORCA9ICJqYXJzaWduZXIiOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIHJlZGlyZWN0b3IgdXNlZCB0byB0YWxrIHRvIHRoZSBqYXJzaWduZXIgcHJvZ3JhbQorICAgICAqLworICAgIHByaXZhdGUgUmVkaXJlY3RvckVsZW1lbnQgcmVkaXJlY3RvcjsKKworICAgIC8qKgorICAgICAqIEphdmEgZGVjbGFyYXRpb25zIC1KLURuYW1lPXZhbHVlCisgICAgICovCisgICAgcHJpdmF0ZSBFbnZpcm9ubWVudCBzeXNQcm9wZXJ0aWVzID0gbmV3IEVudmlyb25tZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fU09VUkNFID0gImphciBtdXN0IGJlIHNldCB0aHJvdWdoIGphciBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgKyAib3IgbmVzdGVkIGZpbGVzZXRzIjsKKworICAgIC8qKgorICAgICAqIFBhdGggaG9sZGluZyBhbGwgbm9uLWZpbGVzZXRzIG9mIGZpbGVzeXN0ZW0gcmVzb3VyY2VzIHdlIHdhbnQgdG8gc2lnbi4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSBQYXRoIHBhdGggPSBudWxsOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIG1lbW9yeSB0byBiZSB1c2VkIGJ5IHRoZSBqYXJzaWduZXIgcHJvY2VzcworICAgICAqCisgICAgICogQHBhcmFtIG1heCBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBtYXhpbXVtIG1lbW9yeSBhY2NvcmRpbmcgdG8gdGhlIEpWTQorICAgICAqICAgICAgICAgICAgY29udmVudGlvbnMgKGUuZy4gMTI4bSBpcyAxMjggTWVnYWJ5dGVzKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heG1lbW9yeShTdHJpbmcgbWF4KSB7CisgICAgICAgIG1heE1lbW9yeSA9IG1heDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGUgamFyIGZpbGUgdG8gc2lnbjsgcmVxdWlyZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXIgdGhlIGphciBmaWxlIHRvIHNpZ24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXIoZmluYWwgRmlsZSBqYXIpIHsKKyAgICAgICAgdGhpcy5qYXIgPSBqYXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhlIGFsaWFzIHRvIHNpZ24gdW5kZXI7IHJlcXVpcmVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgdGhlIGFsaWFzIHRvIHNpZ24gdW5kZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGlhcyhmaW5hbCBTdHJpbmcgYWxpYXMpIHsKKyAgICAgICAgdGhpcy5hbGlhcyA9IGFsaWFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGtleXN0b3JlIGxvY2F0aW9uOyByZXF1aXJlZAorICAgICAqCisgICAgICogQHBhcmFtIGtleXN0b3JlIHRoZSBrZXlzdG9yZSBsb2NhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleXN0b3JlKGZpbmFsIFN0cmluZyBrZXlzdG9yZSkgeworICAgICAgICB0aGlzLmtleXN0b3JlID0ga2V5c3RvcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFzc3dvcmQgZm9yIGtleXN0b3JlIGludGVncml0eTsgcmVxdWlyZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdG9yZXBhc3MgdGhlIHBhc3N3b3JkIGZvciB0aGUga2V5c3RvcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9yZXBhc3MoZmluYWwgU3RyaW5nIHN0b3JlcGFzcykgeworICAgICAgICB0aGlzLnN0b3JlcGFzcyA9IHN0b3JlcGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBrZXlzdG9yZSB0eXBlOyBvcHRpb25hbAorICAgICAqCisgICAgICogQHBhcmFtIHN0b3JldHlwZSB0aGUga2V5c3RvcmUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JldHlwZShmaW5hbCBTdHJpbmcgc3RvcmV0eXBlKSB7CisgICAgICAgIHRoaXMuc3RvcmV0eXBlID0gc3RvcmV0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHBhc3N3b3JkIGZvciBwcml2YXRlIGtleSAoaWYgZGlmZmVyZW50KTsgb3B0aW9uYWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlwYXNzIHRoZSBwYXNzd29yZCBmb3IgdGhlIGtleSAoaWYgZGlmZmVyZW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleXBhc3MoZmluYWwgU3RyaW5nIGtleXBhc3MpIHsKKyAgICAgICAgdGhpcy5rZXlwYXNzID0ga2V5cGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgdmVyYm9zZSBvdXRwdXQgd2hlbiBzaWduaW5nIDsgb3B0aW9uYWw6IGRlZmF1bHQgZmFsc2UKKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJib3NlIGlmIHRydWUgZW5hYmxlIHZlcmJvc2Ugb3V0cHV0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShmaW5hbCBib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIHRvIHNpZ24KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXQgYSBzZXQgb2YgZmlsZXMgdG8gc2lnbgorICAgICAqIEBzaW5jZSBBbnQgMS40CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChmaW5hbCBGaWxlU2V0IHNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc3lzdGVtIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHN5c3Agc3lzdGVtIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFN5c3Byb3BlcnR5KEVudmlyb25tZW50LlZhcmlhYmxlIHN5c3ApIHsKKyAgICAgICAgc3lzUHJvcGVydGllcy5hZGRWYXJpYWJsZShzeXNwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCBvZiBmaWxlcyB0byBzaWduLgorICAgICAqCisgICAgICogQHJldHVybiBhIHBhdGggb2YgZmlsZXMgdG8gc2lnbi4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZVBhdGgoKSB7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbml0IHByb2Nlc3NpbmcgbG9naWM7IHRoaXMgaXMgcmV0YWluZWQgdGhyb3VnaCBvdXIgZXhlY3V0aW9uKHMpCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYmVnaW5FeGVjdXRpb24oKSB7CisKKyAgICAgICAgcmVkaXJlY3RvciA9IGNyZWF0ZVJlZGlyZWN0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhbnkgY2xlYW51cCBsb2dpYworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGVuZEV4ZWN1dGlvbigpIHsKKyAgICAgICAgcmVkaXJlY3RvciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSByZWRpcmVjdG9yIHRvIHVzZSwgaWYgYW55LgorICAgICAqCisgICAgICogQHJldHVybiBhIGNvbmZpZ3VyZWQgUmVkaXJlY3RvckVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBSZWRpcmVjdG9yRWxlbWVudCBjcmVhdGVSZWRpcmVjdG9yKCkgeworICAgICAgICBSZWRpcmVjdG9yRWxlbWVudCByZXN1bHQgPSBuZXcgUmVkaXJlY3RvckVsZW1lbnQoKTsKKyAgICAgICAgaWYgKHN0b3JlcGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgaW5wdXQgPSBuZXcgU3RyaW5nQnVmZmVyKHN0b3JlcGFzcykuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgaWYgKGtleXBhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlucHV0LmFwcGVuZChrZXlwYXNzKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuc2V0SW5wdXRTdHJpbmcoaW5wdXQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXN1bHQuc2V0TG9nSW5wdXRTdHJpbmcoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSByZWRpcmVjdG9yLiBOb24tbnVsbCBiZXR3ZWVuIGludm9jYXRpb25zIG9mCisgICAgICoge0BsaW5rICNiZWdpbkV4ZWN1dGlvbigpfSBhbmQge0BsaW5rICNlbmRFeGVjdXRpb24oKX0KKyAgICAgKiBAcmV0dXJuIGEgcmVkaXJlY3RvciBvciBudWxsCisgICAgICovCisgICAgcHVibGljIFJlZGlyZWN0b3JFbGVtZW50IGdldFJlZGlyZWN0b3IoKSB7CisgICAgICAgIHJldHVybiByZWRpcmVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoZXNlIGFyZSBvcHRpb25zIGNvbW1vbiB0byBzaWduaW5nIGFuZCB2ZXJpZnlpbmcKKyAgICAgKiBAcGFyYW0gY21kICBjb21tYW5kIHRvIGNvbmZpZ3VyZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldENvbW1vbk9wdGlvbnMoZmluYWwgRXhlY1Rhc2sgY21kKSB7CisgICAgICAgIGlmIChtYXhNZW1vcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkVmFsdWUoY21kLCAiLUotWG14IiArIG1heE1lbW9yeSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgYWRkVmFsdWUoY21kLCAiLXZlcmJvc2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vbm93IHBhdGNoIGluIGFsbCBzeXN0ZW0gcHJvcGVydGllcworICAgICAgICBWZWN0b3IgcHJvcHMgPSBzeXNQcm9wZXJ0aWVzLmdldFZhcmlhYmxlc1ZlY3RvcigpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gcHJvcHMuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEVudmlyb25tZW50LlZhcmlhYmxlIHZhcmlhYmxlID0gKEVudmlyb25tZW50LlZhcmlhYmxlKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBkZWNsYXJlU3lzUHJvcGVydHkoY21kLCB2YXJpYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29tbWFuZCB0byBjb25maWd1cmUKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgdG8gc2V0CisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGNvcnJlY3RseSBkZWZpbmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlY2xhcmVTeXNQcm9wZXJ0eSgKKyAgICAgICAgRXhlY1Rhc2sgY21kLCBFbnZpcm9ubWVudC5WYXJpYWJsZSBwcm9wZXJ0eSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkVmFsdWUoY21kLCAiLUotRCIgKyBwcm9wZXJ0eS5nZXRDb250ZW50KCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogYmluZCB0byBhIGtleXN0b3JlIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSB0aGVyZQorICAgICAqIEBwYXJhbSBjbWQgY29tbWFuZCB0byBjb25maWd1cmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kVG9LZXlzdG9yZShmaW5hbCBFeGVjVGFzayBjbWQpIHsKKyAgICAgICAgaWYgKG51bGwgIT0ga2V5c3RvcmUpIHsKKyAgICAgICAgICAgIC8vIGlzIHRoZSBrZXlzdG9yZSBhIGZpbGUKKyAgICAgICAgICAgIGFkZFZhbHVlKGNtZCwgIi1rZXlzdG9yZSIpOworICAgICAgICAgICAgU3RyaW5nIGxvYzsKKyAgICAgICAgICAgIEZpbGUga2V5c3RvcmVGaWxlID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGtleXN0b3JlKTsKKyAgICAgICAgICAgIGlmIChrZXlzdG9yZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBsb2MgPSBrZXlzdG9yZUZpbGUuZ2V0UGF0aCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIGEgVVJMIC0ganVzdCBwYXNzIGFzIGlzCisgICAgICAgICAgICAgICAgbG9jID0ga2V5c3RvcmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsIGxvYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgIT0gc3RvcmV0eXBlKSB7CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsICItc3RvcmV0eXBlIik7CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsIHN0b3JldHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgdGhlIGphcnNpZ25lciBleGVjdXRhYmxlIHRhc2sKKyAgICAgKiBAcmV0dXJuIGEgdGFzayBzZXQgdXAgd2l0aCB0aGUgZXhlY3V0YWJsZSBvZiBqYXJzaWduZXIsIGZhaWxvbmVycm9yPXRydWUKKyAgICAgKiBhbmQgYm91bmQgdG8gb3VyIHJlZGlyZWN0b3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRXhlY1Rhc2sgY3JlYXRlSmFyU2lnbmVyKCkgeworICAgICAgICBmaW5hbCBFeGVjVGFzayBjbWQgPSBuZXcgRXhlY1Rhc2sodGhpcyk7CisgICAgICAgIGNtZC5zZXRFeGVjdXRhYmxlKEphdmFFbnZVdGlscy5nZXRKZGtFeGVjdXRhYmxlKEpBUlNJR05FUl9DT01NQU5EKSk7CisgICAgICAgIGNtZC5zZXRUYXNrVHlwZShKQVJTSUdORVJfQ09NTUFORCk7CisgICAgICAgIGNtZC5zZXRGYWlsb25lcnJvcih0cnVlKTsKKyAgICAgICAgY21kLmFkZENvbmZpZ3VyZWRSZWRpcmVjdG9yKHJlZGlyZWN0b3IpOworICAgICAgICByZXR1cm4gY21kOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNsb25lIG91ciBmaWxlc2V0cyB2ZWN0b3IsIGFuZCBwYXRjaCBpbiB0aGUgamFyIGF0dHJpYnV0ZSBhcyBhIG5ldworICAgICAqIGZpbGVzZXQsIGlmIGlzIGRlZmluZWQKKyAgICAgKiBAcmV0dXJuIGEgdmVjdG9yIG9mIEZpbGVTZXQgaW5zdGFuY2VzCisgICAgICovCisgICAgcHJvdGVjdGVkIFZlY3RvciBjcmVhdGVVbmlmaWVkU291cmNlcygpIHsKKyAgICAgICAgVmVjdG9yIHNvdXJjZXMgPSAoVmVjdG9yKSBmaWxlc2V0cy5jbG9uZSgpOworICAgICAgICBpZiAoamFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vd2UgY3JlYXRlIGEgZmlsZXNldCB3aXRoIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgICAgICAgIC8vdGhpcyBsZXRzIHVzIGNvbWJpbmUgb3VyIGxvZ2ljIGZvciBoYW5kbGluZyBvdXRwdXQgZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAvL21hcHBpbmcgZXRjLgorICAgICAgICAgICAgRmlsZVNldCBzb3VyY2VKYXIgPSBuZXcgRmlsZVNldCgpOworICAgICAgICAgICAgc291cmNlSmFyLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIHNvdXJjZUphci5zZXRGaWxlKGphcik7CisgICAgICAgICAgICBzb3VyY2VKYXIuc2V0RGlyKGphci5nZXRQYXJlbnRGaWxlKCkpOworICAgICAgICAgICAgc291cmNlcy5hZGQoc291cmNlSmFyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc291cmNlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjbG9uZSBvdXIgcGF0aCBhbmQgYWRkIGFsbCBleHBsaWNpdGx5IHNwZWNpZmllZCBGaWxlU2V0cyBhcworICAgICAqIHdlbGwsIHBhdGNoIGluIHRoZSBqYXIgYXR0cmlidXRlIGFzIGEgbmV3IGZpbGVzZXQgaWYgaXQgaXMKKyAgICAgKiBkZWZpbmVkLgorICAgICAqIEByZXR1cm4gYSBwYXRoIHRoYXQgY29udGFpbnMgYWxsIGZpbGVzIHRvIHNpZ24KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCBQYXRoIGNyZWF0ZVVuaWZpZWRTb3VyY2VQYXRoKCkgeworICAgICAgICBQYXRoIHAgPSBwYXRoID09IG51bGwgPyBuZXcgUGF0aChnZXRQcm9qZWN0KCkpIDogKFBhdGgpIHBhdGguY2xvbmUoKTsKKyAgICAgICAgVmVjdG9yIHMgPSBjcmVhdGVVbmlmaWVkU291cmNlcygpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gcy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgcC5hZGQoKEZpbGVTZXQpIGUubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFzIGVpdGhlciBhIHBhdGggb3IgYSBmaWxlc2V0IGJlZW4gc3BlY2lmaWVkPworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHBhdGggb3IgZmlsZXNldCBoYXMgYmVlbiBzcGVjaWZpZWQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBwYXRoICE9IG51bGwgfHwgZmlsZXNldHMuc2l6ZSgpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSB2YWx1ZSBhcmd1bWVudCB0byBhIGNvbW1hbmQKKyAgICAgKiBAcGFyYW0gY21kIGNvbW1hbmQgdG8gbWFuaXB1bGF0ZQorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBhZGQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShmaW5hbCBFeGVjVGFzayBjbWQsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBjbWQuY3JlYXRlQXJnKCkuc2V0VmFsdWUodmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZTQxMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudC5qYXZhCkBAIC0wLDAgKzEsNzgzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRlZmF1bHRMb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlByb3BlcnR5U2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIEJ1aWxkIGEgc3ViLXByb2plY3QuCisgKgorICogIDxwcmU+CisgKiAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2ZvbyZxdW90OyBkZXBlbmRzPSZxdW90O2luaXQmcXVvdDsmZ3Q7CisgKiAgICAmbHQ7YW50IGFudGZpbGU9JnF1b3Q7YnVpbGQueG1sJnF1b3Q7IHRhcmdldD0mcXVvdDtiYXImcXVvdDsgJmd0OworICogICAgICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtwcm9wZXJ0eTEmcXVvdDsgdmFsdWU9JnF1b3Q7YWFhYWEmcXVvdDsgLyZndDsKKyAqICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7Zm9vJnF1b3Q7IHZhbHVlPSZxdW90O2JheiZxdW90OyAvJmd0OworICogICAgJmx0Oy9hbnQmZ3Q7PC9zcGFuPgorICogICZsdDsvdGFyZ2V0Jmd0Ozwvc3Bhbj4KKyAqCisgKiAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2JhciZxdW90OyBkZXBlbmRzPSZxdW90O2luaXQmcXVvdDsmZ3Q7CisgKiAgICAmbHQ7ZWNobyBtZXNzYWdlPSZxdW90O3Byb3AgaXMgJHtwcm9wZXJ0eTF9ICR7Zm9vfSZxdW90OyAvJmd0OworICogICZsdDsvdGFyZ2V0Jmd0OworICogPC9wcmU+CisgKgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJjb250cm9sIgorICovCitwdWJsaWMgY2xhc3MgQW50IGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKiB0aGUgYmFzZWRpciB3aGVyZSBpcyBleGVjdXRlZCB0aGUgYnVpbGQgZmlsZSAqLworICAgIHByaXZhdGUgRmlsZSBkaXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogdGhlIGJ1aWxkLnhtbCBmaWxlIChjYW4gYmUgYWJzb2x1dGUpIGluIHRoaXMgY2FzZSBkaXIgd2lsbCBiZQorICAgICAqIGlnbm9yZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhbnRGaWxlID0gbnVsbDsKKworICAgIC8qKiB0aGUgb3V0cHV0ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0ID0gbnVsbDsKKworICAgIC8qKiBzaG91bGQgd2UgaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gdGhlIHBhcmVudCA/ICovCisgICAgcHJpdmF0ZSBib29sZWFuIGluaGVyaXRBbGwgPSB0cnVlOworCisgICAgLyoqIHNob3VsZCB3ZSBpbmhlcml0IHJlZmVyZW5jZXMgZnJvbSB0aGUgcGFyZW50ID8gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW5oZXJpdFJlZnMgPSBmYWxzZTsKKworICAgIC8qKiB0aGUgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBuZXcgcHJvamVjdCAqLworICAgIHByaXZhdGUgVmVjdG9yIHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiogdGhlIHJlZmVyZW5jZXMgdG8gcGFzcyB0byB0aGUgbmV3IHByb2plY3QgKi8KKyAgICBwcml2YXRlIFZlY3RvciByZWZlcmVuY2VzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIHRoZSB0ZW1wb3JhcnkgcHJvamVjdCBjcmVhdGVkIHRvIHJ1biB0aGUgYnVpbGQgZmlsZSAqLworICAgIHByaXZhdGUgUHJvamVjdCBuZXdQcm9qZWN0OworCisgICAgLyoqIFRoZSBzdHJlYW0gdG8gd2hpY2ggb3V0cHV0IGlzIHRvIGJlIHdyaXR0ZW4uICovCisgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXQgPSBudWxsOworCisgICAgLyoqIHRoZSBzZXRzIG9mIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgbmV3IHByb2plY3QgKi8KKyAgICBwcml2YXRlIFZlY3RvciBwcm9wZXJ0eVNldHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiogdGhlIHRhcmdldHMgdG8gY2FsbCBvbiB0aGUgbmV3IHByb2plY3QgKi8KKyAgICBwcml2YXRlIFZlY3RvciB0YXJnZXRzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIHdoZXRoZXIgdGhlIHRhcmdldCBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZCAqKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdGFyZ2V0QXR0cmlidXRlU2V0ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBzaW1wbGUgY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgQW50KCkgeworICAgICAgICAvL2RlZmF1bHQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgYSB0YXNrIGJvdW5kIHRvIGl0cyBjcmVhdG9yCisgICAgICogQHBhcmFtIG93bmVyIG93bmluZyB0YXNrCisgICAgICovCisgICAgcHVibGljIEFudChUYXNrIG93bmVyKSB7CisgICAgICAgIGJpbmRUb093bmVyKG93bmVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqIEBwYXJhbSB2YWx1ZSBpZiB0cnVlIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmhlcml0QWxsKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgaW5oZXJpdEFsbCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHBhc3MgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgaWYgdHJ1ZSwgcGFzcyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgbmV3IEFudCBwcm9qZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5oZXJpdFJlZnMoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBpbmhlcml0UmVmcyA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBQcm9qZWN0IGluc3RhbmNlIGZvciB0aGUgcHJvamVjdCB0byBjYWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIG5ld1Byb2plY3QgPSBnZXRQcm9qZWN0KCkuY3JlYXRlU3ViUHJvamVjdCgpOworICAgICAgICBuZXdQcm9qZWN0LnNldEphdmFWZXJzaW9uUHJvcGVydHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaW4gZXhlY3V0ZSBvciBjcmVhdGVQcm9wZXJ0eSAodmlhIGdldE5ld1Byb2plY3QoKSkKKyAgICAgKiBpZiBuZXdQcm9qZWN0IGlzIG51bGwuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgdGhpcyB0YXNrIGlzIHJ1bgorICAgICAqIHR3aWNlIGFzIG5ld1Byb2plY3QgaXMgc2V0IHRvIG51bGwgYXQgdGhlIGVuZCBvZiBleGVjdXRlICh0bworICAgICAqIHNhdmUgbWVtb3J5IGFuZCBoZWxwIHRoZSBHQykuPC9wPgorICAgICAqIDxwPmNhbGxzIGluaXQoKSBhZ2FpbjwvcD4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWluaXQoKSB7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2hlcyB0aGUgYnVpbGQgbGlzdGVuZXJzIG9mIHRoZSBjdXJyZW50IHByb2plY3QgdG8gdGhlIG5ldworICAgICAqIHByb2plY3QsIGNvbmZpZ3VyZXMgYSBwb3NzaWJsZSBsb2dmaWxlLCB0cmFuc2ZlcnMgdGFzayBhbmQKKyAgICAgKiBkYXRhLXR5cGUgZGVmaW5pdGlvbnMsIHRyYW5zZmVycyBwcm9wZXJ0aWVzIChlaXRoZXIgYWxsIG9yIGp1c3QKKyAgICAgKiB0aGUgb25lcyBzcGVjaWZpZWQgYXMgdXNlciBwcm9wZXJ0aWVzIHRvIHRoZSBjdXJyZW50IHByb2plY3QsCisgICAgICogZGVwZW5kaW5nIG9uIGluaGVyaXRhbGwpLCB0cmFuc2ZlcnMgdGhlIGlucHV0IGhhbmRsZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcm9qZWN0KCkgeworICAgICAgICBuZXdQcm9qZWN0LnNldElucHV0SGFuZGxlcihnZXRQcm9qZWN0KCkuZ2V0SW5wdXRIYW5kbGVyKCkpOworCisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBnZXRCdWlsZExpc3RlbmVycygpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIG5ld1Byb2plY3QuYWRkQnVpbGRMaXN0ZW5lcigoQnVpbGRMaXN0ZW5lcikgaXRlci5uZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWxlIG91dGZpbGUgPSBudWxsOworICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZGlyLCBvdXRwdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRmaWxlID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRmaWxlKSk7CisgICAgICAgICAgICAgICAgRGVmYXVsdExvZ2dlciBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpOworICAgICAgICAgICAgICAgIGxvZ2dlci5zZXRNZXNzYWdlT3V0cHV0TGV2ZWwoUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLnNldE91dHB1dFByaW50U3RyZWFtKG91dCk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLnNldEVycm9yUHJpbnRTdHJlYW0ob3V0KTsKKyAgICAgICAgICAgICAgICBuZXdQcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIobG9nZ2VyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbG9nKCJBbnQ6IENhbid0IHNldCBvdXRwdXQgdG8gIiArIG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IHVzZXItZGVmaW5lZCBwcm9wZXJ0aWVzCisgICAgICAgIGdldFByb2plY3QoKS5jb3B5VXNlclByb3BlcnRpZXMobmV3UHJvamVjdCk7CisKKyAgICAgICAgaWYgKCFpbmhlcml0QWxsKSB7CisgICAgICAgICAgIC8vIHNldCBBbnQncyBidWlsdC1pbiBwcm9wZXJ0aWVzIHNlcGFyYXRlbHksCisgICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgbm90IGJlaW5nIGluaGVyaXRlZC4KKyAgICAgICAgICAgbmV3UHJvamVjdC5pbml0UHJvcGVydGllcygpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzZXQgYWxsIHByb3BlcnRpZXMgZnJvbSBjYWxsaW5nIHByb2plY3QKKyAgICAgICAgICAgIGFkZEFsbW9zdEFsbChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBwcm9wZXJ0eVNldHMuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFByb3BlcnR5U2V0IHBzID0gKFByb3BlcnR5U2V0KSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBhZGRBbG1vc3RBbGwocHMuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgb3V0cHV0LgorICAgICAqIFNlbmQgaXQgdGhlIHRoZSBuZXcgcHJvamVjdCBpZiBpcyBwcmVzZW50LCBvdGhlcndpc2UKKyAgICAgKiBjYWxsIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0VG9IYW5kbGUgVGhlIHN0cmluZyBvdXRwdXQgdG8gb3V0cHV0LgorICAgICAqIEBzZWUgVGFzayNoYW5kbGVPdXRwdXQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBvdXRwdXRUb0hhbmRsZSkgeworICAgICAgICBpZiAobmV3UHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXdQcm9qZWN0LmRlbXV4T3V0cHV0KG91dHB1dFRvSGFuZGxlLCBmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVPdXRwdXQob3V0cHV0VG9IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlcyBpbnB1dC4KKyAgICAgKiBEZWxlYXRlIHRvIHRoZSBjcmVhdGVkIHByb2plY3QsIGlmIHByZXNlbnQsIG90aGVyd2lzZQorICAgICAqIGNhbGwgdGhlIHN1cGVyIGNsYXNzLgorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgaXMgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGF0IHdoaWNoIGRhdGEgaXMgc3RvcmVkLgorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGRhdGEgY2Fubm90IGJlIHJlYWQuCisgICAgICogQHNlZSBUYXNrI2hhbmRsZUlucHV0KGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhbmRsZUlucHV0KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZXdQcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdQcm9qZWN0LmRlbXV4SW5wdXQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZUlucHV0KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgb3V0cHV0LgorICAgICAqIFNlbmQgaXQgdGhlIHRoZSBuZXcgcHJvamVjdCBpZiBpcyBwcmVzZW50LCBvdGhlcndpc2UKKyAgICAgKiBjYWxsIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdG9GbHVzaCBUaGUgc3RyaW5nIHRvIG91dHB1dC4KKyAgICAgKiBAc2VlIFRhc2sjaGFuZGxlRmx1c2goU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVGbHVzaChTdHJpbmcgdG9GbHVzaCkgeworICAgICAgICBpZiAobmV3UHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXdQcm9qZWN0LmRlbXV4Rmx1c2godG9GbHVzaCwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuaGFuZGxlRmx1c2godG9GbHVzaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgZXJyb3Igb3V0cHV0LgorICAgICAqIFNlbmQgaXQgdGhlIHRoZSBuZXcgcHJvamVjdCBpZiBpcyBwcmVzZW50LCBvdGhlcndpc2UKKyAgICAgKiBjYWxsIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gZXJyb3JPdXRwdXRUb0hhbmRsZSBUaGUgc3RyaW5nIHRvIG91dHB1dC4KKyAgICAgKgorICAgICAqIEBzZWUgVGFzayNoYW5kbGVFcnJvck91dHB1dChTdHJpbmcpCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVFcnJvck91dHB1dChTdHJpbmcgZXJyb3JPdXRwdXRUb0hhbmRsZSkgeworICAgICAgICBpZiAobmV3UHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXdQcm9qZWN0LmRlbXV4T3V0cHV0KGVycm9yT3V0cHV0VG9IYW5kbGUsIHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuaGFuZGxlRXJyb3JPdXRwdXQoZXJyb3JPdXRwdXRUb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgZXJyb3Igb3V0cHV0LgorICAgICAqIFNlbmQgaXQgdGhlIHRoZSBuZXcgcHJvamVjdCBpZiBpcyBwcmVzZW50LCBvdGhlcndpc2UKKyAgICAgKiBjYWxsIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gZXJyb3JPdXRwdXRUb0ZsdXNoIFRoZSBzdHJpbmcgdG8gb3V0cHV0LgorICAgICAqIEBzZWUgVGFzayNoYW5kbGVFcnJvckZsdXNoKFN0cmluZykKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlRXJyb3JGbHVzaChTdHJpbmcgZXJyb3JPdXRwdXRUb0ZsdXNoKSB7CisgICAgICAgIGlmIChuZXdQcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5ld1Byb2plY3QuZGVtdXhGbHVzaChlcnJvck91dHB1dFRvRmx1c2gsIHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuaGFuZGxlRXJyb3JGbHVzaChlcnJvck91dHB1dFRvRmx1c2gpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8gdGhlIGV4ZWN1dGlvbi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGEgdGFyZ2V0IHRyaWVzIHRvIGNhbGwgaXRzZWxmOworICAgICAqIHByb2JhYmx5IGFsc28gaWYgYSBCdWlsZEV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgdGhlIG5ldyBwcm9qZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBGaWxlIHNhdmVkRGlyID0gZGlyOworICAgICAgICBTdHJpbmcgc2F2ZWRBbnRGaWxlID0gYW50RmlsZTsKKyAgICAgICAgVmVjdG9yIGxvY2FscyA9IG5ldyBWZWN0b3IodGFyZ2V0cyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXROZXdQcm9qZWN0KCk7CisKKyAgICAgICAgICAgIGlmIChkaXIgPT0gbnVsbCAmJiBpbmhlcml0QWxsKSB7CisgICAgICAgICAgICAgICAgZGlyID0gZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5pdGlhbGl6ZVByb2plY3QoKTsKKworICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmV3UHJvamVjdC5zZXRCYXNlRGlyKGRpcik7CisgICAgICAgICAgICAgICAgaWYgKHNhdmVkRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGJlZW4gc2V0IGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgbmV3UHJvamVjdC5zZXRJbmhlcml0ZWRQcm9wZXJ0eShNYWdpY05hbWVzLlBST0pFQ1RfQkFTRURJUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlyID0gZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3ZlcnJpZGVQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgICAgIGlmIChhbnRGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhbnRGaWxlID0gTWFpbi5ERUZBVUxUX0JVSUxEX0ZJTEVOQU1FOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlIGZpbGUgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGRpciwgYW50RmlsZSk7CisgICAgICAgICAgICBhbnRGaWxlID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKworICAgICAgICAgICAgbG9nKCJjYWxsaW5nIHRhcmdldChzKSAiCisgICAgICAgICAgICAgICAgKyAoKGxvY2Fscy5zaXplKCkgPiAwKSA/IGxvY2Fscy50b1N0cmluZygpIDogIltkZWZhdWx0XSIpCisgICAgICAgICAgICAgICAgKyAiIGluIGJ1aWxkIGZpbGUgIiArIGFudEZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgbmV3UHJvamVjdC5zZXRVc2VyUHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfRklMRSAsIGFudEZpbGUpOworCisgICAgICAgICAgICBTdHJpbmcgdGhpc0FudEZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfRklMRSk7CisgICAgICAgICAgICAvLyBBcmUgd2UgdHJ5aW5nIHRvIGNhbGwgdGhlIHRhcmdldCBpbiB3aGljaCB3ZSBhcmUgZGVmaW5lZCAob3IKKyAgICAgICAgICAgIC8vIHRoZSBidWlsZCBmaWxlIGlmIHRoaXMgaXMgYSB0b3AgbGV2ZWwgdGFzayk/CisgICAgICAgICAgICBpZiAodGhpc0FudEZpbGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGZpbGUuZXF1YWxzKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSh0aGlzQW50RmlsZSkpCisgICAgICAgICAgICAgICAgJiYgZ2V0T3duaW5nVGFyZ2V0KCkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgaWYgKGdldE93bmluZ1RhcmdldCgpLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUYXNrTmFtZSgpLmVxdWFscygiYW50Y2FsbCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImFudGNhbGwgbXVzdCBub3QgYmUgdXNlZCBhdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGhlIHRvcCBsZXZlbC4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza05hbWUoKSArICIgdGFzayBhdCB0aGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0b3AgbGV2ZWwgbXVzdCBub3QgaW52b2tlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXRzIG93biBidWlsZCBmaWxlLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcm9qZWN0SGVscGVyLmNvbmZpZ3VyZVByb2plY3QobmV3UHJvamVjdCwgZmlsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IFByb2plY3RIZWxwZXIuYWRkTG9jYXRpb25Ub0J1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBleCwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsb2NhbHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFRhcmdldCA9IG5ld1Byb2plY3QuZ2V0RGVmYXVsdFRhcmdldCgpOworICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzLmFkZChkZWZhdWx0VGFyZ2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZXdQcm9qZWN0LmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0ZJTEUpCisgICAgICAgICAgICAgICAgLmVxdWFscyhnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfRklMRSkpCisgICAgICAgICAgICAgICAgJiYgZ2V0T3duaW5nVGFyZ2V0KCkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgU3RyaW5nIG93bmluZ1RhcmdldE5hbWUgPSBnZXRPd25pbmdUYXJnZXQoKS5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICBpZiAobG9jYWxzLmNvbnRhaW5zKG93bmluZ1RhcmdldE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrTmFtZSgpICsgIiB0YXNrIGNhbGxpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXRzIG93biBwYXJlbnQgdGFyZ2V0LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sZWFuIGNpcmN1bGFyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGxvY2Fscy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgIWNpcmN1bGFyICYmIGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgVGFyZ2V0IG90aGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChUYXJnZXQpIChnZXRQcm9qZWN0KCkuZ2V0VGFyZ2V0cygpLmdldChpdC5uZXh0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgY2lyY3VsYXIgfD0gKG90aGVyICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG90aGVyLmRlcGVuZHNPbihvd25pbmdUYXJnZXROYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaXJjdWxhcikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza05hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRhc2sgY2FsbGluZyBhIHRhcmdldCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aGF0IGRlcGVuZHMgb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXRzIHBhcmVudCB0YXJnZXQgXCciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG93bmluZ1RhcmdldE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwnLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWRkUmVmZXJlbmNlcygpOworCisgICAgICAgICAgICBpZiAobG9jYWxzLnNpemUoKSA+IDAgJiYgIShsb2NhbHMuc2l6ZSgpID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICIiLmVxdWFscyhsb2NhbHMuZ2V0KDApKSkpIHsKKyAgICAgICAgICAgICAgICBCdWlsZEV4Y2VwdGlvbiBiZSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJFbnRlcmluZyAiICsgYW50RmlsZSArICIuLi4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UHJvamVjdC5maXJlU3ViQnVpbGRTdGFydGVkKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld1Byb2plY3QuZXhlY3V0ZVRhcmdldHMobG9jYWxzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBiZSA9IFByb2plY3RIZWxwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRMb2NhdGlvblRvQnVpbGRFeGNlcHRpb24oZXgsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBiZTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkV4aXRpbmcgIiArIGFudEZpbGUgKyAiLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBuZXdQcm9qZWN0LmZpcmVTdWJCdWlsZEZpbmlzaGVkKGJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBoZWxwIHRoZSBnYworICAgICAgICAgICAgbmV3UHJvamVjdCA9IG51bGw7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcHJvcGVydGllcy5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eSBwID0gKFByb3BlcnR5KSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgcC5zZXRQcm9qZWN0KG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwgJiYgb3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXIgPSBzYXZlZERpcjsKKyAgICAgICAgICAgIGFudEZpbGUgPSBzYXZlZEFudEZpbGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgcHJvcGVydGllcyBpbiB0aGUgbmV3IHByb2plY3Qgd2l0aCB0aGUgb25lCisgICAgICogZXhwbGljaXRseSBkZWZpbmVkIGFzIG5lc3RlZCBlbGVtZW50cyBoZXJlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdW5kZXIgdW5rbm93biBjaXJjdW1zdGFuY2VzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvdmVycmlkZVByb3BlcnRpZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRlIHByb3BlcnRpZXMgLSBsYXN0IHByb3BlcnR5IHdpbnMKKyAgICAgICAgLy8gTmVlZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgIFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBmb3IgKGludCBpID0gcHJvcGVydGllcy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgUHJvcGVydHkgcCA9IChQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAocC5nZXROYW1lKCkgIT0gbnVsbCAmJiAhcC5nZXROYW1lKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIGlmIChzZXQuY29udGFpbnMocC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldC5hZGQocC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFbnVtZXJhdGlvbiBlID0gcHJvcGVydGllcy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgUHJvcGVydHkgcCA9IChQcm9wZXJ0eSkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgcC5zZXRQcm9qZWN0KG5ld1Byb2plY3QpOworICAgICAgICAgICAgcC5leGVjdXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0UHJvamVjdCgpLmNvcHlJbmhlcml0ZWRQcm9wZXJ0aWVzKG5ld1Byb2plY3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgcmVmZXJlbmNlcyBleHBsaWNpdGx5IGRlZmluZWQgYXMgbmVzdGVkIGVsZW1lbnRzIHRvIHRoZQorICAgICAqIG5ldyBwcm9qZWN0LiAgQWxzbyBjb3B5IG92ZXIgYWxsIHJlZmVyZW5jZXMgdGhhdCBkb24ndCBvdmVycmlkZQorICAgICAqIGV4aXN0aW5nIHJlZmVyZW5jZXMgaW4gdGhlIG5ldyBwcm9qZWN0IGlmIGluaGVyaXRyZWZzIGhhcyBiZWVuCisgICAgICogcmVxdWVzdGVkLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYSByZWZlcmVuY2UgZG9lcyBub3QgaGF2ZSBhIHJlZmlkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRSZWZlcmVuY2VzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaHRhYmxlIHRoaXNSZWZlcmVuY2VzCisgICAgICAgICAgICA9IChIYXNodGFibGUpIGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2VzKCkuY2xvbmUoKTsKKyAgICAgICAgSGFzaHRhYmxlIG5ld1JlZmVyZW5jZXMgPSBuZXdQcm9qZWN0LmdldFJlZmVyZW5jZXMoKTsKKyAgICAgICAgRW51bWVyYXRpb24gZTsKKyAgICAgICAgaWYgKHJlZmVyZW5jZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChlID0gcmVmZXJlbmNlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlZmlkID0gcmVmLmdldFJlZklkKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlZmlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0aGUgcmVmaWQgYXR0cmlidXRlIGlzIHJlcXVpcmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciByZWZlcmVuY2UgZWxlbWVudHMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzUmVmZXJlbmNlcy5jb250YWluc0tleShyZWZpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJQYXJlbnQgcHJvamVjdCBkb2Vzbid0IGNvbnRhaW4gYW55IHJlZmVyZW5jZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyByZWZpZCArICInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzUmVmZXJlbmNlcy5yZW1vdmUocmVmaWQpOworICAgICAgICAgICAgICAgIFN0cmluZyB0b1JlZmlkID0gcmVmLmdldFRvUmVmaWQoKTsKKyAgICAgICAgICAgICAgICBpZiAodG9SZWZpZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRvUmVmaWQgPSByZWZpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29weVJlZmVyZW5jZShyZWZpZCwgdG9SZWZpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgYWRkIGFsbCByZWZlcmVuY2VzIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIHRoZQorICAgICAgICAvLyBzdWJwcm9qZWN0LCBpZiBpbmhlcml0UmVmcyBpcyB0cnVlCisgICAgICAgIGlmIChpbmhlcml0UmVmcykgeworICAgICAgICAgICAgZm9yIChlID0gdGhpc1JlZmVyZW5jZXMua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1JlZmVyZW5jZXMuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29weVJlZmVyZW5jZShrZXksIGtleSk7CisgICAgICAgICAgICAgICAgbmV3UHJvamVjdC5pbmhlcml0SURSZWZlcmVuY2VzKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gY2xvbmUgYW5kIHJlY29uZmlndXJlIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSBvbGRrZXkgaW4KKyAgICAgKiB0aGUgcGFyZW50IHByb2plY3QgYW5kIGFkZCBpdCB0byB0aGUgbmV3IHByb2plY3Qgd2l0aCB0aGUga2V5IG5ld2tleS4KKyAgICAgKgorICAgICAqIDxwPklmIHdlIGNhbm5vdCBjbG9uZSBpdCwgY29weSB0aGUgcmVmZXJlbmNlZCBvYmplY3QgaXRzZWxmIGFuZAorICAgICAqIGtlZXAgb3VyIGZpbmdlcnMgY3Jvc3NlZC48L3A+CisgICAgICogQHBhcmFtIG9sZEtleSB0aGUgcmVmZXJlbmNlIGlkIGluIHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICogQHBhcmFtIG5ld0tleSB0aGUgcmVmZXJlbmNlIGlkIGluIHRoZSBuZXcgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY29weVJlZmVyZW5jZShTdHJpbmcgb2xkS2V5LCBTdHJpbmcgbmV3S2V5KSB7CisgICAgICAgIE9iamVjdCBvcmlnID0gZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShvbGRLZXkpOworICAgICAgICBpZiAob3JpZyA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2coIk5vIG9iamVjdCByZWZlcmVuY2VkIGJ5ICIgKyBvbGRLZXkgKyAiLiBDYW4ndCBjb3B5IHRvICIKKyAgICAgICAgICAgICAgICArIG5ld0tleSwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIENsYXNzIGMgPSBvcmlnLmdldENsYXNzKCk7CisgICAgICAgIE9iamVjdCBjb3B5ID0gb3JpZzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBjbG9uZU0gPSBjLmdldE1ldGhvZCgiY2xvbmUiLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICAgICAgaWYgKGNsb25lTSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29weSA9IGNsb25lTS5pbnZva2Uob3JpZywgbmV3IE9iamVjdFswXSk7CisgICAgICAgICAgICAgICAgbG9nKCJBZGRpbmcgY2xvbmUgb2YgcmVmZXJlbmNlICIgKyBvbGRLZXksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG5vdCBDbG9uYWJsZQorICAgICAgICB9CisKKworICAgICAgICBpZiAoY29weSBpbnN0YW5jZW9mIFByb2plY3RDb21wb25lbnQpIHsKKyAgICAgICAgICAgICgoUHJvamVjdENvbXBvbmVudCkgY29weSkuc2V0UHJvamVjdChuZXdQcm9qZWN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTWV0aG9kIHNldFByb2plY3RNID0KKyAgICAgICAgICAgICAgICAgICAgYy5nZXRNZXRob2QoInNldFByb2plY3QiLCBuZXcgQ2xhc3NbXSB7UHJvamVjdC5jbGFzc30pOworICAgICAgICAgICAgICAgIGlmIChzZXRQcm9qZWN0TSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFByb2plY3RNLmludm9rZShjb3B5LCBuZXcgT2JqZWN0W10ge25ld1Byb2plY3R9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGlmIHRoZSBjbGFzcyBiZWluZyByZWZlcmVuY2VkIGRvZXMgbm90IGhhdmUKKyAgICAgICAgICAgICAgICAvLyBhIHNldCBwcm9qZWN0IG1ldGhvZC4KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igc2V0dGluZyBuZXcgcHJvamVjdCBpbnN0YW5jZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICArICJyZWZlcmVuY2Ugd2l0aCBpZCAiICsgb2xkS2V5OworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUyLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuZXdQcm9qZWN0LmFkZFJlZmVyZW5jZShuZXdLZXksIGNvcHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllcyBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBnaXZlbiB0YWJsZSB0byB0aGUgbmV3IHByb2plY3QgLQorICAgICAqIG9taXR0aW5nIHRob3NlIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGluIHRoZSBuZXcgcHJvamVjdCBhcworICAgICAqIHdlbGwgYXMgcHJvcGVydGllcyBuYW1lZCBiYXNlZGlyIG9yIGFudC5maWxlLgorICAgICAqIEBwYXJhbSBwcm9wcyBwcm9wZXJ0aWVzIDxjb2RlPkhhc2h0YWJsZTwvY29kZT4gdG8gY29weSB0byB0aGUKKyAgICAgKiBuZXcgcHJvamVjdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRBbG1vc3RBbGwoSGFzaHRhYmxlIHByb3BzKSB7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBwcm9wcy5rZXlzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoTWFnaWNOYW1lcy5QUk9KRUNUX0JBU0VESVIuZXF1YWxzKGtleSkgfHwgTWFnaWNOYW1lcy5BTlRfRklMRS5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgIC8vIGJhc2VkaXIgYW5kIGFudC5maWxlIGdldCBzcGVjaWFsIHRyZWF0bWVudCBpbiBleGVjdXRlKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0KGtleSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIC8vIGRvbid0IHJlLXNldCB1c2VyIHByb3BlcnRpZXMsIGF2b2lkIHRoZSB3YXJuaW5nIG1lc3NhZ2UKKyAgICAgICAgICAgIGlmIChuZXdQcm9qZWN0LmdldFByb3BlcnR5KGtleSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIG5vIHVzZXIgcHJvcGVydHkKKyAgICAgICAgICAgICAgICBuZXdQcm9qZWN0LnNldE5ld1Byb3BlcnR5KGtleSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yeSB0byB1c2UgYXMgYSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIG5ldyBBbnQgcHJvamVjdC4KKyAgICAgKiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBwcm9qZWN0J3MgYmFzZWRpciwgdW5sZXNzIGluaGVyaXRhbGwKKyAgICAgKiBoYXMgYmVlbiBzZXQgdG8gZmFsc2UsIGluIHdoaWNoIGNhc2UgaXQgZG9lc24ndCBoYXZlIGEgZGVmYXVsdAorICAgICAqIHZhbHVlLiBUaGlzIHdpbGwgb3ZlcnJpZGUgdGhlIGJhc2VkaXIgc2V0dGluZyBvZiB0aGUgY2FsbGVkIHByb2plY3QuCisgICAgICogQHBhcmFtIGRpciBuZXcgZGlyZWN0b3J5IGFzIDxjb2RlPkZpbGU8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgeworICAgICAgICB0aGlzLmRpciA9IGRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYnVpbGQgZmlsZSB0byB1c2UuIERlZmF1bHRzIHRvICJidWlsZC54bWwiLiBUaGlzIGZpbGUgaXMgZXhwZWN0ZWQKKyAgICAgKiB0byBiZSBhIGZpbGVuYW1lIHJlbGF0aXZlIHRvIHRoZSBkaXIgYXR0cmlidXRlIGdpdmVuLgorICAgICAqIEBwYXJhbSBhbnRGaWxlIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGJ1aWxkIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbnRmaWxlKFN0cmluZyBhbnRGaWxlKSB7CisgICAgICAgIC8vIEBub3RlOiBpdCBpcyBhIHN0cmluZyBhbmQgbm90IGEgZmlsZSB0byBoYW5kbGUgcmVsYXRpdmUvYWJzb2x1dGUKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGEgcmVsYXRpdmUgZmlsZSB3aWxsIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjdXJyZW50CisgICAgICAgIC8vIGJhc2VkaXIuCisgICAgICAgIHRoaXMuYW50RmlsZSA9IGFudEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBvZiB0aGUgbmV3IEFudCBwcm9qZWN0IHRvIGV4ZWN1dGUuCisgICAgICogRGVmYXVsdHMgdG8gdGhlIG5ldyBwcm9qZWN0J3MgZGVmYXVsdCB0YXJnZXQuCisgICAgICogQHBhcmFtIHRhcmdldFRvQWRkIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgdG8gaW52b2tlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChTdHJpbmcgdGFyZ2V0VG9BZGQpIHsKKyAgICAgICAgaWYgKHRhcmdldFRvQWRkLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGFyZ2V0IGF0dHJpYnV0ZSBtdXN0IG5vdCBiZSBlbXB0eSIpOworICAgICAgICB9CisgICAgICAgIHRhcmdldHMuYWRkKHRhcmdldFRvQWRkKTsKKyAgICAgICAgdGFyZ2V0QXR0cmlidXRlU2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZpbGVuYW1lIHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8uIFRoaXMgaXMgcmVsYXRpdmUgdG8gdGhlIHZhbHVlCisgICAgICogb2YgdGhlIGRpciBhdHRyaWJ1dGUgaWYgaXQgaGFzIGJlZW4gc2V0IG9yIHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUKKyAgICAgKiBjdXJyZW50IHByb2plY3Qgb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBvdXRwdXRGaWxlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdoaWNoIHRoZSBvdXRwdXQgc2hvdWxkIGdvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgb3V0cHV0RmlsZSkgeworICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvcGVydHkgdG8gcGFzcyB0byB0aGUgbmV3IHByb2plY3QuCisgICAgICogVGhlIHByb3BlcnR5IGlzIHBhc3NlZCBhcyBhICd1c2VyIHByb3BlcnR5Jy4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIDxjb2RlPlByb3BlcnR5PC9jb2RlPiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCkgeworICAgICAgICBQcm9wZXJ0eSBwID0gbmV3IFByb3BlcnR5KHRydWUsIGdldFByb2plY3QoKSk7CisgICAgICAgIHAuc2V0UHJvamVjdChnZXROZXdQcm9qZWN0KCkpOworICAgICAgICBwLnNldFRhc2tOYW1lKCJwcm9wZXJ0eSIpOworICAgICAgICBwcm9wZXJ0aWVzLmFkZEVsZW1lbnQocCk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFJlZmVyZW5jZSBlbGVtZW50IGlkZW50aWZ5aW5nIGEgZGF0YSB0eXBlIHRvIGNhcnJ5CisgICAgICogb3ZlciB0byB0aGUgbmV3IHByb2plY3QuCisgICAgICogQHBhcmFtIHJlZiA8Y29kZT5SZWZlcmVuY2U8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2UoUmVmZXJlbmNlIHJlZikgeworICAgICAgICByZWZlcmVuY2VzLmFkZEVsZW1lbnQocmVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB0YXJnZXQgdG8gdGhpcyBBbnQgaW52b2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gdCB0aGUgPGNvZGU+VGFyZ2V0RWxlbWVudDwvY29kZT4gdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkVGFyZ2V0KFRhcmdldEVsZW1lbnQgdCkgeworICAgICAgICBpZiAodGFyZ2V0QXR0cmlidXRlU2V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIm5lc3RlZCB0YXJnZXQgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IHQuZ2V0TmFtZSgpOworICAgICAgICBpZiAobmFtZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRhcmdldCBuYW1lIG11c3Qgbm90IGJlIGVtcHR5Iik7CisgICAgICAgIH0KKyAgICAgICAgdGFyZ2V0cy5hZGQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgbmV3IHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHMgPGNvZGU+UHJvcGVydHlTZXQ8L2NvZGU+IHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5c2V0KFByb3BlcnR5U2V0IHBzKSB7CisgICAgICAgIHByb3BlcnR5U2V0cy5hZGRFbGVtZW50KHBzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIChzdWIpLVByb2plY3QgaW5zdGFuY2UgY3VycmVudGx5IGluIHVzZS4KKyAgICAgKiBAcmV0dXJuIFByb2plY3QKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCBQcm9qZWN0IGdldE5ld1Byb2plY3QoKSB7CisgICAgICAgIGlmIChuZXdQcm9qZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlaW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdQcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwcml2YXRlIEl0ZXJhdG9yIGdldEJ1aWxkTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldEJ1aWxkTGlzdGVuZXJzKCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBuZXN0ZWQgJmx0O3JlZmVyZW5jZSZndDsKKyAgICAgKiBlbGVtZW50IG9mICZsdDthbnQmZ3Q7IGFuZCAmbHQ7YW50Y2FsbCZndDsuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2UKKyAgICAgICAgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UgeworCisgICAgICAgIC8qKiBDcmVhdGVzIGEgcmVmZXJlbmNlIHRvIGJlIGNvbmZpZ3VyZWQgYnkgQW50LiAqLworICAgICAgICBwdWJsaWMgUmVmZXJlbmNlKCkgeworICAgICAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRpZCA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgaWQgdGhhdCB0aGlzIHJlZmVyZW5jZSB0byBiZSBzdG9yZWQgdW5kZXIgaW4gdGhlCisgICAgICAgICAqIG5ldyBwcm9qZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0aWQgdGhlIGlkIHVuZGVyIHdoaWNoIHRoaXMgcmVmZXJlbmNlIHdpbGwgYmUgcGFzc2VkIHRvCisgICAgICAgICAqICAgICAgICB0aGUgbmV3IHByb2plY3QuICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRvUmVmaWQoU3RyaW5nIHRhcmdldGlkKSB7CisgICAgICAgICAgICB0aGlzLnRhcmdldGlkID0gdGFyZ2V0aWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBpZCB1bmRlciB3aGljaCB0aGlzIHJlZmVyZW5jZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgbmV3CisgICAgICAgICAqIHByb2plY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSByZWZlcmVuY2UgaW4gdGhlIG5ldyBwcm9qZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUb1JlZmlkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRhcmdldGlkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgbmVzdGVkICZsdDt0YXJnZXQmZ3Q7CisgICAgICogZWxlbWVudCBvZiAmbHQ7YW50Jmd0OyBhbmQgJmx0O2FudGNhbGwmZ3Q7LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhcmdldEVsZW1lbnQgeworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFRhcmdldEVsZW1lbnQoKSB7CisgICAgICAgICAgICAgICAgLy9kZWZhdWx0CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoaXMgVGFyZ2V0RWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgICB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0YXJnZXQgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoaXMgVGFyZ2V0RWxlbWVudC4KKyAgICAgICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRTdHJ1Y3R1cmUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFN0cnVjdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2IyYTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRTdHJ1Y3R1cmUuamF2YQpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkludHJvc3BlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tDb250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CisKKy8qKgorICogQ3JlYXRlcyBhIHBhcnRpYWwgRFREIGZvciBBbnQgZnJvbSB0aGUgY3VycmVudGx5IGtub3duIHRhc2tzLgorICoKKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0ieG1sIgorICovCitwdWJsaWMgY2xhc3MgQW50U3RydWN0dXJlIGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVAKKyAgICAgICAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0OworICAgIHByaXZhdGUgU3RydWN0dXJlUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBvdXRwdXQgZmlsZS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChGaWxlIG91dHB1dCkgeworICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgU3RydWN0dXJlUHJpbnRlciB0byB1c2UuCisgICAgICogQHBhcmFtIHAgdGhlIHByaW50ZXIgdG8gdXNlLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKFN0cnVjdHVyZVByaW50ZXIgcCkgeworICAgICAgICBwcmludGVyID0gcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCB0aGUgYW50c3RydWN0dXJlIERURC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIERURCBjYW5ub3QgYmUgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib3V0cHV0IGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0KSwgIlVURjgiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBQbGFpbiBpbXBvc3NpYmxlIHdpdGggVVRGOCwgc2VlCisgICAgICAgICAgICAgICAgICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbAorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogZmFsbGJhY2sgdG8gcGxhdGZvcm0gc3BlY2lmaWMgYW55d2F5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihvdXRwdXQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRlci5wcmludEhlYWQob3V0LCBnZXRQcm9qZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0VGFza0RlZmluaXRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpKTsKKworICAgICAgICAgICAgcHJpbnRlci5wcmludFRhcmdldERlY2wob3V0KTsKKworICAgICAgICAgICAgRW51bWVyYXRpb24gZGF0YVR5cGVzID0gZ2V0UHJvamVjdCgpLmdldERhdGFUeXBlRGVmaW5pdGlvbnMoKS5rZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoZGF0YVR5cGVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gKFN0cmluZykgZGF0YVR5cGVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludEVsZW1lbnREZWNsKAorICAgICAgICAgICAgICAgICAgICBvdXQsIGdldFByb2plY3QoKSwgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIChDbGFzcykgZ2V0UHJvamVjdCgpLmdldERhdGFUeXBlRGVmaW5pdGlvbnMoKS5nZXQodHlwZU5hbWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRW51bWVyYXRpb24gdGFza3MgPSBnZXRQcm9qZWN0KCkuZ2V0VGFza0RlZmluaXRpb25zKCkua2V5cygpOworICAgICAgICAgICAgd2hpbGUgKHRhc2tzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHROYW1lID0gKFN0cmluZykgdGFza3MubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBwcmludGVyLnByaW50RWxlbWVudERlY2wob3V0LCBnZXRQcm9qZWN0KCksIHROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2xhc3MpIGdldFByb2plY3QoKS5nZXRUYXNrRGVmaW5pdGlvbnMoKS5nZXQodE5hbWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRlci5wcmludFRhaWwob3V0KTsKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igd3JpdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXQuZ2V0QWJzb2x1dGVQYXRoKCksIGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgYWN0dWFsIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIDxwPntAbGluayAjcHJpbnRIZWFkfSwge0BsaW5rICNwcmludFRhcmdldERlY2x9IGFuZCB7QGxpbmsgI3ByaW50VGFpbH0KKyAgICAgKiBhcmUgY2FsbGVkIGV4YWN0bHkgb25jZSwge0BsaW5rICNwcmludEVsZW1lbnREZWNsfSBvbmNlIGZvcgorICAgICAqIGVhY2ggZGVjbGFyZWQgdGFzayBhbmQgdHlwZS48L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgU3RydWN0dXJlUHJpbnRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBQcmludHMgdGhlIGhlYWRlciBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG91dCBQcmludFdyaXRlciB0byB3cml0ZSB0by4KKyAgICAgICAgICogQHBhcmFtIHAgUHJvamVjdCBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnQgdGFzaworICAgICAgICAgKiBAcGFyYW0gdGFza3MgbWFwIChuYW1lIHRvIGltcGxlbWVudGluZyBjbGFzcykKKyAgICAgICAgICogQHBhcmFtIHR5cGVzIG1hcCAobmFtZSB0byBpbXBsZW1lbnRpbmcgY2xhc3MpCisgICAgICAgICAqIGRhdGEgdHlwZXMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHByaW50SGVhZChQcmludFdyaXRlciBvdXQsIFByb2plY3QgcCwgSGFzaHRhYmxlIHRhc2tzLAorICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgdHlwZXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcmludHMgdGhlIGRlZmluaXRpb24gZm9yIHRoZSB0YXJnZXQgZWxlbWVudC4KKyAgICAgICAgICogQHBhcmFtIG91dCBQcmludFdyaXRlciB0byB3cml0ZSB0by4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJpbnRUYXJnZXREZWNsKFByaW50V3JpdGVyIG91dCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByaW50IHRoZSBkZWZpbml0aW9uIGZvciBhIGdpdmVuIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvdXQgUHJpbnRXcml0ZXIgdG8gd3JpdGUgdG8uCisgICAgICAgICAqIEBwYXJhbSBwIFByb2plY3QgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IHRhc2sKKyAgICAgICAgICogQHBhcmFtIG5hbWUgZWxlbWVudCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBjbGFzcyBvZiB0aGUgZGVmaW5lZCBlbGVtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwcmludEVsZW1lbnREZWNsKFByaW50V3JpdGVyIG91dCwgUHJvamVjdCBwLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGVsZW1lbnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcmludHMgdGhlIHRyYWlsZXIuCisgICAgICAgICAqIEBwYXJhbSBvdXQgUHJpbnRXcml0ZXIgdG8gd3JpdGUgdG8uCisgICAgICAgICAqLworICAgICAgICB2b2lkIHByaW50VGFpbChQcmludFdyaXRlciBvdXQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERURFByaW50ZXIgaW1wbGVtZW50cyBTdHJ1Y3R1cmVQcmludGVyIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTiA9ICIlYm9vbGVhbjsiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1MgPSAiJXRhc2tzOyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFUyA9ICIldHlwZXM7IjsKKworICAgICAgICBwcml2YXRlIEhhc2h0YWJsZSB2aXNpdGVkID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50VGFpbChQcmludFdyaXRlciBvdXQpIHsKKyAgICAgICAgICAgIHZpc2l0ZWQuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50SGVhZChQcmludFdyaXRlciBvdXQsIFByb2plY3QgcCwgSGFzaHRhYmxlIHRhc2tzLCBIYXNodGFibGUgdHlwZXMpIHsKKyAgICAgICAgICAgIHByaW50SGVhZChvdXQsIHRhc2tzLmtleXMoKSwgdHlwZXMua2V5cygpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByaW50cyB0aGUgaGVhZGVyIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5CYXNpY2FsbHkgdGhpcyBwcmludHMgdGhlIFhNTCBkZWNsYXJhdGlvbiwgZGVmaW5lcyBzb21lCisgICAgICAgICAqIGVudGl0aWVzIGFuZCB0aGUgcHJvamVjdCBlbGVtZW50LjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludEhlYWQoUHJpbnRXcml0ZXIgb3V0LCBFbnVtZXJhdGlvbiB0YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiB0eXBlcykgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8IUVOVElUWSAlIGJvb2xlYW4gXCIodHJ1ZXxmYWxzZXxvbnxvZmZ8eWVzfG5vKVwiPiIpOworICAgICAgICAgICAgb3V0LnByaW50KCI8IUVOVElUWSAlIHRhc2tzIFwiIik7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlICh0YXNrcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0TmFtZSA9IChTdHJpbmcpIHRhc2tzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiB8ICIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludCh0TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbigiXCI+Iik7CisgICAgICAgICAgICBvdXQucHJpbnQoIjwhRU5USVRZICUgdHlwZXMgXCIiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlICh0eXBlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IChTdHJpbmcpIHR5cGVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiB8ICIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludCh0eXBlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbigiXCI+Iik7CisKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIiKTsKKworICAgICAgICAgICAgb3V0LnByaW50KCI8IUVMRU1FTlQgcHJvamVjdCAodGFyZ2V0IHwgIik7CisgICAgICAgICAgICBvdXQucHJpbnQoVEFTS1MpOworICAgICAgICAgICAgb3V0LnByaW50KCIgfCAiKTsKKyAgICAgICAgICAgIG91dC5wcmludChUWVBFUyk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiKSo+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPCFBVFRMSVNUIHByb2plY3QiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgbmFtZSAgICBDREFUQSAjSU1QTElFRCIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgICBkZWZhdWx0IENEQVRBICNJTVBMSUVEIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgICAgICAgIGJhc2VkaXIgQ0RBVEEgI0lNUExJRUQ+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJpbnRzIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgdGFyZ2V0IGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwcmludFRhcmdldERlY2woUHJpbnRXcml0ZXIgb3V0KSB7CisgICAgICAgICAgICBvdXQucHJpbnQoIjwhRUxFTUVOVCB0YXJnZXQgKCIpOworICAgICAgICAgICAgb3V0LnByaW50KFRBU0tTKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiIHwgIik7CisgICAgICAgICAgICBvdXQucHJpbnQoVFlQRVMpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIikqPiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIiIpOworCisgICAgICAgICAgICBvdXQucHJpbnRsbigiPCFBVFRMSVNUIHRhcmdldCIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgICBpZCAgICAgICAgICBJRCAgICAjSU1QTElFRCIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgICBuYW1lICAgICAgICBDREFUQSAjUkVRVUlSRUQiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgaWYgICAgICAgICAgQ0RBVEEgI0lNUExJRUQiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgdW5sZXNzICAgICAgQ0RBVEEgI0lNUExJRUQiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgZGVwZW5kcyAgICAgQ0RBVEEgI0lNUExJRUQiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgZGVzY3JpcHRpb24gQ0RBVEEgI0lNUExJRUQ+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJpbnQgdGhlIGRlZmluaXRpb24gZm9yIGEgZ2l2ZW4gZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50RWxlbWVudERlY2woUHJpbnRXcml0ZXIgb3V0LCBQcm9qZWN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIENsYXNzIGVsZW1lbnQpIHsKKworICAgICAgICAgICAgaWYgKHZpc2l0ZWQuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXNpdGVkLnB1dChuYW1lLCAiIik7CisKKyAgICAgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIgaWggPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKHAsIGVsZW1lbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFhYWCAtIGZhaWxlZCB0byBsb2FkIHRoZSBjbGFzcyBwcm9wZXJseS4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIHNob3VsZCB3ZSBwcmludCBhIHdhcm5pbmcgaGVyZT8KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIjwhRUxFTUVOVCAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lKS5hcHBlbmQoIiAiKTsKKworICAgICAgICAgICAgaWYgKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZS5jbGFzcy5lcXVhbHMoZWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkVNUFRZPiIpLmFwcGVuZChMSU5FX1NFUCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8IUFUVExJU1QgIikuYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChMSU5FX1NFUCkuYXBwZW5kKCIgICAgICAgICAgaWQgSUQgI0lNUExJRUQiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoTElORV9TRVApLmFwcGVuZCgiICAgICAgICAgIHJlZmlkIElEUkVGICNJTVBMSUVEIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI+IikuYXBwZW5kKExJTkVfU0VQKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihzYik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIGlmIChpaC5zdXBwb3J0c0NoYXJhY3RlcnMoKSkgeworICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiI1BDREFUQSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoVGFza0NvbnRhaW5lci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KFRBU0tTKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGloLmdldE5lc3RlZEVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudChlLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkVNUFRZIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiKCIpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHYuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiB8ICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh2LmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDEgfHwgIXYuZWxlbWVudEF0KDApLmVxdWFscygiI1BDREFUQSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiKiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oc2IpOworCisgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIjwhQVRUTElTVCAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChMSU5FX1NFUCkuYXBwZW5kKCIgICAgICAgICAgaWQgSUQgI0lNUExJRUQiKTsKKworICAgICAgICAgICAgZSA9IGloLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmICgiaWQiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKExJTkVfU0VQKS5hcHBlbmQoIiAgICAgICAgICAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGF0dHJOYW1lKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gaWguZ2V0QXR0cmlidXRlVHlwZShhdHRyTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscyhqYXZhLmxhbmcuQm9vbGVhbi5UWVBFKSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoQk9PTEVBTikuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChSZWZlcmVuY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIklEUkVGICIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRW51bWVyYXRlZEF0dHJpYnV0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGVkQXR0cmlidXRlIGVhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRW51bWVyYXRlZEF0dHJpYnV0ZSkgdHlwZS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gZWEuZ2V0VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB2YWx1ZXMubGVuZ3RoID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhYXJlTm10b2tlbnModmFsdWVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiQ0RBVEEgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiKCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiKSAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJDREFUQSAiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJDREFUQSAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZS5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiamF2YS5sYW5nLkVudW0iKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKSB0eXBlLmdldE1ldGhvZCgidmFsdWVzIiwgKENsYXNzW10pICBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZva2UobnVsbCwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkNEQVRBICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJygnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiB8ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0eXBlLmdldE1ldGhvZCgibmFtZSIsIChDbGFzc1tdKSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludm9rZSh2YWx1ZXNbaV0sIChPYmplY3RbXSkgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIikgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkNEQVRBICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJDREFUQSAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIjSU1QTElFRCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCI+IikuYXBwZW5kKExJTkVfU0VQKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKHNiKTsKKworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gdi5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmVzdGVkTmFtZSA9IChTdHJpbmcpIHYuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgIGlmICghIiNQQ0RBVEEiLmVxdWFscyhuZXN0ZWROYW1lKQorICAgICAgICAgICAgICAgICAgICAmJiAhVEFTS1MuZXF1YWxzKG5lc3RlZE5hbWUpCisgICAgICAgICAgICAgICAgICAgICYmICFUWVBFUy5lcXVhbHMobmVzdGVkTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRFbGVtZW50RGVjbChvdXQsIHAsIG5lc3RlZE5hbWUsIGloLmdldEVsZW1lbnRUeXBlKG5lc3RlZE5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRG9lcyB0aGlzIFN0cmluZyBtYXRjaCB0aGUgWE1MLU5NVE9LRU4gcHJvZHVjdGlvbj8KKyAgICAgICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byB0ZXN0CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIFhNTC1OTVRPS0VOCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNObXRva2VuKFN0cmluZyBzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAvLyBYWFggLSB3ZSBhcmUgY29tbWl0dGluZyBDb21iaW5pbmdDaGFyIGFuZCBFeHRlbmRlciBoZXJlCisgICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpCisgICAgICAgICAgICAgICAgICAgICYmIGMgIT0gJy4nICYmIGMgIT0gJy0nICYmIGMgIT0gJ18nICYmIGMgIT0gJzonKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEbyB0aGUgU3RyaW5ncyBhbGwgbWF0Y2ggdGhlIFhNTC1OTVRPS0VOIHByb2R1Y3Rpb24/CisgICAgICAgICAqCisgICAgICAgICAqIDxwPk90aGVyd2lzZSB0aGV5IGFyZSBub3Qgc3VpdGFibGUgYXMgYW4gZW51bWVyYXRlZCBhdHRyaWJ1dGUsCisgICAgICAgICAqIGZvciBleGFtcGxlLjwvcD4KKyAgICAgICAgICogQHBhcmFtIHMgdGhlIGFycmF5IG9mIHN0cmluZyB0byB0ZXN0CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgdGhlIHN0cmluZ3MgaW4gdGhlIGFycmF5IG1hdGggWE1MLU5NVE9LRU4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBhcmVObXRva2VucyhTdHJpbmdbXSBzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTm10b2tlbihzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoaXMgU3RyaW5nIG1hdGNoIHRoZSBYTUwtTk1UT0tFTiBwcm9kdWN0aW9uPworICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gdGVzdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIFhNTC1OTVRPS0VOCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNObXRva2VuKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBEVERQcmludGVyLmlzTm10b2tlbihzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgU3RyaW5ncyBhbGwgbWF0Y2ggdGhlIFhNTC1OTVRPS0VOIHByb2R1Y3Rpb24/CisgICAgICoKKyAgICAgKiA8cD5PdGhlcndpc2UgdGhleSBhcmUgbm90IHN1aXRhYmxlIGFzIGFuIGVudW1lcmF0ZWQgYXR0cmlidXRlLAorICAgICAqIGZvciBleGFtcGxlLjwvcD4KKyAgICAgKiBAcGFyYW0gcyB0aGUgYXJyYXkgb2Ygc3RyaW5nIHRvIHRlc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIHRoZSBzdHJpbmdzIGluIHRoZSBhcnJheSBtYXRoIFhNTC1OTVRPS0VOCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJlTm10b2tlbnMoU3RyaW5nW10gcykgeworICAgICAgICByZXR1cm4gRFREUHJpbnRlci5hcmVObXRva2VucyhzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRsaWIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudGxpYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMWU1NjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRsaWIuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkNvbXBvbmVudEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyLlByb2plY3RIZWxwZXIyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlVua25vd25FbGVtZW50OworCisKKy8qKgorICogQW50bGliIHRhc2suIEl0IGRvZXMgbm90CisgKiBvY2N1ciBpbiBhbiBhbnQgYnVpbGQgZmlsZS4gSXQgaXMgdGhlIHJvb3QgZWxlbWVudAorICogYW4gYW50bGliIHhtbCBmaWxlLgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBBbnRsaWIgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7CisgICAgLy8KKyAgICAvLyBTdGF0aWMKKyAgICAvLworCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgdGFzayAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJhbnRsaWIiOworCisgICAgLyoqCisgICAgICogU3RhdGljIG1ldGhvZCB0byByZWFkIGFuIGFudCBsaWIgZGVmaW5pdGlvbiBmcm9tCisgICAgICogYSB1cmwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCAgIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcGFyYW0gYW50bGliVXJsIHRoZSB1cmwgdG8gcmVhZCB0aGUgZGVmaW5pdGlvbnMgZnJvbQorICAgICAqIEBwYXJhbSB1cmkgICAgICAgdGhlIHVyaSB0aGF0IHRoZSBhbnRsaWIgaXMgdG8gYmUgcGxhY2VkIGluCisgICAgICogQHJldHVybiAgIHRoZSBhbnQgbGliIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFudGxpYiBjcmVhdGVBbnRsaWIoUHJvamVjdCBwcm9qZWN0LCBVUkwgYW50bGliVXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiBjb250YWN0IHRoZSBVUkwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFudGxpYlVybC5vcGVuQ29ubmVjdGlvbigpLmNvbm5lY3QoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgIiArIGFudGxpYlVybCwgZXgpOworICAgICAgICB9CisgICAgICAgIENvbXBvbmVudEhlbHBlciBoZWxwZXIgPQorICAgICAgICAgICAgQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEhlbHBlcihwcm9qZWN0KTsKKyAgICAgICAgaGVscGVyLmVudGVyQW50TGliKHVyaSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaG91bGQgYmUgc2FmZSB0byBwYXJzZQorICAgICAgICAgICAgUHJvamVjdEhlbHBlcjIgcGFyc2VyID0gbmV3IFByb2plY3RIZWxwZXIyKCk7CisgICAgICAgICAgICBVbmtub3duRWxlbWVudCB1ZSA9CisgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlVW5rbm93bkVsZW1lbnQocHJvamVjdCwgYW50bGliVXJsKTsKKyAgICAgICAgICAgIC8vIENoZWNrIG5hbWUgaXMgImFudGxpYiIKKyAgICAgICAgICAgIGlmICghKHVlLmdldFRhZygpLmVxdWFscyhUQUcpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgdGFnICIgKyB1ZS5nZXRUYWcoKSArICIgZXhwZWN0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgKyBUQUcsIHVlLmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQW50bGliIGFudGxpYiA9IG5ldyBBbnRsaWIoKTsKKyAgICAgICAgICAgIGFudGxpYi5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICAgICAgYW50bGliLnNldExvY2F0aW9uKHVlLmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgYW50bGliLnNldFRhc2tOYW1lKCJhbnRsaWIiKTsKKyAgICAgICAgICAgIGFudGxpYi5pbml0KCk7CisgICAgICAgICAgICB1ZS5jb25maWd1cmUoYW50bGliKTsKKyAgICAgICAgICAgIHJldHVybiBhbnRsaWI7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBoZWxwZXIuZXhpdEFudExpYigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLworICAgIC8vIEluc3RhbmNlCisgICAgLy8KKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOworICAgIHByaXZhdGUgU3RyaW5nICAgICAgdXJpID0gIiI7CisgICAgcHJpdmF0ZSBMaXN0ICB0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3MgbG9hZGVyIGZvciB0aGlzIGFudGxpYi4KKyAgICAgKiBUaGlzIGNsYXNzIGxvYWRlciBpcyB1c2VkIGZvciBhbnkgdGFza3MgdGhhdAorICAgICAqIGRlcml2ZSBmcm9tIERlZmluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgdGhlIGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVSSSBmb3IgdGhpcyBhbnRsaWIuCisgICAgICogQHBhcmFtIHVyaSB0aGUgbmFtZXNwYWNlIHVyaQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkICBzZXRVUkkoU3RyaW5nIHVyaSkgeworICAgICAgICB0aGlzLnVyaSA9IHVyaTsKKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgeworICAgICAgICBpZiAoY2xhc3NMb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBBbnRsaWIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgdGFzayB0byB0aGUgbGlzdCBvZiB0YXNrcworICAgICAqCisgICAgICogQHBhcmFtIG5lc3RlZFRhc2sgTmVzdGVkIHRhc2sgdG8gZXhlY3V0ZSBpbiBhbnRsaWIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgbmVzdGVkVGFzaykgeworICAgICAgICB0YXNrcy5hZGQobmVzdGVkVGFzayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgbmVzdGVkIHRhc2tzLCBzZXR0aW5nIHRoZSBjbGFzc2xvYWRlciBmb3IKKyAgICAgKiBhbnkgdGFza3MgdGhhdCBkZXJpdmUgZnJvbSBEZWZpbmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRhc2tzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgdWUgPSAoVW5rbm93bkVsZW1lbnQpIGkubmV4dCgpOworICAgICAgICAgICAgc2V0TG9jYXRpb24odWUuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB1ZS5tYXliZUNvbmZpZ3VyZSgpOworICAgICAgICAgICAgT2JqZWN0IGNvbmZpZ3VyZWRPYmplY3QgPSB1ZS5nZXRSZWFsVGhpbmcoKTsKKyAgICAgICAgICAgIGlmIChjb25maWd1cmVkT2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKGNvbmZpZ3VyZWRPYmplY3QgaW5zdGFuY2VvZiBBbnRsaWJEZWZpbml0aW9uKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdGFzayBpbiBhbnRsaWIgIiArIHVlLmdldFRhZygpCisgICAgICAgICAgICAgICAgICAgICsgIiAiICsgY29uZmlndXJlZE9iamVjdC5nZXRDbGFzcygpICsgIiBkb2VzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICsgImV4dGVuZCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnRsaWJEZWZpbml0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBbnRsaWJEZWZpbml0aW9uIGRlZiA9IChBbnRsaWJEZWZpbml0aW9uKSBjb25maWd1cmVkT2JqZWN0OworICAgICAgICAgICAgZGVmLnNldFVSSSh1cmkpOworICAgICAgICAgICAgZGVmLnNldEFudGxpYkNsYXNzTG9hZGVyKGdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgZGVmLmluaXQoKTsKKyAgICAgICAgICAgIGRlZi5leGVjdXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudGxpYkRlZmluaXRpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudGxpYkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWYzMWUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50bGliRGVmaW5pdGlvbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciB0YXNrcyB0aGF0IHRoYXQgY2FuIGJlIHVzZWQgaW4gYW50bGlicy4KKyAqIEZvciBoYW5kbGluZyB1cmkgYW5kIGNsYXNzIGxvYWRpbmcuCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIEFudGxpYkRlZmluaXRpb24gZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHVyaSA9ICIiOworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgYW50bGliQ2xhc3NMb2FkZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIGZvciB0aGlzIGRlZmluaXRpb24uCisgICAgICogSWYgdGhlIFVSSSBpcyAiYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50IiwKKyAgICAgKiAodGhpcyBpcyB0aGUgZGVmYXVsdCB1cmkpCisgICAgICogdGhlIHVyaSB3aWxsIGJlIHNldCB0byAiIi4KKyAgICAgKiBVUklzIHRoYXQgc3RhcnQgd2l0aCAiYW50OiIgYXJlIHJlc2VydmVkCisgICAgICogYW5kIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIGNvbnRleHQuCisgICAgICogQHBhcmFtIHVyaSB0aGUgbmFtZXNwYWNlIFVSSQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYSByZXNlcnZlZCBVUkkgaXMgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodXJpLmVxdWFscyhQcm9qZWN0SGVscGVyLkFOVF9DT1JFX1VSSSkpIHsKKyAgICAgICAgICAgIHVyaSA9ICIiOworICAgICAgICB9CisgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgiYW50OiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGEgcmVzZXJ2ZWQgVVJJICIgKyB1cmkpOworICAgICAgICB9CisgICAgICAgIHRoaXMudXJpID0gdXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBVUkkgZm9yIHRoaXMgZGVmaW5pdGlvbi4KKyAgICAgKiBAcmV0dXJuIFRoZSBVUkkgZm9yIHRoaXMgZGVmaW50aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgeworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3MgbG9hZGVyIG9mIHRoZSBsb2FkaW5nIG9iamVjdAorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIGEgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW50bGliQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgdGhpcy5hbnRsaWJDbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGFudGxpYiBjbGFzc2xvYWRlcgorICAgICAqIEByZXR1cm4gdGhlIGFudGxpYiBjbGFzc2xvYWRlciBmb3IgdGhlIGRlZmluaXRpb24sIHRoaXMKKyAgICAgKiAgICAgICAgIGlzIG51bGwgaWYgdGhlIGRlZmluaXRpb24gaXMgbm90IHVzZWQgaW4gYW4gYW50bGliLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRBbnRsaWJDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGFudGxpYkNsYXNzTG9hZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FwdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXB0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3ZmQwZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FwdC5qYXZhCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnMuQXB0RXh0ZXJuYWxDb21waWxlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBBcHQgVGFzayBmb3IgcnVubmluZyB0aGUgQW5ub3RhdGlvbiBwcm9jZXNzaW5nIHRvb2wgZm9yIEpESyAxLjUuICBJdCBkZXJpdmVzCisgKiBmcm9tIHRoZSBleGlzdGluZyBKYXZhYyB0YXNrLCBhbmQgZm9yY2VzIHRoZSBjb21waWxlciBiYXNlZCBvbiB3aGV0aGVyIHdlJ3JlCisgKiBleGVjdXRpbmcgaW50ZXJuYWxseSwgb3IgZXh0ZXJuYWxseS4KKyAqCisgKiBAc2luY2UgQW50IDEuNworICovCisKKworcHVibGljIGNsYXNzIEFwdAorICAgICAgICBleHRlbmRzIEphdmFjIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29tcGlsZSA9IHRydWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeTsKKyAgICBwcml2YXRlIFBhdGggZmFjdG9yeVBhdGg7CisgICAgcHJpdmF0ZSBWZWN0b3Igb3B0aW9ucyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIEZpbGUgcHJlcHJvY2Vzc0RpcjsKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGFwdCB0b29sLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYRUNVVEFCTEVfTkFNRSA9ICJhcHQiOworICAgIC8qKiBBbiB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBpZ25vcmluZyBjb21waWxlciBhdHRyaWJ1dGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSUdOT1JJTkdfQ09NUElMRVJfT1BUSU9OCisgICAgICAgID0gIklnbm9yaW5nIGNvbXBpbGVyIGF0dHJpYnV0ZSBmb3IgdGhlIEFQVCB0YXNrLCBhcyBpdCBpcyBmaXhlZCI7CisgICAgLyoqIEEgd2FybmluZyBtZXNzYWdlIGlmIHVzZWQgd2l0aCBqYXZhIDwgMS41LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1dST05HX0pBVkFfVkVSU0lPTgorICAgICAgICA9ICJBcHQgdGFzayByZXF1aXJlcyBKYXZhIDEuNSsiOworCisgICAgLyoqCisgICAgICogZXhwb3NlZCBmb3IgZGVidWcgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX0lHTk9SSU5HX0ZPUksgPQorICAgICAgICAiQXB0IG9ubHkgcnVucyBpbiBpdHMgb3duIEpWTTsgZm9yaz1mYWxzZSBvcHRpb24gaWdub3JlZCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmVzdGVkIG9wdGlvbiBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT3B0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgLyoqIENvbnN0cnVjdG9yIGZvciBPcHRpb24gKi8KKyAgICAgICAgcHVibGljIE9wdGlvbigpIHsKKyAgICAgICAgICAgIC8vZGVmYXVsdAorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbmFtZSBhdHRyaWJ1dGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgYXR0cmlidXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBuYW1lIGF0dHJpYnV0ZS4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9wdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGF0dHJpYnV0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydXRvciBmb3IgQXB0IHRhc2suCisgICAgICogVGhpcyBzZXRzIHRoZSBhcHQgY29tcGlsZXIgYWRhcHRlciBhcyB0aGUgY29tcGlsZXIgaW4gdGhlIHN1cGVyIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBBcHQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHN1cGVyLnNldENvbXBpbGVyKEFwdEV4dGVybmFsQ29tcGlsZXJBZGFwdGVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHN1cGVyLnNldEZvcmsodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBhcHQgZXhlY3V0YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBcHRFeGVjdXRhYmxlKCkgeworICAgICAgICByZXR1cm4gSmF2YUVudlV0aWxzLmdldEpka0V4ZWN1dGFibGUoRVhFQ1VUQUJMRV9OQU1FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbXBpbGVyLgorICAgICAqIFRoaXMgaXMgbm90IGFsbG93ZWQgYW5kIGEgd2FybmluZyBsb2cgbWVzc2FnZSBpcyBtYWRlLgorICAgICAqIEBwYXJhbSBjb21waWxlciBub3QgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21waWxlcihTdHJpbmcgY29tcGlsZXIpIHsKKyAgICAgICAgbG9nKEVSUk9SX0lHTk9SSU5HX0NPTVBJTEVSX09QVElPTiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmb3JrIGF0dHJpYnV0ZS4KKyAgICAgKiBOb24tZm9ya2luZyBBUFQgaXMgaGlnaGx5IGNsYXNzcGF0aCBkZXBlbmRlbnQgYW5kIGFwcGVhcnMgdG8gYmUgdG9vCisgICAgICogYnJpdHRsZSB0byB3b3JrLiBUaGUgc29sZSByZWFzb24gdGhpcyBhdHRyaWJ1dGUgaXMgcmV0YWluZWQKKyAgICAgKiBpcyB0aGUgc3VwZXJjbGFzcyBkb2VzIGl0CisgICAgICogQHBhcmFtIGZvcmsgaWYgZmFsc2U7IHdhcm4gdGhlIG9wdGlvbiBpcyBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmsoYm9vbGVhbiBmb3JrKSB7CisgICAgICAgIGlmICghZm9yaykgeworICAgICAgICAgICAgbG9nKFdBUk5JTkdfSUdOT1JJTkdfRk9SSywgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbXBpbGVyIGNsYXNzIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgY29tcGlsZXIgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q29tcGlsZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbXBpbGUgb3B0aW9uIGZvciB0aGUgYXB0IGNvbXBpbGVyLgorICAgICAqIElmIHRoaXMgaXMgZmFsc2UgdGhlICItbm9jb21waWxlIiBhcmd1bWVudCB3aWxsIGJlIHVzZWQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBpbGUgb3B0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21waWxlIG9wdGlvbiBmb3IgdGhlIGFwdCBjb21waWxlci4KKyAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICogQHBhcmFtIGNvbXBpbGUgaWYgdHJ1ZSBzZXQgdGhlIGNvbXBpbGUgb3B0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGUoYm9vbGVhbiBjb21waWxlKSB7CisgICAgICAgIHRoaXMuY29tcGlsZSA9IGNvbXBpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmYWN0b3J5IG9wdGlvbiBmb3IgdGhlIGFwdCBjb21waWxlci4KKyAgICAgKiBJZiB0aGlzIGlzIG5vbi1udWxsIHRoZSAiLWZhY3RvcnkiIGFyZ3VtZW50IHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmFjdG9yeSBvcHRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZhY3Rvcnkgb3B0aW9uIGZvciB0aGUgYXB0IGNvbXBpbGVyLgorICAgICAqIERlZmF1bHQgdmFsdWUgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmFjdG9yeSB0aGUgY2xhc3NuYW1lIG9mIHRoZSBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnkoU3RyaW5nIGZhY3RvcnkpIHsKKyAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZWZlcmVuY2UgdG8gYSBwYXRoIHRvIHRoZSBmYWN0b3J5UGF0aCBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHJlZiBhIHJlZmVyZW5jZSB0byBhIHBhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFjdG9yeVBhdGhSZWYoUmVmZXJlbmNlIHJlZikgeworICAgICAgICBjcmVhdGVGYWN0b3J5UGF0aCgpLnNldFJlZmlkKHJlZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcGF0aCB0byB0aGUgZmFjdG9yeVBhdGggYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gYSBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlRmFjdG9yeVBhdGgoKSB7CisgICAgICAgIGlmIChmYWN0b3J5UGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWN0b3J5UGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhY3RvcnlQYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZhY3RvcnkgcGF0aCBhdHRyaWJ1dGUuCisgICAgICogSWYgdGhpcyBpcyBub3QgbnVsbCwgdGhlICItZmFjdG9yeXBhdGgiIGFyZ3VtZW50IHdpbGwgYmUgdXNlZC4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIGZhY3RvcnkgcGF0aCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0RmFjdG9yeVBhdGgoKSB7CisgICAgICAgIHJldHVybiBmYWN0b3J5UGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXN0ZWQgb3B0aW9uLgorICAgICAqIEByZXR1cm4gYW4gb3B0aW9uIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIE9wdGlvbiBjcmVhdGVPcHRpb24oKSB7CisgICAgICAgIE9wdGlvbiBvcHQgPSBuZXcgT3B0aW9uKCk7CisgICAgICAgIG9wdGlvbnMuYWRkKG9wdCk7CisgICAgICAgIHJldHVybiBvcHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBvcHRpb25zIHRvIHRoZSBjb21waWxlci4KKyAgICAgKiBFYWNoIG9wdGlvbiB3aWxsIHVzZSAnIi1FIiBuYW1lIFsiPSIgdmFsdWVdJyBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBWZWN0b3IgZ2V0T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcmVwcm9jZXNzZGlyIGF0dHJpYnV0ZS4KKyAgICAgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSAiLXMiIGFyZ3VtZW50LgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwuCisgICAgICogQHJldHVybiB0aGUgcHJlcHJvY2Vzc2RpciBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0UHJlcHJvY2Vzc0RpcigpIHsKKyAgICAgICAgcmV0dXJuIHByZXByb2Nlc3NEaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcmVwcm9jZXNzZGlyIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gcHJlcHJvY2Vzc0RpciB3aGVyZSB0byBwbGFjZSBwcm9jZXNzb3IgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVwcm9jZXNzRGlyKEZpbGUgcHJlcHJvY2Vzc0RpcikgeworICAgICAgICB0aGlzLnByZXByb2Nlc3NEaXIgPSBwcmVwcm9jZXNzRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHRoZSBjb21waWxhdGlvbi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0F2YWlsYWJsZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXZhaWxhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmNmFhYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0F2YWlsYWJsZS5qYXZhCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Db25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIFdpbGwgc2V0IHRoZSBnaXZlbiBwcm9wZXJ0eSBpZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIGF2YWlsYWJsZSBhdAorICogcnVudGltZS4gVGhpcyB0YXNrIG1heSBhbHNvIGJlIHVzZWQgYXMgYSBjb25kaXRpb24gYnkgdGhlIGNvbmRpdGlvbiB0YXNrLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJjb250cm9sIgorICovCitwdWJsaWMgY2xhc3MgQXZhaWxhYmxlIGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWU7CisgICAgcHJpdmF0ZSBGaWxlIGZpbGU7CisgICAgcHJpdmF0ZSBQYXRoIGZpbGVwYXRoOworICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlOworICAgIHByaXZhdGUgRmlsZURpciB0eXBlOworICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGg7CisgICAgcHJpdmF0ZSBBbnRDbGFzc0xvYWRlciBsb2FkZXI7CisgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWUgPSAidHJ1ZSI7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzVGFzayA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVTeXN0ZW1jbGFzc2VzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHNlYXJjaFBhcmVudHMgICA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZWFyY2hQYXJlbnRzIGF0dHJpYnV0ZS4KKyAgICAgKiBUaGlzIGNvbnRyb2xzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIHRoZSAiZmlsZSIgdHlwZS4KKyAgICAgKiBJZiB0cnVlLCB0aGUgcGF0aCwgcGFyZW50IHBhdGggYW5kIGdyYW5kcGFyZW50IHBhdGggYXJlCisgICAgICogc2VhcmNoZWQgZm9yIHRoZSBmaWxlLiBJZiBmYWxzZSwgb25seSB0aGUgcGF0aCBpcyBzZWFjaGVkLgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgorICAgICAqIEBwYXJhbSBzZWFyY2hQYXJlbnRzIHRoZSB2YWx1ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VhcmNoUGFyZW50cyhib29sZWFuICBzZWFyY2hQYXJlbnRzKSB7CisgICAgICAgIHRoaXMuc2VhcmNoUGFyZW50cyA9IHNlYXJjaFBhcmVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgc2VhcmNoIHBhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLmFwcGVuZChjbGFzc3BhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IFBhdGggaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZCBieSBBbnQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggYnkgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgYSBSZWZlcmVuY2UgdG8gYSBQYXRoIGluc3RhbmNlIHRvIGJlIHVzZWQgYXMgdGhlIGNsYXNzcGF0aAorICAgICAqICAgICAgICAgIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggdG8gdXNlIHdoZW4gbG9va2luZyBmb3IgYSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVwYXRoIGEgUGF0aCBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBzZWFyY2ggcGF0aCBmb3IgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZXBhdGgoUGF0aCBmaWxlcGF0aCkgeworICAgICAgICBjcmVhdGVGaWxlcGF0aCgpLmFwcGVuZChmaWxlcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGF0aCB0byBzZWFyY2ggZm9yIGZpbGUgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyBQYXRoIGluc3RhbmNlIHdoaWNoIEFudCB3aWxsIGNvbmZpZ3VyZSB3aXRoIGEgZmlsZSBzZWFyY2gKKyAgICAgKiAgICAgICAgIHBhdGguCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlRmlsZXBhdGgoKSB7CisgICAgICAgIGlmICh0aGlzLmZpbGVwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZXBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmZpbGVwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIHdpbGwgYmUgc2V0IGlmIHRoZSBwYXJ0aWN1bGFyIHJlc291cmNlCisgICAgICogaXMgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIHRvIGJlIGdpdmVuIHRvIHRoZSBwcm9wZXJ0eSBpZiB0aGUgZGVzaXJlZCByZXNvdXJjZSBpcworICAgICAqIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgZ2l2ZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIHRvIGJlIGdpdmVuIHRvIHRoZSBwcm9wZXJ0eSBpZiB0aGUgZGVzaXJlZCByZXNvdXJjZSBpcworICAgICAqIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgZ2l2ZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHNldFZhbHVlKChPYmplY3QpIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjbGFzc25hbWUgb2YgYSBjbGFzcyB3aGljaCBtdXN0IGJlIGF2YWlsYWJsZSB0byBzZXQgdGhlIGdpdmVuCisgICAgICogcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICBpZiAoISIiLmVxdWFscyhjbGFzc25hbWUpKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmlsZSB3aGljaCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGZpbGUgc3lzdGVtIHRvIHNldCB0aGUgZ2l2ZW4KKyAgICAgKiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIGlzIHJlcXVpcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIHRoaXMuZmlsZW5hbWUgPSBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIGZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiBhIEphdmEgcmVzb3VyY2Ugd2hpY2ggaXMgcmVxdWlyZWQgdG8gc2V0IHRoZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgbmFtZSBvZiBhIHJlc291cmNlIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGJlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIHNldFR5cGUoU3RyaW5nKSBpcyBkZXByZWNhdGVkIGFuZCBpcyByZXBsYWNlZCB3aXRoCisgICAgICogICAgICAgICAgICAgc2V0VHlwZShBdmFpbGFibGUuRmlsZURpcikgdG8gbWFrZSBBbnQncyBJbnRyb3NwZWN0aW9uCisgICAgICogICAgICAgICAgICAgbWVjaGFuaXNtIGRvIHRoZSB3b3JrIGFuZCBhbHNvIHRvIGVuY2Fwc3VsYXRlIG9wZXJhdGlvbnMgb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgdHlwZSBpbiBpdHMgb3duIGNsYXNzLgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHJlc291cmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBUaGUgc2V0VHlwZShTdHJpbmcpIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkLiIKKyAgICAgICAgICAgICsgIiBVc2Ugc2V0VHlwZShBdmFpbGFibGUuRmlsZURpcikgaW5zdGVhZC4iLAorICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIHRoaXMudHlwZSA9IG5ldyBGaWxlRGlyKCk7CisgICAgICAgIHRoaXMudHlwZS5zZXRWYWx1ZSh0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hhdCB0eXBlIG9mIGZpbGUgaXMgcmVxdWlyZWQgLSBlaXRoZXIgZGlyZWN0b3J5IG9yIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBhbiBpbnN0YW5jZSBvZiB0aGUgRmlsZURpciBlbnVtZXJhdGVkQXR0cmlidXRlIGluZGljYXRpbmcKKyAgICAgKiAgICAgICAgICAgICB3aGV0aGVyIHRoZSBmaWxlIHJlcXVpcmVkIGlzIHRvIGJlIGEgZGlyZWN0b3J5IG9yIGEgcGxhaW4KKyAgICAgKiAgICAgICAgICAgICBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoRmlsZURpciB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIHNlYXJjaCBmb3IgY2xhc3NlcyBzaG91bGQgaWdub3JlIHRoZSBydW50aW1lIGNsYXNzZXMgYW5kCisgICAgICoganVzdCB1c2UgdGhlIGdpdmVuIGNsYXNzcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZ25vcmUgdHJ1ZSBpZiBzeXN0ZW0gY2xhc3NlcyBhcmUgdG8gYmUgaWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVzeXN0ZW1jbGFzc2VzKGJvb2xlYW4gaWdub3JlKSB7CisgICAgICAgIHRoaXMuaWdub3JlU3lzdGVtY2xhc3NlcyA9IGlnbm9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnRyeSBwb2ludCB3aGVuIG9wZXJhdGluZyBhcyBhIHRhc2suCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSB0YXNrIGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicHJvcGVydHkgYXR0cmlidXRlIGlzIHJlcXVpcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlzVGFzayA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZXZhbCgpKSB7CisgICAgICAgICAgICAgICAgUHJvcGVydHlIZWxwZXIgcGggPSBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIE9iamVjdCBvbGR2YWx1ZSA9IHBoLmdldFByb3BlcnR5KHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBvbGR2YWx1ZSAmJiAhb2xkdmFsdWUuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSA8YXZhaWxhYmxlPiB1c2VkIHRvIG92ZXJyaWRlIGFuIGV4aXN0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHByb3BlcnR5LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgQnVpbGQgZmlsZSBzaG91bGQgbm90IHJldXNlIHRoZSBzYW1lIHByb3BlcnR5IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5hbWUgZm9yIGRpZmZlcmVudCB2YWx1ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBOQjogdGhpcyBtYWtlcyB1c2Ugb2YgUHJvamVjdCNzZXRQcm9wZXJ0eSByYXRoZXIgdGhhbiBQcm9qZWN0I3NldE5ld1Byb3BlcnR5CisgICAgICAgICAgICAgICAgLy8gICAgIGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJsaXR5IHJlYXNvbnMKKyAgICAgICAgICAgICAgICBwaC5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaXNUYXNrID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gaXMgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY2xhc3NuYW1lID09IG51bGwgJiYgZmlsZSA9PSBudWxsICYmIHJlc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBvZiAoY2xhc3NuYW1lfGZpbGV8IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZXNvdXJjZSkgaXMgcmVxdWlyZWQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHR5cGUgYXR0cmlidXRlIGlzIG9ubHkgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAid2hlbiBzcGVjaWZ5aW5nIHRoZSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZS4iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGFzc3BhdGguc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIHRoaXMubG9hZGVyID0gZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGNsYXNzcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgYXBwZW5kaXggPSAiIjsKKyAgICAgICAgICAgIGlmIChpc1Rhc2spIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRpeCA9ICIgdG8gc2V0IHByb3BlcnR5ICIgKyBwcm9wZXJ0eTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0VGFza05hbWUoImF2YWlsYWJsZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjbGFzc25hbWUgIT0gbnVsbCkgJiYgIWNoZWNrQ2xhc3MoY2xhc3NuYW1lKSkgeworICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvYWQgY2xhc3MgIiArIGNsYXNzbmFtZSArIGFwcGVuZGl4LAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGZpbGUgIT0gbnVsbCkgJiYgIWNoZWNrRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlVuYWJsZSB0byBmaW5kICIpOworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh0eXBlKS5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChmaWxlbmFtZSkuYXBwZW5kKGFwcGVuZGl4KTsKKyAgICAgICAgICAgICAgICBsb2coYnVmLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmVzb3VyY2UgIT0gbnVsbCkgJiYgIWNoZWNrUmVzb3VyY2UocmVzb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9hZCByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyBhcHBlbmRpeCwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLmNsZWFudXAoKTsKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpc1Rhc2spIHsKKyAgICAgICAgICAgICAgICBzZXRUYXNrTmFtZShudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2ggZm9yIGZpbGUvZGlyZWN0b3J5IGVpdGhlciByZWxhdGl2ZSB0byBwcm9qZWN0J3MKKyAgICAgKiBiYXNlZGlyIG9yIGluIHRoZSBwYXRoIGdpdmVuIGFzIGZpbGVwYXRoLgorICAgICAqCisgICAgICogPHA+ZmlsZXBhdGggY2FuIGJlIGEgbGlzdCBvZiBkaXJlY3RvcnkgYW5kL29yIGZpbGUgbmFtZXMgKGdlbidkCisgICAgICogdmlhIDxmaWxlc2V0Pik8L3A+CisgICAgICoKKyAgICAgKiA8cD5sb29rIGZvcjo8L3A+PHVsPgorICAgICAqICAgPGxpPmZ1bGwtcGF0aG5hbWUgc3BlY2lmaWVkID09IHBhdGggaW4gbGlzdDwvbGk+CisgICAgICogICA8bGk+ZnVsbC1wYXRobmFtZSBzcGVjaWZpZWQgPT0gcGFyZW50IGRpciBvZiBwYXRoIGluIGxpc3Q8L2xpPgorICAgICAqICAgPGxpPnNpbXBsZSBuYW1lIHNwZWNpZmllZCAgID09IHBhdGggaW4gbGlzdDwvbGk+CisgICAgICogICA8bGk+c2ltcGxlIG5hbWUgc3BlY2lmaWVkICAgPT0gcGF0aCBpbiBsaXN0ICsgbmFtZTwvbGk+CisgICAgICogICA8bGk+c2ltcGxlIG5hbWUgc3BlY2lmaWVkICAgPT0gcGFyZW50IGRpciArIG5hbWU8L2xpPgorICAgICAqICAgPGxpPnNpbXBsZSBuYW1lIHNwZWNpZmllZCAgID09IHBhcmVudCBvZiBwYXJlbnQgZGlyICsgbmFtZTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlKCkgeworICAgICAgICBpZiAoZmlsZXBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNoZWNrRmlsZShmaWxlLCBmaWxlbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdbXSBwYXRocyA9IGZpbGVwYXRoLmxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBsb2coIlNlYXJjaGluZyAiICsgcGF0aHNbaV0sIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIEZpbGUgcGF0aCA9IG5ldyBGaWxlKHBhdGhzW2ldKTsKKworICAgICAgICAgICAgICAgIC8vICoqICAgZnVsbC1wYXRobmFtZSBzcGVjaWZpZWQgPT0gcGF0aCBpbiBsaXN0CisgICAgICAgICAgICAgICAgLy8gKiogICBzaW1wbGUgbmFtZSBzcGVjaWZpZWQgICA9PSBwYXRoIGluIGxpc3QKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5leGlzdHMoKQorICAgICAgICAgICAgICAgICAgICAmJiAoZmlsZW5hbWUuZXF1YWxzKHBhdGhzW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmlsZW5hbWUuZXF1YWxzKHBhdGguZ2V0TmFtZSgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZDogIiArIHBhdGgsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0RpcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGF0aC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkZvdW5kIGRpcmVjdG9yeTogIiArIHBhdGgsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0ZpbGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhdGguaXNGaWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRm91bmQgZmlsZTogIiArIHBhdGgsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IHRoZSByZXF1ZXN0ZWQgdHlwZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGUgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAgICAgLy8gKiogICBmdWxsLXBhdGhuYW1lIHNwZWNpZmllZCA9PSBwYXJlbnQgZGlyIG9mIHBhdGggaW4gbGlzdAorICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZXhpc3RzKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgZmlsZW5hbWUuZXF1YWxzKHBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZDogIiArIHBhcmVudCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzRGlyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRm91bmQgZGlyZWN0b3J5OiAiICsgcGFyZW50LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0aGUgcmVxdWVzdGVkIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyAqKiAgIHNpbXBsZSBuYW1lIHNwZWNpZmllZCAgID09IHBhdGggaW4gbGlzdCArIG5hbWUKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5leGlzdHMoKSAmJiBwYXRoLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRmlsZShuZXcgRmlsZShwYXRoLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgKyAiIGluICIgKyBwYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyAqKiAgIHNpbXBsZSBuYW1lIHNwZWNpZmllZCAgID09IHBhcmVudCBkaXIgKyBuYW1lCisgICAgICAgICAgICAgICAgd2hpbGUgKHNlYXJjaFBhcmVudHMgJiYgcGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0ZpbGUobmV3IEZpbGUocGFyZW50LCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgKyAiIGluICIgKyBwYXJlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSBnaXZlbiBmaWxlIGV4aXN0cyBhbmQgbWF0Y2hlcyB0aGUgcmVxdWlyZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlKEZpbGUgZiwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHR5cGUuaXNEaXIoKSkgeworICAgICAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZCBkaXJlY3Rvcnk6ICIgKyB0ZXh0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGYuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiRm91bmQgZmlsZTogIiArIHRleHQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZi5pc0ZpbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgbG9nKCJGb3VuZDogIiArIHRleHQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmLmV4aXN0cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGEgZ2l2ZW4gcmVzb3VyY2UgY2FuIGJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlKSAhPSBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGNMID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICBpZiAoY0wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAoY0wuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSkgIT0gbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAoQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSkgIT0gbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBhIGdpdmVuIGNsYXNzIGNhbiBiZSBsb2FkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQ2xhc3MoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlnbm9yZVN5c3RlbWNsYXNzZXMpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NwYXRoKTsKKyAgICAgICAgICAgICAgICBsb2FkZXIuc2V0UGFyZW50Rmlyc3QoZmFsc2UpOworICAgICAgICAgICAgICAgIGxvYWRlci5hZGRKYXZhTGlicmFyaWVzKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIuZmluZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcyBmb3VuZCBidXQgcmVzdHJpY3RlZCBuYW1lOyB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSB0aGUgY2FzZSB3ZSdyZSBsb29raW5nIGZvciBpbiBKREsgMS4zKywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGNhdGNoIHRoZSBleGNlcHRpb24gYW5kIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIC8vIENhbiByZXR1cm4gbnVsbCB0byByZXByZXNlbnQgdGhlIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIuCisgICAgICAgICAgICAgICAgLy8gc2VlIEFQSSBkb2NzIG9mIENsYXNzLmdldENsYXNzTG9hZGVyLgorICAgICAgICAgICAgICAgIGlmIChsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUsIHRydWUsIGwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coImNsYXNzIFwiIiArIGNsYXNzbmFtZSArICJcIiB3YXMgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKKyAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGxvYWQgZGVwZW5kZW50IGNsYXNzIFwiIiArIGUuZ2V0TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgKyAiXCIgZm9yIGNsYXNzIFwiIiArIGNsYXNzbmFtZSArICJcIiIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW51bWVyYXRlZEF0dHJpYnV0ZSBjb3ZlcmluZyB0aGUgZmlsZSB0eXBlcyB0byBiZSBjaGVja2VkIGZvciwgZWl0aGVyCisgICAgICogZmlsZSBvciBkaXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlRGlyIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVTID0geyJmaWxlIiwgImRpciJ9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzCisgICAgICAgICAqLworICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRVM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGUgaWYgdGhlIHZhbHVlIHNwZWNpZmllcyBhIGRpcmVjdG9yeS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBzcGVjaWZpZXMgYSBkaXJlY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiZGlyIi5lcXVhbHNJZ25vcmVDYXNlKGdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlIGlmIHRoZSB2YWx1ZSBzcGVjaWZpZXMgYSBmaWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHNwZWNpZmllcyBhIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UoZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JVbnppcDIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JVbnppcDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjEzNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlVuemlwMi5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYnppcDIuQ0JaaXAySW5wdXRTdHJlYW07CisKKy8qKgorICogRXhwYW5kcyBhIGZpbGUgdGhhdCBoYXMgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlIEJaSVAyCisgKiBhbGdvcml0aG0uIE5vcm1hbGx5IHVzZWQgdG8gY29tcHJlc3Mgbm9uLWNvbXByZXNzZWQgYXJjaGl2ZXMgc3VjaAorICogYXMgVEFSIGZpbGVzLgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgKi8KKworcHVibGljIGNsYXNzIEJVbnppcDIgZXh0ZW5kcyBVbnBhY2sgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gOCAqIDEwMjQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiLmJ6MiI7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlZmF1bHQgZXh0ZW5zaW9uLgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyAiLmJ6MiIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRFeHRlbnNpb24oKSB7CisgICAgICAgIHJldHVybiBERUZBVUxUX0VYVEVOU0lPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgdW5iemlwcGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0KCkgeworICAgICAgICBpZiAoc291cmNlLmxhc3RNb2RpZmllZCgpID4gZGVzdC5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgbG9nKCJFeHBhbmRpbmcgIiArIHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIgorICAgICAgICAgICAgICAgICsgZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKyAgICAgICAgICAgIENCWmlwMklucHV0U3RyZWFtIHpJbiA9IG51bGw7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKKyAgICAgICAgICAgICAgICBmaXMgPSBzcmNSZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpcyk7CisgICAgICAgICAgICAgICAgaW50IGIgPSBiaXMucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChiICE9ICdCJykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgYnoyIGZpbGUuIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGIgPSBiaXMucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChiICE9ICdaJykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgYnoyIGZpbGUuIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpJbiA9IG5ldyBDQlppcDJJbnB1dFN0cmVhbShiaXMpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSB6SW4ucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IC0xKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUHJvYmxlbSBleHBhbmRpbmcgYnppcDIgIiArIGlvZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGJpcyk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGZpcyk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHpJbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdGFzayBjYW4gZGVhbCB3aXRoIG5vbi1maWxlIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIG9ubHkgaWYgdGhpcyB0YXNrIGlzCisgICAgICogJmx0O2d1bnppcCZndDsuICBBbnkgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcyB0aGF0IGFsc28gd2FudHMgdG8KKyAgICAgKiBzdXBwb3J0IG5vbi1maWxlIHJlc291cmNlcyBuZWVkcyB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4gIFdlCisgICAgICogbmVlZCB0byBkbyBzbyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucyBzaW5jZSB3ZQorICAgICAqIGNhbid0IGV4cGVjdCBzdWJjbGFzc2VzIHRvIHN1cHBvcnQgcmVzb3VyY2VzLjwvcD4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjbGFzcyBzdXBwb3J0cyBub24gZmlsZSByZXNvdXJjZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c05vbkZpbGVSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmVxdWFscyhCVW56aXAyLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CWmlwMi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlppcDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTc4NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlppcDIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5iemlwMi5DQlppcDJPdXRwdXRTdHJlYW07CisKKy8qKgorICogQ29tcHJlc3NlcyBhIGZpbGUgd2l0aCB0aGUgQlpJUDIgYWxnb3JpdGhtLiBOb3JtYWxseSB1c2VkIHRvIGNvbXByZXNzCisgKiBub24tY29tcHJlc3NlZCBhcmNoaXZlcyBzdWNoIGFzIFRBUiBmaWxlcy4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0icGFja2FnaW5nIgorICovCisKK3B1YmxpYyBjbGFzcyBCWmlwMiBleHRlbmRzIFBhY2sgeworICAgIC8qKgorICAgICAqIENvbXByZXNzIHRoZSB6aXBGaWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhY2soKSB7CisgICAgICAgIENCWmlwMk91dHB1dFN0cmVhbSB6T3V0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHppcEZpbGUpKTsKKyAgICAgICAgICAgIGJvcy53cml0ZSgnQicpOworICAgICAgICAgICAgYm9zLndyaXRlKCdaJyk7CisgICAgICAgICAgICB6T3V0ID0gbmV3IENCWmlwMk91dHB1dFN0cmVhbShib3MpOworICAgICAgICAgICAgemlwUmVzb3VyY2UoZ2V0U3JjUmVzb3VyY2UoKSwgek91dCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJQcm9ibGVtIGNyZWF0aW5nIGJ6aXAyICIgKyBpb2UuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh6T3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0YXNrIGNhbiBkZWFsIHdpdGggbm9uLWZpbGUgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgb25seSBpZiB0aGlzIHRhc2sgaXMKKyAgICAgKiAmbHQ7YnppcDImZ3Q7LiAgQW55IHN1YmNsYXNzIG9mIHRoaXMgY2xhc3MgdGhhdCBhbHNvIHdhbnRzIHRvCisgICAgICogc3VwcG9ydCBub24tZmlsZSByZXNvdXJjZXMgbmVlZHMgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuICBXZQorICAgICAqIG5lZWQgdG8gZG8gc28gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMgc2luY2Ugd2UKKyAgICAgKiBjYW4ndCBleHBlY3Qgc3ViY2xhc3NlcyB0byBzdXBwb3J0IHJlc291cmNlcy48L3A+CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdGFzayBzdXBwb3J0IG5vbiBmaWxlIHJlc291cmNlcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzTm9uRmlsZVJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZXF1YWxzKEJaaXAyLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CYXNlbmFtZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQmFzZW5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDg3YjJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQmFzZW5hbWUuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogU2V0cyBhIHByb3BlcnR5IHRvIHRoZSBiYXNlIG5hbWUgb2YgYSBzcGVjaWZpZWQgZmlsZSwgb3B0aW9uYWxseSBtaW51cyBhCisgKiBzdWZmaXguCisgKgorICogVGhpcyB0YXNrIGNhbiBhY2NlcHQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICogPHVsPgorICogPGxpPmZpbGUKKyAqIDxsaT5wcm9wZXJ0eQorICogPGxpPnN1ZmZpeAorICogPC91bD4KKyAqIFRoZSA8Yj5maWxlPC9iPiBhbmQgPGI+cHJvcGVydHk8L2I+IGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkLiBUaGUKKyAqIDxiPnN1ZmZpeDwvYj4gYXR0cmlidXRlIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIHdpdGggb3Igd2l0aG91dAorICogdGhlICZxdW90Oy4mcXVvdDssIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgdGhlIHNhbWUgKGllLiwgdGhlCisgKiByZXR1cm5lZCBmaWxlIG5hbWUgd2lsbCBiZSBtaW51cyB0aGUgLnN1ZmZpeCkuCisgKiA8cD4KKyAqIFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHNldCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHRvIHRoZQorICogdmFsdWUgb2YgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuIElmIGZpbGUgaXMgYQorICogZGlyZWN0b3J5LCB0aGUgYmFzZW5hbWUgd2lsbCBiZSB0aGUgbGFzdCBkaXJlY3RvcnkgZWxlbWVudC4gSWYgZmlsZQorICogaXMgYSBmdWxsLXBhdGggZmlsZW5hbWUsIHRoZSBiYXNlbmFtZSB3aWxsIGJlIHRoZSBzaW1wbGUgZmlsZSBuYW1lLgorICogSWYgYSBzdWZmaXggaXMgc3BlY2lmaWVkLCBhbmQgdGhlIHNwZWNpZmllZCBmaWxlIGVuZHMgaW4gdGhhdCBzdWZmaXgsCisgKiB0aGUgYmFzZW5hbWUgd2lsbCBiZSB0aGUgc2ltcGxlIGZpbGUgbmFtZSB3aXRob3V0IHRoZSBzdWZmaXguCisgKgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJwcm9wZXJ0eSIKKyAqLworCitwdWJsaWMgY2xhc3MgQmFzZW5hbWUgZXh0ZW5kcyBUYXNrIHsKKyAgICBwcml2YXRlIEZpbGUgZmlsZTsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKyAgICBwcml2YXRlIFN0cmluZyBzdWZmaXg7CisKKyAgICAvKioKKyAgICAgKiBmaWxlIG9yIGRpcmVjdG9yeSB0byBnZXQgYmFzZSBuYW1lIGZyb20KKyAgICAgKiBAcGFyYW0gZmlsZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBnZXQgYmFzZSBuYW1lIGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICogUHJvcGVydHkgdG8gc2V0IGJhc2UgbmFtZSB0by4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgbmFtZSBvZiBwcm9wZXJ0eQorICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgID0gcHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgKiBPcHRpb25hbCBzdWZmaXggdG8gcmVtb3ZlIGZyb20gYmFzZSBuYW1lLgorICAgICAqIEBwYXJhbSBzdWZmaXggc3VmZml4IHRvIHJlbW92ZSBmcm9tIGJhc2UgbmFtZQorICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKKyAgICAgICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogZG8gdGhlIHdvcmsKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHJlcXVpcmVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwbGllZAorICAgICAqIHByb3BlcnR5IGFuZCBhdHRyaWJ1dGUgYXJlIHJlcXVpcmVkIGF0dHJpYnV0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicHJvcGVydHkgYXR0cmlidXRlIHJlcXVpcmVkIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmaWxlIGF0dHJpYnV0ZSByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbGUuZ2V0TmFtZSgpOworICAgICAgICBpZiAoc3VmZml4ICE9IG51bGwgJiYgdmFsdWUuZW5kc1dpdGgoc3VmZml4KSkgeworICAgICAgICAgICAgLy8gaWYgdGhlIHN1ZmZpeCBkb2VzIG5vdCBzdGFydHMgd2l0aCBhICcuJyBhbmQgdGhlCisgICAgICAgICAgICAvLyBjaGFyIHByZWNlZGluZyB0aGUgc3VmZml4IGlzIGEgJy4nLCB3ZSBhc3N1bWUgdGhlIHVzZXIKKyAgICAgICAgICAgIC8vIHdhbnRzIHRvIHJlbW92ZSB0aGUgJy4nIGFzIHdlbGwgKHNlZSBkb2NzKQorICAgICAgICAgICAgaW50IHBvcyA9IHZhbHVlLmxlbmd0aCgpIC0gc3VmZml4Lmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKHBvcyA+IDAgJiYgc3VmZml4LmNoYXJBdCgwKSAhPSAnLicKKyAgICAgICAgICAgICAgICAmJiB2YWx1ZS5jaGFyQXQocG9zIC0gMSkgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBwb3MpOworICAgICAgICB9CisgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQnVpbGROdW1iZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0J1aWxkTnVtYmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5YjBhYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0J1aWxkTnVtYmVyLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFJlYWQsIGluY3JlbWVudCwgYW5kIHdyaXRlIGEgYnVpbGQgbnVtYmVyIGluIGEgZmlsZQorICogSXQgd2lsbCBmaXJzdAorICogYXR0ZW1wdCB0byByZWFkIGEgYnVpbGQgbnVtYmVyIGZyb20gYSBmaWxlLCB0aGVuIHNldCB0aGUgcHJvcGVydHkKKyAqICJidWlsZC5udW1iZXIiIHRvIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkIGluIChvciAwIGlmIG5vIHN1Y2ggdmFsdWUpLiBUaGVuCisgKiBpdCB3aWxsIGluY3JlbWVudCB0aGUgYnVpbGQgbnVtYmVyIGJ5IG9uZSBhbmQgd3JpdGUgaXQgYmFjayBvdXQgaW50byB0aGUKKyAqIGZpbGUuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqIEBhbnQudGFzayBuYW1lPSJidWlsZG51bWJlciIKKyAqLworcHVibGljIGNsYXNzIEJ1aWxkTnVtYmVyCisgICAgIGV4dGVuZHMgVGFzayB7CisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHdoaWNoIHRoZSBidWlsZCBudW1iZXIgaXMgc3RvcmVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BST1BFUlRZX05BTUUgPSAiYnVpbGQubnVtYmVyIjsKKworICAgIC8qKiBUaGUgZGVmYXVsdCBmaWxlbmFtZSB0byB1c2UgaWYgbm8gZmlsZSBzcGVjaWZpZWQuICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZJTEVOQU1FID0gREVGQVVMVF9QUk9QRVJUWV9OQU1FOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKiogVGhlIEZpbGUgaW4gd2hpY2ggdGhlIGJ1aWxkIG51bWJlciBpcyBzdG9yZWQuICAqLworICAgIHByaXZhdGUgRmlsZSBteUZpbGU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlIGluIHdoaWNoIHRoZSBidWlsZCBudW1iZXIgaXMgc3RvcmVkLiBEZWZhdWx0cyB0bworICAgICAqICJidWlsZC5udW1iZXIiIGlmIG5vdCBzcGVjaWZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBpbiB3aGljaCBidWlsZCBudW1iZXIgaXMgc3RvcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoZmluYWwgRmlsZSBmaWxlKSB7CisgICAgICAgIG15RmlsZSA9IGZpbGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSdW4gdGFzay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCisgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBGaWxlIHNhdmVkRmlsZSA9IG15RmlsZTsgLy8gbWF5IGJlIGFsdGVyZWQgaW4gdmFsaWRhdGUKKworICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IGxvYWRQcm9wZXJ0aWVzKCk7CisgICAgICAgIGZpbmFsIGludCBidWlsZE51bWJlciA9IGdldEJ1aWxkTnVtYmVyKHByb3BlcnRpZXMpOworCisgICAgICAgIHByb3BlcnRpZXMucHV0KERFRkFVTFRfUFJPUEVSVFlfTkFNRSwKKyAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGJ1aWxkTnVtYmVyICsgMSkpOworCisgICAgICAgIC8vIFdyaXRlIHRoZSBwcm9wZXJ0aWVzIGZpbGUgYmFjayBvdXQKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShteUZpbGUpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gIkJ1aWxkIE51bWJlciBmb3IgQU5ULiBEbyBub3QgZWRpdCEiOworCisgICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKG91dHB1dCwgaGVhZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciB3aGlsZSB3cml0aW5nICIgKyBteUZpbGU7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBpb2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKG51bGwgIT0gb3V0cHV0KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiZXJyb3IgY2xvc2luZyBvdXRwdXQgc3RyZWFtICIgKyBpb2UsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXlGaWxlID0gc2F2ZWRGaWxlOworICAgICAgICB9CisKKyAgICAgICAgLy9GaW5hbGx5IHNldCB0aGUgcHJvcGVydHkKKyAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KERFRkFVTFRfUFJPUEVSVFlfTkFNRSwKKyAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGJ1aWxkTnVtYmVyKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byByZXRyaWV2ZSBidWlsZCBudW1iZXIgZnJvbSBwcm9wZXJ0aWVzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIHRoZSBwcm9wZXJ0aWVzIHRvIHJldHJpZXZlIGJ1aWxkIG51bWJlciBmcm9tCisgICAgICogQHJldHVybiB0aGUgYnVpbGQgbnVtYmVyIG9yIGlmIG5vIG51bWJlciBpbiBwcm9wZXJ0aWVzIG9iamVjdAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYnVpbGQubnVtYmVyIHByb3BlcnR5IGlzIG5vdCBhbiBpbnRlZ2VyCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0QnVpbGROdW1iZXIoZmluYWwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKQorICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGJ1aWxkTnVtYmVyID0KKyAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREVGQVVMVF9QUk9QRVJUWV9OQU1FLCAiMCIpLnRyaW0oKTsKKworICAgICAgICAvLyBUcnkgcGFyc2luZyB0aGUgbGluZSBpbnRvIGFuIGludGVnZXIuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChidWlsZE51bWJlcik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICBteUZpbGUgKyAiIGNvbnRhaW5zIGEgbm9uIGludGVnZXIgYnVpbGQgbnVtYmVyOiAiICsgYnVpbGROdW1iZXI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgbmZlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gbG9hZCBwcm9wZXJ0aWVzIGZyb20gZmlsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxvYWRlZCBwcm9wZXJ0aWVzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcygpCisgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCisgICAgICAgICAgICBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obXlGaWxlKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChpbnB1dCk7CisgICAgICAgICAgICByZXR1cm4gcHJvcGVydGllczsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChudWxsICE9IGlucHV0KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJlcnJvciBjbG9zaW5nIGlucHV0IHN0cmVhbSAiICsgaW9lLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhhdCB0aGUgdGFzayBwYXJhbWV0ZXJzIGFyZSB2YWxpZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpCisgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAobnVsbCA9PSBteUZpbGUpIHsKKyAgICAgICAgICAgIG15RmlsZSA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgREVGQVVMVF9GSUxFTkFNRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW15RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmNyZWF0ZU5ld0ZpbGUobXlGaWxlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgbXlGaWxlICsgIiBkb2Vzbid0IGV4aXN0IGFuZCBuZXcgZmlsZSBjYW4ndCBiZSBjcmVhdGVkLiI7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGlvZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW15RmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byByZWFkIGZyb20gIiArIG15RmlsZSArICIuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbXlGaWxlLmNhbldyaXRlKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byB3cml0ZSB0byAiICsgbXlGaWxlICsgIi4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DVlNQYXNzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DVlNQYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjOTU2MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NWU1Bhc3MuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogQWRkcyBhbiBuZXcgZW50cnkgdG8gYSBDVlMgcGFzc3dvcmQgZmlsZS4KKyAqCisgKgorICogQHNpbmNlIEFudCAxLjQKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InNjbSIKKyAqLworcHVibGljIGNsYXNzIENWU1Bhc3MgZXh0ZW5kcyBUYXNrIHsKKyAgICAvKiogQ1ZTIFJvb3QgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjdnNSb290ID0gbnVsbDsKKyAgICAvKiogUGFzc3dvcmQgZmlsZSB0byBhZGQgcGFzc3dvcmQgdG8gKi8KKyAgICBwcml2YXRlIEZpbGUgcGFzc0ZpbGUgPSBudWxsOworICAgIC8qKiBQYXNzd29yZCB0byBhZGQgdG8gZmlsZSAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKworICAgIC8qKiBBcnJheSBjb250YWluIGNoYXIgY29udmVyc2lvbiBkYXRhICovCisgICAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gc2hpZnRzID0geworICAgICAgICAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgICAgICAgICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAgICAgICAgMTE0LCAxMjAsICA1MywgIDc5LCAgOTYsIDEwOSwgIDcyLCAxMDgsICA3MCwgIDY0LCAgNzYsICA2NywgMTE2LCAgNzQsICA2OCwgIDg3LAorICAgICAgICAxMTEsICA1MiwgIDc1LCAxMTksICA0OSwgIDM0LCAgODIsICA4MSwgIDk1LCAgNjUsIDExMiwgIDg2LCAxMTgsIDExMCwgMTIyLCAxMDUsCisgICAgICAgICA0MSwgIDU3LCAgODMsICA0MywgIDQ2LCAxMDIsICA0MCwgIDg5LCAgMzgsIDEwMywgIDQ1LCAgNTAsICA0MiwgMTIzLCAgOTEsICAzNSwKKyAgICAgICAgMTI1LCAgNTUsICA1NCwgIDY2LCAxMjQsIDEyNiwgIDU5LCAgNDcsICA5MiwgIDcxLCAxMTUsICA3OCwgIDg4LCAxMDcsIDEwNiwgIDU2LAorICAgICAgICAgMzYsIDEyMSwgMTE3LCAxMDQsIDEwMSwgMTAwLCAgNjksICA3MywgIDk5LCAgNjMsICA5NCwgIDkzLCAgMzksICAzNywgIDYxLCAgNDgsCisgICAgICAgICA1OCwgMTEzLCAgMzIsICA5MCwgIDQ0LCAgOTgsICA2MCwgIDUxLCAgMzMsICA5NywgIDYyLCAgNzcsICA4NCwgIDgwLCAgODUsIDIyMywKKyAgICAgICAgMjI1LCAyMTYsIDE4NywgMTY2LCAyMjksIDE4OSwgMjIyLCAxODgsIDE0MSwgMjQ5LCAxNDgsIDIwMCwgMTg0LCAxMzYsIDI0OCwgMTkwLAorICAgICAgICAxOTksIDE3MCwgMTgxLCAyMDQsIDEzOCwgMjMyLCAyMTgsIDE4MywgMjU1LCAyMzQsIDIyMCwgMjQ3LCAyMTMsIDIwMywgMjI2LCAxOTMsCisgICAgICAgIDE3NCwgMTcyLCAyMjgsIDI1MiwgMjE3LCAyMDEsIDEzMSwgMjMwLCAxOTcsIDIxMSwgMTQ1LCAyMzgsIDE2MSwgMTc5LCAxNjAsIDIxMiwKKyAgICAgICAgMjA3LCAyMjEsIDI1NCwgMTczLCAyMDIsIDE0NiwgMjI0LCAxNTEsIDE0MCwgMTk2LCAyMDUsIDEzMCwgMTM1LCAxMzMsIDE0MywgMjQ2LAorICAgICAgICAxOTIsIDE1OSwgMjQ0LCAyMzksIDE4NSwgMTY4LCAyMTUsIDE0NCwgMTM5LCAxNjUsIDE4MCwgMTU3LCAxNDcsIDE4NiwgMjE0LCAxNzYsCisgICAgICAgIDIyNywgMjMxLCAyMTksIDE2OSwgMTc1LCAxNTYsIDIwNiwgMTk4LCAxMjksIDE2NCwgMTUwLCAyMTAsIDE1NCwgMTc3LCAxMzQsIDEyNywKKyAgICAgICAgMTgyLCAxMjgsIDE1OCwgMjA4LCAxNjIsIDEzMiwgMTY3LCAyMDksIDE0OSwgMjQxLCAxNTMsIDI1MSwgMjM3LCAyMzYsIDE3MSwgMTk1LAorICAgICAgICAyNDMsIDIzMywgMjUzLCAyNDAsIDE5NCwgMjUwLCAxOTEsIDE1NSwgMTQyLCAxMzcsIDI0NSwgMjM1LCAxNjMsIDI0MiwgMTc4LCAxNTIKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQ1ZTIHRhc2sgdXNpbmcgdGhlIGRlZmF1bHQgY3ZzcGFzcyBmaWxlIGxvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDVlNQYXNzKCkgeworICAgICAgICBwYXNzRmlsZSA9IG5ldyBGaWxlKAorICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJjeWd3aW4udXNlci5ob21lIiwKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpKQorICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiLmN2c3Bhc3MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSB3b3JrLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoY3ZzUm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImN2c3Jvb3QgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYXNzd29yZCBpcyByZXF1aXJlZCIpOworICAgICAgICB9CisKKyAgICAgICAgbG9nKCJjdnNSb290OiAiICsgY3ZzUm9vdCwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICBsb2coInBhc3N3b3JkOiAiICsgcGFzc3dvcmQsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgbG9nKCJwYXNzRmlsZTogIiArIHBhc3NGaWxlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgICAgIGlmIChwYXNzRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihwYXNzRmlsZSkpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworCisgICAgICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoY3ZzUm9vdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGluZSkuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHB3ZGZpbGUgPSBidWYudG9TdHJpbmcoKSArIGN2c1Jvb3QgKyAiIEEiCisgICAgICAgICAgICAgICAgKyBtYW5nbGUocGFzc3dvcmQpOworCisgICAgICAgICAgICBsb2coIldyaXRpbmcgLT4gIiArIHB3ZGZpbGUgLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXNzRmlsZSkpOworCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihwd2RmaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1hbmdsZShTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHNoaWZ0c1twYXNzd29yZC5jaGFyQXQoaSldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIENWUyByZXBvc2l0b3J5IHRvIGFkZCBhbiBlbnRyeSBmb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3ZzUm9vdCB0aGUgQ1ZTIHJlcG9zaXRvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDdnNyb290KFN0cmluZyBjdnNSb290KSB7CisgICAgICAgIHRoaXMuY3ZzUm9vdCA9IGN2c1Jvb3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzc3dvcmQgZmlsZSB0byBhZGQgdGhlIGVudHJ5IHRvLgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3NGaWxlIHRoZSBwYXNzd29yZCBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3NmaWxlKEZpbGUgcGFzc0ZpbGUpIHsKKyAgICAgICAgdGhpcy5wYXNzRmlsZSA9IHBhc3NGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3N3b3JkIHRvIGJlIGFkZGVkIHRvIHRoZSBwYXNzd29yZCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2FsbFRhcmdldC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2FsbFRhcmdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YjNmNjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DYWxsVGFyZ2V0LmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlByb3BlcnR5U2V0OworCisvKioKKyAqIENhbGwgYW5vdGhlciB0YXJnZXQgaW4gdGhlIHNhbWUgcHJvamVjdC4KKyAqCisgKiAgPHByZT4KKyAqICAgICZsdDt0YXJnZXQgbmFtZT0iZm9vIiZndDsKKyAqICAgICAgJmx0O2FudGNhbGwgdGFyZ2V0PSJiYXIiJmd0OworICogICAgICAgICZsdDtwYXJhbSBuYW1lPSJwcm9wZXJ0eTEiIHZhbHVlPSJhYWFhYSIgLyZndDsKKyAqICAgICAgICAmbHQ7cGFyYW0gbmFtZT0iZm9vIiB2YWx1ZT0iYmF6IiAvJmd0OworICogICAgICAgJmx0Oy9hbnRjYWxsJmd0OworICogICAgJmx0Oy90YXJnZXQmZ3Q7CisgKgorICogICAgJmx0O3RhcmdldCBuYW1lPSJiYXIiIGRlcGVuZHM9ImluaXQiJmd0OworICogICAgICAmbHQ7ZWNobyBtZXNzYWdlPSJwcm9wIGlzICR7cHJvcGVydHkxfSAke2Zvb30iIC8mZ3Q7CisgKiAgICAmbHQ7L3RhcmdldCZndDsKKyAqIDwvcHJlPgorICoKKyAqIDxwPlRoaXMgb25seSB3b3JrcyBhcyBleHBlY3RlZCBpZiBuZWl0aGVyIHByb3BlcnR5MSBub3IgZm9vIGFyZQorICogZGVmaW5lZCBpbiB0aGUgcHJvamVjdCBpdHNlbGYuCisgKgorICoKKyAqIEBzaW5jZSBBbnQgMS4yCisgKgorICogQGFudC50YXNrIG5hbWU9ImFudGNhbGwiIGNhdGVnb3J5PSJjb250cm9sIgorICovCitwdWJsaWMgY2xhc3MgQ2FsbFRhcmdldCBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBBbnQgY2FsbGVlOworICAgIC8vIG11c3QgbWF0Y2ggdGhlIGRlZmF1bHQgdmFsdWUgb2YgQW50I2luaGVyaXRBbGwKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5oZXJpdEFsbCA9IHRydWU7CisgICAgLy8gbXVzdCBtYXRjaCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBBbnQjaW5oZXJpdFJlZnMKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5oZXJpdFJlZnMgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiB0YXJnZXRTZXQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqIEBwYXJhbSBpbmhlcml0IDxjb2RlPmJvb2xlYW48L2NvZGU+IGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5oZXJpdEFsbChib29sZWFuIGluaGVyaXQpIHsKKyAgICAgICBpbmhlcml0QWxsID0gaW5oZXJpdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBwYXNzIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBuZXcgQW50IHByb2plY3QuCisgICAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICogQHBhcmFtIGluaGVyaXRSZWZzIDxjb2RlPmJvb2xlYW48L2NvZGU+IGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5oZXJpdFJlZnMoYm9vbGVhbiBpbmhlcml0UmVmcykgeworICAgICAgICB0aGlzLmluaGVyaXRSZWZzID0gaW5oZXJpdFJlZnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHRhc2sgYnkgY3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mIHRoZSBhbnQgdGFzayBhbmQKKyAgICAgKiBjb25maWd1cmluZyBpdCBieSBjYWxsaW5nIGl0cyBvd24gaW5pdCBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgY2FsbGVlID0gbmV3IEFudCh0aGlzKTsKKyAgICAgICAgY2FsbGVlLmluaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZSB0aGUgd29yayB0byB0aGUgYW50IHRhc2sgaW5zdGFuY2UsIGFmdGVyIHNldHRpbmcgaXQgdXAuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiB2YWxpZGF0aW9uIGZhaWx1cmUgb3IgaWYgdGhlIHRhcmdldCBkaWRuJ3QKKyAgICAgKiBleGVjdXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoY2FsbGVlID09IG51bGwpIHsKKyAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXRhcmdldFNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgdGFyZ2V0IG9yIGF0IGxlYXN0IG9uZSBuZXN0ZWQgdGFyZ2V0IGlzIHJlcXVpcmVkLiIsCisgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGNhbGxlZS5zZXRBbnRmaWxlKGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSk7CisgICAgICAgIGNhbGxlZS5zZXRJbmhlcml0QWxsKGluaGVyaXRBbGwpOworICAgICAgICBjYWxsZWUuc2V0SW5oZXJpdFJlZnMoaW5oZXJpdFJlZnMpOworICAgICAgICBjYWxsZWUuZXhlY3V0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBQcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBpbnZva2VkIHRhcmdldChzKS4KKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+UHJvcGVydHk8L2NvZGU+IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHkgY3JlYXRlUGFyYW0oKSB7CisgICAgICAgIGlmIChjYWxsZWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjYWxsZWUuY3JlYXRlUHJvcGVydHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWZlcmVuY2UgZWxlbWVudCBpZGVudGlmeWluZyBhIGRhdGEgdHlwZSB0byBjYXJyeQorICAgICAqIG92ZXIgdG8gdGhlIGludm9rZWQgdGFyZ2V0LgorICAgICAqIEBwYXJhbSByIHRoZSBzcGVjaWZpZWQgPGNvZGU+QW50LlJlZmVyZW5jZTwvY29kZT4uCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2UoQW50LlJlZmVyZW5jZSByKSB7CisgICAgICAgIGlmIChjYWxsZWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIGNhbGxlZS5hZGRSZWZlcmVuY2Uocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG9mIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgbmV3IHByb2plY3QuCisgICAgICogQHBhcmFtIHBzIHRoZSA8Y29kZT5Qcm9wZXJ0eVNldDwvY29kZT4gdG8gcGFzcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5c2V0KFByb3BlcnR5U2V0IHBzKSB7CisgICAgICAgIGlmIChjYWxsZWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIGNhbGxlZS5hZGRQcm9wZXJ0eXNldChwcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRhcmdldCB0byBleGVjdXRlLgorICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCB0byBleGVjdXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChTdHJpbmcgdGFyZ2V0KSB7CisgICAgICAgIGlmIChjYWxsZWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIGNhbGxlZS5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgdGFyZ2V0U2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB0YXJnZXQgdG8gdGhlIGxpc3Qgb2YgdGFyZ2V0cyB0byBpbnZva2UuCisgICAgICogQHBhcmFtIHQgPGNvZGU+QW50LlRhcmdldEVsZW1lbnQ8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkVGFyZ2V0KEFudC5UYXJnZXRFbGVtZW50IHQpIHsKKyAgICAgICAgaWYgKGNhbGxlZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGVlLmFkZENvbmZpZ3VyZWRUYXJnZXQodCk7CisgICAgICAgIHRhcmdldFNldCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlcyBvdXRwdXQuCisgICAgICogU2VuZCBpdCB0aGUgdGhlIG5ldyBwcm9qZWN0IGlmIGlzIHByZXNlbnQsIG90aGVyd2lzZQorICAgICAqIGNhbGwgdGhlIHN1cGVyIGNsYXNzLgorICAgICAqIEBwYXJhbSBvdXRwdXQgVGhlIHN0cmluZyBvdXRwdXQgdG8gb3V0cHV0LgorICAgICAqIEBzZWUgVGFzayNoYW5kbGVPdXRwdXQoU3RyaW5nKQorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKGNhbGxlZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjYWxsZWUuaGFuZGxlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgaW5wdXQuCisgICAgICogRGVsZWF0ZSB0byB0aGUgY3JlYXRlZCBwcm9qZWN0LCBpZiBwcmVzZW50LCBvdGhlcndpc2UKKyAgICAgKiBjYWxsIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgaW50byB3aGljaCBkYXRhIGlzIHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBhdCB3aGljaCBkYXRhIGlzIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBhbW91bnQgb2YgZGF0YSB0byByZWFkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBkYXRhIGNhbm5vdCBiZSByZWFkLgorICAgICAqIEBzZWUgVGFzayNoYW5kbGVJbnB1dChieXRlW10sIGludCwgaW50KQorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIGludCBoYW5kbGVJbnB1dChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY2FsbGVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjYWxsZWUuaGFuZGxlSW5wdXQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZUlucHV0KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgb3V0cHV0LgorICAgICAqIFNlbmQgaXQgdGhlIHRoZSBuZXcgcHJvamVjdCBpZiBpcyBwcmVzZW50LCBvdGhlcndpc2UKKyAgICAgKiBjYWxsIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBzdHJpbmcgdG8gb3V0cHV0LgorICAgICAqIEBzZWUgVGFzayNoYW5kbGVGbHVzaChTdHJpbmcpCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUZsdXNoKFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKGNhbGxlZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjYWxsZWUuaGFuZGxlRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUZsdXNoKG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgZXJyb3Igb3V0cHV0LgorICAgICAqIFNlbmQgaXQgdGhlIHRoZSBuZXcgcHJvamVjdCBpZiBpcyBwcmVzZW50LCBvdGhlcndpc2UKKyAgICAgKiBjYWxsIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBzdHJpbmcgdG8gb3V0cHV0LgorICAgICAqCisgICAgICogQHNlZSBUYXNrI2hhbmRsZUVycm9yT3V0cHV0KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUVycm9yT3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKGNhbGxlZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjYWxsZWUuaGFuZGxlRXJyb3JPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUVycm9yT3V0cHV0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgZXJyb3Igb3V0cHV0LgorICAgICAqIFNlbmQgaXQgdGhlIHRoZSBuZXcgcHJvamVjdCBpZiBpcyBwcmVzZW50LCBvdGhlcndpc2UKKyAgICAgKiBjYWxsIHRoZSBzdXBlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBzdHJpbmcgdG8gb3V0cHV0LgorICAgICAqIEBzZWUgVGFzayNoYW5kbGVFcnJvckZsdXNoKFN0cmluZykKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlRXJyb3JGbHVzaChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChjYWxsZWUgIT0gbnVsbCkgeworICAgICAgICAgICAgY2FsbGVlLmhhbmRsZUVycm9yRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUVycm9yRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NoZWNrc3VtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaGVja3N1bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNWM4ODIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaGVja3N1bS5qYXZhCkBAIC0wLDAgKzEsNjkyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5VbmlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuUmVzdHJpY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBVc2VkIHRvIGNyZWF0ZSBvciB2ZXJpZnkgZmlsZSBjaGVja3N1bXMuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImNvbnRyb2wiCisgKi8KK3B1YmxpYyBjbGFzcyBDaGVja3N1bSBleHRlbmRzIE1hdGNoaW5nVGFzayBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTklCQkxFID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV09SRCA9IDE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDggKiAxMDI0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFX01BU0sgPSAweEZGOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZVVuaW9uIGV4dGVuZHMgUmVzdHJpY3QgeworICAgICAgICBwcml2YXRlIFVuaW9uIHU7CisgICAgICAgIEZpbGVVbmlvbigpIHsKKyAgICAgICAgICAgIHUgPSBuZXcgVW5pb24oKTsKKyAgICAgICAgICAgIHN1cGVyLmFkZCh1KTsKKyAgICAgICAgICAgIHN1cGVyLmFkZChUeXBlLkZJTEUpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgICAgIHUuYWRkKHJjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGUgZm9yIHdoaWNoIGNoZWNrc3VtIGlzIHRvIGJlIGNhbGN1bGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGZpbGUgPSBudWxsOworCisgICAgLyoqCisgICAgICogUm9vdCBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNoZWNrc3VtIGZpbGVzIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgY2hlY2tzdW0gZmlsZXMgd2lsbCBiZSB3cml0dGVuCisgICAgICogaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGVhY2ggZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdG9kaXI7CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlRGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFsZ29yaXRobSA9ICJNRDUiOworICAgIC8qKgorICAgICAqIE1lc3NhZ2VEaWdlc3QgQWxnb3JpdGhtIHByb3ZpZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvdmlkZXIgPSBudWxsOworICAgIC8qKgorICAgICAqIEZpbGUgRXh0ZW5zaW9uIHRoYXQgaXMgYmUgdG8gdXNlZCB0byBjcmVhdGUgb3IgaWRlbnRpZnkKKyAgICAgKiBkZXN0aW5hdGlvbiBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZWV4dDsKKyAgICAvKioKKyAgICAgKiBIb2xkcyBnZW5lcmF0ZWQgY2hlY2tzdW0gYW5kIGdldHMgc2V0IGFzIGEgUHJvamVjdCBQcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKyAgICAvKioKKyAgICAgKiBIb2xkcyBjaGVja3N1bXMgZm9yIGFsbCBmaWxlcyAoYm90aCBjYWxjdWxhdGVkIGFuZCBjYWNoZWQgb24gZGlzaykuCisgICAgICogS2V5OiAgIGphdmEudXRpbC5GaWxlIChzb3VyY2UgZmlsZSkKKyAgICAgKiBWYWx1ZTogamF2YS5sYW5nLlN0cmluZyAoZGlnZXN0KQorICAgICAqLworICAgIHByaXZhdGUgTWFwIGFsbERpZ2VzdHMgPSBuZXcgSGFzaE1hcCgpOworICAgIC8qKgorICAgICAqIEhvbGRzIHJlbGF0aXZlIGZpbGUgbmFtZXMgZm9yIGFsbCBmaWxlcyAoYWx3YXlzIHdpdGggYSBmb3J3YXJkIHNsYXNoKS4KKyAgICAgKiBUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBoYXNoLgorICAgICAqIEtleTogICBqYXZhLnV0aWwuRmlsZSAoc291cmNlIGZpbGUpCisgICAgICogVmFsdWU6IGphdmEubGFuZy5TdHJpbmcgKHJlbGF0aXZlIGZpbGUgbmFtZSkKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcCByZWxhdGl2ZUZpbGVQYXRocyA9IG5ldyBIYXNoTWFwKCk7CisgICAgLyoqCisgICAgICogUHJvcGVydHkgd2hlcmUgdG90YWxDaGVja3N1bSBnZXRzIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0b3RhbHByb3BlcnR5OworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIGNyZWF0ZSBhIG5ldyBmaWxlLgorICAgICAqIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2VPdmVyd3JpdGU7CisgICAgLyoqCisgICAgICogQ29udGFpbnMgdGhlIHJlc3VsdCBvZiBhIGNoZWNrc3VtIHZlcmlmaWNhdGlvbi4gKCJ0cnVlIiBvciAiZmFsc2UiKQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHZlcmlmeVByb3BlcnR5OworICAgIC8qKgorICAgICAqIFJlc291cmNlIENvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlVW5pb24gcmVzb3VyY2VzID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgU291cmNlRmlsZSwgRGVzdEZpbGUgcGFpcnMgYW5kIFNvdXJjZUZpbGUsIFByb3BlcnR5IFN0cmluZyBwYWlycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBpbmNsdWRlRmlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIERpZ2VzdCBpbnN0YW5jZQorICAgICAqLworICAgIHByaXZhdGUgTWVzc2FnZURpZ2VzdCBtZXNzYWdlRGlnZXN0OworICAgIC8qKgorICAgICAqIGlzIHRoaXMgdGFzayBiZWluZyB1c2VkIGFzIGEgbmVzdGVkIGNvbmRpdGlvbiBlbGVtZW50PworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbmRpdGlvbjsKKyAgICAvKioKKyAgICAgKiBTaXplIG9mIHRoZSByZWFkIGJ1ZmZlciB0byB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmVhZEJ1ZmZlclNpemUgPSBCVUZGRVJfU0laRTsKKworICAgIC8qKgorICAgICAqIEZvcm1hdGVyIGZvciB0aGUgY2hlY2tzdW0gZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1lc3NhZ2VGb3JtYXQgZm9ybWF0ID0gRm9ybWF0RWxlbWVudC5nZXREZWZhdWx0KCkuZ2V0Rm9ybWF0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmaWxlIGZvciB3aGljaCB0aGUgY2hlY2tzdW0gaXMgdG8gYmUgY2FsY3VsYXRlZC4KKyAgICAgKiBAcGFyYW0gZmlsZSBhIDxjb2RlPkZpbGU8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByb290IGRpcmVjdG9yeSB3aGVyZSBjaGVja3N1bSBmaWxlcyB3aWxsIGJlCisgICAgICogd3JpdHRlbi9yZWFkCisgICAgICogQHBhcmFtIHRvZGlyIHRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdG8KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvZGlyKEZpbGUgdG9kaXIpIHsKKyAgICAgICAgdGhpcy50b2RpciA9IHRvZGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYWxnb3JpdGhtIHRvIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgY2hlY2tzdW0uCisgICAgICogRGVmYXVsdHMgdG8gIk1ENSIuIE90aGVyIHBvcHVsYXIgYWxnb3JpdGhtcyBsaWtlICJTSEEiIG1heSBiZSB1c2VkIGFzIHdlbGwuCisgICAgICogQHBhcmFtIGFsZ29yaXRobSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGdvcml0aG0oU3RyaW5nIGFsZ29yaXRobSkgeworICAgICAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBNZXNzYWdlRGlnZXN0IGFsZ29yaXRobSBwcm92aWRlciB0byBiZSB1c2VkCisgICAgICogdG8gY2FsY3VsYXRlIHRoZSBjaGVja3N1bS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvdmlkZXIoU3RyaW5nIHByb3ZpZGVyKSB7CisgICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmaWxlIGV4dGVuc2lvbiB0aGF0IGlzIGJlIHRvIHVzZWQgdG8KKyAgICAgKiBjcmVhdGUgb3IgaWRlbnRpZnkgZGVzdGluYXRpb24gZmlsZS4KKyAgICAgKiBAcGFyYW0gZmlsZWV4dCBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlZXh0KFN0cmluZyBmaWxlZXh0KSB7CisgICAgICAgIHRoaXMuZmlsZWV4dCA9IGZpbGVleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvcGVydHkgdG8gaG9sZCB0aGUgZ2VuZXJhdGVkIGNoZWNrc3VtLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IHRvIGhvbGQgdGhlIGdlbmVyYXRlZCB0b3RhbCBjaGVja3N1bQorICAgICAqIGZvciBhbGwgZmlsZXMuCisgICAgICogQHBhcmFtIHRvdGFscHJvcGVydHkgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvdGFscHJvcGVydHkoU3RyaW5nIHRvdGFscHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy50b3RhbHByb3BlcnR5ID0gdG90YWxwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2ZXJpZnkgcHJvcGVydHkuICBUaGlzIHByb2plY3QgcHJvcGVydHkgaG9sZHMKKyAgICAgKiB0aGUgcmVzdWx0IG9mIGEgY2hlY2tzdW0gdmVyaWZpY2F0aW9uIC0gInRydWUiIG9yICJmYWxzZSIKKyAgICAgKiBAcGFyYW0gdmVyaWZ5UHJvcGVydHkgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyaWZ5cHJvcGVydHkoU3RyaW5nIHZlcmlmeVByb3BlcnR5KSB7CisgICAgICAgIHRoaXMudmVyaWZ5UHJvcGVydHkgPSB2ZXJpZnlQcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBpcnJlc3BlY3RpdmUgb2YKKyAgICAgKiB3aGV0aGVyIGl0IGlzIG5ld2VyIHRoYW4KKyAgICAgKiB0aGUgc291cmNlIGZpbGUuICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0gZm9yY2VPdmVyd3JpdGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlT3ZlcndyaXRlKGJvb2xlYW4gZm9yY2VPdmVyd3JpdGUpIHsKKyAgICAgICAgdGhpcy5mb3JjZU92ZXJ3cml0ZSA9IGZvcmNlT3ZlcndyaXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzaXplIG9mIHRoZSByZWFkIGJ1ZmZlciB0byB1c2UuCisgICAgICogQHBhcmFtIHNpemUgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWRCdWZmZXJTaXplKGludCBzaXplKSB7CisgICAgICAgIHRoaXMucmVhZEJ1ZmZlclNpemUgPSBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgaW4vb3V0cHV0IHBhdHRlcm4gdmlhIGEgd2VsbCBrbm93IGZvcm1hdCBuYW1lLgorICAgICAqIEBwYXJhbSBlIGFuIDxjb2RlPmVudW1lcmF0ZWQ8L2NvZGU+IHZhbHVlCisgICAgICoKKyAgICAgKiBAc2luY2UgMS43LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXQoRm9ybWF0RWxlbWVudCBlKSB7CisgICAgICAgIGZvcm1hdCA9IGUuZ2V0Rm9ybWF0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgcGF0dGVybiB0byB1c2UgYXMgYSBNZXNzYWdlRm9ybWF0IHBhdHRlcm4uCisgICAgICoKKyAgICAgKiA8cD57MH0gZ2V0cyByZXBsYWNlZCBieSB0aGUgY2hlY2tzdW0sIHsxfSBieSB0aGUgZmlsZW5hbWUuPC9wPgorICAgICAqIEBwYXJhbSBwIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqCisgICAgICogQHNpbmNlIDEuNy4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcCkgeworICAgICAgICBmb3JtYXQgPSBuZXcgTWVzc2FnZUZvcm1hdChwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWxlcyB0byBnZW5lcmF0ZSBjaGVja3N1bXMgZm9yLgorICAgICAqIEBwYXJhbSBzZXQgYSBmaWxlc2V0IG9mIGZpbGVzIHRvIGdlbmVyYXRlIGNoZWNrc3VtcyBmb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBhZGQoc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSByYyB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CisgICAgICAgIGlmIChyYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VzID0gKHJlc291cmNlcyA9PSBudWxsKSA/IG5ldyBGaWxlVW5pb24oKSA6IHJlc291cmNlczsKKyAgICAgICAgcmVzb3VyY2VzLmFkZChyYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBjaGVja3N1bShzKS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlzQ29uZGl0aW9uID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gdmFsdWUgPSB2YWxpZGF0ZUFuZEV4ZWN1dGUoKTsKKyAgICAgICAgaWYgKHZlcmlmeVByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICB2ZXJpZnlQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAodmFsdWUgPyBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSA6IEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBjaGVja3N1bShzKQorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoZWNrc3VtIHZlcmlmaWNhdGlvbiB0ZXN0IHBhc3NlZCwKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpc0NvbmRpdGlvbiA9IHRydWU7CisgICAgICAgIHJldHVybiB2YWxpZGF0ZUFuZEV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBhdHRyaWJ1dGVzIGFuZCBnZXQgZG93biB0byBidXNpbmVzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVBbmRFeGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNhdmVkRmlsZUV4dCA9IGZpbGVleHQ7CisKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLnNpemUoKSA9PSAwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UgLSBhIGZpbGUgb3IgYSByZXNvdXJjZSBjb2xsZWN0aW9uLiIpOworICAgICAgICB9CisgICAgICAgIGlmICghKHJlc291cmNlcyA9PSBudWxsIHx8IHJlc291cmNlcy5pc0ZpbGVzeXN0ZW1Pbmx5KCkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbiBvbmx5IGNhbGN1bGF0ZSBjaGVja3N1bXMgZm9yIGZpbGUtYmFzZWQgcmVzb3VyY2VzLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2hlY2tzdW0gY2Fubm90IGJlIGdlbmVyYXRlZCBmb3IgZGlyZWN0b3JpZXMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIHRvdGFscHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlIGFuZCBUb3RhbHByb3BlcnR5IGNhbm5vdCBjby1leGlzdC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiBmaWxlZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvcGVydHkgYW5kIEZpbGVFeHQgY2Fubm90IGNvLWV4aXN0LiIpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZm9yY2VPdmVyd3JpdGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGb3JjZU92ZXJ3cml0ZSBjYW5ub3QgYmUgdXNlZCB3aGVuIFByb3BlcnR5IGlzIHNwZWNpZmllZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGN0ID0gMDsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN0ICs9IHJlc291cmNlcy5zaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3QrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdCA+IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBmaWxlcyBjYW5ub3QgYmUgdXNlZCB3aGVuIFByb3BlcnR5IGlzIHNwZWNpZmllZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2ZXJpZnlQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBpc0NvbmRpdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZlcmlmeVByb3BlcnR5ICE9IG51bGwgJiYgZm9yY2VPdmVyd3JpdGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVmVyaWZ5UHJvcGVydHkgYW5kIEZvcmNlT3ZlcndyaXRlIGNhbm5vdCBjby1leGlzdC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNDb25kaXRpb24gJiYgZm9yY2VPdmVyd3JpdGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRm9yY2VPdmVyd3JpdGUgY2Fubm90IGJlIHVzZWQgd2hlbiBjb25kaXRpb25zIGFyZSBiZWluZyB1c2VkLiIpOworICAgICAgICB9CisgICAgICAgIG1lc3NhZ2VEaWdlc3QgPSBudWxsOworICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlRGlnZXN0ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShhbGdvcml0aG0sIHByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBub2FsZ28pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obm9hbGdvLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIG5vcHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obm9wcm92aWRlciwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VEaWdlc3QgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKGFsZ29yaXRobSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbm9hbGdvKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG5vYWxnbywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lc3NhZ2VEaWdlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIE1lc3NhZ2UgRGlnZXN0IiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGVleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgZmlsZWV4dCA9ICIuIiArIGFsZ29yaXRobTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWxlZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZpbGUgZXh0ZW5zaW9uIHdoZW4gc3BlY2lmaWVkIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZyIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVSZXNvdXJjZSBmciA9IChGaWxlUmVzb3VyY2UpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBGaWxlIHNyYyA9IGZyLmdldEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFscHJvcGVydHkgIT0gbnVsbCB8fCB0b2RpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgJy8nIHRvIGNhbGN1bGF0ZSBkaWdlc3QgYmFzZWQgb24gZmlsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBnZXQgdGhlIHNhbWUgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLgorICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVGaWxlUGF0aHMucHV0KHNyYywgZnIuZ2V0TmFtZSgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhZGRUb0luY2x1ZGVGaWxlTWFwKHNyYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh0b3RhbHByb3BlcnR5ICE9IG51bGwgfHwgdG9kaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZUZpbGVQYXRocy5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBmaWxlLmdldE5hbWUoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZFRvSW5jbHVkZUZpbGVNYXAoZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVDaGVja3N1bXMoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbGVleHQgPSBzYXZlZEZpbGVFeHQ7CisgICAgICAgICAgICBpbmNsdWRlRmlsZU1hcC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGtleS12YWx1ZSBwYWlyIHRvIHRoZSBoYXNodGFibGUgdXBvbiB3aGljaAorICAgICAqIHRvIGxhdGVyIG9wZXJhdGUgdXBvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkVG9JbmNsdWRlRmlsZU1hcChGaWxlIGZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGUgY2hlY2tzdW1GaWxlID0gZ2V0Q2hlY2tzdW1GaWxlKGZpbGUpOworICAgICAgICAgICAgICAgIGlmIChmb3JjZU92ZXJ3cml0ZSB8fCBpc0NvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNoZWNrc3VtRmlsZS5sYXN0TW9kaWZpZWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUZpbGVNYXAucHV0KGZpbGUsIGNoZWNrc3VtRmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKGZpbGUgKyAiIG9taXR0ZWQgYXMgIiArIGNoZWNrc3VtRmlsZSArICIgaXMgdXAgdG8gZGF0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbHByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGNoZWNrc3VtIGZyb20gZGlzay4KKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGVja3N1bSA9IHJlYWRDaGVja3N1bShjaGVja3N1bUZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRpZ2VzdCA9IGRlY29kZUhleChjaGVja3N1bS50b0NoYXJBcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbERpZ2VzdHMucHV0KGZpbGUsIGRpZ2VzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluY2x1ZGVGaWxlTWFwLnB1dChmaWxlLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJDb3VsZCBub3QgZmluZCBmaWxlICIKKyAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICArICIgdG8gZ2VuZXJhdGUgY2hlY2tzdW0gZm9yLiI7CisgICAgICAgICAgICBsb2cobWVzc2FnZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGUgZ2V0Q2hlY2tzdW1GaWxlKEZpbGUgZmlsZSkgeworICAgICAgICBGaWxlIGRpcmVjdG9yeTsKKyAgICAgICAgaWYgKHRvZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEEgc2VwYXJhdGUgZGlyZWN0b3J5IHdhcyBleHBsaWNpdGx5IGRlY2xhcmVkCisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIHJlbGF0aXZlRmlsZVBhdGhzLmdldChmaWxlKTsKKyAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvL2J1ZyAzNzM4Ni4gdGhpcyBzaG91bGQgbm90IG9jY3VyLCBidXQgaXQgaGFzLCBvbmNlLgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkludGVybmFsIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgInJlbGF0aXZlRmlsZVBhdGhzIGNvdWxkIG5vdCBtYXRjaCBmaWxlIgorICAgICAgICAgICAgICAgICAgICArIGZpbGUgKyAiXG4iCisgICAgICAgICAgICAgICAgICAgICsgInBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCBvbiB0aGlzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0b2RpciwgcGF0aCkuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXJlY3RvcnksIGFzIGl0IG1pZ2h0IG5vdCBleGlzdC4KKyAgICAgICAgICAgIGRpcmVjdG9yeS5ta2RpcnMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEp1c3QgdXNlIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZSBpdHNlbGYuCisgICAgICAgICAgICAvLyBUaGlzIGRpcmVjdG9yeSB3aWxsIGV4aXN0CisgICAgICAgICAgICBkaXJlY3RvcnkgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIGNoZWNrc3VtRmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgZmlsZS5nZXROYW1lKCkgKyBmaWxlZXh0KTsKKyAgICAgICAgcmV0dXJuIGNoZWNrc3VtRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBjaGVja3N1bShzKSB1c2luZyB0aGUgbWVzc2FnZSBkaWdlc3QgY3JlYXRlZCBlYXJsaWVyLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUNoZWNrc3VtcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gY2hlY2tzdW1NYXRjaGVzID0gdHJ1ZTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3JlYWRCdWZmZXJTaXplXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGluY2x1ZGVGaWxlTWFwLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlRGlnZXN0LnJlc2V0KCk7CisgICAgICAgICAgICAgICAgRmlsZSBzcmMgPSAoRmlsZSkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmICghaXNDb25kaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJDYWxjdWxhdGluZyAiICsgYWxnb3JpdGhtICsgIiBjaGVja3N1bSBmb3IgIiArIHNyYywgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKTsKKyAgICAgICAgICAgICAgICBEaWdlc3RJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGlnZXN0SW5wdXRTdHJlYW0oZmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRGlnZXN0KTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZGlzLnJlYWQoYnVmLCAwLCByZWFkQnVmZmVyU2l6ZSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW1wdHkgc3RhdGVtZW50CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIGZpcyA9IG51bGw7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGZpbGVEaWdlc3QgPSBtZXNzYWdlRGlnZXN0LmRpZ2VzdCAoKTsKKyAgICAgICAgICAgICAgICBpZiAodG90YWxwcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbERpZ2VzdHMucHV0KHNyYywgZmlsZURpZ2VzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBjaGVja3N1bSA9IGNyZWF0ZURpZ2VzdFN0cmluZyhmaWxlRGlnZXN0KTsKKyAgICAgICAgICAgICAgICAvL2NhbiBlaXRoZXIgYmUgYSBwcm9wZXJ0eSBuYW1lIHN0cmluZyBvciBhIGZpbGUKKyAgICAgICAgICAgICAgICBPYmplY3QgZGVzdGluYXRpb24gPSBpbmNsdWRlRmlsZU1hcC5nZXQoc3JjKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wID0gKFN0cmluZykgZGVzdGluYXRpb247CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbmRpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1NYXRjaGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjaGVja3N1bU1hdGNoZXMgJiYgY2hlY2tzdW0uZXF1YWxzKHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wLCBjaGVja3N1bSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgamF2YS5pby5GaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbmRpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBleGlzdGluZ0ZpbGUgPSAoRmlsZSkgZGVzdGluYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1cHBsaWVkQ2hlY2tzdW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZENoZWNrc3VtKGV4aXN0aW5nRmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtTWF0Y2hlcyA9IGNoZWNrc3VtTWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2hlY2tzdW0uZXF1YWxzKHN1cHBsaWVkQ2hlY2tzdW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgaXMgb24gd3JvbmcgZm9ybWF0LCBzd2FsbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtTWF0Y2hlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1NYXRjaGVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc3QgPSAoRmlsZSkgZGVzdGluYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShmb3JtYXQuZm9ybWF0KG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKFN0cmluZ1V0aWxzLkxJTkVfU0VQLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRvdGFscHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgY2hlY2tzdW0KKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBrZXlzIChzb3VyY2UgZmlsZXMpIGludG8gYSBzb3J0ZWQgYXJyYXkuCisgICAgICAgICAgICAgICAgU2V0IGtleXMgPSBhbGxEaWdlc3RzLmtleVNldCgpOworICAgICAgICAgICAgICAgIE9iamVjdFtdIGtleUFycmF5ID0ga2V5cy50b0FycmF5KCk7CisgICAgICAgICAgICAgICAgLy8gRmlsZSBpcyBDb21wYXJhYmxlLCBzbyBzb3J0aW5nIGlzIHRyaXZpYWwKKyAgICAgICAgICAgICAgICBBcnJheXMuc29ydChrZXlBcnJheSk7CisgICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIHRoZSBjaGVja3N1bXMgYW5kIGdlbmVyYXRlIGEgdG90YWwgaGFzaC4KKyAgICAgICAgICAgICAgICBtZXNzYWdlRGlnZXN0LnJlc2V0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlBcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIHNyYyA9IChGaWxlKSBrZXlBcnJheVtpXTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGRpZ2VzdCBmb3IgdGhlIGZpbGUgY29udGVudAorICAgICAgICAgICAgICAgICAgICBieXRlW10gZGlnZXN0ID0gKGJ5dGVbXSkgYWxsRGlnZXN0cy5nZXQoc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZURpZ2VzdC51cGRhdGUoZGlnZXN0KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGZpbGUgcGF0aAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAoU3RyaW5nKSByZWxhdGl2ZUZpbGVQYXRocy5nZXQoc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZURpZ2VzdC51cGRhdGUoZmlsZU5hbWUuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyB0b3RhbENoZWNrc3VtID0gY3JlYXRlRGlnZXN0U3RyaW5nKG1lc3NhZ2VEaWdlc3QuZGlnZXN0KCkpOworICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eSh0b3RhbHByb3BlcnR5LCB0b3RhbENoZWNrc3VtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShmaXMpOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGZvcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoZWNrc3VtTWF0Y2hlczsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVEaWdlc3RTdHJpbmcoYnl0ZVtdIGZpbGVEaWdlc3QpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNoZWNrc3VtU2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZURpZ2VzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGhleFN0ciA9IEludGVnZXIudG9IZXhTdHJpbmcoQllURV9NQVNLICYgZmlsZURpZ2VzdFtpXSk7CisgICAgICAgICAgICBpZiAoaGV4U3RyLmxlbmd0aCgpIDwgMikgeworICAgICAgICAgICAgICAgIGNoZWNrc3VtU2IuYXBwZW5kKCIwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja3N1bVNiLmFwcGVuZChoZXhTdHIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGVja3N1bVNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgYW4gYXJyYXkgb2YgY2hhcmFjdGVycyByZXByZXNlbnRpbmcgaGV4YWRlY2ltYWwgdmFsdWVzIGludG8gYW4KKyAgICAgKiBhcnJheSBvZiBieXRlcyBvZiB0aG9zZSBzYW1lIHZhbHVlcy4gVGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgaGFsZiB0aGUKKyAgICAgKiBsZW5ndGggb2YgdGhlIHBhc3NlZCBhcnJheSwgYXMgaXQgdGFrZXMgdHdvIGNoYXJhY3RlcnMgdG8gcmVwcmVzZW50IGFueQorICAgICAqIGdpdmVuIGJ5dGUuIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIHBhc3NlZCBjaGFyIGFycmF5IGhhcyBhbiBvZGQKKyAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBOT1RFOiBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20gamFrYXJ0YS1jb21tb25zIGNvZGVjLgorICAgICAqIEBwYXJhbSBkYXRhIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMgcmVwcmVzZW50aW5nIGhleGFkZWNpbWFsIHZhbHVlcworICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBhcnJheSBvZiBieXRlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGVIZXgoY2hhcltdIGRhdGEpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBsID0gZGF0YS5sZW5ndGg7CisKKyAgICAgICAgaWYgKChsICYgMHgwMSkgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvZGQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuIik7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gb3V0ID0gbmV3IGJ5dGVbbCA+PiAxXTsKKworICAgICAgICAvLyB0d28gY2hhcmFjdGVycyBmb3JtIHRoZSBoZXggdmFsdWUuCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBqID0gMDsgaiA8IGw7IGkrKykgeworICAgICAgICAgICAgaW50IGYgPSBDaGFyYWN0ZXIuZGlnaXQoZGF0YVtqKytdLCBXT1JEKSA8PCBOSUJCTEU7CisgICAgICAgICAgICBmID0gZiB8IENoYXJhY3Rlci5kaWdpdChkYXRhW2orK10sIFdPUkQpOworICAgICAgICAgICAgb3V0W2ldID0gKGJ5dGUpIChmICYgQllURV9NQVNLKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVhZHMgdGhlIGNoZWNrc3VtIGZyb20gYSBmaWxlIHVzaW5nIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgorICAgICAqCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRDaGVja3N1bShGaWxlIGYpIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgZGlza0NoZWNrc3VtUmVhZGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRpc2tDaGVja3N1bVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmKSk7CisgICAgICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBmb3JtYXQucGFyc2UoZGlza0NoZWNrc3VtUmVhZGVyLnJlYWRMaW5lKCkpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMCB8fCByZXN1bHRbMF0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmFpbGVkIHRvIGZpbmQgYSBjaGVja3N1bSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHJlc3VsdFswXTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZG4ndCByZWFkIGNoZWNrc3VtIGZpbGUgIiArIGYsIGUpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkbid0IHJlYWQgY2hlY2tzdW0gZmlsZSAiICsgZiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZGlza0NoZWNrc3VtUmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBjbGFzcyBmb3IgdGhlIGZvcm1hdCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtYXRFbGVtZW50IGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgZm9ybWF0TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLU1VNID0gIkNIRUNLU1VNIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ENVNVTSA9ICJNRDVTVU0iOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1ZGID0gIlNWRiI7CisKKyAgICAgICAgc3RhdGljIHsKKyAgICAgICAgICAgIGZvcm1hdE1hcC5wdXQoQ0hFQ0tTVU0sIG5ldyBNZXNzYWdlRm9ybWF0KCJ7MH0iKSk7CisgICAgICAgICAgICBmb3JtYXRNYXAucHV0KE1ENVNVTSwgbmV3IE1lc3NhZ2VGb3JtYXQoInswfSAqezF9IikpOworICAgICAgICAgICAgZm9ybWF0TWFwLnB1dChTVkYsIG5ldyBNZXNzYWdlRm9ybWF0KCJNRDUgKHsxfSkgPSB7MH0iKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogQ29uc3RydWN0b3IgZm9yIEZvcm1hdEVsZW1lbnQgKi8KKyAgICAgICAgcHVibGljIEZvcm1hdEVsZW1lbnQoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSAtIENIRUNLU1VNLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWwgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEZvcm1hdEVsZW1lbnQgZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgICAgIEZvcm1hdEVsZW1lbnQgZSA9IG5ldyBGb3JtYXRFbGVtZW50KCk7CisgICAgICAgICAgICBlLnNldFZhbHVlKENIRUNLU1VNKTsKKyAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnQgdGhpcyBlbnVtZXJhdGVkIHR5cGUgdG8gYSA8Y29kZT5NZXNzYWdlRm9ybWF0PC9jb2RlPi4KKyAgICAgICAgICogQHJldHVybiBhIDxjb2RlPk1lc3NhZ2VGb3JtYXQ8L2NvZGU+IG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZXNzYWdlRm9ybWF0IGdldEZvcm1hdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWVzc2FnZUZvcm1hdCkgZm9ybWF0TWFwLmdldChnZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHZhbGlkIHZhbHVlcy4KKyAgICAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB2YWx1ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7Q0hFQ0tTVU0sIE1ENVNVTSwgU1ZGfTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NobW9kLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaG1vZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTU0NjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaG1vZC5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQ7CisKKy8qKgorICogQ2htb2QgZXF1aXZhbGVudCBmb3IgdW5peC1saWtlIGVudmlyb25tZW50cy4KKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKKyAqIEB0b2RvIFJlZmFjdG9yIHNvIGl0IGRvZXMgbm90IGV4dGVuZCBmcm9tIEV4ZWN1dGVPbiBhbmQgdGhlbiB0dXJuIGFyb3VuZAorICogICAgICAgYW5kIHVuc3VwcG9ydCBzZXZlcmFsIGF0dHJpYnV0ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDaG1vZCBleHRlbmRzIEV4ZWN1dGVPbiB7CisKKyAgICBwcml2YXRlIEZpbGVTZXQgZGVmYXVsdFNldCA9IG5ldyBGaWxlU2V0KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRTZXREZWZpbmVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGhhdmVQZXJtID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDaG1vZCB0YXNrIGZvciBzZXR0aW5nIGZpbGUgYW5kIGRpcmVjdG9yeSBwZXJtaXNzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2htb2QoKSB7CisgICAgICAgIHN1cGVyLnNldEV4ZWN1dGFibGUoImNobW9kIik7CisgICAgICAgIHN1cGVyLnNldFBhcmFsbGVsKHRydWUpOworICAgICAgICBzdXBlci5zZXRTa2lwRW1wdHlGaWxlc2V0cyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb2plY3Qgb2YgdGhpcyB0YXNrLgorICAgICAqIENhbGxzIHRoZSBzdXBlciBjbGFzcyBhbmQgc2V0cyB0aGUgcHJvamVjdCBvbiBkaGUgZGVmYXVsdCBGaWxlU2V0LgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGZvciB0aGlzIHRhc2suCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50I3NldFByb2plY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBzdXBlci5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBkZWZhdWx0U2V0LnNldFByb2plY3QocHJvamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZpbGUgb3Igc2luZ2xlIGRpcmVjdG9yeSBvZiB3aGljaCB0aGUgcGVybWlzc2lvbnMgbXVzdCBiZSBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBmaWxlIG9yIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgc3JjKSB7CisgICAgICAgIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOworICAgICAgICBmcy5zZXRGaWxlKHNyYyk7CisgICAgICAgIGFkZEZpbGVzZXQoZnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hpY2ggaG9sZHMgdGhlIGZpbGVzIHdob3NlIHBlcm1pc3Npb25zIG11c3QgYmUgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgc3JjKSB7CisgICAgICAgIGRlZmF1bHRTZXQuc2V0RGlyKHNyYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuZXcgcGVybWlzc2lvbnMuCisgICAgICogQHBhcmFtIHBlcm0gdGhlIG5ldyBwZXJtaXNzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQZXJtKFN0cmluZyBwZXJtKSB7CisgICAgICAgIGNyZWF0ZUFyZygpLnNldFZhbHVlKHBlcm0pOworICAgICAgICBoYXZlUGVybSA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0LgorICAgICAqIEByZXR1cm4gYSBOYW1lRW50cnkgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZSgpIHsKKyAgICAgICAgZGVmYXVsdFNldERlZmluZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gZGVmYXVsdFNldC5jcmVhdGVJbmNsdWRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0LgorICAgICAqIEByZXR1cm4gYSBuYW1lZW50cnkgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlRXhjbHVkZSgpIHsKKyAgICAgICAgZGVmYXVsdFNldERlZmluZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gZGVmYXVsdFNldC5jcmVhdGVFeGNsdWRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIHBhdHRlcm5zLgorICAgICAqIEByZXR1cm4gYSBwYXR0ZXJuc2V0IHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5TZXQgY3JlYXRlUGF0dGVyblNldCgpIHsKKyAgICAgICAgZGVmYXVsdFNldERlZmluZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gZGVmYXVsdFNldC5jcmVhdGVQYXR0ZXJuU2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorICAgICAqIG9yIGEgc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKFN0cmluZyBpbmNsdWRlcykgeworICAgICAgICBkZWZhdWx0U2V0RGVmaW5lZCA9IHRydWU7CisgICAgICAgIGRlZmF1bHRTZXQuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNldCBvZiBleGNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKKyAgICAgKiBvciBhIHNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2x1ZGVzIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmcgZXhjbHVkZXMpIHsKKyAgICAgICAgZGVmYXVsdFNldERlZmluZWQgPSB0cnVlOworICAgICAgICBkZWZhdWx0U2V0LnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VEZWZhdWx0RXhjbHVkZXMgInRydWUifCJvbiJ8InllcyIgd2hlbiBkZWZhdWx0IGV4Y2x1c2lvbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkLCAiZmFsc2UifCJvZmYifCJubyIgd2hlbiB0aGV5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRuJ3QgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0ZXhjbHVkZXMoYm9vbGVhbiB1c2VEZWZhdWx0RXhjbHVkZXMpIHsKKyAgICAgICAgZGVmYXVsdFNldERlZmluZWQgPSB0cnVlOworICAgICAgICBkZWZhdWx0U2V0LnNldERlZmF1bHRleGNsdWRlcyh1c2VEZWZhdWx0RXhjbHVkZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgeworICAgICAgICBpZiAoIWhhdmVQZXJtKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlcXVpcmVkIGF0dHJpYnV0ZSBwZXJtIG5vdCBzZXQgaW4gY2htb2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmF1bHRTZXREZWZpbmVkICYmIGRlZmF1bHRTZXQuZ2V0RGlyKGdldFByb2plY3QoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkRmlsZXNldChkZWZhdWx0U2V0KTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5jaGVja0NvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYXJyeSBvdXQgdGhlIGNobW9kaW5nLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8qCisgICAgICAgICAqIEluIEFudCAxLjEsIDxjaG1vZCBkaXI9ImZvbyIgLz4gbWVhbnMsIGNoYW5nZSB0aGUgcGVybWlzc2lvbnMKKyAgICAgICAgICogb2YgZGlyZWN0b3J5IGZvbywgbm90IGFueXRoaW5nIGluc2lkZSBvZiBpdC4gIFRoaXMgaXMgdGhlIGNhc2UgdGhlCisgICAgICAgICAqIHNlY29uZCBicmFuY2ggb2YgdGhlIGlmIHN0YXRlbWVudCBiZWxvdyBjYXRjaGVzIGZvciBiYWNrd2FyZHMKKyAgICAgICAgICogY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChkZWZhdWx0U2V0RGVmaW5lZCB8fCBkZWZhdWx0U2V0LmdldERpcihnZXRQcm9qZWN0KCkpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFNldERlZmluZWQgJiYgZGVmYXVsdFNldC5nZXREaXIoZ2V0UHJvamVjdCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzZXRzLnJlbW92ZUVsZW1lbnQoZGVmYXVsdFNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGlzVmFsaWRPcygpKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgY2htb2RkaW5nIHRoZSBnaXZlbiBkaXJlY3RvcnkKKyAgICAgICAgICAgIEV4ZWN1dGUgZXhlY3V0ZSA9IHByZXBhcmVFeGVjKCk7CisgICAgICAgICAgICBDb21tYW5kbGluZSBjbG9uZWQgPSAoQ29tbWFuZGxpbmUpIGNtZGwuY2xvbmUoKTsKKyAgICAgICAgICAgIGNsb25lZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGRlZmF1bHRTZXQuZ2V0RGlyKGdldFByb2plY3QoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXRoKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBleGVjdXRlLnNldENvbW1hbmRsaW5lKGNsb25lZC5nZXRDb21tYW5kbGluZSgpKTsKKyAgICAgICAgICAgICAgICBydW5FeGVjdXRlKGV4ZWN1dGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhlY3V0ZSBmYWlsZWQ6ICIgKyBlLCBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIG91dHB1dCBmaWxlIGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgbG9nRmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXhlY3V0YWJsZS4KKyAgICAgKiBUaGlzIGlzIG5vdCBhbGxvd2VkIGZvciBDaG1vZC4KKyAgICAgKiBAcGFyYW0gZSBpZ25vcmVkLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWx3YXlzLgorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlKFN0cmluZyBlKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCisgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgZXhlY3V0YWJsZSBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbW1hbmQuCisgICAgICogVGhpcyBpcyBub3QgYWxsb3dlZCBmb3IgQ2htb2QuCisgICAgICogQHBhcmFtIGNtZGwgaWdub3JlZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGFsd2F5cy4KKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChDb21tYW5kbGluZSBjbWRsKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCisgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgY29tbWFuZCBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIG5vdCBhbGxvd2VkIGZvciBDaG1vZC4KKyAgICAgKiBAcGFyYW0gc2tpcCBpZ25vcmVkLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWx3YXlzLgorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTa2lwRW1wdHlGaWxlc2V0cyhib29sZWFuIHNraXApIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tUeXBlKCkKKyAgICAgICAgICAgICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSBza2lwZW1wdHlmaWxlc2V0IGF0dHJpYnV0ZSIsIGdldExvY2F0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgbm90IGFsbG93ZWQgZm9yIENobW9kLgorICAgICAqIEBwYXJhbSBiIGlnbm9yZWQuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMuCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkZHNvdXJjZWZpbGUoYm9vbGVhbiBiKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCisgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgYWRkc291cmNlZmlsZSBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgb3MgaXMgdmFsaWQuCisgICAgICogQWx3YXlzIGluY2x1ZGUgdW5peC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9zIGlzIHZhbGlkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRPcygpIHsKKyAgICAgICAgcmV0dXJuIE9zLmlzRmFtaWx5KE9zLkZBTUlMWV9VTklYKSAmJiBzdXBlci5pc1ZhbGlkT3MoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DbGFzc2xvYWRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2xhc3Nsb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDNjZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2xhc3Nsb2FkZXIuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogRVhQRVJJTUVOVEFMCisgKiBDcmVhdGUgb3IgbW9kaWZpZXMgQ2xhc3NMb2FkZXIuIFRoZSByZXF1aXJlZCBwYXRoUmVmIHBhcmFtZXRlcgorICogd2lsbCBiZSB1c2VkIHRvIGFkZCBjbGFzc3BhdGggZWxlbWVudHMuCisgKgorICogVGhlIGNsYXNzcGF0aCBpcyBhIHJlZ3VsYXIgcGF0aC4gQ3VycmVudGx5IG9ubHkgZmlsZSBjb21wb25lbnRzIGFyZQorICogc3VwcG9ydGVkIChmdXR1cmUgZXh0ZW5zaW9ucyBtYXkgYWxsb3cgVVJMcykuCisgKgorICogWW91IGNhbiBtb2RpZnkgdGhlIGNvcmUgbG9hZGVyIGJ5IG5vdCBzcGVjaWZ5aW5nIGFueSBuYW1lIG9yIHVzaW5nCisgKiAiYW50LmNvcmVMb2FkZXIiLiAodGhlIGNvcmUgbG9hZGVyIGlzIHVzZWQgdG8gbG9hZCBzeXN0ZW0gYW50CisgKiB0YXNrcyBhbmQgZm9yIHRhc2tkZWZzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBwYXRoKS4KKyAqCisgKiBUYXNrZGVmIGFuZCB0eXBlZGVmIGNhbiB1c2UgdGhlIGxvYWRlciB5b3UgY3JlYXRlIGlmIHRoZSBuYW1lIGZvbGxvd3MKKyAqIHRoZSAiYW50LmxvYWRlci5OQU1FIiBwYXR0ZXJuLiBOQU1FIHdpbGwgYmUgdXNlZCBhcyBhIHBhdGhyZWYgd2hlbgorICogY2FsbGluZyB0YXNrZGVmLgorICoKKyAqIFRoaXMgdGFza3Mgd2lsbCBub3QgbW9kaWZ5IHRoZSBjb3JlIGxvYWRlciBpZiAiYnVpbGQuc3lzY2xhc3NwYXRoPW9ubHkiCisgKgorICogVGhlIHR5cGljYWwgdXNlIGlzOgorICogPHByZT4KKyAqICAmbHQ7cGF0aCBpZD0iYW50LmRlcHMiICZndDsKKyAqICAgICAmbHQ7ZmlsZXNldCBkaXI9Im15RGlyIiAmZ3Q7CisgKiAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0ianVuaXQuamFyLCBic2YuamFyLCBqcy5qYXIsIGV0YyIvJmd0OworICogICAgICZsdDsvZmlsZXNldCZndDsKKyAqICAmbHQ7L3BhdGgmZ3Q7CisgKgorICogICZsdDtjbGFzc2xvYWRlciBwYXRoUmVmPSJhbnQuZGVwcyIgLyZndDsKKyAqCisgKiA8L3ByZT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc2xvYWRlciBleHRlbmRzIFRhc2sgeworICAgIC8qKiBAc2VlIE1hZ2ljTmFtZXMjU1lTVEVNX0xPQURFUl9SRUYgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fTE9BREVSX1JFRiA9IE1hZ2ljTmFtZXMuU1lTVEVNX0xPQURFUl9SRUY7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOworICAgIHByaXZhdGUgYm9vbGVhbiByZXNldCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJlbnRGaXJzdCA9IHRydWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIENsYXNzbG9hZGVyKCkgeworICAgIH0KKworICAgIC8qKiBOYW1lIG9mIHRoZSBsb2FkZXIuIElmIG5vbmUsIHRoZSBkZWZhdWx0IGxvYWRlciB3aWxsIGJlIG1vZGlmaWVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGlzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgY2xhc3Nsb2FkZXIsIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBBIG5ldyBsb2FkZXIgd2lsbAorICAgICAqIGJlIGNyZWF0ZWQgYW5kIGFsbCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgb2xkIG9uZSB3aWxsIGJlIHJlbW92ZWQuCisgICAgICogKGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZW1vdmUgcGF0aHMgZnJvbSBhIGxvYWRlcikuIFRoZSBuZXcKKyAgICAgKiBwYXRoIHdpbGwgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRydWUgaWYgdGhlIGxvYWRlciBpcyB0byBiZSByZXNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNldChib29sZWFuIGIpIHsKKyAgICAgICAgdGhpcy5yZXNldCA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHJldmVyc2UgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBiIGlmIHRydWUgcmV2ZXJzZSB0aGUgbm9ybWFsIGNsYXNzbG9hZGVyIGxvb2t1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXZlcnNlKGJvb2xlYW4gYikgeworICAgICAgICB0aGlzLnBhcmVudEZpcnN0ID0gIWI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHJldmVyc2UgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBiIGlmIHRydWUgcmV2ZXJzZSB0aGUgbm9ybWFsIGNsYXNzbG9hZGVyIGxvb2t1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRGaXJzdChib29sZWFuIGIpIHsKKyAgICAgICAgdGhpcy5wYXJlbnRGaXJzdCA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHBhcmVudCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5wYXJlbnROYW1lID0gbmFtZTsKKyAgICB9CisKKworICAgIC8qKiBTcGVjaWZ5IHdoaWNoIHBhdGggd2lsbCBiZSB1c2VkLiBJZiB0aGUgbG9hZGVyIGFscmVhZHkgZXhpc3RzCisgICAgICogIGFuZCBpcyBhbiBBbnRDbGFzc0xvYWRlciAob3IgYW55IG90aGVyIGxvYWRlciB3ZSBjYW4gZXh0ZW5kKSwKKyAgICAgKiAgdGhlIHBhdGggd2lsbCBiZSBhZGRlZCB0byB0aGUgbG9hZGVyLgorICAgICAqIEBwYXJhbSBwYXRoUmVmIGEgcmVmZXJlbmNlIHRvIGEgcGF0aC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHBhdGhSZWYpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGNsYXNzcGF0aCA9IChQYXRoKSBwYXRoUmVmLmdldFJlZmVyZW5jZWRPYmplY3QoZ2V0UHJvamVjdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjb21wb25lbnQgYmVpbmcgZGVmaW5lZAorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIGEgcGF0aCBmb3IgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IG5ldyBQYXRoKG51bGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBkbyB0aGUgY2xhc3Nsb2FkZXIgbWFuaXB1bGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBHdW1wIGZyaWVuZGx5IC0gZG9uJ3QgbWVzcyB3aXRoIHRoZSBjb3JlIGxvYWRlciBpZiBvbmx5IGNsYXNzcGF0aAorICAgICAgICAgICAgaWYgKCJvbmx5Ii5lcXVhbHMoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJidWlsZC5zeXNjbGFzc3BhdGgiKSkKKyAgICAgICAgICAgICAgICAmJiAobmFtZSA9PSBudWxsIHx8IFNZU1RFTV9MT0FERVJfUkVGLmVxdWFscyhuYW1lKSkpIHsKKyAgICAgICAgICAgICAgICBsb2coIkNoYW5naW5nIHRoZSBzeXN0ZW0gbG9hZGVyIGlzIGRpc2FibGVkICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYnkgYnVpbGQuc3lzY2xhc3NwYXRoPW9ubHkiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBsb2FkZXJOYW1lID0gKG5hbWUgPT0gbnVsbCkgPyBTWVNURU1fTE9BREVSX1JFRiA6IG5hbWU7CisKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKGxvYWRlck5hbWUpOworICAgICAgICAgICAgaWYgKHJlc2V0KSB7CisgICAgICAgICAgICAgICAgLy8gQXJlIGFueSBvdGhlciByZWZlcmVuY2VzIGhlbGQgPyBDYW4gd2UgJ2Nsb3NlJyB0aGUgbG9hZGVyCisgICAgICAgICAgICAgICAgLy8gc28gaXQgcmVtb3ZlcyB0aGUgbG9ja3Mgb24gamFycyA/CisgICAgICAgICAgICAgICAgb2JqID0gbnVsbDsgLy8gYSBuZXcgb25lIHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gWFhYIG1heWJlIHVzZSByZWZsZWN0aW9uIHRvIGFkZFBhdGhFbGVtZW50IChvdGhlciBwYXR0ZXJucyA/KQorICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsICYmICEob2JqIGluc3RhbmNlb2YgQW50Q2xhc3NMb2FkZXIpKSB7CisgICAgICAgICAgICAgICAgbG9nKCJSZWZlcmVuY2VkIG9iamVjdCBpcyBub3QgYW4gQW50Q2xhc3NMb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGFjbCA9IChBbnRDbGFzc0xvYWRlcikgb2JqOworCisgICAgICAgICAgICBpZiAoYWNsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYSBuZXcgY2xhc3MgbG9hZGVyCisgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKHBhcmVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBDbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYWxsb3cgdXNlciB0byByZXF1ZXN0IHRoZSBzeXN0ZW0gb3Igbm8gcGFyZW50CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvcmUgbG9hZGVyIG11c3QgYmUgcmV2ZXJzZQorICAgICAgICAgICAgICAgICAgICAvL3JldmVyc2U9dHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiU2V0dGluZyBwYXJlbnQgbG9hZGVyICIgKyBuYW1lICsgIiAiCisgICAgICAgICAgICAgICAgICAgICsgcGFyZW50ICsgIiAiICsgcGFyZW50Rmlyc3QsIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBwYXJhbSBpcyAicGFyZW50Rmlyc3QiCisgICAgICAgICAgICAgICAgYWNsID0gbmV3IEFudENsYXNzTG9hZGVyKChDbGFzc0xvYWRlcikgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSwgY2xhc3NwYXRoLCBwYXJlbnRGaXJzdCk7CisKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKGxvYWRlck5hbWUsIGFjbCk7CisKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBjb3JlIGxvYWRlciB0byBsb2FkIG9wdGlvbmFsIHRhc2tzCisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZGVsZWdhdGluZworICAgICAgICAgICAgICAgICAgICBhY2wuYWRkTG9hZGVyUGFja2FnZVJvb3QoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsIik7CisgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXRDb3JlTG9hZGVyKGFjbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gbGlzdCA9IGNsYXNzcGF0aC5saXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGxpc3RbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWNsLmFkZFBhdGhFbGVtZW50KGYuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJBZGRpbmcgdG8gY2xhc3MgbG9hZGVyICIgKyAgYWNsICsgIiAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBYWFggYWRkIGV4Y2VwdGlvbnMKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29tcG9uZW50ZGVmLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db21wb25lbnRkZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzUyNDYyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29tcG9uZW50ZGVmLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCisvKioKKyAqIEFkZHMgYSBjb21wZW5lbnQgZGVmaW5pdGlvbiB0byB0aGUgY3VycmVudCBwcm9qZWN0LgorICogdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LiBUd28gYXR0cmlidXRlcyBhcmUgbmVlZGVkLCB0aGUgbmFtZSB0aGF0IGlkZW50aWZpZXMKKyAqIHRoaXMgY29tcGVuZW50IHVuaXF1ZWx5LCBhbmQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgKAorICogaW5jbHVkaW5nIHRoZSBwYWNrYWdlcykgdGhhdAorICogaW1wbGVtZW50cyB0aGlzIGNvbXBvbmVudC48L3A+CisgKiBAc2luY2UgQW50IDEuOAorICogQGFudC50YXNrIGNhdGVnb3J5PSJpbnRlcm5hbCIKKyAqLworcHVibGljIGNsYXNzIENvbXBvbmVudGRlZiBleHRlbmRzIERlZmluZXIgeworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IENvbXBvbmVudERlZiBpbnN0YW5jZS4KKyAgICAgKiBTZXRzIHRoZSByZXN0cmljdCBhdHRyaWJ1dGUgdG8gdHJ1ZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBDb21wb25lbnRkZWYoKSB7CisgICAgICAgIHNldFJlc3RyaWN0KHRydWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmNhdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uY2F0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1NmE3MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmNhdC5qYXZhCkBAIC0wLDAgKzEsOTMzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMudXRpbC5DaGFpblJlYWRlckhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyQ2hhaW47CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5SZXN0cmljdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlN0cmluZ1Jlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuTm90OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuRXhpc3RzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuUmVzb3VyY2VTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbmNhdFJlc291cmNlSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZWFkZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlICdjb25jYXQnIHRhc2ssIHVzZWQgdG8gY29uY2F0ZW5hdGUgYSBzZXJpZXMKKyAqIG9mIGZpbGVzIGludG8gYSBzaW5nbGUgc3RyZWFtLiBUaGUgZGVzdGluYXRpb24gb2YgdGhpcyBzdHJlYW0gbWF5CisgKiBiZSB0aGUgc3lzdGVtIGNvbnNvbGUsIG9yIGEgZmlsZS4gVGhlIGZvbGxvd2luZyBpcyBhIHNhbXBsZQorICogaW52b2NhdGlvbjoKKyAqCisgKiA8cHJlPgorICogJmx0O2NvbmNhdCBkZXN0ZmlsZT0mcXVvdDske2J1aWxkLmRpcn0vaW5kZXgueG1sJnF1b3Q7CisgKiAgIGFwcGVuZD0mcXVvdDtmYWxzZSZxdW90OyZndDsKKyAqCisgKiAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3htbC5yb290LmRpcn0mcXVvdDsKKyAqICAgICBpbmNsdWRlcz0mcXVvdDsqLnhtbCZxdW90OyAvJmd0OworICoKKyAqICZsdDsvY29uY2F0Jmd0OworICogPC9wcmU+CisgKgorICovCitwdWJsaWMgY2xhc3MgQ29uY2F0IGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIFJlc291cmNlQ29sbGVjdGlvbiB7CisKKyAgICAvLyBUaGUgc2l6ZSBvZiBidWZmZXJzIHRvIGJlIHVzZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA4MTkyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVNlbGVjdG9yIEVYSVNUUyA9IG5ldyBFeGlzdHMoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVNlbGVjdG9yIE5PVF9FWElTVFMgPSBuZXcgTm90KEVYSVNUUyk7CisKKyAgICAvKioKKyAgICAgKiBzdWIgZWxlbWVudCBwb2ludHMgdG8gYSBmaWxlIG9yIGNvbnRhaW5zIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRleHRFbGVtZW50IGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nICAgdmFsdWUgPSAiIjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuICB0cmltTGVhZGluZyA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gIHRyaW0gPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuICBmaWx0ZXJpbmcgPSB0cnVlOworICAgICAgICBwcml2YXRlIFN0cmluZyAgIGVuY29kaW5nID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogd2hldGhlciB0byBmaWx0ZXIgdGhlIHRleHQgaW4gdGhpcyBlbGVtZW50CisgICAgICAgICAqIG9yIG5vdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZpbHRlcmluZyB0cnVlIGlmIHRoZSB0ZXh0IHNob3VsZCBiZSBmaWx0ZXJlZC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyaW5nKGJvb2xlYW4gZmlsdGVyaW5nKSB7CisgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9IGZpbHRlcmluZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiByZXR1cm4gdGhlIGZpbHRlcmluZyBhdHRyaWJ1dGUgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGdldEZpbHRlcmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXJpbmc7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGVuY29kaW5nIG9mIHRoZSB0ZXh0IGVsZW1lbnQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBuYW1lIG9mIHRoZSBjaGFyc2V0IHVzZWQgdG8gZW5jb2RlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBzZXQgdGhlIHRleHQgdXNpbmcgYSBmaWxlCisgICAgICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIHVzZQorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciBjYW5ub3QgYmUKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICByZWFkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIG5vbi1leGlzdGluZyBmaWxlcyBhcmUgbm90IGFsbG93ZWQKKyAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSAiICsgZmlsZSArICIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuY29kaW5nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlID0gRmlsZVV0aWxzLnNhZmVSZWFkRnVsbHkocmVhZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHJlYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogc2V0IHRoZSB0ZXh0IHVzaW5nIGlubGluZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHRleHQgdG8gcGxhY2UgaW5saW5lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSArPSBnZXRQcm9qZWN0KCkucmVwbGFjZVByb3BlcnRpZXModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHM6XlxzKjo6IG9uIGVhY2ggbGluZSBvZiBpbnB1dAorICAgICAgICAgKiBAcGFyYW0gc3RyaXAgaWYgdHJ1ZSBkbyB0aGUgdHJpbQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VHJpbUxlYWRpbmcoYm9vbGVhbiBzdHJpcCkgeworICAgICAgICAgICAgdGhpcy50cmltTGVhZGluZyA9IHN0cmlwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHdoZXRoZXIgdG8gY2FsbCB0ZXh0LnRyaW0oKQorICAgICAgICAgKiBAcGFyYW0gdHJpbSBpZiB0cnVlIHRyaW0gdGhlIHRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRyaW0oYm9vbGVhbiB0cmltKSB7CisgICAgICAgICAgICB0aGlzLnRyaW0gPSB0cmltOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRleHQsIGFmdGVyIHBvc3NpYmxlIHRyaW1taW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0cmltTGVhZGluZykgeworICAgICAgICAgICAgICAgIGNoYXJbXSBjdXJyZW50ID0gdmFsdWUudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoY3VycmVudC5sZW5ndGgpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RhcnRPZkxpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBjdXJyZW50Lmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gY3VycmVudFtwb3MrK107CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydE9mTGluZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mTGluZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkxpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlID0gYi50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyaW0pIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50ZXJmYWNlIFJlYWRlckZhY3RvcnkgeworICAgICAgICBSZWFkZXIgZ2V0UmVhZGVyKE9iamVjdCBvKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyByZWFkcyBmcm9tIGVhY2ggb2YgdGhlIHNvdXJjZSBmaWxlcyBpbiB0dXJuLgorICAgICAqIFRoZSBjb25jYXRlbnRhdGVkIHJlc3VsdCBjYW4gdGhlbiBiZSBmaWx0ZXJlZCBhcworICAgICAqIGEgc2luZ2xlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE11bHRpUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgICAgbGFzdFBvcyA9IDA7CisgICAgICAgIHByaXZhdGUgY2hhcltdIGxhc3RDaGFycyA9IG5ldyBjaGFyW2VvbFN0cmluZy5sZW5ndGgoKV07CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkQWRkU2VwYXJhdG9yID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgSXRlcmF0b3IgcmVhZGVyU291cmNlczsKKyAgICAgICAgcHJpdmF0ZSBSZWFkZXJGYWN0b3J5IGZhY3Rvcnk7CisKKyAgICAgICAgcHJpdmF0ZSBNdWx0aVJlYWRlcihJdGVyYXRvciByZWFkZXJTb3VyY2VzLCBSZWFkZXJGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgICAgICAgIHRoaXMucmVhZGVyU291cmNlcyA9IHJlYWRlclNvdXJjZXM7CisgICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCAmJiByZWFkZXJTb3VyY2VzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJlYWRlciA9IGZhY3RvcnkuZ2V0UmVhZGVyKHJlYWRlclNvdXJjZXMubmV4dCgpKTsKKyAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChsYXN0Q2hhcnMsIChjaGFyKSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbmV4dFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gdGhlIGN1cnJlbnQgcmVhZGVyIG9iamVjdC4gQWR2YW5jZQorICAgICAgICAgKiB0byB0aGUgbmV4dCBpZiB0aGUgcmVhZGVyIGlzIGZpbmlzaGVkLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgcmVhZCwgLTEgZm9yIEVPRiBvbiB0aGUgbGFzdCByZWFkZXIuCisgICAgICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gLSBwb3NzaWJseSB0aHJvd24gYnkgdGhlIHJlYWQgZm9yIGEgcmVhZGVyCisgICAgICAgICAqICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuZWVkQWRkU2VwYXJhdG9yKSB7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IGVvbFN0cmluZy5jaGFyQXQobGFzdFBvcysrKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFBvcyA+PSBlb2xTdHJpbmcubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5lZWRBZGRTZXBhcmF0b3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChnZXRSZWFkZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IGNoID0gZ2V0UmVhZGVyKCkucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBuZXh0UmVhZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpeExhc3RMaW5lKCkgJiYgaXNNaXNzaW5nRW5kT2ZMaW5lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRBZGRTZXBhcmF0b3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZGRMYXN0Q2hhcigoY2hhcikgY2gpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWQgaW50byB0aGUgYnVmZmVyIDxjb2RlPmNidWY8L2NvZGU+LgorICAgICAgICAgKiBAcGFyYW0gY2J1ZiBUaGUgYXJyYXkgdG8gYmUgcmVhZCBpbnRvLgorICAgICAgICAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQuCisgICAgICAgICAqIEBwYXJhbSBsZW4gVGhlIGxlbmd0aCB0byByZWFkLgorICAgICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIC0gcG9zc2libHkgdGhyb3duIGJ5IHRoZSByZWFkcyB0byB0aGUKKyAgICAgICAgICogICAgICAgICAgICByZWFkZXIgb2JqZWN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGludCBhbW91bnRSZWFkID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChnZXRSZWFkZXIoKSAhPSBudWxsIHx8IG5lZWRBZGRTZXBhcmF0b3IpIHsKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFkZFNlcGFyYXRvcikgeworICAgICAgICAgICAgICAgICAgICBjYnVmW29mZl0gPSBlb2xTdHJpbmcuY2hhckF0KGxhc3RQb3MrKyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UG9zID49IGVvbFN0cmluZy5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkQWRkU2VwYXJhdG9yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICAgICAgICAgIG9mZisrOworICAgICAgICAgICAgICAgICAgICBhbW91bnRSZWFkKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFtb3VudFJlYWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuUmVhZCA9IGdldFJlYWRlcigpLnJlYWQoY2J1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChuUmVhZCA9PSAtMSB8fCBuUmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRSZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRml4TGFzdExpbmUoKSAmJiBpc01pc3NpbmdFbmRPZkxpbmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEFkZFNlcGFyYXRvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpeExhc3RMaW5lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBuUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPiAoblJlYWQgLSBsYXN0Q2hhcnMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExhc3RDaGFyKGNidWZbb2ZmICsgaSAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsZW4gLT0gblJlYWQ7CisgICAgICAgICAgICAgICAgICAgIG9mZiArPSBuUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgYW1vdW50UmVhZCArPSBuUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW1vdW50UmVhZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhbW91bnRSZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBhbW91bnRSZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsb3NlIHRoZSBjdXJyZW50IHJlYWRlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogaWYgY2hlY2tpbmcgZm9yIGVuZCBvZiBsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICAgICAqIGFkZCBhIGNoYXJhY3RlciB0byB0aGUgbGFzdGNoYXJzIGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZExhc3RDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsYXN0Q2hhcnMubGVuZ3RoIC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICBsYXN0Q2hhcnNbaV0gPSBsYXN0Q2hhcnNbaSArIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdENoYXJzW2xhc3RDaGFycy5sZW5ndGggLSAxXSA9IGNoOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHJldHVybiB0cnVlIGlmIHRoZSBsYXN0Y2hhcnMgYnVmZmVyIGRvZXMKKyAgICAgICAgICogbm90IGNvbnRhaW4gdGhlIGxpbmVzZXBhcmF0b3IKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc01pc3NpbmdFbmRPZkxpbmUoKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhc3RDaGFycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0Q2hhcnNbaV0gIT0gZW9sU3RyaW5nLmNoYXJBdChpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNGaXhMYXN0TGluZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmaXhMYXN0TGluZSAmJiB0ZXh0QnVmZmVyID09IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENvbmNhdFJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UgeworICAgICAgICBwcml2YXRlIFJlc291cmNlQ29sbGVjdGlvbiBjOworCisgICAgICAgIHByaXZhdGUgQ29uY2F0UmVzb3VyY2UoUmVzb3VyY2VDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgICAgIHRoaXMuYyA9IGM7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChiaW5hcnkpIHsKKyAgICAgICAgICAgICAgICBDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtKGMpOworICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRNYW5hZ2luZ0NvbXBvbmVudCh0aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVhZGVyIHJlc291cmNlUmVhZGVyID0gZ2V0RmlsdGVyZWRSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBNdWx0aVJlYWRlcihjLml0ZXJhdG9yKCksIHJlc291cmNlUmVhZGVyRmFjdG9yeSkpOworICAgICAgICAgICAgUmVhZGVyIHJkcjsKKyAgICAgICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCAmJiBmb290ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJkciA9IHJlc291cmNlUmVhZGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVhZGVyQ291bnQgPSAxOworICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZWFkZXJDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm9vdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUmVhZGVyW10gcmVhZGVycyA9IG5ldyBSZWFkZXJbcmVhZGVyQ291bnRdOworICAgICAgICAgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZWFkZXJzW3Bvc10gPSBuZXcgU3RyaW5nUmVhZGVyKGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci5nZXRGaWx0ZXJpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyc1twb3NdID0gZ2V0RmlsdGVyZWRSZWFkZXIocmVhZGVyc1twb3NdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVhZGVyc1twb3MrK10gPSByZXNvdXJjZVJlYWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoZm9vdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyc1twb3NdID0gbmV3IFN0cmluZ1JlYWRlcihmb290ZXIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb290ZXIuZ2V0RmlsdGVyaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcnNbcG9zXSA9IGdldEZpbHRlcmVkUmVhZGVyKHJlYWRlcnNbcG9zXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmRyID0gbmV3IE11bHRpUmVhZGVyKEFycmF5cy5hc0xpc3QocmVhZGVycykuaXRlcmF0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5UmVhZGVyRmFjdG9yeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RW5jb2RpbmcgPT0gbnVsbCA/IG5ldyBSZWFkZXJJbnB1dFN0cmVhbShyZHIpCisgICAgICAgICAgICAgICAgICAgIDogbmV3IFJlYWRlcklucHV0U3RyZWFtKHJkciwgb3V0cHV0RW5jb2RpbmcpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiY29uY2F0ICgiICsgU3RyaW5nLnZhbHVlT2YoYykgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBdHRyaWJ1dGVzLgorCisgICAgLyoqCisgICAgICogVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBzdHJlYW0uIElmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgc3lzdGVtCisgICAgICogY29uc29sZSBpcyB1c2VkLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBkZXN0aW5hdGlvbkZpbGU7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgc3RyZWFtIHNob3VsZCBiZSBhcHBlbmRlZCBpZiB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgICAqIGV4aXN0cy4KKyAgICAgKiBEZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFwcGVuZDsKKworICAgIC8qKgorICAgICAqIFN0b3JlcyB0aGUgaW5wdXQgZmlsZSBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKworICAgIC8qKiBTdG9yZXMgdGhlIG91dHB1dCBmaWxlIGVuY29kaW5nLiAqLworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEVuY29kaW5nOworCisgICAgLyoqIFN0b3JlcyB0aGUgYmluYXJ5IGF0dHJpYnV0ZSAqLworICAgIHByaXZhdGUgYm9vbGVhbiBiaW5hcnk7CisKKyAgICAvLyBDaGlsZCBlbGVtZW50cy4KKworICAgIC8qKgorICAgICAqIFRoaXMgYnVmZmVyIHN0b3JlcyB0aGUgdGV4dCB3aXRoaW4gdGhlICdjb25jYXQnIGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgdGV4dEJ1ZmZlcjsKKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhIGNvbGxlY3Rpb24gb2YgZmlsZSBzZXRzIGFuZC9vciBmaWxlIGxpc3RzLCB1c2VkIHRvCisgICAgICogc2VsZWN0IG11bHRpcGxlIGZpbGVzIGZvciBjb25jYXRlbmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgUmVzb3VyY2VDb2xsZWN0aW9uIHJjOworCisgICAgLyoqIGZvciBmaWx0ZXJpbmcgdGhlIGNvbmNhdGVuYXRlZCAqLworICAgIHByaXZhdGUgVmVjdG9yIGZpbHRlckNoYWluczsKKyAgICAvKiogaWdub3JlIGRhdGVzIG9uIGlucHV0IGZpbGVzICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZvcmNlT3ZlcndyaXRlID0gdHJ1ZTsKKyAgICAvKiogU3RyaW5nIHRvIHBsYWNlIGF0IHRoZSBzdGFydCBvZiB0aGUgY29uY2F0ZW50ZWQgc3RyZWFtICovCisgICAgcHJpdmF0ZSBUZXh0RWxlbWVudCBmb290ZXI7CisgICAgLyoqIFN0cmluZyB0byBwbGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBjb25jYXRlbnRlZCBzdHJlYW0gKi8KKyAgICBwcml2YXRlIFRleHRFbGVtZW50IGhlYWRlcjsKKyAgICAvKiogYWRkIG1pc3NpbmcgbGluZS5zZXBhcmF0b3IgdG8gZmlsZXMgKiovCisgICAgcHJpdmF0ZSBib29sZWFuIGZpeExhc3RMaW5lID0gZmFsc2U7CisgICAgLyoqIGVuZG9mbGluZSBmb3IgZml4bGFzdCBsaW5lICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW9sU3RyaW5nOworICAgIC8qKiBvdXRwdXR3cml0ZXIgKi8KKyAgICBwcml2YXRlIFdyaXRlciBvdXRwdXRXcml0ZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBSZWFkZXJGYWN0b3J5IHJlc291cmNlUmVhZGVyRmFjdG9yeSAgPSBuZXcgUmVhZGVyRmFjdG9yeSgpIHsKKyAgICAgICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoT2JqZWN0IG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9ICgoUmVzb3VyY2UpIG8pLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKGVuY29kaW5nID09IG51bGwKKyAgICAgICAgICAgICAgICA/IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykKKyAgICAgICAgICAgICAgICA6IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgZW5jb2RpbmcpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIFJlYWRlckZhY3RvcnkgaWRlbnRpdHlSZWFkZXJGYWN0b3J5ID0gbmV3IFJlYWRlckZhY3RvcnkoKSB7CisgICAgICAgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gKFJlYWRlcikgbzsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ29uY2F0IHRhc2suCisgICAgICovCisgICAgcHVibGljIENvbmNhdCgpIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldCBzdGF0ZSB0byBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBhcHBlbmQgPSBmYWxzZTsKKyAgICAgICAgZm9yY2VPdmVyd3JpdGUgPSB0cnVlOworICAgICAgICBkZXN0aW5hdGlvbkZpbGUgPSBudWxsOworICAgICAgICBlbmNvZGluZyA9IG51bGw7CisgICAgICAgIG91dHB1dEVuY29kaW5nID0gbnVsbDsKKyAgICAgICAgZml4TGFzdExpbmUgPSBmYWxzZTsKKyAgICAgICAgZmlsdGVyQ2hhaW5zID0gbnVsbDsKKyAgICAgICAgZm9vdGVyID0gbnVsbDsKKyAgICAgICAgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgYmluYXJ5ID0gZmFsc2U7CisgICAgICAgIG91dHB1dFdyaXRlciA9IG51bGw7CisgICAgICAgIHRleHRCdWZmZXIgPSBudWxsOworICAgICAgICBlb2xTdHJpbmcgPSBTdHJpbmdVdGlscy5MSU5FX1NFUDsKKyAgICAgICAgcmMgPSBudWxsOworICAgIH0KKworICAgIC8vIEF0dHJpYnV0ZSBzZXR0ZXJzLgorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzdGluYXRpb24gZmlsZSwgb3IgdXNlcyB0aGUgY29uc29sZSBpZiBub3Qgc3BlY2lmaWVkLgorICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkZpbGUgdGhlIGRlc3RpbmF0aW9uIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZmlsZShGaWxlIGRlc3RpbmF0aW9uRmlsZSkgeworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uRmlsZSA9IGRlc3RpbmF0aW9uRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBiZWhhdmlvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGV4aXN0cy4gSWYgc2V0IHRvCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIHN0cmVhbSBkYXRhIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlCisgICAgICogZXhpc3RpbmcgZmlsZSwgb3RoZXJ3aXNlIHRoZSBleGlzdGluZyBmaWxlIHdpbGwgYmUKKyAgICAgKiBvdmVyd3JpdHRlbi4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSBhcHBlbmQgdG8gdGhlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwZW5kKGJvb2xlYW4gYXBwZW5kKSB7CisgICAgICAgIHRoaXMuYXBwZW5kID0gYXBwZW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNoYXJhY3RlciBlbmNvZGluZworICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2Rpbmcgb2YgdGhlIGlucHV0IHN0cmVhbSBhbmQgdW5sZXNzCisgICAgICogICAgICAgIG91dHB1dGVuY29kaW5nIGlzIHNldCwgdGhlIG91dHB1dHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICBpZiAob3V0cHV0RW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0cHV0RW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBmb3Igb3V0cHV0dGluZworICAgICAqIEBwYXJhbSBvdXRwdXRFbmNvZGluZyB0aGUgZW5jb2RpbmcgZm9yIHRoZSBvdXRwdXQgZmlsZQorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RW5jb2RpbmcoU3RyaW5nIG91dHB1dEVuY29kaW5nKSB7CisgICAgICAgIHRoaXMub3V0cHV0RW5jb2RpbmcgPSBvdXRwdXRFbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSBvdmVyd3JpdGUgZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZQorICAgICAqIEBwYXJhbSBmb3JjZSBpZiB0cnVlIGFsd2F5cyBvdmVyd3JpdGUsIG90aGVyd2lzZSBvbmx5IG92ZXJ3cml0ZQorICAgICAqICAgICAgICAgICAgICBpZiB0aGUgb3V0cHV0IGZpbGUgaXMgb2xkZXIgYW55IG9mIHRoZSBpbnB1dCBmaWxlcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlKGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgdGhpcy5mb3JjZU92ZXJ3cml0ZSA9IGZvcmNlOworICAgIH0KKworICAgIC8vIE5lc3RlZCBlbGVtZW50IGNyZWF0b3JzLgorCisgICAgLyoqCisgICAgICogUGF0aCBvZiBmaWxlcyB0byBjb25jYXRlbmF0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXRoIHVzZWQgZm9yIGNvbmNhdGVuYXRpbmcKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgICBwdWJsaWMgUGF0aCBjcmVhdGVQYXRoKCkgeworICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICBhZGQocGF0aCk7CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBvZiBmaWxlcyB0byBjb25jYXRlbmF0ZS4KKyAgICAgKiBAcGFyYW0gc2V0IHRoZSBzZXQgb2YgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7CisgICAgICAgIGFkZChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgZmlsZXMgdG8gY29uY2F0ZW5hdGUuCisgICAgICogQHBhcmFtIGxpc3QgdGhlIGxpc3Qgb2YgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlbGlzdChGaWxlTGlzdCBsaXN0KSB7CisgICAgICAgIGFkZChsaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gYXJiaXRyYXJ5IFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYyB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgaWYgKHJjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJjID0gYzsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShyYyBpbnN0YW5jZW9mIFJlc291cmNlcykpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyBuZXdSYyA9IG5ldyBSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIG5ld1JjLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIG5ld1JjLmFkZChyYyk7CisgICAgICAgICAgICByYyA9IG5ld1JjOworICAgICAgICB9CisgICAgICAgICgoUmVzb3VyY2VzKSByYykuYWRkKGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBGaWx0ZXJDaGFpbi4KKyAgICAgKiBAcGFyYW0gZmlsdGVyQ2hhaW4gYSBmaWx0ZXJjaGFpbiB0byBmaWx0ZXIgdGhlIGNvbmNhdGVuYXRlZCBpbnB1dAorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsdGVyQ2hhaW4oRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pIHsKKyAgICAgICAgaWYgKGZpbHRlckNoYWlucyA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWx0ZXJDaGFpbnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgZmlsdGVyQ2hhaW5zLmFkZEVsZW1lbnQoZmlsdGVyQ2hhaW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGFkZHMgdGV4dCB3aGljaCBhcHBlYXJzIGluIHRoZSAnY29uY2F0JyBlbGVtZW50LgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIGJlIGNvbmNhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaWYgKHRleHRCdWZmZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0byB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgdGV4dCBmcmFnbWVudCwgd2l0aAorICAgICAgICAgICAgLy8gdGhlIGhvcGVzIHRoYXQgaXQncyB0aGUgb25seSBvbmUuCisgICAgICAgICAgICB0ZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0ZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFwcGVuZCB0aGUgZnJhZ21lbnQgLS0gd2UgZGVmZXIgcHJvcGVydHkgcmVwbGFjZW1lbnQgdW50aWwKKyAgICAgICAgLy8gbGF0ZXIganVzdCBpbiBjYXNlIHdlIGdldCBhIHBhcnRpYWwgcHJvcGVydHkgaW4gYSBmcmFnbWVudC4KKyAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQodGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgaGVhZGVyIHRvIHRoZSBjb25jYXRlbmF0ZWQgb3V0cHV0CisgICAgICogQHBhcmFtIGhlYWRlclRvQWRkIHRoZSBoZWFkZXIKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihUZXh0RWxlbWVudCBoZWFkZXJUb0FkZCkgeworICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlclRvQWRkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZvb3RlciB0byB0aGUgY29uY2F0ZW5hdGVkIG91dHB1dAorICAgICAqIEBwYXJhbSBmb290ZXJUb0FkZCB0aGUgZm9vdGVyCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGb290ZXIoVGV4dEVsZW1lbnQgZm9vdGVyVG9BZGQpIHsKKyAgICAgICAgdGhpcy5mb290ZXIgPSBmb290ZXJUb0FkZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgbGluZS5zZXBhcmF0b3IgdG8gZmlsZXMgdGhhdCBkbyBub3QgZW5kCisgICAgICogd2l0aCBhIGxpbmUuc2VwYXJhdG9yLCBkZWZhdWx0IGZhbHNlLgorICAgICAqIEBwYXJhbSBmaXhMYXN0TGluZSBpZiB0cnVlIG1ha2Ugc3VyZSBlYWNoIGlucHV0IGZpbGUgaGFzCisgICAgICogICAgICAgICAgICAgICAgICAgIG5ldyBsaW5lIG9uIHRoZSBjb25jYXRlbmF0ZWQgc3RyZWFtCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaXhMYXN0TGluZShib29sZWFuIGZpeExhc3RMaW5lKSB7CisgICAgICAgIHRoaXMuZml4TGFzdExpbmUgPSBmaXhMYXN0TGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHRoZSBlbmQgb2YgbGluZSB0byBmaW5kIGFuZCB0byBhZGQgaWYKKyAgICAgKiBub3QgcHJlc2VudCBhdCBlbmQgb2YgZWFjaCBpbnB1dCBmaWxlLiBUaGlzIGF0dHJpYnV0ZQorICAgICAqIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBmaXhsYXN0bGluZS4KKyAgICAgKiBAcGFyYW0gY3JsZiB0aGUgdHlwZSBvZiBuZXcgbGluZSB0byBhZGQgLQorICAgICAqICAgICAgICAgICAgICBjciwgbWFjLCBsZiwgdW5peCwgY3JsZiwgb3IgZG9zCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFb2woRml4Q1JMRi5DckxmIGNybGYpIHsKKyAgICAgICAgU3RyaW5nIHMgPSBjcmxmLmdldFZhbHVlKCk7CisgICAgICAgIGlmIChzLmVxdWFscygiY3IiKSB8fCBzLmVxdWFscygibWFjIikpIHsKKyAgICAgICAgICAgIGVvbFN0cmluZyA9ICJcciI7CisgICAgICAgIH0gZWxzZSBpZiAocy5lcXVhbHMoImxmIikgfHwgcy5lcXVhbHMoInVuaXgiKSkgeworICAgICAgICAgICAgZW9sU3RyaW5nID0gIlxuIjsKKyAgICAgICAgfSBlbHNlIGlmIChzLmVxdWFscygiY3JsZiIpIHx8IHMuZXF1YWxzKCJkb3MiKSkgeworICAgICAgICAgICAgZW9sU3RyaW5nID0gIlxyXG4iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgd3JpdGVyLiBUaGlzIGlzIHRvIGFsbG93CisgICAgICogY29uY2F0IHRvIGJlIHVzZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gb3V0cHV0V3JpdGVyIHRoZSBvdXRwdXQgd3JpdGVyLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFdyaXRlciBvdXRwdXRXcml0ZXIpIHsKKyAgICAgICAgdGhpcy5vdXRwdXRXcml0ZXIgPSBvdXRwdXRXcml0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiaW5hcnkgYXR0cmlidXRlLiBJZiB0cnVlLCBjb25jYXQgd2lsbCBjb25jYXRlbmF0ZSB0aGUgZmlsZXMKKyAgICAgKiBieXRlIGZvciBieXRlLiBUaGlzIG1vZGUgZG9lcyBub3QgYWxsb3cgYW55IGZpbHRlcmluZyBvciBvdGhlcgorICAgICAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGlucHV0IHN0cmVhbXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKiBAcGFyYW0gYmluYXJ5IGlmIHRydWUsIGVuYWJsZSBiaW5hcnkgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCaW5hcnkoYm9vbGVhbiBiaW5hcnkpIHsKKyAgICAgICAgdGhpcy5iaW5hcnkgPSBiaW5hcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgY29uY2F0IHRhc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKGJpbmFyeSAmJiBkZXN0aW5hdGlvbkZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJkZXN0ZmlsZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIGJpbmFyeSBjb25jYXRlbmF0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIGMgPSBnZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKGlzVXBUb0RhdGUoYykpIHsKKyAgICAgICAgICAgIGxvZyhkZXN0aW5hdGlvbkZpbGUgKyAiIGlzIHVwLXRvLWRhdGUuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBPdXRwdXRTdHJlYW0gb3V0OworICAgICAgICBpZiAoZGVzdGluYXRpb25GaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIExvZyB1c2luZyBXQVJOIHNvIGl0IGRpc3BsYXlzIGluICdxdWlldCcgbW9kZS4KKyAgICAgICAgICAgIG91dCA9IG5ldyBMb2dPdXRwdXRTdHJlYW0odGhpcywgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyIG9mIGRlc3QgZmlsZSBleGlzdHMKKyAgICAgICAgICAgICAgICBGaWxlIHBhcmVudCA9IGRlc3RpbmF0aW9uRmlsZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Lm1rZGlycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB1c2UgZ2V0UGF0aCgpIGZvciBwcmUtSkRLIDEuNCBjb21wYXRpYmlsaXR5OgorICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uRmlsZS5nZXRQYXRoKCksIGFwcGVuZCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIG9wZW4gIgorICAgICAgICAgICAgICAgICAgICArIGRlc3RpbmF0aW9uRmlsZSArICIgZm9yIHdyaXRpbmciLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBJbnB1dFN0cmVhbSBjYXRTdHJlYW07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYXRTdHJlYW0gPSBuZXcgQ29uY2F0UmVzb3VyY2UoYykuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJlcnJvciBnZXR0aW5nIGNvbmNhdGVuYXRlZCByZXNvdXJjZSBjb250ZW50IiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVtcChjYXRTdHJlYW0sIG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yPFJlc291cmNlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBDb25jYXRSZXNvdXJjZShnZXRSZXNvdXJjZXMoKSkpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIDEuCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgUmVzb3VyY2VDb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4gZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7CisKKyAgICAgICAgLy8gdHJlYXQgZW1wdHkgbmVzdGVkIHRleHQgYXMgbm8gdGV4dAorICAgICAgICBzYW5pdGl6ZVRleHQoKTsKKworICAgICAgICAvLyBpZiBiaW5hcnkgY2hlY2sgaWYgaW5jb21wYXRpYmxlIGF0dHJpYnV0ZXMgYXJlIHVzZWQKKyAgICAgICAgaWYgKGJpbmFyeSkgeworICAgICAgICAgICAgaWYgKHRleHRCdWZmZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5lc3RlZCB0ZXh0IGlzIGluY29tcGF0aWJsZSB3aXRoIGJpbmFyeSBjb25jYXRlbmF0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCB8fCBvdXRwdXRFbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyBpbnB1dCBvciBvdXRwdXQgZW5jb2RpbmcgaXMgaW5jb21wYXRpYmxlIHdpdGggYmluYXJ5IgorICAgICAgICAgICAgICAgICAgICArICIgY29uY2F0ZW5hdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbHRlckNoYWlucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyBmaWx0ZXJzIGlzIGluY29tcGF0aWJsZSB3aXRoIGJpbmFyeSBjb25jYXRlbmF0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZml4TGFzdExpbmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIGZpeGxhc3RsaW5lIGlzIGluY29tcGF0aWJsZSB3aXRoIGJpbmFyeSBjb25jYXRlbmF0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwgfHwgZm9vdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJOZXN0ZWQgaGVhZGVyIG9yIGZvb3RlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBiaW5hcnkgY29uY2F0ZW5hdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXN0aW5hdGlvbkZpbGUgIT0gbnVsbCAmJiBvdXRwdXRXcml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDYW5ub3Qgc3BlY2lmeSBib3RoIGEgZGVzdGluYXRpb24gZmlsZSBhbmQgYW4gb3V0cHV0IHdyaXRlciIpOworICAgICAgICB9CisgICAgICAgIC8vIFNhbml0eSBjaGVjayBvdXIgaW5wdXRzLgorICAgICAgICBpZiAocmMgPT0gbnVsbCAmJiB0ZXh0QnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gY29uY2F0ZW5hdGUhCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkF0IGxlYXN0IG9uZSByZXNvdXJjZSBtdXN0IGJlIHByb3ZpZGVkLCBvciBzb21lIHRleHQuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJjICE9IG51bGwgJiYgdGV4dEJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiB1c2luZyByZXNvdXJjZXMsIGRpc2FsbG93IGlubGluZSB0ZXh0LiBUaGlzIGlzIHNpbWlsYXIgdG8KKyAgICAgICAgICAgIC8vIHVzaW5nIEdOVSAnY2F0JyB3aXRoIGZpbGUgYXJndW1lbnRzLS1zdGRpbiBpcyBzaW1wbHkgaWdub3JlZC4KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGluY2x1ZGUgaW5saW5lIHRleHQgd2hlbiB1c2luZyByZXNvdXJjZXMuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlc291cmNlcyB0byBjb25jYXRlbmF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc291cmNlQ29sbGVjdGlvbiBnZXRSZXNvdXJjZXMoKSB7CisgICAgICAgIGlmIChyYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1Jlc291cmNlKGdldFByb2plY3QoKSwgdGV4dEJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBSZXN0cmljdCBub2V4aXN0UmMgPSBuZXcgUmVzdHJpY3QoKTsKKyAgICAgICAgbm9leGlzdFJjLmFkZChOT1RfRVhJU1RTKTsKKyAgICAgICAgbm9leGlzdFJjLmFkZChyYyk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZXhpc3RSYy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGxvZyhpLm5leHQoKSArICIgZG9lcyBub3QgZXhpc3QuIiwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdGluYXRpb25GaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJjLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gKChGaWxlUmVzb3VyY2UpIG8pLmdldEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZJTEVfVVRJTFMuZmlsZU5hbWVFcXVhbHMoZiwgZGVzdGluYXRpb25GaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnB1dCBmaWxlIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZiArICJcIiBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IGZpbGUuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUmVzdHJpY3QgcmVzdWx0ID0gbmV3IFJlc3RyaWN0KCk7CisgICAgICAgIHJlc3VsdC5hZGQoRVhJU1RTKTsKKyAgICAgICAgcmVzdWx0LmFkZChyYyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVXBUb0RhdGUoUmVzb3VyY2VDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uRmlsZSA9PSBudWxsIHx8IGZvcmNlT3ZlcndyaXRlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFJlc291cmNlIHIgPSAoUmVzb3VyY2UpIGkubmV4dCgpOworICAgICAgICAgICAgaWYgKHIuZ2V0TGFzdE1vZGlmaWVkKCkgPT0gMEwKKyAgICAgICAgICAgICAgICAgfHwgci5nZXRMYXN0TW9kaWZpZWQoKSA+IGRlc3RpbmF0aW9uRmlsZS5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmVhdCBlbXB0eSBuZXN0ZWQgdGV4dCBhcyBubyB0ZXh0LgorICAgICAqCisgICAgICogPHA+RGVwZW5kaW5nIG9uIHRoZSBYTUwgcGFyc2VyLCBhZGRUZXh0IG1heSBoYXZlIGJlZW4gY2FsbGVkCisgICAgICogZm9yICZxdW90O2lnbm9yYWJsZSB3aGl0ZXNwYWNlJnF1b3Q7IGFzIHdlbGwuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzYW5pdGl6ZVRleHQoKSB7CisgICAgICAgIGlmICh0ZXh0QnVmZmVyICE9IG51bGwgJiYgIiIuZXF1YWxzKHRleHRCdWZmZXIudG9TdHJpbmcoKS50cmltKCkpKSB7CisgICAgICAgICAgICB0ZXh0QnVmZmVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZmVyIHRoZSBjb250ZW50cyBvZiA8Y29kZT5pbjwvY29kZT4gdG8gPGNvZGU+b3V0PC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gaW4gSW5wdXRTdHJlYW0KKyAgICAgKiBAcGFyYW0gb3V0IE91dHB1dFN0cmVhbQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwdW1wKElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgU3RyZWFtUHVtcGVyKGluLCBvdXQpKTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlZSkgeworICAgICAgICAgICAgICAgIC8vIEVtcHR5CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFJlYWRlciBnZXRGaWx0ZXJlZFJlYWRlcihSZWFkZXIgcikgeworICAgICAgICBpZiAoZmlsdGVyQ2hhaW5zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgICAgIENoYWluUmVhZGVySGVscGVyIGhlbHBlciA9IG5ldyBDaGFpblJlYWRlckhlbHBlcigpOworICAgICAgICBoZWxwZXIuc2V0QnVmZmVyU2l6ZShCVUZGRVJfU0laRSk7CisgICAgICAgIGhlbHBlci5zZXRQcmltYXJ5UmVhZGVyKHIpOworICAgICAgICBoZWxwZXIuc2V0RmlsdGVyQ2hhaW5zKGZpbHRlckNoYWlucyk7CisgICAgICAgIGhlbHBlci5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIC8vdXNlZCB0byBiZSBhIEJ1ZmZlcmVkUmVhZGVyIGhlcmUsIGJ1dCB3ZSBzaG91bGQgYmUgYnVmZmVyaW5nIGxvd2VyOgorICAgICAgICByZXR1cm4gaGVscGVyLmdldEFzc2VtYmxlZFJlYWRlcigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uZGl0aW9uVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uZGl0aW9uVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTA0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25kaXRpb25UYXNrLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Db25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbkJhc2U7CisKKy8qKgorICogVGFzayB0byBzZXQgYSBwcm9wZXJ0eSBjb25kaXRpb25hbGx5IHVzaW5nICZsdDt1cHRvZGF0ZSZndDssICZsdDthdmFpbGFibGUmZ3Q7LAorICogYW5kIG1hbnkgb3RoZXIgc3VwcG9ydGVkIGNvbmRpdGlvbnMuCisgKgorICogPHA+VGhpcyB0YXNrIHN1cHBvcnRzIGJvb2xlYW4gbG9naWMgYXMgd2VsbCBhcyBwbHVnZ2FibGUgY29uZGl0aW9ucworICogdG8gZGVjaWRlLCB3aGV0aGVyIGEgcHJvcGVydHkgc2hvdWxkIGJlIHNldC48L3A+CisgKgorICogPHA+VGhpcyB0YXNrIGRvZXMgbm90IGV4dGVuZCBUYXNrIHRvIHRha2UgYWR2YW50YWdlIG9mCisgKiBDb25kaXRpb25CYXNlLjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuNAorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iY29udHJvbCIKKyAqLworcHVibGljIGNsYXNzIENvbmRpdGlvblRhc2sgZXh0ZW5kcyBDb25kaXRpb25CYXNlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5ID0gbnVsbDsKKyAgICBwcml2YXRlIE9iamVjdCB2YWx1ZSA9ICJ0cnVlIjsKKyAgICBwcml2YXRlIE9iamVjdCBhbHRlcm5hdGl2ZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciwgbmFtZXMgdGhpcyB0YXNrICJjb25kaXRpb24iLgorICAgICAqLworICAgIHB1YmxpYyBDb25kaXRpb25UYXNrKCkgeworICAgICAgICBzdXBlcigiY29uZGl0aW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4gUmVxdWlyZWQuCisgICAgICogQHBhcmFtIHAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHNpbmNlIEFudCAxLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcCkgeworICAgICAgICBwcm9wZXJ0eSA9IHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgdG8gc2V0LCBpZiBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUuCisgICAgICogRGVmYXVsdHMgdG8gInRydWUiLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgKE9iamVjdCkgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHNpbmNlIEFudCAxLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHRvIHNldCwgaWYgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlLgorICAgICAqIERlZmF1bHRzIHRvICJ0cnVlIi4KKyAgICAgKiBAcGFyYW0gdiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHNpbmNlIEFudCAxLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdikgeworICAgICAgICBzZXRWYWx1ZSgoT2JqZWN0KSB2KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSB0byBzZXQsIGlmIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gZmFsc2UuCisgICAgICogSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIHByb3BlcnR5IHdpbGwgbm90IGJlIHNldC4KKyAgICAgKiBAcGFyYW0gYWx0IHRoZSBhbHRlcm5hdGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBzaW5jZSBBbnQgMS44CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWxzZShPYmplY3QgYWx0KSB7CisgICAgICAgIGFsdGVybmF0aXZlID0gYWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHRvIHNldCwgaWYgY29uZGl0aW9uIGV2YWx1YXRlcyB0byBmYWxzZS4KKyAgICAgKiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0LgorICAgICAqIEBwYXJhbSBlIHRoZSBhbHRlcm5hdGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbHNlKFN0cmluZyBlKSB7CisgICAgICAgIHNldEVsc2UoKE9iamVjdCkgZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VlIHdoZXRoZXIgb3VyIG5lc3RlZCBjb25kaXRpb24gaG9sZHMgYW5kIHNldCB0aGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb3VudENvbmRpdGlvbnMoKSA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgbm90IG5lc3QgbW9yZSB0aGFuIG9uZSBjb25kaXRpb24gaW50byA8IgorICAgICAgICAgICAgICAgICAgICArIGdldFRhc2tOYW1lKCkgKyAiPiIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudENvbmRpdGlvbnMoKSA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3QgbmVzdCBhIGNvbmRpdGlvbiBpbnRvIDwiICsgZ2V0VGFza05hbWUoKSArICI+Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHByb3BlcnR5IGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBDb25kaXRpb24gYyA9IChDb25kaXRpb24pIGdldENvbmRpdGlvbnMoKS5uZXh0RWxlbWVudCgpOworICAgICAgICBpZiAoYy5ldmFsKCkpIHsKKyAgICAgICAgICAgIGxvZygiQ29uZGl0aW9uIHRydWU7IHNldHRpbmcgIiArIHByb3BlcnR5ICsgIiB0byAiICsgdmFsdWUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKGdldFByb2plY3QoKSkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChhbHRlcm5hdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkNvbmRpdGlvbiBmYWxzZTsgc2V0dGluZyAiICsgcHJvcGVydHkgKyAiIHRvICIgKyBhbHRlcm5hdGl2ZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIoZ2V0UHJvamVjdCgpKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgYWx0ZXJuYXRpdmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJDb25kaXRpb24gZmFsc2U7IG5vdCBzZXR0aW5nICIgKyBwcm9wZXJ0eSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzA2YjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5LmphdmEKQEAgLTAsMCArMSwxMDI1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlckNoYWluOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldENvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5JZGVudGl0eU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlc291cmNlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Tb3VyY2VGaWxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZsYXRGaWxlTmFtZU1hcHBlcjsKKworLyoqCisgKiBDb3BpZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhIG5ldyBmaWxlCisgKiBvciBkaXJlY3RvcnkuICBGaWxlcyBhcmUgb25seSBjb3BpZWQgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIG5ld2VyCisgKiB0aGFuIHRoZSBkZXN0aW5hdGlvbiBmaWxlLCBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGRvZXMgbm90CisgKiBleGlzdC4gIEl0IGlzIHBvc3NpYmxlIHRvIGV4cGxpY2l0bHkgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzLjwvcD4KKyAqCisgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFybm91dCBLdWlwZXIncyBpbml0aWFsIGRlc2lnbgorICogZG9jdW1lbnQsIHRoZSBmb2xsb3dpbmcgbWFpbGluZyBsaXN0IGRpc2N1c3Npb25zLCBhbmQgdGhlCisgKiBjb3B5ZmlsZS9jb3B5ZGlyIHRhc2tzLjwvcD4KKyAqCisgKgorICogQHNpbmNlIEFudCAxLjIKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCisgKi8KK3B1YmxpYyBjbGFzcyBDb3B5IGV4dGVuZHMgVGFzayB7CisgICAgc3RhdGljIGZpbmFsIEZpbGUgTlVMTF9GSUxFX1BMQUNFSE9MREVSID0gbmV3IEZpbGUoIi9OVUxMX0ZJTEUiKTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQQVJBVE9SID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIEZpbGUgZmlsZSA9IG51bGw7ICAgICAvLyB0aGUgc291cmNlIGZpbGUKKyAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RmlsZSA9IG51bGw7IC8vIHRoZSBkZXN0aW5hdGlvbiBmaWxlCisgICAgcHJvdGVjdGVkIEZpbGUgZGVzdERpciA9IG51bGw7ICAvLyB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgcHJvdGVjdGVkIFZlY3RvciByY3MgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlTXVsdGlwbGVNYXBwaW5ncyA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIGZpbHRlcmluZyA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIHByZXNlcnZlTGFzdE1vZGlmaWVkID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZm9yY2VPdmVyd3JpdGUgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmbGF0dGVuID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGludCB2ZXJib3NpdHkgPSBQcm9qZWN0Lk1TR19WRVJCT1NFOworICAgIHByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVFbXB0eSA9IHRydWU7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbG9uZXJyb3IgPSB0cnVlOworCisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBmaWxlQ29weU1hcCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGRpckNvcHlNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBjb21wbGV0ZURpck1hcCA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIHByb3RlY3RlZCBNYXBwZXIgbWFwcGVyRWxlbWVudCA9IG51bGw7CisgICAgcHJvdGVjdGVkIEZpbGVVdGlscyBmaWxlVXRpbHM7CisgICAgLy9DaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorICAgIHByaXZhdGUgVmVjdG9yIGZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvciBmaWx0ZXJTZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgU3RyaW5nIGlucHV0RW5jb2RpbmcgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEVuY29kaW5nID0gbnVsbDsKKyAgICBwcml2YXRlIGxvbmcgZ3JhbnVsYXJpdHkgPSAwOworCisgICAgLyoqCisgICAgICogQ29weSB0YXNrIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBDb3B5KCkgeworICAgICAgICBmaWxlVXRpbHMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgICAgIGdyYW51bGFyaXR5ID0gZmlsZVV0aWxzLmdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgRmlsZVV0aWxzIGZvciB0aGlzIHRhc2suCisgICAgICogQHJldHVybiB0aGUgZmlsZXV0aWxzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZVV0aWxzIGdldEZpbGVVdGlscygpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVVdGlsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBzaW5nbGUgc291cmNlIGZpbGUgdG8gY29weS4KKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBjb3B5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBmaWxlLgorICAgICAqIEBwYXJhbSBkZXN0RmlsZSB0aGUgZmlsZSB0byBjb3B5IHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvZmlsZShGaWxlIGRlc3RGaWxlKSB7CisgICAgICAgIHRoaXMuZGVzdEZpbGUgPSBkZXN0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gZGVzdERpciB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvZGlyKEZpbGUgZGVzdERpcikgeworICAgICAgICB0aGlzLmRlc3REaXIgPSBkZXN0RGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIEZpbHRlckNoYWluLgorICAgICAqIEByZXR1cm4gYSBmaWx0ZXIgY2hhaW4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJDaGFpbiBjcmVhdGVGaWx0ZXJDaGFpbigpIHsKKyAgICAgICAgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4gPSBuZXcgRmlsdGVyQ2hhaW4oKTsKKyAgICAgICAgZmlsdGVyQ2hhaW5zLmFkZEVsZW1lbnQoZmlsdGVyQ2hhaW4pOworICAgICAgICByZXR1cm4gZmlsdGVyQ2hhaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZmlsdGVyc2V0LgorICAgICAqIEByZXR1cm4gYSBmaWx0ZXIgc2V0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyU2V0IGNyZWF0ZUZpbHRlclNldCgpIHsKKyAgICAgICAgRmlsdGVyU2V0IGZpbHRlclNldCA9IG5ldyBGaWx0ZXJTZXQoKTsKKyAgICAgICAgZmlsdGVyU2V0cy5hZGRFbGVtZW50KGZpbHRlclNldCk7CisgICAgICAgIHJldHVybiBmaWx0ZXJTZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZSB0aGUgY29waWVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWQgdGltZSBhcyB0aGUgb3JpZ2luYWwgZmlsZXMuCisgICAgICogQHBhcmFtIHByZXNlcnZlIGEgYm9vbGVhbiBzdHJpbmcuCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS41LnguCisgICAgICogICAgICAgICAgICAgc2V0UHJlc2VydmVMYXN0TW9kaWZpZWQoU3RyaW5nKSBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZAorICAgICAqICAgICAgICAgICAgIHJlcGxhY2VkIHdpdGggc2V0UHJlc2VydmVMYXN0TW9kaWZpZWQoYm9vbGVhbikgdG8KKyAgICAgKiAgICAgICAgICAgICBjb25zaXN0ZW50bHkgbGV0IHRoZSBJbnRyb3NwZWN0aW9uIG1lY2hhbmlzbSB3b3JrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZXNlcnZlTGFzdE1vZGlmaWVkKFN0cmluZyBwcmVzZXJ2ZSkgeworICAgICAgICBzZXRQcmVzZXJ2ZUxhc3RNb2RpZmllZChQcm9qZWN0LnRvQm9vbGVhbihwcmVzZXJ2ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmUgdGhlIGNvcGllZCBmaWxlcyB0aGUgc2FtZSBsYXN0IG1vZGlmaWVkIHRpbWUgYXMgdGhlIG9yaWdpbmFsIGZpbGVzLgorICAgICAqIEBwYXJhbSBwcmVzZXJ2ZSBpZiB0cnVlIHByZXNlcnZlIHRoZSBtb2RpZmllZCB0aW1lOyBkZWZhdWx0IGlzIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZXNlcnZlTGFzdE1vZGlmaWVkKGJvb2xlYW4gcHJlc2VydmUpIHsKKyAgICAgICAgcHJlc2VydmVMYXN0TW9kaWZpZWQgPSBwcmVzZXJ2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgd2hldGhlciB0byBnaXZlIHRoZSBjb3BpZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZCB0aW1lIGFzCisgICAgICogdGhlIG9yaWdpbmFsIGZpbGVzLgorICAgICAqIEByZXR1cm4gdGhlIHdoZXRoZXIgZGVzdGluYXRpb24gZmlsZXMgd2lsbCBpbmhlcml0IHRoZSBtb2RpZmljYXRpb24KKyAgICAgKiAgICAgICAgIHRpbWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlcy4KKyAgICAgKiBAc2luY2UgMS4zMiwgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFByZXNlcnZlTGFzdE1vZGlmaWVkKCkgeworICAgICAgICByZXR1cm4gcHJlc2VydmVMYXN0TW9kaWZpZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWx0ZXJzZXRzIGJlaW5nIGFwcGxpZWQgdG8gdGhpcyBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgdmVjdG9yIG9mIEZpbHRlclNldCBvYmplY3RzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZ2V0RmlsdGVyU2V0cygpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlclNldHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWx0ZXJjaGFpbnMgYmVpbmcgYXBwbGllZCB0byB0aGlzIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB2ZWN0b3Igb2YgRmlsdGVyQ2hhaW4gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGdldEZpbHRlckNoYWlucygpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlckNoYWluczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgZmlsdGVyaW5nIG1vZGUuCisgICAgICogQHBhcmFtIGZpbHRlcmluZyBpZiB0cnVlIGVuYWJsZSBmaWx0ZXJpbmc7IGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyaW5nKGJvb2xlYW4gZmlsdGVyaW5nKSB7CisgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gZmlsdGVyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBvdmVyd3JpdGUgbW9kZSByZWdhcmRpbmcgZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZShzKS4KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIGlmIHRydWUgZm9yY2Ugb3ZlcndyaXRpbmcgb2YgZGVzdGluYXRpb24gZmlsZShzKQorICAgICAqICAgICAgICAgICAgICAgICAgZXZlbiBpZiB0aGUgZGVzdGluYXRpb24gZmlsZShzKSBhcmUgeW91bmdlciB0aGFuCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZS4gRGVmYXVsdCBpcyBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoYm9vbGVhbiBvdmVyd3JpdGUpIHsKKyAgICAgICAgdGhpcy5mb3JjZU92ZXJ3cml0ZSA9IG92ZXJ3cml0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBmaWxlcyBjb3BpZWQgZnJvbSBkaXJlY3RvcnkgdHJlZXMgd2lsbCBiZSAiZmxhdHRlbmVkIgorICAgICAqIGludG8gYSBzaW5nbGUgZGlyZWN0b3J5LiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIGZpbGVzIHdpdGgKKyAgICAgKiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRyZWUsIG9ubHkgdGhlIGZpcnN0CisgICAgICogZmlsZSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSAiZmxhdHRlbmVkIiBkaXJlY3RvcnksIHVubGVzcworICAgICAqIHRoZSBmb3JjZW92ZXJ3cml0ZSBhdHRyaWJ1dGUgaXMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gZmxhdHRlbiBpZiB0cnVlIGZsYXR0ZW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gRGVmYXVsdAorICAgICAqICAgICAgICAgICAgICAgIGlzIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZsYXR0ZW4oYm9vbGVhbiBmbGF0dGVuKSB7CisgICAgICAgIHRoaXMuZmxhdHRlbiA9IGZsYXR0ZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHZlcmJvc2UgbW9kZS4gVXNlZCB0byBmb3JjZSBsaXN0aW5nIG9mIGFsbCBuYW1lcyBvZiBjb3BpZWQgZmlsZXMuCisgICAgICogQHBhcmFtIHZlcmJvc2Ugd2hldGhlciB0byBvdXRwdXQgdGhlIG5hbWVzIG9mIGNvcGllZCBmaWxlcy4KKyAgICAgKiAgICAgICAgICAgICAgICBEZWZhdWx0IGlzIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7CisgICAgICAgIHRoaXMudmVyYm9zaXR5ID0gdmVyYm9zZSA/IFByb2plY3QuTVNHX0lORk8gOiBQcm9qZWN0Lk1TR19WRVJCT1NFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGNvcHkgZW1wdHkgZGlyZWN0b3JpZXMuCisgICAgICogQHBhcmFtIGluY2x1ZGVFbXB0eSBpZiB0cnVlIGNvcHkgZW1wdHkgZGlyZWN0b3JpZXMuIERlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlRW1wdHlEaXJzKGJvb2xlYW4gaW5jbHVkZUVtcHR5KSB7CisgICAgICAgIHRoaXMuaW5jbHVkZUVtcHR5ID0gaW5jbHVkZUVtcHR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBtZXRob2Qgb2YgaGFuZGxpbmcgbWFwcGVycyB0aGF0IHJldHVybiBtdWx0aXBsZQorICAgICAqIG1hcHBpbmdzIGZvciBhIGdpdmVuIHNvdXJjZSBwYXRoLgorICAgICAqIEBwYXJhbSBlbmFibGVNdWx0aXBsZU1hcHBpbmdzIElmIHRydWUgdGhlIHRhc2sgd2lsbAorICAgICAqICAgICAgICBjb3B5IHRvIGFsbCB0aGUgbWFwcGluZ3MgZm9yIGEgZ2l2ZW4gc291cmNlIHBhdGgsIGlmCisgICAgICogICAgICAgIGZhbHNlLCBvbmx5IHRoZSBmaXJzdCBmaWxlIG9yIGRpcmVjdG9yeSBpcworICAgICAqICAgICAgICBwcm9jZXNzZWQuCisgICAgICogICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgc2V0dGluZyBpcyBmYWxzZSB0byBwcm92aWRlIGJhY2t3YXJkCisgICAgICogICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyIHJlbGVhc2VzLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlTXVsdGlwbGVNYXBwaW5ncyhib29sZWFuIGVuYWJsZU11bHRpcGxlTWFwcGluZ3MpIHsKKyAgICAgICAgdGhpcy5lbmFibGVNdWx0aXBsZU1hcHBpbmdzID0gZW5hYmxlTXVsdGlwbGVNYXBwaW5nczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgd2hldGhlciBtdWx0aXBsZSBtYXBwaW5nIGlzIGVuYWJsZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIG11bHRpcGxlIG1hcHBpbmcgaXMgZW5hYmxlZDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlTXVsdGlwbGVNYXBwaW5nKCkgeworICAgICAgICByZXR1cm4gZW5hYmxlTXVsdGlwbGVNYXBwaW5nczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBmYWlsIHdoZW4gZXJyb3JzIGFyZSBlbmNvdW50ZXJlZC4gSWYgZmFsc2UsIG5vdGUgZXJyb3JzCisgICAgICogdG8gdGhlIG91dHB1dCBidXQga2VlcCBnb2luZy4gRGVmYXVsdCBpcyB0cnVlLgorICAgICAqIEBwYXJhbSBmYWlsb25lcnJvciB0cnVlIG9yIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgdGhpcy5mYWlsb25lcnJvciA9IGZhaWxvbmVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNldCBvZiBmaWxlcyB0byBjb3B5LgorICAgICAqIEBwYXJhbSBzZXQgYSBzZXQgb2YgZmlsZXMgdG8gY29weS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7CisgICAgICAgIGFkZChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGNvbGxlY3Rpb24gb2YgZmlsZXMgdG8gY29weS4KKyAgICAgKiBAcGFyYW0gcmVzIGEgcmVzb3VyY2UgY29sbGVjdGlvbiB0byBjb3B5LgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKFJlc291cmNlQ29sbGVjdGlvbiByZXMpIHsKKyAgICAgICAgcmNzLmFkZChyZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZSB0aGUgbWFwcGVyIHRvIG1hcCBzb3VyY2UgdG8gZGVzdGluYXRpb24gZmlsZXMuCisgICAgICogQHJldHVybiBhIG1hcHBlciB0byBiZSBjb25maWd1cmVkLgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgbW9yZSB0aGFuIG9uZSBtYXBwZXIgaXMgZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwcGVyIGNyZWF0ZU1hcHBlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtYXBwZXJFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgbWFwcGVyRWxlbWVudCA9IG5ldyBNYXBwZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgcmV0dXJuIG1hcHBlckVsZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmVzdGVkIGZpbGVuYW1lbWFwcGVyLgorICAgICAqIEBwYXJhbSBmaWxlTmFtZU1hcHBlciB0aGUgbWFwcGVyIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyKSB7CisgICAgICAgIGNyZWF0ZU1hcHBlcigpLmFkZChmaWxlTmFtZU1hcHBlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICogQHNpbmNlIDEuMzIsIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5pbnB1dEVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgIGlmIChvdXRwdXRFbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRwdXRFbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4zMiwgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBpbnB1dEVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciBvdXRwdXQgZmlsZXMuCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBvdXRwdXQgY2hhcmFjdGVyIGVuY29kaW5nLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHRoaXMub3V0cHV0RW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBmb3Igb3V0cHV0IGZpbGVzLgorICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBlbmNvZGluZyBmb3Igb3V0cHV0IGZpbGVzLAorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRFbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgbGVld2F5IHRvIGdpdmUgYmVmb3JlIGRlY2lkaW5nIGEKKyAgICAgKiB0YXJnZXQgaXMgb3V0IG9mIGRhdGUuCisgICAgICoKKyAgICAgKiA8cD5EZWZhdWx0IGlzIDEgc2Vjb25kLCBvciAyIHNlY29uZHMgb24gRE9TIHN5c3RlbXMuPC9wPgorICAgICAqIEBwYXJhbSBncmFudWxhcml0eSB0aGUgZ3JhbnVsYXJpdHkgdXNlZCB0byBkZWNpZGUgaWYgYSB0YXJnZXQgaXMgb3V0IG9mCisgICAgICogICAgICAgICAgICAgICAgICAgIGRhdGUuCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdyYW51bGFyaXR5KGxvbmcgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgdGhpcy5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGNvcHkgb3BlcmF0aW9uLgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBGaWxlIHNhdmVkRmlsZSA9IGZpbGU7IC8vIG1heSBiZSBhbHRlcmVkIGluIHZhbGlkYXRlQXR0cmlidXRlcworICAgICAgICBGaWxlIHNhdmVkRGVzdEZpbGUgPSBkZXN0RmlsZTsKKyAgICAgICAgRmlsZSBzYXZlZERlc3REaXIgPSBkZXN0RGlyOworICAgICAgICBSZXNvdXJjZUNvbGxlY3Rpb24gc2F2ZWRSYyA9IG51bGw7CisgICAgICAgIGlmIChmaWxlID09IG51bGwgJiYgZGVzdEZpbGUgIT0gbnVsbCAmJiByY3Muc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIC8vIHdpbGwgYmUgcmVtb3ZlZCBpbiB2YWxpZGF0ZUF0dHJpYnV0ZXMKKyAgICAgICAgICAgIHNhdmVkUmMgPSAoUmVzb3VyY2VDb2xsZWN0aW9uKSByY3MuZWxlbWVudEF0KDApOworICAgICAgICB9CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFuIGlsbGVnYWwgc2V0IG9mIG9wdGlvbnMKKyAgICAgICAgdmFsaWRhdGVBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgc2luZ2xlIGZpbGUKKyAgICAgICAgICAgIGNvcHlTaW5nbGVGaWxlKCk7CisKKyAgICAgICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9ucworCisgICAgICAgICAgICAvKiBmb3IgaGlzdG9yaWNhbCBhbmQgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSBoYXZlIHRvIGRvCisgICAgICAgICAgICAgICB0aGluZ3MgaW4gYSByYXRoZXIgY29tcGxleCB3YXkuCisKKyAgICAgICAgICAgICAgICgxKSBNb3ZlIGlzIG9wdGltaXplZCB0byBtb3ZlIGRpcmVjdG9yaWVzIGlmIGEgZmlsZXNldAorICAgICAgICAgICAgICAgaGFzIGJlZW4gaW5jbHVkZWQgY29tcGxldGVseSwgdGhlcmVmb3JlIEZpbGVTZXRzIG5lZWQgYQorICAgICAgICAgICAgICAgc3BlY2lhbCB0cmVhdG1lbnQuICBUaGlzIGlzIGFsc28gcmVxdWlyZWQgdG8gc3VwcG9ydAorICAgICAgICAgICAgICAgdGhlIGZhaWxPbkVycm9yIHNlbWFudGljZSAoc2tpcCBmaWxlc2V0cyB3aXRoIGJyb2tlbgorICAgICAgICAgICAgICAgYmFzZWRpciBidXQgaGFuZGxlIHRoZSByZW1haW5pbmcgY29sbGVjdGlvbnMpLgorCisgICAgICAgICAgICAgICAoMikgV2UgY2FycnkgYXJvdW5kIGEgZmV3IHByb3RlY3RlZCBtZXRob2RzIHRoYXQgd29yaworICAgICAgICAgICAgICAgb24gYmFzZWRpcnMgYW5kIGFycmF5cyBvZiBuYW1lcy4gIFRvIG9wdGltaXplIHN0dWZmLCBhbGwKKyAgICAgICAgICAgICAgIHJlc291cmNlcyB3aXRoIHRoZSBzYW1lIGJhc2VkaXIgZ2V0IGNvbGxlY3RlZCBpbgorICAgICAgICAgICAgICAgc2VwYXJhdGUgbGlzdHMgYW5kIHRoZW4gZWFjaCBsaXN0IGlzIGhhbmRsZWQgaW4gb25lIGdvLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgSGFzaE1hcCBmaWxlc0J5QmFzZWRpciA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBIYXNoTWFwIGRpcnNCeUJhc2VkaXIgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgSGFzaFNldCBiYXNlRGlycyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBBcnJheUxpc3Qgbm9uRmlsZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmNzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIHJjID0gKFJlc291cmNlQ29sbGVjdGlvbikgcmNzLmVsZW1lbnRBdChpKTsKKworICAgICAgICAgICAgICAgIC8vIFN0ZXAgKDEpIC0gYmV3YXJlIG9mIHRoZSBaaXBGaWxlU2V0CisgICAgICAgICAgICAgICAgaWYgKHJjIGluc3RhbmNlb2YgRmlsZVNldCAmJiByYy5pc0ZpbGVzeXN0ZW1Pbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSByYzsKKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWdldE1lc3NhZ2UoZSkuZW5kc1dpdGgoIiBub3QgZm91bmQuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIldhcm5pbmc6ICIgKyBnZXRNZXNzYWdlKGUpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZnJvbURpciA9IGZzLmdldERpcihnZXRQcm9qZWN0KCkpOworCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNyY0ZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzcmNEaXJzID0gZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZsYXR0ZW4gJiYgbWFwcGVyRWxlbWVudCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkcy5pc0V2ZXJ5dGhpbmdJbmNsdWRlZCgpICYmICFmcy5oYXNQYXR0ZXJucygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZURpck1hcC5wdXQoZnJvbURpciwgZGVzdERpcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkKGZyb21EaXIsIHNyY0ZpbGVzLCBmaWxlc0J5QmFzZWRpcik7CisgICAgICAgICAgICAgICAgICAgIGFkZChmcm9tRGlyLCBzcmNEaXJzLCBkaXJzQnlCYXNlZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZURpcnMuYWRkKGZyb21EaXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vdCBhIGZpbGVzZXQgb3IgY29udGFpbnMgbm9uLWZpbGUgcmVzb3VyY2VzCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyYy5pc0ZpbGVzeXN0ZW1Pbmx5KCkgJiYgIXN1cHBvcnRzTm9uRmlsZVJlc291cmNlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmx5IEZpbGVTeXN0ZW0gcmVzb3VyY2VzIGFyZSBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciByZXNvdXJjZXMgPSByYy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzb3VyY2VzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UgciA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghci5pc0V4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgYmFzZURpciA9IE5VTExfRklMRV9QTEFDRUhPTERFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEZpbGVSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVSZXNvdXJjZSBmciA9IChGaWxlUmVzb3VyY2UpIHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpciA9IGdldEtleUZpbGUoZnIuZ2V0QmFzZURpcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnIuZ2V0QmFzZURpcigpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZyLmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHlpbmcgb2YgZGlycyBpcyB0cml2aWFsIGFuZCBjYW4gYmUgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vbi1maWxlIHJlc291cmNlcyBhcyB3ZWxsIGFzIGZvciByZWFsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmlzRGlyZWN0b3J5KCkgfHwgciBpbnN0YW5jZW9mIEZpbGVSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZChiYXNlRGlyLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmlzRGlyZWN0b3J5KCkgPyBkaXJzQnlCYXNlZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpbGVzQnlCYXNlZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRGlycy5hZGQoYmFzZURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhIG5vdC1kaXJlY3RvcnkgZmlsZSByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uRmlsZVJlc291cmNlcy5hZGQocik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZXJhdGVPdmVyQmFzZURpcnMoYmFzZURpcnMsIGRpcnNCeUJhc2VkaXIsIGZpbGVzQnlCYXNlZGlyKTsKKworICAgICAgICAgICAgLy8gZG8gYWxsIHRoZSBjb3B5IG9wZXJhdGlvbnMgbm93Li4uCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvRmlsZU9wZXJhdGlvbnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogIiArIGdldE1lc3NhZ2UoZSksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChub25GaWxlUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVtdIG5vbkZpbGVzID0KKyAgICAgICAgICAgICAgICAgICAgKFJlc291cmNlW10pIG5vbkZpbGVSZXNvdXJjZXMudG9BcnJheShuZXcgUmVzb3VyY2Vbbm9uRmlsZVJlc291cmNlcy5zaXplKCldKTsKKyAgICAgICAgICAgICAgICAvLyByZXN0cmljdCB0byBvdXQtb2YtZGF0ZSByZXNvdXJjZXMKKyAgICAgICAgICAgICAgICBNYXAgbWFwID0gc2Nhbihub25GaWxlcywgZGVzdERpcik7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZG9SZXNvdXJjZU9wZXJhdGlvbnMobWFwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogIiArIGdldE1lc3NhZ2UoZSksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgYWdhaW4sIHNvIHRoaXMgaW5zdGFuY2UgY2FuIGJlIHVzZWQgYSBzZWNvbmQKKyAgICAgICAgICAgIC8vIHRpbWUKKyAgICAgICAgICAgIGZpbGUgPSBzYXZlZEZpbGU7CisgICAgICAgICAgICBkZXN0RmlsZSA9IHNhdmVkRGVzdEZpbGU7CisgICAgICAgICAgICBkZXN0RGlyID0gc2F2ZWREZXN0RGlyOworICAgICAgICAgICAgaWYgKHNhdmVkUmMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJjcy5pbnNlcnRFbGVtZW50QXQoc2F2ZWRSYywgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWxlQ29weU1hcC5jbGVhcigpOworICAgICAgICAgICAgZGlyQ29weU1hcC5jbGVhcigpOworICAgICAgICAgICAgY29tcGxldGVEaXJNYXAuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiogIHByb3RlY3RlZCBhbmQgcHJpdmF0ZSBtZXRob2RzCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIHByaXZhdGUgdm9pZCBjb3B5U2luZ2xlRmlsZSgpIHsKKyAgICAgICAgLy8gZGVhbCB3aXRoIHRoZSBzaW5nbGUgZmlsZQorICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChkZXN0RmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgZmlsZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm9yY2VPdmVyd3JpdGUgfHwgIWRlc3RGaWxlLmV4aXN0cygpCisgICAgICAgICAgICAgICAgICAgIHx8IChmaWxlLmxhc3RNb2RpZmllZCgpIC0gZ3JhbnVsYXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgID4gZGVzdEZpbGUubGFzdE1vZGlmaWVkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVDb3B5TWFwLnB1dChmaWxlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtkZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhmaWxlICsgIiBvbWl0dGVkIGFzICIgKyBkZXN0RmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIHVwIHRvIGRhdGUuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiB0byBjb3B5LiI7CisgICAgICAgICAgICAgICAgaWYgKCFmYWlsb25lcnJvcikgeworICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBpdGVyYXRlT3ZlckJhc2VEaXJzKAorICAgICAgICBIYXNoU2V0IGJhc2VEaXJzLCBIYXNoTWFwIGRpcnNCeUJhc2VkaXIsIEhhc2hNYXAgZmlsZXNCeUJhc2VkaXIpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGJhc2VEaXJzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgRmlsZSBmID0gKEZpbGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgTGlzdCBmaWxlcyA9IChMaXN0KSBmaWxlc0J5QmFzZWRpci5nZXQoZik7CisgICAgICAgICAgICBMaXN0IGRpcnMgPSAoTGlzdCkgZGlyc0J5QmFzZWRpci5nZXQoZik7CisKKyAgICAgICAgICAgIFN0cmluZ1tdIHNyY0ZpbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIGlmIChmaWxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3JjRmlsZXMgPSAoU3RyaW5nW10pIGZpbGVzLnRvQXJyYXkoc3JjRmlsZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gc3JjRGlycyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgICAgICBpZiAoZGlycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3JjRGlycyA9IChTdHJpbmdbXSkgZGlycy50b0FycmF5KHNyY0RpcnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbihmID09IE5VTExfRklMRV9QTEFDRUhPTERFUiA/IG51bGwgOiBmLCBkZXN0RGlyLCBzcmNGaWxlcywKKyAgICAgICAgICAgICAgICAgc3JjRGlycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgd2UgaGF2ZSBhIGNvbnNpc3RlbnQgYW5kIGxlZ2FsIHNldCBvZiBhdHRyaWJ1dGVzLCBhbmQgc2V0CisgICAgICogYW55IGludGVybmFsIGZsYWdzIG5lY2Vzc2FyeSBiYXNlZCBvbiBkaWZmZXJlbnQgY29tYmluYXRpb25zCisgICAgICogb2YgYXR0cmlidXRlcy4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsZSA9PSBudWxsICYmIHJjcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UtLWEgZmlsZSBvciBhIHJlc291cmNlIGNvbGxlY3Rpb24uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3RGaWxlICE9IG51bGwgJiYgZGVzdERpciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk9ubHkgb25lIG9mIHRvZmlsZSBhbmQgdG9kaXIgbWF5IGJlIHNldC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdEZpbGUgPT0gbnVsbCAmJiBkZXN0RGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25lIG9mIHRvZmlsZSBvciB0b2RpciBtdXN0IGJlIHNldC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVc2UgYSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIGNvcHkgZGlyZWN0b3JpZXMuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3RGaWxlICE9IG51bGwgJiYgcmNzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChyY3Muc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjb25jYXRlbmF0ZSBtdWx0aXBsZSBmaWxlcyBpbnRvIGEgc2luZ2xlIGZpbGUuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFJlc291cmNlQ29sbGVjdGlvbiByYyA9IChSZXNvdXJjZUNvbGxlY3Rpb24pIHJjcy5lbGVtZW50QXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKCFyYy5pc0ZpbGVzeXN0ZW1Pbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IEZpbGVTeXN0ZW0gcmVzb3VyY2VzIGFyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzdXBwb3J0ZWQgd2hlbiBjb25jYXRlbmF0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZpbGVzLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBmcm9tIGRpcmVjdG9yeSB0byBmaWxlLiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZVJlc291cmNlIHIgPSAoRmlsZVJlc291cmNlKSByYy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHIuZ2V0RmlsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmNzLnJlbW92ZUVsZW1lbnRBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbmNhdGVuYXRlIG11bHRpcGxlIGZpbGVzIGludG8gYSBzaW5nbGUgZmlsZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY29uY2F0ZW5hdGUgbXVsdGlwbGUgZmlsZXMgaW50byBhIHNpbmdsZSBmaWxlLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdERpciA9IGRlc3RGaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHNvdXJjZSBmaWxlcyB0byBkZXN0aW5hdGlvbiBmaWxlcyB0byBzZWUgaWYgdGhleSBzaG91bGQgYmUKKyAgICAgKiBjb3BpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbURpciAgVGhlIHNvdXJjZSBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIHRvRGlyICAgIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGZpbGVzICAgIEEgbGlzdCBvZiBmaWxlcyB0byBjb3B5LgorICAgICAqIEBwYXJhbSBkaXJzICAgICBBIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gY29weS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpciwgU3RyaW5nW10gZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBkaXJzKSB7CisgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IGdldE1hcHBlcigpOworICAgICAgICBidWlsZE1hcChmcm9tRGlyLCB0b0RpciwgZmlsZXMsIG1hcHBlciwgZmlsZUNvcHlNYXApOworCisgICAgICAgIGlmIChpbmNsdWRlRW1wdHkpIHsKKyAgICAgICAgICAgIGJ1aWxkTWFwKGZyb21EaXIsIHRvRGlyLCBkaXJzLCBtYXBwZXIsIGRpckNvcHlNYXApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgc291cmNlIHJlc291cmNlcyB0byBkZXN0aW5hdGlvbiBmaWxlcyB0byBzZWUgaWYgdGhleQorICAgICAqIHNob3VsZCBiZSBjb3BpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbVJlc291cmNlcyAgVGhlIHNvdXJjZSByZXNvdXJjZXMuCisgICAgICogQHBhcmFtIHRvRGlyICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgTWFwIHdpdGggdGhlIG91dC1vZi1kYXRlIHJlc291cmNlcyBhcyBrZXlzIGFuZCBhbgorICAgICAqIGFycmF5IG9mIHRhcmdldCBmaWxlIG5hbWVzIGFzIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcCBzY2FuKFJlc291cmNlW10gZnJvbVJlc291cmNlcywgRmlsZSB0b0RpcikgeworICAgICAgICByZXR1cm4gYnVpbGRNYXAoZnJvbVJlc291cmNlcywgdG9EaXIsIGdldE1hcHBlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdG8gYSBtYXAgb2YgZmlsZXMvZGlyZWN0b3JpZXMgdG8gY29weS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9tRGlyIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSB0b0RpciAgIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIG5hbWVzICAgYSBsaXN0IG9mIGZpbGVuYW1lcy4KKyAgICAgKiBAcGFyYW0gbWFwcGVyICBhIDxjb2RlPkZpbGVOYW1lTWFwcGVyPC9jb2RlPiB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbWFwICAgICBhIG1hcCBvZiBzb3VyY2UgZmlsZSB0byBhcnJheSBvZiBkZXN0aW5hdGlvbiBmaWxlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBidWlsZE1hcChGaWxlIGZyb21EaXIsIEZpbGUgdG9EaXIsIFN0cmluZ1tdIG5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciwgSGFzaHRhYmxlIG1hcCkgeworICAgICAgICBTdHJpbmdbXSB0b0NvcHkgPSBudWxsOworICAgICAgICBpZiAoZm9yY2VPdmVyd3JpdGUpIHsKKyAgICAgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtYXBwZXIubWFwRmlsZU5hbWUobmFtZXNbaV0pICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KG5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b0NvcHkgPSBuZXcgU3RyaW5nW3Yuc2l6ZSgpXTsKKyAgICAgICAgICAgIHYuY29weUludG8odG9Db3B5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNvdXJjZUZpbGVTY2FubmVyIGRzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOworICAgICAgICAgICAgdG9Db3B5ID0gZHMucmVzdHJpY3QobmFtZXMsIGZyb21EaXIsIHRvRGlyLCBtYXBwZXIsIGdyYW51bGFyaXR5KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvQ29weS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBzcmMgPSBuZXcgRmlsZShmcm9tRGlyLCB0b0NvcHlbaV0pOworICAgICAgICAgICAgU3RyaW5nW10gbWFwcGVkRmlsZXMgPSBtYXBwZXIubWFwRmlsZU5hbWUodG9Db3B5W2ldKTsKKworICAgICAgICAgICAgaWYgKCFlbmFibGVNdWx0aXBsZU1hcHBpbmdzKSB7CisgICAgICAgICAgICAgICAgbWFwLnB1dChzcmMuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge25ldyBGaWxlKHRvRGlyLCBtYXBwZWRGaWxlc1swXSkuZ2V0QWJzb2x1dGVQYXRoKCl9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcmV1c2UgdGhlIGFycmF5IGNyZWF0ZWQgYnkgdGhlIG1hcHBlcgorICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbWFwcGVkRmlsZXMubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwcGVkRmlsZXNba10gPSBuZXcgRmlsZSh0b0RpciwgbWFwcGVkRmlsZXNba10pLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXAucHV0KHNyYy5nZXRBYnNvbHV0ZVBhdGgoKSwgbWFwcGVkRmlsZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbWFwIG9mIHJlc291cmNlcyB0byBjb3B5LgorICAgICAqCisgICAgICogQHBhcmFtIGZyb21SZXNvdXJjZXMgIFRoZSBzb3VyY2UgcmVzb3VyY2VzLgorICAgICAqIEBwYXJhbSB0b0RpciAgIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIG1hcHBlciAgYSA8Y29kZT5GaWxlTmFtZU1hcHBlcjwvY29kZT4gdmFsdWUuCisgICAgICogQHJldHVybiBhIG1hcCBvZiBzb3VyY2UgcmVzb3VyY2UgdG8gYXJyYXkgb2YgZGVzdGluYXRpb24gZmlsZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIGJ1aWxkTWFwKFJlc291cmNlW10gZnJvbVJlc291cmNlcywgZmluYWwgRmlsZSB0b0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlcikgeworICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIFJlc291cmNlW10gdG9Db3B5ID0gbnVsbDsKKyAgICAgICAgaWYgKGZvcmNlT3ZlcndyaXRlKSB7CisgICAgICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJvbVJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtYXBwZXIubWFwRmlsZU5hbWUoZnJvbVJlc291cmNlc1tpXS5nZXROYW1lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KGZyb21SZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvQ29weSA9IG5ldyBSZXNvdXJjZVt2LnNpemUoKV07CisgICAgICAgICAgICB2LmNvcHlJbnRvKHRvQ29weSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0b0NvcHkgPQorICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuc2VsZWN0T3V0T2ZEYXRlU291cmNlcyh0aGlzLCBmcm9tUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNvdXJjZUZhY3RvcnkoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZSh0b0RpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvQ29weS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nW10gbWFwcGVkRmlsZXMgPSBtYXBwZXIubWFwRmlsZU5hbWUodG9Db3B5W2ldLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGlmICghZW5hYmxlTXVsdGlwbGVNYXBwaW5ncykgeworICAgICAgICAgICAgICAgIG1hcC5wdXQodG9Db3B5W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtuZXcgRmlsZSh0b0RpciwgbWFwcGVkRmlsZXNbMF0pLmdldEFic29sdXRlUGF0aCgpfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHJldXNlIHRoZSBhcnJheSBjcmVhdGVkIGJ5IHRoZSBtYXBwZXIKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG1hcHBlZEZpbGVzLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIG1hcHBlZEZpbGVzW2tdID0gbmV3IEZpbGUodG9EaXIsIG1hcHBlZEZpbGVzW2tdKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFwLnB1dCh0b0NvcHlbaV0sIG1hcHBlZEZpbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdHVhbGx5IGRvZXMgdGhlIGZpbGUgKGFuZCBwb3NzaWJseSBlbXB0eSBkaXJlY3RvcnkpIGNvcGllcy4KKyAgICAgKiBUaGlzIGlzIGEgZ29vZCBtZXRob2QgZm9yIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9GaWxlT3BlcmF0aW9ucygpIHsKKyAgICAgICAgaWYgKGZpbGVDb3B5TWFwLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGxvZygiQ29weWluZyAiICsgZmlsZUNvcHlNYXAuc2l6ZSgpCisgICAgICAgICAgICAgICAgKyAiIGZpbGUiICsgKGZpbGVDb3B5TWFwLnNpemUoKSA9PSAxID8gIiIgOiAicyIpCisgICAgICAgICAgICAgICAgKyAiIHRvICIgKyBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGZpbGVDb3B5TWFwLmtleXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZyb21GaWxlID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRvRmlsZXMgPSAoU3RyaW5nW10pIGZpbGVDb3B5TWFwLmdldChmcm9tRmlsZSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRvRmlsZSA9IHRvRmlsZXNbaV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21GaWxlLmVxdWFscyh0b0ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nIHNlbGYtY29weSBvZiAiICsgZnJvbUZpbGUsIHZlcmJvc2l0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJDb3B5aW5nICIgKyBmcm9tRmlsZSArICIgdG8gIiArIHRvRmlsZSwgdmVyYm9zaXR5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyU2V0Q29sbGVjdGlvbiBleGVjdXRpb25GaWx0ZXJzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyU2V0Q29sbGVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkZpbHRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpbHRlclNldChnZXRQcm9qZWN0KCkuZ2V0R2xvYmFsRmlsdGVyU2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBmaWx0ZXJFbnVtID0gZmlsdGVyU2V0cy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uRmlsdGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmlsdGVyU2V0KChGaWx0ZXJTZXQpIGZpbHRlckVudW0ubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVXRpbHMuY29weUZpbGUoZnJvbUZpbGUsIHRvRmlsZSwgZXhlY3V0aW9uRmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDaGFpbnMsIGZvcmNlT3ZlcndyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlTGFzdE1vZGlmaWVkLCBpbnB1dEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEVuY29kaW5nLCBnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGNvcHkgIiArIGZyb21GaWxlICsgIiB0byAiICsgdG9GaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGR1ZSB0byAiICsgZ2V0RHVlVG8oaW9lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRvRmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSAmJiAhdGFyZ2V0RmlsZS5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSAiIGFuZCBJIGNvdWxkbid0IGRlbGV0ZSB0aGUgY29ycnVwdCAiICsgdG9GaWxlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtc2csIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluY2x1ZGVFbXB0eSkgeworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGRpckNvcHlNYXAuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIGludCBjcmVhdGVDb3VudCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRpcnMgPSAoU3RyaW5nW10pIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBkID0gbmV3IEZpbGUoZGlyc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkLm1rZGlycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZC5nZXRBYnNvbHV0ZVBhdGgoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjcmVhdGVDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBsb2coIkNvcGllZCAiICsgZGlyQ29weU1hcC5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGVtcHR5IGRpcmVjdG9yIgorICAgICAgICAgICAgICAgICAgICArIChkaXJDb3B5TWFwLnNpemUoKSA9PSAxID8gInkiIDogImllcyIpCisgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgY3JlYXRlQ291bnQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGVtcHR5IGRpcmVjdG9yIgorICAgICAgICAgICAgICAgICAgICArIChjcmVhdGVDb3VudCA9PSAxID8gInkiIDogImllcyIpICsgIiB1bmRlciAiCisgICAgICAgICAgICAgICAgICAgICsgZGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY3R1YWxseSBkb2VzIHRoZSByZXNvdXJjZSBjb3BpZXMuCisgICAgICogVGhpcyBpcyBhIGdvb2QgbWV0aG9kIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlLgorICAgICAqIEBwYXJhbSBtYXAgYSBtYXAgb2Ygc291cmNlIHJlc291cmNlIHRvIGFycmF5IG9mIGRlc3RpbmF0aW9uIGZpbGVzLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9SZXNvdXJjZU9wZXJhdGlvbnMoTWFwIG1hcCkgeworICAgICAgICBpZiAobWFwLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGxvZygiQ29weWluZyAiICsgbWFwLnNpemUoKQorICAgICAgICAgICAgICAgICsgIiByZXNvdXJjZSIgKyAobWFwLnNpemUoKSA9PSAxID8gIiIgOiAicyIpCisgICAgICAgICAgICAgICAgKyAiIHRvICIgKyBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2UgZnJvbVJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b0ZpbGVzID0gKFN0cmluZ1tdKSBtYXAuZ2V0KGZyb21SZXNvdXJjZSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRvRmlsZSA9IHRvRmlsZXNbaV07CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ29weWluZyAiICsgZnJvbVJlc291cmNlICsgIiB0byAiICsgdG9GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2l0eSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZXhlY3V0aW9uRmlsdGVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlclNldENvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25GaWx0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGaWx0ZXJTZXQoZ2V0UHJvamVjdCgpLmdldEdsb2JhbEZpbHRlclNldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZmlsdGVyRW51bSA9IGZpbHRlclNldHMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJFbnVtLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkZpbHRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpbHRlclNldCgoRmlsdGVyU2V0KSBmaWx0ZXJFbnVtLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5jb3B5UmVzb3VyY2UoZnJvbVJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVSZXNvdXJjZShkZXN0RGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0ZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uRmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckNoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlT3ZlcndyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVMYXN0TW9kaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGNvcHkgIiArIGZyb21SZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgdG9GaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGR1ZSB0byAiICsgZ2V0RHVlVG8oaW9lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRvRmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSAmJiAhdGFyZ2V0RmlsZS5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSAiIGFuZCBJIGNvdWxkbid0IGRlbGV0ZSB0aGUgY29ycnVwdCAiICsgdG9GaWxlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtc2csIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdGFzayBjYW4gZGVhbCB3aXRoIG5vbi1maWxlIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIDxwPiZsdDtjb3B5Jmd0OyBjYW4gd2hpbGUgJmx0O21vdmUmZ3Q7IGNhbid0IHNpbmNlIHdlIGRvbid0CisgICAgICoga25vdyBob3cgdG8gcmVtb3ZlIG5vbi1maWxlIHJlc291cmNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBvbmx5IGlmIHRoaXMgdGFzayBpcworICAgICAqICZsdDtjb3B5Jmd0Oy4gIEFueSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzIHRoYXQgYWxzbyB3YW50cyB0bworICAgICAqIHN1cHBvcnQgbm9uLWZpbGUgcmVzb3VyY2VzIG5lZWRzIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiAgV2UKKyAgICAgKiBuZWVkIHRvIGRvIHNvIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zIHNpbmNlIHdlCisgICAgICogY2FuJ3QgZXhwZWN0IHN1YmNsYXNzZXMgdG8gc3VwcG9ydCByZXNvdXJjZXMuPC9wPgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHRhc2sgc3VwcG9ydHMgbm9uIGZpbGUgcmVzb3VyY2VzLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5lcXVhbHMoQ29weS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gc3RyaW5ncyB0byBhIGxpc3QgY29udGFpbmVkIGluIHRoZSBnaXZlbiBtYXAuCisgICAgICogVGhlIGZpbGUgaXMgdGhlIGtleSBpbnRvIHRoZSBtYXAuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQoRmlsZSBiYXNlRGlyLCBTdHJpbmdbXSBuYW1lcywgTWFwIG0pIHsKKyAgICAgICAgaWYgKG5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJhc2VEaXIgPSBnZXRLZXlGaWxlKGJhc2VEaXIpOworICAgICAgICAgICAgTGlzdCBsID0gKExpc3QpIG0uZ2V0KGJhc2VEaXIpOworICAgICAgICAgICAgaWYgKGwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGwgPSBuZXcgQXJyYXlMaXN0KG5hbWVzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbS5wdXQoYmFzZURpciwgbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsLmFkZEFsbChqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChuYW1lcykpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gc3RyaW5nIHRvIGEgbGlzdCBjb250YWluZWQgaW4gdGhlIGdpdmVuIG1hcC4KKyAgICAgKiBUaGUgZmlsZSBpcyB0aGUga2V5IGludG8gdGhlIG1hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZChGaWxlIGJhc2VEaXIsIFN0cmluZyBuYW1lLCBNYXAgbSkgeworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGQoYmFzZURpciwgbmV3IFN0cmluZ1tdIHtuYW1lfSwgbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFaXRoZXIgcmV0dXJucyBpdHMgYXJndW1lbnQgb3IgYSBwbGFlaG9sZGVyIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0S2V5RmlsZShGaWxlIGYpIHsKKyAgICAgICAgcmV0dXJuIGYgPT0gbnVsbCA/IE5VTExfRklMRV9QTEFDRUhPTERFUiA6IGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgbWFwcGVyIHRvIHVzZSBiYXNlZCBvbiBuZXN0ZWQgZWxlbWVudHMgb3IgdGhlCisgICAgICogZmxhdHRlbiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlTmFtZU1hcHBlciBnZXRNYXBwZXIoKSB7CisgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IG51bGw7CisgICAgICAgIGlmIChtYXBwZXJFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1hcHBlciA9IG1hcHBlckVsZW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChmbGF0dGVuKSB7CisgICAgICAgICAgICBtYXBwZXIgPSBuZXcgRmxhdEZpbGVOYW1lTWFwcGVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXBwZXIgPSBuZXcgSWRlbnRpdHlNYXBwZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFwcGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSBnZXRNZXNzYWdlKCkgZm9yIGV4Y2VwdGlvbnMuCisgICAgICogQHBhcmFtIGV4IHRoZSBleGNlcHRpb24gdG8gaGFuZGxlCisgICAgICogQHJldHVybiBleC5nZXRNZXNzYWdlKCkgaWYgZXguZ2V0TWVzc2FnZSgpIGlzIG5vdCBudWxsCisgICAgICogICAgICAgICBvdGhlcndpc2UgcmV0dXJuIGV4LnRvU3RyaW5nKCkKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKEV4Y2VwdGlvbiBleCkgeworICAgICAgICByZXR1cm4gZXguZ2V0TWVzc2FnZSgpID09IG51bGwgPyBleC50b1N0cmluZygpIDogZXguZ2V0TWVzc2FnZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSByZWFzb24gZm9yIGZhaWx1cmUgYmFzZWQgb24KKyAgICAgKiB0aGUgZXhjZXB0aW9uIHRocm93bi4KKyAgICAgKiBJZiB0aGUgZXhjZXB0aW9uIGlzIG5vdCBJT0V4Y2VwdGlvbiBvdXRwdXQgdGhlIGNsYXNzIG5hbWUsCisgICAgICogb3V0cHV0IHRoZSBtZXNzYWdlCisgICAgICogaWYgdGhlIGV4Y2VwdGlvbiBpcyBNYWxmb3JtZWRJbnB1dCBhZGQgYSBsaXR0bGUgbm90ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXREdWVUbyhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgYm9vbGVhbiBiYXNlSU9FeGNlcHRpb24gPSBleC5nZXRDbGFzcygpID09IElPRXhjZXB0aW9uLmNsYXNzOworICAgICAgICBTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKCFiYXNlSU9FeGNlcHRpb24gfHwgZXguZ2V0TWVzc2FnZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXguZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghYmFzZUlPRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpLmluZGV4T2YoIk1hbGZvcm1lZElucHV0IikgIT0gLTEpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKExJTkVfU0VQQVJBVE9SKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKAorICAgICAgICAgICAgICAgICJUaGlzIGlzIG5vcm1hbGx5IGR1ZSB0byB0aGUgaW5wdXQgZmlsZSBjb250YWluaW5nIGludmFsaWQiKTsKKyAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChMSU5FX1NFUEFSQVRPUik7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiYnl0ZXMgZm9yIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCA6ICIpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoCisgICAgICAgICAgICAgICAgKGlucHV0RW5jb2RpbmcgPT0gbnVsbAorICAgICAgICAgICAgICAgICA/IGZpbGVVdGlscy5nZXREZWZhdWx0RW5jb2RpbmcoKSA6IGlucHV0RW5jb2RpbmcpKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKExJTkVfU0VQQVJBVE9SKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlQYXRoLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5UGF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkM2MzZGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5UGF0aC5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIGEgcGF0aCB0byBhIGRlc3RpbmF0aW9uLCB1c2luZyB0aGUgbWFwcGVyIG9mIGNob2ljZQorICoKKyAqIEBzaW5jZSBBbnQgMS43CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgorICovCisKK3B1YmxpYyBjbGFzcyBDb3B5UGF0aCBleHRlbmRzIFRhc2sgeworCisgICAgLy8gRXJyb3IgbWVzc2FnZXMKKyAgICAvKiogTm8gZGVzdGRpciBhdHRyaWJ1dGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19ERVNURElSID0gIk5vIGRlc3REaXIgc3BlY2lmaWVkIjsKKworICAgIC8qKiBObyBwYXRoICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX1BBVEggPSAiTm8gcGF0aCBzcGVjaWZpZWQiOworCisgICAgLyoqIE5vIG1hcHBlciAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19NQVBQRVIgPSAiTm8gbWFwcGVyIHNwZWNpZmllZCI7CisKKyAgICAvLyBmaWxldXRpbHMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8vIC0tLSBGaWVsZHMgLS0KKyAgICBwcml2YXRlIEZpbGVOYW1lTWFwcGVyIG1hcHBlcjsKKworICAgIHByaXZhdGUgUGF0aCBwYXRoOworCisgICAgcHJpdmF0ZSBGaWxlIGRlc3REaXI7CisKKyAgICAvLyBUT0RPIG5vdCByZWFkLCB5ZXQgaW4gYSBwdWJsaWMgc2V0dGVyCisgICAgcHJpdmF0ZSBsb25nIGdyYW51bGFyaXR5ID0gRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhlIGRlc3QgZGlyIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gZGVzdERpciB0aGUgdmFsdWUgb2YgdGhlIGRlc3RkaXIgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3REaXIoRmlsZSBkZXN0RGlyKSB7CisgICAgICAgIHRoaXMuZGVzdERpciA9IGRlc3REaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbWFwcGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3bWFwcGVyIHRoZSBtYXBwZXIgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChGaWxlTmFtZU1hcHBlciBuZXdtYXBwZXIpIHsKKyAgICAgICAgaWYgKG1hcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG1hcHBlciBhbGxvd2VkIik7CisgICAgICAgIH0KKyAgICAgICAgbWFwcGVyID0gbmV3bWFwcGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGF0aCB0byBiZSB1c2VkIHdoZW4gcnVubmluZyB0aGUgSmF2YSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFBhdGggcykgeworICAgICAgICBjcmVhdGVQYXRoKCkuYXBwZW5kKHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGF0aCB0byB1c2UgYnkgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIHBhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBjcmVhdGVQYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcGF0aC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlUGF0aCgpIHsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byBnaXZlIGJlZm9yZSBkZWNpZGluZyBhCisgICAgICogdGFyZ2V0IGlzIG91dCBvZiBkYXRlLgorICAgICAqIFRPRE86IFRoaXMgaXMgbm90IHlldCB1c2VkLgorICAgICAqIEBwYXJhbSBncmFudWxhcml0eSB0aGUgZ3JhbnVsYXJpdHkgdXNlZCB0byBkZWNpZGUgaWYgYSB0YXJnZXQgaXMgb3V0IG9mCisgICAgICogICAgICAgICAgICAgICAgICAgIGRhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JhbnVsYXJpdHkobG9uZyBncmFudWxhcml0eSkgeworICAgICAgICB0aGlzLmdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZSB0aGUgY29waWVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWQgdGltZSBhcyB0aGUgb3JpZ2luYWwgZmlsZXMuCisgICAgICogQHBhcmFtIHByZXNlcnZlTGFzdE1vZGlmaWVkIGlmIHRydWUgcHJlc2VydmUgdGhlIG1vZGlmaWVkIHRpbWU7CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlc2VydmVMYXN0TW9kaWZpZWQoYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCkgeworICAgICAgICB0aGlzLnByZXNlcnZlTGFzdE1vZGlmaWVkID0gcHJlc2VydmVMYXN0TW9kaWZpZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHdlIGhhdmUgYSBjb25zaXN0ZW50IGFuZCBsZWdhbCBzZXQgb2YgYXR0cmlidXRlcywgYW5kIHNldCBhbnkKKyAgICAgKiBpbnRlcm5hbCBmbGFncyBuZWNlc3NhcnkgYmFzZWQgb24gZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTk9fREVTVERJUik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTk9fTUFQUEVSKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTk9fUEFUSCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgdmVyeSBtaW5pbWFsIGRlcml2YXRpdmUgb2YgdGhlIG5vbWFsIGNvcHkgbG9naWMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlcygpOworICAgICAgICBTdHJpbmdbXSBzb3VyY2VGaWxlcyA9IHBhdGgubGlzdCgpOworICAgICAgICBpZiAoc291cmNlRmlsZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGxvZygiUGF0aCBpcyBlbXB0eSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgc291cmNlcyA9IDA7IHNvdXJjZXMgPCBzb3VyY2VGaWxlcy5sZW5ndGg7IHNvdXJjZXMrKykgeworCisgICAgICAgICAgICBTdHJpbmcgc291cmNlRmlsZU5hbWUgPSBzb3VyY2VGaWxlc1tzb3VyY2VzXTsKKyAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUZpbGVOYW1lKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHRvRmlsZXMgPSAoU3RyaW5nW10pIG1hcHBlci5tYXBGaWxlTmFtZShzb3VyY2VGaWxlTmFtZSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9GaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBkZXN0RmlsZU5hbWUgPSB0b0ZpbGVzW2ldOworICAgICAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBkZXN0RmlsZU5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUuZXF1YWxzKGRlc3RGaWxlKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nIHNlbGYtY29weSBvZiAiICsgc291cmNlRmlsZU5hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nIGRpcmVjdG9yeSAiICsgc291cmNlRmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJDb3B5aW5nICIgKyBzb3VyY2VGaWxlICsgIiB0byAiICsgZGVzdEZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMuY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsIG51bGwsIG51bGwsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlTGFzdE1vZGlmaWVkLCBudWxsLCBudWxsLCBnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBjb3B5ICIgKyBzb3VyY2VGaWxlICsgIiB0byAiICsgZGVzdEZpbGUgKyAiIGR1ZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpb2UuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdEZpbGUuZXhpc3RzKCkgJiYgIWRlc3RGaWxlLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gIiBhbmQgSSBjb3VsZG4ndCBkZWxldGUgdGhlIGNvcnJ1cHQgIiArIGRlc3RGaWxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3M2U2N2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZGlyLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBDb3BpZXMgYSBkaXJlY3RvcnkuCisgKgorICogQHNpbmNlIEFudCAxLjEKKyAqCisgKiBAZGVwcmVjYXRlZCBUaGUgY29weWRpciB0YXNrIGlzIGRlcHJlY2F0ZWQgc2luY2UgQW50IDEuMi4gIFVzZSBjb3B5IGluc3RlYWQuCisgKi8KKworcHVibGljIGNsYXNzIENvcHlkaXIgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgeworCisgICAgcHJpdmF0ZSBGaWxlIHNyY0RpcjsKKyAgICBwcml2YXRlIEZpbGUgZGVzdERpcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyaW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGZsYXR0ZW4gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2VPdmVyd3JpdGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIEhhc2h0YWJsZSBmaWxlY29weUxpc3QgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3JjIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzcmMpIHsKKyAgICAgICAgc3JjRGlyID0gc3JjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZXN0IGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0KEZpbGUgZGVzdCkgeworICAgICAgICBkZXN0RGlyID0gZGVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsdGVyaW5nIGF0dHJpYnV0ZS4KKyAgICAgKiBEZWZhdWx0ICBpcyBmYWxzZS4KKyAgICAgKiBAcGFyYW0gZmlsdGVyIGlmIHRydWUgdXNlIGZpbHRlcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcmluZyhib29sZWFuIGZpbHRlcikgeworICAgICAgICBmaWx0ZXJpbmcgPSBmaWx0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZsYXR0ZW5pbmcgYXR0cmlidXRlLgorICAgICAqIERlZmF1bHQgIGlzIGZhbHNlLgorICAgICAqIEBwYXJhbSBmbGF0dGVuIGlmIHRydWUgdXNlIGZsYXR0ZW5pbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGbGF0dGVuKGJvb2xlYW4gZmxhdHRlbikgeworICAgICAgICB0aGlzLmZsYXR0ZW4gPSBmbGF0dGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmb3JjZW92ZXJ3cml0ZSBhdHRyaWJ1dGUuCisgICAgICogRGVmYXVsdCAgaXMgZmFsc2UuCisgICAgICogQHBhcmFtIGZvcmNlIGlmIHRydWUgb3ZlcndyaXRlIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUKKyAgICAgKiAgICAgICAgICAgICAgaXMgbmV3ZXIgdGhhdCB0aGUgc291cmNlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZW92ZXJ3cml0ZShib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGZvcmNlT3ZlcndyaXRlID0gZm9yY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSBjb3B5ZGlyIHRhc2sgaXMgZGVwcmVjYXRlZC4gIFVzZSBjb3B5IGluc3RlYWQuIik7CisKKyAgICAgICAgaWYgKHNyY0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyYyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3JjRGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciAiICsgc3JjRGlyLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgZXhpc3QhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBkZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHNldC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNyY0Rpci5lcXVhbHMoZGVzdERpcikpIHsKKyAgICAgICAgICAgIGxvZygiV2FybmluZzogc3JjID09IGRlc3QiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfQorCisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0Rpcik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgc2NhbkRpcihzcmNEaXIsIGRlc3REaXIsIGZpbGVzKTsKKyAgICAgICAgICAgIGlmIChmaWxlY29weUxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGxvZygiQ29weWluZyAiICsgZmlsZWNvcHlMaXN0LnNpemUoKSArICIgZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoZmlsZWNvcHlMaXN0LnNpemUoKSA9PSAxID8gIiIgOiAicyIpCisgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgZGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGZpbGVjb3B5TGlzdC5rZXlzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZyb21GaWxlID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9GaWxlID0gKFN0cmluZykgZmlsZWNvcHlMaXN0LmdldChmcm9tRmlsZSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuY29weUZpbGUoZnJvbUZpbGUsIHRvRmlsZSwgZmlsdGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU92ZXJ3cml0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gY29weSAiICsgZnJvbUZpbGUgKyAiIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRvRmlsZSArICIgZHVlIHRvICIgKyBpb2UuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbGVjb3B5TGlzdC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNjYW5EaXIoRmlsZSBmcm9tLCBGaWxlIHRvLCBTdHJpbmdbXSBmaWxlcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlc1tpXTsKKyAgICAgICAgICAgIEZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKGZyb20sIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIEZpbGUgZGVzdEZpbGU7CisgICAgICAgICAgICBpZiAoZmxhdHRlbikgeworICAgICAgICAgICAgICAgIGRlc3RGaWxlID0gbmV3IEZpbGUodG8sIG5ldyBGaWxlKGZpbGVuYW1lKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXN0RmlsZSA9IG5ldyBGaWxlKHRvLCBmaWxlbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm9yY2VPdmVyd3JpdGUKKyAgICAgICAgICAgICAgICB8fCAoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGRlc3RGaWxlLmxhc3RNb2RpZmllZCgpKSkgeworICAgICAgICAgICAgICAgIGZpbGVjb3B5TGlzdC5wdXQoc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlmaWxlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDUyYTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZmlsZS5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogQ29waWVzIGEgZmlsZS4KKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBkZXByZWNhdGVkIFRoZSBjb3B5ZmlsZSB0YXNrIGlzIGRlcHJlY2F0ZWQgc2luY2UgQW50IDEuMi4gIFVzZQorICogY29weSBpbnN0ZWFkLgorICovCisKK3B1YmxpYyBjbGFzcyBDb3B5ZmlsZSBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBGaWxlIHNyY0ZpbGU7CisgICAgcHJpdmF0ZSBGaWxlIGRlc3RGaWxlOworICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2VPdmVyd3JpdGUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc291cmNlIGZpbGUuCisgICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgc3JjKSB7CisgICAgICAgIHNyY0ZpbGUgPSBzcmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZvcmNlb3ZlcndyaXRlIGF0dHJpYnV0ZS4KKyAgICAgKiBEZWZhdWx0ICBpcyBmYWxzZS4KKyAgICAgKiBAcGFyYW0gZm9yY2UgaWYgdHJ1ZSBvdmVyd3JpdGUgZXZlbiBpZiB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgICAqICAgICAgICAgICAgICBpcyBuZXdlciB0aGF0IHRoZSBzb3VyY2UgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlb3ZlcndyaXRlKGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgZm9yY2VPdmVyd3JpdGUgPSBmb3JjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRlc3QpIHsKKyAgICAgICAgZGVzdEZpbGUgPSBkZXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXJpbmcgYXR0cmlidXRlLgorICAgICAqIERlZmF1bHQgIGlzIGZhbHNlLgorICAgICAqIEBwYXJhbSBmaWx0ZXIgaWYgdHJ1ZSB1c2UgZmlsdGVyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyaW5nKFN0cmluZyBmaWx0ZXIpIHsKKyAgICAgICAgZmlsdGVyaW5nID0gUHJvamVjdC50b0Jvb2xlYW4oZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIGNvcHlmaWxlIHRhc2sgaXMgZGVwcmVjYXRlZC4gIFVzZSBjb3B5IGluc3RlYWQuIik7CisKKyAgICAgICAgaWYgKHNyY0ZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgc3JjIGF0dHJpYnV0ZSBtdXN0IGJlIHByZXNlbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3JjRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgIiArIHNyY0ZpbGUudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdC4iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0RmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBkZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHByZXNlbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmNGaWxlLmVxdWFscyhkZXN0RmlsZSkpIHsKKyAgICAgICAgICAgIGxvZygiV2FybmluZzogc3JjID09IGRlc3QiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3JjZU92ZXJ3cml0ZQorICAgICAgICAgICAgfHwgc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGRlc3RGaWxlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5jb3B5RmlsZShzcmNGaWxlLCBkZXN0RmlsZSwgZmlsdGVyaW5nLCBmb3JjZU92ZXJ3cml0ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIGNvcHlpbmcgZmlsZTogIiArIHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGR1ZSB0byAiICsgaW9lLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0N2cy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ3ZzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyYTRlYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0N2cy5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworLyoqCisgKiBQZXJmb3JtcyBvcGVyYXRpb25zIG9uIGEgQ1ZTIHJlcG9zaXRvcnkuCisgKgorICogb3JpZ2luYWwgMS4yMAorICoKKyAqICBOT1RFOiBUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIG1vdmVkIHRvIEFic3RyYWN0Q3ZzVGFzayB3aXRoCisgKiAgdGhlIGFkZGl0aW9uIG9mIHNvbWUgYWNjZXNzb3JzIGZvciBleHRlbnNpYmlsaXR5LgorICoKKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0ic2NtIgorICovCitwdWJsaWMgY2xhc3MgQ3ZzIGV4dGVuZHMgQWJzdHJhY3RDdnNUYXNrIHsKKworICAgIC8qKgorICAgICAqIENWUyBUYXNrIC0gbm93IGltcGxlbWVudGVkIGJ5IHRoZSBBYnN0cmFjdCBDVlMgVGFzayBiYXNlIGNsYXNzCisgICAgICovCisgICAgcHVibGljIEN2cygpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZCYXNlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyYmJiNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlZkJhc2UuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNsYXNzcGF0aFV0aWxzOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIERlZmluaXRpb25zIGhhbmRsaW5nIHVyaSBhbmQgY2xhc3MgbG9hZGluZy4KKyAqIChUaGlzIHdhcyBwYXJ0IG9mIERlZmluZXIpCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERlZkJhc2UgZXh0ZW5kcyBBbnRsaWJEZWZpbml0aW9uIHsKKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNyZWF0ZWRMb2FkZXI7CisgICAgcHJpdmF0ZSBDbGFzc3BhdGhVdGlscy5EZWxlZ2F0ZSBjcERlbGVnYXRlOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgY2xhc3NwYXRoIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldC4KKyAgICAgKiAodG8gYmUgY2FsbGVkIGJlZm9yZSBnZXRDcERlbGVnYXRlKCkgaXMgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgY3BEZWxlZ2F0ZSBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0NwRGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiBjcERlbGVnYXRlICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJldmVyc2VMb2FkZXIgaWYgdHJ1ZSBhIGRlbGVnYXRlZCBsb2FkZXIgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXJlbnQKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KKyAgICAgKiAgICAgICAgICAgICBzdG9wIHVzaW5nIHRoaXMgYXR0cmlidXRlCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldmVyc2VMb2FkZXIoYm9vbGVhbiByZXZlcnNlTG9hZGVyKSB7CisgICAgICAgIGdldERlbGVnYXRlKCkuc2V0UmV2ZXJzZUxvYWRlcihyZXZlcnNlTG9hZGVyKTsKKyAgICAgICAgbG9nKCJUaGUgcmV2ZXJzZWxvYWRlciBhdHRyaWJ1dGUgaXMgREVQUkVDQVRFRC4gSXQgd2lsbCBiZSByZW1vdmVkIiwKKyAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzcGF0aCBmb3IgdGhpcyBkZWZpbml0aW9uCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCkgeworICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRDbGFzc3BhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSByZXZlcnNlIGxvYWRlciBhdHRyaWJ1dGUgb2YgdGhlIGNsYXNzcGF0aCBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBnZXREZWxlZ2F0ZSgpLmlzUmV2ZXJzZUxvYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvYWRlciBpZCBvZiB0aGUgY2xhc3MgcGF0aCBEZWxlZ2F0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2FkZXIgaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvYWRlcklkKCkgeworICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRDbGFzc0xvYWRJZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNsYXNzIHBhdGggaWQgb2YgdGhlIGNsYXNzIHBhdGggZGVsZWdhdGUuCisgICAgICogQHJldHVybiB0aGUgY2xhc3MgcGF0aCBpZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoSWQoKSB7CisgICAgICAgIHJldHVybiBnZXREZWxlZ2F0ZSgpLmdldENsYXNzTG9hZElkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY29tcG9uZW50IGJlaW5nIGRlZmluZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIGFuIEFudCBQYXRoIG9iamVjdCBjb250YWluaW5nIHRoZSBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGdldERlbGVnYXRlKCkuc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY29tcG9uZW50IGJlaW5nCisgICAgICogZGVmaW5lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc3BhdGggb2YgdGhlIHRoaXMgZGVmaW5pdGlvbgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlKCkuY3JlYXRlQ2xhc3NwYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGZpbGVzLgorICAgICAqIFRvIGFjdHVhbGx5IHNoYXJlIHRoZSBzYW1lIGxvYWRlciwgc2V0IGxvYWRlcnJlZiBhcyB3ZWxsCisgICAgICogQHBhcmFtIHIgdGhlIHJlZmVyZW5jZSB0byB0aGUgY2xhc3NwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGdldERlbGVnYXRlKCkuc2V0Q2xhc3NwYXRocmVmKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgcmVmZXJlbmNlIHRvIGxvY2F0ZSB0aGUgbG9hZGVyLiBJZiB0aGUgbG9hZGVyIGlzIG5vdAorICAgICAqIGZvdW5kLCB0aGUgc3BlY2lmaWVkIGNsYXNzcGF0aCB3aWxsIGJlIHVzZWQgYW5kIHJlZ2lzdGVyZWQKKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIFRoaXMgYWxsb3dzIG11bHRpcGxlIHRhc2tkZWYvdHlwZWRlZiB0byB1c2UgdGhlIHNhbWUgY2xhc3MgbG9hZGVyLAorICAgICAqIHNvIHRoZXkgY2FuIGJlIHVzZWQgdG9nZXRoZXIsIGVsaW1pbmF0aW5nIHRoZSBuZWVkIHRvCisgICAgICogcHV0IHRoZW0gaW4gdGhlIENMQVNTUEFUSC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gbG9jYXRlIHRoZSBsb2FkZXIuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkZXJSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgZ2V0RGVsZWdhdGUoKS5zZXRMb2FkZXJSZWYocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIGEgY2xhc3Nsb2FkZXIgZm9yIHRoaXMgZGVmaW5pdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzbG9hZGVyIGZyb20gdGhlIGNwRGVsZWdhdGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY3JlYXRlTG9hZGVyKCkgeworICAgICAgICBpZiAoZ2V0QW50bGliQ2xhc3NMb2FkZXIoKSAhPSBudWxsICYmIGNwRGVsZWdhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEFudGxpYkNsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNyZWF0ZWRMb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY3JlYXRlZExvYWRlciA9IGdldERlbGVnYXRlKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gbG9hZCBUYXNrIHZpYSBzeXN0ZW0gY2xhc3Nsb2FkZXIgb3IgdGhlIG5ldworICAgICAgICAgICAgLy8gdGFzayB3ZSB3YW50IHRvIGRlZmluZSB3aWxsIG5ldmVyIGJlIGEgVGFzayBidXQgYWx3YXlzCisgICAgICAgICAgICAvLyBiZSB3cmFwcGVkIGludG8gYSBUYXNrQWRhcHRlci4KKyAgICAgICAgICAgICgoQW50Q2xhc3NMb2FkZXIpIGNyZWF0ZWRMb2FkZXIpCisgICAgICAgICAgICAgICAgLmFkZFN5c3RlbVBhY2thZ2VSb290KCJvcmcuYXBhY2hlLnRvb2xzLmFudCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjcmVhdGVkTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNpbml0KCkKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmluaXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzcGF0aFV0aWxzLkRlbGVnYXRlIGdldERlbGVnYXRlKCkgeworICAgICAgICBpZiAoY3BEZWxlZ2F0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBjcERlbGVnYXRlID0gQ2xhc3NwYXRoVXRpbHMuZ2V0RGVsZWdhdGUodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNwRGVsZWdhdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmYXVsdEV4Y2x1ZGVzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZhdWx0RXhjbHVkZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTM5OWZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmYXVsdEV4Y2x1ZGVzLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogQWx0ZXJzIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIGZvciB0aGUgPHN0cm9uZz5lbnRpcmU8L3N0cm9uZz4gYnVpbGQuLgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJ1dGlsaXR5IgorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdEV4Y2x1ZGVzIGV4dGVuZHMgVGFzayB7CisgICAgcHJpdmF0ZSBTdHJpbmcgYWRkID0gIiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlID0gIiI7CisgICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRyZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZWNobyA9IGZhbHNlOworCisgICAgLy8gYnkgZGVmYXVsdCwgbWVzc2FnZXMgYXJlIGFsd2F5cyBkaXNwbGF5ZWQKKyAgICBwcml2YXRlIGludCBsb2dMZXZlbCA9IFByb2plY3QuTVNHX1dBUk47CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSB3b3JrLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoIWRlZmF1bHRyZXF1ZXN0ZWQgJiYgYWRkLmVxdWFscygiIikgJiYgcmVtb3ZlLmVxdWFscygiIikgJiYgIWVjaG8pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiPGRlZmF1bHRleGNsdWRlcz4gdGFzayBtdXN0IHNldCAiCisgICAgICAgICAgICAgICAgKyAiYXQgbGVhc3Qgb25lIGF0dHJpYnV0ZSAoZWNobz1cImZhbHNlXCIiCisgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3QgY291bnQgc2luY2UgdGhhdCBpcyB0aGUgZGVmYXVsdCIpOworICAgICAgICB9CisgICAgICAgIGlmIChkZWZhdWx0cmVxdWVzdGVkKSB7CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyLnJlc2V0RGVmYXVsdEV4Y2x1ZGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhZGQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lci5hZGREZWZhdWx0RXhjbHVkZShhZGQpOworICAgICAgICB9CisgICAgICAgIGlmICghcmVtb3ZlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIucmVtb3ZlRGVmYXVsdEV4Y2x1ZGUocmVtb3ZlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWNobykgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICA9IG5ldyBTdHJpbmdCdWZmZXIoIkN1cnJlbnQgRGVmYXVsdCBFeGNsdWRlczoiKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGV4Y2x1ZGVzID0gRGlyZWN0b3J5U2Nhbm5lci5nZXREZWZhdWx0RXhjbHVkZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChleGNsdWRlc1tpXSk7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKG1lc3NhZ2UudG9TdHJpbmcoKSwgbG9nTGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ28gYmFjayB0byBzdGFuZGFyZCBkZWZhdWx0IHBhdHRlcm5zCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmIGlmIHRydWUgZ28gYmFjayB0byBkZWZhdWx0IHBhdHRlcm5zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChib29sZWFuIGRlZikgeworICAgICAgICBkZWZhdWx0cmVxdWVzdGVkID0gZGVmOworICAgIH0KKyAgICAvKioKKyAgICAgKiBQYXR0ZXJuIHRvIGFkZCB0byB0aGUgZGVmYXVsdCBleGNsdWRlcworICAgICAqCisgICAgICogQHBhcmFtIGFkZCBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHBhdHRlcm4gdG8gZXhjbHVkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGQoU3RyaW5nIGFkZCkgeworICAgICAgICB0aGlzLmFkZCA9IGFkZDsKKyAgICB9CisKKyAgICAgLyoqCisgICAgICogUGF0dGVybiB0byByZW1vdmUgZnJvbSB0aGUgZGVmYXVsdCBleGNsdWRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZW1vdmUgU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBwYXR0ZXJuIHRoYXQKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBubyBsb25nZXIgYmUgZXhjbHVkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlKFN0cmluZyByZW1vdmUpIHsKKyAgICAgICAgdGhpcy5yZW1vdmUgPSByZW1vdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZWNobyB0aGUgZGVmYXVsdCBleGNsdWRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlY2hvIHdoZXRoZXIgb3Igbm90IHRvIGVjaG8gdGhlIGNvbnRlbnRzIG9mCisgICAgICogICAgICAgICAgICAgdGhlIGRlZmF1bHQgZXhjbHVkZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWNobyhib29sZWFuIGVjaG8pIHsKKyAgICAgICAgdGhpcy5lY2hvID0gZWNobzsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmaW5lci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWIyYzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZpbmVyLmphdmEKQEAgLTAsMCArMSw2NTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Db21wb25lbnRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBUYXNrZGVmIGFuZCBUeXBlZGVmIC0gaGFuZGxlcyBhbGwKKyAqIHRoZSBhdHRyaWJ1dGVzIGZvciBUeXBlZGVmLiBUaGUgdXJpIGFuZCBjbGFzcworICogaGFuZGxpbmcgaXMgaGFuZGxlZCBieSBEZWZCYXNlCisgKgorICogQHNpbmNlIEFudCAxLjQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmluZXIgZXh0ZW5kcyBEZWZCYXNlIHsKKworICAgIC8qKgorICAgICAqIHRoZSBleHRlbnNpb24gb2YgYW4gYW50bGliIGZpbGUgZm9yIGF1dG9sb2FkaW5nLgorICAgICAqIHtAdmFsdWVbCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVExJQl9YTUwgPSAiL2FudGxpYi54bWwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdGFjayBleHRlbmRzIFRocmVhZExvY2FsIHsKKyAgICAgICAgcHVibGljIE9iamVjdCBpbml0aWFsVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgfQorICAgICAgICBNYXAgZ2V0U3RhY2soKSB7CisgICAgICAgICAgICByZXR1cm4gKE1hcCkgZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VTdGFjayByZXNvdXJjZVN0YWNrID0gbmV3IFJlc291cmNlU3RhY2soKTsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzbmFtZTsKKyAgICBwcml2YXRlIEZpbGUgZmlsZTsKKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzdHJpY3QgPSBmYWxzZTsKKworICAgIHByaXZhdGUgICBpbnQgICAgZm9ybWF0ID0gRm9ybWF0LlBST1BFUlRJRVM7CisgICAgcHJpdmF0ZSAgIGJvb2xlYW4gZGVmaW5lclNldCA9IGZhbHNlOworICAgIHByaXZhdGUgICBpbnQgICAgICAgICBvbkVycm9yID0gT25FcnJvci5GQUlMOworICAgIHByaXZhdGUgICBTdHJpbmcgICAgICBhZGFwdGVyOworICAgIHByaXZhdGUgICBTdHJpbmcgICAgICBhZGFwdFRvOworCisgICAgcHJpdmF0ZSAgIENsYXNzICAgICAgIGFkYXB0ZXJDbGFzczsKKyAgICBwcml2YXRlICAgQ2xhc3MgICAgICAgYWRhcHRUb0NsYXNzOworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlZCB0eXBlIGZvciBvbkVycm9yIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPbkVycm9yIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKiBFbnVtZXJhdGVkIHZhbHVlcyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCAgRkFJTCA9IDAsIFJFUE9SVCA9IDEsIElHTk9SRSA9IDIsIEZBSUxfQUxMID0gMzsKKworICAgICAgICAvKioKKyAgICAgICAgICogdGV4dCB2YWx1ZSBvZiBvbmVycm9yIG9wdGlvbiB7QHZhbHVlfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9MSUNZX0ZBSUwgPSAiZmFpbCI7CisgICAgICAgIC8qKgorICAgICAgICAgKiB0ZXh0IHZhbHVlIG9mIG9uZXJyb3Igb3B0aW9uIHtAdmFsdWV9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0xJQ1lfUkVQT1JUID0gInJlcG9ydCI7CisgICAgICAgIC8qKgorICAgICAgICAgKiB0ZXh0IHZhbHVlIG9mIG9uZXJyb3Igb3B0aW9uIHtAdmFsdWV9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0xJQ1lfSUdOT1JFID0gImlnbm9yZSI7CisgICAgICAgIC8qKgorICAgICAgICAgKiB0ZXh0IHZhbHVlIG9mIG9uZXJyb3Igb3B0aW9uIHtAdmFsdWV9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0xJQ1lfRkFJTEFMTCA9ICJmYWlsYWxsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPbkVycm9yKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhIHN0cmluZy4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT25FcnJvcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBnZXQgdGhlIHZhbHVlcworICAgICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBhbGxvd2VkIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7UE9MSUNZX0ZBSUwsIFBPTElDWV9SRVBPUlQsIFBPTElDWV9JR05PUkUsIFBPTElDWV9GQUlMQUxMfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZWQgdHlwZSBmb3IgZm9ybWF0IGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtYXQgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqIEVudW1lcmF0ZWQgdmFsdWVzICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRJRVMgPSAwLCBYTUwgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBnZXQgdGhlIHZhbHVlcworICAgICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBhbGxvd2VkIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7InByb3BlcnRpZXMiLCAieG1sIn07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzdHJpY3QgYXR0cmlidXRlLgorICAgICAqIElmIHRoaXMgaXMgdHJ1ZSwgb25seSB1c2UgdGhpcyBkZWZpbml0aW9uIGluIGFkZChYKS4KKyAgICAgKiBAcGFyYW0gcmVzdHJpY3QgdGhlIHZhbHVlIHRvIHNldC4KKyAgICAgKi8KKyAgICAgcHJvdGVjdGVkIHZvaWQgc2V0UmVzdHJpY3QoYm9vbGVhbiByZXN0cmljdCkgeworICAgICAgICAgdGhpcy5yZXN0cmljdCA9IHJlc3RyaWN0OworICAgICB9CisKKworICAgIC8qKgorICAgICAqIFdoYXQgdG8gZG8gaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gbG9hZGluZyB0aGUgY2xhc3MuCisgICAgICogPGRsPgorICAgICAqICAgPGxpPmVycm9yIC0gdGhyb3cgYnVpbGQgZXhjZXB0aW9uPC9saT4KKyAgICAgKiAgIDxsaT5yZXBvcnQgLSBvdXRwdXQgYXQgd2FybmluZyBsZXZlbDwvbGk+CisgICAgICogICA8bGk+aWdub3JlIC0gb3V0cHV0IGF0IGRlYnVnIGxldmVsPC9saT4KKyAgICAgKiA8L2RsPgorICAgICAqCisgICAgICogQHBhcmFtIG9uRXJyb3IgYW4gPGNvZGU+T25FcnJvcjwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkVycm9yKE9uRXJyb3Igb25FcnJvcikgeworICAgICAgICB0aGlzLm9uRXJyb3IgPSBvbkVycm9yLmdldEluZGV4KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZm9ybWF0IG9mIHRoZSBmaWxlIG9yIHJlc291cmNlCisgICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZW51bWVyYXRlZCB2YWx1ZSAtIHhtbCBvciBwcm9wZXJ0aWVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9ybWF0KEZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQuZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIGZvciB0aGlzIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgY29udGFpbmluZyBkZWZpbml0aW9ucworICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgZGVmaW5pdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIGRlZmluaXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDbGFzc0xvYWRlciBhbCA9IGNyZWF0ZUxvYWRlcigpOworCisgICAgICAgIGlmICghZGVmaW5lclNldCkgeworICAgICAgICAgICAgLy93ZSBhcmVudCBmdWxseSBkZWZpbmVkIHlldC4gdGhpcyBpcyBhbiBlcnJvciB1bmxlc3MKKyAgICAgICAgICAgIC8vd2UgYXJlIGluIGFuIGFudGxpYiwgaW4gd2hpY2ggY2FzZSB0aGUgcmVzb3VyY2UgbmFtZSBpcyBkZXRlcm1pbmVkCisgICAgICAgICAgICAvL2F1dG9tYXRpY2FsbHkuCisgICAgICAgICAgICAvL05COiBVUklzIGluIHRoZSBhbnQgY29yZSBwYWNrYWdlIHdpbGwgYmUgIiIgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgICAgIGlmIChnZXRVUkkoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUsIGZpbGUgb3IgcmVzb3VyY2UgYXR0cmlidXRlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRUYXNrTmFtZSgpICsgIiBpcyB1bmRlZmluZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChnZXRVUkkoKS5zdGFydHNXaXRoKE1hZ2ljTmFtZXMuQU5UTElCX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICAvL2NvbnZlcnQgdGhlIFVSSSB0byBhIHJlc291cmNlCisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaTEgPSBnZXRVUkkoKTsKKyAgICAgICAgICAgICAgICBzZXRSZXNvdXJjZShtYWtlUmVzb3VyY2VGcm9tVVJJKHVyaTEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgYW50bGliIFVSSXMgY2FuIGJlIGxvY2F0ZWQgZnJvbSB0aGUgVVJJIGFsb25lLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibm90IHRoZSBVUkkgIiArIGdldFVSSSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjbGFzc25hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImNsYXNzbmFtZSBhdHRyaWJ1dGUgb2YgIiArIGdldFRhc2tOYW1lKCkgKyAiIGVsZW1lbnQgIgorICAgICAgICAgICAgICAgICAgICArICJpcyB1bmRlZmluZWQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZERlZmluaXRpb24oYWwsIG5hbWUsIGNsYXNzbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2xhc3NuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIllvdSBtdXN0IG5vdCBzcGVjaWZ5IGNsYXNzbmFtZSAiCisgICAgICAgICAgICAgICAgICAgICsgInRvZ2V0aGVyIHdpdGggZmlsZSBvciByZXNvdXJjZS4iOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRW51bWVyYXRpb24vKjxVUkw+Ki8gdXJscyA9IG51bGw7CisgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVVJMIHVybCA9IGZpbGVUb1VSTCgpOworICAgICAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVybHMgPSBuZXcgRW51bWVyYXRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3JlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cmxzID0gcmVzb3VyY2VUb1VSTHMoYWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAodXJscy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKSB1cmxzLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICBpbnQgZm10ID0gdGhpcy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgaWYgKHVybC50b1N0cmluZygpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZW5kc1dpdGgoIi54bWwiKSkgeworICAgICAgICAgICAgICAgICAgICBmbXQgPSBGb3JtYXQuWE1MOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmbXQgPT0gRm9ybWF0LlBST1BFUlRJRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZFByb3BlcnRpZXMoYWwsIHVybCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVN0YWNrLmdldFN0YWNrKCkuZ2V0KHVybCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBSZWN1cnNpdmUgbG9hZGluZyBvZiAiICsgdXJsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlnbm9yZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGF0ICIgKyBnZXRMb2NhdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9yaWdpbmFsbHkgbG9hZGVkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc291cmNlU3RhY2suZ2V0U3RhY2soKS5nZXQodXJsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VTdGFjay5nZXRTdGFjaygpLnB1dCh1cmwsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRBbnRsaWIoYWwsIHVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlU3RhY2suZ2V0U3RhY2soKS5yZW1vdmUodXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgd2hlcmUgdGhlIGxvZ2ljIHRvIG1hcCBmcm9tIGEgVVJJIHRvIGFuIGFudGxpYiByZXNvdXJjZQorICAgICAqIGlzIGtlcHQuCisgICAgICogQHBhcmFtIHVyaSB0aGUgeG1sIG5hbWVzcGFjZSB1cmkgdGhhdCB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgYSByZXNvdXJjZS4gSXQgbWF5IG5vdCBleGlzdAorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVJlc291cmNlRnJvbVVSSShTdHJpbmcgdXJpKSB7CisgICAgICAgIFN0cmluZyBwYXRoID0gdXJpLnN1YnN0cmluZyhNYWdpY05hbWVzLkFOVExJQl9QUkVGSVgubGVuZ3RoKCkpOworICAgICAgICBTdHJpbmcgcmVzb3VyY2U7CisgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8vIikpIHsKKyAgICAgICAgICAgIC8vaGFuZGxlIG5ldyBzdHlsZSBmdWxsIHBhdGhzIHRvIGFuIGFudGxpYiwgaW4gd2hpY2gKKyAgICAgICAgICAgIC8vYWxsIGJ1dCB0aGUgZm9yd2FyZCBzbGFzaGVzIGFyZSBhbGxvd2VkLgorICAgICAgICAgICAgcmVzb3VyY2UgPSBwYXRoLnN1YnN0cmluZygiLy8iLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGlmICghcmVzb3VyY2UuZW5kc1dpdGgoIi54bWwiKSkgeworICAgICAgICAgICAgICAgIC8vaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IG5hbWVkIGFuIFhNTCBmaWxlLCBpdCBnZXRzIGFudGxpYi54bWwKKyAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlICsgQU5UTElCX1hNTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vY29udmVydCBmcm9tIGEgcGFja2FnZSB0byBhIHBhdGgKKyAgICAgICAgICAgIHJlc291cmNlID0gcGF0aC5yZXBsYWNlKCcuJywgJy8nKSArIEFOVExJQl9YTUw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBmaWxlIHRvIGEgZmlsZTogVVJMLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgVVJMLCBvciBudWxsIGlmIGl0IGlzbid0IHZhbGlkIGFuZCB0aGUgYWN0aXZlIGVycm9yIHBvbGljeQorICAgICAqIGlzIG5vdCB0byByYWlzZSBhIGZhdWx0CisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpcyBtaXNzaW5nL25vdCBhIGZpbGUgYW5kIHRoZQorICAgICAqIHBvbGljeSByZXF1aXJlcyBmYWlsdXJlIGF0IHRoaXMgcG9pbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBVUkwgZmlsZVRvVVJMKCkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgIGlmICghKGZpbGUuZXhpc3RzKCkpKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gIkZpbGUgIiArIGZpbGUgKyAiIGRvZXMgbm90IGV4aXN0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsICYmICEoZmlsZS5pc0ZpbGUoKSkpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSAiICsgZmlsZSArICIgaXMgbm90IGEgZmlsZSI7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS50b1VSTCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICJGaWxlICIgKyBmaWxlICsgIiBjYW5ub3QgdXNlIGFzIFVSTDogIgorICAgICAgICAgICAgICAgICsgZXgudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBIZXJlIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICAgIHN3aXRjaCAob25FcnJvcikgeworICAgICAgICAgICAgY2FzZSBPbkVycm9yLkZBSUxfQUxMOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIGNhc2UgT25FcnJvci5GQUlMOgorICAgICAgICAgICAgICAgIC8vIEZhbGwgVGhyb3VnaAorICAgICAgICAgICAgY2FzZSBPbkVycm9yLlJFUE9SVDoKKyAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9uRXJyb3IuSUdOT1JFOgorICAgICAgICAgICAgICAgIC8vIGxvZyBhdCBhIGxvd2VyIGxldmVsCisgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIHByb2JsZW0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIEVudW1lcmF0aW9uLyo8VVJMPiovIHJlc291cmNlVG9VUkxzKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7CisgICAgICAgIEVudW1lcmF0aW9uIHJldDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldCA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlcyhyZXNvdXJjZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZldGNoIHJlc291cmNlcyBuYW1lZCAiICsgcmVzb3VyY2UsCisgICAgICAgICAgICAgICAgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZXQuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkNvdWxkIG5vdCBsb2FkIGRlZmluaXRpb25zIGZyb20gcmVzb3VyY2UgIgorICAgICAgICAgICAgICAgICsgcmVzb3VyY2UgKyAiLiBJdCBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICAgICAgICAgIHN3aXRjaCAob25FcnJvcikgeworICAgICAgICAgICAgICAgIGNhc2UgT25FcnJvci5GQUlMX0FMTDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGNhc2UgT25FcnJvci5GQUlMOgorICAgICAgICAgICAgICAgIGNhc2UgT25FcnJvci5SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPbkVycm9yLklHTk9SRToKKyAgICAgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIHByb2JsZW0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHR5cGUgZGVmaW5pdGlvbnMgYXMgcHJvcGVydGllcyBmcm9tIGEgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGFsIHRoZSBjbGFzc2xvYWRlciB0byB1c2UKKyAgICAgKiBAcGFyYW0gdXJsIHRoZSB1cmwgdG8gZ2V0IHRoZSBkZWZpbml0aW9ucyBmcm9tCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9hZFByb3BlcnRpZXMoQ2xhc3NMb2FkZXIgYWwsIFVSTCB1cmwpIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXMgPSB1cmwub3BlblN0cmVhbSgpOworICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2coIkNvdWxkIG5vdCBsb2FkIGRlZmluaXRpb25zIGZyb20gIiArIHVybCwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBwcm9wcy5sb2FkKGlzKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBwcm9wcy5rZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIG5hbWUgPSAoKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShuYW1lKTsKKyAgICAgICAgICAgICAgICBhZGREZWZpbml0aW9uKGFsLCBuYW1lLCBjbGFzc25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4LCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFuIGFudGxpYiBmcm9tIGEgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIHRoZSBjbGFzc2xvYWRlciB0byB1c2UuCisgICAgICogQHBhcmFtIHVybCB0aGUgdXJsIHRvIGxvYWQgdGhlIGRlZmluaXRpb25zIGZyb20uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRBbnRsaWIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIFVSTCB1cmwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFudGxpYiBhbnRsaWIgPSBBbnRsaWIuY3JlYXRlQW50bGliKGdldFByb2plY3QoKSwgdXJsLCBnZXRVUkkoKSk7CisgICAgICAgICAgICBhbnRsaWIuc2V0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOworICAgICAgICAgICAgYW50bGliLnNldFVSSShnZXRVUkkoKSk7CisgICAgICAgICAgICBhbnRsaWIuZXhlY3V0ZSgpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgUHJvamVjdEhlbHBlci5hZGRMb2NhdGlvblRvQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgZXgsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSAgdG8gbG9hZAorICAgICAqIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgaWYgKGRlZmluZXJTZXQpIHsKKyAgICAgICAgICAgIHRvb01hbnlEZWZpbml0aW9ucygpOworICAgICAgICB9CisgICAgICAgIGRlZmluZXJTZXQgPSB0cnVlOworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWQKKyAgICAgKiBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmVzIHRoZSByZXNvdXJjZSB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShTdHJpbmcgcmVzKSB7CisgICAgICAgIGlmIChkZWZpbmVyU2V0KSB7CisgICAgICAgICAgICB0b29NYW55RGVmaW5pdGlvbnMoKTsKKyAgICAgICAgfQorICAgICAgICBkZWZpbmVyU2V0ID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbnRsaWIgYXR0cmlidXRlLCBzZXRzIHJlc291cmNlIGFuZCB1cmkuCisgICAgICogdXJpIGlzIHNldCB0aGUgYW50bGliIHZhbHVlIGFuZCwgcmVzb3VyY2UgaXMgc2V0CisgICAgICogdG8gdGhlIGFudGxpYi54bWwgcmVzb3VyY2UgaW4gdGhlIGNsYXNzcGF0aC4KKyAgICAgKiBGb3IgZXhhbXBsZSBhbnRsaWI9ImFudGxpYjpvcmcuYWNtZS5ibGFuZC5jb2xhIgorICAgICAqIGNvcnJlc3BvbmRzIHRvIHVyaT0iYW50bGliOm9yZy5hY21lLmJsYW5kLmNvbGEiCisgICAgICogcmVzb3VyY2U9Im9yZy9hY21lL2JsYW5kL2NvbGEvYW50bGliLnhtbCIuCisgICAgICogQVNGIEJ1Z3ppbGxhIEJ1ZyAzMTk5OQorICAgICAqIEBwYXJhbSBhbnRsaWIgdGhlIHZhbHVlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbnRsaWIoU3RyaW5nIGFudGxpYikgeworICAgICAgICBpZiAoZGVmaW5lclNldCkgeworICAgICAgICAgICAgdG9vTWFueURlZmluaXRpb25zKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhbnRsaWIuc3RhcnRzV2l0aCgiYW50bGliOiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkludmFsaWQgYW50bGliIGF0dHJpYnV0ZSAtIGl0IG11c3Qgc3RhcnQgd2l0aCBhbnRsaWI6Iik7CisgICAgICAgIH0KKyAgICAgICAgc2V0VVJJKGFudGxpYik7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSBhbnRsaWIuc3Vic3RyaW5nKCJhbnRsaWI6Ii5sZW5ndGgoKSkucmVwbGFjZSgnLicsICcvJykKKyAgICAgICAgICAgICsgIi9hbnRsaWIueG1sIjsKKyAgICAgICAgZGVmaW5lclNldCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgZGVmaW5pdGlvbgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZWZpbml0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoZGVmaW5lclNldCkgeworICAgICAgICAgICAgdG9vTWFueURlZmluaXRpb25zKCk7CisgICAgICAgIH0KKyAgICAgICAgZGVmaW5lclNldCA9IHRydWU7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3NuYW1lIG9mIHRoZSBvYmplY3Qgd2UgYXJlIGRlZmluaW5nLgorICAgICAqIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGFzc25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlZmluZWQuCisgICAgICogUmVxdWlyZWQsIHVubGVzcyBmaWxlIG9yIHJlc291cmNlIGhhdmUKKyAgICAgKiBiZWVuIHNwZWNpZmllZC4KKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYWRhcHRlciBjbGFzcy4KKyAgICAgKiBBbiBhZGFwdGVyIGNsYXNzIGlzIHVzZWQgdG8gcHJveHkgdGhlCisgICAgICogZGVmaW5pdGlvbiBjbGFzcy4gSXQgaXMgdXNlZCBpZiB0aGUKKyAgICAgKiBkZWZpbml0aW9uIGNsYXNzIGlzIG5vdCBhc3NpZ25hYmxlIHRvCisgICAgICogdGhlIGFkYXB0dG8gY2xhc3MsIG9yIGlmIHRoZSBhZGFwdHRvCisgICAgICogY2xhc3MgaXMgbm90IHByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciB0aGUgbmFtZSBvZiB0aGUgYWRhcHRlciBjbGFzcworICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihTdHJpbmcgYWRhcHRlcikgeworICAgICAgICB0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRhcHRlciBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyQ2xhc3MgdGhlIGNsYXNzIHRvIHVzZSB0byBhZGFwdCB0aGUgZGVmaW5pdGlvbiBjbGFzcworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEFkYXB0ZXJDbGFzcyhDbGFzcyBhZGFwdGVyQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5hZGFwdGVyQ2xhc3MgPSBhZGFwdGVyQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc25hbWUgb2YgdGhlIGNsYXNzIHRoYXQgdGhlIGRlZmluaXRpb24KKyAgICAgKiBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCwgZWl0aGVyIGRpcmVjdGx5IG9yCisgICAgICogYnkgdXNlIG9mIHRoZSBhZGFwdGVyIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0VG8gdGhlIG5hbWUgb2YgdGhlIGFkYXB0dG8gY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdFRvKFN0cmluZyBhZGFwdFRvKSB7CisgICAgICAgIHRoaXMuYWRhcHRUbyA9IGFkYXB0VG87CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzcyBmb3IgYWRhcHRUb0NsYXNzLCB0byBiZQorICAgICAqIHVzZWQgYnkgZGVyaXZlZCBjbGFzc2VzLCB1c2VkIGluc3RlYWQgb2YKKyAgICAgKiB0aGUgYWRhcHRUbyBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRUb0NsYXNzIHRoZSBjbGFzcyBmb3IgYWRhcHRvLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEFkYXB0VG9DbGFzcyhDbGFzcyBhZGFwdFRvQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5hZGFwdFRvQ2xhc3MgPSBhZGFwdFRvQ2xhc3M7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBkZWZpbml0aW9uIHVzaW5nIHRoZSBhdHRyaWJ1dGVzIG9mIERlZmluZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBhbCB0aGUgQ2xhc3NMb2FkZXIgdG8gdXNlCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlZmluaXRpb24KKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBjbGFzc25hbWUgb2YgdGhlIGRlZmluaXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZERlZmluaXRpb24oQ2xhc3NMb2FkZXIgYWwsIFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NuYW1lKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDbGFzcyBjbCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5hbWUgPSBQcm9qZWN0SGVscGVyLmdlbkNvbXBvbmVudE5hbWUoZ2V0VVJJKCksIG5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgIT0gT25FcnJvci5JR05PUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2wgPSBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSwgdHJ1ZSwgYWwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShhZGFwdGVyLCB0cnVlLCBhbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFkYXB0VG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhZGFwdFRvQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGFkYXB0VG8sIHRydWUsIGFsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSBuZXcgQW50VHlwZURlZmluaXRpb24oKTsKKyAgICAgICAgICAgICAgICBkZWYuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICBkZWYuc2V0Q2xhc3NOYW1lKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgZGVmLnNldENsYXNzKGNsKTsKKyAgICAgICAgICAgICAgICBkZWYuc2V0QWRhcHRlckNsYXNzKGFkYXB0ZXJDbGFzcyk7CisgICAgICAgICAgICAgICAgZGVmLnNldEFkYXB0VG9DbGFzcyhhZGFwdFRvQ2xhc3MpOworICAgICAgICAgICAgICAgIGRlZi5zZXRSZXN0cmljdChyZXN0cmljdCk7CisgICAgICAgICAgICAgICAgZGVmLnNldENsYXNzTG9hZGVyKGFsKTsKKyAgICAgICAgICAgICAgICBpZiAoY2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZWYuY2hlY2tDbGFzcyhnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKGdldFByb2plY3QoKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZERhdGFUeXBlRGVmaW5pdGlvbihkZWYpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGdldFRhc2tOYW1lKCkgKyAiIGNsYXNzICIgKyBjbGFzc25hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBiZSBmb3VuZCI7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgY25mZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBuY2RmZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBnZXRUYXNrTmFtZSgpICsgIiBBIGNsYXNzIG5lZWRlZCBieSBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICsgY2xhc3NuYW1lICsgIiBjYW5ub3QgYmUgZm91bmQ6ICIgKyBuY2RmZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgbmNkZmUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgc3dpdGNoIChvbkVycm9yKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPbkVycm9yLkZBSUxfQUxMOgorICAgICAgICAgICAgICAgIGNhc2UgT25FcnJvci5GQUlMOgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgICAgICBjYXNlIE9uRXJyb3IuUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICBsb2coZXguZ2V0TG9jYXRpb24oKSArICJXYXJuaW5nOiAiICsgZXguZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGxvZyhleC5nZXRMb2NhdGlvbigpICsgZXguZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFuZGxlIHRvbyBtYW55IGRlZmluaXRpb25zIGJ5IHJhaXNpbmcgYW4gZXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWx3YXlzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0b29NYW55RGVmaW5pdGlvbnMoKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJPbmx5IG9uZSBvZiB0aGUgYXR0cmlidXRlcyBuYW1lLCBmaWxlIGFuZCByZXNvdXJjZSIKKyAgICAgICAgICAgICsgIiBjYW4gYmUgc2V0IiwgZ2V0TG9jYXRpb24oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsZXRlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWxldGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM5ZDNlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsZXRlLmphdmEKQEAgLTAsMCArMSw3NDAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuU29ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuUmVzdHJpY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2VJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuUmV2ZXJzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuUmVzb3VyY2VDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuRXhpc3RzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuUmVzb3VyY2VTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuT3JTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQW5kU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLk5vdFNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EYXRlU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuTm9uZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TaXplU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRlcHRoU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRlcGVuZFNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5FeHRlbmRTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0U2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlByZXNlbnRTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQ29udGFpbnNTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZW5hbWVTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuTWFqb3JpdHlTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQ29udGFpbnNSZWdleHBTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yOworCisvKioKKyAqIERlbGV0ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSwgb3Igc2V0IG9mIGZpbGVzIGRlZmluZWQgYnkgYSBmaWxlc2V0LgorICogVGhlIG9yaWdpbmFsIGRlbGV0ZSB0YXNrIHdvdWxkIGRlbGV0ZSBhIGZpbGUsIG9yIGEgc2V0IG9mIGZpbGVzCisgKiB1c2luZyB0aGUgaW5jbHVkZS9leGNsdWRlIHN5bnRheC4gIFRoZSBkZWx0cmVlIHRhc2sgd291bGQgZGVsZXRlIGEKKyAqIGRpcmVjdG9yeSB0cmVlLiAgVGhpcyB0YXNrIGNvbWJpbmVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZXNlIHR3bworICogb3JpZ2luYWxseSBkaXN0aW5jdCB0YXNrcy4KKyAqIDxwPkN1cnJlbnRseSBEZWxldGUgZXh0ZW5kcyBNYXRjaGluZ1Rhc2suICBUaGlzIGlzIGludGVuZGVkIDxpPm9ubHk8L2k+CisgKiB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBhIHJlbGVhc2UuICBUaGUgZnV0dXJlIHBvc2l0aW9uCisgKiBpcyB0byB1c2UgbmVzdGVkIGZpbGVzZXRzIGV4Y2x1c2l2ZWx5LjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuMgorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKKyAqLworcHVibGljIGNsYXNzIERlbGV0ZSBleHRlbmRzIE1hdGNoaW5nVGFzayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEVURV9SRVRSWV9TTEVFUF9NSUxMSVMgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUNvbXBhcmF0b3IgUkVWRVJTRV9GSUxFU1lTVEVNID0gbmV3IFJldmVyc2UobmV3IEZpbGVTeXN0ZW0oKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VTZWxlY3RvciBFWElTVFMgPSBuZXcgRXhpc3RzKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXZlcnNlRGlycyBpbXBsZW1lbnRzIFJlc291cmNlQ29sbGVjdGlvbiB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIFJFVkVSU0UgPSBuZXcgQ29tcGFyYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZm9vLCBPYmplY3QgYmFyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29tcGFyYWJsZSkgZm9vKS5jb21wYXJlVG8oYmFyKSAqIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBwcml2YXRlIEZpbGUgYmFzZWRpcjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBkaXJzOworICAgICAgICBSZXZlcnNlRGlycyhGaWxlIGJhc2VkaXIsIFN0cmluZ1tdIGRpcnMpIHsKKyAgICAgICAgICAgIHRoaXMuYmFzZWRpciA9IGJhc2VkaXI7CisgICAgICAgICAgICB0aGlzLmRpcnMgPSBkaXJzOworICAgICAgICAgICAgQXJyYXlzLnNvcnQodGhpcy5kaXJzLCBSRVZFUlNFKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZUl0ZXJhdG9yKGJhc2VkaXIsIGRpcnMpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIGRpcnMubGVuZ3RoOyB9CisgICAgfQorCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgRmlsZSBkaXIgPSBudWxsOworICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlZE1hdGNoaW5nVGFzayA9IGZhbHNlOworICAgIC8vIGJ5IGRlZmF1bHQsIHJlbW92ZSBtYXRjaGluZyBlbXB0eSBkaXJzCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUVtcHR5ID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGludCB2ZXJib3NpdHkgPSBQcm9qZWN0Lk1TR19WRVJCT1NFOworICAgIHByaXZhdGUgYm9vbGVhbiBxdWlldCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsb25lcnJvciA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZU9uRXhpdCA9IGZhbHNlOworICAgIHByaXZhdGUgUmVzb3VyY2VzIHJjcyA9IG51bGw7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiBhIHNpbmdsZSBmaWxlIHRvIGJlIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBiZSBkZWxldGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGZpbGVzIGFyZSB0byBiZSBkZWxldGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkaXIpIHsKKyAgICAgICAgdGhpcy5kaXIgPSBkaXI7CisgICAgICAgIGdldEltcGxpY2l0RmlsZVNldCgpLnNldERpcihkaXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGxpc3QgYWxsIG5hbWVzIG9mIGRlbGV0ZWQgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyYm9zZSAidHJ1ZSIgb3IgIm9uIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7CisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IFByb2plY3QuTVNHX0lORk87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IFByb2plY3QuTVNHX1ZFUkJPU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlIGFuZCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgZG8gbm90IGRpc3BsYXkgYSBkaWFnbm9zdGljCisgICAgICogbWVzc2FnZSBvciBtb2RpZnkgdGhlIGV4aXQgc3RhdHVzIHRvIHJlZmxlY3QgYW4gZXJyb3IuCisgICAgICogVGhpcyBtZWFucyB0aGF0IGlmIGEgZmlsZSBvciBkaXJlY3RvcnkgY2Fubm90IGJlIGRlbGV0ZWQsCisgICAgICogdGhlbiBubyBlcnJvciBpcyByZXBvcnRlZC4gVGhpcyBzZXR0aW5nIGVtdWxhdGVzIHRoZQorICAgICAqIC1mIG9wdGlvbiB0byB0aGUgVW5peCAmcXVvdDtybSZxdW90OyBjb21tYW5kLgorICAgICAqIERlZmF1bHQgaXMgZmFsc2UgbWVhbmluZyB0aGluZ3MgYXJlICZxdW90O25vaXN5JnF1b3Q7CisgICAgICogQHBhcmFtIHF1aWV0ICJ0cnVlIiBvciAib24iCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVpZXQoYm9vbGVhbiBxdWlldCkgeworICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7CisgICAgICAgIGlmIChxdWlldCkgeworICAgICAgICAgICAgdGhpcy5mYWlsb25lcnJvciA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgZmFsc2UsIG5vdGUgZXJyb3JzIGJ1dCBjb250aW51ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWlsb25lcnJvciB0cnVlIG9yIGZhbHNlCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgIHRoaXMuZmFpbG9uZXJyb3IgPSBmYWlsb25lcnJvcjsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgb24gZmFpbHVyZSB0byBkZWxldGUsIG5vdGUgdGhlIGVycm9yIGFuZCBzZXQKKyAgICAgKiB0aGUgZGVsZXRlb25leGl0IGZsYWcsIGFuZCBjb250aW51ZQorICAgICAqCisgICAgICogQHBhcmFtIGRlbGV0ZU9uRXhpdCB0cnVlIG9yIGZhbHNlCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldERlbGV0ZU9uRXhpdChib29sZWFuIGRlbGV0ZU9uRXhpdCkgeworICAgICAgICAgdGhpcy5kZWxldGVPbkV4aXQgPSBkZWxldGVPbkV4aXQ7CisgICAgIH0KKworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZGVsZXRlIGVtcHR5IGRpcmVjdG9yaWVzLgorICAgICAqIEBwYXJhbSBpbmNsdWRlRW1wdHkgaWYgdHJ1ZSBkZWxldGUgZW1wdHkgZGlyZWN0b3JpZXMgKG9ubHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGZvciBmaWxlc2V0cykuIERlZmF1bHQgaXMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZUVtcHR5RGlycyhib29sZWFuIGluY2x1ZGVFbXB0eSkgeworICAgICAgICB0aGlzLmluY2x1ZGVFbXB0eSA9IGluY2x1ZGVFbXB0eTsKKyAgICB9CisKKyAgIC8qKgorICAgICogQWRkcyBhIHNldCBvZiBmaWxlcyB0byBiZSBkZWxldGVkLgorICAgICogQHBhcmFtIHNldCB0aGUgc2V0IG9mIGZpbGVzIHRvIGJlIGRlbGV0ZWQKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKKyAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhcmJpdHJhcnkgUmVzb3VyY2VDb2xsZWN0aW9uIHRvIGJlIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHJjIHRoZSBmaWxlc3lzdGVtLW9ubHkgUmVzb3VyY2VDb2xsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgaWYgKHJjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByY3MgPSAocmNzID09IG51bGwpID8gbmV3IFJlc291cmNlcygpIDogcmNzOworICAgICAgICByY3MuYWRkKHJjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGxpc3QKKyAgICAgKiBAcmV0dXJuIGEgTmFtZUVudHJ5IG9iamVjdCB0byBiZSBjb25maWd1cmVkCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGUoKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlSW5jbHVkZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgZmlsZXMgbGlzdAorICAgICAqIEByZXR1cm4gYW4gTmFtZUVudHJ5IG9iamVjdCB0byBiZSBjb25maWd1cmVkCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGVzRmlsZSgpIHsKKyAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CisgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVJbmNsdWRlc0ZpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBleGNsdWRlIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIE5hbWVFbnRyeSBvYmplY3QgdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgeworICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUV4Y2x1ZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIE5hbWVFbnRyeSBvYmplY3QgdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlc0ZpbGUoKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlRXhjbHVkZXNGaWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgc2V0IG9mIHBhdHRlcm5zCisgICAgICogQHJldHVybiBQYXR0ZXJuU2V0IG9iamVjdCB0byBiZSBjb25maWd1cmVkCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5TZXQgY3JlYXRlUGF0dGVyblNldCgpIHsKKyAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CisgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVQYXR0ZXJuU2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorICAgICAqIG9yIGEgc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorICAgICAqIG9yIGEgc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nIGV4Y2x1ZGVzKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5zZXRFeGNsdWRlcyhleGNsdWRlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlRGVmYXVsdEV4Y2x1ZGVzICJ0cnVlInwib24ifCJ5ZXMiIHdoZW4gZGVmYXVsdCBleGNsdXNpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCwgImZhbHNlInwib2ZmInwibm8iIHdoZW4gdGhleQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkbid0IGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdGV4Y2x1ZGVzKGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5zZXREZWZhdWx0ZXhjbHVkZXModXNlRGVmYXVsdEV4Y2x1ZGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVzZmlsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlbmFtZSB0byBmZXRjaAorICAgICAqIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGZyb20uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXNmaWxlKEZpbGUgaW5jbHVkZXNmaWxlKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5zZXRJbmNsdWRlc2ZpbGUoaW5jbHVkZXNmaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2x1ZGVzZmlsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlbmFtZSB0byBmZXRjaAorICAgICAqIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGZyb20uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXNmaWxlKEZpbGUgZXhjbHVkZXNmaWxlKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5zZXRFeGNsdWRlc2ZpbGUoZXhjbHVkZXNmaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIGZpbGUgc3lzdGVtCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlICJ0cnVlInwib24ifCJ5ZXMiIGlmIGZpbGUgc3lzdGVtIGlzIGNhc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNpdGl2ZSwgImZhbHNlInwib2ZmInwibm8iIHdoZW4gbm90LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CisgICAgICAgIHN1cGVyLnNldENhc2VTZW5zaXRpdmUoaXNDYXNlU2Vuc2l0aXZlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IHN5bWJvbGljIGxpbmtzIHNob3VsZCBiZSBmb2xsb3dlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmb2xsb3dTeW1saW5rcyB3aGV0aGVyIG9yIG5vdCBzeW1ib2xpYyBsaW5rcyBzaG91bGQgYmUgZm9sbG93ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb2xsb3dTeW1saW5rcyhib29sZWFuIGZvbGxvd1N5bWxpbmtzKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5zZXRGb2xsb3dTeW1saW5rcyhmb2xsb3dTeW1saW5rcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgIlNlbGVjdCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VsZWN0b3IoU2VsZWN0U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CisgICAgICAgIHN1cGVyLmFkZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW4gIkFuZCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQW5kKEFuZFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5hZGRBbmQoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbiAiT3IiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9yKE9yU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CisgICAgICAgIHN1cGVyLmFkZE9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSAiTm90IiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGROb3QoTm90U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CisgICAgICAgIHN1cGVyLmFkZE5vdChzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgIk5vbmUiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE5vbmUoTm9uZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5hZGROb25lKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBtYWpvcml0eSBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNYWpvcml0eShNYWpvcml0eVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5hZGRNYWpvcml0eShzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgc2VsZWN0b3IgZGF0ZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREYXRlKERhdGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuYWRkRGF0ZShzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgc2VsZWN0b3Igc2l6ZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTaXplKFNpemVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuYWRkU2l6ZShzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgc2VsZWN0b3IgZmlsZW5hbWUgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZW5hbWUoRmlsZW5hbWVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuYWRkRmlsZW5hbWUoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbiBleHRlbmRlZCBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDdXN0b20oRXh0ZW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CisgICAgICAgIHN1cGVyLmFkZEN1c3RvbShzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgY29udGFpbnMgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29udGFpbnMoQ29udGFpbnNTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuYWRkQ29udGFpbnMoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIHByZXNlbnQgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJlc2VudChQcmVzZW50U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CisgICAgICAgIHN1cGVyLmFkZFByZXNlbnQoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIGRlcHRoIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERlcHRoKERlcHRoU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CisgICAgICAgIHN1cGVyLmFkZERlcHRoKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBkZXBlbmRzIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERlcGVuZChEZXBlbmRTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuYWRkRGVwZW5kKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSByZWd1bGFyIGV4cHJlc3Npb24gc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29udGFpbnNSZWdleHAoQ29udGFpbnNSZWdleHBTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuYWRkQ29udGFpbnNSZWdleHAoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCB0aGUgbW9kaWZpZWQgc2VsZWN0b3IKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTW9kaWZpZWQoTW9kaWZpZWRTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuYWRkTW9kaWZpZWQoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbiBhcmJpdHJhcnkgc2VsZWN0b3IKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGJlIGFkZGVkCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOworICAgICAgICBzdXBlci5hZGQoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgZmlsZShzKS4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodXNlZE1hdGNoaW5nVGFzaykgeworICAgICAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVXNlIG9mIHRoZSBpbXBsaWNpdCBGaWxlU2V0IGlzIGRlcHJlY2F0ZWQuICAiCisgICAgICAgICAgICAgICAgKyAiVXNlIGEgbmVzdGVkIGZpbGVzZXQgZWxlbWVudCBpbnN0ZWFkLiIsIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IHZlcmJvc2l0eSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsZSA9PSBudWxsICYmIGRpciA9PSBudWxsICYmIGZpbGVzZXRzLnNpemUoKSA9PSAwICYmIHJjcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBvZiB0aGUgZmlsZSBvciBkaXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZXMsIG9yIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtdXN0IGJlIHNldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWlldCAmJiBmYWlsb25lcnJvcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJxdWlldCBhbmQgZmFpbG9uZXJyb3IgY2Fubm90IGJvdGggYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNldCB0byB0cnVlIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZWxldGUgdGhlIHNpbmdsZSBmaWxlCisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkRpcmVjdG9yeSAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBiZSByZW1vdmVkIHVzaW5nIHRoZSBmaWxlIGF0dHJpYnV0ZS4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBkaXIgaW5zdGVhZC4iLCBxdWlldCA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiB2ZXJib3NpdHkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiRGVsZXRpbmc6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbGV0ZShmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coIkNvdWxkIG5vdCBmaW5kIGZpbGUgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHRvIGRlbGV0ZS4iLCBxdWlldCA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiB2ZXJib3NpdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZGVsZXRlIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgaWYgKGRpciAhPSBudWxsICYmIGRpci5leGlzdHMoKSAmJiBkaXIuaXNEaXJlY3RvcnkoKQorICAgICAgICAgICAgJiYgIXVzZWRNYXRjaGluZ1Rhc2spIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICBJZiB2ZXJib3NpdHkgaXMgTVNHX1ZFUkJPU0UsIHRoYXQgbWVhbiB3ZSBhcmUgZG9pbmcKKyAgICAgICAgICAgICAgIHJlZ3VsYXIgbG9nZ2luZyAoYmFja3dhcmRzIGFzIHRoYXQgc291bmRzKS4gIEluIHRoYXQKKyAgICAgICAgICAgICAgIGNhc2UsIHdlIHdhbnQgdG8gcHJpbnQgb25lIG1lc3NhZ2UgYWJvdXQgZGVsZXRpbmcgdGhlCisgICAgICAgICAgICAgICB0b3Agb2YgdGhlIGRpcmVjdG9yeSB0cmVlLiAgT3RoZXJ3aXNlLCB0aGUgcmVtb3ZlRGlyCisgICAgICAgICAgICAgICBtZXRob2Qgd2lsbCBoYW5kbGUgbWVzc2FnZXMgZm9yIF9hbGxfIGRpcmVjdG9yaWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodmVyYm9zaXR5ID09IFByb2plY3QuTVNHX1ZFUkJPU0UpIHsKKyAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW92ZURpcihkaXIpOworICAgICAgICB9CisgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXNUb0RlbGV0ZSA9IG5ldyBSZXNvdXJjZXMoKTsKKyAgICAgICAgcmVzb3VyY2VzVG9EZWxldGUuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICBSZXNvdXJjZXMgZmlsZXNldERpcnMgPSBuZXcgUmVzb3VyY2VzKCk7CisgICAgICAgIGZpbGVzZXREaXJzLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgRmlsZVNldCBpbXBsaWNpdCA9IG51bGw7CisgICAgICAgIGlmICh1c2VkTWF0Y2hpbmdUYXNrICYmIGRpciAhPSBudWxsICYmIGRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAvL2FkZCB0aGUgZmlsZXMgZnJvbSB0aGUgZGVmYXVsdCBmaWxlc2V0OgorICAgICAgICAgICAgaW1wbGljaXQgPSBnZXRJbXBsaWNpdEZpbGVTZXQoKTsKKyAgICAgICAgICAgIGltcGxpY2l0LnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGZpbGVzZXRzLmFkZChpbXBsaWNpdCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGZpbGVzZXRzLnNpemUoKTsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoZnMuZ2V0UHJvamVjdCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGZpbGVzZXQgd2l0aCBubyBwcm9qZWN0IHNwZWNpZmllZDsiCisgICAgICAgICAgICAgICAgICAgICsgIiBhc3N1bWluZyBleGVjdXRpbmcgcHJvamVjdCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIGZzID0gKEZpbGVTZXQpIGZzLmNsb25lKCk7CisgICAgICAgICAgICAgICAgZnMuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZSBmc0RpciA9IGZzLmdldERpcigpOworICAgICAgICAgICAgaWYgKGZzRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBvciBSZXNvdXJjZSB3aXRob3V0IGRpcmVjdG9yeSBvciBmaWxlIHNwZWNpZmllZCIpOworICAgICAgICAgICAgfSBlbHNlIGlmICghZnNEaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGhhbmRsZSgiRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiIgKyBmc0Rpcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc291cmNlc1RvRGVsZXRlLmFkZChmcyk7CisgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVFbXB0eSkgeworICAgICAgICAgICAgICAgICAgICBmaWxlc2V0RGlycy5hZGQobmV3IFJldmVyc2VEaXJzKGZzRGlyLCBmcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREaXJlY3RvcnlTY2FubmVyKCkuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc291cmNlc1RvRGVsZXRlLmFkZChmaWxlc2V0RGlycyk7CisgICAgICAgIGlmIChyY3MgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gc29ydCBmaXJzdCB0byBmaWxlcywgdGhlbiBkaXJzCisgICAgICAgICAgICBSZXN0cmljdCBleGlzdHMgPSBuZXcgUmVzdHJpY3QoKTsKKyAgICAgICAgICAgIGV4aXN0cy5hZGQoRVhJU1RTKTsKKyAgICAgICAgICAgIGV4aXN0cy5hZGQocmNzKTsKKyAgICAgICAgICAgIFNvcnQgcyA9IG5ldyBTb3J0KCk7CisgICAgICAgICAgICBzLmFkZChSRVZFUlNFX0ZJTEVTWVNURU0pOworICAgICAgICAgICAgcy5hZGQoZXhpc3RzKTsKKyAgICAgICAgICAgIHJlc291cmNlc1RvRGVsZXRlLmFkZChzKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHJlc291cmNlc1RvRGVsZXRlLmlzRmlsZXN5c3RlbU9ubHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlc1RvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBGaWxlUmVzb3VyY2UgciA9IChGaWxlUmVzb3VyY2UpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAvLyBub25leGlzdGVudCByZXNvdXJjZXMgY291bGQgb25seSBvY2N1ciBpZiB3ZSBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWQgc29tZXRoaW5nIGZyb20gYSBmaWxlc2V0OgorICAgICAgICAgICAgICAgICAgICBpZiAoIXIuaXNFeGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoci5pc0RpcmVjdG9yeSgpKSB8fCByLmdldEZpbGUoKS5saXN0KCkubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGVsZXRpbmcgIiArIHIsIHZlcmJvc2l0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbGV0ZShyLmdldEZpbGUoKSkgJiYgZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUoIlVuYWJsZSB0byBkZWxldGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChyLmlzRGlyZWN0b3J5KCkgPyAiZGlyZWN0b3J5ICIgOiAiZmlsZSAiKSArIHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgaGFuZGxlKGdldFRhc2tOYW1lKCkgKyAiIGhhbmRsZXMgb25seSBmaWxlc3lzdGVtIHJlc291cmNlcyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGltcGxpY2l0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaWxlc2V0cy5yZW1vdmUoaW1wbGljaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gIHByb3RlY3RlZCBhbmQgcHJpdmF0ZSBtZXRob2RzCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZShTdHJpbmcgbXNnKSB7CisgICAgICAgIGhhbmRsZShuZXcgQnVpbGRFeGNlcHRpb24obXNnKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZShFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAoZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgIHRocm93IChlIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgPyAoQnVpbGRFeGNlcHRpb24pIGUgOiBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgbG9nKGUsIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IHZlcmJvc2l0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjb21tb2RhdGUgV2luZG93cyBidWcgZW5jb3VudGVyZWQgaW4gYm90aCBTdW4gYW5kIElCTSBKREtzLgorICAgICAqIE90aGVycyBwb3NzaWJsZS4gSWYgdGhlIGRlbGV0ZSBkb2VzIG5vdCB3b3JrLCBjYWxsIFN5c3RlbS5nYygpLAorICAgICAqIHdhaXQgYSBsaXR0bGUgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsZXRlKEZpbGUgZikgeworICAgICAgICBpZiAoIWYuZGVsZXRlKCkpIHsKKyAgICAgICAgICAgIGlmIChPcy5pc0ZhbWlseSgid2luZG93cyIpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmdjKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChERUxFVEVfUkVUUllfU0xFRVBfTUlMTElTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlIEV4Y2VwdGlvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZU9uRXhpdCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBxdWlldCA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiBQcm9qZWN0Lk1TR19JTkZPOworICAgICAgICAgICAgICAgICAgICBsb2coIkZhaWxlZCB0byBkZWxldGUgIiArIGYgKyAiLCBjYWxsaW5nIGRlbGV0ZU9uRXhpdC4iCisgICAgICAgICAgICAgICAgICAgICAgICArICIgVGhpcyBhdHRlbXB0cyB0byBkZWxldGUgdGhlIGZpbGUgd2hlbiB0aGUgQW50IGp2bSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBoYXMgZXhpdGVkIGFuZCBtaWdodCBub3Qgc3VjY2VlZC4iLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGYuZGVsZXRlT25FeGl0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgZGlyZWN0b3J5CisgICAgICoKKyAgICAgKiBAcGFyYW0gZCB0aGUgZGlyZWN0b3J5IHRvIGRlbGV0ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZURpcihGaWxlIGQpIHsKKyAgICAgICAgU3RyaW5nW10gbGlzdCA9IGQubGlzdCgpOworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBsaXN0ID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gbGlzdFtpXTsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGQsIHMpOworICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZURpcihmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJEZWxldGluZyAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwgcXVpZXQgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogdmVyYm9zaXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoIWRlbGV0ZShmKSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGUoIlVuYWJsZSB0byBkZWxldGUgZmlsZSAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZygiRGVsZXRpbmcgZGlyZWN0b3J5ICIgKyBkLmdldEFic29sdXRlUGF0aCgpLCB2ZXJib3NpdHkpOworICAgICAgICBpZiAoIWRlbGV0ZShkKSkgeworICAgICAgICAgICAgaGFuZGxlKCJVbmFibGUgdG8gZGVsZXRlIGRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSBhbiBhcnJheSBvZiBmaWxlcyBpbiBhIGRpcmVjdG9yeSwgYW5kIGEgbGlzdCBvZiBzdWJkaXJlY3RvcmllcworICAgICAqIHdoaWNoIHdpbGwgb25seSBiZSBkZWxldGVkIGlmICdpbmNsdWRlRW1wdHknIGlzIHRydWUKKyAgICAgKiBAcGFyYW0gZCBkaXJlY3RvcnkgdG8gd29yayBmcm9tCisgICAgICogQHBhcmFtIGZpbGVzIGFycmF5IG9mIGZpbGVzIHRvIGRlbGV0ZTsgY2FuIGJlIG9mIHplcm8gbGVuZ3RoCisgICAgICogQHBhcmFtIGRpcnMgYXJyYXkgb2YgZGlyZWN0b3JpZXMgdG8gZGVsZXRlOyBjYW4gb2YgemVybyBsZW5ndGgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVGaWxlcyhGaWxlIGQsIFN0cmluZ1tdIGZpbGVzLCBTdHJpbmdbXSBkaXJzKSB7CisgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBsb2coIkRlbGV0aW5nICIgKyBmaWxlcy5sZW5ndGggKyAiIGZpbGVzIGZyb20gIgorICAgICAgICAgICAgICAgICsgZC5nZXRBYnNvbHV0ZVBhdGgoKSwgcXVpZXQgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogdmVyYm9zaXR5KTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkLCBmaWxlc1tqXSk7CisgICAgICAgICAgICAgICAgbG9nKCJEZWxldGluZyAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IHZlcmJvc2l0eSk7CisgICAgICAgICAgICAgICAgaWYgKCFkZWxldGUoZikpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDAgJiYgaW5jbHVkZUVtcHR5KSB7CisgICAgICAgICAgICBpbnQgZGlyQ291bnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IGRpcnMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICBGaWxlIGN1cnJEaXIgPSBuZXcgRmlsZShkLCBkaXJzW2pdKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBkaXJGaWxlcyA9IGN1cnJEaXIubGlzdCgpOworICAgICAgICAgICAgICAgIGlmIChkaXJGaWxlcyA9PSBudWxsIHx8IGRpckZpbGVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiRGVsZXRpbmcgIiArIGN1cnJEaXIuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogdmVyYm9zaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWxldGUoY3VyckRpcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSgiVW5hYmxlIHRvIGRlbGV0ZSBkaXJlY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRpckNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGxvZygiRGVsZXRlZCAiCisgICAgICAgICAgICAgICAgICAgICArIGRpckNvdW50CisgICAgICAgICAgICAgICAgICAgICArICIgZGlyZWN0b3IiICsgKGRpckNvdW50ID09IDEgPyAieSIgOiAiaWVzIikKKyAgICAgICAgICAgICAgICAgICAgICsgIiBmb3JtICIgKyBkLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgcXVpZXQgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogdmVyYm9zaXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmIwMjIxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsdHJlZS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisvKioKKyAqCisgKgorICogQHNpbmNlIEFudCAxLjEKKyAqCisgKiBAZGVwcmVjYXRlZCBUaGUgZGVsdHJlZSB0YXNrIGlzIGRlcHJlY2F0ZWQgc2luY2UgQW50IDEuMi4gIFVzZQorICogZGVsZXRlIGluc3RlYWQuCisgKi8KKworcHVibGljIGNsYXNzIERlbHRyZWUgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgRmlsZSBkaXI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSB0byBiZSBkZWxldGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSByb290IG9mIHRoZSB0cmVlIHRvIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgZGlyKSB7CisgICAgICAgIHRoaXMuZGlyID0gZGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHRoZSB3b3JrLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgdGFzayBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkgb3IKKyAgICAgKiB0aGUgdHJlZSBjYW5ub3QgYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIGRlbHRyZWUgdGFzayBpcyBkZXByZWNhdGVkLiAgIgorICAgICAgICAgICAgKyAiVXNlIGRlbGV0ZSBpbnN0ZWFkLiIpOworCisgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkaXIgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGlmICghZGlyLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGRlbGV0ZSBkaXJlY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2coIkRlbGV0aW5nOiAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZW1vdmVEaXIoZGlyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVW5hYmxlIHRvIGRlbGV0ZSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZURpcihGaWxlIGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZ2l2ZW4gZGlyIGlzbid0IGEgc3ltbGluaworICAgICAgICAvLyB0aGUgY29tcGFyaXNvbiBvZiBhYnNvbHV0ZSBwYXRoIGFuZCBjYW5vbmljYWwgcGF0aAorICAgICAgICAvLyBjYXRjaGVzIHRoaXMKKworICAgICAgICAvLyAgICAgICAgaWYgKGRpci5nZXRDYW5vbmljYWxQYXRoKCkuZXF1YWxzKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKKyAgICAgICAgLy8gKGNvc3RpbikgSXQgd2lsbCBub3Qgd29yayBpZiAvaG9tZS9jb3N0aW4gaXMgc3ltbGluayB0bworICAgICAgICAvLyAvZGEwL2hvbWUvY29zdGluICggdGF6IGZvciBleGFtcGxlICkKKyAgICAgICAgU3RyaW5nW10gbGlzdCA9IGRpci5saXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBsaXN0W2ldOworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBzKTsKKyAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVEaXIoZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghZi5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBkZWxldGUgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGYuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWRpci5kZWxldGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZXBlbmRTZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlcGVuZFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDE2YWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZXBlbmRTZXQuamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5UaW1lQ29tcGFyaXNvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlVuaW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5SZXN0cmljdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5Ob3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5FeGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5SZXNvdXJjZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycy5SZXZlcnNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycy5SZXNvdXJjZUNvbXBhcmF0b3I7CisKKy8qKgorICogRXhhbWluZXMgYW5kIHJlbW92ZXMgb3V0IG9mIGRhdGUgdGFyZ2V0IGZpbGVzLiAgSWYgYW55IG9mIHRoZSB0YXJnZXQgZmlsZXMKKyAqIGFyZSBvdXQgb2YgZGF0ZSB3aXRoIHJlc3BlY3QgdG8gYW55IG9mIHRoZSBzb3VyY2UgZmlsZXMsIGFsbCB0YXJnZXQKKyAqIGZpbGVzIGFyZSByZW1vdmVkLiAgVGhpcyBpcyB1c2VmdWwgd2hlcmUgZGVwZW5kZW5jaWVzIGNhbm5vdCBiZQorICogY29tcHV0ZWQgKGZvciBleGFtcGxlLCBkeW5hbWljYWxseSBpbnRlcnByZXRlZCBwYXJhbWV0ZXJzIG9yIGZpbGVzCisgKiB0aGF0IG5lZWQgdG8gc3RheSBpbiBzeW5jaCBidXQgYXJlIG5vdCBkaXJlY3RseSBsaW5rZWQpIG9yIHdoZXJlCisgKiB0aGUgYW50IHRhc2sgaW4gcXVlc3Rpb24gY291bGQgY29tcHV0ZSB0aGVtIGJ1dCBkb2VzIG5vdCAoZm9yCisgKiBleGFtcGxlLCB0aGUgbGlua2VkIERURCBmb3IgYW4gWE1MIGZpbGUgdXNpbmcgdGhlIFhTTFQgdGFzaykuCisgKgorICogbmVzdGVkIGFyZ3VtZW50czoKKyAqIDx1bD4KKyAqIDxsaT5zb3VyY2VzICAgICAgICAocmVzb3VyY2UgdW5pb24gZGVzY3JpYmluZyB0aGUgc291cmNlIHJlc291cmNlcyB0byBleGFtaW5lKQorICogPGxpPnNyY2ZpbGVzZXQgICAgIChmaWxlc2V0IGRlc2NyaWJpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBleGFtaW5lKQorICogPGxpPnNyY2ZpbGVsaXN0ICAgIChmaWxlbGlzdCBkZXNjcmliaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gZXhhbWluZSkKKyAqIDxsaT50YXJnZXRzICAgICAgICAocGF0aCBkZXNjcmliaW5nIHRoZSB0YXJnZXQgZmlsZXMgdG8gZXhhbWluZSkKKyAqIDxsaT50YXJnZXRmaWxlc2V0ICAoZmlsZXNldCBkZXNjcmliaW5nIHRoZSB0YXJnZXQgZmlsZXMgdG8gZXhhbWluZSkKKyAqIDxsaT50YXJnZXRmaWxlbGlzdCAoZmlsZWxpc3QgZGVzY3JpYmluZyB0aGUgdGFyZ2V0IGZpbGVzIHRvIGV4YW1pbmUpCisgKiA8L3VsPgorICogQXQgbGVhc3Qgb25lIG9mIGJvdGggc291cmNlIGFuZCB0YXJnZXQgZW50aXRpZXMgaXMgcmVxdWlyZWQuCisgKiA8cD4KKyAqIFRoaXMgdGFzayB3aWxsIGV4YW1pbmUgZWFjaCBvZiB0aGUgc291cmNlcyBhZ2FpbnN0IGVhY2ggb2YgdGhlIHRhcmdldCBmaWxlcy4gSWYKKyAqIGFueSB0YXJnZXQgZmlsZXMgYXJlIG91dCBvZiBkYXRlIHdpdGggcmVzcGVjdCB0byBhbnkgb2YgdGhlIHNvdXJjZXMsIGFsbCB0YXJnZXRzCisgKiBhcmUgcmVtb3ZlZC4gSWYgYW55IHNvdXJjZXMgb3IgdGFyZ2V0cyBkbyBub3QgZXhpc3QsIGFsbCB0YXJnZXRzIGFyZSByZW1vdmVkLgorICogSGludDogSWYgbWlzc2luZyBmaWxlcyBzaG91bGQgYmUgaWdub3JlZCwgc3BlY2lmeSB0aGVtIGFzIGluY2x1ZGUgcGF0dGVybnMKKyAqIGluIGZpbGVzZXRzLCByYXRoZXIgdGhhbiB1c2luZyBmaWxlbGlzdHMuCisgKiA8L3A+PHA+CisgKiBUaGlzIHRhc2sgYXR0ZW1wdHMgdG8gb3B0aW1pemUgc3BlZWQgb2YgZGVwZW5kZW5jeSBjaGVja2luZworICogYnkgY29tcGFyaW5nIG9ubHkgdGhlIGRhdGVzIG9mIHRoZSBvbGRlc3QgdGFyZ2V0IGZpbGUgYW5kIHRoZSBuZXdlc3Qgc291cmNlLgorICogPC9wPjxwPgorICogRXhhbXBsZSB1c2VzOgorICogPHVsPjxsaT4KKyAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGFuIFhNTCBmaWxlIG11c3QgYmUgdXAgdG8gZGF0ZSB3aXRoIHJlc3BlY3QgdG8gaXRzIFhTRAorICogKFNjaGVtYSBmaWxlKSwgZXZlbiB0aG91Z2ggdGhlIFhNTCBmaWxlIGl0c2VsZiBpbmNsdWRlcyBubyByZWZlcmVuY2UgdG8gaXRzIFhTRC4KKyAqIDwvbGk+PGxpPgorICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYW4gWFNMIHN0eWxlc2hlZXQgaW5jbHVkZXMgb3RoZXIgc3ViLXN0eWxlc2hlZXRzCisgKiA8L2xpPjxsaT4KKyAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGphdmEgZmlsZXMgbXVzdCBiZSByZWNvbXBpbGVkIGlmIHRoZSBhbnQgYnVpbGQgZmlsZSBjaGFuZ2VzCisgKiA8L2xpPjwvdWw+CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgorICogQHNpbmNlIEFudCAxLjQKKyAqLworcHVibGljIGNsYXNzIERlcGVuZFNldCBleHRlbmRzIE1hdGNoaW5nVGFzayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVNlbGVjdG9yIE5PVF9FWElTVFMgPSBuZXcgTm90KG5ldyBFeGlzdHMoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VDb21wYXJhdG9yIERBVEUKKyAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzLkRhdGUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUNvbXBhcmF0b3IgUkVWRVJTRV9EQVRFID0gbmV3IFJldmVyc2UoREFURSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOb25FeGlzdGVudCBleHRlbmRzIFJlc3RyaWN0IHsKKyAgICAgICAgcHJpdmF0ZSBOb25FeGlzdGVudChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgICAgIHN1cGVyLmFkZChyYyk7CisgICAgICAgICAgICBzdXBlci5hZGQoTk9UX0VYSVNUUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBIaWRlTWlzc2luZ0Jhc2VkaXIKKyAgICAgICAgaW1wbGVtZW50cyBSZXNvdXJjZUNvbGxlY3Rpb24geworICAgICAgICBwcml2YXRlIEZpbGVTZXQgZnM7CisKKyAgICAgICAgcHJpdmF0ZSBIaWRlTWlzc2luZ0Jhc2VkaXIoRmlsZVNldCBmcykgeworICAgICAgICAgICAgdGhpcy5mcyA9IGZzOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlZGlyRXhpc3RzKCkgPyBmcy5pdGVyYXRvcigpIDogUmVzb3VyY2VzLkVNUFRZX0lURVJBVE9SOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlZGlyRXhpc3RzKCkgPyBmcy5zaXplKCkgOiAwOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGJvb2xlYW4gYmFzZWRpckV4aXN0cygpIHsKKyAgICAgICAgICAgIEZpbGUgYmFzZWRpciA9IGZzLmdldERpcigpOworICAgICAgICAgICAgLy90cmljayB0byBldm9rZSAiYmFzZWRpciBub3Qgc2V0IiBpZiBudWxsOgorICAgICAgICAgICAgcmV0dXJuIGJhc2VkaXIgPT0gbnVsbCB8fCBiYXNlZGlyLmV4aXN0cygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBVbmlvbiBzb3VyY2VzID0gbnVsbDsKKyAgICBwcml2YXRlIFBhdGggdGFyZ2V0cyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXN0ZWQgc291cmNlcyBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYSBVbmlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFVuaW9uIGNyZWF0ZVNvdXJjZXMoKSB7CisgICAgICAgIHNvdXJjZXMgPSAoc291cmNlcyA9PSBudWxsKSA/IG5ldyBVbmlvbigpIDogc291cmNlczsKKyAgICAgICAgcmV0dXJuIHNvdXJjZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIHNvdXJjZSBmaWxlcy4KKyAgICAgKiBAcGFyYW0gZnMgdGhlIEZpbGVTZXQgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNyY2ZpbGVzZXQoRmlsZVNldCBmcykgeworICAgICAgICBjcmVhdGVTb3VyY2VzKCkuYWRkKGZzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0IG9mIHNvdXJjZSBmaWxlcy4KKyAgICAgKiBAcGFyYW0gZmwgdGhlIEZpbGVMaXN0IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTcmNmaWxlbGlzdChGaWxlTGlzdCBmbCkgeworICAgICAgICBjcmVhdGVTb3VyY2VzKCkuYWRkKGZsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXN0ZWQgdGFyZ2V0cyBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYSBVbmlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFBhdGggY3JlYXRlVGFyZ2V0cygpIHsKKyAgICAgICAgdGFyZ2V0cyA9ICh0YXJnZXRzID09IG51bGwpID8gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKSA6IHRhcmdldHM7CisgICAgICAgIHJldHVybiB0YXJnZXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNldCBvZiB0YXJnZXQgZmlsZXMuCisgICAgICogQHBhcmFtIGZzIHRoZSBGaWxlU2V0IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUYXJnZXRmaWxlc2V0KEZpbGVTZXQgZnMpIHsKKyAgICAgICAgY3JlYXRlVGFyZ2V0cygpLmFkZChuZXcgSGlkZU1pc3NpbmdCYXNlZGlyKGZzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdCBvZiB0YXJnZXQgZmlsZXMuCisgICAgICogQHBhcmFtIGZsIHRoZSBGaWxlTGlzdCB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGFyZ2V0ZmlsZWxpc3QoRmlsZUxpc3QgZmwpIHsKKyAgICAgICAgY3JlYXRlVGFyZ2V0cygpLmFkZChmbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGVycm9ycyBvY2N1ci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIkF0IGxlYXN0IG9uZSBzZXQgb2Ygc291cmNlIHJlc291cmNlcyBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIGlmICh0YXJnZXRzID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICJBdCBsZWFzdCBvbmUgc2V0IG9mIHRhcmdldCBmaWxlcyBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIC8vbm8gc291cmNlcyA9IG5vdGhpbmcgdG8gY29tcGFyZTsgbm8gdGFyZ2V0cyA9IG5vdGhpbmcgdG8gZGVsZXRlOgorICAgICAgICBpZiAoc291cmNlcy5zaXplKCkgPiAwICYmIHRhcmdldHMuc2l6ZSgpID4gMCAmJiAhdXB0b2RhdGUoc291cmNlcywgdGFyZ2V0cykpIHsKKyAgICAgICAgICAgbG9nKCJEZWxldGluZyBhbGwgdGFyZ2V0IGZpbGVzLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICBEZWxldGUgZGVsZXRlID0gbmV3IERlbGV0ZSgpOworICAgICAgICAgICBkZWxldGUuYmluZFRvT3duZXIodGhpcyk7CisgICAgICAgICAgIGRlbGV0ZS5hZGQodGFyZ2V0cyk7CisgICAgICAgICAgIGRlbGV0ZS5wZXJmb3JtKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdXB0b2RhdGUoUmVzb3VyY2VDb2xsZWN0aW9uIHNyYywgUmVzb3VyY2VDb2xsZWN0aW9uIHRhcmdldCkgeworICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkRhdGUgZGF0ZXNlbAorICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5EYXRlKCk7CisgICAgICAgIGRhdGVzZWwuc2V0TWlsbGlzKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgZGF0ZXNlbC5zZXRXaGVuKFRpbWVDb21wYXJpc29uLkFGVEVSKTsKKyAgICAgICAgbG9nRnV0dXJlKHRhcmdldHMsIGRhdGVzZWwpOworCisgICAgICAgIGludCBuZVRhcmdldHMgPSBuZXcgTm9uRXhpc3RlbnQodGFyZ2V0cykuc2l6ZSgpOworICAgICAgICBpZiAobmVUYXJnZXRzID4gMCkgeworICAgICAgICAgICAgbG9nKG5lVGFyZ2V0cyArICIgbm9uZXhpc3RlbnQgdGFyZ2V0cyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEZpbGVSZXNvdXJjZSBvbGRlc3RUYXJnZXQgPSAoRmlsZVJlc291cmNlKSBnZXRPbGRlc3QodGFyZ2V0cyk7CisgICAgICAgIGxvZyhvbGRlc3RUYXJnZXQgKyAiIGlzIG9sZGVzdCB0YXJnZXQgZmlsZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIGxvZ0Z1dHVyZShzb3VyY2VzLCBkYXRlc2VsKTsKKworICAgICAgICBpbnQgbmVTb3VyY2VzID0gbmV3IE5vbkV4aXN0ZW50KHNvdXJjZXMpLnNpemUoKTsKKyAgICAgICAgaWYgKG5lU291cmNlcyA+IDApIHsKKyAgICAgICAgICAgIGxvZyhuZVNvdXJjZXMgKyAiIG5vbmV4aXN0ZW50IHNvdXJjZXMiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBSZXNvdXJjZSBuZXdlc3RTb3VyY2UgPSAoUmVzb3VyY2UpIGdldE5ld2VzdChzb3VyY2VzKTsKKyAgICAgICAgbG9nKG5ld2VzdFNvdXJjZS50b0xvbmdTdHJpbmcoKSArICIgaXMgbmV3ZXN0IHNvdXJjZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICByZXR1cm4gb2xkZXN0VGFyZ2V0LmdldExhc3RNb2RpZmllZCgpID49IG5ld2VzdFNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nRnV0dXJlKFJlc291cmNlQ29sbGVjdGlvbiByYywgUmVzb3VyY2VTZWxlY3RvciByc2VsKSB7CisgICAgICAgIFJlc3RyaWN0IHIgPSBuZXcgUmVzdHJpY3QoKTsKKyAgICAgICAgci5hZGQocnNlbCk7CisgICAgICAgIHIuYWRkKHJjKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gci5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGxvZygiV2FybmluZzogIiArIGkubmV4dCgpICsgIiBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZSBnZXRYZXN0KFJlc291cmNlQ29sbGVjdGlvbiByYywgUmVzb3VyY2VDb21wYXJhdG9yIGMpIHsKKyAgICAgICAgSXRlcmF0b3IgaSA9IHJjLml0ZXJhdG9yKCk7CisgICAgICAgIGlmICghaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIH0KKyAgICAgICAgUmVzb3VyY2UgeGVzdCA9IChSZXNvdXJjZSkgaS5uZXh0KCk7CisgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgUmVzb3VyY2UgbmV4dCA9IChSZXNvdXJjZSkgaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoYy5jb21wYXJlKHhlc3QsIG5leHQpIDwgMCkgeworICAgICAgICAgICAgICAgIHhlc3QgPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB4ZXN0OworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2UgZ2V0T2xkZXN0KFJlc291cmNlQ29sbGVjdGlvbiByYykgeworICAgICAgICByZXR1cm4gZ2V0WGVzdChyYywgUkVWRVJTRV9EQVRFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlIGdldE5ld2VzdChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgcmV0dXJuIGdldFhlc3QocmMsIERBVEUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlhZ25vc3RpY3NUYXNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EaWFnbm9zdGljc1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ1Y2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlhZ25vc3RpY3NUYXNrLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpYWdub3N0aWNzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogVGhpcyBpcyBhIHRhc2sgdGhhdCBoYW5kcyBvZmYgd29yayB0byB0aGUgRGlhZ25vc3RpY3MgbW9kdWxlLgorICogSXQgbGV0cyB5b3UgcnVuIGRpYWdub3N0aWNzIGluIGFuIElERS4KKyAqLworcHVibGljIGNsYXNzIERpYWdub3N0aWNzVGFzayBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVJHUyA9IG5ldyBTdHJpbmdbMF07CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0YXNrLgorICAgICAqIFRoaXMgZGVsZWdhdGVzIHRvIHRoZSBEaWFnbm9zdGljcyBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBEaWFnbm9zdGljcy5tYWluKEFSR1MpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlybmFtZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlybmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDgxYmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EaXJuYW1lLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogRGV0ZXJtaW5lcyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlLgorICoKKyAqIFRoaXMgdGFzayBjYW4gYWNjZXB0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAqIDx1bD4KKyAqIDxsaT5maWxlCisgKiA8bGk+cHJvcGVydHkKKyAqIDwvdWw+CisgKiBCb3RoIDxiPmZpbGU8L2I+IGFuZCA8Yj5wcm9wZXJ0eTwvYj4gYXJlIHJlcXVpcmVkLgorICogPHA+CisgKiBXaGVuIHRoaXMgdGFzayBleGVjdXRlcywgaXQgd2lsbCBzZXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB0byB0aGUKKyAqIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBsYXN0IHBhdGgKKyAqIGVsZW1lbnQuIElmIGZpbGUgaXMgYSBmaWxlLCB0aGUgZGlyZWN0b3J5IHdpbGwgYmUgdGhlIGN1cnJlbnQKKyAqIGRpcmVjdG9yeS4KKyAqCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InByb3BlcnR5IgorICovCisKK3B1YmxpYyBjbGFzcyBEaXJuYW1lIGV4dGVuZHMgVGFzayB7CisgICAgcHJpdmF0ZSBGaWxlIGZpbGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKyAgICAvKioKKyAgICAgKiBQYXRoIHRvIHRha2UgdGhlIGRpcm5hbWUgb2YuCisgICAgICogQHBhcmFtIGZpbGUgYSA8Y29kZT5GaWxlPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoaXMgdGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByb3BlcnR5IGF0dHJpYnV0ZSByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmlsZSBhdHRyaWJ1dGUgcmVxdWlyZWQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbGUuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FYXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Vhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjljYTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FYXIuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuWmlwT3V0cHV0U3RyZWFtOworCisvKioKKyAqIENyZWF0ZXMgYSBFQVIgYXJjaGl2ZS4gQmFzZWQgb24gV0FSIHRhc2sKKyAqCisgKiBAc2luY2UgQW50IDEuNAorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0icGFja2FnaW5nIgorICovCitwdWJsaWMgY2xhc3MgRWFyIGV4dGVuZHMgSmFyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHByaXZhdGUgRmlsZSBkZXBsb3ltZW50RGVzY3JpcHRvcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVzY3JpcHRvckFkZGVkOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfREVTQ1JJUFRPUl9QQVRIID0gIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gRWFyIHRhc2suCisgICAgICovCisgICAgcHVibGljIEVhcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgYXJjaGl2ZVR5cGUgPSAiZWFyIjsKKyAgICAgICAgZW1wdHlCZWhhdmlvciA9ICJjcmVhdGUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZmlsZS4KKyAgICAgKiBAcGFyYW0gZWFyRmlsZSB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFVzZSBzZXREZXN0RmlsZShkZXN0ZmlsZSkgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFYXJmaWxlKEZpbGUgZWFyRmlsZSkgeworICAgICAgICBzZXREZXN0RmlsZShlYXJGaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWxlIHRvIGluY29ycG9yYXRlIGFzIGFwcGxpY2F0aW9uLnhtbC4KKyAgICAgKiBAcGFyYW0gZGVzY3IgdGhlIGRlc2NyaXB0b3IgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcHhtbChGaWxlIGRlc2NyKSB7CisgICAgICAgIGRlcGxveW1lbnREZXNjcmlwdG9yID0gZGVzY3I7CisgICAgICAgIGlmICghZGVwbG95bWVudERlc2NyaXB0b3IuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGVwbG95bWVudCBkZXNjcmlwdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXBsb3ltZW50RGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIFppcEZpbGVTZXQgZm9yIHRoaXMgZmlsZSwgYW5kIHBhc3MgaXQgdXAuCisgICAgICAgIFppcEZpbGVTZXQgZnMgPSBuZXcgWmlwRmlsZVNldCgpOworICAgICAgICBmcy5zZXRGaWxlKGRlcGxveW1lbnREZXNjcmlwdG9yKTsKKyAgICAgICAgZnMuc2V0RnVsbHBhdGgoWE1MX0RFU0NSSVBUT1JfUEFUSCk7CisgICAgICAgIHN1cGVyLmFkZEZpbGVzZXQoZnMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyB6aXBmaWxlc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGZzIHppcGZpbGVzZXQgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQXJjaGl2ZXMoWmlwRmlsZVNldCBmcykgeworICAgICAgICAvLyBXZSBqdXN0IHNldCB0aGUgcHJlZml4IGZvciB0aGlzIGZpbGVzZXQsIGFuZCBwYXNzIGl0IHVwLgorICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/IExICisgICAgICAgIGZzLnNldFByZWZpeCgiLyIpOworICAgICAgICBzdXBlci5hZGRGaWxlc2V0KGZzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIHpPdXQgdGhlIHppcCBvdXRwdXQgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gSS9PIGVycm9ycworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gb3RoZXIgZXJyb3JzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdFppcE91dHB1dFN0cmVhbShaaXBPdXRwdXRTdHJlYW0gek91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIElmIG5vIHdlYnhtbCBmaWxlIGlzIHNwZWNpZmllZCwgaXQncyBhbiBlcnJvci4KKyAgICAgICAgaWYgKGRlcGxveW1lbnREZXNjcmlwdG9yID09IG51bGwgJiYgIWlzSW5VcGRhdGVNb2RlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYXBweG1sIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuaW5pdFppcE91dHB1dFN0cmVhbSh6T3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIGZyb20gWmlwIGNsYXNzIHRvIGRlYWwgd2l0aCBhcHBsaWNhdGlvbi54bWwKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBhZGQgdG8gdGhlIGFyY2hpdmUKKyAgICAgKiBAcGFyYW0gek91dCB0aGUgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICogQHBhcmFtIHZQYXRoIHRoZSBuYW1lIHRoaXMgZW50cnkgc2hhbGwgaGF2ZSBpbiB0aGUgYXJjaGl2ZQorICAgICAqIEBwYXJhbSBtb2RlIHRoZSBVbml4IHBlcm1pc3Npb25zIHRvIHNldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgemlwRmlsZShGaWxlIGZpbGUsIFppcE91dHB1dFN0cmVhbSB6T3V0LCBTdHJpbmcgdlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gSWYgdGhlIGZpbGUgYmVpbmcgYWRkZWQgaXMgTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sLCB3ZQorICAgICAgICAvLyB3YXJuIGlmIGl0J3Mgbm90IHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoZSAiYXBweG1sIgorICAgICAgICAvLyBhdHRyaWJ1dGUgLSBvciBpZiBpdCdzIGJlaW5nIGFkZGVkIHR3aWNlLCBtZWFuaW5nIHRoZSBzYW1lCisgICAgICAgIC8vIGZpbGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSAiYXBweG1sIiBhdHRyaWJ1dGUgYW5kIGluIGEKKyAgICAgICAgLy8gPGZpbGVzZXQ+IGVsZW1lbnQuCisgICAgICAgIFN0cmluZyB2UGF0aExvd2VyQ2FzZSA9IHZQYXRoLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKyAgICAgICAgaWYgKFhNTF9ERVNDUklQVE9SX1BBVEguZXF1YWxzKHZQYXRoTG93ZXJDYXNlKSkgIHsKKyAgICAgICAgICAgIGlmIChkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsCisgICAgICAgICAgICAgICAgfHwgIUZJTEVfVVRJTFMuZmlsZU5hbWVFcXVhbHMoZGVwbG95bWVudERlc2NyaXB0b3IsIGZpbGUpCisgICAgICAgICAgICAgICAgfHwgZGVzY3JpcHRvckFkZGVkKSB7CisgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBzZWxlY3RlZCAiICsgYXJjaGl2ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgKyAiIGZpbGVzIGluY2x1ZGUgYSAiICsgWE1MX0RFU0NSSVBUT1JfUEFUSCArICIgd2hpY2ggd2lsbCIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGJlIGlnbm9yZWQgKHBsZWFzZSB1c2UgYXBweG1sIGF0dHJpYnV0ZSB0byAiCisgICAgICAgICAgICAgICAgICAgICsgYXJjaGl2ZVR5cGUgKyAiIHRhc2spIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdXBlci56aXBGaWxlKGZpbGUsIHpPdXQsIHZQYXRoLCBtb2RlKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yQWRkZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuemlwRmlsZShmaWxlLCB6T3V0LCB2UGF0aCwgbW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdGhpbmsgd2UgYWxyZWFkeSBoYXZlIGEgYXBwbGljYXRpb24ueG1sIG5leHQKKyAgICAgKiB0aW1lIHRoaXMgdGFzayBnZXRzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoKSB7CisgICAgICAgIGRlc2NyaXB0b3JBZGRlZCA9IGZhbHNlOworICAgICAgICBzdXBlci5jbGVhblVwKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNoby5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjQyOTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Mb2dMZXZlbDsKKworLyoqCisgKiBXcml0ZXMgYSBtZXNzYWdlIHRvIHRoZSBBbnQgbG9nZ2luZyBmYWNpbGl0aWVzLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJ1dGlsaXR5IgorICovCitwdWJsaWMgY2xhc3MgRWNobyBleHRlbmRzIFRhc2sgeworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlID0gIiI7CisgICAgcHJvdGVjdGVkIEZpbGUgZmlsZSA9IG51bGw7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXBwZW5kID0gZmFsc2U7CisgICAgLyoqIGVuY29kaW5nOyBzZXQgdG8gbnVsbCBvciBlbXB0eSBtZWFucyAnZGVmYXVsdCcgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9ICIiOworCisgICAgLy8gYnkgZGVmYXVsdCwgbWVzc2FnZXMgYXJlIGFsd2F5cyBkaXNwbGF5ZWQKKyAgICBwcm90ZWN0ZWQgaW50IGxvZ0xldmVsID0gUHJvamVjdC5NU0dfV0FSTjsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgd29yay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIGxvZ0xldmVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFdyaXRlciBvdXQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsIHx8IGVuY29kaW5nLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUsIGFwcGVuZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lLCBhcHBlbmQpLCBlbmNvZGluZykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQud3JpdGUobWVzc2FnZSwgMCwgbWVzc2FnZS5sZW5ndGgoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIHRvIHdyaXRlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIG1lc3NhZ2UgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbXNnKSB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1zZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWxlIHRvIHdyaXRlIHRvLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIHdyaXRlIHRvLCBpZiBub3Qgc2V0LCBlY2hvIHRvCisgICAgICogICAgICAgICAgICAgc3RhbmRhcmQgb3V0cHV0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBhcHBlbmQgdG8gZXhpc3RpbmcgZmlsZS4KKyAgICAgKiBAcGFyYW0gYXBwZW5kIGlmIHRydWUsIGFwcGVuZCB0byBleGlzdGluZyBmaWxlLCBkZWZhdWx0CisgICAgICogICAgICAgICAgICAgICBpcyBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBlbmQoYm9vbGVhbiBhcHBlbmQpIHsKKyAgICAgICAgdGhpcy5hcHBlbmQgPSBhcHBlbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbXVsdGlsaW5lIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIG1zZyB0aGUgQ0RBVEEgdGV4dCB0byBhcHBlbmQgdG8gdGhlIG91dHB1dCB0ZXh0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgbXNnKSB7CisgICAgICAgIG1lc3NhZ2UgKz0gZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2dnaW5nIGxldmVsLiBMZXZlbCBzaG91bGQgYmUgb25lIG9mCisgICAgICogPHVsPgorICAgICAqICA8bGk+ZXJyb3I8L2xpPgorICAgICAqICA8bGk+d2FybmluZzwvbGk+CisgICAgICogIDxsaT5pbmZvPC9saT4KKyAgICAgKiAgPGxpPnZlcmJvc2U8L2xpPgorICAgICAqICA8bGk+ZGVidWc8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+VGhlIGRlZmF1bHQgaXMgJnF1b3Q7d2FybmluZyZxdW90OyB0byBlbnN1cmUgdGhhdCBtZXNzYWdlcyBhcmUKKyAgICAgKiBkaXNwbGF5ZWQgYnkgZGVmYXVsdCB3aGVuIHVzaW5nIHRoZSAtcXVpZXQgY29tbWFuZCBsaW5lIG9wdGlvbi48L3A+CisgICAgICogQHBhcmFtIGVjaG9MZXZlbCB0aGUgbG9nZ2luZyBsZXZlbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExldmVsKEVjaG9MZXZlbCBlY2hvTGV2ZWwpIHsKKyAgICAgICAgbG9nTGV2ZWwgPSBlY2hvTGV2ZWwuZ2V0TGV2ZWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNsYXJlIHRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiBvdXRwdXR0aW5nIHRvIGEgZmlsZTsKKyAgICAgKiBVc2UgIiIgZm9yIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlLgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGxldmVsIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVjaG9MZXZlbCBleHRlbmRzIExvZ0xldmVsIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvWE1MLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvWE1MLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGZjYWYyYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0VjaG9YTUwuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5YTUxGcmFnbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRPTUVsZW1lbnRXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogRWNobyBYTUwuCisgKgorICogS25vd24gbGltaXRhdGlvbnM6CisgKiA8b2w+CisgKiA8bGk+Q3VycmVudGx5IG5vIFhNTE5TIHN1cHBvcnQ8L2xpPgorICogPGxpPlByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zIGdldCBpZ25vcmVkPC9saT4KKyAqIDxsaT5FbmNvZGluZyBpcyBhbHdheXMgVVRGLTg8L2xpPgorICogPC9vbD4KKyAqCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgRWNob1hNTCBleHRlbmRzIFhNTEZyYWdtZW50IHsKKworICAgIHByaXZhdGUgRmlsZSBmaWxlOworICAgIHByaXZhdGUgYm9vbGVhbiBhcHBlbmQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX1hNTCA9ICJObyBuZXN0ZWQgWE1MIHNwZWNpZmllZCI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG91dHB1dCBmaWxlLgorICAgICAqIEBwYXJhbSBmIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZikgeworICAgICAgICBmaWxlID0gZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBhcHBlbmQgdGhlIG91dHB1dCBmaWxlLgorICAgICAqIEBwYXJhbSBiIGJvb2xlYW4gYXBwZW5kIGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwZW5kKGJvb2xlYW4gYikgeworICAgICAgICBhcHBlbmQgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHRhc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3cml0ZXIgPSBuZXcgRE9NRWxlbWVudFdyaXRlcighYXBwZW5kKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGFwcGVuZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9zID0gbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vZGUgbiA9IGdldEZyYWdtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgaWYgKG4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19YTUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlKChFbGVtZW50KSBuLCBvcyk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3MpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkMzU0YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWMuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY05hbWVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworLyoqCisgKiBFeGVjdXRlcyBhIGdpdmVuIGNvbW1hbmQgaWYgdGhlIG9zIHBsYXRmb3JtIGlzIGFwcHJvcHJpYXRlLgorICoKKyAqIDxwPjxzdHJvbmc+QXMgb2YgQW50IDEuMiwgdGhpcyBjbGFzcyBpcyBubyBsb25nZXIgdGhlCisgKiBpbXBsZW1lbnRhdGlvbiBvZiBBbnQncyAmbHQ7ZXhlYyZndDsgdGFzayAtIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUKKyAqIGRlYWQgY29kZSBieSB0aGUgQW50IGRldmVsb3BlcnMgYW5kIGlzIHVubWFpbnRhaW5lZC4gIERvbid0IHVzZQorICogaXQuPC9zdHJvbmc+PC9wPgorICoKKyAqIEBkZXByZWNhdGVkIHNpbmNlIDEuMi4KKyAqICAgICAgICAgICAgIGRlbGVnYXRlIHRvIHtAbGluayBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlIEV4ZWN1dGV9CisgKiAgICAgICAgICAgICBpbnN0ZWFkLgorICovCitwdWJsaWMgY2xhc3MgRXhlYyBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgU3RyaW5nIG9zOworICAgIHByaXZhdGUgU3RyaW5nIG91dDsKKyAgICBwcml2YXRlIEZpbGUgZGlyOworICAgIHByaXZhdGUgU3RyaW5nIGNvbW1hbmQ7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgZm9zID0gbnVsbDsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvciA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIEV4ZWMuCisgICAgICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlIHRvIHN0ZCBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhlYygpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJBcyBvZiBBbnQgMS4yIHJlbGVhc2VkIGluIE9jdG9iZXIgMjAwMCwgIgorICAgICAgICAgICAgKyAidGhlIEV4ZWMgY2xhc3MiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpcyBjb25zaWRlcmVkIHRvIGJlIGRlYWQgY29kZSBieSB0aGUgQW50ICIKKyAgICAgICAgICAgICsgImRldmVsb3BlcnMgYW5kIGlzIHVubWFpbnRhaW5lZC4iKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEb25cJ3QgdXNlIGl0ISIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHRhc2suCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBydW4oY29tbWFuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KKyAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCB0byBleGVjCisgICAgICogQHJldHVybiB0aGUgZXhpdCB2YWx1ZSBvZiB0aGUgY29tbWFuZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJ1bihTdHJpbmcgY29tbWFuZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgZXJyID0gLTE7IC8vIGFzc3VtZSB0aGUgd29yc3QKKworICAgICAgICAvLyB0ZXN0IGlmIG9zIG1hdGNoCisgICAgICAgIFN0cmluZyBteW9zID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7CisgICAgICAgIGxvZygiTXlvcyA9ICIgKyBteW9zLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgaWYgKChvcyAhPSBudWxsKSAmJiAob3MuaW5kZXhPZihteW9zKSA8IDApKSB7CisgICAgICAgICAgICAvLyB0aGlzIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uIHRoZSBzcGVjaWZpZWQgT1MKKyAgICAgICAgICAgIGxvZygiTm90IGZvdW5kIGluICIgKyBvcywgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlZmF1bHQgZGlyZWN0b3J5IHRvIHRoZSBwcm9qZWN0J3MgYmFzZSBkaXJlY3RvcnkKKyAgICAgICAgaWYgKGRpciA9PSBudWxsKSB7CisgICAgICAgICAgZGlyID0gZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChteW9zLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigid2luZG93cyIpID49IDApIHsKKyAgICAgICAgICAgIGlmICghZGlyLmVxdWFscyhnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIi4iKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobXlvcy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIm50IikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gImNtZCAvYyBjZCAiICsgZGlyICsgIiAmJiAiICsgY29tbWFuZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW50ID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0hPTUUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBNYWdpY05hbWVzLkFOVF9IT01FICsgIicgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3VuZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFudFJ1biA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShhbnQgKyAiL2Jpbi9hbnRSdW4uYmF0IikudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IGFudFJ1biArICIgIiArIGRpciArICIgIiArIGNvbW1hbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGFudCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9IT01FKTsKKyAgICAgICAgICAgIGlmIChhbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgTWFnaWNOYW1lcy5BTlRfSE9NRSArICInIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBhbnRSdW4gPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoYW50ICsgIi9iaW4vYW50UnVuIikudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgY29tbWFuZCA9IGFudFJ1biArICIgIiArIGRpciArICIgIiArIGNvbW1hbmQ7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gc2hvdyB0aGUgY29tbWFuZAorICAgICAgICAgICAgbG9nKGNvbW1hbmQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgICAgICAvLyBleGVjIGNvbW1hbmQgb24gc3lzdGVtIHJ1bnRpbWUKKyAgICAgICAgICAgIFByb2Nlc3MgcHJvYyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCk7CisKKyAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgIHsKKyAgICAgICAgICAgICAgICBmb3MgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIob3V0KSk7CisgICAgICAgICAgICAgICAgbG9nKCJPdXRwdXQgcmVkaXJlY3RlZCB0byAiICsgb3V0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSBpbnB1dCBhbmQgZXJyb3IgdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgIFN0cmVhbVB1bXBlciBpbnB1dFB1bXBlciA9CisgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVB1bXBlcihwcm9jLmdldElucHV0U3RyZWFtKCksIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgU3RyZWFtUHVtcGVyIGVycm9yUHVtcGVyID0KKyAgICAgICAgICAgICAgICBuZXcgU3RyZWFtUHVtcGVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSwgUHJvamVjdC5NU0dfV0FSTik7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0cyBwdW1waW5nIGF3YXkgdGhlIGdlbmVyYXRlZCBvdXRwdXQvZXJyb3IKKyAgICAgICAgICAgIGlucHV0UHVtcGVyLnN0YXJ0KCk7CisgICAgICAgICAgICBlcnJvclB1bXBlci5zdGFydCgpOworCisgICAgICAgICAgICAvLyBXYWl0IGZvciBldmVyeXRoaW5nIHRvIGZpbmlzaAorICAgICAgICAgICAgcHJvYy53YWl0Rm9yKCk7CisgICAgICAgICAgICBpbnB1dFB1bXBlci5qb2luKCk7CisgICAgICAgICAgICBlcnJvclB1bXBlci5qb2luKCk7CisgICAgICAgICAgICBwcm9jLmRlc3Ryb3koKTsKKworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIG91dHB1dCBmaWxlIGlmIHJlcXVpcmVkCisgICAgICAgICAgICBsb2dGbHVzaCgpOworCisgICAgICAgICAgICAvLyBjaGVjayBpdHMgZXhpdCB2YWx1ZQorICAgICAgICAgICAgZXJyID0gcHJvYy5leGl0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4ZWMgcmV0dXJuZWQ6ICIgKyBlcnIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiUmVzdWx0OiAiICsgZXJyLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGV4ZWM6ICIgKyBjb21tYW5kLCBpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGQgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyKFN0cmluZyBkKSB7CisgICAgICAgIHRoaXMuZGlyID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgT3BlcmF0aW5nIFN5c3RlbSB0aGF0IHRoaXMgZXhlYyBpcyB0byBydW4gaW4uCisgICAgICogQHBhcmFtIG9zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9zKFN0cmluZyBvcykgeworICAgICAgICB0aGlzLm9zID0gb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21tYW5kIHRvIGV4ZWMuCisgICAgICogQHBhcmFtIGNvbW1hbmQgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChTdHJpbmcgY29tbWFuZCkgeworICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0IGZpbGVuYW1lLgorICAgICAqIEBwYXJhbSBvdXQgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KFN0cmluZyBvdXQpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmYWlsT25FcnJvciBhdHRyaWJ1dGUuCisgICAgICogRGVmYXVsdCBpcyBmYWxzZS4KKyAgICAgKiBAcGFyYW0gZmFpbCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsKSB7CisgICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgYW4gb3V0cHV0IG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gcHV0cHV0CisgICAgICogQHBhcmFtIG1lc3NhZ2VMZXZlbCB0aGUgbGV2ZWwgb2YgbG9nZ2luZyAtIGlnbm9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGlmIG91dHB1dCBpcyBnb2luZyB0byBhIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvdXRwdXRMb2coU3RyaW5nIGxpbmUsIGludCBtZXNzYWdlTGV2ZWwpIHsKKyAgICAgICAgaWYgKGZvcyA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cobGluZSwgbWVzc2FnZUxldmVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcy5wcmludGxuKGxpbmUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2Ugb3V0cHV0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvZ0ZsdXNoKCkgeworICAgICAgICBpZiAoZm9zICE9IG51bGwpIHsKKyAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElubmVyIGNsYXNzIGZvciBjb250aW51YWxseSBwdW1waW5nIHRoZSBpbnB1dCBzdHJlYW0gZHVyaW5nCisgICAgLy8gUHJvY2VzcydzIHJ1bnRpbWUuCisgICAgY2xhc3MgU3RyZWFtUHVtcGVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBkaW47CisgICAgICAgIHByaXZhdGUgaW50IG1lc3NhZ2VMZXZlbDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGVuZE9mU3RyZWFtID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTEVFUF9USU1FID0gNTsKKworICAgICAgICBwdWJsaWMgU3RyZWFtUHVtcGVyKElucHV0U3RyZWFtIGlzLCBpbnQgbWVzc2FnZUxldmVsKSB7CisgICAgICAgICAgICB0aGlzLmRpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZUxldmVsID0gbWVzc2FnZUxldmVsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHVtcFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoIWVuZE9mU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBkaW4ucmVhZExpbmUoKTsKKworICAgICAgICAgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0TG9nKGxpbmUsIG1lc3NhZ2VMZXZlbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kT2ZTdHJlYW0gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFlbmRPZlN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVtcFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoU0xFRVBfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY1Rhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkZGI1ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNUYXNrLmphdmEKQEAgLTAsMCArMSw3MTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVkaXJlY3RvckVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogRXhlY3V0ZXMgYSBnaXZlbiBjb21tYW5kIGlmIHRoZSBvcyBwbGF0Zm9ybSBpcyBhcHByb3ByaWF0ZS4KKyAqCisgKiBAc2luY2UgQW50IDEuMgorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iY29udHJvbCIKKyAqLworcHVibGljIGNsYXNzIEV4ZWNUYXNrIGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIG9zOworICAgIHByaXZhdGUgU3RyaW5nIG9zRmFtaWx5OworCisgICAgcHJpdmF0ZSBGaWxlIGRpcjsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBib29sZWFuIGZhaWxPbkVycm9yID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbmV3RW52aXJvbm1lbnQgPSBmYWxzZTsKKyAgICBwcml2YXRlIExvbmcgdGltZW91dCA9IG51bGw7CisgICAgcHJpdmF0ZSBFbnZpcm9ubWVudCBlbnYgPSBuZXcgRW52aXJvbm1lbnQoKTsKKyAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgY21kbCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgIHByaXZhdGUgU3RyaW5nIHJlc3VsdFByb3BlcnR5OworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsSWZFeGVjRmFpbHMgPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nIGV4ZWN1dGFibGU7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVFeGVjdXRhYmxlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHNlYXJjaFBhdGggPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3Bhd24gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jb21wYXRpYmxlV2l0aFNwYXduID0gZmFsc2U7CisKKyAgICAvL2luY2x1ZGUgbG9jYWxseSBmb3Igc2NyZWVuaW5nIHB1cnBvc2VzCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5wdXRTdHJpbmc7CisgICAgcHJpdmF0ZSBGaWxlIGlucHV0OworICAgIHByaXZhdGUgRmlsZSBvdXRwdXQ7CisgICAgcHJpdmF0ZSBGaWxlIGVycm9yOworCisgICAgcHJvdGVjdGVkIFJlZGlyZWN0b3IgcmVkaXJlY3RvciA9IG5ldyBSZWRpcmVjdG9yKHRoaXMpOworICAgIHByb3RlY3RlZCBSZWRpcmVjdG9yRWxlbWVudCByZWRpcmVjdG9yRWxlbWVudDsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgVk0gKDEuMyBhbmQgYWJvdmUpIGlzIHVzZWQgdG8gZXhlY3V0ZSB0aGUKKyAgICAgKiBjb21tYW5kCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHZtTGF1bmNoZXIgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UuCisgICAgICogTmVlZHMgdG8gYmUgY29uZmlndXJlZCBieSBiaW5kaW5nIHRvIGEgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhlY1Rhc2soKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIGFuIGluc3RhbmNlIHRoYXQgaXMgaGVscGluZyBhbm90aGVyIHRhc2suCisgICAgICogUHJvamVjdCwgT3duaW5nVGFyZ2V0LCBUYXNrTmFtZSBhbmQgZGVzY3JpcHRpb24gYXJlIGFsbAorICAgICAqIHB1bGxlZCBvdXQKKyAgICAgKiBAcGFyYW0gb3duZXIgdGFzayB0aGF0IHdlIGJlbG9uZyB0bworICAgICAqLworICAgIHB1YmxpYyBFeGVjVGFzayhUYXNrIG93bmVyKSB7CisgICAgICAgIGJpbmRUb093bmVyKG93bmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBvciBub3QgeW91IHdhbnQgdGhlIHByb2Nlc3MgdG8gYmUgc3Bhd25lZC4KKyAgICAgKiBEZWZhdWx0IGlzIGZhbHNlLgorICAgICAqIEBwYXJhbSBzcGF3biBpZiB0cnVlIHlvdSBkbyBub3Qgd2FudCBBbnQgdG8gd2FpdCBmb3IgdGhlIGVuZCBvZiB0aGUgcHJvY2Vzcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNwYXduKGJvb2xlYW4gc3Bhd24pIHsKKyAgICAgICAgdGhpcy5zcGF3biA9IHNwYXduOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoTG9uZyB2YWx1ZSkgeworICAgICAgICB0aW1lb3V0ID0gdmFsdWU7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgc2V0VGltZW91dCgKKyAgICAgICAgICAgIChMb25nKSAoKHZhbHVlID09IG51bGwpID8gbnVsbCA6IG5ldyBMb25nKHZhbHVlLmludFZhbHVlKCkpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0uCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5leGVjdXRhYmxlID0gdmFsdWU7CisgICAgICAgIGNtZGwuc2V0RXhlY3V0YWJsZSh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gZCB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgZCkgeworICAgICAgICB0aGlzLmRpciA9IGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdCBvZiBvcGVyYXRpbmcgc3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuCisgICAgICogQHBhcmFtIG9zIGxpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9zKFN0cmluZyBvcykgeworICAgICAgICB0aGlzLm9zID0gb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGNvbW1hbmQgbGluZS4KKyAgICAgKiBAcGFyYW0gY21kbCBjb21tYW5kIGxpbmUuCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1hbmQoQ29tbWFuZGxpbmUgY21kbCkgeworICAgICAgICBsb2coIlRoZSBjb21tYW5kIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkLlxuIgorICAgICAgICAgICAgKyAiUGxlYXNlIHVzZSB0aGUgZXhlY3V0YWJsZSBhdHRyaWJ1dGUgYW5kIG5lc3RlZCBhcmcgZWxlbWVudHMuIiwKKyAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB0aGlzLmNtZGwgPSBjbWRsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLiBJZiBlcnJvciBpcyBub3QKKyAgICAgKiByZWRpcmVjdGVkLCBpdCB0b28gd2lsbCBhcHBlYXIgaW4gdGhlIG91dHB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgbmFtZSBvZiBhIGZpbGUgdG8gd2hpY2ggb3V0cHV0IHNob3VsZCBiZSBzZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChGaWxlIG91dCkgeworICAgICAgICB0aGlzLm91dHB1dCA9IG91dDsKKyAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGlucHV0IGZpbGUgdG8gdXNlIGZvciB0aGUgdGFzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCBuYW1lIG9mIGEgZmlsZSBmcm9tIHdoaWNoIHRvIGdldCBpbnB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChGaWxlIGlucHV0KSB7CisgICAgICAgIGlmIChpbnB1dFN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBcImlucHV0XCIgYW5kIFwiaW5wdXRzdHJpbmdcIiAiCisgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyBjYW5ub3QgYm90aCBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdHJpbmcgdG8gdXNlIGFzIGlucHV0LgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyaW5nIHRoZSBzdHJpbmcgd2hpY2ggaXMgdXNlZCBhcyB0aGUgaW5wdXQgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0U3RyaW5nKFN0cmluZyBpbnB1dFN0cmluZykgeworICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgXCJpbnB1dFwiIGFuZCBcImlucHV0c3RyaW5nXCIgIgorICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZXMgY2Fubm90IGJvdGggYmUgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbnB1dFN0cmluZyA9IGlucHV0U3RyaW5nOworICAgICAgICBpbmNvbXBhdGlibGVXaXRoU3Bhd24gPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHdoZXRoZXIgZXJyb3Igb3V0cHV0IG9mIGV4ZWMgaXMgbG9nZ2VkLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4KKyAgICAgKiBvdXRwdXQgaXMgYmVpbmcgcmVkaXJlY3RlZCBhbmQgZXJyb3Igb3V0cHV0IGlzIGRlc2lyZWQgaW4gdGhlIEFudCBsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nRXJyb3Igc2V0IHRvIHRydWUgdG8gbG9nIGVycm9yIG91dHB1dCBpbiB0aGUgbm9ybWFsIGFudCBsb2cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9nRXJyb3IoYm9vbGVhbiBsb2dFcnJvcikgeworICAgICAgICByZWRpcmVjdG9yLnNldExvZ0Vycm9yKGxvZ0Vycm9yKTsKKyAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduIHw9IGxvZ0Vycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgRmlsZSB0byB3aGljaCB0aGUgZXJyb3Igc3RyZWFtIG9mIHRoZSBwcm9jZXNzIHNob3VsZCBiZSByZWRpcmVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yIGEgZmlsZSB0byB3aGljaCBzdGRlcnIgc2hvdWxkIGJlIHNlbnQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yKEZpbGUgZXJyb3IpIHsKKyAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOworICAgICAgICBpbmNvbXBhdGlibGVXaXRoU3Bhd24gPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgb3V0cHV0IG9mCisgICAgICogdGhlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0UHJvcCBuYW1lIG9mIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dHByb3BlcnR5KFN0cmluZyBvdXRwdXRQcm9wKSB7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0T3V0cHV0UHJvcGVydHkob3V0cHV0UHJvcCk7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgZXJyb3Igb2YKKyAgICAgKiB0aGUgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclByb3BlcnR5IG5hbWUgb2YgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJvcGVydHkoU3RyaW5nIGVycm9yUHJvcGVydHkpIHsKKyAgICAgICAgcmVkaXJlY3Rvci5zZXRFcnJvclByb3BlcnR5KGVycm9yUHJvcGVydHkpOworICAgICAgICBpbmNvbXBhdGlibGVXaXRoU3Bhd24gPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWwgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhIG5vbi16ZXJvIHJldHVybiBjb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGZhaWwgaWYgdHJ1ZSBmYWlsIHRoZSBjb21tYW5kIG9uIG5vbi16ZXJvIHJldHVybiBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvbmVycm9yKGJvb2xlYW4gZmFpbCkgeworICAgICAgICBmYWlsT25FcnJvciA9IGZhaWw7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biB8PSBmYWlsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIG5vdCBwcm9wYWdhdGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5ld2VudiBpZiB0cnVlLCBkbyBub3QgcHJvcGFnYXRlIG9sZCBlbnZpcm9ubWVudAorICAgICAqIHdoZW4gbmV3IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5ld2Vudmlyb25tZW50KGJvb2xlYW4gbmV3ZW52KSB7CisgICAgICAgIG5ld0Vudmlyb25tZW50ID0gbmV3ZW52OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgZXhlY3V0YWJsZSB0byBhIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZUV4ZWN1dGFibGUgaWYgdHJ1ZSwgYXR0ZW1wdCB0byByZXNvbHZlIHRoZQorICAgICAqIHBhdGggb2YgdGhlIGV4ZWN1dGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZUV4ZWN1dGFibGUoYm9vbGVhbiByZXNvbHZlRXhlY3V0YWJsZSkgeworICAgICAgICB0aGlzLnJlc29sdmVFeGVjdXRhYmxlID0gcmVzb2x2ZUV4ZWN1dGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gc2VhcmNoIG5lc3RlZCwgdGhlbgorICAgICAqIHN5c3RlbSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGV4ZWN1dGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VhcmNoUGF0aCBpZiB0cnVlLCBzZWFyY2ggUEFUSHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VhcmNoUGF0aChib29sZWFuIHNlYXJjaFBhdGgpIHsKKyAgICAgICAgdGhpcy5zZWFyY2hQYXRoID0gc2VhcmNoUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byBhdHRlbXB0IHRvIHJlc29sdmUgdGhlIGV4ZWN1dGFibGUgdG8gYQorICAgICAqIGZpbGUuCisgICAgICogQHJldHVybiB0aGUgcmVzb2x2ZUV4ZWN1dGFibGUgZmxhZworICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXNvbHZlRXhlY3V0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVFeGVjdXRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgbGF1bmNoZWQgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YXIgbmV3IGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVudihFbnZpcm9ubWVudC5WYXJpYWJsZSB2YXIpIHsKKyAgICAgICAgZW52LmFkZFZhcmlhYmxlKHZhcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3IGNvbW1hbmQgbGluZSBhcmd1bWVudCBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb21tYW5kbGluZS5Bcmd1bWVudCBjcmVhdGVBcmcoKSB7CisgICAgICAgIHJldHVybiBjbWRsLmNyZWF0ZUFyZ3VtZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUKKyAgICAgKiBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIE9ubHkgb2YgaW50ZXJlc3QgaWYgZmFpbG9uZXJyb3I9ZmFsc2UuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqCisgICAgICogQHBhcmFtIHJlc3VsdFByb3BlcnR5IG5hbWUgb2YgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0UHJvcGVydHkoU3RyaW5nIHJlc3VsdFByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucmVzdWx0UHJvcGVydHkgPSByZXN1bHRQcm9wZXJ0eTsKKyAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHNldCByZXN1bHQgcHJvcGVydHkgdG8gdGhlCisgICAgICogcGFzc2VkIGluIHZhbHVlIGlmIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3VsdCB2YWx1ZSBkZXNpcmVkIGZvciB0aGUgcmVzdWx0IHByb3BlcnR5IHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG1heWJlU2V0UmVzdWx0UHJvcGVydHlWYWx1ZShpbnQgcmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHRQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzID0gSW50ZWdlci50b1N0cmluZyhyZXN1bHQpOworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHJlc3VsdFByb3BlcnR5LCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgaWYgcHJvZ3JhbSBjYW5ub3QgYmUgc3RhcnRlZC4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqCisgICAgICogQHBhcmFtIGZsYWcgc3RvcCB0aGUgYnVpbGQgaWYgcHJvZ3JhbSBjYW5ub3QgYmUgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbElmRXhlY3V0aW9uRmFpbHMoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGZhaWxJZkV4ZWNGYWlscyA9IGZsYWc7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSBhcHBlbmQgaXMgZGVzaXJlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjMwLCBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwZW5kKGJvb2xlYW4gYXBwZW5kKSB7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0QXBwZW5kKGFwcGVuZCk7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgPGNvZGU+UmVkaXJlY3RvckVsZW1lbnQ8L2NvZGU+IHRvIHRoaXMgdGFzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWRpcmVjdG9yRWxlbWVudCAgIDxjb2RlPlJlZGlyZWN0b3JFbGVtZW50PC9jb2RlPi4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFJlZGlyZWN0b3IoUmVkaXJlY3RvckVsZW1lbnQgcmVkaXJlY3RvckVsZW1lbnQpIHsKKyAgICAgICAgaWYgKHRoaXMucmVkaXJlY3RvckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjYW5ub3QgaGF2ZSA+IDEgbmVzdGVkIDxyZWRpcmVjdG9yPnMiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnJlZGlyZWN0b3JFbGVtZW50ID0gcmVkaXJlY3RvckVsZW1lbnQ7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCB0aGlzIGV4ZWN1dGlvbiB0byBhIHNpbmdsZSBPUyBGYW1pbHkKKyAgICAgKiBAcGFyYW0gb3NGYW1pbHkgdGhlIGZhbWlseSB0byByZXN0cmljdCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPc0ZhbWlseShTdHJpbmcgb3NGYW1pbHkpIHsKKyAgICAgICAgdGhpcy5vc0ZhbWlseSA9IG9zRmFtaWx5LnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kIGF0dGVtcHRzIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIGV4ZWN1dGFibGUgaXMgc28gdGhhdCB3ZSBjYW4gZmVlZAorICAgICAqIHRoZSBmdWxsIHBhdGguIFdlIGZpcnN0IHRyeSBiYXNlZGlyLCB0aGVuIHRoZSBleGVjIGRpciwgYW5kIHRoZW4KKyAgICAgKiBmYWxsYmFjayB0byB0aGUgc3RyYWlnaHQgZXhlY3V0YWJsZSBuYW1lIChpLmUuIG9uIHRoZSBwYXRoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGVjIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorICAgICAqIEBwYXJhbSBtdXN0U2VhcmNoUGF0aCBpZiB0cnVlLCB0aGUgZXhlY3V0YWJsZSB3aWxsIGJlIGxvb2tlZCB1cCBpbgorICAgICAqIHRoZSBQQVRIIGVudmlyb25tZW50IGFuZCB0aGUgYWJzb2x1dGUgcGF0aCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGV4ZWN1dGFibGUgYXMgYSBmdWxsIHBhdGggaWYgaXQgY2FuIGJlIGRldGVybWluZWQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUV4ZWN1dGFibGUoU3RyaW5nIGV4ZWMsIGJvb2xlYW4gbXVzdFNlYXJjaFBhdGgpIHsKKyAgICAgICAgaWYgKCFyZXNvbHZlRXhlY3V0YWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIGV4ZWM7CisgICAgICAgIH0KKyAgICAgICAgLy8gdHJ5IHRvIGZpbmQgdGhlIGV4ZWN1dGFibGUKKyAgICAgICAgRmlsZSBleGVjdXRhYmxlRmlsZSA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShleGVjKTsKKyAgICAgICAgaWYgKGV4ZWN1dGFibGVGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gZXhlY3V0YWJsZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbm93IHRyeSB0byByZXNvbHZlIGFnYWluc3QgdGhlIGRpciBpZiBnaXZlbgorICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV4ZWN1dGFibGVGaWxlID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShkaXIsIGV4ZWMpOworICAgICAgICAgICAgaWYgKGV4ZWN1dGFibGVGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGVGaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGNvdWxkbid0IGZpbmQgaXQgLSBtdXN0IGJlIG9uIHBhdGgKKyAgICAgICAgaWYgKG11c3RTZWFyY2hQYXRoKSB7CisgICAgICAgICAgICBQYXRoIHAgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nW10gZW52aXJvbm1lbnQgPSBlbnYuZ2V0VmFyaWFibGVzKCk7CisgICAgICAgICAgICBpZiAoZW52aXJvbm1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52aXJvbm1lbnQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGF0aChlbnZpcm9ubWVudFtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZXcgUGF0aChnZXRQcm9qZWN0KCksIGdldFBhdGgoZW52aXJvbm1lbnRbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFZlY3RvciBlbnZWYXJzID0gRXhlY3V0ZS5nZXRQcm9jRW52aXJvbm1lbnQoKTsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZW52VmFycy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYXRoKGxpbmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpLCBnZXRQYXRoKGxpbmUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRpcnMgPSBwLmxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZUZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZShkaXJzW2ldKSwgZXhlYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRhYmxlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGVGaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG11c3RTZWFyY2hQYXRoIGlzIGZhbHNlLCBvciBubyBQQVRIIG9yIG5vdCBmb3VuZCAtIGtlZXAgb3VyCisgICAgICAgIC8vIGZpbmdlcnMgY3Jvc3NlZC4KKyAgICAgICAgcmV0dXJuIGV4ZWM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8gdGhlIHdvcmsuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGluIGEgbnVtYmVyIG9mIGNpcmN1bXN0YW5jZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT5pZiBmYWlsSWZFeGVjRmFpbHMgaXMgc2V0IHRvIHRydWUgYW5kIHRoZSBwcm9jZXNzIGNhbm5vdCBiZSBzdGFydGVkPC9saT4KKyAgICAgKiA8bGk+dGhlIGphdmExM2NvbW1hbmQgbGF1bmNoZXIgY2FuIHNlbmQgYnVpbGQgZXhjZXB0aW9uczwvbGk+CisgICAgICogPGxpPnRoaXMgbGlzdCBpcyBub3QgZXhoYXVzdGl2ZSBvciBsaW1pdGF0aXZlPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyBRdWljayBmYWlsIGlmIHRoaXMgaXMgbm90IGEgdmFsaWQgT1MgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIGlmICghaXNWYWxpZE9zKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGaWxlIHNhdmVkRGlyID0gZGlyOyAvLyBwb3NzaWJseSBhbHRlcmVkIGluIHByZXBhcmVFeGVjCisgICAgICAgIGNtZGwuc2V0RXhlY3V0YWJsZShyZXNvbHZlRXhlY3V0YWJsZShleGVjdXRhYmxlLCBzZWFyY2hQYXRoKSk7CisgICAgICAgIGNoZWNrQ29uZmlndXJhdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcnVuRXhlYyhwcmVwYXJlRXhlYygpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGRpciA9IHNhdmVkRGlyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFzIHRoZSB1c2VyIHNldCBhbGwgbmVjZXNzYXJ5IGF0dHJpYnV0ZXM/CisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbWRsLmdldEV4ZWN1dGFibGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5vIGV4ZWN1dGFibGUgc3BlY2lmaWVkIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpciAhPSBudWxsICYmICFkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGRpcmVjdG9yeSAiICsgZGlyICsgIiBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXIgIT0gbnVsbCAmJiAhZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihkaXIgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeSIpOworICAgICAgICB9CisgICAgICAgIGlmIChzcGF3biAmJiBpbmNvbXBhdGlibGVXaXRoU3Bhd24pIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coInNwYXduIGRvZXMgbm90IGFsbG93IGF0dHJpYnV0ZXMgcmVsYXRlZCB0byBpbnB1dCwgIgorICAgICAgICAgICAgKyAib3V0cHV0LCBlcnJvciwgcmVzdWx0IiwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coInNwYXduIGFsc28gZG9lcyBub3QgYWxsb3cgdGltZW91dCIsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJmaW5hbGx5LCBzcGF3biBpcyBub3QgY29tcGF0aWJsZSAiCisgICAgICAgICAgICAgICAgKyAid2l0aCBhIG5lc3RlZCBJL08gPHJlZGlyZWN0b3I+IiwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IGhhdmUgdXNlZCBhbiBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICsgIm9yIG5lc3RlZCBlbGVtZW50IHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggc3Bhd24iKTsKKyAgICAgICAgfQorICAgICAgICBzZXR1cFJlZGlyZWN0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgcHJvcGVydGllcyBvbiB0aGUgcmVkaXJlY3RvciB0aGF0IHdlIG5lZWRlZCB0byBzdG9yZSBsb2NhbGx5LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldHVwUmVkaXJlY3RvcigpIHsKKyAgICAgICAgcmVkaXJlY3Rvci5zZXRJbnB1dChpbnB1dCk7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0SW5wdXRTdHJpbmcoaW5wdXRTdHJpbmcpOworICAgICAgICByZWRpcmVjdG9yLnNldE91dHB1dChvdXRwdXQpOworICAgICAgICByZWRpcmVjdG9yLnNldEVycm9yKGVycm9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHRoZSBPUyB0aGUgdXNlciB3YW50ZWQ/CisgICAgICogQHJldHVybiBib29sZWFuLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+CisgICAgICogPGxpPjxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcyBhbmQgb3NmYW1pbHkgYXR0cmlidXRlcyBhcmUgbnVsbC48L2xpPgorICAgICAqIDxsaT48Y29kZT50cnVlPC9jb2RlPiBpZiBvc2ZhbWlseSBpcyBzZXQsIGFuZCB0aGUgb3MgZmFtaWx5IGFuZCBtdXN0IG1hdGNoCisgICAgICogdGhhdCBvZiB0aGUgY3VycmVudCBPUywgYWNjb3JkaW5nIHRvIHRoZSBsb2dpYyBvZgorICAgICAqIHtAbGluayBPcyNpc09zKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9LCBhbmQgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgKiA8Y29kZT5vczwvY29kZT4gYXR0cmlidXRlIG11c3QgYWxzbyBldmFsdWF0ZSB0cnVlLgorICAgICAqIDwvbGk+CisgICAgICogPGxpPgorICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIG9zIGlzIHNldCwgYW5kIHRoZSBzeXN0ZW0ucHJvcGVydHkgb3MubmFtZQorICAgICAqIGlzIGZvdW5kIGluIHRoZSBvcyBhdHRyaWJ1dGUsPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZE9zKCkgeworICAgICAgICAvL2hhbmQgb3NmYW1pbHkgb2ZmIHRvIE9zIGNsYXNzLCBpZiBzZXQKKyAgICAgICAgaWYgKG9zRmFtaWx5ICE9IG51bGwgJiYgIU9zLmlzT3Mob3NGYW1pbHksIG51bGwsIG51bGwsIG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy90aGUgRXhlYyBPUyBjaGVjayBpcyBkaWZmZXJlbnQgZnJvbSBPcy5pc09zKCksIHdoaWNoCisgICAgICAgIC8vcHJvYmVzIGZvciBhIHNwZWNpZmljIE9TLiBJbnN0ZWFkIGl0IHNlYXJjaGVzIHRoZSBvcyBmaWVsZAorICAgICAgICAvL2ZvciB0aGUgY3VycmVudCBvcy5uYW1lCisgICAgICAgIFN0cmluZyBteW9zID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7CisgICAgICAgIGxvZygiQ3VycmVudCBPUyBpcyAiICsgbXlvcywgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIGlmICgob3MgIT0gbnVsbCkgJiYgKG9zLmluZGV4T2YobXlvcykgPCAwKSkgeworICAgICAgICAgICAgLy8gdGhpcyBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbiB0aGUgc3BlY2lmaWVkIE9TCisgICAgICAgICAgICBsb2coIlRoaXMgT1MsICIgKyBteW9zCisgICAgICAgICAgICAgICAgICAgICsgIiB3YXMgbm90IGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiB2YWxpZCBPU2VzOiAiICsgb3MsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGxhdW5jaCBuZXcgcHJvY2VzcyB3aXRoIFZNLCBvdGhlcndpc2UgdXNlIHRoZSBPUydzIHNoZWxsLgorICAgICAqIERlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gdm1MYXVuY2hlciB0cnVlIGlmIHdlIHdhbnQgdG8gbGF1bmNoIG5ldyBwcm9jZXNzIHdpdGggVk0sCisgICAgICogZmFsc2UgaWYgd2Ugd2FudCB0byB1c2UgdGhlIE9TJ3Mgc2hlbGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Vk1MYXVuY2hlcihib29sZWFuIHZtTGF1bmNoZXIpIHsKKyAgICAgICAgdGhpcy52bUxhdW5jaGVyID0gdm1MYXVuY2hlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gRXhlY3V0ZSBpbnN0YW5jZSB3aXRoIHRoZSBjb3JyZWN0IHdvcmtpbmcgZGlyZWN0b3J5IHNldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIEV4ZWN1dGUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHVuZGVyIHVua25vd24gY2lyY3Vtc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRXhlY3V0ZSBwcmVwYXJlRXhlYygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRlZmF1bHQgZGlyZWN0b3J5IHRvIHRoZSBwcm9qZWN0J3MgYmFzZSBkaXJlY3RvcnkKKyAgICAgICAgaWYgKGRpciA9PSBudWxsKSB7CisgICAgICAgICAgICBkaXIgPSBnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpOworICAgICAgICB9CisgICAgICAgIGlmIChyZWRpcmVjdG9yRWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZWRpcmVjdG9yRWxlbWVudC5jb25maWd1cmUocmVkaXJlY3Rvcik7CisgICAgICAgIH0KKyAgICAgICAgRXhlY3V0ZSBleGUgPSBuZXcgRXhlY3V0ZShjcmVhdGVIYW5kbGVyKCksIGNyZWF0ZVdhdGNoZG9nKCkpOworICAgICAgICBleGUuc2V0QW50UnVuKGdldFByb2plY3QoKSk7CisgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGRpcik7CisgICAgICAgIGV4ZS5zZXRWTUxhdW5jaGVyKHZtTGF1bmNoZXIpOworICAgICAgICBleGUuc2V0U3Bhd24oc3Bhd24pOworICAgICAgICBTdHJpbmdbXSBlbnZpcm9ubWVudCA9IGVudi5nZXRWYXJpYWJsZXMoKTsKKyAgICAgICAgaWYgKGVudmlyb25tZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52aXJvbm1lbnQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsb2coIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGU6ICIgKyBlbnZpcm9ubWVudFtpXSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZXhlLnNldE5ld2Vudmlyb25tZW50KG5ld0Vudmlyb25tZW50KTsKKyAgICAgICAgZXhlLnNldEVudmlyb25tZW50KGVudmlyb25tZW50KTsKKyAgICAgICAgcmV0dXJuIGV4ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIFV0aWxpdHkgbWV0aG9kIGZvciB0aGlzIGNsYXNzZXMgYW5kIHN1YmNsYXNzZXMgdG8gcnVuIGFuCisgICAgICogRXhlY3V0ZSBpbnN0YW5jZSAoYW4gZXh0ZXJuYWwgY29tbWFuZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhlIGluc3RhbmNlIG9mIHRoZSBleGVjdXRlIGNsYXNzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpbiBjYXNlIG9mIHByb2JsZW0gdG8gYXR0YWNoIHRvIHRoZSBzdGRpbi9zdGRvdXQvc3RkZXJyCisgICAgICogc3RyZWFtcyBvZiB0aGUgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBydW5FeGVjdXRlKEV4ZWN1dGUgZXhlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IC0xOyAvLyBhc3N1bWUgdGhlIHdvcnN0CisKKyAgICAgICAgaWYgKCFzcGF3bikgeworICAgICAgICAgICAgcmV0dXJuQ29kZSA9IGV4ZS5leGVjdXRlKCk7CisKKyAgICAgICAgICAgIC8vdGVzdCBmb3IgYW5kIGhhbmRsZSBhIGZvcmNlZCBwcm9jZXNzIGRlYXRoCisgICAgICAgICAgICBpZiAoZXhlLmtpbGxlZFByb2Nlc3MoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVGltZW91dDoga2lsbGVkIHRoZSBzdWItcHJvY2VzcyI7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhtc2csIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heWJlU2V0UmVzdWx0UHJvcGVydHlWYWx1ZShyZXR1cm5Db2RlKTsKKyAgICAgICAgICAgIHJlZGlyZWN0b3IuY29tcGxldGUoKTsKKyAgICAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXR1cm5Db2RlKSkgeworICAgICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza1R5cGUoKSArICIgcmV0dXJuZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcmV0dXJuQ29kZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJSZXN1bHQ6ICIgKyByZXR1cm5Db2RlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4ZS5zcGF3bigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSBjb21tYW5kIHVzaW5nIHRoZSBnaXZlbiBFeGVjdXRlIGluc3RhbmNlLiBUaGlzIG1heSBiZQorICAgICAqIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGUgaW5zdGFuY2Ugb2YgRXhlY3V0ZSB0byBydW4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBuZXcgcHJvY2VzcyBjb3VsZCBub3QgYmUgc3RhcnRlZAorICAgICAqIG9ubHkgaWYgZmFpbElmRXhlY0ZhaWxzIGlzIHNldCB0byB0cnVlICh0aGUgZGVmYXVsdCkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcnVuRXhlYyhFeGVjdXRlIGV4ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2hvdyB0aGUgY29tbWFuZAorICAgICAgICBsb2coY21kbC5kZXNjcmliZUNvbW1hbmQoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNtZGwuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBydW5FeGVjdXRlKGV4ZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChmYWlsSWZFeGVjRmFpbHMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4ZWN1dGUgZmFpbGVkOiAiICsgZS50b1N0cmluZygpLCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJFeGVjdXRlIGZhaWxlZDogIiArIGUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBvdXRwdXQgZmlsZSBpZiByZXF1aXJlZAorICAgICAgICAgICAgbG9nRmx1c2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgU3RyZWFtSGFuZGxlciB0byB1c2Ugd2l0aCBvdXIgRXhlY3V0ZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgRXhlY3V0ZVN0cmVhbUhhbmRsZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHVuZGVyIHVua25vd24gY2lyY3Vtc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgY3JlYXRlSGFuZGxlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWRpcmVjdG9yLmNyZWF0ZUhhbmRsZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIFdhdGNoZG9nIHRvIGtpbGwgYSBydW5hd2F5IHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIEV4ZWN1dGVXYXRjaGRvZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdW5kZXIgdW5rbm93biBjaXJjdW1zdGFuY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBFeGVjdXRlV2F0Y2hkb2cgY3JlYXRlV2F0Y2hkb2coKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKHRpbWVvdXQgPT0gbnVsbCkKKyAgICAgICAgICAgID8gbnVsbCA6IG5ldyBFeGVjdXRlV2F0Y2hkb2codGltZW91dC5sb25nVmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gLSBpZiB0aGVyZSBpcyBvbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nRmx1c2goKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUGF0aChTdHJpbmcgbGluZSkgeworICAgICAgICByZXR1cm4gbGluZS5zdGFydHNXaXRoKCJQQVRIPSIpCisgICAgICAgICAgICB8fCBsaW5lLnN0YXJ0c1dpdGgoIlBhdGg9Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChTdHJpbmcgbGluZSkgeworICAgICAgICByZXR1cm4gbGluZS5zdWJzdHJpbmcoIlBBVEg9Ii5sZW5ndGgoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWRjZTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlLmphdmEKQEAgLTAsMCArMSwxMjM5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogUnVucyBhbiBleHRlcm5hbCBwcm9ncmFtLgorICoKKyAqIEBzaW5jZSBBbnQgMS4yCisgKgorICovCitwdWJsaWMgY2xhc3MgRXhlY3V0ZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT05FX1NFQ09ORCA9IDEwMDA7CisKKyAgICAvKiogSW52YWxpZCBleGl0IGNvZGUuCisgICAgICogc2V0IHRvIHtAbGluayBJbnRlZ2VyI01BWF9WQUxVRX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHByaXZhdGUgU3RyaW5nW10gY21kbCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBlbnYgPSBudWxsOworICAgIHByaXZhdGUgaW50IGV4aXRWYWx1ZSA9IElOVkFMSUQ7CisgICAgcHJpdmF0ZSBFeGVjdXRlU3RyZWFtSGFuZGxlciBzdHJlYW1IYW5kbGVyOworICAgIHByaXZhdGUgRXhlY3V0ZVdhdGNoZG9nIHdhdGNoZG9nOworICAgIHByaXZhdGUgRmlsZSB3b3JraW5nRGlyZWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdCA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIG5ld0Vudmlyb25tZW50ID0gZmFsc2U7CisgICAgLy9UT0RPOiBub3RoaW5nIGFwcGVhcnMgdG8gcmVhZCB0aGlzIGJ1dCBpcyBzZXQgdXNpbmcgYSBwdWJsaWMgc2V0dGVyLgorICAgIHByaXZhdGUgYm9vbGVhbiBzcGF3biA9IGZhbHNlOworCisKKyAgICAvKiogQ29udHJvbHMgd2hldGhlciB0aGUgVk0gaXMgdXNlZCB0byBsYXVuY2ggY29tbWFuZHMsIHdoZXJlIHBvc3NpYmxlLiAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VWTUxhdW5jaGVyID0gdHJ1ZTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhbnRXb3JraW5nRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOworICAgIHByaXZhdGUgc3RhdGljIENvbW1hbmRMYXVuY2hlciB2bUxhdW5jaGVyID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBDb21tYW5kTGF1bmNoZXIgc2hlbGxMYXVuY2hlciA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIHByb2NFbnZpcm9ubWVudCA9IG51bGw7CisKKyAgICAvKiogVXNlZCB0byBkZXN0cm95IHByb2Nlc3NlcyB3aGVuIHRoZSBWTSBleGl0cy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBQcm9jZXNzRGVzdHJveWVyIHByb2Nlc3NEZXN0cm95ZXIgPSBuZXcgUHJvY2Vzc0Rlc3Ryb3llcigpOworCisgICAgLyoqIFVzZWQgZm9yIHJlcGxhY2luZyBlbnYgdmFyaWFibGVzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbnZpcm9ubWVudENhc2VJblNlbnNpdGl2ZSA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxhdW5jaGVyIGZvciB0aGUgT1MgYW5kIEpWTSB3ZSBhcmUgcnVubmluZyB1bmRlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgeworICAgICAgICAvLyBUcnkgdXNpbmcgYSBKREsgMS4zIGxhdW5jaGVyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIU9zLmlzRmFtaWx5KCJvcy8yIikpIHsKKyAgICAgICAgICAgICAgICB2bUxhdW5jaGVyID0gbmV3IEphdmExM0NvbW1hbmRMYXVuY2hlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgYW5kIGtlZXAgdHJ5aW5nCisgICAgICAgIH0KKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJtYWMiKSAmJiAhT3MuaXNGYW1pbHkoInVuaXgiKSkgeworICAgICAgICAgICAgLy8gTWFjCisgICAgICAgICAgICBzaGVsbExhdW5jaGVyID0gbmV3IE1hY0NvbW1hbmRMYXVuY2hlcihuZXcgQ29tbWFuZExhdW5jaGVyKCkpOworICAgICAgICB9IGVsc2UgaWYgKE9zLmlzRmFtaWx5KCJvcy8yIikpIHsKKyAgICAgICAgICAgIC8vIE9TLzIKKyAgICAgICAgICAgIHNoZWxsTGF1bmNoZXIgPSBuZXcgT1MyQ29tbWFuZExhdW5jaGVyKG5ldyBDb21tYW5kTGF1bmNoZXIoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoT3MuaXNGYW1pbHkoIndpbmRvd3MiKSkgeworICAgICAgICAgICAgZW52aXJvbm1lbnRDYXNlSW5TZW5zaXRpdmUgPSB0cnVlOworICAgICAgICAgICAgQ29tbWFuZExhdW5jaGVyIGJhc2VMYXVuY2hlciA9IG5ldyBDb21tYW5kTGF1bmNoZXIoKTsKKworICAgICAgICAgICAgaWYgKCFPcy5pc0ZhbWlseSgid2luOXgiKSkgeworICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgWFAvMjAwMC9OVAorICAgICAgICAgICAgICAgIHNoZWxsTGF1bmNoZXIgPSBuZXcgV2luTlRDb21tYW5kTGF1bmNoZXIoYmFzZUxhdW5jaGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2luZG93cyA5OC85NSAtIG5lZWQgdG8gdXNlIGFuIGF1eGlsaWFyeSBzY3JpcHQKKyAgICAgICAgICAgICAgICBzaGVsbExhdW5jaGVyCisgICAgICAgICAgICAgICAgICAgID0gbmV3IFNjcmlwdENvbW1hbmRMYXVuY2hlcigiYmluL2FudFJ1bi5iYXQiLCBiYXNlTGF1bmNoZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKE9zLmlzRmFtaWx5KCJuZXR3YXJlIikpIHsKKworICAgICAgICAgICAgQ29tbWFuZExhdW5jaGVyIGJhc2VMYXVuY2hlciA9IG5ldyBDb21tYW5kTGF1bmNoZXIoKTsKKworICAgICAgICAgICAgc2hlbGxMYXVuY2hlcgorICAgICAgICAgICAgICAgID0gbmV3IFBlcmxTY3JpcHRDb21tYW5kTGF1bmNoZXIoImJpbi9hbnRSdW4ucGwiLCBiYXNlTGF1bmNoZXIpOworICAgICAgICB9IGVsc2UgaWYgKE9zLmlzRmFtaWx5KCJvcGVudm1zIikpIHsKKyAgICAgICAgICAgIC8vIE9wZW5WTVMKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2hlbGxMYXVuY2hlciA9IG5ldyBWbXNDb21tYW5kTGF1bmNoZXIoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSBhbmQga2VlcCB0cnlpbmcKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEdlbmVyaWMKKyAgICAgICAgICAgIHNoZWxsTGF1bmNoZXIgPSBuZXcgU2NyaXB0Q29tbWFuZExhdW5jaGVyKCJiaW4vYW50UnVuIiwKKyAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExhdW5jaGVyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRoZSBwcm9jZXNzIHRvIGJlIHNwYXduZWQuCisgICAgICogRGVmYXVsdCBpcyBub3Qgc3Bhd25lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGF3biBpZiB0cnVlIHlvdSBkbyBub3Qgd2FudCBBbnQKKyAgICAgKiAgICAgICAgICAgICAgdG8gd2FpdCBmb3IgdGhlIGVuZCBvZiB0aGUgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3Bhd24oYm9vbGVhbiBzcGF3bikgeworICAgICAgICB0aGlzLnNwYXduID0gc3Bhd247CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoaXMgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgICAqIFRoZSB2ZWN0b3IgZWxlbWVudHMgYXJlIHN0cmluZ3MgZm9ybWF0dGVkIGxpa2UgdmFyaWFibGUgPSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBWZWN0b3IgZ2V0UHJvY0Vudmlyb25tZW50KCkgeworICAgICAgICBpZiAocHJvY0Vudmlyb25tZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9jRW52aXJvbm1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgcHJvY0Vudmlyb25tZW50ID0gbmV3IFZlY3RvcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUobmV3IFB1bXBTdHJlYW1IYW5kbGVyKG91dCkpOworICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGdldFByb2NFbnZDb21tYW5kKCkpOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvIG5vdCByZWN1cnNlIGZvcmV2ZXIKKyAgICAgICAgICAgIGV4ZS5zZXROZXdlbnZpcm9ubWVudCh0cnVlKTsKKyAgICAgICAgICAgIGludCByZXR2YWwgPSBleGUuZXhlY3V0ZSgpOworICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSnVzdCB0cnkgdG8gdXNlIHdoYXQgd2UgZ290CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIodG9TdHJpbmcob3V0KSkpOworCisgICAgICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm9wZW52bXMiKSkgeworICAgICAgICAgICAgICAgIHByb2NFbnZpcm9ubWVudCA9IGFkZFZNU0xvZ2ljYWxzKHByb2NFbnZpcm9ubWVudCwgaW4pOworICAgICAgICAgICAgICAgIHJldHVybiBwcm9jRW52aXJvbm1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgdmFyID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lLCBsaW5lU2VwID0gU3RyaW5nVXRpbHMuTElORV9TRVA7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuaW5kZXhPZignPScpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENodW5rIHBhcnQgb2YgcHJldmlvdXMgZW52IHZhciAoVU5JWCBlbnYgdmFycyBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbiBlbWJlZGRlZCBuZXcgbGluZXMpLgorICAgICAgICAgICAgICAgICAgICBpZiAodmFyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciA9IGxpbmVTZXAgKyBsaW5lOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyICs9IGxpbmVTZXAgKyBsaW5lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGVudiB2YXIuLi5hcHBlbmQgdGhlIHByZXZpb3VzIG9uZSBpZiB3ZSBoYXZlIGl0LgorICAgICAgICAgICAgICAgICAgICBpZiAodmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2NFbnZpcm9ubWVudC5hZGRFbGVtZW50KHZhcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmFyID0gbGluZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTaW5jZSB3ZSAibG9vayBhaGVhZCIgYmVmb3JlIGFkZGluZywgdGhlcmUncyBvbmUgbGFzdCBlbnYgdmFyLgorICAgICAgICAgICAgaWYgKHZhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvY0Vudmlyb25tZW50LmFkZEVsZW1lbnQodmFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIC8vIEp1c3QgdHJ5IHRvIHNlZSBob3cgbXVjaCB3ZSBnb3QKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvY0Vudmlyb25tZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIG9wZXJhdGlvbiB0byBnZXQgb3VyIGVudmlyb25tZW50LgorICAgICAqIEl0IGlzIGEgbm90b3Jpb3VzIHRyb3VibGVzcG90IHByZS1KYXZhMS41LCBhbmQgc2hvdWxkIGJlIGFwcHJvYWNoZWQKKyAgICAgKiB3aXRoIGV4dHJlbWUgY2F1dGlvbi4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0UHJvY0VudkNvbW1hbmQoKSB7CisgICAgICAgIGlmIChPcy5pc0ZhbWlseSgib3MvMiIpKSB7CisgICAgICAgICAgICAvLyBPUy8yIC0gdXNlIHNhbWUgbWVjaGFuaXNtIGFzIFdpbmRvd3MgMjAwMAorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImNtZCIsICIvYyIsICJzZXQiIH07CisgICAgICAgIH0gZWxzZSBpZiAoT3MuaXNGYW1pbHkoIndpbmRvd3MiKSkgeworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgWFAvMjAwMC9OVCBvciA5OC85NQorICAgICAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJ3aW45eCIpKSB7CisgICAgICAgICAgICAgICAgLy8gV2luZG93cyA5OC85NQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJjb21tYW5kLmNvbSIsICIvYyIsICJzZXQiIH07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgWFAvMjAwMC9OVC8yMDAzCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImNtZCIsICIvYyIsICJzZXQiIH07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoT3MuaXNGYW1pbHkoInovb3MiKSB8fCBPcy5pc0ZhbWlseSgidW5peCIpKSB7CisgICAgICAgICAgICAvLyBPbiBtb3N0IHN5c3RlbXMgb25lIGNvdWxkIHVzZTogL2Jpbi9zaCAtYyBlbnYKKworICAgICAgICAgICAgLy8gU29tZSBzeXN0ZW1zIGhhdmUgL2Jpbi9lbnYsIG90aGVycyAvdXNyL2Jpbi9lbnYsIGp1c3QgdHJ5CisgICAgICAgICAgICBTdHJpbmdbXSBjbWQgPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgaWYgKG5ldyBGaWxlKCIvYmluL2VudiIpLmNhblJlYWQoKSkgeworICAgICAgICAgICAgICAgIGNtZFswXSA9ICIvYmluL2VudiI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5ldyBGaWxlKCIvdXNyL2Jpbi9lbnYiKS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgICAgICBjbWRbMF0gPSAiL3Vzci9iaW4vZW52IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcmVseSBvbiBQQVRICisgICAgICAgICAgICAgICAgY21kWzBdID0gImVudiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY21kOworICAgICAgICB9IGVsc2UgaWYgKE9zLmlzRmFtaWx5KCJuZXR3YXJlIikgfHwgT3MuaXNGYW1pbHkoIm9zLzQwMCIpKSB7CisgICAgICAgICAgICAvLyByZWx5IG9uIFBBVEgKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJlbnYifTsKKyAgICAgICAgfSBlbHNlIGlmIChPcy5pc0ZhbWlseSgib3BlbnZtcyIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsic2hvdyIsICJsb2dpY2FsIn07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNQUMgT1MgOSBhbmQgcHJldmlvdXMKKyAgICAgICAgICAgIC8vVE9ETzogSSBoYXZlIG5vIGlkZWEgaG93IHRvIGdldCBpdCwgc29tZW9uZSBtdXN0IGZpeCBpdAorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCeXRlQXJyYXlPdXRwdXRTdHJlYW0jdG9TdHJpbmcgZG9lc24ndCBzZWVtIHRvIHdvcmsgcmVsaWFibHkgb24KKyAgICAgKiBPUy8zOTAsIGF0IGxlYXN0IG5vdCB0aGUgd2F5IHdlIHVzZSBpdCBpbiB0aGUgZXhlY3V0aW9uCisgICAgICogY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib3MgdGhlIG91dHB1dCBzdHJlYW0gdGhhdCBvbmUgd2FudHMgdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXQgc3RyZWFtIGFzIGEgc3RyaW5nLCByZWFkIHdpdGgKKyAgICAgKiBzcGVjaWFsIGVuY29kaW5ncyBpbiB0aGUgY2FzZSBvZiB6L29zIGFuZCBvcy80MDAuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MpIHsKKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJ6L29zIikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvcy50b1N0cmluZygiQ3AxMDQ3Iik7CisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vbm9vcCBkZWZhdWx0IGVuY29kaW5nIHVzZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChPcy5pc0ZhbWlseSgib3MvNDAwIikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvcy50b1N0cmluZygiQ3A1MDAiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy9ub29wIGRlZmF1bHQgZW5jb2RpbmcgdXNlZAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBib3MudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGV4ZWN1dGUgb2JqZWN0IHVzaW5nIDxjb2RlPlB1bXBTdHJlYW1IYW5kbGVyPC9jb2RlPiBmb3IKKyAgICAgKiBzdHJlYW0gaGFuZGxpbmcuCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dGUoKSB7CisgICAgICAgIHRoaXMobmV3IFB1bXBTdHJlYW1IYW5kbGVyKCksIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZXhlY3V0ZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtSGFuZGxlciB0aGUgc3RyZWFtIGhhbmRsZXIgdXNlZCB0byBoYW5kbGUgdGhlIGlucHV0IGFuZAorICAgICAqICAgICAgICBvdXRwdXQgc3RyZWFtcyBvZiB0aGUgc3VicHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhlY3V0ZShFeGVjdXRlU3RyZWFtSGFuZGxlciBzdHJlYW1IYW5kbGVyKSB7CisgICAgICAgIHRoaXMoc3RyZWFtSGFuZGxlciwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBleGVjdXRlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGVyIHRoZSBzdHJlYW0gaGFuZGxlciB1c2VkIHRvIGhhbmRsZSB0aGUgaW5wdXQgYW5kCisgICAgICogICAgICAgIG91dHB1dCBzdHJlYW1zIG9mIHRoZSBzdWJwcm9jZXNzLgorICAgICAqIEBwYXJhbSB3YXRjaGRvZyBhIHdhdGNoZG9nIGZvciB0aGUgc3VicHJvY2VzcyBvciA8Y29kZT5udWxsPC9jb2RlPiB0bworICAgICAqICAgICAgICB0byBkaXNhYmxlIGEgdGltZW91dCBmb3IgdGhlIHN1YnByb2Nlc3MuCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dGUoRXhlY3V0ZVN0cmVhbUhhbmRsZXIgc3RyZWFtSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICBFeGVjdXRlV2F0Y2hkb2cgd2F0Y2hkb2cpIHsKKyAgICAgICAgc2V0U3RyZWFtSGFuZGxlcihzdHJlYW1IYW5kbGVyKTsKKyAgICAgICAgdGhpcy53YXRjaGRvZyA9IHdhdGNoZG9nOworICAgICAgICAvL0J5IGRlZmF1bHQsIHVzZSB0aGUgc2hlbGwgbGF1bmNoZXIgZm9yIFZNUworICAgICAgICAvLworICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm9wZW52bXMiKSkgeworICAgICAgICAgICAgdXNlVk1MYXVuY2hlciA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdHJlYW0gaGFuZGxlciB0byB1c2UuCisgICAgICogQHBhcmFtIHN0cmVhbUhhbmRsZXIgRXhlY3V0ZVN0cmVhbUhhbmRsZXIuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW1IYW5kbGVyKEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHN0cmVhbUhhbmRsZXIpIHsKKyAgICAgICAgdGhpcy5zdHJlYW1IYW5kbGVyID0gc3RyZWFtSGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kbGluZSB1c2VkIHRvIGNyZWF0ZSBhIHN1YnByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kbGluZSB1c2VkIHRvIGNyZWF0ZSBhIHN1YnByb2Nlc3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldENvbW1hbmRsaW5lKCkgeworICAgICAgICByZXR1cm4gY21kbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21tYW5kbGluZSBvZiB0aGUgc3VicHJvY2VzcyB0byBsYXVuY2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWFuZGxpbmUgdGhlIGNvbW1hbmRsaW5lIG9mIHRoZSBzdWJwcm9jZXNzIHRvIGxhdW5jaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kbGluZShTdHJpbmdbXSBjb21tYW5kbGluZSkgeworICAgICAgICBjbWRsID0gY29tbWFuZGxpbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gcHJvcGFnYXRlIHRoZSBkZWZhdWx0IGVudmlyb25tZW50IG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdlbnYgd2hldGhlciB0byBwcm9wYWdhdGUgdGhlIHByb2Nlc3MgZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmV3ZW52aXJvbm1lbnQoYm9vbGVhbiBuZXdlbnYpIHsKKyAgICAgICAgbmV3RW52aXJvbm1lbnQgPSBuZXdlbnY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW52aXJvbm1lbnQgdXNlZCB0byBjcmVhdGUgYSBzdWJwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZW52aXJvbm1lbnQgdXNlZCB0byBjcmVhdGUgYSBzdWJwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnZpcm9ubWVudCgpIHsKKyAgICAgICAgcmV0dXJuIChlbnYgPT0gbnVsbCB8fCBuZXdFbnZpcm9ubWVudCkKKyAgICAgICAgICAgID8gZW52IDogcGF0Y2hFbnZpcm9ubWVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIHN1YnByb2Nlc3MgdG8gbGF1bmNoLgorICAgICAqCisgICAgICogQHBhcmFtIGVudiBhcnJheSBvZiBTdHJpbmdzLCBlYWNoIGVsZW1lbnQgb2Ygd2hpY2ggaGFzCisgICAgICogYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0dGluZ3MgaW4gZm9ybWF0IDxlbT5rZXk9dmFsdWU8L2VtPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChTdHJpbmdbXSBlbnYpIHsKKyAgICAgICAgdGhpcy5lbnYgPSBlbnY7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MgdG8gZXhlY3V0ZS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaXMgZW11bGF0ZWQgdXNpbmcgdGhlIGFudFJ1biBzY3JpcHRzIHVubGVzcyB0aGUgT1MgaXMKKyAgICAgKiBXaW5kb3dzIE5UIGluIHdoaWNoIGNhc2UgYSBjbWQuZXhlIGlzIHNwYXduZWQsCisgICAgICogb3IgTVJKIGFuZCBzZXR0aW5nIHVzZXIuZGlyIHdvcmtzLCBvciBKREsgMS4zIGFuZCB0aGVyZSBpcworICAgICAqIG9mZmljaWFsIHN1cHBvcnQgaW4gamF2YS5sYW5nLlJ1bnRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2QgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdvcmtpbmdEaXJlY3RvcnkoRmlsZSB3ZCkgeworICAgICAgICB3b3JraW5nRGlyZWN0b3J5ID0KKyAgICAgICAgICAgICh3ZCA9PSBudWxsIHx8IHdkLmdldEFic29sdXRlUGF0aCgpLmVxdWFscyhhbnRXb3JraW5nRGlyZWN0b3J5KSkKKyAgICAgICAgICAgID8gbnVsbCA6IHdkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgd29ya2luZyBkaXJlY3RvcnkuCisgICAgICogQHJldHVybiB0aGUgZGlyZWN0b3J5IGFzIGEgRmlsZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFdvcmtpbmdEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiB3b3JraW5nRGlyZWN0b3J5ID09IG51bGwgPyBuZXcgRmlsZShhbnRXb3JraW5nRGlyZWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogd29ya2luZ0RpcmVjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGFudFJ1biBzY3JpcHQgdXNpbmcgdGhlIHByb2plY3QncyB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG5vdCBjbGVhciB3aGVuIGl0IGlzIGdvaW5nIHRvIHRocm93IGFuIGV4Y2VwdGlvbiwgYnV0CisgICAgICogaXQgaXMgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbnRSdW4oUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIExhdW5jaCB0aGlzIGV4ZWN1dGlvbiB0aHJvdWdoIHRoZSBWTSwgd2hlcmUgcG9zc2libGUsIHJhdGhlciB0aGFuIHRocm91Z2gKKyAgICAgKiB0aGUgT1MncyBzaGVsbC4gSW4gc29tZSBjYXNlcyBhbmQgb3BlcmF0aW5nIHN5c3RlbXMgdXNpbmcgdGhlIHNoZWxsIHdpbGwKKyAgICAgKiBhbGxvdyB0aGUgc2hlbGwgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIHByb2Nlc3Npbmcgc3VjaCBhcyBhc3NvY2lhdGluZyBhbgorICAgICAqIGV4ZWN1dGFibGUgd2l0aCBhIHNjcmlwdCwgZXRjLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZVZNTGF1bmNoZXIgdHJ1ZSBpZiBleGVjIHNob3VsZCBsYXVuY2ggdGhyb3VnaCB0aGUgVk0sCisgICAgICogICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIHNoZWxsIHNob3VsZCBiZSB1c2VkIHRvIGxhdW5jaCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZNTGF1bmNoZXIoYm9vbGVhbiB1c2VWTUxhdW5jaGVyKSB7CisgICAgICAgIHRoaXMudXNlVk1MYXVuY2hlciA9IHVzZVZNTGF1bmNoZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHByb2Nlc3MgdGhhdCBydW5zIGEgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBQcm9qZWN0LCBvbmx5IHVzZWQgZm9yIGxvZ2dpbmcgcHVycG9zZXMsIG1heSBiZSBudWxsLgorICAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIHJ1bi4KKyAgICAgKiBAcGFyYW0gZW52IHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIGNvbW1hbmQuCisgICAgICogQHBhcmFtIGRpciB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBjb21tYW5kLgorICAgICAqIEBwYXJhbSB1c2VWTSB1c2UgdGhlIGJ1aWx0LWluIGV4ZWMgY29tbWFuZCBmb3IgSkRLIDEuMyBpZiBhdmFpbGFibGUuCisgICAgICogQHJldHVybiB0aGUgcHJvY2VzcyBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gZm9yd2FyZGVkIGZyb20gdGhlIHBhcnRpY3VsYXIgbGF1bmNoZXIgdXNlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9jZXNzIGxhdW5jaChQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBlbnYsIEZpbGUgZGlyLCBib29sZWFuIHVzZVZNKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGlyICE9IG51bGwgJiYgIWRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGRpciArICIgZG9lc24ndCBleGlzdC4iKTsKKyAgICAgICAgfQorICAgICAgICBDb21tYW5kTGF1bmNoZXIgbGF1bmNoZXIKKyAgICAgICAgICAgID0gKCh1c2VWTSAmJiB2bUxhdW5jaGVyICE9IG51bGwpID8gdm1MYXVuY2hlciA6IHNoZWxsTGF1bmNoZXIpOworICAgICAgICByZXR1cm4gbGF1bmNoZXIuZXhlYyhwcm9qZWN0LCBjb21tYW5kLCBlbnYsIGRpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyBhIHByb2Nlc3MgZGVmaW5lZCBieSB0aGUgY29tbWFuZCBsaW5lIGFuZCByZXR1cm5zIGl0cyBleGl0IHN0YXR1cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBzdWJwcm9jZXNzIG9yIDxjb2RlPklOVkFMSUQ8L2NvZGU+LgorICAgICAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGlzIHRocm93biwgaWYgbGF1bmNoaW5nCisgICAgICogICAgICAgICAgICBvZiB0aGUgc3VicHJvY2VzcyBmYWlsZWQuCisgICAgICovCisgICAgcHVibGljIGludCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHdvcmtpbmdEaXJlY3RvcnkgIT0gbnVsbCAmJiAhd29ya2luZ0RpcmVjdG9yeS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHdvcmtpbmdEaXJlY3RvcnkgKyAiIGRvZXNuJ3QgZXhpc3QuIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUHJvY2VzcyBwcm9jZXNzID0gbGF1bmNoKHByb2plY3QsIGdldENvbW1hbmRsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZpcm9ubWVudCgpLCB3b3JraW5nRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVk1MYXVuY2hlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdHJlYW1IYW5kbGVyLnNldFByb2Nlc3NJbnB1dFN0cmVhbShwcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIHN0cmVhbUhhbmRsZXIuc2V0UHJvY2Vzc091dHB1dFN0cmVhbShwcm9jZXNzLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgc3RyZWFtSGFuZGxlci5zZXRQcm9jZXNzRXJyb3JTdHJlYW0ocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcHJvY2Vzcy5kZXN0cm95KCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIHN0cmVhbUhhbmRsZXIuc3RhcnQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gYWRkIHRoZSBwcm9jZXNzIHRvIHRoZSBsaXN0IG9mIHRob3NlIHRvIGRlc3Ryb3kgaWYgdGhlIFZNIGV4aXRzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcHJvY2Vzc0Rlc3Ryb3llci5hZGQocHJvY2Vzcyk7CisKKyAgICAgICAgICAgIGlmICh3YXRjaGRvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2F0Y2hkb2cuc3RhcnQocHJvY2Vzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YWl0Rm9yKHByb2Nlc3MpOworCisgICAgICAgICAgICBpZiAod2F0Y2hkb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdhdGNoZG9nLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbUhhbmRsZXIuc3RvcCgpOworICAgICAgICAgICAgY2xvc2VTdHJlYW1zKHByb2Nlc3MpOworCisgICAgICAgICAgICBpZiAod2F0Y2hkb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdhdGNoZG9nLmNoZWNrRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ2V0RXhpdFZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocmVhZERlYXRoIHQpIHsKKyAgICAgICAgICAgIC8vICMzMTkyODogZm9yY2libHkga2lsbCBpdCBiZWZvcmUgY29udGludWluZy4KKyAgICAgICAgICAgIHByb2Nlc3MuZGVzdHJveSgpOworICAgICAgICAgICAgdGhyb3cgdDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcHJvY2VzcyB0byB0aGUgbGlzdCBvZiB0aG9zZSB0byBkZXN0cm95IGlmCisgICAgICAgICAgICAvLyB0aGUgVk0gZXhpdHMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBwcm9jZXNzRGVzdHJveWVyLnJlbW92ZShwcm9jZXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBhIHByb2Nlc3MgZGVmaW5lZCBieSB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEFudCB3aWxsIG5vdCB3YWl0IGZvciB0aGlzIHByb2Nlc3MsIG5vciBsb2cgaXRzIG91dHB1dC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGlzIHRocm93biwgaWYgbGF1bmNoaW5nCisgICAgICogICAgICAgICAgICBvZiB0aGUgc3VicHJvY2VzcyBmYWlsZWQuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzcGF3bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3b3JraW5nRGlyZWN0b3J5ICE9IG51bGwgJiYgIXdvcmtpbmdEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih3b3JraW5nRGlyZWN0b3J5ICsgIiBkb2Vzbid0IGV4aXN0LiIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFByb2Nlc3MgcHJvY2VzcyA9IGxhdW5jaChwcm9qZWN0LCBnZXRDb21tYW5kbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52aXJvbm1lbnQoKSwgd29ya2luZ0RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZNTGF1bmNoZXIpOworICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIndpbmRvd3MiKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoT05FX1NFQ09ORCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5sb2coImludGVycnVwdGlvbiBpbiB0aGUgc2xlZXAgYWZ0ZXIgaGF2aW5nIHNwYXduZWQgYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcHJvY2VzcyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE91dHB1dFN0cmVhbSBkdW1teU91dCA9IG5ldyBPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBFeGVjdXRlU3RyZWFtSGFuZGxlciBoYW5kbGVyID0gbmV3IFB1bXBTdHJlYW1IYW5kbGVyKGR1bW15T3V0KTsKKyAgICAgICAgaGFuZGxlci5zZXRQcm9jZXNzRXJyb3JTdHJlYW0ocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsKKyAgICAgICAgaGFuZGxlci5zZXRQcm9jZXNzT3V0cHV0U3RyZWFtKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgIGhhbmRsZXIuc3RhcnQoKTsKKyAgICAgICAgcHJvY2Vzcy5nZXRPdXRwdXRTdHJlYW0oKS5jbG9zZSgpOworCisgICAgICAgIHByb2plY3QubG9nKCJzcGF3bmVkIHByb2Nlc3MgIiArIHByb2Nlc3MudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCBmb3IgYSBnaXZlbiBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2Nlc3MgdGhlIHByb2Nlc3Mgb25lIHdhbnRzIHRvIHdhaXQgZm9yLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3IoUHJvY2VzcyBwcm9jZXNzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9jZXNzLndhaXRGb3IoKTsKKyAgICAgICAgICAgIHNldEV4aXRWYWx1ZShwcm9jZXNzLmV4aXRWYWx1ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcHJvY2Vzcy5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGV4aXQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgZXhpdCB2YWx1ZSBvZiB0aGUgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFeGl0VmFsdWUoaW50IHZhbHVlKSB7CisgICAgICAgIGV4aXRWYWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSBleGl0IHZhbHVlIG9mIHRoZSBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gdGhlIGV4aXQgdmFsdWUgb3IgRXhlY3V0ZS5JTlZBTElEIGlmIG5vIGV4aXQgdmFsdWUgaGFzCisgICAgICogYmVlbiByZWNlaXZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEV4aXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4aXRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciA8Y29kZT5leGl0VmFsdWU8L2NvZGU+IHNpZ25hbHMgYSBmYWlsdXJlIG9uIHRoZSBjdXJyZW50CisgICAgICogc3lzdGVtIChPUyBzcGVjaWZpYykuCisgICAgICoKKyAgICAgKiA8cD48Yj5Ob3RlPC9iPiB0aGF0IHRoaXMgbWV0aG9kIHJlbGllcyBvbiB0aGUgY29udmVudGlvbnMgb2YKKyAgICAgKiB0aGUgT1MsIGl0IHdpbGwgcmV0dXJuIGZhbHNlIHJlc3VsdHMgaWYgdGhlIGFwcGxpY2F0aW9uIHlvdSBhcmUKKyAgICAgKiBydW5uaW5nIGRvZXNuJ3QgZm9sbG93IHRoZXNlIGNvbnZlbnRpb25zLiAgT25lIG5vdGFibGUKKyAgICAgKiBleGNlcHRpb24gaXMgdGhlIEphdmEgVk0gcHJvdmlkZWQgYnkgSFAgZm9yIE9wZW5WTVMgLSBpdCB3aWxsCisgICAgICogcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCAobGlrZSBvbiBhbnkgb3RoZXIgcGxhdGZvcm0pLCBidXQgdGhpcworICAgICAqIHNpZ25hbHMgYSBmYWlsdXJlIG9uIE9wZW5WTVMuICBTbyBpZiB5b3UgZXhlY3V0ZSBhIG5ldyBKYXZhIFZNCisgICAgICogb24gT3BlblZNUywgeW91IGNhbm5vdCB0cnVzdCB0aGlzIG1ldGhvZC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhpdFZhbHVlIHRoZSBleGl0IHZhbHVlIChyZXR1cm4gY29kZSkgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmV4aXRWYWx1ZTwvY29kZT4gc2lnbmFscyBhIGZhaWx1cmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFpbHVyZShpbnQgZXhpdFZhbHVlKSB7CisgICAgICAgIC8vb24gb3BlbnZtcyBldmVuIGV4aXQgdmFsdWUgc2lnbmFscyBmYWlsdXJlOworICAgICAgICAvLyBmb3Igb3RoZXIgcGxhdGZvcm1zIG5vbnplcm8gZXhpdCB2YWx1ZSBzaWduYWxzIGZhaWx1cmUKKyAgICAgICAgcmV0dXJuIE9zLmlzRmFtaWx5KCJvcGVudm1zIikKKyAgICAgICAgICAgID8gKGV4aXRWYWx1ZSAlIDIgPT0gMCkgOiAoZXhpdFZhbHVlICE9IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpZCB0aGlzIGV4ZWN1dGUgcmV0dXJuIGluIGEgZmFpbHVyZS4KKyAgICAgKiBAc2VlICNpc0ZhaWx1cmUoaW50KQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZXhpdCBjb2RlIGlzIGludGVycHJldGVkIGFzIGEgZmFpbHVyZQorICAgICAqIEBzaW5jZSBBbnQxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWx1cmUoKSB7CisgICAgICAgIHJldHVybiBpc0ZhaWx1cmUoZ2V0RXhpdFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIGFuIHVudGltZWx5IGRlYXRoIG9mIHRoZSBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHdhdGNoZG9nIGhhZCB0byBraWxsIHRoZSBwcm9jZXNzLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4ga2lsbGVkUHJvY2VzcygpIHsKKyAgICAgICAgcmV0dXJuIHdhdGNoZG9nICE9IG51bGwgJiYgd2F0Y2hkb2cua2lsbGVkUHJvY2VzcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhdGNoIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHdpdGggdGhlIG5ldyB2YWx1ZXMgZnJvbSB0aGUgdXNlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXRjaGVkIGVudmlyb25tZW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nW10gcGF0Y2hFbnZpcm9ubWVudCgpIHsKKyAgICAgICAgLy8gT24gT3BlblZNUyBSdW50aW1lI2V4ZWMoKSBkb2Vzbid0IHN1cHBvcnQgdGhlIGVudmlyb25tZW50IGFycmF5LAorICAgICAgICAvLyBzbyB3ZSBvbmx5IHJldHVybiB0aGUgbmV3IHZhbHVlcyB3aGljaCB0aGVuIHdpbGwgYmUgc2V0IGluCisgICAgICAgIC8vIHRoZSBnZW5lcmF0ZWQgRENMIHNjcmlwdCwgaW5oZXJpdGluZyB0aGUgcGFyZW50IHByb2Nlc3MgZW52aXJvbm1lbnQKKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJvcGVudm1zIikpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnY7CisgICAgICAgIH0KKyAgICAgICAgVmVjdG9yIG9zRW52ID0gKFZlY3RvcikgZ2V0UHJvY0Vudmlyb25tZW50KCkuY2xvbmUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXlWYWx1ZSA9IGVudltpXTsKKyAgICAgICAgICAgIC8vIEdldCBrZXkgaW5jbHVkaW5nICI9IgorICAgICAgICAgICAgU3RyaW5nIGtleSA9IGtleVZhbHVlLnN1YnN0cmluZygwLCBrZXlWYWx1ZS5pbmRleE9mKCc9JykgKyAxKTsKKyAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudENhc2VJblNlbnNpdGl2ZSkgeworICAgICAgICAgICAgICAgIC8vIE5iOiB1c2luZyBkZWZhdWx0IGxvY2FsZSBhcyBrZXkgaXMgYSBlbnYgbmFtZQorICAgICAgICAgICAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNpemUgPSBvc0Vudi5zaXplKCk7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBrZXkgaW4gdGhlIGN1cnJlbnQgZW52aXJvbWVudCBjb3B5CisgICAgICAgICAgICAvLyBhbmQgcmVtb3ZlIGl0LgorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3NFbnZJdGVtID0gKFN0cmluZykgb3NFbnYuZWxlbWVudEF0KGopOworICAgICAgICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZWRJdGVtID0gZW52aXJvbm1lbnRDYXNlSW5TZW5zaXRpdmUKKyAgICAgICAgICAgICAgICAgICAgPyBvc0Vudkl0ZW0udG9Mb3dlckNhc2UoKSA6IG9zRW52SXRlbTsKKyAgICAgICAgICAgICAgICBpZiAoY29udmVydGVkSXRlbS5zdGFydHNXaXRoKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3NFbnYucmVtb3ZlRWxlbWVudEF0KGopOworICAgICAgICAgICAgICAgICAgICBpZiAoZW52aXJvbm1lbnRDYXNlSW5TZW5zaXRpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgY2FzaW5lc3Mgb2YgdGhlIGtleQorICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWUgPSBvc0Vudkl0ZW0uc3Vic3RyaW5nKDAsIGtleS5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleVZhbHVlLnN1YnN0cmluZyhrZXkubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkZCB0aGUga2V5IHRvIHRoZSBlbnZpcm9tbmVudCBjb3B5CisgICAgICAgICAgICBvc0Vudi5hZGRFbGVtZW50KGtleVZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSAob3NFbnYudG9BcnJheShuZXcgU3RyaW5nW29zRW52LnNpemUoKV0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHV0aWxpdHkgbWV0aG9kIHRoYXQgcnVucyBhbiBleHRlcm5hbCBjb21tYW5kLiAgV3JpdGVzIHRoZSBvdXRwdXQgYW5kCisgICAgICogZXJyb3Igc3RyZWFtcyBvZiB0aGUgY29tbWFuZCB0byB0aGUgcHJvamVjdCBsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFzayAgICAgIFRoZSB0YXNrIHRoYXQgdGhlIGNvbW1hbmQgaXMgcGFydCBvZi4gIFVzZWQgZm9yIGxvZ2dpbmcKKyAgICAgKiBAcGFyYW0gY21kbGluZSAgIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGRvZXMgbm90IGV4aXQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5Db21tYW5kKFRhc2sgdGFzaywgU3RyaW5nW10gY21kbGluZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhc2subG9nKENvbW1hbmRsaW5lLmRlc2NyaWJlQ29tbWFuZChjbWRsaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgRXhlY3V0ZSBleGUgPSBuZXcgRXhlY3V0ZSgKKyAgICAgICAgICAgICAgICBuZXcgTG9nU3RyZWFtSGFuZGxlcih0YXNrLCBQcm9qZWN0Lk1TR19JTkZPLCBQcm9qZWN0Lk1TR19FUlIpKTsKKyAgICAgICAgICAgIGV4ZS5zZXRBbnRSdW4odGFzay5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNtZGxpbmUpOworICAgICAgICAgICAgaW50IHJldHZhbCA9IGV4ZS5leGVjdXRlKCk7CisgICAgICAgICAgICBpZiAoaXNGYWlsdXJlKHJldHZhbCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oY21kbGluZVswXQorICAgICAgICAgICAgICAgICAgICArICIgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUgIiArIHJldHZhbCwgdGFzay5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGxhdW5jaCAiICsgY21kbGluZVswXSArICI6ICIKKyAgICAgICAgICAgICAgICArIGV4YywgdGFzay5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzdHJlYW1zIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gUHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gcHJvY2VzcyAgIHRoZSA8Y29kZT5Qcm9jZXNzPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VTdHJlYW1zKFByb2Nlc3MgcHJvY2VzcykgeworICAgICAgICBGaWxlVXRpbHMuY2xvc2UocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHByb2Nlc3MuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICBGaWxlVXRpbHMuY2xvc2UocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBWTVMgc3BlY2lmaWMgYW5kIHVzZWQgYnkgZ2V0UHJvY0Vudmlyb25tZW50KCkuCisgICAgICoKKyAgICAgKiBQYXJzZXMgVk1TIGxvZ2ljYWxzIGZyb20gPGNvZGU+aW48L2NvZGU+IGFuZCBhZGRzIHRoZW0gdG8KKyAgICAgKiA8Y29kZT5lbnZpcm9ubWVudDwvY29kZT4uICA8Y29kZT5pbjwvY29kZT4gaXMgZXhwZWN0ZWQgdG8gYmUgdGhlCisgICAgICogb3V0cHV0IG9mICJTSE9XIExPR0lDQUwiLiAgVGhlIG1ldGhvZCB0YWtlcyBjYXJlIG9mIHBhcnNpbmcgdGhlIG91dHB1dAorICAgICAqIGNvcnJlY3RseSBhcyB3ZWxsIGFzIG1ha2luZyBzdXJlIHRoYXQgYSBsb2dpY2FsIGRlZmluZWQgaW4gbXVsdGlwbGUKKyAgICAgKiB0YWJsZXMgb25seSBnZXRzIGFkZGVkIGZyb20gdGhlIGhpZ2hlc3Qgb3JkZXIgdGFibGUuICBMb2dpY2FscyB3aXRoCisgICAgICogbXVsdGlwbGUgZXF1aXZhbGVuY2UgbmFtZXMgYXJlIG1hcHBlZCB0byBhIHZhcmlhYmxlIHdpdGggbXVsdGlwbGUKKyAgICAgKiB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGEgY29tbWEgKCwpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFZlY3RvciBhZGRWTVNMb2dpY2FscyhWZWN0b3IgZW52aXJvbm1lbnQsIEJ1ZmZlcmVkUmVhZGVyIGluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBIYXNoTWFwIGxvZ2ljYWxzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgU3RyaW5nIGxvZ05hbWUgPSBudWxsLCBsb2dWYWx1ZSA9IG51bGwsIG5ld0xvZ05hbWU7CisgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcGFyc2UgdGhlIFZNUyBsb2dpY2FscyBpbnRvIHJlcXVpcmVkIGZvcm1hdCAoIlZBUj1WQUxbLFZBTDJdIikKKyAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIlx0PSIpKSB7CisgICAgICAgICAgICAgICAgLy8gZnVydGhlciBlcXVpdmFsZW5jZSBuYW1lIG9mIHByZXZpb3VzIGxvZ2ljYWwKKyAgICAgICAgICAgICAgICBpZiAobG9nTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ1ZhbHVlICs9ICIsIiArIGxpbmUuc3Vic3RyaW5nKDQsIGxpbmUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiICBcIiIpKSB7CisgICAgICAgICAgICAgICAgLy8gbmV3IGxvZ2ljYWw/CisgICAgICAgICAgICAgICAgaWYgKGxvZ05hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2dpY2Fscy5wdXQobG9nTmFtZSwgbG9nVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgZXFJbmRleCA9IGxpbmUuaW5kZXhPZignPScpOworICAgICAgICAgICAgICAgIG5ld0xvZ05hbWUgPSBsaW5lLnN1YnN0cmluZygzLCBlcUluZGV4IC0gMik7CisgICAgICAgICAgICAgICAgaWYgKGxvZ2ljYWxzLmNvbnRhaW5zS2V5KG5ld0xvZ05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZ290IHRoaXMgbG9naWNhbCBmcm9tIGEgaGlnaGVyIG9yZGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgIGxvZ05hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ05hbWUgPSBuZXdMb2dOYW1lOworICAgICAgICAgICAgICAgICAgICBsb2dWYWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGVxSW5kZXggKyAzLCBsaW5lLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgLy8gU2luY2Ugd2UgImxvb2sgYWhlYWQiIGJlZm9yZSBhZGRpbmcsIHRoZXJlJ3Mgb25lIGxhc3QgZW52IHZhci4KKyAgICAgICAgaWYgKGxvZ05hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9naWNhbHMucHV0KGxvZ05hbWUsIGxvZ1ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsb2dpY2Fscy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBsb2dpY2FsID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICBlbnZpcm9ubWVudC5hZGQobG9naWNhbCArICI9IiArIGxvZ2ljYWxzLmdldChsb2dpY2FsKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVudmlyb25tZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29tbWFuZCBsYXVuY2hlciBmb3IgYSBwYXJ0aWN1bGFyIEpWTS9PUyBwbGF0Zm9ybS4gIFRoaXMgY2xhc3MgaXMKKyAgICAgKiBhIGdlbmVyYWwgcHVycG9zZSBjb21tYW5kIGxhdW5jaGVyIHdoaWNoIGNhbiBvbmx5IGxhdW5jaCBjb21tYW5kcyBpbgorICAgICAqIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbW1hbmRMYXVuY2hlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gY29tbWFuZCBpbiBhIG5ldyBwcm9jZXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCAgICAgICBUaGUgcHJvamVjdCB0aGF0IHRoZSBjb21tYW5kIGlzIHBhcnQgb2YuCisgICAgICAgICAqIEBwYXJhbSBjbWQgICAgICAgICAgIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisgICAgICAgICAqIEBwYXJhbSBlbnYgICAgICAgICAgIFRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIG5ldyBwcm9jZXNzLiAgSWYgbnVsbCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgdXNlZC4KKyAgICAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBQcm9jZXNzLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGF0dGVtcHRpbmcgdG8gcnVuIGEgY29tbWFuZCBpbiBhCisgICAgICAgICAqIHNwZWNpZmljIGRpcmVjdG9yeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudikKKyAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJFeGVjdXRlOkNvbW1hbmRMYXVuY2hlcjogIgorICAgICAgICAgICAgICAgICAgICArIENvbW1hbmRsaW5lLmRlc2NyaWJlQ29tbWFuZChjbWQpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWQsIGVudik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2VzcywgaW4gdGhlIGdpdmVuIHdvcmtpbmcKKyAgICAgICAgICogZGlyZWN0b3J5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCAgICAgICBUaGUgcHJvamVjdCB0aGF0IHRoZSBjb21tYW5kIGlzIHBhcnQgb2YuCisgICAgICAgICAqIEBwYXJhbSBjbWQgICAgICAgICAgIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisgICAgICAgICAqIEBwYXJhbSBlbnYgICAgICAgICAgIFRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIG5ldyBwcm9jZXNzLiAgSWYgbnVsbCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgdXNlZC4KKyAgICAgICAgICogQHBhcmFtIHdvcmtpbmdEaXIgICAgVGhlIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgY29tbWFuZCBpbi4gIElmIG51bGwsCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyB1c2VkLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIFByb2Nlc3MuCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGlmIHRyeWluZyB0byBjaGFuZ2UgZGlyZWN0b3J5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGNtZCwgU3RyaW5nW10gZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgd29ya2luZ0RpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh3b3JraW5nRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBjbWQsIGVudik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBleGVjdXRlIGEgcHJvY2VzcyBpbiBkaWZmZXJlbnQgIgorICAgICAgICAgICAgICAgICsgImRpcmVjdG9yeSB1bmRlciB0aGlzIEpWTSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb21tYW5kIGxhdW5jaGVyIGZvciBKREsvSlJFIDEuMyAoYW5kIGhpZ2hlcikuICBVc2VzIHRoZSBidWlsdC1pbgorICAgICAqIFJ1bnRpbWUuZXhlYygpIGNvbW1hbmQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YTEzQ29tbWFuZExhdW5jaGVyIGV4dGVuZHMgQ29tbWFuZExhdW5jaGVyIHsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbXlFeGVjV2l0aENXRDsKKworICAgICAgICBwdWJsaWMgSmF2YTEzQ29tbWFuZExhdW5jaGVyKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBMb2NhdGUgbWV0aG9kIFJ1bnRpbWUuZXhlYyhTdHJpbmdbXSBjbWRhcnJheSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGVudnAsIEZpbGUgZGlyKQorICAgICAgICAgICAgbXlFeGVjV2l0aENXRCA9IFJ1bnRpbWUuY2xhc3MuZ2V0TWV0aG9kKCJleGVjIiwKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7U3RyaW5nW10uY2xhc3MsIFN0cmluZ1tdLmNsYXNzLCBGaWxlLmNsYXNzfSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2VzcywgaW4gdGhlIGdpdmVuIHdvcmtpbmcKKyAgICAgICAgICogZGlyZWN0b3J5LgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgQW50IHByb2plY3QuCisgICAgICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICAgICAqIEBwYXJhbSBlbnYgdGhlIGVudmlyb25tZW50IHRvIHNldCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAgICAgKiBAcGFyYW0gd29ya2luZ0RpciB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbW1hbmQKKyAgICAgICAgICogc2hvdWxkIHJ1bi4KKyAgICAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBQcm9jZXNzLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHByb2JhYmx5IGZvcndhcmRlZCBmcm9tIFJ1bnRpbWUjZXhlYy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHdvcmtpbmdEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5sb2coIkV4ZWN1dGU6SmF2YTEzQ29tbWFuZExhdW5jaGVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIENvbW1hbmRsaW5lLmRlc2NyaWJlQ29tbWFuZChjbWQpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAoUHJvY2VzcykgbXlFeGVjV2l0aENXRC5pbnZva2UoUnVudGltZS5nZXRSdW50aW1lKCksCisgICAgICAgICAgICAgICAgICAgLyogdGhlIGFyZ3VtZW50czogKi8gbmV3IE9iamVjdFtdIHtjbWQsIGVudiwgd29ya2luZ0Rpcn0pOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgcmVhbGV4YyA9IGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAocmVhbGV4YyBpbnN0YW5jZW9mIFRocmVhZERlYXRoKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChUaHJlYWREZWF0aCkgcmVhbGV4YzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWxleGMgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIHJlYWxleGM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZXhlY3V0ZSBjb21tYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxleGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgICAgICAvLyBJbGxlZ2FsQWNjZXNzLCBJbGxlZ2FsQXJndW1lbnQsIENsYXNzQ2FzdAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGV4ZWN1dGUgY29tbWFuZCIsIGV4Yyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbW1hbmQgbGF1bmNoZXIgdGhhdCBwcm94aWVzIGFub3RoZXIgY29tbWFuZCBsYXVuY2hlci4KKyAgICAgKgorICAgICAqIFN1Yi1jbGFzc2VzIG92ZXJyaWRlIGV4ZWMoYXJncywgZW52LCB3b3JrZGlyKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21tYW5kTGF1bmNoZXJQcm94eSBleHRlbmRzIENvbW1hbmRMYXVuY2hlciB7CisgICAgICAgIHByaXZhdGUgQ29tbWFuZExhdW5jaGVyIG15TGF1bmNoZXI7CisKKyAgICAgICAgQ29tbWFuZExhdW5jaGVyUHJveHkoQ29tbWFuZExhdW5jaGVyIGxhdW5jaGVyKSB7CisgICAgICAgICAgICBteUxhdW5jaGVyID0gbGF1bmNoZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2Vzcy4gIERlbGVnYXRlcyB0aGlzCisgICAgICAgICAqIG1ldGhvZCB0byB0aGUgcHJveGllZCBsYXVuY2hlci4KKyAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIEFudCBwcm9qZWN0LgorICAgICAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAgICAgKiBAcGFyYW0gZW52IHRoZSBlbnZpcm9ubWVudCB0byBzZXQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBQcm9jZXNzLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGZvcndhcmRlZCBmcm9tIHRoZSBleGVjIG1ldGhvZCBvZiB0aGUKKyAgICAgICAgICogY29tbWFuZCBsYXVuY2hlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbXlMYXVuY2hlci5leGVjKHByb2plY3QsIGNtZCwgZW52KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29tbWFuZCBsYXVuY2hlciBmb3IgT1MvMiB0aGF0IHVzZXMgJ2NtZC5leGUnIHdoZW4gbGF1bmNoaW5nCisgICAgICogY29tbWFuZHMgaW4gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbiB0aGUgY3VycmVudCB3b3JraW5nCisgICAgICogZGlyZWN0b3J5LgorICAgICAqCisgICAgICogPHA+VW5saWtlIFdpbmRvd3MgTlQgYW5kIGZyaWVuZHMsIE9TLzIncyBjZCBkb2Vzbid0IHN1cHBvcnQgdGhlCisgICAgICogL2Qgc3dpdGNoIHRvIGNoYW5nZSBkcml2ZXMgYW5kIGRpcmVjdG9yaWVzIGluIG9uZSBnby48L3A+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT1MyQ29tbWFuZExhdW5jaGVyIGV4dGVuZHMgQ29tbWFuZExhdW5jaGVyUHJveHkgeworICAgICAgICBPUzJDb21tYW5kTGF1bmNoZXIoQ29tbWFuZExhdW5jaGVyIGxhdW5jaGVyKSB7CisgICAgICAgICAgICBzdXBlcihsYXVuY2hlcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2VzcywgaW4gdGhlIGdpdmVuIHdvcmtpbmcKKyAgICAgICAgICogZGlyZWN0b3J5LgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgQW50IHByb2plY3QuCisgICAgICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICAgICAqIEBwYXJhbSBlbnYgdGhlIGVudmlyb25tZW50IHRvIHNldCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAgICAgKiBAcGFyYW0gd29ya2luZ0RpciB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0aGUgY29tbWFuZCBzaG91bGQgcnVuLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIFByb2Nlc3MuCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gZm9yd2FyZGVkIGZyb20gdGhlIGV4ZWMgbWV0aG9kIG9mIHRoZQorICAgICAgICAgKiBjb21tYW5kIGxhdW5jaGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGNtZCwgU3RyaW5nW10gZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgd29ya2luZ0RpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEZpbGUgY29tbWFuZERpciA9IHdvcmtpbmdEaXI7CisgICAgICAgICAgICBpZiAod29ya2luZ0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb21tYW5kRGlyID0gcHJvamVjdC5nZXRCYXNlRGlyKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWMocHJvamVjdCwgY21kLCBlbnYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFVzZSBjbWQuZXhlIHRvIGNoYW5nZSB0byB0aGUgc3BlY2lmaWVkIGRyaXZlIGFuZAorICAgICAgICAgICAgLy8gZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIHRoZSBjb21tYW5kCisgICAgICAgICAgICBmaW5hbCBpbnQgcHJlQ21kTGVuZ3RoID0gNzsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbWREaXIgPSBjb21tYW5kRGlyLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgU3RyaW5nW10gbmV3Y21kID0gbmV3IFN0cmluZ1tjbWQubGVuZ3RoICsgcHJlQ21kTGVuZ3RoXTsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGIC0gZG8gbm90IGJvdGhlcgorICAgICAgICAgICAgbmV3Y21kWzBdID0gImNtZCI7CisgICAgICAgICAgICBuZXdjbWRbMV0gPSAiL2MiOworICAgICAgICAgICAgbmV3Y21kWzJdID0gY21kRGlyLnN1YnN0cmluZygwLCAyKTsKKyAgICAgICAgICAgIG5ld2NtZFszXSA9ICImJiI7CisgICAgICAgICAgICBuZXdjbWRbNF0gPSAiY2QiOworICAgICAgICAgICAgbmV3Y21kWzVdID0gY21kRGlyLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgIG5ld2NtZFs2XSA9ICImJiI7CisgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNtZCwgMCwgbmV3Y21kLCBwcmVDbWRMZW5ndGgsIGNtZC5sZW5ndGgpOworCisgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBuZXdjbWQsIGVudik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbW1hbmQgbGF1bmNoZXIgZm9yIFdpbmRvd3MgWFAvMjAwMC9OVCB0aGF0IHVzZXMgJ2NtZC5leGUnIHdoZW4KKyAgICAgKiBsYXVuY2hpbmcgY29tbWFuZHMgaW4gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbiB0aGUgY3VycmVudCB3b3JraW5nCisgICAgICogZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFdpbk5UQ29tbWFuZExhdW5jaGVyIGV4dGVuZHMgQ29tbWFuZExhdW5jaGVyUHJveHkgeworICAgICAgICBXaW5OVENvbW1hbmRMYXVuY2hlcihDb21tYW5kTGF1bmNoZXIgbGF1bmNoZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGxhdW5jaGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gY29tbWFuZCBpbiBhIG5ldyBwcm9jZXNzLCBpbiB0aGUgZ2l2ZW4gd29ya2luZworICAgICAgICAgKiBkaXJlY3RvcnkuCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBBbnQgcHJvamVjdC4KKyAgICAgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgICAgICogQHBhcmFtIGVudiB0aGUgZW52aXJvbm1lbnQgdG8gc2V0IGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICAgICAqIEBwYXJhbSB3b3JraW5nRGlyIHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRoZSBjb21tYW5kIHNob3VsZCBydW4uCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgUHJvY2Vzcy4KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBmb3J3YXJkZWQgZnJvbSB0aGUgZXhlYyBtZXRob2Qgb2YgdGhlCisgICAgICAgICAqIGNvbW1hbmQgbGF1bmNoZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUHJvY2VzcyBleGVjKFByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gY21kLCBTdHJpbmdbXSBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSB3b3JraW5nRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgRmlsZSBjb21tYW5kRGlyID0gd29ya2luZ0RpcjsKKyAgICAgICAgICAgIGlmICh3b3JraW5nRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmREaXIgPSBwcm9qZWN0LmdldEJhc2VEaXIoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBjbWQsIGVudik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVXNlIGNtZC5leGUgdG8gY2hhbmdlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nCisgICAgICAgICAgICAvLyB0aGUgY29tbWFuZAorICAgICAgICAgICAgZmluYWwgaW50IHByZUNtZExlbmd0aCA9IDY7CisgICAgICAgICAgICBTdHJpbmdbXSBuZXdjbWQgPSBuZXcgU3RyaW5nW2NtZC5sZW5ndGggKyBwcmVDbWRMZW5ndGhdOworICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYgLSBkbyBub3QgYm90aGVyCisgICAgICAgICAgICBuZXdjbWRbMF0gPSAiY21kIjsKKyAgICAgICAgICAgIG5ld2NtZFsxXSA9ICIvYyI7CisgICAgICAgICAgICBuZXdjbWRbMl0gPSAiY2QiOworICAgICAgICAgICAgbmV3Y21kWzNdID0gIi9kIjsKKyAgICAgICAgICAgIG5ld2NtZFs0XSA9IGNvbW1hbmREaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBuZXdjbWRbNV0gPSAiJiYiOworICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjbWQsIDAsIG5ld2NtZCwgcHJlQ21kTGVuZ3RoLCBjbWQubGVuZ3RoKTsKKworICAgICAgICAgICAgcmV0dXJuIGV4ZWMocHJvamVjdCwgbmV3Y21kLCBlbnYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb21tYW5kIGxhdW5jaGVyIGZvciBNYWMgdGhhdCB1c2VzIGEgZG9kZ3kgbWVjaGFuaXNtIHRvIGNoYW5nZQorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5IGJlZm9yZSBsYXVuY2hpbmcgY29tbWFuZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFjQ29tbWFuZExhdW5jaGVyIGV4dGVuZHMgQ29tbWFuZExhdW5jaGVyUHJveHkgeworICAgICAgICBNYWNDb21tYW5kTGF1bmNoZXIoQ29tbWFuZExhdW5jaGVyIGxhdW5jaGVyKSB7CisgICAgICAgICAgICBzdXBlcihsYXVuY2hlcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2VzcywgaW4gdGhlIGdpdmVuIHdvcmtpbmcKKyAgICAgICAgICogZGlyZWN0b3J5LgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgQW50IHByb2plY3QuCisgICAgICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICAgICAqIEBwYXJhbSBlbnYgdGhlIGVudmlyb25tZW50IHRvIHNldCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAgICAgKiBAcGFyYW0gd29ya2luZ0RpciB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0aGUgY29tbWFuZCBzaG91bGQgcnVuLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIFByb2Nlc3MuCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gZm9yd2FyZGVkIGZyb20gdGhlIGV4ZWMgbWV0aG9kIG9mIHRoZQorICAgICAgICAgKiBjb21tYW5kIGxhdW5jaGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGNtZCwgU3RyaW5nW10gZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgd29ya2luZ0RpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh3b3JraW5nRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBjbWQsIGVudik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dCgidXNlci5kaXIiLCB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWMocHJvamVjdCwgY21kLCBlbnYpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dCgidXNlci5kaXIiLCBhbnRXb3JraW5nRGlyZWN0b3J5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29tbWFuZCBsYXVuY2hlciB0aGF0IHVzZXMgYW4gYXV4aWxpYXJ5IHNjcmlwdCB0byBsYXVuY2ggY29tbWFuZHMKKyAgICAgKiBpbiBkaXJlY3RvcmllcyBvdGhlciB0aGFuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNjcmlwdENvbW1hbmRMYXVuY2hlciBleHRlbmRzIENvbW1hbmRMYXVuY2hlclByb3h5IHsKKyAgICAgICAgU2NyaXB0Q29tbWFuZExhdW5jaGVyKFN0cmluZyBzY3JpcHQsIENvbW1hbmRMYXVuY2hlciBsYXVuY2hlcikgeworICAgICAgICAgICAgc3VwZXIobGF1bmNoZXIpOworICAgICAgICAgICAgbXlTY3JpcHQgPSBzY3JpcHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2VzcywgaW4gdGhlIGdpdmVuIHdvcmtpbmcKKyAgICAgICAgICogZGlyZWN0b3J5LgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgQW50IHByb2plY3QuCisgICAgICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICAgICAqIEBwYXJhbSBlbnYgdGhlIGVudmlyb25tZW50IHRvIHNldCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAgICAgKiBAcGFyYW0gd29ya2luZ0RpciB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0aGUgY29tbWFuZCBzaG91bGQgcnVuLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIFByb2Nlc3MuCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gZm9yd2FyZGVkIGZyb20gdGhlIGV4ZWMgbWV0aG9kIG9mIHRoZQorICAgICAgICAgKiBjb21tYW5kIGxhdW5jaGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGNtZCwgU3RyaW5nW10gZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgd29ya2luZ0RpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAod29ya2luZ0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjKHByb2plY3QsIGNtZCwgZW52KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgbG9jYXRlIGFudFJ1biBzY3JpcHQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyAiTm8gcHJvamVjdCBwcm92aWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTG9jYXRlIHRoZSBhdXhpbGlhcnkgc2NyaXB0CisgICAgICAgICAgICBTdHJpbmcgYW50SG9tZSA9IHByb2plY3QuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfSE9NRSk7CisgICAgICAgICAgICBpZiAoYW50SG9tZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgbG9jYXRlIGFudFJ1biBzY3JpcHQ6ICIKKyAgICAgICAgICAgICAgICAgICAgKyAiUHJvcGVydHkgJyIgKyBNYWdpY05hbWVzLkFOVF9IT01FICsgIicgbm90IGZvdW5kIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgYW50UnVuID0KKyAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKHByb2plY3QuZ2V0QmFzZURpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgYW50SG9tZSArIEZpbGUuc2VwYXJhdG9yICsgbXlTY3JpcHQpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBjb21tYW5kCisgICAgICAgICAgICBGaWxlIGNvbW1hbmREaXIgPSB3b3JraW5nRGlyOworICAgICAgICAgICAgaWYgKHdvcmtpbmdEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbW1hbmREaXIgPSBwcm9qZWN0LmdldEJhc2VEaXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIG5ld2NtZCA9IG5ldyBTdHJpbmdbY21kLmxlbmd0aCArIDJdOworICAgICAgICAgICAgbmV3Y21kWzBdID0gYW50UnVuOworICAgICAgICAgICAgbmV3Y21kWzFdID0gY29tbWFuZERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY21kLCAwLCBuZXdjbWQsIDIsIGNtZC5sZW5ndGgpOworCisgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBuZXdjbWQsIGVudik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBteVNjcmlwdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbW1hbmQgbGF1bmNoZXIgdGhhdCB1c2VzIGFuIGF1eGlsaWFyeSBwZXJsIHNjcmlwdCB0byBsYXVuY2ggY29tbWFuZHMKKyAgICAgKiBpbiBkaXJlY3RvcmllcyBvdGhlciB0aGFuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBlcmxTY3JpcHRDb21tYW5kTGF1bmNoZXIKKyAgICAgICAgZXh0ZW5kcyBDb21tYW5kTGF1bmNoZXJQcm94eSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG15U2NyaXB0OworCisgICAgICAgIFBlcmxTY3JpcHRDb21tYW5kTGF1bmNoZXIoU3RyaW5nIHNjcmlwdCwgQ29tbWFuZExhdW5jaGVyIGxhdW5jaGVyKSB7CisgICAgICAgICAgICBzdXBlcihsYXVuY2hlcik7CisgICAgICAgICAgICBteVNjcmlwdCA9IHNjcmlwdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gY29tbWFuZCBpbiBhIG5ldyBwcm9jZXNzLCBpbiB0aGUgZ2l2ZW4gd29ya2luZworICAgICAgICAgKiBkaXJlY3RvcnkuCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBBbnQgcHJvamVjdC4KKyAgICAgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgICAgICogQHBhcmFtIGVudiB0aGUgZW52aXJvbm1lbnQgdG8gc2V0IGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICAgICAqIEBwYXJhbSB3b3JraW5nRGlyIHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRoZSBjb21tYW5kIHNob3VsZCBydW4uCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgUHJvY2Vzcy4KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBmb3J3YXJkZWQgZnJvbSB0aGUgZXhlYyBtZXRob2Qgb2YgdGhlCisgICAgICAgICAqIGNvbW1hbmQgbGF1bmNoZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUHJvY2VzcyBleGVjKFByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gY21kLCBTdHJpbmdbXSBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSB3b3JraW5nRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh3b3JraW5nRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWMocHJvamVjdCwgY21kLCBlbnYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBsb2NhdGUgYW50UnVuIHNjcmlwdDogIgorICAgICAgICAgICAgICAgICAgICArICJObyBwcm9qZWN0IHByb3ZpZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBMb2NhdGUgdGhlIGF1eGlsaWFyeSBzY3JpcHQKKyAgICAgICAgICAgIFN0cmluZyBhbnRIb21lID0gcHJvamVjdC5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9IT01FKTsKKyAgICAgICAgICAgIGlmIChhbnRIb21lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBsb2NhdGUgYW50UnVuIHNjcmlwdDogIgorICAgICAgICAgICAgICAgICAgICArICJQcm9wZXJ0eSAnIiArIE1hZ2ljTmFtZXMuQU5UX0hPTUUgKyAiJyBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBhbnRSdW4gPQorICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUocHJvamVjdC5nZXRCYXNlRGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBhbnRIb21lICsgRmlsZS5zZXBhcmF0b3IgKyBteVNjcmlwdCkudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGNvbW1hbmQKKyAgICAgICAgICAgIEZpbGUgY29tbWFuZERpciA9IHdvcmtpbmdEaXI7CisgICAgICAgICAgICBpZiAod29ya2luZ0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZERpciA9IHByb2plY3QuZ2V0QmFzZURpcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgICAgIFN0cmluZ1tdIG5ld2NtZCA9IG5ldyBTdHJpbmdbY21kLmxlbmd0aCArIDNdOworICAgICAgICAgICAgbmV3Y21kWzBdID0gInBlcmwiOworICAgICAgICAgICAgbmV3Y21kWzFdID0gYW50UnVuOworICAgICAgICAgICAgbmV3Y21kWzJdID0gY29tbWFuZERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY21kLCAwLCBuZXdjbWQsIDMsIGNtZC5sZW5ndGgpOworICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorCisgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBuZXdjbWQsIGVudik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbW1hbmQgbGF1bmNoZXIgZm9yIFZNUyB0aGF0IHdyaXRlcyB0aGUgY29tbWFuZCB0byBhIHRlbXBvcmFyeSBEQ0wKKyAgICAgKiBzY3JpcHQgYmVmb3JlIGxhdW5jaGluZyBjb21tYW5kcy4gIFRoaXMgaXMgZHVlIHRvIGxpbWl0YXRpb25zIG9mIGJvdGgKKyAgICAgKiB0aGUgRENMIGludGVycHJldGVyIGFuZCB0aGUgSmF2YSBWTSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWbXNDb21tYW5kTGF1bmNoZXIgZXh0ZW5kcyBKYXZhMTNDb21tYW5kTGF1bmNoZXIgeworCisgICAgICAgIHB1YmxpYyBWbXNDb21tYW5kTGF1bmNoZXIoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2Vzcy4KKyAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIEFudCBwcm9qZWN0LgorICAgICAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAgICAgKiBAcGFyYW0gZW52IHRoZSBlbnZpcm9ubWVudCB0byBzZXQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBQcm9jZXNzLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGZvcndhcmRlZCBmcm9tIHRoZSBleGVjIG1ldGhvZCBvZiB0aGUKKyAgICAgICAgICogY29tbWFuZCBsYXVuY2hlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBGaWxlIGNtZEZpbGUgPSBjcmVhdGVDb21tYW5kRmlsZShjbWQsIGVudik7CisgICAgICAgICAgICBQcm9jZXNzIHAKKyAgICAgICAgICAgICAgICA9IHN1cGVyLmV4ZWMocHJvamVjdCwgbmV3IFN0cmluZ1tdIHtjbWRGaWxlLmdldFBhdGgoKX0sIGVudik7CisgICAgICAgICAgICBkZWxldGVBZnRlcihjbWRGaWxlLCBwKTsKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExhdW5jaGVzIHRoZSBnaXZlbiBjb21tYW5kIGluIGEgbmV3IHByb2Nlc3MsIGluIHRoZSBnaXZlbiB3b3JraW5nCisgICAgICAgICAqIGRpcmVjdG9yeS4gIE5vdGUgdGhhdCB1bmRlciBKYXZhIDEuMy4xLCAxLjQuMCBhbmQgMS40LjEgb24gVk1TIHRoaXMKKyAgICAgICAgICogbWV0aG9kIG9ubHkgd29ya3MgaWYgPGNvZGU+d29ya2luZ0RpcjwvY29kZT4gaXMgbnVsbCBvciB0aGUgbG9naWNhbAorICAgICAgICAgKiBKQVZBJEZPUktfU1VQUE9SVF9DSERJUiBuZWVkcyB0byBiZSBzZXQgdG8gVFJVRS4KKyAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIEFudCBwcm9qZWN0LgorICAgICAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAgICAgKiBAcGFyYW0gZW52IHRoZSBlbnZpcm9ubWVudCB0byBzZXQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgICAgICogQHBhcmFtIHdvcmtpbmdEaXIgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbW1hbmQgc2hvdWxkIHJ1bi4KKyAgICAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBQcm9jZXNzLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGZvcndhcmRlZCBmcm9tIHRoZSBleGVjIG1ldGhvZCBvZiB0aGUKKyAgICAgICAgICogY29tbWFuZCBsYXVuY2hlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHdvcmtpbmdEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBGaWxlIGNtZEZpbGUgPSBjcmVhdGVDb21tYW5kRmlsZShjbWQsIGVudik7CisgICAgICAgICAgICBQcm9jZXNzIHAgPSBzdXBlci5leGVjKHByb2plY3QsIG5ldyBTdHJpbmdbXSB7Y21kRmlsZS5nZXRQYXRoKCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIHdvcmtpbmdEaXIpOworICAgICAgICAgICAgZGVsZXRlQWZ0ZXIoY21kRmlsZSwgcCk7CisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdyaXRlcyB0aGUgY29tbWFuZCBpbnRvIGEgdGVtcG9yYXJ5IERDTCBzY3JpcHQgYW5kIHJldHVybnMgdGhlCisgICAgICAgICAqIGNvcnJlc3BvbmRpbmcgRmlsZSBvYmplY3QuICBUaGUgc2NyaXB0IHdpbGwgYmUgZGVsZXRlZCBvbiBleGl0LgorICAgICAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAgICAgKiBAcGFyYW0gZW52IHRoZSBlbnZpcm9ubWVudCB0byBzZXQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy4KKyAgICAgICAgICogQHJldHVybiB0aGUgY29tbWFuZCBGaWxlLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGVycm9ycyBhcmUgZW5jb3VudGVyZWQgY3JlYXRpbmcgdGhlIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEZpbGUgY3JlYXRlQ29tbWFuZEZpbGUoU3RyaW5nW10gY21kLCBTdHJpbmdbXSBlbnYpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgRmlsZSBzY3JpcHQgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKCJBTlQiLCAiLkNPTSIsIG51bGwsIHRydWUsIHRydWUpOworICAgICAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKHNjcmlwdCkpOworCisgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBlbnZpcm9ubWVudCBhcyBsb2dpY2FscyB0byB0aGUgRENMIHNjcmlwdAorICAgICAgICAgICAgICAgIGlmIChlbnYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXFJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxSW5kZXggPSBlbnZbaV0uaW5kZXhPZignPScpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVxSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiQgREVGSU5FL05PTE9HICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChlbnZbaV0uc3Vic3RyaW5nKDAsIGVxSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBcIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChlbnZbaV0uc3Vic3RyaW5nKGVxSW5kZXggKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oJ1wiJyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIkICIgKyBjbWRbMF0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY21kLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgLSIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoY21kW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2NyaXB0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFmdGVyKGZpbmFsIEZpbGUgZiwgZmluYWwgUHJvY2VzcyBwKSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAud2FpdEZvcigpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGUoZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlSmF2YS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZUphdmEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODAzZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZUphdmEuamF2YQpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmVKYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGVybWlzc2lvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5UaW1lb3V0T2JzZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5XYXRjaGRvZzsKKworLyoqCisgKiBFeGVjdXRlIGEgSmF2YSBjbGFzcy4KKyAqIEBzaW5jZSBBbnQgMS4yCisgKi8KK3B1YmxpYyBjbGFzcyBFeGVjdXRlSmF2YSBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBUaW1lb3V0T2JzZXJ2ZXIgeworCisgICAgcHJpdmF0ZSBDb21tYW5kbGluZSBqYXZhQ29tbWFuZCA9IG51bGw7CisgICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aCA9IG51bGw7CisgICAgcHJpdmF0ZSBDb21tYW5kbGluZUphdmEuU3lzUHJvcGVydGllcyBzeXNQcm9wZXJ0aWVzID0gbnVsbDsKKyAgICBwcml2YXRlIFBlcm1pc3Npb25zICBwZXJtID0gbnVsbDsKKyAgICBwcml2YXRlIE1ldGhvZCBtYWluID0gbnVsbDsKKyAgICBwcml2YXRlIExvbmcgdGltZW91dCA9IG51bGw7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBUaHJvd2FibGUgY2F1Z2h0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gdGltZWRPdXQgPSBmYWxzZTsKKyAgICBwcml2YXRlIFRocmVhZCB0aHJlYWQgPSBudWxsOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKYXZhICJjb21tYW5kIiBmb3IgdGhpcyBFeGVjdXRlSmF2YS4KKyAgICAgKiBAcGFyYW0gamF2YUNvbW1hbmQgdGhlIGNsYXNzbmFtZSBhbmQgYXJndW1lbnRzIGluIGEgQ29tbWFuZGxpbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SmF2YUNvbW1hbmQoQ29tbWFuZGxpbmUgamF2YUNvbW1hbmQpIHsKKyAgICAgICAgdGhpcy5qYXZhQ29tbWFuZCA9IGphdmFDb21tYW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBKYXZhIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHAgYW4gQW50IFBhdGggb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBwKSB7CisgICAgICAgIGNsYXNzcGF0aCA9IHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzeXN0ZW0gcHJvcGVydGllcyB0byB1c2Ugd2hlbiBydW5uaW5nIHRoZSBKYXZhIGNsYXNzLgorICAgICAqIEBwYXJhbSBzIENvbW1hbmRsaW5lSmF2YSBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0aWVzKENvbW1hbmRsaW5lSmF2YS5TeXNQcm9wZXJ0aWVzIHMpIHsKKyAgICAgICAgc3lzUHJvcGVydGllcyA9IHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uIHJ1bi4KKyAgICAgKiBAcGFyYW0gcGVybWlzc2lvbnMgdGhlIFBlcm1pc3Npb25zIHRvIHVzZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBlcm1pc3Npb25zKFBlcm1pc3Npb25zIHBlcm1pc3Npb25zKSB7CisgICAgICAgIHBlcm0gPSBwZXJtaXNzaW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0cmVhbSB0byB3aGljaCBhbGwgb3V0cHV0IChTeXN0ZW0ub3V0IGFzIHdlbGwgYXMgU3lzdGVtLmVycikKKyAgICAgKiB3aWxsIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG91dCB0aGUgUHJpbnRTdHJlYW0gd2hlcmUgb3V0cHV0IHNob3VsZCBiZSBzZW50LgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNC54LgorICAgICAqICAgICAgICAgICAgIG1hbmFnZSBvdXRwdXQgYXQgdGhlIHRhc2sgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KFByaW50U3RyZWFtIG91dCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGltZW91dCBmb3IgdGhpcyBFeGVjdXRlSmF2YS4KKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IGFzIExvbmcuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KExvbmcgdGltZW91dCkgeworICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIEphdmEgY2xhc3MgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIEFudCBQcm9qZWN0LgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBQcm9qZWN0IHRvIHVzZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NuYW1lID0gamF2YUNvbW1hbmQuZ2V0RXhlY3V0YWJsZSgpOworCisgICAgICAgIEFudENsYXNzTG9hZGVyIGxvYWRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc3lzUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3lzUHJvcGVydGllcy5zZXRTeXN0ZW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsYXNzIHRhcmdldCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyID0gcHJvamVjdC5jcmVhdGVDbGFzc0xvYWRlcihjbGFzc3BhdGgpOworICAgICAgICAgICAgICAgICAgICBsb2FkZXIuc2V0UGFyZW50KHByb2plY3QuZ2V0Q29yZUxvYWRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnNldFBhcmVudEZpcnN0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmFkZEphdmFMaWJyYXJpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnNldElzb2xhdGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICBsb2FkZXIuc2V0VGhyZWFkQ29udGV4dExvYWRlcigpOworICAgICAgICAgICAgICAgICAgICBsb2FkZXIuZm9yY2VMb2FkQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUsIHRydWUsIGxvYWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCAiICsgY2xhc3NuYW1lICsgIi4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBNYWtlIHN1cmUgeW91IGhhdmUgaXQgaW4geW91ciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNsYXNzcGF0aCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFpbiA9IHRhcmdldC5nZXRNZXRob2QoIm1haW4iLCBuZXcgQ2xhc3NbXSB7U3RyaW5nW10uY2xhc3N9KTsKKyAgICAgICAgICAgIGlmIChtYWluID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIG1haW4oKSBtZXRob2QgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1haW4uZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm1haW4oKSBtZXRob2QgaW4gIiArIGNsYXNzbmFtZQorICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGRlY2xhcmVkIHN0YXRpYyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJ1bigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMsICJFeGVjdXRlSmF2YSIpOworICAgICAgICAgICAgICAgIFRhc2sgY3VycmVudFRocmVhZFRhc2sKKyAgICAgICAgICAgICAgICAgICAgPSBwcm9qZWN0LmdldFRocmVhZFRhc2soVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgICAgICAgICAgLy8gWFhYIGlzIHRoZSBmb2xsb3dpbmcgcmVhbGx5IG5lY2Vzc2FyeT8gaXQgaXMgaW4gdGhlIHNhbWUgdGhyZWFkIGdyb3VwLi4uCisgICAgICAgICAgICAgICAgcHJvamVjdC5yZWdpc3RlclRocmVhZFRhc2sodGhyZWFkLCBjdXJyZW50VGhyZWFkVGFzayk7CisgICAgICAgICAgICAgICAgLy8gaWYgd2UgcnVuIGludG8gYSB0aW1lb3V0LCB0aGUgcnVuLWF3YXkgdGhyZWFkIHNoYWxsIG5vdAorICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIFZNIHJ1biBmb3JldmVyIC0gaWYgbm8gdGltZW91dCBvY2N1cnMsIEFudCdzCisgICAgICAgICAgICAgICAgLy8gbWFpbiB0aHJlYWQgd2lsbCBzdGlsbCBiZSB0aGVyZSB0byBsZXQgdGhlIG5ldyB0aHJlYWQKKyAgICAgICAgICAgICAgICAvLyBmaW5pc2gKKyAgICAgICAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgICAgIFdhdGNoZG9nIHcgPSBuZXcgV2F0Y2hkb2codGltZW91dC5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgdy5hZGRUaW1lb3V0T2JzZXJ2ZXIodGhpcyk7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICB3LnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lZE91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5sb2coIlRpbWVvdXQ6IHN1Yi1wcm9jZXNzIGludGVycnVwdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhdWdodCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgY2F1Z2h0OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChUaHJlYWREZWF0aCBlKSB7CisgICAgICAgICAgICAvLyBYWFggY291bGQgcGVyaGFwcyBhbHNvIGNhbGwgdGhyZWFkLnN0b3AoKTsgbm90IHN1cmUgaWYgYW55b25lIGNhcmVzCisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLnJlc2V0VGhyZWFkQ29udGV4dExvYWRlcigpOworICAgICAgICAgICAgICAgIGxvYWRlci5jbGVhbnVwKCk7CisgICAgICAgICAgICAgICAgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzeXNQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzeXNQcm9wZXJ0aWVzLnJlc3RvcmVTeXN0ZW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGlzIEV4ZWN1dGVKYXZhIGluIGEgVGhyZWFkLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBmaW5hbCBPYmplY3RbXSBhcmd1bWVudCA9IHtqYXZhQ29tbWFuZC5nZXRBcmd1bWVudHMoKX07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocGVybSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGVybS5zZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1haW4uaW52b2tlKG51bGwsIGFyZ3VtZW50KTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgSW50ZXJydXB0ZWRFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgY2F1Z2h0ID0gdDsKKyAgICAgICAgICAgIH0gLyogZWxzZSB7IHN3YWxsb3csIHByb2JhYmx5IGR1ZSB0byB0aW1lb3V0IH0gKi8KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGNhdWdodCA9IHQ7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGVybSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGVybS5yZXN0b3JlU2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmsgdGltZW91dCBhcyBoYXZpbmcgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHcgdGhlIHJlc3BvbnNpYmxlIFdhdGNoZG9nLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHRpbWVvdXRPY2N1cmVkKFdhdGNoZG9nIHcpIHsKKyAgICAgICAgaWYgKHRocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aW1lZE91dCA9IHRydWU7CisgICAgICAgICAgICB0aHJlYWQuaW50ZXJydXB0KCk7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHdoZXRoZXIgdGhlIHByb2Nlc3Mgd2FzIGtpbGxlZC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9jZXNzIHdhcyBraWxsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgMS4xOSwgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBraWxsZWRQcm9jZXNzKCkgeworICAgICAgICByZXR1cm4gdGltZWRPdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSBKYXZhIGNvbW1hbmQgaW4gYSBzZXBhcmF0ZSBWTSwgdGhpcyBkb2VzIG5vdCBnaXZlIHlvdQorICAgICAqIHRoZSBmdWxsIGZsZXhpYmlsaXR5IG9mIHRoZSBKYXZhIHRhc2ssIGJ1dCBtYXkgYmUgZW5vdWdoIGZvcgorICAgICAqIHNpbXBsZSBuZWVkcy4KKyAgICAgKiBAcGFyYW0gcGMgdGhlIFByb2plY3RDb21wb25lbnQgdG8gdXNlIGZvciBsb2dnaW5nLCBldGMuCisgICAgICogQHJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHN1YnByb2Nlc3MuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIGludCBmb3JrKFByb2plY3RDb21wb25lbnQgcGMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lSmF2YSBjbWRsID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOworICAgICAgICBjbWRsLnNldENsYXNzbmFtZShqYXZhQ29tbWFuZC5nZXRFeGVjdXRhYmxlKCkpOworICAgICAgICBTdHJpbmdbXSBhcmdzID0gamF2YUNvbW1hbmQuZ2V0QXJndW1lbnRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY21kbC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZ3NbaV0pOworICAgICAgICB9CisgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgY21kbC5jcmVhdGVDbGFzc3BhdGgocGMuZ2V0UHJvamVjdCgpKS5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3lzUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWRsLmFkZFN5c3Byb3BlcnRpZXMoc3lzUHJvcGVydGllcyk7CisgICAgICAgIH0KKyAgICAgICAgUmVkaXJlY3RvciByZWRpcmVjdG9yID0gbmV3IFJlZGlyZWN0b3IocGMpOworICAgICAgICBFeGVjdXRlIGV4ZQorICAgICAgICAgICAgPSBuZXcgRXhlY3V0ZShyZWRpcmVjdG9yLmNyZWF0ZUhhbmRsZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBFeGVjdXRlV2F0Y2hkb2codGltZW91dC5sb25nVmFsdWUoKSkpOworICAgICAgICBleGUuc2V0QW50UnVuKHBjLmdldFByb2plY3QoKSk7CisgICAgICAgIGlmIChPcy5pc0ZhbWlseSgib3BlbnZtcyIpKSB7CisgICAgICAgICAgICBzZXR1cENvbW1hbmRMaW5lRm9yVk1TKGV4ZSwgY21kbC5nZXRDb21tYW5kbGluZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjbWRsLmdldENvbW1hbmRsaW5lKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcmMgPSBleGUuZXhlY3V0ZSgpOworICAgICAgICAgICAgcmVkaXJlY3Rvci5jb21wbGV0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0aW1lZE91dCA9IGV4ZS5raWxsZWRQcm9jZXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbiBWTVMgcGxhdGZvcm0sIHdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBqYXZhIG9wdGlvbnMgZmlsZQorICAgICAqIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyBhbmQgY2xhc3NwYXRoIGZvciB0aGUgamF2YSBjb21tYW5kLgorICAgICAqIFRoZSBzcGVjaWFsIGZpbGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSAiLVYiIHN3aXRjaCBvbiB0aGUgVk1TIEpWTS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGUgdGhlIEV4ZWN1dGUgaW5zdGFuY2UgdG8gYWx0ZXIuCisgICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQtbGluZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBDb21tYW5kTGluZUZvclZNUyhFeGVjdXRlIGV4ZSwgU3RyaW5nW10gY29tbWFuZCkgeworICAgICAgICAvL1VzZSB0aGUgVk0gbGF1bmNoZXIgaW5zdGVhZCBvZiBzaGVsbCBsYXVuY2hlciBvbiBWTVMKKyAgICAgICAgZXhlLnNldFZNTGF1bmNoZXIodHJ1ZSk7CisgICAgICAgIEZpbGUgdm1zSmF2YU9wdGlvbkZpbGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIFtdIGFyZ3MgPSBuZXcgU3RyaW5nW2NvbW1hbmQubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbW1hbmQsIDEsIGFyZ3MsIDAsIGNvbW1hbmQubGVuZ3RoIC0gMSk7CisgICAgICAgICAgICB2bXNKYXZhT3B0aW9uRmlsZSA9IEphdmFFbnZVdGlscy5jcmVhdGVWbXNKYXZhT3B0aW9uRmlsZShhcmdzKTsKKyAgICAgICAgICAgIC8vd2UgbWFyayB0aGUgZmlsZSB0byBiZSBkZWxldGVkIG9uIGV4aXQuCisgICAgICAgICAgICAvL3RoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBjYWNoZSB0aGUgZmlsZW5hbWUgYW5kIGRlbGV0ZQorICAgICAgICAgICAgLy9hZnRlciBleGVjdXRpb24gZmluaXNoZWQsIHdoaWNoIGlzIG11Y2ggYmV0dGVyIGZvciBsb25nLWxpdmVkIHJ1bnRpbWVzCisgICAgICAgICAgICAvL3Rob3VnaCBzcGF3bmluZyBjb21wbGljYXRlcyB0aGluZ3MuLi4KKyAgICAgICAgICAgIHZtc0phdmFPcHRpb25GaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAgICAgU3RyaW5nIFtdIHZtc0NtZCA9IHtjb21tYW5kWzBdLCAiLVYiLCB2bXNKYXZhT3B0aW9uRmlsZS5nZXRQYXRoKCl9OworICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKHZtc0NtZCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGZvciBcIi1WXCIgc3dpdGNoIik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVPbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZU9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1OGU2OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVPbi5qYXZhCkBAIC0wLDAgKzEsNzUzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5BYnN0cmFjdEZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGlyU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlVuaW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Tb3VyY2VGaWxlU2Nhbm5lcjsKKworLyoqCisgKiBFeGVjdXRlcyBhIGdpdmVuIGNvbW1hbmQsIHN1cHBseWluZyBhIHNldCBvZiBmaWxlcyBhcyBhcmd1bWVudHMuCisgKgorICogQHNpbmNlIEFudCAxLjIKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImNvbnRyb2wiIG5hbWU9ImFwcGx5IgorICovCitwdWJsaWMgY2xhc3MgRXhlY3V0ZU9uIGV4dGVuZHMgRXhlY1Rhc2sgeworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKworICAgIC8vIGZpbGVzZXRzIGhhcyBiZWVuIHByb3RlY3RlZCBzbyB3ZSBuZWVkIHRvIGtlZXAgdGhhdCBldmVuIGFmdGVyCisgICAgLy8gc3dpdGNoaW5nIHRvIHJlc291cmNlIGNvbGxlY3Rpb25zLiAgSW4gZmFjdCwgdGhleSB3aWxsIHN0aWxsCisgICAgLy8gZ2V0IGEgZGlmZmVyZW50IHRyZWF0bWVudCBmb3JtIHRoZSBvdGhlciByZXNvdXJjZSBjb2xsZWN0aW9ucworICAgIC8vIGV2ZW4gaW4gZXhlY3V0ZSBzaW5jZSB3ZSBoYXZlIHNvbWUgc3VidGxlIHNwZWNpYWwgZmVhdHVyZXMgbGlrZQorICAgIC8vIHN3aXRjaGluZyB0eXBlIHRvICJkaXIiIHdoZW4gd2UgZW5jb3VudGVyIGEgRGlyU2V0IHRoYXQgd291bGQKKyAgICAvLyBiZSBtb3JlIGRpZmZpY3VsdCB0byBhY2hpZXZlIG90aGVyd2lzZS4KKworICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7IC8vIGNvbnRhaW5zIEFic3RyYWN0RmlsZVNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChib3RoIERpclNldCBhbmQgRmlsZVNldCkKKyAgICBwcml2YXRlIFVuaW9uIHJlc291cmNlcyA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlbGF0aXZlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHBhcmFsbGVsID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGZvcndhcmRTbGFzaCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IEZpbGVEaXJCb3RoLkZJTEU7CisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lLk1hcmtlciBzcmNGaWxlUG9zID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcEVtcHR5ID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lLk1hcmtlciB0YXJnZXRGaWxlUG9zID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgTWFwcGVyIG1hcHBlckVsZW1lbnQgPSBudWxsOworICAgIHByb3RlY3RlZCBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSBudWxsOworICAgIHByb3RlY3RlZCBGaWxlIGRlc3REaXIgPSBudWxsOworICAgIHByaXZhdGUgaW50IG1heFBhcmFsbGVsID0gLTE7CisgICAgcHJpdmF0ZSBib29sZWFuIGFkZFNvdXJjZUZpbGUgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZU1pc3NpbmcgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSGFzICZsdDtzcmNmaWxlJmd0OyBiZWVuIHNwZWNpZmllZCBiZWZvcmUgJmx0O3RhcmdldGZpbGUmZ3Q7CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3JjSXNGaXJzdCA9IHRydWU7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorICAgIC8qKgorICAgICAqIEFkZCBhIHNldCBvZiBmaWxlcyB1cG9uIHdoaWNoIHRvIG9wZXJhdGUuCisgICAgICogQHBhcmFtIHNldCB0aGUgRmlsZVNldCB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIGRpcmVjdG9yaWVzIHVwb24gd2hpY2ggdG8gb3BlcmF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc2V0IHRoZSBEaXJTZXQgdG8gYWRkLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREaXJzZXQoRGlyU2V0IHNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdXBvbiB3aGljaCB0byBvcGVyYXRlLgorICAgICAqIEBwYXJhbSBsaXN0IHRoZSBGaWxlTGlzdCB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZWxpc3QoRmlsZUxpc3QgbGlzdCkgeworICAgICAgICBhZGQobGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdXBvbiB3aGljaCB0byBvcGVyYXRlLgorICAgICAqIEBwYXJhbSByYyByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZXMgPSBuZXcgVW5pb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZXMuYWRkKHJjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGUgZmlsZW5hbWVzIHNob3VsZCBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhcworICAgICAqIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhuYW1lcy4gUGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlCisgICAgICogZGlyZWN0b3J5IG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVzZXQgZm9yIHNvdXJjZSBmaWxlcyBvciB0aGUKKyAgICAgKiBkZXN0IGF0dHJpYnV0ZSBmb3IgdGFyZ2V0IGZpbGVzLgorICAgICAqIEBwYXJhbSByZWxhdGl2ZSB3aGV0aGVyIHRvIHBhc3MgcmVsYXRpdmUgcGF0aG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbGF0aXZlKGJvb2xlYW4gcmVsYXRpdmUpIHsKKyAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IHJlbGF0aXZlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gZXhlY3V0ZSBpbiBwYXJhbGxlbCBtb2RlLgorICAgICAqIElmIHRydWUsIHJ1biB0aGUgY29tbWFuZCBvbmx5IG9uY2UsIGFwcGVuZGluZyBhbGwgZmlsZXMgYXMgYXJndW1lbnRzLgorICAgICAqIElmIGZhbHNlLCBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgb25jZSBmb3IgZXZlcnkgZmlsZS4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICogQHBhcmFtIHBhcmFsbGVsIHdoZXRoZXIgdG8gcnVuIGluIHBhcmFsbGVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFsbGVsKGJvb2xlYW4gcGFyYWxsZWwpIHsKKyAgICAgICAgdGhpcy5wYXJhbGxlbCA9IHBhcmFsbGVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBjb21tYW5kIHdvcmtzIG9ubHkgb24gZmlsZXMsIGRpcmVjdG9yaWVzIG9yIGJvdGguCisgICAgICogQHBhcmFtIHR5cGUgYSBGaWxlRGlyQm90aCBFbnVtZXJhdGVkQXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoRmlsZURpckJvdGggdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgZW1wdHkgZmlsZXNldHMgd2lsbCBiZSBza2lwcGVkLiAgSWYgdHJ1ZSBhbmQKKyAgICAgKiBubyBzb3VyY2UgZmlsZXMgaGF2ZSBiZWVuIGZvdW5kIG9yIGFyZSBuZXdlciB0aGFuIHRoZWlyCisgICAgICogY29ycmVzcG9uZGluZyB0YXJnZXQgZmlsZXMsIHRoZSBjb21tYW5kIHdpbGwgbm90IGJlIHJ1bi4KKyAgICAgKiBAcGFyYW0gc2tpcCB3aGV0aGVyIHRvIHNraXAgZW1wdHkgZmlsZXNldHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2tpcEVtcHR5RmlsZXNldHMoYm9vbGVhbiBza2lwKSB7CisgICAgICAgIHNraXBFbXB0eSA9IHNraXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRhcmdldCBmaWxlcyBhcmUgdG8gYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBkZXN0RGlyIHRoZSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0KEZpbGUgZGVzdERpcikgeworICAgICAgICB0aGlzLmRlc3REaXIgPSBkZXN0RGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBmaWxlIG5hbWVzIG9uIFdpbmRvd3MgYW5kIE9TLzIKKyAgICAgKiBtdXN0IHVzZSB0aGUgZm9yd2FyZCBzbGFzaCBhcyBmaWxlIHNlcGFyYXRvci4KKyAgICAgKiBAcGFyYW0gZm9yd2FyZFNsYXNoIHdoZXRoZXIgdGhlIGZvcndhcmQgc2xhc2ggd2lsbCBiZSBmb3JjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yd2FyZHNsYXNoKGJvb2xlYW4gZm9yd2FyZFNsYXNoKSB7CisgICAgICAgIHRoaXMuZm9yd2FyZFNsYXNoID0gZm9yd2FyZFNsYXNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIExpbWl0IHRoZSBjb21tYW5kIGxpbmUgbGVuZ3RoIGJ5IHBhc3NpbmcgYXQgbWF4aW11bSB0aGlzIG1hbnkKKyAgICAgKiBzb3VyY2VmaWxlcyBhdCBvbmNlIHRvIHRoZSBjb21tYW5kLgorICAgICAqCisgICAgICogPHA+U2V0IHRvICZsdDs9IDAgZm9yIHVubGltaXRlZCAtIHRoaXMgaXMgdGhlIGRlZmF1bHQuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG1heCA8Y29kZT5pbnQ8L2NvZGU+IG1heGltdW0gbnVtYmVyIG9mIHNvdXJjZWZpbGVzCisgICAgICogICAgICAgICAgICBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGUuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heFBhcmFsbGVsKGludCBtYXgpIHsKKyAgICAgICAgbWF4UGFyYWxsZWwgPSBtYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gc2VuZCB0aGUgc291cmNlIGZpbGUgbmFtZSBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqCisgICAgICogPHA+RGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB3aGV0aGVyIHRvIGFkZCB0aGUgc291cmNlIGZpbGUgdG8gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkc291cmNlZmlsZShib29sZWFuIGIpIHsKKyAgICAgICAgYWRkU291cmNlRmlsZSA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gb3BlcmF0ZSBpbiB2ZXJib3NlIG1vZGUuCisgICAgICogSWYgdHJ1ZSwgYSB2ZXJib3NlIHN1bW1hcnkgd2lsbCBiZSBwcmludGVkIGFmdGVyIGV4ZWN1dGlvbi4KKyAgICAgKiBAcGFyYW0gYiB3aGV0aGVyIHRvIG9wZXJhdGUgaW4gdmVyYm9zZSBtb2RlLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gYikgeworICAgICAgICB2ZXJib3NlID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBpZ25vcmUgbm9uZXhpc3RlbnQgZmlsZXMgZnJvbSBmaWxlbGlzdHMuCisgICAgICogQHBhcmFtIGIgd2hldGhlciB0byBpZ25vcmUgbWlzc2luZyBmaWxlcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVtaXNzaW5nKGJvb2xlYW4gYikgeworICAgICAgICBpZ25vcmVNaXNzaW5nID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBieXBhc3MgdGltZXN0YW1wIGNvbXBhcmlzb25zIGZvciB0YXJnZXQgZmlsZXMuCisgICAgICogQHBhcmFtIGIgd2hldGhlciB0byBieXBhc3MgdGltZXN0YW1wIGNvbXBhcmlzb25zLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlKGJvb2xlYW4gYikgeworICAgICAgICBmb3JjZSA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcGxhY2Vob2xkZXIgaW5kaWNhdGluZyB3aGVyZSBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPkNvbW1hbmRsaW5lLk1hcmtlcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIENvbW1hbmRsaW5lLk1hcmtlciBjcmVhdGVTcmNmaWxlKCkgeworICAgICAgICBpZiAoc3JjRmlsZVBvcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza1R5cGUoKSArICIgZG9lc25cJ3Qgc3VwcG9ydCBtdWx0aXBsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3JjZmlsZSBlbGVtZW50cy4iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBzcmNGaWxlUG9zID0gY21kbC5jcmVhdGVNYXJrZXIoKTsKKyAgICAgICAgcmV0dXJuIHNyY0ZpbGVQb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcGxhY2Vob2xkZXIgaW5kaWNhdGluZyB3aGVyZSBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBmaWxlIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPkNvbW1hbmRsaW5lLk1hcmtlcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIENvbW1hbmRsaW5lLk1hcmtlciBjcmVhdGVUYXJnZXRmaWxlKCkgeworICAgICAgICBpZiAodGFyZ2V0RmlsZVBvcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza1R5cGUoKSArICIgZG9lc25cJ3Qgc3VwcG9ydCBtdWx0aXBsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidGFyZ2V0ZmlsZSBlbGVtZW50cy4iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICB0YXJnZXRGaWxlUG9zID0gY21kbC5jcmVhdGVNYXJrZXIoKTsKKyAgICAgICAgc3JjSXNGaXJzdCA9IChzcmNGaWxlUG9zICE9IG51bGwpOworICAgICAgICByZXR1cm4gdGFyZ2V0RmlsZVBvczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXN0ZWQgTWFwcGVyIGVsZW1lbnQgdG8gdXNlIGZvciBtYXBwaW5nCisgICAgICogc291cmNlIGZpbGVzIHRvIHRhcmdldCBmaWxlcy4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPk1hcHBlcjwvY29kZT4uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBtb3JlIHRoYW4gb25lIG1hcHBlciBpcyBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBNYXBwZXIgY3JlYXRlTWFwcGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgZGVmaW5lIG1vcmUgdGhhbiBvbmUgbWFwcGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBtYXBwZXJFbGVtZW50ID0gbmV3IE1hcHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICByZXR1cm4gbWFwcGVyRWxlbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXN0ZWQgRmlsZU5hbWVNYXBwZXIuCisgICAgICogQHBhcmFtIGZpbGVOYW1lTWFwcGVyIHRoZSBtYXBwZXIgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZU5hbWVNYXBwZXIgZmlsZU5hbWVNYXBwZXIpIHsKKyAgICAgICAgY3JlYXRlTWFwcGVyKCkuYWRkKGZpbGVOYW1lTWFwcGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIEV4ZWN1dGVPbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb24oKSB7CisvLyAgICAgKiBAVE9ETyB1c2luZyB0YXNrTmFtZSBoZXJlIGlzIGJyaXR0bGUsIGFzIGEgdXNlciBjb3VsZCBvdmVycmlkZSBpdC4KKy8vICAgICAqICAgICAgIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIG1vZGlmaWVkIHRvIHVzZSB0aGUgY2xhc3NuYW1lIGluc3RlYWQuCisgICAgICAgIGlmICgiZXhlY29uIi5lcXVhbHMoZ2V0VGFza05hbWUoKSkpIHsKKyAgICAgICAgICAgIGxvZygiISEgZXhlY29uIGlzIGRlcHJlY2F0ZWQuIFVzZSBhcHBseSBpbnN0ZWFkLiAhISIpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLmNoZWNrQ29uZmlndXJhdGlvbigpOworICAgICAgICBpZiAoZmlsZXNldHMuc2l6ZSgpID09IDAgJiYgcmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibm8gcmVzb3VyY2VzIHNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhcmdldEZpbGVQb3MgIT0gbnVsbCAmJiBtYXBwZXJFbGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGFyZ2V0ZmlsZSBzcGVjaWZpZWQgd2l0aG91dCBtYXBwZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwgJiYgbWFwcGVyRWxlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3Qgc3BlY2lmaWVkIHdpdGhvdXQgbWFwcGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFwcGVyRWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXBwZXIgPSBtYXBwZXJFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIGluc3RhbmNlIHRoYXQgd2lsbCBiZSB1c2VkCisgICAgICogZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPkV4ZWN1dGVTdHJlYW1IYW5kbGVyPC9jb2RlPi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBFeGVjdXRlU3RyZWFtSGFuZGxlciBjcmVhdGVIYW5kbGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy9pZiB3ZSBoYXZlIGEgUmVkaXJlY3RvckVsZW1lbnQsIHJldHVybiBhIGRlY295CisgICAgICAgIHJldHVybiAocmVkaXJlY3RvckVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgID8gc3VwZXIuY3JlYXRlSGFuZGxlcigpIDogbmV3IFB1bXBTdHJlYW1IYW5kbGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHVwIHRoZSBJL08gUmVkaXJlY3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFJlZGlyZWN0b3IoKSB7CisgICAgICAgIHN1cGVyLnNldHVwUmVkaXJlY3RvcigpOworICAgICAgICByZWRpcmVjdG9yLnNldEFwcGVuZFByb3BlcnRpZXModHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSBzcGVjaWZpZWQgRXhlY3V0ZSBvYmplY3QuCisgICAgICogQHBhcmFtIGV4ZSB0aGUgRXhlY3V0ZSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGV4dGVybmFsIHByb2Nlc3MuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJ1bkV4ZWMoRXhlY3V0ZSBleGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCB0b3RhbEZpbGVzID0gMDsKKyAgICAgICAgaW50IHRvdGFsRGlycyA9IDA7CisgICAgICAgIGJvb2xlYW4gaGF2ZUV4ZWN1dGVkID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWZWN0b3IgZmlsZU5hbWVzID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgVmVjdG9yIGJhc2VEaXJzID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc2V0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGZzID0gKEFic3RyYWN0RmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgIGlmIChmcyBpbnN0YW5jZW9mIERpclNldCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUZpbGVEaXJCb3RoLkRJUi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRm91bmQgYSBuZXN0ZWQgZGlyc2V0IGJ1dCB0eXBlIGlzICIgKyB0eXBlICsgIi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRlbXBvcmFyaWx5IHN3aXRjaGluZyB0byB0eXBlPVwiZGlyXCIgb24gdGhlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhc3N1bXB0aW9uIHRoYXQgeW91IHJlYWxseSBkaWQgbWVhbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgPGRpcnNldD4gbm90IDxmaWxlc2V0Pi4iLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHlwZSA9IEZpbGVEaXJCb3RoLkRJUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGaWxlIGJhc2UgPSBmcy5nZXREaXIoZ2V0UHJvamVjdCgpKTsKKworICAgICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIUZpbGVEaXJCb3RoLkRJUi5lcXVhbHMoY3VycmVudFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBnZXRGaWxlcyhiYXNlLCBkcyk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxGaWxlcysrOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVzLmFkZEVsZW1lbnQoc1tqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRGlycy5hZGRFbGVtZW50KGJhc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghRmlsZURpckJvdGguRklMRS5lcXVhbHMoY3VycmVudFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBnZXREaXJzKGJhc2UsIGRzKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbERpcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lcy5hZGRFbGVtZW50KHNbal0pOworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpcnMuYWRkRWxlbWVudChiYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWVzLnNpemUoKSA9PSAwICYmIHNraXBFbXB0eSkgeworICAgICAgICAgICAgICAgICAgICBsb2dTa2lwcGluZ0ZpbGVzZXQoY3VycmVudFR5cGUsIGRzLCBiYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcGFyYWxsZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbZmlsZU5hbWVzLnNpemUoKV07CisgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lcy5jb3B5SW50byhzKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gZ2V0Q29tbWFuZGxpbmUoc1tqXSwgYmFzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coQ29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKGNvbW1hbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNvbW1hbmQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RvckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwUmVkaXJlY3RvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0b3JFbGVtZW50LmNvbmZpZ3VyZShyZWRpcmVjdG9yLCBzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdG9yRWxlbWVudCAhPSBudWxsIHx8IGhhdmVFeGVjdXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcmVzZXQgdGhlIHN0cmVhbSBoYW5kbGVyIHRvIHJlc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkaW5nIG9mIHBpcGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIGFoZWFkIGFuZCBkbyBpdCBhbHdheXMgdy8gbmVzdGVkIHJlZGlyZWN0b3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlLnNldFN0cmVhbUhhbmRsZXIocmVkaXJlY3Rvci5jcmVhdGVIYW5kbGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0ZShleGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZUV4ZWN1dGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZURpcnMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5pc0V4aXN0cygpICYmIGlnbm9yZU1pc3NpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBiYXNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZXMuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgRmlsZVJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUmVzb3VyY2UgZnIgPSAoRmlsZVJlc291cmNlKSByZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gZnIuZ2V0QmFzZURpcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmci5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3QobmV3IFN0cmluZ1tdIHtuYW1lfSwgYmFzZSkubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCghcmVzLmlzRGlyZWN0b3J5KCkgfHwgIXJlcy5pc0V4aXN0cygpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIUZpbGVEaXJCb3RoLkRJUi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRmlsZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuaXNEaXJlY3RvcnkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFGaWxlRGlyQm90aC5GSUxFLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxEaXJzKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJhc2VEaXJzLmFkZChiYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVzLmFkZChuYW1lKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFsbGVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gZ2V0Q29tbWFuZGxpbmUobmFtZSwgYmFzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coQ29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKGNvbW1hbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNvbW1hbmQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RvckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwUmVkaXJlY3RvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0b3JFbGVtZW50LmNvbmZpZ3VyZShyZWRpcmVjdG9yLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdG9yRWxlbWVudCAhPSBudWxsIHx8IGhhdmVFeGVjdXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcmVzZXQgdGhlIHN0cmVhbSBoYW5kbGVyIHRvIHJlc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkaW5nIG9mIHBpcGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIGFoZWFkIGFuZCBkbyBpdCBhbHdheXMgdy8gbmVzdGVkIHJlZGlyZWN0b3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlLnNldFN0cmVhbUhhbmRsZXIocmVkaXJlY3Rvci5jcmVhdGVIYW5kbGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0ZShleGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZUV4ZWN1dGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpcnMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbGxlbCAmJiAoZmlsZU5hbWVzLnNpemUoKSA+IDAgfHwgIXNraXBFbXB0eSkpIHsKKyAgICAgICAgICAgICAgICBydW5QYXJhbGxlbChleGUsIGZpbGVOYW1lcywgYmFzZURpcnMpOworICAgICAgICAgICAgICAgIGhhdmVFeGVjdXRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGF2ZUV4ZWN1dGVkKSB7CisgICAgICAgICAgICAgICAgbG9nKCJBcHBsaWVkICIgKyBjbWRsLmdldEV4ZWN1dGFibGUoKSArICIgdG8gIgorICAgICAgICAgICAgICAgICAgICArIHRvdGFsRmlsZXMgKyAiIGZpbGUiCisgICAgICAgICAgICAgICAgICAgICsgKHRvdGFsRmlsZXMgIT0gMSA/ICJzIiA6ICIiKSArICIgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgKyB0b3RhbERpcnMgKyAiIGRpcmVjdG9yIgorICAgICAgICAgICAgICAgICAgICArICh0b3RhbERpcnMgIT0gMSA/ICJpZXMiIDogInkiKSArICIuIiwKKyAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA/IFByb2plY3QuTVNHX0lORk8gOiBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGVjdXRlIGZhaWxlZDogIiArIGUsIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIG91dHB1dCBmaWxlIGlmIHJlcXVpcmVkCisgICAgICAgICAgICBsb2dGbHVzaCgpOworICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRBcHBlbmRQcm9wZXJ0aWVzKGZhbHNlKTsKKyAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0UHJvcGVydGllcygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbG9nIGEgbWVzc2FnZSBmb3Igc2tpcHBpbmcgYSBmaWxlc2V0LgorICAgICAqIEBwYXJhbSBjdXJyZW50VHlwZSB0aGUgY3VycmVudCB0eXBlLgorICAgICAqIEBwYXJhbSBkcyB0aGUgZGlyZWN0b3J5IHNjYW5uZXIuCisgICAgICogQHBhcmFtIGJhc2UgdGhlIGRpciBiYXNlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZ1NraXBwaW5nRmlsZXNldCgKKyAgICAgICAgU3RyaW5nIGN1cnJlbnRUeXBlLCBEaXJlY3RvcnlTY2FubmVyIGRzLCBGaWxlIGJhc2UpIHsKKyAgICAgICAgaW50IGluY2x1ZGVkQ291bnQKKyAgICAgICAgICAgID0gKCghRmlsZURpckJvdGguRElSLmVxdWFscyhjdXJyZW50VHlwZSkpCisgICAgICAgICAgICAgICA/IGRzLmdldEluY2x1ZGVkRmlsZXNDb3VudCgpIDogMCkKKyAgICAgICAgICAgICsgKCghRmlsZURpckJvdGguRklMRS5lcXVhbHMoY3VycmVudFR5cGUpKQorICAgICAgICAgICAgICAgPyBkcy5nZXRJbmNsdWRlZERpcnNDb3VudCgpIDogMCk7CisKKyAgICAgICAgbG9nKCJTa2lwcGluZyBmaWxlc2V0IGZvciBkaXJlY3RvcnkgIiArIGJhc2UgKyAiLiBJdCBpcyAiCisgICAgICAgICAgICArICgoaW5jbHVkZWRDb3VudCA+IDApID8gInVwIHRvIGRhdGUuIiA6ICJlbXB0eS4iKSwKKyAgICAgICAgICAgICB2ZXJib3NlID8gUHJvamVjdC5NU0dfSU5GTyA6IFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB0aGUgY29tbWFuZCBsaW5lIGZvciBwYXJhbGxlbCBleGVjdXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjRmlsZXMgVGhlIGZpbGVuYW1lcyB0byBhZGQgdG8gdGhlIGNvbW1hbmRsaW5lLgorICAgICAqIEBwYXJhbSBiYXNlRGlycyBmaWxlbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgZGlyLgorICAgICAqIEByZXR1cm4gdGhlIGNvbW1hbmQgbGluZSBpbiB0aGUgZm9ybSBvZiBhIFN0cmluZ1tdLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRDb21tYW5kbGluZShTdHJpbmdbXSBzcmNGaWxlcywgRmlsZVtdIGJhc2VEaXJzKSB7CisgICAgICAgIGZpbmFsIGNoYXIgZmlsZVNlcGFyYXRvciA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKyAgICAgICAgVmVjdG9yIHRhcmdldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGlmICh0YXJnZXRGaWxlUG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgIEhhc2h0YWJsZSBhZGRlZEZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN1YlRhcmdldHMgPSBtYXBwZXIubWFwRmlsZU5hbWUoc3JjRmlsZXNbaV0pOworICAgICAgICAgICAgICAgIGlmIChzdWJUYXJnZXRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdWJUYXJnZXRzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbGF0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IChuZXcgRmlsZShkZXN0RGlyLCBzdWJUYXJnZXRzW2pdKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzdWJUYXJnZXRzW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcndhcmRTbGFzaCAmJiBmaWxlU2VwYXJhdG9yICE9ICcvJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoZmlsZVNlcGFyYXRvciwgJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRkZWRGaWxlcy5jb250YWlucyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHMuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEZpbGVzLnB1dChuYW1lLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSB0YXJnZXRGaWxlcyA9IG5ldyBTdHJpbmdbdGFyZ2V0cy5zaXplKCldOworICAgICAgICB0YXJnZXRzLmNvcHlJbnRvKHRhcmdldEZpbGVzKTsKKworICAgICAgICBpZiAoIWFkZFNvdXJjZUZpbGUpIHsKKyAgICAgICAgICAgIHNyY0ZpbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBvcmlnID0gY21kbC5nZXRDb21tYW5kbGluZSgpOworICAgICAgICBTdHJpbmdbXSByZXN1bHQKKyAgICAgICAgICAgID0gbmV3IFN0cmluZ1tvcmlnLmxlbmd0aCArIHNyY0ZpbGVzLmxlbmd0aCArIHRhcmdldEZpbGVzLmxlbmd0aF07CisKKyAgICAgICAgaW50IHNyY0luZGV4ID0gb3JpZy5sZW5ndGg7CisgICAgICAgIGlmIChzcmNGaWxlUG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNyY0luZGV4ID0gc3JjRmlsZVBvcy5nZXRQb3NpdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmICh0YXJnZXRGaWxlUG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCB0YXJnZXRJbmRleCA9IHRhcmdldEZpbGVQb3MuZ2V0UG9zaXRpb24oKTsKKworICAgICAgICAgICAgaWYgKHNyY0luZGV4IDwgdGFyZ2V0SW5kZXgKKyAgICAgICAgICAgICAgICB8fCAoc3JjSW5kZXggPT0gdGFyZ2V0SW5kZXggJiYgc3JjSXNGaXJzdCkpIHsKKworICAgICAgICAgICAgICAgIC8vIDAgLS0+IHNyY0luZGV4CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCAwLCByZXN1bHQsIDAsIHNyY0luZGV4KTsKKworICAgICAgICAgICAgICAgIC8vIHNyY0luZGV4IC0tPiB0YXJnZXRJbmRleAorICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgc3JjSW5kZXgsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luZGV4ICsgc3JjRmlsZXMubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggLSBzcmNJbmRleCk7CisKKyAgICAgICAgICAgICAgICAvLyB0YXJnZXRzIGFyZSBhbHJlYWR5IGFic29sdXRlIGZpbGUgbmFtZXMKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRhcmdldEZpbGVzLCAwLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCArIHNyY0ZpbGVzLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEZpbGVzLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAvLyB0YXJnZXRJbmRleCAtLT4gZW5kCisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCB0YXJnZXRJbmRleCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmRleCArIHNyY0ZpbGVzLmxlbmd0aCArIHRhcmdldEZpbGVzLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgb3JpZy5sZW5ndGggLSB0YXJnZXRJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIDAgLS0+IHRhcmdldEluZGV4CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCAwLCByZXN1bHQsIDAsIHRhcmdldEluZGV4KTsKKworICAgICAgICAgICAgICAgIC8vIHRhcmdldHMgYXJlIGFscmVhZHkgYWJzb2x1dGUgZmlsZSBuYW1lcworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGFyZ2V0RmlsZXMsIDAsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RmlsZXMubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIC8vIHRhcmdldEluZGV4IC0tPiBzcmNJbmRleAorICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgdGFyZ2V0SW5kZXgsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4ICsgdGFyZ2V0RmlsZXMubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSW5kZXggLSB0YXJnZXRJbmRleCk7CisKKyAgICAgICAgICAgICAgICAvLyBzcmNJbmRleCAtLT4gZW5kCisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCBzcmNJbmRleCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICBzcmNJbmRleCArIHNyY0ZpbGVzLmxlbmd0aCArIHRhcmdldEZpbGVzLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgb3JpZy5sZW5ndGggLSBzcmNJbmRleCk7CisgICAgICAgICAgICAgICAgc3JjSW5kZXggKz0gdGFyZ2V0RmlsZXMubGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7IC8vIG5vIHRhcmdldEZpbGVQb3MKKworICAgICAgICAgICAgLy8gMCAtLT4gc3JjSW5kZXgKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgcmVzdWx0LCAwLCBzcmNJbmRleCk7CisgICAgICAgICAgICAvLyBzcmNJbmRleCAtLT4gZW5kCisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9yaWcsIHNyY0luZGV4LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luZGV4ICsgc3JjRmlsZXMubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnLmxlbmd0aCAtIHNyY0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaWxsIGluIHNvdXJjZSBmaWxlIG5hbWVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghcmVsYXRpdmUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbc3JjSW5kZXggKyBpXSA9CisgICAgICAgICAgICAgICAgICAgIChuZXcgRmlsZShiYXNlRGlyc1tpXSwgc3JjRmlsZXNbaV0pKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W3NyY0luZGV4ICsgaV0gPSBzcmNGaWxlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3J3YXJkU2xhc2ggJiYgZmlsZVNlcGFyYXRvciAhPSAnLycpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbc3JjSW5kZXggKyBpXSA9CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtzcmNJbmRleCArIGldLnJlcGxhY2UoZmlsZVNlcGFyYXRvciwgJy8nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB0aGUgY29tbWFuZCBsaW5lIGZvciBzZXJpYWwgZXhlY3V0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNyY0ZpbGUgVGhlIGZpbGVuYW1lIHRvIGFkZCB0byB0aGUgY29tbWFuZGxpbmUuCisgICAgICogQHBhcmFtIGJhc2VEaXIgZmlsZW5hbWUgaXMgcmVsYXRpdmUgdG8gdGhpcyBkaXIuCisgICAgICogQHJldHVybiB0aGUgY29tbWFuZCBsaW5lIGluIHRoZSBmb3JtIG9mIGEgU3RyaW5nW10uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbW1hbmRsaW5lKFN0cmluZyBzcmNGaWxlLCBGaWxlIGJhc2VEaXIpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbW1hbmRsaW5lKG5ldyBTdHJpbmdbXSB7c3JjRmlsZX0sIG5ldyBGaWxlW10ge2Jhc2VEaXJ9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZmlsZXMgZnJvbSB0aGlzIERpcmVjdG9yeVNjYW5uZXIgdGhhdCBzaG91bGQKKyAgICAgKiBiZSBpbmNsdWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEBwYXJhbSBiYXNlRGlyIHRoZSBGaWxlIGJhc2UgZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBkcyB0aGUgRGlyZWN0b3J5U2Nhbm5lciB0byB1c2UgZm9yIGZpbGUgc2Nhbm5pbmcuCisgICAgICogQHJldHVybiBhIFN0cmluZ1tdIGNvbnRhaW5pbmcgdGhlIGZpbGVuYW1lcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsZXMoRmlsZSBiYXNlRGlyLCBEaXJlY3RvcnlTY2FubmVyIGRzKSB7CisgICAgICAgIHJldHVybiByZXN0cmljdChkcy5nZXRJbmNsdWRlZEZpbGVzKCksIGJhc2VEaXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBEaXJlY3RvcmllcyBmcm9tIHRoaXMgRGlyZWN0b3J5U2Nhbm5lciB0aGF0CisgICAgICogc2hvdWxkIGJlIGluY2x1ZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICogQHBhcmFtIGJhc2VEaXIgdGhlIEZpbGUgYmFzZSBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGRzIHRoZSBEaXJlY3RvcnlTY2FubmVyIHRvIHVzZSBmb3IgZmlsZSBzY2FubmluZy4KKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nW10gY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IG5hbWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREaXJzKEZpbGUgYmFzZURpciwgRGlyZWN0b3J5U2Nhbm5lciBkcykgeworICAgICAgICByZXR1cm4gcmVzdHJpY3QoZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpLCBiYXNlRGlyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMgZnJvbSB0aGlzIEZpbGVMaXN0IHRoYXQKKyAgICAgKiBzaG91bGQgYmUgaW5jbHVkZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKiBAcGFyYW0gbGlzdCB0aGUgRmlsZUxpc3QgdG8gY2hlY2suCisgICAgICogQHJldHVybiBhIFN0cmluZ1tdIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSBuYW1lcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsZXNBbmREaXJzKEZpbGVMaXN0IGxpc3QpIHsKKyAgICAgICAgcmV0dXJuIHJlc3RyaWN0KGxpc3QuZ2V0RmlsZXMoZ2V0UHJvamVjdCgpKSwgbGlzdC5nZXREaXIoZ2V0UHJvamVjdCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSByZXN0cmljdChTdHJpbmdbXSBzLCBGaWxlIGJhc2VEaXIpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwZXIgPT0gbnVsbCB8fCBmb3JjZSkgPyBzCisgICAgICAgICAgICA6IG5ldyBTb3VyY2VGaWxlU2Nhbm5lcih0aGlzKS5yZXN0cmljdChzLCBiYXNlRGlyLCBkZXN0RGlyLCBtYXBwZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgY29tbWFuZCBpbiAicGFyYWxsZWwiIG1vZGUsIG1ha2luZyBzdXJlIHRoYXQgYXQgbW9zdAorICAgICAqIG1heFBhcmFsbGVsIHNvdXJjZWZpbGVzIGdldCBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKiBAcGFyYW0gZXhlIHRoZSBFeGVjdXRhYmxlIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gZmlsZU5hbWVzIHRoZSBWZWN0b3Igb2YgZmlsZW5hbWVzLgorICAgICAqIEBwYXJhbSBiYXNlRGlycyB0aGUgVmVjdG9yIG9mIGJhc2UgZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byBmaWxlTmFtZXMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgb24gSS9PIGVycm9ycy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIG90aGVyIGVycm9ycy4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJ1blBhcmFsbGVsKEV4ZWN1dGUgZXhlLCBWZWN0b3IgZmlsZU5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBiYXNlRGlycykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2ZpbGVOYW1lcy5zaXplKCldOworICAgICAgICBmaWxlTmFtZXMuY29weUludG8ocyk7CisgICAgICAgIEZpbGVbXSBiID0gbmV3IEZpbGVbYmFzZURpcnMuc2l6ZSgpXTsKKyAgICAgICAgYmFzZURpcnMuY29weUludG8oYik7CisKKyAgICAgICAgaWYgKG1heFBhcmFsbGVsIDw9IDAKKyAgICAgICAgICAgIHx8IHMubGVuZ3RoID09IDAgLyogdGhpcyBpcyBza2lwRW1wdHkgPT0gZmFsc2UgKi8pIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBnZXRDb21tYW5kbGluZShzLCBiKTsKKyAgICAgICAgICAgIGxvZyhDb21tYW5kbGluZS5kZXNjcmliZUNvbW1hbmQoY29tbWFuZCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNvbW1hbmQpOworICAgICAgICAgICAgcnVuRXhlY3V0ZShleGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHN0aWxsVG9EbyA9IGZpbGVOYW1lcy5zaXplKCk7CisgICAgICAgICAgICBpbnQgY3VycmVudE9mZnNldCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoc3RpbGxUb0RvID4gMCkgeworICAgICAgICAgICAgICAgIGludCBjdXJyZW50QW1vdW50ID0gTWF0aC5taW4oc3RpbGxUb0RvLCBtYXhQYXJhbGxlbCk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gY3MgPSBuZXcgU3RyaW5nW2N1cnJlbnRBbW91bnRdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocywgY3VycmVudE9mZnNldCwgY3MsIDAsIGN1cnJlbnRBbW91bnQpOworICAgICAgICAgICAgICAgIEZpbGVbXSBjYiA9IG5ldyBGaWxlW2N1cnJlbnRBbW91bnRdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgY3VycmVudE9mZnNldCwgY2IsIDAsIGN1cnJlbnRBbW91bnQpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBnZXRDb21tYW5kbGluZShjcywgY2IpOworICAgICAgICAgICAgICAgIGxvZyhDb21tYW5kbGluZS5kZXNjcmliZUNvbW1hbmQoY29tbWFuZCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjb21tYW5kKTsKKyAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RvckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cFJlZGlyZWN0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RvckVsZW1lbnQuY29uZmlndXJlKHJlZGlyZWN0b3IsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RvckVsZW1lbnQgIT0gbnVsbCB8fCBjdXJyZW50T2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHJlc2V0IHRoZSBzdHJlYW0gaGFuZGxlciB0byByZXN0YXJ0CisgICAgICAgICAgICAgICAgICAgIC8vIHJlYWRpbmcgb2YgcGlwZXM7CisgICAgICAgICAgICAgICAgICAgIC8vIGdvIGFoZWFkIGFuZCBkbyBpdCBhbHdheXMgdy8gbmVzdGVkIHJlZGlyZWN0b3JzCisgICAgICAgICAgICAgICAgICAgIGV4ZS5zZXRTdHJlYW1IYW5kbGVyKHJlZGlyZWN0b3IuY3JlYXRlSGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnVuRXhlY3V0ZShleGUpOworCisgICAgICAgICAgICAgICAgc3RpbGxUb0RvIC09IGN1cnJlbnRBbW91bnQ7CisgICAgICAgICAgICAgICAgY3VycmVudE9mZnNldCArPSBjdXJyZW50QW1vdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWVzICJmaWxlIiwgImRpciIgYW5kICJib3RoIgorICAgICAqIGZvciB0aGUgdHlwZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlRGlyQm90aCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKiogRmlsZSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGUiOworICAgICAgICAvKiogRGlyIHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUiA9ICJkaXIiOworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlI2dldFZhbHVlcworICAgICAgICAgKi8KKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge0ZJTEUsIERJUiwgImJvdGgifTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVTdHJlYW1IYW5kbGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlU3RyZWFtSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNWY5NzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlU3RyZWFtSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBVc2VkIGJ5IDxjb2RlPkV4ZWN1dGU8L2NvZGU+IHRvIGhhbmRsZSBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbSBvZgorICogc3VicHJvY2Vzc2VzLgorICoKKyAqIEBzaW5jZSBBbnQgMS4yCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgeworCisgICAgLyoqCisgICAgICogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoZSBpbnB1dCBzdHJlYW0gb2YgdGhlIHN1YnByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Mgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0byB0aGUgc3RhbmRhcmQgaW5wdXQgc3RyZWFtIG9mIHRoZQorICAgICAqICAgICAgICAgICBzdWJwcm9jZXNzCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHZvaWQgc2V0UHJvY2Vzc0lucHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoZSBlcnJvciBzdHJlYW0gb2YgdGhlIHN1YnByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXMgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbSB0aGUgZXJyb3Igc3RyZWFtIGZyb20gdGhlIHN1YnByb2Nlc3MKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgdm9pZCBzZXRQcm9jZXNzRXJyb3JTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEluc3RhbGwgYSBoYW5kbGVyIGZvciB0aGUgb3V0cHV0IHN0cmVhbSBvZiB0aGUgc3VicHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpcyBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tIHRoZSBlcnJvciBzdHJlYW0gZnJvbSB0aGUgc3VicHJvY2VzcworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICB2b2lkIHNldFByb2Nlc3NPdXRwdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IGhhbmRsaW5nIG9mIHRoZSBzdHJlYW1zLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICB2b2lkIHN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RvcCBoYW5kbGluZyBvZiB0aGUgc3RyZWFtcyAtIHdpbGwgbm90IGJlIHJlc3RhcnRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3AoKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVXYXRjaGRvZy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVdhdGNoZG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzOTMzZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVXYXRjaGRvZy5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlRpbWVvdXRPYnNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLldhdGNoZG9nOworCisvKioKKyAqIERlc3Ryb3lzIGEgcHJvY2VzcyBydW5uaW5nIGZvciB0b28gbG9uZy4KKyAqIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIEV4ZWN1dGVXYXRjaGRvZyB3YXRjaGRvZyA9IG5ldyBFeGVjdXRlV2F0Y2hkb2coMzAwMDApOworICogRXhlY3V0ZSBleGVjID0gbmV3IEV4ZWN1dGUobXlsb2doYW5kbGVyLCB3YXRjaGRvZyk7CisgKiBleGVjLnNldENvbW1hbmRMaW5lKG15Y21kbGluZSk7CisgKiBpbnQgZXhpdHZhbHVlID0gZXhlYy5leGVjdXRlKCk7CisgKiBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUoZXhpdHZhbHVlKSAmYW1wOyZhbXA7IHdhdGNoZG9nLmtpbGxlZFByb2Nlc3MoKSkgeworICogICAgICAgICAgICAgIC8vIGl0IHdhcyBraWxsZWQgb24gcHVycG9zZSBieSB0aGUgd2F0Y2hkb2cKKyAqIH0KKyAqIDwvcHJlPgorCisgKiBAc2VlIEV4ZWN1dGUKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5XYXRjaGRvZworICogQHNpbmNlIEFudCAxLjIKKyAqLworcHVibGljIGNsYXNzIEV4ZWN1dGVXYXRjaGRvZyBpbXBsZW1lbnRzIFRpbWVvdXRPYnNlcnZlciB7CisKKyAgICAvKiogdGhlIHByb2Nlc3MgdG8gZXhlY3V0ZSBhbmQgd2F0Y2ggZm9yIGR1cmF0aW9uICovCisgICAgcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7CisKKyAgICAvKiogc2F5IHdoZXRoZXIgb3Igbm90IHRoZSB3YXRjaGRvZyBpcyBjdXJyZW50bHkgbW9uaXRvcmluZyBhIHByb2Nlc3MgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gd2F0Y2ggPSBmYWxzZTsKKworICAgIC8qKiBleGNlcHRpb24gdGhhdCBtaWdodCBiZSB0aHJvd24gZHVyaW5nIHRoZSBwcm9jZXNzIGV4ZWN1dGlvbiAqLworICAgIHByaXZhdGUgRXhjZXB0aW9uIGNhdWdodCA9IG51bGw7CisKKyAgICAvKiogc2F5IHdoZXRoZXIgb3Igbm90IHRoZSBwcm9jZXNzIHdhcyBraWxsZWQgZHVlIHRvIHJ1bm5pbmcgb3ZlcnRpbWUgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4ga2lsbGVkUHJvY2VzcyA9IGZhbHNlOworCisgICAgLyoqIHdpbGwgdGVsbCB1cyB3aGV0aGVyIHRpbWVvdXQgaGFzIG9jY3VycmVkICovCisgICAgcHJpdmF0ZSBXYXRjaGRvZyB3YXRjaGRvZzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgd2F0Y2hkb2cgd2l0aCBhIGdpdmVuIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCBmb3IgdGhlIHByb2Nlc3MgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEl0IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dGVXYXRjaGRvZyhsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgd2F0Y2hkb2cgPSBuZXcgV2F0Y2hkb2codGltZW91dCk7CisgICAgICAgIHdhdGNoZG9nLmFkZFRpbWVvdXRPYnNlcnZlcih0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB2YWx1ZSB0byB1c2UgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBzZWUgI0V4ZWN1dGVXYXRjaGRvZyhsb25nKQorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFVzZSBjb25zdHJ1Y3RvciB3aXRoIGEgbG9uZyB0eXBlIGluc3RlYWQuCisgICAgICogKDEuNC54IGNvbXBhdGliaWxpdHkpCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dGVXYXRjaGRvZyhpbnQgdGltZW91dCkgeworICAgICAgICB0aGlzKChsb25nKSB0aW1lb3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYXRjaGVzIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCB0ZXJtaW5hdGVzIGl0LCBpZiBpdCBydW5zIGZvciB0b28gbG9uZy4KKyAgICAgKiBBbGwgaW5mb3JtYXRpb24gZnJvbSB0aGUgcHJldmlvdXMgcnVuIGFyZSByZXNldC4KKyAgICAgKiBAcGFyYW0gcHJvY2VzcyB0aGUgcHJvY2VzcyB0byBtb25pdG9yLiBJdCBjYW5ub3QgYmUgPHR0Pm51bGw8L3R0PgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJvY2VzcyBpcyBzdGlsbCBiZWluZyBtb25pdG9yZWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KFByb2Nlc3MgcHJvY2VzcykgeworICAgICAgICBpZiAocHJvY2VzcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInByb2Nlc3MgaXMgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5wcm9jZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFscmVhZHkgcnVubmluZy4iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNhdWdodCA9IG51bGw7CisgICAgICAgIHRoaXMua2lsbGVkUHJvY2VzcyA9IGZhbHNlOworICAgICAgICB0aGlzLndhdGNoID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKKyAgICAgICAgd2F0Y2hkb2cuc3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgd2F0Y2hlci4gSXQgd2lsbCBub3RpZnkgYWxsIHRocmVhZHMgcG9zc2libHkgd2FpdGluZworICAgICAqIG9uIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworICAgICAgICB3YXRjaGRvZy5zdG9wKCk7CisgICAgICAgIGNsZWFuVXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYWZ0ZXIgd2F0Y2hkb2cgaGFzIGZpbmlzaGVkLgorICAgICAqIFRoaXMgY2FuIGJlIGNhbGxlZCBpbiB0aGUgd2F0Y2hkb2cgdGhyZWFkCisgICAgICogQHBhcmFtIHcgdGhlIHdhdGNoZG9nCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHRpbWVvdXRPY2N1cmVkKFdhdGNoZG9nIHcpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBjaGVjayBpZiB0aGUgcHJvY2VzcyB3YXMgbm90IHN0b3BwZWQKKyAgICAgICAgICAgICAgICAvLyBiZWZvcmUgYmVpbmcgaGVyZQorICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdFZhbHVlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gaXRzZSkgeworICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIGlzIG5vdCB0ZXJtaW5hdGVkLCBpZiB0aGlzIGlzIHJlYWxseQorICAgICAgICAgICAgICAgIC8vIGEgdGltZW91dCBhbmQgbm90IGEgbWFudWFsIHN0b3AgdGhlbiBraWxsIGl0LgorICAgICAgICAgICAgICAgIGlmICh3YXRjaCkgeworICAgICAgICAgICAgICAgICAgICBraWxsZWRQcm9jZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2F1Z2h0ID0gZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsZWFuVXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlc2V0IHRoZSBtb25pdG9yIGZsYWcgYW5kIHRoZSBwcm9jZXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhblVwKCkgeworICAgICAgICB3YXRjaCA9IGZhbHNlOworICAgICAgICBwcm9jZXNzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldGhyb3cgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyBwb3NzaWJseSBjYXVnaHQgZHVyaW5nCisgICAgICogdGhlIHJ1biBvZiB0aGUgcHJvY2Vzcy4gSXQgd2lsbCBvbmx5IHJlbWFpbnMgdmFsaWQgb25jZSB0aGUgcHJvY2VzcyBoYXMKKyAgICAgKiBiZWVuIHRlcm1pbmF0ZWQgZWl0aGVyIGJ5ICdlcnJvcicsIHRpbWVvdXQgb3IgbWFudWFsIGludGVydmVudGlvbi4KKyAgICAgKiBJbmZvcm1hdGlvbiB3aWxsIGJlIGRpc2NhcmRlZCBvbmNlIGEgbmV3IHByb2Nlc3MgaXMgcmFuLgorICAgICAqIEB0aHJvd3MgIEJ1aWxkRXhjZXB0aW9uICBhIHdyYXBwZWQgZXhjZXB0aW9uIG92ZXIgdGhlIG9uZSB0aGF0IHdhcworICAgICAqIHNpbGVudGx5IHN3YWxsb3dlZCBhbmQgc3RvcmVkIGR1cmluZyB0aGUgcHJvY2VzcyBydW4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrRXhjZXB0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNhdWdodCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4Y2VwdGlvbiBpbiBFeGVjdXRlV2F0Y2hkb2cucnVuOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYXVnaHQuZ2V0TWVzc2FnZSgpLCBjYXVnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSB3YXRjaGRvZyBpcyBzdGlsbCBtb25pdG9yaW5nIHRoZSBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gIDx0dD50cnVlPC90dD4gaWYgdGhlIHByb2Nlc3MgaXMgc3RpbGwgcnVubmluZywgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgPHR0PmZhbHNlPC90dD4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNXYXRjaGluZygpIHsKKyAgICAgICAgcmV0dXJuIHdhdGNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBsYXN0IHByb2Nlc3MgcnVuIHdhcyBraWxsZWQgb24gdGltZW91dCBvciBub3QuCisgICAgICogQHJldHVybiAgPHR0PnRydWU8L3R0PiBpZiB0aGUgcHJvY2VzcyB3YXMga2lsbGVkIG90aGVyd2lzZQorICAgICAqICAgICAgICAgIDx0dD5mYWxzZTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGtpbGxlZFByb2Nlc3MoKSB7CisgICAgICAgIHJldHVybiBraWxsZWRQcm9jZXNzOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhpdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhpdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZTgxN2IKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGl0LmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGl0U3RhdHVzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Db25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbkJhc2U7CisKKy8qKgorICogRXhpdHMgdGhlIGFjdGl2ZSBidWlsZCwgZ2l2aW5nIGFuIGFkZGl0aW9uYWwgbWVzc2FnZQorICogaWYgYXZhaWxhYmxlLgorICoKKyAqIFRoZSA8Y29kZT5pZjwvY29kZT4gYW5kIDxjb2RlPnVubGVzczwvY29kZT4gYXR0cmlidXRlcyBtYWtlIHRoZQorICogZmFpbHVyZSBjb25kaXRpb25hbCAtYm90aCBwcm9iZSBmb3IgdGhlIG5hbWVkIHByb3BlcnR5IGJlaW5nIGRlZmluZWQuCisgKiBUaGUgPGNvZGU+aWY8L2NvZGU+IHRlc3RzIGZvciB0aGUgcHJvcGVydHkgYmVpbmcgZGVmaW5lZCwgdGhlCisgKiA8Y29kZT51bmxlc3M8L2NvZGU+IGZvciBhIHByb3BlcnR5IGJlaW5nIHVuZGVmaW5lZC4KKyAqCisgKiBJZiBib3RoIGF0dHJpYnV0ZXMgYXJlIHNldCwgdGhlbiB0aGUgdGVzdCBmYWlscyBvbmx5IGlmIGJvdGggdGVzdHMKKyAqIGFyZSB0cnVlLiBpLmUuCisgKiA8cHJlPmZhaWwgOj0gZGVmaW5lZChpZlByb3BlcnR5KSAmJiAhZGVmaW5lZCh1bmxlc3NQcm9wZXJ0eSk8L3ByZT4KKyAqCisgKiBBIHNpbmdsZSBuZXN0ZWQ8Y29kZT4mbHQ7Y29uZGl0aW9uJmd0OzwvY29kZT4gZWxlbWVudCBjYW4gYmUgc3BlY2lmaWVkCisgKiBpbnN0ZWFkIG9mIHVzaW5nIDxjb2RlPmlmPC9jb2RlPi88Y29kZT51bmxlc3M8L2NvZGU+IChhIGNvbWJpbmVkCisgKiBlZmZlY3QgY2FuIGJlIGFjaGlldmVkIHVzaW5nIDxjb2RlPmlzc2V0PC9jb2RlPiBjb25kaXRpb25zKS4KKyAqCisgKiBAc2luY2UgQW50IDEuMgorICoKKyAqIEBhbnQudGFzayBuYW1lPSJmYWlsIiBjYXRlZ29yeT0iY29udHJvbCIKKyAqLworcHVibGljIGNsYXNzIEV4aXQgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3RlZENvbmRpdGlvbiBleHRlbmRzIENvbmRpdGlvbkJhc2UgaW1wbGVtZW50cyBDb25kaXRpb24geworICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgeworICAgICAgICAgICAgaWYgKGNvdW50Q29uZGl0aW9ucygpICE9IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBIHNpbmdsZSBuZXN0ZWQgY29uZGl0aW9uIGlzIHJlcXVpcmVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICgoQ29uZGl0aW9uKSAoZ2V0Q29uZGl0aW9ucygpLm5leHRFbGVtZW50KCkpKS5ldmFsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworICAgIHByaXZhdGUgU3RyaW5nIGlmQ29uZGl0aW9uLCB1bmxlc3NDb25kaXRpb247CisgICAgcHJpdmF0ZSBOZXN0ZWRDb25kaXRpb24gbmVzdGVkQ29uZGl0aW9uOworICAgIHByaXZhdGUgSW50ZWdlciBzdGF0dXM7CisKKyAgICAvKioKKyAgICAgKiBBIG1lc3NhZ2UgZ2l2aW5nIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gd2h5IHRoZSBidWlsZCBleGl0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgbWVzc2FnZSB0byBvdXRwdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmx5IGZhaWwgaWYgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgKiBAcGFyYW0gYyBwcm9wZXJ0eSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWYoU3RyaW5nIGMpIHsKKyAgICAgICAgaWZDb25kaXRpb24gPSBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9ubHkgZmFpbCBpZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90CisgICAgICogZXhpc3QgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgKiBAcGFyYW0gYyBwcm9wZXJ0eSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5sZXNzKFN0cmluZyBjKSB7CisgICAgICAgIHVubGVzc0NvbmRpdGlvbiA9IGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdGF0dXMgY29kZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdGhyb3duIEV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gaSAgIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHN0YXR1cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgaSkgeworICAgICAgICBzdGF0dXMgPSBuZXcgSW50ZWdlcihpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBhIDxjb2RlPkJ1aWxkRXhjZXB0aW9uPC9jb2RlPiB0byBleGl0IChmYWlsKSB0aGUgYnVpbGQuCisgICAgICogSWYgc3BlY2lmaWVkLCBldmFsdWF0ZSBjb25kaXRpb25zOgorICAgICAqIEEgc2luZ2xlIG5lc3RlZCBjb25kaXRpb24gaXMgYWNjZXB0ZWQsIGJ1dCByZXF1aXJlcyB0aGF0IHRoZQorICAgICAqIDxjb2RlPmlmPC9jb2RlPi88Y29kZT51bmxlc3M8L2NvZGU+IGF0dHJpYnV0ZXMgYmUgb21pdHRlZC4KKyAgICAgKiBJZiB0aGUgbmVzdGVkIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZSwgb3IgdGhlCisgICAgICogaWZDb25kaXRpb24gaXMgdHJ1ZSBvciB1bmxlc3NDb25kaXRpb24gaXMgZmFsc2UsIHRoZSBidWlsZCB3aWxsIGV4aXQuCisgICAgICogVGhlIGVycm9yIG1lc3NhZ2UgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgdGV4dCBmaWVsZHMsIGZyb20KKyAgICAgKiB0aGUgbmVzdGVkIGNvbmRpdGlvbiAoaWYgc3BlY2lmaWVkKSwgb3IgZmluYWxseSBmcm9tCisgICAgICogdGhlIGlmIGFuZCB1bmxlc3MgcGFyYW1ldGVycyAoaWYgcHJlc2VudCkuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGZhaWwgPSAobmVzdGVkQ29uZGl0aW9uUHJlc2VudCgpKSA/IHRlc3ROZXN0ZWRDb25kaXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgOiAodGVzdElmQ29uZGl0aW9uKCkgJiYgdGVzdFVubGVzc0NvbmRpdGlvbigpKTsKKyAgICAgICAgaWYgKGZhaWwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IG1lc3NhZ2UudHJpbSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaWZDb25kaXRpb24gIT0gbnVsbCAmJiBpZkNvbmRpdGlvbi5sZW5ndGgoKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KGlmQ29uZGl0aW9uKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiaWY9IiArIGlmQ29uZGl0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodW5sZXNzQ29uZGl0aW9uICE9IG51bGwgJiYgdW5sZXNzQ29uZGl0aW9uLmxlbmd0aCgpID4gMAorICAgICAgICAgICAgICAgICAgICAmJiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkodW5sZXNzQ29uZGl0aW9uKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiBhbmQgIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICJ1bmxlc3M9IiArIHVubGVzc0NvbmRpdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5lc3RlZENvbmRpdGlvblByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gImNvbmRpdGlvbiBzYXRpc2ZpZWQiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiTm8gbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coImZhaWxpbmcgZHVlIHRvICIgKyB0ZXh0LCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB0aHJvdyAoKHN0YXR1cyA9PSBudWxsKSA/IG5ldyBCdWlsZEV4Y2VwdGlvbih0ZXh0KQorICAgICAgICAgICAgIDogbmV3IEV4aXRTdGF0dXNFeGNlcHRpb24odGV4dCwgc3RhdHVzLmludFZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIG11bHRpbGluZSBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIG1zZykgeworICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgbWVzc2FnZSArPSBnZXRQcm9qZWN0KCkucmVwbGFjZVByb3BlcnRpZXMobXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb25kaXRpb24gZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPkNvbmRpdGlvbkJhc2U8L2NvZGU+LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uZGl0aW9uQmFzZSBjcmVhdGVDb25kaXRpb24oKSB7CisgICAgICAgIGlmIChuZXN0ZWRDb25kaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBuZXN0ZWQgY29uZGl0aW9uIGlzIGFsbG93ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgbmVzdGVkQ29uZGl0aW9uID0gbmV3IE5lc3RlZENvbmRpdGlvbigpOworICAgICAgICByZXR1cm4gbmVzdGVkQ29uZGl0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIGlmIGNvbmRpdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBubyBpZiBjb25kaXRpb24sIG9yIHRoZSBuYW1lZCBwcm9wZXJ0eSBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdGVzdElmQ29uZGl0aW9uKCkgeworICAgICAgICBpZiAoaWZDb25kaXRpb24gPT0gbnVsbCB8fCAiIi5lcXVhbHMoaWZDb25kaXRpb24pKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KGlmQ29uZGl0aW9uKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIHVubGVzcyBjb25kaXRpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbm8gdW5sZXNzIGNvbmRpdGlvbiwKKyAgICAgKiAgb3IgdGhlcmUgaXMgYSBuYW1lZCBwcm9wZXJ0eSBidXQgaXQgZG9lc24ndCBleGlzdAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0VW5sZXNzQ29uZGl0aW9uKCkgeworICAgICAgICBpZiAodW5sZXNzQ29uZGl0aW9uID09IG51bGwgfHwgIiIuZXF1YWxzKHVubGVzc0NvbmRpdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkodW5sZXNzQ29uZGl0aW9uKSA9PSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIG5lc3RlZCBjb25kaXRpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbm9uZSwgb3IgaXQgZXZhbHVhdGVzIHRvIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdGVzdE5lc3RlZENvbmRpdGlvbigpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBuZXN0ZWRDb25kaXRpb25QcmVzZW50KCk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAmJiBpZkNvbmRpdGlvbiAhPSBudWxsIHx8IHVubGVzc0NvbmRpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lc3RlZCBjb25kaXRpb25zICIKKyAgICAgICAgICAgICAgICArICJub3QgcGVybWl0dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggaWYvdW5sZXNzIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQgJiYgbmVzdGVkQ29uZGl0aW9uLmV2YWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHdoZXRoZXIgdGhlcmUgaXMgYSBuZXN0ZWQgY29uZGl0aW9uLgorICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5lc3RlZENvbmRpdGlvblByZXNlbnQoKSB7CisgICAgICAgIHJldHVybiAobmVzdGVkQ29uZGl0aW9uICE9IG51bGwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhwYW5kLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeHBhbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjliMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhwYW5kLmphdmEKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlVuaW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TZWxlY3RvclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5JZGVudGl0eU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlOworCisvKioKKyAqIFVuemlwIGEgZmlsZS4KKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0icGFja2FnaW5nIgorICogICAgICAgICAgIG5hbWU9InVuemlwIgorICogICAgICAgICAgIG5hbWU9InVuamFyIgorICogICAgICAgICAgIG5hbWU9InVud2FyIgorICovCitwdWJsaWMgY2xhc3MgRXhwYW5kIGV4dGVuZHMgVGFzayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAyNDsKKyAgICBwcml2YXRlIEZpbGUgZGVzdDsgLy9yZXEKKyAgICBwcml2YXRlIEZpbGUgc291cmNlOyAvLyByZXEKKyAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlID0gdHJ1ZTsKKyAgICBwcml2YXRlIE1hcHBlciBtYXBwZXJFbGVtZW50ID0gbnVsbDsKKyAgICBwcml2YXRlIFZlY3RvciBwYXR0ZXJuc2V0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFVuaW9uIHJlc291cmNlcyA9IG5ldyBVbmlvbigpOworICAgIHByaXZhdGUgYm9vbGVhbiByZXNvdXJjZXNTcGVjaWZpZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfRU5DT0RJTkcgPSAibmF0aXZlLWVuY29kaW5nIjsKKworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gIlVURjgiOworICAgIC8qKiBFcnJvciBtZXNzYWdlIHdoZW4gbW9yZSB0aGF0IG9uZSBtYXBwZXIgaXMgZGVmaW5lZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX01VTFRJUExFX01BUFBFUlMgPSAiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIERvIHRoZSB3b3JrLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBUaHJvd24gaW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCJleHBhbmQiLmVxdWFscyhnZXRUYXNrVHlwZSgpKSkgeworICAgICAgICAgICAgbG9nKCIhISBleHBhbmQgaXMgZGVwcmVjYXRlZC4gVXNlIHVuemlwIGluc3RlYWQuICEhIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc291cmNlID09IG51bGwgJiYgIXJlc291cmNlc1NwZWNpZmllZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgYXR0cmlidXRlIGFuZC9vciByZXNvdXJjZXMgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3BlY2lmaWVkIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRlc3QgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdC5leGlzdHMoKSAmJiAhZGVzdC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlc3QgbXVzdCBiZSBhIGRpcmVjdG9yeS4iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTcmMgbXVzdCBub3QgYmUgYSBkaXJlY3RvcnkuIgorICAgICAgICAgICAgICAgICAgICArICIgVXNlIG5lc3RlZCBmaWxlc2V0cyBpbnN0ZWFkLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHBhbmRGaWxlKEZJTEVfVVRJTFMsIHNvdXJjZSwgZGVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFJlc291cmNlIHIgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKCFyLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBleHBhbmRGaWxlKEZJTEVfVVRJTFMsICgoRmlsZVJlc291cmNlKSByKS5nZXRGaWxlKCksIGRlc3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHBhbmRSZXNvdXJjZShyLCBkZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIG92ZXJyaWRkZW4gYnkgZXh0ZW5kaW5nIHVuYXJjaGl2YWwgdGFza3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZVV0aWxzIHRoZSBmaWxlVXRpbHMKKyAgICAgKiBAcGFyYW0gc3JjRiAgICAgIHRoZSBzb3VyY2UgZmlsZQorICAgICAqIEBwYXJhbSBkaXIgICAgICAgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV4cGFuZEZpbGUoRmlsZVV0aWxzIGZpbGVVdGlscywgRmlsZSBzcmNGLCBGaWxlIGRpcikgeworICAgICAgICBsb2coIkV4cGFuZGluZzogIiArIHNyY0YgKyAiIGludG8gIiArIGRpciwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIFppcEZpbGUgemYgPSBudWxsOworICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSBnZXRNYXBwZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHpmID0gbmV3IFppcEZpbGUoc3JjRiwgZW5jb2RpbmcpOworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHpmLmdldEVudHJpZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgWmlwRW50cnkgemUgPSAoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBleHRyYWN0RmlsZShmaWxlVXRpbHMsIHNyY0YsIGRpciwgemYuZ2V0SW5wdXRTdHJlYW0oemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplLmdldE5hbWUoKSwgbmV3IERhdGUoemUuZ2V0VGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZS5pc0RpcmVjdG9yeSgpLCBtYXBwZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2coImV4cGFuZCBjb21wbGV0ZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgZXhwYW5kaW5nICIgKyBzcmNGLmdldFBhdGgoKQorICAgICAgICAgICAgICAgICsgIlxuIiArIGlvZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIGlvZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBaaXBGaWxlLmNsb3NlUXVpZXRseSh6Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBvdmVycmlkZGVuIGJ5IGV4dGVuZGluZyB1bmFyY2hpdmFsIHRhc2tzLgorICAgICAqCisgICAgICogQHBhcmFtIHNyY1IgICAgICB0aGUgc291cmNlIHJlc291cmNlCisgICAgICogQHBhcmFtIGRpciAgICAgICB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZXhwYW5kUmVzb3VyY2UoUmVzb3VyY2Ugc3JjUiwgRmlsZSBkaXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvbmx5IGZpbGVzeXN0ZW0gYmFzZWQgcmVzb3VyY2VzIGFyZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzdXBwb3J0ZWQgYnkgdGhpcyB0YXNrLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhIG1hcHBlciBmb3IgYSBmaWxlCisgICAgICogQHJldHVybiBhIGZpbGVuYW1lbWFwcGVyIGZvciBhIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZU5hbWVNYXBwZXIgZ2V0TWFwcGVyKCkgeworICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSBudWxsOworICAgICAgICBpZiAobWFwcGVyRWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXBwZXIgPSBtYXBwZXJFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXBwZXIgPSBuZXcgSWRlbnRpdHlNYXBwZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFwcGVyOworICAgIH0KKworICAgIC8vIENoZWNrU3R5bGU6UGFyYW1ldGVyTnVtYmVyQ2hlY2sgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiBleHRyYWN0IGEgZmlsZSB0byBhIGRpcmVjdG9yeQorICAgICAqIEBwYXJhbSBmaWxlVXRpbHMgICAgICAgICAgICAgYSBmaWxlVXRpbHMgb2JqZWN0CisgICAgICogQHBhcmFtIHNyY0YgICAgICAgICAgICAgICAgICB0aGUgc291cmNlIGZpbGUKKyAgICAgKiBAcGFyYW0gZGlyICAgICAgICAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gY29tcHJlc3NlZElucHV0U3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gZW50cnlOYW1lICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbnRyeQorICAgICAqIEBwYXJhbSBlbnRyeURhdGUgICAgICAgICAgICAgdGhlIGRhdGUgb2YgdGhlIGVudHJ5CisgICAgICogQHBhcmFtIGlzRGlyZWN0b3J5ICAgICAgICAgICBpZiB0aGlzIGlzIHRydWUgdGhlIGVudHJ5IGlzIGEgZGlyZWN0b3J5CisgICAgICogQHBhcmFtIG1hcHBlciAgICAgICAgICAgICAgICB0aGUgZmlsZW5hbWUgbWFwcGVyIHRvIHVzZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0RmlsZShGaWxlVXRpbHMgZmlsZVV0aWxzLCBGaWxlIHNyY0YsIEZpbGUgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGNvbXByZXNzZWRJbnB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lLCBEYXRlIGVudHJ5RGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRGlyZWN0b3J5LCBGaWxlTmFtZU1hcHBlciBtYXBwZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocGF0dGVybnNldHMgIT0gbnVsbCAmJiBwYXR0ZXJuc2V0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5TmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKQorICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVkID0gZmFsc2U7CisgICAgICAgICAgICBTZXQgaW5jbHVkZVBhdHRlcm5zID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIFNldCBleGNsdWRlUGF0dGVybnMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgZm9yIChpbnQgdiA9IDAsIHNpemUgPSBwYXR0ZXJuc2V0cy5zaXplKCk7IHYgPCBzaXplOyB2KyspIHsKKyAgICAgICAgICAgICAgICBQYXR0ZXJuU2V0IHAgPSAoUGF0dGVyblNldCkgcGF0dGVybnNldHMuZWxlbWVudEF0KHYpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGluY2xzID0gcC5nZXRJbmNsdWRlUGF0dGVybnMoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5jbHMgPT0gbnVsbCB8fCBpbmNscy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBpbmNsdWRlIHBhdHRlcm4gaW1wbGljaXRseSBtZWFucyBpbmNsdWRlcz0iKioiCisgICAgICAgICAgICAgICAgICAgIGluY2xzID0gbmV3IFN0cmluZ1tdIHsiKioifTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCB3ID0gMDsgdyA8IGluY2xzLmxlbmd0aDsgdysrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gaW5jbHNbd10ucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiArPSAiKioiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQYXR0ZXJucy5hZGQocGF0dGVybik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nW10gZXhjbHMgPSBwLmdldEV4Y2x1ZGVQYXR0ZXJucyhnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIGlmIChleGNscyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHcgPSAwOyB3IDwgZXhjbHMubGVuZ3RoOyB3KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gZXhjbHNbd10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiArPSAiKioiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVBhdHRlcm5zLmFkZChwYXR0ZXJuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW5jbHVkZVBhdHRlcm5zLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICFpbmNsdWRlZCAmJiBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGluY2x1ZGVkID0gU2VsZWN0b3JVdGlscy5tYXRjaFBhdGgocGF0dGVybiwgbmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4Y2x1ZGVQYXR0ZXJucy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICBpbmNsdWRlZCAmJiBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGluY2x1ZGVkID0gIVNlbGVjdG9yVXRpbHMubWF0Y2hQYXRoKHBhdHRlcm4sIG5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWluY2x1ZGVkKSB7CisgICAgICAgICAgICAgICAgLy9EbyBub3QgcHJvY2VzcyB0aGlzIGZpbGUKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gbWFwcGVkTmFtZXMgPSBtYXBwZXIubWFwRmlsZU5hbWUoZW50cnlOYW1lKTsKKyAgICAgICAgaWYgKG1hcHBlZE5hbWVzID09IG51bGwgfHwgbWFwcGVkTmFtZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIG1hcHBlZE5hbWVzID0gbmV3IFN0cmluZ1tdIHtlbnRyeU5hbWV9OworICAgICAgICB9CisgICAgICAgIEZpbGUgZiA9IGZpbGVVdGlscy5yZXNvbHZlRmlsZShkaXIsIG1hcHBlZE5hbWVzWzBdKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghb3ZlcndyaXRlICYmIGYuZXhpc3RzKCkKKyAgICAgICAgICAgICAgICAmJiBmLmxhc3RNb2RpZmllZCgpID49IGVudHJ5RGF0ZS5nZXRUaW1lKCkpIHsKKyAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nICIgKyBmICsgIiBhcyBpdCBpcyB1cC10by1kYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9nKCJleHBhbmRpbmcgIiArIGVudHJ5TmFtZSArICIgdG8gIiArIGYsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAvLyBjcmVhdGUgaW50ZXJtZWRpYXJ5IGRpcmVjdG9yaWVzIC0gc29tZXRpbWVzIHppcCBkb24ndCBhZGQgdGhlbQorICAgICAgICAgICAgRmlsZSBkaXJGID0gZi5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICBpZiAoZGlyRiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGlyRi5ta2RpcnMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICAgICAgZi5ta2RpcnMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChsZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9zID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZm9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbGVVdGlscy5zZXRGaWxlTGFzdE1vZGlmaWVkKGYsIGVudHJ5RGF0ZS5nZXRUaW1lKCkpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGV4cGFuZCB0byBmaWxlICIgKyBmLmdldFBhdGgoKSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKworICAgIH0KKyAgICAvLyBDaGVja1N0eWxlOlBhcmFtZXRlck51bWJlckNoZWNrIE9OCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gRmlsZSB3aWxsIGJlIHVuemlwcGVkIGludG8gdGhlCisgICAgICogZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGQgUGF0aCB0byB0aGUgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3QoRmlsZSBkKSB7CisgICAgICAgIHRoaXMuZGVzdCA9IGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIHRvIHppcC1maWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHMgUGF0aCB0byB6aXAtZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzKSB7CisgICAgICAgIHRoaXMuc291cmNlID0gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2Ugb3ZlcndyaXRlIGZpbGVzIGluIGRlc3QsIGV2ZW4gaWYgdGhleSBhcmUgbmV3ZXIgdGhhbgorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gdGhlIGFyY2hpdmU/CisgICAgICogQHBhcmFtIGIgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZShib29sZWFuIGIpIHsKKyAgICAgICAgb3ZlcndyaXRlID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwYXR0ZXJuc2V0LgorICAgICAqIEBwYXJhbSBzZXQgYSBwYXR0ZXJuIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBhdHRlcm5zZXQoUGF0dGVyblNldCBzZXQpIHsKKyAgICAgICAgcGF0dGVybnNldHMuYWRkRWxlbWVudChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbGVzZXQKKyAgICAgKiBAcGFyYW0gc2V0IGEgZmlsZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7CisgICAgICAgIGFkZChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHJjIGEgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgcmVzb3VyY2VzU3BlY2lmaWVkID0gdHJ1ZTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZChyYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgbWFwcGVyIHRvIG1hcCBzb3VyY2UgZW50cmllcyB0byBkZXN0aW5hdGlvbiBmaWxlcy4KKyAgICAgKiBAcmV0dXJuIGEgbWFwcGVyIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIG1vcmUgdGhhbiBvbmUgbWFwcGVyIGlzIGRlZmluZWQKKyAgICAgKiBAc2luY2UgQW50MS43CisgICAgICovCisgICAgcHVibGljIE1hcHBlciBjcmVhdGVNYXBwZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAobWFwcGVyRWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTVVMVElQTEVfTUFQUEVSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBtYXBwZXJFbGVtZW50ID0gbmV3IE1hcHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICByZXR1cm4gbWFwcGVyRWxlbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG5lc3RlZCBmaWxlbmFtZW1hcHBlcgorICAgICAqIEBwYXJhbSBmaWxlTmFtZU1hcHBlciB0aGUgbWFwcGVyIHRvIGFkZAorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZU5hbWVNYXBwZXIgZmlsZU5hbWVNYXBwZXIpIHsKKyAgICAgICAgY3JlYXRlTWFwcGVyKCkuYWRkKGZpbGVOYW1lTWFwcGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGVuY29kaW5nIHRvIGFzc3VtZSBmb3IgZmlsZSBuYW1lcyBhbmQgY29tbWVudHMuCisgICAgICoKKyAgICAgKiA8cD5TZXQgdG8gPGNvZGU+bmF0aXZlLWVuY29kaW5nPC9jb2RlPiBpZiB5b3Ugd2FudCB5b3VyCisgICAgICogcGxhdGZvcm0ncyBuYXRpdmUgZW5jb2RpbmcsIGRlZmF1bHRzIHRvIFVURjguPC9wPgorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgaWYgKE5BVElWRV9FTkNPRElORy5lcXVhbHMoZW5jb2RpbmcpKSB7CisgICAgICAgICAgICBlbmNvZGluZyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGZkMTlmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogU2V0cyBhIHRva2VuIGZpbHRlciB0aGF0IGlzIHVzZWQgYnkgdGhlIGZpbGUgY29weSB0YXNrcworICogdG8gZG8gdG9rZW4gc3Vic3RpdHV0aW9uLiBTZXRzIG11bHRpcGxlIHRva2VucyBieQorICogcmVhZGluZyB0aGVzZSBmcm9tIGEgZmlsZS4KKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKKyAqLworcHVibGljIGNsYXNzIEZpbHRlciBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgcHJpdmF0ZSBGaWxlIGZpbHRlcnNGaWxlOworCisgICAgLyoqCisgICAgICogVGhlIHRva2VuIHN0cmluZyB3aXRob3V0IEAgZGVsaW1pdGVycy4KKyAgICAgKiBAcGFyYW0gdG9rZW4gdG9rZW4gdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG9rZW4oU3RyaW5nIHRva2VuKSB7CisgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHRoYXQgc2hvdWxkIHJlcGxhY2UgdGhlIHRva2VuIGR1cmluZyBmaWx0ZXJlZCBjb3BpZXMuCisgICAgICogQHBhcmFtIHZhbHVlIHRva2VuIHJlcGxhY2UgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlIGZyb20gd2hpY2ggdGhlIGZpbHRlcnMgbXVzdCBiZSByZWFkLgorICAgICAqIFRoaXMgZmlsZSBtdXN0IGJlIGEgZm9ybWF0dGVkIGFzIGEgcHJvcGVydHkgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJzRmlsZSBmaWx0ZXIgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnNmaWxlKEZpbGUgZmlsdGVyc0ZpbGUpIHsKKyAgICAgICAgdGhpcy5maWx0ZXJzRmlsZSA9IGZpbHRlcnNGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHRhc2suCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGlzRmlsdGVyc0Zyb21GaWxlID0KKyAgICAgICAgICAgIGZpbHRlcnNGaWxlICE9IG51bGwgJiYgdG9rZW4gPT0gbnVsbCAmJiB2YWx1ZSA9PSBudWxsOworICAgICAgICBib29sZWFuIGlzU2luZ2xlRmlsdGVyID0KKyAgICAgICAgICAgIGZpbHRlcnNGaWxlID09IG51bGwgJiYgdG9rZW4gIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsOworCisgICAgICAgIGlmICghaXNGaWx0ZXJzRnJvbUZpbGUgJiYgIWlzU2luZ2xlRmlsdGVyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJvdGggdG9rZW4gYW5kIHZhbHVlIHBhcmFtZXRlcnMsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvbmx5IGEgZmlsdGVyc0ZpbGUgcGFyYW1ldGVyIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU2luZ2xlRmlsdGVyKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0R2xvYmFsRmlsdGVyU2V0KCkuYWRkRmlsdGVyKHRva2VuLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNGaWx0ZXJzRnJvbUZpbGUpIHsKKyAgICAgICAgICAgIHJlYWRGaWx0ZXJzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBmaWx0ZXJzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkRmlsdGVycygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiUmVhZGluZyBmaWx0ZXJzIGZyb20gIiArIGZpbHRlcnNGaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmdldEdsb2JhbEZpbHRlclNldCgpLnJlYWRGaWx0ZXJzRnJvbUZpbGUoZmlsdGVyc0ZpbGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpeENSTEYuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpeENSTEYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTEwZTRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRml4Q1JMRi5qYXZhCkBAIC0wLDAgKzEsNjg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkZpeENyTGZGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5DaGFpbmFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyQ2hhaW47CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBDb252ZXJ0cyB0ZXh0IHNvdXJjZSBmaWxlcyB0byBsb2NhbCBPUyBmb3JtYXR0aW5nIGNvbnZlbnRpb25zLCBhcworICogd2VsbCBhcyByZXBhaXIgdGV4dCBmaWxlcyBkYW1hZ2VkIGJ5IG1pc2NvbmZpZ3VyZWQgb3IgbWlzZ3VpZGVkIGVkaXRvcnMgb3IKKyAqIGZpbGUgdHJhbnNmZXIgcHJvZ3JhbXMuCisgKiA8cD4KKyAqIFRoaXMgdGFzayBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyAqIDx1bD4KKyAqIDxsaT5zcmNkaXIKKyAqIDxsaT5kZXN0ZGlyCisgKiA8bGk+aW5jbHVkZQorICogPGxpPmV4Y2x1ZGUKKyAqIDxsaT5jcgorICogPGxpPmVvbAorICogPGxpPnRhYgorICogPGxpPmVvZgorICogPGxpPmVuY29kaW5nCisgKiA8bGk+dGFyZ2V0ZW5jb2RpbmcKKyAqIDwvdWw+CisgKiBPZiB0aGVzZSBhcmd1bWVudHMsIG9ubHkgPGI+c291cmNlZGlyPC9iPiBpcyByZXF1aXJlZC4KKyAqIDxwPgorICogV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2NhbiB0aGUgc3JjZGlyIGJhc2VkIG9uIHRoZSBpbmNsdWRlCisgKiBhbmQgZXhjbHVkZSBwcm9wZXJ0aWVzLgorICogPHA+CisgKiBUaGlzIHZlcnNpb24gZ2VuZXJhbGlzZXMgdGhlIGhhbmRsaW5nIG9mIEVPTCBjaGFyYWN0ZXJzLCBhbmQgYWxsb3dzCisgKiBmb3IgQ1Itb25seSBsaW5lIGVuZGluZ3MgKHRoZSBzdGFuZGFyZCBvbiBNYWMgc3lzdGVtcyBwcmlvciB0byBPUyBYKS4KKyAqIFRhYiBoYW5kbGluZyBoYXMgYWxzbyBiZWVuIGdlbmVyYWxpc2VkIHRvIGFjY29tbW9kYXRlIGFueSB0YWJ3aWR0aAorICogZnJvbSAyIHRvIDgwLCBpbmNsdXNpdmUuICBJbXBvcnRhbnRseSwgaXQgd2lsbCBsZWF2ZSB1bnRvdWNoZWQgYW55CisgKiBsaXRlcmFsIFRBQiBjaGFyYWN0ZXJzIGVtYmVkZGVkIHdpdGhpbiBzdHJpbmcgb3IgY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAqIDxwPgorICogPGVtPldhcm5pbmc6PC9lbT4gZG8gbm90IHJ1biBvbiBiaW5hcnkgZmlsZXMuCisgKiA8ZW0+Q2F1dGlvbjo8L2VtPiBydW4gd2l0aCBjYXJlIG9uIGNhcmVmdWxseSBmb3JtYXR0ZWQgZmlsZXMuCisgKiBUaGlzIG1heSBzb3VuZCBvYnZpb3VzLCBidXQgaWYgeW91IGRvbid0IHNwZWNpZnkgYXNpcywgcHJlc3VtZSB0aGF0CisgKiB5b3VyIGZpbGVzIGFyZSBnb2luZyB0byBiZSBtb2RpZmllZC4gIElmICJ0YWJzIiBpcyAiYWRkIiBvciAicmVtb3ZlIiwKKyAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBtYXkgYmUgYWRkZWQgb3IgcmVtb3ZlZCBhcyBuZWNlc3NhcnkuICBTaW1pbGFybHksCisgKiBmb3IgQ1IncyAtIGluIGZhY3QgImVvbCI9ImNybGYiIG9yIGNyPSJhZGQiIGNhbiByZXN1bHQgaW4gY3IKKyAqIGNoYXJhY3RlcnMgYmVpbmcgcmVtb3ZlZCBpbiBvbmUgc3BlY2lhbCBjYXNlIGFjY29tbW9kYXRlZCwgaS5lLiwKKyAqIENSQ1JMRiBpcyByZWdhcmRlZCBhcyBhIHNpbmdsZSBFT0wgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIG90aGVyCisgKiBwcm9ncmFtcyBoYXZlIGNvbnZlcnRlZCBDUkxGIGludG8gQ1JDUkxGLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgorICovCisKK3B1YmxpYyBjbGFzcyBGaXhDUkxGIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIGltcGxlbWVudHMgQ2hhaW5hYmxlUmVhZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSVhDUkxGX0VSUk9SID0gIjxmaXhjcmxmPiBlcnJvcjogIjsKKyAgICAvKiogZXJyb3Igc3RyaW5nIGZvciB1c2luZyBzcmNkaXIgYW5kIGZpbGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9GSUxFX0FORF9TUkNESVIKKyAgICAgICAgPSBGSVhDUkxGX0VSUk9SICsgInNyY2RpciBhbmQgZmlsZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJpdmF0ZSBib29sZWFuIHByZXNlcnZlTGFzdE1vZGlmaWVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBGaWxlIHNyY0RpcjsKKyAgICBwcml2YXRlIEZpbGUgZGVzdERpciA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlIGZpbGU7CisgICAgcHJpdmF0ZSBGaXhDckxmRmlsdGVyIGZpbHRlciA9IG5ldyBGaXhDckxmRmlsdGVyKCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgZmN2ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEVuY29kaW5nIHRvIGFzc3VtZSBmb3IgdGhlIGZpbGVzCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworCisgICAgLyoqCisgICAgICogRW5jb2RpbmcgdG8gdXNlIGZvciBvdXRwdXQgZmlsZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRFbmNvZGluZyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENoYWluIHRoaXMgdGFzayBhcyBhIHJlYWRlci4KKyAgICAgKiBAcGFyYW0gcmRyIFJlYWRlciB0byBjaGFpbi4KKyAgICAgKiBAcmV0dXJuIGEgUmVhZGVyLgorICAgICAqIEBzaW5jZSBBbnQgMS43PworICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZWFkZXIgY2hhaW4oZmluYWwgUmVhZGVyIHJkcikgeworICAgICAgICByZXR1cm4gZmlsdGVyLmNoYWluKHJkcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2UgZGlyIHRvIGZpbmQgdGhlIHNvdXJjZSB0ZXh0IGZpbGVzLgorICAgICAqIEBwYXJhbSBzcmNEaXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjZGlyKEZpbGUgc3JjRGlyKSB7CisgICAgICAgIHRoaXMuc3JjRGlyID0gc3JjRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gd2hlcmUgdGhlIGZpeGVkIGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogRGVmYXVsdCBpcyB0byByZXBsYWNlIHRoZSBvcmlnaW5hbCBmaWxlLgorICAgICAqIEBwYXJhbSBkZXN0RGlyIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdG8gdHJ1ZSBpZiBtb2RpZnlpbmcgSmF2YSBzb3VyY2UgZmlsZXMuCisgICAgICogQHBhcmFtIGphdmFmaWxlcyB3aGV0aGVyIG1vZGlmeWluZyBKYXZhIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEphdmFmaWxlcyhib29sZWFuIGphdmFmaWxlcykgeworICAgICAgICBmaWx0ZXIuc2V0SmF2YWZpbGVzKGphdmFmaWxlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgc2luZ2xlIGZpbGUgdG8gY29udmVydC4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gY29udmVydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgaG93IEVuZE9mTGluZSBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHIgdmFsaWQgdmFsdWVzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YXNpczogbGVhdmUgbGluZSBlbmRpbmdzIGFsb25lCisgICAgICogPGxpPmNyOiBjb252ZXJ0IGxpbmUgZW5kaW5ncyB0byBDUgorICAgICAqIDxsaT5sZjogY29udmVydCBsaW5lIGVuZGluZ3MgdG8gTEYKKyAgICAgKiA8bGk+Y3JsZjogY29udmVydCBsaW5lIGVuZGluZ3MgdG8gQ1JMRgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW9sKENyTGYgYXR0cikgeworICAgICAgICBmaWx0ZXIuc2V0RW9sKEZpeENyTGZGaWx0ZXIuQ3JMZi5uZXdJbnN0YW5jZShhdHRyLmdldFZhbHVlKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IGhvdyBjYXJyaWFnZSByZXR1cm4gKENSKSBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHIgdmFsaWQgdmFsdWVzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YWRkOiBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhIENSIGJlZm9yZSBldmVyeSBMRgorICAgICAqIDxsaT5hc2lzOiBsZWF2ZSBDUiBjaGFyYWN0ZXJzIGFsb25lCisgICAgICogPGxpPnJlbW92ZTogcmVtb3ZlIGFsbCBDUiBjaGFyYWN0ZXJzCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNC54LgorICAgICAqICAgICAgICAgICAgIFVzZSB7QGxpbmsgI3NldEVvbCBzZXRFb2x9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3IoQWRkQXNpc1JlbW92ZSBhdHRyKSB7CisgICAgICAgIGxvZygiREVQUkVDQVRFRDogVGhlIGNyIGF0dHJpYnV0ZSBoYXMgYmVlbiBkZXByZWNhdGVkLCIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgbG9nKCJQbGVhc2UgdXNlIHRoZSBlb2wgYXR0cmlidXRlIGluc3RlYWQiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgU3RyaW5nIG9wdGlvbiA9IGF0dHIuZ2V0VmFsdWUoKTsKKyAgICAgICAgQ3JMZiBjID0gbmV3IENyTGYoKTsKKyAgICAgICAgaWYgKG9wdGlvbi5lcXVhbHMoInJlbW92ZSIpKSB7CisgICAgICAgICAgICBjLnNldFZhbHVlKCJsZiIpOworICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoImFzaXMiKSkgeworICAgICAgICAgICAgYy5zZXRWYWx1ZSgiYXNpcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbXVzdCBiZSAiYWRkIgorICAgICAgICAgICAgYy5zZXRWYWx1ZSgiY3JsZiIpOworICAgICAgICB9CisgICAgICAgIHNldEVvbChjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IGhvdyB0YWIgY2hhcmFjdGVycyBhcmUgdG8gYmUgaGFuZGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyIHZhbGlkIHZhbHVlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmFkZDogY29udmVydCBzZXF1ZW5jZXMgb2Ygc3BhY2VzIHdoaWNoIHNwYW4gYSB0YWIgc3RvcCB0byB0YWJzCisgICAgICogPGxpPmFzaXM6IGxlYXZlIHRhYiBhbmQgc3BhY2UgY2hhcmFjdGVycyBhbG9uZQorICAgICAqIDxsaT5yZW1vdmU6IGNvbnZlcnQgdGFicyB0byBzcGFjZXMKKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhYihBZGRBc2lzUmVtb3ZlIGF0dHIpIHsKKyAgICAgICAgZmlsdGVyLnNldFRhYihGaXhDckxmRmlsdGVyLkFkZEFzaXNSZW1vdmUubmV3SW5zdGFuY2UoYXR0ci5nZXRWYWx1ZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0YWIgbGVuZ3RoIGluIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGxlbmd0aCBzcGVjaWZ5IHRoZSBsZW5ndGggb2YgdGFiIGluIHNwYWNlcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlbmd0aChpbnQgdGxlbmd0aCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbHRlci5zZXRUYWJsZW5ndGgodGxlbmd0aCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgaG93IERPUyBFT0YgKGNvbnRyb2wteikgY2hhcmFjdGVycyBhcmUgdG8gYmUgaGFuZGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyIHZhbGlkIHZhbHVlczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmFkZDogZW5zdXJlIHRoYXQgdGhlcmUgaXMgYW4gZW9mIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKKyAgICAgKiA8bGk+YXNpczogbGVhdmUgZW9mIGNoYXJhY3RlcnMgYWxvbmUKKyAgICAgKiA8bGk+cmVtb3ZlOiByZW1vdmUgYW55IGVvZiBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZAorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW9mKEFkZEFzaXNSZW1vdmUgYXR0cikgeworICAgICAgICBmaWx0ZXIuc2V0RW9mKEZpeENyTGZGaWx0ZXIuQWRkQXNpc1JlbW92ZS5uZXdJbnN0YW5jZShhdHRyLmdldFZhbHVlKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGVuY29kaW5nIEFudCBleHBlY3RzIHRoZSBmaWxlcyB0byBiZQorICAgICAqIGluLS1kZWZhdWx0cyB0byB0aGUgcGxhdGZvcm1zIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICogQHBhcmFtIGVuY29kaW5nIFN0cmluZyBlbmNvZGluZyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBlbmNvZGluZyB0aGF0IHRoZSBmaWxlcyBhcmUKKyAgICAgKiB0byBiZSB3cml0dGVuIGluLS1zYW1lIGFzIGlucHV0IGVuY29kaW5nIGJ5IGRlZmF1bHQuCisgICAgICogQHBhcmFtIG91dHB1dEVuY29kaW5nIFN0cmluZyBvdXRwdXRFbmNvZGluZyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEVuY29kaW5nKFN0cmluZyBvdXRwdXRFbmNvZGluZykgeworICAgICAgICB0aGlzLm91dHB1dEVuY29kaW5nID0gb3V0cHV0RW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmeSB3aGV0aGVyIGEgbWlzc2luZyBFT0wgd2lsbCBiZSBhZGRlZAorICAgICAqIHRvIHRoZSBmaW5hbCBsaW5lIG9mIGEgZmlsZS4KKyAgICAgKiBAcGFyYW0gZml4bGFzdCB3aGV0aGVyIHRvIGZpeCB0aGUgbGFzdCBsaW5lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpeGxhc3QoYm9vbGVhbiBmaXhsYXN0KSB7CisgICAgICAgIGZpbHRlci5zZXRGaXhsYXN0KGZpeGxhc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIHByZXNlcnZlIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgYXMgdGhlIG9yaWdpbmFsIGZpbGVzLgorICAgICAqIEBwYXJhbSBwcmVzZXJ2ZSB0cnVlIGlmIHRpbWVzdGFtcHMgc2hvdWxkIGJlIHByZXNlcnZlZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlc2VydmVMYXN0TW9kaWZpZWQoYm9vbGVhbiBwcmVzZXJ2ZSkgeworICAgICAgICBwcmVzZXJ2ZUxhc3RNb2RpZmllZCA9IHByZXNlcnZlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgc3JjZGlyIGFuZCBkZXN0ZGlyCisgICAgICAgIHZhbGlkYXRlKCk7CisKKyAgICAgICAgLy8gbG9nIG9wdGlvbnMgdXNlZAorICAgICAgICBTdHJpbmcgZW5jID0gZW5jb2RpbmcgPT0gbnVsbCA/ICJkZWZhdWx0IiA6IGVuY29kaW5nOworICAgICAgICBsb2coIm9wdGlvbnM6IgorICAgICAgICAgICAgKyAiIGVvbD0iICsgZmlsdGVyLmdldEVvbCgpLmdldFZhbHVlKCkKKyAgICAgICAgICAgICsgIiB0YWI9IiArIGZpbHRlci5nZXRUYWIoKS5nZXRWYWx1ZSgpCisgICAgICAgICAgICArICIgZW9mPSIgKyBmaWx0ZXIuZ2V0RW9mKCkuZ2V0VmFsdWUoKQorICAgICAgICAgICAgKyAiIHRhYmxlbmd0aD0iICsgZmlsdGVyLmdldFRhYmxlbmd0aCgpCisgICAgICAgICAgICArICIgZW5jb2Rpbmc9IiArIGVuYworICAgICAgICAgICAgKyAiIG91dHB1dGVuY29kaW5nPSIKKyAgICAgICAgICAgICsgKG91dHB1dEVuY29kaW5nID09IG51bGwgPyBlbmMgOiBvdXRwdXRFbmNvZGluZyksCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihzcmNEaXIpOworICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBwcm9jZXNzRmlsZShmaWxlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoc3JjRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfRklMRV9BTkRfU1JDRElSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vcGF0Y2ggZmlsZSBpbnRvIHRoZSBmaWxlc2V0CisgICAgICAgICAgICBmaWxlc2V0LnNldEZpbGUoZmlsZSk7CisgICAgICAgICAgICAvL3NldCBvdXIgcGFyZW50IGRpcgorICAgICAgICAgICAgc3JjRGlyID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgRklYQ1JMRl9FUlJPUiArICJzcmNkaXIgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgICAgICB9CisgICAgICAgIGlmICghc3JjRGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgRklYQ1JMRl9FUlJPUiArICJzcmNkaXIgZG9lcyBub3QgZXhpc3Q6ICciICsgc3JjRGlyICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNyY0Rpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgRklYQ1JMRl9FUlJPUiArICJzcmNkaXIgaXMgbm90IGEgZGlyZWN0b3J5OiAnIiArIHNyY0RpciArICInIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3REaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFkZXN0RGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBGSVhDUkxGX0VSUk9SICsgImRlc3RkaXIgZG9lcyBub3QgZXhpc3Q6ICciCisgICAgICAgICAgICAgICAgICAgICsgZGVzdERpciArICInIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgRklYQ1JMRl9FUlJPUiArICJkZXN0ZGlyIGlzIG5vdCBhIGRpcmVjdG9yeTogJyIKKyAgICAgICAgICAgICAgICAgICAgKyBkZXN0RGlyICsgIiciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmlsZShTdHJpbmcgZmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCBmaWxlKTsKKyAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBzcmNGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICBGaWxlIGRlc3REID0gZGVzdERpciA9PSBudWxsID8gc3JjRGlyIDogZGVzdERpcjsKKworICAgICAgICBpZiAoZmN2ID09IG51bGwpIHsKKyAgICAgICAgICAgIEZpbHRlckNoYWluIGZjID0gbmV3IEZpbHRlckNoYWluKCk7CisgICAgICAgICAgICBmYy5hZGQoZmlsdGVyKTsKKyAgICAgICAgICAgIGZjdiA9IG5ldyBWZWN0b3IoMSk7CisgICAgICAgICAgICBmY3YuYWRkKGZjKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIHRtcEZpbGUgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKCJmaXhjcmxmIiwgIiIsIG51bGwsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZJTEVfVVRJTFMuY29weUZpbGUoc3JjRmlsZSwgdG1wRmlsZSwgbnVsbCwgZmN2LCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgZW5jb2RpbmcsIG91dHB1dEVuY29kaW5nID09IG51bGwgPyBlbmNvZGluZyA6IG91dHB1dEVuY29kaW5nLAorICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSk7CisKKyAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RCwgZmlsZSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gZGVzdElzV3JvbmcgPSB0cnVlOworICAgICAgICAgICAgaWYgKGRlc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgZGVzdGluYXRpb24gd2l0aCB0aGUgdGVtcCBmaWxlCisgICAgICAgICAgICAgICAgbG9nKCJkZXN0RmlsZSBleGlzdHMiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgZGVzdElzV3JvbmcgPSAhRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGRlc3RGaWxlLCB0bXBGaWxlKTsKKyAgICAgICAgICAgICAgICBsb2coZGVzdEZpbGUgKyAoZGVzdElzV3JvbmcgPyAiIGlzIGJlaW5nIHdyaXR0ZW4iCisgICAgICAgICAgICAgICAgICAgIDogIiBpcyBub3Qgd3JpdHRlbiwgYXMgdGhlIGNvbnRlbnRzIGFyZSBpZGVudGljYWwiKSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlc3RJc1dyb25nKSB7CisgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZW5hbWUodG1wRmlsZSwgZGVzdEZpbGUpOworICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxhc3RNb2RpZmllZCkgeworICAgICAgICAgICAgICAgICAgICBsb2coInByZXNlcnZlZCBsYXN0TW9kaWZpZWQiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMuc2V0RmlsZUxhc3RNb2RpZmllZChkZXN0RmlsZSwgbGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wRmlsZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlcHJlY2F0ZWQsIHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIG1vdmVkIHRvIGZpbHRlcnMuRml4Q3JMZkZpbHRlci4KKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjcuMC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgT25lTGluZXIgaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTkRFRiA9IC0xOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USkFWQSA9IDA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT09LSU5HID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOQlVGTEVOID0gODE5MjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTkVCVUZMRU4gPSAyMDA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ1RSTFogPSAnXHUwMDFBJzsKKworICAgICAgICBwcml2YXRlIGludCBzdGF0ZSA9IGZpbHRlci5nZXRKYXZhZmlsZXMoKSA/IExPT0tJTkcgOiBOT1RKQVZBOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGVvbFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoTElORUJVRkxFTik7CisgICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGVvZlN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlYWNoZWRFb2YgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBGaWxlIHNyY0ZpbGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yLgorICAgICAgICAgKiBAcGFyYW0gc3JjRmlsZSB0aGUgZmlsZSB0byByZWFkLgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9uZUxpbmVyKEZpbGUgc3JjRmlsZSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLnNyY0ZpbGUgPSBzcmNGaWxlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICgoZW5jb2RpbmcgPT0gbnVsbCkgPyBuZXcgRmlsZVJlYWRlcihzcmNGaWxlKQorICAgICAgICAgICAgICAgICAgICA6IG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKSwgZW5jb2RpbmcpKSwgSU5CVUZMRU4pOworCisgICAgICAgICAgICAgICAgbmV4dExpbmUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oc3JjRmlsZSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTW92ZSB0byB0aGUgbmV4dCBsaW5lLgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgbmV4dExpbmUoKQorICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBjaCA9IC0xOworICAgICAgICAgICAgaW50IGVvbGNvdW50ID0gMDsKKworICAgICAgICAgICAgZW9sU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgbGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaCA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNoICE9IC0xICYmIGNoICE9ICdccicgJiYgY2ggIT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCgoY2hhcikgY2gpOworICAgICAgICAgICAgICAgICAgICBjaCA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNoID09IC0xICYmIGxpbmUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBFb2YgaGFzIGJlZW4gcmVhY2hlZAorICAgICAgICAgICAgICAgICAgICByZWFjaGVkRW9mID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoKGNoYXIpIGNoKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgXHIsIFxyXG4gYW5kIFxyXHJcbgorICAgICAgICAgICAgICAgICAgICAvLyBSZWdhcmQgXHJcciBub3QgZm9sbG93ZWQgYnkgXG4gYXMgdHdvIGxpbmVzCisgICAgICAgICAgICAgICAgICAgICsrZW9sY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGVvbFN0ci5hcHBlbmQoJ1xyJyk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5tYXJrKDIpOworICAgICAgICAgICAgICAgICAgICBjaCA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjaGFyKSAoY2gpID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2xjb3VudCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvbFN0ci5hcHBlbmQoIlxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgKytlb2xjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVvbFN0ci5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlcG9zaXRpb24gd2hlbiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgb2Ygc3dpdGNoICgoY2hhcikoY2ggPSByZWFkZXIucmVhZCgpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgICAgICsrZW9sY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGVvbFN0ci5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIEZhbGwgdHJ1CisgICAgICAgICAgICAgICAgfSAvLyBlbmQgb2Ygc3dpdGNoICgoY2hhcikgY2gpCisKKyAgICAgICAgICAgICAgICAvLyBpZiBhdCBlb2xjb3VudCA9PSAwIGFuZCB0cmFpbGluZyBjaGFyYWN0ZXJzIG9mIHN0cmluZworICAgICAgICAgICAgICAgIC8vIGFyZSBDVFJMLVpzLCBzZXQgZW9mU3RyCisgICAgICAgICAgICAgICAgaWYgKGVvbGNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBsaW5lLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1pID49IDAgJiYgbGluZS5jaGFyQXQoaSkgPT0gQ1RSTFopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgc2VhcmNoaW5nIGZvciB0aGUgZmlyc3QgXloKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxpbmUubGVuZ3RoKCkgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFpbGluZyBjaGFyYWN0ZXJzIGFyZSBeWnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBuZXcgbGluZSBhbmQgZW9mU3RyCisgICAgICAgICAgICAgICAgICAgICAgICBlb2ZTdHIuYXBwZW5kKGxpbmUudG9TdHJpbmcoKS5zdWJzdHJpbmcoaSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc2V0TGVuZ3RoKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoZWRFb2YgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnNldExlbmd0aChpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gLy8gZW5kIG9mIGlmIChlb2xjb3VudCA9PSAwKQorCisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHNyY0ZpbGUgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGdldCB0aGUgZW9mIHN0cmluZy4KKyAgICAgICAgICogQHJldHVybiB0aGUgZW9mIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW9mU3RyKCkgeworICAgICAgICAgICAgcmV0dXJuIGVvZlN0ci5zdWJzdHJpbmcoMCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogZ2V0IHRoZSBzdGF0ZS4KKyAgICAgICAgICogQHJldHVybiB0aGUgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldFN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgc3RhdGUuCisgICAgICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3RhdGUoaW50IHN0YXRlKSB7CisgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG1vcmUgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gIXJlYWNoZWRFb2Y7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogZ2V0IHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5leHQgZWxlbWVudC4KKyAgICAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIG1vcmUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICghaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiT25lTGluZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJ1ZmZlckxpbmUgdG1wTGluZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJMaW5lKGxpbmUudG9TdHJpbmcoKSwgZW9sU3RyLnN1YnN0cmluZygwKSk7CisgICAgICAgICAgICBuZXh0TGluZSgpOworICAgICAgICAgICAgcmV0dXJuIHRtcExpbmU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhlIHJlYWRlci4KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQnVmZmVyTGluZSB7CisgICAgICAgICAgICBwcml2YXRlIGludCBuZXh0ID0gMDsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGNvbHVtbiA9IDA7CisgICAgICAgICAgICBwcml2YXRlIGludCBsb29rYWhlYWQgPSBVTkRFRjsKKyAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIGxpbmU7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBlb2xTdHI7CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWZmZXJMaW5lKFN0cmluZyBsaW5lLCBTdHJpbmcgZW9sU3RyKQorICAgICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgbmV4dCA9IDA7CisgICAgICAgICAgICAgICAgY29sdW1uID0gMDsKKyAgICAgICAgICAgICAgICB0aGlzLmxpbmUgPSBsaW5lOworICAgICAgICAgICAgICAgIHRoaXMuZW9sU3RyID0gZW9sU3RyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldE5leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHQoaW50IG5leHQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldExvb2thaGVhZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9va2FoZWFkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb29rYWhlYWQoaW50IGxvb2thaGVhZCkgeworICAgICAgICAgICAgICAgIHRoaXMubG9va2FoZWFkID0gbG9va2FoZWFkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgY2hhciBnZXRDaGFyKGludCBpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUuY2hhckF0KGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgY2hhciBnZXROZXh0Q2hhcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hhcihuZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGNoYXIgZ2V0TmV4dENoYXJJbmMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldENoYXIobmV4dCsrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uKGludCBjb2wpIHsKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBjb2w7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgaW5jQ29sdW1uKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBsZW5ndGgoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0RW9sTGVuZ3RoKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBlb2xTdHIubGVuZ3RoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluZVN0cmluZygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRFb2woKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVvbFN0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBzdWJzdHJpbmcoaW50IGJlZ2luKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKGJlZ2luKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBzdWJzdHJpbmcoaW50IGJlZ2luLCBpbnQgZW5kKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKGJlZ2luLCBlbmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZShpbnQgc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBPbmVMaW5lci50aGlzLnNldFN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBnZXRTdGF0ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT25lTGluZXIudGhpcy5nZXRTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWVzICJhc2lzIiwgImFkZCIgYW5kICJyZW1vdmUiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWRkQXNpc1JlbW92ZSBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJhZGQiLCAiYXNpcyIsICJyZW1vdmUifTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZWQgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlcyAiYXNpcyIsICJjciIsICJsZiIgYW5kICJjcmxmIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENyTGYgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgRW51bWVyYXRlZEF0dHJpYnV0ZSNnZXRWYWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImFzaXMiLCAiY3IiLCAibGYiLCAiY3JsZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFjIiwgInVuaXgiLCAiZG9zIn07CisgICAgICAgIH0KKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1VuemlwLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HVW56aXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGU3MGNjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1VuemlwLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBFeHBhbmRzIGEgZmlsZSB0aGF0IGhhcyBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgR1pJUAorICogYWxnb3JpdGhtLiBOb3JtYWxseSB1c2VkIHRvIGNvbXByZXNzIG5vbi1jb21wcmVzc2VkIGFyY2hpdmVzIHN1Y2gKKyAqIGFzIFRBUiBmaWxlcy4KKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0icGFja2FnaW5nIgorICovCisKK3B1YmxpYyBjbGFzcyBHVW56aXAgZXh0ZW5kcyBVbnBhY2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDggKiAxMDI0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYVEVOU0lPTiA9ICIuZ3oiOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZWZhdWx0IGV4dGVuc2lvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSAiLmd6IgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEV4dGVuc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfRVhURU5TSU9OOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgZ3VuemlwcGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0KCkgeworICAgICAgICBpZiAoc291cmNlLmxhc3RNb2RpZmllZCgpID4gZGVzdC5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgbG9nKCJFeHBhbmRpbmcgIiArIHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXN0LmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworICAgICAgICAgICAgR1pJUElucHV0U3RyZWFtIHpJbiA9IG51bGw7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKKyAgICAgICAgICAgICAgICBmaXMgPSBzcmNSZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIHpJbiA9IG5ldyBHWklQSW5wdXRTdHJlYW0oZmlzKTsKKyAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gekluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAtMSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2JsZW0gZXhwYW5kaW5nIGd6aXAgIiArIGlvZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGZpcyk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHpJbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdGFzayBjYW4gZGVhbCB3aXRoIG5vbi1maWxlIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIG9ubHkgaWYgdGhpcyB0YXNrIGlzCisgICAgICogJmx0O2d1bnppcCZndDsuICBBbnkgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcyB0aGF0IGFsc28gd2FudHMgdG8KKyAgICAgKiBzdXBwb3J0IG5vbi1maWxlIHJlc291cmNlcyBuZWVkcyB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4gIFdlCisgICAgICogbmVlZCB0byBkbyBzbyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucyBzaW5jZSB3ZQorICAgICAqIGNhbid0IGV4cGVjdCBzdWJjbGFzc2VzIHRvIHN1cHBvcnQgcmVzb3VyY2VzLjwvcD4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0YXNrIHN1cHBvcnRzIG5vbiBmaWxlIHJlc291cmNlcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzTm9uRmlsZVJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZXF1YWxzKEdVbnppcC5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1ppcC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1ppcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDJiMjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HWmlwLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIENvbXByZXNzZXMgYSBmaWxlIHdpdGggdGhlIEdaSVAgYWxnb3JpdGhtLiBOb3JtYWxseSB1c2VkIHRvIGNvbXByZXNzCisgKiBub24tY29tcHJlc3NlZCBhcmNoaXZlcyBzdWNoIGFzIFRBUiBmaWxlcy4KKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0icGFja2FnaW5nIgorICovCisKK3B1YmxpYyBjbGFzcyBHWmlwIGV4dGVuZHMgUGFjayB7CisgICAgLyoqCisgICAgICogcGVyZm9ybSB0aGUgR1ppcCBjb21wcmVzc2lvbiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGFjaygpIHsKKyAgICAgICAgR1pJUE91dHB1dFN0cmVhbSB6T3V0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHpPdXQgPSBuZXcgR1pJUE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh6aXBGaWxlKSk7CisgICAgICAgICAgICB6aXBSZXNvdXJjZShnZXRTcmNSZXNvdXJjZSgpLCB6T3V0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2JsZW0gY3JlYXRpbmcgZ3ppcCAiICsgaW9lLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uoek91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdGFzayBjYW4gZGVhbCB3aXRoIG5vbi1maWxlIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIG9ubHkgaWYgdGhpcyB0YXNrIGlzCisgICAgICogJmx0O2d6aXAmZ3Q7LiAgQW55IHN1YmNsYXNzIG9mIHRoaXMgY2xhc3MgdGhhdCBhbHNvIHdhbnRzIHRvCisgICAgICogc3VwcG9ydCBub24tZmlsZSByZXNvdXJjZXMgbmVlZHMgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuICBXZQorICAgICAqIG5lZWQgdG8gZG8gc28gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMgc2luY2Ugd2UKKyAgICAgKiBjYW4ndCBleHBlY3Qgc3ViY2xhc3NlcyB0byBzdXBwb3J0IHJlc291cmNlcy48L3A+CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FzZSBzdXBwb3J0cyBub24gZmlsZSByZXNvdXJjZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c05vbkZpbGVSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmVxdWFscyhHWmlwLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HZW5lcmF0ZUtleS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2VuZXJhdGVLZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjI0OTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2VuZXJhdGVLZXkuamF2YQpAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CisKKy8qKgorICogR2VuZXJhdGVzIGEga2V5IGluIGEga2V5c3RvcmUuCisgKgorICogQHNpbmNlIEFudCAxLjIKKyAqCisgKiBAYW50LnRhc2sgbmFtZT0iZ2Vua2V5IiBjYXRlZ29yeT0iamF2YSIKKyAqLworcHVibGljIGNsYXNzIEdlbmVyYXRlS2V5IGV4dGVuZHMgVGFzayB7CisKKyAgICAvKioKKyAgICAgKiBBIERpc3Rpbmd1aXNoZWROYW1lIHBhcmFtZXRlci4KKyAgICAgKiBUaGlzIGlzIGEgbmVzdGVkIGVsZW1lbnQgaW4gYSBkbmFtZSBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERuYW1lUGFyYW0geworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBuYW1lIGF0dHJpYnV0ZS4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbmFtZSBhdHRyaWJ1dGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgZG5hbWUgbmVzdGVkIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEaXN0aW5ndWlzaGVkTmFtZSB7CisgICAgICAgIHByaXZhdGUgVmVjdG9yIHBhcmFtcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgcGFyYW0gbmVzdGVkIGVsZW1lbnQuCisgICAgICAgICAqIEByZXR1cm4gYSBEbmFtZVBhcmFtIG9iamVjdCB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVQYXJhbSgpIHsKKyAgICAgICAgICAgIERuYW1lUGFyYW0gcGFyYW0gPSBuZXcgRG5hbWVQYXJhbSgpOworICAgICAgICAgICAgcGFyYW1zLmFkZEVsZW1lbnQocGFyYW0pOworCisgICAgICAgICAgICByZXR1cm4gcGFyYW07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBuZXN0ZWQgcGFyYW1ldGVycy4KKyAgICAgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmVzdGVkIHBhcmFtZXRlcnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1zKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy5lbGVtZW50cygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdlbmVyYXRlIGEgc3RyaW5nIHJlcCBvZiB0aGlzIGRpc3Rpbmd1aXNoZWQgbmFtZS4KKyAgICAgICAgICogVGhlIGZvcm1hdCBpcyBlYWNoIG9mIHRoZSBwYXJhbWV0ZXJzIChuYW1lID0gdmFsdWUpCisgICAgICAgICAqIHNlcGFyYXRlZCBieSAnLCcuCisgICAgICAgICAqIFRoaXMgaXMgdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcCBvZiB0aGlzIG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0UGFzcyA9IHRydWU7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFBhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaXJzdFBhc3MgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGZpbmFsIERuYW1lUGFyYW0gcGFyYW0gPSAoRG5hbWVQYXJhbSkgcGFyYW1zLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZW5jb2RlKHBhcmFtLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnPScpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChlbmNvZGUocGFyYW0uZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFbmNvZGUgYSBuYW1lIG9yIHZhbHVlLgorICAgICAgICAgKiBUaGUgZW5jb2RlZCByZXN1bHQgaXMgdGhlIHNhbWUgYXMgdGhlIGlucHV0IHN0cmluZworICAgICAgICAgKiBleGNlcHQgdGhhdCBlYWNoICcsJyBpcyByZXBsYWNlZCBieSBhICdcLCcuCisgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHZhbHVlIHRvIGJlIGVuY29kZWQKKyAgICAgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlKGZpbmFsIFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgICAgIGludCBlbmQgPSBzdHJpbmcuaW5kZXhPZignLCcpOworCisgICAgICAgICAgICBpZiAoLTEgPT0gZW5kKSB7CisgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKC0xICE9IGVuZCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcLCIpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKKyAgICAgICAgICAgICAgICBlbmQgPSBzdHJpbmcuaW5kZXhPZignLCcsIHN0YXJ0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoc3RhcnQpKTsKKworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgLyoqCisgICAgICogVGhlIGFsaWFzIG9mIHNpZ25lci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFsaWFzOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2Yga2V5c3RvcmUgZmlsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleXN0b3JlOworICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcmVwYXNzOworICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcmV0eXBlOworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5cGFzczsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgc2lnYWxnOworICAgIHByb3RlY3RlZCBTdHJpbmcga2V5YWxnOworICAgIHByb3RlY3RlZCBTdHJpbmcgZG5hbWU7CisgICAgcHJvdGVjdGVkIERpc3Rpbmd1aXNoZWROYW1lIGV4cGFuZGVkRG5hbWU7CisgICAgcHJvdGVjdGVkIGludCBrZXlzaXplOworICAgIHByb3RlY3RlZCBpbnQgdmFsaWRpdHk7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZTsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogRGlzdGluZ3Vpc2hlZCBuYW1lIGxpc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3Rpbmd1aXNoZWQgbmFtZSBjb250YWluZXIuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBJZiBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2Ugb3IgZG5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpcyB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBEaXN0aW5ndWlzaGVkTmFtZSBjcmVhdGVEbmFtZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsICE9IGV4cGFuZGVkRG5hbWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRE5hbWUgc3ViLWVsZW1lbnQgY2FuIG9ubHkgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNwZWNpZmllZCBvbmNlLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IGRuYW1lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBzcGVjaWZ5IGRuYW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBib3RoIGFzIGF0dHJpYnV0ZSBhbmQgZWxlbWVudC4iKTsKKyAgICAgICAgfQorICAgICAgICBleHBhbmRlZERuYW1lID0gbmV3IERpc3Rpbmd1aXNoZWROYW1lKCk7CisgICAgICAgIHJldHVybiBleHBhbmRlZERuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkaXN0aW5ndWlzaGVkIG5hbWUgZm9yIGVudGl0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkbmFtZSBkaXN0aW5ndWlzaGVkIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREbmFtZShmaW5hbCBTdHJpbmcgZG5hbWUpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gZXhwYW5kZWREbmFtZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJdCBpcyBub3QgcG9zc2libGUgdG8gc3BlY2lmeSBkbmFtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYm90aCBhcyBhdHRyaWJ1dGUgYW5kIGVsZW1lbnQuIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5kbmFtZSA9IGRuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbGlhcyB0byBhZGQgdW5kZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgYWxpYXMgdG8gYWRkIHVuZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxpYXMoZmluYWwgU3RyaW5nIGFsaWFzKSB7CisgICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBLZXlzdG9yZSBsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlzdG9yZSBsb2NhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleXN0b3JlKGZpbmFsIFN0cmluZyBrZXlzdG9yZSkgeworICAgICAgICB0aGlzLmtleXN0b3JlID0ga2V5c3RvcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzc3dvcmQgZm9yIGtleXN0b3JlIGludGVncml0eS4KKyAgICAgKiBNdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyBsb25nLgorICAgICAqIEBwYXJhbSBzdG9yZXBhc3MgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdG9yZXBhc3MoZmluYWwgU3RyaW5nIHN0b3JlcGFzcykgeworICAgICAgICB0aGlzLnN0b3JlcGFzcyA9IHN0b3JlcGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBLZXlzdG9yZSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0b3JldHlwZSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcmV0eXBlKGZpbmFsIFN0cmluZyBzdG9yZXR5cGUpIHsKKyAgICAgICAgdGhpcy5zdG9yZXR5cGUgPSBzdG9yZXR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5IChpZiBkaWZmZXJlbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGtleXBhc3MgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlwYXNzKGZpbmFsIFN0cmluZyBrZXlwYXNzKSB7CisgICAgICAgIHRoaXMua2V5cGFzcyA9IGtleXBhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFsZ29yaXRobSB0byB1c2UgaW4gc2lnbmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWdhbGcgYWxnb3JpdGhtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2lnYWxnKGZpbmFsIFN0cmluZyBzaWdhbGcpIHsKKyAgICAgICAgdGhpcy5zaWdhbGcgPSBzaWdhbGc7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIG5hbWUtdmFsdWUgcGFpci4KKyAgICAgKiBAcGFyYW0ga2V5YWxnIGFsZ29yaXRobQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleWFsZyhmaW5hbCBTdHJpbmcga2V5YWxnKSB7CisgICAgICAgIHRoaXMua2V5YWxnID0ga2V5YWxnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgc2l6ZSBvZiBrZXkgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGtleXNpemUgc2l6ZSBvZiBrZXkKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIElmIG5vdCBhbiBJbnRlZ2VyCisgICAgICogQHRvZG8gQ291bGQgY29udmVydCB0aGlzIHRvIGEgcGxhaW4gSW50ZWdlciBzZXR0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5c2l6ZShmaW5hbCBTdHJpbmcga2V5c2l6ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMua2V5c2l6ZSA9IEludGVnZXIucGFyc2VJbnQoa2V5c2l6ZSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiS2V5U2l6ZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGEgaW50ZWdlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGhvdyBtYW55IGRheXMgY2VydGlmaWNhdGUgaXMgdmFsaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsaWRpdHkgZGF5cyB2YWxpZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gSWYgbm90IGFuIEludGVnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGl0eShmaW5hbCBTdHJpbmcgdmFsaWRpdHkpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLnZhbGlkaXR5ID0gSW50ZWdlci5wYXJzZUludCh2YWxpZGl0eSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVmFsaWRpdHkgYXR0cmlidXRlIHNob3VsZCBiZSBhIGludGVnZXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHZlcmJvc2Ugb3V0cHV0IHdoZW4gc2lnbmluZy4KKyAgICAgKiBAcGFyYW0gdmVyYm9zZSB2ZXJib3NlIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoZmluYWwgYm9vbGVhbiB2ZXJib3NlKSB7CisgICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKG51bGwgPT0gYWxpYXMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYWxpYXMgYXR0cmlidXRlIG11c3QgYmUgc2V0Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVsbCA9PSBzdG9yZXBhc3MpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3RvcmVwYXNzIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgPT0gZG5hbWUgJiYgbnVsbCA9PSBleHBhbmRlZERuYW1lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRuYW1lIG11c3QgYmUgc2V0Iik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgc2IuYXBwZW5kKCItZ2Vua2V5ICIpOworCisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi12ICIpOworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCItYWxpYXMgXCIiKTsKKyAgICAgICAgc2IuYXBwZW5kKGFsaWFzKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKKworICAgICAgICBpZiAobnVsbCAhPSBkbmFtZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCItZG5hbWUgXCIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChkbmFtZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlwiICIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgIT0gZXhwYW5kZWREbmFtZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCItZG5hbWUgXCIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChleHBhbmRlZERuYW1lKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIgIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVsbCAhPSBrZXlzdG9yZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIta2V5c3RvcmUgXCIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChrZXlzdG9yZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlwiICIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgIT0gc3RvcmVwYXNzKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi1zdG9yZXBhc3MgXCIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzdG9yZXBhc3MpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IHN0b3JldHlwZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCItc3RvcmV0eXBlIFwiIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3RvcmV0eXBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIgIik7CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoIi1rZXlwYXNzIFwiIik7CisgICAgICAgIGlmIChudWxsICE9IGtleXBhc3MpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChrZXlwYXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzdG9yZXBhc3MpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXCIgIik7CisKKyAgICAgICAgaWYgKG51bGwgIT0gc2lnYWxnKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi1zaWdhbGcgXCIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzaWdhbGcpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IGtleWFsZykgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIta2V5YWxnIFwiIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoa2V5YWxnKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIgIik7CisgICAgICAgIH0KKworCisgICAgICAgIGlmICgwIDwga2V5c2l6ZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIta2V5c2l6ZSBcIiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGtleXNpemUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgwIDwgdmFsaWRpdHkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLXZhbGlkaXR5IFwiIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsaWRpdHkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJcIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZygiR2VuZXJhdGluZyBLZXkgZm9yICIgKyBhbGlhcyk7CisgICAgICAgIGZpbmFsIEV4ZWNUYXNrIGNtZCA9IG5ldyBFeGVjVGFzayh0aGlzKTsKKyAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoSmF2YUVudlV0aWxzLmdldEpka0V4ZWN1dGFibGUoImtleXRvb2wiKSk7CisgICAgICAgIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZyA9IGNtZC5jcmVhdGVBcmcoKTsKKyAgICAgICAgYXJnLnNldExpbmUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIGNtZC5zZXRGYWlsb25lcnJvcih0cnVlKTsKKyAgICAgICAgY21kLnNldFRhc2tOYW1lKGdldFRhc2tOYW1lKCkpOworICAgICAgICBjbWQuZXhlY3V0ZSgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2V0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYThmYzFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2V0LmphdmEKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKy8qKgorICogR2V0cyBhIHBhcnRpY3VsYXIgZmlsZSBmcm9tIGEgVVJMIHNvdXJjZS4KKyAqIE9wdGlvbnMgaW5jbHVkZSB2ZXJib3NlIHJlcG9ydGluZywgdGltZXN0YW1wIGJhc2VkIGZldGNoZXMgYW5kIGNvbnRyb2xsaW5nCisgKiBhY3Rpb25zIG9uIGZhaWx1cmVzLiBOQjogYWNjZXNzIHRocm91Z2ggYSBmaXJld2FsbCBvbmx5IHdvcmtzIGlmIHRoZSB3aG9sZQorICogSmF2YSBydW50aW1lIGlzIGNvcnJlY3RseSBjb25maWd1cmVkLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJuZXR3b3JrIgorICovCitwdWJsaWMgY2xhc3MgR2V0IGV4dGVuZHMgVGFzayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9SRVRSSUVTID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9UU19QRVJfTElORSA9IDUwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSUdfQlVGRkVSX1NJWkUgPSAxMDAgKiAxMDI0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJpdmF0ZSBVUkwgc291cmNlOyAvLyByZXF1aXJlZAorICAgIHByaXZhdGUgRmlsZSBkZXN0OyAvLyByZXF1aXJlZAorICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHVzZVRpbWVzdGFtcCA9IGZhbHNlOyAvL29mZiBieSBkZWZhdWx0CisgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZUVycm9ycyA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIHVuYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBwd29yZCA9IG51bGw7CisKKworCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgd29yay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gVGhyb3duIGluIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy9zZXQgdXAgbG9nZ2luZworICAgICAgICBpbnQgbG9nTGV2ZWwgPSBQcm9qZWN0Lk1TR19JTkZPOworICAgICAgICBEb3dubG9hZFByb2dyZXNzIHByb2dyZXNzID0gbnVsbDsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIHByb2dyZXNzID0gbmV3IFZlcmJvc2VQcm9ncmVzcyhTeXN0ZW0ub3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vZXhlY3V0ZSB0aGUgZ2V0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkb0dldChsb2dMZXZlbCwgcHJvZ3Jlc3MpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGxvZygiRXJyb3IgZ2V0dGluZyAiICsgc291cmNlICsgIiB0byAiICsgZGVzdCk7CisgICAgICAgICAgICBpZiAoIWlnbm9yZUVycm9ycykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbWFrZSBhIGdldCByZXF1ZXN0LCB3aXRoIHRoZSBzdXBwbGllZCBwcm9ncmVzcyBhbmQgbG9nZ2luZyBpbmZvLgorICAgICAqIEFsbCB0aGUgb3RoZXIgY29uZmlnIHBhcmFtZXRlcnMgYXJlIHNldCBhdCB0aGUgdGFzayBsZXZlbCwKKyAgICAgKiBzb3VyY2UsIGRlc3QsIGlnbm9yZUVycm9ycywgZXRjLgorICAgICAqIEBwYXJhbSBsb2dMZXZlbCBsZXZlbCB0byBsb2cgYXQsIHNlZSB7QGxpbmsgUHJvamVjdCNsb2coU3RyaW5nLCBpbnQpfQorICAgICAqIEBwYXJhbSBwcm9ncmVzcyBwcm9ncmVzcyBjYWxsYmFjazsgbnVsbCBmb3Igbm8tY2FsbGJhY2tzCisgICAgICogQHJldHVybiB0cnVlIGZvciBhIHN1Y2Nlc3NmdWwgZG93bmxvYWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB7QGxpbmsgI2lnbm9yZUVycm9yc30gaXMgdHJ1ZSwgYXMKKyAgICAgKiB3aGVuIGZhbHNlIGFsbCBmYWlsdXJlcyByYWlzZSBCdWlsZEV4Y2VwdGlvbnMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBmb3IgbmV0d29yayB0cm91YmxlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBmb3IgYXJndW1lbnQgZXJyb3JzLCBvciBvdGhlciB0cm91YmxlIHdoZW4gaWdub3JlRXJyb3JzCisgICAgICogaXMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZG9HZXQoaW50IGxvZ0xldmVsLCBEb3dubG9hZFByb2dyZXNzIHByb2dyZXNzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgLy9kb250IGRvIGFueSBwcm9ncmVzcywgdW5sZXNzIGFza2VkCisgICAgICAgIGlmIChwcm9ncmVzcyA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm9ncmVzcyA9IG5ldyBOdWxsUHJvZ3Jlc3MoKTsKKyAgICAgICAgfQorICAgICAgICBsb2coIkdldHRpbmc6ICIgKyBzb3VyY2UsIGxvZ0xldmVsKTsKKyAgICAgICAgbG9nKCJUbzogIiArIGRlc3QuZ2V0QWJzb2x1dGVQYXRoKCksIGxvZ0xldmVsKTsKKworICAgICAgICAvL3NldCB0aGUgdGltZXN0YW1wIHRvIHRoZSBmaWxlIGRhdGUuCisgICAgICAgIGxvbmcgdGltZXN0YW1wID0gMDsKKworICAgICAgICBib29sZWFuIGhhc1RpbWVzdGFtcCA9IGZhbHNlOworICAgICAgICBpZiAodXNlVGltZXN0YW1wICYmIGRlc3QuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IGRlc3QubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIERhdGUgdCA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgbG9nKCJsb2NhbCBmaWxlIGRhdGUgOiAiICsgdC50b1N0cmluZygpLCBsb2dMZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYXNUaW1lc3RhbXAgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy9zZXQgdXAgdGhlIFVSTCBjb25uZWN0aW9uCisgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHNvdXJjZS5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAvL21vZGlmeSB0aGUgaGVhZGVycworICAgICAgICAvL05COiB0aGluZ3MgbGlrZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGNvdWxkIGdvIGluIGhlcmUgdG9vLgorICAgICAgICBpZiAoaGFzVGltZXN0YW1wKSB7CisgICAgICAgICAgICBjb25uZWN0aW9uLnNldElmTW9kaWZpZWRTaW5jZSh0aW1lc3RhbXApOworICAgICAgICB9CisgICAgICAgIC8vIHByZXBhcmUgSmF2YSAxLjEgc3R5bGUgY3JlZGVudGlhbHMKKyAgICAgICAgaWYgKHVuYW1lICE9IG51bGwgfHwgcHdvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHVwID0gdW5hbWUgKyAiOiIgKyBwd29yZDsKKyAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZzsKKyAgICAgICAgICAgIC8vd2UgZG8gbm90IHVzZSB0aGUgc3VuIGltcGwgZm9yIHBvcnRhYmlsaXR5LAorICAgICAgICAgICAgLy9hbmQgYWx3YXlzIHVzZSBvdXIgb3duIGltcGxlbWVudGF0aW9uIGZvciBjb25zaXN0ZW50CisgICAgICAgICAgICAvL3Rlc3RpbmcKKyAgICAgICAgICAgIEJhc2U2NENvbnZlcnRlciBlbmNvZGVyID0gbmV3IEJhc2U2NENvbnZlcnRlcigpOworICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGVyLmVuY29kZSh1cC5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5ICgiQXV0aG9yaXphdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICJCYXNpYyAiICsgZW5jb2RpbmcpOworICAgICAgICB9CisKKyAgICAgICAgLy9jb25uZWN0IHRvIHRoZSByZW1vdGUgc2l0ZSAobWF5IHRha2Ugc29tZSB0aW1lKQorICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKyAgICAgICAgLy9uZXh0IHRlc3QgZm9yIGEgMzA0IHJlc3VsdCAoSFRUUCBvbmx5KQorICAgICAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIEh0dHBVUkxDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBodHRwQ29ubmVjdGlvbgorICAgICAgICAgICAgICAgICAgICA9IChIdHRwVVJMQ29ubmVjdGlvbikgY29ubmVjdGlvbjsKKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gaHR0cENvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBpZiAoaHR0cENvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCkKKyAgICAgICAgICAgICAgICAgICAgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9OT1RfTU9ESUZJRUQKKyAgICAgICAgICAgICAgICB8fCAobGFzdE1vZGlmaWVkICE9IDAgJiYgaGFzVGltZXN0YW1wCisgICAgICAgICAgICAgICAgJiYgdGltZXN0YW1wID49IGxhc3RNb2RpZmllZCkpIHsKKyAgICAgICAgICAgICAgICAvL25vdCBtb2RpZmllZCBzbyBubyBmaWxlIGRvd25sb2FkLiBqdXN0IHJldHVybgorICAgICAgICAgICAgICAgIC8vaW5zdGVhZCBhbmQgdHJhY2Ugb3V0IHNvbWV0aGluZyBzbyB0aGUgdXNlcgorICAgICAgICAgICAgICAgIC8vZG9lc24ndCB0aGluayB0aGF0IHRoZSBkb3dubG9hZCBoYXBwZW5lZCB3aGVuIGl0CisgICAgICAgICAgICAgICAgLy9kaWRuJ3QKKyAgICAgICAgICAgICAgICBsb2coIk5vdCBtb2RpZmllZCAtIHNvIG5vdCBkb3dubG9hZGVkIiwgbG9nTGV2ZWwpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRlc3QgZm9yIDQwMSByZXN1bHQgKEhUVFAgb25seSkKKyAgICAgICAgICAgIGlmIChodHRwQ29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKQorICAgICAgICAgICAgICAgICAgICA9PSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX1VOQVVUSE9SSVpFRCkgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJIVFRQIEF1dGhvcml6YXRpb24gZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgaWYgKGlnbm9yZUVycm9ycykgeworICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgbG9nTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy9SRVZJU0lUOiBhdCB0aGlzIHBvaW50IGV2ZW4gbm9uIEhUVFAgY29ubmVjdGlvbnMgbWF5CisgICAgICAgIC8vc3VwcG9ydCB0aGUgaWYtbW9kaWZpZWQtc2luY2UgYmVoYXZpb3VyIC13ZSBqdXN0IGNoZWNrCisgICAgICAgIC8vdGhlIGRhdGUgb2YgdGhlIGNvbnRlbnQgYW5kIHNraXAgdGhlIHdyaXRlIGlmIGl0IGlzIG5vdAorICAgICAgICAvL25ld2VyLiBTb21lIHByb3RvY29scyAoRlRQKSBkb24ndCBpbmNsdWRlIGRhdGVzLCBvZgorICAgICAgICAvL2NvdXJzZS4KKworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNQkVSX1JFVFJJRVM7IGkrKykgeworICAgICAgICAgICAgLy90aGlzIHRocmVlIGF0dGVtcHQgdHJpY2sgaXMgdG8gZ2V0IHJvdW5kIHF1aXJrcyBpbiBkaWZmZXJlbnQKKyAgICAgICAgICAgIC8vSmF2YSBpbXBsZW1lbnRhdGlvbnMuIFNvbWUgb2YgdGhlbSB0YWtlIGEgZmV3IGdvZXMgdG8gYmluZAorICAgICAgICAgICAgLy9wcm9wZXJ0eTsgd2UgaWdub3JlIHRoZSBmaXJzdCBjb3VwbGUgb2Ygc3VjaCBmYWlsdXJlcy4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMgPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGxvZygiRXJyb3Igb3BlbmluZyBjb25uZWN0aW9uICIgKyBleCwgbG9nTGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkNhbid0IGdldCAiICsgc291cmNlICsgIiB0byAiICsgZGVzdCwgbG9nTGV2ZWwpOworICAgICAgICAgICAgaWYgKGlnbm9yZUVycm9ycykgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgZ2V0ICIgKyBzb3VyY2UgKyAiIHRvICIgKyBkZXN0LAorICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7CisgICAgICAgIHByb2dyZXNzLmJlZ2luRG93bmxvYWQoKTsKKyAgICAgICAgYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JJR19CVUZGRVJfU0laRV07CisgICAgICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICAgICAgd2hpbGUgKChsZW5ndGggPSBpcy5yZWFkKGJ1ZmZlcikpID49IDApIHsKKyAgICAgICAgICAgICAgICBmb3Mud3JpdGUoYnVmZmVyLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIHByb2dyZXNzLm9uVGljaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGZvcyk7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaXMpOworCisgICAgICAgICAgICAvLyB3ZSBoYXZlIHN0YXJ0ZWQgdG8gKG92ZXIpd3JpdGUgZGVzdCwgYnV0IGZhaWxlZC4KKyAgICAgICAgICAgIC8vIFRyeSB0byBkZWxldGUgdGhlIGdhcmJhZ2Ugd2UnZCBvdGhlcndpc2UgbGVhdmUKKyAgICAgICAgICAgIC8vIGJlaGluZC4KKyAgICAgICAgICAgIGlmICghZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICBkZXN0LmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByb2dyZXNzLmVuZERvd25sb2FkKCk7CisKKyAgICAgICAgLy9pZiAoYW5kIG9ubHkgaWYpIHRoZSB1c2UgZmlsZSB0aW1lIG9wdGlvbiBpcyBzZXQsIHRoZW4KKyAgICAgICAgLy90aGUgc2F2ZWQgZmlsZSBub3cgaGFzIGl0cyB0aW1lc3RhbXAgc2V0IHRvIHRoYXQgb2YgdGhlCisgICAgICAgIC8vZG93bmxvYWRlZCBmaWxlCisgICAgICAgIGlmICh1c2VUaW1lc3RhbXApICB7CisgICAgICAgICAgICBsb25nIHJlbW90ZVRpbWVzdGFtcCA9IGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgIHsKKyAgICAgICAgICAgICAgICBEYXRlIHQgPSBuZXcgRGF0ZShyZW1vdGVUaW1lc3RhbXApOworICAgICAgICAgICAgICAgIGxvZygibGFzdCBtb2RpZmllZCA9ICIgKyB0LnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKChyZW1vdGVUaW1lc3RhbXAgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gIiAtIHVzaW5nIGN1cnJlbnQgdGltZSBpbnN0ZWFkIgorICAgICAgICAgICAgICAgICAgICAgICAgOiAiIiksIGxvZ0xldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZW1vdGVUaW1lc3RhbXAgIT0gMCkgeworICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMuc2V0RmlsZUxhc3RNb2RpZmllZChkZXN0LCByZW1vdGVUaW1lc3RhbXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9zdWNjZXNzZnVsIGRvd25sb2FkCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja0F0dHJpYnV0ZXMoKSB7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgYXR0cmlidXRlIGlzIHJlcXVpcmVkIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3QgYXR0cmlidXRlIGlzIHJlcXVpcmVkIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdC5leGlzdHMoKSAmJiBkZXN0LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3QuZXhpc3RzKCkgJiYgIWRlc3QuY2FuV3JpdGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4ndCB3cml0ZSB0byAiICsgZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVSTCB0byBnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdSBVUkwgZm9yIHRoZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhVUkwgdSkgeworICAgICAgICB0aGlzLnNvdXJjZSA9IHU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlcmUgdG8gY29weSB0aGUgc291cmNlIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzdCBQYXRoIHRvIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRlc3QpIHsKKyAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBzaG93IHZlcmJvc2UgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdiBpZiAidHJ1ZSIgdGhlbiBiZSB2ZXJib3NlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHYpIHsKKyAgICAgICAgdmVyYm9zZSA9IHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgbG9nIGVycm9ycyBidXQgZG8gbm90IHRyZWF0IGFzIGZhdGFsLgorICAgICAqCisgICAgICogQHBhcmFtIHYgaWYgInRydWUiIHRoZW4gZG9uJ3QgcmVwb3J0IGRvd25sb2FkIGVycm9ycyB1cCB0byBhbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVFcnJvcnMoYm9vbGVhbiB2KSB7CisgICAgICAgIGlnbm9yZUVycm9ycyA9IHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgY29uZGl0aW9uYWxseSBkb3dubG9hZCBhIGZpbGUgYmFzZWQgb24gdGhlIHRpbWVzdGFtcAorICAgICAqIG9mIHRoZSBsb2NhbCBjb3B5LgorICAgICAqCisgICAgICogPHA+SW4gdGhpcyBzaXR1YXRpb24sIHRoZSBpZi1tb2RpZmllZC1zaW5jZSBoZWFkZXIgaXMgc2V0IHNvCisgICAgICogdGhhdCB0aGUgZmlsZSBpcyBvbmx5IGZldGNoZWQgaWYgaXQgaXMgbmV3ZXIgdGhhbiB0aGUgbG9jYWwKKyAgICAgKiBmaWxlIChvciB0aGVyZSBpcyBubyBsb2NhbCBmaWxlKSBUaGlzIGZsYWcgaXMgb25seSB2YWxpZCBvbgorICAgICAqIEhUVFAgY29ubmVjdGlvbnMsIGl0IGlzIGlnbm9yZWQgaW4gb3RoZXIgY2FzZXMuICBXaGVuIHRoZSBmbGFnCisgICAgICogaXMgc2V0LCB0aGUgbG9jYWwgY29weSBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIHdpbGwgYWxzbyBoYXZlCisgICAgICogaXRzIHRpbWVzdGFtcCBzZXQgdG8gdGhlIHJlbW90ZSBmaWxlIHRpbWUuPC9wPgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHJlbW90ZSBmaWxlcyBvZiBkYXRlIDEvMS8xOTcwIChHTVQpIGFyZSB0cmVhdGVkIGFzCisgICAgICogJ25vIHRpbWVzdGFtcCcsIGFuZCB3ZWIgc2VydmVycyBvZnRlbiBzZXJ2ZSBmaWxlcyB3aXRoIGEKKyAgICAgKiB0aW1lc3RhbXAgaW4gdGhlIGZ1dHVyZSBieSByZXBsYWNpbmcgdGhlaXIgdGltZXN0YW1wIHdpdGggdGhhdAorICAgICAqIG9mIHRoZSBjdXJyZW50IHRpbWUuIEFsc28sIGludGVyLWNvbXB1dGVyIGNsb2NrIGRpZmZlcmVuY2VzIGNhbgorICAgICAqIGNhdXNlIG5vIGVuZCBvZiBncmllZi48L3A+CisgICAgICogQHBhcmFtIHYgInRydWUiIHRvIGVuYWJsZSBmaWxlIHRpbWUgZmV0Y2hpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VUaW1lc3RhbXAoYm9vbGVhbiB2KSB7CisgICAgICAgIHVzZVRpbWVzdGFtcCA9IHY7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVc2VybmFtZSBmb3IgYmFzaWMgYXV0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1IHVzZXJuYW1lIGZvciBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1KSB7CisgICAgICAgIHRoaXMudW5hbWUgPSB1OworICAgIH0KKworICAgIC8qKgorICAgICAqIHBhc3N3b3JkIGZvciB0aGUgYmFzaWMgYXV0aGVudGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcCBwYXNzd29yZCBmb3IgYXV0aGVudGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcCkgeworICAgICAgICB0aGlzLnB3b3JkID0gcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoaXMgZm9yIEJhY2t3YXJkIENvbXBhdGliaWxpdHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCYXNlNjRDb252ZXJ0ZXIKKyAgICAgICAgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkJhc2U2NENvbnZlcnRlciB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGZvciByZXBvcnRpbmcKKyAgICAgKiBwcm9nZXNzIG9mIGRvd25sb2FkaW5nLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgRG93bmxvYWRQcm9ncmVzcyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBiZWdpbiBhIGRvd25sb2FkCisgICAgICAgICAqLworICAgICAgICB2b2lkIGJlZ2luRG93bmxvYWQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogdGljayBoYW5kbGVyCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uVGljaygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBlbmQgYSBkb3dubG9hZAorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBlbmREb3dubG9hZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRvIG5vdGhpbmcgd2l0aCBwcm9ncmVzcyBpbmZvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsUHJvZ3Jlc3MgaW1wbGVtZW50cyBEb3dubG9hZFByb2dyZXNzIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogYmVnaW4gYSBkb3dubG9hZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYmVnaW5Eb3dubG9hZCgpIHsKKworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRpY2sgaGFuZGxlcgorICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25UaWNrKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGVuZCBhIGRvd25sb2FkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBlbmREb3dubG9hZCgpIHsKKworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdmVyYm9zZSBwcm9ncmVzcyBzeXN0ZW0gcHJpbnRzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmVyYm9zZVByb2dyZXNzIGltcGxlbWVudHMgRG93bmxvYWRQcm9ncmVzcyAgeworICAgICAgICBwcml2YXRlIGludCBkb3RzID0gMDsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0OworICAgICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSB2ZXJib3NlIHByb2dyZXNzIHJlcG9ydGVyLgorICAgICAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFZlcmJvc2VQcm9ncmVzcyhQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGJlZ2luIGEgZG93bmxvYWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luRG93bmxvYWQoKSB7CisgICAgICAgICAgICBkb3RzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiB0aWNrIGhhbmRsZXIKKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVGljaygpIHsKKyAgICAgICAgICAgIG91dC5wcmludCgiLiIpOworICAgICAgICAgICAgaWYgKGRvdHMrKyA+IERPVFNfUEVSX0xJTkUpIHsKKyAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICBkb3RzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBlbmQgYSBkb3dubG9hZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZW5kRG93bmxvYWQoKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ltcG9ydFRhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ltcG9ydFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJhM2FkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW1wb3J0VGFzay5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIFRhc2sgdG8gaW1wb3J0IGFub3RoZXIgYnVpbGQgZmlsZSBpbnRvIHRoZSBjdXJyZW50IHByb2plY3QuCisgKiA8cD4KKyAqIEl0IG11c3QgYmUgJ3RvcCBsZXZlbCcuIE9uIGV4ZWN1dGlvbiBpdCB3aWxsIHJlYWQgYW5vdGhlciBBbnQgZmlsZQorICogaW50byB0aGUgc2FtZSBQcm9qZWN0LgorICogPC9wPgorICogPHA+CisgKiA8Yj5JbXBvcnRhbnQ8L2I+OiB3ZSBoYXZlIG5vdCBmaW5hbGl6ZWQgaG93IHJlbGF0aXZlIGZpbGUgcmVmZXJlbmNlcworICogd2lsbCBiZSByZXNvbHZlZCBpbiBkZWVwL2NvbXBsZXggYnVpbGQgaGllcmFyY2hpZXMgLSBzdWNoIGFzIHdoYXQgaGFwcGVucworICogd2hlbiBhbiBpbXBvcnRlZCBmaWxlIGltcG9ydHMgYW5vdGhlciBmaWxlLiBVc2UgYWJzb2x1dGUgcmVmZXJlbmNlcyBmb3IKKyAqIGVuaGFuY2VkIGJ1aWxkIGZpbGUgc3RhYmlsaXR5LCBlc3BlY2lhbGx5IGluIHRoZSBpbXBvcnRlZCBmaWxlcy4KKyAqIDwvcD4KKyAqIDxwPkV4YW1wbGVzOjwvcD4KKyAqIDxwcmU+CisgKiAmbHQ7aW1wb3J0IGZpbGU9Ii4uL2NvbW1vbi10YXJnZXRzLnhtbCIvJmd0OworICogPC9wcmU+CisgKiA8cD5JbXBvcnQgdGFyZ2V0cyBmcm9tIGEgZmlsZSBpbiBhIHBhcmVudCBkaXJlY3RvcnkuPC9wPgorICogPHByZT4KKyAqICZsdDtpbXBvcnQgZmlsZT0iJHtkZXBsb3ktcGxhdGZvcm19LnhtbCIvJmd0OworICogPC9wcmU+CisgKiA8cD5JbXBvcnQgdGhlIHByb2plY3QgZGVmaW5lZCBieSB0aGUgcHJvcGVydHkgPGNvZGU+ZGVwbG95LXBsYXRmb3JtPC9jb2RlPi48L3A+CisgKgorICogQHNpbmNlIEFudDEuNgorICogQGFudC50YXNrIGNhdGVnb3J5PSJjb250cm9sIgorICovCitwdWJsaWMgY2xhc3MgSW1wb3J0VGFzayBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgU3RyaW5nIGZpbGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgb3B0aW9uYWwgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9uYWwgaWYgdHJ1ZSBpZ25vcmUgZmlsZXMgdGhhdCBhcmUgbm90IHByZXNlbnQsCisgICAgICogICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChib29sZWFuIG9wdGlvbmFsKSB7CisgICAgICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBpbXBvcnQuIEhvdyByZWxhdGl2ZSBwYXRocyBhcmUgcmVzb2x2ZWQgaXMgc3RpbGwKKyAgICAgKiBpbiBmbHV4OiB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIHNhZmV0eS4KKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgbmFtZSBvZiB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgLy8gSSBkb24ndCB0aGluayB3ZSBjYW4gdXNlIEZpbGUgLSBkaWZmZXJlbnQgcnVsZXMKKyAgICAgICAgLy8gZm9yIHJlbGF0aXZlIHBhdGhzLgorICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqICBUaGlzIHJlbGllcyBvbiB0aGUgdGFzayBvcmRlciBtb2RlbC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiaW1wb3J0IHJlcXVpcmVzIGZpbGUgYXR0cmlidXRlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldE93bmluZ1RhcmdldCgpID09IG51bGwKKyAgICAgICAgICAgIHx8ICEiIi5lcXVhbHMoZ2V0T3duaW5nVGFyZ2V0KCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbXBvcnQgb25seSBhbGxvd2VkIGFzIGEgdG9wLWxldmVsIHRhc2siKTsKKyAgICAgICAgfQorCisgICAgICAgIFByb2plY3RIZWxwZXIgaGVscGVyID0KKyAgICAgICAgICAgICAgICAoUHJvamVjdEhlbHBlcikgZ2V0UHJvamVjdCgpLgorICAgICAgICAgICAgICAgICAgICBnZXRSZWZlcmVuY2UoUHJvamVjdEhlbHBlci5QUk9KRUNUSEVMUEVSX1JFRkVSRU5DRSk7CisKKyAgICAgICAgaWYgKGhlbHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgaWYgdGhlIHByb2plY3RoZWxwZXIgd2FzIG5vdCByZWdpc3RlcmVkIHdpdGggdGhlIHByb2plY3QuCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImltcG9ydCByZXF1aXJlcyBzdXBwb3J0IGluIFByb2plY3RIZWxwZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvciBpbXBvcnRTdGFjayA9IGhlbHBlci5nZXRJbXBvcnRTdGFjaygpOworCisgICAgICAgIGlmIChpbXBvcnRTdGFjay5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGFudCBpcyB1c2VkIHdpdGggYSBwcm9qZWN0CisgICAgICAgICAgICAvLyBoZWxwZXIgdGhhdCBkb2Vzbid0IHNldCB0aGUgaW1wb3J0LgorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbXBvcnQgcmVxdWlyZXMgc3VwcG9ydCBpbiBQcm9qZWN0SGVscGVyIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0TG9jYXRpb24oKSA9PSBudWxsIHx8IGdldExvY2F0aW9uKCkuZ2V0RmlsZU5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBnZXQgbG9jYXRpb24gb2YgaW1wb3J0IHRhc2siKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgYnVpbGRGaWxlID0gbmV3IEZpbGUoZ2V0TG9jYXRpb24oKS5nZXRGaWxlTmFtZSgpKS5nZXRBYnNvbHV0ZUZpbGUoKTsKKworICAgICAgICAvLyBQYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJ1aWxkIGZpbGUgdGhleSdyZSBpbXBvcnRlZCBmcm9tLAorICAgICAgICAvLyAqbm90KiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKHNhbWUgYXMgZW50aXR5IGluY2x1ZGVzKS4KKworICAgICAgICBGaWxlIGJ1aWxkRmlsZVBhcmVudCA9IG5ldyBGaWxlKGJ1aWxkRmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgIEZpbGUgaW1wb3J0ZWRGaWxlID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShidWlsZEZpbGVQYXJlbnQsIGZpbGUpOworCisgICAgICAgIGdldFByb2plY3QoKS5sb2coIkltcG9ydGluZyBmaWxlICIgKyBpbXBvcnRlZEZpbGUgKyAiIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBpZiAoIWltcG9ydGVkRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICJDYW5ub3QgZmluZCAiICsgZmlsZSArICIgaW1wb3J0ZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgKyBidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGltcG9ydFN0YWNrLmNvbnRhaW5zKGltcG9ydGVkRmlsZSkpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coCisgICAgICAgICAgICAgICAgIlNraXBwZWQgYWxyZWFkeSBpbXBvcnRlZCBmaWxlOlxuICAgIgorICAgICAgICAgICAgICAgICsgaW1wb3J0ZWRGaWxlICsgIlxuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaGVscGVyLnBhcnNlKGdldFByb2plY3QoKSwgaW1wb3J0ZWRGaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IFByb2plY3RIZWxwZXIuYWRkTG9jYXRpb25Ub0J1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIGV4LCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW5wdXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0lucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0NzljNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0lucHV0LmphdmEKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LkRlZmF1bHRJbnB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuR3JlZWR5SW5wdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuTXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuUHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5DbGFzc3BhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIFJlYWRzIGFuIGlucHV0IGxpbmUgZnJvbSB0aGUgY29uc29sZS4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iY29udHJvbCIKKyAqLworcHVibGljIGNsYXNzIElucHV0IGV4dGVuZHMgVGFzayB7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIElucHV0SGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgSGFuZGxlciBleHRlbmRzIERlZkJhc2UgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlZmlkID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBIYW5kbGVyVHlwZSB0eXBlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NuYW1lID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3BlY2lmeSB0aGF0IHRoZSBoYW5kbGVyIGlzIGEgcmVmZXJlbmNlIG9uIHRoZSBwcm9qZWN0OworICAgICAgICAgKiB0aGlzIGFsbG93cyB0aGUgdXNlIG9mIGEgY3VzdG9tIGlucHV0aGFuZGxlci4KKyAgICAgICAgICogQHBhcmFtIHJlZmlkIHRoZSBTdHJpbmcgcmVmaWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChTdHJpbmcgcmVmaWQpIHsKKyAgICAgICAgICAgIHRoaXMucmVmaWQgPSByZWZpZDsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSByZWZpZCBvZiB0aGlzIEhhbmRsZXIuCisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIHJlZmlkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWZpZCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZWZpZDsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBJbnB1dEhhbmRsZXIgY2xhc3NuYW1lLgorICAgICAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBTdHJpbmcgY2xhc3NuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKFN0cmluZyBjbGFzc25hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGNsYXNzbmFtZSBvZiB0aGUgSW5wdXRIYW5kbGVyLgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyBjbGFzc25hbWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc25hbWU7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgaGFuZGxlciB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gdHlwZSBhIEhhbmRsZXJUeXBlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShIYW5kbGVyVHlwZSB0eXBlKSB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGhhbmRsZXIgdHlwZS4KKyAgICAgICAgICogQHJldHVybiBhIEhhbmRsZXJUeXBlIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBIYW5kbGVyVHlwZSBnZXRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBJbnB1dEhhbmRsZXIgZ2V0SW5wdXRIYW5kbGVyKCkgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0SW5wdXRIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVmaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gKElucHV0SGFuZGxlcikgKGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UocmVmaWQpKTsKKyAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICByZWZpZCArICIgZG9lcyBub3QgZGVub3RlIGFuIElucHV0SGFuZGxlciIsIGUpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsYXNzbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICByZXR1cm4gKElucHV0SGFuZGxlcikgKENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKGNsYXNzbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjcmVhdGVMb2FkZXIoKSwgSW5wdXRIYW5kbGVyLmNsYXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSByZWZpZCwgY2xhc3NuYW1lIG9yIHR5cGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZWRBdHRyaWJ1dGUgcmVwcmVzZW50aW5nIHRoZSBidWlsdC1pbiBpbnB1dCBoYW5kbGVyIHR5cGVzOgorICAgICAqICJkZWZhdWx0IiwgInByb3BlcnR5ZmlsZSIsICJncmVlZHkiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGFuZGxlclR5cGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVTCisgICAgICAgICAgICA9IHsiZGVmYXVsdCIsICJwcm9wZXJ0eWZpbGUiLCAiZ3JlZWR5In07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5wdXRIYW5kbGVyW10gSEFORExFUlMKKyAgICAgICAgICAgID0ge25ldyBEZWZhdWx0SW5wdXRIYW5kbGVyKCksCisgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyKCksCisgICAgICAgICAgICAgICBuZXcgR3JlZWR5SW5wdXRIYW5kbGVyKCl9OworCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUVTOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgSW5wdXRIYW5kbGVyIGdldElucHV0SGFuZGxlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVSU1tnZXRJbmRleCgpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHZhbGlkYXJncyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIGFkZHByb3BlcnR5ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0dmFsdWUgPSBudWxsOworICAgIHByaXZhdGUgSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbWVzc2FnZUF0dHJpYnV0ZTsKKworICAgIC8qKgorICAgICAqIERlZmluZXMgdmFsaWQgaW5wdXQgcGFyYW1ldGVycyBhcyBjb21tYSBzZXBhcmF0ZWQgc3RyaW5ncy4gSWYgc2V0LCBpbnB1dAorICAgICAqIHRhc2sgd2lsbCByZWplY3QgYW55IGlucHV0IG5vdCBkZWZpbmVkIGFzIGFjY2VwdGVkIGFuZCByZXF1aXJlcyB0aGUgdXNlcgorICAgICAqIHRvIHJlZW50ZXIgaXQuIFZhbGlkYXJncyBhcmUgY2FzZSBzZW5zaXRpdmUuIElmIHlvdSB3YW50ICdhJyBhbmQgJ0EnIHRvCisgICAgICogYmUgYWNjZXB0ZWQgeW91IG5lZWQgdG8gZGVmaW5lIGJvdGggdmFsdWVzIGFzIGFjY2VwdGVkIGFyZ3VtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWxpZGFyZ3MgQSBjb21tYSBzZXBhcmF0ZWQgU3RyaW5nIGRlZmluaW5nIHZhbGlkIGlucHV0IGFyZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhcmdzIChTdHJpbmcgdmFsaWRhcmdzKSB7CisgICAgICAgIHRoaXMudmFsaWRhcmdzID0gdmFsaWRhcmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkIGZyb20gaW5wdXQuIEJlaGF2aW91ciBpcworICAgICAqIGFjY29yZGluZyB0byBwcm9wZXJ0eSB0YXNrIHdoaWNoIG1lYW5zIHRoYXQgZXhpc3RpbmcgcHJvcGVydGllcworICAgICAqIGNhbm5vdCBiZSBvdmVycmlkZGVuLgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHByb3BlcnR5IE5hbWUgZm9yIHRoZSBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkIGZyb20gaW5wdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRwcm9wZXJ0eSAoU3RyaW5nIGFkZHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMuYWRkcHJvcGVydHkgPSBhZGRwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBNZXNzYWdlIHdoaWNoIGdldHMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGR1cmluZyB0aGUgYnVpbGQgcnVuLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlIChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICBtZXNzYWdlQXR0cmlidXRlID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkIGZyb20gaW5wdXQuCisgICAgICogUHJvcGVydHkgdmFsdWUgd2lsbCBiZSBzZXQgdG8gZGVmYXVsdCBpZiBub3QgaW5wdXQgaXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdHZhbHVlIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBpZiBubyBpbnB1dAorICAgICAqIGlzIHJlY2VpdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHZhbHVlIChTdHJpbmcgZGVmYXVsdHZhbHVlKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdHZhbHVlID0gZGVmYXVsdHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIG11bHRpbGluZSBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIG1zZykgeworICAgICAgICBpZiAobWVzc2FnZUF0dHJpYnV0ZSAmJiAiIi5lcXVhbHMobXNnLnRyaW0oKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZXNzYWdlICs9IGdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcyhtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIGFyZyBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXQgKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdHVhbCBtZXRob2QgZXhlY3V0ZWQgYnkgYW50LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlICgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhZGRwcm9wZXJ0eSAhPSBudWxsCisgICAgICAgICAgICAmJiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoYWRkcHJvcGVydHkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygic2tpcHBpbmcgIiArIGdldFRhc2tOYW1lKCkgKyAiIGFzIHByb3BlcnR5ICIgKyBhZGRwcm9wZXJ0eQorICAgICAgICAgICAgICAgICsgIiBoYXMgYWxyZWFkeSBiZWVuIHNldC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0UmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKKyAgICAgICAgaWYgKHZhbGlkYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBWZWN0b3IgYWNjZXB0ID0gU3RyaW5nVXRpbHMuc3BsaXQodmFsaWRhcmdzLCAnLCcpOworICAgICAgICAgICAgcmVxdWVzdCA9IG5ldyBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdChtZXNzYWdlLCBhY2NlcHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVxdWVzdCA9IG5ldyBJbnB1dFJlcXVlc3QobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdHZhbHVlKTsKKworICAgICAgICBJbnB1dEhhbmRsZXIgaCA9IGhhbmRsZXIgPT0gbnVsbAorICAgICAgICAgICAgPyBnZXRQcm9qZWN0KCkuZ2V0SW5wdXRIYW5kbGVyKCkKKyAgICAgICAgICAgIDogaGFuZGxlci5nZXRJbnB1dEhhbmRsZXIoKTsKKworICAgICAgICBoLmhhbmRsZUlucHV0KHJlcXVlc3QpOworCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlcXVlc3QuZ2V0SW5wdXQoKTsKKyAgICAgICAgaWYgKCh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgJiYgZGVmYXVsdHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdHZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChhZGRwcm9wZXJ0eSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShhZGRwcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmVzdGVkIGhhbmRsZXIgZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIGEgSGFuZGxlciBmb3IgdGhpcyBJbnB1dCB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyBIYW5kbGVyIGNyZWF0ZUhhbmRsZXIoKSB7CisgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGRlZmluZSA+IDEgbmVzdGVkIGlucHV0IGhhbmRsZXIiKTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KREJDVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSkRCQ1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTBlMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSkRCQ1Rhc2suamF2YQpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhOworaW1wb3J0IGphdmEuc3FsLkRyaXZlcjsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworCisvKioKKyAqIEhhbmRsZXMgSkRCQyBjb25maWd1cmF0aW9uIG5lZWRlZCBieSBTUUwgdHlwZSB0YXNrcy4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNsYXNzIHByaW50cyB0aGUgY29udGVudHMgb2YgdGhlIGZpcnN0IGNvbHVtbiBvZiBlYWNoIHJvdyBpbiBUYWJsZU5hbWUuCisgKjwvcD4KKyAqPGNvZGU+PHByZT4KK3BhY2thZ2UgZXhhbXBsZXM7CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkpEQkNUYXNrOworCitwdWJsaWMgY2xhc3MgU1FMRXhhbXBsZVRhc2sgZXh0ZW5kcyBKREJDVGFzayB7CisKKyAgICBwcml2YXRlIFN0cmluZyB0YWJsZU5hbWU7CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uID0gZ2V0Q29ubmVjdGlvbigpOworICAgICAgICBTdGF0ZW1lbnQgc3RtdD1udWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRhYmxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUYWJsZU5hbWUgbXVzdCBiZSBzcGVjaWZpZWQiLGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUICogRlJPTSAiK3RhYmxlTmFtZTsKKyAgICAgICAgICAgIHN0bXQ9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICAgICAgICBSZXN1bHRTZXQgcnMgPSBzdG10LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIGxvZyhycy5nZXRPYmplY3QoMSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkge3N0bXQuY2xvc2UoKTt9Y2F0Y2ggKFNRTEV4Y2VwdGlvbiBpbmdvcmUpIHt9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHtjb25uLmNsb3NlKCk7fWNhdGNoIChTUUxFeGNlcHRpb24gaW5nb3JlKSB7fQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlTmFtZShTdHJpbmcgdGFibGVOYW1lKSB7CisgICAgICAgIHRoaXMudGFibGVOYW1lID0gdGFibGVOYW1lOworICAgIH0KKworfQorCisKKzwvcHJlPjwvY29kZT4KKworCisKKyAqIEBzaW5jZSBBbnQgMS41CisgKgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKREJDVGFzayBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX1RBQkxFX1NJWkUgPSAzOworCisgICAgLyoqCisgICAgICogVXNlZCBmb3IgY2FjaGluZyBsb2FkZXJzIC8gZHJpdmVyLiBUaGlzIGlzIHRvIGF2b2lkCisgICAgICogZ2V0dGluZyBhbiBPdXRPZk1lbW9yeUVycm9yIHdoZW4gY2FsbGluZyB0aGlzIHRhc2sKKyAgICAgKiBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgbG9hZGVyTWFwID0gbmV3IEhhc2h0YWJsZShIQVNIX1RBQkxFX1NJWkUpOworCisgICAgcHJpdmF0ZSBib29sZWFuIGNhY2hpbmcgPSB0cnVlOworCisgICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aDsKKworICAgIHByaXZhdGUgQW50Q2xhc3NMb2FkZXIgbG9hZGVyOworCisgICAgLyoqCisgICAgICogQXV0b2NvbW1pdCBmbGFnLiBEZWZhdWx0IHZhbHVlIGlzIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGF1dG9jb21taXQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERCIGRyaXZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkcml2ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogREIgdXJsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVybCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBVc2VyIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcklkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFBhc3N3b3JkCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworCisgICAgLyoqCisgICAgICogUkRCTVMgUHJvZHVjdCBuZWVkZWQgZm9yIHRoaXMgU1FMLgorICAgICAqKi8KKyAgICBwcml2YXRlIFN0cmluZyByZGJtcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSREJNUyBWZXJzaW9uIG5lZWRlZCBmb3IgdGhpcyBTUUwuCisgICAgICoqLworICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb24gPSBudWxsOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xhc3NwYXRoIGZvciBsb2FkaW5nIHRoZSBkcml2ZXIuCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBUaGUgY2xhc3NwYXRoIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoaW5nIGxvYWRlcnMgLyBkcml2ZXIuIFRoaXMgaXMgdG8gYXZvaWQKKyAgICAgKiBnZXR0aW5nIGFuIE91dE9mTWVtb3J5RXJyb3Igd2hlbiBjYWxsaW5nIHRoaXMgdGFzaworICAgICAqIG11bHRpcGxlIHRpbWVzIGluIGEgcm93OyBkZWZhdWx0OiB0cnVlCisgICAgICogQHBhcmFtIGVuYWJsZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGluZyhib29sZWFuIGVuYWJsZSkgeworICAgICAgICBjYWNoaW5nID0gZW5hYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aCBmb3IgbG9hZGluZyB0aGUgZHJpdmVyLgorICAgICAqIEByZXR1cm4gYSBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCBmb3IgbG9hZGluZyB0aGUgZHJpdmVyCisgICAgICogdXNpbmcgdGhlIGNsYXNzcGF0aCByZWZlcmVuY2UuCisgICAgICogQHBhcmFtIHIgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXI7IHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBkcml2ZXIgVGhlIGRyaXZlciB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIGRyaXZlcikgeworICAgICAgICB0aGlzLmRyaXZlciA9IGRyaXZlci50cmltKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBVUkw7IHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgeworICAgICAgICB0aGlzLnVybCA9IHVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXNzd29yZDsgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF1dG8gY29tbWl0IGZsYWcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb247CisgICAgICogb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICogQHBhcmFtIGF1dG9jb21taXQgVGhlIGF1dG9jb21taXQgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b2NvbW1pdChib29sZWFuIGF1dG9jb21taXQpIHsKKyAgICAgICAgdGhpcy5hdXRvY29tbWl0ID0gYXV0b2NvbW1pdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRhc2sgb25seSBpZiB0aGUgbG93ZXIgY2FzZSBwcm9kdWN0IG5hbWUKKyAgICAgKiBvZiB0aGUgREIgbWF0Y2hlcyB0aGlzCisgICAgICogQHBhcmFtIHJkYm1zIFRoZSByZGJtcyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZGJtcyhTdHJpbmcgcmRibXMpIHsKKyAgICAgICAgdGhpcy5yZGJtcyA9IHJkYm1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZlcnNpb24gc3RyaW5nLCBleGVjdXRlIHRhc2sgb25seSBpZgorICAgICAqIHJkYm1zIHZlcnNpb24gbWF0Y2g7IG9wdGlvbmFsLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgd2UgYXJlIGNvbm5lY3RlZCB0byB0aGUgY29ycmVjdCBSREJNUworICAgICAqIEBwYXJhbSBjb25uIHRoZSBqZGJjIGNvbm5lY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2UgYXJlIGNvbm5lY3RlZCB0byB0aGUgY29ycmVjdCBSREJNUworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRSZGJtcyhDb25uZWN0aW9uIGNvbm4pIHsKKyAgICAgICAgaWYgKHJkYm1zID09IG51bGwgJiYgdmVyc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEYXRhYmFzZU1ldGFEYXRhIGRtZCA9IGNvbm4uZ2V0TWV0YURhdGEoKTsKKworICAgICAgICAgICAgaWYgKHJkYm1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGhlVmVuZG9yID0gZG1kLmdldERhdGFiYXNlUHJvZHVjdE5hbWUoKS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgICAgICAgbG9nKCJSREJNUyA9ICIgKyB0aGVWZW5kb3IsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIGlmICh0aGVWZW5kb3IgPT0gbnVsbCB8fCB0aGVWZW5kb3IuaW5kZXhPZihyZGJtcykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiTm90IHRoZSByZXF1aXJlZCBSREJNUzogIiArIHJkYm1zLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0aGVWZXJzaW9uID0gZG1kLmdldERhdGFiYXNlUHJvZHVjdFZlcnNpb24oKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CisKKyAgICAgICAgICAgICAgICBsb2coIlZlcnNpb24gPSAiICsgdGhlVmVyc2lvbiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgaWYgKHRoZVZlcnNpb24gPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgISh0aGVWZXJzaW9uLnN0YXJ0c1dpdGgodmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRoZVZlcnNpb24uaW5kZXhPZigiICIgKyB2ZXJzaW9uKSA+PSAwKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIk5vdCB0aGUgcmVxdWlyZWQgdmVyc2lvbjogXCIiICsgdmVyc2lvbiArICJcIiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gQ291bGQgbm90IGdldCB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIG9idGFpbiByZXF1aXJlZCBSREJNUyBpbmZvcm1hdGlvbiIsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNhY2hlIG9mIGxvYWRlcnMgYW5kIGRyaXZlcnMuCisgICAgICogQHJldHVybiBhIGhhc2h0YWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgSGFzaHRhYmxlIGdldExvYWRlck1hcCgpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRlck1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzbG9hZGVyIHVzZWQgdG8gY3JlYXRlIGEgZHJpdmVyLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzbG9hZGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIEFudENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IENvbm5lY3Rpb24gYXMgdXNpbmcgdGhlIGRyaXZlciwgdXJsLCB1c2VyaWQgYW5kIHBhc3N3b3JkCisgICAgICogc3BlY2lmaWVkLgorICAgICAqCisgICAgICogVGhlIGNhbGxpbmcgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBDb25uZWN0aW9uIHRoZSBuZXdseSBjcmVhdGVkIGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgVXNlcklkL1Bhc3N3b3JkL1VybCBpcyBub3Qgc2V0IG9yIHRoZXJlCisgICAgICogaXMgbm8gc3VpdGFibGUgZHJpdmVyIG9yIHRoZSBkcml2ZXIgZmFpbHMgdG8gbG9hZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVzZXJJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVzZXJJZCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUGFzc3dvcmQgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVcmwgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIGxvZygiY29ubmVjdGluZyB0byAiICsgZ2V0VXJsKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgUHJvcGVydGllcyBpbmZvID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGluZm8ucHV0KCJ1c2VyIiwgZ2V0VXNlcklkKCkpOworICAgICAgICAgICAgaW5mby5wdXQoInBhc3N3b3JkIiwgZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgICAgICBDb25uZWN0aW9uIGNvbm4gPSBnZXREcml2ZXIoKS5jb25uZWN0KGdldFVybCgpLCBpbmZvKTsKKworICAgICAgICAgICAgaWYgKGNvbm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIERyaXZlciBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIFVSTAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oIk5vIHN1aXRhYmxlIERyaXZlciBmb3IgIiArIHVybCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdChhdXRvY29tbWl0KTsKKyAgICAgICAgICAgIHJldHVybiBjb25uOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1aXJlZCBkcml2ZXIuCisgICAgICogVXNlcyB0aGUgYW50IGNsYXNzIGxvYWRlciBhbmQgdGhlIG9wdGlvbmFsbHkgdGhlIHByb3ZpZGVkIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIERyaXZlcgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIERyaXZlciBnZXREcml2ZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZHJpdmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRHJpdmVyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIERyaXZlciBkcml2ZXJJbnN0YW5jZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBkYzsKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZpcnN0IHRoYXQgaXQgaXMgbm90IGFscmVhZHkgbG9hZGVkIG90aGVyd2lzZQorICAgICAgICAgICAgICAgIC8vIGNvbnNlY3V0aXZlIHJ1bnMgc2VlbXMgdG8gZW5kIGludG8gYW4gT3V0T2ZNZW1vcnlFcnJvcgorICAgICAgICAgICAgICAgIC8vIG9yIGl0IGZhaWxzIHdoZW4gdGhlcmUgaXMgYSBuYXRpdmUgbGlicmFyeSB0byBsb2FkCisgICAgICAgICAgICAgICAgLy8gc2V2ZXJhbCB0aW1lcy4KKyAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGZhciBmcm9tIGJlaW5nIHBlcmZlY3QgYnV0IHNob3VsZCB3b3JrCisgICAgICAgICAgICAgICAgLy8gaW4gbW9zdCBjYXNlcy4KKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvYWRlck1hcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyID0gKEFudENsYXNzTG9hZGVyKSBsb2FkZXJNYXAuZ2V0KGRyaXZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkxvYWRpbmcgIiArIGRyaXZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB1c2luZyBBbnRDbGFzc0xvYWRlciB3aXRoIGNsYXNzcGF0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc3BhdGgsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyID0gZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGNsYXNzcGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlck1hcC5wdXQoZHJpdmVyLCBsb2FkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJMb2FkaW5nICIgKyBkcml2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdXNpbmcgYSBjYWNoZWQgQW50Q2xhc3NMb2FkZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGMgPSBsb2FkZXIubG9hZENsYXNzKGRyaXZlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygiTG9hZGluZyAiICsgZHJpdmVyICsgIiB1c2luZyBzeXN0ZW0gbG9hZGVyLiIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIGRjID0gQ2xhc3MuZm9yTmFtZShkcml2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHJpdmVySW5zdGFuY2UgPSAoRHJpdmVyKSBkYy5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNsYXNzIE5vdCBGb3VuZDogSkRCQyBkcml2ZXIgIiArIGRyaXZlciArICIgY291bGQgbm90IGJlIGxvYWRlZCIsCisgICAgICAgICAgICAgICAgICAgIGUsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgQWNjZXNzOiBKREJDIGRyaXZlciAiICsgZHJpdmVyICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW5zdGFudGlhdGlvbiBFeGNlcHRpb246IEpEQkMgZHJpdmVyICIgKyBkcml2ZXIgKyAiIGNvdWxkIG5vdCBiZSBsb2FkZWQiLAorICAgICAgICAgICAgICAgICAgICBlLAorICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZHJpdmVySW5zdGFuY2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNhY2hpbmcgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB2YWx1ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgaXNDYWNoaW5nKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgY2FjaGluZyA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBQYXRoCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCkgeworICAgICAgICByZXR1cm4gY2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGF1dG9jb21taXQuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXV0b2NvbW1pdCgpIHsKKyAgICAgICAgcmV0dXJuIGF1dG9jb21taXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdXJsLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgICByZXR1cm4gdXJsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVzZXJJZC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJJZCgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXIgbmFtZSBmb3IgdGhlIGNvbm5lY3Rpb247IHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSB1c2VySWQgVGhlIHVzZXJJZCB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyaWQoU3RyaW5nIHVzZXJJZCkgeworICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwYXNzd29yZC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gcGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcmRibXMuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZGJtcygpIHsKKyAgICAgICAgcmV0dXJuIHJkYm1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZlcnNpb24uCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdmVyc2lvbjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwNjcxMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phci5qYXZhCkBAIC0wLDAgKzEsMTA2MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYW5pZmVzdC5TZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zcGkuU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5KYXJNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRXh0cmFGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBPdXRwdXRTdHJlYW07CisKKy8qKgorICogQ3JlYXRlcyBhIEpBUiBhcmNoaXZlLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgKi8KK3B1YmxpYyBjbGFzcyBKYXIgZXh0ZW5kcyBaaXAgeworICAgIC8qKiBUaGUgaW5kZXggZmlsZSBuYW1lLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9OQU1FID0gIk1FVEEtSU5GL0lOREVYLkxJU1QiOworCisgICAgLyoqIFRoZSBtYW5pZmVzdCBmaWxlIG5hbWUuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX05BTUUgPSAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBhbGwga25vd24gU1BJIFNlcnZpY2VzCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0IHNlcnZpY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqIG1lcmdlZCBtYW5pZmVzdHMgYWRkZWQgdGhyb3VnaCBhZGRDb25maWd1cmVkTWFuaWZlc3QgKi8KKyAgICBwcml2YXRlIE1hbmlmZXN0IGNvbmZpZ3VyZWRNYW5pZmVzdDsKKworICAgIC8qKiBzaGFkb3cgb2YgdGhlIGFib3ZlIGlmIHVwVG9EYXRlIGNoZWNrIGFsdGVycyB0aGUgdmFsdWUgKi8KKyAgICBwcml2YXRlIE1hbmlmZXN0IHNhdmVkQ29uZmlndXJlZE1hbmlmZXN0OworCisgICAgLyoqICBtZXJnZWQgbWFuaWZlc3RzIGFkZGVkIHRocm91Z2ggZmlsZXNldHMgKi8KKyAgICBwcml2YXRlIE1hbmlmZXN0IGZpbGVzZXRNYW5pZmVzdDsKKworICAgIC8qKgorICAgICAqIE1hbmlmZXN0IG9mIG9yaWdpbmFsIGFyY2hpdmUsIHdpbGwgYmUgc2V0IHRvIG51bGwgaWYgbm90IGluCisgICAgICogdXBkYXRlIG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBNYW5pZmVzdCBvcmlnaW5hbE1hbmlmZXN0OworCisgICAgLyoqCisgICAgICogIHdoZXRoZXIgdG8gbWVyZ2UgZmlsZXNldCBtYW5pZmVzdHM7CisgICAgICogIHZhbHVlIGlzIHRydWUgaWYgZmlsZXNldG1hbmlmZXN0IGlzICdtZXJnZScgb3IgJ21lcmdld2l0aG91dG1haW4nCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlc2V0TWFuaWZlc3RDb25maWcgZmlsZXNldE1hbmlmZXN0Q29uZmlnOworCisgICAgLyoqCisgICAgICogd2hldGhlciB0byBtZXJnZSB0aGUgbWFpbiBzZWN0aW9uIG9mIGZpbGVzZXQgbWFuaWZlc3RzOworICAgICAqIHZhbHVlIGlzIHRydWUgaWYgZmlsZXNldG1hbmlmZXN0IGlzICdtZXJnZScKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWVyZ2VNYW5pZmVzdHNNYWluID0gdHJ1ZTsKKworICAgIC8qKiB0aGUgbWFuaWZlc3Qgc3BlY2lmaWVkIGJ5IHRoZSAnbWFuaWZlc3QnIGF0dHJpYnV0ZSAqKi8KKyAgICBwcml2YXRlIE1hbmlmZXN0IG1hbmlmZXN0OworCisgICAgLyoqIFRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiByZWFkaW5nIGluIGEgbWFuaWZlc3QgZmlsZSAqLworICAgIHByaXZhdGUgU3RyaW5nIG1hbmlmZXN0RW5jb2Rpbmc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSBmb3VuZCBmcm9tIHRoZSAnbWFuaWZlc3QnIGF0dHJpYnV0ZS4gIFRoaXMgY2FuIGJlCisgICAgICogZWl0aGVyIHRoZSBsb2NhdGlvbiBvZiBhIG1hbmlmZXN0LCBvciB0aGUgbmFtZSBvZiBhIGphciBhZGRlZAorICAgICAqIHRocm91Z2ggYSBmaWxlc2V0LiAgSWYgaXRzIHRoZSBuYW1lIG9mIGFuIGFkZGVkIGphciwgdGhlCisgICAgICogbWFuaWZlc3QgaXMgbG9va2VkIGZvciBpbiBNRVRBLUlORi9NQU5JRkVTVC5NRgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBtYW5pZmVzdEZpbGU7CisKKyAgICAvKiogamFyIGluZGV4IGlzIEpESyAxLjMrIG9ubHkgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW5kZXggPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIHdoZXRoZXIgdG8gcmVhbGx5IGNyZWF0ZSB0aGUgYXJjaGl2ZSBpbiBjcmVhdGVFbXB0eVppcCwgd2lsbAorICAgICAqIGdldCBzZXQgaW4gZ2V0UmVzb3VyY2VzVG9BZGQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUVtcHR5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgYWxsIGZpbGVzIHRoYXQgYXJlIGluIHRoZSByb290IG9mIHRoZSBhcmNoaXZlIChpLmUuIHRoYXQKKyAgICAgKiBoYXZlIGEgbmFtZSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIHNsYXNoKSBzbyB0aGV5IGNhbiBnZXQKKyAgICAgKiBsaXN0ZWQgaW4gdGhlIGluZGV4LgorICAgICAqCisgICAgICogV2lsbCBub3QgYmUgZmlsbGVkIHVubGVzcyB0aGUgdXNlciBoYXMgYXNrZWQgZm9yIGFuIGluZGV4LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciByb290RW50cmllczsKKworICAgIC8qKgorICAgICAqIFBhdGggY29udGFpbmluZyBqYXJzIHRoYXQgc2hhbGwgYmUgaW5kZXhlZCBpbiBhZGRpdGlvbiB0byB0aGlzIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHJpdmF0ZSBQYXRoIGluZGV4SmFyczsKKworICAgIC8vIENoZWNrU3R5bGU6TGluZUxlbmd0aCBPRkYgLSBMaW5rIGlzIHRvbyBsb25nLgorICAgIC8qKgorICAgICAqIFN0cmljdCBtb2RlIGZvciBjaGVja2luZyBydWxlcyBvZiB0aGUgSkFSLVNwZWNpZmljYXRpb24uCisgICAgICogQHNlZSBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvdmVyc2lvbmluZy9zcGVjL1ZlcnNpb25pbmdTcGVjaWZpY2F0aW9uLmh0bWwjUGFja2FnZVZlcnNpb25pbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmljdE1vZGUgc3RyaWN0ID0gbmV3IFN0cmljdE1vZGUoImlnbm9yZSIpOworCisgICAgLy8gQ2hlY2tTdHlsZTpMaW5lTGVuZ3RoIE9OCisKKyAgICAvKioKKyAgICAgKiBFeHRyYSBmaWVsZHMgbmVlZGVkIHRvIG1ha2UgU29sYXJpcyByZWNvZ25pemUgdGhlIGFyY2hpdmUgYXMgYSBqYXIgZmlsZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBaaXBFeHRyYUZpZWxkW10gSkFSX01BUktFUiA9IG5ldyBaaXBFeHRyYUZpZWxkW10geworICAgICAgICBKYXJNYXJrZXIuZ2V0SW5zdGFuY2UoKQorICAgIH07CisKKyAgICAvKiogY29uc3RydWN0b3IgKi8KKyAgICBwdWJsaWMgSmFyKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBhcmNoaXZlVHlwZSA9ICJqYXIiOworICAgICAgICBlbXB0eUJlaGF2aW9yID0gImNyZWF0ZSI7CisgICAgICAgIHNldEVuY29kaW5nKCJVVEY4Iik7CisgICAgICAgIHJvb3RFbnRyaWVzID0gbmV3IFZlY3RvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdCB1c2VkIGZvciBqYXIgZmlsZXMuCisgICAgICogQHBhcmFtIHdlIG5vdCB1c2VkCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdoZW5lbXB0eShXaGVuRW1wdHkgd2UpIHsKKyAgICAgICAgbG9nKCJKQVJzIGFyZSBuZXZlciBlbXB0eSwgdGhleSBjb250YWluIGF0IGxlYXN0IGEgbWFuaWZlc3QgZmlsZSIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgYSBqYXIgZmlsZSBzaG91bGQgYmUgY3JlYXRlZCB3aGVuIGl0IHdvdWxkIG9ubHkgY29udGFpbiBhCisgICAgICogbWFuaWZlc3QgZmlsZS4KKyAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiA8Y29kZT5mYWlsPC9jb2RlPiAodGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICogYW5kIGhhbHQgdGhlIGJ1aWxkKTsgPGNvZGU+c2tpcDwvY29kZT4gKGRvIG5vdCBjcmVhdGUKKyAgICAgKiBhbnkgYXJjaGl2ZSwgYnV0IGlzc3VlIGEgd2FybmluZyk7IDxjb2RlPmNyZWF0ZTwvY29kZT4KKyAgICAgKiAobWFrZSBhbiBhcmNoaXZlIHdpdGggb25seSBhIG1hbmlmZXN0IGZpbGUpLgorICAgICAqIERlZmF1bHQgaXMgPGNvZGU+Y3JlYXRlPC9jb2RlPjsKKyAgICAgKiBAcGFyYW0gd2UgYSA8Y29kZT5XaGVuRW1wdHk8L2NvZGU+IGVudW1lcmF0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaGVubWFuaWZlc3Rvbmx5KFdoZW5FbXB0eSB3ZSkgeworICAgICAgICBlbXB0eUJlaGF2aW9yID0gd2UuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY3RpdmF0ZSB0aGUgc3RyaWN0IG1vZGUuIFdoZW4gc2V0IHRvIDxpPnRydWU8L2k+IGEgQnVpbGRFeGNlcHRpb24KKyAgICAgKiB3aWxsIGJlIHRocm93biBpZiB0aGUgSmFyLVBhY2thZ2luZyBzcGVjaWZpY2F0aW9uIHdhcyBicm9rZW4uCisgICAgICogQHBhcmFtIHN0cmljdCBOZXcgdmFsdWUgb2YgdGhlIHN0cmljdCBtb2RlLgorICAgICAqIEBzaW5jZSBBbnQgMS43LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3QoU3RyaWN0TW9kZSBzdHJpY3QpIHsKKyAgICAgICAgdGhpcy5zdHJpY3QgPSBzdHJpY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBmaWxlLgorICAgICAqIEBwYXJhbSBqYXJGaWxlIHRoZSBkZXN0aW5hdGlvbiBmaWxlCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS41LnguCisgICAgICogICAgICAgICAgICAgVXNlIHNldERlc3RGaWxlKEZpbGUpIGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SmFyZmlsZShGaWxlIGphckZpbGUpIHsKKyAgICAgICAgc2V0RGVzdEZpbGUoamFyRmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgb3Igbm90IHRvIGNyZWF0ZSBhbiBpbmRleCBsaXN0IGZvciBjbGFzc2VzLgorICAgICAqIFRoaXMgbWF5IHNwZWVkIHVwIGNsYXNzbG9hZGluZyBpbiBzb21lIGNhc2VzLgorICAgICAqIEBwYXJhbSBmbGFnIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmRleChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaW5kZXggPSBmbGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIGluIHRoZSBtYW5pZmVzdCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmlmZXN0RW5jb2RpbmcgdGhlIGNoYXJhY3RlciBlbmNvZGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hbmlmZXN0RW5jb2RpbmcoU3RyaW5nIG1hbmlmZXN0RW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5tYW5pZmVzdEVuY29kaW5nID0gbWFuaWZlc3RFbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgdGhlIG1hbmlmZXN0IGZvciB0aGUgYXJjaGl2ZSBmaWxlIHRvIGJlIHByb3ZpZGVkIGlubGluZQorICAgICAqIGluIHRoZSBidWlsZCBmaWxlIHJhdGhlciB0aGFuIGluIGFuIGV4dGVybmFsIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3TWFuaWZlc3QgYW4gZW1iZWRkZWQgbWFuaWZlc3QgZWxlbWVudAorICAgICAqIEB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkTWFuaWZlc3QoTWFuaWZlc3QgbmV3TWFuaWZlc3QpCisgICAgICAgIHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb25maWd1cmVkTWFuaWZlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlndXJlZE1hbmlmZXN0ID0gbmV3TWFuaWZlc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWd1cmVkTWFuaWZlc3QubWVyZ2UobmV3TWFuaWZlc3QpOworICAgICAgICB9CisgICAgICAgIHNhdmVkQ29uZmlndXJlZE1hbmlmZXN0ID0gY29uZmlndXJlZE1hbmlmZXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS4gVGhpcyBjYW4gYmUgZWl0aGVyIHRoZSBsb2NhdGlvbiBvZiBhIG1hbmlmZXN0LAorICAgICAqIG9yIHRoZSBuYW1lIG9mIGEgamFyIGFkZGVkIHRocm91Z2ggYSBmaWxlc2V0LiBJZiBpdHMgdGhlIG5hbWUgb2YgYW4gYWRkZWQKKyAgICAgKiBqYXIsIHRoZSB0YXNrIGV4cGVjdHMgdGhlIG1hbmlmZXN0IHRvIGJlIGluIHRoZSBqYXIgYXQgTUVUQS1JTkYvTUFOSUZFU1QuTUYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuaWZlc3RGaWxlIHRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChGaWxlIG1hbmlmZXN0RmlsZSkgeworICAgICAgICBpZiAoIW1hbmlmZXN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNYW5pZmVzdCBmaWxlOiAiICsgbWFuaWZlc3RGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0LiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5tYW5pZmVzdEZpbGUgPSBtYW5pZmVzdEZpbGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBNYW5pZmVzdCBnZXRNYW5pZmVzdChGaWxlIG1hbmlmZXN0RmlsZSkgeworCisgICAgICAgIE1hbmlmZXN0IG5ld01hbmlmZXN0ID0gbnVsbDsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0RmlsZSk7CisgICAgICAgICAgICBpZiAobWFuaWZlc3RFbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsIG1hbmlmZXN0RW5jb2RpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3TWFuaWZlc3QgPSBnZXRNYW5pZmVzdChpc3IpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2Rpbmcgd2hpbGUgcmVhZGluZyBtYW5pZmVzdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIG1hbmlmZXN0IGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1hbmlmZXN0RmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpc3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdNYW5pZmVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgamFyRmlsZSBkb2Vzbid0IGNvbnRhaW4gYSBtYW5pZmVzdCwgdGhlCisgICAgICogbWFuaWZlc3Qgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hbmlmZXN0IGdldE1hbmlmZXN0RnJvbUphcihGaWxlIGphckZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFppcEZpbGUgemYgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgemYgPSBuZXcgWmlwRmlsZShqYXJGaWxlKTsKKworICAgICAgICAgICAgLy8gbXVzdCBub3QgdXNlIGdldEVudHJ5IGFzICJ3ZWxsIGJlaGF2aW5nIiBhcHBsaWNhdGlvbnMKKyAgICAgICAgICAgIC8vIG11c3QgYWNjZXB0IHRoZSBtYW5pZmVzdCBpbiBhbnkgY2FwaXRhbGl6YXRpb24KKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB6Zi5lbnRyaWVzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFppcEVudHJ5IHplID0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHplLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1BTklGRVNUX05BTUUpKSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoemYuZ2V0SW5wdXRTdHJlYW0oemUpLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbmlmZXN0KGlzcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoemYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHpmLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBYWFggLSBsb2cgYW4gZXJyb3I/ICB0aHJvdyBhbiBleGNlcHRpb24/CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNYW5pZmVzdCBnZXRNYW5pZmVzdChSZWFkZXIgcikgeworCisgICAgICAgIE1hbmlmZXN0IG5ld01hbmlmZXN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ld01hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KHIpOworICAgICAgICB9IGNhdGNoIChNYW5pZmVzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIk1hbmlmZXN0IGlzIGludmFsaWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBNYW5pZmVzdDogIiArIG1hbmlmZXN0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCBtYW5pZmVzdCBmaWxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3TWFuaWZlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVoYXZpb3Igd2hlbiBhIE1hbmlmZXN0IGlzIGZvdW5kIGluIGEgemlwZmlsZXNldCBvciB6aXBncm91cGZpbGVzZXQgZmlsZS4KKyAgICAgKiBWYWxpZCB2YWx1ZXMgYXJlICJza2lwIiwgIm1lcmdlIiwgYW5kICJtZXJnZXdpdGhvdXRtYWluIi4KKyAgICAgKiAibWVyZ2UiIHdpbGwgbWVyZ2UgYWxsIG9mIG1hbmlmZXN0cyB0b2dldGhlciwgYW5kIG1lcmdlIHRoaXMgaW50byBhbnkKKyAgICAgKiBvdGhlciBzcGVjaWZpZWQgbWFuaWZlc3RzLgorICAgICAqICJtZXJnZXdpdGhvdXRtYWluIiBtZXJnZXMgZXZlcnl0aGluZyBidXQgdGhlIE1haW4gc2VjdGlvbiBvZiB0aGUgbWFuaWZlc3RzLgorICAgICAqIERlZmF1bHQgdmFsdWUgaXMgInNraXAiLgorICAgICAqCisgICAgICogTm90ZTogaWYgdGhpcyBhdHRyaWJ1dGUncyB2YWx1ZSBpcyBub3QgInNraXAiLCB0aGUgY3JlYXRlZCBqYXIgd2lsbCBub3QKKyAgICAgKiBiZSByZWFkYWJsZSBieSB1c2luZyBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHNldHRpbmcgZm9yIGZvdW5kIG1hbmlmZXN0IGJlaGF2aW9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVzZXRtYW5pZmVzdChGaWxlc2V0TWFuaWZlc3RDb25maWcgY29uZmlnKSB7CisgICAgICAgIGZpbGVzZXRNYW5pZmVzdENvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgbWVyZ2VNYW5pZmVzdHNNYWluID0gIm1lcmdlIi5lcXVhbHMoY29uZmlnLmdldFZhbHVlKCkpOworCisgICAgICAgIGlmIChmaWxlc2V0TWFuaWZlc3RDb25maWcgIT0gbnVsbAorICAgICAgICAgICAgJiYgIWZpbGVzZXRNYW5pZmVzdENvbmZpZy5nZXRWYWx1ZSgpLmVxdWFscygic2tpcCIpKSB7CisKKyAgICAgICAgICAgIGRvdWJsZUZpbGVQYXNzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSB6aXBmaWxlc2V0IHRvIGluY2x1ZGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcyB6aXBmaWxlc2V0IHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFpbmYoWmlwRmlsZVNldCBmcykgeworICAgICAgICAvLyBXZSBqdXN0IHNldCB0aGUgcHJlZml4IGZvciB0aGlzIGZpbGVzZXQsIGFuZCBwYXNzIGl0IHVwLgorICAgICAgICBmcy5zZXRQcmVmaXgoIk1FVEEtSU5GLyIpOworICAgICAgICBzdXBlci5hZGRGaWxlc2V0KGZzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwYXRoIHRvIGluZGV4IGphcnMuCisgICAgICogQHBhcmFtIHAgYSBwYXRoCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRJbmRleEphcnMoUGF0aCBwKSB7CisgICAgICAgIGlmIChpbmRleEphcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgaW5kZXhKYXJzID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICBpbmRleEphcnMuYXBwZW5kKHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbmVzdGVkIFNQSSBzZXJ2aWNlIGVsZW1lbnQuCisgICAgICogQHBhcmFtIHNlcnZpY2UgdGhlIG5lc3RlZCBlbGVtZW50LgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZXJ2aWNlIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5CisgICAgICAgIHNlcnZpY2UuY2hlY2soKTsKKyAgICAgICAgc2VydmljZUxpc3QuYWRkKHNlcnZpY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIFNQSSBJbmZvcm1hdGlvbiB0byBKQVIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVTZXJ2aWNlcyhaaXBPdXRwdXRTdHJlYW0gek91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSXRlcmF0b3Igc2VydmljZUl0ZXJhdG9yOworICAgICAgICBTZXJ2aWNlIHNlcnZpY2U7CisKKyAgICAgICAgc2VydmljZUl0ZXJhdG9yID0gc2VydmljZUxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHNlcnZpY2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAvL3N0b2xlbiBmcm9tIHdyaXRlTWFuaWZlc3QKKyAgICAgICAgICAgc3VwZXIuemlwRmlsZShzZXJ2aWNlLmdldEFzU3RyZWFtKCksIHpPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk1FVEEtSU5GL3NlcnZpY2VzLyIgKyBzZXJ2aWNlLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBaaXBGaWxlU2V0LkRFRkFVTFRfRklMRV9NT0RFKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgemlwIG91dHB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIHpPdXQgdGhlIHppcCBvdXRwdXQgc3RyZWFtCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBJL08gZXJyb3JzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBvdGhlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0WmlwT3V0cHV0U3RyZWFtKFppcE91dHB1dFN0cmVhbSB6T3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoIXNraXBXcml0aW5nKSB7CisgICAgICAgICAgICBNYW5pZmVzdCBqYXJNYW5pZmVzdCA9IGNyZWF0ZU1hbmlmZXN0KCk7CisgICAgICAgICAgICB3cml0ZU1hbmlmZXN0KHpPdXQsIGphck1hbmlmZXN0KTsKKyAgICAgICAgICAgIHdyaXRlU2VydmljZXMoek91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1hbmlmZXN0IGNyZWF0ZU1hbmlmZXN0KCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1hbmlmZXN0IGZpbmFsTWFuaWZlc3QgPSBNYW5pZmVzdC5nZXREZWZhdWx0TWFuaWZlc3QoKTsKKworICAgICAgICAgICAgaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCBnb3QgdGhlIG1hbmlmZXN0IHlldCwgYXR0ZW1wdCB0bworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaXQgbm93IGFuZCBoYXZlIG1hbmlmZXN0IGJlIHRoZSBmaW5hbCBtZXJnZQorICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KG1hbmlmZXN0RmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUHJlY2VkZW5jZTogbWFuaWZlc3RGaWxlIHdpbnMgb3ZlciBpbmxpbmUgbWFuaWZlc3QsCisgICAgICAgICAgICAgKiBvdmVyIG1hbmlmZXN0cyByZWFkIGZyb20gdGhlIGZpbGVzZXRzIG92ZXIgdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgKiBtYW5pZmVzdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBtZXJnZSB3aXRoIG51bGwgYXJndW1lbnQgaXMgYSBuby1vcAorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGlmIChpc0luVXBkYXRlTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgZmluYWxNYW5pZmVzdC5tZXJnZShvcmlnaW5hbE1hbmlmZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsTWFuaWZlc3QubWVyZ2UoZmlsZXNldE1hbmlmZXN0KTsKKyAgICAgICAgICAgIGZpbmFsTWFuaWZlc3QubWVyZ2UoY29uZmlndXJlZE1hbmlmZXN0KTsKKyAgICAgICAgICAgIGZpbmFsTWFuaWZlc3QubWVyZ2UobWFuaWZlc3QsICFtZXJnZU1hbmlmZXN0c01haW4pOworCisgICAgICAgICAgICByZXR1cm4gZmluYWxNYW5pZmVzdDsKKworICAgICAgICB9IGNhdGNoIChNYW5pZmVzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIk1hbmlmZXN0IGlzIGludmFsaWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBNYW5pZmVzdCIsIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWFuaWZlc3QoWmlwT3V0cHV0U3RyZWFtIHpPdXQsIE1hbmlmZXN0IG1hbmlmZXN0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBtYW5pZmVzdC5nZXRXYXJuaW5ncygpOworICAgICAgICAgICAgIGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBsb2coIk1hbmlmZXN0IHdhcm5pbmc6ICIgKyBlLm5leHRFbGVtZW50KCksCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKworICAgICAgICB6aXBEaXIobnVsbCwgek91dCwgIk1FVEEtSU5GLyIsIFppcEZpbGVTZXQuREVGQVVMVF9ESVJfTU9ERSwKKyAgICAgICAgICAgICAgIEpBUl9NQVJLRVIpOworICAgICAgICAvLyB0aW1lIHRvIHdyaXRlIHRoZSBtYW5pZmVzdAorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYmFvcywgTWFuaWZlc3QuSkFSX0VOQ09ESU5HKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG9zdyk7CisgICAgICAgIG1hbmlmZXN0LndyaXRlKHdyaXRlcik7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPQorICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIHN1cGVyLnppcEZpbGUoYmFpcywgek91dCwgTUFOSUZFU1RfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICBaaXBGaWxlU2V0LkRFRkFVTFRfRklMRV9NT0RFKTsKKyAgICAgICAgc3VwZXIuaW5pdFppcE91dHB1dFN0cmVhbSh6T3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSB0aGUgemlwIG91dHB1dCBzdHJlYW0uCisgICAgICogVGhpcyBjcmVhdGVzIGFuIGluZGV4IGxpc3QgaWYgdGhlIGluZGV4IGF0dHJpYnV0ZSBpcyB0cnVlLgorICAgICAqIEBwYXJhbSB6T3V0IHRoZSB6aXAgb3V0cHV0IHN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gSS9PIGVycm9ycworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gb3RoZXIgZXJyb3JzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemVaaXBPdXRwdXRTdHJlYW0oWmlwT3V0cHV0U3RyZWFtIHpPdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIGlmIChpbmRleCkgeworICAgICAgICAgICAgY3JlYXRlSW5kZXhMaXN0KHpPdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBpbmRleCBsaXN0IHRvIHNwZWVkIHVwIGNsYXNzbG9hZGluZy4KKyAgICAgKiBUaGlzIGlzIGEgSkRLIDEuMysgc3BlY2lmaWMgZmVhdHVyZSBhbmQgaXMgZW5hYmxlZCBieSBkZWZhdWx0LiBTZWUKKyAgICAgKiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvamFyL2phci5odG1sI0pBUiUyMEluZGV4Ij4KKyAgICAgKiB0aGUgSkFSIGluZGV4IHNwZWNpZmljYXRpb248L2E+IGZvciBtb3JlIGRldGFpbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gek91dCB0aGUgemlwIHN0cmVhbSByZXByZXNlbnRpbmcgdGhlIGphciBiZWluZyBidWlsdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBjcmVhdGluZyB0aGUKKyAgICAgKiBpbmRleCBhbmQgYWRkaW5nIGl0IHRvIHRoZSB6aXAgc3RyZWFtLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVJbmRleExpc3QoWmlwT3V0cHV0U3RyZWFtIHpPdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAvLyBlbmNvZGluZyBtdXN0IGJlIFVURjggYXMgc3BlY2lmaWVkIGluIHRoZSBzcGVjcy4KKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYmFvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURjgiKSk7CisKKyAgICAgICAgLy8gdmVyc2lvbi1pbmZvIGJsYW5rbGluZQorICAgICAgICB3cml0ZXIucHJpbnRsbigiSmFySW5kZXgtVmVyc2lvbjogMS4wIik7CisgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisKKyAgICAgICAgLy8gaGVhZGVyIG5ld2xpbmUKKyAgICAgICAgd3JpdGVyLnByaW50bG4oemlwRmlsZS5nZXROYW1lKCkpOworCisgICAgICAgIHdyaXRlSW5kZXhMaWtlTGlzdChuZXcgQXJyYXlMaXN0KGFkZGVkRGlycy5rZXlTZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByb290RW50cmllcywgd3JpdGVyKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKworICAgICAgICBpZiAoaW5kZXhKYXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1hbmlmZXN0IG1mID0gY3JlYXRlTWFuaWZlc3QoKTsKKyAgICAgICAgICAgIE1hbmlmZXN0LkF0dHJpYnV0ZSBjbGFzc3BhdGggPQorICAgICAgICAgICAgICAgIG1mLmdldE1haW5TZWN0aW9uKCkuZ2V0QXR0cmlidXRlKE1hbmlmZXN0LkFUVFJJQlVURV9DTEFTU1BBVEgpOworICAgICAgICAgICAgU3RyaW5nW10gY3BFbnRyaWVzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCAmJiBjbGFzc3BhdGguZ2V0VmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NwYXRoLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiKTsKKyAgICAgICAgICAgICAgICBjcEVudHJpZXMgPSBuZXcgU3RyaW5nW3Rvay5jb3VudFRva2VucygpXTsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY3BFbnRyaWVzW2MrK10gPSB0b2submV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gaW5kZXhKYXJFbnRyaWVzID0gaW5kZXhKYXJzLmxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhKYXJFbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaW5kSmFyTmFtZShpbmRleEphckVudHJpZXNbaV0sIGNwRW50cmllcyk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgZGlycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICBncmFiRmlsZXNBbmREaXJzKGluZGV4SmFyRW50cmllc1tpXSwgZGlycywgZmlsZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlycy5zaXplKCkgKyBmaWxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSW5kZXhMaWtlTGlzdChkaXJzLCBmaWxlcywgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9CisgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgc3VwZXIuemlwRmlsZShiYWlzLCB6T3V0LCBJTkRFWF9OQU1FLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICBaaXBGaWxlU2V0LkRFRkFVTFRfRklMRV9NT0RFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIGZyb20gWmlwIGNsYXNzIHRvIGRlYWwgd2l0aCBtYW5pZmVzdHMgYW5kIGluZGV4IGxpc3RzLgorICAgICAqIEBwYXJhbSBpcyB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHpPdXQgdGhlIHppcCBvdXRwdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHZQYXRoIHRoZSBuYW1lIHRoaXMgZW50cnkgc2hhbGwgaGF2ZSBpbiB0aGUgYXJjaGl2ZQorICAgICAqIEBwYXJhbSBsYXN0TW9kaWZpZWQgbGFzdCBtb2RpZmljYXRpb24gdGltZSBmb3IgdGhlIGVudHJ5LgorICAgICAqIEBwYXJhbSBmcm9tQXJjaGl2ZSB0aGUgb3JpZ2luYWwgYXJjaGl2ZSB3ZSBhcmUgY29weWluZyB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgIGVudHJ5IGZyb20sIHdpbGwgYmUgbnVsbCBpZiB3ZSBhcmUgbm90IGNvcHlpbmcgZnJvbSBhbiBhcmNoaXZlLgorICAgICAqIEBwYXJhbSBtb2RlIHRoZSBVbml4IHBlcm1pc3Npb25zIHRvIHNldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgemlwRmlsZShJbnB1dFN0cmVhbSBpcywgWmlwT3V0cHV0U3RyZWFtIHpPdXQsIFN0cmluZyB2UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkLCBGaWxlIGZyb21BcmNoaXZlLCBpbnQgbW9kZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKE1BTklGRVNUX05BTUUuZXF1YWxzSWdub3JlQ2FzZSh2UGF0aCkpICB7CisgICAgICAgICAgICBpZiAoIWRvdWJsZUZpbGVQYXNzIHx8IHNraXBXcml0aW5nKSB7CisgICAgICAgICAgICAgICAgZmlsZXNldE1hbmlmZXN0KGZyb21BcmNoaXZlLCBpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoSU5ERVhfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHZQYXRoKSAmJiBpbmRleCkgeworICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBzZWxlY3RlZCAiICsgYXJjaGl2ZVR5cGUKKyAgICAgICAgICAgICAgICArICIgZmlsZXMgaW5jbHVkZSBhIE1FVEEtSU5GL0lOREVYLkxJU1Qgd2hpY2ggd2lsbCIKKyAgICAgICAgICAgICAgICArICIgYmUgcmVwbGFjZWQgYnkgYSBuZXdseSBnZW5lcmF0ZWQgb25lLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGluZGV4ICYmIHZQYXRoLmluZGV4T2YoIi8iKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJvb3RFbnRyaWVzLmFkZEVsZW1lbnQodlBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuemlwRmlsZShpcywgek91dCwgdlBhdGgsIGxhc3RNb2RpZmllZCwgZnJvbUFyY2hpdmUsIG1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbGVzZXRNYW5pZmVzdChGaWxlIGZpbGUsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobWFuaWZlc3RGaWxlICE9IG51bGwgJiYgbWFuaWZlc3RGaWxlLmVxdWFscyhmaWxlKSkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgc2FtZSBuYW1lIHNwZWNpZmllZCBpbiAnbWFuaWZlc3QnLCB0aGlzCisgICAgICAgICAgICAvLyBpcyB0aGUgbWFuaWZlc3QgdG8gdXNlCisgICAgICAgICAgICBsb2coIkZvdW5kIG1hbmlmZXN0ICIgKyBmaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyOworICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3RFbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBtYW5pZmVzdEVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KGlzcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdChmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGVuY29kaW5nIHdoaWxlIHJlYWRpbmcgIgorICAgICAgICAgICAgICAgICAgICArICJtYW5pZmVzdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmaWxlc2V0TWFuaWZlc3RDb25maWcgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiAhZmlsZXNldE1hbmlmZXN0Q29uZmlnLmdldFZhbHVlKCkuZXF1YWxzKCJza2lwIikpIHsKKyAgICAgICAgICAgIC8vIHdlIGFkZCB0aGlzIHRvIG91ciBncm91cCBvZiBmaWxlc2V0IG1hbmlmZXN0cworICAgICAgICAgICAgbG9nKCJGb3VuZCBtYW5pZmVzdCB0byBtZXJnZSBpbiBmaWxlICIgKyBmaWxlLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1hbmlmZXN0IG5ld01hbmlmZXN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3I7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdEVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIG1hbmlmZXN0RW5jb2RpbmcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5ld01hbmlmZXN0ID0gZ2V0TWFuaWZlc3QoaXNyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZXdNYW5pZmVzdCA9IGdldE1hbmlmZXN0KGZpbGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmaWxlc2V0TWFuaWZlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaWxlc2V0TWFuaWZlc3QgPSBuZXdNYW5pZmVzdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWxlc2V0TWFuaWZlc3QubWVyZ2UobmV3TWFuaWZlc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2Rpbmcgd2hpbGUgcmVhZGluZyAiCisgICAgICAgICAgICAgICAgICAgICsgIm1hbmlmZXN0OiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFuaWZlc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZygiTWFuaWZlc3QgaW4gZmlsZSAiICsgZmlsZSArICIgaXMgaW52YWxpZDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBNYW5pZmVzdCIsIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gYXNzdW1pbmcgJ3NraXAnIG90aGVyd2lzZQorICAgICAgICAgICAgLy8gZG9uJ3Qgd2FybiBpZiBza2lwIGhhcyBiZWVuIHJlcXVlc3RlZCBleHBsaWNpdGx5LCB3YXJuIGlmIHVzZXIKKyAgICAgICAgICAgIC8vIGRpZG4ndCBzZXQgdGhlIGF0dHJpYnV0ZQorCisgICAgICAgICAgICAvLyBIaWRlIHdhcm5pbmcgYWxzbyBhcyBpdCBtYWtlcyBubyBzZW5zZSBzaW5jZQorICAgICAgICAgICAgLy8gdGhlIGZpbGVzZXRtYW5pZmVzdCBhdHRyaWJ1dGUgaXRzZWxmIGhhcyBiZWVuCisgICAgICAgICAgICAvLyBoaWRkZW4KKworICAgICAgICAgICAgLy9pbnQgbG9nTGV2ZWwgPSBmaWxlc2V0TWFuaWZlc3RDb25maWcgPT0gbnVsbCA/CisgICAgICAgICAgICAvLyAgICBQcm9qZWN0Lk1TR19XQVJOIDogUHJvamVjdC5NU0dfVkVSQk9TRTsKKyAgICAgICAgICAgIC8vbG9nKCJGaWxlICIgKyBmaWxlCisgICAgICAgICAgICAvLyAgICArICIgaW5jbHVkZXMgYSBNRVRBLUlORi9NQU5JRkVTVC5NRiB3aGljaCB3aWxsIGJlIGlnbm9yZWQuICIKKyAgICAgICAgICAgIC8vICAgICsgIlRvIGluY2x1ZGUgdGhpcyBmaWxlLCBzZXQgZmlsZXNldE1hbmlmZXN0IHRvIGEgdmFsdWUgb3RoZXIgIgorICAgICAgICAgICAgLy8gICAgKyAidGhhbiAnc2tpcCcuIiwgbG9nTGV2ZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdCB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIG5ld2VyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBlbnRyaWVzIChvciBtaXNzaW5nKSBpbiB0aGUgb3JpZ2luYWwgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIDxwPklmIHdlIGFyZSBnb2luZyB0byByZWNyZWF0ZSB0aGUgYXJjaGl2ZSBpbnN0ZWFkIG9mIHVwZGF0aW5nCisgICAgICogaXQsIGFsbCByZXNvdXJjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgbmV3LCBpZiBhIHNpbmdsZSBvbmUKKyAgICAgKiBpcy4gIEJlY2F1c2Ugb2YgdGhpcywgc3ViY2xhc3NlcyBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIG11c3QKKyAgICAgKiBjYWxsIDxjb2RlPnN1cGVyLmdldFJlc291cmNlc1RvQWRkPC9jb2RlPiBhbmQgaW5kaWNhdGUgd2l0aCB0aGUKKyAgICAgKiB0aGlyZCBhcmcgaWYgdGhleSBhbHJlYWR5IGtub3cgdGhhdCB0aGUgYXJjaGl2ZSBpcworICAgICAqIG91dC1vZi1kYXRlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByY3MgVGhlIHJlc291cmNlIGNvbGxlY3Rpb25zIHRvIGdyYWIgcmVzb3VyY2VzIGZyb20KKyAgICAgKiBAcGFyYW0gemlwRmlsZSBpbnRlbmRlZCBhcmNoaXZlIGZpbGUgKG1heSBvciBtYXkgbm90IGV4aXN0KQorICAgICAqIEBwYXJhbSBuZWVkc1VwZGF0ZSB3aGV0aGVyIHdlIGFscmVhZHkga25vdyB0aGF0IHRoZSBhcmNoaXZlIGlzCisgICAgICogb3V0LW9mLWRhdGUuICBTdWJjbGFzc2VzIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgYXJlIHN1cHBvc2VkIHRvCisgICAgICogc2V0IHRoaXMgdmFsdWUgY29ycmVjdGx5IGluIHRoZWlyIGNhbGwgdG8KKyAgICAgKiBzdXBlci5nZXRSZXNvdXJjZXNUb0FkZC4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJlc291cmNlcyB0byBhZGQgZm9yIGVhY2ggZmlsZXNldCBwYXNzZWQgaW4gYXMgd2VsbAorICAgICAqICAgICAgICAgYXMgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFyY2hpdmUgaXMgdXB0b2RhdGUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGl0IGxpa2VzCisgICAgICovCisgICAgcHJvdGVjdGVkIEFyY2hpdmVTdGF0ZSBnZXRSZXNvdXJjZXNUb0FkZChSZXNvdXJjZUNvbGxlY3Rpb25bXSByY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHppcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRzVXBkYXRlKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIG5lZWQgdG8gaGFuZGxlIG1hbmlmZXN0IGFzIGEgc3BlY2lhbCBjaGVjaworICAgICAgICBpZiAoemlwRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgLy8gaWYgaXQgZG9lc24ndCBleGlzdCwgaXQgd2lsbCBnZXQgY3JlYXRlZCBhbnl3YXksIGRvbid0CisgICAgICAgICAgICAvLyBib3RoZXIgd2l0aCBhbnkgdXAtdG8tZGF0ZSBjaGVja3MuCisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JpZ2luYWxNYW5pZmVzdCA9IGdldE1hbmlmZXN0RnJvbUphcih6aXBGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxNYW5pZmVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiVXBkYXRpbmcgamFyIHNpbmNlIHRoZSBjdXJyZW50IGphciBoYXMgbm8gbWFuaWZlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdCBtZiA9IGNyZWF0ZU1hbmlmZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWYuZXF1YWxzKG9yaWdpbmFsTWFuaWZlc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlVwZGF0aW5nIGphciBzaW5jZSBqYXIgbWFuaWZlc3QgaGFzIGNoYW5nZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBsb2coImVycm9yIHdoaWxlIHJlYWRpbmcgb3JpZ2luYWwgbWFuaWZlc3QgaW4gZmlsZTogIgorICAgICAgICAgICAgICAgICAgICArIHppcEZpbGUudG9TdHJpbmcoKSArIHQuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vIGV4aXN0aW5nIGFyY2hpdmUKKyAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNyZWF0ZUVtcHR5ID0gbmVlZHNVcGRhdGU7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRSZXNvdXJjZXNUb0FkZChyY3MsIHppcEZpbGUsIG5lZWRzVXBkYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gZW1wdHkgamFyIGZpbGUuCisgICAgICogQHBhcmFtIHppcEZpbGUgdGhlIGZpbGUgdG8gY3JlYXRlCisgICAgICogQHJldHVybiB0cnVlIGZvciBoaXN0b3JpYyByZWFzb25zCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZUVtcHR5WmlwKEZpbGUgemlwRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFjcmVhdGVFbXB0eSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW1wdHlCZWhhdmlvci5lcXVhbHMoInNraXAiKSkgeworICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogc2tpcHBpbmcgIiArIGFyY2hpdmVUeXBlICsgIiBhcmNoaXZlICIKKyAgICAgICAgICAgICAgICAgICAgKyB6aXBGaWxlICsgIiBiZWNhdXNlIG5vIGZpbGVzIHdlcmUgaW5jbHVkZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoZW1wdHlCZWhhdmlvci5lcXVhbHMoImZhaWwiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlICIgKyBhcmNoaXZlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcmNoaXZlICIgKyB6aXBGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBubyBmaWxlcyB3ZXJlIGluY2x1ZGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBaaXBPdXRwdXRTdHJlYW0gek91dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2coIkJ1aWxkaW5nIE1BTklGRVNULW9ubHkgamFyOiAiCisgICAgICAgICAgICAgICAgKyBnZXREZXN0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHpPdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGdldERlc3RGaWxlKCkpKTsKKworICAgICAgICAgICAgek91dC5zZXRFbmNvZGluZyhnZXRFbmNvZGluZygpKTsKKyAgICAgICAgICAgIGlmIChpc0NvbXByZXNzKCkpIHsKKyAgICAgICAgICAgICAgICB6T3V0LnNldE1ldGhvZChaaXBPdXRwdXRTdHJlYW0uREVGTEFURUQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB6T3V0LnNldE1ldGhvZChaaXBPdXRwdXRTdHJlYW0uU1RPUkVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluaXRaaXBPdXRwdXRTdHJlYW0oek91dCk7CisgICAgICAgICAgICBmaW5hbGl6ZVppcE91dHB1dFN0cmVhbSh6T3V0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgYWxtb3N0IGVtcHR5IEpBUiBhcmNoaXZlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoIiArIGlvZS5nZXRNZXNzYWdlKCkgKyAiKSIsIGlvZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIENsb3NlIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHpPdXQpOworICAgICAgICAgICAgY3JlYXRlRW1wdHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdGhpbmsgd2UgYWxyZWFkeSBoYXZlIGEgTUFOSUZFU1QgbmV4dCB0aW1lIHRoaXMgdGFzaworICAgICAqIGdldHMgZXhlY3V0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIFppcCNjbGVhblVwCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAgICAgc3VwZXIuY2xlYW5VcCgpOworICAgICAgICBjaGVja0phclNwZWMoKTsKKworICAgICAgICAvLyB3ZSB3YW50IHRvIHNhdmUgdGhpcyBpbmZvIGlmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFub3RoZXIgcGFzcworICAgICAgICBpZiAoIWRvdWJsZUZpbGVQYXNzIHx8ICFza2lwV3JpdGluZykgeworICAgICAgICAgICAgbWFuaWZlc3QgPSBudWxsOworICAgICAgICAgICAgY29uZmlndXJlZE1hbmlmZXN0ID0gc2F2ZWRDb25maWd1cmVkTWFuaWZlc3Q7CisgICAgICAgICAgICBmaWxlc2V0TWFuaWZlc3QgPSBudWxsOworICAgICAgICAgICAgb3JpZ2luYWxNYW5pZmVzdCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcm9vdEVudHJpZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICB9CisKKyAgICAvLyBDaGVja1N0eWxlOkxpbmVMZW5ndGggT0ZGIC0gTGluayBpcyB0b28gbG9uZy4KKyAgICAvKioKKyAgICAgKiBDaGVjayBhZ2FpbnN0IHBhY2thZ2luZyBzcGVjCisgICAgICogQHNlZSBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvdmVyc2lvbmluZy9zcGVjL1ZlcnNpb25pbmdTcGVjaWZpY2F0aW9uLmh0bWwjUGFja2FnZVZlcnNpb25pbmcKKyAgICAgKi8KKyAgICAvLyBDaGVja1N0eWxlOkxpbmVMZW5ndGggT04KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tKYXJTcGVjKCkgeworICAgICAgICBTdHJpbmcgYnIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTZWN0aW9uIG1haW5TZWN0aW9uID0gKGNvbmZpZ3VyZWRNYW5pZmVzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uZmlndXJlZE1hbmlmZXN0LmdldE1haW5TZWN0aW9uKCk7CisKKyAgICAgICAgaWYgKG1haW5TZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJObyBJbXBsZW1lbnRhdGlvbi1UaXRsZSBzZXQuIik7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiTm8gSW1wbGVtZW50YXRpb24tVmVyc2lvbiBzZXQuIik7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiTm8gSW1wbGVtZW50YXRpb24tVmVuZG9yIHNldC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtYWluU2VjdGlvbi5nZXRBdHRyaWJ1dGUoIkltcGxlbWVudGF0aW9uLVRpdGxlIikgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJObyBJbXBsZW1lbnRhdGlvbi1UaXRsZSBzZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlKCJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIikgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJObyBJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIHNldC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYWluU2VjdGlvbi5nZXRBdHRyaWJ1dGUoIkltcGxlbWVudGF0aW9uLVZlbmRvciIpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiTm8gSW1wbGVtZW50YXRpb24tVmVuZG9yIHNldC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoYnIpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIkxvY2F0aW9uOiAiKS5hcHBlbmQoZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChicik7CisgICAgICAgICAgICBpZiAoc3RyaWN0LmdldFZhbHVlKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmFpbCIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UudG9TdHJpbmcoKSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLnRvU3RyaW5nKCksIHN0cmljdC5nZXRMb2dMZXZlbCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHNlZSBaaXAjcmVzZXQKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjQ0LCBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHN1cGVyLnJlc2V0KCk7CisgICAgICAgIGVtcHR5QmVoYXZpb3IgPSAiY3JlYXRlIjsKKyAgICAgICAgY29uZmlndXJlZE1hbmlmZXN0ID0gbnVsbDsKKyAgICAgICAgZmlsZXNldE1hbmlmZXN0Q29uZmlnID0gbnVsbDsKKyAgICAgICAgbWVyZ2VNYW5pZmVzdHNNYWluID0gZmFsc2U7CisgICAgICAgIG1hbmlmZXN0RmlsZSA9IG51bGw7CisgICAgICAgIGluZGV4ID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1hbmlmZXN0IGNvbmZpZyBlbnVtZXJhdGVkIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlc2V0TWFuaWZlc3RDb25maWcgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbGlzdCBvZiB2YWxpZCBzdHJpbmdzLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHZhbHVlcyAtICJza2lwIiwgIm1lcmdlIiBhbmQgIm1lcmdld2l0aG91dG1haW4iCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7InNraXAiLCAibWVyZ2UiLCAibWVyZ2V3aXRob3V0bWFpbiJ9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBkaXJlY3RvcnkgZW50cmllcyBmcm9tIHRoZSBmaXJzdCBhbmQgdGhlIGZpbGVuYW1lcworICAgICAqIGZyb20gdGhlIHNlY29uZCBsaXN0IHRvIHRoZSBnaXZlbiB3cml0ZXIsIG9uZSBlbnRyeSBwZXIgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJzIGEgbGlzdCBvZiBkaXJlY3RvcmllcworICAgICAqIEBwYXJhbSBmaWxlcyBhIGxpc3Qgb2YgZmlsZXMKKyAgICAgKiBAcGFyYW0gd3JpdGVyIHRoZSB3cml0ZXIgdG8gd3JpdGUgdG8KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHdyaXRlSW5kZXhMaWtlTGlzdChMaXN0IGRpcnMsIExpc3QgZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gSmFySW5kZXggaXMgc29ydGluZyB0aGUgZGlyZWN0b3JpZXMgYnkgYXNjZW5kaW5nIG9yZGVyLgorICAgICAgICAvLyBpdCBoYXMgbm8gdmFsdWUgYnV0IGNvc21ldGljIHNpbmNlIGl0IHdpbGwgYmUgcmVhZCBpbnRvIGEKKyAgICAgICAgLy8gaGFzaHRhYmxlIGJ5IHRoZSBjbGFzc2xvYWRlciwgYnV0IHdlJ2xsIGRvIHNvIGFueXdheS4KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChkaXJzKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChmaWxlcyk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBkaXJzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGRpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworCisgICAgICAgICAgICAvLyB0cnkgdG8gYmUgc21hcnQsIG5vdCB0byBiZSBmb29sZWQgYnkgYSB3ZWlyZCBkaXJlY3RvcnkgbmFtZQorICAgICAgICAgICAgZGlyID0gZGlyLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgICAgIGlmIChkaXIuc3RhcnRzV2l0aCgiLi8iKSkgeworICAgICAgICAgICAgICAgIGRpciA9IGRpci5zdWJzdHJpbmcoMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoZGlyLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgIGRpciA9IGRpci5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcG9zID0gZGlyLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICBpZiAocG9zICE9IC0xKSB7CisgICAgICAgICAgICAgICAgZGlyID0gZGlyLnN1YnN0cmluZygwLCBwb3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsb29rcyBsaWtlIG5vdGhpbmcgZnJvbSBNRVRBLUlORiBzaG91bGQgYmUgYWRkZWQKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgY2hlY2sgaXMgbm90IGNhc2UgaW5zZW5zaXRpdmUuCisgICAgICAgICAgICAvLyBzZWUgc3VuLm1pc2MuSmFySW5kZXgKKyAgICAgICAgICAgIGlmIChkaXIuc3RhcnRzV2l0aCgiTUVUQS1JTkYiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbmFtZSBuZXdsaW5lCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihkaXIpOworICAgICAgICB9CisKKyAgICAgICAgaXRlciA9IGZpbGVzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oaXRlci5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdHJ5IHRvIGd1ZXNzIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlLgorICAgICAqCisgICAgICogPHA+SWYgdGhpcyBqYXIgaGFzIGEgY2xhc3NwYXRoIGF0dHJpYnV0ZSBpbiBpdHMgbWFuaWZlc3QsIHdlCisgICAgICogY2FuIGFzc3VtZSB0aGF0IGl0IHdpbGwgb25seSByZXF1aXJlIGFuIGluZGV4IG9mIGphcnMgbGlzdGVkCisgICAgICogdGhlcmUuICB0cnkgdG8gZmluZCB3aGljaCBjbGFzc3BhdGggZW50cnkgaXMgbW9zdCBsaWtlbHkgdGhlCisgICAgICogb25lIHRoZSBnaXZlbiBmaWxlIG5hbWUgcG9pbnRzIHRvLjwvcD4KKyAgICAgKgorICAgICAqIDxwPkluIHRoZSBhYnNlbmNlIG9mIGEgY2xhc3NwYXRoIGF0dHJpYnV0ZSwgYXNzdW1lIHRoZSBvdGhlcgorICAgICAqIGZpbGVzIHdpbGwgYmUgcGxhY2VkIGluc2lkZSB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhpcyBqYXIgYW5kCisgICAgICogdXNlIHRoZWlyIGJhc2VuYW1lLjwvcD4KKyAgICAgKgorICAgICAqIDxwPmlmIHRoZXJlIGlzIGEgY2xhc3NwYXRoIGFuZCB0aGUgZ2l2ZW4gZmlsZSBkb2Vzbid0IG1hdGNoIGFueQorICAgICAqIG9mIGl0cyBlbnRyaWVzLCByZXR1cm4gbnVsbC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIG5hbWUgdG8gbG9vayBmb3IKKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIHRoZSBjbGFzc3BhdGggdG8gbG9vayBpbiAobWF5IGJlIG51bGwpCisgICAgICogQHJldHVybiB0aGUgbWF0Y2hpbmcgZW50cnksIG9yIG51bGwgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGZpbmRKYXJOYW1lKFN0cmluZyBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBjbGFzc3BhdGgpIHsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG5ldyBGaWxlKGZpbGVOYW1lKSkuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgIFRyZWVNYXAgbWF0Y2hlcyA9IG5ldyBUcmVlTWFwKG5ldyBDb21wYXJhdG9yKCkgeworICAgICAgICAgICAgICAgIC8vIGxvbmdlc3QgbWF0Y2ggY29tZXMgZmlyc3QKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8xIGluc3RhbmNlb2YgU3RyaW5nICYmIG8yIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIG8yKS5sZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChTdHJpbmcpIG8xKS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKGNsYXNzcGF0aFtpXSkpIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVzLnB1dChjbGFzc3BhdGhbaV0sIGNsYXNzcGF0aFtpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBzbGFzaCA9IGNsYXNzcGF0aFtpXS5pbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZSA9IGNsYXNzcGF0aFtpXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc2xhc2ggPiAtMSkgeworICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBjYW5kaWRhdGUuc3Vic3RyaW5nKHNsYXNoICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aChjYW5kaWRhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1dChjYW5kaWRhdGUsIGNsYXNzcGF0aFtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzbGFzaCA9IGNhbmRpZGF0ZS5pbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1hdGNoZXMuc2l6ZSgpID09IDAKKyAgICAgICAgICAgID8gbnVsbCA6IChTdHJpbmcpIG1hdGNoZXMuZ2V0KG1hdGNoZXMuZmlyc3RLZXkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhYiBsaXN0cyBvZiBhbGwgcm9vdC1sZXZlbCBmaWxlcyBhbmQgYWxsIGRpcmVjdG9yaWVzCisgICAgICogY29udGFpbmVkIGluIHRoZSBnaXZlbiBhcmNoaXZlLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSB6aXAgZmlsZSB0byBleGFtaW5lCisgICAgICogQHBhcmFtIGRpcnMgd2hlcmUgdG8gcGxhY2UgdGhlIGRpcmVjdG9yaWVzIGZvdW5kCisgICAgICogQHBhcmFtIGZpbGVzIHdoZXJlIHRvIHBsYWNlIHRoZSBmaWxlcyBmb3VuZAorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBncmFiRmlsZXNBbmREaXJzKFN0cmluZyBmaWxlLCBMaXN0IGRpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBmaWxlcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZSB6ZiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB6ZiA9IG5ldyBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlKGZpbGUsICJ1dGYtOCIpOworICAgICAgICAgICAgRW51bWVyYXRpb24gZW50cmllcyA9IHpmLmdldEVudHJpZXMoKTsKKyAgICAgICAgICAgIEhhc2hTZXQgZGlyU2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRW50cnkgemUgPQorICAgICAgICAgICAgICAgICAgICAob3JnLmFwYWNoZS50b29scy56aXAuWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHplLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAvLyBNRVRBLUlORiB3b3VsZCBiZSBza2lwcGVkIGFueXdheSwgYXZvaWQgaW5kZXggZm9yCisgICAgICAgICAgICAgICAgLy8gbWFuaWZlc3Qtb25seSBqYXJzLgorICAgICAgICAgICAgICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCJNRVRBLUlORi8iKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoemUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlyU2V0LmFkZChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmluZGV4T2YoIi8iKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkKG5hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBmaWxlLCBub3QgaW4gdGhlIHJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBqYXIgbWF5IGJlIG9uZSB3aXRob3V0IGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcywgYWRkIHRoZSBwYXJlbnQgZGlyIG9mIHRoaXMgZmlsZSBhcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VsbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpclNldC5hZGQobmFtZS5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlycy5hZGRBbGwoZGlyU2V0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh6ZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgemYuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUaGUgc3RyaWN0IGVudW1lcmF0ZWQgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmljdE1vZGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqIFB1YmxpYyBubyBhcmcgY29uc3RydWN0b3IuICovCisgICAgICAgIHB1YmxpYyBTdHJpY3RNb2RlKCkgeworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIGFuIGFyZy4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBlbnVtZXJhdGVkIHZhbHVlIGFzIGEgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmljdE1vZGUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBMaXN0IG9mIHZhbGlkIHN0cmluZ3MuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117ImZhaWwiLCAid2FybiIsICJpZ25vcmUifTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBUaGUgbG9nIGxldmVsIGFjY29yZGluZyB0byB0aGUgc3RyaWN0IG1vZGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldExvZ0xldmVsKCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXRWYWx1ZSgpLmVxdWFscygiaWdub3JlIikpID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IFByb2plY3QuTVNHX1dBUk47CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzNDAyZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmEuamF2YQpAQCAtMCwwICsxLDk1NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkV4aXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkV4aXRTdGF0dXNFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmVKYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUHJvcGVydHlTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkFzc2VydGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGVybWlzc2lvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVkaXJlY3RvckVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuS2VlcEFsaXZlSW5wdXRTdHJlYW07CisKKy8qKgorICogTGF1bmNoZXIgZm9yIEphdmEgYXBwbGljYXRpb25zLiBBbGxvd3MgdXNlIG9mCisgKiB0aGUgc2FtZSBKVk0gZm9yIHRoZSBjYWxsZWQgYXBwbGljYXRpb24gdGh1cyByZXN1bHRpbmcgaW4gbXVjaAorICogZmFzdGVyIG9wZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iamF2YSIKKyAqLworcHVibGljIGNsYXNzIEphdmEgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgQ29tbWFuZGxpbmVKYXZhIGNtZGwgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CisgICAgcHJpdmF0ZSBFbnZpcm9ubWVudCBlbnYgPSBuZXcgRW52aXJvbm1lbnQoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZm9yayA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBuZXdFbnZpcm9ubWVudCA9IGZhbHNlOworICAgIHByaXZhdGUgRmlsZSBkaXIgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvciA9IGZhbHNlOworICAgIHByaXZhdGUgTG9uZyB0aW1lb3V0ID0gbnVsbDsKKworICAgIC8vaW5jbHVkZSBsb2NhbGx5IGZvciBzY3JlZW5pbmcgcHVycG9zZXMKKyAgICBwcml2YXRlIFN0cmluZyBpbnB1dFN0cmluZzsKKyAgICBwcml2YXRlIEZpbGUgaW5wdXQ7CisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dDsKKyAgICBwcml2YXRlIEZpbGUgZXJyb3I7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBSZWRpcmVjdG9yIHJlZGlyZWN0b3IgPSBuZXcgUmVkaXJlY3Rvcih0aGlzKTsKKyAgICBwcm90ZWN0ZWQgUmVkaXJlY3RvckVsZW1lbnQgcmVkaXJlY3RvckVsZW1lbnQ7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIHByaXZhdGUgU3RyaW5nIHJlc3VsdFByb3BlcnR5OworICAgIHByaXZhdGUgUGVybWlzc2lvbnMgcGVybSA9IG51bGw7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc3Bhd24gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jb21wYXRpYmxlV2l0aFNwYXduID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWwgY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgSmF2YSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgYSBib3VuZCB0YXNrCisgICAgICogQHBhcmFtIG93bmVyIG93bmVyCisgICAgICovCisgICAgcHVibGljIEphdmEoVGFzayBvd25lcikgeworICAgICAgICBiaW5kVG9Pd25lcihvd25lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8gdGhlIGV4ZWN1dGlvbi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGZhaWxPbkVycm9yIGlzIHNldCB0byB0cnVlIGFuZCB0aGUgYXBwbGljYXRpb24KKyAgICAgKiByZXR1cm5zIGEgbm9uemVybyByZXN1bHQgY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzYXZlZERpciA9IGRpcjsKKyAgICAgICAgUGVybWlzc2lvbnMgc2F2ZWRQZXJtaXNzaW9ucyA9IHBlcm07CisKKyAgICAgICAgaW50IGVyciA9IC0xOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hlY2tDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBlcnIgPSBleGVjdXRlSmF2YSgpOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGl0U3RhdHVzRXhjZXB0aW9uKCJKYXZhIHJldHVybmVkOiAiICsgZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coIkphdmEgUmVzdWx0OiAiICsgZXJyLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heWJlU2V0UmVzdWx0UHJvcGVydHlWYWx1ZShlcnIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZGlyID0gc2F2ZWREaXI7CisgICAgICAgICAgICBwZXJtID0gc2F2ZWRQZXJtaXNzaW9uczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHRoZSBleGVjdXRpb24gYW5kIHJldHVybiBhIHJldHVybiBjb2RlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgZXhlY3V0ZSBqYXZhIGNsYXNzIGlmIGl0IHdhcworICAgICAqIGV4ZWN1dGVkIGluIGEgc2VwYXJhdGUgVk0gKGZvcmsgPSAieWVzIikgb3IgYSBzZWN1cml0eSBtYW5hZ2VyIHdhcworICAgICAqIGluc3RhbGxlZCB0aGF0IHByb2hpYml0cyBFeGl0Vk0gKGRlZmF1bHQpLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZUphdmEoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXhlY3V0ZUphdmEoZ2V0Q29tbWFuZExpbmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIG1pc3NpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGdldENvbW1hbmRMaW5lKCkuZ2V0Q2xhc3NuYW1lKCk7CisgICAgICAgIGlmIChjbGFzc25hbWUgPT0gbnVsbCAmJiBnZXRDb21tYW5kTGluZSgpLmdldEphcigpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2xhc3NuYW1lIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3JrICYmIGdldENvbW1hbmRMaW5lKCkuZ2V0SmFyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgZXhlY3V0ZSBhIGphciBpbiBub24tZm9ya2VkIG1vZGUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBQbGVhc2Ugc2V0IGZvcms9J3RydWUnLiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3Bhd24gJiYgIWZvcmspIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHNwYXduIGEgamF2YSBwcm9jZXNzIGluIG5vbi1mb3JrZWQgbW9kZS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFBsZWFzZSBzZXQgZm9yaz0ndHJ1ZScuICIpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDb21tYW5kTGluZSgpLmdldENsYXNzcGF0aCgpICE9IG51bGwKKyAgICAgICAgICAgICYmIGdldENvbW1hbmRMaW5lKCkuZ2V0SmFyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJXaGVuIHVzaW5nICdqYXInIGF0dHJpYnV0ZSBjbGFzc3BhdGgtc2V0dGluZ3MgYXJlIGlnbm9yZWQuICIKKyAgICAgICAgICAgICAgICArICJTZWUgdGhlIG1hbnVhbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3Bhd24gJiYgaW5jb21wYXRpYmxlV2l0aFNwYXduKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJzcGF3biBkb2VzIG5vdCBhbGxvdyBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gaW5wdXQsICIKKyAgICAgICAgICAgICsgIm91dHB1dCwgZXJyb3IsIHJlc3VsdCIsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJzcGF3biBhbHNvIGRvZXMgbm90IGFsbG93IHRpbWVvdXQiLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiZmluYWxseSwgc3Bhd24gaXMgbm90IGNvbXBhdGlibGUgIgorICAgICAgICAgICAgICAgICsgIndpdGggYSBuZXN0ZWQgSS9PIDxyZWRpcmVjdG9yPiIsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBoYXZlIHVzZWQgYW4gYXR0cmlidXRlICIKKyAgICAgICAgICAgICAgICArICJvciBuZXN0ZWQgZWxlbWVudCB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHNwYXduIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENvbW1hbmRMaW5lKCkuZ2V0QXNzZXJ0aW9ucygpICE9IG51bGwgJiYgIWZvcmspIHsKKyAgICAgICAgICAgIGxvZygiQXNzZXJ0aW9uIHN0YXRlbWVudHMgYXJlIGN1cnJlbnRseSBpZ25vcmVkIGluIG5vbi1mb3JrZWQgbW9kZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JrKSB7CisgICAgICAgICAgICBpZiAocGVybSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJQZXJtaXNzaW9ucyBjYW4gbm90IGJlIHNldCB0aGlzIHdheSBpbiBmb3JrZWQgbW9kZS4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZyhnZXRDb21tYW5kTGluZSgpLmRlc2NyaWJlQ29tbWFuZCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRDb21tYW5kTGluZSgpLmdldFZtQ29tbWFuZCgpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBsb2coIkpWTSBhcmdzIGlnbm9yZWQgd2hlbiBzYW1lIEpWTSBpcyB1c2VkLiIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJXb3JraW5nIGRpcmVjdG9yeSBpZ25vcmVkIHdoZW4gc2FtZSBKVk0gaXMgdXNlZC4iLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdFbnZpcm9ubWVudCB8fCBudWxsICE9IGVudi5nZXRWYXJpYWJsZXMoKSkgeworICAgICAgICAgICAgICAgIGxvZygiQ2hhbmdlcyB0byBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGlnbm9yZWQgd2hlbiBzYW1lICIKKyAgICAgICAgICAgICAgICAgICAgKyAiSlZNIGlzIHVzZWQuIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Q29tbWFuZExpbmUoKS5nZXRCb290Y2xhc3NwYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygiYm9vdGNsYXNzcGF0aCBpZ25vcmVkIHdoZW4gc2FtZSBKVk0gaXMgdXNlZC4iLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwZXJtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwZXJtID0gbmV3IFBlcm1pc3Npb25zKHRydWUpOworICAgICAgICAgICAgICAgIGxvZygicnVubmluZyAiICsgdGhpcy5nZXRDb21tYW5kTGluZSgpLmdldENsYXNzbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIGRlZmF1bHQgcGVybWlzc2lvbnMgKGV4aXQgZm9yYmlkZGVuKSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJSdW5uaW5nIGluIHNhbWUgVk0gIiArIGdldENvbW1hbmRMaW5lKCkuZGVzY3JpYmVKYXZhQ29tbWFuZCgpLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgICAgIHNldHVwUmVkaXJlY3RvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBDb21tYW5kbGluZUphdmEuCisgICAgICogQHBhcmFtIGNvbW1hbmRMaW5lIENvbW1hbmRMaW5lSmF2YSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBleGl0IHZhbHVlIG9mIHRoZSBwcm9jZXNzIGlmIGZvcmtlZCwgMCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBleGVjdXRlSmF2YShDb21tYW5kbGluZUphdmEgY29tbWFuZExpbmUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmb3JrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzcGF3bikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9yayhjb21tYW5kTGluZS5nZXRDb21tYW5kbGluZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzcGF3bihjb21tYW5kTGluZS5nZXRDb21tYW5kbGluZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBydW4oY29tbWFuZExpbmUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGl0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleC5nZXRTdGF0dXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChlLmdldExvY2F0aW9uKCkgPT0gbnVsbCAmJiBnZXRMb2NhdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlLnNldExvY2F0aW9uKGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKGUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyZWFkRGVhdGggdCkgeworICAgICAgICAgICAgdGhyb3cgdDsgLy8gY2YuIE5CICM0NzE5MQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2codCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRoZSBwcm9jZXNzIHRvIGJlIHNwYXduZWQ7CisgICAgICogZGVmYXVsdCBpcyBub3Qgc3Bhd25lZC4KKyAgICAgKiBAcGFyYW0gc3Bhd24gaWYgdHJ1ZSB5b3UgZG8gbm90IHdhbnQgQW50IHRvIHdhaXQgZm9yIHRoZSBlbmQgb2YgdGhlIHByb2Nlc3MuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcGF3bihib29sZWFuIHNwYXduKSB7CisgICAgICAgIHRoaXMuc3Bhd24gPSBzcGF3bjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gcnVubmluZyB0aGUgSmF2YSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIGFuIEFudCBQYXRoIG9iamVjdCBjb250YWluaW5nIHRoZSBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggcykgeworICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5hcHBlbmQocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLgorICAgICAqCisgICAgICogQHJldHVybiBjcmVhdGVkIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBnZXRDb21tYW5kTGluZSgpLmNyZWF0ZUNsYXNzcGF0aChnZXRQcm9qZWN0KCkpLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwYXRoIHRvIHRoZSBib290Y2xhc3NwYXRoLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNyZWF0ZWQgYm9vdGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVCb290Y2xhc3NwYXRoKCkgeworICAgICAgICByZXR1cm4gZ2V0Q29tbWFuZExpbmUoKS5jcmVhdGVCb290Y2xhc3NwYXRoKGdldFByb2plY3QoKSkuY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGVybWlzc2lvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbiBydW4gaW5zaWRlIHRoZSBzYW1lIEpWTS4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqIEByZXR1cm4gUGVybWlzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIFBlcm1pc3Npb25zIGNyZWF0ZVBlcm1pc3Npb25zKCkgeworICAgICAgICBwZXJtID0gKHBlcm0gPT0gbnVsbCkgPyBuZXcgUGVybWlzc2lvbnMoKSA6IHBlcm07CisgICAgICAgIHJldHVybiBwZXJtOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIHVzZSBieSByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gciBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIEpBUiBmaWxlIHRvIGV4ZWN1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamFyZmlsZSB0aGUgamFyZmlsZSB0byBleGVjdXRlLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbHNvIGEgbWFpbiBjbGFzcyBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SmFyKEZpbGUgamFyZmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldENvbW1hbmRMaW5lKCkuZ2V0Q2xhc3NuYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgdXNlICdqYXInIGFuZCAnY2xhc3NuYW1lJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyBpbiBzYW1lIGNvbW1hbmQuIik7CisgICAgICAgIH0KKyAgICAgICAgZ2V0Q29tbWFuZExpbmUoKS5zZXRKYXIoamFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKYXZhIGNsYXNzIHRvIGV4ZWN1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgbmFtZSBvZiB0aGUgbWFpbiBjbGFzcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGphciBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldENvbW1hbmRMaW5lKCkuZ2V0SmFyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgdXNlICdqYXInIGFuZCAnY2xhc3NuYW1lJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyBpbiBzYW1lIGNvbW1hbmQiKTsKKyAgICAgICAgfQorICAgICAgICBnZXRDb21tYW5kTGluZSgpLnNldENsYXNzbmFtZShzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXByZWNhdGVkOiB1c2UgbmVzdGVkIGFyZyBpbnN0ZWFkLgorICAgICAqIFNldCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHMgYXJndW1lbnRzLgorICAgICAqCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3MoU3RyaW5nIHMpIHsKKyAgICAgICAgbG9nKCJUaGUgYXJncyBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZC4gIgorICAgICAgICAgICAgKyAiUGxlYXNlIHVzZSBuZXN0ZWQgYXJnIGVsZW1lbnRzLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICBnZXRDb21tYW5kTGluZSgpLmNyZWF0ZUFyZ3VtZW50KCkuc2V0TGluZShzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQsIHN5c3RlbSBwcm9wZXJ0aWVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBjbG9uZWQgVk0tLWFzCisgICAgICogd2VsbCBhcyB0aGUgYm9vdGNsYXNzcGF0aCB1bmxlc3MgeW91IGhhdmUgZXhwbGljaXRseSBzcGVjaWZpZWQKKyAgICAgKiBhIGJvb3RjbGFzcGF0aC4KKyAgICAgKgorICAgICAqIDxwPkRvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0IHVubGVzcyBmb3JrIGlzIHRydWUuPC9wPgorICAgICAqIEBwYXJhbSBjbG9uZVZtIGlmIHRydWUgY29weSBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsb25lVm0oYm9vbGVhbiBjbG9uZVZtKSB7CisgICAgICAgIGdldENvbW1hbmRMaW5lKCkuc2V0Q2xvbmVWbShjbG9uZVZtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNyZWF0ZWQgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUFyZygpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbW1hbmRMaW5lKCkuY3JlYXRlQXJndW1lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUKKyAgICAgKiBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIE9ubHkgb2YgaW50ZXJlc3QgaWYgZmFpbG9uZXJyb3I9ZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzdWx0UHJvcGVydHkgbmFtZSBvZiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0UHJvcGVydHkoU3RyaW5nIHJlc3VsdFByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucmVzdWx0UHJvcGVydHkgPSByZXN1bHRQcm9wZXJ0eTsKKyAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHNldCByZXN1bHQgcHJvcGVydHkgdG8gdGhlCisgICAgICogcGFzc2VkIGluIHZhbHVlIGlmIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3VsdCB0aGUgZXhpdCBjb2RlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbWF5YmVTZXRSZXN1bHRQcm9wZXJ0eVZhbHVlKGludCByZXN1bHQpIHsKKyAgICAgICAgU3RyaW5nIHJlcyA9IEludGVnZXIudG9TdHJpbmcocmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdFByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShyZXN1bHRQcm9wZXJ0eSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGV4ZWN1dGUgaW4gYSBuZXcgVk0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBkbyB5b3Ugd2FudCB0byBydW4gSmF2YSBpbiBhIG5ldyBWTS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JrKGJvb2xlYW4gcykgeworICAgICAgICB0aGlzLmZvcmsgPSBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIEpWTS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIGp2bWFyZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SnZtYXJncyhTdHJpbmcgcykgeworICAgICAgICBsb2coIlRoZSBqdm1hcmdzIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkLiAiCisgICAgICAgICAgICArICJQbGVhc2UgdXNlIG5lc3RlZCBqdm1hcmcgZWxlbWVudHMuIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIGdldENvbW1hbmRMaW5lKCkuY3JlYXRlVm1Bcmd1bWVudCgpLnNldExpbmUocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIEpWTSBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSlZNIGFyZ3VtZW50IGNyZWF0ZWQuCisgICAgICovCisgICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUp2bWFyZygpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbW1hbmRMaW5lKCkuY3JlYXRlVm1Bcmd1bWVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tbWFuZCB1c2VkIHRvIHN0YXJ0IHRoZSBWTSAob25seSBpZiBmb3JraW5nKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIGNvbW1hbmQgdG8gc3RhcnQgdGhlIFZNLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEp2bShTdHJpbmcgcykgeworICAgICAgICBnZXRDb21tYW5kTGluZSgpLnNldFZtKHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzeXNwIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTeXNwcm9wZXJ0eShFbnZpcm9ubWVudC5WYXJpYWJsZSBzeXNwKSB7CisgICAgICAgIGdldENvbW1hbmRMaW5lKCkuYWRkU3lzcHJvcGVydHkoc3lzcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIHByb3BlcnRpZXMgYXMgc3lzdGVtIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3lzcCBzZXQgb2YgcHJvcGVydGllcyB0byBhZGQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFN5c3Byb3BlcnR5c2V0KFByb3BlcnR5U2V0IHN5c3ApIHsKKyAgICAgICAgZ2V0Q29tbWFuZExpbmUoKS5hZGRTeXNwcm9wZXJ0eXNldChzeXNwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB0aGVuIGZhaWwgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCisgICAgICogcmV0dXJuY29kZSBvdGhlciB0aGFuIHplcm8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFpbCBpZiB0cnVlIGZhaWwgdGhlIGJ1aWxkIHdoZW4gdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCisgICAgICogbm9uemVybyByZXR1cm5jb2RlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvbmVycm9yKGJvb2xlYW4gZmFpbCkgeworICAgICAgICBmYWlsT25FcnJvciA9IGZhaWw7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biB8PSBmYWlsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGQpIHsKKyAgICAgICAgdGhpcy5kaXIgPSBkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgRmlsZSB0byB3aGljaCB0aGUgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIGlzIHJlZGlyZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXQgRmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoRmlsZSBvdXQpIHsKKyAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXQ7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnB1dCB0byB1c2UgZm9yIHRoZSB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IG5hbWUgb2YgdGhlIGlucHV0IGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5wdXQoRmlsZSBpbnB1dCkgeworICAgICAgICBpZiAoaW5wdXRTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgXCJpbnB1dFwiIGFuZCBcImlucHV0c3RyaW5nXCIgIgorICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZXMgY2Fubm90IGJvdGggYmUgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgICAgICBpbmNvbXBhdGlibGVXaXRoU3Bhd24gPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyaW5nIHRvIHVzZSBhcyBpbnB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmluZyB0aGUgc3RyaW5nIHdoaWNoIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dFN0cmluZyhTdHJpbmcgaW5wdXRTdHJpbmcpIHsKKyAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIFwiaW5wdXRcIiBhbmQgXCJpbnB1dHN0cmluZ1wiICIKKyAgICAgICAgICAgICAgICArICJhdHRyaWJ1dGVzIGNhbm5vdCBib3RoIGJlIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuaW5wdXRTdHJpbmcgPSBpbnB1dFN0cmluZzsKKyAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBlcnJvciBvdXRwdXQgb2YgZXhlYyBpcyBsb2dnZWQuIFRoaXMgaXMgb25seSB1c2VmdWwKKyAgICAgKiB3aGVuIG91dHB1dCBpcyBiZWluZyByZWRpcmVjdGVkIGFuZCBlcnJvciBvdXRwdXQgaXMgZGVzaXJlZCBpbiB0aGUKKyAgICAgKiBBbnQgbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIGxvZ0Vycm9yIGdldCBpbiB0aGUgYW50IGxvZyB0aGUgbWVzc2FnZXMgY29taW5nIGZyb20gc3RkZXJyCisgICAgICogaW4gdGhlIGNhc2UgdGhhdCBmb3JrID0gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dFcnJvcihib29sZWFuIGxvZ0Vycm9yKSB7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0TG9nRXJyb3IobG9nRXJyb3IpOworICAgICAgICBpbmNvbXBhdGlibGVXaXRoU3Bhd24gfD0gbG9nRXJyb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBGaWxlIHRvIHdoaWNoIHRoZSBlcnJvciBzdHJlYW0gb2YgdGhlIHByb2Nlc3MgaXMgcmVkaXJlY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvciBmaWxlIGdldHRpbmcgdGhlIGVycm9yIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3IoRmlsZSBlcnJvcikgeworICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9wZXJ0eSBuYW1lIHdob3NlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gdGhlIG91dHB1dCBvZgorICAgICAqIHRoZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dFByb3AgcHJvcGVydHkgbmFtZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dHByb3BlcnR5KFN0cmluZyBvdXRwdXRQcm9wKSB7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0T3V0cHV0UHJvcGVydHkob3V0cHV0UHJvcCk7CisgICAgICAgIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9wZXJ0eSBuYW1lIHdob3NlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGVycm9yIG9mCisgICAgICogdGhlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyb3JQcm9wZXJ0eSBwcm9wZXJ0eSBuYW1lLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvclByb3BlcnR5KFN0cmluZyBlcnJvclByb3BlcnR5KSB7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0RXJyb3JQcm9wZXJ0eShlcnJvclByb3BlcnR5KTsKKyAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3JyZXNwb25kcyB0byAtbXggb3IgLVhteCBkZXBlbmRpbmcgb24gVk0gdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXggbWF4IG1lbW9yeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4bWVtb3J5KFN0cmluZyBtYXgpIHsKKyAgICAgICAgZ2V0Q29tbWFuZExpbmUoKS5zZXRNYXhtZW1vcnkobWF4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEpWTSB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBKVk0gdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKVk1WZXJzaW9uKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBnZXRDb21tYW5kTGluZSgpLnNldFZtdmVyc2lvbih2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAqCisgICAgICogPHA+V2lsbCBiZSBpZ25vcmVkIGlmIHdlIGFyZSBub3QgZm9ya2luZyBhIG5ldyBWTS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YXIgbmV3IGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFbnYoRW52aXJvbm1lbnQuVmFyaWFibGUgdmFyKSB7CisgICAgICAgIGVudi5hZGRWYXJpYWJsZSh2YXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHVzZSBhIGNvbXBsZXRlbHkgbmV3IGVudmlyb25tZW50LgorICAgICAqCisgICAgICogPHA+V2lsbCBiZSBpZ25vcmVkIGlmIHdlIGFyZSBub3QgZm9ya2luZyBhIG5ldyBWTS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdlbnYgaWYgdHJ1ZSwgdXNlIGEgY29tcGxldGVseSBuZXcgZW52aXJvbm1lbnQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5ld2Vudmlyb25tZW50KGJvb2xlYW4gbmV3ZW52KSB7CisgICAgICAgIG5ld0Vudmlyb25tZW50ID0gbmV3ZW52OworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGFwcGVuZCBvdXRwdXQgdG8gZXhpc3RpbmcgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSwgYXBwZW5kIG91dHB1dCB0byBleGlzdGluZyBmaWxlLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBlbmQoYm9vbGVhbiBhcHBlbmQpIHsKKyAgICAgICAgcmVkaXJlY3Rvci5zZXRBcHBlbmQoYXBwZW5kKTsKKyAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBwcm9jZXNzIHdpbGwgYmUga2lsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KExvbmcgdmFsdWUpIHsKKyAgICAgICAgdGltZW91dCA9IHZhbHVlOworICAgICAgICBpbmNvbXBhdGlibGVXaXRoU3Bhd24gfD0gdGltZW91dCAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhc3NlcnRpb25zIHRvIGVuYWJsZSBpbiB0aGlzIHByb2dyYW0gKGlmIGZvcms9dHJ1ZSkuCisgICAgICogQHBhcmFtIGFzc2VydHMgYXNzZXJ0aW9uIHNldC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFzc2VydGlvbnMoQXNzZXJ0aW9ucyBhc3NlcnRzKSB7CisgICAgICAgIGlmIChnZXRDb21tYW5kTGluZSgpLmdldEFzc2VydGlvbnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIGFzc2VydGlvbiBkZWNsYXJhdGlvbiBpcyBhbGxvd2VkIik7CisgICAgICAgIH0KKyAgICAgICAgZ2V0Q29tbWFuZExpbmUoKS5zZXRBc3NlcnRpb25zKGFzc2VydHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIDxjb2RlPlJlZGlyZWN0b3JFbGVtZW50PC9jb2RlPiB0byB0aGlzIHRhc2suCisgICAgICogQHBhcmFtIHJlZGlyZWN0b3JFbGVtZW50ICAgPGNvZGU+UmVkaXJlY3RvckVsZW1lbnQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRSZWRpcmVjdG9yKFJlZGlyZWN0b3JFbGVtZW50IHJlZGlyZWN0b3JFbGVtZW50KSB7CisgICAgICAgIGlmICh0aGlzLnJlZGlyZWN0b3JFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY2Fubm90IGhhdmUgPiAxIG5lc3RlZCByZWRpcmVjdG9ycyIpOworICAgICAgICB9CisgICAgICAgIHRoaXMucmVkaXJlY3RvckVsZW1lbnQgPSByZWRpcmVjdG9yRWxlbWVudDsKKyAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXNzIG91dHB1dCBzZW50IHRvIFN5c3RlbS5vdXQgdG8gc3BlY2lmaWVkIG91dHB1dCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBhIHN0cmluZyBvZiBvdXRwdXQgb24gaXRzIHdheSB0byB0aGUgaGFuZGxlcnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU91dHB1dChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChyZWRpcmVjdG9yLmdldE91dHB1dFN0cmVhbSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZGlyZWN0b3IuaGFuZGxlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSBhbiBpbnB1dCByZXF1ZXN0IGJ5IHRoaXMgdGFzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgaXMgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGF0IHdoaWNoIGRhdGEgaXMgc3RvcmVkLgorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGRhdGEgY2Fubm90IGJlIHJlYWQuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhbmRsZUlucHV0KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNob3VsZCB3b3JrIHdoZXRoZXIgb3Igbm90IHJlZGlyZWN0b3IuaW5wdXRTdHJlYW0gPT0gbnVsbDoKKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0b3IuaGFuZGxlSW5wdXQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzcyBvdXRwdXQgc2VudCB0byBTeXN0ZW0ub3V0IHRvIHNwZWNpZmllZCBvdXRwdXQgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgc3RyaW5nIG9mIG91dHB1dCBvbiBpdHMgd2F5IHRvIGl0cyBoYW5kbGVycy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGbHVzaChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChyZWRpcmVjdG9yLmdldE91dHB1dFN0cmVhbSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZGlyZWN0b3IuaGFuZGxlRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUZsdXNoKG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgb3V0cHV0IHNlbnQgdG8gU3lzdGVtLmVyci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgc3RyaW5nIG9mIHN0ZGVyci4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXJyb3JPdXRwdXQoU3RyaW5nIG91dHB1dCkgeworICAgICAgICBpZiAocmVkaXJlY3Rvci5nZXRFcnJvclN0cmVhbSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZGlyZWN0b3IuaGFuZGxlRXJyb3JPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUVycm9yT3V0cHV0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgb3V0cHV0IHNlbnQgdG8gU3lzdGVtLmVyciBhbmQgZmx1c2ggdGhlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgc3RyaW5nIG9mIHN0ZGVyci4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFcnJvckZsdXNoKFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKHJlZGlyZWN0b3IuZ2V0RXJyb3JTdHJlYW0oKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZWRpcmVjdG9yLmhhbmRsZUVycm9yRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUVycm9yT3V0cHV0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgcHJvcGVydGllcyBvbiB0aGUgcmVkaXJlY3RvciB0aGF0IHdlIG5lZWRlZCB0byBzdG9yZSBsb2NhbGx5LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldHVwUmVkaXJlY3RvcigpIHsKKyAgICAgICAgcmVkaXJlY3Rvci5zZXRJbnB1dChpbnB1dCk7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0SW5wdXRTdHJpbmcoaW5wdXRTdHJpbmcpOworICAgICAgICByZWRpcmVjdG9yLnNldE91dHB1dChvdXRwdXQpOworICAgICAgICByZWRpcmVjdG9yLnNldEVycm9yKGVycm9yKTsKKyAgICAgICAgaWYgKHJlZGlyZWN0b3JFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZGlyZWN0b3JFbGVtZW50LmNvbmZpZ3VyZShyZWRpcmVjdG9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNwYXduICYmIGlucHV0ID09IG51bGwgJiYgaW5wdXRTdHJpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gIzI0OTE4OiBzZW5kIHN0YW5kYXJkIGlucHV0IHRvIHRoZSBwcm9jZXNzIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICByZWRpcmVjdG9yLnNldElucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBLZWVwQWxpdmVJbnB1dFN0cmVhbShnZXRQcm9qZWN0KCkuZ2V0RGVmYXVsdElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBjbGFzc25hbWUgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFzIGl0CisgICAgICogd2VyZSBhIGNvbW1hbmQgbGluZSBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gY29tbWFuZCBDb21tYW5kbGluZUphdmEuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJ1bihDb21tYW5kbGluZUphdmEgY29tbWFuZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dGVKYXZhIGV4ZSA9IG5ldyBFeGVjdXRlSmF2YSgpOworICAgICAgICAgICAgZXhlLnNldEphdmFDb21tYW5kKGNvbW1hbmQuZ2V0SmF2YUNvbW1hbmQoKSk7CisgICAgICAgICAgICBleGUuc2V0Q2xhc3NwYXRoKGNvbW1hbmQuZ2V0Q2xhc3NwYXRoKCkpOworICAgICAgICAgICAgZXhlLnNldFN5c3RlbVByb3BlcnRpZXMoY29tbWFuZC5nZXRTeXN0ZW1Qcm9wZXJ0aWVzKCkpOworICAgICAgICAgICAgZXhlLnNldFBlcm1pc3Npb25zKHBlcm0pOworICAgICAgICAgICAgZXhlLnNldFRpbWVvdXQodGltZW91dCk7CisgICAgICAgICAgICByZWRpcmVjdG9yLmNyZWF0ZVN0cmVhbXMoKTsKKyAgICAgICAgICAgIGV4ZS5leGVjdXRlKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICByZWRpcmVjdG9yLmNvbXBsZXRlKCk7CisgICAgICAgICAgICBpZiAoZXhlLmtpbGxlZFByb2Nlc3MoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGltZW91dDoga2lsbGVkIHRoZSBzdWItcHJvY2VzcyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gY2xhc3NuYW1lIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBpbiBhIHNlcGFyYXRlIFZNLgorICAgICAqIEBwYXJhbSBjb21tYW5kIFN0cmluZ1tdIG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZm9yayhTdHJpbmdbXSBjb21tYW5kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBFeGVjdXRlIGV4ZQorICAgICAgICAgICAgPSBuZXcgRXhlY3V0ZShyZWRpcmVjdG9yLmNyZWF0ZUhhbmRsZXIoKSwgY3JlYXRlV2F0Y2hkb2coKSk7CisgICAgICAgIHNldHVwRXhlY3V0YWJsZShleGUsIGNvbW1hbmQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcmMgPSBleGUuZXhlY3V0ZSgpOworICAgICAgICAgICAgcmVkaXJlY3Rvci5jb21wbGV0ZSgpOworICAgICAgICAgICAgaWYgKGV4ZS5raWxsZWRQcm9jZXNzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRpbWVvdXQ6IGtpbGxlZCB0aGUgc3ViLXByb2Nlc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIGNsYXNzbmFtZSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgaW4gYSBzZXBhcmF0ZSBWTS4KKyAgICAgKiBAcGFyYW0gY29tbWFuZCBTdHJpbmdbXSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzcGF3bihTdHJpbmdbXSBjb21tYW5kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKCk7CisgICAgICAgIHNldHVwRXhlY3V0YWJsZShleGUsIGNvbW1hbmQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlLnNwYXduKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvIGFsbCBjb25maWd1cmF0aW9uIGZvciBhbiBleGVjdXRhYmxlIHRoYXQKKyAgICAgKiBpcyBjb21tb24gYWNyb3NzIHRoZSB7QGxpbmsgI2ZvcmsoU3RyaW5nW10pfSBhbmQKKyAgICAgKiB7QGxpbmsgI3NwYXduKFN0cmluZ1tdKX0gbWV0aG9kcy4KKyAgICAgKiBAcGFyYW0gZXhlIGV4ZWN1dGFibGUuCisgICAgICogQHBhcmFtIGNvbW1hbmQgY29tbWFuZCB0byBleGVjdXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXR1cEV4ZWN1dGFibGUoRXhlY3V0ZSBleGUsIFN0cmluZ1tdIGNvbW1hbmQpIHsKKyAgICAgICAgZXhlLnNldEFudFJ1bihnZXRQcm9qZWN0KCkpOworICAgICAgICBzZXR1cFdvcmtpbmdEaXIoZXhlKTsKKyAgICAgICAgc2V0dXBFbnZpcm9ubWVudChleGUpOworICAgICAgICBzZXR1cENvbW1hbmRMaW5lKGV4ZSwgY29tbWFuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHVwIG91ciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAgICogQHBhcmFtIGV4ZSBleGVjdXRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXR1cEVudmlyb25tZW50KEV4ZWN1dGUgZXhlKSB7CisgICAgICAgIFN0cmluZ1tdIGVudmlyb25tZW50ID0gZW52LmdldFZhcmlhYmxlcygpOworICAgICAgICBpZiAoZW52aXJvbm1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnZpcm9ubWVudC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGxvZygiU2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZTogIiArIGVudmlyb25tZW50W2ldLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleGUuc2V0TmV3ZW52aXJvbm1lbnQobmV3RW52aXJvbm1lbnQpOworICAgICAgICBleGUuc2V0RW52aXJvbm1lbnQoZW52aXJvbm1lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd29ya2luZyBkaXIgb2YgdGhlIG5ldyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBleGUgZXhlY3V0YWJsZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBkaXIgZG9lc24ndCBleGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBXb3JraW5nRGlyKEV4ZWN1dGUgZXhlKSB7CisgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZGlyID0gZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKTsKKyAgICAgICAgfSBlbHNlIGlmICghZGlyLmV4aXN0cygpIHx8ICFkaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGRpci5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGRpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21tYW5kIGxpbmUgZm9yIHRoZSBleGUuCisgICAgICogT24gVk1TLCBoYW5kcyBvZmYgdG8ge0BsaW5rICNzZXR1cENvbW1hbmRMaW5lRm9yVk1TKEV4ZWN1dGUsIFN0cmluZ1tdKX0uCisgICAgICogQHBhcmFtIGV4ZSBleGVjdXRhYmxlLgorICAgICAqIEBwYXJhbSBjb21tYW5kIGNvbW1hbmQgdG8gZXhlY3V0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBDb21tYW5kTGluZShFeGVjdXRlIGV4ZSwgU3RyaW5nW10gY29tbWFuZCkgeworICAgICAgICAvL09uIFZNUyBwbGF0Zm9ybSwgd2UgbmVlZCB0byBjcmVhdGUgYSBzcGVjaWFsIGphdmEgb3B0aW9ucyBmaWxlCisgICAgICAgIC8vY29udGFpbmluZyB0aGUgYXJndW1lbnRzIGFuZCBjbGFzc3BhdGggZm9yIHRoZSBqYXZhIGNvbW1hbmQuCisgICAgICAgIC8vVGhlIHNwZWNpYWwgZmlsZSBpcyBzdXBwb3J0ZWQgYnkgdGhlICItViIgc3dpdGNoIG9uIHRoZSBWTVMgSlZNLgorICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm9wZW52bXMiKSkgeworICAgICAgICAgICAgc2V0dXBDb21tYW5kTGluZUZvclZNUyhleGUsIGNvbW1hbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNvbW1hbmQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT24gVk1TIHBsYXRmb3JtLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgamF2YSBvcHRpb25zIGZpbGUKKyAgICAgKiBjb250YWluaW5nIHRoZSBhcmd1bWVudHMgYW5kIGNsYXNzcGF0aCBmb3IgdGhlIGphdmEgY29tbWFuZC4KKyAgICAgKiBUaGUgc3BlY2lhbCBmaWxlIGlzIHN1cHBvcnRlZCBieSB0aGUgIi1WIiBzd2l0Y2ggb24gdGhlIFZNUyBKVk0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhlIGV4ZWN1dGFibGUuCisgICAgICogQHBhcmFtIGNvbW1hbmQgY29tbWFuZCB0byBleGVjdXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXR1cENvbW1hbmRMaW5lRm9yVk1TKEV4ZWN1dGUgZXhlLCBTdHJpbmdbXSBjb21tYW5kKSB7CisgICAgICAgIEV4ZWN1dGVKYXZhLnNldHVwQ29tbWFuZExpbmVGb3JWTVMoZXhlLCBjb21tYW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gY2xhc3NuYW1lIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBhcyBpZiBpdAorICAgICAqIHdlcmUgYSBjb21tYW5kIGxpbmUgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBydW4uCisgICAgICogQHBhcmFtIGFyZ3MgIGFyZ3VtZW50cyBmb3IgdGhlIGNsYXNzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaW4gY2FzZSBvZiBJT0V4Y2VwdGlvbiBpbiB0aGUgZXhlY3V0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJ1bihTdHJpbmcgY2xhc3NuYW1lLCBWZWN0b3IgYXJncykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGNtZGogPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CisgICAgICAgIGNtZGouc2V0Q2xhc3NuYW1lKGNsYXNzbmFtZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY21kai5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKChTdHJpbmcpIGFyZ3MuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgfQorICAgICAgICBydW4oY21kaik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgb3V0IHRoZSBhcmd1bWVudHMgdG8gdGhpcyBqYXZhIHRhc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJBcmdzKCkgeworICAgICAgICBnZXRDb21tYW5kTGluZSgpLmNsZWFySmF2YUFyZ3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIFdhdGNoZG9nIHRvIGtpbGwgYSBydW5hd2F5IHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldyB3YXRjaGRvZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdW5kZXIgdW5rbm93biBjaXJjdW1zdGFuY2VzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRXhlY3V0ZVdhdGNoZG9nIGNyZWF0ZVdhdGNoZG9nKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBFeGVjdXRlV2F0Y2hkb2codGltZW91dC5sb25nVmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9nIHRoZSBzcGVjaWZpZWQgVGhyb3dhYmxlLgorICAgICAqIEBwYXJhbSB0IHRoZSBUaHJvd2FibGUgdG8gbG9nLgorICAgICAqIEBzaW5jZSAxLjYuMgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2coVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKKyAgICAgICAgdC5wcmludFN0YWNrVHJhY2Uodyk7CisgICAgICAgIHcuY2xvc2UoKTsKKyAgICAgICAgbG9nKHN3LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXNzb3IgdG8gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lLgorICAgICAqIEBzaW5jZSAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBDb21tYW5kbGluZUphdmEgZ2V0Q29tbWFuZExpbmUoKSB7CisgICAgICAgIHJldHVybiBjbWRsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3lzdGVtIHByb3BlcnRpZXMgb2YgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydGllcyBvZiB0aGlzIGphdmEgaW52b2NhdGlvbi4KKyAgICAgKiBAc2luY2UgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tbWFuZGxpbmVKYXZhLlN5c1Byb3BlcnRpZXMgZ2V0U3lzUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbW1hbmRMaW5lKCkuZ2V0U3lzdGVtUHJvcGVydGllcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFjLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMGNjZDEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhYy5qYXZhCkBAIC0wLDAgKzEsMTE3NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnMuQ29tcGlsZXJBZGFwdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbXBpbGVycy5Db21waWxlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuR2xvYlBhdHRlcm5NYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Tb3VyY2VGaWxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZS5GYWNhZGVUYXNrSGVscGVyOworCisvKioKKyAqIENvbXBpbGVzIEphdmEgc291cmNlIGZpbGVzLiBUaGlzIHRhc2sgY2FuIHRha2UgdGhlIGZvbGxvd2luZworICogYXJndW1lbnRzOgorICogPHVsPgorICogPGxpPnNvdXJjZWRpcgorICogPGxpPmRlc3RkaXIKKyAqIDxsaT5kZXByZWNhdGlvbgorICogPGxpPmNsYXNzcGF0aAorICogPGxpPmJvb3RjbGFzc3BhdGgKKyAqIDxsaT5leHRkaXJzCisgKiA8bGk+b3B0aW1pemUKKyAqIDxsaT5kZWJ1ZworICogPGxpPmVuY29kaW5nCisgKiA8bGk+dGFyZ2V0CisgKiA8bGk+ZGVwZW5kCisgKiA8bGk+dmVyYm9zZQorICogPGxpPmZhaWxvbmVycm9yCisgKiA8bGk+aW5jbHVkZWFudHJ1bnRpbWUKKyAqIDxsaT5pbmNsdWRlamF2YXJ1bnRpbWUKKyAqIDxsaT5zb3VyY2UKKyAqIDxsaT5jb21waWxlcgorICogPC91bD4KKyAqIE9mIHRoZXNlIGFyZ3VtZW50cywgdGhlIDxiPnNvdXJjZWRpcjwvYj4gYW5kIDxiPmRlc3RkaXI8L2I+IGFyZSByZXF1aXJlZC4KKyAqIDxwPgorICogV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgcmVjdXJzaXZlbHkgc2NhbiB0aGUgc291cmNlZGlyIGFuZAorICogZGVzdGRpciBsb29raW5nIGZvciBKYXZhIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLiBUaGlzIHRhc2sgbWFrZXMgaXRzCisgKiBjb21waWxlIGRlY2lzaW9uIGJhc2VkIG9uIHRpbWVzdGFtcC4KKyAqCisgKgorICogQHNpbmNlIEFudCAxLjEKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImphdmEiCisgKi8KKworcHVibGljIGNsYXNzIEphdmFjIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMX01TRworICAgICAgICA9ICJDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBQzE2ID0gImphdmFjMS42IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUMxNSA9ICJqYXZhYzEuNSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFDMTQgPSAiamF2YWMxLjQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBQzEzID0gImphdmFjMS4zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUMxMiA9ICJqYXZhYzEuMiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFDMTEgPSAiamF2YWMxLjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFUk4gPSAibW9kZXJuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NJQyA9ICJjbGFzc2ljIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUSkFWQUMgPSAiZXh0SmF2YWMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfSU5GT19KQVZBID0gInBhY2thZ2UtaW5mby5qYXZhIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9JTkZPX0NMQVNTID0gInBhY2thZ2UtaW5mby5jbGFzcyI7CisKKyAgICBwcml2YXRlIFBhdGggc3JjOworICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOworICAgIHByaXZhdGUgUGF0aCBjb21waWxlQ2xhc3NwYXRoOworICAgIHByaXZhdGUgUGF0aCBjb21waWxlU291cmNlcGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gb3B0aW1pemUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVwcmVjYXRpb24gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVwZW5kID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRBdHRyaWJ1dGU7CisgICAgcHJpdmF0ZSBQYXRoIGJvb3RjbGFzc3BhdGg7CisgICAgcHJpdmF0ZSBQYXRoIGV4dGRpcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVBbnRSdW50aW1lID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUphdmFSdW50aW1lID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGZvcmsgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBmb3JrZWRFeGVjdXRhYmxlID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbm93YXJuID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWVtb3J5SW5pdGlhbFNpemU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWVtb3J5TWF4aW11bVNpemU7CisgICAgcHJpdmF0ZSBGYWNhZGVUYXNrSGVscGVyIGZhY2FkZSA9IG51bGw7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0RmlsZXMgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgRmlsZVtdIGNvbXBpbGVMaXN0ID0gbmV3IEZpbGVbMF07CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZTsKKyAgICBwcml2YXRlIFN0cmluZyBkZWJ1Z0xldmVsOworICAgIHByaXZhdGUgRmlsZSB0bXBEaXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXBkYXRlZFByb3BlcnR5OworICAgIHByaXZhdGUgU3RyaW5nIGVycm9yUHJvcGVydHk7CisgICAgcHJpdmF0ZSBib29sZWFuIHRhc2tTdWNjZXNzID0gdHJ1ZTsgLy8gYXNzdW1lIHRoZSBiZXN0CisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVEZXN0Q2xhc3NlcyA9IHRydWU7CisgICAgcHJpdmF0ZSBMaXN0ICAgIHVwZGF0ZURpckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBKYXZhYyB0YXNrIGZvciBjb21waWxhdGlvbiBvZiBKYXZhIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBKYXZhYygpIHsKKyAgICAgICAgZmFjYWRlID0gbmV3IEZhY2FkZVRhc2tIZWxwZXIoYXNzdW1lZEphdmFWZXJzaW9uKCkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGFzc3VtZWRKYXZhVmVyc2lvbigpIHsKKyAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMikpIHsKKyAgICAgICAgICAgIHJldHVybiBKQVZBQzEyOworICAgICAgICB9IGVsc2UgaWYgKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMykpIHsKKyAgICAgICAgICAgIHJldHVybiBKQVZBQzEzOworICAgICAgICB9IGVsc2UgaWYgKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfNCkpIHsKKyAgICAgICAgICAgIHJldHVybiBKQVZBQzE0OworICAgICAgICB9IGVsc2UgaWYgKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfNSkpIHsKKyAgICAgICAgICAgIHJldHVybiBKQVZBQzE1OworICAgICAgICB9IGVsc2UgaWYgKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfNikpIHsKKyAgICAgICAgICAgIHJldHVybiBKQVZBQzE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIENMQVNTSUM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGRlYnVnTGV2ZWwuCisgICAgICogQHJldHVybiB2YWx1ZSBvZiBkZWJ1Z0xldmVsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVidWdMZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIGRlYnVnTGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogS2V5d29yZCBsaXN0IHRvIGJlIGFwcGVuZGVkIHRvIHRoZSAtZyBjb21tYW5kLWxpbmUgc3dpdGNoLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIGJlIGlnbm9yZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBleGNlcHQgbW9kZXJuCisgICAgICogYW5kIGNsYXNzaWModmVyID49IDEuMikuIExlZ2FsIHZhbHVlcyBhcmUgbm9uZSBvciBhCisgICAgICogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIGZvbGxvd2luZyBrZXl3b3JkczogbGluZXMsIHZhcnMsCisgICAgICogYW5kIHNvdXJjZS4gSWYgZGVidWdsZXZlbCBpcyBub3Qgc3BlY2lmaWVkLCBieSBkZWZhdWx0LCA6bm9uZQorICAgICAqIHdpbGwgYmUgYXBwZW5kZWQgdG8gLWcuIElmIGRlYnVnIGlzIG5vdCB0dXJuZWQgb24sIHRoaXMgYXR0cmlidXRlCisgICAgICogd2lsbCBiZSBpZ25vcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBkZWJ1Z0xldmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnTGV2ZWwoU3RyaW5nICB2KSB7CisgICAgICAgIHRoaXMuZGVidWdMZXZlbCA9IHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBzb3VyY2UuCisgICAgICogQHJldHVybiB2YWx1ZSBvZiBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBzb3VyY2UgIT0gbnVsbAorICAgICAgICAgICAgPyBzb3VyY2UgOiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9KQVZBQ19TT1VSQ0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoZSAtc291cmNlIGNvbW1hbmQtbGluZSBzd2l0Y2g7IHdpbGwgYmUgaWdub3JlZAorICAgICAqIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0IG1vZGVybiBhbmQgamlrZXMuCisgICAgICoKKyAgICAgKiBJZiB5b3UgdXNlIHRoaXMgYXR0cmlidXRlIHRvZ2V0aGVyIHdpdGggamlrZXMsIHlvdSBtdXN0IG1ha2UKKyAgICAgKiBzdXJlIHRoYXQgeW91ciB2ZXJzaW9uIG9mIGppa2VzIHN1cHBvcnRzIHRoZSAtc291cmNlIHN3aXRjaC4KKyAgICAgKiBMZWdhbCB2YWx1ZXMgYXJlIDEuMywgMS40LCAxLjUsIGFuZCA1IC0gYnkgZGVmYXVsdCwgbm8KKyAgICAgKiAtc291cmNlIGFyZ3VtZW50IHdpbGwgYmUgdXNlZCBhdCBhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nICB2KSB7CisgICAgICAgIHRoaXMuc291cmNlID0gdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCBmb3Igc291cmNlIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5lc3RlZCBzcmMgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVTcmMoKSB7CisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgc3JjID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3JjLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNyZWF0ZSBzcmMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmVzdGVkIHNyYyBlbGVtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQYXRoIHJlY3JlYXRlU3JjKCkgeworICAgICAgICBzcmMgPSBudWxsOworICAgICAgICByZXR1cm4gY3JlYXRlU3JjKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3JpZXMgdG8gZmluZCB0aGUgc291cmNlIEphdmEgZmlsZXMuCisgICAgICogQHBhcmFtIHNyY0RpciB0aGUgc291cmNlIGRpcmVjdG9yaWVzIGFzIGEgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY2RpcihQYXRoIHNyY0RpcikgeworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyYyA9IHNyY0RpcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyYy5hcHBlbmQoc3JjRGlyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNvdXJjZSBkaXJzIHRvIGZpbmQgdGhlIHNvdXJjZSBqYXZhIGZpbGVzLgorICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBkaXJlY3RvcmllcyBhcyBhIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRTcmNkaXIoKSB7CisgICAgICAgIHJldHVybiBzcmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgSmF2YSBzb3VyY2UKKyAgICAgKiBmaWxlcyBzaG91bGQgYmUgY29tcGlsZWQuCisgICAgICogQHBhcmFtIGRlc3REaXIgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgamF2YSBzb3VyY2UgZmlsZXMKKyAgICAgKiBzaG91bGQgYmUgY29tcGlsZWQuCisgICAgICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RGVzdGRpcigpIHsKKyAgICAgICAgcmV0dXJuIGRlc3REaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2VwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCisgICAgICogQHBhcmFtIHNvdXJjZXBhdGggdGhlIHNvdXJjZSBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlcGF0aChQYXRoIHNvdXJjZXBhdGgpIHsKKyAgICAgICAgaWYgKGNvbXBpbGVTb3VyY2VwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXBpbGVTb3VyY2VwYXRoID0gc291cmNlcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbXBpbGVTb3VyY2VwYXRoLmFwcGVuZChzb3VyY2VwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNvdXJjZXBhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldFNvdXJjZXBhdGgoKSB7CisgICAgICAgIHJldHVybiBjb21waWxlU291cmNlcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCB0byBzb3VyY2VwYXRoLgorICAgICAqIEByZXR1cm4gYSBzb3VyY2VwYXRoIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVTb3VyY2VwYXRoKCkgeworICAgICAgICBpZiAoY29tcGlsZVNvdXJjZXBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZVNvdXJjZXBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21waWxlU291cmNlcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIHNvdXJjZSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAqIEBwYXJhbSByIGEgcmVmZXJlbmNlIHRvIGEgc291cmNlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNyZWF0ZVNvdXJjZXBhdGgoKS5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgY29tcGlsYXRpb24gY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAoY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjb21waWxlQ2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguCisgICAgICogQHJldHVybiBhIGNsYXNzIHBhdGggdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGNvbXBpbGVDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBpbGVDbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICogQHBhcmFtIHIgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYm9vdGNsYXNzcGF0aCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb21waWxlIHRoZSBjbGFzc2VzCisgICAgICogYWdhaW5zdC4KKyAgICAgKiBAcGFyYW0gYm9vdGNsYXNzcGF0aCBhIHBhdGggdG8gdXNlIGFzIGEgYm9vdCBjbGFzcyBwYXRoIChtYXkgYmUgbW9yZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoYW4gb25lKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb3RjbGFzc3BhdGgoUGF0aCBib290Y2xhc3NwYXRoKSB7CisgICAgICAgIGlmICh0aGlzLmJvb3RjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5ib290Y2xhc3NwYXRoID0gYm9vdGNsYXNzcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuYm9vdGNsYXNzcGF0aC5hcHBlbmQoYm9vdGNsYXNzcGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBib290Y2xhc3NwYXRoIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbXBpbGUgdGhlIGNsYXNzZXMKKyAgICAgKiBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdGhlIGJvb3QgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldEJvb3RjbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBib290Y2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXRoIHRvIHRoZSBib290Y2xhc3NwYXRoLgorICAgICAqIEByZXR1cm4gYSBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVCb290Y2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoYm9vdGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBib290Y2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm9vdGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICAgKiBAcGFyYW0gciBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb3RDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQm9vdGNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGV4dGVuc2lvbiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlCisgICAgICogY29tcGlsYXRpb24uCisgICAgICogQHBhcmFtIGV4dGRpcnMgYSBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0ZGlycyhQYXRoIGV4dGRpcnMpIHsKKyAgICAgICAgaWYgKHRoaXMuZXh0ZGlycyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmV4dGRpcnMgPSBleHRkaXJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5leHRkaXJzLmFwcGVuZChleHRkaXJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGV4dGVuc2lvbiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlCisgICAgICogY29tcGlsYXRpb24uCisgICAgICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIGFzIGEgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldEV4dGRpcnMoKSB7CisgICAgICAgIHJldHVybiBleHRkaXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXRoIHRvIGV4dGRpcnMuCisgICAgICogQHJldHVybiBhIHBhdGggdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUV4dGRpcnMoKSB7CisgICAgICAgIGlmIChleHRkaXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIGV4dGRpcnMgPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBleHRkaXJzLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBsaXN0IHRoZSBzb3VyY2UgZmlsZXMgYmVpbmcgaGFuZGVkIG9mZiB0byB0aGUgY29tcGlsZXIuCisgICAgICogQHBhcmFtIGxpc3QgaWYgdHJ1ZSBsaXN0IHRoZSBzb3VyY2UgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZmlsZXMoYm9vbGVhbiBsaXN0KSB7CisgICAgICAgIGxpc3RGaWxlcyA9IGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0ZmlsZXMgZmxhZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0ZmlsZXMgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldExpc3RmaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIGxpc3RGaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYnVpbGQgd2lsbCBjb250aW51ZQorICAgICAqIGV2ZW4gaWYgdGhlcmUgYXJlIGNvbXBpbGF0aW9uIGVycm9yczsgZGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKiBAcGFyYW0gZmFpbCBpZiB0cnVlIGhhbHQgdGhlIGJ1aWxkIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsb25lcnJvcihib29sZWFuIGZhaWwpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSBmYWlsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKiBAcGFyYW0gcHJvY2VlZCBpbnZlcnNlIG9mIGZhaWxvZmVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvY2VlZChib29sZWFuIHByb2NlZWQpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSAhcHJvY2VlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmYWlsb25lcnJvciBmbGFnLgorICAgICAqIEByZXR1cm4gdGhlIGZhaWxvbmVycm9yIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsb25lcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIGZhaWxPbkVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUKKyAgICAgKiBjb21waWxlZCB3aXRoIGRlcHJlY2F0aW9uIGluZm9ybWF0aW9uOyBkZWZhdWx0cyB0byBvZmYuCisgICAgICogQHBhcmFtIGRlcHJlY2F0aW9uIGlmIHRydWUgdHVybiBvbiBkZXByZWNhdGlvbiBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlcHJlY2F0aW9uKGJvb2xlYW4gZGVwcmVjYXRpb24pIHsKKyAgICAgICAgdGhpcy5kZXByZWNhdGlvbiA9IGRlcHJlY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlcHJlY2F0aW9uIGZsYWcuCisgICAgICogQHJldHVybiB0aGUgZGVwcmVjYXRpb24gZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERlcHJlY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVwcmVjYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBWTQorICAgICAqIGlmIGphdmFjIGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4KKyAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuCisgICAgICogKEV4YW1wbGVzOiA4Mzg4NjA4MCwgODE5MjBrLCBvciA4MG0pCisgICAgICogQHBhcmFtIG1lbW9yeUluaXRpYWxTaXplIHN0cmluZyB0byBwYXNzIHRvIFZNCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVtb3J5SW5pdGlhbFNpemUoU3RyaW5nIG1lbW9yeUluaXRpYWxTaXplKSB7CisgICAgICAgIHRoaXMubWVtb3J5SW5pdGlhbFNpemUgPSBtZW1vcnlJbml0aWFsU2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZW1vcnlJbml0aWFsU2l6ZSBmbGFnLgorICAgICAqIEByZXR1cm4gdGhlIG1lbW9yeUluaXRpYWxTaXplIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lbW9yeUluaXRpYWxTaXplKCkgeworICAgICAgICByZXR1cm4gbWVtb3J5SW5pdGlhbFNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBWTQorICAgICAqIGlmIGphdmFjIGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4KKyAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuCisgICAgICogKEV4YW1wbGVzOiA4Mzg4NjA4MCwgODE5MjBrLCBvciA4MG0pCisgICAgICogQHBhcmFtIG1lbW9yeU1heGltdW1TaXplIHN0cmluZyB0byBwYXNzIHRvIFZNCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVtb3J5TWF4aW11bVNpemUoU3RyaW5nIG1lbW9yeU1heGltdW1TaXplKSB7CisgICAgICAgIHRoaXMubWVtb3J5TWF4aW11bVNpemUgPSBtZW1vcnlNYXhpbXVtU2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZW1vcnlNYXhpbXVtU2l6ZSBmbGFnLgorICAgICAqIEByZXR1cm4gdGhlIG1lbW9yeU1heGltdW1TaXplIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lbW9yeU1heGltdW1TaXplKCkgeworICAgICAgICByZXR1cm4gbWVtb3J5TWF4aW11bVNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKYXZhIHNvdXJjZSBmaWxlIGVuY29kaW5nIG5hbWUuCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBzb3VyY2UgZmlsZSBlbmNvZGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgamF2YSBzb3VyY2UgZmlsZSBlbmNvZGluZyBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBmaWxlIGVuY29kaW5nIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZAorICAgICAqIHdpdGggZGVidWcgaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIG9mZi4KKyAgICAgKiBAcGFyYW0gZGVidWcgaWYgdHJ1ZSBjb21waWxlIHdpdGggZGVidWcgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGRlYnVnKSB7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZWJ1ZyBmbGFnLgorICAgICAqIEByZXR1cm4gdGhlIGRlYnVnIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWJ1ZygpIHsKKyAgICAgICAgcmV0dXJuIGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGNvbXBpbGVzIHdpdGggb3B0aW1pemF0aW9uIGVuYWJsZWQuCisgICAgICogQHBhcmFtIG9wdGltaXplIGlmIHRydWUgY29tcGlsZSB3aXRoIG9wdGltaXphdGlvbiBlbmFibGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW1pemUoYm9vbGVhbiBvcHRpbWl6ZSkgeworICAgICAgICB0aGlzLm9wdGltaXplID0gb3B0aW1pemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgb3B0aW1pemUgZmxhZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBvcHRpbWl6ZSBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW1pemUoKSB7CisgICAgICAgIHJldHVybiBvcHRpbWl6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGVzIGRlcGVuZGVuY3ktdHJhY2tpbmcgZm9yIGNvbXBpbGVycworICAgICAqIHRoYXQgc3VwcG9ydCB0aGlzIChqaWtlcyBhbmQgY2xhc3NpYykuCisgICAgICogQHBhcmFtIGRlcGVuZCBpZiB0cnVlIGVuYWJsZSBkZXBlbmRlbmN5LXRyYWNraW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVwZW5kKGJvb2xlYW4gZGVwZW5kKSB7CisgICAgICAgIHRoaXMuZGVwZW5kID0gZGVwZW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlcGVuZCBmbGFnLgorICAgICAqIEByZXR1cm4gdGhlIGRlcGVuZCBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVwZW5kKCkgeworICAgICAgICByZXR1cm4gZGVwZW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGFza3MgdGhlIGNvbXBpbGVyIGZvciB2ZXJib3NlIG91dHB1dC4KKyAgICAgKiBAcGFyYW0gdmVyYm9zZSBpZiB0cnVlLCBhc2tzIHRoZSBjb21waWxlciBmb3IgdmVyYm9zZSBvdXRwdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgeworICAgICAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZlcmJvc2UgZmxhZy4KKyAgICAgKiBAcmV0dXJuIHRoZSB2ZXJib3NlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWZXJib3NlKCkgeworICAgICAgICByZXR1cm4gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgVk0gdGhhdCB0aGUgY2xhc3NlcyB3aWxsIGJlIGNvbXBpbGVkIGZvci4gVmFsaWQKKyAgICAgKiB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBjb21waWxlciwgZm9yIGpkayAxLjQgdGhlIHZhbGlkIHZhbHVlcyBhcmUKKyAgICAgKiAiMS4xIiwgIjEuMiIsICIxLjMiLCAiMS40IiwgIjEuNSIsICIxLjYiLCAiNSIgYW5kICI2Ii4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgVk0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldCkgeworICAgICAgICB0aGlzLnRhcmdldEF0dHJpYnV0ZSA9IHRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0YXJnZXQgVk0gdGhhdCB0aGUgY2xhc3NlcyB3aWxsIGJlIGNvbXBpbGVkIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSB0YXJnZXQgVk0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldEF0dHJpYnV0ZSAhPSBudWxsCisgICAgICAgICAgICA/IHRhcmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgOiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9KQVZBQ19UQVJHRVQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGluY2x1ZGVzIEFudCdzIG93biBjbGFzc3BhdGggaW4gdGhlIGNsYXNzcGF0aC4KKyAgICAgKiBAcGFyYW0gaW5jbHVkZSBpZiB0cnVlLCBpbmNsdWRlcyBBbnQncyBvd24gY2xhc3NwYXRoIGluIHRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlYW50cnVudGltZShib29sZWFuIGluY2x1ZGUpIHsKKyAgICAgICAgaW5jbHVkZUFudFJ1bnRpbWUgPSBpbmNsdWRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciBvciBub3QgdGhlIGFudCBjbGFzc3BhdGggaXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBhbnQgY2xhc3NwYXRoIGlzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbmNsdWRlYW50cnVudGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGluY2x1ZGVBbnRSdW50aW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGluY2x1ZGVzIHRoZSBKYXZhIHJ1bnRpbWUgbGlicmFyaWVzIGluIHRoZSBjbGFzc3BhdGguCisgICAgICogQHBhcmFtIGluY2x1ZGUgaWYgdHJ1ZSwgaW5jbHVkZXMgdGhlIEphdmEgcnVudGltZSBsaWJyYXJpZXMgaW4gdGhlIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVqYXZhcnVudGltZShib29sZWFuIGluY2x1ZGUpIHsKKyAgICAgICAgaW5jbHVkZUphdmFSdW50aW1lID0gaW5jbHVkZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgb3Igbm90IHRoZSBqYXZhIHJ1bnRpbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoaXMKKyAgICAgKiB0YXNrJ3MgY2xhc3NwYXRoLgorICAgICAqIEByZXR1cm4gdGhlIGluY2x1ZGVqYXZhcnVudGltZSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbmNsdWRlamF2YXJ1bnRpbWUoKSB7CisgICAgICAgIHJldHVybiBpbmNsdWRlSmF2YVJ1bnRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZm9ya3MgdGhlIGphdmFjIGNvbXBpbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGYgInRydWV8ZmFsc2V8b258b2ZmfHllc3xubyIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JrKGJvb2xlYW4gZikgeworICAgICAgICBmb3JrID0gZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBqYXZhYyBleGVjdXRhYmxlLgorICAgICAqCisgICAgICogPHA+SWdub3JlZCB1bmxlc3MgZm9yayBpcyB0cnVlIG9yIGV4dEphdmFjIGhhcyBiZWVuIHNwZWNpZmllZAorICAgICAqIGFzIHRoZSBjb21waWxlci48L3A+CisgICAgICogQHBhcmFtIGZvcmtFeGVjIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgZm9ya0V4ZWMpIHsKKyAgICAgICAgZm9ya2VkRXhlY3V0YWJsZSA9IGZvcmtFeGVjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZXhlY3V0YWJsZSBhdHRyaWJ1dGUsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgamF2YSBleGVjdXRhYmxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeGVjdXRhYmxlKCkgeworICAgICAgICByZXR1cm4gZm9ya2VkRXhlY3V0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGEgZm9ya2VkIGludm9jYXRpb24gb2YgSkRLJ3MgamF2YWM/CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBmb3JrZWQgaW52b2NhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRm9ya2VkSmF2YWMoKSB7CisgICAgICAgIHJldHVybiBmb3JrIHx8ICJleHRKYXZhYyIuZXF1YWxzKGdldENvbXBpbGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBqYXZhYyBleGVjdXRhYmxlIHRvIHVzZSBpbiBmb3JrLW1vZGUuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGlzIGVpdGhlciB0aGUgbmFtZSBzcGVjaWZpZWQgd2l0aCB0aGUgZXhlY3V0YWJsZQorICAgICAqIGF0dHJpYnV0ZSBvciB0aGUgZnVsbCBwYXRoIG9mIHRoZSBqYXZhYyBjb21waWxlciBvZiB0aGUgVk0gQW50CisgICAgICogaXMgY3VycmVudGx5IHJ1bm5pbmcgaW4gLSBndWVzc2VkIGJ5IEFudC48L3A+CisgICAgICoKKyAgICAgKiA8cD5Zb3Ugc2hvdWxkIDxzdHJvbmc+bm90PC9zdHJvbmc+IGludm9rZSB0aGlzIG1ldGhvZCBpZiB5b3UKKyAgICAgKiB3YW50IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGV4ZWN1dGFibGUgY29tbWFuZCAtIHVzZSB7QGxpbmsKKyAgICAgKiAjZ2V0RXhlY3V0YWJsZSBnZXRFeGVjdXRhYmxlfSBmb3IgdGhpcy48L3A+CisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgamF2YWMgZXhlY3V0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YWNFeGVjdXRhYmxlKCkgeworICAgICAgICBpZiAoZm9ya2VkRXhlY3V0YWJsZSA9PSBudWxsICYmIGlzRm9ya2VkSmF2YWMoKSkgeworICAgICAgICAgICAgZm9ya2VkRXhlY3V0YWJsZSA9IGdldFN5c3RlbUphdmFjKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZm9ya2VkRXhlY3V0YWJsZSAhPSBudWxsICYmICFpc0ZvcmtlZEphdmFjKCkpIHsKKyAgICAgICAgICAgIGZvcmtlZEV4ZWN1dGFibGUgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3JrZWRFeGVjdXRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGVuYWJsZXMgdGhlIC1ub3dhcm4gb3B0aW9uLgorICAgICAqIEBwYXJhbSBmbGFnIGlmIHRydWUsIGVuYWJsZSB0aGUgLW5vd2FybiBvcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb3dhcm4oYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIHRoaXMubm93YXJuID0gZmxhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgdGhlIC1ub3dhcm4gb3B0aW9uIGJlIHVzZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSAtbm93YXJuIG9wdGlvbiBzaG91bGQgYmUgdXNlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE5vd2FybigpIHsKKyAgICAgICAgcmV0dXJuIG5vd2FybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbW1hbmQtbGluZSBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIGEgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IGNyZWF0ZUNvbXBpbGVyQXJnKCkgeworICAgICAgICBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgYXJnID0KKyAgICAgICAgICAgIG5ldyBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQoKTsKKyAgICAgICAgZmFjYWRlLmFkZEltcGxlbWVudGF0aW9uQXJndW1lbnQoYXJnKTsKKyAgICAgICAgcmV0dXJuIGFyZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFkZGl0aW9uYWwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAgKiBAcmV0dXJuIGFycmF5IG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIGd1YXJhbnRlZWQgdG8gYmUgbm9uLW51bGwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEN1cnJlbnRDb21waWxlckFyZ3MoKSB7CisgICAgICAgIFN0cmluZyBjaG9zZW4gPSBmYWNhZGUuZ2V0RXhwbGljaXRDaG9pY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBmYWNhZGUga25vd3MgYWJvdXQgbWFnaWMgcHJvcGVydGllcyBhbmQgZm9yayBzZXR0aW5nCisgICAgICAgICAgICBTdHJpbmcgYXBwbGllZENvbXBpbGVyID0gZ2V0Q29tcGlsZXIoKTsKKyAgICAgICAgICAgIGZhY2FkZS5zZXRJbXBsZW1lbnRhdGlvbihhcHBsaWVkQ29tcGlsZXIpOworCisgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBmYWNhZGUuZ2V0QXJncygpOworCisgICAgICAgICAgICBTdHJpbmcgYWx0Q29tcGlsZXJOYW1lID0gZ2V0QWx0Q29tcGlsZXJOYW1lKGZhY2FkZS5nZXRJbXBsZW1lbnRhdGlvbigpKTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCAmJiBhbHRDb21waWxlck5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhY2FkZS5zZXRJbXBsZW1lbnRhdGlvbihhbHRDb21waWxlck5hbWUpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhY2FkZS5nZXRBcmdzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZhY2FkZS5zZXRJbXBsZW1lbnRhdGlvbihjaG9zZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWx0Q29tcGlsZXJOYW1lKFN0cmluZyBhbkltcGxlbWVudGF0aW9uKSB7CisgICAgICAgIGlmIChKQVZBQzE2LmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICB8fCBKQVZBQzE1LmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICB8fCBKQVZBQzE0LmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICB8fCBKQVZBQzEzLmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiBNT0RFUk47CisgICAgICAgIH0KKyAgICAgICAgaWYgKEpBVkFDMTIuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQorICAgICAgICAgICAgICAgIHx8IEpBVkFDMTEuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIENMQVNTSUM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1PREVSTi5lcXVhbHNJZ25vcmVDYXNlKGFuSW1wbGVtZW50YXRpb24pKSB7CisgICAgICAgICAgICBTdHJpbmcgbmV4dFNlbGVjdGVkID0gYXNzdW1lZEphdmFWZXJzaW9uKCk7CisgICAgICAgICAgICBpZiAoSkFWQUMxNi5lcXVhbHNJZ25vcmVDYXNlKG5leHRTZWxlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgfHwgSkFWQUMxNS5lcXVhbHNJZ25vcmVDYXNlKG5leHRTZWxlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgfHwgSkFWQUMxNC5lcXVhbHNJZ25vcmVDYXNlKG5leHRTZWxlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgfHwgSkFWQUMxMy5lcXVhbHNJZ25vcmVDYXNlKG5leHRTZWxlY3RlZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFNlbGVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChDTEFTU0lDLmVxdWFscyhhbkltcGxlbWVudGF0aW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIGFzc3VtZWRKYXZhVmVyc2lvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRKQVZBQy5lcXVhbHNJZ25vcmVDYXNlKGFuSW1wbGVtZW50YXRpb24pKSB7CisgICAgICAgICAgICByZXR1cm4gYXNzdW1lZEphdmFWZXJzaW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlcmUgQW50IHNob3VsZCBwbGFjZSB0ZW1wb3JhcnkgZmlsZXMuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqIEBwYXJhbSB0bXBEaXIgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUZW1wZGlyKEZpbGUgdG1wRGlyKSB7CisgICAgICAgIHRoaXMudG1wRGlyID0gdG1wRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXJlIEFudCBzaG91bGQgcGxhY2UgdGVtcG9yYXJ5IGZpbGVzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKiBAcmV0dXJuIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0VGVtcGRpcigpIHsKKyAgICAgICAgcmV0dXJuIHRtcERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgdG8gc2V0IG9uIGNvbXBsaWF0aW9uIHN1Y2Nlc3MuCisgICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG5vdCBiZSBzZXQgaWYgdGhlIGNvbXBpbGF0aW9uCisgICAgICogZmFpbHMsIG9yIGlmIHRoZXJlIGFyZSBubyBmaWxlcyB0byBjb21waWxlLgorICAgICAqIEBwYXJhbSB1cGRhdGVkUHJvcGVydHkgdGhlIHByb3BlcnR5IG5hbWUgdG8gdXNlLgorICAgICAqIEBzaW5jZSBBbnQgMS43LjEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXBkYXRlZFByb3BlcnR5KFN0cmluZyB1cGRhdGVkUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy51cGRhdGVkUHJvcGVydHkgPSB1cGRhdGVkUHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IHRvIHNldCBvbiBjb21wbGlhdGlvbiBmYWlsdXJlLgorICAgICAqIFRoaXMgcHJvcGVydHkgd2lsbCBiZSBzZXQgaWYgdGhlIGNvbXBpbGF0aW9uCisgICAgICogZmFpbHMuCisgICAgICogQHBhcmFtIGVycm9yUHJvcGVydHkgdGhlIHByb3BlcnR5IG5hbWUgdG8gdXNlLgorICAgICAqIEBzaW5jZSBBbnQgMS43LjEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JQcm9wZXJ0eShTdHJpbmcgZXJyb3JQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLmVycm9yUHJvcGVydHkgPSBlcnJvclByb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgcHJvcGVydHkgY29udHJvbHMgd2hldGhlciB0byBpbmNsdWRlIHRoZQorICAgICAqIGRlc3RpbmF0aW9uIGNsYXNzZXMgZGlyZWN0b3J5IGluIHRoZSBjbGFzc3BhdGgKKyAgICAgKiBnaXZlbiB0byB0aGUgY29tcGlsZXIuCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgInRydWUiLgorICAgICAqIEBwYXJhbSBpbmNsdWRlRGVzdENsYXNzZXMgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlRGVzdENsYXNzZXMoYm9vbGVhbiBpbmNsdWRlRGVzdENsYXNzZXMpIHsKKyAgICAgICAgdGhpcy5pbmNsdWRlRGVzdENsYXNzZXMgPSBpbmNsdWRlRGVzdENsYXNzZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgaW5jbHVkZURlc3RDbGFzc2VzIHByb3BlcnR5LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZURlc3RDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gaW5jbHVkZURlc3RDbGFzc2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVzdWx0IG9mIHRoZSBqYXZhYyB0YXNrIChzdWNjZXNzIG9yIGZhaWx1cmUpLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb21waWxhdGlvbiBzdWNjZWVkZWQsIG9yCisgICAgICogICAgICAgICB3YXMgbm90IG5lY2Nlc3NhcnksIGZhbHNlIGlmIHRoZSBjb21waWxhdGlvbiBmYWlsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VGFza1N1Y2Nlc3MoKSB7CisgICAgICAgIHJldHVybiB0YXNrU3VjY2VzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBjaGVja1BhcmFtZXRlcnMoKTsKKyAgICAgICAgcmVzZXRGaWxlTGlzdHMoKTsKKworICAgICAgICAvLyBzY2FuIHNvdXJjZSBkaXJlY3RvcmllcyBhbmQgZGVzdCBkaXJlY3RvcnkgdG8gYnVpbGQgdXAKKyAgICAgICAgLy8gY29tcGlsZSBsaXN0cworICAgICAgICBTdHJpbmdbXSBsaXN0ID0gc3JjLmxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIHNyY0RpciA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShsaXN0W2ldKTsKKyAgICAgICAgICAgIGlmICghc3JjRGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmNkaXIgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3JjRGlyLmdldFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBkb2VzIG5vdCBleGlzdCEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHRoaXMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihzcmNEaXIpOworICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisKKyAgICAgICAgICAgIHNjYW5EaXIoc3JjRGlyLCBkZXN0RGlyICE9IG51bGwgPyBkZXN0RGlyIDogc3JjRGlyLCBmaWxlcyk7CisgICAgICAgIH0KKworICAgICAgICBjb21waWxlKCk7CisgICAgICAgIGlmICh1cGRhdGVkUHJvcGVydHkgIT0gbnVsbAorICAgICAgICAgICAgJiYgdGFza1N1Y2Nlc3MKKyAgICAgICAgICAgICYmIGNvbXBpbGVMaXN0Lmxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkodXBkYXRlZFByb3BlcnR5LCAidHJ1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgY29tcGlsZWQgYW5kIGNvcGllZC4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRGaWxlTGlzdHMoKSB7CisgICAgICAgIGNvbXBpbGVMaXN0ID0gbmV3IEZpbGVbMF07CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbnMgdGhlIGRpcmVjdG9yeSBsb29raW5nIGZvciBzb3VyY2UgZmlsZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICogVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIHRoZSBjbGFzcyB2YXJpYWJsZSBjb21waWxlTGlzdAorICAgICAqCisgICAgICogQHBhcmFtIHNyY0RpciAgIFRoZSBzb3VyY2UgZGlyZWN0b3J5CisgICAgICogQHBhcmFtIGRlc3REaXIgIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gZmlsZXMgICAgQW4gYXJyYXkgb2YgZmlsZW5hbWVzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2NhbkRpcihGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyLCBTdHJpbmdbXSBmaWxlcykgeworICAgICAgICBHbG9iUGF0dGVybk1hcHBlciBtID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7CisgICAgICAgIG0uc2V0RnJvbSgiKi5qYXZhIik7CisgICAgICAgIG0uc2V0VG8oIiouY2xhc3MiKTsKKyAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgc2ZzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOworICAgICAgICBGaWxlW10gbmV3RmlsZXMgPSBzZnMucmVzdHJpY3RBc0ZpbGVzKGZpbGVzLCBzcmNEaXIsIGRlc3REaXIsIG0pOworCisgICAgICAgIG5ld0ZpbGVzID0gcmVtb3ZlUGFja2FnZUluZm9GaWxlcyhuZXdGaWxlcywgc3JjRGlyLCBkZXN0RGlyKTsKKyAgICAgICAgaWYgKG5ld0ZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIEZpbGVbXSBuZXdDb21waWxlTGlzdAorICAgICAgICAgICAgICAgID0gbmV3IEZpbGVbY29tcGlsZUxpc3QubGVuZ3RoICsgbmV3RmlsZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29tcGlsZUxpc3QsIDAsIG5ld0NvbXBpbGVMaXN0LCAwLAorICAgICAgICAgICAgICAgICAgICBjb21waWxlTGlzdC5sZW5ndGgpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuZXdGaWxlcywgMCwgbmV3Q29tcGlsZUxpc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVMaXN0Lmxlbmd0aCwgbmV3RmlsZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGNvbXBpbGVMaXN0ID0gbmV3Q29tcGlsZUxpc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGJlIGNvbXBpbGVkLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmlsZXMgYXMgYW4gYXJyYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZVtdIGdldEZpbGVMaXN0KCkgeworICAgICAgICByZXR1cm4gY29tcGlsZUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIGEgamRrIGNvbXBpbGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGlsZXJJbXBsIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb21waWxlckltcGwgaXMgIm1vZGVybiIsICJjbGFzc2ljIiwKKyAgICAgKiAiamF2YWMxLjEiLCAiamF2YWMxLjIiLCAiamF2YWMxLjMiLCAiamF2YWMxLjQiLCAiamF2YWMxLjUiIG9yCisgICAgICogImphdmFjMS42Ii4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0pka0NvbXBpbGVyKFN0cmluZyBjb21waWxlckltcGwpIHsKKyAgICAgICAgcmV0dXJuIE1PREVSTi5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgQ0xBU1NJQy5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgSkFWQUMxNi5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgSkFWQUMxNS5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgSkFWQUMxNC5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgSkFWQUMxMy5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgSkFWQUMxMi5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgSkFWQUMxMS5lcXVhbHMoY29tcGlsZXJJbXBsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBleGVjdXRhYmxlIG5hbWUgb2YgdGhlIGphdmEgY29tcGlsZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN5c3RlbUphdmFjKCkgeworICAgICAgICByZXR1cm4gSmF2YUVudlV0aWxzLmdldEpka0V4ZWN1dGFibGUoImphdmFjIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hvb3NlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBwYXJ0aWN1bGFyIHRhc2suCisgICAgICogQHBhcmFtIGNvbXBpbGVyIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlcgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGNvbXBpbGVyKSB7CisgICAgICAgIGZhY2FkZS5zZXRJbXBsZW1lbnRhdGlvbihjb21waWxlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgdGFzay4KKyAgICAgKgorICAgICAqIDxwPkRlZmF1bHRzIHRvIHRoZSBidWlsZC5jb21waWxlciBwcm9wZXJ0eSBidXQgY2FuIGJlIG92ZXJyaWRkZW4KKyAgICAgKiB2aWEgdGhlIGNvbXBpbGVyIGFuZCBmb3JrIGF0dHJpYnV0ZXMuPC9wPgorICAgICAqCisgICAgICogPHA+SWYgZm9yayBoYXMgYmVlbiBzZXQgdG8gdHJ1ZSwgdGhlIHJlc3VsdCB3aWxsIGJlIGV4dEphdmFjCisgICAgICogYW5kIG5vdCBjbGFzc2ljIG9yIGphdmExLjIgLSBubyBtYXR0ZXIgd2hhdCB0aGUgY29tcGlsZXIKKyAgICAgKiBhdHRyaWJ1dGUgbG9va3MgbGlrZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDb21waWxlclZlcnNpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBjb21waWxlci4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGlsZXIoKSB7CisgICAgICAgIFN0cmluZyBjb21waWxlckltcGwgPSBnZXRDb21waWxlclZlcnNpb24oKTsKKyAgICAgICAgaWYgKGZvcmspIHsKKyAgICAgICAgICAgIGlmIChpc0pka0NvbXBpbGVyKGNvbXBpbGVySW1wbCkpIHsKKyAgICAgICAgICAgICAgICBjb21waWxlckltcGwgPSAiZXh0SmF2YWMiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coIlNpbmNlIGNvbXBpbGVyIHNldHRpbmcgaXNuJ3QgY2xhc3NpYyBvciBtb2Rlcm4sICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaWdub3JpbmcgZm9yayBzZXR0aW5nLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21waWxlckltcGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgdGFzay4KKyAgICAgKgorICAgICAqIDxwPkRlZmF1bHRzIHRvIHRoZSBidWlsZC5jb21waWxlciBwcm9wZXJ0eSBidXQgY2FuIGJlIG92ZXJyaWRkZW4KKyAgICAgKiB2aWEgdGhlIGNvbXBpbGVyIGF0dHJpYnV0ZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBkb2VzIG5vdCB0YWtlIHRoZSBmb3JrIGF0dHJpYnV0ZSBpbnRvCisgICAgICogYWNjb3VudC48L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDb21waWxlcgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBpbGVyLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyVmVyc2lvbigpIHsKKyAgICAgICAgZmFjYWRlLnNldE1hZ2ljVmFsdWUoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJidWlsZC5jb21waWxlciIpKTsKKyAgICAgICAgcmV0dXJuIGZhY2FkZS5nZXRJbXBsZW1lbnRhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldCBhbmQgbm90aGluZworICAgICAqIHNpbGx5IGhhcyBiZWVuIGVudGVyZWQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJhbWV0ZXJzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwgJiYgIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0aW5hdGlvbiBkaXJlY3RvcnkgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXN0RGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgZG9lcyBub3QgZXhpc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSB0aGUgY29tcGlsYXRpb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNvbXBpbGUoKSB7CisgICAgICAgIFN0cmluZyBjb21waWxlckltcGwgPSBnZXRDb21waWxlcigpOworCisgICAgICAgIGlmIChjb21waWxlTGlzdC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgY29tcGlsZUxpc3QubGVuZ3RoICsgIiBzb3VyY2UgZmlsZSIKKyAgICAgICAgICAgICAgICArIChjb21waWxlTGlzdC5sZW5ndGggPT0gMSA/ICIiIDogInMiKQorICAgICAgICAgICAgICAgICsgKGRlc3REaXIgIT0gbnVsbCA/ICIgdG8gIiArIGRlc3REaXIgOiAiIikpOworCisgICAgICAgICAgICBpZiAobGlzdEZpbGVzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21waWxlTGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gY29tcGlsZUxpc3RbaV0uZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgICBsb2coZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29tcGlsZXJBZGFwdGVyIGFkYXB0ZXIgPQorICAgICAgICAgICAgICAgIENvbXBpbGVyQWRhcHRlckZhY3RvcnkuZ2V0Q29tcGlsZXIoY29tcGlsZXJJbXBsLCB0aGlzKTsKKworICAgICAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcG9wdWxhdGUgdGhlIGNvbXBpbGVyIGFkYXB0ZXIKKyAgICAgICAgICAgIGFkYXB0ZXIuc2V0SmF2YWModGhpcyk7CisKKyAgICAgICAgICAgIC8vIGZpbmFsbHksIGxldHMgZXhlY3V0ZSB0aGUgY29tcGlsZXIhIQorICAgICAgICAgICAgaWYgKGFkYXB0ZXIuZXhlY3V0ZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gU3VjY2VzcyAtIGNoZWNrCisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdXBkYXRlRGlyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBmaWxlLnNldExhc3RNb2RpZmllZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBGYWlsIHBhdGgKKyAgICAgICAgICAgICAgICB0aGlzLnRhc2tTdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclByb3BlcnR5LCAidHJ1ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEZBSUxfTVNHLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coRkFJTF9NU0csIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiAiY29tcGlsZXIiIGF0dHJpYnV0ZSB0byBDb21tYW5kbGluZSRBdHRyaWJ1dGUgdXNlZCB0bworICAgICAqIGZpbHRlciBjb21tYW5kIGxpbmUgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgY3VycmVudAorICAgICAqIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgZXh0ZW5kcworICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZS5JbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gaW1wbCB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVyKFN0cmluZyBpbXBsKSB7CisgICAgICAgICAgICBzdXBlci5zZXRJbXBsZW1lbnRhdGlvbihpbXBsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgQ29kZSB0byByZW1vdmUgcGFja2FnZS1pbmZvLmphdmEgZmlsZXMgZnJvbSBjb21waWxhdGlvbgorICAgIC8vICBTaW5jZSBBbnQgMS43LjEuCisgICAgLy8KKyAgICAvLyAgICBwYWNrYWdlLWluZm8uamF2YSBhcmUgZmlsZXMgdGhhdCBjb250YWluIHBhY2thZ2UgbGV2ZWwKKyAgICAvLyAgICBhbm5vdGF0aW9ucy4gVGhleSBtYXkgb3IgbWF5IG5vdCBoYXZlIGNvcnJlc3BvbmRpbmcgLmNsYXNzCisgICAgLy8gICAgZmlsZXMuCisgICAgLy8KKyAgICAvLyAgICBUaGUgZm9sbG93aW5nIGNvZGUgdXNlcyB0aGUgYWxnb3JpdGhtOgorICAgIC8vICAgICAqIG9uIGVudHJ5IHdlIGhhdmUgdGhlIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBjb21waWxlZAorICAgIC8vICAgICAqIGlmIHRoZSBmaWxlbmFtZSBpcyBub3QgcGFja2FnZS1pbmZvLmphdmEgY29tcGlsZSBpdAorICAgIC8vICAgICAqIGlmIGEgY29ycmVzcG9uZGluZyAuY2xhc3MgZmlsZSBleGlzdHMgY29tcGlsZSBpdAorICAgIC8vICAgICAqIGlmIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBjb21waWxlIGl0CisgICAgLy8gICAgICogaWYgdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IGxhc3Rtb2RpZmVkIHRpbWUgaXMKKyAgICAvLyAgICAgICBvbGRlciB0aGFuIHRoZSBqYXZhIGZpbGUsIGNvbXBpbGUgdGhlIGphdmEgZmlsZSBhbmQKKyAgICAvLyAgICAgICB0b3VjaCB0aGUgY29ycmVzcG9uZGluZyBjbGFzcyBkaXJlY3RvcnkgKG9uIHN1Y2Nlc3NmdWwKKyAgICAvLyAgICAgICBjb21waWxhdGlvbikuCisgICAgLy8KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBGaWxlW10gcmVtb3ZlUGFja2FnZUluZm9GaWxlcygKKyAgICAgICAgRmlsZVtdIG5ld0ZpbGVzLCBGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyKSB7CisgICAgICAgIGlmICghaGFzUGFja2FnZUluZm8obmV3RmlsZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3RmlsZXM7CisgICAgICAgIH0KKyAgICAgICAgTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3RmlsZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChuZWVkc0NvbXBpbGVQYWNrYWdlRmlsZShuZXdGaWxlc1tpXSwgc3JjRGlyLCBkZXN0RGlyKSkgeworICAgICAgICAgICAgICAgIHJldC5hZGQobmV3RmlsZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoRmlsZVtdKSByZXQudG9BcnJheShuZXcgRmlsZVswXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1BhY2thZ2VJbmZvKEZpbGVbXSBuZXdGaWxlcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld0ZpbGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAobmV3RmlsZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhQQUNLQUdFX0lORk9fSkFWQSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRzQ29tcGlsZVBhY2thZ2VGaWxlKAorICAgICAgICBGaWxlIGZpbGUsIEZpbGUgc3JjRGlyLCBGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgaWYgKCFmaWxlLmdldE5hbWUoKS5lcXVhbHMoUEFDS0FHRV9JTkZPX0pBVkEpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiBkZXN0RGlyIGNvbnRhaW5zIHRoZSBmaWxlCisgICAgICAgIFN0cmluZyByZWwgPSByZWxhdGl2ZVBhdGgoc3JjRGlyLCBmaWxlKTsKKyAgICAgICAgRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsIHJlbCk7CisgICAgICAgIEZpbGUgcGFyZW50ID0gZGVzdEZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICBkZXN0RmlsZSA9IG5ldyBGaWxlKHBhcmVudCwgUEFDS0FHRV9JTkZPX0NMQVNTKTsKKyAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCByZWwpOworICAgICAgICBpZiAoZGVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIERlc3QgZmlsZSBkb2VzIG5vdCBleGlzdAorICAgICAgICAvLyBDb21waWxlIFNvdXJjZSBmaWxlIGlmIHNvdXJjZUZpbGUgaXMgbmV3ZXIgdGhhdCBkZXN0RGlyCisgICAgICAgIC8vIFRPRE8gLSB1c2UgZnMKKyAgICAgICAgaWYgKHNvdXJjZUZpbGUubGFzdE1vZGlmaWVkKCkKKyAgICAgICAgICAgID4gZGVzdEZpbGUuZ2V0UGFyZW50RmlsZSgpLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICB1cGRhdGVEaXJMaXN0LmFkZChkZXN0RmlsZS5nZXRQYXJlbnRGaWxlKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJlbGF0aXZlUGF0aChGaWxlIHNyYywgRmlsZSBmaWxlKSB7CisgICAgICAgIHJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZygKKyAgICAgICAgICAgIHNyYy5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKSArIDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFkb2MuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFkb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDc0YTQxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWRvYy5qYXZhCkBAIC0wLDAgKzEsMjQzMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY05hbWVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRpclNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKKworLyoqCisgKiBHZW5lcmF0ZXMgSmF2YWRvYyBkb2N1bWVudGF0aW9uIGZvciBhIGNvbGxlY3Rpb24KKyAqIG9mIHNvdXJjZSBjb2RlLgorICoKKyAqIDxwPkN1cnJlbnQga25vd24gbGltaXRhdGlvbnMgYXJlOgorICoKKyAqIDxwPjx1bD4KKyAqICAgIDxsaT5wYXR0ZXJucyBtdXN0IGJlIG9mIHRoZSBmb3JtICJ4eHguKiIsIGV2ZXJ5IG90aGVyIHBhdHRlcm4gZG9lc24ndAorICogICAgICAgIHdvcmsuCisgKiAgICA8bGk+dGhlcmUgaXMgbm8gY29udHJvbCBvbiBhcmd1bWVudHMgc2FuaXR5IHNpbmNlIHRoZXkgYXJlIGxlZnQKKyAqICAgICAgICB0byB0aGUgSmF2YWRvYyBpbXBsZW1lbnRhdGlvbi4KKyAqIDwvdWw+CisgKgorICogPHA+SWYgbm8gPGNvZGU+ZG9jbGV0PC9jb2RlPiBpcyBzZXQsIHRoZW4gdGhlIDxjb2RlPnZlcnNpb248L2NvZGU+IGFuZAorICogPGNvZGU+YXV0aG9yPC9jb2RlPiBhcmUgYnkgZGVmYXVsdCA8Y29kZT4ieWVzIjwvY29kZT4uCisgKgorICogPHA+Tm90ZTogVGhpcyB0YXNrIGlzIHJ1biBvbiBhbm90aGVyIFZNIGJlY2F1c2UgdGhlIEphdmFkb2MgY29kZSBjYWxscworICogPGNvZGU+U3lzdGVtLmV4aXQoKTwvY29kZT4gd2hpY2ggd291bGQgYnJlYWsgQW50IGZ1bmN0aW9uYWxpdHkuCisgKgorICogQHNpbmNlIEFudCAxLjEKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImphdmEiCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhZG9jIGV4dGVuZHMgVGFzayB7CisgICAgLy8gV2hldGhlciAqdGhpcyBWTSogaXMgMS40KyAoYnV0IGFsc28gY2hlY2sgZXhlY3V0YWJsZSAhPSBudWxsKS4KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSkFWQURPQ180ID0KKyAgICAgICAgIUphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMikKKyAgICAgICAgJiYgIUphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMyk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEpBVkFET0NfNSA9IEpBVkFET0NfNAorICAgICAgICAmJiAhSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV80KTsKKworICAgIC8qKgorICAgICAqIElubmVyIGNsYXNzIHVzZWQgdG8gbWFuYWdlIGRvY2xldCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBEb2NsZXRQYXJhbSB7CisgICAgICAgIC8qKiBUaGUgcGFyYW1ldGVyIG5hbWUgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgICAgICAvKiogVGhlIHBhcmFtZXRlciB2YWx1ZSAqLworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkb2NsZXQgcGFyYW1ldGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcGFyYW1ldGVyIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcidzIG5hbWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZSB0aGF0IG9ubHkgc3RyaW5nIHZhbHVlcyBhcmUgc3VwcG9ydGVkLiBObyByZXNvbHV0aW9uIG9mIGZpbGUKKyAgICAgICAgICogcGF0aHMgaXMgcGVyZm9ybWVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcGFyYW1ldGVyIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBwcm9qZWN0IGF3YXJlIGNsYXNzIHVzZWQgZm9yIEphdmFkb2MgZXh0ZW5zaW9ucyB3aGljaCB0YWtlIGEgbmFtZQorICAgICAqIGFuZCBhIHBhdGggc3VjaCBhcyBkb2NsZXQgYW5kIHRhZ2xldCBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4dGVuc2lvbkluZm8gZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IHsKKyAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgICAgICAvKiogVGhlIG9wdGlvbmFsIHBhdGggdG8gdXNlIHRvIGxvYWQgdGhlIGV4dGVuc2lvbiAqLworICAgICAgICBwcml2YXRlIFBhdGggcGF0aDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIGV4dGVuc2lvbidzIG5hbWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnNpb24ncyBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhdGggYSBQYXRoIGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGNsYXNzcGF0aCB0byB1c2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFBhdGggcGF0aCkgeworICAgICAgICAgICAgaWYgKHRoaXMucGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5wYXRoLmFwcGVuZChwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGV4dGVuc2lvbidzIHBhdGguCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHBhdGggdG8gYmUgdXNlZCB0byBsb2FkIHRoZSBleHRlbnNpb24uCisgICAgICAgICAqIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFBhdGggZ2V0UGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBlbXB0eSBuZXN0ZWQgcGF0aCB0byBiZSBjb25maWd1cmVkIGJ5IEFudCB3aXRoIHRoZQorICAgICAgICAgKiBjbGFzc3BhdGggZm9yIHRoZSBleHRlbnNpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gYSBuZXcgUGF0aCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFBhdGggY3JlYXRlUGF0aCgpIHsKKyAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gciB0aGUgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIHBhdGguCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgICAgICBjcmVhdGVQYXRoKCkuc2V0UmVmaWQocik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIHN0b3JlcyBpbmZvIGFib3V0IGRvY2xldHMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgRG9jbGV0SW5mbyBleHRlbmRzIEV4dGVuc2lvbkluZm8geworCisgICAgICAgIC8qKiBDb2xsZWN0aW9uIG9mIGRvY2xldCBwYXJhbWV0ZXJzLiAqLworICAgICAgICBwcml2YXRlIFZlY3RvciBwYXJhbXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGRvY2xldCBwYXJhbWV0ZXIgdG8gYmUgY29uZmlndXJlZCBieSBBbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gYSBuZXcgRG9jbGV0UGFyYW0gaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEb2NsZXRQYXJhbSBjcmVhdGVQYXJhbSgpIHsKKyAgICAgICAgICAgIERvY2xldFBhcmFtIHBhcmFtID0gbmV3IERvY2xldFBhcmFtKCk7CisgICAgICAgICAgICBwYXJhbXMuYWRkRWxlbWVudChwYXJhbSk7CisKKyAgICAgICAgICAgIHJldHVybiBwYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRvY2xldCdzIHBhcmFtZXRlcnMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gYW4gRW51bWVyYXRpb24gb2YgRG9jbGV0UGFyYW0gaW5zdGFuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFBhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJhbXMuZWxlbWVudHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdHJhY2sgaW5mbyBhYm91dCB0aGUgcGFja2FnZXMgdG8gYmUgamF2YWRvYydkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYWNrYWdlTmFtZSB7CisgICAgICAgIC8qKiBUaGUgcGFja2FnZSBuYW1lICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcGFja2FnZSBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZS50cmltKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBwYWNrYWdlIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2UncyBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcCBmb3IgdGhpcyBvYmplY3QuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG1hbmFnZSB0aGUgc291cmNlIGZpbGVzIHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNvdXJjZUZpbGUgeworICAgICAgICAvKiogVGhlIHNvdXJjZSBmaWxlICovCisgICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU291cmNlRmlsZSgpIHsKKyAgICAgICAgICAgIC8vZW1wdHkKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBzcGVjaWZ5aW5nIHRoZSBzb3VyY2UgZmlsZSBkaXJlY3RseQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgc291cmNlIGZpbGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTb3VyY2VGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHNvdXJjZSBmaWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgc291cmNlIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHNvdXJjZSBmaWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIEhUTUwgZWxlbWVudCBpbiB0aGUgSmF2YWRvYy4KKyAgICAgKgorICAgICAqIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgdGhvc2UgSmF2YWRvYyBlbGVtZW50cyB3aGljaCBjb250YWluIEhUTUwgc3VjaCBhcworICAgICAqIGZvb3RlcnMsIGhlYWRlcnMsIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEh0bWwgeworICAgICAgICAvKiogVGhlIHRleHQgZm9yIHRoZSBlbGVtZW50ICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCB0ZXh0IHRvIHRoZSBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdCB0aGUgdGV4dCB0byBiZSBhZGRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHQpIHsKKyAgICAgICAgICAgIHRleHQuYXBwZW5kKHQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY3VycmVudCB0ZXh0IGZvciB0aGUgZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgY3VycmVudCB0ZXh0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW51bWVyYXRlZEF0dHJpYnV0ZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0aW5nIHRoZSBKYXZhZG9jIHNjb3BpbmcKKyAgICAgKiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBY2Nlc3NUeXBlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBhbGxvd2VkIHZhbHVlcyBmb3IgdGhlIGFjY2VzcyB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIC8vIFByb3RlY3RlZCBmaXJzdCBzbyBpZiBhbnkgR1VJIHRvb2wgb2ZmZXJzIGEgZGVmYXVsdAorICAgICAgICAgICAgLy8gYmFzZWQgb24gZW51bSAjMCwgaXQgd2lsbCBiZSByaWdodC4KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJwcm90ZWN0ZWQiLCAicHVibGljIiwgInBhY2thZ2UiLCAicHJpdmF0ZSJ9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSG9sZHMgYSBjb2xsZWN0aW9uIG9mIFJlc291cmNlQ29sbGVjdGlvbnMuCisgICAgICoKKyAgICAgKiA8cD5BIHNlcGFyYXRlIGtpbmQgb2YgY29udGFpbmVyIGlzIG5lZWRlZCBzaW5jZSB0aGlzIHRhc2sKKyAgICAgKiBjb250YWlucyBzcGVjaWFsIGhhbmRsaW5nIGZvciBGaWxlU2V0cyB0aGF0IGhhcyB0byBvY2N1ciBhdAorICAgICAqIHRhc2sgcnVudGltZS48L3A+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIFJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lciB7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IHJjcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIHJlc291cmNlIGNvbGxlY3Rpb24gdG8gdGhlIGNvbnRhaW5lci4KKyAgICAgICAgICogQHBhcmFtIHJjIHRoZSBjb2xsZWN0aW9uIHRvIGFkZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgICAgIHJjcy5hZGQocmMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gcmNzLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKiBUaGUgY29tbWFuZCBsaW5lIGJ1aWx0IHRvIGV4ZWN1dGUgSmF2YWRvYy4gKi8KKyAgICBwcml2YXRlIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gYWRkIGFuIGFyZ3VtZW50IHRvIHRoZSBjb21tYW5kIGxpbmUgY29uZGl0aW9uYWxseQorICAgICAqIGJhc2VkIG9uIHRoZSBnaXZlbiBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGIgdGhlIGZsYWcgd2hpY2ggY29udHJvbHMgaWYgdGhlIGFyZ3VtZW50IGlzIGFkZGVkLgorICAgICAqIEBwYXJhbSBhcmcgdGhlIGFyZ3VtZW50IHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRBcmdJZihib29sZWFuIGIsIFN0cmluZyBhcmcpIHsKKyAgICAgICAgaWYgKGIpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBhZGQgYSBKYXZhZG9jIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB0aGUgYXJndW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGFyZ3VtZW50IHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRBcmdJZk5vdEVtcHR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShrZXkpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBMZWF2aW5nIG91dCBlbXB0eSBhcmd1bWVudCAnIiArIGtleSArICInIiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIHRoZSB0YXNrIHNob3VsZCBmYWlsIGlmIHRoZXJlIGlzIGEKKyAgICAgKiBKYXZhZG9jIGVycm9yLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvciA9IGZhbHNlOworICAgIHByaXZhdGUgUGF0aCBzb3VyY2VQYXRoID0gbnVsbDsKKyAgICBwcml2YXRlIEZpbGUgZGVzdERpciA9IG51bGw7CisgICAgcHJpdmF0ZSBWZWN0b3Igc291cmNlRmlsZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgcGFja2FnZU5hbWVzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yIGV4Y2x1ZGVQYWNrYWdlTmFtZXMgPSBuZXcgVmVjdG9yKDEpOworICAgIHByaXZhdGUgYm9vbGVhbiBhdXRob3IgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJzaW9uID0gdHJ1ZTsKKyAgICBwcml2YXRlIERvY2xldEluZm8gZG9jbGV0ID0gbnVsbDsKKyAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoID0gbnVsbDsKKyAgICBwcml2YXRlIFBhdGggYm9vdGNsYXNzcGF0aCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgZ3JvdXAgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VMaXN0ID0gbnVsbDsKKyAgICBwcml2YXRlIFZlY3RvciBsaW5rcyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvciBncm91cHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgdGFncyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzID0gdHJ1ZTsKKyAgICBwcml2YXRlIEh0bWwgZG9jdGl0bGUgPSBudWxsOworICAgIHByaXZhdGUgSHRtbCBoZWFkZXIgPSBudWxsOworICAgIHByaXZhdGUgSHRtbCBmb290ZXIgPSBudWxsOworICAgIHByaXZhdGUgSHRtbCBib3R0b20gPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VFeHRlcm5hbEZpbGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBzb3VyY2UgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBsaW5rc291cmNlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGJyZWFraXRlcmF0b3IgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBub3F1YWxpZmllcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZU5vU291cmNlUGFja2FnZXMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gb2xkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgZXhlY3V0YWJsZSA9IG51bGw7CisKKyAgICBwcml2YXRlIFJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lciBuZXN0ZWRTb3VyY2VGaWxlcworICAgICAgICA9IG5ldyBSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIoKTsKKyAgICBwcml2YXRlIFZlY3RvciBwYWNrYWdlU2V0cyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIFdvcmsgYXJvdW5kIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXQgYnkgdXNpbmcgYW4gZXh0ZXJuYWwgZmlsZQorICAgICAqIGZvciB0aGUgc291cmNlZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB0cnVlIGlmIGFuIGV4dGVybmFsIGZpbGUgaXMgdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VFeHRlcm5hbEZpbGUoYm9vbGVhbiBiKSB7CisgICAgICAgIHVzZUV4dGVybmFsRmlsZSA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlRGVmYXVsdEV4Y2x1ZGVzICJ0cnVlInwib24ifCJ5ZXMiIHdoZW4gZGVmYXVsdCBleGNsdXNpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCwgImZhbHNlInwib2ZmInwibm8iIHdoZW4gdGhleQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkbid0IGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdGV4Y2x1ZGVzKGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzKSB7CisgICAgICAgIHRoaXMudXNlRGVmYXVsdEV4Y2x1ZGVzID0gdXNlRGVmYXVsdEV4Y2x1ZGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSBtZW1vcnkgdG8gYmUgdXNlZCBieSB0aGUgamF2YWRvYyBwcm9jZXNzCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF4IGEgc3RyaW5nIGluZGljYXRpbmcgdGhlIG1heGltdW0gbWVtb3J5IGFjY29yZGluZyB0byB0aGUKKyAgICAgKiAgICAgICAgSlZNIGNvbnZlbnRpb25zIChlLmcuIDEyOG0gaXMgMTI4IE1lZ2FieXRlcykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhtZW1vcnkoU3RyaW5nIG1heCkgeworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLUotWG14IiArIG1heCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIG9uIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGQgdGhlIGFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIHBhcmFtZXRlciBmb3IgdGhlIGphdmFkb2MgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFscGFyYW0oU3RyaW5nIGFkZCkgeworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRMaW5lKGFkZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50IHRvIGNvbmZpZ3VyZQorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUFyZygpIHsKKyAgICAgICAgcmV0dXJuIGNtZC5jcmVhdGVBcmd1bWVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgd2hlcmUgdG8gZmluZCBzb3VyY2UgZmlsZQorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBhIFBhdGggaW5zdGFuY2UgY29udGFpbmluZyB0aGUgdmFyaW91cyBzb3VyY2UgZGlyZWN0b3JpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlcGF0aChQYXRoIHNyYykgeworICAgICAgICBpZiAoc291cmNlUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBzb3VyY2VQYXRoID0gc3JjOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc291cmNlUGF0aC5hcHBlbmQoc3JjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHBhdGggdG8gYmUgY29uZmlndXJlZCB3aXRoIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHNvdXJjZQorICAgICAqIGZpbGVzLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyBQYXRoIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhlIEFudCBjb3JlLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZVNvdXJjZXBhdGgoKSB7CisgICAgICAgIGlmIChzb3VyY2VQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZVBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzb3VyY2VQYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgdGhlIHJlZmVyZW5jZSBjb250YWluaW5nIHRoZSBzb3VyY2UgcGF0aCBkZWZpbml0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZXBhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlU291cmNlcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBKYXZhZG9jIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZGlyKEZpbGUgZGlyKSB7CisgICAgICAgIGRlc3REaXIgPSBkaXI7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZCIpOworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGRlc3REaXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzb3VyY2UgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlZmlsZXMoU3RyaW5nIHNyYykgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihzcmMsICIsIik7CisgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgZiA9IHRvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIFNvdXJjZUZpbGUgc2YgPSBuZXcgU291cmNlRmlsZSgpOworICAgICAgICAgICAgc2Yuc2V0RmlsZShnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZi50cmltKCkpKTsKKyAgICAgICAgICAgIGFkZFNvdXJjZShzZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzaW5nbGUgc291cmNlIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2YgdGhlIHNvdXJjZSBmaWxlIHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTb3VyY2UoU291cmNlRmlsZSBzZikgeworICAgICAgICBzb3VyY2VGaWxlcy5hZGRFbGVtZW50KHNmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhY2thZ2UgbmFtZXMgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZXMgc3BlY3MKKyAgICAgKiAgICAgICAgKG1heSBiZSB3aWxkY2FyZGVkKS4KKyAgICAgKgorICAgICAqIEBzZWUgI2FkZFBhY2thZ2UgZm9yIHdpbGRjYXJkIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VuYW1lcyhTdHJpbmcgcGFja2FnZXMpIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGFja2FnZXMsICIsIik7CisgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcCA9IHRvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIFBhY2thZ2VOYW1lIHBuID0gbmV3IFBhY2thZ2VOYW1lKCk7CisgICAgICAgICAgICBwbi5zZXROYW1lKHApOworICAgICAgICAgICAgYWRkUGFja2FnZShwbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzaW5nbGUgcGFja2FnZSB0byBiZSBwcm9jZXNzZWQuCisgICAgICoKKyAgICAgKiBJZiB0aGUgcGFja2FnZSBuYW1lIGVuZHMgd2l0aCAmcXVvdDsuKiZxdW90OyB0aGUgSmF2YWRvYyB0YXNrCisgICAgICogd2lsbCBmaW5kIGFuZCBwcm9jZXNzIGFsbCBzdWJwYWNrYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwbiB0aGUgcGFja2FnZSBuYW1lLCBwb3NzaWJseSB3aWxkY2FyZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2UoUGFja2FnZU5hbWUgcG4pIHsKKyAgICAgICAgcGFja2FnZU5hbWVzLmFkZEVsZW1lbnQocG4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbGlzdCBvZiBwYWNrYWdlcyB0byBiZSBleGNsdWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHBhY2thZ2VzIHRvIGJlIGV4Y2x1ZGVkLgorICAgICAqICAgICAgICBUaGlzIG1heSBub3QgaW5jbHVkZSB3aWxkY2FyZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZVBhY2thZ2VOYW1lcyhTdHJpbmcgcGFja2FnZXMpIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGFja2FnZXMsICIsIik7CisgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcCA9IHRvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIFBhY2thZ2VOYW1lIHBuID0gbmV3IFBhY2thZ2VOYW1lKCk7CisgICAgICAgICAgICBwbi5zZXROYW1lKHApOworICAgICAgICAgICAgYWRkRXhjbHVkZVBhY2thZ2UocG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcGFja2FnZSB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBKYXZhZG9jIHJ1bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwbiB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSAod2lsZGNhcmRzIGFyZSBub3QgcGVybWl0dGVkKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFeGNsdWRlUGFja2FnZShQYWNrYWdlTmFtZSBwbikgeworICAgICAgICBleGNsdWRlUGFja2FnZU5hbWVzLmFkZEVsZW1lbnQocG4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgb3ZlcnZpZXcgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZAorICAgICAqIGRvY3VtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBvdmVydmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVydmlldyhGaWxlIGYpIHsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1vdmVydmlldyIpOworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgb25seSBwdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVycyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4KKyAgICAgKiB0aGUgc2NvcGUgcHJvY2Vzc2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB0cnVlIGlmIHNjb3BlIGlzIHRvIGJlIHB1YmxpYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQdWJsaWMoYm9vbGVhbiBiKSB7CisgICAgICAgIGFkZEFyZ0lmKGIsICItcHVibGljIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGUgd2hldGhlciBvbmx5IHByb3RlY3RlZCBhbmQgcHVibGljIGNsYXNzZXMgYW5kIG1lbWJlcnMgYXJlIHRvCisgICAgICogYmUgaW5jbHVkZWQgaW4gdGhlIHNjb3BlIHByb2Nlc3NlZAorICAgICAqCisgICAgICogQHBhcmFtIGIgdHJ1ZSBpZiBzY29wZSBpcyB0byBiZSBwcm90ZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvdGVjdGVkKGJvb2xlYW4gYikgeworICAgICAgICBhZGRBcmdJZihiLCAiLXByb3RlY3RlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgb25seSBwYWNrYWdlLCBwcm90ZWN0ZWQgYW5kIHB1YmxpYyBjbGFzc2VzIGFuZAorICAgICAqIG1lbWJlcnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzY29wZSBwcm9jZXNzZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRydWUgaWYgc2NvcGUgaXMgdG8gYmUgcGFja2FnZSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKGJvb2xlYW4gYikgeworICAgICAgICBhZGRBcmdJZihiLCAiLXBhY2thZ2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIGFsbCBjbGFzc2VzIGFuZAorICAgICAqIG1lbWJlcnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzY29wZSBwcm9jZXNzZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRydWUgaWYgc2NvcGUgaXMgdG8gYmUgcHJpdmF0ZSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcml2YXRlKGJvb2xlYW4gYikgeworICAgICAgICBhZGRBcmdJZihiLCAiLXByaXZhdGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNjb3BlIHRvIGJlIHByb2Nlc3NlZC4gVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUKKyAgICAgKiB1c2Ugb2YgdGhlIHNldFB1YmxpYywgc2V0UHJpdmF0ZSwgZXRjIG1ldGhvZHMuIEl0IGdpdmVzIGJldHRlciBidWlsZAorICAgICAqIGZpbGUgY29udHJvbCBvdmVyIHdoYXQgc2NvcGUgaXMgcHJvY2Vzc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGF0IHRoZSBzY29wZSB0byBiZSBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgYXQpIHsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0iICsgYXQuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzcyB0aGF0IHN0YXJ0cyB0aGUgZG9jbGV0IHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUKKyAgICAgKiBkb2N1bWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRvY2xldE5hbWUgdGhlIG5hbWUgb2YgdGhlIGRvY2xldCBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb2NsZXQoU3RyaW5nIGRvY2xldE5hbWUpIHsKKyAgICAgICAgaWYgKGRvY2xldCA9PSBudWxsKSB7CisgICAgICAgICAgICBkb2NsZXQgPSBuZXcgRG9jbGV0SW5mbygpOworICAgICAgICAgICAgZG9jbGV0LnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICBkb2NsZXQuc2V0TmFtZShkb2NsZXROYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIGZpbmQgdGhlIGRvY2xldCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb2NsZXRQYXRoIHRoZSBkb2NsZXQgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvY2xldFBhdGgoUGF0aCBkb2NsZXRQYXRoKSB7CisgICAgICAgIGlmIChkb2NsZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZG9jbGV0ID0gbmV3IERvY2xldEluZm8oKTsKKyAgICAgICAgICAgIGRvY2xldC5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgZG9jbGV0LnNldFBhdGgoZG9jbGV0UGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdXNlZCB0byBmaW5kIHRoZSBkb2NsZXQgY2xhc3MgYnkgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgdGhlIHJlZmVyZW5jZSB0byB0aGUgUGF0aCBpbnN0YW5jZSB0byB1c2UgYXMgdGhlIGRvY2xldAorICAgICAqICAgICAgICBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jbGV0UGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBpZiAoZG9jbGV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGRvY2xldCA9IG5ldyBEb2NsZXRJbmZvKCk7CisgICAgICAgICAgICBkb2NsZXQuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIGRvY2xldC5jcmVhdGVQYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZG9jbGV0IHRvIGJlIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgRG9jbGV0SW5mbyBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBEb2NsZXRJbmZvIGNyZWF0ZURvY2xldCgpIHsKKyAgICAgICAgaWYgKGRvY2xldCA9PSBudWxsKSB7CisgICAgICAgICAgICBkb2NsZXQgPSBuZXcgRG9jbGV0SW5mbygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkb2NsZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgdGFnbGV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnbGV0SW5mbyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFnbGV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRhZ2xldChFeHRlbnNpb25JbmZvIHRhZ2xldEluZm8pIHsKKyAgICAgICAgdGFncy5hZGRFbGVtZW50KHRhZ2xldEluZm8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgSmF2YWRvYyBzaG91bGQgcHJvZHVjZSBvbGQgc3R5bGUgKEpESyAxLjEpCisgICAgICogZG9jdW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBKREsgMS4xIGFuZCBoYXMgYmVlbiBwaGFzZWQgb3V0IGluIEpESyAxLjQKKyAgICAgKgorICAgICAqIEBwYXJhbSBiIGlmIHRydWUgYXR0ZW1wdCB0byBnZW5lcmF0ZSBvbGQgc3R5bGUgZG9jdW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbGQoYm9vbGVhbiBiKSB7CisgICAgICAgIG9sZCA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBKYXZhZG9jIHJ1bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIGFuIEFudCBQYXRoIG9iamVjdCBjb250YWluaW5nIHRoZSBjb21waWxhdGlvbgorICAgICAqICAgICAgICBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggcGF0aCkgeworICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IHBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgUGF0aCB0byBiZSBjb25maWd1cmVkIHdpdGggdGhlIGNsYXNzcGF0aCB0byB1c2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgUGF0aCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkIHdpdGggdGhlIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgdGhlIHJlZmVyZW5jZSB0byBhbiBpbnN0YW5jZSBkZWZpbmluZyB0aGUgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJvb3QgY2xhc3NwYXRoIHRvIHVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHRoZSBib290IGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb290Y2xhc3NwYXRoKFBhdGggcGF0aCkgeworICAgICAgICBpZiAoYm9vdGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBib290Y2xhc3NwYXRoID0gcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb3RjbGFzc3BhdGguYXBwZW5kKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgUGF0aCB0byBiZSBjb25maWd1cmVkIHdpdGggdGhlIGJvb3QgY2xhc3NwYXRoCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IFBhdGggaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZCB3aXRoIHRoZSBib290IGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVCb290Y2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoYm9vdGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBib290Y2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm9vdGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIENMQVNTUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gYW4gaW5zdGFuY2UgZGVmaW5pbmcgdGhlIGJvb3RjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm9vdENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBjcmVhdGVCb290Y2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZW5zaW9ucyBkaXJlY3Rvcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHRoZSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgcGF0aC4KKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KKyAgICAgKiAgICAgICAgICAgICBVc2UgdGhlIHtAbGluayAjc2V0RXh0ZGlycyhQYXRoKX0gdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRkaXJzKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZXh0ZGlycyIpOworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlbnNpb25zIGRpcmVjdG9yaWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggYSBwYXRoIGNvbnRhaW5pbmcgdGhlIGV4dGVuc2lvbiBkaXJlY3Rvcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRkaXJzKFBhdGggcGF0aCkgeworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWV4dGRpcnMiKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gamF2YWRvYyBpbiB2ZXJib3NlIG1vZGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRydWUgaWYgb3BlcmF0aW9uIGlzIHRvIGJlIHZlcmJvc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIGIpIHsKKyAgICAgICAgYWRkQXJnSWYoYiwgIi12ZXJib3NlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2NhbCB0byB1c2UgaW4gZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoU3RyaW5nIGxvY2FsZSkgeworICAgICAgICAvLyBjcmVhdGVBcmd1bWVudCh0cnVlKSBpcyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIC1sb2NhbGUKKyAgICAgICAgLy8gaXMgdGhlIGZpcnN0IGFyZ3VtZW50IChyZXF1aXJlZCBpbiAxLjMrKS4KKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KHRydWUpLnNldFZhbHVlKGxvY2FsZSk7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCh0cnVlKS5zZXRWYWx1ZSgiLWxvY2FsZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZW5jb2RpbmcgbmFtZSBvZiB0aGUgc291cmNlIGZpbGVzLAorICAgICAqCisgICAgICogQHBhcmFtIGVuYyB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcgZm9yIHRoZSBzb3VyY2UgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuYykgeworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWVuY29kaW5nIik7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGVuYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jbHVkZSB0aGUgdmVyc2lvbiB0YWcgaW4gdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGIgdHJ1ZSBpZiB0aGUgdmVyc2lvbiB0YWcgc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oYm9vbGVhbiBiKSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlICZxdW90O3VzZSZxdW90IHBhZ2UgZm9yIGVhY2ggcGFja2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRydWUgaWYgdGhlIHVzZSBwYWdlIHNob3VsZCBiZSBnZW5lcmF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlKGJvb2xlYW4gYikgeworICAgICAgICBhZGRBcmdJZihiLCAiLXVzZSIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5jbHVkZSB0aGUgYXV0aG9yIHRhZyBpbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB0cnVlIGlmIHRoZSBhdXRob3IgdGFnIHNob3VsZCBiZSBpbmNsdWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRob3IoYm9vbGVhbiBiKSB7CisgICAgICAgIGF1dGhvciA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYSBzcGxpdCBpbmRleAorICAgICAqCisgICAgICogQHBhcmFtIGIgdHJ1ZSBpZiB0aGUgaW5kZXggc2hvdWxkIGJlIHNwbGl0IGludG8gYSBmaWxlIHBlciBsZXR0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3BsaXRpbmRleChib29sZWFuIGIpIHsKKyAgICAgICAgYWRkQXJnSWYoYiwgIi1zcGxpdGluZGV4Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aXRsZSB0byBiZSBwbGFjZWQgaW4gdGhlIEhUTUwgJmx0O3RpdGxlJmd0OyB0YWcgb2YgdGhlCisgICAgICogZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGUgdGhlIHdpbmRvdyB0aXRsZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2luZG93dGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIGFkZEFyZ0lmTm90RW1wdHkoIi13aW5kb3d0aXRsZSIsIHRpdGxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBnZW5lcmF0ZWQgb3ZlcnZpZXcgcGFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb2N0aXRsZSB0aGUgRG9jdW1lbnQgdGl0bGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jdGl0bGUoU3RyaW5nIGRvY3RpdGxlKSB7CisgICAgICAgIEh0bWwgaCA9IG5ldyBIdG1sKCk7CisgICAgICAgIGguYWRkVGV4dChkb2N0aXRsZSk7CisgICAgICAgIGFkZERvY3RpdGxlKGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGRvY3VtZW50IHRpdGxlIHRvIHVzZSBmb3IgdGhlIG92ZXJ2aWV3IHBhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgSFRNTCBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGRvY3VtZW50IHRpdGxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERvY3RpdGxlKEh0bWwgdGV4dCkgeworICAgICAgICBkb2N0aXRsZSA9IHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBoZWFkZXIgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIHRvcCBvZiBlYWNoIG91dHB1dCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIGhlYWRlcikgeworICAgICAgICBIdG1sIGggPSBuZXcgSHRtbCgpOworICAgICAgICBoLmFkZFRleHQoaGVhZGVyKTsKKyAgICAgICAgYWRkSGVhZGVyKGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaGVhZGVyIHRleHQgdG8gYmUgcGxhY2VkIGF0IHRoZSB0b3Agb2YgZWFjaCBvdXRwdXQgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBoZWFkZXIgdGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihIdG1sIHRleHQpIHsKKyAgICAgICAgaGVhZGVyID0gdGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZvb3RlciB0ZXh0IHRvIGJlIHBsYWNlZCBhdCB0aGUgYm90dG9tIG9mIGVhY2ggb3V0cHV0IGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9vdGVyIHRoZSBmb290ZXIgdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb290ZXIoU3RyaW5nIGZvb3RlcikgeworICAgICAgICBIdG1sIGggPSBuZXcgSHRtbCgpOworICAgICAgICBoLmFkZFRleHQoZm9vdGVyKTsKKyAgICAgICAgYWRkRm9vdGVyKGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZm9vdGVyIHRleHQgdG8gYmUgcGxhY2VkIGF0IHRoZSBib3R0b20gb2YgZWFjaCBvdXRwdXQgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBmb290ZXIgdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGb290ZXIoSHRtbCB0ZXh0KSB7CisgICAgICAgIGZvb3RlciA9IHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0ZXh0IHRvIGJlIHBsYWNlZCBhdCB0aGUgYm90dG9tIG9mIGVhY2ggb3V0cHV0IGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb3R0b20oU3RyaW5nIGJvdHRvbSkgeworICAgICAgICBIdG1sIGggPSBuZXcgSHRtbCgpOworICAgICAgICBoLmFkZFRleHQoYm90dG9tKTsKKyAgICAgICAgYWRkQm90dG9tKGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIGJvdHRvbSBvZiBlYWNoIG91dHB1dCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgdGhlIGJvdHRvbSB0ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEJvdHRvbShIdG1sIHRleHQpIHsKKyAgICAgICAgYm90dG9tID0gdGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaW5rIHRvIGRvY3MgYXQgInVybCIgdXNpbmcgcGFja2FnZSBsaXN0IGF0ICJ1cmwyIgorICAgICAqIC0gc2VwYXJhdGUgdGhlIFVSTHMgYnkgdXNpbmcgYSBzcGFjZSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBvZmZsaW5lIGxpbmsgc3BlY2lmaWNhdGlvbiAodXJsIGFuZCBwYWNrYWdlIGxpc3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlua29mZmxpbmUoU3RyaW5nIHNyYykgeworICAgICAgICBMaW5rQXJndW1lbnQgbGUgPSBjcmVhdGVMaW5rKCk7CisgICAgICAgIGxlLnNldE9mZmxpbmUodHJ1ZSk7CisgICAgICAgIFN0cmluZyBsaW5rT2ZmbGluZUVycm9yID0gIlRoZSBsaW5rb2ZmbGluZSBhdHRyaWJ1dGUgbXVzdCBpbmNsdWRlIgorICAgICAgICAgICAgKyAiIGEgVVJMIGFuZCBhIHBhY2thZ2UtbGlzdCBmaWxlIGxvY2F0aW9uIHNlcGFyYXRlZCBieSBhIgorICAgICAgICAgICAgKyAiIHNwYWNlIjsKKyAgICAgICAgaWYgKHNyYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGxpbmtPZmZsaW5lRXJyb3IpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNyYywgIiAiLCBmYWxzZSk7CisgICAgICAgIGxlLnNldEhyZWYodG9rLm5leHRUb2tlbigpKTsKKworICAgICAgICBpZiAoIXRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihsaW5rT2ZmbGluZUVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBsZS5zZXRQYWNrYWdlbGlzdExvYyhnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUodG9rLm5leHRUb2tlbigpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JvdXAgc3BlY2lmaWVkIHBhY2thZ2VzIHRvZ2V0aGVyIGluIG92ZXJ2aWV3IHBhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBncm91cCBwYWNrYWdlcyAtIGEgY29tbWFuZCBzZXBhcmF0ZWQgbGlzdCBvZiBncm91cCBzcGVjcywKKyAgICAgKiAgICAgICAgZWFjaCBvbmUgYmVpbmcgYSBncm91cCBuYW1lIGFuZCBwYWNrYWdlIHNwZWNpZmljYXRpb24gc2VwYXJhdGVkCisgICAgICogICAgICAgIGJ5IGEgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXAoU3RyaW5nIHNyYykgeworICAgICAgICBncm91cCA9IHNyYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbGlua3MgdG8gSmF2YWRvYyBvdXRwdXQgYXQgdGhlIGdpdmVuIFVSTC4KKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBVUkwgdG8gbGluayB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIHNyYykgeworICAgICAgICBjcmVhdGVMaW5rKCkuc2V0SHJlZihzcmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgZGVwcmVjYXRpb24gaW5mcm9tYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIElmIHRydWUsIGRvIG5vdCBpbmNsdWRlIGRlcHJlY2F0ZWQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZXByZWNhdGVkKGJvb2xlYW4gYikgeworICAgICAgICBhZGRBcmdJZihiLCAiLW5vZGVwcmVjYXRlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgZGVwcmVjYXRlZCBsaXN0IGdlbmVyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIGlmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBkZXByZWNhdGVkIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZXByZWNhdGVkbGlzdChib29sZWFuIGIpIHsKKyAgICAgICAgYWRkQXJnSWYoYiwgIi1ub2RlcHJlY2F0ZWRsaXN0Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbCBjbGFzcyB0cmVlIGdlbmVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBpZiB0cnVlLCBkbyBub3QgZ2VuZXJhdGUgY2xhc3MgaGllcmFyY2h5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vdHJlZShib29sZWFuIGIpIHsKKyAgICAgICAgYWRkQXJnSWYoYiwgIi1ub3RyZWUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9sIGdlbmVyYXRpb24gb2YgaW5kZXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBpZiB0cnVlLCBkbyBub3QgZ2VuZXJhdGUgaW5kZXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9pbmRleChib29sZWFuIGIpIHsKKyAgICAgICAgYWRkQXJnSWYoYiwgIi1ub2luZGV4Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbCBnZW5lcmF0aW9uIG9mIGhlbHAgbGluay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIGlmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBoZWxwIGxpbmsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb2hlbHAoYm9vbGVhbiBiKSB7CisgICAgICAgIGFkZEFyZ0lmKGIsICItbm9oZWxwIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbCBnZW5lcmF0aW9uIG9mIHRoZSBuYXZpZ2F0aW9uIGJhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIGlmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBuYXZpZ2F0aW9uIGJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb25hdmJhcihib29sZWFuIGIpIHsKKyAgICAgICAgYWRkQXJnSWYoYiwgIi1ub25hdmJhciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgd2FybmluZ3MgYWJvdXQgc2VyaWFsIHRhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIGlmIHRydWUsIGdlbmVyYXRlIHdhcm5pbmcgYWJvdXQgdGhlIHNlcmlhbCB0YWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VyaWFsd2Fybihib29sZWFuIGIpIHsKKyAgICAgICAgYWRkQXJnSWYoYiwgIi1zZXJpYWx3YXJuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBDU1Mgc3R5bGVzaGVldCBmaWxlIHRvIHVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIHRoZSBmaWxlIHdpdGggdGhlIENTUyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldGZpbGUoRmlsZSBmKSB7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc3R5bGVzaGVldGZpbGUiKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIEhUTUwgaGVscCBmaWxlIHRvIHVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIHRoZSBmaWxlIGNvbnRhaW5pbmcgaGVscCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlbHBmaWxlKEZpbGUgZikgeworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWhlbHBmaWxlIik7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3V0cHV0IGZpbGUgZW5jb2RpbmcgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmMgbmFtZSBvZiB0aGUgZW5jb2RpbmcgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvY2VuY29kaW5nKFN0cmluZyBlbmMpIHsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kb2NlbmNvZGluZyIpOworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShlbmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSBwYWNrYWdlcyB0byBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBwYWNrYWdlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZUxpc3QoU3RyaW5nIHNyYykgeworICAgICAgICBwYWNrYWdlTGlzdCA9IHNyYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbGluayB0byBKYXZhZG9jIG91dHB1dCBhdCB0aGUgZ2l2ZW4gVVJMLgorICAgICAqCisgICAgICogQHJldHVybiBsaW5rIGFyZ3VtZW50IHRvIGNvbmZpZ3VyZQorICAgICAqLworICAgIHB1YmxpYyBMaW5rQXJndW1lbnQgY3JlYXRlTGluaygpIHsKKyAgICAgICAgTGlua0FyZ3VtZW50IGxhID0gbmV3IExpbmtBcmd1bWVudCgpOworICAgICAgICBsaW5rcy5hZGRFbGVtZW50KGxhKTsKKyAgICAgICAgcmV0dXJuIGxhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBsaW5rIHRyaXBsZXQgKGhyZWYsIHdoZXRoZXIgbGluayBpcyBvZmZsaW5lLAorICAgICAqIGxvY2F0aW9uIG9mIHRoZSBwYWNrYWdlIGxpc3QgaWYgb2ZmIGxpbmUpCisgICAgICovCisgICAgcHVibGljIGNsYXNzIExpbmtBcmd1bWVudCB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGhyZWY7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBvZmZsaW5lID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgRmlsZSBwYWNrYWdlbGlzdExvYzsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVMaW5rID0gZmFsc2U7CisKKyAgICAgICAgLyoqIENvbnN0cnVjdG9yIGZvciBMaW5rQXJndWVtZW50ICovCisgICAgICAgIHB1YmxpYyBMaW5rQXJndW1lbnQoKSB7CisgICAgICAgICAgICAvL2VtcHR5CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBocmVmIGF0dHJpYnV0ZS4KKyAgICAgICAgICogQHBhcmFtIGhyIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHIpIHsKKyAgICAgICAgICAgIGhyZWYgPSBocjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGhyZWYgYXR0cmlidXRlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBocmVmIGF0dHJpYnV0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKKyAgICAgICAgICAgIHJldHVybiBocmVmOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgcGFja2V0bGlzdCBsb2NhdGlvbiBhdHRyaWJ1dGUuCisgICAgICAgICAqIEBwYXJhbSBzcmMgYSA8Y29kZT5GaWxlPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZWxpc3RMb2MoRmlsZSBzcmMpIHsKKyAgICAgICAgICAgIHBhY2thZ2VsaXN0TG9jID0gc3JjOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcGFja2V0TGlzdCBsb2NhdGlvbiBhdHRyaWJ1dGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHBhY2tldExpc3QgbG9jYXRpb24gYXR0cmlidXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZpbGUgZ2V0UGFja2FnZWxpc3RMb2MoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFja2FnZWxpc3RMb2M7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBvZmZsaW5lIGF0dHJpYnV0ZS4KKyAgICAgICAgICogQHBhcmFtIG9mZmxpbmUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0T2ZmbGluZShib29sZWFuIG9mZmxpbmUpIHsKKyAgICAgICAgICAgIHRoaXMub2ZmbGluZSA9IG9mZmxpbmU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBsaW5rT2ZmbGluZSBhdHRyaWJ1dGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGxpbmtPZmZsaW5lIGF0dHJpYnV0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGlua09mZmxpbmUoKSB7CisgICAgICAgICAgICByZXR1cm4gb2ZmbGluZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHdoZXRoZXIgQW50IHNob3VsZCByZXNvbHZlIHRoZSBsaW5rIGF0dHJpYnV0ZSByZWxhdGl2ZQorICAgICAgICAgKiB0byB0aGUgY3VycmVudCBiYXNlZGlyLgorICAgICAgICAgKiBAcGFyYW0gcmVzb2x2ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlTGluayhib29sZWFuIHJlc29sdmUpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb2x2ZUxpbmsgPSByZXNvbHZlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNob3VsZCBBbnQgcmVzb2x2ZSB0aGUgbGluayBhdHRyaWJ1dGUgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgICAqIGN1cnJlbnQgYmFzZWRpcj8KKyAgICAgICAgICogQHJldHVybiB0aGUgcmVzb2x2ZUxpbmsgYXR0cmlidXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUmVzb2x2ZUxpbmsoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUxpbms7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGFkZHMgYSAtdGFnIGFyZ3VtZW50LiBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeQorICAgICAqIGN1c3RvbSB0YWdzLiBUaGlzIGFyZ3VtZW50IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBKYXZhZG9jIDEuNCwKKyAgICAgKiBhbmQgd2lsbCBnZW5lcmF0ZSBhIHZlcmJvc2UgbWVzc2FnZSAoYW5kIHRoZW4gYmUgaWdub3JlZCkKKyAgICAgKiB3aGVuIHJ1biBvbiBKYXZhIHZlcnNpb25zIGJlbG93IDEuNC4KKyAgICAgKiBAcmV0dXJuIHRhZyBhcmd1bWVudCB0byBiZSBjb25maWd1cmVkCisgICAgICovCisgICAgcHVibGljIFRhZ0FyZ3VtZW50IGNyZWF0ZVRhZygpIHsKKyAgICAgICAgVGFnQXJndW1lbnQgdGEgPSBuZXcgVGFnQXJndW1lbnQoKTsKKyAgICAgICAgdGFncy5hZGRFbGVtZW50ICh0YSk7CisgICAgICAgIHJldHVybiB0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY29wZSBlbGVtZW50IHZlcmJvc2UgbmFtZXMuIChEZWZpbmVkIGhlcmUgYXMgZmllbGRzCisgICAgICogY2Fubm90IGJlIHN0YXRpYyBpbiBpbm5lciBjbGFzc2VzLikgVGhlIGZpcnN0IGxldHRlcgorICAgICAqIGZyb20gZWFjaCBlbGVtZW50IGlzIHVzZWQgdG8gYnVpbGQgdXAgdGhlIHNjb3BlIHN0cmluZy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0NPUEVfRUxFTUVOVFMgPSB7CisgICAgICAgICJvdmVydmlldyIsICJwYWNrYWdlcyIsICJ0eXBlcyIsICJjb25zdHJ1Y3RvcnMiLAorICAgICAgICAibWV0aG9kcyIsICJmaWVsZHMiCisgICAgfTsKKworICAgIC8qKgorICAgICAqIENsYXNzIHJlcHJlc2VudGluZyBhIC10YWcgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFRhZ0FyZ3VtZW50IGV4dGVuZHMgRmlsZVNldCB7CisgICAgICAgIC8qKiBOYW1lIG9mIHRoZSB0YWcuICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAvKiogV2hldGhlciBvciBub3QgdGhlIHRhZyBpcyBlbmFibGVkLiAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTY29wZSBzdHJpbmcgb2YgdGhlIHRhZy4gVGhpcyB3aWxsIGZvcm0gdGhlIG1pZGRsZQorICAgICAgICAgKiBhcmd1bWVudCBvZiB0aGUgLXRhZyBwYXJhbWV0ZXIgd2hlbiB0aGUgdGFnIGlzIGVuYWJsZWQKKyAgICAgICAgICogKHdpdGggYW4gWCBwcmVwZW5kZWQgZm9yIGFuZCBpcyBwYXJzZWQgZnJvbSBodW1hbi1yZWFkYWJsZSBmb3JtLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc2NvcGUgPSAiYSI7CisKKyAgICAgICAgLyoqIFNvbGUgY29uc3RydWN0b3IuICovCisgICAgICAgIHB1YmxpYyBUYWdBcmd1bWVudCAoKSB7CisgICAgICAgICAgICAvL2VtcHR5CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdGFnLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnLgorICAgICAgICAgKiAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUgKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHNjb3BlIG9mIHRoZSB0YWcuIFRoaXMgaXMgaW4gY29tbWEtc2VwYXJhdGVkCisgICAgICAgICAqIGZvcm0sIHdpdGggZWFjaCBlbGVtZW50IGJlaW5nIG9uZSBvZiAiYWxsIiAodGhlIGRlZmF1bHQpLAorICAgICAgICAgKiAib3ZlcnZpZXciLCAicGFja2FnZXMiLCAidHlwZXMiLCAiY29uc3RydWN0b3JzIiwgIm1ldGhvZHMiLAorICAgICAgICAgKiAiZmllbGRzIi4gVGhlIGVsZW1lbnRzIGFyZSB0cmVhdGVkIGluIGEgY2FzZS1pbnNlbnNpdGl2ZQorICAgICAgICAgKiBtYW5uZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2ZXJib3NlU2NvcGUgVGhlIHNjb3BlIG9mIHRoZSB0YWcuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4sCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBlbXB0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbGwgaXMgc3BlY2lmaWVkIGFsb25nIHdpdGgKKyAgICAgICAgICogb3RoZXIgZWxlbWVudHMsIGlmIGFueSBlbGVtZW50cyBhcmUgcmVwZWF0ZWQsIGlmIG5vCisgICAgICAgICAqIGVsZW1lbnRzIGFyZSBzcGVjaWZpZWQsIG9yIGlmIGFueSB1bnJlY29nbmlzZWQgZWxlbWVudHMgYXJlCisgICAgICAgICAqIHNwZWNpZmllZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlIChTdHJpbmcgdmVyYm9zZVNjb3BlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgdmVyYm9zZVNjb3BlID0gdmVyYm9zZVNjb3BlLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisKKyAgICAgICAgICAgIGJvb2xlYW5bXSBlbGVtZW50cyA9IG5ldyBib29sZWFuW1NDT1BFX0VMRU1FTlRTLmxlbmd0aF07CisKKyAgICAgICAgICAgIGJvb2xlYW4gZ290QWxsID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGdvdE5vdEFsbCA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSB0b2tlbnMgb25lIGF0IGEgdGltZSwgdXBkYXRpbmcgdGhlCisgICAgICAgICAgICAvLyBlbGVtZW50cyBhcnJheSBhbmQgaXNzdWluZyB3YXJuaW5ncyB3aGVyZSBhcHByb3ByaWF0ZS4KKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyICh2ZXJib3NlU2NvcGUsICIsIik7CisgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0ID0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dC5lcXVhbHMoImFsbCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnb3RBbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2cgKCJSZXBlYXRlZCB0YWcgc2NvcGUgZWxlbWVudDogYWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdvdEFsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTQ09QRV9FTEVNRU5UUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQuZXF1YWxzIChTQ09QRV9FTEVNRU5UU1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBTQ09QRV9FTEVNRU5UUy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiAoIlVucmVjb2duaXNlZCBzY29wZSBlbGVtZW50OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nICgiUmVwZWF0ZWQgdGFnIHNjb3BlIGVsZW1lbnQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5leHQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNbaV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZ290Tm90QWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGdvdE5vdEFsbCAmJiBnb3RBbGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24gKCJNaXh0dXJlIG9mIFwiYWxsXCIgYW5kIG90aGVyIHNjb3BlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImVsZW1lbnRzIGluIHRhZyBwYXJhbWV0ZXIuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWdvdE5vdEFsbCAmJiAhZ290QWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uICgiTm8gc2NvcGUgZWxlbWVudHMgc3BlY2lmaWVkIGluIHRhZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwYXJhbWV0ZXIuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ290QWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zY29wZSA9ICJhIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyIChlbGVtZW50cy5sZW5ndGgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCAoU0NPUEVfRUxFTUVOVFNbaV0uY2hhckF0KDApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnNjb3BlID0gYnVmZi50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgd2hldGhlciBvciBub3QgdGhlIHRhZyBpcyBlbmFibGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZW5hYmxlZCBXaGV0aGVyIG9yIG5vdCB0aGlzIHRhZyBpcyBlbmFibGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZCAoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIC10YWcgcGFyYW1ldGVyIHRoaXMgYXJndW1lbnQgcmVwcmVzZW50ZWQuCisgICAgICAgICAqIEByZXR1cm4gdGhlIC10YWcgcGFyYW1ldGVyIGFzIGEgc3RyaW5nCisgICAgICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgZWl0aGVyIHRoZSBuYW1lIG9yIGRlc2NyaXB0aW9uCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiAoIk5vIG5hbWUgc3BlY2lmaWVkIGZvciBjdXN0b20gdGFnLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lICsgIjoiICsgKGVuYWJsZWQgPyAiIiA6ICJYIikKKyAgICAgICAgICAgICAgICAgICAgKyBzY29wZSArICI6IiArIGdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFlbmFibGVkIHx8ICEiYSIuZXF1YWxzKHNjb3BlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lICsgIjoiICsgKGVuYWJsZWQgPyAiIiA6ICJYIikgKyBzY29wZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXBhcmF0ZXMgcGFja2FnZXMgb24gdGhlIG92ZXJ2aWV3IHBhZ2UgaW50byB3aGF0ZXZlcgorICAgICAqIGdyb3VwcyB5b3Ugc3BlY2lmeSwgb25lIGdyb3VwIHBlciB0YWJsZS4KKyAgICAgKiBAcmV0dXJuIGEgZ3JvdXAgYXJndW1lbnQgdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBHcm91cEFyZ3VtZW50IGNyZWF0ZUdyb3VwKCkgeworICAgICAgICBHcm91cEFyZ3VtZW50IGdhID0gbmV3IEdyb3VwQXJndW1lbnQoKTsKKyAgICAgICAgZ3JvdXBzLmFkZEVsZW1lbnQoZ2EpOworICAgICAgICByZXR1cm4gZ2E7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdyb3VwIG5lc3RlZCBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBHcm91cEFyZ3VtZW50IHsKKyAgICAgICAgcHJpdmF0ZSBIdG1sIHRpdGxlOworICAgICAgICBwcml2YXRlIFZlY3RvciBwYWNrYWdlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICAvKiogQ29uc3RydWN0b3IgZm9yIEdyb3VwQXJndW1lbnQgKi8KKyAgICAgICAgcHVibGljIEdyb3VwQXJndW1lbnQoKSB7CisgICAgICAgICAgICAvL2VtcHR5CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB0aXRsZSBhdHRyaWJ1dGUgdXNpbmcgYSBzdHJpbmcuCisgICAgICAgICAqIEBwYXJhbSBzcmMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgc3JjKSB7CisgICAgICAgICAgICBIdG1sIGggPSBuZXcgSHRtbCgpOworICAgICAgICAgICAgaC5hZGRUZXh0KHNyYyk7CisgICAgICAgICAgICBhZGRUaXRsZShoKTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB0aXRsZSBhdHRyaWJ1dGUgdXNpbmcgYSBuZXN0ZWQgSHRtbCB2YWx1ZS4KKyAgICAgICAgICogQHBhcmFtIHRleHQgYSA8Y29kZT5IdG1sPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkVGl0bGUoSHRtbCB0ZXh0KSB7CisgICAgICAgICAgICB0aXRsZSA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0aXRsZS4KKyAgICAgICAgICogQHJldHVybiB0aGUgdGl0bGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGl0bGUgIT0gbnVsbCA/IHRpdGxlLmdldFRleHQoKSA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBwYWNrYWdlcyB0byBKYXZhZG9jIG9uLgorICAgICAgICAgKiBAcGFyYW0gc3JjIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VzKFN0cmluZyBzcmMpIHsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNyYywgIiwiKTsKKyAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHAgPSB0b2submV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgUGFja2FnZU5hbWUgcG4gPSBuZXcgUGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBwbi5zZXROYW1lKHApOworICAgICAgICAgICAgICAgIGFkZFBhY2thZ2UocG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBwYWNrYWdlIG5lc3RlZCBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gcG4gYSBuZXN0ZWQgZWxlbWVudCBzcGVjaWZpbmcgdGhlIHBhY2thZ2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlKFBhY2thZ2VOYW1lIHBuKSB7CisgICAgICAgICAgICBwYWNrYWdlcy5hZGRFbGVtZW50KHBuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHBhY2thZ2VzIGFzIGEgY29sbG9uIHNlcGFyYXRlZCBsaXN0LgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlcyBhcyBhIHN0cmluZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlcygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBwID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZCgiOiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwLmFwcGVuZChwYWNrYWdlcy5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcC50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hhcnNldCBmb3IgY3Jvc3MtcGxhdGZvcm0gdmlld2luZyBvZiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBuYW1lIG9mIHRoZSBjaGFyc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcnNldChTdHJpbmcgc3JjKSB7CisgICAgICAgIHRoaXMuYWRkQXJnSWZOb3RFbXB0eSgiLWNoYXJzZXQiLCBzcmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3VsZCB0aGUgYnVpbGQgcHJvY2VzcyBmYWlsIGlmIEphdmFkb2MgZmFpbHMgKGFzIGluZGljYXRlZCBieQorICAgICAqIGEgbm9uIHplcm8gcmV0dXJuIGNvZGUpPworICAgICAqCisgICAgICogPHA+RGVmYXVsdCBpcyBmYWxzZS48L3A+CisgICAgICogQHBhcmFtIGIgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvbmVycm9yKGJvb2xlYW4gYikgeworICAgICAgICBmYWlsT25FcnJvciA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlcyB0aGUgLXNvdXJjZSBzd2l0Y2gsIHdpbGwgYmUgaWdub3JlZCBpZiBKYXZhZG9jIGlzIG5vdAorICAgICAqIHRoZSAxLjQgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gc291cmNlIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYWN0dWFsIGV4ZWN1dGFibGUgY29tbWFuZCB0byBpbnZva2UsIGluc3RlYWQgb2YgdGhlIGJpbmFyeQorICAgICAqIDxjb2RlPmphdmFkb2M8L2NvZGU+IGZvdW5kIGluIEFudCdzIEpESy4KKyAgICAgKiBAcGFyYW0gZXhlY3V0YWJsZSB0aGUgY29tbWFuZCB0byBpbnZva2UuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dGFibGUoU3RyaW5nIGV4ZWN1dGFibGUpIHsKKyAgICAgICAgdGhpcy5leGVjdXRhYmxlID0gZXhlY3V0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGFja2FnZXNldC4KKyAgICAgKgorICAgICAqIDxwPkFsbCBpbmNsdWRlZCBkaXJlY3RvcmllcyB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byBwYWNrYWdlCisgICAgICogbmFtZXMgYmUgY29udmVydGluZyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpbnRvIGRvdHMuPC9wPgorICAgICAqIEBwYXJhbSBwYWNrYWdlU2V0IGEgZGlyZWN0b3J5IHNldAorICAgICAqIEBzaW5jZSAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlc2V0KERpclNldCBwYWNrYWdlU2V0KSB7CisgICAgICAgIHBhY2thZ2VTZXRzLmFkZEVsZW1lbnQocGFja2FnZVNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGZpbGVzZXQuCisgICAgICoKKyAgICAgKiA8cD5BbGwgaW5jbHVkZWQgZmlsZXMgd2lsbCBiZSBhZGRlZCBhcyBzb3VyY2VmaWxlcy4gIFRoZSB0YXNrCisgICAgICogd2lsbCBhdXRvbWF0aWNhbGx5IGFkZAorICAgICAqIDxjb2RlPmluY2x1ZGVzPSZxdW90OyoqJiM0NzsqLmphdmEmcXVvdDs8L2NvZGU+IHRvIHRoZQorICAgICAqIGZpbGVzZXQuPC9wPgorICAgICAqIEBwYXJhbSBmcyBhIGZpbGUgc2V0CisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBmcykgeworICAgICAgICBjcmVhdGVTb3VyY2VGaWxlcygpLmFkZChmcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGNvbnRhaW5lciBmb3IgcmVzb3VyY2UgY29sbGVjdGlvbnMuCisgICAgICoKKyAgICAgKiA8cD5BbGwgaW5jbHVkZWQgZmlsZXMgd2lsbCBiZSBhZGRlZCBhcyBzb3VyY2VmaWxlcy48L3A+CisgICAgICogQHJldHVybiB0aGUgc291cmNlIGZpbGVzIHRvIGNvbmZpZ3VyZS4KKyAgICAgKiBAc2luY2UgMS43CisgICAgICovCisgICAgcHVibGljIFJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lciBjcmVhdGVTb3VyY2VGaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIG5lc3RlZFNvdXJjZUZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgdGhlIC1saW5rc291cmNlIHN3aXRjaCwgd2lsbCBiZSBpZ25vcmVkIGlmIEphdmFkb2MgaXMgbm90CisgICAgICogdGhlIDEuNCB2ZXJzaW9uLiBEZWZhdWx0IGlzIGZhbHNlCisgICAgICogQHBhcmFtIGIgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaW5rc291cmNlKGJvb2xlYW4gYikgeworICAgICAgICB0aGlzLmxpbmtzb3VyY2UgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgdGhlIC1saW5rc291cmNlIHN3aXRjaCwgd2lsbCBiZSBpZ25vcmVkIGlmIEphdmFkb2MgaXMgbm90CisgICAgICogdGhlIDEuNCB2ZXJzaW9uLiBEZWZhdWx0IGlzIGZhbHNlCisgICAgICogQHBhcmFtIGIgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCcmVha2l0ZXJhdG9yKGJvb2xlYW4gYikgeworICAgICAgICB0aGlzLmJyZWFraXRlcmF0b3IgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgdGhlIC1ub3F1YWxpZmllciBzd2l0Y2gsIHdpbGwgYmUgaWdub3JlZCBpZiBKYXZhZG9jIGlzIG5vdAorICAgICAqIHRoZSAxLjQgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gbm9xdWFsaWZpZXIgdGhlIHBhcmFtZXRlciB0byB0aGUgLW5vcXVhbGlmaWVyIHN3aXRjaAorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9xdWFsaWZpZXIoU3RyaW5nIG5vcXVhbGlmaWVyKSB7CisgICAgICAgIHRoaXMubm9xdWFsaWZpZXIgPSBub3F1YWxpZmllcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgQW50IHdpbGwgYWxzbyBhY2NlcHQgcGFja2FnZXMgdGhhdCBvbmx5IGhvbGQKKyAgICAgKiBwYWNrYWdlLmh0bWwgZmlsZXMgYnV0IG5vIEphdmEgc291cmNlcy4KKyAgICAgKiBAcGFyYW0gYiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlTm9Tb3VyY2VQYWNrYWdlcyhib29sZWFuIGIpIHsKKyAgICAgICAgdGhpcy5pbmNsdWRlTm9Tb3VyY2VQYWNrYWdlcyA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrVGFza05hbWUoKTsKKworICAgICAgICBWZWN0b3IgcGFja2FnZXNUb0RvYyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgUGF0aCBzb3VyY2VEaXJzID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKworICAgICAgICBjaGVja1BhY2thZ2VBbmRTb3VyY2VQYXRoKCk7CisKKyAgICAgICAgaWYgKHNvdXJjZVBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgc291cmNlRGlycy5hZGRFeGlzdGluZyhzb3VyY2VQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcnNlUGFja2FnZXMocGFja2FnZXNUb0RvYywgc291cmNlRGlycyk7CisgICAgICAgIGNoZWNrUGFja2FnZXMocGFja2FnZXNUb0RvYywgc291cmNlRGlycyk7CisKKyAgICAgICAgVmVjdG9yIHNvdXJjZUZpbGVzVG9Eb2MgPSAoVmVjdG9yKSBzb3VyY2VGaWxlcy5jbG9uZSgpOworICAgICAgICBhZGRTb3VyY2VGaWxlcyhzb3VyY2VGaWxlc1RvRG9jKTsKKworICAgICAgICBjaGVja1BhY2thZ2VzVG9Eb2MocGFja2FnZXNUb0RvYywgc291cmNlRmlsZXNUb0RvYyk7CisKKyAgICAgICAgbG9nKCJHZW5lcmF0aW5nIEphdmFkb2MiLCBQcm9qZWN0Lk1TR19JTkZPKTsKKworICAgICAgICBDb21tYW5kbGluZSB0b0V4ZWN1dGUgPSAoQ29tbWFuZGxpbmUpIGNtZC5jbG9uZSgpOworICAgICAgICBpZiAoZXhlY3V0YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0b0V4ZWN1dGUuc2V0RXhlY3V0YWJsZShleGVjdXRhYmxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5zZXRFeGVjdXRhYmxlKEphdmFFbnZVdGlscy5nZXRKZGtFeGVjdXRhYmxlKCJqYXZhZG9jIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gIEphdmFkb2MgYXJndW1lbnRzCisgICAgICAgIGdlbmVyYWxKYXZhZG9jQXJndW1lbnRzKHRvRXhlY3V0ZSk7ICAvLyBnZW5lcmFsIEphdmFkb2MgYXJndW1lbnRzCisgICAgICAgIGRvU291cmNlUGF0aCh0b0V4ZWN1dGUsIHNvdXJjZURpcnMpOyAvLyBzb3VyY2VwYXRoCisgICAgICAgIGRvRG9jbGV0KHRvRXhlY3V0ZSk7ICAgLy8gYXJndW1lbnRzIGZvciBkZWZhdWx0IGRvY2xldAorICAgICAgICBkb0Jvb3RQYXRoKHRvRXhlY3V0ZSk7IC8vIGJvb3RwYXRoCisgICAgICAgIGRvTGlua3ModG9FeGVjdXRlKTsgICAgLy8gbGlua3MgYXJndW1lbnRzCisgICAgICAgIGRvR3JvdXAodG9FeGVjdXRlKTsgICAgLy8gZ3JvdXAgYXR0cmlidXRlCisgICAgICAgIGRvR3JvdXBzKHRvRXhlY3V0ZSk7ICAvLyBncm91cHMgYXR0cmlidXRlCisKKyAgICAgICAgLy8gSmF2YWRvYyAxLjQgcGFyYW1ldGVycworICAgICAgICBpZiAoSkFWQURPQ180IHx8IGV4ZWN1dGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9KYXZhMTQodG9FeGVjdXRlKTsKKyAgICAgICAgICAgIGlmIChicmVha2l0ZXJhdG9yICYmIChkb2NsZXQgPT0gbnVsbCB8fCBKQVZBRE9DXzUpKSB7CisgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1icmVha2l0ZXJhdG9yIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb05vdEphdmExNCgpOworICAgICAgICB9CisgICAgICAgIC8vIEphdmFkb2MgMS4yLzEuMyBwYXJhbWV0ZXJzOgorICAgICAgICBpZiAoIUpBVkFET0NfNCB8fCBleGVjdXRhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvbGQpIHsKKyAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLTEuMSIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG9sZCkgeworICAgICAgICAgICAgICAgIGxvZygiSmF2YWRvYyAxLjQgZG9lc24ndCBzdXBwb3J0IHRoZSAtMS4xIHN3aXRjaCBhbnltb3JlIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdXNpbmcgYW4gZXh0ZXJuYWwgZmlsZSwgd3JpdGUgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGl0CisgICAgICAgIGlmICh1c2VFeHRlcm5hbEZpbGUgJiYgSkFWQURPQ180KSB7CisgICAgICAgICAgICB3cml0ZUV4dGVybmFsQXJncyh0b0V4ZWN1dGUpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSB0bXBMaXN0ID0gbnVsbDsKKyAgICAgICAgUHJpbnRXcml0ZXIgc3JjTGlzdFdyaXRlciA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogV3JpdGUgc291cmNlZmlsZXMgYW5kIHBhY2thZ2UgbmFtZXMgdG8gYSB0ZW1wb3JhcnkgZmlsZQorICAgICAgICAgICAgICogaWYgcmVxdWVzdGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodXNlRXh0ZXJuYWxGaWxlKSB7CisgICAgICAgICAgICAgICAgdG1wTGlzdCA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoImphdmFkb2MiLCAiIiwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKCJAIiArIHRtcExpc3QuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIHNyY0xpc3RXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlV3JpdGVyKHRtcExpc3QuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZG9Tb3VyY2VBbmRQYWNrYWdlTmFtZXMoCisgICAgICAgICAgICAgICAgdG9FeGVjdXRlLCBwYWNrYWdlc1RvRG9jLCBzb3VyY2VGaWxlc1RvRG9jLAorICAgICAgICAgICAgICAgIHVzZUV4dGVybmFsRmlsZSwgdG1wTGlzdCwgc3JjTGlzdFdyaXRlcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRtcExpc3QuZGVsZXRlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzcmNMaXN0V3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzcmNMaXN0V3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFja2FnZUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIkAiICsgcGFja2FnZUxpc3QpOworICAgICAgICB9CisgICAgICAgIGxvZyh0b0V4ZWN1dGUuZGVzY3JpYmVDb21tYW5kKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIGxvZygiSmF2YWRvYyBleGVjdXRpb24iLCBQcm9qZWN0Lk1TR19JTkZPKTsKKworICAgICAgICBKYXZhZG9jT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBKYXZhZG9jT3V0cHV0U3RyZWFtKFByb2plY3QuTVNHX0lORk8pOworICAgICAgICBKYXZhZG9jT3V0cHV0U3RyZWFtIGVyciA9IG5ldyBKYXZhZG9jT3V0cHV0U3RyZWFtKFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKG5ldyBQdW1wU3RyZWFtSGFuZGxlcihvdXQsIGVycikpOworICAgICAgICBleGUuc2V0QW50UnVuKGdldFByb2plY3QoKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTm8gcmVhc29uIHRvIGNoYW5nZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYXMgYWxsIGZpbGVuYW1lcyBhbmQKKyAgICAgICAgICogcGF0aCBjb21wb25lbnRzIGhhdmUgYmVlbiByZXNvbHZlZCBhbHJlYWR5LgorICAgICAgICAgKgorICAgICAgICAgKiBBdm9pZCBwcm9ibGVtcyB3aXRoIGNvbW1hbmQgbGluZSBsZW5ndGggaW4gc29tZSBlbnZpcm9ubWVudHMuCisgICAgICAgICAqLworICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeShudWxsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZSh0b0V4ZWN1dGUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgICAgICBpbnQgcmV0ID0gZXhlLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCAmJiBmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSmF2YWRvYyByZXR1cm5lZCAiICsgcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJKYXZhZG9jIGZhaWxlZDogIiArIGUsIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHRtcExpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRtcExpc3QuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgdG1wTGlzdCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5sb2dGbHVzaCgpOworICAgICAgICAgICAgZXJyLmxvZ0ZsdXNoKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIGVyci5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVGFza05hbWUoKSB7CisgICAgICAgIGlmICgiamF2YWRvYzIiLmVxdWFscyhnZXRUYXNrVHlwZSgpKSkgeworICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiB0aGUgdGFzayBuYW1lIDxqYXZhZG9jMj4gaXMgZGVwcmVjYXRlZC4iCisgICAgICAgICAgICAgICAgKyAiIFVzZSA8amF2YWRvYz4gaW5zdGVhZC4iLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFja2FnZUFuZFNvdXJjZVBhdGgoKSB7CisgICAgICAgIGlmIChwYWNrYWdlTGlzdCAhPSBudWxsICYmIHNvdXJjZVBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJzb3VyY2VQYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCB3aGVuICIKKyAgICAgICAgICAgICAgICArICJzcGVjaWZ5aW5nIHBhY2thZ2VsaXN0LiI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1BhY2thZ2VzKFZlY3RvciBwYWNrYWdlc1RvRG9jLCBQYXRoIHNvdXJjZURpcnMpIHsKKyAgICAgICAgaWYgKHBhY2thZ2VzVG9Eb2Muc2l6ZSgpICE9IDAgJiYgc291cmNlRGlycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJzb3VyY2VQYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCB3aGVuICIKKyAgICAgICAgICAgICAgICArICJzcGVjaWZ5aW5nIHBhY2thZ2UgbmFtZXMuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFja2FnZXNUb0RvYygKKyAgICAgICAgVmVjdG9yIHBhY2thZ2VzVG9Eb2MsIFZlY3RvciBzb3VyY2VGaWxlc1RvRG9jKSB7CisgICAgICAgIGlmIChwYWNrYWdlTGlzdCA9PSBudWxsICYmIHBhY2thZ2VzVG9Eb2Muc2l6ZSgpID09IDAKKyAgICAgICAgICAgICYmIHNvdXJjZUZpbGVzVG9Eb2Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gc291cmNlIGZpbGVzIGFuZCBubyBwYWNrYWdlcyBoYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZWVuIHNwZWNpZmllZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1NvdXJjZVBhdGgoQ29tbWFuZGxpbmUgdG9FeGVjdXRlLCBQYXRoIHNvdXJjZURpcnMpIHsKKyAgICAgICAgaWYgKHNvdXJjZURpcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1zb3VyY2VwYXRoIik7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKHNvdXJjZURpcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYWxKYXZhZG9jQXJndW1lbnRzKENvbW1hbmRsaW5lIHRvRXhlY3V0ZSkgeworICAgICAgICBpZiAoZG9jdGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kb2N0aXRsZSIpOworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZXhwYW5kKGRvY3RpdGxlLmdldFRleHQoKSkpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1oZWFkZXIiKTsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGV4cGFuZChoZWFkZXIuZ2V0VGV4dCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvb3RlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWZvb3RlciIpOworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZXhwYW5kKGZvb3Rlci5nZXRUZXh0KCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYm90dG9tICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYm90dG9tIik7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShleHBhbmQoYm90dG9tLmdldFRleHQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSAobmV3IFBhdGgoZ2V0UHJvamVjdCgpKSkuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGFzc3BhdGguc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJzaW9uICYmIGRvY2xldCA9PSBudWxsKSB7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXZlcnNpb24iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXV0aG9yICYmIGRvY2xldCA9PSBudWxsKSB7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWF1dGhvciIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvY2xldCA9PSBudWxsICYmIGRlc3REaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0ZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0RvY2xldChDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKKyAgICAgICAgaWYgKGRvY2xldCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZG9jbGV0LmdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZG9jbGV0IG5hbWUgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNwZWNpZmllZC4iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kb2NsZXQiKTsKKyAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShkb2NsZXQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZG9jbGV0LmdldFBhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFBhdGggZG9jbGV0UGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgPSBkb2NsZXQuZ2V0UGF0aCgpLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChkb2NsZXRQYXRoLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWRvY2xldHBhdGgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoZG9jbGV0UGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZG9jbGV0LmdldFBhcmFtcygpOworICAgICAgICAgICAgICAgICAgICAgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgRG9jbGV0UGFyYW0gcGFyYW0gPSAoRG9jbGV0UGFyYW0pIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLmdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRvY2xldCBwYXJhbWV0ZXJzIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImhhdmUgYSBuYW1lIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShwYXJhbS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0uZ2V0VmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwYXJhbS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZUV4dGVybmFsQXJncyhDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKKyAgICAgICAgLy8gSWYgdXNpbmcgYW4gZXh0ZXJuYWwgZmlsZSwgd3JpdGUgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGl0CisgICAgICAgIEZpbGUgb3B0aW9uc1RtcEZpbGUgPSBudWxsOworICAgICAgICBQcmludFdyaXRlciBvcHRpb25zTGlzdFdyaXRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcHRpb25zVG1wRmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoCisgICAgICAgICAgICAgICAgImphdmFkb2NPcHRpb25zIiwgIiIsIG51bGwsIHRydWUsIHRydWUpOworICAgICAgICAgICAgU3RyaW5nW10gbGlzdE9wdCA9IHRvRXhlY3V0ZS5nZXRBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jbGVhckFyZ3MoKTsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKAorICAgICAgICAgICAgICAgICJAIiArIG9wdGlvbnNUbXBGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIG9wdGlvbnNMaXN0V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKAorICAgICAgICAgICAgICAgIG5ldyBGaWxlV3JpdGVyKG9wdGlvbnNUbXBGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RPcHQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gbGlzdE9wdFtpXTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLnN0YXJ0c1dpdGgoIi1KLSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHN0cmluZyk7CisgICAgICAgICAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuc3RhcnRzV2l0aCgiLSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTGlzdFdyaXRlci5wcmludChzdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0xpc3RXcml0ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNMaXN0V3JpdGVyLnByaW50bG4ocXVvdGVTdHJpbmcoc3RyaW5nKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcHRpb25zTGlzdFdyaXRlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaWYgKG9wdGlvbnNUbXBGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvcHRpb25zVG1wRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRXJyb3IgY3JlYXRpbmcgb3Igd3JpdGluZyB0ZW1wb3JhcnkgZmlsZSBmb3IgamF2YWRvYyBvcHRpb25zIiwKKyAgICAgICAgICAgICAgICBleCwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGSUxFX1VUSUxTLmNsb3NlKG9wdGlvbnNMaXN0V3JpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0Jvb3RQYXRoKENvbW1hbmRsaW5lIHRvRXhlY3V0ZSkgeworICAgICAgICBQYXRoIGJjcCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIGlmIChib290Y2xhc3NwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJjcC5hcHBlbmQoYm9vdGNsYXNzcGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgYmNwID0gYmNwLmNvbmNhdFN5c3RlbUJvb3RDbGFzc3BhdGgoImlnbm9yZSIpOworICAgICAgICBpZiAoYmNwLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYm9vdGNsYXNzcGF0aCIpOworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChiY3ApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvTGlua3MoQ29tbWFuZGxpbmUgdG9FeGVjdXRlKSB7CisgICAgICAgIGlmIChsaW5rcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gbGlua3MuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICBMaW5rQXJndW1lbnQgbGEgPSAoTGlua0FyZ3VtZW50KSBlLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICBpZiAobGEuZ2V0SHJlZigpID09IG51bGwgfHwgbGEuZ2V0SHJlZigpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJObyBocmVmIHdhcyBnaXZlbiBmb3IgdGhlIGxpbmsgLSBza2lwcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBsaW5rID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobGEuc2hvdWxkUmVzb2x2ZUxpbmsoKSkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGhyZWZBc0ZpbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGxhLmdldEhyZWYoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChocmVmQXNGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgPSBGSUxFX1VUSUxTLmdldEZpbGVVUkwoaHJlZkFzRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvRXh0ZXJuYWxGb3JtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogbGluayBsb2NhdGlvbiB3YXMgaW52YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaHJlZkFzRmlsZSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgaHJlZiBhIHZhbGlkIFVSTAorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGJhc2UgPSBuZXcgVVJMKCJmaWxlOi8vLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSTChiYXNlLCBsYS5nZXRIcmVmKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluayA9IGxhLmdldEhyZWYoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sgLSBqdXN0IHNraXAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiTGluayBocmVmIFwiIiArIGxhLmdldEhyZWYoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGlzIG5vdCBhIHZhbGlkIHVybCAtIHNraXBwaW5nIGxpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGEuaXNMaW5rT2ZmbGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgcGFja2FnZUxpc3RMb2NhdGlvbiA9IGxhLmdldFBhY2thZ2VsaXN0TG9jKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTGlzdExvY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHBhY2thZ2UgbGlzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbG9jYXRpb24gZm9yIGxpbmsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGEuZ2V0SHJlZigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgYmUgcHJvdmlkZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlY2F1c2UgdGhlIGxpbmsgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9mZmxpbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBGaWxlIHBhY2thZ2VMaXN0RmlsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShwYWNrYWdlTGlzdExvY2F0aW9uLCAicGFja2FnZS1saXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTGlzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VMaXN0VVJMID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5nZXRGaWxlVVJMKHBhY2thZ2VMaXN0TG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0V4dGVybmFsRm9ybSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSgiLWxpbmtvZmZsaW5lIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKGxpbmspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwYWNrYWdlTGlzdFVSTCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIldhcm5pbmc6IFBhY2thZ2UgbGlzdCBsb2NhdGlvbiB3YXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpbnZhbGlkICIgKyBwYWNrYWdlTGlzdExvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogTm8gcGFja2FnZSBsaXN0IHdhcyBmb3VuZCBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlTGlzdExvY2F0aW9uLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbGluayIpOworICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShsaW5rKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Hcm91cChDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKKyAgICAgICAgLy8gYWRkIHRoZSBzaW5nbGUgZ3JvdXAgYXJndW1lbnRzCisgICAgICAgIC8vIEphdmFkb2MgMS4yIHJ1bGVzOgorICAgICAgICAvLyAgIE11bHRpcGxlIC1ncm91cCBhcmdzIGFsbG93ZWQuCisgICAgICAgIC8vICAgRWFjaCBhcmcgaW5jbHVkZXMgMyBzdHJpbmdzOiAtZ3JvdXAgW25hbWVdIFtwYWNrYWdlbGlzdF0uCisgICAgICAgIC8vICAgRWxlbWVudHMgaW4gW3BhY2thZ2VsaXN0XSBhcmUgY29sb24tZGVsaW1pdGVkLgorICAgICAgICAvLyAgIEFuIGVsZW1lbnQgaW4gW3BhY2thZ2VsaXN0XSBtYXkgZW5kIHdpdGggdGhlICogd2lsZGNhcmQuCisKKyAgICAgICAgLy8gQW50IGphdmFkb2MgdGFzayBydWxlcyBmb3IgZ3JvdXAgYXR0cmlidXRlOgorICAgICAgICAvLyAgIEFyZ3MgYXJlIGNvbW1hLWRlbGltaXRlZC4KKyAgICAgICAgLy8gICBFYWNoIGFyZyBpcyAyIHNwYWNlLWRlbGltaXRlZCBzdHJpbmdzLgorICAgICAgICAvLyAgIEUuZy4sIGdyb3VwPSJYU0xUX1BhY2thZ2VzIG9yZy5hcGFjaGUueGFsYW4ueHNsdCosCisgICAgICAgIC8vICAgICAgICAgICAgICAgIFhQYXRoX1BhY2thZ2VzIG9yZy5hcGFjaGUueGFsYW4ueHBhdGgqIgorICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ3JvdXAsICIsIiwgZmFsc2UpOworICAgICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZ3JwID0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BhY2UgPSBncnAuaW5kZXhPZigiICIpOworICAgICAgICAgICAgICAgIGlmIChzcGFjZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBncnAuc3Vic3RyaW5nKDAsIHNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBrZ0xpc3QgPSBncnAuc3Vic3RyaW5nKHNwYWNlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZ3JvdXAiKTsKKyAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHBrZ0xpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFkZCB0aGUgZ3JvdXAgYXJndW1lbnRzCisgICAgcHJpdmF0ZSB2b2lkIGRvR3JvdXBzKENvbW1hbmRsaW5lIHRvRXhlY3V0ZSkgeworICAgICAgICBpZiAoZ3JvdXBzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBncm91cHMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICBHcm91cEFyZ3VtZW50IGdhID0gKEdyb3VwQXJndW1lbnQpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBnYS5nZXRUaXRsZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlcyA9IGdhLmdldFBhY2thZ2VzKCk7CisgICAgICAgICAgICAgICAgaWYgKHRpdGxlID09IG51bGwgfHwgcGFja2FnZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSB0aXRsZSBhbmQgcGFja2FnZXMgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZSBzcGVjaWZpZWQgZm9yIGdyb3VwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImVsZW1lbnRzLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWdyb3VwIik7CisgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZXhwYW5kKHRpdGxlKSk7CisgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUocGFja2FnZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRG8gamF2YTEuNCBhcmd1bWVudHMKKyAgICBwcml2YXRlIHZvaWQgZG9KYXZhMTQoQ29tbWFuZGxpbmUgdG9FeGVjdXRlKSB7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHRhZ3MuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWdBcmd1bWVudCkgeworICAgICAgICAgICAgICAgIFRhZ0FyZ3VtZW50IHRhID0gKFRhZ0FyZ3VtZW50KSBlbGVtZW50OworICAgICAgICAgICAgICAgIEZpbGUgdGFnRGlyID0gdGEuZ2V0RGlyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRhZ0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0YWcgZWxlbWVudCBpcyBub3QgdXNlZCBhcyBhIGZpbGVzZXQsCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBzcGVjaWZpZXMgdGhlIHRhZyBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUgKCItdGFnIik7CisgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUgKHRhLmdldFBhcmFtZXRlcigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFnIGVsZW1lbnQgaXMgdXNlZCBhcyBhCisgICAgICAgICAgICAgICAgICAgIC8vIGZpbGVzZXQuIFBhcnNlIGFsbCB0aGUgZmlsZXMgYW5kIGNyZWF0ZQorICAgICAgICAgICAgICAgICAgICAvLyAtdGFnIGFyZ3VtZW50cy4KKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciB0YWdEZWZTY2FubmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSB0YWdEZWZTY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSB0YWdEZWZGaWxlID0gbmV3IEZpbGUodGFnRGlyLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVSZWFkZXIodGFnRGVmRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKCItdGFnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUobGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZWFkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRhZyBmaWxlIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhZ0RlZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGlvZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEV4dGVuc2lvbkluZm8gdGFnbGV0SW5mbyA9IChFeHRlbnNpb25JbmZvKSBlbGVtZW50OworICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdGFnbGV0Iik7CisgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGFnbGV0SW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmICh0YWdsZXRJbmZvLmdldFBhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFBhdGggdGFnbGV0UGF0aCA9IHRhZ2xldEluZm8uZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ2xldFBhdGguc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKCItdGFnbGV0cGF0aCIpOworICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aCh0YWdsZXRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzb3VyY2VBcmcgPSBzb3VyY2UgIT0gbnVsbCA/IHNvdXJjZQorICAgICAgICAgICAgOiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9KQVZBQ19TT1VSQ0UpOworICAgICAgICBpZiAoc291cmNlQXJnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc291cmNlIik7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShzb3VyY2VBcmcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpbmtzb3VyY2UgJiYgZG9jbGV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbGlua3NvdXJjZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChub3F1YWxpZmllciAhPSBudWxsICYmIGRvY2xldCA9PSBudWxsKSB7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW5vcXVhbGlmaWVyIik7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShub3F1YWxpZmllcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Ob3RKYXZhMTQoKSB7CisgICAgICAgIC8vIE5vdCAxLjQrLgorICAgICAgICBpZiAoIXRhZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsb2coIi10YWcgYW5kIC10YWdsZXQgb3B0aW9ucyBub3Qgc3VwcG9ydGVkIG9uIEphdmFkb2MgPCAxLjQiLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCItc291cmNlIG9wdGlvbiBub3Qgc3VwcG9ydGVkIG9uIEphdmFkb2MgPCAxLjQiLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgICAgIGlmIChsaW5rc291cmNlKSB7CisgICAgICAgICAgICBsb2coIi1saW5rc291cmNlIG9wdGlvbiBub3Qgc3VwcG9ydGVkIG9uIEphdmFkb2MgPCAxLjQiLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgICAgIGlmIChicmVha2l0ZXJhdG9yKSB7CisgICAgICAgICAgICBsb2coIi1icmVha2l0ZXJhdG9yIG9wdGlvbiBub3Qgc3VwcG9ydGVkIG9uIEphdmFkb2MgPCAxLjQiLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgICAgIGlmIChub3F1YWxpZmllciAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2coIi1ub3F1YWxpZmllciBvcHRpb24gbm90IHN1cHBvcnRlZCBvbiBKYXZhZG9jIDwgMS40IiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1NvdXJjZUFuZFBhY2thZ2VOYW1lcygKKyAgICAgICAgQ29tbWFuZGxpbmUgdG9FeGVjdXRlLAorICAgICAgICBWZWN0b3IgcGFja2FnZXNUb0RvYywKKyAgICAgICAgVmVjdG9yIHNvdXJjZUZpbGVzVG9Eb2MsCisgICAgICAgIGJvb2xlYW4gdXNlRXh0ZXJuYWxGaWxlLAorICAgICAgICBGaWxlICAgIHRtcExpc3QsCisgICAgICAgIFByaW50V3JpdGVyIHNyY0xpc3RXcml0ZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBwYWNrYWdlc1RvRG9jLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAodXNlRXh0ZXJuYWxGaWxlKSB7CisgICAgICAgICAgICAgICAgc3JjTGlzdFdyaXRlci5wcmludGxuKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUocGFja2FnZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZSA9IHNvdXJjZUZpbGVzVG9Eb2MuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFNvdXJjZUZpbGUgc2YgPSAoU291cmNlRmlsZSkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUZpbGVOYW1lID0gc2YuZ2V0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgaWYgKHVzZUV4dGVybmFsRmlsZSkgeworICAgICAgICAgICAgICAgIC8vIFhYWCB3aGF0IGlzIHRoZSBmb2xsb3dpbmcgZG9pbmc/CisgICAgICAgICAgICAgICAgLy8gICAgIHNob3VsZCBpdCBydW4gaWYgIWphdmFkb2M0ICYmIGV4ZWN1dGFibGUgIT0gbnVsbD8KKyAgICAgICAgICAgICAgICBpZiAoSkFWQURPQ180ICYmIHNvdXJjZUZpbGVOYW1lLmluZGV4T2YoIiAiKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gc291cmNlRmlsZU5hbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNvdXJjZUZpbGVOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNyY0xpc3RXcml0ZXIucHJpbnRsbigiXCIiICsgbmFtZSArICJcIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNyY0xpc3RXcml0ZXIucHJpbnRsbihzb3VyY2VGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShzb3VyY2VGaWxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdW90ZSBhIHN0cmluZyB0byBwbGFjZSBpbiBhIEAgZmlsZS4KKyAgICAgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gcXVvdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBxdW90ZWQgc3RyaW5nLCBpZiB0aGVyZSBpcyBubyBuZWVkIHRvIHF1b3RlIHRoZSBzdHJpbmcsCisgICAgICogICAgICAgICByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBxdW90ZVN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgICAgIGlmIChzdHIuaW5kZXhPZignICcpID09IC0xCisgICAgICAgICAgICAmJiBzdHIuaW5kZXhPZignXCcnKSA9PSAtMQorICAgICAgICAgICAgJiYgc3RyLmluZGV4T2YoJyInKSA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHN0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ1wnJykgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBxdW90ZVN0cmluZyhzdHIsICdcJycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHF1b3RlU3RyaW5nKHN0ciwgJyInKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHF1b3RlU3RyaW5nKFN0cmluZyBzdHIsIGNoYXIgZGVsaW0pIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyLmxlbmd0aCgpICogMik7CisgICAgICAgIGJ1Zi5hcHBlbmQoZGVsaW0pOworICAgICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcJykgIT0gLTEpIHsKKyAgICAgICAgICAgIHN0ciA9IHJlcGxhY2Uoc3RyLCAnXFwnLCAiXFxcXCIpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHIuaW5kZXhPZihkZWxpbSkgIT0gLTEpIHsKKyAgICAgICAgICAgIHN0ciA9IHJlcGxhY2Uoc3RyLCBkZWxpbSwgIlxcIiArIGRlbGltKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKHN0cik7CisgICAgICAgIGJ1Zi5hcHBlbmQoZGVsaW0pOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZShTdHJpbmcgc3RyLCBjaGFyIGZyb21DaGFyLCBTdHJpbmcgdG9TdHJpbmcpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyLmxlbmd0aCgpICogMik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGNoID09IGZyb21DaGFyKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh0b1N0cmluZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGZpbGVzIG1hdGNoZWQgYnkgdGhlIG5lc3RlZCBzb3VyY2UgZmlsZXMgdG8gdGhlIFZlY3RvcgorICAgICAqIGFzIFNvdXJjZUZpbGUgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRTb3VyY2VGaWxlcyhWZWN0b3Igc2YpIHsKKyAgICAgICAgSXRlcmF0b3IgZSA9IG5lc3RlZFNvdXJjZUZpbGVzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgeworICAgICAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIHJjID0gKFJlc291cmNlQ29sbGVjdGlvbikgZS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIXJjLmlzRmlsZXN5c3RlbU9ubHkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib25seSBmaWxlIHN5c3RlbSBiYXNlZCByZXNvdXJjZXMgYXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc3VwcG9ydGVkIGJ5IGphdmFkb2MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyYyBpbnN0YW5jZW9mIEZpbGVTZXQpIHsKKyAgICAgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIHJjOworICAgICAgICAgICAgICAgIGlmICghZnMuaGFzUGF0dGVybnMoKSAmJiAhZnMuaGFzU2VsZWN0b3JzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZVNldCBmczIgPSAoRmlsZVNldCkgZnMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgZnMyLmNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKCIqKi8qLmphdmEiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVOb1NvdXJjZVBhY2thZ2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmczIuY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUoIioqL3BhY2thZ2UuaHRtbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJjID0gZnMyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSByYy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgc2YuYWRkRWxlbWVudChuZXcgU291cmNlRmlsZSgoKEZpbGVSZXNvdXJjZSkgaXRlci5uZXh0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGRpcmVjdG9yaWVzIG1hdGNoZWQgYnkgdGhlIG5lc3RlZCBkaXJzZXRzIHRvIHRoZSBWZWN0b3IKKyAgICAgKiBhbmQgdGhlIGJhc2UgZGlyZWN0b3JpZXMgb2YgdGhlIGRpcnNldHMgdG8gdGhlIFBhdGguICBJdCBhbHNvCisgICAgICogaGFuZGxlcyB0aGUgcGFja2FnZXMgYW5kIGV4Y2x1ZGVwYWNrYWdlcyBhdHRyaWJ1dGVzIGFuZAorICAgICAqIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVBhY2thZ2VzKFZlY3RvciBwbiwgUGF0aCBzcCkgeworICAgICAgICBWZWN0b3IgYWRkZWRQYWNrYWdlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgVmVjdG9yIGRpclNldHMgPSAoVmVjdG9yKSBwYWNrYWdlU2V0cy5jbG9uZSgpOworCisgICAgICAgIC8vIGZvciBlYWNoIHNvdXJjZVBhdGggZW50cnksIGFkZCBhIGRpcmVjdG9yeXNldCB3aXRoIGluY2x1ZGVzCisgICAgICAgIC8vIHRha2VuIGZyb20gcGFja2FnZW5hbWVzIGF0dHJpYnV0ZSBhbmQgbmVzdGVkIHBhY2thZ2UKKyAgICAgICAgLy8gZWxlbWVudHMgYW5kIGV4Y2x1ZGVzIHRha2VuIGZyb20gZXhjbHVkZXBhY2thZ2VzIGF0dHJpYnV0ZQorICAgICAgICAvLyBhbmQgbmVzdGVkIGV4Y2x1ZGVwYWNrYWdlIGVsZW1lbnRzCisgICAgICAgIGlmIChzb3VyY2VQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIFBhdHRlcm5TZXQgcHMgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHBhY2thZ2VOYW1lcy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VOYW1lIHAgPSAoUGFja2FnZU5hbWUpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9IHAuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworICAgICAgICAgICAgICAgICAgICBpZiAocGtnLmVuZHNXaXRoKCIqIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrZyArPSAiKiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHMuY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUocGtnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBzLmNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKCIqKiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZXhjbHVkZVBhY2thZ2VOYW1lcy5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBQYWNrYWdlTmFtZSBwID0gKFBhY2thZ2VOYW1lKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9IHAuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworICAgICAgICAgICAgICAgIGlmIChwa2cuZW5kc1dpdGgoIioiKSkgeworICAgICAgICAgICAgICAgICAgICBwa2cgKz0gIioiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcy5jcmVhdGVFeGNsdWRlKCkuc2V0TmFtZShwa2cpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhFbGVtZW50cyA9IHNvdXJjZVBhdGgubGlzdCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKHBhdGhFbGVtZW50c1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIERpclNldCBkcyA9IG5ldyBEaXJTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgZHMuc2V0RGVmYXVsdGV4Y2x1ZGVzKHVzZURlZmF1bHRFeGNsdWRlcyk7CisgICAgICAgICAgICAgICAgICAgIGRzLnNldERpcihkaXIpOworICAgICAgICAgICAgICAgICAgICBkcy5jcmVhdGVQYXR0ZXJuU2V0KCkuYWRkQ29uZmlndXJlZFBhdHRlcm5zZXQocHMpOworICAgICAgICAgICAgICAgICAgICBkaXJTZXRzLmFkZEVsZW1lbnQoZHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiU2tpcHBpbmcgIiArIHBhdGhFbGVtZW50c1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNpbmNlIGl0IGlzIG5vIGRpcmVjdG9yeS4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFbnVtZXJhdGlvbiBlID0gZGlyU2V0cy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgRGlyU2V0IGRzID0gKERpclNldCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgRmlsZSBiYXNlRGlyID0gZHMuZ2V0RGlyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBsb2coInNjYW5uaW5nICIgKyBiYXNlRGlyICsgIiBmb3IgcGFja2FnZXMuIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkc2MgPSBkcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBTdHJpbmdbXSBkaXJzID0gZHNjLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNQYWNrYWdlcyA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gYXJlIHRoZXJlIGFueSBqYXZhIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5PworICAgICAgICAgICAgICAgIEZpbGUgcGQgPSBuZXcgRmlsZShiYXNlRGlyLCBkaXJzW2ldKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHBkLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyICgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpcjEsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoIi5qYXZhIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGluY2x1ZGVOb1NvdXJjZVBhY2thZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuYW1lLmVxdWFscygicGFja2FnZS5odG1sIikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgiIi5lcXVhbHMoZGlyc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhiYXNlRGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRhaW5zIHNvdXJjZSBmaWxlcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgeW91IG11c3Qgc3BlY2lmeSB0aGVtIGFzIHNvdXJjZSBmaWxlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IHBhY2thZ2VzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc1BhY2thZ2VzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyc1tpXS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRkZWRQYWNrYWdlcy5jb250YWlucyhwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZFBhY2thZ2VzLmFkZEVsZW1lbnQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuLmFkZEVsZW1lbnQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbnRhaW5zUGFja2FnZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGNhcmUgZm9yIGR1cGxpY2F0ZXMgaGVyZSwKKyAgICAgICAgICAgICAgICAvLyBQYXRoLmxpc3QgZG9lcyBpdCBmb3IgdXMuCisgICAgICAgICAgICAgICAgc3AuY3JlYXRlUGF0aEVsZW1lbnQoKS5zZXRMb2NhdGlvbihiYXNlRGlyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKGJhc2VEaXIgKyAiIGRvZXNuXCd0IGNvbnRhaW4gYW55IHBhY2thZ2VzLCBkcm9wcGluZyBpdC4iLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgSmF2YWRvY091dHB1dFN0cmVhbSBleHRlbmRzIExvZ091dHB1dFN0cmVhbSB7CisgICAgICAgIEphdmFkb2NPdXRwdXRTdHJlYW0oaW50IGxldmVsKSB7CisgICAgICAgICAgICBzdXBlcihKYXZhZG9jLnRoaXMsIGxldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIE92ZXJyaWRlIHRoZSBsb2dnaW5nIG9mIG91dHB1dCBpbiBvcmRlciB0byBmaWx0ZXIgb3V0IEdlbmVyYXRpbmcKKyAgICAgICAgLy8gbWVzc2FnZXMuICBHZW5lcmF0aW5nIG1lc3NhZ2VzIGFyZSBzZXQgdG8gYSBwcmlvcml0eSBvZiBWRVJCT1NFCisgICAgICAgIC8vIHVubGVzcyB0aGV5IGFwcGVhciBhZnRlciB3aGF0IGNvdWxkIGJlIGFuIGluZm9ybWF0aW9uYWwgbWVzc2FnZS4KKyAgICAgICAgLy8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcXVldWVkTGluZSA9IG51bGw7CisgICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NMaW5lKFN0cmluZyBsaW5lLCBpbnQgbWVzc2FnZUxldmVsKSB7CisgICAgICAgICAgICBpZiAobWVzc2FnZUxldmVsID09IFByb2plY3QuTVNHX0lORk8KKyAgICAgICAgICAgICAgICAmJiBsaW5lLnN0YXJ0c1dpdGgoIkdlbmVyYXRpbmcgIikpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVldWVkTGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLnByb2Nlc3NMaW5lKHF1ZXVlZExpbmUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBxdWV1ZWRMaW5lID0gbGluZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlZExpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJCdWlsZGluZyAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIucHJvY2Vzc0xpbmUocXVldWVkTGluZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5wcm9jZXNzTGluZShxdWV1ZWRMaW5lLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBxdWV1ZWRMaW5lID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VwZXIucHJvY2Vzc0xpbmUobGluZSwgbWVzc2FnZUxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgbG9nRmx1c2goKSB7CisgICAgICAgICAgICBpZiAocXVldWVkTGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3VwZXIucHJvY2Vzc0xpbmUocXVldWVkTGluZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgcXVldWVkTGluZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZXhwYW5kIHByb3BlcnRpZXMuCisgICAgICogQHBhcmFtIGNvbnRlbnQgdGhlIHN0cmluZyB0byBleHBhbmQKKyAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBleHBhbmQoU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcyhjb250ZW50KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ppa2VzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KaWtlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NmQ2MWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KaWtlcy5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogRW5jYXBzdWxhdGVzIGEgSmlrZXMgY29tcGlsZXIsIGJ5IGRpcmVjdGx5IGV4ZWN1dGluZyBhbiBleHRlcm5hbAorICogcHJvY2Vzcy4KKyAqCisgKiA8cD48c3Ryb25nPkFzIG9mIEFudCAxLjIsIHRoaXMgY2xhc3MgaXMgY29uc2lkZXJlZCB0byBiZSBkZWFkIGNvZGUKKyAqIGJ5IHRoZSBBbnQgZGV2ZWxvcGVycyBhbmQgaXMgdW5tYWludGFpbmVkLiAgRG9uJ3QgdXNlCisgKiBpdC48L3N0cm9uZz48L3A+CisgKgorICogQGRlcHJlY2F0ZWQgc2luY2UgMS4yLgorICogICAgICAgICAgICAgTWVyZ2VkIGludG8gdGhlIGNsYXNzIEphdmFjLgorICovCitwdWJsaWMgY2xhc3MgSmlrZXMgeworICAgIC8vIFRoZXJlIGhhdmUgYmVlbiByZXBvcnRzIHRoYXQgMzAwIGZpbGVzIGNvdWxkIGJlIGNvbXBpbGVkCisgICAgLy8gb24gYSBjb21tYW5kIGxpbmUgc28gMjUwIGlzIGEgY29uc2VydmF0aXZlIGFwcHJvYWNoCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9GSUxFU19PTl9DT01NQU5EX0xJTkUgPSAyNTA7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICBwcm90ZWN0ZWQgSmlrZXNPdXRwdXRQYXJzZXIgam9wOworICAgIHByb3RlY3RlZCBTdHJpbmcgY29tbWFuZDsKKyAgICBwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0OworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEppa2VzIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gam9wICAgICAgUGFyc2VyIHRvIHNlbmQgamlrZSdzIG91dHB1dCB0bworICAgICAqIEBwYXJhbSBjb21tYW5kICBuYW1lIG9mIGppa2VzIGV4ZWN1dGFibGUKKyAgICAgKiBAcGFyYW0gcHJvamVjdCAgdGhlIGN1cnJlbnQgcHJvamVjdAorICAgICAqLworICAgIHByb3RlY3RlZCBKaWtlcyhKaWtlc091dHB1dFBhcnNlciBqb3AsIFN0cmluZyBjb21tYW5kLCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgc3VwZXIoKTsKKworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkFzIG9mIEFudCAxLjIgcmVsZWFzZWQgaW4gT2N0b2JlciAyMDAwLCAiCisgICAgICAgICAgICArICJ0aGUgSmlrZXMgY2xhc3MiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpcyBjb25zaWRlcmVkIHRvIGJlIGRlYWQgY29kZSBieSB0aGUgQW50ICIKKyAgICAgICAgICAgICsgImRldmVsb3BlcnMgYW5kIGlzIHVubWFpbnRhaW5lZC4iKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEb25cJ3QgdXNlIGl0ISIpOworCisgICAgICAgIHRoaXMuam9wID0gam9wOworICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHRoZSBjb21waWxlIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCisgICAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgdG8gcGFzcyB0byBwcm9jZXNzIG9uIGNvbW1hbmQgbGluZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNvbXBpbGUoU3RyaW5nW10gYXJncykgeworICAgICAgICBTdHJpbmdbXSBjb21tYW5kQXJyYXkgPSBudWxsOworICAgICAgICBGaWxlIHRtcEZpbGUgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgbXlvcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOworCisgICAgICAgICAgICAvLyBXaW5kb3dzIGhhcyBhIDMyayBsaW1pdCBvbiB0b3RhbCBhcmcgc2l6ZSwgc28KKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHRvIHN0b3JlIGFsbCB0aGUgYXJndW1lbnRzCisKKyAgICAgICAgICAgIGlmIChteW9zLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigid2luZG93cyIpID49IDAKKyAgICAgICAgICAgICAgICAmJiBhcmdzLmxlbmd0aCA+IE1BWF9GSUxFU19PTl9DT01NQU5EX0xJTkUpIHsKKyAgICAgICAgICAgICAgICBQcmludFdyaXRlciBvdXQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wRmlsZU5hbWUgPSAiamlrZXMiCisgICAgICAgICAgICAgICAgICAgICAgICArIChuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkubmV4dExvbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wRmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcih0bXBGaWxlKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRBcnJheSA9IG5ldyBTdHJpbmdbXSB7Y29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkAiICsgdG1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX07CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tbWFuZEFycmF5ID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgICAgIGNvbW1hbmRBcnJheVswXSA9IGNvbW1hbmQ7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBjb21tYW5kQXJyYXksIDEsIGFyZ3MubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UgYXNzdW1lLCB0aGF0IGV2ZXJ5dGhpbmcgamlrZXMgd3JpdGVzIGdvZXMgdG8KKyAgICAgICAgICAgIC8vIHN0YW5kYXJkIG91dHB1dCwgbm90IHRvIHN0YW5kYXJkIGVycm9yLiBUaGUgb3B0aW9uCisgICAgICAgICAgICAvLyAtWHN0ZG91dCB0aGF0IGlzIGdpdmVuIHRvIEppa2VzIGluIEphdmFjLmRvSmlrZXNDb21waWxlKCkKKyAgICAgICAgICAgIC8vIHNob3VsZCBndWFyYW50ZWUgdGhpcy4gQXQgbGVhc3QgSSBob3BlIHNvLiA6KQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKGpvcCk7CisgICAgICAgICAgICAgICAgZXhlLnNldEFudFJ1bihwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeShwcm9qZWN0LmdldEJhc2VEaXIoKSk7CisgICAgICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNvbW1hbmRBcnJheSk7CisgICAgICAgICAgICAgICAgZXhlLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHJ1bm5pbmcgSmlrZXMgY29tcGlsZXIiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh0bXBGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmlrZXNPdXRwdXRQYXJzZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ppa2VzT3V0cHV0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5NGJmZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ppa2VzT3V0cHV0UGFyc2VyLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworLyoqCisgKiBQYXJzZXMgb3V0cHV0IGZyb20gamlrZXMgYW5kCisgKiBwYXNzZXMgZXJyb3JzIGFuZCB3YXJuaW5ncworICogaW50byB0aGUgcmlnaHQgbG9nZ2luZyBjaGFubmVscyBvZiBQcm9qZWN0LgorICoKKyAqIDxwPjxzdHJvbmc+QXMgb2YgQW50IDEuMiwgdGhpcyBjbGFzcyBpcyBjb25zaWRlcmVkIHRvIGJlIGRlYWQgY29kZQorICogYnkgdGhlIEFudCBkZXZlbG9wZXJzIGFuZCBpcyB1bm1haW50YWluZWQuICBEb24ndCB1c2UKKyAqIGl0Ljwvc3Ryb25nPjwvcD4KKyAqCisgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjIuCisgKiAgICAgICAgICAgICBVc2UgSmlrZXMnIGV4aXQgdmFsdWUgdG8gZGV0ZWN0IGNvbXBpbGF0aW9uIGZhaWx1cmUuCisgKi8KK3B1YmxpYyBjbGFzcyBKaWtlc091dHB1dFBhcnNlciBpbXBsZW1lbnRzIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBUYXNrIHRhc2s7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3JGbGFnID0gZmFsc2U7IC8vIG5vIGVycm9ycyBzbyBmYXIKKyAgICBwcm90ZWN0ZWQgaW50IGVycm9yczsKKyAgICBwcm90ZWN0ZWQgaW50IHdhcm5pbmdzOworICAgIHByb3RlY3RlZCBib29sZWFuIGVycm9yID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZW1hY3NNb2RlOworCisgICAgcHJvdGVjdGVkIEJ1ZmZlcmVkUmVhZGVyIGJyOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBJZ25vcmUuCisgICAgICogQHBhcmFtIG9zIGlnbm9yZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzSW5wdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3JlLgorICAgICAqIEBwYXJhbSBpcyBpZ25vcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKElucHV0U3RyZWFtIGlzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnB1dHN0cmVhbQorICAgICAqIEBwYXJhbSBpcyB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NPdXRwdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgcGFyc2VPdXRwdXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2VPdXRwdXQoYnIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQYXJzZXIgb2JqZWN0CisgICAgICogQHBhcmFtIHRhc2sgICAgICB0YXNrIGluIHdoaWNoIGNvbnRleHQgd2UgYXJlIGNhbGxlZAorICAgICAqIEBwYXJhbSBlbWFjc01vZGUgaWYgdHJ1ZSBvdXRwdXQgaW4gZW1hY3MgbW9kZQorICAgICAqLworICAgIHByb3RlY3RlZCBKaWtlc091dHB1dFBhcnNlcihUYXNrIHRhc2ssIGJvb2xlYW4gZW1hY3NNb2RlKSB7CisgICAgICAgIHN1cGVyKCk7CisKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJBcyBvZiBBbnQgMS4yIHJlbGVhc2VkIGluIE9jdG9iZXIgMjAwMCwgdGhlICIKKyAgICAgICAgICAgICsgIkppa2VzT3V0cHV0UGFyc2VyIGNsYXNzIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaXMgY29uc2lkZXJlZCB0byBiZSBkZWFkIGNvZGUgYnkgdGhlIEFudCAiCisgICAgICAgICAgICArICJkZXZlbG9wZXJzIGFuZCBpcyB1bm1haW50YWluZWQuIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRG9uXCd0IHVzZSBpdCEiKTsKKworICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgICAgICB0aGlzLmVtYWNzTW9kZSA9IGVtYWNzTW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgb3V0cHV0IG9mIGEgamlrZXMgY29tcGlsZXIKKyAgICAgKiBAcGFyYW0gcmVhZGVyIC0gUmVhZGVyIHVzZWQgdG8gcmVhZCBqaWtlcydzIG91dHB1dAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZU91dHB1dChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgaWYgKGVtYWNzTW9kZSkgeworICAgICAgICAgICBwYXJzZUVtYWNzT3V0cHV0KHJlYWRlcik7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgcGFyc2VTdGFuZGFyZE91dHB1dChyZWFkZXIpOworICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VTdGFuZGFyZE91dHB1dChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICBTdHJpbmcgbG93ZXI7CisgICAgICAgIC8vIFdlIGFzc3VtZSwgdGhhdCBldmVyeSBvdXRwdXQsIGppa2VzIGRvZXMsIHN0YW5kcyBmb3IgYW4gZXJyb3Ivd2FybmluZworICAgICAgICAvLyBYWFgKKyAgICAgICAgLy8gSXMgdGhpcyBjb3JyZWN0PworCisgICAgICAgIC8vIFRPRE86CisgICAgICAgIC8vIEEgd2FybmluZyBsaW5lLCB0aGF0IHNob3dzIGNvZGUsIHdoaWNoIGNvbnRhaW5zIGEgdmFyaWFibGUKKyAgICAgICAgLy8gZXJyb3Igd2lsbCBjYXVzZSBzb21lIHRyb3VibGUuIFRoZSBwYXJzZXIgc2hvdWxkIGRlZmluaXRlbHkKKyAgICAgICAgLy8gYmUgbXVjaCBiZXR0ZXIuCisKKyAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvd2VyID0gbGluZS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgaWYgKGxpbmUudHJpbSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb3dlci5pbmRleE9mKCJlcnJvciIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc2V0RXJyb3IodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxvd2VyLmluZGV4T2YoIndhcm5pbmciKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHNldEVycm9yKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgdGhlIHR5cGUgb2YgdGhlIGxpbmUKKyAgICAgICAgICAgICAgICAvLyBhbmQgd2UgYXJlIGluIGVtYWNzIG1vZGUsIGl0IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAvLyBhbiBlcnJvciwgYmVjYXVzZSBpbiB0aGlzIG1vZGUsIGppa2VzIHdvbid0CisgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHByaW50ICJlcnJvciIsIGJ1dCBzb21ldGltZXMgb3RoZXIKKyAgICAgICAgICAgICAgICAvLyBrZXl3b3JkcyBsaWtlICJTeW50YXgiLiBXZSBzaG91bGQgbG9vayBmb3IKKyAgICAgICAgICAgICAgICAvLyBhbGwgdGhvc2Uga2V5d29yZHMuCisgICAgICAgICAgICAgICAgaWYgKGVtYWNzTW9kZSkgeworICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcih0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cobGluZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFbWFjc091dHB1dChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgLy8gVGhpcyBtYXkgY2hhbmdlLCBpZiB3ZSBhZGQgYWR2YW5jZWQgcGFyc2luZyBjYXBhYmlsaXRpZXMuCisgICAgICAgcGFyc2VTdGFuZGFyZE91dHB1dChyZWFkZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRFcnJvcihib29sZWFuIGVycikgeworICAgICAgICBlcnJvciA9IGVycjsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBlcnJvckZsYWcgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbGluZSkgeworICAgICAgIGlmICghZW1hY3NNb2RlKSB7CisgICAgICAgICAgIHRhc2subG9nKCIiLCAoZXJyb3IgPyBQcm9qZWN0Lk1TR19FUlIgOiBQcm9qZWN0Lk1TR19XQVJOKSk7CisgICAgICAgfQorICAgICAgIHRhc2subG9nKGxpbmUsIChlcnJvciA/IFByb2plY3QuTVNHX0VSUiA6IFByb2plY3QuTVNHX1dBUk4pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSBpZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhlIGNvbXBpbGUKKyAgICAgKiBAcmV0dXJuIGlmIGVycm9ycyBvY2N1cnJlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGdldEVycm9yRmxhZygpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yRmxhZzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9LZXlTdWJzdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvS2V5U3Vic3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YzZGJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvS2V5U3Vic3QuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogS2V5d29yZCBzdWJzdGl0dXRpb24uIElucHV0IGZpbGUgaXMgd3JpdHRlbiB0byBvdXRwdXQgZmlsZS4KKyAqIERvIG5vdCBtYWtlIGlucHV0IGZpbGUgc2FtZSBhcyBvdXRwdXQgZmlsZS4KKyAqIEtleXdvcmRzIGluIGlucHV0IGZpbGVzIGxvb2sgbGlrZSB0aGlzOiBAZm9vQC4gU2VlIHRoZSBkb2NzIGZvciB0aGUKKyAqIHNldEtleXMgbWV0aG9kIHRvIHVuZGVyc3RhbmQgaG93IHRvIGRvIHRoZSBzdWJzdGl0dXRpb25zLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKiBAZGVwcmVjYXRlZCBLZXlTdWJzdCBpcyBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjEuIFVzZSBGaWx0ZXIgKyBDb3B5CisgKiBpbnN0ZWFkLgorICovCitwdWJsaWMgY2xhc3MgS2V5U3Vic3QgZXh0ZW5kcyBUYXNrIHsKKyAgICBwcml2YXRlIEZpbGUgc291cmNlID0gbnVsbDsKKyAgICBwcml2YXRlIEZpbGUgZGVzdCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VwID0gIioiOworICAgIHByaXZhdGUgSGFzaHRhYmxlIHJlcGxhY2VtZW50cyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIERvIHRoZSBleGVjdXRpb24uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBsb2coIiEhIEtleVN1YnN0IGlzIGRlcHJlY2F0ZWQuIFVzZSBGaWx0ZXIgKyBDb3B5IGluc3RlYWQuICEhIik7CisgICAgICAgIGxvZygiUGVyZm9ybWluZyBTdWJzdGl0dXRpb25zIik7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCBkZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiU291cmNlIGFuZCBkZXN0aW5hdGlvbnMgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRXcml0ZXIgYncgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoc291cmNlKSk7CisgICAgICAgICAgICBkZXN0LmRlbGV0ZSgpOworICAgICAgICAgICAgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZGVzdCkpOworCisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgbmV3bGluZSA9IG51bGw7CisgICAgICAgICAgICBsaW5lID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ3Lm5ld0xpbmUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZXdsaW5lID0gS2V5U3Vic3QucmVwbGFjZShsaW5lLCByZXBsYWNlbWVudHMpOworICAgICAgICAgICAgICAgICAgICBidy53cml0ZShuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgYncubmV3TGluZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ3LmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGJ3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBidy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBici5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgKiBAcGFyYW0gcyB0aGUgc291cmNlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzKSB7CisgICAgICAgIHRoaXMuc291cmNlID0gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0KEZpbGUgZGVzdCkgeworICAgICAgICB0aGlzLmRlc3QgPSBkZXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIG5hbWU9dmFsdWUgYXJndW1lbnRzCisgICAgICogaW4gc2V0S2V5cygpLiBCeSBkZWZhdWx0IGl0IGlzICIqIi4KKyAgICAgKiBAcGFyYW0gc2VwIHRoZSBzZXBhcmF0b3Igc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VwKFN0cmluZyBzZXApIHsKKyAgICAgICAgdGhpcy5zZXAgPSBzZXA7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGtleXMuCisgICAgICoKKyAgICAgKiBGb3JtYXQgc3RyaW5nIGlzIGxpa2UgdGhpczoKKyAgICAgKiAgIDxwPgorICAgICAqICAgbmFtZT12YWx1ZSpuYW1lMj12YWx1ZQorICAgICAqICAgPHA+CisgICAgICogICBOYW1lcyBhcmUgY2FzZSBzZW5zaXRpdmUuCisgICAgICogICA8cD4KKyAgICAgKiAgIFVzZSB0aGUgc2V0U2VwKCkgbWV0aG9kIHRvIGNoYW5nZSB0aGUgKiB0byBzb21ldGhpbmcgZWxzZQorICAgICAqICAgaWYgeW91IG5lZWQgdG8gdXNlICogYXMgYSBuYW1lIG9yIHZhbHVlLgorICAgICAqIEBwYXJhbSBrZXlzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleXMoU3RyaW5nIGtleXMpIHsKKyAgICAgICAgaWYgKGtleXMgIT0gbnVsbCAmJiBrZXlzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9CisgICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGtleXMsIHRoaXMuc2VwLCBmYWxzZSk7CisgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRvay5uZXh0VG9rZW4oKS50cmltKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIGl0b2sgPQorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIodG9rZW4sICI9IiwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGl0b2submV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgdGVzdCBtZXRob2QuCisgICAgICogQHBhcmFtIGFyZ3Mgbm90IHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIYXNodGFibGUgaGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgIGhhc2gucHV0KCJWRVJTSU9OIiwgIjEuMC4zIik7CisgICAgICAgICAgICBoYXNoLnB1dCgiYiIsICJmZmZmIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oS2V5U3Vic3QucmVwbGFjZSgiJGYgJHtWRVJTSU9OfSBmICR7Yn0gamogJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyByZXBsYWNlbWVudCBvbiB0ZXh0IHVzaW5nIHRoZSBoYXNodGFibGUgb2Yga2V5cy4KKyAgICAgKiBAcGFyYW0gb3JpZ1N0cmluZyBhbiBpbnB1dCBzdHJpbmcKKyAgICAgKiBAcGFyYW0ga2V5cyAgICAgICBtYXBwaW5nIG9mIGtleXMgdG8gdmFsdWVzCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGggdGhlIHJlcGxhY2VtZW50cyBpbiBpdC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgb3JpZ1N0cmluZywgSGFzaHRhYmxlIGtleXMpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBmaW5hbFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBTdHJpbmcga2V5ID0gbnVsbDsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgd2hpbGUgKChpbmRleCA9IG9yaWdTdHJpbmcuaW5kZXhPZigiJHsiLCBpKSkgPiAtMSkgeworICAgICAgICAgICAga2V5ID0gb3JpZ1N0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAyLCBvcmlnU3RyaW5nLmluZGV4T2YoIn0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKyAzKSk7CisgICAgICAgICAgICBmaW5hbFN0cmluZy5hcHBlbmQgKG9yaWdTdHJpbmcuc3Vic3RyaW5nKGksIGluZGV4KSk7CisgICAgICAgICAgICBpZiAoa2V5cy5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgZmluYWxTdHJpbmcuYXBwZW5kIChrZXlzLmdldChrZXkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWxTdHJpbmcuYXBwZW5kICgiJHsiKTsKKyAgICAgICAgICAgICAgICBmaW5hbFN0cmluZy5hcHBlbmQgKGtleSk7CisgICAgICAgICAgICAgICAgZmluYWxTdHJpbmcuYXBwZW5kICgifSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IGluZGV4ICsgMyArIGtleS5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisgICAgICAgIGZpbmFsU3RyaW5nLmFwcGVuZCAob3JpZ1N0cmluZy5zdWJzdHJpbmcoaSkpOworICAgICAgICByZXR1cm4gZmluYWxTdHJpbmcudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9MZW5ndGguamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xlbmd0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3YWJkYTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9MZW5ndGguamF2YQpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Db25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21wYXJpc29uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlByb3BlcnR5T3V0cHV0U3RyZWFtOworCisvKioKKyAqIEdldHMgbGVuZ3RoczogIG9mIGZpbGVzL3Jlc291cmNlcywgYnl0ZSBzaXplOyBvZiBzdHJpbmdzLCBsZW5ndGggKG9wdGlvbmFsbHkgdHJpbW1lZCkuCisgKiBUaGUgdGFzayBpcyBvdmVybG9hZGVkIGluIHRoaXMgd2F5IGZvciBzZW1hbnRpYyByZWFzb25zLCBtdWNoIGxpa2UgQXZhaWxhYmxlLgorICogQHNpbmNlIEFudCAxLjYuMworICovCitwdWJsaWMgY2xhc3MgTGVuZ3RoIGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gImFsbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVBQ0ggPSAiZWFjaCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklORyA9ICJzdHJpbmciOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFTkdUSF9SRVFVSVJFRAorICAgICAgICA9ICJVc2Ugb2YgdGhlIExlbmd0aCBjb25kaXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgbGVuZ3RoIGF0dHJpYnV0ZSBiZSBzZXQuIjsKKworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OworICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZzsKKyAgICBwcml2YXRlIEJvb2xlYW4gdHJpbTsKKyAgICBwcml2YXRlIFN0cmluZyBtb2RlID0gQUxMOworICAgIHByaXZhdGUgQ29tcGFyaXNvbiB3aGVuID0gQ29tcGFyaXNvbi5FUVVBTDsKKyAgICBwcml2YXRlIExvbmcgbGVuZ3RoOworICAgIHByaXZhdGUgUmVzb3VyY2VzIHJlc291cmNlczsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgbGVuZ3RoIHdpbGwgYmUgc3RvcmVkLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBwcm9wZXJ0eSBrZXkuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzaW5nbGUgZmlsZSBmb3IgdGhpcyB0YXNrLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSA8Y29kZT5GaWxlPC9jb2RlPiB3aG9zZSBsZW5ndGggdG8gcmV0cmlldmUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIGFkZChuZXcgRmlsZVJlc291cmNlKGZpbGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBGaWxlU2V0LgorICAgICAqIEBwYXJhbSBmcyB0aGUgPGNvZGU+RmlsZVNldDwvY29kZT4gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoRmlsZVNldCBmcykgeworICAgICAgICBhZGQoKFJlc291cmNlQ29sbGVjdGlvbikgZnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYyB0aGUgPGNvZGU+UmVzb3VyY2VDb2xsZWN0aW9uPC9jb2RlPiB0byBhZGQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKFJlc291cmNlQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZXMgPSAocmVzb3VyY2VzID09IG51bGwpID8gbmV3IFJlc291cmNlcygpIDogcmVzb3VyY2VzOworICAgICAgICByZXNvdXJjZXMuYWRkKGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGFyZ2V0IGNvdW50IG51bWJlciBmb3IgdXNlIGFzIGEgQ29uZGl0aW9uLgorICAgICAqIEBwYXJhbSBlbGwgdGhlIGxvbmcgbGVuZ3RoIHRvIGNvbXBhcmUgd2l0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TGVuZ3RoKGxvbmcgZWxsKSB7CisgICAgICAgIGxlbmd0aCA9IG5ldyBMb25nKGVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21wYXJpc29uIGZvciB1c2UgYXMgYSBDb25kaXRpb24uCisgICAgICogQHBhcmFtIHcgRW51bWVyYXRlZEF0dHJpYnV0ZSBXaGVuLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tcGFyaXNvbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRXaGVuKFdoZW4gdykgeworICAgICAgICBzZXRXaGVuKChDb21wYXJpc29uKSB3KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbXBhcmlzb24gZm9yIHVzZSBhcyBhIENvbmRpdGlvbi4KKyAgICAgKiBAcGFyYW0gYyBDb21wYXJpc29uLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tcGFyaXNvbgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFdoZW4oQ29tcGFyaXNvbiBjKSB7CisgICAgICAgIHdoZW4gPSBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXhlY3V0aW9uIG1vZGUgZm9yIHdvcmtpbmcgd2l0aCBmaWxlcy4KKyAgICAgKiBAcGFyYW0gbSB0aGUgPGNvZGU+RmlsZU1vZGU8L2NvZGU+IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TW9kZShGaWxlTW9kZSBtKSB7CisgICAgICAgIHRoaXMubW9kZSA9IG0uZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0cmluZyB3aG9zZSBsZW5ndGggdG8gZ2V0LgorICAgICAqIEBwYXJhbSBzdHJpbmcgPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgICAgICAgIHRoaXMubW9kZSA9IFNUUklORzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byB0cmltIGluIHN0cmluZyBtb2RlLgorICAgICAqIEBwYXJhbSB0cmltIDxjb2RlPmJvb2xlYW48L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUcmltKGJvb2xlYW4gdHJpbSkgeworICAgICAgICB0aGlzLnRyaW0gPSB0cmltID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWFybiB3aGV0aGVyIHN0cmluZ3Mgd2lsbCBiZSB0cmltbWVkLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cmltIHNldHRpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJpbSgpIHsKKyAgICAgICAgcmV0dXJuIHRyaW0gIT0gbnVsbCAmJiB0cmltLmJvb2xlYW5WYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIGxlbmd0aCB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKChwcm9wZXJ0eSAhPSBudWxsKQorICAgICAgICAgICAgPyAoT3V0cHV0U3RyZWFtKSBuZXcgUHJvcGVydHlPdXRwdXRTdHJlYW0oZ2V0UHJvamVjdCgpLCBwcm9wZXJ0eSkKKyAgICAgICAgICAgIDogKE91dHB1dFN0cmVhbSkgbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19JTkZPKSk7CisKKyAgICAgICAgaWYgKFNUUklORy5lcXVhbHMobW9kZSkpIHsKKyAgICAgICAgICAgIHBzLnByaW50KGdldExlbmd0aChzdHJpbmcsIGdldFRyaW0oKSkpOworICAgICAgICAgICAgcHMuY2xvc2UoKTsKKyAgICAgICAgfSBlbHNlIGlmIChFQUNILmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgaGFuZGxlUmVzb3VyY2VzKG5ldyBFYWNoSGFuZGxlcihwcykpOworICAgICAgICB9IGVsc2UgaWYgKEFMTC5lcXVhbHMobW9kZSkpIHsKKyAgICAgICAgICAgIGhhbmRsZVJlc291cmNlcyhuZXcgQWxsSGFuZGxlcihwcykpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsZmlsbCB0aGUgY29uZGl0aW9uIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oTEVOR1RIX1JFUVVJUkVEKTsKKyAgICAgICAgfQorICAgICAgICBMb25nIGVsbDsKKyAgICAgICAgaWYgKFNUUklORy5lcXVhbHMobW9kZSkpIHsKKyAgICAgICAgICAgIGVsbCA9IG5ldyBMb25nKGdldExlbmd0aChzdHJpbmcsIGdldFRyaW0oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQWNjdW1IYW5kbGVyIGggPSBuZXcgQWNjdW1IYW5kbGVyKCk7CisgICAgICAgICAgICBoYW5kbGVSZXNvdXJjZXMoaCk7CisgICAgICAgICAgICBlbGwgPSBuZXcgTG9uZyhoLmdldEFjY3VtKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aGVuLmV2YWx1YXRlKGVsbC5jb21wYXJlVG8obGVuZ3RoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgICBpZiAoc3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIHN0cmluZyBsZW5ndGggZnVuY3Rpb24iCisgICAgICAgICAgICAgICAgICAgICsgIiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZmlsZS9yZXNvdXJjZSBsZW5ndGggZnVuY3Rpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKFNUUklORy5lcXVhbHMobW9kZSkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0aGUgbW9kZSBhdHRyaWJ1dGUgaXMgZm9yIHVzZSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggdGhlIGZpbGUvcmVzb3VyY2UgbGVuZ3RoIGZ1bmN0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghKEVBQ0guZXF1YWxzKG1vZGUpIHx8IEFMTC5lcXVhbHMobW9kZSkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbnZhbGlkIG1vZGUgc2V0dGluZyBmb3IiCisgICAgICAgICAgICAgICAgICAgICsgIiBmaWxlL3Jlc291cmNlIGxlbmd0aCBmdW5jdGlvbjogXCIiICsgbW9kZSArICJcIiIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0cmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSB0cmltIGF0dHJpYnV0ZSBpcyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGZvciB1c2Ugd2l0aCB0aGUgc3RyaW5nIGxlbmd0aCBmdW5jdGlvbiBvbmx5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInlvdSBtdXN0IHNldCBlaXRoZXIgdGhlIHN0cmluZyBhdHRyaWJ1dGUiCisgICAgICAgICAgICAgICAgKyAiIG9yIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgdXNpbmcgdGhlIGZpbGUgYXR0cmlidXRlIG9yIgorICAgICAgICAgICAgICAgICsgIiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXNvdXJjZXMoSGFuZGxlciBoKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFJlc291cmNlIHIgPSAoUmVzb3VyY2UpIGkubmV4dCgpOworICAgICAgICAgICAgaWYgKCFyLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cociArICIgZG9lcyBub3QgZXhpc3QiLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBsb2cociArICIgaXMgYSBkaXJlY3Rvcnk7IGxlbmd0aCB1bnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGguaGFuZGxlKHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGguY29tcGxldGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldExlbmd0aChTdHJpbmcgcywgYm9vbGVhbiB0KSB7CisgICAgICAgIHJldHVybiAodCA/IHMudHJpbSgpIDogcykubGVuZ3RoKCk7CisgICAgfQorCisgICAgLyoqIEVudW1lcmF0ZWRBdHRyaWJ1dGUgb3BlcmF0aW9uIG1vZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVNb2RlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNT0RFUyA9IG5ldyBTdHJpbmdbXSB7RUFDSCwgQUxMfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIEZpbGVNb2RlLgorICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPlN0cmluZ1tdPC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gTU9ERVM7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZWRBdHRyaWJ1dGUgZm9yIHRoZSB3aGVuIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdoZW4gZXh0ZW5kcyBDb21wYXJpc29uIHsKKyAgICAgICAgLy9leHRlbmQgQ29tcGFyaXNvbjsgcmV0YWluIGZvciBCQyBvbmx5CisgICAgfQorCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBIYW5kbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBwczsKKyAgICAgICAgSGFuZGxlcihQcmludFN0cmVhbSBwcykgeworICAgICAgICAgICAgdGhpcy5wcyA9IHBzOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFByaW50U3RyZWFtIGdldFBzKCkgeworICAgICAgICAgICAgcmV0dXJuIHBzOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlKFJlc291cmNlIHIpOworCisgICAgICAgIHZvaWQgY29tcGxldGUoKSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UocHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFYWNoSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBFYWNoSGFuZGxlcihQcmludFN0cmVhbSBwcykgeworICAgICAgICAgICAgc3VwZXIocHMpOworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZShSZXNvdXJjZSByKSB7CisgICAgICAgICAgICBnZXRQcygpLnByaW50KHIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBnZXRQcygpLnByaW50KCIgOiAiKTsKKyAgICAgICAgICAgIC8vd2hlbiB3cml0aW5nIHRvIHRoZSBsb2csIHdlJ2xsIHNlZSB3aGF0J3MgaGFwcGVuaW5nOgorICAgICAgICAgICAgbG9uZyBzaXplID0gci5nZXRTaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSBSZXNvdXJjZS5VTktOT1dOX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBnZXRQcygpLnByaW50bG4oInVua25vd24iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2V0UHMoKS5wcmludGxuKHNpemUpOworICAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEFjY3VtSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwcml2YXRlIGxvbmcgYWNjdW0gPSAwTDsKKworICAgICAgICBBY2N1bUhhbmRsZXIoKSB7CisgICAgICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgQWNjdW1IYW5kbGVyKFByaW50U3RyZWFtIHBzKSB7CisgICAgICAgICAgICBzdXBlcihwcyk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgZ2V0QWNjdW0oKSB7CisgICAgICAgICAgICByZXR1cm4gYWNjdW07CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZShSZXNvdXJjZSByKSB7CisgICAgICAgICAgICBsb25nIHNpemUgPSByLmdldFNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IFJlc291cmNlLlVOS05PV05fU0laRSkgeworICAgICAgICAgICAgICAgIGxvZygiU2l6ZSB1bmtub3duIGZvciAiICsgci50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWNjdW0gKz0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQWxsSGFuZGxlciBleHRlbmRzIEFjY3VtSGFuZGxlciB7CisgICAgICAgIEFsbEhhbmRsZXIoUHJpbnRTdHJlYW0gcHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHBzKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNvbXBsZXRlKCkgeworICAgICAgICAgICAgZ2V0UHMoKS5wcmludChnZXRBY2N1bSgpKTsKKyAgICAgICAgICAgIHN1cGVyLmNvbXBsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRGaWxlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNWJjYTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkRmlsZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKKworCisvKioKKyAqIExvYWQgYSBmaWxlIGludG8gYSBwcm9wZXJ0eQorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InV0aWxpdHkiCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkRmlsZSBleHRlbmRzIExvYWRSZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmaWxlIHRvIGxvYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjRmlsZSBUaGUgbmV3IFNyY0ZpbGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTcmNGaWxlKGZpbmFsIEZpbGUgc3JjRmlsZSkgeworICAgICAgICBhZGRDb25maWd1cmVkKG5ldyBGaWxlUmVzb3VyY2Uoc3JjRmlsZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRQcm9wZXJ0aWVzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDk4YjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLnV0aWwuQ2hhaW5SZWFkZXJIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlckNoYWluOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkphdmFSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBMb2FkIGEgZmlsZSdzIGNvbnRlbnRzIGFzIEFudCBwcm9wZXJ0aWVzLgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InV0aWxpdHkiCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkUHJvcGVydGllcyBleHRlbmRzIFRhc2sgeworCisgICAgLyoqCisgICAgICogU291cmNlIHJlc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgUmVzb3VyY2Ugc3JjID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEhvbGRzIGZpbHRlcmNoYWlucworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVmVjdG9yIGZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIEVuY29kaW5nIHRvIHVzZSBmb3IgaW5wdXQ7IGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmaWxlIHRvIGxvYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjRmlsZSBUaGUgbmV3IFNyY0ZpbGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTcmNGaWxlKGZpbmFsIEZpbGUgc3JjRmlsZSkgeworICAgICAgICBhZGRDb25maWd1cmVkKG5ldyBGaWxlUmVzb3VyY2Uoc3JjRmlsZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzb3VyY2UgbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgdG8gbG9hZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBvbiBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgZ2V0UmVxdWlyZWRKYXZhUmVzb3VyY2UoKS5zZXROYW1lKHJlc291cmNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZyB0byB1c2UgZm9yIGlucHV0LCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0CisgICAgICogZW5jb2RpbmcuIDxwPgorICAgICAqCisgICAgICogRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlCisgICAgICogPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+CisgICAgICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbAorICAgICAqIDwvYT4uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBuZXcgRW5jb2RpbmcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRFbmNvZGluZyhmaW5hbCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIHRvIGFkZCB0byBhbnkgZXhpc3RpbmcgY2xhc3NwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGdldFJlcXVpcmVkSmF2YVJlc291cmNlKCkuc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBjbGFzc3BhdGggdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlcXVpcmVkSmF2YVJlc291cmNlKCkuY3JlYXRlQ2xhc3NwYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLAorICAgICAqIGdpdmVuIGFzIHJlZmVyZW5jZSB0byBhICZsdDtwYXRoJmd0OyBkZWZpbmVkIGVsc2V3aGVyZQorICAgICAqIEBwYXJhbSByIFRoZSByZWZlcmVuY2UgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgZ2V0UmVxdWlyZWRKYXZhUmVzb3VyY2UoKS5zZXRDbGFzc3BhdGhSZWYocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBjbGFzc3BhdGggdXNlZCBieSB0aGlzIDxjb2RlPkxvYWRQcm9wZXJ0aWVzPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIFRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBnZXRSZXF1aXJlZEphdmFSZXNvdXJjZSgpLmdldENsYXNzcGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGxvYWQgQW50IHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIGZpbGUgb3IgcmVzb3VyY2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy92YWxpZGF0aW9uCisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBIHNvdXJjZSByZXNvdXJjZSBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNyYy5pc0V4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgSmF2YVJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgLy8gZHJlYWRlZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGZpbmQgcmVzb3VyY2UgIiArIHNyYywgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTb3VyY2UgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3Q6ICIgKyBzcmMpOworICAgICAgICB9CisgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbnVsbDsKKyAgICAgICAgUmVhZGVyIGluc3RyZWFtID0gbnVsbDsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gdGlzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3JjLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnN0cmVhbSA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihiaXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnN0cmVhbSA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihiaXMsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENoYWluUmVhZGVySGVscGVyIGNyaCA9IG5ldyBDaGFpblJlYWRlckhlbHBlcigpOworICAgICAgICAgICAgY3JoLnNldFByaW1hcnlSZWFkZXIoaW5zdHJlYW0pOworICAgICAgICAgICAgY3JoLnNldEZpbHRlckNoYWlucyhmaWx0ZXJDaGFpbnMpOworICAgICAgICAgICAgY3JoLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGluc3RyZWFtID0gY3JoLmdldEFzc2VtYmxlZFJlYWRlcigpOworCisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGNyaC5yZWFkRnVsbHkoaW5zdHJlYW0pOworCisgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghdGV4dC5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dCArICJcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKGVuY29kaW5nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHByb3BzLmxvYWQodGlzKTsKKworICAgICAgICAgICAgICAgIFByb3BlcnR5IHByb3BlcnR5VGFzayA9IG5ldyBQcm9wZXJ0eSgpOworICAgICAgICAgICAgICAgIHByb3BlcnR5VGFzay5iaW5kVG9Pd25lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhc2suYWRkUHJvcGVydGllcyhwcm9wcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBmaWxlOiAiICsgaW9lLCBpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGJpcyk7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UodGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBGaWx0ZXJDaGFpbi4KKyAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkRmlsdGVyQ2hhaW4oRmlsdGVyQ2hhaW4gZmlsdGVyKSB7CisgICAgICAgIGZpbHRlckNoYWlucy5hZGRFbGVtZW50KGZpbHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2UgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIGEgdGhlIHJlc291cmNlIHRvIGxvYWQgYXMgYSBzaW5nbGUgZWxlbWVudCBSZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbmZpZ3VyZWQoUmVzb3VyY2VDb2xsZWN0aW9uIGEpIHsKKyAgICAgICAgaWYgKHNyYyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm9ubHkgYSBzaW5nbGUgc291cmNlIGlzIHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChhLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJvbmx5IHNpbmdsZS1lbGVtZW50IHJlc291cmNlIGNvbGxlY3Rpb25zIGFyZSBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBzcmMgPSAoUmVzb3VyY2UpIGEuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgSmF2YVJlc291cmNlIGdldFJlcXVpcmVkSmF2YVJlc291cmNlKCkgeworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyYyA9IG5ldyBKYXZhUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIHNyYy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIShzcmMgaW5zdGFuY2VvZiBKYXZhUmVzb3VyY2UpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImV4cGVjdGVkIGEgamF2YSByZXNvdXJjZSBhcyBzb3VyY2UiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEphdmFSZXNvdXJjZSkgc3JjOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRSZXNvdXJjZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9hZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGU1ODU2OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMudXRpbC5DaGFpblJlYWRlckhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogTG9hZCBhIHJlc291cmNlIGludG8gYSBwcm9wZXJ0eQorICoKKyAqIEBzaW5jZSBBbnQgMS43CisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InV0aWxpdHkiCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkUmVzb3VyY2UgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSB0byBsb2FkLgorICAgICAqLworICAgIHByaXZhdGUgUmVzb3VyY2Ugc3JjOworCisgICAgLyoqCisgICAgICogd2hhdCB0byBkbyB3aGVuIGl0IGdvZXMgcGVhci1zaGFwZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOworCisgICAgLyoqCisgICAgICogc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBpZiBpdCBnb2VzIHBlYXItc2hhcGVkLCBzZXRzIGZhaWxPbkVycm9yPWZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHF1aWV0ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcywgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdAorICAgICAqIGVuY29kaW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIG5hbWUgb2YgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyBGaWx0ZXJDaGFpbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvciBmaWx0ZXJDaGFpbnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZyB0byB1c2UgZm9yIGlucHV0LCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0CisgICAgICogZW5jb2RpbmcuIDxwPgorICAgICAqCisgICAgICogRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlCisgICAgICogPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+CisgICAgICogaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbAorICAgICAqIDwvYT4uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBuZXcgRW5jb2RpbmcgdmFsdWUKKyAgICAgKi8KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEVuY29kaW5nKGZpbmFsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSBuYW1lIHRvIHNhdmUgdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIG5ldyBQcm9wZXJ0eSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZmFpbCBvbiBsb2FkIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIGZhaWwgVGhlIG5ldyBGYWlsb25lcnJvciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEZhaWxvbmVycm9yKGZpbmFsIGJvb2xlYW4gZmFpbCkgeworICAgICAgICBmYWlsT25FcnJvciA9IGZhaWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgc3VwcHJlc3MgdGhlIGxvYWQgZXJyb3IgcmVwb3J0IGFuZCBzZXQgdGhlCisgICAgICogdGhlIGZhaWxvbmVycm9yIHZhbHVlIHRvIGZhbHNlLgorICAgICAqIEBwYXJhbSBxdWlldCBUaGUgbmV3IFF1aWV0IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVpZXQoZmluYWwgYm9vbGVhbiBxdWlldCkgeworICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7CisgICAgICAgIGlmIChxdWlldCkgeworICAgICAgICAgICAgdGhpcy5mYWlsT25FcnJvciA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVhZCBpbiBhIHNvdXJjZSBmaWxlIHRvIGEgcHJvcGVydHkKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBleGVjdXRlKCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy92YWxpZGF0aW9uCisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzb3VyY2UgcmVzb3VyY2Ugbm90IGRlZmluZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvdXRwdXQgcHJvcGVydHkgbm90IGRlZmluZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocXVpZXQgJiYgZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicXVpZXQgYW5kIGZhaWxvbmVycm9yIGNhbm5vdCBib3RoIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzZXQgdG8gdHJ1ZSIpOworICAgICAgICB9CisgICAgICAgIGlmICghc3JjLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3JjICsgIiBkb2Vzbid0IGV4aXN0IjsKKyAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIHF1aWV0ID8gUHJvamVjdC5NU0dfV0FSTiA6IFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBudWxsOworICAgICAgICBSZWFkZXIgaW5zdHJlYW0gPSBudWxsOworICAgICAgICBsb2coImxvYWRpbmcgIiArIHNyYyArICIgaW50byBwcm9wZXJ0eSAiICsgcHJvcGVydHksCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbGVuID0gc3JjLmdldFNpemUoKTsKKyAgICAgICAgICAgIGxvZygicmVzb3VyY2Ugc2l6ZSA9ICIKKyAgICAgICAgICAgICAgICArIChsZW4gIT0gUmVzb3VyY2UuVU5LTk9XTl9TSVpFID8gU3RyaW5nLnZhbHVlT2YobGVuKQorICAgICAgICAgICAgICAgICAgIDogInVua25vd24iKSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgLy9kaXNjYXJkIG1vc3Qgb2YgcmVhbGx5IGJpZyByZXNvdXJjZXMKKyAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gKGludCkgbGVuOworICAgICAgICAgICAgLy9vcGVuIHVwIHRoZSByZXNvdXJjZQorICAgICAgICAgICAgaXMgPSBzcmMuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzKTsKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5zdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzLCBlbmNvZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gIiI7CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQ2hhaW5SZWFkZXJIZWxwZXIgY3JoID0gbmV3IENoYWluUmVhZGVySGVscGVyKCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiAhPSBSZXNvdXJjZS5VTktOT1dOX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgY3JoLnNldEJ1ZmZlclNpemUoc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNyaC5zZXRQcmltYXJ5UmVhZGVyKGluc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBjcmguc2V0RmlsdGVyQ2hhaW5zKGZpbHRlckNoYWlucyk7CisgICAgICAgICAgICAgICAgY3JoLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICBpbnN0cmVhbSA9IGNyaC5nZXRBc3NlbWJsZWRSZWFkZXIoKTsKKworICAgICAgICAgICAgICAgIHRleHQgPSBjcmgucmVhZEZ1bGx5KGluc3RyZWFtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJEbyBub3Qgc2V0IHByb3BlcnR5ICIgKyBwcm9wZXJ0eSArICIgYXMgaXRzIGxlbmd0aCBpcyAwLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgdGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGxvZygibG9hZGVkICIgKyB0ZXh0Lmxlbmd0aCgpICsgIiBjaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBsb2cocHJvcGVydHkgKyAiIDo9ICIgKyB0ZXh0LCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIKKyAgICAgICAgICAgICAgICArIGlvZS50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBxdWlldCA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgYmU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZyhiZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBGaWx0ZXJDaGFpbiBlbGVtZW50LgorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRGaWx0ZXJDaGFpbihGaWx0ZXJDaGFpbiBmaWx0ZXIpIHsKKyAgICAgICAgZmlsdGVyQ2hhaW5zLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNvdXJjZSByZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYSB0aGUgcmVzb3VyY2UgdG8gbG9hZCBhcyBhIHNpbmdsZSBlbGVtZW50IFJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChSZXNvdXJjZUNvbGxlY3Rpb24gYSkgeworICAgICAgICBpZiAoYS5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvbmx5IHNpbmdsZSBhcmd1bWVudCByZXNvdXJjZSBjb2xsZWN0aW9ucyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJlIHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgICAgIHNyYyA9IChSZXNvdXJjZSkgYS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvZ091dHB1dFN0cmVhbS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9nT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjMzQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvZ091dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5MaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW07CisKKy8qKgorICogTG9ncyBlYWNoIGxpbmUgd3JpdHRlbiB0byB0aGlzIHN0cmVhbSB0byB0aGUgbG9nIHN5c3RlbSBvZiBhbnQuCisgKgorICogVHJpZXMgdG8gYmUgc21hcnQgYWJvdXQgbGluZSBzZXBhcmF0b3JzLjxicj4KKyAqCisgKiBAc2luY2UgQW50IDEuMgorICovCitwdWJsaWMgY2xhc3MgTG9nT3V0cHV0U3RyZWFtIGV4dGVuZHMgTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgUHJvamVjdENvbXBvbmVudCBwYzsKKyAgICBwcml2YXRlIGludCBsZXZlbCA9IFByb2plY3QuTVNHX0lORk87CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgTG9nT3V0cHV0U3RyZWFtIGZvciB0aGUgc3BlY2lmaWVkIFByb2plY3RDb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGMgdGhlIHByb2plY3QgY29tcG9uZW50IGZvciB3aG9tIHRvIGxvZworICAgICAqIEBzaW5jZSBBbnQgMS43LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nT3V0cHV0U3RyZWFtKFByb2plY3RDb21wb25lbnQgcGMpIHsKKyAgICAgICAgdGhpcy5wYyA9IHBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrIGZvciB3aG9tIHRvIGxvZworICAgICAqIEBwYXJhbSBsZXZlbCBsb2dsZXZlbCB1c2VkIHRvIGxvZyBkYXRhIHdyaXR0ZW4gdG8gdGhpcyBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIExvZ091dHB1dFN0cmVhbShUYXNrIHRhc2ssIGludCBsZXZlbCkgeworICAgICAgICB0aGlzKChQcm9qZWN0Q29tcG9uZW50KSB0YXNrLCBsZXZlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHBjIHRoZSBwcm9qZWN0IGNvbXBvbmVudCBmb3Igd2hvbSB0byBsb2cKKyAgICAgKiBAcGFyYW0gbGV2ZWwgbG9nbGV2ZWwgdXNlZCB0byBsb2cgZGF0YSB3cml0dGVuIHRvIHRoaXMgc3RyZWFtLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nT3V0cHV0U3RyZWFtKFByb2plY3RDb21wb25lbnQgcGMsIGludCBsZXZlbCkgeworICAgICAgICB0aGlzKHBjKTsKKyAgICAgICAgdGhpcy5sZXZlbCA9IGxldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBidWZmZXIgdG8gYSBzdHJpbmcgYW5kIHNlbmRzIGl0IHRvIDxjb2RlPnByb2Nlc3NMaW5lPC9jb2RlPgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCdWZmZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5wcm9jZXNzQnVmZmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGltcG9zc2libGUgc2luY2UgKm91ciogcHJvY2Vzc0xpbmUgZG9lc24ndCB0aHJvdyBhbiBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkltcG9zc2libGUgSU9FeGNlcHRpb24gY2F1Z2h0OiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2dzIGEgbGluZSB0byB0aGUgbG9nIHN5c3RlbSBvZiBhbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBsb2cuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0xpbmUoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgcHJvY2Vzc0xpbmUobGluZSwgbGV2ZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZ3MgYSBsaW5lIHRvIHRoZSBsb2cgc3lzdGVtIG9mIGFudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIGxvZy4KKyAgICAgKiBAcGFyYW0gbGV2ZWwgdGhlIGxvZ2dpbmcgbGV2ZWwgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NMaW5lKFN0cmluZyBsaW5lLCBpbnQgbGV2ZWwpIHsKKyAgICAgICAgcGMubG9nKGxpbmUsIGxldmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxldmVsLgorICAgICAqIEByZXR1cm4gdGhlIGxvZyBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1lc3NhZ2VMZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIGxldmVsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9nU3RyZWFtSGFuZGxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9nU3RyZWFtSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTU3MTkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2dTdHJlYW1IYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogTG9ncyBzdGFuZGFyZCBvdXRwdXQgYW5kIGVycm9yIG9mIGEgc3VicHJvY2VzcyB0byB0aGUgbG9nIHN5c3RlbSBvZiBhbnQuCisgKgorICogQHNpbmNlIEFudCAxLjIKKyAqLworcHVibGljIGNsYXNzIExvZ1N0cmVhbUhhbmRsZXIgZXh0ZW5kcyBQdW1wU3RyZWFtSGFuZGxlciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGxvZyBzdHJlYW0gaGFuZGxlcgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgdGhlIHRhc2sgZm9yIHdob20gdG8gbG9nCisgICAgICogQHBhcmFtIG91dGxldmVsIHRoZSBsb2dsZXZlbCB1c2VkIHRvIGxvZyBzdGFuZGFyZCBvdXRwdXQKKyAgICAgKiBAcGFyYW0gZXJybGV2ZWwgdGhlIGxvZ2xldmVsIHVzZWQgdG8gbG9nIHN0YW5kYXJkIGVycm9yCisgICAgICovCisgICAgcHVibGljIExvZ1N0cmVhbUhhbmRsZXIoVGFzayB0YXNrLCBpbnQgb3V0bGV2ZWwsIGludCBlcnJsZXZlbCkgeworICAgICAgICB0aGlzKChQcm9qZWN0Q29tcG9uZW50KSB0YXNrLCBvdXRsZXZlbCwgZXJybGV2ZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbG9nIHN0cmVhbSBoYW5kbGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGMgdGhlIHByb2plY3QgY29tcG9uZW50IGZvciB3aG9tIHRvIGxvZworICAgICAqIEBwYXJhbSBvdXRsZXZlbCB0aGUgbG9nbGV2ZWwgdXNlZCB0byBsb2cgc3RhbmRhcmQgb3V0cHV0CisgICAgICogQHBhcmFtIGVycmxldmVsIHRoZSBsb2dsZXZlbCB1c2VkIHRvIGxvZyBzdGFuZGFyZCBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBMb2dTdHJlYW1IYW5kbGVyKFByb2plY3RDb21wb25lbnQgcGMsIGludCBvdXRsZXZlbCwgaW50IGVycmxldmVsKSB7CisgICAgICAgIHN1cGVyKG5ldyBMb2dPdXRwdXRTdHJlYW0ocGMsIG91dGxldmVsKSwKKyAgICAgICAgICAgICAgbmV3IExvZ091dHB1dFN0cmVhbShwYywgZXJybGV2ZWwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBsb2cgc3RyZWFtIGhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc3VwZXIuc3RvcCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0RXJyKCkuY2xvc2UoKTsKKyAgICAgICAgICAgIGdldE91dCgpLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHBsYWluIGltcG9zc2libGUKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hY3JvRGVmLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWNyb0RlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMWRiOTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWNyb0RlZi5qYXZhCkBAIC0wLDAgKzEsODMwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRUeXBlRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Db21wb25lbnRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlJ1bnRpbWVDb25maWd1cmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlVua25vd25FbGVtZW50OworCisvKioKKyAqIERlc2NyaWJlIGNsYXNzIDxjb2RlPk1hY3JvRGVmPC9jb2RlPiBoZXJlLgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBNYWNyb0RlZiBleHRlbmRzIEFudGxpYkRlZmluaXRpb24gIHsKKworICAgIHByaXZhdGUgTmVzdGVkU2VxdWVudGlhbCBuZXN0ZWRTZXF1ZW50aWFsOworICAgIHByaXZhdGUgU3RyaW5nICAgICBuYW1lOworICAgIHByaXZhdGUgYm9vbGVhbiAgICBiYWNrVHJhY2UgPSB0cnVlOworICAgIHByaXZhdGUgTGlzdCAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTWFwICAgICAgICBlbGVtZW50cyAgID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIFN0cmluZyAgICAgdGV4dE5hbWUgICA9IG51bGw7CisgICAgcHJpdmF0ZSBUZXh0ICAgICAgIHRleHQgICAgICAgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiAgICBoYXNJbXBsaWNpdEVsZW1lbnQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGRlZmluaXRpb24KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVmaW5pdGlvbgorICAgICAqLworICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSB0ZXh0IGVsZW1lbnQuCisgICAgICogQHBhcmFtIHRleHQgdGhlIG5lc3RlZCB0ZXh0IGVsZW1lbnQgdG8gYWRkCisgICAgICogQHNpbmNlIGFudCAxLjYuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRUZXh0KFRleHQgdGV4dCkgeworICAgICAgICBpZiAodGhpcy50ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiT25seSBvbmUgbmVzdGVkIHRleHQgZWxlbWVudCBhbGxvd2VkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQuZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAidGhlIHRleHQgbmVzdGVkIGVsZW1lbnQgbmVlZGVkIGEgXCJuYW1lXCIgYXR0cmlidXRlIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdXNlZCBieSBhdHRyaWJ1dGVzCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAodGV4dC5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidGhlIG5hbWUgXCIiICsgdGV4dC5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgaXMgYWxyZWFkeSB1c2VkIGFzIGFuIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgIHRoaXMudGV4dE5hbWUgPSB0ZXh0LmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgdGV4dCBlbGVtZW50CisgICAgICogQHNpbmNlIGFudCAxLjYuMQorICAgICAqLworICAgIHB1YmxpYyBUZXh0IGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFja1RyYWNlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYWNrVHJhY2UgaWYgdHJ1ZSBhbmQgdGhlIG1hY3JvIGluc3RhbmNlIGdlbmVyYXRlcworICAgICAqICAgICAgICAgICAgICAgICAgYW4gZXJyb3IsIGEgYmFja3RyYWNlIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBtYWNybyBhbmQgY2FsbCB0byB0aGUgbWFjcm8gd2lsbCBiZSBvdXRwdXQuCisgICAgICogICAgICAgICAgICAgICAgICBpZiBmYWxzZSwgb25seSB0aGUgbG9jYXRpb24gb2YgdGhlIGNhbGwgdG8gdGhlCisgICAgICogICAgICAgICAgICAgICAgICBtYWNybyB3aWxsIGJlIHNob3duLiBEZWZhdWx0IGlzIHRydWUuCisgICAgICogQHNpbmNlIGFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrVHJhY2UoYm9vbGVhbiBiYWNrVHJhY2UpIHsKKyAgICAgICAgdGhpcy5iYWNrVHJhY2UgPSBiYWNrVHJhY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgYmFja1RyYWNlIGF0dHJpYnV0ZS4KKyAgICAgKiBAc2luY2UgYW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEJhY2tUcmFjZSgpIHsKKyAgICAgICAgcmV0dXJuIGJhY2tUcmFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBzZXF1ZW50aWFsIG5lc3RlZCBlbGVtZW50IG9mIHRoZSBtYWNyb2RlZi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzZXF1ZW50aWFsIGVsZW1lbnQgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmVzdGVkU2VxdWVudGlhbCBjcmVhdGVTZXF1ZW50aWFsKCkgeworICAgICAgICBpZiAodGhpcy5uZXN0ZWRTZXF1ZW50aWFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgc2VxdWVudGlhbCBhbGxvd2VkIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5uZXN0ZWRTZXF1ZW50aWFsID0gbmV3IE5lc3RlZFNlcXVlbnRpYWwoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMubmVzdGVkU2VxdWVudGlhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc2VxdWVudGlhbCBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKiBUaGlzIGlzIGEgc2ltcGxlIHRhc2sgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmVzdGVkU2VxdWVudGlhbCBpbXBsZW1lbnRzIFRhc2tDb250YWluZXIgeworICAgICAgICBwcml2YXRlIExpc3QgbmVzdGVkID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSB0YXNrIG9yIHR5cGUgdG8gdGhlIGNvbnRhaW5lci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRhc2sgYW4gdW5rbm93biBlbGVtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrIHRhc2spIHsKKyAgICAgICAgICAgIG5lc3RlZC5hZGQodGFzayk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB1bmtub3duIGVsZW1lbnRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTGlzdCBnZXROZXN0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmVzdGVkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgY29tcGFyZSBmdW5jdGlvbiB0byBjb21wYXJlIHRoaXMgd2l0aCBhbm90aGVyCisgICAgICAgICAqIE5lc3RlZFNlcXVlbnRpYWwuCisgICAgICAgICAqIEl0IGNhbGxzIHNpbWlsYXIgb24gdGhlIG5lc3RlZCB1bmtub3duIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG5lc3RlZCBzZXF1ZW50aWFsIHRvIGNvbXBhcmUgd2l0aC4KKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXkgYXJlIHNpbWlsYXIsIGZhbHNlIG90aGVyd2lzZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2ltaWxhcihOZXN0ZWRTZXF1ZW50aWFsIG90aGVyKSB7CisgICAgICAgICAgICBpZiAobmVzdGVkLnNpemUoKSAhPSBvdGhlci5uZXN0ZWQuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBVbmtub3duRWxlbWVudCBtZSA9IChVbmtub3duRWxlbWVudCkgbmVzdGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBVbmtub3duRWxlbWVudCBvID0gKFVua25vd25FbGVtZW50KSBvdGhlci5uZXN0ZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmICghbWUuc2ltaWxhcihvKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBuZXN0ZWQgc2VxdWVudGlhbCB0byBhbiB1bmtub3duIGVsZW1lbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgc2VxdWVudGlhbCBhcyBhbiB1bmtub3duIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFVua25vd25FbGVtZW50IGdldE5lc3RlZFRhc2soKSB7CisgICAgICAgIFVua25vd25FbGVtZW50IHJldCA9IG5ldyBVbmtub3duRWxlbWVudCgic2VxdWVudGlhbCIpOworICAgICAgICByZXQuc2V0VGFza05hbWUoInNlcXVlbnRpYWwiKTsKKyAgICAgICAgcmV0LnNldE5hbWVzcGFjZSgiIik7CisgICAgICAgIHJldC5zZXRRTmFtZSgic2VxdWVudGlhbCIpOworICAgICAgICBuZXcgUnVudGltZUNvbmZpZ3VyYWJsZShyZXQsICJzZXF1ZW50aWFsIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkU2VxdWVudGlhbC5nZXROZXN0ZWQoKS5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgZSA9CisgICAgICAgICAgICAgICAgKFVua25vd25FbGVtZW50KSBuZXN0ZWRTZXF1ZW50aWFsLmdldE5lc3RlZCgpLmdldChpKTsKKyAgICAgICAgICAgIHJldC5hZGRDaGlsZChlKTsKKyAgICAgICAgICAgIHJldC5nZXRXcmFwcGVyKCkuYWRkQ2hpbGQoZS5nZXRXcmFwcGVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGlzIG1hY3JvJ3MgYXR0cmlidXRlIChhbmQgZGVmaW5lPykgbGlzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5lc3RlZCBBdHRyaWJ1dGVzCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlcygpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGlzIG1hY3JvJ3MgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXAgbmVzdGVkIGVsZW1lbnRzLCBrZXllZCBieSBlbGVtZW50IG5hbWUsIHdpdGgKKyAgICAgKiAgICAgICAgIHtAbGluayBUZW1wbGF0ZUVsZW1lbnR9IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwIGdldEVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBjaGFyYWN0ZXIgZm9yIGFuIGVsZW1lbnQgb3IKKyAgICAgKiBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBhIGxldHRlciBvciBkaWdpdCBvciAnLicgb3IgJy0nCisgICAgICogICAgICAgICBhdHRyaWJ1dGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZUNoYXJhY3RlcihjaGFyIGMpIHsKKyAgICAgICAgLy8gPyBpcyB0aGVyZSBhbiB4bWwgYXBpIGZvciB0aGlzID8KKyAgICAgICAgcmV0dXJuIENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoYykgfHwgYyA9PSAnLicgfHwgYyA9PSAnLSc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBuYW1lIGZvciBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBzdHJpbmcgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWUgY29uc2lzdHMgb2YgdmFsaWQgbmFtZSBjaGFyYWN0ZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWVDaGFyYWN0ZXIobmFtZS5jaGFyQXQoaSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgYW4gYXR0cmlidXRlIG5lc3RlZCBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworICAgICAgICBpZiAoYXR0cmlidXRlLmdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInRoZSBhdHRyaWJ1dGUgbmVzdGVkIGVsZW1lbnQgbmVlZGVkIGEgXCJuYW1lXCIgYXR0cmlidXRlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKHRleHROYW1lKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJ0aGUgbmFtZSBcIiIgKyBhdHRyaWJ1dGUuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGJ5IHRoZSB0ZXh0IGVsZW1lbnQiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHQgPSAoQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChhdHQuZ2V0TmFtZSgpLmVxdWFscyhhdHRyaWJ1dGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInRoZSBuYW1lIFwiIiArIGF0dHJpYnV0ZS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJhbm90aGVyIGF0dHJpYnV0ZSBlbGVtZW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZWxlbWVudCBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW1lbnQgYW4gZWxlbWVudCBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkRWxlbWVudChUZW1wbGF0ZUVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJ0aGUgZWxlbWVudCBuZXN0ZWQgZWxlbWVudCBuZWVkZWQgYSBcIm5hbWVcIiBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudHMuZ2V0KGVsZW1lbnQuZ2V0TmFtZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInRoZSBlbGVtZW50ICIgKyBlbGVtZW50LmdldE5hbWUoKQorICAgICAgICAgICAgICAgICsgIiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChoYXNJbXBsaWNpdEVsZW1lbnQKKyAgICAgICAgICAgIHx8IChlbGVtZW50LmlzSW1wbGljaXQoKSAmJiBlbGVtZW50cy5zaXplKCkgIT0gMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiT25seSBvbmUgZWxlbWVudCBhbGxvd2VkIHdoZW4gdXNpbmcgaW1wbGljaXQgZWxlbWVudHMiKTsKKyAgICAgICAgfQorICAgICAgICBoYXNJbXBsaWNpdEVsZW1lbnQgPSBlbGVtZW50LmlzSW1wbGljaXQoKTsKKyAgICAgICAgZWxlbWVudHMucHV0KGVsZW1lbnQuZ2V0TmFtZSgpLCBlbGVtZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgYW50IHR5cGUgYmFzZWQgb24gdGhlIGVtYmVkZGVkIHRhc2tzIGFuZCB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBpZiAobmVzdGVkU2VxdWVudGlhbCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3Npbmcgc2VxdWVudGlhbCBlbGVtZW50Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOYW1lIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWUgPSBQcm9qZWN0SGVscGVyLmdlbkNvbXBvbmVudE5hbWUoZ2V0VVJJKCksIG5hbWUpOworCisgICAgICAgIE15QW50VHlwZURlZmluaXRpb24gZGVmID0gbmV3IE15QW50VHlwZURlZmluaXRpb24odGhpcyk7CisgICAgICAgIGRlZi5zZXROYW1lKG5hbWUpOworICAgICAgICBkZWYuc2V0Q2xhc3MoTWFjcm9JbnN0YW5jZS5jbGFzcyk7CisKKyAgICAgICAgQ29tcG9uZW50SGVscGVyIGhlbHBlciA9IENvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRIZWxwZXIoCisgICAgICAgICAgICBnZXRQcm9qZWN0KCkpOworCisgICAgICAgIGhlbHBlci5hZGREYXRhVHlwZURlZmluaXRpb24oZGVmKTsKKyAgICAgICAgbG9nKCJjcmVhdGluZyBtYWNybyAgIiArIG5hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQW4gYXR0cmlidXRlIGZvciB0aGUgTWFjcm9EZWYgdGFzay4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXR0cmlidXRlIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOworICAgICAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZShuYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgbmFtZSBbIiArIG5hbWUgKyAiXSBmb3IgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSB0byB1c2UgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QKKyAgICAgICAgICogdXNlZCBpbiB0aGUgdGVtcGxhdGVkIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUsIG51bGwgaWYgbm90IHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gZGVzYyBEZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogQHNpbmNlIGFudCAxLjYuMQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgICAgICogICAgICAgICBubyBkZXNjcmlwdGlvbiBpcyBhdmFpbGFibGUuCisgICAgICAgICAqIEBzaW5jZSBhbnQgMS42LjEKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogZXF1YWxpdHkgbWV0aG9kCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmogYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZQorICAgICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqLmdldENsYXNzKCkgIT0gZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF0dHJpYnV0ZSBvdGhlciA9IChBdHRyaWJ1dGUpIG9iajsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXIubmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChvdGhlci5kZWZhdWx0VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghZGVmYXVsdFZhbHVlLmVxdWFscyhvdGhlci5kZWZhdWx0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdEhhc2hDb2RlKGRlZmF1bHRWYWx1ZSkgKyBvYmplY3RIYXNoQ29kZShuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbmVzdGVkIHRleHQgZWxlbWVudCBmb3IgdGhlIE1hY3JvRGVmIHRhc2suCisgICAgICogQHNpbmNlIGFudCAxLjYuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGV4dCB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nICBuYW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWw7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB0cmltOworICAgICAgICBwcml2YXRlIFN0cmluZyAgZGVzY3JpcHRpb247CisgICAgICAgIHByaXZhdGUgU3RyaW5nICBkZWZhdWx0U3RyaW5nOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBuYW1lIFsiICsgbmFtZSArICJdIGZvciBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvcHRpb25hbCBhdHRyaWJ1dGUgb2YgdGhlIHRleHQgZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9wdGlvbmFsIGlmIHRydWUgdGhpcyBpcyBvcHRpb25hbAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoYm9vbGVhbiBvcHRpb25hbCkgeworICAgICAgICAgICAgdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGV4dCBpcyBvcHRpb25hbAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7CisgICAgICAgICAgICByZXR1cm4gb3B0aW9uYWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRyaW0gYXR0cmlidXRlIG9mIHRoZSB0ZXh0IGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cmltIGlmIHRydWUgdGhpcyBTdHJpbmcudHJpbSgpIGlzIGNhbGxlZCBvbgorICAgICAgICAgKiAgICAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIHRleHQgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRyaW0oYm9vbGVhbiB0cmltKSB7CisgICAgICAgICAgICB0aGlzLnRyaW0gPSB0cmltOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGV4dCBpcyB0cmltCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmltKCkgeworICAgICAgICAgICAgcmV0dXJuIHRyaW07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGRlc2MgRGVzY3JpcHRpb24gb2YgdGhlIHRleHQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYykgeworICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAgICAgKiAgICAgICAgIG5vIGRlc2NyaXB0aW9uIGlzIGF2YWlsYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGRlZmF1bHRTdHJpbmcgZGVmYXVsdCB0ZXh0IGZvciB0aGUgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgZGVmYXVsdFN0cmluZykgeworICAgICAgICAgICAgdGhpcy5kZWZhdWx0U3RyaW5nID0gZGVmYXVsdFN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHRleHQgaWYgc2V0LCBudWxsIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGVxdWFsaXR5IG1ldGhvZAorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqIGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWUKKyAgICAgICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iai5nZXRDbGFzcygpICE9IGdldENsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0IG90aGVyID0gKFRleHQpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBzYWZlQ29tcGFyZShuYW1lLCBvdGhlci5uYW1lKQorICAgICAgICAgICAgICAgICYmIG9wdGlvbmFsID09IG90aGVyLm9wdGlvbmFsCisgICAgICAgICAgICAgICAgJiYgdHJpbSA9PSBvdGhlci50cmltCisgICAgICAgICAgICAgICAgJiYgc2FmZUNvbXBhcmUoZGVmYXVsdFN0cmluZywgb3RoZXIuZGVmYXVsdFN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdEhhc2hDb2RlKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzYWZlQ29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKKyAgICAgICAgcmV0dXJuIGEgPT0gbnVsbCA/IGIgPT0gbnVsbCA6IGEuZXF1YWxzKGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbmVzdGVkIGVsZW1lbnQgZm9yIHRoZSBNYWNyb0RlZiB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVtcGxhdGVFbGVtZW50IHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpbXBsaWNpdCA9IGZhbHNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIG5hbWUgWyIgKyBuYW1lICsgIl0gZm9yIG1hY3JvIGVsZW1lbnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgZWxlbWVudCwKKyAgICAgICAgICogZm9yIGJ1aWxkIGRvY3VtZW50YXRpb24gcHVycG9zZXMgb25seS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRlc2MgRGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQuCisgICAgICAgICAqIEBzaW5jZSBhbnQgMS42LjEKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKSB7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2M7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgICAgICogICAgICAgICBubyBkZXNjcmlwdGlvbiBpcyBhdmFpbGFibGUuCisgICAgICAgICAqIEBzaW5jZSBhbnQgMS42LjEKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcyBvcHRpb25hbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9wdGlvbmFsIGlmIHRydWUgdGhpcyBlbGVtZW50IG1heSBiZSBsZWZ0IG91dCwgZGVmYXVsdAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgaXMgZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChib29sZWFuIG9wdGlvbmFsKSB7CisgICAgICAgICAgICB0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcyBvcHRpb25hbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgb3B0aW9uYWwgYXR0cmlidXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgeworICAgICAgICAgICAgcmV0dXJuIG9wdGlvbmFsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgd2hldGhlciB0aGlzIGVsZW1lbnQgaXMgaW1wbGljaXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbXBsaWNpdCBpZiB0cnVlIHRoaXMgZWxlbWVudCBtYXkgYmUgbGVmdCBvdXQsIGRlZmF1bHQKKyAgICAgICAgICogICAgICAgICAgICAgICAgIGlzIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0SW1wbGljaXQoYm9vbGVhbiBpbXBsaWNpdCkgeworICAgICAgICAgICAgdGhpcy5pbXBsaWNpdCA9IGltcGxpY2l0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgd2hldGhlciB0aGlzIGVsZW1lbnQgaXMgaW1wbGljaXQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGltcGxpY2l0IGF0dHJpYnV0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbXBsaWNpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBlcXVhbGl0eSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmogYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZQorICAgICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIW9iai5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRlbXBsYXRlRWxlbWVudCB0ID0gKFRlbXBsYXRlRWxlbWVudCkgb2JqOworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgKG5hbWUgPT0gbnVsbCA/IHQubmFtZSA9PSBudWxsIDogbmFtZS5lcXVhbHModC5uYW1lKSkKKyAgICAgICAgICAgICAgICAmJiBvcHRpb25hbCA9PSB0Lm9wdGlvbmFsCisgICAgICAgICAgICAgICAgJiYgaW1wbGljaXQgPT0gdC5pbXBsaWNpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0SGFzaENvZGUobmFtZSkKKyAgICAgICAgICAgICAgICArIChvcHRpb25hbCA/IDEgOiAwKSArIChpbXBsaWNpdCA/IDEgOiAwKTsKKyAgICAgICAgfQorCisgICAgfSAvLyBFTkQgc3RhdGljIGNsYXNzIFRlbXBsYXRlRWxlbWVudAorCisgICAgLyoqCisgICAgICogc2FtZSBvciBzaW1pbGFyIGVxdWFsaXR5IG1ldGhvZCBmb3IgbWFjcm9kZWYsIGlnbm9yZXMgcHJvamVjdCBhbmQKKyAgICAgKiBydW50aW1lIGluZm8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWUKKyAgICAgKiBAcGFyYW0gc2FtZSBpZiB0cnVlIHRlc3QgZm9yIHNhbWVuZXNzLCBvdGhlcndpc2UganVzdCBzaW1pbGlhcgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzYW1lT3JTaW1pbGFyKE9iamVjdCBvYmosIGJvb2xlYW4gc2FtZSkgeworICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvYmouZ2V0Q2xhc3MoKS5lcXVhbHMoZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBNYWNyb0RlZiBvdGhlciA9IChNYWNyb0RlZikgb2JqOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gb3RoZXIubmFtZSA9PSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBBbGxvdyB0d28gbWFjcm8gZGVmaW5pdGlvbnMgd2l0aCB0aGUgc2FtZSBsb2NhdGlvbgorICAgICAgICAvLyB0byBiZSB0cmVhdGVkIGFzIHNpbWlsYXIgLSBidWd6aWxsYSAzMTIxNQorICAgICAgICBpZiAob3RoZXIuZ2V0TG9jYXRpb24oKSAhPSBudWxsCisgICAgICAgICAgICAmJiBvdGhlci5nZXRMb2NhdGlvbigpLmVxdWFscyhnZXRMb2NhdGlvbigpKQorICAgICAgICAgICAgJiYgIXNhbWUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvdGhlci50ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXRleHQuZXF1YWxzKG90aGVyLnRleHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChnZXRVUkkoKSA9PSBudWxsIHx8IGdldFVSSSgpLmVxdWFscygiIikKKyAgICAgICAgICAgIHx8IGdldFVSSSgpLmVxdWFscyhQcm9qZWN0SGVscGVyLkFOVF9DT1JFX1VSSSkpIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyLmdldFVSSSgpID09IG51bGwgfHwgb3RoZXIuZ2V0VVJJKCkuZXF1YWxzKCIiKQorICAgICAgICAgICAgICAgICAgfHwgb3RoZXIuZ2V0VVJJKCkuZXF1YWxzKFByb2plY3RIZWxwZXIuQU5UX0NPUkVfVVJJKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWdldFVSSSgpLmVxdWFscyhvdGhlci5nZXRVUkkoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW5lc3RlZFNlcXVlbnRpYWwuc2ltaWxhcihvdGhlci5uZXN0ZWRTZXF1ZW50aWFsKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghYXR0cmlidXRlcy5lcXVhbHMob3RoZXIuYXR0cmlidXRlcykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWVsZW1lbnRzLmVxdWFscyhvdGhlci5lbGVtZW50cykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1pbGFyIG1ldGhvZCBmb3IgdGhpcyBkZWZpbml0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIGFub3RoZXIgZGVmaW5pdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGVmaW5pdGlvbnMgYXJlIHNpbWlsYXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzaW1pbGFyKE9iamVjdCBvYmopIHsKKyAgICAgICAgcmV0dXJuIHNhbWVPclNpbWlsYXIob2JqLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1YWxpdHkgbWV0aG9kIGZvciB0aGlzIGRlZmluaXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogYW5vdGhlciBkZWZpbml0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZWZpbml0aW9ucyBhcmUgdGhlIHNhbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzYW1lRGVmaW5pdGlvbihPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiBzYW1lT3JTaW1pbGFyKG9iaiwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXh0ZW5kcyBBbnRUeXBlRGVmaW5pdGlvbiwgb24gY3JlYXRlCisgICAgICogb2YgdGhlIG9iamVjdCwgdGhlIHRlbXBsYXRlIG1hY3JvIGRlZmluaXRpb24KKyAgICAgKiBpcyBnaXZlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUFudFR5cGVEZWZpbml0aW9uIGV4dGVuZHMgQW50VHlwZURlZmluaXRpb24geworICAgICAgICBwcml2YXRlIE1hY3JvRGVmIG1hY3JvRGVmOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk15QW50VHlwZURlZmluaXRpb248L2NvZGU+IGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWFjcm9EZWYgYSA8Y29kZT5NYWNyb0RlZjwvY29kZT4gdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeUFudFR5cGVEZWZpbml0aW9uKE1hY3JvRGVmIG1hY3JvRGVmKSB7CisgICAgICAgICAgICB0aGlzLm1hY3JvRGVmID0gbWFjcm9EZWY7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBkZWZpbml0aW9uLgorICAgICAgICAgKiBUaGUgaW5zdGFuY2UgbWF5IGJlIHdyYXBwZWQgaW4gYSBwcm94eSBjbGFzcy4KKyAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdAorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGUoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IHN1cGVyLmNyZWF0ZShwcm9qZWN0KTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgoTWFjcm9JbnN0YW5jZSkgbykuc2V0TWFjcm9EZWYobWFjcm9EZWYpOworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRXF1YWxpdHkgbWV0aG9kIGZvciB0aGlzIGRlZmluaXRpb24KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG90aGVyIGFub3RoZXIgZGVmaW5pdGlvbgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzYW1lRGVmaW5pdGlvbihBbnRUeXBlRGVmaW5pdGlvbiBvdGhlciwgUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgICAgICBpZiAoIXN1cGVyLnNhbWVEZWZpbml0aW9uKG90aGVyLCBwcm9qZWN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE15QW50VHlwZURlZmluaXRpb24gb3RoZXJEZWYgPSAoTXlBbnRUeXBlRGVmaW5pdGlvbikgb3RoZXI7CisgICAgICAgICAgICByZXR1cm4gbWFjcm9EZWYuc2FtZURlZmluaXRpb24ob3RoZXJEZWYubWFjcm9EZWYpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNpbWlsYXIgbWV0aG9kIGZvciB0aGlzIGRlZmluaXRpb24KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG90aGVyIGFub3RoZXIgZGVmaW5pdGlvbgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaW1pbGFyRGVmaW5pdGlvbigKKyAgICAgICAgICAgIEFudFR5cGVEZWZpbml0aW9uIG90aGVyLCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgICAgIGlmICghc3VwZXIuc2ltaWxhckRlZmluaXRpb24ob3RoZXIsIHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTXlBbnRUeXBlRGVmaW5pdGlvbiBvdGhlckRlZiA9IChNeUFudFR5cGVEZWZpbml0aW9uKSBvdGhlcjsKKyAgICAgICAgICAgIHJldHVybiBtYWNyb0RlZi5zaW1pbGFyKG90aGVyRGVmLm1hY3JvRGVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBvYmplY3RIYXNoQ29kZShPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hY3JvSW5zdGFuY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hY3JvSW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE3MTAxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFjcm9JbnN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkR5bmFtaWNBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5SdW50aW1lQ29uZmlndXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tDb250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVW5rbm93bkVsZW1lbnQ7CisKKy8qKgorICogVGhlIGNsYXNzIHRvIGJlIHBsYWNlZCBpbiB0aGUgYW50IHR5cGUgZGVmaW5pdGlvbi4KKyAqIEl0IGlzIGdpdmVuIGEgcG9pbnRlciB0byB0aGUgdGVtcGxhdGUgZGVmaW5pdGlvbiwKKyAqIGFuZCBtYWtlcyBhIGNvcHkgb2YgdGhlIHVua25vd24gZWxlbWVudCwgc3Vic3RpdHV0aW5nCisgKiB0aGUgcGFyYW1ldGVyIHZhbHVlcyBpbiBhdHRyaWJ1dGVzIGFuZCB0ZXh0LgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIE1hY3JvSW5zdGFuY2UgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgRHluYW1pY0F0dHJpYnV0ZSwgVGFza0NvbnRhaW5lciB7CisgICAgcHJpdmF0ZSBNYWNyb0RlZiBtYWNyb0RlZjsKKyAgICBwcml2YXRlIE1hcCAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgICAgICBuc0VsZW1lbnRzID0gbnVsbDsKKyAgICBwcml2YXRlIE1hcCAgICAgIHByZXNlbnRFbGVtZW50czsKKyAgICBwcml2YXRlIEhhc2h0YWJsZSBsb2NhbEF0dHJpYnV0ZXM7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgdGV4dCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgaW1wbGljaXRUYWcgPSAgICAgbnVsbDsKKyAgICBwcml2YXRlIExpc3QgICAgICB1bmtub3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZnJvbSBNYWNyb0RlZi5NeUFudFR5cGVEZWZpbml0aW9uI2NyZWF0ZSgpCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFjcm9EZWYgYSA8Y29kZT5NYWNyb0RlZjwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYWNyb0RlZihNYWNyb0RlZiBtYWNyb0RlZikgeworICAgICAgICB0aGlzLm1hY3JvRGVmID0gbWFjcm9EZWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbWFjcm8gZGVmaW5pdGlvbiBvYmplY3QgZm9yIHRoaXMgbWFjcm8gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE1hY3JvRGVmIGdldE1hY3JvRGVmKCkgeworICAgICAgICByZXR1cm4gbWFjcm9EZWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBwYXJhbWV0ZXIgbmFtZSB2YWx1ZSBwYWlyIGFzIGEgeG1sIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREeW5hbWljQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgbWFwLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHByZXNlbnQgZm9yIEJDIHB1cnBvc2VzLgorICAgICAqIEBwYXJhbSBuYW1lIG5vdCB1c2VkCisgICAgICogQHJldHVybiBub3RoaW5nCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUR5bmFtaWNFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCBhbnkgbW9yZSIpOworICAgIH0KKworICAgIHByaXZhdGUgTWFwIGdldE5zRWxlbWVudHMoKSB7CisgICAgICAgIGlmIChuc0VsZW1lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIG5zRWxlbWVudHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFjcm9EZWYuZ2V0RWxlbWVudHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgIGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIG5zRWxlbWVudHMucHV0KChTdHJpbmcpIGVudHJ5LmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIE1hY3JvRGVmLlRlbXBsYXRlRWxlbWVudCB0ZSA9IChNYWNyb0RlZi5UZW1wbGF0ZUVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRlLmlzSW1wbGljaXQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFRhZyA9IHRlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5zRWxlbWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgdW5rbm93bkVsZW1lbnQgZm9yIHRoZSBtYWNybyBpbnN0YW5jZXMgbmVzdGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG5lc3RlZFRhc2sgYSBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgbmVzdGVkVGFzaykgeworICAgICAgICB1bmtub3duRWxlbWVudHMuYWRkKG5lc3RlZFRhc2spOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVGFza3MoKSB7CisgICAgICAgIGlmIChpbXBsaWNpdFRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdW5rbm93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgdWUgPSAoVW5rbm93bkVsZW1lbnQpIGkubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBQcm9qZWN0SGVscGVyLmV4dHJhY3ROYW1lRnJvbUNvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgdWUuZ2V0VGFnKCkpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgICAgICAgICBpZiAoZ2V0TnNFbGVtZW50cygpLmdldChuYW1lKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCBlbGVtZW50ICIgKyBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcmVzZW50RWxlbWVudHMuZ2V0KG5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVsZW1lbnQgIiArIG5hbWUgKyAiIGFscmVhZHkgcHJlc2VudCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJlc2VudEVsZW1lbnRzLnB1dChuYW1lLCB1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbWJlZGRlZCBlbGVtZW50IGluIG1hY3JvIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbGVtZW50IGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7CisgICAgICAgIHByaXZhdGUgTGlzdCB1bmtub3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhbiB1bmtub3duIGVsZW1lbnQgKHRvIGJlIHNuaXBwZWQgaW50byB0aGUgbWFjcm9EZWYgaW5zdGFuY2UpCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuZXN0ZWRUYXNrIGFuIHVua25vd24gZWxlbWVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrIG5lc3RlZFRhc2spIHsKKyAgICAgICAgICAgIHVua25vd25FbGVtZW50cy5hZGQobmVzdGVkVGFzayk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB1bmtub3duIGVsZW1lbnRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTGlzdCBnZXRVbmtub3duRWxlbWVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gdW5rbm93bkVsZW1lbnRzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX05PUk1BTCAgICAgICAgID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRVhQRUNUX0JSQUNLRVQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9FWFBFQ1RfTkFNRSAgICA9IDI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtYWNyb1N1YnMoU3RyaW5nIHMsIE1hcCBtYWNyb01hcHBpbmcpIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIG1hY3JvTmFtZSA9IG51bGw7CisKKyAgICAgICAgaW50IHN0YXRlID0gU1RBVEVfTk9STUFMOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkgeworICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfTk9STUFMOgorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ0AnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0VYUEVDVF9CUkFDS0VUOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZChjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FWFBFQ1RfQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICd7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9FWFBFQ1RfTkFNRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnQCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfTk9STUFMOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCgnQCcpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9OT1JNQUw7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKCdAJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0VYUEVDVF9OQU1FOgorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX05PUk1BTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWFjcm9OYW1lLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG1hY3JvTWFwcGluZy5nZXQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoIkB7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9OYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvTmFtZS5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfTk9STUFMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURV9FWFBFQ1RfQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kKCdAJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0VYUEVDVF9OQU1FOgorICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoIkB7Iik7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZChtYWNyb05hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGV4dCBjb250ZW50cyBmb3IgdGhlIG1hY3JvLgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIGJlIGFkZGVkIHRvIHRoZSBtYWNyby4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICB9CisKKyAgICBwcml2YXRlIFVua25vd25FbGVtZW50IGNvcHkoVW5rbm93bkVsZW1lbnQgdWUsIGJvb2xlYW4gbmVzdGVkKSB7CisgICAgICAgIFVua25vd25FbGVtZW50IHJldCA9IG5ldyBVbmtub3duRWxlbWVudCh1ZS5nZXRUYWcoKSk7CisgICAgICAgIHJldC5zZXROYW1lc3BhY2UodWUuZ2V0TmFtZXNwYWNlKCkpOworICAgICAgICByZXQuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICByZXQuc2V0UU5hbWUodWUuZ2V0UU5hbWUoKSk7CisgICAgICAgIHJldC5zZXRUYXNrVHlwZSh1ZS5nZXRUYXNrVHlwZSgpKTsKKyAgICAgICAgcmV0LnNldFRhc2tOYW1lKHVlLmdldFRhc2tOYW1lKCkpOworICAgICAgICByZXQuc2V0TG9jYXRpb24oCisgICAgICAgICAgICBtYWNyb0RlZi5nZXRCYWNrVHJhY2UoKSA/IHVlLmdldExvY2F0aW9uKCkgOiBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgaWYgKGdldE93bmluZ1RhcmdldCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIFRhcmdldCB0ID0gbmV3IFRhcmdldCgpOworICAgICAgICAgICAgdC5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgICAgICByZXQuc2V0T3duaW5nVGFyZ2V0KHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0LnNldE93bmluZ1RhcmdldChnZXRPd25pbmdUYXJnZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZSByYyA9IG5ldyBSdW50aW1lQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgcmV0LCB1ZS5nZXRUYXNrTmFtZSgpKTsKKyAgICAgICAgcmMuc2V0UG9seVR5cGUodWUuZ2V0V3JhcHBlcigpLmdldFBvbHlUeXBlKCkpOworICAgICAgICBNYXAgbSA9IHVlLmdldFdyYXBwZXIoKS5nZXRBdHRyaWJ1dGVNYXAoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgICAgICByYy5zZXRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgKFN0cmluZykgZW50cnkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgbWFjcm9TdWJzKChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCksIGxvY2FsQXR0cmlidXRlcykpOworICAgICAgICB9CisgICAgICAgIHJjLmFkZFRleHQobWFjcm9TdWJzKHVlLmdldFdyYXBwZXIoKS5nZXRUZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxBdHRyaWJ1dGVzKSk7CisKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHVlLmdldFdyYXBwZXIoKS5nZXRDaGlsZHJlbigpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZSByID0gKFJ1bnRpbWVDb25maWd1cmFibGUpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFVua25vd25FbGVtZW50IHVua25vd25FbGVtZW50ID0gKFVua25vd25FbGVtZW50KSByLmdldFByb3h5KCk7CisgICAgICAgICAgICBTdHJpbmcgdGFnID0gdW5rbm93bkVsZW1lbnQuZ2V0VGFza1R5cGUoKTsKKyAgICAgICAgICAgIGlmICh0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRhZyA9IHRhZy50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWFjcm9EZWYuVGVtcGxhdGVFbGVtZW50IHRlbXBsYXRlRWxlbWVudCA9CisgICAgICAgICAgICAgICAgKE1hY3JvRGVmLlRlbXBsYXRlRWxlbWVudCkgZ2V0TnNFbGVtZW50cygpLmdldCh0YWcpOworICAgICAgICAgICAgaWYgKHRlbXBsYXRlRWxlbWVudCA9PSBudWxsIHx8IG5lc3RlZCkgeworICAgICAgICAgICAgICAgIFVua25vd25FbGVtZW50IGNoaWxkID0gY29weSh1bmtub3duRWxlbWVudCwgbmVzdGVkKTsKKyAgICAgICAgICAgICAgICByYy5hZGRDaGlsZChjaGlsZC5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgICAgIHJldC5hZGRDaGlsZChjaGlsZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlRWxlbWVudC5pc0ltcGxpY2l0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodW5rbm93bkVsZW1lbnRzLnNpemUoKSA9PSAwICYmICF0ZW1wbGF0ZUVsZW1lbnQuaXNPcHRpb25hbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIG5lc3RlZCBlbGVtZW50cyBmb3IgaW1wbGljaXQgZWxlbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRlbXBsYXRlRWxlbWVudC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1bmtub3duRWxlbWVudHMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgIGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBVbmtub3duRWxlbWVudCBjaGlsZAorICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3B5KChVbmtub3duRWxlbWVudCkgaS5uZXh0KCksIHRydWUpOworICAgICAgICAgICAgICAgICAgICByYy5hZGRDaGlsZChjaGlsZC5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgICAgICAgICByZXQuYWRkQ2hpbGQoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgcHJlc2VudEVsZW1lbnQgPQorICAgICAgICAgICAgICAgICAgICAoVW5rbm93bkVsZW1lbnQpIHByZXNlbnRFbGVtZW50cy5nZXQodGFnKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudEVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXRlbXBsYXRlRWxlbWVudC5pc09wdGlvbmFsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWlyZWQgbmVzdGVkIGVsZW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGVtcGxhdGVFbGVtZW50LmdldE5hbWUoKSArICIgbWlzc2luZyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlc2VudFRleHQgPQorICAgICAgICAgICAgICAgICAgICBwcmVzZW50RWxlbWVudC5nZXRXcmFwcGVyKCkuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMocHJlc2VudFRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJjLmFkZFRleHQobWFjcm9TdWJzKHByZXNlbnRUZXh0LCBsb2NhbEF0dHJpYnV0ZXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTGlzdCBsaXN0ID0gcHJlc2VudEVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25FbGVtZW50IGNoaWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3B5KChVbmtub3duRWxlbWVudCkgaS5uZXh0KCksIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmMuYWRkQ2hpbGQoY2hpbGQuZ2V0V3JhcHBlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hZGRDaGlsZChjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0ZW1wbGF0ZXMgaW5zdGFuY2UuCisgICAgICogQ29waWVzIHRoZSB1bmtub3duIGVsZW1lbnQsIHN1YnN0aXR1dGVzIHRoZSBhdHRyaWJ1dGVzLAorICAgICAqIGFuZCBjYWxscyBwZXJmb3JtIG9uIHRoZSB1bmtub3duIGVsZW1lbnQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBwcmVzZW50RWxlbWVudHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBnZXROc0VsZW1lbnRzKCk7CisgICAgICAgIHByb2Nlc3NUYXNrcygpOworICAgICAgICBsb2NhbEF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIFNldCBjb3B5S2V5cyA9IG5ldyBIYXNoU2V0KG1hcC5rZXlTZXQoKSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1hY3JvRGVmLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hY3JvRGVmLkF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoTWFjcm9EZWYuQXR0cmlidXRlKSBpLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG1hcC5nZXQoYXR0cmlidXRlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAiZGVzY3JpcHRpb24iLmVxdWFscyhhdHRyaWJ1dGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBhdHRyaWJ1dGUuZ2V0RGVmYXVsdCgpOworICAgICAgICAgICAgICAgIHZhbHVlID0gbWFjcm9TdWJzKHZhbHVlLCBsb2NhbEF0dHJpYnV0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhdHRyaWJ1dGUgIiArIGF0dHJpYnV0ZS5nZXROYW1lKCkgKyAiIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2FsQXR0cmlidXRlcy5wdXQoYXR0cmlidXRlLmdldE5hbWUoKSwgdmFsdWUpOworICAgICAgICAgICAgY29weUtleXMucmVtb3ZlKGF0dHJpYnV0ZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb3B5S2V5cy5jb250YWlucygiaWQiKSkgeworICAgICAgICAgICAgY29weUtleXMucmVtb3ZlKCJpZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChtYWNyb0RlZi5nZXRUZXh0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0VGV4dCA9ICBtYWNyb0RlZi5nZXRUZXh0KCkuZ2V0RGVmYXVsdCgpOworICAgICAgICAgICAgICAgIGlmICghbWFjcm9EZWYuZ2V0VGV4dCgpLmdldE9wdGlvbmFsKCkgJiYgZGVmYXVsdFRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgdGV4dCBtaXNzaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRleHQgPSBkZWZhdWx0VGV4dCA9PSBudWxsID8gIiIgOiBkZWZhdWx0VGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYWNyb0RlZi5nZXRUZXh0KCkuZ2V0VHJpbSgpKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jYWxBdHRyaWJ1dGVzLnB1dChtYWNyb0RlZi5nZXRUZXh0KCkuZ2V0TmFtZSgpLCB0ZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQudHJpbSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGUgXCIiICsgZ2V0VGFza05hbWUoKSArICJcIiBtYWNybyBkb2VzIG5vdCBzdXBwb3J0IgorICAgICAgICAgICAgICAgICAgICArICIgbmVzdGVkIHRleHQgZGF0YS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29weUtleXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVW5rbm93biBhdHRyaWJ1dGUiICsgKGNvcHlLZXlzLnNpemUoKSA+IDEgPyAicyAiIDogIiAiKQorICAgICAgICAgICAgICAgICsgY29weUtleXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbmVlZCB0byBzZXQgdGhlIHByb2plY3Qgb24gdW5rbm93biBlbGVtZW50CisgICAgICAgIFVua25vd25FbGVtZW50IGMgPSBjb3B5KG1hY3JvRGVmLmdldE5lc3RlZFRhc2soKSwgZmFsc2UpOworICAgICAgICBjLmluaXQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMucGVyZm9ybSgpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaWYgKG1hY3JvRGVmLmdldEJhY2tUcmFjZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgUHJvamVjdEhlbHBlci5hZGRMb2NhdGlvblRvQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGV4LCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXguc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwcmVzZW50RWxlbWVudHMgPSBudWxsOworICAgICAgICAgICAgbG9jYWxBdHRyaWJ1dGVzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01ha2VVcmwuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01ha2VVcmwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJjMzVlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFrZVVybC5qYXZhCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBUaGlzIHRhc2sgdGFrZXMgZmlsZSBhbmQgdHVybnMgdGhlbSBpbnRvIGEgVVJMLCB3aGljaCBpdCB0aGVuIGFzc2lnbnMKKyAqIHRvIGEgcHJvcGVydHkuIFVzZSB3aGVuIGZvciBzZXR0aW5nIHVwIFJNSSBjb2RlYmFzZXMuCisgKiA8cC8+CisgKiBuZXN0ZWQgZmlsZXNldHMgYXJlIHN1cHBvcnRlZDsgaWYgcHJlc2VudCwgdGhlc2UgYXJlIHR1cm5lZCBpbnRvIHRoZQorICogdXJsIHdpdGggdGhlIGdpdmVuIHNlcGFyYXRvciBiZXR3ZWVuIHRoZW0gKGRlZmF1bHQgPSAiICIpLgorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iY29yZSIgbmFtZT0ibWFrZXVybCIKKyAqLworCitwdWJsaWMgY2xhc3MgTWFrZVVybCBleHRlbmRzIFRhc2sgeworCisgICAgLyoqCisgICAgICogbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIGEgZmlsZSB0byB0dXJuIGludG8gYSBVUkwKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZmlsZTsKKworICAgIC8qKgorICAgICAqIHNlcGFyYXRvciBjaGFyCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VwYXJhdG9yID0gIiAiOworCisgICAgLyoqCisgICAgICogZmlsZXNldHMgb2YgbmVzdGVkIGZpbGVzIHRvIGFkZCB0byB0aGlzIHVybAorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBmaWxlc2V0cyA9IG5ldyBMaW5rZWRMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBwYXRocyB0byBhZGQKKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgcGF0aHMgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgLyoqCisgICAgICogdmFsaWRhdGlvbiBmbGFnCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlID0gdHJ1ZTsKKworICAgIC8vIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncworICAgIC8qKiBNaXNzaW5nIGZpbGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9NSVNTSU5HX0ZJTEUgPSAiQSBzb3VyY2UgZmlsZSBpcyBtaXNzaW5nIDoiOworICAgIC8qKiBObyBwcm9wZXJ0eSBkZWZpbmVkICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fUFJPUEVSVFkgPSAiTm8gcHJvcGVydHkgZGVmaW5lZCI7CisgICAgLyoqIE5vIGZpbGVzIGRlZmluZWQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19GSUxFUyA9ICJObyBmaWxlcyBkZWZpbmVkIjsKKworICAgIC8qKgorICAgICAqIHNldCB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIGZpbGwgd2l0aCB0aGUgVVJMCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhlIG5hbWUgb2YgYSBmaWxlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIGEgVVJMCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBiZSBjb252ZXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhIGZpbGVzZXQgb2YgamFyIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIFVSTCwgZWFjaAorICAgICAqIHNlcGFyYXRlZCBieSB0aGUgc2VwYXJhdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZXNldCB0aGUgZmlsZXNldCB0byBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlU2V0KEZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGQoZmlsZXNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHRoZSBzZXBhcmF0b3IgZm9yIHRoZSBtdWx0aS11cmwgb3B0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcGFyYXRvciB0aGUgc2VwYXJhdG9yIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHNlcGFyYXRvcikgeworICAgICAgICB0aGlzLnNlcGFyYXRvciA9IHNlcGFyYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhpcyBmbGFnIHRvIHRyaWdnZXIgdmFsaWRhdGlvbiB0aGF0IGV2ZXJ5IG5hbWVkIGZpbGUgZXhpc3RzLgorICAgICAqIE9wdGlvbmFsOiBkZWZhdWx0PXRydWUKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWxpZGF0ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGJvb2xlYW4gdmFsaWRhdGUpIHsKKyAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHZhbGlkYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIHBhdGggdG8gdGhlIFVSTC4gQWxsIGVsZW1lbnRzIGluIHRoZSBwYXRoCisgICAgICogd2lsbCBiZSBjb252ZXJ0ZWQgdG8gaW5kaXZpZHVhbCBVUkwgZW50cmllcworICAgICAqCisgICAgICogQHBhcmFtIHBhdGggYSBwYXRoIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBwYXRoKSB7CisgICAgICAgIHBhdGhzLmFkZChwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb252ZXJ0IHRoZSBmaWxlc2V0cyB0byB1cmxzLgorICAgICAqCisgICAgICogQHJldHVybiBudWxsIGZvciBubyBmaWxlcworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVzZXRzVG9VUkwoKSB7CisgICAgICAgIGlmIChmaWxlc2V0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBTdHJpbmdCdWZmZXIgdXJscyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgTGlzdEl0ZXJhdG9yIGxpc3QgPSBmaWxlc2V0cy5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGxpc3QuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBGaWxlU2V0IHNldCA9IChGaWxlU2V0KSBsaXN0Lm5leHQoKTsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lciA9IHNldC5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHNjYW5uZXIuZ2V0QmFzZWRpcigpLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVGaWxlKGYpOworICAgICAgICAgICAgICAgIFN0cmluZyBhc1VybCA9IHRvVVJMKGYpOworICAgICAgICAgICAgICAgIHVybHMuYXBwZW5kKGFzVXJsKTsKKyAgICAgICAgICAgICAgICBsb2coYXNVcmwsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICB1cmxzLmFwcGVuZChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9hdCB0aGlzIHBvaW50IHRoZXJlIGlzIG9uZSB0cmFpbGluZyBzcGFjZSB0byByZW1vdmUsIGlmIHRoZSBsaXN0IGlzIG5vdCBlbXB0eS4KKyAgICAgICAgcmV0dXJuIHN0cmlwVHJhaWxpbmdTZXBhcmF0b3IodXJscywgY291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnZlcnQgdGhlIHN0cmluZyBidWZmZXIgdG8gYSBzdHJpbmcsIHBvdGVudGlhbGx5IHN0cmlwcGluZworICAgICAqIG91dCBhbnkgdHJhaWxpbmcgc2VwYXJhdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJscyAgVVJMIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgVVJMIGVudHJpZXMKKyAgICAgKiBAcmV0dXJuIHRyaW1tZWQgc3RyaW5nLCBvciBlbXB0eSBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdHJpcFRyYWlsaW5nU2VwYXJhdG9yKFN0cmluZ0J1ZmZlciB1cmxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgIHVybHMuZGVsZXRlKHVybHMubGVuZ3RoKCkgLSBzZXBhcmF0b3IubGVuZ3RoKCksIHVybHMubGVuZ3RoKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodXJscyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGNvbnZlcnQgYWxsIHBhdGhzIHRvIFVSTHMKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhdGhzIGFzIGEgc2VwYXJhdGVkIGxpc3Qgb2YgVVJMcworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGhzVG9VUkwoKSB7CisgICAgICAgIGlmIChwYXRocy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBTdHJpbmdCdWZmZXIgdXJscyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgTGlzdEl0ZXJhdG9yIGxpc3QgPSBwYXRocy5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGxpc3QuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBQYXRoIHBhdGggPSAoUGF0aCkgbGlzdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmdbXSBlbGVtZW50cyA9IHBhdGgubGlzdCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGVsZW1lbnRzW2ldKTsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZUZpbGUoZik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFzVXJsID0gdG9VUkwoZik7CisgICAgICAgICAgICAgICAgdXJscy5hcHBlbmQoYXNVcmwpOworICAgICAgICAgICAgICAgIGxvZyhhc1VybCwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIHVybHMuYXBwZW5kKHNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL2F0IHRoaXMgcG9pbnQgdGhlcmUgaXMgb25lIHRyYWlsaW5nIHNwYWNlIHRvIHJlbW92ZSwgaWYgdGhlIGxpc3QgaXMgbm90IGVtcHR5LgorICAgICAgICByZXR1cm4gc3RyaXBUcmFpbGluZ1NlcGFyYXRvcih1cmxzLCBjb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdmVyaWZ5IHRoYXQgdGhlIGZpbGUgZXhpc3RzLCBpZiB7QGxpbmsgI3ZhbGlkYXRlfSBpcyBzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlVG9DaGVjayBmaWxlIHRoYXQgbWF5IG5lZWQgdG8gZXhpc3QKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHdpdGggdGV4dCBiZWdpbm5pbmcge0BsaW5rICNFUlJPUl9NSVNTSU5HX0ZJTEV9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRmlsZShGaWxlIGZpbGVUb0NoZWNrKSB7CisgICAgICAgIGlmICh2YWxpZGF0ZSAmJiAhZmlsZVRvQ2hlY2suZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9NSVNTSU5HX0ZJTEUgKyBmaWxlVG9DaGVjay50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgdXJsCisgICAgICoKKyAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgLy9ub3cgZXhpdCBoZXJlIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IHNldAorICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KHByb3BlcnR5KSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHVybDsKKyAgICAgICAgU3RyaW5nIGZpbGVzZXRVUkwgPSBmaWxlc2V0c1RvVVJMKCk7CisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlRmlsZShmaWxlKTsKKyAgICAgICAgICAgIHVybCA9IHRvVVJMKGZpbGUpOworICAgICAgICAgICAgLy9hbmQgYWRkIGFueSBmaWxlcyBpZiBhbHNvIGRlZmluZWQKKyAgICAgICAgICAgIGlmIChmaWxlc2V0VVJMLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHVybCA9IHVybCArIHNlcGFyYXRvciArIGZpbGVzZXRVUkw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cmwgPSBmaWxlc2V0VVJMOworICAgICAgICB9CisgICAgICAgIC8vYWRkIHBhdGggVVJMcworICAgICAgICBTdHJpbmcgcGF0aFVSTCA9IHBhdGhzVG9VUkwoKTsKKyAgICAgICAgaWYgKHBhdGhVUkwubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAodXJsLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHVybCA9IHVybCArIHNlcGFyYXRvciArIHBhdGhVUkw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVybCA9IHBhdGhVUkw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJTZXR0aW5nICIgKyBwcm9wZXJ0eSArICIgdG8gVVJMICIgKyB1cmwsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHVybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hlY2sgZm9yIGVycm9ycworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgd2UgYXJlIG5vdCBjb25maWd1cmVkIHJpZ2h0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgICAvL3ZhbGlkYXRpb24KKyAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19QUk9QRVJUWSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiBmaWxlc2V0cy5pc0VtcHR5KCkgJiYgcGF0aHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTk9fRklMRVMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY29udmVydCBhIGZpbGUgdG8gYSBVUkw7CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZVRvQ29udmVydAorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgY29udmVydGVkIHRvIGEgVVJMCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9VUkwoRmlsZSBmaWxlVG9Db252ZXJ0KSB7CisgICAgICAgIFN0cmluZyB1cmw7CisgICAgICAgIC8vY3JlYXRlIHRoZSBVUkwKKyAgICAgICAgLy9hbnQgZXF1aXZhbGVudCBvZiAgZmlsZVRvQ29udmVydC50b1VSSSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKKyAgICAgICAgdXJsID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLnRvVVJJKGZpbGVUb0NvbnZlcnQuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIHJldHVybiB1cmw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTAwNjNlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3QuamF2YQpAQCAtMCwwICsxLDEwNzQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBIb2xkcyB0aGUgZGF0YSBvZiBhIGphciBtYW5pZmVzdC4KKyAqCisgKiBNYW5pZmVzdHMgYXJlIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlCisgKiB7QGxpbmsgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvamFyL2phci5odG1sIj5KYXIKKyAqIGZpbGUgc3BlY2lmaWNhdGlvbi48L2E+fS4KKyAqIFNwZWNpZmljYWxseSwgYSBtYW5pZmVzdCBlbGVtZW50IGNvbnNpc3RzIG9mCisgKiBhIHNldCBvZiBhdHRyaWJ1dGVzIGFuZCBzZWN0aW9ucy4gVGhlc2Ugc2VjdGlvbnMgaW4gdHVybiBtYXkgY29udGFpbgorICogYXR0cmlidXRlcy4gTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhpcyBtYXkgcmVzdWx0IGluIG1hbmlmZXN0IGxpbmVzCisgKiBncmVhdGVyIHRoYW4gNzIgYnl0ZXMgYmVpbmcgd3JhcHBlZCBhbmQgY29udGludWVkIG9uIHRoZSBuZXh0CisgKiBsaW5lLiBJZiBhbiBhcHBsaWNhdGlvbiBjYW4gbm90IGhhbmRsZSB0aGUgY29udGludWF0aW9uIG1lY2hhbmlzbSwgaXQKKyAqIGlzIGEgZGVmZWN0IGluIHRoZSBhcHBsaWNhdGlvbiwgbm90IHRoaXMgdGFzay4KKyAqCisgKgorICogQHNpbmNlIEFudCAxLjQKKyAqLworcHVibGljIGNsYXNzIE1hbmlmZXN0IHsKKyAgICAvKiogVGhlIHN0YW5kYXJkIG1hbmlmZXN0IHZlcnNpb24gaGVhZGVyICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX01BTklGRVNUX1ZFUlNJT04KKyAgICAgICAgPSAiTWFuaWZlc3QtVmVyc2lvbiI7CisKKyAgICAvKiogVGhlIHN0YW5kYXJkIFNpZ25hdHVyZSBWZXJzaW9uIGhlYWRlciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9TSUdOQVRVUkVfVkVSU0lPTgorICAgICAgICA9ICJTaWduYXR1cmUtVmVyc2lvbiI7CisKKyAgICAvKiogVGhlIE5hbWUgQXR0cmlidXRlIGlzIHRoZSBmaXJzdCBpbiBhIG5hbWVkIHNlY3Rpb24gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJOYW1lIjsKKworICAgIC8qKiBUaGUgRnJvbSBIZWFkZXIgaXMgZGlzYWxsb3dlZCBpbiBhIE1hbmlmZXN0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZST00gPSAiRnJvbSI7CisKKyAgICAvKiogVGhlIENsYXNzLVBhdGggSGVhZGVyIGlzIHNwZWNpYWwgLSBpdCBjYW4gYmUgZHVwbGljYXRlZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9DTEFTU1BBVEggPSAiQ2xhc3MtUGF0aCI7CisKKyAgICAvKiogRGVmYXVsdCBNYW5pZmVzdCB2ZXJzaW9uIGlmIG9uZSBpcyBub3Qgc3BlY2lmaWVkICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCAgU3RyaW5nIERFRkFVTFRfTUFOSUZFU1RfVkVSU0lPTiA9ICIxLjAiOworCisgICAgLyoqIFRoZSBtYXggbGVuZ3RoIG9mIGEgbGluZSBpbiBhIE1hbmlmZXN0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0xJTkVfTEVOR1RIID0gNzI7CisKKyAgICAvKioKKyAgICAgKiBNYXggbGVuZ3RoIG9mIGEgbGluZSBzZWN0aW9uIHdoaWNoIGlzIGNvbnRpbnVlZC4gTmVlZCB0byBhbGxvdworICAgICAqIGZvciB0aGUgQ1JMRi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU0VDVElPTl9MRU5HVEggPSBNQVhfTElORV9MRU5HVEggLSAyOworCisgICAgLyoqIFRoZSBFbmQtT2YtTGluZSBtYXJrZXIgaW4gbWFuaWZlc3RzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU9MID0gIlxyXG4iOworICAgIC8qKiBFcnJvciBmb3IgYXR0cmlidXRlcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0ZST01fRk9SQklEREVOID0gIk1hbmlmZXN0IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBzdGFydCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJ3aXRoIFwiIiArIEFUVFJJQlVURV9GUk9NICsgIlwiIGluIFwiIjsKKworICAgIC8qKiBFbmNvZGluZyB0byBiZSB1c2VkIGZvciBKQVIgZmlsZXMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VOQ09ESU5HID0gIlVURi04IjsKKworICAgIC8qKgorICAgICAqIEFuIGF0dHJpYnV0ZSBmb3IgdGhlIG1hbmlmZXN0LgorICAgICAqIFRob3NlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IG5lc3RlZCBpbnRvIGEgc2VjdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSAiTWFpbiIgc2VjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBuYW1lIHRvIGhhdmUgdGhlIHZhbHVlIHN0YXJ0aW5nIG9uIHRoZSBzYW1lCisgICAgICAgICAqIGxpbmUgYXMgdGhlIG5hbWUuIFRoaXMgdG8gc3RheSB1bmRlciA3MiBieXRlcyB0b3RhbCBsaW5lIGxlbmd0aAorICAgICAgICAgKiAoaW5jbHVkaW5nIENSTEYpLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OQU1FX1ZBTFVFX0xFTkdUSCA9IDY4OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhlIGphciBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKiBJbiB0aGlzIGNhc2UgdGhlIGZpcnN0IGxpbmUgd2lsbCBoYXZlIDc0IGJ5dGVzIHRvdGFsIGxpbmUgbGVuZ3RoCisgICAgICAgICAqIChpbmNsdWRpbmcgQ1JMRikuIFRoaXMgY29uZmxpY3RzIHdpdGggdGhlIDcyIGJ5dGVzIHRvdGFsIGxpbmUgbGVuZ3RoCisgICAgICAgICAqIG1heCwgYnV0IGlzIHRoZSBvbmx5IHBvc3NpYmxlIGNvbmNsdXNpb24gZnJvbSB0aGUgbWFuaWZlc3Qgc3BlY2lmaWNhdGlvbiwgaWYKKyAgICAgICAgICogbmFtZXMgd2l0aCA3MCBieXRlcyBsZW5ndGggYXJlIGFsbG93ZWQsIGhhdmUgdG8gYmUgb24gdGhlIGZpcnN0IGxpbmUsIGFuZAorICAgICAgICAgKiBoYXZlIHRvIGJlIGZvbGxvd2VkIGJ5ICI6ICIuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05BTUVfTEVOR1RIID0gNzA7CisKKyAgICAgICAgLyoqIFRoZSBhdHRyaWJ1dGUncyBuYW1lICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgICAgIC8qKiBUaGUgYXR0cmlidXRlJ3MgdmFsdWUgKi8KKyAgICAgICAgcHJpdmF0ZSBWZWN0b3IgdmFsdWVzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgbXVsdGl2YWx1ZWQgYXR0cmlidXRlcywgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgKiBjdXJyZW50bHkgYmVpbmcgZGVmaW5lZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IGN1cnJlbnRJbmRleCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdCBhbiBlbXB0eSBhdHRyaWJ1dGUgKi8KKyAgICAgICAgcHVibGljIEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYW4gYXR0cmlidXRlIGJ5IHBhcnNpbmcgYSBsaW5lIGZyb20gdGhlIE1hbmlmZXN0CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCB2YWx1ZQorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIGlmIHRoZSBsaW5lIGlzIG5vdCB2YWxpZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgbGluZSkgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHBhcnNlKGxpbmUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdCBhIG1hbmlmZXN0IGJ5IHNwZWNpZnlpbmcgaXRzIG5hbWUgYW5kIHZhbHVlCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhdHRyaWJ1dGUncyBuYW1lCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgQXR0cmlidXRlJ3MgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUKKyAgICAgICAgICogQHJldHVybiBhIGhhc2hjb2RlIGJhc2VkIG9uIHRoZSBrZXkgYW5kIHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgaGFzaENvZGUgPSAwOworCisgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFzaENvZGUgKz0gZ2V0S2V5KCkuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFzaENvZGUgKz0gdmFsdWVzLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gaGFzaENvZGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIHJocyB0aGUgb2JqZWN0IHRvIGNoZWNrIGZvciBlcXVhbGl0eS4KKyAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscworICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGtleSBhbmQgdmFsdWVzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisgICAgICAgICAgICBpZiAocmhzID09IG51bGwgfHwgcmhzLmdldENsYXNzKCkgIT0gZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJocyA9PSB0aGlzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEF0dHJpYnV0ZSByaHNBdHRyaWJ1dGUgPSAoQXR0cmlidXRlKSByaHM7CisgICAgICAgICAgICBTdHJpbmcgbGhzS2V5ID0gZ2V0S2V5KCk7CisgICAgICAgICAgICBTdHJpbmcgcmhzS2V5ID0gcmhzQXR0cmlidXRlLmdldEtleSgpOworICAgICAgICAgICAgaWYgKChsaHNLZXkgPT0gbnVsbCAmJiByaHNLZXkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgfHwgKGxoc0tleSAhPSBudWxsICYmICFsaHNLZXkuZXF1YWxzKHJoc0tleSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdmFsdWVzLmVxdWFscyhyaHNBdHRyaWJ1dGUudmFsdWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZSBhIGxpbmUgaW50byBuYW1lIGFuZCB2YWx1ZSBwYWlycworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBiZSBwYXJzZWQKKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGUgbGluZSBkb2VzIG5vdCBjb250YWluIGEgY29sb24KKyAgICAgICAgICogc2VwYXJhdGluZyB0aGUgbmFtZSBhbmQgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBsaW5lKSB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24geworICAgICAgICAgICAgaW50IGluZGV4ID0gbGluZS5pbmRleE9mKCI6ICIpOworICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKCJNYW5pZmVzdCBsaW5lIFwiIiArIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgaXMgbm90IHZhbGlkIGFzIGl0IGRvZXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgKyAiY29udGFpbiBhIG5hbWUgYW5kIGEgdmFsdWUgc2VwYXJhdGVkIGJ5ICc6ICcgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgc2V0VmFsdWUobGluZS5zdWJzdHJpbmcoaW5kZXggKyAyKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBBdHRyaWJ1dGUncyBuYW1lOyByZXF1aXJlZAorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlJ3MgbmFtZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIEF0dHJpYnV0ZSdzIG5hbWUKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlJ3MgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgYXR0cmlidXRlJ3MgS2V5IC0gaXRzIG5hbWUgaW4gbG93ZXIgY2FzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlJ3Mga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgQXR0cmlidXRlJ3MgdmFsdWU7IHJlcXVpcmVkCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSB2YWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZEVsZW1lbnQodmFsdWUpOworICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IHZhbHVlcy5zaXplKCkgLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0RWxlbWVudEF0KHZhbHVlLCBjdXJyZW50SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgQXR0cmlidXRlJ3MgdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGZ1bGxWYWx1ZSA9ICIiOworICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZ2V0VmFsdWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGZ1bGxWYWx1ZSArPSB2YWx1ZSArICIgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmdWxsVmFsdWUudHJpbSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIG5ldyB2YWx1ZSB0byB0aGlzIGF0dHJpYnV0ZSAtIG1ha2luZyBpdCBtdWx0aXZhbHVlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBhdHRyaWJ1dGUncyBhZGRpdGlvbmFsIHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGN1cnJlbnRJbmRleCsrOworICAgICAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhbGwgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVzLmVsZW1lbnRzKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgY29udGludWF0aW9uIGxpbmUgZnJvbSB0aGUgTWFuaWZlc3QgZmlsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogV2hlbiBsaW5lcyBhcmUgdG9vIGxvbmcgaW4gYSBtYW5pZmVzdCwgdGhleSBhcmUgY29udGludWVkIG9uIHRoZQorICAgICAgICAgKiBuZXh0IGxpbmUgYnkgc3RhcnRpbmcgd2l0aCBhIHNwYWNlLiBUaGlzIG1ldGhvZCBhZGRzIHRoZSBjb250aW51YXRpb24KKyAgICAgICAgICogZGF0YSB0byB0aGUgYXR0cmlidXRlIHZhbHVlIGJ5IHNraXBwaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsaW5lIHRoZSBjb250aW51YXRpb24gbGluZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbnRpbnVhdGlvbihTdHJpbmcgbGluZSkgeworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IChTdHJpbmcpIHZhbHVlcy5lbGVtZW50QXQoY3VycmVudEluZGV4KTsKKyAgICAgICAgICAgIHNldFZhbHVlKGN1cnJlbnRWYWx1ZSArIGxpbmUuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgYXR0cmlidXRlIG91dCB0byBhIHByaW50IHdyaXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHdyaXRlciB0aGUgV3JpdGVyIHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgaXMgd3JpdHRlbgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgY2Fubm90IGJlIHdyaXR0ZW4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKFByaW50V3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGdldFZhbHVlcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUod3JpdGVyLCAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGEgc2luZ2xlIGF0dHJpYnV0ZSB2YWx1ZSBvdXQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHdyaXRlciB0aGUgV3JpdGVyIHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgaXMgd3JpdHRlbgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgY2Fubm90IGJlIHdyaXR0ZW4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVZhbHVlKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IG5hbWUuZ2V0Qnl0ZXMoSkFSX0VOQ09ESU5HKS5sZW5ndGg7CisgICAgICAgICAgICBpZiAobmFtZUxlbmd0aCA+IE1BWF9OQU1FX1ZBTFVFX0xFTkdUSCkgeworICAgICAgICAgICAgICAgIGlmIChuYW1lTGVuZ3RoID4gTUFYX05BTUVfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIG1hbmlmZXN0IGxpbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICI6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChuYW1lICsgIjogIiArIEVPTCk7CisgICAgICAgICAgICAgICAgbGluZSA9ICIgIiArIHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gbmFtZSArICI6ICIgKyB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChsaW5lLmdldEJ5dGVzKEpBUl9FTkNPRElORykubGVuZ3RoID4gTUFYX1NFQ1RJT05fTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBNQVhfTElORV9MRU5HVEggYnl0ZSBzZWN0aW9uCisgICAgICAgICAgICAgICAgaW50IGJyZWFrSW5kZXggPSBNQVhfU0VDVElPTl9MRU5HVEg7CisgICAgICAgICAgICAgICAgaWYgKGJyZWFrSW5kZXggPj0gbGluZS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICBicmVha0luZGV4ID0gbGluZS5sZW5ndGgoKSAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uID0gbGluZS5zdWJzdHJpbmcoMCwgYnJlYWtJbmRleCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHNlY3Rpb24uZ2V0Qnl0ZXMoSkFSX0VOQ09ESU5HKS5sZW5ndGggPiBNQVhfU0VDVElPTl9MRU5HVEgKKyAgICAgICAgICAgICAgICAgICAgICYmIGJyZWFrSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrSW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmUuc3Vic3RyaW5nKDAsIGJyZWFrSW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnJlYWtJbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIG1hbmlmZXN0IGxpbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIjogIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KHNlY3Rpb24gKyBFT0wpOworICAgICAgICAgICAgICAgIGxpbmUgPSAiICIgKyBsaW5lLnN1YnN0cmluZyhicmVha0luZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludChsaW5lICsgRU9MKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWFuaWZlc3Qgc2VjdGlvbiAtIHlvdSBjYW4gbmVzdCBhdHRyaWJ1dGUgZWxlbWVudHMgaW50byBzZWN0aW9ucy4KKyAgICAgKiBBIHNlY3Rpb24gY29uc2lzdHMgb2YgYSBzZXQgb2YgYXR0cmlidXRlIHZhbHVlcywKKyAgICAgKiBzZXBhcmF0ZWQgZnJvbSBvdGhlciBzZWN0aW9ucyBieSBhIGJsYW5rIGxpbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWN0aW9uIHsKKyAgICAgICAgLyoqIFdhcm5pbmdzIGZvciB0aGlzIHNlY3Rpb24gKi8KKyAgICAgICAgcHJpdmF0ZSBWZWN0b3Igd2FybmluZ3MgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZWN0aW9uJ3MgbmFtZSBpZiBhbnkuIFRoZSBtYWluIHNlY3Rpb24gaW4gYQorICAgICAgICAgKiBtYW5pZmVzdCBpcyB1bm5hbWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICAgICAgLyoqIFRoZSBzZWN0aW9uJ3MgYXR0cmlidXRlcy4qLworICAgICAgICBwcml2YXRlIEhhc2h0YWJsZSBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgIC8qKiBJbmRleCB1c2VkIHRvIHJldGFpbiB0aGUgYXR0cmlidXRlIG9yZGVyaW5nICovCisgICAgICAgIHByaXZhdGUgVmVjdG9yIGF0dHJpYnV0ZUluZGV4ID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VjdGlvbjsgb3B0aW9uYWwgLWRlZmF1bHQgaXMgdGhlIG1haW4gc2VjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIHNlY3Rpb24ncyBuYW1lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgU2VjdGlvbidzIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHNlY3Rpb24ncyBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVhZCBhIHNlY3Rpb24gdGhyb3VnaCBhIHJlYWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyIGZyb20gd2hpY2ggdGhlIHNlY3Rpb24gaXMgcmVhZAorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBuZXh0IHNlY3Rpb24gaWYgaXQgaGFzIGJlZW4gcmVhZCBhcworICAgICAgICAgKiAgICAgICAgIHBhcnQgb2YgdGhpcyBzZWN0aW9uIC0gVGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlCisgICAgICAgICAqICAgICAgICAgTWFuaWZlc3QgaXMgbWFsZm9ybWVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIGlmIHRoZSBzZWN0aW9uIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcKKyAgICAgICAgICogICAgICAgICB0byB0aGUgSkFSIHNwZWMKKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc2VjdGlvbiBjYW5ub3QgYmUgcmVhZCBmcm9tIHRoZSByZWFkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWQoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKQorICAgICAgICAgICAgIHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCB8fCBsaW5lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBjb250aW51YXRpb24gb24gdGhlIGZpcnN0IGxpbmUgaXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBvZiB0aGUgbmFtZSAtIGNvbmNhdGVuYXRlIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIGFuZCB0aGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gbGluZS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYW5pZmVzdEV4Y2VwdGlvbigiQ2FuJ3Qgc3RhcnQgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhdHRyaWJ1dGUgd2l0aCBhIGNvbnRpbnVhdGlvbiBsaW5lICIgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5hZGRDb250aW51YXRpb24obGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKGxpbmUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZVJlYWRBaGVhZCA9IGFkZEF0dHJpYnV0ZUFuZENoZWNrKGF0dHJpYnV0ZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2ggYXR0cmlidXRlIGluIGNhc2Ugb2YgbXVsdGl2YWx1ZWQgYXR0cmlidXRlcy4KKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lUmVhZEFoZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lUmVhZEFoZWFkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1lcmdlIGluIGFub3RoZXIgc2VjdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VjdGlvbiB0aGUgc2VjdGlvbiB0byBiZSBtZXJnZWQgd2l0aCB0aGlzIG9uZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGUgc2VjdGlvbnMgY2Fubm90IGJlIG1lcmdlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG1lcmdlKFNlY3Rpb24gc2VjdGlvbikgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwgJiYgc2VjdGlvbi5nZXROYW1lKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IG5hbWUgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICEobmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNlY3Rpb24uZ2V0TmFtZSgpKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFuaWZlc3RFeGNlcHRpb24oIlVuYWJsZSB0byBtZXJnZSBzZWN0aW9ucyAiCisgICAgICAgICAgICAgICAgICAgICsgIndpdGggZGlmZmVyZW50IG5hbWVzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBzZWN0aW9uLmdldEF0dHJpYnV0ZUtleXMoKTsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBjbGFzc3BhdGhBdHRyaWJ1dGUgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gc2VjdGlvbi5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSSUJVVEVfQ0xBU1NQQVRIKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NwYXRoQXR0cmlidXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aEF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aEF0dHJpYnV0ZS5zZXROYW1lKEFUVFJJQlVURV9DTEFTU1BBVEgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGNwZSA9IGF0dHJpYnV0ZS5nZXRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNwZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgY3BlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhBdHRyaWJ1dGUuYWRkVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1lcmdlIGZpbGUgYWx3YXlzIHdpbnMKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVBdHRyaWJ1dGUoYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGhBdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHRoZSBtZXJnZSBmaWxlICphbHdheXMqIHdpbnMsIGV2ZW4gZm9yIENsYXNzLVBhdGgKKyAgICAgICAgICAgICAgICBzdG9yZUF0dHJpYnV0ZShjbGFzc3BhdGhBdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZGQgaW4gdGhlIHdhcm5pbmdzCisgICAgICAgICAgICBFbnVtZXJhdGlvbiB3YXJuRW51bSA9IHNlY3Rpb24ud2FybmluZ3MuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlICh3YXJuRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFkZEVsZW1lbnQod2FybkVudW0ubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgdGhlIHNlY3Rpb24gb3V0IHRvIGEgcHJpbnQgd3JpdGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gd3JpdGVyIHRoZSBXcml0ZXIgdG8gd2hpY2ggdGhlIHNlY3Rpb24gaXMgd3JpdHRlbgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzZWN0aW9uIGNhbm5vdCBiZSB3cml0dGVuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShQcmludFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlIG5hbWVBdHRyID0gbmV3IEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgbmFtZSk7CisgICAgICAgICAgICAgICAgbmFtZUF0dHIud3JpdGUod3JpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBdHRyaWJ1dGVLZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZShrZXkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS53cml0ZSh3cml0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50KEVPTCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgYXR0cmlidXRlIG9mIHRoZSBzZWN0aW9uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICogQHJldHVybiBhIE1hbmlmZXN0LkF0dHJpYnV0ZSBpbnN0YW5jZSBpZiB0aGUgYXR0cmlidXRlIGlzCisgICAgICAgICAqICAgICAgICAgc2luZ2xlLXZhbHVlZCwgb3RoZXJ3aXNlIGEgVmVjdG9yIG9mIE1hbmlmZXN0LkF0dHJpYnV0ZQorICAgICAgICAgKiAgICAgICAgIGluc3RhbmNlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKEF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSBrZXlzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGFuIEVudW1lcmF0aW9uIG9mIFN0cmluZ3MsIGVhY2ggc3RyaW5nIGJlaW5nIHRoZSBsb3dlciBjYXNlCisgICAgICAgICAqICAgICAgICAga2V5IG9mIGFuIGF0dHJpYnV0ZSBvZiB0aGUgc2VjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVLZXlzKCkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZUluZGV4LmVsZW1lbnRzKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdpdGggdGhlIG5hbWUgZ2l2ZW4uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgcmV0dXJuZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIG9yIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdAorICAgICAgICAgKiAgICAgICAgIGluIHRoZSBzZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGF0dHJpYnV0ZSBmcm9tIHRoZSBzZWN0aW9uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgcmVtb3ZlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBhdHRyaWJ1dGVJbmRleC5yZW1vdmVFbGVtZW50KGtleSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgc2VjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHRvIGJlIGFkZGVkIHRvIHRoZSBzZWN0aW9uCisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gTWFuaWZlc3RFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgdmFsaWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkQXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisgICAgICAgICAgICAgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBjaGVjayA9IGFkZEF0dHJpYnV0ZUFuZENoZWNrKGF0dHJpYnV0ZSk7CisgICAgICAgICAgICBpZiAoY2hlY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3BlY2lmeSB0aGUgc2VjdGlvbiBuYW1lIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhlIFwibmFtZVwiIGF0dHJpYnV0ZSBvZiB0aGUgPHNlY3Rpb24+IGVsZW1lbnQgcmF0aGVyICIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhhbiB1c2luZyBhIFwiTmFtZVwiIG1hbmlmZXN0IGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIHNlY3Rpb24KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHRvIGJlIGFkZGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlmIGl0IGlzIGEgbmFtZQorICAgICAgICAgKiAgICAgICAgIGF0dHJpYnV0ZSAtIG51bGwgb3RoZXIgd2lzZQorICAgICAgICAgKgorICAgICAgICAgKiBAZXhjZXB0aW9uIE1hbmlmZXN0RXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGUgYWxyZWFkeQorICAgICAgICAgKiAgICAgICAgICAgIGV4aXN0cyBpbiB0aGlzIHNlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGFkZEF0dHJpYnV0ZUFuZENoZWNrKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisgICAgICAgICAgICAgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0TmFtZSgpID09IG51bGwgfHwgYXR0cmlidXRlLmdldFZhbHVlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXR0cmlidXRlcyBtdXN0IGhhdmUgbmFtZSBhbmQgdmFsdWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0S2V5KCkuZXF1YWxzSWdub3JlQ2FzZShBVFRSSUJVVEVfTkFNRSkpIHsKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5hZGRFbGVtZW50KCJcIiIgKyBBVFRSSUJVVEVfTkFNRSArICJcIiBhdHRyaWJ1dGVzICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIG5vdCBvY2N1ciBpbiB0aGUgbWFpbiBzZWN0aW9uIGFuZCBtdXN0IGJlIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICsgImZpcnN0IGVsZW1lbnQgaW4gYWxsIG90aGVyIHNlY3Rpb25zOiBcIiIKKyAgICAgICAgICAgICAgICAgICAgKyBhdHRyaWJ1dGUuZ2V0TmFtZSgpICsgIjogIiArIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpICsgIlwiIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXR0cmlidXRlLmdldEtleSgpLnN0YXJ0c1dpdGgoQVRUUklCVVRFX0ZST00udG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5hZGRFbGVtZW50KEVSUk9SX0ZST01fRk9SQklEREVOCisgICAgICAgICAgICAgICAgICAgICsgYXR0cmlidXRlLmdldE5hbWUoKSArICI6ICIgKyBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSArICJcIiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjbGFzc3BhdGggYXR0cmlidXRlcyBnbyBpbnRvIGEgdmVjdG9yCisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlS2V5LmVxdWFsc0lnbm9yZUNhc2UoQVRUUklCVVRFX0NMQVNTUEFUSCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGNsYXNzcGF0aEF0dHJpYnV0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChhdHRyaWJ1dGVLZXkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGhBdHRyaWJ1dGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVBdHRyaWJ1dGUoYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFkZEVsZW1lbnQoIk11bHRpcGxlIENsYXNzLVBhdGggYXR0cmlidXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXJlIHN1cHBvcnRlZCBidXQgdmlvbGF0ZSB0aGUgSmFyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzcGVjaWZpY2F0aW9uIGFuZCBtYXkgbm90IGJlIGNvcnJlY3RseSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicHJvY2Vzc2VkIGluIGFsbCBlbnZpcm9ubWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBhdHRyaWJ1dGUuZ2V0VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhBdHRyaWJ1dGUuYWRkVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KGF0dHJpYnV0ZUtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKCJUaGUgYXR0cmlidXRlIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBhdHRyaWJ1dGUuZ2V0TmFtZSgpICsgIlwiIG1heSBub3Qgb2NjdXIgbW9yZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJ0aGFuIG9uY2UgaW4gdGhlIHNhbWUgc2VjdGlvbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvbmUgdGhpcyBzZWN0aW9uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCBTZWN0aW9uCisgICAgICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgICAgICBTZWN0aW9uIGNsb25lZCA9IG5ldyBTZWN0aW9uKCk7CisgICAgICAgICAgICBjbG9uZWQuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBdHRyaWJ1dGVLZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZShrZXkpOworICAgICAgICAgICAgICAgIGNsb25lZC5zdG9yZUF0dHJpYnV0ZShuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjbG9uZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcmUgYW4gYXR0cmlidXRlIGFuZCB1cGRhdGUgdGhlIGluZGV4LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgdG8gYmUgc3RvcmVkCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgc3RvcmVBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZS5nZXRLZXkoKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KGF0dHJpYnV0ZUtleSwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgIGlmICghYXR0cmlidXRlSW5kZXguY29udGFpbnMoYXR0cmlidXRlS2V5KSkgeworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUluZGV4LmFkZEVsZW1lbnQoYXR0cmlidXRlS2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHdhcm5pbmdzIGZvciB0aGlzIHNlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gYW4gRW51bWVyYXRpb24gb2Ygd2FybmluZyBzdHJpbmdzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFdhcm5pbmdzKCkgeworICAgICAgICAgICAgcmV0dXJuIHdhcm5pbmdzLmVsZW1lbnRzKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlCisgICAgICAgICAqIEByZXR1cm4gYSBoYXNoIHZhbHVlIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscworICAgICAgICAgKiBAcGFyYW0gcmhzIHRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIGVxdWFsaXR5LgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIHRoZSBzYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCByaHMpIHsKKyAgICAgICAgICAgIGlmIChyaHMgPT0gbnVsbCB8fCByaHMuZ2V0Q2xhc3MoKSAhPSBnZXRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmhzID09IHRoaXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdGlvbiByaHNTZWN0aW9uID0gKFNlY3Rpb24pIHJoczsKKworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZXF1YWxzKHJoc1NlY3Rpb24uYXR0cmlidXRlcyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1hbmlmZXN0ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWFuaWZlc3RWZXJzaW9uID0gREVGQVVMVF9NQU5JRkVTVF9WRVJTSU9OOworCisgICAgLyoqIFRoZSBtYWluIHNlY3Rpb24gb2YgdGhpcyBtYW5pZmVzdCAqLworICAgIHByaXZhdGUgU2VjdGlvbiBtYWluU2VjdGlvbiA9IG5ldyBTZWN0aW9uKCk7CisKKyAgICAvKiogVGhlIG5hbWVkIHNlY3Rpb25zIG9mIHRoaXMgbWFuaWZlc3QgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBzZWN0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKiBJbmRleCBvZiBzZWN0aW9ucyAtIHVzZWQgdG8gcmV0YWluIG9yZGVyIG9mIHNlY3Rpb25zIGluIG1hbmlmZXN0ICovCisgICAgcHJpdmF0ZSBWZWN0b3Igc2VjdGlvbkluZGV4ID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbWFuaWZlc3QgZnJvbSBBbnQncyBkZWZhdWx0IG1hbmlmZXN0IGZpbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG1hbmlmZXN0LgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGxvYWRpbmcgdGhlCisgICAgICogICAgICAgICAgICBkZWZhdWx0IG1hbmlmZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYW5pZmVzdCBnZXREZWZhdWx0TWFuaWZlc3QoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGluc3IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGRlZk1hbmlmZXN0ID0gIi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kZWZhdWx0TWFuaWZlc3QubWYiOworICAgICAgICAgICAgaW4gPSBNYW5pZmVzdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGRlZk1hbmlmZXN0KTsKKyAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBkZWZhdWx0IG1hbmlmZXN0OiAiCisgICAgICAgICAgICAgICAgICAgICsgZGVmTWFuaWZlc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICBNYW5pZmVzdCBkZWZhdWx0TWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaW5zcik7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlIGNyZWF0ZWRCeSA9IG5ldyBBdHRyaWJ1dGUoIkNyZWF0ZWQtQnkiLAorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0udmVyc2lvbiIpICsgIiAoIgorICAgICAgICAgICAgICAgICAgICArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZW5kb3IiKSArICIpIik7CisgICAgICAgICAgICAgICAgZGVmYXVsdE1hbmlmZXN0LmdldE1haW5TZWN0aW9uKCkuc3RvcmVBdHRyaWJ1dGUoY3JlYXRlZEJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdE1hbmlmZXN0OworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaW5zciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5pZmVzdChpbnNyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTWFuaWZlc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEZWZhdWx0IG1hbmlmZXN0IGlzIGludmFsaWQgISEiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCBkZWZhdWx0IG1hbmlmZXN0IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW5zcik7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdCBhbiBlbXB0eSBtYW5pZmVzdCAqLworICAgIHB1YmxpYyBNYW5pZmVzdCgpIHsKKyAgICAgICAgbWFuaWZlc3RWZXJzaW9uID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgbWFuaWZlc3QgZmlsZSBmcm9tIHRoZSBnaXZlbiByZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSByIGlzIHRoZSByZWFkZXIgZnJvbSB3aGljaCB0aGUgTWFuaWZlc3QgaXMgcmVhZAorICAgICAqCisgICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGUgbWFuaWZlc3QgaXMgbm90IHZhbGlkIGFjY29yZGluZworICAgICAqICAgICAgICAgdG8gdGhlIEpBUiBzcGVjCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgbWFuaWZlc3QgY2Fubm90IGJlIHJlYWQgZnJvbSB0aGUgcmVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBNYW5pZmVzdChSZWFkZXIgcikgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyKTsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgdGhlIG1hbmlmZXN0IHZlcnNpb24KKyAgICAgICAgU3RyaW5nIG5leHRTZWN0aW9uTmFtZSA9IG1haW5TZWN0aW9uLnJlYWQocmVhZGVyKTsKKyAgICAgICAgU3RyaW5nIHJlYWRNYW5pZmVzdFZlcnNpb24KKyAgICAgICAgICAgID0gbWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoQVRUUklCVVRFX01BTklGRVNUX1ZFUlNJT04pOworICAgICAgICBpZiAocmVhZE1hbmlmZXN0VmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtYW5pZmVzdFZlcnNpb24gPSByZWFkTWFuaWZlc3RWZXJzaW9uOworICAgICAgICAgICAgbWFpblNlY3Rpb24ucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9NQU5JRkVTVF9WRVJTSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gbmV3IFNlY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChuZXh0U2VjdGlvbk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBzZWN0aW9uTmFtZSA9IG5ldyBBdHRyaWJ1dGUobGluZSk7CisgICAgICAgICAgICAgICAgaWYgKCFzZWN0aW9uTmFtZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShBVFRSSUJVVEVfTkFNRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKCJNYW5pZmVzdCBzZWN0aW9ucyBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAic3RhcnQgd2l0aCBhIFwiIiArIEFUVFJJQlVURV9OQU1FCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBhdHRyaWJ1dGUgYW5kIG5vdCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2VjdGlvbk5hbWUuZ2V0TmFtZSgpICsgIlwiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5leHRTZWN0aW9uTmFtZSA9IHNlY3Rpb25OYW1lLmdldFZhbHVlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYWxyZWFkeSBzdGFydGVkIHJlYWRpbmcgdGhpcyBzZWN0aW9uCisgICAgICAgICAgICAgICAgLy8gdGhpcyBsaW5lIGlzIHRoZSBmaXJzdCBhdHRyaWJ1dGUuIHNldCBpdCBhbmQgdGhlbgorICAgICAgICAgICAgICAgIC8vIGxldCB0aGUgbm9ybWFsIHJlYWQgaGFuZGxlIHRoZSByZXN0CisgICAgICAgICAgICAgICAgQXR0cmlidXRlIGZpcnN0QXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZShsaW5lKTsKKyAgICAgICAgICAgICAgICBzZWN0aW9uLmFkZEF0dHJpYnV0ZUFuZENoZWNrKGZpcnN0QXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VjdGlvbi5zZXROYW1lKG5leHRTZWN0aW9uTmFtZSk7CisgICAgICAgICAgICBuZXh0U2VjdGlvbk5hbWUgPSBzZWN0aW9uLnJlYWQocmVhZGVyKTsKKyAgICAgICAgICAgIGFkZENvbmZpZ3VyZWRTZWN0aW9uKHNlY3Rpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2VjdGlvbiB0byB0aGUgbWFuaWZlc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWN0aW9uIHRoZSBtYW5pZmVzdCBzZWN0aW9uIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbmlmZXN0RXhjZXB0aW9uIGlmIHRoZSBzZWN0aTBvbiBpcyBub3QgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNlY3Rpb24oU2VjdGlvbiBzZWN0aW9uKQorICAgICAgICAgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNlY3Rpb25OYW1lID0gc2VjdGlvbi5nZXROYW1lKCk7CisgICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNlY3Rpb25zIG11c3QgaGF2ZSBhIG5hbWUiKTsKKyAgICAgICAgfQorICAgICAgICBzZWN0aW9ucy5wdXQoc2VjdGlvbk5hbWUsIHNlY3Rpb24pOworICAgICAgICBpZiAoIXNlY3Rpb25JbmRleC5jb250YWlucyhzZWN0aW9uTmFtZSkpIHsKKyAgICAgICAgICAgIHNlY3Rpb25JbmRleC5hZGRFbGVtZW50KHNlY3Rpb25OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIG1hbmlmZXN0IC0gaXQgaXMgYWRkZWQgdG8gdGhlIG1haW4gc2VjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZSB0byBiZSBhZGRlZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFuaWZlc3RFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cmlidXRlKQorICAgICAgICAgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZS5nZXRLZXkoKSA9PSBudWxsIHx8IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXR0cmlidXRlcyBtdXN0IGhhdmUgbmFtZSBhbmQgdmFsdWUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXR0cmlidXRlLmdldEtleSgpLmVxdWFsc0lnbm9yZUNhc2UoQVRUUklCVVRFX01BTklGRVNUX1ZFUlNJT04pKSB7CisgICAgICAgICAgICBtYW5pZmVzdFZlcnNpb24gPSBhdHRyaWJ1dGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1haW5TZWN0aW9uLmFkZENvbmZpZ3VyZWRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1lcmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gbWFuaWZlc3QgaW50byB0aGlzIG1hbmlmZXN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIE1hbmlmZXN0IHRvIGJlIG1lcmdlZCB3aXRoIHRoaXMgb25lLgorICAgICAqCisgICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gbWVyZ2luZyB0aGUKKyAgICAgKiAgICAgICAgIG1hbmlmZXN0IGFjY29yZGluZyB0byB0aGUgTWFuaWZlc3Qgc3BlYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXJnZShNYW5pZmVzdCBvdGhlcikgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgbWVyZ2Uob3RoZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXJnZSB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIG1hbmlmZXN0IGludG8gdGhpcyBtYW5pZmVzdAorICAgICAqCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBNYW5pZmVzdCB0byBiZSBtZXJnZWQgd2l0aCB0aGlzIG9uZS4KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlTWFpbiB3aGV0aGVyIHRvIG92ZXJ3cml0ZSB0aGUgbWFpbiBzZWN0aW9uCisgICAgICogICAgICAgIG9mIHRoZSBjdXJyZW50IG1hbmlmZXN0CisgICAgICoKKyAgICAgKiBAdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBtZXJnaW5nIHRoZQorICAgICAqICAgICAgICAgbWFuaWZlc3QgYWNjb3JkaW5nIHRvIHRoZSBNYW5pZmVzdCBzcGVjLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lcmdlKE1hbmlmZXN0IG90aGVyLCBib29sZWFuIG92ZXJ3cml0ZU1haW4pCisgICAgICAgICB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24geworICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgIGlmIChvdmVyd3JpdGVNYWluKSB7CisgICAgICAgICAgICAgICAgIG1haW5TZWN0aW9uID0gKFNlY3Rpb24pIG90aGVyLm1haW5TZWN0aW9uLmNsb25lKCk7CisgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgbWFpblNlY3Rpb24ubWVyZ2Uob3RoZXIubWFpblNlY3Rpb24pOworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIGlmIChvdGhlci5tYW5pZmVzdFZlcnNpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICBtYW5pZmVzdFZlcnNpb24gPSBvdGhlci5tYW5pZmVzdFZlcnNpb247CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IG90aGVyLmdldFNlY3Rpb25OYW1lcygpOworICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgU2VjdGlvbiBvdXJTZWN0aW9uID0gKFNlY3Rpb24pIHNlY3Rpb25zLmdldChzZWN0aW9uTmFtZSk7CisgICAgICAgICAgICAgICAgIFNlY3Rpb24gb3RoZXJTZWN0aW9uCisgICAgICAgICAgICAgICAgICAgID0gKFNlY3Rpb24pIG90aGVyLnNlY3Rpb25zLmdldChzZWN0aW9uTmFtZSk7CisgICAgICAgICAgICAgICAgIGlmIChvdXJTZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlclNlY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENvbmZpZ3VyZWRTZWN0aW9uKChTZWN0aW9uKSBvdGhlclNlY3Rpb24uY2xvbmUoKSk7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBvdXJTZWN0aW9uLm1lcmdlKG90aGVyU2VjdGlvbik7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgKiBXcml0ZSB0aGUgbWFuaWZlc3Qgb3V0IHRvIGEgcHJpbnQgd3JpdGVyLgorICAgICoKKyAgICAqIEBwYXJhbSB3cml0ZXIgdGhlIFdyaXRlciB0byB3aGljaCB0aGUgbWFuaWZlc3QgaXMgd3JpdHRlbgorICAgICoKKyAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSB3cml0dGVuCisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShQcmludFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci5wcmludChBVFRSSUJVVEVfTUFOSUZFU1RfVkVSU0lPTiArICI6ICIgKyBtYW5pZmVzdFZlcnNpb24gKyBFT0wpOworICAgICAgICBTdHJpbmcgc2lnbmF0dXJlVmVyc2lvbgorICAgICAgICAgICAgPSBtYWluU2VjdGlvbi5nZXRBdHRyaWJ1dGVWYWx1ZShBVFRSSUJVVEVfU0lHTkFUVVJFX1ZFUlNJT04pOworICAgICAgICBpZiAoc2lnbmF0dXJlVmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoQVRUUklCVVRFX1NJR05BVFVSRV9WRVJTSU9OICsgIjogIgorICAgICAgICAgICAgICAgICsgc2lnbmF0dXJlVmVyc2lvbiArIEVPTCk7CisgICAgICAgICAgICBtYWluU2VjdGlvbi5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX1NJR05BVFVSRV9WRVJTSU9OKTsKKyAgICAgICAgfQorICAgICAgICBtYWluU2VjdGlvbi53cml0ZSh3cml0ZXIpOworCisgICAgICAgIC8vIGFkZCBpdCBiYWNrCisgICAgICAgIGlmIChzaWduYXR1cmVWZXJzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlIHN2QXR0ciA9IG5ldyBBdHRyaWJ1dGUoQVRUUklCVVRFX1NJR05BVFVSRV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBtYWluU2VjdGlvbi5hZGRDb25maWd1cmVkQXR0cmlidXRlKHN2QXR0cik7CisgICAgICAgICAgICB9IGNhdGNoIChNYW5pZmVzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiAtIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHNlY3Rpb25JbmRleC5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25OYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0U2VjdGlvbihzZWN0aW9uTmFtZSk7CisgICAgICAgICAgICBzZWN0aW9uLndyaXRlKHdyaXRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBtYW5pZmVzdCB0byBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbXVsdGlsaW5lIHN0cmluZyB3aXRoIHRoZSBNYW5pZmVzdCBhcyBpdAorICAgICAqICAgICAgICAgYXBwZWFycyBpbiBhIE1hbmlmZXN0IGZpbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGUobmV3IFByaW50V3JpdGVyKHN3KSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdy50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgd2FybmluZ3MgZm9yIHRoaXMgbWFuaWZlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHdhcm5pbmcgc3RyaW5ncworICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRXYXJuaW5ncygpIHsKKyAgICAgICAgVmVjdG9yIHdhcm5pbmdzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIEVudW1lcmF0aW9uIHdhcm5FbnVtID0gbWFpblNlY3Rpb24uZ2V0V2FybmluZ3MoKTsKKyAgICAgICAgd2hpbGUgKHdhcm5FbnVtLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICB3YXJuaW5ncy5hZGRFbGVtZW50KHdhcm5FbnVtLm5leHRFbGVtZW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgdmVjdG9yIGFuZCBhZGQgaW4gdGhlIHdhcm5pbmdzIGZvciBhbGwgdGhlIHNlY3Rpb25zCisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBzZWN0aW9ucy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUyID0gc2VjdGlvbi5nZXRXYXJuaW5ncygpOworICAgICAgICAgICAgd2hpbGUgKGUyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgd2FybmluZ3MuYWRkRWxlbWVudChlMi5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3YXJuaW5ncy5lbGVtZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZQorICAgICAqIEByZXR1cm4gYSBoYXNoY29kZSBiYXNlZCBvbiB0aGUgdmVyc2lvbiwgbWFpbiBhbmQgc2VjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2hDb2RlID0gMDsKKworICAgICAgICBpZiAobWFuaWZlc3RWZXJzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhhc2hDb2RlICs9IG1hbmlmZXN0VmVyc2lvbi5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIGhhc2hDb2RlICs9IG1haW5TZWN0aW9uLmhhc2hDb2RlKCk7CisgICAgICAgIGhhc2hDb2RlICs9IHNlY3Rpb25zLmhhc2hDb2RlKCk7CisKKyAgICAgICAgcmV0dXJuIGhhc2hDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMKKyAgICAgKiBAcGFyYW0gcmhzIHRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIGVxdWFsaXR5LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmVyc2lvbiwgbWFpbiBhbmQgc2VjdGlvbnMgYXJlIHRoZSBzYW1lLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisgICAgICAgIGlmIChyaHMgPT0gbnVsbCB8fCByaHMuZ2V0Q2xhc3MoKSAhPSBnZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmhzID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgTWFuaWZlc3QgcmhzTWFuaWZlc3QgPSAoTWFuaWZlc3QpIHJoczsKKyAgICAgICAgaWYgKG1hbmlmZXN0VmVyc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocmhzTWFuaWZlc3QubWFuaWZlc3RWZXJzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIW1hbmlmZXN0VmVyc2lvbi5lcXVhbHMocmhzTWFuaWZlc3QubWFuaWZlc3RWZXJzaW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtYWluU2VjdGlvbi5lcXVhbHMocmhzTWFuaWZlc3QubWFpblNlY3Rpb24pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2VjdGlvbnMuZXF1YWxzKHJoc01hbmlmZXN0LnNlY3Rpb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIG1hbmlmZXN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtYW5pZmVzdCdzIHZlcnNpb24gc3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNYW5pZmVzdFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBtYW5pZmVzdFZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtYWluIHNlY3Rpb24gb2YgdGhlIG1hbmlmZXN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtYWluIHNlY3Rpb24gb2YgdGhlIG1hbmlmZXN0CisgICAgICovCisgICAgcHVibGljIFNlY3Rpb24gZ2V0TWFpblNlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtYWluU2VjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBwYXJ0aWN1bGFyIHNlY3Rpb24gZnJvbSB0aGUgbWFuaWZlc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIGRlc2lyZWQuCisgICAgICogQHJldHVybiB0aGUgc3BlY2lmaWVkIHNlY3Rpb24gb3IgbnVsbCBpZiB0aGF0IHNlY3Rpb24KKyAgICAgKiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFuaWZlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdGlvbiBnZXRTZWN0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAoU2VjdGlvbikgc2VjdGlvbnMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VjdGlvbiBuYW1lcyBpbiB0aGlzIG1hbmlmZXN0LgorICAgICAqCisgICAgICogQHJldHVybiBhbiBFbnVtZXJhdGlvbiBvZiBzZWN0aW9uIG5hbWVzCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlY3Rpb25OYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHNlY3Rpb25JbmRleC5lbGVtZW50cygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0Q2xhc3NQYXRoLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdENsYXNzUGF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ODA2MjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdENsYXNzUGF0aC5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTG9jYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBDb252ZXJ0cyBhIFBhdGggaW50byBhIHByb3BlcnR5IHN1aXRhYmxlIGFzIGEgTWFuaWZlc3QgY2xhc3NwYXRoLgorICoKKyAqIEBzaW5jZSBBbnQgMS43CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJwcm9wZXJ0eSIKKyAqLworcHVibGljIGNsYXNzIE1hbmlmZXN0Q2xhc3NQYXRoIGV4dGVuZHMgVGFzayB7CisKKyAgICAvKiogVGhlIHByb3BlcnR5IG5hbWUgdG8gaG9sZCB0aGUgY2xhc3NwYXRoIHZhbHVlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAvKiogVGhlIGRpcmVjdG9yeSB0aGUgY2xhc3NwYXRoIHdpbGwgYmUgcmVsYXRpdmUgZnJvbS4gKi8KKyAgICBwcml2YXRlIEZpbGUgZGlyOworCisgICAgLyoqIFRoZSBtYXhpbXVtIHBhcmVudCBkaXJlY3RvcnkgbGV2ZWwgdG8gdHJhdmVyc2UuICovCisgICAgcHJpdmF0ZSBpbnQgbWF4UGFyZW50TGV2ZWxzID0gMjsKKworICAgIC8qKiBUaGUgY2xhc3NwYXRoIHRvIGNvbnZlcnQuICovCisgICAgcHJpdmF0ZSBQYXRoIHBhdGg7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcHJvcGVydHksIHdoaWNoIG11c3Qgbm90IGFscmVhZHkgZXhpc3QsIHdpdGggYSBzcGFjZQorICAgICAqIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyByZWxhdGl2ZSB0byB0aGUgamFyCisgICAgICogZmlsZSdzIHBhcmVudCBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWlzc2luZyAncHJvcGVydHknIGF0dHJpYnV0ZSEiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlyID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgJ2phcmZpbGUnIGF0dHJpYnV0ZSEiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KG5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgbmFtZSArICInIGFscmVhZHkgc2V0ISIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWlzc2luZyBuZXN0ZWQgPGNsYXNzcGF0aD4hIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3JtYWxpemUgdGhlIHJlZmVyZW5jZSBkaXJlY3RvcnkgKGNvbnRhaW5pbmcgdGhlIGphcikKKyAgICAgICAgZmluYWwgRmlsZVV0aWxzIGZpbGVVdGlscyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKyAgICAgICAgZGlyID0gZmlsZVV0aWxzLm5vcm1hbGl6ZShkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIENyZWF0ZSBhcyBtYW55IGRpcmVjdG9yeSBwcmVmaXhlcyBhcyBwYXJlbnQgbGV2ZWxzIHRvIHRyYXZlcnNlLAorICAgICAgICAvLyBpbiBhZGRpdGlvbiB0byB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBpdHNlbGYKKyAgICAgICAgRmlsZSBjdXJyRGlyID0gZGlyOworICAgICAgICBTdHJpbmdbXSBkaXJzID0gbmV3IFN0cmluZ1ttYXhQYXJlbnRMZXZlbHMgKyAxXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhQYXJlbnRMZXZlbHMgKyAxOyArK2kpIHsKKyAgICAgICAgICAgIGRpcnNbaV0gPSBjdXJyRGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3JDaGFyOworICAgICAgICAgICAgY3VyckRpciA9IGN1cnJEaXIuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgaWYgKGN1cnJEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1heFBhcmVudExldmVscyA9IGkgKyAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gZWxlbWVudHMgPSBwYXRoLmxpc3QoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGVsZW1lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgY3VycmVudCBmaWxlCisgICAgICAgICAgICBGaWxlIHBhdGhFbnRyeSA9IG5ldyBGaWxlKGVsZW1lbnRzW2ldKTsKKyAgICAgICAgICAgIHBhdGhFbnRyeSA9IGZpbGVVdGlscy5ub3JtYWxpemUocGF0aEVudHJ5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIFN0cmluZyBmdWxsUGF0aCA9IHBhdGhFbnRyeS5nZXRBYnNvbHV0ZVBhdGgoKTsKKworICAgICAgICAgICAgLy8gRmluZCB0aGUgbG9uZ2VzdCBwcmVmaXggc2hhcmVkIGJ5IHRoZSBjdXJyZW50IGZpbGUKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeS4KKyAgICAgICAgICAgIFN0cmluZyByZWxQYXRoID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IG1heFBhcmVudExldmVsczsgKytqKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRpciA9IGRpcnNbal07CisgICAgICAgICAgICAgICAgaWYgKCFmdWxsUGF0aC5zdGFydHNXaXRoKGRpcikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoISBBZGQgYXMgbWFueSAuLi8gYXMgcGFyZW50CisgICAgICAgICAgICAgICAgLy8gZGlyZWN0b3J5IHRyYXZlcnNlZCB0byBnZXQgdGhlIHJlbGF0aXZlIHBhdGgKKyAgICAgICAgICAgICAgICBlbGVtZW50LnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGo7ICsraykgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZCgiLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmQoZnVsbFBhdGguc3Vic3RyaW5nKGRpci5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIHJlbFBhdGggPSBlbGVtZW50LnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vIG1hdGNoLCBzbyBiYWlsIG91dCEKKyAgICAgICAgICAgIGlmIChyZWxQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJObyBzdWl0YWJsZSByZWxhdGl2ZSBwYXRoIGZyb20gIgorICAgICAgICAgICAgICAgICAgICArIGRpciArICIgdG8gIiArIGZ1bGxQYXRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTWFuaWZlc3QncyBDbGFzc1BhdGg6IGF0dHJpYnV0ZSBhbHdheXMgdXNlcyBmb3J3YXJkCisgICAgICAgICAgICAvLyBzbGFzaGVzICcvJywgYW5kIGlzIHNwYWNlLXNlcGFyYXRlZC4gQW50IHdpbGwgcHJvcGVybHkKKyAgICAgICAgICAgIC8vIGZvcm1hdCBpdCBvbiA3MiBjb2x1bW5zIHdpdGggcHJvcGVyIGxpbmUgY29udGludWF0aW9uCisgICAgICAgICAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgeworICAgICAgICAgICAgICAgIHJlbFBhdGggPSByZWxQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhdGhFbnRyeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgcmVsUGF0aCA9IHJlbFBhdGggKyAnLyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlbFBhdGggPSBMb2NhdG9yLmVuY29kZVVSSShyZWxQYXRoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4Yyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHJlbFBhdGgpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluYWxseSBhc3NpZ24gdGhlIHByb3BlcnR5IHdpdGggdGhlIG1hbmlmZXN0IGNsYXNzcGF0aAorICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkobmFtZSwgYnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGhvbGQgdGhlIGNsYXNzcGF0aCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgcHJvcGVydHkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEpBUiBmaWxlIHRvIGNvbnRhaW4gdGhlIGNsYXNzcGF0aCBhdHRyaWJ1dGUgaW4gaXRzIG1hbmlmZXN0LgorICAgICAqCisgICAgICogQHBhcmFtICBqYXJmaWxlIHRoZSBKQVIgZmlsZS4gTmVlZCBub3QgZXhpc3QgeWV0LCBidXQgaXRzIHBhcmVudAorICAgICAqICAgICAgICAgZGlyZWN0b3J5IG11c3QgZXhpc3Qgb24gdGhlIG90aGVyIGhhbmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SmFyRmlsZShGaWxlIGphcmZpbGUpIHsKKyAgICAgICAgRmlsZSBwYXJlbnQgPSBqYXJmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgaWYgKCFwYXJlbnQuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJKYXIncyBkaXJlY3Rvcnkgbm90IGZvdW5kOiAiICsgcGFyZW50KTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmRpciA9IHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHBhcmVudCBkaXJlY3RvcnkgbGV2ZWxzIGFsbG93ZWQgd2hlbiBjb21wdXRpbmcKKyAgICAgKiBhIHJlbGF0aXZlIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGxldmVscyB0aGUgbWF4IGxldmVsLiBEZWZhdWx0cyB0byAyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heFBhcmVudExldmVscyhpbnQgbGV2ZWxzKSB7CisgICAgICAgIHRoaXMubWF4UGFyZW50TGV2ZWxzID0gbGV2ZWxzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGNsYXNzcGF0aCB0byBjb252ZXJ0LgorICAgICAqCisgICAgICogQHBhcmFtICBwYXRoIHRoZSBjbGFzc3BhdGggdG8gY29udmVydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc1BhdGgoUGF0aCBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdEV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGU3MjEzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCisvKioKKyAqIEV4Y2VwdGlvbiB0aHJvd24gaW5kaWNhdGluZyBwcm9ibGVtcyBpbiBhIEpBUiBNYW5pZmVzdAorICoKKyAqIEBzaW5jZSBBbnQgMS40CisgKi8KK3B1YmxpYyBjbGFzcyBNYW5pZmVzdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3Njg1NjM0MjAwNDU3NTE1MjA3TDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aXZlIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIG1zZyBEZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBNYW5pZmVzdEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RUYXNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ4MDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RUYXNrLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hbmlmZXN0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIENyZWF0ZXMgYSBtYW5pZmVzdCBmaWxlIGZvciBpbmNsdXNpb24gaW4gYSBKQVIsIEFudCB0YXNrIHdyYXBwZXIKKyAqIGFyb3VuZCB7QGxpbmsgTWFuaWZlc3QgTWFuaWZlc3R9LiAgVGhpcyB0YXNrIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEKKyAqIE1hbmlmZXN0IGZpbGUsIG9wdGlvbmFsbHkgcmVwbGFjaW5nIG9yIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGZpbGUuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImphdmEiCisgKi8KK3B1YmxpYyBjbGFzcyBNYW5pZmVzdFRhc2sgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgdmFsaWQgY2hhcmFjdGVycyB3aGljaCBjYW4gYmUgdXNlZCBpbiBhdHRyaWJ1dGUgbmFtZXMuCisgICAgICoge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9BVFRSSUJVVEVfQ0hBUlMgPQorICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3OS1fIjsKKworICAgIC8qKgorICAgICAqIEhvbGRzIHRoZSByZWFsIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBNYW5pZmVzdCBuZXN0ZWRNYW5pZmVzdCA9IG5ldyBNYW5pZmVzdCgpOworCisgICAgLyoqCisgICAgICogVGhlIGZpbGUgdG8gd2hpY2ggdGhlIG1hbmlmZXN0IHNob3VsZCBiZSB3cml0dGVuIHdoZW4gdXNlZCBhcyBhIHRhc2sKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgbWFuaWZlc3RGaWxlOworCisgICAgLyoqCisgICAgICogVGhlIG1vZGUgd2l0aCB3aGljaCB0aGUgbWFuaWZlc3QgZmlsZSBpcyB3cml0dGVuCisgICAgICovCisgICAgcHJpdmF0ZSBNb2RlIG1vZGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5jb2Rpbmcgb2YgdGhlIG1hbmlmZXN0IGZpbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBjbGFzcyBmb3IgTWFuaWZlc3QncyBtb2RlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBBbGxvd2VkIHZhbHVlcyBmb3IgdGhlIG1vZGUgYXR0cmlidXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIGFycmF5IG9mIHRoZSBhbGxvd2VkIHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsidXBkYXRlIiwgInJlcGxhY2UifTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuaWZlc3RUYXNrKCkgeworICAgICAgICBtb2RlID0gbmV3IE1vZGUoKTsKKyAgICAgICAgbW9kZS5zZXRWYWx1ZSgicmVwbGFjZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNlY3Rpb24gdG8gdGhlIG1hbmlmZXN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VjdGlvbiB0aGUgbWFuaWZlc3Qgc2VjdGlvbiB0byBiZSBhZGRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYW5pZmVzdEV4Y2VwdGlvbiBpZiB0aGUgc2VjdGlvbiBpcyBub3QgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNlY3Rpb24oTWFuaWZlc3QuU2VjdGlvbiBzZWN0aW9uKQorICAgICAgICAgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgRW51bWVyYXRpb24gYXR0cmlidXRlS2V5cyA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlS2V5cygpOworICAgICAgICB3aGlsZSAoYXR0cmlidXRlS2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgIChTdHJpbmcpIGF0dHJpYnV0ZUtleXMubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICBjaGVja0F0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAgICB9CisgICAgICAgIG5lc3RlZE1hbmlmZXN0LmFkZENvbmZpZ3VyZWRTZWN0aW9uKHNlY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIG1hbmlmZXN0IC0gaXQgaXMgYWRkZWQgdG8gdGhlIG1haW4gc2VjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZSB0byBiZSBhZGRlZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFuaWZlc3RFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEF0dHJpYnV0ZShNYW5pZmVzdC5BdHRyaWJ1dGUgYXR0cmlidXRlKQorICAgICAgICAgdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGUoYXR0cmlidXRlKTsKKyAgICAgICAgbmVzdGVkTWFuaWZlc3QuYWRkQ29uZmlndXJlZEF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGUgYXR0cmlidXRlIGFnYWlucyB0aGUgSmFyLXNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBKYXItU3BlY2lmaWNhdGlvbiA8aT4iTmFtZS1WYWx1ZSBwYWlycyBhbmQgU2VjdGlvbnMiPC9pPjogPHByZT4KKyAgICAgKiAgIG5hbWU6ICAgICAgIGFscGhhbnVtICpoZWFkZXJjaGFyCisgICAgICogICBhbHBoYW51bTogICB7QS1afSB8IHthLXp9IHwgezAtOX0KKyAgICAgKiAgIGhlYWRlcmNoYXI6IGFscGhhbnVtIHwgLSB8IF8KKyAgICAgKiA8L3ByZT4KKyAgICAgKiBTbyB0aGUgcmVzdWx0aW5nIHJlZ2V4cCB3b3VsZCBiZSA8dHQ+W0EtWmEtejAtOV1bQS1aYS16MC05LV9dKjwvdHQ+LgorICAgICAqCisgICAgICogQmVjYXVzZSBvZiBKREsgMS4yIGNvbXBsaWFuY2UgYW5kIHRoZSBwb3NzaWJsZSBhYnNlbmNlIG9mIGEKKyAgICAgKiByZWdleHAgbWF0Y2hlciB3ZSBjYW4gbm90IHVzZSByZWdleHBzIGhlcmUuIEluc3RlYWQgd2UgaGF2ZSB0bworICAgICAqIGNoZWNrIGVhY2ggY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIHRvIGNoZWNrCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY2hlY2sgZmFpbHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGUoTWFuaWZlc3QuQXR0cmlidXRlIGF0dHJpYnV0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOworICAgICAgICBjaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7CisKKyAgICAgICAgaWYgKGNoID09ICctJyB8fCBjaCA9PSAnXycpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWFuaWZlc3QgYXR0cmlidXRlIG5hbWVzIG11c3Qgbm90IHN0YXJ0IHdpdGggJyIgKyBjaCArICInLiIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNoID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoVkFMSURfQVRUUklCVVRFX0NIQVJTLmluZGV4T2YoY2gpIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWFuaWZlc3QgYXR0cmlidXRlIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gJyIgKyBjaCArICInIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgZmlsZSB0byBjcmVhdGUvdXBkYXRlLgorICAgICAqIFJlcXVpcmVkIGlmIHVzZWQgYXMgYSB0YXNrLgorICAgICAqIEBwYXJhbSBmIHRoZSBNYW5pZmVzdCBmaWxlIHRvIGJlIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZikgeworICAgICAgICBtYW5pZmVzdEZpbGUgPSBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlbmNvZGluZyB0byB1c2UgZm9yIHJlYWRpbmcgaW4gYW4gZXhpc3RpbmcgbWFuaWZlc3QgZmlsZQorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgbWFuaWZlc3QgZmlsZSBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSBwb2xpY3k6IGVpdGhlciAidXBkYXRlIiBvciAicmVwbGFjZSI7IGRlZmF1bHQgaXMgInJlcGxhY2UiLgorICAgICAqIEBwYXJhbSBtIHRoZSBtb2RlIHZhbHVlIC0gdXBkYXRlIG9yIHJlcGxhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kZShNb2RlIG0pIHsKKyAgICAgICAgbW9kZSA9IG07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgTWFuaWZlc3Qgd2hlbiB1c2VkIGFzIGEgdGFzay4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSB3cml0dGVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAobWFuaWZlc3RGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIGZpbGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIik7CisgICAgICAgIH0KKworICAgICAgICBNYW5pZmVzdCB0b1dyaXRlID0gTWFuaWZlc3QuZ2V0RGVmYXVsdE1hbmlmZXN0KCk7CisgICAgICAgIE1hbmlmZXN0IGN1cnJlbnQgPSBudWxsOworICAgICAgICBCdWlsZEV4Y2VwdGlvbiBlcnJvciA9IG51bGw7CisKKyAgICAgICAgaWYgKG1hbmlmZXN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0RmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgIlVURi04Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV3IE1hbmlmZXN0KGlzcik7CisgICAgICAgICAgICB9IGNhdGNoIChNYW5pZmVzdEV4Y2VwdGlvbiBtKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgQnVpbGRFeGNlcHRpb24oIkV4aXN0aW5nIG1hbmlmZXN0ICIgKyBtYW5pZmVzdEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgaW52YWxpZCIsIG0sIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCAiICsgbWFuaWZlc3RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaXNyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vbG9vayBmb3IgYW5kIHByaW50IHdhcm5pbmdzCisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IG5lc3RlZE1hbmlmZXN0LmdldFdhcm5pbmdzKCk7CisgICAgICAgICAgICAgICAgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIGxvZygiTWFuaWZlc3Qgd2FybmluZzogIiArIChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtb2RlLmdldFZhbHVlKCkuZXF1YWxzKCJ1cGRhdGUiKSAmJiBtYW5pZmVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRvV3JpdGUubWVyZ2UoY3VycmVudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG9Xcml0ZS5tZXJnZShuZXN0ZWRNYW5pZmVzdCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbmlmZXN0RXhjZXB0aW9uIG0pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWFuaWZlc3QgaXMgaW52YWxpZCIsIG0sIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRvV3JpdGUuZXF1YWxzKGN1cnJlbnQpKSB7CisgICAgICAgICAgICBsb2coIk1hbmlmZXN0IGhhcyBub3QgY2hhbmdlZCwgZG8gbm90IHJlY3JlYXRlIiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFByaW50V3JpdGVyIHcgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtYW5pZmVzdEZpbGUpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCBNYW5pZmVzdC5KQVJfRU5DT0RJTkcpOworICAgICAgICAgICAgdyA9IG5ldyBQcmludFdyaXRlcihvc3cpOworICAgICAgICAgICAgdG9Xcml0ZS53cml0ZSh3KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gd3JpdGUgIiArIG1hbmlmZXN0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh3KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hdGNoaW5nVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWF0Y2hpbmdUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0ZmE2YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hdGNoaW5nVGFzay5qYXZhCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5BbmRTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQ29udGFpbnNSZWdleHBTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQ29udGFpbnNTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGF0ZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EZXBlbmRTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGVwdGhTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGlmZmVyZW50U2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkV4dGVuZFNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVuYW1lU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLk1ham9yaXR5U2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLk5vbmVTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuTm90U2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLk9yU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlByZXNlbnRTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0U2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNlbGVjdG9yQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TaXplU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlR5cGVTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yOworCisvKioKKyAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgdGFzayB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IGFsbCB0aG9zZSB0YXNrcyB0aGF0CisgKiByZXF1aXJlIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBmaWxlcyBiYXNlZCBvbiBwYXR0ZXJuIG1hdGNoaW5nLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIE1hdGNoaW5nVGFzayBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBTZWxlY3RvckNvbnRhaW5lciB7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBGaWxlU2V0IGZpbGVzZXQgPSBuZXcgRmlsZVNldCgpOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBzdXBlci5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBmaWxlc2V0LnNldFByb2plY3QocHJvamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0CisgICAgICogQHJldHVybiBhIE5hbWVFbnRyeSBvYmplY3QgdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVJbmNsdWRlKCkgeworICAgICAgICByZXR1cm4gZmlsZXNldC5jcmVhdGVJbmNsdWRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBmaWxlcyBsaXN0CisgICAgICogQHJldHVybiBhbiBOYW1lRW50cnkgb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZXNGaWxlKCkgeworICAgICAgICByZXR1cm4gZmlsZXNldC5jcmVhdGVJbmNsdWRlc0ZpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBleGNsdWRlIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIE5hbWVFbnRyeSBvYmplY3QgdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgeworICAgICAgICByZXR1cm4gZmlsZXNldC5jcmVhdGVFeGNsdWRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBmaWxlcyBsaXN0CisgICAgICogQHJldHVybiBhbiBOYW1lRW50cnkgb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlRXhjbHVkZXNGaWxlKCkgeworICAgICAgICByZXR1cm4gZmlsZXNldC5jcmVhdGVFeGNsdWRlc0ZpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBzZXQgb2YgcGF0dGVybnMKKyAgICAgKiBAcmV0dXJuIFBhdHRlcm5TZXQgb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0dGVyblNldCBjcmVhdGVQYXR0ZXJuU2V0KCkgeworICAgICAgICByZXR1cm4gZmlsZXNldC5jcmVhdGVQYXR0ZXJuU2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorICAgICAqIG9yIGEgc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKSB7CisgICAgICAgIGZpbGVzZXQuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOworICAgIH0KKworICAgIC8vIENoZWNrU3R5bGU6TWV0aG9kTmFtZUNoZWNrIE9GRiAtIGJjCisgICAgLyoqCisgICAgICogU2V0IHRoaXMgdG8gYmUgdGhlIGl0ZW1zIGluIHRoZSBiYXNlIGRpcmVjdG9yeSB0aGF0IHlvdSB3YW50IHRvIGJlCisgICAgICogaW5jbHVkZWQuIFlvdSBjYW4gYWxzbyBzcGVjaWZ5ICIqIiBmb3IgdGhlIGl0ZW1zIChpZTogaXRlbXM9IioiKQorICAgICAqIGFuZCBpdCB3aWxsIGluY2x1ZGUgYWxsIHRoZSBpdGVtcyBpbiB0aGUgYmFzZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbVN0cmluZyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGluY2x1ZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgWHNldEl0ZW1zKFN0cmluZyBpdGVtU3RyaW5nKSB7CisgICAgICAgIGxvZygiVGhlIGl0ZW1zIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkLiAiCisgICAgICAgICAgICArICJQbGVhc2UgdXNlIHRoZSBpbmNsdWRlcyBhdHRyaWJ1dGUuIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIGlmIChpdGVtU3RyaW5nID09IG51bGwgfHwgaXRlbVN0cmluZy5lcXVhbHMoIioiKQorICAgICAgICAgICAgfHwgaXRlbVN0cmluZy5lcXVhbHMoIi4iKSkgeworICAgICAgICAgICAgY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUoIioqIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihpdGVtU3RyaW5nLCAiLCAiKTsKKyAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSB0b2submV4dFRva2VuKCkudHJpbSgpOworICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbmNsdWRlKCkuc2V0TmFtZShwYXR0ZXJuICsgIi8qKiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNldCBvZiBleGNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKKyAgICAgKiBvciBhIHNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2x1ZGVzIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZXhjbHVkZSBwYXR0ZXJucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzKFN0cmluZyBleGNsdWRlcykgeworICAgICAgICBmaWxlc2V0LnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIGZpbGVuYW1lcyBhbmQgZGlyZWN0b3J5IG5hbWVzIHRvIG5vdCBpbmNsdWRlLiBUaGV5IHNob3VsZCBiZQorICAgICAqIGVpdGhlciAsIG9yICIgIiAoc3BhY2UpIHNlcGFyYXRlZC4gVGhlIGlnbm9yZWQgZmlsZXMgd2lsbCBiZSBsb2dnZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWdub3JlU3RyaW5nIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gaWdub3JlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIFhzZXRJZ25vcmUoU3RyaW5nIGlnbm9yZVN0cmluZykgeworICAgICAgICBsb2coIlRoZSBpZ25vcmUgYXR0cmlidXRlIGlzIGRlcHJlY2F0ZWQuIgorICAgICAgICAgICAgKyAiUGxlYXNlIHVzZSB0aGUgZXhjbHVkZXMgYXR0cmlidXRlLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICBpZiAoaWdub3JlU3RyaW5nICE9IG51bGwgJiYgaWdub3JlU3RyaW5nLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaWdub3JlU3RyaW5nLCAiLCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVFeGNsdWRlKCkuc2V0TmFtZSgiKiovIiArIHRvay5uZXh0VG9rZW4oKS50cmltKCkgKyAiLyoqIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlRGVmYXVsdEV4Y2x1ZGVzICJ0cnVlInwib24ifCJ5ZXMiIHdoZW4gZGVmYXVsdCBleGNsdXNpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCwgImZhbHNlInwib2ZmInwibm8iIHdoZW4gdGhleQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkbid0IGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdGV4Y2x1ZGVzKGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzKSB7CisgICAgICAgIGZpbGVzZXQuc2V0RGVmYXVsdGV4Y2x1ZGVzKHVzZURlZmF1bHRFeGNsdWRlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IHNjYW5uZXIgbmVlZGVkIHRvIGFjY2VzcyB0aGUgZmlsZXMgdG8gcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gYmFzZURpciB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gdXNlIHdpdGggdGhlIGZpbGVzZXQKKyAgICAgKiBAcmV0dXJuIGEgZGlyZWN0b3J5IHNjYW5uZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlyZWN0b3J5U2Nhbm5lciBnZXREaXJlY3RvcnlTY2FubmVyKEZpbGUgYmFzZURpcikgeworICAgICAgICBmaWxlc2V0LnNldERpcihiYXNlRGlyKTsKKyAgICAgICAgcmV0dXJuIGZpbGVzZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW5jbHVkZXMgcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZXNmaWxlIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGVuYW1lIHRvIGZldGNoCisgICAgICogdGhlIGluY2x1ZGUgcGF0dGVybnMgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc2ZpbGUoRmlsZSBpbmNsdWRlc2ZpbGUpIHsKKyAgICAgICAgZmlsZXNldC5zZXRJbmNsdWRlc2ZpbGUoaW5jbHVkZXNmaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2x1ZGVzZmlsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlbmFtZSB0byBmZXRjaAorICAgICAqIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGZyb20uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXNmaWxlKEZpbGUgZXhjbHVkZXNmaWxlKSB7CisgICAgICAgIGZpbGVzZXQuc2V0RXhjbHVkZXNmaWxlKGV4Y2x1ZGVzZmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBjYXNlIHNlbnNpdGl2aXR5IG9mIHRoZSBmaWxlIHN5c3RlbQorICAgICAqCisgICAgICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZSAidHJ1ZSJ8Im9uInwieWVzIiBpZiBmaWxlIHN5c3RlbSBpcyBjYXNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zaXRpdmUsICJmYWxzZSJ8Im9mZiJ8Im5vIiB3aGVuIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIGZpbGVzZXQuc2V0Q2FzZVNlbnNpdGl2ZShpc0Nhc2VTZW5zaXRpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBvciBub3Qgc3ltYm9saWMgbGlua3Mgc2hvdWxkIGJlIGZvbGxvd2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGZvbGxvd1N5bWxpbmtzIHdoZXRoZXIgb3Igbm90IHN5bWJvbGljIGxpbmtzIHNob3VsZCBiZSBmb2xsb3dlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvbGxvd1N5bWxpbmtzKGJvb2xlYW4gZm9sbG93U3ltbGlua3MpIHsKKyAgICAgICAgZmlsZXNldC5zZXRGb2xsb3dTeW1saW5rcyhmb2xsb3dTeW1saW5rcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzZWxlY3RvcnMgaGVyZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBhbnkgc2VsZWN0b3JzIGFyZSBpbiB0aGlzIGNvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1NlbGVjdG9ycygpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVzZXQuaGFzU2VsZWN0b3JzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIGluIHRoaXMgY29udGFpbmVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIGluIHRoaXMgY29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIGludCBzZWxlY3RvckNvdW50KCkgeworICAgICAgICByZXR1cm4gZmlsZXNldC5zZWxlY3RvckNvdW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHNlbGVjdG9ycyBhcyBhbiBhcnJheS4KKyAgICAgKiBAcGFyYW0gcCB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzZWxlY3RvcnMgaW4gdGhpcyBjb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZVNlbGVjdG9yW10gZ2V0U2VsZWN0b3JzKFByb2plY3QgcCkgeworICAgICAgICByZXR1cm4gZmlsZXNldC5nZXRTZWxlY3RvcnMocCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdG9yIGZvciBhY2Nlc3NpbmcgdGhlIHNldCBvZiBzZWxlY3RvcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0b3IgdGhhdCBnb2VzIHRocm91Z2ggZWFjaCBvZiB0aGUgc2VsZWN0b3JzCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIHNlbGVjdG9yRWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBmaWxlc2V0LnNlbGVjdG9yRWxlbWVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VsZWN0b3IgaW50byB0aGlzIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgbmV3IHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFNlbGVjdG9yKEZpbGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBmaWxlc2V0LmFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKiBNZXRob2RzIGJlbG93IGFsbCBhZGQgc3BlY2lmaWMgc2VsZWN0b3JzICovCisKKyAgICAvKioKKyAgICAgKiBhZGQgYSAiU2VsZWN0IiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VsZWN0b3IoU2VsZWN0U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgZmlsZXNldC5hZGRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGFuICJBbmQiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBbmQoQW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgZmlsZXNldC5hZGRBbmQoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbiAiT3IiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRPcihPclNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGZpbGVzZXQuYWRkT3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhICJOb3QiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGROb3QoTm90U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgZmlsZXNldC5hZGROb3Qoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhICJOb25lIiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTm9uZShOb25lU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgZmlsZXNldC5hZGROb25lKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBtYWpvcml0eSBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWFqb3JpdHkoTWFqb3JpdHlTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBmaWxlc2V0LmFkZE1ham9yaXR5KHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBzZWxlY3RvciBkYXRlIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREYXRlKERhdGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBmaWxlc2V0LmFkZERhdGUoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIHNlbGVjdG9yIHNpemUgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNpemUoU2l6ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGZpbGVzZXQuYWRkU2l6ZShzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgc2VsZWN0b3IgZmlsZW5hbWUgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVuYW1lKEZpbGVuYW1lU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgZmlsZXNldC5hZGRGaWxlbmFtZShzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGFuIGV4dGVuZGVkIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDdXN0b20oRXh0ZW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgZmlsZXNldC5hZGRDdXN0b20oc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIGNvbnRhaW5zIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb250YWlucyhDb250YWluc1NlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGZpbGVzZXQuYWRkQ29udGFpbnMoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIHByZXNlbnQgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByZXNlbnQoUHJlc2VudFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGZpbGVzZXQuYWRkUHJlc2VudChzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgZGVwdGggc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERlcHRoKERlcHRoU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgZmlsZXNldC5hZGREZXB0aChzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgZGVwZW5kcyBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVwZW5kKERlcGVuZFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGZpbGVzZXQuYWRkRGVwZW5kKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSByZWd1bGFyIGV4cHJlc3Npb24gc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnRhaW5zUmVnZXhwKENvbnRhaW5zUmVnZXhwU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgZmlsZXNldC5hZGRDb250YWluc1JlZ2V4cChzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgdHlwZSBzZWxlY3RvciBlbnRyeSBvbiB0aGUgdHlwZSBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKiBAc2luY2UgYW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERpZmZlcmVudChEaWZmZXJlbnRTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBmaWxlc2V0LmFkZERpZmZlcmVudChzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgdHlwZSBzZWxlY3RvciBlbnRyeSBvbiB0aGUgdHlwZSBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKiBAc2luY2UgYW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFR5cGUoVHlwZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGZpbGVzZXQuYWRkVHlwZShzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIHRoZSBtb2RpZmllZCBzZWxlY3RvcgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICogQHNpbmNlIGFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNb2RpZmllZChNb2RpZmllZFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGZpbGVzZXQuYWRkTW9kaWZpZWQoc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbiBhcmJpdGFyeSBzZWxlY3RvcgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGZpbGVzZXQuYWRkKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBmb3IgdGhlIGltcGxpY2l0IGZpbGVzZXQuCisgICAgICogQHJldHVybiB0aGUgaW1wbGljaXQgZmlsZXNldAorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZVNldCBnZXRJbXBsaWNpdEZpbGVTZXQoKSB7CisgICAgICAgIHJldHVybiBmaWxlc2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01rZGlyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Na2Rpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMGZlMzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Na2Rpci5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogQ3JlYXRlcyBhIGdpdmVuIGRpcmVjdG9yeS4KKyAqIENyZWF0ZXMgYSBkaXJlY3RvcnkgYW5kIGFueSBub24tZXhpc3RlbnQgcGFyZW50IGRpcmVjdG9yaWVzLCB3aGVuCisgKiBuZWNlc3NhcnkKKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKKyAqLworCitwdWJsaWMgY2xhc3MgTWtkaXIgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNS0RJUl9SRVRSWV9TTEVFUF9NSUxMSVMgPSAxMDsKKyAgICAvKioKKyAgICAgKiBvdXIgbGl0dGxlIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBkaXI7CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgdGhlIGRpcmVjdG9yeSBhbmQgYWxsIHBhcmVudHMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGRpciBpcyBzb21laG93IGludmFsaWQsIG9yIGNyZWF0aW9uIGZhaWxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRpciBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXIuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgYXMgYSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhbHJlYWR5IGV4aXN0cyB3aXRoIHRoYXQgbmFtZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1rZGlycyhkaXIpOworICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICsgIiBjcmVhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGFuIHVua25vd24gcmVhc29uIjsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZygiQ3JlYXRlZCBkaXI6ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJTa2lwcGluZyAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZTsgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgdG8gYmUgbWFkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkaXIpIHsKKyAgICAgICAgdGhpcy5kaXIgPSBkaXI7CisgICAgfQorICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gZml4IHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIHdoZW4gY3JlYXRpbmcKKyAgICAgKiBkaXJlY3RvcmllcyBvbiBXaW5YUC4gSWYgdGhlIG1rZGlycyBkb2VzIG5vdCB3b3JrLAorICAgICAqIHdhaXQgYSBsaXR0bGUgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWtkaXJzKEZpbGUgZikgeworICAgICAgICBpZiAoIWYubWtkaXJzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE1LRElSX1JFVFJZX1NMRUVQX01JTExJUyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGYubWtkaXJzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmLm1rZGlycygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTW92ZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTW92ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDZkMDEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Nb3ZlLmphdmEKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyU2V0Q29sbGVjdGlvbjsKKworLyoqCisgKiBNb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGEgbmV3IGZpbGUgb3IgZGlyZWN0b3J5LgorICogQnkgZGVmYXVsdCwgdGhlCisgKiBkZXN0aW5hdGlvbiBmaWxlIGlzIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICogV2hlbiA8aT5vdmVyd3JpdGU8L2k+IGlzCisgKiB0dXJuZWQgb2ZmLCB0aGVuIGZpbGVzIGFyZSBvbmx5IG1vdmVkIGlmIHRoZSBzb3VyY2UgZmlsZSBpcworICogbmV3ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gZmlsZSwgb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBkb2VzCisgKiBub3QgZXhpc3QuCisgKgorICogPHA+U291cmNlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcmUgb25seSBkZWxldGVkIHdoZW4gdGhlIGZpbGUgb3IKKyAqIGRpcmVjdG9yeSBoYXMgYmVlbiBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uIHN1Y2Nlc3NmdWxseS4gIEZpbHRlcmluZworICogYWxzbyB3b3Jrcy48L3A+CisgKgorICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcm5vdXQgS3VpcGVyJ3MgaW5pdGlhbCBkZXNpZ24KKyAqIGRvY3VtZW50LCB0aGUgZm9sbG93aW5nIG1haWxpbmcgbGlzdCBkaXNjdXNzaW9ucywgYW5kIHRoZQorICogY29weWZpbGUvY29weWRpciB0YXNrcy48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjIKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCisgKi8KK3B1YmxpYyBjbGFzcyBNb3ZlIGV4dGVuZHMgQ29weSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBvZiBvYmplY3QuCisgICAgICogVGhpcyBzZXRzIHRoZSBmb3JjZU92ZXJ3cml0ZSBhdHRyaWJ1dGUgb2YgdGhlIENvcHkgcGFyZW50IGNsYXNzCisgICAgICogdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBNb3ZlKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRPdmVyd3JpdGUodHJ1ZSk7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGlmICgoZGVzdEZpbGUgIT0gbnVsbCAmJiBkZXN0RGlyICE9IG51bGwpCisgICAgICAgICAgICAgICAgfHwgKGRlc3RGaWxlID09IG51bGwgJiYgZGVzdERpciA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25lIGFuZCBvbmx5IG9uZSBvZiB0b2ZpbGUgYW5kIHRvZGlyIG11c3QgYmUgc2V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdEZpbGUgPSBkZXN0RmlsZSA9PSBudWxsID8gbmV3IEZpbGUoZGVzdERpciwgZmlsZS5nZXROYW1lKCkpIDogZGVzdEZpbGU7CisgICAgICAgICAgICBkZXN0RGlyID0gZGVzdERpciA9PSBudWxsID8gZGVzdEZpbGUuZ2V0UGFyZW50RmlsZSgpIDogZGVzdERpcjsKKworICAgICAgICAgICAgY29tcGxldGVEaXJNYXAucHV0KGZpbGUsIGRlc3RGaWxlKTsKKyAgICAgICAgICAgIGZpbGUgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIudmFsaWRhdGVBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAgcHJvdGVjdGVkIGFuZCBwcml2YXRlIG1ldGhvZHMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBjb3B5J3MgZG9GaWxlT3BlcmF0aW9ucyB0byBtb3ZlIHRoZSBmaWxlcyBpbnN0ZWFkIG9mIGNvcHlpbmcgdGhlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0ZpbGVPcGVyYXRpb25zKCkgeworICAgICAgICAvL0F0dGVtcHQgY29tcGxldGUgZGlyZWN0b3J5IHJlbmFtZXMsIGlmIGFueSwgZmlyc3QuCisgICAgICAgIGlmIChjb21wbGV0ZURpck1hcC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGZyb21EaXJzID0gY29tcGxldGVEaXJNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgZnJvbURpcnMuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEZpbGUgZnJvbURpciA9IChGaWxlKSBmcm9tRGlycy5uZXh0KCk7CisgICAgICAgICAgICAgICAgRmlsZSB0b0RpciA9IChGaWxlKSBjb21wbGV0ZURpck1hcC5nZXQoZnJvbURpcik7CisgICAgICAgICAgICAgICAgYm9vbGVhbiByZW5hbWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJBdHRlbXB0aW5nIHRvIHJlbmFtZSBkaXI6ICIgKyBmcm9tRGlyICsgIiB0byAiICsgdG9EaXIsIHZlcmJvc2l0eSk7CisgICAgICAgICAgICAgICAgICAgIHJlbmFtZWQgPSByZW5hbWVGaWxlKGZyb21EaXIsIHRvRGlyLCBmaWx0ZXJpbmcsIGZvcmNlT3ZlcndyaXRlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gcmVuYW1lIGRpciAiICsgZnJvbURpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgdG9EaXIgKyAiIGR1ZSB0byAiICsgaW9lLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFyZW5hbWVkKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOworICAgICAgICAgICAgICAgICAgICBmcy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIGZzLnNldERpcihmcm9tRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkRmlsZXNldChmcyk7CisgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBkaXJzID0gZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgICAgICAgICAgICAgICAgICBzY2FuKGZyb21EaXIsIHRvRGlyLCBmaWxlcywgZGlycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCBtb3ZlQ291bnQgPSBmaWxlQ29weU1hcC5zaXplKCk7CisgICAgICAgIGlmIChtb3ZlQ291bnQgPiAwKSB7ICAgLy8gZmlsZXMgdG8gbW92ZQorICAgICAgICAgICAgbG9nKCJNb3ZpbmcgIiArIG1vdmVDb3VudCArICIgZmlsZSIgKyAoKG1vdmVDb3VudCA9PSAxKSA/ICIiIDogInMiKQorICAgICAgICAgICAgICAgICAgICArICIgdG8gIiArIGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGZyb21GaWxlcyA9IGZpbGVDb3B5TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGZyb21GaWxlcy5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZyb21GaWxlID0gKFN0cmluZykgZnJvbUZpbGVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmcm9tRmlsZSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxmTW92ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7IC8vSXMgdGhpcyBmaWxlIHN0aWxsIGF2YWlsYWJsZSB0byBiZSBtb3ZlZD8KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9GaWxlcyA9IChTdHJpbmdbXSkgZmlsZUNvcHlNYXAuZ2V0KGZyb21GaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b0ZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9GaWxlID0gKFN0cmluZykgdG9GaWxlc1tpXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21GaWxlLmVxdWFscyh0b0ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGluZyBzZWxmLW1vdmUgb2YgIiArIGZyb21GaWxlLCB2ZXJib3NpdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZNb3ZlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHdpbGwgbm90IG9jY3VyLCBidXQgdGhhdCdzIHdoYXQgd2Ugd2FudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkID0gbmV3IEZpbGUodG9GaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaSArIDEpID09IHRvRmlsZXMubGVuZ3RoICYmICFzZWxmTW92ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIG1vdmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBtYXBwZWQgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvbmUgb2YgdGhlIG1hcHBpbmdzIGlzbid0IHRvIGl0c2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVGaWxlKGYsIGQsIGZpbHRlcmluZywgZm9yY2VPdmVyd3JpdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5RmlsZShmLCBkLCBmaWx0ZXJpbmcsIGZvcmNlT3ZlcndyaXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmNsdWRlRW1wdHkpIHsKKyAgICAgICAgICAgIGludCBjcmVhdGVDb3VudCA9IDA7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGZyb21EaXJOYW1lcyA9IGRpckNvcHlNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgZnJvbURpck5hbWVzLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnJvbURpck5hbWUgPSAoU3RyaW5nKSBmcm9tRGlyTmFtZXMubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRvRGlyTmFtZXMgPSAoU3RyaW5nW10pIGRpckNvcHlNYXAuZ2V0KGZyb21EaXJOYW1lKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHNlbGZNb3ZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b0Rpck5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tRGlyTmFtZS5lcXVhbHModG9EaXJOYW1lc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiU2tpcHBpbmcgc2VsZi1tb3ZlIG9mICIgKyBmcm9tRGlyTmFtZSwgdmVyYm9zaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZNb3ZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZCA9IG5ldyBGaWxlKHRvRGlyTmFtZXNbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoIWQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZC5ta2RpcnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGUgZnJvbURpciA9IG5ldyBGaWxlKGZyb21EaXJOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGZNb3ZlICYmIG9rVG9EZWxldGUoZnJvbURpcikpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGlyKGZyb21EaXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjcmVhdGVDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBsb2coIk1vdmVkICIgKyBkaXJDb3B5TWFwLnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGVtcHR5IGRpcmVjdG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGlyQ29weU1hcC5zaXplKCkgPT0gMSA/ICJ5IiA6ICJpZXMiKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyBjcmVhdGVDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGVtcHR5IGRpcmVjdG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoY3JlYXRlQ291bnQgPT0gMSA/ICJ5IiA6ICJpZXMiKSArICIgdW5kZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBtb3ZlIHRoZSBmaWxlIHZpYSBhIHJlbmFtZSwgYnV0IGlmIHRoaXMgZmFpbHMgb3IgZmlsdGVyaW5nCisgICAgICogaXMgZW5hYmxlZCwgY29weSB0aGUgZmlsZSB0aGVuIGRlbGV0ZSB0aGUgc291cmNlRmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbW92ZUZpbGUoRmlsZSBmcm9tRmlsZSwgRmlsZSB0b0ZpbGUsIGJvb2xlYW4gZmlsdGVyaW5nLCBib29sZWFuIG92ZXJ3cml0ZSkgeworICAgICAgICBib29sZWFuIG1vdmVkID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2coIkF0dGVtcHRpbmcgdG8gcmVuYW1lOiAiICsgZnJvbUZpbGUgKyAiIHRvICIgKyB0b0ZpbGUsIHZlcmJvc2l0eSk7CisgICAgICAgICAgICBtb3ZlZCA9IHJlbmFtZUZpbGUoZnJvbUZpbGUsIHRvRmlsZSwgZmlsdGVyaW5nLCBmb3JjZU92ZXJ3cml0ZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gcmVuYW1lICIgKyBmcm9tRmlsZQorICAgICAgICAgICAgICAgICsgIiB0byAiICsgdG9GaWxlICsgIiBkdWUgdG8gIiArIGlvZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtb3ZlZCkgeworICAgICAgICAgICAgY29weUZpbGUoZnJvbUZpbGUsIHRvRmlsZSwgZmlsdGVyaW5nLCBvdmVyd3JpdGUpOworICAgICAgICAgICAgaWYgKCFmcm9tRmlsZS5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGRlbGV0ZSAiICsgImZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcm9tRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGZyb21GaWxlIHRvIHRvRmlsZS4KKyAgICAgKiBAcGFyYW0gZnJvbUZpbGUKKyAgICAgKiBAcGFyYW0gdG9GaWxlCisgICAgICogQHBhcmFtIGZpbHRlcmluZworICAgICAqIEBwYXJhbSBvdmVyd3JpdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY29weUZpbGUoRmlsZSBmcm9tRmlsZSwgRmlsZSB0b0ZpbGUsIGJvb2xlYW4gZmlsdGVyaW5nLCBib29sZWFuIG92ZXJ3cml0ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nKCJDb3B5aW5nICIgKyBmcm9tRmlsZSArICIgdG8gIiArIHRvRmlsZSwgdmVyYm9zaXR5KTsKKworICAgICAgICAgICAgRmlsdGVyU2V0Q29sbGVjdGlvbiBleGVjdXRpb25GaWx0ZXJzID0gbmV3IEZpbHRlclNldENvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBleGVjdXRpb25GaWx0ZXJzLmFkZEZpbHRlclNldChnZXRQcm9qZWN0KCkuZ2V0R2xvYmFsRmlsdGVyU2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBmaWx0ZXJJdGVyID0gZ2V0RmlsdGVyU2V0cygpLml0ZXJhdG9yKCk7IGZpbHRlckl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkZpbHRlcnMuYWRkRmlsdGVyU2V0KChGaWx0ZXJTZXQpIGZpbHRlckl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEZpbGVVdGlscygpLmNvcHlGaWxlKGZyb21GaWxlLCB0b0ZpbGUsIGV4ZWN1dGlvbkZpbHRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWx0ZXJDaGFpbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlT3ZlcndyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlc2VydmVMYXN0TW9kaWZpZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuY29kaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRFbmNvZGluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBjb3B5ICIgKyBmcm9tRmlsZQorICAgICAgICAgICAgICAgICAgICArICIgdG8gIiArIHRvRmlsZSArICIgZHVlIHRvICIgKyBpb2UuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEl0cyBvbmx5IG9rIHRvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0cmVlIGlmIHRoZXJlIGFyZSBubyBmaWxlcyBpbiBpdC4KKyAgICAgKiBAcGFyYW0gZCB0aGUgZGlyZWN0b3J5IHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIGEgZGVsZXRpb24gY2FuIGdvIGFoZWFkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb2tUb0RlbGV0ZShGaWxlIGQpIHsKKyAgICAgICAgU3RyaW5nW10gbGlzdCA9IGQubGlzdCgpOworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gICAgIC8vIG1heWJlIGlvIGVycm9yPworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBsaXN0W2ldOworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZCwgcyk7CisgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFva1RvRGVsZXRlKGYpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBmb3VuZCBhIGZpbGUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHbyBhbmQgZGVsZXRlIHRoZSBkaXJlY3RvcnkgdHJlZS4KKyAgICAgKiBAcGFyYW0gZCB0aGUgZGlyZWN0b3J5IHRvIGRlbGV0ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZURpcihGaWxlIGQpIHsKKyAgICAgICAgZGVsZXRlRGlyKGQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHbyBhbmQgZGVsZXRlIHRoZSBkaXJlY3RvcnkgdHJlZS4KKyAgICAgKiBAcGFyYW0gZCB0aGUgZGlyZWN0b3J5IHRvIGRlbGV0ZQorICAgICAqIEBwYXJhbSBkZWxldGVGaWxlcyB3aGV0aGVyIHRvIGRlbGV0ZSBmaWxlcworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZURpcihGaWxlIGQsIGJvb2xlYW4gZGVsZXRlRmlsZXMpIHsKKyAgICAgICAgU3RyaW5nW10gbGlzdCA9IGQubGlzdCgpOworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gICAgICAvLyBvbiBhbiBpbyBlcnJvciBsaXN0KCkgY2FuIHJldHVybiBudWxsCisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGxpc3RbaV07CisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkLCBzKTsKKyAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVEaXIoZik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlbGV0ZUZpbGVzICYmICEoZi5kZWxldGUoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBkZWxldGUgZmlsZSAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVU5FWFBFQ1RFRCBFUlJPUiAtIFRoZSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSArICIgc2hvdWxkIG5vdCBleGlzdCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2coIkRlbGV0aW5nIGRpcmVjdG9yeSAiICsgZC5nZXRBYnNvbHV0ZVBhdGgoKSwgdmVyYm9zaXR5KTsKKyAgICAgICAgaWYgKCFkLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBkZWxldGUgZGlyZWN0b3J5ICIgKyBkLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIHJlbmFtZSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uLgorICAgICAqIElmIG92ZXJ3cml0ZSBpcyBzZXQgdG8gdHJ1ZSwgdGhpcyBtZXRob2Qgb3ZlcndyaXRlcyBleGlzdGluZyBmaWxlCisgICAgICogZXZlbiBpZiB0aGUgZGVzdGluYXRpb24gZmlsZSBpcyBuZXdlci4gIE90aGVyd2lzZSwgdGhlIHNvdXJjZSBmaWxlIGlzCisgICAgICogcmVuYW1lZCBvbmx5IGlmIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzIG9sZGVyIHRoYW4gaXQuCisgICAgICogTWV0aG9kIHRoZW4gY2hlY2tzIGlmIHRva2VuIGZpbHRlcmluZyBpcyB1c2VkLiAgSWYgaXQgaXMsIHRoaXMgbWV0aG9kCisgICAgICogcmV0dXJucyBmYWxzZSBhc3N1bWluZyBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gdGhlIGNvcHlGaWxlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIHRoZSBmaWxlIHRvIHJlbmFtZQorICAgICAqIEBwYXJhbSBkZXN0RmlsZSAgIHRoZSBkZXN0aW5hdGlvbiBmaWxlCisgICAgICogQHBhcmFtIGZpbHRlcmluZyAgaWYgdHJ1ZSwgZmlsdGVyaW5nIGlzIGluIG9wZXJhdGlvbiwgZmlsZSB3aWxsCisgICAgICogICAgICAgICAgICAgICAgICAgYmUgY29waWVkL2RlbGV0ZWQgaW5zdGVhZCBvZiByZW5hbWVkCisgICAgICogQHBhcmFtIG92ZXJ3cml0ZSAgaWYgdHJ1ZSBmb3JjZSBvdmVyd3JpdGUgZXZlbiBpZiBkZXN0aW5hdGlvbiBmaWxlCisgICAgICogICAgICAgICAgICAgICAgICAgaXMgbmV3ZXIgdGhhbiBzb3VyY2UgZmlsZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgcmVuYW1lZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZW5hbWVGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwgYm9vbGVhbiBmaWx0ZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZXN0RmlsZS5pc0RpcmVjdG9yeSgpIHx8IGZpbHRlcmluZyB8fCBnZXRGaWx0ZXJTZXRzKCkuc2l6ZSgpID4gMAorICAgICAgICAgICAgICAgIHx8IGdldEZpbHRlckNoYWlucygpLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBpZGVudGljYWwgbG9naWMgbGl2ZXMgaW4gRmlsZVV0aWxzLnJlbmFtZSgpOgorICAgICAgICBGaWxlIHBhcmVudCA9IGRlc3RGaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZXN0RmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgc291cmNlRmlsZSA9IGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShzb3VyY2VGaWxlLmdldEFic29sdXRlUGF0aCgpKS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICBkZXN0RmlsZSA9IGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShkZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBpZiAoZGVzdEZpbGUuZXF1YWxzKHNvdXJjZUZpbGUpKSB7CisgICAgICAgICAgICAgICAgLy9ubyBwb2ludCBpbiByZW5hbWluZyBhIGZpbGUgdG8gaXRzIG93biBjYW5vbmljYWwgdmVyc2lvbi4uLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoc291cmNlRmlsZS5lcXVhbHMoZGVzdEZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpKSB8fCBkZXN0RmlsZS5kZWxldGUoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byByZW1vdmUgZXhpc3RpbmcgZmlsZSAiICsgZGVzdEZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzb3VyY2VGaWxlLnJlbmFtZVRvKGRlc3RGaWxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9OaWNlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9OaWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1YTNlMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL05pY2UuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogQSB0YXNrIHRvIHByb3ZpZGUgIm5pY2UtbmVzcyIgdG8gdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQvb3IgdG8KKyAqIHF1ZXJ5IHRoZSBjdXJyZW50IHZhbHVlLgorICogRXhhbXBsZXM6CisgKiA8cHJlPiAmbHQ7bmljZSBjdXJyZW50UHJpb3JpdHk9ImN1cnJlbnQudmFsdWUiICZndDs8L3ByZT48cD4KKyAqIFNldCA8Y29kZT5jdXJyZW50UHJpb3JpdHk8L2NvZGU+IHRvIHRoZSBjdXJyZW50IHByaW9yaXR5CisgKiA8cHJlPiAmbHQ7bmljZSBuZXdQcmlvcml0eT0iMTAiICZndDs8L3ByZT48cD4KKyAqIFJhaXNlIHRoZSBwcmlvcml0eSBvZiB0aGUgYnVpbGQgcHJvY2VzcyAoQnV0IG5vdCBmb3JrZWQgcHJvZ3JhbXMpCisgKiA8cHJlPiAmbHQ7bmljZSBjdXJyZW50UHJpb3JpdHk9Im9sZCIgbmV3UHJpb3JpdHk9IjMiICZndDs8L3ByZT48cD4KKyAqIExvd2VyIHRoZSBwcmlvcml0eSBvZiB0aGUgYnVpbGQgcHJvY2VzcyAoQnV0IG5vdCBmb3JrZWQgcHJvZ3JhbXMpLCBhbmQgc2F2ZQorICogdGhlIG9sZCB2YWx1ZSB0byB0aGUgcHJvcGVydHkgPGNvZGU+b2xkPC9jb2RlPi4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0ibmljZSIgY2F0ZWdvcnk9ImNvbnRyb2wiCisgKi8KK3B1YmxpYyBjbGFzcyBOaWNlIGV4dGVuZHMgVGFzayB7CisKKyAgICAvKioKKyAgICAgKiB0aGUgbmV3IHByaW9yaXR5CisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlZ2VyIG5ld1ByaW9yaXR5OworCisgICAgLyoqCisgICAgICogdGhlIGN1cnJlbnQgcHJpb3JpdHkKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjdXJyZW50UHJpb3JpdHk7CisKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzaworICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBUaHJlYWQgc2VsZiA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIGludCBwcmlvcml0eSA9IHNlbGYuZ2V0UHJpb3JpdHkoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRQcmlvcml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgY3VycmVudCA9IEludGVnZXIudG9TdHJpbmcocHJpb3JpdHkpOworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KGN1cnJlbnRQcmlvcml0eSwgY3VycmVudCk7CisgICAgICAgIH0KKyAgICAgICAgLy9pZiB0aGVyZSBpcyBhIG5ldyBwcmlvcml0eSwgYW5kIGl0IGlzIGRpZmZlcmVudCwgY2hhbmdlIGl0CisgICAgICAgIGlmIChuZXdQcmlvcml0eSAhPSBudWxsICYmIHByaW9yaXR5ICE9IG5ld1ByaW9yaXR5LmludFZhbHVlKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VsZi5zZXRQcmlvcml0eShuZXdQcmlvcml0eS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL2NhdGNoIHBlcm1pc3Npb25zIGRlbmlhbCBhbmQga2VlcCBnb2luZworICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIHNldCBuZXcgcHJpb3JpdHkgLWEgc2VjdXJpdHkgbWFuYWdlciBpcyBpbiB0aGUgd2F5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJpb3JpdHkgb3V0IG9mIHJhbmdlIiwgaWFlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudAorICAgICAqIHRocmVhZCBwcmlvcml0eS4gT3B0aW9uYWwKKyAgICAgKiBAcGFyYW0gY3VycmVudFByaW9yaXR5IHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRQcmlvcml0eShTdHJpbmcgY3VycmVudFByaW9yaXR5KSB7CisgICAgICAgIHRoaXMuY3VycmVudFByaW9yaXR5ID0gY3VycmVudFByaW9yaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoZSBuZXcgcHJpb3JpdHksIGluIHRoZSByYW5nZSAxLTEwLgorICAgICAqIEBwYXJhbSBuZXdQcmlvcml0eSB0aGUgbmV3IHByaW9yaXR5IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5ld1ByaW9yaXR5KGludCBuZXdQcmlvcml0eSkgeworICAgICAgICBpZiAobmV3UHJpb3JpdHkgPCBUaHJlYWQuTUlOX1BSSU9SSVRZIHx8IG5ld1ByaW9yaXR5ID4gVGhyZWFkLk1BWF9QUklPUklUWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgdGhyZWFkIHByaW9yaXR5IGlzIG91dCBvZiB0aGUgcmFuZ2UgMS0xMCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMubmV3UHJpb3JpdHkgPSBuZXcgSW50ZWdlcihuZXdQcmlvcml0eSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYWNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczNTY2NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhY2suamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworCisvKioKKyAqIEFic3RyYWN0IEJhc2UgY2xhc3MgZm9yIHBhY2sgdGFza3MuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFjayBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDggKiAxMDI0OworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIEZpbGUgemlwRmlsZTsKKyAgICBwcm90ZWN0ZWQgRmlsZSBzb3VyY2U7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKyAgICBwcml2YXRlIFJlc291cmNlIHNyYzsKKworICAgIC8qKgorICAgICAqIHRoZSByZXF1aXJlZCBkZXN0aW5hdGlvbiBmaWxlLgorICAgICAqIEBwYXJhbSB6aXBGaWxlIHRoZSBkZXN0aW5hdGlvbiBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WmlwZmlsZShGaWxlIHppcEZpbGUpIHsKKyAgICAgICAgdGhpcy56aXBGaWxlID0gemlwRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGUgcmVxdWlyZWQgZGVzdGluYXRpb24gZmlsZS4KKyAgICAgKiBAcGFyYW0gemlwRmlsZSB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RmaWxlKEZpbGUgemlwRmlsZSkgeworICAgICAgICBzZXRaaXBmaWxlKHppcEZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoZSBmaWxlIHRvIGNvbXByZXNzOyByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIHNyYykgeworICAgICAgICBzZXRTcmNSZXNvdXJjZShuZXcgRmlsZVJlc291cmNlKHNyYykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSB0byBwYWNrOyByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gc3JjIHJlc291cmNlIHRvIGV4cGFuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY1Jlc291cmNlKFJlc291cmNlIHNyYykgeworICAgICAgICBpZiAoc3JjLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIHNvdXJjZSBjYW4ndCBiZSBhIGRpcmVjdG9yeSIpOworICAgICAgICB9CisgICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHNvdXJjZSA9ICgoRmlsZVJlc291cmNlKSBzcmMpLmdldEZpbGUoKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBGaWxlU3lzdGVtIHJlc291cmNlcyBhcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHN1cHBvcnRlZC4iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNyYyA9IHNyYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNvdXJjZSByZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYSB0aGUgcmVzb3VyY2UgdG8gcGFjayBhcyBhIHNpbmdsZSBlbGVtZW50IFJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChSZXNvdXJjZUNvbGxlY3Rpb24gYSkgeworICAgICAgICBpZiAoYS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyByZXNvdXJjZSBzZWxlY3RlZCwgIiArIGdldFRhc2tOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG5lZWRzIGV4YWN0bHkgb25lIHJlc291cmNlLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChhLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza05hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgY2Fubm90IGhhbmRsZSBtdWx0aXBsZSByZXNvdXJjZXMgYXQgb25jZS4gKCIgKyBhLnNpemUoKQorICAgICAgICAgICAgICAgICAgICArICIgcmVzb3VyY2VzIHdlcmUgc2VsZWN0ZWQuKSIpOworICAgICAgICB9CisgICAgICAgIHNldFNyY1Jlc291cmNlKChSZXNvdXJjZSkgYS5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdmFsaWRhdGlvbiByb3V0aW5lCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbnl0aGluZyBpcyBpbnZhbGlkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHppcEZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ6aXBmaWxlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHppcEZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ6aXBmaWxlIGF0dHJpYnV0ZSBtdXN0IG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZXByZXNlbnQgYSBkaXJlY3RvcnkhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0U3JjUmVzb3VyY2UoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyYyBhdHRyaWJ1dGUgb3IgbmVzdGVkIHJlc291cmNlIGlzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdmFsaWRhdGUsIHRoZW4gaGFuZCBvZmYgdG8gdGhlIHN1YmNsYXNzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIFJlc291cmNlIHMgPSBnZXRTcmNSZXNvdXJjZSgpOworICAgICAgICBpZiAoIXMuaXNFeGlzdHMoKSkgeworICAgICAgICAgICAgbG9nKCJOb3RoaW5nIHRvIGRvOiAiICsgcy50b1N0cmluZygpCisgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3QgZXhpc3QuIik7CisgICAgICAgIH0gZWxzZSBpZiAoemlwRmlsZS5sYXN0TW9kaWZpZWQoKSA8IHMuZ2V0TGFzdE1vZGlmaWVkKCkpIHsKKyAgICAgICAgICAgIGxvZygiQnVpbGRpbmc6ICIgKyB6aXBGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHBhY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZygiTm90aGluZyB0byBkbzogIiArIHppcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICArICIgaXMgdXAgdG8gZGF0ZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHppcCBhIHN0cmVhbSB0byBhbiBvdXRwdXQgc3RyZWFtCisgICAgICogQHBhcmFtIGluICAgdGhlIHN0cmVhbSB0byB6aXAKKyAgICAgKiBAcGFyYW0gek91dCB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgemlwRmlsZShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIHpPdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHpPdXQud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7CisgICAgICAgICAgICBjb3VudCA9IGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKKyAgICAgICAgfSB3aGlsZSAoY291bnQgIT0gLTEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHppcCBhIGZpbGUgdG8gYW4gb3V0cHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIHppcAorICAgICAqIEBwYXJhbSB6T3V0IHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHppcEZpbGUoRmlsZSBmaWxlLCBPdXRwdXRTdHJlYW0gek91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgemlwUmVzb3VyY2UobmV3IEZpbGVSZXNvdXJjZShmaWxlKSwgek91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogemlwIGEgcmVzb3VyY2UgdG8gYW4gb3V0cHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gemlwCisgICAgICogQHBhcmFtIHpPdXQgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgemlwUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIE91dHB1dFN0cmVhbSB6T3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBySW4gPSByZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgemlwRmlsZShySW4sIHpPdXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgckluLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGRvIHRoZWlyIGNvbXByZXNzaW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGFjaygpOworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0U3JjUmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBzcmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRhc2sgY2FuIGRlYWwgd2l0aCBub24tZmlsZSByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgZmFsc2UuPC9wPgorICAgICAqIEByZXR1cm4gZmFsc2UuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c05vbkZpbGVSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXJhbGxlbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGFyYWxsZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWJkZjljCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGFyYWxsZWwuamF2YQpAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkxvY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFza0NvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIEV4ZWN1dGVzIHRoZSBjb250YWluZWQgdGFza3MgaW4gc2VwYXJhdGUgdGhyZWFkcywgY29udGludWluZworICogb25jZSBhbGwgYXJlIGNvbXBsZXRlZC4KKyAqIDxwPgorICogTmV3IGJlaGF2aW9yIGFsbG93cyBmb3IgdGhlIGFudCBzY3JpcHQgdG8gc3BlY2lmeSBhIG1heGltdW0gbnVtYmVyIG9mCisgKiB0aHJlYWRzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4gIE9uZSBzaG91bGQgYmUgdmVyeSBjYXJlZnVsIGFib3V0CisgKiB1c2luZyB0aGUgPGNvZGU+d2FpdEZvcjwvY29kZT4gdGFzayB3aGVuIHNwZWNpZnlpbmcgPGNvZGU+dGhyZWFkQ291bnQ8L2NvZGU+CisgKiBhcyBpdCBjYW4gY2F1c2UgZGVhZGxvY2tzIGlmIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpcyB0b28gc21hbGwgb3IgaWYgb25lIG9mCisgKiB0aGUgbmVzdGVkIHRhc2tzIGZhaWxzIHRvIGV4ZWN1dGUgY29tcGxldGVseS4gIFRoZSB0YXNrIHNlbGVjdGlvbiBhbGdvcml0aG0KKyAqIHdpbGwgaW5zdXJlIHRoYXQgdGhlIHRhc2tzIGxpc3RlZCBiZWZvcmUgYSB0YXNrIGhhdmUgc3RhcnRlZCBiZWZvcmUgdGhhdAorICogdGFzayBpcyBzdGFydGVkLCBidXQgaXQgd2lsbCBub3QgaW5zdXJlIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRob3NlCisgKiB0YXNrcyBvciB0aGF0IHRob3NlIHRhc2tzIHdpbGwgZmluaXNoIGZpcnN0IChpLmUuIGl0J3MgYSBjbGFzc2ljIHJhY2UKKyAqIGNvbmRpdGlvbikuCisgKiA8L3A+CisgKiBAc2luY2UgQW50IDEuNAorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iY29udHJvbCIKKyAqLworcHVibGljIGNsYXNzIFBhcmFsbGVsIGV4dGVuZHMgVGFzaworICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX1RSSUVTID0gMTAwOworCisgICAgLyoqIENsYXNzIHdoaWNoIGhvbGRzIGEgbGlzdCBvZiB0YXNrcyB0byBleGVjdXRlICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrTGlzdCBpbXBsZW1lbnRzIFRhc2tDb250YWluZXIgeworICAgICAgICAvKiogQ29sbGVjdGlvbiBob2xkaW5nIHRoZSBuZXN0ZWQgdGFza3MgKi8KKyAgICAgICAgcHJpdmF0ZSBMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBuZXN0ZWQgdGFzayB0byBleGVjdXRlIHBhcmFsbGVsIChhc3luY2hyb24pLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQHBhcmFtIG5lc3RlZFRhc2sgIE5lc3RlZCB0YXNrIHRvIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRhc2soVGFzayBuZXN0ZWRUYXNrKSB7CisgICAgICAgICAgICB0YXNrcy5hZGQobmVzdGVkVGFzayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ29sbGVjdGlvbiBob2xkaW5nIHRoZSBuZXN0ZWQgdGFza3MgKi8KKyAgICBwcml2YXRlIFZlY3RvciBuZXN0ZWRUYXNrcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKiBTZW1hcGhvcmUgdG8gbm90aWZ5IG9mIGNvbXBsZXRlZCB0aHJlYWRzICovCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc2VtYXBob3JlID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqIFRvdGFsIG51bWJlciBvZiB0aHJlYWRzIHRvIHJ1biAqLworICAgIHByaXZhdGUgaW50IG51bVRocmVhZHMgPSAwOworCisgICAgLyoqIFRvdGFsIG51bWJlciBvZiB0aHJlYWRzIHBlciBwcm9jZXNzb3IgdG8gcnVuLiAgKi8KKyAgICBwcml2YXRlIGludCBudW1UaHJlYWRzUGVyUHJvY2Vzc29yID0gMDsKKworICAgIC8qKiBUaGUgdGltZW91dCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICovCisgICAgcHJpdmF0ZSBsb25nIHRpbWVvdXQ7CisKKyAgICAvKiogSW5kaWNhdGVzIHRocmVhZHMgYXJlIHN0aWxsIHJ1bm5pbmcgYW5kIG5ldyB0aHJlYWRzIGNhbiBiZSBpc3N1ZWQgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RpbGxSdW5uaW5nOworCisgICAgLyoqIEluZGljYXRlcyB0aGF0IHRoZSBleGVjdXRpb24gdGltZWRvdXQgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdGltZWRPdXQ7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBmYWlsdXJlIG9mIGFueSBvZiB0aGUgbmVzdGVkIHRhc2tzIHNob3VsZCBlbmQKKyAgICAgKiBleGVjdXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmFpbE9uQW55OworCisgICAgLyoqIFRoZSBkYW1lb24gdGFzayBsaXN0IGlmIGFueSAqLworICAgIHByaXZhdGUgVGFza0xpc3QgZGFlbW9uVGFza3M7CisKKyAgICAvKiogQWNjdW11bGF0aW9uIG9mIGV4Y2VwdGlvbnMgbWVzc2FnZXMgZnJvbSBhbGwgbmVzdGVkIHRhc2tzICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXhjZXB0aW9uTWVzc2FnZTsKKworICAgIC8qKiBOdW1iZXIgb2YgZXhjZXB0aW9ucyBmcm9tIG5lc3RlZCB0YXNrcyAqLworICAgIHByaXZhdGUgaW50IG51bUV4Y2VwdGlvbnMgPSAwOworCisgICAgLyoqIFRoZSBmaXJzdCBleGNlcHRpb24gZW5jb3VudGVyZWQgKi8KKyAgICBwcml2YXRlIFRocm93YWJsZSBmaXJzdEV4Y2VwdGlvbjsKKworICAgIC8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IGV4Y2VwdGlvbiAqLworICAgIHByaXZhdGUgTG9jYXRpb24gZmlyc3RMb2NhdGlvbjsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGdyb3VwIG9mIGRhZW1vbiB0aHJlYWRzCisgICAgICogQHBhcmFtIGRhZW1vblRhc2tzIFRoZSB0YXNrcyB0byBiZSBleGVjdXRlZCBhcyBkYWVtb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGFlbW9ucyhUYXNrTGlzdCBkYWVtb25UYXNrcykgeworICAgICAgICBpZiAodGhpcy5kYWVtb25UYXNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIGRhZW1vbiBncm91cCBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmRhZW1vblRhc2tzID0gZGFlbW9uVGFza3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJ2YWwgdG8gcG9sbCBmb3IgY29tcGxldGVkIHRocmVhZHMgd2hlbiB0aHJlYWRDb3VudCBvcgorICAgICAqIHRocmVhZHNQZXJQcm9jZXNzb3IgaXMgc3BlY2lmaWVkLiAgSW50ZWdlciBpbiBtaWxsaXNlY29uZHMuOyBvcHRpb25hbAorICAgICAqCisgICAgICogQHBhcmFtIHBvbGxJbnRlcnZhbCBOZXcgdmFsdWUgb2YgcHJvcGVydHkgcG9sbEludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvbGxJbnRlcnZhbChpbnQgcG9sbEludGVydmFsKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIGEgZmFpbHVyZSBpbiBhIG5lc3RlZCB0YXNrIGhhbHRzIGV4ZWN1dGlvbi4gTm90ZSB0aGF0CisgICAgICogdGhlIHRhc2sgd2lsbCBjb21wbGV0ZSBidXQgZXhpc3RpbmcgdGhyZWFkcyB3aWxsIGNvbnRpbnVlIHRvIHJ1biAtIHRoZXkKKyAgICAgKiBhcmUgbm90IHN0b3BwZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWlsT25BbnkgaWYgdHJ1ZSBhbnkgbmVzdGVkIHRhc2sgZmFpbHVyZSBjYXVzZXMgcGFyYWxsZWwgdG8KKyAgICAgKiAgICAgICAgY29tcGxldGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbE9uQW55KGJvb2xlYW4gZmFpbE9uQW55KSB7CisgICAgICAgIHRoaXMuZmFpbE9uQW55ID0gZmFpbE9uQW55OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5lc3RlZCB0YXNrIHRvIGV4ZWN1dGUgaW4gcGFyYWxsZWwuCisgICAgICogQHBhcmFtIG5lc3RlZFRhc2sgIE5lc3RlZCB0YXNrIHRvIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrIG5lc3RlZFRhc2spIHsKKyAgICAgICAgbmVzdGVkVGFza3MuYWRkRWxlbWVudChuZXN0ZWRUYXNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEeW5hbWljYWxseSBnZW5lcmF0ZXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIGV4ZWN1dGUgYmFzZWQgb24gdGhlCisgICAgICogbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzICh2aWEKKyAgICAgKiA8Y29kZT5qYXZhLmxhbmcuUnVudGltZS5hdmFpbGFibGVQcm9jZXNzb3JzKCk8L2NvZGU+KS4gUmVxdWlyZXMgYSBKMlNFCisgICAgICogMS40IFZNLCBhbmQgaXQgd2lsbCBvdmVyd3JpdGUgdGhlIHZhbHVlIHNldCBpbiB0aHJlYWRDb3VudC4KKyAgICAgKiBJZiB1c2VkIGluIGEgMS4xLCAxLjIsIG9yIDEuMyBWTSB0aGVuIHRoZSB0YXNrIHdpbGwgZGVmZXIgdG8KKyAgICAgKiA8Y29kZT50aHJlYWRDb3VudDwvY29kZT4uOyBvcHRpb25hbAorICAgICAqIEBwYXJhbSBudW1UaHJlYWRzUGVyUHJvY2Vzc29yIE51bWJlciBvZiB0aHJlYWRzIHRvIGNyZWF0ZSBwZXIgYXZhaWxhYmxlCisgICAgICogICAgICAgIHByb2Nlc3Nvci4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRocmVhZHNQZXJQcm9jZXNzb3IoaW50IG51bVRocmVhZHNQZXJQcm9jZXNzb3IpIHsKKyAgICAgICAgdGhpcy5udW1UaHJlYWRzUGVyUHJvY2Vzc29yID0gbnVtVGhyZWFkc1BlclByb2Nlc3NvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGF0aWNhbGx5IGRldGVybWluZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGFza3MgdG8gZXhlY3V0ZQorICAgICAqIHNpbXVsdGFuZW91c2x5LiAgSWYgdGhlcmUgYXJlIGxlc3MgdGFza3MgdGhhbiB0aHJlYWRzIHRoZW4gYWxsIHdpbGwgYmUKKyAgICAgKiBleGVjdXRlZCBhdCBvbmNlLCBpZiB0aGVyZSBhcmUgbW9yZSB0aGVuIG9ubHkgPGNvZGU+dGhyZWFkQ291bnQ8L2NvZGU+CisgICAgICogdGFza3Mgd2lsbCBiZSBleGVjdXRlZCBhdCBvbmUgdGltZS4gIElmIDxjb2RlPnRocmVhZHNQZXJQcm9jZXNzb3I8L2NvZGU+CisgICAgICogaXMgc2V0IGFuZCB0aGUgSlZNIGlzIGF0IGxlYXN0IGEgMS40IFZNIHRoZW4gdGhpcyB2YWx1ZSBpcworICAgICAqIGlnbm9yZWQuOyBvcHRpb25hbAorICAgICAqCisgICAgICogQHBhcmFtIG51bVRocmVhZHMgdG90YWwgbnVtYmVyIG9mIHRocmVhZHMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRDb3VudChpbnQgbnVtVGhyZWFkcykgeworICAgICAgICB0aGlzLm51bVRocmVhZHMgPSBudW1UaHJlYWRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRpbWVvdXQgb24gdGhpcyBzZXQgb2YgdGFza3MuIElmIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQKKyAgICAgKiBiZWZvcmUgdGhlIG90aGVyIHRocmVhZHMgY29tcGxldGUsIHRoZSBleGVjdXRpb24gb2YgdGhpcworICAgICAqIHRhc2sgY29tcGxldGVzIHdpdGggYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGV4aXN0aW5nIHRocmVhZHMgY29udGludWUgdG8gcnVuLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcGFyYWxsZWwgdGFza3MKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSB0aHJlYWRzIGZhaWxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdXBkYXRlVGhyZWFkQ291bnRzKCk7CisgICAgICAgIGlmIChudW1UaHJlYWRzID09IDApIHsKKyAgICAgICAgICAgIG51bVRocmVhZHMgPSBuZXN0ZWRUYXNrcy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgc3BpblRocmVhZHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aHJlYWRzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaHJlYWRDb3VudHMoKSB7CisgICAgICAgIGlmIChudW1UaHJlYWRzUGVyUHJvY2Vzc29yICE9IDApIHsKKyAgICAgICAgICAgIGludCBudW1Qcm9jZXNzb3JzID0gZ2V0TnVtUHJvY2Vzc29ycygpOworICAgICAgICAgICAgaWYgKG51bVByb2Nlc3NvcnMgIT0gMCkgeworICAgICAgICAgICAgICAgIG51bVRocmVhZHMgPSBudW1Qcm9jZXNzb3JzICogbnVtVGhyZWFkc1BlclByb2Nlc3NvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRXhjZXB0aW9ucyhUYXNrUnVubmFibGVbXSBydW5uYWJsZXMpIHsKKyAgICAgICAgaWYgKHJ1bm5hYmxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5uYWJsZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSB0ID0gcnVubmFibGVzW2ldLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG51bUV4Y2VwdGlvbnMrKzsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RFeGNlcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdEV4Y2VwdGlvbiA9IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgZmlyc3RMb2NhdGlvbiA9PSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0TG9jYXRpb24gPSAoKEJ1aWxkRXhjZXB0aW9uKSB0KS5nZXRMb2NhdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZS5hcHBlbmQodC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BpbiB1cCByZXF1aXJlZCB0aHJlYWRzIHdpdGggYSBtYXhpbXVtIG51bWJlciBhY3RpdmUgYXQgYW55IGdpdmVuIHRpbWUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgdGhyZWFkcyBmYWlsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNwaW5UaHJlYWRzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IG51bVRhc2tzID0gbmVzdGVkVGFza3Muc2l6ZSgpOworICAgICAgICBUYXNrUnVubmFibGVbXSBydW5uYWJsZXMgPSBuZXcgVGFza1J1bm5hYmxlW251bVRhc2tzXTsKKyAgICAgICAgc3RpbGxSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgdGltZWRPdXQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBpbnRlcnJ1cHRlZCA9IGZhbHNlOworCisgICAgICAgIGludCB0aHJlYWROdW1iZXIgPSAwOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBuZXN0ZWRUYXNrcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOworICAgICAgICAgICAgIHRocmVhZE51bWJlcisrKSB7CisgICAgICAgICAgICBUYXNrIG5lc3RlZFRhc2sgPSAoVGFzaykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgcnVubmFibGVzW3RocmVhZE51bWJlcl0KKyAgICAgICAgICAgICAgICA9IG5ldyBUYXNrUnVubmFibGUobmVzdGVkVGFzayk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgbWF4UnVubmluZyA9IG51bVRhc2tzIDwgbnVtVGhyZWFkcyA/IG51bVRhc2tzIDogbnVtVGhyZWFkczsKKyAgICAgICAgVGFza1J1bm5hYmxlW10gcnVubmluZyA9IG5ldyBUYXNrUnVubmFibGVbbWF4UnVubmluZ107CisKKyAgICAgICAgdGhyZWFkTnVtYmVyID0gMDsKKyAgICAgICAgVGhyZWFkR3JvdXAgZ3JvdXAgPSBuZXcgVGhyZWFkR3JvdXAoInBhcmFsbGVsIik7CisKKyAgICAgICAgVGFza1J1bm5hYmxlW10gZGFlbW9ucyA9IG51bGw7CisgICAgICAgIGlmIChkYWVtb25UYXNrcyAhPSBudWxsICYmIGRhZW1vblRhc2tzLnRhc2tzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBkYWVtb25zID0gbmV3IFRhc2tSdW5uYWJsZVtkYWVtb25UYXNrcy50YXNrcy5zaXplKCldOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChzZW1hcGhvcmUpIHsKKyAgICAgICAgICAgIC8vIFdoZW4gd2UgbGVhdmUgdGhpcyBibG9jayB3ZSBjYW4gYmUgc3VyZSBhbGwgZGF0YSBpcyByZWFsbHkKKyAgICAgICAgICAgIC8vIHN0b3JlZCBpbiBtYWluIG1lbW9yeSBiZWZvcmUgdGhlIG5ldyB0aHJlYWRzIHN0YXJ0LCB0aGUgbmV3CisgICAgICAgICAgICAvLyB0aHJlYWRzIHdpbGwgZm9yIHN1cmUgbG9hZCB0aGUgZGF0YSBmcm9tIG1haW4gbWVtb3J5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgcHJvYmFibHkgaXMgc2xpZ2h0bHkgcGFyYW5vaWQuCisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlbWFwaG9yZSkgeworICAgICAgICAgICAgLy8gc3RhcnQgYW55IGRhZW1vbiB0aHJlYWRzCisgICAgICAgICAgICBpZiAoZGFlbW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYWVtb25zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGRhZW1vbnNbaV0gPSBuZXcgVGFza1J1bm5hYmxlKChUYXNrKSBkYWVtb25UYXNrcy50YXNrcy5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQgZGFlbW9uVGhyZWFkID0gIG5ldyBUaHJlYWQoZ3JvdXAsIGRhZW1vbnNbaV0pOworICAgICAgICAgICAgICAgICAgICBkYWVtb25UaHJlYWQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgICAgICAgICBkYWVtb25UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5vdyBydW4gbWFpbiB0aHJlYWRzIGluIGxpbWl0ZWQgbnVtYmVycy4uLgorICAgICAgICAgICAgLy8gc3RhcnQgaW5pdGlhbCBiYXRjaCBvZiB0aHJlYWRzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFJ1bm5pbmc7ICsraSkgeworICAgICAgICAgICAgICAgIHJ1bm5pbmdbaV0gPSBydW5uYWJsZXNbdGhyZWFkTnVtYmVyKytdOworICAgICAgICAgICAgICAgIFRocmVhZCB0aHJlYWQgPSAgbmV3IFRocmVhZChncm91cCwgcnVubmluZ1tpXSk7CisgICAgICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgdGltZW91dCB0aHJlYWQKKyAgICAgICAgICAgICAgICBUaHJlYWQgdGltZW91dFRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQodGltZW91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzZW1hcGhvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGxSdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtYXBob3JlLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdGltZW91dFRocmVhZC5zdGFydCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIG5vdyBmaW5kIGF2YWlsYWJsZSBydW5uaW5nIHNsb3RzIGZvciB0aGUgcmVtYWluaW5nIHRocmVhZHMKKyAgICAgICAgICAgICAgICBvdXRlcjogd2hpbGUgKHRocmVhZE51bWJlciA8IG51bVRhc2tzICYmIHN0aWxsUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFJ1bm5pbmc7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdbaV0gPT0gbnVsbCB8fCBydW5uaW5nW2ldLmlzRmluaXNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdbaV0gPSBydW5uYWJsZXNbdGhyZWFkTnVtYmVyKytdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKGdyb3VwLCBydW5uaW5nW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSBvbiBvdXRlciB3aGlsZSBsb29wIHRvIGdldCBhbm90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIHNsb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBoZXJlIGFsbCBzbG90cyBpbiB1c2UsIHNvIHNsZWVwIHVudGlsCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBoYXBwZW5zCisgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZS53YWl0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gYXJlIGFsbCB0aHJlYWRzIGZpbmlzaGVkCisgICAgICAgICAgICAgICAgb3V0ZXIyOiB3aGlsZSAoc3RpbGxSdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4UnVubmluZzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVubmluZ1tpXSAhPSBudWxsICYmICFydW5uaW5nW2ldLmlzRmluaXNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyZWFkICIgKyBpICsgIiBpcyBzdGlsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsaXZlICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJ1bm5pbmcgLSB3YWl0IGZvciBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZS53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXIyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0aWxsUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBraWxsQWxsKHJ1bm5pbmcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGludGVycnVwdGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlBhcmFsbGVsIGV4ZWN1dGlvbiBpbnRlcnJ1cHRlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGltZWRPdXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUGFyYWxsZWwgZXhlY3V0aW9uIHRpbWVkIG91dCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IGRpZCBhbnkgb2YgdGhlIHRocmVhZHMgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICAgIGV4Y2VwdGlvbk1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIG51bUV4Y2VwdGlvbnMgPSAwOworICAgICAgICBmaXJzdEV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIGZpcnN0TG9jYXRpb24gPSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OOworICAgICAgICBwcm9jZXNzRXhjZXB0aW9ucyhkYWVtb25zKTsKKyAgICAgICAgcHJvY2Vzc0V4Y2VwdGlvbnMocnVubmFibGVzKTsKKworICAgICAgICBpZiAobnVtRXhjZXB0aW9ucyA9PSAxKSB7CisgICAgICAgICAgICBpZiAoZmlyc3RFeGNlcHRpb24gaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgZmlyc3RFeGNlcHRpb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihmaXJzdEV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobnVtRXhjZXB0aW9ucyA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGNlcHRpb25NZXNzYWdlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMb2NhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2Vzbid0IGRvIGFueXRoaW5nIGlmIGFsbCB0aHJlYWRzIHdoZXJlIGFscmVhZHkgZ29uZSwKKyAgICAgKiBlbHNlIGl0IHRyaWVzIHRvIGludGVycnVwdCB0aGUgdGhyZWFkcyAxMDAgdGltZXMuCisgICAgICogQHBhcmFtIHJ1bm5pbmcgVGhlIGxpc3Qgb2YgdGFza3MgdGhhdCBtYXkgY3VycmVudGx5IGJlIHJ1bm5pbmcuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGtpbGxBbGwoVGFza1J1bm5hYmxlW10gcnVubmluZykgeworICAgICAgICBib29sZWFuIG9uZUFsaXZlOworICAgICAgICBpbnQgdHJpZXMgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBvbmVBbGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5uaW5nLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdbaV0gIT0gbnVsbCAmJiAhcnVubmluZ1tpXS5pc0ZpbmlzaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcnVubmluZ1tpXS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgIG9uZUFsaXZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob25lQWxpdmUpIHsKKyAgICAgICAgICAgICAgICB0cmllcysrOworICAgICAgICAgICAgICAgIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChvbmVBbGl2ZSAmJiB0cmllcyA8IE5VTUJFUl9UUklFUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycy4gT25seSBlZmZlY3RpdmUgb24gSmF2YSAxLjQrCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdmFpbGFibGUgb3IgMCBpZiBub3QgZGV0ZXJtaW5hYmxlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldE51bVByb2Nlc3NvcnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSB7fTsKKyAgICAgICAgICAgIE1ldGhvZCBhdmFpbGFibGVQcm9jZXNzb3JzID0KKyAgICAgICAgICAgICAgICBSdW50aW1lLmNsYXNzLmdldE1ldGhvZCgiYXZhaWxhYmxlUHJvY2Vzc29ycyIsIHBhcmFtVHlwZXMpOworCisgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0ge307CisgICAgICAgICAgICBJbnRlZ2VyIHJldCA9IChJbnRlZ2VyKSBhdmFpbGFibGVQcm9jZXNzb3JzLmludm9rZShSdW50aW1lLmdldFJ1bnRpbWUoKSwgYXJncyk7CisgICAgICAgICAgICByZXR1cm4gcmV0LmludFZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyByZXR1cm4gYSBib2d1cyBudW1iZXIKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhyZWFkIHRoYXQgZXhlY3MgYSB0YXNrCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBUYXNrUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHByaXZhdGUgVGhyb3dhYmxlIGV4Y2VwdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBUYXNrIHRhc2s7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmaW5pc2hlZDsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUaHJlYWQgdGhyZWFkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVGFza1J1bm5hYmxlLjxwPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGFzayB0aGUgVGFzayB0byBiZSBleGVjdXRlZCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICAgKi8KKyAgICAgICAgVGFza1J1bm5hYmxlKFRhc2sgdGFzaykgeworICAgICAgICAgICAgdGhpcy50YXNrID0gdGFzazsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGVjdXRlcyB0aGUgdGFzayB3aXRoaW4gYSB0aHJlYWQgYW5kIHRha2VzIGNhcmUgYWJvdXQKKyAgICAgICAgICogRXhjZXB0aW9ucyByYWlzZWQgd2l0aGluIHRoZSB0YXNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgICAgIHRhc2sucGVyZm9ybSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSB0OworICAgICAgICAgICAgICAgIGlmIChmYWlsT25BbnkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RpbGxSdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlbWFwaG9yZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNlbWFwaG9yZS5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogZ2V0IGFueSBleGNlcHRpb24gdGhhdCBnb3QgdGhyb3duIGR1cmluZyBleGVjdXRpb247CisgICAgICAgICAqIEByZXR1cm4gYW4gZXhjZXB0aW9uIG9yIG51bGwgZm9yIG5vIGV4Y2VwdGlvbi9ub3QgeWV0IGZpbmlzaGVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvdmlkZXMgdGhlIGluZGljYXRvciB0aGF0IHRoZSB0YXNrIGhhcyBiZWVuIGZpbmlzaGVkLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB0YXNrIGlzIGZpbmlzaGVkLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZpbmlzaGVkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbnRlcnJ1cHQoKSB7CisgICAgICAgICAgICB0aHJlYWQuaW50ZXJydXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGNoLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZmMxMTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRjaC5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogUGF0Y2hlcyBhIGZpbGUgYnkgYXBwbHlpbmcgYSAnZGlmZicgZmlsZSB0byBpdDsgcmVxdWlyZXMgInBhdGNoIiB0byBiZQorICogb24gdGhlIGV4ZWN1dGlvbiBwYXRoLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJ1dGlsaXR5IgorICovCitwdWJsaWMgY2xhc3MgUGF0Y2ggZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgRmlsZSBvcmlnaW5hbEZpbGU7CisgICAgcHJpdmF0ZSBGaWxlIGRpcmVjdG9yeTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZVBhdGNoZmlsZSA9IGZhbHNlOworICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgY21kID0gbmV3IENvbW1hbmRsaW5lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0byBwYXRjaDsgb3B0aW9uYWwgaWYgaXQgY2FuIGJlIGluZmVycmVkIGZyb20KKyAgICAgKiB0aGUgZGlmZiBmaWxlCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gcGF0Y2gKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmlnaW5hbGZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIG9yaWdpbmFsRmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgYSBmaWxlIHRvIHNlbmQgdGhlIG91dHB1dCB0bywgaW5zdGVhZCBvZiBwYXRjaGluZworICAgICAqIHRoZSBmaWxlKHMpIGluIHBsYWNlOyBvcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBzZW5kIHRoZSBvdXRwdXQgdG8KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RmaWxlKEZpbGUgZmlsZSkgeworICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW8iKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoZmlsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSBjb250YWluaW5nIHRoZSBkaWZmIG91dHB1dDsgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZGlmZiBvdXRwdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRjaGZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYXRjaGZpbGUgIiArIGZpbGUgKyAiIGRvZXNuXCd0IGV4aXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWkiKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShmaWxlKTsKKyAgICAgICAgaGF2ZVBhdGNoZmlsZSA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmxhZyB0byBjcmVhdGUgYmFja3Vwczsgb3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UKKyAgICAgKiBAcGFyYW0gYmFja3VwcyBpZiB0cnVlIGNyZWF0ZSBiYWNrdXBzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFja3Vwcyhib29sZWFuIGJhY2t1cHMpIHsKKyAgICAgICAgaWYgKGJhY2t1cHMpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZmxhZyB0byBpZ25vcmUgd2hpdGVzcGFjZSBkaWZmZXJlbmNlczsgZGVmYXVsdD1mYWxzZQorICAgICAqIEBwYXJhbSBpZ25vcmUgaWYgdHJ1ZSBpZ25vcmUgd2hpdGVzcGFjZSBkaWZmZXJlbmNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZXdoaXRlc3BhY2UoYm9vbGVhbiBpZ25vcmUpIHsKKyAgICAgICAgaWYgKGlnbm9yZSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1sIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJpcCB0aGUgc21hbGxlc3QgcHJlZml4IGNvbnRhaW5pbmcgPGk+bnVtPC9pPiBsZWFkaW5nIHNsYXNoZXMKKyAgICAgKiBmcm9tIGZpbGVuYW1lcy4KKyAgICAgKgorICAgICAqIDxwPnBhdGNoJ3MgPGk+LXA8L2k+IG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gbnVtIG51bWJlciBvZiBsaW5lcyB0byBzdHJpcAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgbnVtIGlzIDwgMCwgb3Igb3RoZXIgZXJyb3JzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RyaXAoaW50IG51bSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG51bSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3RyaXAgaGFzIHRvIGJlID49IDAiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXAiICsgbnVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXb3JrIHNpbGVudGx5IHVubGVzcyBhbiBlcnJvciBvY2N1cnM7IG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlCisgICAgICogQHBhcmFtIHEgaWYgdHJ1ZSBzdXBwcmVzcyBzZXQgdGhlIC1zIG9wdGlvbiBvbiB0aGUgcGF0Y2ggY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gcSkgeworICAgICAgICBpZiAocSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1zIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3N1bWUgcGF0Y2ggd2FzIGNyZWF0ZWQgd2l0aCBvbGQgYW5kIG5ldyBmaWxlcyBzd2FwcGVkOyBvcHRpb25hbCwKKyAgICAgKiBkZWZhdWx0PWZhbHNlCisgICAgICogQHBhcmFtIHIgaWYgdHJ1ZSBzZXQgdGhlIC1SIG9wdGlvbiBvbiB0aGUgcGF0Y2ggY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldmVyc2UoYm9vbGVhbiByKSB7CisgICAgICAgIGlmIChyKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLVIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgdG8gcnVuIHRoZSBwYXRjaCBjb21tYW5kIGluLCBkZWZhdWx0cyB0byB0aGUKKyAgICAgKiBwcm9qZWN0J3MgYmFzZSBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgZGlyZWN0b3J5IHRvIHJ1biB0aGUgcGF0Y2ggY29tbWFuZCBpbgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgZGlyZWN0b3J5KSB7CisgICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIGV4ZWN1dGUgcGF0Y2gKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHdoZW4gaXQgYWxsIGdvZXMgYSBiaXQgcGVhciBzaGFwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFoYXZlUGF0Y2hmaWxlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInBhdGNoZmlsZSBhcmd1bWVudCBpcyByZXF1aXJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29tbWFuZGxpbmUgdG9FeGVjdXRlID0gKENvbW1hbmRsaW5lKSBjbWQuY2xvbmUoKTsKKyAgICAgICAgdG9FeGVjdXRlLnNldEV4ZWN1dGFibGUoInBhdGNoIik7CisKKyAgICAgICAgaWYgKG9yaWdpbmFsRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKG9yaWdpbmFsRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsIFByb2plY3QuTVNHX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZSh0b0V4ZWN1dGUuZ2V0Q29tbWFuZGxpbmUoKSk7CisKKyAgICAgICAgaWYgKGRpcmVjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZGlyZWN0b3J5LmV4aXN0cygpICYmIGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyZWN0b3J5KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGRpcmVjdG9yeSArICIgaXMgbm90IGEgZGlyZWN0b3J5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRpcmVjdG9yeSAiICsgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzblwndCBleGlzdCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBsb2codG9FeGVjdXRlLmRlc2NyaWJlQ29tbWFuZCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZS5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGhDb252ZXJ0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRoQ29udmVydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjI5YmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRoQ29udmVydC5qYXZhCkBAIC0wLDAgKzEsNDg3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5VbmlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVOYW1lTWFwcGVyOworCisvKioKKyAqIENvbnZlcnRzIHBhdGggYW5kIGNsYXNzcGF0aCBpbmZvcm1hdGlvbiB0byBhIHNwZWNpZmljIHRhcmdldCBPUworICogZm9ybWF0LiBUaGUgcmVzdWx0aW5nIGZvcm1hdHRlZCBwYXRoIGlzIHBsYWNlZCBpbnRvIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgKgorICogQHNpbmNlIEFudCAxLjQKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0idXRpbGl0eSIKKyAqLworcHVibGljIGNsYXNzIFBhdGhDb252ZXJ0IGV4dGVuZHMgVGFzayB7CisKKyAgICAvKioKKyAgICAgKiBTZXQgaWYgd2UncmUgcnVubmluZyBvbiB3aW5kb3dzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBvbldpbmRvd3MgPSBPcy5pc0ZhbWlseSgiZG9zIik7CisKKyAgICAvLyBNZW1iZXJzCisgICAgLyoqCisgICAgICogUGF0aCB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFVuaW9uIHBhdGggPSBudWxsOworICAgIC8qKgorICAgICAqIFJlZmVyZW5jZSB0byBwYXRoL2ZpbGVzZXQgdG8gY29udmVydAorICAgICAqLworICAgIHByaXZhdGUgUmVmZXJlbmNlIHJlZmlkID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBUaGUgdGFyZ2V0IE9TIHR5cGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRPUyA9IG51bGw7CisgICAgLyoqCisgICAgICogU2V0IHdoZW4gdGFyZ2V0T1MgaXMgc2V0IHRvIHdpbmRvd3MKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdGFyZ2V0V2luZG93cyA9IGZhbHNlOworICAgIC8qKgorICAgICAqIFNldCBpZiB3ZSBzaG91bGQgY3JlYXRlIGEgbmV3IHByb3BlcnR5IGV2ZW4gaWYgdGhlIHJlc3VsdCBpcyBlbXB0eQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzZXRvbmVtcHR5ID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgY29udmVyc2lvbgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5ID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBQYXRoIHByZWZpeCBtYXAKKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBwcmVmaXhNYXAgPSBuZXcgVmVjdG9yKCk7CisgICAgLyoqCisgICAgICogVXNlciBvdmVycmlkZSBvbiBwYXRoIHNlcCBjaGFyCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFNlcCA9IG51bGw7CisgICAgLyoqCisgICAgICogVXNlciBvdmVycmlkZSBvbiBkaXJlY3Rvcnkgc2VwIGNoYXIKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkaXJTZXAgPSBudWxsOworCisgICAgLyoqIEZpbGVuYW1lIG1hcHBlciAqLworICAgIHByaXZhdGUgTWFwcGVyIG1hcHBlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBhdGhDb252ZXJ0IHRhc2suCisgICAgICovCisgICAgcHVibGljIFBhdGhDb252ZXJ0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBjbGFzcywgaG9sZHMgdGhlIG5lc3RlZCAmbHQ7bWFwJmd0OyB2YWx1ZXMuIEVsZW1lbnRzIHdpbGwgbG9vayBsaWtlCisgICAgICogdGhpczogJmx0O21hcCBmcm9tPSZxdW90O2Q6JnF1b3Q7IHRvPSZxdW90Oy9mb28mcXVvdDsvJmd0OworICAgICAqCisgICAgICogV2hlbiBydW5uaW5nIG9uIHdpbmRvd3MsIHRoZSBwcmVmaXggY29tcGFyaXNvbiB3aWxsIGJlIGNhc2UKKyAgICAgKiBpbnNlbnNpdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTWFwRW50cnkgeworCisgICAgICAgIC8vIE1lbWJlcnMKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZnJvbSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRvID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSAmcXVvdDtmcm9tJnF1b3Q7IGF0dHJpYnV0ZSBvZiB0aGUgbWFwIGVudHJ5LgorICAgICAgICAgKiBAcGFyYW0gZnJvbSB0aGUgcHJlZml4IHN0cmluZyB0byBzZWFyY2ggZm9yOyByZXF1aXJlZC4KKyAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgdmFsdWUgaXMgY2FzZS1pbnNlbnNpdGl2ZSB3aGVuIHRoZSBidWlsZCBpcworICAgICAgICAgKiBydW5uaW5nIG9uIGEgV2luZG93cyBwbGF0Zm9ybSBhbmQgY2FzZS1zZW5zaXRpdmUgd2hlbiBydW5uaW5nIG9uCisgICAgICAgICAqIGEgVW5peCBwbGF0Zm9ybS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHsKKyAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSByZXBsYWNlbWVudCB0ZXh0IHRvIHVzZSB3aGVuIGZyb20gaXMgbWF0Y2hlZDsgcmVxdWlyZWQuCisgICAgICAgICAqIEBwYXJhbSB0byBuZXcgcHJlZml4LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VG8oU3RyaW5nIHRvKSB7CisgICAgICAgICAgICB0aGlzLnRvID0gdG87CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXBwbHkgdGhpcyBtYXAgZW50cnkgdG8gYSBnaXZlbiBwYXRoIGVsZW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlbGVtIFBhdGggZWxlbWVudCB0byBwcm9jZXNzLgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyBVcGRhdGVkIHBhdGggZWxlbWVudCBhZnRlciBtYXBwaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShTdHJpbmcgZWxlbSkgeworICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCB8fCB0byA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCb3RoICdmcm9tJyBhbmQgJ3RvJyBtdXN0IGJlIHNldCAiCisgICAgICAgICAgICAgICAgICAgICArICJpbiBhIG1hcCBlbnRyeSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgd2UncmUgb24gd2luZG93cywgdGhlbiBkbyB0aGUgY29tcGFyaXNvbiBpZ25vcmluZyBjYXNlCisgICAgICAgICAgICAvLyBhbmQgdHJlYXQgdGhlIHR3byBkaXJlY3RvcnkgY2hhcmFjdGVycyB0aGUgc2FtZQorICAgICAgICAgICAgU3RyaW5nIGNtcEVsZW0gPQorICAgICAgICAgICAgICAgIG9uV2luZG93cyA/IGVsZW0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdcXCcsICcvJykgOiBlbGVtOworICAgICAgICAgICAgU3RyaW5nIGNtcEZyb20gPQorICAgICAgICAgICAgICAgIG9uV2luZG93cyA/IGZyb20udG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdcXCcsICcvJykgOiBmcm9tOworCisgICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBzdGFydHMgd2l0aCB0aGUgY29uZmlndXJlZCBwcmVmaXgsIHRoZW4KKyAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIHByZWZpeCB0byB0aGUgY29uZmlndXJlZCAndG8nIHZhbHVlLgorCisgICAgICAgICAgICByZXR1cm4gY21wRWxlbS5zdGFydHNXaXRoKGNtcEZyb20pCisgICAgICAgICAgICAgICAgPyB0byArIGVsZW0uc3Vic3RyaW5nKGZyb20ubGVuZ3RoKCkpIDogZWxlbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCB0YXJnZXRzOgorICAgICAqICJ3aW5kb3dzIiwgInVuaXgiLCAibmV0d2FyZSIsIGFuZCAib3MvMiIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYXJnZXRPcyBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoaXMgZW51bWVyYXRlZCBhdHRyaWJ1dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsid2luZG93cyIsICJ1bml4IiwgIm5ldHdhcmUiLCAib3MvMiIsICJ0YW5kZW0ifTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5lc3RlZCBwYXRoIGVsZW1lbnQuCisgICAgICogQHJldHVybiBhIFBhdGggdG8gYmUgdXNlZCBieSBBbnQgcmVmbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVQYXRoKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBQYXRoIHJlc3VsdCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIGFkZChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhcmJpdHJhcnkgUmVzb3VyY2VDb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSByYyB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0UGF0aCgpLmFkZChyYyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgVW5pb24gZ2V0UGF0aCgpIHsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcGF0aCA9IG5ldyBVbmlvbigpOworICAgICAgICAgICAgcGF0aC5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmVzdGVkIE1BUCBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYSBNYXAgdG8gY29uZmlndXJlLgorICAgICAqLworICAgIHB1YmxpYyBNYXBFbnRyeSBjcmVhdGVNYXAoKSB7CisgICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gbmV3IE1hcEVudHJ5KCk7CisgICAgICAgIHByZWZpeE1hcC5hZGRFbGVtZW50KGVudHJ5KTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0YXJnZXRvcyB0byBhIHBsYXRmb3JtIHRvIG9uZSBvZgorICAgICAqICJ3aW5kb3dzIiwgInVuaXgiLCAibmV0d2FyZSIsIG9yICJvcy8yIjsKKyAgICAgKiBjdXJyZW50IHBsYXRmb3JtIHNldHRpbmdzIGFyZSB1c2VkIGJ5IGRlZmF1bHQuCisgICAgICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IG9zLgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFVzZSB0aGUgbWV0aG9kIHRha2luZyBhIFRhcmdldE9zIGFyZ3VtZW50IGluc3RlYWQuCisgICAgICogQHNlZSAjc2V0VGFyZ2V0b3MoUGF0aENvbnZlcnQuVGFyZ2V0T3MpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0b3MoU3RyaW5nIHRhcmdldCkgeworICAgICAgICBUYXJnZXRPcyB0byA9IG5ldyBUYXJnZXRPcygpOworICAgICAgICB0by5zZXRWYWx1ZSh0YXJnZXQpOworICAgICAgICBzZXRUYXJnZXRvcyh0byk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRhcmdldG9zIHRvIGEgcGxhdGZvcm0gdG8gb25lIG9mCisgICAgICogIndpbmRvd3MiLCAidW5peCIsICJuZXR3YXJlIiwgb3IgIm9zLzIiOworICAgICAqIGN1cnJlbnQgcGxhdGZvcm0gc2V0dGluZ3MgYXJlIHVzZWQgYnkgZGVmYXVsdC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgb3MKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0b3MoVGFyZ2V0T3MgdGFyZ2V0KSB7CisgICAgICAgIHRhcmdldE9TID0gdGFyZ2V0LmdldFZhbHVlKCk7CisKKyAgICAgICAgLy8gQ3VycmVudGx5LCB3ZSBkZWFsIHdpdGggb25seSB0d28gcGF0aCBmb3JtYXRzOiBVbml4IGFuZCBXaW5kb3dzCisgICAgICAgIC8vIEFuZCBVbml4IGlzIGV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgV2luZG93cworCisgICAgICAgIC8vIGZvciBOZXRXYXJlIGFuZCBPUy8yLCBwaWdneS1iYWNrIG9uIFdpbmRvd3MsIHNpbmNlIGluIHRoZQorICAgICAgICAvLyB2YWxpZGF0ZVNldHVwIGNvZGUsIHRoZSBzYW1lIGFzc3VtcHRpb25zIGNhbiBiZSBtYWRlIGFzCisgICAgICAgIC8vIHdpdGggd2luZG93cyAtIHRoYXQgOyBpcyB0aGUgcGF0aCBzZXBhcmF0b3IKKworICAgICAgICB0YXJnZXRXaW5kb3dzID0gIXRhcmdldE9TLmVxdWFscygidW5peCIpICYmICF0YXJnZXRPUy5lcXVhbHMoInRhbmRlbSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaWYgdGhlIHJlc3VsdAorICAgICAqIGlzIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICogQHBhcmFtIHNldG9uZW1wdHkgdHJ1ZSBvciBmYWxzZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldFNldG9uZW1wdHkoYm9vbGVhbiBzZXRvbmVtcHR5KSB7CisgICAgICAgICB0aGlzLnNldG9uZW1wdHkgPSBzZXRvbmVtcHR5OworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGludG8gd2hpY2ggdGhlIGNvbnZlcnRlZCBwYXRoIHdpbGwgYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBwIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwKSB7CisgICAgICAgIHByb3BlcnR5ID0gcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZWZlcmVuY2UgdG8gYSBQYXRoLCBGaWxlU2V0LCBEaXJTZXQsIG9yIEZpbGVMaXN0IGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gYSBwYXRoLCBmaWxlc2V0LCBkaXJzZXQgb3IgZmlsZWxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZWZpZCA9IHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IHBhdGggc2VwYXJhdG9yIHN0cmluZzsgZGVmYXVsdHMgdG8gY3VycmVudCBKVk0KKyAgICAgKiB7QGxpbmsgamF2YS5pby5GaWxlI3BhdGhTZXBhcmF0b3IgRmlsZS5wYXRoU2VwYXJhdG9yfS4KKyAgICAgKiBAcGFyYW0gc2VwIHBhdGggc2VwYXJhdG9yIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoU2VwKFN0cmluZyBzZXApIHsKKyAgICAgICAgcGF0aFNlcCA9IHNlcDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBkaXJlY3Rvcnkgc2VwYXJhdG9yIHN0cmluZzsKKyAgICAgKiBkZWZhdWx0cyB0byBjdXJyZW50IEpWTSB7QGxpbmsgamF2YS5pby5GaWxlI3NlcGFyYXRvciBGaWxlLnNlcGFyYXRvcn0uCisgICAgICogQHBhcmFtIHNlcCBkaXJlY3Rvcnkgc2VwYXJhdG9yIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXJTZXAoU3RyaW5nIHNlcCkgeworICAgICAgICBkaXJTZXAgPSBzZXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGVhcm4gd2hldGhlciB0aGUgcmVmaWQgYXR0cmlidXRlIG9mIHRoaXMgZWxlbWVudCBiZWVuIHNldC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmVmaWQgaXMgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKSB7CisgICAgICAgIHJldHVybiByZWZpZCAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHRoZSBleGVjdXRpb24uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgaXMgaW52YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgVW5pb24gc2F2ZWRQYXRoID0gcGF0aDsKKyAgICAgICAgU3RyaW5nIHNhdmVkUGF0aFNlcCA9IHBhdGhTZXA7IC8vIG1heSBiZSBhbHRlcmVkIGluIHZhbGlkYXRlU2V0dXAKKyAgICAgICAgU3RyaW5nIHNhdmVkRGlyU2VwID0gZGlyU2VwOyAvLyBtYXkgYmUgYWx0ZXJlZCBpbiB2YWxpZGF0ZVNldHVwCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBhIHJlZmVyZW5jZSwgY3JlYXRlIGEgUGF0aCBmcm9tIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSByZWZpZC5nZXRSZWZlcmVuY2VkT2JqZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFJlc291cmNlQ29sbGVjdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJyZWZpZCAnIiArIHJlZmlkLmdldFJlZklkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicgZG9lcyBub3QgcmVmZXIgdG8gYSByZXNvdXJjZSBjb2xsZWN0aW9uLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZXRQYXRoKCkuYWRkKChSZXNvdXJjZUNvbGxlY3Rpb24pIG8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsaWRhdGVTZXR1cCgpOyAvLyB2YWxpZGF0ZSBvdXIgc2V0dXAKKworICAgICAgICAgICAgLy8gQ3VycmVudGx5LCB3ZSBkZWFsIHdpdGggb25seSB0d28gcGF0aCBmb3JtYXRzOiBVbml4IGFuZCBXaW5kb3dzCisgICAgICAgICAgICAvLyBBbmQgVW5peCBpcyBldmVyeXRoaW5nIHRoYXQgaXMgbm90IFdpbmRvd3MKKyAgICAgICAgICAgIC8vICh3aXRoIHRoZSBleGNlcHRpb24gZm9yIE5ldFdhcmUgYW5kIE9TLzIgYmVsb3cpCisKKyAgICAgICAgICAgIC8vIGZvciBOZXRXYXJlIGFuZCBPUy8yLCBwaWdneS1iYWNrIG9uIFdpbmRvd3MsIHNpbmNlIGhlcmUgYW5kCisgICAgICAgICAgICAvLyBpbiB0aGUgYXBwbHkgY29kZSwgdGhlIHNhbWUgYXNzdW1wdGlvbnMgY2FuIGJlIG1hZGUgYXMgd2l0aAorICAgICAgICAgICAgLy8gd2luZG93cyAtIHRoYXQgXFwgaXMgYW4gT0sgc2VwYXJhdG9yLCBhbmQgZG8gY29tcGFyaXNvbnMKKyAgICAgICAgICAgIC8vIGNhc2UtaW5zZW5zaXRpdmUuCisgICAgICAgICAgICBTdHJpbmcgZnJvbURpclNlcCA9IG9uV2luZG93cyA/ICJcXCIgOiAiLyI7CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciByc2x0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGF0aCBjb21wb25lbnRzIGluIGNhbm9uaWNhbCBmb3JtCisgICAgICAgICAgICBTdHJpbmdbXSBlbGVtcyA9IHBhdGgubGlzdCgpOworCisgICAgICAgICAgICBpZiAobWFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBpbXBsID0gbWFwcGVyLmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgICAgICAgICAgTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBtYXBwZWQgPSBpbXBsLm1hcEZpbGVOYW1lKGVsZW1zW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG1hcHBlZCAhPSBudWxsICYmIG0gPCBtYXBwZWQubGVuZ3RoOyArK20pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hZGQobWFwcGVkW21dKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbGVtcyA9IChTdHJpbmdbXSkgcmV0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXQuc2l6ZSgpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW0gPSBtYXBFbGVtZW50KGVsZW1zW2ldKTsgLy8gQXBwbHkgdGhlIHBhdGggcHJlZml4IG1hcAorCisgICAgICAgICAgICAgICAgLy8gTm93IGNvbnZlcnQgdGhlIHBhdGggYW5kIGZpbGUgc2VwYXJhdG9yIGNoYXJhY3RlcnMgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG9zIHRvIHRoZSB0YXJnZXQgb3MuCisKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJzbHQuYXBwZW5kKHBhdGhTZXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3REaXJlY3RvcnkgPQorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW0sIGZyb21EaXJTZXAsIHRydWUpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHN0RGlyZWN0b3J5Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBzdERpcmVjdG9yeS5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgcnNsdC5hcHBlbmQoZnJvbURpclNlcC5lcXVhbHModG9rZW4pID8gZGlyU2VwIDogdG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFBsYWNlIHRoZSByZXN1bHQgaW50byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LAorICAgICAgICAgICAgLy8gdW5sZXNzIHNldG9uZW1wdHkgPT0gZmFsc2UKKyAgICAgICAgICAgIGlmIChzZXRvbmVtcHR5IHx8IHJzbHQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcnNsdC50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJTZXQgcHJvcGVydHkgIiArIHByb3BlcnR5ICsgIiA9ICIgKyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwYXRoID0gc2F2ZWRQYXRoOworICAgICAgICAgICAgZGlyU2VwID0gc2F2ZWREaXJTZXA7CisgICAgICAgICAgICBwYXRoU2VwID0gc2F2ZWRQYXRoU2VwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbHkgdGhlIGNvbmZpZ3VyZWQgbWFwIHRvIGEgcGF0aCBlbGVtZW50LiBUaGUgbWFwIGlzIHVzZWQgdG8gY29udmVydAorICAgICAqIGJldHdlZW4gV2luZG93cyBkcml2ZSBsZXR0ZXJzIGFuZCBVbml4IHBhdGhzLiBJZiBubyBtYXAgaXMgY29uZmlndXJlZCwKKyAgICAgKiB0aGVuIHRoZSBpbnB1dCBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW0gVGhlIHBhdGggZWxlbWVudCB0byBhcHBseSB0aGUgbWFwIHRvLgorICAgICAqIEByZXR1cm4gU3RyaW5nIFVwZGF0ZWQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtYXBFbGVtZW50KFN0cmluZyBlbGVtKSB7CisKKyAgICAgICAgaW50IHNpemUgPSBwcmVmaXhNYXAuc2l6ZSgpOworCisgICAgICAgIGlmIChzaXplICE9IDApIHsKKworICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBtYXAgZW50cmllcyBhbmQgYXBwbHkgZWFjaCBvbmUuCisgICAgICAgICAgICAvLyBTdG9wIHdoZW4gb25lIG9mIHRoZSBlbnRyaWVzIGFjdHVhbGx5IGNoYW5nZXMgdGhlIGVsZW1lbnQuCisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTWFwRW50cnkgZW50cnkgPSAoTWFwRW50cnkpIHByZWZpeE1hcC5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5ld0VsZW0gPSBlbnRyeS5hcHBseShlbGVtKTsKKworICAgICAgICAgICAgICAgIC8vIE5vdGUgSSdtIHVzaW5nICIhPSIgdG8gc2VlIGlmIHdlIGdvdCBhIG5ldyBvYmplY3QgYmFjayBmcm9tCisgICAgICAgICAgICAgICAgLy8gdGhlIGFwcGx5IG1ldGhvZC4KKworICAgICAgICAgICAgICAgIGlmIChuZXdFbGVtICE9IGVsZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbSA9IG5ld0VsZW07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXZSBhcHBsaWVkIG9uZSwgc28gd2UncmUgZG9uZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZWxlbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBtYXBwZXIgdG8gY29udmVydCB0aGUgZmlsZSBuYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwZXIgYSA8Y29kZT5NYXBwZXI8L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBlcihNYXBwZXIgbWFwcGVyKSB7CisgICAgICAgIGlmICh0aGlzLm1hcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCBkZWZpbmUgbW9yZSB0aGFuIG9uZSBtYXBwZXIiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXN0ZWQgZmlsZW5hbWVtYXBwZXIuCisgICAgICogQHBhcmFtIGZpbGVOYW1lTWFwcGVyIHRoZSBtYXBwZXIgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZU5hbWVNYXBwZXIgZmlsZU5hbWVNYXBwZXIpIHsKKyAgICAgICAgTWFwcGVyIG0gPSBuZXcgTWFwcGVyKGdldFByb2plY3QoKSk7CisgICAgICAgIG0uYWRkKGZpbGVOYW1lTWFwcGVyKTsKKyAgICAgICAgYWRkTWFwcGVyKG0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoYXQgYWxsIG91ciBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGlzIG5vdCBzZXQgdXAgcHJvcGVybHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2V0dXAoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgc3BlY2lmeSBhIHBhdGggdG8gY29udmVydCIpOworICAgICAgICB9CisgICAgICAgIC8vIERldGVybWluZSB0aGUgc2VwYXJhdG9yIHN0cmluZ3MuICBUaGUgZGlyc2VwIGFuZCBwYXRoc2VwIGF0dHJpYnV0ZXMKKyAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIHRhcmdldE9TIHNldHRpbmdzLgorICAgICAgICBTdHJpbmcgZHNlcCA9IEZpbGUuc2VwYXJhdG9yOworICAgICAgICBTdHJpbmcgcHNlcCA9IEZpbGUucGF0aFNlcGFyYXRvcjsKKworICAgICAgICBpZiAodGFyZ2V0T1MgIT0gbnVsbCkgeworICAgICAgICAgICAgcHNlcCA9IHRhcmdldFdpbmRvd3MgPyAiOyIgOiAiOiI7CisgICAgICAgICAgICBkc2VwID0gdGFyZ2V0V2luZG93cyA/ICJcXCIgOiAiLyI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdGhTZXAgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gb3ZlcnJpZGUgd2l0aCBwYXRoc2VwPQorICAgICAgICAgICAgcHNlcCA9IHBhdGhTZXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpclNlcCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBvdmVycmlkZSB3aXRoIGRpcnNlcD0KKyAgICAgICAgICAgIGRzZXAgPSBkaXJTZXA7CisgICAgICAgIH0KKyAgICAgICAgcGF0aFNlcCA9IHBzZXA7CisgICAgICAgIGRpclNlcCA9IGRzZXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBleGNlcHRpb24gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIFhNTCBlbGVtZW50IG11c3Qgbm90IGhhdmUKKyAgICAgKiBjaGlsZCBlbGVtZW50cyBpZiB0aGUgcmVmaWQgYXR0cmlidXRlIGlzIHNldC4KKyAgICAgKiBAcmV0dXJuIEJ1aWxkRXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgQnVpbGRFeGNlcHRpb24gbm9DaGlsZHJlbkFsbG93ZWQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCAiCisgICAgICAgICAgICAgKyAiZWxlbWVudHMgd2hlbiB1c2luZyB0aGUgcmVmaWQgYXR0cmlidXRlLiIpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QcmVTZXREZWYuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ByZVNldERlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTc3MDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QcmVTZXREZWYuamF2YQpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50VHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQ29tcG9uZW50SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2tDb250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVW5rbm93bkVsZW1lbnQ7CisKKy8qKgorICogVGhlIHByZXNldCBkZWZpbml0aW9uIHRhc2sgZ2VuZXJhdGVzIGEgbmV3IGRlZmluaXRpb24KKyAqIGJhc2VkIG9uIGEgY3VycmVudCBkZWZpbml0aW9uIHdpdGggc29tZSBhdHRyaWJ1dGVzIG9yCisgKiBlbGVtZW50cyBwcmVzZXQuCisgKiA8cHJlPgorICogJmx0O3ByZXNldGRlZiBuYW1lPSJteS5qYXZhYyImZ3Q7CisgKiAgICZsdDtqYXZhYyBkZXByZWNhdGlvbj0iJHtkZXByZWNhdGlvbn0iIGRlYnVnPSIke2RlYnVnfSIvJmd0OworICogJmx0Oy9wcmVzZXRkZWYmZ3Q7CisgKiAmbHQ7bXkuamF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImNsYXNzZXMiLyZndDsKKyAqIDwvcHJlPgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBQcmVTZXREZWYgZXh0ZW5kcyBBbnRsaWJEZWZpbml0aW9uIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7CisgICAgcHJpdmF0ZSBVbmtub3duRWxlbWVudCBuZXN0ZWRUYXNrOworICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgbmFtZTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGlzIGRlZmluaXRpb24uCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlZmluaXRpb24uCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXN0ZWQgdGFzayB0byBwcmVkZWZpbmUgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgb24uCisgICAgICogQHBhcmFtIG5lc3RlZFRhc2sgIE5lc3RlZCB0YXNrL3R5cGUgdG8gZXh0ZW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRhc2soVGFzayBuZXN0ZWRUYXNrKSB7CisgICAgICAgIGlmICh0aGlzLm5lc3RlZFRhc2sgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBuZXN0ZWQgZWxlbWVudCBhbGxvd2VkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobmVzdGVkVGFzayBpbnN0YW5jZW9mIFVua25vd25FbGVtZW50KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJhZGRUYXNrIGNhbGxlZCB3aXRoIGEgdGFzayB0aGF0IGlzIG5vdCBhbiB1bmtub3duIGVsZW1lbnQiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm5lc3RlZFRhc2sgPSAoVW5rbm93bkVsZW1lbnQpIG5lc3RlZFRhc2s7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IGRlZmluaXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgaWYgKG5lc3RlZFRhc2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNaXNzaW5nIG5lc3RlZCBlbGVtZW50Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOYW1lIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgICAgICBuYW1lID0gUHJvamVjdEhlbHBlci5nZW5Db21wb25lbnROYW1lKGdldFVSSSgpLCBuYW1lKTsKKworICAgICAgICBDb21wb25lbnRIZWxwZXIgaGVscGVyID0gQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEhlbHBlcigKKyAgICAgICAgICAgIGdldFByb2plY3QoKSk7CisKKyAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBQcm9qZWN0SGVscGVyLmdlbkNvbXBvbmVudE5hbWUoCisgICAgICAgICAgICBuZXN0ZWRUYXNrLmdldE5hbWVzcGFjZSgpLCBuZXN0ZWRUYXNrLmdldFRhZygpKTsKKworICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSBoZWxwZXIuZ2V0RGVmaW5pdGlvbihjb21wb25lbnROYW1lKTsKKyAgICAgICAgaWYgKGRlZiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIHR5cGVkZWYgIiArIGNvbXBvbmVudE5hbWUpOworICAgICAgICB9CisgICAgICAgIFByZVNldERlZmluaXRpb24gbmV3RGVmID0gbmV3IFByZVNldERlZmluaXRpb24oZGVmLCBuZXN0ZWRUYXNrKTsKKworICAgICAgICBuZXdEZWYuc2V0TmFtZShuYW1lKTsKKworICAgICAgICBoZWxwZXIuYWRkRGF0YVR5cGVEZWZpbml0aW9uKG5ld0RlZik7CisgICAgICAgIGxvZygiZGVmaW5pbmcgcHJlc2V0ICIgKyBuYW1lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSB1bmtub3duIGVsZW1lbnQgYW5kIHRoZSBvYmplY3QKKyAgICAgKiB0aGF0IGlzIHByZWRlZmluZWQuCisgICAgICogQHNlZSBBbnRUeXBlRGVmaW5pdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlU2V0RGVmaW5pdGlvbiBleHRlbmRzIEFudFR5cGVEZWZpbml0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBBbnRUeXBlRGVmaW5pdGlvbiBwYXJlbnQ7CisgICAgICAgIHByaXZhdGUgVW5rbm93bkVsZW1lbnQgICAgZWxlbWVudDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmVzZXREZWZpbml0aW9uPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoaXMgcHJlZGVmaW5pdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGVsICAgICBUaGUgcHJlZGVmaW5lZCBhdHRyaWJ1dGVzLCBuZXN0ZWQgZWxlbWVudHMgYW5kIHRleHQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUHJlU2V0RGVmaW5pdGlvbihBbnRUeXBlRGVmaW5pdGlvbiBwYXJlbnQsIFVua25vd25FbGVtZW50IGVsKSB7CisgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgUHJlU2V0RGVmaW5pdGlvbikgeworICAgICAgICAgICAgICAgIFByZVNldERlZmluaXRpb24gcCA9IChQcmVTZXREZWZpbml0aW9uKSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgZWwuYXBwbHlQcmVTZXQocC5lbGVtZW50KTsKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBwLnBhcmVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgc28gdGhhdCBpdCBpcyBub3QgYWxsb3dlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsYXp6IGEgPGNvZGU+Q2xhc3M8L2NvZGU+IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3MoQ2xhc3MgY2xhenopIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHNvIHRoYXQgaXQgaXMgbm90IGFsbG93ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGFzc05hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY2xhc3NuYW1lIG9mIHRoZSBkZWZpbml0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGlzIGRlZmluaXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBhZGFwdGVyIGNsYXNzIGZvciB0aGlzIGRlZmluaXRpb24uCisgICAgICAgICAqIE5PVCBTdXBwb3J0ZWQKKyAgICAgICAgICogQHBhcmFtIGFkYXB0ZXJDbGFzcyB0aGUgYWRhcHRlckNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlckNsYXNzKENsYXNzIGFkYXB0ZXJDbGFzcykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBhc3NpZ25hYmxlIGNsYXNzIGZvciB0aGlzIGRlZmluaXRpb24uCisgICAgICAgICAqIE5PVCBTVVBQT1JURUQKKyAgICAgICAgICogQHBhcmFtIGFkYXB0VG9DbGFzcyB0aGUgYXNzaWduYWJsZSBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0VG9DbGFzcyhDbGFzcyBhZGFwdFRvQ2xhc3MpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZQorICAgICAgICAgKiBvZiB0aGUgZGVmaW5pdGlvbi4KKyAgICAgICAgICogTk9UIFNVUFBPUlRFRAorICAgICAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgdGhlIGNsYXNzTG9hZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY2xhc3Nsb2FkZXIgZm9yIHRoaXMgZGVmaW5pdGlvbi4KKyAgICAgICAgICogQHJldHVybiB0aGUgY2xhc3Nsb2FkZXIgZm9yIHRoaXMgZGVmaW5pdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGV4cG9zZWQgY2xhc3MgZm9yIHRoaXMgZGVmaW5pdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgICAgICogQHJldHVybiB0aGUgZXhwb3NlZCBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRFeHBvc2VkQ2xhc3MoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldEV4cG9zZWRDbGFzcyhwcm9qZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRlZmluaXRpb24gY2xhc3MuCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGRlZmluaXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRUeXBlQ2xhc3MocHJvamVjdCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayBpZiB0aGUgYXR0cmlidXRlcyBhcmUgY29ycmVjdC4KKyAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrQ2xhc3MoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgICAgICBwYXJlbnQuY2hlY2tDbGFzcyhwcm9qZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmluaXRpb24uIFRoZSBpbnN0YW5jZSBtYXkgYmUgd3JhcHBlZAorICAgICAgICAgKiBpbiBhIHByb3h5IGNsYXNzLiBUaGlzIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGNyZWF0ZSBmb3IKKyAgICAgICAgICogSW50cm9zcGVjdGlvbkhlbHBlciBhbmQgVW5rbm93bkVsZW1lbnQuCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVPYmplY3QoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gcGFyZW50LmNyZWF0ZShwcm9qZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHByZXNldCB2YWx1ZXMuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHByZWRlZmluZWQgYXR0cmlidXRlcywgZWxlbWVudHMgYW5kIHRleHQgYXMKKyAgICAgICAgICogICAgICAgICBhbiBVbmtub3duRWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBVbmtub3duRWxlbWVudCBnZXRQcmVTZXRzKCkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmFrZSBjcmVhdGUgYW4gb2JqZWN0LCB1c2VkIGJ5IEludHJvc3BlY3Rpb25IZWxwZXIgYW5kIFVua25vd25FbGVtZW50CisgICAgICAgICAqIHRvIHNlZSB0aGF0IHRoaXMgaXMgYSBwcmVkZWZpbmVkIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgICAgICogQHJldHVybiB0aGlzIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRXF1YWxpdHkgbWV0aG9kIGZvciB0aGlzIGRlZmluaXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvdGhlciBhbm90aGVyIGRlZmluaXRpb24uCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2FtZURlZmluaXRpb24oQW50VHlwZURlZmluaXRpb24gb3RoZXIsIFByb2plY3QgcHJvamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIChvdGhlciAhPSBudWxsICYmIG90aGVyLmdldENsYXNzKCkgPT0gZ2V0Q2xhc3MoKSAmJiBwYXJlbnQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHBhcmVudC5zYW1lRGVmaW5pdGlvbigoKFByZVNldERlZmluaXRpb24pIG90aGVyKS5wYXJlbnQsIHByb2plY3QpCisgICAgICAgICAgICAgICAgJiYgZWxlbWVudC5zaW1pbGFyKCgoUHJlU2V0RGVmaW5pdGlvbikgb3RoZXIpLmVsZW1lbnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTaW1pbGFyIG1ldGhvZCBmb3IgdGhpcyBkZWZpbml0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3RoZXIgYW5vdGhlciBkZWZpbml0aW9uLgorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRlZmluaXRpb25zIGFyZSBzaW1pbGFyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2ltaWxhckRlZmluaXRpb24oCisgICAgICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBvdGhlciwgUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gKG90aGVyICE9IG51bGwgJiYgb3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpKSAmJiBwYXJlbnQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHBhcmVudC5zaW1pbGFyRGVmaW5pdGlvbigoKFByZVNldERlZmluaXRpb24pIG90aGVyKS5wYXJlbnQsIHByb2plY3QpCisgICAgICAgICAgICAgICAgJiYgZWxlbWVudC5zaW1pbGFyKCgoUHJlU2V0RGVmaW5pdGlvbikgb3RoZXIpLmVsZW1lbnQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb2Nlc3NEZXN0cm95ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb2Nlc3NEZXN0cm95ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzc2MzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvY2Vzc0Rlc3Ryb3llci5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiBEZXN0cm95cyBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5Qcm9jZXNzPC9jb2RlPmVzIHdoZW4gdGhlIFZNIGV4aXRzLgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK2NsYXNzIFByb2Nlc3NEZXN0cm95ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUkVBRF9ESUVfVElNRU9VVCA9IDIwMDAwOworICAgIHByaXZhdGUgVmVjdG9yIHByb2Nlc3NlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAvLyBtZXRob2RzIHRvIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyIHNodXRkb3duIGhvb2tzCisgICAgcHJpdmF0ZSBNZXRob2QgYWRkU2h1dGRvd25Ib29rTWV0aG9kOworICAgIHByaXZhdGUgTWV0aG9kIHJlbW92ZVNodXRkb3duSG9va01ldGhvZDsKKyAgICBwcml2YXRlIFByb2Nlc3NEZXN0cm95ZXJJbXBsIGRlc3Ryb3lQcm9jZXNzVGhyZWFkID0gbnVsbDsKKworICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoaXMgUHJvY2Vzc0Rlc3Ryb3llciBoYXMgYmVlbiByZWdpc3RlcmVkIGFzIGEKKyAgICAvLyBzaHV0ZG93biBob29rCisgICAgcHJpdmF0ZSBib29sZWFuIGFkZGVkID0gZmFsc2U7CisgICAgLy8gd2hldGhlciBvciBub3QgdGhpcyBQcm9jZXNzRGVzdHJveWVyIGlzIGN1cnJlbnRseSBydW5uaW5nIGFzCisgICAgLy8gc2h1dGRvd24gaG9vaworICAgIHByaXZhdGUgYm9vbGVhbiBydW5uaW5nID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGNsYXNzIFByb2Nlc3NEZXN0cm95ZXJJbXBsIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZERlc3Ryb3kgPSB0cnVlOworCisgICAgICAgIHB1YmxpYyBQcm9jZXNzRGVzdHJveWVySW1wbCgpIHsKKyAgICAgICAgICAgIHN1cGVyKCJQcm9jZXNzRGVzdHJveWVyIFNodXRkb3duIEhvb2siKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAoc2hvdWxkRGVzdHJveSkgeworICAgICAgICAgICAgICAgIFByb2Nlc3NEZXN0cm95ZXIudGhpcy5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNob3VsZERlc3Ryb3koYm9vbGVhbiBzaG91bGREZXN0cm95KSB7CisgICAgICAgICAgICB0aGlzLnNob3VsZERlc3Ryb3kgPSBzaG91bGREZXN0cm95OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIDxjb2RlPlByb2Nlc3NEZXN0cm95ZXI8L2NvZGU+IGFuZCBvYnRhaW5zCisgICAgICogPGNvZGU+UnVudGltZS5hZGRTaHV0ZG93bkhvb2soKTwvY29kZT4gYW5kCisgICAgICogPGNvZGU+UnVudGltZS5yZW1vdmVTaHV0ZG93bkhvb2soKTwvY29kZT4gdGhyb3VnaCByZWZsZWN0aW9uLiBUaGUKKyAgICAgKiBQcm9jZXNzRGVzdHJveWVyIG1hbmFnZXMgYSBsaXN0IG9mIHByb2Nlc3NlcyB0byBiZSBkZXN0cm95ZWQgd2hlbiB0aGUKKyAgICAgKiBWTSBleGl0cy4gSWYgYSBwcm9jZXNzIGlzIGFkZGVkIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHksCisgICAgICogdGhpcyA8Y29kZT5Qcm9jZXNzRGVzdHJveWVyPC9jb2RlPiBpcyByZWdpc3RlcmVkIGFzIGEgc2h1dGRvd24gaG9vay4gSWYKKyAgICAgKiByZW1vdmluZyBhIHByb2Nlc3MgcmVzdWx0cyBpbiBhbiBlbXB0eSBsaXN0LCB0aGUKKyAgICAgKiA8Y29kZT5Qcm9jZXNzRGVzdHJveWVyPC9jb2RlPiBpcyByZW1vdmVkIGFzIGEgc2h1dGRvd24gaG9vay4KKyAgICAgKi8KKyAgICBQcm9jZXNzRGVzdHJveWVyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBzaHV0ZG93biBob29rIG1ldGhvZHMgZXhpc3RzCisgICAgICAgICAgICAvLyAoc3VwcG9ydCBwcmUtSkRLIDEuMyBhbmQgTm9uLVN1biBWTXMpCisgICAgICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSB7VGhyZWFkLmNsYXNzfTsKKyAgICAgICAgICAgIGFkZFNodXRkb3duSG9va01ldGhvZCA9CisgICAgICAgICAgICAgICAgUnVudGltZS5jbGFzcy5nZXRNZXRob2QoImFkZFNodXRkb3duSG9vayIsIHBhcmFtVHlwZXMpOworCisgICAgICAgICAgICByZW1vdmVTaHV0ZG93bkhvb2tNZXRob2QgPQorICAgICAgICAgICAgICAgIFJ1bnRpbWUuY2xhc3MuZ2V0TWV0aG9kKCJyZW1vdmVTaHV0ZG93bkhvb2siLCBwYXJhbVR5cGVzKTsKKyAgICAgICAgICAgIC8vIHdhaXQgdG8gYWRkIHNodXRkb3duIGhvb2sgYXMgbmVlZGVkCisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpdCBqdXN0IHdvbid0IGJlIGFkZGVkIGFzIGEgc2h1dGRvd24gaG9vay4uLiA6KAorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyB0aGlzIDxjb2RlPlByb2Nlc3NEZXN0cm95ZXI8L2NvZGU+IGFzIGEgc2h1dGRvd24gaG9vaywKKyAgICAgKiB1c2VzIHJlZmxlY3Rpb24gdG8gZW5zdXJlIHByZS1KREsgMS4zIGNvbXBhdGliaWxpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFNodXRkb3duSG9vaygpIHsKKyAgICAgICAgaWYgKGFkZFNodXRkb3duSG9va01ldGhvZCAhPSBudWxsICYmICFydW5uaW5nKSB7CisgICAgICAgICAgICBkZXN0cm95UHJvY2Vzc1RocmVhZCA9IG5ldyBQcm9jZXNzRGVzdHJveWVySW1wbCgpOworICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IHtkZXN0cm95UHJvY2Vzc1RocmVhZH07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFkZFNodXRkb3duSG9va01ldGhvZC5pbnZva2UoUnVudGltZS5nZXRSdW50aW1lKCksIGFyZ3MpOworICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCAmJiB0LmdldENsYXNzKCkgPT0gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNodXRkb3duIGFscmVhZHkgaXMgaW4gcHJvZ3Jlc3MKKyAgICAgICAgICAgICAgICAgICAgcnVubmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoaXMgPGNvZGU+UHJvY2Vzc0Rlc3Ryb3llcjwvY29kZT4gYXMgYSBzaHV0ZG93biBob29rLAorICAgICAqIHVzZXMgcmVmbGVjdGlvbiB0byBlbnN1cmUgcHJlLUpESyAxLjMgY29tcGF0aWJpbGl0eQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZW1vdmVTaHV0ZG93bkhvb2soKSB7CisgICAgICAgIGlmIChyZW1vdmVTaHV0ZG93bkhvb2tNZXRob2QgIT0gbnVsbCAmJiBhZGRlZCAmJiAhcnVubmluZykgeworICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IHtkZXN0cm95UHJvY2Vzc1RocmVhZH07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJvb2xlYW4gcmVtb3ZlZCA9CisgICAgICAgICAgICAgICAgICAgIChCb29sZWFuKSByZW1vdmVTaHV0ZG93bkhvb2tNZXRob2QuaW52b2tlKAorICAgICAgICAgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlbW92ZWQuYm9vbGVhblZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgcmVtb3ZlIHNodXRkb3duIGhvb2siKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmICh0ICE9IG51bGwgJiYgdC5nZXRDbGFzcygpID09IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICAvLyBzaHV0ZG93biBhbHJlYWR5IGlzIGluIHByb2dyZXNzCisgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc3RhcnQgdGhlIGhvb2sgdGhyZWFkLCBhIHVuc3RhcnRlZCB0aHJlYWQgbWF5IG5vdCBiZQorICAgICAgICAgICAgLy8gZWxpZ2libGUgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbgorICAgICAgICAgICAgLy8gQ2YuOiBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDUzMzA4Ny5odG1sCisgICAgICAgICAgICBkZXN0cm95UHJvY2Vzc1RocmVhZC5zZXRTaG91bGREZXN0cm95KGZhbHNlKTsKKyAgICAgICAgICAgIGlmICghZGVzdHJveVByb2Nlc3NUaHJlYWQuZ2V0VGhyZWFkR3JvdXAoKS5pc0Rlc3Ryb3llZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gc3RhcnQoKSB3b3VsZCB0aHJvdyBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZnJvbQorICAgICAgICAgICAgICAgIC8vIFRocmVhZEdyb3VwLmFkZCBpZiBpdCB3ZXJlIGRlc3Ryb3llZAorICAgICAgICAgICAgICAgIGRlc3Ryb3lQcm9jZXNzVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCByZXR1cm4gcXVpY2tseSwgc2luY2UgaXQgYmFzaWNhbGx5IGlzIGEgTk8tT1AuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRlc3Ryb3lQcm9jZXNzVGhyZWFkLmpvaW4oVEhSRUFEX0RJRV9USU1FT1VUKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIHRocmVhZCBkaWRuJ3QgZGllIGluIHRpbWUKKyAgICAgICAgICAgICAgICAvLyBpdCBzaG91bGQgbm90IGtpbGwgYW55IHByb2Nlc3NlcyB1bmV4cGVjdGVkbHkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3Ryb3lQcm9jZXNzVGhyZWFkID0gbnVsbDsKKyAgICAgICAgICAgIGFkZGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBQcm9jZXNzRGVzdHJveWVyIGlzIHJlZ2lzdGVyZWQgYXMKKyAgICAgKiBhcyBzaHV0ZG93biBob29rCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgY3VycmVudGx5IGFkZGVkIGFzIHNodXRkb3duIGhvb2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FkZGVkQXNTaHV0ZG93bkhvb2soKSB7CisgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+UHJvY2VzczwvY29kZT4gd2FzCisgICAgICogc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHRoZSBsaXN0IG9mIHByb2Nlc3NlcyB0byBkZXN0cm95IHVwb24gVk0gZXhpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIHByb2Nlc3MgdGhlIHByb2Nlc3MgdG8gYWRkCisgICAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5Qcm9jZXNzPC9jb2RlPiB3YXMKKyAgICAgKiAgICAgICAgICBzdWNjZXNzZnVsbHkgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoUHJvY2VzcyBwcm9jZXNzKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAocHJvY2Vzc2VzKSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGxpc3QgaXMgZW1wdHksIHJlZ2lzdGVyIHRoZSBzaHV0ZG93biBob29rCisgICAgICAgICAgICBpZiAocHJvY2Vzc2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYWRkU2h1dGRvd25Ib29rKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9jZXNzZXMuYWRkRWxlbWVudChwcm9jZXNzKTsKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZXMuY29udGFpbnMocHJvY2Vzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+UHJvY2VzczwvY29kZT4gd2FzCisgICAgICogc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBwcm9jZXNzZXMgdG8gZGVzdHJveSB1cG9uIFZNIGV4aXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICBwcm9jZXNzIHRoZSBwcm9jZXNzIHRvIHJlbW92ZQorICAgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+UHJvY2VzczwvY29kZT4gd2FzCisgICAgICogICAgICAgICAgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoUHJvY2VzcyBwcm9jZXNzKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAocHJvY2Vzc2VzKSB7CisgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NSZW1vdmVkID0gcHJvY2Vzc2VzLnJlbW92ZUVsZW1lbnQocHJvY2Vzcyk7CisgICAgICAgICAgICBpZiAocHJvY2Vzc1JlbW92ZWQgJiYgcHJvY2Vzc2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlU2h1dGRvd25Ib29rKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1JlbW92ZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IHRoZSBWTSB3aGVuIGl0IGlzIGV4aXRpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHByb2Nlc3NlcykgeworICAgICAgICAgICAgcnVubmluZyA9IHRydWU7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcHJvY2Vzc2VzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICgoUHJvY2VzcykgZS5uZXh0RWxlbWVudCgpKS5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWIzYmIxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDY1MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvcGVydHlIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5wcm9wZXJ0eS5SZXNvbHZlUHJvcGVydHlNYXA7CisKKy8qKgorICogU2V0cyBhIHByb3BlcnR5IGJ5IG5hbWUsIG9yIHNldCBvZiBwcm9wZXJ0aWVzIChmcm9tIGZpbGUgb3IKKyAqIHJlc291cmNlKSBpbiB0aGUgcHJvamVjdC4gIDwvcD4KKyAqIFByb3BlcnRpZXMgYXJlIGltbXV0YWJsZTogd2hvZXZlciBzZXRzIGEgcHJvcGVydHkgZmlyc3QgZnJlZXplcyBpdCBmb3IgdGhlCisgKiByZXN0IG9mIHRoZSBidWlsZDsgdGhleSBhcmUgbW9zdCBkZWZpbml0ZWx5IG5vdCB2YXJpYWJsZS4KKyAqIDxwPlRoZXJlIGFyZSBmaXZlIHdheXMgdG8gc2V0IHByb3BlcnRpZXM6PC9wPgorICogPHVsPgorICogICA8bGk+Qnkgc3VwcGx5aW5nIGJvdGggdGhlIDxpPm5hbWU8L2k+IGFuZCA8aT52YWx1ZTwvaT4gYXR0cmlidXRlLjwvbGk+CisgKiAgIDxsaT5CeSBzdXBwbHlpbmcgYm90aCB0aGUgPGk+bmFtZTwvaT4gYW5kIDxpPnJlZmlkPC9pPiBhdHRyaWJ1dGUuPC9saT4KKyAqICAgPGxpPkJ5IHNldHRpbmcgdGhlIDxpPmZpbGU8L2k+IGF0dHJpYnV0ZSB3aXRoIHRoZSBmaWxlbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAqICAgICBmaWxlIHRvIGxvYWQuIFRoaXMgcHJvcGVydHkgZmlsZSBoYXMgdGhlIGZvcm1hdCBhcyBkZWZpbmVkIGJ5IHRoZSBmaWxlIHVzZWQKKyAqICAgICBpbiB0aGUgY2xhc3MgamF2YS51dGlsLlByb3BlcnRpZXMuPC9saT4KKyAqICAgPGxpPkJ5IHNldHRpbmcgdGhlIDxpPnJlc291cmNlPC9pPiBhdHRyaWJ1dGUgd2l0aCB0aGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUKKyAqICAgICBwcm9wZXJ0eSBmaWxlIHRvIGxvYWQuIFRoaXMgcHJvcGVydHkgZmlsZSBoYXMgdGhlIGZvcm1hdCBhcyBkZWZpbmVkIGJ5IHRoZQorICogICAgIGZpbGUgdXNlZCBpbiB0aGUgY2xhc3MgamF2YS51dGlsLlByb3BlcnRpZXMuPC9saT4KKyAqICAgPGxpPkJ5IHNldHRpbmcgdGhlIDxpPmVudmlyb25tZW50PC9pPiBhdHRyaWJ1dGUgd2l0aCBhIHByZWZpeCB0byB1c2UuCisgKiAgICAgUHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQgZm9yIGV2ZXJ5IGVudmlyb25tZW50IHZhcmlhYmxlIGJ5CisgKiAgICAgcHJlZml4aW5nIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBhIHBlcmlvZCB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuPC9saT4KKyAqIDwvdWw+CisgKiA8cD5BbHRob3VnaCBjb21iaW5hdGlvbnMgb2YgdGhlc2Ugd2F5cyBhcmUgcG9zc2libGUsIG9ubHkgb25lIHNob3VsZCBiZSB1c2VkCisgKiBhdCBhIHRpbWUuIFByb2JsZW1zIG1pZ2h0IG9jY3VyIHdpdGggdGhlIG9yZGVyIGluIHdoaWNoIHByb3BlcnRpZXMgYXJlIHNldCwgZm9yCisgKiBpbnN0YW5jZS48L3A+CisgKiA8cD5UaGUgdmFsdWUgcGFydCBvZiB0aGUgcHJvcGVydGllcyBiZWluZyBzZXQsIG1pZ2h0IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlcgorICogcHJvcGVydGllcy4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgdGhlc2UgcHJvcGVydGllcyBhcmUgc2V0LgorICogVGhpcyBhbHNvIGhvbGRzIGZvciBwcm9wZXJ0aWVzIGxvYWRlZCBmcm9tIGEgcHJvcGVydHkgZmlsZS48L3A+CisgKiBQcm9wZXJ0aWVzIGFyZSBjYXNlIHNlbnNpdGl2ZS4KKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQuYXR0cmlidXRlLmdyb3VwIG5hbWU9Im5hbWUiIGRlc2NyaXB0aW9uPSJPbmUgb2YgdGhlc2UsIHdoZW4gdXNpbmcgdGhlIG5hbWUgYXR0cmlidXRlIgorICogQGFudC5hdHRyaWJ1dGUuZ3JvdXAgbmFtZT0ibm9uYW1lIiBkZXNjcmlwdGlvbj0iT25lIG9mIHRoZXNlLCB3aGVuIG5vdCB1c2luZyB0aGUgbmFtZSBhdHRyaWJ1dGUiCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InByb3BlcnR5IgorICovCitwdWJsaWMgY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOworICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsdWU7CisgICAgcHJvdGVjdGVkIEZpbGUgZmlsZTsKKyAgICBwcm90ZWN0ZWQgVVJMIHVybDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlOworICAgIHByb3RlY3RlZCBQYXRoIGNsYXNzcGF0aDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVudjsKKyAgICBwcm90ZWN0ZWQgUmVmZXJlbmNlIHJlZjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeDsKKyAgICBwcml2YXRlIFByb2plY3QgZmFsbGJhY2s7CisgICAgcHJpdmF0ZSBPYmplY3QgdW50eXBlZFZhbHVlOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlclByb3BlcnR5OyAvLyBzZXQgcmVhZC1vbmx5IHByb3BlcnRpZXMKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eSgpIHsKKyAgICAgICAgdGhpcyhmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFByb3BlcnR5LgorICAgICAqIEBwYXJhbSB1c2VyUHJvcGVydHkgaWYgdHJ1ZSB0aGlzIGlzIGEgdXNlciBwcm9wZXJ0eQorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHJvdGVjdGVkIFByb3BlcnR5KGJvb2xlYW4gdXNlclByb3BlcnR5KSB7CisgICAgICAgIHRoaXModXNlclByb3BlcnR5LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgUHJvcGVydHkuCisgICAgICogQHBhcmFtIHVzZXJQcm9wZXJ0eSBpZiB0cnVlIHRoaXMgaXMgYSB1c2VyIHByb3BlcnR5CisgICAgICogQHBhcmFtIGZhbGxiYWNrIGEgcHJvamVjdCB0byB1c2UgdG8gbG9vayBmb3IgcmVmZXJlbmNlcyBpZiB0aGUgcmVmZXJlbmNlIGlzCisgICAgICogICAgICAgICAgICAgICAgIG5vdCBpbiB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydHkoYm9vbGVhbiB1c2VyUHJvcGVydHksIFByb2plY3QgZmFsbGJhY2spIHsKKyAgICAgICAgdGhpcy51c2VyUHJvcGVydHkgPSB1c2VyUHJvcGVydHk7CisgICAgICAgIHRoaXMuZmFsbGJhY2sgPSBmYWxsYmFjazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgorICAgICAqIEBwYXJhbSBuYW1lIHByb3BlcnR5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IHRvIHRoZSBhYnNvbHV0ZSBmaWxlbmFtZSBvZiB0aGUKKyAgICAgKiBnaXZlbiBmaWxlLiBJZiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgYW4gYWJzb2x1dGUgcGF0aCwgaXQKKyAgICAgKiBpcyBsZWZ0IHVuY2hhbmdlZCAod2l0aCAvIGFuZCBcIGNoYXJhY3RlcnMgY29udmVydGVkIHRvIHRoZQorICAgICAqIGN1cnJlbnQgcGxhdGZvcm1zIGNvbnZlbnRpb25zKS4gT3RoZXJ3aXNlIGl0IGlzIHRha2VuIGFzIGEgcGF0aAorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBhbmQgZXhwYW5kZWQuCisgICAgICogQHBhcmFtIGxvY2F0aW9uIHBhdGggdG8gc2V0CisgICAgICoKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBncm91cD0ibmFtZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihGaWxlIGxvY2F0aW9uKSB7CisgICAgICAgIHNldFZhbHVlKGxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICAvKiB0aGUgZm9sbG93aW5nIG1ldGhvZCBpcyBmaXJzdCBpbiBzb3VyY2Ugc28gSUggd2lsbCBwaWNrIGl0IHVwIGZpcnN0OgorICAgICAqIEhvcGVmdWxseSB3ZSdsbCBuZXZlciBnZXQgYW55IGNsYXNzZXMgY29tcGlsZWQgYnkgd2lzZS1ndXkgY29tcGlsZXJzIHRoYXQgYmVoYXZlIG90aGVyd2lzZS4uLgorICAgICAqLworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMudW50eXBlZFZhbHVlID0gdmFsdWU7CisgICAgICAgIC8vcHJlc2VydmUgcHJvdGVjdGVkIHN0cmluZyB2YWx1ZSBmb3Igc3ViY2xhc3NlcyA6KAorICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiB2YWx1ZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFzIGEgU3RyaW5nLgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBhc3NpZ24KKyAgICAgKgorICAgICAqIEBhbnQuYXR0cmlidXRlIGdyb3VwPSJuYW1lIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzZXRWYWx1ZSgoT2JqZWN0KSB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWxlbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgdG8gbG9hZC4KKyAgICAgKiBAcGFyYW0gZmlsZSBmaWxlbmFtZQorICAgICAqCisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9Im5vbmFtZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgZmlsZSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgeworICAgICAgICByZXR1cm4gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdXJsIGZyb20gd2hpY2ggdG8gbG9hZCBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSB1cmwgdXJsIHN0cmluZworICAgICAqCisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9Im5vbmFtZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcmwoVVJMIHVybCkgeworICAgICAgICB0aGlzLnVybCA9IHVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVybCBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgdXJsIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyBVUkwgZ2V0VXJsKCkgeworICAgICAgICByZXR1cm4gdXJsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZWZpeCB0byBhcHBseSB0byBwcm9wZXJ0aWVzIGxvYWRlZCB1c2luZyA8Y29kZT5maWxlPC9jb2RlPgorICAgICAqIG9yIDxjb2RlPnJlc291cmNlPC9jb2RlPi4KKyAgICAgKiBBICIuIiBpcyBhcHBlbmRlZCB0byB0aGUgcHJlZml4IGlmIG5vdCBzcGVjaWZpZWQuCisgICAgICogQHBhcmFtIHByZWZpeCBwcmVmaXggc3RyaW5nCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgeworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgaWYgKCFwcmVmaXguZW5kc1dpdGgoIi4iKSkgeworICAgICAgICAgICAgdGhpcy5wcmVmaXggKz0gIi4iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcmVmaXggYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gdGhlIHByZWZpeCBhdHRyaWJ1dGUKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICByZXR1cm4gcHJlZml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSByZWZlcmVuY2UgdG8gYW4gQW50IGRhdGF0eXBlCisgICAgICogZGVjbGFyZWQgZWxzZXdoZXJlLgorICAgICAqIE9ubHkgeWllbGRzIHJlYXNvbmFibGUgcmVzdWx0cyBmb3IgcmVmZXJlbmNlcworICAgICAqIFBBVEggbGlrZSBzdHJ1Y3R1cmVzIG9yIHByb3BlcnRpZXMuCisgICAgICogQHBhcmFtIHJlZiByZWZlcmVuY2UKKyAgICAgKgorICAgICAqIEBhbnQuYXR0cmlidXRlIGdyb3VwPSJuYW1lIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByZWYpIHsKKyAgICAgICAgdGhpcy5yZWYgPSByZWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZWZpZCBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgcmVmaWQgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIFJlZmVyZW5jZSBnZXRSZWZpZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgdG8gbG9hZAorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBvbiBjbGFzc3BhdGgKKyAgICAgKgorICAgICAqIEBhbnQuYXR0cmlidXRlIGdyb3VwPSJub25hbWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlc291cmNlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlZml4IHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgICAqIFRodXMgaWYgeW91IHNwZWNpZnkgZW52aXJvbm1lbnQ9JnF1b3Q7bXllbnYmcXVvdDsKKyAgICAgKiB5b3Ugd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyBPUy1zcGVjaWZpYworICAgICAqIGVudmlyb25tZW50IHZhcmlhYmxlcyB2aWEgcHJvcGVydHkgbmFtZXMgJnF1b3Q7bXllbnYuUEFUSCZxdW90OyBvcgorICAgICAqICZxdW90O215ZW52LlRFUk0mcXVvdDsuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IGlmIHlvdSBzdXBwbHkgYSBwcm9wZXJ0eSBuYW1lIHdpdGggYSBmaW5hbAorICAgICAqICZxdW90Oy4mcXVvdDsgaXQgd2lsbCBub3QgYmUgZG91YmxlZC4gaWUgZW52aXJvbm1lbnQ9JnF1b3Q7bXllbnYuJnF1b3Q7IHdpbGwgc3RpbGwKKyAgICAgKiBhbGxvdyBhY2Nlc3Mgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRocm91Z2ggJnF1b3Q7bXllbnYuUEFUSCZxdW90OyBhbmQKKyAgICAgKiAmcXVvdDtteWVudi5URVJNJnF1b3Q7LiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgY3VycmVudGx5IG9ubHkgaW1wbGVtZW50ZWQKKyAgICAgKiBvbiBzZWxlY3QgcGxhdGZvcm1zLiBGZWVsIGZyZWUgdG8gc2VuZCBwYXRjaGVzIHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgcGxhdGZvcm1zCisgICAgICogdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHN1cHBvcnRlZCBvbiA7KS48YnI+CisgICAgICogTm90ZSBhbHNvIHRoYXQgcHJvcGVydGllcyBhcmUgY2FzZSBzZW5zaXRpdmUsIGV2ZW4gaWYgdGhlCisgICAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBhcmUgbm90LCBlLmcuIGl0CisgICAgICogd2lsbCBiZSAke2Vudi5QYXRofSBub3QgJHtlbnYuUEFUSH0gb24gV2luZG93cyAyMDAwLgorICAgICAqIEBwYXJhbSBlbnYgcHJlZml4CisgICAgICoKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBncm91cD0ibm9uYW1lIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KFN0cmluZyBlbnYpIHsKKyAgICAgICAgdGhpcy5lbnYgPSBlbnY7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBlbnZpcm9ubWVudCBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgZW52aXJvbm1lbnQgYXR0cmlidXRlCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVudmlyb25tZW50KCkgeworICAgICAgICByZXR1cm4gZW52OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggdG8gYWRkIHRvIGFueSBleGlzdGluZyBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKKyAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGguYXBwZW5kKGNsYXNzcGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2UsCisgICAgICogZ2l2ZW4gYXMgcmVmZXJlbmNlIHRvIGEgJmx0O3BhdGgmZ3Q7IGRlZmluZWQgZWxzZXdoZXJlCisgICAgICogQHBhcmFtIHIgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGFzc3BhdGggdXNlZCB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc3BhdGgKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdXNlclByb3BlcnR5IGlnbm9yZWQKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIHdhcyBuZXZlciBhIHN1cHBvcnRlZCBmZWF0dXJlIGFuZCBoYXMgYmVlbgorICAgICAqICAgICAgICAgICAgIGRlcHJlY2F0ZWQgd2l0aG91dCByZXBsYWNlbWVudC4KKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclByb3BlcnR5KGJvb2xlYW4gdXNlclByb3BlcnR5KSB7CisgICAgICAgIGxvZygiREVQUkVDQVRFRDogSWdub3JpbmcgcmVxdWVzdCB0byBzZXQgdXNlciBwcm9wZXJ0eSBpbiBQcm9wZXJ0eSIKKyAgICAgICAgICAgICsgIiB0YXNrLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eQorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb3IgdGhlIGVtcHR5IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIHByb3BlcnR5IGluIHRoZSBwcm9qZWN0IHRvIHRoZSB2YWx1ZS4KKyAgICAgKiBpZiB0aGUgdGFzayB3YXMgZ2l2ZSBhIGZpbGUsIHJlc291cmNlIG9yIGVudiBhdHRyaWJ1dGUKKyAgICAgKiBoZXJlIGlzIHdoZXJlIGl0IGlzIGxvYWRlZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwcm9qZWN0IGhhcyBub3QgYmVlbiBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh1bnR5cGVkVmFsdWUgPT0gbnVsbCAmJiByZWYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgc3BlY2lmeSB2YWx1ZSwgbG9jYXRpb24gb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZWZpZCB3aXRoIHRoZSBuYW1lIGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsICYmIGZpbGUgPT0gbnVsbCAmJiByZXNvdXJjZSA9PSBudWxsICYmIGVudiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBzcGVjaWZ5IHVybCwgZmlsZSwgcmVzb3VyY2Ugb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJlbnZpcm9ubWVudCB3aGVuIG5vdCB1c2luZyB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJuYW1lIGF0dHJpYnV0ZSIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHVybCA9PSBudWxsICYmIGZpbGUgPT0gbnVsbCAmJiByZXNvdXJjZSA9PSBudWxsICYmIHByZWZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByZWZpeCBpcyBvbmx5IHZhbGlkIHdoZW4gbG9hZGluZyBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIHVybCwgZmlsZSBvciByZXNvdXJjZSIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB1bnR5cGVkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUHJvcGVydHkobmFtZSwgdW50eXBlZFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvYWRGaWxlKGZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2FkVXJsKHVybCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9hZFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnYgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9hZEVudmlyb25tZW50KGVudik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKHJlZiAhPSBudWxsKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eShuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5nZXRSZWZlcmVuY2VkT2JqZWN0KGdldFByb2plY3QoKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgICAgIGlmIChmYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5KG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5nZXRSZWZlcmVuY2VkT2JqZWN0KGZhbGxiYWNrKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBiZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsb2FkIHByb3BlcnRpZXMgZnJvbSBhIHVybAorICAgICAqIEBwYXJhbSB1cmwgdXJsIHRvIGxvYWQgZnJvbQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkVXJsKFVSTCB1cmwpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBsb2coIkxvYWRpbmcgIiArIHVybCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvYWRQcm9wZXJ0aWVzKHByb3BzLCBpcywgdXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLnhtbCIpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRQcm9wZXJ0aWVzKHByb3BzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSBJbnB1dFN0cmVhbSBpbnRvIHRoZSBnaXZlbgorICAgICAqIHByb3BlcnR5LiBPbiBKYXZhNSsgaXQgc3VwcG9ydHMgcmVhZGluZyBmcm9tIFhNTCBiYXNlZCBwcm9wZXJ0eQorICAgICAqIGRlZmluaXRpb24uCisgICAgICogQHBhcmFtIHByb3BzIFRoZSBwcm9wZXJ0eSBvYmplY3QgdG8gbG9hZCBpbnRvCisgICAgICogQHBhcmFtIGlzICAgIFRoZSBpbnB1dCBzdHJlYW0gZnJvbSB3aGVyZSB0byBsb2FkCisgICAgICogQHBhcmFtIGlzWG1sIDx0dD50cnVlPC90dD4gaWYgd2Ugc2hvdWxkIHRyeSB0byBsb2FkIGZyb20geG1sCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZworICAgICAqIEBzaW5jZSAxLjcuMQorICAgICAqIEBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvcHJvcGVydGllcy5kdGQKKyAgICAgKiBAc2VlIGphdmEudXRpbC5Qcm9wZXJ0aWVzI2xvYWRGcm9tWE1MKElucHV0U3RyZWFtKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkUHJvcGVydGllcygKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcywgSW5wdXRTdHJlYW0gaXMsIGJvb2xlYW4gaXNYbWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1htbCkgeworICAgICAgICAgICAgLy8gbG9hZCB0aGUgeG1sIGJhc2VkIHByb3BlcnR5IGRlZmluaXRpb24KKyAgICAgICAgICAgIC8vIHVzZSByZWZsZWN0aW9uIGJlY2F1c2Ugb2YgYndjIHRvIEphdmEgMS4zCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1ldGhvZCBsb2FkWG1sTWV0aG9kID0gcHJvcHMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImxvYWRGcm9tWE1MIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtJbnB1dFN0cmVhbS5jbGFzc30pOworICAgICAgICAgICAgICAgIGxvYWRYbWxNZXRob2QuaW52b2tlKHByb3BzLCBuZXcgT2JqZWN0W10ge2lzfSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgbG9nKCJDYW4gbm90IGxvYWQgeG1sIGJhc2VkIHByb3BlcnR5IGRlZmluaXRpb24gb24gSmF2YSA8IDUiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbG9hZCAiLnByb3BlcnRpZXMiIGZvcm1hdAorICAgICAgICAgICAgcHJvcHMubG9hZChpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsb2FkIHByb3BlcnRpZXMgZnJvbSBhIGZpbGUKKyAgICAgKiBAcGFyYW0gZmlsZSBmaWxlIHRvIGxvYWQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9hZEZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgbG9nKCJMb2FkaW5nICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtICBmaXMgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGxvYWRQcm9wZXJ0aWVzKHByb3BzLCBmaXMsIGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueG1sIikpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShmaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0aWVzKHByb3BzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gZmluZCBwcm9wZXJ0eSBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4LCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGxvYWQgcHJvcGVydGllcyBmcm9tIGEgcmVzb3VyY2UgaW4gdGhlIGN1cnJlbnQgY2xhc3NwYXRoCisgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiByZXNvdXJjZSB0byBsb2FkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9hZFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBsb2coIlJlc291cmNlIExvYWRpbmcgIiArIG5hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBjTCA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNMID0gZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGNsYXNzcGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNMID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjTCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXMgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpcyA9IGNMLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9hZFByb3BlcnRpZXMocHJvcHMsIGlzLCBuYW1lLmVuZHNXaXRoKCIueG1sIikpOworICAgICAgICAgICAgICAgIGFkZFByb3BlcnRpZXMocHJvcHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBmaW5kIHJlc291cmNlICIgKyBuYW1lLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsb2FkIHRoZSBlbnZpcm9ubWVudCB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gcHJlZml4IHByZWZpeCB0byBwbGFjZSBiZWZvcmUgdGhlbQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvYWRFbnZpcm9ubWVudChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBpZiAoIXByZWZpeC5lbmRzV2l0aCgiLiIpKSB7CisgICAgICAgICAgICBwcmVmaXggKz0gIi4iOworICAgICAgICB9CisgICAgICAgIGxvZygiTG9hZGluZyBFbnZpcm9ubWVudCAiICsgcHJlZml4LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgVmVjdG9yIG9zRW52ID0gRXhlY3V0ZS5nZXRQcm9jRW52aXJvbm1lbnQoKTsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gb3NFbnYuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBlbnRyeSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGludCBwb3MgPSBlbnRyeS5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAocG9zID09IC0xKSB7CisgICAgICAgICAgICAgICAgbG9nKCJJZ25vcmluZzogIiArIGVudHJ5LCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvcHMucHV0KHByZWZpeCArIGVudHJ5LnN1YnN0cmluZygwLCBwb3MpLAorICAgICAgICAgICAgICAgIGVudHJ5LnN1YnN0cmluZyhwb3MgKyAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYWRkUHJvcGVydGllcyhwcm9wcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaXRlcmF0ZSB0aHJvdWdoIGEgc2V0IG9mIHByb3BlcnRpZXMsCisgICAgICogcmVzb2x2ZSB0aGVtIHRoZW4gYXNzaWduIHRoZW0KKyAgICAgKiBAcGFyYW0gcHJvcHMgdGhlIHByb3BlcnRpZXMgdG8gaXRlcmF0ZSBvdmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7CisgICAgICAgIEhhc2hNYXAgbSA9IG5ldyBIYXNoTWFwKHByb3BzKTsKKyAgICAgICAgcmVzb2x2ZUFsbFByb3BlcnRpZXMobSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBrID0gaXQubmV4dCgpOworICAgICAgICAgICAgaWYgKGsgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgazsKKyAgICAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gcHJlZml4ICsgcHJvcGVydHlOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG0uZ2V0KGspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5hbWUgdmFsdWUgcGFpciB0byB0aGUgcHJvamVjdCBwcm9wZXJ0eSBzZXQKKyAgICAgKiBAcGFyYW0gbiBuYW1lIG9mIHByb3BlcnR5CisgICAgICogQHBhcmFtIHYgdmFsdWUgdG8gc2V0CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHkoU3RyaW5nIG4sIFN0cmluZyB2KSB7CisgICAgICAgIGFkZFByb3BlcnR5KG4sIChPYmplY3QpIHYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5hbWUgdmFsdWUgcGFpciB0byB0aGUgcHJvamVjdCBwcm9wZXJ0eSBzZXQKKyAgICAgKiBAcGFyYW0gbiBuYW1lIG9mIHByb3BlcnR5CisgICAgICogQHBhcmFtIHYgdmFsdWUgdG8gc2V0CisgICAgICogQHNpbmNlIEFudCAxLjgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcgbiwgT2JqZWN0IHYpIHsKKyAgICAgICAgUHJvcGVydHlIZWxwZXIgcGggPSBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICBpZiAodXNlclByb3BlcnR5KSB7CisgICAgICAgICAgICBpZiAocGguZ2V0VXNlclByb3BlcnR5KG4pID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwaC5zZXRJbmhlcml0ZWRQcm9wZXJ0eShuLCB2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJPdmVycmlkZSBpZ25vcmVkIGZvciAiICsgbiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwaC5zZXROZXdQcm9wZXJ0eShuLCB2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlc29sdmUgcHJvcGVydGllcyBpbnNpZGUgYSBwcm9wZXJ0aWVzIGhhc2h0YWJsZQorICAgICAqIEBwYXJhbSBwcm9wcyBwcm9wZXJ0aWVzIG9iamVjdCB0byByZXNvbHZlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVBbGxQcm9wZXJ0aWVzKE1hcCBwcm9wcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydHlIZWxwZXIgcHJvcGVydHlIZWxwZXIKKyAgICAgICAgICAgID0gKFByb3BlcnR5SGVscGVyKSBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICBuZXcgUmVzb2x2ZVByb3BlcnR5TWFwKAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgcHJvcGVydHlIZWxwZXIsCisgICAgICAgICAgICBwcm9wZXJ0eUhlbHBlci5nZXRFeHBhbmRlcnMoKSkucmVzb2x2ZUFsbFByb3BlcnRpZXMocHJvcHMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHlIZWxwZXJUYXNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eUhlbHBlclRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg4NjdhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHlIZWxwZXJUYXNrLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisvKioKKyAqIFRoaXMgdGFzayBpcyBkZXNpZ25lZCB0byBhbGxvdyB0aGUgdXNlciB0byBpbnN0YWxsIGEgZGlmZmVyZW50CisgKiBQcm9wZXJ0eUhlbHBlciBvbiB0aGUgY3VycmVudCBQcm9qZWN0LiBUaGlzIHRhc2sgYWxzbyBhbGxvd3MgdGhlCisgKiBpbnN0YWxsYXRpb24gb2YgUHJvcGVydHlIZWxwZXIgZGVsZWdhdGVzIG9uIGVpdGhlciB0aGUgbmV3bHkgaW5zdGFsbGVkCisgKiBvciBleGlzdGluZyBQcm9wZXJ0eUhlbHBlci4KKyAqIEBzaW5jZSBBbnQgMS44CisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eUhlbHBlclRhc2sgZXh0ZW5kcyBUYXNrIHsKKyAgICAvKioKKyAgICAgKiBOZXN0ZWQgZGVsZWdhdGUgZm9yIHJlZmlkIHVzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBEZWxlZ2F0ZUVsZW1lbnQgeworICAgICAgICBwcml2YXRlIFN0cmluZyByZWZpZDsKKworICAgICAgICBwcml2YXRlIERlbGVnYXRlRWxlbWVudCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHJlZmlkLgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWZpZCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZWZpZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHJlZmlkLgorICAgICAgICAgKiBAcGFyYW0gcmVmaWQgdGhlIFN0cmluZyB0byBzZXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFN0cmluZyByZWZpZCkgeworICAgICAgICAgICAgdGhpcy5yZWZpZCA9IHJlZmlkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBQcm9wZXJ0eUhlbHBlci5EZWxlZ2F0ZSByZXNvbHZlKCkgeworICAgICAgICAgICAgaWYgKHJlZmlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInJlZmlkIHJlcXVpcmVkIGZvciBnZW5lcmljIGRlbGVnYXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKFByb3BlcnR5SGVscGVyLkRlbGVnYXRlKSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKHJlZmlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUHJvcGVydHlIZWxwZXIgcHJvcGVydHlIZWxwZXI7CisgICAgcHJpdmF0ZSBMaXN0IGRlbGVnYXRlczsKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBQcm9wZXJ0eUhlbHBlciB0byBiZSBzZXQgb24gdGhlIFByb2plY3QuCisgICAgICogQHBhcmFtIHByb3BlcnR5SGVscGVyIHRoZSBQcm9wZXJ0eUhlbHBlciB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbmZpZ3VyZWQoUHJvcGVydHlIZWxwZXIgcHJvcGVydHlIZWxwZXIpIHsKKyAgICAgICAgaWYgKHRoaXMucHJvcGVydHlIZWxwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBQcm9wZXJ0eUhlbHBlciBjYW4gYmUgaW5zdGFsbGVkIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcm9wZXJ0eUhlbHBlciA9IHByb3BlcnR5SGVscGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFByb3BlcnR5SGVscGVyIGRlbGVnYXRlIHRvIHRoZSBleGlzdGluZyBvciBuZXcgUHJvcGVydHlIZWxwZXIuCisgICAgICogQHBhcmFtIGRlbGVnYXRlIHRoZSBkZWxlZ2F0ZSB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbmZpZ3VyZWQoUHJvcGVydHlIZWxwZXIuRGVsZWdhdGUgZGVsZWdhdGUpIHsKKyAgICAgICAgZ2V0QWRkRGVsZWdhdGVMaXN0KCkuYWRkKGRlbGVnYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXN0ZWQgJmx0O2RlbGVnYXRlIHJlZmlkPSJmb28iIC8mZ3Q7IGVsZW1lbnQuCisgICAgICogQHJldHVybiBEZWxlZ2F0ZUVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGVFbGVtZW50IGNyZWF0ZURlbGVnYXRlKCkgeworICAgICAgICBEZWxlZ2F0ZUVsZW1lbnQgcmVzdWx0ID0gbmV3IERlbGVnYXRlRWxlbWVudCgpOworICAgICAgICBnZXRBZGREZWxlZ2F0ZUxpc3QoKS5hZGQocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9qZWN0IGluc3RhbmNlIG5vdCBzZXQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcGVydHlIZWxwZXIgPT0gbnVsbCAmJiBkZWxlZ2F0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFaXRoZXIgYSBuZXcgUHJvcGVydHlIZWxwZXIiCisgICAgICAgICAgICAgICAgICAgICsgIiBvciBvbmUgb3IgbW9yZSBQcm9wZXJ0eUhlbHBlciBkZWxlZ2F0ZXMgYXJlIHJlcXVpcmVkIik7CisgICAgICAgIH0KKyAgICAgICAgUHJvcGVydHlIZWxwZXIgcGggPSBwcm9wZXJ0eUhlbHBlcjsKKyAgICAgICAgaWYgKHBoID09IG51bGwpIHsKKyAgICAgICAgICAgIHBoID0gUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBoID0gcHJvcGVydHlIZWxwZXI7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChwaCkgeworICAgICAgICAgICAgaWYgKGRlbGVnYXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZGVsZWdhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUhlbHBlci5EZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG8gaW5zdGFuY2VvZiBEZWxlZ2F0ZUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgoRGVsZWdhdGVFbGVtZW50KSBvKS5yZXNvbHZlKCkgOiAoUHJvcGVydHlIZWxwZXIuRGVsZWdhdGUpIG87CisgICAgICAgICAgICAgICAgICAgIGxvZygiQWRkaW5nIFByb3BlcnR5SGVscGVyIGRlbGVnYXRlICIgKyBkZWxlZ2F0ZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgICAgICBwaC5hZGQoZGVsZWdhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcGVydHlIZWxwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJJbnN0YWxsaW5nIFByb3BlcnR5SGVscGVyICIgKyBwcm9wZXJ0eUhlbHBlciwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgLy8gVE9ETyBjb3B5IGV4aXN0aW5nIHByb3BlcnRpZXMgdG8gbmV3IFBIPworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZShNYWdpY05hbWVzLlJFRklEX1BST1BFUlRZX0hFTFBFUiwgcHJvcGVydHlIZWxwZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTGlzdCBnZXRBZGREZWxlZ2F0ZUxpc3QoKSB7CisgICAgICAgIGlmIChkZWxlZ2F0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVsZWdhdGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHVtcFN0cmVhbUhhbmRsZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1B1bXBTdHJlYW1IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1MjRiMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1B1bXBTdHJlYW1IYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBDb3BpZXMgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvciBvZiBzdWJwcm9jZXNzZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZAorICogZXJyb3Igb2YgdGhlIHBhcmVudCBwcm9jZXNzLgorICoKKyAqIEBzaW5jZSBBbnQgMS4yCisgKi8KK3B1YmxpYyBjbGFzcyBQdW1wU3RyZWFtSGFuZGxlciBpbXBsZW1lbnRzIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHsKKworICAgIHByaXZhdGUgVGhyZWFkIG91dHB1dFRocmVhZDsKKyAgICBwcml2YXRlIFRocmVhZCBlcnJvclRocmVhZDsKKyAgICBwcml2YXRlIFN0cmVhbVB1bXBlciBpbnB1dFB1bXA7CisKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7CisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZXJyOworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+UHVtcFN0cmVhbUhhbmRsZXI8L2NvZGU+LgorICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgorICAgICAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4uCisgICAgICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFB1bXBTdHJlYW1IYW5kbGVyKE91dHB1dFN0cmVhbSBvdXQsIE91dHB1dFN0cmVhbSBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0KSB7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICB0aGlzLmVyciA9IGVycjsKKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5QdW1wU3RyZWFtSGFuZGxlcjwvY29kZT4uCisgICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4uCisgICAgICogQHBhcmFtIGVyciB0aGUgZXJyb3IgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHVtcFN0cmVhbUhhbmRsZXIoT3V0cHV0U3RyZWFtIG91dCwgT3V0cHV0U3RyZWFtIGVycikgeworICAgICAgICB0aGlzKG91dCwgZXJyLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+UHVtcFN0cmVhbUhhbmRsZXI8L2NvZGU+LgorICAgICAqIEBwYXJhbSBvdXRBbmRFcnIgdGhlIG91dHB1dC9lcnJvciA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBQdW1wU3RyZWFtSGFuZGxlcihPdXRwdXRTdHJlYW0gb3V0QW5kRXJyKSB7CisgICAgICAgIHRoaXMob3V0QW5kRXJyLCBvdXRBbmRFcnIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5QdW1wU3RyZWFtSGFuZGxlcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFB1bXBTdHJlYW1IYW5kbGVyKCkgeworICAgICAgICB0aGlzKFN5c3RlbS5vdXQsIFN5c3RlbS5lcnIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IGZyb20gd2hpY2ggdG8gcmVhZCB0aGUKKyAgICAgKiBzdGFuZGFyZCBvdXRwdXQgb2YgdGhlIHByb2Nlc3MuCisgICAgICogQHBhcmFtIGlzIHRoZSA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc091dHB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgeworICAgICAgICBjcmVhdGVQcm9jZXNzT3V0cHV0UHVtcChpcywgb3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlCisgICAgICogc3RhbmRhcmQgZXJyb3Igb2YgdGhlIHByb2Nlc3MuCisgICAgICogQHBhcmFtIGlzIHRoZSA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKElucHV0U3RyZWFtIGlzKSB7CisgICAgICAgIGlmIChlcnIgIT0gbnVsbCkgeworICAgICAgICAgICAgY3JlYXRlUHJvY2Vzc0Vycm9yUHVtcChpcywgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiBieSBtZWFucyBvZiB3aGljaAorICAgICAqIGlucHV0IGNhbiBiZSBzZW50IHRvIHRoZSBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBvcyB0aGUgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzSW5wdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB7CisgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnB1dFB1bXAgPSBjcmVhdGVJbnB1dFB1bXAoaW5wdXQsIG9zLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIDxjb2RlPlRocmVhZDwvY29kZT5zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBvdXRwdXRUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgZXJyb3JUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgaWYgKGlucHV0UHVtcCAhPSBudWxsKSB7CisgICAgICAgICAgICBUaHJlYWQgaW5wdXRUaHJlYWQgPSBuZXcgVGhyZWFkKGlucHV0UHVtcCk7CisgICAgICAgICAgICBpbnB1dFRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICBpbnB1dFRocmVhZC5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCBwdW1waW5nIHRoZSBzdHJlYW1zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXRUaHJlYWQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JUaHJlYWQuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnB1dFB1bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgaW5wdXRQdW1wLnN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnIuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZXJyb3Igc3RyZWFtLgorICAgICAqIEByZXR1cm4gPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGdldEVycigpIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogQHJldHVybiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0T3V0KCkgeworICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgcHVtcCB0byBoYW5kbGUgcHJvY2VzcyBvdXRwdXQuCisgICAgICogQHBhcmFtIGlzIHRoZSA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4uCisgICAgICogQHBhcmFtIG9zIHRoZSA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2Nlc3NPdXRwdXRQdW1wKElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MpIHsKKyAgICAgICAgb3V0cHV0VGhyZWFkID0gY3JlYXRlUHVtcChpcywgb3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgcHVtcCB0byBoYW5kbGUgZXJyb3Igb3V0cHV0LgorICAgICAqIEBwYXJhbSBpcyB0aGUgaW5wdXQgc3RyZWFtIHRvIGNvcHkgZnJvbS4KKyAgICAgKiBAcGFyYW0gb3MgdGhlIG91dHB1dCBzdHJlYW0gdG8gY29weSB0by4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9jZXNzRXJyb3JQdW1wKElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MpIHsKKyAgICAgICAgZXJyb3JUaHJlYWQgPSBjcmVhdGVQdW1wKGlzLCBvcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHN0cmVhbSBwdW1wZXIgdG8gY29weSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIHRoZQorICAgICAqIGdpdmVuIG91dHB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIGlzIHRoZSBpbnB1dCBzdHJlYW0gdG8gY29weSBmcm9tLgorICAgICAqIEBwYXJhbSBvcyB0aGUgb3V0cHV0IHN0cmVhbSB0byBjb3B5IHRvLgorICAgICAqIEByZXR1cm4gYSB0aHJlYWQgb2JqZWN0IHRoYXQgZG9lcyB0aGUgcHVtcGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGhyZWFkIGNyZWF0ZVB1bXAoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcykgeworICAgICAgICByZXR1cm4gY3JlYXRlUHVtcChpcywgb3MsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc3RyZWFtIHB1bXBlciB0byBjb3B5IHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gdGhlCisgICAgICogZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gaXMgdGhlIGlucHV0IHN0cmVhbSB0byBjb3B5IGZyb20uCisgICAgICogQHBhcmFtIG9zIHRoZSBvdXRwdXQgc3RyZWFtIHRvIGNvcHkgdG8uCisgICAgICogQHBhcmFtIGNsb3NlV2hlbkV4aGF1c3RlZCBpZiB0cnVlIGNsb3NlIHRoZSBpbnB1dHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIGEgdGhyZWFkIG9iamVjdCB0aGF0IGRvZXMgdGhlIHB1bXBpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFRocmVhZCBjcmVhdGVQdW1wKElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2xvc2VXaGVuRXhoYXVzdGVkKSB7CisgICAgICAgIGZpbmFsIFRocmVhZCByZXN1bHQKKyAgICAgICAgICAgID0gbmV3IFRocmVhZChuZXcgU3RyZWFtUHVtcGVyKGlzLCBvcywgY2xvc2VXaGVuRXhoYXVzdGVkKSk7CisgICAgICAgIHJlc3VsdC5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHN0cmVhbSBwdW1wZXIgdG8gY29weSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIHRoZQorICAgICAqIGdpdmVuIG91dHB1dCBzdHJlYW0uIFVzZWQgZm9yIHN0YW5kYXJkIGlucHV0LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICAvKnByb3RlY3RlZCovIFN0cmVhbVB1bXBlciBjcmVhdGVJbnB1dFB1bXAoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjbG9zZVdoZW5FeGhhdXN0ZWQpIHsKKyAgICAgICAgU3RyZWFtUHVtcGVyIHB1bXBlciA9IG5ldyBTdHJlYW1QdW1wZXIoaXMsIG9zLCBjbG9zZVdoZW5FeGhhdXN0ZWQpOworICAgICAgICBwdW1wZXIuc2V0QXV0b2ZsdXNoKHRydWUpOworICAgICAgICByZXR1cm4gcHVtcGVyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlY29yZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjMDkwZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlY29yZGVyLmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5TdWJCdWlsZExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Mb2dMZXZlbDsKKworLyoqCisgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGN1cnJlbnQgYnVpbGQgcHJvY2VzcyB0aGF0IHJlY29yZHMgdGhlCisgKiBvdXRwdXQgdG8gYSBmaWxlLgorICogPHA+U2V2ZXJhbCByZWNvcmRlcnMgY2FuIGV4aXN0IGF0IHRoZSBzYW1lIHRpbWUuICBFYWNoIHJlY29yZGVyIGlzCisgKiBhc3NvY2lhdGVkIHdpdGggYSBmaWxlLiAgVGhlIGZpbGVuYW1lIGlzIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IKKyAqIHRoZSByZWNvcmRlcnMuICBUaGUgZmlyc3QgY2FsbCB0byB0aGUgcmVjb3JkZXIgdGFzayB3aXRoIGFuIHVudXNlZCBmaWxlbmFtZQorICogd2lsbCBjcmVhdGUgYSByZWNvcmRlciAodXNpbmcgdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQpIGFuZCBhZGQgaXQgdG8gdGhlCisgKiBsaXN0ZW5lcnMgb2YgdGhlIGJ1aWxkLiAgQWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHJlY29yZGVyIHRhc2sgdXNpbmcKKyAqIHRoaXMgZmlsZW5hbWUgd2lsbCBtb2RpZnkgdGhhdCByZWNvcmRlcnMgc3RhdGUgKHJlY29yZGluZyBvciBub3QpIG9yIG90aGVyCisgKiBwcm9wZXJ0aWVzIChsaWtlIGxvZ2dpbmcgbGV2ZWwpLjwvcD4KKyAqIDxwPlNvbWUgdGVjaG5pY2FsIGlzc3VlczogdGhlIGZpbGUncyBwcmludCBzdHJlYW0gaXMgZmx1c2hlZCBmb3IgJnF1b3Q7ZmluaXNoZWQmcXVvdDsKKyAqIGV2ZW50cyAoYnVpbGRGaW5pc2hlZCwgdGFyZ2V0RmluaXNoZWQgYW5kIHRhc2tGaW5pc2hlZCksIGFuZCBpcyBjbG9zZWQgb24KKyAqIGEgYnVpbGRGaW5pc2hlZCBldmVudC48L3A+CisgKiBAc2VlIFJlY29yZGVyRW50cnkKKyAqIEB2ZXJzaW9uIDAuNQorICogQHNpbmNlIEFudCAxLjQKKyAqIEBhbnQudGFzayBuYW1lPSJyZWNvcmQiIGNhdGVnb3J5PSJ1dGlsaXR5IgorICovCitwdWJsaWMgY2xhc3MgUmVjb3JkZXIgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgU3ViQnVpbGRMaXN0ZW5lciB7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQVRUUklCVVRFUworCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHJlY29yZCB0by4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWxlbmFtZSA9IG51bGw7CisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgdG8gYXBwZW5kLiBOZWVkIEJvb2xlYW4gdG8gcmVjb3JkIGFuIHVuc2V0IHN0YXRlIChudWxsKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJvb2xlYW4gYXBwZW5kID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHN0YXJ0IG9yIHN0b3AgcmVjb3JkaW5nLiBOZWVkIEJvb2xlYW4gdG8gcmVjb3JkIGFuIHVuc2V0CisgICAgICogc3RhdGUgKG51bGwpLgorICAgICAqLworICAgIHByaXZhdGUgQm9vbGVhbiBzdGFydCA9IG51bGw7CisgICAgLyoqIFRoZSBsZXZlbCB0byBsb2cgYXQuIEEgbGV2ZWwgb2YgLTEgbWVhbnMgbm90IGluaXRpYWxpemVkIHlldC4gKi8KKyAgICBwcml2YXRlIGludCBsb2dsZXZlbCA9IC0xOworICAgIC8qKiBTdHJpcCB0YXNrIGJhbm5lcnMgaWYgdHJ1ZS4gICovCisgICAgcHJpdmF0ZSBib29sZWFuIGVtYWNzTW9kZSA9IGZhbHNlOworICAgIC8qKiBUaGUgbGlzdCBvZiByZWNvcmRlciBlbnRyaWVzLiAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSByZWNvcmRlckVudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ09OU1RSVUNUT1JTIC8gSU5JVElBTElaRVJTCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIHNvIHdlIGNhbiBhZGQgdGhlIHRhc2sgYXMgYnVpbGQgbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIGdldFByb2plY3QoKS5hZGRCdWlsZExpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBBQ0NFU1NPUiBNRVRIT0RTCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvZyB0bywgYW5kIHRoZSBuYW1lIG9mIHRoZSByZWNvcmRlcgorICAgICAqIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGZuYW1lIEZpbGUgbmFtZSBvZiBsb2dmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGZuYW1lKSB7CisgICAgICAgIGZpbGVuYW1lID0gZm5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhY3Rpb24gZm9yIHRoZSBhc3NvY2lhdGVkIHJlY29yZGVyIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIGZvciB0aGUgZW50cnkgdG8gdGFrZTogc3RhcnQgb3Igc3RvcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oQWN0aW9uQ2hvaWNlcyBhY3Rpb24pIHsKKyAgICAgICAgaWYgKGFjdGlvbi5nZXRWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UoInN0YXJ0IikpIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gQm9vbGVhbi5UUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnQgPSBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgbG9nZ2VyIHNob3VsZCBhcHBlbmQgdG8gYSBwcmV2aW91cyBmaWxlLgorICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSwgYXBwZW5kIHRvIGEgcHJldmlvdXMgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBlbmQoYm9vbGVhbiBhcHBlbmQpIHsKKyAgICAgICAgdGhpcy5hcHBlbmQgPSAoYXBwZW5kID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgZW1hY3MgbW9kZS4KKyAgICAgKiBAcGFyYW0gZW1hY3NNb2RlIGlmIHRydWUgdXNlIGVtYWNzIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbWFjc01vZGUoYm9vbGVhbiBlbWFjc01vZGUpIHsKKyAgICAgICAgdGhpcy5lbWFjc01vZGUgPSBlbWFjc01vZGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZXZlbCB0byB3aGljaCB0aGlzIHJlY29yZGVyIGVudHJ5IHNob3VsZCBsb2cgdG8uCisgICAgICogQHBhcmFtIGxldmVsIHRoZSBsZXZlbCB0byBzZXQuCisgICAgICogQHNlZSBWZXJib3NpdHlMZXZlbENob2ljZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dsZXZlbChWZXJib3NpdHlMZXZlbENob2ljZXMgbGV2ZWwpIHsKKyAgICAgICAgbG9nbGV2ZWwgPSBsZXZlbC5nZXRMZXZlbCgpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDT1JFIC8gTUFJTiBCT0RZCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFpbiBleGVjdXRpb24uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsZW5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBmaWxlbmFtZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGdldFByb2plY3QoKS5sb2coInNldHRpbmcgYSByZWNvcmRlciBmb3IgbmFtZSAiICsgZmlsZW5hbWUsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgLy8gZ2V0IHRoZSByZWNvcmRlciBlbnRyeQorICAgICAgICBSZWNvcmRlckVudHJ5IHJlY29yZGVyID0gZ2V0UmVjb3JkZXIoZmlsZW5hbWUsIGdldFByb2plY3QoKSk7CisgICAgICAgIC8vIHNldCB0aGUgdmFsdWVzIG9uIHRoZSByZWNvcmRlcgorICAgICAgICByZWNvcmRlci5zZXRNZXNzYWdlT3V0cHV0TGV2ZWwobG9nbGV2ZWwpOworICAgICAgICByZWNvcmRlci5zZXRFbWFjc01vZGUoZW1hY3NNb2RlKTsKKyAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChzdGFydC5ib29sZWFuVmFsdWUoKSkgeworICAgICAgICAgICAgICAgIHJlY29yZGVyLnJlb3BlbkZpbGUoKTsKKyAgICAgICAgICAgICAgICByZWNvcmRlci5zZXRSZWNvcmRTdGF0ZShzdGFydCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlY29yZGVyLnNldFJlY29yZFN0YXRlKHN0YXJ0KTsKKyAgICAgICAgICAgICAgICByZWNvcmRlci5jbG9zZUZpbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBJTk5FUiBDTEFTU0VTCisKKyAgICAvKioKKyAgICAgKiBBIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgPGNvZGU+c2V0QWN0aW9uKCk8L2NvZGU+IG1ldGhvZC4KKyAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogc3RhcnQgYW5kIHN0b3AuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBY3Rpb25DaG9pY2VzIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTFVFUyA9IHsic3RhcnQiLCAic3RvcCJ9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzKCkKKyAgICAgICAgICovCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIFZBTFVFUzsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIDxjb2RlPnNldExvZ2xldmVsKCk8L2NvZGU+IG1ldGhvZC4KKyAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogZXJyb3IsIHdhcm4sIGluZm8sIHZlcmJvc2UsIGRlYnVnLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmVyYm9zaXR5TGV2ZWxDaG9pY2VzIGV4dGVuZHMgTG9nTGV2ZWwgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcmVjb3JkZXIgdGhhdCdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFzc2VkIGluIG5hbWUuIElmIHRoZQorICAgICAqIHJlY29yZGVyIGRvZXNuJ3QgZXhpc3QsIHRoZW4gYSBuZXcgb25lIGlzIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlY29kZXIKKyAgICAgKiBAcGFyYW0gcHJvaiB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICogQHJldHVybiBhIHJlY29yZGVyCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWNvcmRlckVudHJ5IGdldFJlY29yZGVyKFN0cmluZyBuYW1lLCBQcm9qZWN0IHByb2opCisgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBPYmplY3QgbyA9IHJlY29yZGVyRW50cmllcy5nZXQobmFtZSk7CisgICAgICAgIFJlY29yZGVyRW50cnkgZW50cnk7CisKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gY3JlYXRlIGEgcmVjb3JkZXIgZW50cnkKKyAgICAgICAgICAgIGVudHJ5ID0gbmV3IFJlY29yZGVyRW50cnkobmFtZSk7CisKKyAgICAgICAgICAgIGlmIChhcHBlbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVudHJ5Lm9wZW5GaWxlKGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW50cnkub3BlbkZpbGUoYXBwZW5kLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudHJ5LnNldFByb2plY3QocHJvaik7CisgICAgICAgICAgICByZWNvcmRlckVudHJpZXMucHV0KG5hbWUsIGVudHJ5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudHJ5ID0gKFJlY29yZGVyRW50cnkpIG87CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVtcHR5IGltcGxlbWVudGF0aW9uIHJlcXVpcmVkIGJ5IFN1YkJ1aWxkTGlzdGVuZXIgaW50ZXJmYWNlLgorICAgICAqIEBwYXJhbSBldmVudCBpZ25vcmVkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZCBieSBTdWJCdWlsZExpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gZXZlbnQgaWdub3JlZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1YkJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW1wdHkgaW1wbGVtZW50YXRpb24gcmVxdWlyZWQgYnkgU3ViQnVpbGRMaXN0ZW5lciBpbnRlcmZhY2UuCisgICAgICogQHBhcmFtIGV2ZW50IGlnbm9yZWQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZCBieSBTdWJCdWlsZExpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gZXZlbnQgaWdub3JlZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZCBieSBTdWJCdWlsZExpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gZXZlbnQgaWdub3JlZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZCBieSBTdWJCdWlsZExpc3RlbmVyIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gZXZlbnQgaWdub3JlZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW1wdHkgaW1wbGVtZW50YXRpb24gcmVxdWlyZWQgYnkgU3ViQnVpbGRMaXN0ZW5lciBpbnRlcmZhY2UuCisgICAgICogQHBhcmFtIGV2ZW50IGlnbm9yZWQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhbnMgcmVjb3JkZXIgcmVnaXN0cnkuCisgICAgICogQHBhcmFtIGV2ZW50IGlnbm9yZWQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFucyByZWNvcmRlciByZWdpc3RyeSwgaWYgdGhpcyBpcyB0aGUgc3ViYnVpbGQgdGhlIHRhc2sgaGFzCisgICAgICogYmVlbiBjcmVhdGVkIGluLgorICAgICAqIEBwYXJhbSBldmVudCBpZ25vcmVkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc3ViQnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudC5nZXRQcm9qZWN0KCkgPT0gZ2V0UHJvamVjdCgpKSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjbGVhbnMgcmVjb3JkZXIgcmVnaXN0cnkgYW5kIHJlbW92ZXMgaXRzZWxmIGZyb20gQnVpbGRMaXN0ZW5lciBsaXN0LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgcmVjb3JkZXJFbnRyaWVzLmNsZWFyKCk7CisgICAgICAgIGdldFByb2plY3QoKS5yZW1vdmVCdWlsZExpc3RlbmVyKHRoaXMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJFbnRyeS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjFmMTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWNvcmRlckVudHJ5LmphdmEKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGVmYXVsdExvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlN1YkJ1aWxkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBUaGlzIGlzIGEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgcmVjb3JkZXIuIFRoaXMgaXMgdGhlIGxpc3RlbmVyIHRvIHRoZQorICogYnVpbGQgcHJvY2Vzcy4KKyAqCisgKiBAc2luY2UgQW50IDEuNAorICovCitwdWJsaWMgY2xhc3MgUmVjb3JkZXJFbnRyeSBpbXBsZW1lbnRzIEJ1aWxkTG9nZ2VyLCBTdWJCdWlsZExpc3RlbmVyIHsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBBVFRSSUJVVEVTCisKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVjb3JkZXIgZW50cnkuICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKKyAgICAvKiogVGhlIHN0YXRlIG9mIHRoZSByZWNvcmRlciAocmVjb3JkZXIgb24gb3Igb2ZmKS4gICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlY29yZCA9IHRydWU7CisgICAgLyoqIFRoZSBjdXJyZW50IHZlcmJvc2l0eSBsZXZlbCB0byByZWNvcmQgYXQuICAqLworICAgIHByaXZhdGUgaW50IGxvZ2xldmVsID0gUHJvamVjdC5NU0dfSU5GTzsKKyAgICAvKiogVGhlIG91dHB1dCBQcmludFN0cmVhbSB0byByZWNvcmQgdG8uICAqLworICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsKKyAgICAvKiogVGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGxhc3Qga25vdyB0YXJnZXQuICAqLworICAgIHByaXZhdGUgbG9uZyB0YXJnZXRTdGFydFRpbWUgPSAwTDsKKyAgICAvKiogU3RyaXAgdGFzayBiYW5uZXJzIGlmIHRydWUuICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBlbWFjc01vZGUgPSBmYWxzZTsKKyAgICAvKiogcHJvamVjdCBpbnN0YW5jZSB0aGUgcmVjb3JkZXIgaXMgYXNzb2NpYXRlZCB3aXRoICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ09OU1RSVUNUT1JTIC8gSU5JVElBTElaRVJTCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHJlY29yZGVyICh1c2VkIGFzIHRoZSBmaWxlbmFtZSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlY29yZGVyRW50cnkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGFyZ2V0U3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZpbGVuYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQUNDRVNTT1IgTUVUSE9EUworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgb3V0cHV0IGlzIHNlbnQgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR1cm5zIG9mZiBvciBvbiB0aGlzIHJlY29yZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlIHRydWUgZm9yIG9uLCBmYWxzZSBmb3Igb2ZmLCBudWxsIGZvciBubyBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVjb3JkU3RhdGUoQm9vbGVhbiBzdGF0ZSkgeworICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZmx1c2goKTsKKyAgICAgICAgICAgIHJlY29yZCA9IHN0YXRlLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI2J1aWxkU3RhcnRlZChCdWlsZEV2ZW50KQorICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGxvZygiPiBCVUlMRCBTVEFSVEVEIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQpCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGxvZygiPCBCVUlMRCBGSU5JU0hFRCIsIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICBpZiAocmVjb3JkICYmIG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgZXJyb3IgPSBldmVudC5nZXRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihTdHJpbmdVdGlscy5MSU5FX1NFUCArICJCVUlMRCBTVUNDRVNTRlVMIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKFN0cmluZ1V0aWxzLkxJTkVfU0VQICsgIkJVSUxEIEZBSUxFRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgICAgICBlcnJvci5wcmludFN0YWNrVHJhY2Uob3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbGVhbnVwKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYW5zIHVwIGFueSByZXNvdXJjZXMgaGVsZCBieSB0aGlzIHJlY29yZGVyIGVudHJ5IGF0IHRoZSBlbmQKKyAgICAgKiBvZiBhIHN1YmJ1aWxkIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBzdWJidWlsZCdzIHByb2plY3QKKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCB0aGUgYnVpbGRGaW5pc2hlZCBldmVudAorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1YkJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0UHJvamVjdCgpID09IHByb2plY3QpIHsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVtcHR5IGltcGxlbWVudGF0aW9uIHRvIHNhdGlzZnkgdGhlIEJ1aWxkTGlzdGVuZXIgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IHRoZSBidWlsZFN0YXJ0ZWQgZXZlbnQKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdWJCdWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQpCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGxvZygiPj4gVEFSR0VUIFNUQVJURUQgLS0gIiArIGV2ZW50LmdldFRhcmdldCgpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIGxvZyhTdHJpbmdVdGlscy5MSU5FX1NFUCArIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSArICI6IiwKKyAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICB0YXJnZXRTdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCkKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGxvZygiPDwgVEFSR0VUIEZJTklTSEVEIC0tICIgKyBldmVudC5nZXRUYXJnZXQoKSwgUHJvamVjdC5NU0dfREVCVUcpOworCisgICAgICAgIFN0cmluZyB0aW1lID0gZm9ybWF0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRhcmdldFN0YXJ0VGltZSk7CisKKyAgICAgICAgbG9nKGV2ZW50LmdldFRhcmdldCgpICsgIjogIGR1cmF0aW9uICIgKyB0aW1lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCkKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGxvZygiPj4+IFRBU0sgU1RBUlRFRCAtLSAiICsgZXZlbnQuZ2V0VGFzaygpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tGaW5pc2hlZChCdWlsZEV2ZW50KQorICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGxvZygiPDw8IFRBU0sgRklOSVNIRUQgLS0gIiArIGV2ZW50LmdldFRhc2soKSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICBmbHVzaCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQpCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGxvZygiLS0tIE1FU1NBR0UgTE9HR0VEIiwgUHJvamVjdC5NU0dfREVCVUcpOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgaWYgKGV2ZW50LmdldFRhc2soKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGV2ZW50LmdldFRhc2soKS5nZXRUYXNrTmFtZSgpOworCisgICAgICAgICAgICBpZiAoIWVtYWNzTW9kZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9ICJbIiArIG5hbWUgKyAiXSAiOworICAgICAgICAgICAgICAgIGludCBzaXplID0gRGVmYXVsdExvZ2dlci5MRUZUX0NPTFVNTl9TSVpFIC0gbGFiZWwubGVuZ3RoKCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobGFiZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoZXZlbnQuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICBsb2coYnVmLnRvU3RyaW5nKCksIGV2ZW50LmdldFByaW9yaXR5KCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRoaW5nIHRoYXQgYWN0dWFsbHkgc2VuZHMgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzZyBUaGUgbWVzc2FnZSB0byBsb2cuCisgICAgICogQHBhcmFtIGxldmVsIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzZywgaW50IGxldmVsKSB7CisgICAgICAgIGlmIChyZWNvcmQgJiYgKGxldmVsIDw9IGxvZ2xldmVsKSAmJiBvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4obWVzZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmx1c2goKSB7CisgICAgICAgIGlmIChyZWNvcmQgJiYgb3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBCdWlsZExvZ2dlciNzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50KQorICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VPdXRwdXRMZXZlbChpbnQgbGV2ZWwpIHsKKyAgICAgICAgaWYgKGxldmVsID49IFByb2plY3QuTVNHX0VSUiAmJiBsZXZlbCA8PSBQcm9qZWN0Lk1TR19ERUJVRykgeworICAgICAgICAgICAgbG9nbGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgQnVpbGRMb2dnZXIjc2V0T3V0cHV0UHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0pCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0UHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gb3V0cHV0KSB7CisgICAgICAgIGNsb3NlRmlsZSgpOworICAgICAgICBvdXQgPSBvdXRwdXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAc2VlIEJ1aWxkTG9nZ2VyI3NldEVtYWNzTW9kZShib29sZWFuKQorICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHNldEVtYWNzTW9kZShib29sZWFuIGVtYWNzTW9kZSkgeworICAgICAgICB0aGlzLmVtYWNzTW9kZSA9IGVtYWNzTW9kZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEBzZWUgQnVpbGRMb2dnZXIjc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSkKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvclByaW50U3RyZWFtKFByaW50U3RyZWFtIGVycikgeworICAgICAgICBzZXRPdXRwdXRQcmludFN0cmVhbShlcnIpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdFRpbWUobG9uZyBtaWxsaXMpIHsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgbG9uZyBzZWNvbmRzID0gbWlsbGlzIC8gMTAwMDsKKyAgICAgICAgbG9uZyBtaW51dGVzID0gc2Vjb25kcyAvIDYwOworCisKKyAgICAgICAgaWYgKG1pbnV0ZXMgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhtaW51dGVzKSArICIgbWludXRlIgorICAgICAgICAgICAgICAgICArIChtaW51dGVzID09IDEgPyAiICIgOiAicyAiKQorICAgICAgICAgICAgICAgICArIExvbmcudG9TdHJpbmcoc2Vjb25kcyAlIDYwKSArICIgc2Vjb25kIgorICAgICAgICAgICAgICAgICArIChzZWNvbmRzICUgNjAgPT0gMSA/ICIiIDogInMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHNlY29uZHMpICsgIiBzZWNvbmQiCisgICAgICAgICAgICAgICAgICsgKHNlY29uZHMgJSA2MCA9PSAxID8gIiIgOiAicyIpOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVjb3JkZXIgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBpbnN0YW5jZQorICAgICAqCisgICAgICogQHNpbmNlIDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvamVjdC5hZGRCdWlsZExpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgY2xvc2VGaWxlKCk7CisgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByb2plY3QucmVtb3ZlQnVpbGRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBwcm9qZWN0ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsbHkgb3BlbnMgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVjb3JkZXIuCisgICAgICogVXNlZCBieSBSZWNvcmRlci4KKyAgICAgKiBAcGFyYW0gYXBwZW5kIEluZGljYXRlcyBpZiBvdXRwdXQgbXVzdCBiZSBhcHBlbmRlZCB0byB0aGUgbG9nZmlsZSBvciB0aGF0CisgICAgICogdGhlIGxvZ2ZpbGUgc2hvdWxkIGJlIG92ZXJ3cml0dGVuLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24KKyAgICAgKiBAc2luY2UgMS42LjMKKyAgICAgKi8KKyAgICB2b2lkIG9wZW5GaWxlKGJvb2xlYW4gYXBwZW5kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBvcGVuRmlsZUltcGwoYXBwZW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVjb3JkZXIuCisgICAgICogVXNlZCBieSBSZWNvcmRlci4KKyAgICAgKiBAc2luY2UgMS42LjMKKyAgICAgKi8KKyAgICB2b2lkIGNsb3NlRmlsZSgpIHsKKyAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIG91dCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZS1vcGVucyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWNvcmRlci4KKyAgICAgKiBVc2VkIGJ5IFJlY29yZGVyLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24KKyAgICAgKiBAc2luY2UgMS42LjMKKyAgICAgKi8KKyAgICB2b2lkIHJlb3BlbkZpbGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBvcGVuRmlsZUltcGwodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9wZW5GaWxlSW1wbChib29sZWFuIGFwcGVuZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSwgYXBwZW5kKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb2JsZW1zIG9wZW5pbmcgZmlsZSB1c2luZyBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVjb3JkZXIgZW50cnkiLCBpb2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWRpcmVjdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWRpcmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3MGE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlZGlyZWN0b3IuamF2YQpAQCAtMCwwICsxLDgzOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5QaXBlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMudXRpbC5DaGFpblJlYWRlckhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuVGVlT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVhZGVySW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5MZWFkUGlwZUlucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTGF6eUZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5PdXRwdXRTdHJlYW1GdW5uZWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbmNhdEZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLktlZXBBbGl2ZU91dHB1dFN0cmVhbTsKKworLyoqCisgKiBUaGUgUmVkaXJlY3RvciBjbGFzcyBtYW5hZ2VzIHRoZSBzZXR1cCBhbmQgY29ubmVjdGlvbiBvZgorICogaW5wdXQgYW5kIG91dHB1dCByZWRpcmVjdGlvbiBmb3IgYW4gQW50IHByb2plY3QgY29tcG9uZW50LgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBSZWRpcmVjdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RSRUFNUFVNUEVSX1dBSVRfSU5URVJWQUwgPSAxMDAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcKKyAgICAgICAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsKKworICAgIHByaXZhdGUgY2xhc3MgUHJvcGVydHlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0geworICAgICAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgICAgICAgIFByb3BlcnR5T3V0cHV0U3RyZWFtKFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICghY2xvc2VkICYmICEoYXBwZW5kICYmIGFwcGVuZFByb3BlcnRpZXMpKSB7CisgICAgICAgICAgICAgICAgc2V0UHJvcGVydHlGcm9tQkFPUyh0aGlzLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlKHMpIGZyb20gd2hpY2ggc3RhbmRhcmQgaW5wdXQgaXMgYmVpbmcgdGFrZW4uCisgICAgICogSWYgJmd0OyAxLCBmaWxlcycgY29udGVudCB3aWxsIGJlIGNvbmNhdGVuYXRlZCBpbiB0aGUgb3JkZXIgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlW10gaW5wdXQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZShzKSByZWNlaXZpbmcgc3RhbmRhcmQgb3V0cHV0LiBXaWxsIGFsc28gcmVjZWl2ZSBzdGFuZGFyZCBlcnJvcgorICAgICAqIHVubGVzcyBzdGFuZGFyZCBlcnJvciBpcyByZWRpcmVjdGVkIG9yIGxvZ0Vycm9yIGlzIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlW10gb3V0OworCisgICAgLyoqCisgICAgICogVGhlIGZpbGUocykgdG8gd2hpY2ggc3RhbmRhcmQgZXJyb3IgaXMgYmVpbmcgcmVkaXJlY3RlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZVtdIGVycm9yOworCisgICAgLyoqCisgICAgICAqIEluZGljYXRlcyBpZiBzdGFuZGFyZCBlcnJvciBzaG91bGQgYmUgbG9nZ2VkIHRvIEFudCdzIGxvZyBzeXN0ZW0KKyAgICAgICogcmF0aGVyIHRoYW4gdGhlIG91dHB1dC4gVGhpcyBoYXMgbm8gZWZmZWN0IGlmIHN0YW5kYXJkIGVycm9yIGlzCisgICAgICAqIHJlZGlyZWN0ZWQgdG8gYSBmaWxlIG9yIHByb3BlcnR5LgorICAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbG9nRXJyb3IgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciB1c2VkIHRvIGNhcHR1cmUgb3V0cHV0IGZvciBzdG9yYWdlIGludG8gYSBwcm9wZXJ0eQorICAgICAqLworICAgIHByaXZhdGUgUHJvcGVydHlPdXRwdXRTdHJlYW0gYmFvcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgdXNlZCB0byBjYXB0dXJlIGVycm9yIG91dHB1dCBmb3Igc3RvcmFnZSBpbnRvIGEgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwcml2YXRlIFByb3BlcnR5T3V0cHV0U3RyZWFtIGVycm9yQmFvcyA9IG51bGw7CisKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGludG8gd2hpY2ggb3V0cHV0IGlzIHRvIGJlIHN0b3JlZCAqLworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dFByb3BlcnR5OworCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbnRvIHdoaWNoIGVycm9yIG91dHB1dCBpcyB0byBiZSBzdG9yZWQgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlcnJvclByb3BlcnR5OworCisgICAgLyoqIFN0cmluZyBmcm9tIHdoaWNoIGlucHV0IGlzIHRha2VuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5wdXRTdHJpbmc7CisKKyAgICAvKiogRmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgZXJyb3IgYW5kIG91dHB1dCBmaWxlcyBhcmUgdG8gYmUgYXBwZW5kZWQuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFwcGVuZCA9IGZhbHNlOworCisgICAgLyoqIEZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoYXQgb3V0cHV0IHNob3VsZCBiZSBhbHdheXMgc2VudCB0byB0aGUgbG9nICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFsd2F5c0xvZyA9IGZhbHNlOworCisgICAgLyoqIEZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgZmlsZXMgc2hvdWxkIGJlIGNyZWF0ZWQgZXZlbiB3aGVuIGVtcHR5LiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVFbXB0eUZpbGVzID0gdHJ1ZTsKKworICAgIC8qKiBUaGUgdGFzayBmb3Igd2hpY2ggdGhpcyByZWRpcmVjdG9yIGlzIHdvcmtpbmcgKi8KKyAgICBwcml2YXRlIFByb2plY3RDb21wb25lbnQgbWFuYWdpbmdUYXNrOworCisgICAgLyoqIFRoZSBzdHJlYW0gZm9yIG91dHB1dCBkYXRhICovCisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKKworICAgIC8qKiBUaGUgc3RyZWFtIGZvciBlcnJvciBvdXRwdXQgKi8KKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBlcnJvclN0cmVhbSA9IG51bGw7CisKKyAgICAvKiogVGhlIHN0cmVhbSBmb3IgaW5wdXQgKi8KKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKworICAgIC8qKiBTdHJlYW0gd2hpY2ggaXMgdXNlZCBmb3IgbGluZSBvcmllbnRlZCBvdXRwdXQgKi8KKyAgICBwcml2YXRlIFByaW50U3RyZWFtIG91dFByaW50U3RyZWFtID0gbnVsbDsKKworICAgIC8qKiBTdHJlYW0gd2hpY2ggaXMgdXNlZCBmb3IgbGluZSBvcmllbnRlZCBlcnJvciBvdXRwdXQgKi8KKyAgICBwcml2YXRlIFByaW50U3RyZWFtIGVycm9yUHJpbnRTdHJlYW0gPSBudWxsOworCisgICAgLyoqIFRoZSBvdXRwdXQgZmlsdGVyIGNoYWlucyAqLworICAgIHByaXZhdGUgVmVjdG9yIG91dHB1dEZpbHRlckNoYWluczsKKworICAgIC8qKiBUaGUgZXJyb3IgZmlsdGVyIGNoYWlucyAqLworICAgIHByaXZhdGUgVmVjdG9yIGVycm9yRmlsdGVyQ2hhaW5zOworCisgICAgLyoqIFRoZSBpbnB1dCBmaWx0ZXIgY2hhaW5zICovCisgICAgcHJpdmF0ZSBWZWN0b3IgaW5wdXRGaWx0ZXJDaGFpbnM7CisKKyAgICAvKiogVGhlIG91dHB1dCBlbmNvZGluZyAqLworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEVuY29kaW5nID0gREVGQVVMVF9FTkNPRElORzsKKworICAgIC8qKiBUaGUgZXJyb3IgZW5jb2RpbmcgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlcnJvckVuY29kaW5nID0gREVGQVVMVF9FTkNPRElORzsKKworICAgIC8qKiBUaGUgaW5wdXQgZW5jb2RpbmcgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbnB1dEVuY29kaW5nID0gREVGQVVMVF9FTkNPRElORzsKKworICAgIC8qKiBXaGV0aGVyIHRvIGNvbXBsZXRlIHByb3BlcnRpZXMgc2V0dGluZ3MgKiovCisgICAgcHJpdmF0ZSBib29sZWFuIGFwcGVuZFByb3BlcnRpZXMgPSB0cnVlOworCisgICAgLyoqIFRoZSB0aHJlYWQgZ3JvdXAgdXNlZCBmb3Igc3RhcnRpbmcgPGNvZGU+U3RyZWFtUHVtcGVyPC9jb2RlPiB0aHJlYWRzICovCisgICAgcHJpdmF0ZSBUaHJlYWRHcm91cCB0aHJlYWRHcm91cCA9IG5ldyBUaHJlYWRHcm91cCgicmVkaXJlY3RvciIpOworCisgICAgLyoqIHdoZXRoZXIgdG8gbG9nIHRoZSBpbnB1dHN0cmluZyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBsb2dJbnB1dFN0cmluZyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSByZWRpcmVjdG9yIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gdGFzaworICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnaW5nVGFzayB0aGUgdGFzayBmb3Igd2hpY2ggdGhlIHJlZGlyZWN0b3IgaXMgdG8gd29yaworICAgICAqLworICAgIHB1YmxpYyBSZWRpcmVjdG9yKFRhc2sgbWFuYWdpbmdUYXNrKSB7CisgICAgICAgIHRoaXMoKFByb2plY3RDb21wb25lbnQpIG1hbmFnaW5nVGFzayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcmVkaXJlY3RvciBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHRhc2sKKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2luZ1Rhc2sgdGhlIHByb2plY3QgY29tcG9uZW50IGZvciB3aGljaCB0aGUKKyAgICAgKiByZWRpcmVjdG9yIGlzIHRvIHdvcmsKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIFJlZGlyZWN0b3IoUHJvamVjdENvbXBvbmVudCBtYW5hZ2luZ1Rhc2spIHsKKyAgICAgICAgdGhpcy5tYW5hZ2luZ1Rhc2sgPSBtYW5hZ2luZ1Rhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnB1dCB0byB1c2UgZm9yIHRoZSB0YXNrCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGZpbGUgZnJvbSB3aGljaCBpbnB1dCBpcyByZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0KEZpbGUgaW5wdXQpIHsKKyAgICAgICAgc2V0SW5wdXQoKGlucHV0ID09IG51bGwpID8gbnVsbCA6IG5ldyBGaWxlW10ge2lucHV0fSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnB1dCB0byB1c2UgZm9yIHRoZSB0YXNrCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGZpbGVzIGZyb20gd2hpY2ggaW5wdXQgaXMgcmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SW5wdXQoRmlsZVtdIGlucHV0KSB7CisgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0cmluZyB0byB1c2UgYXMgaW5wdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmluZyB0aGUgc3RyaW5nIHdoaWNoIGlzIHVzZWQgYXMgdGhlIGlucHV0IHNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJbnB1dFN0cmluZyhTdHJpbmcgaW5wdXRTdHJpbmcpIHsKKyAgICAgICAgdGhpcy5pbnB1dFN0cmluZyA9IGlucHV0U3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBzdHJpbmcgaW4gbG9nIG1lc3NhZ2VzLgorICAgICAqIERlZmF1bHRzIHRvIHRydWUuCisgICAgICogQHBhcmFtIGxvZ0lucHV0U3RyaW5nIHRydWUgb3IgZmFsc2UuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dJbnB1dFN0cmluZyhib29sZWFuIGxvZ0lucHV0U3RyaW5nKSB7CisgICAgICAgIHRoaXMubG9nSW5wdXRTdHJpbmcgPSBsb2dJbnB1dFN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBzdHJlYW0gdG8gdXNlIGFzIGlucHV0LgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtIHRoZSBzdHJlYW0gZnJvbSB3aGljaCBpbnB1dCB3aWxsIGJlIHJlYWQKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgLypwdWJsaWMqLyB2b2lkIHNldElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7CisgICAgICAgIHRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWxlIHRoZSBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgaXMgcmVkaXJlY3RlZCB0by4gSWYgZXJyb3IgaXMgbm90CisgICAgICogcmVkaXJlY3RlZCwgaXQgdG9vIHdpbGwgYXBwZWFyIGluIHRoZSBvdXRwdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgdGhlIGZpbGUgdG8gd2hpY2ggb3V0cHV0IHN0cmVhbSBpcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KEZpbGUgb3V0KSB7CisgICAgICAgIHNldE91dHB1dCgob3V0ID09IG51bGwpID8gbnVsbCA6IG5ldyBGaWxlW10ge291dH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGVzIHRoZSBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgaXMgcmVkaXJlY3RlZCB0by4gSWYgZXJyb3IgaXMgbm90CisgICAgICogcmVkaXJlY3RlZCwgaXQgdG9vIHdpbGwgYXBwZWFyIGluIHRoZSBvdXRwdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgdGhlIGZpbGVzIHRvIHdoaWNoIG91dHB1dCBzdHJlYW0gaXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRPdXRwdXQoRmlsZVtdIG91dCkgeworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG91dHB1dCBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXRFbmNvZGluZyAgIDxjb2RlPlN0cmluZzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE91dHB1dEVuY29kaW5nKFN0cmluZyBvdXRwdXRFbmNvZGluZykgeworICAgICAgICBpZiAob3V0cHV0RW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAib3V0cHV0RW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5vdXRwdXRFbmNvZGluZyA9IG91dHB1dEVuY29kaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlcnJvciBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvckVuY29kaW5nICAgPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RXJyb3JFbmNvZGluZyhTdHJpbmcgZXJyb3JFbmNvZGluZykgeworICAgICAgICBpZiAoZXJyb3JFbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJlcnJvckVuY29kaW5nIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuZXJyb3JFbmNvZGluZyA9IGVycm9yRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGlucHV0IGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0RW5jb2RpbmcgICA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJbnB1dEVuY29kaW5nKFN0cmluZyBpbnB1dEVuY29kaW5nKSB7CisgICAgICAgIGlmIChpbnB1dEVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImlucHV0RW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5pbnB1dEVuY29kaW5nID0gaW5wdXRFbmNvZGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHdoZXRoZXIgZXJyb3Igb3V0cHV0IG9mIGV4ZWMgaXMgbG9nZ2VkLiBUaGlzIGlzIG9ubHkgdXNlZnVsCisgICAgICogd2hlbiBvdXRwdXQgaXMgYmVpbmcgcmVkaXJlY3RlZCBhbmQgZXJyb3Igb3V0cHV0IGlzIGRlc2lyZWQgaW4gdGhlCisgICAgICogQW50IGxvZworICAgICAqCisgICAgICogQHBhcmFtIGxvZ0Vycm9yIGlmIHRydWUgdGhlIHN0YW5kYXJkIGVycm9yIGlzIHNlbnQgdG8gdGhlIEFudCBsb2cgc3lzdGVtCisgICAgICogICAgICAgIGFuZCBub3Qgc2VudCB0byBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldExvZ0Vycm9yKGJvb2xlYW4gbG9nRXJyb3IpIHsKKyAgICAgICAgdGhpcy5sb2dFcnJvciA9IGxvZ0Vycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgPGNvZGU+UmVkaXJlY3RvcjwvY29kZT4ncyBzdWJvcmRpbmF0ZQorICAgICAqIDxjb2RlPlByb3BlcnR5T3V0cHV0U3RyZWFtPC9jb2RlPnMgd2lsbCBub3Qgc2V0IHRoZWlyIHJlc3BlY3RpdmUKKyAgICAgKiBwcm9wZXJ0aWVzIDxjb2RlPndoaWxlIChhcHBlbmRQcm9wZXJ0aWVzICYmIGFwcGVuZCk8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGVuZFByb3BlcnRpZXMgd2hldGhlciB0byBhcHBlbmQgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0QXBwZW5kUHJvcGVydGllcyhib29sZWFuIGFwcGVuZFByb3BlcnRpZXMpIHsKKyAgICAgICAgdGhpcy5hcHBlbmRQcm9wZXJ0aWVzID0gYXBwZW5kUHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZpbGUgdG8gd2hpY2ggc3RhbmRhcmQgZXJyb3IgaXMgdG8gYmUgcmVkaXJlY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvciB0aGUgZmlsZSB0byB3aGljaCBlcnJvciBpcyB0byBiZSB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3IoRmlsZSBlcnJvcikgeworICAgICAgICBzZXRFcnJvcigoZXJyb3IgPT0gbnVsbCkgPyBudWxsIDogbmV3IEZpbGVbXSB7ZXJyb3J9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZpbGVzIHRvIHdoaWNoIHN0YW5kYXJkIGVycm9yIGlzIHRvIGJlIHJlZGlyZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyb3IgdGhlIGZpbGUgdG8gd2hpY2ggZXJyb3IgaXMgdG8gYmUgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFcnJvcihGaWxlW10gZXJyb3IpIHsKKyAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgb3V0cHV0IG9mCisgICAgICogdGhlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0UHJvcGVydHkgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNldCB3aXRoIHRoZQorICAgICAqICAgICAgICB0YXNrJ3Mgb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRPdXRwdXRQcm9wZXJ0eShTdHJpbmcgb3V0cHV0UHJvcGVydHkpIHsKKyAgICAgICAgaWYgKG91dHB1dFByb3BlcnR5ID09IG51bGwKKyAgICAgICAgIHx8ICEob3V0cHV0UHJvcGVydHkuZXF1YWxzKHRoaXMub3V0cHV0UHJvcGVydHkpKSkgeworICAgICAgICAgICAgdGhpcy5vdXRwdXRQcm9wZXJ0eSA9IG91dHB1dFByb3BlcnR5OworICAgICAgICAgICAgYmFvcyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuCisgICAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwZW5kIGlmIHRydWUgb3V0cHV0IGFuZCBlcnJvciBzdHJlYW1zIGFyZSBhcHBlbmRlZCB0byB0aGVpcgorICAgICAqICAgICAgICByZXNwZWN0aXZlIGZpbGVzLCBpZiBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEFwcGVuZChib29sZWFuIGFwcGVuZCkgeworICAgICAgICB0aGlzLmFwcGVuZCA9IGFwcGVuZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCAoZXJyb3IgYW5kIG5vbi1lcnJvcikgb3V0cHV0IHdpbGwgYmUgInRlZWQiLCByZWRpcmVjdGVkCisgICAgICogYXMgc3BlY2lmaWVkIHdoaWxlIGJlaW5nIHNlbnQgdG8gQW50J3MgbG9nZ2luZyBtZWNoYW5pc20gYXMgaWYgbm8KKyAgICAgKiByZWRpcmVjdGlvbiBoYWQgdGFrZW4gcGxhY2UuICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0gYWx3YXlzTG9nIDxjb2RlPmJvb2xlYW48L2NvZGU+CisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBbHdheXNMb2coYm9vbGVhbiBhbHdheXNMb2cpIHsKKyAgICAgICAgdGhpcy5hbHdheXNMb2cgPSBhbHdheXNMb2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBvdXRwdXQgYW5kIGVycm9yIGZpbGVzIHNob3VsZCBiZSBjcmVhdGVkIGV2ZW4gd2hlbiBlbXB0eS4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqIEBwYXJhbSBjcmVhdGVFbXB0eUZpbGVzIDxjb2RlPmJvb2xlYW48L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDcmVhdGVFbXB0eUZpbGVzKGJvb2xlYW4gY3JlYXRlRW1wdHlGaWxlcykgeworICAgICAgICB0aGlzLmNyZWF0ZUVtcHR5RmlsZXMgPSBjcmVhdGVFbXB0eUZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgZXJyb3Igb2YKKyAgICAgKiB0aGUgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclByb3BlcnR5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZXQKKyAgICAgKiAgICAgICAgd2l0aCB0aGUgZXJyb3Igb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFcnJvclByb3BlcnR5KFN0cmluZyBlcnJvclByb3BlcnR5KSB7CisgICAgICAgIGlmIChlcnJvclByb3BlcnR5ID09IG51bGwKKyAgICAgICAgIHx8ICEoZXJyb3JQcm9wZXJ0eS5lcXVhbHModGhpcy5lcnJvclByb3BlcnR5KSkpIHsKKyAgICAgICAgICAgIHRoaXMuZXJyb3JQcm9wZXJ0eSA9IGVycm9yUHJvcGVydHk7CisgICAgICAgICAgICBlcnJvckJhb3MgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnB1dCA8Y29kZT5GaWx0ZXJDaGFpbjwvY29kZT5zLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0RmlsdGVyQ2hhaW5zIDxjb2RlPlZlY3RvcjwvY29kZT4gY29udGFpbmluZyA8Y29kZT5GaWx0ZXJDaGFpbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElucHV0RmlsdGVyQ2hhaW5zKFZlY3RvciBpbnB1dEZpbHRlckNoYWlucykgeworICAgICAgICB0aGlzLmlucHV0RmlsdGVyQ2hhaW5zID0gaW5wdXRGaWx0ZXJDaGFpbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgPGNvZGU+RmlsdGVyQ2hhaW48L2NvZGU+cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXRGaWx0ZXJDaGFpbnMgPGNvZGU+VmVjdG9yPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPkZpbHRlckNoYWluPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0T3V0cHV0RmlsdGVyQ2hhaW5zKFZlY3RvciBvdXRwdXRGaWx0ZXJDaGFpbnMpIHsKKyAgICAgICAgdGhpcy5vdXRwdXRGaWx0ZXJDaGFpbnMgPSBvdXRwdXRGaWx0ZXJDaGFpbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlcnJvciA8Y29kZT5GaWx0ZXJDaGFpbjwvY29kZT5zLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yRmlsdGVyQ2hhaW5zIDxjb2RlPlZlY3RvcjwvY29kZT4gY29udGFpbmluZyA8Y29kZT5GaWx0ZXJDaGFpbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEVycm9yRmlsdGVyQ2hhaW5zKFZlY3RvciBlcnJvckZpbHRlckNoYWlucykgeworICAgICAgICB0aGlzLmVycm9yRmlsdGVyQ2hhaW5zID0gZXJyb3JGaWx0ZXJDaGFpbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgcHJvcGVydHkgZnJvbSBhIEJ5dGVBcnJheU91dHB1dFN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtIGJhb3MgY29udGFpbnMgdGhlIHByb3BlcnR5IHZhbHVlLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmVhZCBmb3JtIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5RnJvbUJBT1MoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBCdWZmZXJlZFJlYWRlciBpbgorICAgICAgICAgICAgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihFeGVjdXRlLnRvU3RyaW5nKGJhb3MpKSk7CisgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHZhbC5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdmFsLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWwuYXBwZW5kKGxpbmUpOworICAgICAgICB9CisgICAgICAgIG1hbmFnaW5nVGFzay5nZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWwudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBpbnB1dCwgZXJyb3IgYW5kIG91dHB1dCBzdHJlYW1zIGJhc2VkIG9uIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY3JlYXRlU3RyZWFtcygpIHsKKyAgICAgICAgb3V0U3RyZWFtcygpOworICAgICAgICBlcnJvclN0cmVhbXMoKTsKKyAgICAgICAgaWYgKGFsd2F5c0xvZyB8fCBvdXRwdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dExvZworICAgICAgICAgICAgICAgID0gbmV3IExvZ091dHB1dFN0cmVhbShtYW5hZ2luZ1Rhc2ssIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gKG91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgID8gb3V0cHV0TG9nIDogbmV3IFRlZU91dHB1dFN0cmVhbShvdXRwdXRMb2csIG91dHB1dFN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFsd2F5c0xvZyB8fCBlcnJvclN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZXJyb3JMb2cKKyAgICAgICAgICAgICAgICA9IG5ldyBMb2dPdXRwdXRTdHJlYW0obWFuYWdpbmdUYXNrLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIGVycm9yU3RyZWFtID0gKGVycm9yU3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgPyBlcnJvckxvZyA6IG5ldyBUZWVPdXRwdXRTdHJlYW0oZXJyb3JMb2csIGVycm9yU3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG91dHB1dEZpbHRlckNoYWlucyAhPSBudWxsICYmIG91dHB1dEZpbHRlckNoYWlucy5zaXplKCkgPiAwKQorICAgICAgICAgICAgfHwgIShvdXRwdXRFbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKGlucHV0RW5jb2RpbmcpKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBMZWFkUGlwZUlucHV0U3RyZWFtIHNuayA9IG5ldyBMZWFkUGlwZUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgc25rLnNldE1hbmFnaW5nQ29tcG9uZW50KG1hbmFnaW5nVGFzayk7CisKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBvdXRQdW1wSW4gPSBzbms7CisKKyAgICAgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG91dFB1bXBJbiwgaW5wdXRFbmNvZGluZyk7CisKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RmlsdGVyQ2hhaW5zICE9IG51bGwgJiYgb3V0cHV0RmlsdGVyQ2hhaW5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhaW5SZWFkZXJIZWxwZXIgaGVscGVyID0gbmV3IENoYWluUmVhZGVySGVscGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGhlbHBlci5zZXRQcm9qZWN0KG1hbmFnaW5nVGFzay5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICBoZWxwZXIuc2V0UHJpbWFyeVJlYWRlcihyZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBoZWxwZXIuc2V0RmlsdGVyQ2hhaW5zKG91dHB1dEZpbHRlckNoYWlucyk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IGhlbHBlci5nZXRBc3NlbWJsZWRSZWFkZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0UHVtcEluID0gbmV3IFJlYWRlcklucHV0U3RyZWFtKHJlYWRlciwgb3V0cHV0RW5jb2RpbmcpOworCisgICAgICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHRocmVhZEdyb3VwLCBuZXcgU3RyZWFtUHVtcGVyKAorICAgICAgICAgICAgICAgICAgICBvdXRQdW1wSW4sIG91dHB1dFN0cmVhbSwgdHJ1ZSksICJvdXRwdXQgcHVtcGVyIik7CisgICAgICAgICAgICAgICAgdC5zZXRQcmlvcml0eShUaHJlYWQuTUFYX1BSSU9SSVRZKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgUGlwZWRPdXRwdXRTdHJlYW0oc25rKTsKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleWVPaEV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiZXJyb3Igc2V0dGluZyB1cCBvdXRwdXQgc3RyZWFtIiwgZXllT2hFeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGVycm9yRmlsdGVyQ2hhaW5zICE9IG51bGwgJiYgZXJyb3JGaWx0ZXJDaGFpbnMuc2l6ZSgpID4gMCkKKyAgICAgICAgICAgIHx8ICEoZXJyb3JFbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKGlucHV0RW5jb2RpbmcpKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBMZWFkUGlwZUlucHV0U3RyZWFtIHNuayA9IG5ldyBMZWFkUGlwZUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgc25rLnNldE1hbmFnaW5nQ29tcG9uZW50KG1hbmFnaW5nVGFzayk7CisKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlcnJQdW1wSW4gPSBzbms7CisKKyAgICAgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGVyclB1bXBJbiwgaW5wdXRFbmNvZGluZyk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3JGaWx0ZXJDaGFpbnMgIT0gbnVsbCAmJiBlcnJvckZpbHRlckNoYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIENoYWluUmVhZGVySGVscGVyIGhlbHBlciA9IG5ldyBDaGFpblJlYWRlckhlbHBlcigpOworICAgICAgICAgICAgICAgICAgICBoZWxwZXIuc2V0UHJvamVjdChtYW5hZ2luZ1Rhc2suZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaGVscGVyLnNldFByaW1hcnlSZWFkZXIocmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVscGVyLnNldEZpbHRlckNoYWlucyhlcnJvckZpbHRlckNoYWlucyk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IGhlbHBlci5nZXRBc3NlbWJsZWRSZWFkZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyUHVtcEluID0gbmV3IFJlYWRlcklucHV0U3RyZWFtKHJlYWRlciwgZXJyb3JFbmNvZGluZyk7CisKKyAgICAgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQodGhyZWFkR3JvdXAsIG5ldyBTdHJlYW1QdW1wZXIoCisgICAgICAgICAgICAgICAgICAgIGVyclB1bXBJbiwgZXJyb3JTdHJlYW0sIHRydWUpLCAiZXJyb3IgcHVtcGVyIik7CisgICAgICAgICAgICAgICAgdC5zZXRQcmlvcml0eShUaHJlYWQuTUFYX1BSSU9SSVRZKTsKKyAgICAgICAgICAgICAgICBlcnJvclN0cmVhbSA9IG5ldyBQaXBlZE91dHB1dFN0cmVhbShzbmspOworICAgICAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV5ZU9oRXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJlcnJvciBzZXR0aW5nIHVwIGVycm9yIHN0cmVhbSIsIGV5ZU9oRXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgaW5wdXQgZmlsZXMgYXJlIHNwZWNpZmllZCwgaW5wdXRTdHJpbmcgYW5kIGlucHV0U3RyZWFtIGFyZSBpZ25vcmVkOworICAgICAgICAvLyBjbGFzc2VzIHRoYXQgd29yayB3aXRoIHJlZGlyZWN0b3IgYXR0cmlidXRlcyBjYW4gZW5mb3JjZQorICAgICAgICAvLyB3aGF0ZXZlciB3YXJuaW5ncyBhcmUgbmVlZGVkCisgICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0Lmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIG1hbmFnaW5nVGFzay5sb2coIlJlZGlyZWN0aW5nIGlucHV0IGZyb20gZmlsZSIKKyAgICAgICAgICAgICAgICArICgoaW5wdXQubGVuZ3RoID09IDEpID8gIiIgOiAicyIpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgQ29uY2F0RmlsZUlucHV0U3RyZWFtKGlucHV0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV5ZU9oRXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXllT2hFeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKENvbmNhdEZpbGVJbnB1dFN0cmVhbSkgaW5wdXRTdHJlYW0pLnNldE1hbmFnaW5nQ29tcG9uZW50KG1hbmFnaW5nVGFzayk7CisgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlVzaW5nIGlucHV0ICIpOworICAgICAgICAgICAgaWYgKGxvZ0lucHV0U3RyaW5nKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnIicpLmFwcGVuZChpbnB1dFN0cmluZykuYXBwZW5kKCciJyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInN0cmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFuYWdpbmdUYXNrLmxvZyhidWYudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsCisgICAgICAgICAgICAmJiBpbnB1dEZpbHRlckNoYWlucyAhPSBudWxsICYmIGlucHV0RmlsdGVyQ2hhaW5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIENoYWluUmVhZGVySGVscGVyIGhlbHBlciA9IG5ldyBDaGFpblJlYWRlckhlbHBlcigpOworICAgICAgICAgICAgaGVscGVyLnNldFByb2plY3QobWFuYWdpbmdUYXNrLmdldFByb2plY3QoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGhlbHBlci5zZXRQcmltYXJ5UmVhZGVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0sIGlucHV0RW5jb2RpbmcpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV5ZU9oRXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJlcnJvciBzZXR0aW5nIHVwIGlucHV0IHN0cmVhbSIsIGV5ZU9oRXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGVscGVyLnNldEZpbHRlckNoYWlucyhpbnB1dEZpbHRlckNoYWlucyk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBSZWFkZXJJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBoZWxwZXIuZ2V0QXNzZW1ibGVkUmVhZGVyKCksIGlucHV0RW5jb2RpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIG91dFN0cmVhbXMgKi8KKyAgICBwcml2YXRlIHZvaWQgb3V0U3RyZWFtcygpIHsKKyAgICAgICAgaWYgKG91dCAhPSBudWxsICYmIG91dC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBTdHJpbmcgbG9nSGVhZCA9IG5ldyBTdHJpbmdCdWZmZXIoIk91dHB1dCAiKS5hcHBlbmQoCisgICAgICAgICAgICAgICAgKChhcHBlbmQpID8gImFwcGVuZGVkIiA6ICJyZWRpcmVjdGVkIikpLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAiIHRvICIpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBmb2xkRmlsZXMob3V0LCBsb2dIZWFkLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0cHV0UHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGJhb3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJhb3MgPSBuZXcgUHJvcGVydHlPdXRwdXRTdHJlYW0ob3V0cHV0UHJvcGVydHkpOworICAgICAgICAgICAgICAgIG1hbmFnaW5nVGFzay5sb2coIk91dHB1dCByZWRpcmVjdGVkIHRvIHByb3BlcnR5OiAiCisgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0UHJvcGVydHksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9zaGllbGQgaXQgZnJvbSBiZWluZyBjbG9zZWQgYnkgYSBmaWx0ZXJpbmcgU3RyZWFtUHVtcGVyCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0ga2VlcEFsaXZlT3V0cHV0ID0gbmV3IEtlZXBBbGl2ZU91dHB1dFN0cmVhbShiYW9zKTsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IChvdXRwdXRTdHJlYW0gPT0gbnVsbCkgPyBrZWVwQWxpdmVPdXRwdXQKKyAgICAgICAgICAgICAgICA6IG5ldyBUZWVPdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtLCBrZWVwQWxpdmVPdXRwdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFvcyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXJyb3JTdHJlYW1zKCkgeworICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBTdHJpbmcgbG9nSGVhZCA9IG5ldyBTdHJpbmdCdWZmZXIoIkVycm9yICIpLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAoKGFwcGVuZCkgPyAiYXBwZW5kZWQiIDogInJlZGlyZWN0ZWQiKSkuYXBwZW5kKAorICAgICAgICAgICAgICAgICIgdG8gIikudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGVycm9yU3RyZWFtID0gZm9sZEZpbGVzKGVycm9yLCBsb2dIZWFkLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfSBlbHNlIGlmICghKGxvZ0Vycm9yIHx8IG91dHB1dFN0cmVhbSA9PSBudWxsKSkgeworICAgICAgICAgICAgbG9uZyBmdW5uZWxUaW1lb3V0ID0gMEw7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW1GdW5uZWxlciBmdW5uZWxlcgorICAgICAgICAgICAgICAgID0gbmV3IE91dHB1dFN0cmVhbUZ1bm5lbGVyKG91dHB1dFN0cmVhbSwgZnVubmVsVGltZW91dCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IGZ1bm5lbGVyLmdldEZ1bm5lbEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgZXJyb3JTdHJlYW0gPSBmdW5uZWxlci5nZXRGdW5uZWxJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXllT2hFeCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImVycm9yIHNwbGl0dGluZyBvdXRwdXQvZXJyb3Igc3RyZWFtcyIsIGV5ZU9oRXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlcnJvclByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChlcnJvckJhb3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVycm9yQmFvcyA9IG5ldyBQcm9wZXJ0eU91dHB1dFN0cmVhbShlcnJvclByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICBtYW5hZ2luZ1Rhc2subG9nKCJFcnJvciByZWRpcmVjdGVkIHRvIHByb3BlcnR5OiAiICsgZXJyb3JQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3NoaWVsZCBpdCBmcm9tIGJlaW5nIGNsb3NlZCBieSBhIGZpbHRlcmluZyBTdHJlYW1QdW1wZXIKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBrZWVwQWxpdmVFcnJvciA9IG5ldyBLZWVwQWxpdmVPdXRwdXRTdHJlYW0oZXJyb3JCYW9zKTsKKyAgICAgICAgICAgIGVycm9yU3RyZWFtID0gKGVycm9yID09IG51bGwgfHwgZXJyb3IubGVuZ3RoID09IDApID8ga2VlcEFsaXZlRXJyb3IKKyAgICAgICAgICAgICAgICA6IG5ldyBUZWVPdXRwdXRTdHJlYW0oZXJyb3JTdHJlYW0sIGtlZXBBbGl2ZUVycm9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVycm9yQmFvcyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIFN0cmVhbUhhbmRsZXIgdG8gdXNlIHdpdGggb3VyIEV4ZWN1dGUgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBleGVjdXRlIHN0cmVhbSBoYW5kbGVyIHRvIG1hbmFnZSB0aGUgaW5wdXQsIG91dHB1dCBhbmQKKyAgICAgKiBlcnJvciBzdHJlYW1zLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZXhlY3V0ZSBzdHJlYW0gaGFuZGxlciBjYW5ub3QgYmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIGNyZWF0ZUhhbmRsZXIoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVTdHJlYW1zKCk7CisgICAgICAgIHJldHVybiBuZXcgUHVtcFN0cmVhbUhhbmRsZXIob3V0cHV0U3RyZWFtLCBlcnJvclN0cmVhbSwgaW5wdXRTdHJlYW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3Mgb3V0cHV0IHNlbnQgdG8gU3lzdGVtLm91dCB0byBzcGVjaWZpZWQgb3V0cHV0LgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCB0aGUgZGF0YSB0byBiZSBvdXRwdXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKG91dFByaW50U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dFByaW50U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKG91dHB1dFN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0UHJpbnRTdHJlYW0ucHJpbnQob3V0cHV0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgYW4gaW5wdXQgcmVxdWVzdAorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIGludG8gd2hpY2ggZGF0YSBpcyB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgYXQgd2hpY2ggZGF0YSBpcyBzdG9yZWQuCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGRhdGEgY2Fubm90IGJlIHJlYWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCBoYW5kbGVJbnB1dChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbWFuYWdpbmdUYXNrLmdldFByb2plY3QoKS5kZWZhdWx0SW5wdXQoYnVmZmVyLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBkYXRhIGR1ZSB0byBhIGZsdXNoIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIGRhdGEgYmVpbmcgZmx1c2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlRmx1c2goU3RyaW5nIG91dHB1dCkgeworICAgICAgICBpZiAob3V0UHJpbnRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0UHJpbnRTdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0ob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBvdXRQcmludFN0cmVhbS5wcmludChvdXRwdXQpOworICAgICAgICBvdXRQcmludFN0cmVhbS5mbHVzaCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgZXJyb3Igb3V0cHV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBlcnJvciBvdXRwdXQgZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlRXJyb3JPdXRwdXQoU3RyaW5nIG91dHB1dCkgeworICAgICAgICBpZiAoZXJyb3JQcmludFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBlcnJvclByaW50U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKGVycm9yU3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBlcnJvclByaW50U3RyZWFtLnByaW50KG91dHB1dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlIGEgZmx1c2ggb3BlcmF0aW9uIG9uIHRoZSBlcnJvciBzdHJlYW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIGVycm9yIGluZm9ybWF0aW9uIGJlaW5nIGZsdXNoZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZUVycm9yRmx1c2goU3RyaW5nIG91dHB1dCkgeworICAgICAgICBpZiAoZXJyb3JQcmludFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBlcnJvclByaW50U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKGVycm9yU3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBlcnJvclByaW50U3RyZWFtLnByaW50KG91dHB1dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBvdXRwdXQgc3RyZWFtIGZvciB0aGUgcmVkaXJlY3RvcgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVkaXJlY3RvcidzIG91dHB1dCBzdHJlYW0gb3IgbnVsbCBpZiBubyBvdXRwdXQKKyAgICAgKiAgICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRTdHJlYW07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBlcnJvciBzdHJlYW0gZm9yIHRoZSByZWRpcmVjdG9yCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZWRpcmVjdG9yJ3MgZXJyb3Igc3RyZWFtIG9yIG51bGwgaWYgbm8gb3V0cHV0CisgICAgICogICAgICAgICBoYXMgYmVlbiBjb25maWd1cmVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPdXRwdXRTdHJlYW0gZ2V0RXJyb3JTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBlcnJvclN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIHJlZGlyZWN0b3IKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlZGlyZWN0b3IncyBpbnB1dCBzdHJlYW0gb3IgbnVsbCBpZiBubyBvdXRwdXQKKyAgICAgKiAgICAgICAgIGhhcyBiZWVuIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeworICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGxldGUgcmVkaXJlY3Rpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG9wZXJhdGlvbiB3aWxsIGNsb3NlIGFueSBzdHJlYW1zIGFuZCBjcmVhdGUgYW55IHNwZWNpZmllZAorICAgICAqIHByb3BlcnR5IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG91dHB1dCBwcm9wZXJ0aWVzIGNhbm5vdCBiZSByZWFkIGZyb20gdGhlaXIKKyAgICAgKiBvdXRwdXQgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29tcGxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7CisgICAgICAgIFN5c3RlbS5lcnIuZmx1c2goKTsKKworICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKKworICAgICAgICBlcnJvclN0cmVhbS5mbHVzaCgpOworICAgICAgICBlcnJvclN0cmVhbS5jbG9zZSgpOworCisgICAgICAgIC8vd2FpdCBmb3IgdGhlIFN0cmVhbVB1bXBlcnMgdG8gZmluaXNoCisgICAgICAgIHdoaWxlICh0aHJlYWRHcm91cC5hY3RpdmVDb3VudCgpID4gMCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYW5hZ2luZ1Rhc2subG9nKCJ3YWl0aW5nIGZvciAiICsgdGhyZWFkR3JvdXAuYWN0aXZlQ291bnQoKQorICAgICAgICAgICAgICAgICAgICArICIgVGhyZWFkczoiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgVGhyZWFkW10gdGhyZWFkID0gbmV3IFRocmVhZFt0aHJlYWRHcm91cC5hY3RpdmVDb3VudCgpXTsKKyAgICAgICAgICAgICAgICB0aHJlYWRHcm91cC5lbnVtZXJhdGUodGhyZWFkKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZC5sZW5ndGggJiYgdGhyZWFkW2ldICE9IG51bGw7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdpbmdUYXNrLmxvZyh0aHJlYWRbaV0udG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlblBlYUV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2FpdChTVFJFQU1QVU1QRVJfV0FJVF9JTlRFUlZBTCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleWVFeCkgeworICAgICAgICAgICAgICAgIFRocmVhZFtdIHRocmVhZCA9IG5ldyBUaHJlYWRbdGhyZWFkR3JvdXAuYWN0aXZlQ291bnQoKV07CisgICAgICAgICAgICAgICAgdGhyZWFkR3JvdXAuZW51bWVyYXRlKHRocmVhZCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWQubGVuZ3RoICYmIHRocmVhZFtpXSAhPSBudWxsOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkW2ldLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNldFByb3BlcnRpZXMoKTsKKworICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIGVycm9yU3RyZWFtID0gbnVsbDsKKyAgICAgICAgb3V0UHJpbnRTdHJlYW0gPSBudWxsOworICAgICAgICBlcnJvclByaW50U3RyZWFtID0gbnVsbDsKKyAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgPGNvZGU+UmVkaXJlY3RvcjwvY29kZT4gdGhhdCBpdCBpcyBub3cgb2theQorICAgICAqIHRvIHNldCBhbnkgb3V0cHV0IGFuZC9vciBlcnJvciBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICBpZiAoYmFvcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV5ZU9oRXgpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9yQmFvcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVycm9yQmFvcy5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXllT2hFeCkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBleGNlcHRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIGZvbGRGaWxlcyhGaWxlW10gZmlsZSwgU3RyaW5nIGxvZ0hlYWQsIGludCBsb2dsZXZlbCkgeworICAgICAgICBPdXRwdXRTdHJlYW0gcmVzdWx0CisgICAgICAgICAgICA9IG5ldyBMYXp5RmlsZU91dHB1dFN0cmVhbShmaWxlWzBdLCBhcHBlbmQsIGNyZWF0ZUVtcHR5RmlsZXMpOworCisgICAgICAgIG1hbmFnaW5nVGFzay5sb2cobG9nSGVhZCArIGZpbGVbMF0sIGxvZ2xldmVsKTsKKyAgICAgICAgY2hhcltdIGMgPSBuZXcgY2hhcltsb2dIZWFkLmxlbmd0aCgpXTsKKyAgICAgICAgQXJyYXlzLmZpbGwoYywgJyAnKTsKKyAgICAgICAgU3RyaW5nIGluZGVudCA9IG5ldyBTdHJpbmcoYyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBmaWxlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgVGVlT3V0cHV0U3RyZWFtKG91dHB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICBuZXcgTGF6eUZpbGVPdXRwdXRTdHJlYW0oZmlsZVtpXSwgYXBwZW5kLCBjcmVhdGVFbXB0eUZpbGVzKSk7CisgICAgICAgICAgICBtYW5hZ2luZ1Rhc2subG9nKGluZGVudCArIGZpbGVbaV0sIGxvZ2xldmVsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVuYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwMmVjZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZS5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBSZW5hbWVzIGEgZmlsZS4KKyAqCisgKiBAZGVwcmVjYXRlZCBUaGUgcmVuYW1lIHRhc2sgaXMgZGVwcmVjYXRlZCBzaW5jZSBBbnQgMS4yLiAgVXNlIG1vdmUgaW5zdGVhZC4KKyAqIEBzaW5jZSBBbnQgMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBSZW5hbWUgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJpdmF0ZSBGaWxlIHNyYzsKKyAgICBwcml2YXRlIEZpbGUgZGVzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVwbGFjZSA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpbGUgdG8gYmUgcmVuYW1lZC4KKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBmaWxlIHRvIHJlbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIHNyYykgeworICAgICAgICB0aGlzLnNyYyA9IHNyYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuZXcgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgKiBAcGFyYW0gZGVzdCB0aGUgbmV3IG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRlc3QpIHsKKyAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBzaG91bGQgYmUgcmVwbGFjZWQuCisgICAgICogQHBhcmFtIHJlcGxhY2UgPGNvZGU+b248L2NvZGU+LCBpZiBhbiBleGlzdGluZyBmaWxlIHNob3VsZCBiZSByZXBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlKFN0cmluZyByZXBsYWNlKSB7CisgICAgICAgIHRoaXMucmVwbGFjZSA9IFByb2plY3QudG9Cb29sZWFuKHJlcGxhY2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVuYW1lcyB0aGUgZmlsZSA8Y29kZT5zcmM8L2NvZGU+IHRvIDxjb2RlPmRlc3Q8L2NvZGU+CisgICAgICogQGV4Y2VwdGlvbiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGlzCisgICAgICogdGhyb3duLCBpZiB0aGUgcmVuYW1lIG9wZXJhdGlvbiBmYWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIHJlbmFtZSB0YXNrIGlzIGRlcHJlY2F0ZWQuICBVc2UgbW92ZSBpbnN0ZWFkLiIpOworCisgICAgICAgIGlmIChkZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGVzdCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgYXR0cmlidXRlIGlzIHJlcXVpcmVkIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJlcGxhY2UgJiYgZGVzdC5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGRlc3QgKyAiIGFscmVhZHkgZXhpc3RzLiIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZJTEVfVVRJTFMucmVuYW1lKHNyYywgZGVzdCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlbmFtZSAiICsgc3JjICsgIiB0byAiCisgICAgICAgICAgICAgICAgKyBkZXN0LCBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlcGxhY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlcGxhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZThlNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVwbGFjZS5qYXZhCkBAIC0wLDAgKzEsODMyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBSZXBsYWNlcyBhbGwgb2NjdXJyZW5jZXMgb2Ygb25lIG9yIG1vcmUgc3RyaW5nIHRva2VucyB3aXRoIGdpdmVuCisgKiB2YWx1ZXMgaW4gdGhlIGluZGljYXRlZCBmaWxlcy4gRWFjaCB2YWx1ZSBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nCisgKiBvciB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBhdmFpbGFibGUgaW4gYSBkZXNpZ25hdGVkIHByb3BlcnR5IGZpbGUuCisgKiBJZiB5b3Ugd2FudCB0byByZXBsYWNlIGEgdGV4dCB0aGF0IGNyb3NzZXMgbGluZSBib3VuZGFyaWVzLCB5b3UKKyAqIG11c3QgdXNlIGEgbmVzdGVkIDxjb2RlPiZsdDtyZXBsYWNldG9rZW4mZ3Q7PC9jb2RlPiBlbGVtZW50LgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgorICovCitwdWJsaWMgY2xhc3MgUmVwbGFjZSBleHRlbmRzIE1hdGNoaW5nVGFzayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHByaXZhdGUgRmlsZSBzcmMgPSBudWxsOworICAgIHByaXZhdGUgTmVzdGVkU3RyaW5nIHRva2VuID0gbnVsbDsKKyAgICBwcml2YXRlIE5lc3RlZFN0cmluZyB2YWx1ZSA9IG5ldyBOZXN0ZWRTdHJpbmcoKTsKKworICAgIHByaXZhdGUgRmlsZSBwcm9wZXJ0eUZpbGUgPSBudWxsOworICAgIHByaXZhdGUgRmlsZSByZXBsYWNlRmlsdGVyRmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBudWxsOworICAgIHByaXZhdGUgVmVjdG9yIHJlcGxhY2VmaWx0ZXJzID0gbmV3IFZlY3RvcigpOworCisgICAgcHJpdmF0ZSBGaWxlIGRpciA9IG51bGw7CisKKyAgICBwcml2YXRlIGludCBmaWxlQ291bnQ7CisgICAgcHJpdmF0ZSBpbnQgcmVwbGFjZUNvdW50OworICAgIHByaXZhdGUgYm9vbGVhbiBzdW1tYXJ5ID0gZmFsc2U7CisKKyAgICAvKiogVGhlIGVuY29kaW5nIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgZmlsZXMgLSBpZiBudWxsLCB1c2VzIGRlZmF1bHQgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbmxpbmUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgcmVwbGFjZW1lbnQgdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTmVzdGVkU3RyaW5nIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0ZXh0IG9mIHRoZSBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsIHRoZSBzdHJpbmcgdG8gYWRkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB2YWwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGZpbHRlciB0byBhcHBseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUmVwbGFjZWZpbHRlciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRva2VuOworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZVZhbHVlOworICAgICAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKworICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBpbnB1dEJ1ZmZlcjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgb3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBWYWxpZGF0ZSB0aGUgZmlsdGVyJ3MgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbnkgcGFydCBpcyBpbnZhbGlkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgLy9WYWxpZGF0ZSBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJ0b2tlbiBpcyBhIG1hbmRhdG9yeSBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICAgICArICJvZiByZXBsYWNlZmlsdGVyLiI7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKHRva2VuKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlRoZSB0b2tlbiBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgYW4gZW1wdHkgIgorICAgICAgICAgICAgICAgICAgICArICJzdHJpbmcuIjsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vdmFsdWUgYW5kIHByb3BlcnR5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYXR0cmlidXRlcworICAgICAgICAgICAgaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAocHJvcGVydHkgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJFaXRoZXIgdmFsdWUgb3IgcHJvcGVydHkgIgorICAgICAgICAgICAgICAgICAgICArICJjYW4gYmUgc3BlY2lmaWVkLCBidXQgYSByZXBsYWNlZmlsdGVyICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZWxlbWVudCBjYW5ub3QgaGF2ZSBib3RoLiI7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHByb3BlcnR5ICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgLy90aGUgcHJvcGVydHkgYXR0cmlidXRlIG11c3QgaGF2ZSBhY2Nlc3MgdG8gYSBwcm9wZXJ0eSBmaWxlCisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5RmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlRoZSByZXBsYWNlZmlsdGVyJ3MgcHJvcGVydHkgYXR0cmlidXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgcmVwbGFjZXRhc2sncyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJwcm9wZXJ0eUZpbGUgYXR0cmlidXRlLiI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL01ha2Ugc3VyZSBwcm9wZXJ0eSBleGlzdHMgaW4gcHJvcGVydHkgZmlsZQorICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgcHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJwcm9wZXJ0eSBcIiIgKyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgd2FzIG5vdCBmb3VuZCBpbiAiICsgcHJvcGVydHlGaWxlLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwbGFjZVZhbHVlID0gZ2V0UmVwbGFjZVZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmb3IgdGhpcyBmaWx0ZXIgdG9rZW4uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHJlcGxhY2VtZW50IHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VWYWx1ZSgpIHsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChSZXBsYWNlLnRoaXMudmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXBsYWNlLnRoaXMudmFsdWUuZ2V0VGV4dCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL0RlZmF1bHQgaXMgZW1wdHkgc3RyaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgdG9rZW4gdG8gcmVwbGFjZS4KKyAgICAgICAgICogQHBhcmFtIHRva2VuIDxjb2RlPlN0cmluZzwvY29kZT4gdG9rZW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUb2tlbihTdHJpbmcgdG9rZW4pIHsKKyAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLgorICAgICAgICAgKiBAcmV0dXJuIGN1cnJlbnQgPGNvZGU+U3RyaW5nPC9jb2RlPiB0b2tlbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJlcGxhY2VtZW50IHN0cmluZzsgcmVxdWlyZWQgaWYgPGNvZGU+cHJvcGVydHk8Y29kZT4KKyAgICAgICAgICogaXMgbm90IHNldC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgdG8gcmVwbGFjZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCByZXBsYWNlbWVudCA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICAgICAgICAgKiBAcmV0dXJuIHJlcGxhY2VtZW50IG9yIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgdG8gc2VydmUgYXMKKyAgICAgICAgICogdGhlIHJlcGxhY2VtZW50IHZhbHVlOyByZXF1aXJlZCBpZiA8Y29kZT52YWx1ZTwvY29kZT4gaXMgbm90IHNldC4KKyAgICAgICAgICogQHBhcmFtIHByb3BlcnR5IHByb3BlcnR5IG5hbWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHRvIHNlcnZlIGFzCisgICAgICAgICAqIHRoZSByZXBsYWNlbWVudCB2YWx1ZS4KKyAgICAgICAgICogQHJldHVybiBwcm9wZXJ0eSBvciBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIG91dHB1dCBidWZmZXIgb2YgdGhpcyBmaWx0ZXIuIFRoZSBmaWx0ZXIgZ3VhcmFudGVlcworICAgICAgICAgKiB0aGF0IGRhdGEgaXMgb25seSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBTdHJpbmdCdWZmZXIgY29udGFpbmluZyB0aGUgb3V0cHV0IG9mIHRoaXMgZmlsdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nQnVmZmVyIGdldE91dHB1dEJ1ZmZlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXRCdWZmZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgaW5wdXQgYnVmZmVyIGZvciB0aGlzIGZpbHRlci4KKyAgICAgICAgICogVGhlIGZpbHRlciBleHBlY3RzIGZyb20gdGhlIGNvbXBvbmVudCBwcm92aWRpbmcgdGhlIGlucHV0IHRoYXQgZGF0YQorICAgICAgICAgKiBpcyBvbmx5IGFkZGVkIGJ5IHRoYXQgY29tcG9uZW50IHRvIHRoZSBlbmQgb2YgdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICAgICAqIFRoaXMgU3RyaW5nQnVmZmVyIHdpbGwgYmUgbW9kaWZpZWQgYnkgdGhpcyBmaWx0ZXIsIGFuZCBleHBlY3RzIHRoYXQKKyAgICAgICAgICogYW5vdGhlciBjb21wb25lbnQgd2lsbCBvbmx5IGFwcGVkIHRvIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IGZvciB0aGlzIGZpbHRlci4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0SW5wdXRCdWZmZXIoU3RyaW5nQnVmZmVyIGlucHV0KSB7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IGlucHV0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyB0aGUgYnVmZmVyIGFzIGZhciBhcyBwb3NzaWJsZS4gVGFrZXMgaW50byBhY2NvdW50IHRoYXQKKyAgICAgICAgICogYXBwZW5kZWQgZGF0YSBtYXkgbWFrZSBpdCBwb3NzaWJsZSB0byByZXBsYWNlIHRoZSBlbmQgb2YgdGhlIGFscmVhZHkKKyAgICAgICAgICogcmVjZWl2ZWQgZGF0YSwgd2hlbiB0aGUgdG9rZW4gaXMgc3BsaXQgb3ZlciB0aGUgIm9sZCIgYW5kIHRoZSAibmV3IgorICAgICAgICAgKiBwYXJ0LgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgc29tZSBkYXRhIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIGluIHRoZQorICAgICAgICAgKiAgICAgICAgIG91dHB1dCBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIHByb2Nlc3MoKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXIubGVuZ3RoKCkgPiB0b2tlbi5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGludCBwb3MgPSByZXBsYWNlKCk7CisgICAgICAgICAgICAgICAgcG9zID0gTWF0aC5tYXgoKGlucHV0QnVmZmVyLmxlbmd0aCgpIC0gdG9rZW4ubGVuZ3RoKCkpLCBwb3MpOworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5hcHBlbmQoaW5wdXRCdWZmZXIuc3Vic3RyaW5nKDAsIHBvcykpOworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLmRlbGV0ZSgwLCBwb3MpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyB0aGUgYnVmZmVyIHRvIHRoZSBlbmQuIERvZXMgbm90IHRha2UgaW50byBhY2NvdW50IHRoYXQKKyAgICAgICAgICogYXBwZW5kZWQgZGF0YSBtYXkgbWFrZSBpdCBwb3NzaWJsZSB0byByZXBsYWNlIHRoZSBlbmQgb2YgdGhlIGFscmVhZHkKKyAgICAgICAgICogcmVjZWl2ZWQgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZmx1c2goKSB7CisgICAgICAgICAgICByZXBsYWNlKCk7CisgICAgICAgICAgICAvLyBBdm9pZCBydW50aW1lIHByb2JsZW0gb24gcHJlIDEuNCB3aGVuIGNvbXBpbGluZyBwb3N0IDEuNAorICAgICAgICAgICAgb3V0cHV0QnVmZmVyLmFwcGVuZChpbnB1dEJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyLmRlbGV0ZSgwLCBpbnB1dEJ1ZmZlci5sZW5ndGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYXMKKyAgICAgICAgICogICAgICAgICByZXBsYWNlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IHJlcGxhY2UoKSB7CisgICAgICAgICAgICBpbnQgZm91bmQgPSBpbnB1dEJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YodG9rZW4pOworICAgICAgICAgICAgaW50IHBvcyA9IC0xOworICAgICAgICAgICAgd2hpbGUgKGZvdW5kID49IDApIHsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5yZXBsYWNlKGZvdW5kLCBmb3VuZCArIHRva2VuLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVZhbHVlKTsKKyAgICAgICAgICAgICAgICBwb3MgPSBmb3VuZCArIHJlcGxhY2VWYWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IGlucHV0QnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZih0b2tlbiwgcG9zKTsKKyAgICAgICAgICAgICAgICArK3JlcGxhY2VDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwb3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyByZWFkaW5nIGEgZmlsZSBpbiBzbWFsbCBjaHVua3MsIGFuZCBwcmVzZW50aW5nIHRoZXNlIGNodW5rcyBpbgorICAgICAqIGEgU3RyaW5nQnVmZmVyLiBDb21wYXRpYmxlIHdpdGggdGhlIFJlcGxhY2VmaWx0ZXIuCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgRmlsZUlucHV0IHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgb3V0cHV0QnVmZmVyOworICAgICAgICBwcml2YXRlIFJlYWRlciByZWFkZXI7CisgICAgICAgIHByaXZhdGUgY2hhcltdIGJ1ZmZlcjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZfU0laRSA9IDQwOTY7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgdGhlIGlucHV0IGNvbXBvbmVudC4gT3BlbnMgdGhlIGZpbGUgZm9yIHJlYWRpbmcuCisgICAgICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIGZpbGUgdG8gcmVhZCBmcm9tLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFdoZW4gdGhlIGZpbGUgY2Fubm90IGJlIHJlYWQgZnJvbS4KKyAgICAgICAgICovCisgICAgICAgIEZpbGVJbnB1dChGaWxlIHNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW0JVRkZfU0laRV07CisgICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihzb3VyY2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlKSwgZW5jb2RpbmcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIG91dHB1dCBidWZmZXIgb2YgdGhpcyBmaWx0ZXIuIFRoZSBjb21wb25lbnQgZ3VhcmFudGVlcworICAgICAgICAgKiB0aGF0IGRhdGEgaXMgb25seSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBTdHJpbmdCdWZmZXIgY29udGFpbmluZyB0aGUgb3V0cHV0IG9mIHRoaXMgZmlsdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nQnVmZmVyIGdldE91dHB1dEJ1ZmZlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXRCdWZmZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVhZHMgc29tZSBkYXRhIGZyb20gdGhlIGZpbGUuCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBlbmQgb2YgdGhlIGZpbGUgaGFzIG5vdCBiZWVuIHJlYWNoZWQuCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gV2hlbiB0aGUgZmlsZSBjYW5ub3QgYmUgcmVhZCBmcm9tLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiByZWFkQ2h1bmsoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IGJ1ZmZlckxlbmd0aCA9IDA7CisgICAgICAgICAgICBidWZmZXJMZW5ndGggPSByZWFkZXIucmVhZChidWZmZXIpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBidWZmZXJMZW5ndGgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsb3NlcyB0aGUgZmlsZS4KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBXaGVuIHRoZSBmaWxlIGNhbm5vdCBiZSBjbG9zZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsb3NlcyBmaWxlIGJ1dCBkb2Vzbid0IHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjbG9zZVF1aWV0bHkoKSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UocmVhZGVyKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcG9uZW50IHdyaXRpbmcgYSBmaWxlIGluIGNodW5rcywgdGFraW5nIHRoZSBjaHVua3MgZnJvbSB0aGUKKyAgICAgKiBSZXBsYWNlZmlsdGVyLgorICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEZpbGVPdXRwdXQgeworICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBpbnB1dEJ1ZmZlcjsKKyAgICAgICAgcHJpdmF0ZSBXcml0ZXIgd3JpdGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIHRoZSBvdXRwdXQgY29tcG9uZW50LiBPcGVucyB0aGUgZmlsZSBmb3Igd3JpdGluZy4KKyAgICAgICAgICogQHBhcmFtIG91dCBUaGUgZmlsZSB0byByZWFkIHRvLgorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFdoZW4gdGhlIGZpbGUgY2Fubm90IGJlIHJlYWQgZnJvbS4KKyAgICAgICAgICovCisgICAgICAgIEZpbGVPdXRwdXQoRmlsZSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKG91dCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dCksIGVuY29kaW5nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGlucHV0IGJ1ZmZlciBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICAgICAqIFRoZSBmaWx0ZXIgZXhwZWN0cyBmcm9tIHRoZSBjb21wb25lbnQgcHJvdmlkaW5nIHRoZSBpbnB1dCB0aGF0IGRhdGEKKyAgICAgICAgICogaXMgb25seSBhZGRlZCBieSB0aGF0IGNvbXBvbmVudCB0byB0aGUgZW5kIG9mIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAgICAgKiBUaGlzIFN0cmluZ0J1ZmZlciB3aWxsIGJlIG1vZGlmaWVkIGJ5IHRoaXMgZmlsdGVyLCBhbmQgZXhwZWN0cyB0aGF0CisgICAgICAgICAqIGFub3RoZXIgY29tcG9uZW50IHdpbGwgb25seSBhcHBlbmQgdG8gdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgZm9yIHRoaXMgZmlsdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRJbnB1dEJ1ZmZlcihTdHJpbmdCdWZmZXIgaW5wdXQpIHsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyID0gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGVzIHRoZSBidWZmZXIgYXMgZmFyIGFzIHBvc3NpYmxlLgorICAgICAgICAgKiBAcmV0dXJuIGZhbHNlIHRvIGJlIGlubGluZSB3aXRoIHRoZSBSZXBsYWNlZmlsdGVyLgorICAgICAgICAgKiAoWWVzIGRlZmluaW5nIGFuIGludGVyZmFjZSBjcm9zc2VkIG15IG1pbmQsIGJ1dCB3b3VsZCBwdWJsaXNoIHRoZQorICAgICAgICAgKiBpbnRlcm5hbCBiZWhhdmlvci4pCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiB0aGUgb3V0cHV0IGNhbm5vdCBiZSB3cml0dGVuLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBwcm9jZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShpbnB1dEJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyLmRlbGV0ZSgwLCBpbnB1dEJ1ZmZlci5sZW5ndGgoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBidWZmZXIgdG8gdGhlIGVuZC4KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIHRoZSBvdXRwdXQgY2Fubm90IGJlIGZsdXNoZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHByb2Nlc3MoKTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsb3NlcyB0aGUgZmlsZS4KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBXaGVuIHRoZSBmaWxlIGNhbm5vdCBiZSBjbG9zZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsb3NlcyBmaWxlIGJ1dCBkb2Vzbid0IHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjbG9zZVF1aWV0bHkoKSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uod3JpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHRoZSBleGVjdXRpb24uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB3ZSBjYW50IGJ1aWxkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgVmVjdG9yIHNhdmVkRmlsdGVycyA9IChWZWN0b3IpIHJlcGxhY2VmaWx0ZXJzLmNsb25lKCk7CisgICAgICAgIFByb3BlcnRpZXMgc2F2ZWRQcm9wZXJ0aWVzID0KKyAgICAgICAgICAgIHByb3BlcnRpZXMgPT0gbnVsbCA/IG51bGwgOiAoUHJvcGVydGllcykgcHJvcGVydGllcy5jbG9uZSgpOworCisgICAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBsaW5lIHNlcGFyYXRvcnMgaW4gdmFsdWVzIGFuZCB0b2tlbnMgYXJlICJcbiIKKyAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGNvbXBhcmUgd2l0aCB0aGUgZmlsZSBjb250ZW50cywgcmVwbGFjZSB0aGVtCisgICAgICAgICAgICAvLyBhcyBuZWVkZWQKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLmdldFRleHQoKSk7CisgICAgICAgICAgICBzdHJpbmdSZXBsYWNlKHZhbCwgIlxyXG4iLCAiXG4iKTsKKyAgICAgICAgICAgIHN0cmluZ1JlcGxhY2UodmFsLCAiXG4iLCBTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgdG9rID0gbmV3IFN0cmluZ0J1ZmZlcih0b2tlbi5nZXRUZXh0KCkpOworICAgICAgICAgICAgc3RyaW5nUmVwbGFjZSh0b2ssICJcclxuIiwgIlxuIik7CisgICAgICAgICAgICBzdHJpbmdSZXBsYWNlKHRvaywgIlxuIiwgU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICAgICAgUmVwbGFjZWZpbHRlciBmaXJzdEZpbHRlciA9IGNyZWF0ZVByaW1hcnlmaWx0ZXIoKTsKKyAgICAgICAgICAgIGZpcnN0RmlsdGVyLnNldFRva2VuKHRvay50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGZpcnN0RmlsdGVyLnNldFZhbHVlKHZhbC50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocmVwbGFjZUZpbHRlckZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBnZXRQcm9wZXJ0aWVzKHJlcGxhY2VGaWx0ZXJGaWxlKTsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcHJvcHMua2V5cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b2sgPSAgZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VmaWx0ZXIgcmVwbGFjZUZpbHRlciA9IGNyZWF0ZVJlcGxhY2VmaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUZpbHRlci5zZXRUb2tlbih0b2spOworICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmlsdGVyLnNldFZhbHVlKHByb3BzLmdldFByb3BlcnR5KHRvaykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsaWRhdGVBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eUZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKHByb3BlcnR5RmlsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhbGlkYXRlUmVwbGFjZWZpbHRlcnMoKTsKKyAgICAgICAgICAgIGZpbGVDb3VudCA9IDA7CisgICAgICAgICAgICByZXBsYWNlQ291bnQgPSAwOworCisgICAgICAgICAgICBpZiAoc3JjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShzcmMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihkaXIpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNyY3MgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNyY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBzcmNzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUoZmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3VtbWFyeSkgeworICAgICAgICAgICAgICAgIGxvZygiUmVwbGFjZWQgIiArIHJlcGxhY2VDb3VudCArICIgb2NjdXJyZW5jZXMgaW4gIgorICAgICAgICAgICAgICAgICAgICArIGZpbGVDb3VudCArICIgZmlsZXMuIiwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXBsYWNlZmlsdGVycyA9IHNhdmVkRmlsdGVyczsKKyAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzYXZlZFByb3BlcnRpZXM7CisgICAgICAgIH0gLy8gZW5kIG9mIGZpbmFsbHkKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGF0dHJpYnV0ZXMgcHJvdmlkZWQgZm9yIHRoaXMgdGFzayBpbiAueG1sIGJ1aWxkIGZpbGUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBzdXBwbGllZCBhdHRyaWJ1dGUgaXMgaW52YWxpZCBvciBhbnkKKyAgICAgKiBtYW5kYXRvcnkgYXR0cmlidXRlIGlzIG1pc3NpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsICYmIGRpciA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJFaXRoZXIgdGhlIGZpbGUgb3IgdGhlIGRpciBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICsgIm11c3QgYmUgc3BlY2lmaWVkIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvcGVydHlGaWxlICE9IG51bGwgJiYgIXByb3BlcnR5RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiUHJvcGVydHkgZmlsZSAiICsgcHJvcGVydHlGaWxlLmdldFBhdGgoKQorICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdC4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsICYmIHJlcGxhY2VmaWx0ZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJFaXRoZXIgdG9rZW4gb3IgYSBuZXN0ZWQgcmVwbGFjZWZpbHRlciAiCisgICAgICAgICAgICAgICAgKyAibXVzdCBiZSBzcGVjaWZpZWQiOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh0b2tlbiAhPSBudWxsICYmICIiLmVxdWFscyh0b2tlbi5nZXRUZXh0KCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJUaGUgdG9rZW4gYXR0cmlidXRlIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZy4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgbmVzdGVkIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbnkgc3VwcGxpZWQgYXR0cmlidXRlIGlzIGludmFsaWQgb3IgYW55CisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZSBpcyBtaXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlUmVwbGFjZWZpbHRlcnMoKQorICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBsYWNlZmlsdGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUmVwbGFjZWZpbHRlciBlbGVtZW50ID0KKyAgICAgICAgICAgICAgICAoUmVwbGFjZWZpbHRlcikgcmVwbGFjZWZpbHRlcnMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgZWxlbWVudC52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBhIHByb3BlcnRpZXMgZmlsZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlGaWxlIHRoZSBmaWxlIHRvIGxvYWQgdGhlIHByb3BlcnRpZXMgZnJvbS4KKyAgICAgKiBAcmV0dXJuIGxvYWRlZCA8Y29kZT5Qcm9wZXJ0aWVzPC9jb2RlPiBvYmplY3QuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQgb3IgcmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKEZpbGUgcHJvcGVydHlGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHByb3BlcnR5RmlsZSk7CisgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlByb3BlcnR5IGZpbGUgKCIgKyBwcm9wZXJ0eUZpbGUuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgKyAiKSBub3QgZm91bmQuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiUHJvcGVydHkgZmlsZSAoIiArIHByb3BlcnR5RmlsZS5nZXRQYXRoKCkKKyAgICAgICAgICAgICAgICArICIpIGNhbm5vdCBiZSBsb2FkZWQuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSB0aGUgcmVwbGFjZW1lbnQgb24gdGhlIGdpdmVuIGZpbGUuCisgICAgICoKKyAgICAgKiBUaGUgcmVwbGFjZW1lbnQgaXMgcGVyZm9ybWVkIG9uIGEgdGVtcG9yYXJ5IGZpbGUgd2hpY2ggdGhlbgorICAgICAqIHJlcGxhY2VzIHRoZSBvcmlnaW5hbCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIDxjb2RlPkZpbGU8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmlsZShGaWxlIHNyYykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFzcmMuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUmVwbGFjZTogc291cmNlIGZpbGUgIiArIHNyYy5nZXRQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCBleGlzdCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSB0ZW1wID0gbnVsbDsKKyAgICAgICAgRmlsZUlucHV0IGluID0gbnVsbDsKKyAgICAgICAgRmlsZU91dHB1dCBvdXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0KHNyYyk7CisKKyAgICAgICAgICAgIHRlbXAgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKCJyZXAiLCAiLnRtcCIsCisgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRQYXJlbnRGaWxlKCksIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0KHRlbXApOworCisgICAgICAgICAgICBpbnQgcmVwQ291bnRTdGFydCA9IHJlcGxhY2VDb3VudDsKKworICAgICAgICAgICAgbG9nRmlsdGVyQ2hhaW4oc3JjLmdldFBhdGgoKSk7CisKKyAgICAgICAgICAgIG91dC5zZXRJbnB1dEJ1ZmZlcihidWlsZEZpbHRlckNoYWluKGluLmdldE91dHB1dEJ1ZmZlcigpKSk7CisKKyAgICAgICAgICAgIHdoaWxlIChpbi5yZWFkQ2h1bmsoKSkgeworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzRmlsdGVyQ2hhaW4oKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJvY2VzcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmx1c2hGaWx0ZXJDaGFpbigpOworCisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICBpbiA9IG51bGw7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIG91dCA9IG51bGw7CisKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlcyA9IChyZXBsYWNlQ291bnQgIT0gcmVwQ291bnRTdGFydCk7CisgICAgICAgICAgICBpZiAoY2hhbmdlcykgeworICAgICAgICAgICAgICAgIGZpbGVDb3VudCsrOworICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVuYW1lKHRlbXAsIHNyYyk7CisgICAgICAgICAgICAgICAgdGVtcCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJT0V4Y2VwdGlvbiBpbiAiICsgc3JjICsgIiAtICIKKyAgICAgICAgICAgICAgICAgICAgKyBpb2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiIKKyAgICAgICAgICAgICAgICAgICAgKyBpb2UuZ2V0TWVzc2FnZSgpLCBpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKG51bGwgIT0gaW4pIHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZVF1aWV0bHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudWxsICE9IG91dCkgeworICAgICAgICAgICAgICAgIG91dC5jbG9zZVF1aWV0bHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ZW1wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRlbXAuZGVsZXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcC5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaGVzIGFsbCBmaWx0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmbHVzaEZpbHRlckNoYWluKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VmaWx0ZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBSZXBsYWNlZmlsdGVyIGZpbHRlciA9IChSZXBsYWNlZmlsdGVyKSByZXBsYWNlZmlsdGVycy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBmaWx0ZXIuZmx1c2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBub3JtYWwgcHJvY2Vzc2luZyBvZiB0aGUgZmlsdGVycy4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbHRlciBjaGFpbiBwcm9kdWNlZCBuZXcgb3V0cHV0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRmlsdGVyQ2hhaW4oKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwbGFjZWZpbHRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFJlcGxhY2VmaWx0ZXIgZmlsdGVyID0gKFJlcGxhY2VmaWx0ZXIpIHJlcGxhY2VmaWx0ZXJzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGlmICghZmlsdGVyLnByb2Nlc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBjaGFpbiBvZiBmaWx0ZXJzIHRvIG9wZXJhdGUuCisgICAgICogQHBhcmFtIGlucHV0QnVmZmVyIDxjb2RlPlN0cmluZ0J1ZmZlcjwvY29kZT4gY29udGFpbmluZyB0aGUgaW5wdXQgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBmaXJzdCBmaWx0ZXIuCisgICAgICogQHJldHVybiA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG91dHB1dCBvZiB0aGUgbGFzdCBmaWx0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVpbGRGaWx0ZXJDaGFpbihTdHJpbmdCdWZmZXIgaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IGlucHV0QnVmZmVyOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxhY2VmaWx0ZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBSZXBsYWNlZmlsdGVyIGZpbHRlciA9IChSZXBsYWNlZmlsdGVyKSByZXBsYWNlZmlsdGVycy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBmaWx0ZXIuc2V0SW5wdXRCdWZmZXIoYnVmKTsKKyAgICAgICAgICAgIGJ1ZiA9IGZpbHRlci5nZXRPdXRwdXRCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZ3MgdGhlIGNoYWluIG9mIGZpbHRlcnMgdG8gb3BlcmF0ZSBvbiB0aGUgZmlsZS4KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9nRmlsdGVyQ2hhaW4oU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwbGFjZWZpbHRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFJlcGxhY2VmaWx0ZXIgZmlsdGVyID0gKFJlcGxhY2VmaWx0ZXIpIHJlcGxhY2VmaWx0ZXJzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGxvZygiUmVwbGFjaW5nIGluICIgKyBmaWxlbmFtZSArICI6ICIgKyBmaWx0ZXIuZ2V0VG9rZW4oKQorICAgICAgICAgICAgICAgICAgICArICIgLS0+ICIgKyBmaWx0ZXIuZ2V0UmVwbGFjZVZhbHVlKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFNldCB0aGUgc291cmNlIGZpbGU7IHJlcXVpcmVkIHVubGVzcyA8Y29kZT5kaXI8L2NvZGU+IGlzIHNldC4KKyAgICAgKiBAcGFyYW0gZmlsZSBzb3VyY2UgPGNvZGU+RmlsZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5zcmMgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGEgc3VtbWFyeSBvZiB0aGUgcmVwbGFjZSBvcGVyYXRpb24gc2hvdWxkIGJlCisgICAgICogcHJvZHVjZWQsIGRldGFpbGluZyBob3cgbWFueSB0b2tlbiBvY2N1cnJlbmNlcyBhbmQgZmlsZXMgd2VyZQorICAgICAqIHByb2Nlc3NlZDsgb3B0aW9uYWwsIGRlZmF1bHQ9PGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHN1bW1hcnkgPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2hldGhlciBhIHN1bW1hcnkgb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgcmVwbGFjZSBvcGVyYXRpb24gc2hvdWxkIGJlIGxvZ2dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5KGJvb2xlYW4gc3VtbWFyeSkgeworICAgICAgICB0aGlzLnN1bW1hcnkgPSBzdW1tYXJ5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgY29udGFpbmluZyBmaWx0ZXJzOyBvcHRpb25hbC4KKyAgICAgKiBFYWNoIHByb3BlcnR5IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlcGxhY2VmaWx0ZXIgd2hlcmUgdG9rZW4gaXMgdGhlIG5hbWUKKyAgICAgKiBvZiB0aGUgcHJvcGVydHkgYW5kIHZhbHVlIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHJlcGxhY2VGaWx0ZXJGaWxlIDxjb2RlPkZpbGU8L2NvZGU+IHRvIGxvYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwbGFjZUZpbHRlckZpbGUoRmlsZSByZXBsYWNlRmlsdGVyRmlsZSkgeworICAgICAgICB0aGlzLnJlcGxhY2VGaWx0ZXJGaWxlID0gcmVwbGFjZUZpbHRlckZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJhc2UgZGlyZWN0b3J5IHRvIHVzZSB3aGVuIHJlcGxhY2luZyBhIHRva2VuIGluIG11bHRpcGxlIGZpbGVzOworICAgICAqIHJlcXVpcmVkIGlmIDxjb2RlPmZpbGU8L2NvZGU+IGlzIG5vdCBkZWZpbmVkLgorICAgICAqIEBwYXJhbSBkaXIgPGNvZGU+RmlsZTwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBiYXNlIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkaXIpIHsKKyAgICAgICAgdGhpcy5kaXIgPSBkaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdHJpbmcgdG9rZW4gdG8gcmVwbGFjZTsgcmVxdWlyZWQgdW5sZXNzIGEgbmVzdGVkCisgICAgICogPGNvZGU+cmVwbGFjZXRva2VuPC9jb2RlPiBlbGVtZW50IG9yIHRoZSA8Y29kZT5yZXBsYWNlZmlsdGVyZmlsZTwvY29kZT4KKyAgICAgKiBhdHRyaWJ1dGUgaXMgdXNlZC4KKyAgICAgKiBAcGFyYW0gdG9rZW4gdG9rZW4gPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb2tlbihTdHJpbmcgdG9rZW4pIHsKKyAgICAgICAgY3JlYXRlUmVwbGFjZVRva2VuKCkuYWRkVGV4dCh0b2tlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdHJpbmcgdmFsdWUgdG8gdXNlIGFzIHRva2VuIHJlcGxhY2VtZW50OworICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcgIiIuCisgICAgICogQHBhcmFtIHZhbHVlIHJlcGxhY2VtZW50IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBjcmVhdGVSZXBsYWNlVmFsdWUoKS5hZGRUZXh0KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZpbGUgZW5jb2RpbmcgdG8gdXNlIG9uIHRoZSBmaWxlcyByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSB0YXNrOworICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdG8gdXNlIG9uIHRoZSBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHRva2VuIHRvIGZpbHRlciBhcyB0aGUgdGV4dCBvZiBhIG5lc3RlZCBlbGVtZW50LgorICAgICAqIEByZXR1cm4gbmVzdGVkIHRva2VuIDxjb2RlPk5lc3RlZFN0cmluZzwvY29kZT4gdG8gY29uZmlndXJlLgorICAgICAqLworICAgIHB1YmxpYyBOZXN0ZWRTdHJpbmcgY3JlYXRlUmVwbGFjZVRva2VuKCkgeworICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgdG9rZW4gPSBuZXcgTmVzdGVkU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN0cmluZyB0byByZXBsYWNlIHRoZSB0b2tlbiBhcyB0aGUgdGV4dCBvZiBhIG5lc3RlZCBlbGVtZW50LgorICAgICAqIEByZXR1cm4gcmVwbGFjZW1lbnQgdmFsdWUgPGNvZGU+TmVzdGVkU3RyaW5nPC9jb2RlPiB0byBjb25maWd1cmUuCisgICAgICovCisgICAgcHVibGljIE5lc3RlZFN0cmluZyBjcmVhdGVSZXBsYWNlVmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgZnJvbSB3aGljaCBwcm9wZXJ0aWVzIHNwZWNpZmllZCB1c2luZyBuZXN0ZWQKKyAgICAgKiA8Y29kZT4mbHQ7cmVwbGFjZWZpbHRlciZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBkcmF3bjsgcmVxdWlyZWQgb25seSBpZgorICAgICAqIHRoZSA8aT5wcm9wZXJ0eTwvaT4gYXR0cmlidXRlIG9mIDxjb2RlPiZsdDtyZXBsYWNlZmlsdGVyJmd0OzwvY29kZT4gaXMgdXNlZC4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlGaWxlIDxjb2RlPkZpbGU8L2NvZGU+IHRvIGxvYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlGaWxlKEZpbGUgcHJvcGVydHlGaWxlKSB7CisgICAgICAgIHRoaXMucHJvcGVydHlGaWxlID0gcHJvcGVydHlGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5lc3RlZCAmbHQ7cmVwbGFjZWZpbHRlciZndDsgZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIGEgbmVzdGVkIDxjb2RlPlJlcGxhY2VmaWx0ZXI8L2NvZGU+IG9iamVjdCB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBSZXBsYWNlZmlsdGVyIGNyZWF0ZVJlcGxhY2VmaWx0ZXIoKSB7CisgICAgICAgIFJlcGxhY2VmaWx0ZXIgZmlsdGVyID0gbmV3IFJlcGxhY2VmaWx0ZXIoKTsKKyAgICAgICAgcmVwbGFjZWZpbHRlcnMuYWRkRWxlbWVudChmaWx0ZXIpOworICAgICAgICByZXR1cm4gZmlsdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHRva2VuIGFuZCB2YWx1ZSBhcyBmaXJzdCAmbHQ7cmVwbGFjZWZpbHRlciZndDsgZWxlbWVudC4KKyAgICAgKiBUaGUgdG9rZW4gYW5kIHZhbHVlIGFyZSBhbHdheXMgcHJvY2Vzc2VkIGZpcnN0LgorICAgICAqIEByZXR1cm4gYSBuZXN0ZWQgPGNvZGU+UmVwbGFjZWZpbHRlcjwvY29kZT4gb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXBsYWNlZmlsdGVyIGNyZWF0ZVByaW1hcnlmaWx0ZXIoKSB7CisgICAgICAgIFJlcGxhY2VmaWx0ZXIgZmlsdGVyID0gbmV3IFJlcGxhY2VmaWx0ZXIoKTsKKyAgICAgICAgcmVwbGFjZWZpbHRlcnMuaW5zZXJ0RWxlbWVudEF0KGZpbHRlciwgMCk7CisgICAgICAgIHJldHVybiBmaWx0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSBvY2N1cnJlbmNlcyBvZiBzdHIxIGluIFN0cmluZ0J1ZmZlciBzdHIgd2l0aCBzdHIyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdHJpbmdSZXBsYWNlKFN0cmluZ0J1ZmZlciBzdHIsIFN0cmluZyBzdHIxLCBTdHJpbmcgc3RyMikgeworICAgICAgICBpbnQgZm91bmQgPSBzdHIudG9TdHJpbmcoKS5pbmRleE9mKHN0cjEpOworICAgICAgICB3aGlsZSAoZm91bmQgPj0gMCkgeworICAgICAgICAgICAgc3RyLnJlcGxhY2UoZm91bmQsIGZvdW5kICsgc3RyMS5sZW5ndGgoKSwgc3RyMik7CisgICAgICAgICAgICBmb3VuZCA9IHN0ci50b1N0cmluZygpLmluZGV4T2Yoc3RyMSwgZm91bmQgKyBzdHIyLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVzb3VyY2VDb3VudC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVzb3VyY2VDb3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1OTJjMDUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXNvdXJjZUNvdW50LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Db25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbXBhcmlzb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworCisvKioKKyAqIENvdW50IHJlc291cmNlcyBmcm9tIGEgUmVzb3VyY2VDb2xsZWN0aW9uLCBzdG9yaW5nIHRvIGEgcHJvcGVydHkgb3IKKyAqIHdyaXRpbmcgdG8gdGhlIGxvZy4gIENhbiBhbHNvIGJlIHVzZWQgYXMgYSBDb25kaXRpb24uCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VDb3VudCBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBDb25kaXRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9ORVNURURfTUVTU0FHRQorICAgICAgICA9ICJSZXNvdXJjZUNvdW50IGNhbiBjb3VudCByZXNvdXJjZXMgZnJvbSBleGFjdGx5IG9uZSBuZXN0ZWQgUmVzb3VyY2VDb2xsZWN0aW9uLiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRfUkVRVUlSRUQKKyAgICAgICAgPSAiVXNlIG9mIHRoZSBSZXNvdXJjZUNvdW50IGNvbmRpdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBjb3VudCBhdHRyaWJ1dGUgYmUgc2V0LiI7CisKKyAgICBwcml2YXRlIFJlc291cmNlQ29sbGVjdGlvbiByYzsKKyAgICBwcml2YXRlIENvbXBhcmlzb24gd2hlbiA9IENvbXBhcmlzb24uRVFVQUw7CisgICAgcHJpdmF0ZSBJbnRlZ2VyIGNvdW50OworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gdG8gY291bnQuCisgICAgICogQHBhcmFtIHIgdGhlIFJlc291cmNlQ29sbGVjdGlvbiB0byBjb3VudC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFscmVhZHkgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcikgeworICAgICAgICBpZiAocmMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKE9ORV9ORVNURURfTUVTU0FHRSk7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSByOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB7CisgICAgICAgIE9iamVjdCBvID0gci5nZXRSZWZlcmVuY2VkT2JqZWN0KCk7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBSZXNvdXJjZUNvbGxlY3Rpb24pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oci5nZXRSZWZJZCgpCisgICAgICAgICAgICAgICAgKyAiIGRvZXNuXCd0IGRlbm90ZSBhIFJlc291cmNlQ29sbGVjdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGFkZCgoUmVzb3VyY2VDb2xsZWN0aW9uKSBvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGFzIGEgVGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBpZiAocmMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKE9ORV9ORVNURURfTUVTU0FHRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygicmVzb3VyY2UgY291bnQgPSAiICsgcmMuc2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgSW50ZWdlci50b1N0cmluZyhyYy5zaXplKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIGNvbmRpdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBSZXNvdXJjZUNvbGxlY3Rpb24gc2F0aXNmaWVzIHRoZSBzZXQgY3JpdGVyaWEuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKKyAgICAgICAgaWYgKHJjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihPTkVfTkVTVEVEX01FU1NBR0UpOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oQ09VTlRfUkVRVUlSRUQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aGVuLmV2YWx1YXRlKG5ldyBJbnRlZ2VyKHJjLnNpemUoKSkuY29tcGFyZVRvKGNvdW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0YXJnZXQgY291bnQgbnVtYmVyIGZvciB1c2UgYXMgYSBDb25kaXRpb24uCisgICAgICogQHBhcmFtIGMgbnVtYmVyIG9mIFJlc291cmNlcyBhcyBpbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q291bnQoaW50IGMpIHsKKyAgICAgICAgY291bnQgPSBuZXcgSW50ZWdlcihjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbXBhcmlzb24gZm9yIHVzZSBhcyBhIENvbmRpdGlvbi4KKyAgICAgKiBAcGFyYW0gYyBDb21wYXJpc29uIChhbiBFbnVtZXJhdGVkQXR0cmlidXRlKSBXaGVuLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tcGFyaXNvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdoZW4oQ29tcGFyaXNvbiBjKSB7CisgICAgICAgIHdoZW4gPSBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IGluIHRhc2sgbW9kZS4KKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvcGVydHkgbmFtZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHApIHsKKyAgICAgICAgcHJvcGVydHkgPSBwOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmV0cnkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JldHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwMjU5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JldHJ5LmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoNCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICoNCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsNCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsNCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFza0NvbnRhaW5lcjsNCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsNCisNCisvKioNCisgKiBSZXRyaWVzIHRoZSBuZXN0ZWQgdGFzayBhIHNldCBudW1iZXIgb2YgdGltZXMNCisgKiBAc2luY2UgQW50IDEuNy4xDQorICovDQorcHVibGljIGNsYXNzIFJldHJ5IGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIFRhc2tDb250YWluZXIgew0KKw0KKyAgICAvKioNCisgICAgICogdGFzayB0byBleGVjdXRlIG4gdGltZXMNCisgICAgICovDQorICAgIHByaXZhdGUgVGFzayBuZXN0ZWRUYXNrOw0KKw0KKyAgICAvKioNCisgICAgICogc2V0IHJldHJ5Q291bnQgdG8gMSBieSBkZWZhdWx0DQorICAgICAqLw0KKyAgICBwcml2YXRlIGludCByZXRyeUNvdW50ID0gMTsNCisNCisgICAgLyoqDQorICAgICAqIHNldCB0aGUgdGFzaw0KKyAgICAgKiBAcGFyYW0gdCB0aGUgdGFzayB0byByZXRyeS4NCisgICAgICovDQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRUYXNrKFRhc2sgdCkgew0KKyAgICAgICAgaWYgKG5lc3RlZFRhc2sgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgIlRoZSByZXRyeSB0YXNrIGNvbnRhaW5lciBhY2NlcHRzIGEgc2luZ2xlIG5lc3RlZCB0YXNrIg0KKyAgICAgICAgICAgICAgICArICIgKHdoaWNoIG1heSBiZSBhIHNlcXVlbnRpYWwgdGFzayBjb250YWluZXIpIik7DQorICAgICAgICB9DQorICAgICAgICBuZXN0ZWRUYXNrID0gdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogc2V0IHRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgdGhlIHRhc2sNCisgICAgICogQHBhcmFtIG4gdGhlIG51bWJlciB0byB1c2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXRyeUNvdW50KGludCBuKSB7DQorICAgICAgICByZXRyeUNvdW50ID0gbjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogcGVyZm9ybSB0aGUgd29yaw0KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmdCdWZmZXIgZXJyb3JNZXNzYWdlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHJldHJ5Q291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIG5lc3RlZFRhc2sucGVyZm9ybSgpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2VzLmFwcGVuZChlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICAgICAgICAgIGlmIChpID49IHJldHJ5Q291bnQpIHsNCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBleGNlcHRpb25NZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZS5hcHBlbmQoIlRhc2sgWyIpLmFwcGVuZChuZXN0ZWRUYXNrLmdldFRhc2tOYW1lKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZS5hcHBlbmQoIl0gZmFpbGVkIGFmdGVyIFsiKS5hcHBlbmQocmV0cnlDb3VudCk7DQorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlLmFwcGVuZCgiXSBhdHRlbXB0czsgZ2l2aW5nIHVwLiIpLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7DQorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlLmFwcGVuZCgiRXJyb3IgbWVzc2FnZXM6IikuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsNCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk1lc3NhZ2UuYXBwZW5kKGVycm9yTWVzc2FnZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4Y2VwdGlvbk1lc3NhZ2UudG9TdHJpbmcoKSwgZ2V0TG9jYXRpb24oKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgbG9nKCJBdHRlbXB0IFsiICsgaSArICJdOiBlcnJvciBvY2N1cnJlZDsgcmV0cnlpbmcuLi4iLCBlLCBQcm9qZWN0Lk1TR19JTkZPKTsNCisgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlcy5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SbWljLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SbWljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwYjUyNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JtaWMuamF2YQpAQCAtMCwwICsxLDcxNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5ybWljLlJtaWNBZGFwdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWMuUm1pY0FkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldENvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlNvdXJjZUZpbGVTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUuRmFjYWRlVGFza0hlbHBlcjsKKworLyoqCisgKiBSdW5zIHRoZSBybWljIGNvbXBpbGVyIGFnYWluc3QgY2xhc3Nlcy48L3A+CisgKiA8cD5SbWljIGNhbiBiZSBydW4gb24gYSBzaW5nbGUgY2xhc3MgKGFzIHNwZWNpZmllZCB3aXRoIHRoZSBjbGFzc25hbWUKKyAqIGF0dHJpYnV0ZSkgb3IgYSBudW1iZXIgb2YgY2xhc3NlcyBhdCBvbmNlIChhbGwgY2xhc3NlcyBiZWxvdyBiYXNlIHRoYXQKKyAqIGFyZSBuZWl0aGVyIF9TdHViIG5vciBfU2tlbCBjbGFzc2VzKS4gIElmIHlvdSB3YW50IHRvIHJtaWMgYSBzaW5nbGUKKyAqIGNsYXNzIGFuZCB0aGlzIGNsYXNzIGlzIGEgY2xhc3MgbmVzdGVkIGludG8gYW5vdGhlciBjbGFzcywgeW91IGhhdmUgdG8KKyAqIHNwZWNpZnkgdGhlIGNsYXNzbmFtZSBpbiB0aGUgZm9ybSA8Y29kZT5PdXRlciQkSW5uZXI8L2NvZGU+IGluc3RlYWQgb2YKKyAqIDxjb2RlPk91dGVyLklubmVyPC9jb2RlPi48L3A+CisgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBybWljZWQuIFRoaXMgY2FuCisgKiBiZSBkb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LAorICogPGk+ZXhjbHVkZXNmaWxlPC9pPiBhbmQgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPgorICogYXR0cmlidXRlcy4gV2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+IG9yIDxpPmluY2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIHlvdQorICogc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlCisgKiA8aT5leGNsdWRlPC9pPiBvciA8aT5leGNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKKyAqIHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKKyAqIGZpbmFsbHkgd2l0aCB0aGUgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyCisgKiB5b3Ugd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uCisgKiBkaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCisgKiBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLjwvcD4KKyAqIDxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCBGaWxlU2V0IGFuZAorICogc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgorICogKDxjb2RlPmRpcjwvY29kZT4gYmVjb21lcyA8Y29kZT5iYXNlPC9jb2RlPikgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCisgKiA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZAorICogPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byB1c2UgZGlmZmVyZW50IGNvbXBpbGVycy4gVGhpcyBjYW4gYmUgc2VsZWN0ZWQKKyAqIHdpdGggdGhlICZxdW90O2J1aWxkLnJtaWMmcXVvdDsgcHJvcGVydHkgb3IgdGhlIDxjb2RlPmNvbXBpbGVyPC9jb2RlPgorICogYXR0cmlidXRlLiA8YSBuYW1lPSJjb21waWxlcnZhbHVlcyI+VGhlcmUgYXJlIHRocmVlIGNob2ljZXM8L2E+OjwvcD4KKyAqIDx1bD4KKyAqICAgPGxpPnN1biAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIHRoZSBKREspPC9saT4KKyAqICAgPGxpPmthZmZlICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YKKyAqICAgICAgIHtAbGluayA8YSBocmVmPSJodHRwOi8vd3d3LmthZmZlLm9yZyI+S2FmZmU8L2E+fSk8L2xpPgorICogICA8bGk+d2VibG9naWM8L2xpPgorICogPC91bD4KKyAqCisgKiA8cD4gVGhlIDxhIGhyZWY9Imh0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS8iPm1pbmlSTUk8L2E+CisgKiBwcm9qZWN0IGNvbnRhaW5zIGEgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgdGFzayBhcyB3ZWxsLAorICogcGxlYXNlIGNvbnN1bHQgbWluaVJNSSdzIGRvY3VtZW50YXRpb24gdG8gbGVhcm4gaG93IHRvIHVzZSBpdC48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjEKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImphdmEiCisgKi8KKworcHVibGljIGNsYXNzIFJtaWMgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgeworCisgICAgLyoqIHJtaWMgZmFpbGVkIG1lc3NhZ2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9STUlDX0ZBSUxFRAorICAgICAgICAgICAgPSAiUm1pYyBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLiI7CisKKyAgICBwcml2YXRlIEZpbGUgYmFzZURpcjsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7CisgICAgcHJpdmF0ZSBGaWxlIHNvdXJjZUJhc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgc3R1YlZlcnNpb247CisgICAgcHJpdmF0ZSBQYXRoIGNvbXBpbGVDbGFzc3BhdGg7CisgICAgcHJpdmF0ZSBQYXRoIGV4dERpcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmlmeSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJpbmcgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpaW9wID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgIGlpb3BPcHRzOworICAgIHByaXZhdGUgYm9vbGVhbiBpZGwgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgIGlkbE9wdHM7CisgICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnICA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlQW50UnVudGltZSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVKYXZhUnVudGltZSA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBWZWN0b3IgY29tcGlsZUxpc3QgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGxvYWRlciA9IG51bGw7CisKKyAgICBwcml2YXRlIEZhY2FkZVRhc2tIZWxwZXIgZmFjYWRlOworICAgIC8qKiB1bmFibGUgdG8gdmVyaWZ5IG1lc3NhZ2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9VTkFCTEVfVE9fVkVSSUZZX0NMQVNTID0gIlVuYWJsZSB0byB2ZXJpZnkgY2xhc3MgIjsKKyAgICAvKiogY291bGQgbm90IGJlIGZvdW5kIG1lc3NhZ2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT1RfRk9VTkQgPSAiLiBJdCBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICAvKiogbm90IGRlZmluZWQgbWVzc2FnZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PVF9ERUZJTkVEID0gIi4gSXQgaXMgbm90IGRlZmluZWQuIjsKKyAgICAvKiogbG9hZGVkIGVycm9yIG1lc3NhZ2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9MT0FESU5HX0NBVVNFRF9FWENFUFRJT04gPSAiLiBMb2FkaW5nIGNhdXNlZCBFeGNlcHRpb246ICI7CisgICAgLyoqIGJhc2Ugbm90IGV4aXN0cyBtZXNzYWdlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fQkFTRV9FWElTVFMgPSAiYmFzZSBkb2VzIG5vdCBleGlzdDogIjsKKyAgICAvKiogYmFzZSBub3QgYSBkaXJlY3RvcnkgbWVzc2FnZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PVF9BX0RJUiA9ICJiYXNlIGlzIG5vdCBhIGRpcmVjdG9yeToiOworICAgIC8qKiBiYXNlIGF0dHJpYnV0ZSBub3Qgc2V0IG1lc3NhZ2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9CQVNFX05PVF9TRVQgPSAiYmFzZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFJtaWMuCisgICAgICovCisgICAgcHVibGljIFJtaWMoKSB7CisgICAgICAgIGZhY2FkZSA9IG5ldyBGYWNhZGVUYXNrSGVscGVyKFJtaWNBZGFwdGVyRmFjdG9yeS5ERUZBVUxUX0NPTVBJTEVSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgY29tcGlsZWQgZmlsZXM7IHJlcXVpcmVkCisgICAgICogQHBhcmFtIGJhc2UgdGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21waWxlZCBmaWxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2UoRmlsZSBiYXNlKSB7CisgICAgICAgIHRoaXMuYmFzZURpciA9IGJhc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gb3V0cHV0IGdlbmVyYXRlZCBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcGlsZWQgZmlsZXMKKyAgICAgKi8KKworICAgIHB1YmxpYyBGaWxlIGdldEJhc2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJhc2VEaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xhc3MgdG8gcnVuIDxjb2RlPnJtaWM8L2NvZGU+IGFnYWluc3Q7CisgICAgICogb3B0aW9uYWwKKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBmb3Igcm1pYyB0byBjcmVhdGUgY29kZSBmb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICB0aGlzLmNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjbGFzcyBuYW1lIHRvIGNvbXBpbGUuCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY29tcGlsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NuYW1lKCkgeworICAgICAgICByZXR1cm4gY2xhc3NuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIG9wdGlvbmFsIGRpcmVjdG9yeSB0byBzYXZlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgdG8uCisgICAgICogQHBhcmFtIHNvdXJjZUJhc2UgdGhlIGRpcmVjdG9yeSB0byBzYXZlIHNvdXJjZSBmaWxlcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VCYXNlKEZpbGUgc291cmNlQmFzZSkgeworICAgICAgICB0aGlzLnNvdXJjZUJhc2UgPSBzb3VyY2VCYXNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNvdXJjZSBkaXJzIHRvIGZpbmQgdGhlIHNvdXJjZSBqYXZhIGZpbGVzLgorICAgICAqIEByZXR1cm4gc291cmNlQmFzZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRTb3VyY2VCYXNlKCkgeworICAgICAgICByZXR1cm4gc291cmNlQmFzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHRoZSBKREsgdmVyc2lvbiBmb3IgdGhlIGdlbmVyYXRlZCBzdHViIGNvZGUuCisgICAgICogU3BlY2lmeSAmcXVvdDsxLjEmcXVvdDsgdG8gcGFzcyB0aGUgJnF1b3Q7LXYxLjEmcXVvdDsgb3B0aW9uIHRvIHJtaWMuPC90ZD4KKyAgICAgKiBAcGFyYW0gc3R1YlZlcnNpb24gdGhlIEpESyB2ZXJzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R1YlZlcnNpb24oU3RyaW5nIHN0dWJWZXJzaW9uKSB7CisgICAgICAgIHRoaXMuc3R1YlZlcnNpb24gPSBzdHViVmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBKREsgdmVyc2lvbiBmb3IgdGhlIGdlbmVyYXRlZCBzdHViIGNvZGUuCisgICAgICogQHJldHVybiBzdHViVmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R1YlZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBzdHViVmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRva2VuIGZpbHRlcmluZyBbb3B0aW9uYWxdLCBkZWZhdWx0PWZhbHNlCisgICAgICogQHBhcmFtIGZpbHRlciB0dXJuIG9uIHRva2VuIGZpbHRlcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcmluZyhib29sZWFuIGZpbHRlcikgeworICAgICAgICB0aGlzLmZpbHRlcmluZyA9IGZpbHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIGlzIHNldAorICAgICAqIEByZXR1cm4gZmlsdGVyaW5nCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RmlsdGVyaW5nKCkgeworICAgICAgICByZXR1cm4gZmlsdGVyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGRlYnVnIGluZm8gKHBhc3NlcyAtZyB0byBybWljKTsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UKKyAgICAgKiBAcGFyYW0gZGVidWcgdHVybiBvbiBkZWJ1ZyBpbmZvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykgeworICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGVidWcgZmxhZy4KKyAgICAgKiBAcmV0dXJuIGRlYnVnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVidWcoKSB7CisgICAgICAgIHJldHVybiBkZWJ1ZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggdGhlIGNsYXNzcGF0aCB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAoY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXN0ZWQgY2xhc3NwYXRoIGVsZW1lbnQuCisgICAgICogQHJldHVybiBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcGlsZUNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0byB0aGUgY2xhc3NwYXRoIGEgcmVmZXJlbmNlIHRvCisgICAgICogYSAmbHQ7cGF0aCZndDsgZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICogQHBhcmFtIHBhdGhSZWYgdGhlIHJlZmVyZW5jZSB0byBhZGQgdG8gdGhlIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcGF0aFJlZikgeworICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChwYXRoUmVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjbGFzc3BhdGguCisgICAgICogQHJldHVybiB0aGUgY2xhc3NwYXRoCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCkgeworICAgICAgICByZXR1cm4gY29tcGlsZUNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGVuYWJsZSB2ZXJpZmljYXRpb24gc28gdGhhdCB0aGUgY2xhc3NlcworICAgICAqIGZvdW5kIGJ5IHRoZSBkaXJlY3RvcnkgbWF0Y2ggYXJlCisgICAgICogY2hlY2tlZCB0byBzZWUgaWYgdGhleSBpbXBsZW1lbnQgamF2YS5ybWkuUmVtb3RlLgorICAgICAqIG9wdGlvbmFsOyBUaGlzIGRlZmF1bHRzIHRvIGZhbHNlIGlmIG5vdCBzZXQuCisgICAgICogQHBhcmFtIHZlcmlmeSB0dXJuIG9uIHZlcmlmaWNhdGlvbiBmb3IgY2xhc3NlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcmlmeShib29sZWFuIHZlcmlmeSkgeworICAgICAgICB0aGlzLnZlcmlmeSA9IHZlcmlmeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdmVyaWZ5IGZsYWcuCisgICAgICogQHJldHVybiB2ZXJpZnkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWZXJpZnkoKSB7CisgICAgICAgIHJldHVybiB2ZXJpZnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgSUlPUCBjb21wYXRpYmxlIHN0dWJzIHNob3VsZAorICAgICAqIGJlIGdlbmVyYXRlZDsgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlCisgICAgICogaWYgbm90IHNldC4KKyAgICAgKiBAcGFyYW0gaWlvcCBnZW5lcmF0ZSBJSU9QIGNvbXBhdGlibGUgc3R1YnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJaW9wKGJvb2xlYW4gaWlvcCkgeworICAgICAgICB0aGlzLmlpb3AgPSBpaW9wOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgaWlvcCBmbGFncy4KKyAgICAgKiBAcmV0dXJuIGlpb3AKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJaW9wKCkgeworICAgICAgICByZXR1cm4gaWlvcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGlpb3AKKyAgICAgKiBAcGFyYW0gaWlvcE9wdHMgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGlpb3AKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJaW9wb3B0cyhTdHJpbmcgaWlvcE9wdHMpIHsKKyAgICAgICAgdGhpcy5paW9wT3B0cyA9IGlpb3BPcHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGlpb3AuCisgICAgICogQHJldHVybiBpaW9wT3B0cworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWlvcG9wdHMoKSB7CisgICAgICAgIHJldHVybiBpaW9wT3B0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBJREwgb3V0cHV0IHNob3VsZCBiZQorICAgICAqIGdlbmVyYXRlZC4gIFRoaXMgZGVmYXVsdHMgdG8gZmFsc2UKKyAgICAgKiBpZiBub3Qgc2V0LgorICAgICAqIEBwYXJhbSBpZGwgZ2VuZXJhdGUgSURMIG91dHB1dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkbChib29sZWFuIGlkbCkgeworICAgICAgICB0aGlzLmlkbCA9IGlkbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIElETCBmbGFncy4KKyAgICAgKiBAcmV0dXJuIHRoZSBpZGwgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldElkbCgpIHsKKyAgICAgICAgcmV0dXJuIGlkbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwYXNzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBJREwgY29tcGlsZQorICAgICAqIEBwYXJhbSBpZGxPcHRzIGFkZGl0aW9uYWwgSURMIGFyZ3VtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkbG9wdHMoU3RyaW5nIGlkbE9wdHMpIHsKKyAgICAgICAgdGhpcy5pZGxPcHRzID0gaWRsT3B0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBpZGwgY29tcGlsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpZGwgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRsb3B0cygpIHsKKyAgICAgICAgcmV0dXJuIGlkbE9wdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBmaWxlIGxpc3QgdG8gY29tcGlsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGNvbXBpbGUuCisgICAgICovCisgICAgcHVibGljIFZlY3RvciBnZXRGaWxlTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBhbnQncyBvd24gY2xhc3NwYXRoIGluIHRoaXMgdGFzaydzCisgICAgICogY2xhc3NwYXRoLgorICAgICAqIE9wdGlvbmFsOyBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqIEBwYXJhbSBpbmNsdWRlIGlmIHRydWUgaW5jbHVkZSBhbnQncyBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlYW50cnVudGltZShib29sZWFuIGluY2x1ZGUpIHsKKyAgICAgICAgaW5jbHVkZUFudFJ1bnRpbWUgPSBpbmNsdWRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciBvciBub3QgdGhlIGFudCBjbGFzc3BhdGggaXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICogdGFzaydzIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW50J3MgY2xhc3NwYXRoIGlzIHRvIGJlIGluY2x1ZGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZWFudHJ1bnRpbWUoKSB7CisgICAgICAgIHJldHVybiBpbmNsdWRlQW50UnVudGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0YXNrJ3MgY2xhc3NwYXRoLgorICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgaW5jbHVkaW5nIHRoZSBkZWZhdWx0IHJ1bi10aW1lCisgICAgICogbGlicmFyaWVzIGZyb20gdGhlIGV4ZWN1dGluZyBWTTsgb3B0aW9uYWwsCisgICAgICogZGVmYXVsdHMgdG8gZmFsc2UKKyAgICAgKiBAcGFyYW0gaW5jbHVkZSBpZiB0cnVlIGluY2x1ZGUgZGVmYXVsdCBydW4tdGltZSBsaWJyYXJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlamF2YXJ1bnRpbWUoYm9vbGVhbiBpbmNsdWRlKSB7CisgICAgICAgIGluY2x1ZGVKYXZhUnVudGltZSA9IGluY2x1ZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIG9yIG5vdCB0aGUgamF2YSBydW50aW1lIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGlzCisgICAgICogdGFzaydzIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZGVmYXVsdCBydW4tdGltZSBsaWJyYXJpZXMgYXJlIGluY2x1ZGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZWphdmFydW50aW1lKCkgeworICAgICAgICByZXR1cm4gaW5jbHVkZUphdmFSdW50aW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGV4dGVuc2lvbiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlCisgICAgICogY29tcGlsYXRpb247IG9wdGlvbmFsLgorICAgICAqIEBwYXJhbSBleHREaXJzIHRoZSBleHRlbnNpb24gZGlyZWN0b3JpZXMgdG8gYmUgdXNlZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFeHRkaXJzKFBhdGggZXh0RGlycykgeworICAgICAgICBpZiAodGhpcy5leHREaXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZXh0RGlycyA9IGV4dERpcnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmV4dERpcnMuYXBwZW5kKGV4dERpcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWF5YmUgY3JlYXRlcyBhIG5lc3RlZCBleHRkaXJzIGVsZW1lbnQuCisgICAgICogQHJldHVybiBwYXRoIG9iamVjdCB0byBiZSBjb25maWd1cmVkIHdpdGggdGhlIGV4dGVuc2lvbiBkaXJlY3RvcmllcworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUGF0aCBjcmVhdGVFeHRkaXJzKCkgeworICAgICAgICBpZiAoZXh0RGlycyA9PSBudWxsKSB7CisgICAgICAgICAgICBleHREaXJzID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXh0RGlycy5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUKKyAgICAgKiBjb21waWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnNpb24gZGlyZWN0b3JpZXMgdG8gYmUgdXNlZAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldEV4dGRpcnMoKSB7CisgICAgICAgIHJldHVybiBleHREaXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBpbGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmVjdG9yIGdldENvbXBpbGVMaXN0KCkgeworICAgICAgICByZXR1cm4gY29tcGlsZUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlOyBvcHRpb25hbCwKKyAgICAgKiBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmJ1aWxkLnJtaWM8L2NvZGU+IHByb3BlcnR5LAorICAgICAqIG9yIGZhaWxpbmcgdGhhdCwgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgVk0KKyAgICAgKiBAcGFyYW0gY29tcGlsZXIgdGhlIGNvbXBpbGVyIGltcGxlbWVudGlvbiB0byB1c2UKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVyKFN0cmluZyBjb21waWxlcikgeworICAgICAgICBpZiAoY29tcGlsZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBmYWNhZGUuc2V0SW1wbGVtZW50YXRpb24oY29tcGlsZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGNvbXBpbGVyCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGlsZXIoKSB7CisgICAgICAgIGZhY2FkZS5zZXRNYWdpY1ZhbHVlKGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYnVpbGQucm1pYyIpKTsKKyAgICAgICAgcmV0dXJuIGZhY2FkZS5nZXRJbXBsZW1lbnRhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIGNvbW1hbmQgbGluZSBhcmd1bWVudAorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCBjcmVhdGVDb21waWxlckFyZygpIHsKKyAgICAgICAgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IGFyZyA9IG5ldyBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQoKTsKKyAgICAgICAgZmFjYWRlLmFkZEltcGxlbWVudGF0aW9uQXJndW1lbnQoYXJnKTsKKyAgICAgICAgcmV0dXJuIGFyZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFkZGl0aW9uYWwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAgKiBAcmV0dXJuIGFycmF5IG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIGd1YXJhbnRlZWQgdG8gYmUgbm9uLW51bGwuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q3VycmVudENvbXBpbGVyQXJncygpIHsKKyAgICAgICAgZ2V0Q29tcGlsZXIoKTsKKyAgICAgICAgcmV0dXJuIGZhY2FkZS5nZXRBcmdzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXhlY3V0ZSBieSBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBhbiBpbXBsZW1lbnRhdGlvbgorICAgICAqIGNsYXNzIGFuZCBnZXR0aW5nIHRvIGRvIHRoZSB3b3JrCisgICAgICogQHRocm93cyBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbgorICAgICAqIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggYmFzZURpciBvciBSTUlDCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChiYXNlRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9CQVNFX05PVF9TRVQsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmICghYmFzZURpci5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX0JBU0VfRVhJU1RTICsgYmFzZURpciwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFiYXNlRGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT1RfQV9ESVIgKyBiYXNlRGlyLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmVyaWZ5KSB7CisgICAgICAgICAgICBsb2coIlZlcmlmeSBoYXMgYmVlbiB0dXJuZWQgb24uIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgUm1pY0FkYXB0ZXIgYWRhcHRlciA9IFJtaWNBZGFwdGVyRmFjdG9yeS5nZXRSbWljKGdldENvbXBpbGVyKCksIHRoaXMpOworCisgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHBvcHVsYXRlIHRoZSBjb21waWxlciBhZGFwdGVyCisgICAgICAgIGFkYXB0ZXIuc2V0Um1pYyh0aGlzKTsKKworICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IGFkYXB0ZXIuZ2V0Q2xhc3NwYXRoKCk7CisgICAgICAgIGxvYWRlciA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjbGFzc3BhdGgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBzY2FuIGJhc2UgZGlycyB0byBidWlsZCB1cCBjb21waWxlIGxpc3RzIG9ubHkgaWYgYQorICAgICAgICAgICAgLy8gc3BlY2lmaWMgY2xhc3NuYW1lIGlzIG5vdCBnaXZlbgorICAgICAgICAgICAgaWYgKGNsYXNzbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHRoaXMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihiYXNlRGlyKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgICAgICBzY2FuRGlyKGJhc2VEaXIsIGZpbGVzLCBhZGFwdGVyLmdldE1hcHBlcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHBlcmZvcm0gYSB0aW1lc3RhbXAgY29tcGFyaXNvbiAtIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjbGFzc25hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmNsYXNzIjsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShiYXNlRGlyLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoZi5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBzY2FuRGlyKGJhc2VEaXIsIG5ldyBTdHJpbmdbXSB7cGF0aH0sIGFkYXB0ZXIuZ2V0TWFwcGVyKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERvZXMgbm90IGV4aXN0LCBzbyBjaGVja2luZyB3aGV0aGVyIGl0IGlzIHVwIHRvIGRhdGUgbWFrZXMgbm8gc2Vuc2UuCisgICAgICAgICAgICAgICAgICAgIC8vIENvbXBpbGF0aW9uIHdpbGwgZmFpbCBsYXRlciBhbnl3YXksIGJ1dCB0ZXN0cyBleHBlY3QgYSBjZXJ0YWluIG91dHB1dC4KKyAgICAgICAgICAgICAgICAgICAgY29tcGlsZUxpc3QuYWRkKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGZpbGVDb3VudCA9IGNvbXBpbGVMaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGlmIChmaWxlQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgbG9nKCJSTUkgQ29tcGlsaW5nICIgKyBmaWxlQ291bnQgKyAiIGNsYXNzIiArIChmaWxlQ291bnQgPiAxID8gImVzIiA6ICIiKSArICIgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBiYXNlRGlyLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICAvLyBmaW5hbGx5LCBsZXRzIGV4ZWN1dGUgdGhlIGNvbXBpbGVyISEKKyAgICAgICAgICAgICAgICBpZiAoIWFkYXB0ZXIuZXhlY3V0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9STUlDX0ZBSUxFRCwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE1vdmUgdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuICBJZgorICAgICAgICAgICAgICogYmFzZSBkaXJlY3RvcnkgYW5kIHNvdXJjZWJhc2UgYXJlIHRoZSBzYW1lLCB0aGUgZ2VuZXJhdGVkCisgICAgICAgICAgICAgKiBzb3VyY2VzIGFyZSBhbHJlYWR5IGluIHBsYWNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobnVsbCAhPSBzb3VyY2VCYXNlICYmICFiYXNlRGlyLmVxdWFscyhzb3VyY2VCYXNlKQorICAgICAgICAgICAgICAgICYmIGZpbGVDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaWRsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiQ2Fubm90IGRldGVybWluZSBzb3VyY2VmaWxlcyBpbiBpZGwgbW9kZSwgIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgIGxvZygic291cmNlYmFzZSBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZUNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVHZW5lcmF0ZWRGaWxlKGJhc2VEaXIsIHNvdXJjZUJhc2UsIChTdHJpbmcpIGNvbXBpbGVMaXN0LmVsZW1lbnRBdChqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjb21waWxlTGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTW92ZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlKHMpIHRvIHRoZSBiYXNlIGRpcmVjdG9yeQorICAgICAqCisgICAgICogQHRocm93cyBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBXaGVuIGVycm9yCisgICAgICogY29weWluZy9yZW1vdmluZyBmaWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbW92ZUdlbmVyYXRlZEZpbGUoRmlsZSBiYXNlRGlyLCBGaWxlIHNvdXJjZUJhc2VGaWxlLCBTdHJpbmcgY2xhc3NuYW1lLAorICAgICAgICAgICAgUm1pY0FkYXB0ZXIgYWRhcHRlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzRmlsZU5hbWUgPSBjbGFzc25hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmNsYXNzIjsKKyAgICAgICAgU3RyaW5nW10gZ2VuZXJhdGVkRmlsZXMgPSBhZGFwdGVyLmdldE1hcHBlcigpLm1hcEZpbGVOYW1lKGNsYXNzRmlsZU5hbWUpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2VuZXJhdGVkRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBnZW5lcmF0ZWRGaWxlID0gZ2VuZXJhdGVkRmlsZXNbaV07CisgICAgICAgICAgICBpZiAoIWdlbmVyYXRlZEZpbGUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoYXQgLSBhIElETCBmaWxlIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAvLyBoYXZlIGEgY29ycmVzcG9uZGluZyBKYXZhIHNvdXJjZSBmb3IgZXhhbXBsZS4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlTmFtZSA9IFN0cmluZ1V0aWxzLnJlbW92ZVN1ZmZpeChnZW5lcmF0ZWRGaWxlLCAiLmNsYXNzIik7CisKKyAgICAgICAgICAgIEZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKGJhc2VEaXIsIHNvdXJjZUZpbGVOYW1lKTsKKyAgICAgICAgICAgIGlmICghb2xkRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIC8vIG5vIHNvdXJjZSBmaWxlIGdlbmVyYXRlZCwgbm90aGluZyB0byBtb3ZlCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKHNvdXJjZUJhc2VGaWxlLCBzb3VyY2VGaWxlTmFtZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5jb3B5RmlsZShvbGRGaWxlLCBuZXdGaWxlLCBuZXcgRmlsdGVyU2V0Q29sbGVjdGlvbihnZXRQcm9qZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0R2xvYmFsRmlsdGVyU2V0KCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmNvcHlGaWxlKG9sZEZpbGUsIG5ld0ZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbGRGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gY29weSAiICsgb2xkRmlsZSArICIgdG8gIiArIG5ld0ZpbGUgKyAiIGR1ZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGlvZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW5zIHRoZSBkaXJlY3RvcnkgbG9va2luZyBmb3IgY2xhc3MgZmlsZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICogVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBpbiB0aGUgY2xhc3MgdmFyaWFibGUgY29tcGlsZUxpc3QuCisgICAgICogQHBhcmFtIGJhc2VEaXIgdGhlIGJhc2UgZGlyZWN0aW9uCisgICAgICogQHBhcmFtIGZpbGVzICAgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gc2NhbgorICAgICAqIEBwYXJhbSBtYXBwZXIgIHRoZSBtYXBwZXIgb2YgZmlsZXMgdG8gdGFyZ2V0IGZpbGVzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2NhbkRpcihGaWxlIGJhc2VEaXIsIFN0cmluZ1tdIGZpbGVzLCBGaWxlTmFtZU1hcHBlciBtYXBwZXIpIHsKKyAgICAgICAgU3RyaW5nW10gbmV3RmlsZXMgPSBmaWxlczsKKyAgICAgICAgaWYgKGlkbCkgeworICAgICAgICAgICAgbG9nKCJ3aWxsIGxlYXZlIHVwdG9kYXRlIHRlc3QgdG8gcm1pYyBpbXBsZW1lbnRhdGlvbiBpbiBpZGwgbW9kZS4iLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9IGVsc2UgaWYgKGlpb3AgJiYgaWlvcE9wdHMgIT0gbnVsbCAmJiBpaW9wT3B0cy5pbmRleE9mKCItYWx3YXlzIikgPiAtMSkgeworICAgICAgICAgICAgbG9nKCJubyB1cHRvZGF0ZSB0ZXN0IGFzIC1hbHdheXMgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgc2ZzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOworICAgICAgICAgICAgbmV3RmlsZXMgPSBzZnMucmVzdHJpY3QoZmlsZXMsIGJhc2VEaXIsIGJhc2VEaXIsIG1hcHBlcik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuZXdGaWxlc1tpXS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSk7CisgICAgICAgICAgICBjb21waWxlTGlzdC5hZGRFbGVtZW50KG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBuYW1lZCBjbGFzcyBhbmQgdGVzdCB3aGV0aGVyIGl0IGNhbiBiZSBybWljJ2VkCisgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgdGVzdGVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGFzcyBjYW4gYmUgcm1pYydlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRSbWlSZW1vdGUoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gbG9hZGVyLmxvYWRDbGFzcyhjbGFzc25hbWUpOworICAgICAgICAgICAgLy8gT25lIGNhbm5vdCBSTUlDIGFuIGludGVyZmFjZSBmb3IgImNsYXNzaWMiIFJNSSAoSlJNUCkKKyAgICAgICAgICAgIGlmICh0ZXN0Q2xhc3MuaXNJbnRlcmZhY2UoKSAmJiAhaWlvcCAmJiAhaWRsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWRSbWlSZW1vdGUodGVzdENsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coRVJST1JfVU5BQkxFX1RPX1ZFUklGWV9DTEFTUyArIGNsYXNzbmFtZSArIEVSUk9SX05PVF9GT1VORCwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKKyAgICAgICAgICAgIGxvZyhFUlJPUl9VTkFCTEVfVE9fVkVSSUZZX0NMQVNTICsgY2xhc3NuYW1lICsgRVJST1JfTk9UX0RFRklORUQsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nKEVSUk9SX1VOQUJMRV9UT19WRVJJRllfQ0xBU1MgKyBjbGFzc25hbWUgKyBFUlJPUl9MT0FESU5HX0NBVVNFRF9FWENFUFRJT04KKyAgICAgICAgICAgICAgICAgICAgKyB0LmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICAgICAgLy8gd2Ugb25seSBnZXQgaGVyZSBpZiBhbiBleGNlcHRpb24gaGFzIGJlZW4gdGhyb3duCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0b3Btb3N0IGludGVyZmFjZSB0aGF0IGV4dGVuZHMgUmVtb3RlIGZvciBhIGdpdmVuCisgICAgICogY2xhc3MgLSBpZiBvbmUgZXhpc3RzLgorICAgICAqIEBwYXJhbSB0ZXN0Q2xhc3MgdGhlIGNsYXNzIHRvIGJlIHRlc3RlZAorICAgICAqIEByZXR1cm4gdGhlIHRvcG1vc3QgaW50ZXJmYWNlIHRoYXQgZXh0ZW5kcyBSZW1vdGUsIG9yIG51bGwgaWYgdGhlcmUKKyAgICAgKiAgICAgICAgIGlzIG5vbmUuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFJlbW90ZUludGVyZmFjZShDbGFzcyB0ZXN0Q2xhc3MpIHsKKyAgICAgICAgaWYgKFJlbW90ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3RDbGFzcykpIHsKKyAgICAgICAgICAgIENsYXNzIFtdIGludGVyZmFjZXMgPSB0ZXN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpOworICAgICAgICAgICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoUmVtb3RlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW50ZXJmYWNlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgY2xhc3Mgb3IgKHN1cGVyKWludGVyZmFjZXMgaW1wbGVtZW50CisgICAgICogamF2YS5ybWkuUmVtb3RlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUm1pUmVtb3RlIChDbGFzcyB0ZXN0Q2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbW90ZUludGVyZmFjZSh0ZXN0Q2xhc3MpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3Nsb2FkZXIgZm9yIHRoZSB1c2VyLXNwZWNpZmllZCBjbGFzc3BhdGguCisgICAgICogQHJldHVybiB0aGUgY2xhc3Nsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0TG9hZGVyKCkgeworICAgICAgICByZXR1cm4gbG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gImNvbXBpbGVyIiBhdHRyaWJ1dGUgdG8gQ29tbWFuZGxpbmUkQXR0cmlidXRlIHVzZWQgdG8KKyAgICAgKiBmaWx0ZXIgY29tbWFuZCBsaW5lIGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IGV4dGVuZHMKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZmFjYWRlLkltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBPbmx5IHBhc3MgdGhlIHNwZWNpZmllZCBhcmd1bWVudCBpZiB0aGUKKyAgICAgICAgICogY2hvc2VuIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIG1hdGNoZXMgdGhlCisgICAgICAgICAqIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLiBMZWdhbCB2YWx1ZXMgYXJlCisgICAgICAgICAqIHRoZSBzYW1lIGFzIHRob3NlIGluIHRoZSBhYm92ZSBsaXN0IG9mCisgICAgICAgICAqIHZhbGlkIGNvbXBpbGVycy4pCisgICAgICAgICAqIEBwYXJhbSBpbXBsIHRoZSBjb21waWxlciB0byBiZSB1c2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGltcGwpIHsKKyAgICAgICAgICAgIHN1cGVyLnNldEltcGxlbWVudGF0aW9uKGltcGwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU1FMRXhlYy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU1FMRXhlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGFjMzIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjLmphdmEKQEAgLTAsMCArMSw3OTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5VbmlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU1FMV2FybmluZzsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGE7CitpbXBvcnQgamF2YS5zcWwuVHlwZXM7CisKKy8qKgorICogRXhlY3V0ZXMgYSBzZXJpZXMgb2YgU1FMIHN0YXRlbWVudHMgb24gYSBkYXRhYmFzZSB1c2luZyBKREJDLgorICoKKyAqIDxwPlN0YXRlbWVudHMgY2FuCisgKiBlaXRoZXIgYmUgcmVhZCBpbiBmcm9tIGEgdGV4dCBmaWxlIHVzaW5nIHRoZSA8aT5zcmM8L2k+IGF0dHJpYnV0ZSBvciBmcm9tCisgKiBiZXR3ZWVuIHRoZSBlbmNsb3NpbmcgU1FMIHRhZ3MuPC9wPgorICoKKyAqIDxwPk11bHRpcGxlIHN0YXRlbWVudHMgY2FuIGJlIHByb3ZpZGVkLCBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyAob3IgdGhlCisgKiBkZWZpbmVkIDxpPmRlbGltaXRlcjwvaT4pLiBJbmRpdmlkdWFsIGxpbmVzIHdpdGhpbiB0aGUgc3RhdGVtZW50cyBjYW4gYmUKKyAqIGNvbW1lbnRlZCB1c2luZyBlaXRoZXIgLS0sIC8vIG9yIFJFTSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuPC9wPgorICoKKyAqIDxwPlRoZSA8aT5hdXRvY29tbWl0PC9pPiBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoZXRoZXIgYXV0by1jb21taXQgc2hvdWxkIGJlCisgKiB0dXJuZWQgb24gb3Igb2ZmIHdoaWxzdCBleGVjdXRpbmcgdGhlIHN0YXRlbWVudHMuIElmIGF1dG8tY29tbWl0IGlzIHR1cm5lZAorICogb24gZWFjaCBzdGF0ZW1lbnQgd2lsbCBiZSBleGVjdXRlZCBhbmQgY29tbWl0dGVkLiBJZiBpdCBpcyB0dXJuZWQgb2ZmIHRoZQorICogc3RhdGVtZW50cyB3aWxsIGFsbCBiZSBleGVjdXRlZCBhcyBvbmUgdHJhbnNhY3Rpb24uPC9wPgorICoKKyAqIDxwPlRoZSA8aT5vbmVycm9yPC9pPiBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0byBwcm9jZWVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzCisgKiBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBvbmUgb2YgdGhlIHN0YXRlbWVudHMuCisgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZTogPGI+Y29udGludWU8L2I+IGV4ZWN1dGlvbiwgb25seSBzaG93IHRoZSBlcnJvcjsKKyAqIDxiPnN0b3A8L2I+IGV4ZWN1dGlvbiBhbmQgY29tbWl0IHRyYW5zYWN0aW9uOworICogYW5kIDxiPmFib3J0PC9iPiBleGVjdXRpb24gYW5kIHRyYW5zYWN0aW9uIGFuZCBmYWlsIHRhc2suPC9wPgorICoKKyAqIEBzaW5jZSBBbnQgMS4yCisgKgorICogQGFudC50YXNrIG5hbWU9InNxbCIgY2F0ZWdvcnk9ImRhdGFiYXNlIgorICovCitwdWJsaWMgY2xhc3MgU1FMRXhlYyBleHRlbmRzIEpEQkNUYXNrIHsKKworICAgIC8qKgorICAgICAqIGRlbGltaXRlcnMgd2Ugc3VwcG9ydCwgIm5vcm1hbCIgYW5kICJyb3ciCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWxpbWl0ZXJUeXBlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKiBUaGUgZW51bWVyYXRlZCBzdHJpbmdzICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTCA9ICJub3JtYWwiLCBST1cgPSAicm93IjsKKyAgICAgICAgLyoqIEByZXR1cm4gdGhlIGVudW1lcmF0ZWQgc3RyaW5ncyAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7Tk9STUFMLCBST1d9OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ29vZFNxbCA9IDA7CisKKyAgICBwcml2YXRlIGludCB0b3RhbFNxbCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworCisgICAgLyoqCisgICAgICogZmlsZXMgdG8gbG9hZAorICAgICAqLworICAgIHByaXZhdGUgVW5pb24gcmVzb3VyY2VzOworCisgICAgLyoqCisgICAgICogU1FMIHN0YXRlbWVudAorICAgICAqLworICAgIHByaXZhdGUgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTUUwgaW5wdXQgZmlsZQorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBzcmNGaWxlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNRTCBpbnB1dCBjb21tYW5kCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3FsQ29tbWFuZCA9ICIiOworCisgICAgLyoqCisgICAgICogU1FMIHRyYW5zYWN0aW9ucyB0byBwZXJmb3JtCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3IgdHJhbnNhY3Rpb25zID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogU1FMIFN0YXRlbWVudCBkZWxpbWl0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZWxpbWl0ZXIgPSAiOyI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVsaW1pdGVyIHR5cGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkZWxpbWl0ZXIgd2lsbAorICAgICAqIG9ubHkgYmUgcmVjb2duaXplZCBvbiBhIGxpbmUgYnkgaXRzZWxmCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVsaW1pdGVyVHlwZSA9IERlbGltaXRlclR5cGUuTk9STUFMOworCisgICAgLyoqCisgICAgICogUHJpbnQgU1FMIHJlc3VsdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHByaW50ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBQcmludCBoZWFkZXIgY29sdW1ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvd2hlYWRlcnMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogUHJpbnQgU1FMIHN0YXRzIChyb3dzIGFmZmVjdGVkKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzaG93dHJhaWxlcnMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogUmVzdWx0cyBPdXRwdXQgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQWN0aW9uIHRvIHBlcmZvcm0gaWYgYW4gZXJyb3IgaXMgZm91bmQKKyAgICAgKiovCisgICAgcHJpdmF0ZSBTdHJpbmcgb25FcnJvciA9ICJhYm9ydCI7CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZyB0byB1c2Ugd2hlbiByZWFkaW5nIFNRTCBzdGF0ZW1lbnRzIGZyb20gYSBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworCisgICAgLyoqCisgICAgICogQXBwZW5kIHRvIGFuIGV4aXN0aW5nIGZpbGUgb3Igb3ZlcndyaXRlIGl0PworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhcHBlbmQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEtlZXAgdGhlIGZvcm1hdCBvZiBhIHNxbCBibG9jaz8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4ga2VlcGZvcm1hdCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQXJndW1lbnQgdG8gU3RhdGVtZW50LnNldEVzY2FwZVByb2Nlc3NpbmcKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGVzY2FwZVByb2Nlc3NpbmcgPSB0cnVlOworCisgICAgLyoqCisgICAgICogc2hvdWxkIHByb3BlcnRpZXMgYmUgZXhwYW5kZWQgaW4gdGV4dD8KKyAgICAgKiBmYWxzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGV4cGFuZFByb3BlcnRpZXMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogc2hvdWxkIHdlIHByaW50IHJhdyBCTE9CIGRhdGE/CisgICAgICogQHNpbmNlIEFudCAxLjcuMQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByYXdCbG9iczsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgU1FMIGZpbGUgdG8gYmUgcnVuLgorICAgICAqIFJlcXVpcmVkIHVubGVzcyBzdGF0ZW1lbnRzIGFyZSBlbmNsb3NlZCBpbiB0aGUgYnVpbGQgZmlsZQorICAgICAqIEBwYXJhbSBzcmNGaWxlIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIFNRTCBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIHNyY0ZpbGUpIHsKKyAgICAgICAgdGhpcy5zcmNGaWxlID0gc3JjRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgcHJvcGVydHkgZXhwYW5zaW9uIGluc2lkZSBuZXN0ZWQgdGV4dAorICAgICAqCisgICAgICogQHBhcmFtIGV4cGFuZFByb3BlcnRpZXMgaWYgdHJ1ZSBleHBhbmQgcHJvcGVydGllcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4cGFuZFByb3BlcnRpZXMoYm9vbGVhbiBleHBhbmRQcm9wZXJ0aWVzKSB7CisgICAgICAgIHRoaXMuZXhwYW5kUHJvcGVydGllcyA9IGV4cGFuZFByb3BlcnRpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogaXMgcHJvcGVydHkgZXhwYW5zaW9uIGluc2lkZSBpbmxpbmUgdGV4dCBlbmFibGVkPworICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHByb3BlcnRpZXMgYXJlIHRvIGJlIGV4cGFuZGVkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RXhwYW5kUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIGV4cGFuZFByb3BlcnRpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFuIGlubGluZSBTUUwgY29tbWFuZCB0byBleGVjdXRlLgorICAgICAqIE5COiBQcm9wZXJ0aWVzIGFyZSBub3QgZXhwYW5kZWQgaW4gdGhpcyB0ZXh0IHVubGVzcyB7QGxpbmsgI2V4cGFuZFByb3BlcnRpZXN9CisgICAgICogaXMgc2V0LgorICAgICAqIEBwYXJhbSBzcWwgYW4gaW5saW5lIHN0cmluZyBjb250YWluaW5nIHRoZSBTUUwgY29tbWFuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyBzcWwpIHsKKyAgICAgICAgLy90aGVyZSBpcyBubyBuZWVkIHRvIGV4cGFuZCBwcm9wZXJ0aWVzIGhlcmUgYXMgdGhhdCBoYXBwZW5zIHdoZW4gVHJhbnNhY3Rpb24uYWRkVGV4dCBpcworICAgICAgICAvL2NhbGxlZDsgdG8gZG8gc28gaGVyZSB3b3VsZCBiZSBhbiBlcnJvci4KKyAgICAgICAgdGhpcy5zcWxDb21tYW5kICs9IHNxbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLgorICAgICAqIEBwYXJhbSBzZXQgYSBzZXQgb2YgZmlsZXMgY29udGFpbnMgU1FMIGNvbW1hbmRzLCBlYWNoIEZpbGUgaXMgcnVuIGluCisgICAgICogICAgICAgICAgICBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKKyAgICAgICAgYWRkKHNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIChuZXN0ZWQgZWxlbWVudCkuCisgICAgICogQHBhcmFtIHJjIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgY29udGFpbmluZyBTUUwgY29tbWFuZHMsCisgICAgICogZWFjaCByZXNvdXJjZSBpcyBydW4gaW4gYSBzZXBhcmF0ZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgaWYgKHJjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBudWxsIFJlc291cmNlQ29sbGVjdGlvbiIpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gbmV3IFVuaW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VzLmFkZChyYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgU1FMIHRyYW5zYWN0aW9uIHRvIGV4ZWN1dGUKKyAgICAgKiBAcmV0dXJuIGEgVHJhbnNhY3Rpb24gdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHJhbnNhY3Rpb24gY3JlYXRlVHJhbnNhY3Rpb24oKSB7CisgICAgICAgIFRyYW5zYWN0aW9uIHQgPSBuZXcgVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgdHJhbnNhY3Rpb25zLmFkZEVsZW1lbnQodCk7CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmlsZSBlbmNvZGluZyB0byB1c2Ugb24gdGhlIFNRTCBmaWxlcyByZWFkIGluCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGVuY29kaW5nIHRvIHVzZSBvbiB0aGUgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVsaW1pdGVyIHRoYXQgc2VwYXJhdGVzIFNRTCBzdGF0ZW1lbnRzLiBEZWZhdWx0cyB0byAmcXVvdDs7JnF1b3Q7OworICAgICAqIG9wdGlvbmFsCisgICAgICoKKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgc2V0IHRoaXMgdG8gImdvIiBhbmQgZGVsaW1pdGVydHlwZSB0byAiUk9XIiBmb3IKKyAgICAgKiBTeWJhc2UgQVNFIG9yIE1TIFNRTCBTZXJ2ZXIuPC9wPgorICAgICAqIEBwYXJhbSBkZWxpbWl0ZXIgdGhlIHNlcGFyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgeworICAgICAgICB0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlbGltaXRlciB0eXBlOiAibm9ybWFsIiBvciAicm93IiAoZGVmYXVsdCAibm9ybWFsIikuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZGVsaW1pdGVyIHR5cGUgdGFrZXMgdHdvIHZhbHVlcyAtIG5vcm1hbCBhbmQgcm93LiBOb3JtYWwKKyAgICAgKiBtZWFucyB0aGF0IGFueSBvY2N1cnJlbmNlIG9mIHRoZSBkZWxpbWl0ZXIgdGVybWluYXRlIHRoZSBTUUwKKyAgICAgKiBjb21tYW5kIHdoZXJlYXMgd2l0aCByb3csIG9ubHkgYSBsaW5lIGNvbnRhaW5pbmcganVzdCB0aGUKKyAgICAgKiBkZWxpbWl0ZXIgaXMgcmVjb2duaXplZCBhcyB0aGUgZW5kIG9mIHRoZSBjb21tYW5kLjwvcD4KKyAgICAgKiBAcGFyYW0gZGVsaW1pdGVyVHlwZSB0aGUgdHlwZSBvZiBkZWxpbWl0ZXIgLSAibm9ybWFsIiBvciAicm93Ii4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWxpbWl0ZXJUeXBlKERlbGltaXRlclR5cGUgZGVsaW1pdGVyVHlwZSkgeworICAgICAgICB0aGlzLmRlbGltaXRlclR5cGUgPSBkZWxpbWl0ZXJUeXBlLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgcmVzdWx0IHNldHMgZnJvbSB0aGUgc3RhdGVtZW50czsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQorICAgICAqIEBwYXJhbSBwcmludCBpZiB0cnVlIHByaW50IHJlc3VsdCBzZXRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW50KGJvb2xlYW4gcHJpbnQpIHsKKyAgICAgICAgdGhpcy5wcmludCA9IHByaW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGhlYWRlcnMgZm9yIHJlc3VsdCBzZXRzIGZyb20gdGhlCisgICAgICogc3RhdGVtZW50czsgb3B0aW9uYWwsIGRlZmF1bHQgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gc2hvd2hlYWRlcnMgaWYgdHJ1ZSBwcmludCBoZWFkZXJzIG9mIHJlc3VsdCBzZXRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3doZWFkZXJzKGJvb2xlYW4gc2hvd2hlYWRlcnMpIHsKKyAgICAgICAgdGhpcy5zaG93aGVhZGVycyA9IHNob3doZWFkZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IHRyYWlsaW5nIGluZm8gKHJvd3MgYWZmZWN0ZWQpIGZvciB0aGUgU1FMCisgICAgICogQWRkcmVzc2VzIEJ1Zy9SZXF1ZXN0ICMyNzQ0NgorICAgICAqIEBwYXJhbSBzaG93dHJhaWxlcnMgaWYgdHJ1ZSBwcmludHMgdGhlIFNRTCByb3dzIGFmZmVjdGVkCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93dHJhaWxlcnMoYm9vbGVhbiBzaG93dHJhaWxlcnMpIHsKKyAgICAgICAgdGhpcy5zaG93dHJhaWxlcnMgPSBzaG93dHJhaWxlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgZmlsZTsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIEFudCBsb2cuCisgICAgICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IGZpbGUgdG8gdXNlIGZvciBsb2dnaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChGaWxlIG91dHB1dCkgeworICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3aGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlCisgICAgICogYW4gZXhpc3RpbmcgZmlsZS4gIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKiBAcGFyYW0gYXBwZW5kIGlmIHRydWUgYXBwZW5kIHRvIGFuIGV4aXN0aW5nIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwZW5kKGJvb2xlYW4gYXBwZW5kKSB7CisgICAgICAgIHRoaXMuYXBwZW5kID0gYXBwZW5kOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWN0aW9uIHRvIHBlcmZvcm0gd2hlbiBzdGF0ZW1lbnQgZmFpbHM6IGNvbnRpbnVlLCBzdG9wLCBvciBhYm9ydAorICAgICAqIG9wdGlvbmFsOyBkZWZhdWx0ICZxdW90O2Fib3J0JnF1b3Q7CisgICAgICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIHBlcmZvcm0gb24gc3RhdGVtZW50IGZhaWx1cmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25lcnJvcihPbkVycm9yIGFjdGlvbikgeworICAgICAgICB0aGlzLm9uRXJyb3IgPSBhY3Rpb24uZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3aGV0aGVyIG9yIG5vdCBmb3JtYXQgc2hvdWxkIGJlIHByZXNlcnZlZC4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZWVwZm9ybWF0IFRoZSBrZWVwZm9ybWF0IHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBmb3JtYXQoYm9vbGVhbiBrZWVwZm9ybWF0KSB7CisgICAgICAgIHRoaXMua2VlcGZvcm1hdCA9IGtlZXBmb3JtYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGVzY2FwZSBwcm9jZXNzaW5nIGZvciBzdGF0ZW1lbnRzLgorICAgICAqIEBwYXJhbSBlbmFibGUgaWYgdHJ1ZSBlbmFibGUgZXNjYXBlIHByb2Nlc3NpbmcsIGRlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVzY2FwZVByb2Nlc3NpbmcoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgZXNjYXBlUHJvY2Vzc2luZyA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBwcmludCByYXcgQkxPQnMgcmF0aGVyIHRoYW4gdGhlaXIgc3RyaW5nIChoZXgpIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgKiBAcGFyYW0gcmF3QmxvYnMgd2hldGhlciB0byBwcmludCByYXcgQkxPQnMuCisgICAgICogQHNpbmNlIEFudCAxLjcuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJhd0Jsb2JzKGJvb2xlYW4gcmF3QmxvYnMpIHsKKyAgICAgICAgdGhpcy5yYXdCbG9icyA9IHJhd0Jsb2JzOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIHNxbCBmaWxlIGFuZCB0aGVuIGV4ZWN1dGUgaXQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBWZWN0b3Igc2F2ZWRUcmFuc2FjdGlvbiA9IChWZWN0b3IpIHRyYW5zYWN0aW9ucy5jbG9uZSgpOworICAgICAgICBTdHJpbmcgc2F2ZWRTcWxDb21tYW5kID0gc3FsQ29tbWFuZDsKKworICAgICAgICBzcWxDb21tYW5kID0gc3FsQ29tbWFuZC50cmltKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzcmNGaWxlID09IG51bGwgJiYgc3FsQ29tbWFuZC5sZW5ndGgoKSA9PSAwICYmIHJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNvdXJjZSBmaWxlIG9yIHJlc291cmNlIGNvbGxlY3Rpb24sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRyYW5zYWN0aW9ucyBvciBzcWwgc3RhdGVtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm11c3QgYmUgc2V0ISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNyY0ZpbGUgIT0gbnVsbCAmJiAhc3JjRmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU291cmNlIGZpbGUgIiArIHNyY0ZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBmaWxlISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBkZWFsIHdpdGggdGhlIHJlc291cmNlcworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UgciA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgYSB0cmFuc2FjdGlvbiBmb3IgZWFjaCByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbiB0ID0gY3JlYXRlVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgdC5zZXRTcmNSZXNvdXJjZShyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1ha2UgYSB0cmFuc2FjdGlvbiBncm91cCBmb3IgdGhlIG91dGVyIGNvbW1hbmQKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uIHQgPSBjcmVhdGVUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgdC5zZXRTcmMoc3JjRmlsZSk7CisgICAgICAgICAgICB0LmFkZFRleHQoc3FsQ29tbWFuZCk7CisgICAgICAgICAgICBjb25uID0gZ2V0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkUmRibXMoY29ubikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICAgICAgICAgICAgc3RhdGVtZW50LnNldEVzY2FwZVByb2Nlc3NpbmcoZXNjYXBlUHJvY2Vzc2luZyk7CisKKyAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBTeXN0ZW0ub3V0OworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJPcGVuaW5nIFByaW50U3RyZWFtIHRvIG91dHB1dCBmaWxlICIgKyBvdXRwdXQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0LmdldEFic29sdXRlUGF0aCgpLCBhcHBlbmQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGFsbCB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gdHJhbnNhY3Rpb25zLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgKChUcmFuc2FjdGlvbikgZS5uZXh0RWxlbWVudCgpKS5ydW5UcmFuc2FjdGlvbihvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F1dG9jb21taXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ29tbWl0dGluZyB0cmFuc2FjdGlvbiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uY29tbWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2xvc2VRdWlldGx5KCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjbG9zZVF1aWV0bHkoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvZyhnb29kU3FsICsgIiBvZiAiICsgdG90YWxTcWwgKyAiIFNRTCBzdGF0ZW1lbnRzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJhbnNhY3Rpb25zID0gc2F2ZWRUcmFuc2FjdGlvbjsKKyAgICAgICAgICAgIHNxbENvbW1hbmQgPSBzYXZlZFNxbENvbW1hbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkIGluIGxpbmVzIGFuZCBleGVjdXRlIHRoZW0KKyAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgY29udGFpbnMgc3FsIGxpbmVzLgorICAgICAqIEBwYXJhbSBvdXQgdGhlIHBsYWNlIHRvIG91dHB1dCByZXN1bHRzLgorICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIG9uIHNxbCBwcm9ibGVtcworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gaW8gcHJvYmxlbXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBydW5TdGF0ZW1lbnRzKFJlYWRlciByZWFkZXIsIFByaW50U3RyZWFtIG91dCkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWZmZXIgc3FsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgbGluZTsKKworICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOworCisgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgha2VlcGZvcm1hdCkgeworICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChleHBhbmRQcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IGdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcyhsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgha2VlcGZvcm1hdCkgeworICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIi8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIi0tIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJSRU0iLmVxdWFsc0lnbm9yZUNhc2UodG9rZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3FsLmFwcGVuZChrZWVwZm9ybWF0ID8gIlxuIiA6ICIgIikuYXBwZW5kKGxpbmUpOworCisgICAgICAgICAgICAvLyBTUUwgZGVmaW5lcyAiLS0iIGFzIGEgY29tbWVudCB0byBFT0wKKyAgICAgICAgICAgIC8vIGFuZCBpbiBPcmFjbGUgaXQgbWF5IGNvbnRhaW4gYSBoaW50CisgICAgICAgICAgICAvLyBzbyB3ZSBjYW5ub3QganVzdCByZW1vdmUgaXQsIGluc3RlYWQgd2UgbXVzdCBlbmQgaXQKKyAgICAgICAgICAgIGlmICgha2VlcGZvcm1hdCAmJiBsaW5lLmluZGV4T2YoIi0tIikgPj0gMCkgeworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGRlbGltaXRlclR5cGUuZXF1YWxzKERlbGltaXRlclR5cGUuTk9STUFMKSAmJiBTdHJpbmdVdGlscy5lbmRzV2l0aChzcWwsIGRlbGltaXRlcikpCisgICAgICAgICAgICAgICAgICAgIHx8IChkZWxpbWl0ZXJUeXBlLmVxdWFscyhEZWxpbWl0ZXJUeXBlLlJPVykgJiYgbGluZS5lcXVhbHMoZGVsaW1pdGVyKSkpIHsKKyAgICAgICAgICAgICAgICBleGVjU1FMKHNxbC5zdWJzdHJpbmcoMCwgc3FsLmxlbmd0aCgpIC0gZGVsaW1pdGVyLmxlbmd0aCgpKSwgb3V0KTsKKyAgICAgICAgICAgICAgICBzcWwucmVwbGFjZSgwLCBzcWwubGVuZ3RoKCksICIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDYXRjaCBhbnkgc3RhdGVtZW50cyBub3QgZm9sbG93ZWQgYnkgOworICAgICAgICBpZiAoc3FsLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgZXhlY1NRTChzcWwudG9TdHJpbmcoKSwgb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWMgdGhlIHNxbCBzdGF0ZW1lbnQuCisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB0byBleGVjdXRlCisgICAgICogQHBhcmFtIG91dCB0aGUgcGxhY2UgdG8gcHV0IG91dHB1dAorICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIG9uIFNRTCBwcm9ibGVtcworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWNTUUwoU3RyaW5nIHNxbCwgUHJpbnRTdHJlYW0gb3V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQ2hlY2sgYW5kIGlnbm9yZSBlbXB0eSBzdGF0ZW1lbnRzCisgICAgICAgIGlmICgiIi5lcXVhbHMoc3FsLnRyaW0oKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFJlc3VsdFNldCByZXN1bHRTZXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG90YWxTcWwrKzsKKyAgICAgICAgICAgIGxvZygiU1FMOiAiICsgc3FsLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgYm9vbGVhbiByZXQ7CisgICAgICAgICAgICBpbnQgdXBkYXRlQ291bnQgPSAwLCB1cGRhdGVDb3VudFRvdGFsID0gMDsKKworICAgICAgICAgICAgcmV0ID0gc3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKKyAgICAgICAgICAgIHVwZGF0ZUNvdW50ID0gc3RhdGVtZW50LmdldFVwZGF0ZUNvdW50KCk7CisgICAgICAgICAgICByZXN1bHRTZXQgPSBzdGF0ZW1lbnQuZ2V0UmVzdWx0U2V0KCk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUNvdW50ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb3VudFRvdGFsICs9IHVwZGF0ZUNvdW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmludCkgeworICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdHMocmVzdWx0U2V0LCBvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQgPSBzdGF0ZW1lbnQuZ2V0TW9yZVJlc3VsdHMoKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvdW50ID0gc3RhdGVtZW50LmdldFVwZGF0ZUNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFNldCA9IHN0YXRlbWVudC5nZXRSZXN1bHRTZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChyZXQpOworCisgICAgICAgICAgICBsb2codXBkYXRlQ291bnRUb3RhbCArICIgcm93cyBhZmZlY3RlZCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgICAgICBpZiAocHJpbnQgJiYgc2hvd3RyYWlsZXJzKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4odXBkYXRlQ291bnRUb3RhbCArICIgcm93cyBhZmZlY3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU1FMV2FybmluZyB3YXJuaW5nID0gY29ubi5nZXRXYXJuaW5ncygpOworICAgICAgICAgICAgd2hpbGUgKHdhcm5pbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZyh3YXJuaW5nICsgIiBzcWwgd2FybmluZyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIHdhcm5pbmcgPSB3YXJuaW5nLmdldE5leHRXYXJuaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25uLmNsZWFyV2FybmluZ3MoKTsKKyAgICAgICAgICAgIGdvb2RTcWwrKzsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzcWwsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICBpZiAoIW9uRXJyb3IuZXF1YWxzKCJjb250aW51ZSIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocmVzdWx0U2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRTZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHByaW50IGFueSByZXN1bHRzIGluIHRoZSBzdGF0ZW1lbnQKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KKyAgICAgKiAgICAgICAgICAgICBVc2Uge0BsaW5rICNwcmludFJlc3VsdHMoamF2YS5zcWwuUmVzdWx0U2V0LCBqYXZhLmlvLlByaW50U3RyZWFtKQorICAgICAqICAgICAgICAgICAgIHRoZSB0d28gYXJnIHZlcnNpb259IGluc3RlYWQuCisgICAgICogQHBhcmFtIG91dCB0aGUgcGxhY2UgdG8gcHJpbnQgcmVzdWx0cworICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIG9uIFNRTCBwcm9ibGVtcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFJlc3VsdHMoUHJpbnRTdHJlYW0gb3V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gc3RhdGVtZW50LmdldFJlc3VsdFNldCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJpbnRSZXN1bHRzKHJzLCBvdXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgYW55IHJlc3VsdHMgaW4gdGhlIHJlc3VsdCBzZXQuCisgICAgICogQHBhcmFtIHJzIHRoZSByZXN1bHRzZXQgdG8gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBwbGFjZSB0byBwcmludCByZXN1bHRzCisgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gb24gU1FMIHByb2JsZW1zLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFJlc3VsdHMoUmVzdWx0U2V0IHJzLCBQcmludFN0cmVhbSBvdXQpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJQcm9jZXNzaW5nIG5ldyByZXN1bHQgc2V0LiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgUmVzdWx0U2V0TWV0YURhdGEgbWQgPSBycy5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gbWQuZ2V0Q29sdW1uQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChjb2x1bW5Db3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2hvd2hlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KG1kLmdldENvbHVtbk5hbWUoMSkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAyOyBjb2wgPD0gY29sdW1uQ291bnQ7IGNvbCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCcsJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KG1kLmdldENvbHVtbk5hbWUoY29sKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludFZhbHVlKHJzLCAxLCBvdXQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAyOyBjb2wgPD0gY29sdW1uQ291bnQ7IGNvbCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50VmFsdWUocnMsIGNvbCwgb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFZhbHVlKFJlc3VsdFNldCBycywgaW50IGNvbCwgUHJpbnRTdHJlYW0gb3V0KQorICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyYXdCbG9icyAmJiBycy5nZXRNZXRhRGF0YSgpLmdldENvbHVtblR5cGUoY29sKSA9PSBUeXBlcy5CTE9CKSB7CisgICAgICAgICAgICBuZXcgU3RyZWFtUHVtcGVyKHJzLmdldEJsb2IoY29sKS5nZXRCaW5hcnlTdHJlYW0oKSwgb3V0KS5ydW4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludChycy5nZXRTdHJpbmcoY29sKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENsb3NlcyBhbiB1bnVzZWQgY29ubmVjdGlvbiBhZnRlciBhbiBlcnJvciBhbmQgZG9lc24ndCByZXRocm93CisgICAgICogYSBwb3NzaWJsZSBTUUxFeGNlcHRpb24KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbG9zZVF1aWV0bHkoKSB7CisgICAgICAgIGlmICghaXNBdXRvY29tbWl0KCkgJiYgY29ubiAhPSBudWxsICYmIG9uRXJyb3IuZXF1YWxzKCJhYm9ydCIpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4ucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFjdGlvbiBhIHRhc2sgc2hvdWxkIHBlcmZvcm0gb24gYW4gZXJyb3IsCisgICAgICogb25lIG9mICJjb250aW51ZSIsICJzdG9wIiBhbmQgImFib3J0IgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT25FcnJvciBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKiogQHJldHVybiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJjb250aW51ZSIsICJzdG9wIiwgImFib3J0In07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIG5ldyB0cmFuc2FjdGlvbiBlbGVtZW50LgorICAgICAqIFRyYW5zYWN0aW9ucyBhbGxvdyBzZXZlcmFsIGZpbGVzIG9yIGJsb2NrcyBvZiBzdGF0ZW1lbnRzCisgICAgICogdG8gYmUgZXhlY3V0ZWQgdXNpbmcgdGhlIHNhbWUgSkRCQyBjb25uZWN0aW9uIGFuZCBjb21taXQKKyAgICAgKiBvcGVyYXRpb24gaW4gYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb24geworICAgICAgICBwcml2YXRlIFJlc291cmNlIHRTcmNSZXNvdXJjZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRTcWxDb21tYW5kID0gIiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgc291cmNlIGZpbGUgYXR0cmlidXRlLgorICAgICAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgZmlsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgc3JjKSB7CisgICAgICAgICAgICAvL3RoZXJlIGFyZSBwbGFjZXMgKGluIHRoaXMgZmlsZSwgYW5kIHBlcmhhcHMgZWxzZXdoZXJlLCB3aGVyZSBpdCBpcyBhc3N1bWVkCisgICAgICAgICAgICAvL3RoYXQgbnVsbCBpcyBhbiBhY2NlcHRhYmxlIHBhcmFtZXRlci4KKyAgICAgICAgICAgIGlmIChzcmMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldFNyY1Jlc291cmNlKG5ldyBGaWxlUmVzb3VyY2Uoc3JjKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBzb3VyY2UgcmVzb3VyY2UgYXR0cmlidXRlLgorICAgICAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgZmlsZQorICAgICAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3JjUmVzb3VyY2UoUmVzb3VyY2Ugc3JjKSB7CisgICAgICAgICAgICBpZiAodFNyY1Jlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm9ubHkgb25lIHJlc291cmNlIHBlciB0cmFuc2FjdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdFNyY1Jlc291cmNlID0gc3JjOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBpbmxpbmUgdGV4dAorICAgICAgICAgKiBAcGFyYW0gc3FsIHRoZSBpbmxpbmUgdGV4dAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgc3FsKSB7CisgICAgICAgICAgICBpZiAoc3FsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRTcWxDb21tYW5kICs9IHNxbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHNvdXJjZSByZXNvdXJjZS4KKyAgICAgICAgICogQHBhcmFtIGEgdGhlIHNvdXJjZSByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChSZXNvdXJjZUNvbGxlY3Rpb24gYSkgeworICAgICAgICAgICAgaWYgKGEuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm9ubHkgc2luZ2xlIGFyZ3VtZW50IHJlc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29sbGVjdGlvbnMgYXJlIHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFNyY1Jlc291cmNlKChSZXNvdXJjZSkgYS5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBydW5UcmFuc2FjdGlvbihQcmludFN0cmVhbSBvdXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAodFNxbENvbW1hbmQubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGxvZygiRXhlY3V0aW5nIGNvbW1hbmRzIiwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgcnVuU3RhdGVtZW50cyhuZXcgU3RyaW5nUmVhZGVyKHRTcWxDb21tYW5kKSwgb3V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRTcmNSZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJFeGVjdXRpbmcgcmVzb3VyY2U6ICIgKyB0U3JjUmVzb3VyY2UudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzID0gdFNyY1Jlc291cmNlLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IChlbmNvZGluZyA9PSBudWxsKSA/IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgICAgIHJ1blN0YXRlbWVudHMocmVhZGVyLCBvdXQpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpcyk7CisgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShyZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NlbmRFbWFpbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2VuZEVtYWlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkNWNkYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NlbmRFbWFpbC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsVGFzazsKKworLyoqCisgKiBBIHRhc2sgdG8gc2VuZCBTTVRQIGVtYWlsLgorICogVGhpcyB0YXNrIGNhbiBzZW5kIG1haWwgdXNpbmcgZWl0aGVyIHBsYWluCisgKiB0ZXh0LCBVVSBlbmNvZGluZyBvciBNaW1lIGZvcm1hdCBtYWlsIGRlcGVuZGluZyBvbiB3aGF0IGlzIGF2YWlsYWJsZS4KKyAqIEF0dGFjaG1lbnRzIG1heSBiZSBzZW50IHVzaW5nIG5lc3RlZCBGaWxlU2V0CisgKiBlbGVtZW50cy4KKyAqCisgKiBAc2luY2UgQW50IDEuMgorICoKKyAqIEBhbnQudGFzayBuYW1lPSJtYWlsIiBjYXRlZ29yeT0ibmV0d29yayIKKyAqLworcHVibGljIGNsYXNzIFNlbmRFbWFpbCBleHRlbmRzIEVtYWlsVGFzayB7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWFpbHBvcnQgcGFyYW1ldGVyIG9mIHRoaXMgYnVpbGQgdGFzay4KKyAgICAgKiBAcGFyYW0gdmFsdWUgbWFpbCBwb3J0IG5hbWUuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KKyAgICAgKiAgICAgICAgICAgICBVc2Uge0BsaW5rICNzZXRNYWlscG9ydChpbnQpfSBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1haWxwb3J0KEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgc2V0TWFpbHBvcnQodmFsdWUuaW50VmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2VxdWVudGlhbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2VxdWVudGlhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjY0MWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TZXF1ZW50aWFsLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFza0NvbnRhaW5lcjsKKworLyoqCisgKiBTZXF1ZW50aWFsIGlzIGEgY29udGFpbmVyIHRhc2sgLSBpdCBjYW4gY29udGFpbiBvdGhlciBBbnQgdGFza3MuIFRoZSBuZXN0ZWQKKyAqIHRhc2tzIGFyZSBzaW1wbHkgZXhlY3V0ZWQgaW4gc2VxdWVuY2UuIFNlcXVlbnRpYWwncyBwcmltYXJ5IHVzZSBpcyB0byBzdXBwb3J0CisgKiB0aGUgc2VxdWVudGlhbCBleGVjdXRpb24gb2YgYSBzdWJzZXQgb2YgdGFza3Mgd2l0aGluIHRoZSB7QGxpbmsgUGFyYWxsZWwgUGFyYWxsZWwgVGFza30KKworICogPHA+CisgKiBUaGUgc2VxdWVudGlhbCB0YXNrIGhhcyBubyBhdHRyaWJ1dGVzIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFueSBuZXN0ZWQKKyAqIGVsZW1lbnRzIGFwYXJ0IGZyb20gQW50IHRhc2tzLiBBbnkgdmFsaWQgQW50IHRhc2sgbWF5IGJlIGVtYmVkZGVkIHdpdGhpbiB0aGUKKyAqIHNlcXVlbnRpYWwgdGFzay48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjQKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iY29udHJvbCIKKyAqLworcHVibGljIGNsYXNzIFNlcXVlbnRpYWwgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7CisKKyAgICAvKiogT3B0aW9uYWwgVmVjdG9yIGhvbGRpbmcgdGhlIG5lc3RlZCB0YXNrcyAqLworICAgIHByaXZhdGUgVmVjdG9yIG5lc3RlZFRhc2tzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbmVzdGVkIHRhc2sgdG8gU2VxdWVudGlhbC4KKyAgICAgKiA8cD4KKyAgICAgKiBAcGFyYW0gbmVzdGVkVGFzayAgTmVzdGVkIHRhc2sgdG8gZXhlY3V0ZSBTZXF1ZW50aWFsCisgICAgICogPHA+CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrIG5lc3RlZFRhc2spIHsKKyAgICAgICAgbmVzdGVkVGFza3MuYWRkRWxlbWVudChuZXN0ZWRUYXNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGFsbCBuZXN0ZWRUYXNrcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgb25lIG9mIHRoZSBuZXN0ZWQgdGFza3MgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5lc3RlZFRhc2tzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgVGFzayBuZXN0ZWRUYXNrID0gKFRhc2spIGkubmV4dCgpOworICAgICAgICAgICAgbmVzdGVkVGFzay5wZXJmb3JtKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TaWduSmFyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TaWduSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzMGI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NpZ25KYXIuamF2YQpAQCAtMCwwICsxLDUwMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSXNTaWduZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSWRlbnRpdHlNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKKworLyoqCisgKiBTaWducyBKQVIgb3IgWklQIGZpbGVzIHdpdGggdGhlIGphdmFzaWduIGNvbW1hbmQgbGluZSB0b29sLiBUaGUgdG9vbCBkZXRhaWxlZAorICogZGVwZW5kZW5jeSBjaGVja2luZzogZmlsZXMgYXJlIG9ubHkgc2lnbmVkIGlmIHRoZXkgYXJlIG5vdCBzaWduZWQuIFRoZQorICogPHR0PnNpZ25qYXI8L3R0PiBhdHRyaWJ1dGUgY2FuIHBvaW50IHRvIHRoZSBmaWxlIHRvIGdlbmVyYXRlOyBpZiB0aGlzIGZpbGUKKyAqIGV4aXN0cyB0aGVuIGl0cyBtb2RpZmljYXRpb24gZGF0ZSBpcyB1c2VkIGFzIGEgY3VlIGFzIHRvIHdoZXRoZXIgdG8gcmVzaWduCisgKiBhbnkgSkFSIGZpbGUuCisgKgorICogVGltZXN0YW1wIGRyaXZlbiBzaWduaW5nIGlzIGJhc2VkIG9uIHRoZSB1bnN0YWJsZSBhbmQgaW5hZGVxdWF0ZWx5IGRvY3VtZW50ZWQKKyAqIGluZm9ybWF0aW9uIGluIHRoZSBKYXZhMS41IGRvY3MKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvc2VjdXJpdHkvdGltZS1vZi1zaWduaW5nLWJldGExLmh0bWwiPgorICogYmV0YSBkb2N1bWVudGF0aW9uPC9hPgorICogQGFudC50YXNrIGNhdGVnb3J5PSJqYXZhIgorICogQHNpbmNlIEFudCAxLjEKKyAqLworcHVibGljIGNsYXNzIFNpZ25KYXIgZXh0ZW5kcyBBYnN0cmFjdEphclNpZ25lclRhc2sgeworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIG5hbWUgdG8gYSBzaWduYXR1cmUgZmlsZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2lnZmlsZTsKKworICAgIC8qKgorICAgICAqIG5hbWUgb2YgYSBzaW5nbGUgamFyCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgc2lnbmVkamFyOworCisgICAgLyoqCisgICAgICogZmxhZyBmb3IgaW50ZXJuYWwgc2Ygc2lnbmluZworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGludGVybmFsc2Y7CisKKyAgICAvKioKKyAgICAgKiBzaWduIHNlY3Rpb25zIG9ubHk/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2VjdGlvbnNvbmx5OworCisgICAgLyoqCisgICAgICogZmxhZyB0byBwcmVzZXJ2ZSB0aW1lc3RhbXAgb24gbW9kaWZpZWQgZmlsZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQ7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFzc3VtZSBhIGphciB3aGljaCBoYXMgYW4gYXBwcm9wcmlhdGUgLlNGIGZpbGUgaW4gaXMgYWxyZWFkeQorICAgICAqIHNpZ25lZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsYXp5OworCisgICAgLyoqCisgICAgICogdGhlIG91dHB1dCBkaXJlY3Rvcnkgd2hlbiB1c2luZyBwYXRocy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RGlyOworCisgICAgLyoqCisgICAgICogbWFwcGVyIGZvciB0b2RpciB3b3JrCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlTmFtZU1hcHBlciBtYXBwZXI7CisKKyAgICAvKioKKyAgICAgKiBVUkwgZm9yIGEgdHNhOyBudWxsIGltcGxpZXMgbm8gdHNhIHN1cHBvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRzYXVybDsKKworICAgIC8qKgorICAgICAqIGFsaWFzIGZvciB0aGUgVFNBIGluIHRoZSBrZXlzdG9yZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdHNhY2VydDsKKworICAgIC8qKgorICAgICAqIGVycm9yIHN0cmluZyBmb3IgdW5pdCB0ZXN0IHZlcmlmaWNhdGlvbjoge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9UT0RJUl9BTkRfU0lHTkVESkFSCisgICAgICAgICAgICA9ICInZGVzdGRpcicgYW5kICdzaWduZWRqYXInIGNhbm5vdCBib3RoIGJlIHNldCI7CisgICAgLyoqCisgICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1RPT19NQU5ZX01BUFBFUlMgPSAiVG9vIG1hbnkgbWFwcGVycyI7CisgICAgLyoqCisgICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU0lHTkVESkFSX0FORF9QQVRIUworICAgICAgICA9ICJZb3UgY2Fubm90IHNwZWNpZnkgdGhlIHNpZ25lZCBKQVIgd2hlbiB1c2luZyBwYXRocyBvciBmaWxlc2V0cyI7CisgICAgLyoqCisgICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0JBRF9NQVAgPSAiQ2Fubm90IG1hcCBzb3VyY2UgZmlsZSB0byBhbnl0aGluZyBzZW5zaWJsZTogIjsKKyAgICAvKioKKyAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTUFQUEVSX1dJVEhPVVRfREVTVAorICAgICAgICA9ICJUaGUgZGVzdERpciBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgaWYgYSBtYXBwZXIgaXMgc2V0IjsKKyAgICAvKioKKyAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fQUxJQVMgPSAiYWxpYXMgYXR0cmlidXRlIG11c3QgYmUgc2V0IjsKKyAgICAvKioKKyAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fU1RPUkVQQVNTID0gInN0b3JlcGFzcyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQiOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIC5TRi8uRFNBIGZpbGU7IG9wdGlvbmFsCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2lnZmlsZSB0aGUgbmFtZSBvZiB0aGUgLlNGLy5EU0EgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNpZ2ZpbGUoZmluYWwgU3RyaW5nIHNpZ2ZpbGUpIHsKKyAgICAgICAgdGhpcy5zaWdmaWxlID0gc2lnZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIHNpZ25lZCBKQVIgZmlsZTsgb3B0aW9uYWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWduZWRqYXIgdGhlIG5hbWUgb2YgdGhlIHNpZ25lZCBqYXIgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNpZ25lZGphcihmaW5hbCBGaWxlIHNpZ25lZGphcikgeworICAgICAgICB0aGlzLnNpZ25lZGphciA9IHNpZ25lZGphcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGluY2x1ZGUgdGhlIC5TRiBmaWxlIGluc2lkZSB0aGUgc2lnbmF0dXJlOyBvcHRpb25hbDsgZGVmYXVsdAorICAgICAqIGZhbHNlCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZXJuYWxzZiBpZiB0cnVlIGluY2x1ZGUgdGhlIC5TRiBmaWxlIGluc2lkZSB0aGUgc2lnbmF0dXJlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJuYWxzZihmaW5hbCBib29sZWFuIGludGVybmFsc2YpIHsKKyAgICAgICAgdGhpcy5pbnRlcm5hbHNmID0gaW50ZXJuYWxzZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmbGFnIHRvIGNvbXB1dGUgaGFzaCBvZiBlbnRpcmUgbWFuaWZlc3Q7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VjdGlvbnNvbmx5IGZsYWcgdG8gY29tcHV0ZSBoYXNoIG9mIGVudGlyZSBtYW5pZmVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlY3Rpb25zb25seShmaW5hbCBib29sZWFuIHNlY3Rpb25zb25seSkgeworICAgICAgICB0aGlzLnNlY3Rpb25zb25seSA9IHNlY3Rpb25zb25seTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmbGFnIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgYSBzaWduYXR1cmUgZmlsZSBtZWFucyBhIEpBUiBpcworICAgICAqIHNpZ25lZDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBsYXp5IGZsYWcgdG8gY29udHJvbCB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBhIHNpZ25hdHVyZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhenkoZmluYWwgYm9vbGVhbiBsYXp5KSB7CisgICAgICAgIHRoaXMubGF6eSA9IGxhenk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3B0aW9uYWxseSBzZXRzIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRvIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzdERpciB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHBsYWNlIHNpZ25lZCBqYXJzCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0RGlyKEZpbGUgZGVzdERpcikgeworICAgICAgICB0aGlzLmRlc3REaXIgPSBkZXN0RGlyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogYWRkIGEgbWFwcGVyIHRvIGRldGVybWluZSBmaWxlIG5hbWluZyBwb2xpY3kuIE9ubHkgdXNlZCB3aXRoIHRvRGlyCisgICAgICogcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdNYXBwZXIgdGhlIG1hcHBlciB0byBhZGQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZU5hbWVNYXBwZXIgbmV3TWFwcGVyKSB7CisgICAgICAgIGlmIChtYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX1RPT19NQU5ZX01BUFBFUlMpOworICAgICAgICB9CisgICAgICAgIG1hcHBlciA9IG5ld01hcHBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGFjdGl2ZSBtYXBwZXI7IG1heSBiZSBudWxsCisgICAgICogQHJldHVybiBtYXBwZXIgb3IgbnVsbAorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIEZpbGVOYW1lTWFwcGVyIGdldE1hcHBlcigpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIC10c2F1cmwgdXJsCisgICAgICogQHJldHVybiB1cmwgb3IgbnVsbAorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUc2F1cmwoKSB7CisgICAgICAgIHJldHVybiB0c2F1cmw7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHNhdXJsIHRoZSB0c2EgdXJsLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHNhdXJsKFN0cmluZyB0c2F1cmwpIHsKKyAgICAgICAgdGhpcy50c2F1cmwgPSB0c2F1cmw7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSAtdHNhY2VydCBvcHRpb24KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqIEByZXR1cm4gYSBjZXJ0aWZpY2F0ZSBhbGlhcyBvciBudWxsCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUc2FjZXJ0KCkgeworICAgICAgICByZXR1cm4gdHNhY2VydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIGFsaWFzIGluIHRoZSBrZXlzdG9yZSBvZiB0aGUgVFNBIHRvIHVzZTsKKyAgICAgKiBAcGFyYW0gdHNhY2VydCB0aGUgY2VydCBhbGlhcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUc2FjZXJ0KFN0cmluZyB0c2FjZXJ0KSB7CisgICAgICAgIHRoaXMudHNhY2VydCA9IHRzYWNlcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2lnbiB0aGUgamFyKHMpCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvL3ZhbGlkYXRpb24gbG9naWMKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNKYXIgPSBqYXIgIT0gbnVsbDsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNTaWduZWRKYXIgPSBzaWduZWRqYXIgIT0gbnVsbDsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNEZXN0RGlyID0gZGVzdERpciAhPSBudWxsOworICAgICAgICBmaW5hbCBib29sZWFuIGhhc01hcHBlciA9IG1hcHBlciAhPSBudWxsOworCisgICAgICAgIGlmICghaGFzSmFyICYmICFoYXNSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX1NPVVJDRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgPT0gYWxpYXMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19BTElBUyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVsbCA9PSBzdG9yZXBhc3MpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19TVE9SRVBBU1MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhc0Rlc3REaXIgJiYgaGFzU2lnbmVkSmFyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfVE9ESVJfQU5EX1NJR05FREpBUik7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChoYXNSZXNvdXJjZXMoKSAmJiBoYXNTaWduZWRKYXIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9TSUdORURKQVJfQU5EX1BBVEhTKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vdGhpcyBpc250IHN0cmljdGx5IG5lZWRlZCwgYnV0IGJ5IGJlaW5nIGZ1c3N5IG5vdywKKyAgICAgICAgLy93ZSBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgbGF0ZXIKKyAgICAgICAgaWYgKCFoYXNEZXN0RGlyICYmIGhhc01hcHBlcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX01BUFBFUl9XSVRIT1VUX0RFU1QpOworICAgICAgICB9CisKKyAgICAgICAgYmVnaW5FeGVjdXRpb24oKTsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL3NwZWNpYWwgY2FzZSBzaW5nbGUgamFyIGhhbmRsaW5nIHdpdGggc2lnbmVkamFyIGF0dHJpYnV0ZSBzZXQKKyAgICAgICAgICAgIGlmIChoYXNKYXIgJiYgaGFzU2lnbmVkSmFyKSB7CisgICAgICAgICAgICAgICAgLy8gc2luZ2xlIGphciBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgc2lnbk9uZUphcihqYXIsIHNpZ25lZGphcik7CisgICAgICAgICAgICAgICAgLy9yZXR1cm4gaGVyZS4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vdGhlIHJlc3Qgb2YgdGhlIG1ldGhvZCB0cmVhdHMgc2luZ2xlIGphciBsaWtlCisgICAgICAgICAgICAvL2EgbmVzdGVkIHBhdGggd2l0aCBvbmUgZmlsZQorCisgICAgICAgICAgICBQYXRoIHNvdXJjZXMgPSBjcmVhdGVVbmlmaWVkU291cmNlUGF0aCgpOworICAgICAgICAgICAgLy9zZXQgdXAgb3VyIG1hcHBpbmcgcG9saWN5CisgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBkZXN0TWFwcGVyOworICAgICAgICAgICAgaWYgKGhhc01hcHBlcikgeworICAgICAgICAgICAgICAgIGRlc3RNYXBwZXIgPSBtYXBwZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vbm8gbWFwcGVyPyB1c2UgdGhlIGlkZW50aXR5IHBvbGljeQorICAgICAgICAgICAgICAgIGRlc3RNYXBwZXIgPSBuZXcgSWRlbnRpdHlNYXBwZXIoKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL2F0IHRoaXMgcG9pbnQgdGhlIHBhdGhzIGFyZSBzZXQgdXAgd2l0aCBsaXN0cyBvZiBmaWxlcywKKyAgICAgICAgICAgIC8vYW5kIHRoZSBtYXBwZXIgaXMgcmVhZHkgdG8gbWFwIGZyb20gc291cmNlIGRpcnMgdG8gZGVzdCBmaWxlcworICAgICAgICAgICAgLy9ub3cgd2UgaXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IEpBUiBnaXZpbmcgc291cmNlIGFuZCBkZXN0IG5hbWVzCisgICAgICAgICAgICAvLyBkZWFsIHdpdGggdGhlIHBhdGhzCisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gc291cmNlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgRmlsZVJlc291cmNlIGZyID0gKEZpbGVSZXNvdXJjZSkgaXRlci5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICAvL2NhbGN1bGF0ZSBvdXIgZGVzdGluYXRpb24gZGlyZWN0b3J5OyBpdCBpcyBlaXRoZXIgdGhlIGRlc3REaXIKKyAgICAgICAgICAgICAgICAvL2F0dHJpYnV0ZSwgb3IgdGhlIGJhc2UgZGlyIG9mIHRoZSBmaWxlc2V0IChmb3IgaW4gc2l0dSB1cGRhdGVzKQorICAgICAgICAgICAgICAgIEZpbGUgdG9EaXIgPSBoYXNEZXN0RGlyID8gZGVzdERpciA6IGZyLmdldEJhc2VEaXIoKTsKKworICAgICAgICAgICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmaWxlbmFtZSB2aWEgdGhlIG1hcHBlcgorICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRlc3RGaWxlbmFtZXMgPSBkZXN0TWFwcGVyLm1hcEZpbGVOYW1lKGZyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGRlc3RGaWxlbmFtZXMgPT0gbnVsbCB8fCBkZXN0RmlsZW5hbWVzLmxlbmd0aCAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vd2Ugb25seSBsaWtlIHNpbXBsZSBtYXBwZXJzLgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfQkFEX01BUCArIGZyLmdldEZpbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZSh0b0RpciwgZGVzdEZpbGVuYW1lc1swXSk7CisgICAgICAgICAgICAgICAgc2lnbk9uZUphcihmci5nZXRGaWxlKCksIGRlc3RGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGVuZEV4ZWN1dGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2lnbiBvbmUgamFyLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgc2lnbmluZyBvbmx5IHRha2VzIHBsYWNlIGlmIHtAbGluayAjaXNVcFRvRGF0ZShGaWxlLCBGaWxlKX0gaW5kaWNhdGVzCisgICAgICogdGhhdCBpdCBpcyBuZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamFyU291cmNlIHNvdXJjZSB0byBzaWduCisgICAgICogQHBhcmFtIGphclRhcmdldCB0YXJnZXQ7IG1heSBiZSBudWxsCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzaWduT25lSmFyKEZpbGUgamFyU291cmNlLCBGaWxlIGphclRhcmdldCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKworICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBqYXJUYXJnZXQ7CisgICAgICAgIGlmICh0YXJnZXRGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRhcmdldEZpbGUgPSBqYXJTb3VyY2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzVXBUb0RhdGUoamFyU291cmNlLCB0YXJnZXRGaWxlKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBqYXJTb3VyY2UubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIGZpbmFsIEV4ZWNUYXNrIGNtZCA9IGNyZWF0ZUphclNpZ25lcigpOworCisgICAgICAgIHNldENvbW1vbk9wdGlvbnMoY21kKTsKKworICAgICAgICBiaW5kVG9LZXlzdG9yZShjbWQpOworICAgICAgICBpZiAobnVsbCAhPSBzaWdmaWxlKSB7CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsICItc2lnZmlsZSIpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdGhpcy5zaWdmaWxlOworICAgICAgICAgICAgYWRkVmFsdWUoY21kLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvL0RPIE5PVCBTRVQgVEhFIC1zaWduZWRqYXIgT1BUSU9OIGlmIHNvdXJjZT09ZGVzdAorICAgICAgICAvL3VubGVzcyB5b3UgbGlrZSBmaWVsZGluZyBob3RzcG90IGNyYXNoIHJlcG9ydHMKKyAgICAgICAgaWYgKCFqYXJTb3VyY2UuZXF1YWxzKHRhcmdldEZpbGUpKSB7CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsICItc2lnbmVkamFyIik7CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsIHRhcmdldEZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRlcm5hbHNmKSB7CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsICItaW50ZXJuYWxzZiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlY3Rpb25zb25seSkgeworICAgICAgICAgICAgYWRkVmFsdWUoY21kLCAiLXNlY3Rpb25zb25seSIpOworICAgICAgICB9CisKKyAgICAgICAgLy9hZGQgLXRzYSBvcGVyYXRpb25zIGlmIGRlY2xhcmVkCisgICAgICAgIGFkZFRpbWVzdGFtcEF1dGhvcml0eUNvbW1hbmRzKGNtZCk7CisKKyAgICAgICAgLy9KQVIgc291cmNlIGlzIHJlcXVpcmVkCisgICAgICAgIGFkZFZhbHVlKGNtZCwgamFyU291cmNlLmdldFBhdGgoKSk7CisKKyAgICAgICAgLy9hbGlhcyBpcyByZXF1aXJlZCBmb3Igc2lnbmluZworICAgICAgICBhZGRWYWx1ZShjbWQsIGFsaWFzKTsKKworICAgICAgICBsb2coIlNpZ25pbmcgSkFSOiAiCisgICAgICAgICAgICArIGphclNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgKyAiIHRvICIKKyAgICAgICAgICAgICsgdGFyZ2V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgKyAiIGFzICIgKyBhbGlhcyk7CisKKyAgICAgICAgY21kLmV4ZWN1dGUoKTsKKworICAgICAgICAvLyByZXN0b3JlIHRoZSBsYXN0TW9kaWZpZWQgYXR0cmlidXRlCisgICAgICAgIGlmIChwcmVzZXJ2ZUxhc3RNb2RpZmllZCkgeworICAgICAgICAgICAgdGFyZ2V0RmlsZS5zZXRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSB0c2EgcGFyYW1ldGVycyBhcmUgc2V0LCB0aGlzIHBhc3NlcyB0aGVtIHRvIHRoZSBjb21tYW5kLgorICAgICAqIFRoZXJlIGlzIG5vIHZhbGlkYXRpb24gb2YgamF2YSB2ZXJzaW9uLCBhcyB0aGlyZCBwYXJ0eSBKREtzCisgICAgICogbWF5IGltcGxlbWVudCB0aGlzIG9uIGVhcmxpZXIvbGF0ZXIgamFyc2lnbmVyIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBAcGFyYW0gY21kIHRoZSBleGVjIHRhc2suCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRpbWVzdGFtcEF1dGhvcml0eUNvbW1hbmRzKGZpbmFsIEV4ZWNUYXNrIGNtZCkgeworICAgICAgICBpZiAodHNhdXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFZhbHVlKGNtZCwgIi10c2EiKTsKKyAgICAgICAgICAgIGFkZFZhbHVlKGNtZCwgdHNhdXJsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHNhY2VydCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsICItdHNhY2VydCIpOworICAgICAgICAgICAgYWRkVmFsdWUoY21kLCB0c2FjZXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmUgYSBqYXIgZmlsZSB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIHNpZ25lZCBqYXIuIFRoZSBsb2dpYyBmb3IgdGhpcworICAgICAqIGlzIGNvbXBsZXgsIGFuZCBiZXN0IGV4cGxhaW5lZCBpbiB0aGUgc291cmNlIGl0c2VsZi4gRXNzZW50aWFsbHkgaWYKKyAgICAgKiBlaXRoZXIgZmlsZSBkb2VzbnQgZXhpc3QsIG9yIHRoZSBkZXN0ZmlsZSBoYXMgYW4gb3V0IG9mIGRhdGUgdGltZXN0YW1wLAorICAgICAqIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKiA8cC8+CisgICAgICogSWYgd2UgYXJlIHNpZ25pbmcgb3Vyc2VsZiwgdGhlIGNoZWNrIHtAbGluayAjaXNTaWduZWQoRmlsZSl9IGlzIHVzZWQgdG8KKyAgICAgKiB0cmlnZ2VyIHRoZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGphckZpbGUgICAgICAgdGhlIHVuc2lnbmVkIGphciBmaWxlCisgICAgICogQHBhcmFtIHNpZ25lZGphckZpbGUgdGhlIHJlc3VsdCBzaWduZWQgamFyIGZpbGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNpZ25lZGphckZpbGUgaXMgY29uc2lkZXJlZCB1cCB0byBkYXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVcFRvRGF0ZShGaWxlIGphckZpbGUsIEZpbGUgc2lnbmVkamFyRmlsZSkgeworICAgICAgICBpZiAobnVsbCA9PSBqYXJGaWxlIHx8ICFqYXJGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAvL3RoZXNlIGFyZSBwYXRob2xvZ2ljYWwgY2FzZXMsIGJ1dCByZXRhaW5lZCBpbiBjYXNlIHNvbWVib2R5CisgICAgICAgICAgICAvL3N1YmNsYXNzZWQgdXMuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvL3dlIG5vcm1hbGx5IGNvbXBhcmUgZGVzdGluYXRpb24gd2l0aCBzb3VyY2UKKyAgICAgICAgRmlsZSBkZXN0RmlsZSA9IHNpZ25lZGphckZpbGU7CisgICAgICAgIGlmIChkZXN0RmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvL2J1dCBpZiBubyBkZXN0IGlzIHNwZWNpZmllZCwgY29tcGFyZSBzb3VyY2UgdG8gc291cmNlCisgICAgICAgICAgICBkZXN0RmlsZSA9IGphckZpbGU7CisgICAgICAgIH0KKworICAgICAgICAvL2lmLCBieSBhbnkgbWVhbnMsIHRoZSBkZXN0ZmlsZSBhbmQgc291cmNlIG1hdGNoLAorICAgICAgICBpZiAoamFyRmlsZS5lcXVhbHMoZGVzdEZpbGUpKSB7CisgICAgICAgICAgICBpZiAobGF6eSkgeworICAgICAgICAgICAgICAgIC8vd2UgY2hlY2sgdGhlIHByZXNlbmNlIG9mIHNpZ25hdHVyZXMgb24gbGF6eSBzaWduaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIGlzU2lnbmVkKGphckZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy91bnNpZ25lZCBvciBub24tbGF6eSBzZWxmIHNpZ25pbmdzIGFyZSBhbHdheXMgZmFsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vaWYgdGhleSBhcmUgZGlmZmVyZW50LCB0aGUgdGltZXN0YW1wcyBhcmUgdXNlZAorICAgICAgICByZXR1cm4gRklMRV9VVElMUy5pc1VwVG9EYXRlKGphckZpbGUsIGRlc3RGaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IGZvciBhIGZpbGUgYmVpbmcgc2lnbmVkLCBieSBsb29raW5nIGZvciBhIHNpZ25hdHVyZSBpbiB0aGUgTUVUQS1JTkYKKyAgICAgKiBkaXJlY3Rvcnkgd2l0aCBvdXIgYWxpYXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBiZSBjaGVja2VkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGlzIHNpZ25lZAorICAgICAqIEBzZWUgSXNTaWduZWQjaXNTaWduZWQoRmlsZSwgU3RyaW5nKQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2lnbmVkKEZpbGUgZmlsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIElzU2lnbmVkLmlzU2lnbmVkKGZpbGUsIGFsaWFzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9qdXN0IGxvZyB0aGlzCisgICAgICAgICAgICBsb2coZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc2lnbmVkIGphciBtb2RpZmljYXRpb24gZGF0ZSByZW1haW5zIHRoZSBzYW1lCisgICAgICogYXMgdGhlIG9yaWdpbmFsLiBEZWZhdWx0cyB0byBmYWxzZQorICAgICAqCisgICAgICogQHBhcmFtIHByZXNlcnZlTGFzdE1vZGlmaWVkIGlmIHRydWUgcHJlc2VydmUgdGhlIGxhc3QgbW9kaWZpZWQgdGltZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZXNlcnZlTGFzdE1vZGlmaWVkKGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQpIHsKKyAgICAgICAgdGhpcy5wcmVzZXJ2ZUxhc3RNb2RpZmllZCA9IHByZXNlcnZlTGFzdE1vZGlmaWVkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NsZWVwLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TbGVlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMGEwNTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TbGVlcC5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisvKioKKyAqIFNsZWVwLCBvciBwYXVzZSwgZm9yIGEgcGVyaW9kIG9mIHRpbWUuCisgKgorICogQSB0YXNrIGZvciBzbGVlcGluZyBhIHNob3J0IHBlcmlvZCBvZiB0aW1lLCB1c2VmdWwgd2hlbiBhCisgKiBidWlsZCBvciBkZXBsb3ltZW50IHByb2Nlc3MgcmVxdWlyZXMgYW4gaW50ZXJ2YWwgYmV0d2VlbiB0YXNrcy4KKyAqPHA+CisgKiBBIG5lZ2F0aXZlIHZhbHVlIGNhbiBiZSBzdXBwbGllZCB0byBhbnkgb2YgYXR0cmlidXRlcyBwcm92aWRlZCB0aGUgdG90YWwgc2xlZXAgdGltZQorICogaXMgcG9zaXRpdmUsIHBlbmRpbmcgZnVuZGFtZW50YWwgY2hhbmdlcyBpbiBwaHlzaWNzIGFuZCBKVk0KKyAqIGV4ZWN1dGlvbiB0aW1lczwvcD4KKyAqIE5vdGUgdGhhdCBzbGVlcCB0aW1lcyBhcmUgYWx3YXlzIGhpbnRzIHRvIGJlIGludGVycHJldGVkIGJ5IHRoZSBPUyBob3cgaXQgZmVlbHMKKyAqIHNtYWxsIHRpbWVzIG1heSBlaXRoZXIgYmUgaWdub3JlZCBvciByb3VuZGVkIHVwIHRvIGEgbWluaW11bSB0aW1lc2xpY2UuIE5vdGUKKyAqIGFsc28gdGhhdCB0aGUgc3lzdGVtIGNsb2NrcyBvZnRlbiBoYXZlIGEgZmFpcmx5IGxvdyBncmFudWxhcml0eSB0b28sIHdoaWNoIGNvbXBsaWNhdGVzCisgKiBtZWFzdXJpbmcgaG93IGxvbmcgYSBzbGVlcCBhY3R1YWxseSB0b29rLjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuNAorICogQGFudC50YXNrIGNhdGVnb3J5PSJ1dGlsaXR5IgorICovCisKK3B1YmxpYyBjbGFzcyBTbGVlcCBleHRlbmRzIFRhc2sgeworICAgIC8qKgorICAgICAqIGZhaWx1cmUgZmxhZworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvciA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBzbGVlcCBzZWNvbmRzCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2Vjb25kcyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBzbGVlcCBob3VycworICAgICAqLworICAgIHByaXZhdGUgaW50IGhvdXJzID0gMDsKKyAgICAvKioKKyAgICAgKiBzbGVlcCBtaW51dGVzCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWludXRlcyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBzbGVlcCBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtaWxsaXNlY29uZHMgPSAwOworCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIFNsZWVwKCkgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogc2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWNvbmRzIFRoZSBuZXcgU2Vjb25kcyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlY29uZHMoaW50IHNlY29uZHMpIHsKKyAgICAgICAgdGhpcy5zZWNvbmRzID0gc2Vjb25kczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGhvdXJzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3VycyBUaGUgbmV3IEhvdXJzIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG91cnMoaW50IGhvdXJzKSB7CisgICAgICAgIHRoaXMuaG91cnMgPSBob3VyczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIG1pbnV0ZXMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWludXRlcyBUaGUgbmV3IE1pbnV0ZXMgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNaW51dGVzKGludCBtaW51dGVzKSB7CisgICAgICAgIHRoaXMubWludXRlcyA9IG1pbnV0ZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBtaWxsaXNlY29uZHMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzIFRoZSBuZXcgTWlsbGlzZWNvbmRzIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmRzKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgdGhpcy5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzbGVlcCBmb3IgYSBwZXJpb2Qgb2YgdGltZQorICAgICAqCisgICAgICogQHBhcmFtIG1pbGxpcyB0aW1lIHRvIHNsZWVwCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9TbGVlcChsb25nIG1pbGxpcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1pbGxpcyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgRXhjZXB0aW9uCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGZsYWcgY29udHJvbGxpbmcgd2hldGhlciB0byBicmVhayB0aGUgYnVpbGQgb24gYW4gZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFpbE9uRXJyb3IgVGhlIG5ldyBGYWlsT25FcnJvciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgdGhpcy5mYWlsT25FcnJvciA9IGZhaWxPbkVycm9yOworICAgIH0KKworCisgICAgLyoqCisgICAgICogcmV0dXJuIHRpbWUgdG8gc2xlZXAKKyAgICAgKgorICAgICAqIEByZXR1cm4gc2xlZXAgdGltZS4gaWYgYmVsb3cgMCB0aGVuIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICovCisKKyAgICBwcml2YXRlIGxvbmcgZ2V0U2xlZXBUaW1lKCkgeworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICByZXR1cm4gKCgoKGxvbmcpIGhvdXJzICogNjApICsgbWludXRlcykgKiA2MCArIHNlY29uZHMpICogMTAwMAorICAgICAgICAgICAgKyBtaWxsaXNlY29uZHM7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHZlcmlmeSBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBpcyBpbnZhbGlkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0U2xlZXBUaW1lKCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5lZ2F0aXZlIHNsZWVwIHBlcmlvZHMgYXJlIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3VwcG9ydGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoaXMgYnVpbGQgdGFzay4gVGhyb3dzIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uCisgICAgICogaWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRhc2sgZXhlY3V0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBEZXNjcmlwdGlvbiBvZiBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgICAgICBsb25nIHNsZWVwVGltZSA9IGdldFNsZWVwVGltZSgpOworICAgICAgICAgICAgbG9nKCJzbGVlcGluZyBmb3IgIiArIHNsZWVwVGltZSArICIgbWlsbGlzZWNvbmRzIiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGRvU2xlZXAoc2xlZXBUaW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgbG9nKHRleHQsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3RyZWFtUHVtcGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdHJlYW1QdW1wZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGUzZmMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3RyZWFtUHVtcGVyLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogQ29waWVzIGFsbCBkYXRhIGZyb20gYW4gaW5wdXQgc3RyZWFtIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgKgorICogQHNpbmNlIEFudCAxLjIKKyAqLworcHVibGljIGNsYXNzIFN0cmVhbVB1bXBlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTUFMTF9CVUZGRVJfU0laRSA9IDEyODsKKworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaXM7CisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3M7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGZpbmlzaDsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZmluaXNoZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlV2hlbkV4aGF1c3RlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gYXV0b2ZsdXNoID0gZmFsc2U7CisgICAgcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBidWZmZXJTaXplID0gU01BTExfQlVGRkVSX1NJWkU7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBTdHJlYW1QdW1wZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXMgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZGF0YSBmcm9tCisgICAgICogQHBhcmFtIG9zIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAgICAgKiBAcGFyYW0gY2xvc2VXaGVuRXhoYXVzdGVkIGlmIHRydWUsIHRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIHdoZW4KKyAgICAgKiAgICAgICAgdGhlIGlucHV0IGlzIGV4aGF1c3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZWFtUHVtcGVyKElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MsIGJvb2xlYW4gY2xvc2VXaGVuRXhoYXVzdGVkKSB7CisgICAgICAgIHRoaXMuaXMgPSBpczsKKyAgICAgICAgdGhpcy5vcyA9IG9zOworICAgICAgICB0aGlzLmNsb3NlV2hlbkV4aGF1c3RlZCA9IGNsb3NlV2hlbkV4aGF1c3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgU3RyZWFtUHVtcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGlzIGlucHV0IHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbQorICAgICAqIEBwYXJhbSBvcyBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmVhbVB1bXBlcihJbnB1dFN0cmVhbSBpcywgT3V0cHV0U3RyZWFtIG9zKSB7CisgICAgICAgIHRoaXMoaXMsIG9zLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgZGF0YSBzaG91bGQgYmUgZmx1c2hlZCB0aHJvdWdoIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBhdXRvZmx1c2ggaWYgdHJ1ZSwgcHVzaCB0aHJvdWdoIGRhdGE7IGlmIGZhbHNlLCBsZXQgaXQgYmUgYnVmZmVyZWQKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgLypwYWNrYWdlKi8gdm9pZCBzZXRBdXRvZmx1c2goYm9vbGVhbiBhdXRvZmx1c2gpIHsKKyAgICAgICAgdGhpcy5hdXRvZmx1c2ggPSBhdXRvZmx1c2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIGRhdGEgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogVGVybWluYXRlcyBhcyBzb29uIGFzIHRoZSBpbnB1dCBzdHJlYW0gaXMgY2xvc2VkIG9yIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZmluaXNoZWQgPSBmYWxzZTsKKyAgICAgICAgZmluaXNoID0gZmFsc2U7CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2J1ZmZlclNpemVdOworCisgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IGlzLnJlYWQoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKGxlbmd0aCA8PSAwKSB8fCBmaW5pc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXV0b2ZsdXNoKSB7CisgICAgICAgICAgICAgICAgICAgIG9zLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3MuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY2xvc2VXaGVuRXhoYXVzdGVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIG5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbHMgd2hldGhlciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaXMgdGhlIHN0cmVhbSBoYXMgYmVlbiBleGhhdXN0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZpbmlzaGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCB0aGUgU3RyZWFtUHVtcGVyIGZpbmlzaGVzLgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgaW50ZXJydXB0ZWQuCisgICAgICogQHNlZSAjaXNGaW5pc2hlZCgpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdhaXRGb3IoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICB3aGlsZSAoIWlzRmluaXNoZWQoKSkgeworICAgICAgICAgICAgd2FpdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWFkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSB0aGUgYnVmZmVyIHNpemUgdG8gdXNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBTdHJlYW1QdW1wZXIgaXMgYWxyZWFkeSBydW5uaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCdWZmZXJTaXplKGludCBidWZmZXJTaXplKSB7CisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGJ1ZmZlciBzaXplIG9uIGEgcnVubmluZyBTdHJlYW1QdW1wZXIiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVhZCBidWZmZXIuCisgICAgICogQHJldHVybiB0aGUgaW50IHNpemUgb2YgdGhlIHJlYWQgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEJ1ZmZlclNpemUoKSB7CisgICAgICAgIHJldHVybiBidWZmZXJTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZXhjZXB0aW9uIGVuY291bnRlcmVkLCBpZiBhbnkuCisgICAgICogQHJldHVybiB0aGUgRXhjZXB0aW9uIGVuY291bnRlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBwdW1wZXIgYXMgc29vbiBhcyBwb3NzaWJsZS4KKyAgICAgKiBOb3RlIHRoYXQgaXQgbWF5IGNvbnRpbnVlIHRvIGJsb2NrIG9uIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKiBidXQgaXQgd2lsbCByZWFsbHkgc3RvcCB0aGUgdGhyZWFkIGFzIHNvb24gYXMgaXQgZ2V0cyBFT0YKKyAgICAgKiBvciBhbnkgYnl0ZSwgYW5kIGl0IHdpbGwgYmUgbWFya2VkIGFzIGZpbmlzaGVkLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworICAgICAgICBmaW5pc2ggPSB0cnVlOworICAgICAgICBub3RpZnlBbGwoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdWJBbnQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N1YkFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzM2YTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdWJBbnQuamF2YQpAQCAtMCwwICsxLDYwNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRpclNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlByb3BlcnR5U2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQuVGFyZ2V0RWxlbWVudDsKKworCisvKioKKyAqIENhbGxzIGEgZ2l2ZW4gdGFyZ2V0IGZvciBhbGwgZGVmaW5lZCBzdWItYnVpbGRzLiBUaGlzIGlzIGFuIGV4dGVuc2lvbgorICogb2YgYW50IGZvciBidWxrIHByb2plY3QgZXhlY3V0aW9uLgorICogPHA+CisgKiA8aDI+IFVzZSB3aXRoIGRpcmVjdG9yaWVzIDwvaDI+CisgKiA8cD4KKyAqIHN1YmFudCBjYW4gYmUgdXNlZCB3aXRoIGRpcmVjdG9yeSBzZXRzIHRvIGV4ZWN1dGUgYSBidWlsZCBmcm9tIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KKyAqIDIgZGlmZmVyZW50IG9wdGlvbnMgYXJlIG9mZmVyZWQKKyAqIDwvcD4KKyAqIDx1bD4KKyAqIDxsaT4KKyAqIHJ1biB0aGUgc2FtZSBidWlsZCBmaWxlIC9zb21lcGF0aC9vdGhlcnBhdGgvbXlidWlsZC54bWwKKyAqIHdpdGggZGlmZmVyZW50IGJhc2UgZGlyZWN0b3JpZXMgdXNlIHRoZSBnZW5lcmljYW50ZmlsZSBhdHRyaWJ1dGUKKyAqIDwvbGk+CisgKiA8bGk+aWYgeW91IHdhbnQgdG8gcnVuIGRpcmVjdG9yeTEvYnVpbGQueG1sLCBkaXJlY3RvcnkyL2J1aWxkLnhtbCwgLi4uLgorICogdXNlIHRoZSBhbnRmaWxlIGF0dHJpYnV0ZS4gVGhlIGJhc2UgZGlyZWN0b3J5IGRvZXMgbm90IGdldCBzZXQgYnkgdGhlIHN1YmFudCB0YXNrIGluIHRoaXMgY2FzZSwKKyAqIGJlY2F1c2UgeW91IGNhbiBzcGVjaWZ5IGl0IGluIGVhY2ggYnVpbGQgZmlsZS4KKyAqIDwvbGk+CisgKiA8L3VsPgorICogQHNpbmNlIEFudDEuNgorICogQGFudC50YXNrIG5hbWU9InN1YmFudCIgY2F0ZWdvcnk9ImNvbnRyb2wiCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJBbnQKKyAgICAgICAgICAgICBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBQYXRoIGJ1aWxkcGF0aDsKKworICAgIHByaXZhdGUgQW50IGFudCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc3ViVGFyZ2V0ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBhbnRmaWxlID0gImJ1aWxkLnhtbCI7CisgICAgcHJpdmF0ZSBGaWxlIGdlbmVyaWNhbnRmaWxlID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBpbmhlcml0QWxsID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGluaGVyaXRSZWZzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXQgID0gbnVsbDsKKworICAgIHByaXZhdGUgVmVjdG9yIHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgcmVmZXJlbmNlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvciBwcm9wZXJ0eVNldHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiogdGhlIHRhcmdldHMgdG8gY2FsbCBvbiB0aGUgbmV3IHByb2plY3QgKi8KKyAgICBwcml2YXRlIFZlY3Rvci8qPFRhcmdldEVsZW1lbnQ+Ki8gdGFyZ2V0cyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIFBhc3Mgb3V0cHV0IHNlbnQgdG8gU3lzdGVtLm91dCB0byB0aGUgbmV3IHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IGEgbGluZSBvZiBvdXRwdXQKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKGFudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhbnQuaGFuZGxlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgaW5wdXQgaW50byB0aGUgYW50IHRhc2sKKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgaXMgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGF0IHdoaWNoIGRhdGEgaXMgc3RvcmVkLgorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBkYXRhIGNhbm5vdCBiZSByZWFkCisgICAgICoKKyAgICAgKiBAc2VlIFRhc2sjaGFuZGxlSW5wdXQoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhbmRsZUlucHV0KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFudC5oYW5kbGVJbnB1dChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5oYW5kbGVJbnB1dChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3Mgb3V0cHV0IHNlbnQgdG8gU3lzdGVtLm91dCB0byB0aGUgbmV3IHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdG8gbG9nLiBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUZsdXNoKFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgaWYgKGFudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhbnQuaGFuZGxlRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUZsdXNoKG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXNzIG91dHB1dCBzZW50IHRvIFN5c3RlbS5lcnIgdG8gdGhlIG5ldyBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBUaGUgZXJyb3Igb3V0cHV0IHRvIGxvZy4gU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVFcnJvck91dHB1dChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChhbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYW50LmhhbmRsZUVycm9yT3V0cHV0KG91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVFcnJvck91dHB1dChvdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzcyBvdXRwdXQgc2VudCB0byBTeXN0ZW0uZXJyIHRvIHRoZSBuZXcgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgVGhlIGVycm9yIG91dHB1dCB0byBsb2cuIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlRXJyb3JGbHVzaChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChhbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYW50LmhhbmRsZUVycm9yRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUVycm9yRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgdGhlIHZhcmlvdXMgc3ViLWJ1aWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBpZiAoYnVpbGRwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gYnVpbGRwYXRoIHNwZWNpZmllZCIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZmlsZW5hbWVzID0gYnVpbGRwYXRoLmxpc3QoKTsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZmlsZW5hbWVzLmxlbmd0aDsKKyAgICAgICAgaWYgKGNvdW50IDwgMSkgeworICAgICAgICAgICAgbG9nKCJObyBzdWItYnVpbGRzIHRvIGl0ZXJhdGUgb24iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorLyoKKyAgICAvL1JFVklTSVQ6IHRoZXJlIG11c3QgYmUgY2xlYW5lciB3YXkgb2YgZG9pbmcgdGhpcywgaWYgaXQgaXMgbWVyaXRlZCBhdCBhbGwKKyAgICAgICAgaWYgKHN1YlRhcmdldCA9PSBudWxsKSB7CisgICAgICAgICAgICBzdWJUYXJnZXQgPSBnZXRPd25pbmdUYXJnZXQoKS5nZXROYW1lKCk7CisgICAgICAgIH0KKyovCisgICAgICAgIEJ1aWxkRXhjZXB0aW9uIGJ1aWxkRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHN1YmRpclBhdGggPSBudWxsOworICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93bkV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJkaXJQYXRoID0gZmlsZS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkVudGVyaW5nIGRpcmVjdG9yeTogIiArIHN1YmRpclBhdGggKyAiXG4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJpY2FudGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBnZW5lcmljYW50ZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShmaWxlLCBhbnRmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBleGVjdXRlKGZpbGUsIGRpcmVjdG9yeSk7CisgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UgJiYgc3ViZGlyUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiTGVhdmluZyBkaXJlY3Rvcnk6ICIgKyBzdWJkaXJQYXRoICsgIlxuIiwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGlmICghKGdldFByb2plY3QoKS5pc0tlZXBHb2luZ01vZGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UgJiYgc3ViZGlyUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkxlYXZpbmcgZGlyZWN0b3J5OiAiICsgc3ViZGlyUGF0aCArICJcbiIsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OyAvLyB0aHJvdyBmdXJ0aGVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93bkV4Y2VwdGlvbiA9IGV4OworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKCEoZ2V0UHJvamVjdCgpLmlzS2VlcEdvaW5nTW9kZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSAmJiBzdWJkaXJQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiTGVhdmluZyBkaXJlY3Rvcnk6ICIgKyBzdWJkaXJQYXRoICsgIlxuIiwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3duRXhjZXB0aW9uID0gZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhyb3duRXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhyb3duRXhjZXB0aW9uIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJGaWxlICciICsgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBmYWlsZWQgd2l0aCBtZXNzYWdlICciCisgICAgICAgICAgICAgICAgICAgICAgICArIHRocm93bkV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgKyAiJy4iLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHRoZSBmaXJzdCBidWlsZCBleGNlcHRpb24gaXMgcmVwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkRXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkRXhjZXB0aW9uID0gKEJ1aWxkRXhjZXB0aW9uKSB0aHJvd25FeGNlcHRpb247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coIlRhcmdldCAnIiArIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicgZmFpbGVkIHdpdGggbWVzc2FnZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aHJvd25FeGNlcHRpb24uZ2V0TWVzc2FnZSgpICsgIicuIiwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3duRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkRXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkRXhjZXB0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVpbGRFeGNlcHRpb24odGhyb3duRXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSAmJiBzdWJkaXJQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJMZWF2aW5nIGRpcmVjdG9yeTogIiArIHN1YmRpclBhdGggKyAiXG4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBidWlsZHMgZmFpbGVkIGluIGtlZXAgZ29pbmcgbW9kZQorICAgICAgICBpZiAoYnVpbGRFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgYnVpbGRFeGNlcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSBnaXZlbiB0YXJnZXQgb24gdGhlIHByb3ZpZGVkIGJ1aWxkIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGZpbGUgdGhlIGJ1aWxkIGZpbGUgdG8gZXhlY3V0ZQorICAgICAqIEBwYXJhbSAgZGlyZWN0b3J5IHRoZSBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgaXRlcmF0aW9uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpcyB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQsIHJlYWQsIGlzCisgICAgICogICAgICAgICBhIGRpcmVjdG9yeSwgb3IgdGhlIHRhcmdldCBjYWxsZWQgZmFpbGVkLCBidXQgb25seSBpZgorICAgICAqICAgICAgICAgPGNvZGU+ZmFpbE9uRXJyb3I8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LiBPdGhlcndpc2UsCisgICAgICogICAgICAgICBhIHdhcm5pbmcgbG9nIG1lc3NhZ2UgaXMgc2ltcGx5IG91dHB1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZShGaWxlIGZpbGUsIEZpbGUgZGlyZWN0b3J5KQorICAgICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSB8fCBmaWxlLmlzRGlyZWN0b3J5KCkgfHwgIWZpbGUuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkludmFsaWQgZmlsZTogIiArIGZpbGU7CisgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZyhtc2csIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYW50ID0gY3JlYXRlQW50VGFzayhkaXJlY3RvcnkpOworICAgICAgICBTdHJpbmcgYW50ZmlsZW5hbWUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBhbnQuc2V0QW50ZmlsZShhbnRmaWxlbmFtZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgVGFyZ2V0RWxlbWVudCB0YXJnZXRFbGVtZW50ID0gKFRhcmdldEVsZW1lbnQpIHRhcmdldHMuZ2V0KGkpOworICAgICAgICAgICAgYW50LmFkZENvbmZpZ3VyZWRUYXJnZXQodGFyZ2V0RWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYW50LmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZygiRmFpbHVyZSBmb3IgdGFyZ2V0ICciICsgc3ViVGFyZ2V0CisgICAgICAgICAgICAgICArICInIG9mOiAiICsgIGFudGZpbGVuYW1lICsgIlxuIgorICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIkZhaWx1cmUgZm9yIHRhcmdldCAnIiArIHN1YlRhcmdldAorICAgICAgICAgICAgICAgICsgIicgb2Y6ICIgKyBhbnRmaWxlbmFtZSArICJcbiIKKyAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFudCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBidWlsZHMgdGhlIGZpbGUgbmFtZSB0byB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCBkaXJlY3Rvcmllcy4KKyAgICAgKgorICAgICAqIDxwPkRlZmF1bHRzIHRvICJidWlsZC54bWwiLgorICAgICAqIElmIDxjb2RlPmdlbmVyaWNhbnRmaWxlPC9jb2RlPiBpcyBzZXQsIHRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtICBhbnRmaWxlIHRoZSBzaG9ydCBidWlsZCBmaWxlIG5hbWUuIERlZmF1bHRzIHRvICJidWlsZC54bWwiLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFudGZpbGUoU3RyaW5nIGFudGZpbGUpIHsKKyAgICAgICAgdGhpcy5hbnRmaWxlID0gYW50ZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBidWlsZHMgYSBmaWxlIHBhdGggdG8gdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggZGlyZWN0b3JpZXMuCisgICAgICoKKyAgICAgKiA8cD5Vc2UgPGNvZGU+Z2VuZXJpY2FudGZpbGU8L2NvZGU+LCBpbiBvcmRlciB0byBydW4gdGhlIHNhbWUgYnVpbGQgZmlsZQorICAgICAqIHdpdGggZGlmZmVyZW50IGJhc2VkaXJzLjwvcD4KKyAgICAgKiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIDxjb2RlPmFudGZpbGU8L2NvZGU+IGlzIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWZpbGUgKHBhdGggb2YgdGhlIGdlbmVyaWMgYW50IGZpbGUsIGFic29sdXRlIG9yIHJlbGF0aXZlIHRvCisgICAgICogICAgICAgICAgICAgICBwcm9qZWN0IGJhc2UgZGlyZWN0b3J5KQorICAgICAqICovCisgICAgcHVibGljIHZvaWQgc2V0R2VuZXJpY0FudGZpbGUoRmlsZSBhZmlsZSkgeworICAgICAgICB0aGlzLmdlbmVyaWNhbnRmaWxlID0gYWZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRvIGZhaWwgd2l0aCBhIGJ1aWxkIGV4Y2VwdGlvbiBvbiBlcnJvciwgb3IgZ28gb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGZhaWxPbkVycm9yIHRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgYm9vbGVhbiBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvbmVycm9yKGJvb2xlYW4gZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgdGhpcy5mYWlsT25FcnJvciA9IGZhaWxPbkVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0YXJnZXQgdG8gY2FsbCBvbiB0aGUgZGlmZmVyZW50IHN1Yi1idWlsZHMuIFNldCB0byAiIiB0byBleGVjdXRlCisgICAgICogdGhlIGRlZmF1bHQgdGFyZ2V0LgorICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldAorICAgICAqIDxwPgorICAgICAqLworICAgIC8vICAgICBSRVZJU0lUOiBEZWZhdWx0cyB0byB0aGUgdGFyZ2V0IG5hbWUgdGhhdCBjb250YWlucyB0aGlzIHRhc2sgaWYgbm90IHNwZWNpZmllZC4KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldCkgeworICAgICAgICB0aGlzLnN1YlRhcmdldCA9IHRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB0YXJnZXQgdG8gdGhpcyBBbnQgaW52b2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gdCB0aGUgPGNvZGU+VGFyZ2V0RWxlbWVudDwvY29kZT4gdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFRhcmdldChUYXJnZXRFbGVtZW50IHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSB0LmdldE5hbWUoKTsKKyAgICAgICAgaWYgKCIiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0YXJnZXQgbmFtZSBtdXN0IG5vdCBiZSBlbXB0eSIpOworICAgICAgICB9CisgICAgICAgIHRhcmdldHMuYWRkKHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZS8gZGlzYWJsZSB2ZXJib3NlIGxvZyBtZXNzYWdlcyBzaG93aW5nIHdoZW4gZWFjaCBzdWItYnVpbGQgcGF0aCBpcyBlbnRlcmVkLyBleGl0ZWQuCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgImZhbHNlIi4KKyAgICAgKiBAcGFyYW0gb24gdHJ1ZSB0byBlbmFibGUgdmVyYm9zZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UgKGRlZmF1bHQpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiBvbikgeworICAgICAgICB0aGlzLnZlcmJvc2UgPSBvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3JyZXNwb25kcyB0byA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4ncworICAgICAqIDxjb2RlPm91dHB1dDwvY29kZT4gYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtICBzIHRoZSBmaWxlbmFtZSB0byB3cml0ZSB0aGUgb3V0cHV0IHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgcykgeworICAgICAgICB0aGlzLm91dHB1dCA9IHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ycmVzcG9uZHMgdG8gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+J3MKKyAgICAgKiA8Y29kZT5pbmhlcml0YWxsPC9jb2RlPiBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGIgdGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBib29sZWFuIGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5oZXJpdGFsbChib29sZWFuIGIpIHsKKyAgICAgICAgdGhpcy5pbmhlcml0QWxsID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3JyZXNwb25kcyB0byA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4ncworICAgICAqIDxjb2RlPmluaGVyaXRyZWZzPC9jb2RlPiBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGIgdGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBib29sZWFuIGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5oZXJpdHJlZnMoYm9vbGVhbiBiKSB7CisgICAgICAgIHRoaXMuaW5oZXJpdFJlZnMgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcnJlc3BvbmRzIHRvIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPidzCisgICAgICogbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHAgdGhlIHByb3BlcnR5IHRvIHBhc3Mgb24gZXhwbGljaXRseSB0byB0aGUgc3ViLWJ1aWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFByb3BlcnR5IHApIHsKKyAgICAgICAgcHJvcGVydGllcy5hZGRFbGVtZW50KHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcnJlc3BvbmRzIHRvIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPidzCisgICAgICogbmVzdGVkIDxjb2RlPiZsdDtyZWZlcmVuY2UmZ3Q7PC9jb2RlPiBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtICByIHRoZSByZWZlcmVuY2UgdG8gcGFzcyBvbiBleHBsaWNpdGx5IHRvIHRoZSBzdWItYnVpbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKEFudC5SZWZlcmVuY2UgcikgeworICAgICAgICByZWZlcmVuY2VzLmFkZEVsZW1lbnQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ycmVzcG9uZHMgdG8gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+J3MKKyAgICAgKiBuZXN0ZWQgPGNvZGU+Jmx0O3Byb3BlcnR5c2V0Jmd0OzwvY29kZT4gZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gcHMgdGhlIHByb3BlcnRzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eXNldChQcm9wZXJ0eVNldCBwcykgeworICAgICAgICBwcm9wZXJ0eVNldHMuYWRkRWxlbWVudChwcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGRpcmVjdG9yeSBzZXQgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguCisgICAgICogPHA+CisgICAgICogPGVtPk5vdGUgdGhhdCB0aGUgZGlyZWN0b3JpZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgYnVpbGQgcGF0aAorICAgICAqIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHNvIGlmIG9yZGVyIGlzIHNpZ25pZmljYW50LCBvbmUgc2hvdWxkCisgICAgICogdXNlIGEgZmlsZSBsaXN0IGluc3RlYWQhPC9lbT4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc2V0IHRoZSBkaXJlY3Rvcnkgc2V0IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREaXJzZXQoRGlyU2V0IHNldCkgeworICAgICAgICBhZGQoc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZmlsZSBzZXQgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguCisgICAgICogPHA+CisgICAgICogPGVtPk5vdGUgdGhhdCB0aGUgZGlyZWN0b3JpZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgYnVpbGQgcGF0aAorICAgICAqIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHNvIGlmIG9yZGVyIGlzIHNpZ25pZmljYW50LCBvbmUgc2hvdWxkCisgICAgICogdXNlIGEgZmlsZSBsaXN0IGluc3RlYWQhPC9lbT4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc2V0IHRoZSBmaWxlIHNldCB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBhZGQoc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIG9yZGVyZWQgZmlsZSBsaXN0IHRvIHRoZSBpbXBsaWNpdCBidWlsZCBwYXRoLgorICAgICAqIDxwPgorICAgICAqIDxlbT5Ob3RlIHRoYXQgY29udHJhcnkgdG8gZmlsZSBhbmQgZGlyZWN0b3J5IHNldHMsIGZpbGUgbGlzdHMKKyAgICAgKiBjYW4gcmVmZXJlbmNlIG5vbi1leGlzdGVudCBmaWxlcyBvciBkaXJlY3RvcmllcyE8L2VtPgorICAgICAqCisgICAgICogQHBhcmFtICBsaXN0IHRoZSBmaWxlIGxpc3QgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVsaXN0KEZpbGVMaXN0IGxpc3QpIHsKKyAgICAgICAgYWRkKGxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIHRoZSBpbXBsaWNpdCBidWlsZCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtICByYyB0aGUgcmVzb3VyY2UgY29sbGVjdGlvbiB0byBhZGQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CisgICAgICAgIGdldEJ1aWxkcGF0aCgpLmFkZChyYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBidWlsZHBhdGggdG8gYmUgdXNlZCB0byBmaW5kIHN1Yi1wcm9qZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcyBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgYnVpbGRwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkcGF0aChQYXRoIHMpIHsKKyAgICAgICAgZ2V0QnVpbGRwYXRoKCkuYXBwZW5kKHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXN0ZWQgYnVpbGQgcGF0aCwgYW5kIGFkZCBpdCB0byB0aGUgaW1wbGljaXQgYnVpbGQgcGF0aC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgbmVzdGVkIGJ1aWxkIHBhdGguCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQnVpbGRwYXRoKCkgeworICAgICAgICByZXR1cm4gZ2V0QnVpbGRwYXRoKCkuY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXN0ZWQgPGNvZGU+Jmx0O2J1aWxkcGF0aGVsZW1lbnQmZ3Q7PC9jb2RlPiwKKyAgICAgKiBhbmQgYWRkIGl0IHRvIHRoZSBpbXBsaWNpdCBidWlsZCBwYXRoLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBuZXN0ZWQgYnVpbGQgcGF0aCBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBQYXRoLlBhdGhFbGVtZW50IGNyZWF0ZUJ1aWxkcGF0aEVsZW1lbnQoKSB7CisgICAgICAgIHJldHVybiBnZXRCdWlsZHBhdGgoKS5jcmVhdGVQYXRoRWxlbWVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGgsIGNyZWF0aW5nIGl0IGlmIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW1wbGljaXQgYnVpbGQgcGF0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggZ2V0QnVpbGRwYXRoKCkgeworICAgICAgICBpZiAoYnVpbGRwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHBhdGggdG8gdXNlLCBieSByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHIgYSByZWZlcmVuY2UgdG8gYW4gQW50IFBhdGggb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGJ1aWxkcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZHBhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQnVpbGRwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgJmx0O2FudCZndDsgdGFzayBjb25maWd1cmVkIHRvIHJ1biBhIHNwZWNpZmljIHRhcmdldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJlY3RvcnkgOiBpZiBub3QgbnVsbCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBidWlsZCBzaG91bGQgcnVuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhbnQgdGFzaywgY29uZmlndXJlZCB3aXRoIHRoZSBleHBsaWNpdCBwcm9wZXJ0aWVzIGFuZAorICAgICAqICAgICAgICAgcmVmZXJlbmNlcyBuZWNlc3NhcnkgdG8gcnVuIHRoZSBzdWItYnVpbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBBbnQgY3JlYXRlQW50VGFzayhGaWxlIGRpcmVjdG9yeSkgeworICAgICAgICBBbnQgYW50VGFzayA9IG5ldyBBbnQodGhpcyk7CisgICAgICAgIGFudFRhc2suaW5pdCgpOworICAgICAgICBpZiAoc3ViVGFyZ2V0ICE9IG51bGwgJiYgc3ViVGFyZ2V0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgYW50VGFzay5zZXRUYXJnZXQoc3ViVGFyZ2V0KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBhbnRUYXNrLnNldE91dHB1dChvdXRwdXQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpcmVjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICBhbnRUYXNrLnNldERpcihkaXJlY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgYW50VGFzay5zZXRJbmhlcml0QWxsKGluaGVyaXRBbGwpOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGkgPSBwcm9wZXJ0aWVzLmVsZW1lbnRzKCk7IGkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBjb3B5UHJvcGVydHkoYW50VGFzay5jcmVhdGVQcm9wZXJ0eSgpLCAoUHJvcGVydHkpIGkubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGkgPSBwcm9wZXJ0eVNldHMuZWxlbWVudHMoKTsgaS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIGFudFRhc2suYWRkUHJvcGVydHlzZXQoKFByb3BlcnR5U2V0KSBpLm5leHRFbGVtZW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgYW50VGFzay5zZXRJbmhlcml0UmVmcyhpbmhlcml0UmVmcyk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gaSA9IHJlZmVyZW5jZXMuZWxlbWVudHMoKTsgaS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIGFudFRhc2suYWRkUmVmZXJlbmNlKChBbnQuUmVmZXJlbmNlKSBpLm5leHRFbGVtZW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFudFRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzaWducyBhbiBBbnQgcHJvcGVydHkgdG8gYW5vdGhlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgdG8gdGhlIGRlc3RpbmF0aW9uIHByb3BlcnR5IHdob3NlIGNvbnRlbnQgaXMgbW9kaWZpZWQuCisgICAgICogQHBhcmFtICBmcm9tIHRoZSBzb3VyY2UgcHJvcGVydHkgd2hvc2UgY29udGVudCBpcyBjb3BpZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5UHJvcGVydHkoUHJvcGVydHkgdG8sIFByb3BlcnR5IGZyb20pIHsKKyAgICAgICAgdG8uc2V0TmFtZShmcm9tLmdldE5hbWUoKSk7CisKKyAgICAgICAgaWYgKGZyb20uZ2V0VmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0by5zZXRWYWx1ZShmcm9tLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmcm9tLmdldEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0by5zZXRGaWxlKGZyb20uZ2V0RmlsZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJvbS5nZXRSZXNvdXJjZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvLnNldFJlc291cmNlKGZyb20uZ2V0UmVzb3VyY2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyb20uZ2V0UHJlZml4KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdG8uc2V0UHJlZml4KGZyb20uZ2V0UHJlZml4KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmcm9tLmdldFJlZmlkKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdG8uc2V0UmVmaWQoZnJvbS5nZXRSZWZpZCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJvbS5nZXRFbnZpcm9ubWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvLnNldEVudmlyb25tZW50KGZyb20uZ2V0RW52aXJvbm1lbnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyb20uZ2V0Q2xhc3NwYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdG8uc2V0Q2xhc3NwYXRoKGZyb20uZ2V0Q2xhc3NwYXRoKCkpOworICAgICAgICB9CisgICAgfQorCit9IC8vIEVORCBjbGFzcyBTdWJBbnQKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N5bmMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N5bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTU0OWEzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3luYy5qYXZhCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQWJzdHJhY3RGaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuTm9uZVNlbGVjdG9yOworCisvKioKKyAqIFN5bmNocm9uaXplIGEgbG9jYWwgdGFyZ2V0IGRpcmVjdG9yeSBmcm9tIHRoZSBmaWxlcyBkZWZpbmVkCisgKiBpbiBvbmUgb3IgbW9yZSBmaWxlc2V0cy4KKyAqCisgKiA8cD5Vc2VzIGEgJmx0O2NvcHkmZ3Q7IHRhc2sgaW50ZXJuYWxseSwgYnV0IGZvcmJpZGRpbmcgdGhlIHVzZSBvZgorICogbWFwcGVycyBhbmQgZmlsdGVyIGNoYWlucy4gRmlsZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBub3QKKyAqIHByZXNlbnQgaW4gYW55IG9mIHRoZSBzb3VyY2UgZmlsZXNldCBhcmUgcmVtb3ZlZC48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqCisgKiByZXZpc2VkIGJ5IDxhIGhyZWY9Im1haWx0bzpkYW5pZWwuYXJtYnJ1c3RAbWF5by5lZHUiPkRhbiBBcm1icnVzdDwvYT4KKyAqIHRvIHJlbW92ZSBvcnBoYW5lZCBkaXJlY3Rvcmllcy4KKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCisgKi8KK3B1YmxpYyBjbGFzcyBTeW5jIGV4dGVuZHMgVGFzayB7CisKKyAgICAvLyBTYW1lIGFzIHJlZ3VsYXIgPGNvcHk+IHRhc2suLi4gc2VlIGF0IGVuZC1vZi1maWxlIQorICAgIHByaXZhdGUgTXlDb3B5IG15Q29weTsKKworICAgIC8vIFNpbWlsYXIgdG8gYSBmaWxlc2V0LCBidXQgZG9lc24ndCBhbGxvdyBkaXIgYXR0cmlidXRlIHRvIGJlIHNldAorICAgIHByaXZhdGUgU3luY1RhcmdldCBzeW5jVGFyZ2V0OworCisgICAgLy8gT3ZlcnJpZGUgVGFzayNpbml0CisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgc3luYyB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgorICAgICAqIEBzZWUgVGFzayNpbml0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgaXQKKyAgICAgICAgbXlDb3B5ID0gbmV3IE15Q29weSgpOworICAgICAgICBjb25maWd1cmVUYXNrKG15Q29weSk7CisKKyAgICAgICAgLy8gRGVmYXVsdCBjb25maWcgb2YgPG15Y29weT4gZm9yIG91ciBwdXJwb3Nlcy4KKyAgICAgICAgbXlDb3B5LnNldEZpbHRlcmluZyhmYWxzZSk7CisgICAgICAgIG15Q29weS5zZXRJbmNsdWRlRW1wdHlEaXJzKGZhbHNlKTsKKyAgICAgICAgbXlDb3B5LnNldFByZXNlcnZlTGFzdE1vZGlmaWVkKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVUYXNrKFRhc2sgaGVscGVyKSB7CisgICAgICAgIGhlbHBlci5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIGhlbHBlci5zZXRUYXNrTmFtZShnZXRUYXNrTmFtZSgpKTsKKyAgICAgICAgaGVscGVyLnNldE93bmluZ1RhcmdldChnZXRPd25pbmdUYXJnZXQoKSk7CisgICAgICAgIGhlbHBlci5pbml0KCk7CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGUgVGFzayNleGVjdXRlCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc3luYyB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICogQHNlZSBUYXNrI2V4ZWN1dGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGZpbGVzIHRvIGNvcHkKKyAgICAgICAgRmlsZSB0b0RpciA9IG15Q29weS5nZXRUb0RpcigpOworCisgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGZpbGVzIHRvIGNvcHkKKyAgICAgICAgU2V0IGFsbEZpbGVzID0gbXlDb3B5Lm5vbk9ycGhhbnM7CisKKyAgICAgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBkaWRuJ3QgYWxyZWFkeSBleGlzdCwKKyAgICAgICAgLy8gb3Igd2FzIGVtcHR5LCB0aGVuIG5vIHByZXZpb3VzIGZpbGUgcmVtb3ZhbCBpcyBuZWNlc3NhcnkhCisgICAgICAgIGJvb2xlYW4gbm9SZW1vdmFsTmVjZXNzYXJ5ID0gIXRvRGlyLmV4aXN0cygpIHx8IHRvRGlyLmxpc3QoKS5sZW5ndGggPCAxOworCisgICAgICAgIC8vIENvcHkgYWxsIHRoZSBuZWNlc3Nhcnkgb3V0LW9mLWRhdGUgZmlsZXMKKyAgICAgICAgbG9nKCJQQVNTIzE6IENvcHlpbmcgZmlsZXMgdG8gIiArIHRvRGlyLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIG15Q29weS5leGVjdXRlKCk7CisKKyAgICAgICAgLy8gRG8gd2UgbmVlZCB0byBwZXJmb3JtIGZ1cnRoZXIgcHJvY2Vzc2luZz8KKyAgICAgICAgaWYgKG5vUmVtb3ZhbE5lY2Vzc2FyeSkgeworICAgICAgICAgICAgbG9nKCJOTyByZW1vdmluZyBuZWNlc3NhcnkgaW4gIiArIHRvRGlyLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICByZXR1cm47IC8vIG5vcGUgOy0pCisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgcmlkIG9mIGFsbCBmaWxlcyBub3QgbGlzdGVkIGluIHRoZSBzb3VyY2UgZmlsZXNldHMuCisgICAgICAgIGxvZygiUEFTUyMyOiBSZW1vdmluZyBvcnBoYW4gZmlsZXMgZnJvbSAiICsgdG9EaXIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgaW50W10gcmVtb3ZlZEZpbGVDb3VudCA9IHJlbW92ZU9ycGhhbkZpbGVzKGFsbEZpbGVzLCB0b0Rpcik7CisgICAgICAgIGxvZ1JlbW92ZWRDb3VudChyZW1vdmVkRmlsZUNvdW50WzBdLCAiZGFuZ2xpbmcgZGlyZWN0b3IiLCAieSIsICJpZXMiKTsKKyAgICAgICAgbG9nUmVtb3ZlZENvdW50KHJlbW92ZWRGaWxlQ291bnRbMV0sICJkYW5nbGluZyBmaWxlIiwgIiIsICJzIik7CisKKyAgICAgICAgLy8gR2V0IHJpZCBvZiBlbXB0eSBkaXJlY3RvcmllcyBvbiB0aGUgZGVzdGluYXRpb24gc2lkZQorICAgICAgICBpZiAoIW15Q29weS5nZXRJbmNsdWRlRW1wdHlEaXJzKCkpIHsKKyAgICAgICAgICAgIGxvZygiUEFTUyMzOiBSZW1vdmluZyBlbXB0eSBkaXJlY3RvcmllcyBmcm9tICIgKyB0b0RpciwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICBpbnQgcmVtb3ZlZERpckNvdW50ID0gcmVtb3ZlRW1wdHlEaXJlY3Rvcmllcyh0b0RpciwgZmFsc2UpOworICAgICAgICAgICAgbG9nUmVtb3ZlZENvdW50KHJlbW92ZWREaXJDb3VudCwgImVtcHR5IGRpcmVjdG9yIiwgInkiLCAiaWVzIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nUmVtb3ZlZENvdW50KGludCBjb3VudCwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaW5ndWxhclN1ZmZpeCwgU3RyaW5nIHBsdXJhbFN1ZmZpeCkgeworICAgICAgICBGaWxlIHRvRGlyID0gbXlDb3B5LmdldFRvRGlyKCk7CisKKyAgICAgICAgU3RyaW5nIHdoYXQgPSAocHJlZml4ID09IG51bGwpID8gIiIgOiBwcmVmaXg7CisgICAgICAgIHdoYXQgKz0gKGNvdW50IDwgMikgPyBzaW5ndWxhclN1ZmZpeCA6IHBsdXJhbFN1ZmZpeDsKKworICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICBsb2coIlJlbW92ZWQgIiArIGNvdW50ICsgIiAiICsgd2hhdCArICIgZnJvbSAiICsgdG9EaXIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIk5PICIgKyB3aGF0ICsgIiB0byByZW1vdmUgZnJvbSAiICsgdG9EaXIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBmaWxlcyBhbmQgZm9sZGVycyBub3QgZm91bmQgYXMga2V5cyBvZiBhIHRhYmxlCisgICAgICogKHVzZWQgYXMgYSBzZXQhKS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBwcm92aWRlZCBmaWxlIGlzIGEgZGlyZWN0b3J5LCBpdCBpcyByZWN1cnNpdmVseQorICAgICAqIHNjYW5uZWQgZm9yIG9ycGhhbmVkIGZpbGVzIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBhcyB3ZWxsLjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBkaXJlY3RvcnkgaXMgYW4gb3JwaGFuLCBpdCB3aWxsIGFsc28gYmUgcmVtb3ZlZC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gIG5vbk9ycGhhbnMgdGhlIHRhYmxlIG9mIGFsbCBub24tb3JwaGFuIDxjb2RlPkZpbGU8L2NvZGU+cy4KKyAgICAgKiBAcGFyYW0gIGZpbGUgdGhlIGluaXRpYWwgZmlsZSBvciBkaXJlY3RvcnkgdG8gc2NhbiBvciB0ZXN0LgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBvcnBoYW5lZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYWN0dWFsbHkgcmVtb3ZlZC4KKyAgICAgKiBQb3NpdGlvbiAwIG9mIHRoZSBhcnJheSBpcyB0aGUgbnVtYmVyIG9mIG9ycGhhbmVkIGRpcmVjdG9yaWVzLgorICAgICAqIFBvc2l0aW9uIDEgb2YgdGhlIGFycmF5IGlzIHRoZSBudW1iZXIgb3Igb3JwaGFuZWQgZmlsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRbXSByZW1vdmVPcnBoYW5GaWxlcyhTZXQgbm9uT3JwaGFucywgRmlsZSB0b0RpcikgeworICAgICAgICBpbnRbXSByZW1vdmVkQ291bnQgPSBuZXcgaW50W10gezAsIDB9OworICAgICAgICBTdHJpbmdbXSBleGNscyA9CisgICAgICAgICAgICAoU3RyaW5nW10pIG5vbk9ycGhhbnMudG9BcnJheShuZXcgU3RyaW5nW25vbk9ycGhhbnMuc2l6ZSgpICsgMV0pOworICAgICAgICAvLyB3YW50IHRvIGtlZXAgdG9EaXIgaXRzZWxmCisgICAgICAgIGV4Y2xzW25vbk9ycGhhbnMuc2l6ZSgpXSA9ICIiOworCisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBudWxsOworICAgICAgICBpZiAoc3luY1RhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKKyAgICAgICAgICAgIGZzLnNldERpcih0b0Rpcik7CisgICAgICAgICAgICBmcy5zZXRDYXNlU2Vuc2l0aXZlKHN5bmNUYXJnZXQuaXNDYXNlU2Vuc2l0aXZlKCkpOworICAgICAgICAgICAgZnMuc2V0Rm9sbG93U3ltbGlua3Moc3luY1RhcmdldC5pc0ZvbGxvd1N5bWxpbmtzKCkpOworCisgICAgICAgICAgICAvLyBwcmVzZXJ2ZUluVGFyZ2V0IHdvdWxkIGZpbmQgYWxsIGZpbGVzIHdlIHdhbnQgdG8ga2VlcCwKKyAgICAgICAgICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGZpbmQgYWxsIHRoYXQgd2Ugd2FudCB0byBkZWxldGUgLSBzbyB0aGUKKyAgICAgICAgICAgIC8vIG1lYW5pbmcgb2YgYWxsIHBhdHRlcm5zIGFuZCBzZWxlY3RvcnMgbXVzdCBiZSBpbnZlcnRlZAorICAgICAgICAgICAgUGF0dGVyblNldCBwcyA9IHN5bmNUYXJnZXQubWVyZ2VQYXR0ZXJucyhnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgZnMuYXBwZW5kRXhjbHVkZXMocHMuZ2V0SW5jbHVkZVBhdHRlcm5zKGdldFByb2plY3QoKSkpOworICAgICAgICAgICAgZnMuYXBwZW5kSW5jbHVkZXMocHMuZ2V0RXhjbHVkZVBhdHRlcm5zKGdldFByb2plY3QoKSkpOworICAgICAgICAgICAgZnMuc2V0RGVmYXVsdGV4Y2x1ZGVzKCFzeW5jVGFyZ2V0LmdldERlZmF1bHRleGNsdWRlcygpKTsKKworICAgICAgICAgICAgLy8gc2VsZWN0b3JzIGFyZSBpbXBsaWNpdGx5IEFORGVkIGluIERpcmVjdG9yeVNjYW5uZXIuICBUbworICAgICAgICAgICAgLy8gcmV2ZXJ0IHRoZWlyIGxvZ2ljIHdlIHdyYXAgdGhlbSBpbnRvIGEgPG5vbmU+IHNlbGVjdG9yCisgICAgICAgICAgICAvLyBpbnN0ZWFkLgorICAgICAgICAgICAgRmlsZVNlbGVjdG9yW10gcyA9IHN5bmNUYXJnZXQuZ2V0U2VsZWN0b3JzKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBpZiAocy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgTm9uZVNlbGVjdG9yIG5zID0gbmV3IE5vbmVTZWxlY3RvcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBucy5hcHBlbmRTZWxlY3RvcihzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnMuYXBwZW5kU2VsZWN0b3IobnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgICAgICBkcy5zZXRCYXNlZGlyKHRvRGlyKTsKKyAgICAgICAgfQorICAgICAgICBkcy5hZGRFeGNsdWRlcyhleGNscyk7CisKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodG9EaXIsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgIGxvZygiUmVtb3Zpbmcgb3JwaGFuIGZpbGU6ICIgKyBmLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICAgICAgKytyZW1vdmVkQ291bnRbMV07CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gZGlycyA9IGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgLy8gZHMgcmV0dXJucyB0aGUgZGlyZWN0b3JpZXMgaW4gbGV4aWNvZ3JhcGhpYyBvcmRlci4KKyAgICAgICAgLy8gaXRlcmF0aW5nIHRocm91Z2ggdGhlIGFycmF5IGJhY2t3YXJkcyBtZWFucyB3ZSBhcmUgZGVsZXRpbmcKKyAgICAgICAgLy8gbGVhdmVzIGJlZm9yZSB0aGVpciBwYXJlbnQgbm9kZXMgLSB0aHVzIG1ha2luZyBzdXJlICh3ZWxsLAorICAgICAgICAvLyBtb3JlIGxpa2VseSkgdGhhdCB0aGUgZGlyZWN0b3JpZXMgYXJlIGVtcHR5IHdoZW4gd2UgdHJ5IHRvCisgICAgICAgIC8vIGRlbGV0ZSB0aGVtLgorICAgICAgICBmb3IgKGludCBpID0gZGlycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodG9EaXIsIGRpcnNbaV0pOworICAgICAgICAgICAgaWYgKGYubGlzdCgpLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgIGxvZygiUmVtb3Zpbmcgb3JwaGFuIGRpcmVjdG9yeTogIiArIGYsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICArK3JlbW92ZWRDb3VudFswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtb3ZlZENvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIGVtcHR5IGRpcmVjdG9yaWVzIGZyb20gYSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiA8cD48ZW0+Tm90ZSB0aGF0IGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgb25seSBlbXB0eQorICAgICAqIGRpcmVjdG9yaWVzLCBkaXJlY3RseSBvciBub3QsIHdpbGwgYmUgcmVtb3ZlZCE8L2VtPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlJlY3Vyc2VzIGRlcHRoLWZpcnN0IHRvIGZpbmQgdGhlIGxlYWYgZGlyZWN0b3JpZXMKKyAgICAgKiB3aGljaCBhcmUgZW1wdHkgYW5kIHJlbW92ZXMgdGhlbSwgdGhlbiB1bndpbmRzIHRoZQorICAgICAqIHJlY3Vyc2lvbiBzdGFjaywgcmVtb3ZpbmcgZGlyZWN0b3JpZXMgd2hpY2ggaGF2ZQorICAgICAqIGJlY29tZSBlbXB0eSB0aGVtc2VsdmVzLCBldGMuLi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gIGRpciB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gc2NhbiBmb3IgZW1wdHkgZGlyZWN0b3JpZXMuCisgICAgICogQHBhcmFtICByZW1vdmVJZkVtcHR5IHdoZXRoZXIgdG8gcmVtb3ZlIHRoZSByb290IGRpcmVjdG9yeQorICAgICAqICAgICAgICAgaXRzZWxmIGlmIGl0IGJlY29tZXMgZW1wdHkuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVtcHR5IGRpcmVjdG9yaWVzIGFjdHVhbGx5IHJlbW92ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmVtb3ZlRW1wdHlEaXJlY3RvcmllcyhGaWxlIGRpciwgYm9vbGVhbiByZW1vdmVJZkVtcHR5KSB7CisgICAgICAgIGludCByZW1vdmVkQ291bnQgPSAwOworICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGRpci5saXN0RmlsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgICAgICAvLyBUZXN0IGhlcmUgYWdhaW4gdG8gYXZvaWQgbWV0aG9kIGNhbGwgZm9yIG5vbi1kaXJlY3RvcmllcyEKKyAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRDb3VudCArPSByZW1vdmVFbXB0eURpcmVjdG9yaWVzKGZpbGUsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBkaXJlY3RvcnkgbWF5IGhhdmUgYmVjb21lIGVtcHR5Li4uCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZS1xdWVyeSBpdHMgY2hpbGRyZW4gbGlzdCEKKyAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGRpci5saXN0RmlsZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPCAxICYmIHJlbW92ZUlmRW1wdHkpIHsKKyAgICAgICAgICAgICAgICBsb2coIlJlbW92aW5nIGVtcHR5IGRpcmVjdG9yeTogIiArIGRpciwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIGRpci5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICArK3JlbW92ZWRDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtb3ZlZENvdW50OworICAgIH0KKworCisgICAgLy8KKyAgICAvLyBWYXJpb3VzIGNvcHkgYXR0cmlidXRlcy9zdWJlbGVtZW50cyBvZiA8Y29weT4gcGFzc2VkIHRocnUgdG8gPG15Y29weT4KKyAgICAvLworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBkZXN0RGlyIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb2RpcihGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgbXlDb3B5LnNldFRvZGlyKGRlc3REaXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gZm9yY2UgbGlzdGluZyBvZiBhbGwgbmFtZXMgb2YgY29waWVkIGZpbGVzLgorICAgICAqIEBwYXJhbSB2ZXJib3NlIGlmIHRydWUgZm9yY2UgbGlzdGluZyBvZiBhbGwgbmFtZXMgb2YgY29waWVkIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7CisgICAgICAgIG15Q29weS5zZXRWZXJib3NlKHZlcmJvc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZShzKS4KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIGlmIHRydWUgb3ZlcndyaXRlIGFueSBleGlzdGluZyBkZXN0aW5hdGlvbiBmaWxlKHMpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZShib29sZWFuIG92ZXJ3cml0ZSkgeworICAgICAgICBteUNvcHkuc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBjb3B5IGVtcHR5IGRpcmVjdG9yaWVzLgorICAgICAqIEBwYXJhbSBpbmNsdWRlRW1wdHkgSWYgdHJ1ZSBjb3B5IGVtcHR5IGRpcmVjdG9yaWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVFbXB0eURpcnMoYm9vbGVhbiBpbmNsdWRlRW1wdHkpIHsKKyAgICAgICAgbXlDb3B5LnNldEluY2x1ZGVFbXB0eURpcnMoaW5jbHVkZUVtcHR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBmYWxzZSwgbm90ZSBlcnJvcnMgdG8gdGhlIG91dHB1dCBidXQga2VlcCBnb2luZy4KKyAgICAgKiBAcGFyYW0gZmFpbG9uZXJyb3IgdHJ1ZSBvciBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgbXlDb3B5LnNldEZhaWxPbkVycm9yKGZhaWxvbmVycm9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIHRvIGNvcHkuCisgICAgICogQHBhcmFtIHNldCBhIGZpbGVzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7CisgICAgICAgIGFkZChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjb2xsZWN0aW9uIG9mIGZpbGVzeXN0ZW0gcmVzb3VyY2VzIHRvIGNvcHkuCisgICAgICogQHBhcmFtIHJjIGEgcmVzb3VyY2UgY29sbGVjdGlvbgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKFJlc291cmNlQ29sbGVjdGlvbiByYykgeworICAgICAgICBteUNvcHkuYWRkKHJjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gZ2l2ZSBiZWZvcmUgZGVjaWRpbmcgYQorICAgICAqIHRhcmdldCBpcyBvdXQgb2YgZGF0ZS4KKyAgICAgKgorICAgICAqIDxwPkRlZmF1bHQgaXMgMCBtaWxsaXNlY29uZHMsIG9yIDIgc2Vjb25kcyBvbiBET1Mgc3lzdGVtcy48L3A+CisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IGEgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JhbnVsYXJpdHkobG9uZyBncmFudWxhcml0eSkgeworICAgICAgICBteUNvcHkuc2V0R3JhbnVsYXJpdHkoZ3JhbnVsYXJpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29udGFpbmVyIGZvciBwYXR0ZXJucyBhbmQgc2VsZWN0b3JzIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgKiBzcGVjaWZ5IGZpbGVzIHRoYXQgc2hvdWxkIGJlIGtlcHQgaW4gdGhlIHRhcmdldCBldmVuIGlmIHRoZXkKKyAgICAgKiBhcmUgbm90IHByZXNlbnQgaW4gYW55IHNvdXJjZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3QgaW52b2tlIHRoaXMgbWV0aG9kIG1vcmUgdGhhbiBvbmNlLjwvcD4KKyAgICAgKiBAcGFyYW0gcyBhIHByZXNlcnZlaW50YXJnZXQgbmVzdGVkIGVsZW1lbnQKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByZXNlcnZlSW5UYXJnZXQoU3luY1RhcmdldCBzKSB7CisgICAgICAgIGlmIChzeW5jVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigieW91IG11c3Qgbm90IHNwZWNpZnkgbXVsdGlwbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInByZXNlcnZlaW50YXJnZXQgZWxlbWVudHMuIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY1RhcmdldCA9IHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3MgQ29weSBpbiBvcmRlciB0byBhY2Nlc3MgaXQncyBmaWxlL2RpciBtYXBzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDb3B5IGV4dGVuZHMgQ29weSB7CisKKyAgICAgICAgLy8gTGlzdCBvZiBmaWxlcyB0aGF0IG11c3QgYmUgY29waWVkLCBpcnJlbGV2YW50IGZyb20gdGhlCisgICAgICAgIC8vIGZhY3QgdGhhdCB0aGV5IGFyZSBuZXdlciBvciBub3QgdGhhbiB0aGUgZGVzdGluYXRpb24uCisgICAgICAgIHByaXZhdGUgU2V0IG5vbk9ycGhhbnMgPSBuZXcgSGFzaFNldCgpOworCisgICAgICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgTXlDb3B5LiAqLworICAgICAgICBwdWJsaWMgTXlDb3B5KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgQ29weSNzY2FuKEZpbGUsIEZpbGUsIFN0cmluZ1tdLCBTdHJpbmdbXSkKKyAgICAgICAgICovCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNjYW4oRmlsZSBmcm9tRGlyLCBGaWxlIHRvRGlyLCBTdHJpbmdbXSBmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBkaXJzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBtYXBwZXIiLCBtYXBwZXJFbGVtZW50ID09IG51bGwpOworCisgICAgICAgICAgICBzdXBlci5zY2FuKGZyb21EaXIsIHRvRGlyLCBmaWxlcywgZGlycyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBub25PcnBoYW5zLmFkZChmaWxlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBub25PcnBoYW5zLmFkZChkaXJzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIENvcHkjc2NhbihSZXNvdXJjZVtdLCBGaWxlKQorICAgICAgICAgKi8KKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICAgICAgcHJvdGVjdGVkIE1hcCBzY2FuKFJlc291cmNlW10gcmVzb3VyY2VzLCBGaWxlIHRvRGlyKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBtYXBwZXIiLCBtYXBwZXJFbGVtZW50ID09IG51bGwpOworCisgICAgICAgICAgICBNYXAgbSA9IHN1cGVyLnNjYW4ocmVzb3VyY2VzLCB0b0Rpcik7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBtLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBub25PcnBoYW5zLmFkZCgoKFJlc291cmNlKSBpdGVyLm5leHQoKSkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGaWxlIGdldFRvRGlyKCkgeworICAgICAgICAgICAgcmV0dXJuIGRlc3REaXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBpbmNsdWRlRW1wdHlEaXJzIGF0dHJpYnV0ZS4KKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIGVtcHR5RGlycyBhcmUgdG8gYmUgaW5jbHVkZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVFbXB0eURpcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5jbHVkZUVtcHR5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFllcywgd2UgY2FuLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzLgorICAgICAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbm5lciBjbGFzcyB1c2VkIHRvIGhvbGQgZXhjbHVkZSBwYXR0ZXJucyBhbmQgc2VsZWN0b3JzIHRvIHNhdmUKKyAgICAgKiBzdHVmZiB0aGF0IGhhcHBlbnMgdG8gbGl2ZSBpbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBidXQgc2hvdWxkCisgICAgICogbm90IGdldCByZW1vdmVkLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN5bmNUYXJnZXQgZXh0ZW5kcyBBYnN0cmFjdEZpbGVTZXQgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU3luY1RhcmdldC4KKyAgICAgICAgICogVGhpcyBqdXN0IGNoYW5nZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgImRlZmF1bHRleGNsdWRlcyIgZnJvbQorICAgICAgICAgKiB0cnVlIHRvIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN5bmNUYXJnZXQoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIEFic3RyYWN0RmlsZVNldCNzZXREaXIoRmlsZSkgdG8gZGlzYWxsb3cKKyAgICAgICAgICogc2V0dGluZyB0aGUgZGlyZWN0b3J5LgorICAgICAgICAgKiBAcGFyYW0gZGlyIGlnbm9yZWQKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicHJlc2VydmVpbnRhcmdldCBkb2Vzbid0IHN1cHBvcnQgdGhlIGRpciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFBzZXVkby1hc3NlcnQgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0VHJ1ZShTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBjb25kaXRpb24pIHsKKyAgICAgICAgaWYgKCFjb25kaXRpb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXNzZXJ0aW9uIEVycm9yOiAiICsgbWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwOGE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhci5qYXZhCkBAIC0wLDAgKzEsOTUyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkFyY2hpdmVGaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkFyY2hpdmVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TZWxlY3RvclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5UYXJSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLk1lcmdpbmdNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Tb3VyY2VGaWxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmJ6aXAyLkNCWmlwMk91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnRhci5UYXJDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy50YXIuVGFyRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy50YXIuVGFyT3V0cHV0U3RyZWFtOworCisvKioKKyAqIENyZWF0ZXMgYSB0YXIgYXJjaGl2ZS4KKyAqCisgKiBAc2luY2UgQW50IDEuMQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0icGFja2FnaW5nIgorICovCitwdWJsaWMgY2xhc3MgVGFyIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA4ICogMTAyNDsKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFRhci5XQVJOIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlcGxhY2VkIHdpdGgKKyAgICAgKiAgICAgICAgICAgICBUYXIuVGFyTG9uZ0ZpbGVNb2RlLldBUk4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOID0gIndhcm4iOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFRhci5GQUlMIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlcGxhY2VkIHdpdGgKKyAgICAgKiAgICAgICAgICAgICBUYXIuVGFyTG9uZ0ZpbGVNb2RlLkZBSUwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMID0gImZhaWwiOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFRhci5UUlVOQ0FURSBpcyBkZXByZWNhdGVkIGFuZCBpcyByZXBsYWNlZCB3aXRoCisgICAgICogICAgICAgICAgICAgVGFyLlRhckxvbmdGaWxlTW9kZS5UUlVOQ0FURQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVU5DQVRFID0gInRydW5jYXRlIjsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KKyAgICAgKiAgICAgICAgICAgICBUYXIuR05VIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlcGxhY2VkIHdpdGgKKyAgICAgKiAgICAgICAgICAgICBUYXIuVGFyTG9uZ0ZpbGVNb2RlLkdOVQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdOVSA9ICJnbnUiOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFRhci5PTUlUIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlcGxhY2VkIHdpdGgKKyAgICAgKiAgICAgICAgICAgICBUYXIuVGFyTG9uZ0ZpbGVNb2RlLk9NSVQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlUID0gIm9taXQiOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICBGaWxlIHRhckZpbGU7CisgICAgRmlsZSBiYXNlRGlyOworCisgICAgcHJpdmF0ZSBUYXJMb25nRmlsZU1vZGUgbG9uZ0ZpbGVNb2RlID0gbmV3IFRhckxvbmdGaWxlTW9kZSgpOworCisgICAgLy8gbmVlZCB0byBrZWVwIHRoZSBwYWNrYWdlIHByaXZhdGUgdmVyc2lvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgLy8gd2UgbXVzdCBrZWVwIHR3byBsaXN0cyBzaW5jZSBvdGhlciBjbGFzc2VzIG1heSBtb2RpZnkgdGhlCisgICAgLy8gZmlsZXNldHMgVmVjdG9yIChpdCBpcyBwYWNrYWdlIHByaXZhdGUpIHdpdGhvdXQgdXMgbm90aWNpbmcKKyAgICBwcml2YXRlIFZlY3RvciByZXNvdXJjZUNvbGxlY3Rpb25zID0gbmV3IFZlY3RvcigpOworCisgICAgVmVjdG9yIGZpbGVTZXRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBoYXMgYmVlbiB3YXJuZWQgYWJvdXQgbG9uZyBmaWxlcyBhbHJlYWR5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBsb25nV2FybmluZ0dpdmVuID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFRhckNvbXByZXNzaW9uTWV0aG9kIGNvbXByZXNzaW9uID0gbmV3IFRhckNvbXByZXNzaW9uTWV0aG9kKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgZmlsZXNldCB3aXRoIHRoZSBvcHRpb24gdG8gc3BlY2lmeSBwZXJtaXNzaW9ucworICAgICAqIEByZXR1cm4gdGhlIHRhciBmaWxlc2V0IHRvIGJlIHVzZWQgYXMgdGhlIG5lc3RlZCBlbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBUYXJGaWxlU2V0IGNyZWF0ZVRhckZpbGVTZXQoKSB7CisgICAgICAgIFRhckZpbGVTZXQgZnMgPSBuZXcgVGFyRmlsZVNldCgpOworICAgICAgICBmcy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIGZpbGVzZXRzLmFkZEVsZW1lbnQoZnMpOworICAgICAgICByZXR1cm4gZnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdG8gYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gcmVzIGEgcmVzb3VyY2UgY29sbGVjdGlvbiB0byBhcmNoaXZlLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKFJlc291cmNlQ29sbGVjdGlvbiByZXMpIHsKKyAgICAgICAgcmVzb3VyY2VDb2xsZWN0aW9ucy5hZGQocmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgaXMgdGhlIG5hbWUvbG9jYXRpb24gb2Ygd2hlcmUgdG8gY3JlYXRlIHRoZSB0YXIgZmlsZS4KKyAgICAgKiBAcGFyYW0gdGFyRmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIHRhciBmaWxlLgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIEZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHRhc2tzLCBwbGVhc2UgdXNlIHNldERlc3RGaWxlKCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZmlsZShGaWxlIHRhckZpbGUpIHsKKyAgICAgICAgdGhpcy50YXJGaWxlID0gdGFyRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgaXMgdGhlIG5hbWUvbG9jYXRpb24gb2Ygd2hlcmUgdG8gY3JlYXRlIHRoZSB0YXIgZmlsZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqIEBwYXJhbSBkZXN0RmlsZSBUaGUgb3V0cHV0IG9mIHRoZSB0YXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0RmlsZShGaWxlIGRlc3RGaWxlKSB7CisgICAgICAgIHRoaXMudGFyRmlsZSA9IGRlc3RGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGxvb2sgaW4gZm9yIHRoaW5ncyB0byB0YXIuCisgICAgICogQHBhcmFtIGJhc2VEaXIgdGhlIGJhc2UgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VkaXIoRmlsZSBiYXNlRGlyKSB7CisgICAgICAgIHRoaXMuYmFzZURpciA9IGJhc2VEaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGhvdyB0byBoYW5kbGUgbG9uZyBmaWxlcywgdGhvc2Ugd2l0aCBhIHBhdGgmZ3Q7MTAwIGNoYXJzLgorICAgICAqIE9wdGlvbmFsLCBkZWZhdWx0PXdhcm4uCisgICAgICogPHA+CisgICAgICogQWxsb3dhYmxlIHZhbHVlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiAgdHJ1bmNhdGUgLSBwYXRocyBhcmUgdHJ1bmNhdGVkIHRvIHRoZSBtYXhpbXVtIGxlbmd0aAorICAgICAqIDxsaT4gIGZhaWwgLSBwYXRocyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gY2F1c2UgYSBidWlsZCBleGNlcHRpb24KKyAgICAgKiA8bGk+ICB3YXJuIC0gcGF0aHMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGNhdXNlIGEgd2FybmluZyBhbmQgR05VIGlzIHVzZWQKKyAgICAgKiA8bGk+ICBnbnUgLSBHTlUgZXh0ZW5zaW9ucyBhcmUgdXNlZCBmb3IgYW55IHBhdGhzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bS4KKyAgICAgKiA8bGk+ICBvbWl0IC0gcGF0aHMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGFyZSBvbWl0dGVkIGZyb20gdGhlIGFyY2hpdmUKKyAgICAgKiA8L3VsPgorICAgICAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIHN0cmluZyB0byBoYW5kbGUgbG9uZyBmaWxlcy4KKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KKyAgICAgKiAgICAgICAgICAgICBzZXRMb25nRmlsZShTdHJpbmcpIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlcGxhY2VkIHdpdGgKKyAgICAgKiAgICAgICAgICAgICBzZXRMb25nRmlsZShUYXIuVGFyTG9uZ0ZpbGVNb2RlKSB0byBtYWtlIEFudCdzIEludHJvc3BlY3Rpb24KKyAgICAgKiAgICAgICAgICAgICBtZWNoYW5pc20gZG8gdGhlIHdvcmsgYW5kIGFsc28gdG8gZW5jYXBzdWxhdGUgb3BlcmF0aW9ucyBvbgorICAgICAqICAgICAgICAgICAgIHRoZSBtb2RlIGluIGl0cyBvd24gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9uZ2ZpbGUoU3RyaW5nIG1vZGUpIHsKKyAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIHNldExvbmdmaWxlKFN0cmluZykgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIgorICAgICAgICAgICAgKyAiIFVzZSBzZXRMb25nZmlsZShUYXIuVGFyTG9uZ0ZpbGVNb2RlKSBpbnN0ZWFkLiIpOworICAgICAgICB0aGlzLmxvbmdGaWxlTW9kZSA9IG5ldyBUYXJMb25nRmlsZU1vZGUoKTsKKyAgICAgICAgbG9uZ0ZpbGVNb2RlLnNldFZhbHVlKG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBob3cgdG8gaGFuZGxlIGxvbmcgZmlsZXMsIHRob3NlIHdpdGggYSBwYXRoJmd0OzEwMCBjaGFycy4KKyAgICAgKiBPcHRpb25hbCwgZGVmYXVsdD13YXJuLgorICAgICAqIDxwPgorICAgICAqIEFsbG93YWJsZSB2YWx1ZXMgYXJlCisgICAgICogPHVsPgorICAgICAqIDxsaT4gIHRydW5jYXRlIC0gcGF0aHMgYXJlIHRydW5jYXRlZCB0byB0aGUgbWF4aW11bSBsZW5ndGgKKyAgICAgKiA8bGk+ICBmYWlsIC0gcGF0aHMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGNhdXNlIGEgYnVpbGQgZXhjZXB0aW9uCisgICAgICogPGxpPiAgd2FybiAtIHBhdGhzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBjYXVzZSBhIHdhcm5pbmcgYW5kIEdOVSBpcyB1c2VkCisgICAgICogPGxpPiAgZ251IC0gR05VIGV4dGVuc2lvbnMgYXJlIHVzZWQgZm9yIGFueSBwYXRocyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0uCisgICAgICogPGxpPiAgb21pdCAtIHBhdGhzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBhcmUgb21pdHRlZCBmcm9tIHRoZSBhcmNoaXZlCisgICAgICogPC91bD4KKyAgICAgKiBAcGFyYW0gbW9kZSB0aGUgbW9kZSB0byBoYW5kbGUgbG9uZyBmaWxlIG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvbmdmaWxlKFRhckxvbmdGaWxlTW9kZSBtb2RlKSB7CisgICAgICAgIHRoaXMubG9uZ0ZpbGVNb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgY29tcHJlc3Npb24gbWV0aG9kLgorICAgICAqIEFsbG93YWJsZSB2YWx1ZXMgYXJlCisgICAgICogPHVsPgorICAgICAqIDxsaT4gIG5vbmUgLSBubyBjb21wcmVzc2lvbgorICAgICAqIDxsaT4gIGd6aXAgLSBHemlwIGNvbXByZXNzaW9uCisgICAgICogPGxpPiAgYnppcDIgLSBCemlwMiBjb21wcmVzc2lvbgorICAgICAqIDwvdWw+CisgICAgICogQHBhcmFtIG1vZGUgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvbihUYXJDb21wcmVzc2lvbk1ldGhvZCBtb2RlKSB7CisgICAgICAgIHRoaXMuY29tcHJlc3Npb24gPSBtb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRvIHRoZSBidXNpbmVzcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRhckZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0YXJmaWxlIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhckZpbGUuZXhpc3RzKCkgJiYgdGFyRmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRhcmZpbGUgaXMgYSBkaXJlY3RvcnkhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YXJGaWxlLmV4aXN0cygpICYmICF0YXJGaWxlLmNhbldyaXRlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuIG5vdCB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIHRhcmZpbGUhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvciBzYXZlZEZpbGVTZXRzID0gKFZlY3RvcikgZmlsZXNldHMuY2xvbmUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJhc2VEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJiYXNlZGlyIGRvZXMgbm90IGV4aXN0ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1haW4gZmlsZXNldCB0byB0aGUgbGlzdCBvZiBmaWxlc2V0cyB0byBwcm9jZXNzLgorICAgICAgICAgICAgICAgIFRhckZpbGVTZXQgbWFpbkZpbGVTZXQgPSBuZXcgVGFyRmlsZVNldChmaWxlc2V0KTsKKyAgICAgICAgICAgICAgICBtYWluRmlsZVNldC5zZXREaXIoYmFzZURpcik7CisgICAgICAgICAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChtYWluRmlsZVNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWxlc2V0cy5zaXplKCkgPT0gMCAmJiByZXNvdXJjZUNvbGxlY3Rpb25zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBzdXBwbHkgZWl0aGVyIGEgYmFzZWRpciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZSBvciBzb21lIG5lc3RlZCByZXNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNvbGxlY3Rpb25zLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjaGVjayBpZiB0YXIgaXMgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvIGVhY2gKKyAgICAgICAgICAgIC8vIGZpbGVzZXQKKyAgICAgICAgICAgIGJvb2xlYW4gdXBUb0RhdGUgPSB0cnVlOworICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZmlsZXNldHMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICB1cFRvRGF0ZSAmPSBjaGVjaygoVGFyRmlsZVNldCkgZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHJlc291cmNlQ29sbGVjdGlvbnMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICB1cFRvRGF0ZSAmPSBjaGVjaygoUmVzb3VyY2VDb2xsZWN0aW9uKSBlLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodXBUb0RhdGUpIHsKKyAgICAgICAgICAgICAgICBsb2coIk5vdGhpbmcgdG8gZG86ICIgKyB0YXJGaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICsgIiBpcyB1cCB0byBkYXRlLiIsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9nKCJCdWlsZGluZyB0YXI6ICIgKyB0YXJGaWxlLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19JTkZPKTsKKworICAgICAgICAgICAgVGFyT3V0cHV0U3RyZWFtIHRPdXQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0T3V0ID0gbmV3IFRhck91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb24uY29tcHJlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyRmlsZSkpKSk7CisgICAgICAgICAgICAgICAgdE91dC5zZXREZWJ1Zyh0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAobG9uZ0ZpbGVNb2RlLmlzVHJ1bmNhdGVNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdE91dC5zZXRMb25nRmlsZU1vZGUoVGFyT3V0cHV0U3RyZWFtLkxPTkdGSUxFX1RSVU5DQVRFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdGaWxlTW9kZS5pc0ZhaWxNb2RlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBsb25nRmlsZU1vZGUuaXNPbWl0TW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRPdXQuc2V0TG9uZ0ZpbGVNb2RlKFRhck91dHB1dFN0cmVhbS5MT05HRklMRV9FUlJPUik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FybiBvciBHTlUKKyAgICAgICAgICAgICAgICAgICAgdE91dC5zZXRMb25nRmlsZU1vZGUoVGFyT3V0cHV0U3RyZWFtLkxPTkdGSUxFX0dOVSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbG9uZ1dhcm5pbmdHaXZlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGZpbGVzZXRzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgICBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgICAgICB0YXIoKFRhckZpbGVTZXQpIGUubmV4dEVsZW1lbnQoKSwgdE91dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHJlc291cmNlQ29sbGVjdGlvbnMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgIGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgIHRhcigoUmVzb3VyY2VDb2xsZWN0aW9uKSBlLm5leHRFbGVtZW50KCksIHRPdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUHJvYmxlbSBjcmVhdGluZyBUQVI6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh0T3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbGVzZXRzID0gc2F2ZWRGaWxlU2V0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRhciBhIGZpbGUKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byB0YXIKKyAgICAgKiBAcGFyYW0gdE91dCB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSB2UGF0aCB0aGUgcGF0aCBuYW1lIG9mIHRoZSBmaWxlIHRvIHRhcgorICAgICAqIEBwYXJhbSB0YXJGaWxlU2V0IHRoZSBmaWxlc2V0IHRoYXQgdGhlIGZpbGUgY2FtZSBmcm9tLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0YXJGaWxlKEZpbGUgZmlsZSwgVGFyT3V0cHV0U3RyZWFtIHRPdXQsIFN0cmluZyB2UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhckZpbGVTZXQgdGFyRmlsZVNldCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGUuZXF1YWxzKHRhckZpbGUpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgYXJjaGl2ZSBpcyBidWlsdCBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGl0IGlzCisgICAgICAgICAgICAvLyBtYXRjaGVkIGJ5IGEgcmVzb3VyY2UgY29sbGVjdGlvbiwgdGhlbiBpdCBoYXNuJ3QgYmVlbgorICAgICAgICAgICAgLy8gZm91bmQgaW4gY2hlY2sgKGl0IGhhc24ndCBiZWVuIHRoZXJlKSBidXQgd2lsbCBiZQorICAgICAgICAgICAgLy8gaW5jbHVkZWQgbm93LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uIHRoZSBvbGQgY29kZSB3b3VsZCBzaW1wbHkgc2tpcAorICAgICAgICAgICAgLy8gdGhlIGVudHJ5IGFuZCBub3QgZmFpbCwgZG8gdGhlIHNhbWUgbm93IGZvciBiYWNrd2FyZHMKKyAgICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gIFdpdGhvdXQgdGhpcywgdGhlIHdoaWNoNGogYnVpbGQKKyAgICAgICAgICAgIC8vIGZhaWxzIGluIEd1bXAKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0YXJSZXNvdXJjZShuZXcgRmlsZVJlc291cmNlKGZpbGUpLCB0T3V0LCB2UGF0aCwgdGFyRmlsZVNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGFyIGEgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gciB0aGUgcmVzb3VyY2UgdG8gdGFyCisgICAgICogQHBhcmFtIHRPdXQgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gdlBhdGggdGhlIHBhdGggbmFtZSBvZiB0aGUgZmlsZSB0byB0YXIKKyAgICAgKiBAcGFyYW0gdGFyRmlsZVNldCB0aGUgZmlsZXNldCB0aGF0IHRoZSBmaWxlIGNhbWUgZnJvbSwgbWF5IGJlIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGFyUmVzb3VyY2UoUmVzb3VyY2UgciwgVGFyT3V0cHV0U3RyZWFtIHRPdXQsIFN0cmluZyB2UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJGaWxlU2V0IHRhckZpbGVTZXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFyLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YXJGaWxlU2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmdWxscGF0aCA9IHRhckZpbGVTZXQuZ2V0RnVsbHBhdGgodGhpcy5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgaWYgKGZ1bGxwYXRoLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHZQYXRoID0gZnVsbHBhdGg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCAiIiB0byB0aGUgYXJjaGl2ZQorICAgICAgICAgICAgICAgIGlmICh2UGF0aC5sZW5ndGgoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gdGFyRmlsZVNldC5nZXRQcmVmaXgodGhpcy5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIC8vICcvJyBpcyBhcHBlbmRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB6aXAgdGFzay4KKyAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCAmJiAhcHJlZml4LmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4ICsgIi8iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2UGF0aCA9IHByZWZpeCArIHZQYXRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodlBhdGguc3RhcnRzV2l0aCgiLyIpCisgICAgICAgICAgICAgICAgJiYgIXRhckZpbGVTZXQuZ2V0UHJlc2VydmVMZWFkaW5nU2xhc2hlcygpKSB7CisgICAgICAgICAgICAgICAgaW50IGwgPSB2UGF0aC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpZiAobCA8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdvdWxkIGVuZCB1cCBhZGRpbmcgIiIgdG8gdGhlIGFyY2hpdmUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2UGF0aCA9IHZQYXRoLnN1YnN0cmluZygxLCBsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyLmlzRGlyZWN0b3J5KCkgJiYgIXZQYXRoLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHZQYXRoICs9ICIvIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2UGF0aC5sZW5ndGgoKSA+PSBUYXJDb25zdGFudHMuTkFNRUxFTikgeworICAgICAgICAgICAgaWYgKGxvbmdGaWxlTW9kZS5pc09taXRNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBsb2coIk9taXR0aW5nOiAiICsgdlBhdGgsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobG9uZ0ZpbGVNb2RlLmlzV2Fybk1vZGUoKSkgeworICAgICAgICAgICAgICAgIGxvZygiRW50cnk6ICIgKyB2UGF0aCArICIgbG9uZ2VyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICArIFRhckNvbnN0YW50cy5OQU1FTEVOICsgIiBjaGFyYWN0ZXJzLiIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIGlmICghbG9uZ1dhcm5pbmdHaXZlbikgeworICAgICAgICAgICAgICAgICAgICBsb2coIlJlc3VsdGluZyB0YXIgZmlsZSBjYW4gb25seSBiZSBwcm9jZXNzZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAic3VjY2Vzc2Z1bGx5IGJ5IEdOVSBjb21wYXRpYmxlIHRhciBjb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZ1dhcm5pbmdHaXZlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChsb25nRmlsZU1vZGUuaXNGYWlsTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFbnRyeTogIiArIHZQYXRoCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbG9uZ2VyIHRoYW4gIiArIFRhckNvbnN0YW50cy5OQU1FTEVOCisgICAgICAgICAgICAgICAgICAgICAgICArICJjaGFyYWN0ZXJzLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVGFyRW50cnkgdGUgPSBuZXcgVGFyRW50cnkodlBhdGgpOworICAgICAgICB0ZS5zZXRNb2RUaW1lKHIuZ2V0TGFzdE1vZGlmaWVkKCkpOworICAgICAgICAvLyBwcmVzZXJ2ZSBwZXJtaXNzaW9ucworICAgICAgICBpZiAociBpbnN0YW5jZW9mIEFyY2hpdmVSZXNvdXJjZSkgeworICAgICAgICAgICAgQXJjaGl2ZVJlc291cmNlIGFyID0gKEFyY2hpdmVSZXNvdXJjZSkgcjsKKyAgICAgICAgICAgIHRlLnNldE1vZGUoYXIuZ2V0TW9kZSgpKTsKKyAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgVGFyUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBUYXJSZXNvdXJjZSB0ciA9IChUYXJSZXNvdXJjZSkgcjsKKyAgICAgICAgICAgICAgICB0ZS5zZXRVc2VyTmFtZSh0ci5nZXRVc2VyTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB0ZS5zZXRVc2VySWQodHIuZ2V0VWlkKCkpOworICAgICAgICAgICAgICAgIHRlLnNldEdyb3VwTmFtZSh0ci5nZXRHcm91cCgpKTsKKyAgICAgICAgICAgICAgICB0ZS5zZXRHcm91cElkKHRyLmdldEdpZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBpZiAoci5zaXplKCkgPiBUYXJDb25zdGFudHMuTUFYU0laRSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlOiAiICsgciArICIgbGFyZ2VyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICArIFRhckNvbnN0YW50cy5NQVhTSVpFICsgIiBieXRlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlLnNldFNpemUoci5nZXRTaXplKCkpOworICAgICAgICAgICAgLy8gb3ZlcnJpZGUgcGVybWlzc2lvbnMgaWYgc2V0IGV4cGxpY2l0bHkKKyAgICAgICAgICAgIGlmICh0YXJGaWxlU2V0ICE9IG51bGwgJiYgdGFyRmlsZVNldC5oYXNGaWxlTW9kZUJlZW5TZXQoKSkgeworICAgICAgICAgICAgICAgIHRlLnNldE1vZGUodGFyRmlsZVNldC5nZXRNb2RlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRhckZpbGVTZXQgIT0gbnVsbCAmJiB0YXJGaWxlU2V0Lmhhc0Rpck1vZGVCZWVuU2V0KCkpIHsKKyAgICAgICAgICAgIC8vIG92ZXJyaWRlIHBlcm1pc3Npb25zIGlmIHNldCBleHBsaWNpdGx5CisgICAgICAgICAgICB0ZS5zZXRNb2RlKHRhckZpbGVTZXQuZ2V0RGlyTW9kZSh0aGlzLmdldFByb2plY3QoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhckZpbGVTZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gb25seSBvdmVycmlkZSBwZXJtaXNzaW9ucyBpZiBzZXQgZXhwbGljaXRseQorICAgICAgICAgICAgaWYgKHRhckZpbGVTZXQuaGFzVXNlck5hbWVCZWVuU2V0KCkpIHsKKyAgICAgICAgICAgICAgICB0ZS5zZXRVc2VyTmFtZSh0YXJGaWxlU2V0LmdldFVzZXJOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRhckZpbGVTZXQuaGFzR3JvdXBCZWVuU2V0KCkpIHsKKyAgICAgICAgICAgICAgICB0ZS5zZXRHcm91cE5hbWUodGFyRmlsZVNldC5nZXRHcm91cCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0YXJGaWxlU2V0Lmhhc1VzZXJJZEJlZW5TZXQoKSkgeworICAgICAgICAgICAgICAgIHRlLnNldFVzZXJJZCh0YXJGaWxlU2V0LmdldFVpZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0YXJGaWxlU2V0Lmhhc0dyb3VwSWRCZWVuU2V0KCkpIHsKKyAgICAgICAgICAgICAgICB0ZS5zZXRHcm91cElkKHRhckZpbGVTZXQuZ2V0R2lkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdE91dC5wdXROZXh0RW50cnkodGUpOworCisgICAgICAgICAgICBpZiAoIXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGluID0gci5nZXRJbnB1dFN0cmVhbSgpOworCisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdE91dC53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoY291bnQgIT0gLTEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0T3V0LmNsb3NlRW50cnkoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgYXJjaGl2ZSB1cCB0byBkYXRlIGluIHJlbGF0aW9uc2hpcCB0byBhIGxpc3Qgb2YgZmlsZXMuCisgICAgICogQHBhcmFtIGZpbGVzIHRoZSBmaWxlcyB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXJjaGl2ZSBpcyB1cCB0byBkYXRlLgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIHVzZSB0aGUgdHdvLWFyZyB2ZXJzaW9uIGluc3RlYWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJjaGl2ZUlzVXBUb0RhdGUoU3RyaW5nW10gZmlsZXMpIHsKKyAgICAgICAgcmV0dXJuIGFyY2hpdmVJc1VwVG9EYXRlKGZpbGVzLCBiYXNlRGlyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgYXJjaGl2ZSB1cCB0byBkYXRlIGluIHJlbGF0aW9uc2hpcCB0byBhIGxpc3Qgb2YgZmlsZXMuCisgICAgICogQHBhcmFtIGZpbGVzIHRoZSBmaWxlcyB0byBjaGVjaworICAgICAqIEBwYXJhbSBkaXIgICB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlcy4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFyY2hpdmUgaXMgdXAgdG8gZGF0ZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJjaGl2ZUlzVXBUb0RhdGUoU3RyaW5nW10gZmlsZXMsIEZpbGUgZGlyKSB7CisgICAgICAgIFNvdXJjZUZpbGVTY2FubmVyIHNmcyA9IG5ldyBTb3VyY2VGaWxlU2Nhbm5lcih0aGlzKTsKKyAgICAgICAgTWVyZ2luZ01hcHBlciBtbSA9IG5ldyBNZXJnaW5nTWFwcGVyKCk7CisgICAgICAgIG1tLnNldFRvKHRhckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICByZXR1cm4gc2ZzLnJlc3RyaWN0KGZpbGVzLCBkaXIsIG51bGwsIG1tKS5sZW5ndGggPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgYXJjaGl2ZSB1cCB0byBkYXRlIGluIHJlbGF0aW9uc2hpcCB0byBhIGxpc3Qgb2YgZmlsZXMuCisgICAgICogQHBhcmFtIHIgdGhlIGZpbGVzIHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhcmNoaXZlIGlzIHVwIHRvIGRhdGUuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcmNoaXZlSXNVcFRvRGF0ZShSZXNvdXJjZSByKSB7CisgICAgICAgIHJldHVybiBTZWxlY3RvclV0aWxzLmlzT3V0T2ZEYXRlKG5ldyBGaWxlUmVzb3VyY2UodGFyRmlsZSksIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0YXNrIGNhbiBkZWFsIHdpdGggbm9uLWZpbGUgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgb25seSBpZiB0aGlzIHRhc2sgaXMKKyAgICAgKiAmbHQ7dGFyJmd0Oy4gIEFueSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzIHRoYXQgYWxzbyB3YW50cyB0bworICAgICAqIHN1cHBvcnQgbm9uLWZpbGUgcmVzb3VyY2VzIG5lZWRzIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiAgV2UKKyAgICAgKiBuZWVkIHRvIGRvIHNvIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zIHNpbmNlIHdlCisgICAgICogY2FuJ3QgZXhwZWN0IHN1YmNsYXNzZXMgdG8gc3VwcG9ydCByZXNvdXJjZXMuPC9wPgorICAgICAqIEByZXR1cm4gdHJ1ZSBmb3IgdGhpcyB0YXNrLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5lcXVhbHMoVGFyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgYXJjaGl2ZSBpcyBvdXQtb2YtZGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlIHJlc291cmNlcworICAgICAqIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogPHA+QWxzbyBjaGVja3MgdGhhdCBlaXRoZXIgYWxsIGNvbGxlY3Rpb25zIG9ubHkgY29udGFpbiBmaWxlCisgICAgICogcmVzb3VyY2VzIG9yIHRoaXMgY2xhc3Mgc3VwcG9ydHMgbm9uLWZpbGUgY29sbGVjdGlvbnMuPC9wPgorICAgICAqCisgICAgICogPHA+QW5kIC0gaW4gY2FzZSBvZiBmaWxlLWNvbGxlY3Rpb25zIC0gZW5zdXJlcyB0aGF0IHRoZSBhcmNoaXZlIHdvbid0CisgICAgICogY29udGFpbiBpdHNlbGYuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJjIHRoZSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIGNoZWNrCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBhcmNoaXZlIGlzIHVwLXRvLWRhdGUKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrKFJlc291cmNlQ29sbGVjdGlvbiByYykgeworICAgICAgICBib29sZWFuIHVwVG9EYXRlID0gdHJ1ZTsKKyAgICAgICAgaWYgKGlzRmlsZUZpbGVTZXQocmMpKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIHJjOworICAgICAgICAgICAgdXBUb0RhdGUgPSBjaGVjayhmcy5nZXREaXIoZ2V0UHJvamVjdCgpKSwgZ2V0RmlsZU5hbWVzKGZzKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIXJjLmlzRmlsZXN5c3RlbU9ubHkoKSAmJiAhc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib25seSBmaWxlc3lzdGVtIHJlc291cmNlcyBhcmUgc3VwcG9ydGVkIik7CisgICAgICAgIH0gZWxzZSBpZiAocmMuaXNGaWxlc3lzdGVtT25seSgpKSB7CisgICAgICAgICAgICBIYXNoU2V0IGJhc2VkaXJzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIEhhc2hNYXAgYmFzZWRpclRvRmlsZXNNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHJjLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlUmVzb3VyY2UgciA9IChGaWxlUmVzb3VyY2UpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIEZpbGUgYmFzZSA9IHIuZ2V0QmFzZURpcigpOworICAgICAgICAgICAgICAgIGlmIChiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA9IENvcHkuTlVMTF9GSUxFX1BMQUNFSE9MREVSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiYXNlZGlycy5hZGQoYmFzZSk7CisgICAgICAgICAgICAgICAgVmVjdG9yIGZpbGVzID0gKFZlY3RvcikgYmFzZWRpclRvRmlsZXNNYXAuZ2V0KGJhc2UpOworICAgICAgICAgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgICAgICAgICBiYXNlZGlyVG9GaWxlc01hcC5wdXQoYmFzZSwgbmV3IFZlY3RvcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsZXMuYWRkKHIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGl0ZXIgPSBiYXNlZGlycy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBiYXNlID0gKEZpbGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFZlY3RvciBmID0gKFZlY3RvcikgYmFzZWRpclRvRmlsZXNNYXAuZ2V0KGJhc2UpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gKFN0cmluZ1tdKSBmLnRvQXJyYXkobmV3IFN0cmluZ1tmLnNpemUoKV0pOworICAgICAgICAgICAgICAgIHVwVG9EYXRlICY9CisgICAgICAgICAgICAgICAgICAgIGNoZWNrKGJhc2UgPT0gQ29weS5OVUxMX0ZJTEVfUExBQ0VIT0xERVIgPyBudWxsIDogYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBub24tZmlsZSByZXNvdXJjZXMKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSByYy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKHVwVG9EYXRlICYmIGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2UgciA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgdXBUb0RhdGUgPSBhcmNoaXZlSXNVcFRvRGF0ZShyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXBUb0RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGFyY2hpdmUgaXMgb3V0LW9mLWRhdGUgd2l0aCByZXNwZWN0IHRvIHRoZQorICAgICAqIGdpdmVuIGZpbGVzLCBlbnN1cmVzIHRoYXQgdGhlIGFyY2hpdmUgd29uJ3QgY29udGFpbiBpdHNlbGYuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VkaXIgYmFzZSBkaXJlY3RvcnkgZm9yIGZpbGUgbmFtZXMKKyAgICAgKiBAcGFyYW0gZmlsZXMgYXJyYXkgb2YgcmVsYXRpdmUgZmlsZSBuYW1lcworICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgYXJjaGl2ZSBpcyB1cC10by1kYXRlCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjayhGaWxlIGJhc2VkaXIsIFN0cmluZ1tdIGZpbGVzKSB7CisgICAgICAgIGJvb2xlYW4gdXBUb0RhdGUgPSB0cnVlOworICAgICAgICBpZiAoIWFyY2hpdmVJc1VwVG9EYXRlKGZpbGVzLCBiYXNlZGlyKSkgeworICAgICAgICAgICAgdXBUb0RhdGUgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmICh0YXJGaWxlLmVxdWFscyhuZXcgRmlsZShiYXNlZGlyLCBmaWxlc1tpXSkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBIHRhciBmaWxlIGNhbm5vdCBpbmNsdWRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXRzZWxmIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVwVG9EYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyBjb2xsZWN0aW9uIHRvIHRoZSBhcmNoaXZlLgorICAgICAqCisgICAgICogPHA+VXNlcyB0aGUgZmlsZSBiYXNlZCBtZXRob2RzIGZvciBmaWxlIHJlc291cmNlcyBmb3IgYmFja3dhcmRzCisgICAgICogY29tcGF0aWJpbGl0eS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmMgdGhlIGNvbGxlY3Rpb24gY29udGFpbmluZyByZXNvdXJjZXMgdG8gYWRkCisgICAgICogQHBhcmFtIHRPdXQgc3RyZWFtIHdyaXRpbmcgdG8gdGhlIGFyY2hpdmUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRhcihSZXNvdXJjZUNvbGxlY3Rpb24gcmMsIFRhck91dHB1dFN0cmVhbSB0T3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBcmNoaXZlRmlsZVNldCBhZnMgPSBudWxsOworICAgICAgICBpZiAocmMgaW5zdGFuY2VvZiBBcmNoaXZlRmlsZVNldCkgeworICAgICAgICAgICAgYWZzID0gKEFyY2hpdmVGaWxlU2V0KSByYzsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWZzICE9IG51bGwgJiYgYWZzLnNpemUoKSA+IDEKKyAgICAgICAgICAgICYmIGFmcy5nZXRGdWxscGF0aCh0aGlzLmdldFByb2plY3QoKSkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZ1bGxwYXRoIGF0dHJpYnV0ZSBtYXkgb25seSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmUgc3BlY2lmaWVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmlsZXNldHMgdGhhdCBzcGVjaWZ5IGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNpbmdsZSBmaWxlLiIpOworICAgICAgICB9CisgICAgICAgIFRhckZpbGVTZXQgdGZzID0gYXNUYXJGaWxlU2V0KGFmcyk7CisKKyAgICAgICAgaWYgKGlzRmlsZUZpbGVTZXQocmMpKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIHJjOworICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBnZXRGaWxlTmFtZXMoZnMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZzLmdldERpcihnZXRQcm9qZWN0KCkpLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlc1tpXS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgICAgICAgICB0YXJGaWxlKGYsIHRPdXQsIG5hbWUsIHRmcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmMuaXNGaWxlc3lzdGVtT25seSgpKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gcmMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEZpbGVSZXNvdXJjZSByID0gKEZpbGVSZXNvdXJjZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gci5nZXRGaWxlKCk7CisgICAgICAgICAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmID0gbmV3IEZpbGUoci5nZXRCYXNlRGlyKCksIHIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGFyRmlsZShmLCB0T3V0LCBmLmdldE5hbWUoKSwgdGZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gbm9uLWZpbGUgcmVzb3VyY2VzCisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gcmMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFJlc291cmNlIHIgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIHRhclJlc291cmNlKHIsIHRPdXQsIHIuZ2V0TmFtZSgpLCB0ZnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgY29sbGVjdGlvbiBpcyBhIChzdWJjbGFzcyBvZikKKyAgICAgKiBGaWxlU2V0IHRoYXQgb25seSBjb250YWlucyBmaWxlIHN5c3RlbSByZXNvdXJjZXMuCisgICAgICogQHBhcmFtIHJjIHRoZSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBpcyBhIGZpbGVzZXQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNGaWxlRmlsZVNldChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgcmV0dXJuIHJjIGluc3RhbmNlb2YgRmlsZVNldCAmJiByYy5pc0ZpbGVzeXN0ZW1Pbmx5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhYnMgYWxsIGluY2x1ZGVkIGZpbGVzIGFuZCBkaXJlY3RvcnMgZnJvbSB0aGUgRmlsZVNldCBhbmQKKyAgICAgKiByZXR1cm5zIHRoZW0gYXMgYW4gYXJyYXkgb2YgKHJlbGF0aXZlKSBmaWxlIG5hbWVzLgorICAgICAqIEBwYXJhbSBmcyB0aGUgZmlsZXNldCB0byBvcGVyYXRlIG9uLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBmaWxlbmFtZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGdldEZpbGVOYW1lcyhGaWxlU2V0IGZzKSB7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGZzLmdldFByb2plY3QoKSk7CisgICAgICAgIFN0cmluZ1tdIGRpcmVjdG9yaWVzID0gZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgICAgICBTdHJpbmdbXSBmaWxlc1BlclNlID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmcgW2RpcmVjdG9yaWVzLmxlbmd0aCArIGZpbGVzUGVyU2UubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkaXJlY3RvcmllcywgMCwgZmlsZXMsIDAsIGRpcmVjdG9yaWVzLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZmlsZXNQZXJTZSwgMCwgZmlsZXMsIGRpcmVjdG9yaWVzLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1BlclNlLmxlbmd0aCk7CisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgZnVsbHBhdGgsIHByZWZpeCBhbmQgcGVybWlzc2lvbiBhdHRyaWJ1dGVzIGZyb20gdGhlCisgICAgICogQXJjaGl2ZUZpbGVTZXQgdG8gYSBuZXcgVGFyRmlsZVNldCAob3IgcmV0dXJucyBpdCB1bmNoYW5nZWQgaWYKKyAgICAgKiBpdCBhbHJlYWR5IGlzIGEgVGFyRmlsZVNldCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJjaGl2ZUZpbGVTZXQgZmlsZXNldCB0byBjb3B5IGF0dHJpYnV0ZXMgZnJvbSwgbWF5IGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIGEgbmV3IFRhckZpbGVTZXQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGFyRmlsZVNldCBhc1RhckZpbGVTZXQoQXJjaGl2ZUZpbGVTZXQgYXJjaGl2ZUZpbGVTZXQpIHsKKyAgICAgICAgVGFyRmlsZVNldCB0ZnMgPSBudWxsOworICAgICAgICBpZiAoYXJjaGl2ZUZpbGVTZXQgIT0gbnVsbCAmJiBhcmNoaXZlRmlsZVNldCBpbnN0YW5jZW9mIFRhckZpbGVTZXQpIHsKKyAgICAgICAgICAgIHRmcyA9IChUYXJGaWxlU2V0KSBhcmNoaXZlRmlsZVNldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRmcyA9IG5ldyBUYXJGaWxlU2V0KCk7CisgICAgICAgICAgICB0ZnMuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgaWYgKGFyY2hpdmVGaWxlU2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZnMuc2V0UHJlZml4KGFyY2hpdmVGaWxlU2V0LmdldFByZWZpeChnZXRQcm9qZWN0KCkpKTsKKyAgICAgICAgICAgICAgICB0ZnMuc2V0RnVsbHBhdGgoYXJjaGl2ZUZpbGVTZXQuZ2V0RnVsbHBhdGgoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgICAgICAgICAgaWYgKGFyY2hpdmVGaWxlU2V0Lmhhc0ZpbGVNb2RlQmVlblNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRmcy5pbnRlZ2VyU2V0RmlsZU1vZGUoYXJjaGl2ZUZpbGVTZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZU1vZGUoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhcmNoaXZlRmlsZVNldC5oYXNEaXJNb2RlQmVlblNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRmcy5pbnRlZ2VyU2V0RGlyTW9kZShhcmNoaXZlRmlsZVNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERpck1vZGUoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFyY2hpdmVGaWxlU2V0CisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuVGFyRmlsZVNldCkgeworICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5UYXJGaWxlU2V0IHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlRhckZpbGVTZXQpIGFyY2hpdmVGaWxlU2V0OworICAgICAgICAgICAgICAgICAgICBpZiAodC5oYXNVc2VyTmFtZUJlZW5TZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGZzLnNldFVzZXJOYW1lKHQuZ2V0VXNlck5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHQuaGFzR3JvdXBCZWVuU2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRmcy5zZXRHcm91cCh0LmdldEdyb3VwKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0Lmhhc1VzZXJJZEJlZW5TZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGZzLnNldFVpZCh0LmdldFVpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodC5oYXNHcm91cElkQmVlblNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZnMuc2V0R2lkKHQuZ2V0R2lkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIEZpbGVTZXQgd2l0aCB0aGUgb3B0aW9uIHRvIHNwZWNpZnkgcGVybWlzc2lvbnMKKyAgICAgKiBhbmQgb3RoZXIgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhckZpbGVTZXQKKyAgICAgICAgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5UYXJGaWxlU2V0IHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBmaWxlcyA9IG51bGw7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByZXNlcnZlTGVhZGluZ1NsYXNoZXMgPSBmYWxzZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJGaWxlU2V0PC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgICAgICogVXNpbmcgYSBmaWxlc2V0IGFzIGEgY29uc3RydWN0b3IgYXJndW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmaWxlc2V0IGEgPGNvZGU+RmlsZVNldDwvY29kZT4gdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBUYXJGaWxlU2V0KEZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICAgICAgc3VwZXIoZmlsZXNldCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJGaWxlU2V0PC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBUYXJGaWxlU2V0KCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiAgR2V0IGEgbGlzdCBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluIHRoZSBmaWxlc2V0LgorICAgICAgICAgKiBAcGFyYW0gcCB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMsIHJlbGF0aXZlIHRvCisgICAgICAgICAqICAgIHRoZSBiYXNlRGlyIGZvciB0aGUgcHJvamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRGaWxlcyhQcm9qZWN0IHApIHsKKyAgICAgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlsZXMgPSBnZXRGaWxlTmFtZXModGhpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmaWxlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIDMgZGlnaXQgb2N0YWwgc3RyaW5nLCBzcGVjaWZ5IHRoZSB1c2VyLCBncm91cCBhbmQKKyAgICAgICAgICogb3RoZXIgbW9kZXMgaW4gdGhlIHN0YW5kYXJkIFVuaXggZmFzaGlvbjsKKyAgICAgICAgICogb3B0aW9uYWwsIGRlZmF1bHQ9MDY0NAorICAgICAgICAgKiBAcGFyYW0gb2N0YWxTdHJpbmcgYSAzIGRpZ2l0IG9jdGFsIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoU3RyaW5nIG9jdGFsU3RyaW5nKSB7CisgICAgICAgICAgICBzZXRGaWxlTW9kZShvY3RhbFN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgY3VycmVudCBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRNb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEZpbGVNb2RlKHRoaXMuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIHRvIGluZGljYXRlcyB3aGV0aGVyIGxlYWRpbmcgYC8ncyBzaG91bGQKKyAgICAgICAgICogYmUgcHJlc2VydmVkIGluIHRoZSBmaWxlIG5hbWVzLgorICAgICAgICAgKiBPcHRpb25hbCwgZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBiIHRoZSBsZWFkaW5nIHNsYXNoZXMgZmxhZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXNlcnZlTGVhZGluZ1NsYXNoZXMoYm9vbGVhbiBiKSB7CisgICAgICAgICAgICB0aGlzLnByZXNlcnZlTGVhZGluZ1NsYXNoZXMgPSBiOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGxlYWRpbmcgc2xhc2hlcyBmbGFnLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0UHJlc2VydmVMZWFkaW5nU2xhc2hlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmVzZXJ2ZUxlYWRpbmdTbGFzaGVzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG9mIG9wdGlvbnMgZm9yIGxvbmcgZmlsZSBoYW5kbGluZyBpbiB0aGUgdGFzay4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGFyTG9uZ0ZpbGVNb2RlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgLyoqIHBlcm1pc3NpYmxlIHZhbHVlcyBmb3IgbG9uZ2ZpbGUgYXR0cmlidXRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCisgICAgICAgICAgICBXQVJOID0gIndhcm4iLAorICAgICAgICAgICAgRkFJTCA9ICJmYWlsIiwKKyAgICAgICAgICAgIFRSVU5DQVRFID0gInRydW5jYXRlIiwKKyAgICAgICAgICAgIEdOVSA9ICJnbnUiLAorICAgICAgICAgICAgT01JVCA9ICJvbWl0IjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHZhbGlkTW9kZXMgPSB7V0FSTiwgRkFJTCwgVFJVTkNBVEUsIEdOVSwgT01JVH07CisKKyAgICAgICAgLyoqIENvbnN0cnVjdG9yLCBkZWZhdWx0cyB0byAid2FybiIgKi8KKyAgICAgICAgcHVibGljIFRhckxvbmdGaWxlTW9kZSgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICBzZXRWYWx1ZShXQVJOKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgZW51bWVyYXRlZCB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWxpZE1vZGVzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWx1ZSBpcyAidHJ1bmNhdGUiLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUcnVuY2F0ZU1vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gVFJVTkNBVEUuZXF1YWxzSWdub3JlQ2FzZShnZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsdWUgaXMgIndhcm4iLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXYXJuTW9kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBXQVJOLmVxdWFsc0lnbm9yZUNhc2UoZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHZhbHVlIGlzICJnbnUiLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbnVNb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIEdOVS5lcXVhbHNJZ25vcmVDYXNlKGdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWx1ZSBpcyAiZmFpbCIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWxNb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIEZBSUwuZXF1YWxzSWdub3JlQ2FzZShnZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsdWUgaXMgIm9taXQiLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNPbWl0TW9kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBPTUlULmVxdWFsc0lnbm9yZUNhc2UoZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZCBNb2RlcyBmb3IgQ29tcHJlc3Npb24gYXR0cmlidXRlIHRvIFRhciBUYXNrCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRhckNvbXByZXNzaW9uTWV0aG9kIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgLy8gcGVybWlzc2libGUgdmFsdWVzIGZvciBjb21wcmVzc2lvbiBhdHRyaWJ1dGUKKyAgICAgICAgLyoqCisgICAgICAgICAqICAgIE5vIGNvbXByZXNzaW9uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJub25lIjsKKyAgICAgICAgLyoqCisgICAgICAgICAqICAgIEdaSVAgY29tcHJlc3Npb24KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHWklQID0gImd6aXAiOworICAgICAgICAvKioKKyAgICAgICAgICogICAgQlpJUDIgY29tcHJlc3Npb24KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCWklQMiA9ICJiemlwMiI7CisKKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFRhckNvbXByZXNzaW9uTWV0aG9kKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHNldFZhbHVlKE5PTkUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBHZXQgdmFsaWQgZW51bWVyYXRpb24gdmFsdWVzLgorICAgICAgICAgKiAgQHJldHVybiB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtOT05FLCBHWklQLCBCWklQMiB9OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBUaGlzIG1ldGhvZCB3cmFwcyB0aGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZQorICAgICAgICAgKiAgICAgY29ycmVzcG9uZGluZyBjb21wcmVzc2lvbiBtZXRob2QKKyAgICAgICAgICoKKyAgICAgICAgICogIEBwYXJhbSBvc3RyZWFtIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICogIEByZXR1cm4gb3V0cHV0IHN0cmVhbSB3aXRoIG9uLXRoZS1mbHkgY29tcHJlc3Npb24KKyAgICAgICAgICogIEBleGNlcHRpb24gSU9FeGNlcHRpb24gdGhyb3duIGlmIGZpbGUgaXMgbm90IHdyaXRhYmxlCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBjb21wcmVzcyhmaW5hbCBPdXRwdXRTdHJlYW0gb3N0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdiA9IGdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoR1pJUC5lcXVhbHModikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdaSVBPdXRwdXRTdHJlYW0ob3N0cmVhbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChCWklQMi5lcXVhbHModikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZSgnQicpOworICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKCdaJyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ0JaaXAyT3V0cHV0U3RyZWFtKG9zdHJlYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvc3RyZWFtOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza091dHB1dFN0cmVhbS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza091dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZWQ4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisvKioKKyAqIFJlZGlyZWN0cyB0ZXh0IHdyaXR0ZW4gdG8gYSBzdHJlYW0gdGhydSB0aGUgc3RhbmRhcmQKKyAqIGFudCBsb2dnaW5nIG1lY2hhbmlzbS4gVGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIGludGVncmF0aW5nCisgKiB3aXRoIHRvb2xzIHRoYXQgd3JpdGUgdG8gU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyci4gRm9yIGV4YW1wbGUsCisgKiB0aGUgZm9sbG93aW5nIHdpbGwgY2F1c2UgYWxsIHRleHQgd3JpdHRlbiB0byBTeXN0ZW0ub3V0IHRvIGJlCisgKiBsb2dnZWQgd2l0aCAiaW5mbyIgcHJpb3JpdHk6CisgKiA8cHJlPlN5c3RlbS5zZXRPdXQobmV3IFByaW50U3RyZWFtKG5ldyBUYXNrT3V0cHV0U3RyZWFtKHByb2plY3QsIFByb2plY3QuTVNHX0lORk8pKSk7PC9wcmU+CisgKgorICogPHA+PHN0cm9uZz5BcyBvZiBBbnQgMS4yLCB0aGlzIGNsYXNzIGlzIGNvbnNpZGVyZWQgdG8gYmUgZGVhZCBjb2RlCisgKiBieSB0aGUgQW50IGRldmVsb3BlcnMgYW5kIGlzIHVubWFpbnRhaW5lZC4gIERvbid0IHVzZQorICogaXQuPC9zdHJvbmc+PC9wPgorICoKKyAqIEBkZXByZWNhdGVkIHNpbmNlIDEuMi54LgorICogVXNlIExvZ091dHB1dFN0cmVhbSBpbnN0ZWFkLgorICovCisKK3B1YmxpYyBjbGFzcyBUYXNrT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgVGFzayB0YXNrOworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGxpbmU7CisgICAgcHJpdmF0ZSBpbnQgbXNnT3V0cHV0TGV2ZWw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEphdmFjT3V0cHV0U3RyZWFtIHdpdGggdGhlIGdpdmVuIHByb2plY3QKKyAgICAgKiBhcyB0aGUgb3V0cHV0IHNvdXJjZSBmb3IgbWVzc2FnZXMuCisgICAgICovCisKKyAgICBUYXNrT3V0cHV0U3RyZWFtKFRhc2sgdGFzaywgaW50IG1zZ091dHB1dExldmVsKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQXMgb2YgQW50IDEuMiByZWxlYXNlZCBpbiBPY3RvYmVyIDIwMDAsIHRoZSAiCisgICAgICAgICAgICArICJUYXNrT3V0cHV0U3RyZWFtIGNsYXNzIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaXMgY29uc2lkZXJlZCB0byBiZSBkZWFkIGNvZGUgYnkgdGhlIEFudCAiCisgICAgICAgICAgICArICJkZXZlbG9wZXJzIGFuZCBpcyB1bm1haW50YWluZWQuIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRG9uXCd0IHVzZSBpdCEiKTsKKworICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgICAgICB0aGlzLm1zZ091dHB1dExldmVsID0gbXNnT3V0cHV0TGV2ZWw7CisKKyAgICAgICAgbGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGNoYXJhY3RlciB0byB0aGUgb3V0cHV0IHN0cmVhbS4gVGhpcyBtZXRob2QgbG9va3MKKyAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpc24ndCBhbiBlcnJvciBiZWluZyByZXBvcnRlZCBhbmQKKyAgICAgKiB3aWxsIGZsdXNoIGVhY2ggbGluZSBvZiBpbnB1dCBvdXQgdG8gdGhlIHByb2plY3QncyBsb2cgc3RyZWFtLgorICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhciBjYyA9IChjaGFyKSBjOworICAgICAgICBpZiAoY2MgPT0gJ1xyJyB8fCBjYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAvLyBsaW5lIGZlZWQKKyAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW5lLmFwcGVuZChjYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgYSBsaW5lIG9mIGlucHV0IGFuZCBkZXRlcm1pbmVzIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICAgICAqLworCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NMaW5lKCkgeworICAgICAgICBTdHJpbmcgcyA9IGxpbmUudG9TdHJpbmcoKTsKKyAgICAgICAgdGFzay5sb2cocywgbXNnT3V0cHV0TGV2ZWwpOworICAgICAgICBsaW5lID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNmRiZGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQWRhcHRlcjsKKworLyoqCisgKiBBZGRzIGEgdGFzayBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QsIHN1Y2ggdGhhdCB0aGlzIG5ldyB0YXNrIGNhbiBiZQorICogdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LiBUd28gYXR0cmlidXRlcyBhcmUgbmVlZGVkLCB0aGUgbmFtZSB0aGF0IGlkZW50aWZpZXMKKyAqIHRoaXMgdGFzayB1bmlxdWVseSwgYW5kIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzIChpbmNsdWRpbmcgdGhlIHBhY2thZ2VzKSB0aGF0CisgKiBpbXBsZW1lbnRzIHRoaXMgdGFzay48L3A+CisgKiA8cD5Zb3UgY2FuIGFsc28gZGVmaW5lIGEgZ3JvdXAgb2YgdGFza3MgYXQgb25jZSB1c2luZyB0aGUgZmlsZSBvcgorICogcmVzb3VyY2UgYXR0cmlidXRlcy4gIFRoZXNlIGF0dHJpYnV0ZXMgcG9pbnQgdG8gZmlsZXMgaW4gdGhlIGZvcm1hdCBvZgorICogSmF2YSBwcm9wZXJ0eSBmaWxlcy4gIEVhY2ggbGluZSBkZWZpbmVzIGEgc2luZ2xlIHRhc2sgaW4gdGhlCisgKiBmb3JtYXQ6PC9wPgorICogPHByZT4KKyAqIHRhc2tuYW1lPWZ1bGx5LnF1YWxpZmllZC5qYXZhLmNsYXNzbmFtZQorICogPC9wcmU+CisgKiBAc2luY2UgQW50IDEuMQorICogQGFudC50YXNrIGNhdGVnb3J5PSJpbnRlcm5hbCIKKyAqLworcHVibGljIGNsYXNzIFRhc2tkZWYgZXh0ZW5kcyBUeXBlZGVmIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogQ3JlYXRlcyBhIG5ldyBUYXNrZGVmIGluc3RhbmNlLgorICAgICAqIFRoaXMgc2V0cyB0aGUgYWRhcHRlciBhbmQgdGhlIGFkYXB0dG8gY2xhc3NlcyB0bworICAgICAqIFRhc2tBZGFwdGVyIGFuZCBUYXNrLgorICAgICAqLworCisgICAgcHVibGljIFRhc2tkZWYoKSB7CisgICAgICAgIHNldEFkYXB0ZXJDbGFzcyhUYXNrQWRhcHRlci5jbGFzcyk7CisgICAgICAgIHNldEFkYXB0VG9DbGFzcyhUYXNrLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UZW1wRmlsZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGVtcEZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzY4MzYxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGVtcEZpbGUuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqICBUaGlzIHRhc2sgc2V0cyBhIHByb3BlcnR5IHRvICB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlLgorICogIFVubGlrZSB7QGxpbmsgRmlsZSNjcmVhdGVUZW1wRmlsZX0sIHRoaXMgdGFzayBkb2VzIG5vdCBhY3R1YWxseSBjcmVhdGUgdGhlCisgKiAgdGVtcG9yYXJ5IGZpbGUsIGJ1dCBpdCBkb2VzIGd1YXJhbnRlZSB0aGF0IHRoZSBmaWxlIGRpZCBub3QKKyAqICBleGlzdCB3aGVuIHRoZSB0YXNrIHdhcyBleGVjdXRlZC4KKyAqIDxwPgorICogRXhhbXBsZXMKKyAqIDxwcmU+Jmx0O3RlbXBmaWxlIHByb3BlcnR5PSJ0ZW1wLmZpbGUiIC8mZ3Q7PC9wcmU+CisgKiBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZQorICogPHByZT4mbHQ7dGVtcGZpbGUgcHJvcGVydHk9InRlbXAuZmlsZSIgc3VmZml4PSIueG1sIiAvJmd0OzwvcHJlPgorICogY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgd2l0aCB0aGUgLnhtbCBzdWZmaXguCisgKiA8cHJlPiZsdDt0ZW1wZmlsZSBwcm9wZXJ0eT0idGVtcC5maWxlIiBkZXN0RGlyPSJidWlsZCIvJmd0OzwvcHJlPgorICogY3JlYXRlIGEgdGVtcCBmaWxlIGluIHRoZSBidWlsZCBzdWJkaXIKKyAqQHNpbmNlICAgICAgIEFudCAxLjUKKyAqQGFudC50YXNrCisgKi8KKworcHVibGljIGNsYXNzIFRlbXBGaWxlIGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgcHJvcGVydHkgdG8gc2V0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OworCisgICAgLyoqCisgICAgICogRGlyZWN0b3J5IHRvIGNyZWF0ZSB0aGUgZmlsZSBpbi4gQ2FuIGJlIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGRlc3REaXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogUHJlZml4IGZvciB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcmVmaXg7CisKKyAgICAvKioKKyAgICAgKiBTdWZmaXggZm9yIHRoZSBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHN1ZmZpeCA9ICIiOworCisgICAgLyoqIGRlbGV0ZU9uRXhpdCBmbGFnICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZU9uRXhpdDsKKworICAgIC8qKiBjcmVhdGVGaWxlIGZsYWcgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlRmlsZTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IHlvdSB3aXNoIHRvIGFzc2lnbiB0aGUgdGVtcG9yYXJ5IGZpbGUgdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHByb3BlcnR5ICBUaGUgcHJvcGVydHkgdG8gc2V0CisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9InJlcXVpcmVkIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIElmIG5vdCBzZXQsCisgICAgICogdGhlIGJhc2VkaXIgZGlyZWN0b3J5IGlzIHVzZWQgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgZGVzdERpciAgVGhlIG5ldyBkZXN0RGlyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdERpcihGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9wdGlvbmFsIHByZWZpeCBzdHJpbmcgZm9yIHRoZSB0ZW1wIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHByZWZpeCAgc3RyaW5nIHRvIHByZXBlbmQgdG8gZ2VuZXJhdGVkIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3B0aW9uYWwgc3VmZml4IHN0cmluZyBmb3IgdGhlIHRlbXAgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc3VmZml4ICBzdWZmaXggaW5jbHVkaW5nIGFueSAiLiIgLCBlLmcgIi54bWwiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKKyAgICAgICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIHRlbXBmaWxlIGNyZWF0ZWQgYnkgdGhpcyB0YXNrIHNob3VsZCBiZSBzZXQKKyAgICAgKiBmb3IgZGVsZXRpb24gb24gbm9ybWFsIFZNIGV4aXQuCisgICAgICogQHBhcmFtIGRlbGV0ZU9uRXhpdCBib29sZWFuIGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVsZXRlT25FeGl0KGJvb2xlYW4gZGVsZXRlT25FeGl0KSB7CisgICAgICAgIHRoaXMuZGVsZXRlT25FeGl0ID0gZGVsZXRlT25FeGl0OworICAgIH0KKworICAgIC8qKgorICAgICAqIExlYXJuIHdoZXRoZXIgZGVsZXRlT25FeGl0IGlzIHNldCBmb3IgdGhpcyB0ZW1wZmlsZSB0YXNrLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBkZWxldGVPbkV4aXQgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZU9uRXhpdCgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZU9uRXhpdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlIGZpbGUgaXMgYWN0dWFsbHkgY3JlYXRlZCwgaWYgbm90IGp1c3QgYSBuYW1lIGlzIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIGNyZWF0ZUZpbGUgYm9vbGVhbiBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZUZpbGUoYm9vbGVhbiBjcmVhdGVGaWxlKSB7CisgICAgICAgIHRoaXMuY3JlYXRlRmlsZSA9IGNyZWF0ZUZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGVhcm4gd2hldGhlciBjcmVhdGVGaWxlIGZsYWcgaXMgc2V0IGZvciB0aGlzIHRlbXBmaWxlIHRhc2suCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlRmlsZSBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ3JlYXRlRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgdGVtcG9yYXJ5IGZpbGUuCisgICAgICoKKyAgICAgKkBleGNlcHRpb24gIEJ1aWxkRXhjZXB0aW9uICBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5vIHByb3BlcnR5IHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0RGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3REaXIgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIi4iKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIHRmaWxlID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZShwcmVmaXgsIHN1ZmZpeCwgZGVzdERpciwKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlT25FeGl0LCBjcmVhdGVGaWxlKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHByb3BlcnR5LCB0ZmlsZS50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Ub3VjaC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVG91Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGYzMmMxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVG91Y2guamF2YQpAQCAtMCwwICsxLDM3OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlRvdWNoYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKKworLyoqCisgKiBUb3VjaCBhIGZpbGUgYW5kL29yIGZpbGVzZXQocykgYW5kL29yIGZpbGVsaXN0KHMpOworICogY29ycmVzcG9uZHMgdG8gdGhlIFVuaXggdG91Y2ggY29tbWFuZC4KKyAqCisgKiA8cD5JZiB0aGUgZmlsZSB0byB0b3VjaCBkb2Vzbid0IGV4aXN0LCBhbiBlbXB0eSBvbmUgaXMgY3JlYXRlZC48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjEKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCisgKi8KK3B1YmxpYyBjbGFzcyBUb3VjaCBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgRGF0ZUZvcm1hdEZhY3RvcnkgeworICAgICAgICBEYXRlRm9ybWF0IGdldFByaW1hcnlGb3JtYXQoKTsKKyAgICAgICAgRGF0ZUZvcm1hdCBnZXRGYWxsYmFja0Zvcm1hdCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVGb3JtYXRGYWN0b3J5IERFRkFVTFRfREZfRkFDVE9SWQorICAgICAgICA9IG5ldyBEYXRlRm9ybWF0RmFjdG9yeSgpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGluaXRpYWwgdmVyc2lvbiB1c2VkIERhdGVGb3JtYXQuU0hPUlQgZm9yIHRoZQorICAgICAgICAgKiB0aW1lIGZvcm1hdCwgd2hpY2ggaWdub3JlcyBzZWNvbmRzLiAgSWYgd2Ugd2FudAorICAgICAgICAgKiBzZWNvbmRzIGFzIHdlbGwsIHdlIG5lZWQgRGF0ZUZvcm1hdC5NRURJVU0sIHdoaWNoCisgICAgICAgICAqIGluIHR1cm4gd291bGQgYnJlYWsgYWxsIG9sZCBidWlsZCBmaWxlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogRmlyc3QgdHJ5IHRvIHBhcnNlIHdpdGggRGF0ZUZvcm1hdC5TSE9SVCBhbmQgaWYKKyAgICAgICAgICogdGhhdCBmYWlscyB3aXRoIE1FRElVTSAtIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBib3RoCisgICAgICAgICAqIGZhaWwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRGF0ZUZvcm1hdCBnZXRQcmltYXJ5Rm9ybWF0KCkgeworICAgICAgICAgICAgcmV0dXJuIERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEYXRlRm9ybWF0LlNIT1JULAorICAgICAgICAgICAgICAgIERhdGVGb3JtYXQuU0hPUlQsIExvY2FsZS5VUyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIERhdGVGb3JtYXQgZ2V0RmFsbGJhY2tGb3JtYXQoKSB7CisgICAgICAgICAgICByZXR1cm4gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKERhdGVGb3JtYXQuU0hPUlQsCisgICAgICAgICAgICAgICAgRGF0ZUZvcm1hdC5NRURJVU0sIExvY2FsZS5VUyk7CisgICAgICAgIH0KKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJpdmF0ZSBGaWxlIGZpbGU7CisgICAgcHJpdmF0ZSBsb25nIG1pbGxpcyA9IC0xOworICAgIHByaXZhdGUgU3RyaW5nIGRhdGVUaW1lOworICAgIHByaXZhdGUgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVW5pb24gcmVzb3VyY2VzOworICAgIHByaXZhdGUgYm9vbGVhbiBkYXRlVGltZUNvbmZpZ3VyZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1rZGlyczsKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IHRydWU7CisgICAgcHJpdmF0ZSBGaWxlTmFtZU1hcHBlciBmaWxlTmFtZU1hcHBlciA9IG51bGw7CisgICAgcHJpdmF0ZSBEYXRlRm9ybWF0RmFjdG9yeSBkZkZhY3RvcnkgPSBERUZBVUxUX0RGX0ZBQ1RPUlk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+VG91Y2g8L2NvZGU+IHRhc2suCisgICAgICovCisgICAgcHVibGljIFRvdWNoKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBzaW5nbGUgc291cmNlIGZpbGUgdG8gdG91Y2guICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdAorICAgICAqIGFuIGVtcHR5IGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSA8Y29kZT5GaWxlPC9jb2RlPiB0byB0b3VjaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmV3IG1vZGlmaWNhdGlvbiB0aW1lIG9mIGZpbGUocykgdG91Y2hlZAorICAgICAqIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBKYW4gMSAxOTcwLiBPcHRpb25hbCwgZGVmYXVsdD1ub3cuCisgICAgICogQHBhcmFtIG1pbGxpcyB0aGUgPGNvZGU+bG9uZzwvY29kZT4gdGltZXN0YW1wIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNaWxsaXMobG9uZyBtaWxsaXMpIHsKKyAgICAgICAgdGhpcy5taWxsaXMgPSBtaWxsaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuZXcgbW9kaWZpY2F0aW9uIHRpbWUgb2YgZmlsZShzKSB0b3VjaGVkCisgICAgICogaW4gdGhlIGZvcm1hdCAmcXVvdDtNTS9ERC9ZWVlZIEhIOk1NIEFNIDxpPm9yPC9pPiBQTSZxdW90OworICAgICAqIG9yICZxdW90O01NL0REL1lZWVkgSEg6TU06U1MgQU0gPGk+b3I8L2k+IFBNJnF1b3Q7LgorICAgICAqIE9wdGlvbmFsLCBkZWZhdWx0PW5vdy4KKyAgICAgKiBAcGFyYW0gZGF0ZVRpbWUgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gZGF0ZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRldGltZShTdHJpbmcgZGF0ZVRpbWUpIHsKKyAgICAgICAgaWYgKHRoaXMuZGF0ZVRpbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJSZXNldHRpbmcgZGF0ZXRpbWUgYXR0cmlidXRlIHRvICIgKyBkYXRlVGltZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5kYXRlVGltZSA9IGRhdGVUaW1lOworICAgICAgICBkYXRlVGltZUNvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBub25leGlzdGVudCBwYXJlbnQgZGlyZWN0b3JpZXMgc2hvdWxkIGJlIGNyZWF0ZWQKKyAgICAgKiB3aGVuIHRvdWNoaW5nIG5ldyBmaWxlcy4KKyAgICAgKiBAcGFyYW0gbWtkaXJzIDxjb2RlPmJvb2xlYW48L2NvZGU+IHdoZXRoZXIgdG8gY3JlYXRlIHBhcmVudCBkaXJlY3Rvcmllcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWtkaXJzKGJvb2xlYW4gbWtkaXJzKSB7CisgICAgICAgIHRoaXMubWtkaXJzID0gbWtkaXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoZSB0b3VjaCB0YXNrIHdpbGwgcmVwb3J0IGV2ZXJ5IGZpbGUgaXQgY3JlYXRlczsKKyAgICAgKiBkZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdmVyYm9zZSA8Y29kZT5ib29sZWFuPC9jb2RlPiBmbGFnLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgeworICAgICAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZm9ybWF0IG9mIHRoZSBkYXRldGltZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIDxjb2RlPlNpbXBsZURhdGVGb3JtYXQ8L2NvZGU+LWNvbXBhdGlibGUgZm9ybWF0IHBhdHRlcm4uCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oZmluYWwgU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgZGZGYWN0b3J5ID0gbmV3IERhdGVGb3JtYXRGYWN0b3J5KCkgeworICAgICAgICAgICAgcHVibGljIERhdGVGb3JtYXQgZ2V0UHJpbWFyeUZvcm1hdCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURhdGVGb3JtYXQocGF0dGVybik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgRGF0ZUZvcm1hdCBnZXRGYWxsYmFja0Zvcm1hdCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSA8Y29kZT5NYXBwZXI8L2NvZGU+LgorICAgICAqIEBwYXJhbSBtYXBwZXIgdGhlIDxjb2RlPk1hcHBlcjwvY29kZT4gdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkTWFwcGVyKE1hcHBlciBtYXBwZXIpIHsKKyAgICAgICAgYWRkKG1hcHBlci5nZXRJbXBsZW1lbnRhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSA8Y29kZT5GaWxlTmFtZU1hcHBlcjwvY29kZT4uCisgICAgICogQHBhcmFtIGZpbGVOYW1lTWFwcGVyIHRoZSA8Y29kZT5GaWxlTmFtZU1hcHBlcjwvY29kZT4gdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG11bHRpcGxlIG1hcHBlcnMgYXJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChGaWxlTmFtZU1hcHBlciBmaWxlTmFtZU1hcHBlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMuZmlsZU5hbWVNYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBtYXBwZXIgbWF5IGJlIGFkZGVkIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgKyBnZXRUYXNrTmFtZSgpICsgIiB0YXNrLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZmlsZU5hbWVNYXBwZXIgPSBmaWxlTmFtZU1hcHBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXQgb2YgZmlsZXMgdG8gdG91Y2guCisgICAgICogQHBhcmFtIHNldCB0aGUgPGNvZGU+RmlsZXNldDwvY29kZT4gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKKyAgICAgICAgZmlsZXNldHMuYWRkKHNldCk7CisgICAgICAgIGFkZChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbGVsaXN0IHRvIHRvdWNoLgorICAgICAqIEBwYXJhbSBsaXN0IHRoZSA8Y29kZT5GaWxlbGlzdDwvY29kZT4gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVsaXN0KEZpbGVMaXN0IGxpc3QpIHsKKyAgICAgICAgYWRkKGxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRvIHRvdWNoLgorICAgICAqIEBwYXJhbSByYyB0aGUgY29sbGVjdGlvbiB0byBhZGQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKFJlc291cmNlQ29sbGVjdGlvbiByYykgeworICAgICAgICByZXNvdXJjZXMgPSByZXNvdXJjZXMgPT0gbnVsbCA/IG5ldyBVbmlvbigpIDogcmVzb3VyY2VzOworICAgICAgICByZXNvdXJjZXMuYWRkKHJjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IHRoaXMgdGFzayBoYXMgYmVlbiBjb25maWd1cmVkIHByb3Blcmx5LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgY29uZmlndXJhdGlvbiBlcnJvcnMgYXJlIGRldGVjdGVkLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiByZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi0tYSBmaWxlIG9yIHJlc291cmNlIGNvbGxlY3Rpb24uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVc2UgYSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIHRvdWNoIGRpcmVjdG9yaWVzLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChkYXRlVGltZSAhPSBudWxsICYmICFkYXRlVGltZUNvbmZpZ3VyZWQpIHsKKyAgICAgICAgICAgIGxvbmcgd29ya21pbGxpcyA9IG1pbGxpczsKKyAgICAgICAgICAgIGlmICgibm93Ii5lcXVhbHNJZ25vcmVDYXNlKGRhdGVUaW1lKSkgeworICAgICAgICAgICAgICAgIHdvcmttaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRGF0ZUZvcm1hdCBkZiA9IGRmRmFjdG9yeS5nZXRQcmltYXJ5Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgUGFyc2VFeGNlcHRpb24gcGUgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmttaWxsaXMgPSBkZi5wYXJzZShkYXRlVGltZSkuZ2V0VGltZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlT25lKSB7CisgICAgICAgICAgICAgICAgICAgIGRmID0gZGZGYWN0b3J5LmdldEZhbGxiYWNrRm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwZSA9IHBlT25lOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrbWlsbGlzID0gZGYucGFyc2UoZGF0ZVRpbWUpLmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlVHdvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGUgPSBwZVR3bzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocGUuZ2V0TWVzc2FnZSgpLCBwZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3b3JrbWlsbGlzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRhdGUgb2YgIiArIGRhdGVUaW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHJlc3VsdHMgaW4gbmVnYXRpdmUgIiArICJtaWxsaXNlY29uZHMgdmFsdWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlbGF0aXZlIHRvIGVwb2NoICIgKyAiKEphbnVhcnkgMSwgMTk3MCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjAwOjAwOjAwIEdNVCkuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJTZXR0aW5nIG1pbGxpcyB0byAiICsgd29ya21pbGxpcyArICIgZnJvbSBkYXRldGltZSBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAoKG1pbGxpcyA8IDApID8gUHJvamVjdC5NU0dfREVCVUcgOiBQcm9qZWN0Lk1TR19WRVJCT1NFKSk7CisgICAgICAgICAgICBzZXRNaWxsaXMod29ya21pbGxpcyk7CisgICAgICAgICAgICAvLyBvbmx5IHNldCBpZiBzdWNjZXNzZnVsIHRvIHRoaXMgcG9pbnQ6CisgICAgICAgICAgICBkYXRlVGltZUNvbmZpZ3VyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdG91Y2ggb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tDb25maWd1cmF0aW9uKCk7CisgICAgICAgIHRvdWNoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgYWN0dWFsIHdvcms7IGFzc3VtZXMgZXZlcnl0aGluZyBoYXMgYmVlbiBjaGVja2VkIGJ5IG5vdy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB0b3VjaCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgZGVmYXVsdFRpbWVzdGFtcCA9IGdldFRpbWVzdGFtcCgpOworCisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvdWNoKG5ldyBGaWxlUmVzb3VyY2UoZmlsZS5nZXRQYXJlbnRGaWxlKCksIGZpbGUuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHRUaW1lc3RhbXApOworICAgICAgICB9CisgICAgICAgIGlmIChyZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgcmVzb3VyY2UgY29sbGVjdGlvbnMKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFJlc291cmNlIHIgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKCEociBpbnN0YW5jZW9mIFRvdWNoYWJsZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbid0IHRvdWNoICIgKyByKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdWNoKHIsIGRlZmF1bHRUaW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVhbCB3aXRoIGZpbGVzZXRzIGluIGEgc3BlY2lhbCB3YXkgc2luY2UgdGhlIHRhc2sKKyAgICAgICAgLy8gb3JpZ2luYWxseSBhbHNvIHVzZWQgdGhlIGRpcmVjdG9yaWVzIGFuZCBVbmlvbiB3b24ndCByZXR1cm4KKyAgICAgICAgLy8gdGhlbS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc2V0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgRmlsZSBmcm9tRGlyID0gZnMuZ2V0RGlyKGdldFByb2plY3QoKSk7CisKKyAgICAgICAgICAgIFN0cmluZ1tdIHNyY0RpcnMgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3JjRGlycy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIHRvdWNoKG5ldyBGaWxlUmVzb3VyY2UoZnJvbURpciwgc3JjRGlyc1tqXSksIGRlZmF1bHRUaW1lc3RhbXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVG91Y2ggYSBzaW5nbGUgZmlsZSB3aXRoIHRoZSBjdXJyZW50IHRpbWVzdGFtcCAodGhpcy5taWxsaXMpLiBUaGlzIG1ldGhvZAorICAgICAqIGRvZXMgbm90IGludGVyYWN0IHdpdGggYW55IG5lc3RlZCBtYXBwZXJzIGFuZCByZW1haW5zIGZvciByZWFzb25zIG9mCisgICAgICogYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgb25seS4KKyAgICAgKiBAcGFyYW0gZmlsZSBmaWxlIHRvIHRvdWNoCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRvdWNoKEZpbGUgZmlsZSkgeworICAgICAgICB0b3VjaChmaWxlLCBnZXRUaW1lc3RhbXAoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldFRpbWVzdGFtcCgpIHsKKyAgICAgICAgcmV0dXJuIChtaWxsaXMgPCAwKSA/IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDogbWlsbGlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0b3VjaChSZXNvdXJjZSByLCBsb25nIGRlZmF1bHRUaW1lc3RhbXApIHsKKyAgICAgICAgaWYgKGZpbGVOYW1lTWFwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgRmlsZVJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIHRoaXMgdG8gY3JlYXRlIGZpbGUgYW5kIGRlYWwgd2l0aCBub24td3JpdGFibGUgZmlsZXMKKyAgICAgICAgICAgICAgICB0b3VjaCgoKEZpbGVSZXNvdXJjZSkgcikuZ2V0RmlsZSgpLCBkZWZhdWx0VGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKChUb3VjaGFibGUpIHIpLnRvdWNoKGRlZmF1bHRUaW1lc3RhbXApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nW10gbWFwcGVkID0gZmlsZU5hbWVNYXBwZXIubWFwRmlsZU5hbWUoci5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKG1hcHBlZCAhPSBudWxsICYmIG1hcHBlZC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgbG9uZyBtb2RUaW1lID0gZGVmYXVsdFRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBpZiAobWlsbGlzIDwgMCAmJiByLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kVGltZSA9IHIuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdWNoKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShtYXBwZWRbaV0pLCBtb2RUaW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdG91Y2goRmlsZSBmaWxlLCBsb25nIG1vZFRpbWUpIHsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBsb2coIkNyZWF0aW5nICIgKyBmaWxlLAorICAgICAgICAgICAgICAgICgodmVyYm9zZSkgPyBQcm9qZWN0Lk1TR19JTkZPIDogUHJvamVjdC5NU0dfVkVSQk9TRSkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmNyZWF0ZU5ld0ZpbGUoZmlsZSwgbWtkaXJzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSAiICsgZmlsZSwgaW9lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZpbGUuY2FuV3JpdGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4gbm90IGNoYW5nZSBtb2RpZmljYXRpb24gZGF0ZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVhZC1vbmx5IGZpbGUgIiArIGZpbGUpOworICAgICAgICB9CisgICAgICAgIEZJTEVfVVRJTFMuc2V0RmlsZUxhc3RNb2RpZmllZChmaWxlLCBtb2RUaW1lKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RyYW5zZm9ybS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHJhbnNmb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwMTQwMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RyYW5zZm9ybS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworLyoqCisgKiBIYXMgYmVlbiBtZXJnZWQgaW50byBFeGVjdXRlT24sIGVtcHR5IGNsYXNzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAqIFdlIGxlYXZlIHRoYXQgaW4gY2FzZSB0aGF0IGV4dGVybmFsIHByb2dyYW1zIGFjY2VzcyB0aGlzIGNsYXNzIGRpcmVjbHR5LAorICogZm9yIGV4YW1wbGUgdmlhCisgKiAgIDx0dD4gVHJhbnNmb3JtIHRyID0gKFRyYW5zZm9ybSkgZ2V0UHJvamVjdCgpLmNyZWF0ZVRhc2soImFwcGx5IikgPC90dD4KKyAqCisgKiBAYW50LnRhc2sgaWdub3JlPSJ0cnVlIgorICovCitwdWJsaWMgY2xhc3MgVHJhbnNmb3JtIGV4dGVuZHMgRXhlY3V0ZU9uIHsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RydW5jYXRlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UcnVuY2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3MWJkNTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UcnVuY2F0ZS5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFNldCB0aGUgbGVuZ3RoIG9mIG9uZSBvciBtb3JlIGZpbGVzLCBhcyB0aGUgaW50ZXJtaXR0ZW50bHkgYXZhaWxhYmxlCisgKiA8Y29kZT50cnVuY2F0ZTwvY29kZT4gVW5peCB1dGlsaXR5L2Z1bmN0aW9uLgorICogQHNpbmNlIEFudCAxLjcuMQorICovCitwdWJsaWMgY2xhc3MgVHJ1bmNhdGUgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEwMjQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb25nIFpFUk8gPSBuZXcgTG9uZygwTCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ0hJTEQgPSAiTm8gZmlsZXMgc3BlY2lmaWVkLiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9MRU5HVEggPSAiQ2Fubm90IHRydW5jYXRlIHRvIGxlbmd0aCAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfV1JJVEUgPSAicnciOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRklMTF9CVUZGRVIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisKKyAgICBwcml2YXRlIFBhdGggcGF0aDsKKyAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbWtkaXJzID0gZmFsc2U7CisKKyAgICBwcml2YXRlIExvbmcgbGVuZ3RoOworICAgIHByaXZhdGUgTG9uZyBhZGp1c3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBzaW5nbGUgdGFyZ2V0IEZpbGUuCisgICAgICogQHBhcmFtIGYgdGhlIHNpbmdsZSBGaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGYpIHsKKyAgICAgICAgYWRkKG5ldyBGaWxlUmVzb3VyY2UoZikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5lc3RlZCAoZmlsZXN5c3RlbS1vbmx5KSBSZXNvdXJjZUNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHJjIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgZ2V0UGF0aCgpLmFkZChyYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbW91bnQgYnkgd2hpY2ggZmlsZXMnIGxlbmd0aHMgc2hvdWxkIGJlIGFkanVzdGVkLgorICAgICAqIEl0IGlzIHBlcm1pc3NpYmxlIHRvIGFwcGVuZCBLIC8gTSAvIEcgLyBUIC8gUC4KKyAgICAgKiBAcGFyYW0gYWRqdXN0IChwb3NpdGl2ZSBvciBuZWdhdGl2ZSkgYWRqdXN0bWVudCBhbW91bnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRqdXN0KExvbmcgYWRqdXN0KSB7CisgICAgICAgIHRoaXMuYWRqdXN0ID0gYWRqdXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbGVuZ3RoIHRvIHdoaWNoIGZpbGVzIHNob3VsZCBiZSBzZXQuCisgICAgICogSXQgaXMgcGVybWlzc2libGUgdG8gYXBwZW5kIEsgLyBNIC8gRyAvIFQgLyBQLgorICAgICAqIEBwYXJhbSBsZW5ndGggKHBvc2l0aXZlKSBhZGp1c3RtZW50IGFtb3VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoTG9uZyBsZW5ndGgpIHsKKyAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgICAgIGlmIChsZW5ndGggIT0gbnVsbCAmJiBsZW5ndGgubG9uZ1ZhbHVlKCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oSU5WQUxJRF9MRU5HVEggKyBsZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gY3JlYXRlIG5vbmV4aXN0ZW50IGZpbGVzLgorICAgICAqIEBwYXJhbSBjcmVhdGUgYm9vbGVhbiwgZGVmYXVsdCA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGUoYm9vbGVhbiBjcmVhdGUpIHsKKyAgICAgICAgdGhpcy5jcmVhdGUgPSBjcmVhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIsIHdoZW4gY3JlYXRpbmcgbm9uZXhpc3RlbnQgZmlsZXMsIG5vbmV4aXN0ZW50IGRpcmVjdG9yaWVzCisgICAgICogc2hvdWxkIGFsc28gYmUgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gbWtkaXJzIGJvb2xlYW4sIGRlZmF1bHQgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1rZGlycyhib29sZWFuIG1rZGlycykgeworICAgICAgICB0aGlzLm1rZGlycyA9IG1rZGlyczsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBpZiAobGVuZ3RoICE9IG51bGwgJiYgYWRqdXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImxlbmd0aCBhbmQgYWRqdXN0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUgb3B0aW9ucyIpOworICAgICAgICB9CisgICAgICAgIGlmIChsZW5ndGggPT0gbnVsbCAmJiBhZGp1c3QgPT0gbnVsbCkgeworICAgICAgICAgICAgbGVuZ3RoID0gWkVSTzsKKyAgICAgICAgfQorICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oTk9fQ0hJTEQpOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwYXRoLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEZpbGUgZiA9ICgoRmlsZVJlc291cmNlKSBpdC5uZXh0KCkpLmdldEZpbGUoKTsKKyAgICAgICAgICAgIGlmIChzaG91bGRQcm9jZXNzKGYpKSB7CisgICAgICAgICAgICAgICAgcHJvY2VzcyhmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRQcm9jZXNzKEZpbGUgZikgeworICAgICAgICBpZiAoZi5pc0ZpbGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjcmVhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChGSUxFX1VUSUxTLmNyZWF0ZU5ld0ZpbGUoZiwgbWtkaXJzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBtc2cgPSAiVW5hYmxlIHRvIGNyZWF0ZSAiICsgZjsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBleGNlcHRpb24pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKEZpbGUgZikgeworICAgICAgICBsb25nIGxlbiA9IGYubGVuZ3RoKCk7CisgICAgICAgIGxvbmcgbmV3TGVuZ3RoID0gbGVuZ3RoID09IG51bGwKKyAgICAgICAgICAgICAgICA/IGxlbiArIGFkanVzdC5sb25nVmFsdWUoKSA6IGxlbmd0aC5sb25nVmFsdWUoKTsKKworICAgICAgICBpZiAobGVuID09IG5ld0xlbmd0aCkgeworICAgICAgICAgICAgLy9ub3RoaW5nIHRvIGRvIQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGYsIFJFQURfV1JJVEUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiAiICsgZiArICIgZm9yIHdyaXRpbmciLCBlKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG5ld0xlbmd0aCA+IGxlbikgeworICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gbGVuOworICAgICAgICAgICAgICAgIHJhZi5zZWVrKHBvcyk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IG5ld0xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHdyaXRlQ291bnQgPSBNYXRoLm1pbihGSUxMX0JVRkZFUi5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVuZ3RoIC0gcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgcmFmLndyaXRlKEZJTExfQlVGRkVSLCAwLCAoaW50KSB3cml0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgcG9zICs9IHdyaXRlQ291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByYWYuc2V0TGVuZ3RoKG5ld0xlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhjZXB0aW9uIHdvcmtpbmcgd2l0aCAiICsgcmFmLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmFmLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJDYXVnaHQgIiArIGUgKyAiIGNsb3NpbmcgIiArIHJhZiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBQYXRoIGdldFBhdGgoKSB7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RzdGFtcC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHN0YW1wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyZjJiMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RzdGFtcC5qYXZhCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkxvY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworCisvKioKKyAqIFNldHMgcHJvcGVydGllcyB0byB0aGUgY3VycmVudCB0aW1lLCBvciBvZmZzZXRzIGZyb20gdGhlIGN1cnJlbnQgdGltZS4KKyAqIFRoZSBkZWZhdWx0IHByb3BlcnRpZXMgYXJlIFRTVEFNUCwgRFNUQU1QIGFuZCBUT0RBWTsKKyAqCisgKiBAc2luY2UgQW50IDEuMQorICogQGFudC50YXNrIGNhdGVnb3J5PSJ1dGlsaXR5IgorICovCitwdWJsaWMgY2xhc3MgVHN0YW1wIGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIFZlY3RvciBjdXN0b21Gb3JtYXRzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeCA9ICIiOworCisgICAgLyoqCisgICAgICogU2V0IGEgcHJlZml4IGZvciB0aGUgcHJvcGVydGllcy4gSWYgdGhlIHByZWZpeCBkb2VzIG5vdCBlbmQgd2l0aCBhICIuIgorICAgICAqIG9uZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkLgorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCB0byB1c2UuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgeworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgaWYgKCF0aGlzLnByZWZpeC5lbmRzV2l0aCgiLiIpKSB7CisgICAgICAgICAgICB0aGlzLnByZWZpeCArPSAiLiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgdGhlIHRpbWVzdGFtcHMuIEN1c3RvbSBvbmVzIGFyZSBkb25lIGJlZm9yZQorICAgICAqIHRoZSBzdGFuZGFyZCBvbmVzLCB0byBnZXQgdGhlaXIgcmV0YWxpYXRpb24gaW4gZWFybHkuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERhdGUgZCA9IG5ldyBEYXRlKCk7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGkgPSBjdXN0b21Gb3JtYXRzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoaS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIEN1c3RvbUZvcm1hdCBjdHMgPSAoQ3VzdG9tRm9ybWF0KSBpLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgY3RzLmV4ZWN1dGUoZ2V0UHJvamVjdCgpLCBkLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBkc3RhbXAgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCAoInl5eXlNTWRkIik7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eSgiRFNUQU1QIiwgZHN0YW1wLmZvcm1hdChkKSk7CisKKyAgICAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgdHN0YW1wID0gbmV3IFNpbXBsZURhdGVGb3JtYXQgKCJISG1tIik7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eSgiVFNUQU1QIiwgdHN0YW1wLmZvcm1hdChkKSk7CisKKyAgICAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgdG9kYXkKKyAgICAgICAgICAgICAgICA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0ICgiTU1NTSBkIHl5eXkiLCBMb2NhbGUuVVMpOworICAgICAgICAgICAgc2V0UHJvcGVydHkoIlRPREFZIiwgdG9kYXkuZm9ybWF0KGQpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIGEgY3VzdG9tIGZvcm1hdCB3aXRoIHRoZSBjdXJyZW50IHByZWZpeC4KKyAgICAgKiBAcmV0dXJuIGEgcmVhZHkgdG8gZmlsbC1pbiBmb3JtYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ3VzdG9tRm9ybWF0IGNyZWF0ZUZvcm1hdCgpIHsKKyAgICAgICAgQ3VzdG9tRm9ybWF0IGN0cyA9IG5ldyBDdXN0b21Gb3JtYXQoKTsKKyAgICAgICAgY3VzdG9tRm9ybWF0cy5hZGRFbGVtZW50KGN0cyk7CisgICAgICAgIHJldHVybiBjdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGVscGVyIHRoYXQgZW5jYXBzdWxhdGVzIHByZWZpeCBsb2dpYyBhbmQgcHJvcGVydHkgc2V0dGluZworICAgICAqIHBvbGljeSAoaS5lLiB3ZSB1c2Ugc2V0TmV3UHJvcGVydHkgaW5zdGVhZCBvZiBzZXRQcm9wZXJ0eSkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHByZWZpeCArIG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG5lc3RlZCBlbGVtZW50IHRoYXQgYWxsb3dzIGEgcHJvcGVydHkgdG8gYmUgc2V0CisgICAgICogdG8gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbiBhIGdpdmVuIGZvcm1hdC4KKyAgICAgKiBUaGUgZGF0ZS90aW1lIHBhdHRlcm5zIGFyZSBhcyBkZWZpbmVkIGluIHRoZQorICAgICAqIEphdmEgU2ltcGxlRGF0ZUZvcm1hdCBjbGFzcy4KKyAgICAgKiBUaGUgZm9ybWF0IGVsZW1lbnQgYWxzbyBhbGxvd3Mgb2Zmc2V0cyB0byBiZSBhcHBsaWVkIHRvCisgICAgICogdGhlIHRpbWUgdG8gZ2VuZXJhdGUgZGlmZmVyZW50IHRpbWUgdmFsdWVzLgorICAgICAqIEB0b2RvIGNvbnNpZGVyIHJlZmFjdG9yaW5nIG91dCBpbnRvIGEgcmUtdXNhYmxlIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIEN1c3RvbUZvcm1hdCB7CisgICAgICAgIHByaXZhdGUgVGltZVpvbmUgdGltZVpvbmU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGFuZ3VhZ2U7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvdW50cnk7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhcmlhbnQ7CisgICAgICAgIHByaXZhdGUgaW50IG9mZnNldCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IGZpZWxkID0gQ2FsZW5kYXIuREFURTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgZm9ybWF0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3VzdG9tRm9ybWF0KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBUaGUgcHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgZGF0ZS90aW1lIHN0cmluZyBpbiB0aGUgZ2l2ZW4gcGF0dGVybgorICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlL3RpbWUgcGF0dGVybiB0byBiZSB1c2VkLiBUaGUgdmFsdWVzIGFyZSBhcworICAgICAgICAgKiBkZWZpbmVkIGJ5IHRoZSBKYXZhIFNpbXBsZURhdGVGb3JtYXQgY2xhc3MuCisgICAgICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRvIHVzZS4KKyAgICAgICAgICogQHNlZSBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworICAgICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbG9jYWxlIHVzZWQgdG8gY3JlYXRlIGRhdGUvdGltZSBzdHJpbmcuCisgICAgICAgICAqIFRoZSBnZW5lcmFsIGZvcm0gaXMgImxhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50IiBidXQKKyAgICAgICAgICogZWl0aGVyIHZhcmlhbnQgb3IgdmFyaWFudCBhbmQgY291bnRyeSBtYXkgYmUgb21pdHRlZC4KKyAgICAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIGRvY3VtZW50YXRpb24KKyAgICAgICAgICogZm9yIHRoZSBqYXZhLnV0aWwuTG9jYWxlICBjbGFzcy4KKyAgICAgICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIHRvIHVzZS4KKyAgICAgICAgICogQHNlZSBqYXZhLnV0aWwuTG9jYWxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoU3RyaW5nIGxvY2FsZSkgeworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihsb2NhbGUsICIgXHRcblxyXGYsIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gc3QubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0Lmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50cnkgPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0Lmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0gc3QubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJhZCBsb2NhbGUgZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYmFkIGxvY2FsZSBmb3JtYXQiLCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZXpvbmUgdG8gdXNlIGZvciBkaXNwbGF5aW5nIHRpbWUuCisgICAgICAgICAqIFRoZSB2YWx1ZXMgYXJlIGFzIGRlZmluZWQgYnkgdGhlIEphdmEgVGltZVpvbmUgY2xhc3MuCisgICAgICAgICAqIEBwYXJhbSBpZCB0aGUgdGltZXpvbmUgdmFsdWUuCisgICAgICAgICAqIEBzZWUgamF2YS51dGlsLlRpbWVab25lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lem9uZShTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHRpbWVab25lID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoaWQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBudW1lcmljIG9mZnNldCB0byB0aGUgY3VycmVudCB0aW1lLgorICAgICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gdXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgdW5pdCB0eXBlICh1c2luZyBTdHJpbmcpLgorICAgICAgICAgKiBAcGFyYW0gdW5pdCB0aGUgdW5pdCB0byB1c2UuCisgICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAgICAgKiAgICAgICAgICAgICBzZXRVbml0KFN0cmluZykgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcmVwbGFjZWQgd2l0aAorICAgICAgICAgKiAgICAgICAgICAgICBzZXRVbml0KFRzdGFtcC5Vbml0KSB0byBtYWtlIEFudCdzCisgICAgICAgICAqICAgICAgICAgICAgIEludHJvc3BlY3Rpb24gbWVjaGFuaXNtIGRvIHRoZSB3b3JrIGFuZCBhbHNvIHRvCisgICAgICAgICAqICAgICAgICAgICAgIGVuY2Fwc3VsYXRlIG9wZXJhdGlvbnMgb24gdGhlIHVuaXQgaW4gaXRzIG93bgorICAgICAgICAgKiAgICAgICAgICAgICBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVuaXQoU3RyaW5nIHVuaXQpIHsKKyAgICAgICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSBzZXRVbml0KFN0cmluZykgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIgorICAgICAgICAgICAgICAgICsgIiBVc2Ugc2V0VW5pdChUc3RhbXAuVW5pdCkgaW5zdGVhZC4iKTsKKyAgICAgICAgICAgIFVuaXQgdSA9IG5ldyBVbml0KCk7CisgICAgICAgICAgICB1LnNldFZhbHVlKHVuaXQpOworICAgICAgICAgICAgZmllbGQgPSB1LmdldENhbGVuZGFyRmllbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pdCBvZiB0aGUgb2Zmc2V0IHRvIGJlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgdGltZS4KKyAgICAgICAgICogVmFsaWQgVmFsdWVzIGFyZQorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqICAgIDxsaT5taWxsaXNlY29uZDwvbGk+CisgICAgICAgICAqICAgIDxsaT5zZWNvbmQ8L2xpPgorICAgICAgICAgKiAgICA8bGk+bWludXRlPC9saT4KKyAgICAgICAgICogICAgPGxpPmhvdXI8L2xpPgorICAgICAgICAgKiAgICA8bGk+ZGF5PC9saT4KKyAgICAgICAgICogICAgPGxpPndlZWs8L2xpPgorICAgICAgICAgKiAgICA8bGk+bW9udGg8L2xpPgorICAgICAgICAgKiAgICA8bGk+eWVhcjwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqIFRoZSBkZWZhdWx0IHVuaXQgaXMgZGF5LgorICAgICAgICAgKiBAcGFyYW0gdW5pdCB0aGUgdW5pdCB0byB1c2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbml0KFVuaXQgdW5pdCkgeworICAgICAgICAgICAgZmllbGQgPSB1bml0LmdldENhbGVuZGFyRmllbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiB2YWxpZGF0ZSBwYXJhbWV0ZXIgYW5kIGV4ZWN1dGUgdGhlIGZvcm1hdC4KKyAgICAgICAgICogQHBhcmFtIHByb2plY3QgcHJvamVjdCB0byBzZXQgcHJvcGVydHkgaW4uCisgICAgICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgdG8gdXNlIGFzIGEgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBsb2NhdGlvbiBsaW5lIGluIGZpbGUgKGZvciBlcnJvcnMpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFByb2plY3QgcHJvamVjdCwgRGF0ZSBkYXRlLCBMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwcm9wZXJ0eSBhdHRyaWJ1dGUgbXVzdCBiZSBwcm92aWRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicGF0dGVybiBhdHRyaWJ1dGUgbXVzdCBiZSBwcm92aWRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGY7CisgICAgICAgICAgICBpZiAobGFuZ3VhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KHBhdHRlcm4pOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YXJpYW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQocGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIGNhbGVuZGFyLnNldFRpbWUoZGF0ZSk7CisgICAgICAgICAgICAgICAgY2FsZW5kYXIuYWRkKGZpZWxkLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIGRhdGUgPSBjYWxlbmRhci5nZXRUaW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGltZVpvbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNkZi5zZXRUaW1lWm9uZSh0aW1lWm9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUc3RhbXAudGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHNkZi5mb3JtYXQoZGF0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IG9mIHZhbGlkIHVuaXRzIHRvIHVzZSBmb3IgdGltZSBvZmZzZXRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVW5pdCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSUxMSVNFQ09ORCA9ICJtaWxsaXNlY29uZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkQgPSAic2Vjb25kIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTlVURSA9ICJtaW51dGUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9VUiA9ICJob3VyIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBWSA9ICJkYXkiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VFSyA9ICJ3ZWVrIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PTlRIID0gIm1vbnRoIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFlFQVIgPSAieWVhciI7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5JVFMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSUxMSVNFQ09ORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ09ORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlVURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPVVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUVLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9OVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZRUFSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIE1hcCBjYWxlbmRhckZpZWxkcyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgLyoqIENvbnN0cnVjdG9yIGZvciBVbml0IGVudW1lcmF0ZWQgdHlwZS4gKi8KKyAgICAgICAgcHVibGljIFVuaXQoKSB7CisgICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoTUlMTElTRUNPTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoQ2FsZW5kYXIuTUlMTElTRUNPTkQpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChTRUNPTkQsIG5ldyBJbnRlZ2VyKENhbGVuZGFyLlNFQ09ORCkpOworICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KE1JTlVURSwgbmV3IEludGVnZXIoQ2FsZW5kYXIuTUlOVVRFKSk7CisgICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoSE9VUiwgbmV3IEludGVnZXIoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChEQVksIG5ldyBJbnRlZ2VyKENhbGVuZGFyLkRBVEUpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChXRUVLLCBuZXcgSW50ZWdlcihDYWxlbmRhci5XRUVLX09GX1lFQVIpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChNT05USCwgbmV3IEludGVnZXIoQ2FsZW5kYXIuTU9OVEgpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChZRUFSLCBuZXcgSW50ZWdlcihDYWxlbmRhci5ZRUFSKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydCB0aGUgdmFsdWUgdG8gaW50IHVuaXQgdmFsdWUuCisgICAgICAgICAqIEByZXR1cm4gYW4gaW50IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRDYWxlbmRhckZpZWxkKCkgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbHVlKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIEludGVnZXIgaSA9IChJbnRlZ2VyKSBjYWxlbmRhckZpZWxkcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiBpLmludFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB2YWxpZCB2YWx1ZXMuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gVU5JVFM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UeXBlZGVmLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UeXBlZGVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyNzZlMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1R5cGVkZWYuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKKworCisvKioKKyAqCisgKiBBZGRzIGEgZGF0YSB0eXBlIGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAqIFR3byBhdHRyaWJ1dGVzIGFyZQorICogbmVlZGVkLCB0aGUgbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhpcyBkYXRhIHR5cGUgdW5pcXVlbHksIGFuZCB0aGUgZnVsbAorICogbmFtZSBvZiB0aGUgY2xhc3MgKGluY2x1ZGluZyB0aGUgcGFja2FnZXMpIHRoYXQgaW1wbGVtZW50cyB0aGlzCisgKiB0eXBlLgorICogPHA+WW91IGNhbiBhbHNvIGRlZmluZSBhIGdyb3VwIG9mIGRhdGEgdHlwZXMgYXQgb25jZSB1c2luZyB0aGUgZmlsZSBvcgorICogcmVzb3VyY2UgYXR0cmlidXRlcy4gIFRoZXNlIGF0dHJpYnV0ZXMgcG9pbnQgdG8gZmlsZXMgaW4gdGhlIGZvcm1hdCBvZgorICogSmF2YSBwcm9wZXJ0eSBmaWxlcy4gICBFYWNoIGxpbmUgZGVmaW5lcyBhIHNpbmdsZSBkYXRhIHR5cGUgaW4gdGhlCisgKiBmb3JtYXQ6PC9wPgorICogPHByZT4KKyAqIHR5cGVuYW1lPWZ1bGx5LnF1YWxpZmllZC5qYXZhLmNsYXNzbmFtZQorICogPC9wcmU+CisgKiA8cD5UeXBlZGVmIHNob3VsZCBiZSB1c2VkIHRvIGFkZCB5b3VyIG93biB0eXBlcyB0byB0aGUgc3lzdGVtLiBEYXRhCisgKiB0eXBlcyBhcmUgdGhpbmdzIGxpa2VwYXRocyBvciBmaWxlc2V0cyB0aGF0IGNhbiBiZSBkZWZpbmVkIGF0CisgKiB0aGUgcHJvamVjdCBsZXZlbCBhbmQgcmVmZXJlbmNlZCB2aWEgdGhlaXIgSUQgYXR0cmlidXRlLjwvcD4KKyAqIDxwPkN1c3RvbSBkYXRhIHR5cGVzIHVzdWFsbHkgbmVlZCBjdXN0b20gdGFza3MgdG8gcHV0IHRoZW0gdG8gZ29vZCB1c2UuPC9wPgorICoKKyAqIEBzaW5jZSBBbnQgMS40CisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImludGVybmFsIgorICovCitwdWJsaWMgY2xhc3MgVHlwZWRlZiBleHRlbmRzIERlZmluZXIgeworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW5wYWNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnBhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2ZiYzRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW5wYWNrLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CisKKy8qKgorICogQWJzdHJhY3QgQmFzZSBjbGFzcyBmb3IgdW5wYWNrIHRhc2tzLgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFVucGFjayBleHRlbmRzIFRhc2sgeworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIEZpbGUgc291cmNlOworICAgIHByb3RlY3RlZCBGaWxlIGRlc3Q7CisgICAgcHJvdGVjdGVkIFJlc291cmNlIHNyY1Jlc291cmNlOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KKyAgICAgKiAgICAgICAgICAgICBzZXRTcmMoU3RyaW5nKSBpcyBkZXByZWNhdGVkIGFuZCBpcyByZXBsYWNlZCB3aXRoCisgICAgICogICAgICAgICAgICAgc2V0U3JjKEZpbGUpIHRvIG1ha2UgQW50J3MgSW50cm9zcGVjdGlvbgorICAgICAqICAgICAgICAgICAgIG1lY2hhbmlzbSBkbyB0aGUgd29yayBhbmQgYWxzbyB0byBlbmNhcHN1bGF0ZSBvcGVyYXRpb25zIG9uCisgICAgICogICAgICAgICAgICAgdGhlIHR5cGUgaW4gaXRzIG93biBjbGFzcy4KKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICogQHBhcmFtIHNyYyBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmMoU3RyaW5nIHNyYykgeworICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBUaGUgc2V0U3JjKFN0cmluZykgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIgorICAgICAgICAgICAgKyAiIFVzZSBzZXRTcmMoRmlsZSkgaW5zdGVhZC4iKTsKKyAgICAgICAgc2V0U3JjKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShzcmMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KKyAgICAgKiAgICAgICAgICAgICBzZXREZXN0KFN0cmluZykgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcmVwbGFjZWQgd2l0aAorICAgICAqICAgICAgICAgICAgIHNldERlc3QoRmlsZSkgdG8gbWFrZSBBbnQncyBJbnRyb3NwZWN0aW9uCisgICAgICogICAgICAgICAgICAgbWVjaGFuaXNtIGRvIHRoZSB3b3JrIGFuZCBhbHNvIHRvIGVuY2Fwc3VsYXRlIG9wZXJhdGlvbnMgb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgdHlwZSBpbiBpdHMgb3duIGNsYXNzLgorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKiBAcGFyYW0gZGVzdCBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0KFN0cmluZyBkZXN0KSB7CisgICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSBzZXREZXN0KFN0cmluZykgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIgorICAgICAgICAgICAgKyAiIFVzZSBzZXREZXN0KEZpbGUpIGluc3RlYWQuIik7CisgICAgICAgIHNldERlc3QoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGRlc3QpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0byBleHBhbmQ7IHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBzcmMgZmlsZSB0byBleHBhbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBzcmMpIHsKKyAgICAgICAgc2V0U3JjUmVzb3VyY2UobmV3IEZpbGVSZXNvdXJjZShzcmMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgdG8gZXhwYW5kOyByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gc3JjIHJlc291cmNlIHRvIGV4cGFuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY1Jlc291cmNlKFJlc291cmNlIHNyYykgeworICAgICAgICBpZiAoIXNyYy5pc0V4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInRoZSBhcmNoaXZlICIgKyBzcmMuZ2V0TmFtZSgpICsgIiBkb2Vzbid0IGV4aXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyYy5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInRoZSBhcmNoaXZlICIgKyBzcmMuZ2V0TmFtZSgpICsgIiBjYW4ndCBiZSBhIGRpcmVjdG9yeSIpOworICAgICAgICB9CisgICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHNvdXJjZSA9ICgoRmlsZVJlc291cmNlKSBzcmMpLmdldEZpbGUoKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIHNvdXJjZSAiICsgc3JjLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBGaWxlU3lzdGVtICIKKyAgICAgICAgICAgICAgICArICJPbmx5IEZpbGVTeXN0ZW0gcmVzb3VyY2VzIGFyZSIKKyAgICAgICAgICAgICAgICArICIgc3VwcG9ydGVkLiIpOworICAgICAgICB9CisgICAgICAgIHNyY1Jlc291cmNlID0gc3JjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc291cmNlIEFyY2hpdmUgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIGEgdGhlIGFyY2hpdmUgYXMgYSBzaW5nbGUgZWxlbWVudCBSZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWQoUmVzb3VyY2VDb2xsZWN0aW9uIGEpIHsKKyAgICAgICAgaWYgKGEuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib25seSBzaW5nbGUgYXJndW1lbnQgcmVzb3VyY2UgY29sbGVjdGlvbnMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFyZSBzdXBwb3J0ZWQgYXMgYXJjaGl2ZXMiKTsKKyAgICAgICAgfQorICAgICAgICBzZXRTcmNSZXNvdXJjZSgoUmVzb3VyY2UpIGEuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZXN0aW5hdGlvbiBmaWxlIG9yIGRpcmVjdG9yeTsgb3B0aW9uYWwuCisgICAgICogQHBhcmFtIGRlc3QgZGVzdGluYXRpb24gZmlsZSBvciBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0KEZpbGUgZGVzdCkgeworICAgICAgICB0aGlzLmRlc3QgPSBkZXN0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzcmNSZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIFNyYyBzcGVjaWZpZWQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3QgPSBuZXcgRmlsZShzb3VyY2UuZ2V0UGFyZW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3QuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRFeHRlbnNpb24gPSBnZXREZWZhdWx0RXh0ZW5zaW9uKCk7CisgICAgICAgICAgICBjcmVhdGVEZXN0RmlsZShkZWZhdWx0RXh0ZW5zaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVEZXN0RmlsZShTdHJpbmcgZGVmYXVsdEV4dGVuc2lvbikgeworICAgICAgICBTdHJpbmcgc291cmNlTmFtZSA9IHNvdXJjZS5nZXROYW1lKCk7CisgICAgICAgIGludCBsZW4gPSBzb3VyY2VOYW1lLmxlbmd0aCgpOworICAgICAgICBpZiAoZGVmYXVsdEV4dGVuc2lvbiAhPSBudWxsCisgICAgICAgICAgICAmJiBsZW4gPiBkZWZhdWx0RXh0ZW5zaW9uLmxlbmd0aCgpCisgICAgICAgICAgICAmJiBkZWZhdWx0RXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoCisgICAgICAgICAgICAgICAgc291cmNlTmFtZS5zdWJzdHJpbmcobGVuIC0gZGVmYXVsdEV4dGVuc2lvbi5sZW5ndGgoKSkpKSB7CisgICAgICAgICAgICBkZXN0ID0gbmV3IEZpbGUoZGVzdCwgc291cmNlTmFtZS5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBkZWZhdWx0RXh0ZW5zaW9uLmxlbmd0aCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0ID0gbmV3IEZpbGUoZGVzdCwgc291cmNlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzYXZlZERlc3QgPSBkZXN0OyAvLyBtYXkgYmUgYWx0ZXJlZCBpbiB2YWxpZGF0ZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIGV4dHJhY3QoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGRlc3QgPSBzYXZlZERlc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGV4dGVuc2lvbi4KKyAgICAgKiBUaGlzIGlzIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGV4dGVuc2lvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRFeHRlbnNpb24oKTsKKworICAgIC8qKgorICAgICAqIERvIHRoZSB1bmNvbXByZXNzaW5nLgorICAgICAqIFRoaXMgaXMgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGV4dHJhY3QoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0YXNrIGNhbiBkZWFsIHdpdGggbm9uLWZpbGUgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGZhbHNlLjwvcD4KKyAgICAgKiBAcmV0dXJuIGZhbHNlIGZvciB0aGlzIHRhc2suCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c05vbkZpbGVSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VudGFyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnRhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODY0YzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnRhci5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVOYW1lTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYnppcDIuQ0JaaXAySW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy50YXIuVGFyRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy50YXIuVGFySW5wdXRTdHJlYW07CisKKworCisvKioKKyAqIFVudGFyIGEgZmlsZS4KKyAqIDxwPkZvciBKREsgMS4xICZxdW90O2xhc3QgbW9kaWZpZWQgdGltZSZxdW90OyBmaWVsZCBpcyBzZXQgdG8gY3VycmVudCB0aW1lIGluc3RlYWQgb2YgYmVpbmcKKyAqIGNhcnJpZWQgZnJvbSB0aGUgYXJjaGl2ZSBmaWxlLjwvcD4KKyAqIDxwPlBhdHRlcm5TZXRzIGFyZSB1c2VkIHRvIHNlbGVjdCBmaWxlcyB0byBleHRyYWN0CisgKiA8ST5mcm9tPC9JPiB0aGUgYXJjaGl2ZS4gIElmIG5vIHBhdHRlcm5zZXQgaXMgdXNlZCwgYWxsIGZpbGVzIGFyZSBleHRyYWN0ZWQuCisgKiA8L3A+CisgKiA8cD5GaWxlU2V0PnMgbWF5IGJlIHVzZWQgdG8gc2VsZWN0IGFyY2hpdmVkIGZpbGVzCisgKiB0byBwZXJmb3JtIHVuYXJjaGl2YWwgdXBvbi4KKyAqIDwvcD4KKyAqIDxwPkZpbGUgcGVybWlzc2lvbnMgd2lsbCBub3QgYmUgcmVzdG9yZWQgb24gZXh0cmFjdGVkIGZpbGVzLjwvcD4KKyAqIDxwPlRoZSB1bnRhciB0YXNrIHJlY29nbml6ZXMgdGhlIGxvbmcgcGF0aG5hbWUgZW50cmllcyB1c2VkIGJ5IEdOVSB0YXIuPHA+CisgKgorICogQHNpbmNlIEFudCAxLjEKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InBhY2thZ2luZyIKKyAqLworcHVibGljIGNsYXNzIFVudGFyIGV4dGVuZHMgRXhwYW5kIHsKKyAgICAvKioKKyAgICAgKiAgIGNvbXByZXNzaW9uIG1ldGhvZAorICAgICAqLworICAgIHByaXZhdGUgVW50YXJDb21wcmVzc2lvbk1ldGhvZCBjb21wcmVzc2lvbiA9IG5ldyBVbnRhckNvbXByZXNzaW9uTWV0aG9kKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgZGVjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gdXNlOyBkZWZhdWx0PW5vbmUuCisgICAgICoKKyAgICAgKiBBbGxvd2FibGUgdmFsdWVzIGFyZQorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5ub25lIC0gbm8gY29tcHJlc3Npb24KKyAgICAgKiAgIDxsaT5nemlwIC0gR3ppcCBjb21wcmVzc2lvbgorICAgICAqICAgPGxpPmJ6aXAyIC0gQnppcDIgY29tcHJlc3Npb24KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBjb21wcmVzc2lvbiBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvbihVbnRhckNvbXByZXNzaW9uTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBjb21wcmVzc2lvbiA9IG1ldGhvZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBObyBlbmNvZGluZyBzdXBwb3J0IGluIFVudGFyLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBub3QgdXNlZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWx3YXlzCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgIiArIGdldFRhc2tOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXNrIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZW5jb2RpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXR0cmlidXRlIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBFeHBhbmQjZXhwYW5kRmlsZShGaWxlVXRpbHMsIEZpbGUsIEZpbGUpCisgICAgICovCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleHBhbmRGaWxlKEZpbGVVdGlscyBmaWxlVXRpbHMsIEZpbGUgc3JjRiwgRmlsZSBkaXIpIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyY0YpOworICAgICAgICAgICAgZXhwYW5kU3RyZWFtKHNyY0YuZ2V0UGF0aCgpLCBmaXMsIGRpcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBleHBhbmRpbmcgIiArIHNyY0YuZ2V0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZmlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIG92ZXJyaWRkZW4gYnkgZXh0ZW5kaW5nIHVuYXJjaGl2YWwgdGFza3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjUiAgICAgIHRoZSBzb3VyY2UgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gZGlyICAgICAgIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV4cGFuZFJlc291cmNlKFJlc291cmNlIHNyY1IsIEZpbGUgZGlyKSB7CisgICAgICAgIElucHV0U3RyZWFtIGkgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaSA9IHNyY1IuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGV4cGFuZFN0cmVhbShzcmNSLmdldE5hbWUoKSwgaSwgZGlyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHdoaWxlIGV4cGFuZGluZyAiICsgc3JjUi5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4cGFuZFN0cmVhbShTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gc3RyZWFtLCBGaWxlIGRpcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVGFySW5wdXRTdHJlYW0gdGlzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRpcyA9CisgICAgICAgICAgICAgICAgbmV3IFRhcklucHV0U3RyZWFtKGNvbXByZXNzaW9uLmRlY29tcHJlc3MobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pKSk7CisgICAgICAgICAgICBsb2coIkV4cGFuZGluZzogIiArIG5hbWUgKyAiIGludG8gIiArIGRpciwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICBUYXJFbnRyeSB0ZSA9IG51bGw7CisgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSBnZXRNYXBwZXIoKTsKKyAgICAgICAgICAgIHdoaWxlICgodGUgPSB0aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBleHRyYWN0RmlsZShGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCksIG51bGwsIGRpciwgdGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlLmdldE5hbWUoKSwgdGUuZ2V0TW9kVGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlLmlzRGlyZWN0b3J5KCksIG1hcHBlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coImV4cGFuZCBjb21wbGV0ZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHRpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZCBNb2RlcyBmb3IgQ29tcHJlc3Npb24gYXR0cmlidXRlIHRvIFVudGFyIFRhc2sKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVW50YXJDb21wcmVzc2lvbk1ldGhvZAorICAgICAgICBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworCisgICAgICAgIC8vIHBlcm1pc3NpYmxlIHZhbHVlcyBmb3IgY29tcHJlc3Npb24gYXR0cmlidXRlCisgICAgICAgIC8qKgorICAgICAgICAgKiAgTm8gY29tcHJlc3Npb24KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIm5vbmUiOworICAgICAgICAvKioKKyAgICAgICAgICogIEdaSVAgY29tcHJlc3Npb24KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHWklQID0gImd6aXAiOworICAgICAgICAvKioKKyAgICAgICAgICogIEJaSVAyIGNvbXByZXNzaW9uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlpJUDIgPSAiYnppcDIiOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBDb25zdHJ1Y3RvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFVudGFyQ29tcHJlc3Npb25NZXRob2QoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgc2V0VmFsdWUoTk9ORSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlcworICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHZhbGlkIHZhbHVlcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge05PTkUsIEdaSVAsIEJaSVAyfTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiAgVGhpcyBtZXRob2Qgd3JhcHMgdGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZQorICAgICAgICAgKiAgICAgY29ycmVzcG9uZGluZyBkZWNvbXByZXNzaW9uIG1ldGhvZAorICAgICAgICAgKgorICAgICAgICAgKiAgQHBhcmFtIG5hbWUgcHJvdmlkZXMgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAqICBAcGFyYW0gaXN0cmVhbSBpbnB1dCBzdHJlYW0KKyAgICAgICAgICogIEByZXR1cm4gaW5wdXQgc3RyZWFtIHdpdGggb24tdGhlLWZseSBkZWNvbXByZXNzaW9uCisgICAgICAgICAqICBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIHRocm93biBieSBHWklQSW5wdXRTdHJlYW0gY29uc3RydWN0b3IKKyAgICAgICAgICogIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gdGhyb3duIGlmIGJ6aXAgc3RyZWFtIGRvZXMgbm90CisgICAgICAgICAqICAgICBzdGFydCB3aXRoIGV4cGVjdGVkIG1hZ2ljIHZhbHVlcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGRlY29tcHJlc3MoZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpc3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdiA9IGdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoR1pJUC5lcXVhbHModikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdaSVBJbnB1dFN0cmVhbShpc3RyZWFtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKEJaSVAyLmVxdWFscyh2KSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBjaGFyW10gbWFnaWMgPSBuZXcgY2hhcltdIHsnQicsICdaJ307CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFnaWMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3RyZWFtLnJlYWQoKSAhPSBtYWdpY1tpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYnoyIGZpbGUuIiArIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ0JaaXAySW5wdXRTdHJlYW0oaXN0cmVhbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGlzdHJlYW07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VcFRvRGF0ZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVXBUb0RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU5YmUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVXBUb0RhdGUuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Db25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5NZXJnaW5nTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVzb3VyY2VVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlNvdXJjZUZpbGVTY2FubmVyOworCisvKioKKyAqIFNldHMgdGhlIGdpdmVuIHByb3BlcnR5IGlmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGhhcyBhIHRpbWVzdGFtcAorICogZ3JlYXRlciB0aGFuIGFsbCBvZiB0aGUgc291cmNlIGZpbGVzLgorICoKKyAqIEBzaW5jZSBBbnQgMS4yCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJjb250cm9sIgorICovCisKK3B1YmxpYyBjbGFzcyBVcFRvRGF0ZSBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBDb25kaXRpb24geworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgcHJpdmF0ZSBGaWxlIHNvdXJjZUZpbGU7CisgICAgcHJpdmF0ZSBGaWxlIHRhcmdldEZpbGU7CisgICAgcHJpdmF0ZSBWZWN0b3Igc291cmNlRmlsZVNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBVbmlvbiBzb3VyY2VSZXNvdXJjZXMgPSBuZXcgVW5pb24oKTsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIE1hcHBlciBtYXBwZXJFbGVtZW50ID0gbnVsbDsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IHRvIHNldCBpZiB0aGUgdGFyZ2V0IGZpbGUgaXMgbW9yZSB1cC10by1kYXRlIHRoYW4KKyAgICAgKiAoZWFjaCBvZikgdGhlIHNvdXJjZSBmaWxlKHMpLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQgaWYgVGFyZ2V0IGlzIHVwLXRvLWRhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgdG8gc2V0IHRoZSBuYW1lZCBwcm9wZXJ0eSB0byBpZiB0aGUgdGFyZ2V0IGZpbGUgaXMgbW9yZQorICAgICAqIHVwLXRvLWRhdGUgdGhhbiAoZWFjaCBvZikgdGhlIHNvdXJjZSBmaWxlKHMpLiBEZWZhdWx0cyB0byAndHJ1ZScuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8gaWYgVGFyZ2V0IGlzIHVwLXRvLWRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlLCBvciAidHJ1ZSIgaWYgYSBzcGVjaWZpYyB2YWx1ZSB3YXNuJ3QgcHJvdmlkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6ICJ0cnVlIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB3aGljaCBtdXN0IGJlIG1vcmUgdXAtdG8tZGF0ZSB0aGFuIChlYWNoIG9mKSB0aGUgc291cmNlIGZpbGUocykKKyAgICAgKiBpZiB0aGUgcHJvcGVydHkgaXMgdG8gYmUgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgd2UgYXJlIGNoZWNraW5nIGFnYWluc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy50YXJnZXRGaWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0aGF0IG11c3QgYmUgb2xkZXIgdGhhbiB0aGUgdGFyZ2V0IGZpbGUKKyAgICAgKiBpZiB0aGUgcHJvcGVydHkgaXMgdG8gYmUgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgd2UgYXJlIGNoZWNraW5nIGFnYWluc3QgdGhlIHRhcmdldCBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY2ZpbGUoZmluYWwgRmlsZSBmaWxlKSB7CisgICAgICAgIHRoaXMuc291cmNlRmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmVzdGVkICZsdDtzcmNmaWxlcyZndDsgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gZnMgdGhlIHNvdXJjZSBmaWxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNyY2ZpbGVzKGZpbmFsIEZpbGVTZXQgZnMpIHsKKyAgICAgICAgc291cmNlRmlsZVNldHMuYWRkRWxlbWVudChmcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zIGFzIHNvdXJjZXMuCisgICAgICogQHJldHVybiB0aGUgc291cmNlIHJlc291cmNlcyB0byBjb25maWd1cmUuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgVW5pb24gY3JlYXRlU3JjUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gc291cmNlUmVzb3VyY2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIEZpbGVOYW1lTWFwcGVyIHRvIHVzZSAobmVzdGVkIG1hcHBlciBlbGVtZW50KS4KKyAgICAgKiBAcmV0dXJuIGEgbWFwcGVyIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG1vcmUgdGhhbiBvbmUgbWFwcGVyIGlzIGRlZmluZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwcGVyIGNyZWF0ZU1hcHBlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtYXBwZXJFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgbWFwcGVyRWxlbWVudCA9IG5ldyBNYXBwZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgcmV0dXJuIG1hcHBlckVsZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBuZXN0ZWQgZmlsZW5hbWVtYXBwZXIKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWVNYXBwZXIgdGhlIG1hcHBlciB0byBhZGQKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyKSB7CisgICAgICAgIGNyZWF0ZU1hcHBlcigpLmFkZChmaWxlTmFtZU1hcHBlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZhbHVhdGUgKGFsbCkgdGFyZ2V0IGFuZCBzb3VyY2UgZmlsZShzKSB0bworICAgICAqIHNlZSBpZiB0aGUgdGFyZ2V0KHMpIGlzL2FyZSB1cC10by1kYXRlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0KHMpIGlzL2FyZSB1cC10by1kYXRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKKyAgICAgICAgaWYgKHNvdXJjZUZpbGVTZXRzLnNpemUoKSA9PSAwICYmIHNvdXJjZVJlc291cmNlcy5zaXplKCkgPT0gMAorICAgICAgICAgICAgJiYgc291cmNlRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBzcmNmaWxlIG9yIGEgbmVzdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI8c3JjZmlsZXM+IG9yIDxzcmNyZXNvdXJjZXM+IGVsZW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm11c3QgYmUgc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzb3VyY2VGaWxlU2V0cy5zaXplKCkgPiAwIHx8IHNvdXJjZVJlc291cmNlcy5zaXplKCkgPiAwKQorICAgICAgICAgICAgJiYgc291cmNlRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBzcGVjaWZ5IGJvdGggdGhlIHNyY2ZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZSBhbmQgYSBuZXN0ZWQgPHNyY2ZpbGVzPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib3IgPHNyY3Jlc291cmNlcz4gZWxlbWVudC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YXJnZXRGaWxlID09IG51bGwgJiYgbWFwcGVyRWxlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSB0YXJnZXRmaWxlIGF0dHJpYnV0ZSBvciBhIG5lc3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWFwcGVyIGVsZW1lbnQgbXVzdCBiZSBzZXQuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGZpbGUgaXMgbm90IHRoZXJlLCB0aGVuIGl0IGNhbid0IGJlIHVwLXRvLWRhdGUKKyAgICAgICAgaWYgKHRhcmdldEZpbGUgIT0gbnVsbCAmJiAhdGFyZ2V0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbG9nKCJUaGUgdGFyZ2V0ZmlsZSBcIiIgKyB0YXJnZXRGaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IGV4aXN0LiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhlIHNvdXJjZSBmaWxlIGlzbid0IHRoZXJlLCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgICAgaWYgKHNvdXJjZUZpbGUgIT0gbnVsbCAmJiAhc291cmNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHNvdXJjZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGZvdW5kLiIpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiB1cFRvRGF0ZSA9IHRydWU7CisgICAgICAgIGlmIChzb3VyY2VGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtYXBwZXJFbGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1cFRvRGF0ZSA9IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgPj0gc291cmNlRmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgc2ZzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOworICAgICAgICAgICAgICAgIHVwVG9EYXRlID0gc2ZzLnJlc3RyaWN0KG5ldyBTdHJpbmdbXSB7c291cmNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXJFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCkpLmxlbmd0aCA9PSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZmlsZXNldHMgYXJlIHNlcGFyYXRlIGZyb20gdGhlIHJlc3QgZm9yIHBlcmZvcm1hbmNlCisgICAgICAgIC8vIHJlYXNvbnMuICBJZiB3ZSB1c2UgdGhlIGNvZGUgZm9yIHVuaW9uIGJlbG93LCB3ZSdsbCBhbHdheXMKKyAgICAgICAgLy8gc2NhbiBhbGwgZmlsZXNldHMsIGV2ZW4gaWYgd2Uga25vdyB0aGUgdGFyZ2V0IGlzIG91dCBvZgorICAgICAgICAvLyBkYXRlIGFmdGVyIHRoZSBmaXJzdCB0ZXN0LgorICAgICAgICBFbnVtZXJhdGlvbiBlID0gc291cmNlRmlsZVNldHMuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKHVwVG9EYXRlICYmIGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIHVwVG9EYXRlID0gc2NhbkRpcihmcy5nZXREaXIoZ2V0UHJvamVjdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcy5nZXRJbmNsdWRlZEZpbGVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVwVG9EYXRlKSB7CisgICAgICAgICAgICBSZXNvdXJjZVtdIHIgPSBzb3VyY2VSZXNvdXJjZXMubGlzdFJlc291cmNlcygpOworICAgICAgICAgICAgdXBUb0RhdGUgPSBSZXNvdXJjZVV0aWxzLnNlbGVjdE91dE9mRGF0ZVNvdXJjZXMoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCByLCBnZXRNYXBwZXIoKSwgZ2V0UHJvamVjdCgpKS5sZW5ndGggPT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB1cFRvRGF0ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgcHJvcGVydHkgdG8gdHJ1ZSBpZiB0YXJnZXQgZmlsZShzKSBoYXZlIGEgbW9yZSByZWNlbnQgdGltZXN0YW1wCisgICAgICogdGhhbiAoZWFjaCBvZikgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGUocykuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwcm9wZXJ0eSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHVwVG9EYXRlID0gZXZhbCgpOworICAgICAgICBpZiAodXBUb0RhdGUpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBpZiAobWFwcGVyRWxlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJGaWxlIFwiIiArIHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgaXMgdXAtdG8tZGF0ZS4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJBbGwgdGFyZ2V0IGZpbGVzIGFyZSB1cC10by1kYXRlLiIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbiBhIGRpcmVjdG9yeSBmb3IgZmlsZXMgdG8gY2hlY2sgZm9yICJ1cCB0byBkYXRlIm5lc3MKKyAgICAgKiBAcGFyYW0gc3JjRGlyIHRoZSBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gZmlsZXMgdGhlIGZpbGVzIHRvIHNjYW4gZm9yCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlcyBhcmUgdXAgdG8gZGF0ZQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNjYW5EaXIoRmlsZSBzcmNEaXIsIFN0cmluZ1tdIGZpbGVzKSB7CisgICAgICAgIFNvdXJjZUZpbGVTY2FubmVyIHNmcyA9IG5ldyBTb3VyY2VGaWxlU2Nhbm5lcih0aGlzKTsKKyAgICAgICAgRmlsZU5hbWVNYXBwZXIgbWFwcGVyID0gZ2V0TWFwcGVyKCk7CisgICAgICAgIEZpbGUgZGlyID0gc3JjRGlyOworICAgICAgICBpZiAobWFwcGVyRWxlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBkaXIgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZnMucmVzdHJpY3QoZmlsZXMsIHNyY0RpciwgZGlyLCBtYXBwZXIpLmxlbmd0aCA9PSAwOworICAgIH0KKworICAgIHByaXZhdGUgRmlsZU5hbWVNYXBwZXIgZ2V0TWFwcGVyKCkgeworICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSBudWxsOworICAgICAgICBpZiAobWFwcGVyRWxlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBNZXJnaW5nTWFwcGVyIG1tID0gbmV3IE1lcmdpbmdNYXBwZXIoKTsKKyAgICAgICAgICAgIG1tLnNldFRvKHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgbWFwcGVyID0gbW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXBwZXIgPSBtYXBwZXJFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hcHBlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9WZXJpZnlKYXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ZlcmlmeUphci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNTI5NmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9WZXJpZnlKYXIuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkNoYWluYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWRpcmVjdG9yRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogSkFSIHZlcmlmaWNhdGlvbiB0YXNrLgorICogRm9yIGV2ZXJ5IEpBUiBwYXNzZWQgaW4sIHdlIGZvcmsgamFyc2lnbmVyIHRvIHZlcmlmeQorICogdGhhdCBpdCBpcyBjb3JyZWN0bHkgc2lnbmVkLiBUaGlzIGlzIG1vcmUgcmlnb3JvdXMgdGhhbiBqdXN0IGNoZWNraW5nIGZvcgorICogdGhlIGV4aXN0ZW5jZSBvZiBhIHNpZ25hdHVyZTsgdGhlIGVudGlyZSBjZXJ0aWZpY2F0aW9uIGNoYWluIGlzIHRlc3RlZAorICogQHNpbmNlIEFudCAxLjcKKyAqLworCitwdWJsaWMgY2xhc3MgVmVyaWZ5SmFyIGV4dGVuZHMgQWJzdHJhY3RKYXJTaWduZXJUYXNrIHsKKyAgICAvKioKKyAgICAgKiBubyBmaWxlIG1lc3NhZ2Uge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19GSUxFID0gIk5vdCBmb3VuZCA6IjsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgd2UgbG9vayBmb3IgaW4gdGhlIHRleHQgdG8gaW5kaWNhdGUgZGlyZWN0IHZlcmlmaWNhdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJJRklFRF9URVhUID0gImphciB2ZXJpZmllZC4iOworCisgICAgLyoqCisgICAgICogY2VydGlmaWNhdGlvbiBmbGFnCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNlcnRpZmljYXRlcyA9IGZhbHNlOworICAgIHByaXZhdGUgQnVmZmVyaW5nT3V0cHV0RmlsdGVyIG91dHB1dENhY2hlID0gbmV3IEJ1ZmZlcmluZ091dHB1dEZpbHRlcigpOworICAgIC8qKiBFcnJvciBvdXRwdXQgaWYgdGhlcmUgaXMgYSBmYWlsdXJlIHRvIHZlcmlmeSB0aGUgamFyLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX1ZFUklGWSA9ICJGYWlsZWQgdG8gdmVyaWZ5ICI7CisKKyAgICAvKioKKyAgICAgKiBBc2sgZm9yIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIHRvIGJlIHByaW50ZWQKKyAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGVzIGlmIHRydWUgcHJpbnQgY2VydGlmaWNhdGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENlcnRpZmljYXRlcyhib29sZWFuIGNlcnRpZmljYXRlcykgeworICAgICAgICB0aGlzLmNlcnRpZmljYXRlcyA9IGNlcnRpZmljYXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB2ZXJpZnkgb3VyIGphciBmaWxlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vdmFsaWRhdGlvbiBsb2dpYworICAgICAgICBmaW5hbCBib29sZWFuIGhhc0phciA9IGphciAhPSBudWxsOworCisgICAgICAgIGlmICghaGFzSmFyICYmICFoYXNSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX1NPVVJDRSk7CisgICAgICAgIH0KKworICAgICAgICBiZWdpbkV4ZWN1dGlvbigpOworCisgICAgICAgIC8vcGF0Y2ggdGhlIHJlZGlyZWN0b3IgdG8gc2F2ZSBvdXRwdXQgdG8gYSBmaWxlCisgICAgICAgIFJlZGlyZWN0b3JFbGVtZW50IHJlZGlyZWN0b3IgPSBnZXRSZWRpcmVjdG9yKCk7CisgICAgICAgIHJlZGlyZWN0b3Iuc2V0QWx3YXlzTG9nKHRydWUpOworICAgICAgICBGaWx0ZXJDaGFpbiBvdXRwdXRGaWx0ZXJDaGFpbiA9IHJlZGlyZWN0b3IuY3JlYXRlT3V0cHV0RmlsdGVyQ2hhaW4oKTsKKyAgICAgICAgb3V0cHV0RmlsdGVyQ2hhaW4uYWRkKG91dHB1dENhY2hlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGF0aCBzb3VyY2VzID0gY3JlYXRlVW5pZmllZFNvdXJjZVBhdGgoKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlUmVzb3VyY2UgZnIgPSAoRmlsZVJlc291cmNlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICB2ZXJpZnlPbmVKYXIoZnIuZ2V0RmlsZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kRXhlY3V0aW9uKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIHZlcmlmeSBhIEpBUi4KKyAgICAgKiBAcGFyYW0gamFyIHRoZSBqYXIgdG8gdmVyaWZ5LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIHZlcmlmaWVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU9uZUphcihGaWxlIGphcikgeworICAgICAgICBpZiAoIWphci5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX0ZJTEUgKyBqYXIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEV4ZWNUYXNrIGNtZCA9IGNyZWF0ZUphclNpZ25lcigpOworCisgICAgICAgIHNldENvbW1vbk9wdGlvbnMoY21kKTsKKyAgICAgICAgYmluZFRvS2V5c3RvcmUoY21kKTsKKworICAgICAgICAvL3ZlcmlmeSBzcGVjaWFsIG9wZXJhdGlvbnMKKyAgICAgICAgYWRkVmFsdWUoY21kLCAiLXZlcmlmeSIpOworCisgICAgICAgIGlmIChjZXJ0aWZpY2F0ZXMpIHsKKyAgICAgICAgICAgIGFkZFZhbHVlKGNtZCwgIi1jZXJ0cyIpOworICAgICAgICB9CisKKyAgICAgICAgLy9KQVIgIGlzIHJlcXVpcmVkCisgICAgICAgIGFkZFZhbHVlKGNtZCwgamFyLmdldFBhdGgoKSk7CisKKyAgICAgICAgbG9nKCJWZXJpZnlpbmcgSkFSOiAiICsgamFyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgb3V0cHV0Q2FjaGUuY2xlYXIoKTsKKyAgICAgICAgQnVpbGRFeGNlcHRpb24gZXggPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY21kLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXggPSBlOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByZXN1bHRzID0gb3V0cHV0Q2FjaGUudG9TdHJpbmcoKTsKKyAgICAgICAgLy9kZWFsIHdpdGggamRrMS40LjIgYnVnOgorICAgICAgICBpZiAoZXggIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJlc3VsdHMuaW5kZXhPZigiemlwIGZpbGUgY2xvc2VkIikgPj0gMCkgeworICAgICAgICAgICAgICAgIGxvZygiWW91IGFyZSBydW5uaW5nICIgKyBKQVJTSUdORVJfQ09NTUFORCArICIgYWdhaW5zdCBhIEpWTSB3aXRoIgorICAgICAgICAgICAgICAgICAgICArICIgYSBrbm93biBidWcgdGhhdCBtYW5pZmVzdHMgYXMgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0cy5pbmRleE9mKFZFUklGSUVEX1RFWFQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX1ZFUklGWSArIGphcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3ZSBhcmUgbm90IHRocmVhZCBzYWZlIGhlcmUuIERvIG5vdCB1c2Ugb24gbXVsdGlwbGUgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ1ZmZlcmluZ091dHB1dEZpbHRlciBpbXBsZW1lbnRzIENoYWluYWJsZVJlYWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBCdWZmZXJpbmdPdXRwdXRGaWx0ZXJSZWFkZXIgYnVmZmVyOworCisgICAgICAgIHB1YmxpYyBSZWFkZXIgY2hhaW4oUmVhZGVyIHJkcikgeworICAgICAgICAgICAgYnVmZmVyID0gbmV3IEJ1ZmZlcmluZ091dHB1dEZpbHRlclJlYWRlcihyZHIpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2F0Y2ggdGhlIG91dHB1dCBvZiB0aGUgYnVmZmVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnVmZmVyaW5nT3V0cHV0RmlsdGVyUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKKworICAgICAgICBwcml2YXRlIFJlYWRlciBuZXh0OworCisgICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBwdWJsaWMgQnVmZmVyaW5nT3V0cHV0RmlsdGVyUmVhZGVyKFJlYWRlciBuZXh0KSB7CisgICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgLy9oYW5kIGRvd24KKyAgICAgICAgICAgIGludCByZXN1bHQgPSBuZXh0LnJlYWQoY2J1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgLy9jYWNoZQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAvL3JldHVybgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG5leHQuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhaXRGb3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhaXRGb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGY0MDRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2FpdEZvci5qYXZhCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29uZGl0aW9uQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworCisvKioKKyAqIFdhaXQgZm9yIGFuIGV4dGVybmFsIGV2ZW50IHRvIG9jY3VyLgorICoKKyAqIFdhaXQgZm9yIGFuIGV4dGVybmFsIHByb2Nlc3MgdG8gc3RhcnQgb3IgdG8gY29tcGxldGUgc29tZQorICogdGFzay4gVGhpcyBpcyB1c2VmdWwgd2l0aCB0aGUgPGNvZGU+cGFyYWxsZWw8L2NvZGU+IHRhc2sgdG8KKyAqIHN5bmNocm9uaXplIHRoZSBleGVjdXRpb24gb2YgdGVzdHMgd2l0aCBzZXJ2ZXIgc3RhcnR1cC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBvbiBhIHdhaXRmb3IgdGFzazoKKyAqIDx1bD4KKyAqIDxsaT5tYXh3YWl0IC0gbWF4aW11bSBsZW5ndGggb2YgdGltZSB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXA8L2xpPgorICogPGxpPm1heHdhaXR1bml0IC0gVGhlIHVuaXQgdG8gYmUgdXNlZCB0byBpbnRlcnByZXQgbWF4d2FpdCBhdHRyaWJ1dGU8L2xpPgorICogPGxpPmNoZWNrZXZlcnkgLSBhbW91bnQgb2YgdGltZSB0byBzbGVlcCBiZXR3ZWVuIGVhY2ggY2hlY2s8L2xpPgorICogPGxpPmNoZWNrZXZlcnl1bml0IC0gVGhlIHVuaXQgdG8gYmUgdXNlZCB0byBpbnRlcnByZXQgY2hlY2tldmVyeSBhdHRyaWJ1dGU8L2xpPgorICogPGxpPnRpbWVvdXRwcm9wZXJ0eSAtIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaWYgbWF4d2FpdCBoYXMgYmVlbiBleGNlZWRlZC48L2xpPgorICogPC91bD4KKyAqCisgKiBUaGUgbWF4d2FpdHVuaXQgYW5kIGNoZWNrZXZlcnl1bml0IGFyZSBhbGxvd2VkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiBtaWxsaXNlY29uZCwgc2Vjb25kLCBtaW51dGUsIGhvdXIsIGRheSBhbmQgd2Vlay4gVGhlIGRlZmF1bHQgaXMgbWlsbGlzZWNvbmQuCisgKgorICogRm9yIHByb2dyYW1tYXRpYyB1c2Uvc3ViY2xhc3NpbmcsIHRoZXJlIGFyZSB0d28gbWV0aG9kcyB0aGF0IG1heSBiZSBvdmVycnJpZGRlbiwKKyAqIDxjb2RlPnByb2Nlc3NTdWNjZXNzPC9jb2RlPiBhbmQgPGNvZGU+cHJvY2Vzc1RpbWVvdXQ8L2NvZGU+CisgKiBAc2luY2UgQW50IDEuNQorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iY29udHJvbCIKKyAqLworcHVibGljIGNsYXNzIFdhaXRGb3IgZXh0ZW5kcyBDb25kaXRpb25CYXNlIHsKKyAgICAvKiogYSBtaWxsaXNlY29uZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBPTkVfTUlMTElTRUNPTkQgPSAxTDsKKyAgICAvKiogYSBzZWNvbmQgaW4gbWlsbGlzZWNvbmRzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE9ORV9TRUNPTkQgPSAxMDAwTDsKKyAgICAvKiogYSBtaW51dGUgaW4gbWlsbGlzZWNvbmRzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE9ORV9NSU5VVEUgPSBPTkVfU0VDT05EICogNjBMOworICAgIC8qKiBhbiBob3VyIGluIG1pbGxpc2Vjb25kcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBPTkVfSE9VUiAgID0gT05FX01JTlVURSAqIDYwTDsKKyAgICAvKiogYSBkYXkgaW4gbWlsbGlzZWNvbmRzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE9ORV9EQVkgICAgPSBPTkVfSE9VUiAqIDI0TDsKKyAgICAvKiogYSB3ZWVrIGluIG1pbGxpc2Vjb25kcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBPTkVfV0VFSyAgID0gT05FX0RBWSAqIDdMOworCisgICAgLyoqIGRlZmF1bHQgd2FpdCB0aW1lICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfTUFYX1dBSVRfTUlMTElTID0gT05FX01JTlVURSAqIDNMOworICAgIC8qKiBkZWZhdWx0IGNoZWNrIHRpbWUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9DSEVDS19NSUxMSVMgPSA1MDBMOworCisgICAgLyoqIGRlZmF1bHQgbWF4IHdhaXQgdGltZSBpbiB0aGUgY3VycmVudCB1bml0Ki8KKyAgICBwcml2YXRlIGxvbmcgbWF4V2FpdCA9IERFRkFVTFRfTUFYX1dBSVRfTUlMTElTOworICAgIHByaXZhdGUgbG9uZyBtYXhXYWl0TXVsdGlwbGllciA9IE9ORV9NSUxMSVNFQ09ORDsKKyAgICAvKioKKyAgICAgKiBjaGVjayB0aW1lIGluIHRoZSBjdXJyZW50IHVuaXQKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgY2hlY2tFdmVyeSA9IERFRkFVTFRfQ0hFQ0tfTUlMTElTOworICAgIHByaXZhdGUgbG9uZyBjaGVja0V2ZXJ5TXVsdGlwbGllciA9IE9ORV9NSUxMSVNFQ09ORDsKKyAgICBwcml2YXRlIFN0cmluZyB0aW1lb3V0UHJvcGVydHk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciwgbmFtZXMgdGhpcyB0YXNrICJ3YWl0Zm9yIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2FpdEZvcigpIHsKKyAgICAgICAgc3VwZXIoIndhaXRmb3IiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRoYXQgdGFrZXMgdGhlIG5hbWUgb2YgdGhlIHRhc2sgaW4gdGhlIHRhc2sgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrTmFtZSB0aGUgbmFtZSBvZiB0aGUgdGFzay4KKyAgICAgKiBAc2luY2UgQW50IDEuOAorICAgICAqLworICAgIHB1YmxpYyBXYWl0Rm9yKFN0cmluZyB0YXNrTmFtZSkgeworICAgICAgICBzdXBlcih0YXNrTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aW1lIHRvIHdhaXQuCisgICAgICogQHBhcmFtIHRpbWUgYSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heFdhaXQobG9uZyB0aW1lKSB7CisgICAgICAgIG1heFdhaXQgPSB0aW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXggd2FpdCB0aW1lIHVuaXQKKyAgICAgKiBAcGFyYW0gdW5pdCBhbiBlbnVtZXJhdGVkIDxjb2RlPlVuaXQ8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4V2FpdFVuaXQoVW5pdCB1bml0KSB7CisgICAgICAgIG1heFdhaXRNdWx0aXBsaWVyID0gdW5pdC5nZXRNdWx0aXBsaWVyKCk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGltZSBiZXR3ZWVuIGVhY2ggY2hlY2sKKyAgICAgKiBAcGFyYW0gdGltZSBhIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tFdmVyeShsb25nIHRpbWUpIHsKKyAgICAgICAgY2hlY2tFdmVyeSA9IHRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjaGVjayBldmVyeSB0aW1lIHVuaXQKKyAgICAgKiBAcGFyYW0gdW5pdCBhbiBlbnVtZXJhdGVkIDxjb2RlPlVuaXQ8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tFdmVyeVVuaXQoVW5pdCB1bml0KSB7CisgICAgICAgIGNoZWNrRXZlcnlNdWx0aXBsaWVyID0gdW5pdC5nZXRNdWx0aXBsaWVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSB0aGUgcHJvcGVydHkgdG8gc2V0IGFmdGVyIGEgdGltZW91dC4KKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvcGVydHkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXRQcm9wZXJ0eShTdHJpbmcgcCkgeworICAgICAgICB0aW1lb3V0UHJvcGVydHkgPSBwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHJlcGVhdGVkbHkgZm9yIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9ucyB1bnRpbCB0aGV5IGJlY29tZQorICAgICAqIHRydWUgb3IgdGhlIHRpbWVvdXQgZXhwaXJlcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb3VudENvbmRpdGlvbnMoKSA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgbm90IG5lc3QgbW9yZSB0aGFuIG9uZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29uZGl0aW9uIGludG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0VGFza05hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50Q29uZGl0aW9ucygpIDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBuZXN0IGEgY29uZGl0aW9uIGludG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0VGFza05hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29uZGl0aW9uIGMgPSAoQ29uZGl0aW9uKSBnZXRDb25kaXRpb25zKCkubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgbWF4V2FpdE1pbGxpcyA9IGNhbGN1bGF0ZU1heFdhaXRNaWxsaXMoKTsKKyAgICAgICAgICAgIGxvbmcgY2hlY2tFdmVyeU1pbGxpcyA9IGNhbGN1bGF0ZUNoZWNrRXZlcnlNaWxsaXMoKTsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGxvbmcgZW5kID0gc3RhcnQgKyBtYXhXYWl0TWlsbGlzOworCisgICAgICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYy5ldmFsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1N1Y2Nlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoY2hlY2tFdmVyeU1pbGxpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiVGFzayAiICsgZ2V0VGFza05hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgaW50ZXJydXB0ZWQsIHRyZWF0aW5nIGFzIHRpbWVkIG91dC4iKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzVGltZW91dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2hlY2sgd2FpdCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHNpbmNlIEFudCAxLjgKKyAgICAgKiBAcmV0dXJuIGhvdyBsb25nIHRvIHdhaXQgYmV0d2VlbiBjaGVja3MKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBjYWxjdWxhdGVDaGVja0V2ZXJ5TWlsbGlzKCkgeworICAgICAgICByZXR1cm4gY2hlY2tFdmVyeSAqIGNoZWNrRXZlcnlNdWx0aXBsaWVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWF4aXVtdW0gd2FpdCB0aW1lLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHNpbmNlIEFudCAxLjgKKyAgICAgKiBAcmV0dXJuIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHRpbWluZyBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBjYWxjdWxhdGVNYXhXYWl0TWlsbGlzKCkgeworICAgICAgICByZXR1cm4gbWF4V2FpdCAqIG1heFdhaXRNdWx0aXBsaWVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdGlvbnMgdG8gYmUgdGFrZW4gb24gYSBzdWNjZXNzZnVsIHdhaXRmb3IuCisgICAgICogVGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludC4gVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICAgICAqIEBzaW5jZSBBbnQxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU3VjY2VzcygpIHsKKyAgICAgICAgbG9nKGdldFRhc2tOYW1lKCkgKyAiOiBjb25kaXRpb24gd2FzIG1ldCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdGlvbnMgdG8gYmUgdGFrZW4gb24gYW4gdW5zdWNjZXNzZnVsIHdhaXQuCisgICAgICogVGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludC4gSXQgaXMgd2hlcmUgdGhlIHRpbWVvdXQgcHJvY2Vzc2luZyB0YWtlcyBwbGFjZS4KKyAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBzZXRzIHRoZSB0aW1lb3V0cHJvcGVydHkgaWYgdGhlcmUgd2FzIGEgdGltZW91dAorICAgICAqIGFuZCB0aGUgcHJvcGVydHkgd2FzIGRlZmluZWQuCisgICAgICogQHNpbmNlIEFudDEuNworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUaW1lb3V0KCkgeworICAgICAgICBsb2coZ2V0VGFza05hbWUoKSArICI6IHRpbWVvdXQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgaWYgKHRpbWVvdXRQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkodGltZW91dFByb3BlcnR5LCAidHJ1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVudW1lcmF0aW9uIG9mIHVuaXRzOgorICAgICAqIG1pbGxpc2Vjb25kLCBzZWNvbmQsIG1pbnV0ZSwgaG91ciwgZGF5LCB3ZWVrCisgICAgICogQHRvZG8gd2UgdXNlIHRpbWVzdGFtcHMgaW4gbWFueSBwbGFjZXMsIHdoeSBub3QgZmFjdG9yIHRoaXMgb3V0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbml0IGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgLyoqIG1pbGxpc2Vjb25kIHN0cmluZyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUxMSVNFQ09ORCA9ICJtaWxsaXNlY29uZCI7CisgICAgICAgIC8qKiBzZWNvbmQgc3RyaW5nICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09ORCA9ICJzZWNvbmQiOworICAgICAgICAvKiogbWludXRlIHN0cmluZyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5VVEUgPSAibWludXRlIjsKKyAgICAgICAgLyoqIGhvdXIgc3RyaW5nICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVVIgPSAiaG91ciI7CisgICAgICAgIC8qKiBkYXkgc3RyaW5nICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBWSA9ICJkYXkiOworICAgICAgICAvKiogd2VlayBzdHJpbmcgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VFSyA9ICJ3ZWVrIjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTklUUyA9IHsKKyAgICAgICAgICAgIE1JTExJU0VDT05ELCBTRUNPTkQsIE1JTlVURSwgSE9VUiwgREFZLCBXRUVLCisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBNYXAgdGltZVRhYmxlID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICAvKiogQ29uc3RydWN0b3IgdGhlIFVuaXQgZW51bWVyYXRlZCB0eXBlLiAqLworICAgICAgICBwdWJsaWMgVW5pdCgpIHsKKyAgICAgICAgICAgIHRpbWVUYWJsZS5wdXQoTUlMTElTRUNPTkQsIG5ldyBMb25nKDFMKSk7CisgICAgICAgICAgICB0aW1lVGFibGUucHV0KFNFQ09ORCwgICAgICBuZXcgTG9uZyhPTkVfU0VDT05EKSk7CisgICAgICAgICAgICB0aW1lVGFibGUucHV0KE1JTlVURSwgICAgICBuZXcgTG9uZyhPTkVfTUlOVVRFKSk7CisgICAgICAgICAgICB0aW1lVGFibGUucHV0KEhPVVIsICAgICAgICBuZXcgTG9uZyhPTkVfSE9VUikpOworICAgICAgICAgICAgdGltZVRhYmxlLnB1dChEQVksICAgICAgICAgbmV3IExvbmcoT05FX0RBWSkpOworICAgICAgICAgICAgdGltZVRhYmxlLnB1dChXRUVLLCAgICAgICAgbmV3IExvbmcoT05FX1dFRUspKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0IHRoZSB2YWx1ZSB0byBhIG11bHRpcGxlciAobWlsbGlzZWNvbmQgdG8gdW5pdCkuCisgICAgICAgICAqIEByZXR1cm4gYSBtdWx0aXBsZXIgKGEgbG9uZyB2YWx1ZSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGdldE11bHRpcGxpZXIoKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgTG9uZyBsID0gKExvbmcpIHRpbWVUYWJsZS5nZXQoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiBsLmxvbmdWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgRW51bWVyYXRlZEF0dHJpYnV0ZSNnZXRWYWx1ZXMoKQorICAgICAgICAgKi8KKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBVTklUUzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2FyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0MGE0NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhci5qYXZhCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBPdXRwdXRTdHJlYW07CisKKworLyoqCisgKiBBbiBleHRlbnNpb24gb2YgJmx0O2phciZndDsgdG8gY3JlYXRlIGEgV0FSIGFyY2hpdmUuCisgKiBDb250YWlucyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgZmlsZXMgdGhhdCBzaG91bGQgZW5kIHVwIGluIHRoZQorICogPGNvZGU+V0VCLUlORi9saWI8L2NvZGU+LCA8Y29kZT5XRUItSU5GL2NsYXNzZXM8L2NvZGU+IG9yCisgKiA8Y29kZT5XRUItSU5GPC9jb2RlPiBkaXJlY3RvcmllcyBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uIEFyY2hpdmUuPC9wPgorICogPHA+KFRoZSBXYXIgdGFzayBpcyBhIHNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIHRoZSBwYXJ0aWN1bGFyIGxheW91dCBvZiBhIFdBUiBmaWxlLgorICogVGhlIHNhbWUgdGhpbmcgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgPGk+cHJlZml4PC9pPiBhbmQgPGk+ZnVsbHBhdGg8L2k+CisgKiBhdHRyaWJ1dGVzIG9mIHppcGZpbGVzZXRzIGluIGEgWmlwIG9yIEphciB0YXNrLik8L3A+CisgKiA8cD5UaGUgZXh0ZW5kZWQgemlwZmlsZXNldCBlbGVtZW50IGZyb20gdGhlIHppcCB0YXNrCisgKiAod2l0aCBhdHRyaWJ1dGVzIDxpPnByZWZpeDwvaT4sIDxpPmZ1bGxwYXRoPC9pPiwgYW5kIDxpPnNyYzwvaT4pCisgKiBpcyBhdmFpbGFibGUgaW4gdGhlIFdhciB0YXNrLjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuMgorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0icGFja2FnaW5nIgorICogQHNlZSBKYXIKKyAqLworcHVibGljIGNsYXNzIFdhciBleHRlbmRzIEphciB7CisKKyAgICAvKioKKyAgICAgKiBvdXIgd2ViLnhtbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZGVwbG95bWVudERlc2NyaXB0b3I7CisKKyAgICAvKioKKyAgICAgKiBmbGFnIHNldCBpZiB0aGUgZGVzY3JpcHRvciBpcyBhZGRlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkeG1sZmlsZSA9IHRydWU7CisgICAgcHJpdmF0ZSBGaWxlIGFkZGVkV2ViWG1sRmlsZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworICAgIC8qKiBwYXRoIHRvIHdlYi54bWwgZmlsZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfREVTQ1JJUFRPUl9QQVRIID0gIldFQi1JTkYvd2ViLnhtbCI7CisgICAgLyoqIGxvd2VyIGNhc2UgdmVyc2lvbiBmb3IgY29tcGFyaXNvbnMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFU0NSSVBUT1JfUEFUSF9MQyA9CisgICAgICAgICAgICBYTUxfREVTQ1JJUFRPUl9QQVRILnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKworICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFdhciBUYXNrLiAqLworICAgIHB1YmxpYyBXYXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGFyY2hpdmVUeXBlID0gIndhciI7CisgICAgICAgIGVtcHR5QmVoYXZpb3IgPSAiY3JlYXRlIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8aT5EZXByZWNhdGVkPGk+IG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlCisgICAgICogLXVzZSA8dHQ+ZGVzdGZpbGU8L3R0PiBpbnN0ZWFkLgorICAgICAqIEBwYXJhbSB3YXJGaWxlIHRoZSBkZXN0aW5hdGlvbiBmaWxlCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS41LnguCisgICAgICogICAgICAgICAgICAgVXNlIHNldERlc3RGaWxlKEZpbGUpIGluc3RlYWQKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2FyZmlsZShGaWxlIHdhckZpbGUpIHsKKyAgICAgICAgc2V0RGVzdEZpbGUod2FyRmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdG8gdXNlIChXRUItSU5GL3dlYi54bWwpOworICAgICAqIHJlcXVpcmVkIHVubGVzcyA8dHQ+dXBkYXRlPXRydWU8L3R0PgorICAgICAqIEBwYXJhbSBkZXNjciB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXZWJ4bWwoRmlsZSBkZXNjcikgeworICAgICAgICBkZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlc2NyOworICAgICAgICBpZiAoIWRlcGxveW1lbnREZXNjcmlwdG9yLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlcGxveW1lbnQgZGVzY3JpcHRvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVwbG95bWVudERlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBaaXBGaWxlU2V0IGZvciB0aGlzIGZpbGUsIGFuZCBwYXNzIGl0IHVwLgorICAgICAgICBaaXBGaWxlU2V0IGZzID0gbmV3IFppcEZpbGVTZXQoKTsKKyAgICAgICAgZnMuc2V0RmlsZShkZXBsb3ltZW50RGVzY3JpcHRvcik7CisgICAgICAgIGZzLnNldEZ1bGxwYXRoKFhNTF9ERVNDUklQVE9SX1BBVEgpOworICAgICAgICBzdXBlci5hZGRGaWxlc2V0KGZzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9saWN5IG9uIHRoZSB3ZWIueG1sIGZpbGUsIHRoYXQgaXMsIHdoZXRoZXIgb3Igbm90IGl0IGlzIG5lZWRlZAorICAgICAqIEBwYXJhbSBuZWVkeG1sZmlsZSB3aGV0aGVyIGEgd2ViLnhtbCBmaWxlIGlzIG5lZWRlZC4gRGVmYXVsdDogdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5lZWR4bWxmaWxlKGJvb2xlYW4gbmVlZHhtbGZpbGUpIHsKKyAgICAgICAgdGhpcy5uZWVkeG1sZmlsZSA9IG5lZWR4bWxmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBmaWxlcyB1bmRlciBXRUItSU5GL2xpYi8KKyAgICAgKiBAcGFyYW0gZnMgdGhlIHppcCBmaWxlIHNldCB0byBhZGQKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZExpYihaaXBGaWxlU2V0IGZzKSB7CisgICAgICAgIC8vIFdlIGp1c3Qgc2V0IHRoZSBwcmVmaXggZm9yIHRoaXMgZmlsZXNldCwgYW5kIHBhc3MgaXQgdXAuCisgICAgICAgIGZzLnNldFByZWZpeCgiV0VCLUlORi9saWIvIik7CisgICAgICAgIHN1cGVyLmFkZEZpbGVzZXQoZnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBmaWxlcyB1bmRlciBXRUItSU5GL2NsYXNzZXMKKyAgICAgKiBAcGFyYW0gZnMgdGhlIHppcCBmaWxlIHNldCB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc2VzKFppcEZpbGVTZXQgZnMpIHsKKyAgICAgICAgLy8gV2UganVzdCBzZXQgdGhlIHByZWZpeCBmb3IgdGhpcyBmaWxlc2V0LCBhbmQgcGFzcyBpdCB1cC4KKyAgICAgICAgZnMuc2V0UHJlZml4KCJXRUItSU5GL2NsYXNzZXMvIik7CisgICAgICAgIHN1cGVyLmFkZEZpbGVzZXQoZnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZpbGVzIHRvIGFkZCB1bmRlciBXRUItSU5GOworICAgICAqIEBwYXJhbSBmcyB0aGUgemlwIGZpbGUgc2V0IHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFdlYmluZihaaXBGaWxlU2V0IGZzKSB7CisgICAgICAgIC8vIFdlIGp1c3Qgc2V0IHRoZSBwcmVmaXggZm9yIHRoaXMgZmlsZXNldCwgYW5kIHBhc3MgaXQgdXAuCisgICAgICAgIGZzLnNldFByZWZpeCgiV0VCLUlORi8iKTsKKyAgICAgICAgc3VwZXIuYWRkRmlsZXNldChmcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogb3ZlcnJpZGUgb2YgIHBhcmVudDsgdmFsaWRhdGVzIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSB6T3V0IHRoZSB6aXAgb3V0cHV0IHN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gb3V0cHV0IGVycm9yCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0WmlwT3V0cHV0U3RyZWFtKFppcE91dHB1dFN0cmVhbSB6T3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuaW5pdFppcE91dHB1dFN0cmVhbSh6T3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIGZyb20gWmlwIGNsYXNzIHRvIGRlYWwgd2l0aCB3ZWIueG1sCisgICAgICoKKyAgICAgKiBIZXJlIGFyZSBjYXNlcyB0aGF0IGNhbiBhcmlzZQorICAgICAqIC1ub3QgYSB3ZWIueG1sIGZpbGUgOiBhZGQKKyAgICAgKiAtZmlyc3Qgd2ViLnhtbCA6IGFkZCwgcmVtZW1iZXIgd2UgYWRkZWQgaXQKKyAgICAgKiAtc2FtZSB3ZWIueG1sIGFnYWluOiBza2lwCisgICAgICogLWFsdGVybmF0ZSB3ZWIueG1sIDogd2FybiBhbmQgc2tpcAorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gYWRkIHRvIHRoZSBhcmNoaXZlCisgICAgICogQHBhcmFtIHpPdXQgdGhlIHN0cmVhbSB0byB3cml0ZSB0bworICAgICAqIEBwYXJhbSB2UGF0aCB0aGUgbmFtZSB0aGlzIGVudHJ5IHNoYWxsIGhhdmUgaW4gdGhlIGFyY2hpdmUKKyAgICAgKiBAcGFyYW0gbW9kZSB0aGUgVW5peCBwZXJtaXNzaW9ucyB0byBzZXQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBvdXRwdXQgZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB6aXBGaWxlKEZpbGUgZmlsZSwgWmlwT3V0cHV0U3RyZWFtIHpPdXQsIFN0cmluZyB2UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBJZiB0aGUgZmlsZSBiZWluZyBhZGRlZCBpcyBXRUItSU5GL3dlYi54bWwsIHdlIHdhcm4gaWYgaXQncworICAgICAgICAvLyBub3QgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlICJ3ZWJ4bWwiIGF0dHJpYnV0ZSAtIG9yIGlmCisgICAgICAgIC8vIGl0J3MgYmVpbmcgYWRkZWQgdHdpY2UsIG1lYW5pbmcgdGhlIHNhbWUgZmlsZSBpcyBzcGVjaWZpZWQKKyAgICAgICAgLy8gYnkgdGhlICJ3ZWJ4bWwiIGF0dHJpYnV0ZSBhbmQgaW4gYSA8ZmlsZXNldD4gZWxlbWVudC4KKyAgICAgICAgU3RyaW5nIHZQYXRoTG93ZXJDYXNlID0gdlBhdGgudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgICAgICAvL2J5IGRlZmF1bHQsIHdlIGFkZCB0aGUgZmlsZS4KKyAgICAgICAgYm9vbGVhbiBhZGRGaWxlID0gdHJ1ZTsKKyAgICAgICAgaWYgKFhNTF9ERVNDUklQVE9SX1BBVEhfTEMuZXF1YWxzKHZQYXRoTG93ZXJDYXNlKSkgeworICAgICAgICAgICAgLy9hIHdlYi54bWwgZmlsZSB3YXMgZm91bmQuIFNlZSBpZiBpdCBpcyBhIGR1cGxpY2F0ZSBvciBub3QKKyAgICAgICAgICAgIGlmIChhZGRlZFdlYlhtbEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vYSBzZWNvbmQgd2ViLnhtbCBmaWxlLCBzbyBza2lwIGl0CisgICAgICAgICAgICAgICAgYWRkRmlsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIC8vY2hlY2sgdG8gc2VlIGlmIHdlIHdhcm4gb3Igbm90CisgICAgICAgICAgICAgICAgaWYgKCFGSUxFX1VUSUxTLmZpbGVOYW1lRXF1YWxzKGFkZGVkV2ViWG1sRmlsZSwgZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBzZWxlY3RlZCAiICsgYXJjaGl2ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZmlsZXMgaW5jbHVkZSBhIHNlY29uZCAiICsgWE1MX0RFU0NSSVBUT1JfUEFUSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aGljaCB3aWxsIGJlIGlnbm9yZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIGR1cGxpY2F0ZSBlbnRyeSBpcyBhdCAiICsgZmlsZSArICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgZmlsZSB0aGF0IHdpbGwgYmUgdXNlZCBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhZGRlZFdlYlhtbEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL25vIGFkZGVkIGZpbGUsIHlldAorICAgICAgICAgICAgICAgIGFkZGVkV2ViWG1sRmlsZSA9IGZpbGU7CisgICAgICAgICAgICAgICAgLy90aGVyZSBpcyBubyB3ZWIueG1sIGZpbGUsIHNvIGFkZCBpdAorICAgICAgICAgICAgICAgIGFkZEZpbGUgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vYW5kIHJlbWVtYmVyIHRoYXQgd2UgZGlkCisgICAgICAgICAgICAgICAgZGVwbG95bWVudERlc2NyaXB0b3IgPSBmaWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhZGRGaWxlKSB7CisgICAgICAgICAgICBzdXBlci56aXBGaWxlKGZpbGUsIHpPdXQsIHZQYXRoLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogTWFrZSBzdXJlIHdlIGRvbid0IHRoaW5rIHdlIGFscmVhZHkgaGF2ZSBhIHdlYi54bWwgbmV4dCB0aW1lIHRoaXMgdGFzaworICAgICAqIGdldHMgZXhlY3V0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAgICAgaWYgKGFkZGVkV2ViWG1sRmlsZSA9PSBudWxsCisgICAgICAgICAgICAmJiBkZXBsb3ltZW50RGVzY3JpcHRvciA9PSBudWxsCisgICAgICAgICAgICAmJiBuZWVkeG1sZmlsZQorICAgICAgICAgICAgJiYgIWlzSW5VcGRhdGVNb2RlKCkKKyAgICAgICAgICAgICYmIGhhc1VwZGF0ZWRGaWxlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gV0VCLUlORi93ZWIueG1sIGZpbGUgd2FzIGFkZGVkLlxuIgorICAgICAgICAgICAgICAgICAgICArICJJZiB0aGlzIGlzIHlvdXIgaW50ZW50LCBzZXQgbmVlZHhtbGZpbGU9J2ZhbHNlJyAiKTsKKyAgICAgICAgfQorICAgICAgICBhZGRlZFdlYlhtbEZpbGUgPSBudWxsOworICAgICAgICBzdXBlci5jbGVhblVwKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2hpY2hSZXNvdXJjZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2hpY2hSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDgxOWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XaGljaFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBGaW5kIGEgY2xhc3Mgb3IgcmVzb3VyY2Ugb24gdGhlIHN1cHBsaWVkIGNsYXNzcGF0aCwgb3IgdGhlCisgKiBzeXN0ZW0gY2xhc3NwYXRoIGlmIG5vbmUgaXMgc3VwcGxpZWQuIFRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBzZXQgaWYKKyAqIHRoZSBpdGVtIGNhbiBiZSBmb3VuZC4gRm9yIGV4YW1wbGUKKyAqIDxwcmU+CisgKiAmbHQ7d2hpY2hyZXNvdXJjZSByZXNvdXJjZT0iL2xvZzRqLnByb3BlcnRpZXMiCisgKiAgIHByb3BlcnR5PSJsb2c0ai51cmwiICZndDsKKyAqIDwvcHJlPgorICogQHNpbmNlIEFudCAxLjYKKyAqIEBhbnQuYXR0cmlidXRlLmdyb3VwIG5hbWU9Im9uZW9mIiBkZXNjcmlwdGlvbj0iRXhhY3RseSBvbmUgb2YgdGhlc2UgdHdvIgorICovCitwdWJsaWMgY2xhc3MgV2hpY2hSZXNvdXJjZSBleHRlbmRzIFRhc2sgeworICAgIC8qKgorICAgICAqIG91ciBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOworCisgICAgLyoqCisgICAgICogY2xhc3MgdG8gbG9vayBmb3IKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7CisKKyAgICAvKioKKyAgICAgKiByZXNvdXJjZSB0byBsb29rIGZvcgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlOworCisgICAgLyoqCisgICAgICogcHJvcGVydHkgdG8gc2V0CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCisgICAgICogQHBhcmFtIGNwIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjcCkgeworICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IGNwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChjcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLgorICAgICAqIEByZXR1cm4gYSBjbGFzc3BhdGggdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byB1c2UgYnkgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgYSByZWZlcmVuY2UgdG8gYW4gZXhpc3RpbmcgY2xhc3NwYXRoLgorICAgICAqIEBzaW5jZSBBbnQgMS43LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdmFsaWRhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgIGludCBzZXRjb3VudCA9IDA7CisgICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Y291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Y291bnQrKzsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKHNldGNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk9uZSBvZiBjbGFzc25hbWUgb3IgcmVzb3VyY2UgbXVzdCBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0Y291bnQgPiAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJPbmx5IG9uZSBvZiBjbGFzc25hbWUgb3IgcmVzb3VyY2UgY2FuIGJlIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHByb3BlcnR5IGRlZmluZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGV4ZWN1dGUgaXQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygidXNpbmcgdXNlciBzdXBwbGllZCBjbGFzc3BhdGg6ICIgKyBjbGFzc3BhdGgsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IGNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IGNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoIm9ubHkiKTsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coInVzaW5nIHN5c3RlbSBjbGFzc3BhdGg6ICIgKyBjbGFzc3BhdGgsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgfQorICAgICAgICBBbnRDbGFzc0xvYWRlciBsb2FkZXI7CisgICAgICAgIGxvYWRlciA9IG5ldyBBbnRDbGFzc0xvYWRlcihnZXRQcm9qZWN0KCkuZ2V0Q29yZUxvYWRlcigpLAorICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCksCisgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aCwgZmFsc2UpOworICAgICAgICBTdHJpbmcgbG9jID0gbnVsbDsKKyAgICAgICAgaWYgKGNsYXNzbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvL2NvbnZlcnQgYSBjbGFzcyBuYW1lIGludG8gYSByZXNvdXJjZQorICAgICAgICAgICAgcmVzb3VyY2UgPSBjbGFzc25hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9uZSBvZiBjbGFzcyBvciByZXNvdXJjZSBpcyByZXF1aXJlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc291cmNlLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKworICAgICAgICBsb2coIlNlYXJjaGluZyBmb3IgIiArIHJlc291cmNlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgVVJMIHVybDsKKyAgICAgICAgdXJsID0gbG9hZGVyLmdldFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAvL3NldCB0aGUgcHJvcGVydHkKKyAgICAgICAgICAgIGxvYyA9IHVybC50b0V4dGVybmFsRm9ybSgpOworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHByb3BlcnR5LCBsb2MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbmFtZSB0aGUgcmVzb3VyY2UgdG8gbG9vayBmb3IKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGxvb2sgZm9yLgorICAgICAqIEBhbnQuYXR0cmlidXRlIGdyb3VwPSJvbmVvZiIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5hbWUgdGhlIGNsYXNzIHRvIGxvb2sgZm9yCisgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gbG9vayBmb3IuCisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9Im9uZW9mIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzKFN0cmluZyBjbGFzc25hbWUpIHsKKyAgICAgICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhlIHByb3BlcnR5IHRvIGZpbGwgd2l0aCB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSBvciBjbGFzcworICAgICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gYmUgc2V0LgorICAgICAqIEBhbnQuYXR0cmlidXRlIGdyb3VwPSJyZXF1aXJlZCIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExpYWlzb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlMWRlZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIFByb3h5IGludGVyZmFjZSBmb3IgWFNMVCBwcm9jZXNzb3JzLgorICoKKyAqIEBzZWUgWFNMVFByb2Nlc3MKKyAqIEBzaW5jZSBBbnQgMS4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWFNMVExpYWlzb24geworCisgICAgLyoqCisgICAgICogdGhlIGZpbGUgcHJvdG9jb2wgcHJlZml4IGZvciBzeXN0ZW1pZC4KKyAgICAgKiBUaGlzIGZpbGUgcHJvdG9jb2wgbXVzdCBiZSBhcHBlbmRlZCB0byBhbiBhYnNvbHV0ZSBwYXRoLgorICAgICAqIFR5cGljYWxseTogPHR0PkZJTEVfUFJPVE9DT0xfUFJFRklYICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTwvdHQ+CisgICAgICogTm90ZSB0aGF0IG9uIFdpbmRvd3MsIGFuIGV4dHJhICcvJyBtdXN0IGJlIGFwcGVuZGVkIHRvIHRoZQorICAgICAqIHByb3RvY29sIHByZWZpeCBzbyB0aGF0IHRoZXJlIGlzIGFsd2F5cyAzIGNvbnNlY3V0aXZlIHNsYXNoZXMuCisgICAgICogQHNpbmNlIEFudCAxLjQKKyAgICAgKi8KKyAgICBTdHJpbmcgRklMRV9QUk9UT0NPTF9QUkVGSVggPSAiZmlsZTovLyI7CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIHN0eWxlc2hlZXQgdG8gdXNlIGZvciB0aGUgdHJhbnNmb3JtYXRpb24uCisgICAgICogQHBhcmFtIHN0eWxlc2hlZXQgdGhlIHN0eWxlc2hlZXQgdG8gYmUgdXNlZCBmb3IgdHJhbnNmb3JtYXRpb24uCisgICAgICogQHRocm93cyBFeGNlcHRpb24gdGhyb3duIGlmIGFueSBwcm9ibGVtcyBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbnQgMS40CisgICAgICovCisgICAgdm9pZCBzZXRTdHlsZXNoZWV0KEZpbGUgc3R5bGVzaGVldCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHBhcmFtZXRlciB0byBiZSBzZXQgZHVyaW5nIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHBhcmFtZXRlciBuYW1lLgorICAgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBwYXJhbWV0ZXIgdmFsdWUgYXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gdGhyb3duIGlmIGFueSBwcm9ibGVtcyBoYXBwZW5zLgorICAgICAqIEBzaW5jZSBBbnQgMS4zCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbShTdHJpbmcgbmFtZSwgU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhIGZpbGUgaW50byBhbm90aGVyLgorICAgICAqIEBwYXJhbSBpbmZpbGUgdGhlIGlucHV0IGZpbGUsIHByb2JhYmx5IGFuIFhNTCBvbmUuIDotKQorICAgICAqIEBwYXJhbSBvdXRmaWxlIHRoZSBvdXRwdXQgZmlsZSByZXN1bHRpbmcgZnJvbSB0aGUgdHJhbnNmb3JtYXRpb24KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB0aHJvd24gaWYgYW55IHByb2JsZW1zIGhhcHBlbnMuCisgICAgICogQHNlZSAjc2V0U3R5bGVzaGVldChGaWxlKQorICAgICAqIEBzaW5jZSBBbnQgMS40CisgICAgICovCisgICAgdm9pZCB0cmFuc2Zvcm0oRmlsZSBpbmZpbGUsIEZpbGUgb3V0ZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbjsKKworfSAvLy0tIFhTTFRMaWFpc29uCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbjIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMWFmZjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbjIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKKy8qKgorICogRXh0ZW5kZWQgUHJveHkgaW50ZXJmYWNlIGZvciBYU0xUIHByb2Nlc3NvcnMuCisgKgorICogQHNlZSBYU0xUUHJvY2VzcworICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGludGVyZmFjZSBYU0xUTGlhaXNvbjIgZXh0ZW5kcyBYU0xUTGlhaXNvbiB7CisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoZSBsaWFzaW9uIGZyb20gdGhlIFhTTFRQcm9jZXNzIHRhc2sKKyAgICAgKiBAcGFyYW0geHNsdFRhc2sgdGhlIFhTTFRQcm9jZXNzIHRhc2sKKyAgICAgKi8KKyAgICB2b2lkIGNvbmZpZ3VyZShYU0xUUHJvY2VzcyB4c2x0VGFzayk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbjMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MzA5M2YKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbjMuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CisKKy8qKgorICogRXh0ZW5kcyBQcm94eSBpbnRlcmZhY2UgZm9yIFhTTFQgcHJvY2Vzc29ycy4KKyAqCisgKiBAc2VlIFhTTFRQcm9jZXNzCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgaW50ZXJmYWNlIFhTTFRMaWFpc29uMyBleHRlbmRzIFhTTFRMaWFpc29uMiB7CisgICAgLyoqCisgICAgICogc2V0cyB0aGUgc3R5bGVzaGVldCB0byB1c2UgYXMgYSByZXNvdXJjZQorICAgICAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBzdHlsZXNoZWV0IHRvIHVzZSBhcyBhIHJlc291cmNlCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHN0eWxlc2hlZXQgY2Fubm90IGJlIGxvYWRlZAorICAgICAqLworICAgIHZvaWQgc2V0U3R5bGVzaGVldChSZXNvdXJjZSBzdHlsZXNoZWV0KSB0aHJvd3MgRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExvZ2dlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYWRlYmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTG9nZ2VyLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCisvKioKKyAqIEludGVyZmFjZSB0byBsb2cgbWVzc2FnZXMgZm9yIFhTTFQKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWFNMVExvZ2dlciB7CisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIHRvIGxvZworICAgICAqLworICAgIHZvaWQgbG9nKFN0cmluZyBtc2cpOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExvZ2dlckF3YXJlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTG9nZ2VyQXdhcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGYwZmNlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExvZ2dlckF3YXJlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgYSBjbGFzcyB0aGF0IG9uZSBjYW4gc2V0IGFuIFhTTFRMb2dnZXIgb24uCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgaW50ZXJmYWNlIFhTTFRMb2dnZXJBd2FyZSB7CisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2dnZXIgZm9yIHRoaXMgY2xhc3MuCisgICAgICogQHBhcmFtIGwgdGhlIGxvZ2dlcgorICAgICAqLworICAgIHZvaWQgc2V0TG9nZ2VyKFhTTFRMb2dnZXIgbCk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUUHJvY2Vzcy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVFByb2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjMyOTViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVFByb2Nlc3MuamF2YQpAQCAtMCwwICsxLDExODggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRHluYW1pY0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlVuaW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBQcm9jZXNzZXMgYSBzZXQgb2YgWE1MIGRvY3VtZW50cyB2aWEgWFNMVC4gVGhpcyBpcworICogdXNlZnVsIGZvciBidWlsZGluZyB2aWV3cyBvZiBYTUwgYmFzZWQgZG9jdW1lbnRhdGlvbi4KKyAqCisgKgorICogQHNpbmNlIEFudCAxLjEKKyAqCisgKiBAYW50LnRhc2sgbmFtZT0ieHNsdCIgY2F0ZWdvcnk9InhtbCIKKyAqLworCitwdWJsaWMgY2xhc3MgWFNMVFByb2Nlc3MgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgaW1wbGVtZW50cyBYU0xUTG9nZ2VyIHsKKyAgICAvKiogZGVzdGluYXRpb24gZGlyZWN0b3J5ICovCisgICAgcHJpdmF0ZSBGaWxlIGRlc3REaXIgPSBudWxsOworCisgICAgLyoqIHdoZXJlIHRvIGZpbmQgdGhlIHNvdXJjZSBYTUwgZmlsZSwgZGVmYXVsdCBpcyB0aGUgcHJvamVjdCdzIGJhc2VkaXIgKi8KKyAgICBwcml2YXRlIEZpbGUgYmFzZURpciA9IG51bGw7CisKKyAgICAvKiogWFNMIHN0eWxlc2hlZXQgYXMgYSBmaWxlbmFtZSAqLworICAgIHByaXZhdGUgU3RyaW5nIHhzbEZpbGUgPSBudWxsOworCisgICAgLyoqIFhTTCBzdHlsZXNoZWV0IGFzIGEge0BsaW5rIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlfSAqLworICAgIHByaXZhdGUgUmVzb3VyY2UgeHNsUmVzb3VyY2UgPSBudWxsOworCisgICAgLyoqIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgcHJvZHVjZWQgYnkgWFNMIHByb2Nlc3NpbmcgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRFeHRlbnNpb24gPSAiLmh0bWwiOworCisgICAgLyoqIG5hbWUgZm9yIFhTTCBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgZmlsZW5hbWUgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZVBhcmFtZXRlciA9IG51bGw7CisKKyAgICAvKiogbmFtZSBmb3IgWFNMIHBhcmFtZXRlciBjb250YWluaW5nIHRoZSBmaWxlIGRpcmVjdG9yeSAqLworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVEaXJQYXJhbWV0ZXIgPSBudWxsOworCisgICAgLyoqIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgdG8gdGhlIHN0eWxlc2hlZXRzICovCisgICAgcHJpdmF0ZSBWZWN0b3IgcGFyYW1zID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIElucHV0IFhNTCBkb2N1bWVudCB0byBiZSB1c2VkICovCisgICAgcHJpdmF0ZSBGaWxlIGluRmlsZSA9IG51bGw7CisKKyAgICAvKiogT3V0cHV0IGZpbGUgKi8KKyAgICBwcml2YXRlIEZpbGUgb3V0RmlsZSA9IG51bGw7CisKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIFhTTCBwcm9jZXNzb3IgdG8gdXNlICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc29yOworCisgICAgLyoqIENsYXNzcGF0aCB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gbG9hZCB0aGUgWFNMIHByb2Nlc3NvciAqLworICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGggPSBudWxsOworCisgICAgLyoqIFRoZSBMaWFzb24gaW1wbGVtZW50YXRpb24gdG8gdXNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIFhTTAorICAgICAqICBwcm9jZXNzb3IgKi8KKyAgICBwcml2YXRlIFhTTFRMaWFpc29uIGxpYWlzb247CisKKyAgICAvKiogRmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIHN0eWxlc2hlZXQgaGFzIGJlZW4gbG9hZGVkIGludG8KKyAgICAgKiAgdGhlIHByb2Nlc3NvciAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdHlsZXNoZWV0TG9hZGVkID0gZmFsc2U7CisKKyAgICAvKiogZm9yY2Ugb3V0cHV0IG9mIHRhcmdldCBmaWxlcyBldmVuIGlmIHRoZXkgYWxyZWFkeSBleGlzdCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZSA9IGZhbHNlOworCisgICAgLyoqIFhTTCBvdXRwdXQgcHJvcGVydGllcyB0byBiZSB1c2VkICovCisgICAgcHJpdmF0ZSBWZWN0b3Igb3V0cHV0UHJvcGVydGllcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKiBmb3IgcmVzb2x2aW5nIGVudGl0aWVzIHN1Y2ggYXMgZHRkcyAqLworICAgIHByaXZhdGUgWE1MQ2F0YWxvZyB4bWxDYXRhbG9nID0gbmV3IFhNTENhdGFsb2coKTsKKworICAgIC8qKiBOYW1lIG9mIHRoZSBUUkFYIExpYWlzb24gY2xhc3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBWF9MSUFJU09OX0NMQVNTID0KKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5UcmFYTGlhaXNvbiI7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBzdHlsZSBhbGwgZmlsZXMgaW4gdGhlIGluY2x1ZGVkIGRpcmVjdG9yaWVzIGFzIHdlbGwuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwZXJmb3JtRGlyZWN0b3J5U2NhbiA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBmYWN0b3J5IGVsZW1lbnQgZm9yIFRyYVggcHJvY2Vzc29ycyBvbmx5CisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiB3aGV0aGVyIHRvIHJldXNlIFRyYW5zZm9ybWVyIGlmIHRyYW5zZm9ybWluZyBtdWx0aXBsZSBmaWxlcy4KKyAgICAgKiBAc2luY2UgMS41LjIKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmV1c2VMb2FkZWRTdHlsZXNoZWV0ID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEFudENsYXNzTG9hZGVyIGZvciB0aGUgbmVzdGVkICZsdDtjbGFzc3BhdGgmZ3Q7IC0gaWYgc2V0LgorICAgICAqCisgICAgICogPHA+V2Uga2VlcCB0aGlzIGhlcmUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIGNvbnRleHQgY2xhc3Nsb2FkZXIKKyAgICAgKiBpbiBleGVjdXRlLiAgV2UgY2FuJ3QgdXNlIGxpYWlzb24uZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpCisgICAgICogc2luY2UgdGhlIGFjdHVhbCBsaWFpc29uIGNsYXNzIG1heSBoYXZlIGJlZW4gbG9hZGVkIGJ5IGEgbG9hZGVyCisgICAgICogaGlnaGVyIHVwIChzeXN0ZW0gY2xhc3Nsb2FkZXIsIGZvciBleGFtcGxlKS48L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHJpdmF0ZSBBbnRDbGFzc0xvYWRlciBsb2FkZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogTWFwcGVyIHRvIHVzZSB3aGVuIGEgc2V0IG9mIGZpbGVzIGdldHMgcHJvY2Vzc2VkLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHByaXZhdGUgTWFwcGVyIG1hcHBlckVsZW1lbnQgPSBudWxsOworCisgICAgLyoqCisgICAgICogQWRkaXRpb25hbCByZXNvdXJjZSBjb2xsZWN0aW9ucyB0byBwcm9jZXNzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIFVuaW9uIHJlc291cmNlcyA9IG5ldyBVbmlvbigpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byB1c2UgdGhlIGltcGxpY2l0IGZpbGVzZXQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VJbXBsaWNpdEZpbGVzZXQgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgcHJvY2Vzc29yIGlzIHRyYXgKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NPUl9UUkFYID0gInRyYXgiOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBYU0xUUHJvY2VzcyBUYXNrLgorICAgICAqLworICAgIHB1YmxpYyBYU0xUUHJvY2VzcygpIHsKKyAgICB9IC8vLS0gWFNMVFByb2Nlc3MKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc3R5bGUgYWxsIGZpbGVzIGluIHRoZSBpbmNsdWRlZCBkaXJlY3RvcmllcyBhcyB3ZWxsOworICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0IGlzIHRydWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB0cnVlIGlmIGZpbGVzIGluIGluY2x1ZGVkIGRpcmVjdG9yaWVzIGFyZSBwcm9jZXNzZWQuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FuSW5jbHVkZWREaXJlY3Rvcmllcyhib29sZWFuIGIpIHsKKyAgICAgICAgcGVyZm9ybURpcmVjdG9yeVNjYW4gPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHN0eWxlc2hlZXQgaXMgcmVsb2FkZWQgZm9yIGV2ZXJ5IHRyYW5zZm9ybS4KKyAgICAgKgorICAgICAqIDxwPlNldHRpbmcgdGhpcyB0byB0cnVlIG1heSBnZXQgYXJvdW5kIGEgYnVnIGluIGNlcnRhaW4KKyAgICAgKiBYYWxhbi1KIHZlcnNpb25zLCBkZWZhdWx0IGlzIGZhbHNlLjwvcD4KKyAgICAgKiBAcGFyYW0gYiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbG9hZFN0eWxlc2hlZXQoYm9vbGVhbiBiKSB7CisgICAgICAgIHJldXNlTG9hZGVkU3R5bGVzaGVldCA9ICFiOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIG1hcHBlciB0byBtYXAgc291cmNlIHRvIGRlc3RpbmF0aW9uIGZpbGVzLgorICAgICAqIEBwYXJhbSBtYXBwZXIgdGhlIG1hcHBlciB0byB1c2UKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIG1vcmUgdGhhbiBvbmUgbWFwcGVyIGlzIGRlZmluZWQKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWFwcGVyKE1hcHBlciBtYXBwZXIpIHsKKyAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgZGVmaW5lIG1vcmUgdGhhbiBvbmUgbWFwcGVyIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgbWFwcGVyRWxlbWVudCA9IG1hcHBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdG8gc3R5bGUgaW4gYWRkaXRpb24gdG8gdGhlCisgICAgICogZ2l2ZW4gZmlsZSBvciB0aGUgaW1wbGljaXQgZmlsZXNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYyB0aGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdG8gc3R5bGUKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgcmVzb3VyY2VzLmFkZChyYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmVzdGVkICZsdDtzdHlsZSZndDsgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gcmMgdGhlIGNvbmZpZ3VyZWQgUmVzb3VyY2VzIG9iamVjdCByZXByZXNlbnRlZCBhcyAmbHQ7c3R5bGUmZ3Q7LgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFN0eWxlKFJlc291cmNlcyByYykgeworICAgICAgICBpZiAocmMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRoZSBzdHlsZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggZXhhY3RseSBvbmUgbmVzdGVkIHJlc291cmNlLiIpOworICAgICAgICB9CisgICAgICAgIHNldFhzbFJlc291cmNlKChSZXNvdXJjZSkgcmMuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFQSSBtZXRob2QgdG8gc2V0IHRoZSBYU0wgUmVzb3VyY2UuCisgICAgICogQHBhcmFtIHhzbFJlc291cmNlIFJlc291cmNlIHRvIHNldCBhcyB0aGUgc3R5bGVzaGVldC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhzbFJlc291cmNlKFJlc291cmNlIHhzbFJlc291cmNlKSB7CisgICAgICAgIHRoaXMueHNsUmVzb3VyY2UgPSB4c2xSZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmVzdGVkIGZpbGVuYW1lbWFwcGVyLgorICAgICAqIEBwYXJhbSBmaWxlTmFtZU1hcHBlciB0aGUgbWFwcGVyIHRvIGFkZAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgbW9yZSB0aGFuIG9uZSBtYXBwZXIgaXMgZGVmaW5lZAorICAgICAqIEBzaW5jZSBBbnQgMS43LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZU5hbWVNYXBwZXIgZmlsZU5hbWVNYXBwZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgTWFwcGVyIG1hcHBlciA9IG5ldyBNYXBwZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICBtYXBwZXIuYWRkKGZpbGVOYW1lTWFwcGVyKTsKKyAgICAgICBhZGRNYXBwZXIobWFwcGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXhlY3V0aW9uIHByb2JsZW0uCisgICAgICogQHRvZG8gdmFsaWRhdGUgdGhhdCBpZiBlaXRoZXIgaW4gb3Igb3VyIGlzIGRlZmluZWQsIHRoZW4gYm90aCBhcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCJzdHlsZSIuZXF1YWxzKGdldFRhc2tUeXBlKCkpKSB7CisgICAgICAgICAgICBsb2coIldhcm5pbmc6IHRoZSB0YXNrIG5hbWUgPHN0eWxlPiBpcyBkZXByZWNhdGVkLiBVc2UgPHhzbHQ+IGluc3RlYWQuIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBzYXZlZEJhc2VEaXIgPSBiYXNlRGlyOworCisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lcjsKKyAgICAgICAgU3RyaW5nW10gICAgICAgICBsaXN0OworICAgICAgICBTdHJpbmdbXSAgICAgICAgIGRpcnM7CisKKyAgICAgICAgU3RyaW5nIGJhc2VNZXNzYWdlID0KKyAgICAgICAgICAgICJzcGVjaWZ5IHRoZSBzdHlsZXNoZWV0IGVpdGhlciBhcyBhIGZpbGVuYW1lIGluIHN0eWxlIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICArICJvciBhcyBhIG5lc3RlZCByZXNvdXJjZSI7CisKKyAgICAgICAgaWYgKHhzbFJlc291cmNlID09IG51bGwgJiYgeHNsRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oYmFzZU1lc3NhZ2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh4c2xSZXNvdXJjZSAhPSBudWxsICYmIHhzbEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGJhc2VNZXNzYWdlICsgIiBidXQgbm90IGFzIGJvdGgiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5GaWxlICE9IG51bGwgJiYgIWluRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbnB1dCBmaWxlICIgKyBpbkZpbGUgKyAiIGRvZXMgbm90IGV4aXN0IiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlIHN0eWxlUmVzb3VyY2U7CisgICAgICAgICAgICBpZiAoYmFzZURpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYmFzZURpciA9IGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaWFpc29uID0gZ2V0TGlhaXNvbigpOworCisgICAgICAgICAgICAvLyBjaGVjayBpZiBsaWFpc29uIHdhbnRzIHRvIGxvZyBlcnJvcnMgdXNpbmcgdXMgYXMgbG9nZ2VyCisgICAgICAgICAgICBpZiAobGlhaXNvbiBpbnN0YW5jZW9mIFhTTFRMb2dnZXJBd2FyZSkgeworICAgICAgICAgICAgICAgICgoWFNMVExvZ2dlckF3YXJlKSBsaWFpc29uKS5zZXRMb2dnZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIlVzaW5nICIgKyBsaWFpc29uLmdldENsYXNzKCkudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgICAgIGlmICh4c2xGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBlbnRlciBoZXJlLCBpdCBtZWFucyB0aGF0IHRoZSBzdHlsZXNoZWV0IGlzIHN1cHBsaWVkCisgICAgICAgICAgICAgICAgLy8gdmlhIHN0eWxlIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIEZpbGUgc3R5bGVzaGVldCA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSh4c2xGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0eWxlc2hlZXQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVzaGVldCA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoYmFzZURpciwgeHNsRmlsZSk7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIHNob3VsZG4ndCB0aHJvdyBvdXQgZGVwcmVjYXRpb24gd2FybmluZ3MgYmVmb3JlIHdlIGtub3csCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSB3cm9uZyB2ZXJzaW9uIGhhcyBiZWVuIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVzaGVldC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gdGhlICdzdHlsZScgYXR0cmlidXRlIHNob3VsZCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCIgICAgICAgICAgICAgYmFzZWRpciwgbm90IHRoZSB0YXNrcydzIGJhc2VkaXIuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRmlsZVJlc291cmNlIGZyID0gbmV3IEZpbGVSZXNvdXJjZSgpOworICAgICAgICAgICAgICAgIGZyLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICBmci5zZXRGaWxlKHN0eWxlc2hlZXQpOworICAgICAgICAgICAgICAgIHN0eWxlUmVzb3VyY2UgPSBmcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3R5bGVSZXNvdXJjZSA9IHhzbFJlc291cmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBpbiBmaWxlIGFuZCBvdXQgdGhlbiBwcm9jZXNzIHRoZW0KKyAgICAgICAgICAgIGlmIChpbkZpbGUgIT0gbnVsbCAmJiBvdXRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzKGluRmlsZSwgb3V0RmlsZSwgc3R5bGVSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGlmIHdlIGdldCBoZXJlLCBpbiBhbmQgb3V0IGhhdmUgbm90IGJlZW4gc3BlY2lmaWVkLCB3ZSBhcmUKKyAgICAgICAgICAgICAqIGluIGJhdGNoIHByb2Nlc3NpbmcgbW9kZS4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLy0tIG1ha2Ugc3VyZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLi4uCisgICAgICAgICAgICBjaGVja0Rlc3QoKTsKKworICAgICAgICAgICAgaWYgKHVzZUltcGxpY2l0RmlsZXNldCkgeworICAgICAgICAgICAgICAgIHNjYW5uZXIgPSBnZXREaXJlY3RvcnlTY2FubmVyKGJhc2VEaXIpOworICAgICAgICAgICAgICAgIGxvZygiVHJhbnNmb3JtaW5nIGludG8gIiArIGRlc3REaXIsIFByb2plY3QuTVNHX0lORk8pOworCisgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBhbGwgdGhlIGZpbGVzIG1hcmtlZCBmb3Igc3R5bGluZworICAgICAgICAgICAgICAgIGxpc3QgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyhiYXNlRGlyLCBsaXN0W2ldLCBkZXN0RGlyLCBzdHlsZVJlc291cmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBlcmZvcm1EaXJlY3RvcnlTY2FuKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgYWxsIHRoZSBkaXJlY3RvcmllcyBtYXJrZWQgZm9yIHN0eWxpbmcKKyAgICAgICAgICAgICAgICAgICAgZGlycyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRpcnMubGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgRmlsZShiYXNlRGlyLCBkaXJzW2pdKS5saXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKGJhc2VEaXIsIGRpcnNbal0gKyBGaWxlLnNlcGFyYXRvciArIGxpc3RbaV0sIGRlc3REaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIG9ubHkgcmVzb3VyY2UgY29sbGVjdGlvbnMsIHRoZXJlIGJldHRlciBiZSBzb21lCisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5vIHJlc291cmNlcyBzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9jZXNzUmVzb3VyY2VzKHN0eWxlUmVzb3VyY2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLnJlc2V0VGhyZWFkQ29udGV4dExvYWRlcigpOworICAgICAgICAgICAgICAgIGxvYWRlci5jbGVhbnVwKCk7CisgICAgICAgICAgICAgICAgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpYWlzb24gPSBudWxsOworICAgICAgICAgICAgc3R5bGVzaGVldExvYWRlZCA9IGZhbHNlOworICAgICAgICAgICAgYmFzZURpciA9IHNhdmVkQmFzZURpcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGNoZWNrIGRlcGVuZGVuY2llcywgb3IgYWx3YXlzIGdlbmVyYXRlOworICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZvcmNlIHRydWUgaWYgYWx3YXlzIGdlbmVyYXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlKGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgdGhpcy5mb3JjZSA9IGZvcmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFzZSBkaXJlY3Rvcnk7CisgICAgICogb3B0aW9uYWwsIGRlZmF1bHQgaXMgdGhlIHByb2plY3QncyBiYXNlZGlyLgorICAgICAqCisgICAgICogQHBhcmFtIGRpciB0aGUgYmFzZSBkaXJlY3RvcnkKKyAgICAgKiovCisgICAgcHVibGljIHZvaWQgc2V0QmFzZWRpcihGaWxlIGRpcikgeworICAgICAgICBiYXNlRGlyID0gZGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIFhTTCByZXN1bHQKKyAgICAgKiBmaWxlcyBzaG91bGQgYmUgY29waWVkIHRvOworICAgICAqIHJlcXVpcmVkLCB1bmxlc3MgPHR0PmluPC90dD4gYW5kIDx0dD5vdXQ8L3R0PiBhcmUKKyAgICAgKiBzcGVjaWZpZWQuCisgICAgICogQHBhcmFtIGRpciB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgICoqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RkaXIoRmlsZSBkaXIpIHsKKyAgICAgICAgZGVzdERpciA9IGRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc2lyZWQgZmlsZSBleHRlbnNpb24gdG8gYmUgdXNlZCBmb3IgdGhlIHRhcmdldDsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdCBpcyBodG1sLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBleHRlbnNpb24gdG8gdXNlCisgICAgICoqLworICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgbmFtZSkgeworICAgICAgICB0YXJnZXRFeHRlbnNpb24gPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHN0eWxlc2hlZXQgdG8gdXNlIC0gZ2l2ZW4gZWl0aGVyIHJlbGF0aXZlCisgICAgICogdG8gdGhlIHByb2plY3QncyBiYXNlZGlyIG9yIGFzIGFuIGFic29sdXRlIHBhdGg7IHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHhzbEZpbGUgdGhlIHN0eWxlc2hlZXQgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHhzbEZpbGUpIHsKKyAgICAgICAgdGhpcy54c2xGaWxlID0geHNsRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9wdGlvbmFsIGNsYXNzcGF0aCB0byB0aGUgWFNMIHByb2Nlc3NvcgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIFhTTCBwcm9jZXNzb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuYXBwZW5kKGNsYXNzcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcHRpb25hbCBjbGFzc3BhdGggdG8gdGhlIFhTTCBwcm9jZXNzb3IKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBwYXRoIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhlIEFudCBjb3JlLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVmZXJlbmNlIHRvIGFuIG9wdGlvbmFsIGNsYXNzcGF0aCB0byB0aGUgWFNMIHByb2Nlc3NvcgorICAgICAqCisgICAgICogQHBhcmFtIHIgdGhlIGlkIG9mIHRoZSBBbnQgcGF0aCBpbnN0YW5jZSB0byBhY3QgYXMgdGhlIGNsYXNzcGF0aAorICAgICAqICAgICAgICAgIGZvciBsb2FkaW5nIHRoZSBYU0wgcHJvY2Vzc29yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgWFNMIHByb2Nlc3NvciB0byB1c2U7IG9wdGlvbmFsLCBkZWZhdWx0IHRyYXguCisgICAgICogT3RoZXIgdmFsdWVzIGFyZSAieGFsYW4iIGZvciBYYWxhbjEKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgdGhlIG5hbWUgb2YgdGhlIFhTTCBwcm9jZXNzb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzb3IoU3RyaW5nIHByb2Nlc3NvcikgeworICAgICAgICB0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIHVzZSB0aGUgaW1wbGljaXQgZmlsZXNldC4KKyAgICAgKgorICAgICAqIDxwPlNldCB0aGlzIHRvIGZhbHNlIGlmIHlvdSB3YW50IGV4cGxpY2l0IGNvbnRyb2wgd2l0aCBuZXN0ZWQKKyAgICAgKiByZXNvdXJjZSBjb2xsZWN0aW9ucy48L3A+CisgICAgICogQHBhcmFtIHVzZWltcGxpY2l0ZmlsZXNldCBzZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byB1c2UgaW1wbGljaXQgZmlsZXNldAorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlSW1wbGljaXRGaWxlc2V0KGJvb2xlYW4gdXNlaW1wbGljaXRmaWxlc2V0KSB7CisgICAgICAgIHVzZUltcGxpY2l0RmlsZXNldCA9IHVzZWltcGxpY2l0ZmlsZXNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGNhdGFsb2cgdG8gb3VyIGludGVybmFsIGNhdGFsb2cKKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWxDYXRhbG9nIHRoZSBYTUxDYXRhbG9nIGluc3RhbmNlIHRvIHVzZSB0byBsb29rIHVwIERURHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkWE1MQ2F0YWxvZyhYTUxDYXRhbG9nIHhtbENhdGFsb2cpIHsKKyAgICAgICAgdGhpcy54bWxDYXRhbG9nLmFkZENvbmZpZ3VyZWRYTUxDYXRhbG9nKHhtbENhdGFsb2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3MgdGhlIGZpbGVuYW1lIG9mIHRoZSBjdXJyZW50IHByb2Nlc3NlZCBmaWxlIGFzIGEgeHNsIHBhcmFtZXRlcgorICAgICAqIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4gVGhpcyB2YWx1ZSBzZXRzIHRoZSBuYW1lIG9mIHRoYXQgeHNsIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlTmFtZVBhcmFtZXRlciBuYW1lIG9mIHRoZSB4c2wgcGFyYW1ldGVyIHJldHJpZXZpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZmlsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWVQYXJhbWV0ZXIoU3RyaW5nIGZpbGVOYW1lUGFyYW1ldGVyKSB7CisgICAgICAgIHRoaXMuZmlsZU5hbWVQYXJhbWV0ZXIgPSBmaWxlTmFtZVBhcmFtZXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXNzIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9jZXNzZWQgZmlsZSBhcyBhIHhzbCBwYXJhbWV0ZXIKKyAgICAgKiB0byB0aGUgdHJhbnNmb3JtYXRpb24uIFRoaXMgdmFsdWUgc2V0cyB0aGUgbmFtZSBvZiB0aGF0IHhzbCBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZURpclBhcmFtZXRlciBuYW1lIG9mIHRoZSB4c2wgcGFyYW1ldGVyIHJldHJpZXZpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBmaWxlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVEaXJQYXJhbWV0ZXIoU3RyaW5nIGZpbGVEaXJQYXJhbWV0ZXIpIHsKKyAgICAgICAgdGhpcy5maWxlRGlyUGFyYW1ldGVyID0gZmlsZURpclBhcmFtZXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHByb2Nlc3NvciBoZXJlIGluc3RlYWQgb2YgaW4gc2V0UHJvY2Vzc29yIC0gdGhpcyB3aWxsIGJlCisgICAgICogY2FsbGVkIGZyb20gd2l0aGluIGV4ZWN1dGUsIHNvIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBsYXRlc3QKKyAgICAgKiBjbGFzc3BhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvYyB0aGUgbmFtZSBvZiB0aGUgcHJvY2Vzc29yIHRvIGxvYWQuCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhlIHByb2Nlc3NvciBjYW5ub3QgYmUgbG9hZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlUHJvY2Vzc29yKFN0cmluZyBwcm9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzbmFtZTsKKyAgICAgICAgaWYgKHByb2MuZXF1YWxzKFBST0NFU1NPUl9UUkFYKSkgeworICAgICAgICAgICAgY2xhc3NuYW1lID0gVFJBWF9MSUFJU09OX0NMQVNTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9hbnl0aGluZyBlbHNlIGlzIGEgY2xhc3NuYW1lCisgICAgICAgICAgICBjbGFzc25hbWUgPSBwcm9jOworICAgICAgICB9CisgICAgICAgIENsYXNzIGNsYXp6ID0gbG9hZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgIGxpYWlzb24gPSAoWFNMVExpYWlzb24pIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBuYW1lZCBjbGFzcyBlaXRoZXIgdmlhIHRoZSBzeXN0ZW0gY2xhc3Nsb2FkZXIgb3IgYSBnaXZlbgorICAgICAqIGN1c3RvbSBjbGFzc2xvYWRlci4KKyAgICAgKgorICAgICAqIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBsb2FkZXIgaXMgc2V0IGFzIHRoZSB0aHJlYWQgY29udGV4dCBjbGFzc2xvYWRlcgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGxvYWQuCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIGNsYXNzLgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgbG9hZGVkLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc25hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbG9hZGVyID0gZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGNsYXNzcGF0aCk7CisgICAgICAgIGxvYWRlci5zZXRUaHJlYWRDb250ZXh0TG9hZGVyKCk7CisgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSwgdHJ1ZSwgbG9hZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIG91dHB1dCBuYW1lIGZvciB0aGUgc3R5bGVkIHJlc3VsdCBmcm9tIHRoZQorICAgICAqIDx0dD5pbjwvdHQ+IGF0dHJpYnV0ZTsgcmVxdWlyZWQgaWYgPHR0PmluPC90dD4gaXMgc2V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0RmlsZSB0aGUgb3V0cHV0IEZpbGUgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0KEZpbGUgb3V0RmlsZSkgeworICAgICAgICB0aGlzLm91dEZpbGUgPSBvdXRGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNwZWNpZmllcyBhIHNpbmdsZSBYTUwgZG9jdW1lbnQgdG8gYmUgc3R5bGVkLiBTaG91bGQgYmUgdXNlZAorICAgICAqIHdpdGggdGhlIDx0dD5vdXQ8L3R0PiBhdHRyaWJ1dGU7IDsgcmVxdWlyZWQgaWYgPHR0Pm91dDwvdHQ+IGlzIHNldAorICAgICAqCisgICAgICogQHBhcmFtIGluRmlsZSB0aGUgaW5wdXQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluKEZpbGUgaW5GaWxlKSB7CisgICAgICAgIHRoaXMuaW5GaWxlID0gaW5GaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93cyBhIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaGFzbid0CisgICAgICogYmVlbiBzcGVjaWZpZWQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEZXN0KCkgeworICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gImRlc3RkaXIgYXR0cmlidXRlcyBtdXN0IGJlIHNldCEiOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHlsZXMgYWxsIGV4aXN0aW5nIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHlsZXNoZWV0IHN0eWxlIHNoZWV0IHRvIHVzZQorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXNvdXJjZXMoUmVzb3VyY2Ugc3R5bGVzaGVldCkgeworICAgICAgICBJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgUmVzb3VyY2UgciA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIXIuaXNFeGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZSBiYXNlID0gYmFzZURpcjsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gci5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAociBpbnN0YW5jZW9mIEZpbGVSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgIEZpbGVSZXNvdXJjZSBmID0gKEZpbGVSZXNvdXJjZSkgcjsKKyAgICAgICAgICAgICAgICBiYXNlID0gZi5nZXRCYXNlRGlyKCk7CisgICAgICAgICAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gZi5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvY2VzcyhiYXNlLCBuYW1lLCBkZXN0RGlyLCBzdHlsZXNoZWV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gaW5wdXQgWE1MIGZpbGUgYW5kIHN0b3JlcyB0aGUgcmVzdWx0CisgICAgICogaW4gdGhlIGdpdmVuIHJlc3VsdEZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZURpciB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHJlc29sdmluZyBmaWxlcy4KKyAgICAgKiBAcGFyYW0geG1sRmlsZSB0aGUgaW5wdXQgZmlsZQorICAgICAqIEBwYXJhbSBkZXN0RGlyIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gc3R5bGVzaGVldCB0aGUgc3R5bGVzaGVldCB0byB1c2UuCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcHJvY2Vzc2luZyBmYWlscy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2VzcyhGaWxlIGJhc2VEaXIsIFN0cmluZyB4bWxGaWxlLCBGaWxlIGRlc3REaXIsIFJlc291cmNlIHN0eWxlc2hlZXQpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIEZpbGUgICBvdXRGID0gbnVsbDsKKyAgICAgICAgRmlsZSAgIGluRiA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgc3R5bGVTaGVldExhc3RNb2RpZmllZCA9IHN0eWxlc2hlZXQuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBpbkYgPSBuZXcgRmlsZShiYXNlRGlyLCB4bWxGaWxlKTsKKworICAgICAgICAgICAgaWYgKGluRi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGluZyAiICsgaW5GICsgIiBpdCBpcyBhIGRpcmVjdG9yeS4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSBudWxsOworICAgICAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1hcHBlciA9IG1hcHBlckVsZW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFwcGVyID0gbmV3IFN0eWxlTWFwcGVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ1tdIG91dEZpbGVOYW1lID0gbWFwcGVyLm1hcEZpbGVOYW1lKHhtbEZpbGUpOworICAgICAgICAgICAgaWYgKG91dEZpbGVOYW1lID09IG51bGwgfHwgb3V0RmlsZU5hbWUubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nICIgKyBpbkZpbGUgKyAiIGl0IGNhbm5vdCBnZXQgbWFwcGVkIHRvIG91dHB1dC4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgaWYgKG91dEZpbGVOYW1lID09IG51bGwgfHwgb3V0RmlsZU5hbWUubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgICAgIGxvZygiU2tpcHBpbmcgIiArIGluRmlsZSArICIgaXRzIG1hcHBpbmcgaXMgYW1iaWd1b3MuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0RiA9IG5ldyBGaWxlKGRlc3REaXIsIG91dEZpbGVOYW1lWzBdKTsKKworICAgICAgICAgICAgaWYgKGZvcmNlIHx8IGluRi5sYXN0TW9kaWZpZWQoKSA+IG91dEYubGFzdE1vZGlmaWVkKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgc3R5bGVTaGVldExhc3RNb2RpZmllZCA+IG91dEYubGFzdE1vZGlmaWVkKCkpIHsKKyAgICAgICAgICAgICAgICBlbnN1cmVEaXJlY3RvcnlGb3Iob3V0Rik7CisgICAgICAgICAgICAgICAgbG9nKCJQcm9jZXNzaW5nICIgKyBpbkYgKyAiIHRvICIgKyBvdXRGKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmVMaWFpc29uKHN0eWxlc2hlZXQpOworICAgICAgICAgICAgICAgIHNldExpYWlzb25EeW5hbWljRmlsZVBhcmFtZXRlcnMobGlhaXNvbiwgaW5GKTsKKyAgICAgICAgICAgICAgICBsaWFpc29uLnRyYW5zZm9ybShpbkYsIG91dEYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIElmIGZhaWxlZCB0byBwcm9jZXNzIGRvY3VtZW50LCBtdXN0IGRlbGV0ZSB0YXJnZXQgZG9jdW1lbnQsCisgICAgICAgICAgICAvLyBvciBpdCB3aWxsIG5vdCBhdHRlbXB0IHRvIHByb2Nlc3MgaXQgdGhlIHNlY29uZCB0aW1lCisgICAgICAgICAgICBsb2coIkZhaWxlZCB0byBwcm9jZXNzICIgKyBpbkZpbGUsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgaWYgKG91dEYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dEYuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKworICAgIH0gLy8tLSBwcm9jZXNzWE1MCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBpbnB1dCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZSB3aXRoIHRoZSBnaXZlbiBzdHlsZXNoZWV0LgorICAgICAqCisgICAgICogQHBhcmFtIGluRmlsZSB0aGUgaW5wdXQgZmlsZSB0byBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBvdXRGaWxlIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgorICAgICAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBzdHlsZXNoZWV0IHRvIHVzZS4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBwcm9jZXNzaW5nIGZhaWxzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKEZpbGUgaW5GaWxlLCBGaWxlIG91dEZpbGUsIFJlc291cmNlIHN0eWxlc2hlZXQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIHN0eWxlU2hlZXRMYXN0TW9kaWZpZWQgPSBzdHlsZXNoZWV0LmdldExhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgbG9nKCJJbiBmaWxlICIgKyBpbkZpbGUgKyAiIHRpbWU6ICIgKyBpbkZpbGUubGFzdE1vZGlmaWVkKCksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIGxvZygiT3V0IGZpbGUgIiArIG91dEZpbGUgKyAiIHRpbWU6ICIgKyBvdXRGaWxlLmxhc3RNb2RpZmllZCgpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICBsb2coIlN0eWxlIGZpbGUgIiArIHhzbEZpbGUgKyAiIHRpbWU6ICIgKyBzdHlsZVNoZWV0TGFzdE1vZGlmaWVkLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICBpZiAoZm9yY2UgfHwgaW5GaWxlLmxhc3RNb2RpZmllZCgpID49IG91dEZpbGUubGFzdE1vZGlmaWVkKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgc3R5bGVTaGVldExhc3RNb2RpZmllZCA+PSBvdXRGaWxlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICAgICAgZW5zdXJlRGlyZWN0b3J5Rm9yKG91dEZpbGUpOworICAgICAgICAgICAgICAgIGxvZygiUHJvY2Vzc2luZyAiICsgaW5GaWxlICsgIiB0byAiICsgb3V0RmlsZSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgY29uZmlndXJlTGlhaXNvbihzdHlsZXNoZWV0KTsKKyAgICAgICAgICAgICAgICBzZXRMaWFpc29uRHluYW1pY0ZpbGVQYXJhbWV0ZXJzKGxpYWlzb24sIGluRmlsZSk7CisgICAgICAgICAgICAgICAgbGlhaXNvbi50cmFuc2Zvcm0oaW5GaWxlLCBvdXRGaWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGluZyBpbnB1dCBmaWxlICIgKyBpbkZpbGUgKyAiIGJlY2F1c2UgaXQgaXMgb2xkZXIgdGhhbiBvdXRwdXQgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG91dEZpbGUgKyAiIGFuZCBzbyBpcyB0aGUgc3R5bGVzaGVldCAiICsgc3R5bGVzaGVldCwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIHByb2Nlc3MgIiArIGluRmlsZSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICBpZiAob3V0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0RmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMgZm9yIGEgZ2l2ZW4gZmlsZQorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldEZpbGUgdGhlIGZpbGUgZm9yIHdoaWNoIHRoZSBkaXJlY3RvcmllcyBhcmUgcmVxdWlyZWQuCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZGlyZWN0b3JpZXMgY2Fubm90IGJlIGNyZWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZURpcmVjdG9yeUZvcihGaWxlIHRhcmdldEZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIGlmICghZGlyZWN0b3J5LmV4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAoIWRpcmVjdG9yeS5ta2RpcnMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3Rvcnk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmFjdG9yeSBpbnN0YW5jZSBjb25maWd1cmVkIGZvciB0aGlzIHByb2Nlc3NvcgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmFjdG9yeSBpbnN0YW5jZSBpbiB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgRmFjdG9yeSBnZXRGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFhNTCBjYXRhbG9nIGNvbnRhaW5pbmcgZW50aXR5IGRlZmluaXRpb25zCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBYTUwgY2F0YWxvZyBmb3IgdGhlIHRhc2suCisgICAgICovCisgICAgcHVibGljIFhNTENhdGFsb2cgZ2V0WE1MQ2F0YWxvZygpIHsKKyAgICAgICAgeG1sQ2F0YWxvZy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIHJldHVybiB4bWxDYXRhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBlbnVtZXJhdGlvbiBvbiB0aGUgb3V0cHV0cHJvcGVydGllcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXRwcm9wZXJ0aWVzCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldE91dHB1dFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRQcm9wZXJ0aWVzLmVsZW1lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBMaWFzb24gaW1wbGVtZW50YXRpb24gdG8gdXNlIGluIHByb2Nlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBYU0xUTGlhc29uIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWFNMVExpYWlzb24gZ2V0TGlhaXNvbigpIHsKKyAgICAgICAgLy8gaWYgcHJvY2Vzc29yIHdhc24ndCBzcGVjaWZpZWQsIHNlZSBpZiBUcmFYIGlzIGF2YWlsYWJsZS4gIElmIG5vdCwKKyAgICAgICAgLy8gZGVmYXVsdCBpdCB0byB4YWxhbiwgZGVwZW5kaW5nIG9uIHdoaWNoIGlzIGluIHRoZSBjbGFzc3BhdGgKKyAgICAgICAgaWYgKGxpYWlzb24gPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHByb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb2Nlc3Nvcihwcm9jZXNzb3IpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9jZXNzb3IoUFJPQ0VTU09SX1RSQVgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlMSkgeworICAgICAgICAgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpYWlzb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIFhTTCBwYXJhbWV0ZXIgZm9yIGNvbmZpZ3VyYXRpb24gYnkgQW50LgorICAgICAqCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgUGFyYW0gY2xhc3MgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW0gY3JlYXRlUGFyYW0oKSB7CisgICAgICAgIFBhcmFtIHAgPSBuZXcgUGFyYW0oKTsKKyAgICAgICAgcGFyYW1zLmFkZEVsZW1lbnQocCk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBQYXJhbSBpbm5lciBjbGFzcyB1c2VkIHRvIHN0b3JlIFhTTCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbSB7CisgICAgICAgIC8qKiBUaGUgcGFyYW1ldGVyIG5hbWUgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICAgICAgLyoqIFRoZSBwYXJhbWV0ZXIncyB2YWx1ZSAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBleHByZXNzaW9uID0gbnVsbDsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBpZlByb3BlcnR5OworICAgICAgICBwcml2YXRlIFN0cmluZyB1bmxlc3NQcm9wZXJ0eTsKKyAgICAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgcGFyYW1ldGVyIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgICAgICogTk9URSA6IHdhcyBpbnRlbmRlZCB0byBiZSBhbiBYU0wgZXhwcmVzc2lvbi4KKyAgICAgICAgICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIHBhcmFtZXRlcidzIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbm90IHNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOYW1lIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBwYXJhbWV0ZXIncyB2YWx1ZQorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IHNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwcmVzc2lvbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeHByZXNzaW9uIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHdoZXRoZXIgdGhpcyBwYXJhbSBzaG91bGQgYmUgdXNlZC4gIEl0IHdpbGwgYmUKKyAgICAgICAgICogdXNlZCBpZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0LCBvdGhlcndpc2UgaXQgd29uJ3QuCisgICAgICAgICAqIEBwYXJhbSBpZlByb3BlcnR5IG5hbWUgb2YgcHJvcGVydHkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldElmKFN0cmluZyBpZlByb3BlcnR5KSB7CisgICAgICAgICAgICB0aGlzLmlmUHJvcGVydHkgPSBpZlByb3BlcnR5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB3aGV0aGVyIHRoaXMgcGFyYW0gc2hvdWxkIE5PVCBiZSB1c2VkLiBJdAorICAgICAgICAgKiB3aWxsIG5vdCBiZSB1c2VkIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQsIG90aGVyd2lzZSBpdAorICAgICAgICAgKiB3aWxsIGJlIHVzZWQuCisgICAgICAgICAqIEBwYXJhbSB1bmxlc3NQcm9wZXJ0eSBuYW1lIG9mIHByb3BlcnR5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoU3RyaW5nIHVubGVzc1Byb3BlcnR5KSB7CisgICAgICAgICAgICB0aGlzLnVubGVzc1Byb3BlcnR5ID0gdW5sZXNzUHJvcGVydHk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRW5zdXJlcyB0aGF0IHRoZSBwYXJhbSBwYXNzZXMgdGhlIGNvbmRpdGlvbnMgcGxhY2VkCisgICAgICAgICAqIG9uIGl0IHdpdGggPGNvZGU+aWY8L2NvZGU+IGFuZCA8Y29kZT51bmxlc3M8L2NvZGU+IHByb3BlcnRpZXMuCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFzayBwYXNzZXMgdGhlICJpZiIgYW5kICJ1bmxlc3MiIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZSgpIHsKKyAgICAgICAgICAgIGlmIChpZlByb3BlcnR5ICE9IG51bGwgJiYgcHJvamVjdC5nZXRQcm9wZXJ0eShpZlByb3BlcnR5KSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVubGVzc1Byb3BlcnR5ICE9IG51bGwgJiYgcHJvamVjdC5nZXRQcm9wZXJ0eSh1bmxlc3NQcm9wZXJ0eSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfSAvLyBQYXJhbQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIG91dHB1dCBwcm9wZXJ0eSB0byBiZSBjb25maWd1cmVkLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgb3V0cHV0IHByb3BlcnR5LgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIE91dHB1dFByb3BlcnR5IGNyZWF0ZU91dHB1dFByb3BlcnR5KCkgeworICAgICAgICBPdXRwdXRQcm9wZXJ0eSBwID0gbmV3IE91dHB1dFByb3BlcnR5KCk7CisgICAgICAgIG91dHB1dFByb3BlcnRpZXMuYWRkRWxlbWVudChwKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmeSBob3cgdGhlIHJlc3VsdCB0cmVlIHNob3VsZCBiZSBvdXRwdXQgYXMgc3BlY2lmaWVkCisgICAgICogaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hzbHQjb3V0cHV0Ij4KKyAgICAgKiBzcGVjaWZpY2F0aW9uPC9hPi4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3V0cHV0UHJvcGVydHkgeworICAgICAgICAvKiogb3V0cHV0IHByb3BlcnR5IG5hbWUgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgICAgICAvKiogb3V0cHV0IHByb3BlcnR5IHZhbHVlICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXQgcHJvcGVydHkgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNldCB0aGUgbmFtZSBmb3IgdGhpcyBwcm9wZXJ0eQorICAgICAgICAgKiBAcGFyYW0gbmFtZSBBIG5vbi1udWxsIFN0cmluZyB0aGF0IHNwZWNpZmllcyBhbgorICAgICAgICAgKiBvdXRwdXQgcHJvcGVydHkgbmFtZSwgd2hpY2ggbWF5IGJlIG5hbWVzcGFjZSBxdWFsaWZpZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogc2V0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5vbi1udWxsIHN0cmluZyB2YWx1ZSBvZiB0aGUgb3V0cHV0IHByb3BlcnR5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGludGVybmFsIGluc3RhbmNlIG9mIFhNTENhdGFsb2cKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmluaXQoKTsKKyAgICAgICAgeG1sQ2F0YWxvZy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIHN0eWxlc2hlZXQgYW5kIHNldCB4c2w6cGFyYW0gcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSBmaWxlIGZyb20gd2hpY2ggdG8gbG9hZCB0aGUgc3R5bGVzaGVldC4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBzdHlsZXNoZWV0IGNhbm5vdCBiZSBsb2FkZWQuCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUxpYWlzb24oRmlsZSBzdHlsZXNoZWV0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBGaWxlUmVzb3VyY2UgZnIgPSBuZXcgRmlsZVJlc291cmNlKCk7CisgICAgICAgIGZyLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgZnIuc2V0RmlsZShzdHlsZXNoZWV0KTsKKyAgICAgICAgY29uZmlndXJlTGlhaXNvbihmcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIHN0eWxlc2hlZXQgYW5kIHNldCB4c2w6cGFyYW0gcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHlsZXNoZWV0IHRoZSByZXNvdXJjZSBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIHN0eWxlc2hlZXQuCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgc3R5bGVzaGVldCBjYW5ub3QgYmUgbG9hZGVkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlTGlhaXNvbihSZXNvdXJjZSBzdHlsZXNoZWV0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoc3R5bGVzaGVldExvYWRlZCAmJiByZXVzZUxvYWRlZFN0eWxlc2hlZXQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdHlsZXNoZWV0TG9hZGVkID0gdHJ1ZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nKCJMb2FkaW5nIHN0eWxlc2hlZXQgIiArIHN0eWxlc2hlZXQsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgLy8gV2UgY2FsbCBsaWFzb24uY29uZmlndXJlKCkgYW5kIHRoZW4gbGlhaXNvbi5zZXRTdHlsZXNoZWV0KCkKKyAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGludGVybmFsIHZhcmlhYmxlcyBvZiBsaWFpc29uIGNhbiBiZSBzZXQgdXAKKyAgICAgICAgICAgIGlmIChsaWFpc29uIGluc3RhbmNlb2YgWFNMVExpYWlzb24yKSB7CisgICAgICAgICAgICAgICAgKChYU0xUTGlhaXNvbjIpIGxpYWlzb24pLmNvbmZpZ3VyZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaWFpc29uIGluc3RhbmNlb2YgWFNMVExpYWlzb24zKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGhlcmUgd2UgY2FuIHNldCB0aGUgc3R5bGVzaGVldCBhcyBhCisgICAgICAgICAgICAgICAgLy8gcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAoKFhTTFRMaWFpc29uMykgbGlhaXNvbikuc2V0U3R5bGVzaGVldChzdHlsZXNoZWV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGhlcmUgd2UgY2Fubm90IHNldCB0aGUgc3R5bGVzaGVldCBhcworICAgICAgICAgICAgICAgIC8vIGEgcmVzb3VyY2UsIGJ1dCB3ZSBjYW4gc2V0IGl0IGFzIGEgZmlsZS4gU28sCisgICAgICAgICAgICAgICAgLy8gd2UgbWFrZSBhbiBhdHRlbXB0IHRvIGdldCBpdCBhcyBhIGZpbGUKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGVzaGVldCBpbnN0YW5jZW9mIEZpbGVQcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICBsaWFpc29uLnNldFN0eWxlc2hlZXQoKChGaWxlUHJvdmlkZXIpIHN0eWxlc2hlZXQpLmdldEZpbGUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGxpYWlzb24uZ2V0Q2xhc3MoKS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFjY2VwdHMgdGhlIHN0eWxlc2hlZXQgb25seSBhcyBhIGZpbGUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBwYXJhbXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICBQYXJhbSBwID0gKFBhcmFtKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHAuc2hvdWxkVXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlhaXNvbi5hZGRQYXJhbShwLmdldE5hbWUoKSwgcC5nZXRFeHByZXNzaW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBsb2coIkZhaWxlZCB0byB0cmFuc2Zvcm0gdXNpbmcgc3R5bGVzaGVldCAiICsgc3R5bGVzaGVldCwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBmaWxlIHBhcmFtZXRlcihzKSBmb3IgZGlyZWN0b3J5IGFuZCBmaWxlbmFtZSBpZiB0aGUgYXR0cmlidXRlCisgICAgICogJ2ZpbGVuYW1lcGFyYW1ldGVyJyBvciAnZmlsZWRpcnBhcmFtZXRlcicgYXJlIHNldCBpbiB0aGUgdGFzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgbGlhaXNvbiAgICB0byBjaGFuZ2UgcGFyYW1ldGVycyBmb3IKKyAgICAgKiBAcGFyYW0gIGluRmlsZSAgICAgdG8gZ2V0IHRoZSBhZGRpdGlvbmFsIGZpbGUgaW5mb3JtYXRpb24gZnJvbQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uICBpZiBhbiBleGNlcHRpb24gb2NjdXJzIG9uIGZpbGVuYW1lIGxvb2t1cAorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0TGlhaXNvbkR5bmFtaWNGaWxlUGFyYW1ldGVycygKKyAgICAgICAgWFNMVExpYWlzb24gbGlhaXNvbiwgRmlsZSBpbkZpbGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZmlsZU5hbWVQYXJhbWV0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlhaXNvbi5hZGRQYXJhbShmaWxlTmFtZVBhcmFtZXRlciwgaW5GaWxlLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGVEaXJQYXJhbWV0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWxzLmdldFJlbGF0aXZlUGF0aChiYXNlRGlyLCBpbkZpbGUpOworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOworICAgICAgICAgICAgLy8gR2l2ZSBhbHdheXMgYSBzbGFzaCBhcyBmaWxlIHNlcGFyYXRvciwgc28gdGhlIHN0eWxlc2hlZXQgY291bGQgYmUgc3VyZSBhYm91dCB0aGF0CisgICAgICAgICAgICAvLyBVc2UgJy4nIHNvIGEgZGlyKyIvIituYW1lIHdvdWxkIG5vdCByZXN1bHQgaW4gYW4gYWJzb2x1dGUgcGF0aAorICAgICAgICAgICAgbGlhaXNvbi5hZGRQYXJhbShmaWxlRGlyUGFyYW1ldGVyLCBmaWxlLmdldFBhcmVudCgpICE9IG51bGwgPyBmaWxlLmdldFBhcmVudCgpLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICdcXCcsICcvJykgOiAiLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBmYWN0b3J5IGVsZW1lbnQgdG8gY29uZmlndXJlIGEgdHJheCBsaWFpc29uLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgZmFjdG9yeSBlbGVtZW50LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBtb3JlIHRoYW4gb25lIHRpbWUuCisgICAgICovCisgICAgcHVibGljIEZhY3RvcnkgY3JlYXRlRmFjdG9yeSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJ2ZhY3RvcnknIGVsZW1lbnQgbXVzdCBiZSB1bmlxdWUiKTsKKyAgICAgICAgfQorICAgICAgICBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZhY3RvcnkgZWxlbWVudCB0byBjb25maWd1cmUgYSB0cmFuc2Zvcm1lciBmYWN0b3J5CisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgeworCisgICAgICAgIC8qKiB0aGUgZmFjdG9yeSBjbGFzcyBuYW1lIHRvIHVzZSBmb3IgVHJhWExpYWlzb24gKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogdGhlIGxpc3Qgb2YgZmFjdG9yeSBhdHRyaWJ1dGVzIHRvIHVzZSBmb3IgVHJhWExpYWlzb24KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgVmVjdG9yIGF0dHJpYnV0ZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZhY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGZhY3RvcnkKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZhY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGZhY3RvcnkgYXR0cmlidXRlLgorICAgICAgICAgKiBAcGFyYW0gYXR0ciB0aGUgbmV3bHkgY3JlYXRlZCBmYWN0b3J5IGF0dHJpYnV0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEVsZW1lbnQoYXR0cik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogcmV0dXJuIHRoZSBhdHRyaWJ1dGUgZWxlbWVudHMuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIG9mIGF0dHJpYnV0ZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZWxlbWVudHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIEpBWFAgZmFjdG9yeSBhdHRyaWJ1dGUuIFRoaXMgaXMgbW9zdGx5IHByb2Nlc3NvciBzcGVjaWZpYywgZm9yCisgICAgICAgICAqIGV4YW1wbGUgZm9yIFhhbGFuIDIuMyssIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBjb3VsZCBiZSBzZXQ6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogIDxsaT5odHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4vZmVhdHVyZXMvb3B0aW1pemUgKHRydWV8ZmFsc2UpIDwvbGk+CisgICAgICAgICAqICA8bGk+aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL2ZlYXR1cmVzL2luY3JlbWVudGFsICh0cnVlfGZhbHNlKSA8L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGUgaW1wbGVtZW50cyBEeW5hbWljQ29uZmlndXJhdG9yIHsKKworICAgICAgICAgICAgLyoqIGF0dHJpYnV0ZSBuYW1lLCBtb3N0bHkgcHJvY2Vzc29yIHNwZWNpZmljICovCisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgICAgICAgICAvKiogYXR0cmlidXRlIHZhbHVlLCBvZnRlbiBhIGJvb2xlYW4gc3RyaW5nICovCisgICAgICAgICAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogTm90IHVzZWQuCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSBub3QgdXNlZAorICAgICAgICAgICAgICogQHJldHVybiBudWxsCisgICAgICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG5ldmVyCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRHluYW1pY0VsZW1lbnQoU3RyaW5nIG5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2V0IGFuIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAqIE9ubHkgIm5hbWUiIGFuZCAidmFsdWUiIGFyZSBzdXBwb3J0ZWQgYXMgbmFtZXMuCisgICAgICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIC8vIG9ubHkgJ25hbWUnIGFuZCAndmFsdWUnIGV4aXN0LgorICAgICAgICAgICAgICAgIGlmICgibmFtZSIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJ2YWx1ZSIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhIHZhbHVlIG11c3QgYmUgb2YgYSBnaXZlbiB0eXBlCisgICAgICAgICAgICAgICAgICAgIC8vIHNheSBib29sZWFufGludGVnZXJ8c3RyaW5nIHRoYXQgYXJlIG1vc3RseSB1c2VkLgorICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gQm9vbGVhbi5UUlVFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3IEludGVnZXIodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGF0dHJpYnV0ZTogIiArIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyAtLSBjbGFzcyBBdHRyaWJ1dGUKKyAgICB9IC8vIC0tIGNsYXNzIEZhY3RvcnkKKworICAgIC8qKgorICAgICAqIE1hcHBlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgInRyYWRpdGlvbmFsIiB3YXkgJmx0O3hzbHQmZ3Q7CisgICAgICogbWFwcGVkIGZpbGVuYW1lcy4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBmaWxlIGhhcyBhbiBleHRlbnNpb24sIGNob3AgaXQgb2ZmLiAgQXBwZW5kIHdoYXRldmVyCisgICAgICogdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhcyBleHRlbnNpb24gb3IgIi5odG1sIi48L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBTdHlsZU1hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgeG1sRmlsZSkgeworICAgICAgICAgICAgaW50IGRvdFBvcyA9IHhtbEZpbGUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmIChkb3RQb3MgPiAwKSB7CisgICAgICAgICAgICAgICAgeG1sRmlsZSA9IHhtbEZpbGUuc3Vic3RyaW5nKDAsIGRvdFBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHt4bWxGaWxlICsgdGFyZ2V0RXh0ZW5zaW9ufTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWG1sUHJvcGVydHkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1htbFByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjOGZhZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1htbFByb3BlcnR5LmphdmEKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5YTUxDYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CisKKy8qKgorICogTG9hZHMgcHJvcGVydHkgdmFsdWVzIGZyb20gYSB2YWxpZCBYTUwgZmlsZSwgZ2VuZXJhdGluZyB0aGUKKyAqIHByb3BlcnR5IG5hbWVzIGZyb20gdGhlIGZpbGUncyBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMuCisgKgorICogPHA+RXhhbXBsZTo8L3A+CisgKiA8cHJlPgorICogICAmbHQ7cm9vdC10YWcgbXlhdHRyPSJ0cnVlIiZndDsKKyAqICAgICAmbHQ7aW5uZXItdGFnIHNvbWVhdHRyPSJ2YWwiJmd0O1RleHQmbHQ7L2lubmVyLXRhZyZndDsKKyAqICAgICAmbHQ7YTImZ3Q7Jmx0O2EzJmd0OyZsdDthNCZndDtmYWxzZSZsdDsvYTQmZ3Q7Jmx0Oy9hMyZndDsmbHQ7L2EyJmd0OworICogICAgICZsdDt4Jmd0O3gxJmx0Oy94Jmd0OworICogICAgICZsdDt4Jmd0O3gyJmx0Oy94Jmd0OworICogICAmbHQ7L3Jvb3QtdGFnJmd0OworICo8L3ByZT4KKyAqCisgKiA8cD50aGlzIGdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6PC9wPgorICoKKyAqIDxwcmU+CisgKiAgcm9vdC10YWcobXlhdHRyKT10cnVlCisgKiAgcm9vdC10YWcuaW5uZXItdGFnPVRleHQKKyAqICByb290LXRhZy5pbm5lci10YWcoc29tZWF0dHIpPXZhbAorICogIHJvb3QtdGFnLmEyLmEzLmE0PWZhbHNlCisgKiAgcm9vdC10YWcueD14MSx4MgorICogPC9wcmU+CisgKgorICogPHA+VGhlIDxpPmNvbGxhcHNlQXR0cmlidXRlczwvaT4gcHJvcGVydHkgb2YgdGhpcyB0YXNrIGNhbiBiZSBzZXQKKyAqIHRvIHRydWUgKHRoZSBkZWZhdWx0IGlzIGZhbHNlKSB3aGljaCB3aWxsIGluc3RlYWQgcmVzdWx0IGluIHRoZQorICogZm9sbG93aW5nIHByb3BlcnRpZXMgKG5vdGUgdGhlIGRpZmZlcmVuY2UgaW4gbmFtZXMgb2YgcHJvcGVydGllcworICogY29ycmVzcG9uZGluZyB0byBYTUwgYXR0cmlidXRlcyk6PC9wPgorICoKKyAqIDxwcmU+CisgKiAgcm9vdC10YWcubXlhdHRyPXRydWUKKyAqICByb290LXRhZy5pbm5lci10YWc9VGV4dAorICogIHJvb3QtdGFnLmlubmVyLXRhZy5zb21lYXR0cj12YWwKKyAqICByb290LXRhZy5hMi5hMy5hND1mYWxzZQorICogIHJvb3QtdGFnLng9eDEseDIKKyAqIDwvcHJlPgorICoKKyAqIDxwPk9wdGlvbmFsbHksIHRvIG1vcmUgY2xvc2VseSBtaXJyb3IgdGhlIGFiaWxpdGllcyBvZiB0aGUgUHJvcGVydHkKKyAqIHRhc2ssIGEgc2VsZWN0ZWQgc2V0IG9mIGF0dHJpYnV0ZXMgY2FuIGJlIHRyZWF0ZWQgc3BlY2lhbGx5LiAgVG8KKyAqIGVuYWJsZSB0aGlzIGJlaGF2aW9yLCB0aGUgInNlbWFudGljQXR0cmlidXRlcyIgcHJvcGVydHkgb2YgdGhpcyB0YXNrCisgKiBtdXN0IGJlIHNldCB0byB0cnVlIChpdCBkZWZhdWx0cyB0byBmYWxzZSkuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcworICogc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgdGFrZSBvbiBzcGVjaWFsIG1lYW5pbmcKKyAqIChzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBpbXBsaWNpdGx5IHNldHMgY29sbGFwc2VBdHRyaWJ1dGVzIHRvIHRydWUgYXMKKyAqIHdlbGwpOjwvcD4KKyAqCisgKiA8dWw+CisgKiAgPGxpPjxiPnZhbHVlPC9iPjogSWRlbnRpZmllcyBhIHRleHQgdmFsdWUgZm9yIGEgcHJvcGVydHkuPC9saT4KKyAqICA8bGk+PGI+bG9jYXRpb248L2I+OiBJZGVudGlmaWVzIGEgZmlsZSBsb2NhdGlvbiBmb3IgYSBwcm9wZXJ0eS48L2xpPgorICogIDxsaT48Yj5pZDwvYj46IFNldHMgYW4gaWQgZm9yIGEgcHJvcGVydHk8L2xpPgorICogIDxsaT48Yj5yZWZpZDwvYj46IFNldHMgYSBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgb2YgYW5vdGhlciBwcm9wZXJ0eQorICogICAgICAgYmFzZWQgdXBvbiB0aGUgcHJvdmlkZWQgaWQ8L2xpPgorICogIDxsaT48Yj5wYXRoaWQ8L2I+OiBEZWZpbmVzIGEgcGF0aCByYXRoZXIgdGhhbiBhIHByb3BlcnR5IHdpdGgKKyAqICAgICAgIHRoZSBnaXZlbiBpZC48L2xpPgorICogPC91bD4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgd2l0aCBrZWVwUm9vdCA9IGZhbHNlLCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZmlsZTo8L3A+CisgKgorICogPHByZT4KKyAqICZsdDtyb290LXRhZyZndDsKKyAqICAgJmx0O2J1aWxkJmd0OworICogICAmbHQ7YnVpbGQgZm9sZGVyPSJidWlsZCImZ3Q7CisgKiAgICAgJmx0O2NsYXNzZXMgaWQ9ImJ1aWxkLmNsYXNzZXMiIGxvY2F0aW9uPSIke2J1aWxkLmZvbGRlcn0vY2xhc3NlcyIvJmd0OworICogICAgICZsdDtyZWZlcmVuY2UgcmVmaWQ9ImJ1aWxkLmNsYXNzZXMiLyZndDsKKyAqICAgJmx0Oy9idWlsZCZndDsKKyAqICAgJmx0O2NvbXBpbGUmZ3Q7CisgKiAgICAgJmx0O2NsYXNzcGF0aCBwYXRoaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIiZndDsKKyAqICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIvJmd0OworICogICAgICZsdDsvY2xhc3NwYXRoJmd0OworICogICAmbHQ7L2NvbXBpbGUmZ3Q7CisgKiAgICZsdDtydW4tdGltZSZndDsKKyAqICAgICAmbHQ7amFycyZndDsqLmphciZsdDsvamFycyZndDsKKyAqICAgICAmbHQ7Y2xhc3NwYXRoIHBhdGhpZD0icnVuLXRpbWUuY2xhc3NwYXRoIiZndDsKKyAqICAgICAgICZsdDtwYXRoIHJlZmlkPSJjb21waWxlLmNsYXNzcGF0aCIvJmd0OworICogICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7cnVuLXRpbWUuamFyc30iLyZndDsKKyAqICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAqICAgJmx0Oy9ydW4tdGltZSZndDsKKyAqICZsdDsvcm9vdC10YWcmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD5pcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgZW50cmllcyBpbiBhIGJ1aWxkIGZpbGU6PC9wPgorICoKKyAqIDxwcmU+CisgKiAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvJmd0OworICogJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIGxvY2F0aW9uPSIke2J1aWxkLmxvY2F0aW9ufS9jbGFzc2VzIi8mZ3Q7CisgKiAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQucmVmZXJlbmNlIiByZWZpZD0iYnVpbGQuY2xhc3NlcyIvJmd0OworICoKKyAqICZsdDtwcm9wZXJ0eSBuYW1lPSJydW4tdGltZS5qYXJzIiB2YWx1ZT0iKi5qYXIvJmd0OworICoKKyAqICZsdDtjbGFzc3BhdGggaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIiZndDsKKyAqICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXN9Ii8mZ3Q7CisgKiAmbHQ7L2NsYXNzcGF0aCZndDsKKyAqCisgKiAmbHQ7Y2xhc3NwYXRoIGlkPSJydW4tdGltZS5jbGFzc3BhdGgiJmd0OworICogICAmbHQ7cGF0aCByZWZpZD0iY29tcGlsZS5jbGFzc3BhdGgiLyZndDsKKyAqICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7cnVuLXRpbWUuamFyc30iLyZndDsKKyAqICZsdDsvY2xhc3NwYXRoJmd0OworICogPC9wcmU+CisgKgorICogPHA+IFRoaXMgdGFzayA8aT5yZXF1aXJlczwvaT4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqCisgKiA8dWw+CisgKiA8bGk+PGI+ZmlsZTwvYj46IFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvYWQuPC9saT4KKyAqIDwvdWw+CisgKgorICogPHA+VGhpcyB0YXNrIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKgorICogPHVsPgorICogPGxpPjxiPnByZWZpeDwvYj46IE9wdGlvbmFsbHkgc3BlY2lmeSBhIHByZWZpeCBhcHBsaWVkIHRvCisgKiAgICAgYWxsIHByb3BlcnRpZXMgbG9hZGVkLiAgRGVmYXVsdHMgdG8gYW4gZW1wdHkgc3RyaW5nLjwvbGk+CisgKiA8bGk+PGI+a2VlcFJvb3Q8L2I+OiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSByb290IHhtbCBlbGVtZW50CisgKiAgICAgaXMga2VwdCBhcyBwYXJ0IG9mIHByb3BlcnR5IG5hbWUuICBEZWZhdWx0cyB0byB0cnVlLjwvbGk+CisgKiA8bGk+PGI+dmFsaWRhdGU8L2I+OiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSB4bWwgZmlsZSBpcyB2YWxpZGF0ZWQuCisgKiAgICAgRGVmYXVsdHMgdG8gZmFsc2UuPC9saT4KKyAqIDxsaT48Yj5jb2xsYXBzZUF0dHJpYnV0ZXM8L2I+OiBJbmRpY2F0ZSB3aGV0aGVyIGF0dHJpYnV0ZXMgYXJlCisgKiAgICAgc3RvcmVkIGluIHByb3BlcnR5IG5hbWVzIHdpdGggcGFyZW5zIG9yIHdpdGggcGVyaW9kCisgKiAgICAgZGVsaW1pdGVycy4gIERlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIHByb3BlcnRpZXMKKyAqICAgICBhcmUgc3RvcmVkIHdpdGggcGFyZW5zIChpLmUuLCBmb28oYXR0cikpLjwvbGk+CisgKiA8bGk+PGI+c2VtYW50aWNBdHRyaWJ1dGVzPC9iPjogSW5kaWNhdGUgd2hldGhlciBhdHRyaWJ1dGVzCisgKiAgICAgbmFtZWQgImxvY2F0aW9uIiwgInZhbHVlIiwgInJlZmlkIiBhbmQgInBhdGgiCisgKiAgICAgYXJlIGludGVycHJldGVkIGFzIGFudCBwcm9wZXJ0aWVzLiAgRGVmYXVsdHMKKyAqICAgICB0byBmYWxzZS48L2xpPgorICogPGxpPjxiPnJvb3REaXJlY3Rvcnk8L2I+OiBJbmRpY2F0ZSB0aGUgZGlyZWN0b3J5IHRvIHVzZQorICogICAgIGFzIHRoZSByb290IGRpcmVjdG9yeSBmb3IgcmVzb2x2aW5nIGxvY2F0aW9uCisgKiAgICAgcHJvcGVydGllcy4gIERlZmF1bHRzIHRvIHRoZSBkaXJlY3RvcnkKKyAqICAgICBvZiB0aGUgcHJvamVjdCB1c2luZyB0aGUgdGFzay48L2xpPgorICogPGxpPjxiPmluY2x1ZGVTZW1hbnRpY0F0dHJpYnV0ZTwvYj46IEluZGljYXRlIHdoZXRoZXIgdG8gaW5jbHVkZQorICogICAgIHRoZSBzZW1hbnRpYyBhdHRyaWJ1dGUgKCJsb2NhdGlvbiIgb3IgInZhbHVlIikgYXMKKyAqICAgICBwYXJ0IG9mIHRoZSBwcm9wZXJ0eSBuYW1lLiAgRGVmYXVsdHMgdG8gZmFsc2UuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGFudC50YXNrIG5hbWU9InhtbHByb3BlcnR5IiBjYXRlZ29yeT0ieG1sIgorICovCitwdWJsaWMgY2xhc3MgWG1sUHJvcGVydHkgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrIHsKKworICAgIHByaXZhdGUgUmVzb3VyY2Ugc3JjOworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeCA9ICIiOworICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwUm9vdCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGNvbGxhcHNlQXR0cmlidXRlcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBzZW1hbnRpY0F0dHJpYnV0ZXMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZVNlbWFudGljQXR0cmlidXRlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBGaWxlIHJvb3REaXJlY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgSGFzaHRhYmxlIGFkZGVkQXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIFhNTENhdGFsb2cgeG1sQ2F0YWxvZyA9IG5ldyBYTUxDYXRhbG9nKCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVsaW1pdGVyID0gIiwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGX0lEID0gInJlZmlkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT04gPSAibG9jYXRpb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAicGF0aCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhJRCA9ICJwYXRoaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFUVFJJQlVURVMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgSUQsIFJFRl9JRCwgTE9DQVRJT04sIFZBTFVFLCBQQVRILCBQQVRISUQKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sUHJvcGVydHkoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIHRhc2suCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICBzdXBlci5pbml0KCk7CisgICAgICAgIHhtbENhdGFsb2cuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHhtbENhdGFsb2cgYXMgdGhlIGVudGl0eXJlc29sdmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKKyAgICAgICAgcmV0dXJuIHhtbENhdGFsb2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiByYWlzZWQgZHVyaW5nIHRhc2sgZXhlY3V0aW9uLgorICAgICAqIEB0b2RvIHZhbGlkYXRlIHRoZSBzb3VyY2UgZmlsZSBpcyB2YWxpZCBiZWZvcmUgb3BlbmluZywgcHJpbnQgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZQorICAgICAqIEB0b2RvIGFkZCBhIHZlcmJvc2UgbGV2ZWwgbG9nIG1lc3NhZ2UgbGlzdGluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWluZyBsb2FkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2UgciA9IGdldFJlc291cmNlKCk7CisKKyAgICAgICAgaWYgKHIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJYbWxQcm9wZXJ0eSB0YXNrIHJlcXVpcmVzIGEgc291cmNlIHJlc291cmNlIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZygiTG9hZGluZyAiICsgc3JjLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgaWYgKHIuaXNFeGlzdHMoKSkgeworCisgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHZhbGlkYXRlKTsKKyAgICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7CisgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgICAgYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihnZXRFbnRpdHlSZXNvbHZlcigpKTsKKyAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOworICAgICAgICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRmlsZVJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoKChGaWxlUmVzb3VyY2UpIHNyYykuZ2V0RmlsZSgpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShzcmMuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgRWxlbWVudCB0b3BFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgLy8gS2VlcCBhIGhhc2h0YWJsZSBvZiBhdHRyaWJ1dGVzIGFkZGVkIGJ5IHRoaXMgdGFzay4KKyAgICAgICAgICAgICAgLy8gVGhpcyB0YXNrIGlzIGFsbG93IHRvIG92ZXJyaWRlIGl0cyBvd24gcHJvcGVydGllcworICAgICAgICAgICAgICAvLyBidXQgbm90IG90aGVyIHByb3BlcnRpZXMuICBTbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sKKyAgICAgICAgICAgICAgLy8gb2Ygd2hpY2ggcHJvcGVydGllcyB3ZSd2ZSBhZGRlZC4KKyAgICAgICAgICAgICAgYWRkZWRBdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgICAgICAgIGlmIChrZWVwUm9vdCkgeworICAgICAgICAgICAgICAgICAgYWRkTm9kZVJlY3Vyc2l2ZWx5KHRvcEVsZW1lbnQsIHByZWZpeCwgbnVsbCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBOb2RlTGlzdCB0b3BDaGlsZHJlbiA9IHRvcEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgICAgaW50IG51bUNoaWxkcmVuID0gdG9wQ2hpbGRyZW4uZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkTm9kZVJlY3Vyc2l2ZWx5KHRvcENoaWxkcmVuLml0ZW0oaSksIHByZWZpeCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gZmluZCBwcm9wZXJ0eSByZXNvdXJjZTogIiArIHIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzeGUpIHsKKyAgICAgICAgICAgIC8vIEVycm9yIGdlbmVyYXRlZCBkdXJpbmcgcGFyc2luZworICAgICAgICAgICAgRXhjZXB0aW9uIHggPSBzeGU7CisgICAgICAgICAgICBpZiAoc3hlLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ID0gc3hlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCAiICsgc3JjLCB4KTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKKyAgICAgICAgICAgIC8vIFBhcnNlciB3aXRoIHNwZWNpZmllZCBvcHRpb25zIGNhbid0IGJlIGJ1aWx0CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocGNlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAvLyBJL08gZXJyb3IKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIGxvYWQgIiArIHNyYywgaW9lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJdGVyYXRlIHRocm91Z2ggYWxsIG5vZGVzIGluIHRoZSB0cmVlLiAqLworICAgIHByaXZhdGUgdm9pZCBhZGROb2RlUmVjdXJzaXZlbHkoTm9kZSBub2RlLCBTdHJpbmcgcHJlZml4LCBPYmplY3QgY29udGFpbmVyKSB7CisgICAgICAgIC8vIFNldCB0aGUgcHJlZml4IGZvciB0aGlzIG5vZGUgdG8gaW5jbHVkZSBpdHMgdGFnIG5hbWUuCisgICAgICAgIFN0cmluZyBub2RlUHJlZml4ID0gcHJlZml4OworICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7CisgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBub2RlUHJlZml4ICs9ICIuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVQcmVmaXggKz0gbm9kZS5nZXROb2RlTmFtZSgpOworICAgICAgICB9CisgICAgICAgIC8vIFBhc3MgdGhlIGNvbnRhaW5lciB0byB0aGUgcHJvY2Vzc2luZyBvZiB0aGlzIG5vZGUsCisgICAgICAgIE9iamVjdCBub2RlT2JqZWN0ID0gcHJvY2Vzc05vZGUobm9kZSwgbm9kZVByZWZpeCwgY29udGFpbmVyKTsKKworICAgICAgICAvLyBub3csIGl0ZXJhdGUgdGhyb3VnaCBjaGlsZHJlbi4KKyAgICAgICAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7CisgICAgICAgICAgICBOb2RlTGlzdCBub2RlQ2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgIGludCBudW1DaGlsZHJlbiA9IG5vZGVDaGlsZHJlbi5nZXRMZW5ndGgoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggY2hpbGQsIHBhc3MgdGhlIG9iamVjdCBhZGRlZCBieQorICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NOb2RlIHRvIGl0cyBjaGlsZHJlbiAtLSBpbiBvdGhlciB3b3JkLCBlYWNoCisgICAgICAgICAgICAgICAgLy8gb2JqZWN0IGNhbiBwYXNzIGluZm9ybWF0aW9uIGFsb25nIHRvIGl0cyBjaGlsZHJlbi4KKyAgICAgICAgICAgICAgICBhZGROb2RlUmVjdXJzaXZlbHkobm9kZUNoaWxkcmVuLml0ZW0oaSksIG5vZGVQcmVmaXgsIG5vZGVPYmplY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhZGROb2RlUmVjdXJzaXZlbHkob3JnLnczYy5kb20uTm9kZSBub2RlLCBTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIGFkZE5vZGVSZWN1cnNpdmVseShub2RlLCBwcmVmaXgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIG5vZGUsIGFkZGluZyBhbnkgcmVxdWlyZWQgYXR0cmlidXRlcyBmcm9tCisgICAgICogdGhpcyBjaGlsZCBub2RlIGFsb25lIC0tIGJ1dCA8ZW0+bm90PC9lbT4gcHJvY2Vzc2luZyBhbnkKKyAgICAgKiBjaGlsZHJlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub2RlIHRoZSBYTUwgTm9kZSB0byBwYXJzZQorICAgICAqIEBwYXJhbSBwcmVmaXggQSBzdHJpbmcgdG8gcHJlcGVuZCB0byBhbnkgcHJvcGVydGllcyB0aGF0IGdldAorICAgICAqIGFkZGVkIGJ5IHRoaXMgbm9kZS4KKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIE9wdGlvbmFsbHksIGFuIG9iamVjdCB0aGF0IGEgcGFyZW50IG5vZGUKKyAgICAgKiBnZW5lcmF0ZWQgdGhhdCB0aGlzIG5vZGUgbWlnaHQgYmVsb25nIHRvLiAgRm9yIGV4YW1wbGUsIHRoaXMKKyAgICAgKiBub2RlIGNvdWxkIGJlIHdpdGhpbiBhIG5vZGUgdGhhdCBnZW5lcmF0ZWQgYSBQYXRoLgorICAgICAqIEByZXR1cm4gdGhlIE9iamVjdCBjcmVhdGVkIGJ5IHRoaXMgbm9kZS4gIEdlbmVyYWxseSwgdGhpcyBpcworICAgICAqIGVpdGhlciBhIFN0cmluZyBpZiB0aGlzIG5vZGUgcmVzdWx0ZWQgaW4gc2V0dGluZyBhbiBhdHRyaWJ1dGUsCisgICAgICogb3IgYSBQYXRoLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcHJvY2Vzc05vZGUgKE5vZGUgbm9kZSwgU3RyaW5nIHByZWZpeCwgT2JqZWN0IGNvbnRhaW5lcikgeworCisgICAgICAgIC8vIFBhcnNlIHRoZSBhdHRyaWJ1dGUocykgYW5kIHRleHQgb2YgdGhpcyBub2RlLCBhZGRpbmcKKyAgICAgICAgLy8gcHJvcGVydGllcyBmb3IgZWFjaC4KKyAgICAgICAgLy8gaWYgdGhlICJwYXRoIiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGVuIHJldHVybiB0aGUgY3JlYXRlZCBwYXRoCisgICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUuCisgICAgICAgIE9iamVjdCBhZGRlZFBhdGggPSBudWxsOworCisgICAgICAgIC8vIFRoZSB2YWx1ZSBvZiBhbiBpZCBhdHRyaWJ1dGUgb2YgdGhpcyBub2RlLgorICAgICAgICBTdHJpbmcgaWQgPSBudWxsOworCisgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkgeworCisgICAgICAgICAgICBOYW1lZE5vZGVNYXAgbm9kZUF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKKworICAgICAgICAgICAgLy8gSXMgdGhlcmUgYW4gaWQgYXR0cmlidXRlPworICAgICAgICAgICAgTm9kZSBpZE5vZGUgPSBub2RlQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oSUQpOworICAgICAgICAgICAgaWQgPSBzZW1hbnRpY0F0dHJpYnV0ZXMgJiYgaWROb2RlICE9IG51bGwgPyBpZE5vZGUuZ2V0Tm9kZVZhbHVlKCkgOiBudWxsOworCisgICAgICAgICAgICAvLyBOb3csIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXR0cmlidXRlcyBhZGRpbmcgdGhlbS4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworCisgICAgICAgICAgICAgICAgTm9kZSBhdHRyaWJ1dGVOb2RlID0gbm9kZUF0dHJpYnV0ZXMuaXRlbShpKTsKKworICAgICAgICAgICAgICAgIGlmICghc2VtYW50aWNBdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gZ2V0QXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5KHByZWZpeCArIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVOb2RlLmdldE5vZGVOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZU5vZGUpOworCisgICAgICAgICAgICAgICAgICAgIFBhdGggY29udGFpbmluZ1BhdGggPQorICAgICAgICAgICAgICAgICAgICAgICAgKChjb250YWluZXIgIT0gbnVsbCkgJiYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFBhdGgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPyAoUGF0aCkgY29udGFpbmVyCisgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFRoZSBtYWluIGNvbmRpdGlvbmFsIGxvZ2ljIC0tIGlmIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICogaXMgc29tZWhvdyAic3BlY2lhbCIgKGkuZS4sIGl0IGhhcyBrbm93bgorICAgICAgICAgICAgICAgICAgICAgKiBzZW1hbnRpYyBtZWFuaW5nKSB0aGVuIGRlYWwgd2l0aCBpdAorICAgICAgICAgICAgICAgICAgICAgKiBhcHByb3ByaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lLmVxdWFscyhJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElEIGhhcyBhbHJlYWR5IGJlZW4gZm91bmQgYWJvdmUuCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmluZ1BhdGggIT0gbnVsbCAmJiBub2RlTmFtZS5lcXVhbHMoUEFUSCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgInBhdGgiIGF0dHJpYnV0ZSBmb3IgYSBub2RlIHdpdGhpbiBhIFBhdGggb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ1BhdGguc2V0UGF0aChhdHRyaWJ1dGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUGF0aCAmJiBub2RlTmFtZS5lcXVhbHMoUkVGX0lEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSAicmVmaWQiIGF0dHJpYnV0ZSBmb3IgYSBub2RlIHdpdGhpbiBhIFBhdGggb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ1BhdGguc2V0UGF0aChhdHRyaWJ1dGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUGF0aCAmJiBub2RlTmFtZS5lcXVhbHMoTE9DQVRJT04pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBICJsb2NhdGlvbiIgYXR0cmlidXRlIGZvciBhIG5vZGUgd2l0aGluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdGggb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ1BhdGguc2V0TG9jYXRpb24ocmVzb2x2ZUZpbGUoYXR0cmlidXRlVmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoUEFUSElEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBub2RlIGlkZW50aWZ5aW5nIGEgbmV3IHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWG1sUHJvcGVydHkgZG9lcyBub3Qgc3VwcG9ydCBuZXN0ZWQgcGF0aHMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkUGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKGF0dHJpYnV0ZVZhbHVlLCBhZGRlZFBhdGgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW4gYXJiaXRyYXJ5IGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gZ2V0QXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5KHByZWZpeCArIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlLCBpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG5vZGVUZXh0ID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBlbXB0eU5vZGUgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzZW1hbnRpY0VtcHR5T3ZlcnJpZGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERQorICAgICAgICAgICAgICAgICYmIHNlbWFudGljQXR0cmlidXRlcworICAgICAgICAgICAgICAgICYmIG5vZGUuaGFzQXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgJiYgKG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShWQUxVRSkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKExPQ0FUSU9OKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oUkVGX0lEKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oUEFUSCkgIT0gbnVsbCB8fCBub2RlLmdldEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWVkSXRlbShQQVRISUQpICE9IG51bGwpKSB7CisgICAgICAgICAgICBzZW1hbnRpY0VtcHR5T3ZlcnJpZGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKKyAgICAgICAgICAgIC8vIEZvciB0aGUgdGV4dCBub2RlLCBhZGQgYSBwcm9wZXJ0eS4KKyAgICAgICAgICAgIG5vZGVUZXh0ID0gZ2V0QXR0cmlidXRlVmFsdWUobm9kZSk7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFCisgICAgICAgICAgICAgICAgJiYgbm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMQorICAgICAgICAgICAgICAgICYmIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpIHsKKworICAgICAgICAgICAgbm9kZVRleHQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICAgIGlmICgiIi5lcXVhbHMobm9kZVRleHQpICYmICFzZW1hbnRpY0VtcHR5T3ZlcnJpZGUpIHsKKyAgICAgICAgICAgICAgICBlbXB0eU5vZGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERQorICAgICAgICAgICAgICAgJiYgbm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMAorICAgICAgICAgICAgICAgJiYgIXNlbWFudGljRW1wdHlPdmVycmlkZSkgeworICAgICAgICAgICAgbm9kZVRleHQgPSAiIjsKKyAgICAgICAgICAgIGVtcHR5Tm9kZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFCisgICAgICAgICAgICAgICAmJiBub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAxCisgICAgICAgICAgICAgICAmJiBub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFCisgICAgICAgICAgICAgICAmJiAiIi5lcXVhbHMobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpCisgICAgICAgICAgICAgICAmJiAhc2VtYW50aWNFbXB0eU92ZXJyaWRlKSB7CisgICAgICAgICAgICBub2RlVGV4dCA9ICIiOworICAgICAgICAgICAgZW1wdHlOb2RlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZVRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5pbmcgb2JqZWN0IHdhcyBhIFN0cmluZywgdGhlbiB1c2UgaXQgYXMgdGhlIElELgorICAgICAgICAgICAgaWYgKHNlbWFudGljQXR0cmlidXRlcyAmJiBpZCA9PSBudWxsICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIGlkID0gKFN0cmluZykgY29udGFpbmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vZGVUZXh0LnRyaW0oKS5sZW5ndGgoKSAhPSAwIHx8IGVtcHR5Tm9kZSkgeworICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5KHByZWZpeCwgbm9kZVRleHQsIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBSZXR1cm4gdGhlIFBhdGggd2UgYWRkZWQgb3IgdGhlIElEIG9mIHRoaXMgbm9kZSBmb3IKKyAgICAgICAgLy8gY2hpbGRyZW4gdG8gcmVmZXJlbmNlIGlmIG5lZWRlZC4gIFBhdGggb2JqZWN0cyBhcmUKKyAgICAgICAgLy8gZGVmaW5pdGVseSB1c2VkIGJ5IGNoaWxkIHBhdGggZWxlbWVudHMsIGFuZCBJRCBtYXkgYmUgdXNlZAorICAgICAgICAvLyBmb3IgYSBjaGlsZCB0ZXh0IG5vZGUuCisgICAgICAgIHJldHVybiAoYWRkZWRQYXRoICE9IG51bGwgPyBhZGRlZFBhdGggOiBpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWN0dWFsbHkgYWRkIHRoZSBnaXZlbiBwcm9wZXJ0eS92YWx1ZSB0byB0aGUgcHJvamVjdAorICAgICAqIGFmdGVyIHdyaXRpbmcgYSBsb2cgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHkgKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBpZCkgeworICAgICAgICBTdHJpbmcgbXNnID0gbmFtZSArICI6IiArIHZhbHVlOworICAgICAgICBpZiAoaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbXNnICs9ICgiKGlkPSIgKyBpZCArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfREVCVUcpOworCisgICAgICAgIGlmIChhZGRlZEF0dHJpYnV0ZXMuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgYXR0cmlidXRlIHdhcyBhZGRlZCBieSB0aGlzIHRhc2ssIHRoZW4KKyAgICAgICAgICAgIC8vIHdlIGFwcGVuZCB0aGlzIHZhbHVlIHRvIHRoZSBleGlzdGluZyB2YWx1ZS4KKyAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgc2V0UHJvcGVydHkgbWV0aG9kIHdoaWNoIHdpbGwKKyAgICAgICAgICAgIC8vIGZvcmNpYmx5IG92ZXJyaWRlIHRoZSBwcm9wZXJ0eSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcHV0IHRoZXNlIHByb3BlcnRpZXMgaW50byB0aGUgcHJvamVjdAorICAgICAgICAgICAgLy8gd2hlbiB3ZSByZWFkIHRoZW0sIHRob3VnaCAoaW5zdGVhZCBvZiBrZWVwaW5nIHRoZW0KKyAgICAgICAgICAgIC8vIG91dHNpZGUgb2YgdGhlIHByb2plY3QgYW5kIGJhdGNoIGFkZGluZyB0aGVtIGF0IHRoZSBlbmQpCisgICAgICAgICAgICAvLyB0byBhbGxvdyBvdGhlciBwcm9wZXJ0aWVzIHRvIHJlZmVyZW5jZSB0aGVtLgorICAgICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBhZGRlZEF0dHJpYnV0ZXMuZ2V0KG5hbWUpICsgZ2V0RGVsaW1pdGVyKCkgKyB2YWx1ZTsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICBhZGRlZEF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkobmFtZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIGFkZGVkQXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJPdmVycmlkZSBpZ25vcmVkIGZvciBwcm9wZXJ0eSAiICsgbmFtZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5hZGRSZWZlcmVuY2UoaWQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHJlYXNvbmFibGUgYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBnaXZlbiBub2RlLgorICAgICAqIElmIHdlIGFyZSB1c2luZyBzZW1hbnRpYyBhdHRyaWJ1dGVzIG9yIGNvbGxhcHNpbmcKKyAgICAgKiBhdHRyaWJ1dGVzLCB0aGUgcmV0dXJuZWQgbmFtZSBpcyAiLm5vZGVuYW1lIi4KKyAgICAgKiBPdGhlcndpc2UsIHdlIHJldHVybiAiKG5vZGVuYW1lKSIuICBUaGlzIGlzIGxvbmctc3RhbmRpbmcKKyAgICAgKiAoYW5kIGRlZmF1bHQpICZsdDt4bWxwcm9wZXJ0eSZndDsgYmVoYXZpb3IuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSAoTm9kZSBhdHRyaWJ1dGVOb2RlKSB7CisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTm9kZS5nZXROb2RlTmFtZSgpOworCisgICAgICAgIGlmIChzZW1hbnRpY0F0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIC8vIE5ldmVyIGluY2x1ZGUgdGhlICJyZWZpZCIgYXR0cmlidXRlIGFzIHBhcnQgb2YgdGhlCisgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhSRUZfSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gaXQgYXBwZW5kZWQgdW5sZXNzIHByb3BlcnR5IHRvIGhpZGUgaXQgaXMgc2V0LgorICAgICAgICAgICAgaWYgKCFpc1NlbWFudGljQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHx8IGluY2x1ZGVTZW1hbnRpY0F0dHJpYnV0ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiLiIgKyBhdHRyaWJ1dGVOYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2xsYXBzZUF0dHJpYnV0ZXMgPyAiLiIgKyBhdHRyaWJ1dGVOYW1lIDogIigiICsgYXR0cmlidXRlTmFtZSArICIpIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvdmlkZWQgYXR0cmlidXRlIG5hbWUgaXMgcmVjb2duaXplZCBvciBub3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NlbWFudGljQXR0cmlidXRlIChTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFUVFJJQlVURVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhBVFRSSUJVVEVTW2ldKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLgorICAgICAqIElmIHdlIGFyZSBub3QgdXNpbmcgc2VtYW50aWMgYXR0cmlidXRlcywgaXRzIGp1c3QgdGhlCisgICAgICogbGl0ZXJhbCBzdHJpbmcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIDxwPklmIHdlIDxlbT5hcmU8L2VtPiB1c2luZyBzZW1hbnRpYyBhdHRyaWJ1dGVzLCB0aGVuIGZpcnN0CisgICAgICogZGVwZW5kZW50IHByb3BlcnRpZXMgYXJlIHJlc29sdmVkIChpLmUuLCAke2Zvb30gaXMgcmVzb2x2ZWQKKyAgICAgKiBiYXNlZCBvbiB0aGUgZm9vIHByb3BlcnR5IHZhbHVlKSwgYW5kIHRoZW4gYW4gYXBwcm9wcmlhdGUgZGF0YQorICAgICAqIHR5cGUgaXMgdXNlZC4gIEluIHBhcnRpY3VsYXIsIGxvY2F0aW9uLWJhc2VkIHByb3BlcnRpZXMgYXJlCisgICAgICogcmVzb2x2ZWQgdG8gYWJzb2x1dGUgZmlsZSBuYW1lcy4gIEFsc28gZm9yIHJlZmlkIHZhbHVlcywgbG9vaworICAgICAqIHVwIHRoZSByZWZlcmVuY2VkIG9iamVjdCBmcm9tIHRoZSBwcm9qZWN0LjwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZSAoTm9kZSBhdHRyaWJ1dGVOb2RlKSB7CisgICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBhdHRyaWJ1dGVOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKKyAgICAgICAgaWYgKHNlbWFudGljQXR0cmlidXRlcykgeworICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOb2RlLmdldE5vZGVOYW1lKCk7CisgICAgICAgICAgICBub2RlVmFsdWUgPSBnZXRQcm9qZWN0KCkucmVwbGFjZVByb3BlcnRpZXMobm9kZVZhbHVlKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhMT0NBVElPTikpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSByZXNvbHZlRmlsZShub2RlVmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBmLmdldFBhdGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhSRUZfSUQpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHJlZiA9IGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2Uobm9kZVZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZi50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9kZVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBYTUwgZmlsZSB0byBwYXJzZTsgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHNyYyB0aGUgZmlsZSB0byBwYXJzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoRmlsZSBzcmMpIHsKKyAgICAgICAgc2V0U3JjUmVzb3VyY2UobmV3IEZpbGVSZXNvdXJjZShzcmMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgdG8gcGFjazsgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHNyYyByZXNvdXJjZSB0byBleHBhbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmNSZXNvdXJjZShSZXNvdXJjZSBzcmMpIHsKKyAgICAgICAgaWYgKHNyYy5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSBzb3VyY2UgY2FuJ3QgYmUgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRmlsZVJlc291cmNlICYmICFzdXBwb3J0c05vbkZpbGVSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IEZpbGVTeXN0ZW0gcmVzb3VyY2VzIGFyZSBzdXBwb3J0ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zcmMgPSBzcmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2UgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIGEgdGhlIHJlc291cmNlIHRvIHBhY2sgYXMgYSBzaW5nbGUgZWxlbWVudCBSZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWQoUmVzb3VyY2VDb2xsZWN0aW9uIGEpIHsKKyAgICAgICAgaWYgKGEuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIm9ubHkgc2luZ2xlIGFyZ3VtZW50IHJlc291cmNlIGNvbGxlY3Rpb25zIGFyZSBzdXBwb3J0ZWQgYXMgYXJjaGl2ZXMiKTsKKyAgICAgICAgfQorICAgICAgICBzZXRTcmNSZXNvdXJjZSgoUmVzb3VyY2UpIGEuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoZSBwcmVmaXggdG8gcHJlcGVuZCB0byBlYWNoIHByb3BlcnR5CisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IHRvIHByZXBlbmQgdG8gZWFjaCBwcm9wZXJ0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4LnRyaW0oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmbGFnIHRvIGluY2x1ZGUgdGhlIHhtbCByb290IHRhZyBhcyBhCisgICAgICogZmlyc3QgdmFsdWUgaW4gdGhlIHByb3BlcnR5IG5hbWU7IG9wdGlvbmFsLAorICAgICAqIGRlZmF1bHQgaXMgdHJ1ZQorICAgICAqIEBwYXJhbSBrZWVwUm9vdCBpZiB0cnVlIChkZWZhdWx0KSwgaW5jbHVkZSB0aGUgeG1sIHJvb3QgdGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2VlcHJvb3QoYm9vbGVhbiBrZWVwUm9vdCkgeworICAgICAgICB0aGlzLmtlZXBSb290ID0ga2VlcFJvb3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmxhZyB0byB2YWxpZGF0ZSB0aGUgWE1MIGZpbGU7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCisgICAgICogQHBhcmFtIHZhbGlkYXRlIGlmIHRydWUgdmFsaWRhdGUgdGhlIFhNTCBmaWxlLCBkZWZhdWx0IGZhbHNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiB2YWxpZGF0ZSkgeworICAgICAgICB0aGlzLnZhbGlkYXRlID0gdmFsaWRhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmxhZyB0byB0cmVhdCBhdHRyaWJ1dGVzIGFzIG5lc3RlZCBlbGVtZW50czsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQorICAgICAqIEBwYXJhbSBjb2xsYXBzZUF0dHJpYnV0ZXMgaWYgdHJ1ZSB0cmVhdCBhdHRyaWJ1dGVzIGFzIG5lc3RlZCBlbGVtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbGxhcHNlQXR0cmlidXRlcyhib29sZWFuIGNvbGxhcHNlQXR0cmlidXRlcykgeworICAgICAgICB0aGlzLmNvbGxhcHNlQXR0cmlidXRlcyA9IGNvbGxhcHNlQXR0cmlidXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgdG8gZW5hYmxlIHNwZWNpYWwgaGFuZGxpbmcgb2YgYXR0cmlidXRlcyAtIHNlZSBhbnQgbWFudWFsLgorICAgICAqIEBwYXJhbSBzZW1hbnRpY0F0dHJpYnV0ZXMgaWYgdHJ1ZSBlbmFibGUgdGhlIHNwZWNpYWwgaGFuZGxpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VtYW50aWNBdHRyaWJ1dGVzKGJvb2xlYW4gc2VtYW50aWNBdHRyaWJ1dGVzKSB7CisgICAgICAgIHRoaXMuc2VtYW50aWNBdHRyaWJ1dGVzID0gc2VtYW50aWNBdHRyaWJ1dGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgdG8gdXNlIGZvciByZXNvbHZpbmcgZmlsZSByZWZlcmVuY2VzLgorICAgICAqIElnbm9yZWQgaWYgc2VtYW50aWNBdHRyaWJ1dGVzIGlzIG5vdCBzZXQgdG8gdHJ1ZS4KKyAgICAgKiBAcGFyYW0gcm9vdERpcmVjdG9yeSB0aGUgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvb3REaXJlY3RvcnkoRmlsZSByb290RGlyZWN0b3J5KSB7CisgICAgICAgIHRoaXMucm9vdERpcmVjdG9yeSA9IHJvb3REaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jbHVkZSB0aGUgc2VtYW50aWMgYXR0cmlidXRlIG5hbWUgYXMgcGFydCBvZiB0aGUgcHJvcGVydHkgbmFtZS4KKyAgICAgKiBJZ25vcmVkIGlmIHNlbWFudGljQXR0cmlidXRlcyBpcyBub3Qgc2V0IHRvIHRydWUuCisgICAgICogQHBhcmFtIGluY2x1ZGVTZW1hbnRpY0F0dHJpYnV0ZSBpZiB0cnVlIGluY2x1ZGUgdGhlIHNlbWF0aWMgYXR0cmlidXRlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVTZW1hbnRpY0F0dHJpYnV0ZShib29sZWFuIGluY2x1ZGVTZW1hbnRpY0F0dHJpYnV0ZSkgeworICAgICAgICB0aGlzLmluY2x1ZGVTZW1hbnRpY0F0dHJpYnV0ZSA9IGluY2x1ZGVTZW1hbnRpY0F0dHJpYnV0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW4gWE1MQ2F0YWxvZyBhcyBhIG5lc3RlZCBlbGVtZW50OyBvcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gY2F0YWxvZyB0aGUgWE1MQ2F0YWxvZyB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkWE1MQ2F0YWxvZyhYTUxDYXRhbG9nIGNhdGFsb2cpIHsKKyAgICAgICAgeG1sQ2F0YWxvZy5hZGRDb25maWd1cmVkWE1MQ2F0YWxvZyhjYXRhbG9nKTsKKyAgICB9CisKKyAgICAvKiBFeHBvc2UgbWVtYmVycyBmb3IgZXh0ZW5zaWJpbGl0eSAqLworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZmlsZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZSAoKSB7CisgICAgICAgIHJldHVybiBzcmMgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UgPyAoKEZpbGVSZXNvdXJjZSkgc3JjKS5nZXRGaWxlKCkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKKyAgICAgICAgLy8gZGVsZWdhdGUgdGhpcyB3YXkgYXJvdW5kIHRvIHN1cHBvcnQgc3ViY2xhc3NlcyB0aGF0CisgICAgICAgIC8vIG92ZXJ3cml0ZSBnZXRGaWxlCisgICAgICAgIEZpbGUgZiA9IGdldEZpbGUoKTsKKyAgICAgICAgcmV0dXJuIGYgPT0gbnVsbCA/IHNyYyA6IHNyYyBpbnN0YW5jZW9mIEZpbGVSZXNvdXJjZQorICAgICAgICAgICAgICAgICYmICgoRmlsZVJlc291cmNlKSBzcmMpLmdldEZpbGUoKS5lcXVhbHMoZikgPyBzcmMgOiBuZXcgRmlsZVJlc291cmNlKGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHByZWZpeCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmaXggKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUga2VlcHJvb3QgYXR0cmlidXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGdldEtlZXByb290ICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMua2VlcFJvb3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdmFsaWRhdGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbGlkYXRlICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY29sbGFwc2UgYXR0cmlidXRlcyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Q29sbGFwc2VBdHRyaWJ1dGVzICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2VBdHRyaWJ1dGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHNlbWFudGljIGF0dHJpYnV0ZXMgYXR0cmlidXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGdldFNlbWFudGljQXR0cmlidXRlcyAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNlbWFudGljQXR0cmlidXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSByb290IGRpcmVjdG9yeSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0Um9vdERpcmVjdG9yeSAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJvb3REaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgaW5jbHVkZSBzZW1hbnRpYyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0SW5jbHVkZVNlbWVudGljQXR0cmlidXRlICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZVNlbWFudGljQXR0cmlidXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIExldCBwcm9qZWN0IHJlc29sdmUgdGhlIGZpbGUgLSBvciBkbyBpdCBvdXJzZWx2ZXMgaWYKKyAgICAgKiByb290RGlyZWN0b3J5IGhhcyBiZWVuIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgcmVzb2x2ZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIHJldHVybiBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKHJvb3REaXJlY3RvcnkgPT0gbnVsbCA/IGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkKKyAgICAgICAgICAgICAgICA6IHJvb3REaXJlY3RvcnksIGZpbGVOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdGFzayBjYW4gZGVhbCB3aXRoIG5vbi1maWxlIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIG9ubHkgaWYgdGhpcyB0YXNrIGlzCisgICAgICogJmx0O3htbHByb3BlcnR5Jmd0Oy4gIEFueSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzIHRoYXQgYWxzbyB3YW50cyB0bworICAgICAqIHN1cHBvcnQgbm9uLWZpbGUgcmVzb3VyY2VzIG5lZWRzIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiAgV2UKKyAgICAgKiBuZWVkIHRvIGRvIHNvIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zIHNpbmNlIHdlCisgICAgICogY2FuJ3QgZXhwZWN0IHN1YmNsYXNzZXMgdG8gc3VwcG9ydCByZXNvdXJjZXMuPC9wPgorICAgICAqIEByZXR1cm4gdHJ1ZSBmb3IgdGhpcyB0YXNrLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5lcXVhbHMoWG1sUHJvcGVydHkuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBkZWxpbWl0ZXIuCisgICAgICogQHJldHVybiBkZWxpbWl0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlbGltaXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGRlbGltaXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbmV3IGRlbGltaXRlci4KKyAgICAgKiBAcGFyYW0gZGVsaW1pdGVyIG5ldyB2YWx1ZQorICAgICAqIEBzaW5jZSBBbnQgMS43LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgeworICAgICAgICB0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9aaXAuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ppcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDQ5MzIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9aaXAuamF2YQpAQCAtMCwwICsxLDE3NTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkZpbGVTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQXJjaGl2ZUZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuQXJjaGl2ZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkdsb2JQYXR0ZXJuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSWRlbnRpdHlNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5NZXJnaW5nTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVzb3VyY2VVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBFeHRyYUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuWmlwT3V0cHV0U3RyZWFtOworCisvKioKKyAqIENyZWF0ZSBhIFppcCBmaWxlLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgKi8KK3B1YmxpYyBjbGFzcyBaaXAgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDggKiAxMDI0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1VORFVQX01JTExJUyA9IDE5OTk7IC8vIDIgc2Vjb25kcyAtIDEKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgcHJvdGVjdGVkIEZpbGUgemlwRmlsZTsKKyAgICAvLyB1c2UgdG8gc2NhbiBvd24gYXJjaGl2ZQorICAgIHByaXZhdGUgWmlwU2Nhbm5lciB6czsKKyAgICBwcml2YXRlIEZpbGUgYmFzZURpcjsKKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGVudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgZ3JvdXBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvciBmaWxlc2V0c0Zyb21Hcm91cGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByb3RlY3RlZCBTdHJpbmcgZHVwbGljYXRlID0gImFkZCI7CisgICAgcHJpdmF0ZSBib29sZWFuIGRvQ29tcHJlc3MgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBkb1VwZGF0ZSA9IGZhbHNlOworICAgIC8vIHNoYWRvdyBvZiB0aGUgYWJvdmUgaWYgdGhlIHZhbHVlIGlzIGFsdGVyZWQgaW4gZXhlY3V0ZQorICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlZERvVXBkYXRlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGRvRmlsZXNvbmx5ID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhcmNoaXZlVHlwZSA9ICJ6aXAiOworCisgICAgLy8gRm9yIGRpcmVjdG9yaWVzOgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU1QVFlfQ1JDID0gbmV3IENSQzMyICgpLmdldFZhbHVlICgpOworICAgIHByb3RlY3RlZCBTdHJpbmcgZW1wdHlCZWhhdmlvciA9ICJza2lwIjsKKyAgICBwcml2YXRlIFZlY3RvciByZXNvdXJjZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBhZGRlZERpcnMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgYWRkZWRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIHByb3RlY3RlZCBib29sZWFuIGRvdWJsZUZpbGVQYXNzID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcFdyaXRpbmcgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8vIFRoaXMgYm9vbGVhbiBpcyBzZXQgaWYgdGhlIHRhc2sgZGV0ZWN0cyB0aGF0IHRoZQorICAgIC8vIHRhcmdldCBpcyBvdXRvZmRhdGUgYW5kIGhhcyB3cml0dGVuIHRvIHRoZSB0YXJnZXQgZmlsZS4KKyAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlZEZpbGUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIHRydWUgd2hlbiB3ZSBhcmUgYWRkaW5nIG5ldyBmaWxlcyBpbnRvIHRoZSBaaXAgZmlsZSwgYXMgb3Bwb3NlZAorICAgICAqIHRvIGFkZGluZyBiYWNrIHRoZSB1bmNoYW5nZWQgZmlsZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYWRkaW5nTmV3RmlsZXMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzLCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncworICAgICAqIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBvcmlnaW5hbCBjb21wcmVzc2lvbiBvZiBlbnRyaWVzIGNvbWluZyBmcm9tIGEgWklQCisgICAgICogYXJjaGl2ZSBzaG91bGQgYmUga2VwdCAoZm9yIGV4YW1wbGUgd2hlbiB1cGRhdGluZyBhbiBhcmNoaXZlKS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBDb21wcmVzc2lvbiA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2lsbCBiZSByb3VuZGVkIHVwIHRvIHRoZQorICAgICAqIG5leHQgZXZlbiBudW1iZXIgb2Ygc2Vjb25kcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcm91bmRVcCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBDb21tZW50IGZvciB0aGUgYXJjaGl2ZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudCA9ICIiOworCisgICAgcHJpdmF0ZSBpbnQgbGV2ZWwgPSBaaXBPdXRwdXRTdHJlYW0uREVGQVVMVF9DT01QUkVTU0lPTjsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIG5hbWUvbG9jYXRpb24gb2Ygd2hlcmUgdG8KKyAgICAgKiBjcmVhdGUgdGhlIC56aXAgZmlsZS4KKyAgICAgKiBAcGFyYW0gemlwRmlsZSB0aGUgcGF0aCBvZiB0aGUgemlwRmlsZQorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFVzZSBzZXREZXN0RmlsZShGaWxlKSBpbnN0ZWFkLgorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRaaXBmaWxlKEZpbGUgemlwRmlsZSkgeworICAgICAgICBzZXREZXN0RmlsZSh6aXBGaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBuYW1lL2xvY2F0aW9uIG9mIHdoZXJlIHRvCisgICAgICogY3JlYXRlIHRoZSBmaWxlLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBwYXRoIG9mIHRoZSB6aXBGaWxlCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KKyAgICAgKiAgICAgICAgICAgICBVc2Ugc2V0RGVzdEZpbGUoRmlsZSkgaW5zdGVhZC4KKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgc2V0RGVzdEZpbGUoZmlsZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0byBjcmVhdGU7IHJlcXVpcmVkLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICogQHBhcmFtIGRlc3RGaWxlIFRoZSBuZXcgZGVzdGluYXRpb24gRmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RGaWxlKEZpbGUgZGVzdEZpbGUpIHsKKyAgICAgICB0aGlzLnppcEZpbGUgPSBkZXN0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0byBjcmVhdGUuCisgICAgICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXREZXN0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHppcEZpbGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXJlY3RvcnkgZnJvbSB3aGljaCB0byBhcmNoaXZlIGZpbGVzOyBvcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gYmFzZURpciB0aGUgYmFzZSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKEZpbGUgYmFzZURpcikgeworICAgICAgICB0aGlzLmJhc2VEaXIgPSBiYXNlRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgd2Ugd2FudCB0byBjb21wcmVzcyB0aGUgZmlsZXMgb3Igb25seSBzdG9yZSB0aGVtOworICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0PXRydWU7CisgICAgICogQHBhcmFtIGMgaWYgdHJ1ZSwgY29tcHJlc3MgdGhlIGZpbGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3MoYm9vbGVhbiBjKSB7CisgICAgICAgIGRvQ29tcHJlc3MgPSBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgd2Ugd2FudCB0byBjb21wcmVzcyB0aGUgZmlsZXMgb3Igb25seSBzdG9yZSB0aGVtOworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZXMgYXJlIHRvIGJlIGNvbXByZXNzZWQKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGRvQ29tcHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZW11bGF0ZSBTdW4ncyBqYXIgdXRpbGl0eSBieSBub3QgYWRkaW5nIHBhcmVudCBkaXJlY3RvcmllczsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICogQHBhcmFtIGYgaWYgdHJ1ZSwgZW11bGF0ZSBzdW4ncyBqYXIgYnkgbm90IGFkZGluZyBwYXJlbnQgZGlyZWN0b3JpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlc29ubHkoYm9vbGVhbiBmKSB7CisgICAgICAgIGRvRmlsZXNvbmx5ID0gZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB1cGRhdGVzIGFuIGV4aXN0aW5nIGZpbGUsIG90aGVyd2lzZSBvdmVyd3JpdGUKKyAgICAgKiBhbnkgZXhpc3Rpbmcgb25lOyBvcHRpb25hbCBkZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0gYyBpZiB0cnVlLCB1cGRhdGVzIGFuIGV4aXN0aW5nIHppcCBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXBkYXRlKGJvb2xlYW4gYykgeworICAgICAgICBkb1VwZGF0ZSA9IGM7CisgICAgICAgIHNhdmVkRG9VcGRhdGUgPSBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFyZSB3ZSB1cGRhdGluZyBhbiBleGlzdGluZyBhcmNoaXZlPworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB1cGRhdGluZyBhbiBleGlzdGluZyBhcmNoaXZlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJblVwZGF0ZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBkb1VwZGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzLgorICAgICAqIEBwYXJhbSBzZXQgdGhlIGZpbGVzZXQgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBhZGQoc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIHRoYXQgY2FuIGJlCisgICAgICogcmVhZCBmcm9tIGFuIGFyY2hpdmUgYW5kIGJlIGdpdmVuIGEgcHJlZml4L2Z1bGxwYXRoLgorICAgICAqIEBwYXJhbSBzZXQgdGhlIHppcGZpbGVzZXQgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkWmlwZmlsZXNldChaaXBGaWxlU2V0IHNldCkgeworICAgICAgICBhZGQoc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyB0byBiZSBhcmNoaXZlZC4KKyAgICAgKiBAcGFyYW0gYSB0aGUgcmVzb3VyY2VzIHRvIGFyY2hpdmUKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gYSkgeworICAgICAgICByZXNvdXJjZXMuYWRkKGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBncm91cCBvZiB6aXAgZmlsZXMuCisgICAgICogQHBhcmFtIHNldCB0aGUgZ3JvdXAgKGEgZmlsZXNldCkgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkWmlwR3JvdXBGaWxlc2V0KEZpbGVTZXQgc2V0KSB7CisgICAgICAgIGdyb3VwZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYmVoYXZpb3IgZm9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBhYm91dCB0byBiZSBhZGRlZCAtCisgICAgICogb25lIG9mIDxjb2RlPmFkZDwvY29kZT4sIDxjb2RlPnByZXNlcnZlPC9jb2RlPiBvciA8Y29kZT5mYWlsPC9jb2RlPi4KKyAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiA8Y29kZT5hZGQ8L2NvZGU+IChrZWVwIGJvdGgKKyAgICAgKiBvZiB0aGUgZmlsZXMpOyA8Y29kZT5wcmVzZXJ2ZTwvY29kZT4gKGtlZXAgdGhlIGZpcnN0IHZlcnNpb24KKyAgICAgKiBvZiB0aGUgZmlsZSBmb3VuZCk7IDxjb2RlPmZhaWw8L2NvZGU+IGhhbHQgYSBwcm9ibGVtCisgICAgICogRGVmYXVsdCBmb3IgemlwIHRhc2tzIGlzIDxjb2RlPmFkZDwvY29kZT4KKyAgICAgKiBAcGFyYW0gZGYgYSA8Y29kZT5EdXBsaWNhdGU8L2NvZGU+IGVudW1lcmF0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREdXBsaWNhdGUoRHVwbGljYXRlIGRmKSB7CisgICAgICAgIGR1cGxpY2F0ZSA9IGRmLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9zc2libGUgYmVoYXZpb3JzIHdoZW4gdGhlcmUgYXJlIG5vIG1hdGNoaW5nIGZpbGVzIGZvciB0aGUgdGFzazoKKyAgICAgKiAiZmFpbCIsICJza2lwIiwgb3IgImNyZWF0ZSIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXaGVuRW1wdHkgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzdHJpbmcgdmFsdWVzIGZvciB0aGUgZW51bWVyYXRlZCB2YWx1ZQorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiZmFpbCIsICJza2lwIiwgImNyZWF0ZSJ9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBiZWhhdmlvciBvZiB0aGUgdGFzayB3aGVuIG5vIGZpbGVzIG1hdGNoLgorICAgICAqIFBvc3NpYmxlIHZhbHVlcyBhcmU6IDxjb2RlPmZhaWw8L2NvZGU+ICh0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgKiBhbmQgaGFsdCB0aGUgYnVpbGQpOyA8Y29kZT5za2lwPC9jb2RlPiAoZG8gbm90IGNyZWF0ZQorICAgICAqIGFueSBhcmNoaXZlLCBidXQgaXNzdWUgYSB3YXJuaW5nKTsgPGNvZGU+Y3JlYXRlPC9jb2RlPgorICAgICAqIChtYWtlIGFuIGFyY2hpdmUgd2l0aCBubyBlbnRyaWVzKS4KKyAgICAgKiBEZWZhdWx0IGZvciB6aXAgdGFza3MgaXMgPGNvZGU+c2tpcDwvY29kZT47CisgICAgICogZm9yIGphciB0YXNrcywgPGNvZGU+Y3JlYXRlPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gd2UgYSA8Y29kZT5XaGVuRW1wdHk8L2NvZGU+IGVudW1lcmF0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaGVuZW1wdHkoV2hlbkVtcHR5IHdlKSB7CisgICAgICAgIGVtcHR5QmVoYXZpb3IgPSB3ZS5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzLCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncworICAgICAqIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiA8cD5Gb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgPGEKKyAgICAgKiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sPC9hPi48L3A+CisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB0byB1c2UKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIG9yaWdpbmFsIGNvbXByZXNzaW9uIG9mIGVudHJpZXMgY29taW5nIGZyb20gYSBaSVAKKyAgICAgKiBhcmNoaXZlIHNob3VsZCBiZSBrZXB0IChmb3IgZXhhbXBsZSB3aGVuIHVwZGF0aW5nIGFuIGFyY2hpdmUpLgorICAgICAqIERlZmF1bHQgaXMgZmFsc2UuCisgICAgICogQHBhcmFtIGtlZXAgaWYgdHJ1ZSwga2VlcCB0aGUgb3JpZ2luYWwgY29tcHJlc3Npb24KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBDb21wcmVzc2lvbihib29sZWFuIGtlZXApIHsKKyAgICAgICAga2VlcENvbXByZXNzaW9uID0ga2VlcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21tZW50IHRvIHVzZSBmb3IgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tZW50IFRoZSBjb250ZW50IG9mIHRoZSBjb21tZW50LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbWVudCBvZiB0aGUgYXJjaGl2ZQorICAgICAqCisgICAgICogQHJldHVybiBDb21tZW50IG9mIHRoZSBhcmNoaXZlLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gdXNlLiAgRGVmYXVsdCBpcworICAgICAqIFppcE91dHB1dFN0cmVhbS5ERUZBVUxUX0NPTVBSRVNTSU9OLgorICAgICAqIEBwYXJhbSBsZXZlbCBjb21wcmVzc2lvbiBsZXZlbC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExldmVsKGludCBsZXZlbCkgeworICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb21wcmVzc2lvbiBsZXZlbC4KKyAgICAgKiBAcmV0dXJuIGNvbXByZXNzaW9uIGxldmVsLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGludCBnZXRMZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIGxldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpbGwgYmUgcm91bmRlZCB1cCB0byB0aGUKKyAgICAgKiBuZXh0IGV2ZW4gbnVtYmVyIG9mIHNlY29uZHMuCisgICAgICoKKyAgICAgKiA8cD5aaXAgYXJjaGl2ZXMgc3RvcmUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2l0aCBhCisgICAgICogZ3JhbnVsYXJpdHkgb2YgdHdvIHNlY29uZHMsIHNvIHRoZSB0aW1lcyB3aWxsIGVpdGhlciBiZSByb3VuZGVkCisgICAgICogdXAgb3IgZG93bi4gIElmIHlvdSByb3VuZCBkb3duLCB0aGUgYXJjaGl2ZSB3aWxsIGFsd2F5cyBzZWVtCisgICAgICogb3V0LW9mLWRhdGUgd2hlbiB5b3UgcmVydW4gdGhlIHRhc2ssIHNvIHRoZSBkZWZhdWx0IGlzIHRvIHJvdW5kCisgICAgICogdXAuICBSb3VuZGluZyB1cCBtYXkgbGVhZCB0byBhIGRpZmZlcmVudCB0eXBlIG9mIHByb2JsZW1zIGxpa2UKKyAgICAgKiBKU1BzIGluc2lkZSBhIHdlYiBhcmNoaXZlIHRoYXQgc2VlbSB0byBiZSBzbGlnaHRseSBtb3JlIHJlY2VudAorICAgICAqIHRoYW4gcHJlY29tcGlsZWQgcGFnZXMsIHJlbmRlcmluZyBwcmVjb21waWxhdGlvbiB1c2VsZXNzLjwvcD4KKyAgICAgKiBAcGFyYW0gciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdW5kVXAoYm9vbGVhbiByKSB7CisgICAgICAgIHJvdW5kVXAgPSByOworICAgIH0KKworICAgIC8qKgorICAgICAqIHZhbGlkYXRlIGFuZCBidWlsZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZG91YmxlRmlsZVBhc3MpIHsKKyAgICAgICAgICAgIHNraXBXcml0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGV4ZWN1dGVNYWluKCk7CisgICAgICAgICAgICBza2lwV3JpdGluZyA9IGZhbHNlOworICAgICAgICAgICAgZXhlY3V0ZU1haW4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4ZWN1dGVNYWluKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSB1cGRhdGVkRmlsZSBhdHRyaWJ1dGUuCisgICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgZXhlY3V0ZU1haW4gaGFzIGJlZW4KKyAgICAgKiBjYWxsZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIGV4ZWN1dGVNYWluIGhhcyB3cml0dGVuIHRvIHRoZSB6aXAgZmlsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNVcGRhdGVkRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHVwZGF0ZWRGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkIHRoZSB6aXAgZmlsZS4KKyAgICAgKiBUaGlzIGlzIGNhbGxlZCB0d2ljZSBpZiBkb3VibGVGaWxlUGFzcyBpcyB0cnVlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlTWFpbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQW5kRWxlbWVudHMoKTsKKworICAgICAgICAvLyBSZW5hbWVkIHZlcnNpb24gb2Ygb3JpZ2luYWwgZmlsZSwgaWYgaXQgZXhpc3RzCisgICAgICAgIEZpbGUgcmVuYW1lZEZpbGUgPSBudWxsOworICAgICAgICBhZGRpbmdOZXdGaWxlcyA9IHRydWU7CisKKyAgICAgICAgcHJvY2Vzc0RvVXBkYXRlKCk7CisgICAgICAgIHByb2Nlc3NHcm91cEZpbGVzZXRzKCk7CisKKyAgICAgICAgLy8gY29sbGVjdCBmaWxlc2V0cyB0byBwYXNzIHRoZW0gdG8gZ2V0UmVzb3VyY2VzVG9BZGQKKyAgICAgICAgVmVjdG9yIHZmc3MgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZ2V0SW1wbGljaXRGaWxlU2V0KCkuY2xvbmUoKTsKKyAgICAgICAgICAgIGZzLnNldERpcihiYXNlRGlyKTsKKyAgICAgICAgICAgIHZmc3MuYWRkRWxlbWVudChmcyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFJlc291cmNlQ29sbGVjdGlvbiByYyA9IChSZXNvdXJjZUNvbGxlY3Rpb24pIHJlc291cmNlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICB2ZnNzLmFkZEVsZW1lbnQocmMpOworICAgICAgICB9CisKKyAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uW10gZnNzID0gbmV3IFJlc291cmNlQ29sbGVjdGlvblt2ZnNzLnNpemUoKV07CisgICAgICAgIHZmc3MuY29weUludG8oZnNzKTsKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjYW4gYWxzbyBoYW5kbGUgZW1wdHkgYXJjaGl2ZXMKKyAgICAgICAgICAgIEFyY2hpdmVTdGF0ZSBzdGF0ZSA9IGdldFJlc291cmNlc1RvQWRkKGZzcywgemlwRmlsZSwgZmFsc2UpOworCisgICAgICAgICAgICAvLyBxdWljayBleGl0IGlmIHRoZSB0YXJnZXQgaXMgdXAgdG8gZGF0ZQorICAgICAgICAgICAgaWYgKCFzdGF0ZS5pc091dE9mRGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlZEZpbGUgPSB0cnVlOworICAgICAgICAgICAgaWYgKCF6aXBGaWxlLmV4aXN0cygpICYmIHN0YXRlLmlzV2l0aG91dEFueVJlc291cmNlcygpKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlRW1wdHlaaXAoemlwRmlsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVzb3VyY2VbXVtdIGFkZFRoZW0gPSBzdGF0ZS5nZXRSZXNvdXJjZXNUb0FkZCgpOworCisgICAgICAgICAgICBpZiAoZG9VcGRhdGUpIHsKKyAgICAgICAgICAgICAgICByZW5hbWVkRmlsZSA9IHJlbmFtZUZpbGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGRvVXBkYXRlID8gIlVwZGF0aW5nICIgOiAiQnVpbGRpbmcgIjsKKworICAgICAgICAgICAgbG9nKGFjdGlvbiArIGFyY2hpdmVUeXBlICsgIjogIiArIHppcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0gek91dCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghc2tpcFdyaXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgek91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oemlwRmlsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgek91dC5zZXRFbmNvZGluZyhlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgICAgIHpPdXQuc2V0TWV0aG9kKGRvQ29tcHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgID8gWmlwT3V0cHV0U3RyZWFtLkRFRkxBVEVEIDogWmlwT3V0cHV0U3RyZWFtLlNUT1JFRCk7CisgICAgICAgICAgICAgICAgICAgIHpPdXQuc2V0TGV2ZWwobGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbml0WmlwT3V0cHV0U3RyZWFtKHpPdXQpOworCisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBleHBsaWNpdCByZXNvdXJjZSBjb2xsZWN0aW9ucyB0byB0aGUgYXJjaGl2ZS4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZzcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkVGhlbVtpXS5sZW5ndGggIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzb3VyY2VzKGZzc1tpXSwgYWRkVGhlbVtpXSwgek91dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZG9VcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkaW5nTmV3RmlsZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgWmlwRmlsZVNldCBvbGRGaWxlcyA9IG5ldyBaaXBGaWxlU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIG9sZEZpbGVzLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkRmlsZXMuc2V0U3JjKHJlbmFtZWRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkRmlsZXMuc2V0RGVmYXVsdGV4Y2x1ZGVzKGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZGVkRmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm5TZXQuTmFtZUVudHJ5IG5lID0gb2xkRmlsZXMuY3JlYXRlRXhjbHVkZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmUuc2V0TmFtZSgoU3RyaW5nKSBhZGRlZEZpbGVzLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBvbGRGaWxlcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICgoWmlwU2Nhbm5lcikgZHMpLnNldEVuY29kaW5nKGVuY29kaW5nKTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBmID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVtdIHIgPSBuZXcgUmVzb3VyY2VbZi5sZW5ndGhdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJbaV0gPSBkcy5nZXRSZXNvdXJjZShmW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghZG9GaWxlc29ubHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGQgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVtdIGRyID0gbmV3IFJlc291cmNlW2QubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyW2ldID0gZHMuZ2V0UmVzb3VyY2UoZFtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVtdIHRtcCA9IHI7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gbmV3IFJlc291cmNlW3RtcC5sZW5ndGggKyBkci5sZW5ndGhdOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkciwgMCwgciwgMCwgZHIubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG1wLCAwLCByLCBkci5sZW5ndGgsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFkZFJlc291cmNlcyhvbGRGaWxlcywgciwgek91dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh6T3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgek91dC5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGl6ZVppcE91dHB1dFN0cmVhbSh6T3V0KTsKKworICAgICAgICAgICAgICAgIC8vIElmIHdlJ3ZlIGJlZW4gc3VjY2Vzc2Z1bCBvbiBhbiB1cGRhdGUsIGRlbGV0ZSB0aGUKKyAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcnkgZmlsZQorICAgICAgICAgICAgICAgIGlmIChkb1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbmFtZWRGaWxlLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cgKCJXYXJuaW5nOiB1bmFibGUgdG8gZGVsZXRlIHRlbXBvcmFyeSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlbmFtZWRGaWxlLmdldE5hbWUoKSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICAgICAgICAgIGNsb3NlWm91dCh6T3V0LCBzdWNjZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2JsZW0gY3JlYXRpbmcgIiArIGFyY2hpdmVUeXBlICsgIjogIgorICAgICAgICAgICAgICAgICsgaW9lLmdldE1lc3NhZ2UoKTsKKworICAgICAgICAgICAgLy8gZGVsZXRlIGEgYm9ndXMgWklQIGZpbGUgKGJ1dCBvbmx5IGlmIGl0J3Mgbm90IHRoZSBvcmlnaW5hbCBvbmUpCisgICAgICAgICAgICBpZiAoKCFkb1VwZGF0ZSB8fCByZW5hbWVkRmlsZSAhPSBudWxsKSAmJiAhemlwRmlsZS5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgIG1zZyArPSAiIChhbmQgdGhlIGFyY2hpdmUgaXMgcHJvYmFibHkgY29ycnVwdCBidXQgSSBjb3VsZCBub3QgIgorICAgICAgICAgICAgICAgICAgICArICJkZWxldGUgaXQpIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRvVXBkYXRlICYmIHJlbmFtZWRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlbmFtZShyZW5hbWVkRmlsZSwgemlwRmlsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtc2cgKz0gIiAoYW5kIEkgY291bGRuJ3QgcmVuYW1lIHRoZSB0ZW1wb3JhcnkgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZW5hbWVkRmlsZS5nZXROYW1lKCkgKyAiIGJhY2spIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbGVhblVwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogcmVuYW1lIHRoZSB6aXAgZmlsZS4gKi8KKyAgICBwcml2YXRlIEZpbGUgcmVuYW1lRmlsZSgpIHsKKyAgICAgICAgRmlsZSByZW5hbWVkRmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoCisgICAgICAgICAgICAiemlwIiwgIi50bXAiLCB6aXBGaWxlLmdldFBhcmVudEZpbGUoKSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRklMRV9VVElMUy5yZW5hbWUoemlwRmlsZSwgcmVuYW1lZEZpbGUpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk5vdCBhbGxvd2VkIHRvIHJlbmFtZSBvbGQgZmlsZSAoIgorICAgICAgICAgICAgICAgICsgemlwRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICsgIikgdG8gdGVtcG9yYXJ5IGZpbGUiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmVuYW1lIG9sZCBmaWxlICgiCisgICAgICAgICAgICAgICAgKyB6aXBGaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgKyAiKSB0byB0ZW1wb3JhcnkgZmlsZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZW5hbWVkRmlsZTsKKyAgICB9CisKKyAgICAvKiogQ2xvc2Ugem91dCAqLworICAgIHByaXZhdGUgdm9pZCBjbG9zZVpvdXQoWmlwT3V0cHV0U3RyZWFtIHpPdXQsIGJvb2xlYW4gc3VjY2VzcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHpPdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB6T3V0LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBpbiB0aGlzIGZpbmFsbHkgY2xhdXNlIGJlY2F1c2Ugb2YgYW4KKyAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiwgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgaWYgdGhlcmUncyBhbgorICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHdoZW4gY2xvc2luZyB0aGUgc3RyZWFtLiBFLmcuIGlmIGl0CisgICAgICAgICAgICAvLyB0aHJvd3MgIlpJUCBmaWxlIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZW50cnkiLAorICAgICAgICAgICAgLy8gYmVjYXVzZSBhbiBleGNlcHRpb24gaGFwcGVuZWQgYmVmb3JlIHdlIGFkZGVkCisgICAgICAgICAgICAvLyBhbnkgZmlsZXMsIHRoZW4gd2UgbXVzdCBzd2FsbG93IHRoaXMKKyAgICAgICAgICAgIC8vIGV4Y2VwdGlvbi4gT3RoZXJ3aXNlLCB0aGUgZXJyb3IgdGhhdCdzIHJlcG9ydGVkCisgICAgICAgICAgICAvLyB3aWxsIGJlIHRoZSBjbG9zZSgpIGVycm9yLCB3aGljaCBpcyBub3QgdGhlCisgICAgICAgICAgICAvLyByZWFsIGNhdXNlIG9mIHRoZSBwcm9ibGVtLgorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBDaGVjayB0aGUgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVzQW5kRWxlbWVudHMoKSB7CisgICAgICAgIGlmIChiYXNlRGlyID09IG51bGwgJiYgcmVzb3VyY2VzLnNpemUoKSA9PSAwCisgICAgICAgICAgICAmJiBncm91cGZpbGVzZXRzLnNpemUoKSA9PSAwICYmICJ6aXAiLmVxdWFscyhhcmNoaXZlVHlwZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYmFzZWRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvciBhdCBsZWFzdCBvbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlc291cmNlIGNvbGxlY3Rpb24gbXVzdCBiZSBnaXZlbiEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh6aXBGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgc3BlY2lmeSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJjaGl2ZVR5cGUgKyAiIGZpbGUgdG8gY3JlYXRlISIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHppcEZpbGUuZXhpc3RzKCkgJiYgIXppcEZpbGUuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih6aXBGaWxlICsgIiBpcyBub3QgYSBmaWxlLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHppcEZpbGUuZXhpc3RzKCkgJiYgIXppcEZpbGUuY2FuV3JpdGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHppcEZpbGUgKyAiIGlzIHJlYWQtb25seS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBQcm9jZXNzIGRvdXBkYXRlICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEb1VwZGF0ZSgpIHsKKyAgICAgICAgLy8gV2hldGhlciBvciBub3QgYW4gYWN0dWFsIHVwZGF0ZSBpcyByZXF1aXJlZCAtCisgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIGlmIHRoZSBvcmlnaW5hbCBmaWxlIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgaWYgKGRvVXBkYXRlICYmICF6aXBGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBkb1VwZGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgbG9nKCJpZ25vcmluZyB1cGRhdGUgYXR0cmlidXRlIGFzICIgKyBhcmNoaXZlVHlwZQorICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IGV4aXN0LiIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBQcm9jZXNzIGdyb3VwZmlsZXNldHMgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyb3VwRmlsZXNldHMoKSB7CisgICAgICAgIC8vIEFkZCB0aGUgZmlsZXMgZm91bmQgaW4gZ3JvdXBmaWxlc2V0IHRvIGZpbGVzZXQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cGZpbGVzZXRzLnNpemUoKTsgaSsrKSB7CisKKyAgICAgICAgICAgIGxvZygiUHJvY2Vzc2luZyBncm91cGZpbGVzZXQgIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGdyb3VwZmlsZXNldHMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgRmlsZVNjYW5uZXIgc2Nhbm5lciA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgICAgICBGaWxlIGJhc2VkaXIgPSBzY2FubmVyLmdldEJhc2VkaXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKKworICAgICAgICAgICAgICAgIGxvZygiQWRkaW5nIGZpbGUgIiArIGZpbGVzW2pdICsgIiB0byBmaWxlc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgWmlwRmlsZVNldCB6ZiA9IG5ldyBaaXBGaWxlU2V0KCk7CisgICAgICAgICAgICAgICAgemYuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIHpmLnNldFNyYyhuZXcgRmlsZShiYXNlZGlyLCBmaWxlc1tqXSkpOworICAgICAgICAgICAgICAgIGFkZCh6Zik7CisgICAgICAgICAgICAgICAgZmlsZXNldHNGcm9tR3JvdXBmaWxlc2V0cy5hZGRFbGVtZW50KHpmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGUgdGFzayBpcyBhZGRpbmcgbmV3IGZpbGVzIGludG8gdGhlIGFyY2hpdmUgYXMgb3Bwb3NlZCB0bworICAgICAqIGNvcHlpbmcgYmFjayB1bmNoYW5nZWQgZmlsZXMgZnJvbSB0aGUgYmFja3VwIGNvcHkKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWRkaW5nIG5ldyBmaWxlcworICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzQWRkaW5nTmV3RmlsZXMoKSB7CisgICAgICAgIHJldHVybiBhZGRpbmdOZXdGaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGdpdmVuIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlc2V0IG1heSBnaXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGlrZSBmdWxscGF0aCBvcgorICAgICAqIHBlcm1pc3Npb25zLgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgdGhlIHJlc291cmNlcyB0byBhZGQKKyAgICAgKiBAcGFyYW0gek91dCB0aGUgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFJlc291cmNlcyhGaWxlU2V0IGZpbGVzZXQsIFJlc291cmNlW10gcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0gek91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgcHJlZml4ID0gIiI7CisgICAgICAgIFN0cmluZyBmdWxscGF0aCA9ICIiOworICAgICAgICBpbnQgZGlyTW9kZSA9IEFyY2hpdmVGaWxlU2V0LkRFRkFVTFRfRElSX01PREU7CisgICAgICAgIGludCBmaWxlTW9kZSA9IEFyY2hpdmVGaWxlU2V0LkRFRkFVTFRfRklMRV9NT0RFOworCisgICAgICAgIEFyY2hpdmVGaWxlU2V0IHpmcyA9IG51bGw7CisgICAgICAgIGlmIChmaWxlc2V0IGluc3RhbmNlb2YgQXJjaGl2ZUZpbGVTZXQpIHsKKyAgICAgICAgICAgIHpmcyA9IChBcmNoaXZlRmlsZVNldCkgZmlsZXNldDsKKyAgICAgICAgICAgIHByZWZpeCA9IHpmcy5nZXRQcmVmaXgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGZ1bGxwYXRoID0gemZzLmdldEZ1bGxwYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBkaXJNb2RlID0gemZzLmdldERpck1vZGUoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGZpbGVNb2RlID0gemZzLmdldEZpbGVNb2RlKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCAmJiBmdWxscGF0aC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQm90aCBwcmVmaXggYW5kIGZ1bGxwYXRoIGF0dHJpYnV0ZXMgbXVzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGJlIHNldCBvbiB0aGUgc2FtZSBmaWxlc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc291cmNlcy5sZW5ndGggIT0gMSAmJiBmdWxscGF0aC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZnVsbHBhdGggYXR0cmlidXRlIG1heSBvbmx5IGJlIHNwZWNpZmllZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGZpbGVzZXRzIHRoYXQgc3BlY2lmeSBhIHNpbmdsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZmlsZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoIXByZWZpeC5lbmRzV2l0aCgiLyIpICYmICFwcmVmaXguZW5kc1dpdGgoIlxcIikpIHsKKyAgICAgICAgICAgICAgICBwcmVmaXggKz0gIi8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkUGFyZW50RGlycyhudWxsLCBwcmVmaXgsIHpPdXQsICIiLCBkaXJNb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIFppcEZpbGUgemYgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYm9vbGVhbiBkZWFsaW5nV2l0aEZpbGVzID0gZmFsc2U7CisgICAgICAgICAgICBGaWxlIGJhc2UgPSBudWxsOworCisgICAgICAgICAgICBpZiAoemZzID09IG51bGwgfHwgemZzLmdldFNyYyhnZXRQcm9qZWN0KCkpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWFsaW5nV2l0aEZpbGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBiYXNlID0gZmlsZXNldC5nZXREaXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoemZzIGluc3RhbmNlb2YgWmlwRmlsZVNldCkgeworICAgICAgICAgICAgICAgIHpmID0gbmV3IFppcEZpbGUoemZzLmdldFNyYyhnZXRQcm9qZWN0KCkpLCBlbmNvZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChmdWxscGF0aC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZ1bGxwYXRoOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSByZXNvdXJjZXNbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKworICAgICAgICAgICAgICAgIGlmICgiIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNbaV0uaXNEaXJlY3RvcnkoKSAmJiAhbmFtZS5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgIi8iOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghZG9GaWxlc29ubHkgJiYgIWRlYWxpbmdXaXRoRmlsZXMKKyAgICAgICAgICAgICAgICAgICAgJiYgcmVzb3VyY2VzW2ldLmlzRGlyZWN0b3J5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIXpmcy5oYXNEaXJNb2RlQmVlblNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXh0VG9MYXN0U2xhc2ggPSBuYW1lLmxhc3RJbmRleE9mKCIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5sZW5ndGgoKSAtIDIpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFRvTGFzdFNsYXNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXJlbnREaXJzKGJhc2UsIG5hbWUuc3Vic3RyaW5nKDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUb0xhc3RTbGFzaCArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6T3V0LCBwcmVmaXgsIGRpck1vZGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh6ZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IHpmLmdldEVudHJ5KHJlc291cmNlc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyZW50RGlycyhiYXNlLCBuYW1lLCB6T3V0LCBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplLmdldFVuaXhNb2RlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJjaGl2ZVJlc291cmNlIHRyID0gKEFyY2hpdmVSZXNvdXJjZSkgcmVzb3VyY2VzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyZW50RGlycyhiYXNlLCBuYW1lLCB6T3V0LCBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLmdldE1vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFBhcmVudERpcnMoYmFzZSwgbmFtZSwgek91dCwgcHJlZml4LCBkaXJNb2RlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlc1tpXS5pc0RpcmVjdG9yeSgpICYmIGRlYWxpbmdXaXRoRmlsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHppcEZpbGUoZiwgek91dCwgcHJlZml4ICsgbmFtZSwgZmlsZU1vZGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc291cmNlc1tpXS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh6ZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFppcEVudHJ5IHplID0gemYuZ2V0RW50cnkocmVzb3VyY2VzW2ldLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHplICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb2xkQ29tcHJlc3MgPSBkb0NvbXByZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtlZXBDb21wcmVzc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvQ29tcHJlc3MgPSAoemUuZ2V0TWV0aG9kKCkgPT0gWmlwRW50cnkuREVGTEFURUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyA9IHpmLmdldElucHV0U3RyZWFtKHplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBGaWxlKGlzLCB6T3V0LCBwcmVmaXggKyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemUuZ2V0VGltZSgpLCB6ZnMuZ2V0U3JjKGdldFByb2plY3QoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZnMuaGFzRmlsZU1vZGVCZWVuU2V0KCkgPyBmaWxlTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB6ZS5nZXRVbml4TW9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Db21wcmVzcyA9IG9sZENvbXByZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyY2hpdmVSZXNvdXJjZSB0ciA9IChBcmNoaXZlUmVzb3VyY2UpIHJlc291cmNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSB0ci5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGUoaXMsIHpPdXQsIHByZWZpeCArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNbaV0uZ2V0TGFzdE1vZGlmaWVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZnMuZ2V0U3JjKGdldFByb2plY3QoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZnMuaGFzRmlsZU1vZGVCZWVuU2V0KCkgPyBmaWxlTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0ci5nZXRNb2RlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHpmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB6Zi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmMgbWF5IGdpdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsaWtlIGZ1bGxwYXRoIG9yCisgICAgICogcGVybWlzc2lvbnMuCisgICAgICogQHBhcmFtIHJlc291cmNlcyB0aGUgcmVzb3VyY2VzIHRvIGFkZAorICAgICAqIEBwYXJhbSB6T3V0IHRoZSBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFJlc291cmNlcyhSZXNvdXJjZUNvbGxlY3Rpb24gcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlW10gcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0gek91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJjIGluc3RhbmNlb2YgRmlsZVNldCkgeworICAgICAgICAgICAgYWRkUmVzb3VyY2VzKChGaWxlU2V0KSByYywgcmVzb3VyY2VzLCB6T3V0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZXNvdXJjZXNbaV0uZ2V0TmFtZSgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nKTsKKyAgICAgICAgICAgIGlmICgiIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXNbaV0uaXNEaXJlY3RvcnkoKSAmJiBkb0ZpbGVzb25seSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZSBiYXNlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBiYXNlID0gKChGaWxlUmVzb3VyY2UpIHJlc291cmNlc1tpXSkuZ2V0QmFzZURpcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc291cmNlc1tpXS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAiLyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhZGRQYXJlbnREaXJzKGJhc2UsIG5hbWUsIHpPdXQsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcmNoaXZlRmlsZVNldC5ERUZBVUxUX0RJUl9NT0RFKTsKKworICAgICAgICAgICAgaWYgKCFyZXNvdXJjZXNbaV0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gKChGaWxlUmVzb3VyY2UpIHJlc291cmNlc1tpXSkuZ2V0RmlsZSgpOworICAgICAgICAgICAgICAgICAgICB6aXBGaWxlKGYsIHpPdXQsIG5hbWUsIEFyY2hpdmVGaWxlU2V0LkRFRkFVTFRfRklMRV9NT0RFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpcyA9IHJlc291cmNlc1tpXS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZShpcywgek91dCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzW2ldLmdldExhc3RNb2RpZmllZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBBcmNoaXZlRmlsZVNldC5ERUZBVUxUX0ZJTEVfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbWV0aG9kIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlCisgICAgICogQHBhcmFtIHpPdXQgdGhlIHppcCBvdXRwdXQgc3RyZWFtCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBvdXRwdXQgZXJyb3IKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIG90aGVyIGVycm9ycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRaaXBPdXRwdXRTdHJlYW0oWmlwT3V0cHV0U3RyZWFtIHpPdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZQorICAgICAqIEBwYXJhbSB6T3V0IHRoZSB6aXAgb3V0cHV0IHN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gb3V0cHV0IGVycm9yCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBvdGhlciBlcnJvcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZVppcE91dHB1dFN0cmVhbShaaXBPdXRwdXRTdHJlYW0gek91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVtcHR5IHppcCBmaWxlCisgICAgICogQHBhcmFtIHppcEZpbGUgdGhlIHppcCBmaWxlCisgICAgICogQHJldHVybiB0cnVlIGZvciBoaXN0b3JpYyByZWFzb25zCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZUVtcHR5WmlwKEZpbGUgemlwRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHVzaW5nIGphdmEudXRpbC56aXAgd2lsbCBub3Qgd29yaworICAgICAgICAvLyBiZWNhdXNlIGl0IGRvZXMgbm90IHBlcm1pdCBhIHplcm8tZW50cnkgYXJjaGl2ZS4KKyAgICAgICAgLy8gTXVzdCBjcmVhdGUgaXQgbWFudWFsbHkuCisgICAgICAgIGxvZygiTm90ZTogY3JlYXRpbmcgZW1wdHkgIiArIGFyY2hpdmVUeXBlICsgIiBhcmNoaXZlICIgKyB6aXBGaWxlLAorICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHppcEZpbGUpOworICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgICAgIC8vIENmLiBQS1pJUCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgICAgYnl0ZVtdIGVtcHR5ID0gbmV3IGJ5dGVbMjJdOworICAgICAgICAgICAgZW1wdHlbMF0gPSA4MDsgLy8gUAorICAgICAgICAgICAgZW1wdHlbMV0gPSA3NTsgLy8gSworICAgICAgICAgICAgZW1wdHlbMl0gPSA1OworICAgICAgICAgICAgZW1wdHlbM10gPSA2OworICAgICAgICAgICAgLy8gcmVtYWluZGVyIHplcm9zCisgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisgICAgICAgICAgICBvcy53cml0ZShlbXB0eSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIGVtcHR5IFpJUCBhcmNoaXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoIiArIGlvZS5nZXRNZXNzYWdlKCkgKyAiKSIsIGlvZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIFppcFNjYW5uZXIgZ2V0WmlwU2Nhbm5lcigpIHsKKyAgICAgICAgaWYgKHpzID09IG51bGwpIHsKKyAgICAgICAgICAgIHpzID0gbmV3IFppcFNjYW5uZXIoKTsKKyAgICAgICAgICAgIHpzLnNldEVuY29kaW5nKGVuY29kaW5nKTsKKyAgICAgICAgICAgIHpzLnNldFNyYyh6aXBGaWxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4genM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdCB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIG5ld2VyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBlbnRyaWVzIChvciBtaXNzaW5nKSBpbiB0aGUgb3JpZ2luYWwgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIDxwPklmIHdlIGFyZSBnb2luZyB0byByZWNyZWF0ZSB0aGUgYXJjaGl2ZSBpbnN0ZWFkIG9mIHVwZGF0aW5nCisgICAgICogaXQsIGFsbCByZXNvdXJjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgbmV3LCBpZiBhIHNpbmdsZSBvbmUKKyAgICAgKiBpcy4gIEJlY2F1c2Ugb2YgdGhpcywgc3ViY2xhc3NlcyBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIG11c3QKKyAgICAgKiBjYWxsIDxjb2RlPnN1cGVyLmdldFJlc291cmNlc1RvQWRkPC9jb2RlPiBhbmQgaW5kaWNhdGUgd2l0aCB0aGUKKyAgICAgKiB0aGlyZCBhcmcgaWYgdGhleSBhbHJlYWR5IGtub3cgdGhhdCB0aGUgYXJjaGl2ZSBpcworICAgICAqIG91dC1vZi1kYXRlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGZpcnN0IGRlbGVnYXRlcyB0byBnZXROb25GaWxlU2V0UmVzb3VyY2VUb0FkZAorICAgICAqIGFuZCB0aGVuIGludm9rZXMgdGhlIEZpbGVTZXQtYXJnIHZlcnNpb24uICBBbGwgdGhpcyB0byBrZWVwCisgICAgICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHN1YmNsYXNzZXMgdGhhdCBkb24ndCBrbm93IGhvdyB0bworICAgICAqIGRlYWwgd2l0aCBub24tRmlsZVNldCBSZXNvdXJjZUNvbGxlY3Rpb25zLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByY3MgVGhlIHJlc291cmNlIGNvbGxlY3Rpb25zIHRvIGdyYWIgcmVzb3VyY2VzIGZyb20KKyAgICAgKiBAcGFyYW0gemlwRmlsZSBpbnRlbmRlZCBhcmNoaXZlIGZpbGUgKG1heSBvciBtYXkgbm90IGV4aXN0KQorICAgICAqIEBwYXJhbSBuZWVkc1VwZGF0ZSB3aGV0aGVyIHdlIGFscmVhZHkga25vdyB0aGF0IHRoZSBhcmNoaXZlIGlzCisgICAgICogb3V0LW9mLWRhdGUuICBTdWJjbGFzc2VzIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgYXJlIHN1cHBvc2VkIHRvCisgICAgICogc2V0IHRoaXMgdmFsdWUgY29ycmVjdGx5IGluIHRoZWlyIGNhbGwgdG8KKyAgICAgKiA8Y29kZT5zdXBlci5nZXRSZXNvdXJjZXNUb0FkZDwvY29kZT4uCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiByZXNvdXJjZXMgdG8gYWRkIGZvciBlYWNoIGZpbGVzZXQgcGFzc2VkIGluIGFzIHdlbGwKKyAgICAgKiAgICAgICAgIGFzIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmNoaXZlIGlzIHVwdG9kYXRlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBpdCBsaWtlcworICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIEFyY2hpdmVTdGF0ZSBnZXRSZXNvdXJjZXNUb0FkZChSZXNvdXJjZUNvbGxlY3Rpb25bXSByY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHppcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRzVXBkYXRlKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBBcnJheUxpc3QgZmlsZXNldHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEFycmF5TGlzdCByZXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHJjc1tpXSBpbnN0YW5jZW9mIEZpbGVTZXQpIHsKKyAgICAgICAgICAgICAgICBmaWxlc2V0cy5hZGQocmNzW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdC5hZGQocmNzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSZXNvdXJjZUNvbGxlY3Rpb25bXSByYyA9IChSZXNvdXJjZUNvbGxlY3Rpb25bXSkKKyAgICAgICAgICAgIHJlc3QudG9BcnJheShuZXcgUmVzb3VyY2VDb2xsZWN0aW9uW3Jlc3Quc2l6ZSgpXSk7CisgICAgICAgIEFyY2hpdmVTdGF0ZSBhcyA9IGdldE5vbkZpbGVTZXRSZXNvdXJjZXNUb0FkZChyYywgemlwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlKTsKKworICAgICAgICBGaWxlU2V0W10gZnMgPSAoRmlsZVNldFtdKSBmaWxlc2V0cy50b0FycmF5KG5ldyBGaWxlU2V0W2ZpbGVzZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKV0pOworICAgICAgICBBcmNoaXZlU3RhdGUgYXMyID0gZ2V0UmVzb3VyY2VzVG9BZGQoZnMsIHppcEZpbGUsIGFzLmlzT3V0T2ZEYXRlKCkpOworICAgICAgICBpZiAoIWFzLmlzT3V0T2ZEYXRlKCkgJiYgYXMyLmlzT3V0T2ZEYXRlKCkpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBCYWQgbHVjay4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGVyZSBhcmUgcmVzb3VyY2VzIGluIHRoZSBmaWxlc2V0cyB0aGF0IG1ha2UgdGhlCisgICAgICAgICAgICAgKiBhcmNoaXZlIG91dCBvZiBkYXRlLCBidXQgbm90IGluIHRoZSBub24tZmlsZXNldAorICAgICAgICAgICAgICogcmVzb3VyY2VzLiBXZSBuZWVkIHRvIHJlc2NhbiB0aGUgbm9uLUZpbGVTZXRzIHRvIGdyYWIKKyAgICAgICAgICAgICAqIGFsbCBvZiB0aGVtIG5vdy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXMgPSBnZXROb25GaWxlU2V0UmVzb3VyY2VzVG9BZGQocmMsIHppcEZpbGUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgUmVzb3VyY2VbXVtdIHRvQWRkID0gbmV3IFJlc291cmNlW3Jjcy5sZW5ndGhdW107CisgICAgICAgIGludCBmc0luZGV4ID0gMDsKKyAgICAgICAgaW50IHJlc3RJbmRleCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmNzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocmNzW2ldIGluc3RhbmNlb2YgRmlsZVNldCkgeworICAgICAgICAgICAgICAgIHRvQWRkW2ldID0gYXMyLmdldFJlc291cmNlc1RvQWRkKClbZnNJbmRleCsrXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9BZGRbaV0gPSBhcy5nZXRSZXNvdXJjZXNUb0FkZCgpW3Jlc3RJbmRleCsrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEFyY2hpdmVTdGF0ZShhczIuaXNPdXRPZkRhdGUoKSwgdG9BZGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3QgdGhlIHJlc291cmNlcyB0aGF0IGFyZSBuZXdlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogZW50cmllcyAob3IgbWlzc2luZykgaW4gdGhlIG9yaWdpbmFsIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiA8cD5JZiB3ZSBhcmUgZ29pbmcgdG8gcmVjcmVhdGUgdGhlIGFyY2hpdmUgaW5zdGVhZCBvZiB1cGRhdGluZworICAgICAqIGl0LCBhbGwgcmVzb3VyY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIG5ldywgaWYgYSBzaW5nbGUgb25lCisgICAgICogaXMuICBCZWNhdXNlIG9mIHRoaXMsIHN1YmNsYXNzZXMgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCBtdXN0CisgICAgICogY2FsbCA8Y29kZT5zdXBlci5nZXRSZXNvdXJjZXNUb0FkZDwvY29kZT4gYW5kIGluZGljYXRlIHdpdGggdGhlCisgICAgICogdGhpcmQgYXJnIGlmIHRoZXkgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGFyY2hpdmUgaXMKKyAgICAgKiBvdXQtb2YtZGF0ZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZXNldHMgVGhlIGZpbGVzZXRzIHRvIGdyYWIgcmVzb3VyY2VzIGZyb20KKyAgICAgKiBAcGFyYW0gemlwRmlsZSBpbnRlbmRlZCBhcmNoaXZlIGZpbGUgKG1heSBvciBtYXkgbm90IGV4aXN0KQorICAgICAqIEBwYXJhbSBuZWVkc1VwZGF0ZSB3aGV0aGVyIHdlIGFscmVhZHkga25vdyB0aGF0IHRoZSBhcmNoaXZlIGlzCisgICAgICogb3V0LW9mLWRhdGUuICBTdWJjbGFzc2VzIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgYXJlIHN1cHBvc2VkIHRvCisgICAgICogc2V0IHRoaXMgdmFsdWUgY29ycmVjdGx5IGluIHRoZWlyIGNhbGwgdG8KKyAgICAgKiA8Y29kZT5zdXBlci5nZXRSZXNvdXJjZXNUb0FkZDwvY29kZT4uCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiByZXNvdXJjZXMgdG8gYWRkIGZvciBlYWNoIGZpbGVzZXQgcGFzc2VkIGluIGFzIHdlbGwKKyAgICAgKiAgICAgICAgIGFzIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmNoaXZlIGlzIHVwdG9kYXRlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBpdCBsaWtlcworICAgICAqLworICAgIHByb3RlY3RlZCBBcmNoaXZlU3RhdGUgZ2V0UmVzb3VyY2VzVG9BZGQoRmlsZVNldFtdIGZpbGVzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSB6aXBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkc1VwZGF0ZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBSZXNvdXJjZVtdW10gaW5pdGlhbFJlc291cmNlcyA9IGdyYWJSZXNvdXJjZXMoZmlsZXNldHMpOworICAgICAgICBpZiAoaXNFbXB0eShpbml0aWFsUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlICYmIGRvVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIGEgcmF0aGVyIGhhaXJ5IGNhc2UuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBPbmUgb2Ygb3VyIHN1YmNsYXNzZXMga25vd3MgdGhhdCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUKKyAgICAgICAgICAgICAgICAgKiBhcmNoaXZlLCBidXQgYXQgdGhlIHNhbWUgdGltZSwgdGhlcmUgYXJlIG5vIHJlc291cmNlcworICAgICAgICAgICAgICAgICAqIGtub3duIHRvIHVzIHRoYXQgd291bGQgbmVlZCB0byBiZSBhZGRlZC4gIE9ubHkgdGhlCisgICAgICAgICAgICAgICAgICogc3ViY2xhc3Mgc2VlbXMgdG8ga25vdyB3aGF0J3MgZ29pbmcgb24uCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcHBlbnMgaWYgPGphcj4gZGV0ZWN0cyB0aGF0IHRoZSBtYW5pZmVzdCBoYXMgY2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgKiBmb3IgZXhhbXBsZS4gIFRoZSBtYW5pZmVzdCBpcyBub3QgcGFydCBvZiBhbnkgcmVzb3VyY2VzCisgICAgICAgICAgICAgICAgICogYmVjYXVzZSBvZiBvdXIgc3VwcG9ydCBmb3IgaW5saW5lIDxtYW5pZmVzdD5zLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogSWYgd2UgaW52b2tlIGNyZWF0ZUVtcHR5WmlwIGxpa2UgQW50IDEuNS4yIGRpZCwKKyAgICAgICAgICAgICAgICAgKiB3ZSdsbCBsb29zZSBhbGwgc3R1ZmYgdGhhdCBoYXMgYmVlbiBpbiB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgICAgICAgKiBhcmNoaXZlIChidWd6aWxsYSByZXBvcnQgMTc3ODApLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJjaGl2ZVN0YXRlKHRydWUsIGluaXRpYWxSZXNvdXJjZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZW1wdHlCZWhhdmlvci5lcXVhbHMoInNraXAiKSkgeworICAgICAgICAgICAgICAgIGlmIChkb1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBsb2coYXJjaGl2ZVR5cGUgKyAiIGFyY2hpdmUgIiArIHppcEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgdXBkYXRlZCBiZWNhdXNlIG5vIG5ldyBmaWxlcyB3ZXJlIGluY2x1ZGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coIldhcm5pbmc6IHNraXBwaW5nICIgKyBhcmNoaXZlVHlwZSArICIgYXJjaGl2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHppcEZpbGUgKyAiIGJlY2F1c2Ugbm8gZmlsZXMgd2VyZSBpbmNsdWRlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChlbXB0eUJlaGF2aW9yLmVxdWFscygiZmFpbCIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlICIgKyBhcmNoaXZlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJjaGl2ZSAiICsgemlwRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IG5vIGZpbGVzIHdlcmUgaW5jbHVkZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZS4KKyAgICAgICAgICAgICAgICBpZiAoIXppcEZpbGUuZXhpc3RzKCkpICB7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IEFyY2hpdmVTdGF0ZShuZWVkc1VwZGF0ZSwgaW5pdGlhbFJlc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbml0aWFsUmVzb3VyY2VzIGlzIG5vdCBlbXB0eQorCisgICAgICAgIGlmICghemlwRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBcmNoaXZlU3RhdGUodHJ1ZSwgaW5pdGlhbFJlc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZHNVcGRhdGUgJiYgIWRvVXBkYXRlKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgcmVjcmVhdGluZyB0aGUgYXJjaGl2ZSwgbmVlZCBhbGwgcmVzb3VyY2VzCisgICAgICAgICAgICByZXR1cm4gbmV3IEFyY2hpdmVTdGF0ZSh0cnVlLCBpbml0aWFsUmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlc291cmNlW11bXSBuZXdlclJlc291cmNlcyA9IG5ldyBSZXNvdXJjZVtmaWxlc2V0cy5sZW5ndGhdW107CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc2V0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCEoZmlsZXNldCBpbnN0YW5jZW9mIFppcEZpbGVTZXQpCisgICAgICAgICAgICAgICAgfHwgKChaaXBGaWxlU2V0KSBmaWxlc2V0KS5nZXRTcmMoZ2V0UHJvamVjdCgpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmlsZSBiYXNlID0gZmlsZXNldHNbaV0uZ2V0RGlyKGdldFByb2plY3QoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGluaXRpYWxSZXNvdXJjZXNbaV0ubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSByZXNvdXJjZUFzRmlsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFJlc291cmNlc1tpXVtqXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VBc0ZpbGUuZXF1YWxzKHppcEZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkEgemlwIGZpbGUgY2Fubm90IGluY2x1ZGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIml0c2VsZiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc2V0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGluaXRpYWxSZXNvdXJjZXNbaV0ubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXdlclJlc291cmNlc1tpXSA9IG5ldyBSZXNvdXJjZVtdIHt9OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBteU1hcHBlciA9IG5ldyBJZGVudGl0eU1hcHBlcigpOworICAgICAgICAgICAgaWYgKGZpbGVzZXRzW2ldIGluc3RhbmNlb2YgWmlwRmlsZVNldCkgeworICAgICAgICAgICAgICAgIFppcEZpbGVTZXQgemZzID0gKFppcEZpbGVTZXQpIGZpbGVzZXRzW2ldOworICAgICAgICAgICAgICAgIGlmICh6ZnMuZ2V0RnVsbHBhdGgoZ2V0UHJvamVjdCgpKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmICF6ZnMuZ2V0RnVsbHBhdGgoZ2V0UHJvamVjdCgpKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSBhbGwgZmlsZXMgZnJvbSBvcmlnaW4gbWFwIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmdWxsUGF0aCBhdHRyaWJ1dGUgb2YgdGhlIHppcGZpbGVzZXQgYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzdGluYXRpb24KKyAgICAgICAgICAgICAgICAgICAgTWVyZ2luZ01hcHBlciBmbSA9IG5ldyBNZXJnaW5nTWFwcGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGZtLnNldFRvKHpmcy5nZXRGdWxscGF0aChnZXRQcm9qZWN0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgbXlNYXBwZXIgPSBmbTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoemZzLmdldFByZWZpeChnZXRQcm9qZWN0KCkpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF6ZnMuZ2V0UHJlZml4KGdldFByb2plY3QoKSkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICBHbG9iUGF0dGVybk1hcHBlciBnbSA9IG5ldyBHbG9iUGF0dGVybk1hcHBlcigpOworICAgICAgICAgICAgICAgICAgICBnbS5zZXRGcm9tKCIqIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB6ZnMuZ2V0UHJlZml4KGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJlZml4LmVuZHNXaXRoKCIvIikgJiYgIXByZWZpeC5lbmRzV2l0aCgiXFwiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICs9ICIvIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnbS5zZXRUbyhwcmVmaXggKyAiKiIpOworICAgICAgICAgICAgICAgICAgICBteU1hcHBlciA9IGdtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBpbml0aWFsUmVzb3VyY2VzW2ldOworICAgICAgICAgICAgaWYgKGRvRmlsZXNvbmx5KSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gc2VsZWN0RmlsZVJlc291cmNlcyhyZXNvdXJjZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXdlclJlc291cmNlc1tpXSA9CisgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5zZWxlY3RPdXRPZkRhdGVTb3VyY2VzKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlNYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFppcFNjYW5uZXIoKSk7CisgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IG5lZWRzVXBkYXRlIHx8IChuZXdlclJlc291cmNlc1tpXS5sZW5ndGggPiAwKTsKKworICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlICYmICFkb1VwZGF0ZSkgeworICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgcmV0dXJuIGluaXRpYWxSZXNvdXJjZXMgYW55d2F5LCBubyByZWFzb24KKyAgICAgICAgICAgICAgICAvLyB0byBzY2FuIGZ1cnRoZXIuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZHNVcGRhdGUgJiYgIWRvVXBkYXRlKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgcmVjcmVhdGluZyB0aGUgYXJjaGl2ZSwgbmVlZCBhbGwgcmVzb3VyY2VzCisgICAgICAgICAgICByZXR1cm4gbmV3IEFyY2hpdmVTdGF0ZSh0cnVlLCBpbml0aWFsUmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgQXJjaGl2ZVN0YXRlKG5lZWRzVXBkYXRlLCBuZXdlclJlc291cmNlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdCB0aGUgcmVzb3VyY2VzIHRoYXQgYXJlIG5ld2VyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBlbnRyaWVzIChvciBtaXNzaW5nKSBpbiB0aGUgb3JpZ2luYWwgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIDxwPklmIHdlIGFyZSBnb2luZyB0byByZWNyZWF0ZSB0aGUgYXJjaGl2ZSBpbnN0ZWFkIG9mIHVwZGF0aW5nCisgICAgICogaXQsIGFsbCByZXNvdXJjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgbmV3LCBpZiBhIHNpbmdsZSBvbmUKKyAgICAgKiBpcy4gIEJlY2F1c2Ugb2YgdGhpcywgc3ViY2xhc3NlcyBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIG11c3QKKyAgICAgKiBjYWxsIDxjb2RlPnN1cGVyLmdldFJlc291cmNlc1RvQWRkPC9jb2RlPiBhbmQgaW5kaWNhdGUgd2l0aCB0aGUKKyAgICAgKiB0aGlyZCBhcmcgaWYgdGhleSBhbHJlYWR5IGtub3cgdGhhdCB0aGUgYXJjaGl2ZSBpcworICAgICAqIG91dC1vZi1kYXRlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByY3MgVGhlIGZpbGVzZXRzIHRvIGdyYWIgcmVzb3VyY2VzIGZyb20KKyAgICAgKiBAcGFyYW0gemlwRmlsZSBpbnRlbmRlZCBhcmNoaXZlIGZpbGUgKG1heSBvciBtYXkgbm90IGV4aXN0KQorICAgICAqIEBwYXJhbSBuZWVkc1VwZGF0ZSB3aGV0aGVyIHdlIGFscmVhZHkga25vdyB0aGF0IHRoZSBhcmNoaXZlIGlzCisgICAgICogb3V0LW9mLWRhdGUuICBTdWJjbGFzc2VzIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgYXJlIHN1cHBvc2VkIHRvCisgICAgICogc2V0IHRoaXMgdmFsdWUgY29ycmVjdGx5IGluIHRoZWlyIGNhbGwgdG8KKyAgICAgKiA8Y29kZT5zdXBlci5nZXRSZXNvdXJjZXNUb0FkZDwvY29kZT4uCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiByZXNvdXJjZXMgdG8gYWRkIGZvciBlYWNoIGZpbGVzZXQgcGFzc2VkIGluIGFzIHdlbGwKKyAgICAgKiAgICAgICAgIGFzIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBhcmNoaXZlIGlzIHVwdG9kYXRlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBpdCBsaWtlcworICAgICAqLworICAgIHByb3RlY3RlZCBBcmNoaXZlU3RhdGUgZ2V0Tm9uRmlsZVNldFJlc291cmNlc1RvQWRkKFJlc291cmNlQ29sbGVjdGlvbltdIHJjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHppcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkc1VwZGF0ZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yY2VzIHVzIHRvIHJlcGVhdCB0aGUgbG9naWMgb2YKKyAgICAgICAgICogZ2V0UmVzb3VyY2VzVG9BZGQoRmlsZVNldFtdLCAuLi4pIGhlcmUgb25jZSBhZ2Fpbi4KKyAgICAgICAgICovCisKKyAgICAgICAgUmVzb3VyY2VbXVtdIGluaXRpYWxSZXNvdXJjZXMgPSBncmFiTm9uRmlsZVNldFJlc291cmNlcyhyY3MpOworICAgICAgICBpZiAoaXNFbXB0eShpbml0aWFsUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgLy8gbm8gZW1wdHlCZWhhdmlvciBoYW5kbGluZyBzaW5jZSB0aGUgRmlsZVNldCB2ZXJzaW9uCisgICAgICAgICAgICAvLyB3aWxsIHRha2UgY2FyZSBvZiBpdC4KKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJjaGl2ZVN0YXRlKG5lZWRzVXBkYXRlLCBpbml0aWFsUmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXRpYWxSZXNvdXJjZXMgaXMgbm90IGVtcHR5CisKKyAgICAgICAgaWYgKCF6aXBGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFyY2hpdmVTdGF0ZSh0cnVlLCBpbml0aWFsUmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZWVkc1VwZGF0ZSAmJiAhZG9VcGRhdGUpIHsKKyAgICAgICAgICAgIC8vIHdlIGFyZSByZWNyZWF0aW5nIHRoZSBhcmNoaXZlLCBuZWVkIGFsbCByZXNvdXJjZXMKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJjaGl2ZVN0YXRlKHRydWUsIGluaXRpYWxSZXNvdXJjZXMpOworICAgICAgICB9CisKKyAgICAgICAgUmVzb3VyY2VbXVtdIG5ld2VyUmVzb3VyY2VzID0gbmV3IFJlc291cmNlW3Jjcy5sZW5ndGhdW107CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsUmVzb3VyY2VzW2ldLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbmV3ZXJSZXNvdXJjZXNbaV0gPSBuZXcgUmVzb3VyY2VbXSB7fTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbml0aWFsUmVzb3VyY2VzW2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxSZXNvdXJjZXNbaV1bal0gaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgJiYgemlwRmlsZS5lcXVhbHMoKChGaWxlUmVzb3VyY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsUmVzb3VyY2VzW2ldW2pdKS5nZXRGaWxlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQSB6aXAgZmlsZSBjYW5ub3QgaW5jbHVkZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpdHNlbGYiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFJlc291cmNlW10gcnMgPSBpbml0aWFsUmVzb3VyY2VzW2ldOworICAgICAgICAgICAgaWYgKGRvRmlsZXNvbmx5KSB7CisgICAgICAgICAgICAgICAgcnMgPSBzZWxlY3RGaWxlUmVzb3VyY2VzKHJzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV3ZXJSZXNvdXJjZXNbaV0gPQorICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuc2VsZWN0T3V0T2ZEYXRlU291cmNlcyh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElkZW50aXR5TWFwcGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFppcFNjYW5uZXIoKSk7CisgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IG5lZWRzVXBkYXRlIHx8IChuZXdlclJlc291cmNlc1tpXS5sZW5ndGggPiAwKTsKKworICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlICYmICFkb1VwZGF0ZSkgeworICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgcmV0dXJuIGluaXRpYWxSZXNvdXJjZXMgYW55d2F5LCBubyByZWFzb24KKyAgICAgICAgICAgICAgICAvLyB0byBzY2FuIGZ1cnRoZXIuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZHNVcGRhdGUgJiYgIWRvVXBkYXRlKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgcmVjcmVhdGluZyB0aGUgYXJjaGl2ZSwgbmVlZCBhbGwgcmVzb3VyY2VzCisgICAgICAgICAgICByZXR1cm4gbmV3IEFyY2hpdmVTdGF0ZSh0cnVlLCBpbml0aWFsUmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgQXJjaGl2ZVN0YXRlKG5lZWRzVXBkYXRlLCBuZXdlclJlc291cmNlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmV0Y2ggYWxsIGluY2x1ZGVkIGFuZCBub3QgZXhjbHVkZWQgcmVzb3VyY2VzIGZyb20gdGhlIHNldHMuCisgICAgICoKKyAgICAgKiA8cD5JbmNsdWRlZCBkaXJlY3RvcmllcyB3aWxsIHByZWNlZGUgaW5jbHVkZWQgZmlsZXMuPC9wPgorICAgICAqIEBwYXJhbSBmaWxlc2V0cyBhbiBhcnJheSBvZiBmaWxlc2V0cworICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlcyBpbmNsdWRlZAorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VbXVtdIGdyYWJSZXNvdXJjZXMoRmlsZVNldFtdIGZpbGVzZXRzKSB7CisgICAgICAgIFJlc291cmNlW11bXSByZXN1bHQgPSBuZXcgUmVzb3VyY2VbZmlsZXNldHMubGVuZ3RoXVtdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzZXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBib29sZWFuIHNraXBFbXB0eU5hbWVzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChmaWxlc2V0c1tpXSBpbnN0YW5jZW9mIFppcEZpbGVTZXQpIHsKKyAgICAgICAgICAgICAgICBaaXBGaWxlU2V0IHpmcyA9IChaaXBGaWxlU2V0KSBmaWxlc2V0c1tpXTsKKyAgICAgICAgICAgICAgICBza2lwRW1wdHlOYW1lcyA9IHpmcy5nZXRQcmVmaXgoZ2V0UHJvamVjdCgpKS5lcXVhbHMoIiIpCisgICAgICAgICAgICAgICAgICAgICYmIHpmcy5nZXRGdWxscGF0aChnZXRQcm9qZWN0KCkpLmVxdWFscygiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHJzID0KKyAgICAgICAgICAgICAgICBmaWxlc2V0c1tpXS5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBpZiAocnMgaW5zdGFuY2VvZiBaaXBTY2FubmVyKSB7CisgICAgICAgICAgICAgICAgKChaaXBTY2FubmVyKSBycykuc2V0RW5jb2RpbmcoZW5jb2RpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVmVjdG9yIHJlc291cmNlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIGlmICghZG9GaWxlc29ubHkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBkaXJlY3RvcmllcyA9IHJzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRpcmVjdG9yaWVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghIiIuZXF1YWxzKGRpcmVjdG9yaWVzW2pdKSB8fCAhc2tpcEVtcHR5TmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5hZGRFbGVtZW50KHJzLmdldFJlc291cmNlKGRpcmVjdG9yaWVzW2pdKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHJzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhmaWxlc1tqXSkgfHwgIXNraXBFbXB0eU5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5hZGRFbGVtZW50KHJzLmdldFJlc291cmNlKGZpbGVzW2pdKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHRbaV0gPSBuZXcgUmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV07CisgICAgICAgICAgICByZXNvdXJjZXMuY29weUludG8ocmVzdWx0W2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZldGNoIGFsbCBpbmNsdWRlZCBhbmQgbm90IGV4Y2x1ZGVkIHJlc291cmNlcyBmcm9tIHRoZSBjb2xsZWN0aW9ucy4KKyAgICAgKgorICAgICAqIDxwPkluY2x1ZGVkIGRpcmVjdG9yaWVzIHdpbGwgcHJlY2VkZSBpbmNsdWRlZCBmaWxlcy48L3A+CisgICAgICogQHBhcmFtIHJjcyBhbiBhcnJheSBvZiByZXNvdXJjZSBjb2xsZWN0aW9ucworICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlcyBpbmNsdWRlZAorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc291cmNlW11bXSBncmFiTm9uRmlsZVNldFJlc291cmNlcyhSZXNvdXJjZUNvbGxlY3Rpb25bXSByY3MpIHsKKyAgICAgICAgUmVzb3VyY2VbXVtdIHJlc3VsdCA9IG5ldyBSZXNvdXJjZVtyY3MubGVuZ3RoXVtdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHJjc1tpXS5pdGVyYXRvcigpOworICAgICAgICAgICAgQXJyYXlMaXN0IHJzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgaW50IGxhc3REaXIgPSAwOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2UgciA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHIuaXNFeGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBycy5hZGQobGFzdERpcisrLCByKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJzLmFkZChyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IChSZXNvdXJjZVtdKSBycy50b0FycmF5KG5ldyBSZXNvdXJjZVtycy5zaXplKCldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgemlwIHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gZGlyICB0aGUgZGlyZWN0b3J0IHRvIGFkZCB0byB0aGUgYXJjaGl2ZQorICAgICAqIEBwYXJhbSB6T3V0IHRoZSBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gdlBhdGggdGhlIG5hbWUgdGhpcyBlbnRyeSBzaGFsbCBoYXZlIGluIHRoZSBhcmNoaXZlCisgICAgICogQHBhcmFtIG1vZGUgdGhlIFVuaXggcGVybWlzc2lvbnMgdG8gc2V0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgemlwRGlyKEZpbGUgZGlyLCBaaXBPdXRwdXRTdHJlYW0gek91dCwgU3RyaW5nIHZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgemlwRGlyKGRpciwgek91dCwgdlBhdGgsIG1vZGUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgemlwIHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gZGlyICB0aGUgZGlyZWN0b3J0IHRvIGFkZCB0byB0aGUgYXJjaGl2ZQorICAgICAqIEBwYXJhbSB6T3V0IHRoZSBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gdlBhdGggdGhlIG5hbWUgdGhpcyBlbnRyeSBzaGFsbCBoYXZlIGluIHRoZSBhcmNoaXZlCisgICAgICogQHBhcmFtIG1vZGUgdGhlIFVuaXggcGVybWlzc2lvbnMgdG8gc2V0LgorICAgICAqIEBwYXJhbSBleHRyYSBaaXBFeHRyYUZpZWxkcyB0byBhZGQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHppcERpcihGaWxlIGRpciwgWmlwT3V0cHV0U3RyZWFtIHpPdXQsIFN0cmluZyB2UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsIFppcEV4dHJhRmllbGRbXSBleHRyYSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRvRmlsZXNvbmx5KSB7CisgICAgICAgICAgICBsb2coInNraXBwaW5nIGRpcmVjdG9yeSAiICsgdlBhdGggKyAiIGZvciBmaWxlLW9ubHkgYXJjaGl2ZSIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhZGRlZERpcnMuZ2V0KHZQYXRoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBkb24ndCBhZGQgZGlyZWN0b3JpZXMgd2UndmUgYWxyZWFkeSBhZGRlZC4KKyAgICAgICAgICAgIC8vIG5vIHdhcm5pbmcgaWYgd2UgdHJ5LCBpdCBpcyBoYXJtbGVzcyBpbiBhbmQgb2YgaXRzZWxmCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBsb2coImFkZGluZyBkaXJlY3RvcnkgIiArIHZQYXRoLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgYWRkZWREaXJzLnB1dCh2UGF0aCwgdlBhdGgpOworCisgICAgICAgIGlmICghc2tpcFdyaXRpbmcpIHsKKyAgICAgICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5ICh2UGF0aCk7CisgICAgICAgICAgICBpZiAoZGlyICE9IG51bGwgJiYgZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgLy8gWklQcyBzdG9yZSB0aW1lIHdpdGggYSBncmFudWxhcml0eSBvZiAyIHNlY29uZHMsIHJvdW5kIHVwCisgICAgICAgICAgICAgICAgemUuc2V0VGltZShkaXIubGFzdE1vZGlmaWVkKCkgKyAocm91bmRVcCA/IFJPVU5EVVBfTUlMTElTIDogMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBaSVBzIHN0b3JlIHRpbWUgd2l0aCBhIGdyYW51bGFyaXR5IG9mIDIgc2Vjb25kcywgcm91bmQgdXAKKyAgICAgICAgICAgICAgICB6ZS5zZXRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIChyb3VuZFVwID8gUk9VTkRVUF9NSUxMSVMgOiAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6ZS5zZXRTaXplICgwKTsKKyAgICAgICAgICAgIHplLnNldE1ldGhvZCAoWmlwRW50cnkuU1RPUkVEKTsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgZmFpbnRseSByaWRpY3Vsb3VzOgorICAgICAgICAgICAgemUuc2V0Q3JjIChFTVBUWV9DUkMpOworICAgICAgICAgICAgemUuc2V0VW5peE1vZGUobW9kZSk7CisKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgemUuc2V0RXh0cmFGaWVsZHMoZXh0cmEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6T3V0LnB1dE5leHRFbnRyeSh6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IGVudHJ5IHRvIHRoZSBhcmNoaXZlLCB0YWtlcyBjYXJlIG9mIGR1cGxpY2F0ZXMgYXMgd2VsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgc3RyZWFtIHRvIHJlYWQgZGF0YSBmb3IgdGhlIGVudHJ5IGZyb20uCisgICAgICogQHBhcmFtIHpPdXQgdGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgKiBAcGFyYW0gdlBhdGggdGhlIG5hbWUgdGhpcyBlbnRyeSBzaGFsbCBoYXZlIGluIHRoZSBhcmNoaXZlLgorICAgICAqIEBwYXJhbSBsYXN0TW9kaWZpZWQgbGFzdCBtb2RpZmljYXRpb24gdGltZSBmb3IgdGhlIGVudHJ5LgorICAgICAqIEBwYXJhbSBmcm9tQXJjaGl2ZSB0aGUgb3JpZ2luYWwgYXJjaGl2ZSB3ZSBhcmUgY29weWluZyB0aGlzCisgICAgICogZW50cnkgZnJvbSwgd2lsbCBiZSBudWxsIGlmIHdlIGFyZSBub3QgY29weWluZyBmcm9tIGFuIGFyY2hpdmUuCisgICAgICogQHBhcmFtIG1vZGUgdGhlIFVuaXggcGVybWlzc2lvbnMgdG8gc2V0LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB6aXBGaWxlKElucHV0U3RyZWFtIGluLCBaaXBPdXRwdXRTdHJlYW0gek91dCwgU3RyaW5nIHZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQsIEZpbGUgZnJvbUFyY2hpdmUsIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZW50cmllcy5jb250YWlucyh2UGF0aCkpIHsKKworICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZS5lcXVhbHMoInByZXNlcnZlIikpIHsKKyAgICAgICAgICAgICAgICBsb2codlBhdGggKyAiIGFscmVhZHkgYWRkZWQsIHNraXBwaW5nIiwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIGlmIChkdXBsaWNhdGUuZXF1YWxzKCJmYWlsIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkR1cGxpY2F0ZSBmaWxlICIgKyB2UGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2FzIGZvdW5kIGFuZCB0aGUgZHVwbGljYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlIGlzICdmYWlsJy4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIGVxdWFsIHRvIGFkZCwgc28gd2UgY29udGludWUKKyAgICAgICAgICAgICAgICBsb2coImR1cGxpY2F0ZSBmaWxlICIgKyB2UGF0aAorICAgICAgICAgICAgICAgICAgICArICIgZm91bmQsIGFkZGluZy4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZygiYWRkaW5nIGVudHJ5ICIgKyB2UGF0aCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKworICAgICAgICBlbnRyaWVzLnB1dCh2UGF0aCwgdlBhdGgpOworCisgICAgICAgIGlmICghc2tpcFdyaXRpbmcpIHsKKyAgICAgICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KHZQYXRoKTsKKyAgICAgICAgICAgIHplLnNldFRpbWUobGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgIHplLnNldE1ldGhvZChkb0NvbXByZXNzID8gWmlwRW50cnkuREVGTEFURUQgOiBaaXBFbnRyeS5TVE9SRUQpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogWmlwT3V0cHV0U3RyZWFtLnB1dE5leHRFbnRyeSBleHBlY3RzIHRoZSBaaXBFbnRyeSB0bworICAgICAgICAgICAgICoga25vdyBpdHMgc2l6ZSBhbmQgdGhlIENSQyBzdW0gYmVmb3JlIHlvdSBzdGFydCB3cml0aW5nCisgICAgICAgICAgICAgKiB0aGUgZGF0YSB3aGVuIHVzaW5nIFNUT1JFRCBtb2RlIC0gdW5sZXNzIGl0IGlzIHNlZWthYmxlLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgZm9yY2VzIHVzIHRvIHByb2Nlc3MgdGhlIGRhdGEgdHdpY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghek91dC5pc1NlZWthYmxlKCkgJiYgIWRvQ29tcHJlc3MpIHsKKyAgICAgICAgICAgICAgICBsb25nIHNpemUgPSAwOworICAgICAgICAgICAgICAgIENSQzMyIGNhbCA9IG5ldyBDUkMzMigpOworICAgICAgICAgICAgICAgIGlmICghaW4ubWFya1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIGRhdGEgaW50byBhIGJ5dGVbXQorICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWwudXBkYXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9zLndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW4ubWFyayhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWwudXBkYXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgaW4ucmVzZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgemUuc2V0U2l6ZShzaXplKTsKKyAgICAgICAgICAgICAgICB6ZS5zZXRDcmMoY2FsLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6ZS5zZXRVbml4TW9kZShtb2RlKTsKKyAgICAgICAgICAgIHpPdXQucHV0TmV4dEVudHJ5KHplKTsKKworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgek91dC53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CisgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAtMSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkZWRGaWxlcy5hZGRFbGVtZW50KHZQYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdGhhdCBnZXRzIGNhbGxlZCB3aGVuIGFkZGluZyBmcm9tIDxjb2RlPmphdmEuaW8uRmlsZTwvY29kZT4gaW5zdGFuY2VzLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBkZWxlZ2F0ZXMgdG8gdGhlIHNpeC1hcmcgdmVyc2lvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBhZGQgdG8gdGhlIGFyY2hpdmUKKyAgICAgKiBAcGFyYW0gek91dCB0aGUgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICogQHBhcmFtIHZQYXRoIHRoZSBuYW1lIHRoaXMgZW50cnkgc2hhbGwgaGF2ZSBpbiB0aGUgYXJjaGl2ZQorICAgICAqIEBwYXJhbSBtb2RlIHRoZSBVbml4IHBlcm1pc3Npb25zIHRvIHNldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgemlwRmlsZShGaWxlIGZpbGUsIFppcE91dHB1dFN0cmVhbSB6T3V0LCBTdHJpbmcgdlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGUuZXF1YWxzKHppcEZpbGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkEgemlwIGZpbGUgY2Fubm90IGluY2x1ZGUgaXRzZWxmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmSW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gWklQcyBzdG9yZSB0aW1lIHdpdGggYSBncmFudWxhcml0eSBvZiAyIHNlY29uZHMsIHJvdW5kIHVwCisgICAgICAgICAgICB6aXBGaWxlKGZJbiwgek91dCwgdlBhdGgsCisgICAgICAgICAgICAgICAgICAgIGZpbGUubGFzdE1vZGlmaWVkKCkgKyAocm91bmRVcCA/IFJPVU5EVVBfTUlMTElTIDogMCksCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG1vZGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZkluLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgYWxsIHBhcmVudCBkaXJzIG9mIGEgZ2l2ZW4gZW50cnkgaGF2ZSBiZWVuIGFkZGVkLgorICAgICAqIEBwYXJhbSBiYXNlRGlyIHRoZSBiYXNlIGRpcmVjdG9yeSB0byB1c2UgKG1heSBiZSBudWxsKQorICAgICAqIEBwYXJhbSBlbnRyeSAgIHRoZSBlbnRyeSBuYW1lIHRvIGNyZWF0ZSBkaXJlY3RvcmllcyBmcm9tCisgICAgICogQHBhcmFtIHpPdXQgICAgdGhlIHN0cmVhbSB0byB3cml0ZSB0bworICAgICAqIEBwYXJhbSBwcmVmaXggIGEgcHJlZml4IHRvIHBsYWNlIG9uIHRoZSBjcmVhdGVkIGVudHJpZXMKKyAgICAgKiBAcGFyYW0gZGlyTW9kZSB0aGUgZGlyZWN0b3J5IG1vZGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFBhcmVudERpcnMoRmlsZSBiYXNlRGlyLCBTdHJpbmcgZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0gek91dCwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJNb2RlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWRvRmlsZXNvbmx5KSB7CisgICAgICAgICAgICBTdGFjayBkaXJlY3RvcmllcyA9IG5ldyBTdGFjaygpOworICAgICAgICAgICAgaW50IHNsYXNoUG9zID0gZW50cnkubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIHdoaWxlICgoc2xhc2hQb3MgPSBlbnRyeS5sYXN0SW5kZXhPZignLycsIHNsYXNoUG9zIC0gMSkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRpciA9IGVudHJ5LnN1YnN0cmluZygwLCBzbGFzaFBvcyArIDEpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZERpcnMuZ2V0KHByZWZpeCArIGRpcikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMucHVzaChkaXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoIWRpcmVjdG9yaWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSAoU3RyaW5nKSBkaXJlY3Rvcmllcy5wb3AoKTsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGJhc2VEaXIsIGRpcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGRpcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHppcERpcihmLCB6T3V0LCBwcmVmaXggKyBkaXIsIGRpck1vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8gYW55IGNsZWFuIHVwIG5lY2Vzc2FyeSB0byBhbGxvdyB0aGlzIGluc3RhbmNlIHRvIGJlIHVzZWQgYWdhaW4uCisgICAgICoKKyAgICAgKiA8cD5XaGVuIHdlIGdldCBoZXJlLCB0aGUgWmlwIGZpbGUgaGFzIGJlZW4gY2xvc2VkIGFuZCBhbGwgd2UKKyAgICAgKiBuZWVkIHRvIGRvIGlzIHRvIHJlc2V0IHNvbWUgZ2xvYmFscy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCB3aWxsIG9ubHkgcmVzZXQgZ2xvYmFscyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkCisgICAgICogZHVyaW5nIGV4ZWN1dGUoKSwgaXQgd2lsbCBub3QgYWx0ZXIgdGhlIGF0dHJpYnV0ZXMgb3IgbmVzdGVkCisgICAgICogY2hpbGQgZWxlbWVudHMuICBJZiB5b3Ugd2FudCB0byByZXNldCB0aGUgaW5zdGFuY2Ugc28gdGhhdCB5b3UKKyAgICAgKiBjYW4gbGF0ZXIgemlwIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2V0IG9mIGZpbGVzLCB5b3UgbXVzdCB1c2UKKyAgICAgKiB0aGUgcmVzZXQgbWV0aG9kLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI3Jlc2V0CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYW5VcCgpIHsKKyAgICAgICAgYWRkZWREaXJzLmNsZWFyKCk7CisgICAgICAgIGFkZGVkRmlsZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgZW50cmllcy5jbGVhcigpOworICAgICAgICBhZGRpbmdOZXdGaWxlcyA9IGZhbHNlOworICAgICAgICBkb1VwZGF0ZSA9IHNhdmVkRG9VcGRhdGU7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBmaWxlc2V0c0Zyb21Hcm91cGZpbGVzZXRzLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBaaXBGaWxlU2V0IHpmID0gKFppcEZpbGVTZXQpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5yZW1vdmVFbGVtZW50KHpmKTsKKyAgICAgICAgfQorICAgICAgICBmaWxlc2V0c0Zyb21Hcm91cGZpbGVzZXRzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgdGhpcyBpbnN0YW5jZSByZXNldCBhbGwgYXR0cmlidXRlcyB0byB0aGVpciBkZWZhdWx0CisgICAgICogdmFsdWVzIGFuZCBmb3JnZXQgYWxsIGNoaWxkcmVuLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKgorICAgICAqIEBzZWUgI2NsZWFuVXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgcmVzb3VyY2VzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAgIHppcEZpbGUgPSBudWxsOworICAgICAgICBiYXNlRGlyID0gbnVsbDsKKyAgICAgICAgZ3JvdXBmaWxlc2V0cy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICBkdXBsaWNhdGUgPSAiYWRkIjsKKyAgICAgICAgYXJjaGl2ZVR5cGUgPSAiemlwIjsKKyAgICAgICAgZG9Db21wcmVzcyA9IHRydWU7CisgICAgICAgIGVtcHR5QmVoYXZpb3IgPSAic2tpcCI7CisgICAgICAgIGRvVXBkYXRlID0gZmFsc2U7CisgICAgICAgIGRvRmlsZXNvbmx5ID0gZmFsc2U7CisgICAgICAgIGVuY29kaW5nID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpcyB0aGUgcmVzb3VyY2UgYXJyYXlzIGFyZSBlbXB0eS4KKyAgICAgKiBAcGFyYW0gciB0aGUgYXJyYXlzIHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIGFsbCBpbmRpdmlkdWFsIGFycmF5cyBhcmUgZW1wdHkKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNFbXB0eShSZXNvdXJjZVtdW10gcikgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChyW2ldLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJvcHMgYWxsIG5vbi1maWxlIHJlc291cmNlcyBmcm9tIHRoZSBnaXZlbiBhcnJheS4KKyAgICAgKiBAcGFyYW0gb3JpZyB0aGUgcmVzb3VyY2VzIHRvIGZpbHRlcgorICAgICAqIEByZXR1cm4gdGhlIGZpbHRlcnMgcmVzb3VyY2VzCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VbXSBzZWxlY3RGaWxlUmVzb3VyY2VzKFJlc291cmNlW10gb3JpZykgeworICAgICAgICBpZiAob3JpZy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG9yaWc7CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3Iob3JpZy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9yaWcubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghb3JpZ1tpXS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KG9yaWdbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coIklnbm9yaW5nIGRpcmVjdG9yeSAiICsgb3JpZ1tpXS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFzIG9ubHkgZmlsZXMgd2lsbCBiZSBhZGRlZC4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh2LnNpemUoKSAhPSBvcmlnLmxlbmd0aCkgeworICAgICAgICAgICAgUmVzb3VyY2VbXSByID0gbmV3IFJlc291cmNlW3Yuc2l6ZSgpXTsKKyAgICAgICAgICAgIHYuY29weUludG8ocik7CisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3JpZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3NzaWJsZSBiZWhhdmlvcnMgd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGFkZGVkOgorICAgICAqICJhZGQiLCAicHJlc2VydmUiIG9yICJmYWlsIgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRHVwbGljYXRlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzKCkKKyAgICAgICAgICovCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiYWRkIiwgInByZXNlcnZlIiwgImZhaWwifTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhvbGRzIHRoZSB1cC10by1kYXRlIHN0YXR1cyBhbmQgdGhlIG91dC1vZi1kYXRlIHJlc291cmNlcyBvZgorICAgICAqIHRoZSBvcmlnaW5hbCBhcmNoaXZlLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUuMworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXJjaGl2ZVN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG91dE9mRGF0ZTsKKyAgICAgICAgcHJpdmF0ZSBSZXNvdXJjZVtdW10gcmVzb3VyY2VzVG9BZGQ7CisKKyAgICAgICAgQXJjaGl2ZVN0YXRlKGJvb2xlYW4gc3RhdGUsIFJlc291cmNlW11bXSByKSB7CisgICAgICAgICAgICBvdXRPZkRhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHJlc291cmNlc1RvQWRkID0gcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIG91dG9mZGF0ZSBzdGF0dXMuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG91dG9mZGF0ZSBzdGF0dXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzT3V0T2ZEYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG91dE9mRGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHJlc291cmNlcyB0byBhZGQuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlcyB0byBhZGQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZVtdW10gZ2V0UmVzb3VyY2VzVG9BZGQoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzVG9BZGQ7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIGZpbmQgb3V0IGlmIHRoZXJlIGFyZSBhYnNvbHV0ZWx5IG5vIHJlc291cmNlcyB0byBhZGQKKyAgICAgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG5vIHJlc291cmNlcyB0byBhZGQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV2l0aG91dEFueVJlc291cmNlcygpIHsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXNUb0FkZCA9PSBudWxsKSAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCByZXNvdXJjZXNUb0FkZC5sZW5ndGg7IGNvdW50ZXIrKykgeworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNUb0FkZFtjb3VudGVyXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNUb0FkZFtjb3VudGVyXS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9BcHRDb21waWxlckFkYXB0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9BcHRDb21waWxlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTlkZjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0FwdENvbXBpbGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKworLyoqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFwdCBjb21waWxlciBmb3IgSkRLIDEuNQorICogPHAvPgorICogQXMgdXN1YWwsIHRoZSBsb3cgbGV2ZWwgZW50cnkgcG9pbnRzIGZvciBKYXZhIHRvb2xzIGFyZSBuZWl0aGVyIGRvY3VtZW50ZWQgb3IKKyAqIHN0YWJsZTsgdGhpcyBlbnRyeSBwb2ludCBtYXkgY2hhbmdlIGZyb20gdGhhdCBvZiAxLjUuMF8wMS1iMDggd2l0aG91dCBhbnkKKyAqIHdhcm5pbmcgYXQgYWxsLiBUaGUgSURFIGRlY29tcGlsZSBvZiB0aGUgdG9vbCBlbnRyeSBwb2ludHMgaXMgYXMgZm9sbG93czoKKyAqIDxwcmU+CisgKiBwdWJsaWMgY2xhc3MgTWFpbiB7CisgKiBwdWJsaWMgTWFpbigpIDsKKyAqIDxwLz4KKyAqIHB1YmxpYyBzdGF0aWMgdHJhbnNpZW50IHZvaWQgbWFpbihTdHJpbmcuLi4gc3RyaW5ncykgOworICogPHAvPgorICogcHVibGljIHN0YXRpYyB0cmFuc2llbnQgaW50IHByb2Nlc3MoU3RyaW5nLi4uIHN0cmluZ3MpOworICogPHAvPgorICogcHVibGljIHN0YXRpYyB0cmFuc2llbnQgaW50IHByb2Nlc3MoUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIsCisgKiAgICAgIFN0cmluZy4uLiBzdHJpbmdzKSA7CisgKiBwdWJsaWMgc3RhdGljIHRyYW5zaWVudCBpbnQgcHJvY2VzcygKKyAqICAgICAgQW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnkgYW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnksCisgKiAgICAgIFN0cmluZy4uLiBzdHJpbmdzKSA7CisgKiA8cC8+CisgKiBwdWJsaWMgc3RhdGljIHRyYW5zaWVudCBpbnQgcHJvY2VzcygKKyAqICAgICAgQW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnkgYW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnksCisgKiAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyLAorICogICAgICBTdHJpbmcuLi4gc3RyaW5ncyk7CisgKiBwcml2YXRlIHN0YXRpYyB0cmFuc2llbnQgaW50IHByb2Nlc3NpbmcoCisgKiAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5IGFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5LAorICogICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciwKKyAqICAgICAgU3RyaW5nLi4uIHN0cmluZ3MpIDsKKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIFRoaXMgQWRhcHRlciBpcyBkZXNpZ25lZCB0byBydW4gQXB0IGluLUpWTSwgYW4gb3B0aW9uIHRoYXQgaXMgbm90IGFjdHVhbGx5CisgKiBleHBvc2VkIHRvIGVuZC11c2VycywgYmVjYXVzZSBpdCB3YXMgdG9vIGJyaXR0bGUgZHVyaW5nIGJldGEgdGVzdGluZzsgY2xhc3NwYXRoCisgKiBwcm9ibGVtcyBiZWluZyB0aGUgY29yZSBpc3N1ZS4KKyAqCisgKgorICoKKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBBcHRDb21waWxlckFkYXB0ZXIgZXh0ZW5kcyBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyIHsKKworICAgIC8qKgorICAgICAqIEludGVnZXIgcmV0dXJuZWQgYnkgdGhlIEFwdCBjb21waWxlciB0byBpbmRpY2F0ZSBzdWNjZXNzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFRfQ09NUElMRVJfU1VDQ0VTUyA9IDA7CisgICAgLyoqCisgICAgICogY2xhc3MgaW4gdG9vbHMuamFyIHRoYXQgaW1wbGVtZW50cyBBUFQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFRfRU5UUllfUE9JTlQgPSAiY29tLnN1bi50b29scy5hcHQuTWFpbiI7CisKKyAgICAvKioKKyAgICAgKiBtZXRob2QgdXNlZCB0byBjb21waWxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQVF9NRVRIT0RfTkFNRSA9ICJwcm9jZXNzIjsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmFjYWRlIHRhc2sgdGhhdCBmcm9udHMgdGhpcyBhZGFwdGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRhc2sgaW5zdGFuY2UKKyAgICAgKiBAc2VlIERlZmF1bHRDb21waWxlckFkYXB0ZXIjZ2V0SmF2YWMoKQorICAgICAqLworICAgIHByb3RlY3RlZCBBcHQgZ2V0QXB0KCkgeworICAgICAgICByZXR1cm4gKEFwdCkgZ2V0SmF2YWMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2luZyB0aGUgZnJvbnQgZW5kIGFyZ3VtZW50cywgc2V0IHVwIHRoZSBjb21tYW5kIGxpbmUgdG8gcnVuIEFwdAorICAgICAqCisgICAgICogQHBhcmFtIGFwdCB0YXNrCisgICAgICogQHBhcmFtIGNtZCBjb21tYW5kIHRoYXQgaXMgc2V0IHVwIHdpdGggdGhlIHZhcmlvdXMgc3dpdGNoZXMgZnJvbSB0aGUgdGFzaworICAgICAqICAgICAgICAgICAgb3B0aW9ucworICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNldEFwdENvbW1hbmRsaW5lU3dpdGNoZXMoQXB0IGFwdCwgQ29tbWFuZGxpbmUgY21kKSB7CisKKyAgICAgICAgaWYgKCFhcHQuaXNDb21waWxlKCkpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbm9jb21waWxlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIHRoZSBmYWN0b3J5IGNsYXNzCisgICAgICAgIFN0cmluZyBmYWN0b3J5ID0gYXB0LmdldEZhY3RvcnkoKTsKKyAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1mYWN0b3J5Iik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShmYWN0b3J5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGZhY3RvcnkgcGF0aAorICAgICAgICBQYXRoIGZhY3RvcnlQYXRoID0gYXB0LmdldEZhY3RvcnlQYXRoKCk7CisgICAgICAgIGlmIChmYWN0b3J5UGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWZhY3RvcnlwYXRoIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGZhY3RvcnlQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgcHJlcHJvY2Vzc0RpciA9IGFwdC5nZXRQcmVwcm9jZXNzRGlyKCk7CisgICAgICAgIGlmIChwcmVwcm9jZXNzRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItcyIpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShwcmVwcm9jZXNzRGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgdGhlIHByb2Nlc3NvciBvcHRpb25zCisgICAgICAgIFZlY3RvciBvcHRpb25zID0gYXB0LmdldE9wdGlvbnMoKTsKKyAgICAgICAgRW51bWVyYXRpb24gZWxlbWVudHMgPSBvcHRpb25zLmVsZW1lbnRzKCk7CisgICAgICAgIEFwdC5PcHRpb24gb3B0OworICAgICAgICBTdHJpbmdCdWZmZXIgYXJnID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKGVsZW1lbnRzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBvcHQgPSAoQXB0Lk9wdGlvbikgZWxlbWVudHMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGFyZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGFyZy5hcHBlbmQoIi1BIikuYXBwZW5kKG9wdC5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKG9wdC5nZXRWYWx1ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhcmcuYXBwZW5kKCI9IikuYXBwZW5kKG9wdC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHVzaW5nIG91ciBmcm9udCBlbmQgdGFzaywgc2V0IHVwIHRoZSBjb21tYW5kIGxpbmUgc3dpdGNoZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29tbWFuZCBsaW5lIHRvIHNldCB1cAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEFwdENvbW1hbmRsaW5lU3dpdGNoZXMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIEFwdCBhcHQgPSBnZXRBcHQoKTsKKyAgICAgICAgc2V0QXB0Q29tbWFuZGxpbmVTd2l0Y2hlcyhhcHQsIGNtZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSBjb21waWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxhdGlvbiBoYXMgcHJvYmxlbXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBhcHQgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgLy9zZXQgdXAgdGhlIGphdmFjIG9wdGlvbnMKKyAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gc2V0dXBNb2Rlcm5KYXZhY0NvbW1hbmQoKTsKKyAgICAgICAgLy90aGVuIGFkZCB0aGUgQXB0IG9wdGlvbnMKKyAgICAgICAgc2V0QXB0Q29tbWFuZGxpbmVTd2l0Y2hlcyhjbWQpOworCisgICAgICAgIC8vZmluYWxseSBpbnZva2UgQVBUCisgICAgICAgIC8vIFVzZSByZWZsZWN0aW9uIHRvIGJlIGFibGUgdG8gYnVpbGQgb24gYWxsIEpES3M6CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShBUFRfRU5UUllfUE9JTlQpOworICAgICAgICAgICAgT2JqZWN0IGNvbXBpbGVyID0gYy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgTWV0aG9kIGNvbXBpbGUgPSBjLmdldE1ldGhvZChBUFRfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyhuZXcgU3RyaW5nW117fSkuZ2V0Q2xhc3MoKX0pOworICAgICAgICAgICAgaW50IHJlc3VsdCA9ICgoSW50ZWdlcikgY29tcGlsZS5pbnZva2UKKyAgICAgICAgICAgICAgICAgICAgKGNvbXBpbGVyLCBuZXcgT2JqZWN0W117Y21kLmdldEFyZ3VtZW50cygpfSkpCisgICAgICAgICAgICAgICAgICAgIC5pbnRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPT0gQVBUX0NPTVBJTEVSX1NVQ0NFU1MpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgLy9yZXRocm93IGJ1aWxkIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgIHRocm93IGJlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vY2FzdCBldmVyeXRoaW5nIGVsc2UgdG8gYSBidWlsZCBleGNlcHRpb24KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igc3RhcnRpbmcgYXB0IGNvbXBpbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgZXgsIGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9BcHRFeHRlcm5hbENvbXBpbGVyQWRhcHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0FwdEV4dGVybmFsQ29tcGlsZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkYjU1YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9BcHRFeHRlcm5hbENvbXBpbGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFwdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFwdCBjb21waWxlciBmb3IgSkRLIDEuNSB1c2luZyBhbiBleHRlcm5hbCBwcm9jZXNzCisgKgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEFwdEV4dGVybmFsQ29tcGlsZXJBZGFwdGVyIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmFjYWRlIHRhc2sgdGhhdCBmcm9udHMgdGhpcyBhZGFwdGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRhc2sgaW5zdGFuY2UKKyAgICAgKiBAc2VlIERlZmF1bHRDb21waWxlckFkYXB0ZXIjZ2V0SmF2YWMoKQorICAgICAqLworICAgIHByb3RlY3RlZCBBcHQgZ2V0QXB0KCkgeworICAgICAgICByZXR1cm4gKEFwdCkgZ2V0SmF2YWMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGNvbXBpbGUgdXNpbmcgdGhlIEphdmFjIGV4dGVybmFsbHkuCisgICAgICogQHJldHVybiB0cnVlICB0aGUgY29tcGlsYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBleHRlcm5hbCBhcHQgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworCisgICAgICAgIC8vIFNldHVwIHRoZSBhcHQgZXhlY3V0YWJsZQorICAgICAgICBBcHQgYXB0ID0gZ2V0QXB0KCk7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZShhcHQuZ2V0QXB0RXhlY3V0YWJsZSgpKTsKKyAgICAgICAgc2V0dXBNb2Rlcm5KYXZhY0NvbW1hbmRsaW5lU3dpdGNoZXMoY21kKTsKKyAgICAgICAgQXB0Q29tcGlsZXJBZGFwdGVyLnNldEFwdENvbW1hbmRsaW5lU3dpdGNoZXMoYXB0LCBjbWQpOworICAgICAgICBpbnQgZmlyc3RGaWxlTmFtZSA9IGNtZC5zaXplKCk7CisgICAgICAgIC8vYWRkIHRoZSBmaWxlcworICAgICAgICBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShjbWQpOworCisgICAgICAgIC8vcnVuCisgICAgICAgIHJldHVybiAwID09IGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoY21kLmdldENvbW1hbmRsaW5lKCksCisgICAgICAgICAgICAgICAgZmlyc3RGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICB0cnVlKTsKKworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvQ29tcGlsZXJBZGFwdGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvQ29tcGlsZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyNzViOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9Db21waWxlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWM7CisKKy8qKgorICogVGhlIGludGVyZmFjZSB0aGF0IGFsbCBjb21waWxlciBhZGFwdGVycyBtdXN0IGFkaGVyZSB0by4KKyAqCisgKiA8cD5BIGNvbXBpbGVyIGFkYXB0ZXIgaXMgYW4gYWRhcHRlciB0aGF0IGludGVycHJldHMgdGhlIGphdmFjJ3MKKyAqIHBhcmFtZXRlcnMgaW4gcHJlcGFyYXRpb24gdG8gYmUgcGFzc2VkIG9mZiB0byB0aGUgY29tcGlsZXIgdGhpcworICogYWRhcHRlciByZXByZXNlbnRzLiAgQXMgYWxsIHRoZSBuZWNlc3NhcnkgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlCisgKiBKYXZhYyB0YXNrIGl0c2VsZiwgdGhlIG9ubHkgdGhpbmcgYWxsIGFkYXB0ZXJzIG5lZWQgaXMgdGhlIGphdmFjCisgKiB0YXNrLCB0aGUgZXhlY3V0ZSBjb21tYW5kIGFuZCBhIHBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IgKGZvcgorICogcmVmbGVjdGlvbikuPC9wPgorICoKKyAqIEBzaW5jZSBBbnQgMS4zCisgKi8KKworcHVibGljIGludGVyZmFjZSBDb21waWxlckFkYXB0ZXIgeworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29tcGlsZXIgYXR0cmlidXRlcywgd2hpY2ggYXJlIHN0b3JlZCBpbiB0aGUgSmF2YWMgdGFzay4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgY29tcGlsZXIgYXR0cmlidXRlcworICAgICAqLworICAgIHZvaWQgc2V0SmF2YWMoSmF2YWMgYXR0cmlidXRlcyk7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaGFzIHRoZSBjb21waWxhdGlvbiBiZWVuIHN1Y2Nlc3NmdWwKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0NvbXBpbGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9Db21waWxlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmMmJiNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9Db21waWxlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5DbGFzc3BhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKKworLyoqCisgKiBDcmVhdGVzIHRoZSBuZWNlc3NhcnkgY29tcGlsZXIgYWRhcHRlciwgZ2l2ZW4gYmFzaWMgY3JpdGVyaWEuCisgKgorICogQHNpbmNlIEFudCAxLjMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbXBpbGVyQWRhcHRlckZhY3RvcnkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFUk5fQ09NUElMRVIgPSAiY29tLnN1bi50b29scy5qYXZhYy5NYWluIjsKKworICAgIC8qKiBUaGlzIGlzIGEgc2luZ2xldG9uIC0tIGNhbid0IGNyZWF0ZSBpbnN0YW5jZXMhISAqLworICAgIHByaXZhdGUgQ29tcGlsZXJBZGFwdGVyRmFjdG9yeSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlZCBvbiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiwgdGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5CisgICAgICogZmFjdG9yeSBkZXNpcmVkLgorICAgICAqCisgICAgICogVGhlIGN1cnJlbnQgbWFwcGluZyBmb3IgY29tcGlsZXIgbmFtZXMgYXJlIGFzIGZvbGxvd3M6CisgICAgICogPHVsPjxsaT5qaWtlcyA9IGppa2VzIGNvbXBpbGVyCisgICAgICogPGxpPmNsYXNzaWMsIGphdmFjMS4xLCBqYXZhYzEuMiA9IHRoZSBzdGFuZGFyZCBjb21waWxlciBmcm9tIEpESworICAgICAqIDEuMS8xLjIKKyAgICAgKiA8bGk+bW9kZXJuLCBqYXZhYzEuMywgamF2YWMxLjQsIGphdmFjMS41ID0gdGhlIGNvbXBpbGVyIG9mIEpESyAxLjMrCisgICAgICogPGxpPmp2YywgbWljcm9zb2Z0ID0gdGhlIGNvbW1hbmQgbGluZSBjb21waWxlciBmcm9tIE1pY3Jvc29mdCdzIFNESworICAgICAqIGZvciBKYXZhIC8gVmlzdWFsIEorKworICAgICAqIDxsaT5ramMgPSB0aGUga29waSBjb21waWxlcjwvbGk+CisgICAgICogPGxpPmdjaiA9IHRoZSBnY2ogY29tcGlsZXIgZnJvbSBnY2M8L2xpPgorICAgICAqIDxsaT5zaiwgc3ltYW50ZWMgPSB0aGUgU3ltYW50ZWMgSmF2YSBjb21waWxlcjwvbGk+CisgICAgICogPGxpPjxpPmEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZTwvaT4gPSB0aGUgbmFtZSBvZiBhIGNvbXBpbGVyCisgICAgICogYWRhcHRlcgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGlsZXJUeXBlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjb21waWxlciwgb3IgdGhlCisgICAgICogZnVsbCBjbGFzc25hbWUgb2YgdGhlIGNvbXBpbGVyJ3MgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gdGFzayBhIHRhc2sgdG8gbG9nIHRocm91Z2guCisgICAgICogQHJldHVybiB0aGUgY29tcGlsZXIgYWRhcHRlcgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbXBpbGVyIHR5cGUgY291bGQgbm90IGJlIHJlc29sdmVkIGludG8KKyAgICAgKiBhIGNvbXBpbGVyIGFkYXB0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21waWxlckFkYXB0ZXIgZ2V0Q29tcGlsZXIoU3RyaW5nIGNvbXBpbGVyVHlwZSwgVGFzayB0YXNrKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgYm9vbGVhbiBpc0NsYXNzaWNDb21waWxlclN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAvL2FzIG5ldyB2ZXJzaW9ucyBvZiBqYXZhIGNvbWUgb3V0LCBhZGQgdGhlbSB0byB0aGlzIHRlc3QKKyAgICAgICAgICAgIGlmICghSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV8yKQorICAgICAgICAgICAgICAgICYmICFKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzMpKSB7CisgICAgICAgICAgICAgICAgaXNDbGFzc2ljQ29tcGlsZXJTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqaWtlcyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKaWtlcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJleHRKYXZhYyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhY0V4dGVybmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImNsYXNzaWMiKQorICAgICAgICAgICAgICAgIHx8IGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhYzEuMSIpCisgICAgICAgICAgICAgICAgfHwgY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFjMS4yIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNDbGFzc2ljQ29tcGlsZXJTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhYzEyKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGFzay5sb2coIlRoaXMgdmVyc2lvbiBvZiBqYXZhIGRvZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibm90IHN1cHBvcnQgdGhlIGNsYXNzaWMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29tcGlsZXI7IHVwZ3JhZGluZyB0byBtb2Rlcm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyVHlwZSA9ICJtb2Rlcm4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vb24gamF2YTw9MS4zIHRoZSBtb2Rlcm4gZmFsbHMgYmFjayB0byBjbGFzc2ljIGlmIGl0IGlzIG5vdCBmb3VuZAorICAgICAgICAgICAgLy9idXQgb24gamF2YT49MS40IHdlIGp1c3QgYmFpbCBvdXQgZWFybHkKKyAgICAgICAgICAgIGlmIChjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgibW9kZXJuIikKKyAgICAgICAgICAgICAgICB8fCBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YWMxLjMiKQorICAgICAgICAgICAgICAgIHx8IGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhYzEuNCIpCisgICAgICAgICAgICAgICAgfHwgY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFjMS41IikKKyAgICAgICAgICAgICAgICB8fCBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YWMxLjYiKSkgeworICAgICAgICAgICAgICAgIC8vIGRvZXMgdGhlIG1vZGVybiBjb21waWxlciBleGlzdD8KKyAgICAgICAgICAgICAgICBpZiAoZG9lc01vZGVybkNvbXBpbGVyRXhpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFjMTMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNDbGFzc2ljQ29tcGlsZXJTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc2subG9nKCJNb2Rlcm4gY29tcGlsZXIgbm90IGZvdW5kIC0gbG9va2luZyBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2xhc3NpYyBjb21waWxlciIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhYzEyKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIGEgamF2YWMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbXBpbGVyO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTU9ERVJOX0NPTVBJTEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBvbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNsYXNzcGF0aC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJQZXJoYXBzIEpBVkFfSE9NRSBkb2VzIG5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcG9pbnQgdG8gdGhlIEpESy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSXQgaXMgY3VycmVudGx5IHNldCB0byBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBKYXZhRW52VXRpbHMuZ2V0SmF2YUhvbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImp2YyIpCisgICAgICAgICAgICAgICAgfHwgY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoIm1pY3Jvc29mdCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKdmMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgia2pjIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEtqYygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJnY2oiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2NqKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoInNqIikKKyAgICAgICAgICAgICAgICB8fCBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgic3ltYW50ZWMiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2ooKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhc3NOYW1lKGNvbXBpbGVyVHlwZSk7CisgICAgICAgIH0KKworICAgIC8qKgorICAgICAqIHF1ZXJ5IGZvciB0aGUgTW9kZXJuIGNvbXBpbGVyIGV4aXN0aW5nCisgICAgICogQHJldHVybiB0cnVlIGlmIGNsYXNzaWMgb3Mgb24gdGhlIGNsYXNzcGF0aAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9lc01vZGVybkNvbXBpbGVyRXhpc3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKE1PREVSTl9DT01QSUxFUik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIGlmIChjbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNsLmxvYWRDbGFzcyhNT0RFUk5fQ09NUElMRVIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUyKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlIEV4Y2VwdGlvbgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byByZXNvbHZlIHRoZSBnaXZlbiBjbGFzc25hbWUgaW50byBhIGNvbXBpbGVyIGFkYXB0ZXIuCisgICAgICogVGhyb3dzIGEgZml0IGlmIGl0IGNhbid0LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSB0byBiZSBjcmVhdGVkLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gVGhpcyBpcyB0aGUgZml0IHRoYXQgaXMgdGhyb3duIGlmIGNsYXNzTmFtZQorICAgICAqIGlzbid0IGFuIGluc3RhbmNlIG9mIENvbXBpbGVyQWRhcHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb21waWxlckFkYXB0ZXIgcmVzb2x2ZUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKENvbXBpbGVyQWRhcHRlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIENvbXBpbGVyQWRhcHRlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICBDb21waWxlckFkYXB0ZXIuY2xhc3MpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0RlZmF1bHRDb21waWxlckFkYXB0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyNzVjYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7CisKKy8vSmF2YTUgc3R5bGUKKy8vaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzLkxJTkVfU0VQOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTG9jYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ1N0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgQ29tcGlsZXJBZGFwdGVyIGludGVyZmFjZS4KKyAqIEN1cnJlbnRseSwgdGhpcyBpcyBhIGN1dC1hbmQtcGFzdGUgb2YgdGhlIG9yaWdpbmFsIGphdmFjIHRhc2suCisgKgorICogQHNpbmNlIEFudCAxLjMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmF1bHRDb21waWxlckFkYXB0ZXIgaW1wbGVtZW50cyBDb21waWxlckFkYXB0ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT01NQU5EX0xJTkVfTElNSVQgPSA0MDk2OyAgLy8gNEsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwcm90ZWN0ZWQgUGF0aCBzcmM7CisgICAgcHJvdGVjdGVkIEZpbGUgZGVzdERpcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVuY29kaW5nOworICAgIHByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb3B0aW1pemUgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXByZWNhdGlvbiA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIGRlcGVuZCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldDsKKyAgICBwcm90ZWN0ZWQgUGF0aCBib290Y2xhc3NwYXRoOworICAgIHByb3RlY3RlZCBQYXRoIGV4dGRpcnM7CisgICAgcHJvdGVjdGVkIFBhdGggY29tcGlsZUNsYXNzcGF0aDsKKyAgICBwcm90ZWN0ZWQgUGF0aCBjb21waWxlU291cmNlcGF0aDsKKyAgICBwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0OworICAgIHByb3RlY3RlZCBMb2NhdGlvbiBsb2NhdGlvbjsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlQW50UnVudGltZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlSmF2YVJ1bnRpbWU7CisgICAgcHJvdGVjdGVkIFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1lbW9yeU1heGltdW1TaXplOworCisgICAgcHJvdGVjdGVkIEZpbGVbXSBjb21waWxlTGlzdDsKKyAgICBwcm90ZWN0ZWQgSmF2YWMgYXR0cmlidXRlczsKKworICAgIC8vbXVzdCBrZWVwIGZvciBzdWJjbGFzcyBCQywgdGhvdWdoIHVudXNlZDoKKyAgICAvLyBDaGVja1N0eWxlOkNvbnN0YW50TmFtZUNoZWNrIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbFNlcCA9IFN0cmluZ1V0aWxzLkxJTkVfU0VQOworCisgICAgLy8gQ2hlY2tTdHlsZTpDb25zdGFudE5hbWVDaGVjayBPTgorICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEphdmFjIGluc3RhbmNlIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25maWd1cmVkIGNvbXBpbGF0aW9uCisgICAgICogYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGEgY29uZmlndXJlZCBKYXZhYyB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEphdmFjKEphdmFjIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICAgICAgc3JjID0gYXR0cmlidXRlcy5nZXRTcmNkaXIoKTsKKyAgICAgICAgZGVzdERpciA9IGF0dHJpYnV0ZXMuZ2V0RGVzdGRpcigpOworICAgICAgICBlbmNvZGluZyA9IGF0dHJpYnV0ZXMuZ2V0RW5jb2RpbmcoKTsKKyAgICAgICAgZGVidWcgPSBhdHRyaWJ1dGVzLmdldERlYnVnKCk7CisgICAgICAgIG9wdGltaXplID0gYXR0cmlidXRlcy5nZXRPcHRpbWl6ZSgpOworICAgICAgICBkZXByZWNhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0RGVwcmVjYXRpb24oKTsKKyAgICAgICAgZGVwZW5kID0gYXR0cmlidXRlcy5nZXREZXBlbmQoKTsKKyAgICAgICAgdmVyYm9zZSA9IGF0dHJpYnV0ZXMuZ2V0VmVyYm9zZSgpOworICAgICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVzLmdldFRhcmdldCgpOworICAgICAgICBib290Y2xhc3NwYXRoID0gYXR0cmlidXRlcy5nZXRCb290Y2xhc3NwYXRoKCk7CisgICAgICAgIGV4dGRpcnMgPSBhdHRyaWJ1dGVzLmdldEV4dGRpcnMoKTsKKyAgICAgICAgY29tcGlsZUxpc3QgPSBhdHRyaWJ1dGVzLmdldEZpbGVMaXN0KCk7CisgICAgICAgIGNvbXBpbGVDbGFzc3BhdGggPSBhdHRyaWJ1dGVzLmdldENsYXNzcGF0aCgpOworICAgICAgICBjb21waWxlU291cmNlcGF0aCA9IGF0dHJpYnV0ZXMuZ2V0U291cmNlcGF0aCgpOworICAgICAgICBwcm9qZWN0ID0gYXR0cmlidXRlcy5nZXRQcm9qZWN0KCk7CisgICAgICAgIGxvY2F0aW9uID0gYXR0cmlidXRlcy5nZXRMb2NhdGlvbigpOworICAgICAgICBpbmNsdWRlQW50UnVudGltZSA9IGF0dHJpYnV0ZXMuZ2V0SW5jbHVkZWFudHJ1bnRpbWUoKTsKKyAgICAgICAgaW5jbHVkZUphdmFSdW50aW1lID0gYXR0cmlidXRlcy5nZXRJbmNsdWRlamF2YXJ1bnRpbWUoKTsKKyAgICAgICAgbWVtb3J5SW5pdGlhbFNpemUgPSBhdHRyaWJ1dGVzLmdldE1lbW9yeUluaXRpYWxTaXplKCk7CisgICAgICAgIG1lbW9yeU1heGltdW1TaXplID0gYXR0cmlidXRlcy5nZXRNZW1vcnlNYXhpbXVtU2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgSmF2YWMgdGFzayBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21waWxlciBhZGFwdGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIEphdmFjIHRhc2sgaW5zdGFuY2UgdXNlZCBieSB0aGlzIGFkYXB0ZXIuCisgICAgICovCisgICAgcHVibGljIEphdmFjIGdldEphdmFjKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByb2plY3QgdGhpcyBjb21waWxlciBhZGFwdGVyIHdhcyBjcmVhdGVkIGluLgorICAgICAqIEByZXR1cm4gdGhlIG93bmVyIHByb2plY3QKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyB0aGUgY29tcGlsYXRpb24gY2xhc3NwYXRoLgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBpbGF0aW9uIGNsYXNzIHBhdGgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGF0aCBnZXRDb21waWxlQ2xhc3NwYXRoKCkgeworICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOworCisgICAgICAgIC8vIGFkZCBkZXN0IGRpciB0byBjbGFzc3BhdGggc28gdGhhdCBwcmV2aW91c2x5IGNvbXBpbGVkIGFuZAorICAgICAgICAvLyB1bnRvdWNoZWQgY2xhc3NlcyBhcmUgb24gY2xhc3NwYXRoCisKKyAgICAgICAgaWYgKGRlc3REaXIgIT0gbnVsbCAmJiBnZXRKYXZhYygpLmlzSW5jbHVkZURlc3RDbGFzc2VzKCkpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aC5zZXRMb2NhdGlvbihkZXN0RGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbWJpbmUgdGhlIGJ1aWxkIGNsYXNzcGF0aCB3aXRoIHRoZSBzeXN0ZW0gY2xhc3NwYXRoLCBpbiBhbgorICAgICAgICAvLyBvcmRlciBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZSBvZiBidWlsZC5zeXNjbGFzc3BhdGgKKworICAgICAgICBQYXRoIGNwID0gY29tcGlsZUNsYXNzcGF0aDsKKyAgICAgICAgaWYgKGNwID09IG51bGwpIHsKKyAgICAgICAgICAgIGNwID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluY2x1ZGVBbnRSdW50aW1lKSB7CisgICAgICAgICAgICBjbGFzc3BhdGguYWRkRXhpc3RpbmcoY3AuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0IikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEV4aXN0aW5nKGNwLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluY2x1ZGVKYXZhUnVudGltZSkgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEphdmFSdW50aW1lKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIHN3aXRjaGVzLgorICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZQorICAgICAqIEByZXR1cm4gdGhlIGNvbW1hbmQgbGluZQorICAgICAqLworICAgIHByb3RlY3RlZCBDb21tYW5kbGluZSBzZXR1cEphdmFjQ29tbWFuZGxpbmVTd2l0Y2hlcyhDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgcmV0dXJuIHNldHVwSmF2YWNDb21tYW5kbGluZVN3aXRjaGVzKGNtZCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwcm9jZXNzaW5nIGNvbW1vbiB0byBjbGFzc2ljIGFuZAorICAgICAqIG1vZGVybi4gIERvZXNuJ3QgYWRkIHRoZSBmaWxlcyB0byBjb21waWxlLgorICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZQorICAgICAqIEBwYXJhbSB1c2VEZWJ1Z0xldmVsIGlmIHRydWUgc2V0IHNldCB0aGUgZGVidWcgbGV2ZWwgd2l0aCB0aGUgLWcgc3dpdGNoCisgICAgICogQHJldHVybiB0aGUgY29tbWFuZCBsaW5lCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIHNldHVwSmF2YWNDb21tYW5kbGluZVN3aXRjaGVzKENvbW1hbmRsaW5lIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VEZWJ1Z0xldmVsKSB7CisgICAgICAgIFBhdGggY2xhc3NwYXRoID0gZ2V0Q29tcGlsZUNsYXNzcGF0aCgpOworICAgICAgICAvLyBGb3IgLXNvdXJjZXBhdGgsIHVzZSB0aGUgInNvdXJjZXBhdGgiIHZhbHVlIGlmIHByZXNlbnQuCisgICAgICAgIC8vIE90aGVyd2lzZSBkZWZhdWx0IHRvIHRoZSAic3JjZGlyIiB2YWx1ZS4KKyAgICAgICAgUGF0aCBzb3VyY2VwYXRoID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbXBpbGVTb3VyY2VwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZXBhdGggPSBjb21waWxlU291cmNlcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNvdXJjZXBhdGggPSBzcmM7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbWVtb3J5UGFyYW1ldGVyUHJlZml4ID0gYXNzdW1lSmF2YTExKCkgPyAiLUotIiA6ICItSi1YIjsKKyAgICAgICAgaWYgKG1lbW9yeUluaXRpYWxTaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghYXR0cmlidXRlcy5pc0ZvcmtlZEphdmFjKCkpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiU2luY2UgZm9yayBpcyBmYWxzZSwgaWdub3JpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1lbW9yeUluaXRpYWxTaXplIHNldHRpbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobWVtb3J5UGFyYW1ldGVyUHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibXMiICsgbWVtb3J5SW5pdGlhbFNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lbW9yeU1heGltdW1TaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghYXR0cmlidXRlcy5pc0ZvcmtlZEphdmFjKCkpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiU2luY2UgZm9yayBpcyBmYWxzZSwgaWdub3JpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1lbW9yeU1heGltdW1TaXplIHNldHRpbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobWVtb3J5UGFyYW1ldGVyUHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibXgiICsgbWVtb3J5TWF4aW11bVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0Tm93YXJuKCkpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbm93YXJuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVwcmVjYXRpb24pIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZGVwcmVjYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZCIpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShkZXN0RGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItY2xhc3NwYXRoIik7CisKKyAgICAgICAgLy8gSnVzdCBhZGQgInNvdXJjZXBhdGgiIHRvIGNsYXNzcGF0aCAoIGZvciBKREsxLjEgKQorICAgICAgICAvLyBhcyB3ZWxsIGFzICJib290Y2xhc3NwYXRoIiBhbmQgImV4dGRpcnMiCisgICAgICAgIGlmIChhc3N1bWVKYXZhMTEoKSkgeworICAgICAgICAgICAgUGF0aCBjcCA9IG5ldyBQYXRoKHByb2plY3QpOworCisgICAgICAgICAgICBQYXRoIGJwID0gZ2V0Qm9vdENsYXNzUGF0aCgpOworICAgICAgICAgICAgaWYgKGJwLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjcC5hcHBlbmQoYnApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXh0ZGlycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3AuYWRkRXh0ZGlycyhleHRkaXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNwLmFwcGVuZChjbGFzc3BhdGgpOworICAgICAgICAgICAgY3AuYXBwZW5kKHNvdXJjZXBhdGgpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChjcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGNsYXNzcGF0aCk7CisgICAgICAgICAgICAvLyBJZiB0aGUgYnVpbGRmaWxlIHNwZWNpZmllcyBzb3VyY2VwYXRoPSIiLCB0aGVuIGRvbid0CisgICAgICAgICAgICAvLyBvdXRwdXQgYW55IHNvdXJjZXBhdGguCisgICAgICAgICAgICBpZiAoc291cmNlcGF0aC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1zb3VyY2VwYXRoIik7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChzb3VyY2VwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdGFyZ2V0Iik7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGF0aCBicCA9IGdldEJvb3RDbGFzc1BhdGgoKTsKKyAgICAgICAgICAgIGlmIChicC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ib290Y2xhc3NwYXRoIik7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChicCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChleHRkaXJzICE9IG51bGwgJiYgZXh0ZGlycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1leHRkaXJzIik7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChleHRkaXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWVuY29kaW5nIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShlbmNvZGluZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBpZiAodXNlRGVidWdMZXZlbCAmJiAhYXNzdW1lSmF2YTExKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVidWdMZXZlbCA9IGF0dHJpYnV0ZXMuZ2V0RGVidWdMZXZlbCgpOworICAgICAgICAgICAgICAgIGlmIChkZWJ1Z0xldmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1nOiIgKyBkZWJ1Z0xldmVsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGdldE5vRGVidWdBcmd1bWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldE5vRGVidWdBcmd1bWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0aW1pemUpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItTyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlcGVuZCkgeworICAgICAgICAgICAgaWYgKGFzc3VtZUphdmExMSgpKSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kZXBlbmQiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXNzdW1lSmF2YTEyKCkpIHsKKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLVhkZXBlbmQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coImRlcGVuZCBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1vZGVybiBjb21waWxlciIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdmVyYm9zZSIpOworICAgICAgICB9CisKKyAgICAgICAgYWRkQ3VycmVudENvbXBpbGVyQXJncyhjbWQpOworCisgICAgICAgIHJldHVybiBjbWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NpbmcgZm9yIG1vZGVybi4gIERvZXNuJ3QKKyAgICAgKiBhZGQgdGhlIGZpbGVzIHRvIGNvbXBpbGUuCisgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lCisgICAgICogQHJldHVybiB0aGUgY29tbWFuZCBsaW5lCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIHNldHVwTW9kZXJuSmF2YWNDb21tYW5kbGluZVN3aXRjaGVzKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBzZXR1cEphdmFjQ29tbWFuZGxpbmVTd2l0Y2hlcyhjbWQsIHRydWUpOworICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRTb3VyY2UoKSAhPSBudWxsICYmICFhc3N1bWVKYXZhMTMoKSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1zb3VyY2UiKTsKKyAgICAgICAgICAgIFN0cmluZyBzb3VyY2UgPSBhdHRyaWJ1dGVzLmdldFNvdXJjZSgpOworICAgICAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIjEuMSIpIHx8IHNvdXJjZS5lcXVhbHMoIjEuMiIpKSB7CisgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgLXNvdXJjZSAxLjEgYW5kIC1zb3VyY2UgMS4yIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgLy8gYWRkZWQgd2l0aCBKREsgMS40LjIgLSBhbmQgaXNuJ3QgcHJlc2VudCBpbiAxLjUuMAorICAgICAgICAgICAgICAgIC8vIG9yIDEuNi4wIGVpdGhlcgorICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCIxLjMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoc291cmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoYXNzdW1lSmF2YTE1KCkgfHwgYXNzdW1lSmF2YTE2KCkpCisgICAgICAgICAgICAgICAgICAgJiYgYXR0cmlidXRlcy5nZXRUYXJnZXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdCA9IGF0dHJpYnV0ZXMuZ2V0VGFyZ2V0KCk7CisgICAgICAgICAgICBpZiAodC5lcXVhbHMoIjEuMSIpIHx8IHQuZXF1YWxzKCIxLjIiKSB8fCB0LmVxdWFscygiMS4zIikKKyAgICAgICAgICAgICAgICB8fCB0LmVxdWFscygiMS40IikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IHQ7CisgICAgICAgICAgICAgICAgaWYgKHQuZXF1YWxzKCIxLjEiKSkgeworICAgICAgICAgICAgICAgICAgICAvLyAxLjUuMCBkb2Vzbid0IHN1cHBvcnQgLXNvdXJjZSAxLjEKKyAgICAgICAgICAgICAgICAgICAgcyA9ICIxLjIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIiAgICAgICAgICBXQVJOSU5HIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJUaGUgLXNvdXJjZSBzd2l0Y2ggZGVmYXVsdHMgdG8gMS41IGluIEpESyAxLjUgYW5kIDEuNi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJJZiB5b3Ugc3BlY2lmeSAtdGFyZ2V0ICIgKyB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHlvdSBub3cgbXVzdCBhbHNvIHNwZWNpZnkgLXNvdXJjZSAiICsgcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiQW50IHdpbGwgaW1wbGljaXRseSBhZGQgLXNvdXJjZSAiICsgcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgeW91LiAgUGxlYXNlIGNoYW5nZSB5b3VyIGJ1aWxkIGZpbGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXNvdXJjZSIpOworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjbWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NpbmcgZm9yIG1vZGVybiBhbmQgYWRkcworICAgICAqIHRoZSBmaWxlcyB0byBjb21waWxlIGFzIHdlbGwuCisgICAgICogQHJldHVybiB0aGUgY29tbWFuZCBsaW5lCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIHNldHVwTW9kZXJuSmF2YWNDb21tYW5kKCkgeworICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgc2V0dXBNb2Rlcm5KYXZhY0NvbW1hbmRsaW5lU3dpdGNoZXMoY21kKTsKKworICAgICAgICBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShjbWQpOworICAgICAgICByZXR1cm4gY21kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB1cCB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEByZXR1cm4gdGhlIGNvbW1hbmQgbGluZQorICAgICAqLworICAgIHByb3RlY3RlZCBDb21tYW5kbGluZSBzZXR1cEphdmFjQ29tbWFuZCgpIHsKKyAgICAgICAgcmV0dXJuIHNldHVwSmF2YWNDb21tYW5kKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcHJvY2Vzc2luZyBmb3IgY2xhc3NpYyBhbmQgYWRkcworICAgICAqIHRoZSBmaWxlcyB0byBjb21waWxlIGFzIHdlbGwuCisgICAgICogQHBhcmFtIGRlYnVnTGV2ZWxDaGVjayBpZiB0cnVlIHNldCB0aGUgZGVidWcgbGV2ZWwgd2l0aCB0aGUgLWcgc3dpdGNoCisgICAgICogQHJldHVybiB0aGUgY29tbWFuZCBsaW5lCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIHNldHVwSmF2YWNDb21tYW5kKGJvb2xlYW4gZGVidWdMZXZlbENoZWNrKSB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBzZXR1cEphdmFjQ29tbWFuZGxpbmVTd2l0Y2hlcyhjbWQsIGRlYnVnTGV2ZWxDaGVjayk7CisgICAgICAgIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKGNtZCk7CisgICAgICAgIHJldHVybiBjbWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9ncyB0aGUgY29tcGlsYXRpb24gcGFyYW1ldGVycywgYWRkcyB0aGUgZmlsZXMgdG8gY29tcGlsZSBhbmQgbG9ncyB0aGUKKyAgICAgKiAmcXVvdDtuaWNlU291cmNlTGlzdCZxdW90OworICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBhdHRyaWJ1dGVzLmxvZygiQ29tcGlsYXRpb24gIiArIGNtZC5kZXNjcmliZUFyZ3VtZW50cygpLAorICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgbmljZVNvdXJjZUxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWxlIik7CisgICAgICAgIGlmIChjb21waWxlTGlzdC5sZW5ndGggIT0gMSkgeworICAgICAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCJzIik7CisgICAgICAgIH0KKyAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCIgdG8gYmUgY29tcGlsZWQ6Iik7CisKKyAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgYXJnID0gY29tcGlsZUxpc3RbaV0uZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShhcmcpOworICAgICAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCIgICAgIik7CisgICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoYXJnKTsKKyAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIH0KKworICAgICAgICBhdHRyaWJ1dGVzLmxvZyhuaWNlU291cmNlTGlzdC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgY29tcGlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLgorICAgICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHRvIHBhc3MgdG8gcHJvY2VzcyBvbiBjb21tYW5kIGxpbmUKKyAgICAgKiBAcGFyYW0gZmlyc3RGaWxlTmFtZSAtIGluZGV4IG9mIHRoZSBmaXJzdCBzb3VyY2UgZmlsZSBpbiBhcmdzLAorICAgICAqIGlmIHRoZSBpbmRleCBpcyBuZWdhdGl2ZSwgbm8gdGVtcG9yYXJ5IGZpbGUgd2lsbCBldmVyIGJlCisgICAgICogY3JlYXRlZCwgYnV0IHRoaXMgbWF5IGhpdCB0aGUgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdCBvbiB5b3VyCisgICAgICogc3lzdGVtLgorICAgICAqIEByZXR1cm4gdGhlIGV4aXQgY29kZSBvZiB0aGUgY29tcGlsYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoU3RyaW5nW10gYXJncywgaW50IGZpcnN0RmlsZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoYXJncywgZmlyc3RGaWxlTmFtZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG8gdGhlIGNvbXBpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gYXJncyAtIGFyZ3VtZW50cyB0byBwYXNzIHRvIHByb2Nlc3Mgb24gY29tbWFuZCBsaW5lCisgICAgICogQHBhcmFtIGZpcnN0RmlsZU5hbWUgLSBpbmRleCBvZiB0aGUgZmlyc3Qgc291cmNlIGZpbGUgaW4gYXJncywKKyAgICAgKiBpZiB0aGUgaW5kZXggaXMgbmVnYXRpdmUsIG5vIHRlbXBvcmFyeSBmaWxlIHdpbGwgZXZlciBiZQorICAgICAqIGNyZWF0ZWQsIGJ1dCB0aGlzIG1heSBoaXQgdGhlIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXQgb24geW91cgorICAgICAqIHN5c3RlbS4KKyAgICAgKiBAcGFyYW0gcXVvdGVGaWxlcyAtIGlmIHNldCB0byB0cnVlLCBmaWxlbmFtZXMgY29udGFpbmluZworICAgICAqIHNwYWNlcyB3aWxsIGJlIHF1b3RlZCB3aGVuIHRoZXkgYXBwZWFyIGluIHRoZSBleHRlcm5hbCBmaWxlLgorICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gcnVubmluZyBKREsgMS40J3MgamF2YWMgYW5kIHByb2JhYmx5CisgICAgICogb3RoZXJzLgorICAgICAqIEByZXR1cm4gdGhlIGV4aXQgY29kZSBvZiB0aGUgY29tcGlsYXRpb24KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBleGVjdXRlRXh0ZXJuYWxDb21waWxlKFN0cmluZ1tdIGFyZ3MsIGludCBmaXJzdEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHF1b3RlRmlsZXMpIHsKKyAgICAgICAgU3RyaW5nW10gY29tbWFuZEFycmF5ID0gbnVsbDsKKyAgICAgICAgRmlsZSB0bXBGaWxlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE1hbnkgc3lzdGVtIGhhdmUgYmVlbiByZXBvcnRlZCB0byBnZXQgaW50byB0cm91YmxlIHdpdGgKKyAgICAgICAgICAgICAqIGxvbmcgY29tbWFuZCBsaW5lcyAtIG5vLCBub3Qgb25seSBXaW5kb3dzIDstKS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBQT1NJWCBzZWVtcyB0byBkZWZpbmUgYSBsb3dlciBsaW1pdCBvZiA0aywgc28gdXNlIGEgdGVtcG9yYXJ5CisgICAgICAgICAgICAgKiBmaWxlIGlmIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGNvbW1hbmQgbGluZSBleGNlZWRzIHRoaXMgbGltaXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChDb21tYW5kbGluZS50b1N0cmluZyhhcmdzKS5sZW5ndGgoKSA+IENPTU1BTkRfTElORV9MSU1JVAorICAgICAgICAgICAgICAgICYmIGZpcnN0RmlsZU5hbWUgPj0gMCkgeworICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdG1wRmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZXMiLCAiIiwgZ2V0SmF2YWMoKS5nZXRUZW1wZGlyKCksIHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIodG1wRmlsZSkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZmlyc3RGaWxlTmFtZTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdW90ZUZpbGVzICYmIGFyZ3NbaV0uaW5kZXhPZigiICIpID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gYXJnc1tpXS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiXCIiICsgYXJnc1tpXSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZEFycmF5ID0gbmV3IFN0cmluZ1tmaXJzdEZpbGVOYW1lICsgMV07CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgMCwgY29tbWFuZEFycmF5LCAwLCBmaXJzdEZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZEFycmF5W2ZpcnN0RmlsZU5hbWVdID0gIkAiICsgdG1wRmlsZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgdGVtcG9yYXJ5IGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tbWFuZEFycmF5ID0gYXJnczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2dTdHJlYW1IYW5kbGVyKGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKSk7CisgICAgICAgICAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJvcGVudm1zIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9Vc2UgdGhlIFZNIGxhdW5jaGVyIGluc3RlYWQgb2Ygc2hlbGwgbGF1bmNoZXIgb24gVk1TCisgICAgICAgICAgICAgICAgICAgIC8vZm9yIGphdmEKKyAgICAgICAgICAgICAgICAgICAgZXhlLnNldFZNTGF1bmNoZXIodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4ZS5zZXRBbnRSdW4ocHJvamVjdCk7CisgICAgICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkocHJvamVjdC5nZXRCYXNlRGlyKCkpOworICAgICAgICAgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjb21tYW5kQXJyYXkpOworICAgICAgICAgICAgICAgIGV4ZS5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZS5nZXRFeGl0VmFsdWUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHJ1bm5pbmcgIiArIGFyZ3NbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb21waWxlciIsIGUsIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh0bXBGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGV4dGRpcnMgdG8gY2xhc3NwYXRoCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZQorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFVzZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoI2FkZEV4dGRpcnMgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFeHRkaXJzVG9DbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKKyAgICAgICAgY2xhc3NwYXRoLmFkZEV4dGRpcnMoZXh0ZGlycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUgdG8gdXNlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ3VycmVudENvbXBpbGVyQXJncyhDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgY21kLmFkZEFyZ3VtZW50cyhnZXRKYXZhYygpLmdldEN1cnJlbnRDb21waWxlckFyZ3MoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hhbGwgd2UgYXNzdW1lIEpESyAxLjEgY29tbWFuZCBsaW5lIHN3aXRjaGVzPworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBqZGsgMS4xCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMTEoKSB7CisgICAgICAgIHJldHVybiAiamF2YWMxLjEiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaGFsbCB3ZSBhc3N1bWUgSkRLIDEuMiBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CisgICAgICogQHJldHVybiB0cnVlIGlmIGpkayAxLjIKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFzc3VtZUphdmExMigpIHsKKyAgICAgICAgcmV0dXJuICJqYXZhYzEuMiIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpCisgICAgICAgICAgICB8fCAoImNsYXNzaWMiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQorICAgICAgICAgICAgICAgICYmIEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMikpCisgICAgICAgICAgICB8fCAoImV4dEphdmFjIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAmJiBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaGFsbCB3ZSBhc3N1bWUgSkRLIDEuMyBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CisgICAgICogQHJldHVybiB0cnVlIGlmIGpkayAxLjMKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFzc3VtZUphdmExMygpIHsKKyAgICAgICAgcmV0dXJuICJqYXZhYzEuMyIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpCisgICAgICAgICAgICB8fCAoImNsYXNzaWMiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQorICAgICAgICAgICAgICAgICYmIEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMykpCisgICAgICAgICAgICB8fCAoIm1vZGVybiIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpCisgICAgICAgICAgICAgICAgJiYgSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV8zKSkKKyAgICAgICAgICAgIHx8ICgiZXh0SmF2YWMiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQorICAgICAgICAgICAgICAgICYmIEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgMS40IGNvbW1hbmQgbGluZSBzd2l0Y2hlcz8KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgamRrIDEuNAorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMTQoKSB7CisgICAgICAgIHJldHVybiAiamF2YWMxLjQiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQorICAgICAgICAgICAgfHwgKCJjbGFzc2ljIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAmJiBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzQpKQorICAgICAgICAgICAgfHwgKCJtb2Rlcm4iLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQorICAgICAgICAgICAgICAgICYmIEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfNCkpCisgICAgICAgICAgICB8fCAoImV4dEphdmFjIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAmJiBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaGFsbCB3ZSBhc3N1bWUgSkRLIDEuNSBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CisgICAgICogQHJldHVybiB0cnVlIGlmIEpESyAxLjUKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzdW1lSmF2YTE1KCkgeworICAgICAgICByZXR1cm4gImphdmFjMS41Ii5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKKyAgICAgICAgICAgIHx8ICgiY2xhc3NpYyIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpCisgICAgICAgICAgICAgICAgJiYgSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV81KSkKKyAgICAgICAgICAgIHx8ICgibW9kZXJuIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAmJiBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzUpKQorICAgICAgICAgICAgfHwgKCJleHRKYXZhYyIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpCisgICAgICAgICAgICAgICAgJiYgSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV81KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hhbGwgd2UgYXNzdW1lIEpESyAxLjYgY29tbWFuZCBsaW5lIHN3aXRjaGVzPworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBKREsgMS42CisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMTYoKSB7CisgICAgICAgIHJldHVybiAiamF2YWMxLjYiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQorICAgICAgICAgICAgfHwgKCJjbGFzc2ljIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAmJiBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzYpKQorICAgICAgICAgICAgfHwgKCJtb2Rlcm4iLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQorICAgICAgICAgICAgICAgICYmIEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfNikpCisgICAgICAgICAgICB8fCAoImV4dEphdmFjIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAmJiBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzYpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21iaW5lcyBhIHVzZXIgc3BlY2lmaWVkIGJvb3RjbGFzc3BhdGggd2l0aCB0aGUgc3lzdGVtCisgICAgICogYm9vdGNsYXNzcGF0aCB0YWtpbmcgYnVpbGQuc3lzY2xhc3NwYXRoIGludG8gYWNjb3VudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBQYXRoIGluc3RhbmNlIHRoYXQgY29tYmluZXMgdGhlIHVzZXIKKyAgICAgKiBzcGVjaWZpZWQgYW5kIHRoZSBzeXN0ZW0gYm9vdGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGF0aCBnZXRCb290Q2xhc3NQYXRoKCkgeworICAgICAgICBQYXRoIGJwID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIGlmIChib290Y2xhc3NwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJwLmFwcGVuZChib290Y2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnAuY29uY2F0U3lzdGVtQm9vdENsYXNzcGF0aCgiaWdub3JlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFyZ3VtZW50IHRoZSBjb21waWxlciB3YW50cyB0byBzZWUgaWYgdGhlIGRlYnVnIGF0dHJpYnV0ZQorICAgICAqIGhhcyBiZWVuIHNldCB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIDxwPkEgcmV0dXJuIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+IG1lYW5zIG5vIGFyZ3VtZW50IGF0IGFsbC48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuICItZzpub25lIiB1bmxlc3Mgd2UgZXhwZWN0IHRvIGludm9rZSBhIEpESyAxLjEgY29tcGlsZXIuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXROb0RlYnVnQXJndW1lbnQoKSB7CisgICAgICAgIHJldHVybiBhc3N1bWVKYXZhMTEoKSA/IG51bGwgOiAiLWc6bm9uZSI7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvR2NqLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvR2NqLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwZDNmYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9HY2ouamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbXBpbGVyczsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2NqIGNvbXBpbGVyLgorICogVGhpcyBpcyBwcmltYXJpbHkgYSBjdXQtYW5kLXBhc3RlIGZyb20gdGhlIGppa2VzLgorICoKKyAqIEBzaW5jZSBBbnQgMS40CisgKi8KK3B1YmxpYyBjbGFzcyBHY2ogZXh0ZW5kcyBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyIHsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgY29tcGlsZSB1c2luZyB0aGUgZ2NqIGNvbXBpbGVyLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsYXRpb24gc3VjY2VlZGVkCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDb21tYW5kbGluZSBjbWQ7CisgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBnY2ogY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgY21kID0gc2V0dXBHQ0pDb21tYW5kKCk7CisKKyAgICAgICAgaW50IGZpcnN0RmlsZU5hbWUgPSBjbWQuc2l6ZSgpOworICAgICAgICBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShjbWQpOworCisgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhlY3V0ZUV4dGVybmFsQ29tcGlsZShjbWQuZ2V0Q29tbWFuZGxpbmUoKSwgZmlyc3RGaWxlTmFtZSkgPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgdGhlIGdjaiBjb21tYW5kbGluZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgc2V0dXBHQ0pDb21tYW5kKCkgeworICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKKworICAgICAgICAvLyBnY2ogZG9lc24ndCBzdXBwb3J0IGJvb3RjbGFzc3BhdGggZGlyICgtYm9vdGNsYXNzcGF0aCkKKyAgICAgICAgLy8gc28gd2UnbGwgZW11bGF0ZSBpdCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgY29udmVuaWVuY2UuCisgICAgICAgIFBhdGggcCA9IGdldEJvb3RDbGFzc1BhdGgoKTsKKyAgICAgICAgaWYgKHAuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdjaiBkb2Vzbid0IHN1cHBvcnQgYW4gZXh0ZW5zaW9uIGRpciAoLWV4dGRpcikKKyAgICAgICAgLy8gc28gd2UnbGwgZW11bGF0ZSBpdCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgY29udmVuaWVuY2UuCisgICAgICAgIGNsYXNzcGF0aC5hZGRFeHRkaXJzKGV4dGRpcnMpOworCisgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoZ2V0Q29tcGlsZUNsYXNzcGF0aCgpKTsKKworICAgICAgICAvLyBHY2ogaGFzIG5vIG9wdGlvbiBmb3Igc291cmNlLXBhdGggc28gd2UKKyAgICAgICAgLy8gd2lsbCBhZGQgaXQgdG8gY2xhc3NwYXRoLgorICAgICAgICBpZiAoY29tcGlsZVNvdXJjZXBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChjb21waWxlU291cmNlcGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKHNyYyk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZXhlYyA9IGdldEphdmFjKCkuZ2V0RXhlY3V0YWJsZSgpOworICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZShleGVjID09IG51bGwgPyAiZ2NqIiA6IGV4ZWMpOworCisgICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZCIpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShkZXN0RGlyKTsKKworICAgICAgICAgICAgaWYgKCFkZXN0RGlyLmV4aXN0cygpICYmICFkZXN0RGlyLm1rZGlycygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4ndCBtYWtlIG91dHB1dCBkaXJlY3Rvcmllcy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNYXliZSBwZXJtaXNzaW9uIGlzIHdyb25nLiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItY2xhc3NwYXRoIik7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoY2xhc3NwYXRoKTsKKworICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tZW5jb2Rpbmc9IiArIGVuY29kaW5nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZzEiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0aW1pemUpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItTyIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBnY2ogc2hvdWxkIGJlIHNldCBmb3IgZ2VuZXJhdGUgY2xhc3MuCisgICAgICAgICAqIC4uLiBpZiBubyAnY29tcGlsZSB0byBuYXRpdmUnIGFyZ3VtZW50IGlzIHBhc3NlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFpc05hdGl2ZUJ1aWxkKCkpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItQyIpOworICAgICAgICB9CisKKyAgICAgICAgYWRkQ3VycmVudENvbXBpbGVyQXJncyhjbWQpOworCisgICAgICAgIHJldHVybiBjbWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBhbnkgb2YgdGhlIGFyZ3VtZW50cyBnaXZlbiB2aWEgJmx0O2NvbXBpbGVyYXJnJmd0OworICAgICAqIGltcGxpZXMgdGhhdCBjb21waWxhdGlvbiB0byBuYXRpdmUgY29kZSBpcyByZXF1ZXN0ZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIGNvbXBpbGF0aW9uIHRvIG5hdGl2ZSBjb2RlIGlzIHJlcXVlc3RlZAorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZUJ1aWxkKCkgeworICAgICAgICBib29sZWFuIG5hdGl2ZUJ1aWxkID0gZmFsc2U7CisgICAgICAgIFN0cmluZ1tdIGFkZGl0aW9uYWxBcmd1bWVudHMgPSBnZXRKYXZhYygpLmdldEN1cnJlbnRDb21waWxlckFyZ3MoKTsKKyAgICAgICAgaW50IGFyZ3NMZW5ndGggPSAwOworICAgICAgICB3aGlsZSAoIW5hdGl2ZUJ1aWxkICYmIGFyZ3NMZW5ndGggPCBhZGRpdGlvbmFsQXJndW1lbnRzLmxlbmd0aCkgeworICAgICAgICAgICAgaW50IGNvbmZsaWN0TGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHdoaWxlICghbmF0aXZlQnVpbGQKKyAgICAgICAgICAgICAgICAgICAmJiBjb25mbGljdExlbmd0aCA8IENPTkZMSUNUX1dJVEhfREFTSF9DLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIG5hdGl2ZUJ1aWxkID0gKGFkZGl0aW9uYWxBcmd1bWVudHNbYXJnc0xlbmd0aF0uc3RhcnRzV2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDT05GTElDVF9XSVRIX0RBU0hfQ1tjb25mbGljdExlbmd0aF0pKTsKKyAgICAgICAgICAgICAgICBjb25mbGljdExlbmd0aCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnc0xlbmd0aCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYXRpdmVCdWlsZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgW10gQ09ORkxJQ1RfV0lUSF9EQVNIX0MgPSB7CisgICAgICAgICItbyIgLCAiLS1tYWluPSIsICItRCIsICItZmpuaSIsICItTCIKKyAgICB9OworCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWMxMi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjMTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTBmZTcwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjMTIuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisvKioKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgamF2YWMgY29tcGlsZXIgZm9yIEpESyAxLjIKKyAqIFRoaXMgaXMgcHJpbWFyaWx5IGEgY3V0LWFuZC1wYXN0ZSBmcm9tIHRoZSBvcmlnaW5hbCBqYXZhYyB0YXNrIGJlZm9yZSBpdAorICogd2FzIHJlZmFjdG9yZWQuCisgKgorICogQHNpbmNlIEFudCAxLjMKKyAqLworcHVibGljIGNsYXNzIEphdmFjMTIgZXh0ZW5kcyBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0lDX0NPTVBJTEVSX0NMQVNTTkFNRSA9ICJzdW4udG9vbHMuamF2YWMuTWFpbiI7CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIGNvbXBpbGF0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsZXIgcmFuIHdpdGggYSB6ZXJvIGV4aXQgcmVzdWx0IChvaykKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxhdGlvbiBoYXMgcHJvYmxlbXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBjbGFzc2ljIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwSmF2YWNDb21tYW5kKHRydWUpOworCisgICAgICAgIE91dHB1dFN0cmVhbSBsb2dzdHIgPSBuZXcgTG9nT3V0cHV0U3RyZWFtKGF0dHJpYnV0ZXMsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjb21waWxlciwgcmVkaXJlY3Rpbmcgb3V0cHV0IHRvCisgICAgICAgICAgICAvLyB0aGUgcHJvamVjdCBsb2cKKyAgICAgICAgICAgIENsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKENMQVNTSUNfQ09NUElMRVJfQ0xBU1NOQU1FKTsKKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnMgPQorICAgICAgICAgICAgICAgIGMuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge091dHB1dFN0cmVhbS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3N9KTsKKyAgICAgICAgICAgIE9iamVjdCBjb21waWxlcgorICAgICAgICAgICAgICAgID0gY29ucy5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge2xvZ3N0ciwgImphdmFjIn0pOworCisgICAgICAgICAgICAvLyBDYWxsIHRoZSBjb21waWxlKCkgbWV0aG9kCisgICAgICAgICAgICBNZXRob2QgY29tcGlsZSA9IGMuZ2V0TWV0aG9kKCJjb21waWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzIFtdIHtTdHJpbmdbXS5jbGFzc30pOworICAgICAgICAgICAgQm9vbGVhbiBvayA9CisgICAgICAgICAgICAgICAgKEJvb2xlYW4pIGNvbXBpbGUuaW52b2tlKGNvbXBpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Y21kLmdldEFyZ3VtZW50cygpfSk7CisgICAgICAgICAgICByZXR1cm4gb2suYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHVzZSBjbGFzc2ljIGNvbXBpbGVyICwgYXMgaXQgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdCBhdmFpbGFibGUuIFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBBIGNvbW1vbiBzb2x1dGlvbiBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidG8gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgSkFWQV9IT01FIHRvIHlvdXIgamRrIGRpcmVjdG9yeS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJJdCBpcyBjdXJyZW50bHkgc2V0IHRvIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSmF2YUVudlV0aWxzLmdldEphdmFIb21lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSBleDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBzdGFydGluZyBjbGFzc2ljIGNvbXBpbGVyOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCwgbG9jYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGxvZ3N0cik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWMxMy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjMTMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBkZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjMTMuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKworLyoqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGphdmFjIGNvbXBpbGVyIGZvciBKREsgMS4zCisgKiBUaGlzIGlzIHByaW1hcmlseSBhIGN1dC1hbmQtcGFzdGUgZnJvbSB0aGUgb3JpZ2luYWwgamF2YWMgdGFzayBiZWZvcmUgaXQKKyAqIHdhcyByZWZhY3RvcmVkLgorICoKKyAqIEBzaW5jZSBBbnQgMS4zCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhYzEzIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7CisKKyAgICAvKioKKyAgICAgKiBJbnRlZ2VyIHJldHVybmVkIGJ5IHRoZSAiTW9kZXJuIiBqZGsxLjMgY29tcGlsZXIgdG8gaW5kaWNhdGUgc3VjY2Vzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERVJOX0NPTVBJTEVSX1NVQ0NFU1MgPSAwOworCisgICAgLyoqCisgICAgICogUnVuIHRoZSBjb21waWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGVyIHJhbiB3aXRoIGEgemVybyBleGl0IHJlc3VsdCAob2spCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tcGlsYXRpb24gaGFzIHByb2JsZW1zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVXNpbmcgbW9kZXJuIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwTW9kZXJuSmF2YWNDb21tYW5kKCk7CisKKyAgICAgICAgLy8gVXNlIHJlZmxlY3Rpb24gdG8gYmUgYWJsZSB0byBidWlsZCBvbiBhbGwgSkRLcyA+PSAxLjE6CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZSAoImNvbS5zdW4udG9vbHMuamF2YWMuTWFpbiIpOworICAgICAgICAgICAgT2JqZWN0IGNvbXBpbGVyID0gYy5uZXdJbnN0YW5jZSAoKTsKKyAgICAgICAgICAgIE1ldGhvZCBjb21waWxlID0gYy5nZXRNZXRob2QgKCJjb21waWxlIiwKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3MgW10geyhuZXcgU3RyaW5nIFtdIHt9KS5nZXRDbGFzcyAoKX0pOworICAgICAgICAgICAgaW50IHJlc3VsdCA9ICgoSW50ZWdlcikgY29tcGlsZS5pbnZva2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBpbGVyLCBuZXcgT2JqZWN0W10ge2NtZC5nZXRBcmd1bWVudHMoKX0pKQorICAgICAgICAgICAgICAgIC5pbnRWYWx1ZSAoKTsKKyAgICAgICAgICAgIHJldHVybiAocmVzdWx0ID09IE1PREVSTl9DT01QSUxFUl9TVUNDRVNTKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgZXg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igc3RhcnRpbmcgbW9kZXJuIGNvbXBpbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgsIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhY0V4dGVybmFsLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWNFeHRlcm5hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzM0OWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWNFeHRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFBlcmZvcm1zIGEgY29tcGlsZSB1c2luZyBqYXZhYyBleHRlcm5hbGx5LgorICoKKyAqIEBzaW5jZSBBbnQgMS40CisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhY0V4dGVybmFsIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGNvbXBpbGUgdXNpbmcgdGhlIEphdmFjIGV4dGVybmFsbHkuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21waWxhdGlvbiBzdWNjZWVkZWQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBleHRlcm5hbCBqYXZhYyBjb21waWxlciIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZShnZXRKYXZhYygpLmdldEphdmFjRXhlY3V0YWJsZSgpKTsKKyAgICAgICAgaWYgKCFhc3N1bWVKYXZhMTEoKSAmJiAhYXNzdW1lSmF2YTEyKCkpIHsKKyAgICAgICAgICAgIHNldHVwTW9kZXJuSmF2YWNDb21tYW5kbGluZVN3aXRjaGVzKGNtZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXR1cEphdmFjQ29tbWFuZGxpbmVTd2l0Y2hlcyhjbWQsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGludCBmaXJzdEZpbGVOYW1lID0gYXNzdW1lSmF2YTExKCkgPyAtMSA6IGNtZC5zaXplKCk7CisgICAgICAgIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKGNtZCk7CisgICAgICAgIC8vT24gVk1TIHBsYXRmb3JtLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgamF2YSBvcHRpb25zIGZpbGUKKyAgICAgICAgLy9jb250YWluaW5nIHRoZSBhcmd1bWVudHMgYW5kIGNsYXNzcGF0aCBmb3IgdGhlIGphdmFjIGNvbW1hbmQuCisgICAgICAgIC8vVGhlIHNwZWNpYWwgZmlsZSBpcyBzdXBwb3J0ZWQgYnkgdGhlICItViIgc3dpdGNoIG9uIHRoZSBWTVMgSlZNLgorICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm9wZW52bXMiKSkgeworICAgICAgICAgICAgcmV0dXJuIGV4ZWNPblZNUyhjbWQsIGZpcnN0RmlsZU5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoY21kLmdldENvbW1hbmRsaW5lKCksIGZpcnN0RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKQorICAgICAgICAgICAgICAgID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGVscGVyIG1ldGhvZCB0byBleGVjdXRlIG91ciBjb21tYW5kIG9uIFZNUy4KKyAgICAgKiBAcGFyYW0gY21kCisgICAgICogQHBhcmFtIGZpcnN0RmlsZU5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGV4ZWNPblZNUyhDb21tYW5kbGluZSBjbWQsIGludCBmaXJzdEZpbGVOYW1lKSB7CisgICAgICAgIEZpbGUgdm1zRmlsZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2bXNGaWxlID0gSmF2YUVudlV0aWxzLmNyZWF0ZVZtc0phdmFPcHRpb25GaWxlKGNtZC5nZXRBcmd1bWVudHMoKSk7CisgICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kTGluZSA9IHtjbWQuZ2V0RXhlY3V0YWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1WIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtc0ZpbGUuZ2V0UGF0aCgpfTsKKyAgICAgICAgICAgIHJldHVybiAwID09IGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBmb3IgXCItVlwiIHN3aXRjaCIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZSh2bXNGaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmlrZXMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KaWtlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTZiNzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmlrZXMuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKKy8qKgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBqaWtlcyBjb21waWxlci4KKyAqIFRoaXMgaXMgcHJpbWFyaWx5IGEgY3V0LWFuZC1wYXN0ZSBmcm9tIHRoZSBvcmlnaW5hbCBqYXZhYyB0YXNrIGJlZm9yZSBpdAorICogd2FzIHJlZmFjdG9yZWQuCisgKgorICogQHNpbmNlIEFudCAxLjMKKyAqLworcHVibGljIGNsYXNzIEppa2VzIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGNvbXBpbGUgdXNpbmcgdGhlIEppa2VzIGNvbXBpbGVyIGZyb20gSUJNLgorICAgICAqIE1vc3RseSBvZiB0aGlzIGNvZGUgaXMgaWRlbnRpY2FsIHRvIGRvQ2xhc3NpY0NvbXBpbGUoKQorICAgICAqIEhvd2V2ZXIsIGl0IGRvZXMgbm90IHN1cHBvcnQgYWxsIG9wdGlvbnMgbGlrZQorICAgICAqIGV4dGRpcnMsIGRlcHJlY2F0aW9uIGFuZCBzbyBvbiwgYmVjYXVzZQorICAgICAqIHRoZXJlIGlzIG5vIG9wdGlvbiBpbiBqaWtlcyBhbmQgSSBkb24ndCB1bmRlcnN0YW5kCisgICAgICogd2hhdCB0aGV5IHNob3VsZCBkby4KKyAgICAgKgorICAgICAqIEl0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQgd2l0aCBqaWtlcyAmZ3Q7MS4xMC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGF0aW9uIHN1Y2NlZWRlZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgYXR0cmlidXRlcy5sb2coIlVzaW5nIGppa2VzIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gbmV3IENvbW1hbmRsaW5lKCk7CisKKyAgICAgICAgLy8gRm9yIC1zb3VyY2VwYXRoLCB1c2UgdGhlICJzb3VyY2VwYXRoIiB2YWx1ZSBpZiBwcmVzZW50LgorICAgICAgICAvLyBPdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgInNyY2RpciIgdmFsdWUuCisgICAgICAgIFBhdGggc291cmNlcGF0aCA9IG51bGw7CisgICAgICAgIGlmIChjb21waWxlU291cmNlcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBzb3VyY2VwYXRoID0gY29tcGlsZVNvdXJjZXBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzb3VyY2VwYXRoID0gc3JjOworICAgICAgICB9CisgICAgICAgIC8vIElmIHRoZSBidWlsZGZpbGUgc3BlY2lmaWVzIHNvdXJjZXBhdGg9IiIsIHRoZW4gZG9uJ3QKKyAgICAgICAgLy8gb3V0cHV0IGFueSBzb3VyY2VwYXRoLgorICAgICAgICBpZiAoc291cmNlcGF0aC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXNvdXJjZXBhdGgiKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoc291cmNlcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOworCisgICAgICAgIGlmIChib290Y2xhc3NwYXRoID09IG51bGwgfHwgYm9vdGNsYXNzcGF0aC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gbm8gYm9vdGNsYXNzcGF0aCwgdGhlcmVmb3JlLCBnZXQgb25lIGZyb20gdGhlIGphdmEgcnVudGltZQorICAgICAgICAgICAgaW5jbHVkZUphdmFSdW50aW1lID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgYm9vdGNsYXNzcGF0aCBzdGF0ZWQuICBCeSBkZWZhdWx0LCB0aGUKKyAgICAgICAgICAgIC8vIGluY2x1ZGVKYXZhUnVudGltZSBpcyBmYWxzZS4gIElmIHRoZSB1c2VyIGhhcyBzdGF0ZWQgYQorICAgICAgICAgICAgLy8gYm9vdGNsYXNzcGF0aCBhbmQgc2FpZCB0byBpbmNsdWRlIHRoZSBqYXZhIHJ1bnRpbWUsIGl0J3Mgb24KKyAgICAgICAgICAgIC8vIHRoZWlyIGhlYWQhCisgICAgICAgIH0KKyAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChnZXRDb21waWxlQ2xhc3NwYXRoKCkpOworCisgICAgICAgIC8vIGlmIHRoZSB1c2VyIGhhcyBzZXQgSklLRVNQQVRIIHdlIHNob3VsZCBhZGQgdGhlIGNvbnRlbnRzIGFzIHdlbGwKKyAgICAgICAgU3RyaW5nIGppa2VzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamlrZXMuY2xhc3MucGF0aCIpOworICAgICAgICBpZiAoamlrZXNQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQobmV3IFBhdGgocHJvamVjdCwgamlrZXNQYXRoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXh0ZGlycyAhPSBudWxsICYmIGV4dGRpcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1leHRkaXJzIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGV4dGRpcnMpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGV4ZWMgPSBnZXRKYXZhYygpLmdldEV4ZWN1dGFibGUoKTsKKyAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoZXhlYyA9PSBudWxsID8gImppa2VzIiA6IGV4ZWMpOworCisgICAgICAgIGlmIChkZXByZWNhdGlvbikgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kZXByZWNhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3REaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGRlc3REaXIpOworICAgICAgICB9CisKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChjbGFzc3BhdGgpOworCisgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWVuY29kaW5nIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShlbmNvZGluZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBTdHJpbmcgZGVidWdMZXZlbCA9IGF0dHJpYnV0ZXMuZ2V0RGVidWdMZXZlbCgpOworICAgICAgICAgICAgaWYgKGRlYnVnTGV2ZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZzoiICsgZGVidWdMZXZlbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1nOm5vbmUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0aW1pemUpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItTyIpOworICAgICAgICB9CisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXZlcmJvc2UiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVwZW5kKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWRlcGVuZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXRhcmdldCIpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGFyZ2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGFkZFByb3BlcnR5UGFyYW1zKGNtZCk7CisKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0U291cmNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1zb3VyY2UiKTsKKyAgICAgICAgICAgIFN0cmluZyBzb3VyY2UgPSBhdHRyaWJ1dGVzLmdldFNvdXJjZSgpOworICAgICAgICAgICAgaWYgKHNvdXJjZS5lcXVhbHMoIjEuMSIpIHx8IHNvdXJjZS5lcXVhbHMoIjEuMiIpKSB7CisgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgLXNvdXJjZSAxLjEgYW5kIC1zb3VyY2UgMS4yIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgLy8gYWRkZWQgd2l0aCBKREsgMS40LjIsIEppa2VzIGRvZXNuJ3QgbGlrZSBpdAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJKaWtlcyBkb2Vzbid0IHN1cHBvcnQgJy1zb3VyY2UgIiArIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJywgd2lsbCB1c2UgJy1zb3VyY2UgMS4zJyBpbnN0ZWFkIik7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIjEuMyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShzb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFkZEN1cnJlbnRDb21waWxlckFyZ3MoY21kKTsKKworICAgICAgICBpbnQgZmlyc3RGaWxlTmFtZSA9IGNtZC5zaXplKCk7CisKKyAgICAgICAgUGF0aCBib290ID0gZ2V0Qm9vdENsYXNzUGF0aCgpOworICAgICAgICBpZiAoYm9vdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWJvb3RjbGFzc3BhdGgiKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoYm9vdCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKKworICAgICAgICByZXR1cm4gZXhlY3V0ZUV4dGVybmFsQ29tcGlsZShjbWQuZ2V0Q29tbWFuZGxpbmUoKSwgZmlyc3RGaWxlTmFtZSkgPT0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlQYXJhbXMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBYWFgKKyAgICAgICAgICogUGVyaGFwcyB3ZSBzaG91bGRuJ3QgdXNlIHByb3BlcnRpZXMgZm9yIHRoZXNlCisgICAgICAgICAqIHRocmVlIG9wdGlvbnMgKGVtYWNzIG1vZGUsIHdhcm5pbmdzIGFuZCBwZWRhbnRpYyksCisgICAgICAgICAqIGJ1dCBpbmNsdWRlIGl0IGluIHRoZSBqYXZhYyBkaXJlY3RpdmU/CisgICAgICAgICAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBKaWtlcyBoYXMgdGhlIG5pY2UgZmVhdHVyZSB0byBwcmludCBlcnJvcgorICAgICAgICAgKiBtZXNzYWdlcyBpbiBhIGZvcm0gcmVhZGFibGUgYnkgZW1hY3MsIHNvCisgICAgICAgICAqIHRoYXQgZW1hY3MgY2FuIGRpcmVjdGx5IHNldCB0aGUgY3Vyc29yCisgICAgICAgICAqIHRvIHRoZSBwbGFjZSwgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGVtYWNzUHJvcGVydHkgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJidWlsZC5jb21waWxlci5lbWFjcyIpOworICAgICAgICBpZiAoZW1hY3NQcm9wZXJ0eSAhPSBudWxsICYmIFByb2plY3QudG9Cb29sZWFuKGVtYWNzUHJvcGVydHkpKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiK0UiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBKaWtlcyBpc3N1ZXMgbW9yZSB3YXJuaW5ncyB0aGF0IGphdmFjLCBmb3IKKyAgICAgICAgICogZXhhbXBsZSwgd2hlbiB5b3UgaGF2ZSBmaWxlcyBpbiB5b3VyIGNsYXNzcGF0aAorICAgICAgICAgKiB0aGF0IGRvbid0IGV4aXN0LiBBcyB0aGlzIGlzIG9mdGVuIHRoZSBjYXNlLCB0aGVzZQorICAgICAgICAgKiB3YXJuaW5nIGNhbiBiZSBwcmV0dHkgYW5ub3lpbmcuCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgd2FybmluZ3NQcm9wZXJ0eSA9IHByb2plY3QuZ2V0UHJvcGVydHkoImJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzIik7CisgICAgICAgIGlmICh3YXJuaW5nc1Byb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCIhISB0aGUgYnVpbGQuY29tcGlsZXIud2FybmluZ3MgcHJvcGVydHkgaXMgIiArICJkZXByZWNhdGVkLiAhISIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIiEhIFVzZSB0aGUgbm93YXJuIGF0dHJpYnV0ZSBpbnN0ZWFkLiAhISIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgaWYgKCFQcm9qZWN0LnRvQm9vbGVhbih3YXJuaW5nc1Byb3BlcnR5KSkgeworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbm93YXJuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0Tm93YXJuKCkpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbm93YXJuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSmlrZXMgY2FuIGlzc3VlIHBlZGFudGljIHdhcm5pbmdzLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHBlZGFudGljUHJvcGVydHkgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJidWlsZC5jb21waWxlci5wZWRhbnRpYyIpOworICAgICAgICBpZiAocGVkYW50aWNQcm9wZXJ0eSAhPSBudWxsICYmIFByb2plY3QudG9Cb29sZWFuKHBlZGFudGljUHJvcGVydHkpKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiK1AiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBKaWtlcyBzdXBwb3J0cyBzb21ldGhpbmcgaXQgY2FsbHMgImZ1bGwgZGVwZW5kZW5jeQorICAgICAgICAgKiBjaGVja2luZyIsIHNlZSB0aGUgamlrZXMgZG9jdW1lbnRhdGlvbiBmb3IgZGlmZmVyZW5jZXMKKyAgICAgICAgICogYmV0d2VlbiAtZGVwZW5kIGFuZCArRi4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBmdWxsRGVwZW5kUHJvcGVydHkgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJidWlsZC5jb21waWxlci5mdWxsZGVwZW5kIik7CisgICAgICAgIGlmIChmdWxsRGVwZW5kUHJvcGVydHkgIT0gbnVsbAorICAgICAgICAgICAgJiYgUHJvamVjdC50b0Jvb2xlYW4oZnVsbERlcGVuZFByb3BlcnR5KSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIitGIik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KdmMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KdmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODU4NmFiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0p2Yy5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUganZjIGNvbXBpbGVyIGZyb20gbWljcm9zb2Z0LgorICogVGhpcyBpcyBwcmltYXJpbHkgYSBjdXQtYW5kLXBhc3RlIGZyb20gdGhlIG9yaWdpbmFsIGphdmFjIHRhc2sgYmVmb3JlIGl0CisgKiB3YXMgcmVmYWN0b3JlZC4KKyAqCisgKiBAc2luY2UgQW50IDEuMworICovCitwdWJsaWMgY2xhc3MgSnZjIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIGNvbXBpbGF0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsZXIgcmFuIHdpdGggYSB6ZXJvIGV4aXQgcmVzdWx0IChvaykKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxhdGlvbiBoYXMgcHJvYmxlbXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBqdmMgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOworCisgICAgICAgIC8vIGp2YyBkb2Vzbid0IHN1cHBvcnQgYm9vdGNsYXNzcGF0aCBkaXIgKC1ib290Y2xhc3NwYXRoKQorICAgICAgICAvLyBzbyB3ZSdsbCBlbXVsYXRlIGl0IGZvciBjb21wYXRpYmlsaXR5IGFuZCBjb252ZW5pZW5jZS4KKyAgICAgICAgUGF0aCBwID0gZ2V0Qm9vdENsYXNzUGF0aCgpOworICAgICAgICBpZiAocC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKHApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluY2x1ZGVKYXZhUnVudGltZSkgeworICAgICAgICAgICAgLy8ganZjIGRvZXNuJ3Qgc3VwcG9ydCBhbiBleHRlbnNpb24gZGlyICgtZXh0ZGlyKQorICAgICAgICAgICAgLy8gc28gd2UnbGwgZW11bGF0ZSBpdCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgY29udmVuaWVuY2UuCisgICAgICAgICAgICBjbGFzc3BhdGguYWRkRXh0ZGlycyhleHRkaXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoZ2V0Q29tcGlsZUNsYXNzcGF0aCgpKTsKKworICAgICAgICAvLyBqdmMgaGFzIG5vIG9wdGlvbiBmb3Igc291cmNlLXBhdGggc28gd2UKKyAgICAgICAgLy8gd2lsbCBhZGQgaXQgdG8gY2xhc3NwYXRoLgorICAgICAgICBpZiAoY29tcGlsZVNvdXJjZXBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChjb21waWxlU291cmNlcGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKHNyYyk7CisgICAgICAgIH0KKworICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgU3RyaW5nIGV4ZWMgPSBnZXRKYXZhYygpLmdldEV4ZWN1dGFibGUoKTsKKyAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoZXhlYyA9PSBudWxsID8gImp2YyIgOiBleGVjKTsKKworICAgICAgICBpZiAoZGVzdERpciAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiL2QiKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoZGVzdERpcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhlIENsYXNzcGF0aCBiZWZvcmUgdGhlICJpbnRlcm5hbCIgb25lLgorICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiL2NwOnAiKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChjbGFzc3BhdGgpOworCisgICAgICAgIGJvb2xlYW4gbXNFeHRlbnNpb25zID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nIG1zZSA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIuanZjLmV4dGVuc2lvbnMiKTsKKyAgICAgICAgaWYgKG1zZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtc0V4dGVuc2lvbnMgPSBQcm9qZWN0LnRvQm9vbGVhbihtc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1zRXh0ZW5zaW9ucykgeworICAgICAgICAgICAgLy8gRW5hYmxlIE1TLUV4dGVuc2lvbnMgYW5kIC4uLgorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi94LSIpOworICAgICAgICAgICAgLy8gLi4uIGRvIG5vdCBkaXNwbGF5IGEgTWVzc2FnZSBhYm91dCB0aGlzLgorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi9ub21lc3NhZ2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERvIG5vdCBkaXNwbGF5IExvZ28KKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi9ub2xvZ28iKTsKKworICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCIvZyIpOworICAgICAgICB9CisgICAgICAgIGlmIChvcHRpbWl6ZSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi9PIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCIvdmVyYm9zZSIpOworICAgICAgICB9CisKKyAgICAgICAgYWRkQ3VycmVudENvbXBpbGVyQXJncyhjbWQpOworCisgICAgICAgIGludCBmaXJzdEZpbGVOYW1lID0gY21kLnNpemUoKTsKKyAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKKworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoY21kLmdldENvbW1hbmRsaW5lKCksIGZpcnN0RmlsZU5hbWUpID09IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0tqYy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0tqYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjViYTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvS2pjLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVKYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKKy8qKgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKYXZhIGNvbXBpbGVyIGZvciBLSkMuCisgKiBUaGlzIGlzIHByaW1hcmlseSBhIGN1dC1hbmQtcGFzdGUgZnJvbSBKaWtlcy5qYXZhIGFuZAorICogRGVmYXVsdENvbXBpbGVyQWRhcHRlci4KKyAqCisgKiBAc2luY2UgQW50IDEuNAorICovCitwdWJsaWMgY2xhc3MgS2pjIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIGNvbXBpbGF0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsYXRpb24gc3VjY2VlZGVkCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tcGlsYXRpb24gaGFzIHByb2JsZW1zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVXNpbmcga2pjIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwS2pjQ29tbWFuZCgpOworICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZSgiYXQuZG1zLmtqYy5NYWluIik7CisgICAgICAgIEV4ZWN1dGVKYXZhIGVqID0gbmV3IEV4ZWN1dGVKYXZhKCk7CisgICAgICAgIGVqLnNldEphdmFDb21tYW5kKGNtZCk7CisgICAgICAgIHJldHVybiBlai5mb3JrKGdldEphdmFjKCkpID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0dXAga2pjIGNvbW1hbmQgYXJndW1lbnRzLgorICAgICAqIEByZXR1cm4gdGhlIGNvbW1hbmQgbGluZQorICAgICAqLworICAgIHByb3RlY3RlZCBDb21tYW5kbGluZSBzZXR1cEtqY0NvbW1hbmQoKSB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworCisgICAgICAgIC8vIGdlbmVyYXRlIGNsYXNzcGF0aCwgYmVjYXVzZSBramMgZG9lc24ndCBzdXBwb3J0IHNvdXJjZXBhdGguCisgICAgICAgIFBhdGggY2xhc3NwYXRoID0gZ2V0Q29tcGlsZUNsYXNzcGF0aCgpOworCisgICAgICAgIGlmIChkZXByZWNhdGlvbikgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kZXByZWNhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3REaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGRlc3REaXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIGNsc3NwYXRoCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItY2xhc3NwYXRoIik7CisKKyAgICAgICAgUGF0aCBjcCA9IG5ldyBQYXRoKHByb2plY3QpOworCisgICAgICAgIC8vIGtqYyBkb24ndCBoYXZlIGJvb3RjbGFzc3BhdGggb3B0aW9uLgorICAgICAgICBQYXRoIHAgPSBnZXRCb290Q2xhc3NQYXRoKCk7CisgICAgICAgIGlmIChwLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGNwLmFwcGVuZChwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHRkaXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNwLmFkZEV4dGRpcnMoZXh0ZGlycyk7CisgICAgICAgIH0KKworICAgICAgICBjcC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgaWYgKGNvbXBpbGVTb3VyY2VwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNwLmFwcGVuZChjb21waWxlU291cmNlcGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcC5hcHBlbmQoc3JjKTsKKyAgICAgICAgfQorCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoY3ApOworCisgICAgICAgIC8vIGtqYy0xLjVBIGRvZXNuJ3Qgc3VwcG9ydCAtZW5jb2Rpbmcgb3B0aW9uIG5vdy4KKyAgICAgICAgLy8gYnV0IGl0IHdpbGwgYmUgc3VwcG9ydGVkIG5lYXIgdGhlIGZlYXR1cmUuCisgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWVuY29kaW5nIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShlbmNvZGluZyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGltaXplKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLU8yIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi12ZXJib3NlIik7CisgICAgICAgIH0KKworICAgICAgICBhZGRDdXJyZW50Q29tcGlsZXJBcmdzKGNtZCk7CisKKyAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKKyAgICAgICAgcmV0dXJuIGNtZDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL1NqLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvU2ouamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGNjMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL1NqLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbXBpbGVyczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzaiBjb21waWxlci4KKyAqIFVzZXMgdGhlIGRlZmF1bHRzIGZvciBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyCisgKgorICogQHNpbmNlIEFudCAxLjQKKyAqLworcHVibGljIGNsYXNzIFNqIGV4dGVuZHMgRGVmYXVsdENvbXBpbGVyQWRhcHRlciB7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGNvbXBpbGUgdXNpbmcgdGhlIHNqIGNvbXBpbGVyIGZyb20gU3ltYW50ZWMuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21waWxhdGlvbiBzdWNjZWVkZWQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBzeW1hbnRlYyBqYXZhIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gc2V0dXBKYXZhY0NvbW1hbmQoKTsKKyAgICAgICAgU3RyaW5nIGV4ZWMgPSBnZXRKYXZhYygpLmdldEV4ZWN1dGFibGUoKTsKKyAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoZXhlYyA9PSBudWxsID8gInNqIiA6IGV4ZWMpOworCisgICAgICAgIGludCBmaXJzdEZpbGVOYW1lID0gY21kLnNpemUoKSAtIGNvbXBpbGVMaXN0Lmxlbmd0aDsKKworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoY21kLmdldENvbW1hbmRsaW5lKCksIGZpcnN0RmlsZU5hbWUpID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBudWxsIHNpbmNlIHNqIGVpdGhlciBoYXMgLWcgZm9yIGRlYnVnPXRydWUgb3Igbm8KKyAgICAgKiBhcmd1bWVudCBhdCBhbGwuCisgICAgICogQHJldHVybiBudWxsLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vRGVidWdBcmd1bWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQW5kLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmM2VjZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbmQuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqICZsdDthbmQmZ3Q7IGNvbmRpdGlvbiBjb250YWluZXIuCisgKgorICogPHA+SXRlcmF0ZXMgb3ZlciBhbGwgY29uZGl0aW9ucyBhbmQgcmV0dXJucyBmYWxzZSBhcyBzb29uIGFzIG9uZQorICogZXZhbHVhdGVzIHRvIGZhbHNlLjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuNAorICovCitwdWJsaWMgY2xhc3MgQW5kIGV4dGVuZHMgQ29uZGl0aW9uQmFzZSBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIHRoZSBjb250YWluZWQgY29uZGl0aW9ucyBldmFsdWF0ZXMgdG8gdHJ1ZQorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRDb25kaXRpb25zKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBDb25kaXRpb24gYyA9IChDb25kaXRpb24pIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICghYy5ldmFsKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQW50VmVyc2lvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0FudFZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjIwZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0FudFZlcnNpb24uamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5EZXdleURlY2ltYWw7CisKKy8qKgorICogQW4gQW50IHZlcnNpb24gY29uZGl0aW9uLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEFudFZlcnNpb24gZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGF0TGVhc3QgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGV4YWN0bHkgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5bmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSdW4gYXMgYSB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAocHJvcGVydHluYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJ3Byb3BlcnR5JyBtdXN0IGJlIHNldC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXRMZWFzdCAhPSBudWxsIHx8IGV4YWN0bHkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgY29uZGl0aW9uIHZhbHVlcyBhcmUgc2V0LCBldmFsdWF0ZSB0aGUgY29uZGl0aW9uCisgICAgICAgICAgICBpZiAoZXZhbCgpKSB7CisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHByb3BlcnR5bmFtZSwgZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmF3IHRhc2sKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eW5hbWUsIGdldFZlcnNpb24oKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1dGUgdGhlIGNvbmRpdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICBEZXdleURlY2ltYWwgYWN0dWFsID0gZ2V0VmVyc2lvbigpOworICAgICAgICBpZiAobnVsbCAhPSBhdExlYXN0KSB7CisgICAgICAgICAgICByZXR1cm4gYWN0dWFsLmlzR3JlYXRlclRoYW5PckVxdWFsKG5ldyBEZXdleURlY2ltYWwoYXRMZWFzdCkpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IGV4YWN0bHkpIHsKKyAgICAgICAgICAgIHJldHVybiBhY3R1YWwuaXNFcXVhbChuZXcgRGV3ZXlEZWNpbWFsKGV4YWN0bHkpKTsKKyAgICAgICAgfQorICAgICAgICAvL2RlZmF1bHQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhdExlYXN0ICE9IG51bGwgJiYgZXhhY3RseSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG9mIGF0bGVhc3Qgb3IgZXhhY3RseSBtYXkgYmUgc2V0LiIpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsID09IGF0TGVhc3QgJiYgbnVsbCA9PSBleGFjdGx5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9uZSBvZiBhdGxlYXN0IG9yIGV4YWN0bHkgbXVzdCBiZSBzZXQuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0TGVhc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuZXcgRGV3ZXlEZWNpbWFsKGF0TGVhc3QpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGUgJ2F0bGVhc3QnIGF0dHJpYnV0ZSBpcyBub3QgYSBEZXdleSBEZWNpbWFsIGVnIDEuMS4wIDogIgorICAgICAgICAgICAgICAgICAgICArIGF0TGVhc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuZXcgRGV3ZXlEZWNpbWFsKGV4YWN0bHkpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGUgJ2V4YWN0bHknIGF0dHJpYnV0ZSBpcyBub3QgYSBEZXdleSBEZWNpbWFsIGVnIDEuMS4wIDogIgorICAgICAgICAgICAgICAgICAgICArIGV4YWN0bHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEZXdleURlY2ltYWwgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgUHJvamVjdCBwID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgcC5pbml0KCk7CisgICAgICAgIGNoYXJbXSB2ZXJzaW9uU3RyaW5nID0gcC5nZXRQcm9wZXJ0eSgiYW50LnZlcnNpb24iKS50b0NoYXJBcnJheSgpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJvb2xlYW4gZm91bmRGaXJzdERpZ2l0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVyc2lvblN0cmluZy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KHZlcnNpb25TdHJpbmdbaV0pKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHZlcnNpb25TdHJpbmdbaV0pOworICAgICAgICAgICAgICAgIGZvdW5kRmlyc3REaWdpdCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmVyc2lvblN0cmluZ1tpXSA9PSAnLicgJiYgZm91bmRGaXJzdERpZ2l0KSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHZlcnNpb25TdHJpbmdbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcih2ZXJzaW9uU3RyaW5nW2ldKSAmJiBmb3VuZEZpcnN0RGlnaXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERld2V5RGVjaW1hbChzYi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGF0bGVhc3QgYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gdGhlIGF0bGVhc3QgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXRMZWFzdCgpIHsKKyAgICAgICAgcmV0dXJuIGF0TGVhc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdGxlYXN0IGF0dHJpYnV0ZS4KKyAgICAgKiBUaGlzIGlzIG9mIHRoZSBmb3JtIG1ham9yLm1pbm9yLnBvaW50LgorICAgICAqIEZvciBleGFtcGxlIDEuNy4wLgorICAgICAqIEBwYXJhbSBhdExlYXN0IHRoZSB2ZXJzaW9uIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXRMZWFzdChTdHJpbmcgYXRMZWFzdCkgeworICAgICAgICB0aGlzLmF0TGVhc3QgPSBhdExlYXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZXhhY3RseSBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgZXhhY3RseSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeGFjdGx5KCkgeworICAgICAgICByZXR1cm4gZXhhY3RseTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGV4YWN0bHkgYXR0cmlidXRlLgorICAgICAqIFRoaXMgaXMgb2YgdGhlIGZvcm0gbWFqb3IubWlub3IucG9pbnQuCisgICAgICogRm9yIGV4YW1wbGUgMS43LjAuCisgICAgICogQHBhcmFtIGV4YWN0bHkgdGhlIHZlcnNpb24gdG8gY2hlY2sgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGFjdGx5KFN0cmluZyBleGFjdGx5KSB7CisgICAgICAgIHRoaXMuZXhhY3RseSA9IGV4YWN0bHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBob2xkIHRoZSBhbnQgdmVyc2lvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHluYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gaG9sZCB0aGUgYW50IHZlcnNpb24uCisgICAgICogQHBhcmFtIHByb3BlcnR5bmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5bmFtZSkgeworICAgICAgICB0aGlzLnByb3BlcnR5bmFtZSA9IHByb3BlcnR5bmFtZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmFkYmYzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbmRpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGNvbmRpdGlvbnMgdG8gdXNlIGluc2lkZSB0aGUgJmx0O2NvbmRpdGlvbiZndDsgdGFzay4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29uZGl0aW9uIHsKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGNvbmRpdGlvbiB0cnVlPworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbmRpdGlvbkJhc2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb25CYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhZGY0NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb25CYXNlLmphdmEKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkF2YWlsYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DaGVja3N1bTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VcFRvRGF0ZTsKKworLyoqCisgKiBCYXNlY2xhc3MgZm9yIHRoZSAmbHQ7Y29uZGl0aW9uJmd0OyB0YXNrIGFzIHdlbGwgYXMgc2V2ZXJhbAorICogY29uZGl0aW9ucyAtIGVuc3VyZXMgdGhhdCB0aGUgdHlwZXMgb2YgY29uZGl0aW9ucyBpbnNpZGUgdGhlIHRhc2sKKyAqIGFuZCB0aGUgImNvbnRhaW5lciIgY29uZGl0aW9ucyBhcmUgaW4gc3luYy4KKyAqCisgKiBAc2luY2UgQW50IDEuNAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uZGl0aW9uQmFzZSBleHRlbmRzIFByb2plY3RDb21wb25lbnQgeworCisgICAgLyoqCisgICAgICogbmFtZSBvZiB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFza05hbWUgPSAiY29uZGl0aW9uIjsKKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3IgY29uZGl0aW9ucyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIFNpbXBsZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29uZGl0aW9uQmFzZSgpIHsKKyAgICAgICAgdGFza05hbWUgPSAiY29tcG9uZW50IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIHRoZSBuYW1lIG9mIHRoZSB0YXNrIGluIHRoZSB0YXNrIG5hbWUuCisgICAgICogQHBhcmFtIHRhc2tOYW1lIHRoZSBuYW1lIG9mIHRoZSB0YXNrLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIENvbmRpdGlvbkJhc2UoU3RyaW5nIHRhc2tOYW1lKSB7CisgICAgICAgIHRoaXMudGFza05hbWUgPSB0YXNrTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3VudCB0aGUgY29uZGl0aW9ucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjb25kaXRpb25zIGluIHRoZSBjb250YWluZXIKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBjb3VudENvbmRpdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBjb25kaXRpb25zLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlIHRocm91Z2ggYWxsIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIHRvIHVzZSBmb3IgaXRlcmF0aW9uCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBFbnVtZXJhdGlvbiBnZXRDb25kaXRpb25zKCkgeworICAgICAgICByZXR1cm4gY29uZGl0aW9ucy5lbGVtZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgdG8gdXNlIGluIGxvZ2dpbmcgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byB1c2UgaW4gbG9nZ2luZyBtZXNzYWdlcy4KKyAgICAgKiAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy50YXNrTmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSB0byB1c2UgaW4gbG9nZ2luZyBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgdG8gdXNlIGluIGxvZ2dpbmcgbWVzc2FnZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhc2tOYW1lKCkgeworICAgICAgICByZXR1cm4gdGFza05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuICZsdDthdmFpbGFibGUmZ3Q7IGNvbmRpdGlvbi4KKyAgICAgKiBAcGFyYW0gYSBhbiBhdmFpbGFibGUgY29uZGl0aW9uCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEF2YWlsYWJsZShBdmFpbGFibGUgYSkgeworICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQoYSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuICZsdDtjaGVja3N1bSZndDsgY29uZGl0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGMgYSBDaGVja3N1bSBjb25kaXRpb24KKyAgICAgKiBAc2luY2UgMS40LCBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hlY2tzdW0oQ2hlY2tzdW0gYykgeworICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQoYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuICZsdDt1cHRvZGF0ZSZndDsgY29uZGl0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHUgYW4gVXBUb0RhdGUgY29uZGl0aW9uCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFVwdG9kYXRlKFVwVG9EYXRlIHUpIHsKKyAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KHUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiAmbHQ7bm90Jmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbiBhIE5vdCBjb25kaXRpb24KKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTm90KE5vdCBuKSB7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gJmx0O2FuZCZndDsgY29uZGl0aW9uICJjb250YWluZXIiLgorICAgICAqCisgICAgICogQHBhcmFtIGEgYW4gQW5kIGNvbmRpdGlvbgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBbmQoQW5kIGEpIHsKKyAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiAmbHQ7b3ImZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvIGFuIE9yIGNvbmRpdGlvbgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRPcihPciBvKSB7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gJmx0O2VxdWFscyZndDsgY29uZGl0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGUgYW4gRXF1YWxzIGNvbmRpdGlvbgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFcXVhbHMoRXF1YWxzIGUpIHsKKyAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiAmbHQ7b3MmZ3Q7IGNvbmRpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvIGFuIE9zIGNvbmRpdGlvbgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRPcyhPcyBvKSB7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gJmx0O2lzc2V0Jmd0OyBjb25kaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaSBhbiBJc1NldCBjb25kaXRpb24KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZElzU2V0KElzU2V0IGkpIHsKKyAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KGkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiAmbHQ7aHR0cCZndDsgY29uZGl0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGggYW4gSHR0cCBjb25kaXRpb24KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEh0dHAoSHR0cCBoKSB7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSAmbHQ7c29ja2V0Jmd0OyBjb25kaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBhIFNvY2tldCBjb25kaXRpb24KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNvY2tldChTb2NrZXQgcykgeworICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgJmx0O2ZpbGVzbWF0Y2gmZ3Q7IGNvbmRpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0IGEgRmlsZXNNYXRjaCBjb25kaXRpb24KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzTWF0Y2goRmlsZXNNYXRjaCB0ZXN0KSB7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudCh0ZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSAmbHQ7Y29udGFpbnMmZ3Q7IGNvbmRpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0IGEgQ29udGFpbnMgY29uZGl0aW9uCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb250YWlucyhDb250YWlucyB0ZXN0KSB7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudCh0ZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSAmbHQ7aXN0cnVlJmd0OyBjb25kaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdCBhbiBJc1RydWUgY29uZGl0aW9uCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJc1RydWUoSXNUcnVlIHRlc3QpIHsKKyAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KHRlc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhICZsdDtpc2ZhbHNlJmd0OyBjb25kaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdCBhbiBJc0ZhbHNlIGNvbmRpdGlvbgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSXNGYWxzZShJc0ZhbHNlIHRlc3QpIHsKKyAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KHRlc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiAmbHQ7aXNyZWZlcmVuY2UmZ3Q7IGNvbmRpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpIGFuIElzUmVmZXJlbmNlIGNvbmRpdGlvbgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSXNSZWZlcmVuY2UoSXNSZWZlcmVuY2UgaSkgeworICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQoaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuICZsdDtpc2ZpbGVzZWxlY3RlZCZndDsgY29uZGl0aW9uLgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSBjb25kaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJc0ZpbGVTZWxlY3RlZChJc0ZpbGVTZWxlY3RlZCB0ZXN0KSB7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudCh0ZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gYXJiaXRyYXJ5IGNvbmRpdGlvbgorICAgICAqIEBwYXJhbSBjIGEgY29uZGl0aW9uCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoQ29uZGl0aW9uIGMpIHsKKyAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KGMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbnRhaW5zLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQ29udGFpbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMwYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbnRhaW5zLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIElzIG9uZSBzdHJpbmcgcGFydCBvZiBhbm90aGVyIHN0cmluZz8KKyAqCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIENvbnRhaW5zIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZywgc3ViU3RyaW5nOworICAgIHByaXZhdGUgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGluLgorICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZyB0byBzZWFyY2ggaW4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcGFyYW0gc3ViU3RyaW5nIHRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvcgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3Vic3RyaW5nKFN0cmluZyBzdWJTdHJpbmcpIHsKKyAgICAgICAgdGhpcy5zdWJTdHJpbmcgPSBzdWJTdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBzZWFyY2ggaWdub3JpbmcgY2FzZSBvciBub3QuCisgICAgICogQHBhcmFtIGIgaWYgZmFsc2UsIGlnbm9yZSBjYXNlCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNlc2Vuc2l0aXZlKGJvb2xlYW4gYikgeworICAgICAgICBjYXNlU2Vuc2l0aXZlID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3Vic3RyaW5nIGlzIHdpdGhpbiB0aGUgc3RyaW5nCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgYXR0cmlidXRlcyBhcmUgbm90IHNldCBjb3JyZWN0bHkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsIHx8IHN1YlN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJvdGggc3RyaW5nIGFuZCBzdWJzdHJpbmcgYXJlIHJlcXVpcmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpbiBjb250YWlucyIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNhc2VTZW5zaXRpdmUKKyAgICAgICAgICAgID8gc3RyaW5nLmluZGV4T2Yoc3ViU3RyaW5nKSA+IC0xCisgICAgICAgICAgICA6IHN0cmluZy50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc3ViU3RyaW5nLnRvTG93ZXJDYXNlKCkpID4gLTE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0VxdWFscy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0VxdWFscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTQ1NTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vRXF1YWxzLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGUgY29tcGFyaXNvbiBjb25kaXRpb24uCisgKgorICogQHNpbmNlIEFudCAxLjQKKyAqLworcHVibGljIGNsYXNzIEVxdWFscyBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEID0gMSB8IDI7CisKKyAgICBwcml2YXRlIE9iamVjdCBhcmcxLCBhcmcyOworICAgIHByaXZhdGUgYm9vbGVhbiB0cmltID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGNhc2VTZW5zaXRpdmUgPSB0cnVlOworICAgIHByaXZhdGUgaW50IGFyZ3M7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgICogQHBhcmFtIGFyZzEgdGhlIGZpcnN0IGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbnQgMS44CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJnMShPYmplY3QgYXJnMSkgeworICAgICAgICBpZiAoYXJnMSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgc2V0QXJnMSgoU3RyaW5nKSBhcmcxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEFyZzFJbnRlcm5hbChhcmcxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmlyc3Qgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gYTEgdGhlIGZpcnN0IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyZzEoU3RyaW5nIGExKSB7CisgICAgICAgIHNldEFyZzFJbnRlcm5hbChhMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFyZzFJbnRlcm5hbChPYmplY3QgYXJnMSkgeworICAgICAgICB0aGlzLmFyZzEgPSBhcmcxOworICAgICAgICBhcmdzIHw9IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZWNvbmQgYXJndW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIEBzaW5jZSBBbnQgMS44CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJnMihPYmplY3QgYXJnMikgeworICAgICAgICBpZiAoYXJnMiBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgc2V0QXJnMigoU3RyaW5nKSBhcmcyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEFyZzJJbnRlcm5hbChhcmcyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2Vjb25kIHN0cmluZworICAgICAqCisgICAgICogQHBhcmFtIGEyIHRoZSBzZWNvbmQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJnMihTdHJpbmcgYTIpIHsKKyAgICAgICAgc2V0QXJnMkludGVybmFsKGEyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QXJnMkludGVybmFsKE9iamVjdCBhcmcyKSB7CisgICAgICAgIHRoaXMuYXJnMiA9IGFyZzI7CisgICAgICAgIGFyZ3MgfD0gMjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2Ugd2FudCB0byB0cmltIHRoZSBhcmd1bWVudHMgYmVmb3JlIGNvbXBhcmluZyB0aGVtPworICAgICAqIEBwYXJhbSBiIGlmIHRydWUgdHJpbSB0aGUgYXJndW1lbnRzCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmltKGJvb2xlYW4gYikgeworICAgICAgICB0cmltID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgdGhlIGNvbXBhcmlzb24gYmUgY2FzZSBzZW5zaXRpdmU/CisgICAgICogQHBhcmFtIGIgaWYgdHJ1ZSB1c2UgYSBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uICh0aGlzIGlzIHRoZQorICAgICAqICAgICAgICAgIGRlZmF1bHQpCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNlc2Vuc2l0aXZlKGJvb2xlYW4gYikgeworICAgICAgICBjYXNlU2Vuc2l0aXZlID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBlcXVhbAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIG5vdCBzZXQgY29ycmVjdGx5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoYXJncyAmIFJFUVVJUkVEKSAhPSBSRVFVSVJFRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJib3RoIGFyZzEgYW5kIGFyZzIgYXJlIHJlcXVpcmVkIGluIGVxdWFscyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFyZzEgaW5zdGFuY2VvZiBTdHJpbmcgJiYgdHJpbSkgeworICAgICAgICAgICAgYXJnMSA9ICgoU3RyaW5nKSBhcmcxKS50cmltKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZzIgaW5zdGFuY2VvZiBTdHJpbmcgJiYgdHJpbSkgeworICAgICAgICAgICAgYXJnMiA9ICgoU3RyaW5nKSBhcmcyKS50cmltKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZzEgaW5zdGFuY2VvZiBTdHJpbmcgJiYgYXJnMiBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgU3RyaW5nIHMxID0gKFN0cmluZykgYXJnMTsKKyAgICAgICAgICAgIFN0cmluZyBzMiA9IChTdHJpbmcpIGFyZzI7CisgICAgICAgICAgICByZXR1cm4gY2FzZVNlbnNpdGl2ZSA/IHMxLmVxdWFscyhzMikgOiBzMS5lcXVhbHNJZ25vcmVDYXNlKHMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJnMSA9PSBhcmcyIHx8IGFyZzEgIT0gbnVsbCAmJiBhcmcxLmVxdWFscyhhcmcyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vRmlsZXNNYXRjaC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0ZpbGVzTWF0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2ZhZjdkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0ZpbGVzTWF0Y2guamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogQ29tcGFyZXMgdHdvIGZpbGVzIGZvciBlcXVhbGl0eSBiYXNlZCBvbiBzaXplIGFuZAorICogY29udGVudC4gVGltZXN0YW1wcyBhcmUgbm90IGF0IGFsbCBsb29rZWQgYXQuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsZXNNYXRjaCBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgdGhhdCBwcm92aWRlcyB0aGUgZmlsZSBjb21wYXJpc29uIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIGZpbGVzIHRvIGNvbXBhcmUKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZmlsZTEsIGZpbGUyOworCisgICAgcHJpdmF0ZSBib29sZWFuIHRleHRmaWxlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEZpbGUxIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUxIFRoZSBuZXcgRmlsZTEgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlMShGaWxlIGZpbGUxKSB7CisgICAgICAgIHRoaXMuZmlsZTEgPSBmaWxlMTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEZpbGUyIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUyIFRoZSBuZXcgRmlsZTIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlMihGaWxlIGZpbGUyKSB7CisgICAgICAgIHRoaXMuZmlsZTIgPSBmaWxlMjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBpZ25vcmUgbGluZSBlbmRpbmdzIHdoZW4gY29tcGFyaW5nIGZpbGVzLgorICAgICAqIEBwYXJhbSB0ZXh0ZmlsZSB3aGV0aGVyIHRvIGlnbm9yZSBsaW5lIGVuZGluZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGV4dGZpbGUoYm9vbGVhbiB0ZXh0ZmlsZSkgeworICAgICAgICB0aGlzLnRleHRmaWxlID0gdGV4dGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29tcGFyaXNvbiBtZXRob2Qgb2YgdGhlIGludGVyZmFjZQorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlcyBhcmUgZXF1YWwKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGl0IGFsbCB3ZW50IHBlYXItc2hhcGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy92YWxpZGF0ZQorICAgICAgICBpZiAoZmlsZTEgPT0gbnVsbCB8fCBmaWxlMiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJvdGggZmlsZTEgYW5kIGZpbGUyIGFyZSByZXF1aXJlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmlsZXNtYXRjaCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8jbm93IG1hdGNoIHRoZSBmaWxlcworICAgICAgICBib29sZWFuIG1hdGNoZXMgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hdGNoZXMgPSBGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMoZmlsZTEsIGZpbGUyLCB0ZXh0ZmlsZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ3aGVuIGNvbXBhcmluZyBmaWxlczogIgorICAgICAgICAgICAgICAgICsgaW9lLmdldE1lc3NhZ2UoKSwgaW9lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF0Y2hlczsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9IYXNGcmVlU3BhY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9IYXNGcmVlU3BhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWZlODdmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0hhc0ZyZWVTcGFjZS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKg0KKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsNCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZWZsZWN0V3JhcHBlcjsNCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsNCisNCisvKioNCisgKiAmbHQ7aGFzZnJlZXNwYWNlJmd0Ow0KKyAqIDxwPkNvbmRpdGlvbiByZXR1cm5zIHRydWUgaWYgc2VsZWN0ZWQgcGFydGl0aW9uDQorICogaGFzIHRoZSByZXF1ZXN0ZWQgc3BhY2UsIGZhbHNlIG90aGVyd2lzZS48L3A+DQorICogQHNpbmNlIEFudCAxLjcNCisgKi8NCitwdWJsaWMgY2xhc3MgSGFzRnJlZVNwYWNlIGltcGxlbWVudHMgQ29uZGl0aW9uIHsNCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFydGl0aW9uOw0KKyAgICBwcml2YXRlIFN0cmluZyBuZWVkZWQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBFdmFsdWF0ZSB0aGUgY29uZGl0aW9uLg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgZW5vdWdoIGZyZWUgc3BhY2UuDQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLg0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7DQorICAgICAgICB2YWxpZGF0ZSgpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxLjYiKSkgew0KKyAgICAgICAgICAgICAgICAvL3JlZmxlY3Rpb24gdG8gYXZvaWQgYm9vdHN0cmFwL2J1aWxkIHByb2JsZW1zDQorICAgICAgICAgICAgICAgIEZpbGUgZnMgPSBuZXcgRmlsZShwYXJ0aXRpb24pOw0KKyAgICAgICAgICAgICAgICBSZWZsZWN0V3JhcHBlciB3ID0gbmV3IFJlZmxlY3RXcmFwcGVyKGZzKTsNCisgICAgICAgICAgICAgICAgbG9uZyBmcmVlID0gKChMb25nKSB3Lmludm9rZSgiZ2V0RnJlZVNwYWNlIikpLmxvbmdWYWx1ZSgpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gZnJlZSA+PSBTdHJpbmdVdGlscy5wYXJzZUh1bWFuU2l6ZXMobmVlZGVkKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkhhc0ZyZWVTcGFjZSBjb25kaXRpb24gbm90IHN1cHBvcnRlZCBvbiBKYXZhNSBvciBsZXNzLiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7DQorICAgICAgICBpZiAobnVsbCA9PSBwYXJ0aXRpb24pIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlBsZWFzZSBzZXQgdGhlIHBhcnRpdGlvbiBhdHRyaWJ1dGUuIik7DQorICAgICAgICB9DQorICAgICAgICBpZiAobnVsbCA9PSBuZWVkZWQpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlBsZWFzZSBzZXQgdGhlIG5lZWRlZCBhdHRyaWJ1dGUuIik7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoZSBwYXJ0aXRpb24vZGV2aWNlIHRvIGNoZWNrDQorICAgICAqIEByZXR1cm4gdGhlIHBhcnRpdGlvbi4NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBwYXJ0aXRpb24gbmFtZS4NCisgICAgICogQHBhcmFtIHBhcnRpdGlvbiB0aGUgbmFtZSB0byB1c2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb24oU3RyaW5nIHBhcnRpdGlvbikgew0KKyAgICAgICAgdGhpcy5wYXJ0aXRpb24gPSBwYXJ0aXRpb247DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoZSBhbW91bnQgb2YgZnJlZSBzcGFjZSByZXF1aXJlZA0KKyAgICAgKiBAcmV0dXJuIHRoZSBhbW91bnQgcmVxdWlyZWQNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmVlZGVkKCkgew0KKyAgICAgICAgcmV0dXJuIG5lZWRlZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQuDQorICAgICAqIEBwYXJhbSBuZWVkZWQgdGhlIGFtb3VudCByZXF1aXJlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldE5lZWRlZChTdHJpbmcgbmVlZGVkKSB7DQorICAgICAgICB0aGlzLm5lZWRlZCA9IG5lZWRlZDsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSGFzTWV0aG9kLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSGFzTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjNzNkNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9IYXNNZXRob2QuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworCisvKioKKyAqIHRlc3QgZm9yIGEgbWV0aG9kCisgKi8KK3B1YmxpYyBjbGFzcyBIYXNNZXRob2QgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kOworICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkOworICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGg7CisgICAgcHJpdmF0ZSBBbnRDbGFzc0xvYWRlciBsb2FkZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZVN5c3RlbUNsYXNzZXMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgc2VhcmNoIHBhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLmFwcGVuZChjbGFzc3BhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IFBhdGggaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZCBieSBBbnQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggYnkgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgYSBSZWZlcmVuY2UgdG8gYSBQYXRoIGluc3RhbmNlIHRvIGJlIHVzZWQgYXMgdGhlIGNsYXNzcGF0aAorICAgICAqICAgICAgICAgIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzbmFtZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKFN0cmluZyBjbGFzc25hbWUpIHsKKyAgICAgICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBtZXRob2QuCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCisgICAgICogQHBhcmFtIGZpZWxkIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZChTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGlnbm9yZSBzeXN0ZW0gY2xhc3NlcyB3aGVuIGxvb2tpbmcgZm9yIHRoZSBjbGFzcy4KKyAgICAgKiBAcGFyYW0gaWdub3JlU3lzdGVtQ2xhc3NlcyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZVN5c3RlbUNsYXNzZXMoYm9vbGVhbiBpZ25vcmVTeXN0ZW1DbGFzc2VzKSB7CisgICAgICAgIHRoaXMuaWdub3JlU3lzdGVtQ2xhc3NlcyA9IGlnbm9yZVN5c3RlbUNsYXNzZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSBnaXZlbiBjbGFzcyBjYW4gYmUgbG9hZGVkLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc25hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpZ25vcmVTeXN0ZW1DbGFzc2VzKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyID0gZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGNsYXNzcGF0aCk7CisgICAgICAgICAgICAgICAgbG9hZGVyLnNldFBhcmVudEZpcnN0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBsb2FkZXIuYWRkSmF2YUxpYnJhcmllcygpOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5maW5kQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGZvdW5kIGJ1dCByZXN0cmljdGVkIG5hbWU7IHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHRoZSBjYXNlIHdlJ3JlIGxvb2tpbmcgZm9yIGluIEpESyAxLjMrLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyLmxvYWRDbGFzcyhjbGFzc25hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgLy8gQ2FuIHJldHVybiBudWxsIHRvIHJlcHJlc2VudCB0aGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlci4KKyAgICAgICAgICAgICAgICAvLyBzZWUgQVBJIGRvY3Mgb2YgQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIuCisgICAgICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUsIHRydWUsIGwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY2xhc3MgXCIiICsgY2xhc3NuYW1lICsgIlwiIHdhcyBub3QgZm91bmQiKTsKKyAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBkZXBlbmRlbnQgY2xhc3MgXCIiICsgZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgZm9yIGNsYXNzIFwiIiArIGNsYXNzbmFtZSArICJcIiIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNsYXNzbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGNsYXNzbmFtZSBkZWZpbmVkIik7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3MgY2xhenogPSBsb2FkQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gaXNNZXRob2RGb3VuZChjbGF6eik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpZWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBpc0ZpZWxkRm91bmQoY2xhenopOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTmVpdGhlciBtZXRob2Qgbm9yIGZpZWxkIGRlZmluZWQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNGaWVsZEZvdW5kKENsYXNzIGNsYXp6KSB7CisgICAgICAgIEZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkRW50cnkgPSBmaWVsZHNbaV07CisgICAgICAgICAgICBpZiAoZmllbGRFbnRyeS5nZXROYW1lKCkuZXF1YWxzKGZpZWxkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNNZXRob2RGb3VuZChDbGFzcyBjbGF6eikgeworICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZEVudHJ5ID0gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgIGlmIChtZXRob2RFbnRyeS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSHR0cC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0h0dHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGVmM2NlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0h0dHAuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKKworLyoqCisgKiBDb25kaXRpb24gdG8gd2FpdCBmb3IgYSBIVFRQIHJlcXVlc3QgdG8gc3VjY2VlZC4gSXRzIGF0dHJpYnV0ZShzKSBhcmU6CisgKiAgIHVybCAtIHRoZSBVUkwgb2YgdGhlIHJlcXVlc3QuCisgKiAgIGVycm9yc0JlZ2luQXQgLSBudW1iZXIgYXQgd2hpY2ggZXJyb3JzIGJlZ2luIGF0OyBkZWZhdWx0PTQwMC4KKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0JFR0lOUyA9IDQwMDsKKyAgICBwcml2YXRlIFN0cmluZyBzcGVjID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXJsIGF0dHJpYnV0ZQorICAgICAqIEBwYXJhbSB1cmwgdGhlIHVybCBvZiB0aGUgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIHNwZWMgPSB1cmw7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZXJyb3JzQmVnaW5BdCA9IEVSUk9SX0JFR0lOUzsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXJyb3JzQmVnaW5BdCBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gZXJyb3JzQmVnaW5BdCBudW1iZXIgYXQgd2hpY2ggZXJyb3JzIGJlZ2luIGF0LCBkZWZhdWx0IGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgNDAwCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JzQmVnaW5BdChpbnQgZXJyb3JzQmVnaW5BdCkgeworICAgICAgICB0aGlzLmVycm9yc0JlZ2luQXQgPSBlcnJvcnNCZWdpbkF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgSFRUUCByZXF1ZXN0IHN1Y2NlZWRzCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyB1cmwgc3BlY2lmaWVkIGluIGh0dHAgY29uZGl0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJDaGVja2luZyBmb3IgIiArIHNwZWMsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoc3BlYyk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChjb25uIGluc3RhbmNlb2YgSHR0cFVSTENvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gaHR0cCA9IChIdHRwVVJMQ29ubmVjdGlvbikgY29ubjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBodHRwLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgICAgICAgICAgICAgICBsb2coIlJlc3VsdCBjb2RlIGZvciAiICsgc3BlYyArICIgd2FzICIgKyBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID4gMCAmJiBjb2RlIDwgZXJyb3JzQmVnaW5BdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQmFkbHkgZm9ybWVkIFVSTDogIiArIHNwZWMsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0ZhaWx1cmUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0ZhaWx1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMGZmYjllCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFpbHVyZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworCisvKioKKyAqIENvbmRpdGlvbiB0byB0ZXN0IGEgcmV0dXJuLWNvZGUgZm9yIGZhaWx1cmUuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgSXNGYWlsdXJlIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKyAgICBwcml2YXRlIGludCBjb2RlOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXR1cm4gY29kZSB0byBjaGVjay4KKyAgICAgKiBAcGFyYW0gYyB0aGUgcmV0dXJuIGNvZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29kZShpbnQgYykgeworICAgICAgICBjb2RlID0gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJldHVybiBjb2RlIHRoYXQgd2lsbCBiZSBjaGVja2VkIGJ5IHRoaXMgSXNGYWlsdXJlIGNvbmRpdGlvbi4KKyAgICAgKiBAcmV0dXJuIHJldHVybiBjb2RlIGFzIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvZGUoKSB7CisgICAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIGNvbmRpdGlvbiBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIHNwZWNpZmllZCByZXR1cm4gY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgeworICAgICAgICByZXR1cm4gRXhlY3V0ZS5pc0ZhaWx1cmUoY29kZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGYWxzZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFsc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNlNjliCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFsc2UuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKKworLyoqCisgKiBDb25kaXRpb24gdGhhdCB0ZXN0cyB3aGV0aGVyIGEgZ2l2ZW4gc3RyaW5nIGV2YWxzIHRvIGZhbHNlCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIElzRmFsc2UgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKyAgICAvKioKKyAgICAgKiB3aGF0IHdlIGV2YWwKKyAgICAgKi8KKyAgICBwcml2YXRlIEJvb2xlYW4gdmFsdWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogc2V0IHRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ7IGxldCBhbnQgZXZhbCBpdCB0byB0cnVlL2ZhbHNlCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGludmVydGVkIHZhbHVlOworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZW9uZSBmb3Jnb3QgdG8gc3BlYyBhIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vdGhpbmcgdG8gdGVzdCBmb3IgZmFsc2Vob29kIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICF2YWx1ZS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmlsZVNlbGVjdGVkLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGaWxlU2VsZWN0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY3MDIxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmlsZVNlbGVjdGVkLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkFic3RyYWN0U2VsZWN0b3JDb250YWluZXI7CisKKy8qKgorICogVGhpcyBpcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyB0byBzZWUgaWYgYSBmaWxlIHBhc3NlcyBhbiBlbWJlZGRlZCBzZWxlY3Rvci4KKyAqLworcHVibGljIGNsYXNzIElzRmlsZVNlbGVjdGVkIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RvckNvbnRhaW5lciBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHByaXZhdGUgRmlsZSBmaWxlOworICAgIHByaXZhdGUgRmlsZSBiYXNlRGlyOworCisgICAgLyoqCisgICAgICogVGhlIGZpbGUgdG8gY2hlY2suCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gY2hlY2sgaWYgaWYgcGFzc2VzIHRoZSBlbWJlZGRlZCBzZWxlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIGRpcmVjdG9yeSB0byB1c2UuCisgICAgICogQHBhcmFtIGJhc2VEaXIgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIHVzZSwgaWYgbnVsbCB1c2UgdGhlIHByb2plY3QncworICAgICAqICAgICAgICAgICAgICAgIGJhc2VkaXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFzZURpcihGaWxlIGJhc2VEaXIpIHsKKyAgICAgICAgdGhpcy5iYXNlRGlyID0gYmFzZURpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgaWYgKHNlbGVjdG9yQ291bnQoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIHNlbGVjdG9yIGFsbG93ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlIHRoZSBzZWxlY3RvciB3aXRoIHRoZSBmaWxlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBzZWxlY3RlZCBieSB0aGUgZW1iZWRkZWQgc2VsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmaWxlIGF0dHJpYnV0ZSBub3Qgc2V0Iik7CisgICAgICAgIH0KKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgRmlsZSBteUJhc2VEaXIgPSBiYXNlRGlyOworICAgICAgICBpZiAobXlCYXNlRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIG15QmFzZURpciA9IGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCk7CisgICAgICAgIH0KKworICAgICAgICBGaWxlU2VsZWN0b3IgZiA9IGdldFNlbGVjdG9ycyhnZXRQcm9qZWN0KCkpWzBdOworICAgICAgICByZXR1cm4gZi5pc1NlbGVjdGVkKAorICAgICAgICAgICAgbXlCYXNlRGlyLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG15QmFzZURpciwgZmlsZSksIGZpbGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1JlYWNoYWJsZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVhY2hhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkNDk5NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1JlYWNoYWJsZS5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKworLyoqCisgKiBUZXN0IGZvciBhIGhvc3QgYmVpbmcgcmVhY2hhYmxlIHVzaW5nIElDTVAgInBpbmciIHBhY2tldHMgJiBlY2hvIG9wZXJhdGlvbnMuCisgKiBQaW5nIHBhY2tldHMgYXJlIHZlcnkgcmVsaWFibGUgZm9yIGFzc2Vzc2luZyByZWFjaGFiaWxpdHkgaW4gYSBMQU4gb3IgV0FOLAorICogYnV0IHRoZXkgZG8gbm90IGdldCB0aHJvdWdoIGFueSB3ZWxsLWNvbmZpZ3VyZWQgZmlyZXdhbGwuIEVjaG8gKHBvcnQgNykgbWF5LgorICogPHAvPgorICogVGhpcyBjb25kaXRpb24gdHVybnMgdW5rbm93biBob3N0IGV4Y2VwdGlvbnMgaW50byBmYWxzZSBjb25kaXRpb25zLiBUaGlzIGlzCisgKiBiZWNhdXNlIG9uIGEgbGFwdG9wLCBETlMgaXMgb25lIG9mIHRoZSBmaXJzdCBzZXJ2aWNlcyBsb3N0IHdoZW4gdGhlIG5ldHdvcmsKKyAqIGdvZXM7IHlvdSBhcmUgaW1wbGljaXRseSBvZmZsaW5lLgorICogPHAvPgorICogSWYgYSBVUkwgaXMgc3VwcGxpZWQgaW5zdGVhZCBvZiBhIGhvc3QsIHRoZSBob3N0bmFtZSBpcyBleHRyYWN0ZWQgYW5kIHVzZWQgaW4KKyAqIHRoZSB0ZXN0LS1hbGwgb3RoZXIgcGFydHMgb2YgdGhlIFVSTCBhcmUgZGlzY2FyZGVkLgorICogPHAvPgorICogVGhlIHRlc3QgbWF5IG5vdCB3b3JrIHRocm91Z2ggZmlyZXdhbGxzOyB0aGF0IGlzLCBzb21ldGhpbmcgbWF5IGJlIHJlYWNoYWJsZQorICogdXNpbmcgYSBwcm90b2NvbCBzdWNoIGFzIEhUVFAsIHdoaWxlIHRoZSBsb3dlciBsZXZlbCBJQ01QIHBhY2tldHMgZ2V0IGRyb3BwZWQKKyAqIG9uIHRoZSBmbG9vci4gU2ltaWxhcmx5LCBhIGhvc3QgbWF5IGJlIGRldGVjdGVkIGFzIHJlYWNoYWJsZSB3aXRoIElDTVAsIGJ1dCBub3QKKyAqIHJlYWNoYWJsZSBvbiBvdGhlciBwb3J0cyAoaS5lLiBwb3J0IDgwKSwgYmVjYXVzZSBvZiBmaXJld2FsbHMuCisgKiA8cC8+CisgKiBSZXF1aXJlcyBKYXZhMS41KyB0byB3b3JrIHByb3Blcmx5LiBPbiBKYXZhMS40IGFuZCBlYXJsaWVyLCBpZiBhIGhvc3RuYW1lCisgKiBjYW4gYmUgcmVzb2x2ZWQsIHRoZSBkZXN0aW5hdGlvbiBpcyBhc3N1bWVkIHRvIGJlIHJlYWNoYWJsZS4KKyAqCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgSXNSZWFjaGFibGUgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUNPTkQgPSAxMDAwOyAvLyBtaWxsaXMgcGVyIHNlY29uZAorICAgIHByaXZhdGUgU3RyaW5nIGhvc3Q7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXJsOworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RJTUVPVVQgPSAzMDsKKyAgICBwcml2YXRlIGludCB0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUOworICAgIC8qKgorICAgICAqIEVycm9yIHdoZW4gbm8gaG9zdG5hbWUgaXMgZGVmaW5lZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX0hPU1ROQU1FID0gIk5vIGhvc3RuYW1lIGRlZmluZWQiOworICAgIC8qKgorICAgICAqIEVycm9yIHdoZW4gaW52YWxpZCB0aW1lb3V0IHZhbHVlIGlzIGRlZmluZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9CQURfVElNRU9VVCA9ICJJbnZhbGlkIHRpbWVvdXQgdmFsdWUiOworICAgIC8qKgorICAgICAqIFVua25vd24gaG9zdCBtZXNzYWdlIGlzIHNlZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5fVU5LTk9XTl9IT1NUID0gIlVua25vd24gaG9zdDogIjsKKyAgICAvKioKKyAgICAgKiBOZXR3b3JrIGVycm9yIG1lc3NhZ2UgaXMgc2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9PTl9ORVRXT1JLID0gIm5ldHdvcmsgZXJyb3IgdG8gIjsKKyAgICAvKiogRXJyb3IgbWVzc2FnZSB3aGVuIHVybCBhbmQgaG9zdCBhcmUgc3BlY2lmaWVkLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0JPVEhfVEFSR0VUUworICAgICAgICA9ICJCb3RoIHVybCBhbmQgaG9zdCBoYXZlIGJlZW4gc3BlY2lmaWVkIjsKKyAgICAvKiogRXJyb3IgbWVzc2FnZSB3aGVuIG5vIHJlYWNoYWJseSB0ZXN0IGF2YWlsLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19OT19SRUFDSEFCTEVfVEVTVAorICAgICAgICA9ICJjYW5ub3QgZG8gYSBwcm9wZXIgcmVhY2hhYmlsaXR5IHRlc3Qgb24gdGhpcyBKYXZhIHZlcnNpb24iOworICAgIC8qKiBFcnJvciBtZXNzYWdlIHdoZW4gYW4gaW52YWxpZCB1cmwgaXMgdXNlZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9CQURfVVJMID0gIkJhZCBVUkwgIjsKKyAgICAvKiogRXJyb3IgbWVzc2FnZSB3aGVuIG5vIGhvc3RuYW1lIGluIHVybC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19IT1NUX0lOX1VSTCA9ICJObyBob3N0bmFtZSBpbiBVUkwgIjsKKyAgICAvKiogVGhlIG1ldGhvZCBuYW1lIHRvIGxvb2sgZm9yIGluIEluZXRBZGRyZXNzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX05BTUUgPSAiaXNSZWFjaGFibGUiOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IHRvIHBpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCB0byBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVSTCBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIGhvc3RuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBhIFVSTCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgdGhpcy51cmwgPSB1cmw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aW1lb3V0IGZvciB0aGUgcmVhY2hhYmlsaXR5IHRlc3QgaW4gc2Vjb25kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IGluIHNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgeworICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIGVtcHR5bmVzcyB0ZXN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nIHBhcmFtIHRvIGNoZWNrCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgaXQgaXMgZW1wdHkKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW1wdHkoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLmxlbmd0aCgpID09IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IHtJbnRlZ2VyLlRZUEV9OworCisgICAgLyoqCisgICAgICogRXZhbHVhdGUgdGhlIGNvbmRpdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlbXB0eShob3N0KSAmJiBlbXB0eSh1cmwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTk9fSE9TVE5BTUUpOworICAgICAgICB9CisgICAgICAgIGlmICh0aW1lb3V0IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX0JBRF9USU1FT1VUKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gaG9zdDsKKyAgICAgICAgaWYgKCFlbXB0eSh1cmwpKSB7CisgICAgICAgICAgICBpZiAoIWVtcHR5KGhvc3QpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX0JPVEhfVEFSR0VUUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBob3N0IG9mIGEgdXJsCisgICAgICAgICAgICAgICAgVVJMIHJlYWxVUkwgPSBuZXcgVVJMKHVybCk7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gcmVhbFVSTC5nZXRIb3N0KCk7CisgICAgICAgICAgICAgICAgaWYgKGVtcHR5KHRhcmdldCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX0hPU1RfSU5fVVJMICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9CQURfVVJMICsgdXJsLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2coIlByb2JpbmcgaG9zdCAiICsgdGFyZ2V0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgSW5ldEFkZHJlc3MgYWRkcmVzczsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUodGFyZ2V0KTsKKyAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIGxvZyhXQVJOX1VOS05PV05fSE9TVCArIHRhcmdldCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJIb3N0IGFkZHJlc3MgPSAiICsgYWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBib29sZWFuIHJlYWNoYWJsZTsKKyAgICAgICAgLy9KYXZhMS41OiByZWFjaGFibGUgPSBhZGRyZXNzLmlzUmVhY2hhYmxlKHRpbWVvdXQgKiAxMDAwKTsKKyAgICAgICAgTWV0aG9kIHJlYWNoYWJsZU1ldGhvZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFjaGFibGVNZXRob2QgPSBJbmV0QWRkcmVzcy5jbGFzcy5nZXRNZXRob2QoTUVUSE9EX05BTUUsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBwYXJhbXNbMF0gPSBuZXcgSW50ZWdlcih0aW1lb3V0ICogU0VDT05EKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVhY2hhYmxlID0gKChCb29sZWFuKSByZWFjaGFibGVNZXRob2QuaW52b2tlKGFkZHJlc3MsIHBhcmFtcykpCisgICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL3V0dGVybHkgaW1wbGF1c2libGUsIGJ1dCBjYXRlcmVkIGZvciBhbnl3YXkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIldoZW4gY2FsbGluZyAiICsgcmVhY2hhYmxlTWV0aG9kKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vYXNzdW1lIHRoaXMgaXMgYW4gSU9leGNlcHRpb24gYWJvdXQgdW4gcmVhZGFiaWxpdHkKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgbmVzdGVkID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBsb2coRVJST1JfT05fTkVUV09SSyArIHRhcmdldCArICI6ICIgKyBuZXN0ZWQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgLy9hbnkga2luZCBvZiBmYXVsdDogbm90IHJlYWNoYWJsZS4KKyAgICAgICAgICAgICAgICByZWFjaGFibGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vamF2YTEuNCBvciBlYXJsaWVyCisgICAgICAgICAgICBsb2coIk5vdCBmb3VuZDogSW5ldEFkZHJlc3MuIiArIE1FVEhPRF9OQU1FLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGxvZyhNU0dfTk9fUkVBQ0hBQkxFX1RFU1QpOworICAgICAgICAgICAgcmVhY2hhYmxlID0gdHJ1ZTsKKworICAgICAgICB9CisKKyAgICAgICAgbG9nKCJob3N0IGlzIiArIChyZWFjaGFibGUgPyAiIiA6ICIgbm90IikgKyAiIHJlYWNoYWJsZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICByZXR1cm4gcmVhY2hhYmxlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1JlZmVyZW5jZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2ZDQzNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1JlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKKworLyoqCisgKiBDb25kaXRpb24gdGhhdCB0ZXN0cyB3aGV0aGVyIGEgZ2l2ZW4gcmVmZXJlbmNlIGhhcyBiZWVuIGRlZmluZWQuCisgKgorICogPHA+T3B0aW9uYWxseSB0ZXN0cyB3aGV0aGVyIGl0IGlzIG9mIGEgZ2l2ZW4gdHlwZS9jbGFzcy48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIElzUmVmZXJlbmNlIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisgICAgcHJpdmF0ZSBSZWZlcmVuY2UgcmVmOworICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlZmlkIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIGEgUmVmZXJlbmNlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgcmVmID0gcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHR5cGUgYXR0cmlidXRlLiBUaGlzIGlzIG9wdGlvbmFsIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIGFuIGFudCBjb21wb25lbnQgdHlwZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlIGV4aXN0cyBhbmQgaWYgdHlwZSBpcyBzZXQsIGlmCisgICAgICogICAgICAgICAgICAgIHRoZSByZWZlcmVuY2UgaXMgdGhlIHNhbWUgdHlwZQorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZWYgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyByZWZlcmVuY2Ugc3BlY2lmaWVkIGZvciBpc3JlZmVyZW5jZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29uZGl0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgbyA9IGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UocmVmLmdldFJlZklkKCkpOworCisgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2xhc3MgdHlwZUNsYXNzID0KKyAgICAgICAgICAgICAgICAoQ2xhc3MpIGdldFByb2plY3QoKS5nZXREYXRhVHlwZURlZmluaXRpb25zKCkuZ2V0KHR5cGUpOworCisgICAgICAgICAgICBpZiAodHlwZUNsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0eXBlQ2xhc3MgPQorICAgICAgICAgICAgICAgICAgICAoQ2xhc3MpIGdldFByb2plY3QoKS5nZXRUYXNrRGVmaW5pdGlvbnMoKS5nZXQodHlwZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eXBlQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGRvbid0IGtub3cgdGhlIHR5cGUsIHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZD8KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0eXBlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvLmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNTZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1NldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTU5MTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNTZXQuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CisKKy8qKgorICogQ29uZGl0aW9uIHRoYXQgdGVzdHMgd2hldGhlciBhIGdpdmVuIHByb3BlcnR5IGhhcyBiZWVuIHNldC4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgY2xhc3MgSXNTZXQgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvcGVydHkgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvcGVydHkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwKSB7CisgICAgICAgIHByb3BlcnR5ID0gcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGV4aXN0cworICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHByb3BlcnR5IGF0dHJpYnV0ZSBpcyBub3Qgc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHByb3BlcnR5IHNwZWNpZmllZCBmb3IgaXNzZXQgIiArICJjb25kaXRpb24iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KHByb3BlcnR5KSAhPSBudWxsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzU2lnbmVkLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNTaWduZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ1YTNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzU2lnbmVkLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlOworCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgamFyZmlsZSBpcyBzaWduZWQ6IGlmIHRoZSBuYW1lIG9mIHRoZQorICogc2lnbmF0dXJlIGlzIHBhc3NlZCwgdGhlIGZpbGUgaXMgY2hlY2tlZCBmb3IgcHJlc2VuY2Ugb2YgdGhhdAorICogcGFydGljdWxhciBzaWduYXR1cmU7IG90aGVyd2lzZSB0aGUgZmlsZSBpcyBjaGVja2VkIGZvciB0aGUKKyAqIGV4aXN0ZW5jZSBvZiBhbnkgc2lnbmF0dXJlLgorICovCitwdWJsaWMgY2xhc3MgSXNTaWduZWQgZXh0ZW5kcyBEYXRhVHlwZSBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHX1NUQVJUID0gIk1FVEEtSU5GLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR19FTkQgPSAiLlNGIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgU0hPUlRfU0lHX0xJTUlUID0gODsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBGaWxlIGZpbGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgamFyZmlsZSB0aGF0IGlzIHRvIGJlIHRlc3RlZCBmb3IgdGhlIHByZXNlbmNlCisgICAgICogb2YgYSBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIGZpbGUgamFyZmlsZSB0byBiZSB0ZXN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgIC8qKgorICAgICAqIFRoZSBzaWduYXR1cmUgbmFtZSB0byBjaGVjayBqYXJmaWxlIGZvci4KKyAgICAgKiBAcGFyYW0gbmFtZSBzaWduYXR1cmUgdG8gbG9vayBmb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBpcyBzaWduZWQgd2l0aAorICAgICAqIHRoZSBzaWduYXR1cmUgc3BlY2lmaWVkLCBvciwgaWYgPGNvZGU+bmFtZTwvY29kZT4gd2Fzbid0CisgICAgICogc3BlY2lmaWVkLCBpZiB0aGUgZmlsZSBjb250YWlucyBhIHNpZ25hdHVyZS4KKyAgICAgKiBAcGFyYW0gemlwRmlsZSB0aGUgemlwZmlsZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBuYW1lIHRoZSBzaWduYXR1cmUgdG8gY2hlY2sgKG1heSBiZSBraWxsZWQpCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGlzIHNpZ25lZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2lnbmVkKEZpbGUgemlwRmlsZSwgU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFppcEZpbGUgamFyRmlsZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXJGaWxlID0gbmV3IFppcEZpbGUoemlwRmlsZSk7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZW50cmllcyA9IGphckZpbGUuZ2V0RW50cmllcygpOworICAgICAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlTmFtZSA9ICgoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKSkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZU5hbWUuc3RhcnRzV2l0aChTSUdfU1RBUlQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBlTmFtZS5lbmRzV2l0aChTSUdfRU5EKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBzaG9ydFNpZyA9IGphckZpbGUuZ2V0RW50cnkoU0lHX1NUQVJUCisgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUudG9VcHBlckNhc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBTSUdfRU5EKSAhPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiBsb25nU2lnID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA+IFNIT1JUX1NJR19MSU1JVCkgeworICAgICAgICAgICAgICAgIGxvbmdTaWcgPSBqYXJGaWxlLmdldEVudHJ5KAorICAgICAgICAgICAgICAgICAgICBTSUdfU1RBUlQKKyAgICAgICAgICAgICAgICAgICAgKyBuYW1lLnN1YnN0cmluZygwLCBTSE9SVF9TSUdfTElNSVQpLnRvVXBwZXJDYXNlKCkKKyAgICAgICAgICAgICAgICAgICAgKyBTSUdfRU5EKSAhPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc2hvcnRTaWcgfHwgbG9uZ1NpZzsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFppcEZpbGUuY2xvc2VRdWlldGx5KGphckZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIGlzIHNpZ25lZCB3aXRoCisgICAgICogdGhlIHNpZ25hdHVyZSBzcGVjaWZpZWQsIG9yLCBpZiA8Y29kZT5uYW1lPC9jb2RlPiB3YXNuJ3QKKyAgICAgKiBzcGVjaWZpZWQsIGlmIHRoZSBmaWxlIGNvbnRhaW5zIGEgc2lnbmF0dXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBzaWduZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZmlsZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBsb2coIlRoZSBmaWxlIFwiIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICArICJcIiBkb2VzIG5vdCBleGlzdC4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gciA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgciA9IGlzU2lnbmVkKGZpbGUsIG5hbWUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkdvdCBJT0V4Y2VwdGlvbiByZWFkaW5nIGZpbGUgXCIiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICsgIlwiIiArIGUsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHIpIHsKKyAgICAgICAgICAgIGxvZygiRmlsZSBcIiIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIlwiIGlzIHNpZ25lZC4iLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1RydWUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1RydWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTNiNDQxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzVHJ1ZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworCisvKioKKyAqIENvbmRpdGlvbiB0aGF0IHRlc3RzIHdoZXRoZXIgYSBnaXZlbiBzdHJpbmcgZXZhbHMgdG8gdHJ1ZQorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBJc1RydWUgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKyAgICAvKioKKyAgICAgKiB3aGF0IHdlIGV2YWwKKyAgICAgKi8KKyAgICBwcml2YXRlIEJvb2xlYW4gdmFsdWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogc2V0IHRoZSB2YWx1ZSB0byBiZSB0ZXN0ZWQ7IGxldCBhbnQgZXZhbCBpdCB0byB0cnVlL2ZhbHNlCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBzb21lb25lIGZvcmdvdCB0byBzcGVjIGEgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm90aGluZyB0byB0ZXN0IGZvciB0cnV0aCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL01hdGNoZXMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9NYXRjaGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5NzQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9NYXRjaGVzLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHA7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVndWxhckV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwTWF0Y2hlcjsKKworLyoqCisgKiBTaW1wbGUgcmVndWxhciBleHByZXNzaW9uIGNvbmRpdGlvbi4KKyAqCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgTWF0Y2hlcyBleHRlbmRzIFByb2plY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb25kaXRpb24geworCisgICAgcHJpdmF0ZSBTdHJpbmcgIHN0cmluZzsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIG11bHRpTGluZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBzaW5nbGVMaW5lID0gZmFsc2U7CisgICAgcHJpdmF0ZSBSZWd1bGFyRXhwcmVzc2lvbiByZWd1bGFyRXhwcmVzc2lvbjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gbWF0Y2gKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisgICAgICAgIGlmIChyZWd1bGFyRXhwcmVzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk9ubHkgb25lIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBhbGxvd2VkLiIpOworICAgICAgICB9CisgICAgICAgIHJlZ3VsYXJFeHByZXNzaW9uID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKCk7CisgICAgICAgIHJlZ3VsYXJFeHByZXNzaW9uLnNldFBhdHRlcm4ocGF0dGVybik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICogWW91IGNhbiB1c2UgdGhpcyBlbGVtZW50IHRvIHJlZmVyIHRvIGEgcHJldmlvdXNseQorICAgICAqIGRlZmluZWQgcmVndWxhciBleHByZXNzaW9uIGRhdGF0eXBlIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlZ3VsYXJFeHByZXNzaW9uIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNvbmZpZ3VyZWQgYXMgYW4gZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlZ2V4cChSZWd1bGFyRXhwcmVzc2lvbiByZWd1bGFyRXhwcmVzc2lvbikgeworICAgICAgICBpZiAodGhpcy5yZWd1bGFyRXhwcmVzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk9ubHkgb25lIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBhbGxvd2VkLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMucmVndWxhckV4cHJlc3Npb24gPSByZWd1bGFyRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGlnbm9yZSBjYXNlIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gYiBpZiBmYWxzZSwgaWdub3JlIGNhc2UuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNlc2Vuc2l0aXZlKGJvb2xlYW4gYikgeworICAgICAgICBjYXNlU2Vuc2l0aXZlID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIG1hdGNoIHNob3VsZCBiZSBtdWx0aWxpbmUuCisgICAgICogQHBhcmFtIGIgdGhlIHZhbHVlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aWxpbmUoYm9vbGVhbiBiKSB7CisgICAgICAgIG11bHRpTGluZSA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byB0cmVhdCBpbnB1dCBhcyBzaW5nbGVsaW5lICgnLicgbWF0Y2hlcyBuZXdsaW5lKS4KKyAgICAgKiBDb3JyZXNwb25zZHMgdG8gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uRE9UQUxMLgorICAgICAqIEBwYXJhbSBiIHRoZSB2YWx1ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2luZ2xlTGluZShib29sZWFuIGIpIHsKKyAgICAgICAgc2luZ2xlTGluZSA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBub3Qgc2V0IGNvcnJlY3RseQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiUGFyYW1ldGVyIHN0cmluZyBpcyByZXF1aXJlZCBpbiBtYXRjaGVzLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChyZWd1bGFyRXhwcmVzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgcGF0dGVybiBpbiBtYXRjaGVzLiIpOworICAgICAgICB9CisgICAgICAgIGludCBvcHRpb25zID0gUmVnZXhwTWF0Y2hlci5NQVRDSF9ERUZBVUxUOworICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHwgUmVnZXhwTWF0Y2hlci5NQVRDSF9DQVNFX0lOU0VOU0lUSVZFOworICAgICAgICB9CisgICAgICAgIGlmIChtdWx0aUxpbmUpIHsKKyAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHwgUmVnZXhwTWF0Y2hlci5NQVRDSF9NVUxUSUxJTkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpbmdsZUxpbmUpIHsKKyAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHwgUmVnZXhwTWF0Y2hlci5NQVRDSF9TSU5HTEVMSU5FOworICAgICAgICB9CisgICAgICAgIFJlZ2V4cCByZWdleHAgPSByZWd1bGFyRXhwcmVzc2lvbi5nZXRSZWdleHAoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgcmV0dXJuIHJlZ2V4cC5tYXRjaGVzKHN0cmluZywgb3B0aW9ucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL05vdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL05vdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOWRjYmIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vTm90LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqICZsdDtub3QmZ3Q7IGNvbmRpdGlvbi4KKyAqCisgKiBFdmFsdWF0ZXMgdG8gdHJ1ZSBpZiB0aGUgc2luZ2xlIGNvbmRpdGlvbiBuZXN0ZWQgaW50byBpdCBpcyBmYWxzZQorICogYW5kIHZpY2UgdmVyc2EuCisgKgorICogQHNpbmNlIEFudCAxLjQKKyAqLworcHVibGljIGNsYXNzIE5vdCBleHRlbmRzIENvbmRpdGlvbkJhc2UgaW1wbGVtZW50cyBDb25kaXRpb24geworCisgICAgLyoqCisgICAgICogRXZhbHVhdGUgY29uZGl0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb3VudENvbmRpdGlvbnMoKSA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgbm90IG5lc3QgbW9yZSB0aGFuIG9uZSAiCisgICAgICAgICAgICAgICAgKyAiY29uZGl0aW9uIGludG8gPG5vdD4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnRDb25kaXRpb25zKCkgPCAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IG5lc3QgYSBjb25kaXRpb24gaW50byA8bm90PiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAhKChDb25kaXRpb24pIGdldENvbmRpdGlvbnMoKS5uZXh0RWxlbWVudCgpKS5ldmFsKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjZlYjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3IuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqICZsdDtvciZndDsgY29uZGl0aW9uIGNvbnRhaW5lci4KKyAqCisgKiA8cD5JdGVyYXRlcyBvdmVyIGFsbCBjb25kaXRpb25zIGFuZCByZXR1cm5zIHRydWUgYXMgc29vbiBhcyBvbmUKKyAqIGV2YWx1YXRlcyB0byB0cnVlLjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuNAorICovCitwdWJsaWMgY2xhc3MgT3IgZXh0ZW5kcyBDb25kaXRpb25CYXNlIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIGNvbnRhaW5lZCBjb25kaXRpb25zIGV2YWx1YXRlIHRvIHRydWUKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBFbnVtZXJhdGlvbiBlID0gZ2V0Q29uZGl0aW9ucygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgQ29uZGl0aW9uIGMgPSAoQ29uZGl0aW9uKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoYy5ldmFsKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3MuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTkxODUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3MuamF2YQpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBDb25kaXRpb24gdGhhdCB0ZXN0cyB0aGUgT1MgdHlwZS4KKyAqCisgKiBAc2luY2UgQW50IDEuNAorICovCitwdWJsaWMgY2xhc3MgT3MgaW1wbGVtZW50cyBDb25kaXRpb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU19OQU1FID0KKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfQVJDSCA9CisgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1ZFUlNJT04gPQorICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1NFUCA9CisgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKTsKKworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0byBsb29rIGZvcgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZhbWlseTsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIE9TCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAvKioKKyAgICAgKiB2ZXJzaW9uIG9mIE9TCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKyAgICAvKioKKyAgICAgKiBPUyBhcmNoaXRlY3R1cmUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhcmNoOworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9XSU5ET1dTID0gIndpbmRvd3MiOworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV85WCA9ICJ3aW45eCI7CisgICAgLyoqCisgICAgICogT1MgZmFtaWx5IHRoYXQgY2FuIGJlIHRlc3RlZCBmb3IuIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxZX05UID0gIndpbm50IjsKKyAgICAvKioKKyAgICAgKiBPUyBmYW1pbHkgdGhhdCBjYW4gYmUgdGVzdGVkIGZvci4ge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQU1JTFlfT1MyID0gIm9zLzIiOworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9ORVRXQVJFID0gIm5ldHdhcmUiOworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9ET1MgPSAiZG9zIjsKKyAgICAvKioKKyAgICAgKiBPUyBmYW1pbHkgdGhhdCBjYW4gYmUgdGVzdGVkIGZvci4ge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQU1JTFlfTUFDID0gIm1hYyI7CisgICAgLyoqCisgICAgICogT1MgZmFtaWx5IHRoYXQgY2FuIGJlIHRlc3RlZCBmb3IuIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxZX1RBTkRFTSA9ICJ0YW5kZW0iOworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9VTklYID0gInVuaXgiOworICAgIC8qKgorICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9WTVMgPSAib3BlbnZtcyI7CisgICAgLyoqCisgICAgICogT1MgZmFtaWx5IHRoYXQgY2FuIGJlIHRlc3RlZCBmb3IuIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxZX1pPUyA9ICJ6L29zIjsKKyAgICAvKiogT1MgZmFtaWx5IHRoYXQgY2FuIGJlIHRlc3RlZCBmb3IuIHtAdmFsdWV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxZX09TNDAwID0gIm9zLzQwMCI7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgT3MoKSB7CisgICAgICAgIC8vZGVmYXVsdAorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRoYXQgc2V0cyB0aGUgZmFtaWx5IGF0dHJpYnV0ZQorICAgICAqIEBwYXJhbSBmYW1pbHkgYSBTdHJpbmcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgT3MoU3RyaW5nIGZhbWlseSkgeworICAgICAgICBzZXRGYW1pbHkoZmFtaWx5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZXNpcmVkIE9TIGZhbWlseSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gZiAgICAgIFRoZSBPUyBmYW1pbHkgdHlwZSBkZXNpcmVkPGJyIC8+CisgICAgICogICAgICAgICAgICAgICBQb3NzaWJsZSB2YWx1ZXM6PGJyIC8+CisgICAgICogICAgICAgICAgICAgICA8dWw+CisgICAgICogICAgICAgICAgICAgICA8bGk+ZG9zPC9saT4KKyAgICAgKiAgICAgICAgICAgICAgIDxsaT5tYWM8L2xpPgorICAgICAqICAgICAgICAgICAgICAgPGxpPm5ldHdhcmU8L2xpPgorICAgICAqICAgICAgICAgICAgICAgPGxpPm9zLzI8L2xpPgorICAgICAqICAgICAgICAgICAgICAgPGxpPnRhbmRlbTwvbGk+CisgICAgICogICAgICAgICAgICAgICA8bGk+dW5peDwvbGk+CisgICAgICogICAgICAgICAgICAgICA8bGk+d2luZG93czwvbGk+CisgICAgICogICAgICAgICAgICAgICA8bGk+d2luOXg8L2xpPgorICAgICAqICAgICAgICAgICAgICAgPGxpPnovb3M8L2xpPgorICAgICAqICAgICAgICAgICAgICAgPGxpPm9zLzQwMDwvbGk+CisgICAgICogICAgICAgICAgICAgICA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhbWlseShTdHJpbmcgZikgeworICAgICAgICBmYW1pbHkgPSBmLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzaXJlZCBPUyBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgIFRoZSBPUyBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzaXJlZCBPUyBhcmNoaXRlY3R1cmUKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmNoICAgVGhlIE9TIGFyY2hpdGVjdHVyZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyY2goU3RyaW5nIGFyY2gpIHsKKyAgICAgICAgdGhpcy5hcmNoID0gYXJjaC50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlc2lyZWQgT1MgdmVyc2lvbgorICAgICAqCisgICAgICogQHBhcmFtIHZlcnNpb24gICBUaGUgT1MgdmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbi50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIE9TIG9uIHdoaWNoIEFudCBpcyBleGVjdXRpbmcgbWF0Y2hlcyB0aGUgdHlwZSBvZgorICAgICAqIHRoYXQgc2V0IGluIHNldEZhbWlseS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9zIG1hdGNoZXMuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKiBAc2VlIE9zI3NldEZhbWlseShTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpc09zKGZhbWlseSwgbmFtZSwgYXJjaCwgdmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgT1Mgb24gd2hpY2ggQW50IGlzIGV4ZWN1dGluZyBtYXRjaGVzIHRoZQorICAgICAqIGdpdmVuIE9TIGZhbWlseS4KKyAgICAgKiBAcGFyYW0gZmFtaWx5IHRoZSBmYW1pbHkgdG8gY2hlY2sgZm9yCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBPUyBtYXRjaGVzCisgICAgICogQHNpbmNlIDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhbWlseShTdHJpbmcgZmFtaWx5KSB7CisgICAgICAgIHJldHVybiBpc09zKGZhbWlseSwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgT1Mgb24gd2hpY2ggQW50IGlzIGV4ZWN1dGluZyBtYXRjaGVzIHRoZQorICAgICAqIGdpdmVuIE9TIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgT1MgbmFtZSB0byBjaGVjayBmb3IKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIE9TIG1hdGNoZXMKKyAgICAgKiBAc2luY2UgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gaXNPcyhudWxsLCBuYW1lLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBPUyBvbiB3aGljaCBBbnQgaXMgZXhlY3V0aW5nIG1hdGNoZXMgdGhlCisgICAgICogZ2l2ZW4gT1MgYXJjaGl0ZWN0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIGFyY2ggdGhlIE9TIGFyY2hpdGVjdHVyZSB0byBjaGVjayBmb3IKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIE9TIG1hdGNoZXMKKyAgICAgKiBAc2luY2UgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXJjaChTdHJpbmcgYXJjaCkgeworICAgICAgICByZXR1cm4gaXNPcyhudWxsLCBudWxsLCBhcmNoLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBPUyBvbiB3aGljaCBBbnQgaXMgZXhlY3V0aW5nIG1hdGNoZXMgdGhlCisgICAgICogZ2l2ZW4gT1MgdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBPUyB2ZXJzaW9uIHRvIGNoZWNrIGZvcgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgT1MgbWF0Y2hlcworICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIHJldHVybiBpc09zKG51bGwsIG51bGwsIG51bGwsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIE9TIG9uIHdoaWNoIEFudCBpcyBleGVjdXRpbmcgbWF0Y2hlcyB0aGUKKyAgICAgKiBnaXZlbiBPUyBmYW1pbHksIG5hbWUsIGFyY2hpdGVjdHVyZSBhbmQgdmVyc2lvbgorICAgICAqCisgICAgICogQHBhcmFtIGZhbWlseSAgIFRoZSBPUyBmYW1pbHkKKyAgICAgKiBAcGFyYW0gbmFtZSAgIFRoZSBPUyBuYW1lCisgICAgICogQHBhcmFtIGFyY2ggICBUaGUgT1MgYXJjaGl0ZWN0dXJlCisgICAgICogQHBhcmFtIHZlcnNpb24gICBUaGUgT1MgdmVyc2lvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgT1MgbWF0Y2hlcworICAgICAqIEBzaW5jZSAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPcyhTdHJpbmcgZmFtaWx5LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOworCisgICAgICAgIGlmIChmYW1pbHkgIT0gbnVsbCB8fCBuYW1lICE9IG51bGwgfHwgYXJjaCAhPSBudWxsCisgICAgICAgICAgICB8fCB2ZXJzaW9uICE9IG51bGwpIHsKKworICAgICAgICAgICAgYm9vbGVhbiBpc0ZhbWlseSA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIGlzTmFtZSA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIGlzQXJjaCA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIGlzVmVyc2lvbiA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChmYW1pbHkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgLy93aW5kb3dzIHByb2JpbmcgbG9naWMgcmVsaWVzIG9uIHRoZSB3b3JkICd3aW5kb3dzJyBpbgorICAgICAgICAgICAgICAgIC8vdGhlIE9TCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1dpbmRvd3MgPSBPU19OQU1FLmluZGV4T2YoRkFNSUxZX1dJTkRPV1MpID4gLTE7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpczl4ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc05UID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGlzV2luZG93cykgeworICAgICAgICAgICAgICAgICAgICAvL3RoZXJlIGFyZSBvbmx5IGZvdXIgOXggcGxhdGZvcm1zIHRoYXQgd2UgbG9vayBmb3IKKyAgICAgICAgICAgICAgICAgICAgaXM5eCA9IChPU19OQU1FLmluZGV4T2YoIjk1IikgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IE9TX05BTUUuaW5kZXhPZigiOTgiKSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgT1NfTkFNRS5pbmRleE9mKCJtZSIpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dpbmNlIGlzbid0IHJlYWxseSA5eCwgYnV0IGNyaXBwbGVkIGVub3VnaCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYmUgYSBtdWNobmVzcy4gQW50IGRvZXNudCBydW4gb24gQ0UsIGFueXdheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBPU19OQU1FLmluZGV4T2YoImNlIikgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgIGlzTlQgPSAhaXM5eDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX1dJTkRPV1MpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gaXNXaW5kb3dzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LmVxdWFscyhGQU1JTFlfOVgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gaXNXaW5kb3dzICYmIGlzOXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9OVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBpc1dpbmRvd3MgJiYgaXNOVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX09TMikpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmluZGV4T2YoRkFNSUxZX09TMikgPiAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX05FVFdBUkUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5pbmRleE9mKEZBTUlMWV9ORVRXQVJFKSA+IC0xOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LmVxdWFscyhGQU1JTFlfRE9TKSkgeworICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IFBBVEhfU0VQLmVxdWFscygiOyIpICYmICFpc0ZhbWlseShGQU1JTFlfTkVUV0FSRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9NQUMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5pbmRleE9mKEZBTUlMWV9NQUMpID4gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9UQU5ERU0pKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5pbmRleE9mKCJub25zdG9wX2tlcm5lbCIpID4gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9VTklYKSkgeworICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IFBBVEhfU0VQLmVxdWFscygiOiIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNGYW1pbHkoRkFNSUxZX1ZNUykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghaXNGYW1pbHkoRkFNSUxZX01BQykgfHwgT1NfTkFNRS5lbmRzV2l0aCgieCIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX1pPUykpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmluZGV4T2YoRkFNSUxZX1pPUykgPiAtMQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgT1NfTkFNRS5pbmRleE9mKCJvcy8zOTAiKSA+IC0xOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LmVxdWFscyhGQU1JTFlfT1M0MDApKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5pbmRleE9mKEZBTUlMWV9PUzQwMCkgPiAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX1ZNUykpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmluZGV4T2YoRkFNSUxZX1ZNUykgPiAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRG9uXCd0IGtub3cgaG93IHRvIGRldGVjdCBvcyBmYW1pbHkgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZhbWlseSArICJcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpc05hbWUgPSBuYW1lLmVxdWFscyhPU19OQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpc0FyY2ggPSBhcmNoLmVxdWFscyhPU19BUkNIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpc1ZlcnNpb24gPSB2ZXJzaW9uLmVxdWFscyhPU19WRVJTSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldFZhbHVlID0gaXNGYW1pbHkgJiYgaXNOYW1lICYmIGlzQXJjaCAmJiBpc1ZlcnNpb247CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9QYXJzZXJTdXBwb3J0cy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1BhcnNlclN1cHBvcnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0MWFmMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9QYXJzZXJTdXBwb3J0cy5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkpBWFBVdGlsczsKKworaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKKworLyoqCisgKiBUZXN0IGZvciB0aGUgWE1MIHBhcnNlciBzdXBwb3J0aW5nIGEgcGFydGljdWxhciBmZWF0dXJlCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgUGFyc2VyU3VwcG9ydHMgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZlYXR1cmU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgLy8gRXJyb3IgbWVzc2FnZXMKKyAgICAvKiogZXJyb3IgLSBjb21iaW5lZCBhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQk9USF9BVFRSSUJVVEVTID0KKyAgICAgICAgICAgICJQcm9wZXJ0eSBhbmQgZmVhdHVyZSBhdHRyaWJ1dGVzIGFyZSBleGNsdXNpdmUiOworICAgIC8qKiBmZWF0dXJlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRSA9ICJmZWF0dXJlIjsKKyAgICAvKiogcHJvcGVydHkgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7CisKKyAgICAvKiogZXJyb3IgLSBub3QgcmVjb2duaXplZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9SRUNPR05JWkVEID0KKyAgICAgICAgICAgICIgbm90IHJlY29nbml6ZWQ6ICI7CisgICAgLyoqIGVycm9yIC0gbm90IHN1cHBvcnRlZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TVVBQT1JURUQgPQorICAgICAgICAgICAgIiBub3Qgc3VwcG9ydGVkOiAiOworICAgIC8qKiBlcnJvciAtIG1pc3NpbmcgYXR0cmlidXRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fQVRUUklCVVRFUyA9CisgICAgICAgICJOZWl0aGVyIGZlYXR1cmUgb3IgcHJvcGVydHkgYXJlIHNldCI7CisgICAgLyoqIGVycm9yIC0gbm8gdmFsdWUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19WQUxVRSA9CisgICAgICAgICJBIHZhbHVlIGlzIG5lZWRlZCB3aGVuIHRlc3RpbmcgZm9yIHByb3BlcnR5IHN1cHBvcnQiOworCisgICAgLyoqCisgICAgICogRmVhdHVyZSB0byBwcm9iZSBmb3IuCisgICAgICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUgdG8gcHJvYmUgZm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKKyAgICAgICAgdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSB0byBwcm9iZSBmb3IKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IHRvIHByb2JlIGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsIHZhbHVlIHRvIHNldC4KKyAgICAgKiBDb252ZXJ0ZWQgdG8gYSBib29sZWFuIHZhbHVlIHdoZW4gc2V0dGluZyBhIHByb3BlcnR5CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCAmJiBwcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfQk9USF9BVFRSSUJVVEVTKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmVhdHVyZSA9PSBudWxsICYmIHByb3BlcnR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19BVFRSSUJVVEVTKTsKKyAgICAgICAgfQorICAgICAgICAvL3BpY2sgYSB2YWx1ZSB0aGF0IGlzIGdvb2QgZm9yIGV2ZXJ5dGhpbmcKKyAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGV2YWxGZWF0dXJlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19WQUxVRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV2YWxQcm9wZXJ0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBvdXIgcmVhZGVyCisgICAgICogQHJldHVybiBhIHJlYWRlcgorICAgICAqLworICAgIHByaXZhdGUgWE1MUmVhZGVyIGdldFJlYWRlcigpIHsKKyAgICAgICAgSkFYUFV0aWxzLmdldFBhcnNlcigpOworICAgICAgICByZXR1cm4gSkFYUFV0aWxzLmdldFhNTFJlYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIGZlYXR1cmUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZlYXR1cmUgY291bGQgYmUgc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbEZlYXR1cmUoKSB7CisgICAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBnZXRSZWFkZXIoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlID0gInRydWUiOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gdiA9IFByb2plY3QudG9Cb29sZWFuKHZhbHVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5zZXRGZWF0dXJlKGZlYXR1cmUsIHYpOworICAgICAgICB9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZyhGRUFUVVJFICsgTk9UX1JFQ09HTklaRUQgKyBmZWF0dXJlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZyhGRUFUVVJFICsgTk9UX1NVUFBPUlRFRCArIGZlYXR1cmUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHByb3BlcnR5CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIGNvdWxkIGJlIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV2YWxQcm9wZXJ0eSgpIHsKKyAgICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IGdldFJlYWRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKFBST1BFUlRZICsgTk9UX1JFQ09HTklaRUQgKyBwcm9wZXJ0eSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coUFJPUEVSVFkgKyBOT1RfU1VQUE9SVEVEICsgcHJvcGVydHksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9SZXNvdXJjZUNvbnRhaW5zLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUmVzb3VyY2VDb250YWlucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzZhZDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUmVzb3VyY2VDb250YWlucy5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKg0KKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOw0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsNCisNCisvKioNCisgKiAmbHQ7cmVzb3VyY2Vjb250YWlucyZndDsNCisgKiBJcyBhIHN0cmluZyBjb250YWluZWQgaW4gYSByZXNvdXJjZSAoZmlsZSBjdXJyZW50bHkpPw0KKyAqIEBzaW5jZSBBbnQgMS43LjENCisgKi8NCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VDb250YWlucyBpbXBsZW1lbnRzIENvbmRpdGlvbiB7DQorDQorICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0Ow0KKyAgICBwcml2YXRlIFN0cmluZyBzdWJzdHJpbmc7DQorICAgIHByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7DQorICAgIHByaXZhdGUgU3RyaW5nIHJlZmlkOw0KKyAgICBwcml2YXRlIGJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IHRydWU7DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXQgdGhpcyBjb25kaXRpb24ncyBQcm9qZWN0Lg0KKyAgICAgKiBAcGFyYW0gcHJvamVjdCBQcm9qZWN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgew0KKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoaXMgY29uZGl0aW9uJ3MgUHJvamVjdC4NCisgICAgICogQHJldHVybiBQcm9qZWN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgew0KKyAgICAgICAgcmV0dXJuIHByb2plY3Q7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNldHMgdGhlIHJlc291cmNlIHRvIHNlYXJjaA0KKyAgICAgKiBAcGFyYW0gciB0aGUgdmFsdWUgdG8gdXNlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoU3RyaW5nIHIpIHsNCisgICAgICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgRmlsZVJlc291cmNlKG5ldyBGaWxlKHIpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgcmVmaWQgdG8gc2VhcmNoOyBzaG91bGQgaW5kaWNhdGUgYSByZXNvdXJjZSBkaXJlY3RseQ0KKyAgICAgKiBvciBieSB3YXkgb2YgYSBzaW5nbGUtZWxlbWVudCBSZXNvdXJjZUNvbGxlY3Rpb24uDQorICAgICAqIEBwYXJhbSByZWZpZCB0aGUgdmFsdWUgdG8gdXNlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoU3RyaW5nIHJlZmlkKSB7DQorICAgICAgICB0aGlzLnJlZmlkID0gcmVmaWQ7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVSZWZpZCgpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHJldHJpZXZlIHJlZmlkOyBwcm9qZWN0IHVuc2V0Iik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIE9iamVjdCBvID0gZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShyZWZpZCk7DQorICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFJlc291cmNlKSkgew0KKyAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFJlc291cmNlQ29sbGVjdGlvbikgew0KKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIHJjID0gKFJlc291cmNlQ29sbGVjdGlvbikgbzsNCisgICAgICAgICAgICAgICAgICAgIGlmIChyYy5zaXplKCkgPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSByYy5pdGVyYXRvcigpLm5leHQoKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCB2YWx1ZSBhdCAnIiArIHJlZmlkICsgIic6ICIgKyBTdHJpbmcudmFsdWVPZihvKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IChSZXNvdXJjZSkgbzsNCisgICAgICAgIH0gZmluYWxseSB7DQorICAgICAgICAgICAgcmVmaWQgPSBudWxsOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXRzIHRoZSBzdWJzdHJpbmcgdG8gbG9vayBmb3INCisgICAgICogQHBhcmFtIHN1YnN0cmluZyB0aGUgdmFsdWUgdG8gdXNlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0U3Vic3RyaW5nKFN0cmluZyBzdWJzdHJpbmcpIHsNCisgICAgICAgIHRoaXMuc3Vic3RyaW5nID0gc3Vic3RyaW5nOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXRzIGNhc2Ugc2Vuc2l0aXZpdHkgYXR0cmlidXRlLg0KKyAgICAgKiBAcGFyYW0gY2FzZXNlbnNpdGl2ZSB0aGUgdmFsdWUgdG8gdXNlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0Q2FzZXNlbnNpdGl2ZShib29sZWFuIGNhc2VzZW5zaXRpdmUpIHsNCisgICAgICAgIHRoaXMuY2FzZXNlbnNpdGl2ZSA9IGNhc2VzZW5zaXRpdmU7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgew0KKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVmaWQgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHNldCBib3RoIHJlc291cmNlIGFuZCByZWZpZCIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwgJiYgcmVmaWQgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHJlc29sdmVSZWZpZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwgfHwgc3Vic3RyaW5nID09IG51bGwpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJvdGggcmVzb3VyY2UgYW5kIHN1YnN0cmluZyBhcmUgcmVxdWlyZWQgIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpbiA8cmVzb3VyY2Vjb250YWlucz4iKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRXZhbHVhdGVzIHRoZSBjb25kaXRpb24uDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3Vic3RyaW5nIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVzb3VyY2UNCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7DQorICAgICAgICB2YWxpZGF0ZSgpOw0KKw0KKyAgICAgICAgaWYgKHN1YnN0cmluZy5sZW5ndGgoKSA9PSAwKSB7DQorICAgICAgICAgICAgaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIlN1YnN0cmluZyBpcyBlbXB0eTsgcmV0dXJuaW5nIHRydWUiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChyZXNvdXJjZS5nZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSkpOw0KKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50cyA9IEZpbGVVdGlscy5zYWZlUmVhZEZ1bGx5KHJlYWRlcik7DQorICAgICAgICAgICAgU3RyaW5nIHN1YiA9IHN1YnN0cmluZzsNCisgICAgICAgICAgICBpZiAoIWNhc2VzZW5zaXRpdmUpIHsNCisgICAgICAgICAgICAgICAgY29udGVudHMgPSBjb250ZW50cy50b0xvd2VyQ2FzZSgpOw0KKyAgICAgICAgICAgICAgICBzdWIgPSBzdWIudG9Mb3dlckNhc2UoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRzLmluZGV4T2Yoc3ViKSA+PSAwOw0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlcmUgd2FzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgcmVzb3VyY2UgOiAiICsgcmVzb3VyY2UpOw0KKyAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UocmVhZGVyKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUmVzb3VyY2VzTWF0Y2guamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9SZXNvdXJjZXNNYXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzY0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUmVzb3VyY2VzTWF0Y2guamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5VbmlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlc291cmNlVXRpbHM7CisKKy8qKgorICogQ29tcGFyZXMgcmVzb3VyY2VzIGZvciBlcXVhbGl0eSBiYXNlZCBvbiBzaXplIGFuZCBjb250ZW50LgorICogQWxsIHJlc291cmNlcyBzcGVjaWZpZWQgbXVzdCBtYXRjaDsgbm8gcmVzb3VyY2UgY29sbGVjdGlvbnMKKyAqIHNwZWNpZmllZCBpcyBhbiBlcnJvciBjb25kaXRpb247IGlmIHJlc291cmNlIGNvbGxlY3Rpb25zIGFyZQorICogc3BlY2lmaWVkLCBidXQgeWllbGQgZmV3ZXIgdGhhbiB0d28gZWxlbWVudHMsIHRoZSBjb25kaXRpb24KKyAqIGV2YWx1YXRlcyB0byA8Y29kZT50cnVlPC9jb2RlPi4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNNYXRjaCBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICBwcml2YXRlIFVuaW9uIHJlc291cmNlcyA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIGFzVGV4dCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gdHJlYXQgcmVzb3VyY2VzIGFzIGlmIHRoZXkgd2VyZSB0ZXh0IGZpbGVzLAorICAgICAqIGlnbm9yaW5nIGxpbmUgZW5kaW5ncy4KKyAgICAgKiBAcGFyYW0gYXNUZXh0IHdoZXRoZXIgdG8gaWdub3JlIGxpbmUgZW5kaW5ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBc1RleHQoYm9vbGVhbiBhc1RleHQpIHsKKyAgICAgICAgdGhpcy5hc1RleHQgPSBhc1RleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcmMgdGhlIHJlc291cmNlIGNvbGxlY3Rpb24gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmMpIHsKKyAgICAgICAgaWYgKHJjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZXMgPSByZXNvdXJjZXMgPT0gbnVsbCA/IG5ldyBVbmlvbigpIDogcmVzb3VyY2VzOworICAgICAgICByZXNvdXJjZXMuYWRkKHJjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCBhbGwgcmVzb3VyY2VzIG1hdGNoLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgcmVzb3VyY2VzIGFyZSBlcXVhbC4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBvbmUgb3IgbW9yZSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzb3VyY2VzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIFJlc291cmNlIHIxID0gKFJlc291cmNlKSBpLm5leHQoKTsKKyAgICAgICAgICAgIFJlc291cmNlIHIyID0gbnVsbDsKKworICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcjIgPSAoUmVzb3VyY2UpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghUmVzb3VyY2VVdGlscy5jb250ZW50RXF1YWxzKHIxLCByMiwgYXNUZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigid2hlbiBjb21wYXJpbmcgcmVzb3VyY2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcjEudG9TdHJpbmcoKSArICIgYW5kICIgKyByMi50b1N0cmluZygpLCBpb2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByMSA9IHIyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Tb2NrZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Tb2NrZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDEzN2UwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1NvY2tldC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKKworLyoqCisgKiBDb25kaXRpb24gdG8gd2FpdCBmb3IgYSBUQ1AvSVAgc29ja2V0IHRvIGhhdmUgYSBsaXN0ZW5lci4gSXRzIGF0dHJpYnV0ZXMgYXJlOgorICogICBzZXJ2ZXIgLSB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLgorICogICBwb3J0IC0gdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBzb2NrZXQuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIFNvY2tldCBleHRlbmRzIFByb2plY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb25kaXRpb24geworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZlciA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlcnZlciBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyKFN0cmluZyBzZXJ2ZXIpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwb3J0IGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBzb2NrZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGEgc29ja2V0IGNhbiBiZSBjcmVhdGVkCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgYXR0cmlidXRlcyBhcmUgbm90IHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gc2VydmVyIHNwZWNpZmllZCBpbiBzb2NrZXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbmRpdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChwb3J0ID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcG9ydCBzcGVjaWZpZWQgaW4gc29ja2V0IGNvbmRpdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGxvZygiQ2hlY2tpbmcgZm9yIGxpc3RlbmVyIGF0ICIgKyBzZXJ2ZXIgKyAiOiIgKyBwb3J0LAorICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIGphdmEubmV0LlNvY2tldCBzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMgPSBuZXcgamF2YS5uZXQuU29ja2V0KHNlcnZlciwgcG9ydCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1R5cGVGb3VuZC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1R5cGVGb3VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OWI4NTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vVHlwZUZvdW5kLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkNvbXBvbmVudEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50VHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBsb29rcyBmb3IgYSB0YXNrIG9yIG90aGVyIEFudCB0eXBlIHRoYXQgZXhpc3RzLiBFeGlzdGVuY2UgaXMgZGVmaW5lZCBhcworICogdGhlIHR5cGUgaXMgZGVmaW5lZCwgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpcyBwcmVzZW50LiBUaGlzCisgKiB3aWxsIHdvcmsgZm9yIGRhdGF0eXBlcyBhbmQgcHJlc2V0LCBzY3JpcHQgYW5kIG1hY3JvIGRlZmluaXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgVHlwZUZvdW5kIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKKworICAgIC8qKgorICAgICAqIHRoZSB0YXNrIG9yIG90aGVyIHR5cGUgdG8gbG9vayBmb3IKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIGZvciB0aGlzIGRlZmluaXRpb24uCisgICAgICogQHBhcmFtIHVyaSB0aGUgbmFtZXNwYWNlIFVSSS4gSWYgdGhpcyBpcyBub3Qgc2V0LCB1c2UgdGhlCisgICAgICogICAgICAgICAgICBkZWZhdWx0IGFudCBuYW1lc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpIHsKKyAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBmb3IgYSB0YXNrIG9yIG90aGVyIGFudCB0eXBlIGV4aXN0aW5nIGluIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcGFyYW0gdHlwZW5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR5cGVuYW1lIGV4aXN0cworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRvZXNUeXBlRXhpc3QoU3RyaW5nIHR5cGVuYW1lKSB7CisKKyAgICAgICAgQ29tcG9uZW50SGVscGVyIGhlbHBlciA9CisgICAgICAgICAgICBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKGdldFByb2plY3QoKSk7CisgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gUHJvamVjdEhlbHBlci5nZW5Db21wb25lbnROYW1lKHVyaSwgdHlwZW5hbWUpOworICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSBoZWxwZXIuZ2V0RGVmaW5pdGlvbihjb21wb25lbnROYW1lKTsKKyAgICAgICAgaWYgKGRlZiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy9ub3cgdmVyaWZ5IHRoYXQgdGhlIGNsYXNzIGhhcyBhbiBpbXBsZW1lbnRhdGlvbgorICAgICAgICBib29sZWFuIGZvdW5kID0gZGVmLmdldEV4cG9zZWRDbGFzcyhnZXRQcm9qZWN0KCkpICE9IG51bGw7CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gaGVscGVyLmRpYWdub3NlQ3JlYXRpb25GYWlsdXJlKGNvbXBvbmVudE5hbWUsICJ0eXBlIik7CisgICAgICAgICAgICBsb2codGV4dCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvdW5kOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyBjb25kaXRpb24gdHJ1ZT8KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyB0eXBlIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkb2VzVHlwZUV4aXN0KG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Yb3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Yb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE0YmRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1hvci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICogVGhlIDx0dD5Yb3I8L3R0PiBjb25kaXRpb24gdHlwZSB0byBleGNsdXNpdmUgb3Igb3BlcmF0aW9ucy4KKyAqIFRoaXMgZG9lcyBub3Qgc2hvcnRjdXQgc3R1ZmYuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgWG9yIGV4dGVuZHMgQ29uZGl0aW9uQmFzZSBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSB0aGUgY29udGFpbmVkIGNvbmRpdGlvbnMuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHhvcmluZyB0aGUgY29uZGl0aW9ucyB0b2dldGhlci4KKyAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBFbnVtZXJhdGlvbiBlID0gZ2V0Q29uZGl0aW9ucygpOworICAgICAgICAvL2luaXRpYWwgc3RhdGUgaXMgZmFsc2UuCisgICAgICAgIGJvb2xlYW4gc3RhdGUgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIENvbmRpdGlvbiBjID0gKENvbmRpdGlvbikgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgLy9ldmVyeSBjb25kaXRpb24gaXMgeG9yZWQgYWdhaW5zdCB0aGUgcHJldmlvdXMgb25lCisgICAgICAgICAgICBzdGF0ZSBePSBjLmV2YWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ1ZTRW50cnkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DVlNFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYTlhMTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ1ZTRW50cnkuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWI7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIENWUyBFbnRyeS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDVlNFbnRyeSB7CisgICAgcHJpdmF0ZSBEYXRlIGRhdGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbW1lbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3IgZmlsZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGEgQ1ZTRW50cnkKKyAgICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZQorICAgICAqIEBwYXJhbSBhdXRob3IgdGhlIGF1dGhvcgorICAgICAqIEBwYXJhbSBjb21tZW50IGEgY29tbWVudCB0byBiZSBhZGRlZCB0byB0aGUgcmV2aXNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ1ZTRW50cnkoZmluYWwgRGF0ZSBkYXRlLCBmaW5hbCBTdHJpbmcgYXV0aG9yLCBmaW5hbCBTdHJpbmcgY29tbWVudCkgeworICAgICAgICB0aGlzLmRhdGUgPSBkYXRlOworICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsKKyAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZmlsZSB0byB0aGUgQ1ZTRW50cnkKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBhZGQKKyAgICAgKiBAcGFyYW0gcmV2aXNpb24gdGhlIHJldmlzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZShmaW5hbCBTdHJpbmcgZmlsZSwgZmluYWwgU3RyaW5nIHJldmlzaW9uKSB7CisgICAgICAgIGZpbGVzLmFkZEVsZW1lbnQobmV3IFJDU0ZpbGUoZmlsZSwgcmV2aXNpb24pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZmlsZSB0byB0aGUgQ1ZTRW50cnkKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBhZGQKKyAgICAgKiBAcGFyYW0gcmV2aXNpb24gdGhlIHJldmlzaW9uCisgICAgICogQHBhcmFtIHByZXZpb3VzUmV2aXNpb24gdGhlIHByZXZpb3VzIHJldmlzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZShmaW5hbCBTdHJpbmcgZmlsZSwgZmluYWwgU3RyaW5nIHJldmlzaW9uLCBmaW5hbCBTdHJpbmcgcHJldmlvdXNSZXZpc2lvbikgeworICAgICAgICBmaWxlcy5hZGRFbGVtZW50KG5ldyBSQ1NGaWxlKGZpbGUsIHJldmlzaW9uLCBwcmV2aW91c1JldmlzaW9uKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGF0ZSBvZiB0aGUgQ1ZTRW50cnkKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRlCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYXV0aG9yIG9mIHRoZSBDVlNFbnRyeQorICAgICAqIEBwYXJhbSBhdXRob3IgdGhlIGF1dGhvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhvcihmaW5hbCBTdHJpbmcgYXV0aG9yKSB7CisgICAgICAgIHRoaXMuYXV0aG9yID0gYXV0aG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGF1dGhvciBvZiB0aGUgQ1ZTRW50cnkKKyAgICAgKiBAcmV0dXJuIHRoZSBhdXRob3IKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhvcigpIHsKKyAgICAgICAgcmV0dXJuIGF1dGhvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjb21tZW50IGZvciB0aGUgQ1ZTRW50cnkKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tZW50CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gY29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaWxlcyBpbiB0aGlzIENWU0VudHJ5CisgICAgICogQHJldHVybiB0aGUgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgVmVjdG9yIGdldEZpbGVzKCkgeworICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIFN0cmluZyBjb250YWluaW5nIGF1dGhvciwgZGF0ZSwgZmlsZXMgYW5kIGNvbW1lbnQKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgQ1ZTRW50cnkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0QXV0aG9yKCkgKyAiXG4iICsgZ2V0RGF0ZSgpICsgIlxuIiArIGdldEZpbGVzKCkgKyAiXG4iCisgICAgICAgICAgICArIGdldENvbW1lbnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nUGFyc2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmMDMzNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dQYXJzZXIuamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWI7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKKy8qKgorICogQSBjbGFzcyB1c2VkIHRvIHBhcnNlIHRoZSBvdXRwdXQgb2YgdGhlIENWUyBsb2cgY29tbWFuZC4KKyAqCisgKi8KK2NsYXNzIENoYW5nZUxvZ1BhcnNlciB7CisgICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0VOVFJZID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0ZJTEUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfREFURSA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9DT01NRU5UID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1JFVklTSU9OID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1BSRVZJT1VTX1JFViA9IDU7CisKKy8vIEZJWE1FIGZvcm1hdHRlcnMgYXJlIG5vdCB0aHJlYWQtc2FmZQorCisgICAgLyoqIGlucHV0IGZvcm1hdCBmb3IgZGF0ZXMgcmVhZCBpbiBmcm9tIGN2cyBsb2cgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IElOUFVUX0RBVEUKKyAgICAgICAgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS9NTS9kZCBISDptbTpzcyIsIExvY2FsZS5VUyk7CisgICAgLyoqCisgICAgICogTmV3IGZvcm1hdHRlciB1c2VkIHRvIHBhcnNlIENWUyBkYXRlL3RpbWVzdGFtcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IENWUzExMjlfSU5QVVRfREFURSA9CisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzIFoiLCBMb2NhbGUuVVMpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgVGltZVpvbmUgdXRjID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIlVUQyIpOworICAgICAgICBJTlBVVF9EQVRFLnNldFRpbWVab25lKHV0Yyk7CisgICAgICAgIENWUzExMjlfSU5QVVRfREFURS5zZXRUaW1lWm9uZSh1dGMpOworICAgIH0KKworICAgIC8vVGhlIGZvbGxvd2luZyBpcyBkYXRhIHVzZWQgd2hpbGUgcHJvY2Vzc2luZyBzdGRvdXQgb2YgQ1ZTIGNvbW1hbmQKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlOworICAgIHByaXZhdGUgU3RyaW5nIGRhdGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yOworICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmV2aXNpb247CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJldmlvdXNSZXZpc2lvbjsKKworICAgIHByaXZhdGUgaW50IHN0YXR1cyA9IEdFVF9GSUxFOworCisgICAgLyoqIHJjcyBlbnRyaWVzICovCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGUgZW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCBhIGxpc3Qgb2YgcmNzIGVudHJpZXMgYXMgYW4gYXJyYXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiByY3MgZW50cmllcyBhcyBhbiBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBDVlNFbnRyeVtdIGdldEVudHJ5U2V0QXNBcnJheSgpIHsKKyAgICAgICAgZmluYWwgQ1ZTRW50cnlbXSBhcnJheSA9IG5ldyBDVlNFbnRyeVsgZW50cmllcy5zaXplKCkgXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBlbnRyaWVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBhcnJheVtpKytdID0gKENWU0VudHJ5KSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIGFib3V0IHRoZSBwcm9jZXNzIHdyaXRpbmcKKyAgICAgKiB0byBzdGFuZGFyZCBvdXRwdXQuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gcHJvY2VzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0ZG91dChmaW5hbCBTdHJpbmcgbGluZSkgeworICAgICAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIEdFVF9GSUxFOgorICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhdHRyaWJ1dGVzIGFyZSByZXNldCB3aGVuCisgICAgICAgICAgICAgICAgLy8gd29ya2luZyBvbiBhICduZXcnIGZpbGUuCisgICAgICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShsaW5lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0VUX1JFVklTSU9OOgorICAgICAgICAgICAgICAgIHByb2Nlc3NSZXZpc2lvbihsaW5lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBHRVRfREFURToKKyAgICAgICAgICAgICAgICBwcm9jZXNzRGF0ZShsaW5lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBHRVRfQ09NTUVOVDoKKyAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWVudChsaW5lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBHRVRfUFJFVklPVVNfUkVWOgorICAgICAgICAgICAgICAgIHByb2Nlc3NHZXRQcmV2aW91c1JldmlzaW9uKGxpbmUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBsaW5lIHdoaWxlIGluICJHRVRfQ09NTUVOVCIgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tbWVudChmaW5hbCBTdHJpbmcgbGluZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgaWYgKGxpbmUuZXF1YWxzKAorICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpKSB7CisgICAgICAgICAgICAvL1dlIGhhdmUgZW5kZWQgY2hhbmdlbG9nIGZvciB0aGF0IHBhcnRpY3VsYXIgZmlsZQorICAgICAgICAgICAgLy9zbyB3ZSBjYW4gc2F2ZSBpdAorICAgICAgICAgICAgZmluYWwgaW50IGVuZAorICAgICAgICAgICAgICAgID0gY29tbWVudC5sZW5ndGgoKSAtIGxpbmVTZXBhcmF0b3IubGVuZ3RoKCk7IC8vd2FzIC0xCisgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5zdWJzdHJpbmcoMCwgZW5kKTsKKyAgICAgICAgICAgIHNhdmVFbnRyeSgpOworICAgICAgICAgICAgc3RhdHVzID0gR0VUX0ZJTEU7CisgICAgICAgIH0gZWxzZSBpZiAobGluZS5lcXVhbHMoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKSkgeworICAgICAgICAgICAgZmluYWwgaW50IGVuZAorICAgICAgICAgICAgICAgID0gY29tbWVudC5sZW5ndGgoKSAtIGxpbmVTZXBhcmF0b3IubGVuZ3RoKCk7IC8vd2FzIC0xCisgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5zdWJzdHJpbmcoMCwgZW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEdFVF9QUkVWSU9VU19SRVY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21tZW50ICs9IGxpbmUgKyBsaW5lU2VwYXJhdG9yOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIGxpbmUgd2hpbGUgaW4gIkdFVF9GSUxFIiBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIHByb2Nlc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZpbGUoZmluYWwgU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiV29ya2luZyBmaWxlOiIpKSB7CisgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICAgICAgZmlsZSA9IGxpbmUuc3Vic3RyaW5nKDE0LCBsaW5lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgICAgIHN0YXR1cyA9IEdFVF9SRVZJU0lPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBsaW5lIHdoaWxlIGluICJSRVZJU0lPTiIgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwcm9jZXNzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXZpc2lvbihmaW5hbCBTdHJpbmcgbGluZSkgeworICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJyZXZpc2lvbiIpKSB7CisgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICAgICAgcmV2aXNpb24gPSBsaW5lLnN1YnN0cmluZyg5KTsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgICAgIHN0YXR1cyA9IEdFVF9EQVRFOworICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiPT09PT09IikpIHsKKyAgICAgICAgICAgIC8vVGhlcmUgd2VyZSBubyByZXZpc2lvbnMgaW4gdGhpcyBjaGFuZ2Vsb2cKKyAgICAgICAgICAgIC8vZW50cnkgc28gbGV0cyBtb3ZlIG9udG8gbmV4dCBmaWxlCisgICAgICAgICAgICBzdGF0dXMgPSBHRVRfRklMRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBsaW5lIHdoaWxlIGluICJEQVRFIiBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIHByb2Nlc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0RhdGUoZmluYWwgU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiZGF0ZToiKSkgeworICAgICAgICAgICAgLy8gVGhlIGRhdGUgZm9ybWF0IGlzIHVzaW5nIGEgLSBmb3JtYXQgc2luY2UgMS4xMi45IHNvIHdlIGhhdmU6CisgICAgICAgICAgICAvLyAxLjEyLjktOiAnZGF0ZTogWVlZWS9tbS9kZCBISDptbTpzczsgIGF1dGhvcjogbmFtZTsnCisgICAgICAgICAgICAvLyAxLjEyLjkrOiAnZGF0ZTogWVlZWS1tbS1kZCBISDptbTpzcyBaOyAgYXV0aG9yOiBuYW1lJworICAgICAgICAgICAgaW50IGVuZE9mRGF0ZUluZGV4ID0gbGluZS5pbmRleE9mKCc7Jyk7CisgICAgICAgICAgICBkYXRlID0gbGluZS5zdWJzdHJpbmcoImRhdGU6ICIubGVuZ3RoKCksIGVuZE9mRGF0ZUluZGV4KTsKKworICAgICAgICAgICAgaW50IHN0YXJ0T2ZBdXRob3JJbmRleCA9IGxpbmUuaW5kZXhPZigiYXV0aG9yOiAiLCBlbmRPZkRhdGVJbmRleCArIDEpOworICAgICAgICAgICAgaW50IGVuZE9mQXV0aG9ySW5kZXggPSBsaW5lLmluZGV4T2YoJzsnLCBzdGFydE9mQXV0aG9ySW5kZXggKyAxKTsKKyAgICAgICAgICAgIGF1dGhvciA9IGxpbmUuc3Vic3RyaW5nKCJhdXRob3I6ICIubGVuZ3RoKCkgKyBzdGFydE9mQXV0aG9ySW5kZXgsIGVuZE9mQXV0aG9ySW5kZXgpOworCisgICAgICAgICAgICBzdGF0dXMgPSBHRVRfQ09NTUVOVDsKKworICAgICAgICAgICAgLy9SZXNldCBjb21tZW50IHRvIGVtcHR5IGhlcmUgYXMgd2UgY2FuIGFjY3VtdWxhdGUgbXVsdGlwbGUgbGluZXMKKyAgICAgICAgICAgIC8vaW4gdGhlIHByb2Nlc3NDb21tZW50IG1ldGhvZAorICAgICAgICAgICAgY29tbWVudCA9ICIiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIGxpbmUgd2hpbGUgaW4gIkdFVF9QUkVWSU9VU19SRVZJU0lPTiIgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwcm9jZXNzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NHZXRQcmV2aW91c1JldmlzaW9uKGZpbmFsIFN0cmluZyBsaW5lKSB7CisgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCJyZXZpc2lvbiAiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBsaW5lIGZyb20gQ1ZTOiAiCisgICAgICAgICAgICAgICAgKyBsaW5lKTsKKyAgICAgICAgfQorICAgICAgICBwcmV2aW91c1JldmlzaW9uID0gbGluZS5zdWJzdHJpbmcoInJldmlzaW9uICIubGVuZ3RoKCkpOworCisgICAgICAgIHNhdmVFbnRyeSgpOworCisgICAgICAgIHJldmlzaW9uID0gcHJldmlvdXNSZXZpc2lvbjsKKyAgICAgICAgc3RhdHVzID0gR0VUX0RBVEU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBzYXZlcyB0aGUgY3VycmVudCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2F2ZUVudHJ5KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZW50cnlLZXkgPSBkYXRlICsgYXV0aG9yICsgY29tbWVudDsKKyAgICAgICAgQ1ZTRW50cnkgZW50cnk7CisgICAgICAgIGlmICghZW50cmllcy5jb250YWluc0tleShlbnRyeUtleSkpIHsKKyAgICAgICAgICAgIERhdGUgZGF0ZU9iamVjdCA9IHBhcnNlRGF0ZShkYXRlKTsKKyAgICAgICAgICAgIGVudHJ5ID0gbmV3IENWU0VudHJ5KGRhdGVPYmplY3QsIGF1dGhvciwgY29tbWVudCk7CisgICAgICAgICAgICBlbnRyaWVzLnB1dChlbnRyeUtleSwgZW50cnkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW50cnkgPSAoQ1ZTRW50cnkpIGVudHJpZXMuZ2V0KGVudHJ5S2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5LmFkZEZpbGUoZmlsZSwgcmV2aXNpb24sIHByZXZpb3VzUmV2aXNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGRhdGUgb3V0IGZyb20gZXhwZWN0ZWQgZm9ybWF0LgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGUgdGhlIHN0cmluZyBob2xkaW5nIGRhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRlIG9iamVjdCBvciBudWxsIGlmIHVua25vd24gZGF0ZSBmb3JtYXQKKyAgICAgKi8KKyAgICBwcml2YXRlIERhdGUgcGFyc2VEYXRlKGZpbmFsIFN0cmluZyBkYXRlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gSU5QVVRfREFURS5wYXJzZShkYXRlKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZTMTEyOV9JTlBVVF9EQVRFLnBhcnNlKGRhdGUpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGUgZm9ybWF0OiAiICsgZGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgaW50ZXJuYWwgYXR0cmlidXRlcyBleGNlcHQgc3RhdHVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICB0aGlzLmZpbGUgPSBudWxsOworICAgICAgICB0aGlzLmRhdGUgPSBudWxsOworICAgICAgICB0aGlzLmF1dGhvciA9IG51bGw7CisgICAgICAgIHRoaXMuY29tbWVudCA9IG51bGw7CisgICAgICAgIHRoaXMucmV2aXNpb24gPSBudWxsOworICAgICAgICB0aGlzLnByZXZpb3VzUmV2aXNpb24gPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dUYXNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjkwOTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nVGFzay5qYXZhCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQWJzdHJhY3RDdnNUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogRXhhbWluZXMgdGhlIG91dHB1dCBvZiBjdnMgbG9nIGFuZCBncm91cCByZWxhdGVkIGNoYW5nZXMgdG9nZXRoZXIuCisgKgorICogSXQgcHJvZHVjZXMgYW4gWE1MIG91dHB1dCByZXByZXNlbnRpbmcgdGhlIGxpc3Qgb2YgY2hhbmdlcy4KKyAqIDxwcmU+CisgKiA8Zm9udCBjb2xvcj0jMDAwMGZmPiZsdDshLS0gUm9vdCBlbGVtZW50IC0tJmd0OzwvZm9udD4KKyAqIDxmb250IGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9mb250PiBjaGFuZ2Vsb2cgPGZvbnQgY29sb3I9I2ZmMDBmZj4KKyAqIChlbnRyeTwvZm9udD48Zm9udCBjb2xvcj0jZmYwMGZmPis8L2ZvbnQ+PGZvbnQgY29sb3I9I2ZmMDBmZj4pCisgKiA8L2ZvbnQ+PGZvbnQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9mb250PgorICogPGZvbnQgY29sb3I9IzAwMDBmZj4mbHQ7IS0tIENWUyBFbnRyeSAtLSZndDs8L2ZvbnQ+CisgKiA8Zm9udCBjb2xvcj0jNmE1YWNkPiZsdDshRUxFTUVOVDwvZm9udD4gZW50cnkgPGZvbnQgY29sb3I9I2ZmMDBmZj4KKyAqIChkYXRlLGF1dGhvcixmaWxlPC9mb250Pjxmb250IGNvbG9yPSNmZjAwZmY+KzwvZm9udD48Zm9udCBjb2xvcj0jZmYwMGZmPixtc2cpCisgKiA8L2ZvbnQ+PGZvbnQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9mb250PgorICogPGZvbnQgY29sb3I9IzAwMDBmZj4mbHQ7IS0tIERhdGUgb2YgY3ZzIGVudHJ5IC0tJmd0OzwvZm9udD4KKyAqIDxmb250IGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9mb250PiBkYXRlIDxmb250IGNvbG9yPSNmZjAwZmY+KCNQQ0RBVEEpCisgKiA8L2ZvbnQ+PGZvbnQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9mb250PgorICogPGZvbnQgY29sb3I9IzAwMDBmZj4mbHQ7IS0tIEF1dGhvciBvZiBjaGFuZ2UgLS0mZ3Q7PC9mb250PgorICogPGZvbnQgY29sb3I9IzZhNWFjZD4mbHQ7IUVMRU1FTlQ8L2ZvbnQ+IGF1dGhvciA8Zm9udCBjb2xvcj0jZmYwMGZmPigjUENEQVRBKQorICogPC9mb250Pjxmb250IGNvbG9yPSM2YTVhY2Q+Jmd0OzwvZm9udD4KKyAqIDxmb250IGNvbG9yPSMwMDAwZmY+Jmx0OyEtLSBMaXN0IG9mIGZpbGVzIGFmZmVjdGVkIC0tJmd0OzwvZm9udD4KKyAqIDxmb250IGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9mb250PiBtc2cgPGZvbnQgY29sb3I9I2ZmMDBmZj4oI1BDREFUQSkKKyAqIDwvZm9udD48Zm9udCBjb2xvcj0jNmE1YWNkPiZndDs8L2ZvbnQ+CisgKiA8Zm9udCBjb2xvcj0jMDAwMGZmPiZsdDshLS0gRmlsZSBjaGFuZ2VkIC0tJmd0OzwvZm9udD4KKyAqIDxmb250IGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9mb250PiBmaWxlIDxmb250IGNvbG9yPSNmZjAwZmY+CisgKiAobmFtZSxyZXZpc2lvbixwcmV2cmV2aXNpb248L2ZvbnQ+PGZvbnQgY29sb3I9I2ZmMDBmZj4/PC9mb250PgorICogPGZvbnQgY29sb3I9I2ZmMDBmZj4pPC9mb250Pjxmb250IGNvbG9yPSM2YTVhY2Q+Jmd0OzwvZm9udD4KKyAqIDxmb250IGNvbG9yPSMwMDAwZmY+Jmx0OyEtLSBOYW1lIG9mIHRoZSBmaWxlIC0tJmd0OzwvZm9udD4KKyAqIDxmb250IGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9mb250PiBuYW1lIDxmb250IGNvbG9yPSNmZjAwZmY+KCNQQ0RBVEEpCisgKiA8L2ZvbnQ+PGZvbnQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9mb250PgorICogPGZvbnQgY29sb3I9IzAwMDBmZj4mbHQ7IS0tIFJldmlzaW9uIG51bWJlciAtLSZndDs8L2ZvbnQ+CisgKiA8Zm9udCBjb2xvcj0jNmE1YWNkPiZsdDshRUxFTUVOVDwvZm9udD4gcmV2aXNpb24gPGZvbnQgY29sb3I9I2ZmMDBmZj4KKyAqICgjUENEQVRBKTwvZm9udD48Zm9udCBjb2xvcj0jNmE1YWNkPiZndDs8L2ZvbnQ+CisgKiA8Zm9udCBjb2xvcj0jMDAwMGZmPiZsdDshLS0gUHJldmlvdXMgcmV2aXNpb24gbnVtYmVyIC0tJmd0OzwvZm9udD4KKyAqIDxmb250IGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9mb250PiBwcmV2cmV2aXNpb24gPGZvbnQgY29sb3I9I2ZmMDBmZj4KKyAqICgjUENEQVRBKTwvZm9udD48Zm9udCBjb2xvcj0jNmE1YWNkPiZndDs8L2ZvbnQ+CisgKiA8L3ByZT4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICogQGFudC50YXNrIG5hbWU9ImN2c2NoYW5nZWxvZyIgY2F0ZWdvcnk9InNjbSIKKyAqLworcHVibGljIGNsYXNzIENoYW5nZUxvZ1Rhc2sgZXh0ZW5kcyBBYnN0cmFjdEN2c1Rhc2sgeworICAgIC8qKiBVc2VyIGxpc3QgKi8KKyAgICBwcml2YXRlIEZpbGUgdXNlcnNGaWxlOworCisgICAgLyoqIFVzZXIgbGlzdCAqLworICAgIHByaXZhdGUgVmVjdG9yIGN2c1VzZXJzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIElucHV0IGRpciAqLworICAgIHByaXZhdGUgRmlsZSBpbnB1dERpcjsKKworICAgIC8qKiBPdXRwdXQgZmlsZSAqLworICAgIHByaXZhdGUgRmlsZSBkZXN0RmlsZTsKKworICAgIC8qKiBUaGUgZWFybGllc3QgZGF0ZSBhdCB3aGljaCB0byBzdGFydCBwcm9jZXNzaW5nIGVudHJpZXMuICAqLworICAgIHByaXZhdGUgRGF0ZSBzdGFydERhdGU7CisKKyAgICAvKiogVGhlIGxhdGVzdCBkYXRlIGF0IHdoaWNoIHRvIHN0b3AgcHJvY2Vzc2luZyBlbnRyaWVzLiAgKi8KKyAgICBwcml2YXRlIERhdGUgZW5kRGF0ZTsKKworICAgIC8qKgorICAgICAqIEZpbGVzZXRzIGNvbnRhaW5pbmcgbGlzdCBvZiBmaWxlcyBhZ2FpbnN0IHdoaWNoIHRoZSBjdnMgbG9nIHdpbGwgYmUKKyAgICAgKiBwZXJmb3JtZWQuIElmIGVtcHR5IHRoZW4gYWxsIGZpbGVzIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aWxsCisgICAgICogYmUgY2hlY2tlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiYXNlIGRpciBmb3IgY3ZzLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0RGlyIFRoZSBuZXcgZGlyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyKGZpbmFsIEZpbGUgaW5wdXREaXIpIHsKKyAgICAgICAgdGhpcy5pbnB1dERpciA9IGlucHV0RGlyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgZmlsZSBmb3IgdGhlIGxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXN0RmlsZSBUaGUgbmV3IGRlc3RmaWxlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGZpbGUoZmluYWwgRmlsZSBkZXN0RmlsZSkgeworICAgICAgICB0aGlzLmRlc3RGaWxlID0gZGVzdEZpbGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBsb29rdXAgbGlzdCBvZiB1c2VyIG5hbWVzICYgYWRkcmVzc2VzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcnNGaWxlIFRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHVzZXJzIGluZm8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcnNmaWxlKGZpbmFsIEZpbGUgdXNlcnNGaWxlKSB7CisgICAgICAgIHRoaXMudXNlcnNGaWxlID0gdXNlcnNGaWxlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgdXNlciB0byBsaXN0IGNoYW5nZWxvZyBrbm93cyBhYm91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIHRoZSB1c2VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVXNlcihmaW5hbCBDdnNVc2VyIHVzZXIpIHsKKyAgICAgICAgY3ZzVXNlcnMuYWRkRWxlbWVudCh1c2VyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGF0ZSBhdCB3aGljaCB0aGUgY2hhbmdlbG9nIHNob3VsZCBzdGFydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCBUaGUgZGF0ZSBhdCB3aGljaCB0aGUgY2hhbmdlbG9nIHNob3VsZCBzdGFydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydChmaW5hbCBEYXRlIHN0YXJ0KSB7CisgICAgICAgIHRoaXMuc3RhcnREYXRlID0gc3RhcnQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRhdGUgYXQgd2hpY2ggdGhlIGNoYW5nZWxvZyBzaG91bGQgc3RvcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmREYXRlIFRoZSBkYXRlIGF0IHdoaWNoIHRoZSBjaGFuZ2Vsb2cgc2hvdWxkIHN0b3AuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5kKGZpbmFsIERhdGUgZW5kRGF0ZSkgeworICAgICAgICB0aGlzLmVuZERhdGUgPSBlbmREYXRlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBudW1iZXIgb2YgZGF5cyB3b3J0aCBvZiBsb2cgZW50cmllcyB0byBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGRheXMgdGhlIG51bWJlciBvZiBkYXlzIG9mIGxvZyB0byBwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERheXNpbnBhc3QoZmluYWwgaW50IGRheXMpIHsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgICAgICAtIChsb25nKSBkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMDsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorCisgICAgICAgIHNldFN0YXJ0KG5ldyBEYXRlKHRpbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgYWJvdXQgd2hpY2ggY3ZzIGxvZ3Mgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZVNldCBhIHNldCBvZiBmaWxlcyBhYm91dCB3aGljaCBjdnMgbG9ncyB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KGZpbmFsIEZpbGVTZXQgZmlsZVNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KGZpbGVTZXQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0YXNrCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIGV4ZWN1dGluZyB0aGUKKyAgICAgKiAgICAgICAgICAgIGN2cyBjb21tYW5kCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgc2F2ZWREaXIgPSBpbnB1dERpcjsgLy8gbWF5IGJlIGFsdGVyZWQgaW4gdmFsaWRhdGUKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyB1c2VyTGlzdCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgICAgIGxvYWRVc2VybGlzdCh1c2VyTGlzdCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gY3ZzVXNlcnMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ3ZzVXNlciB1c2VyID0gKEN2c1VzZXIpIGN2c1VzZXJzLmdldChpKTsKKyAgICAgICAgICAgICAgICB1c2VyLnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgdXNlckxpc3QucHV0KHVzZXIuZ2V0VXNlcklEKCksIHVzZXIuZ2V0RGlzcGxheW5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldENvbW1hbmQoImxvZyIpOworCisgICAgICAgICAgICBpZiAoZ2V0VGFnKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEN2c1ZlcnNpb24gbXlDdnNWZXJzaW9uID0gbmV3IEN2c1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICBteUN2c1ZlcnNpb24uc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIG15Q3ZzVmVyc2lvbi5zZXRUYXNrTmFtZSgiY3ZzdmVyc2lvbiIpOworICAgICAgICAgICAgICAgIG15Q3ZzVmVyc2lvbi5zZXRDdnNSb290KGdldEN2c1Jvb3QoKSk7CisgICAgICAgICAgICAgICAgbXlDdnNWZXJzaW9uLnNldEN2c1JzaChnZXRDdnNSc2goKSk7CisgICAgICAgICAgICAgICAgbXlDdnNWZXJzaW9uLnNldFBhc3NmaWxlKGdldFBhc3NGaWxlKCkpOworICAgICAgICAgICAgICAgIG15Q3ZzVmVyc2lvbi5zZXREZXN0KGlucHV0RGlyKTsKKyAgICAgICAgICAgICAgICBteUN2c1ZlcnNpb24uZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgIGlmIChteUN2c1ZlcnNpb24uc3VwcG9ydHNDdnNMb2dXaXRoU09wdGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudCgiLVMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVsbCAhPSBzdGFydERhdGUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IG91dHB1dERhdGUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOworCisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCBzb21ldGhpbmcgb2YgdGhlIGZvcm06IC1kICI+PVlZWVktTU0tZGQiCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGVSYW5nZSA9ICI+PSIgKyBvdXRwdXREYXRlLmZvcm1hdChzdGFydERhdGUpOworCisgICAgICAgICAgICAgICAgLy8gU3VwcGx5ICctZCcgYXMgYSBzZXBhcmF0ZSBhcmd1bWVudCAtIEJ1ZyMgMTQzOTcKKyAgICAgICAgICAgICAgICBhZGRDb21tYW5kQXJndW1lbnQoIi1kIik7CisgICAgICAgICAgICAgICAgYWRkQ29tbWFuZEFyZ3VtZW50KGRhdGVSYW5nZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3Qgb2YgZmlsZXMgdG8gY2hlY2sgaGFzIGJlZW4gc3BlY2lmaWVkCisgICAgICAgICAgICBpZiAoIWZpbGVzZXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uIGUgPSBmaWxlc2V0cy5lbGVtZW50cygpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZVNldCBmaWxlU2V0ID0gKEZpbGVTZXQpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudChmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIENoYW5nZUxvZ1BhcnNlciBwYXJzZXIgPSBuZXcgQ2hhbmdlTG9nUGFyc2VyKCk7CisgICAgICAgICAgICBmaW5hbCBSZWRpcmVjdGluZ1N0cmVhbUhhbmRsZXIgaGFuZGxlciA9CisgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0aW5nU3RyZWFtSGFuZGxlcihwYXJzZXIpOworCisgICAgICAgICAgICBsb2coZ2V0Q29tbWFuZCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgc2V0RGVzdChpbnB1dERpcik7CisgICAgICAgICAgICBzZXRFeGVjdXRlU3RyZWFtSGFuZGxlcihoYW5kbGVyKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXJyb3JzID0gaGFuZGxlci5nZXRFcnJvcnMoKTsKKworICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGVycm9ycykgeworICAgICAgICAgICAgICAgICAgICBsb2coZXJyb3JzLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIENWU0VudHJ5W10gZW50cnlTZXQgPSBwYXJzZXIuZ2V0RW50cnlTZXRBc0FycmF5KCk7CisgICAgICAgICAgICBmaW5hbCBDVlNFbnRyeVtdIGZpbHRlcmVkRW50cnlTZXQgPSBmaWx0ZXJFbnRyeVNldChlbnRyeVNldCk7CisKKyAgICAgICAgICAgIHJlcGxhY2VBdXRob3JJZFdpdGhOYW1lKHVzZXJMaXN0LCBmaWx0ZXJlZEVudHJ5U2V0KTsKKworICAgICAgICAgICAgd3JpdGVDaGFuZ2VMb2coZmlsdGVyZWRFbnRyeVNldCk7CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlucHV0RGlyID0gc2F2ZWREaXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgZm9yIHRhc2suCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGZhaWxzIHZhbGlkYXRpb24gY2hlY2tzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkKKyAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IGlucHV0RGlyKSB7CisgICAgICAgICAgICBpbnB1dERpciA9IGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgPT0gZGVzdEZpbGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkRlc3RmaWxlIG11c3QgYmUgc2V0LiI7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlucHV0RGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJDYW5ub3QgZmluZCBiYXNlIGRpciAiCisgICAgICAgICAgICAgICAgICsgaW5wdXREaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCAhPSB1c2Vyc0ZpbGUgJiYgIXVzZXJzRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiQ2Fubm90IGZpbmQgdXNlciBsb29rdXAgbGlzdCAiCisgICAgICAgICAgICAgICAgICsgdXNlcnNGaWxlLmdldEFic29sdXRlUGF0aCgpOworCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSB1c2VybGlzdCBmcm9tIHRoZSB1c2VyTGlzdCBmaWxlIChpZiBzcGVjaWZpZWQpIGFuZCBhZGQgdG8KKyAgICAgKiBsaXN0IG9mIHVzZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJMaXN0IHRoZSBmaWxlIG9mIHVzZXJzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBmaWxlIGNhbiBub3QgYmUgbG9hZGVkIGZvciBzb21lIHJlYXNvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkVXNlcmxpc3QoZmluYWwgUHJvcGVydGllcyB1c2VyTGlzdCkKKyAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsICE9IHVzZXJzRmlsZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1c2VyTGlzdC5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0odXNlcnNGaWxlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLnRvU3RyaW5nKCksIGlvZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgdGhlIHNwZWNpZmllZCBlbnRyaWVzIGFjY29yZGluZyB0byBhbiBhcHByb3ByaWF0ZSBydWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGVudHJ5U2V0IHRoZSBlbnRyeSBzZXQgdG8gZmlsdGVyCisgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgZW50cnkgc2V0CisgICAgICovCisgICAgcHJpdmF0ZSBDVlNFbnRyeVtdIGZpbHRlckVudHJ5U2V0KGZpbmFsIENWU0VudHJ5W10gZW50cnlTZXQpIHsKKyAgICAgICAgZmluYWwgVmVjdG9yIHJlc3VsdHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeVNldC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmluYWwgQ1ZTRW50cnkgY3ZzRW50cnkgPSBlbnRyeVNldFtpXTsKKyAgICAgICAgICAgIGZpbmFsIERhdGUgZGF0ZSA9IGN2c0VudHJ5LmdldERhdGUoKTsKKworICAgICAgICAgICAgLy9idWcjMzA0NzEKKyAgICAgICAgICAgIC8vdGhpcyBpcyBjYXVzZWQgYnkgRGF0ZS5hZnRlciB0aHJvd2luZyBhIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICAgICAgICAvL2ZvciBzb21lIHJlYXNvbiB0aGVyZSdzIG5vIGRhdGUgc2V0IGluIHRoZSBDVlNFbnRyeQorICAgICAgICAgICAgLy9KYXZhIDEuMy4xIEFQSQorICAgICAgICAgICAgLy9odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvYXBpL2phdmEvdXRpbC9EYXRlLmh0bWwjYWZ0ZXIoamF2YS51dGlsLkRhdGUpCisgICAgICAgICAgICAvL2RvZXNuJ3QgdGhyb3cgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgICAgICAgIC8vSmF2YSAxLjQuMiArIDEuNSBBUEkKKyAgICAgICAgICAgIC8vaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9EYXRlLmh0bWwjYWZ0ZXIoamF2YS51dGlsLkRhdGUpCisgICAgICAgICAgICAvL2FjY29yZGluZyB0byB0aGUgZG9jcyBpdCBkb2Vzbid0IHRocm93LCBhY2NvcmRpbmcgdG8gdGhlIGJ1ZyByZXBvcnQgaXQgZG9lcworICAgICAgICAgICAgLy9odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9hcGkvamF2YS91dGlsL0RhdGUuaHRtbCNhZnRlcihqYXZhLnV0aWwuRGF0ZSkKKyAgICAgICAgICAgIC8vYWNjb3JkaW5nIHRvIHRoZSBkb2NzIGl0IGRvZXMgdGhyb3cKKworICAgICAgICAgICAgLy9mb3Igbm93IHNraXAgZW50cmllcyB3aGljaCBhcmUgbWlzc2luZyBhIGRhdGUKKyAgICAgICAgICAgIGlmIChudWxsID09IGRhdGUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG51bGwgIT0gc3RhcnREYXRlICYmIHN0YXJ0RGF0ZS5hZnRlcihkYXRlKSkgeworICAgICAgICAgICAgICAgIC8vU2tpcCBkYXRlcyB0aGF0IGFyZSB0b28gZWFybHkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudWxsICE9IGVuZERhdGUgJiYgZW5kRGF0ZS5iZWZvcmUoZGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAvL1NraXAgZGF0ZXMgdGhhdCBhcmUgdG9vIGxhdGUKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdHMuYWRkRWxlbWVudChjdnNFbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDVlNFbnRyeVtdIHJlc3VsdEFycmF5ID0gbmV3IENWU0VudHJ5W3Jlc3VsdHMuc2l6ZSgpXTsKKworICAgICAgICByZXN1bHRzLmNvcHlJbnRvKHJlc3VsdEFycmF5KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdEFycmF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcGxhY2UgYWxsIGtub3duIGF1dGhvcidzIGlkJ3Mgd2l0aCB0aGVpciBtYXZlbiBzcGVjaWZpZWQgbmFtZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZUF1dGhvcklkV2l0aE5hbWUoZmluYWwgUHJvcGVydGllcyB1c2VyTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ1ZTRW50cnlbXSBlbnRyeVNldCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5U2V0Lmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgIGZpbmFsIENWU0VudHJ5IGVudHJ5ID0gZW50cnlTZXRbIGkgXTsKKyAgICAgICAgICAgIGlmICh1c2VyTGlzdC5jb250YWluc0tleShlbnRyeS5nZXRBdXRob3IoKSkpIHsKKyAgICAgICAgICAgICAgICBlbnRyeS5zZXRBdXRob3IodXNlckxpc3QuZ2V0UHJvcGVydHkoZW50cnkuZ2V0QXV0aG9yKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGNoYW5nZWxvZyB0byBmaWxlIHNwZWNpZmllZCBpbiB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIGVudHJ5U2V0IHRoZSBlbnRyeSBzZXQgdG8gd3JpdGUuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciB3cml0aW5nIGNoYW5nZWxvZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVDaGFuZ2VMb2coZmluYWwgQ1ZTRW50cnlbXSBlbnRyeVNldCkKKyAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpOworCisgICAgICAgICAgICBmaW5hbCBQcmludFdyaXRlciB3cml0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dCwgIlVURi04IikpOworCisgICAgICAgICAgICBmaW5hbCBDaGFuZ2VMb2dXcml0ZXIgc2VyaWFsaXplciA9IG5ldyBDaGFuZ2VMb2dXcml0ZXIoKTsKKworICAgICAgICAgICAgc2VyaWFsaXplci5wcmludENoYW5nZUxvZyh3cml0ZXIsIGVudHJ5U2V0KTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2codWVlLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZS50b1N0cmluZygpLCBpb2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dXcml0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FlMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0NoYW5nZUxvZ1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5ET01FbGVtZW50V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NVXRpbHM7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIENsYXNzIHVzZWQgdG8gZ2VuZXJhdGUgYW4gWE1MIGNoYW5nZWxvZy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFuZ2VMb2dXcml0ZXIgeworICAgIC8qKiBvdXRwdXQgZm9ybWF0IGZvciBkYXRlcyB3cml0dGVuIHRvIHhtbCBmaWxlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBPVVRQVVRfREFURQorICAgICAgICA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIik7CisgICAgLyoqIG91dHB1dCBmb3JtYXQgZm9yIHRpbWVzIHdyaXR0ZW4gdG8geG1sIGZpbGUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IE9VVFBVVF9USU1FCisgICAgICAgID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkhIOm1tIik7CisgICAgLyoqIHN0YXRlbGVzcyBoZWxwZXIgZm9yIHdyaXRpbmcgdGhlIFhNTCBkb2N1bWVudCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERPTUVsZW1lbnRXcml0ZXIgRE9NX1dSSVRFUiA9IG5ldyBET01FbGVtZW50V3JpdGVyKCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBUaW1lWm9uZSB1dGMgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIik7CisgICAgICAgIE9VVFBVVF9EQVRFLnNldFRpbWVab25lKHV0Yyk7CisgICAgICAgIE9VVFBVVF9USU1FLnNldFRpbWVab25lKHV0Yyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgb3V0IHRoZSBzcGVjaWZpZWQgZW50cmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgd3JpdGVyIHRvIHdoaWNoIHRvIHNlbmQgb3V0cHV0LgorICAgICAqIEBwYXJhbSBlbnRyaWVzIHRoZSBlbnRyaWVzIHRvIGJlIHdyaXR0ZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRDaGFuZ2VMb2coZmluYWwgUHJpbnRXcml0ZXIgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENWU0VudHJ5W10gZW50cmllcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOworICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gRE9NVXRpbHMubmV3RG9jdW1lbnQoKTsKKyAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJjaGFuZ2Vsb2ciKTsKKyAgICAgICAgICAgIERPTV9XUklURVIub3BlbkVsZW1lbnQocm9vdCwgb3V0cHV0LCAwLCAiXHQiKTsKKyAgICAgICAgICAgIG91dHB1dC5wcmludGxuKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDVlNFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07CisKKyAgICAgICAgICAgICAgICBwcmludEVudHJ5KGRvYywgb3V0cHV0LCBlbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBET01fV1JJVEVSLmNsb3NlRWxlbWVudChyb290LCBvdXRwdXQsIDAsICJcdCIsIHRydWUpOworICAgICAgICAgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmludCBvdXQgYW4gaW5kaXZpZHVhbCBlbnRyeSBpbiBjaGFuZ2Vsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9jIERvY3VtZW50IHVzZWQgdG8gY3JlYXRlIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkgdG8gcHJpbnQKKyAgICAgKiBAcGFyYW0gb3V0cHV0IHdyaXRlciB0byB3aGljaCB0byBzZW5kIG91dHB1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJpbnRFbnRyeShEb2N1bWVudCBkb2MsIGZpbmFsIFByaW50V3JpdGVyIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDVlNFbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRWxlbWVudCBlbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZW50cnkiKTsKKyAgICAgICAgRE9NVXRpbHMuYXBwZW5kVGV4dEVsZW1lbnQoZW50LCAiZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9EQVRFLmZvcm1hdChlbnRyeS5nZXREYXRlKCkpKTsKKyAgICAgICAgRE9NVXRpbHMuYXBwZW5kVGV4dEVsZW1lbnQoZW50LCAidGltZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9USU1FLmZvcm1hdChlbnRyeS5nZXREYXRlKCkpKTsKKyAgICAgICAgRE9NVXRpbHMuYXBwZW5kQ0RBVEFFbGVtZW50KGVudCwgImF1dGhvciIsIGVudHJ5LmdldEF1dGhvcigpKTsKKworICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGVudHJ5LmdldEZpbGVzKCkuZWxlbWVudHMoKTsKKworICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFJDU0ZpbGUgZmlsZSA9IChSQ1NGaWxlKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworCisgICAgICAgICAgICBFbGVtZW50IGYgPSBET01VdGlscy5jcmVhdGVDaGlsZEVsZW1lbnQoZW50LCAiZmlsZSIpOworICAgICAgICAgICAgRE9NVXRpbHMuYXBwZW5kQ0RBVEFFbGVtZW50KGYsICJuYW1lIiwgZmlsZS5nZXROYW1lKCkpOworICAgICAgICAgICAgRE9NVXRpbHMuYXBwZW5kVGV4dEVsZW1lbnQoZiwgInJldmlzaW9uIiwgZmlsZS5nZXRSZXZpc2lvbigpKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZXZpb3VzUmV2aXNpb24gPSBmaWxlLmdldFByZXZpb3VzUmV2aXNpb24oKTsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1JldmlzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBET01VdGlscy5hcHBlbmRUZXh0RWxlbWVudChmLCAicHJldnJldmlzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1JldmlzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBET01VdGlscy5hcHBlbmRDREFUQUVsZW1lbnQoZW50LCAibXNnIiwgZW50cnkuZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgRE9NX1dSSVRFUi53cml0ZShlbnQsIG91dHB1dCwgMSwgIlx0Iik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ3ZzVGFnRGlmZi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1RhZ0RpZmYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmIzY2IzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1RhZ0RpZmYuamF2YQpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BYnN0cmFjdEN2c1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5ET01FbGVtZW50V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEV4YW1pbmVzIHRoZSBvdXRwdXQgb2YgY3ZzIHJkaWZmIGJldHdlZW4gdHdvIHRhZ3MuCisgKgorICogSXQgcHJvZHVjZXMgYW4gWE1MIG91dHB1dCByZXByZXNlbnRpbmcgdGhlIGxpc3Qgb2YgY2hhbmdlcy4KKyAqIDxQUkU+CisgKiAmbHQ7IS0tIFJvb3QgZWxlbWVudCAtLSZndDsKKyAqICZsdDshRUxFTUVOVCB0YWdkaWZmICggZW50cnkrICkgJmd0OworICogJmx0OyEtLSBTdGFydCB0YWcgb2YgdGhlIHJlcG9ydCAtLSZndDsKKyAqICZsdDshQVRUTElTVCB0YWdkaWZmIHN0YXJ0VGFnIE5NVE9LRU4gI0lNUExJRUQgJmd0OworICogJmx0OyEtLSBFbmQgdGFnIG9mIHRoZSByZXBvcnQgLS0mZ3Q7CisgKiAmbHQ7IUFUVExJU1QgdGFnZGlmZiBlbmRUYWcgTk1UT0tFTiAjSU1QTElFRCAmZ3Q7CisgKiAmbHQ7IS0tIFN0YXJ0IGRhdGUgb2YgdGhlIHJlcG9ydCAtLSZndDsKKyAqICZsdDshQVRUTElTVCB0YWdkaWZmIHN0YXJ0RGF0ZSBOTVRPS0VOICNJTVBMSUVEICZndDsKKyAqICZsdDshLS0gRW5kIGRhdGUgb2YgdGhlIHJlcG9ydCAtLSZndDsKKyAqICZsdDshQVRUTElTVCB0YWdkaWZmIGVuZERhdGUgTk1UT0tFTiAjSU1QTElFRCAmZ3Q7CisgKgorICogJmx0OyEtLSBDVlMgdGFnIGVudHJ5IC0tJmd0OworICogJmx0OyFFTEVNRU5UIGVudHJ5ICggZmlsZSApICZndDsKKyAqICZsdDshLS0gRmlsZSBhZGRlZCwgY2hhbmdlZCBvciByZW1vdmVkIC0tJmd0OworICogJmx0OyFFTEVNRU5UIGZpbGUgKCBuYW1lLCByZXZpc2lvbj8sIHByZXZyZXZpc2lvbj8gKSAmZ3Q7CisgKiAmbHQ7IS0tIE5hbWUgb2YgdGhlIGZpbGUgLS0mZ3Q7CisgKiAmbHQ7IUVMRU1FTlQgbmFtZSAoICNQQ0RBVEEgKSAmZ3Q7CisgKiAmbHQ7IS0tIFJldmlzaW9uIG51bWJlciAtLSZndDsKKyAqICZsdDshRUxFTUVOVCByZXZpc2lvbiAoICNQQ0RBVEEgKSAmZ3Q7CisgKiAmbHQ7IS0tIFByZXZpb3VzIHJldmlzaW9uIG51bWJlciAtLSZndDsKKyAqICZsdDshRUxFTUVOVCBwcmV2cmV2aXNpb24gKCAjUENEQVRBICkgJmd0OworICogPC9QUkU+CisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqIEBhbnQudGFzayBuYW1lPSJjdnN0YWdkaWZmIgorICovCitwdWJsaWMgY2xhc3MgQ3ZzVGFnRGlmZiBleHRlbmRzIEFic3RyYWN0Q3ZzVGFzayB7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNyZWF0ZSB0aGUgdGVtcCBmaWxlIGZvciBjdnMgbG9nCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKiogc3RhdGVsZXNzIGhlbHBlciBmb3Igd3JpdGluZyB0aGUgWE1MIGRvY3VtZW50ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRE9NRWxlbWVudFdyaXRlciBET01fV1JJVEVSID0gbmV3IERPTUVsZW1lbnRXcml0ZXIoKTsKKworICAgIC8qKgorICAgICAqIFRva2VuIHRvIGlkZW50aWZ5IHRoZSB3b3JkIGZpbGUgaW4gdGhlIHJkaWZmIGxvZworICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TVFJJTkcgPSAiRmlsZSAiOworICAgIC8qKgorICAgICAqIFRva2VuIHRvIGlkZW50aWZ5IHRoZSB3b3JkIGZpbGUgaW4gdGhlIHJkaWZmIGxvZworICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9fU1RSSU5HID0gIiB0byAiOworICAgIC8qKgorICAgICAqIFRva2VuIHRvIGlkZW50aWZ5IGEgbmV3IGZpbGUgaW4gdGhlIHJkaWZmIGxvZworICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9JU19ORVcgPSAiIGlzIG5ldzsiOworICAgIC8qKgorICAgICAqIFRva2VuIHRvIGlkZW50aWZ5IHRoZSByZXZpc2lvbgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWSVNJT04gPSAicmV2aXNpb24gIjsKKworICAgIC8qKgorICAgICAqIFRva2VuIHRvIGlkZW50aWZ5IGEgbW9kaWZpZWQgZmlsZSBpbiB0aGUgcmRpZmYgbG9nCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0hBU19DSEFOR0VEID0gIiBjaGFuZ2VkIGZyb20gcmV2aXNpb24gIjsKKworICAgIC8qKgorICAgICAqIFRva2VuIHRvIGlkZW50aWZ5IGEgcmVtb3ZlZCBmaWxlIGluIHRoZSByZGlmZiBsb2cKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfV0FTX1JFTU9WRUQgPSAiIGlzIHJlbW92ZWQiOworCisgICAgLyoqCisgICAgICogVGhlIGN2cyBwYWNrYWdlL21vZHVsZSB0byBhbmFseXNlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbXlwYWNrYWdlOworCisgICAgLyoqCisgICAgICogVGhlIGVhcmxpZXN0IHRhZyBmcm9tIHdoaWNoIGRpZmZzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG15c3RhcnRUYWc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGF0ZXN0IHRhZyBmcm9tIHdoaWNoIGRpZmZzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG15ZW5kVGFnOworCisgICAgLyoqCisgICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZnJvbSB3aGljaCBkaWZmcyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBteXN0YXJ0RGF0ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBmcm9tIHdoaWNoIGRpZmZzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG15ZW5kRGF0ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlIGluIHdoaWNoIHRvIHdyaXRlIHRoZSBkaWZmIHJlcG9ydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgbXlkZXN0ZmlsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYWNrYWdlL21vZHVsZSB0byBhbmFseXplLgorICAgICAqIEBwYXJhbSBwIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGFuYWx5c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBwKSB7CisgICAgICAgIG15cGFja2FnZSA9IHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdGFydCB0YWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RhcnQgdGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0VGFnKFN0cmluZyBzKSB7CisgICAgICAgIG15c3RhcnRUYWcgPSBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RhcnQgZGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBzdGFydCBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZShTdHJpbmcgcykgeworICAgICAgICBteXN0YXJ0RGF0ZSA9IHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlbmQgdGFnLgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIGVuZCB0YWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5kVGFnKFN0cmluZyBzKSB7CisgICAgICAgIG15ZW5kVGFnID0gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVuZCBkYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIGVuZCBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuZERhdGUoU3RyaW5nIHMpIHsKKyAgICAgICAgbXllbmREYXRlID0gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG91dHB1dCBmaWxlIGZvciB0aGUgZGlmZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIHRoZSBvdXRwdXQgZmlsZSBmb3IgdGhlIGRpZmYuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdEZpbGUoRmlsZSBmKSB7CisgICAgICAgIG15ZGVzdGZpbGUgPSBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGFzay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHZhbGlkYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICAgICAgIHZhbGlkYXRlKCk7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHJkaWZmIGNvbW1hbmQKKyAgICAgICAgYWRkQ29tbWFuZEFyZ3VtZW50KCJyZGlmZiIpOworICAgICAgICBhZGRDb21tYW5kQXJndW1lbnQoIi1zIik7CisgICAgICAgIGlmIChteXN0YXJ0VGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudCgiLXIiKTsKKyAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudChteXN0YXJ0VGFnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudCgiLUQiKTsKKyAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudChteXN0YXJ0RGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG15ZW5kVGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudCgiLXIiKTsKKyAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudChteWVuZFRhZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRDb21tYW5kQXJndW1lbnQoIi1EIik7CisgICAgICAgICAgICBhZGRDb21tYW5kQXJndW1lbnQobXllbmREYXRlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzdXBwb3J0IG11bHRpcGxlIHBhY2thZ2VzCisgICAgICAgIFN0cmluZ1Rva2VuaXplciBteVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobXlwYWNrYWdlKTsKKyAgICAgICAgd2hpbGUgKG15VG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgYWRkQ29tbWFuZEFyZ3VtZW50KG15VG9rZW5pemVyLm5leHRUb2tlbigpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBmb3JjZSBjb21tYW5kIG5vdCB0byBiZSBudWxsCisgICAgICAgIHNldENvbW1hbmQoIiIpOworICAgICAgICBGaWxlIHRtcEZpbGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG1wRmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoImN2c3RhZ2RpZmYiLCAiLmxvZyIsIG51bGwsIHRydWUsIHRydWUpOworICAgICAgICAgICAgc2V0T3V0cHV0KHRtcEZpbGUpOworCisgICAgICAgICAgICAvLyBydW4gdGhlIGN2cyBjb21tYW5kCisgICAgICAgICAgICBzdXBlci5leGVjdXRlKCk7CisKKyAgICAgICAgICAgIC8vIHBhcnNlIHRoZSByZGlmZgorICAgICAgICAgICAgQ3ZzVGFnRW50cnlbXSBlbnRyaWVzID0gcGFyc2VSRGlmZih0bXBGaWxlKTsKKworICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHRhZyBkaWZmCisgICAgICAgICAgICB3cml0ZVRhZ0RpZmYoZW50cmllcyk7CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh0bXBGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHRtcEZpbGUgYW5kIHJldHVybiBhbmQgYXJyYXkgb2YgQ3ZzVGFnRW50cnkgdG8gYmUKKyAgICAgKiB3cml0dGVuIGluIHRoZSBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG1wRmlsZSB0aGUgRmlsZSBjb250YWluaW5nIHRoZSBvdXRwdXQgb2YgdGhlIGN2cyByZGlmZiBjb21tYW5kCisgICAgICogQHJldHVybiB0aGUgZW50cmllcyBpbiB0aGUgb3V0cHV0CisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIEN2c1RhZ0VudHJ5W10gcGFyc2VSRGlmZihGaWxlIHRtcEZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHBhcnNlIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHRtcEZpbGUpKTsKKworICAgICAgICAgICAgLy8gZW50cmllcyBhcmUgb2YgdGhlIGZvcm06CisgICAgICAgICAgICAvL0NWUyAxLjExCisgICAgICAgICAgICAvLyBGaWxlIG1vZHVsZS9maWxlbmFtZSBpcyBuZXc7IGN1cnJlbnQgcmV2aXNpb24gMS4xCisgICAgICAgICAgICAvL0NWUyAxLjExLjkKKyAgICAgICAgICAgIC8vIEZpbGUgbW9kdWxlL2ZpbGVuYW1lIGlzIG5ldzsgY3ZzdGFnXzIwMDNfMTFfMDNfMiAgcmV2aXNpb24gMS4xCisgICAgICAgICAgICAvLyBvcgorICAgICAgICAgICAgLy8gRmlsZSBtb2R1bGUvZmlsZW5hbWUgY2hhbmdlZCBmcm9tIHJldmlzaW9uIDEuNCB0byAxLjYKKyAgICAgICAgICAgIC8vIG9yCisgICAgICAgICAgICAvLyBGaWxlIG1vZHVsZS9maWxlbmFtZSBpcyByZW1vdmVkOyBub3QgaW5jbHVkZWQgaW4KKyAgICAgICAgICAgIC8vIHJlbGVhc2UgdGFnIFNLSU5MRl8xMgorICAgICAgICAgICAgLy9DVlMgMS4xMS45CisgICAgICAgICAgICAvLyBGaWxlIHRlc3RhbnRvaW5lL2FudG9pbmUuYmF0IGlzIHJlbW92ZWQ7IFRFU1RBTlRPSU5FXzEgcmV2aXNpb24gMS4xLjEuMQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGdldCByaWQgb2YgJ0ZpbGUgbW9kdWxlLyIKKyAgICAgICAgICAgIFN0cmluZyB0b0JlUmVtb3ZlZCA9IEZJTEVfU1RSSU5HICsgbXlwYWNrYWdlICsgIi8iOworICAgICAgICAgICAgaW50IGhlYWRlckxlbmd0aCA9IHRvQmVSZW1vdmVkLmxlbmd0aCgpOworICAgICAgICAgICAgVmVjdG9yIGVudHJpZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChudWxsICE9IGxpbmUpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IGhlYWRlckxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKHRvQmVSZW1vdmVkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoRklMRV9TVFJJTkcubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHx8IGluIGEgcGVybCBsaWtlIGZhc2hpb24KKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgID0gIGRvRmlsZUlzTmV3KGVudHJpZXMsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBkb0ZpbGVIYXNDaGFuZ2VkKGVudHJpZXMsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBkb0ZpbGVXYXNSZW1vdmVkKGVudHJpZXMsIGxpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEN2c1RhZ0VudHJ5W10gYXJyYXkgPSBuZXcgQ3ZzVGFnRW50cnlbZW50cmllcy5zaXplKCldOworICAgICAgICAgICAgZW50cmllcy5jb3B5SW50byhhcnJheSk7CisKKyAgICAgICAgICAgIHJldHVybiBhcnJheTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBpbiBwYXJzaW5nIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRvRmlsZUlzTmV3KFZlY3RvciBlbnRyaWVzLCBTdHJpbmcgbGluZSkgeworICAgICAgICBpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoRklMRV9JU19ORVcpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBpdCBpcyBhIG5ldyBmaWxlCisgICAgICAgIC8vIHNldCB0aGUgcmV2aXNpb24gYnV0IG5vdCB0aGUgcHJldnJldmlzaW9uCisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgU3RyaW5nIHJldiA9IG51bGw7CisgICAgICAgIGludCBpbmRleHJldiA9IGxpbmUuaW5kZXhPZihSRVZJU0lPTiwgaW5kZXgpOworICAgICAgICBpZiAoaW5kZXhyZXYgIT0gLTEpIHsKKyAgICAgICAgICAgIHJldiA9IGxpbmUuc3Vic3RyaW5nKGluZGV4cmV2ICsgUkVWSVNJT04ubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIEN2c1RhZ0VudHJ5IGVudHJ5ID0gbmV3IEN2c1RhZ0VudHJ5KGZpbGVuYW1lLCByZXYpOworICAgICAgICBlbnRyaWVzLmFkZEVsZW1lbnQoZW50cnkpOworICAgICAgICBsb2coZW50cnkudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBkb0ZpbGVIYXNDaGFuZ2VkKFZlY3RvciBlbnRyaWVzLCBTdHJpbmcgbGluZSkgeworICAgICAgICBpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoRklMRV9IQVNfQ0hBTkdFRCk7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGl0IGlzIGEgbW9kaWZpZWQgZmlsZQorICAgICAgICAvLyBzZXQgdGhlIHJldmlzaW9uIGFuZCB0aGUgcHJldnJldmlzaW9uCisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgaW50IHJldlNlcGFyYXRvciA9IGxpbmUuaW5kZXhPZigiIHRvICIsIGluZGV4KTsKKyAgICAgICAgU3RyaW5nIHByZXZSZXZpc2lvbiA9CisgICAgICAgICAgICBsaW5lLnN1YnN0cmluZyhpbmRleCArIEZJTEVfSEFTX0NIQU5HRUQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZTZXBhcmF0b3IpOworICAgICAgICBTdHJpbmcgcmV2aXNpb24gPSBsaW5lLnN1YnN0cmluZyhyZXZTZXBhcmF0b3IgKyBUT19TVFJJTkcubGVuZ3RoKCkpOworICAgICAgICBDdnNUYWdFbnRyeSBlbnRyeSA9IG5ldyBDdnNUYWdFbnRyeShmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZSZXZpc2lvbik7CisgICAgICAgIGVudHJpZXMuYWRkRWxlbWVudChlbnRyeSk7CisgICAgICAgIGxvZyhlbnRyeS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRvRmlsZVdhc1JlbW92ZWQoVmVjdG9yIGVudHJpZXMsIFN0cmluZyBsaW5lKSB7CisgICAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZihGSUxFX1dBU19SRU1PVkVEKTsKKyAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXQgaXMgYSByZW1vdmVkIGZpbGUKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gbGluZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICBTdHJpbmcgcmV2ID0gbnVsbDsKKyAgICAgICAgaW50IGluZGV4cmV2ID0gbGluZS5pbmRleE9mKFJFVklTSU9OLCBpbmRleCk7CisgICAgICAgIGlmIChpbmRleHJldiAhPSAtMSkgeworICAgICAgICAgICAgcmV2ID0gbGluZS5zdWJzdHJpbmcoaW5kZXhyZXYgKyBSRVZJU0lPTi5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgQ3ZzVGFnRW50cnkgZW50cnkgPSBuZXcgQ3ZzVGFnRW50cnkoZmlsZW5hbWUsIG51bGwsIHJldik7CisgICAgICAgIGVudHJpZXMuYWRkRWxlbWVudChlbnRyeSk7CisgICAgICAgIGxvZyhlbnRyeS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIHJkaWZmIGxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyaWVzIGEgPGNvZGU+Q3ZzVGFnRW50cnlbXTwvY29kZT4gdmFsdWUKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZVRhZ0RpZmYoQ3ZzVGFnRW50cnlbXSBlbnRyaWVzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShteWRlc3RmaWxlKTsKKyAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dCwgIlVURi04IikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOworICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gRE9NVXRpbHMubmV3RG9jdW1lbnQoKTsKKyAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJ0YWdkaWZmIik7CisgICAgICAgICAgICBpZiAobXlzdGFydFRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoInN0YXJ0VGFnIiwgbXlzdGFydFRhZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJzdGFydERhdGUiLCBteXN0YXJ0RGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXllbmRUYWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJlbmRUYWciLCBteWVuZFRhZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJlbmREYXRlIiwgbXllbmREYXRlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoImN2c3Jvb3QiLCBnZXRDdnNSb290KCkpOworICAgICAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoInBhY2thZ2UiLCBteXBhY2thZ2UpOworICAgICAgICAgICAgRE9NX1dSSVRFUi5vcGVuRWxlbWVudChyb290LCB3cml0ZXIsIDAsICJcdCIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBjID0gZW50cmllcy5sZW5ndGg7IGkgPCBjOyBpKyspIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRhZ0VudHJ5KGRvYywgd3JpdGVyLCBlbnRyaWVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERPTV9XUklURVIuY2xvc2VFbGVtZW50KHJvb3QsIHdyaXRlciwgMCwgIlx0IiwgdHJ1ZSk7CisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkgeworICAgICAgICAgICAgbG9nKHVlZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UudG9TdHJpbmcoKSwgaW9lKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChudWxsICE9IG91dHB1dCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBsb2coaW9lLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzaW5nbGUgZW50cnkgdG8gdGhlIGdpdmVuIHdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb2MgRG9jdW1lbnQgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMuCisgICAgICogQHBhcmFtIHdyaXRlciBhIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPiB2YWx1ZQorICAgICAqIEBwYXJhbSBlbnRyeSBhIDxjb2RlPkN2c1RhZ0VudHJ5PC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZVRhZ0VudHJ5KERvY3VtZW50IGRvYywgUHJpbnRXcml0ZXIgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2c1RhZ0VudHJ5IGVudHJ5KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBFbGVtZW50IGVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJlbnRyeSIpOworICAgICAgICBFbGVtZW50IGYgPSBET01VdGlscy5jcmVhdGVDaGlsZEVsZW1lbnQoZW50LCAiZmlsZSIpOworICAgICAgICBET01VdGlscy5hcHBlbmRDREFUQUVsZW1lbnQoZiwgIm5hbWUiLCBlbnRyeS5nZXRGaWxlKCkpOworICAgICAgICBpZiAoZW50cnkuZ2V0UmV2aXNpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBET01VdGlscy5hcHBlbmRUZXh0RWxlbWVudChmLCAicmV2aXNpb24iLCBlbnRyeS5nZXRSZXZpc2lvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50cnkuZ2V0UHJldmlvdXNSZXZpc2lvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIERPTVV0aWxzLmFwcGVuZFRleHRFbGVtZW50KGYsICJwcmV2cmV2aXNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0UHJldmlvdXNSZXZpc2lvbigpKTsKKyAgICAgICAgfQorICAgICAgICBET01fV1JJVEVSLndyaXRlKGVudCwgd3JpdGVyLCAxLCAiXHQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVycyBzcGVjaWZpZWQgZm9yIHRhc2suCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGEgcGFyYW1ldGVyIGlzIG5vdCBjb3JyZWN0bHkgc2V0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG51bGwgPT0gbXlwYWNrYWdlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlBhY2thZ2UvbW9kdWxlIG11c3QgYmUgc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgPT0gbXlkZXN0ZmlsZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEZXN0ZmlsZSBtdXN0IGJlIHNldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsID09IG15c3RhcnRUYWcgJiYgbnVsbCA9PSBteXN0YXJ0RGF0ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTdGFydCB0YWcgb3Igc3RhcnQgZGF0ZSBtdXN0IGJlIHNldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IG15c3RhcnRUYWcgJiYgbnVsbCAhPSBteXN0YXJ0RGF0ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBvZiBzdGFydCB0YWcgYW5kIHN0YXJ0IGRhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm11c3QgYmUgc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgPT0gbXllbmRUYWcgJiYgbnVsbCA9PSBteWVuZERhdGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRW5kIHRhZyBvciBlbmQgZGF0ZSBtdXN0IGJlIHNldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IG15ZW5kVGFnICYmIG51bGwgIT0gbXllbmREYXRlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG9mIGVuZCB0YWcgYW5kIGVuZCBkYXRlIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlIHNldC4iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNUYWdFbnRyeS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1RhZ0VudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzNDljNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNUYWdFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYjsKKworLyoqCisgKiBIb2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgYSBsaW5lIG9mIHJkaWZmCisgKi8KK3B1YmxpYyBjbGFzcyBDdnNUYWdFbnRyeSB7CisKKyAgICAvKiogdGhlIGZpbGVuYW1lICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWU7CisKKyAgICAvKiogdGhlIHByZXZpb3VzIHJldmlzaW9uICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJldlJldmlzaW9uOworCisgICAgLyoqIHRoZSByZXZpc2lvbiAqLworICAgIHByaXZhdGUgU3RyaW5nIHJldmlzaW9uOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBDdnNUYWdFbnRyeQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIEN2c1RhZ0VudHJ5KGZpbmFsIFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICB0aGlzKGZpbGVuYW1lLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEN2c1RhZ0VudHJ5CisgICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBhZGQKKyAgICAgKiBAcGFyYW0gcmV2aXNpb24gdGhlIHJldmlzaW9uCisgICAgICovCisgICAgcHVibGljIEN2c1RhZ0VudHJ5KGZpbmFsIFN0cmluZyBmaWxlbmFtZSwgZmluYWwgU3RyaW5nIHJldmlzaW9uKSB7CisgICAgICAgIHRoaXMoZmlsZW5hbWUsIHJldmlzaW9uLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEN2c1RhZ0VudHJ5CisgICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBhZGQKKyAgICAgKiBAcGFyYW0gcmV2aXNpb24gdGhlIHJldmlzaW9uCisgICAgICogQHBhcmFtIHByZXZSZXZpc2lvbiB0aGUgcHJldmlvdXMgcmV2aXNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ3ZzVGFnRW50cnkoZmluYWwgU3RyaW5nIGZpbGVuYW1lLCBmaW5hbCBTdHJpbmcgcmV2aXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2UmV2aXNpb24pIHsKKyAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOworICAgICAgICB0aGlzLnJldmlzaW9uID0gcmV2aXNpb247CisgICAgICAgIHRoaXMucHJldlJldmlzaW9uID0gcHJldlJldmlzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZpbGVuYW1lIGZvciB0aGlzIEN2c1RhZ0VudHJ5CisgICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGUoKSB7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByZXZpc2lvbiBmb3IgdGhpcyBDdnNUYWdFbnRyeQorICAgICAqIEByZXR1cm4gdGhlIHJldmlzaW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXZpc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHJldmlzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHByZXZpb3VzIHJldmlzaW9uIGZvciB0aGlzIEN2c1RhZ0VudHJ5CisgICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgcmV2aXNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZXZpb3VzUmV2aXNpb24oKSB7CisgICAgICAgIHJldHVybiBwcmV2UmV2aXNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIFN0cmluZyBjb250YWluaW5nIGZpbGVuYW1lIGFuZCBkaWZmZXJlbmNlIGZyb20gcHJldmlvdXMgdmVyc2lvbgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBDVlNUYWdFbnRyeQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZmlsZW5hbWUpOworICAgICAgICBpZiAocmV2aXNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIHdhcyByZW1vdmVkIik7CisgICAgICAgICAgICBpZiAocHJldlJldmlzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI7IHByZXZpb3VzIHJldmlzaW9uIHdhcyAiKS5hcHBlbmQocHJldlJldmlzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwcmV2UmV2aXNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIGlzIG5ldzsgY3VycmVudCByZXZpc2lvbiBpcyAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQocmV2aXNpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIGhhcyBjaGFuZ2VkIGZyb20gIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKHByZXZSZXZpc2lvbikuYXBwZW5kKCIgdG8gIikuYXBwZW5kKHJldmlzaW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1VzZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNVc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMmZjNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNVc2VyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgQ1ZTIHVzZXIgd2l0aCBhIHVzZXJJRCBhbmQgYSBmdWxsIG5hbWUuCisgKgorICovCitwdWJsaWMgY2xhc3MgQ3ZzVXNlciB7CisgICAgLyoqIFRoZSB1c2VyJ3MgSWQgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VySUQ7CisgICAgLyoqIFRoZSB1c2VyJ3MgZnVsbCBuYW1lICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlcidzIGZ1bGxuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlzcGxheU5hbWUgdGhlIHVzZXIncyBmdWxsIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5bmFtZShmaW5hbCBTdHJpbmcgZGlzcGxheU5hbWUpIHsKKyAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyJ3MgaWQKKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VySUQgdGhlIHVzZXIncyBuZXcgaWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcmlkKGZpbmFsIFN0cmluZyB1c2VySUQpIHsKKyAgICAgICAgdGhpcy51c2VySUQgPSB1c2VySUQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVzZXIncyBpZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHVzZXJJRCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcklEKCkgeworICAgICAgICByZXR1cm4gdXNlcklEOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB1c2VyJ3MgZnVsbCBuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VyJ3MgZnVsbCBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5bmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGRpc3BsYXlOYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhhdCB0aGlzIG9iamVjdCBpcyBjb25maWd1cmVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFuY2UgaGFzIG5vdCBiZSBjb3JyZWN0bHkKKyAgICAgKiAgICAgICAgICAgIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAobnVsbCA9PSB1c2VySUQpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlVzZXJuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNldC4iOworCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgPT0gZGlzcGxheU5hbWUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAiRGlzcGxheW5hbWUgYXR0cmlidXRlIG11c3QgYmUgc2V0IGZvciB1c2VySUQgIiArIHVzZXJJRDsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ3ZzVmVyc2lvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1ZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGE2MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1ZlcnNpb24uamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BYnN0cmFjdEN2c1Rhc2s7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKioKKyAqIHRoaXMgdGFzayBhbGxvd3MgdG8gZmluZCBvdXQgdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciB2ZXJzaW9uIG9mIGEKKyAqIENWUyBpbnN0YWxsYXRpb24KKyAqCisgKiBleGFtcGxlIHVzYWdlIDoKKyAqICZsdDtjdnN2ZXJzaW9uCisgKiBjdnNSb290PSZxdW90Ozpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljJnF1b3Q7CisgKiBwYXNzZmlsZT0mcXVvdDtjOi9wcm9ncmFtbWUvY3lnd2luL2hvbWUvYW50b2luZS8uY3ZzcGFzcyZxdW90OworICogY2xpZW50dmVyc2lvbnByb3BlcnR5PSZxdW90O2FwYWNoZWNsaWVudCZxdW90OworICogc2VydmVydmVyc2lvbnByb3BlcnR5PSZxdW90O2FwYWNoZXNlcnZlciZxdW90OyAgIC8mZ3Q7CisgKgorICogdGhlIHRhc2sgY2FuIGJlIHVzZWQgYWxzbyBpbiB0aGUgQVBJIGJ5IGNhbGxpbmcgaXRzIGV4ZWN1dGUgbWV0aG9kLAorICogdGhlbiBjYWxsaW5nIGdldFNlcnZlclZlcnNpb24gYW5kL29yIGdldENsaWVudFZlcnNpb24KKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InNjbSIKKyAqIEBzaW5jZSBhbnQgMS42LjEKKyAqLworcHVibGljIGNsYXNzIEN2c1ZlcnNpb24gZXh0ZW5kcyBBYnN0cmFjdEN2c1Rhc2sgeworICAgIHN0YXRpYyBmaW5hbCBsb25nIFZFUlNJT05fMV8xMV8yID0gMTExMDI7CisgICAgc3RhdGljIGZpbmFsIGxvbmcgTVVMVElQTFkgPSAxMDA7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50VmVyc2lvbjsKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJWZXJzaW9uOworICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudFZlcnNpb25Qcm9wZXJ0eTsKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJWZXJzaW9uUHJvcGVydHk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIENWUyBjbGllbnQgdmVyc2lvbgorICAgICAqIEByZXR1cm4gQ1ZTIGNsaWVudCB2ZXJzaW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gY2xpZW50VmVyc2lvbjsKKyAgICB9CisgICAgLyoqCisgICAgICogR2V0IHRoZSBDVlMgc2VydmVyIHZlcnNpb24KKyAgICAgKiBAcmV0dXJuIENWUyBzZXJ2ZXIgdmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlclZlcnNpb247CisgICAgfQorICAgIC8qKgorICAgICAqIFNldCBhIHByb3BlcnR5IHdoZXJlIHRvIHN0b3JlIHRoZSBDVlMgY2xpZW50IHZlcnNpb24KKyAgICAgKiBAcGFyYW0gY2xpZW50VmVyc2lvblByb3BlcnR5ICBwcm9wZXJ0eSBmb3IgQ1ZTIGNsaWVudCB2ZXJzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xpZW50VmVyc2lvblByb3BlcnR5KFN0cmluZyBjbGllbnRWZXJzaW9uUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5jbGllbnRWZXJzaW9uUHJvcGVydHkgPSBjbGllbnRWZXJzaW9uUHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgcHJvcGVydHkgd2hlcmUgdG8gc3RvcmUgdGhlIENWUyBzZXJ2ZXIgdmVyc2lvbgorICAgICAqIEBwYXJhbSBzZXJ2ZXJWZXJzaW9uUHJvcGVydHkgIHByb3BlcnR5IGZvciBDVlMgc2VydmVyIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJWZXJzaW9uUHJvcGVydHkoU3RyaW5nIHNlcnZlclZlcnNpb25Qcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnNlcnZlclZlcnNpb25Qcm9wZXJ0eSA9IHNlcnZlclZlcnNpb25Qcm9wZXJ0eTsKKyAgICB9CisgICAgLyoqCisgICAgICogRmluZCBvdXQgaWYgdGhlIHNlcnZlciB2ZXJzaW9uIHN1cHBvcnRzIGxvZyB3aXRoIFMgb3B0aW9uCisgICAgICogQHJldHVybiAgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBzZXJ2ZXIgdmVyc2lvbiBzdXBwb3J0cyBsb2cgd2l0aCBTIG9wdGlvbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ3ZzTG9nV2l0aFNPcHRpb24oKSB7CisgICAgICAgIGlmIChzZXJ2ZXJWZXJzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZXJ2ZXJWZXJzaW9uLCAiLiIpOworICAgICAgICBsb25nIGNvdW50ZXIgPSBNVUxUSVBMWSAqIE1VTFRJUExZOworICAgICAgICBsb25nIHZlcnNpb24gPSAwOworICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdChzLmNoYXJBdChpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHMyID0gcy5zdWJzdHJpbmcoMCwgaSk7CisgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiArIGNvdW50ZXIgKiBMb25nLnBhcnNlTG9uZyhzMik7CisgICAgICAgICAgICBpZiAoY291bnRlciA9PSAxKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudGVyID0gY291bnRlciAvIE1VTFRJUExZOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodmVyc2lvbiA+PSBWRVJTSU9OXzFfMTFfMik7CisgICAgfQorICAgIC8qKgorICAgICAqIHRoZSBleGVjdXRlIG1ldGhvZCBydW5uaW5nIEN2c1ZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB0aGlzLnNldE91dHB1dFN0cmVhbShib3MpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmVyciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgdGhpcy5zZXRFcnJvclN0cmVhbShiZXJyKTsKKyAgICAgICAgc2V0Q29tbWFuZCgidmVyc2lvbiIpOworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBib3MudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihvdXRwdXQpOworICAgICAgICBib29sZWFuIGNsaWVudCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNlcnZlciA9IGZhbHNlOworICAgICAgICBib29sZWFuIGN2cyA9IGZhbHNlOworICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgY3VycmVudFRva2VuID0gc3QubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAoY3VycmVudFRva2VuLmVxdWFscygiQ2xpZW50OiIpKSB7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFRva2VuLmVxdWFscygiU2VydmVyOiIpKSB7CisgICAgICAgICAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFRva2VuLmVxdWFscygiKENWUykiKSkgeworICAgICAgICAgICAgICAgIGN2cyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2xpZW50ICYmIGN2cykgeworICAgICAgICAgICAgICAgIGlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50VmVyc2lvbiA9IHN0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjdnMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyICYmIGN2cykgeworICAgICAgICAgICAgICAgIGlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVmVyc2lvbiA9IHN0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjdnMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRWZXJzaW9uUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KGNsaWVudFZlcnNpb25Qcm9wZXJ0eSwgY2xpZW50VmVyc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcnZlclZlcnNpb25Qcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkoc2VydmVyVmVyc2lvblByb3BlcnR5LCBzZXJ2ZXJWZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9SQ1NGaWxlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUkNTRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYThjZjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUkNTRmlsZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY3ZzbGliOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBSQ1MgRmlsZSBjaGFuZ2UuCisgKgorICovCitjbGFzcyBSQ1NGaWxlIHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHJldmlzaW9uOworICAgIHByaXZhdGUgU3RyaW5nIHByZXZpb3VzUmV2aXNpb247CisKKworICAgIFJDU0ZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyByZXYpIHsKKyAgICAgICAgdGhpcyhuYW1lLCByZXYsIG51bGwpOworICAgIH0KKworCisgICAgUkNTRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXZpc2lvbiwKKyAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2aW91c1JldmlzaW9uKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMucmV2aXNpb24gPSByZXZpc2lvbjsKKyAgICAgICAgaWYgKCFyZXZpc2lvbi5lcXVhbHMocHJldmlvdXNSZXZpc2lvbikpIHsKKyAgICAgICAgICAgIHRoaXMucHJldmlvdXNSZXZpc2lvbiA9IHByZXZpb3VzUmV2aXNpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBSQ1NGaWxlCisgICAgICogQHJldHVybiBuYW1lIG9mIHRoZSBmaWxlCisgICAgICovCisgICAgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGUgUkNTRmlsZQorICAgICAqIEByZXR1cm4gdGhlIHJldmlzaW9uIG51bWJlciAoYXMgU3RyaW5nKQorICAgICAqLworICAgIFN0cmluZyBnZXRSZXZpc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHJldmlzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHByZXZpb3VzIHJldmlzaW9uIG9mIHRoZSBSQ1NGaWxlCisgICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgcmV2aXNpb24gbnVtYmVyIChhcyBTdHJpbmcpCisgICAgICovCisgICAgU3RyaW5nIGdldFByZXZpb3VzUmV2aXNpb24oKSB7CisgICAgICAgIHJldHVybiBwcmV2aW91c1JldmlzaW9uOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL1JlZGlyZWN0aW5nT3V0cHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUmVkaXJlY3RpbmdPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI2MWNmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL1JlZGlyZWN0aW5nT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkxpbmVPcmllbnRlZE91dHB1dFN0cmVhbTsKKworLyoqCisgKiBBIGR1bW15IHN0cmVhbSB0aGF0IGp1c3QgcGFzc2VzIHN0dWZmIHRvIHRoZSBwYXJzZXIuCisgKi8KK2NsYXNzIFJlZGlyZWN0aW5nT3V0cHV0U3RyZWFtIGV4dGVuZHMgTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIGZpbmFsIENoYW5nZUxvZ1BhcnNlciBwYXJzZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyc2VyIHRoZSBwYXJzZXIgdG8gd2hpY2ggb3V0cHV0IGlzIHNlbnQuCisgICAgICovCisgICAgcHVibGljIFJlZGlyZWN0aW5nT3V0cHV0U3RyZWFtKGZpbmFsIENoYW5nZUxvZ1BhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9ncyBhIGxpbmUgdG8gdGhlIGxvZyBzeXN0ZW0gb2YgYW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gbG9nLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NMaW5lKGZpbmFsIFN0cmluZyBsaW5lKSB7CisgICAgICAgIHBhcnNlci5zdGRvdXQobGluZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUmVkaXJlY3RpbmdTdHJlYW1IYW5kbGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUmVkaXJlY3RpbmdTdHJlYW1IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5ZWIyMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9SZWRpcmVjdGluZ1N0cmVhbUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHVtcFN0cmVhbUhhbmRsZXI7CisKKy8qKgorICogQSBkdW1teSBzdHJlYW0gaGFuZGxlciB0aGF0IGp1c3QgcGFzc2VzIHN0dWZmIHRvIHRoZSBwYXJzZXIuCisgKgorICovCitjbGFzcyBSZWRpcmVjdGluZ1N0cmVhbUhhbmRsZXIKKyAgICAgZXh0ZW5kcyBQdW1wU3RyZWFtSGFuZGxlciB7CisgICAgUmVkaXJlY3RpbmdTdHJlYW1IYW5kbGVyKGZpbmFsIENoYW5nZUxvZ1BhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgc3VwZXIobmV3IFJlZGlyZWN0aW5nT3V0cHV0U3RyZWFtKHBhcnNlciksCisgICAgICAgICAgICBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpOworICAgIH0KKworCisgICAgU3RyaW5nIGdldEVycm9ycygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnJvcgorICAgICAgICAgICAgICAgID0gKEJ5dGVBcnJheU91dHB1dFN0cmVhbSkgZ2V0RXJyKCk7CisKKyAgICAgICAgICAgIHJldHVybiBlcnJvci50b1N0cmluZygiQVNDSUkiKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBzdXBlci5zdG9wKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRFcnIoKS5jbG9zZSgpOworICAgICAgICAgICAgZ2V0T3V0KCkuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gcGxhaW4gaW1wb3NzaWJsZQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGVmYXVsdHMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ4OGRjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGVmYXVsdHMucHJvcGVydGllcwpAQCAtMCwwICsxLDIzNCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBzdGFuZGFyZCBhbnQgdGFza3MKK2FudD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQKK2FudGNhbGw9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ2FsbFRhcmdldAorYW50c3RydWN0dXJlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFudFN0cnVjdHVyZQorYW50dmVyc2lvbj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQW50VmVyc2lvbgorYXBwbHk9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHJhbnNmb3JtCithdmFpbGFibGU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQXZhaWxhYmxlCitiYXNlbmFtZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5CYXNlbmFtZQorYnVpbGRudW1iZXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQnVpbGROdW1iZXIKK2J1bnppcDI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQlVuemlwMgorYnppcDI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQlppcDIKK2NoZWNrc3VtPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNoZWNrc3VtCitjaG1vZD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DaG1vZAorY2xhc3Nsb2FkZXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ2xhc3Nsb2FkZXIKK2NvbXBvbmVudGRlZj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db21wb25lbnRkZWYKK2NvbmNhdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db25jYXQKK2NvbmRpdGlvbj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db25kaXRpb25UYXNrCitjb3B5PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHkKK2N2cz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DdnMKK2N2c2NoYW5nZWxvZz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWIuQ2hhbmdlTG9nVGFzaworY3ZzcGFzcz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DVlNQYXNzCitjdnN0YWdkaWZmPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYi5DdnNUYWdEaWZmCitjdnN2ZXJzaW9uPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYi5DdnNWZXJzaW9uCitkZWZhdWx0ZXhjbHVkZXM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGVmYXVsdEV4Y2x1ZGVzCitkZWxldGU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGVsZXRlCitkZXBlbmRzZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGVwZW5kU2V0CitkaWFnbm9zdGljcz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5EaWFnbm9zdGljc1Rhc2sKK2Rpcm5hbWU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGlybmFtZQorZWFyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVhcgorZWNobz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvCitleGVjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWNUYXNrCitmYWlsPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4aXQKK2ZpbHRlcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5GaWx0ZXIKK2ZpeGNybGY9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRml4Q1JMRgorZ2Vua2V5PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdlbmVyYXRlS2V5CitnZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuR2V0CitndW56aXA9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuR1VuemlwCitnemlwPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdaaXAKK2ltcG9ydD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5JbXBvcnRUYXNrCitpbnB1dD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5JbnB1dAoramFyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphcgoramF2YT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhCitqYXZhYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYworamF2YWRvYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhZG9jCitsZW5ndGg9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTGVuZ3RoCitsb2FkZmlsZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2FkRmlsZQorbG9hZHByb3BlcnRpZXM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9hZFByb3BlcnRpZXMKK2xvYWRyZXNvdXJjZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2FkUmVzb3VyY2UKK21hY3JvZGVmPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hY3JvRGVmCittYWlsPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsVGFzaworbWFuaWZlc3Q9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWFuaWZlc3RUYXNrCittYW5pZmVzdGNsYXNzcGF0aD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYW5pZmVzdENsYXNzUGF0aAorbWtkaXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWtkaXIKK21vdmU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTW92ZQorbmljZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5OaWNlCitwYXJhbGxlbD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QYXJhbGxlbAorcGF0Y2g9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUGF0Y2gKK3BhdGhjb252ZXJ0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlBhdGhDb252ZXJ0CitwcmVzZXRkZWY9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHJlU2V0RGVmCitwcm9wZXJ0eT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Qcm9wZXJ0eQorcHJvcGVydHloZWxwZXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHJvcGVydHlIZWxwZXJUYXNrCityZWNvcmQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmVjb3JkZXIKK3JlcGxhY2U9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmVwbGFjZQorcmV0cnk9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmV0cnkKK3JtaWM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUm1pYworc2VxdWVudGlhbD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TZXF1ZW50aWFsCitzaWduamFyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNpZ25KYXIKK3NsZWVwPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNsZWVwCitzcWw9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuU1FMRXhlYworc3ViYW50PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlN1YkFudAorc3luYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TeW5jCit0YXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGFyCit0YXNrZGVmPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRhc2tkZWYKK3RlbXBmaWxlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRlbXBGaWxlCit0b3VjaD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Ub3VjaAordHN0YW1wPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRzdGFtcAordHJ1bmNhdGU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHJ1bmNhdGUKK3R5cGVkZWY9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHlwZWRlZgordW5qYXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhwYW5kCit1bnRhcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VbnRhcgordW53YXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhwYW5kCit1bnppcD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeHBhbmQKK3VwdG9kYXRlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlVwVG9EYXRlCit3YWl0Zm9yPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLldhaXRGb3IKK3dhcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5XYXIKK3doaWNocmVzb3VyY2U9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuV2hpY2hSZXNvdXJjZQoreG1scHJvcGVydHk9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWG1sUHJvcGVydHkKK3hzbHQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWFNMVFByb2Nlc3MKK3ppcD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5aaXAKKworIyBvcHRpb25hbCB0YXNrcworYW50bHI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuQU5UTFIKK2FwdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BcHQKK2F0dHJpYj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC53aW5kb3dzLkF0dHJpYgorYmxnZW5jbGllbnQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkJvcmxhbmRHZW5lcmF0ZUNsaWVudAorY2FiPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkNhYgorY2NjaGVja2luPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZS5DQ0NoZWNraW4KK2NjY2hlY2tvdXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLkNDQ2hlY2tvdXQKK2NjbG9jaz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NMb2NrCitjY21jaGVja2luPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbS5DQ01DaGVja2luCitjY21jaGVja2ludGFzaz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20uQ0NNQ2hlY2tpbkRlZmF1bHQKK2NjbWNoZWNrb3V0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbS5DQ01DaGVja291dAorY2NtY3JlYXRldGFzaz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20uQ0NNQ3JlYXRlVGFzaworY2Nta2F0dHI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLkNDTWthdHRyCitjY21rYmw9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLkNDTWtibAorY2Nta2Rpcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NNa2RpcgorY2Nta2VsZW09b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLkNDTWtlbGVtCitjY21rbGFiZWw9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLkNDTWtsYWJlbAorY2Nta2xidHlwZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NNa2xidHlwZQorY2NtcmVjb25maWd1cmU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtLkNDTVJlY29uZmlndXJlCitjY3JtdHlwZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NSbXR5cGUKK2NjdW5jaGVja291dD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NVbkNoZWNrb3V0CitjY3VubG9jaz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NVbmxvY2sKK2NjdXBkYXRlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZS5DQ1VwZGF0ZQorY2hncnA9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudW5peC5DaGdycAorY2hvd249b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudW5peC5DaG93bgorY3NjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5DU2hhcnAKK2RkY3JlYXRvcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRERDcmVhdG9yCitkZXBlbmQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLkRlcGVuZAorZWNob3Byb3BlcnRpZXM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuRWNob1Byb3BlcnRpZXMKK2VjaG94bWw9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNob1hNTAorZWpiYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRWpiYworZWpiamFyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5FamJKYXIKK2Z0cD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uZXQuRlRQCitmdW50ZXN0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnRlc3RpbmcuRnVudGVzdAoraWxhc209b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0LklsYXNtCitpbGRhc209b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0LklsZGFzbQoraW1hZ2U9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2UKK2ltcG9ydHR5cGVsaWI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0LkltcG9ydFR5cGVsaWIKK2lwbGFuZXQtZWpiYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuSVBsYW5ldEVqYmNUYXNrCitqYXJsaWItYXZhaWxhYmxlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5KYXJMaWJBdmFpbGFibGVUYXNrCitqYXJsaWItZGlzcGxheT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uSmFyTGliRGlzcGxheVRhc2sKK2phcmxpYi1tYW5pZmVzdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uSmFyTGliTWFuaWZlc3RUYXNrCitqYXJsaWItcmVzb2x2ZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uSmFyTGliUmVzb2x2ZVRhc2sKK2phdmFjYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhY2MuSmF2YUNDCitqYXZhaD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5KYXZhaAoramRlcGVuZD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qZGVwZW5kLkpEZXBlbmRUYXNrCitqamRvYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhY2MuSkpEb2MKK2pqdHJlZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhY2MuSkpUcmVlCitqc2hhcnBjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5KU2hhcnAKK2p1bml0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0VGFzaworanVuaXRyZXBvcnQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuWE1MUmVzdWx0QWdncmVnYXRvcgorbWFrZXVybD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYWtlVXJsCituYXRpdmUyYXNjaWk9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuTmF0aXZlMkFzY2lpCituZXRyZXh4Yz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5OZXRSZXh4QworcDRhZGQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRBZGQKK3A0Y2hhbmdlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0Q2hhbmdlCitwNGNvdW50ZXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRDb3VudGVyCitwNGRlbGV0ZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNERlbGV0ZQorcDRlZGl0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0RWRpdAorcDRmc3RhdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNEZzdGF0CitwNGhhdmU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRIYXZlCitwNGludGVncmF0ZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNEludGVncmF0ZQorcDRsYWJlbD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNExhYmVsCitwNGxhYmVsc3luYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNExhYmVsc3luYworcDRyZW9wZW49b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRSZW9wZW4KK3A0cmVzb2x2ZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNFJlc29sdmUKK3A0cmV2ZXJ0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0UmV2ZXJ0CitwNHN1Ym1pdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNFN1Ym1pdAorcDRzeW5jPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0U3luYworcHJvcGVydHlmaWxlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlByb3BlcnR5RmlsZQorcHZjcz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wdmNzLlB2Y3MKK3JlcGxhY2VyZWdleHA9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuUmVwbGFjZVJlZ0V4cAorcmVzb3VyY2Vjb3VudD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZXNvdXJjZUNvdW50CityZXhlYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uZXQuUkV4ZWNUYXNrCitycG09b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuUnBtCitzY2hlbWF2YWxpZGF0ZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5TY2hlbWFWYWxpZGF0ZQorc2NwPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNzaC5TY3AKK3NjcmlwdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5TY3JpcHQKK3NjcmlwdGRlZj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zY3JpcHQuU2NyaXB0RGVmCitzZXJ2ZXJkZXBsb3k9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZS5TZXJ2ZXJEZXBsb3kKK3NldHByb3h5PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldC5TZXRQcm94eQorc29zY2hlY2tpbj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3MuU09TQ2hlY2tpbgorc29zY2hlY2tvdXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zLlNPU0NoZWNrb3V0Citzb3NnZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zLlNPU0dldAorc29zbGFiZWw9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zLlNPU0xhYmVsCitzb3VuZD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3VuZC5Tb3VuZFRhc2sKK3NwbGFzaD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zcGxhc2guU3BsYXNoVGFzaworc3NoZXhlYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zc2guU1NIRXhlYworc3RjaGVja2luPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnN0YXJ0ZWFtLlN0YXJUZWFtQ2hlY2tpbgorc3RjaGVja291dD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zdGFydGVhbS5TdGFyVGVhbUNoZWNrb3V0CitzdGxhYmVsPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnN0YXJ0ZWFtLlN0YXJUZWFtTGFiZWwKK3N0bGlzdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zdGFydGVhbS5TdGFyVGVhbUxpc3QKK3N0eWxlYm9vaz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5TdHlsZUJvb2sKK3N5bWxpbms9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudW5peC5TeW1saW5rCit0ZWxuZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0LlRlbG5ldFRhc2sKK3RyYW5zbGF0ZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pMThuLlRyYW5zbGF0ZQordmJjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5WaXN1YWxCYXNpY0NvbXBpbGUKK3ZlcmlmeWphcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5WZXJpZnlKYXIKK3Zzc2FkZD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NBREQKK3Zzc2NoZWNraW49b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzLk1TVlNTQ0hFQ0tJTgordnNzY2hlY2tvdXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzLk1TVlNTQ0hFQ0tPVVQKK3Zzc2NwPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0NQCit2c3NjcmVhdGU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzLk1TVlNTQ1JFQVRFCit2c3NnZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzLk1TVlNTR0VUCit2c3NoaXN0b3J5PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0hJU1RPUlkKK3Zzc2xhYmVsPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0xBQkVMCit3bGpzcGM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLldMSnNwYword2xydW49b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLldMUnVuCit3bHN0b3A9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLldMU3RvcAord3NkbHRvZG90bmV0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5Xc2RsVG9Eb3RuZXQKK3htbHZhbGlkYXRlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlhNTFZhbGlkYXRlVGFzaworCisKKyMgZGVwcmVjYXRlZCBhbnQgdGFza3MgKGtlcHQgZm9yIGJhY2sgY29tcGF0aWJpbGl0eSkKK2NvcHlkaXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weWRpcgorY29weWZpbGU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weWZpbGUKK2NvcHlwYXRoPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHlQYXRoCitkZWx0cmVlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkRlbHRyZWUKK2V4ZWNvbj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlT24KK2phdmFkb2MyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MKK2psaW5rPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpsaW5rLkpsaW5rVGFzaworanNwYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuSnNwQworbWltZW1haWw9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0Lk1pbWVNYWlsCityZW5hbWU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmVuYW1lCityZW5hbWVleHQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuUmVuYW1lRXh0ZW5zaW9ucworc3RhcnRlYW09b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2NtLkFudFN0YXJUZWFtQ2hlY2tPdXQKK3N0eWxlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRQcm9jZXNzCitXc2RsVG9Eb3RuZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0LldzZGxUb0RvdG5ldApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxBZGRyZXNzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9FbWFpbEFkZHJlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc2ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxBZGRyZXNzLmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWw7CisKKy8qKgorICogSG9sZHMgYW4gZW1haWwgYWRkcmVzcy4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgY2xhc3MgRW1haWxBZGRyZXNzIHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3M7CisKKworICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGVtYWlsIGFkZHJlc3MgICovCisgICAgcHVibGljIEVtYWlsQWRkcmVzcygpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZW1haWwgYWRkcmVzcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW1haWwgdGhlIGVtYWlsIGFkZHJlc3MgKHdpdGggb3Igd2l0aG91dCA8PikKKyAgICAgKiBBY2NlcHRhYmxlIGZvcm1zIGluY2x1ZGU6CisgICAgICogICAgYWRkcmVzcworICAgICAqICAgIDxhZGRyZXNzPgorICAgICAqICAgIG5hbWUgPGFkZHJlc3M+CisgICAgICogICAgPGFkZHJlc3M+IG5hbWUKKyAgICAgKiAgICAobmFtZSkgYWRkcmVzcworICAgICAqICAgIGFkZHJlc3MgKG5hbWUpCisgICAgICovCisgICAgLy8gTWFrZSBhIGxpbWl0ZWQgYXR0ZW1wdCB0byBleHRyYWN0IGEgc2FuaXRpemVkIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3MKKyAgICAvLyBBbGdvcml0aG0gYmFzZWQgb24gdGhlIG9uZSBmb3VuZCBpbiBBbnQncyBNYWlsTWVzc2FnZS5qYXZhCisgICAgcHVibGljIEVtYWlsQWRkcmVzcyhTdHJpbmcgZW1haWwpIHsKKyAgICAgICAgZmluYWwgaW50IG1pbkxlbiA9IDk7CisgICAgICAgIGludCBsZW4gPSBlbWFpbC5sZW5ndGgoKTsKKworICAgICAgICAvLyBzaG9ydGN1dCBmb3IgIjxhZGRyZXNzPiIKKyAgICAgICAgaWYgKGxlbiA+IG1pbkxlbikgeworICAgICAgICAgICAgaWYgKChlbWFpbC5jaGFyQXQoMCkgPT0gJzwnIHx8IGVtYWlsLmNoYXJBdCgxKSA9PSAnPCcpCisgICAgICAgICAgICAmJiAoZW1haWwuY2hhckF0KGxlbiAtIDEpID09ICc+JyB8fCBlbWFpbC5jaGFyQXQobGVuIC0gMikgPT0gJz4nKSkgeworICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzcyA9IHRyaW0oZW1haWwsIHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBwYXJhbURlcHRoID0gMDsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgaW50IGVuZCA9IDA7CisgICAgICAgIGludCBuU3RhcnQgPSAwOworICAgICAgICBpbnQgbkVuZCA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gZW1haWwuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJygnKSB7CisgICAgICAgICAgICAgICAgcGFyYW1EZXB0aCsrOworICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7ICAvLyBzdXBwb3J0ICJhZGRyZXNzIChuYW1lKSIKKyAgICAgICAgICAgICAgICAgICAgblN0YXJ0ID0gaSArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICcpJykgeworICAgICAgICAgICAgICAgIHBhcmFtRGVwdGgtLTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsgIC8vIHN1cHBvcnQgIihuYW1lKSBhZGRyZXNzIgorICAgICAgICAgICAgICAgICAgICBuRW5kID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtRGVwdGggPT0gMCAmJiBjID09ICc8JykgeworICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5FbmQgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbURlcHRoID09IDAgJiYgYyA9PSAnPicpIHsKKyAgICAgICAgICAgICAgICBlbmQgPSBpOworICAgICAgICAgICAgICAgIGlmIChlbmQgIT0gbGVuIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBuU3RhcnQgPSBpICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBERUJVRzogU3lzdGVtLm91dC5wcmludGxuKCBlbWFpbCApOworICAgICAgICBpZiAoZW5kID09IDApIHsKKyAgICAgICAgICAgIGVuZCA9IGxlbjsKKyAgICAgICAgfQorICAgICAgICAvLyBERUJVRzogU3lzdGVtLm91dC5wcmludGxuKCAiYWRkcmVzczogIiArIHN0YXJ0ICsgIiAiICsgZW5kICk7CisgICAgICAgIGlmIChuRW5kID09IDApIHsKKyAgICAgICAgICAgIG5FbmQgPSBsZW47CisgICAgICAgIH0KKyAgICAgICAgLy8gREVCVUc6IFN5c3RlbS5vdXQucHJpbnRsbiggIm5hbWU6ICIgKyBuU3RhcnQgKyAiICIgKyBuRW5kICk7CisKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gdHJpbShlbWFpbC5zdWJzdHJpbmcoc3RhcnQsIGVuZCksIHRydWUpOworICAgICAgICB0aGlzLm5hbWUgPSB0cmltKGVtYWlsLnN1YnN0cmluZyhuU3RhcnQsIG5FbmQpLCBmYWxzZSk7CisKKyAgICAgICAgLy8gaWYgdGhlIHR3byBzdWJzdHJpbmdzIGFyZSBsb25nZXIgdGhhbiB0aGUgb3JpZ2luYWwsIHRoZW4gbmFtZQorICAgICAgICAvLyBjb250YWlucyBhZGRyZXNzIC0gc28gcmVzZXQgdGhlIG5hbWUgdG8gbnVsbAorICAgICAgICBpZiAodGhpcy5uYW1lLmxlbmd0aCgpICsgdGhpcy5hZGRyZXNzLmxlbmd0aCgpID4gbGVuKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIEEgc3BlY2lhbGlzZWQgdHJpbSgpIHRoYXQgdHJpbXMgd2hpdGVzcGFjZSwKKyAgICAgKiAgJygnLCAnKScsICciJywgJzwnLCAnPicgZnJvbSB0aGUgc3RhcnQgYW5kIGVuZCBvZiBzdHJpbmdzCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHJpbShTdHJpbmcgdCwgYm9vbGVhbiB0cmltQW5nbGVCcmFja2V0cykgeworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBpbnQgZW5kID0gdC5sZW5ndGgoKTsKKyAgICAgICAgYm9vbGVhbiB0cmltID0gZmFsc2U7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRyaW0gPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0LmNoYXJBdChlbmQgLSAxKSA9PSAnKScKKyAgICAgICAgICAgICAgICB8fCAodC5jaGFyQXQoZW5kIC0gMSkgPT0gJz4nICYmIHRyaW1BbmdsZUJyYWNrZXRzKQorICAgICAgICAgICAgICAgIHx8ICh0LmNoYXJBdChlbmQgLSAxKSA9PSAnIicgJiYgdC5jaGFyQXQoZW5kIC0gMikgIT0gJ1xcJykKKyAgICAgICAgICAgICAgICB8fCB0LmNoYXJBdChlbmQgLSAxKSA8PSAnXHUwMDIwJykgeworICAgICAgICAgICAgICAgIHRyaW0gPSB0cnVlOworICAgICAgICAgICAgICAgIGVuZC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHQuY2hhckF0KHN0YXJ0KSA9PSAnKCcKKyAgICAgICAgICAgICAgICB8fCAodC5jaGFyQXQoc3RhcnQpID09ICc8JyAmJiB0cmltQW5nbGVCcmFja2V0cykKKyAgICAgICAgICAgICAgICB8fCB0LmNoYXJBdChzdGFydCkgPT0gJyInCisgICAgICAgICAgICAgICAgfHwgdC5jaGFyQXQoc3RhcnQpIDw9ICdcdTAwMjAnKSB7CisgICAgICAgICAgICAgICAgdHJpbSA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAodHJpbSk7CisgICAgICAgIHJldHVybiB0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBlcnNvbmFsIC8gZGlzcGxheSBuYW1lIG9mIHRoZSBhZGRyZXNzCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZGlzcGxheSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZW1haWwgYWRkcmVzcworICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3MgdGhlIGFjdHVhbCBlbWFpbCBhZGRyZXNzICh3aXRob3V0IDw+KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBzdHJpbmcgIm5hbWUgJmx0O2FkZHJlc3MmZ3Q7IiBvciAiYWRkcmVzcyIKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkZHJlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lICsgIiA8IiArIGFkZHJlc3MgKyAiPiI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFkZHJlc3MKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGFkZHJlc3MgcGFydAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IG5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRpc3BsYXkgbmFtZSBwYXJ0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0NGJhMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsVGFzay5qYXZhCkBAIC0wLDAgKzEsNTgyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNsYXNzcGF0aFV0aWxzOworCisvKioKKyAqIEEgdGFzayB0byBzZW5kIFNNVFAgZW1haWwuIFRoaXMgaXMgYSByZWZhY3RvcmluZyBvZiB0aGUgU2VuZE1haWwgYW5kCisgKiBNaW1lTWFpbCB0YXNrcyBzdWNoIHRoYXQgYm90aCBhcmUgd2l0aGluIGEgc2luZ2xlIHRhc2suCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqIEBhbnQudGFzayBuYW1lPSJtYWlsIiBjYXRlZ29yeT0ibmV0d29yayIKKyAqLworcHVibGljIGNsYXNzIEVtYWlsVGFzayBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTVRQX1BPUlQgPSAyNTsKKworICAgIC8qKiBDb25zdGFudCB0byBzaG93IHRoYXQgdGhlIGJlc3QgYXZhaWxhYmxlIG1haWxlciBzaG91bGQgYmUgdXNlZC4gICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUTyA9ICJhdXRvIjsKKyAgICAvKiogQ29uc3RhbnQgdG8gYWxsb3cgdGhlIE1pbWUgbWFpbGVyIHRvIGJlIHJlcXVlc3RlZCAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FID0gIm1pbWUiOworICAgIC8qKiBDb25zdGFudCB0byBhbGxvdyB0aGUgVVUgbWFpbGVyIHRvIGJlIHJlcXVlc3RlZCAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVSA9ICJ1dSI7CisgICAgLyoqIENvbnN0YW50IHRvIGFsbG93IHRoZSBwbGFpbnRleHQgbWFpbGVyIHRvIGJlIHJlcXVlc3RlZCAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFJTiA9ICJwbGFpbiI7CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBlbmNvZGluZyBjb25zdGFudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbmNvZGluZyBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKioKKyAgICAgICAgICogZmluZHMgdGhlIHZhbGlkIGVuY29kaW5nIHZhbHVlcworICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB2YWxpZCBlbnRyaWVzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7QVVUTywgTUlNRSwgVVUsIFBMQUlOfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gQVVUTzsKKyAgICAvKiogaG9zdCBydW5uaW5nIFNNVFAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOworICAgIHByaXZhdGUgaW50IHBvcnQgPSBTTVRQX1BPUlQ7CisgICAgLyoqIHN1YmplY3QgZmllbGQgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3ViamVjdCA9IG51bGw7CisgICAgLyoqIGFueSB0ZXh0ICAqLworICAgIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKKyAgICAvKiogZmFpbHVyZSBmbGFnICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUZpbGVOYW1lcyA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VNaW1lVHlwZSA9IG51bGw7CisgICAgLyogc3BlY2lhbCBoZWFkZXJzICovCisgICAgLyoqIHNlbmRlciAgKi8KKyAgICBwcml2YXRlIEVtYWlsQWRkcmVzcyBmcm9tID0gbnVsbDsKKyAgICAvKiogcmVwbHl0byAqLworICAgIHByaXZhdGUgVmVjdG9yIHJlcGx5VG9MaXN0ID0gbmV3IFZlY3RvcigpOworICAgIC8qKiBUTyByZWNpcGllbnRzICAqLworICAgIHByaXZhdGUgVmVjdG9yIHRvTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAvKiogQ0MgKENhcmJvbiBDb3B5KSByZWNpcGllbnRzICAqLworICAgIHByaXZhdGUgVmVjdG9yIGNjTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAvKiogQkNDIChCbGluZCBDYXJib24gQ29weSkgcmVjaXBpZW50cyAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBiY2NMaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIGdlbmVyaWMgaGVhZGVycyAqLworICAgIHByaXZhdGUgVmVjdG9yIGhlYWRlcnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiogZmlsZSBsaXN0ICAqLworICAgIHByaXZhdGUgUGF0aCBhdHRhY2htZW50cyA9IG51bGw7CisgICAgLyoqIENoYXJhY3RlciBzZXQgZm9yIE1pbWVNYWlsZXIqLworICAgIHByaXZhdGUgU3RyaW5nIGNoYXJzZXQgPSBudWxsOworICAgIC8qKiBVc2VyIGZvciBTTVRQIGF1dGggKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VyID0gbnVsbDsKKyAgICAvKiogUGFzc3dvcmQgZm9yIFNNVFAgYXV0aCAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKyAgICAvKiogaW5kaWNhdGUgaWYgdGhlIHVzZXIgd2lzaGVzIFNTTC1UTFMgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3NsID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXIgZm9yIFNNVFAgYXV0aDsgdGhpcyByZXF1aXJlcyBKYXZhTWFpbC4KKyAgICAgKiBAcGFyYW0gdXNlciB0aGUgU3RyaW5nIHVzZXJuYW1lLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgdXNlcikgeworICAgICAgICB0aGlzLnVzZXIgPSB1c2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFzc3dvcmQgZm9yIFNNVFAgYXV0aDsgdGhpcyByZXF1aXJlcyBKYXZhTWFpbC4KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgdGhlIFN0cmluZyBwYXNzd29yZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gc2VuZCBkYXRhIG92ZXIgU1NMLgorICAgICAqIEBwYXJhbSBzc2wgYm9vbGVhbjsgaWYgdHJ1ZSBTU0wgd2lsbCBiZSB1c2VkLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U1NMKGJvb2xlYW4gc3NsKSB7CisgICAgICAgIHRoaXMuc3NsID0gc3NsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJlZmVycmVkIGVuY29kaW5nIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2RpbmcgKG9uZSBvZiBBVVRPLCBNSU1FLCBVVSwgUExBSU4pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKEVuY29kaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZy5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWFpbCBzZXJ2ZXIgcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYWlscG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFpbGhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1YmplY3QgbGluZSBvZiB0aGUgZW1haWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3ViamVjdCBTdWJqZWN0IG9mIHRoaXMgZW1haWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgc3ViamVjdCkgeworICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3J0aGFuZCBtZXRob2QgdG8gc2V0IHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSBib2R5IG9mIHRoaXMgZW1haWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpZiAodGhpcy5tZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgbWVzc2FnZSBjYW4gYmUgc2VudCBpbiBhbiAiCisgICAgICAgICAgICAgICAgICsgImVtYWlsIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbmV3IE1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgIHRoaXMubWVzc2FnZS5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvcnRoYW5kIG1ldGhvZCB0byBzZXQgdGhlIG1lc3NhZ2UgZnJvbSBhIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSBmcm9tIHdoaWNoIHRvIHRha2UgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICh0aGlzLm1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBtZXNzYWdlIGNhbiBiZSBzZW50IGluIGFuICIKKyAgICAgICAgICAgICAgICAgKyAiZW1haWwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm1lc3NhZ2UgPSBuZXcgTWVzc2FnZShmaWxlKTsKKyAgICAgICAgdGhpcy5tZXNzYWdlLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG9ydGhhbmQgbWV0aG9kIHRvIHNldCB0eXBlIG9mIHRoZSB0ZXh0IG1lc3NhZ2UsIHRleHQvcGxhaW4gYnkgZGVmYXVsdAorICAgICAqIGJ1dCB0ZXh0L2h0bWwgb3IgdGV4dC94bWwgaXMgcXVpdGUgZmVhc2libGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBUaGUgbmV3IE1lc3NhZ2VNaW1lVHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlTWltZVR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlTWltZVR5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG1lc3NhZ2UgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGEgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy5tZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiT25seSBvbmUgbWVzc2FnZSBjYW4gYmUgc2VudCBpbiBhbiBlbWFpbCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZnJvbSBhZGRyZXNzIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBzZW5kIGZyb20uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRnJvbShFbWFpbEFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICBpZiAodGhpcy5mcm9tICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRW1haWxzIGNhbiBvbmx5IGJlIGZyb20gb25lIGFkZHJlc3MiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmZyb20gPSBhZGRyZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3J0aGFuZCB0byBzZXQgdGhlIGZyb20gYWRkcmVzcyBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gc2VuZCBtYWlsIGZyb20uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgYWRkcmVzcykgeworICAgICAgICBpZiAodGhpcy5mcm9tICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRW1haWxzIGNhbiBvbmx5IGJlIGZyb20gb25lIGFkZHJlc3MiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmZyb20gPSBuZXcgRW1haWxBZGRyZXNzKGFkZHJlc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHJlcGx5dG8gYWRkcmVzcyBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gcmVwbHkgdG8uCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZXBseVRvKEVtYWlsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMucmVwbHlUb0xpc3QuYWRkKGFkZHJlc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3J0aGFuZCB0byBzZXQgdGhlIHJlcGx5dG8gYWRkcmVzcyBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gd2hpY2ggcmVwbGllcyBzaG91bGQgYmUgZGlyZWN0ZWQuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBseVRvKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMucmVwbHlUb0xpc3QuYWRkKG5ldyBFbWFpbEFkZHJlc3MoYWRkcmVzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHRvIGFkZHJlc3MgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIEFuIGVtYWlsIGFkZHJlc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVG8oRW1haWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgdG9MaXN0LmFkZEVsZW1lbnQoYWRkcmVzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvcnRoYW5kIHRvIHNldCB0aGUgInRvIiBhZGRyZXNzIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdCBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhZGRyZXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG9MaXN0KFN0cmluZyBsaXN0KSB7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpc3QsICIsIik7CisKKyAgICAgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIHRvTGlzdC5hZGRFbGVtZW50KG5ldyBFbWFpbEFkZHJlc3ModG9rZW5zLm5leHRUb2tlbigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSAiY2MiIGFkZHJlc3MgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENjKEVtYWlsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgICAgIGNjTGlzdC5hZGRFbGVtZW50KGFkZHJlc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3J0aGFuZCB0byBzZXQgdGhlICJjYyIgYWRkcmVzcyBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3QgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgYWRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENjTGlzdChTdHJpbmcgbGlzdCkgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaXN0LCAiLCIpOworCisgICAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBjY0xpc3QuYWRkRWxlbWVudChuZXcgRW1haWxBZGRyZXNzKHRva2Vucy5uZXh0VG9rZW4oKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgImJjYyIgYWRkcmVzcyBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQmNjKEVtYWlsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgICAgIGJjY0xpc3QuYWRkRWxlbWVudChhZGRyZXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG9ydGhhbmQgdG8gc2V0IHRoZSAiYmNjIiBhZGRyZXNzIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdCBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBhZGRyZXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmNjTGlzdChTdHJpbmcgbGlzdCkgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaXN0LCAiLCIpOworCisgICAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBiY2NMaXN0LmFkZEVsZW1lbnQobmV3IEVtYWlsQWRkcmVzcyh0b2tlbnMubmV4dFRva2VuKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIEJ1aWxkRXhjZXB0aW9ucyBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNvcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFpbE9uRXJyb3IgVGhlIG5ldyBGYWlsT25FcnJvciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWxPbkVycm9yKSB7CisgICAgICAgIHRoaXMuZmFpbE9uRXJyb3IgPSBmYWlsT25FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgYXR0YWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWVzIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVzKFN0cmluZyBmaWxlbmFtZXMpIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHQgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpbGVuYW1lcywgIiwgIik7CisKKyAgICAgICAgd2hpbGUgKHQuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBjcmVhdGVBdHRhY2htZW50cygpCisgICAgICAgICAgICAgICAgLmFkZChuZXcgRmlsZVJlc291cmNlKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSh0Lm5leHRUb2tlbigpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLgorICAgICAqCisgICAgICogQHBhcmFtIGZzIFRoZSBmaWxlc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBmcykgeworICAgICAgICBjcmVhdGVBdHRhY2htZW50cygpLmFkZChmcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFBhdGggYXMgY29udGFpbmVyIGZvciBhdHRhY2htZW50cy4gIFN1cHBvcnRzIGFueQorICAgICAqIGZpbGVzeXN0ZW0gcmVzb3VyY2UtY29sbGVjdGlvbnMgdGhhdCB3YXkuCisgICAgICogQHJldHVybiB0aGUgcGF0aCB0byBiZSBjb25maWd1cmVkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQXR0YWNobWVudHMoKSB7CisgICAgICAgIGlmIChhdHRhY2htZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICBhdHRhY2htZW50cyA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXN0ZWQgaGVhZGVyIGVsZW1lbnQuCisgICAgICogQHJldHVybiBhIEhlYWRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGVhZGVyIGNyZWF0ZUhlYWRlcigpIHsKKyAgICAgICAgSGVhZGVyIGggPSBuZXcgSGVhZGVyKCk7CisgICAgICAgIGhlYWRlcnMuYWRkKGgpOworICAgICAgICByZXR1cm4gaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBpbmNsdWRlIGZpbGVuYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlRmlsZU5hbWVzIFdoZXRoZXIgdG8gaW5jbHVkZSBmaWxlbmFtZXMgaW4gdGhlIHRleHQgb2YgdGhlCisgICAgICogICAgICBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVmaWxlbmFtZXMoYm9vbGVhbiBpbmNsdWRlRmlsZU5hbWVzKSB7CisgICAgICAgIHRoaXMuaW5jbHVkZUZpbGVOYW1lcyA9IGluY2x1ZGVGaWxlTmFtZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHdoZXRoZXIgZmlsZSBuYW1lcyBzaG91bGQgYmUgaW5jbHVkZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIElkZW50aWZpZXMgd2hldGhlciBmaWxlIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbmNsdWRlRmlsZU5hbWVzKCkgeworICAgICAgICByZXR1cm4gaW5jbHVkZUZpbGVOYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGFuIGVtYWlsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIE1lc3NhZ2Ugc2F2ZWRNZXNzYWdlID0gbWVzc2FnZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWFpbGVyIG1haWxlciA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIHByZXBhcmUgZm9yIHRoZSBhdXRvIHNlbGVjdCBtZWNoYW5pc20KKyAgICAgICAgICAgIGJvb2xlYW4gYXV0b0ZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAvLyB0cnkgTUlNRSBmb3JtYXQKKyAgICAgICAgICAgIGlmIChlbmNvZGluZy5lcXVhbHMoTUlNRSkKKyAgICAgICAgICAgICAgICAgfHwgKGVuY29kaW5nLmVxdWFscyhBVVRPKSAmJiAhYXV0b0ZvdW5kKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1haWxlciA9IChNYWlsZXIpIENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5NaW1lTWFpbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbWFpbFRhc2suY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwgTWFpbGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0b0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJVc2luZyBNSU1FIG1haWwiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ0J1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5pdGlhbGlzZSBNSU1FIG1haWw6ICIsIGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU01UUCBhdXRoIG9ubHkgYWxsb3dlZCB3aXRoIE1JTUUgbWFpbAorICAgICAgICAgICAgaWYgKCFhdXRvRm91bmQgJiYgKCh1c2VyICE9IG51bGwpIHx8IChwYXNzd29yZCAhPSBudWxsKSkKKyAgICAgICAgICAgICAgICAmJiAoZW5jb2RpbmcuZXF1YWxzKFVVKSB8fCBlbmNvZGluZy5lcXVhbHMoUExBSU4pKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU01UUCBhdXRoIG9ubHkgcG9zc2libGUgd2l0aCBNSU1FIG1haWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNTTCBvbmx5IGFsbG93ZWQgd2l0aCBNSU1FIG1haWwKKyAgICAgICAgICAgIGlmICghYXV0b0ZvdW5kICAmJiAoc3NsKQorICAgICAgICAgICAgICAgICYmIChlbmNvZGluZy5lcXVhbHMoVVUpIHx8IGVuY29kaW5nLmVxdWFscyhQTEFJTikpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTU0wgb25seSBwb3NzaWJsZSB3aXRoIE1JTUUgbWFpbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdHJ5IFVVIGZvcm1hdAorICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscyhVVSkKKyAgICAgICAgICAgICAgICAgfHwgKGVuY29kaW5nLmVxdWFscyhBVVRPKSAmJiAhYXV0b0ZvdW5kKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1haWxlciA9IChNYWlsZXIpIENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5VVU1haWxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1haWxUYXNrLmNsYXNzLmdldENsYXNzTG9hZGVyKCksIE1haWxlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGF1dG9Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGxvZygiVXNpbmcgVVUgbWFpbCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBpbml0aWFsaXNlIFVVIG1haWw6ICIsIGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdHJ5IHBsYWluIGZvcm1hdAorICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscyhQTEFJTikKKyAgICAgICAgICAgICAgICAgfHwgKGVuY29kaW5nLmVxdWFscyhBVVRPKSAmJiAhYXV0b0ZvdW5kKSkgeworICAgICAgICAgICAgICAgIG1haWxlciA9IG5ldyBQbGFpbk1haWxlcigpOworICAgICAgICAgICAgICAgIGF1dG9Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9nKCJVc2luZyBwbGFpbiBtYWlsIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhIHZhbGlkIG1haWxlciBtdXN0IGJlIHByZXNlbnQgYnkgbm93CisgICAgICAgICAgICBpZiAobWFpbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBpbml0aWFsaXNlIGVuY29kaW5nOiAiCisgICAgICAgICAgICAgICAgICAgICArIGVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGEgdmFsaWQgbWVzc2FnZSBpcyByZXF1aXJlZAorICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYW4gYWRkcmVzcyB0byBzZW5kIGZyb20gaXMgcmVxdWlyZWQKKyAgICAgICAgICAgIGlmIChmcm9tID09IG51bGwgfHwgZnJvbS5nZXRBZGRyZXNzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQSBmcm9tIGVsZW1lbnQgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGF0IGxlYXN0IG9uZSBhZGRyZXNzIHRvIHNlbmQgdG8vY2MvYmNjIGlzIHJlcXVpcmVkCisgICAgICAgICAgICBpZiAodG9MaXN0LmlzRW1wdHkoKSAmJiBjY0xpc3QuaXNFbXB0eSgpICYmIGJjY0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBdCBsZWFzdCBvbmUgb2YgdG8sIGNjIG9yIGJjYyBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICsgImJlIHN1cHBsaWVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzZXQgdGhlIG1pbWV0eXBlIGlmIG5vdCBkb25lIGFscmVhZHkgKGFuZCByZXF1aXJlZCkKKyAgICAgICAgICAgIGlmIChtZXNzYWdlTWltZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmlzTWltZVR5cGVTcGVjaWZpZWQoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBtaW1lIHR5cGUgY2FuIG9ubHkgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgInNwZWNpZmllZCBpbiBvbmUgbG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRNaW1lVHlwZShtZXNzYWdlTWltZVR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2V0IHRoZSBjaGFyYWN0ZXIgc2V0IGlmIG5vdCBkb25lIGFscmVhZHkgKGFuZCByZXF1aXJlZCkKKyAgICAgICAgICAgIGlmIChjaGFyc2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5nZXRDaGFyc2V0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBjaGFyc2V0IGNhbiBvbmx5IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJzcGVjaWZpZWQgaW4gb25lIGxvY2F0aW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0Q2hhcnNldChjaGFyc2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWRlbnRpZnkgd2hpY2ggZmlsZXMgc2hvdWxkIGJlIGF0dGFjaGVkCisgICAgICAgICAgICBWZWN0b3IgZmlsZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBpZiAoYXR0YWNobWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50cy5pdGVyYXRvcigpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVSZXNvdXJjZSBmciA9IChGaWxlUmVzb3VyY2UpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBmaWxlcy5hZGRFbGVtZW50KGZyLmdldEZpbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbGV0IHRoZSB1c2VyIGtub3cgd2hhdCdzIGdvaW5nIHRvIGhhcHBlbgorICAgICAgICAgICAgbG9nKCJTZW5kaW5nIGVtYWlsOiAiICsgc3ViamVjdCwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICBsb2coIkZyb20gIiArIGZyb20sIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgbG9nKCJSZXBseVRvICIgKyByZXBseVRvTGlzdCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBsb2coIlRvICIgKyB0b0xpc3QsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgbG9nKCJDYyAiICsgY2NMaXN0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGxvZygiQmNjICIgKyBiY2NMaXN0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgLy8gcGFzcyB0aGUgcGFyYW1zIHRvIHRoZSBtYWlsZXIKKyAgICAgICAgICAgIG1haWxlci5zZXRIb3N0KGhvc3QpOworICAgICAgICAgICAgbWFpbGVyLnNldFBvcnQocG9ydCk7CisgICAgICAgICAgICBtYWlsZXIuc2V0VXNlcih1c2VyKTsKKyAgICAgICAgICAgIG1haWxlci5zZXRQYXNzd29yZChwYXNzd29yZCk7CisgICAgICAgICAgICBtYWlsZXIuc2V0U1NMKHNzbCk7CisgICAgICAgICAgICBtYWlsZXIuc2V0TWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgIG1haWxlci5zZXRGcm9tKGZyb20pOworICAgICAgICAgICAgbWFpbGVyLnNldFJlcGx5VG9MaXN0KHJlcGx5VG9MaXN0KTsKKyAgICAgICAgICAgIG1haWxlci5zZXRUb0xpc3QodG9MaXN0KTsKKyAgICAgICAgICAgIG1haWxlci5zZXRDY0xpc3QoY2NMaXN0KTsKKyAgICAgICAgICAgIG1haWxlci5zZXRCY2NMaXN0KGJjY0xpc3QpOworICAgICAgICAgICAgbWFpbGVyLnNldEZpbGVzKGZpbGVzKTsKKyAgICAgICAgICAgIG1haWxlci5zZXRTdWJqZWN0KHN1YmplY3QpOworICAgICAgICAgICAgbWFpbGVyLnNldFRhc2sodGhpcyk7CisgICAgICAgICAgICBtYWlsZXIuc2V0SW5jbHVkZUZpbGVOYW1lcyhpbmNsdWRlRmlsZU5hbWVzKTsKKyAgICAgICAgICAgIG1haWxlci5zZXRIZWFkZXJzKGhlYWRlcnMpOworCisgICAgICAgICAgICAvLyBzZW5kIHRoZSBlbWFpbAorICAgICAgICAgICAgbWFpbGVyLnNlbmQoKTsKKworICAgICAgICAgICAgLy8gbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBoYXBwZW5lZAorICAgICAgICAgICAgaW50IGNvdW50ID0gZmlsZXMuc2l6ZSgpOworCisgICAgICAgICAgICBsb2coIlNlbnQgZW1haWwgd2l0aCAiICsgY291bnQgKyAiIGF0dGFjaG1lbnQiCisgICAgICAgICAgICAgICAgICsgKGNvdW50ID09IDEgPyAiIiA6ICJzIiksIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIHNlbmQgZW1haWw6ICIsIGUpOworICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBsb2coIkZhaWxlZCB0byBzZW5kIGVtYWlsOiAiICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBzYXZlZE1lc3NhZ2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nQnVpbGRFeGNlcHRpb24oU3RyaW5nIHJlYXNvbiwgQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICBUaHJvd2FibGUgdCA9IGUuZ2V0Q2F1c2UoKSA9PSBudWxsID8gZSA6IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgbG9nKHJlYXNvbiArIHQuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgc2V0IG9mIG1haWwgbWVzc2FnZS4KKyAgICAgKiBXaWxsIGJlIGlnbm9yZWQgaWYgbWltZVR5cGUgY29udGFpbnMgLi4uLjsgQ2hhcnNldD0uLi4gc3Vic3RyaW5nIG9yCisgICAgICogZW5jb2RpbmcgaXMgbm90IGEgPGNvZGU+bWltZTwvY29kZT4uCisgICAgICogQHBhcmFtIGNoYXJzZXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyc2V0KFN0cmluZyBjaGFyc2V0KSB7CisgICAgICAgIHRoaXMuY2hhcnNldCA9IGNoYXJzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIHNldCBvZiBtYWlsIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENoYXJzZXQgb2YgbWFpbCBtZXNzYWdlLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgeworICAgICAgICByZXR1cm4gY2hhcnNldDsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvSGVhZGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9IZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YmNmYjY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvSGVhZGVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsOworCisvKioKKyAqIENsYXNzIHJlcHJlc2VudGluZyBhIGdlbmVyaWMgZS1tYWlsIGhlYWRlci4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBIZWFkZXIgeworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhpcyBIZWFkZXIuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBIZWFkZXIuCisgICAgICogQHJldHVybiBuYW1lIGFzIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhpcyBIZWFkZXIuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoaXMgSGVhZGVyLgorICAgICAqIEByZXR1cm4gdmFsdWUgYXMgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01haWxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWFpbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlhNjQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01haWxlci5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRGF0ZVV0aWxzOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHRoZSB2YXJpb3VzIGVtYWlsaW5nIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFpbGVyIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgcHJvdGVjdGVkIGludCBwb3J0ID0gLTE7CisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKyAgICAvLyBDaGVja1N0eWxlOk1lbWJlck5hbWVDaGVjayBPRkYgLSBiYworICAgIHByb3RlY3RlZCBib29sZWFuIFNTTCA9IGZhbHNlOworICAgIC8vIENoZWNrU3R5bGU6TWVtYmVyTmFtZUNoZWNrIE9OCisgICAgcHJvdGVjdGVkIE1lc3NhZ2UgbWVzc2FnZTsKKyAgICBwcm90ZWN0ZWQgRW1haWxBZGRyZXNzIGZyb207CisgICAgcHJvdGVjdGVkIFZlY3RvciByZXBseVRvTGlzdCA9IG51bGw7CisgICAgcHJvdGVjdGVkIFZlY3RvciB0b0xpc3QgPSBudWxsOworICAgIHByb3RlY3RlZCBWZWN0b3IgY2NMaXN0ID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGJjY0xpc3QgPSBudWxsOworICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXMgPSBudWxsOworICAgIHByb3RlY3RlZCBTdHJpbmcgc3ViamVjdCA9IG51bGw7CisgICAgcHJvdGVjdGVkIFRhc2sgdGFzazsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlRmlsZU5hbWVzID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIFZlY3RvciBoZWFkZXJzID0gbnVsbDsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYWlsIHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0IHRoZSBtYWlsIHNlcnZlciBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNtdHAgcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0IHRoZSBTTVRQIHBvcnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciBmb3Igc210cCBhdXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXIgdGhlIHVzZXJuYW1lLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgdXNlcikgeworICAgICAgICB0aGlzLnVzZXIgPSB1c2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFzc3dvcmQgZm9yIHNtdHAgYXV0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgYXV0aGVudGljYXRpb24gcGFzc3dvcmQuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIHNlbmQgdGhlIG1haWwgdGhyb3VnaCBTU0wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3NsIGlmIHRydWUgdXNlIFNTTCB0cmFuc3BvcnQuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTU0woYm9vbGVhbiBzc2wpIHsKKyAgICAgICAgdGhpcy5TU0wgPSBzc2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG0gdGhlIG1lc3NhZ2UgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKE1lc3NhZ2UgbSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRkcmVzcyB0byBzZW5kIGZyb20uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbSB0aGUgc2VuZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb20oRW1haWxBZGRyZXNzIGZyb20pIHsKKyAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcGx5dG8gYWRkcmVzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3QgYSB2ZWN0b3Igb2YgcmVwbG95VG8gYWRkcmVzc2VzLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwbHlUb0xpc3QoVmVjdG9yIGxpc3QpIHsKKyAgICAgICAgdGhpcy5yZXBseVRvTGlzdCA9IGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0byBhZGRyZXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdCBhIHZlY3RvciBvZiByZWNpcGllbnQgYWRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvTGlzdChWZWN0b3IgbGlzdCkgeworICAgICAgICB0aGlzLnRvTGlzdCA9IGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYyBhZGRyZXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdCBhIHZlY3RvciBvZiBjYyBhZGRyZXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2NMaXN0KFZlY3RvciBsaXN0KSB7CisgICAgICAgIHRoaXMuY2NMaXN0ID0gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJjYyBhZGRyZXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdCBhIHZlY3RvciBvZiB0aGUgYmNjIGFkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCY2NMaXN0KFZlY3RvciBsaXN0KSB7CisgICAgICAgIHRoaXMuYmNjTGlzdCA9IGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmaWxlcyB0byBhdHRhY2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZXMgbGlzdCBvZiBmaWxlcyB0byBhdHRhY2ggdG8gdGhlIGVtYWlsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVzKFZlY3RvciBmaWxlcykgeworICAgICAgICB0aGlzLmZpbGVzID0gZmlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWJqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHN1YmplY3QgdGhlIHN1YmplY3QgbGluZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJqZWN0KFN0cmluZyBzdWJqZWN0KSB7CisgICAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvd25pbmcgdGFzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrIHRoZSBvd25pbmcgdGFzayBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXNrKFRhc2sgdGFzaykgeworICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgZmlsZW5hbWVzIHNob3VsZCBiZSBsaXN0ZWQgaW4gdGhlIGJvZHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBpZiB0cnVlIGxpc3QgYXR0YWNoZWQgZmlsZSBuYW1lcyBpbiB0aGUgYm9keSBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVGaWxlTmFtZXMoYm9vbGVhbiBiKSB7CisgICAgICAgIHRoaXMuaW5jbHVkZUZpbGVOYW1lcyA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnZW5lcmljIGhlYWRlcnMgdG8gYWRkIHRvIHRoZSBlbWFpbC4KKyAgICAgKiBAcGFyYW0gdiBhIFZlY3RvciBwcmVzdW1lZCB0byBjb250YWluIEhlYWRlciBvYmplY3RzLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVhZGVycyhWZWN0b3IgdikgeworICAgICAgICB0aGlzLmhlYWRlcnMgPSB2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIGVtYWlsLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZW1haWwgY2FuJ3QgYmUgc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kKCkKKyAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBEYXRlIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBhIFNNVFAgZGF0ZQorICAgICAqIGhlYWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBpbiBTTVRQIHN1aXRhYmxlIGZvcm1hdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXREYXRlKCkgeworICAgICAgICByZXR1cm4gRGF0ZVV0aWxzLmdldERhdGVGb3JIZWFkZXIoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01lc3NhZ2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTEzODdiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKKworLyoqCisgKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZW1haWwgbWVzc2FnZS4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZSBleHRlbmRzIFByb2plY3RDb21wb25lbnQgeworICAgIHByaXZhdGUgRmlsZSBtZXNzYWdlU291cmNlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWltZVR5cGUgPSAidGV4dC9wbGFpbiI7CisgICAgcHJpdmF0ZSBib29sZWFuIHNwZWNpZmllZCA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIGNoYXJzZXQgPSBudWxsOworCisgICAgLyoqIENyZWF0ZXMgYSBuZXcgZW1wdHkgbWVzc2FnZSAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZSgpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlKFN0cmluZyB0ZXh0KSB7CisgICAgICAgIGFkZFRleHQodGV4dCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2UgdXNpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIHNvdXJjZSBvZiB0aGUgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlKEZpbGUgZmlsZSkgeworICAgICAgICBtZXNzYWdlU291cmNlID0gZmlsZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZHMgYSB0ZXh0dWFsIHBhcnQgb2YgdGhlIG1lc3NhZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHNvbWUgdGV4dCB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQodGV4dCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzb3VyY2UgZmlsZSBvZiB0aGUgbWVzc2FnZQorICAgICAqCisgICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIG9mIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgc3JjKSB7CisgICAgICAgIHRoaXMubWVzc2FnZVNvdXJjZSA9IHNyYzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbnRlbnQgdHlwZSBmb3IgdGhlIG1lc3NhZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBhIG1pbWUgdHlwZSBlLmcuICJ0ZXh0L3BsYWluIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgeworICAgICAgICB0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7CisgICAgICAgIHNwZWNpZmllZCA9IHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1pbWUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtaW1lVHlwZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgbWVzc2FnZSBvbnRvIGFuIG91dHB1dCBzdHJlYW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcyBUaGUgcHJpbnQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChQcmludFN0cmVhbSBwcykKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFdlIG5lZWQgY2hhcmFjdGVyIGVuY29kaW5nIGF3YXJlIHByaW50aW5nIGhlcmUuCisgICAgICAgIC8vIFNvLCB1c2luZyBQcmludFdyaXRlciBvdmVyIE91dHB1dFN0cmVhbVdyaXRlciBpbnN0ZWFkIG9mIFByaW50U3RyZWFtCisgICAgICAgIFByaW50V3JpdGVyIG91dAorICAgICAgICAgICAgPSBjaGFyc2V0ICE9IG51bGwgPyBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihwcywgY2hhcnNldCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBQcmludFdyaXRlcihwcyk7CisgICAgICAgIGlmIChtZXNzYWdlU291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFJlYWQgbWVzc2FnZSBmcm9tIGEgZmlsZQorICAgICAgICAgICAgRmlsZVJlYWRlciBmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIobWVzc2FnZVNvdXJjZSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKGxpbmUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGZyZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcyhidWZmZXIuc3Vic3RyaW5nKDApKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1pbWVUeXBlIGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gdXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNaW1lVHlwZVNwZWNpZmllZCgpIHsKKyAgICAgICAgcmV0dXJuIHNwZWNpZmllZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgc2V0IG9mIG1haWwgbWVzc2FnZS4KKyAgICAgKiBXaWxsIGJlIGlnbm9yZWQgaWYgbWltZVR5cGUgY29udGFpbnMgLi4uLjsgQ2hhcnNldD0uLi4gc3Vic3RyaW5nLgorICAgICAqIEBwYXJhbSBjaGFyc2V0IHRoZSBjaGFyYWN0ZXIgc2V0IG5hbWUuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyc2V0KFN0cmluZyBjaGFyc2V0KSB7CisgICAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OworICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjaGFyc2V0IG9mIG1haWwgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ2hhcnNldCBvZiBtYWlsIG1lc3NhZ2UuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKSB7CisgICAgICByZXR1cm4gY2hhcnNldDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01pbWVNYWlsZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01pbWVNYWlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmMxNWRhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWltZU1haWxlci5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOworaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7CisKK2ltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2U7CitpbXBvcnQgamF2YXgubWFpbC5TZXNzaW9uOworaW1wb3J0IGphdmF4Lm1haWwuVHJhbnNwb3J0OworaW1wb3J0IGphdmF4Lm1haWwuQXV0aGVudGljYXRvcjsKK2ltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYWlsLlBhc3N3b3JkQXV0aGVudGljYXRpb247CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTWVzc2FnZTsKK2ltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVCb2R5UGFydDsKK2ltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVNdWx0aXBhcnQ7CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5JbnRlcm5ldEFkZHJlc3M7CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5BZGRyZXNzRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogVXNlcyB0aGUgSmF2YU1haWwgY2xhc3NlcyB0byBzZW5kIE1pbWUgZm9ybWF0IGVtYWlsLgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBNaW1lTWFpbGVyIGV4dGVuZHMgTWFpbGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NMX0ZBQ1RPUlkgPSAiamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5IjsKKworICAgIC8qKiBEZWZhdWx0IGNoYXJhY3RlciBzZXQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DSEFSU0VUCisgICAgICAgID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7CisKKyAgICAvLyBUbyB3b3JrIHByb3Blcmx5IHdpdGggbmF0aW9uYWwgY2hhcnNldHMgd2UgaGF2ZSB0byB1c2UKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlCisgICAgLyoqCisgICAgICogU3RyaW5nIGRhdGEgc291cmNlIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgY2xhc3MgU3RyaW5nRGF0YVNvdXJjZSBpbXBsZW1lbnRzIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOworICAgICAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2hhcnNldCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDsKKworICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCAmJiBvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm8gZGF0YSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWRPdXQgPSBvdXQudG9TdHJpbmcoY2hhcnNldCk7CisgICAgICAgICAgICAgICAgZGF0YSA9IChkYXRhICE9IG51bGwpID8gZGF0YS5jb25jYXQoZW5jb2RlZE91dCkgOiBlbmNvZGVkT3V0OworICAgICAgICAgICAgICAgIG91dCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEuZ2V0Qnl0ZXMoY2hhcnNldCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgb3V0ID0gKG91dCA9PSBudWxsKSA/IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSA6IG91dDsKKyAgICAgICAgICAgIHJldHVybiBvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5pbmRleE9mKCJjaGFyc2V0IikgPiAwCisgICAgICAgICAgICAgICAgJiYgdHlwZS5zdGFydHNXaXRoKCJ0ZXh0LyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNdXN0IGJlIGxpa2UgInRleHQvcGxhaW47IGNoYXJzZXQ9d2luZG93cy0xMjUxIgorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIodHlwZSAhPSBudWxsID8gdHlwZSA6ICJ0ZXh0L3BsYWluIikuYXBwZW5kKAorICAgICAgICAgICAgICAgICI7IGNoYXJzZXQ9IikuYXBwZW5kKGNoYXJzZXQpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIlN0cmluZ0RhdGFTb3VyY2UiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hhcnNldChTdHJpbmcgY2hhcnNldCkgeworICAgICAgICAgICAgdGhpcy5jaGFyc2V0ID0gY2hhcnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGFyc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgZW1haWwuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBlbWFpbCBjYW4ndCBiZSBzZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKworICAgICAgICAgICAgcHJvcHMucHV0KCJtYWlsLnNtdHAuaG9zdCIsIGhvc3QpOworICAgICAgICAgICAgcHJvcHMucHV0KCJtYWlsLnNtdHAucG9ydCIsIFN0cmluZy52YWx1ZU9mKHBvcnQpKTsKKworICAgICAgICAgICAgLy8gQXNpZGUsIHRoZSBKREsgaXMgY2xlYXJseSB1bmF3YXJlIG9mIHRoZSBTY290dGlzaAorICAgICAgICAgICAgLy8gJ3Nlc3Npb24nLCB3aGljaCBpbnZvbHZlcyBleGNlc3NpdmUgcXVhbnRpdGllcyBvZgorICAgICAgICAgICAgLy8gYWxjb2hvbCA6LSkKKyAgICAgICAgICAgIFNlc3Npb24gc2VzaDsKKyAgICAgICAgICAgIEF1dGhlbnRpY2F0b3IgYXV0aDsKKyAgICAgICAgICAgIGlmIChTU0wpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQcm92aWRlciBwID0gKFByb3ZpZGVyKSBDbGFzcy5mb3JOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5zdW4ubmV0LnNzbC5pbnRlcm5hbC5zc2wuUHJvdmlkZXIiKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBTZWN1cml0eS5hZGRQcm92aWRlcihwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBpbnN0YW50aWF0ZSBzc2wgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAic2VjdXJpdHkgcHJvdmlkZXIsIGNoZWNrIHRoYXQgeW91IGhhdmUgSlNTRSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJ5b3VyIGNsYXNzcGF0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBTTVRQIHByb3ZpZGVyCisgICAgICAgICAgICAgICAgcHJvcHMucHV0KCJtYWlsLnNtdHAuc29ja2V0RmFjdG9yeS5jbGFzcyIsIFNTTF9GQUNUT1JZKTsKKyAgICAgICAgICAgICAgICBwcm9wcy5wdXQoIm1haWwuc210cC5zb2NrZXRGYWN0b3J5LmZhbGxiYWNrIiwgImZhbHNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXNlciA9PSBudWxsICYmIHBhc3N3b3JkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNoID0gU2Vzc2lvbi5nZXREZWZhdWx0SW5zdGFuY2UocHJvcHMsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9wcy5wdXQoIm1haWwuc210cC5hdXRoIiwgInRydWUiKTsKKyAgICAgICAgICAgICAgICBhdXRoID0gbmV3IFNpbXBsZUF1dGhlbnRpY2F0b3IodXNlciwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgIHNlc2ggPSBTZXNzaW9uLmdldEluc3RhbmNlKHByb3BzLCBhdXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vY3JlYXRlIHRoZSBtZXNzYWdlCisgICAgICAgICAgICBNaW1lTWVzc2FnZSBtc2cgPSBuZXcgTWltZU1lc3NhZ2Uoc2VzaCk7CisgICAgICAgICAgICBNaW1lTXVsdGlwYXJ0IGF0dGFjaG1lbnRzID0gbmV3IE1pbWVNdWx0aXBhcnQoKTsKKworICAgICAgICAgICAgLy9zZXQgdGhlIHNlbmRlcgorICAgICAgICAgICAgaWYgKGZyb20uZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtc2cuc2V0RnJvbShuZXcgSW50ZXJuZXRBZGRyZXNzKGZyb20uZ2V0QWRkcmVzcygpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1zZy5zZXRGcm9tKG5ldyBJbnRlcm5ldEFkZHJlc3MoZnJvbS5nZXRBZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgIGZyb20uZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzZXQgdGhlIHJlcGx5IHRvIGFkZHJlc3NlcworICAgICAgICAgICAgbXNnLnNldFJlcGx5VG8oaW50ZXJuZXRBZGRyZXNzZXMocmVwbHlUb0xpc3QpKTsKKyAgICAgICAgICAgIG1zZy5zZXRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZS5UTywKKyAgICAgICAgICAgICAgICBpbnRlcm5ldEFkZHJlc3Nlcyh0b0xpc3QpKTsKKyAgICAgICAgICAgIG1zZy5zZXRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZS5DQywKKyAgICAgICAgICAgICAgICBpbnRlcm5ldEFkZHJlc3NlcyhjY0xpc3QpKTsKKyAgICAgICAgICAgIG1zZy5zZXRSZWNpcGllbnRzKE1lc3NhZ2UuUmVjaXBpZW50VHlwZS5CQ0MsCisgICAgICAgICAgICAgICAgaW50ZXJuZXRBZGRyZXNzZXMoYmNjTGlzdCkpOworCisgICAgICAgICAgICAvLyBDaG9vc2luZyBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBtYWlsIG1lc3NhZ2UKKyAgICAgICAgICAgIC8vIEZpcnN0OiBsb29raW5nIGl0IGZyb20gTWltZVR5cGUKKyAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0ID0gcGFyc2VDaGFyU2V0RnJvbU1pbWVUeXBlKG1lc3NhZ2UuZ2V0TWltZVR5cGUoKSk7CisgICAgICAgICAgICBpZiAoY2hhcnNldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQXNzaWduL3JlYXNzaWduIG1lc3NhZ2UgY2hhcnNldCBmcm9tIE1pbWVUeXBlCisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRDaGFyc2V0KGNoYXJzZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBOZXh0OiBsb29raW5nIGlmIGNoYXJzZXQgaGF2aW5nIGV4cGxpY2l0IGRlZmluaXRpb24KKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gbWVzc2FnZS5nZXRDaGFyc2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBVc2luZyBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQ7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0Q2hhcnNldChjaGFyc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBVc2luZyBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UgcGFyYWRpZ20KKyAgICAgICAgICAgIFN0cmluZ0RhdGFTb3VyY2Ugc2RzID0gbmV3IFN0cmluZ0RhdGFTb3VyY2UoKTsKKyAgICAgICAgICAgIHNkcy5zZXRDb250ZW50VHlwZShtZXNzYWdlLmdldE1pbWVUeXBlKCkpOworICAgICAgICAgICAgc2RzLnNldENoYXJzZXQoY2hhcnNldCk7CisKKyAgICAgICAgICAgIGlmIChzdWJqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtc2cuc2V0U3ViamVjdChzdWJqZWN0LCBjaGFyc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy5hZGRIZWFkZXIoIkRhdGUiLCBnZXREYXRlKCkpOworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBoZWFkZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEhlYWRlciBoID0gKEhlYWRlcikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgbXNnLmFkZEhlYWRlcihoLmdldE5hbWUoKSwgaC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShzZHMuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgICAgbWVzc2FnZS5wcmludChvdXQpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgICAgIE1pbWVCb2R5UGFydCB0ZXh0Ym9keSA9IG5ldyBNaW1lQm9keVBhcnQoKTsKKyAgICAgICAgICAgIHRleHRib2R5LnNldERhdGFIYW5kbGVyKG5ldyBEYXRhSGFuZGxlcihzZHMpKTsKKyAgICAgICAgICAgIGF0dGFjaG1lbnRzLmFkZEJvZHlQYXJ0KHRleHRib2R5KTsKKworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGZpbGVzLmVsZW1lbnRzKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpIGUubmV4dEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydCBib2R5OworCisgICAgICAgICAgICAgICAgYm9keSA9IG5ldyBNaW1lQm9keVBhcnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkgfHwgIWZpbGUuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSBcIiIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJyZWFkYWJsZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRmlsZURhdGFTb3VyY2UgZmlsZURhdGEgPSBuZXcgRmlsZURhdGFTb3VyY2UoZmlsZSk7CisgICAgICAgICAgICAgICAgRGF0YUhhbmRsZXIgZmlsZURhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhKTsKKworICAgICAgICAgICAgICAgIGJvZHkuc2V0RGF0YUhhbmRsZXIoZmlsZURhdGFIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBib2R5LnNldEZpbGVOYW1lKGZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhdHRhY2htZW50cy5hZGRCb2R5UGFydChib2R5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy5zZXRDb250ZW50KGF0dGFjaG1lbnRzKTsKKyAgICAgICAgICAgIFRyYW5zcG9ydC5zZW5kKG1zZyk7CisgICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb2JsZW0gd2hpbGUgc2VuZGluZyBtaW1lIG1haWw6IiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvYmxlbSB3aGlsZSBzZW5kaW5nIG1pbWUgbWFpbDoiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEludGVybmV0QWRkcmVzc1tdIGludGVybmV0QWRkcmVzc2VzKFZlY3RvciBsaXN0KQorICAgICAgICB0aHJvd3MgQWRkcmVzc0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIEludGVybmV0QWRkcmVzc1tdIGFkZHJzID0gbmV3IEludGVybmV0QWRkcmVzc1tsaXN0LnNpemUoKV07CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBFbWFpbEFkZHJlc3MgYWRkciA9IChFbWFpbEFkZHJlc3MpIGxpc3QuZWxlbWVudEF0KGkpOworCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGFkZHIuZ2V0TmFtZSgpOworICAgICAgICAgICAgYWRkcnNbaV0gPSAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgID8gbmV3IEludGVybmV0QWRkcmVzcyhhZGRyLmdldEFkZHJlc3MoKSkKKyAgICAgICAgICAgICAgICA6IG5ldyBJbnRlcm5ldEFkZHJlc3MoYWRkci5nZXRBZGRyZXNzKCksIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRyczsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZUNoYXJTZXRGcm9tTWltZVR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaW50IHBvcyA9IHR5cGUuaW5kZXhPZigiY2hhcnNldCIpOworICAgICAgICBpZiAocG9zIDwgMCkgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIEFzc3VtaW5nIG1pbWUgdHlwZSBpbiBmb3JtICJ0ZXh0L1hYWFg7IGNoYXJzZXQ9WFhYWFhYIgorICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW4gPSBuZXcgU3RyaW5nVG9rZW5pemVyKHR5cGUuc3Vic3RyaW5nKHBvcyksICI9OyAiKTsKKyAgICAgICAgdG9rZW4ubmV4dFRva2VuKCk7IC8vIFNraXAgJ2NoYXJzZXQ9JworICAgICAgICByZXR1cm4gdG9rZW4ubmV4dFRva2VuKCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNpbXBsZUF1dGhlbnRpY2F0b3IgZXh0ZW5kcyBBdXRoZW50aWNhdG9yIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlciA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKyAgICAgICAgcHVibGljIFNpbXBsZUF1dGhlbnRpY2F0b3IoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICAgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBnZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKCkgeworCisgICAgICAgICAgICByZXR1cm4gbmV3IFBhc3N3b3JkQXV0aGVudGljYXRpb24odXNlciwgcGFzc3dvcmQpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9QbGFpbk1haWxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvUGxhaW5NYWlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDg1ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvUGxhaW5NYWlsZXIuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLm1haWwuTWFpbE1lc3NhZ2U7CisKKy8qKgorICogQ2xhc3MgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgZW1haWwgdGhyb3VnaCByYXcgcHJvdG9jb2wgbWV0aG9kcy4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitjbGFzcyBQbGFpbk1haWxlciBleHRlbmRzIE1haWxlciB7CisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIGVtYWlsIHVzaW5nIHRoZSBhcGFjaGUgTWFpbE1lc3NhZ2UgY2xhc3MuCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYWlsTWVzc2FnZSBtYWlsTWVzc2FnZSA9IG5ldyBNYWlsTWVzc2FnZShob3N0LCBwb3J0KTsKKworICAgICAgICAgICAgbWFpbE1lc3NhZ2UuZnJvbShmcm9tLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlOworCisgICAgICAgICAgICBlID0gcmVwbHlUb0xpc3QuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgbWFpbE1lc3NhZ2UucmVwbHl0byhlLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlID0gdG9MaXN0LmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIG1haWxNZXNzYWdlLnRvKGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGUgPSBjY0xpc3QuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgbWFpbE1lc3NhZ2UuY2MoZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZSA9IGJjY0xpc3QuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgbWFpbE1lc3NhZ2UuYmNjKGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWJqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtYWlsTWVzc2FnZS5zZXRTdWJqZWN0KHN1YmplY3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFpbE1lc3NhZ2Uuc2V0SGVhZGVyKCJEYXRlIiwgZ2V0RGF0ZSgpKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLmdldENoYXJzZXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWFpbE1lc3NhZ2Uuc2V0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBtZXNzYWdlLmdldE1pbWVUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOyBjaGFyc2V0PVwiIiArIG1lc3NhZ2UuZ2V0Q2hhcnNldCgpICsgIlwiIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1haWxNZXNzYWdlLnNldEhlYWRlcigiQ29udGVudC1UeXBlIiwgbWVzc2FnZS5nZXRNaW1lVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGUgPSBoZWFkZXJzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIEhlYWRlciBoID0gKEhlYWRlcikgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIG1haWxNZXNzYWdlLnNldEhlYWRlcihoLmdldE5hbWUoKSwgaC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByaW50U3RyZWFtIG91dCA9IG1haWxNZXNzYWdlLmdldFByaW50U3RyZWFtKCk7CisgICAgICAgICAgICBtZXNzYWdlLnByaW50KG91dCk7CisKKyAgICAgICAgICAgIGUgPSBmaWxlcy5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBhdHRhY2goKEZpbGUpIGUubmV4dEVsZW1lbnQoKSwgb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1haWxNZXNzYWdlLnNlbmRBbmRDbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSU8gZXJyb3Igc2VuZGluZyBtYWlsIiwgaW9lKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoZXMgYSBmaWxlIHRvIHRoaXMgZW1haWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGF0dGFjaGUKKyAgICAgKiBAcGFyYW0gb3V0IFRoZSBtZXNzYWdlIHN0cmVhbSB0byBhZGQgdG8KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGVycm9ycyBvY2N1cgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGF0dGFjaChGaWxlIGZpbGUsIFByaW50U3RyZWFtIG91dCkKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSBcIiIgKyBmaWxlLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICArICJcIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgIgorICAgICAgICAgICAgICAgICArICJyZWFkYWJsZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmNsdWRlRmlsZU5hbWVzKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGludCBmaWxlbmFtZWxlbmd0aCA9IGZpbGVuYW1lLmxlbmd0aCgpOworCisgICAgICAgICAgICBvdXQucHJpbnRsbihmaWxlbmFtZSk7CisgICAgICAgICAgICBmb3IgKGludCBzdGFyID0gMDsgc3RhciA8IGZpbGVuYW1lbGVuZ3RoOyBzdGFyKyspIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoJz0nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICBmaW5hbCBpbnQgbWF4QnVmID0gMTAyNDsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW21heEJ1Zl07CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaW5zdHIgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmluc3RyLCBidWYubGVuZ3RoKTsKKworICAgICAgICAgICAgd2hpbGUgKChsZW5ndGggPSBpbi5yZWFkKGJ1ZikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbnN0ci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9VVU1haWxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvVVVNYWlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGYxNmJjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvVVVNYWlsZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5VVUVuY29kZXI7CisKKy8qKgorICogQW4gZW1haWxlciB0aGF0IHV1ZW5jb2RlcyBhdHRhY2htZW50cy4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitjbGFzcyBVVU1haWxlciBleHRlbmRzIFBsYWluTWFpbGVyIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2goRmlsZSBmaWxlLCBQcmludFN0cmVhbSBvdXQpCisgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkgfHwgIWZpbGUuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZpbGUgXCIiICsgZmlsZS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgKyAiXCIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgKyAicmVhZGFibGUuIik7CisgICAgICAgIH0KKworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmluc3RyID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpbnN0cik7CisgICAgICAgICAgICBVVUVuY29kZXIgZW5jb2RlciA9IG5ldyBVVUVuY29kZXIoZmlsZS5nZXROYW1lKCkpOworCisgICAgICAgICAgICBlbmNvZGVyLmVuY29kZShpbiwgb3V0KTsKKworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmluc3RyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BTlRMUi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOGZjMTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BTlRMUi5qYXZhCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHVtcFN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lSmF2YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTG9hZGVyVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5UZWVPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogIEludm9rZXMgdGhlIEFOVExSIFRyYW5zbGF0b3IgZ2VuZXJhdG9yIG9uIGEgZ3JhbW1hciBmaWxlLgorICoKKyAqLworcHVibGljIGNsYXNzIEFOVExSIGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIENvbW1hbmRsaW5lSmF2YSBjb21tYW5kbGluZSA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsKKworICAgIC8qKiB0aGUgZmlsZSB0byBwcm9jZXNzICovCisgICAgcHJpdmF0ZSBGaWxlIHRhcmdldEZpbGU7CisKKyAgICAvKiogd2hlcmUgdG8gb3V0cHV0IHRoZSByZXN1bHQgKi8KKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OworCisgICAgLyoqIGFuIG9wdGlvbmFsIHN1cGVyIGdyYW1tYXIgZmlsZSAqLworICAgIHByaXZhdGUgRmlsZSBzdXBlckdyYW1tYXI7CisKKyAgICAvKiogb3B0aW9uYWwgZmxhZyB0byBlbmFibGUgaHRtbCBvdXRwdXQgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaHRtbDsKKworICAgIC8qKiBvcHRpb25hbCBmbGFnIHRvIHByaW50IG91dCBhIGRpYWdub3N0aWMgZmlsZSAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkaWFnbm9zdGljOworCisgICAgLyoqIG9wdGlvbmFsIGZsYWcgdG8gYWRkIHRyYWNlIG1ldGhvZHMgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdHJhY2U7CisKKyAgICAvKiogb3B0aW9uYWwgZmxhZyB0byBhZGQgdHJhY2UgbWV0aG9kcyB0byB0aGUgcGFyc2VyIG9ubHkgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdHJhY2VQYXJzZXI7CisKKyAgICAvKiogb3B0aW9uYWwgZmxhZyB0byBhZGQgdHJhY2UgbWV0aG9kcyB0byB0aGUgbGV4ZXIgb25seSAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0cmFjZUxleGVyOworCisgICAgLyoqIG9wdGlvbmFsIGZsYWcgdG8gYWRkIHRyYWNlIG1ldGhvZHMgdG8gdGhlIHRyZWUgd2Fsa2VyIG9ubHkgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdHJhY2VUcmVlV2Fsa2VyOworCisgICAgLyoqIHdvcmtpbmcgZGlyZWN0b3J5ICovCisgICAgcHJpdmF0ZSBGaWxlIHdvcmtpbmdkaXIgPSBudWxsOworCisgICAgLyoqIGNhcHR1cmVzIEFOVExSJ3Mgb3V0cHV0ICovCisgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgLyoqIFRoZSBkZWJ1ZyBhdHRyaWJ1dGUgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWc7CisKKworICAgIC8qKiBJbnN0YW5jZSBvZiBhIHV0aWxpdHkgY2xhc3MgdG8gdXNlIGZvciBmaWxlIG9wZXJhdGlvbnMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKiogQ29uc3RydWN0b3IgZm9yIEFOVExSIHRhc2suICovCisgICAgcHVibGljIEFOVExSKCkgeworICAgICAgICBjb21tYW5kbGluZS5zZXRWbShKYXZhRW52VXRpbHMuZ2V0SnJlRXhlY3V0YWJsZSgiamF2YSIpKTsKKyAgICAgICAgY29tbWFuZGxpbmUuc2V0Q2xhc3NuYW1lKCJhbnRsci5Ub29sIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLgorICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIGdyYW1lciBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KEZpbGUgdGFyZ2V0KSB7CisgICAgICAgIGxvZygiU2V0dGluZyB0YXJnZXQgdG86ICIgKyB0YXJnZXQudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIHRoaXMudGFyZ2V0RmlsZSA9IHRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8uCisgICAgICogQHBhcmFtIG91dHB1dERpcmVjdG9yeSB0aGUgb3V0cHV0IGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dGRpcmVjdG9yeShGaWxlIG91dHB1dERpcmVjdG9yeSkgeworICAgICAgICBsb2coIlNldHRpbmcgb3V0cHV0IGRpcmVjdG9yeSB0bzogIiArIG91dHB1dERpcmVjdG9yeS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBvcHRpb25hbCBzdXBlciBncmFtbWFyIGZpbGUuCisgICAgICogVXNlIHNldEdsaWIoRmlsZSBzdXBlckdyYW1tYXIpIGluc3RlYWQuCisgICAgICogQHBhcmFtIHN1cGVyR3JhbW1hciB0aGUgc3VwZXIgZ3JhbW1hciBmaWxlbmFtZQorICAgICAqIEBkZXByZWNhdGVkICBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2xpYihTdHJpbmcgc3VwZXJHcmFtbWFyKSB7CisgICAgICAgIFN0cmluZyBzZyA9IG51bGw7CisgICAgICAgIGlmIChPcy5pc0ZhbWlseSgiZG9zIikpIHsKKyAgICAgICAgICAgIHNnID0gc3VwZXJHcmFtbWFyLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNnID0gc3VwZXJHcmFtbWFyOworICAgICAgICB9CisgICAgICAgIHNldEdsaWIoRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBzZykpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIG9wdGlvbmFsIHN1cGVyIGdyYW1tYXIgZmlsZQorICAgICAqIEBwYXJhbSBzdXBlckdyYW1tYXIgdGhlIHN1cGVyIGdyYW1tYXIgZmlsZQorICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2xpYihGaWxlIHN1cGVyR3JhbW1hcikgeworICAgICAgICB0aGlzLnN1cGVyR3JhbW1hciA9IHN1cGVyR3JhbW1hcjsKKyAgICB9CisgICAgLyoqCisgICAgICogU2V0cyBhIGZsYWcgdG8gZW5hYmxlIFBhcnNlVmlldyBkZWJ1Z2dpbmcKKyAgICAgKiBAcGFyYW0gZW5hYmxlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGVuYWJsZSkgeworICAgICAgICB0aGlzLmRlYnVnID0gZW5hYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGVtaXQgaHRtbAorICAgICAqIEBwYXJhbSBlbmFibGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEh0bWwoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgaHRtbCA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZmxhZyB0byBlbWl0IGRpYWdub3N0aWMgdGV4dAorICAgICAqIEBwYXJhbSBlbmFibGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpYWdub3N0aWMoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgZGlhZ25vc3RpYyA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBlbmFibGVzIGFsbCB0cmFjaW5nLgorICAgICAqIEBwYXJhbSBlbmFibGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYWNlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHRyYWNlID0gZW5hYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGVuYWJsZXMgcGFyc2VyIHRyYWNpbmcuCisgICAgICogQHBhcmFtIGVuYWJsZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhY2VQYXJzZXIoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgdHJhY2VQYXJzZXIgPSBlbmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZW5hYmxlcyBsZXhlciB0cmFjaW5nLgorICAgICAqIEBwYXJhbSBlbmFibGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYWNlTGV4ZXIoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgdHJhY2VMZXhlciA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZmxhZyB0byBhbGxvdyB0aGUgdXNlciB0byBlbmFibGUgdHJlZSB3YWxrZXIgdHJhY2luZworICAgICAqIEBwYXJhbSBlbmFibGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYWNlVHJlZVdhbGtlcihib29sZWFuIGVuYWJsZSkgeworICAgICAgICB0cmFjZVRyZWVXYWxrZXIgPSBlbmFibGU7CisgICAgfQorCisgICAgLy8gd2UgYXJlIGZvcmNlZCB0byBmb3JrIEFOVExSIHNpbmNlIHRoZXJlIGlzIGEgY2FsbAorICAgIC8vIHRvIFN5c3RlbS5leGl0KCkgYW5kIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvCisgICAgLy8gcmlnaHQgbm93IHRvIGF2b2lkIHRoaXMuIDotKCAoU0JhKQorICAgIC8vIEknbSBub3QgcmVtb3ZpbmcgdGhpcyBtZXRob2QgdG8ga2VlcCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgLyoqCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqIEBwYXJhbSBzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JrKGJvb2xlYW4gcykgeworICAgICAgICAvL3RoaXMuZm9yayA9IHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwcm9jZXNzCisgICAgICogQHBhcmFtIGQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgZCkgeworICAgICAgICB0aGlzLndvcmtpbmdkaXIgPSBkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjbGFzc3BhdGggdG8gYmUgc2V0CisgICAgICogYmVjYXVzZSBhIGRpcmVjdG9yeSBtaWdodCBiZSBnaXZlbiBmb3IgQW50bHIgZGVidWcuCisgICAgICogQHJldHVybiBhIHBhdGggdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRsaW5lLmNyZWF0ZUNsYXNzcGF0aChnZXRQcm9qZWN0KCkpLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IEpWTSBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuICBjcmVhdGUgYSBuZXcgSlZNIGFyZ3VtZW50IHNvIHRoYXQgYW55IGFyZ3VtZW50IGNhbiBiZSBwYXNzZWQgdG8gdGhlIEpWTS4KKyAgICAgKiBAc2VlICNzZXRGb3JrKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUp2bWFyZygpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRsaW5lLmNyZWF0ZVZtQXJndW1lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBqYXJzIG9yIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgQW50bHIKKyAgICAgKiB0aGlzIHNob3VsZCBtYWtlIHRoZSBmb3JrZWQgSlZNIHdvcmsgd2l0aG91dCBoYXZpbmcgdG8KKyAgICAgKiBzcGVjaWZ5IGl0IGRpcmVjdGx5LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkQ2xhc3NwYXRoRW50cnkoIi9hbnRsci9BTlRMUkdyYW1tYXJQYXJzZUJlaGF2aW9yLmNsYXNzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZCB0aGUgZGlyZWN0b3J5IG9yIGFyY2hpdmUKKyAgICAgKiB0aGF0IGNvbnRhaW5zIGl0IHRvIHRoZSBjbGFzc3BhdGguCisgICAgICoKKyAgICAgKiA8cD5Eb2Vzbid0IHdvcmsgZm9yIGFyY2hpdmVzIGluIEpESyAxLjEgYXMgdGhlIFVSTCByZXR1cm5lZCBieQorICAgICAqIGdldFJlc291cmNlIGRvZXNuJ3QgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZS48L3A+CisgICAgICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBuYW1lIHRvIHNlYXJjaCBmb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDbGFzc3BhdGhFbnRyeShTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogcHJlIEFudCAxLjYgdGhpcyBtZXRob2QgdXNlZCB0byBjYWxsIGdldENsYXNzKCkuZ2V0UmVzb3VyY2UKKyAgICAgICAgICogd2hpbGUgQW50IDEuNiB3aWxsIGNhbGwgQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UoKS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBDbGFzcy5nZXRSZXNvdXJjZSBleHBlY3RzIGEgbGVhZGluZworICAgICAgICAgKiBzbGFzaCBmb3IgImFic29sdXRlIiByZXNvdXJjZXMgYW5kIHdpbGwgc3RyaXAgaXQgYmVmb3JlCisgICAgICAgICAqIGRlbGVnYXRpbmcgdG8gQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UgLSBzbyB3ZSBub3cgaGF2ZSB0bworICAgICAgICAgKiBlbXVsYXRlIENsYXNzJ3MgYmVoYXZpb3IuCisgICAgICAgICAqLworICAgICAgICBpZiAocmVzb3VyY2Uuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlLnN1YnN0cmluZygxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc291cmNlID0gIm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsLyIKKyAgICAgICAgICAgICAgICArIHJlc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBmID0gTG9hZGVyVXRpbHMuZ2V0UmVzb3VyY2VTb3VyY2UoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSk7CisgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiRm91bmQgIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldExvY2F0aW9uKGYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJDb3VsZG5cJ3QgZmluZCAiICsgcmVzb3VyY2UsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlcygpOworCisgICAgICAgIC8vVE9ETzogdXNlIEFOVExSIHRvIHBhcnNlIHRoZSBncmFtbWFyIGZpbGUgdG8gZG8gdGhpcy4KKyAgICAgICAgRmlsZSBnZW5lcmF0ZWRGaWxlID0gZ2V0R2VuZXJhdGVkRmlsZSgpOworICAgICAgICBib29sZWFuIHRhcmdldElzT3V0T2ZEYXRlID0KKyAgICAgICAgICAgIHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgPiBnZW5lcmF0ZWRGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICBib29sZWFuIHN1cGVyR3JhbW1hcklzT3V0T2ZEYXRlICA9IHN1cGVyR3JhbW1hciAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgKHN1cGVyR3JhbW1hci5sYXN0TW9kaWZpZWQoKSA+IGdlbmVyYXRlZEZpbGUubGFzdE1vZGlmaWVkKCkpOworICAgICAgICBpZiAodGFyZ2V0SXNPdXRPZkRhdGUgfHwgc3VwZXJHcmFtbWFySXNPdXRPZkRhdGUpIHsKKyAgICAgICAgICAgIGlmICh0YXJnZXRJc091dE9mRGF0ZSkgeworICAgICAgICAgICAgICAgIGxvZygiQ29tcGlsaW5nICIgKyB0YXJnZXRGaWxlICsgIiBhcyBpdCBpcyBuZXdlciB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZW5lcmF0ZWRGaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJDb21waWxpbmcgIiArIHRhcmdldEZpbGUgKyAiIGFzICIgKyBzdXBlckdyYW1tYXIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5ld2VyIHRoYW4gIiArIGdlbmVyYXRlZEZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9wdWxhdGVBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHRhcmdldEZpbGUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGxvZyhjb21tYW5kbGluZS5kZXNjcmliZUNvbW1hbmQoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBpbnQgZXJyID0gcnVuKGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBTlRMUiByZXR1cm5lZDogIiArIGVyciwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBib3MudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0LmluZGV4T2YoImVycm9yOiIpID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBTlRMUiBzaWduYWxlZCBhbiBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXQsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZygiU2tpcHBlZCBncmFtbWFyIGZpbGUuIEdlbmVyYXRlZCBmaWxlICIgKyBnZW5lcmF0ZWRGaWxlCisgICAgICAgICAgICAgICAgKyAiIGlzIG5ld2VyLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSByZWZhY3RvcmVkIG1ldGhvZCBmb3IgcG9wdWxhdGluZyBhbGwgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYmFzZWQKKyAgICAgKiBvbiB0aGUgdXNlci1zcGVjaWZpZWQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzKCkgeworICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbyIpOworICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKG91dHB1dERpcmVjdG9yeS50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKHN1cGVyR3JhbW1hciAhPSBudWxsKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZ2xpYiIpOworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShzdXBlckdyYW1tYXIudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGh0bWwpIHsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1odG1sIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpYWdub3N0aWMpIHsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kaWFnbm9zdGljIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWNlKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdHJhY2UiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhY2VQYXJzZXIpIHsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi10cmFjZVBhcnNlciIpOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFjZUxleGVyKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdHJhY2VMZXhlciIpOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFjZVRyZWVXYWxrZXIpIHsKKyAgICAgICAgICAgIGlmIChpczI3MigpKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXRyYWNlVHJlZVBhcnNlciIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdHJhY2VUcmVlV2Fsa2VyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZGVidWciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodGFyZ2V0RmlsZSA9PSBudWxsIHx8ICF0YXJnZXRGaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgdGFyZ2V0OiAiICsgdGFyZ2V0RmlsZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBubyBvdXRwdXQgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwgdXNlZCB0aGUgdGFyZ2V0J3MgZGlyZWN0b3J5CisgICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0T3V0cHV0ZGlyZWN0b3J5KG5ldyBGaWxlKHRhcmdldEZpbGUuZ2V0UGFyZW50KCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW91dHB1dERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgb3V0cHV0IGRpcmVjdG9yeTogIiArIG91dHB1dERpcmVjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGUgZ2V0R2VuZXJhdGVkRmlsZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBnZW5lcmF0ZWRGaWxlTmFtZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcih0YXJnZXRGaWxlKSk7CisgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXh0ZW5kc0luZGV4ID0gbGluZS5pbmRleE9mKCIgZXh0ZW5kcyAiKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJjbGFzcyAiKSAmJiBleHRlbmRzSW5kZXggPiAtMSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRGaWxlTmFtZSA9IGxpbmUuc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzICIubGVuZ3RoKCksIGV4dGVuZHNJbmRleCkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGdlbmVyYXRlZCBjbGFzcyIsIGUpOworICAgICAgICB9CisgICAgICAgIGlmIChnZW5lcmF0ZWRGaWxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBkZXRlcm1pbmUgZ2VuZXJhdGVkIGNsYXNzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeSwgZ2VuZXJhdGVkRmlsZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKGh0bWwgPyAiLmh0bWwiIDogIi5qYXZhIikpOworICAgIH0KKworICAgIC8qKiBleGVjdXRlIGluIGEgZm9ya2VkIFZNICovCisgICAgcHJpdmF0ZSBpbnQgcnVuKFN0cmluZ1tdIGNvbW1hbmQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFB1bXBTdHJlYW1IYW5kbGVyIHBzaCA9CisgICAgICAgICAgICBuZXcgUHVtcFN0cmVhbUhhbmRsZXIobmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19JTkZPKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGVlT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKHBzaCwgbnVsbCk7CisgICAgICAgIGV4ZS5zZXRBbnRSdW4oZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaWYgKHdvcmtpbmdkaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3Rvcnkod29ya2luZ2Rpcik7CisgICAgICAgIH0KKyAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNvbW1hbmQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGV4ZS5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShib3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgYW50bHIgdmVyc2lvbiBpcyAyLjcuMiAob3IgaGlnaGVyKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmVyc2lvbiBvZiBBbnRsciBwcmVzZW50IGlzIDIuNy4yIG9yIGxhdGVyLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXMyNzIoKSB7CisgICAgICAgIEFudENsYXNzTG9hZGVyIGwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbCA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjb21tYW5kbGluZS5nZXRDbGFzc3BhdGgoKSk7CisgICAgICAgICAgICBsLmxvYWRDbGFzcygiYW50bHIuVmVyc2lvbiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGwuY2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQ2FiLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9DYWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmZiMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQ2FiLmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuU3RyZWFtUHVtcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisKKy8qKgorICogQ3JlYXRlIGEgQ0FCIGFyY2hpdmUuCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBDYWIgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JFU1VMVCA9IC05OTsKKyAgICBwcml2YXRlIEZpbGUgY2FiRmlsZTsKKyAgICBwcml2YXRlIEZpbGUgYmFzZURpcjsKKyAgICBwcml2YXRlIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZG9Db21wcmVzcyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGRvVmVyYm9zZSA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIGNtZE9wdGlvbnM7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBTdHJpbmcgYXJjaGl2ZVR5cGUgPSAiY2FiIjsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZS9sb2NhdGlvbiBvZiB3aGVyZSB0byBjcmVhdGUgdGhlIC5jYWIgZmlsZS4KKyAgICAgKiBAcGFyYW0gY2FiRmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGNhYiBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhYmZpbGUoRmlsZSBjYWJGaWxlKSB7CisgICAgICAgIHRoaXMuY2FiRmlsZSA9IGNhYkZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzZSBkaXJlY3RvcnkgdG8gbG9vayBpbiBmb3IgZmlsZXMgdG8gQ0FCLgorICAgICAqIEBwYXJhbSBiYXNlRGlyIGJhc2UgZGlyZWN0b3J5IGZvciBmaWxlcyB0byBjYWIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFzZWRpcihGaWxlIGJhc2VEaXIpIHsKKyAgICAgICAgdGhpcy5iYXNlRGlyID0gYmFzZURpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBjb21wcmVzcyB0aGUgZmlsZXMgb3RoZXJ3aXNlIG9ubHkgc3RvcmUgdGhlbS4KKyAgICAgKiBAcGFyYW0gY29tcHJlc3MgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzcyhib29sZWFuIGNvbXByZXNzKSB7CisgICAgICAgIGRvQ29tcHJlc3MgPSBjb21wcmVzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBkaXNwbGF5IGNhYmFyYyBvdXRwdXQuCisgICAgICogQHBhcmFtIHZlcmJvc2UgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgeworICAgICAgICBkb1ZlcmJvc2UgPSB2ZXJib3NlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYWRkaXRpb25hbCBjYWJhcmMgb3B0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5LgorICAgICAqIEBwYXJhbSBvcHRpb25zIGNhYmFyYyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKFN0cmluZyBvcHRpb25zKSB7CisgICAgICAgIGNtZE9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgdG8gYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gc2V0IGEgc2V0IG9mIGZpbGVzIHRvIGFyY2hpdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBpZiAoZmlsZXNldHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBuZXN0ZWQgZmlsZXNldCBhbGxvd2VkIik7CisgICAgICAgIH0KKyAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOworICAgIH0KKworICAgIC8qCisgICAgICogSSdtIG5vdCBmb25kIG9mIHRoaXMgcGF0dGVybjogInN1Yi1tZXRob2QgZXhwZWN0ZWQgdG8gdGhyb3cKKyAgICAgKiB0YXNrLWNhbmNlbGxpbmcgZXhjZXB0aW9ucyIuICBJdCBmZWVscyB0b28gbXVjaCBsaWtlIHByb2dyYW1taW5nCisgICAgICogZm9yIHNpZGUtZWZmZWN0cyB0byBtZS4uLgorICAgICAqLworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgYXJlIGNvcnJlY3QuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoYmFzZURpciA9PSBudWxsICYmIGZpbGVzZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJhc2VkaXIgYXR0cmlidXRlIG9yIG9uZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibmVzdGVkIGZpbGVzZXQgaXMgcmVxdWlyZWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmFzZURpciAhPSBudWxsICYmICFiYXNlRGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJhc2VkaXIgZG9lcyBub3QgZXhpc3QhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhc2VEaXIgIT0gbnVsbCAmJiBmaWxlc2V0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkJvdGggYmFzZWRpciBhdHRyaWJ1dGUgYW5kIGEgbmVzdGVkIGZpbGVzZXQgaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FiRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNhYmZpbGUgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZXhlYyBkZWxlZ2F0ZS4gIFRoZSBkZWxlZ2F0ZSB0YXNrIGlzIHBvcHVsYXRlZCBzbyB0aGF0CisgICAgICogaXQgYXBwZWFycyBpbiB0aGUgbG9ncyB0byBiZSB0aGUgc2FtZSB0YXNrIGFzIHRoaXMgb25lLgorICAgICAqIEByZXR1cm4gdGhlIGRlbGVnYXRlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIEV4ZWNUYXNrIGNyZWF0ZUV4ZWMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBFeGVjVGFzayBleGVjID0gbmV3IEV4ZWNUYXNrKHRoaXMpOworICAgICAgICByZXR1cm4gZXhlYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHRhcmdldCBpcyB1cCB0byBkYXRlIHdpdGggcmVzcGVjdCB0byBpbnB1dCBmaWxlcy4KKyAgICAgKiBAcGFyYW0gZmlsZXMgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gY2hlY2suCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjYWIgZmlsZSBpcyBuZXdlciB0aGFuIGl0cyBkZXBlbmRlbnRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVXBUb0RhdGUoVmVjdG9yIGZpbGVzKSB7CisgICAgICAgIGJvb2xlYW4gdXBUb0RhdGUgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKSAmJiB1cFRvRGF0ZTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGZpbGVzLmVsZW1lbnRBdChpKS50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoYmFzZURpciwgZmlsZSkubGFzdE1vZGlmaWVkKCkKKyAgICAgICAgICAgICAgICAgICAgPiBjYWJGaWxlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICAgICAgdXBUb0RhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXBUb0RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxpc3QgZmlsZS4gIFRoaXMgdGVtcG9yYXJ5IGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIGFsbCBmaWxlcworICAgICAqIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjYWIsIG9uZSBmaWxlIHBlciBsaW5lLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgZXhwZWN0cyB0byBvbmx5IGJlIGNhbGxlZCBvbiBXaW5kb3dzIGFuZCB0aHVzCisgICAgICogcXVvdGVzIHRoZSBmaWxlIG5hbWVzLjwvcD4KKyAgICAgKiBAcGFyYW0gZmlsZXMgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gdXNlLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3QgZmlsZSBjcmVhdGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY3JlYXRlTGlzdEZpbGUoVmVjdG9yIGZpbGVzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGxpc3RGaWxlID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZSgiYW50IiwgIiIsIG51bGwsIHRydWUsIHRydWUpOworCisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShsaXN0RmlsZSkpOworCisgICAgICAgIGludCBzaXplID0gZmlsZXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oJ1wiJyArIGZpbGVzLmVsZW1lbnRBdChpKS50b1N0cmluZygpICsgJ1wiJyk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGxpc3RGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhbGwgZmlsZXMgZm91bmQgYnkgYSBkaXJlY3Rvcnkgc2Nhbm5lciB0byBhIHZlY3Rvci4KKyAgICAgKiBAcGFyYW0gZmlsZXMgdGhlIHZlY3RvciB0byBhcHBlbmQgdGhlIGZpbGVzIHRvLgorICAgICAqIEBwYXJhbSBkcyB0aGUgc2Nhbm5lciB0byBnZXQgdGhlIGZpbGVzIGZyb20uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kRmlsZXMoVmVjdG9yIGZpbGVzLCBEaXJlY3RvcnlTY2FubmVyIGRzKSB7CisgICAgICAgIFN0cmluZ1tdIGRzZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkc2ZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmaWxlcy5hZGRFbGVtZW50KGRzZmlsZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjYWIuICBGaWxlbmFtZXMKKyAgICAgKiBhcmUgZ2F0aGVyZWQgZnJvbSB0aGUgZmlsZXNldCBpZiBpdCBoYXMgYmVlbiBhZGRlZCwgb3RoZXJ3aXNlIGZyb20gdGhlCisgICAgICogdHJhZGl0aW9uYWwgaW5jbHVkZSBwYXJhbWV0ZXJzLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmlsZXMuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGdldEZpbGVMaXN0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGZpbGVzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGdldCBmaWxlcyBmcm9tIG9sZCBtZXRob2RzIC0gaW5jbHVkZXMgYW5kIG5lc3RlZCBpbmNsdWRlCisgICAgICAgICAgICBhcHBlbmRGaWxlcyhmaWxlcywgc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihiYXNlRGlyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdCgwKTsKKyAgICAgICAgICAgIGJhc2VEaXIgPSBmcy5nZXREaXIoKTsKKyAgICAgICAgICAgIGFwcGVuZEZpbGVzKGZpbGVzLCBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGV4ZWN1dGUgdGhpcyB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgY2hlY2tDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgVmVjdG9yIGZpbGVzID0gZ2V0RmlsZUxpc3QoKTsKKworICAgICAgICAvLyBxdWljayBleGl0IGlmIHRoZSB0YXJnZXQgaXMgdXAgdG8gZGF0ZQorICAgICAgICBpZiAoaXNVcFRvRGF0ZShmaWxlcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGxvZygiQnVpbGRpbmcgIiArIGFyY2hpdmVUeXBlICsgIjogIiArIGNhYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIGlmICghT3MuaXNGYW1pbHkoIndpbmRvd3MiKSkgeworICAgICAgICAgICAgbG9nKCJVc2luZyBsaXN0Y2FiL2xpYmNhYmluZXQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBmaWxlRW51bSA9IGZpbGVzLmVsZW1lbnRzKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChmaWxlRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChmaWxlRW51bS5uZXh0RWxlbWVudCgpKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIlxuIikuYXBwZW5kKGNhYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLmFwcGVuZCgiXG4iKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcm9jZXNzIHAgPSBFeGVjdXRlLmxhdW5jaChnZXRQcm9qZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsibGlzdGNhYiJ9LCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VEaXIgIT0gbnVsbCA/IGJhc2VEaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcC5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc3RyZWFtIHB1bXBlcnMgdG8gZm9yd2FyZCBsaXN0Y2FiJ3Mgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gdGhlIGxvZworICAgICAgICAgICAgICAgIC8vIG5vdGU6IGxpc3RjYWIgaXMgYW4gaW50ZXJhY3RpdmUgcHJvZ3JhbSwgYW5kIGlzc3VlcyBwcm9tcHRzIGZvciBldmVyeSBuZXcgbGluZS4KKyAgICAgICAgICAgICAgICAvLyAgICAgICBUaGVyZWZvcmUsIG1ha2UgaXQgc2hvdyBvbmx5IHdpdGggdmVyYm9zZSBsb2dnaW5nIHR1cm5lZCBvbi4KKyAgICAgICAgICAgICAgICBMb2dPdXRwdXRTdHJlYW0gb3V0TG9nID0gbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICBMb2dPdXRwdXRTdHJlYW0gZXJyTG9nID0gbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIFN0cmVhbVB1bXBlciAgICBvdXRQdW1wID0gbmV3IFN0cmVhbVB1bXBlcihwLmdldElucHV0U3RyZWFtKCksIG91dExvZyk7CisgICAgICAgICAgICAgICAgU3RyZWFtUHVtcGVyICAgIGVyclB1bXAgPSBuZXcgU3RyZWFtUHVtcGVyKHAuZ2V0RXJyb3JTdHJlYW0oKSwgZXJyTG9nKTsKKworICAgICAgICAgICAgICAgIC8vIFB1bXAgc3RyZWFtcyBhc3luY2hyb25vdXNseQorICAgICAgICAgICAgICAgIChuZXcgVGhyZWFkKG91dFB1bXApKS5zdGFydCgpOworICAgICAgICAgICAgICAgIChuZXcgVGhyZWFkKGVyclB1bXApKS5zdGFydCgpOworCisgICAgICAgICAgICAgICAgb3V0LndyaXRlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBBIHdpbGQgZGVmYXVsdCBmb3Igd2hlbiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkCisgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IERFRkFVTFRfUkVTVUxUOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZmluaXNoCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHAud2FpdEZvcigpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBlbmQgb2Ygb3V0cHV0IGFuZCBlcnJvciBzdHJlYW1zCisgICAgICAgICAgICAgICAgICAgIG91dFB1bXAud2FpdEZvcigpOworICAgICAgICAgICAgICAgICAgICBvdXRMb2cuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyUHVtcC53YWl0Rm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGVyckxvZy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiVGhyZWFkIGludGVycnVwdGVkOiAiICsgaWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEluZm9ybWF0aXZlIHN1bW1hcnkgbWVzc2FnZSBpbiBjYXNlIG9mIGVycm9ycworICAgICAgICAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiRXJyb3IgZXhlY3V0aW5nIGxpc3RjYWI7IGVycm9yIGNvZGU6ICIgKyByZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJQcm9ibGVtIGNyZWF0aW5nICIgKyBjYWJGaWxlICsgIiAiICsgZXguZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIGxpc3RGaWxlID0gY3JlYXRlTGlzdEZpbGUoZmlsZXMpOworICAgICAgICAgICAgICAgIEV4ZWNUYXNrIGV4ZWMgPSBjcmVhdGVFeGVjKCk7CisgICAgICAgICAgICAgICAgRmlsZSBvdXRGaWxlID0gbnVsbDsKKworICAgICAgICAgICAgICAgIC8vIGRpZSBpZiBjYWJhcmMgZmFpbHMKKyAgICAgICAgICAgICAgICBleGVjLnNldEZhaWxvbmVycm9yKHRydWUpOworICAgICAgICAgICAgICAgIGV4ZWMuc2V0RGlyKGJhc2VEaXIpOworCisgICAgICAgICAgICAgICAgaWYgKCFkb1ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0RmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoImFudCIsICIiLCBudWxsLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZXhlYy5zZXRPdXRwdXQob3V0RmlsZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXhlYy5zZXRFeGVjdXRhYmxlKCJjYWJhcmMiKTsKKyAgICAgICAgICAgICAgICBleGVjLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItciIpOworICAgICAgICAgICAgICAgIGV4ZWMuY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1wIik7CisKKyAgICAgICAgICAgICAgICBpZiAoIWRvQ29tcHJlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlYy5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLW0iKTsKKyAgICAgICAgICAgICAgICAgICAgZXhlYy5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgibm9uZSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjbWRPcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlYy5jcmVhdGVBcmcoKS5zZXRMaW5lKGNtZE9wdGlvbnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGV4ZWMuY3JlYXRlQXJnKCkuc2V0VmFsdWUoIm4iKTsKKyAgICAgICAgICAgICAgICBleGVjLmNyZWF0ZUFyZygpLnNldEZpbGUoY2FiRmlsZSk7CisgICAgICAgICAgICAgICAgZXhlYy5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiQCIgKyBsaXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgICAgICAgICBleGVjLmV4ZWN1dGUoKTsKKworICAgICAgICAgICAgICAgIGlmIChvdXRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0RmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsaXN0RmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUHJvYmxlbSBjcmVhdGluZyAiICsgY2FiRmlsZSArICIgIiArIGlvZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9FY2hvUHJvcGVydGllcy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvRWNob1Byb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDIxYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvRWNob1Byb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUHJvcGVydHlTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Db2xsZWN0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5ET01FbGVtZW50V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogIERpc3BsYXlzIGFsbCB0aGUgY3VycmVudCBwcm9wZXJ0aWVzIGluIHRoZSBidWlsZC4gVGhlIG91dHB1dCBjYW4gYmUgc2VudCB0bworICogIGEgZmlsZSBpZiBkZXNpcmVkLiA8UD4KKyAqCisgKiAgQXR0cmlidXRlICJkZXN0ZmlsZSIgZGVmaW5lcyBhIGZpbGUgdG8gc2VuZCB0aGUgcHJvcGVydGllcyB0by4gVGhpcyBjYW4gYmUKKyAqICBwcm9jZXNzZWQgYXMgYSBzdGFuZGFyZCBwcm9wZXJ0eSBmaWxlIGxhdGVyLiA8UD4KKyAqCisgKiAgQXR0cmlidXRlICJwcmVmaXgiIGRlZmluZXMgYSBwcmVmaXggd2hpY2ggaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHByb3BlcnRpZXMKKyAqICBvbmx5IHRob3NlIHByb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCB0aGlzIHByZWZpeCB3aWxsIGJlIGVjaG9lZC4gPFA+CisgKgorICogIEJ5IGRlZmF1bHQsIHRoZSAiZmFpbG9uZXJyb3IiIGF0dHJpYnV0ZSBpcyBlbmFibGVkLiBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKKyAqICB3cml0aW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGEgZmlsZSwgYW5kIHRoaXMgYXR0cmlidXRlIGlzIGVuYWJsZWQsIHRoZW4gYQorICogIEJ1aWxkRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBJZiBkaXNhYmxlZCwgdGhlbiBJTyBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZAorICogIGFzIGEgbG9nIHN0YXRlbWVudCwgYnV0IG5vIGVycm9yIHdpbGwgYmUgdGhyb3duLiA8UD4KKyAqCisgKiAgRXhhbXBsZXM6IDxwcmU+CisgKiAgJmx0O2VjaG9wcm9wZXJ0aWVzICAvJmd0OworICogPC9wcmU+IFJlcG9ydCB0aGUgY3VycmVudCBwcm9wZXJ0aWVzIHRvIHRoZSBsb2cuIDxQPgorICoKKyAqICA8cHJlPgorICogICZsdDtlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0ibXkucHJvcGVydGllcyIgLyZndDsKKyAqIDwvcHJlPiBSZXBvcnQgdGhlIGN1cnJlbnQgcHJvcGVydGllcyB0byB0aGUgZmlsZSAibXkucHJvcGVydGllcyIsIGFuZCB3aWxsCisgKiAgZmFpbCB0aGUgYnVpbGQgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQgb3Igd3JpdHRlbiB0by4gPFA+CisgKgorICogIDxwcmU+CisgKiAgJmx0O2VjaG9wcm9wZXJ0aWVzIGRlc3RmaWxlPSJteS5wcm9wZXJ0aWVzIiBmYWlsb25lcnJvcj0iZmFsc2UiCisgKiAgICAgIHByZWZpeD0iYW50IiAvJmd0OworICogPC9wcmU+IFJlcG9ydCBhbGwgcHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCAnYW50JyB0byB0aGUgZmlsZQorICogICJteS5wcm9wZXJ0aWVzIiwgYW5kIHdpbGwgbG9nIGEgbWVzc2FnZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvcgorICogIHdyaXR0ZW4gdG8sIGJ1dCB3aWxsIHN0aWxsIGFsbG93IHRoZSBidWlsZCB0byBjb250aW51ZS4KKyAqCisgKkBzaW5jZSAgICAgIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIEVjaG9Qcm9wZXJ0aWVzIGV4dGVuZHMgVGFzayB7CisKKyAgICAvKioKKyAgICAgKiB0aGUgcHJvcGVydGllcyBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTID0gInByb3BlcnRpZXMiOworCisgICAgLyoqCisgICAgICogdGhlIHByb3BlcnR5IGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZID0gInByb3BlcnR5IjsKKworICAgIC8qKgorICAgICAqIG5hbWUgYXR0cmlidXRlIGZvciBwcm9wZXJ0eSwgdGVzdGNhc2UgYW5kIHRlc3RzdWl0ZSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOworCisgICAgLyoqCisgICAgICogdmFsdWUgYXR0cmlidXRlIGZvciBwcm9wZXJ0eSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRSA9ICJ2YWx1ZSI7CisKKyAgICAvKioKKyAgICAgKiB0aGUgaW5wdXQgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgaW5GaWxlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqICBGaWxlIG9iamVjdCBwb2ludGluZyB0byB0aGUgb3V0cHV0IGZpbGUuIElmIHRoaXMgaXMgbnVsbCwgdGhlbgorICAgICAqICB3ZSBvdXRwdXQgdG8gdGhlIHByb2plY3QgbG9nLCBub3QgdG8gYSBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBkZXN0ZmlsZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiAgSWYgdGhpcyBpcyB0cnVlLCB0aGVuIGVycm9ycyBnZW5lcmF0ZWQgZHVyaW5nIGZpbGUgb3V0cHV0IHdpbGwgYmVjb21lCisgICAgICogIGJ1aWxkIGVycm9ycywgYW5kIGlmIGZhbHNlLCB0aGVuIHN1Y2ggZXJyb3JzIHdpbGwgYmUgbG9nZ2VkLCBidXQgbm90CisgICAgICogIHRocm93bi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmFpbG9uZXJyb3IgPSB0cnVlOworCisgICAgcHJpdmF0ZSBWZWN0b3IgcHJvcGVydHlTZXRzID0gbmV3IFZlY3RvcigpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0ID0gInRleHQiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4OworCisgICAgLyoqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZWdleDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGlucHV0IGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgdGhlIGlucHV0IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmNmaWxlKEZpbGUgZmlsZSkgeworICAgICAgICBpbkZpbGUgPSBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqICBTZXQgYSBmaWxlIHRvIHN0b3JlIHRoZSBwcm9wZXJ0eSBvdXRwdXQuICBJZiB0aGlzIGlzIG5ldmVyIHNwZWNpZmllZCwKKyAgICAgKiAgdGhlbiB0aGUgb3V0cHV0IHdpbGwgYmUgc2VudCB0byB0aGUgQW50IGxvZy4KKyAgICAgKgorICAgICAqQHBhcmFtIGRlc3RmaWxlIGZpbGUgdG8gc3RvcmUgdGhlIHByb3BlcnR5IG91dHB1dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RmaWxlKEZpbGUgZGVzdGZpbGUpIHsKKyAgICAgICAgdGhpcy5kZXN0ZmlsZSA9IGRlc3RmaWxlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlIHRhc2sgd2lsbCBmYWlsIGlmIGFuIGVycm9yIG9jY3VycyB3cml0aW5nIHRoZSBwcm9wZXJ0aWVzCisgICAgICogZmlsZSwgb3RoZXJ3aXNlIGVycm9ycyBhcmUganVzdCBsb2dnZWQuCisgICAgICoKKyAgICAgKkBwYXJhbSAgZmFpbG9uZXJyb3IgIDx0dD50cnVlPC90dD4gaWYgSU8gZXhjZXB0aW9ucyBhcmUgcmVwb3J0ZWQgYXMgYnVpbGQKKyAgICAgKiAgICAgIGV4Y2VwdGlvbnMsIG9yIDx0dD5mYWxzZTwvdHQ+IGlmIElPIGV4Y2VwdGlvbnMgYXJlIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbE9uRXJyb3IoYm9vbGVhbiBmYWlsb25lcnJvcikgeworICAgICAgICB0aGlzLmZhaWxvbmVycm9yID0gZmFpbG9uZXJyb3I7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgSWYgdGhlIHByZWZpeCBpcyBzZXQsIHRoZW4gb25seSBwcm9wZXJ0aWVzIHdoaWNoIHN0YXJ0IHdpdGggdGhpcworICAgICAqICBwcmVmaXggc3RyaW5nIHdpbGwgYmUgcmVjb3JkZWQuIElmIHJlZ2V4IGlzIG5vdCBzZXQgYW5kICBpZiB0aGlzCisgICAgICogIGlzIG5ldmVyIHNldCwgb3IgaXQgaXMgc2V0IHRvIGFuIGVtcHR5IHN0cmluZyBvciA8dHQ+bnVsbDwvdHQ+LAorICAgICAqICB0aGVuIGFsbCBwcm9wZXJ0aWVzIHdpbGwgYmUgcmVjb3JkZWQuIDxQPgorICAgICAqCisgICAgICogIEZvciBleGFtcGxlLCBpZiB0aGUgYXR0cmlidXRlIGlzIHNldCBhczoKKyAgICAgKiAgICA8UFJFPiZsdDtlY2hvcHJvcGVydGllcyAgcHJlZml4PSJhbnQuIiAvJmd0OzwvUFJFPgorICAgICAqICB0aGVuIHRoZSBwcm9wZXJ0eSAiYW50LmhvbWUiIHdpbGwgYmUgcmVjb3JkZWQsIGJ1dCAiYW50LWV4YW1wbGUiCisgICAgICogIHdpbGwgbm90LgorICAgICAqCisgICAgICogQHBhcmFtICBwcmVmaXggIFRoZSBuZXcgcHJlZml4IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgICAgIFByb3BlcnR5U2V0IHBzID0gbmV3IFByb3BlcnR5U2V0KCk7CisgICAgICAgICAgICBwcy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBwcy5hcHBlbmRQcmVmaXgocHJlZml4KTsKKyAgICAgICAgICAgIGFkZFByb3BlcnR5c2V0KHBzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBJZiB0aGUgcmVnZXggaXMgc2V0LCB0aGVuIG9ubHkgcHJvcGVydGllcyB3aG9zZSBuYW1lcyBtYXRjaCBpdAorICAgICAqICB3aWxsIGJlIHJlY29yZGVkLiAgSWYgcHJlZml4IGlzIG5vdCBzZXQgYW5kIGlmIHRoaXMgaXMgbmV2ZXIgc2V0LAorICAgICAqICBvciBpdCBpcyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIDx0dD5udWxsPC90dD4sIHRoZW4gYWxsCisgICAgICogIHByb3BlcnRpZXMgd2lsbCBiZSByZWNvcmRlZC48UD4KKyAgICAgKgorICAgICAqICBGb3IgZXhhbXBsZSwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgYXM6CisgICAgICogICAgPFBSRT4mbHQ7ZWNob3Byb3BlcnRpZXMgIHByZWZpeD0iLiphbnQuKiIgLyZndDs8L1BSRT4KKyAgICAgKiAgdGhlbiB0aGUgcHJvcGVydGllcyAiYW50LmhvbWUiIGFuZCAidXNlci52YXJpYW50IiB3aWxsIGJlIHJlY29yZGVkLAorICAgICAqICBidXQgImFudC1leGFtcGxlIiB3aWxsIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVnZXggIFRoZSBuZXcgcmVnZXggdmFsdWUKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVnZXgoU3RyaW5nIHJlZ2V4KSB7CisgICAgICAgIGlmIChyZWdleCAhPSBudWxsICYmIHJlZ2V4Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgIHRoaXMucmVnZXggPSByZWdleDsKKyAgICAgICAgICAgIFByb3BlcnR5U2V0IHBzID0gbmV3IFByb3BlcnR5U2V0KCk7CisgICAgICAgICAgICBwcy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBwcy5hcHBlbmRSZWdleChyZWdleCk7CisgICAgICAgICAgICBhZGRQcm9wZXJ0eXNldChwcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNldCBvZiBwcm9wZXJ0aWVzIHRvIHdyaXRlLgorICAgICAqIEBwYXJhbSBwcyB0aGUgcHJvcGVydHkgc2V0IHRvIHdyaXRlCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eXNldChQcm9wZXJ0eVNldCBwcykgeworICAgICAgICBwcm9wZXJ0eVNldHMuYWRkRWxlbWVudChwcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgZm9ybWF0IC0geG1sIG9yIHRleHQuCisgICAgICogQHBhcmFtIGVhIGFuIGVudW1lcmF0ZWQgPGNvZGU+Rm9ybWF0QXR0cmlidXRlPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdChGb3JtYXRBdHRyaWJ1dGUgZWEpIHsKKyAgICAgICAgZm9ybWF0ID0gZWEuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGVudW1lcmF0ZWQgdHlwZSBmb3IgdGhlIGZvcm1hdCBhdHRyaWJ1dGUuCisgICAgICogVGhlIHZhbHVlcyBhcmUgInhtbCIgYW5kICJ0ZXh0Ii4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1hdEF0dHJpYnV0ZSBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICBwcml2YXRlIFN0cmluZyBbXSBmb3JtYXRzID0gbmV3IFN0cmluZ1tdeyJ4bWwiLCAidGV4dCJ9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzKCkKKyAgICAgICAgICogQHJldHVybiBhY2NlcHRlZCB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZm9ybWF0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBSdW4gdGhlIHRhc2suCisgICAgICoKKyAgICAgKkBleGNlcHRpb24gIEJ1aWxkRXhjZXB0aW9uICB0cm91YmxlLCBwcm9iYWJseSBmaWxlIElPCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiByZWdleCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlBsZWFzZSBzcGVjaWZ5IGVpdGhlciBwcmVmaXgiCisgICAgICAgICAgICAgICAgICAgICsgIiBvciByZWdleCwgYnV0IG5vdCBib3RoIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgLy9jb3B5IHRoZSBwcm9wZXJ0aWVzIGZpbGUKKyAgICAgICAgSGFzaHRhYmxlIGFsbFByb3BzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgIC8qIGxvYWQgcHJvcGVydGllcyBmcm9tIGZpbGUgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2UKKyAgICAgICAgdXNlIEFudCdzIHByb3BlcnRpZXMgKi8KKyAgICAgICAgaWYgKGluRmlsZSA9PSBudWxsICYmIHByb3BlcnR5U2V0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gYWRkIGFudCBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhbGxQcm9wcy5wdXRBbGwoZ2V0UHJvamVjdCgpLmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoaW5GaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChpbkZpbGUuZXhpc3RzKCkgJiYgaW5GaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJzcmNmaWxlIGlzIGEgZGlyZWN0b3J5ISI7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5GaWxlLmV4aXN0cygpICYmICFpbkZpbGUuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQ2FuIG5vdCByZWFkIGZyb20gdGhlIHNwZWNpZmllZCBzcmNmaWxlISI7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5GaWxlKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKKyAgICAgICAgICAgICAgICBhbGxQcm9wcy5wdXRBbGwocHJvcHMpOworICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBmaWxlICIgKyBpbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBmbmZlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZWFkIGZpbGUgIiArIGluRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFbnVtZXJhdGlvbiBlID0gcHJvcGVydHlTZXRzLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBQcm9wZXJ0eVNldCBwcyA9IChQcm9wZXJ0eVNldCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgYWxsUHJvcHMucHV0QWxsKHBzLmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGRlc3RmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBzYXZlUHJvcGVydGllcyhhbGxQcm9wcywgb3MpOworICAgICAgICAgICAgICAgIGxvZyhvcy50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRlc3RmaWxlLmV4aXN0cygpICYmIGRlc3RmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiZGVzdGZpbGUgaXMgYSBkaXJlY3RvcnkhIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGRlc3RmaWxlLmV4aXN0cygpICYmICFkZXN0ZmlsZS5jYW5Xcml0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IHdyaXRlIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGZpbGUhIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhpcy5kZXN0ZmlsZSk7CisgICAgICAgICAgICAgICAgc2F2ZVByb3BlcnRpZXMoYWxsUHJvcHMsIG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBpZiAoZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKGlvZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vaWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgU2VuZCB0aGUga2V5L3ZhbHVlIHBhaXJzIGluIHRoZSBoYXNodGFibGUgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCisgICAgICogIE9ubHkgdGhvc2UgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgPHR0PnByZWZpeDwvdHQ+IGNvbnN0cmFpbnQgd2lsbCBiZQorICAgICAqICBzZW50IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqICBUaGUgb3V0cHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCB3aGVuIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGFsbFByb3BzICAgICAgICAgcHJvcGZpbGUgdG8gc2F2ZQorICAgICAqIEBwYXJhbSAgb3MgICAgICAgICAgICAgICBvdXRwdXQgc3RyZWFtCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgIG9uIG91dHB1dCBlcnJvcnMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uICAgb24gb3RoZXIgZXJyb3JzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2F2ZVByb3BlcnRpZXMoSGFzaHRhYmxlIGFsbFByb3BzLCBPdXRwdXRTdHJlYW0gb3MpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBMaXN0IGtleUxpc3QgPSBuZXcgQXJyYXlMaXN0KGFsbFByb3BzLmtleVNldCgpKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChrZXlMaXN0KTsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTA5MDkzNjQ0MjMwOTIwMTY1NEw7CisgICAgICAgICAgICBwdWJsaWMgRW51bWVyYXRpb24ga2V5cygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvblV0aWxzLmFzRW51bWVyYXRpb24oa2V5TGlzdC5pdGVyYXRvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7CisgICAgICAgICAgICAgICAgU2V0IHJlc3VsdCA9IHN1cGVyLmVudHJ5U2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0thZmZlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVHJlZVNldCB0ID0gbmV3IFRyZWVTZXQobmV3IENvbXBhcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5MSA9IChTdHJpbmcpICgoTWFwLkVudHJ5KSBvMSkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleTIgPSAoU3RyaW5nKSAoKE1hcC5FbnRyeSkgbzIpLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkxLmNvbXBhcmVUbyhrZXkyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIHQuYWRkQWxsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5TGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBrZXlMaXN0LmdldChpKS50b1N0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYWxsUHJvcHMuZ2V0KG5hbWUpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJ0ZXh0Ii5lcXVhbHMoZm9ybWF0KSkgeworICAgICAgICAgICAgamRrU2F2ZVByb3BlcnRpZXMocHJvcHMsIG9zLCAiQW50IHByb3BlcnRpZXMiKTsKKyAgICAgICAgfSBlbHNlIGlmICgieG1sIi5lcXVhbHMoZm9ybWF0KSkgeworICAgICAgICAgICAgeG1sU2F2ZVByb3BlcnRpZXMocHJvcHMsIG9zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGEgdHVwbGUgZm9yIHRoZSBzb3J0IGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVHVwbGUgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcga2V5OworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwcml2YXRlIFR1cGxlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGFyZXMgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBmb3Igb3JkZXIuCisgICAgICAgICAqIEBwYXJhbSBvIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMKKyAgICAgICAgICogICAgICAgICBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCisgICAgICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0J3MgdHlwZSBwcmV2ZW50cyBpdAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGJlaW5nIGNvbXBhcmVkIHRvIHRoaXMgT2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIFR1cGxlIHRoYXQgPSAoVHVwbGUpIG87CisgICAgICAgICAgICByZXR1cm4ga2V5LmNvbXBhcmVUbyh0aGF0LmtleSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Qgc29ydFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wcykgeworICAgICAgICAvL3NvcnQgdGhlIGxpc3QuIE1ha2VzIFNDTSBhbmQgbWFudWFsIGRpZmZzIGVhc2llci4KKyAgICAgICAgTGlzdCBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0KHByb3BzLnNpemUoKSk7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHNvcnRlZC5hZGQobmV3IFR1cGxlKG5hbWUsIHByb3BzLmdldFByb3BlcnR5KG5hbWUpKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQpOworICAgICAgICByZXR1cm4gc29ydGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE91dHB1dCB0aGUgcHJvcGVydGllcyBhcyB4bWwgb3V0cHV0LgorICAgICAqIEBwYXJhbSBwcm9wcyB0aGUgcHJvcGVydGllcyB0byBzYXZlCisgICAgICogQHBhcmFtIG9zICAgIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvIChOb3RlIHRoaXMgZ2V0cyBjbG9zZWQpCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvciBpbiB3cml0aW5nIHRvIHRoZSBzdHJlYW0KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB4bWxTYXZlUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIFhNTCBkb2N1bWVudAorICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoUFJPUEVSVElFUyk7CisKKyAgICAgICAgTGlzdCBzb3J0ZWQgPSBzb3J0UHJvcGVydGllcyhwcm9wcyk7CisKKworICAgICAgICAvLyBvdXRwdXQgcHJvcGVydGllcworICAgICAgICBJdGVyYXRvciBpdGVuID0gc29ydGVkLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVuLmhhc05leHQoKSkgeworICAgICAgICAgICAgVHVwbGUgdHVwbGUgPSAoVHVwbGUpIGl0ZW4ubmV4dCgpOworICAgICAgICAgICAgRWxlbWVudCBwcm9wRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KFBST1BFUlRZKTsKKyAgICAgICAgICAgIHByb3BFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX05BTUUsIHR1cGxlLmtleSk7CisgICAgICAgICAgICBwcm9wRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9WQUxVRSwgdHVwbGUudmFsdWUpOworICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQocHJvcEVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgV3JpdGVyIHdyaSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cmkgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zLCAiVVRGOCIpOworICAgICAgICAgICAgd3JpLndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKKyAgICAgICAgICAgIChuZXcgRE9NRWxlbWVudFdyaXRlcigpKS53cml0ZShyb290RWxlbWVudCwgd3JpLCAwLCAiXHQiKTsKKyAgICAgICAgICAgIHdyaS5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIFhNTCBmaWxlIiwgaW9lKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh3cmkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIEpESyAxLjIgYWxsb3dzIGZvciB0aGUgc2FmZXIgbWV0aG9kCisgICAgICogIDx0dD5Qcm9wZXJ0aWVzLnN0b3JlKE91dHB1dFN0cmVhbSwgU3RyaW5nKTwvdHQ+LCB3aGljaCB0aHJvd3MgYW4KKyAgICAgKiAgPHR0PklPRXhjZXB0aW9uPC90dD4gb24gYW4gb3V0cHV0IGVycm9yLgorICAgICAqCisgICAgICpAcGFyYW0gcHJvcHMgdGhlIHByb3BlcnRpZXMgdG8gcmVjb3JkCisgICAgICpAcGFyYW0gb3MgcmVjb3JkIHRoZSBwcm9wZXJ0aWVzIHRvIHRoaXMgb3V0cHV0IHN0cmVhbQorICAgICAqQHBhcmFtIGhlYWRlciBwcmVwZW5kIHRoaXMgaGVhZGVyIHRvIHRoZSBwcm9wZXJ0eSBvdXRwdXQKKyAgICAgKkBleGNlcHRpb24gSU9FeGNlcHRpb24gb24gYW4gSS9PIGVycm9yIGR1cmluZyBhIHdyaXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGpka1NhdmVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMsIE91dHB1dFN0cmVhbSBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgIHRyeSB7CisgICAgICAgICAgIHByb3BzLnN0b3JlKG9zLCBoZWFkZXIpOworCisgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgIGlmIChvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4KSB7CisgICAgICAgICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gY2xvc2Ugb3V0cHV0IHN0cmVhbSIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSB0byBnZXQgYSBEb2N1bWVudEJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgVGhlIERvY3VtZW50QnVpbGRlciBpbnN0YW5jZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSmF2YWguamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0phdmFoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmQ1ZTNkZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0phdmFoLmphdmEKQEAgLTAsMCArMSw0ODggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamF2YWguSmF2YWhBZGFwdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFoLkphdmFoQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZmFjYWRlLkZhY2FkZVRhc2tIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUuSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50OworCisvKioKKyAqIEdlbmVyYXRlcyBKTkkgaGVhZGVyIGZpbGVzIHVzaW5nIGphdmFoLgorICoKKyAqIFRoaXMgdGFzayBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyAqIDx1bD4KKyAqIDxsaT5jbGFzc25hbWUgLSB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzczwvbGk+CisgKiA8bGk+b3V0cHV0RmlsZSAtIENvbmNhdGVuYXRlcyB0aGUgcmVzdWx0aW5nIGhlYWRlciBvciBzb3VyY2UgZmlsZXMgZm9yIGFsbAorICogICAgIHRoZSBjbGFzc2VzIGxpc3RlZCBpbnRvIHRoaXMgZmlsZTwvbGk+CisgKiA8bGk+ZGVzdGRpciAtIFNldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSBqYXZhaCBzYXZlcyB0aGUgaGVhZGVyIGZpbGVzIG9yIHRoZQorICogICAgIHN0dWIgZmlsZXM8L2xpPgorICogPGxpPmNsYXNzcGF0aDwvbGk+CisgKiA8bGk+Ym9vdGNsYXNzcGF0aDwvbGk+CisgKiA8bGk+Zm9yY2UgLSBTcGVjaWZpZXMgdGhhdCBvdXRwdXQgZmlsZXMgc2hvdWxkIGFsd2F5cyBiZSB3cml0dGVuCisgICAgICAgKEpESzEuMiBvbmx5KTwvbGk+CisgKiA8bGk+b2xkIC0gU3BlY2lmaWVzIHRoYXQgb2xkIEpESzEuMC1zdHlsZSBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlIGdlbmVyYXRlZAorICogICAgIChvdGhlcndpc2Ugb3V0cHV0IGZpbGUgY29udGFpbiBKTkktc3R5bGUgbmF0aXZlIG1ldGhvZAorICogICAgICBmdW5jdGlvbiBwcm90b3R5cGVzKSAoSkRLMS4yIG9ubHkpPC9saT4KKyAqIDxsaT5zdHVicyAtIGdlbmVyYXRlIEMgZGVjbGFyYXRpb25zIGZyb20gdGhlIEphdmEgb2JqZWN0IGZpbGUgKHVzZWQgd2l0aCBvbGQpPC9saT4KKyAqIDxsaT52ZXJib3NlIC0gY2F1c2VzIGphdmFoIHRvIHByaW50IGEgbWVzc2FnZSB0byBzdGRvdXQgY29uY2VybmluZyB0aGUgc3RhdHVzCisgKiAgICAgb2YgdGhlIGdlbmVyYXRlZCBmaWxlczwvbGk+CisgKiA8bGk+ZXh0ZGlycyAtIE92ZXJyaWRlIGxvY2F0aW9uIG9mIGluc3RhbGxlZCBleHRlbnNpb25zPC9saT4KKyAqIDwvdWw+CisgKiBPZiB0aGVzZSBhcmd1bWVudHMsIGVpdGhlciA8Yj5vdXRwdXRGaWxlPC9iPiBvciA8Yj5kZXN0ZGlyPC9iPiBpcyByZXF1aXJlZCwKKyAqIGJ1dCBub3QgYm90aC4gTW9yZSB0aGFuIG9uZSBjbGFzc25hbWUgbWF5IGJlIHNwZWNpZmllZCwgdXNpbmcgYSBjb21tYS1zZXBhcmF0ZWQKKyAqIGxpc3Qgb3IgYnkgdXNpbmcgPGNvZGU+Jmx0O2NsYXNzIG5hbWU9Inh4eCImZ3Q7PC9jb2RlPiBlbGVtZW50cyB3aXRoaW4gdGhlIHRhc2suCisgKiA8cD4KKyAqIFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIGdlbmVyYXRlIEMgaGVhZGVyIGFuZCBzb3VyY2UgZmlsZXMgdGhhdAorICogYXJlIG5lZWRlZCB0byBpbXBsZW1lbnQgbmF0aXZlIG1ldGhvZHMuCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBKYXZhaCBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBWZWN0b3IgY2xhc3NlcyA9IG5ldyBWZWN0b3IoMik7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2xzOworICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOworICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGggPSBudWxsOworICAgIHByaXZhdGUgRmlsZSBvdXRwdXRGaWxlID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZSAgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG9sZCAgICAgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3R1YnMgICA9IGZhbHNlOworICAgIHByaXZhdGUgUGF0aCBib290Y2xhc3NwYXRoOworICAgIC8vcHJpdmF0ZSBQYXRoIGV4dGRpcnM7CisgICAgcHJpdmF0ZSBGYWNhZGVUYXNrSGVscGVyIGZhY2FkZSA9IG51bGw7CisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBObyBhcmcgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEphdmFoKCkgeworICAgICAgICBmYWNhZGUgPSBuZXcgRmFjYWRlVGFza0hlbHBlcihKYXZhaEFkYXB0ZXJGYWN0b3J5LmdldERlZmF1bHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyAob3IgY2xhc3Nlcywgc2VwYXJhdGVkIGJ5IGNvbW1hcykuCisgICAgICogQHBhcmFtIGNscyB0aGUgY2xhc3NuYW1lIChvciBjbGFzc25hbWVzKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgY2xzKSB7CisgICAgICAgIHRoaXMuY2xzID0gY2xzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgY2xhc3MgdG8gcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Q2xhc3NBcmd1bWVudDwvY29kZT4gdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NBcmd1bWVudCBjcmVhdGVDbGFzcygpIHsKKyAgICAgICAgQ2xhc3NBcmd1bWVudCBnYSA9IG5ldyBDbGFzc0FyZ3VtZW50KCk7CisgICAgICAgIGNsYXNzZXMuYWRkRWxlbWVudChnYSk7CisgICAgICAgIHJldHVybiBnYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIGNvcnJlc3BvbmRpbmcgdGhlIHRoZSBuZXN0ZWQgImNsYXNzIiBlbGVtZW50LgorICAgICAqIEl0IGNvbnRhaW5zIGEgIm5hbWUiIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgQ2xhc3NBcmd1bWVudCB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgLyoqIENvbnN0cnVjdG9yIGZvciBDbGFzc0FyZ3VtZW50LiAqLworICAgICAgICBwdWJsaWMgQ2xhc3NBcmd1bWVudCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIG5hbWUgYXR0cmlidXRlLgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBhdHRyaWJ1dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbmFtZSBhdHRyaWJ1dGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgYXR0cmlidXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmaWxlc2V0LgorICAgICAqIEBwYXJhbSBmcyB0aGUgZmlsZXNldCB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZVNldChGaWxlU2V0IGZzKSB7CisgICAgICAgIGZpbGVzLmFkZChmcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZXMgb2YgdGhlIGNsYXNzZXMgdG8gcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBjbGFzc2VzLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgQXJyYXlMaXN0IGFsID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBpZiAoY2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNscywgIiwiLCBmYWxzZSk7CisgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIGFsLmFkZCh0b2submV4dFRva2VuKCkudHJpbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWxlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGluY2x1ZGVkQ2xhc3NlcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoCisgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSkuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRDbGFzc2VzW2ldLnJlcGxhY2UoJ1xcJywgJy4nKS5yZXBsYWNlKCcvJywgJy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCBpbmNsdWRlZENsYXNzZXNbaV0ubGVuZ3RoKCkgLSA2KTsKKyAgICAgICAgICAgICAgICAgICAgYWwuYWRkKGNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBjbGFzc2VzLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBDbGFzc0FyZ3VtZW50IGFyZyA9IChDbGFzc0FyZ3VtZW50KSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBhbC5hZGQoYXJnLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgYWwudG9BcnJheShuZXcgU3RyaW5nW2FsLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIEphdmEgc291cmNlCisgICAgICogZmlsZXMgc2hvdWxkIGJlIGNvbXBpbGVkLgorICAgICAqIEBwYXJhbSBkZXN0RGlyIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBpZiBhbnkuCisgICAgICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXREZXN0ZGlyKCkgeworICAgICAgICByZXR1cm4gZGVzdERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGUgY2xhc3NwYXRoIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggc3JjKSB7CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NwYXRoID0gc3JjOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChzcmMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGF0aCB0byB1c2UgZm9yIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICogQHBhcmFtIHIgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGguCisgICAgICogQHRvZG8gdGhpcyBuZWVkcyB0byBiZSBkb2N1bWVudGVkIGluIHRoZSBIVE1MIGRvY3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzc3BhdGggdG8gdXNlLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzcGF0aC4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCkgeworICAgICAgICByZXR1cm4gY2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIGxvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlcy4KKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBib290c3RyYXAgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb3RjbGFzc3BhdGgoUGF0aCBzcmMpIHsKKyAgICAgICAgaWYgKGJvb3RjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgYm9vdGNsYXNzcGF0aCA9IHNyYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb3RjbGFzc3BhdGguYXBwZW5kKHNyYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHBhdGggdG8gYm9vdHN0cmFwIGNsYXNzIGZpbGVzLgorICAgICAqIEByZXR1cm4gYSBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQm9vdGNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGJvb3RjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgYm9vdGNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJvb3RjbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIHRoZSBib290c3RyYXAgcGF0aCwgdGhpcyBhZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAqIEBwYXJhbSByIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoCisgICAgICogQHRvZG8gdGhpcyBuZWVkcyB0byBiZSBkb2N1bWVudGVkIGluIHRoZSBIVE1MLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb3RDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQm9vdGNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBib290Y2xhc3NwYXRoIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBib290Y2xhc3MgcGF0aC4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Qm9vdGNsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGJvb3RjbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uY2F0ZW5hdGVzIHRoZSByZXN1bHRpbmcgaGVhZGVyIG9yIHNvdXJjZSBmaWxlcyBmb3IgYWxsCisgICAgICogdGhlIGNsYXNzZXMgbGlzdGVkIGludG8gdGhpcyBmaWxlLgorICAgICAqIEBwYXJhbSBvdXRwdXRGaWxlIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlKEZpbGUgb3V0cHV0RmlsZSkgeworICAgICAgICB0aGlzLm91dHB1dEZpbGUgPSBvdXRwdXRGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZXN0aW5hdGlvbiBmaWxlLCBpZiBhbnkuCisgICAgICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gZmlsZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0ZmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgb3V0cHV0IGZpbGVzIHNob3VsZCBhbHdheXMgYmUgd3JpdHRlbiAoSkRLMS4yIG9ubHkpLgorICAgICAqIEBwYXJhbSBmb3JjZSB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlKGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgdGhpcy5mb3JjZSA9IGZvcmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3V0cHV0IGZpbGVzIHNob3VsZCBhbHdheXMgYmUgd3JpdHRlbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JjZSBhdHRyaWJ1dGUuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmNlKCkgeworICAgICAgICByZXR1cm4gZm9yY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgc3BlY2lmaWVzIHRoYXQgb2xkIEpESzEuMC1zdHlsZSBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlCisgICAgICogZ2VuZXJhdGVkLgorICAgICAqIChvdGhlcndpc2Ugb3V0cHV0IGZpbGUgY29udGFpbiBKTkktc3R5bGUgbmF0aXZlIG1ldGhvZCBmdW5jdGlvbgorICAgICAqICBwcm90b3R5cGVzKSAoSkRLMS4yIG9ubHkpLgorICAgICAqIEBwYXJhbSBvbGQgaWYgdHJ1ZSB1c2Ugb2xkIDEuMCBzdHlsZSBoZWFkZXIgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2xkKGJvb2xlYW4gb2xkKSB7CisgICAgICAgIHRoaXMub2xkID0gb2xkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb2xkIEpESzEuMC1zdHlsZSBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlIGdlbmVyYXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvbGQgYXR0cmlidXRlLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPbGQoKSB7CisgICAgICAgIHJldHVybiBvbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZ2VuZXJhdGUgQyBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgSmF2YSBvYmplY3QgZmlsZSAodXNlZCB3aXRoIG9sZCkuCisgICAgICogQHBhcmFtIHN0dWJzIGlmIHRydWUsIGdlbmVyYXRlZCBDIGRlY2xhcmF0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHVicyhib29sZWFuIHN0dWJzKSB7CisgICAgICAgIHRoaXMuc3R1YnMgPSBzdHViczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIEMgZGVjbGFyYXRpb25zIGZyb20gdGhlIEphdmEgb2JqZWN0IGZpbGUgc2hvdWxkIGJlIGdlbmVyYXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHVicyBhdHRyaWJ1dGUuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFN0dWJzKCkgeworICAgICAgICByZXR1cm4gc3R1YnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgY2F1c2VzIEphdmFoIHRvIHByaW50IGEgbWVzc2FnZSBjb25jZXJuaW5nCisgICAgICogdGhlIHN0YXR1cyBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorICAgICAqIEBwYXJhbSB2ZXJib3NlIGlmIHRydWUsIGRvIHZlcmJvc2UgcHJpbnRpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHZlcmJvc2Ugb3V0cHV0IHNob3VsZCBnZXQgZ2VuZXJhdGVkLgorICAgICAqIEByZXR1cm4gdGhlIHZlcmJvc2UgYXR0cmlidXRlLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWZXJib3NlKCkgeworICAgICAgICByZXR1cm4gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaG9vc2UgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgdGFzay4KKyAgICAgKiBAcGFyYW0gaW1wbCB0aGUgbmFtZSBvZiB0aGUgaW1wbGVtZW5hdGlvbi4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb24oU3RyaW5nIGltcGwpIHsKKyAgICAgICAgaWYgKCJkZWZhdWx0Ii5lcXVhbHMoaW1wbCkpIHsKKyAgICAgICAgICAgIGZhY2FkZS5zZXRJbXBsZW1lbnRhdGlvbihKYXZhaEFkYXB0ZXJGYWN0b3J5LmdldERlZmF1bHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWNhZGUuc2V0SW1wbGVtZW50YXRpb24oaW1wbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbW1hbmQtbGluZSBhcmd1bWVudC4KKyAgICAgKiBAcmV0dXJuIGEgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCBjcmVhdGVBcmcoKSB7CisgICAgICAgIEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCBhcmcgPQorICAgICAgICAgICAgbmV3IEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCgpOworICAgICAgICBmYWNhZGUuYWRkSW1wbGVtZW50YXRpb25Bcmd1bWVudChhcmcpOworICAgICAgICByZXR1cm4gYXJnOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIChpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYykgc2V0dGluZ3MgZ2l2ZW4gYXMgbmVzdGVkCisgICAgICogYXJnIGVsZW1lbnRzLgorICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50cy4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEN1cnJlbnRBcmdzKCkgeworICAgICAgICByZXR1cm4gZmFjYWRlLmdldEFyZ3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0YXNrCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlzIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiB0aGUgdGFzayBleGVjdXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgc3JjZGlyCisKKyAgICAgICAgaWYgKChjbHMgPT0gbnVsbCkgJiYgKGNsYXNzZXMuc2l6ZSgpID09IDApICYmIChmaWxlcy5zaXplKCkgPT0gMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY2xhc3MgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGNscyAhPSBudWxsKSAmJiAoY2xhc3Nlcy5zaXplKCkgPiAwKSAmJiAoZmlsZXMuc2l6ZSgpID4gMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic2V0IGNsYXNzIGF0dHJpYnV0ZSBPUiBjbGFzcyBlbGVtZW50IE9SIGZpbGVzZXQsICIKKyAgICAgICAgICAgICAgICArICJub3QgMiBvciBtb3JlIG9mIHRoZW0uIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdERpciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGVzdGluYXRpb24gZGlyZWN0b3J5IFwiIiArIGRlc3REaXIKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5IiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0ZGlyIGFuZCBvdXRwdXRGaWxlIGFyZSBtdXR1YWxseSAiCisgICAgICAgICAgICAgICAgICAgICsgImV4Y2x1c2l2ZSIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSAobmV3IFBhdGgoZ2V0UHJvamVjdCgpKSkuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIEphdmFoQWRhcHRlciBhZCA9CisgICAgICAgICAgICBKYXZhaEFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIoZmFjYWRlLmdldEltcGxlbWVudGF0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgIGlmICghYWQuY29tcGlsZSh0aGlzKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb21waWxhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExvZ3MgdGhlIGNvbXBpbGF0aW9uIHBhcmFtZXRlcnMsIGFkZHMgdGhlIGZpbGVzIHRvIGNvbXBpbGUgYW5kIGxvZ3MgdGhlCisgICAgICogJnF1b3Q7bmljZVNvdXJjZUxpc3QmcXVvdDsKKyAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nQW5kQWRkRmlsZXMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKGNtZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9ncyB0aGUgY29tcGlsYXRpb24gcGFyYW1ldGVycywgYWRkcyB0aGUgZmlsZXMgdG8gY29tcGlsZSBhbmQgbG9ncyB0aGUKKyAgICAgKiAmcXVvdDtuaWNlU291cmNlTGlzdCZxdW90OworICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZSB0byBhZGQgcGFyYW1ldGVycyB0by4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgbG9nKCJDb21waWxhdGlvbiAiICsgY21kLmRlc2NyaWJlQXJndW1lbnRzKCksCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgbmljZUNsYXNzTGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nW10gYyA9IGdldENsYXNzZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShjW2ldKTsKKyAgICAgICAgICAgIG5pY2VDbGFzc0xpc3QuYXBwZW5kKCIgICAgIik7CisgICAgICAgICAgICBuaWNlQ2xhc3NMaXN0LmFwcGVuZChjW2ldKTsKKyAgICAgICAgICAgIG5pY2VDbGFzc0xpc3QuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCJDbGFzcyIpOworICAgICAgICBpZiAoYy5sZW5ndGggPiAxKSB7CisgICAgICAgICAgICBwcmVmaXguYXBwZW5kKCJlcyIpOworICAgICAgICB9CisgICAgICAgIHByZWZpeC5hcHBlbmQoIiB0byBiZSBjb21waWxlZDoiKTsKKyAgICAgICAgcHJlZml4LmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisKKyAgICAgICAgbG9nKHByZWZpeC50b1N0cmluZygpICsgbmljZUNsYXNzTGlzdC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvTmF0aXZlMkFzY2lpLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OYXRpdmUyQXNjaWkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjgyY2ViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvTmF0aXZlMkFzY2lpLmphdmEKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5hdGl2ZTJhc2NpaS5OYXRpdmUyQXNjaWlBZGFwdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5hdGl2ZTJhc2NpaS5OYXRpdmUyQXNjaWlBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLklkZW50aXR5TWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU291cmNlRmlsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUuRmFjYWRlVGFza0hlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZS5JbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQ7CisKKy8qKgorICogQ29udmVydHMgZmlsZXMgZnJvbSBuYXRpdmUgZW5jb2RpbmdzIHRvIEFTQ0lJLgorICoKKyAqIEBzaW5jZSBBbnQgMS4yCisgKi8KK3B1YmxpYyBjbGFzcyBOYXRpdmUyQXNjaWkgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgeworCisgICAgcHJpdmF0ZSBib29sZWFuIHJldmVyc2UgPSBmYWxzZTsgIC8vIGNvbnZlcnQgZnJvbSBhc2NpaSBiYWNrIHRvIG5hdGl2ZQorICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsgICAvLyBlbmNvZGluZyB0byBjb252ZXJ0IHRvL2Zyb20KKyAgICBwcml2YXRlIEZpbGUgc3JjRGlyID0gbnVsbDsgICAgICAgLy8gV2hlcmUgdG8gZmluZCBpbnB1dCBmaWxlcworICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyID0gbnVsbDsgICAgICAvLyBXaGVyZSB0byBwdXQgb3V0cHV0IGZpbGVzCisgICAgcHJpdmF0ZSBTdHJpbmcgZXh0ZW5zaW9uID0gbnVsbDsgIC8vIEV4dGVuc2lvbiBvZiBvdXRwdXQgZmlsZXMgaWYgZGlmZmVyZW50CisKKyAgICBwcml2YXRlIE1hcHBlciBtYXBwZXI7CisgICAgcHJpdmF0ZSBGYWNhZGVUYXNrSGVscGVyIGZhY2FkZSA9IG51bGw7CisKKyAgICAvKiogTm8gYXJncyBjb25zdHJ1Y3RvciAqLworICAgIHB1YmxpYyBOYXRpdmUyQXNjaWkoKSB7CisgICAgICAgIGZhY2FkZSA9IG5ldyBGYWNhZGVUYXNrSGVscGVyKE5hdGl2ZTJBc2NpaUFkYXB0ZXJGYWN0b3J5LmdldERlZmF1bHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmxhZyB0aGUgY29udmVyc2lvbiB0byBydW4gaW4gdGhlIHJldmVyc2Ugc2Vuc2UsCisgICAgICogdGhhdCBpcyBBc2NpaSB0byBOYXRpdmUgZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV2ZXJzZSBUcnVlIGlmIHRoZSBjb252ZXJzaW9uIGlzIHRvIGJlIHJldmVyc2VkLAorICAgICAqICAgICAgICAgICAgICAgIG90aGVyd2lzZSBmYWxzZTsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXZlcnNlKGJvb2xlYW4gcmV2ZXJzZSkgeworICAgICAgICB0aGlzLnJldmVyc2UgPSByZXZlcnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmV2ZXJzZSBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgcmV2ZXJzZSBhdHRyaWJ1dGUuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJldmVyc2UoKSB7CisgICAgICAgIHJldHVybiByZXZlcnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZW5jb2RpbmcgdG8gdHJhbnNsYXRlIHRvL2Zyb20uCisgICAgICogSWYgdW5zZXQsIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgSlZNIGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIE5hdGl2ZQorICAgICAqICAgICAgICAgICAgICAgICBlbmNvZGluZyB0byBjb252ZXJ0IGZyb20gb3IgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGVuY29kaW5nIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGluZyBhdHRyaWJ1dGUuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gZmluZCBmaWxlcyB0byBjb252ZXJ0LgorICAgICAqCisgICAgICogQHBhcmFtIHNyY0RpciBkaXJlY3RvcnkgdG8gZmluZCBpbnB1dCBmaWxlIGluLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIHNyY0RpcikgeworICAgICAgICB0aGlzLnNyY0RpciA9IHNyY0RpcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHRvIHBsYWNlIGNvbnZlcnRlZCBmaWxlcyBpbnRvLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc3REaXIgZGlyZWN0b3J5IHRvIHBsYWNlIG91dHB1dCBmaWxlIGludG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGV4dGVuc2lvbiB3aGljaCBjb252ZXJ0ZWQgZmlsZXMgc2hvdWxkIGhhdmUuCisgICAgICogSWYgdW5zZXQsIGZpbGVzIHdpbGwgbm90IGJlIHJlbmFtZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0IEZpbGUgZXh0ZW5zaW9uIHRvIHVzZSBmb3IgY29udmVydGVkIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4dChTdHJpbmcgZXh0KSB7CisgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENob29zZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgcGFydGljdWxhciB0YXNrLgorICAgICAqIEBwYXJhbSBpbXBsIHRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbmF0aW9uCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uKFN0cmluZyBpbXBsKSB7CisgICAgICAgIGlmICgiZGVmYXVsdCIuZXF1YWxzKGltcGwpKSB7CisgICAgICAgICAgICBmYWNhZGUuc2V0SW1wbGVtZW50YXRpb24oTmF0aXZlMkFzY2lpQWRhcHRlckZhY3RvcnkuZ2V0RGVmYXVsdCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhY2FkZS5zZXRJbXBsZW1lbnRhdGlvbihpbXBsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIEZpbGVOYW1lTWFwcGVyIHRvIHVzZSAobmVzdGVkIG1hcHBlciBlbGVtZW50KS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1hcHBlciB0byB1c2UgZm9yIGZpbGUgbmFtZSB0cmFuc2xhdGlvbnMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG1vcmUgdGhhbiBvbmUgbWFwcGVyIGlzIGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIE1hcHBlciBjcmVhdGVNYXBwZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAobWFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgbWFwcGVyID0gbmV3IE1hcHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICByZXR1cm4gbWFwcGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbmVzdGVkIGZpbGVuYW1lbWFwcGVyCisgICAgICogQHBhcmFtIGZpbGVOYW1lTWFwcGVyIHRoZSBtYXBwZXIgdG8gYWRkCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChGaWxlTmFtZU1hcHBlciBmaWxlTmFtZU1hcHBlcikgeworICAgICAgICBjcmVhdGVNYXBwZXIoKS5hZGQoZmlsZU5hbWVNYXBwZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29tbWFuZC1saW5lIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gYSBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgdG8gYmUgY29uZmlndXJlZAorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgY3JlYXRlQXJnKCkgeworICAgICAgICBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgYXJnID0KKyAgICAgICAgICAgIG5ldyBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQoKTsKKyAgICAgICAgZmFjYWRlLmFkZEltcGxlbWVudGF0aW9uQXJndW1lbnQoYXJnKTsKKyAgICAgICAgcmV0dXJuIGFyZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0YXNrCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlzIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiB0aGUgdGFzayBleGVjdXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbnVsbDsgLy8gU2Nhbm5lciB0byBmaW5kIG91ciBpbnB1dHMKKyAgICAgICAgU3RyaW5nW10gZmlsZXM7ICAgICAgICAgICAgICAgICAgLy8gbGlzdCBvZiBmaWxlcyB0byBwcm9jZXNzCisKKyAgICAgICAgLy8gZGVmYXVsdCBzcmNEaXIgdG8gYmFzZWRpcgorICAgICAgICBpZiAoc3JjRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyY0RpciA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVxdWlyZSBkZXN0RGlyCisgICAgICAgIGlmIChkZXN0RGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGRlc3QgYXR0cmlidXRlIG11c3QgYmUgc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgc3JjIGFuZCBkZXN0IGRpcnMgYXJlIHRoZSBzYW1lLCByZXF1aXJlIHRoZSBleHRlbnNpb24KKyAgICAgICAgLy8gdG8gYmUgc2V0LCBzbyB3ZSBkb24ndCBzdG9tcCBldmVyeSBmaWxlLiAgT25lIGNvdWxkIHN0aWxsCisgICAgICAgIC8vIGluY2x1ZGUgYSBmaWxlIHdpdGggdGhlIHNhbWUgZXh0ZW5zaW9uLCBidXQgLi4uLgorICAgICAgICBpZiAoc3JjRGlyLmVxdWFscyhkZXN0RGlyKSAmJiBleHRlbnNpb24gPT0gbnVsbCAmJiBtYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZXh0IGF0dHJpYnV0ZSBvciBhIG1hcHBlciBtdXN0IGJlIHNldCBpZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc3JjIGFuZCBkZXN0IGRpcnMgYXJlIHRoZSBzYW1lLiIpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZU5hbWVNYXBwZXIgbSA9IG51bGw7CisgICAgICAgIGlmIChtYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbSA9IG5ldyBJZGVudGl0eU1hcHBlcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtID0gbmV3IEV4dE1hcHBlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbSA9IG1hcHBlci5nZXRJbXBsZW1lbnRhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgc2Nhbm5lciA9IGdldERpcmVjdG9yeVNjYW5uZXIoc3JjRGlyKTsKKyAgICAgICAgZmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgc2ZzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOworICAgICAgICBmaWxlcyA9IHNmcy5yZXN0cmljdChmaWxlcywgc3JjRGlyLCBkZXN0RGlyLCBtKTsKKyAgICAgICAgaW50IGNvdW50ID0gZmlsZXMubGVuZ3RoOworICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkNvbnZlcnRpbmcgIiArIGNvdW50ICsgIiBmaWxlIgorICAgICAgICAgICAgKyAoY291bnQgIT0gMSA/ICJzIiA6ICIiKSArICIgZnJvbSAiOworICAgICAgICBsb2cobWVzc2FnZSArIHNyY0RpciArICIgdG8gIiArIGRlc3REaXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb252ZXJ0KGZpbGVzW2ldLCBtLm1hcEZpbGVOYW1lKGZpbGVzW2ldKVswXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgc2luZ2xlIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjTmFtZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlLgorICAgICAqIEBwYXJhbSBkZXN0TmFtZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb252ZXJ0KFN0cmluZyBzcmNOYW1lLCBTdHJpbmcgZGVzdE5hbWUpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgc3JjRmlsZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB0byBjb252ZXJ0CisgICAgICAgIEZpbGUgZGVzdEZpbGU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgdG8gcHV0IHRoZSByZXN1bHRzCisKKyAgICAgICAgLy8gQnVpbGQgdGhlIGZ1bGwgZmlsZSBuYW1lcworICAgICAgICBzcmNGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCBzcmNOYW1lKTsKKyAgICAgICAgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBkZXN0TmFtZSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBhYm91dCB0byBjbG9iYmVyIHNvbWV0aGluZworICAgICAgICBpZiAoc3JjRmlsZS5lcXVhbHMoZGVzdEZpbGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgIiArIHNyY0ZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd291bGQgb3ZlcndyaXRlIGl0cyBzZWxmIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyBpZiBuZWVkZWQKKyAgICAgICAgLy8gWFhYIEpESyAxLjEgZG9lc24ndCBoYXZlIEZpbGUuZ2V0UGFyZW50RmlsZSwKKyAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSBkZXN0RmlsZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKHBhcmVudE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBwYXJlbnRGaWxlID0gbmV3IEZpbGUocGFyZW50TmFtZSk7CisKKyAgICAgICAgICAgIGlmICgoIXBhcmVudEZpbGUuZXhpc3RzKCkpICYmICghcGFyZW50RmlsZS5ta2RpcnMoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNhbm5vdCBjcmVhdGUgcGFyZW50IGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyZW50TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb2coImNvbnZlcnRpbmcgIiArIHNyY05hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBOYXRpdmUyQXNjaWlBZGFwdGVyIGFkID0KKyAgICAgICAgICAgIE5hdGl2ZTJBc2NpaUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIoZmFjYWRlLmdldEltcGxlbWVudGF0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICBpZiAoIWFkLmNvbnZlcnQodGhpcywgc3JjRmlsZSwgZGVzdEZpbGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvbnZlcnNpb24gZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSAoaW1wbGVtZW50YXRpb24gc3BlY2lmaWMpIHNldHRpbmdzIGdpdmVuIGFzIG5lc3RlZAorICAgICAqIGFyZyBlbGVtZW50cy4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcmd1bWVudHMuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDdXJyZW50QXJncygpIHsKKyAgICAgICAgcmV0dXJuIGZhY2FkZS5nZXRBcmdzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFeHRNYXBwZXIgaW1wbGVtZW50cyBGaWxlTmFtZU1hcHBlciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgcykgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyBzKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgICAgICBpbnQgbGFzdERvdCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICBpZiAobGFzdERvdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXh0ZW5zaW9ufTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ZmlsZU5hbWUgKyBleHRlbnNpb259OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvTmV0UmV4eEMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05ldFJleHhDLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3OThlYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05ldFJleHhDLmphdmEKQEAgLTAsMCArMSw5NjMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG5ldHJleHgubGFuZy5SZXh4OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLy8gQ2hlY2tTdHlsZTpJbm5lckFzc2lnbm1lbnRDaGVjayBPRkYgLSB1c2VkIHRvbyBtdWNoIGluIHRoZSBmaWxlIHRvIGJlIHJlbW92ZWQKKy8qKgorICogQ29tcGlsZXMgTmV0UmV4eCBzb3VyY2UgZmlsZXMuCisgKiBUaGlzIHRhc2sgY2FuIHRha2UgdGhlIGZvbGxvd2luZworICogYXJndW1lbnRzOgorICogPHVsPgorICogPGxpPmJpbmFyeTwvbGk+CisgKiA8bGk+Y2xhc3NwYXRoPC9saT4KKyAqIDxsaT5jb21tZW50czwvbGk+CisgKiA8bGk+Y29tcGlsZTwvbGk+CisgKiA8bGk+Y29uc29sZTwvbGk+CisgKiA8bGk+Y3Jvc3NyZWY8L2xpPgorICogPGxpPmRlY2ltYWw8L2xpPgorICogPGxpPmRlc3RkaXI8L2xpPgorICogPGxpPmRpYWc8L2xpPgorICogPGxpPmV4cGxpY2l0PC9saT4KKyAqIDxsaT5mb3JtYXQ8L2xpPgorICogPGxpPmtlZXA8L2xpPgorICogPGxpPmxvZ288L2xpPgorICogPGxpPnJlcGxhY2U8L2xpPgorICogPGxpPnNhdmVsb2c8L2xpPgorICogPGxpPnNyY2RpcjwvbGk+CisgKiA8bGk+c291cmNlZGlyPC9saT4KKyAqIDxsaT5zdHJpY3RhcmdzPC9saT4KKyAqIDxsaT5zdHJpY3Rhc3NpZ248L2xpPgorICogPGxpPnN0cmljdGNhc2U8L2xpPgorICogPGxpPnN0cmljdGltcG9ydDwvbGk+CisgKiA8bGk+c3ltYm9sczwvbGk+CisgKiA8bGk+dGltZTwvbGk+CisgKiA8bGk+dHJhY2U8L2xpPgorICogPGxpPnV0Zjg8L2xpPgorICogPGxpPnZlcmJvc2U8L2xpPgorICogPGxpPnN1cHByZXNzTWV0aG9kQXJndW1lbnROb3RVc2VkPC9saT4KKyAqIDxsaT5zdXBwcmVzc1ByaXZhdGVQcm9wZXJ0eU5vdFVzZWQ8L2xpPgorICogPGxpPnN1cHByZXNzVmFyaWFibGVOb3RVc2VkPC9saT4KKyAqIDxsaT5zdXBwcmVzc0V4Y2VwdGlvbk5vdFNpZ25hbGxlZDwvbGk+CisgKiA8bGk+c3VwcHJlc3NEZXByZWNhdGlvbjwvbGk+CisgKiA8L3VsPgorICogT2YgdGhlc2UgYXJndW1lbnRzLCB0aGUgPGI+c3JjZGlyPC9iPiBhcmd1bWVudCBpcyByZXF1aXJlZC4KKyAqCisgKiA8cD5XaGVuIHRoaXMgdGFzayBleGVjdXRlcywgaXQgd2lsbCByZWN1cnNpdmVseSBzY2FuIHRoZSBzcmNkaXIKKyAqIGxvb2tpbmcgZm9yIE5ldFJleHggc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuIFRoaXMgdGFzayBtYWtlcyBpdHMKKyAqIGNvbXBpbGUgZGVjaXNpb24gYmFzZWQgb24gdGltZXN0YW1wLgorICogPHA+QmVmb3JlIGZpbGVzIGFyZSBjb21waWxlZCB0aGV5IGFuZCBhbnkgb3RoZXIgZmlsZSBpbiB0aGUKKyAqIHNyY2RpciB3aWxsIGJlIGNvcGllZCB0byB0aGUgZGVzdGRpciBhbGxvd2luZyBzdXBwb3J0IGZpbGVzIHRvIGJlCisgKiBsb2NhdGVkIHByb3Blcmx5IGluIHRoZSBjbGFzc3BhdGguIFRoZSByZWFzb24gZm9yIGNvcHlpbmcgdGhlIHNvdXJjZSBmaWxlcworICogYmVmb3JlIHRoZSBjb21waWxlIGlzIHRoYXQgTmV0UmV4eEMgaGFzIG9ubHkgdHdvIGRlc3RpbmF0aW9ucyBmb3IgY2xhc3NmaWxlczoKKyAqIDxvbD4KKyAqIDxsaT5UaGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCw8L2xpPgorICogPGxpPlRoZSBkaXJlY3RvcnkgdGhlIHNvdXJjZSBpcyBpbiAoc2VlIHNvdXJjZWRpciBvcHRpb24pCisgKiA8L29sPgorICoKKyAqLworcHVibGljIGNsYXNzIE5ldFJleHhDIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKworICAgIC8vIHZhcmlhYmxlcyB0byBob2xkIGFyZ3VtZW50cworICAgIHByaXZhdGUgYm9vbGVhbiBiaW5hcnk7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NwYXRoOworICAgIHByaXZhdGUgYm9vbGVhbiBjb21tZW50czsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFjdCA9IHRydWU7IC8vIHNob3VsZCBiZSB0aGUgZGVmYXVsdCwgYXMgaXQgaW50ZWdyYXRlcyBiZXR0ZXIgaW4gYW50LgorICAgIHByaXZhdGUgYm9vbGVhbiBjb21waWxlID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29uc29sZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY3Jvc3NyZWY7CisgICAgcHJpdmF0ZSBib29sZWFuIGRlY2ltYWwgPSB0cnVlOworICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOworICAgIHByaXZhdGUgYm9vbGVhbiBkaWFnOworICAgIHByaXZhdGUgYm9vbGVhbiBleHBsaWNpdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZm9ybWF0OworICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwOworICAgIHByaXZhdGUgYm9vbGVhbiBsb2dvID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVwbGFjZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZWxvZzsKKyAgICBwcml2YXRlIEZpbGUgc3JjRGlyOworICAgIHByaXZhdGUgYm9vbGVhbiBzb3VyY2VkaXIgPSB0cnVlOyAvLyA/PyBTaG91bGQgdGhpcyBiZSB0aGUgZGVmYXVsdCBmb3IgYW50PworICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpY3RhcmdzOworICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpY3Rhc3NpZ247CisgICAgcHJpdmF0ZSBib29sZWFuIHN0cmljdGNhc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0cmljdGltcG9ydDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RyaWN0cHJvcHM7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0cmljdHNpZ25hbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3ltYm9sczsKKyAgICBwcml2YXRlIGJvb2xlYW4gdGltZTsKKyAgICBwcml2YXRlIFN0cmluZyB0cmFjZSA9ICJ0cmFjZTIiOworICAgIHByaXZhdGUgYm9vbGVhbiB1dGY4OworICAgIHByaXZhdGUgU3RyaW5nIHZlcmJvc2UgPSAidmVyYm9zZTMiOworICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc01ldGhvZEFyZ3VtZW50Tm90VXNlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc1ByaXZhdGVQcm9wZXJ0eU5vdFVzZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NWYXJpYWJsZU5vdFVzZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NFeGNlcHRpb25Ob3RTaWduYWxsZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NEZXByZWNhdGlvbiA9IGZhbHNlOworCisgICAgLy8gY29uc3RhbnRzIGZvciB0aGUgbWVzc2FnZXMgdG8gc3VwcHJlc3MgYnkgZmxhZ3MgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01FVEhPRF9BUkdVTUVOVF9OT1RfVVNFRAorICAgICAgICA9ICJXYXJuaW5nOiBNZXRob2QgYXJndW1lbnQgaXMgbm90IHVzZWQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1BSSVZBVEVfUFJPUEVSVFlfTk9UX1VTRUQKKyAgICAgICAgPSAiV2FybmluZzogUHJpdmF0ZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGJ1dCBub3QgdXNlZCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVkFSSUFCTEVfTk9UX1VTRUQKKyAgICAgICAgPSAiV2FybmluZzogVmFyaWFibGUgaXMgc2V0IGJ1dCBub3QgdXNlZCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfRVhDRVBUSU9OX05PVF9TSUdOQUxMRUQKKyAgICAgICAgPSAiaXMgaW4gU0lHTkFMUyBsaXN0IGJ1dCBpcyBub3Qgc2lnbmFsbGVkIHdpdGhpbiB0aGUgbWV0aG9kIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19ERVBSRUNBVElPTiA9ICJoYXMgYmVlbiBkZXByZWNhdGVkIjsKKworICAgIC8vIG90aGVyIGltcGxlbWVudGF0aW9uIHZhcmlhYmxlcworICAgIHByaXZhdGUgVmVjdG9yIGNvbXBpbGVMaXN0ID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgSGFzaHRhYmxlIGZpbGVjb3B5TGlzdCA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIGxpdGVyYWxzIGFyZSB0cmVhdGVkIGFzIGJpbmFyeSwgcmF0aGVyIHRoYW4gTmV0UmV4eCB0eXBlcy4KKyAgICAgKiBAcGFyYW0gYmluYXJ5IGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmluYXJ5KGJvb2xlYW4gYmluYXJ5KSB7CisgICAgICAgIHRoaXMuYmluYXJ5ID0gYmluYXJ5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdXNlZCBmb3IgTmV0UmV4eCBjb21waWxhdGlvbi4KKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIHRoZSBjbGFzc3BhdGggdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgY2xhc3NwYXRoKSB7CisgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgY29tbWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBnZW5lcmF0ZWQgamF2YSBzb3VyY2UuCisgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8KKyAgICAgKiBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UKKyAgICAgKiBAcGFyYW0gY29tbWVudHMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50cyhib29sZWFuIGNvbW1lbnRzKSB7CisgICAgICAgIHRoaXMuY29tbWVudHMgPSBjb21tZW50czsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIGVycm9yIG1lc3NhZ2VzIGNvbWUgb3V0IGluIGNvbXBhY3Qgb3IgdmVyYm9zZSBmb3JtYXQuIFZhbGlkCisgICAgICogdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UKKyAgICAgKiBAcGFyYW0gY29tcGFjdCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXBhY3QoYm9vbGVhbiBjb21wYWN0KSB7CisgICAgICAgIHRoaXMuY29tcGFjdCA9IGNvbXBhY3Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGUgTmV0UmV4eCBjb21waWxlciBzaG91bGQgY29tcGlsZSB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZQorICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvCisgICAgICogZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuIFNldHRpbmcgdGhpcyBmbGFnIHRvIGZhbHNlLCB3aWxsCisgICAgICogYXV0b21hdGljYWxseSBzZXQgdGhlIGtlZXAgZmxhZyB0byB0cnVlLgorICAgICAqIEBwYXJhbSBjb21waWxlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZShib29sZWFuIGNvbXBpbGUpIHsKKyAgICAgICAgdGhpcy5jb21waWxlID0gY29tcGlsZTsKKyAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGUgJiYgIXRoaXMua2VlcCkgeworICAgICAgICAgICAgdGhpcy5rZWVwID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgb3Igbm90IG1lc3NhZ2VzIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlICdjb25zb2xlJyBWYWxpZAorICAgICAqIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICogQHBhcmFtIGNvbnNvbGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25zb2xlKGJvb2xlYW4gY29uc29sZSkgeworICAgICAgICB0aGlzLmNvbnNvbGUgPSBjb25zb2xlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV2hldGhlciB2YXJpYWJsZSBjcm9zcyByZWZlcmVuY2VzIGFyZSBnZW5lcmF0ZWQuCisgICAgICogQHBhcmFtIGNyb3NzcmVmIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NyZWYoYm9vbGVhbiBjcm9zc3JlZikgeworICAgICAgICB0aGlzLmNyb3NzcmVmID0gY3Jvc3NyZWY7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBkZWNpbWFsIGFyaXRobWV0aWMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBuZXRyZXh4IGNvZGUuCisgICAgICogQmluYXJ5IGFyaXRobWV0aWMgaXMgdXNlZCB3aGVuIHRoaXMgZmxhZyBpcyB0dXJuZWQgb2ZmLiBWYWxpZCB0cnVlCisgICAgICogdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICogQHBhcmFtIGRlY2ltYWwgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWNpbWFsKGJvb2xlYW4gZGVjaW1hbCkgeworICAgICAgICB0aGlzLmRlY2ltYWwgPSBkZWNpbWFsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgTmV0UmV4eCBzb3VyY2UgZmlsZXMKKyAgICAgKiBzaG91bGQgYmUgY29waWVkIGFuZCB0aGVuIGNvbXBpbGVkLgorICAgICAqIEBwYXJhbSBkZXN0RGlyTmFtZSB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3REaXIoRmlsZSBkZXN0RGlyTmFtZSkgeworICAgICAgICBkZXN0RGlyID0gZGVzdERpck5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGUgaXMgZ2VuZXJhdGVkCisgICAgICogQHBhcmFtIGRpYWcgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWFnKGJvb2xlYW4gZGlhZykgeworICAgICAgICB0aGlzLmRpYWcgPSBkaWFnOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHZhcmlhYmxlcyBtdXN0IGJlIGRlY2xhcmVkIGV4cGxpY2l0bHkgYmVmb3JlIHVzZS4gVmFsaWQKKyAgICAgKiB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKiBAcGFyYW0gZXhwbGljaXQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBsaWNpdChib29sZWFuIGV4cGxpY2l0KSB7CisgICAgICAgIHRoaXMuZXhwbGljaXQgPSBleHBsaWNpdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIGNvZGUgaXMgZm9ybWF0dGVkIG5pY2VseSBvciBsZWZ0IHRvIG1hdGNoCisgICAgICogTmV0UmV4eCBsaW5lIG51bWJlcnMgZm9yIGNhbGwgc3RhY2sgZGVidWdnaW5nLgorICAgICAqIEBwYXJhbSBmb3JtYXQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXQoYm9vbGVhbiBmb3JtYXQpIHsKKyAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBjb2RlIGlzIHByb2R1Y2VkIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iCisgICAgICogb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICogZmFsc2UuCisgICAgICogQHBhcmFtIGphdmEgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhKGJvb2xlYW4gamF2YSkgeworICAgICAgICBsb2coIlRoZSBhdHRyaWJ1dGUgamF2YSBpcyBjdXJyZW50bHkgdW51c2VkLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBzb3VyY2UgZmlsZSBzaG91bGQgYmUga2VwdCBhZnRlcgorICAgICAqIGNvbXBpbGF0aW9uLiBUaGUgZ2VuZXJhdGVkIGZpbGVzIHdpbGwgaGF2ZSBhbiBleHRlbnNpb24gb2YgLmphdmEua2VlcCwKKyAgICAgKiA8Yj5ub3Q8L2I+IC5qYXZhIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZQorICAgICAqIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgorICAgICAqIEBwYXJhbSBrZWVwIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2VlcChib29sZWFuIGtlZXApIHsKKyAgICAgICAgdGhpcy5rZWVwID0ga2VlcDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGNvbXBpbGVyIHRleHQgbG9nbyBpcyBkaXNwbGF5ZWQgd2hlbiBjb21waWxpbmcuCisgICAgICogQHBhcmFtIGxvZ28gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dvKGJvb2xlYW4gbG9nbykgeworICAgICAgICB0aGlzLmxvZ28gPSBsb2dvOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgZ2VuZXJhdGVkIC5qYXZhIGZpbGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdoZW4gY29tcGlsaW5nCisgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8KKyAgICAgKiBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICogQHBhcmFtIHJlcGxhY2UgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlKGJvb2xlYW4gcmVwbGFjZSkgeworICAgICAgICB0aGlzLnJlcGxhY2UgPSByZXBsYWNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBjb21waWxlciBtZXNzYWdlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gTmV0UmV4eEMubG9nIGFzCisgICAgICogd2VsbCBhcyB0byB0aGUgY29uc29sZSBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nCisgICAgICogZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKiBAcGFyYW0gc2F2ZWxvZyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNhdmVsb2coYm9vbGVhbiBzYXZlbG9nKSB7CisgICAgICAgIHRoaXMuc2F2ZWxvZyA9IHNhdmVsb2c7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBzdG9yZSB0aGUgY2xhc3MgZmlsZXMgaW4gdGhlIHNhbWUKKyAgICAgKiBkaXJlY3RvcnkgYXMgdGhlIHNvdXJjZSBmaWxlcy4gVGhlIGFsdGVybmF0aXZlIGlzIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvCisgICAgICogZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICogQHBhcmFtIHNvdXJjZWRpciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZWRpcihib29sZWFuIHNvdXJjZWRpcikgeworICAgICAgICB0aGlzLnNvdXJjZWRpciA9IHNvdXJjZWRpcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc291cmNlIGRpciB0byBmaW5kIHRoZSBzb3VyY2UgSmF2YSBmaWxlcy4KKyAgICAgKiBAcGFyYW0gc3JjRGlyTmFtZSB0aGUgc291cmNlIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmNEaXIoRmlsZSBzcmNEaXJOYW1lKSB7CisgICAgICAgIHNyY0RpciA9IHNyY0Rpck5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0aGF0IG1ldGhvZCBjYWxscyBhbHdheXMgbmVlZCBwYXJlbnRoZXNlcywKKyAgICAgKiBldmVuIGlmIG5vIGFyZ3VtZW50cyBhcmUgbmVlZGVkLCBlLmcuIDxjb2RlPmFTdHJpbmdWYXIuZ2V0Qnl0ZXM8L2NvZGU+CisgICAgICogdnMuIDxjb2RlPmFTdHJpbmdWYXIuZ2V0Qnl0ZXMoKTwvY29kZT4gVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IKKyAgICAgKiAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAgICAgKiBmYWxzZS4KKyAgICAgKiBAcGFyYW0gc3RyaWN0YXJncyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdGFyZ3MoYm9vbGVhbiBzdHJpY3RhcmdzKSB7CisgICAgICAgIHRoaXMuc3RyaWN0YXJncyA9IHN0cmljdGFyZ3M7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlIHRoYXQgYXNzaWdubWVudHMgbXVzdCBtYXRjaCBleGFjdGx5IG9uIHR5cGUuCisgICAgICogQHBhcmFtIHN0cmljdGFzc2lnbiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdGFzc2lnbihib29sZWFuIHN0cmljdGFzc2lnbikgeworICAgICAgICB0aGlzLnN0cmljdGFzc2lnbiA9IHN0cmljdGFzc2lnbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSBvciBub3QuCisgICAgICogQHBhcmFtIHN0cmljdGNhc2UgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3RjYXNlKGJvb2xlYW4gc3RyaWN0Y2FzZSkgeworICAgICAgICB0aGlzLnN0cmljdGNhc2UgPSBzdHJpY3RjYXNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIGNsYXNzZXMgbmVlZCB0byBiZSBpbXBvcnRlZCBleHBsaWNpdGx5IHVzaW5nIGFuIDxjb2RlPmltcG9ydDwvY29kZT4KKyAgICAgKiBzdGF0ZW1lbnQuIEJ5IGRlZmF1bHQgdGhlIE5ldFJleHggY29tcGlsZXIgd2lsbCBpbXBvcnQgY2VydGFpbiBwYWNrYWdlcworICAgICAqIGF1dG9tYXRpY2FsbHkgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMKKyAgICAgKiB0aGUgZmxhZyB0byBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICogQHBhcmFtIHN0cmljdGltcG9ydCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdGltcG9ydChib29sZWFuIHN0cmljdGltcG9ydCkgeworICAgICAgICB0aGlzLnN0cmljdGltcG9ydCA9IHN0cmljdGltcG9ydDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBsb2NhbCBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgcXVhbGlmaWVkIGV4cGxpY2l0bHkgdXNpbmcKKyAgICAgKiA8Y29kZT50aGlzPC9jb2RlPiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2UKKyAgICAgKiBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKiBAcGFyYW0gc3RyaWN0cHJvcHMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3Rwcm9wcyhib29sZWFuIHN0cmljdHByb3BzKSB7CisgICAgICAgIHRoaXMuc3RyaWN0cHJvcHMgPSBzdHJpY3Rwcm9wczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGNvbXBpbGVyIHNob3VsZCBmb3JjZSBjYXRjaGluZyBvZiBleGNlcHRpb25zIGJ5IGV4cGxpY2l0bHkKKyAgICAgKiBuYW1lZCB0eXBlcy4KKyAgICAgKiBAcGFyYW0gc3RyaWN0c2lnbmFsIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RyaWN0c2lnbmFsKGJvb2xlYW4gc3RyaWN0c2lnbmFsKSB7CisgICAgICAgIHRoaXMuc3RyaWN0c2lnbmFsID0gc3RyaWN0c2lnbmFsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIGRlYnVnIHN5bWJvbHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbnRvIHRoZSBjbGFzcyBmaWxlCisgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8KKyAgICAgKiBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICogQHBhcmFtIHN5bWJvbHMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeW1ib2xzKGJvb2xlYW4gc3ltYm9scykgeworICAgICAgICB0aGlzLnN5bWJvbHMgPSBzeW1ib2xzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQXNrcyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBwcmludCBjb21waWxhdGlvbiB0aW1lcyB0byB0aGUgY29uc29sZQorICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvCisgICAgICogZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgorICAgICAqIEBwYXJhbSB0aW1lIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZShib29sZWFuIHRpbWUpIHsKKyAgICAgICAgdGhpcy50aW1lID0gdGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXJucyBvbiBvciBvZmYgdHJhY2luZyBhbmQgZGlyZWN0cyB0aGUgcmVzdWx0YW50IHRyYWNlIG91dHB1dCBWYWxpZAorICAgICAqIHZhbHVlcyBhcmU6ICJ0cmFjZSIsICJ0cmFjZTEiLCAidHJhY2UyIiBhbmQgIm5vdHJhY2UiLiAidHJhY2UiIGFuZAorICAgICAqICJ0cmFjZTIiLgorICAgICAqIEBwYXJhbSB0cmFjZSB0aGUgdmFsdWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYWNlKFRyYWNlQXR0ciB0cmFjZSkgeworICAgICAgICB0aGlzLnRyYWNlID0gdHJhY2UuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXJucyBvbiBvciBvZmYgdHJhY2luZyBhbmQgZGlyZWN0cyB0aGUgcmVzdWx0YW50IHRyYWNlIG91dHB1dCBWYWxpZAorICAgICAqIHZhbHVlcyBhcmU6ICJ0cmFjZSIsICJ0cmFjZTEiLCAidHJhY2UyIiBhbmQgIm5vdHJhY2UiLiAidHJhY2UiIGFuZAorICAgICAqICJ0cmFjZTIiLgorICAgICAqIEBwYXJhbSB0cmFjZSB0aGUgdmFsdWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYWNlKFN0cmluZyB0cmFjZSkgeworICAgICAgICBUcmFjZUF0dHIgdCA9IG5ldyBUcmFjZUF0dHIoKTsKKworICAgICAgICB0LnNldFZhbHVlKHRyYWNlKTsKKyAgICAgICAgc2V0VHJhY2UodCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0aGF0IHRoZSBzb3VyY2UgaXMgaW4gVVRGOCBWYWxpZCB0cnVlIHZhbHVlcworICAgICAqIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUgZGVmYXVsdAorICAgICAqIHZhbHVlIGlzIGZhbHNlLgorICAgICAqIEBwYXJhbSB1dGY4IGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXRmOChib29sZWFuIHV0ZjgpIHsKKyAgICAgICAgdGhpcy51dGY4ID0gdXRmODsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgbG90cyBvZiB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIGdlbmVyYXRlZAorICAgICAqIEBwYXJhbSB2ZXJib3NlIHRoZSB2YWx1ZSB0byBzZXQgLSB2ZXJib3NlJmx0O2xldmVsJmd0OyBvciBub3ZlcmJvc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShWZXJib3NlQXR0ciB2ZXJib3NlKSB7CisgICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2UuZ2V0VmFsdWUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgbG90cyBvZiB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIGdlbmVyYXRlZAorICAgICAqIEBwYXJhbSB2ZXJib3NlIHRoZSB2YWx1ZSB0byBzZXQgLSB2ZXJib3NlJmx0O2xldmVsJmd0OyBvciBub3ZlcmJvc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShTdHJpbmcgdmVyYm9zZSkgeworICAgICAgICBWZXJib3NlQXR0ciB2ID0gbmV3IFZlcmJvc2VBdHRyKCk7CisKKyAgICAgICAgdi5zZXRWYWx1ZSh2ZXJib3NlKTsKKyAgICAgICAgc2V0VmVyYm9zZSh2KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSB0YXNrIHNob3VsZCBzdXBwcmVzcyB0aGUgIk1ldGhvZCBhcmd1bWVudCBpcyBub3QgdXNlZCIgaW4KKyAgICAgKiBzdHJpY3RhcmdzLU1vZGUsIHdoaWNoIGNhbiBub3QgYmUgc3VwcHJlc3NlZCBieSB0aGUgY29tcGlsZXIgaXRzZWxmLgorICAgICAqIFRoZSB3YXJuaW5nIGlzIGxvZ2dlZCBhcyB2ZXJib3NlIG1lc3NhZ2UsIHRob3VnaC4KKyAgICAgKiBAcGFyYW0gc3VwcHJlc3NNZXRob2RBcmd1bWVudE5vdFVzZWQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc01ldGhvZEFyZ3VtZW50Tm90VXNlZChib29sZWFuIHN1cHByZXNzTWV0aG9kQXJndW1lbnROb3RVc2VkKSB7CisgICAgICAgIHRoaXMuc3VwcHJlc3NNZXRob2RBcmd1bWVudE5vdFVzZWQgPSBzdXBwcmVzc01ldGhvZEFyZ3VtZW50Tm90VXNlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN1cHByZXNzIHRoZSAiUHJpdmF0ZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGJ1dAorICAgICAqIG5vdCB1c2VkIiBpbiBzdHJpY3RhcmdzLU1vZGUsIHdoaWNoIGNhbiBiZSBxdWl0ZSBhbm5veWluZyB3aGlsZQorICAgICAqIGRldmVsb3BpbmcuIFRoZSB3YXJuaW5nIGlzIGxvZ2dlZCBhcyB2ZXJib3NlIG1lc3NhZ2UsIHRob3VnaC4KKyAgICAgKiBAcGFyYW0gc3VwcHJlc3NQcml2YXRlUHJvcGVydHlOb3RVc2VkIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VwcHJlc3NQcml2YXRlUHJvcGVydHlOb3RVc2VkKGJvb2xlYW4gc3VwcHJlc3NQcml2YXRlUHJvcGVydHlOb3RVc2VkKSB7CisgICAgICAgIHRoaXMuc3VwcHJlc3NQcml2YXRlUHJvcGVydHlOb3RVc2VkID0gc3VwcHJlc3NQcml2YXRlUHJvcGVydHlOb3RVc2VkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdGFzayBzaG91bGQgc3VwcHJlc3MgdGhlICJWYXJpYWJsZSBpcyBzZXQgYnV0IG5vdCB1c2VkIiBpbgorICAgICAqIHN0cmljdGFyZ3MtTW9kZS4gQmUgY2FyZWZ1bCB3aXRoIHRoaXMgb25lISBUaGUgd2FybmluZyBpcyBsb2dnZWQgYXMKKyAgICAgKiB2ZXJib3NlIG1lc3NhZ2UsIHRob3VnaC4KKyAgICAgKiBAcGFyYW0gc3VwcHJlc3NWYXJpYWJsZU5vdFVzZWQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc1ZhcmlhYmxlTm90VXNlZChib29sZWFuIHN1cHByZXNzVmFyaWFibGVOb3RVc2VkKSB7CisgICAgICAgIHRoaXMuc3VwcHJlc3NWYXJpYWJsZU5vdFVzZWQgPSBzdXBwcmVzc1ZhcmlhYmxlTm90VXNlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN1cHByZXNzIHRoZSAiRm9vRXhjZXB0aW9uIGlzIGluIFNJR05BTFMgbGlzdAorICAgICAqIGJ1dCBpcyBub3Qgc2lnbmFsbGVkIHdpdGhpbiB0aGUgbWV0aG9kIiwgd2hpY2ggaXMgc29tZXRpbWVzIHJhdGhlcgorICAgICAqIHVzZWxlc3MuIFRoZSB3YXJuaW5nIGlzIGxvZ2dlZCBhcyB2ZXJib3NlIG1lc3NhZ2UsIHRob3VnaC4KKyAgICAgKiBAcGFyYW0gc3VwcHJlc3NFeGNlcHRpb25Ob3RTaWduYWxsZWQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc0V4Y2VwdGlvbk5vdFNpZ25hbGxlZChib29sZWFuIHN1cHByZXNzRXhjZXB0aW9uTm90U2lnbmFsbGVkKSB7CisgICAgICAgIHRoaXMuc3VwcHJlc3NFeGNlcHRpb25Ob3RTaWduYWxsZWQgPSBzdXBwcmVzc0V4Y2VwdGlvbk5vdFNpZ25hbGxlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlbGxzIHdoZXRoZXIgd2Ugc2hvdWxkIGZpbHRlciBvdXQgYW55IGRlcHJlY2F0aW9uLW1lc3NhZ2VzCisgICAgICogb2YgdGhlIGNvbXBpbGVyIG91dC4KKyAgICAgKiBAcGFyYW0gc3VwcHJlc3NEZXByZWNhdGlvbiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1cHByZXNzRGVwcmVjYXRpb24oYm9vbGVhbiBzdXBwcmVzc0RlcHJlY2F0aW9uKSB7CisgICAgICAgIHRoaXMuc3VwcHJlc3NEZXByZWNhdGlvbiA9IHN1cHByZXNzRGVwcmVjYXRpb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBpbml0LU1ldGhvZCBzZXRzIGRlZmF1bHRzIGZyb20gUHJvcGVydGllcy4gVGhhdCB3YXksIHdoZW4gYW50IGlzIGNhbGxlZAorICAgICAqIHdpdGggYXJndW1lbnRzIGxpa2UgLURhbnQubmV0cmV4eGMudmVyYm9zZT12ZXJib3NlNSBvbmUgY2FuIGVhc2lseSB0YWtlCisgICAgICogY29udHJvbCBvZiBhbGwgbmV0cmV4eGMtdGFza3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgU3RyaW5nIHA7CisKKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMuYmluYXJ5IikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuYmluYXJ5ID0gUHJvamVjdC50b0Jvb2xlYW4ocCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2xhc3NwYXRoIG1ha2VzIG5vIHNlbnNlCisgICAgICAgIGlmICgocCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50Lm5ldHJleHhjLmNvbW1lbnRzIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWVudHMgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5jb21wYWN0IikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29tcGFjdCA9IFByb2plY3QudG9Cb29sZWFuKHApOworICAgICAgICB9CisgICAgICAgIGlmICgocCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50Lm5ldHJleHhjLmNvbXBpbGUiKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jb21waWxlID0gUHJvamVjdC50b0Jvb2xlYW4ocCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMuY29uc29sZSIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNvbnNvbGUgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5jcm9zc3JlZiIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNyb3NzcmVmID0gUHJvamVjdC50b0Jvb2xlYW4ocCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMuZGVjaW1hbCIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmRlY2ltYWwgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgICAgIC8vIGRlc3REaXIKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5kaWFnIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZGlhZyA9IFByb2plY3QudG9Cb29sZWFuKHApOworICAgICAgICB9CisgICAgICAgIGlmICgocCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50Lm5ldHJleHhjLmV4cGxpY2l0IikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZXhwbGljaXQgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5mb3JtYXQiKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5mb3JtYXQgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5rZWVwIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMua2VlcCA9IFByb2plY3QudG9Cb29sZWFuKHApOworICAgICAgICB9CisgICAgICAgIGlmICgocCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50Lm5ldHJleHhjLmxvZ28iKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5sb2dvID0gUHJvamVjdC50b0Jvb2xlYW4ocCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMucmVwbGFjZSIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnJlcGxhY2UgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5zYXZlbG9nIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc2F2ZWxvZyA9IFByb2plY3QudG9Cb29sZWFuKHApOworICAgICAgICAgICAgLy8gc3JjRGlyCisgICAgICAgIH0KKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMuc291cmNlZGlyIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc291cmNlZGlyID0gUHJvamVjdC50b0Jvb2xlYW4ocCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMuc3RyaWN0YXJncyIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnN0cmljdGFyZ3MgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5zdHJpY3Rhc3NpZ24iKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zdHJpY3Rhc3NpZ24gPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5zdHJpY3RjYXNlIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyaWN0Y2FzZSA9IFByb2plY3QudG9Cb29sZWFuKHApOworICAgICAgICB9CisgICAgICAgIGlmICgocCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50Lm5ldHJleHhjLnN0cmljdGltcG9ydCIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnN0cmljdGltcG9ydCA9IFByb2plY3QudG9Cb29sZWFuKHApOworICAgICAgICB9CisgICAgICAgIGlmICgocCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50Lm5ldHJleHhjLnN0cmljdHByb3BzIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyaWN0cHJvcHMgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5zdHJpY3RzaWduYWwiKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zdHJpY3RzaWduYWwgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5zeW1ib2xzIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc3ltYm9scyA9IFByb2plY3QudG9Cb29sZWFuKHApOworICAgICAgICB9CisgICAgICAgIGlmICgocCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50Lm5ldHJleHhjLnRpbWUiKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy50aW1lID0gUHJvamVjdC50b0Jvb2xlYW4ocCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMudHJhY2UiKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0VHJhY2UocCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMudXRmOCIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnV0ZjggPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy52ZXJib3NlIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFZlcmJvc2UocCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMuc3VwcHJlc3NNZXRob2RBcmd1bWVudE5vdFVzZWQiKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zdXBwcmVzc01ldGhvZEFyZ3VtZW50Tm90VXNlZCA9IFByb2plY3QudG9Cb29sZWFuKHApOworICAgICAgICB9CisgICAgICAgIGlmICgocCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50Lm5ldHJleHhjLnN1cHByZXNzUHJpdmF0ZVByb3BlcnR5Tm90VXNlZCIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnN1cHByZXNzUHJpdmF0ZVByb3BlcnR5Tm90VXNlZCA9IFByb2plY3QudG9Cb29sZWFuKHApOworICAgICAgICB9CisgICAgICAgIGlmICgocCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50Lm5ldHJleHhjLnN1cHByZXNzVmFyaWFibGVOb3RVc2VkIikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc3VwcHJlc3NWYXJpYWJsZU5vdFVzZWQgPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHAgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5uZXRyZXh4Yy5zdXBwcmVzc0V4Y2VwdGlvbk5vdFNpZ25hbGxlZCIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnN1cHByZXNzRXhjZXB0aW9uTm90U2lnbmFsbGVkID0gUHJvamVjdC50b0Jvb2xlYW4ocCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQubmV0cmV4eGMuc3VwcHJlc3NEZXByZWNhdGlvbiIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnN1cHByZXNzRGVwcmVjYXRpb24gPSBQcm9qZWN0LnRvQm9vbGVhbihwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2sgLSBwZXJmb3JtcyB0aGUgYWN0dWFsIGNvbXBpbGVyIGNhbGwuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBmaXJzdCBvZmYsIG1ha2Ugc3VyZSB0aGF0IHdlJ3ZlIGdvdCBhIHNyY2RpciBhbmQgZGVzdGRpcgorICAgICAgICBpZiAoc3JjRGlyID09IG51bGwgfHwgZGVzdERpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY0RpciBhbmQgZGVzdERpciBhdHRyaWJ1dGVzIG11c3QgYmUgc2V0ISIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2NhbiBzb3VyY2UgYW5kIGRlc3QgZGlycyB0byBidWlsZCB1cCBib3RoIGNvcHkgbGlzdHMgYW5kCisgICAgICAgIC8vIGNvbXBpbGUgbGlzdHMKKyAgICAgICAgLy8gICAgICAgIHNjYW5EaXIoc3JjRGlyLCBkZXN0RGlyKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGdldERpcmVjdG9yeVNjYW5uZXIoc3JjRGlyKTsKKworICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKworICAgICAgICBzY2FuRGlyKHNyY0RpciwgZGVzdERpciwgZmlsZXMpOworCisgICAgICAgIC8vIGNvcHkgdGhlIHNvdXJjZSBhbmQgc3VwcG9ydCBmaWxlcworICAgICAgICBjb3B5RmlsZXNUb0Rlc3RpbmF0aW9uKCk7CisKKyAgICAgICAgLy8gY29tcGlsZSB0aGUgc291cmNlIGZpbGVzCisgICAgICAgIGlmIChjb21waWxlTGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgY29tcGlsZUxpc3Quc2l6ZSgpICsgIiBzb3VyY2UgZmlsZSIKKyAgICAgICAgICAgICAgICAgKyAoY29tcGlsZUxpc3Quc2l6ZSgpID09IDEgPyAiIiA6ICJzIikKKyAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyBkZXN0RGlyKTsKKyAgICAgICAgICAgIGRvTmV0UmV4eENvbXBpbGUoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2NhbnMgdGhlIGRpcmVjdG9yeSBsb29raW5nIGZvciBzb3VyY2UgZmlsZXMgdG8gYmUgY29tcGlsZWQgYW5kIHN1cHBvcnQKKyAgICAgKiBmaWxlcyB0byBiZSBjb3BpZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNjYW5EaXIoRmlsZSBzcmNEaXIsIEZpbGUgZGVzdERpciwgU3RyaW5nW10gZmlsZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCBmaWxlc1tpXSk7CisgICAgICAgICAgICBGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZXNbaV07CisgICAgICAgICAgICAvLyBpZiBpdCdzIGEgbm9uIHNvdXJjZSBmaWxlLCBjb3B5IGl0IGlmIGEgbGF0ZXIgZGF0ZSB0aGFuIHRoZQorICAgICAgICAgICAgLy8gZGVzdAorICAgICAgICAgICAgLy8gaWYgaXQncyBhIHNvdXJjZSBmaWxlLCBzZWUgaWYgdGhlIGRlc3RpbmF0aW9uIGNsYXNzIGZpbGUKKyAgICAgICAgICAgIC8vIG5lZWRzIHRvIGJlIHJlY3JlYXRlZCB2aWEgY29tcGlsYXRpb24KKyAgICAgICAgICAgIGlmIChmaWxlbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIubnJ4IikpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGNsYXNzRmlsZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRlc3REaXIsCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpKSArICIuY2xhc3MiKTsKKworICAgICAgICAgICAgICAgIGlmICghY29tcGlsZSB8fCBzcmNGaWxlLmxhc3RNb2RpZmllZCgpID4gY2xhc3NGaWxlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVjb3B5TGlzdC5wdXQoc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBjb21waWxlTGlzdC5hZGRFbGVtZW50KGRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzcmNGaWxlLmxhc3RNb2RpZmllZCgpID4gZGVzdEZpbGUubGFzdE1vZGlmaWVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZWNvcHlMaXN0LnB1dChzcmNGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiogQ29weSBlbGlnaWJsZSBmaWxlcyBmcm9tIHRoZSBzcmNEaXIgdG8gZGVzdERpciAgKi8KKyAgICBwcml2YXRlIHZvaWQgY29weUZpbGVzVG9EZXN0aW5hdGlvbigpIHsKKyAgICAgICAgaWYgKGZpbGVjb3B5TGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBsb2coIkNvcHlpbmcgIiArIGZpbGVjb3B5TGlzdC5zaXplKCkgKyAiIGZpbGUiCisgICAgICAgICAgICAgICAgICsgKGZpbGVjb3B5TGlzdC5zaXplKCkgPT0gMSA/ICIiIDogInMiKQorICAgICAgICAgICAgICAgICArICIgdG8gIiArIGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZmlsZWNvcHlMaXN0LmtleXMoKTsKKworICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnJvbUZpbGUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRvRmlsZSA9IChTdHJpbmcpIGZpbGVjb3B5TGlzdC5nZXQoZnJvbUZpbGUpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLmNvcHlGaWxlKGZyb21GaWxlLCB0b0ZpbGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBjb3B5ICIgKyBmcm9tRmlsZSArICIgdG8gIiArIHRvRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkdWUgdG8gIiArIGlvZS5nZXRNZXNzYWdlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKiBQZXJmb3JtcyBhIGNvbXBpbGUgdXNpbmcgdGhlIE5ldFJleHggMS4xLnggY29tcGlsZXIgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvTmV0UmV4eENvbXBpbGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBsb2coIlVzaW5nIE5ldFJleHggY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBTdHJpbmcgY2xhc3NwYXRoID0gZ2V0Q29tcGlsZUNsYXNzcGF0aCgpOworICAgICAgICBTdHJpbmdCdWZmZXIgY29tcGlsZU9wdGlvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuIGFycmF5IG9mIHN0cmluZ3MgZm9yIGlucHV0IHRvIHRoZSBjb21waWxlcjogb25lIGFycmF5CisgICAgICAgIC8vIGNvbWVzIGZyb20gdGhlIGNvbXBpbGUgb3B0aW9ucywgdGhlIG90aGVyIGZyb20gdGhlIGNvbXBpbGVMaXN0CisgICAgICAgIFN0cmluZ1tdIGNvbXBpbGVPcHRpb25zQXJyYXkgPSBnZXRDb21waWxlT3B0aW9uc0FzQXJyYXkoKTsKKyAgICAgICAgU3RyaW5nW10gZmlsZUxpc3RBcnJheSA9IG5ldyBTdHJpbmdbY29tcGlsZUxpc3Quc2l6ZSgpXTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IGNvbXBpbGVMaXN0LmVsZW1lbnRzKCk7CisgICAgICAgIGludCBqID0gMDsKKworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgZmlsZUxpc3RBcnJheVtqXSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICAvLyBjcmVhdGUgYSBzaW5nbGUgYXJyYXkgb2YgYXJndW1lbnRzIGZvciB0aGUgY29tcGlsZXIKKyAgICAgICAgU3RyaW5nW10gY29tcGlsZUFyZ3MgPSBuZXcgU3RyaW5nW2NvbXBpbGVPcHRpb25zQXJyYXkubGVuZ3RoICsgZmlsZUxpc3RBcnJheS5sZW5ndGhdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGlsZU9wdGlvbnNBcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29tcGlsZUFyZ3NbaV0gPSBjb21waWxlT3B0aW9uc0FycmF5W2ldOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3RBcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29tcGlsZUFyZ3NbaSArIGNvbXBpbGVPcHRpb25zQXJyYXkubGVuZ3RoXSA9IGZpbGVMaXN0QXJyYXlbaV07CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmludCBuaWNlIG91dHB1dCBhYm91dCB3aGF0IHdlIGFyZSBkb2luZyBmb3IgdGhlIGxvZworICAgICAgICBjb21waWxlT3B0aW9ucy5hcHBlbmQoIkNvbXBpbGF0aW9uIGFyZ3M6ICIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBpbGVPcHRpb25zQXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbXBpbGVPcHRpb25zLmFwcGVuZChjb21waWxlT3B0aW9uc0FycmF5W2ldKTsKKyAgICAgICAgICAgIGNvbXBpbGVPcHRpb25zLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIGxvZyhjb21waWxlT3B0aW9ucy50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICBTdHJpbmdCdWZmZXIgbmljZVNvdXJjZUxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWxlcyB0byBiZSBjb21waWxlZDoiICsgZW9sKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBpbGVMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoIiAgICAiKTsKKyAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChjb21waWxlTGlzdC5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoZW9sKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZyhuaWNlU291cmNlTGlzdC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAvLyBuZWVkIHRvIHNldCBqYXZhLmNsYXNzLnBhdGggcHJvcGVydHkgYW5kIHJlc3RvcmUgaXQgbGF0ZXIKKyAgICAgICAgLy8gc2luY2UgdGhlIE5ldFJleHggY29tcGlsZXIgaGFzIG5vIG9wdGlvbiBmb3IgdGhlIGNsYXNzcGF0aAorICAgICAgICBTdHJpbmcgY3VycmVudENsYXNzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7CisgICAgICAgIFByb3BlcnRpZXMgY3VycmVudFByb3BlcnRpZXMgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOworCisgICAgICAgIGN1cnJlbnRQcm9wZXJ0aWVzLnB1dCgiamF2YS5jbGFzcy5wYXRoIiwgY2xhc3NwYXRoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nV3JpdGVyIG91dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgIGludCByYyA9CisgICAgICAgICAgICAgICAgQ09NLmlibS5uZXRyZXh4LnByb2Nlc3MuTmV0UmV4eEMubWFpbihuZXcgUmV4eChjb21waWxlQXJncyksIG5ldyBQcmludFdyaXRlcihvdXQpKTsKKyAgICAgICAgICAgIFN0cmluZyBzZGlyID0gc3JjRGlyLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIGRkaXIgPSBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgYm9vbGVhbiBkb1JlcGxhY2UgPSAhKHNkaXIuZXF1YWxzKGRkaXIpKTsKKyAgICAgICAgICAgIGludCBkbGVuID0gZGRpci5sZW5ndGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBsOworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihvdXQudG9TdHJpbmcoKSkpOworCisgICAgICAgICAgICBsb2coInJlcGxhY2luZyBkZXN0ZGlyICciICsgZGRpciArICInIHRocm91Z2ggc291cmNlZGlyICciCisgICAgICAgICAgICAgICAgKyBzZGlyICsgIiciLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHdoaWxlICgobCA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4OworCisgICAgICAgICAgICAgICAgd2hpbGUgKGRvUmVwbGFjZSAmJiAoKGlkeCA9IGwuaW5kZXhPZihkZGlyKSkgIT0gLTEpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggaXMgbWVudGlvbmVkIGluIHRoZSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIGwgPSAobmV3IFN0cmluZ0J1ZmZlcihsKSkucmVwbGFjZShpZHgsIGlkeCArIGRsZW4sIHNkaXIpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHZlcmJvc2UgbGV2ZWwgbG9nZ2luZyBmb3Igc3VwcHJlc3NlZCBtZXNzYWdlcworICAgICAgICAgICAgICAgIGlmIChzdXBwcmVzc01ldGhvZEFyZ3VtZW50Tm90VXNlZAorICAgICAgICAgICAgICAgICAgICAmJiBsLmluZGV4T2YoTVNHX01FVEhPRF9BUkdVTUVOVF9OT1RfVVNFRCkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKGwsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VwcHJlc3NQcml2YXRlUHJvcGVydHlOb3RVc2VkCisgICAgICAgICAgICAgICAgICAgICYmIGwuaW5kZXhPZihNU0dfUFJJVkFURV9QUk9QRVJUWV9OT1RfVVNFRCkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKGwsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VwcHJlc3NWYXJpYWJsZU5vdFVzZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgbC5pbmRleE9mKE1TR19WQVJJQUJMRV9OT1RfVVNFRCkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKGwsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VwcHJlc3NFeGNlcHRpb25Ob3RTaWduYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgbC5pbmRleE9mKE1TR19FWENFUFRJT05fTk9UX1NJR05BTExFRCkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKGwsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VwcHJlc3NEZXByZWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiBsLmluZGV4T2YoTVNHX0RFUFJFQ0FUSU9OKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBsb2cobCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsLmluZGV4T2YoIkVycm9yOiIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIGxldmVsIGxvZ2dpbmcgZm9yIGNvbXBpbGVyIGVycm9ycworICAgICAgICAgICAgICAgICAgICBsb2cobCwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGwuaW5kZXhPZigiV2FybmluZzoiKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAvLyB3YXJuaW5nIGZvciBhbGwgd2FybmluZyBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICBsb2cobCwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKGwsIFByb2plY3QuTVNHX0lORk8pOyAvLyBpbmZvIGxldmVsIGZvciB0aGUgcmVzdC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmMgPiAxKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb21waWxlIGZhaWxlZCwgbWVzc2FnZXMgc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaGF2ZSBiZWVuIHByb3ZpZGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5leHBlY3RlZCBJT0V4Y2VwdGlvbiB3aGlsZSAiCisgICAgICAgICAgICAgICAgKyAicGxheWluZyB3aXRoIFN0cmluZ3MiLCBpb2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gbmVlZCB0byByZXNldCBqYXZhLmNsYXNzLnBhdGggcHJvcGVydHkKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBOZXRSZXh4IGNvbXBpbGVyIGhhcyBubyBvcHRpb24gZm9yIHRoZSBjbGFzc3BhdGgKKyAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0aWVzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0aWVzLnB1dCgiamF2YS5jbGFzcy5wYXRoIiwgY3VycmVudENsYXNzUGF0aCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqIEJ1aWxkcyB0aGUgY29tcGlsYXRpb24gY2xhc3NwYXRoLiAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRDb21waWxlQ2xhc3NwYXRoKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgY2xhc3NwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIC8vIGFkZCBkZXN0IGRpciB0byBjbGFzc3BhdGggc28gdGhhdCBwcmV2aW91c2x5IGNvbXBpbGVkIGFuZAorICAgICAgICAvLyB1bnRvdWNoZWQgY2xhc3NlcyBhcmUgb24gY2xhc3NwYXRoCisgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoZGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgLy8gYWRkIG91ciBjbGFzc3BhdGggdG8gdGhlIG1peAorICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkRXhpc3RpbmdUb0NsYXNzcGF0aChjbGFzc3BhdGgsIHRoaXMuY2xhc3NwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCB0aGUgc3lzdGVtIGNsYXNzcGF0aAorICAgICAgICAvLyBhZGRFeGlzdGluZ1RvQ2xhc3NwYXRoKGNsYXNzcGF0aCxTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aC50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoqIFRoaXMgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRDb21waWxlT3B0aW9uc0FzQXJyYXkoKSB7CisgICAgICAgIFZlY3RvciBvcHRpb25zID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChiaW5hcnkgPyAiLWJpbmFyeSIgOiAiLW5vYmluYXJ5Iik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChjb21tZW50cyA/ICItY29tbWVudHMiIDogIi1ub2NvbW1lbnRzIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChjb21waWxlID8gIi1jb21waWxlIiA6ICItbm9jb21waWxlIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChjb21wYWN0ID8gIi1jb21wYWN0IiA6ICItbm9jb21wYWN0Iik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChjb25zb2xlID8gIi1jb25zb2xlIiA6ICItbm9jb25zb2xlIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChjcm9zc3JlZiA/ICItY3Jvc3NyZWYiIDogIi1ub2Nyb3NzcmVmIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChkZWNpbWFsID8gIi1kZWNpbWFsIiA6ICItbm9kZWNpbWFsIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChkaWFnID8gIi1kaWFnIiA6ICItbm9kaWFnIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChleHBsaWNpdCA/ICItZXhwbGljaXQiIDogIi1ub2V4cGxpY2l0Iik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChmb3JtYXQgPyAiLWZvcm1hdCIgOiAiLW5vZm9ybWF0Iik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChrZWVwID8gIi1rZWVwIiA6ICItbm9rZWVwIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChsb2dvID8gIi1sb2dvIiA6ICItbm9sb2dvIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChyZXBsYWNlID8gIi1yZXBsYWNlIiA6ICItbm9yZXBsYWNlIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzYXZlbG9nID8gIi1zYXZlbG9nIiA6ICItbm9zYXZlbG9nIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzb3VyY2VkaXIgPyAiLXNvdXJjZWRpciIgOiAiLW5vc291cmNlZGlyIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzdHJpY3RhcmdzID8gIi1zdHJpY3RhcmdzIiA6ICItbm9zdHJpY3RhcmdzIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzdHJpY3Rhc3NpZ24gPyAiLXN0cmljdGFzc2lnbiIgOiAiLW5vc3RyaWN0YXNzaWduIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzdHJpY3RjYXNlID8gIi1zdHJpY3RjYXNlIiA6ICItbm9zdHJpY3RjYXNlIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzdHJpY3RpbXBvcnQgPyAiLXN0cmljdGltcG9ydCIgOiAiLW5vc3RyaWN0aW1wb3J0Iik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzdHJpY3Rwcm9wcyA/ICItc3RyaWN0cHJvcHMiIDogIi1ub3N0cmljdHByb3BzIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzdHJpY3RzaWduYWwgPyAiLXN0cmljdHNpZ25hbCIgOiAiLW5vc3RyaWN0c2lnbmFsIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudChzeW1ib2xzID8gIi1zeW1ib2xzIiA6ICItbm9zeW1ib2xzIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCh0aW1lID8gIi10aW1lIiA6ICItbm90aW1lIik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCgiLSIgKyB0cmFjZSk7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCh1dGY4ID8gIi11dGY4IiA6ICItbm91dGY4Iik7CisgICAgICAgIG9wdGlvbnMuYWRkRWxlbWVudCgiLSIgKyB2ZXJib3NlKTsKKworICAgICAgICBTdHJpbmdbXSByZXN1bHRzID0gbmV3IFN0cmluZ1tvcHRpb25zLnNpemUoKV07CisKKyAgICAgICAgb3B0aW9ucy5jb3B5SW50byhyZXN1bHRzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUYWtlcyBhIGNsYXNzcGF0aC1saWtlIHN0cmluZywgYW5kIGFkZHMgZWFjaCBlbGVtZW50IG9mIHRoaXMgc3RyaW5nIHRvCisgICAgICogYSBuZXcgY2xhc3NwYXRoLCBpZiB0aGUgY29tcG9uZW50cyBleGlzdC4gQ29tcG9uZW50cyB0aGF0IGRvbid0IGV4aXN0LAorICAgICAqIGFyZW4ndCBhZGRlZC4gV2UgZG8gdGhpcywgYmVjYXVzZSBqaWtlcyBpc3N1ZXMgd2FybmluZ3MgZm9yCisgICAgICogbm9uLWV4aXN0YW50IGZpbGVzL2RpcnMgaW4gaGlzIGNsYXNzcGF0aCwgYW5kIHRoZXNlIHdhcm5pbmdzIGFyZSBwcmV0dHkKKyAgICAgKiBhbm5veWluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgLSB0YXJnZXQgY2xhc3NwYXRoCisgICAgICogQHBhcmFtIHNvdXJjZSAtIHNvdXJjZSBjbGFzc3BhdGggdG8gZ2V0IGZpbGUgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkRXhpc3RpbmdUb0NsYXNzcGF0aChTdHJpbmdCdWZmZXIgdGFyZ2V0LCBTdHJpbmcgc291cmNlKSB7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNvdXJjZSwKKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKSwgZmFsc2UpOworCisgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBGaWxlIGYgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUodG9rLm5leHRUb2tlbigpKTsKKworICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgdGFyZ2V0LmFwcGVuZChmLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJEcm9wcGluZyBmcm9tIGNsYXNzcGF0aDogIgorICAgICAgICAgICAgICAgICAgICArIGYuZ2V0QWJzb2x1dGVQYXRoKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZWQgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgdHJhY2UgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJhY2VBdHRyIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsidHJhY2UiLCAidHJhY2UxIiwgInRyYWNlMiIsICJub3RyYWNlIn07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVkIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZlcmJvc2UgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmVyYm9zZUF0dHIgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyJ2ZXJib3NlIiwgInZlcmJvc2UwIiwgInZlcmJvc2UxIiwKKyAgICAgICAgICAgICAgICAidmVyYm9zZTIiLCAidmVyYm9zZTMiLCAidmVyYm9zZTQiLAorICAgICAgICAgICAgICAgICJ2ZXJib3NlNSIsICJub3ZlcmJvc2UifTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUHJvcGVydHlGaWxlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Qcm9wZXJ0eUZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzAzZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUHJvcGVydHlGaWxlLmphdmEKQEAgLTAsMCArMSw2NjYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworCisvKioKKyAqTW9kaWZpZXMgc2V0dGluZ3MgaW4gYSBwcm9wZXJ0eSBmaWxlLgorICoKKyAqIDxwPgorICpUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaXRzIHVzYWdlOgorICogICAgPHVsPiZsdDt0YXJnZXQgbmFtZT0ic2V0U3RhdGUiJmd0Ozxicj4KKyAqICAgIDx1bD4mbHQ7cHJvcGVydHk8YnI+CisgKiAgICAgICAgPHVsPm5hbWU9ImhlYWRlciI8YnI+CisgKiAgICAgICAgdmFsdWU9IiMjR2VuZXJhdGVkIGZpbGUgLSBkbyBub3QgbW9kaWZ5ISIvJmd0Ozxicj4KKyAqICAgICAgJmx0O3Byb3BlcnR5ZmlsZSBmaWxlPSJhcHJvcGZpbGUucHJvcGVydGllcyIgY29tbWVudD0iJHtoZWFkZXJ9IiZndDs8YnI+CisgKiAgICAgICAgJmx0O2VudHJ5IGtleT0icHJvZHVjdC52ZXJzaW9uLm1ham9yIiB0eXBlPSJpbnQiICB2YWx1ZT0iNSIvJmd0Ozxicj4KKyAqICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LnZlcnNpb24ubWlub3IiIHR5cGU9ImludCIgIHZhbHVlPSIwIi8mZ3Q7PGJyPgorICogICAgICAgICZsdDtlbnRyeSBrZXk9InByb2R1Y3QuYnVpbGQubWFqb3IiICAgdHlwZT0iaW50IiAgdmFsdWU9IjAiIC8mZ3Q7PGJyPgorICogICAgICAgICZsdDtlbnRyeSBrZXk9InByb2R1Y3QuYnVpbGQubWlub3IiICAgdHlwZT0iaW50IiAgb3BlcmF0aW9uPSIrIiAvJmd0Ozxicj4KKyAqICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLmRhdGUiICAgIHR5cGU9ImRhdGUiIHZhbHVlPSJub3ciIC8mZ3Q7PGJyPgorICogICAgICAgICZsdDtlbnRyeSBrZXk9ImludFNldCIgdHlwZT0iaW50IiBvcGVyYXRpb249Ij0iIHZhbHVlPSI2ODEiLyZndDs8YnI+CisgKiAgICAgICAgJmx0O2VudHJ5IGtleT0iaW50RGVjIiB0eXBlPSJpbnQiIG9wZXJhdGlvbj0iLSIvJmd0Ozxicj4KKyAqICAgICAgICAmbHQ7ZW50cnkga2V5PSJTdHJpbmdFcXVhbHMiIHR5cGU9InN0cmluZyIgdmFsdWU9InRlc3RWYWx1ZSIvJmd0Ozxicj4KKyAqICAgICAmbHQ7L3Byb3BlcnR5ZmlsZSZndDs8YnI+PC91bD4KKyAqICAgJmx0Oy90YXJnZXQmZ3Q7PC91bD48cD4KKyAqCisgKlRoZSAmbHQ7cHJvcGVydHlmaWxlJmd0OyB0YXNrIG11c3QgaGF2ZTo8YnI+CisgKiAgICA8dWw+PGxpPmZpbGU8L2xpPjwvdWw+CisgKk90aGVyIHBhcmFtZXRlcnMgYXJlOjxicj4KKyAqICAgIDx1bD48bGk+Y29tbWVudCwga2V5LCBvcGVyYXRpb24sIHR5cGUgYW5kIHZhbHVlICh0aGUgZmluYWwgZm91ciBiZWluZworICogICAgICAgICAgICBlbGltaW5hdGVkIHNob3J0bHkpPC9saT48L3VsPgorICoKKyAqVGhlICZsdDtlbnRyeSZndDsgdGFzayBtdXN0IGhhdmU6PGJyPgorICogICAgPHVsPjxsaT5rZXk8L2xpPjwvdWw+CisgKk90aGVyIHBhcmFtZXRlcnMgYXJlOjxicj4KKyAqICAgIDx1bD48bGk+b3BlcmF0aW9uPC9saT4KKyAqICAgICAgICA8bGk+dHlwZTwvbGk+CisgKiAgICAgICAgPGxpPnZhbHVlPC9saT4KKyAqICAgICAgICA8bGk+ZGVmYXVsdDwvbGk+CisgKiAgICAgICAgPGxpPnVuaXQ8L2xpPgorICogICAgPC91bD4KKyAqCisgKklmIHR5cGUgaXMgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHN0cmluZworICoKKyAqUGFyYW1ldGVyIHZhbHVlczo8YnI+CisgKiAgICA8dWw+PGxpPm9wZXJhdGlvbjo8L2xpPgorICogICAgICAgIDx1bD48bGk+Ij0iIChzZXQgLS0gZGVmYXVsdCk8L2xpPgorICogICAgICAgIDxsaT4iLSIgKGRlYyk8L2xpPgorICogICAgICAgIDxsaT4iKyIgKGluYyk8L2xpPgorICoKKyAqICAgIDxsaT50eXBlOjwvbGk+CisgKiAgICAgICAgPHVsPjxsaT4iaW50IjwvbGk+CisgKiAgICAgICAgPGxpPiJkYXRlIjwvbGk+CisgKiAgICAgICAgPGxpPiJzdHJpbmciPC9saT48L3VsPjwvdWw+CisgKgorICogICAgPGxpPnZhbHVlOjwvbGk+CisgKiAgICAgIDx1bD48bGk+aG9sZHMgdGhlIGRlZmF1bHQgdmFsdWUsIGlmIHRoZSBwcm9wZXJ0eQorICogICAgICAgICAgICAgIHdhcyBub3QgZm91bmQgaW4gcHJvcGVydHkgZmlsZTwvbGk+CisgKiAgICAgICAgICA8bGk+Im5vdyIgSW4gY2FzZSBvZiB0eXBlICJkYXRlIiwgdGhlCisgKiAgICAgICAgICAgICAgdmFsdWUgIm5vdyIgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudAorICogICAgICAgICAgICAgIGRhdGUvdGltZSBhbmQgdXNlZCBldmVuIGlmIGEgdmFsaWQgZGF0ZSB3YXMKKyAqICAgICAgICAgICAgICBmb3VuZCBpbiB0aGUgcHJvcGVydHkgZmlsZS48L2xpPjwvdWw+CisgKgorICoKKyAqU3RyaW5nIHByb3BlcnR5IHR5cGVzIGNhbiBvbmx5IHVzZSB0aGUgIj0iIG9wZXJhdGlvbi4KKyAqSW50IHByb3BlcnR5IHR5cGVzIGNhbiBvbmx5IHVzZSB0aGUgIj0iLCAiLSIgb3IgIisiIG9wZXJhdGlvbnMuPHA+CisgKgorICpUaGUgbWVzc2FnZSBwcm9wZXJ0eSBpcyB1c2VkIGZvciB0aGUgcHJvcGVydHkgZmlsZSBoZWFkZXIsIHdpdGggIlxcIiBiZWluZworICphIG5ld2xpbmUgZGVsaW1pdGVyIGNoYXJhY3Rlci4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eUZpbGUgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICoKKyAgICAqIEluc3RhbmNlIHZhcmlhYmxlcy4KKyAgICAqLworCisgICAgLy8gVXNlIHRoaXMgdG8gcHJlcGVuZCBhIG1lc3NhZ2UgdG8gdGhlIHByb3BlcnRpZXMgZmlsZQorICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBjb21tZW50OworCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzICAgICAgICAgIHByb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBGaWxlICAgICAgICAgICAgICAgIHByb3BlcnR5ZmlsZTsKKworICAgIHByaXZhdGUgVmVjdG9yIGVudHJpZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAqCisgICAgKiBDb25zdHJ1Y3RvcnMKKyAgICAqLworCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgKgorICAgICogTWV0aG9kcworICAgICovCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrUGFyYW1ldGVycygpOworICAgICAgICByZWFkRmlsZSgpOworICAgICAgICBleGVjdXRlT3BlcmF0aW9uKCk7CisgICAgICAgIHdyaXRlRmlsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlbnRyeSBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIGFuIGVudHJ5IG5lc3RlZCBlbGVtZW50IHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIEVudHJ5IGNyZWF0ZUVudHJ5KCkgeworICAgICAgICBFbnRyeSBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgIGVudHJpZXMuYWRkRWxlbWVudChlKTsKKyAgICAgICAgcmV0dXJuIGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPcGVyYXRpb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBlbnRyaWVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgZW50cnkuZXhlY3V0ZU9uKHByb3BlcnRpZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRGaWxlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBQcm9wZXJ0eUZpbGUKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocHJvcGVydHlmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgbG9nKCJVcGRhdGluZyBwcm9wZXJ0eSBmaWxlOiAiCisgICAgICAgICAgICAgICAgICAgICsgcHJvcGVydHlmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHByb3BlcnR5ZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmlzKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5sb2FkKGJpcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJDcmVhdGluZyBuZXcgcHJvcGVydHkgZmlsZTogIgorICAgICAgICAgICAgICAgICAgICArIHByb3BlcnR5ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHByb3BlcnR5ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1BhcmFtZXRlcnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoIWNoZWNrUGFyYW0ocHJvcGVydHlmaWxlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmaWxlIHRva2VuIG11c3Qgbm90IGJlIG51bGwuIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGlvbiBvZiB0aGUgcHJvcGVydHkgZmlsZSB0byBiZSBlZGl0ZWQ7IHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBwcm9wZXJ0eSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIHByb3BlcnR5ZmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogb3B0aW9uYWwgaGVhZGVyIGNvbW1lbnQgZm9yIHRoZSBmaWxlCisgICAgICogQHBhcmFtIGhkciB0aGUgc3RyaW5nIHRvIHVzZSBmb3IgdGhlIGNvbW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgaGRyKSB7CisgICAgICAgIGNvbW1lbnQgPSBoZHI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlRmlsZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ocHJvcGVydHlmaWxlKSk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKGJvcywgY29tbWVudCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoYm9zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1BhcmFtKEZpbGUgcGFyYW0pIHsKKyAgICAgICAgcmV0dXJuICEocGFyYW0gPT0gbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyByZXByZXNlbnRzIG5lc3RlZCBlbGVtZW50cyBvZgorICAgICAqIGEgdGFzayBwcm9wZXJ0eWZpbGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRyeSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOVF9WQUxVRSA9IDA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RBVEVfVkFMVUUgPSAibm93IjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1RSSU5HX1ZBTFVFID0gIiI7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIGtleSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICB0eXBlID0gVHlwZS5TVFJJTkdfVFlQRTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IE9wZXJhdGlvbi5FUVVBTFNfT1BFUjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBuZXdWYWx1ZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBwYXR0ZXJuID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgIGZpZWxkID0gQ2FsZW5kYXIuREFURTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTmFtZSBvZiB0aGUgcHJvcGVydHkgbmFtZS92YWx1ZSBwYWlyCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5rZXkgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBWYWx1ZSB0byBzZXQgKD0pLCB0byBhZGQgKCspIG9yIHN1YnRyYWN0ICgtKQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogb3BlcmF0aW9uIHRvIGFwcGx5LgorICAgICAgICAgKiAmcXVvdDsrJnF1b3Q7IG9yICZxdW90Oz0mcXVvdDsKKyAgICAgICAgICooZGVmYXVsdCkgZm9yIGFsbCBkYXRhdHlwZXM7ICZxdW90Oy0mcXVvdDsgZm9yIGRhdGUgYW5kIGludCBvbmx5KVwuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgb3BlcmF0aW9uIGVudW1lcmF0ZWQgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb24oT3BlcmF0aW9uIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IE9wZXJhdGlvbi50b09wZXJhdGlvbih2YWx1ZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWdhcmQgdGhlIHZhbHVlIGFzIDogaW50LCBkYXRlIG9yIHN0cmluZyAoZGVmYXVsdCkKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB0eXBlIGVudW1lcmF0ZWQgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IFR5cGUudG9UeXBlKHZhbHVlLmdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWwgdmFsdWUgdG8gc2V0IGZvciBhIHByb3BlcnR5IGlmIGl0IGlzIG5vdAorICAgICAgICAgKiBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIHByb3BlcnR5IGZpbGUuCisgICAgICAgICAqIEZvciB0eXBlIGRhdGUsIGFuIGFkZGl0aW9uYWwga2V5d29yZCBpcyBhbGxvd2VkOiAmcXVvdDtub3cmcXVvdDsKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIGludCBhbmQgZGF0ZSB0eXBlIG9ubHkuIElmIHByZXNlbnQsIFZhbHVlcyB3aWxsCisgICAgICAgICAqIGJlIHBhcnNlZCBhbmQgZm9ybWF0dGVkIGFjY29yZGluZ2x5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHBhdHRlcm4gdG8gdXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMucGF0dGVybiA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1bml0IG9mIHRoZSB2YWx1ZSB0byBiZSBhcHBsaWVkIHRvIGRhdGUgKy8tIG9wZXJhdGlvbnMuCisgICAgICAgICAqICAgICAgICAgICAgVmFsaWQgVmFsdWVzIGFyZToKKyAgICAgICAgICogICAgICAgICAgICA8dWw+CisgICAgICAgICAqICAgICAgICAgICAgICAgPGxpPm1pbGxpc2Vjb25kPC9saT4KKyAgICAgICAgICogICAgICAgICAgICAgICA8bGk+c2Vjb25kPC9saT4KKyAgICAgICAgICogICAgICAgICAgICAgICA8bGk+bWludXRlPC9saT4KKyAgICAgICAgICogICAgICAgICAgICAgICA8bGk+aG91cjwvbGk+CisgICAgICAgICAqICAgICAgICAgICAgICAgPGxpPmRheSAoZGVmYXVsdCk8L2xpPgorICAgICAgICAgKiAgICAgICAgICAgICAgIDxsaT53ZWVrPC9saT4KKyAgICAgICAgICogICAgICAgICAgICAgICA8bGk+bW9udGg8L2xpPgorICAgICAgICAgKiAgICAgICAgICAgICAgIDxsaT55ZWFyPC9saT4KKyAgICAgICAgICogICAgICAgICAgICA8L3VsPgorICAgICAgICAgKiAgICAgICAgICAgIFRoaXMgb25seSBhcHBsaWVzIHRvIGRhdGUgdHlwZXMgdXNpbmcgYSArLy0gb3BlcmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdW5pdCB0aGUgdW5pdCBlbnVtZXJhdGVkIHZhbHVlLgorICAgICAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VW5pdChQcm9wZXJ0eUZpbGUuVW5pdCB1bml0KSB7CisgICAgICAgICAgICBmaWVsZCA9IHVuaXQuZ2V0Q2FsZW5kYXJGaWVsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFwcGx5IHRoZSBuZXN0ZWQgZWxlbWVudCB0byB0aGUgcHJvcGVydGllcy4KKyAgICAgICAgICogQHBhcmFtIHByb3BzIHRoZSBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRoZSBlbnRyeSBvbi4KKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVPbihQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgICAgIC8vIHR5cGUgbWF5IGJlIG51bGwgYmVjYXVzZSBpdCB3YXNuJ3Qgc2V0CisgICAgICAgICAgICBTdHJpbmcgb2xkVmFsdWUgPSAoU3RyaW5nKSBwcm9wcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZS5JTlRFR0VSX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUludGVnZXIob2xkVmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlLkRBVEVfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBleGVjdXRlRGF0ZShvbGRWYWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGUuU1RSSU5HX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVN0cmluZyhvbGRWYWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmtub3duIG9wZXJhdGlvbiB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gc3RyaW5nIHR5cGUKKyAgICAgICAgICAgICAgICAvLyB3aGljaCBtZWFucyBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgbnBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmV3VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gIiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluc2VydCBhcyBhIHN0cmluZyBieSBkZWZhdWx0CisgICAgICAgICAgICBwcm9wcy5wdXQoa2V5LCBuZXdWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgKiBIYW5kbGUgb3BlcmF0aW9ucyBmb3IgdHlwZSA8Y29kZT5kYXRlPC9jb2RlPi4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgY3VycmVudCB2YWx1ZSByZWFkIGZyb20gdGhlIHByb3BlcnR5IGZpbGUgb3IKKyAgICAgICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIDxjb2RlPmtleTwvY29kZT4gd2FzCisgICAgICAgICogICAgICAgICAgICAgICAgIG5vdCBjb250YWluZWQgaW4gdGhlIHByb3BlcnR5IGZpbGUuCisgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBleGVjdXRlRGF0ZShTdHJpbmcgb2xkVmFsdWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBDYWxlbmRhciBjdXJyZW50VmFsdWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHBhdHRlcm4gPSAieXl5eS9NTS9kZCBISDptbSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEYXRlRm9ybWF0IGZtdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KHBhdHRlcm4pOworCisgICAgICAgICAgICBTdHJpbmcgY3VycmVudFN0cmluZ1ZhbHVlID0gZ2V0Q3VycmVudFZhbHVlKG9sZFZhbHVlKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50U3RyaW5nVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRTdHJpbmdWYWx1ZSA9IERFRkFVTFRfREFURV9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCJub3ciLmVxdWFscyhjdXJyZW50U3RyaW5nVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlLnNldFRpbWUobmV3IERhdGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5zZXRUaW1lKGZtdC5wYXJzZShjdXJyZW50U3RyaW5nVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3dhbGxvdworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiAhPSBPcGVyYXRpb24uRVFVQUxTX09QRVIpIHsKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBPcGVyYXRpb24uREVDUkVNRU5UX09QRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IC0xICogb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJWYWx1ZSBub3QgYW4gaW50ZWdlciBvbiAiICsga2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlLmFkZChmaWVsZCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV3VmFsdWUgPSBmbXQuZm9ybWF0KGN1cnJlbnRWYWx1ZS5nZXRUaW1lKCkpOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgKiBIYW5kbGUgb3BlcmF0aW9ucyBmb3IgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+LgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIG9sZFZhbHVlIHRoZSBjdXJyZW50IHZhbHVlIHJlYWQgZnJvbSB0aGUgcHJvcGVydHkgZmlsZSBvcgorICAgICAgICAqICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgPGNvZGU+a2V5PC9jb2RlPiB3YXMKKyAgICAgICAgKiAgICAgICAgICAgICAgICAgbm90IGNvbnRhaW5lZCBpbiB0aGUgcHJvcGVydHkgZmlsZS4KKyAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVJbnRlZ2VyKFN0cmluZyBvbGRWYWx1ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBjdXJyZW50VmFsdWUgPSBERUZBVUxUX0lOVF9WQUxVRTsKKyAgICAgICAgICAgIGludCBuZXdWICA9IERFRkFVTFRfSU5UX1ZBTFVFOworCisKKyAgICAgICAgICAgIERlY2ltYWxGb3JtYXQgZm10ID0gKHBhdHRlcm4gIT0gbnVsbCkgPyBuZXcgRGVjaW1hbEZvcm1hdChwYXR0ZXJuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IERlY2ltYWxGb3JtYXQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnZhbCA9IGdldEN1cnJlbnRWYWx1ZShvbGRWYWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGZtdC5wYXJzZShjdXJ2YWwpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAgICAgLy8gc3dhbGxvdworICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpICB7CisgICAgICAgICAgICAgICAgLy8gc3dhbGxvdworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IE9wZXJhdGlvbi5FUVVBTFNfT1BFUikgeworICAgICAgICAgICAgICAgIG5ld1YgPSBjdXJyZW50VmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBvcGVyYXRpb25WYWx1ZSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvblZhbHVlID0gZm10LnBhcnNlKHZhbHVlKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2FsbG93CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhbGxvdworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBPcGVyYXRpb24uSU5DUkVNRU5UX09QRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3ViA9IGN1cnJlbnRWYWx1ZSArIG9wZXJhdGlvblZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09IE9wZXJhdGlvbi5ERUNSRU1FTlRfT1BFUikgeworICAgICAgICAgICAgICAgICAgICBuZXdWID0gY3VycmVudFZhbHVlIC0gb3BlcmF0aW9uVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLm5ld1ZhbHVlID0gZm10LmZvcm1hdChuZXdWKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAqIEhhbmRsZSBvcGVyYXRpb25zIGZvciB0eXBlIDxjb2RlPnN0cmluZzwvY29kZT4uCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIGN1cnJlbnQgdmFsdWUgcmVhZCBmcm9tIHRoZSBwcm9wZXJ0eSBmaWxlIG9yCisgICAgICAgICogICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSA8Y29kZT5rZXk8L2NvZGU+IHdhcworICAgICAgICAqICAgICAgICAgICAgICAgICBub3QgY29udGFpbmVkIGluIHRoZSBwcm9wZXJ0eSBmaWxlLgorICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVN0cmluZyhTdHJpbmcgb2xkVmFsdWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgbmV3ViAgPSBERUZBVUxUX1NUUklOR19WQUxVRTsKKworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IGdldEN1cnJlbnRWYWx1ZShvbGRWYWx1ZSk7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IERFRkFVTFRfU1RSSU5HX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IE9wZXJhdGlvbi5FUVVBTFNfT1BFUikgeworICAgICAgICAgICAgICAgIG5ld1YgPSBjdXJyZW50VmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBPcGVyYXRpb24uSU5DUkVNRU5UX09QRVIpIHsKKyAgICAgICAgICAgICAgICBuZXdWID0gY3VycmVudFZhbHVlICsgdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLm5ld1ZhbHVlID0gbmV3VjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayBpZiBwYXJhbWV0ZXIgY29tYmluYXRpb25zIGNhbiBiZSBzdXBwb3J0ZWQKKyAgICAgICAgICogQHRvZG8gbWFrZSBzdXJlIHRoZSAndW5pdCcgYXR0cmlidXRlIGlzIG9ubHkgc3BlY2lmaWVkIG9uIGRhdGUKKyAgICAgICAgICogICAgICBmaWVsZHMKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1BhcmFtZXRlcnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZS5TVFJJTkdfVFlQRQorICAgICAgICAgICAgICAgICYmIG9wZXJhdGlvbiA9PSBPcGVyYXRpb24uREVDUkVNRU5UX09QRVIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIi0gaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgKyAicHJvcGVydGllcyAoa2V5OiIgKyBrZXkgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgZGVmYXVsdFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlwidmFsdWVcIiBhbmQvb3IgXCJkZWZhdWx0XCIgIgorICAgICAgICAgICAgICAgICAgICArICJhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQgKGtleToiICsga2V5ICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigia2V5IGlzIG1hbmRhdG9yeSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZS5TVFJJTkdfVFlQRSAmJiBwYXR0ZXJuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInBhdHRlcm4gaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgKyAicHJvcGVydGllcyAoa2V5OiIgKyBrZXkgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3VycmVudFZhbHVlKFN0cmluZyBvbGRWYWx1ZSkgeworICAgICAgICAgICAgU3RyaW5nIHJldCA9IG51bGw7CisgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IE9wZXJhdGlvbi5FUVVBTFNfT1BFUikgeworICAgICAgICAgICAgICAgIC8vIElmIG9ubHkgdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIGl0CisgICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiBpdHMgcHJldmlvdXMgdmFsdWUuCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgZGVmYXVsdFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgb25seSBkZWZhdWx0IGlzIHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IHByZXZpb3VzbHkKKyAgICAgICAgICAgICAgICAvLyBleGlzdGVkIGluIHRoZSBwcm9wZXJ0eSBmaWxlLCBpdCBpcyB1bmNoYW5nZWQuCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgb2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBvbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiBvbmx5IGRlZmF1bHQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgZGlkIG5vdAorICAgICAgICAgICAgICAgIC8vIGV4aXN0IGluIHRoZSBwcm9wZXJ0eSBmaWxlLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgb2xkVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgYW5kIGRlZmF1bHQgYXJlIGJvdGggc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c2x5IGV4aXN0ZWQgaW4gdGhlIHByb3BlcnR5IGZpbGUsIHRoZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgIC8vIGlzIHNldCB0byB2YWx1ZS4KKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHZhbHVlIGFuZCBkZWZhdWx0IGFyZSBib3RoIHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5CisgICAgICAgICAgICAgICAgLy8gZGlkIG5vdCBleGlzdCBpbiB0aGUgcHJvcGVydHkgZmlsZSwgdGhlIHByb3BlcnR5IGlzIHNldAorICAgICAgICAgICAgICAgIC8vIHRvIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgb2xkVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSAob2xkVmFsdWUgPT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBvbGRWYWx1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgIisiLCAiLSIsICI9IgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPcGVyYXRpb24gZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKworICAgICAgICAgICAgLy8gUHJvcGVydHkgdHlwZSBvcGVyYXRpb25zCisgICAgICAgICAgICAvKiogKyAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DUkVNRU5UX09QRVIgPSAgIDA7CisgICAgICAgICAgICAvKiogLSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDUkVNRU5UX09QRVIgPSAgIDE7CisgICAgICAgICAgICAvKiogPSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVFVQUxTX09QRVIgPSAgICAgIDI7CisKKyAgICAgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiKyIsICItIiwgIj0ifTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBDb252ZXJ0IHN0cmluZyB0byBpbmRleC4KKyAgICAgICAgICAgICAqIEBwYXJhbSBvcGVyIHRoZSBzdHJpbmcgdG8gY29udmVydC4KKyAgICAgICAgICAgICAqIEByZXR1cm4gdGhlIGluZGV4LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGludCB0b09wZXJhdGlvbihTdHJpbmcgb3BlcikgeworICAgICAgICAgICAgICAgIGlmICgiKyIuZXF1YWxzKG9wZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTkNSRU1FTlRfT1BFUjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItIi5lcXVhbHMob3BlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQ1JFTUVOVF9PUEVSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRVFVQUxTX09QRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWVzICJpbnQiLCAiZGF0ZSIgYW5kICJzdHJpbmciLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgICAgIC8vIFByb3BlcnR5IHR5cGVzCisgICAgICAgICAgICAvKiogaW50ICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSX1RZUEUgPSAgICAgMDsKKyAgICAgICAgICAgIC8qKiBkYXRlICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRFX1RZUEUgPSAgICAgICAgMTsKKyAgICAgICAgICAgIC8qKiBzdHJpbmcgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklOR19UWVBFID0gICAgICAyOworCisgICAgICAgICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiaW50IiwgImRhdGUiLCAic3RyaW5nIn07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQ29udmVydCBzdHJpbmcgdG8gaW5kZXguCisgICAgICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgc3RyaW5nIHRvIGNvbnZlcnQuCisgICAgICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbmRleC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgdG9UeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCJpbnQiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9UWVBFOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImRhdGUiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREFURV9UWVBFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gU1RSSU5HX1RZUEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCb3Jyb3dlZCBmcm9tIFRzdGFtcAorICAgICAqIEB0b2RvIHNoYXJlIGFsbCB0aGlzIHRpbWUgc3R1ZmYgYWNyb3NzIG1hbnkgdGFza3MgYXMgYSBkYXRldGltZSBkYXRhdHlwZQorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbml0IGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTExJU0VDT05EID0gIm1pbGxpc2Vjb25kIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09ORCA9ICJzZWNvbmQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOVVRFID0gIm1pbnV0ZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1VSID0gImhvdXIiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFZID0gImRheSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUVLID0gIndlZWsiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OVEggPSAibW9udGgiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVBUiA9ICJ5ZWFyIjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTklUUworICAgICAgICAgICAgPSB7TUlMTElTRUNPTkQsIFNFQ09ORCwgTUlOVVRFLCBIT1VSLAorICAgICAgICAgICAgICAgREFZLCBXRUVLLCBNT05USCwgWUVBUiB9OworCisgICAgICAgIHByaXZhdGUgTWFwIGNhbGVuZGFyRmllbGRzID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICAvKiogbm8gYXJnIGNvbnN0cnVjdG9yICovCisgICAgICAgIHB1YmxpYyBVbml0KCkgeworICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KE1JTExJU0VDT05ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoQ2FsZW5kYXIuTUlMTElTRUNPTkQpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChTRUNPTkQsIG5ldyBJbnRlZ2VyKENhbGVuZGFyLlNFQ09ORCkpOworICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KE1JTlVURSwgbmV3IEludGVnZXIoQ2FsZW5kYXIuTUlOVVRFKSk7CisgICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoSE9VUiwgbmV3IEludGVnZXIoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChEQVksIG5ldyBJbnRlZ2VyKENhbGVuZGFyLkRBVEUpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChXRUVLLCBuZXcgSW50ZWdlcihDYWxlbmRhci5XRUVLX09GX1lFQVIpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChNT05USCwgbmV3IEludGVnZXIoQ2FsZW5kYXIuTU9OVEgpKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChZRUFSLCBuZXcgSW50ZWdlcihDYWxlbmRhci5ZRUFSKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydCB0aGUgdmFsdWUgdG8gYSBDYWxlbmRhciBmaWVsZCBpbmRleC4KKyAgICAgICAgICogQHJldHVybiB0aGUgY2FsYW5kZXIgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldENhbGVuZGFyRmllbGQoKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgSW50ZWdlciBpID0gKEludGVnZXIpIGNhbGVuZGFyRmllbGRzLmdldChrZXkpOworICAgICAgICAgICAgcmV0dXJuIGkuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIFVOSVRTOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmVuYW1lRXh0ZW5zaW9ucy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmVuYW1lRXh0ZW5zaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDUzZDUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZW5hbWVFeHRlbnNpb25zLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKy8qCisgKiBUYXNrIHRvIHJlbmFtZSBmaWxlcyBiYXNlZCBvbiBleHRlbnNpb24uIFRoaXMgdGFzayBoYXMgdGhlIGZvbGxvd2luZworICogcHJvcGVydGllcyB3aGljaCBjYW4gYmUgc2V0OgorICogPHVsPgorICogPGxpPmZyb21FeHRlbnNpb246IDwvbGk+CisgKiA8bGk+dG9FeHRlbnNpb246IDwvbGk+CisgKiA8bGk+c3JjRGlyOiA8L2xpPgorICogPGxpPnJlcGxhY2U6IDwvbGk+CisgKiA8L3VsPgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTW92ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7CisKKy8qKgorICoKKyAqIEB2ZXJzaW9uIDEuMgorICoKKyAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICogICAgICAgICAgICAgVXNlICZsdDttb3ZlJmd0OyBpbnN0ZWFkCisgKi8KK3B1YmxpYyBjbGFzcyBSZW5hbWVFeHRlbnNpb25zIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZyb21FeHRlbnNpb24gPSAiIjsKKyAgICBwcml2YXRlIFN0cmluZyB0b0V4dGVuc2lvbiA9ICIiOworICAgIHByaXZhdGUgYm9vbGVhbiByZXBsYWNlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBGaWxlIHNyY0RpcjsKKworICAgIHByaXZhdGUgTWFwcGVyLk1hcHBlclR5cGUgZ2xvYlR5cGU7CisKKworICAgIC8qKiBDcmVhdGVzIG5ldyBSZW5hbWVFeHRlbnNpb25zICovCisgICAgcHVibGljIFJlbmFtZUV4dGVuc2lvbnMoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGdsb2JUeXBlID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CisgICAgICAgIGdsb2JUeXBlLnNldFZhbHVlKCJnbG9iIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyB0aGF0IGZpbGVzIG11c3QgZW5kIGluIHRvIGJlIHJlbmFtZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9tIHRoZSBleHRlbnNpb24gb2YgZmlsZXMgYmVpbmcgcmVuYW1lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcm9tRXh0ZW5zaW9uKFN0cmluZyBmcm9tKSB7CisgICAgICAgIGZyb21FeHRlbnNpb24gPSBmcm9tOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgdGhhdCByZW5hbWVkIGZpbGVzIHdpbGwgZW5kIHdpdGggb24KKyAgICAgKiBjb21wbGV0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGV4dGVuc2lvbiBvZiB0aGUgcmVuYW1lZCBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb0V4dGVuc2lvbihTdHJpbmcgdG8pIHsKKyAgICAgICAgdG9FeHRlbnNpb24gPSB0bzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzdG9yZSByZXBsYWNlIGF0dHJpYnV0ZSAtIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0YXJnZXQgZmlsZQorICAgICAqIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBpZiBwcmVzZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwbGFjZSBpZiB0cnVlIG92ZXJ3cml0ZSBhbnkgdGFyZ2V0IGZpbGVzIHRoYXQgZXhpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwbGFjZShib29sZWFuIHJlcGxhY2UpIHsKKyAgICAgICAgdGhpcy5yZXBsYWNlID0gcmVwbGFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNvdXJjZSBkaXIgdG8gZmluZCB0aGUgZmlsZXMgdG8gYmUgcmVuYW1lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmNEaXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjRGlyKEZpbGUgc3JjRGlyKSB7CisgICAgICAgIHRoaXMuc3JjRGlyID0gc3JjRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpcyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIHRhc2sgZXhlY3V0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgZnJvbSBhbmQgdG8gZXh0ZW5zaW9uCisgICAgICAgIGlmIChmcm9tRXh0ZW5zaW9uID09IG51bGwgfHwgdG9FeHRlbnNpb24gPT0gbnVsbCB8fCBzcmNEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmNEaXIsIGZyb21FeHRlbnNpb24gYW5kIHRvRXh0ZW5zaW9uICIKKyAgICAgICAgICAgICAgICArICJhdHRyaWJ1dGVzIG11c3QgYmUgc2V0ISIpOworICAgICAgICB9CisKKyAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIHJlbmFtZWV4dCB0YXNrIGlzIGRlcHJlY2F0ZWQuICBVc2UgbW92ZSBpbnN0ZWFkLiIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgbG9nKCJSZXBsYWNlIHRoaXMgd2l0aDoiLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgbG9nKCI8bW92ZSB0b2Rpcj1cIiIgKyBzcmNEaXIgKyAiXCIgb3ZlcndyaXRlPVwiIiArIHJlcGxhY2UgKyAiXCI+IiwKKyAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICBsb2coIiAgPGZpbGVzZXQgZGlyPVwiIiArIHNyY0RpciArICJcIiAvPiIsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICBsb2coIiAgPG1hcHBlciB0eXBlPVwiZ2xvYlwiIiwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIGxvZygiICAgICAgICAgIGZyb209XCIqIiArIGZyb21FeHRlbnNpb24gKyAiXCIiLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgbG9nKCIgICAgICAgICAgdG89XCIqIiArIHRvRXh0ZW5zaW9uICsgIlwiIC8+IiwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIGxvZygiPC9tb3ZlPiIsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICBsb2coInVzaW5nIHRoZSBzYW1lIHBhdHRlcm5zIG9uIDxmaWxlc2V0PiBhcyB5b3VcJ3ZlIHVzZWQgaGVyZSIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPKTsKKworICAgICAgICBNb3ZlIG1vdmUgPSBuZXcgTW92ZSgpOworICAgICAgICBtb3ZlLmJpbmRUb093bmVyKHRoaXMpOworICAgICAgICBtb3ZlLnNldE93bmluZ1RhcmdldChnZXRPd25pbmdUYXJnZXQoKSk7CisgICAgICAgIG1vdmUuc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7CisgICAgICAgIG1vdmUuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIG1vdmUuc2V0VG9kaXIoc3JjRGlyKTsKKyAgICAgICAgbW92ZS5zZXRPdmVyd3JpdGUocmVwbGFjZSk7CisKKyAgICAgICAgZmlsZXNldC5zZXREaXIoc3JjRGlyKTsKKyAgICAgICAgbW92ZS5hZGRGaWxlc2V0KGZpbGVzZXQpOworCisgICAgICAgIE1hcHBlciBtZSA9IG1vdmUuY3JlYXRlTWFwcGVyKCk7CisgICAgICAgIG1lLnNldFR5cGUoZ2xvYlR5cGUpOworICAgICAgICBtZS5zZXRGcm9tKCIqIiArIGZyb21FeHRlbnNpb24pOworICAgICAgICBtZS5zZXRUbygiKiIgKyB0b0V4dGVuc2lvbik7CisKKyAgICAgICAgbW92ZS5leGVjdXRlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZXBsYWNlUmVnRXhwLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZXBsYWNlUmVnRXhwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiYWE0NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JlcGxhY2VSZWdFeHAuamF2YQpAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZ3VsYXJFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlN1YnN0aXR1dGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHA7CisKKy8qKgorICogUGVyZm9ybXMgcmVndWxhciBleHByZXNzaW9uIHN0cmluZyByZXBsYWNlbWVudHMgaW4gYSB0ZXh0CisgKiBmaWxlLiAgVGhlIGlucHV0IGZpbGUocykgbXVzdCBiZSBhYmxlIHRvIGJlIHByb3Blcmx5IHByb2Nlc3NlZCBieQorICogYSBSZWFkZXIgaW5zdGFuY2UuICBUaGF0IGlzLCB0aGV5IG11c3QgYmUgdGV4dCBvbmx5LCBubyBiaW5hcnkuCisgKgorICogVGhlIHN5bnRheCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIHRoYXQKKyAqIHlvdSBjaG9vc2UgdG8gdXNlLiBUaGUgc3lzdGVtIHByb3BlcnR5IDxjb2RlPmFudC5yZWdleHAucmVnZXhwaW1wbDwvY29kZT4KKyAqIHdpbGwgYmUgdGhlIGNsYXNzbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgKHRoZSBkZWZhdWx0CisgKiBpcyA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhT3JvUmVnZXhwPC9jb2RlPiBhbmQKKyAqIHJlcXVpcmVzIHRoZSBKYWthcnRhIE9ybyBQYWNrYWdlKS4KKyAqCisgKiA8cHJlPgorICogRm9yIGpkayAgJmx0Oz0gMS4zLCB0aGVyZSBhcmUgdHdvIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbnM6CisgKiAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLkpha2FydGFPcm9SZWdleHAgKHRoZSBkZWZhdWx0KQorICogICAgICAgIFJlcXVpcmVzICB0aGUgamFrYXJ0YS1vcm8gcGFja2FnZQorICoKKyAqICAgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmFrYXJ0YVJlZ2V4cFJlZ2V4cAorICogICAgICAgIFJlcXVpcmVzIHRoZSBqYWthcnRhLXJlZ2V4cCBwYWNrYWdlCisgKgorICogRm9yIGpkayAmZ3Q7PSAxLjQgYW4gYWRkaXRpb25hbCBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGU6CisgKiAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLkpkazE0UmVnZXhwUmVnZXhwCisgKiAgICAgICAgUmVxdWlyZXMgdGhlIGpkayAxLjQgYnVpbHQgaW4gcmVndWxhciBleHByZXNzaW9uIHBhY2thZ2UuCisgKgorICogVXNhZ2U6CisgKgorICogICBDYWxsIFN5bnRheDoKKyAqCisgKiAgICAgJmx0O3JlcGxhY2VyZWdleHAgZmlsZT0iZmlsZSIKKyAqICAgICAgICAgICAgICAgICAgICBtYXRjaD0icGF0dGVybiIKKyAqICAgICAgICAgICAgICAgICAgICByZXBsYWNlPSJwYXR0ZXJuIgorICogICAgICAgICAgICAgICAgICAgIGZsYWdzPSJvcHRpb25zIj8KKyAqICAgICAgICAgICAgICAgICAgICBieWxpbmU9InRydWV8ZmFsc2UiPyAmZ3Q7CisgKiAgICAgICByZWdleHA/CisgKiAgICAgICBzdWJzdGl0dXRpb24/CisgKiAgICAgICBmaWxlc2V0KgorICogICAgICZsdDsvcmVwbGFjZXJlZ2V4cCZndDsKKyAqCisgKiAgICBOT1RFOiBZb3UgbXVzdCBoYXZlIGVpdGhlciB0aGUgZmlsZSBhdHRyaWJ1dGUgc3BlY2lmaWVkLCBvciBhdCBsZWFzdCBvbmUgZmlsZXNldCBzdWJlbGVtZW50CisgKiAgICB0byBvcGVyYXRpb24gb24uICBZb3UgbWF5IG5vdCBoYXZlIHRoZSBmaWxlIGF0dHJpYnV0ZSBzcGVjaWZpZWQgaWYgeW91IG5lc3QgZmlsZXNldCBlbGVtZW50cworICogICAgaW5zaWRlIHRoaXMgdGFzay4gIEFsc28sIHlvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIG1hdGNoIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJlbGVtZW50IGF0CisgKiAgICB0aGUgc2FtZSB0aW1lLCBub3IgY2FuIHlvdSBzcGVjaWZ5IHRoZSByZXBsYWNlIGF0dHJpYnV0ZSBhbmQgdGhlIHN1YnN0aXR1dGlvbiBzdWJlbGVtZW50IGF0CisgKiAgICB0aGUgc2FtZSB0aW1lLgorICoKKyAqICAgQXR0cmlidXRlczoKKyAqCisgKiAgICAgZmlsZSAgICAtLSZndDsgQSBzaW5nbGUgZmlsZSB0byBvcGVyYXRpb24gb24gKG11dHVhbGx5IGV4Y2x1c2l2ZQorICogICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGZpbGVzZXQgc3ViZWxlbWVudHMpCisgKiAgICAgbWF0Y2ggICAtLSZndDsgVGhlIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaAorICogICAgIHJlcGxhY2UgLS0mZ3Q7IFRoZSBFeHByZXNzaW9uIHJlcGxhY2VtZW50IHN0cmluZworICogICAgIGZsYWdzICAgLS0mZ3Q7IFRoZSBvcHRpb25zIHRvIGdpdmUgdG8gdGhlIHJlcGxhY2VtZW50CisgKiAgICAgICAgICAgICAgICAgZyA9IFN1YnN0aXR1dGUgYWxsIG9jY3VycmVuY2VzLiBkZWZhdWx0IGlzIHRvIHJlcGxhY2Ugb25seSB0aGUgZmlyc3Qgb25lCisgKiAgICAgICAgICAgICAgICAgaSA9IENhc2UgaW5zZW5zaXRpdmUgbWF0Y2gKKyAqCisgKiAgICAgYnlsaW5lICAtLSZndDsgU2hvdWxkIHRoaXMgZmlsZSBiZSBwcm9jZXNzZWQgYSBzaW5nbGUgbGluZSBhdCBhIHRpbWUgKGRlZmF1bHQgaXMgZmFsc2UpCisgKiAgICAgICAgICAgICAgICAgInRydWUiIGluZGljYXRlcyB0byBwZXJmb3JtIHJlcGxhY2VtZW50IG9uIGEgbGluZSBieSBsaW5lIGJhc2lzCisgKiAgICAgICAgICAgICAgICAgImZhbHNlIiBpbmRpY2F0ZXMgdG8gcGVyZm9ybSByZXBsYWNlbWVudCBvbiB0aGUgd2hvbGUgZmlsZSBhdCBvbmNlLgorICoKKyAqICBFeGFtcGxlOgorICoKKyAqICAgICBUaGUgZm9sbG93aW5nIGNhbGwgY291bGQgYmUgdXNlZCB0byByZXBsYWNlIGFuIG9sZCBwcm9wZXJ0eSBuYW1lIGluIGEgIi5wcm9wZXJ0aWVzIgorICogICAgIGZpbGUgd2l0aCBhIG5ldyBuYW1lLiAgSW4gdGhlIHJlcGxhY2UgYXR0cmlidXRlLCB5b3UgY2FuIHJlZmVyIHRvIGFueSBwYXJ0IG9mIHRoZQorICogICAgIG1hdGNoIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzaXMgdXNpbmcgYmFja3NsYXNoIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIGxpa2UgJ1wxJy4KKyAqCisgKiAgICAgJmx0O3JlcGxhY2VyZWdleHAgZmlsZT0idGVzdC5wcm9wZXJ0aWVzIgorICogICAgICAgICAgICAgICAgICAgIG1hdGNoPSJNeVByb3BlcnR5PSguKikiCisgKiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT0iTmV3UHJvcGVydHk9XDEiCisgKiAgICAgICAgICAgICAgICAgICAgYnlsaW5lPSJ0cnVlIiAvJmd0OworICoKKyAqIDwvcHJlPgorICoKKyAqLworcHVibGljIGNsYXNzIFJlcGxhY2VSZWdFeHAgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgRmlsZSBmaWxlOworICAgIHByaXZhdGUgU3RyaW5nIGZsYWdzOworICAgIHByaXZhdGUgYm9vbGVhbiBieWxpbmU7CisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHM7IC8vIEtlZXAgamRrIDEuMSBjb21wbGlhbnQgc28gb3RoZXJzIGNhbiB1c2UgdGhpcworICAgIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb24gcmVnZXg7CisgICAgcHJpdmF0ZSBTdWJzdGl0dXRpb24gc3ViczsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogRW5jb2RpbmcgdG8gYXNzdW1lIGZvciB0aGUgZmlsZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CisKKyAgICAvKiogRGVmYXVsdCBDb25zdHJ1Y3RvciAgKi8KKyAgICBwdWJsaWMgUmVwbGFjZVJlZ0V4cCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5maWxlID0gbnVsbDsKKyAgICAgICAgdGhpcy5maWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdGhpcy5mbGFncyA9ICIiOworICAgICAgICB0aGlzLmJ5bGluZSA9IGZhbHNlOworCisgICAgICAgIHRoaXMucmVnZXggPSBudWxsOworICAgICAgICB0aGlzLnN1YnMgPSBudWxsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogZmlsZSBmb3Igd2hpY2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzaG91bGQgYmUgcmVwbGFjZWQ7CisgICAgICogcmVxdWlyZWQgdW5sZXNzIGEgbmVzdGVkIGZpbGVzZXQgaXMgc3VwcGxpZWQuCisgICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgZm9yIHdoaWNoIHRoZSByZWcgZXhwIHNob3VsZCBiZSByZXBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGluIHRoZSBmaWxlKHMpOworICAgICAqIHJlcXVpcmVkIGlmIG5vIG5lc3RlZCAmbHQ7cmVnZXhwJmd0OyBpcyB1c2VkCisgICAgICogQHBhcmFtIG1hdGNoIHRoZSBtYXRjaCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF0Y2goU3RyaW5nIG1hdGNoKSB7CisgICAgICAgIGlmIChyZWdleCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBhbGxvd2VkIik7CisgICAgICAgIH0KKworICAgICAgICByZWdleCA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbigpOworICAgICAgICByZWdleC5zZXRQYXR0ZXJuKG1hdGNoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdWJzdGl0dXRpb24gcGF0dGVybiB0byBwbGFjZSBpbiB0aGUgZmlsZShzKSBpbiBwbGFjZQorICAgICAqIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICogUmVxdWlyZWQgaWYgbm8gbmVzdGVkICZsdDtzdWJzdGl0dXRpb24mZ3Q7IGlzIHVzZWQKKyAgICAgKiBAcGFyYW0gcmVwbGFjZSB0aGUgcmVwbGFjZSBhdHRyaWJ1dGUKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2UoU3RyaW5nIHJlcGxhY2UpIHsKKyAgICAgICAgaWYgKHN1YnMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBzdWJzdGl0dXRpb24gZXhwcmVzc2lvbiBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWxsb3dlZCIpOworICAgICAgICB9CisKKyAgICAgICAgc3VicyA9IG5ldyBTdWJzdGl0dXRpb24oKTsKKyAgICAgICAgc3Vicy5zZXRFeHByZXNzaW9uKHJlcGxhY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmbGFncyB0byB1c2Ugd2hlbiBtYXRjaGluZyB0aGUgcmVndWxhciBleHByZXNzaW9uLiAgRm9yIG1vcmUKKyAgICAgKiBpbmZvcm1hdGlvbiwgY29uc3VsdCB0aGUgUGVybDUgc3ludGF4LgorICAgICAqIDx1bD4KKyAgICAgKiAgPGxpPmcgOiBHbG9iYWwgcmVwbGFjZW1lbnQuICBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBmb3VuZAorICAgICAqICA8bGk+aSA6IENhc2UgSW5zZW5zaXRpdmUuICBEbyBub3QgY29uc2lkZXIgY2FzZSBpbiB0aGUgbWF0Y2gKKyAgICAgKiAgPGxpPm0gOiBNdWx0aWxpbmUuICBUcmVhdCB0aGUgc3RyaW5nIGFzIG11bHRpcGxlIGxpbmVzIG9mIGlucHV0LAorICAgICAqICAgICAgICAgdXNpbmcgIl4iIGFuZCAiJCIgYXMgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhbnkgbGluZSwgcmVzcGVjdGl2ZWx5LAorICAgICAqICAgICAgICAgcmF0aGVyIHRoYW4gc3RhcnQgb3IgZW5kIG9mIHN0cmluZy4KKyAgICAgKiAgPGxpPiBzIDogU2luZ2xlbGluZS4gIFRyZWF0IHRoZSBzdHJpbmcgYXMgYSBzaW5nbGUgbGluZSBvZiBpbnB1dCwgdXNpbmcKKyAgICAgKiAgICAgICAgIi4iIHRvIG1hdGNoIGFueSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBhIG5ld2xpbmUsIHdoaWNoIG5vcm1hbGx5LAorICAgICAqICAgICAgICBpdCB3b3VsZCBub3QgbWF0Y2guCisgICAgICo8L3VsPgorICAgICAqIEBwYXJhbSBmbGFncyB0aGUgZmxhZ3MgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmxhZ3MoU3RyaW5nIGZsYWdzKSB7CisgICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGZpbGUocykgb25lIGxpbmUgYXQgYSB0aW1lLCBleGVjdXRpbmcgdGhlIHJlcGxhY2VtZW50CisgICAgICogb24gb25lIGxpbmUgYXQgYSB0aW1lLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91CisgICAgICogd2FudCB0byBvbmx5IHJlcGxhY2UgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gb24KKyAgICAgKiBlYWNoIGxpbmUsIHdoaWNoIGlzIG5vdCBlYXN5IHRvIGRvIHdoZW4gcHJvY2Vzc2luZyB0aGUgZmlsZSBhcyBhIHdob2xlLgorICAgICAqIERlZmF1bHRzIHRvIDxpPmZhbHNlPC9pPi48L3RkPgorICAgICAqIEBwYXJhbSBieWxpbmUgdGhlIGJ5bGluZSBhdHRyaWJ1dGUgYXMgYSBzdHJpbmcKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KKyAgICAgKiAgICAgICAgICAgICBVc2Ugc2V0QnlMaW5lKGJvb2xlYW4pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ5TGluZShTdHJpbmcgYnlsaW5lKSB7CisgICAgICAgIEJvb2xlYW4gcmVzID0gQm9vbGVhbi52YWx1ZU9mKGJ5bGluZSk7CisKKyAgICAgICAgaWYgKHJlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXMgPSBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgICAgIHRoaXMuYnlsaW5lID0gcmVzLmJvb2xlYW5WYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGZpbGUocykgb25lIGxpbmUgYXQgYSB0aW1lLCBleGVjdXRpbmcgdGhlIHJlcGxhY2VtZW50CisgICAgICogb24gb25lIGxpbmUgYXQgYSB0aW1lLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91CisgICAgICogd2FudCB0byBvbmx5IHJlcGxhY2UgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gb24KKyAgICAgKiBlYWNoIGxpbmUsIHdoaWNoIGlzIG5vdCBlYXN5IHRvIGRvIHdoZW4gcHJvY2Vzc2luZyB0aGUgZmlsZSBhcyBhIHdob2xlLgorICAgICAqIERlZmF1bHRzIHRvIDxpPmZhbHNlPC9pPi48L3RkPgorICAgICAqIEBwYXJhbSBieWxpbmUgdGhlIGJ5bGluZSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCeUxpbmUoYm9vbGVhbiBieWxpbmUpIHsKKyAgICAgICAgdGhpcy5ieWxpbmUgPSBieWxpbmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGVuY29kaW5nIEFudCBleHBlY3RzIHRoZSBmaWxlcyB0byBiZSBpbiAtCisgICAgICogZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtcyBkZWZhdWx0IGVuY29kaW5nLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogbGlzdCBmaWxlcyB0byBhcHBseSB0aGUgcmVwbGFjZW1lbnQgdG8KKyAgICAgKiBAcGFyYW0gc2V0IHRoZSBmaWxlc2V0IGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7CisgICAgICAgIGZpbGVzZXRzLmFkZEVsZW1lbnQoc2V0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZWxlbWVudCB0byByZWZlciB0byBhIHByZXZpb3VzbHkKKyAgICAgKiBkZWZpbmVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBkYXRhdHlwZSBpbnN0YW5jZQorICAgICAqIEByZXR1cm4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QgdG8gYmUgY29uZmlndXJlZCBhcyBhbiBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIFJlZ3VsYXJFeHByZXNzaW9uIGNyZWF0ZVJlZ2V4cCgpIHsKKyAgICAgICAgaWYgKHJlZ2V4ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgcmVndWxhciBleHByZXNzaW9uIGlzIGFsbG93ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICByZWdleCA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbigpOworICAgICAgICByZXR1cm4gcmVnZXg7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHN1YnN0aXR1dGlvbiBwYXR0ZXJuLiAgWW91IGNhbiB1c2UgdGhpcyBlbGVtZW50IHRvIHJlZmVyIHRvIGEgcHJldmlvdXNseQorICAgICAqIGRlZmluZWQgc3Vic3RpdHV0aW9uIHBhdHRlcm4gZGF0YXR5cGUgaW5zdGFuY2UuCisgICAgICogQHJldHVybiB0aGUgc3Vic3RpdHV0aW9uIHBhdHRlcm4gb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQgYXMgYW4gZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyBTdWJzdGl0dXRpb24gY3JlYXRlU3Vic3RpdHV0aW9uKCkgeworICAgICAgICBpZiAoc3VicyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIHN1YnN0aXR1dGlvbiBleHByZXNzaW9uIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhbGxvd2VkIik7CisgICAgICAgIH0KKworICAgICAgICBzdWJzID0gbmV3IFN1YnN0aXR1dGlvbigpOworICAgICAgICByZXR1cm4gc3ViczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEludm9rZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiAocikgb24gYSBzdHJpbmcgKGlucHV0KSB1c2luZworICAgICAqIHN1YnN0aXR1dGlvbnMgKHMpIGZvciBhIG1hdGNoaW5nIHJlZ2V4LgorICAgICAqCisgICAgICogQHBhcmFtIHIgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgKiBAcGFyYW0gcyBhIFN1YnN0aXR1dGlvbgorICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgc3RyaW5nIHRvIGRvIHRoZSByZXBsYWNlbWVudCBvbgorICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICogQHJldHVybiB0aGUgcmVwbGFjZW1lbnQgcmVzdWx0CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkb1JlcGxhY2UoUmVndWxhckV4cHJlc3Npb24gciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzdGl0dXRpb24gcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKKyAgICAgICAgU3RyaW5nIHJlcyA9IGlucHV0OworICAgICAgICBSZWdleHAgcmVnZXhwID0gci5nZXRSZWdleHAoZ2V0UHJvamVjdCgpKTsKKworICAgICAgICBpZiAocmVnZXhwLm1hdGNoZXMoaW5wdXQsIG9wdGlvbnMpKSB7CisgICAgICAgICAgICBsb2coIkZvdW5kIG1hdGNoOyBzdWJzdGl0dXRpbmciLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICByZXMgPSByZWdleHAuc3Vic3RpdHV0ZShpbnB1dCwgcy5nZXRFeHByZXNzaW9uKGdldFByb2plY3QoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgUGVyZm9ybSB0aGUgcmVwbGFjZW1lbnQgb24gYSBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gZiB0aGUgZmlsZSB0byBwZXJmb3JtIHRoZSByZWxhY2VtZW50IG9uCisgICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb3B0aW9ucworICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9SZXBsYWNlKEZpbGUgZiwgaW50IG9wdGlvbnMpCisgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIHRlbXAgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKCJyZXBsYWNlIiwgIi50eHQiLCBudWxsLCB0cnVlLCB0cnVlKTsKKworICAgICAgICBSZWFkZXIgciA9IG51bGw7CisgICAgICAgIFdyaXRlciB3ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByID0gbmV3IEZpbGVSZWFkZXIoZik7CisgICAgICAgICAgICAgICAgdyA9IG5ldyBGaWxlV3JpdGVyKHRlbXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZiksIGVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICB3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHIpOworICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIodyk7CisgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihidyk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlcyA9IGZhbHNlOworCisgICAgICAgICAgICBsb2coIlJlcGxhY2luZyBwYXR0ZXJuICciICsgcmVnZXguZ2V0UGF0dGVybihnZXRQcm9qZWN0KCkpCisgICAgICAgICAgICAgICAgKyAiJyB3aXRoICciICsgc3Vicy5nZXRFeHByZXNzaW9uKGdldFByb2plY3QoKSkKKyAgICAgICAgICAgICAgICArICInIGluICciICsgZi5nZXRQYXRoKCkgKyAiJyIgKyAoYnlsaW5lID8gIiBieSBsaW5lIiA6ICIiKQorICAgICAgICAgICAgICAgICsgKGZsYWdzLmxlbmd0aCgpID4gMCA/ICIgd2l0aCBmbGFnczogJyIgKyBmbGFncyArICInIiA6ICIiKQorICAgICAgICAgICAgICAgICsgIi4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgaWYgKGJ5bGluZSkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBsaW5lYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhc0NSID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBici5yZWFkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Vjb25kIENSIC0+IEVPTCArIHBvc3NpYmx5IGVtcHR5IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZWJ1Zi50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyAgPSBkb1JlcGxhY2UocmVnZXgsIHN1YnMsIGxpbmUsIG9wdGlvbnMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMuZXF1YWxzKGxpbmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoJ1xyJyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhc0NSIGlzIHN0aWxsIHRydWUgKGZvciB0aGUgc2Vjb25kIG9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgQ1IgaW4gdGhpcyBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ1IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTEYgLT4gRU9MCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZWJ1Zi50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzICA9IGRvUmVwbGFjZShyZWdleCwgc3VicywgbGluZSwgb3B0aW9ucyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLmVxdWFscyhsaW5lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludChyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoJ1xyJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ1IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCdcbicpOworCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhbnkgb3RoZXIgY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChoYXNDUikgfHwgKGMgPCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hYy1zdHlsZSBsaW5lYnJlYWsgb3IgRU9GIChvciBib3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lYnVmLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzICA9IGRvUmVwbGFjZShyZWdleCwgc3VicywgbGluZSwgb3B0aW9ucyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5lcXVhbHMobGluZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoJ1xyJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NSID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVidWYuYXBwZW5kKChjaGFyKSBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKGMgPj0gMCk7CisKKyAgICAgICAgICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYnVmID0gRmlsZVV0aWxzLnNhZmVSZWFkRnVsbHkoYnIpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHJlcyA9IGRvUmVwbGFjZShyZWdleCwgc3VicywgYnVmLCBvcHRpb25zKTsKKworICAgICAgICAgICAgICAgIGlmICghcmVzLmVxdWFscyhidWYpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB3LnByaW50KHJlcyk7CisgICAgICAgICAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgci5jbG9zZSgpOworICAgICAgICAgICAgciA9IG51bGw7CisgICAgICAgICAgICB3LmNsb3NlKCk7CisgICAgICAgICAgICB3ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHsKKyAgICAgICAgICAgICAgICBsb2coIkZpbGUgaGFzIGNoYW5nZWQ7IHNhdmluZyB0aGUgdXBkYXRlZCBmaWxlIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZW5hbWUodGVtcCwgZik7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBudWxsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZG4ndCByZW5hbWUgdGVtcG9yYXJ5IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0ZW1wLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygiTm8gY2hhbmdlIG1hZGUiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uocik7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uodyk7CisgICAgICAgICAgICBpZiAodGVtcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGVtcC5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzaworICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpcyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIHRhc2sgZXhlY3V0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAocmVnZXggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBleHByZXNzaW9uIHRvIG1hdGNoLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzdWJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm90aGluZyB0byByZXBsYWNlIGV4cHJlc3Npb24gd2l0aC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZXNldHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgY2Fubm90IHN1cHBseSB0aGUgJ2ZpbGUnIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYW5kIGZpbGVzZXRzIGF0IHRoZSBzYW1lIHRpbWUuIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgb3B0aW9ucyA9IDA7CisKKyAgICAgICAgaWYgKGZsYWdzLmluZGV4T2YoJ2cnKSAhPSAtMSkgeworICAgICAgICAgICAgb3B0aW9ucyB8PSBSZWdleHAuUkVQTEFDRV9BTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MuaW5kZXhPZignaScpICE9IC0xKSB7CisgICAgICAgICAgICBvcHRpb25zIHw9IFJlZ2V4cC5NQVRDSF9DQVNFX0lOU0VOU0lUSVZFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzLmluZGV4T2YoJ20nKSAhPSAtMSkgeworICAgICAgICAgICAgb3B0aW9ucyB8PSBSZWdleHAuTUFUQ0hfTVVMVElMSU5FOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzLmluZGV4T2YoJ3MnKSAhPSAtMSkgeworICAgICAgICAgICAgb3B0aW9ucyB8PSBSZWdleHAuTUFUQ0hfU0lOR0xFTElORTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkb1JlcGxhY2UoZmlsZSwgb3B0aW9ucyk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJBbiBlcnJvciBvY2N1cnJlZCBwcm9jZXNzaW5nIGZpbGU6ICciCisgICAgICAgICAgICAgICAgICAgICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICInOiAiICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJUaGUgZm9sbG93aW5nIGZpbGUgaXMgbWlzc2luZzogJyIKKyAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiJyIsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgc3ogPSBmaWxlc2V0cy5zaXplKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIChmaWxlc2V0cy5lbGVtZW50QXQoaSkpOworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKworICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmcy5nZXREaXIoZ2V0UHJvamVjdCgpKSwgZmlsZXNbal0pOworCisgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVwbGFjZShmLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQW4gZXJyb3Igb2NjdXJyZWQgcHJvY2Vzc2luZyBmaWxlOiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSArICInOiAiICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coIlRoZSBmb2xsb3dpbmcgZmlsZSBpcyBtaXNzaW5nOiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmLmdldEFic29sdXRlUGF0aCgpICsgIiciLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JwbS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUnBtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmYTNlYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JwbS5qYXZhCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QdW1wU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworLyoqCisgKiBJbnZva2VzIHRoZSBycG0gdG9vbCB0byBidWlsZCBhIExpbnV4IGluc3RhbGxhdGlvbiBmaWxlLgorICoKKyAqLworcHVibGljIGNsYXNzIFJwbSBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEgxID0gIlBBVEg9IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSDIgPSAiUGF0aD0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIMyA9ICJwYXRoPSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVEhfTEVOID0gUEFUSDEubGVuZ3RoKCk7CisKKyAgICAvKioKKyAgICAgKiB0aGUgc3BlYyBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3BlY0ZpbGU7CisKKyAgICAvKioKKyAgICAgKiB0aGUgcnBtIHRvcCBkaXIKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdG9wRGlyOworCisgICAgLyoqCisgICAgICogdGhlIHJwbSBjb21tYW5kIHRvIHVzZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbW1hbmQgPSAiLWJiIjsKKworICAgIC8qKgorICAgICAqIFRoZSBleGVjdXRhYmxlIHRvIHVzZSBmb3IgYnVpbGRpbmcgdGhlIHBhY2thZ2VzLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcnBtQnVpbGRDb21tYW5kID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIGNsZWFuIEJVSUxEIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhbkJ1aWxkRGlyID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiByZW1vdmUgc3BlYyBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZVNwZWMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIHJlbW92ZSBzb3VyY2VzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZVNvdXJjZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogdGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dDsKKworICAgIC8qKgorICAgICAqIHRoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBlcnJvciBmcm9tIHRoZSBjb21tYW5kCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGVycm9yOworCisgICAgLyoqCisgICAgICogSGFsdCBvbiBlcnJvciByZXR1cm4gdmFsdWUgZnJvbSBycG0gYnVpbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbkVycm9yID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEb24ndCBzaG93IG91dHB1dCBvZiBSUE0gYnVpbGQgY29tbWFuZCBvbiBjb25zb2xlLiBUaGlzIGRvZXMgbm90IGFmZmVjdAorICAgICAqIHRoZSBwcmludGluZyBvZiBvdXRwdXQgYW5kIGVycm9yIG1lc3NhZ2VzIHRvIGZpbGVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBxdWlldCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzaworICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpcyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIHRhc2sgZXhlY3V0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIENvbW1hbmRsaW5lIHRvRXhlY3V0ZSA9IG5ldyBDb21tYW5kbGluZSgpOworCisgICAgICAgIHRvRXhlY3V0ZS5zZXRFeGVjdXRhYmxlKHJwbUJ1aWxkQ29tbWFuZCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ3Vlc3NScG1CdWlsZENvbW1hbmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJwbUJ1aWxkQ29tbWFuZCk7CisgICAgICAgIGlmICh0b3BEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tZGVmaW5lIik7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiX3RvcGRpciIgKyB0b3BEaXIpOworICAgICAgICB9CisKKyAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0TGluZShjb21tYW5kKTsKKworICAgICAgICBpZiAoY2xlYW5CdWlsZERpcikgeworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tY2xlYW4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVtb3ZlU3BlYykgeworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tcm1zcGVjIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlbW92ZVNvdXJjZSkgeworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tcm1zb3VyY2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJTUEVDUy8iICsgc3BlY0ZpbGUpOworCisgICAgICAgIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHN0cmVhbWhhbmRsZXIgPSBudWxsOworICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0c3RyZWFtID0gbnVsbDsKKyAgICAgICAgT3V0cHV0U3RyZWFtIGVycm9yc3RyZWFtID0gbnVsbDsKKyAgICAgICAgaWYgKGVycm9yID09IG51bGwgJiYgb3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghcXVpZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1oYW5kbGVyID0gbmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywgUHJvamVjdC5NU0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmVhbWhhbmRsZXIgPSBuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLCBQcm9qZWN0Lk1TR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zCisgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0c3RyZWFtID0gbmV3IFByaW50U3RyZWFtKGJvcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghcXVpZXQpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRzdHJlYW0gPSBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRzdHJlYW0gPSBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zCisgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShlcnJvcikpOworICAgICAgICAgICAgICAgICAgICBlcnJvcnN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShib3MpOworICAgICAgICAgICAgICAgIH0gIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFxdWlldCkgeworICAgICAgICAgICAgICAgIGVycm9yc3RyZWFtID0gbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3JzdHJlYW0gPSBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbWhhbmRsZXIgPSBuZXcgUHVtcFN0cmVhbUhhbmRsZXIob3V0cHV0c3RyZWFtLCBlcnJvcnN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICBFeGVjdXRlIGV4ZSA9IGdldEV4ZWN1dGUodG9FeGVjdXRlLCBzdHJlYW1oYW5kbGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZygiQnVpbGRpbmcgdGhlIFJQTSBiYXNlZCBvbiB0aGUgIiArIHNwZWNGaWxlICsgIiBmaWxlIik7CisgICAgICAgICAgICBpbnQgcmV0dXJuY29kZSA9IGV4ZS5leGVjdXRlKCk7CisgICAgICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmV0dXJuY29kZSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIiciICsgdG9FeGVjdXRlLmdldEV4ZWN1dGFibGUoKQorICAgICAgICAgICAgICAgICAgICArICInIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAiICsgcmV0dXJuY29kZTsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXRwdXRzdHJlYW0pOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGVycm9yc3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBoYXZlIHRoZSBleHBlY3RlZAorICAgICAqIHN1YmRpcmVjdG9yaWVzLCBTUEVDUywgU09VUkNFUywgQlVJTEQsIFNSUE1TIDsgb3B0aW9uYWwuCisgICAgICogSWYgdGhpcyBpc24ndCBzcGVjaWZpZWQsCisgICAgICogdGhlIDx0dD5iYXNlRGlyPC90dD4gdmFsdWUgaXMgdXNlZAorICAgICAqCisgICAgICogQHBhcmFtIHRkIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbm9ybWFsIFJQTSBkaXJlY3Rvcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb3BEaXIoRmlsZSB0ZCkgeworICAgICAgICB0aGlzLnRvcERpciA9IHRkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoYXQgY29tbWFuZCB0byBpc3N1ZSB0byB0aGUgcnBtIGJ1aWxkIHRvb2w7IG9wdGlvbmFsLgorICAgICAqIFRoZSBkZWZhdWx0IGlzICItYmIiCisgICAgICogQHBhcmFtIGMgdGhlIGNvbW1hbmQgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1hbmQoU3RyaW5nIGMpIHsKKyAgICAgICAgdGhpcy5jb21tYW5kID0gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc3BlYyBGaWxlIHRvIHVzZTsgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHNmIHRoZSBzcGVjIGZpbGUgbmFtZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3BlY0ZpbGUoU3RyaW5nIHNmKSB7CisgICAgICAgIGlmICgoc2YgPT0gbnVsbCkgfHwgKHNmLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBzcGVjaWZ5IGEgc3BlYyBmaWxlIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zcGVjRmlsZSA9IHNmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYWcgKG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlKSB0byByZW1vdmUKKyAgICAgKiB0aGUgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBCVUlMRCBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gY2JkIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xlYW5CdWlsZERpcihib29sZWFuIGNiZCkgeworICAgICAgICBjbGVhbkJ1aWxkRGlyID0gY2JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYWcgKG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlKSB0byByZW1vdmUgdGhlIHNwZWMgZmlsZSBmcm9tIFNQRUNTCisgICAgICogQHBhcmFtIHJzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlU3BlYyhib29sZWFuIHJzKSB7CisgICAgICAgIHJlbW92ZVNwZWMgPSByczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIChvcHRpb25hbCwgZGVmYXVsdD1mYWxzZSkKKyAgICAgKiB0byByZW1vdmUgdGhlIHNvdXJjZXMgYWZ0ZXIgdGhlIGJ1aWxkLgorICAgICAqIFNlZSB0aGUgPHR0Pi0tcm1zb3VyY2U8L3R0PiAgb3B0aW9uIG9mIHJwbWJ1aWxkLgorICAgICAqIEBwYXJhbSBycyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW92ZVNvdXJjZShib29sZWFuIHJzKSB7CisgICAgICAgIHJlbW92ZVNvdXJjZSA9IHJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsIGZpbGUgdG8gc2F2ZSBzdGRvdXQgdG8uCisgICAgICogQHBhcmFtIG91dHB1dCB0aGUgZmlsZSB0byBzYXZlIHN0ZG91dCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoRmlsZSBvdXRwdXQpIHsKKyAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3B0aW9uYWwgZmlsZSB0byBzYXZlIHN0ZGVyciB0bworICAgICAqIEBwYXJhbSBlcnJvciB0aGUgZmlsZSB0byBzYXZlIGVycm9yIG91dHB1dCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvcihGaWxlIGVycm9yKSB7CisgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXhlY3V0YWJsZSB0byBydW4gd2hlbiBidWlsZGluZzsgb3B0aW9uYWwuCisgICAgICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+cnBtYnVpbGQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKiBAcGFyYW0gYyB0aGUgcnBtIGJ1aWxkIGV4ZWN1dGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRScG1CdWlsZENvbW1hbmQoU3RyaW5nIGMpIHsKKyAgICAgICAgdGhpcy5ycG1CdWlsZENvbW1hbmQgPSBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIDxjb2RlPnRydWU8L2NvZGU+LCBzdG9wIHRoZSBidWlsZCBwcm9jZXNzIHdoZW4gdGhlIHJwbWJ1aWxkIGNvbW1hbmQKKyAgICAgKiBleGl0cyB3aXRoIGFuIGVycm9yIHN0YXR1cy4KKyAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgc2hvdWxkIGhhbHQsIG90aGVyd2lzZQorICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBvdXRwdXQgZnJvbSB0aGUgUlBNIGJ1aWxkIGNvbW1hbmQgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBERUJVRy4KKyAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG91dHB1dCBzaG91bGQgYmUgbG9nZ2VkLCBvdGhlcndpc2UKKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgcXVpZXQgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciA8Y29kZT5ycG1idWlsZDwvY29kZT4gaXMgb24gdGhlIFBBVEggYW5kIHJldHVybnMKKyAgICAgKiB0aGUgYWJzb2x1dGUgcGF0aCB0byBpdCAtIGZhbGxzIGJhY2sgdG8gPGNvZGU+cnBtPC9jb2RlPgorICAgICAqIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbW1hbmQgdXNlZCB0byBidWlsZCBSUE0ncworICAgICAqCisgICAgICogQHNpbmNlIDEuNgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ3Vlc3NScG1CdWlsZENvbW1hbmQoKSB7CisgICAgICAgIFZlY3RvciBlbnYgPSBFeGVjdXRlLmdldFByb2NFbnZpcm9ubWVudCgpOworICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGVudi5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgU3RyaW5nIHZhciA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICh2YXIuc3RhcnRzV2l0aChQQVRIMSkgfHwgdmFyLnN0YXJ0c1dpdGgoUEFUSDIpIHx8IHZhci5zdGFydHNXaXRoKFBBVEgzKSkgeworICAgICAgICAgICAgICAgIHBhdGggPSB2YXIuc3Vic3RyaW5nKFBBVEhfTEVOKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSwgcGF0aCk7CisgICAgICAgICAgICBTdHJpbmdbXSBwRWxlbWVudHMgPSBwLmxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocEVsZW1lbnRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJycG1idWlsZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChPcy5pc0ZhbWlseSgiZG9zIikgPyAiLmV4ZSIgOiAiIikpOworICAgICAgICAgICAgICAgIGlmIChmLmNhblJlYWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gInJwbSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBleGVjdXRlIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdG9FeGVjdXRlIHRoZSBjb21tYW5kIGxpbmUgdG8gdXNlLgorICAgICAqIEBwYXJhbSBzdHJlYW1oYW5kbGVyIHRoZSBzdHJlYW0gaGFuZGxlciB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgZXhlY3V0ZSBvYmplY3QuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHByb3RlY3RlZCBFeGVjdXRlIGdldEV4ZWN1dGUoQ29tbWFuZGxpbmUgdG9FeGVjdXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgc3RyZWFtaGFuZGxlcikgeworICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKHN0cmVhbWhhbmRsZXIsIG51bGwpOworCisgICAgICAgIGV4ZS5zZXRBbnRSdW4oZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaWYgKHRvcERpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0b3BEaXIgPSBnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpOworICAgICAgICB9CisgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KHRvcERpcik7CisKKyAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKHRvRXhlY3V0ZS5nZXRDb21tYW5kbGluZSgpKTsKKyAgICAgICAgcmV0dXJuIGV4ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY2hlbWFWYWxpZGF0ZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NoZW1hVmFsaWRhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjFmOTYwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NoZW1hVmFsaWRhdGUuamF2YQpAQCAtMCwwICsxLDUyOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5YbWxDb25zdGFudHM7CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CisKKy8qKgorICogVmFsaWRhdGUgWE1MIFNjaGVtYSBkb2N1bWVudHMuCisgKiBUaGlzIHRhc2sgdmFsaWRhdGVzIFhNTCBzY2hlbWEgZG9jdW1lbnRzLiBJdCByZXF1aXJlcyBhbiBYTUwgcGFyc2VyCisgKiB0aGF0IGhhbmRsZXMgdGhlIHJlbGV2YW50IFNBeCwgWGVyY2VzIG9yIEpBWFAgb3B0aW9ucy4KKyAqCisgKiBUbyByZXNvbHZlIHJlbW90ZSByZWZlcmVuY2llcywgQW50IG1heSBuZWVkIGl0cyBwcm94eSBzZXQgdXAsIHVzaW5nIHRoZQorICogc2V0cHJveHkgdGFzay4KKyAqCisgKiBIYW5kcyBvZmYgbW9zdCBvZiB0aGUgd29yayB0byBpdHMgcGFyZW50LCB7QGxpbmsgWE1MVmFsaWRhdGVUYXNrfQorICogQHNpbmNlIEFudDEuNworICovCisKK3B1YmxpYyBjbGFzcyBTY2hlbWFWYWxpZGF0ZSBleHRlbmRzIFhNTFZhbGlkYXRlVGFzayB7CisKKyAgICAvKiogbWFwIG9mIGFsbCBkZWNsYXJlZCBzY2hlbWFzOyB3ZSBjYXRjaCBhbmQgY29tcGxhaW4gYWJvdXQgcmVkZWZpbml0aW9ucyAqLworICAgIHByaXZhdGUgSGFzaE1hcCBzY2hlbWFMb2NhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqIGZ1bGwgY2hlY2tpbmcgb2YgYSBzY2hlbWEgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZnVsbENoZWNraW5nID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIGZsYWcgdG8gZGlzYWJsZSBEVEQgc3VwcG9ydC4gQmVzdCBsZWZ0IGVuYWJsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVEVEQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIGRlZmF1bHQgVVJMIGZvciBub25hbWVzcGFjZSBzY2hlbWFzCisgICAgICovCisgICAgcHJpdmF0ZSBTY2hlbWFMb2NhdGlvbiBhbm9ueW1vdXNTY2hlbWE7CisKKyAgICAvLyBFcnJvciBzdHJpbmdzCisgICAgLyoqIFNBWDEgbm90IHN1cHBvcnRlZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1NBWF8xID0gIlNBWDEgcGFyc2VycyBhcmUgbm90IHN1cHBvcnRlZCI7CisKKyAgICAvKiogc2NoZW1hIGZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19YU0RfU1VQUE9SVAorICAgICAgICA9ICJQYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCBYZXJjZXMgb3IgSkFYUCBzY2hlbWEgZmVhdHVyZXMiOworCisgICAgLyoqIHRvbyBtYW55IGRlZmF1bHQgc2NoZW1hcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1RPT19NQU5ZX0RFRkFVTFRfU0NIRU1BUworICAgICAgICA9ICJPbmx5IG9uZSBvZiBkZWZhdWx0U2NoZW1hRmlsZSBhbmQgZGVmYXVsdFNjaGVtYVVSTCBhbGxvd2VkIjsKKworICAgIC8qKiB1bmFibGUgdG8gY3JlYXRlIHBhcnNlciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1BBUlNFUl9DUkVBVElPTl9GQUlMVVJFCisgICAgICAgID0gIkNvdWxkIG5vdCBjcmVhdGUgcGFyc2VyIjsKKworICAgIC8qKiBhZGRpbmcgc2NoZW1hICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9BRERJTkdfU0NIRU1BID0gIkFkZGluZyBzY2hlbWEgIjsKKworICAgIC8qKiBEdXBsaWNhdGUgZGVjbGFyYXRpb24gb2Ygc2NoZW1hICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0RVUExJQ0FURV9TQ0hFTUEKKyAgICAgICAgPSAiRHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mIHNjaGVtYSAiOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBwcm9qZWN0IHRvIGxldCB0aGUgdGFzayBpbml0aWFsaXplIHByb3Blcmx5LiBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmluaXQoKTsKKyAgICAgICAgLy92YWxpZGF0aW5nCisgICAgICAgIHNldExlbmllbnQoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR1cm4gb24gWFNEIHN1cHBvcnQgaW4gWGVyY2VzLgorICAgICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlWGVyY2VzU2NoZW1hVmFsaWRhdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldEZlYXR1cmUoWG1sQ29uc3RhbnRzLkZFQVRVUkVfWFNELCB0cnVlKTsKKyAgICAgICAgICAgIC8vc2V0IHRoZSBzY2hlbWEgc291cmNlIGZvciB0aGUgZG9jCisgICAgICAgICAgICBzZXROb05hbWVzcGFjZVNjaGVtYVByb3BlcnR5KFhtbENvbnN0YW50cy5QUk9QRVJUWV9OT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IG5vbmFtZXNwYWNlIGhhbmRsaW5nIHVwIGZvciB4ZXJjZXMgb3Igb3RoZXIgcGFyc2VycworICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Tm9OYW1lc3BhY2VTY2hlbWFQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgU3RyaW5nIGFub25TY2hlbWEgPSBnZXROb05hbWVzcGFjZVNjaGVtYVVSTCgpOworICAgICAgICBpZiAoYW5vblNjaGVtYSAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eShwcm9wZXJ0eSwgYW5vblNjaGVtYSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgc2NoZW1hIGF0dHJpYnV0ZXMgaW4gYSBKQVhQIDEuMiBlbmdpbmUuCisgICAgICogQHNlZSA8QSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL2NoYW5nZS1yZXF1ZXN0cy0xMS5odG1sIj4KKyAgICAgKiBKQVhQIDEuMiBBcHByb3ZlZCBDSEFOR0VTPC9BPgorICAgICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlSkFYUDEyU2NoZW1hVmFsaWRhdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vZW5hYmxlIFhTRAorICAgICAgICAgICAgc2V0UHJvcGVydHkoWG1sQ29uc3RhbnRzLkZFQVRVUkVfSkFYUDEyX1NDSEVNQV9MQU5HVUFHRSwgWG1sQ29uc3RhbnRzLlVSSV9YU0QpOworICAgICAgICAgICAgLy9zZXQgdGhlIHNjaGVtYSBzb3VyY2UgZm9yIHRoZSBkb2MKKyAgICAgICAgICAgIHNldE5vTmFtZXNwYWNlU2NoZW1hUHJvcGVydHkoWG1sQ29uc3RhbnRzLkZFQVRVUkVfSkFYUDEyX1NDSEVNQV9TT1VSQ0UpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgdGhlIHNjaGVtYQorICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgc2NoZW1hIGxvY2F0aW9uLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gbmFtZXNwYWNlLCBvciBpZiB0aGVyZSBhbHJlYWR5CisgICAgICogaXMgYSBkZWNsYXJhdGlvbiBvZiB0aGlzIHNjaGVtYSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNjaGVtYShTY2hlbWFMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBsb2coImFkZGluZyBzY2hlbWEgIiArIGxvY2F0aW9uLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIGxvY2F0aW9uLnZhbGlkYXRlTmFtZXNwYWNlKCk7CisgICAgICAgIFNjaGVtYUxvY2F0aW9uIG9sZCA9IChTY2hlbWFMb2NhdGlvbikgc2NoZW1hTG9jYXRpb25zLmdldChsb2NhdGlvbi5nZXROYW1lc3BhY2UoKSk7CisgICAgICAgIGlmIChvbGQgIT0gbnVsbCAmJiAhb2xkLmVxdWFscyhsb2NhdGlvbikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9EVVBMSUNBVEVfU0NIRU1BICsgbG9jYXRpb24pOworICAgICAgICB9CisgICAgICAgIHNjaGVtYUxvY2F0aW9ucy5wdXQobG9jYXRpb24uZ2V0TmFtZXNwYWNlKCksIGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlbmFibGUgZnVsbCBzY2hlbWEgY2hlY2tpbmcuIFNsb3dlciBidXQgYmV0dGVyLgorICAgICAqIEBwYXJhbSBmdWxsQ2hlY2tpbmcgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxsQ2hlY2tpbmcoYm9vbGVhbiBmdWxsQ2hlY2tpbmcpIHsKKyAgICAgICAgdGhpcy5mdWxsQ2hlY2tpbmcgPSBmdWxsQ2hlY2tpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIGEgc2NoZW1hIGxvY2F0aW9uIHRvIGhvbGQgdGhlIGFub255bW91cworICAgICAqIHNjaGVtYQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFub255bW91c1NjaGVtYSgpIHsKKyAgICAgICAgaWYgKGFub255bW91c1NjaGVtYSA9PSBudWxsKSB7CisgICAgICAgICAgICBhbm9ueW1vdXNTY2hlbWEgPSBuZXcgU2NoZW1hTG9jYXRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBhbm9ueW1vdXNTY2hlbWEuc2V0TmFtZXNwYWNlKCIobm8gbmFtZXNwYWNlKSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlkZW50aWZ5IHRoZSBVUkwgb2YgdGhlIGRlZmF1bHQgc2NoZW1hCisgICAgICogQHBhcmFtIGRlZmF1bHRTY2hlbWFVUkwgdGhlIFVSTCBvZiB0aGUgZGVmYXVsdCBzY2hlbWEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9OYW1lc3BhY2VVUkwoU3RyaW5nIGRlZmF1bHRTY2hlbWFVUkwpIHsKKyAgICAgICAgY3JlYXRlQW5vbnltb3VzU2NoZW1hKCk7CisgICAgICAgIHRoaXMuYW5vbnltb3VzU2NoZW1hLnNldFVybChkZWZhdWx0U2NoZW1hVVJMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZGVudGlmeSBhIGZpbGUgY29udGFpbmluZyB0aGUgZGVmYXVsdCBzY2hlbWEKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFNjaGVtYUZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb05hbWVzcGFjZUZpbGUoRmlsZSBkZWZhdWx0U2NoZW1hRmlsZSkgeworICAgICAgICBjcmVhdGVBbm9ueW1vdXNTY2hlbWEoKTsKKyAgICAgICAgdGhpcy5hbm9ueW1vdXNTY2hlbWEuc2V0RmlsZShkZWZhdWx0U2NoZW1hRmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmxhZyB0byBkaXNhYmxlIERURCBzdXBwb3J0LgorICAgICAqIEBwYXJhbSBkaXNhYmxlRFREIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzYWJsZURURChib29sZWFuIGRpc2FibGVEVEQpIHsKKyAgICAgICAgdGhpcy5kaXNhYmxlRFREID0gZGlzYWJsZURURDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbml0IHRoZSBwYXJzZXIgOiBsb2FkIHRoZSBwYXJzZXIgY2xhc3MsIGFuZCBzZXQgZmVhdHVyZXMgaWYgbmVjZXNzYXJ5IEl0CisgICAgICogaXMgb25seSBhZnRlciB0aGlzIHRoYXQgdGhlIHJlYWRlciBpcyB2YWxpZAorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgd2VudCB3cm9uZworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRWYWxpZGF0b3IoKSB7CisgICAgICAgIHN1cGVyLmluaXRWYWxpZGF0b3IoKTsKKyAgICAgICAgLy92YWxpZGF0ZSB0aGUgcGFyc2VyIHR5cGUKKyAgICAgICAgaWYgKGlzU2F4MVBhcnNlcigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfU0FYXzEpOworICAgICAgICB9CisKKyAgICAgICAgLy9lbmFibGUgc2NoZW1hCisgICAgICAgIC8vc2V0RmVhdHVyZShYbWxDb25zdGFudHMuRkVBVFVSRV9WQUxJREFUSU9OLCBmYWxzZSk7CisgICAgICAgIHNldEZlYXR1cmUoWG1sQ29uc3RhbnRzLkZFQVRVUkVfTkFNRVNQQUNFUywgdHJ1ZSk7CisgICAgICAgIGlmICghZW5hYmxlWGVyY2VzU2NoZW1hVmFsaWRhdGlvbigpICYmICFlbmFibGVKQVhQMTJTY2hlbWFWYWxpZGF0aW9uKCkpIHsKKyAgICAgICAgICAgIC8vY291bGRudCB1c2UgdGhlIHhlcmNlcyBvciBqYXhwIGNhbGxzCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTk9fWFNEX1NVUFBPUlQpOworICAgICAgICB9CisKKyAgICAgICAgLy9lbmFibGUgc2NoZW1hIGNoZWNraW5nCisgICAgICAgIHNldEZlYXR1cmUoWG1sQ29uc3RhbnRzLkZFQVRVUkVfWFNEX0ZVTExfVkFMSURBVElPTiwgZnVsbENoZWNraW5nKTsKKworICAgICAgICAvL3R1cm4gb2ZmIERURHMgaWYgZGVzaXJlZAorICAgICAgICBzZXRGZWF0dXJlSWZTdXBwb3J0ZWQoWG1sQ29uc3RhbnRzLkZFQVRVUkVfRElTQUxMT1dfRFRELCBkaXNhYmxlRFREKTsKKworICAgICAgICAvL3NjaGVtYSBkZWNsYXJhdGlvbnMgZ28gaW4gbmV4dAorICAgICAgICBhZGRTY2hlbWFMb2NhdGlvbnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSByZWFkZXIgaWYgdGhlIHVzZSBvZiB0aGUgY2xhc3MgZGlkIG5vdCBzcGVjaWZ5IGFub3RoZXIgb25lLgorICAgICAqIFRoZSByZWFzb24gdG8gbm90IHVzZSB7QGxpbmsgSkFYUFV0aWxzI2dldFhNTFJlYWRlcigpfSB3YXMgdG8KKyAgICAgKiBjcmVhdGUgb3VyIG93biBmYWN0b3J5IHdpdGggb3VyIG93biBvcHRpb25zLgorICAgICAqIEByZXR1cm4gYSBkZWZhdWx0IFhNTCBwYXJzZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGNyZWF0ZURlZmF1bHRSZWFkZXIoKSB7CisgICAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOworICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworICAgICAgICAgICAgcmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9QQVJTRVJfQ1JFQVRJT05fRkFJTFVSRSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfUEFSU0VSX0NSRUFUSU9OX0ZBSUxVUkUsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogYnVpbGQgYSBzdHJpbmcgbGlzdCBvZiBhbGwgc2NoZW1hIGxvY2F0aW9ucywgdGhlbiBzZXQgdGhlIHJlbGV2YW50CisgICAgICogcHJvcGVydHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkU2NoZW1hTG9jYXRpb25zKCkgeworICAgICAgICBJdGVyYXRvciBpdCA9IHNjaGVtYUxvY2F0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2NoZW1hTG9jYXRpb24gc2NoZW1hTG9jYXRpb24gPSAoU2NoZW1hTG9jYXRpb24pIGl0Lm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyB0dXBsZSA9IHNjaGVtYUxvY2F0aW9uLmdldFVSSWFuZExvY2F0aW9uKCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHR1cGxlKTsKKyAgICAgICAgICAgIGxvZygiQWRkaW5nIHNjaGVtYSAiICsgdHVwbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eShYbWxDb25zdGFudHMuUFJPUEVSVFlfU0NIRU1BX0xPQ0FUSU9OLCBidWZmZXIudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgVVJMIG9mIHRoZSBubyBuYW1lc3BhY2Ugc2NoZW1hCisgICAgICogQHJldHVybiB0aGUgc2NoZW1hIFVSTAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9OYW1lc3BhY2VTY2hlbWFVUkwoKSB7CisgICAgICAgIGlmIChhbm9ueW1vdXNTY2hlbWEgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYW5vbnltb3VzU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uVVJMKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgYSBmZWF0dXJlIGlmIGl0IGlzIHN1cHBvcnRlZCwgbG9nIGF0IHZlcmJvc2UgbGV2ZWwgaWYKKyAgICAgKiBub3QKKyAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRGZWF0dXJlSWZTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldFhtbFJlYWRlcigpLnNldEZlYXR1cmUoZmVhdHVyZSwgdmFsdWUpOworICAgICAgICB9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiTm90IHJlY29nbml6aWVkOiAiICsgZmVhdHVyZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIk5vdCBzdXBwb3J0ZWQ6ICIgKyBmZWF0dXJlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGhhbmRsZXIgY2FsbGVkIG9uIHN1Y2Nlc3NmdWwgZmlsZSB2YWxpZGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVQcm9jZXNzZWQgbnVtYmVyIG9mIGZpbGVzIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN1Y2Nlc3NmdWxWYWxpZGF0aW9uKGludCBmaWxlUHJvY2Vzc2VkKSB7CisgICAgICAgIGxvZyhmaWxlUHJvY2Vzc2VkICsgTUVTU0FHRV9GSUxFU19WQUxJREFURUQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NoZW1hIGxvY2F0aW9uLiBUaGlzIGlzIGEgVVJJIHBsdXMgZWl0aGVyIGEgZmlsZSBvcgorICAgICAqIGEgdXJsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTY2hlbWFMb2NhdGlvbiB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKKworICAgICAgICBwcml2YXRlIEZpbGUgZmlsZTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyB1cmw7CisKKyAgICAgICAgLyoqIE5vIG5hbWVzcGFjZSBVUkkgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fVVJJID0gIk5vIG5hbWVzcGFjZSBVUkkiOworCisgICAgICAgIC8qKiBCb3RoIFVSTCBhbmQgRmlsZSB3ZXJlIGdpdmVuIGZvciBzY2hlbWEgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfVFdPX0xPQ0FUSU9OUworICAgICAgICAgICAgPSAiQm90aCBVUkwgYW5kIEZpbGUgd2VyZSBnaXZlbiBmb3Igc2NoZW1hICI7CisKKyAgICAgICAgLyoqIEZpbGUgbm90IGZvdW5kICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX0ZJTEUgPSAiRmlsZSBub3QgZm91bmQ6ICI7CisKKyAgICAgICAgLyoqIENhbm5vdCBtYWtlIFVSTCAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19VUkxfUkVQUkVTRU5UQVRJT04KKyAgICAgICAgICAgID0gIkNhbm5vdCBtYWtlIGEgVVJMIG9mICI7CisKKyAgICAgICAgLyoqIE5vIGxvY2F0aW9uIHByb3ZpZGVkICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX0xPQ0FUSU9OCisgICAgICAgICAgICA9ICJObyBmaWxlIG9yIFVSTCBzdXBwbGllZCBmb3IgdGhlIHNjaGVtYSAiOworCisgICAgICAgIC8qKiBObyBhcmcgY29uc3RydWN0b3IgKi8KKyAgICAgICAgcHVibGljIFNjaGVtYUxvY2F0aW9uKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbmFtZXNwYWNlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogc2V0IHRoZSBuYW1lc3BhY2Ugb2YgdGhpcyBzY2hlbWEuIEFueSBVUkkKKyAgICAgICAgICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIHRvIHVzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7CisgICAgICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGZpbGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NoZW1hLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWxlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGlkZW50aWZ5IGEgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgbmFtZXNwYWNlJ3Mgc2NoZW1hLgorICAgICAgICAgKiBUaGUgZmlsZSBtdXN0IGV4aXN0LgorICAgICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBjb250YWlucyB0aGUgc2NoZW1hLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBjb250YWluaW5nIHRoZSBzY2hlbWEuCisgICAgICAgICAqIEByZXR1cm4gdGhlIFVSTCBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAgICAgICAgIHJldHVybiB1cmw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogaWRlbnRpZnkgYSBVUkwgdGhhdCBob3N0cyB0aGUgc2NoZW1hLgorICAgICAgICAgKiBAcGFyYW0gdXJsIHRoZSBVUkwgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgIHRoaXMudXJsID0gdXJsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGdldCB0aGUgVVJMIG9mIHRoZSBzY2hlbWEKKyAgICAgICAgICogQHJldHVybiBhIFVSTCB0byB0aGUgc2NoZW1hCisgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgbm90CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtYUxvY2F0aW9uVVJMKCkgeworICAgICAgICAgICAgYm9vbGVhbiBoYXNGaWxlID0gZmlsZSAhPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiBoYXNVUkwgPSBpc1NldCh1cmwpOworICAgICAgICAgICAgLy9lcnJvciBpZiBib3RoIGFyZSBlbXB0eSwgb3IgYm90aCBhcmUgc2V0CisgICAgICAgICAgICBpZiAoIWhhc0ZpbGUgJiYgIWhhc1VSTCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19MT0NBVElPTiArIG5hbWVzcGFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzRmlsZSAmJiBoYXNVUkwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfVFdPX0xPQ0FUSU9OUyArIG5hbWVzcGFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgc2NoZW1hID0gdXJsOworICAgICAgICAgICAgaWYgKGhhc0ZpbGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX0ZJTEUgKyBmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuZ2V0RmlsZVVSTChmaWxlKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBhbG1vc3QgaW1wbGF1c2libGUsIGJ1dCByZXF1aXJlZCBoYW5kbGluZworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTk9fVVJMX1JFUFJFU0VOVEFUSU9OICsgZmlsZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNjaGVtYTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiB2YWxpZGF0ZSB0aGUgZmllbGRzIHRoZW4gY3JlYXRlIGEgInVyaSBsb2NhdGlvbiIgc3RyaW5nCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gc3RyaW5nIG9mIHVyaSBhbmQgbG9jYXRpb24KKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJYW5kTG9jYXRpb24oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgdmFsaWRhdGVOYW1lc3BhY2UoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG5hbWVzcGFjZSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGdldFNjaGVtYUxvY2F0aW9uVVJMKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBhc3NlcnQgdGhhdCBhIG5hbWVzcGFjZSBpcyB2YWxpZAorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG5vdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVOYW1lc3BhY2UoKSB7CisgICAgICAgICAgICBpZiAoIWlzU2V0KGdldE5hbWVzcGFjZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19VUkkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNoZWNrIHRoYXQgYSBwcm9wZXJ0eSBpcyBzZXQKKyAgICAgICAgICogQHBhcmFtIHByb3BlcnR5IHN0cmluZyB0byBjaGVjaworICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgaXQgaXMgbm90IG51bGwgb3IgZW1wdHkKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1NldChTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5Lmxlbmd0aCgpICE9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogZXF1YWxpdHkgdGVzdCBjaGVja3MgbmFtZXNwYWNlLCBsb2NhdGlvbiBhbmQgZmlsZW5hbWUuIEFsbCBtdXN0IG1hdGNoLAorICAgICAgICAgKiBAcGFyYW0gbyBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhlIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaW4gdmFsdWUKKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU2NoZW1hTG9jYXRpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBTY2hlbWFMb2NhdGlvbiBzY2hlbWFMb2NhdGlvbiA9IChTY2hlbWFMb2NhdGlvbikgbzsKKworICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCA/ICFmaWxlLmVxdWFscyhzY2hlbWFMb2NhdGlvbi5maWxlKSA6IHNjaGVtYUxvY2F0aW9uLmZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCA/ICFuYW1lc3BhY2UuZXF1YWxzKHNjaGVtYUxvY2F0aW9uLm5hbWVzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgOiBzY2hlbWFMb2NhdGlvbi5uYW1lc3BhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCA/ICF1cmwuZXF1YWxzKHNjaGVtYUxvY2F0aW9uLnVybCkgOiBzY2hlbWFMb2NhdGlvbi51cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJhdGUgYSBoYXNoY29kZSBkZXBlbmRpbmcgb24gdGhlIG5hbWVzcGFjZSwgdXJsIGFuZCBmaWxlIG5hbWUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGhhc2hjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICAgICAgcmVzdWx0ID0gKG5hbWVzcGFjZSAhPSBudWxsID8gbmFtZXNwYWNlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgKGZpbGUgIT0gbnVsbCA/IGZpbGUuaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgcmVzdWx0ID0gMjkgKiByZXN1bHQgKyAodXJsICE9IG51bGwgPyB1cmwuaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0IGZvciBlcnJvciBtZXNzYWdlcworICAgICAgICAgKiBhbmQgdGhlIGxpa2UKKyAgICAgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG5hbWVzcGFjZSAhPSBudWxsID8gbmFtZXNwYWNlIDogIihhbm9ueW1vdXMpIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHVybCAhPSBudWxsID8gKHVybCArICIgIikgOiAiIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgOiAiIik7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9IC8vU2NoZW1hTG9jYXRpb24KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjcmlwdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NyaXB0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5MzBmMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjcmlwdC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlNjcmlwdFJ1bm5lckhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKKworLyoqCisgKiBFeGVjdXRlcyBhIHNjcmlwdC4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0ic2NyaXB0IgorICovCitwdWJsaWMgY2xhc3MgU2NyaXB0IGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIFNjcmlwdFJ1bm5lckhlbHBlciBoZWxwZXIgPSBuZXcgU2NyaXB0UnVubmVySGVscGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb2plY3QuCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRhc2sgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBzdXBlci5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBoZWxwZXIuc2V0UHJvamVjdENvbXBvbmVudCh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHNjcmlwdCB1c2luZyB0aGUgaGVscGVyIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaGVscGVyLmdldFNjcmlwdFJ1bm5lcigpLmV4ZWN1dGVTY3JpcHQoIkFOVCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciB0aGUgc2NyaXB0aW5nIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihTdHJpbmcgbWFuYWdlcikgeworICAgICAgICBoZWxwZXIuc2V0TWFuYWdlcihtYW5hZ2VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBsYW5ndWFnZSAocmVxdWlyZWQpLgorICAgICAqCisgICAgICogQHBhcmFtIGxhbmd1YWdlIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbmFtZSBmb3IgdGhlIHNjcmlwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgaGVscGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlIDsgb3B0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0IHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmMoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIGhlbHBlci5zZXRTcmMobmV3IEZpbGUoZmlsZU5hbWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNjcmlwdCB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgYSBjb21wb25lbnQgb2YgdGhlIHNjcmlwdCB0ZXh0IHRvIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaGVscGVyLmFkZFRleHQodGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgc2VhcmNoIHBhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGhlbHBlci5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbXB0eSBQYXRoIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQgYnkgQW50LgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGhlbHBlci5jcmVhdGVDbGFzc3BhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCBieSByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gciBhIFJlZmVyZW5jZSB0byBhIFBhdGggaW5zdGFuY2UgdG8gYmUgdXNlZCBhcyB0aGUgY2xhc3NwYXRoCisgICAgICogICAgICAgICAgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGhlbHBlci5zZXRDbGFzc3BhdGhSZWYocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXRiZWFucyBhdHRyaWJ1dGUuCisgICAgICogSWYgdGhpcyBpcyB0cnVlLCAmbHQ7c2NyaXB0Jmd0OyB3aWxsIGNyZWF0ZSB2YXJpYWJsZXMgaW4gdGhlCisgICAgICogc2NyaXB0IGluc3RhbmNlIGZvciBhbGwKKyAgICAgKiBwcm9wZXJ0aWVzLCB0YXJnZXRzIGFuZCByZWZlcmVuY2VzIG9mIHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICogSXQgdGhpcyBpcyBmYWxzZSwgb25seSB0aGUgcHJvamVjdCBhbmQgc2VsZiB2YXJpYWJsZXMgd2lsbAorICAgICAqIGJlIHNldC4KKyAgICAgKiBUaGUgZGVmYXVsdCBpcyB0cnVlLgorICAgICAqIEBwYXJhbSBzZXRCZWFucyB0aGUgdmFsdWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNldEJlYW5zKGJvb2xlYW4gc2V0QmVhbnMpIHsKKyAgICAgICAgaGVscGVyLnNldFNldEJlYW5zKHNldEJlYW5zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TdHlsZUJvb2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1N0eWxlQm9vay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGU2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TdHlsZUJvb2suamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhOworCisvKioKKyAqIEV4ZWN1dGVzIHRoZSBBcGFjaGUgU3R5bGVib29rIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLgorICogVW5saWtlIHRoZSBjb21tYW5kbGluZSB2ZXJzaW9uIG9mIHRoaXMgdG9vbCwgYWxsIHRocmVlIGFyZ3VtZW50cworICogYXJlIHJlcXVpcmVkIHRvIHJ1biBzdHlsZWJvb2suCisgKiA8cD4KKyAqIEJlaW5nIGV4dGVuZGVkIGZyb20gJmx0O0phdmEmZ3Q7LCBhbGwgdGhlIHBhcmVudCdzIGF0dHJpYnV0ZXMKKyAqIGFuZCBvcHRpb25zIGFyZSBhdmFpbGFibGUuIERvIG5vdCBzZXQgYW55IGFwYXJ0IGZyb20gdGhlIDx0dD5jbGFzc3BhdGg8L3R0PgorICogYXMgdGhleSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlcmUgaW4gZnV0dXJlLgorICogQHRvZG8gc3RvcCBleHRlbmRpbmcgZnJvbSBKYXZhLgorICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgorICogICAgICAgICAgICAgVGhpcyB0YXNrIGlzIGNvbnNpZGVyZWQgdW5zdXBwb3J0ZWQgYnkgdGhlIEFudCBkZXZlbG9wZXJzCisgKi8KK3B1YmxpYyBjbGFzcyBTdHlsZUJvb2sgZXh0ZW5kcyBKYXZhIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8vIENoZWNrU3R5bGU6TWVtYmVyTmFtZUNoZWNrIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIEZpbGUgbV90YXJnZXREaXJlY3Rvcnk7CisgICAgcHJvdGVjdGVkIEZpbGUgbV9za2luRGlyZWN0b3J5OworICAgIHByb3RlY3RlZCBTdHJpbmcgbV9sb2FkZXJDb25maWc7CisgICAgcHJvdGVjdGVkIEZpbGUgbV9ib29rOworICAgIC8vIENoZWNrU3R5bGU6TWVtYmVyTmFtZUNoZWNrIE9OCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgU3R5bGVCb29rKCkgeworICAgICAgICBzZXRDbGFzc25hbWUoIm9yZy5hcGFjaGUuc3R5bGVib29rLlN0eWxlQm9vayIpOworICAgICAgICBzZXRGb3JrKHRydWUpOworICAgICAgICBzZXRGYWlsb25lcnJvcih0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJvb2sgeG1sIGZpbGUgdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uIHN0YXJ0cyBmcm9tOworICAgICAqIHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBib29rIHRoZSBzb3VyY2UgZmlsZQorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0Qm9vayhmaW5hbCBGaWxlIGJvb2spIHsKKyAgICAgICAgbV9ib29rID0gYm9vazsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIHN0eWxlYm9vayBza2luOworICAgICAqIHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBza2luRGlyZWN0b3J5IHRoZSBsb2NhdGlvbiBvZiB0aGUgc3R5bGVib29rIHNraW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTa2luRGlyZWN0b3J5KGZpbmFsIEZpbGUgc2tpbkRpcmVjdG9yeSkgeworICAgICAgICBtX3NraW5EaXJlY3RvcnkgPSBza2luRGlyZWN0b3J5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkOworICAgICAqIHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSB0YXJnZXREaXJlY3RvcnkgdGhlIGRvY3VtZW50IG91dHB1dCBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXREaXJlY3RvcnkoZmluYWwgRmlsZSB0YXJnZXREaXJlY3RvcnkpIHsKKyAgICAgICAgbV90YXJnZXREaXJlY3RvcnkgPSB0YXJnZXREaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBsb2FkZXIgY29uZmlndXJhdGlvbiB0byBzZW5kIHRvIHN0eWxlYm9vazsgb3B0aW9uYWwuCisgICAgICogQHBhcmFtIGxvYWRlckNvbmZpZyB0aGUgY29uZmlndXJhdGlvbiB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGVyQ29uZmlnKGZpbmFsIFN0cmluZyBsb2FkZXJDb25maWcpIHsKKyAgICAgICAgbV9sb2FkZXJDb25maWcgPSBsb2FkZXJDb25maWc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBjYWxsIHRoZSBwcm9ncmFtCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCisgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIGlmIChudWxsID09IG1fdGFyZ2V0RGlyZWN0b3J5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRhcmdldERpcmVjdG9yeSBhdHRyaWJ1dGUgbm90IHNldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsID09IG1fc2tpbkRpcmVjdG9yeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTa2luRGlyZWN0b3J5IGF0dHJpYnV0ZSBub3Qgc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgPT0gbV9ib29rKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJvb2sgYXR0cmlidXRlIG5vdCBzZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBjcmVhdGVBcmcoKS5zZXRWYWx1ZSgidGFyZ2V0RGlyZWN0b3J5PSIgKyBtX3RhcmdldERpcmVjdG9yeSk7CisgICAgICAgIGNyZWF0ZUFyZygpLnNldFZhbHVlKG1fYm9vay50b1N0cmluZygpKTsKKyAgICAgICAgY3JlYXRlQXJnKCkuc2V0VmFsdWUobV9za2luRGlyZWN0b3J5LnRvU3RyaW5nKCkpOworICAgICAgICBpZiAobnVsbCAhPSBtX2xvYWRlckNvbmZpZykgeworICAgICAgICAgICAgY3JlYXRlQXJnKCkuc2V0VmFsdWUoImxvYWRlckNvbmZpZz0iICsgbV9sb2FkZXJDb25maWcpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1RyYVhMaWFpc29uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2Q1NzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvbi5qYXZhCkBAIC0wLDAgKzEsNTY5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5FcnJvckxpc3RlbmVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlTG9jYXRvcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRMaWFpc29uMzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRMb2dnZXJBd2FyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUUHJvY2VzczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5YTUxDYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlVSTFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSkFYUFV0aWxzOworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CisKKy8qKgorICogQ29uY3JldGUgbGlhaXNvbiBmb3IgWFNMVCBwcm9jZXNzb3IgaW1wbGVtZW50aW5nIFRyYVguIChpZSBKQVhQIDEuMSkKKyAqCisgKiBAc2luY2UgQW50IDEuMworICovCitwdWJsaWMgY2xhc3MgVHJhWExpYWlzb24gaW1wbGVtZW50cyBYU0xUTGlhaXNvbjMsIEVycm9yTGlzdGVuZXIsIFhTTFRMb2dnZXJBd2FyZSB7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZm9yIHRyYW5zZm9ybWluZyBmaWxlbmFtZXMgdG8gVVJJcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCA8Y29kZT5Qcm9qZWN0PC9jb2RlPgorICAgICAqLworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgLyoqCisgICAgICogdGhlIG5hbWUgb2YgdGhlIGZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdG8gdXNlCisgICAgICogb3IgbnVsbCBmb3IgZGVmYXVsdCBKQVhQIGxvb2t1cC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmYWN0b3J5TmFtZSA9IG51bGw7CisKKyAgICAvKiogVGhlIHRyYXggVHJhbnNmb3JtZXJGYWN0b3J5ICovCisgICAgcHJpdmF0ZSBUcmFuc2Zvcm1lckZhY3RvcnkgdGZhY3RvcnkgPSBudWxsOworCisgICAgLyoqIHN0eWxlc2hlZXQgdG8gdXNlIGZvciB0cmFuc2Zvcm1hdGlvbiAqLworICAgIHByaXZhdGUgUmVzb3VyY2Ugc3R5bGVzaGVldDsKKworICAgIHByaXZhdGUgWFNMVExvZ2dlciBsb2dnZXI7CisKKyAgICAvKiogcG9zc2libGUgcmVzb2x2ZXIgZm9yIHB1YmxpY0lkcyAqLworICAgIHByaXZhdGUgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXI7CisKKyAgICAvKiogdHJhbnNmb3JtZXIgdG8gdXNlIGZvciBwcm9jZXNzaW5nIGZpbGVzICovCisgICAgcHJpdmF0ZSBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjsKKworICAgIC8qKiBUaGUgSW4gbWVtb3J5IHZlcnNpb24gb2YgdGhlIHN0eWxlc2hlZXQgKi8KKyAgICBwcml2YXRlIFRlbXBsYXRlcyB0ZW1wbGF0ZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIHN0eWxlc2hlZXQgZnJvbSB3aGljaCB0aGUgdGVtcGxhdGVzCisgICAgICogYXJlIHJlYWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgdGVtcGxhdGVzTW9kVGltZTsKKworICAgIC8qKiBwb3NzaWJsZSByZXNvbHZlciBmb3IgVVJJcyAqLworICAgIHByaXZhdGUgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXI7CisKKyAgICAvKiogdHJhbnNmb3JtZXIgb3V0cHV0IHByb3BlcnRpZXMgKi8KKyAgICBwcml2YXRlIFZlY3RvciBvdXRwdXRQcm9wZXJ0aWVzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIHN0eWxlc2hlZXQgcGFyYW1ldGVycyAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHBhcmFtcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKiBmYWN0b3J5IGF0dHJpYnV0ZXMgKi8KKyAgICBwcml2YXRlIFZlY3RvciBhdHRyaWJ1dGVzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFRyYVhMaWFpc29uLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG5ldmVyCisgICAgICovCisgICAgcHVibGljIFRyYVhMaWFpc29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdHlsZXNoZWV0IGZpbGUuCisgICAgICogQHBhcmFtIHN0eWxlc2hlZXQgYSA8Y29kZT5GaWxlPC9jb2RlPiB2YWx1ZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldChGaWxlIHN0eWxlc2hlZXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlUmVzb3VyY2UgZnIgPSBuZXcgRmlsZVJlc291cmNlKCk7CisgICAgICAgIGZyLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIGZyLnNldEZpbGUoc3R5bGVzaGVldCk7CisgICAgICAgIHNldFN0eWxlc2hlZXQoZnIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3R5bGVzaGVldCBmaWxlLgorICAgICAqIEBwYXJhbSBzdHlsZXNoZWV0IGEge0BsaW5rIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlfSB2YWx1ZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGVzaGVldChSZXNvdXJjZSBzdHlsZXNoZWV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMuc3R5bGVzaGVldCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyByZXNldHRpbmcgdGhlIHN0eWxlc2hlZXQgLSByZXNldCB0cmFuc2Zvcm1lcgorICAgICAgICAgICAgdHJhbnNmb3JtZXIgPSBudWxsOworCisgICAgICAgICAgICAvLyBkbyB3ZSBuZWVkIHRvIHJlc2V0IHRlbXBsYXRlcyBhcyB3ZWxsCisgICAgICAgICAgICBpZiAoIXRoaXMuc3R5bGVzaGVldC5lcXVhbHMoc3R5bGVzaGVldCkKKyAgICAgICAgICAgICAgICB8fCAoc3R5bGVzaGVldC5nZXRMYXN0TW9kaWZpZWQoKSAhPSB0ZW1wbGF0ZXNNb2RUaW1lKSkgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdHlsZXNoZWV0ID0gc3R5bGVzaGVldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm0gYW4gaW5wdXQgZmlsZS4KKyAgICAgKiBAcGFyYW0gaW5maWxlIHRoZSBmaWxlIHRvIHRyYW5zZm9ybQorICAgICAqIEBwYXJhbSBvdXRmaWxlIHRoZSByZXN1bHQgZmlsZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKEZpbGUgaW5maWxlLCBGaWxlIG91dGZpbGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodHJhbnNmb3JtZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY3JlYXRlVHJhbnNmb3JtZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIE91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShpbmZpbGUpKTsKKyAgICAgICAgICAgIGZvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRmaWxlKSk7CisgICAgICAgICAgICBTdHJlYW1SZXN1bHQgcmVzID0gbmV3IFN0cmVhbVJlc3VsdChmb3MpOworICAgICAgICAgICAgLy8gbm90IHN1cmUgd2hhdCBjb3VsZCBiZSB0aGUgbmVlZCBvZiB0aGlzLi4uCisgICAgICAgICAgICByZXMuc2V0U3lzdGVtSWQoSkFYUFV0aWxzLmdldFN5c3RlbUlkKG91dGZpbGUpKTsKKyAgICAgICAgICAgIFNvdXJjZSBzcmMgPSBnZXRTb3VyY2UoZmlzLCBpbmZpbGUpOworCisgICAgICAgICAgICAvLyBzZXQgcGFyYW1ldGVycyBvbiBlYWNoIHRyYW5zZm9ybWF0aW9uLCBtYXliZSBzb21ldGhpbmcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIC8vKGUuZy4gdmFsdWUgb2YgZmlsZSBuYW1lIHBhcmFtZXRlcikKKyAgICAgICAgICAgIHNldFRyYW5zZm9ybWF0aW9uUGFyYW1ldGVycygpOworCisgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc3JjLCByZXMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGNsb3NlIGFsbCBoYW5kbGVzLCBvdGhlcndpc2UgdGhlIGdhcmJhZ2UKKyAgICAgICAgICAgIC8vIGNvbGxlY3RvciB3aWxsIGNsb3NlIHRoZW0uLi53aGVuZXZlciBwb3NzaWJsZSBhbmQKKyAgICAgICAgICAgIC8vIFdpbmRvd3MgbWF5IGNvbXBsYWluIGFib3V0IG5vdCBiZWluZyBhYmxlIHRvIGRlbGV0ZSBmaWxlcy4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc291cmNlIGluc3RhbmNlIGZyb20gdGhlIHN0cmVhbSBhbmQgaWQgb2YgdGhlIGZpbGUuCisgICAgICogQHBhcmFtIGlzIHRoZSBzdHJlYW0gY29udGFpbmluZyB0aGUgc3R5bGVzaGVldCBkYXRhLgorICAgICAqIEBwYXJhbSBpbmZpbGUgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBzeXN0ZW1pZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIHNvdXJjZSBpbnN0YW5jZSBtYXRjaGluZyB0aGUgc3R5bGVzaGVldC4KKyAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYSBwYXJzZXIgY2Fubm90IGJlIGNyZWF0ZWQgd2hpY2gKKyAgICAgKiBzYXRpc2ZpZXMgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGluIGNhc2Ugb2YgcHJvYmxlbSBkZXRlY3RlZCBieSB0aGUgU0FYIHBhcnNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNvdXJjZSBnZXRTb3VyY2UoSW5wdXRTdHJlYW0gaXMsIEZpbGUgaW5maWxlKQorICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdG9kbzogaXMgdGhpcyBjb21tZW50IHN0aWxsIHJlbGV2YW50ID8/CisgICAgICAgIC8vIEZJWE1FOiBuZWVkIHRvIHVzZSBhIFNBWFNvdXJjZSBhcyB0aGUgc291cmNlIGZvciB0aGUgdHJhbnNmb3JtCisgICAgICAgIC8vIHNvIHdlIGNhbiBwbHVnIGluIG91ciBvd24gZW50aXR5IHJlc29sdmVyCisgICAgICAgIFNvdXJjZSBzcmMgPSBudWxsOworICAgICAgICBpZiAoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGdldEZhY3RvcnkoKS5nZXRGZWF0dXJlKFNBWFNvdXJjZS5GRUFUVVJFKSkgeworICAgICAgICAgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc3BGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIHNwRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gc3BGYWN0b3J5Lm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpOworICAgICAgICAgICAgICAgIHJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihlbnRpdHlSZXNvbHZlcik7CisgICAgICAgICAgICAgICAgc3JjID0gbmV3IFNBWFNvdXJjZShyZWFkZXIsIG5ldyBJbnB1dFNvdXJjZShpcykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ4Y2F0YWxvZyBzcGVjaWZpZWQsIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICsgInBhcnNlciBkb2Vzbid0IHN1cHBvcnQgU0FYIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXQVJOOiBEb24ndCB1c2UgdGhlIFN0cmVhbVNvdXJjZShGaWxlKSBjdG9yLiBJdCB3b24ndCB3b3JrIHdpdGgKKyAgICAgICAgICAgIC8vIHhhbGFuIHByaW9yIHRvIDIuMiBiZWNhdXNlIG9mIHN5c3RlbWlkIGJ1Z3MuCisgICAgICAgICAgICBzcmMgPSBuZXcgU3RyZWFtU291cmNlKGlzKTsKKyAgICAgICAgfQorICAgICAgICBzcmMuc2V0U3lzdGVtSWQoSkFYUFV0aWxzLmdldFN5c3RlbUlkKGluZmlsZSkpOworICAgICAgICByZXR1cm4gc3JjOworICAgIH0KKworICAgIHByaXZhdGUgU291cmNlIGdldFNvdXJjZShJbnB1dFN0cmVhbSBpcywgUmVzb3VyY2UgcmVzb3VyY2UpCisgICAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICAvLyB0b2RvOiBpcyB0aGlzIGNvbW1lbnQgc3RpbGwgcmVsZXZhbnQgPz8KKyAgICAgICAgLy8gRklYTUU6IG5lZWQgdG8gdXNlIGEgU0FYU291cmNlIGFzIHRoZSBzb3VyY2UgZm9yIHRoZSB0cmFuc2Zvcm0KKyAgICAgICAgLy8gc28gd2UgY2FuIHBsdWcgaW4gb3VyIG93biBlbnRpdHkgcmVzb2x2ZXIKKyAgICAgICAgU291cmNlIHNyYyA9IG51bGw7CisgICAgICAgIGlmIChlbnRpdHlSZXNvbHZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZ2V0RmFjdG9yeSgpLmdldEZlYXR1cmUoU0FYU291cmNlLkZFQVRVUkUpKSB7CisgICAgICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcEZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgc3BGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBzcEZhY3RvcnkubmV3U0FYUGFyc2VyKCkuZ2V0WE1MUmVhZGVyKCk7CisgICAgICAgICAgICAgICAgcmVhZGVyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKKyAgICAgICAgICAgICAgICBzcmMgPSBuZXcgU0FYU291cmNlKHJlYWRlciwgbmV3IElucHV0U291cmNlKGlzKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInhjYXRhbG9nIHNwZWNpZmllZCwgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgKyAicGFyc2VyIGRvZXNuJ3Qgc3VwcG9ydCBTQVgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdBUk46IERvbid0IHVzZSB0aGUgU3RyZWFtU291cmNlKEZpbGUpIGN0b3IuIEl0IHdvbid0IHdvcmsgd2l0aAorICAgICAgICAgICAgLy8geGFsYW4gcHJpb3IgdG8gMi4yIGJlY2F1c2Ugb2Ygc3lzdGVtaWQgYnVncy4KKyAgICAgICAgICAgIHNyYyA9IG5ldyBTdHJlYW1Tb3VyY2UoaXMpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBsaW5lIGJlbG93IGlzIGEgaGFjazogdGhlIHN5c3RlbSBpZCBtdXN0IGFuIFVSSSwgYnV0IGl0IGlzIG5vdAorICAgICAgICAvLyBjbGVhdCB0byBnZXQgdGhlIFVSSSBvZiBhbiByZXNvdXJjZSwgc28ganVzdCBzZXQgdGhlIG5hbWUgb2YgdGhlCisgICAgICAgIC8vIHJlc291cmNlIGFzIGEgc3lzdGVtIGlkCisgICAgICAgIHNyYy5zZXRTeXN0ZW1JZChyZXNvdXJjZVRvVVJJKHJlc291cmNlKSk7CisgICAgICAgIHJldHVybiBzcmM7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VUb1VSSShSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIEZpbGUgZiA9ICgoRmlsZVJlc291cmNlKSByZXNvdXJjZSkuZ2V0RmlsZSgpOworICAgICAgICAgICAgcmV0dXJuIEZJTEVfVVRJTFMudG9VUkkoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgVVJMUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIFVSTCB1ID0gKChVUkxSZXNvdXJjZSkgcmVzb3VyY2UpLmdldFVSTCgpOworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgaW4gdGVtcGxhdGVzIGZyb20gdGhlIHN0eWxlc2hlZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVhZFRlbXBsYXRlcygpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBVc2UgYSBzdHJlYW0gc28gdGhhdCB5b3UgY2FuIGNsb3NlIGl0IHlvdXJzZWxmIHF1aWNrbHkKKyAgICAgICAgLy8gYW5kIGF2b2lkIGtlZXBpbmcgdGhlIGhhbmRsZSB1bnRpbCB0aGUgb2JqZWN0IGlzIGdhcmJhZ2VkLgorICAgICAgICAvLyAoYWx3YXlzIGtlZXAgY29udHJvbCksIG90aGVyd2lzZSB5b3Ugd29uJ3QgYmUgYWJsZSB0byBkZWxldGUKKyAgICAgICAgLy8gdGhlIGZpbGUgcXVpY2tseSBvbiB3aW5kb3dzLgorICAgICAgICBJbnB1dFN0cmVhbSB4c2xTdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgeHNsU3RyZWFtCisgICAgICAgICAgICAgICAgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHlsZXNoZWV0LmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgdGVtcGxhdGVzTW9kVGltZSA9IHN0eWxlc2hlZXQuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBTb3VyY2Ugc3JjID0gZ2V0U291cmNlKHhzbFN0cmVhbSwgc3R5bGVzaGVldCk7CisgICAgICAgICAgICB0ZW1wbGF0ZXMgPSBnZXRGYWN0b3J5KCkubmV3VGVtcGxhdGVzKHNyYyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoeHNsU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4c2xTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB0cmFuc2Zvcm1lciBiYXNlZCBvbiB0aGUgbGlhaXNvbiBzZXR0aW5ncworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBpcyBhbiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgICogQHNlZSAjc2V0U3R5bGVzaGVldChqYXZhLmlvLkZpbGUpCisgICAgICogQHNlZSAjYWRkUGFyYW0oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKiBAc2VlICNzZXRPdXRwdXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUcmFuc2Zvcm1lcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodGVtcGxhdGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRUZW1wbGF0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyYW5zZm9ybWVyID0gdGVtcGxhdGVzLm5ld1RyYW5zZm9ybWVyKCk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSB0cmFuc2Zvcm1lci4uLgorICAgICAgICB0cmFuc2Zvcm1lci5zZXRFcnJvckxpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAodXJpUmVzb2x2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0VVJJUmVzb2x2ZXIodXJpUmVzb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0UHJvcGVydGllcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gcGFpciA9IChTdHJpbmdbXSkgb3V0cHV0UHJvcGVydGllcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShwYWlyWzBdLCBwYWlyWzFdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhcmFtdGVycyBmb3IgdGhlIHRyYW5zZm9ybWVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRUcmFuc2Zvcm1hdGlvblBhcmFtZXRlcnMoKSB7CisgICAgICAgIGZvciAoZmluYWwgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBwYXJhbXMua2V5cygpOworICAgICAgICAgICAgIGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcGFyYW1zLmdldChuYW1lKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gdGhlIFRyYW5zZm9ybWVyIGZhY3RvcnkgYXNzb2NpYXRlZCB0byB0aGlzIGxpYWlzb24uCisgICAgICogQHJldHVybiB0aGUgVHJhbnNmb3JtZXIgZmFjdG9yeSBhc3NvY2lhdGVkIHRvIHRoaXMgbGlhaXNvbi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBpcyBhIHByb2JsZW0gY3JlYXRpbmcKKyAgICAgKiB0aGUgZmFjdG9yeS4KKyAgICAgKiBAc2VlICNzZXRGYWN0b3J5KFN0cmluZykKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHJpdmF0ZSBUcmFuc2Zvcm1lckZhY3RvcnkgZ2V0RmFjdG9yeSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0ZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGZhY3Rvcnk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbm90IGluaXRpYWxpemVkIHlldCwgc28gY3JlYXRlIHRoZSBmYWN0b3J5CisgICAgICAgIGlmIChmYWN0b3J5TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0ZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoZmFjdG9yeU5hbWUpOworICAgICAgICAgICAgICAgIHRmYWN0b3J5ID0gKFRyYW5zZm9ybWVyRmFjdG9yeSkgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRmYWN0b3J5LnNldEVycm9yTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgLy8gc3BlY2lmaWMgYXR0cmlidXRlcyBmb3IgdGhlIHRyYW5zZm9ybWVyCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gcGFpciA9IChPYmplY3RbXSkgYXR0cmlidXRlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICB0ZmFjdG9yeS5zZXRBdHRyaWJ1dGUoKFN0cmluZykgcGFpclswXSwgcGFpclsxXSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodXJpUmVzb2x2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGZhY3Rvcnkuc2V0VVJJUmVzb2x2ZXIodXJpUmVzb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZmFjdG9yeTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmFjdG9yeSBuYW1lIHRvIHVzZSBpbnN0ZWFkIG9mIEpBWFAgZGVmYXVsdCBsb29rdXAuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBmYWN0b3J5IHRvIHVzZQorICAgICAqIG9yIG51bGwgZm9yIHRoZSBkZWZhdWx0IEpBWFAgbG9vayB1cCBtZWNoYW5pc20uCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZhY3RvcnlOYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjdXN0b20gYXR0cmlidXRlIGZvciB0aGUgSkFYUCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUsIHVzdWFsbHkgYSBib29sZWFuCisgICAgICogc3RyaW5nIG9yIG9iamVjdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGZpbmFsIE9iamVjdFtdIHBhaXIgPSBuZXcgT2JqZWN0W117bmFtZSwgdmFsdWV9OworICAgICAgICBhdHRyaWJ1dGVzLmFkZEVsZW1lbnQocGFpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgcHJvcGVydHkgZm9yIHRoZSBjdXJyZW50IHRyYW5zZm9ybWVyLgorICAgICAqIE5vdGUgdGhhdCB0aGUgc3R5bGVzaGVldCBtdXN0IGJlIHNldCBwcmlvciB0byBjYWxsaW5nCisgICAgICogdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG91dHB1dCBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgb3V0cHV0IHByb3BlcnR5IHZhbHVlLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhaXIgPSBuZXcgU3RyaW5nW117bmFtZSwgdmFsdWV9OworICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzLmFkZEVsZW1lbnQocGFpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzcyB0byByZXNvbHZlIGVudGl0aWVzIGR1cmluZyB0aGUgdHJhbnNmb3JtYXRpb24uCisgICAgICogQHBhcmFtIGFSZXNvbHZlciB0aGUgcmVzb2x2ZXIgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgYVJlc29sdmVyKSB7CisgICAgICAgIGVudGl0eVJlc29sdmVyID0gYVJlc29sdmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3MgdG8gcmVzb2x2ZSBVUklzIGR1cmluZyB0aGUgdHJhbnNmb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gYVJlc29sdmVyIGEgPGNvZGU+RW50aXR5UmVzb2x2ZXI8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgYVJlc29sdmVyKSB7CisgICAgICAgIHVyaVJlc29sdmVyID0gYVJlc29sdmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGFyYW0oU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBwYXJhbXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBsb2dnZXIuCisgICAgICogQHBhcmFtIGwgYSBsb2dnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9nZ2VyKFhTTFRMb2dnZXIgbCkgeworICAgICAgICBsb2dnZXIgPSBsOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhbiBlcnJvci4KKyAgICAgKiBAcGFyYW0gZSB0aGUgZXhjZXB0aW9uIHRvIGxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlcnJvcihUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0Vycm9yKGUsICJFcnJvciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIGZhdGFsIGVycm9yLgorICAgICAqIEBwYXJhbSBlIHRoZSBleGNlcHRpb24gdG8gbG9nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dFcnJvcihlLCAiRmF0YWwgRXJyb3IiKTsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYXRhbCBlcnJvciBkdXJpbmcgdHJhbnNmb3JtYXRpb24iLCBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgYSB3YXJuaW5nLgorICAgICAqIEBwYXJhbSBlIHRoZSBleGNlcHRpb24gdG8gbG9nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dFcnJvcihlLCAiV2FybmluZyIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2dFcnJvcihUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlLCBTdHJpbmcgdHlwZSkgeworICAgICAgICBpZiAobG9nZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFNvdXJjZUxvY2F0b3IgbG9jYXRvciA9IGUuZ2V0TG9jYXRvcigpOworICAgICAgICBpZiAobG9jYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgc3lzdGVtaWQgPSBsb2NhdG9yLmdldFN5c3RlbUlkKCk7CisgICAgICAgICAgICBpZiAoc3lzdGVtaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBzeXN0ZW1pZDsKKyAgICAgICAgICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLmZyb21VUkkodXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCh1cmwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCJVbmtub3duIGZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBsaW5lID0gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCk7CisgICAgICAgICAgICBpZiAobGluZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgICAgIGludCBjb2x1bW4gPSBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpOworICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiOiIpOworICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKGNvbHVtbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1zZy5hcHBlbmQoIjogIik7CisgICAgICAgIG1zZy5hcHBlbmQodHlwZSk7CisgICAgICAgIG1zZy5hcHBlbmQoIiEgIik7CisgICAgICAgIG1zZy5hcHBlbmQoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1zZy5hcHBlbmQoIiBDYXVzZTogIik7CisgICAgICAgICAgICBtc2cuYXBwZW5kKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBsb2dnZXIubG9nKG1zZy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgIC8qKgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlbmFtZSB0byB1c2UgZm9yIHRoZSBzeXN0ZW1pZAorICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbWlkCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS41LnguCisgICAgICogICAgICAgICAgICAgVXNlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSkFYUFV0aWxzI2dldFN5c3RlbUlkIGluc3RlYWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTeXN0ZW1JZChGaWxlIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIEpBWFBVdGlscy5nZXRTeXN0ZW1JZChmaWxlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBUUmFYIGxpYWlzb24uCisgICAgICogQHBhcmFtIHhzbHRUYXNrIHRoZSBYU0xUUHJvY2VzcyB0YXNrIGluc3RhbmNlIGZyb20gd2hpY2ggdGhpcyBsaWFzaW9uCisgICAgICogICAgICAgIGlzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKFhTTFRQcm9jZXNzIHhzbHRUYXNrKSB7CisgICAgICAgIHByb2plY3QgPSB4c2x0VGFzay5nZXRQcm9qZWN0KCk7CisgICAgICAgIFhTTFRQcm9jZXNzLkZhY3RvcnkgZmFjdG9yeSA9IHhzbHRUYXNrLmdldEZhY3RvcnkoKTsKKyAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RmFjdG9yeShmYWN0b3J5LmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSBmYWN0b3J5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gYXR0cnMgPSBmYWN0b3J5LmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgWFNMVFByb2Nlc3MuRmFjdG9yeS5BdHRyaWJ1dGUgYXR0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICAoWFNMVFByb2Nlc3MuRmFjdG9yeS5BdHRyaWJ1dGUpIGF0dHJzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlKGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgWE1MQ2F0YWxvZyB4bWxDYXRhbG9nID0geHNsdFRhc2suZ2V0WE1MQ2F0YWxvZygpOworICAgICAgICAvLyB1c2UgWE1MQ2F0YWxvZyBhcyB0aGUgZW50aXR5IHJlc29sdmVyIGFuZCBVUkkgcmVzb2x2ZXIKKyAgICAgICAgaWYgKHhtbENhdGFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RW50aXR5UmVzb2x2ZXIoeG1sQ2F0YWxvZyk7CisgICAgICAgICAgICBzZXRVUklSZXNvbHZlcih4bWxDYXRhbG9nKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gY29uZmlndXJlIG91dHB1dCBwcm9wZXJ0aWVzCisgICAgICAgIGZvciAoRW51bWVyYXRpb24gcHJvcHMgPSB4c2x0VGFzay5nZXRPdXRwdXRQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgcHJvcHMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBYU0xUUHJvY2Vzcy5PdXRwdXRQcm9wZXJ0eSBwcm9wCisgICAgICAgICAgICAgICAgPSAoWFNMVFByb2Nlc3MuT3V0cHV0UHJvcGVydHkpIHByb3BzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBzZXRPdXRwdXRQcm9wZXJ0eShwcm9wLmdldE5hbWUoKSwgcHJvcC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hNTFZhbGlkYXRlVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWE1MVmFsaWRhdGVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyYmE3NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hNTFZhbGlkYXRlVGFzay5qYXZhCkBAIC0wLDAgKzEsNzQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRURExvY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkpBWFBVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlhtbENvbnN0YW50czsKKworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5QYXJzZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlBhcnNlckFkYXB0ZXI7CisKKy8qKgorICogQ2hlY2tzIFhNTCBmaWxlcyBhcmUgdmFsaWQgKG9yIG9ubHkgd2VsbCBmb3JtZWQpLiBUaGUKKyAqIHRhc2sgdXNlcyB0aGUgU0FYMiBwYXJzZXIgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgSkFYUCBieSBkZWZhdWx0CisgKiAocHJvYmFibHkgdGhlIG9uZSB0aGF0IGlzIHVzZWQgYnkgQW50IGl0c2VsZiksIGJ1dCBvbmUgY2FuIHNwZWNpZnkgYW55CisgKiBTQVgxLzIgcGFyc2VyIGlmIG5lZWRlZC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxWYWxpZGF0ZVRhc2sgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8qKgorICAgICAqIGhlbHBlciBmb3IgcGF0aCAtPiBVUkkgYW5kIFVSSSAtPiBwYXRoIGNvbnZlcnNpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9GQUlMRURfTVNHID0KKyAgICAgICAgIkNvdWxkIG5vdCBzdGFydCB4bWwgdmFsaWRhdGlvbjogIjsKKworICAgIC8vIGFudCB0YXNrIHByb3BlcnRpZXMKKyAgICAvLyBkZWZhdWx0cworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOworICAgIHByb3RlY3RlZCBib29sZWFuIHdhcm4gPSB0cnVlOworICAgIHByb3RlY3RlZCBib29sZWFuIGxlbmllbnQgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWRlckNsYXNzTmFtZSA9IG51bGw7CisKKyAgICAvKiogZmlsZSB0byBiZSB2YWxpZGF0ZWQgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlID0gbnVsbDsKKyAgICAvKiogc2V0cyBvZiBmaWxlIHRvIGJlIHZhbGlkYXRlZCAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJvdGVjdGVkIFBhdGggY2xhc3NwYXRoOworCisgICAgLyoqCisgICAgICogdGhlIHBhcnNlciBpcyB2aWV3ZWQgYXMgYSBTQVgyIFhNTFJlYWRlci4gSWYgYSBTQVgxIHBhcnNlciBpcyBzcGVjaWZpZWQsCisgICAgICogaXQncyB3cmFwcGVkIGluIGFuIGFkYXB0ZXIgdGhhdCBtYWtlIGl0IGJlaGF2ZSBhcyBhIFhNTFJlYWRlci4KKyAgICAgKiBhIG1vcmUgJ3N0YW5kYXJkJyB3YXkgb2YgZG9pbmcgdGhpcyB3b3VsZCBiZSB0byB1c2UgdGhlIEpBWFAxLjEgU0FYUGFyc2VyCisgICAgICogaW50ZXJmYWNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBYTUxSZWFkZXIgeG1sUmVhZGVyID0gbnVsbDsKKyAgICAvLyBYTUxSZWFkZXIgdXNlZCB0byB2YWxpZGF0aW9uIHByb2Nlc3MKKyAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBWYWxpZGF0b3JFcnJvckhhbmRsZXIoKTsKKyAgICAvLyB0byByZXBvcnQgc2F4IHBhcnNpbmcgZXJyb3JzCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKiBUaGUgdmVjdG9yIHRvIHN0b3JlIGFsbCBhdHRyaWJ1dGVzIChmZWF0dXJlcykgdG8gYmUgc2V0IG9uIHRoZSBwYXJzZXIuICoqLworICAgIHByaXZhdGUgVmVjdG9yIGF0dHJpYnV0ZUxpc3QgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3IgcHJvcGVydHlMaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgcHJpdmF0ZSBYTUxDYXRhbG9nIHhtbENhdGFsb2cgPSBuZXcgWE1MQ2F0YWxvZygpOworICAgIC8qKiBNZXNzYWdlIGZvciBzdWNlc3NmdWxsIHZhbGlkYXRpb24gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0ZJTEVTX1ZBTElEQVRFRAorICAgICAgICA9ICIgZmlsZShzKSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZC4iOworCisgICAgLyoqCisgICAgICogU3BlY2lmeSBob3cgcGFyc2VyIGVycm9yIGFyZSB0byBiZSBoYW5kbGVkLgorICAgICAqIE9wdGlvbmFsLCBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqIDxwPgorICAgICAqIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiAoZGVmYXVsdCksIHRocm93IGEgYnVpbGRFeGNlcHRpb24gaWYgdGhlCisgICAgICogcGFyc2VyIHlpZWxkcyBhbiBlcnJvci4KKyAgICAgKiBAcGFyYW0gZmFpbCBpZiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGRvIG5vdCBmYWlsIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbE9uRXJyb3IoYm9vbGVhbiBmYWlsKSB7CisgICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IGhvdyBwYXJzZXIgZXJyb3IgYXJlIHRvIGJlIGhhbmRsZWQuCisgICAgICogPHA+CisgICAgICogSWYgc2V0IHRvIDxjb2RlPnRydWU8L3RydWU+IChkZWZhdWx0KSwgbG9nIGEgd2FybiBtZXNzYWdlIGZvciBlYWNoIFNBWCB3YXJuIGV2ZW50LgorICAgICAqIEBwYXJhbSBib29sIGlmIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4gZG8gbm90IHNlbmQgd2FybmluZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXYXJuKGJvb2xlYW4gYm9vbCkgeworICAgICAgICB3YXJuID0gYm9vbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIHBhcnNlciBzaG91bGQgYmUgdmFsaWRhdGluZy4gRGVmYXVsdAorICAgICAqIGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqIDxwPgorICAgICAqIElmIHNldCB0byBmYWxzZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBmYWlsIG9ubHkgaWYgdGhlIHBhcnNlZCBkb2N1bWVudAorICAgICAqIGlzIG5vdCB3ZWxsIGZvcm1lZCBYTUwuCisgICAgICogPHA+CisgICAgICogdGhpcyBvcHRpb24gaXMgaWdub3JlZCBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzCisgICAgICogd2l0aCB7QGxpbmsgI3NldENsYXNzTmFtZShTdHJpbmcpfSBpcyBub3QgYSBTQVgyIFhNTFJlYWRlci4KKyAgICAgKiBAcGFyYW0gYm9vbCBpZiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IG9ubHkgZmFpbCBvbiBtYWxmb3JtZWQgWE1MCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGVuaWVudChib29sZWFuIGJvb2wpIHsKKyAgICAgICAgbGVuaWVudCA9IGJvb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgU0FYIHBhcnNlciB0byBiZSB1c2VkLiAob3B0aW9uYWwpCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBzaG91bGQgYmUgYW4gaW1wbGVtZW50YXRpb24gb2YgU0FYMgorICAgICAqIDxjb2RlPm9yZy54bWwuc2F4LlhNTFJlYWRlcjwvY29kZT4gb3IgU0FYMiA8Y29kZT5vcmcueG1sLnNheC5QYXJzZXI8L2NvZGU+LgorICAgICAqIDxwPiBpZiBjbGFzc05hbWUgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiA8Y29kZT5vcmcueG1sLnNheC5QYXJzZXI8L2NvZGU+LCB7QGxpbmsgI3NldExlbmllbnQoYm9vbGVhbil9LAorICAgICAqIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiA8cD4gaWYgbm90IHNldCwgdGhlIGRlZmF1bHQgd2lsbCBiZSB1c2VkLgorICAgICAqIEBzZWUgb3JnLnhtbC5zYXguWE1MUmVhZGVyCisgICAgICogQHNlZSBvcmcueG1sLnNheC5QYXJzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICByZWFkZXJDbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgY2xhc3NwYXRoIHRvIGJlIHNlYXJjaGVkIHRvIGxvYWQgdGhlIHBhcnNlciAob3B0aW9uYWwpCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIGxvYWQgdGhlIHBhcnNlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI3NldENsYXNzcGF0aAorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzcGF0aCBjcmVhdGVkCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlcmUgdG8gZmluZCB0aGUgcGFyc2VyIGNsYXNzOyBvcHRpb25hbC4KKyAgICAgKiBAc2VlICNzZXRDbGFzc3BhdGgKKyAgICAgKiBAcGFyYW0gciByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogc3BlY2lmeSB0aGUgZmlsZSB0byBiZSBjaGVja2VkOyBvcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBiZSBjaGVja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW4gWE1MQ2F0YWxvZyBhcyBhIG5lc3RlZCBlbGVtZW50OyBvcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gY2F0YWxvZyBYTUxDYXRhbG9nIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRYTUxDYXRhbG9nKFhNTENhdGFsb2cgY2F0YWxvZykgeworICAgICAgICB4bWxDYXRhbG9nLmFkZENvbmZpZ3VyZWRYTUxDYXRhbG9nKGNhdGFsb2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNwZWNpZnkgYSBzZXQgb2YgZmlsZSB0byBiZSBjaGVja2VkCisgICAgICogQHBhcmFtIHNldCB0aGUgZmlsZXNldCB0byBjaGVjaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKKyAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgbmVzdGVkIGVsZW1lbnQuIFRoaXMgaXMgdXNlZCBmb3Igc2V0dGluZyBhcmJpdHJhcnkKKyAgICAgKiBmZWF0dXJlcyBvZiB0aGUgU0FYIHBhcnNlci4KKyAgICAgKiBWYWxpZCBhdHRyaWJ1dGVzCisgICAgICogPGEgaHJlZj0KKyAgICAgKiAiaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiIKKyAgICAgKiA+aW5jbHVkZTwvYT4KKyAgICAgKiBAcmV0dXJuIGF0dHJpYnV0ZSBjcmVhdGVkCisgICAgICogQHNpbmNlIGFudDEuNgorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGUgY3JlYXRlQXR0cmlidXRlKCkgeworICAgICAgICBmaW5hbCBBdHRyaWJ1dGUgZmVhdHVyZSA9IG5ldyBBdHRyaWJ1dGUoKTsKKyAgICAgICAgYXR0cmlidXRlTGlzdC5hZGRFbGVtZW50KGZlYXR1cmUpOworICAgICAgICByZXR1cm4gZmVhdHVyZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgcHJvcGVydHkuCisgICAgICogQHNpbmNlIGFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eSgpIHsKKyAgICAgICAgZmluYWwgUHJvcGVydHkgcHJvcCA9IG5ldyBQcm9wZXJ0eSgpOworICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkRWxlbWVudChwcm9wKTsKKyAgICAgICAgcmV0dXJuIHByb3A7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBwcm9qZWN0IHRvIGxldCB0aGUgdGFzayBpbml0aWFsaXplIHByb3Blcmx5LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBzdXBlci5pbml0KCk7CisgICAgICAgIHhtbENhdGFsb2cuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIERURCBsb2NhdGlvbiByZWNvcmQ7IG9wdGlvbmFsLgorICAgICAqIFRoaXMgc3RvcmVzIHRoZSBsb2NhdGlvbiBvZiBhIERURC4gVGhlIERURCBpcyBpZGVudGlmaWVkCisgICAgICogYnkgaXRzIHB1YmxpYyBJZC4KKyAgICAgKiBAcmV0dXJuIGNyZWF0ZWQgRFREIGxvY2F0aW9uCisgICAgICovCisgICAgcHVibGljIERURExvY2F0aW9uIGNyZWF0ZURURCgpIHsKKyAgICAgICAgRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPSBuZXcgRFRETG9jYXRpb24oKTsKKyAgICAgICAgeG1sQ2F0YWxvZy5hZGREVEQoZHRkTG9jYXRpb24pOworICAgICAgICByZXR1cm4gZHRkTG9jYXRpb247CisgICAgfQorICAgIC8qKgorICAgICAqIGFjY2Vzc29yIHRvIHRoZSB4bWxDYXRhbG9nIHVzZWQgaW4gdGhlIHRhc2sKKyAgICAgKiBAcmV0dXJuIHhtbENhdGFsb2cgcmVmZXJlbmNlCisgICAgICovCisgICAgcHJvdGVjdGVkIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgeworICAgICAgICByZXR1cm4geG1sQ2F0YWxvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIFhNTCByZWFkZXIuIE5vbi1udWxsIG9ubHkgYWZ0ZXIge0BsaW5rICNpbml0VmFsaWRhdG9yKCl9LgorICAgICAqIElmIHRoZSByZWFkZXIgaXMgYW4gaW5zdGFuY2Ugb2YgIHtAbGluayBQYXJzZXJBZGFwdGVyfSB0aGVuCisgICAgICogdGhlIHBhcnNlciBpcyBhIFNBWDEgcGFyc2VyLCBhbmQgeW91IGNhbm5vdCBjYWxsCisgICAgICoge0BsaW5rICNzZXRGZWF0dXJlKFN0cmluZywgYm9vbGVhbil9IG9yIHtAbGluayAjc2V0UHJvcGVydHkoU3RyaW5nLCBTdHJpbmcpfQorICAgICAqIG9uIGl0LgorICAgICAqIEByZXR1cm4gdGhlIFhNTCByZWFkZXIgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGdldFhtbFJlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHhtbFJlYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBleGVjdXRlIHRoZSB0YXNrCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiA8Y29kZT5mYWlsb25lcnJvcjwvY29kZT4gaXMgdHJ1ZSBhbmQgYW4gZXJyb3IgaGFwcGVucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIGludCBmaWxlUHJvY2Vzc2VkID0gMDsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiAoZmlsZXNldHMuc2l6ZSgpID09IDApKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlNwZWNpZnkgYXQgbGVhc3Qgb25lIHNvdXJjZSAtICIgKyAiYSBmaWxlIG9yIGEgZmlsZXNldC4iKTsKKyAgICAgICAgfQorCisKKworICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmNhblJlYWQoKSAmJiBmaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgZG9WYWxpZGF0ZShmaWxlKTsKKyAgICAgICAgICAgICAgICBmaWxlUHJvY2Vzc2VkKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvck1zZyA9ICJGaWxlICIgKyBmaWxlICsgIiBjYW5ub3QgYmUgcmVhZCI7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlcnJvck1zZyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKGVycm9yTXNnLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXNldHMuc2l6ZSgpOyBpKyspIHsKKworICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShmcy5nZXREaXIoZ2V0UHJvamVjdCgpKSwgZmlsZXNbal0pOworICAgICAgICAgICAgICAgIGRvVmFsaWRhdGUoc3JjRmlsZSk7CisgICAgICAgICAgICAgICAgZmlsZVByb2Nlc3NlZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9uU3VjY2Vzc2Z1bFZhbGlkYXRpb24oZmlsZVByb2Nlc3NlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaGFuZGxlciBjYWxsZWQgb24gc3VjY2Vzc2Z1bCBmaWxlIHZhbGlkYXRpb24uCisgICAgICogQHBhcmFtIGZpbGVQcm9jZXNzZWQgbnVtYmVyIG9mIGZpbGVzIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvblN1Y2Nlc3NmdWxWYWxpZGF0aW9uKGludCBmaWxlUHJvY2Vzc2VkKSB7CisgICAgICAgIGxvZyhmaWxlUHJvY2Vzc2VkICsgTUVTU0FHRV9GSUxFU19WQUxJREFURUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGluaXQgdGhlIHBhcnNlciA6CisgICAgICogbG9hZCB0aGUgcGFyc2VyIGNsYXNzLCBhbmQgc2V0IGZlYXR1cmVzIGlmIG5lY2Vzc2FyeQorICAgICAqIEl0IGlzIG9ubHkgYWZ0ZXIgdGhpcyB0aGF0IHRoZSByZWFkZXIgaXMgdmFsaWQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRvcigpIHsKKworICAgICAgICB4bWxSZWFkZXIgPSBjcmVhdGVYbWxSZWFkZXIoKTsKKworICAgICAgICB4bWxSZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIoZ2V0RW50aXR5UmVzb2x2ZXIoKSk7CisgICAgICAgIHhtbFJlYWRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKKworICAgICAgICBpZiAoIWlzU2F4MVBhcnNlcigpKSB7CisgICAgICAgICAgICAvLyB0dXJuIHZhbGlkYXRpb24gb24KKyAgICAgICAgICAgIGlmICghbGVuaWVudCkgeworICAgICAgICAgICAgICAgIHNldEZlYXR1cmUoWG1sQ29uc3RhbnRzLkZFQVRVUkVfVkFMSURBVElPTiwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzZXQgdGhlIGZlYXR1cmUgZnJvbSB0aGUgYXR0cmlidXRlIGxpc3QKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBmZWF0dXJlID0gKEF0dHJpYnV0ZSkgYXR0cmlidXRlTGlzdC5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgc2V0RmVhdHVyZShmZWF0dXJlLmdldE5hbWUoKSwgZmVhdHVyZS5nZXRWYWx1ZSgpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2V0cyBwcm9wZXJ0aWVzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5TGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIHByb3BlcnR5TGlzdC5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkocHJvcC5nZXROYW1lKCksIHByb3AuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgcmV0dXJucyB0cnVlIGlmIHdlIGFyZSB1c2luZyBhIFNBWDEgcGFyc2VyLgorICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGEgU0FYMSBwYXJzZXIgaXMgaW4gdXNlCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTYXgxUGFyc2VyKCkgeworICAgICAgICByZXR1cm4gKHhtbFJlYWRlciBpbnN0YW5jZW9mIFBhcnNlckFkYXB0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZSB0aGUgWE1MIHJlYWRlci4KKyAgICAgKiBUaGlzIGlzIG9uZSBieSBpbnN0YW50aWF0aW5nIGFueXRoaW5nIHNwZWNpZmllZCBieSB7QGxpbmsgI3JlYWRlckNsYXNzTmFtZX0sCisgICAgICogZmFsbGluZyBiYWNrIHRvIGEgZGVmYXVsdCByZWFkZXIgaWYgbm90LgorICAgICAqIElmIHRoZSByZXR1cm5lZCByZWFkZXIgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBhcnNlckFkYXB0ZXJ9IHRoZW4KKyAgICAgKiB3ZSBoYXZlIGNyZWF0ZWQgYW5kIHdyYXBwZWQgYSBTQVgxIHBhcnNlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgWE1MUmVhZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBYTUxSZWFkZXIgY3JlYXRlWG1sUmVhZGVyKCkgeworICAgICAgICBPYmplY3QgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgaWYgKHJlYWRlckNsYXNzTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZWFkZXIgPSBjcmVhdGVEZWZhdWx0UmVhZGVyT3JQYXJzZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgQ2xhc3MgcmVhZGVyQ2xhc3MgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBwYXJzZXIgY2xhc3MKKyAgICAgICAgICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjbGFzc3BhdGgpOworICAgICAgICAgICAgICAgICAgICByZWFkZXJDbGFzcyA9IENsYXNzLmZvck5hbWUocmVhZGVyQ2xhc3NOYW1lLCB0cnVlLCBsb2FkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShyZWFkZXJDbGFzc05hbWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlYWRlciA9IHJlYWRlckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oSU5JVF9GQUlMRURfTVNHICsgcmVhZGVyQ2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihJTklUX0ZBSUxFRF9NU0cgKyByZWFkZXJDbGFzc05hbWUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKElOSVRfRkFJTEVEX01TRyArIHJlYWRlckNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGVuIGNoZWNrIGl0IGltcGxlbWVudHMgWE1MUmVhZGVyCisgICAgICAgIFhNTFJlYWRlciBuZXdSZWFkZXI7CisgICAgICAgIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBYTUxSZWFkZXIpIHsKKyAgICAgICAgICAgIG5ld1JlYWRlciA9IChYTUxSZWFkZXIpIHJlYWRlcjsKKyAgICAgICAgICAgIGxvZygKKyAgICAgICAgICAgICAgICAiVXNpbmcgU0FYMiByZWFkZXIgIiArIHJlYWRlci5nZXRDbGFzcygpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gc2VlIGlmIGl0IGlzIGEgU0FYMSBQYXJzZXIKKyAgICAgICAgICAgIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBQYXJzZXIpIHsKKyAgICAgICAgICAgICAgICBuZXdSZWFkZXIgPSBuZXcgUGFyc2VyQWRhcHRlcigoUGFyc2VyKSByZWFkZXIpOworICAgICAgICAgICAgICAgIGxvZygKKyAgICAgICAgICAgICAgICAgICAgIlVzaW5nIFNBWDEgcGFyc2VyICIgKyByZWFkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIElOSVRfRkFJTEVEX01TRworICAgICAgICAgICAgICAgICAgICAgICAgKyByZWFkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbXBsZW1lbnRzIG5vciBTQVgxIFBhcnNlciBub3IgU0FYMiBYTUxSZWFkZXIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld1JlYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVEZWZhdWx0UmVhZGVyT3JQYXJzZXIoKSB7CisgICAgICAgIE9iamVjdCByZWFkZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBjcmVhdGVEZWZhdWx0UmVhZGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgcmVhZGVyID0gSkFYUFV0aWxzLmdldFBhcnNlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIGEgcmVhZGVyIGlmIHRoZSB1c2Ugb2YgdGhlIGNsYXNzIGRpZCBub3Qgc3BlY2lmeSBhbm90aGVyIG9uZS4KKyAgICAgKiBJZiBhIEJ1aWxkRXhjZXB0aW9uIGlzIHRocm93biwgdGhlIGNhbGxlciBtYXkgcmV2ZXJ0IHRvIGFuIGFsdGVybmF0ZQorICAgICAqIHJlYWRlci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IHJlYWRlci4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nCisgICAgICovCisgICAgcHJvdGVjdGVkIFhNTFJlYWRlciBjcmVhdGVEZWZhdWx0UmVhZGVyKCkgeworICAgICAgICByZXR1cm4gSkFYUFV0aWxzLmdldFhNTFJlYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIGZlYXR1cmUgb24gdGhlIHBhcnNlci4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBmZWF0dXJlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZmVhdHVyZSB3YXMgbm90IHN1cHBvcnRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGJvb2xlYW4gdmFsdWUpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiU2V0dGluZyBmZWF0dXJlICIgKyBmZWF0dXJlICsgIj0iICsgdmFsdWUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHhtbFJlYWRlci5zZXRGZWF0dXJlKGZlYXR1cmUsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlBhcnNlciAiCisgICAgICAgICAgICAgICAgICAgICsgeG1sUmVhZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IHJlY29nbml6ZSBmZWF0dXJlICIKKyAgICAgICAgICAgICAgICAgICAgKyBmZWF0dXJlLAorICAgICAgICAgICAgICAgIGUsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlBhcnNlciAiCisgICAgICAgICAgICAgICAgICAgICsgeG1sUmVhZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IHN1cHBvcnQgZmVhdHVyZSAiCisgICAgICAgICAgICAgICAgICAgICsgZmVhdHVyZSwKKyAgICAgICAgICAgICAgICBlLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYSBwcm9wZXJ0eSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIGEgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydHkgd2FzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyBWYWxpZGF0ZXMgcHJvcGVydHkKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb3BlcnR5IG5hbWUgYW5kIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHhtbFJlYWRlci5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJQYXJzZXIgIgorICAgICAgICAgICAgICAgICAgICArIHhtbFJlYWRlci5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCByZWNvZ25pemUgcHJvcGVydHkgIgorICAgICAgICAgICAgICAgICAgICArIG5hbWUsCisgICAgICAgICAgICAgICAgZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiUGFyc2VyICIKKyAgICAgICAgICAgICAgICAgICAgKyB4bWxSZWFkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3Qgc3VwcG9ydCBwcm9wZXJ0eSAiCisgICAgICAgICAgICAgICAgICAgICsgbmFtZSwKKyAgICAgICAgICAgICAgICBlLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFyc2UgdGhlIGZpbGUKKyAgICAgKiBAcGFyYW0gYWZpbGUgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHZhbGlkYXRlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1ZhbGlkYXRlKEZpbGUgYWZpbGUpIHsKKyAgICAgICAgLy9mb3IgZXZlcnkgZmlsZSwgd2UgaGF2ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdG9yCisgICAgICAgIGluaXRWYWxpZGF0b3IoKTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nKCJWYWxpZGF0aW5nICIgKyBhZmlsZS5nZXROYW1lKCkgKyAiLi4uICIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmluaXQoYWZpbGUpOworICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShhZmlsZSkpOworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IEZJTEVfVVRJTFMudG9VUkkoYWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgaXMuc2V0U3lzdGVtSWQodXJpKTsKKyAgICAgICAgICAgIHhtbFJlYWRlci5wYXJzZShpcyk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgbG9nKCJDYXVnaHQgd2hlbiB2YWxpZGF0aW5nOiAiICsgZXgudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHZhbGlkYXRlIGRvY3VtZW50ICIgKyBhZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIkNvdWxkIG5vdCB2YWxpZGF0ZSBkb2N1bWVudCAiICsgYWZpbGUgKyAiOiAiICsgZXgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IHZhbGlkYXRlIGRvY3VtZW50ICIgKyBhZmlsZSwKKyAgICAgICAgICAgICAgICBleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9ySGFuZGxlci5nZXRGYWlsdXJlKCkpIHsKKyAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYWZpbGUgKyAiIGlzIG5vdCBhIHZhbGlkIFhNTCBkb2N1bWVudC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgbG9nKGFmaWxlICsgIiBpcyBub3QgYSB2YWxpZCBYTUwgZG9jdW1lbnQiLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdG9yRXJyb3JIYW5kbGVyIHJvbGUgOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IGxvZyBTQVggcGFyc2UgZXhjZXB0aW9ucywKKyAgICAgKiA8bGk+IHJlbWVtYmVyIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdG9yRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKKworICAgICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgICAgICBwcm90ZWN0ZWQgRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7CisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgbGFzdEVycm9yTWVzc2FnZSA9IG51bGw7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGZhaWxlZCA9IGZhbHNlOworICAgICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorICAgICAgICAvKioKKyAgICAgICAgICogaW5pdGlhbGlzZXMgdGhlIGNsYXNzCisgICAgICAgICAqIEBwYXJhbSBmaWxlIGZpbGUgdXNlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIGN1cnJlbnRGaWxlID0gZmlsZTsKKyAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBkaWQgYW4gZXJyb3IgaGFwcGVuIGR1cmluZyBsYXN0IHBhcnNpbmcgPworICAgICAgICAgKiBAcmV0dXJuIGRpZCBhbiBlcnJvciBoYXBwZW4gZHVyaW5nIGxhc3QgcGFyc2luZyA/CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsdXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhaWxlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiByZWNvcmQgYSBmYXRhbCBlcnJvcgorICAgICAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIHRoZSBmYXRhbCBlcnJvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICBkb0xvZyhleGNlcHRpb24sIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgcmVjb3ZlcmFibGUgZXJyb3IKKyAgICAgICAgICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgZXJyb3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGRvTG9nKGV4Y2VwdGlvbiwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSB3YXJuaW5nCisgICAgICAgICAqIEBwYXJhbSBleGNlcHRpb24gdGhlIHdhcm5pbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gaW1wbGVtZW50YXRpb24sIFhNTFJlYWRlciBjYW4geWllbGQgaGlwcyBvZiB3YXJuaW5nLAorICAgICAgICAgICAgLy8gb25seSBvdXRwdXQgdGhlbiBpZiB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgZm9yIGl0CisgICAgICAgICAgICBpZiAod2FybikgeworICAgICAgICAgICAgICAgIGRvTG9nKGV4Y2VwdGlvbiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZG9Mb2coU0FYUGFyc2VFeGNlcHRpb24gZSwgaW50IGxvZ0xldmVsKSB7CisKKyAgICAgICAgICAgIGxvZyhnZXRNZXNzYWdlKGUpLCBsb2dMZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBzeXNJRCA9IGUuZ2V0U3lzdGVtSWQoKTsKKyAgICAgICAgICAgIGlmIChzeXNJRCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzeXNJRDsKKyAgICAgICAgICAgICAgICBpZiAoc3lzSUQuc3RhcnRzV2l0aCgiZmlsZToiKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IEZJTEVfVVRJTFMuZnJvbVVSSShzeXNJRCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgYSB2YWxpZCBmaWxlOiBqdXN0IHVzZSB0aGUgdXJpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGxpbmUgPSBlLmdldExpbmVOdW1iZXIoKTsKKyAgICAgICAgICAgICAgICBpbnQgY29sID0gZS5nZXRDb2x1bW5OdW1iZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAobGluZSA9PSAtMQorICAgICAgICAgICAgICAgICAgICAgICA/ICIiCisgICAgICAgICAgICAgICAgICAgICAgIDogKCI6IiArIGxpbmUgKyAoY29sID09IC0xID8gIiIgOiAoIjoiICsgY29sKSkpKQorICAgICAgICAgICAgICAgICAgICArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB0byBjcmVhdGUgdG8gc2V0IGEgZmVhdHVyZSBvZiB0aGUgcGFyc2VyLgorICAgICAqIEBzaW5jZSBhbnQxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldC4KKyAgICAgICAgICoKKyAgICAgICAgICogVmFsaWQgYXR0cmlidXRlcyA8YSBocmVmPQorICAgICAgICAgKiAiaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiIKKyAgICAgICAgICogPmluY2x1ZGUuPC9hPgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmVhdHVyZS4KKyAgICAgICAgICoqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gYXR0cmlidXRlVmFsdWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgZmVhdHVyZSBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBzZXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBuYW1lOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGZlYXR1cmUgdmFsdWUgdG8gdHJ1ZSBvciBmYWxzZS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIGZlYXR1cmUgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGZlYXR1cmUgbmFtZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgYXR0cmlidXRlIHZhbHVlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBmZWF0dXJlIHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgUGFyc2VyIHByb3BlcnR5LgorICAgICAqIFNlZSA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovcHJvcGVydGllcy5odG1sIj4KKyAgICAgKiBYTUwgcGFyc2VyIHByb3BlcnRpZXM8L2E+IGZvciB1c2FibGUgcHJvcGVydGllcworICAgICAqIEBzaW5jZSBhbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3BlcnR5IHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIGFjY2Vzc29yIHRvIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgICAgICAgKiBAcmV0dXJuIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogc2V0dGVyIGZvciB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogZ2V0dGVyIGZvciB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgIH0gLy8gUHJvcGVydHkKKworCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DaGVjay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3OTgzNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DaGVjay5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworCisKKy8qKgorICogQ2xhc3MgY29tbW9uIHRvIGFsbCBjaGVjayBjb21tYW5kcyAoY2hlY2tvdXQsIGNoZWNraW4sY2hlY2tpbiBkZWZhdWx0IHRhc2spOworICogQGFudC50YXNrIGlnbm9yZT0idHJ1ZSIKKyAqLworcHVibGljIGNsYXNzIENDTUNoZWNrIGV4dGVuZHMgQ29udGludXVzIHsKKworICAgIHByaXZhdGUgRmlsZSBmaWxlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBjb21tZW50ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyB0YXNrID0gbnVsbDsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisKKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgQ0NNQ2hlY2suICovCisgICAgcHVibGljIENDTUNoZWNrKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgZmlsZS4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIGZpbGUuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGF0aCB0byB0aGUgZmlsZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbi4KKyAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIHYpIHsKKyAgICAgICAgbG9nKCJ3b3JraW5nIGZpbGUgIiArIHYsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB0aGlzLmZpbGUgPSB2OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgY29tbWVudC4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIGNvbW1lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gY29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgYSBjb21tZW50LgorICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gY29tbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyB2KSB7CisgICAgICAgIHRoaXMuY29tbWVudCA9IHY7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRhc2suCisgICAgICogQHJldHVybiB2YWx1ZSBvZiB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFzaygpIHsKKyAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNrCisgICAgICogaW4gdGhlIGZpbGUgKG1heSB1c2UgJ2RlZmF1bHQnKS4KKyAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIHRhc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFzayhTdHJpbmcgdikgeworICAgICAgICB0aGlzLnRhc2sgPSB2OworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIHNldCBvZiBmaWxlcyB0byBjb3B5LgorICAgICAqIEBwYXJhbSBzZXQgdGhlIHNldCBvZiBmaWxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKKyAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICogPHA+CisgICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2NtIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCisgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIDwvcD4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiBmaWxlc2V0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UgLSBhIGZpbGUgb3IgYSBmaWxlc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDQ01DaGVjayBjYW5ub3QgYmUgZ2VuZXJhdGVkIGZvciBkaXJlY3RvcmllcyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAgJiYgZmlsZXNldHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDaG9vc2UgYmV0d2VlbiBmaWxlIGFuZCBmaWxlc2V0ICEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9pdCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNpemVvZkZpbGVTZXQgPSBmaWxlc2V0cy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mRmlsZVNldDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBTdHJpbmdbXSBzcmNGaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3JjRmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIHNyYyA9IG5ldyBGaWxlKGZzLmdldERpcihnZXRQcm9qZWN0KCkpLCBzcmNGaWxlc1tqXSk7CisgICAgICAgICAgICAgICAgc2V0RmlsZShzcmMpOworICAgICAgICAgICAgICAgIGRvaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNoZWNrIHRoZSBmaWxlIGdpdmVuIGJ5IGdldEZpbGUoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZG9pdCgpIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKworICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcworICAgICAgICAvLyBjY20gY28gL3QgLi4gZmlsZXMKKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBDQ00uRVhFIGhlbHAKKworICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldENjbUNvbW1hbmQoKSk7CisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q2NtQWN0aW9uKCkpOworCisgICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tPcHRpb25zKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldFRhc2soKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1RBU0spOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0VGFzaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAtY29tbWVudCBmbGFnIC0tIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi9jb21tZW50IjsKKworICAgIC8qKgorICAgICAqICAtdGFzayBmbGFnIC0tIGFzc29jaWF0ZSBjaGVja291dCB0YXNrIHdpdGggdGFzaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVEFTSyA9ICIvdGFzayI7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DaGVja2luLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzQ3MmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tpbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY207CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLyoqCisgKiBQZXJmb3JtcyBDb250aW51dXMgY2hlY2tpbiBjb21tYW5kLgorICoKKyAqLworcHVibGljIGNsYXNzIENDTUNoZWNraW4gZXh0ZW5kcyBDQ01DaGVjayB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIC0gc2V0dXAgY2hlY2tpbiBjb21tYW5kCisgICAgICovCisgICAgcHVibGljIENDTUNoZWNraW4oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHNldENjbUFjdGlvbihDT01NQU5EX0NIRUNLSU4pOworICAgICAgICBzZXRDb21tZW50KCJDaGVja2luICIgKyBuZXcgRGF0ZSgpKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNraW5EZWZhdWx0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tpbkRlZmF1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmUyYTJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNraW5EZWZhdWx0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbTsKKworLyoqCisgKiBQZXJmb3JtcyBDb250aW51dXMgQ2hlY2tpbiBEZWZhdWx0IHRhc2sgY29tbWFuZC4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0iY2NtY2hlY2tpbnRhc2siIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBDQ01DaGVja2luRGVmYXVsdCBleHRlbmRzIENDTUNoZWNrIHsKKworICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgQ0NNQ2hlY2tpbkRlZmF1bHQuICovCisgICAgcHVibGljIENDTUNoZWNraW5EZWZhdWx0KCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRDY21BY3Rpb24oQ09NTUFORF9DSEVDS0lOKTsKKyAgICAgICAgc2V0VGFzayhERUZBVUxUX1RBU0spOworICAgIH0KKworICAgIC8qKiBUaGUgZGVmYXVsdCB0YXNrICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UQVNLID0gImRlZmF1bHQiOworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tvdXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DaGVja291dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YmJjNmIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tvdXQuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtOworCisvKioKKyAqIFBlcmZvcm1zIENvbnRpbnV1cyBjaGVja291dCBjb21tYW5kLgorICoKKyAqLworcHVibGljIGNsYXNzIENDTUNoZWNrb3V0IGV4dGVuZHMgQ0NNQ2hlY2sgeworCisgICAgLyoqCisgICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBDQ01DaGVja291dCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0Q2NtQWN0aW9uKENPTU1BTkRfQ0hFQ0tPVVQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNyZWF0ZVRhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DcmVhdGVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4YmZkYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DcmVhdGVUYXNrLmphdmEKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY207CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisKKy8qKgorICogQ3JlYXRlcyBuZXcgQ29udGludXVzIGNjbSB0YXNrIGFuZCBzZXRzIGl0IGFzIHRoZSBkZWZhdWx0LgorICoKKyAqIEBhbnQudGFzayBuYW1lPSJjY21jcmVhdGV0YXNrIiBjYXRlZ29yeT0ic2NtIgorICovCitwdWJsaWMgY2xhc3MgQ0NNQ3JlYXRlVGFzayBleHRlbmRzIENvbnRpbnV1cyBpbXBsZW1lbnRzIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHBsYXRmb3JtID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlciA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVsZWFzZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc3ViU3lzdGVtID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyB0YXNrID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBDQ01DcmVhdGVUYXNrLgorICAgICAqLworICAgIHB1YmxpYyBDQ01DcmVhdGVUYXNrKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRDY21BY3Rpb24oQ09NTUFORF9DUkVBVEVfVEFTSyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KKyAgICAgKiA8cD4KKyAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBjY20gYW5kIHRoZW4gY2FsbHMgRXhlYydzIHJ1biBtZXRob2QKKyAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICogPC9wPgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQKKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBDQ00uRVhFIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDY21Db21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENjbUFjdGlvbigpKTsKKworICAgICAgICBjaGVja09wdGlvbnMoY29tbWFuZExpbmUpOworCisgICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSwgdGhpcyk7CisgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICAvL2NyZWF0ZSB0YXNrIG9rLCBzZXQgdGhpcyB0YXNrIGFzIHRoZSBkZWZhdWx0IG9uZQorICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZTIgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgY29tbWFuZExpbmUyLnNldEV4ZWN1dGFibGUoZ2V0Q2NtQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUyLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ09NTUFORF9ERUZBVUxUX1RBU0spOworICAgICAgICBjb21tYW5kTGluZTIuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRUYXNrKCkpOworCisgICAgICAgIGxvZyhjb21tYW5kTGluZS5kZXNjcmliZUNvbW1hbmQoKSwgUHJvamVjdC5NU0dfREVCVUcpOworCisgICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZTIpOworICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lMi50b1N0cmluZygpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19DT01NRU5UKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJcIiIgKyBnZXRDb21tZW50KCkgKyAiXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRQbGF0Zm9ybSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUExBVEZPUk0pOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0UGxhdGZvcm0oKSk7CisgICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCisKKyAgICAgICAgaWYgKGdldFJlc29sdmVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRVNPTFZFUik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRSZXNvbHZlcigpKTsKKyAgICAgICAgfSAvLyBlbmQgb2YgaWYgKCkKKworICAgICAgICBpZiAoZ2V0U3ViU3lzdGVtKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19TVUJTWVNURU0pOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIlwiIiArIGdldFN1YlN5c3RlbSgpICsgIlwiIik7CisgICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCisKKyAgICAgICAgaWYgKGdldFJlbGVhc2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1JFTEVBU0UpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0UmVsZWFzZSgpKTsKKyAgICAgICAgfSAvLyBlbmQgb2YgaWYgKCkKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgY29tbWVudC4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIGNvbW1lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gY29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgYSBjb21tZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBjb21tZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIHYpIHsKKyAgICAgICAgdGhpcy5jb21tZW50ID0gdjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgcGxhdGZvcm0uCisgICAgICogQHJldHVybiB2YWx1ZSBvZiBwbGF0Zm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBsYXRmb3JtKCkgeworICAgICAgICByZXR1cm4gcGxhdGZvcm07CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSB0YXJnZXQgcGxhdGZvcm0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIHBsYXRmb3JtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBsYXRmb3JtKFN0cmluZyB2KSB7CisgICAgICAgIHRoaXMucGxhdGZvcm0gPSB2OworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiByZXNvbHZlci4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHJlc29sdmVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb2x2ZXIoKSB7CisgICAgICAgIHJldHVybiByZXNvbHZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIHJlc29sdmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byByZXNvbHZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlcihTdHJpbmcgdikgeworICAgICAgICB0aGlzLnJlc29sdmVyID0gdjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgcmVsZWFzZS4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHJlbGVhc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWxlYXNlKCkgeworICAgICAgICByZXR1cm4gcmVsZWFzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IHRoZSBDQ00gcmVsZWFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gcmVsZWFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWxlYXNlKFN0cmluZyB2KSB7CisgICAgICAgIHRoaXMucmVsZWFzZSA9IHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBzdWJTeXN0ZW0uCisgICAgICogQHJldHVybiB2YWx1ZSBvZiBzdWJTeXN0ZW0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdWJTeXN0ZW0oKSB7CisgICAgICAgIHJldHVybiBzdWJTeXN0ZW07CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBzdWJzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIHN1YlN5c3RlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJTeXN0ZW0oU3RyaW5nIHYpIHsKKyAgICAgICAgdGhpcy5zdWJTeXN0ZW0gPSB2OworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0YXNrLgorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhc2soKSB7CisgICAgICAgIHJldHVybiB0YXNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVja2luCisgICAgICogdGhlIGZpbGUgKG1heSB1c2UgJ2RlZmF1bHQnKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXNrKFN0cmluZyB2KSB7CisgICAgICAgIHRoaXMudGFzayA9IHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogL2NvbW1lbnQgLS0gY29tbWVudHMgYXNzb2NpYXRlZCB0byB0aGUgdGFzaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICIvc3lub3BzaXMiOworCisgICAgLyoqCisgICAgICogIC9wbGF0Zm9ybSBmbGFnIC0tIHRhcmdldCBwbGF0Zm9ybQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUExBVEZPUk0gPSAiL3BsYXQiOworCisgICAgLyoqCisgICAgICogL3Jlc29sdmVyIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFU09MVkVSID0gIi9yZXNvbHZlciI7CisKKyAgICAvKioKKyAgICAgKiAvcmVsZWFzZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRUxFQVNFID0gIi9yZWxlYXNlIjsKKworICAgIC8qKgorICAgICAqIC9yZWxlYXNlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1NVQlNZU1RFTSA9ICIvc3Vic3lzdGVtIjsKKworICAgIC8qKgorICAgICAqICAtdGFzayBmbGFnIC0tIGFzc29jaWF0ZSBjaGVja291dCB0YXNrIHdpdGggdGFzaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVEFTSyA9ICIvdGFzayI7CisKKworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyIGludGVyZmFjZQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbTEgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzSW5wdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHBhcmFtMSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBpcyB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7CisgICAgICAgIFN0cmluZyBzID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgIGlmIChzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiZXJyICIgKyBzLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCisgICAgfQorCisgICAgLyoqCisgICAgICogcmVhZCB0aGUgb3V0cHV0IHN0cmVhbSB0byByZXRyaWV2ZSB0aGUgbmV3IHRhc2sgbnVtYmVyLgorICAgICAqIEBwYXJhbSBpcyBJbnB1dFN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzT3V0cHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBidWZmZXIgPSAiIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJidWZmZXI6IiArIGJ1ZmZlciwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIFN0cmluZyB0YXNrc3RyaW5nID0gYnVmZmVyLnN1YnN0cmluZyhidWZmZXIuaW5kZXhPZignICcpKS50cmltKCk7CisgICAgICAgICAgICAgICAgdGFza3N0cmluZyA9IHRhc2tzdHJpbmcuc3Vic3RyaW5nKDAsIHRhc2tzdHJpbmcubGFzdEluZGV4T2YoJyAnKSkudHJpbSgpOworICAgICAgICAgICAgICAgIHNldFRhc2sodGFza3N0cmluZyk7CisgICAgICAgICAgICAgICAgbG9nKCJ0YXNrIGlzICIgKyBnZXRUYXNrKCksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgbG9nKCJlcnJvciBwcm9jZXNzaW9uIHN0cmVhbSAsIG51bGwgcG9pbnRlciBleGNlcHRpb24iLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgbnBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG5wZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coImVycm9yIHByb2Nlc3Npb24gc3RyZWFtICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gLy8gZW5kIG9mIHRyeS1jYXRjaAorCisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01SZWNvbmZpZ3VyZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTVJlY29uZmlndXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmODA2NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01SZWNvbmZpZ3VyZS5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisKKy8qKgorICogVGFzayBhbGxvd3MgdG8gcmVjb25maWd1cmUgYSBwcm9qZWN0LCByZWN1cnNpdmVseSBvciBub3QKKyAqLworcHVibGljIGNsYXNzIENDTVJlY29uZmlndXJlIGV4dGVuZHMgQ29udGludXVzIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNjbVByb2plY3QgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiByZWN1cnNlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKworICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgQ0NNUmVjb25maWd1cmUuICovCisgICAgcHVibGljIENDTVJlY29uZmlndXJlKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRDY21BY3Rpb24oQ09NTUFORF9SRUNPTkZJR1VSRSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KKyAgICAgKiA8cD4KKyAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBjY20gYW5kIHRoZW4gY2FsbHMgRXhlYydzIHJ1biBtZXRob2QKKyAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICogPC9wPgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQKKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBDQ00uRVhFIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDY21Db21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENjbUFjdGlvbigpKTsKKworICAgICAgICBjaGVja09wdGlvbnMoY29tbWFuZExpbmUpOworCisgICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tPcHRpb25zKENvbW1hbmRsaW5lIGNtZCkgeworCisgICAgICAgIGlmIChpc1JlY3Vyc2UoKSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRUNVUlNFKTsKKyAgICAgICAgfSAvLyBlbmQgb2YgaWYgKCkKKworICAgICAgICBpZiAoaXNWZXJib3NlKCkpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSQk9TRSk7CisgICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCisKKyAgICAgICAgaWYgKGdldENjbVByb2plY3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1BST0pFQ1QpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q2NtUHJvamVjdCgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBwcm9qZWN0LgorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENjbVByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBjY21Qcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNjbSBwcm9qZWN0IG9uIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgYXBwbGllZC4KKyAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIHByb2plY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2NtUHJvamVjdChTdHJpbmcgdikgeworICAgICAgICB0aGlzLmNjbVByb2plY3QgPSB2OworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiByZWN1cnNlLgorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgcmVjdXJzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlY3Vyc2UoKSB7CisgICAgICAgIHJldHVybiByZWN1cnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHJlY3Vyc2Ugb24gc3VicHJvamVjdCAoZGVmYXVsdCBmYWxzZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIHJlY3Vyc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVjdXJzZShib29sZWFuIHYpIHsKKyAgICAgICAgdGhpcy5yZWN1cnNlID0gdjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdmVyYm9zZS4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHZlcmJvc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgeworICAgICAgICByZXR1cm4gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBkbyBhIHZlcmJvc2UgcmVjb25maWd1cmUgb3BlcmF0aW9uIChkZWZhdWx0IGZhbHNlKS4KKyAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIHZlcmJvc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHYpIHsKKyAgICAgICAgdGhpcy52ZXJib3NlID0gdjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIC9yZWN1cnNlIC0tCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRUNVUlNFID0gIi9yZWN1cnNlIjsKKworICAgIC8qKgorICAgICAqIC9yZWN1cnNlIC0tCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19WRVJCT1NFID0gIi92ZXJib3NlIjsKKworCisgICAgLyoqCisgICAgICogIC9wcm9qZWN0IGZsYWcgLS0gdGFyZ2V0IHByb2plY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BST0pFQ1QgPSAiL3Byb2plY3QiOworCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9Db250aW51dXMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9Db250aW51dXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjE4ZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NvbnRpbnV1cy5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgdGFza3MgZm9yIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBDb250aW51dXMgNS4xLgorICogPHA+CisgKiBUaGUgY2xhc3MgZXh0ZW5kcyB0aGUgIHRhc2sgYXMgaXQgb3BlcmF0ZXMgYnkgZXhlY3V0aW5nIHRoZSBjY20uZXhlIHByb2dyYW0KKyAqIHN1cHBsaWVkIHdpdGggQ29udGludXVzL1N5bmVyZ3kuIEJ5IGRlZmF1bHQgdGhlIHRhc2sgZXhwZWN0cyB0aGUgY2NtIGV4ZWN1dGFibGUgdG8gYmUKKyAqIGluIHRoZSBwYXRoLAorICogeW91IGNhbiBvdmVycmlkZSB0aGlzIGJlIHNwZWNpZnlpbmcgdGhlIGNjbWRpciBhdHRyaWJ1dGUuCisgKiA8L3A+CisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGludXVzIGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIFN0cmluZyBjY21EaXIgPSAiIjsKKyAgICBwcml2YXRlIFN0cmluZyBjY21BY3Rpb24gPSAiIjsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgY2NtQWN0aW9uLgorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgY2NtQWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2NtQWN0aW9uKCkgeworICAgICAgICByZXR1cm4gY2NtQWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgY2NtQWN0aW9uLgorICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gY2NtQWN0aW9uLgorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDY21BY3Rpb24oU3RyaW5nIHYpIHsKKyAgICAgICAgdGhpcy5jY21BY3Rpb24gPSB2OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNjbSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2NtIGV4ZWN1dGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDY21EaXIoU3RyaW5nIGRpcikgeworICAgICAgICBjY21EaXIgPSBGaWxlVXRpbHMudHJhbnNsYXRlUGF0aChkaXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhbmQgcmV0dXJucyB0aGUgY29tbWFuZCBzdHJpbmcgdG8gZXhlY3V0ZSBjY20KKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldENjbUNvbW1hbmQoKSB7CisgICAgICAgIFN0cmluZyB0b1JldHVybiA9IGNjbURpcjsKKyAgICAgICAgaWYgKCF0b1JldHVybi5lcXVhbHMoIiIpICYmICF0b1JldHVybi5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB0b1JldHVybiArPSAiLyI7CisgICAgICAgIH0KKworICAgICAgICB0b1JldHVybiArPSBDQ01fRVhFOworCisgICAgICAgIHJldHVybiB0b1JldHVybjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgY29tbWFuZC4KKyAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBhbiBleGVjdXRlIHN0cmVhbSBoYW5kbGVyCisgICAgICogQHJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJ1bihDb21tYW5kbGluZSBjbWQsIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUoaGFuZGxlcik7CisgICAgICAgICAgICBleGUuc2V0QW50UnVuKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpKTsKKyAgICAgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjbWQuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgICAgICByZXR1cm4gZXhlLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIGNvbW1hbmQuCisgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lCisgICAgICogQHJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJ1bihDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgcmV0dXJuIHJ1bihjbWQsIG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsIFByb2plY3QuTVNHX1ZFUkJPU0UsIFByb2plY3QuTVNHX1dBUk4pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHRoaW5nIHRvIGV4ZWN1dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0NNX0VYRSA9ICJjY20iOworCisgICAgLyoqCisgICAgICogVGhlICdDcmVhdGVUYXNrJyBjb21tYW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9DUkVBVEVfVEFTSyA9ICJjcmVhdGVfdGFzayI7CisgICAgLyoqCisgICAgICogVGhlICdDaGVja291dCcgY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfQ0hFQ0tPVVQgPSAiY28iOworICAgIC8qKgorICAgICAqIFRoZSAnQ2hlY2tpbicgY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfQ0hFQ0tJTiA9ICJjaSI7CisgICAgLyoqCisgICAgICogVGhlICdSZWNvbmZpZ3VyZScgY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfUkVDT05GSUdVUkUgPSAicmVjb25maWd1cmUiOworCisgICAgLyoqCisgICAgICogVGhlICdSZWNvbmZpZ3VyZScgY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfREVGQVVMVF9UQVNLID0gImRlZmF1bHRfdGFzayI7CisKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tpbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Y2ZjMDEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NDaGVja2luLmphdmEKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogUGVyZm9ybXMgQ2xlYXJDYXNlIGNoZWNraW4uCisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgorICogPHRhYmxlIGJvcmRlcj0iMSI+CisgKiAgIDx0cj4KKyAqICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAqICAgICA8dGg+VmFsdWVzPC90aD4KKyAqICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgKiAgICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+bm93YXJuPC90ZD4KKyAqICAgICAgPHRkPlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXM8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPnByZXNlcnZldGltZTwvdGQ+CisgKiAgICAgIDx0ZD5QcmVzZXJ2ZSB0aGUgbW9kaWZpY2F0aW9uIHRpbWU8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmtlZXBjb3B5PC90ZD4KKyAqICAgICAgPHRkPktlZXBzIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5pZGVudGljYWw8L3RkPgorICogICAgICA8dGQ+QWxsb3dzIHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQgaW4gZXZlbiBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICogICAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWU8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiA8L3RhYmxlPgorICoKKyAqLworcHVibGljIGNsYXNzIENDQ2hlY2tpbiBleHRlbmRzIENsZWFyQ2FzZSB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1lbnQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1DZmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Od2FybiA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHRpbWUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUtlZXAgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlkZW50aWNhbCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KKyAgICAgKiA8cD4KKyAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBjbGVhcnRvb2wgYW5kIHRoZW4gY2FsbHMgRXhlYydzIHJ1biBtZXRob2QKKyAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscyBhbmQgZmFpbG9uZXJyIGlzIHNldCB0byB0cnVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CisgICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIGludCByZXN1bHQgPSAwOworCisgICAgICAgIC8vIERlZmF1bHQgdGhlIHZpZXdwYXRoIHRvIGJhc2VkaXIgaWYgaXQgaXMgbm90IHNwZWNpZmllZAorICAgICAgICBpZiAoZ2V0Vmlld1BhdGgoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRWaWV3UGF0aChhUHJvai5nZXRCYXNlRGlyKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdC4gdGhlIGZvcm1hdCBpcworICAgICAgICAvLyBjbGVhcnRvb2wgY2hlY2tpbiBbb3B0aW9ucy4uLl0gW3ZpZXdwYXRoIC4uLl0KKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBDTEVBUlRPT0wuRVhFIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDbGVhclRvb2xDb21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfQ0hFQ0tJTik7CisKKyAgICAgICAgY2hlY2tPcHRpb25zKGNvbW1hbmRMaW5lKTsKKworICAgICAgICBpZiAoIWdldEZhaWxPbkVycigpKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJJZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0Vmlld1BhdGhCYXNlbmFtZSgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOworICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrT3B0aW9ucyhDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyAtYworICAgICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyAtY2ZpbGUKKyAgICAgICAgICAgICAgICBnZXRDb21tZW50RmlsZUNvbW1hbmQoY21kKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT0NPTU1FTlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldE5vV2FybigpKSB7CisgICAgICAgICAgICAvLyAtbndhcm4KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9XQVJOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRQcmVzZXJ2ZVRpbWUoKSkgeworICAgICAgICAgICAgLy8gLXB0aW1lCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1BSRVNFUlZFVElNRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0S2VlcENvcHkoKSkgeworICAgICAgICAgICAgLy8gLWtlZXAKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfS0VFUENPUFkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldElkZW50aWNhbCgpKSB7CisgICAgICAgICAgICAvLyAtaWRlbnRpY2FsCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0lERU5USUNBTCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2aWV3cGF0aAorICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWaWV3UGF0aCgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbW1lbnQgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgdGhlIGNvbW1lbnQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICBtQ29tbWVudCA9IGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbW1lbnQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBjb21tZW50CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gbUNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjZmlsZSB0aGUgcGF0aCB0byB0aGUgY29tbWVudCBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudEZpbGUoU3RyaW5nIGNmaWxlKSB7CisgICAgICAgIG1DZmlsZSA9IGNmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb21tZW50IGZpbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudEZpbGUoKSB7CisgICAgICAgIHJldHVybiBtQ2ZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgc3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBud2FybiB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vV2Fybihib29sZWFuIG53YXJuKSB7CisgICAgICAgIG1Od2FybiA9IG53YXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBub3dhcm4gZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBud2FybiBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9XYXJuKCkgeworICAgICAgICByZXR1cm4gbU53YXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHByZXNlcnZlIHRoZSBtb2RpZmljYXRpb24gdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwdGltZSB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZXNlcnZlVGltZShib29sZWFuIHB0aW1lKSB7CisgICAgICAgIG1QdGltZSA9IHB0aW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcmVzZXJ2ZXRpbWUgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBwcmVzZXJ2ZXRpbWUgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFByZXNlcnZlVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QdGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBrZWVwcyBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZWVwIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2VlcENvcHkoYm9vbGVhbiBrZWVwKSB7CisgICAgICAgIG1LZWVwID0ga2VlcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQga2VlcGNvcHkgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBrZWVwY29weSBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0S2VlcENvcHkoKSB7CisgICAgICAgIHJldHVybiBtS2VlcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBhbGxvd3MgdGhlIGZpbGUgdG8gYmUgY2hlY2tlZCBpbiBldmVuCisgICAgICogaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZGVudGljYWwgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZGVudGljYWwoYm9vbGVhbiBpZGVudGljYWwpIHsKKyAgICAgICAgbUlkZW50aWNhbCA9IGlkZW50aWNhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgaWRlbnRpY2FsIGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgaWRlbnRpY2FsIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZGVudGljYWwoKSB7CisgICAgICAgIHJldHVybiBtSWRlbnRpY2FsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgKiAgICAgICAgICAgIHdpdGhvdXQgdGhlIGNvbW1lbnQgZmxhZyBhbmQgc3RyaW5nIGFwcGVuZGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldENvbW1lbnRDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlQpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgJ2NvbW1lbnRmaWxlJyBjb21tYW5kCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvcgorICAgICAqICAgICAgICAgICAgd2l0aG91dCB0aGUgY29tbWVudGZpbGUgZmxhZyBhbmQgZmlsZSBhcHBlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRDb21tZW50RmlsZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlRGSUxFKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnRGaWxlKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7CisgICAgICAgIC8qKgorICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOworICAgICAgICAvKioKKyAgICAgKiAtbmMgZmxhZyAtLSBubyBjb21tZW50IGlzIHNwZWNpZmllZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9DT01NRU5UID0gIi1uYyI7CisgICAgICAgIC8qKgorICAgICAqIC1ud2FybiBmbGFnIC0tIHN1cHByZXNzZXMgd2FybmluZyBtZXNzYWdlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9XQVJOID0gIi1ud2FybiI7CisgICAgICAgIC8qKgorICAgICAqIC1wdGltZSBmbGFnIC0tIHByZXNlcnZlcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BSRVNFUlZFVElNRSA9ICItcHRpbWUiOworICAgICAgICAvKioKKyAgICAgKiAta2VlcCBmbGFnIC0tIGtlZXBzIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19LRUVQQ09QWSA9ICIta2VlcCI7CisgICAgICAgIC8qKgorICAgICAqIC1pZGVudGljYWwgZmxhZyAtLSBhbGxvd3MgdGhlIGZpbGUgdG8gYmUgY2hlY2tlZCBpbiBldmVuIGlmIGl0IGlzIGlkZW50aWNhbCB0byB0aGUgb3JpZ2luYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0lERU5USUNBTCA9ICItaWRlbnRpY2FsIjsKKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NDaGVja291dC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWFmMDlhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tvdXQuamF2YQpAQCAtMCwwICsxLDUxNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworCisvKioKKyAqIFBlcmZvcm1zIENsZWFyQ2FzZSBjaGVja291dC4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6CisgKiA8dGFibGUgYm9yZGVyPSIxIj4KKyAqICAgPHRyPgorICogICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICogICAgIDx0aD5WYWx1ZXM8L3RoPgorICogICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPnZpZXdwYXRoPC90ZD4KKyAqICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5yZXNlcnZlZDwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBjaGVjayBvdXQgdGhlIGZpbGUgYXMgcmVzZXJ2ZWQgb3Igbm90PC90ZD4KKyAqICAgICAgPHRkPlllczwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+b3V0PC90ZD4KKyAqICAgICAgPHRkPkNyZWF0ZXMgYSB3cml0YWJsZSBmaWxlIHVuZGVyIGEgZGlmZmVyZW50IGZpbGVuYW1lPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5ub2RhdGE8L3RkPgorICogICAgICA8dGQ+Q2hlY2tzIG91dCB0aGUgZmlsZSBidXQgZG9lcyBub3QgY3JlYXRlIGFuIGVkaXRhYmxlIGZpbGUgY29udGFpbmluZyBpdHMgZGF0YTwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+YnJhbmNoPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZnkgYSBicmFuY2ggdG8gY2hlY2sgb3V0IHRoZSBmaWxlIHRvPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAqICAgICAgPHRkPkFsbG93cyBjaGVja291dCBvZiBhIHZlcnNpb24gb3RoZXIgdGhhbiBtYWluIGxhdGVzdDwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+bm93YXJuPC90ZD4KKyAqICAgICAgPHRkPlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXM8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICogICAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPm5vdGNvPC90ZD4KKyAqICAgICAgPHRkPkZhaWwgaWYgaXQncyBhbHJlYWR5IGNoZWNrZWQgb3V0IHRvIHRoZSBjdXJyZW50IHZpZXcuIFNldCB0byBmYWxzZSB0byBpZ25vcmUgaXQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICogICAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWU8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiA8L3RhYmxlPgorICoKKyAqLworcHVibGljIGNsYXNzIENDQ2hlY2tvdXQgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZWQgPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nIG1PdXQgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBtTmRhdGEgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBtQnJhbmNoID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVZlcnNpb24gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU53YXJuID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1lbnQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1DZmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RjbyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KKyAgICAgKiA8cD4KKyAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBjbGVhcnRvb2wgYW5kIHRoZW4gY2FsbHMgRXhlYydzIHJ1biBtZXRob2QKKyAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscyBhbmQgZmFpbG9uZXJyIGlzIHNldCB0byB0cnVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CisgICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIGludCByZXN1bHQgPSAwOworCisgICAgICAgIC8vIERlZmF1bHQgdGhlIHZpZXdwYXRoIHRvIGJhc2VkaXIgaWYgaXQgaXMgbm90IHNwZWNpZmllZAorICAgICAgICBpZiAoZ2V0Vmlld1BhdGgoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRWaWV3UGF0aChhUHJvai5nZXRCYXNlRGlyKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdCB0aGUgZm9ybWF0IGlzCisgICAgICAgIC8vIGNsZWFydG9vbCBjaGVja291dCBbb3B0aW9ucy4uLl0gW3ZpZXdwYXRoIC4uLl0KKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBDTEVBUlRPT0wuRVhFIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDbGVhclRvb2xDb21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfQ0hFQ0tPVVQpOworCisgICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7CisgICAgICAgIC8qCisgICAgICAgICAqIElmIGNvbmZpZ3VyZWQgdG8gbm90IGNhcmUgYWJvdXQgd2hldGhlciB0aGUgZWxlbWVudCBpcworICAgICAgICAgKiBhbHJlYWR5IGNoZWNrZWQgb3V0IHRvIHRoZSBjdXJyZW50IHZpZXcuCisgICAgICAgICAqIFRoZW4gY2hlY2sgdG8gc2VlIGlmIGl0IGlzIGNoZWNrZWQgb3V0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFnZXROb3RjbygpICYmIGxzQ2hlY2tvdXQoKSkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiQWxyZWFkeSBjaGVja2VkIG91dCBpbiB0aGlzIHZpZXc6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRWaWV3UGF0aEJhc2VuYW1lKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIklnbm9yaW5nIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRWaWV3UGF0aEJhc2VuYW1lKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpICYmIGdldEZhaWxPbkVycigpKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGVsZW1lbnQgaXMgY2hlY2tlZCBvdXQgaW4gdGhlIGN1cnJlbnQgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbHNDaGVja291dCgpIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY21kbCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBTdHJpbmcgcmVzdWx0OworCisgICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdCB0aGUgZm9ybWF0IGlzCisgICAgICAgIC8vIGNsZWFydG9vbCBsc2NvIFtvcHRpb25zLi4uXSBbdmlld3BhdGggLi4uXQorICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gdGhlIENMRUFSVE9PTC5FWEUgaGVscAorICAgICAgICBjbWRsLnNldEV4ZWN1dGFibGUoZ2V0Q2xlYXJUb29sQ29tbWFuZCgpKTsKKyAgICAgICAgY21kbC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfTFNDTyk7CisgICAgICAgIGNtZGwuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWN2aWV3Iik7CisgICAgICAgIGNtZGwuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXNob3J0Iik7CisgICAgICAgIGNtZGwuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWQiKTsKKyAgICAgICAgLy8gdmlld3BhdGgKKyAgICAgICAgY21kbC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZpZXdQYXRoKCkpOworCisgICAgICAgIHJlc3VsdCA9IHJ1blMoY21kbCk7CisKKyAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAibHNDaGVja291dDogIiArIHJlc3VsdCApOworCisgICAgICAgIHJldHVybiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCkgPyB0cnVlIDogZmFsc2U7CisgICAgfQorICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tPcHRpb25zKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICAvLyBDbGVhckNhc2UgaXRlbXMKKyAgICAgICAgaWYgKGdldFJlc2VydmVkKCkpIHsKKyAgICAgICAgICAgIC8vIC1yZXNlcnZlZAorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRVNFUlZFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyAtdW5yZXNlcnZlZAorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19VTlJFU0VSVkVEKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRPdXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyAtb3V0CisgICAgICAgICAgICBnZXRPdXRDb21tYW5kKGNtZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0Tm9EYXRhKCkpIHsKKyAgICAgICAgICAgICAgICAvLyAtbmRhdGEKKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PREFUQSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRCcmFuY2goKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyAtYnJhbmNoCisgICAgICAgICAgICBnZXRCcmFuY2hDb21tYW5kKGNtZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0VmVyc2lvbigpKSB7CisgICAgICAgICAgICAgICAgLy8gLXZlcnNpb24KKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1ZFUlNJT04pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0Tm9XYXJuKCkpIHsKKyAgICAgICAgICAgIC8vIC1ud2FybgorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT1dBUk4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyAtYworICAgICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyAtY2ZpbGUKKyAgICAgICAgICAgICAgICBnZXRDb21tZW50RmlsZUNvbW1hbmQoY21kKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT0NPTU1FTlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdmlld3BhdGgKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Vmlld1BhdGgoKSk7CisKKyAgICAgICAgLy8gUHJpbnQgb3V0IGluZm8gYWJvdXQgdGhlIG5vdGNvIG9wdGlvbgorICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oICJOb3RjbzogIiArIChnZXROb3RjbygpID8gInllcyIgOiAibm8iKSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGNoZWNrcyBvdXQgdGhlIGZpbGUgYXMgcmVzZXJ2ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzZXJ2ZWQgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNlcnZlZChib29sZWFuIHJlc2VydmVkKSB7CisgICAgICAgIG1SZXNlcnZlZCA9IHJlc2VydmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCByZXNlcnZlZCBmbGFnIHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIHJlc2VydmVkIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXNlcnZlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXNlcnZlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBjaGVja291dCBmYWlscyBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGNoZWNrZWQgb3V0IHRvIHRoZSBjdXJyZW50IHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm90Y28gdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKiBAc2luY2UgYW50IDEuNi4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm90Y28oYm9vbGVhbiBub3RjbykgeworICAgICAgICBtTm90Y28gPSBub3RjbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbm90Y28gZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBub3RjbyBmbGFnCisgICAgICogQHNpbmNlIGFudCAxLjYuMQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE5vdGNvKCkgeworICAgICAgICByZXR1cm4gbU5vdGNvOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHdyaXRhYmxlIGZpbGUgdW5kZXIgYSBkaWZmZXJlbnQgZmlsZW5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0ZiB0aGUgcGF0aCB0byB0aGUgb3V0IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXQoU3RyaW5nIG91dGYpIHsKKyAgICAgICAgbU91dCA9IG91dGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG91dCBmaWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBvdXQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0KCkgeworICAgICAgICByZXR1cm4gbU91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBjaGVja3Mgb3V0IHRoZSBmaWxlIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYW4KKyAgICAgKiBlZGl0YWJsZSBmaWxlIGNvbnRhaW5pbmcgaXRzIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmRhdGEgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb0RhdGEoYm9vbGVhbiBuZGF0YSkgeworICAgICAgICBtTmRhdGEgPSBuZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbm9kYXRhIGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgbmRhdGEgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE5vRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1OZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IGEgYnJhbmNoIHRvIGNoZWNrIG91dCB0aGUgZmlsZSB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBicmFuY2ggdGhlIG5hbWUgb2YgdGhlIGJyYW5jaAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJyYW5jaChTdHJpbmcgYnJhbmNoKSB7CisgICAgICAgIG1CcmFuY2ggPSBicmFuY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGJyYW5jaCBuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBicmFuY2gKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJyYW5jaCgpIHsKKyAgICAgICAgcmV0dXJuIG1CcmFuY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgYWxsb3dzIGNoZWNrb3V0IG9mIGEgdmVyc2lvbiBvdGhlciB0aGFuIG1haW4gbGF0ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGJvb2xlYW4gdmVyc2lvbikgeworICAgICAgICBtVmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHZlcnNpb24gZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiB2ZXJzaW9uIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gbVZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgd2FybmluZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBud2FybiB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vV2Fybihib29sZWFuIG53YXJuKSB7CisgICAgICAgIG1Od2FybiA9IG53YXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBub3dhcm4gZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBud2FybiBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9XYXJuKCkgeworICAgICAgICByZXR1cm4gbU53YXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbW1lbnQgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgdGhlIGNvbW1lbnQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICBtQ29tbWVudCA9IGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbW1lbnQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBjb21tZW50CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gbUNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjZmlsZSB0aGUgcGF0aCB0byB0aGUgY29tbWVudCBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudEZpbGUoU3RyaW5nIGNmaWxlKSB7CisgICAgICAgIG1DZmlsZSA9IGNmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb21tZW50IGZpbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudEZpbGUoKSB7CisgICAgICAgIHJldHVybiBtQ2ZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnb3V0JyBjb21tYW5kCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSBvdXQgZmxhZyBhbmQgcGF0aCBhcHBlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRPdXRDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0T3V0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfT1VUKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldE91dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgJ2JyYW5jaCcgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgYnJhbmNoIGZsYWcgYW5kIG5hbWUgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0QnJhbmNoQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgaWYgKGdldEJyYW5jaCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0JSQU5DSCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRCcmFuY2goKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgJ2NvbW1lbnQnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIGNvbW1lbnQgZmxhZyBhbmQgc3RyaW5nIGFwcGVuZGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldENvbW1lbnRDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlQpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgJ2NmaWxlJyBjb21tYW5kCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSBjZmlsZSBmbGFnIGFuZCBmaWxlIGFwcGVuZGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldENvbW1lbnRGaWxlQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgaWYgKGdldENvbW1lbnRGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVEZJTEUpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudEZpbGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgICAgLyoqCisgICAgICogIC1yZXNlcnZlZCBmbGFnIC0tIGNoZWNrIG91dCB0aGUgZmlsZSBhcyByZXNlcnZlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVTRVJWRUQgPSAiLXJlc2VydmVkIjsKKyAgICAgICAgLyoqCisgICAgICogIC1yZXNlcnZlZCBmbGFnIC0tIGNoZWNrIG91dCB0aGUgZmlsZSBhcyB1bnJlc2VydmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19VTlJFU0VSVkVEID0gIi11bnJlc2VydmVkIjsKKyAgICAgICAgLyoqCisgICAgICogLW91dCBmbGFnIC0tIGNyZWF0ZSBhIHdyaXRhYmxlIGZpbGUgdW5kZXIgYSBkaWZmZXJlbnQgZmlsZW5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX09VVCA9ICItb3V0IjsKKyAgICAgICAgLyoqCisgICAgICogLW5kYXRhIGZsYWcgLS0gY2hlY2tzIG91dCB0aGUgZmlsZSBidXQgZG9lcyBub3QgY3JlYXRlIGFuIGVkaXRhYmxlIGZpbGUgY29udGFpbmluZyBpdHMgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9EQVRBID0gIi1uZGF0YSI7CisgICAgICAgIC8qKgorICAgICAqIC1icmFuY2ggZmxhZyAtLSBjaGVja3Mgb3V0IHRoZSBmaWxlIG9uIGEgc3BlY2lmaWVkIGJyYW5jaAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQlJBTkNIID0gIi1icmFuY2giOworICAgICAgICAvKioKKyAgICAgKiAtdmVyc2lvbiBmbGFnIC0tIGFsbG93cyBjaGVja291dCBvZiBhIHZlcnNpb24gdGhhdCBpcyBub3QgbWFpbiBsYXRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1ZFUlNJT04gPSAiLXZlcnNpb24iOworICAgICAgICAvKioKKyAgICAgKiAtbndhcm4gZmxhZyAtLSBzdXBwcmVzc2VzIHdhcm5pbmcgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PV0FSTiA9ICItbndhcm4iOworICAgICAgICAvKioKKyAgICAgKiAtYyBmbGFnIC0tIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi1jIjsKKyAgICAgICAgLyoqCisgICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7CisgICAgICAgIC8qKgorICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NMb2NrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NMb2NrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3MzU1NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ0xvY2suamF2YQpAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworCisvKioKKyAqIFRPRE86CisgKiBjb21tZW50IGZpZWxkIGRvZXNuJ3QgaW5jbHVkZSBhbGwgb3B0aW9ucyB5ZXQKKyAqLworCisKKworLyoqCisgKiBQZXJmb3JtcyBhIENsZWFyQ2FzZSBMb2NrIGNvbW1hbmQuCisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgorICogPHRhYmxlIGJvcmRlcj0iMSI+CisgKiAgIDx0cj4KKyAqICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAqICAgICA8dGg+VmFsdWVzPC90aD4KKyAqICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5yZXBsYWNlPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZmllcyByZXBsYWNpbmcgYW4gZXhpc3RpbmcgbG9jazwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+bnVzZXJzPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZmllcyB1c2VyKHMpIHdobyBjYW4gc3RpbGwgbW9kaWZ5IHRoZSBvYmplY3QvcG5hbWU8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPm9ic29sZXRlPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZmllcyB0aGF0IHRoZSBvYmplY3QvcG5hbWUgc2hvdWxkIGJlIG1hcmtlZCBvYnNvbGV0ZTwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZpZXMgaG93IHRvIHBvcHVsYXRlIGNvbW1lbnRzIGZpZWxkczwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+cG5hbWU8L3RkPgorICogICAgICA8dGQ+U3BlY2lmaWVzIHRoZSBwYXRobmFtZSB0byBiZSBsb2NrZWQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICAgICA8dGQ+b2Jqc2VsZWN0PC90ZD4KKyAqICAgICAgPHRkPlRoaXMgdmFyaWFibGUgaXMgb2Jzb2xldGUuIFNob3VsZCB1c2UgPGk+b2Jqc2VsPC9pPiBpbnN0ZWFkLjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+b2Jqc2VsPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZmllcyB0aGUgb2JqZWN0KHMpIHRvIGJlIHVubG9ja2VkLjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAqICAgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogPC90YWJsZT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDQ0xvY2sgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwbGFjZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtT2Jzb2xldGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBtQ29tbWVudCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU51c2VycyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVBuYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBtT2Jqc2VsZWN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgorICAgICAqIDxwPgorICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGNsZWFydG9vbCBhbmQgdGhlbiBjYWxscyBFeGVjJ3MgcnVuIG1ldGhvZAorICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzIGFuZCBmYWlsb25lcnIgaXMgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgICAgLy8gRGVmYXVsdCB0aGUgdmlld3BhdGggdG8gYmFzZWRpciBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgIGlmIChnZXRWaWV3UGF0aCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldFZpZXdQYXRoKGFQcm9qLmdldEJhc2VEaXIoKS5nZXRQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQgaXMKKyAgICAgICAgLy8gY2xlYXJ0b29sIGxvY2sgW29wdGlvbnMuLi5dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MLkVYRSBoZWxwCisgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0Q2xlYXJUb29sQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX0xPQ0spOworCisgICAgICAgIC8vIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucworICAgICAgICBjaGVja09wdGlvbnMoY29tbWFuZExpbmUpOworCisgICAgICAgIC8vIEZvciBkZWJ1Z2dpbmcKKyAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKGNvbW1hbmRMaW5lLnRvU3RyaW5nKCkpOworCisgICAgICAgIGlmICghZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIklnbm9yaW5nIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRPcFR5cGUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICAgKi8KK3ByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIC8vIENsZWFyQ2FzZSBpdGVtcworICAgICAgICBpZiAoZ2V0UmVwbGFjZSgpKSB7CisgICAgICAgICAgICAvLyAtcmVwbGFjZQorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRVBMQUNFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0T2Jzb2xldGUoKSkgeworICAgICAgICAgICAgLy8gLW9ic29sZXRlCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX09CU09MRVRFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldE51c2Vyc0NvbW1hbmQoY21kKTsKKyAgICAgICAgfQorICAgICAgICBnZXRDb21tZW50Q29tbWFuZChjbWQpOworCisgICAgICAgIGlmIChnZXRPYmpzZWxlY3QoKSA9PSBudWxsICYmIGdldFBuYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTaG91bGQgc2VsZWN0IGVpdGhlciBhbiBlbGVtZW50ICIKKyAgICAgICAgICAgICsgIihwbmFtZSkgb3IgYW4gb2JqZWN0IChvYmpzZWxlY3QpIik7CisgICAgICAgIH0KKyAgICAgICAgZ2V0UG5hbWVDb21tYW5kKGNtZCk7CisgICAgICAgIC8vIG9iamVjdCBzZWxlY3RvcgorICAgICAgICBpZiAoZ2V0T2Jqc2VsZWN0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0T2Jqc2VsZWN0KCkpOworICAgICAgICB9Cit9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCByZXBsYWNlIGFuIGV4aXN0aW5nIGxvY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwbGFjZSB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2UoYm9vbGVhbiByZXBsYWNlKSB7CisgICAgICAgIG1SZXBsYWNlID0gcmVwbGFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVwbGFjZSBmbGFnIHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIHJlcGxhY2UgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlcGxhY2UoKSB7CisgICAgICAgIHJldHVybiBtUmVwbGFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBtYXJrIG9iamVjdCBhcyBvYnNvbGV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYnNvbGV0ZSB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9ic29sZXRlKGJvb2xlYW4gb2Jzb2xldGUpIHsKKyAgICAgICAgbU9ic29sZXRlID0gb2Jzb2xldGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG9ic29sZXRlIGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2Ygb2Jzb2xldGUgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE9ic29sZXRlKCkgeworICAgICAgICByZXR1cm4gbU9ic29sZXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHVzZXJzIHdobyBtYXkgY29udGludWUgdG8KKyAgICAgKiBlZGl0IHRoZSBvYmplY3Qgd2hpbGUgaXQgaXMgbG9ja2VkLgorICAgICAqCisgICAgICogQHBhcmFtIG51c2VycyB1c2VycyBleGNsdWRlZCBmcm9tIGxvY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROdXNlcnMoU3RyaW5nIG51c2VycykgeworICAgICAgICBtTnVzZXJzID0gbnVzZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBudXNlcnMgbGlzdAorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgbGlzdCBvZiB1c2VycyBleGNsdWRlZCBmcm9tIGxvY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE51c2VycygpIHsKKyAgICAgICAgcmV0dXJuIG1OdXNlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgY29tbWVudHMgc2hvdWxkIGJlIHdyaXR0ZW4KKyAgICAgKiBmb3IgdGhlIGV2ZW50IHJlY29yZChzKQorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgY29tbWVudCBtZXRob2QgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICBtQ29tbWVudCA9IGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbW1lbnQgbWV0aG9kCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBkZXNpcmVkIGNvbW1lbnQgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gbUNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGF0aG5hbWUgdG8gYmUgbG9ja2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG5hbWUgcGF0aG5hbWUgdG8gYmUgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG5hbWUoU3RyaW5nIHBuYW1lKSB7CisgICAgICAgIG1QbmFtZSA9IHBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGF0aG5hbWUgdG8gYmUgbG9ja2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRobmFtZSB0byBiZSBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBuYW1lKCkgeworICAgICAgICByZXR1cm4gbVBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9iamVjdChzKSB0byBiZSBsb2NrZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmpzZWwgb2JqZWN0cyB0byBiZSBsb2NrZWQKKyAgICAgKiBAc2luY2UgYW50IDEuNi4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqU2VsKFN0cmluZyBvYmpzZWwpIHsKKyAgICAgICAgbU9ianNlbGVjdCA9IG9ianNlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvYmplY3QocykgdG8gYmUgbG9ja2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2Jqc2VsZWN0IG9iamVjdHMgdG8gYmUgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2Jqc2VsZWN0KFN0cmluZyBvYmpzZWxlY3QpIHsKKyAgICAgICAgbU9ianNlbGVjdCA9IG9ianNlbGVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbGlzdCBvZiBvYmplY3RzIHRvIGJlIGxvY2tlZAorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgb2JqZWN0cyB0byBiZSBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9ianNlbGVjdCgpIHsKKyAgICAgICAgcmV0dXJuIG1PYmpzZWxlY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnbnVzZXJzJyBjb21tYW5kCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvcgorICAgICAqICAgICAgICAgICAgd2l0aG91dCB0aGUgbnVzZXJzIGZsYWcgYW5kIHZhbHVlIGFwcGVuZGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldE51c2Vyc0NvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXROdXNlcnMoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKKyAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCisgICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OVVNFUlMpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0TnVzZXJzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3Igd2l0aG91dCB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbW1lbnQgZmxhZyBhbmQgdmFsdWUgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAncG5hbWUnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yCisgICAgICogICAgICAgICAgICB3aXRob3V0IHRoZSBwbmFtZSBmbGFnIGFuZCB2YWx1ZSBhcHBlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRQbmFtZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRQbmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1BOQU1FKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFBuYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoaWNoIG9iamVjdC9wbmFtZSBpcyBiZWluZyBvcGVyYXRlZCBvbgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgb2JqZWN0L3BuYW1lIGJlaW5nIHdvcmtlZCBvbgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldE9wVHlwZSgpIHsKKworICAgICAgICBpZiAoZ2V0UG5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UG5hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRPYmpzZWxlY3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICAtcmVwbGFjZSBmbGFnIC0tIHJlcGxhY2UgZXhpc3RpbmcgbG9jayBvbiBvYmplY3QocykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFUExBQ0UgPSAiLXJlcGxhY2UiOworICAgIC8qKgorICAgICAqIC1udXNlcnMgZmxhZyAtLSBsaXN0IG9mIHVzZXJzIHRvIGV4Y2x1ZGUgZnJvbSBsb2NrCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OVVNFUlMgPSAiLW51c2VycyI7CisgICAgLyoqCisgICAgICogLW9ic29sZXRlIGZsYWcgLS0gbWFyayBsb2NrZWQgb2JqZWN0IGFzIG9ic29sZXRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19PQlNPTEVURSA9ICItb2Jzb2xldGUiOworICAgIC8qKgorICAgICAqIC1jb21tZW50IGZsYWcgLS0gbWV0aG9kIHRvIHVzZSBmb3IgY29tbWVudGluZyBldmVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWNvbW1lbnQiOworICAgIC8qKgorICAgICAqIC1wbmFtZSBmbGFnIC0tIHBhdGhuYW1lIHRvIGxvY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BOQU1FID0gIi1wbmFtZSI7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rYXR0ci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWthdHRyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkMTg4NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rYXR0ci5qYXZhCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKKworLyoqCisgKiBUYXNrIHRvIHBlcmZvcm0gbWthdHRyIGNvbW1hbmQgdG8gQ2xlYXJDYXNlLgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgorICogPHRhYmxlIGJvcmRlcj0iMSI+CisgKiAgIDx0cj4KKyAqICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAqICAgICA8dGg+VmFsdWVzPC90aD4KKyAqICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgKiAgICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgKiAgICAgIDx0ZD5ZZXM8L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPnJlcGxhY2U8L3RkPgorICogICAgICA8dGQ+UmVwbGFjZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBpZiBpdCBhbHJlYWR5IGV4aXN0czwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+cmVjdXJzZTwvdGQ+CisgKiAgICAgIDx0ZD5Qcm9jZXNzIGVhY2ggc3ViZGlyZWN0b3J5IHVuZGVyIHZpZXdwYXRoPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAqICAgICAgPHRkPklkZW50aWZ5IGEgc3BlY2lmaWMgdmVyc2lvbiB0byBhdHRhY2ggdGhlIGF0dHJpYnV0ZSB0bzwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+dHlwZW5hbWU8L3RkPgorICogICAgICA8dGQ+TmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGU8L3RkPgorICogICAgICA8dGQ+WWVzPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD50eXBldmFsdWU8L3RkPgorICogICAgICA8dGQ+VmFsdWUgdG8gYXR0YWNoIHRvIHRoZSBhdHRyaWJ1dGUgdHlwZTwvdGQ+CisgKiAgICAgIDx0ZD5ZZXM8L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICogICAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmZhaWxvbmVycjwvdGQ+CisgKiAgICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqIDwvdGFibGU+CisgKgorICovCitwdWJsaWMgY2xhc3MgQ0NNa2F0dHIgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwbGFjZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVjdXJzZSA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIG1WZXJzaW9uID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBtVHlwZU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1UeXBlVmFsdWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1Db21tZW50ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBtQ2ZpbGUgPSBudWxsOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICogPHA+CisgICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2xlYXJ0b29sIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCisgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgYXR0cmlidXRlcworICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlcXVpcmVkIGF0dHJpYnV0ZSBUeXBlTmFtZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldFR5cGVWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUmVxdWlyZWQgYXR0cmlidXRlIFR5cGVWYWx1ZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVmYXVsdCB0aGUgdmlld3BhdGggdG8gYmFzZWRpciBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgIGlmIChnZXRWaWV3UGF0aCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldFZpZXdQYXRoKGFQcm9qLmdldEJhc2VEaXIoKS5nZXRQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290LiB0aGUgZm9ybWF0IGlzCisgICAgICAgIC8vIGNsZWFydG9vbCBta2F0dHIgW29wdGlvbnMuLi5dIFt2aWV3cGF0aCAuLi5dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDbGVhclRvb2xDb21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfTUtBVFRSKTsKKworICAgICAgICBjaGVja09wdGlvbnMoY29tbWFuZExpbmUpOworCisgICAgICAgIGlmICghZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIklnbm9yaW5nIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRWaWV3UGF0aEJhc2VuYW1lKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yIGRlYnVnZ2luZworICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oY29tbWFuZExpbmUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRSZXBsYWNlKCkpIHsKKyAgICAgICAgICAgIC8vIC1yZXBsYWNlCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1JFUExBQ0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldFJlY3Vyc2UoKSkgeworICAgICAgICAgICAgLy8gLXJlY3Vyc2UKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUkVDVVJTRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0VmVyc2lvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIC12ZXJzaW9uCisgICAgICAgICAgICBnZXRWZXJzaW9uQ29tbWFuZChjbWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyAtYworICAgICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyAtY2ZpbGUKKyAgICAgICAgICAgICAgICBnZXRDb21tZW50RmlsZUNvbW1hbmQoY21kKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT0NPTU1FTlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldFR5cGVOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdHlwZQorICAgICAgICAgICAgZ2V0VHlwZUNvbW1hbmQoY21kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0VHlwZVZhbHVlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdHlwZSB2YWx1ZQorICAgICAgICAgICAgZ2V0VHlwZVZhbHVlQ29tbWFuZChjbWQpOworICAgICAgICB9CisgICAgICAgIC8vIHZpZXdwYXRoCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZpZXdQYXRoKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXBsYWNlIGZsYWcKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXBsYWNlIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwbGFjZShib29sZWFuIHJlcGxhY2UpIHsKKyAgICAgICAgbVJlcGxhY2UgPSByZXBsYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCByZXBsYWNlIGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgcmVwbGFjZSBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVwbGFjZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXBsYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCByZWN1cnNlIGZsYWcKKyAgICAgKgorICAgICAqIEBwYXJhbSByZWN1cnNlIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVjdXJzZShib29sZWFuIHJlY3Vyc2UpIHsKKyAgICAgICAgbVJlY3Vyc2UgPSByZWN1cnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCByZWN1cnNlIGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgcmVjdXJzZSBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVjdXJzZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZWN1cnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmVyc2lvbiBmbGFnCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB2ZXJzaW9uIGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgdmVyc2lvbiBmbGFnCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gbVZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGNvbW1lbnQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCB0aGUgY29tbWVudCBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIG1Db21tZW50ID0gY29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tbWVudCBzdHJpbmcKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBtQ29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgY29tbWVudCBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ZpbGUgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRGaWxlKFN0cmluZyBjZmlsZSkgeworICAgICAgICBtQ2ZpbGUgPSBjZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tbWVudCBmaWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBjb21tZW50IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRGaWxlKCkgeworICAgICAgICByZXR1cm4gbUNmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXR0cmlidXRlIHR5cGUtbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIHRuIHRoZSB0eXBlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgdG4pIHsKKyAgICAgICAgbVR5cGVOYW1lID0gdG47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGF0dHJpYnV0ZSB0eXBlLW5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdHlwZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UeXBlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF0dHJpYnV0ZSB0eXBlLXZhbHVlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHYgdGhlIHR5cGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlVmFsdWUoU3RyaW5nIHR2KSB7CisgICAgICAgIG1UeXBlVmFsdWUgPSB0djsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB0eXBlLXZhbHVlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHR5cGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UeXBlVmFsdWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlICd2ZXJzaW9uJyBjb21tYW5kCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIENvbW1hbmRMaW5lIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSB2ZXJzaW9uIGZsYWcgYW5kIHN0cmluZyBhcHBlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRWZXJzaW9uQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgaWYgKGdldFZlcnNpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKKyAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCisgICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19WRVJTSU9OKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZlcnNpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlICdjb21tZW50JyBjb21tYW5kCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvcgorICAgICAqICAgICAgICB3aXRob3V0IHRoZSBjb21tZW50IGZsYWcgYW5kIHN0cmluZyBhcHBlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRDb21tZW50Q29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKKyAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCisgICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19DT01NRU5UKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlICdjb21tZW50ZmlsZScgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSBjb21tZW50ZmlsZSBmbGFnIGFuZCBmaWxlIGFwcGVuZGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldENvbW1lbnRGaWxlQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgaWYgKGdldENvbW1lbnRGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVEZJTEUpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudEZpbGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB0eXBlLW5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yCisgICAgICogICAgICAgIHdpdGhvdXQgdGhlIHR5cGUtbmFtZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRUeXBlQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgU3RyaW5nIHR5cGVubSA9IGdldFR5cGVOYW1lKCk7CisKKyAgICAgICAgaWYgKHR5cGVubSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSh0eXBlbm0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhdHRyaWJ1dGUgdHlwZS12YWx1ZQorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgKiAgICAgICAgd2l0aG91dCB0aGUgdHlwZS12YWx1ZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRUeXBlVmFsdWVDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBTdHJpbmcgdHlwZXZsID0gZ2V0VHlwZVZhbHVlKCk7CisKKyAgICAgICAgaWYgKHR5cGV2bCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIndpbmRvd3MiKSkgeworICAgICAgICAgICAgICAgIHR5cGV2bCA9ICJcXFwiIiArIHR5cGV2bCArICJcXFwiIjsgLy8gV2luZG93cyBxdW90aW5nIG9mIHRoZSB2YWx1ZQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eXBldmwgPSAiXCIiICsgdHlwZXZsICsgIlwiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHR5cGV2bCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAtcmVwbGFjZSBmbGFnIC0tIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFUExBQ0UgPSAiLXJlcGxhY2UiOworICAgIC8qKgorICAgICAqIC1yZWN1cnNlIGZsYWcgLS0gcHJvY2VzcyBhbGwgc3ViZGlyZWN0b3JpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFQ1VSU0UgPSAiLXJlY3Vyc2UiOworICAgIC8qKgorICAgICAqIC12ZXJzaW9uIGZsYWcgLS0gYXR0YWNoIGF0dHJpYnV0ZSB0byBzcGVjaWZpZWQgdmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVkVSU0lPTiA9ICItdmVyc2lvbiI7CisgICAgLyoqCisgICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7CisgICAgLyoqCisgICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7CisgICAgLyoqCisgICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2JsLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2JsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjOTYwMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rYmwuamF2YQpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBUYXNrIHRvIENyZWF0ZUJhc2VsaW5lIGNvbW1hbmQgdG8gQ2xlYXJDYXNlLgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgorICogPHRhYmxlIGJvcmRlcj0iMSI+CisgKiAgIDx0cj4KKyAqICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAqICAgICA8dGg+VmFsdWVzPC90aD4KKyAqICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5jb21tZW50PC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZQordXNlZC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvcgorY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+YmFzZWxpbmVyb290bmFtZTwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZ5IHRoZSBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFzZWxpbmUuPC90ZD4KKyAqICAgICAgPHRkPlllczwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPm5vd2FybjwvdGQ+CisgKiAgICAgIDx0ZD5TdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5pZGVudGljYWw8L3RkPgorICogICAgICA8dGQ+QWxsb3dzIHRoZSBiYXNlbGluZSB0byBiZSBjcmVhdGVkIGV2ZW4gaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZQorcHJldmlvdXMgYmFzZWxpbmUuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+ZnVsbDwvdGQ+CisgKiAgICAgIDx0ZD5DcmVhdGVzIGEgZnVsbCBiYXNlbGluZS48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5ubGFiZWw8L3RkPgorICogICAgICA8dGQ+QWxsb3dzIHRoZSBiYXNlbGluZSB0byBiZSBjcmVhdGVkIHdpdGhvdXQgYSBsYWJlbC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICogICAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWU8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiA8L3RhYmxlPgorICoKKyAqLworcHVibGljIGNsYXNzIENDTWtibCBleHRlbmRzIENsZWFyQ2FzZSB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1lbnQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1DZmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUJhc2VsaW5lUm9vdE5hbWUgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBtTndhcm4gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlkZW50aWNhbCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1GdWxsID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1ObGFiZWwgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICogPHA+CisgICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2xlYXJ0b29sIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCisgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICAvLyBEZWZhdWx0IHRoZSB2aWV3cGF0aCB0byBiYXNlZGlyIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKKyAgICAgICAgaWYgKGdldFZpZXdQYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Vmlld1BhdGgoYVByb2ouZ2V0QmFzZURpcigpLmdldFBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QuIHRoZSBmb3JtYXQgaXMKKyAgICAgICAgLy8gY2xlYXJ0b29sIGNoZWNraW4gW29wdGlvbnMuLi5dIFt2aWV3cGF0aCAuLi5dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MLkVYRSBoZWxwCisgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0Q2xlYXJUb29sQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX01LQkwpOworCisgICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7CisKKyAgICAgICAgaWYgKCFnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIGdldEJhc2VsaW5lUm9vdE5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gLWMKKyAgICAgICAgICAgIGdldENvbW1lbnRDb21tYW5kKGNtZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gLWNmaWxlCisgICAgICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRJZGVudGljYWwoKSkgeworICAgICAgICAgICAgLy8gLWlkZW50aWNhbAorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19JREVOVElDQUwpOworICAgICAgICB9CisKKyAgICAgICBpZiAoZ2V0RnVsbCgpKSB7CisgICAgICAgICAgIC8vIC1mdWxsCisgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfRlVMTCk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgLy8gLWluY3JlbWVudGFsCisgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfSU5DUkVNRU5UQUwpOworICAgICAgIH0KKworICAgICAgIGlmIChnZXRObGFiZWwoKSkgeworICAgICAgICAgICAvLyAtbmxhYmVsCisgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTkxBQkVMKTsKKyAgICAgICB9CisKKyAgICAgICAvLyBiYXNlbGluZV9yb290X25hbWUKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0QmFzZWxpbmVSb290TmFtZSgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGNvbW1lbnQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCB0aGUgY29tbWVudCBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIG1Db21tZW50ID0gY29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tbWVudCBzdHJpbmcKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBtQ29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgY29tbWVudCBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ZpbGUgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRGaWxlKFN0cmluZyBjZmlsZSkgeworICAgICAgICBtQ2ZpbGUgPSBjZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tbWVudCBmaWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBjb21tZW50IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRGaWxlKCkgeworICAgICAgICByZXR1cm4gbUNmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBiYXNlbGluZV9yb290X25hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlbGluZVJvb3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBiYXNlbGluZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VsaW5lUm9vdE5hbWUoU3RyaW5nIGJhc2VsaW5lUm9vdE5hbWUpIHsKKyAgICAgICAgbUJhc2VsaW5lUm9vdE5hbWUgPSBiYXNlbGluZVJvb3ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBiYXNlbGluZV9yb290X25hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGJhc2VsaW5lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCYXNlbGluZVJvb3ROYW1lKCkgeworICAgICAgICByZXR1cm4gbUJhc2VsaW5lUm9vdE5hbWU7CisgICAgfQorCisgICAgLyoqCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5vd2FybiBmbGFnCisgICAgICoKKyAgICAgKiBAcGFyYW0gbndhcm4gdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb1dhcm4oYm9vbGVhbiBud2FybikgeworICAgICAgICBtTndhcm4gPSBud2FybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbm93YXJuIGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2Ygbndhcm4gZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE5vV2FybigpIHsKKyAgICAgICAgcmV0dXJuIG1Od2FybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGlkZW50aWNhbCBmbGFnCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWRlbnRpY2FsIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWRlbnRpY2FsKGJvb2xlYW4gaWRlbnRpY2FsKSB7CisgICAgICAgIG1JZGVudGljYWwgPSBpZGVudGljYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGlkZW50aWNhbCBmbGFnIHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIGlkZW50aWNhbCBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWRlbnRpY2FsKCkgeworICAgICAgICByZXR1cm4gbUlkZW50aWNhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZ1bGwgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIGZ1bGwgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxsKGJvb2xlYW4gZnVsbCkgeworICAgICAgICBtRnVsbCA9IGZ1bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGZ1bGwgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBmdWxsIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGdWxsKCkgeworICAgICAgICByZXR1cm4gbUZ1bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBubGFiZWwgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIG5sYWJlbCB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5sYWJlbChib29sZWFuIG5sYWJlbCkgeworICAgICAgICBtTmxhYmVsID0gbmxhYmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBubGFiZWwgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgbmxhYmVsIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRObGFiZWwoKSB7CisgICAgICAgIHJldHVybiBtTmxhYmVsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgY29tbWVudCBmbGFnIGFuZCBzdHJpbmcgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudGZpbGUnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgQ29tbWFuZExpbmUgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIGNvbW1lbnRmaWxlIGZsYWcgYW5kIGZpbGUgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudEZpbGVDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKKyAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCisgICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19DT01NRU5URklMRSk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50RmlsZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOworICAgICAgICAvKioKKyAgICAgKiAtY2ZpbGUgZmxhZyAtLSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVEZJTEUgPSAiLWNmaWxlIjsKKyAgICAgICAgLyoqCisgICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOworICAgICAgICAvKioKKyAgICAgKiAtaWRlbnRpY2FsIGZsYWcgLS0gYWxsb3dzIHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQgaW4gZXZlbiBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19JREVOVElDQUwgPSAiLWlkZW50aWNhbCI7CisgICAgICAgLyoqCisgICAgICogLWluY3JlbWVudGFsIGZsYWcgLS0gYmFzZWxpbmUgdG8gYmUgY3JlYXRlZCBpcyBpbmNyZW1lbnRhbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfSU5DUkVNRU5UQUwgPSAiLWluY3JlbWVudGFsIjsKKyAgICAgICAvKioKKyAgICAgKiAtZnVsbCBmbGFnIC0tIGJhc2VsaW5lIHRvIGJlIGNyZWF0ZWQgaXMgZnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRlVMTCA9ICItZnVsbCI7CisgICAgICAgLyoqCisgICAgICogLW5sYWJlbCAtLSBiYXNlbGluZSB0byBiZSBjcmVhdGVkIHdpdGhvdXQgYSBsYWJlbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTkxBQkVMID0gIi1ubGFiZWwiOworCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rZGlyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2Rpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODk1MzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2Rpci5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisvKioKKyAqIFBlcmZvcm1zIENsZWFyQ2FzZSBta2Rpci4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6CisgKiA8dGFibGUgYm9yZGVyPSIxIj4KKyAqICAgPHRyPgorICogICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICogICAgIDx0aD5WYWx1ZXM8L3RoPgorICogICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPnZpZXdwYXRoPC90ZD4KKyAqICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgKiAgICAgIDx0ZD5ZZXM8L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICogICAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPm5vY2hlY2tvdXQ8L3RkPgorICogICAgICA8dGQ+RG8gbm90IGNoZWNrb3V0IGFmdGVyIGVsZW1lbnQgY3JlYXRpb248L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmZhaWxvbmVycjwvdGQ+CisgKiAgICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqIDwvdGFibGU+CisgKgorICovCitwdWJsaWMgY2xhc3MgQ0NNa2RpciBleHRlbmRzIENsZWFyQ2FzZSB7CisgICAgcHJpdmF0ZSBTdHJpbmcgIG1Db21tZW50ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyAgbUNmaWxlICAgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBtTm9jbyAgICA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICogPHA+CisgICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2xlYXJ0b29sIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCisgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICAvLyBEZWZhdWx0IHRoZSB2aWV3cGF0aCB0byBiYXNlZGlyIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKKyAgICAgICAgaWYgKGdldFZpZXdQYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Vmlld1BhdGgoYVByb2ouZ2V0QmFzZURpcigpLmdldFBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QuIHRoZSBmb3JtYXQgaXMKKyAgICAgICAgLy8gY2xlYXJ0b29sIG1rZWxlbSBbb3B0aW9ucy4uLl0gW3ZpZXdwYXRoIC4uLl0KKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBDTEVBUlRPT0wuRVhFIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDbGVhclRvb2xDb21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfTUtESVIpOworCisgICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7CisKKyAgICAgICAgaWYgKCFnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIGdldFZpZXdQYXRoQmFzZW5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tPcHRpb25zKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIC1jCisgICAgICAgICAgICBnZXRDb21tZW50Q29tbWFuZChjbWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGdldENvbW1lbnRGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIC1jZmlsZQorICAgICAgICAgICAgICAgIGdldENvbW1lbnRGaWxlQ29tbWFuZChjbWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PQ09NTUVOVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldE5vQ2hlY2tvdXQoKSkgeworICAgICAgICAgICAgLy8gLW5jbworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT0NIRUNLT1VUKTsKKyAgICAgICAgfQorICAgICAgICAvLyB2aWV3cGF0aAorICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWaWV3UGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21tZW50IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgbUNvbW1lbnQgPSBjb21tZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb21tZW50IHN0cmluZworICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgY29tbWVudAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db21tZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ZpbGUgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRGaWxlKFN0cmluZyBjZmlsZSkgeworICAgICAgICBtQ2ZpbGUgPSBjZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tbWVudCBmaWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBjb21tZW50IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRGaWxlKCkgeworICAgICAgICByZXR1cm4gbUNmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGRvIG5vdCBjaGVja291dCBlbGVtZW50IGFmdGVyIGNyZWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9DaGVja291dChib29sZWFuIGNvKSB7CisgICAgICAgIG1Ob2NvID0gY287CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG5vIGNoZWNrb3V0IGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2Ygbm9jbyBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9DaGVja291dCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ob2NvOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgKiAgICAgICAgICAgIHdpdGhvdXQgdGhlIGNvbW1lbnQgZmxhZyBhbmQgc3RyaW5nIGFwcGVuZGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldENvbW1lbnRDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlQpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgJ2NvbW1lbnRmaWxlJyBjb21tYW5kCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvcgorICAgICAqICAgICAgICAgICAgd2l0aG91dCB0aGUgY29tbWVudGZpbGUgZmxhZyBhbmQgZmlsZSBhcHBlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRDb21tZW50RmlsZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlRGSUxFKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnRGaWxlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi1jIjsKKyAgICAvKioKKyAgICAgKiAtY2ZpbGUgZmxhZyAtLSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOworICAgIC8qKgorICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKKyAgICAvKioKKyAgICAgKiAtbmNvIGZsYWcgLS0gZG8gbm90IGNoZWNrb3V0IGVsZW1lbnQgYWZ0ZXIgY3JlYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ0hFQ0tPVVQgPSAiLW5jbyI7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rZWxlbS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtlbGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmYWE1YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rZWxlbS5qYXZhCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisvKioKKyAqIFBlcmZvcm1zIENsZWFyQ2FzZSBta2VsZW0uCisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgorICogPHRhYmxlIGJvcmRlcj0iMSI+CisgKiAgIDx0cj4KKyAqICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAqICAgICA8dGg+VmFsdWVzPC90aD4KKyAqICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgKiAgICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgKiAgICAgIDx0ZD5ZZXM8L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICogICAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPm5vd2FybjwvdGQ+CisgKiAgICAgIDx0ZD5TdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5ub2NoZWNrb3V0PC90ZD4KKyAqICAgICAgPHRkPkRvIG5vdCBjaGVja291dCBhZnRlciBlbGVtZW50IGNyZWF0aW9uPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5jaGVja2luPC90ZD4KKyAqICAgICAgPHRkPkNoZWNraW4gZWxlbWVudCBhZnRlciBjcmVhdGlvbjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+cHJlc2VydmV0aW1lPC90ZD4KKyAqICAgICAgPHRkPlByZXNlcnZlIHRoZSBtb2RpZmljYXRpb24gdGltZSAoZm9yIGNoZWNraW4pPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5tYXN0ZXI8L3RkPgorICogICAgICA8dGQ+QXNzaWduIG1hc3RlcnNoaXAgb2YgdGhlIG1haW4gYnJhbmNoIHRvIHRoZSBjdXJyZW50IHNpdGU8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmVsdHlwZTwvdGQ+CisgKiAgICAgIDx0ZD5FbGVtZW50IHR5cGUgdG8gdXNlIGR1cmluZyBlbGVtZW50IGNyZWF0aW9uPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICogICAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWU8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiA8L3RhYmxlPgorICoKKyAqLworcHVibGljIGNsYXNzIENDTWtlbGVtIGV4dGVuZHMgQ2xlYXJDYXNlIHsKKyAgICBwcml2YXRlIFN0cmluZyAgbUNvbW1lbnQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nICBtQ2ZpbGUgICA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Od2FybiAgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QdGltZSAgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Ob2NvICAgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGVja2luID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1NYXN0ZXIgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgIG1FbHR5cGUgID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgorICAgICAqIDxwPgorICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGNsZWFydG9vbCBhbmQgdGhlbiBjYWxscyBFeGVjJ3MgcnVuIG1ldGhvZAorICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzIGFuZCBmYWlsb25lcnIgaXMgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgICAgLy8gRGVmYXVsdCB0aGUgdmlld3BhdGggdG8gYmFzZWRpciBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgIGlmIChnZXRWaWV3UGF0aCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldFZpZXdQYXRoKGFQcm9qLmdldEJhc2VEaXIoKS5nZXRQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290LiB0aGUgZm9ybWF0IGlzCisgICAgICAgIC8vIGNsZWFydG9vbCBta2VsZW0gW29wdGlvbnMuLi5dIFt2aWV3cGF0aCAuLi5dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MLkVYRSBoZWxwCisgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0Q2xlYXJUb29sQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX01LRUxFTSk7CisKKyAgICAgICAgY2hlY2tPcHRpb25zKGNvbW1hbmRMaW5lKTsKKworICAgICAgICBpZiAoIWdldEZhaWxPbkVycigpKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJJZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0Vmlld1BhdGhCYXNlbmFtZSgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOworICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrT3B0aW9ucyhDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyAtYworICAgICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyAtY2ZpbGUKKyAgICAgICAgICAgICAgICBnZXRDb21tZW50RmlsZUNvbW1hbmQoY21kKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT0NPTU1FTlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldE5vV2FybigpKSB7CisgICAgICAgICAgICAvLyAtbndhcm4KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9XQVJOKTsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBTaG91bGQgY2hvb3NlIGVpdGhlciAtY2kgb3IgLW5jby4KKyAgICAgICAgICovCisgICAgICAgIGlmIChnZXROb0NoZWNrb3V0KCkgJiYgZ2V0Q2hlY2tpbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNob3VsZCBjaG9vc2UgZWl0aGVyIFtub2NoZWNrb3V0IHwgY2hlY2tpbl0iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Tm9DaGVja291dCgpKSB7CisgICAgICAgICAgICAvLyAtbmNvCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PQ0hFQ0tPVVQpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDaGVja2luKCkpIHsKKyAgICAgICAgICAgIC8vIC1jaQorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19DSEVDS0lOKTsKKyAgICAgICAgICAgIGlmIChnZXRQcmVzZXJ2ZVRpbWUoKSkgeworICAgICAgICAgICAgICAgIC8vIC1wdGltZQorICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUFJFU0VSVkVUSU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0TWFzdGVyKCkpIHsKKyAgICAgICAgICAgIC8vIC1tYXN0ZXIKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTUFTVEVSKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0RWx0eXBlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gLWVsdHlwZQorICAgICAgICAgICAgZ2V0RWx0eXBlQ29tbWFuZChjbWQpOworICAgICAgICB9CisgICAgICAgIC8vIHZpZXdwYXRoCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZpZXdQYXRoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbW1lbnQgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgdGhlIGNvbW1lbnQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICBtQ29tbWVudCA9IGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbW1lbnQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBjb21tZW50CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gbUNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjZmlsZSB0aGUgcGF0aCB0byB0aGUgY29tbWVudCBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudEZpbGUoU3RyaW5nIGNmaWxlKSB7CisgICAgICAgIG1DZmlsZSA9IGNmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb21tZW50IGZpbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudEZpbGUoKSB7CisgICAgICAgIHJldHVybiBtQ2ZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgc3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBud2FybiB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vV2Fybihib29sZWFuIG53YXJuKSB7CisgICAgICAgIG1Od2FybiA9IG53YXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBub3dhcm4gZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBud2FybiBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm9XYXJuKCkgeworICAgICAgICByZXR1cm4gbU53YXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHByZXNlcnZlIHRoZSBtb2RpZmljYXRpb24gdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwdGltZSB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZXNlcnZlVGltZShib29sZWFuIHB0aW1lKSB7CisgICAgICAgIG1QdGltZSA9IHB0aW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcmVzZXJ2ZXRpbWUgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBwcmVzZXJ2ZXRpbWUgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFByZXNlcnZlVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QdGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBkbyBub3QgY2hlY2tvdXQgZWxlbWVudCBhZnRlciBjcmVhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbyB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vQ2hlY2tvdXQoYm9vbGVhbiBjbykgeworICAgICAgICBtTm9jbyA9IGNvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBubyBjaGVja291dCBmbGFnIHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIG5vY28gZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE5vQ2hlY2tvdXQoKSB7CisgICAgICAgIHJldHVybiBtTm9jbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBjaGVja2luIHRoZSBlbGVtZW50IGFmdGVyIGNyZWF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2kgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2luKGJvb2xlYW4gY2kpIHsKKyAgICAgICAgbUNoZWNraW4gPSBjaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY2kgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBjaSBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2hlY2tpbigpIHsKKyAgICAgICAgcmV0dXJuIG1DaGVja2luOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGNoYW5nZXMgbWFzdGVyc2hpcCBvZiB0aGUgbWFpbiBicmFuY2gKKyAgICAgKiB0byB0aGUgY3VycmVudCBzaXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFzdGVyIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFzdGVyKGJvb2xlYW4gbWFzdGVyKSB7CisgICAgICAgIG1NYXN0ZXIgPSBtYXN0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1hc3RlciBmbGFnIHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIG1hc3RlciBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TWFzdGVyKCkgeworICAgICAgICByZXR1cm4gbU1hc3RlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGVsZW1lbnQgdHlwZSB0byB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWx0eXBlIHRvIGNyZWF0ZSBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWx0eXBlKFN0cmluZyBlbHR5cGUpIHsKKyAgICAgICAgbUVsdHlwZSA9IGVsdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZWxlbWVudCB0eXBlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBlbGVtZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVsdHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1FbHR5cGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlICdjb21tZW50JyBjb21tYW5kCisgICAgICoKKyAgICAgKiBAcGFyYW0gY21kIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBzdHJpbmcgd2l0aCBvcgorICAgICAqICAgICAgICAgICAgd2l0aG91dCB0aGUgY29tbWVudCBmbGFnIGFuZCBzdHJpbmcgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudGZpbGUnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yCisgICAgICogICAgICAgICAgICB3aXRob3V0IHRoZSBjb21tZW50ZmlsZSBmbGFnIGFuZCBmaWxlIGFwcGVuZGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldENvbW1lbnRGaWxlQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgaWYgKGdldENvbW1lbnRGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVEZJTEUpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudEZpbGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlICdlbGVtZW50IHR5cGUnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yCisgICAgICogICAgICAgICAgICB3aXRob3V0IHRoZSBjb21tZW50IGZsYWcgYW5kIHN0cmluZyBhcHBlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRFbHR5cGVDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0RWx0eXBlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfRUxUWVBFKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldEVsdHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOworICAgIC8qKgorICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOworICAgIC8qKgorICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKKyAgICAvKioKKyAgICAgKiAtbndhcm4gZmxhZyAtLSBzdXBwcmVzc2VzIHdhcm5pbmcgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PV0FSTiA9ICItbndhcm4iOworICAgIC8qKgorICAgICAqIC1wdGltZSBmbGFnIC0tIHByZXNlcnZlcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb24gY2hlY2tpbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUFJFU0VSVkVUSU1FID0gIi1wdGltZSI7CisgICAgLyoqCisgICAgICogLW5jbyBmbGFnIC0tIGRvIG5vdCBjaGVja291dCBlbGVtZW50IGFmdGVyIGNyZWF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NIRUNLT1VUID0gIi1uY28iOworICAgIC8qKgorICAgICAqIC1jaSBmbGFnIC0tIGNoZWNraW4gZWxlbWVudCBhZnRlciBjcmVhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ0hFQ0tJTiA9ICItY2kiOworICAgIC8qKgorICAgICAqIC1tYXN0ZXIgZmxhZyAtLSBjaGFuZ2UgbWFzdGVyc2hpcCBvZiBtYWluIGJyYW5jaCB0byBjdXJyZW50IHNpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX01BU1RFUiA9ICItbWFzdGVyIjsKKyAgICAvKioKKyAgICAgKiAtZWx0eXBlIGZsYWcgLS0gZWxlbWVudCB0eXBlIHRvIHVzZSBkdXJpbmcgY3JlYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0VMVFlQRSA9ICItZWx0eXBlIjsKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtsYWJlbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtsYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZDI4OGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2xhYmVsLmphdmEKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogVGFzayB0byBwZXJmb3JtIG1rbGFiZWwgY29tbWFuZCB0byBDbGVhckNhc2UuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6CisgKiA8dGFibGUgYm9yZGVyPSIxIj4KKyAqICAgPHRyPgorICogICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICogICAgIDx0aD5WYWx1ZXM8L3RoPgorICogICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPnZpZXdwYXRoPC90ZD4KKyAqICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5yZXBsYWNlPC90ZD4KKyAqICAgICAgPHRkPlJlcGxhY2UgYSBsYWJlbCBvZiB0aGUgc2FtZSB0eXBlIG9uIHRoZSBzYW1lIGJyYW5jaDwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+cmVjdXJzZTwvdGQ+CisgKiAgICAgIDx0ZD5Qcm9jZXNzIGVhY2ggc3ViZGlyZWN0b3J5IHVuZGVyIHZpZXdwYXRoPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAqICAgICAgPHRkPklkZW50aWZ5IGEgc3BlY2lmaWMgdmVyc2lvbiB0byBhdHRhY2ggdGhlIGxhYmVsIHRvPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD50eXBlbmFtZTwvdGQ+CisgKiAgICAgIDx0ZD5OYW1lIG9mIHRoZSBsYWJlbCB0eXBlPC90ZD4KKyAqICAgICAgPHRkPlllczwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+dm9iPC90ZD4KKyAqICAgICAgPHRkPk5hbWUgb2YgdGhlIFZPQjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAqICAgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogPC90YWJsZT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDQ01rbGFiZWwgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwbGFjZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVjdXJzZSA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIG1WZXJzaW9uID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBtVHlwZU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1WT0IgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1Db21tZW50ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBtQ2ZpbGUgPSBudWxsOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICogPHA+CisgICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2xlYXJ0b29sIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCisgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgYXR0cmlidXRlcworICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlcXVpcmVkIGF0dHJpYnV0ZSBUeXBlTmFtZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWZhdWx0IHRoZSB2aWV3cGF0aCB0byBiYXNlZGlyIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKKyAgICAgICAgaWYgKGdldFZpZXdQYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Vmlld1BhdGgoYVByb2ouZ2V0QmFzZURpcigpLmdldFBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QuIHRoZSBmb3JtYXQgaXMKKyAgICAgICAgLy8gY2xlYXJ0b29sIG1rbGFiZWwgW29wdGlvbnMuLi5dIFt2aWV3cGF0aCAuLi5dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDbGVhclRvb2xDb21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfTUtMQUJFTCk7CisKKyAgICAgICAgY2hlY2tPcHRpb25zKGNvbW1hbmRMaW5lKTsKKworICAgICAgICBpZiAoIWdldEZhaWxPbkVycigpKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJJZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0Vmlld1BhdGhCYXNlbmFtZSgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOworICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrT3B0aW9ucyhDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgaWYgKGdldFJlcGxhY2UoKSkgeworICAgICAgICAgICAgLy8gLXJlcGxhY2UKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUkVQTEFDRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0UmVjdXJzZSgpKSB7CisgICAgICAgICAgICAvLyAtcmVjdXJzZQorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRUNVUlNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRWZXJzaW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gLXZlcnNpb24KKyAgICAgICAgICAgIGdldFZlcnNpb25Db21tYW5kKGNtZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIC1jCisgICAgICAgICAgICBnZXRDb21tZW50Q29tbWFuZChjbWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGdldENvbW1lbnRGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIC1jZmlsZQorICAgICAgICAgICAgICAgIGdldENvbW1lbnRGaWxlQ29tbWFuZChjbWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PQ09NTUVOVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB0eXBlCisgICAgICAgICAgICBnZXRUeXBlQ29tbWFuZChjbWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmlld3BhdGgKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Vmlld1BhdGgoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcGxhY2UgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIHJlcGxhY2UgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlKGJvb2xlYW4gcmVwbGFjZSkgeworICAgICAgICBtUmVwbGFjZSA9IHJlcGxhY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHJlcGxhY2UgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiByZXBsYWNlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXBsYWNlKCkgeworICAgICAgICByZXR1cm4gbVJlcGxhY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHJlY3Vyc2UgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIHJlY3Vyc2UgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWN1cnNlKGJvb2xlYW4gcmVjdXJzZSkgeworICAgICAgICBtUmVjdXJzZSA9IHJlY3Vyc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHJlY3Vyc2UgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiByZWN1cnNlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZWN1cnNlKCkgeworICAgICAgICByZXR1cm4gbVJlY3Vyc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2ZXJzaW9uIGZsYWcKKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworICAgICAgICBtVmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHZlcnNpb24gZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiB2ZXJzaW9uIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBtVmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgY29tbWVudCBzdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgbUNvbW1lbnQgPSBjb21tZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb21tZW50IHN0cmluZworICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgY29tbWVudAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db21tZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBjb21tZW50IGZpbGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBjZmlsZSB0aGUgcGF0aCB0byB0aGUgY29tbWVudCBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudEZpbGUoU3RyaW5nIGNmaWxlKSB7CisgICAgICAgIG1DZmlsZSA9IGNmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb21tZW50IGZpbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudEZpbGUoKSB7CisgICAgICAgIHJldHVybiBtQ2ZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0eXBlLW5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSB0biB0aGUgdHlwZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIHRuKSB7CisgICAgICAgIG1UeXBlTmFtZSA9IHRuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0eXBlLW5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdHlwZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UeXBlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFZPQiBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gdm9iIHRoZSBWT0IgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZPQihTdHJpbmcgdm9iKSB7CisgICAgICAgIG1WT0IgPSB2b2I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IFZPQiBuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIFZPQiBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWT0IoKSB7CisgICAgICAgIHJldHVybiBtVk9COworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSAndmVyc2lvbicgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBDb21tYW5kTGluZSBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgdmVyc2lvbiBmbGFnIGFuZCBzdHJpbmcgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0VmVyc2lvbkNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRWZXJzaW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVkVSU0lPTik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWZXJzaW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgKiAgICAgICAgd2l0aG91dCB0aGUgY29tbWVudCBmbGFnIGFuZCBzdHJpbmcgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudGZpbGUnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgICAgICAgICBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgY29tbWVudGZpbGUgZmxhZyBhbmQgZmlsZSBhcHBlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRDb21tZW50RmlsZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlRGSUxFKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnRGaWxlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0eXBlLW5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yCisgICAgICogICAgICAgIHdpdGhvdXQgdGhlIHR5cGUtbmFtZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRUeXBlQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgU3RyaW5nIHR5cGVubSA9IG51bGw7CisKKyAgICAgICAgaWYgKGdldFR5cGVOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdHlwZW5tID0gZ2V0VHlwZU5hbWUoKTsKKyAgICAgICAgICAgIGlmIChnZXRWT0IoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHlwZW5tICs9ICJAIiArIGdldFZPQigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodHlwZW5tKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogLXJlcGxhY2UgZmxhZyAtLSByZXBsYWNlIGFub3RoZXIgbGFiZWwgb2YgdGhlIHNhbWUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVQTEFDRSA9ICItcmVwbGFjZSI7CisgICAgLyoqCisgICAgICogLXJlY3Vyc2UgZmxhZyAtLSBwcm9jZXNzIGFsbCBzdWJkaXJlY3RvcmllcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVDVVJTRSA9ICItcmVjdXJzZSI7CisgICAgLyoqCisgICAgICogLXZlcnNpb24gZmxhZyAtLSBhdHRhY2ggbGFiZWwgdG8gc3BlY2lmaWVkIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1ZFUlNJT04gPSAiLXZlcnNpb24iOworICAgIC8qKgorICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOworICAgIC8qKgorICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOworICAgIC8qKgorICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2xidHlwZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtsYnR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI3MTkyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtsYnR5cGUuamF2YQpAQCAtMCwwICsxLDQ0MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBUYXNrIHRvIHBlcmZvcm0gbWtsYnR5cGUgY29tbWFuZCB0byBDbGVhckNhc2UuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6CisgKiA8dGFibGUgYm9yZGVyPSIxIj4KKyAqICAgPHRyPgorICogICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICogICAgIDx0aD5WYWx1ZXM8L3RoPgorICogICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPnR5cGVuYW1lPC90ZD4KKyAqICAgICAgPHRkPk5hbWUgb2YgdGhlIGxhYmVsIHR5cGUgdG8gY3JlYXRlPC90ZD4KKyAqICAgICAgPHRkPlllczwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+dm9iPC90ZD4KKyAqICAgICAgPHRkPk5hbWUgb2YgdGhlIFZPQjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+cmVwbGFjZTwvdGQ+CisgKiAgICAgIDx0ZD5SZXBsYWNlIGFuIGV4aXN0aW5nIGxhYmVsIGRlZmluaXRpb24gb2YgdGhlIHNhbWUgdHlwZTwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+Z2xvYmFsPC90ZD4KKyAqICAgICAgPHRkPkVpdGhlciBnbG9iYWwgb3Igb3JkaW5hcnkgY2FuIGJlIHNwZWNpZmllZCwgbm90IGJvdGguCisgKiAgICAgICAgICBDcmVhdGVzIGEgbGFiZWwgdHlwZSB0aGF0IGlzIGdsb2JhbCB0byB0aGUgVk9CIG9yIHRvCisgKiAgICAgICAgICBWT0JzIHRoYXQgdXNlIHRoaXMgVk9CPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5vcmRpbmFyeTwvdGQ+CisgKiAgICAgIDx0ZD5FaXRoZXIgZ2xvYmFsIG9yIG9yZGluYXJ5IGNhbiBiZSBzcGVjaWZpZWQsIG5vdCBib3RoLgorICogICAgICAgICAgQ3JlYXRlcyBhIGxhYmVsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCBvbmx5IGluIHRoZSBjdXJyZW50CisgKiAgICAgICAgICBWT0IuIDxCPkRlZmF1bHQ8L0I+PC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5wYnJhbmNoPC90ZD4KKyAqICAgICAgPHRkPkFsbG93cyB0aGUgbGFiZWwgdHlwZSB0byBiZSB1c2VkIG9uY2UgcGVyIGJyYW5jaCBpbiBhIGdpdmVuCisgKiAgICAgICAgICBlbGVtZW50J3MgdmVyc2lvbiB0cmVlPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5zaGFyZWQ8L3RkPgorICogICAgICA8dGQ+U2V0cyB0aGUgd2F5IG1hc3RlcnNoaXAgaXMgY2hlY2tlZCBieSBDbGVhckNhc2UuIFNlZSBDbGVhckNhc2UKKyAqICAgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHM8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICogICAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvcgorICogICAgICAgICAgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICogICAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWU8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiA8L3RhYmxlPgorICoKKyAqLworcHVibGljIGNsYXNzIENDTWtsYnR5cGUgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIHByaXZhdGUgU3RyaW5nIG1UeXBlTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVZPQiA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1lbnQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1DZmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXBsYWNlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1HbG9iYWwgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU9yZGluYXJ5ID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBicmFuY2ggPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNoYXJlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICogPHA+CisgICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2xlYXJ0b29sIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCisgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgYXR0cmlidXRlcworICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlcXVpcmVkIGF0dHJpYnV0ZSBUeXBlTmFtZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QuIHRoZSBmb3JtYXQgaXMKKyAgICAgICAgLy8gY2xlYXJ0b29sIG1rbGJ0eXBlIFtvcHRpb25zLi4uXSB0eXBlLXNlbGVjdG9yLi4uCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRDbGVhclRvb2xDb21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfTUtMQlRZUEUpOworCisgICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7CisKKyAgICAgICAgaWYgKCFnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIGdldFR5cGVTcGVjaWZpZXIoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRSZXBsYWNlKCkpIHsKKyAgICAgICAgICAgIC8vIC1yZXBsYWNlCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1JFUExBQ0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldE9yZGluYXJ5KCkpIHsKKyAgICAgICAgICAgIC8vIC1vcmRpbmFyeQorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19PUkRJTkFSWSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0R2xvYmFsKCkpIHsKKyAgICAgICAgICAgICAgICAvLyAtZ2xvYmFsCisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19HTE9CQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldFBicmFuY2goKSkgeworICAgICAgICAgICAgLy8gLXBicmFuY2gKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUEJSQU5DSCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0U2hhcmVkKCkpIHsKKyAgICAgICAgICAgIC8vIC1zaGFyZWQKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfU0hBUkVEKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gLWMKKyAgICAgICAgICAgIGdldENvbW1lbnRDb21tYW5kKGNtZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gLWNmaWxlCisgICAgICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHR5cGUtbmFtZUB2b2IKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0VHlwZVNwZWNpZmllcigpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0eXBlLW5hbWUgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG4gdGhlIHR5cGUtbmFtZSBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgdG4pIHsKKyAgICAgICAgbVR5cGVOYW1lID0gdG47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHR5cGUtbmFtZSBzdHJpbmcKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHR5cGUtbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBtVHlwZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBWT0IgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIHZvYiB0aGUgVk9CIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWT0IoU3RyaW5nIHZvYikgeworICAgICAgICBtVk9CID0gdm9iOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBWT0IgbmFtZQorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyBWT0IgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vk9CKCkgeworICAgICAgICByZXR1cm4gbVZPQjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcGxhY2UgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIHJlcGwgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlKGJvb2xlYW4gcmVwbCkgeworICAgICAgICBtUmVwbGFjZSA9IHJlcGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHJlcGxhY2UgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiByZXBsYWNlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXBsYWNlKCkgeworICAgICAgICByZXR1cm4gbVJlcGxhY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnbG9iYWwgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIGdsb2IgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHbG9iYWwoYm9vbGVhbiBnbG9iKSB7CisgICAgICAgIG1HbG9iYWwgPSBnbG9iOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBnbG9iYWwgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBnbG9iYWwgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEdsb2JhbCgpIHsKKyAgICAgICAgcmV0dXJuIG1HbG9iYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcmRpbmFyeSBmbGFnCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JkaW5hcnkgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRpbmFyeShib29sZWFuIG9yZGluYXJ5KSB7CisgICAgICAgIG1PcmRpbmFyeSA9IG9yZGluYXJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBvcmRpbmFyeSBmbGFnIHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIG9yZGluYXJ5IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcmRpbmFyeSgpIHsKKyAgICAgICAgcmV0dXJuIG1PcmRpbmFyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBicmFuY2ggZmxhZworICAgICAqCisgICAgICogQHBhcmFtIHBicmFuY2ggdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYnJhbmNoKGJvb2xlYW4gcGJyYW5jaCkgeworICAgICAgICBtUGJyYW5jaCA9IHBicmFuY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHBicmFuY2ggZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBwYnJhbmNoIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQYnJhbmNoKCkgeworICAgICAgICByZXR1cm4gbVBicmFuY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzaGFyZWQgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIHNoYXJlZCB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNoYXJlZChib29sZWFuIHNoYXJlZCkgeworICAgICAgICBtU2hhcmVkID0gc2hhcmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBzaGFyZWQgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBzaGFyZWQgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFNoYXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TaGFyZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGNvbW1lbnQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCB0aGUgY29tbWVudCBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIG1Db21tZW50ID0gY29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tbWVudCBzdHJpbmcKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBtQ29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgY29tbWVudCBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ZpbGUgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRGaWxlKFN0cmluZyBjZmlsZSkgeworICAgICAgICBtQ2ZpbGUgPSBjZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tbWVudCBmaWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBjb21tZW50IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRGaWxlKCkgeworICAgICAgICByZXR1cm4gbUNmaWxlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgKiAgICAgICAgd2l0aG91dCB0aGUgY29tbWVudCBmbGFnIGFuZCBzdHJpbmcgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudGZpbGUnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yCisgICAgICogICAgICAgIHdpdGhvdXQgdGhlIGNvbW1lbnRmaWxlIGZsYWcgYW5kIGZpbGUgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudEZpbGVDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKKyAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCisgICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19DT01NRU5URklMRSk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50RmlsZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdHlwZS1uYW1lIHNwZWNpZmllcgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgJ3R5cGUtbmFtZS1zcGVjaWZpZXInIGNvbW1hbmQgaWYgdGhlIGF0dHJpYnV0ZSB3YXMKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFR5cGVTcGVjaWZpZXIoKSB7CisgICAgICAgIFN0cmluZyB0eXBlbm0gPSBudWxsOworCisgICAgICAgIHR5cGVubSA9IGdldFR5cGVOYW1lKCk7CisgICAgICAgIGlmIChnZXRWT0IoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0eXBlbm0gKz0gIkAiICsgZ2V0Vk9CKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHlwZW5tOworICAgIH0KKworCisgICAgLyoqCisgICAgICogLXJlcGxhY2UgZmxhZyAtLSByZXBsYWNlIGV4aXN0aW5nIGxhYmVsIGRlZmluaXRpb24gb2YgdGhlIHNhbWUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVQTEFDRSA9ICItcmVwbGFjZSI7CisgICAgLyoqCisgICAgICogLWdsb2JhbCBmbGFnIC0tIGNyZWF0ZXMgYSBsYWJlbCB0eXBlIHRoYXQgaXMgZ2xvYmFsIHRvIHRoZSBWT0Igb3IgdG8gVk9CcyB0aGF0IHVzZSB0aGlzIFZPQgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfR0xPQkFMID0gIi1nbG9iYWwiOworICAgIC8qKgorICAgICAqIC1vcmRpbmFyeSBmbGFnIC0tIGNyZWF0ZXMgYSBsYWJlbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgb25seSBpbiB0aGUgY3VycmVudCBWT0IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX09SRElOQVJZID0gIi1vcmRpbmFyeSI7CisgICAgLyoqCisgICAgICogLXBicmFuY2ggZmxhZyAtLSBhbGxvd3MgbGFiZWwgdHlwZSB0byBiZSB1c2VkIG9uY2UgcGVyIGJyYW5jaAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUEJSQU5DSCA9ICItcGJyYW5jaCI7CisgICAgLyoqCisgICAgICogLXNoYXJlZCBmbGFnIC0tIHNldHMgdGhlIHdheSBtYXN0ZXJzaGlwIGlzIGNoZWNrZWQgYnkgQ2xlYXJDYXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19TSEFSRUQgPSAiLXNoYXJlZCI7CisgICAgLyoqCisgICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7CisgICAgLyoqCisgICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7CisgICAgLyoqCisgICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOworCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1JtdHlwZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDUm10eXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmMGMzYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1JtdHlwZS5qYXZhCkBAIC0wLDAgKzEsMzczIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisvKioKKyAqIFRhc2sgdG8gcGVyZm9ybSBybXR5cGUgY29tbWFuZCB0byBDbGVhckNhc2UuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6CisgKiA8dGFibGUgYm9yZGVyPSIxIj4KKyAqICAgPHRyPgorICogICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICogICAgIDx0aD5WYWx1ZXM8L3RoPgorICogICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPnR5cGVraW5kPC90ZD4KKyAqICAgICAgPHRkPlRoZSBraW5kIG9mIHR5cGUgdG8gY3JlYXRlLiBWYWxpZCB0eXBlcyBhcmU6PGJyPgorICogICAgICAgICAgICAgIGF0dHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgdHlwZTxicj4KKyAqICAgICAgICAgICAgICBicnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoIHR5cGU8YnI+CisgKiAgICAgICAgICAgICAgZWx0eXBlICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgdHlwZTxicj4KKyAqICAgICAgICAgICAgICBobHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgaHlwZXJsaW5rIHR5cGU8YnI+CisgKiAgICAgICAgICAgICAgbGJ0eXBlICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsIHR5cGU8YnI+CisgKiAgICAgICAgICAgICAgdHJ0eXBlICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgdHlwZTxicj4KKyAqICAgICAgPC90ZD4KKyAqICAgICAgPHRkPlllczwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+dHlwZW5hbWU8L3RkPgorICogICAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIHR5cGUgdG8gcmVtb3ZlPC90ZD4KKyAqICAgICAgPHRkPlllczwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+dm9iPC90ZD4KKyAqICAgICAgPHRkPk5hbWUgb2YgdGhlIFZPQjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+aWdub3JlPC90ZD4KKyAqICAgICAgPHRkPlVzZWQgd2l0aCB0cmlnZ2VyIHR5cGVzIG9ubHkuIEZvcmNlcyByZW1vdmFsIG9mIHRyaWdnZXIgdHlwZQorICogICAgICAgICAgZXZlbiBpZiBhIHByZS1vcGVyYXRpb24gdHJpZ2dlciB3b3VsZCBwcmV2ZW50IGl0cyByZW1vdmFsPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5ybWFsbDwvdGQ+CisgKiAgICAgIDx0ZD5SZW1vdmVzIGFsbCBpbnN0YW5jZXMgb2YgYSB0eXBlIGFuZCB0aGUgdHlwZSBvYmplY3QgaXRzZWxmPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5jb21tZW50PC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+Y29tbWVudGZpbGU8L3RkPgorICogICAgICA8dGQ+U3BlY2lmeSBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUKKyAqICAgICAgICAgIG1heSBiZSB1c2VkLjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAqICAgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogPC90YWJsZT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDQ1JtdHlwZSBleHRlbmRzIENsZWFyQ2FzZSB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVR5cGVLaW5kID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBtVHlwZU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1WT0IgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIG1Db21tZW50ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBtQ2ZpbGUgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBtUm1hbGwgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlnbm9yZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICogPHA+CisgICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgY2xlYXJ0b29sIGFuZCB0aGVuIGNhbGxzIEV4ZWMncyBydW4gbWV0aG9kCisgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgYXR0cmlidXRlcworICAgICAgICBpZiAoZ2V0VHlwZUtpbmQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlcXVpcmVkIGF0dHJpYnV0ZSBUeXBlS2luZCBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldFR5cGVOYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXF1aXJlZCBhdHRyaWJ1dGUgVHlwZU5hbWUgbm90IHNwZWNpZmllZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290LiB0aGUgZm9ybWF0IGlzCisgICAgICAgIC8vIGNsZWFydG9vbCBybXR5cGUgW29wdGlvbnMuLi5dIHR5cGUtc2VsZWN0b3IuLi4KKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBDTEVBUlRPT0wgaGVscAorICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldENsZWFyVG9vbENvbW1hbmQoKSk7CisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ09NTUFORF9STVRZUEUpOworCisgICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7CisKKyAgICAgICAgaWYgKCFnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIGdldFR5cGVTcGVjaWZpZXIoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRJZ25vcmUoKSkgeworICAgICAgICAgICAgLy8gLWlnbm9yZQorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19JR05PUkUpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRSbUFsbCgpKSB7CisgICAgICAgICAgICAvLyAtcm1hbGwgLWZvcmNlCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1JNQUxMKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfRk9SQ0UpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gLWMKKyAgICAgICAgICAgIGdldENvbW1lbnRDb21tYW5kKGNtZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gLWNmaWxlCisgICAgICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHR5cGUta2luZDp0eXBlLW5hbWUKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0VHlwZVNwZWNpZmllcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGlnbm9yZSBmbGFnCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWdub3JlIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlKGJvb2xlYW4gaWdub3JlKSB7CisgICAgICAgIG1JZ25vcmUgPSBpZ25vcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGlnbm9yZSBmbGFnIHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIGlnbm9yZSBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlKCkgeworICAgICAgICByZXR1cm4gbUlnbm9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcm1hbGwgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIHJtYWxsIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um1BbGwoYm9vbGVhbiBybWFsbCkgeworICAgICAgICBtUm1hbGwgPSBybWFsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcm1hbGwgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBybWFsbCBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Um1BbGwoKSB7CisgICAgICAgIHJldHVybiBtUm1hbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGNvbW1lbnQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCB0aGUgY29tbWVudCBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIG1Db21tZW50ID0gY29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tbWVudCBzdHJpbmcKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7CisgICAgICAgIHJldHVybiBtQ29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgY29tbWVudCBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ZpbGUgdGhlIHBhdGggdG8gdGhlIGNvbW1lbnQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRGaWxlKFN0cmluZyBjZmlsZSkgeworICAgICAgICBtQ2ZpbGUgPSBjZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29tbWVudCBmaWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRoIHRvIHRoZSBjb21tZW50IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRGaWxlKCkgeworICAgICAgICByZXR1cm4gbUNmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0eXBlLWtpbmQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGsgdGhlIHR5cGUta2luZCBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlS2luZChTdHJpbmcgdGspIHsKKyAgICAgICAgbVR5cGVLaW5kID0gdGs7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHR5cGUta2luZCBzdHJpbmcKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIHR5cGUta2luZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUtpbmQoKSB7CisgICAgICAgIHJldHVybiBtVHlwZUtpbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHR5cGUtbmFtZSBzdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSB0biB0aGUgdHlwZS1uYW1lIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyB0bikgeworICAgICAgICBtVHlwZU5hbWUgPSB0bjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdHlwZS1uYW1lIHN0cmluZworICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgdHlwZS1uYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UeXBlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFZPQiBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gdm9iIHRoZSBWT0IgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZPQihTdHJpbmcgdm9iKSB7CisgICAgICAgIG1WT0IgPSB2b2I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IFZPQiBuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIFZPQiBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWT0IoKSB7CisgICAgICAgIHJldHVybiBtVk9COworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgJ3R5cGUtc3BlY2lmaWVyJyBzdHJpbmcKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlICd0eXBlLWtpbmQ6dHlwZS1uYW1lQHZvYicgc3BlY2lmaWVyCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRUeXBlU3BlY2lmaWVyKCkgeworICAgICAgICBTdHJpbmcgdGtpbmQgPSBnZXRUeXBlS2luZCgpOworICAgICAgICBTdHJpbmcgdG5hbWUgPSBnZXRUeXBlTmFtZSgpOworICAgICAgICBTdHJpbmcgdHlwZVNwZWMgPSBudWxsOworCisgICAgICAgIC8vIFJldHVybiB0aGUgdHlwZS1zZWxlY3RvcgorICAgICAgICB0eXBlU3BlYyA9IHRraW5kICsgIjoiICsgdG5hbWU7CisgICAgICAgIGlmIChnZXRWT0IoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0eXBlU3BlYyArPSAiQCIgKyBnZXRWT0IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZVNwZWM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3IKKyAgICAgKiAgICAgICAgd2l0aG91dCB0aGUgY29tbWVudCBmbGFnIGFuZCBzdHJpbmcgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudGZpbGUnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yCisgICAgICogICAgICAgIHdpdGhvdXQgdGhlIGNvbW1lbnRmaWxlIGZsYWcgYW5kIGZpbGUgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudEZpbGVDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKKyAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCisgICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19DT01NRU5URklMRSk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50RmlsZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogLWlnbm9yZSBmbGFnIC0tIGlnbm9yZSBwcmUtdHJpZ2dlciBvcGVyYXRpb25zIHdoZW4gcmVtb3ZpbmcgYSB0cmlnZ2VyIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0lHTk9SRSA9ICItaWdub3JlIjsKKyAgICAvKioKKyAgICAgKiAtcm1hbGwgZmxhZyAtLSByZW1vdmVzIGFsbCBpbnN0YW5jZXMgb2YgYSB0eXBlIGFuZCB0aGUgdHlwZSBvYmplY3QgaXRzZWxmCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19STUFMTCA9ICItcm1hbGwiOworICAgIC8qKgorICAgICAqIC1mb3JjZSBmbGFnIC0tIHN1cHByZXNzZXMgY29uZmlybWF0aW9uIHByb21wdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0ZPUkNFID0gIi1mb3JjZSI7CisgICAgLyoqCisgICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7CisgICAgLyoqCisgICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7CisgICAgLyoqCisgICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOworCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VuQ2hlY2tvdXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VuQ2hlY2tvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzAwZTFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDVW5DaGVja291dC5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisvKioKKyAqIFBlcmZvcm1zIENsZWFyQ2FzZSBVbkNoZWNrb3V0IGNvbW1hbmQuCisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgorICogPHRhYmxlIGJvcmRlcj0iMSI+CisgKiAgIDx0cj4KKyAqICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAqICAgICA8dGg+VmFsdWVzPC90aD4KKyAqICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgKiAgICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+a2VlcGNvcHk8L3RkPgorICogICAgICA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8ga2VlcCBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbiBvciBub3Q8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmZhaWxvbmVycjwvdGQ+CisgKiAgICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqIDwvdGFibGU+CisgKgorICovCitwdWJsaWMgY2xhc3MgQ0NVbkNoZWNrb3V0IGV4dGVuZHMgQ2xlYXJDYXNlIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUtlZXAgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgorICAgICAqIDxwPgorICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGNsZWFydG9vbCBhbmQgdGhlbiBjYWxscyBFeGVjJ3MgcnVuIG1ldGhvZAorICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzIGFuZCBmYWlsb25lcnIgaXMgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgICAgLy8gRGVmYXVsdCB0aGUgdmlld3BhdGggdG8gYmFzZWRpciBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgIGlmIChnZXRWaWV3UGF0aCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldFZpZXdQYXRoKGFQcm9qLmdldEJhc2VEaXIoKS5nZXRQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQgaXMKKyAgICAgICAgLy8gY2xlYXJ0b29sIHVuY2hlY2tvdXQgW29wdGlvbnMuLi5dIFt2aWV3cGF0aCAuLi5dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MLkVYRSBoZWxwCisgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0Q2xlYXJUb29sQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX1VOQ0hFQ0tPVVQpOworCisgICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7CisKKyAgICAgICAgaWYgKCFnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIGdldFZpZXdQYXRoQmFzZW5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIC8vIENsZWFyQ2FzZSBpdGVtcworICAgICAgICBpZiAoZ2V0S2VlcENvcHkoKSkgeworICAgICAgICAgICAgLy8gLWtlZXAKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfS0VFUENPUFkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gLXJtCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1JNKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZpZXdwYXRoCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZpZXdQYXRoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGtlZXAgYSBjb3B5IG9mIHRoZSBmaWxlIHdpdGggYSAua2VlcCBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2VlcCB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBDb3B5KGJvb2xlYW4ga2VlcCkgeworICAgICAgICBtS2VlcCA9IGtlZXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGtlZXBjb3B5IGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2Yga2VlcCBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0S2VlcENvcHkoKSB7CisgICAgICAgIHJldHVybiBtS2VlcDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAta2VlcCBmbGFnIC0tIGtlZXAgYSBjb3B5IG9mIHRoZSBmaWxlIHdpdGggLmtlZXAgZXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19LRUVQQ09QWSA9ICIta2VlcCI7CisgICAgLyoqCisgICAgICogIC1ybSBmbGFnIC0tIHJlbW92ZSB0aGUgY29weSBvZiB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUk0gPSAiLXJtIjsKKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVbmxvY2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VubG9jay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTNlODkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVbmxvY2suamF2YQpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBUT0RPOgorICogY29tbWVudCBmaWVsZCBkb2Vzbid0IGluY2x1ZGUgYWxsIG9wdGlvbnMgeWV0CisgKi8KKworLyoqCisgKiBQZXJmb3JtcyBhIENsZWFyQ2FzZSBVbmxvY2sgY29tbWFuZC4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6CisgKiA8dGFibGUgYm9yZGVyPSIxIj4KKyAqICAgPHRyPgorICogICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICogICAgIDx0aD5WYWx1ZXM8L3RoPgorICogICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICogICAgICA8dGQ+U3BlY2lmaWVzIGhvdyB0byBwb3B1bGF0ZSBjb21tZW50cyBmaWVsZHM8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPnBuYW1lPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZmllcyB0aGUgb2JqZWN0IHBhdGhuYW1lIHRvIGJlIHVubG9ja2VkLjwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPm9ianNlbGVjdDwvdGQ+CisgKiAgICAgIDx0ZD5UaGlzIHZhcmlhYmxlIGlzIG9ic29sZXRlLiBTaG91bGQgdXNlIDxpPm9ianNlbDwvaT4gaW5zdGVhZC48L3RkPgorICogICAgICA8dGQ+bm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPm9ianNlbDwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG9iamVjdChzKSB0byBiZSB1bmxvY2tlZC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmZhaWxvbmVycjwvdGQ+CisgKiAgICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqCisgKiA8L3RhYmxlPgorICoKKyAqLworcHVibGljIGNsYXNzIENDVW5sb2NrIGV4dGVuZHMgQ2xlYXJDYXNlIHsKKyAgICBwcml2YXRlIFN0cmluZyBtQ29tbWVudCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVBuYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgorICAgICAqIDxwPgorICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIGNsZWFydG9vbCBhbmQgdGhlbiBjYWxscyBFeGVjJ3MgcnVuIG1ldGhvZAorICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzIGFuZCBmYWlsb25lcnIgaXMgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgICAgLy8gRGVmYXVsdCB0aGUgdmlld3BhdGggdG8gYmFzZWRpciBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgIGlmIChnZXRWaWV3UGF0aCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldFZpZXdQYXRoKGFQcm9qLmdldEJhc2VEaXIoKS5nZXRQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQgaXMKKyAgICAgICAgLy8gY2xlYXJ0b29sIGxvY2sgW29wdGlvbnMuLi5dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MLkVYRSBoZWxwCisgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0Q2xlYXJUb29sQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX1VOTE9DSyk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zCisgICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7CisKKyAgICAgICAgLy8gRm9yIGRlYnVnZ2luZworICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oY29tbWFuZExpbmUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgaWYgKCFnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIGdldE9wVHlwZSgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOworICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIC8vIENsZWFyQ2FzZSBpdGVtcworICAgICAgICBnZXRDb21tZW50Q29tbWFuZChjbWQpOworCisgICAgICAgIGlmIChnZXRPYmpTZWxlY3QoKSA9PSBudWxsICYmIGdldFBuYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTaG91bGQgc2VsZWN0IGVpdGhlciBhbiBlbGVtZW50ICIKKyAgICAgICAgICAgICsgIihwbmFtZSkgb3IgYW4gb2JqZWN0IChvYmpzZWxlY3QpIik7CisgICAgICAgIH0KKyAgICAgICAgZ2V0UG5hbWVDb21tYW5kKGNtZCk7CisgICAgICAgIC8vIG9iamVjdCBzZWxlY3RvcgorICAgICAgICBpZiAoZ2V0T2JqU2VsZWN0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0T2JqU2VsZWN0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgY29tbWVudHMgc2hvdWxkIGJlIHdyaXR0ZW4KKyAgICAgKiBmb3IgdGhlIGV2ZW50IHJlY29yZChzKQorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgY29tbWVudCBtZXRob2QgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICBtQ29tbWVudCA9IGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbW1lbnQgbWV0aG9kCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBkZXNpcmVkIGNvbW1lbnQgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gbUNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGF0aG5hbWUgdG8gYmUgbG9ja2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG5hbWUgcGF0aG5hbWUgdG8gYmUgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG5hbWUoU3RyaW5nIHBuYW1lKSB7CisgICAgICAgIG1QbmFtZSA9IHBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGF0aG5hbWUgdG8gYmUgbG9ja2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBwYXRobmFtZSB0byBiZSBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBuYW1lKCkgeworICAgICAgICByZXR1cm4gbVBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9iamVjdChzKSB0byBiZSBsb2NrZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmpzZWxlY3Qgb2JqZWN0cyB0byBiZSBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmpzZWxlY3QoU3RyaW5nIG9ianNlbGVjdCkgeworICAgICAgICBzZXRPYmpTZWxlY3Qob2Jqc2VsZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvYmplY3QocykgdG8gYmUgbG9ja2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2Jqc2VsIG9iamVjdHMgdG8gYmUgbG9ja2VkCisgICAgICogQHNpbmNlIGFudCAxLjYuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9ialNlbChTdHJpbmcgb2Jqc2VsKSB7CisgICAgICAgIHNldE9ialNlbGVjdChvYmpzZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbG9ja2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBvYmplY3RzIHRvIGJlIGxvY2tlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2Jqc2VsZWN0KCkgeworICAgICAgICByZXR1cm4gZ2V0T2JqU2VsZWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUgc3RyaW5nIHdpdGggb3Igd2l0aG91dCB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbW1lbnQgZmxhZyBhbmQgdmFsdWUgYXBwZW5kZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0Q29tbWVudENvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSAncG5hbWUnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yIHdpdGhvdXQgdGhlCisgICAgICogICAgICAgICAgICBwbmFtZSBmbGFnIGFuZCB2YWx1ZSBhcHBlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXRQbmFtZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRQbmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1BOQU1FKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFBuYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoaWNoIG9iamVjdC9wbmFtZSBpcyBiZWluZyBvcGVyYXRlZCBvbgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgb2JqZWN0L3BuYW1lIGJlaW5nIHdvcmtlZCBvbgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldE9wVHlwZSgpIHsKKworICAgICAgICBpZiAoZ2V0UG5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UG5hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRPYmpTZWxlY3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIC1jb21tZW50IGZsYWcgLS0gbWV0aG9kIHRvIHVzZSBmb3IgY29tbWVudGluZyBldmVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWNvbW1lbnQiOworICAgIC8qKgorICAgICAqIC1wbmFtZSBmbGFnIC0tIHBhdGhuYW1lIHRvIGxvY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BOQU1FID0gIi1wbmFtZSI7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VwZGF0ZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDVXBkYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyZWZkYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VwZGF0ZS5qYXZhCkBAIC0wLDAgKzEsMzMxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisvKioKKyAqIFBlcmZvcm1zIGEgQ2xlYXJDYXNlIFVwZGF0ZSBjb21tYW5kLgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXRlZDoKKyAqIDx0YWJsZSBib3JkZXI9IjEiPgorICogICA8dHI+CisgKiAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgKiAgICAgPHRoPlZhbHVlczwvdGg+CisgKiAgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+dmlld3BhdGg8L3RkPgorICogICAgICA8dGQ+UGF0aCB0byB0aGUgQ2xlYXJDYXNlIHZpZXcgZmlsZSBvciBkaXJlY3RvcnkgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb248L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmdyYXBoaWNhbDwvdGQ+CisgKiAgICAgIDx0ZD5EaXNwbGF5cyBhIGdyYXBoaWNhbCBkaWFsb2cgZHVyaW5nIHRoZSB1cGRhdGU8L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmxvZzwvdGQ+CisgKiAgICAgIDx0ZD5TcGVjaWZpZXMgYSBsb2cgZmlsZSBmb3IgQ2xlYXJDYXNlIHRvIHdyaXRlIHRvPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5vdmVyd3JpdGU8L3RkPgorICogICAgICA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gb3ZlcndyaXRlIGhpamFja2VkIGZpbGVzIG9yIG5vdDwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqICAgPHRyPgorICogICAgICA8dGQ+cmVuYW1lPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZmllcyB0aGF0IGhpamFja2VkIGZpbGVzIHNob3VsZCBiZSByZW5hbWVkIHdpdGggYSAua2VlcCBleHRlbnNpb248L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmN1cnJlbnR0aW1lPC90ZD4KKyAqICAgICAgPHRkPlNwZWNpZmllcyB0aGF0IG1vZGlmaWNhdGlvbiB0aW1lIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZSBjdXJyZW50CisgKiAgICAgICAgICB0aW1lLiBFaXRoZXIgY3VycmVudHRpbWUgb3IgcHJlc2VydmV0aW1lIGNhbiBiZSBzcGVjaWZpZWQuPC90ZD4KKyAqICAgICAgPHRkPk5vPC90ZD4KKyAqICAgPHRyPgorICogICA8dHI+CisgKiAgICAgIDx0ZD5wcmVzZXJ2ZXRpbWU8L3RkPgorICogICAgICA8dGQ+U3BlY2lmaWVzIHRoYXQgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIHByZXNlcnZlZCBmcm9tIHRoZSBWT0IKKyAqICAgICAgICAgIHRpbWUuIEVpdGhlciBjdXJyZW50dGltZSBvciBwcmVzZXJ2ZXRpbWUgY2FuIGJlIHNwZWNpZmllZC48L3RkPgorICogICAgICA8dGQ+Tm88L3RkPgorICogICA8dHI+CisgKiAgIDx0cj4KKyAqICAgICAgPHRkPmZhaWxvbmVycjwvdGQ+CisgKiAgICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgKiAgICAgIDx0ZD5ObzwvdGQ+CisgKiAgIDx0cj4KKyAqIDwvdGFibGU+CisgKgorICovCitwdWJsaWMgY2xhc3MgQ0NVcGRhdGUgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIHByaXZhdGUgYm9vbGVhbiBtR3JhcGhpY2FsID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1PdmVyd3JpdGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlbmFtZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtQ3RpbWUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVB0aW1lID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUxvZyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KKyAgICAgKiA8cD4KKyAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBjbGVhcnRvb2wgYW5kIHRoZW4gY2FsbHMgRXhlYydzIHJ1biBtZXRob2QKKyAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscyBhbmQgZmFpbG9uZXJyIGlzIHNldCB0byB0cnVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CisgICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIGludCByZXN1bHQgPSAwOworCisgICAgICAgIC8vIERlZmF1bHQgdGhlIHZpZXdwYXRoIHRvIGJhc2VkaXIgaWYgaXQgaXMgbm90IHNwZWNpZmllZAorICAgICAgICBpZiAoZ2V0Vmlld1BhdGgoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRWaWV3UGF0aChhUHJvai5nZXRCYXNlRGlyKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdCB0aGUgZm9ybWF0IGlzCisgICAgICAgIC8vIGNsZWFydG9vbCB1cGRhdGUgW29wdGlvbnMuLi5dIFt2aWV3cGF0aCAuLi5dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0xFQVJUT09MLkVYRSBoZWxwCisgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0Q2xlYXJUb29sQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX1VQREFURSk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zCisgICAgICAgIGNoZWNrT3B0aW9ucyhjb21tYW5kTGluZSk7CisKKyAgICAgICAgLy8gRm9yIGRlYnVnZ2luZworICAgICAgICBnZXRQcm9qZWN0KCkubG9nKGNvbW1hbmRMaW5lLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICBpZiAoIWdldEZhaWxPbkVycigpKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJJZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0Vmlld1BhdGhCYXNlbmFtZSgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOworICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIC8vIENsZWFyQ2FzZSBpdGVtcworICAgICAgICBpZiAoZ2V0R3JhcGhpY2FsKCkpIHsKKyAgICAgICAgICAgIC8vIC1ncmFwaGljYWwKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfR1JBUEhJQ0FMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRPdmVyd3JpdGUoKSkgeworICAgICAgICAgICAgICAgIC8vIC1vdmVyd3JpdGUKKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX09WRVJXUklURSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChnZXRSZW5hbWUoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyAtcmVuYW1lCisgICAgICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUkVOQU1FKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyAtbm92ZXJ3cml0ZQorICAgICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PVkVSV1JJVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRUaW1lKCkpIHsKKyAgICAgICAgICAgICAgICAvLyAtY3RpbWUKKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NVUlJFTlRUSU1FKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGdldFByZXNlcnZlVGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIC1wdGltZQorICAgICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1BSRVNFUlZFVElNRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAtbG9nIGxvZ25hbWUKKyAgICAgICAgICAgIGdldExvZ0NvbW1hbmQoY21kKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZpZXdwYXRoCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZpZXdQYXRoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGRpc3BsYXlzIGEgZ3JhcGhpY2FsIGRpYWxvZyBkdXJpbmcgdGhlIHVwZGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncmFwaGljYWwgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHcmFwaGljYWwoYm9vbGVhbiBncmFwaGljYWwpIHsKKyAgICAgICAgbUdyYXBoaWNhbCA9IGdyYXBoaWNhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZ3JhcGhpY2FsIGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgZ3JhcGhpY2FsIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRHcmFwaGljYWwoKSB7CisgICAgICAgIHJldHVybiBtR3JhcGhpY2FsOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIG92ZXJ3cml0ZSBoaWphY2tlZCBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdyB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZShib29sZWFuIG93KSB7CisgICAgICAgIG1PdmVyd3JpdGUgPSBvdzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgb3ZlcndyaXRlIGhpamFja2VkIGZpbGVzIHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIG92ZXJ3cml0ZSBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3ZlcndyaXRlKCkgeworICAgICAgICByZXR1cm4gbU92ZXJ3cml0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBoaWphY2tlZCBmaWxlcyBhcmUgcmVuYW1lZCB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlbiB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbmFtZShib29sZWFuIHJlbikgeworICAgICAgICBtUmVuYW1lID0gcmVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCByZW5hbWUgaGlqYWNrZWQgZmlsZXMgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgcmVuYW1lIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZW5hbWUoKSB7CisgICAgICAgIHJldHVybiBtUmVuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIG1vZGlmaWNhdGlvbiB0aW1lIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZSBjdXJyZW50IHRpbWUuCisgICAgICogRWl0aGVyIGN1cnJlbnR0aW1lIG9yIHByZXNlcnZldGltZSBjYW4gYmUgc3BlY2lmaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGN0IHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFRpbWUoYm9vbGVhbiBjdCkgeworICAgICAgICBtQ3RpbWUgPSBjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY3VycmVudCB0aW1lIHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIGN1cnJlbnQgdGltZSBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q3VycmVudFRpbWUoKSB7CisgICAgICAgIHJldHVybiBtQ3RpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIGJlIHByZXNlcnZlZCBmcm9tIHRoZSBWT0IgdGltZS4KKyAgICAgKiBFaXRoZXIgY3VycmVudHRpbWUgb3IgcHJlc2VydmV0aW1lIGNhbiBiZSBzcGVjaWZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHQgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZVRpbWUoYm9vbGVhbiBwdCkgeworICAgICAgICBtUHRpbWUgPSBwdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcHJlc2VydmUgdGltZSBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBwcmVzZXJ2ZSB0aW1lIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcmVzZXJ2ZVRpbWUoKSB7CisgICAgICAgIHJldHVybiBtUHRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9nIGZpbGUgd2hlcmUgY2xlYXJ0b29sIHJlY29yZHMKKyAgICAgKiB0aGUgc3RhdHVzIG9mIHRoZSBjb21tYW5kLgorICAgICAqCisgICAgICogQHBhcmFtIGxvZyB0aGUgcGF0aCB0byB0aGUgbG9nIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2coU3RyaW5nIGxvZykgeworICAgICAgICBtTG9nID0gbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBsb2cgZmlsZQorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgcGF0aCB0byB0aGUgbG9nIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvZygpIHsKKyAgICAgICAgcmV0dXJuIG1Mb2c7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlICdsb2cnIGNvbW1hbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgY29udGFpbmluZyB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB3aXRoIG9yIHdpdGhvdXQgdGhlIGxvZyBmbGFnIGFuZCBwYXRoIGFwcGVuZGVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldExvZ0NvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIGlmIChnZXRMb2coKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKKyAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCisgICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19MT0cpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0TG9nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIC1ncmFwaGljYWwgZmxhZyAtLSBkaXNwbGF5IGdyYXBoaWNhbCBkaWFsb2cgZHVyaW5nIHVwZGF0ZSBvcGVyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0dSQVBISUNBTCA9ICItZ3JhcGhpY2FsIjsKKyAgICAvKioKKyAgICAgKiAtbG9nIGZsYWcgLS0gZmlsZSB0byBsb2cgc3RhdHVzIHRvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19MT0cgPSAiLWxvZyI7CisgICAgLyoqCisgICAgICogLW92ZXJ3cml0ZSBmbGFnIC0tIG92ZXJ3cml0ZSBoaWphY2tlZCBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfT1ZFUldSSVRFID0gIi1vdmVyd3JpdGUiOworICAgIC8qKgorICAgICAqIC1ub3ZlcndyaXRlIGZsYWcgLS0gZG8gbm90IG92ZXJ3cml0ZSBoaWphY2tlZCBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9WRVJXUklURSA9ICItbm92ZXJ3cml0ZSI7CisgICAgLyoqCisgICAgICogLXJlbmFtZSBmbGFnIC0tIHJlbmFtZSBoaWphY2tlZCBmaWxlcyB3aXRoIC5rZWVwIGV4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVOQU1FID0gIi1yZW5hbWUiOworICAgIC8qKgorICAgICAqIC1jdGltZSBmbGFnIC0tIG1vZGlmaWVkIHRpbWUgaXMgd3JpdHRlbiBhcyB0aGUgY3VycmVudCB0aW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DVVJSRU5UVElNRSA9ICItY3RpbWUiOworICAgIC8qKgorICAgICAqIC1wdGltZSBmbGFnIC0tIG1vZGlmaWVkIHRpbWUgaXMgd3JpdHRlbiBhcyB0aGUgVk9CIHRpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BSRVNFUlZFVElNRSA9ICItcHRpbWUiOworCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DbGVhckNhc2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DbGVhckNhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWJlZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NsZWFyQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ1N0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgdGFza3MgZm9yIGV4ZWN1dGluZyBjb21tYW5kcyBvbiBDbGVhckNhc2UuCisgKiA8cD4KKyAqIFRoZSBjbGFzcyBleHRlbmRzIHRoZSAnZXhlYycgdGFzayBhcyBpdCBvcGVyYXRlcyBieSBleGVjdXRpbmcgdGhlIGNsZWFydG9vbCBwcm9ncmFtCisgKiBzdXBwbGllZCB3aXRoIENsZWFyQ2FzZS4gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIHRoZSBjbGVhcnRvb2wgZXhlY3V0YWJsZSB0byBiZQorICogaW4gdGhlIHBhdGgsICogeW91IGNhbiBvdmVycmlkZSB0aGlzIGJlIHNwZWNpZnlpbmcgdGhlIGNsZWFydG9vbGRpciBhdHRyaWJ1dGUuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc2V0IGFuZCBnZXQgbWV0aG9kcyBmb3IgdGhlICd2aWV3cGF0aCcgYW5kICdvYmpzZWxlY3QnCisgKiBhdHRyaWJ1dGUuIEl0IGFsc28gY29udGFpbnMgY29uc3RhbnRzIGZvciB0aGUgZmxhZ3MgdGhhdCBjYW4gYmUgcGFzc2VkIHRvCisgKiBjbGVhcnRvb2wuCisgKiA8L3A+CisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xlYXJDYXNlIGV4dGVuZHMgVGFzayB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUNsZWFyVG9vbERpciA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIG12aWV3UGF0aCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbW9ialNlbGVjdCA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBjbnQgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBtRmFpbG9uZXJyID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2xlYXJ0b29sIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjbGVhcnRvb2wgZXhlY3V0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENsZWFyVG9vbERpcihTdHJpbmcgZGlyKSB7CisgICAgICAgIG1DbGVhclRvb2xEaXIgPSBGaWxlVXRpbHMudHJhbnNsYXRlUGF0aChkaXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhbmQgcmV0dXJucyB0aGUgY29tbWFuZCBzdHJpbmcgdG8gZXhlY3V0ZSBjbGVhcnRvb2wKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgcGF0aCB0byB0aGUgZXhlY3V0YWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0Q2xlYXJUb29sQ29tbWFuZCgpIHsKKyAgICAgICAgU3RyaW5nIHRvUmV0dXJuID0gbUNsZWFyVG9vbERpcjsKKyAgICAgICAgaWYgKCF0b1JldHVybi5lcXVhbHMoIiIpICYmICF0b1JldHVybi5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB0b1JldHVybiArPSAiLyI7CisgICAgICAgIH0KKworICAgICAgICB0b1JldHVybiArPSBDTEVBUlRPT0xfRVhFOworCisgICAgICAgIHJldHVybiB0b1JldHVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggdG8gdGhlIGl0ZW0gaW4gYSBDbGVhckNhc2UgdmlldyB0byBvcGVyYXRlIG9uLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdQYXRoIFBhdGggdG8gdGhlIHZpZXcgZGlyZWN0b3J5IG9yIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWaWV3UGF0aChTdHJpbmcgdmlld1BhdGgpIHsKKyAgICAgICAgbXZpZXdQYXRoID0gdmlld1BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXRoIHRvIHRoZSBpdGVtIGluIGEgY2xlYXJjYXNlIHZpZXcKKyAgICAgKgorICAgICAqIEByZXR1cm4gbXZpZXdQYXRoCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWaWV3UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG12aWV3UGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGJhc2VuYW1lIHBhdGggb2YgdGhlIGl0ZW0gaW4gYSBjbGVhcmNhc2UgdmlldworICAgICAqCisgICAgICogQHJldHVybiBiYXNlbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vmlld1BhdGhCYXNlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgRmlsZShtdmlld1BhdGgpKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmpTZWxlY3Qgb2JqZWN0IHRvIG9wZXJhdGUgb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRPYmpTZWxlY3QoU3RyaW5nIG9ialNlbGVjdCkgeworICAgICAgICBtb2JqU2VsZWN0ID0gb2JqU2VsZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gbW9ialNlbGVjdAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqU2VsZWN0KCkgeworICAgICAgICByZXR1cm4gbW9ialNlbGVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kIGFyZSByZXR1cm4gc3VjY2VzcyBvciBmYWlsdXJlCisgICAgICogQHBhcmFtIGNtZCBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZQorICAgICAqIEByZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBzdWJwcm9jZXNzIG9yIDxjb2RlPklOVkFMSUQ8L2NvZGU+CisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBydW4oQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgRXhlY3V0ZSBleGUKKyAgICAgICAgICAgICAgICA9IG5ldyBFeGVjdXRlKG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsIFByb2plY3QuTVNHX0lORk8sIFByb2plY3QuTVNHX1dBUk4pKTsKKyAgICAgICAgICAgIGV4ZS5zZXRBbnRSdW4oYVByb2opOworICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoYVByb2ouZ2V0QmFzZURpcigpKTsKKyAgICAgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjbWQuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgICAgICByZXR1cm4gZXhlLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kLCBhbmQgcmV0dXJuIGl0J3Mgb3V0cHV0CisgICAgICogQHBhcmFtIGNtZGxpbmUgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUKKyAgICAgKiBAcmV0dXJuIG91dHB1dCBvZiB0aGUgY29tbWFuZCBsaW5lCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBydW5TKENvbW1hbmRsaW5lIGNtZGxpbmUpIHsKKyAgICAgICAgU3RyaW5nICAgb3V0ViAgPSAib3B0cy5jYy5ydW5TLm91dHB1dCIgKyBwY250Kys7CisgICAgICAgIEV4ZWNUYXNrIGV4ZSAgID0gbmV3IEV4ZWNUYXNrKHRoaXMpOworICAgICAgICBDb21tYW5kbGluZS5Bcmd1bWVudCBhcmcgPSBleGUuY3JlYXRlQXJnKCk7CisKKyAgICAgICAgZXhlLnNldEV4ZWN1dGFibGUoY21kbGluZS5nZXRFeGVjdXRhYmxlKCkpOworICAgICAgICBhcmcuc2V0TGluZShDb21tYW5kbGluZS50b1N0cmluZyhjbWRsaW5lLmdldEFyZ3VtZW50cygpKSk7CisgICAgICAgIGV4ZS5zZXRPdXRwdXRwcm9wZXJ0eShvdXRWKTsKKyAgICAgICAgZXhlLmV4ZWN1dGUoKTsKKworICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KG91dFYpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBjb21tYW5kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFpbG9uZXJyIHRoZSBzdGF0dXMgdG8gc2V0IHRoZSBmbGFnIHRvCisgICAgICogQHNpbmNlIGFudCAxLjYuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycihib29sZWFuIGZhaWxvbmVycikgeworICAgICAgICBtRmFpbG9uZXJyID0gZmFpbG9uZXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBmYWlsb25lcnIgZmxhZyBzdGF0dXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjb250YWluaW5nIHN0YXR1cyBvZiBmYWlsb25lcnIgZmxhZworICAgICAqIEBzaW5jZSBhbnQgMS42LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsT25FcnIoKSB7CisgICAgICAgIHJldHVybiBtRmFpbG9uZXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB0aGUgdGhpbmcgdG8gZXhlY3V0ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUlRPT0xfRVhFID0gImNsZWFydG9vbCI7CisgICAgLyoqCisgICAgICogVGhlICdVcGRhdGUnIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1VQREFURSA9ICJ1cGRhdGUiOworICAgIC8qKgorICAgICAqIFRoZSAnQ2hlY2tvdXQnIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0NIRUNLT1VUID0gImNoZWNrb3V0IjsKKyAgICAvKioKKyAgICAgKiBUaGUgJ0NoZWNraW4nIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0NIRUNLSU4gPSAiY2hlY2tpbiI7CisgICAgLyoqCisgICAgICogVGhlICdVbmRvQ2hlY2tvdXQnIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1VOQ0hFQ0tPVVQgPSAidW5jaGVja291dCI7CisgICAgLyoqCisgICAgICogVGhlICdMb2NrJyBjb21tYW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9MT0NLID0gImxvY2siOworICAgIC8qKgorICAgICAqIFRoZSAnVW5sb2NrJyBjb21tYW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9VTkxPQ0sgPSAidW5sb2NrIjsKKyAgICAvKioKKyAgICAgKiBUaGUgJ01rYmwnIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX01LQkwgPSAibWtibCI7CisgICAgLyoqCisgICAgICogVGhlICdNa2xhYmVsJyBjb21tYW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9NS0xBQkVMID0gIm1rbGFiZWwiOworICAgIC8qKgorICAgICAqIFRoZSAnTWtsYnR5cGUnIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX01LTEJUWVBFID0gIm1rbGJ0eXBlIjsKKyAgICAvKioKKyAgICAgKiBUaGUgJ1JtdHlwZScgY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfUk1UWVBFID0gInJtdHlwZSI7CisgICAgLyoqCisgICAgICogVGhlICdMc0NoZWNrb3V0JyBjb21tYW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9MU0NPID0gImxzY28iOworICAgIC8qKgorICAgICAqIFRoZSAnTWtlbGVtJyBjb21tYW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9NS0VMRU0gPSAibWtlbGVtIjsKKyAgICAvKioKKyAgICAgKiBUaGUgJ01rYXR0cicgY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTUtBVFRSID0gIm1rYXR0ciI7CisgICAgLyoqCisgICAgICogVGhlICdNa2RpcicgY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTUtESVIgPSAibWtkaXIiOworCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9BbnRBbmFseXplci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0FudEFuYWx5emVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwMGU2OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9BbnRBbmFseXplci5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZC5BYnN0cmFjdEFuYWx5emVyOworCisvKioKKyAqIEFuIGFuYWx5emVyIHdoaWNoIHVzZXMgdGhlIGRlcGVuZCB0YXNrJ3MgYnl0ZWNvZGUgY2xhc3NlcyB0byBhbmFseXplCisgKiBkZXBlbmRlbmNpZXMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRBbmFseXplciBleHRlbmRzIEFic3RyYWN0QW5hbHl6ZXIgeworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgQW50QW5hbHl6ZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGNvbmZpZ3VyZWQgcm9vdCBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVzIGEgdmVjdG9yIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBmaWxlcyB3aGljaCBjb250YWluCisgICAgICogICAgICB0aGUgZGVwZW5kZW5jeSBjbGFzc2VzCisgICAgICogQHBhcmFtIGNsYXNzZXMgYSB2ZWN0b3IgdG8gYmUgcG9wdWxhdGVkIHdpdGggdGhlIG5hbWVzIG9mIHRoZQorICAgICAqICAgICAgZGVwZW5kZW5jeSBjbGFzc2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRldGVybWluZURlcGVuZGVuY2llcyhWZWN0b3IgZmlsZXMsIFZlY3RvciBjbGFzc2VzKSB7CisgICAgICAgIC8vIHdlIGdldCB0aGUgcm9vdCBjbGFzc2VzIGFuZCBidWlsZCB1cCBhIHNldCBvZgorICAgICAgICAvLyBjbGFzc2VzIHVwb24gd2hpY2ggdGhleSBkZXBlbmQKKyAgICAgICAgSGFzaHRhYmxlIGRlcGVuZGVuY2llcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgSGFzaHRhYmxlIGNvbnRhaW5lcnMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIEhhc2h0YWJsZSB0b0FuYWx5emUgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGdldFJvb3RDbGFzc2VzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgdG9BbmFseXplLnB1dChjbGFzc25hbWUsIGNsYXNzbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBpbnQgbWF4Q291bnQgPSBpc0Nsb3N1cmVSZXF1aXJlZCgpID8gTUFYX0xPT1BTIDogMTsKKyAgICAgICAgSGFzaHRhYmxlIGFuYWx5emVkRGVwcyA9IG51bGw7CisgICAgICAgIHdoaWxlICh0b0FuYWx5emUuc2l6ZSgpICE9IDAgJiYgY291bnQrKyA8IG1heENvdW50KSB7CisgICAgICAgICAgICBhbmFseXplZERlcHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSB0b0FuYWx5emUua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1dChjbGFzc25hbWUsIGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBjb250YWluZXIgPSBnZXRDbGFzc0NvbnRhaW5lcihjbGFzc25hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMucHV0KGNvbnRhaW5lciwgY29udGFpbmVyKTsKKworICAgICAgICAgICAgICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oY29udGFpbmVyLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGUgPSBuZXcgWmlwRmlsZShjb250YWluZXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2xhc3NuYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkoZW50cnlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IG5ldyBDbGFzc0ZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRmlsZS5yZWFkKGluU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBkZXBlbmRlbmN5TGlzdCA9IGNsYXNzRmlsZS5nZXRDbGFzc1JlZnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGRlcEVudW0gPSBkZXBlbmRlbmN5TGlzdC5lbGVtZW50cygpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRlcEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVwZW5kZW5jeSA9IChTdHJpbmcpIGRlcEVudW0ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXplZERlcHMucHV0KGRlcGVuZGVuY3ksIGRlcGVuZGVuY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHppcEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRvQW5hbHl6ZS5jbGVhcigpOworCisgICAgICAgICAgICAvLyBub3cgcmVjb3ZlciBhbGwgdGhlIGRlcGVuZGVuY2llcyBjb2xsZWN0ZWQgYW5kIGFkZCB0byB0aGUgbGlzdC4KKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGRlcHNFbnVtID0gYW5hbHl6ZWREZXBzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZGVwc0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgZGVwc0VudW0ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY2llcy5jb250YWluc0tleShjbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRvQW5hbHl6ZS5wdXQoY2xhc3NOYW1lLCBjbGFzc05hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHBpY2sgdXAgdGhlIGxhc3Qgcm91bmQgb2YgZGVwZW5kZW5jaWVzIHRoYXQgd2VyZSBkZXRlcm1pbmVkCisgICAgICAgIEVudW1lcmF0aW9uIGRlcHNFbnVtID0gYW5hbHl6ZWREZXBzLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChkZXBzRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGRlcHNFbnVtLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHV0KGNsYXNzTmFtZSwgY2xhc3NOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbGVzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGNvbnRhaW5lcnMua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgZmlsZXMuYWRkRWxlbWVudCgoRmlsZSkgZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZGVwZW5kZW5jaWVzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIGNsYXNzZXMuYWRkRWxlbWVudCgoU3RyaW5nKSBlLm5leHRFbGVtZW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGUgaWYgdGhpcyBhbmFseXplciBjYW4gZGV0ZXJtaW5lIGRlcGVuZGVudCBmaWxlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5hbHl6ZXIgcHJvdmlkZXMgZGVwZW5kZW5jeSBmaWxlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzRmlsZURlcGVuZGVuY2llcygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjBjMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZS5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZDsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2wuQ2xhc3NDUEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbC5Db25zdGFudFBvb2xFbnRyeTsKKworLyoqCisgKiBBIENsYXNzRmlsZSBvYmplY3Qgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgSmF2YSBjbGFzcy4gVGhlIGNsYXNzIG1heQorICogYmUgcmVhZCBmcm9tIGEgRGF0YUlucHV0U3RyZWFtLmFuZCB3cml0dGVuIHRvIGEgRGF0YU91dHB1dFN0cmVhbS4gVGhlc2UKKyAqIGFyZSB1c3VhbGx5IHN0cmVhbXMgZnJvbSBhIEphdmEgY2xhc3MgZmlsZSBvciBhIGNsYXNzIGZpbGUgY29tcG9uZW50IG9mIGEKKyAqIEphciBmaWxlLgorICoKKyAqLworcHVibGljIGNsYXNzIENsYXNzRmlsZSB7CisKKyAgICAvKiogVGhlIE1hZ2ljIFZhbHVlIHRoYXQgbWFya3MgdGhlIHN0YXJ0IG9mIGEgSmF2YSBjbGFzcyBmaWxlICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTEFTU19NQUdJQyA9IDB4Q0FGRUJBQkU7CisKKyAgICAvKiogVGhpcyBjbGFzcycgY29uc3RhbnQgcG9vbC4gICovCisgICAgcHJpdmF0ZSBDb25zdGFudFBvb2wgY29uc3RhbnRQb29sOworCisgICAgLyoqIFRoZSBjbGFzcyBuYW1lIGZvciB0aGlzIGNsYXNzLiAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbGFzcyBmcm9tIGEgZGF0YSBzdHJlYW0uIFRoaXMgbWV0aG9kIHRha2VzIGFuIElucHV0U3RyZWFtCisgICAgICogYXMgaW5wdXQgYW5kIHBhcnNlcyB0aGUgY2xhc3MgZnJvbSB0aGUgc3RyZWFtLiA8cD4KKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIGFuIElucHV0U3RyZWFtIGZyb20gd2hpY2ggdGhlIGNsYXNzIHdpbGwgYmUgcmVhZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgZnJvbSB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgIHN0cmVhbS4KKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzRm9ybWF0RXJyb3IgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBwYXJzZWQgY29ycmVjdGx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhZChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NGb3JtYXRFcnJvciB7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBjbGFzc1N0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oc3RyZWFtKTsKKworICAgICAgICBpZiAoY2xhc3NTdHJlYW0ucmVhZEludCgpICE9IENMQVNTX01BR0lDKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFcnJvcigiTm8gTWFnaWMgQ29kZSBGb3VuZCAiCisgICAgICAgICAgICAgICAgKyAiLSBwcm9iYWJseSBub3QgYSBKYXZhIGNsYXNzIGZpbGUuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyByaWdodCB3ZSBoYXZlIGEgZ29vZCBsb29raW5nIGNsYXNzIGZpbGUuCisgICAgICAgIC8qIGludCBtaW5vclZlcnNpb24gPSAqLyBjbGFzc1N0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOworICAgICAgICAvKiBpbnQgbWFqb3JWZXJzaW9uID0gKi8gY2xhc3NTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKKworICAgICAgICAvLyByZWFkIHRoZSBjb25zdGFudCBwb29sIGluIGFuZCByZXNvbHZlIGl0CisgICAgICAgIGNvbnN0YW50UG9vbCA9IG5ldyBDb25zdGFudFBvb2woKTsKKworICAgICAgICBjb25zdGFudFBvb2wucmVhZChjbGFzc1N0cmVhbSk7CisgICAgICAgIGNvbnN0YW50UG9vbC5yZXNvbHZlKCk7CisKKyAgICAgICAgLyogaW50IGFjY2Vzc0ZsYWdzID0gKi8gY2xhc3NTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKKyAgICAgICAgaW50IHRoaXNDbGFzc0luZGV4ID0gY2xhc3NTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKKyAgICAgICAgLyogaW50IHN1cGVyQ2xhc3NJbmRleCA9ICovIGNsYXNzU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgICAgIENsYXNzQ1BJbmZvIGNsYXNzSW5mbworICAgICAgICAgICAgPSAoQ2xhc3NDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeSh0aGlzQ2xhc3NJbmRleCk7CisgICAgICAgIGNsYXNzTmFtZSAgPSBjbGFzc0luZm8uZ2V0Q2xhc3NOYW1lKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzZXMgd2hpY2ggdGhpcyBjbGFzcyByZWZlcmVuY2VzLgorICAgICAqCisgICAgICogQHJldHVybiBhIHZlY3RvciBvZiBjbGFzcyBuYW1lcyB3aGljaCB0aGlzIGNsYXNzIHJlZmVyZW5jZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgVmVjdG9yIGdldENsYXNzUmVmcygpIHsKKworICAgICAgICBWZWN0b3IgY2xhc3NSZWZzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RhbnRQb29sLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBDb25zdGFudFBvb2xFbnRyeSBlbnRyeSA9IGNvbnN0YW50UG9vbC5nZXRFbnRyeShpKTsKKworICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBlbnRyeS5nZXRUYWcoKSA9PSBDb25zdGFudFBvb2xFbnRyeS5DT05TVEFOVF9DTEFTUykgeworICAgICAgICAgICAgICAgIENsYXNzQ1BJbmZvIGNsYXNzRW50cnkgPSAoQ2xhc3NDUEluZm8pIGVudHJ5OworCisgICAgICAgICAgICAgICAgaWYgKCFjbGFzc0VudHJ5LmdldENsYXNzTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzUmVmcy5hZGRFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlVXRpbHMuY29udmVydFNsYXNoTmFtZShjbGFzc0VudHJ5LmdldENsYXNzTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNsYXNzUmVmczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzJyBmdWxseSBxdWFsaWZpZWQgbmFtZSBpbiBkb3QgZm9ybWF0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBpbiBkb3QgZm9ybWF0IChlZy4gamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBDbGFzc0ZpbGVVdGlscy5jb252ZXJ0U2xhc2hOYW1lKGNsYXNzTmFtZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlSXRlcmF0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZmMxOTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZDsKKworLyoqCisgKiBJdGVyYXRvciBpbnRlcmZhY2UgZm9yIGl0ZXJhdGluZyBvdmVyIGEgc2V0IG9mIGNsYXNzIGZpbGVzCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIENsYXNzRmlsZUl0ZXJhdG9yIHsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmV4dCBjbGFzcyBmaWxlIGluIHRoZSBpdGVyYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgY2xhc3MgZmlsZSBpbiB0aGUgaXRlcmF0aW9uCisgICAgICovCisgICAgQ2xhc3NGaWxlIGdldE5leHRDbGFzc0ZpbGUoKTsKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZVV0aWxzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmVlYzZjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZVV0aWxzLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQ7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmaWxlIHJvdXRpbmVzLiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0YXRpYworICogdXRpbGl0eSBtZXRob2RzIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgZm9ybWF0cyB1c2VkIGluIHRoZSBKYXZhIGNsYXNzCisgKiBmaWxlIGZvcm1hdCBhbmQgdGhvc2UgY29tbW9ubHkgdXNlZCBpbiBKYXZhIHByb2dyYW1taW5nLgorICoKKyAqCisgKi8KKy8vIENoZWNrU3R5bGU6SGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yQ2hlY2sgT0ZGIChiYykKK3B1YmxpYyBjbGFzcyBDbGFzc0ZpbGVVdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSBmcm9tIGNsYXNzIGZpbGUgc2xhc2ggbm90YXRpb24gdG8gamF2YSBzb3VyY2UKKyAgICAgKiBmaWxlIGRvdCBub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBjbGFzcyBuYW1lIGluIHNsYXNoIG5vdGF0aW9uIG9yZy9hcGFjaGUvYW50CisgICAgICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBpbiBkb3Qgbm90YXRpb24gKGVnLiBqYXZhLmxhbmcuT2JqZWN0KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0U2xhc2hOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJ1xcJywgJy4nKS5yZXBsYWNlKCcvJywgJy4nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSBmcm9tIGphdmEgc291cmNlIGZpbGUgZG90IG5vdGF0aW9uIHRvIGNsYXNzIGZpbGUKKyAgICAgKiBzbGFzaCBub3RhdGlvbi4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG90TmFtZSB0aGUgY2xhc3MgbmFtZSBpbiBkb3Qgbm90YXRpb24gKGVnLiBqYXZhLmxhbmcuT2JqZWN0KS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lIGluIHNsYXNoIG5vdGF0aW9uIChlZy4gamF2YS9sYW5nL09iamVjdCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydERvdE5hbWUoU3RyaW5nIGRvdE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGRvdE5hbWUucmVwbGFjZSgnLicsICcvJyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvRGVwZW5kLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvRGVwZW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiODY2MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmQuamF2YQpAQCAtMCwwICsxLDg4OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWMuRGVmYXVsdFJtaWNBZGFwdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWMuV0xSbWljOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLkRlcGVuZGVuY3lBbmFseXplcjsKKworLyoqCisgKiBHZW5lcmF0ZXMgYSBkZXBlbmRlbmN5IGZpbGUgZm9yIGEgZ2l2ZW4gc2V0IG9mIGNsYXNzZXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgRGVwZW5kIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT05FX1NFQ09ORCA9IDEwMDA7CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIChzdHJ1Y3QpIHVzZXIgdG8gbWFuYWdlIGluZm9ybWF0aW9uIGFib3V0IGEgY2xhc3MKKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENsYXNzRmlsZUluZm8geworICAgICAgICAvKiogVGhlIGZpbGUgd2hlcmUgdGhlIGNsYXNzIGZpbGUgaXMgc3RvcmVkIGluIHRoZSBmaWxlIHN5c3RlbSAqLworICAgICAgICBwcml2YXRlIEZpbGUgYWJzb2x1dGVGaWxlOworCisgICAgICAgIC8qKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoaXMgY2xhc3MgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworCisgICAgICAgIC8qKiBUaGUgc291cmNlIEZpbGUgY29udGFpbmluZyB0aGlzIGNsYXNzICovCisgICAgICAgIHByaXZhdGUgRmlsZSBzb3VyY2VGaWxlOworCisgICAgICAgIC8qKiBpZiB1c2VyIGhhcyBiZWVuIHdhcm5lZCBhYm91dCB0aGlzIGZpbGUgbm90IGhhdmluZyBhIHNvdXJjZSBmaWxlICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1VzZXJXYXJuZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogVGhlIHBhdGggd2hlcmUgc291cmNlIGZpbGVzIGV4aXN0ICovCisgICAgcHJpdmF0ZSBQYXRoIHNyY1BhdGg7CisKKyAgICAvKiogVGhlIHBhdGggd2hlcmUgY29tcGlsZWQgY2xhc3MgZmlsZXMgZXhpc3QuICovCisgICAgcHJpdmF0ZSBQYXRoIGRlc3RQYXRoOworCisgICAgLyoqIFRoZSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGRlcGVuZGVuY3kgY2FjaGUuICovCisgICAgcHJpdmF0ZSBGaWxlIGNhY2hlOworCisgICAgLyoqIFRoZSBsaXN0IG9mIHNvdXJjZSBwYXRocyBkZXJpdmVkIGZyb20gdGhlIHNyY1BhdGggZmllbGQuICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBzcmNQYXRoTGlzdDsKKworICAgIC8qKgorICAgICAqIEEgbWFwIHdoaWNoIGdpdmVzIGZvciBldmVyeSBjbGFzcyBhIGxpc3Qgb2YgdGhlIGNsYXNzIHdoaWNoIGl0CisgICAgICogYWZmZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBhZmZlY3RlZENsYXNzTWFwOworCisgICAgLyoqIEEgbWFwIHdoaWNoIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IGEgY2xhc3MgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBjbGFzc0ZpbGVJbmZvTWFwOworCisgICAgLyoqCisgICAgICogQSBtYXAgd2hpY2ggZ2l2ZXMgdGhlIGxpc3Qgb2YgamFycyBhbmQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc3BhdGgKKyAgICAgKiB0aGF0IGEgY2xhc3MgZGVwZW5kcyB1cG9uCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgY2xhc3NwYXRoRGVwZW5kZW5jaWVzOworCisgICAgLyoqIFRoZSBsaXN0IG9mIGNsYXNzZXMgd2hpY2ggYXJlIG91dCBvZiBkYXRlLiAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIG91dE9mRGF0ZUNsYXNzZXM7CisKKyAgICAvKioKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIHNob3VsZCBiZSBleHRlbmRlZCBiZXlvbmQKKyAgICAgKiBkaXJlY3QgZGVwZW5kZW5jaWVzIHRvIGluY2x1ZGUgYWxsIGNsYXNzZXMuIFNvIGlmIEEgZGlyZWN0bHkgYWZmZWN0cworICAgICAqIEIgYW5kIEIgZGlyZWN0bHkgYWZmZWN0cyBDLCB0aGVuIEEgaW5kaXJlY3RseSBhZmZlY3RzIEMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3N1cmUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIGZsYWcgdG8gZW5hYmxlIHdhcm5pbmcgaWYgd2UgZW5jb3VudGVyIFJNSSBzdHVicworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB3YXJuT25SbWlTdHVicyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHdoaWNoIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHJldmVyc2VkIGRlcGVuZGVuY2llcyBzaG91bGQgYmUKKyAgICAgKiBkdW1wZWQgdG8gdGhlIGxvZworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkdW1wID0gZmFsc2U7CisKKyAgICAvKiogVGhlIGNsYXNzcGF0aCB0byBsb29rIGZvciBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyAqLworICAgIHByaXZhdGUgUGF0aCBkZXBlbmRDbGFzc3BhdGg7CisKKyAgICAvKiogY29uc3RhbnRzIHVzZWQgd2l0aCB0aGUgY2FjaGUgZmlsZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9GSUxFX05BTUUgPSAiZGVwZW5kZW5jaWVzLnR4dCI7CisgICAgLyoqIFN0cmluZyBVc2VkIHRvIHNlcGFyYXRlIGNsYXNzbmFtZXMgaW4gdGhlIGRlcGVuZGVuY3kgZmlsZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfUFJFUEVORCA9ICJ8fDoiOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBkZXBlbmRlbmN5IGNoZWNrLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBjaGVja2luZyBmb3IKKyAgICAgKiAgICAgIGRlcGVuZGVuY2llcyBvbiBlbGVtZW50cyBpbiB0aGUgY2xhc3NwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGlmIChkZXBlbmRDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgZGVwZW5kQ2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVwZW5kQ2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgZGVwZW5kZW5jeSBjaGVjay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZGVwZW5kZW5jeSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBkZXBlbmRDbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGRlcGVuZGVuY3kgY2hlY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgcGF0aCBvYmplY3QgdG8gYmUgY29uZmlndXJlZCBieSBBbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmIChkZXBlbmRDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgZGVwZW5kQ2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVwZW5kQ2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgYSByZWZlcmVuY2UgdG8gYSBwYXRoIG9iamVjdCB0byBiZSB1c2VkIGFzIHRoZSBkZXBlbmQKKyAgICAgKiAgICAgIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIHNldCB0byB0cnVlIGlmIHlvdSB3YW50IGRlcGVuZGVuY3kgaXNzdWVzIHdpdGggUk1JCisgICAgICogc3R1YnMgdG8gYXBwZWFyIGF0IHdhcm5pbmcgbGV2ZWwuCisgICAgICogQHBhcmFtIHdhcm5PblJtaVN0dWJzIGlmIHRydWUgc2V0IGRlcGVuZGVuY3kgaXNzdWVzIHRvIGFwcGVhciBhdCB3YXJuaW5nIGxldmVsLgorICAgICAqIEBzaW5jZSBBbnQxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXYXJuT25SbWlTdHVicyhib29sZWFuIHdhcm5PblJtaVN0dWJzKSB7CisgICAgICAgIHRoaXMud2Fybk9uUm1pU3R1YnMgPSB3YXJuT25SbWlTdHViczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBkZXBlbmRlbmNpZXMgZnJvbSBjYWNoZSBmaWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBjbGFzcyBkZXBlbmRlbmNpZXMKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBkZXBlbmRlbmN5IGZpbGUgY2Fubm90IGJlIHJlYWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSByZWFkQ2FjaGVkRGVwZW5kZW5jaWVzKEZpbGUgZGVwRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaHRhYmxlIGRlcGVuZGVuY3lNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZGVwRmlsZSkpOworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICAgICAgVmVjdG9yIGRlcGVuZGVuY3lMaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOworICAgICAgICAgICAgaW50IHByZXBlbmRMZW5ndGggPSBDTEFTU05BTUVfUFJFUEVORC5sZW5ndGgoKTsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKENMQVNTTkFNRV9QUkVQRU5EKSkgeworICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5TGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gbGluZS5zdWJzdHJpbmcocHJlcGVuZExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lNYXAucHV0KGNsYXNzTmFtZSwgZGVwZW5kZW5jeUxpc3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lMaXN0LmFkZEVsZW1lbnQobGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlcGVuZGVuY3lNYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGRlcGVuZGVuY2llcyB0byBjYWNoZSBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVwZW5kZW5jeU1hcCB0aGUgbWFwIG9mIGRlcGVuZGVuY2llcyB0byBiZSB3cml0dGVuIG91dC4KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBkZXBlbmRlbmN5IGZpbGUgY2Fubm90IGJlIHdyaXR0ZW4gb3V0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZUNhY2hlZERlcGVuZGVuY2llcyhIYXNodGFibGUgZGVwZW5kZW5jeU1hcCkKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7CisgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNhY2hlLm1rZGlycygpOworICAgICAgICAgICAgICAgIEZpbGUgZGVwRmlsZSA9IG5ldyBGaWxlKGNhY2hlLCBDQUNIRV9GSUxFX05BTUUpOworCisgICAgICAgICAgICAgICAgcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZGVwRmlsZSkpOworICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBkZXBlbmRlbmN5TWFwLmtleXMoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworCisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oQ0xBU1NOQU1FX1BSRVBFTkQgKyBjbGFzc05hbWUpOworCisgICAgICAgICAgICAgICAgICAgIFZlY3RvciBkZXBlbmRlbmN5TGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgID0gKFZlY3RvcikgZGVwZW5kZW5jeU1hcC5nZXQoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBkZXBlbmRlbmN5TGlzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGRlcGVuZGVuY3lMaXN0LmVsZW1lbnRBdCh4KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChwdyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHB3LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGFzc3BhdGggZm9yIGRlcGVuZGVuY3kgY2hlY2tpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBkZXN0IGRpcnMgaWYgaXQgaXMgZ2l2ZW4gZnJvbSB0aGUgZGVwZW5kZW5jeSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggZ2V0Q2hlY2tDbGFzc1BhdGgoKSB7CisgICAgICAgIGlmIChkZXBlbmRDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBkZXN0UGF0aEVsZW1lbnRzID0gZGVzdFBhdGgubGlzdCgpOworICAgICAgICBTdHJpbmdbXSBjbGFzc3BhdGhFbGVtZW50cyA9IGRlcGVuZENsYXNzcGF0aC5saXN0KCk7CisgICAgICAgIFN0cmluZyBjaGVja1BhdGggPSAiIjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGhFbGVtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSBjbGFzc3BhdGhFbGVtZW50c1tpXTsKKyAgICAgICAgICAgIGJvb2xlYW4gaW5EZXN0UGF0aCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXN0UGF0aEVsZW1lbnRzLmxlbmd0aCAmJiAhaW5EZXN0UGF0aDsgKytqKSB7CisgICAgICAgICAgICAgICAgaW5EZXN0UGF0aCA9IGRlc3RQYXRoRWxlbWVudHNbal0uZXF1YWxzKGVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpbkRlc3RQYXRoKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrUGF0aC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrUGF0aCA9IGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXRoICs9ICI6IiArIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoZWNrUGF0aC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUGF0aChnZXRQcm9qZWN0KCksIGNoZWNrUGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiBjbGFzc2VzLiBDbGFzcyBkZXBlbmRlbmNpZXMgYXJlCisgICAgICogZGV0ZXJtaW5lZCBieSBleGFtaW5pbmcgdGhlIGNsYXNzIHJlZmVyZW5jZXMgaW4gYSBjbGFzcyBmaWxlIHRvIG90aGVyCisgICAgICogY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGhlIGZvbGxvd2luZyBmaWVsZHMKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+YWZmZWN0ZWRDbGFzc01hcCAtIHRoZSBsaXN0IG9mIGNsYXNzZXMgZWFjaCBjbGFzcyBhZmZlY3RzPC9saT4KKyAgICAgKiAgIDxsaT5jbGFzc0ZpbGVJbmZvTWFwIC0gaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBjbGFzczwvbGk+CisgICAgICogICA8bGk+Y2xhc3NwYXRoRGVwZW5kZW5jaWVzIC0gdGhlIGxpc3Qgb2YgamFycyBhbmQgY2xhc3NlcyBmcm9tIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGggdGhhdCBlYWNoIGNsYXNzIGRlcGVuZHMgdXBvbi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBJZiByZXF1aXJlZCwgdGhlIGRlcGVuZGVuY2llcyBhcmUgd3JpdHRlbiB0byB0aGUgY2FjaGUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGVpdGhlciB0aGUgZGVwZW5kZW5jaWVzIGNhY2hlIG9yIHRoZSBjbGFzcworICAgICAqICAgICAgZmlsZXMgY2Fubm90IGJlIHJlYWQgb3Igd3JpdHRlbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZXRlcm1pbmVEZXBlbmRlbmNpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhZmZlY3RlZENsYXNzTWFwID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBjbGFzc0ZpbGVJbmZvTWFwID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBib29sZWFuIGNhY2hlRGlydHkgPSBmYWxzZTsKKworICAgICAgICBIYXNodGFibGUgZGVwZW5kZW5jeU1hcCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgRmlsZSBjYWNoZUZpbGUgPSBudWxsOworICAgICAgICBib29sZWFuIGNhY2hlRmlsZUV4aXN0cyA9IHRydWU7CisgICAgICAgIGxvbmcgY2FjaGVMYXN0TW9kaWZpZWQgPSBMb25nLk1BWF9WQUxVRTsKKworICAgICAgICAvLyByZWFkIHRoZSBkZXBlbmRlbmN5IGNhY2hlIGZyb20gdGhlIGRpc2sKKyAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNhY2hlRmlsZSA9IG5ldyBGaWxlKGNhY2hlLCBDQUNIRV9GSUxFX05BTUUpOworICAgICAgICAgICAgY2FjaGVGaWxlRXhpc3RzID0gY2FjaGVGaWxlLmV4aXN0cygpOworICAgICAgICAgICAgY2FjaGVMYXN0TW9kaWZpZWQgPSBjYWNoZUZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBpZiAoY2FjaGVGaWxlRXhpc3RzKSB7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU1hcCA9IHJlYWRDYWNoZWREZXBlbmRlbmNpZXMoY2FjaGVGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFbnVtZXJhdGlvbiBjbGFzc2ZpbGVFbnVtID0gZ2V0Q2xhc3NGaWxlcyhkZXN0UGF0aCkuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGNsYXNzZmlsZUVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIENsYXNzRmlsZUluZm8gaW5mbyA9IChDbGFzc0ZpbGVJbmZvKSBjbGFzc2ZpbGVFbnVtLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBsb2coIkFkZGluZyBjbGFzcyBpbmZvIGZvciAiICsgaW5mby5jbGFzc05hbWUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIGNsYXNzRmlsZUluZm9NYXAucHV0KGluZm8uY2xhc3NOYW1lLCBpbmZvKTsKKworICAgICAgICAgICAgVmVjdG9yIGRlcGVuZGVuY3lMaXN0ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcmVhZCB0aGUgZGVwZW5kZW5jeSBpbmZvIGZyb20gdGhlIG1hcCBpZiBpdCBpcworICAgICAgICAgICAgICAgIC8vIG5vdCBvdXQgb2YgZGF0ZQorICAgICAgICAgICAgICAgIGlmIChjYWNoZUZpbGVFeGlzdHMKKyAgICAgICAgICAgICAgICAgICAgJiYgY2FjaGVMYXN0TW9kaWZpZWQgPiBpbmZvLmFic29sdXRlRmlsZS5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkZXBGaWxlIGV4aXN0cyBhbmQgaXMgbmV3ZXIgdGhhbiB0aGUgY2xhc3MgZmlsZQorICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGdldCBkZXBlbmRlbmN5IGxpc3QgZnJvbSB0aGUgbWFwLgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5TGlzdCA9IChWZWN0b3IpIGRlcGVuZGVuY3lNYXAuZ2V0KGluZm8uY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5TGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gbm90IGNhY2hlZCAtIHNvIG5lZWQgdG8gcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjbGFzcyBmaWxlCisgICAgICAgICAgICAgICAgRGVwZW5kZW5jeUFuYWx5emVyIGFuYWx5emVyID0gbmV3IEFudEFuYWx5emVyKCk7CisgICAgICAgICAgICAgICAgYW5hbHl6ZXIuYWRkUm9vdENsYXNzKGluZm8uY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBhbmFseXplci5hZGRDbGFzc1BhdGgoZGVzdFBhdGgpOworICAgICAgICAgICAgICAgIGFuYWx5emVyLnNldENsb3N1cmUoZmFsc2UpOworICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lMaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGRlcEVudW0gPSBhbmFseXplci5nZXRDbGFzc0RlcGVuZGVuY2llcygpOworICAgICAgICAgICAgICAgIHdoaWxlIChkZXBFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lMaXN0LmFkZEVsZW1lbnQoZGVwRW51bS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FjaGVEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU1hcC5wdXQoaW5mby5jbGFzc05hbWUsIGRlcGVuZGVuY3lMaXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBjbGFzcyBkZXBlbmRzIG9uIGVhY2ggY2xhc3MgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdC4gRm9yIGVhY2gKKyAgICAgICAgICAgIC8vIG9uZSBvZiB0aG9zZSwgYWRkIHRoaXMgY2xhc3MgaW50byB0aGVpciBhZmZlY3RlZCBjbGFzc2VzIGxpc3QKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGRlcEVudW0gPSBkZXBlbmRlbmN5TGlzdC5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUgKGRlcEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVwZW5kZW50Q2xhc3MgPSAoU3RyaW5nKSBkZXBFbnVtLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICBIYXNodGFibGUgYWZmZWN0ZWRDbGFzc2VzCisgICAgICAgICAgICAgICAgICAgID0gKEhhc2h0YWJsZSkgYWZmZWN0ZWRDbGFzc01hcC5nZXQoZGVwZW5kZW50Q2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChhZmZlY3RlZENsYXNzZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZENsYXNzZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3NNYXAucHV0KGRlcGVuZGVudENsYXNzLCBhZmZlY3RlZENsYXNzZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3Nlcy5wdXQoaW5mby5jbGFzc05hbWUsIGluZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3NwYXRoRGVwZW5kZW5jaWVzID0gbnVsbDsKKyAgICAgICAgUGF0aCBjaGVja1BhdGggPSBnZXRDaGVja0NsYXNzUGF0aCgpOworICAgICAgICBpZiAoY2hlY2tQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vdyBkZXRlcm1pbmUgd2hpY2ggamFycyBlYWNoIGNsYXNzIGRlcGVuZHMgdXBvbgorICAgICAgICAgICAgY2xhc3NwYXRoRGVwZW5kZW5jaWVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGNoZWNrUGF0aCk7CisKKyAgICAgICAgICAgIEhhc2h0YWJsZSBjbGFzc3BhdGhGaWxlQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICBPYmplY3QgbnVsbEZpbGVNYXJrZXIgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBkZXBlbmRlbmN5TWFwLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFZlY3RvciBkZXBlbmRlbmN5TGlzdCA9IChWZWN0b3IpIGRlcGVuZGVuY3lNYXAuZ2V0KGNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGRlcGVuZGVuY2llcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgICAgICBjbGFzc3BhdGhEZXBlbmRlbmNpZXMucHV0KGNsYXNzTmFtZSwgZGVwZW5kZW5jaWVzKTsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlMiA9IGRlcGVuZGVuY3lMaXN0LmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGUyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXBlbmRlbmN5ID0gKFN0cmluZykgZTIubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNsYXNzcGF0aEZpbGVPYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgID0gY2xhc3NwYXRoRmlsZUNhY2hlLmdldChkZXBlbmRlbmN5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEZpbGVPYmplY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoRmlsZU9iamVjdCA9IG51bGxGaWxlTWFya2VyOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kuc3RhcnRzV2l0aCgiamF2YS4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFkZXBlbmRlbmN5LnN0YXJ0c1dpdGgoImphdmF4LiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGNsYXNzVVJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbG9hZGVyLmdldFJlc291cmNlKGRlcGVuZGVuY3kucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzVVJMICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJqYXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphckZpbGVQYXRoID0gY2xhc3NVUkwuZ2V0RmlsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsYXNzTWFya2VyID0gamFyRmlsZVBhdGguaW5kZXhPZignIScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyRmlsZVBhdGggPSBqYXJGaWxlUGF0aC5zdWJzdHJpbmcoMCwgY2xhc3NNYXJrZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGphckZpbGVQYXRoLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhGaWxlT2JqZWN0ID0gbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5mcm9tVVJJKGphckZpbGVQYXRoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJpemFycmUgbmVzdGVkIHBhdGggaW4gamFyOiBwcm90b2NvbDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGphckZpbGVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc1VSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhGaWxlT2JqZWN0ID0gbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmdldEZpbGVVdGlscygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb21VUkkoY2xhc3NVUkwudG9FeHRlcm5hbEZvcm0oKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ2xhc3MgIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRlcGVuZHMgb24gIiArIGNsYXNzcGF0aEZpbGVPYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkdWUgdG8gIiArIGRlcGVuZGVuY3ksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhGaWxlQ2FjaGUucHV0KGRlcGVuZGVuY3ksIGNsYXNzcGF0aEZpbGVPYmplY3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGhGaWxlT2JqZWN0ICE9IG51bGxGaWxlTWFya2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCB0aGlzIGphciB0byB0aGUgbGlzdCBmb3IgdGhpcyBjbGFzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgamFyRmlsZSA9IChGaWxlKSBjbGFzc3BhdGhGaWxlT2JqZWN0OworICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1dChqYXJGaWxlLCBqYXJGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyaXRlIHRoZSBkZXBlbmRlbmN5IGNhY2hlIHRvIHRoZSBkaXNrCisgICAgICAgIGlmIChjYWNoZSAhPSBudWxsICYmIGNhY2hlRGlydHkpIHsKKyAgICAgICAgICAgIHdyaXRlQ2FjaGVkRGVwZW5kZW5jaWVzKGRlcGVuZGVuY3lNYXApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGFsbCB0aGUgY2xhc3MgZmlsZXMgd2hpY2ggYXJlIG91dCBvZiBkYXRlLCBieSB3YXkgb2YgdGhlaXIKKyAgICAgKiBkZXBlbmRlbmN5IG9uIGEgY2xhc3Mgd2hpY2ggaXMgb3V0IG9mIGRhdGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlcyBkZWxldGVkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlbGV0ZUFsbEFmZmVjdGVkRmlsZXMoKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IG91dE9mRGF0ZUNsYXNzZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBjb3VudCArPSBkZWxldGVBZmZlY3RlZEZpbGVzKGNsYXNzTmFtZSk7CisgICAgICAgICAgICBDbGFzc0ZpbGVJbmZvIGNsYXNzSW5mbworICAgICAgICAgICAgICAgID0gKENsYXNzRmlsZUluZm8pIGNsYXNzRmlsZUluZm9NYXAuZ2V0KGNsYXNzTmFtZSk7CisgICAgICAgICAgICBpZiAoY2xhc3NJbmZvICE9IG51bGwgJiYgY2xhc3NJbmZvLmFic29sdXRlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGNsYXNzSW5mby5hYnNvbHV0ZUZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGFsbCB0aGUgY2xhc3MgZmlsZXMgb2YgY2xhc3NlcyB3aGljaCBkZXBlbmQgb24gdGhlIGdpdmVuIGNsYXNzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB3aG9zZSBkZXBlbmRlbnQgY2xhc3NlcyB3aWxsIGJlCisgICAgICogICAgICBkZWxldGVkCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNsYXNzIGZpbGVzIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBkZWxldGVBZmZlY3RlZEZpbGVzKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKworICAgICAgICBIYXNodGFibGUgYWZmZWN0ZWRDbGFzc2VzID0gKEhhc2h0YWJsZSkgYWZmZWN0ZWRDbGFzc01hcC5nZXQoY2xhc3NOYW1lKTsKKyAgICAgICAgaWYgKGFmZmVjdGVkQ2xhc3NlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gYWZmZWN0ZWRDbGFzc2VzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBhZmZlY3RlZENsYXNzID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBhZmZlY3RlZENsYXNzSW5mbworICAgICAgICAgICAgICAgID0gKENsYXNzRmlsZUluZm8pIGFmZmVjdGVkQ2xhc3Nlcy5nZXQoYWZmZWN0ZWRDbGFzcyk7CisKKyAgICAgICAgICAgIGlmICghYWZmZWN0ZWRDbGFzc0luZm8uYWJzb2x1dGVGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhZmZlY3RlZENsYXNzSW5mby5zb3VyY2VGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3YXJuT3V0T2ZEYXRlQnV0Tm90RGVsZXRlZChhZmZlY3RlZENsYXNzSW5mbywgYWZmZWN0ZWRDbGFzcywgY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9nKCJEZWxldGluZyBmaWxlICIgKyBhZmZlY3RlZENsYXNzSW5mby5hYnNvbHV0ZUZpbGUuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgKyAiIHNpbmNlICIgKyBjbGFzc05hbWUgKyAiIG91dCBvZiBkYXRlIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3NJbmZvLmFic29sdXRlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBpZiAoY2xvc3VyZSkgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGRlbGV0ZUFmZmVjdGVkRmlsZXMoYWZmZWN0ZWRDbGFzcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgY2xvc3VyZSB3ZSBtYXkgZGVsZXRlIGFuIGlubmVyIGNsYXNzIGJ1dCBub3QgdGhlCisgICAgICAgICAgICAgICAgLy8gdG9wIGxldmVsIGNsYXNzIHdoaWNoIHdvdWxkIG5vdCB0cmlnZ2VyIGEgcmVjb21waWxlLgorCisgICAgICAgICAgICAgICAgaWYgKGFmZmVjdGVkQ2xhc3MuaW5kZXhPZigiJCIpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgbWFpbiBjbGFzcworICAgICAgICAgICAgICAgIFN0cmluZyB0b3BMZXZlbENsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICAgPSBhZmZlY3RlZENsYXNzLnN1YnN0cmluZygwLCBhZmZlY3RlZENsYXNzLmluZGV4T2YoIiQiKSk7CisgICAgICAgICAgICAgICAgbG9nKCJUb3AgbGV2ZWwgY2xhc3MgPSAiICsgdG9wTGV2ZWxDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIENsYXNzRmlsZUluZm8gdG9wTGV2ZWxDbGFzc0luZm8KKyAgICAgICAgICAgICAgICAgICAgID0gKENsYXNzRmlsZUluZm8pIGNsYXNzRmlsZUluZm9NYXAuZ2V0KHRvcExldmVsQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodG9wTGV2ZWxDbGFzc0luZm8gIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiB0b3BMZXZlbENsYXNzSW5mby5hYnNvbHV0ZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJEZWxldGluZyBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdG9wTGV2ZWxDbGFzc0luZm8uYWJzb2x1dGVGaWxlLmdldFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNpbmNlIG9uZSBvZiBpdHMgaW5uZXIgY2xhc3NlcyB3YXMgcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgdG9wTGV2ZWxDbGFzc0luZm8uYWJzb2x1dGVGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc3VyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gZGVsZXRlQWZmZWN0ZWRGaWxlcyh0b3BMZXZlbENsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIHdhcm4gd2hlbiBhIGNsYXNzIGlzIG91dCBvZiBkYXRlLCBidXQgbm90IGRlbGV0ZWQgYXMgaXRzIHNvdXJjZSBpcyB1bmtub3duLgorICAgICAqIE1TR19XQVJOIGlzIHRoZSBub3JtYWwgbGV2ZWwsIGJ1dCB3ZSBkb3duZ3JhZGUgdG8gTVNHX1ZFUkJPU0UgZm9yIFJNSSBmaWxlcworICAgICAqIGlmIHtAbGluayAjd2Fybk9uUm1pU3R1YnMgaXMgZmFsc2V9CisgICAgICogQHBhcmFtIGFmZmVjdGVkQ2xhc3NJbmZvIGluZm8gYWJvdXQgdGhlIGFmZmVjdGQgY2xhc3MKKyAgICAgKiBAcGFyYW0gYWZmZWN0ZWRDbGFzcyB0aGUgbmFtZSBvZiB0aGUgYWZmZWN0ZWQgLmNsYXNzIGZpbGUKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBmaWxlIHRoYXQgaXMgdHJpZ2dlcmluZyB0aGUgb3V0IG9mIGRhdGVuZXNzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdhcm5PdXRPZkRhdGVCdXROb3REZWxldGVkKAorICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBhZmZlY3RlZENsYXNzSW5mbywgU3RyaW5nIGFmZmVjdGVkQ2xhc3MsCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIGlmIChhZmZlY3RlZENsYXNzSW5mby5pc1VzZXJXYXJuZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgbGV2ZWwgPSBQcm9qZWN0Lk1TR19XQVJOOworICAgICAgICBpZiAoIXdhcm5PblJtaVN0dWJzKSB7CisgICAgICAgICAgICAvL2Rvd25ncmFkZSB3YXJuaW5ncyBvbiBSTUkgc3R1Ymxpa2UgY2xhc3NlcywgYXMgdGhleSBhcmUgZ2VuZXJhdGVkCisgICAgICAgICAgICAvL2J5IHJtaWMsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gdGVsbCB0aGUgdXNlciB0aGF0IHRoZWlyIHNvdXJjZSBpcworICAgICAgICAgICAgLy9taXNzaW5nLgorICAgICAgICAgICAgaWYgKGlzUm1pU3R1YihhZmZlY3RlZENsYXNzLCBjbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBQcm9qZWN0Lk1TR19WRVJCT1NFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZygiVGhlIGNsYXNzICIgKyBhZmZlY3RlZENsYXNzICsgIiBpbiBmaWxlICIKKyAgICAgICAgICAgICsgYWZmZWN0ZWRDbGFzc0luZm8uYWJzb2x1dGVGaWxlLmdldFBhdGgoKQorICAgICAgICAgICAgKyAiIGlzIG91dCBvZiBkYXRlIGR1ZSB0byAiICsgY2xhc3NOYW1lCisgICAgICAgICAgICArICIgYnV0IGhhcyBub3QgYmVlbiBkZWxldGVkIGJlY2F1c2UgaXRzIHNvdXJjZSBmaWxlIgorICAgICAgICAgICAgKyAiIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIiwgbGV2ZWwpOworICAgICAgICBhZmZlY3RlZENsYXNzSW5mby5pc1VzZXJXYXJuZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgZm9yIGJlaW5nIGFuIFJNSSBzdHViCisgICAgICogQHBhcmFtIGFmZmVjdGVkQ2xhc3MgIGNsYXNzIGJlaW5nIHRlc3RlZAorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgICAgICBwb3NzaWJsZSBvcmlnaW4gb2YgdGhlIFJNSSBzdHViCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBjbGFzcyBhZmZlY3RlZENsYXNzIGlzIGEgUk1JIHN0dWIKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNSbWlTdHViKFN0cmluZyBhZmZlY3RlZENsYXNzLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHJldHVybiBpc1N0dWIoYWZmZWN0ZWRDbGFzcywgY2xhc3NOYW1lLCBEZWZhdWx0Um1pY0FkYXB0ZXIuUk1JX1NUVUJfU1VGRklYKQorICAgICAgICAgICAgICAgIHx8IGlzU3R1YihhZmZlY3RlZENsYXNzLCBjbGFzc05hbWUsIERlZmF1bHRSbWljQWRhcHRlci5STUlfU0tFTF9TVUZGSVgpCisgICAgICAgICAgICAgICAgfHwgaXNTdHViKGFmZmVjdGVkQ2xhc3MsIGNsYXNzTmFtZSwgV0xSbWljLlJNSV9TVFVCX1NVRkZJWCkKKyAgICAgICAgICAgICAgICB8fCBpc1N0dWIoYWZmZWN0ZWRDbGFzcywgY2xhc3NOYW1lLCBXTFJtaWMuUk1JX1NLRUxfU1VGRklYKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdHViKFN0cmluZyBhZmZlY3RlZENsYXNzLCBTdHJpbmcgYmFzZUNsYXNzLCBTdHJpbmcgc3VmZml4KSB7CisgICAgICAgIHJldHVybiAoYmFzZUNsYXNzICsgc3VmZml4KS5lcXVhbHMoYWZmZWN0ZWRDbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcCB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBsb2FkZWQgZnJvbSB0aGUgY2xhc3NlcyB0byB0aGUgQW50IGxvZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkdW1wRGVwZW5kZW5jaWVzKCkgeworICAgICAgICBsb2coIlJldmVyc2UgRGVwZW5kZW5jeSBEdW1wIGZvciAiICsgYWZmZWN0ZWRDbGFzc01hcC5zaXplKCkKKyAgICAgICAgICAgICsgIiBjbGFzc2VzOiIsIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICBFbnVtZXJhdGlvbiBjbGFzc0VudW0gPSBhZmZlY3RlZENsYXNzTWFwLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKGNsYXNzRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGNsYXNzRW51bS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgbG9nKCIgQ2xhc3MgIiArIGNsYXNzTmFtZSArICIgYWZmZWN0czoiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICBIYXNodGFibGUgYWZmZWN0ZWRDbGFzc2VzCisgICAgICAgICAgICAgICAgPSAoSGFzaHRhYmxlKSBhZmZlY3RlZENsYXNzTWFwLmdldChjbGFzc05hbWUpOworICAgICAgICAgICAgRW51bWVyYXRpb24gYWZmZWN0ZWRDbGFzc0VudW0gPSBhZmZlY3RlZENsYXNzZXMua2V5cygpOworICAgICAgICAgICAgd2hpbGUgKGFmZmVjdGVkQ2xhc3NFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFmZmVjdGVkQ2xhc3MgPSAoU3RyaW5nKSBhZmZlY3RlZENsYXNzRW51bS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIENsYXNzRmlsZUluZm8gaW5mbworICAgICAgICAgICAgICAgICAgICA9IChDbGFzc0ZpbGVJbmZvKSBhZmZlY3RlZENsYXNzZXMuZ2V0KGFmZmVjdGVkQ2xhc3MpOworICAgICAgICAgICAgICAgIGxvZygiICAgICIgKyBhZmZlY3RlZENsYXNzICsgIiBpbiAiCisgICAgICAgICAgICAgICAgICAgICsgaW5mby5hYnNvbHV0ZUZpbGUuZ2V0UGF0aCgpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xhc3NwYXRoRGVwZW5kZW5jaWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiQ2xhc3NwYXRoIGZpbGUgZGVwZW5kZW5jaWVzIChGb3J3YXJkKToiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGNsYXNzcGF0aEVudW0gPSBjbGFzc3BhdGhEZXBlbmRlbmNpZXMua2V5cygpOworICAgICAgICAgICAgd2hpbGUgKGNsYXNzcGF0aEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgY2xhc3NwYXRoRW51bS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGxvZygiIENsYXNzICIgKyBjbGFzc05hbWUgKyAiIGRlcGVuZHMgb246IiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgPSAoSGFzaHRhYmxlKSBjbGFzc3BhdGhEZXBlbmRlbmNpZXMuZ2V0KGNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBjbGFzc3BhdGhGaWxlRW51bSA9IGRlcGVuZGVuY2llcy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChjbGFzc3BhdGhGaWxlRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGNsYXNzcGF0aEZpbGUgPSAoRmlsZSkgY2xhc3NwYXRoRmlsZUVudW0ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCIgICAgIiArIGNsYXNzcGF0aEZpbGUuZ2V0UGF0aCgpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRldGVybWluZU91dE9mRGF0ZUNsYXNzZXMoKSB7CisgICAgICAgIG91dE9mRGF0ZUNsYXNzZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjUGF0aExpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgc3JjRGlyID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKHNyY1BhdGhMaXN0W2ldKTsKKyAgICAgICAgICAgIGlmIChzcmNEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gdGhpcy5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0Rpcik7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgICAgICAgICAgc2NhbkRpcihzcmNEaXIsIGZpbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBjaGVjayBjbGFzc3BhdGggZmlsZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgaWYgKGNsYXNzcGF0aERlcGVuZGVuY2llcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBFbnVtZXJhdGlvbiBjbGFzc3BhdGhEZXBzRW51bSA9IGNsYXNzcGF0aERlcGVuZGVuY2llcy5rZXlzKCk7CisgICAgICAgIHdoaWxlIChjbGFzc3BhdGhEZXBzRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGNsYXNzcGF0aERlcHNFbnVtLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAob3V0T2ZEYXRlQ2xhc3Nlcy5jb250YWluc0tleShjbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDbGFzc0ZpbGVJbmZvIGluZm8KKyAgICAgICAgICAgICAgICA9IChDbGFzc0ZpbGVJbmZvKSBjbGFzc0ZpbGVJbmZvTWFwLmdldChjbGFzc05hbWUpOworCisgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG5vIGluZm8gYWJvdXQgdGhlIGNsYXNzIC0gaXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIGFscmVhZHkgYW5kIHdlCisgICAgICAgICAgICAvLyBhcmUgdXNpbmcgY2FjaGVkIGluZm8uCisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICAgICA9IChIYXNodGFibGUpIGNsYXNzcGF0aERlcGVuZGVuY2llcy5nZXQoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUyID0gZGVwZW5kZW5jaWVzLmVsZW1lbnRzKCk7IGUyLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGNsYXNzcGF0aEZpbGUgPSAoRmlsZSkgZTIubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEZpbGUubGFzdE1vZGlmaWVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID4gaW5mby5hYnNvbHV0ZUZpbGUubGFzdE1vZGlmaWVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ2xhc3MgIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBvdXQgb2YgZGF0ZSB3aXRoIHJlc3BlY3QgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NwYXRoRmlsZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2ZEYXRlQ2xhc3Nlcy5wdXQoY2xhc3NOYW1lLCBjbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSB3b3JrLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgaWYgKHNyY1BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcmNQYXRoTGlzdCA9IHNyY1BhdGgubGlzdCgpOworICAgICAgICAgICAgaWYgKHNyY1BhdGhMaXN0Lmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmNkaXIgYXR0cmlidXRlIG11c3QgYmUgbm9uLWVtcHR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZXN0UGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdFBhdGggPSBzcmNQYXRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FjaGUgIT0gbnVsbCAmJiBjYWNoZS5leGlzdHMoKSAmJiAhY2FjaGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGNhY2hlLCBpZiBzcGVjaWZpZWQsIG11c3QgIgorICAgICAgICAgICAgICAgICAgICArICJwb2ludCB0byBhIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FjaGUgIT0gbnVsbCAmJiAhY2FjaGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBjYWNoZS5ta2RpcnMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV0ZXJtaW5lRGVwZW5kZW5jaWVzKCk7CisgICAgICAgICAgICBpZiAoZHVtcCkgeworICAgICAgICAgICAgICAgIGR1bXBEZXBlbmRlbmNpZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldGVybWluZU91dE9mRGF0ZUNsYXNzZXMoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGRlbGV0ZUFsbEFmZmVjdGVkRmlsZXMoKTsKKworICAgICAgICAgICAgbG9uZyBkdXJhdGlvbiA9IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSAvIE9ORV9TRUNPTkQ7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBzdW1tYXJ5TG9nTGV2ZWw7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgc3VtbWFyeUxvZ0xldmVsID0gUHJvamVjdC5NU0dfSU5GTzsKKyAgICAgICAgICAgIH0gIGVsc2UgeworICAgICAgICAgICAgICAgIHN1bW1hcnlMb2dMZXZlbCA9IFByb2plY3QuTVNHX0RFQlVHOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2coIkRlbGV0ZWQgIiArIGNvdW50ICsgIiBvdXQgb2YgZGF0ZSBmaWxlcyBpbiAiCisgICAgICAgICAgICAgICAgKyBkdXJhdGlvbiArICIgc2Vjb25kcyIsIHN1bW1hcnlMb2dMZXZlbCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FucyB0aGUgZGlyZWN0b3J5IGxvb2tpbmcgZm9yIHNvdXJjZSBmaWxlcyB0aGF0IGFyZSBuZXdlciB0aGFuCisgICAgICogdGhlaXIgY2xhc3MgZmlsZXMuIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiB0aGUgY2xhc3MgdmFyaWFibGUKKyAgICAgKiBjb21waWxlTGlzdAorICAgICAqCisgICAgICogQHBhcmFtIHNyY0RpciB0aGUgc291cmNlIGRpcmVjdG9yeQorICAgICAqIEBwYXJhbSBmaWxlcyB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyIHdoaWNoIGFyZSB0byBiZQorICAgICAqICAgICAgY2hlY2tlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuRGlyKEZpbGUgc3JjRGlyLCBTdHJpbmdbXSBmaWxlcykgeworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0RpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVuZHNXaXRoKCIuamF2YSIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gc3JjRmlsZS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICA9IGZpbGVQYXRoLnN1YnN0cmluZyhzcmNEaXIuZ2V0UGF0aCgpLmxlbmd0aCgpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoLmxlbmd0aCgpIC0gIi5qYXZhIi5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gQ2xhc3NGaWxlVXRpbHMuY29udmVydFNsYXNoTmFtZShjbGFzc05hbWUpOworICAgICAgICAgICAgICAgIENsYXNzRmlsZUluZm8gaW5mbworICAgICAgICAgICAgICAgICAgICA9IChDbGFzc0ZpbGVJbmZvKSBjbGFzc0ZpbGVJbmZvTWFwLmdldChjbGFzc05hbWUpOworICAgICAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgd2FzIG5vIGNsYXNzIGZpbGUuIGFkZCB0aGlzIGNsYXNzIHRvIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgICAgIG91dE9mRGF0ZUNsYXNzZXMucHV0KGNsYXNzTmFtZSwgY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgPiBpbmZvLmFic29sdXRlRmlsZS5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2ZEYXRlQ2xhc3Nlcy5wdXQoY2xhc3NOYW1lLCBjbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgY2xhc3MgZmlsZXMgd2UgYXJlIGdvaW5nIHRvIGFuYWx5c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NMb2NhdGlvbnMgYSBwYXRoIHN0cnVjdHVyZSBjb250YWluaW5nIGFsbCB0aGUgZGlyZWN0b3JpZXMKKyAgICAgKiAgICAgIHdoZXJlIGNsYXNzZXMgY2FuIGJlIGZvdW5kLgorICAgICAqIEByZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgY2xhc3NlcyB0byBhbmFseXNlLgorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIGdldENsYXNzRmlsZXMoUGF0aCBjbGFzc0xvY2F0aW9ucykgeworICAgICAgICAvLyBicmVhayB0aGUgY2xhc3NMb2NhdGlvbnMgaW50byBpdHMgY29tcG9uZW50cy4KKyAgICAgICAgU3RyaW5nW10gY2xhc3NMb2NhdGlvbnNMaXN0ID0gY2xhc3NMb2NhdGlvbnMubGlzdCgpOworCisgICAgICAgIFZlY3RvciBjbGFzc0ZpbGVMaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NMb2NhdGlvbnNMaXN0Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGNsYXNzTG9jYXRpb25zTGlzdFtpXSk7CisgICAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBhZGRDbGFzc0ZpbGVzKGNsYXNzRmlsZUxpc3QsIGRpciwgZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjbGFzc0ZpbGVMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIHNvdXJjZSBmaWxlIGZvciBhIGdpdmVuIGNsYXNzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBjbGFzc25hbWUgaW4gc2xhc2ggZm9ybWF0LgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlS25vd25Ub0V4aXN0IGlmIG5vdCBudWxsLCBhIGZpbGUgYWxyZWFkeSBrbm93biB0byBleGlzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYXZlcyBjYWxsIHRvIC5leGlzdHMoKSkKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZmluZFNvdXJjZUZpbGUoU3RyaW5nIGNsYXNzbmFtZSwgRmlsZSBzb3VyY2VGaWxlS25vd25Ub0V4aXN0KSB7CisgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlbmFtZTsKKyAgICAgICAgaW50IGlubmVySW5kZXggPSBjbGFzc25hbWUuaW5kZXhPZigiJCIpOworICAgICAgICBpZiAoaW5uZXJJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgc291cmNlRmlsZW5hbWUgPSBjbGFzc25hbWUuc3Vic3RyaW5nKDAsIGlubmVySW5kZXgpICsgIi5qYXZhIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNvdXJjZUZpbGVuYW1lID0gY2xhc3NuYW1lICsgIi5qYXZhIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlYXJjaCB0aGUgdmFyaW91cyBzb3VyY2UgcGF0aCBlbnRyaWVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjUGF0aExpc3QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNyY1BhdGhMaXN0W2ldLCBzb3VyY2VGaWxlbmFtZSk7CisgICAgICAgICAgICBpZiAoc291cmNlRmlsZS5lcXVhbHMoc291cmNlRmlsZUtub3duVG9FeGlzdCkgfHwgc291cmNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VGaWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgbGlzdCBvZiBjbGFzcyBmaWxlcyBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkgdG8gdGhlIGNsYXNzCisgICAgICogZmlsZSB2ZWN0b3IsIGluY2x1ZGluZyBhbnkgc3ViZGlyZWN0b3JpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NGaWxlTGlzdCBhIGxpc3Qgb2YgQ2xhc3NGaWxlSW5mbyBvYmplY3RzIGZvciBhbGwgdGhlCisgICAgICogICAgICBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHRyZWUKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgdHJlZSB0byBiZSBzZWFyY2hlZCwgcmVjdXJzaXZlbHksIGZvciBjbGFzcworICAgICAqICAgICAgZmlsZXMKKyAgICAgKiBAcGFyYW0gcm9vdCB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUKKyAgICAgKiAgICAgIHRoZSBhYnNvbHV0ZSBjbGFzcyBuYW1lIGZyb20gdGhlIHJlbGF0aXZlIHBvc2l0aW9uIGluIHRoZQorICAgICAqICAgICAgc291cmNlIHRyZWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkQ2xhc3NGaWxlcyhWZWN0b3IgY2xhc3NGaWxlTGlzdCwgRmlsZSBkaXIsIEZpbGUgcm9vdCkgeworICAgICAgICBTdHJpbmdbXSBmaWxlc0luRGlyID0gZGlyLmxpc3QoKTsKKworICAgICAgICBpZiAoZmlsZXNJbkRpciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGxlbmd0aCA9IGZpbGVzSW5EaXIubGVuZ3RoOworCisgICAgICAgIGludCByb290TGVuZ3RoID0gcm9vdC5nZXRQYXRoKCkubGVuZ3RoKCk7CisgICAgICAgIEZpbGUgc291cmNlRmlsZUtub3duVG9FeGlzdCA9IG51bGw7IC8vIHNwZWVkIG9wdGltaXphdGlvbgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGVzSW5EaXJbaV0pOworICAgICAgICAgICAgaWYgKGZpbGVzSW5EaXJbaV0uZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBpbmZvID0gbmV3IENsYXNzRmlsZUluZm8oKTsKKyAgICAgICAgICAgICAgICBpbmZvLmFic29sdXRlRmlsZSA9IGZpbGU7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlTmFtZSA9IGZpbGUuZ2V0UGF0aCgpLnN1YnN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcm9vdExlbmd0aCArIDEsCisgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGF0aCgpLmxlbmd0aCgpIC0gIi5jbGFzcyIubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGluZm8uY2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICAgID0gQ2xhc3NGaWxlVXRpbHMuY29udmVydFNsYXNoTmFtZShyZWxhdGl2ZU5hbWUpOworICAgICAgICAgICAgICAgIGluZm8uc291cmNlRmlsZSA9IHNvdXJjZUZpbGVLbm93blRvRXhpc3QgPSBmaW5kU291cmNlRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVOYW1lLCBzb3VyY2VGaWxlS25vd25Ub0V4aXN0KTsKKyAgICAgICAgICAgICAgICBjbGFzc0ZpbGVMaXN0LmFkZEVsZW1lbnQoaW5mbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkZENsYXNzRmlsZXMoY2xhc3NGaWxlTGlzdCwgZmlsZSwgcm9vdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3JpZXMgcGF0aCB0byBmaW5kIHRoZSBKYXZhIHNvdXJjZSBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmNQYXRoIHRoZSBzb3VyY2UgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY2RpcihQYXRoIHNyY1BhdGgpIHsKKyAgICAgICAgdGhpcy5zcmNQYXRoID0gc3JjUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgY29tcGlsZWQgSmF2YSBmaWxlcyBleGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXN0UGF0aCB0aGUgZGVzdGluYXRpb24gYXJlYXMgd2hlcmUgYnVpbGQgZmlsZXMgYXJlIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0RGlyKFBhdGggZGVzdFBhdGgpIHsKKyAgICAgICAgdGhpcy5kZXN0UGF0aCA9IGRlc3RQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlcGVuZGVuY3kgY2FjaGUgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWNoZSB0aGUgZGVwZW5kZW5jeSBjYWNoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGUoRmlsZSBjYWNoZSkgeworICAgICAgICB0aGlzLmNhY2hlID0gY2FjaGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgYXJlIGZvbGxvd2VkIHVudGlsIHRoZQorICAgICAqIGNsb3N1cmUgb2YgdGhlIGRlcGVuZGVuY3kgc2V0IGlmIHJlYWNoZWQuCisgICAgICogV2hlbiBub3Qgc2V0LCB0aGUgZGVwZW5kIHRhc2sgd2lsbCBvbmx5IGZvbGxvdworICAgICAqIGRpcmVjdCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsb3N1cmUgaW5kaWNhdGUgaWYgZGVwZW5kZW5jeSBjbG9zdXJlIGlzIHJlcXVpcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsb3N1cmUoYm9vbGVhbiBjbG9zdXJlKSB7CisgICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gd2lsbCBiZSB3cml0dGVuCisgICAgICogdG8gdGhlIGRlYnVnIGxldmVsIGxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdW1wIHNldCB0byB0cnVlIHRvIGR1bXAgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiB0byB0aGUgbG9nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHVtcChib29sZWFuIGR1bXApIHsKKyAgICAgICAgdGhpcy5kdW1wID0gZHVtcDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EaXJlY3RvcnlJdGVyYXRvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0RpcmVjdG9yeUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmMjQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EaXJlY3RvcnlJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiBBbiBpdGVyYXRvciB3aGljaCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBjb250ZW50cyBvZiBhIGphdmEgZGlyZWN0b3J5LiBUaGUKKyAqIGl0ZXJhdG9yIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggdGhlIGRpcmVjdG9yeSBhdCB0aGUgcm9vdCBvZiB0aGUgSmF2YQorICogbmFtZXNwYWNlLgorICoKKyAqLworcHVibGljIGNsYXNzIERpcmVjdG9yeUl0ZXJhdG9yIGltcGxlbWVudHMgQ2xhc3NGaWxlSXRlcmF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHN0YWNrIG9mIGN1cnJlbnQgaXRlcmF0b3JzIHN1cHBvcnRpbmcgdGhlIGRlcHRoIGZpcnN0CisgICAgICogdHJhdmVyc2FsIG9mIHRoZSBkaXJlY3RvcnkgdHJlZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0YWNrIGVudW1TdGFjazsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBpdGVyYXRvci4gQXMgZGlyZWN0b3JpZXMgZW5jb3VudGVyIGxvd2VyIGxldmVsCisgICAgICogZGlyZWN0b3JpZXMsIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIHB1c2hlZCBvbnRvIHRoZSBpdGVyYXRvciBzdGFjaworICAgICAqIGFuZCBhIG5ldyBpdGVyYXRvciBvdmVyIHRoZSBzdWIgZGlyZWN0b3J5IGJlY29tZXMgdGhlIGN1cnJlbnQKKyAgICAgKiBkaXJlY3RvcnkuIFRoaXMgaW1wbGVtZW50cyBhIGRlcHRoIGZpcnN0IHRyYXZlcnNhbCBvZiB0aGUgZGlyZWN0b3J5CisgICAgICogbmFtZXNwYWNlLgorICAgICAqLworICAgIHByaXZhdGUgRW51bWVyYXRpb24gY3VycmVudEVudW07CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZGlyZWN0b3J5IGl0ZXJhdG9yLiBUaGUgZGlyZWN0b3J5IGl0ZXJhdG9yIGlzIGNyZWF0ZWQgdG8KKyAgICAgKiBzY2FuIHRoZSByb290IGRpcmVjdG9yeS4gSWYgdGhlIGNoYW5nZUludG8gZmxhZyBpcyBnaXZlbiwgdGhlbiB0aGUKKyAgICAgKiBlbnRyaWVzIHJldHVybmVkIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcyBkaXJlY3RvcnkgYW5kIG5vdCB0aGUKKyAgICAgKiBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290RGlyZWN0b3J5IHRoZSByb290IGlmIHRoZSBkaXJlY3RvcnkgbmFtZXNwYWNlIHdoaWNoIGlzIHRvCisgICAgICogICAgICBiZSBpdGVyYXRlZCBvdmVyCisgICAgICogQHBhcmFtIGNoYW5nZUludG8gaWYgdHJ1ZSB0aGVuIHRoZSByZXR1cm5lZCBlbnRyaWVzIHdpbGwgYmUgcmVsYXRpdmUKKyAgICAgKiAgICAgIHRvIHRoZSByb290RGlyZWN0b3J5IGFuZCBub3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGRpcmVjdG9yeQorICAgICAqICAgICAgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIERpcmVjdG9yeUl0ZXJhdG9yKEZpbGUgcm9vdERpcmVjdG9yeSwgYm9vbGVhbiBjaGFuZ2VJbnRvKQorICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoKTsKKworICAgICAgICBlbnVtU3RhY2sgPSBuZXcgU3RhY2soKTsKKworICAgICAgICBWZWN0b3IgZmlsZXNJblJvb3QgPSBnZXREaXJlY3RvcnlFbnRyaWVzKHJvb3REaXJlY3RvcnkpOworCisgICAgICAgIGN1cnJlbnRFbnVtID0gZmlsZXNJblJvb3QuZWxlbWVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSB2ZWN0b3IgY292ZXJpbmcgYWxsIHRoZSBlbnRyaWVzIChmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgaW4gYQorICAgICAqIGRpcmVjdG9yeSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IHRoZSBkaXJlY3RvcnkgdG8gYmUgc2Nhbm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgdmVjdG9yIGNvbnRhaW5pbmcgRmlsZSBvYmplY3RzIGZvciBlYWNoIGVudHJ5IGluIHRoZQorICAgICAqICAgICAgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIGdldERpcmVjdG9yeUVudHJpZXMoRmlsZSBkaXJlY3RvcnkpIHsKKyAgICAgICAgVmVjdG9yIGZpbGVzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIC8vIEZpbGVbXSBmaWxlc0luRGlyID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOworICAgICAgICBTdHJpbmdbXSBmaWxlc0luRGlyID0gZGlyZWN0b3J5Lmxpc3QoKTsKKworICAgICAgICBpZiAoZmlsZXNJbkRpciAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gZmlsZXNJbkRpci5sZW5ndGg7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmaWxlcy5hZGRFbGVtZW50KG5ldyBGaWxlKGRpcmVjdG9yeSwgZmlsZXNJbkRpcltpXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlIG1ldGhvZCB0byBhbGxvdyBzdWJjbGFzc2VzIHRvIHN1cHBseSBlbGVtZW50cyBmb3IgdGhlCisgICAgICogaXRlcmF0aW9uLiBUaGUgZGlyZWN0b3J5IGl0ZXJhdG9yIG1haW50YWlucyBhIHN0YWNrIG9mIGl0ZXJhdG9ycworICAgICAqIGNvdmVyaW5nIGVhY2ggbGV2ZWwgaW4gdGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkuIFRoZSBjdXJyZW50IGl0ZXJhdG9yCisgICAgICogY292ZXJzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWluZyBzY2FubmVkLiBJZiB0aGUgbmV4dCBlbnRyeSBpbiB0aGF0CisgICAgICogZGlyZWN0b3J5IGlzIGEgc3ViZGlyZWN0b3J5LCB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBwdXNoZWQgb250byB0aGUKKyAgICAgKiBzdGFjayBhbmQgYSBuZXcgaXRlcmF0b3IgaXMgY3JlYXRlZCBmb3IgdGhlIHN1YmRpcmVjdG9yeS4gSWYgdGhlCisgICAgICogZW50cnkgaXMgYSBmaWxlLCBpdCBpcyByZXR1cm5lZCBhcyB0aGUgbmV4dCBlbGVtZW50IGFuZCB0aGUgaXRlcmF0b3IKKyAgICAgKiByZW1haW5zIHZhbGlkLiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKKyAgICAgKiB0aGUgdG9wbW9zdCBpdGVyYXRvciBvbiB0aGUgc3RhY2sgaXMgcG9wcGVkIG9mZiB0byBiZWNvbWUgdGhlCisgICAgICogY3VycmVudCBpdGVyYXRvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgQ2xhc3NGaWxlIGluIHRoZSBpdGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIENsYXNzRmlsZSBnZXROZXh0Q2xhc3NGaWxlKCkgeworICAgICAgICBDbGFzc0ZpbGUgbmV4dEVsZW1lbnQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAobmV4dEVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGVsZW1lbnQgPSAoRmlsZSkgY3VycmVudEVudW0ubmV4dEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pc0RpcmVjdG9yeSgpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1c2ggdGhlIGN1cnJlbnQgaXRlcmF0b3Igb250byB0aGUgc3RhY2sgYW5kIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGlzIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW1TdGFjay5wdXNoKGN1cnJlbnRFbnVtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIGZpbGVzID0gZ2V0RGlyZWN0b3J5RW50cmllcyhlbGVtZW50KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVudW0gPSBmaWxlcy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgZmlsZS4gY3JlYXRlIGEgc3RyZWFtIGZvciBpdAorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluRmlsZVN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEZpbGVJbnB1dFN0cmVhbShlbGVtZW50KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgZGF0YSBpbnB1dCBzdHJlYW0gZnJvbSB0aGUgamFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlIGphdmFDbGFzcyA9IG5ldyBDbGFzc0ZpbGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFDbGFzcy5yZWFkKGluRmlsZVN0cmVhbSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudCA9IGphdmFDbGFzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLiBDYW4gd2UgcG9wIG9uZSBvZmYgdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgICAgIGlmIChlbnVtU3RhY2suZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RW51bSA9IChFbnVtZXJhdGlvbikgZW51bVN0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBuZXh0RWxlbWVudCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV4dEVsZW1lbnQ7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9KYXJGaWxlSXRlcmF0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9KYXJGaWxlSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzMxNWQyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0phckZpbGVJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKKworLyoqCisgKiBBIGNsYXNzIGZpbGUgaXRlcmF0b3Igd2hpY2ggaXRlcmF0ZXMgdGhyb3VnaCB0aGUgY29udGVudHMgb2YgYSBKYXZhIGphcgorICogZmlsZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKYXJGaWxlSXRlcmF0b3IgaW1wbGVtZW50cyBDbGFzc0ZpbGVJdGVyYXRvciB7CisgICAgLyoqIFRoZSBqYXIgc3RyZWFtIGZyb20gdGhlIGphciBmaWxlIGJlaW5nIGl0ZXJhdGVkIG92ZXIqLworICAgIHByaXZhdGUgWmlwSW5wdXRTdHJlYW0gamFyU3RyZWFtOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG92ZXIgYSBqYXIgc3RyZWFtCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIHRoZSBiYXNpYyBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCB0aGUgSmFyIGlzIHJlY2VpdmVkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgamFyIHN0cmVhbSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHB1YmxpYyBKYXJGaWxlSXRlcmF0b3IoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlcigpOworCisgICAgICAgIGphclN0cmVhbSA9IG5ldyBaaXBJbnB1dFN0cmVhbShzdHJlYW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmV4dCBDbGFzc0ZpbGUgb2JqZWN0IGZyb20gdGhlIGphcgorICAgICAqCisgICAgICogQHJldHVybiBhIENsYXNzRmlsZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY2xhc3MgZnJvbSB0aGUgamFyCisgICAgICovCisgICAgcHVibGljIENsYXNzRmlsZSBnZXROZXh0Q2xhc3NGaWxlKCkgeworICAgICAgICBaaXBFbnRyeSBqYXJFbnRyeTsKKyAgICAgICAgQ2xhc3NGaWxlIG5leHRFbGVtZW50ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamFyRW50cnkgPSBqYXJTdHJlYW0uZ2V0TmV4dEVudHJ5KCk7CisKKyAgICAgICAgICAgIHdoaWxlIChuZXh0RWxlbWVudCA9PSBudWxsICYmIGphckVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gamFyRW50cnkuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKCFqYXJFbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5TmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBkYXRhIGlucHV0IHN0cmVhbSBmcm9tIHRoZSBqYXIgaW5wdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgIENsYXNzRmlsZSBqYXZhQ2xhc3MgPSBuZXcgQ2xhc3NGaWxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzLnJlYWQoamFyU3RyZWFtKTsKKworICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudCA9IGphdmFDbGFzczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIGphckVudHJ5ID0gamFyU3RyZWFtLmdldE5leHRFbnRyeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRleHQgKz0gIjogIiArIG1lc3NhZ2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQcm9ibGVtIHJlYWRpbmcgSkFSIGZpbGU6ICIgKyB0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXh0RWxlbWVudDsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9DbGFzc0NQSW5mby5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9DbGFzc0NQSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYmJmYzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NsYXNzQ1BJbmZvLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sOworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUaGUgY29uc3RhbnQgcG9vbCBlbnRyeSB3aGljaCBzdG9yZXMgY2xhc3MgaW5mb3JtYXRpb24uCisgKgorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NDUEluZm8gZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MnIG5hbWUuIFRoaXMgd2lsbCBiZSBvbmx5IHZhbGlkIGlmIHRoZSBlbnRyeSBoYXMgYmVlbgorICAgICAqIHJlc29sdmVkIGFnYWluc3QgdGhlIGNvbnN0YW50IHBvb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50IHBvb2wgd2hlcmUgdGhpcyBjbGFzcycgbmFtZSBpcyBzdG9yZWQuIElmCisgICAgICogdGhlIGNsYXNzIG5hbWUgaXMgY2hhbmdlZCwgdGhpcyBlbnRyeSBpcyBpbnZhbGlkIHVudGlsIHRoaXMgZW50cnkgaXMKKyAgICAgKiBjb25uZWN0ZWQgdG8gYSBjb25zdGFudCBwb29sLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGluZGV4OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIFNldHMgdGhlIHRhZyB2YWx1ZSBmb3IgdGhpcyBlbnRyeSB0byB0eXBlIENsYXNzCisgICAgICovCisgICAgcHVibGljIENsYXNzQ1BJbmZvKCkgeworICAgICAgICBzdXBlcihDT05TVEFOVF9DTEFTUywgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgZW50cnkgZnJvbSBhIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcFN0cmVhbSB0aGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgdG8gYmUKKyAgICAgKiAgICAgIHJlYWQuCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5CisgICAgICogICAgICBmcm9tIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGluZGV4ID0gY3BTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKKyAgICAgICAgY2xhc3NOYW1lID0gInVucmVzb2x2ZWQiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGEgc3RyaW5nIHJlYWRhYmxlIHZlcnNpb24gb2YgdGhpcyBlbnRyeQorICAgICAqCisgICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJDbGFzcyBDb25zdGFudCBQb29sIEVudHJ5IGZvciAiICsgY2xhc3NOYW1lICsgIlsiICsgaW5kZXggKyAiXSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSB0aGlzIGNsYXNzIGluZm8gYWdhaW5zdCB0aGUgZ2l2ZW4gY29uc3RhbnQgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdGFudFBvb2wgdGhlIGNvbnN0YW50IHBvb2wgd2l0aCB3aGljaCB0byByZXNvbHZlIHRoZQorICAgICAqICAgICAgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzb2x2ZShDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7CisgICAgICAgIGNsYXNzTmFtZSA9ICgoVXRmOENQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGluZGV4KSkuZ2V0VmFsdWUoKTsKKworICAgICAgICBzdXBlci5yZXNvbHZlKGNvbnN0YW50UG9vbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGFzcyBuYW1lIG9mIHRoaXMgZW50cnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcycgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudENQSW5mby5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudENQSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDM0MjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50Q1BJbmZvLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sOworCisvKioKKyAqIEEgQ29uc3RhbnQgUG9vbCBlbnRyeSB3aGljaCByZXByZXNlbnRzIGEgY29uc3RhbnQgdmFsdWUuCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnRDUEluZm8gZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW50cnkncyB1bnR5cGVkIHZhbHVlLiBFYWNoIHN1YmNsYXNzIGludGVycHJldHMgdGhlIGNvbnN0YW50CisgICAgICogdmFsdWUgYmFzZWQgb24gdGhlIHN1YmNsYXNzJ3MgdHlwZS4gVGhlIHZhbHVlIGhlcmUgbXVzdCBiZQorICAgICAqIGNvbXBhdGlibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBjb25zdGFudCBlbnRyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWdWYWx1ZSB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeSB0eXBlIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIGVudHJpZXMgdGhlIG51bWJlciBvZiBjb25zdGFudCBwb29sIGVudHJ5IHNsb3RzIG9jY3VwaWVkIGJ5CisgICAgICogICAgICB0aGlzIGVudHJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBDb25zdGFudENQSW5mbyhpbnQgdGFnVmFsdWUsIGludCBlbnRyaWVzKSB7CisgICAgICAgIHN1cGVyKHRhZ1ZhbHVlLCBlbnRyaWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCAodW50eXBlZCkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29uc3RhbnQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB1bnR5cGVkIHZhbHVlIG9mIHRoaXMgY29uc3RhbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvQ29uc3RhbnRQb29sLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50UG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTI0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50UG9vbC5qYXZhCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogVGhlIGNvbnN0YW50IHBvb2wgb2YgYSBKYXZhIGNsYXNzLiBUaGUgY29uc3RhbnQgcG9vbCBpcyBhIGNvbGxlY3Rpb24gb2YKKyAqIGNvbnN0YW50cyB1c2VkIGluIGEgSmF2YSBjbGFzcyBmaWxlLiBJdCBzdG9yZXMgc3RyaW5ncywgY29uc3RhbnQgdmFsdWVzLAorICogY2xhc3MgbmFtZXMsIG1ldGhvZCBuYW1lcywgZmllbGQgbmFtZXMgZXRjLgorICoKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3Ztc3BlYy8iPlRoZSBKYXZhIFZpcnR1YWwKKyAqICAgICAgTWFjaGluZSBTcGVjaWZpY2F0aW9uPC9hPgorICovCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRQb29sIHsKKworICAgIC8qKiBUaGUgZW50cmllcyBpbiB0aGUgY29uc3RhbnQgcG9vbC4gKi8KKyAgICBwcml2YXRlIFZlY3RvciBlbnRyaWVzOworCisgICAgLyoqCisgICAgICogQSBIYXNodGFibGUgb2YgVVRGOCBlbnRyaWVzIC0gdXNlZCB0byBnZXQgY29uc3RhbnQgcG9vbCBpbmRleGVzIG9mCisgICAgICogdGhlIFVURjggdmFsdWVzIHF1aWNrbHkKKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSB1dGY4SW5kZXhlczsKKworICAgIC8qKiBJbml0aWFsaXNlIHRoZSBjb25zdGFudCBwb29sLiAqLworICAgIHB1YmxpYyBDb25zdGFudFBvb2woKSB7CisgICAgICAgIGVudHJpZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgLy8gVGhlIHplcm8gaW5kZXggaXMgbmV2ZXIgcHJlc2VudCBpbiB0aGUgY29uc3RhbnQgcG9vbCBpdHNlbGYgc28KKyAgICAgICAgLy8gd2UgYWRkIGEgbnVsbCBlbnRyeSBmb3IgaXQKKyAgICAgICAgZW50cmllcy5hZGRFbGVtZW50KG51bGwpOworCisgICAgICAgIHV0ZjhJbmRleGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNvbnN0YW50IHBvb2wgZnJvbSBhIGNsYXNzIGlucHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc1N0cmVhbSB0aGUgRGF0YUlucHV0U3RyZWFtIG9mIGEgY2xhc3MgZmlsZS4KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBjb25zdGFudCBwb29sCisgICAgICogICAgICBmcm9tIHRoZSBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjbGFzc1N0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IG51bUVudHJpZXMgPSBjbGFzc1N0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtRW50cmllczspIHsKKyAgICAgICAgICAgIENvbnN0YW50UG9vbEVudHJ5IG5leHRFbnRyeQorICAgICAgICAgICAgICAgICA9IENvbnN0YW50UG9vbEVudHJ5LnJlYWRFbnRyeShjbGFzc1N0cmVhbSk7CisKKyAgICAgICAgICAgIGkgKz0gbmV4dEVudHJ5LmdldE51bUVudHJpZXMoKTsKKworICAgICAgICAgICAgYWRkRW50cnkobmV4dEVudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbnN0YW50IHBvb2wKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBlbnRyaWVzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZW50cnkgdG8gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50cnkgdGhlIG5ldyBlbnRyeSB0byBiZSBhZGRlZCB0byB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudCBwb29sIGF0IHdoaWNoIHRoZSBlbnRyeSBpcworICAgICAqICAgICAgc3RvcmVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgYWRkRW50cnkoQ29uc3RhbnRQb29sRW50cnkgZW50cnkpIHsKKyAgICAgICAgaW50IGluZGV4ID0gZW50cmllcy5zaXplKCk7CisKKyAgICAgICAgZW50cmllcy5hZGRFbGVtZW50KGVudHJ5KTsKKworICAgICAgICBpbnQgbnVtU2xvdHMgPSBlbnRyeS5nZXROdW1FbnRyaWVzKCk7CisKKyAgICAgICAgLy8gYWRkIG51bGwgZW50cmllcyBmb3IgYW55IGFkZGl0aW9uYWwgc2xvdHMgcmVxdWlyZWQuCisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtU2xvdHMgLSAxOyArK2opIHsKKyAgICAgICAgICAgIGVudHJpZXMuYWRkRWxlbWVudChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIFV0ZjhDUEluZm8pIHsKKyAgICAgICAgICAgIFV0ZjhDUEluZm8gdXRmOEluZm8gPSAoVXRmOENQSW5mbykgZW50cnk7CisKKyAgICAgICAgICAgIHV0ZjhJbmRleGVzLnB1dCh1dGY4SW5mby5nZXRWYWx1ZSgpLCBuZXcgSW50ZWdlcihpbmRleCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgdGhlIGVudHJpZXMgaW4gdGhlIGNvbnN0YW50IHBvb2wuIFJlc29sdXRpb24gb2YgdGhlIGNvbnN0YW50CisgICAgICogcG9vbCBpbnZvbHZlcyB0cmFuc2Zvcm1pbmcgaW5kZXhlcyB0byBvdGhlciBjb25zdGFudCBwb29sIGVudHJpZXMKKyAgICAgKiBpbnRvIHRoZSBhY3R1YWwgZGF0YSBmb3IgdGhhdCBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlKCkgeworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGkgPSBlbnRyaWVzLmVsZW1lbnRzKCk7IGkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBDb25zdGFudFBvb2xFbnRyeSBwb29sSW5mbyA9IChDb25zdGFudFBvb2xFbnRyeSkgaS5uZXh0RWxlbWVudCgpOworCisgICAgICAgICAgICBpZiAocG9vbEluZm8gIT0gbnVsbCAmJiAhcG9vbEluZm8uaXNSZXNvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgcG9vbEluZm8ucmVzb2x2ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGFuIGNvbnN0YW50IHBvb2wgZW50cnkgYXQgYSBwYXJ0aWN1bGFyIGluZGV4LgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudCBwb29sLgorICAgICAqIEByZXR1cm4gdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgYXQgdGhhdCBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uc3RhbnRQb29sRW50cnkgZ2V0RW50cnkoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiAoQ29uc3RhbnRQb29sRW50cnkpIGVudHJpZXMuZWxlbWVudEF0KGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluZGV4IG9mIGEgZ2l2ZW4gVVRGOCBjb25zdGFudCBwb29sIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIFVURjggZW50cnkuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGdpdmVuIHN0cmluZyBvY2N1cnMgaW4gdGhlIGNvbnN0YW50CisgICAgICogICAgICBwb29sIG9yIC0xIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFVURjhFbnRyeShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgIEludGVnZXIgaW5kZXhJbnRlZ2VyID0gKEludGVnZXIpIHV0ZjhJbmRleGVzLmdldCh2YWx1ZSk7CisKKyAgICAgICAgaWYgKGluZGV4SW50ZWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpbmRleCA9IGluZGV4SW50ZWdlci5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5kZXggb2YgYSBnaXZlbiBDT05TVEFOVF9DTEFTUyBlbnRyeSBpbiB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGZvciB3aGljaCB0aGUgY2xhc3MgZW50cnkKKyAgICAgKiAgICAgIGluZGV4IGlzIHJlcXVpcmVkLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBnaXZlbiBjbGFzcyBlbnRyeSBvY2N1cnMgaW4gdGhlCisgICAgICogICAgICBjb25zdGFudCBwb29sIG9yIC0xIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENsYXNzRW50cnkoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBpbnQgaW5kZXggPSAtMTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpICYmIGluZGV4ID09IC0xOyArK2kpIHsKKyAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gZW50cmllcy5lbGVtZW50QXQoaSk7CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NDUEluZm8pIHsKKyAgICAgICAgICAgICAgICBDbGFzc0NQSW5mbyBjbGFzc2luZm8gPSAoQ2xhc3NDUEluZm8pIGVsZW1lbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAoY2xhc3NpbmZvLmdldENsYXNzTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiBhIGdpdmVuIGNvbnN0YW50IHZhbHVlIGVudHJ5IGluIHRoZSBjb25zdGFudCBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN0YW50VmFsdWUgdGhlIGNvbnN0YW50IHZhbHVlIGZvciB3aGljaCB0aGUgaW5kZXggaXMKKyAgICAgKiAgICAgIHJlcXVpcmVkLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBnaXZlbiB2YWx1ZSBlbnRyeSBvY2N1cnMgaW4gdGhlCisgICAgICogICAgICBjb25zdGFudCBwb29sIG9yIC0xIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbnN0YW50RW50cnkoT2JqZWN0IGNvbnN0YW50VmFsdWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKSAmJiBpbmRleCA9PSAtMTsgKytpKSB7CisgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGVudHJpZXMuZWxlbWVudEF0KGkpOworCisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnN0YW50Q1BJbmZvKSB7CisgICAgICAgICAgICAgICAgQ29uc3RhbnRDUEluZm8gY29uc3RhbnRFbnRyeSA9IChDb25zdGFudENQSW5mbykgZWxlbWVudDsKKworICAgICAgICAgICAgICAgIGlmIChjb25zdGFudEVudHJ5LmdldFZhbHVlKCkuZXF1YWxzKGNvbnN0YW50VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiBhIGdpdmVuIENPTlNUQU5UX01FVEhPRFJFRiBlbnRyeSBpbiB0aGUgY29uc3RhbnQKKyAgICAgKiBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZENsYXNzTmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggY29udGFpbnMgdGhlCisgICAgICogICAgICBtZXRob2QgYmVpbmcgcmVmZXJlbmNlZC4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIHJlZmVyZW5jZWQuCisgICAgICogQHBhcmFtIG1ldGhvZFR5cGUgdGhlIHR5cGUgZGVzY3JpcHRvciBvZiB0aGUgbWV0aG9kIGJlaW5nIHJlZmVyZW5jZWQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGdpdmVuIG1ldGhvZCByZWYgZW50cnkgb2NjdXJzIGluIHRoZQorICAgICAqICAgICAgY29uc3RhbnQgcG9vbCBvciAtMSBpZiB0aGUgdmFsdWUgZG9lcyBub3Qgb2NjdXIuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNZXRob2RSZWZFbnRyeShTdHJpbmcgbWV0aG9kQ2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2RUeXBlKSB7CisgICAgICAgIGludCBpbmRleCA9IC0xOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5zaXplKCkgJiYgaW5kZXggPT0gLTE7ICsraSkgeworICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBlbnRyaWVzLmVsZW1lbnRBdChpKTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RSZWZDUEluZm8pIHsKKyAgICAgICAgICAgICAgICBNZXRob2RSZWZDUEluZm8gbWV0aG9kUmVmRW50cnkgPSAoTWV0aG9kUmVmQ1BJbmZvKSBlbGVtZW50OworCisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZFJlZkVudHJ5LmdldE1ldGhvZENsYXNzTmFtZSgpLmVxdWFscyhtZXRob2RDbGFzc05hbWUpCisgICAgICAgICAgICAgICAgICAgICAmJiBtZXRob2RSZWZFbnRyeS5nZXRNZXRob2ROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAmJiBtZXRob2RSZWZFbnRyeS5nZXRNZXRob2RUeXBlKCkuZXF1YWxzKG1ldGhvZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiBhIGdpdmVuIENPTlNUQU5UX0lOVEVSRkFDRU1FVEhPRFJFRiBlbnRyeSBpbiB0aGUKKyAgICAgKiBjb25zdGFudCBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGludGVyZmFjZU1ldGhvZENsYXNzTmFtZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHdoaWNoCisgICAgICogICAgICBjb250YWlucyB0aGUgbWV0aG9kIGJlaW5nIHJlZmVyZW5jZWQuCisgICAgICogQHBhcmFtIGludGVyZmFjZU1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyByZWZlcmVuY2VkLgorICAgICAqIEBwYXJhbSBpbnRlcmZhY2VNZXRob2RUeXBlIHRoZSB0eXBlIGRlc2NyaXB0b3Igb2YgdGhlIG1ldGhvZCBiZWluZworICAgICAqICAgICAgcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZ2l2ZW4gbWV0aG9kIHJlZiBlbnRyeSBvY2N1cnMgaW4gdGhlCisgICAgICogICAgICBjb25zdGFudCBwb29sIG9yIC0xIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEludGVyZmFjZU1ldGhvZFJlZkVudHJ5KFN0cmluZyBpbnRlcmZhY2VNZXRob2RDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VNZXRob2RUeXBlKSB7CisgICAgICAgIGludCBpbmRleCA9IC0xOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5zaXplKCkgJiYgaW5kZXggPT0gLTE7ICsraSkgeworICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBlbnRyaWVzLmVsZW1lbnRBdChpKTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlcmZhY2VNZXRob2RSZWZDUEluZm8pIHsKKyAgICAgICAgICAgICAgICBJbnRlcmZhY2VNZXRob2RSZWZDUEluZm8gaW50ZXJmYWNlTWV0aG9kUmVmRW50cnkKKyAgICAgICAgICAgICAgICAgICAgID0gKEludGVyZmFjZU1ldGhvZFJlZkNQSW5mbykgZWxlbWVudDsKKworICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VNZXRob2RSZWZFbnRyeS5nZXRJbnRlcmZhY2VNZXRob2RDbGFzc05hbWUoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VNZXRob2RDbGFzc05hbWUpCisgICAgICAgICAgICAgICAgICAgICAmJiBpbnRlcmZhY2VNZXRob2RSZWZFbnRyeS5nZXRJbnRlcmZhY2VNZXRob2ROYW1lKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1ldGhvZE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAmJiBpbnRlcmZhY2VNZXRob2RSZWZFbnRyeS5nZXRJbnRlcmZhY2VNZXRob2RUeXBlKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU1ldGhvZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiBhIGdpdmVuIENPTlNUQU5UX0ZJRUxEUkVGIGVudHJ5IGluIHRoZSBjb25zdGFudAorICAgICAqIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGRDbGFzc05hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHdoaWNoIGNvbnRhaW5zIHRoZSBmaWVsZAorICAgICAqICAgICAgYmVpbmcgcmVmZXJlbmNlZC4KKyAgICAgKiBAcGFyYW0gZmllbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyByZWZlcmVuY2VkLgorICAgICAqIEBwYXJhbSBmaWVsZFR5cGUgdGhlIHR5cGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgYmVpbmcgcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZ2l2ZW4gZmllbGQgcmVmIGVudHJ5IG9jY3VycyBpbiB0aGUKKyAgICAgKiAgICAgIGNvbnN0YW50IHBvb2wgb3IgLTEgaWYgdGhlIHZhbHVlIGRvZXMgbm90IG9jY3VyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RmllbGRSZWZFbnRyeShTdHJpbmcgZmllbGRDbGFzc05hbWUsIFN0cmluZyBmaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWVsZFR5cGUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKSAmJiBpbmRleCA9PSAtMTsgKytpKSB7CisgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGVudHJpZXMuZWxlbWVudEF0KGkpOworCisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpZWxkUmVmQ1BJbmZvKSB7CisgICAgICAgICAgICAgICAgRmllbGRSZWZDUEluZm8gZmllbGRSZWZFbnRyeSA9IChGaWVsZFJlZkNQSW5mbykgZWxlbWVudDsKKworICAgICAgICAgICAgICAgIGlmIChmaWVsZFJlZkVudHJ5LmdldEZpZWxkQ2xhc3NOYW1lKCkuZXF1YWxzKGZpZWxkQ2xhc3NOYW1lKQorICAgICAgICAgICAgICAgICAgICAgJiYgZmllbGRSZWZFbnRyeS5nZXRGaWVsZE5hbWUoKS5lcXVhbHMoZmllbGROYW1lKQorICAgICAgICAgICAgICAgICAgICAgJiYgZmllbGRSZWZFbnRyeS5nZXRGaWVsZFR5cGUoKS5lcXVhbHMoZmllbGRUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5kZXggb2YgYSBnaXZlbiBDT05TVEFOVF9OQU1FQU5EVFlQRSBlbnRyeSBpbiB0aGUgY29uc3RhbnQKKyAgICAgKiBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBnaXZlbiBOYW1lQW5kVHlwZSBlbnRyeSBvY2N1cnMgaW4gdGhlCisgICAgICogICAgICBjb25zdGFudCBwb29sIG9yIC0xIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE5hbWVBbmRUeXBlRW50cnkoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIGludCBpbmRleCA9IC0xOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5zaXplKCkgJiYgaW5kZXggPT0gLTE7ICsraSkgeworICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBlbnRyaWVzLmVsZW1lbnRBdChpKTsKKworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYW1lQW5kVHlwZUNQSW5mbykgeworICAgICAgICAgICAgICAgIE5hbWVBbmRUeXBlQ1BJbmZvIG5hbWVBbmRUeXBlRW50cnkKKyAgICAgICAgICAgICAgICAgICAgPSAoTmFtZUFuZFR5cGVDUEluZm8pIGVsZW1lbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAobmFtZUFuZFR5cGVFbnRyeS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAmJiBuYW1lQW5kVHlwZUVudHJ5LmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdW1wIHRoZSBjb25zdGFudCBwb29sIHRvIGEgc3RyaW5nLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyaWVzIGFzIHN0cmluZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJcbiIpOworICAgICAgICBpbnQgc2l6ZSA9IGVudHJpZXMuc2l6ZSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlsiICsgaSArICJdID0gIiArIGdldEVudHJ5KGkpICsgIlxuIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudFBvb2xFbnRyeS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudFBvb2xFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTQwZmIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50UG9vbEVudHJ5LmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbDsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQW4gZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wuIFRoaXMgY2xhc3MgY29udGFpbnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAqIGNvbnN0YW50IHBvb2wgZW50cmllcy4gSXQgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBkaWZmZXJlbnQKKyAqIGZvcm1zIG9mIGNvbnN0YW50IHBvb2wgZW50cnkuCisgKgorICogQHNlZSBDb25zdGFudFBvb2wKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnN0YW50UG9vbEVudHJ5IHsKKworICAgIC8qKiBUYWcgdmFsdWUgZm9yIFVURjggZW50cmllcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVEFOVF9VVEY4ID0gMTsKKworICAgIC8qKiBUYWcgdmFsdWUgZm9yIEludGVnZXIgZW50cmllcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVEFOVF9JTlRFR0VSID0gMzsKKworICAgIC8qKiBUYWcgdmFsdWUgZm9yIEZsb2F0IGVudHJpZXMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfRkxPQVQgPSA0OworCisgICAgLyoqIFRhZyB2YWx1ZSBmb3IgTG9uZyBlbnRyaWVzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX0xPTkcgPSA1OworCisgICAgLyoqIFRhZyB2YWx1ZSBmb3IgRG91YmxlIGVudHJpZXMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfRE9VQkxFID0gNjsKKworICAgIC8qKiBUYWcgdmFsdWUgZm9yIENsYXNzIGVudHJpZXMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfQ0xBU1MgPSA3OworCisgICAgLyoqIFRhZyB2YWx1ZSBmb3IgU3RyaW5nIGVudHJpZXMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfU1RSSU5HID0gODsKKworICAgIC8qKiBUYWcgdmFsdWUgZm9yIEZpZWxkIFJlZmVyZW5jZSBlbnRyaWVzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX0ZJRUxEUkVGID0gOTsKKworICAgIC8qKiBUYWcgdmFsdWUgZm9yIE1ldGhvZCBSZWZlcmVuY2UgZW50cmllcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVEFOVF9NRVRIT0RSRUYgPSAxMDsKKworICAgIC8qKiBUYWcgdmFsdWUgZm9yIEludGVyZmFjZSBNZXRob2QgUmVmZXJlbmNlIGVudHJpZXMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfSU5URVJGQUNFTUVUSE9EUkVGID0gMTE7CisKKyAgICAvKiogVGFnIHZhbHVlIGZvciBOYW1lIGFuZCBUeXBlIGVudHJpZXMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfTkFNRUFORFRZUEUgPSAxMjsKKworICAgIC8qKgorICAgICAqIFRoaXMgZW50cnkncyB0YWcgd2hpY2ggaWRlbnRpZmllcyB0aGUgdHlwZSBvZiB0aGlzIGNvbnN0YW50IHBvb2wKKyAgICAgKiBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB0YWc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBjb25zdGFudCBwb29sLCBvY2N1cGllZCBieSB0aGlzIGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG51bUVudHJpZXM7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIHRoaXMgZW50cnkgaGFzIGJlZW4gcmVzb2x2ZWQgb3Igbm90LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlZDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnVmFsdWUgdGhlIHRhZyB2YWx1ZSB3aGljaCBpZGVudGlmaWVzIHdoaWNoIHR5cGUgb2YgY29uc3RhbnQKKyAgICAgKiAgICAgIHBvb2wgZW50cnkgdGhpcyBpcy4KKyAgICAgKiBAcGFyYW0gZW50cmllcyB0aGUgbnVtYmVyIG9mIGNvbnN0YW50IHBvb2wgZW50cnkgc2xvdHMgdGhpcyBlbnRyeQorICAgICAqICAgICAgb2NjdXBpZXMuCisgICAgICovCisgICAgcHVibGljIENvbnN0YW50UG9vbEVudHJ5KGludCB0YWdWYWx1ZSwgaW50IGVudHJpZXMpIHsKKyAgICAgICAgdGFnID0gdGFnVmFsdWU7CisgICAgICAgIG51bUVudHJpZXMgPSBlbnRyaWVzOworICAgICAgICByZXNvbHZlZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBjb25zdGFudCBwb29sIGVudHJ5IGZyb20gYSBzdHJlYW0uIFRoaXMgaXMgYSBmYWN0b3J5IG1ldGhvZAorICAgICAqIHdoaWNoIHJlYWRzIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmb3JtIGEgc3RyZWFtIGFuZCByZXR1cm5zIHRoZQorICAgICAqIGFwcHJvcHJpYXRlIHN1YmNsYXNzIGZvciB0aGUgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3BTdHJlYW0gdGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBjb25zdGFudCBwb29sIGVudHJ5IGlzIHRvCisgICAgICogICAgICBiZSByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIENvbnN0YW50UG9vbEVudHJ5IHN1YmNsYXNzIHJlcHJlc2VudGluZyB0aGUKKyAgICAgKiAgICAgIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSB0aGUgc3RyZWFtLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkgY2Fubm90IGJlIHJlYWQKKyAgICAgKiAgICAgIGZyb20gdGhlIHN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29uc3RhbnRQb29sRW50cnkgcmVhZEVudHJ5KERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbnN0YW50UG9vbEVudHJ5IGNwSW5mbyA9IG51bGw7CisgICAgICAgIGludCBjcFRhZyA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZEJ5dGUoKTsKKworICAgICAgICBzd2l0Y2ggKGNwVGFnKSB7CisKKyAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfVVRGODoKKyAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgVXRmOENQSW5mbygpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTlNUQU5UX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgY3BJbmZvID0gbmV3IEludGVnZXJDUEluZm8oKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9GTE9BVDoKKyAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgRmxvYXRDUEluZm8oKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9MT05HOgorICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBMb25nQ1BJbmZvKCk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfRE9VQkxFOgorICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBEb3VibGVDUEluZm8oKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9DTEFTUzoKKyAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgQ2xhc3NDUEluZm8oKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9TVFJJTkc6CisgICAgICAgICAgICAgICAgY3BJbmZvID0gbmV3IFN0cmluZ0NQSW5mbygpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTlNUQU5UX0ZJRUxEUkVGOgorICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBGaWVsZFJlZkNQSW5mbygpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTlNUQU5UX01FVEhPRFJFRjoKKyAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgTWV0aG9kUmVmQ1BJbmZvKCk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfSU5URVJGQUNFTUVUSE9EUkVGOgorICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBJbnRlcmZhY2VNZXRob2RSZWZDUEluZm8oKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9OQU1FQU5EVFlQRToKKyAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgTmFtZUFuZFR5cGVDUEluZm8oKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NGb3JtYXRFcnJvcigiSW52YWxpZCBDb25zdGFudCBQb29sIGVudHJ5IFR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgKyBjcFRhZyk7CisgICAgICAgIH0KKworICAgICAgICBjcEluZm8ucmVhZChjcFN0cmVhbSk7CisKKyAgICAgICAgcmV0dXJuIGNwSW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGVudHJ5IGhhcyBiZWVuIHJlc29sdmVkLiBJbiBnZW5lcmFsIGEgY29uc3RhbnQKKyAgICAgKiBwb29sIGVudHJ5IGNhbiByZWZlcmVuY2UgYW5vdGhlciBjb25zdGFudCBwb29sIGVudHJ5IGJ5IGl0cyBpbmRleAorICAgICAqIHZhbHVlLiBSZXNvbHV0aW9uIGludm9sdmVzIHJlcGxhY2luZyB0aGlzIGluZGV4IHZhbHVlIHdpdGggdGhlCisgICAgICogY29uc3RhbnQgcG9vbCBlbnRyeSBhdCB0aGF0IGluZGV4LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgZW50cnkgaGFzIGJlZW4gcmVzb2x2ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5IHdpdGggcmVzcGVjdCB0byBpdHMgZGVwZW5kZW50cyBpbgorICAgICAqIHRoZSBjb25zdGFudCBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN0YW50UG9vbCB0aGUgY29uc3RhbnQgcG9vbCBvZiB3aGljaCB0aGlzIGVudHJ5IGlzIGEgbWVtYmVyCisgICAgICogICAgICBhbmQgYWdhaW5zdCB3aGljaCB0aGlzIGVudHJ5IGlzIHRvIGJlIHJlc29sdmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCkgeworICAgICAgICByZXNvbHZlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVhZCBhIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSBhIGNsYXNzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcFN0cmVhbSB0aGUgRGF0YUlucHV0U3RyZWFtIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25zdGFudCBwb29sCisgICAgICogICAgICBlbnRyeSB0byBiZSByZWFkLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20KKyAgICAgKiAgICAgIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgRW50cnkncyB0eXBlIHRhZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFRhZyB2YWx1ZSBvZiB0aGlzIGVudHJ5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgQ29uc3RhbnQgUG9vbCBFbnRyeSBzbG90cyB3aXRoaW4gdGhlIGNvbnN0YW50IHBvb2wKKyAgICAgKiBvY2N1cGllZCBieSB0aGlzIGVudHJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNsb3RzIHVzZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXROdW1FbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gbnVtRW50cmllczsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Eb3VibGVDUEluZm8uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRG91YmxlQ1BJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxYzBkNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRG91YmxlQ1BJbmZvLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sOworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUaGUgY29uc3RhbnQgcG9vbCBlbnRyeSBzdWJjbGFzcyB1c2VkIHRvIHJlcHJlc2VudCBkb3VibGUgY29uc3RhbnQKKyAqIHZhbHVlcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEb3VibGVDUEluZm8gZXh0ZW5kcyBDb25zdGFudENQSW5mbyB7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgRG91YmxlQ1BJbmZvKCkgeworICAgICAgICBzdXBlcihDT05TVEFOVF9ET1VCTEUsIDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlYWQgYSBjb25zdGFudCBwb29sIGVudHJ5IGZyb20gYSBjbGFzcyBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3BTdHJlYW0gdGhlIERhdGFJbnB1dFN0cmVhbSB3aGljaCBjb250YWlucyB0aGUgY29uc3RhbnQgcG9vbAorICAgICAqICAgICAgZW50cnkgdG8gYmUgcmVhZC4KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tIHRoZQorICAgICAqICAgICAgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXRWYWx1ZShuZXcgRG91YmxlKGNwU3RyZWFtLnJlYWREb3VibGUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJEb3VibGUgQ29uc3RhbnQgUG9vbCBFbnRyeTogIiArIGdldFZhbHVlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRmllbGRSZWZDUEluZm8uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRmllbGRSZWZDUEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmMwOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9GaWVsZFJlZkNQSW5mby5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgRmllbGRSZWYgQ1AgSW5mbworICoKKyAqLworcHVibGljIGNsYXNzIEZpZWxkUmVmQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgeworICAgIC8qKiBOYW1lIG9mIHRoZSBmaWVsZCdzIGNsYXNzICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmllbGRDbGFzc05hbWU7CisgICAgLyoqIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoYXQgY2xhc3MgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWVsZE5hbWU7CisgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBmaWVsZCAqLworICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkVHlwZTsKKyAgICAvKiogSW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbCBmb3IgdGhlIGNsYXNzICovCisgICAgcHJpdmF0ZSBpbnQgY2xhc3NJbmRleDsKKyAgICAvKiogSW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbCBmb3IgdGhlIG5hbWUgYW5kIHR5cGUgZW50cnkgKi8KKyAgICBwcml2YXRlIGludCBuYW1lQW5kVHlwZUluZGV4OworCisgICAgLyoqIENvbnN0cnVjdG9yLiAgKi8KKyAgICBwdWJsaWMgRmllbGRSZWZDUEluZm8oKSB7CisgICAgICAgIHN1cGVyKENPTlNUQU5UX0ZJRUxEUkVGLCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIGEgY2xhc3Mgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wKKyAgICAgKiAgICAgIGVudHJ5IHRvIGJlIHJlYWQuCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQorICAgICAqICAgICAgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xhc3NJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgICAgIG5hbWVBbmRUeXBlSW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5IHdpdGggcmVzcGVjdCB0byBpdHMgZGVwZW5kZW50cyBpbgorICAgICAqIHRoZSBjb25zdGFudCBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN0YW50UG9vbCB0aGUgY29uc3RhbnQgcG9vbCBvZiB3aGljaCB0aGlzIGVudHJ5IGlzIGEgbWVtYmVyCisgICAgICogICAgICBhbmQgYWdhaW5zdCB3aGljaCB0aGlzIGVudHJ5IGlzIHRvIGJlIHJlc29sdmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCkgeworICAgICAgICBDbGFzc0NQSW5mbyBmaWVsZENsYXNzCisgICAgICAgICAgICA9IChDbGFzc0NQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGNsYXNzSW5kZXgpOworCisgICAgICAgIGZpZWxkQ2xhc3MucmVzb2x2ZShjb25zdGFudFBvb2wpOworCisgICAgICAgIGZpZWxkQ2xhc3NOYW1lID0gZmllbGRDbGFzcy5nZXRDbGFzc05hbWUoKTsKKworICAgICAgICBOYW1lQW5kVHlwZUNQSW5mbyBudAorICAgICAgICAgICAgPSAoTmFtZUFuZFR5cGVDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeShuYW1lQW5kVHlwZUluZGV4KTsKKworICAgICAgICBudC5yZXNvbHZlKGNvbnN0YW50UG9vbCk7CisKKyAgICAgICAgZmllbGROYW1lID0gbnQuZ2V0TmFtZSgpOworICAgICAgICBmaWVsZFR5cGUgPSBudC5nZXRUeXBlKCk7CisKKyAgICAgICAgc3VwZXIucmVzb2x2ZShjb25zdGFudFBvb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlOworCisgICAgICAgIGlmIChpc1Jlc29sdmVkKCkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gIkZpZWxkIDogQ2xhc3MgPSAiICsgZmllbGRDbGFzc05hbWUgKyAiLCBuYW1lID0gIgorICAgICAgICAgICAgICAgICsgZmllbGROYW1lICsgIiwgdHlwZSA9ICIgKyBmaWVsZFR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9ICJGaWVsZCA6IENsYXNzIGluZGV4ID0gIiArIGNsYXNzSW5kZXgKKyAgICAgICAgICAgICAgICArICIsIG5hbWUgYW5kIHR5cGUgaW5kZXggPSAiICsgbmFtZUFuZFR5cGVJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgZmllbGQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBmaWVsZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBmaWVsZENsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZCdzIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZCdzIHR5cGUgaW4gc3RyaW5nIGZvcm1hdAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGRUeXBlKCkgeworICAgICAgICByZXR1cm4gZmllbGRUeXBlOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0Zsb2F0Q1BJbmZvLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0Zsb2F0Q1BJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyYjY3MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRmxvYXRDUEluZm8uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgRmxvYXQgQ1AgSW5mbworICoKKyAqLworcHVibGljIGNsYXNzIEZsb2F0Q1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRDUEluZm8geworCisgICAgLyoqIENvbnN0cnVjdG9yLiAgKi8KKyAgICBwdWJsaWMgRmxvYXRDUEluZm8oKSB7CisgICAgICAgIHN1cGVyKENPTlNUQU5UX0ZMT0FULCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIGEgY2xhc3Mgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wKKyAgICAgKiAgICAgIGVudHJ5IHRvIGJlIHJlYWQuCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQorICAgICAqICAgICAgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0VmFsdWUobmV3IEZsb2F0KGNwU3RyZWFtLnJlYWRGbG9hdCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkZsb2F0IENvbnN0YW50IFBvb2wgRW50cnk6ICIgKyBnZXRWYWx1ZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVnZXJDUEluZm8uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvSW50ZWdlckNQSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZWFhOGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVnZXJDUEluZm8uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEFuIEludGVnZXIgQ1AgSW5mbworICoKKyAqLworcHVibGljIGNsYXNzIEludGVnZXJDUEluZm8gZXh0ZW5kcyBDb25zdGFudENQSW5mbyB7CisKKyAgICAvKiogQ29uc3RydWN0b3IuICAqLworICAgIHB1YmxpYyBJbnRlZ2VyQ1BJbmZvKCkgeworICAgICAgICBzdXBlcihDT05TVEFOVF9JTlRFR0VSLCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIGEgY2xhc3Mgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wKKyAgICAgKiAgICAgIGVudHJ5IHRvIGJlIHJlYWQuCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQorICAgICAqICAgICAgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0VmFsdWUobmV3IEludGVnZXIoY3BTdHJlYW0ucmVhZEludCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkludGVnZXIgQ29uc3RhbnQgUG9vbCBFbnRyeTogIiArIGdldFZhbHVlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvSW50ZXJmYWNlTWV0aG9kUmVmQ1BJbmZvLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVyZmFjZU1ldGhvZFJlZkNQSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzIzYzEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVyZmFjZU1ldGhvZFJlZkNQSW5mby5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgSW50ZXJmYWNlTWV0aG9kUmVmIENQIEluZm8KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcmZhY2VNZXRob2RSZWZDUEluZm8gZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CisgICAgLyoqIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgaW50ZXJmYWNlIG1ldGhvZCAqLworICAgIHByaXZhdGUgU3RyaW5nIGludGVyZmFjZU1ldGhvZENsYXNzTmFtZTsKKyAgICAvKiogdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSBubWV0aG9kICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJmYWNlTWV0aG9kTmFtZTsKKyAgICAvKiogdGhlIG1ldGhvZCBzaWduYXR1cmUgb2YgdGhlIGludGVyZmFjZSBtZXRob2QgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbnRlcmZhY2VNZXRob2RUeXBlOworICAgIC8qKgorICAgICAqIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBlbnRyeSBmb3IgdGhlIGludGVyZmFjZQorICAgICAqIGNsYXNzCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY2xhc3NJbmRleDsKKyAgICAvKioKKyAgICAgKiB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgbmFtZSBhbmQgdHlwZSBlbnRyeQorICAgICAqIGRlc2NyaWJpbmcgdGhlIG1ldGhvZAorICAgICAqLworICAgIHByaXZhdGUgaW50IG5hbWVBbmRUeXBlSW5kZXg7CisKKyAgICAvKiogQ29uc3RydWN0b3IuICovCisgICAgcHVibGljIEludGVyZmFjZU1ldGhvZFJlZkNQSW5mbygpIHsKKyAgICAgICAgc3VwZXIoQ09OU1RBTlRfSU5URVJGQUNFTUVUSE9EUkVGLCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIGEgY2xhc3Mgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wKKyAgICAgKiAgICAgIGVudHJ5IHRvIGJlIHJlYWQuCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQorICAgICAqICAgICAgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xhc3NJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgICAgIG5hbWVBbmRUeXBlSW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5IHdpdGggcmVzcGVjdCB0byBpdHMgZGVwZW5kZW50cyBpbgorICAgICAqIHRoZSBjb25zdGFudCBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN0YW50UG9vbCB0aGUgY29uc3RhbnQgcG9vbCBvZiB3aGljaCB0aGlzIGVudHJ5IGlzIGEgbWVtYmVyCisgICAgICogICAgICBhbmQgYWdhaW5zdCB3aGljaCB0aGlzIGVudHJ5IGlzIHRvIGJlIHJlc29sdmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCkgeworICAgICAgICBDbGFzc0NQSW5mbyBpbnRlcmZhY2VNZXRob2RDbGFzcworICAgICAgICAgICAgID0gKENsYXNzQ1BJbmZvKSBjb25zdGFudFBvb2wuZ2V0RW50cnkoY2xhc3NJbmRleCk7CisKKyAgICAgICAgaW50ZXJmYWNlTWV0aG9kQ2xhc3MucmVzb2x2ZShjb25zdGFudFBvb2wpOworCisgICAgICAgIGludGVyZmFjZU1ldGhvZENsYXNzTmFtZSA9IGludGVyZmFjZU1ldGhvZENsYXNzLmdldENsYXNzTmFtZSgpOworCisgICAgICAgIE5hbWVBbmRUeXBlQ1BJbmZvIG50CisgICAgICAgICAgICAgPSAoTmFtZUFuZFR5cGVDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeShuYW1lQW5kVHlwZUluZGV4KTsKKworICAgICAgICBudC5yZXNvbHZlKGNvbnN0YW50UG9vbCk7CisKKyAgICAgICAgaW50ZXJmYWNlTWV0aG9kTmFtZSA9IG50LmdldE5hbWUoKTsKKyAgICAgICAgaW50ZXJmYWNlTWV0aG9kVHlwZSA9IG50LmdldFR5cGUoKTsKKworICAgICAgICBzdXBlci5yZXNvbHZlKGNvbnN0YW50UG9vbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkgeworICAgICAgICAgICAgdmFsdWUgPSAiSW50ZXJmYWNlTWV0aG9kIDogQ2xhc3MgPSAiICsgaW50ZXJmYWNlTWV0aG9kQ2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICsgIiwgbmFtZSA9ICIgKyBpbnRlcmZhY2VNZXRob2ROYW1lICsgIiwgdHlwZSA9ICIKKyAgICAgICAgICAgICAgICAgKyBpbnRlcmZhY2VNZXRob2RUeXBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSAiSW50ZXJmYWNlTWV0aG9kIDogQ2xhc3MgaW5kZXggPSAiICsgY2xhc3NJbmRleAorICAgICAgICAgICAgICAgICArICIsIG5hbWUgYW5kIHR5cGUgaW5kZXggPSAiICsgbmFtZUFuZFR5cGVJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgaW50ZXJmYWNlIG1ldGhvZAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIGludGVyZmFjZSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU1ldGhvZENsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZU1ldGhvZENsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSBtZXRob2QKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU1ldGhvZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBpbnRlcmZhY2VNZXRob2ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGludGVyZmFjZSBtZXRob2QKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGludGVyZmFjZSBtZXRob2QncyB0eXBlIHNpZ25hdHVyZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTWV0aG9kVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZU1ldGhvZFR5cGU7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTG9uZ0NQSW5mby5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Mb25nQ1BJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1NGYwNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTG9uZ0NQSW5mby5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbDsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQSBMb25nIENQIEluZm8KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMb25nQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRDUEluZm8geworCisgICAgLyoqIENvbnN0cnVjdG9yLiAgKi8KKyAgICBwdWJsaWMgTG9uZ0NQSW5mbygpIHsKKyAgICAgICAgc3VwZXIoQ09OU1RBTlRfTE9ORywgMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVhZCBhIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSBhIGNsYXNzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcFN0cmVhbSB0aGUgRGF0YUlucHV0U3RyZWFtIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25zdGFudCBwb29sCisgICAgICogICAgICBlbnRyeSB0byBiZSByZWFkLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20KKyAgICAgKiAgICAgIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNldFZhbHVlKG5ldyBMb25nKGNwU3RyZWFtLnJlYWRMb25nKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIHJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiTG9uZyBDb25zdGFudCBQb29sIEVudHJ5OiAiICsgZ2V0VmFsdWUoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9NZXRob2RSZWZDUEluZm8uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTWV0aG9kUmVmQ1BJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzMzUyMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTWV0aG9kUmVmQ1BJbmZvLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbDsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQSBNZXRob2RSZWYgQ1AgSW5mbworICoKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZFJlZkNQSW5mbyBleHRlbmRzIENvbnN0YW50UG9vbEVudHJ5IHsKKyAgICAvKiogdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGRlZmluaW5nIHRoaXMgbWV0aG9kICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kQ2xhc3NOYW1lOworICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kTmFtZTsKKyAgICAvKiogdGhlIG1ldGhvZCdzIHR5cGUgZGVzY3JpcHRvciAqLworICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZFR5cGU7CisgICAgLyoqIFRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudCBwb29sIHdoaWNoIGRlZmluZXMgdGhlIGNsYXNzIG9mIHRoaXMgbWV0aG9kLiAqLworICAgIHByaXZhdGUgaW50IGNsYXNzSW5kZXg7CisgICAgLyoqCisgICAgICogdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50IHBvb2wgd2hpY2ggZGVmaW5lZCB0aGUgbmFtZSBhbmQgdHlwZQorICAgICAqIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbmFtZUFuZFR5cGVJbmRleDsKKworICAgIC8qKiBDb25zdHJ1Y3Rvci4gKi8KKyAgICBwdWJsaWMgTWV0aG9kUmVmQ1BJbmZvKCkgeworICAgICAgICBzdXBlcihDT05TVEFOVF9NRVRIT0RSRUYsIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlYWQgYSBjb25zdGFudCBwb29sIGVudHJ5IGZyb20gYSBjbGFzcyBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3BTdHJlYW0gdGhlIERhdGFJbnB1dFN0cmVhbSB3aGljaCBjb250YWlucyB0aGUgY29uc3RhbnQgcG9vbAorICAgICAqICAgICAgZW50cnkgdG8gYmUgcmVhZC4KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tCisgICAgICogICAgICB0aGUgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbGFzc0luZGV4ID0gY3BTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKKyAgICAgICAgbmFtZUFuZFR5cGVJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkgeworICAgICAgICAgICAgdmFsdWUgPSAiTWV0aG9kIDogQ2xhc3MgPSAiICsgbWV0aG9kQ2xhc3NOYW1lICsgIiwgbmFtZSA9ICIKKyAgICAgICAgICAgICAgICAgKyBtZXRob2ROYW1lICsgIiwgdHlwZSA9ICIgKyBtZXRob2RUeXBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSAiTWV0aG9kIDogQ2xhc3MgaW5kZXggPSAiICsgY2xhc3NJbmRleAorICAgICAgICAgICAgICAgICArICIsIG5hbWUgYW5kIHR5cGUgaW5kZXggPSAiICsgbmFtZUFuZFR5cGVJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeSB3aXRoIHJlc3BlY3QgdG8gaXRzIGRlcGVuZGVudHMgaW4KKyAgICAgKiB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdGFudFBvb2wgdGhlIGNvbnN0YW50IHBvb2wgb2Ygd2hpY2ggdGhpcyBlbnRyeSBpcyBhIG1lbWJlcgorICAgICAqICAgICAgYW5kIGFnYWluc3Qgd2hpY2ggdGhpcyBlbnRyeSBpcyB0byBiZSByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlKENvbnN0YW50UG9vbCBjb25zdGFudFBvb2wpIHsKKyAgICAgICAgQ2xhc3NDUEluZm8gbWV0aG9kQ2xhc3MKKyAgICAgICAgICAgICA9IChDbGFzc0NQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGNsYXNzSW5kZXgpOworCisgICAgICAgIG1ldGhvZENsYXNzLnJlc29sdmUoY29uc3RhbnRQb29sKTsKKworICAgICAgICBtZXRob2RDbGFzc05hbWUgPSBtZXRob2RDbGFzcy5nZXRDbGFzc05hbWUoKTsKKworICAgICAgICBOYW1lQW5kVHlwZUNQSW5mbyBudAorICAgICAgICAgICAgID0gKE5hbWVBbmRUeXBlQ1BJbmZvKSBjb25zdGFudFBvb2wuZ2V0RW50cnkobmFtZUFuZFR5cGVJbmRleCk7CisKKyAgICAgICAgbnQucmVzb2x2ZShjb25zdGFudFBvb2wpOworCisgICAgICAgIG1ldGhvZE5hbWUgPSBudC5nZXROYW1lKCk7CisgICAgICAgIG1ldGhvZFR5cGUgPSBudC5nZXRUeXBlKCk7CisKKyAgICAgICAgc3VwZXIucmVzb2x2ZShjb25zdGFudFBvb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIG1ldGhvZAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgZGVmaW5pbmcgdGhpcyBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZENsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZENsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtZXRob2ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2RUeXBlKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kVHlwZTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9OYW1lQW5kVHlwZUNQSW5mby5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9OYW1lQW5kVHlwZUNQSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjQ1NGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL05hbWVBbmRUeXBlQ1BJbmZvLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbDsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQSBOYW1lQW5kVHlwZSBDUCBJbmZvCisgKgorICovCitwdWJsaWMgY2xhc3MgTmFtZUFuZFR5cGVDUEluZm8gZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CisKKyAgICAvKiogQ29uc3RydWN0b3IuICovCisgICAgcHVibGljIE5hbWVBbmRUeXBlQ1BJbmZvKCkgeworICAgICAgICBzdXBlcihDT05TVEFOVF9OQU1FQU5EVFlQRSwgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVhZCBhIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSBhIGNsYXNzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcFN0cmVhbSB0aGUgRGF0YUlucHV0U3RyZWFtIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25zdGFudCBwb29sCisgICAgICogICAgICBlbnRyeSB0byBiZSByZWFkLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20KKyAgICAgKiAgICAgIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG5hbWVJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgICAgIGRlc2NyaXB0b3JJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkgeworICAgICAgICAgICAgdmFsdWUgPSAiTmFtZSA9ICIgKyBuYW1lICsgIiwgdHlwZSA9ICIgKyB0eXBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSAiTmFtZSBpbmRleCA9ICIgKyBuYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgKyAiLCBkZXNjcmlwdG9yIGluZGV4ID0gIiArIGRlc2NyaXB0b3JJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeSB3aXRoIHJlc3BlY3QgdG8gaXRzIGRlcGVuZGVudHMgaW4KKyAgICAgKiB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdGFudFBvb2wgdGhlIGNvbnN0YW50IHBvb2wgb2Ygd2hpY2ggdGhpcyBlbnRyeSBpcyBhIG1lbWJlcgorICAgICAqICAgICAgYW5kIGFnYWluc3Qgd2hpY2ggdGhpcyBlbnRyeSBpcyB0byBiZSByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlKENvbnN0YW50UG9vbCBjb25zdGFudFBvb2wpIHsKKyAgICAgICAgbmFtZSA9ICgoVXRmOENQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KG5hbWVJbmRleCkpLmdldFZhbHVlKCk7CisgICAgICAgIHR5cGUgPSAoKFV0ZjhDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeShkZXNjcmlwdG9ySW5kZXgpKS5nZXRWYWx1ZSgpOworCisgICAgICAgIHN1cGVyLnJlc29sdmUoY29uc3RhbnRQb29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgY29tcG9uZW50IG9mIHRoaXMgZW50cnkKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBuYW1lIGFuZCB0eXBlIGVudHJ5CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoaXMgZW50cnkKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgc2lnbmF0dXJlIG9mIHRoaXMgZW50cnkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKiB0aGUgbmFtZSBjb21wb25lbnQgb2YgdGhpcyBlbnRyeSAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgLyoqIHRoZSB0eXBlIGNvbXBvbmVudCBvZiB0aGlzIGVudHJ5ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKyAgICAvKioKKyAgICAgKiB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbCBhdCB3aGljaCB0aGUgbmFtZSBjb21wb25lbnQncyBzdHJpbmcKKyAgICAgKiB2YWx1ZSBpcyBzdG9yZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBuYW1lSW5kZXg7CisgICAgLyoqCisgICAgICogdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50IHBvb2wgd2hlcmUgdGhlIHR5cGUgZGVzY3JpcHRvciBzdHJpbmcgaXMKKyAgICAgKiBzdG9yZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVzY3JpcHRvckluZGV4OworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL1N0cmluZ0NQSW5mby5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9TdHJpbmdDUEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzllZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9TdHJpbmdDUEluZm8uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgU3RyaW5nIENvbnN0YW50IFBvb2wgRW50cnkuIFRoZSBTdHJpbmcgaW5mbyBjb250YWlucyBhbiBpbmRleCBpbnRvIHRoZQorICogY29uc3RhbnQgcG9vbCB3aGVyZSBhIFVURjggc3RyaW5nIGlzIHN0b3JlZC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdDUEluZm8gZXh0ZW5kcyBDb25zdGFudENQSW5mbyB7CisKKyAgICAvKiogQ29uc3RydWN0b3IuICAqLworICAgIHB1YmxpYyBTdHJpbmdDUEluZm8oKSB7CisgICAgICAgIHN1cGVyKENPTlNUQU5UX1NUUklORywgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVhZCBhIGNvbnN0YW50IHBvb2wgZW50cnkgZnJvbSBhIGNsYXNzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcFN0cmVhbSB0aGUgRGF0YUlucHV0U3RyZWFtIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25zdGFudCBwb29sCisgICAgICogICAgICBlbnRyeSB0byBiZSByZWFkLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5IGZyb20KKyAgICAgKiAgICAgIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGluZGV4ID0gY3BTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKKworICAgICAgICBzZXRWYWx1ZSgidW5yZXNvbHZlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJTdHJpbmcgQ29uc3RhbnQgUG9vbCBFbnRyeSBmb3IgIgorICAgICAgICAgICAgKyBnZXRWYWx1ZSgpICsgIlsiICsgaW5kZXggKyAiXSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkgd2l0aCByZXNwZWN0IHRvIGl0cyBkZXBlbmRlbnRzIGluCisgICAgICogdGhlIGNvbnN0YW50IHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uc3RhbnRQb29sIHRoZSBjb25zdGFudCBwb29sIG9mIHdoaWNoIHRoaXMgZW50cnkgaXMgYSBtZW1iZXIKKyAgICAgKiAgICAgIGFuZCBhZ2FpbnN0IHdoaWNoIHRoaXMgZW50cnkgaXMgdG8gYmUgcmVzb2x2ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzb2x2ZShDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7CisgICAgICAgIHNldFZhbHVlKCgoVXRmOENQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGluZGV4KSkuZ2V0VmFsdWUoKSk7CisgICAgICAgIHN1cGVyLnJlc29sdmUoY29uc3RhbnRQb29sKTsKKyAgICB9CisKKyAgICAvKiogdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50IHBvb2wgY29udGFpbmluZyB0aGUgc3RyaW5nJ3MgY29udGVudCAqLworICAgIHByaXZhdGUgaW50IGluZGV4OworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL1V0ZjhDUEluZm8uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvVXRmOENQSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzFjY2QKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL1V0ZjhDUEluZm8uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgVVRGOCBDb25zdGFudCBQb29sIEVudHJ5LgorICoKKyAqLworcHVibGljIGNsYXNzIFV0ZjhDUEluZm8gZXh0ZW5kcyBDb25zdGFudFBvb2xFbnRyeSB7CisgICAgLyoqIFRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIFVURi04IGVudHJ5ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAvKiogQ29uc3RydWN0b3IuICAqLworICAgIHB1YmxpYyBVdGY4Q1BJbmZvKCkgeworICAgICAgICBzdXBlcihDT05TVEFOVF9VVEY4LCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkIGEgY29uc3RhbnQgcG9vbCBlbnRyeSBmcm9tIGEgY2xhc3Mgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wKKyAgICAgKiAgICAgIGVudHJ5IHRvIGJlIHJlYWQuCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQorICAgICAqICAgICAgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdmFsdWUgPSBjcFN0cmVhbS5yZWFkVVRGKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb25zdGFudCBwb29sIGVudHJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlVURjggVmFsdWUgPSAiICsgdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIFVURi04IGVudHJ5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBVVEYtOCB2YWx1ZSBhcyBhIEphdmEgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvQ1NoYXJwLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvQ1NoYXJwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlMzk3MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9DU2hhcnAuamF2YQpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogIGJ1aWxkIG5vdGVzCisgKiAgLVRoZSByZWZlcmVuY2UgQ0QgdG8gbGlzdGVuIHRvIHdoaWxlIGVkaXRpbmcgdGhpcyBmaWxlIGlzCisgKiAgbmFwOiBVbmRlcndvcmxkICAtIEV2ZXJ5dGhpbmcsIEV2ZXJ5dGhpbmcKKyAqLworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHBsYWNlIGluIHRoZSBvcHRpb25hbCBhbnQgdGFza3MgcGFja2FnZQorLy8gYnV0IGluIGl0cyBvd24gZG90bmV0IGdyb3VwCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGltcG9ydHMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorICogIENvbXBpbGVzIEMjIHNvdXJjZSBpbnRvIGV4ZWN1dGFibGVzIG9yIG1vZHVsZXMuCisgKgorICogY3NjLmV4ZSBvbiBXaW5kb3dzIG9yIG1jcyBvbiBvdGhlciBwbGF0Zm9ybXMgbXVzdCBiZSBvbiB0aGUgZXhlY3V0ZQorICogcGF0aCwgdW5sZXNzIGFub3RoZXIgZXhlY3V0YWJsZSBvciB0aGUgZnVsbCBwYXRoIHRvIHRoYXQgZXhlY3V0YWJsZQorICogaXMgc3BlY2lmaWVkIGluIHRoZSA8dHQ+ZXhlY3V0YWJsZTwvdHQ+IHBhcmFtZXRlcgorICogPHA+CisgKiBBbGwgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWw6ICZsdDtjc2MvJmd0OyBzaG91bGQgc3VmZmljZSB0byBwcm9kdWNlIGEgZGVidWcKKyAqIGJ1aWxkIG9mIGFsbCAqLmNzIGZpbGVzLiBIb3dldmVyLCBuYW1pbmcgYW4gPHR0PmRlc3RGaWxlPC90dD5zdG9wcyB0aGUKKyAqIGNzYyBjb21waWxlciBmcm9tIGNob29zaW5nIGFuIG91dHB1dCBuYW1lIGZyb20gcmFuZG9tLCBhbmQKKyAqIGFsbG93cyB0aGUgZGVwZW5kZW5jeSBjaGVja2VyIHRvIGRldGVybWluZSBpZiB0aGUgZmlsZSBpcyBvdXQgb2YgZGF0ZS4KKyAqIDxwPgorICogIFRoZSB0YXNrIGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2ssIHNvIGF0dHJpYnV0ZXMgbGlrZSA8Yj5pbmNsdWRlcz0iKi5jcyIKKyAqICA8L2I+IGFuZCA8Yj5leGNsdWRlcz0iYnJva2VuLmNzIjwvYj4gY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgZmlsZXMgcHVsbGVkCisgKiAgaW4uIEJ5IGRlZmF1bHQsIGFsbCAqLmNzIGZpbGVzIGZyb20gdGhlIHByb2plY3QgZm9sZGVyIGRvd24gYXJlIGluY2x1ZGVkIGluCisgKiAgdGhlIGNvbW1hbmQuIFdoZW4gdGhpcyBoYXBwZW5zIHRoZSBvdXRwdXQgZmlsZSAtaWYgbm90IHNwZWNpZmllZC0gaXMgdGFrZW4KKyAqICBhcyB0aGUgZmlyc3QgZmlsZSBpbiB0aGUgbGlzdCwgd2hpY2ggbWF5IGJlIHNvbWV3aGF0IGhhcmQgdG8gY29udHJvbC4KKyAqICBTcGVjaWZ5aW5nIHRoZSBvdXRwdXQgZmlsZSB3aXRoIDx0dD5kZXN0RmlsZTwvdHQ+IHNlZW1zIHBydWRlbnQuIDxwPgorICoKKyAqIDxwPgorICogRm9yIG1vcmUgY29tcGxleCBzb3VyY2UgdHJlZXMsIG5lc3RlZCA8dHQ+c3JjPC90dD4gZWxlbWVtZW50cyBjYW4gYmUKKyAqIHN1cHBsaWVkLiBXaGVuIHN1Y2ggYW4gZWxlbWVudCBpcyBwcmVzZW50LCB0aGUgaW1wbGljaXQgZmlsZXNldCBpcyBpZ25vcmVkLgorICogVGhpcyBtYWtlcyBzZW5zZSwgd2hlbiB5b3UgdGhpbmsgYWJvdXQgaXQgOikKKyAqCisgKiA8cD5Gb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoZSBwYXR0ZXJuCisgKiA8Y29kZT4qKjwvY29kZT48Y29kZT4vKi5jczwvY29kZT4gaXMgcHJlc2V0IGFzIGluY2x1ZGVzIGxpc3QgYW5kCisgKiB5b3UgY2FuIG5vdCBvdmVycmlkZSBpdCB3aXRoIGFuIGV4cGxpY2l0IGluY2x1ZGVzIGF0dHJpYnV0ZS4gIFVzZQorICogbmVzdGVkIDxjb2RlPiZsdDtzcmMmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbnN0ZWFkIG9mIHRoZSBiYXNlZGlyCisgKiBhdHRyaWJ1dGUgaWYgeW91IG5lZWQgbW9yZSBjb250cm9sLjwvcD4KKyAqCisgKiA8cD4KKyAqIFJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgZmlsZXMgY2FuIGJlIG1hZGUgdGhyb3VnaCB0aGUgcmVmZXJlbmNlcyBhdHRyaWJ1dGUsCisgKiBvciAoc2luY2UgQW50MS42KSwgdmlhIG5lc3RlZCAmbHQ7cmVmZXJlbmNlJmd0OyBmaWxlc2V0cy4gV2l0aCB0aGUgbGF0dGVyLAorICogdGhlIHRpbWVzdGFtcHMgb2YgdGhlIHJlZmVyZW5jZXMgYXJlIGFsc28gdXNlZCBpbiB0aGUgZGVwZW5kZW5jeQorICogY2hlY2tpbmcgYWxnb3JpdGhtLgorICogPHA+CisgKgorICogRXhhbXBsZQorICoKKyAqIDxwcmU+Jmx0O2NzYworICogICAgICAgb3B0aW1pemU9JnF1b3Q7dHJ1ZSZxdW90OworICogICAgICAgZGVidWc9JnF1b3Q7ZmFsc2UmcXVvdDsKKyAqICAgICAgIGRvY0ZpbGU9JnF1b3Q7ZG9jdW1lbnRhdGlvbi54bWwmcXVvdDsKKyAqICAgICAgIHdhcm5MZXZlbD0mcXVvdDs0JnF1b3Q7CisgKiAgICAgICB1bnNhZmU9JnF1b3Q7ZmFsc2UmcXVvdDsKKyAqICAgICAgIHRhcmdldFR5cGU9JnF1b3Q7ZXhlJnF1b3Q7CisgKiAgICAgICBpbmNyZW1lbnRhbD0mcXVvdDtmYWxzZSZxdW90OworICogICAgICAgbWFpbkNsYXNzID0gJnF1b3Q7TWFpbkFwcCZxdW90OworICogICAgICAgZGVzdEZpbGU9JnF1b3Q7TmV0QXBwLmV4ZSZxdW90OworICogICAgICAgJmd0OworICogICAgICAgICAgICZsdDtzcmMgZGlyPSJzcmMiIGluY2x1ZGVzPSIqLmNzIiAvJmd0OworICogICAgICAgJmx0O3JlZmVyZW5jZSBmaWxlPSIke3Rlc3RDU0MuZGxsfSIgLyZndDsKKyAqICAgICAgICZsdDtkZWZpbmUgbmFtZT0iUkVMRUFTRSIgLyZndDsKKyAqICAgICAgICZsdDtkZWZpbmUgbmFtZT0iREVCVUciIGlmPSJkZWJ1Zy5wcm9wZXJ0eSIvJmd0OworICogICAgICAgJmx0O2RlZmluZSBuYW1lPSJkZWYzIiB1bmxlc3M9ImRlZjMucHJvcGVydHkiLyZndDsKKyAqICAgICZsdDsvY3NjJmd0OworICogPC9wcmU+CisgKgorICoKKyAqIEBhbnQudGFzayAgICBuYW1lPSJjc2MiIGNhdGVnb3J5PSJkb3RuZXQiCisgKiBAc2luY2UgQW50IDEuMworICovCisKK3B1YmxpYyBjbGFzcyBDU2hhcnAgZXh0ZW5kcyBEb3RuZXRDb21waWxlIHsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgLyoqCisgICAgICogIGRlZmluZXMgbGlzdDogUkVMRUFTRTtXSU4zMjtOT19TQU5JVFlfQ0hFQ0tTOztTT01FVEhJTkdfRUxTRScKKyAgICAgKi8KKyAgICBTdHJpbmcgZGVmaW5pdGlvbnM7CisKKworICAgIC8qKgorICAgICAqICBvdXRwdXQgWE1MIGRvY3VtZW50YXRpb24gZmxhZworICAgICAqLworICAgIHByaXZhdGUgRmlsZSBkb2NGaWxlOworCisgICAgLyoqCisgICAgICogIGZpbGUgYWxpZ25tZW50OyAwIG1lYW5zIGxldCB0aGUgY29tcGlsZXIgZGVjaWRlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZmlsZUFsaWduID0gMDsKKworICAgIC8qKgorICAgICAqICB1c2UgZnVsbCBwYXRocyB0byB0aGluZ3MKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZnVsbHBhdGhzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiAgaW5jcmVtZW50YWwgYnVpbGQgZmxhZworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpbmNyZW1lbnRhbDsKKworICAgIC8qKgorICAgICAqICBlbmFibGUgdW5zYWZlIGNvZGUgZmxhZy4gQ2xlYXJseSBzZXQgdG8gZmFsc2UgYnkgZGVmYXVsdAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVuc2FmZTsKKworICAgIC8qKgorICAgICAqIEEgZmxhZyB0aGF0IHRlbGxzIHRoZSBjb21waWxlciBub3QgdG8gcmVhZCBpbiB0aGUgY29tcGlsZXIKKyAgICAgKiBzZXR0aW5ncyBmaWxlcyAnY3NjLnJzcCcgaW4gaXRzIGJpbiBkaXJlY3RvcnkgYW5kIHRoZW4gdGhlIGxvY2FsIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBub2NvbmZpZyA9IGZhbHNlOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKworICAgIC8qKgorICAgICAqICBjb25zdHJ1Y3RvciBpbml0cyBldmVyeXRoaW5nIGFuZCBzZXQgdXAgdGhlIHNlYXJjaCBwYXR0ZXJuCisgICAgICovCisKKyAgICBwdWJsaWMgQ1NoYXJwKCkgeworICAgICAgICBjbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZ1bGwgY2xlYW51cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBzdXBlci5jbGVhcigpOworICAgICAgICBkb2NGaWxlID0gbnVsbDsKKyAgICAgICAgZmlsZUFsaWduID0gMDsKKyAgICAgICAgZnVsbHBhdGhzID0gdHJ1ZTsKKyAgICAgICAgaW5jcmVtZW50YWwgPSBmYWxzZTsKKyAgICAgICAgdW5zYWZlID0gZmFsc2U7CisgICAgICAgIG5vY29uZmlnID0gZmFsc2U7CisgICAgICAgIGRlZmluaXRpb25zID0gbnVsbDsKKyAgICAgICAgc2V0RXhlY3V0YWJsZShpc1dpbmRvd3MgPyAiY3NjIiA6ICJtY3MiKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogIGZpbGUgZm9yIGdlbmVyYXRlZCBYTUwgZG9jdW1lbnRhdGlvbgorICAgICAqCisgICAgICpAcGFyYW0gIGYgIG91dHB1dCBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jRmlsZShGaWxlIGYpIHsKKyAgICAgICAgZG9jRmlsZSA9IGY7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHRoZSBhcmd1bWVudCBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgRG9jRmlsZSBQYXJhbWV0ZXIgdG8gQ1NDCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREb2NGaWxlUGFyYW1ldGVyKCkgeworICAgICAgICBpZiAoZG9jRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIi9kb2M6IiArIGRvY0ZpbGUudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmaWxlIGFsaWdubWVudC4KKyAgICAgKiBWYWxpZCB2YWx1ZXMgYXJlIDAsNTEyLCAxMDI0LCAyMDQ4LCA0MDk2LCA4MTkyLAorICAgICAqIGFuZCAxNjM4NCwgMCBtZWFucyAnbGVhdmUgdG8gdGhlIGNvbXBpbGVyJworICAgICAqIEBwYXJhbSBmaWxlQWxpZ24gdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlQWxpZ24oaW50IGZpbGVBbGlnbikgeworICAgICAgICB0aGlzLmZpbGVBbGlnbiA9IGZpbGVBbGlnbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHRoZSBhcmd1bWVudCBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgT3V0cHV0RmlsZSBQYXJhbWV0ZXIgdG8gQ1NDCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlQWxpZ25QYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmIChmaWxlQWxpZ24gIT0gMCAmJiAhIm1jcyIuZXF1YWxzKGdldEV4ZWN1dGFibGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiL2ZpbGVhbGlnbjoiICsgZmlsZUFsaWduOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHByaW50IHRoZSBmdWxsIHBhdGggb2YgZmlsZXMgb24gZXJyb3JzLgorICAgICAqCisgICAgICpAcGFyYW0gIGVuYWJsZWQgIFRoZSBuZXcgZnVsbFBhdGhzIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnVsbFBhdGhzKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBmdWxscGF0aHMgPSBlbmFibGVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIEdldHMgdGhlIGZ1bGxQYXRoc1BhcmFtZXRlciBhdHRyaWJ1dGUgb2YgdGhlIENTaGFycCBvYmplY3QKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgZnVsbFBhdGhzUGFyYW1ldGVyIHZhbHVlIG9yIG51bGwgaWYgdW5zZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGxQYXRoc1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZ1bGxwYXRocyA/ICIvZnVsbHBhdGhzIiA6IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgc2V0IHRoZSBpbmNyZW1lbnRhbCBjb21waWxhdGlvbiBmbGFnIG9uIG9yIG9mZi4KKyAgICAgKgorICAgICAqQHBhcmFtICBpbmNyZW1lbnRhbCAgb24vb2ZmIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNyZW1lbnRhbChib29sZWFuIGluY3JlbWVudGFsKSB7CisgICAgICAgIHRoaXMuaW5jcmVtZW50YWwgPSBpbmNyZW1lbnRhbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBxdWVyeSB0aGUgaW5jcmVtZW50YWxmbGFnCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgdHJ1ZSBpZiBpbmNyZW1lbnRhbCBjb21waWxhdGlvbiBpcyB0dXJuZWQgb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbmNyZW1lbnRhbCgpIHsKKyAgICAgICAgcmV0dXJuIGluY3JlbWVudGFsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIGdldCB0aGUgaW5jcmVtZW50YWwgYnVpbGQgYXJndW1lbnQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgSW5jcmVtZW50YWwgUGFyYW1ldGVyIHRvIENTQworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5jcmVtZW50YWxQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiAiL2luY3JlbWVudGFsIiArIChpbmNyZW1lbnRhbCA/ICIrIiA6ICItIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoZSBvdXRwdXQgZmlsZS4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIGRlc3RGaWxlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqQHBhcmFtICBwYXJhbXMgIFRoZSBuZXcgb3V0cHV0RmlsZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGUoRmlsZSBwYXJhbXMpIHsKKyAgICAgICAgc2V0RGVzdEZpbGUocGFyYW1zKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGVuYWJsZXMgdGhlIHVuc2FmZSBrZXl3b3JkLgorICAgICAqCisgICAgICpAcGFyYW0gIHVuc2FmZSAgVGhlIG5ldyBVbnNhZmUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbnNhZmUoYm9vbGVhbiB1bnNhZmUpIHsKKyAgICAgICAgdGhpcy51bnNhZmUgPSB1bnNhZmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgcXVlcnkgdGhlIFVuc2FmZSBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgVW5zYWZlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VW5zYWZlKCkgeworICAgICAgICByZXR1cm4gdGhpcy51bnNhZmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHRoZSBhcmd1bWVudCBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgVW5zYWZlIFBhcmFtZXRlciB0byBDU0MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVuc2FmZVBhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHVuc2FmZSA/ICIvdW5zYWZlIiA6IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgdGhhdCB0ZWxscyB0aGUgY29tcGlsZXIgbm90IHRvIHJlYWQgaW4gdGhlIGNvbXBpbGVyCisgICAgICogc2V0dGluZ3MgZmlsZXMgJ2NzYy5yc3AnIGluIGl0cyBiaW4gZGlyZWN0b3J5IGFuZCB0aGVuIHRoZSBsb2NhbCBkaXJlY3RvcnkKKyAgICAgKgorICAgICAqQHBhcmFtICBlbmFibGVkICBUaGUgbmV3IG5vQ29uZmlnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9Db25maWcoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG5vY29uZmlnID0gZW5hYmxlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBHZXRzIHRoZSBub0NvbmZpZ1BhcmFtZXRlciBhdHRyaWJ1dGUgb2YgdGhlIENTaGFycCBvYmplY3QKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgbm9Db25maWdQYXJhbWV0ZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vQ29uZmlnUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gbm9jb25maWcgPyAiL25vY29uZmlnIiA6IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgU2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIGRlZmluZWQgY29uc3RhbnRzLgorICAgICAqCisgICAgICpAcGFyYW0gIHBhcmFtcyAgVGhlIG5ldyBkZWZpbml0aW9ucyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb25zKFN0cmluZyBwYXJhbXMpIHsKKyAgICAgICAgZGVmaW5pdGlvbnMgPSBwYXJhbXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogb3ZlcnJpZGUgdGhlIHN1cGVyY2xhc3NlcyB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kICh3aGljaCB3ZSBjYWxsKQorICAgICAqIHdpdGggYSBjaGVjayBmb3IgYSBkZWZpbml0aW9ucyBhdHRyaWJ1dGUsIHRoZSBjb250ZW50cyBvZiB3aGljaAorICAgICAqIGFyZSBhcHBlbmRlZCB0byB0aGUgbGlzdC4KKyAgICAgKkByZXR1cm4gICAgVGhlIERlZmluaXRpb25zIFBhcmFtZXRlciB0byBDU0MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmluaXRpb25zUGFyYW1ldGVyKCkgeworICAgICAgICBTdHJpbmcgcHJlZGVjZXNzb3JzID0gc3VwZXIuZ2V0RGVmaW5pdGlvbnNQYXJhbWV0ZXIoKTsKKyAgICAgICAgaWYgKG5vdEVtcHR5KGRlZmluaXRpb25zKSkgeworICAgICAgICAgICAgaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzID0gIi9kZWZpbmU6IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAgcHJlZGVjZXNzb3JzICsgZGVmaW5pdGlvbnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcHJlZGVjZXNzb3JzOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBhZGQgQ29tbWFuZHMgdW5pcXVlIHRvIEMjLgorICAgICAqIEBwYXJhbSBjb21tYW5kIG9uZ29pbmcgY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbXBpbGVyU3BlY2lmaWNPcHRpb25zKE5ldENvbW1hbmQgY29tbWFuZCkgeworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldEluY2x1ZGVEZWZhdWx0UmVmZXJlbmNlc1BhcmFtZXRlcigpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRXYXJuTGV2ZWxQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0RG9jRmlsZVBhcmFtZXRlcigpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRGdWxsUGF0aHNQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0RmlsZUFsaWduUGFyYW1ldGVyKCkpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldEluY3JlbWVudGFsUGFyYW1ldGVyKCkpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldE5vQ29uZmlnUGFyYW1ldGVyKCkpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldFVuc2FmZVBhcmFtZXRlcigpKTsKKyAgICB9CisKKyAgICAvLyBlbmQgZXhlY3V0ZQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVsaW1pdGVyIHdoaWNoIEMjIHVzZXMgdG8gc2VwYXJhdGUgcmVmZXJlbmNlcywgaS5lLiwgYSBzZW1pIGNvbG9uLgorICAgICAqIEByZXR1cm4gdGhlIGRlbGltaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZURlbGltaXRlcigpIHsKKyAgICAgICAgcmV0dXJuICI7IjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uIGZvciBDIyBmaWxlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQyMsIGkuZS4sICJjcyIgKHdpdGhvdXQgdGhlIGRvdCkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgeworICAgICAgICByZXR1cm4gImNzIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCBhIEMjIHN0eWxlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlc291cmNlUGFyYW1ldGVyKAorICAgICAgICBOZXRDb21tYW5kIGNvbW1hbmQsIERvdG5ldFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIHJlc291cmNlLmdldFBhcmFtZXRlcnMoZ2V0UHJvamVjdCgpLCBjb21tYW5kLCB0cnVlKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L0RvdG5ldEJhc2VNYXRjaGluZ1Rhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9Eb3RuZXRCYXNlTWF0Y2hpbmdUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhMzAwZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9Eb3RuZXRCYXNlTWF0Y2hpbmdUYXNrLmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kb3RuZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICogcmVmYWN0b3Jpbmcgb2Ygc29tZSBzdHVmZiBzbyB0aGF0IGRpZmZlcmVudCB0aGluZ3MgKGxpa2UgSUxBU00pCisgKiBjYW4gdXNlIHNoYXJlZCBjb2RlLgorICovCitwdWJsaWMgY2xhc3MgRG90bmV0QmFzZU1hdGNoaW5nVGFzayBleHRlbmRzIE1hdGNoaW5nVGFzayB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiAgb3V0cHV0IGZpbGUuIElmIG5vdCBzdXBwbGllZCB0aGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgc291cmNlIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBvdXRwdXRGaWxlOworICAgIC8qKgorICAgICAqIGZpbGVzZXRzIG9mIGZpbGUgdG8gY29tcGlsZQorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiAgc291cmNlIGRpcmVjdG9yeSB1cG9uIHdoaWNoIHRoZSBzZWFyY2ggcGF0dGVybiBpcyBhcHBsaWVkCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgc3JjRGlyOworCisgICAgLyoqCisgICAgICogQXJlIHdlIHJ1bm5pbmcgb24gV2luZG93cz8KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICAvLyBDaGVja1N0eWxlOkNvbnN0YW50TmFtZUNoZWNrIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV2luZG93cyA9IE9zLmlzRmFtaWx5KCJ3aW5kb3dzIik7CisKKyAgICAvLyBDaGVja1N0eWxlOkNvbnN0YW50TmFtZUNoZWNrIE9OCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICogT3ZlcnJpZGRlbiBiZWNhdXNlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBzZXQgdGhlIHNyY0Rpci4KKyAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuCisgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRTcmNEaXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNyY0RpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IG9mIHRoZSBmaWxlcyB0byBiZSBjb21waWxlZC4KKyAgICAgKgorICAgICAqQHBhcmFtICBzcmNEaXJOYW1lICBUaGUgbmV3IFNyY0RpciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY0RpcihGaWxlIHNyY0Rpck5hbWUpIHsKKyAgICAgICAgdGhpcy5zcmNEaXIgPSBzcmNEaXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqICBTZXQgdGhlIG5hbWUgb2YgZXhlL2xpYnJhcnkgdG8gY3JlYXRlLgorICAgICAqCisgICAgICpAcGFyYW0gIGZpbGUgIFRoZSBuZXcgb3V0cHV0RmlsZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICBvdXRwdXRGaWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuZXcgc291cmNlIGRpcmVjdG9yeSB0byB0aGUgY29tcGlsZQorICAgICAqIEBwYXJhbSBzcmMgYSBmaWxlc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNyYyhGaWxlU2V0IHNyYykgeworICAgICAgICBmaWxlc2V0cy5hZGQoc3JjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGRlc3RpbmF0aW9uIGZpbGUKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXN0IGZpbGUgb3IgbnVsbCBmb3Igbm90IGFzc2lnbmVkCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RGVzdEZpbGUoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZSB0aGUgbGlzdCBvZiBmaWxlcworICAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgZmlsZXMgZm9yLgorICAgICAqIEBwYXJhbSBmaWxlc1RvQnVpbGQgdmVjdG9yIHRvIGFkZCBmaWxlcyB0bworICAgICAqIEBwYXJhbSBvdXRwdXRUaW1lc3RhbXAgdGltZXN0YW1wIHRvIGNvbXBhcmUgYWdhaW5zdAorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZpbGVzIG91dCBvZiBkYXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBidWlsZEZpbGVMaXN0KE5ldENvbW1hbmQgY29tbWFuZCwgSGFzaHRhYmxlIGZpbGVzVG9CdWlsZCwgbG9uZyBvdXRwdXRUaW1lc3RhbXApIHsKKyAgICAgICAgaW50IGZpbGVzT3V0T2ZEYXRlID0gMDsKKyAgICAgICAgYm9vbGVhbiBzY2FuSW1wbGljaXRGaWxlc2V0CisgICAgICAgICAgICA9IGdldFNyY0RpcigpICE9IG51bGwgfHwgZmlsZXNldHMuc2l6ZSgpID09IDA7CisgICAgICAgIGlmIChzY2FuSW1wbGljaXRGaWxlc2V0KSB7CisgICAgICAgICAgICAvL3NjYW4gZm9yIGFuIGltcGxpY2l0IGZpbGVzZXQgaWYgdGhlcmUgd2FzIGEgc3JjZGlyIHNldAorICAgICAgICAgICAgLy9vciB0aGVyZSB3YXMgbm8gc3JjRGlyIHNldCBidXQgdGhlcmUgd2FzIG5vIGNvbnRhaW5lZCBjbGFzc2VzCisgICAgICAgICAgICBpZiAoZ2V0U3JjRGlyKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgbm8gc3JjIGRpciBoZXJlLCBzZXQgaXQKKyAgICAgICAgICAgICAgICBzZXRTcmNEaXIoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCIuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJ3b3JraW5nIGZyb20gc291cmNlIGRpcmVjdG9yeSAiICsgZ2V0U3JjRGlyKCksCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgLy9nZXQgZGVwZW5kZW5jaWVzIGxpc3QuCisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBnZXREaXJlY3RvcnlTY2FubmVyKGdldFNyY0RpcigpKTsKKyAgICAgICAgICAgIGZpbGVzT3V0T2ZEYXRlID0gY29tbWFuZC5zY2FuT25lRmlsZXNldChzY2FubmVyLAorICAgICAgICAgICAgICAgICAgICBmaWxlc1RvQnVpbGQsIG91dHB1dFRpbWVzdGFtcCk7CisgICAgICAgIH0KKyAgICAgICAgLy9nZXQgYW55IGluY2x1ZGVkIHNvdXJjZSBkaXJlY3RvcmllcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzZXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGZpbGVzT3V0T2ZEYXRlICs9IGNvbW1hbmQuc2Nhbk9uZUZpbGVzZXQoCisgICAgICAgICAgICAgICAgICAgIGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgZmlsZXNUb0J1aWxkLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRUaW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbGVzT3V0T2ZEYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCB0aGUgbGlzdCBvZiBmaWxlcyB0byBhIGNvbW1hbmQKKyAgICAgKiBAcGFyYW0gZmlsZXNUb0J1aWxkIHZlY3RvciBvZiBmaWxlcworICAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIGFwcGVuZCB0bworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpbGVzVG9Db21tYW5kKEhhc2h0YWJsZSBmaWxlc1RvQnVpbGQsIE5ldENvbW1hbmQgY29tbWFuZCkgeworICAgICAgICBpbnQgY291bnQgPSBmaWxlc1RvQnVpbGQuc2l6ZSgpOworICAgICAgICBsb2coImNvbXBpbGluZyAiICsgY291bnQgKyAiIGZpbGUiICsgKChjb3VudCA9PSAxKSA/ICIiIDogInMiKSwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgRW51bWVyYXRpb24gZmlsZXMgPSBmaWxlc1RvQnVpbGQuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGZpbGVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSkgZmlsZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRldGVybWluZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBvdXRwdXQgZmlsZQorICAgICAqIEByZXR1cm4gYSB0aW1lc3RhbXAgb3IgMCBmb3Igbm8gb3V0cHV0IGZpbGUga25vd24vZXhpc3RzCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgZ2V0T3V0cHV0RmlsZVRpbWVzdGFtcCgpIHsKKyAgICAgICAgbG9uZyBvdXRwdXRUaW1lc3RhbXA7CisgICAgICAgIGlmIChnZXREZXN0RmlsZSgpICE9IG51bGwgJiYgZ2V0RGVzdEZpbGUoKS5leGlzdHMoKSkgeworICAgICAgICAgICAgb3V0cHV0VGltZXN0YW1wID0gZ2V0RGVzdEZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dHB1dFRpbWVzdGFtcCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dFRpbWVzdGFtcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmaW5pc2ggb2ZmIHRoZSBjb21tYW5kIGJ5IGFkZGluZyBhbGwgZGVwZW5kZW50IGZpbGVzLCBleGVjdXRlCisgICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgdG8gdXBkYXRlLgorICAgICAqIEBwYXJhbSBpZ25vcmVUaW1lc3RhbXBzIG5vdCB1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpbGVzQW5kRXhlY3V0ZShOZXRDb21tYW5kIGNvbW1hbmQsIGJvb2xlYW4gaWdub3JlVGltZXN0YW1wcykgeworICAgICAgICBsb25nIG91dHB1dFRpbWVzdGFtcCA9IGdldE91dHB1dEZpbGVUaW1lc3RhbXAoKTsKKyAgICAgICAgSGFzaHRhYmxlIGZpbGVzVG9CdWlsZCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgaW50IGZpbGVzT3V0T2ZEYXRlID0gYnVpbGRGaWxlTGlzdChjb21tYW5kLCBmaWxlc1RvQnVpbGQsIG91dHB1dFRpbWVzdGFtcCk7CisKKyAgICAgICAgLy9ub3cgcnVuIHRoZSBjb21tYW5kIG9mIGV4ZSArIHNldHRpbmdzICsgZmlsZXMKKyAgICAgICAgaWYgKGZpbGVzT3V0T2ZEYXRlID4gMCkgeworICAgICAgICAgICAgLy9hZGQgdGhlIGZpbGVzIHRvIHRoZSBjb21tYW5kCisgICAgICAgICAgICBhZGRGaWxlc1RvQ29tbWFuZChmaWxlc1RvQnVpbGQsIGNvbW1hbmQpOworICAgICAgICAgICAgY29tbWFuZC5ydW5Db21tYW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIm91dHB1dCBmaWxlIGlzIHVwIHRvIGRhdGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9Eb3RuZXRDb21waWxlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvRG90bmV0Q29tcGlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2N2M3MzEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvRG90bmV0Q29tcGlsZS5qYXZhCkBAIC0wLDAgKzEsOTk2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qCisgKiAgYnVpbGQgbm90ZXMKKyAqICAtVGhlIHJlZmVyZW5jZSBDRCB0byBsaXN0ZW4gdG8gd2hpbGUgZWRpdGluZyB0aGlzIGZpbGUgaXMKKyAqICBuYXA6Q3JlYW0rTGl2ZSsyMDAxK0NEKzIKKyAqLworCisvLyBwbGFjZSBpbiB0aGUgb3B0aW9uYWwgYW50IHRhc2tzIHBhY2thZ2UKKy8vIGJ1dCBpbiBpdHMgb3duIGRvdG5ldCBncm91cAorCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldDsKKworLy8gaW1wb3J0cworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworCisKKy8qKgorICogIEFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGRvdG5ldCBjb21waWxlciB0YXNrcy4KKyAqCisgKiAgSGlzdG9yeQorICogIDx0YWJsZT4KKyAqICAgIDx0cj4KKyAqICAgICAgPHRkPgorICogICAgICAgIDAuMQorICogICAgICA8L3RkPgorICogICAgICA8dGQ+CisgKiAgICAgICAgRmlyc3QgY3JlYXRpb24KKyAqICAgICAgPC90ZD4KKyAqICAgICAgPHRkPgorICogICAgICAgIE1vc3Qgb2YgdGhlIGNvZGUgaGVyZSB3YXMgY29waWVkIHZlcmJhdGltIGZyb20gdjAuMyBvZgorICogICAgICAgIFN0ZXZlIExvdWdocmFuJ3MgQ1NoYXJwIG9wdGlvbmFsIHRhc2suIEFic3RyYWN0ZWQgZnVuY3Rpb25hbGl0eQorICogICAgICAgIHRvIGFsbG93IHN1YmNsYXNzaW5nIG9mIG90aGVyIGRvdG5ldCBjb21waWxlciB0eXBlcy4KKyAqICAgICAgPC90ZD4KKyAqICAgIDwvdHI+CisgKgorICogIDwvdGFibGU+CisgKgorICoKKyAqIEB2ZXJzaW9uICAgICAwLjEKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG90bmV0Q29tcGlsZQorICAgICAgICAgZXh0ZW5kcyBEb3RuZXRCYXNlTWF0Y2hpbmdUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dBUk5fTEVWRUwgPSAzOworCisgICAgLyoqCisgICAgICogIGxpc3Qgb2YgcmVmZXJlbmNlIGNsYXNzZXMuIChwcmV0dHkgbXVjaCBhIGNsYXNzcGF0aCBlcXVpdmFsZW50KQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlZmVyZW5jZXM7CisKKyAgICAvKioKKyAgICAgKiAgZmxhZyB0byBlbmFibGUgYXV0b21hdGljIHJlZmVyZW5jZSBpbmNsdXNpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqICBpY29uIGZvciBpbmNvcnBvcmF0aW9uIGludG8gYXBwcworICAgICAqLworICAgIHByaXZhdGUgRmlsZSB3aW4zMmljb247CisKKyAgICAvKioKKyAgICAgKiAgaWNvbiBmb3IgaW5jb3Jwb3JhdGlvbiBpbnRvIGFwcHMKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgd2luMzJyZXM7CisKKyAgICAvKioKKyAgICAgKiAgZmxhZyB0byBjb250cm9sIGFjdGlvbiBvbiBleGVjdXRpb24gdHJvdWJsZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvcjsKKworICAgIC8qKgorICAgICAqICB1c2luZyB0aGUgcGF0aCBhcHByb2FjaCBkaWRuJ3Qgd29yayBhcyBpdCBjb3VsZCBub3QgaGFuZGxlIHRoZSBpbXBsaWNpdAorICAgICAqICBleGVjdXRpb24gcGF0aC4gUGVyaGFwcyB0aGF0IGNvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBydW50aW1lIGFuZAorICAgICAqICB0aGVuIHRoZSBwYXRoIGFwcHJvYWNoIHdvdWxkIGJlIHZpYWJsZQorICAgICAqLworICAgIHByaXZhdGUgUGF0aCByZWZlcmVuY2VGaWxlczsKKworICAgIC8qKgorICAgICAqICBvcHRpbWlzZSBmbGFnCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG9wdGltaXplOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiBhIGxpc3Qgb2YgZGVmaW5pdGlvbnMgdG8gc3VwcG9ydDsKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGRlZmluaXRpb25MaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogb3VyIHJlc291cmNlcworICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgcmVzb3VyY2VzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogIGV4ZWN1dGFibGUKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZXhlY3V0YWJsZTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9PUFRJT04gPSAiL3JlZmVyZW5jZToiOworCisgICAgLyoqCisgICAgICogIGRlYnVnIGZsYWcuIENvbnRyb2xzIGdlbmVyYXRpb24gb2YgZGVidWcgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7CisKKyAgICAvKioKKyAgICAgKiAgd2FybmluZyBsZXZlbDogMC00LCB3aXRoIDQgYmVpbmcgbW9zdCB2ZXJib3NlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgd2FybkxldmVsOworCisgICAgLyoqCisgICAgICogIG1haW4gY2xhc3MgKG9yIG51bGwgZm9yIGF1dG9tYXRpYyBjaG9pY2UpCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBtYWluQ2xhc3M7CisKKyAgICAvKioKKyAgICAgKiAgYW55IGV4dHJhIGNvbW1hbmQgb3B0aW9ucz8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhT3B0aW9uczsKKworICAgIC8qKgorICAgICAqICB0eXBlIG9mIHRhcmdldC4gU2hvdWxkIGJlIG9uZSBvZiBleGV8bGlicmFyeXxtb2R1bGV8d2luZXhlfChudWxsKQorICAgICAqICBkZWZhdWx0IGlzIGV4ZTsgdGhlIGFjdHVhbCB2YWx1ZSAoaWYgbm90IG51bGwpIGlzIGZlZCB0byB0aGUgY29tbWFuZAorICAgICAqICBsaW5lLiA8YnI+CisgICAgICogIFNlZSAvdGFyZ2V0CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRUeXBlOworCisgICAgLyoqCisgICAgICogIHV0ZiBvdXQgZmxhZworICAgICAqLworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXRmOG91dHB1dCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogIGxpc3Qgb2YgZXh0cmEgbW9kdWxlcyB0byByZWZlciB0bworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYWRkaXRpb25hbE1vZHVsZXM7CisgICAgLyoqCisgICAgICogZmlsZXNldHMgb2YgcmVmZXJlbmNlcworICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgcmVmZXJlbmNlRmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBmbGFnIHRvIHNldCB0byB0byB1c2UgQGZpbGUgYmFzZWQgY29tbWFuZCBjYWNoZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VSZXNwb25zZUZpbGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUT01BVElDX1JFU1BPTlNFX0ZJTEVfVEhSRVNIT0xEID0gNjQ7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogIGNvbnN0cnVjdG9yIGluaXRzIGV2ZXJ5dGhpbmcgYW5kIHNldCB1cCB0aGUgc2VhcmNoIHBhdHRlcm4KKyAgICAgKi8KKworICAgIHB1YmxpYyBEb3RuZXRDb21waWxlKCkgeworICAgICAgICBjbGVhcigpOworICAgICAgICBzZXRJbmNsdWRlcyhnZXRGaWxlUGF0dGVybigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgcmVzZXQgYWxsIGNvbnRlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICB0YXJnZXRUeXBlID0gbnVsbDsKKyAgICAgICAgd2luMzJpY29uID0gbnVsbDsKKyAgICAgICAgc3JjRGlyID0gbnVsbDsKKyAgICAgICAgbWFpbkNsYXNzID0gbnVsbDsKKyAgICAgICAgd2FybkxldmVsID0gREVGQVVMVF9XQVJOX0xFVkVMOworICAgICAgICBvcHRpbWl6ZSA9IGZhbHNlOworICAgICAgICBkZWJ1ZyA9IHRydWU7CisgICAgICAgIHJlZmVyZW5jZXMgPSBudWxsOworICAgICAgICBmYWlsT25FcnJvciA9IHRydWU7CisgICAgICAgIGFkZGl0aW9uYWxNb2R1bGVzID0gbnVsbDsKKyAgICAgICAgaW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzID0gdHJ1ZTsKKyAgICAgICAgZXh0cmFPcHRpb25zID0gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBETExzIHRvIHJlZmVyIHRvLgorICAgICAqCisgICAgICpAcGFyYW0gIHMgIFRoZSBuZXcgUmVmZXJlbmNlcyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZXMoU3RyaW5nIHMpIHsKKyAgICAgICAgcmVmZXJlbmNlcyA9IHM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHRoZSByZWZlcmVuY2Ugc3RyaW5nIG9yIG51bGwgZm9yIG5vIGFyZ3VtZW50IG5lZWRlZAorICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSBSZWZlcmVuY2VzIFBhcmFtZXRlciB0byBDU0MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZmVyZW5jZXNQYXJhbWV0ZXIoKSB7CisgICAgICAgIC8vYmFpbCBvbiBubyByZWZlcmVuY2VzCisgICAgICAgIGlmIChub3RFbXB0eShyZWZlcmVuY2VzKSkgeworICAgICAgICAgICAgaWYgKGlzV2luZG93cykgeworICAgICAgICAgICAgICAgIHJldHVybiAnXCInICsgUkVGRVJFTkNFX09QVElPTiArIHJlZmVyZW5jZXMgKyAnXCInOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUkVGRVJFTkNFX09QVElPTiArIHJlZmVyZW5jZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhdGggb2YgcmVmZXJlbmNlcyB0byBpbmNsdWRlLgorICAgICAqIFdpbGRjYXJkcyBzaG91bGQgd29yay4KKyAgICAgKgorICAgICAqQHBhcmFtICBwYXRoICBhbm90aGVyIHBhdGggdG8gYXBwZW5kCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlRmlsZXMoUGF0aCBwYXRoKSB7CisgICAgICAgIC8vZGVtYW5kIGNyZWF0ZSBwYXRobGlzdAorICAgICAgICBpZiAocmVmZXJlbmNlRmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVmZXJlbmNlRmlsZXMgPSBuZXcgUGF0aCh0aGlzLmdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVmZXJlbmNlRmlsZXMuYXBwZW5kKHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5ldyByZWZlcmVuY2UgZmlsZXNldCB0byB0aGUgY29tcGlsYXRpb24KKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSBmaWxlcyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKEZpbGVTZXQgcmVmZXJlbmNlKSB7CisgICAgICAgIHJlZmVyZW5jZUZpbGVzZXRzLmFkZChyZWZlcmVuY2UpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiAgdHVybiB0aGUgcGF0aCBsaXN0IGludG8gYSBsaXN0IG9mIGZpbGVzIGFuZCBhIC9yZWZlcmVuY2VzIGFyZ3VtZW50CisgICAgICoKKyAgICAgKkByZXR1cm4gICAgbnVsbCBvciBhIHN0cmluZyBvZiByZWZlcmVuY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlRmlsZXNQYXJhbWV0ZXIoKSB7CisgICAgICAgIC8vYmFpbCBvbiBubyByZWZlcmVuY2VzCisgICAgICAgIGlmIChyZWZlcmVuY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vaXRlcmF0ZSB0aHJvdWdoIHRoZSByZWYgbGlzdCAmIGdlbmVyYXRlIGFuIGVudHJ5IGZvciBlYWNoCisgICAgICAgIC8vb3IganVzdCByZWx5IG9uIHRoZSBmYWN0IHRoYXQgdGhlIHRvU3RyaW5nIG9wZXJhdG9yIGRvZXMgdGhpcywgYnV0CisgICAgICAgIC8vbm90aW5nIHRoYXQgdGhlIHNlcGFyYXRvciBpcyAnOycgb24gd2luZG93cywgJzonIG9uIHVuaXgKKworICAgICAgICAvL2JhaWwgb24gbm8gcmVmZXJlbmNlcyBsaXN0ZWQKKyAgICAgICAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoUkVGRVJFTkNFX09QVElPTik7CisgICAgICAgIGlmIChpc1dpbmRvd3MpIHsKKyAgICAgICAgICAgIHMuYXBwZW5kKCdcIicpOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKHJlZmVyZW5jZXMpOworICAgICAgICBpZiAoaXNXaW5kb3dzKSB7CisgICAgICAgICAgICBzLmFwcGVuZCgnXCInKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcy50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgY29tbW9uIGFzc2VtYmxpZXMKKyAgICAgKiBpbiBkb3RuZXQsIGFuZCB0ZWxscyB0aGUgY29tcGlsZXIgdG8gbGluayBpbiBtc2NvcmUuZGxsLgorICAgICAqCisgICAgICogIHNldCB0aGUgYXV0b21hdGljIHJlZmVyZW5jZSBpbmNsdXNpb24gZmxhZyBvbiBvciBvZmYgdGhpcyBmbGFnIGNvbnRyb2xzCisgICAgICogIHRoZSAvbm9zdGRsaWIgb3B0aW9uIGluIENTQworICAgICAqCisgICAgICpAcGFyYW0gIGYgIG9uL29mZiBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzKGJvb2xlYW4gZikgeworICAgICAgICBpbmNsdWRlRGVmYXVsdFJlZmVyZW5jZXMgPSBmOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIHF1ZXJ5IGF1dG9tYXRpYyByZWZlcmVuY2UgaW5jbHVzaW9uIGZsYWcKKyAgICAgKgorICAgICAqQHJldHVybiAgICB0cnVlIGlmIGZsYWcgaXMgdHVybmVkIG9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzKCkgeworICAgICAgICByZXR1cm4gaW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIGdldCB0aGUgaW5jbHVkZSBkZWZhdWx0IHJlZmVyZW5jZXMgZmxhZyBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgUGFyYW1ldGVyIHRvIENTQworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzUGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gIi9ub3N0ZGxpYiIgKyAoaW5jbHVkZURlZmF1bHRSZWZlcmVuY2VzID8gIi0iIDogIisiKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZW5hYmxlcyBvcHRpbWl6YXRpb24gZmxhZy4KKyAgICAgKgorICAgICAqQHBhcmFtICBmICBvbi9vZmYgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9wdGltaXplKGJvb2xlYW4gZikgeworICAgICAgICBvcHRpbWl6ZSA9IGY7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgcXVlcnkgdGhlIG9wdGltaXNlIGZsYWcKKyAgICAgKgorICAgICAqQHJldHVybiAgICB0cnVlIGlmIG9wdGltaXNlIGlzIHR1cm5lZCBvbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE9wdGltaXplKCkgeworICAgICAgICByZXR1cm4gb3B0aW1pemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHRoZSBvcHRpbWlzZSBmbGFnIG9yIG51bGwgZm9yIG5vIGFyZ3VtZW50IG5lZWRlZAorICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSBPcHRpbWl6ZSBQYXJhbWV0ZXIgdG8gQ1NDCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpbWl6ZVBhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuICIvb3B0aW1pemUiICsgKG9wdGltaXplID8gIisiIDogIi0iKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBzZXQgdGhlIGRlYnVnIGZsYWcgb24gb3Igb2ZmLgorICAgICAqCisgICAgICpAcGFyYW0gIGYgIG9uL29mZiBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBmKSB7CisgICAgICAgIGRlYnVnID0gZjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBxdWVyeSB0aGUgZGVidWcgZmxhZworICAgICAqCisgICAgICpAcmV0dXJuICAgIHRydWUgaWYgZGVidWcgaXMgdHVybmVkIG9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVidWcoKSB7CisgICAgICAgIHJldHVybiBkZWJ1ZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBnZXQgdGhlIGRlYnVnIHN3aXRjaCBhcmd1bWVudAorICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSBEZWJ1ZyBQYXJhbWV0ZXIgdG8gQ1NDCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWJ1Z1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuICIvZGVidWciICsgKGRlYnVnID8gIisiIDogIi0iKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExldmVsIG9mIHdhcm5pbmcgY3VycmVudGx5IGJldHdlZW4gMSBhbmQgNAorICAgICAqIHdpdGggNCBiZWluZyB0aGUgc3RyaWN0ZXN0LgorICAgICAqCisgICAgICpAcGFyYW0gIHdhcm5MZXZlbCAgd2FybiBsZXZlbCAtc2VlIC5uZXQgZG9jcyBmb3IgdmFsaWQgcmFuZ2UgKHByb2JhYmx5CisgICAgICogICAgICAwLTQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2FybkxldmVsKGludCB3YXJuTGV2ZWwpIHsKKyAgICAgICAgdGhpcy53YXJuTGV2ZWwgPSB3YXJuTGV2ZWw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgcXVlcnkgd2FybiBsZXZlbAorICAgICAqCisgICAgICpAcmV0dXJuICAgIGN1cnJlbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdhcm5MZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIHdhcm5MZXZlbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBnZXQgdGhlIHdhcm4gbGV2ZWwgc3dpdGNoCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgVGhlIFdhcm5MZXZlbCBQYXJhbWV0ZXIgdG8gQ1NDCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXYXJuTGV2ZWxQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiAiL3dhcm46IiArIHdhcm5MZXZlbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBTZXRzIHRoZSBuYW1lIG9mIG1haW4gY2xhc3MgZm9yIGV4ZWN1dGFibGVzLgorICAgICAqCisgICAgICpAcGFyYW0gIG1haW5DbGFzcyAgVGhlIG5ldyBNYWluQ2xhc3MgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoU3RyaW5nIG1haW5DbGFzcykgeworICAgICAgICB0aGlzLm1haW5DbGFzcyA9IG1haW5DbGFzczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBHZXRzIHRoZSBNYWluQ2xhc3MgYXR0cmlidXRlCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgVGhlIE1haW5DbGFzcyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tYWluQ2xhc3M7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHRoZSAvbWFpbiBhcmd1bWVudCBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgTWFpbkNsYXNzIFBhcmFtZXRlciB0byBDU0MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5DbGFzc1BhcmFtZXRlcigpIHsKKyAgICAgICAgaWYgKG1haW5DbGFzcyAhPSBudWxsICYmIG1haW5DbGFzcy5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIi9tYWluOiIgKyBtYWluQ2xhc3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQW55IGV4dHJhIG9wdGlvbnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IHN1cHBvcnRlZAorICAgICAqIGJ5IHRoaXMgdGFzay4KKyAgICAgKgorICAgICAqQHBhcmFtICBleHRyYU9wdGlvbnMgIFRoZSBuZXcgRXh0cmFPcHRpb25zIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0cmFPcHRpb25zKFN0cmluZyBleHRyYU9wdGlvbnMpIHsKKyAgICAgICAgdGhpcy5leHRyYU9wdGlvbnMgPSBleHRyYU9wdGlvbnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgR2V0cyB0aGUgRXh0cmFPcHRpb25zIGF0dHJpYnV0ZQorICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSBFeHRyYU9wdGlvbnMgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4dHJhT3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFPcHRpb25zOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIGdldCBhbnkgZXh0cmEgb3B0aW9ucyBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgRXh0cmFPcHRpb25zIFBhcmFtZXRlciB0byBDU0MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dHJhT3B0aW9uc1BhcmFtZXRlcigpIHsKKyAgICAgICAgaWYgKGV4dHJhT3B0aW9ucyAhPSBudWxsICYmIGV4dHJhT3B0aW9ucy5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFPcHRpb25zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZ2V0IGFueSBleHRyYSBvcHRpb25zIG9yIG51bGwgZm9yIG5vIGFyZ3VtZW50IG5lZWRlZCwgc3BsaXQKKyAgICAgKiAgdGhlbSBpZiB0aGV5IHJlcHJlc2VudCBtdWx0aXBsZSBvcHRpb25zLgorICAgICAqCisgICAgICogQHJldHVybiAgICBUaGUgRXh0cmFPcHRpb25zIFBhcmFtZXRlciB0byBDU0MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0cmFPcHRpb25zUGFyYW1ldGVycygpIHsKKyAgICAgICAgU3RyaW5nIGV4dHJhID0gZ2V0RXh0cmFPcHRpb25zUGFyYW1ldGVyKCk7CisgICAgICAgIHJldHVybiBleHRyYSA9PSBudWxsID8gbnVsbCA6IENvbW1hbmRsaW5lLnRyYW5zbGF0ZUNvbW1hbmRsaW5lKGV4dHJhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiBmaWxlcyB0byBiZSBjb21waWxlZC4KKyAgICAgKgorICAgICAqQHBhcmFtICBkaXJOYW1lICBUaGUgbmV3IERlc3REaXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0RGlyKEZpbGUgZGlyTmFtZSkgeworICAgICAgICBsb2coIkRlc3REaXIgY3VycmVudGx5IHVudXNlZCIsIFByb2plY3QuTVNHX1dBUk4pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogc2V0IHRoZSB0YXJnZXQgdHlwZSB0byBvbmUgb2YgZXhlfGxpYnJhcnl8bW9kdWxlfHdpbmV4ZQorICAgICAqIEBwYXJhbSB0YXJnZXRUeXBlIHRoZSBlbnVtZXJhdGVkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldFR5cGUoVGFyZ2V0VHlwZXMgdGFyZ2V0VHlwZSkgeworICAgICAgICB0aGlzLnRhcmdldFR5cGUgPSB0YXJnZXRUeXBlLmdldFZhbHVlKCk7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldCB0aGUgdHlwZSBvZiB0YXJnZXQuCisgICAgICoKKyAgICAgKkBwYXJhbSAgdHR5cGUgICAgICAgICAgVGhlIG5ldyBUYXJnZXRUeXBlIHZhbHVlCisgICAgICpAZXhjZXB0aW9uICBCdWlsZEV4Y2VwdGlvbiAgaWYgdGFyZ2V0IGlzIG5vdCBvbmUgb2YKKyAgICAgKiAgICAgIGV4ZXxsaWJyYXJ5fG1vZHVsZXx3aW5leGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRUeXBlKFN0cmluZyB0dHlwZSkKKyAgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0dHlwZSA9IHR0eXBlLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGlmICh0dHlwZS5lcXVhbHMoImV4ZSIpIHx8IHR0eXBlLmVxdWFscygibGlicmFyeSIpCisgICAgICAgICAgICB8fCB0dHlwZS5lcXVhbHMoIm1vZHVsZSIpIHx8IHR0eXBlLmVxdWFscygid2luZXhlIikpIHsKKyAgICAgICAgICAgIHRhcmdldFR5cGUgPSB0dHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGFyZ2V0VHlwZSAiICsgdHR5cGUKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBvbmUgb2YgJ2V4ZScsICdtb2R1bGUnLCAnd2luZXhlJyBvciAnbGlicmFyeSciKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogIEdldHMgdGhlIFRhcmdldFR5cGUgYXR0cmlidXRlCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgVGhlIFRhcmdldFR5cGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXRUeXBlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgVGhlIFRhcmdldFR5cGUgUGFyYW1ldGVyIHRvIENTQworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0VHlwZVBhcmFtZXRlcigpIHsKKyAgICAgICAgaWYgKG5vdEVtcHR5KHRhcmdldFR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gIi90YXJnZXQ6IiArIHRhcmdldFR5cGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogIFNldCB0aGUgZmlsZW5hbWUgb2YgaWNvbiB0byBpbmNsdWRlLgorICAgICAqCisgICAgICpAcGFyYW0gIGZpbGVOYW1lICBwYXRoIHRvIHRoZSBmaWxlLiBDYW4gYmUgcmVsYXRpdmUsIGFic29sdXRlLCB3aGF0ZXZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW4zMkljb24oRmlsZSBmaWxlTmFtZSkgeworICAgICAgICB3aW4zMmljb24gPSBmaWxlTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBnZXQgdGhlIGFyZ3VtZW50IG9yIG51bGwgZm9yIG5vIGFyZ3VtZW50IG5lZWRlZAorICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSBXaW4zMkljb24gUGFyYW1ldGVyIHRvIENTQworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0V2luMzJJY29uUGFyYW1ldGVyKCkgeworICAgICAgICBpZiAod2luMzJpY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiL3dpbjMyaWNvbjoiICsgd2luMzJpY29uLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZmlsZW5hbWUgb2YgYSB3aW4zMiByZXNvdXJjZSAoLlJFUykgZmlsZSB0byBpbmNsdWRlLgorICAgICAqIFRoaXMgaXMgbm90IGEgLk5FVCByZXNvdXJjZSwgYnV0IHdoYXQgV2luZG93cyBpcyB1c2VkIHRvLgorICAgICAqCisgICAgICpAcGFyYW0gIGZpbGVOYW1lICBwYXRoIHRvIHRoZSBmaWxlLiBDYW4gYmUgcmVsYXRpdmUsIGFic29sdXRlLCB3aGF0ZXZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW4zMlJlcyhGaWxlIGZpbGVOYW1lKSB7CisgICAgICAgIHdpbjMycmVzID0gZmlsZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZmlsZSBvZiB0aGUgd2luMzIgLnJlcyBmaWxlIHRvIGluY2x1ZGUuCisgICAgICogQHJldHVybiBwYXRoIHRvIHRoZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFdpbjMyUmVzKCkgeworICAgICAgICByZXR1cm4gd2luMzJyZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHRoZSBhcmd1bWVudCBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgV2luMzJSZXMgUGFyYW1ldGVyIHRvIENTQworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0V2luMzJSZXNQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmICh3aW4zMnJlcyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIi93aW4zMnJlczoiICsgd2luMzJyZXMudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCByZXF1aXJlIGFsbCBjb21waWxlciBvdXRwdXQgdG8gYmUgaW4gVVRGOCBmb3JtYXQuCisgICAgICoKKyAgICAgKkBwYXJhbSAgZW5hYmxlZCAgVGhlIG5ldyB1dGY4T3V0cHV0IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXRmOE91dHB1dChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgdXRmOG91dHB1dCA9IGVuYWJsZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgR2V0cyB0aGUgdXRmOE91dHB1UGFyYW1ldGVyIGF0dHJpYnV0ZSBvZiB0aGUgQ1NoYXJwIG9iamVjdAorICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSB1dGY4T3V0cHVQYXJhbWV0ZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFV0ZjhPdXRwdXRQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiB1dGY4b3V0cHV0ID8gIi91dGY4b3V0cHV0IiA6IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBkZWZpbmUgdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMKKyAgICAgKiBAcGFyYW0gZGVmaW5lIHRoZSBkZWZpbmUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKERvdG5ldERlZmluZSBkZWZpbmUpIHsKKyAgICAgICAgZGVmaW5pdGlvbkxpc3QuYWRkRWxlbWVudChkZWZpbmUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogZ2V0IGEgbGlzdCBvZiBkZWZpbml0aW9ucyBvciBudWxsCisgICAgICogQHJldHVybiBhIHN0cmluZyBiZWdpbm5pbmcgL0Q6IG9yIG51bGwgZm9yIG5vIGRlZmluaXRpb25zCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmluaXRpb25zUGFyYW1ldGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGRlZmluZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIEVudW1lcmF0aW9uIGRlZkVudW0gPSBkZWZpbml0aW9uTGlzdC5lbGVtZW50cygpOworICAgICAgICBib29sZWFuIGZpcnN0RGVmaW5pdGlvbiA9IHRydWU7CisgICAgICAgIHdoaWxlIChkZWZFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAvL2xvb3AgdGhyb3VnaCBhbGwgZGVmaW5pdGlvbnMKKyAgICAgICAgICAgIERvdG5ldERlZmluZSBkZWZpbmUgPSAoRG90bmV0RGVmaW5lKSBkZWZFbnVtLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoZGVmaW5lLmlzU2V0KHRoaXMpKSB7CisgICAgICAgICAgICAgICAgLy9hZGQgdGhvc2UgdGhhdCBhcmUgc2V0LCBhbmQgYSBkZWxpbWl0ZXIKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RGVmaW5pdGlvbikgeworICAgICAgICAgICAgICAgICAgICBkZWZpbmVzLmFwcGVuZChnZXREZWZpbml0aW9uc0RlbGltaXRlcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmaW5lcy5hcHBlbmQoZGVmaW5lLmdldFZhbHVlKHRoaXMpKTsKKyAgICAgICAgICAgICAgICBmaXJzdERlZmluaXRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVmaW5lcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiL2Q6IiArIGRlZmluZXM7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGVzIHRvIHJlZmVyIHRvLgorICAgICAqCisgICAgICpAcGFyYW0gIHBhcmFtcyAgVGhlIG5ldyBhZGRpdGlvbmFsTW9kdWxlcyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxNb2R1bGVzKFN0cmluZyBwYXJhbXMpIHsKKyAgICAgICAgYWRkaXRpb25hbE1vZHVsZXMgPSBwYXJhbXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHRoZSBhcmd1bWVudCBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgQWRkaXRpb25hbE1vZHVsZXMgUGFyYW1ldGVyIHRvIENTQworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbE1vZHVsZXNQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmIChub3RFbXB0eShhZGRpdGlvbmFsTW9kdWxlcykpIHsKKyAgICAgICAgICAgIHJldHVybiAiL2FkZG1vZHVsZToiICsgYWRkaXRpb25hbE1vZHVsZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgVGhlIE91dHB1dEZpbGUgUGFyYW1ldGVyIHRvIENTQworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzdEZpbGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmIChvdXRwdXRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiL291dDoiICsgb3V0cHV0RmlsZS50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGZhaWwgb24gY29tcGlsYXRpb24gZXJyb3JzLgorICAgICAqCisgICAgICpAcGFyYW0gIGIgIFRoZSBuZXcgRmFpbE9uRXJyb3IgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGIpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSBiOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIHF1ZXJ5IGZhaWwgb24gZXJyb3IgZmxhZworICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSBGYWlsRmFpbE9uRXJyb3IgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsT25FcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIGZhaWxPbkVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIGxpbmsgb3IgZW1iZWQgYSByZXNvdXJjZQorICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlc291cmNlKERvdG5ldFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGdldHMgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXhlY3V0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtLCBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cy4KKyAgICAgKiBDYW4gYmUgdXNlZCB0byBzZXQgdGhlIGZ1bGwgcGF0aCB0byBhIHByb2dyYW0sIG9yIHRvIHN3aXRjaAorICAgICAqIHRvIGFuIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCwgc3VjaCBhcyB0aGUgTW9ubyBvciBSb3RvcgorICAgICAqIHZlcnNpb25zIC1wcm92aWRlZCB0aGV5IHVzZSB0aGUgc2FtZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFzIHRoZQorICAgICAqIC5ORVQgZnJhbWV3b3JrIGVkaXRpb24KKyAgICAgKiBAcGFyYW0gZXhlY3V0YWJsZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlKFN0cmluZyBleGVjdXRhYmxlKSB7CisgICAgICAgIHRoaXMuZXhlY3V0YWJsZSA9IGV4ZWN1dGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogIHRlc3QgZm9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgc29tZXRoaW5nIHVzZWZ1bAorICAgICAqCisgICAgICpAcGFyYW0gIHMgIHN0cmluZyBpbgorICAgICAqQHJldHVybiAgICB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG5vdEVtcHR5KFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBzICE9IG51bGwgJiYgcy5sZW5ndGgoKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIHZhbGlkYXRpb24gY29kZQorICAgICAqIEB0aHJvd3MgIEJ1aWxkRXhjZXB0aW9uICBpZiB2YWxpZGF0aW9uIGZhaWxlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvdXRwdXRGaWxlICE9IG51bGwgJiYgb3V0cHV0RmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3RGaWxlIGNhbm5vdCBiZSBhIGRpcmVjdG9yeSIpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRFeGVjdXRhYmxlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBleGVjdXRhYmxlIGRlZmluZWQgZm9yIHRoaXMgdGFzayIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXR0ZXJuIGZvciBmaWxlcyB0byBjb21waWxlLgorICAgICAqIEByZXR1cm4gVGhlIGNvbXBpbGF0aW9uIGZpbGUgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXR0ZXJuKCkgeworICAgICAgICByZXR1cm4gIioqLyouIiArIGdldEZpbGVFeHRlbnNpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXR0ZXIgZm9yIGZsYWcKKyAgICAgKiBAcmV0dXJuIFRoZSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29tcGlsYXRpb24gaXMgdXNpbmcgYSByZXNwb25zZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVXNlUmVzcG9uc2VGaWxlKCkgeworICAgICAgICByZXR1cm4gdXNlUmVzcG9uc2VGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gdHVybiBvbiByZXNwb25zZSBmaWxlIHVzZTsgZGVmYXVsdD1mYWxzZS4KKyAgICAgKiBXaGVuIHNldCB0aGUgY29tbWFuZCBwYXJhbXMgYXJlIHNhdmVkIHRvIGEgZmlsZSBhbmQKKyAgICAgKiB0aGlzIGlzIHBhc3NlZCBpbiB3aXRoIEBmaWxlLiBUaGUgdGFzayBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzCisgICAgICogdG8gdGhpcyBtb2RlIHdpdGggYmlnIGNvbW1hbmRzOyB0aGlzIG9wdGlvbiBpcyBoZXJlIGZvcgorICAgICAqIHRlc3RpbmcgYW5kIGVtZXJnZW5jaWVzCisgICAgICogQHBhcmFtIHVzZVJlc3BvbnNlRmlsZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZVJlc3BvbnNlRmlsZShib29sZWFuIHVzZVJlc3BvbnNlRmlsZSkgeworICAgICAgICB0aGlzLnVzZVJlc3BvbnNlRmlsZSA9IHVzZVJlc3BvbnNlRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZG8gdGhlIHdvcmsgYnkgYnVpbGRpbmcgdGhlIGNvbW1hbmQgbGluZSBhbmQgdGhlbiBjYWxsaW5nIGl0CisgICAgICoKKyAgICAgKkB0aHJvd3MgIEJ1aWxkRXhjZXB0aW9uICBpZiB2YWxpZGF0aW9uIG9yIGV4ZWN1dGlvbiBmYWlsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKKyAgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBsb2coIlRoaXMgdGFzayBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvblxuIgorICAgICAgICAgICAgKyAib2YgQW50LiAgSXQgaXMgbm93IHBhcnQgb2YgdGhlIC5ORVQgQW50bGliOlxuIgorICAgICAgICAgICAgKyAiaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvZG90bmV0L2luZGV4Lmh0bWwiLAorICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgTmV0Q29tbWFuZCBjb21tYW5kID0gY3JlYXRlTmV0Q29tbWFuZCgpOworICAgICAgICAvL3NldCB1cCByZXNwb25zZSBmaWxlIG9wdGlvbnMKKyAgICAgICAgY29tbWFuZC5zZXRBdXRvbWF0aWNSZXNwb25zZUZpbGVUaHJlc2hvbGQoQVVUT01BVElDX1JFU1BPTlNFX0ZJTEVfVEhSRVNIT0xEKTsKKyAgICAgICAgY29tbWFuZC5zZXRVc2VSZXNwb25zZUZpbGUodXNlUmVzcG9uc2VGaWxlKTsKKyAgICAgICAgLy9maWxsIGluIGFyZ3MKKyAgICAgICAgZmlsbEluU2hhcmVkUGFyYW1ldGVycyhjb21tYW5kKTsKKyAgICAgICAgYWRkUmVzb3VyY2VzKGNvbW1hbmQpOworICAgICAgICBhZGRDb21waWxlclNwZWNpZmljT3B0aW9ucyhjb21tYW5kKTsKKyAgICAgICAgaW50IHJlZmVyZW5jZXNPdXRPZkRhdGUKKyAgICAgICAgICAgID0gYWRkUmVmZXJlbmNlRmlsZXNldHMoY29tbWFuZCwgZ2V0T3V0cHV0RmlsZVRpbWVzdGFtcCgpKTsKKyAgICAgICAgLy9pZiB0aGUgcmVmcyBhcmUgb3V0IG9mIGRhdGUsIGZvcmNlIGEgYnVpbGQuCisgICAgICAgIGJvb2xlYW4gZm9yY2VCdWlsZCA9IHJlZmVyZW5jZXNPdXRPZkRhdGUgPiAwOworICAgICAgICBhZGRGaWxlc0FuZEV4ZWN1dGUoY29tbWFuZCwgZm9yY2VCdWlsZCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlbGltaXRlciB0aGF0IHRoZSBjb21waWxlciB1c2VzIGJldHdlZW4gcmVmZXJlbmNlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYyMgd2lsbCByZXR1cm4gIjsiOyBWQi5ORVQgd2lsbCByZXR1cm4gIiwiCisgICAgICogQHJldHVybiBUaGUgc3RyaW5nIGRlbGltaXRlciBmb3IgdGhlIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSZWZlcmVuY2VEZWxpbWl0ZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZXh0ZW5zaW9uIG9mIGZpbGVuYW1lcyB0byBjb21waWxlLgorICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyBleHRlbnNpb24gb2YgZmlsZXMgdG8gY29tcGlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKTsKKworCisgICAgLyoqCisgICAgICogZmlsbCBpbiB0aGUgY29tbW9uIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIG5ldCBjb21tYW5kLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpbGxJblNoYXJlZFBhcmFtZXRlcnMoTmV0Q29tbWFuZCBjb21tYW5kKSB7CisgICAgICAgIGNvbW1hbmQuc2V0RmFpbE9uRXJyb3IoZ2V0RmFpbE9uRXJyb3IoKSk7CisgICAgICAgIC8vZmlsbCBpbiBhcmdzCisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoIi9ub2xvZ28iKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRBZGRpdGlvbmFsTW9kdWxlc1BhcmFtZXRlcigpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXREZWJ1Z1BhcmFtZXRlcigpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXREZWZpbml0aW9uc1BhcmFtZXRlcigpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudHMoZ2V0RXh0cmFPcHRpb25zUGFyYW1ldGVycygpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRNYWluQ2xhc3NQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0T3B0aW1pemVQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0RGVzdEZpbGVQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0UmVmZXJlbmNlc1BhcmFtZXRlcigpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRUYXJnZXRUeXBlUGFyYW1ldGVyKCkpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldFV0ZjhPdXRwdXRQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0V2luMzJJY29uUGFyYW1ldGVyKCkpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldFdpbjMyUmVzUGFyYW1ldGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZvciBldmVyeSByZXNvdXJjZSBkZWNsYXJlZCwgd2UgZ2V0IHRoZSAobGFuZ3VhZ2Ugc3BlY2lmaWMpCisgICAgICogcmVzb3VyY2Ugc2V0dGluZworICAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBuZXQgY29tbWFuZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZXMoTmV0Q29tbWFuZCBjb21tYW5kKSB7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSByZXNvdXJjZXMuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIERvdG5ldFJlc291cmNlIHJlc291cmNlID0gKERvdG5ldFJlc291cmNlKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBjcmVhdGVSZXNvdXJjZVBhcmFtZXRlcihjb21tYW5kLCByZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCBhIEMjIHN0eWxlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZVJlc291cmNlUGFyYW1ldGVyKE5ldENvbW1hbmQgY29tbWFuZCwgRG90bmV0UmVzb3VyY2UgcmVzb3VyY2UpOworCisKKyAgICAvKioKKyAgICAgKiBydW4gdGhyb3VnaCB0aGUgbGlzdCBvZiByZWZlcmVuY2UgZmlsZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjb21tYW5kCisgICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgdG8gdXNlLgorICAgICAqIEBwYXJhbSBvdXRwdXRUaW1lc3RhbXAgdGltZXN0YW1wIHRvIGNvbXBhcmUgYWdhaW5zdAorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZpbGVzIG91dCBvZiBkYXRlCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgaW50IGFkZFJlZmVyZW5jZUZpbGVzZXRzKE5ldENvbW1hbmQgY29tbWFuZCwgbG9uZyBvdXRwdXRUaW1lc3RhbXApIHsKKyAgICAgICAgaW50IGZpbGVzT3V0T2ZEYXRlID0gMDsKKyAgICAgICAgSGFzaHRhYmxlIGZpbGVzVG9CdWlsZCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VGaWxlc2V0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSByZWZlcmVuY2VGaWxlc2V0cy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBmaWxlc091dE9mRGF0ZSArPSBjb21tYW5kLnNjYW5PbmVGaWxlc2V0KAorICAgICAgICAgICAgICAgICAgICBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSksCisgICAgICAgICAgICAgICAgICAgIGZpbGVzVG9CdWlsZCwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0VGltZXN0YW1wKTsKKyAgICAgICAgfQorICAgICAgICAvL2JhaWwgb3V0IGVhcmx5IGlmIHRoZXJlIHdlcmUgbm8gZmlsZXMKKyAgICAgICAgaWYgKGZpbGVzVG9CdWlsZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLy9ub3cgc2NhbiB0aGUgaGFzaHRhYmxlIGFuZCBhZGQgdGhlIGZpbGVzCisgICAgICAgIEVudW1lcmF0aW9uIGZpbGVzID0gZmlsZXNUb0J1aWxkLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChmaWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpIGZpbGVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoaXNGaWxlTWFuYWdlZEJpbmFyeShmaWxlKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1dpbmRvd3MpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgKKyAgICAgICAgICAgICAgICAgICAgJyInICsgUkVGRVJFTkNFX09QVElPTiArIGZpbGUudG9TdHJpbmcoKSArICciJyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChSRUZFUkVOQ0VfT1BUSU9OICsgZmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygiaWdub3JpbmcgIiArIGZpbGUgKyAiIGFzIGl0IGlzIG5vdCBhIG1hbmFnZWQgZXhlY3V0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbGVzT3V0T2ZEYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZSBvdXIgaGVscGVyIGNvbW1hbmQKKyAgICAgKiBAcmV0dXJuIGEgY29tbWFuZCBwcmVmaWxsZWQgd2l0aCB0aGUgZXhlIG5hbWUgYW5kIHRhc2sgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBOZXRDb21tYW5kIGNyZWF0ZU5ldENvbW1hbmQoKSB7CisgICAgICAgIE5ldENvbW1hbmQgY29tbWFuZCA9IG5ldyBOZXRDb21tYW5kKHRoaXMsIGdldFRhc2tOYW1lKCksIGdldEV4ZWN1dGFibGUoKSk7CisgICAgICAgIHJldHVybiBjb21tYW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbnkgY29tcGlsZXIgc3BlY2lmaWNzCisgICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZENvbXBpbGVyU3BlY2lmaWNPcHRpb25zKE5ldENvbW1hbmQgY29tbWFuZCk7CisKKyAgICAvKioKKyAgICAgKiBvdmVycmlkZSBwb2ludCBmb3IgZGVsaW1pdGluZyBkZWZpbml0aW9ucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBkZWZpbml0aW9ucyBsaW1pdGVyLCBpLmUuLCAiOyIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25zRGVsaW1pdGVyKCkgeworICAgICAgICByZXR1cm4gIjsiOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdGVzdCBmb3IgYSBmaWxlIGJlaW5nIG1hbmFnZWQgb3Igbm90CisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2UgdGhpbmsgdGhpcyBpcyBhIG1hbmFnZWQgZXhlY3V0YWJsZSwgYW5kIHRodXMgT0sKKyAgICAgKiBmb3IgbGlua2luZworICAgICAqIEB0b2RvIGxvb2sgYXQgdGhlIFBFIGhlYWRlciBvZiB0aGUgZXhlIGFuZCBzZWUgaWYgaXQgaXMgbWFuYWdlZCBvciBub3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRmlsZU1hbmFnZWRCaW5hcnkoRmlsZSBmaWxlKSB7CisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICByZXR1cm4gZmlsZW5hbWUuZW5kc1dpdGgoIi5leGUiKSB8fCBmaWxlbmFtZS5lbmRzV2l0aCgiLmRsbCIpCisgICAgICAgICAgICAgICAgfHwgZmlsZW5hbWUuZW5kc1dpdGgoIi5uZXRtb2R1bGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYXJnZXQgdHlwZXMgdG8gYnVpbGQuCisgICAgICogdmFsaWQgYnVpbGQgdHlwZXMgYXJlIGV4ZXxsaWJyYXJ5fG1vZHVsZXx3aW5leGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhcmdldFR5cGVzIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgImV4ZSIsCisgICAgICAgICAgICAgICAgImxpYnJhcnkiLAorICAgICAgICAgICAgICAgICJtb2R1bGUiLAorICAgICAgICAgICAgICAgICJ3aW5leGUiCisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisKK30KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvRG90bmV0RGVmaW5lLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvRG90bmV0RGVmaW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlMzM2ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9Eb3RuZXREZWZpbmUuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kb3RuZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogZGVmaW5pdGlvbnMgY2FuIGJlIGNvbmRpdGlvbmFsLiBXaGF0IC5ORVQgY29uZGl0aW9ucyBjYW4gbm90IGJlCisgKiBpcyBpbiBhbnkgc3RhdGUgb3RoZXIgdGhhbiBkZWZpbmVkIGFuZCB1bmRlZmluZWQ7IHlvdSBjYW5ub3QgZ2l2ZQorICogYSBkZWZpbml0aW9uIGEgdmFsdWUuCisgKi8KK3B1YmxpYyBjbGFzcyBEb3RuZXREZWZpbmUgeworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgaWZDb25kOworICAgIHByaXZhdGUgU3RyaW5nIHVubGVzc0NvbmQ7CisKKworICAgIC8qKgorICAgICAqIHRoZSBuYW1lIG9mIGEgcHJvcGVydHkgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGZvcgorICAgICAqIHRoZSBkZWZpbml0aW9uIHRvIGJlIHNldC4gT3B0aW9uYWwuCisgICAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZihTdHJpbmcgY29uZGl0aW9uKSB7CisgICAgICAgIHRoaXMuaWZDb25kID0gY29uZGl0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoZSBuYW1lIG9mIGEgcHJvcGVydHkgd2hpY2ggbXVzdCBiZSB1bmRlZmluZWQgZm9yCisgICAgICogdGhlIGRlZmluaXRpb24gdG8gYmUgc2V0LiBPcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVubGVzcyhTdHJpbmcgY29uZGl0aW9uKSB7CisgICAgICAgIHRoaXMudW5sZXNzQ29uZCA9IGNvbmRpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGRlZmluaXRpb24uCisgICAgICogQHJldHVybiB0aGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoZSBuYW1lIG9mIHRoZSBkZWZpbml0aW9uLiBSZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZ2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBkZWZpbml0aW9uLiBXaWxsIGJlIG51bGwgaWYgYSBjb25kaXRpb24KKyAgICAgKiB3YXMgZGVjbGFyZWQgYW5kIG5vdCBtZXQKKyAgICAgKiBAcGFyYW0gb3duZXIgb3duaW5nIHRhc2sKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgZGVmaW5pdGlvbi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoVGFzayBvd25lcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBuYW1lIHByb3ZpZGVkIGZvciB0aGUgZGVmaW5lIGVsZW1lbnQiLAorICAgICAgICAgICAgICAgIG93bmVyLmdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmICghaXNTZXQob3duZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGxvZ2ljIHRha2VuIGZyb20gcGF0dGVybnNldAorICAgICAqIEBwYXJhbSBvd25lciB0aGUgb3duaW5nIHRhc2suCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25kaXRpb24gaXMgdmFsaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NldChUYXNrIG93bmVyKSB7CisgICAgICAgIFByb2plY3QgcCA9IG93bmVyLmdldFByb2plY3QoKTsKKyAgICAgICAgaWYgKGlmQ29uZCAhPSBudWxsICYmIHAuZ2V0UHJvcGVydHkoaWZDb25kKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAodW5sZXNzQ29uZCAhPSBudWxsICYmIHAuZ2V0UHJvcGVydHkodW5sZXNzQ29uZCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9Eb3RuZXRSZXNvdXJjZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L0RvdG5ldFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhNGY2MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9Eb3RuZXRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworCisvKioKKyAqIFVzZWQgYnkge0BsaW5rIERvdG5ldENvbXBpbGV9IHRvIG5hbWUgcmVzb3VyY2VzLgorICogQ291bGQgYmUgdXBncmFkZWQgdG8gYSBkYXRhdHlwZSBpbiB0aGUgZGlzdGFudCBmdXR1cmUuCisgKiBBIHJlc291cmNlIG1hcHMgdG8gL3JlczpmaWxlLG5hbWUKKyAqLworcHVibGljIGNsYXNzIERvdG5ldFJlc291cmNlIHsKKworICAgIC8qKgorICAgICAqIG5hbWUgb2YgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZmlsZTsKKworICAgIC8qKgorICAgICAqIGVtYmVkIChkZWZhdWx0KSBvciBsaW5rIHRoZSByZXNvdXJjZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBlbWJlZCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiB0aGlzIGlzIHVzZWQgaW4gVkJDIGFuZCBKU0MKKyAgICAgKi8KKyAgICBwcml2YXRlIEJvb2xlYW4gaXNQdWJsaWMgPSBudWxsOworCisgICAgLyoqCisgICAgICogbmFtZSBvZiB0aGUgb2JqZWN0CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBBIGxpc3Qgb2YgZmlsZXNldHMgd2l0aCByZXNvdXJjZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgZmlsZVNldHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBhIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdpdGggPGZpbGVzZXRzPgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGVtYmVkIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbWJlZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtYmVkKCkgeworICAgICAgICByZXR1cm4gZW1iZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogZW1iZWQgdGhlIHJlc291cmNlIGluIHRoZSBhc3NlbWJseSAoZGVmYXVsdCwgdHJ1ZSkgb3IganVzdCBsaW5rIHRvIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGVtYmVkIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW1iZWQoYm9vbGVhbiBlbWJlZCkgeworICAgICAgICB0aGlzLmVtYmVkID0gZW1iZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZpbGUgcmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgZmlsZSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgeworICAgICAgICByZXR1cm4gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBuYW1lIHRoZSByZXNvdXJjZQorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHB1YmxpYyBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgcHVibGljIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQm9vbGVhbiBnZXRQdWJsaWMoKSB7CisgICAgICAgIHJldHVybiBpc1B1YmxpYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWQiBhbmQgSiMgb25seTogaXMgYSByZXNvdXJjZSBwdWJsaWMgb3Igbm90PworICAgICAqCisgICAgICogQHBhcmFtIGFQdWJsaWMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQdWJsaWMoQm9vbGVhbiBhUHVibGljKSB7CisgICAgICAgIGlzUHVibGljID0gYVB1YmxpYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzaG91bGQgdGhlIHJlc291cmNlIGhhdmUgYSBuYW1lPworICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWxlc2V0cyByb290IG5hbWVzcGFjZS4gVGhlIHZhbHVlIGFsd2F5cyBlbmRzIHdpdGggJy4nIC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIG5hbWVzcGFjZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7CisgICAgICAgIHJldHVybiBuYW1lc3BhY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBmaWxlc2V0cyByb290IG5hbWVzcGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKKyAgICAgKiAgICAgICAgICAgIFN0cmluZyByb290IG5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7CisgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSAobmFtZXNwYWNlLmxlbmd0aCgpID09IDAgfHwgbmFtZXNwYWNlLmVuZHNXaXRoKCIuIikgPyBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgOiBuYW1lc3BhY2UgKyAnLicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVycygpIHsKKyAgICAgICAgaWYgKGhhc0ZpbGVzZXRzKCkpIHsKKyAgICAgICAgICAgIGlmIChnZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgdXNlIDxyZXNvdXJjZSBuYW1lPVwiLi4uXCI+IGF0dHJpYnV0ZSB3aXRoIGZpbGVzZXRzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8cmVzb3VyY2UgZmlsZT1cIi4uLlwiPiBhdHRyaWJ1dGUgd2l0aCBmaWxlc2V0cyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGdldE5hbWVzcGFjZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8cmVzb3VyY2UgbmFtZXNwYWNlPVwiLi4uXCI+IGF0dHJpYnV0ZSB3aXRob3V0IGZpbGVzZXRzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBidWlsZCB0aGUgQyMgc3R5bGUgcGFyYW1ldGVyICh3aGljaCBoYXMgbm8gcHVibGljL3ByaXZhdGUgb3B0aW9uKQorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQuCisgICAgICogQHBhcmFtIGNzaGFycFN0eWxlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldFBhcmFtZXRlcnMoUHJvamVjdCBwLCBOZXRDb21tYW5kIGNvbW1hbmQsIGJvb2xlYW4gY3NoYXJwU3R5bGUpIHsKKyAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7CisgICAgICAgIGlmIChoYXNGaWxlc2V0cygpKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGxpc3RJdGVyID0gZmlsZVNldHMuaXRlcmF0b3IoKTsgbGlzdEl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgbGlzdEl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gZnMuZ2V0RGlyKHApLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZSgpOyAvLyBlbmRzIHdpdGggJy4nIG9yIG51bGwKKyAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlID0gZmlsZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0UGFyYW1ldGVyKGJhc2VEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lc3BhY2UgPT0gbnVsbCA/IG51bGwgOiBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKSksIGNzaGFycFN0eWxlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRQYXJhbWV0ZXIoZ2V0RmlsZSgpLnRvU3RyaW5nKCksIGdldE5hbWUoKSwgY3NoYXJwU3R5bGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBuYW1lLCBib29sZWFuIGNzaGFycFN0eWxlKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoaXNFbWJlZCgpID8gIi9yZXNvdXJjZSIgOiAiL2xpbmtyZXNvdXJjZSIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCc6Jyk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZmlsZU5hbWUpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgaWYgKGNzaGFycFN0eWxlKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldFB1YmxpYygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGlzIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwdWJsaWMvcHJpdmF0ZSBvcHRpb24uIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFB1YmxpYygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UHVibGljKCkuYm9vbGVhblZhbHVlKCkgPyAicHVibGljIiA6ICJwcml2YXRlIik7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0UHVibGljKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IGNhbm5vdCBoYXZlIGEgcHVibGljIG9yIHByaXZhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAib3B0aW9uIHdpdGhvdXQgbmFtaW5nIHRoZSByZXNvdXJjZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcmVzb3VyY2UgZmlsZSBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZXNldAorICAgICAqICAgICAgICAgICAgRmlsZVNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBmaWxlc2V0KSB7CisgICAgICAgIGZpbGVTZXRzLmFkZChmaWxlc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCA8cmVzb3VyY2U+IG5vZGUgaGFzIGVtYmVkZGVkIDxmaWxlc2V0cz4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpbGVzZXRzKCkgeworICAgICAgICByZXR1cm4gZmlsZVNldHMuc2l6ZSgpID4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvSWxhc20uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9JbGFzbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmE0OWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvSWxhc20uamF2YQpAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworLyoKKyAqICBidWlsZCBub3RlcworICogIC1UaGUgcmVmZXJlbmNlIENEIHRvIGxpc3RlbiB0byB3aGlsZSBlZGl0aW5nIHRoaXMgZmlsZSBpcworICogIG5hcDogVW5kZXJ3b3JsZCAgLSBFdmVyeXRoaW5nLCBFdmVyeXRoaW5nCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kb3RuZXQ7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworCisvKioKKyAqIEFzc2VtYmxlcyAuTkVUIEludGVybWVkaWF0ZSBMYW5ndWFnZSBmaWxlcy4KKyAqIGlsYXNtLmV4ZSBtdXN0IGJlIG9uIHRoZSBleGVjdXRlIHBhdGgsIHVubGVzcyBhbm90aGVyIGV4ZWN1dGFibGUKKyAqIG9yIHRoZSBmdWxsIHBhdGggdG8gdGhhdCBleGVjdXRhYmxlIGlzIHNwZWNpZmllZCBpbiB0aGUgPHR0PmV4ZWN1dGFibGU8L3R0PgorICogcGFyYW1ldGVyCisgKiAgPHA+CisgKgorICogIDxwPgorICoKKyAqICBBbGwgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWw6ICZsdDtpbC8mZ3Q7IHNob3VsZCBzdWZmaWNlIHRvIHByb2R1Y2UgYSBkZWJ1ZworICogIGJ1aWxkIG9mIGFsbCAqLmlsIGZpbGVzLiBUaGUgb3B0aW9uIHNldCBpcyByb3VnaGx5IGNvbXBhdGlibGUgd2l0aCB0aGUKKyAqICBDU2hhcnAgY2xhc3M7IGV2ZW4gdGhvdWdoIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgb25seSB2YWd1ZWx5CisgKiAgZXF1aXZhbGVudC4gW1RoZSBsb3cgbGV2ZWwgY29tbWFuZHMgdGFrZSB0aGluZ3MgbGlrZSAvT1VUPWZpbGUsIGNzYyB3YW50cworICogIC9vdXQ6ZmlsZSAuLi4gL3ZlcmJvc2UgaXMgdXNlZCBzb21lIHBsYWNlczsgL3F1aWV0IGhlcmUgaW4gaWxkYXNtLi4uIGV0Yy5dCisgKiAgSXQgd291bGQgYmUgbmljZSBpZiBzb21lb25lIG1hZGUgYWxsIHRoZSBjb21tYW5kIGxpbmUgdG9vbHMgY29uc2lzdGVudCAoYW5kCisgKiAgbm90IGFzIGJyaXR0bGUgYXMgdGhlIGphdmEgY21kbGluZSB0b29scykgPHA+CisgKiAgPHA+CisgKiAgVGhlIHRhc2sgaXMgYSBkaXJlY3RvcnkgYmFzZWQgdGFzaywgc28gYXR0cmlidXRlcyBsaWtlIDxiPmluY2x1ZGVzPSIqLmlsIgorICogIDwvYj4gYW5kIDxiPmV4Y2x1ZGVzPSJicm9rZW4uaWwiPC9iPiBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBmaWxlcyBwdWxsZWQKKyAqICBpbi4gWW91IGNhbiBhbHNvIHVzZSBuZXN0ZWQgJmx0O3NyYyZndCBmaWxlc2V0cyB0byByZWZlciB0byBzb3VyY2UuCisgKiA8cD4KKyAqCisgKiBAYW50LnRhc2sgICAgbmFtZT0iaWxhc20iIGNhdGVnb3J5PSJkb3RuZXQiCisgKi8KKworcHVibGljIGNsYXNzIElsYXNtCisgICAgICAgICBleHRlbmRzIERvdG5ldEJhc2VNYXRjaGluZ1Rhc2sgeworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvLyBDaGVja1N0eWxlOkNvbnN0YW50TmFtZUNoZWNrIE9GRiAtIGJjCisgICAgLyoqCisgICAgICogIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuIFRoZSAuZXhlIHN1ZmZpeCBpcyBkZWxpYmVyYXRlbHkgbm90IGluY2x1ZGVkIGluCisgICAgICogIGFudGljaXBhdGlvbiBvZiB0aGUgdW5peCB2ZXJzaW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXhlX25hbWUgPSAiaWxhc20iOworCisgICAgLyoqCisgICAgICogIHdoYXQgaXMgdGhlIGZpbGUgZXh0ZW5zaW9uIHdlIHNlYXJjaCBvbj8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBmaWxlX2V4dCA9ICJpbCI7CisKKyAgICAvKioKKyAgICAgKiAgYW5kIG5vdyBkZXJpdmUgdGhlIHNlYXJjaCBwYXR0ZXJuIGZyb20gdGhlIGV4dGVuc2lvbgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGZpbGVfcGF0dGVybiA9ICIqKi8qLiIgKyBmaWxlX2V4dDsKKworICAgIC8qKgorICAgICAqICB0aXRsZSBvZiB0YXNrIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBleGVfdGl0bGUgPSAiaWxhc20iOworCisgICAgLyoqCisgICAgICogIHR5cGUgb2YgdGFyZ2V0LiBTaG91bGQgYmUgb25lIG9mIGV4ZXxsaWJyYXJ5fG1vZHVsZXx3aW5leGV8KG51bGwpCisgICAgICogIGRlZmF1bHQgaXMgZXhlOyB0aGUgYWN0dWFsIHZhbHVlIChpZiBub3QgbnVsbCkgaXMgZmVkIHRvIHRoZSBjb21tYW5kCisgICAgICogIGxpbmUuIDxicj4KKyAgICAgKiAgU2VlIC90YXJnZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldFR5cGU7CisKKyAgICAvKioKKyAgICAgKiAgdmVyYm9zZSBmbGFnCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZTsKKworICAgIC8qKgorICAgICAqICBsaXN0aW5nIGZsYWcKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBib29sZWFuIGxpc3Rpbmc7CisKKyAgICAvKioKKyAgICAgKiAgcmVzb3VyY2UgZmlsZSAoLnJlcyBmb3JtYXQpIHRvIGluY2x1ZGUgaW4gdGhlIGFwcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSByZXNvdXJjZUZpbGU7CisKKyAgICAvKioKKyAgICAgKiAgZmxhZyB0byBjb250cm9sIGFjdGlvbiBvbiBleGVjdXRpb24gdHJvdWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGZhaWxPbkVycm9yOworCisgICAgLyoqCisgICAgICogIGRlYnVnIGZsYWcuIENvbnRyb2xzIGdlbmVyYXRpb24gb2YgZGVidWcgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7CisKKyAgICAvKioKKyAgICAgKiAgZmlsZSBjb250YWluaW5nIHByaXZhdGUga2V5CisgICAgICovCisKKyAgICBwcml2YXRlIEZpbGUga2V5ZmlsZTsKKworICAgIC8qKgorICAgICAqICBhbnkgZXh0cmEgY29tbWFuZCBvcHRpb25zPworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFPcHRpb25zOworCisgICAgLyoqCisgICAgICogZmlsZXNldHMgb2YgcmVmZXJlbmNlcworICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgcmVmZXJlbmNlRmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvLyBDaGVja1N0eWxlOkNvbnN0YW50TmFtZUNoZWNrIE9OCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTW9ubyA9ICFPcy5pc0ZhbWlseSgid2luZG93cyIpOworCisgICAgLyoqCisgICAgICogIGNvbnN0cnVjdG9yIGluaXRzIGV2ZXJ5dGhpbmcgYW5kIHNldCB1cCB0aGUgc2VhcmNoIHBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgSWxhc20oKSB7CisgICAgICAgIENsZWFyKCk7CisgICAgICAgIHNldEluY2x1ZGVzKGZpbGVfcGF0dGVybik7CisgICAgfQorCisgICAgLy8gQ2hlY2tTdHlsZTpNZXRob2ROYW1lQ2hlY2sgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiAgcmVzZXQgYWxsIGNvbnRlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIENsZWFyKCkgeworICAgICAgICB0YXJnZXRUeXBlID0gbnVsbDsKKyAgICAgICAgc3JjRGlyID0gbnVsbDsKKyAgICAgICAgbGlzdGluZyA9IGZhbHNlOworICAgICAgICB2ZXJib3NlID0gZmFsc2U7CisgICAgICAgIGRlYnVnID0gdHJ1ZTsKKyAgICAgICAgb3V0cHV0RmlsZSA9IG51bGw7CisgICAgICAgIGZhaWxPbkVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmVzb3VyY2VGaWxlID0gbnVsbDsKKyAgICAgICAgZXh0cmFPcHRpb25zID0gbnVsbDsKKyAgICB9CisgICAgLy8gQ2hlY2tTdHlsZTpNZXRob2ROYW1lQ2hlY2sgT04KKworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0eXBlIG9mIHRhcmdldCwgZWl0aGVyICJleGUiIG9yICJsaWJyYXJ5Ii4KKyAgICAgKgorICAgICAqQHBhcmFtICB0YXJnZXRUeXBlICAgICAgICAgIG9uZSBvZiBleGV8bGlicmFyeXwKKyAgICAgKkBleGNlcHRpb24gIEJ1aWxkRXhjZXB0aW9uICBpZiB0YXJnZXQgaXMgbm90IG9uZSBvZgorICAgICAqICAgICAgZXhlfGxpYnJhcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRUeXBlKFN0cmluZyB0YXJnZXRUeXBlKQorICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMudGFyZ2V0VHlwZSA9IHRhcmdldFR5cGUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgaWYgKCF0YXJnZXRUeXBlLmVxdWFscygiZXhlIikgJiYgIXRhcmdldFR5cGUuZXF1YWxzKCJsaWJyYXJ5IikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGFyZ2V0VHlwZSAiICsgdGFyZ2V0VHlwZSArICIgaXMgbm90IGEgdmFsaWQgdHlwZSIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgYWNjZXNzb3IgbWV0aG9kIGZvciB0YXJnZXQgdHlwZQorICAgICAqCisgICAgICpAcmV0dXJuICAgIHRoZSBjdXJyZW50IHRhcmdldCBvcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXRUeXBlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIGcgZ2V0IHRoZSB0YXJnZXQgdHlwZSBvciBudWxsIGZvciBubyBhcmd1bWVudCBuZWVkZWQKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgVGFyZ2V0VHlwZVBhcmFtZXRlciB2YWx1ZQorICAgICAqLworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRUeXBlUGFyYW1ldGVyKCkgeworICAgICAgICBpZiAoIW5vdEVtcHR5KHRhcmdldFR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFyZ2V0VHlwZS5lcXVhbHMoImV4ZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gIi9leGUiOworICAgICAgICB9IGVsc2UgaWYgKHRhcmdldFR5cGUuZXF1YWxzKCJsaWJyYXJ5IikpIHsKKyAgICAgICAgICAgIHJldHVybiAiL2RsbCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgT3duZXIgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtICBzICBUaGUgbmV3IE93bmVyIHZhbHVlCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE93bmVyKFN0cmluZyBzKSB7CisgICAgICAgIGxvZygiVGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBJTEFTTSBhcyBvZiBCZXRhLTIsICIKKyAgICAgICAgICAgICsgImFuZCB3aWxsIGJlIGlnbm9yZWQiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICB0ZXN0IGZvciBhIHN0cmluZyBjb250YWluaW5nIHNvbWV0aGluZyB1c2VmdWwKKyAgICAgKgorICAgICAqQHBhcmFtICBzICAgICAgIGFueSBzdHJpbmcKKyAgICAgKkByZXR1cm4gICAgICAgICB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG5vdEVtcHR5KFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBzICE9IG51bGwgJiYgcy5sZW5ndGgoKSAhPSAwOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIElmIHRydWUsIGVuYWJsZSB2ZXJib3NlIElMQVNNIG91dHB1dC4KKyAgICAgKgorICAgICAqQHBhcmFtICBiICBmbGFnIHNldCB0byB0cnVlIGZvciB2ZXJib3NlIG9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIGIpIHsKKyAgICAgICAgdmVyYm9zZSA9IGI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgdHVybiB0aGUgdmVyYm9zZSBmbGFnIGludG8gYSBwYXJhbWV0ZXIgZm9yIElMQVNNCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgbnVsbCBvciB0aGUgYXBwcm9wcmlhdGUgY29tbWFuZCBsaW5lIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyYm9zZVBhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIHZlcmJvc2UgPyBudWxsIDogIi9xdWlldCI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBwcm9kdWNlIGEgbGlzdGluZyAob2ZmIGJ5IGRlZmF1bHQpLgorICAgICAqCisgICAgICpAcGFyYW0gIGIgIGZsYWcgc2V0IHRvIHRydWUgZm9yIGxpc3Rpbmcgb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0aW5nKGJvb2xlYW4gYikgeworICAgICAgICBsaXN0aW5nID0gYjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICB0dXJuIHRoZSBsaXN0aW5nIGZsYWcgaW50byBhIHBhcmFtZXRlciBmb3IgSUxBU00KKyAgICAgKgorICAgICAqQHJldHVybiAgICB0aGUgYXBwcm9wcmlhdGUgc3RyaW5nIGZyb20gdGhlIHN0YXRlIG9mIHRoZSBsaXN0aW5nIGZsYWcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RpbmdQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmICghaXNNb25vKSB7CisgICAgICAgICAgICByZXR1cm4gbGlzdGluZyA/ICIvbGlzdGluZyIgOiAiL25vbGlzdGluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG91dHB1dCBmaWxlOyBpZGVudGljYWwgdG8gc2V0RGVzdEZpbGUKKyAgICAgKiBAc2VlIERvdG5ldEJhc2VNYXRjaGluZ1Rhc2sjc2V0RGVzdEZpbGUKKyAgICAgKkBwYXJhbSAgcGFyYW1zICBUaGUgbmV3IG91dHB1dEZpbGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlKEZpbGUgcGFyYW1zKSB7CisgICAgICAgIG91dHB1dEZpbGUgPSBwYXJhbXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZ2V0IHRoZSBvdXRwdXQgZmlsZQorICAgICAqCisgICAgICpAcmV0dXJuICAgIHRoZSBhcmd1bWVudCBzdHJpbmcgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE91dHB1dEZpbGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmIChvdXRwdXRGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiL291dHB1dD0iICsgb3V0cHV0RmlsZS50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogbmFtZSBvZiByZXNvdXJjZSBmaWxlIHRvIGluY2x1ZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGZpbGVOYW1lICBwYXRoIHRvIHRoZSBmaWxlLiBDYW4gYmUgcmVsYXRpdmUsIGFic29sdXRlLCB3aGF0ZXZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUZpbGUoRmlsZSBmaWxlTmFtZSkgeworICAgICAgICByZXNvdXJjZUZpbGUgPSBmaWxlTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBHZXRzIHRoZSByZXNvdXJjZUZpbGVQYXJhbWV0ZXIgYXR0cmlidXRlIG9mIHRoZSBJbGFzbSB0YXNrCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgVGhlIHJlc291cmNlRmlsZVBhcmFtZXRlciB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VGaWxlUGFyYW1ldGVyKCkgeworICAgICAgICBpZiAocmVzb3VyY2VGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiL3Jlc291cmNlPSIgKyByZXNvdXJjZUZpbGUudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBmYWlscyBpZiBpbGFzbSB0b29sIGZhaWxzLgorICAgICAqCisgICAgICpAcGFyYW0gIGIgIFRoZSBuZXcgZmFpbE9uRXJyb3IgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGIpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSBiOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIHF1ZXJ5IGZhaWwgb24gZXJyb3IgZmxhZworICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSBmYWlsRmFpbE9uRXJyb3IgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsT25FcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIGZhaWxPbkVycm9yOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIHNldCB0aGUgZGVidWcgZmxhZyBvbiBvciBvZmYuCisgICAgICoKKyAgICAgKkBwYXJhbSAgZiAgb24vb2ZmIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGYpIHsKKyAgICAgICAgZGVidWcgPSBmOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIHF1ZXJ5IHRoZSBkZWJ1ZyBmbGFnCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgdHJ1ZSBpZiBkZWJ1ZyBpcyB0dXJuZWQgb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWJ1ZygpIHsKKyAgICAgICAgcmV0dXJuIGRlYnVnOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgVGhlIGRlYnVnUGFyYW1ldGVyIHZhbHVlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWJ1Z1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuIGRlYnVnID8gIi9kZWJ1ZyIgOiBudWxsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBwcml2YXRlIGtleS4KKyAgICAgKgorICAgICAqQHBhcmFtICBrZXlmaWxlICBUaGUgbmV3IGtleWZpbGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlmaWxlKEZpbGUga2V5ZmlsZSkgeworICAgICAgICB0aGlzLmtleWZpbGUgPSBrZXlmaWxlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIGdldCB0aGUgYXJndW1lbnQgb3IgbnVsbCBmb3Igbm8gYXJndW1lbnQgbmVlZGVkCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgVGhlIGtleWZpbGVQYXJhbWV0ZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleWZpbGVQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmIChrZXlmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiL2tleWZpbGU6IiArIGtleWZpbGUudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBbnkgZXh0cmEgb3B0aW9ucyB3aGljaCBhcmUgbm90IGV4cGxpY2l0bHkKKyAgICAgKiBzdXBwb3J0ZWQgYnkgdGhpcyB0YXNrLgorICAgICAqCisgICAgICpAcGFyYW0gIGV4dHJhT3B0aW9ucyAgVGhlIG5ldyBFeHRyYU9wdGlvbnMgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYU9wdGlvbnMoU3RyaW5nIGV4dHJhT3B0aW9ucykgeworICAgICAgICB0aGlzLmV4dHJhT3B0aW9ucyA9IGV4dHJhT3B0aW9uczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBHZXRzIHRoZSBFeHRyYU9wdGlvbnMgYXR0cmlidXRlCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgVGhlIEV4dHJhT3B0aW9ucyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0cmFPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gdGhpcy5leHRyYU9wdGlvbnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZ2V0IGFueSBleHRyYSBvcHRpb25zIG9yIG51bGwgZm9yIG5vIGFyZ3VtZW50IG5lZWRlZAorICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSBFeHRyYU9wdGlvbnMgUGFyYW1ldGVyIHRvIENTQworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0cmFPcHRpb25zUGFyYW1ldGVyKCkgeworICAgICAgICBpZiAoZXh0cmFPcHRpb25zICE9IG51bGwgJiYgZXh0cmFPcHRpb25zLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYU9wdGlvbnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCB0aGUgdGFyZ2V0IHR5cGUgdG8gb25lIG9mIGV4ZXxsaWJyYXJ5CisgICAgICogQHBhcmFtIHRhcmdldFR5cGUgdGhlIGVudW1lcmF0ZWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0VHlwZShUYXJnZXRUeXBlcyB0YXJnZXRUeXBlKSB7CisgICAgICAgIHRoaXMudGFyZ2V0VHlwZSA9IHRhcmdldFR5cGUuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHBsaWNpdGx5IG92ZXJyaWRlIHRoZSBNb25vIGF1dG8tZGV0ZWN0aW9uLgorICAgICAqCisgICAgICogPHA+RGVmYXVsdHMgdG8gZmFsc2Ugb24gV2luZG93cyBhbmQgdHJ1ZSBvbiBhbnkgb3RoZXIgcGxhdGZvcm0uPC9wPgorICAgICAqIEBwYXJhbSBiIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb25vKGJvb2xlYW4gYikgeworICAgICAgICBpc01vbm8gPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqICBUaGlzIGlzIHRoZSBleGVjdXRpb24gZW50cnkgcG9pbnQuIEJ1aWxkIGEgbGlzdCBvZiBmaWxlcyBhbmQgY2FsbCBpbGFzbQorICAgICAqICBvbiBlYWNoIG9mIHRoZW0uCisgICAgICoKKyAgICAgKkB0aHJvd3MgIEJ1aWxkRXhjZXB0aW9uICBpZiB0aGUgYXNzZW1ibHkgZmFpbGVkIGFuZCBGYWlsT25FcnJvciBpcyB0cnVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCisgICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJUaGlzIHRhc2sgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb25cbiIKKyAgICAgICAgICAgICsgIm9mIEFudC4gIEl0IGlzIG5vdyBwYXJ0IG9mIHRoZSAuTkVUIEFudGxpYjpcbiIKKyAgICAgICAgICAgICsgImh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2RvdG5ldC9pbmRleC5odG1sIiwKKyAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICBOZXRDb21tYW5kIGNvbW1hbmQgPSBidWlsZElsYXNtQ29tbWFuZCgpOworCisgICAgICAgIGFkZEZpbGVzQW5kRXhlY3V0ZShjb21tYW5kLCBmYWxzZSk7CisKKyAgICB9CisgICAgLy8gZW5kIGV4ZWN1dGUKKworCisgICAgLyoqCisgICAgICogYnVpbGQgdXAgb3VyIGlsYXNtIGNvbW1hbmQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBOZXRDb21tYW5kIGJ1aWxkSWxhc21Db21tYW5kKCkgeworICAgICAgICBOZXRDb21tYW5kIGNvbW1hbmQgPSBuZXcgTmV0Q29tbWFuZCh0aGlzLCBleGVfdGl0bGUsIGV4ZV9uYW1lKTsKKyAgICAgICAgY29tbWFuZC5zZXRGYWlsT25FcnJvcihnZXRGYWlsT25FcnJvcigpKTsKKyAgICAgICAgLy9maWxsIGluIGFyZ3MKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXREZWJ1Z1BhcmFtZXRlcigpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRUYXJnZXRUeXBlUGFyYW1ldGVyKCkpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldExpc3RpbmdQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0T3V0cHV0RmlsZVBhcmFtZXRlcigpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRSZXNvdXJjZUZpbGVQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0VmVyYm9zZVBhcmFtZXRlcigpKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChnZXRLZXlmaWxlUGFyYW1ldGVyKCkpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldEV4dHJhT3B0aW9uc1BhcmFtZXRlcigpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgc3BhY2UgZm9yIG1vcmUgYXJndW1lbnRhdGl2ZW5lc3MKKyAgICAgICAgICogIGNvbW1hbmQuYWRkQXJndW1lbnQoKTsKKyAgICAgICAgICogIGNvbW1hbmQuYWRkQXJndW1lbnQoKTsKKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBjb21tYW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5ldyByZWZlcmVuY2UgZmlsZXNldCB0byB0aGUgY29tcGlsYXRpb24KKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSBmaWxlc2V0IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2UoRmlsZVNldCByZWZlcmVuY2UpIHsKKyAgICAgICAgcmVmZXJlbmNlRmlsZXNldHMuYWRkKHJlZmVyZW5jZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBmb3IgYSBmaWxlIGJlaW5nIG1hbmFnZWQgb3Igbm90CisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2UgdGhpbmsgdGhpcyBpcyBhIG1hbmFnZWQgZXhlY3V0YWJsZSwgYW5kIHRodXMgT0sKKyAgICAgKiBmb3IgbGlua2luZworICAgICAqIEB0b2RvIGxvb2sgYXQgdGhlIFBFIGhlYWRlciBvZiB0aGUgZXhlIGFuZCBzZWUgaWYgaXQgaXMgbWFuYWdlZCBvciBub3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRmlsZU1hbmFnZWRCaW5hcnkoRmlsZSBmaWxlKSB7CisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICByZXR1cm4gZmlsZW5hbWUuZW5kc1dpdGgoIi5leGUiKSB8fCBmaWxlbmFtZS5lbmRzV2l0aCgiLmRsbCIpCisgICAgICAgICAgICAgICAgfHwgZmlsZW5hbWUuZW5kc1dpdGgoIi5uZXRtb2R1bGUiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRhcmdldCB0eXBlcyB0byBidWlsZC4KKyAgICAgKiB2YWxpZCBidWlsZCB0eXBlcyBhcmUgZXhlfGxpYnJhcnl8bW9kdWxlfHdpbmV4ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGFyZ2V0VHlwZXMgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgICAgICJleGUiLAorICAgICAgICAgICAgICAgICJsaWJyYXJ5IiwKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L0lsZGFzbS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L0lsZGFzbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjlhOGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvSWxkYXNtLmphdmEKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogVGFzayB0byB0YWtlIGEgLk5FVCBvciBNb25vIC1nZW5lcmF0ZWQgbWFuYWdlZCBleGVjdXRhYmxlIGFuZCB0dXJuIGl0CisgKiBpbnRvIElMQVNNIGFzc2VtYmx5IGNvZGUuIFVzZWZ1bCB3aGVuIGNvbnZlcnRpbmcgaW1wb3J0ZWQgdHlwZWxpYnMgaW50bworICogYXNzZW1ibGVyIGJlZm9yZSBwYXRjaGluZyBhbmQgcmVjb21waWxpbmcsIGFzIG9uZSBoYXMgdG8gZG8gd2hlbiBkb2luZworICogYWR2YW5jZWQgdHlwZWxpYiB3b3JrLgorICogPHA+CisgKiBBcyB3ZWxsIGFzIGdlbmVyYXRpbmcgdGhlIG5hbWVkIG91dHB1dCBmaWxlLCB0aGUgaWxkYXNtIHByb2dyYW0KKyAqIHdpbGwgYWxzbyBnZW5lcmF0ZSByZXNvdXJjZSBmaWxlcyA8Y29kZT5JY29ucy5yZXNvdXJjZXM8L2NvZGU+CisgKiA8Y29kZT5NZXNzYWdlLnJlc291cmNlczwvY29kZT4gYW5kIGEgLnJlcyBmaWxlIHdob3NlIGZpbGVuYW1lIHN0dWIgaXMgZGVyaXZlZAorICogZnJvbSB0aGUgc291cmNlIGluIHdheXMgdG8gb2JzY3VyZSB0byBkZXRlcm1pbmUuCisgKiBUaGVyZSBpcyBubyB3YXkgdG8gY29udHJvbCB3aGV0aGVyIG9yIG5vdCB0aGVzZSBmaWxlcyBhcmUgY3JlYXRlZCwgb3Igd2hlcmUgdGhleSBhcmUgY3JlYXRlZAorICogKHRoZXkgYXJlIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5OyB0aGVpciBuYW1lcyBjb21lIGZyb20gaW5zaWRlIHRoZQorICogZXhlY3V0YWJsZSBhbmQgbWF5IGJlIHRob3NlIHVzZWQgYnkgdGhlIG9yaWdpbmFsIGRldmVsb3BlcikuIFRoaXMgdGFzaworICogY3JlYXRlcyB0aGUgcmVzb3VyY2VzIGluIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IDxjb2RlPnJlc291cmNlRGlyPC9jb2RlPiBpZgorICogc2V0LCBlbHNlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgPGNvZGU+ZGVzdEZpbGU8L2NvZGU+LgorICoKKyAqIDxwPgorICogVGhpcyB0YXNrIHJlcXVpcmVzIHRoZSAuTkVUIFNESyBpbnN0YWxsZWQgYW5kIGlsZGFzbSBvbiB0aGUgcGF0aC4KKyAqIFRvIGRpc2Fzc2VtYmxlIHVzaW5nIGFsdGVybmF0ZSBDTFIgc3lzdGVtcywgc2V0IHRoZSBleGVjdXRhYmxlIGF0dHJpYnV0ZQorICogdG8gdGhlIG5hbWUvcGF0aCBvZiB0aGUgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIC1vbmUgdGhhdCBtdXN0CisgKiBzdXBwb3J0IGFsbCB0aGUgY2xhc3NpYyBpbGRhc20gY29tbWFuZHMuCisgKgorICogPHA+CisgKiBEZXBlbmRlbmN5IGxvZ2ljOiB0aGUgdGFzayBleGVjdXRlcyB0aGUgY29tbWFuZCBpZiB0aGUgb3V0cHV0IGZpbGUgaXMgbWlzc2luZworICogb3Igb2xkZXIgdGhhbiB0aGUgc291cmNlIGZpbGUuIEl0IGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IGNoYW5nZXMKKyAqIGluIHRoZSBvcHRpb25zIG9mIHRoZSB0YXNrLCBvciB0aW1lc3RhbXAgZGlmZmVyZW5jZXMgaW4gcmVzb3VyY2UgZmlsZXMuCisgKiBXaGVuIHRoZSB1bmRlcmx5aW5nIGlsZGFzbSBleGVjdXRhYmxlIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgaXQgbGVhdmVzIHRoZQorICogLmlsIGZpbGUgaW4gcGxhY2Ugd2l0aCBzb21lIGVycm9yIG1lc3NhZ2UuIFRvIHByZXZlbnQgdGhpcyBmcm9tIGNvbmZ1c2luZworICogdGhlIGRlcGVuZGVuY3kgbG9naWMsIHRoZSBmaWxlIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+ZGVzdDwvY29kZT4KKyAqIGF0dHJpYnV0ZSBpcyA8aT5hbHdheXM8L2k+IGRlbGV0ZWQgYWZ0ZXIgYW4gdW5zdWNjZXNzZnVsIGJ1aWxkLgorICogQGFudC50YXNrIGNhdGVnb3J5PSJkb3RuZXQiCisgKi8KK3B1YmxpYyBjbGFzcyBJbGRhc20gZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogc291cmNlIGZpbGUgKG1hbmRhdG9yeSkKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgc291cmNlRmlsZTsKKworICAgIC8qKgorICAgICAqIGRlc3QgZmlsZSAobWFuZGF0b3J5KQorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBkZXN0RmlsZTsKKyAgICAvKioKKyAgICAgKiBwcm9ncmVzcyBiYXIgc3dpdGNoCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHByb2dyZXNzQmFyID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiB3aGF0IGlzIG91ciBlbmNvZGluZworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOworCisgICAgLyoqCisgICAgICogL2J5dGVzIGZsYWcgZm9yIGJ5dGUgbWFya3VwCisgICAgICovCisKKyAgICBwcml2YXRlIGJvb2xlYW4gYnl0ZXMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIGxpbmUgbnVtYmVycz8gL2xpbmVudW0KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbGluZW51bWJlcnMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIC9yYXdlaCBmbGFnIGZvciByYXcgZXhjZXB0aW9uIGhhbmRsaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJhd0V4Y2VwdGlvbkhhbmRsaW5nID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBzaG93IHRoZSBzb3VyY2U7IC9zb3VyY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvd1NvdXJjZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogL3F1b3RlYWxsbmFtZXMgdG8gcXVvdGUgYWxsIG5hbWVzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHF1b3RlYWxsbmFtZXMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIC9oZWFkZXIgZm9yIGhlYWRlciBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoZWFkZXIgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIHdoZW4gZmFsc2UsIHNldHMgdGhlIC9ub2lsIGF0dHJpYnV0ZQorICAgICAqIHRvIHN1cHByZXNzIGFzc2VtYmx5IGluZm8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYXNzZW1ibGVyID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIGluY2x1ZGUgbWV0YWRhdGEKKyAgICAgKiAvdG9rZW5zCisgICAgICovCisKKyAgICBwcml2YXRlIGJvb2xlYW4gbWV0YWRhdGEgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIHdoYXQgdmlzaWJpbGl0eSBkbyB3ZSB3YW50LgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmlzaWJpbGl0eTsKKworICAgIC8qKgorICAgICAqIHNwZWNpZmljIGl0ZW0gdG8gZGlzYXNzZW1ibGUKKyAgICAgKi8KKworICAgIHByaXZhdGUgU3RyaW5nIGl0ZW07CisKKyAgICAvKioKKyAgICAgKiBvdmVycmlkZSBmb3IgdGhlIGV4ZWN1dGFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBleGVjdXRhYmxlID0gImlsZGFzbSI7CisKKyAgICAvKioKKyAgICAgKiAgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGZvciByZXNvdXJjZXMgdG8gYmUgY3JlYXRlZC4gV2UgY2Fubm90IGNvbnRyb2wKKyAgICAgKiB0aGVpciBuYW1lcywgYnV0IHdlIGNhbiBzYXkgd2hlcmUgdGhleSBnZXQgY3JlYXRlZC4gSWYgbm90IHNldCwgdGhlCisgICAgICogZGlyZWN0b3J5IG9mIHRoZSBkZXN0IGZpbGUgaXMgdXNlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSByZXNvdXJjZURpcjsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlcyB0byBiZSBjcmVhdGVkLiBXZSBjYW5ub3QgY29udHJvbAorICAgICAqIHRoZWlyIG5hbWVzLCBidXQgd2UgY2FuIHNheSB3aGVyZSB0aGV5IGdldCBjcmVhdGVkLiBJZiBub3Qgc2V0LCB0aGUKKyAgICAgKiBkaXJlY3Rvcnkgb2YgdGhlIGRlc3QgZmlsZSBpcyB1c2VkCisgICAgICogQHBhcmFtIHJlc291cmNlRGlyIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gY3JlYXRlIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZURpcihGaWxlIHJlc291cmNlRGlyKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VEaXIgPSByZXNvdXJjZURpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBvdmVycmlkZSB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSAobm9ybWFsbHkgaWxkYXNtKSBvciBzZXQKKyAgICAgKiBpdHMgZnVsbCBwYXRoLiBEbyBub3Qgc2V0IGEgcmVsYXRpdmUgcGF0aCwgYXMgdGhlIHVnbHkgaGFja3MKKyAgICAgKiBuZWVkZWQgdG8gY3JlYXRlIHJlc291cmNlIGZpbGVzIGluIHRoZSBkZXN0IGRpcmVjdG9yeQorICAgICAqIGZvcmNlIHVzIHRvIGNoYW5nZSB0byB0aGlzIGRpcmVjdG9yeSBiZWZvcmUgcnVubmluZyB0aGUgYXBwbGljYXRpb24uCisgICAgICogaS5lIHVzZSAmbHQ7cHJvcGVydHkgbG9jYXRpb24mZ3QgdG8gY3JlYXRlIGFuIGFic29sdXRlIHBhdGggZnJvbSBhCisgICAgICogcmVsYXRpdmUgb25lIGJlZm9yZSBzZXR0aW5nIHRoaXMgdmFsdWUuCisgICAgICogQHBhcmFtIGV4ZWN1dGFibGUgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dGFibGUoU3RyaW5nIGV4ZWN1dGFibGUpIHsKKyAgICAgICAgdGhpcy5leGVjdXRhYmxlID0gZXhlY3V0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIG91dHB1dCBlbmNvZGluZzogYXNjaWksIHV0Zjggb3IgdW5pY29kZQorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW51bWVyYXRlZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhFbmNvZGluZ1R5cGVzIGVuY29kaW5nKSB7CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZy5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVuYWJsZSAoZGVmYXVsdCkgb3IgZGlzYWJsZSBhc3NlbWJseSBsYW5ndWFnZSBpbiB0aGUgb3V0cHV0CisgICAgICogQHBhcmFtIGFzc2VtYmxlciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFzc2VtYmxlcihib29sZWFuIGFzc2VtYmxlcikgeworICAgICAgICB0aGlzLmFzc2VtYmxlciA9IGFzc2VtYmxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlbmFibGUgb3IgZGlzYWJsZSAoZGVmYXVsdCkgdGhlIG9yaWdpbmFsIGJ5dGVzIGFzIGNvbW1lbnRzCisgICAgICogQHBhcmFtIGJ5dGVzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZXMoYm9vbGVhbiBieXRlcykgeworICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhlIG91dHB1dCBmaWxlIChyZXF1aXJlZCkKKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgdGhlIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdEZpbGUoRmlsZSBkZXN0RmlsZSkgeworICAgICAgICB0aGlzLmRlc3RGaWxlID0gZGVzdEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW5jbHVkZSBoZWFkZXIgaW5mb3JtYXRpb247IGRlZmF1bHQgZmFsc2UuCisgICAgICogQHBhcmFtIGhlYWRlciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihib29sZWFuIGhlYWRlcikgeworICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBuYW1lIGEgc2luZ2xlIGl0ZW0gdG8gZGVjb2RlOyBhIGNsYXNzIG9yIGEgbWV0aG9kCisgICAgICogZS5nIGl0ZW09Ik15Y2xhc3M6Om1ldGhvZCIgb3IgaXRlbT0ibmFtZXNwYWNlMTo6bmFtZXNwYWNlMjo6TXljbGFzczptZXRob2Qodm9pZChpbnQzMikpCisgICAgICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gdG8gZGVjb2RlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEl0ZW0oU3RyaW5nIGl0ZW0pIHsKKyAgICAgICAgdGhpcy5pdGVtID0gaXRlbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbmNsdWRlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uOyBkZWZhdWx0PWZhbHNlCisgICAgICogQHBhcmFtIGxpbmVudW1iZXJzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGluZW51bWJlcnMoYm9vbGVhbiBsaW5lbnVtYmVycykgeworICAgICAgICB0aGlzLmxpbmVudW1iZXJzID0gbGluZW51bWJlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW5jbHVkZSBtZXRhZGF0YSBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbSBtZXRhZGF0YSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKGJvb2xlYW4gbWV0YWRhdGEpIHsKKyAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNob3cgYSBncmFwaGljYWwgcHJvZ3Jlc3MgYmFyIGluIGEgd2luZG93IGR1cmluZyB0aGUgcHJvY2Vzczsgb2ZmIGJ5IGRlZmF1bHQKKyAgICAgKiBAcGFyYW0gcHJvZ3Jlc3NCYXIgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc0Jhcihib29sZWFuIHByb2dyZXNzQmFyKSB7CisgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIgPSBwcm9ncmVzc0JhcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBxdW90ZSBhbGwgbmFtZXMuCisgICAgICogQHBhcmFtIHF1b3RlYWxsbmFtZXMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdW90ZWFsbG5hbWVzKGJvb2xlYW4gcXVvdGVhbGxuYW1lcykgeworICAgICAgICB0aGlzLnF1b3RlYWxsbmFtZXMgPSBxdW90ZWFsbG5hbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVuYWJsZSByYXcgZXhjZXB0aW9uIGhhbmRsaW5nIChkZWZhdWx0ID0gZmFsc2UpCisgICAgICogQHBhcmFtIHJhd0V4Y2VwdGlvbkhhbmRsaW5nIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmF3RXhjZXB0aW9uSGFuZGxpbmcoYm9vbGVhbiByYXdFeGNlcHRpb25IYW5kbGluZykgeworICAgICAgICB0aGlzLnJhd0V4Y2VwdGlvbkhhbmRsaW5nID0gcmF3RXhjZXB0aW9uSGFuZGxpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogaW5jbHVkZSB0aGUgc291cmNlIGFzIGNvbW1lbnRzIChkZWZhdWx0PWZhbHNlKQorICAgICAqIEBwYXJhbSBzaG93U291cmNlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2hvd1NvdXJjZShib29sZWFuIHNob3dTb3VyY2UpIHsKKyAgICAgICAgdGhpcy5zaG93U291cmNlID0gc2hvd1NvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGUgZmlsZSB0byBkaXNhc3NlbWJsZSAtcmVxdWlyZWQKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgZmlsZSB0byBkaXNhc3NlbWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VGaWxlKEZpbGUgc291cmNlRmlsZSkgeworICAgICAgICB0aGlzLnNvdXJjZUZpbGUgPSBzb3VyY2VGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFsdGVybmF0ZSBuYW1lIGZvciBzb3VyY2VGaWxlCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIHNvdXJjZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY0ZpbGUoRmlsZSBzb3VyY2VGaWxlKSB7CisgICAgICAgIHNldFNvdXJjZUZpbGUoc291cmNlRmlsZSk7CisgICAgfQorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIHZpc2liaWxpdHkgb3B0aW9ucy4gSXQgY2hvb3NlcyBvbmUKKyAgICAgKiBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcsIHdpdGggKyBzaWducyB0byBjb25jYXRlbmF0ZSB0aGVtOgorICAgICAqIDxwcmU+CisgICAgICogcHViIDogUHVibGljCisgICAgICogcHJpIDogUHJpdmF0ZQorICAgICAqIGZhbSA6IEZhbWlseQorICAgICAqIGFzbSA6IEFzc2VtYmx5CisgICAgICogZmFhIDogRmFtaWx5IGFuZCBBc3NlbWJseQorICAgICAqIGZvYSA6IEZhbWlseSBvciBBc3NlbWJseQorICAgICAqIHBzYyA6IFByaXZhdGUgU2NvcGUKKyAgICAgKjwvcHJlPgorICAgICAqIGUuZy4gdmlzaWJpbGl0eT0icHViK3ByaSIuCisgICAgICogRmFtaWx5IG1lYW5zIDxjb2RlPnByb3RlY3RlZDwvY29kZT4gaW4gQyM7CisgICAgICogQHBhcmFtIHZpc2liaWxpdHkgdGhlIG9wdGlvbnMgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoU3RyaW5nIHZpc2liaWxpdHkpIHsKKyAgICAgICAgdGhpcy52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgdmVyaWZ5IHRoYXQgc291cmNlIGFuZCBkZXN0IGFyZSBvaworICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgaWYgKHNvdXJjZUZpbGUgPT0gbnVsbCB8fCAhc291cmNlRmlsZS5leGlzdHMoKSB8fCAhc291cmNlRmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbnZhbGlkIHNvdXJjZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0RmlsZSA9PSBudWxsIHx8IGRlc3RGaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiaW52YWxpZCBkZXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc291cmNlRGlyICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiAoIXJlc291cmNlRGlyLmV4aXN0cygpIHx8ICFyZXNvdXJjZURpci5pc0RpcmVjdG9yeSgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbnZhbGlkIHJlc291cmNlIGRpcmVjdG9yeSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgZGlzYXNzZW1ibHkgYmVpbmcgbmVlZGVkOyB1c2UgZXhpc3RlbmNlIGFuZCBncmFudWxhcml0eQorICAgICAqIGNvcnJlY3QgZGF0ZSBzdGFtcHMKKyAgICAgKiBAcmV0dXJuIHRydWUgaWZmIGEgcmVidWlsZCBpcyByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEaXNhc3NlbWJseU5lZWRlZCgpIHsKKyAgICAgICAgaWYgKCFkZXN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbG9nKCJEZXN0aW5hdGlvbiBmaWxlIGRvZXMgbm90IGV4aXN0OiBhIGJ1aWxkIGlzIHJlcXVpcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBsb25nIHNvdXJjZVRpbWUgPSBzb3VyY2VGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICBsb25nIGRlc3RUaW1lID0gZGVzdEZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIGlmIChzb3VyY2VUaW1lID4gKGRlc3RUaW1lICsgRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSkpIHsKKyAgICAgICAgICAgIGxvZygiU291cmNlIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZGVzdCBmaWxlOiBhIHJlYnVpbGQgaXMgcmVxdWlyZWQiLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJUaGUgLmlsIGZpbGUgaXMgdXAgdG8gZGF0ZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICB9CisgICAgLyoqCisgICAgICogZG8gdGhlIHdvcmsKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBsb2coIlRoaXMgdGFzayBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvblxuIgorICAgICAgICAgICAgKyAib2YgQW50LiAgSXQgaXMgbm93IHBhcnQgb2YgdGhlIC5ORVQgQW50bGliOlxuIgorICAgICAgICAgICAgKyAiaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvZG90bmV0L2luZGV4Lmh0bWwiLAorICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIGlmICghaXNEaXNhc3NlbWJseU5lZWRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTmV0Q29tbWFuZCBjb21tYW5kID0gbmV3IE5ldENvbW1hbmQodGhpcywgImlsZGFzbSIsIGV4ZWN1dGFibGUpOworICAgICAgICBjb21tYW5kLnNldEZhaWxPbkVycm9yKHRydWUpOworICAgICAgICAvL2ZpbGwgaW4gYXJncworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCIvdGV4dCIpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCIvb3V0PSIgKyBkZXN0RmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKCFwcm9ncmVzc0JhcikgeworICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL25vYmFyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpbmVudW1iZXJzKSB7CisgICAgICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCIvbGluZW51bSIpOworICAgICAgICB9CisgICAgICAgIGlmIChzaG93U291cmNlKSB7CisgICAgICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCIvc291cmNlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1b3RlYWxsbmFtZXMpIHsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoIi9xdW90ZWFsbG5hbWVzIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlYWRlcikgeworICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL2hlYWRlciIpOworICAgICAgICB9CisgICAgICAgIGlmICghYXNzZW1ibGVyKSB7CisgICAgICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCIvbm9pbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRhZGF0YSkgeworICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL3Rva2VucyIpOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoIi9pdGVtOiIsIGl0ZW0pOworICAgICAgICBpZiAocmF3RXhjZXB0aW9uSGFuZGxpbmcpIHsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoIi9yYXdlaCIpOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoRW5jb2RpbmdUeXBlcy5nZXRFbmNvZGluZ09wdGlvbihlbmNvZGluZykpOworICAgICAgICBpZiAoYnl0ZXMpIHsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoIi9ieXRlcyIpOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoIi92aXM6IiwgdmlzaWJpbGl0eSk7CisKKyAgICAgICAgLy9hZGQgdGhlIHNvdXJjZSBmaWxlCisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoc291cmNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgLy9kZXRlcm1pbmUgZGlyZWN0b3J5OiByZXNvdXJjZURpciBpZiBzZXQsCisgICAgICAgIC8vdGhlIGRpciBvZiB0aGUgZGVzdEZpbGUgaWYgbm90CisgICAgICAgIEZpbGUgZXhlY0RpciA9IHJlc291cmNlRGlyOworICAgICAgICBpZiAoZXhlY0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICBleGVjRGlyID0gZGVzdEZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmQuc2V0RGlyZWN0b3J5KGV4ZWNEaXIpOworCisgICAgICAgIC8vbm93IHJ1bgorICAgICAgICB0cnkgeworICAgICAgICAgICAgY29tbWFuZC5ydW5Db21tYW5kKCk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZm9yY2libHkgZGVsZXRlIHRoZSBvdXRwdXQgZmlsZSBpbiBjYXNlIG9mIHRyb3VibGUKKyAgICAgICAgICAgIGlmIChkZXN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGxvZygiRGVsZXRpbmcgZGVzdGluYXRpb24gZmlsZSBhcyBpdCBtYXkgYmUgY29ycnVwdCIpOworICAgICAgICAgICAgICAgIGRlc3RGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy90aGVuIHJldGhyb3cgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogZW5jb2Rpbmcgb3B0aW9uczsgdGhlIGRlZmF1bHQgaXMgYXNjaWkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVuY29kaW5nVHlwZXMgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqIFVuaWNvZGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JQ09ERSA9ICJ1bmljb2RlIjsKKyAgICAgICAgLyoqIFVURjggKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGOCA9ICJ1dGY4IjsKKyAgICAgICAgLyoqIEFTQ0lJICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTQ0lJID0gImFzY2lpIjsKKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgICAgIEFTQ0lJLAorICAgICAgICAgICAgICAgIFVURjgsCisgICAgICAgICAgICAgICAgVU5JQ09ERSwKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgbWFwcyBmcm9tIGFuIGVuY29kaW5nIGVudW0gdG8gYW4gZW5jb2Rpbmcgb3B0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZW51bVZhbHVlIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICAgICAqIEByZXR1cm4gVGhlIGVuY29kaW5nIG9wdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIGVudW0gdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ09wdGlvbihTdHJpbmcgZW51bVZhbHVlKSB7CisgICAgICAgICAgICBpZiAoVU5JQ09ERS5lcXVhbHMoZW51bVZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiL3VuaWNvZGUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFVURjguZXF1YWxzKGVudW1WYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIi91dGY4IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdmlzaWJpbGl0eSBvcHRpb25zIGZvciBkZWNvZGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmlzaWJpbGl0eU9wdGlvbnMgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgICAgICJwdWIiLCAvL1B1YmxpYworICAgICAgICAgICAgICAgICJwcmkiLCAvL1ByaXZhdGUKKyAgICAgICAgICAgICAgICAiZmFtIiwgLy9GYW1pbHkKKyAgICAgICAgICAgICAgICAiYXNtIiwgLy9Bc3NlbWJseQorICAgICAgICAgICAgICAgICJmYWEiLCAvL0ZhbWlseSBhbmQgQXNzZW1ibHkKKyAgICAgICAgICAgICAgICAiZm9hIiwgLy9GYW1pbHkgb3IgQXNzZW1ibHkKKyAgICAgICAgICAgICAgICAicHNjIiwgLy9Qcml2YXRlIFNjb3BlCisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvSW1wb3J0VHlwZWxpYi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L0ltcG9ydFR5cGVsaWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU0NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L0ltcG9ydFR5cGVsaWIuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBJbXBvcnQgYSBDT00gdHlwZSBsaWJyYXJ5IGludG8gdGhlIC5ORVQgZnJhbWV3b3JrLgorICogPHA+CisgKgorICogVGhpcyB0YXNrIGlzIGEgd3JhcHBlciB0byAuTkVUJ3MgdGxiaW1wb3J0OyBpdCBpbXBvcnRzIGEgdGxiIGZpbGUgdG8gYSBORVQgYXNzZW1ibHkKKyAqIGJ5IGdlbmVyYXRpbmcgYSBiaW5hcnkgYXNzZW1ibHkgKC5kbGwpIHRoYXQgY29udGFpbnMgYWxsIHRoZSBiaW5kaW5nCisgKiBtZXRhZGF0YS4gSXQgdXNlcyBkYXRlIHRpbWVzdGFtcHMgdG8gbWluaW1pc2UgcmVidWlsZHMuCisgKiA8cD4KKyAqIEV4YW1wbGUKKyAqIDxwcmU+CisgKiAgICAgJmx0O2ltcG9ydHR5cGVsaWIKKyAqICAgICAgIHNyY2ZpbGU9InhlcmNlcy50bGIiCisgKiAgICAgICBkZXN0ZmlsZT0ieGVyY2VzLmRsbCIKKyAqICAgICAgIG5hbWVzcGFjZT0iQXBhY2hlLlhlcmNlcyIvJmd0OworICogPC9wcmU+CisgKiBAc2luY2UgQW50IDEuNgorICogQGFudC50YXNrIGNhdGVnb3J5PSJkb3RuZXQiCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBvcnRUeXBlbGliIGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIGlucHV0IGZpbGU7IHByZWNlZGVzIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgc3JjRmlsZTsKKworICAgIC8qKgorICAgICAqIC9vdXQ6ZmlsZQorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBkZXN0RmlsZTsKKworICAgIC8qKgorICAgICAqICAvbmFtZXNwYWNlOltzdHJpbmddCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOworCisgICAgLyoqCisgICAgICogL3N5c2FycmF5CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVzZVN5c0FycmF5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiAvdW5zYWZlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVuc2FmZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogZXh0cmEgY29tbWFuZHM/CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFPcHRpb25zID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIG5hbWVzIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgYW4gb3BlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGhhdmUgYmVlbiBwZXJmb3JtZWQuCisgICAgICogQHBhcmFtIGRlc3RGaWxlIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0RmlsZShGaWxlIGRlc3RGaWxlKSB7CisgICAgICAgIHRoaXMuZGVzdEZpbGUgPSBkZXN0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHdoYXQgbmFtZXNwYWNlIHRoZSB0eXBlbGliIGlzIHRvIGJlIGluLgorICAgICAqIFRoaXMgaXMgYW4gb3BlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGhhdmUgYmVlbiBwZXJmb3JtZWQuCisgICAgICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgeworICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHdoaWNoIGlzIHRoZSBzb3VyY2UgLnRsYiBmaWxlLgorICAgICAqIFRoaXMgaXMgYW4gb3BlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGhhdmUgYmVlbiBwZXJmb3JtZWQuCisgICAgICogQHBhcmFtIHNyY0ZpbGUgdGhlIHNvdXJjZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY0ZpbGUoRmlsZSBzcmNGaWxlKSB7CisgICAgICAgIHRoaXMuc3JjRmlsZSA9IHNyY0ZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZG8geW91IHdhbnQgdW5zYWZlIGNvZGUuCisgICAgICogQHBhcmFtIHVuc2FmZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVuc2FmZShib29sZWFuIHVuc2FmZSkgeworICAgICAgICB0aGlzLnVuc2FmZSA9IHVuc2FmZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhpcyB0byBtYXAgYSBDT00gU2FmZUFycmF5IHRvIHRoZSBTeXN0ZW0uQXJyYXkgY2xhc3MKKyAgICAgKiBAcGFyYW0gdXNlU3lzQXJyYXkgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VTeXNBcnJheShib29sZWFuIHVzZVN5c0FycmF5KSB7CisgICAgICAgIHRoaXMudXNlU3lzQXJyYXkgPSB1c2VTeXNBcnJheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgYW55IGV4dHJhIG9wdGlvbnMgdGhhdCBhcmUgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhpcyB0YXNrLgorICAgICAqIEBwYXJhbSBleHRyYU9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhT3B0aW9ucyhTdHJpbmcgZXh0cmFPcHRpb25zKSB7CisgICAgICAgIHRoaXMuZXh0cmFPcHRpb25zID0gZXh0cmFPcHRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIHZhbGlkYXRpb24gY29kZQorICAgICAqIEB0aHJvd3MgIEJ1aWxkRXhjZXB0aW9uICBpZiB2YWxpZGF0aW9uIGZhaWxlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZXN0RmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3RpbmF0aW9uIGZpbGUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdEZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gZmlsZSBpcyBhIGRpcmVjdG9yeSIpOworICAgICAgICB9CisgICAgICAgIGlmIChzcmNGaWxlID09IG51bGwgfHwgIXNyY0ZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInNvdXJjZSBmaWxlIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY0ZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAic291cmNlIGZpbGUgaXMgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gbmFtZXNwYWNlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciBkaXNhc3NlbWJseSBiZWluZyBuZWVkZWQ7IHVzZSBleGlzdGVuY2UgYW5kIGdyYW51bGFyaXR5CisgICAgICogY29ycmVjdCBkYXRlIHN0YW1wcworICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgYSByZWJ1aWxkIGlzIHJlcXVpcmVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGVOZWVkZWQoKSB7CisgICAgICAgIGlmICghZGVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGxvZygiRGVzdGluYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdDogYSBidWlsZCBpcyByZXF1aXJlZCIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBzb3VyY2VUaW1lID0gc3JjRmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgbG9uZyBkZXN0VGltZSA9IGRlc3RGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICBpZiAoc291cmNlVGltZSA+IChkZXN0VGltZSArIEZJTEVfVVRJTFMuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkpKSB7CisgICAgICAgICAgICBsb2coIlNvdXJjZSBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGRlc3QgZmlsZTogYSByZWJ1aWxkIGlzIHJlcXVpcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZygiVGhlIG91dHB1dCBmaWxlIGlzIHVwIHRvIGRhdGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB0eXBlbGliIGNvbW1hbmQKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiVGhpcyB0YXNrIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uXG4iCisgICAgICAgICAgICArICJvZiBBbnQuICBJdCBpcyBub3cgcGFydCBvZiB0aGUgLk5FVCBBbnRsaWI6XG4iCisgICAgICAgICAgICArICJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9kb3RuZXQvaW5kZXguaHRtbCIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgbG9nKCJJbXBvcnRpbmcgdHlwZWxpYiAiICsgc3JjRmlsZQorICAgICAgICAgICAgKyAiIHRvIGFzc2VtYmx5ICIgKyBkZXN0RmlsZQorICAgICAgICAgICAgKyAiIGluIG5hbWVzcGFjZSAiICsgbmFtZXNwYWNlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgLy9yZWJ1aWxkIHVubGVzcyB0aGUgZGVzdCBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIHNvdXJjZSBmaWxlCisgICAgICAgIGlmICghaXNFeGVjdXRlTmVlZGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE5ldENvbW1hbmQgY29tbWFuZCA9IG5ldyBOZXRDb21tYW5kKHRoaXMsICJJbXBvcnRUeXBlbGliIiwgInRsYmltcCIpOworICAgICAgICBjb21tYW5kLnNldEZhaWxPbkVycm9yKHRydWUpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KHNyY0ZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgIC8vZmlsbCBpbiBhcmdzCisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoIi9ub2xvZ28iKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL291dDoiICsgZGVzdEZpbGUpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCIvbmFtZXNwYWNlOiIsIG5hbWVzcGFjZSk7CisgICAgICAgIGlmICh1c2VTeXNBcnJheSkgeworICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL3N5c2FycmF5Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVuc2FmZSkgeworICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL3Vuc2FmZSIpOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZXh0cmFPcHRpb25zKTsKKyAgICAgICAgY29tbWFuZC5ydW5Db21tYW5kKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L0pTaGFycC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L0pTaGFycC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTNhNjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvSlNoYXJwLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBDb21waWxlIEojIHNvdXJjZSBkb3duIHRvIGEgbWFuYWdlZCAuTkVUIGFwcGxpY2F0aW9uLgorICogPHA+CisgKiBKIyBpcyBub3QgSmF2YS4gQnV0IGl0IGlzIHRoZSBsYW5ndWFnZSBjbG9zZXN0IHRvIEphdmEgaW4gdGhlIC5ORVQgZnJhbWV3b3JrLgorICogVGhpcyB0YXNrIGNvbXBpbGVzIGpzaGFycCBzb3VyY2UgKC5qYXZhIGZpbGVzKSwgYW5kCisgKiBnZW5lcmF0ZXMgYSAuTkVUIG1hbmFnZWQgZXhlIG9yIGRsbC4KKyAqIDxwPgorICoKKyAqIDxwPkZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlIHBhdHRlcm4KKyAqIDxjb2RlPioqPC9jb2RlPjxjb2RlPi8qLmphdmE8L2NvZGU+IGlzIHByZXNldCBhcyBpbmNsdWRlcyBsaXN0IGFuZAorICogeW91IGNhbiBub3Qgb3ZlcnJpZGUgaXQgd2l0aCBhbiBleHBsaWNpdCBpbmNsdWRlcyBhdHRyaWJ1dGUuICBVc2UKKyAqIG5lc3RlZCA8Y29kZT4mbHQ7c3JjJmd0OzwvY29kZT4gZWxlbWVudHMgaW5zdGVhZCBvZiB0aGUgYmFzZWRpcgorICogYXR0cmlidXRlIGlmIHlvdSBuZWVkIG1vcmUgY29udHJvbC48L3A+CisgKgorICogQHNlZSA8YSByZWY9CisgKiAiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9kdl92anNoYXJwL2h0bWwvdmpvcmlNaWNyb3NvZnRWaXN1YWxKLmFzcCIKKyAqID5WaXN1YWwgSisrIG9ubGluZSBkb2N1bWVudGF0aW9uPC9hPgorICoKKyAqIEBzaW5jZSBhbnQxLjYKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iZG90bmV0IiBuYW1lPSJqc2hhcnBjIgorICovCitwdWJsaWMgY2xhc3MgSlNoYXJwIGV4dGVuZHMgRG90bmV0Q29tcGlsZSB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiBoZXggYmFzZSBhZGRyZXNzCisgICAgICovCisgICAgU3RyaW5nIGJhc2VBZGRyZXNzOworCisgICAgLyoqIC94IG9wdGlvbiB0byBkaXNhYmxlIEorKyBhbmQgSiMgbGFuZyBleHRlbnNpb25zCisgICAgICoKKyAgICAgKi8KKyAgICBib29sZWFuIHB1cmVKYXZhID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIHdoZXRoZXIgdG8gbWFrZSBwYWNrYWdlIHNjb3BlZCBzdHVmZiBwdWJsaWMgb3IgYXNzZW1ibHkgc2NvcGVkCisgICAgICovCisgICAgYm9vbGVhbiBzZWN1cmVTY29waW5nID0gZmFsc2U7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqIE5vIGFyZyBjb25zdHJ1Y3Rvci4gKi8KKyAgICBwdWJsaWMgSlNoYXJwKCkgeworICAgICAgICBzZXRFeGVjdXRhYmxlKCJ2amMiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFzZSBhZGRyZXNzIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gYmFzZUFkZHJlc3MgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlQWRkcmVzcyhTdHJpbmcgYmFzZUFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5iYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRvIHdlIHdhbnQgcHVyZSBqYXZhIChkZWZhdWx0LCB0cnVlKSBvciBjb3JydXB0ZWQgSiM/CisgICAgICogQHBhcmFtIHB1cmVKYXZhIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHVyZUphdmEoYm9vbGVhbiBwdXJlSmF2YSkgeworICAgICAgICB0aGlzLnB1cmVKYXZhID0gcHVyZUphdmE7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBwYWNrYWdlIHNjb3BlZCBjb2RlIHZpc2libGUgdG8gdGhlIGN1cnJlbnQgYXNzZW1ibHkgb25seSAoZGVmYXVsdDogZmFsc2UpCisgICAgICogLk5FVCBkb2VzIG5vdCBoYXZlIHBhY2thZ2Ugc2NvcGluZy4gSW5zdGVhZCBpdCBoYXMgYXNzZW1ibHksIHByaXZhdGUgYW5kIHB1YmxpYy4KKyAgICAgKiBCeSBkZWZhdWx0LCBwYWNrYWdlIGNvbnRlbnQgaXMgcHVibGljIHRvIGFsbC4KKyAgICAgKiBAcGFyYW0gc2VjdXJlU2NvcGluZyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlY3VyZVNjb3BpbmcoYm9vbGVhbiBzZWN1cmVTY29waW5nKSB7CisgICAgICAgIHRoaXMuc2VjdXJlU2NvcGluZyA9IHNlY3VyZVNjb3Bpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZWxpbWl0ZXIgdGhhdCB0aGUgY29tcGlsZXIgdXNlcyBiZXR3ZWVuIHJlZmVyZW5jZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGMjIHdpbGwgcmV0dXJuICI7IjsgVkIuTkVUIHdpbGwgcmV0dXJuICIsIgorICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyBkZWxpbWl0ZXIgZm9yIHRoZSByZWZlcmVuY2Ugc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlRGVsaW1pdGVyKCkgeworICAgICAgICByZXR1cm4gIjsiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZXh0ZW5zaW9uIG9mIGZpbGVuYW1lcyB0byBjb21waWxlLgorICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyBleHRlbnNpb24gb2YgZmlsZXMgdG8gY29tcGlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7CisgICAgICAgIHJldHVybiAiLmphdmEiOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBqdmMgc3BlY2lmaWMgY29tbWFuZHMKKyAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgY29tbWFuZCB0byBhZGQgdG8uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGlsZXJTcGVjaWZpY09wdGlvbnMoTmV0Q29tbWFuZCBjb21tYW5kKSB7CisgICAgICAgIGlmIChwdXJlSmF2YSkgeworICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL3g6YWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlY3VyZVNjb3BpbmcpIHsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoIi9zZWN1cmVzY29waW5nIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlc291cmNlUGFyYW1ldGVyKE5ldENvbW1hbmQgY29tbWFuZCwgRG90bmV0UmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgcmVzb3VyY2UuZ2V0UGFyYW1ldGVycyhnZXRQcm9qZWN0KCksIGNvbW1hbmQsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHZhbGlkYXRpb24gY29kZQorICAgICAqIEB0aHJvd3MgIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uICBpZiB2YWxpZGF0aW9uIGZhaWxlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnZhbGlkYXRlKCk7CisgICAgICAgIGlmIChnZXREZXN0RmlsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGVzdEZpbGUgd2FzIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9OZXRDb21tYW5kLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvTmV0Q29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjQ1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvTmV0Q29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisvKgorICogIGJ1aWxkIG5vdGVzCisgKiAgVGhlIHJlZmVyZW5jZSBDRCB0byBsaXN0ZW4gdG8gd2hpbGUgZWRpdGluZyB0aGlzIGZpbGUgaXMKKyAqICBVbmRlcndvcmxkIEV2ZXJ5dGhpbmcsIEV2ZXJ5dGhpbmcKKyAqICB2YXJpYWJsZSBuYW1pbmcgcG9saWN5IGZyb20gRm93bGVyJ3MgcmVmYWN0b3JpbmcgYm9vay4KKyAqLworLy8gcGxhY2UgYmVsb3cgdGhlIG9wdGlvbmFsIGFudCB0YXNrcyBwYWNrYWdlCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZG90bmV0OworCisvLyBpbXBvcnRzCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ1N0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gc3Bhd24gbmV0IGNvbW1hbmRzIG91dC4gSW4gaXRzIGluaXRpYWwgZm9ybSBpdAorICogIGNvbnRhaW5zIG5vIC5uZXQgc3BlY2lmaWNzLCBqdXN0IGNvbnRhaW5zIGFsbCB0aGUgY29tbWFuZCBsaW5lL2V4ZQorICogIGNvbnN0cnVjdGlvbiBzdHVmZi4gSG93ZXZlciwgaXQgbWF5IGJlIGhhbmR5IGluIGZ1dHVyZSB0byBoYXZlIGEgbWVhbnMgb2YKKyAqICBzZXR0aW5nIHRoZSBwYXRoIHRvIHBvaW50IHRvIHRoZSBkb3RuZXQgYmluIGRpcmVjdG9yeTsgaW4gd2hpY2ggY2FzZSB0aGUKKyAqICBzaGFyZWQgY29kZSBzaG91bGQgZ28gaW4gaGVyZS4KKyAqCisgKkB2ZXJzaW9uICAgIDAuNQorICovCisKK3B1YmxpYyBjbGFzcyBOZXRDb21tYW5kIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9SRVNQT05TRV9USFJFU0hPTEQgPSA2NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgLyoqCisgICAgICogIG93bmVyIHByb2plY3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGFzayBvd25lcjsKKworICAgIC8qKgorICAgICAqICBleGVjdXRhYmxlCisgICAgICovCisgICAgcHJvdGVjdGVkIEV4ZWN1dGUgZXhlY3V0YWJsZTsKKworICAgIC8qKgorICAgICAqICB3aGF0IGlzIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgY29tbWFuZExpbmU7CisKKyAgICAvKioKKyAgICAgKiAgdGl0bGUgb2YgdGhlIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOworCisgICAgLyoqCisgICAgICogIGFjdHVhbCBwcm9ncmFtIHRvIGludm9rZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvZ3JhbTsKKworICAgIC8qKgorICAgICAqICB0cmFjZSBmbGFnCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdHJhY2VDb21tYW5kTGluZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogIGZsYWcgdG8gY29udHJvbCBhY3Rpb24gb24gZXhlY3V0aW9uIHRyb3VibGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvcjsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiB0aGUgZGlyZWN0b3J5IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgaW4uIFdoZW4gbnVsbCwgdGhlIGN1cnJlbnQKKyAgICAgKiBkaXJlY3RvcnkgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZGlyZWN0b3J5OworCisgICAgLyoqCisgICAgICogZmxhZyB0byBzZXQgdG8gdG8gdXNlIEBmaWxlIGJhc2VkIGNvbW1hbmQgY2FjaGUKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlUmVzcG9uc2VGaWxlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIGEgdGVtcCBmaWxlOyBtYXkgYmUgbnVsbAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSB0ZW1wb3JhcnlDb21tYW5kRmlsZTsKKworICAgIC8qKgorICAgICAqIGludGVybmFsIHRocmVzaG9sZCBmb3IgYXV0by1zd2l0Y2gKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhdXRvbWF0aWNSZXNwb25zZUZpbGVUaHJlc2hvbGQgPSBERUZBVUxUX1JFU1BPTlNFX1RIUkVTSE9MRDsKKworICAgIC8qKgorICAgICAqICBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICpAcGFyYW0gIHRpdGxlICAgICAgICAoZm9yIGxvZ2dpbmcvZXJyb3JzKQorICAgICAqQHBhcmFtICBvd25lciAgICAgICAgb3duZXIgdGFzaworICAgICAqQHBhcmFtICBwcm9ncmFtICAgICAgYXBwIHdlIGFyZSB0byBydW4KKyAgICAgKi8KKworICAgIHB1YmxpYyBOZXRDb21tYW5kKFRhc2sgb3duZXIsIFN0cmluZyB0aXRsZSwgU3RyaW5nIHByb2dyYW0pIHsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07CisgICAgICAgIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CisgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUocHJvZ3JhbSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgdHVybiB0cmFjaW5nIG9uIG9yIG9mZgorICAgICAqCisgICAgICpAcGFyYW0gIGIgIHRyYWNlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFjZUNvbW1hbmRMaW5lKGJvb2xlYW4gYikgeworICAgICAgICB0cmFjZUNvbW1hbmRMaW5lID0gYjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBzZXQgZmFpbCBvbiBlcnJvciBmbGFnCisgICAgICoKKyAgICAgKkBwYXJhbSAgYiAgZmFpbCBmbGFnIC1zZXQgdG8gdHJ1ZSB0byBjYXVzZSBhbiBleGNlcHRpb24gdG8gYmUgcmFpc2VkIGlmCisgICAgICogICAgICB0aGUgcmV0dXJuIHZhbHVlICE9IDAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGIpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSBiOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIHF1ZXJ5IGZhaWwgb24gZXJyb3IgZmxhZworICAgICAqCisgICAgICpAcmV0dXJuICAgIFRoZSBmYWlsRmFpbE9uRXJyb3IgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsRmFpbE9uRXJyb3IoKSB7CisgICAgICAgIHJldHVybiBmYWlsT25FcnJvcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHNldCB0aGUgZGlyZWN0b3J5IHRvIHJ1biBmcm9tLCBpZiB0aGUgZGVmYXVsdCBpcyBpbmFkZXF1YXRlCisgICAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgZGlyZWN0b3J5IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKKyAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIHZlcmJvc2UgdGV4dCBsb2cKKyAgICAgKgorICAgICAqQHBhcmFtICBtc2cgIHN0cmluZyB0byBhZGQgdG8gbG9nIGlmIHZlcmJvc2UgaXMgZGVmaW5lZCBmb3IgdGhlIGJ1aWxkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nVmVyYm9zZShTdHJpbmcgbXNnKSB7CisgICAgICAgIG93bmVyLmdldFByb2plY3QoKS5sb2cobXNnLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBlcnJvciB0ZXh0IGxvZworICAgICAqCisgICAgICpAcGFyYW0gIG1zZyAgbWVzc2FnZSB0byBkaXNwbGF5IGFzIGFuIGVycm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1zZykgeworICAgICAgICBvd25lci5nZXRQcm9qZWN0KCkubG9nKG1zZywgUHJvamVjdC5NU0dfRVJSKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBhZGQgYW4gYXJndW1lbnQgdG8gYSBjb21tYW5kIGxpbmU7IGRvIG5vdGhpbmcgaWYgdGhlIGFyZyBpcyBudWxsIG9yCisgICAgICogIGVtcHR5IHN0cmluZworICAgICAqCisgICAgICpAcGFyYW0gIGFyZ3VtZW50ICBUaGUgZmVhdHVyZSB0byBiZSBhZGRlZCB0byB0aGUgQXJndW1lbnQgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZ3VtZW50KSB7CisgICAgICAgIGlmIChhcmd1bWVudCAhPSBudWxsICYmIGFyZ3VtZW50Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXJndW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGFkZCBhbiBhcmd1bWVudCB0byBhIGNvbW1hbmQgbGluZTsgZG8gbm90aGluZyBpZiB0aGUgYXJnIGlzIG51bGwgb3IKKyAgICAgKiAgZW1wdHkgc3RyaW5nCisgICAgICoKKyAgICAgKkBwYXJhbSAgYXJndW1lbnRzICBUaGUgZmVhdHVyZXMgdG8gYmUgYWRkZWQgdG8gdGhlIEFyZ3VtZW50IGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50cyhTdHJpbmdbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsICYmIGFyZ3VtZW50cy5sZW5ndGggIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRBcmd1bWVudChhcmd1bWVudHNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGNvbmNhdGVuYXRlIHR3byBzdHJpbmdzIHRvZ2V0aGVyIGFuZCBhZGQgdGhlbSBhcyBhIHNpbmdsZSBhcmd1bWVudCwKKyAgICAgKiAgYnV0IG9ubHkgaWYgYXJndW1lbnQyIGlzIG5vbi1udWxsIGFuZCBub24temVybyBsZW5ndGgKKyAgICAgKgorICAgICAqQHBhcmFtICBhcmd1bWVudDEgIFRoZSBmaXJzdCBhcmd1bWVudAorICAgICAqQHBhcmFtICBhcmd1bWVudDIgIFRoZSBzZWNvbmQgYXJndW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBcmd1bWVudChTdHJpbmcgYXJndW1lbnQxLCBTdHJpbmcgYXJndW1lbnQyKSB7CisgICAgICAgIGlmIChhcmd1bWVudDIgIT0gbnVsbCAmJiBhcmd1bWVudDIubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShhcmd1bWVudDEgKyBhcmd1bWVudDIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0dGVyCisgICAgICogQHJldHVybiByZXNwb25zZSBmaWxlIHN0YXRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VSZXNwb25zZUZpbGUoKSB7CisgICAgICAgIHJldHVybiB1c2VSZXNwb25zZUZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHRoaXMgdG8gdHJ1ZSB0byBhbHdheXMgdXNlIHRoZSByZXNwb25zZSBmaWxlCisgICAgICogQHBhcmFtIHVzZVJlc3BvbnNlRmlsZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZVJlc3BvbnNlRmlsZShib29sZWFuIHVzZVJlc3BvbnNlRmlsZSkgeworICAgICAgICB0aGlzLnVzZVJlc3BvbnNlRmlsZSA9IHVzZVJlc3BvbnNlRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXR0ZXIgZm9yIHRocmVzaG9sZAorICAgICAqIEByZXR1cm4gMCBmb3IgZGlzYWJsZWQsIG9yIGEgdGhyZXNob2xkIGZvciBlbmFibGluZyByZXNwb25zZSBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QXV0b21hdGljUmVzcG9uc2VGaWxlVGhyZXNob2xkKCkgeworICAgICAgICByZXR1cm4gYXV0b21hdGljUmVzcG9uc2VGaWxlVGhyZXNob2xkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCB0aHJlc2hvbGQgZm9yIGF1dG9tYXRpY2FsbHkgdXNpbmcgcmVzcG9uc2UgZmlsZXMgLXVzZSAwIGZvciBvZmYKKyAgICAgKiBAcGFyYW0gYXV0b21hdGljUmVzcG9uc2VGaWxlVGhyZXNob2xkIHRoZSB0aHJlc2hvbGQgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9tYXRpY1Jlc3BvbnNlRmlsZVRocmVzaG9sZChpbnQgYXV0b21hdGljUmVzcG9uc2VGaWxlVGhyZXNob2xkKSB7CisgICAgICAgIHRoaXMuYXV0b21hdGljUmVzcG9uc2VGaWxlVGhyZXNob2xkID0gYXV0b21hdGljUmVzcG9uc2VGaWxlVGhyZXNob2xkOworICAgIH0KKworICAgIC8qKgorICAgICAqICBzZXQgdXAgdGhlIGNvbW1hbmQgc2VxdWVuY2UuLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmVFeGVjdXRvcigpIHsKKyAgICAgICAgLy8gZGVmYXVsdCBkaXJlY3RvcnkgdG8gdGhlIHByb2plY3QncyBiYXNlIGRpcmVjdG9yeQorICAgICAgICBpZiAob3duZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm5vIG93bmVyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG93bmVyLmdldFByb2plY3QoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiT3duZXIgaGFzIG5vIHByb2plY3QiKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIGRpciA9IG93bmVyLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCk7CisgICAgICAgIGlmIChkaXJlY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgZGlyID0gZGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgaGFuZGxlciA9IG5ldyBMb2dTdHJlYW1IYW5kbGVyKG93bmVyLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8sIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICBleGVjdXRhYmxlID0gbmV3IEV4ZWN1dGUoaGFuZGxlciwgbnVsbCk7CisgICAgICAgIGV4ZWN1dGFibGUuc2V0QW50UnVuKG93bmVyLmdldFByb2plY3QoKSk7CisgICAgICAgIGV4ZWN1dGFibGUuc2V0V29ya2luZ0RpcmVjdG9yeShkaXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIFJ1biB0aGUgY29tbWFuZCB1c2luZyB0aGUgZ2l2ZW4gRXhlY3V0ZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqQGV4Y2VwdGlvbiAgQnVpbGRFeGNlcHRpb24gIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIGFuZCB0aGUKKyAgICAgKiAgICAgIGZhaWxPbkVycm9yIGZsYWcgaXMgdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bkNvbW1hbmQoKQorICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHByZXBhcmVFeGVjdXRvcigpOworICAgICAgICBpbnQgZXJyID0gLTE7CisgICAgICAgIC8vIGFzc3VtZSB0aGUgd29yc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0cmFjZUNvbW1hbmRMaW5lKSB7CisgICAgICAgICAgICAgICAgb3duZXIubG9nKCJJbiBkaXJlY3RvcnkgIiArIGV4ZWN1dGFibGUuZ2V0V29ya2luZ0RpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgICAgICBvd25lci5sb2coY29tbWFuZExpbmUuZGVzY3JpYmVDb21tYW5kKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL2luIHZlcmJvc2UgbW9kZSB3ZSBhbHdheXMgbG9nIHN0dWZmCisgICAgICAgICAgICAgICAgbG9nVmVyYm9zZSgiSW4gZGlyZWN0b3J5ICIgKyBleGVjdXRhYmxlLmdldFdvcmtpbmdEaXJlY3RvcnkoKSk7CisgICAgICAgICAgICAgICAgbG9nVmVyYm9zZShjb21tYW5kTGluZS5kZXNjcmliZUNvbW1hbmQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRFeGVjdXRhYmxlQ29tbWFuZExpbmUoKTsKKyAgICAgICAgICAgIGVyciA9IGV4ZWN1dGFibGUuZXhlY3V0ZSgpOworICAgICAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKGVycikpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHRpdGxlICsgIiByZXR1cm5lZDogIiArIGVyciwgb3duZXIuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3duZXIubG9nKHRpdGxlICsgIiAgUmVzdWx0OiAiICsgZXJyLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHRpdGxlICsgIiBmYWlsZWQ6ICIgKyBlLCBlLCBvd25lci5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh0ZW1wb3JhcnlDb21tYW5kRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGVtcG9yYXJ5Q29tbWFuZEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIGV4ZWN1dGFibGUgY29tbWFuZCBsaW5lCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEV4ZWN1dGFibGVDb21tYW5kTGluZSgpIHsKKworICAgICAgICBTdHJpbmdbXSBjb21tYW5kcyA9IGNvbW1hbmRMaW5lLmdldENvbW1hbmRsaW5lKCk7CisgICAgICAgIC8vYWx3YXlzIHRyaWdnZXIgZmlsZSBtb2RlIGlmIGNvbW1hbmRzIGFyZSBiaWcgZW5vdWdoCisgICAgICAgIGlmIChhdXRvbWF0aWNSZXNwb25zZUZpbGVUaHJlc2hvbGQgPiAwCisgICAgICAgICAgICAmJiBjb21tYW5kcy5sZW5ndGggPiBhdXRvbWF0aWNSZXNwb25zZUZpbGVUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHVzZVJlc3BvbnNlRmlsZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF1c2VSZXNwb25zZUZpbGUgfHwgY29tbWFuZHMubGVuZ3RoIDw9IDEpIHsKKyAgICAgICAgICAgIC8vdGhlIHNpbXBsZSBhY3Rpb24gaXMgdG8gc2VuZCB0aGUgY29tbWFuZCBsaW5lIGluIGFzIGlzCisgICAgICAgICAgICBleGVjdXRhYmxlLnNldENvbW1hbmRsaW5lKGNvbW1hbmRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vYnV0IGZvciBiaWcgb3BlcmF0aW9ucywgd2Ugc2F2ZSBhbGwgdGhlIHBhcmFtcyB0byBhIHRlbXAgZmlsZQorICAgICAgICAgICAgLy9hbmQgc2V0IEB0bXBmaWxlIGFzIHRoZSBjb21tYW5kIC10aGVuIHdlIHJlbWVtYmVyIHRvIGRlbGV0ZSB0aGUgdGVtcGZpbGUKKyAgICAgICAgICAgIC8vYWZ0ZXJ3YXJkcworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworCisgICAgICAgICAgICB0ZW1wb3JhcnlDb21tYW5kRmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoImNtZCIsICIudHh0IiwgbnVsbCwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgb3duZXIubG9nKCJVc2luZyByZXNwb25zZSBmaWxlICIgKyB0ZW1wb3JhcnlDb21tYW5kRmlsZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcG9yYXJ5Q29tbWFuZEZpbGUpOworICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZm9zKSk7CisgICAgICAgICAgICAgICAgLy9zdGFydCBhdCAxIGJlY2F1c2UgZWxlbWVudCAwIGlzIHRoZSBleGVjdXRhYmxlIG5hbWUKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGNvbW1hbmRzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic2F2aW5nIGNvbW1hbmQgc3RyZWFtIHRvICIgKyB0ZW1wb3JhcnlDb21tYW5kRmlsZSwgZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBuZXdDb21tYW5kTGluZSA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgICAgICBuZXdDb21tYW5kTGluZVswXSA9IGNvbW1hbmRzWzBdOworICAgICAgICAgICAgbmV3Q29tbWFuZExpbmVbMV0gPSAiQCIgKyB0ZW1wb3JhcnlDb21tYW5kRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIGxvZ1ZlcmJvc2UoQ29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKG5ld0NvbW1hbmRMaW5lKSk7CisgICAgICAgICAgICBleGVjdXRhYmxlLnNldENvbW1hbmRsaW5lKG5ld0NvbW1hbmRMaW5lKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogc2NhbiB0aHJvdWdoIG9uZSBmaWxlc2V0IGZvciBmaWxlcyB0byBpbmNsdWRlCisgICAgICogQHBhcmFtIHNjYW5uZXIgdGhlIGRpcmVjdG9yeSBzY2FubmVyIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gZmlsZXNUb0J1aWxkIHRoZSBtYXAgdG8gcGxhY2UgdGhlIGZpbGVzLgorICAgICAqIEBwYXJhbSBvdXRwdXRUaW1lc3RhbXAgdGltZXN0YW1wIHRvIGNvbXBhcmUgYWdhaW5zdAorICAgICAqIEByZXR1cm4gI29mIGZpbGVzIG91dCBvZiBkYXRlCisgICAgICogQHRvZG8gc2hvdWxkIEZBVCBncmFudWxhcml0eSBiZSBpbmNsdWRlZCBoZXJlPworICAgICAqLworICAgIHB1YmxpYyBpbnQgc2Nhbk9uZUZpbGVzZXQoRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyLCBIYXNodGFibGUgZmlsZXNUb0J1aWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgb3V0cHV0VGltZXN0YW1wKSB7CisgICAgICAgIGludCBmaWxlc091dE9mRGF0ZSA9IDA7CisgICAgICAgIFN0cmluZ1tdIGRlcGVuZGVuY2llcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICBGaWxlIGJhc2UgPSBzY2FubmVyLmdldEJhc2VkaXIoKTsKKyAgICAgICAgLy9hZGQgdG8gdGhlIGxpc3QKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGJhc2UsIGRlcGVuZGVuY2llc1tpXSk7CisgICAgICAgICAgICBpZiAoZmlsZXNUb0J1aWxkLmdldCh0YXJnZXRGaWxlKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlsZXNUb0J1aWxkLnB1dCh0YXJnZXRGaWxlLCB0YXJnZXRGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSA+IG91dHB1dFRpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgICAgICBmaWxlc091dE9mRGF0ZSsrOworICAgICAgICAgICAgICAgICAgICBvd25lci5sb2codGFyZ2V0RmlsZS50b1N0cmluZygpICsgIiBpcyBvdXQgb2YgZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvd25lci5sb2codGFyZ2V0RmlsZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlc091dE9mRGF0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvVmlzdWFsQmFzaWNDb21waWxlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kb3RuZXQvVmlzdWFsQmFzaWNDb21waWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyMmUzNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9WaXN1YWxCYXNpY0NvbXBpbGUuamF2YQpAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogVGhpcyB0YXNrIGNvbXBpbGVzIFZpc3VhbCBCYXNpYy5ORVQgc291cmNlIGludG8gZXhlY3V0YWJsZXMgb3IgbW9kdWxlcy4KKyAqIFRoZSB0YXNrIHJlcXVpcmVzIHZiYy5leGUgb24gdGhlIGV4ZWN1dGUgcGF0aCwgdW5sZXNzIGl0IG9yIGFuIGVxdWl2YWxlbnQKKyAqIHByb2dyYW0gaXMgc3BlY2lmaWVkIGluIHRoZSA8dHQ+ZXhlY3V0YWJsZTwvdHQ+IHBhcmFtZXRlcgorICoKKyAqIDxwPgorICogQWxsIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsOiAmbHQ7dmJjLyZndDsgc2hvdWxkIHN1ZmZpY2UgdG8gcHJvZHVjZSBhIGRlYnVnCisgKiBidWlsZCBvZiBhbGwgKi52YiBmaWxlcy4KKyAqCisgKiA8cD4KKworICogVGhlIHRhc2sgaXMgYSBkaXJlY3RvcnkgYmFzZWQgdGFzaywgc28gYXR0cmlidXRlcyBsaWtlCisgKiA8dHQ+aW5jbHVkZXM9JnF1b3Q7KipcLyoudmImcXVvdDs8L3R0PiBhbmQKKyAqIDx0dD5leGNsdWRlcz0mcXVvdDticm9rZW4udmImcXVvdDs8L3R0PiBjYW4gYmUgdXNlZCB0byBjb250cm9sCisgKiB0aGUgZmlsZXMgcHVsbGVkIGluLiBCeSBkZWZhdWx0LAorICogYWxsICoudmIgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCBmb2xkZXIgZG93biBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvbW1hbmQuCisgKiBXaGVuIHRoaXMgaGFwcGVucyB0aGUgZGVzdEZpbGUgLWlmIG5vdCBzcGVjaWZpZWQtCisgKiBpcyB0YWtlbiBhcyB0aGUgZmlyc3QgZmlsZSBpbiB0aGUgbGlzdCwgd2hpY2ggbWF5IGJlIHNvbWV3aGF0IGhhcmQgdG8gY29udHJvbC4KKyAgIFNwZWNpZnlpbmcgdGhlIG91dHB1dCBmaWxlIHdpdGggPHR0PmRlc3RmaWxlPC90dD4gaXMgcHJ1ZGVudC4KKyA8L3A+CisgPHA+CisgKiBBbHNvLCBkZXBlbmRlbmN5IGNoZWNraW5nIG9ubHkgd29ya3MgaWYgZGVzdGZpbGUgaXMgc2V0LgorICoKKyAqIDxwPkZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlIHBhdHRlcm4KKyAqIDxjb2RlPioqPC9jb2RlPjxjb2RlPi8qLnZiPC9jb2RlPiBpcyBwcmVzZXQgYXMgaW5jbHVkZXMgbGlzdCBhbmQKKyAqIHlvdSBjYW4gbm90IG92ZXJyaWRlIGl0IHdpdGggYW4gZXhwbGljaXQgaW5jbHVkZXMgYXR0cmlidXRlLiAgVXNlCisgKiBuZXN0ZWQgPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IGVsZW1lbnRzIGluc3RlYWQgb2YgdGhlIGJhc2VkaXIKKyAqIGF0dHJpYnV0ZSBpZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wuPC9wPgorICoKKyAqIEFzIHdpdGggJmx0O2NzYyZndDsgbmVzdGVkIDx0dD5zcmM8L3R0PiBmaWxlc2V0cyBvZiBzb3VyY2UsCisgKiByZWZlcmVuY2UgZmlsZXNldHMsIGRlZmluaXRpb25zIGFuZCByZXNvdXJjZXMgY2FuIGJlIHByb3ZpZGVkLgorICoKKyAqIDxwPgorICogRXhhbXBsZQorICogPC9wPgorICogPHByZT4mbHQ7dmJjCisgKiAgIG9wdGltaXplPSZxdW90O3RydWUmcXVvdDsKKyAqICAgZGVidWc9JnF1b3Q7ZmFsc2UmcXVvdDsKKyAqICAgd2FybkxldmVsPSZxdW90OzQmcXVvdDsKKyAqICAgdGFyZ2V0VHlwZT0mcXVvdDtleGUmcXVvdDsKKyAqICAgZGVmaW5pdGlvbnM9JnF1b3Q7UkVMRUFTRSZxdW90OworICogICBleGNsdWRlcz0mcXVvdDtzcmMvdW5pY29kZV9jbGFzcy52YiZxdW90OworICogICBtYWluQ2xhc3MgPSAmcXVvdDtNYWluQXBwJnF1b3Q7CisgKiAgIGRlc3RGaWxlPSZxdW90O05ldEFwcC5leGUmcXVvdDsKKyAqICAgb3B0aW9uRXhwbGljaXQ9JnF1b3Q7dHJ1ZSZxdW90OworICogICBvcHRpb25Db21wYXJlPSZxdW90O3RleHQmcXVvdDsKKyAqICAgcmVmZXJlbmNlcz0iU3lzdGVtLlhtbCxTeXN0ZW0uV2ViLlhtbCIKKyAqICAgJmd0OworICogICAgICAgICAgJmx0O3JlZmVyZW5jZSBmaWxlPSIke3Rlc3RDU0MuZGxsfSIgLyZndDsKKyAqICAgICAgICAgICZsdDtkZWZpbmUgbmFtZT0iUkVMRUFTRSIgLyZndDsKKyAqICAgICAgICAgICZsdDtkZWZpbmUgbmFtZT0iREVCVUciIGlmPSJkZWJ1Zy5wcm9wZXJ0eSIvJmd0OworICogICAgICAgICAgJmx0O2RlZmluZSBuYW1lPSJkZWYzIiB1bmxlc3M9ImRlZjIucHJvcGVydHkiLyZndDsKKyAqICAgJmx0Oy92YmMmZ3Q7CisgPC9wcmU+CisgKiBAYW50LnRhc2sgICAgbmFtZT0idmJjIiBjYXRlZ29yeT0iZG90bmV0IgorICovCisKK3B1YmxpYyBjbGFzcyBWaXN1YWxCYXNpY0NvbXBpbGUgZXh0ZW5kcyBEb3RuZXRDb21waWxlIHsKKworICAgIC8qKgorICAgICAqIENvbXBpbGVyIG9wdGlvbiB0byByZW1vdmUgaW50ZWdlciBjaGVja3MuIERlZmF1bHQ6IGZhbHNlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZW1vdmVJbnRDaGVja3MgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFJlcXVpcmUgZXhwbGljaXQgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzPyBEZWZhdWx0OiBmYWxzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb3B0aW9uRXhwbGljaXQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEVuZm9yY2Ugc3RyaWN0IGxhbmd1YWdlIHNlbWFudGljcz8gRGVmYXVsdDogZmFsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG9wdGlvblN0cmljdCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBjb21wYXJlIHN0cmluZ3MgYXMgInRleHQiIG9yICJiaW5hcnkiLiBEZWZhdWx0OiAiYmluYXJ5Ii4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvcHRpb25Db21wYXJlOworCisgICAgLyoqCisgICAgICogUm9vdCBuYW1lc3BhY2UgZm9yIGFsbCB0eXBlIGRlY2xhcmF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb290TmFtZXNwYWNlOworCisgICAgLyoqCisgICAgICogRGVjbGFyZSBnbG9iYWwgaW1wb3J0cyBmb3JuYW1lc3BhY2VzIGluIHJlZmVyZW5jZWQgbWV0YWRhdGEgZmlsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW1wb3J0czsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBWaXN1YWxCYXNpY0NvbXBpbGUuCisgICAgICovCisgICAgcHVibGljIFZpc3VhbEJhc2ljQ29tcGlsZSgpIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgcmVzZXQgYWxsIGNvbnRlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBzdXBlci5jbGVhcigpOworICAgICAgICBpbXBvcnRzID0gbnVsbDsKKyAgICAgICAgcm9vdE5hbWVzcGFjZSA9IG51bGw7CisgICAgICAgIG9wdGlvbkNvbXBhcmUgPSBudWxsOworICAgICAgICBvcHRpb25FeHBsaWNpdCA9IGZhbHNlOworICAgICAgICBvcHRpb25TdHJpY3QgPSBmYWxzZTsKKyAgICAgICAgcmVtb3ZlSW50Q2hlY2tzID0gZmFsc2U7CisgICAgICAgIHNldEV4ZWN1dGFibGUoInZiYyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBnZXQgdGhlIGFyZ3VtZW50IG9yIG51bGwgZm9yIG5vIGFyZ3VtZW50IG5lZWRlZAorICAgICAqICBUaGlzIGlzIG92ZXJyaWRkZW4gZnJvbSBEb3RuZXRDb21waWxlLmphdmEgYmVjYXVzZSBWQkMgdXNlcworICAgICAqICAiL3dpbjMycmVzb3VyY2U6IiByYXRoZXIgdGhhbiAiL3dpbjMycmVzOiIKKyAgICAgKgorICAgICAqQHJldHVybiAgICBUaGUgV2luMzJSZXMgUGFyYW1ldGVyIHRvIENTQworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0V2luMzJSZXNQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmIChnZXRXaW4zMlJlcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiL3dpbjMycmVzb3VyY2U6IiArIGdldFdpbjMyUmVzKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byByZW1vdmUgaW50ZWdlciBjaGVja3MuIERlZmF1bHQgZmFsc2UuCisgICAgICogQHBhcmFtICBmbGFnICBvbi9vZmYgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW92ZUludENoZWNrcyhib29sZWFuIGZsYWcpIHsKKyAgICAgICAgcmVtb3ZlSW50Q2hlY2tzID0gZmxhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZsYWcgZm9yIHJlbW92aW5nIGludGVnZXIgY2hlY2tzLgorICAgICAqIEByZXR1cm4gICAgdHJ1ZSBpZiBmbGFnIGlzIHR1cm5lZCBvbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlbW92ZUludENoZWNrcygpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUludENoZWNrczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JtIHRoZSBvcHRpb24gc3RyaW5nIGZvciByZW1vdmVJbnRDaGVja3MuCisgICAgICogQHJldHVybiBUaGUgcGFyYW1ldGVyIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW92ZUludENoZWNrc1BhcmFtZXRlcigpIHsKKyAgICAgICAgcmV0dXJuICIvcmVtb3ZlaW50Y2hlY2tzIiArIChyZW1vdmVJbnRDaGVja3MgPyAiKyIgOiAiLSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gcmVxdWlyZSBleHBsaWNpdCBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZXMuCisgICAgICogQHBhcmFtICBmbGFnICBvbi9vZmYgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9wdGlvbkV4cGxpY2l0KGJvb2xlYW4gZmxhZykgeworICAgICAgICBvcHRpb25FeHBsaWNpdCA9IGZsYWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmbGFnIGZvciB3aGV0aGVyIHRvIHJlcXVpcmUgZXhwbGljaXQgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzLgorICAgICAqQHJldHVybiAgICB0cnVlIGlmIGZsYWcgaXMgdHVybmVkIG9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW9uRXhwbGljaXQoKSB7CisgICAgICAgIHJldHVybiBvcHRpb25FeHBsaWNpdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JtIHRoZSBvcHRpb24gc3RyaW5nIGZvciBvcHRpb25FeHBsaWNpdC4uCisgICAgICogQHJldHVybiBUaGUgcGFyYW1ldGVyIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9wdGlvbkV4cGxpY2l0UGFyYW1ldGVyKCkgeworICAgICAgICByZXR1cm4gIi9vcHRpb25leHBsaWNpdCIgKyAob3B0aW9uRXhwbGljaXQgPyAiKyIgOiAiLSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZm9yY2Ugc3RyaWN0IGxhbmd1YWdlIHNlbWFudGljcy4KKyAgICAgKiBAcGFyYW0gIGZsYWcgIG9uL29mZiBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW9uU3RyaWN0KGJvb2xlYW4gZmxhZykgeworICAgICAgICBvcHRpb25TdHJpY3QgPSBmbGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmxhZyBmb3Igd2hldGhlciB0byBlbmZvcmNlIHN0cmljdCBsYW5ndWFnZSBzZW1hbnRpY3MuCisgICAgICogQHJldHVybiAgICB0cnVlIGlmIGZsYWcgaXMgdHVybmVkIG9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW9uU3RyaWN0KCkgeworICAgICAgICByZXR1cm4gb3B0aW9uU3RyaWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciB0aGUgb3B0aW9uIHN0cmluZyBmb3Igb3B0aW9uU3RyaWN0LgorICAgICAqIEByZXR1cm4gVGhlIHBhcmFtZXRlciBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPcHRpb25TdHJpY3RQYXJhbWV0ZXIoKSB7CisgICAgICAgIHJldHVybiAiL29wdGlvbnN0cmljdCIgKyAob3B0aW9uU3RyaWN0ID8gIisiIDogIi0iKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgcm9vdCBuYW1lc3BhY2UgZm9yIGFsbCB0eXBlIGRlY2xhcmF0aW9ucy4KKyAgICAgKiBAcGFyYW0gcm9vdE5hbWVzcGFjZSBhIHJvb3QgbmFtZXNwYWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvb3ROYW1lc3BhY2UoU3RyaW5nIHJvb3ROYW1lc3BhY2UpIHsKKyAgICAgICAgdGhpcy5yb290TmFtZXNwYWNlID0gcm9vdE5hbWVzcGFjZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcm9vdCBuYW1lc3BhY2UuCisgICAgICogQHJldHVybiAgdGhlIHJvb3QgbmFtZXNwYWNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9vdE5hbWVzcGFjZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucm9vdE5hbWVzcGFjZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZvcm0gdGhlIG9wdGlvbiBzdHJpbmcgZm9yIHJvb3ROYW1lc3BhY2UuCisgICAgICogQHJldHVybiAgdGhlIHJvb3QgbmFtZXNwYWNlIG9wdGlvbiBzdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSb290TmFtZXNwYWNlUGFyYW1ldGVyKCkgeworICAgICAgICBpZiAocm9vdE5hbWVzcGFjZSAhPSBudWxsICYmIHJvb3ROYW1lc3BhY2UubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICIvcm9vdG5hbWVzcGFjZToiICsgcm9vdE5hbWVzcGFjZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZWNsYXJlIGdsb2JhbCBpbXBvcnRzIGZvciBuYW1lc3BhY2VzIGluIHJlZmVyZW5jZWQgbWV0YWRhdGEgZmlsZXMuCisgICAgICogQHBhcmFtIGltcG9ydHMgdGhlIGltcG9ydHMgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW1wb3J0cyhTdHJpbmcgaW1wb3J0cykgeworICAgICAgICB0aGlzLmltcG9ydHMgPSBpbXBvcnRzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGdsb2JhbCBpbXBvcnRzIGZvciBuYW1lc3BhY2VzIGluIHJlZmVyZW5jZWQgbWV0YWRhdGEgZmlsZXMuCisgICAgICogQHJldHVybiAgdGhlIGltcG9ydHMgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0czsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZvcm1hdCB0aGUgb3B0aW9uIGZvciBpbXBvcnRzLgorICAgICAqIEByZXR1cm4gIHRoZSBmb3JtYXR0ZWQgaW1wb3J0IG9wdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEltcG9ydHNQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmIChpbXBvcnRzICE9IG51bGwgJiYgaW1wb3J0cy5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIi9pbXBvcnRzOiIgKyBpbXBvcnRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgYmluYXJ5LSBvciB0ZXh0LXN0eWxlIHN0cmluZyBjb21wYXJpc29ucy4gRGVmYXVsdHMKKyAgICAgKiB0byAiYmluYXJ5IgorICAgICAqIEBwYXJhbSBvcHRpb25Db21wYXJlIHRoZSBvcHRpb24gY29tcGFyZSBzdHlsZS4gInRleHQiIHwgImJpbmFyeSIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW9uQ29tcGFyZShTdHJpbmcgb3B0aW9uQ29tcGFyZSkgeworICAgICAgICBpZiAoInRleHQiLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uQ29tcGFyZSkpIHsKKyAgICAgICAgICAgIHRoaXMub3B0aW9uQ29tcGFyZSA9ICJ0ZXh0IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMub3B0aW9uQ29tcGFyZSA9ICJiaW5hcnkiOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAiYmluYXJ5IiBvciAidGV4dCIgZm9yIHRoZSBzdHJpbmctY29tcGFyaXNvbiBzdHlsZS4KKyAgICAgKiBAcmV0dXJuICB0aGUgb3B0aW9uIGNvbXBhcmUgc3R5bGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPcHRpb25Db21wYXJlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25Db21wYXJlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCB0aGUgb3B0aW9uIGZvciBzdHJpbmcgY29tcGFyaXNvbiBzdHlsZS4KKyAgICAgKiBAcmV0dXJuICBUaGUgZm9ybWF0dGVkIG9wdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wdGlvbkNvbXBhcmVQYXJhbWV0ZXIoKSB7CisgICAgICAgIGlmIChvcHRpb25Db21wYXJlICE9IG51bGwgJiYgInRleHQiLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uQ29tcGFyZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiL29wdGlvbmNvbXBhcmU6dGV4dCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIi9vcHRpb25jb21wYXJlOmJpbmFyeSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbXBsZW1lbnQgVkJDIGNvbW1hbmRzCisgICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgdG8gc2V0IGFyZ3VlbWVudHMgb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29tcGlsZXJTcGVjaWZpY09wdGlvbnMoTmV0Q29tbWFuZCBjb21tYW5kKSB7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0UmVtb3ZlSW50Q2hlY2tzUGFyYW1ldGVyKCkpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldEltcG9ydHNQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0T3B0aW9uRXhwbGljaXRQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0T3B0aW9uU3RyaWN0UGFyYW1ldGVyKCkpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KGdldFJvb3ROYW1lc3BhY2VQYXJhbWV0ZXIoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoZ2V0T3B0aW9uQ29tcGFyZVBhcmFtZXRlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlbGltaXRlciB0aGF0IHRoZSBjb21waWxlciB1c2VzIGJldHdlZW4gcmVmZXJlbmNlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYyMgd2lsbCByZXR1cm4gIjsiOyBWQi5ORVQgd2lsbCByZXR1cm4gIiwiCisgICAgICogQHJldHVybiBUaGUgc3RyaW5nIGRlbGltaXRlciBmb3IgdGhlIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VEZWxpbWl0ZXIoKSB7CisgICAgICAgIHJldHVybiAiLCI7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZXh0ZW5zaW9uIG9mIGZpbGVuYW1lcyB0byBjb21waWxlLgorICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyBleHRlbnNpb24gb2YgZmlsZXMgdG8gY29tcGlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7CisgICAgICAgIHJldHVybiAidmIiOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVzb3VyY2VQYXJhbWV0ZXIoTmV0Q29tbWFuZCBjb21tYW5kLCBEb3RuZXRSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICByZXNvdXJjZS5nZXRQYXJhbWV0ZXJzKGdldFByb2plY3QoKSwgY29tbWFuZCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHZhbGlkYXRpb24gY29kZQorICAgICAqIEB0aHJvd3MgIEJ1aWxkRXhjZXB0aW9uICBpZiB2YWxpZGF0aW9uIGZhaWxlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnZhbGlkYXRlKCk7CisgICAgICAgIGlmIChnZXREZXN0RmlsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGVzdEZpbGUgd2FzIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9Xc2RsVG9Eb3RuZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RvdG5ldC9Xc2RsVG9Eb3RuZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWZlNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZG90bmV0L1dzZGxUb0RvdG5ldC5qYXZhCkBAIC0wLDAgKzEsNTk1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogQ29udmVydHMgYSBXU0RMIGZpbGUgb3IgVVJMIHJlc291cmNlIGludG8gYSAuTkVUIGxhbmd1YWdlLgorICoKKyAqIFdoeSBhZGQgYSB3cmFwcGVyIHRvIHRoZSBNUyBXU0RMIHRvb2w/CisgKiBTbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoYXQgeW91ciB3ZWIgc2VydmljZXMsIGJlIHRoZXkgd3JpdHRlbiB3aXRoIEF4aXMgb3IKKyAqYW55b25lIGVsc2UncyBTT0FQIHRvb2xraXQsIHdvcmsgd2l0aCAuTkVUIGNsaWVudHMuCisgKgorICpUaGlzIHRhc2sgaXMgZGVwZW5kZW5jeSBhd2FyZSB3aGVuIHVzaW5nIGEgZmlsZSBhcyBhIHNvdXJjZSBhbmQgZGVzdGluYXRpb247CisgKnNvIGlmIHlvdSAmbHQ7Z2V0Jmd0OyB0aGUgZmlsZSAod2l0aCA8Y29kZT51c2V0aW1lc3RhbXA9InRydWUiPC9jb2RlPikgdGhlbgorICp5b3Ugb25seSByZWJ1aWxkIHN0dWZmIHdoZW4gdGhlIFdTREwgZmlsZSBpcyBjaGFuZ2VkLiBPZiBjb3Vyc2UsCisgKmlmIHRoZSBzZXJ2ZXIgZ2VuZXJhdGVzIGEgbmV3IHRpbWVzdGFtcCBldmVyeSB0aW1lIHlvdSBhc2sgZm9yIHRoZSBXU0RMLAorICp0aGlzIGlzIG5vdCBlbm91Z2guLi51c2UgdGhlICZsdDtmaWxlc21hdGNoJmd0OyAmbHQ7Y29uZGl0aW9uJmd0OyB0bworICp0byBieXRlIGZvciBieXRlIGNvbXBhcmlzb24gYWdhaW5zdCBhIGNhY2hlZCBXU0RMIGZpbGUgdGhlbiBtYWtlCisgKnRoZSB0YXJnZXQgY29uZGl0aW9uYWwgb24gdGhhdCB0ZXN0IGZhaWxpbmcuCisKKyAqIFNlZSAiQ3JlYXRpbmcgYW4gWE1MIFdlYiBTZXJ2aWNlIFByb3h5IiwgIndzZGwuZXhlIiBkb2NzIGluCisgKiB0aGUgZnJhbWV3b3JrIFNESyBkb2N1bWVudGF0aW9uCisgKiBAdmVyc2lvbiAgICAgMC41CisgKiBAYW50LnRhc2sgICAgY2F0ZWdvcnk9ImRvdG5ldCIKKyAqIEBzaW5jZSAgICAgICBBbnQgMS41CisgKi8KKworcHVibGljIGNsYXNzIFdzZGxUb0RvdG5ldCBleHRlbmRzIFRhc2sgIHsKKworICAgIC8qKgorICAgICAqIHVzZWQgZm9yIHRpbWVzdGFtcCBjaGVja2luZworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogbmFtZSBvZiBvdXRwdXQgZmlsZSAocmVxdWlyZWQpCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGRlc3RGaWxlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIGxhbmd1YWdlOyBkZWZhdWx0cyB0byBDIworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlID0gIkNTIjsKKworICAgIC8qKgorICAgICAqIGZsYWcgc2V0IHRvIHRydWUgdG8gZ2VuZXJhdGUgc2VydmVyIHNpZGUgc2tlbGV0b24KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2VydmVyID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOworCisgICAgLyoqCisgICAgICogIGZsYWcgdG8gY29udHJvbCBhY3Rpb24gb24gZXhlY3V0aW9uIHRyb3VibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiAgYW55IGV4dHJhIGNvbW1hbmQgb3B0aW9ucz8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhT3B0aW9ucyA9IG51bGw7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisKKyAgICAvKioKKyAgICAgKiBwcm90b2NvbCBzdHJpbmcuIEV4YWN0IHZhbHVlIHNldCBkZXBlbmRzIG9uIFNPQVAgc3RhY2sgdmVyc2lvbi4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHByb3RvY29sID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIHNob3VsZCBlcnJvcnMgY29tZSBpbiBhbiBJREUgZm9ybWF0LiBUaGlzCisgICAgICogaXMgV1NFIG9ubHkuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaWRlRXJyb3JzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBmaWxlc2V0cyBvZiBmaWxlIHRvIGNvbXBpbGUKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIHNjaGVtYXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBvdXIgV1NETCBmaWxlLgorICAgICAqIEBzaW5jZSBhbnQxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIFNjaGVtYSB3c2RsID0gbmV3IFNjaGVtYSgpOworCisgICAgLyoqCisgICAgICogY29tcGlsZXIKKyAgICAgKiBAc2luY2UgYW50MS43CisgICAgICovCisgICAgcHJpdmF0ZSBDb21waWxlciBjb21waWxlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBlcnJvciBtZXNzYWdlOiBkZXN0IGZpbGUgaXMgYSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9ERVNUX0ZJTEVfSVNfRElSID0gImRlc3RpbmF0aW9uIGZpbGUgaXMgYSBkaXJlY3RvcnkiOworCisgICAgLyoqCisgICAgICogZXJyb3IgbWVzc2FnZTogbm8gZGVzdCBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fREVTVF9GSUxFID0gImRlc3RpbmF0aW9uIGZpbGUgbXVzdCBiZSBzcGVjaWZpZWQiOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgZmlsZSB0byBnZW5lcmF0ZS4gUmVxdWlyZWQKKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgZmlsZW5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0RmlsZShGaWxlIGRlc3RGaWxlKSB7CisgICAgICAgIHRoaXMuZGVzdEZpbGUgPSBkZXN0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBVUkwgdG8gZmV0Y2guIEZldGNoaW5nIGlzIGJ5IHdzZGwuZXhlOyBBbnQgcHJveHkgc2V0dGluZ3MKKyAgICAgKiBhcmUgaWdub3JlZDsgZWl0aGVyIHVybCBvciBzcmNGaWxlIGlzIHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSB1cmwgdXJsIHRvIHNhdmUKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIHdzZGwuc2V0VXJsKHVybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGxvY2FsIFdTREwgZmlsZSB0byBwYXJzZTsgZWl0aGVyIHVybCBvciBzcmNGaWxlIGlzIHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBzcmNGaWxlIFdTREwgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY0ZpbGUoRmlsZSBzcmNGaWxlKSB7CisgICAgICAgIHdzZGwuc2V0RmlsZShzcmNGaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIGxhbmd1YWdlOyBvbmUgb2YgIkNTIiwgIkpTIiwgb3IgIlZCIgorICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0IGlzIENTIGZvciBDIyBzb3VyY2UKKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgbGFuZ3VhZ2UgdG8gZ2VuZXJhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZsYWcgdG8gZW5hYmxlIHNlcnZlciBzaWRlIGNvZGUgZ2VuZXJhdGlvbjsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZQorICAgICAqIEBwYXJhbSBzZXJ2ZXIgc2VydmVyLXNpZGUgZmxhZworICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyKGJvb2xlYW4gc2VydmVyKSB7CisgICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5hbWVzcGFjZSB0byBwbGFjZSAgdGhlIHNvdXJjZSBpbi4KKyAgICAgKiBvcHRpb25hbDsgZGVmYXVsdCAiIgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgbmV3IG5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7CisgICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IGEgZmFpbHVyZSBzaG91bGQgaGFsdCB0aGUgYnVpbGQuCisgICAgICogT3B0aW9uYWwgLSBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmYWlsT25FcnJvciBuZXcgZmFpbHVyZSBvcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWxPbkVycm9yKSB7CisgICAgICAgIHRoaXMuZmFpbE9uRXJyb3IgPSBmYWlsT25FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQW55IGV4dHJhIFdTREwuRVhFIG9wdGlvbnMgd2hpY2ggYXJlbid0IGV4cGxpY2l0bHkKKyAgICAgKiAgc3VwcG9ydGVkIGJ5IHRoZSBhbnQgd3JhcHBlciB0YXNrOyBvcHRpb25hbAorICAgICAqCisgICAgICpAcGFyYW0gIGV4dHJhT3B0aW9ucyAgVGhlIG5ldyBFeHRyYU9wdGlvbnMgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYU9wdGlvbnMoU3RyaW5nIGV4dHJhT3B0aW9ucykgeworICAgICAgICB0aGlzLmV4dHJhT3B0aW9ucyA9IGV4dHJhT3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdldGhlciBlcnJvcnMgYXJlIG1hY2hpbmUgcGFyc2VhYmxlLgorICAgICAqIE9wdGlvbmFsLCBkZWZhdWx0PXRydWUKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICogQHBhcmFtIGlkZUVycm9ycyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkZUVycm9ycyhib29sZWFuIGlkZUVycm9ycykgeworICAgICAgICB0aGlzLmlkZUVycm9ycyA9IGlkZUVycm9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3aGF0IHByb3RvY29sIHRvIHVzZS4gU09BUCwgU09BUDEuMiwgSHR0cFBvc3QgYW5kIEh0dHBHZXQKKyAgICAgKiBhcmUgdGhlIGJhc2Ugb3B0aW9ucy4gRGlmZmVyZW50IHZlcnNpb24gYW5kIGltcGxlbWVudGF0aW9ucyBtYXkuCisgICAgICogb2ZmZXIgZGlmZmVyZW50IG9wdGlvbnMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90b2NvbCB0aGUgcHJvdG9jb2wgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbCkgeworICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmV3IHNvdXJjZSBzY2hlbWEgdG8gdGhlIGNvbXBpbGF0aW9uCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgYSBuZXN0ZWQgc2NoZW1hIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2NoZW1hKFNjaGVtYSBzb3VyY2UpIHsKKyAgICAgICAgc2NoZW1hcy5hZGQoc291cmNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmbGFnIHRvIHRyaWdnZXIgdHVybmluZyBhIGZpbGVuYW1lIGludG8gYSBmaWxlOnVybAorICAgICAqIGlnbm9yZWQgZm9yIHRoZSBtb25vIGNvbXBpbGVyLgorICAgICAqIEBwYXJhbSBiIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFrZVVSTChib29sZWFuIGIpIHsKKyAgICAgICAgd3NkbC5zZXRNYWtlVVJMKGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlkZW50aWZ5IHRoZSBjb21waWxlcgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICogQHBhcmFtIGNvbXBpbGVyIHRoZSBlbnVtZXJhdGVkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVyKENvbXBpbGVyIGNvbXBpbGVyKSB7CisgICAgICAgIHRoaXMuY29tcGlsZXIgPSBjb21waWxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB2YWxpZGF0aW9uIGNvZGUKKyAgICAgKiBAdGhyb3dzICBCdWlsZEV4Y2VwdGlvbiAgaWYgdmFsaWRhdGlvbiBmYWlsZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZGVzdEZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX0RFU1RfRklMRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3RGaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgRVJST1JfREVTVF9GSUxFX0lTX0RJUik7CisgICAgICAgIH0KKyAgICAgICAgd3NkbC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBkbyB0aGUgd29yayBieSBidWlsZGluZyB0aGUgY29tbWFuZCBsaW5lIGFuZCB0aGVuIGNhbGxpbmcgaXQKKyAgICAgKgorICAgICAqQHRocm93cyAgQnVpbGRFeGNlcHRpb24gIGlmIHZhbGlkYXRpb24gb3IgZXhlY3V0aW9uIGZhaWxlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiVGhpcyB0YXNrIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uXG4iCisgICAgICAgICAgICArICJvZiBBbnQuICBJdCBpcyBub3cgcGFydCBvZiB0aGUgLk5FVCBBbnRsaWI6XG4iCisgICAgICAgICAgICArICJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9kb3RuZXQvaW5kZXguaHRtbCIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKworICAgICAgICBpZiAoY29tcGlsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZXIgPSBDb21waWxlci5jcmVhdGVEZWZhdWx0Q29tcGlsZXIoKTsKKyAgICAgICAgfQorICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICBOZXRDb21tYW5kIGNvbW1hbmQgPSBuZXcgTmV0Q29tbWFuZCh0aGlzLAorICAgICAgICAgICAgICAgICJXU0RMIiwKKyAgICAgICAgICAgICAgICBjb21waWxlci5nZXRDb21tYW5kKCkpOworICAgICAgICBjb21tYW5kLnNldEZhaWxPbkVycm9yKGZhaWxPbkVycm9yKTsKKyAgICAgICAgLy9maWxsIGluIGFyZ3MKKyAgICAgICAgY29tcGlsZXIuYXBwbHlFeHRyYUFyZ3MoY29tbWFuZCk7CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQoIi9ub2xvZ28iKTsKKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL291dDoiICsgZGVzdEZpbGUpOworICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCIvbGFuZ3VhZ2U6IiwgbGFuZ3VhZ2UpOworICAgICAgICBpZiAoc2VydmVyKSB7CisgICAgICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KCIvc2VydmVyIik7CisgICAgICAgIH0KKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL25hbWVzcGFjZToiLCBuYW1lc3BhY2UpOworICAgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL3Byb3RvY29sOiIgKyBwcm90b2NvbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlkZUVycm9ycykgeworICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudCgiL3BhcnNhYmxlRXJyb3JzIik7CisgICAgICAgIH0KKyAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChleHRyYU9wdGlvbnMpOworCisgICAgICAgIC8vc2V0IHNvdXJjZSBhbmQgcmVidWlsZCBvcHRpb25zCisgICAgICAgIGJvb2xlYW4gcmVidWlsZCA9IHRydWU7CisgICAgICAgIGxvbmcgZGVzdExhc3RNb2RpZmllZCA9IC0xOworCisgICAgICAgIC8vcmVidWlsZCB1bmxlc3MgdGhlIGRlc3QgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBzb3VyY2UgZmlsZQorICAgICAgICBpZiAoZGVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGRlc3RMYXN0TW9kaWZpZWQgPSBkZXN0RmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIHJlYnVpbGQgPSBpc1JlYnVpbGROZWVkZWQod3NkbCwgZGVzdExhc3RNb2RpZmllZCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGg7CisgICAgICAgIC8vbWFyayBmb3IgYSByZWJ1aWxkIGlmIHRoZSBkZXN0IGZpbGUgaXMgbmV3ZXIKKyAgICAgICAgcGF0aCA9IHdzZGwuZXZhbHVhdGUoKTsKKyAgICAgICAgaWYgKCFjb21waWxlci5zdXBwb3J0c0Fic29sdXRlRmlsZXMoKSAmJiB3c2RsLmdldEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBNb25vIDEuMCdzIHdzZGwgZG9lc24ndCBkZWFsIHdpdGggYWJzb2x1dGUgcGF0aHMKKyAgICAgICAgICAgIEZpbGUgZiA9IHdzZGwuZ2V0RmlsZSgpOworICAgICAgICAgICAgY29tbWFuZC5zZXREaXJlY3RvcnkoZi5nZXRQYXJlbnRGaWxlKCkpOworICAgICAgICAgICAgcGF0aCA9IGYuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmQuYWRkQXJndW1lbnQocGF0aCk7CisgICAgICAgIC8vYWRkIGluIGFueSBleHRyYSBmaWxlcy4KKyAgICAgICAgLy90aGlzIGlzIGFuIGVycm9yIGluIG1vbm8sIGJ1dCB3ZSBkbyBub3Qgd2FybiBvbiBpdCBhcyB0aGV5IG1heSBmaXggdGhhdCBvdXRzaWRlCisgICAgICAgIC8vdGhlIGFudCBidWlsZCBjeWNsZS4KKyAgICAgICAgSXRlcmF0b3IgaXQgPSBzY2hlbWFzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSAoU2NoZW1hKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAvL21hcmsgZm9yIGEgcmVidWlsZCBpZiB3ZSBhcmUgbmV3ZXIKKyAgICAgICAgICAgIHJlYnVpbGQgfD0gaXNSZWJ1aWxkTmVlZGVkKHNjaGVtYSwgZGVzdExhc3RNb2RpZmllZCk7CisgICAgICAgICAgICBjb21tYW5kLmFkZEFyZ3VtZW50KHNjaGVtYS5ldmFsdWF0ZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvL2NvbmRpdGlvbmFsbHkgY29tcGlsZQorICAgICAgICBpZiAocmVidWlsZCkgeworICAgICAgICAgICAgY29tbWFuZC5ydW5Db21tYW5kKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGVja3MgZm9yIGEgc2NoZW1hIGJlaW5nIG91dCBvZiBkYXRhCisgICAgICogQHBhcmFtIHNjaGVtYSB1cmwvZmlsZQorICAgICAqIEBwYXJhbSBkZXN0TGFzdE1vZGlmaWVkIHRpbWVzdGFtcCwgLTEgZm9yIG5vIGRlc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSByZWJ1aWxkIGlzIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWJ1aWxkTmVlZGVkKFNjaGVtYSBzY2hlbWEsIGxvbmcgZGVzdExhc3RNb2RpZmllZCkgeworICAgICAgICBpZiAoZGVzdExhc3RNb2RpZmllZCA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICFGSUxFX1VUSUxTLmlzVXBUb0RhdGUoc2NoZW1hLmdldFRpbWVzdGFtcCgpLCBkZXN0TGFzdE1vZGlmaWVkKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIG5lc3RlZCBzY2hlbWEgY2xhc3MKKyAgICAgKiBPbmx5IHN1cHBvcnRlZCBvbiBORVQgdW50aWwgbW9ubyBhZGQgbXVsdGktVVJMIGhhbmRsaW5nIG9uIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNjaGVtYSB7CisgICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOworICAgICAgICBwcml2YXRlIFN0cmluZyB1cmw7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtYWtlVVJMID0gZmFsc2U7CisKKyAgICAgICAgLy8gRXJyb3JzCisgICAgICAgIC8qKiBPbmUgb2YgZmlsZSBvciB1cmwgbXVzdCBiZSBzZXQgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9ORV9ERUNMQVJFRCA9ICJPbmUgb2YgZmlsZSBhbmQgdXJsIG11c3QgYmUgc2V0IjsKKyAgICAgICAgLyoqIE9ubHkgb25lIG9mIGZpbGUgb3IgdXJsICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0JPVEhfREVDTEFSRUQgPSAiT25seSBvbmUgb2YgZmlsZSBvciB1cmwgY2FuIGJlIHNldCI7CisgICAgICAgIC8qKiBOb3QgZm91bmQgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfRklMRV9OT1RfRk9VTkQgPSAiTm90IGZvdW5kOiAiOworICAgICAgICAvKiogRmlsZSBpcyBhIGRpcmVjdG9yeSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9GSUxFX0lTX0RJUiA9ICJGaWxlIGlzIGEgZGlyZWN0b3J5OiAiOworICAgICAgICAvKiogQ291bGQgbm90IFVSTCBjb252ZXJ0ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX1VSTF9DT05WRVJUID0gIkNvdWxkIG5vdCBVUkwgY29udmVydCAiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiB2YWxpZGF0ZSB0aGUgc2NoZW1hCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgIHZvaWQgdmFsaWRhdGUoKSB7CisKKyAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX0ZJTEVfTk9UX0ZPVU5EICsgZmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfRklMRV9JU19ESVIgKyBmaWxlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgdXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfQk9USF9ERUNMQVJFRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsICYmIHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PTkVfREVDTEFSRUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZhbGlkYXRlIG91ciBzZXR0aW5ncy4KKyAgICAgICAgICogQHJldHVybiBlaXRoZXIgdGhlIFVSTCBvciB0aGUgZnVsbCBmaWxlIHBhdGgKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZXZhbHVhdGUoKSB7CisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVybCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1ha2VVUkwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX1VSTF9DT05WRVJUICsgZmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpbGUudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGZpbGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGZpbGUgdXNlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBuYW1lIG9mIGEgZmlsZSB0byB1c2UgYXMgYSBzb3VyY2Ugb2YgV1NETCBvciBYU0QgZGF0YQorICAgICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byB1c2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHVybC4KKyAgICAgICAgICogQHJldHVybiB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgICAgICAgcmV0dXJuIHVybDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiB1cmwgb2YgYSByZXNvdXJjZS4KKyAgICAgICAgICogVVJMcyBoYXZlIG5vIHRpbWVzdGFtcCBjaGVja2luZywgYW5kIGFyZSBub3QgdmFsaWRhdGVkCisgICAgICAgICAqIEBwYXJhbSB1cmwgdGhlIFVSTCBzdHJpbmcgdG8gdXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgICAgIHRoaXMudXJsID0gdXJsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbWFrZVVSTCBhdHRyaWJ1dGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTWFrZVVSTCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtYWtlVVJMOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGZsYWcgdG8gcmVxdWVzdCB0aGF0IGEgZmlsZSBpcyB0dXJuZWQgaW50byBhbiBhYnNvbHV0ZSBmaWxlOiBVUkwKKyAgICAgICAgICogYmVmb3JlIGJlaW5nIHBhc3NlZCB0byB0aGUgV1NETCBjb21waWxlcgorICAgICAgICAgKiBAcGFyYW0gbWFrZVVSTCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TWFrZVVSTChib29sZWFuIG1ha2VVUkwpIHsKKyAgICAgICAgICAgIHRoaXMubWFrZVVSTCA9IG1ha2VVUkw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgZmlsZSB0aW1lc3RhbXAuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcCBvZiBhIGZpbGUsIG9yIC0xIGZvciBhIFVSTCAobWVhbmluZyB3ZSBkbyBub3Qga25vdyBpdHMgYWdlKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIG91ciBjb21waWxlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGlsZXIgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKworICAgICAgICAvKiogbWljcm9zb2Z0ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX01TID0gIm1pY3Jvc29mdCI7CisgICAgICAgIC8qKiBtb25vICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX01PTk8gPSAibW9ubyI7CisgICAgICAgIC8qKiBtaWNyb3NvZnQtb24tbW9ubyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9NU19PTl9NT05PID0gIm1pY3Jvc29mdC1vbi1tb25vIjsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAgICAgLyoqIHRoZSBpbmRleCB0byBzdHJpbmcgbWFwcGluZ3MgKi8KKyAgICAgICAgU3RyaW5nW10gY29tcGlsZXJzID0geworICAgICAgICAgICAgQ09NUElMRVJfTVMsCisgICAgICAgICAgICBDT01QSUxFUl9NT05PLAorICAgICAgICAgICAgQ09NUElMRVJfTVNfT05fTU9OTworICAgICAgICB9OworCisgICAgICAgIC8qKiBXU0RMICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYRV9XU0RMID0gIndzZGwiOworICAgICAgICAvKiogTU9OTyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEVfTU9OTyA9ICJtb25vIjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHByb2dyYW1zIHRvIHJ1bgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nW10gY29tcGlsZXJFeGVjdXRhYmxlcyA9IHsKKyAgICAgICAgICAgIEVYRV9XU0RMLAorICAgICAgICAgICAgRVhFX1dTREwsCisgICAgICAgICAgICBFWEVfTU9OTworICAgICAgICB9OworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGV4dHJhIHRoaW5ncworICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nW11bXSBleHRyYUNvbXBpbGVyQXJncyA9IHsKKyAgICAgICAgICAgIHt9LAorICAgICAgICAgICAge30sCisgICAgICAgICAgICB7RVhFX1dTREwgKyAiLmV4ZSJ9CisgICAgICAgIH07CisKKyAgICAgICAgYm9vbGVhbltdIGFic29sdXRlRmlsZXMgPSB7CisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICB0cnVlCisgICAgICAgIH07CisKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgdGhlIG9ubHkgbWV0aG9kIGEgc3ViY2xhc3MgbmVlZHMgdG8gaW1wbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGhvbGRpbmcgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZW51bWVyYXRpb24uCisgICAgICAgICAqICAgICAgICAgVGhlIG9yZGVyIG9mIGVsZW1lbnRzIG11c3QgYmUgZml4ZWQgc28gdGhhdCA8dHQ+aW5kZXhPZlZhbHVlKFN0cmluZyk8L3R0PgorICAgICAgICAgKiAgICAgICAgIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgaW5kZXggZm9yIHRoZSBzYW1lIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlcnM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGZvciB0aGlzIHBsYXRmb3JtLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGNvbXBpbGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBpbGVyIGNyZWF0ZURlZmF1bHRDb21waWxlcigpIHsKKyAgICAgICAgICAgIENvbXBpbGVyIGMgPSBuZXcgQ29tcGlsZXIoKTsKKyAgICAgICAgICAgIFN0cmluZyBjb21waWxlck5hbWU7CisgICAgICAgICAgICBjb21waWxlck5hbWUgPSBPcy5pc0ZhbWlseSgid2luZG93cyIpID8gQ09NUElMRVJfTVMgOiBDT01QSUxFUl9NT05POworICAgICAgICAgICAgYy5zZXRWYWx1ZShjb21waWxlck5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogcmV0dXJuIHRoZSBjb21tYW5kIHRvIHJ1bgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJFeGVjdXRhYmxlc1tnZXRJbmRleCgpXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiByZXR1cm4gYW55IGV4dHJhIGFyZ3VtZW50cyBmb3IgdGhlIGNvbXBpbGVyCisgICAgICAgICAqIEByZXR1cm4gZXh0cmEgY29tcGlsZXIgYXJndW1lbnRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXh0cmFBcmdzKCkgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhQ29tcGlsZXJBcmdzW2dldEluZGV4KCldOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB3aGVyZSB0aGUgY3VycmVudCB2YWx1ZSBzdXBwb3J0cyBhYnNvbHV0ZSBmaWxlcy4KKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21waWxlciBkb2VzIHN1cHBvcnRzIGFic29sdXRlIGZpbGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNBYnNvbHV0ZUZpbGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlRmlsZXNbZ2V0SW5kZXgoKV07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogYXBwbHkgYW55IGV4dHJhIGFyZ3VtZW50cyBvZiB0aGlzIGNsYXNzCisgICAgICAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIGFwcGx5IHRoZSBhcmd1bWVudHMgdG8uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhcHBseUV4dHJhQXJncyhOZXRDb21tYW5kIGNvbW1hbmQpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBnZXRFeHRyYUFyZ3MoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgY29tbWFuZC5hZGRBcmd1bWVudChhcmdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvQm9ybGFuZERlcGxveW1lbnRUb29sLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvQm9ybGFuZERlcGxveW1lbnRUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2OGI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Cb3JsYW5kRGVwbG95bWVudFRvb2wuamF2YQpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOworCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKKworLyoqCisgKiBCb3JsYW5kRGVwbG95bWVudFRvb2wgaXMgZGVkaWNhdGVkIHRvIHRoZSBCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciA0LjUgYW5kIDQuNS4xCisgKiBUaGlzIHRhc2sgZ2VuZXJhdGVzIGFuZCBjb21waWxlcyB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyBmb3IgYWxsIGVqYiBkZXNjcmliZWQgaW50byB0aGUKKyAqIERlcGxveW1lbnQgRGVzY3JpcHRvciwgYnVpbGRzIHRoZSBqYXIgZmlsZSBpbmNsdWRpbmcgdGhlIHN1cHBvcnQgZmlsZXMgYW5kIHZlcmlmeQorICogd2hldGhlciB0aGUgcHJvZHVjZWQgamFyIGlzIHZhbGlkIG9yIG5vdC4KKyAqIFRoZSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmU6CisgKiA8dWw+CisgKiA8bGk+ZGVidWcgIChib29sZWFuKSAgICA6IHR1cm4gb24gdGhlIGRlYnVnIG1vZGUgZm9yIGdlbmVyYXRpb24gb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R1YnMgYW5kIHNrZWxldG9ucyAoZGVmYXVsdDpmYWxzZSk8L2xpPgorICogPGxpPnZlcmlmeSAoYm9vbGVhbikgICAgOiB0dXJuIG9uIHRoZSB2ZXJpZmljYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgamFyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rpb24gIChkZWZhdWx0OnRydWUpIDwvbGk+CisgKiA8bGk+dmVyaWZ5YXJncyAoU3RyaW5nKSA6IGFkZCBvcHRpb25hbCBhcmd1bWVudCB0byB2ZXJpZnkgY29tbWFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIHZiaiBjb20uaW5wcmlzZS5lamIudXRpbC5WZXJpZnkpPC9saT4KKyAqIDxsaT5iYXNkdGQgKFN0cmluZykgICAgIDogbG9jYXRpb24gb2YgdGhlIEJBUyBEVEQgPC9saT4KKyAqIDxsaT5nZW5lcmF0ZWNsaWVudCAoYm9vbGVhbikgOiB0dXJuIG9uIHRoZSBjbGllbnQgamFyIGZpbGUgZ2VuZXJhdGlvbiA8L2xpPgorICogPGxpPnZlcnNpb24gKGludCkgICAgICAgOiB0ZWxsIHdoYXQgaXMgdGhlIEJvcmxhbmQgYXBwc2VydmVyIHZlcnNpb24gNCBvciA1IDwvbGk+CisgKiA8L3VsPgorICoKKyAqPFBSRT4KKyAqCisgKiAgICAgICZsdDtlamJqYXIgc3JjZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlc30mcXVvdDsKKyAqICAgICAgICAgICAgICAgYmFzZWphcm5hbWU9JnF1b3Q7dnNtcCZxdW90OworICogICAgICAgICAgICAgICBkZXNjcmlwdG9yZGlyPSZxdW90OyR7cnNjLmRpcn0vaHJtYW5hZ2VyJnF1b3Q7Jmd0OworICogICAgICAgICZsdDtib3JsYW5kIGRlc3RkaXI9JnF1b3Q7dHN0bGliJnF1b3Q7Jmd0OworICogICAgICAgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0mcXVvdDtjbGFzc3BhdGgmcXVvdDsgLyZndDsKKyAqICAgICAgICAmbHQ7L2JvcmxhbmQmZ3Q7CisgKiAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKlxlamItamFyLnhtbCZxdW90Oy8mZ3Q7CisgKiAgICAgICAgJmx0O3N1cHBvcnQgZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlc30mcXVvdDsmZ3Q7CisgKiAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2RlbW9cc21wXCouY2xhc3MmcXVvdDsvJmd0OworICogICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtkZW1vXGhlbHBlclwqLmNsYXNzJnF1b3Q7LyZndDsKKyAqICAgICAgICAgJmx0Oy9zdXBwb3J0Jmd0OworICogICAgICZsdDsvZWpiamFyJmd0OworICo8L1BSRT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBCb3JsYW5kRGVwbG95bWVudFRvb2wgZXh0ZW5kcyBHZW5lcmljRGVwbG95bWVudFRvb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBFeGVjdXRlU3RyZWFtSGFuZGxlciB7CisgICAgLyoqIEJvcmxhbmQgMS4xIGVqYiBpZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0lEX0JPUkxBTkRfRUpCCisgICAgPSAiLS8vSW5wcmlzZSBDb3Jwb3JhdGlvbi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CQVM0NV9FSkIxMV9EVERfTE9DQVRJT04KKyAgICA9ICIvY29tL2lucHJpc2UvajJlZS94bWwvZHRkcy9lamItamFyLmR0ZCI7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JBU19EVERfTE9DQVRJT04KKyAgICA9ICIvY29tL2lucHJpc2UvajJlZS94bWwvZHRkcy9lamItaW5wcmlzZS5kdGQiOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTX0REID0gImVqYi1pbnByaXNlLnhtbCI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVTX0REID0gImVqYi1ib3JsYW5kLnhtbCI7CisKKworICAgIC8qKiBKYXZhMmlpb3AgZXhlY3V0YWJsZSAqKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBMklJT1AgPSAiamF2YTJpaW9wIjsKKworICAgIC8qKiBWZXJpZnkgY2xhc3MgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJJRlkgPSAiY29tLmlucHJpc2UuZWpiLnV0aWwuVmVyaWZ5IjsKKworICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgc3VmZml4IGZvciB0aGUgYm9ybGFuZCBqYXJmaWxlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGphclN1ZmZpeCA9ICItZWpiLmphciI7CisKKyAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBib3JsYW5kIERURCBmaWxlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGJvcmxhbmREVEQ7CisKKyAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRlYnVnIG1vZGUgaXMgb24gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gamF2YTJpaW9wZGVidWcgPSBmYWxzZTsKKworICAgIC8qKiBzdG9yZSBhZGRpdGlvbmFsIHBhcmFtIGZvciBqYXZhMmlpb3AgY29tbWFuZCB1c2VkIHRvIGJ1aWxkIEVKQiBTdHVicyAqLworICAgIHByaXZhdGUgU3RyaW5nIGphdmEyaWlvcGFyYW1zID0gbnVsbDsKKworICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgY2xpZW50IGphciBmaWxlIGlzIGdlbmVyYXRlZCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZWNsaWVudCA9IGZhbHNlOworCisgICAgLyoqIEJvcmxhbmQgRW50ZXJwcmlzZSBTZXJ2ZXIgPSB2ZXJzaW9uIDUgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50ICAgIEJFUyAgICAgICA9IDU7CisgICAgLyoqIEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIG9yIElucHJpc2UgQXBwbGljYXRpb24gU2VydmVyICA9IHZlcnNpb24gNCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgICAgQkFTICAgICAgID0gNDsKKworICAgIC8qKiBib3JsYW5kIGFwcHNlcnZlciB2ZXJzaW9uIDQgb3IgNSAqLworICAgIHByaXZhdGUgaW50IHZlcnNpb24gPSBCQVM7CisKKworICAgIC8qKgorICAgICAqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGl0IGlzIG5lY2Vzc2FyeSB0byB2ZXJpZnkgdGhlCisgICAgICogcHJvZHVjZWQgamFyCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmlmeSAgICAgPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nICB2ZXJpZnlBcmdzID0gIiI7CisKKyAgICBwcml2YXRlIEhhc2h0YWJsZSBnZW5maWxlcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIHNldCB0aGUgZGVidWcgbW9kZSBmb3IgamF2YTJpaW9wIChkZWZhdWx0IGZhbHNlKQorICAgICAqIEBwYXJhbSBkZWJ1ZyB0aGUgc2V0dGluZyB0byB1c2UuCisgICAgICoqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5qYXZhMmlpb3BkZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCB0aGUgdmVyaWZ5ICBtb2RlIGZvciB0aGUgcHJvZHVjZWQgamFyIChkZWZhdWx0IHRydWUpCisgICAgICogQHBhcmFtIHZlcmlmeSB0aGUgc2V0dGluZyB0byB1c2UuCisgICAgICoqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcmlmeShib29sZWFuIHZlcmlmeSkgeworICAgICAgICB0aGlzLnZlcmlmeSA9IHZlcmlmeTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHRlciB1c2VkIHRvIHN0b3JlIHRoZSBzdWZmaXggZm9yIHRoZSBnZW5lcmF0ZWQgYm9ybGFuZCBqYXIgZmlsZS4KKyAgICAgKiBAcGFyYW0gaW5TdHJpbmcgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHN1ZmZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWZmaXgoU3RyaW5nIGluU3RyaW5nKSB7CisgICAgICAgIHRoaXMuamFyU3VmZml4ID0gaW5TdHJpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzZXRzIHNvbWUgYWRkaXRpb25hbCBhcmdzIHRvIHNlbmQgdG8gdmVyaWZ5IGNvbW1hbmQKKyAgICAgKiBAcGFyYW0gYXJncyBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyaWZ5QXJncyhTdHJpbmcgYXJncykgeworICAgICAgICB0aGlzLnZlcmlmeUFyZ3MgPSBhcmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHRlciB1c2VkIHRvIHN0b3JlIHRoZSBsb2NhdGlvbiBvZiB0aGUgYm9ybGFuZCBEVEQuIFRoaXMgY2FuIGJlIGEgZmlsZSBvbiB0aGUgc3lzdGVtCisgICAgICogb3IgYSByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgorICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgRFREIGxvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJBU2R0ZChTdHJpbmcgaW5TdHJpbmcpIHsKKyAgICAgICAgdGhpcy5ib3JsYW5kRFREID0gaW5TdHJpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzZXR0ZXIgdXNlZCB0byBzdG9yZSB3aGV0aGVyIHRoZSB0YXNrIHdpbGwgaW5jbHVkZSB0aGUgZ2VuZXJhdGUgY2xpZW50IHRhc2suCisgICAgICogKHNlZSA6IEJvcmxhbmRHZW5lcmF0ZUNsaWVudCB0YXNrKQorICAgICAqIEBwYXJhbSBiIGlmIHRydWUgZ2VuZXJhdGUgdGhlIGNsaWVudCB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlY2xpZW50KGJvb2xlYW4gYikgeworICAgICAgICB0aGlzLmdlbmVyYXRlY2xpZW50ID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXR0ZXIgdXNlZCB0byBzdG9yZSB0aGUgYm9ybGFuZCBhcHBzZXJ2ZXIgdmVyc2lvbiBbNCBvciA1XQorICAgICAqIEBwYXJhbSB2ZXJzaW9uIGFwcCBzZXJ2ZXIgdmVyc2lvbiA0IG9yIDUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgZmlsbGVkLCB0aGUgcGFyYW1zIGFyZSBhZGRlZCB0byB0aGUgamF2YTJpaW9wIGNvbW1hbmQuCisgICAgICogKGV4OiAtbm9fd2Fybl9taXNzaW5nX2RlZmluZSkKKyAgICAgKiBAcGFyYW0gcGFyYW1zIGFkZGl0aW9uYWwgcGFyYW1zIGZvciBqYXZhMmlpb3AKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhMmlpb3BQYXJhbXMoU3RyaW5nIHBhcmFtcykgeworICAgICAgICB0aGlzLmphdmEyaWlvcGFyYW1zID0gcGFyYW1zOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBib3JsYW5kIGRlc2NyaXB0b3IgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gc3JjRGlyIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIERlc2NyaXB0b3JIYW5kbGVyIGdldEJvcmxhbmREZXNjcmlwdG9ySGFuZGxlcihmaW5hbCBGaWxlIHNyY0RpcikgeworICAgICAgICBEZXNjcmlwdG9ySGFuZGxlciBoYW5kbGVyID0KKyAgICAgICAgICAgIG5ldyBEZXNjcmlwdG9ySGFuZGxlcihnZXRUYXNrKCksIHNyY0RpcikgeworICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5lcXVhbHMoInR5cGUtc3RvcmFnZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmaWxlbmFtZSBvZiB2ZW5kb3Igc3BlY2lmaWMgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZVdpdGhNRVRBID0gY3VycmVudFRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90cmltIHRoZSBNRVRBX0lORlwgb2ZmIG9mIHRoZSBmaWxlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmaWxlTmFtZVdpdGhNRVRBLnN1YnN0cmluZyhNRVRBX0RJUi5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lV2l0aE1FVEEubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZGVzY3JpcHRvckZpbGUgPSBuZXcgRmlsZShzcmNEaXIsIGZpbGVOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChmaWxlTmFtZVdpdGhNRVRBLCBkZXNjcmlwdG9yRmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX0JPUkxBTkRfRUpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmxhbmREVEQgPT0gbnVsbCA/IERFRkFVTFRfQkFTX0RURF9MT0NBVElPTiA6IGJvcmxhbmREVEQpOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENvbmZpZygpLmR0ZExvY2F0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEVqYkphci5EVERMb2NhdGlvbiBkdGRMb2NhdGlvbiA9IChFamJKYXIuRFRETG9jYXRpb24pIGkubmV4dCgpOworICAgICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChkdGRMb2NhdGlvbi5nZXRQdWJsaWNJZCgpLCBkdGRMb2NhdGlvbi5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW55IHZlbmRvciBzcGVjaWZpYyBmaWxlcyB3aGljaCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICogRUpCIEphci4KKyAgICAgKiBAcGFyYW0gZWpiRmlsZXMgdGhlIG1hcCB0byBhZGQgdGhlIGZpbGVzIHRvLgorICAgICAqIEBwYXJhbSBkZFByZWZpeCB0aGUgcHJlZml4IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGUgZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgeworCisgICAgICAgIC8vY2hvb3NlIHRoZSByaWdodCB2ZW5kb3IgREQKKyAgICAgICAgaWYgKCEodmVyc2lvbiA9PSBCRVMgfHwgdmVyc2lvbiA9PSBCQVMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInZlcnNpb24gIiArIHZlcnNpb24gKyAiIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBkZCA9ICh2ZXJzaW9uID09IEJFUyA/IEJFU19ERCA6IEJBU19ERCk7CisKKyAgICAgICAgbG9nKCJ2ZW5kb3IgZmlsZSA6ICIgKyBkZFByZWZpeCArIGRkLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgRmlsZSBib3JsYW5kREQgPSBuZXcgRmlsZShnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyLCBkZFByZWZpeCArIGRkKTsKKyAgICAgICAgaWYgKGJvcmxhbmRERC5leGlzdHMoKSkgeworICAgICAgICAgICAgbG9nKCJCb3JsYW5kIHNwZWNpZmljIGZpbGUgZm91bmQgIiArIGJvcmxhbmRERCwgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgZGQgLCAgYm9ybGFuZEREKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvY2F0ZSBib3JsYW5kIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIgorICAgICAgICAgICAgICAgICsgIkl0IHdhcyBleHBlY3RlZCB0byBiZSBpbiAiCisgICAgICAgICAgICAgICAgKyBib3JsYW5kREQuZ2V0UGF0aCgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVuZG9yIHNwZWNpZmljIG5hbWUgb2YgdGhlIEphciB0aGF0IHdpbGwgYmUgb3V0cHV0LiBUaGUgbW9kaWZpY2F0aW9uIGRhdGUKKyAgICAgKiBvZiB0aGlzIGphciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgZGVwZW5kZW50IGJlYW4gY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBGaWxlIGdldFZlbmRvck91dHB1dEphckZpbGUoU3RyaW5nIGJhc2VOYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShnZXREZXN0RGlyKCksIGJhc2VOYW1lICsgIGphclN1ZmZpeCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoZSBwcm9kdWNlZCBqYXIgZmlsZSBieSBpbnZva2luZyB0aGUgQm9ybGFuZCB2ZXJpZnkgdG9vbAorICAgICAqIEBwYXJhbSBzb3VyY2VKYXIgamF2YS5pby5GaWxlIHJlcHJlc2VudGluZyB0aGUgcHJvZHVjZWQgamFyIGZpbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Qm9ybGFuZEphcihGaWxlIHNvdXJjZUphcikgeworICAgICAgICBpZiAodmVyc2lvbiA9PSBCQVMpIHsKKyAgICAgICAgICAgIHZlcmlmeUJvcmxhbmRKYXJWNChzb3VyY2VKYXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh2ZXJzaW9uID09IEJFUykgeworICAgICAgICAgICAgdmVyaWZ5Qm9ybGFuZEphclY1KHNvdXJjZUphcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJ2ZXJpZnkgamFyIHNraXBwZWQgYmVjYXVzZSB0aGUgdmVyc2lvbiBpcyBpbnZhbGlkIFsiCisgICAgICAgICAgICArIHZlcnNpb24gKyAiXSIsIFByb2plY3QuTVNHX1dBUk4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGUgcHJvZHVjZWQgamFyIGZpbGUgYnkgaW52b2tpbmcgdGhlIEJvcmxhbmQgaWFzdG9vbCB0b29sCisgICAgICogQHBhcmFtIHNvdXJjZUphciBqYXZhLmlvLkZpbGUgcmVwcmVzZW50aW5nIHRoZSBwcm9kdWNlZCBqYXIgZmlsZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlCb3JsYW5kSmFyVjUoRmlsZSBzb3VyY2VKYXIpIHsKKyAgICAgICAgbG9nKCJ2ZXJpZnkgQkVTICIgKyBzb3VyY2VKYXIsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRXhlY1Rhc2sgZXhlY1Rhc2sgPSBudWxsOworICAgICAgICAgICAgZXhlY1Rhc2sgPSBuZXcgRXhlY1Rhc2soZ2V0VGFzaygpKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLnNldERpcihuZXcgRmlsZSgiLiIpKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLnNldEV4ZWN1dGFibGUoImlhc3Rvb2wiKTsKKyAgICAgICAgICAgIC8vY2xhc3NwYXRoCisgICAgICAgICAgICBpZiAoZ2V0Q29tYmluZWRDbGFzc3BhdGgoKSAhPSBudWxsKSAgeworICAgICAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItVkJKY2xhc3NwYXRoIik7CisgICAgICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoZ2V0Q29tYmluZWRDbGFzc3BhdGgoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGphdmEyaWlvcGRlYnVnKSB7CisgICAgICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1kZWJ1ZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi12ZXJpZnkiKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItc3JjIik7CisgICAgICAgICAgICAvLyBlamIgamFyIGZpbGUgdG8gdmVyaWZ5CisgICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShzb3VyY2VKYXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGxvZygiQ2FsbGluZyBpYXN0b29sIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBleGVjVGFzay5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBIYXZlIHRvIGNhdGNoIHRoaXMgYmVjYXVzZSBvZiB0aGUgc2VtYW50aWNzIG9mIGNhbGxpbmcgbWFpbigpCisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nIGdlbmVyYXRlY2xpZW50IERldGFpbHM6ICIKKyAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoZSBwcm9kdWNlZCBqYXIgZmlsZSBieSBpbnZva2luZyB0aGUgQm9ybGFuZCB2ZXJpZnkgdG9vbAorICAgICAqIEBwYXJhbSBzb3VyY2VKYXIgamF2YS5pby5GaWxlIHJlcHJlc2VudGluZyB0aGUgcHJvZHVjZWQgamFyIGZpbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Qm9ybGFuZEphclY0KEZpbGUgc291cmNlSmFyKSB7CisgICAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmEgamF2YVRhc2sgPSBudWxsOworICAgICAgICBsb2coInZlcmlmeSBCQVMgIiArIHNvdXJjZUphciwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIHRyeSAgeworICAgICAgICAgICAgU3RyaW5nIGFyZ3MgPSB2ZXJpZnlBcmdzOworICAgICAgICAgICAgYXJncyArPSAiICIgKyBzb3VyY2VKYXIuZ2V0UGF0aCgpOworCisgICAgICAgICAgICBqYXZhVGFzayA9IG5ldyBKYXZhKGdldFRhc2soKSk7CisgICAgICAgICAgICBqYXZhVGFzay5zZXRUYXNrTmFtZSgidmVyaWZ5Iik7CisgICAgICAgICAgICBqYXZhVGFzay5zZXRDbGFzc25hbWUoVkVSSUZZKTsKKyAgICAgICAgICAgIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZ3VtZW50cyA9IGphdmFUYXNrLmNyZWF0ZUFyZygpOworICAgICAgICAgICAgYXJndW1lbnRzLnNldExpbmUoYXJncyk7CisgICAgICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IGdldENvbWJpbmVkQ2xhc3NwYXRoKCk7CisgICAgICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpICB7CisgICAgICAgICAgICAgICAgamF2YVRhc2suc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aCk7CisgICAgICAgICAgICAgICAgamF2YVRhc2suc2V0Rm9yayh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9nKCJDYWxsaW5nICIgKyBWRVJJRlkgKyAiIGZvciAiICsgc291cmNlSmFyLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBqYXZhVGFzay5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL1RPIERPIDogZGVsZXRlIHRoZSBmaWxlIGlmIGl0IGlzIG5vdCBhIHZhbGlkIGZpbGUuCisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nICIgKyBWRVJJRlkgKyAiIERldGFpbHM6ICIKKyAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgY2xpZW50IGphciBjb3JyZXNwb25kaW5nIHRvIHRoZSBqYXIgZmlsZSBwYXNzZWQgYXMgcGFyYW1ldGVyCisgICAgICogdGhlIG1ldGhvZCB1c2VzIHRoZSBCb3JsYW5kR2VuZXJhdGVDbGllbnQgdGFzay4KKyAgICAgKiBAcGFyYW0gc291cmNlSmFyIGphdmEuaW8uRmlsZSByZXByZXNlbnRpbmcgdGhlIHByb2R1Y2VkIGphciBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ2xpZW50KEZpbGUgc291cmNlSmFyKSB7CisgICAgICAgIGdldFRhc2soKS5nZXRQcm9qZWN0KCkuYWRkVGFza0RlZmluaXRpb24oImludGVybmFsX2Jhc19nZW5lcmF0ZWNsaWVudCIsCisgICAgICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuQm9ybGFuZEdlbmVyYXRlQ2xpZW50LmNsYXNzKTsKKworICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuQm9ybGFuZEdlbmVyYXRlQ2xpZW50IGdlbnRhc2sgPSBudWxsOworICAgICAgICBsb2coImdlbmVyYXRlIGNsaWVudCBmb3IgIiArIHNvdXJjZUphciwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBnZXRUYXNrKCkuZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgZ2VudGFzaworICAgICAgICAgICAgICAgID0gKEJvcmxhbmRHZW5lcmF0ZUNsaWVudCkgcHJvamVjdC5jcmVhdGVUYXNrKCJpbnRlcm5hbF9iYXNfZ2VuZXJhdGVjbGllbnQiKTsKKyAgICAgICAgICAgIGdlbnRhc2suc2V0RWpiamFyKHNvdXJjZUphcik7CisgICAgICAgICAgICBnZW50YXNrLnNldERlYnVnKGphdmEyaWlvcGRlYnVnKTsKKyAgICAgICAgICAgIFBhdGggY2xhc3NwYXRoID0gZ2V0Q29tYmluZWRDbGFzc3BhdGgoKTsKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGdlbnRhc2suc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW50YXNrLnNldFZlcnNpb24odmVyc2lvbik7CisgICAgICAgICAgICBnZW50YXNrLnNldFRhc2tOYW1lKCJnZW5lcmF0ZSBjbGllbnQiKTsKKyAgICAgICAgICAgIGdlbnRhc2suZXhlY3V0ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9UTyBETyA6IGRlbGV0ZSB0aGUgZmlsZSBpZiBpdCBpcyBub3QgYSB2YWxpZCBmaWxlLgorICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyAiICsgVkVSSUZZICsgIiBEZXRhaWxzOiAiCisgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHN0dWJzICYgc2tlbGV0b24gZm9yIGVhY2ggaG9tZSBmb3VuZCBpbnRvIHRoZSBERAorICAgICAqIEFkZCBhbGwgdGhlIGdlbmVyYXRlIGNsYXNzIGZpbGUgaW50byB0aGUgZWpiIGZpbGVzCisgICAgICogQHBhcmFtIGl0aG9tZXMgOiBpdGVyYXRvciBvbiBob21lIGNsYXNzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkQm9ybGFuZFN0dWJzKEl0ZXJhdG9yIGl0aG9tZXMpIHsKKyAgICAgICAgRXhlY3V0ZSBleGVjVGFzayA9IG51bGw7CisKKyAgICAgICAgZXhlY1Rhc2sgPSBuZXcgRXhlY3V0ZSh0aGlzKTsKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFzaygpLmdldFByb2plY3QoKTsKKyAgICAgICAgZXhlY1Rhc2suc2V0QW50UnVuKHByb2plY3QpOworICAgICAgICBleGVjVGFzay5zZXRXb3JraW5nRGlyZWN0b3J5KHByb2plY3QuZ2V0QmFzZURpcigpKTsKKworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kbGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBjb21tYW5kbGluZS5zZXRFeGVjdXRhYmxlKEpBVkEySUlPUCk7CisgICAgICAgIC8vZGVidWcgPworICAgICAgICBpZiAoamF2YTJpaW9wZGVidWcpIHsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1WQkpkZWJ1ZyIpOworICAgICAgICB9CisgICAgICAgIC8vc2V0IHRoZSBjbGFzc3BhdGgKKyAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLVZCSmNsYXNzcGF0aCIpOworICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoZ2V0Q29tYmluZWRDbGFzc3BhdGgoKSk7CisgICAgICAgIC8vbGlzdCBmaWxlCisgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1saXN0X2ZpbGVzIik7CisgICAgICAgIC8vbm8gVElFIGNsYXNzZXMKKyAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW5vX3RpZSIpOworCisgICAgICAgIGlmIChqYXZhMmlpb3BhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2coImFkZGl0aW9uYWwgICIgKyBqYXZhMmlpb3BhcmFtcyArICIgdG8gamF2YTJpaW9wICIsIDApOworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShqYXZhMmlpb3BhcmFtcyk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vcm9vdCBkaXIKKyAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXJvb3RfZGlyIik7CisgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29uZmlnKCkuc3JjRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgLy9jb21waWxpbmcgb3JkZXIKKyAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWNvbXBpbGUiKTsKKyAgICAgICAgLy9hZGQgdGhlIGhvbWUgY2xhc3MKKyAgICAgICAgd2hpbGUgKGl0aG9tZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGl0aG9tZXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZygiQ2FsbGluZyBqYXZhMmlpb3AiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGxvZyhjb21tYW5kbGluZS5kZXNjcmliZUNvbW1hbmQoKSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgZXhlY1Rhc2suc2V0Q29tbWFuZGxpbmUoY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gZXhlY1Rhc2suZXhlY3V0ZSgpOworICAgICAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmcgamF2YTJpaW9wIChyZXQgY29kZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICsgcmVzdWx0ICsgIikiOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldFRhc2soKS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coImphdmEyaWlvcCBleGNlcHRpb24gOiIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRUYXNrKCkuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgd3JpdGluZyBvZiB0aGUgSkFSIGZpbGUuIEl0ZXJhdGVzIG92ZXIgdGhlCisgICAgICogZmlsZW5hbWVzL2phdmEuaW8uRmlsZXMgaW4gdGhlIEhhc2h0YWJsZSBzdG9yZWQgb24gdGhlIGluc3RhbmNlIHZhcmlhYmxlCisgICAgICogZWpiRmlsZXMuCisgICAgICogQHBhcmFtIGJhc2VOYW1lIHRoZSBiYXNlIG5hbWUuCisgICAgICogQHBhcmFtIGphckZpbGUgIHRoZSBqYXIgZmlsZSB0byB3cml0ZSB0by4KKyAgICAgKiBAcGFyYW0gZmlsZXMgICAgdGhlIGZpbGVzIHRvIHdyaXRlIHRvIHRoZSBqYXIuCisgICAgICogQHBhcmFtIHB1YmxpY0lkIHRoZSBpZCB0byB1c2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUphcihTdHJpbmcgYmFzZU5hbWUsIEZpbGUgamFyRmlsZSwgSGFzaHRhYmxlIGZpbGVzLCBTdHJpbmcgcHVibGljSWQpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vYnVpbGQgdGhlIGhvbWUgY2xhc3NlcyBsaXN0LgorICAgICAgICBWZWN0b3IgaG9tZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gZmlsZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXp6ID0gKFN0cmluZykgaXQubmV4dCgpOworICAgICAgICAgICAgaWYgKGNsYXp6LmVuZHNXaXRoKCJIb21lLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICAvL3JlbW92ZSAuY2xhc3MgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgU3RyaW5nIGhvbWUgPSB0b0NsYXNzKGNsYXp6KTsKKyAgICAgICAgICAgICAgICBob21lcy5hZGQoaG9tZSk7CisgICAgICAgICAgICAgICAgbG9nKCIgSG9tZSAiICsgaG9tZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWlsZEJvcmxhbmRTdHVicyhob21lcy5pdGVyYXRvcigpKTsKKworICAgICAgICAvL2FkZCB0aGUgZ2VuIGZpbGVzIHRvIHRoZSBjb2xsZWN0aW9uCisgICAgICAgIGZpbGVzLnB1dEFsbChnZW5maWxlcyk7CisKKyAgICAgICAgc3VwZXIud3JpdGVKYXIoYmFzZU5hbWUsIGphckZpbGUsIGZpbGVzLCBwdWJsaWNJZCk7CisKKyAgICAgICAgaWYgKHZlcmlmeSkgeworICAgICAgICAgICAgdmVyaWZ5Qm9ybGFuZEphcihqYXJGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZW5lcmF0ZWNsaWVudCkgeworICAgICAgICAgICAgZ2VuZXJhdGVDbGllbnQoamFyRmlsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb252ZXJ0IGEgY2xhc3MgZmlsZSBuYW1lIDogQS9CL0MvdG90by5jbGFzcworICAgICAqIGludG8gICAgYSBjbGFzcyBuYW1lOiBBLkIuQy50b3RvCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9DbGFzcyhTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgLy9yZW1vdmUgdGhlIC5jbGFzcworICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSk7CisgICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS5yZXBsYWNlKCdcXCcsICcuJyk7CisgICAgICAgIHJldHVybiBjbGFzc25hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29udmVydCBhIGZpbGUgbmFtZSA6IEEvQi9DL3RvdG8uamF2YQorICAgICAqIGludG8gICAgYSBjbGFzcyBuYW1lOiBBL0IvQy90b3RvLmNsYXNzCisgICAgICovCisgICAgcHJpdmF0ZSAgU3RyaW5nIHRvQ2xhc3NGaWxlKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICAvL3JlbW92ZSB0aGUgLmNsYXNzCisgICAgICAgIFN0cmluZyBjbGFzc2ZpbGUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGFzdEluZGV4T2YoIi5qYXZhIikpOworICAgICAgICBjbGFzc2ZpbGUgPSBjbGFzc2ZpbGUgKyAiLmNsYXNzIjsKKyAgICAgICAgcmV0dXJuIGNsYXNzZmlsZTsKKyAgICB9CisKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlU3RyZWFtSGFuZGxlciBpbnRlcmZhY2UKKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uICB7IH0KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgIHsgIH0KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzSW5wdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHBhcmFtMSkgdGhyb3dzIElPRXhjZXB0aW9uICAgeyB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG91dHB1dCBzdHJlYW0gb2YgdGhlIHByb2Nlc3MuCisgICAgICogQHBhcmFtIGlzIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzT3V0cHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOworICAgICAgICAgICAgU3RyaW5nIGphdmFmaWxlOworICAgICAgICAgICAgd2hpbGUgKChqYXZhZmlsZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGphdmFmaWxlLmVuZHNXaXRoKCIuamF2YSIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc2ZpbGUgPSB0b0NsYXNzRmlsZShqYXZhZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBjbGFzc2ZpbGUuc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnKCkuc3JjRGlyLmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGdlbmZpbGVzLnB1dChrZXksIG5ldyBGaWxlKGNsYXNzZmlsZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgcGFyc2luZyAgamF2YTJpaW9wIG91dHB1dC4gRGV0YWlsczogIiArIGUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlcnJvciBzdHJlYW0gb2YgdGhlIHByb2Nlc3MuCisgICAgICogQHBhcmFtIGlzIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzRXJyb3JTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKKyAgICAgICAgU3RyaW5nIHMgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJbamF2YTJpaW9wXSAiICsgcywgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0JvcmxhbmRHZW5lcmF0ZUNsaWVudC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0JvcmxhbmRHZW5lcmF0ZUNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MmYxN2EKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvQm9ybGFuZEdlbmVyYXRlQ2xpZW50LmphdmEKQEAgLTAsMCArMSwzMTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKKworLyoqCisgKiBHZW5lcmF0ZXMgYSBCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciA0LjUgY2xpZW50IEpBUiB1c2luZyBhcworICogaW5wdXQgdGhlIEVKQiBKQVIgZmlsZS4KKyAqCisgKiBUd28gbW9kZSBhcmUgYXZhaWxhYmxlOiBqYXZhIG1vZGUgKGRlZmF1bHQpIGFuZCBmb3JrIG1vZGUuIFdpdGggdGhlIGZvcmsgbW9kZSwKKyAqIGl0IGlzIGltcG9zc2libGUgdG8gYWRkIGNsYXNzcGF0aCB0byB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIEBhbnQudGFzayBuYW1lPSJibGdlbmNsaWVudCIgY2F0ZWdvcnk9ImVqYiIKKyAqLworcHVibGljIGNsYXNzIEJvcmxhbmRHZW5lcmF0ZUNsaWVudCBleHRlbmRzIFRhc2sgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9NT0RFID0gImphdmEiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SS19NT0RFID0gImZvcmsiOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKiogZGVidWcgdGhlIGdlbmVyYXRlY2xpZW50IHRhc2sgKi8KKyAgICBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKyAgICAvKiogaG9sZCB0aGUgZWpiamFyIGZpbGUgbmFtZSAqLworICAgIEZpbGUgZWpiamFyZmlsZSA9IG51bGw7CisKKyAgICAvKiogaG9sZCB0aGUgY2xpZW50IGphciBmaWxlIG5hbWUgKi8KKyAgICBGaWxlIGNsaWVudGphcmZpbGUgPSBudWxsOworCisgICAgLyoqIGhvbGQgdGhlIGNsYXNzcGF0aCAqLworICAgIFBhdGggY2xhc3NwYXRoOworCisgICAgLyoqIGhvbGQgdGhlIG1vZGUgKGphdmF8Zm9yaykgKi8KKyAgICBTdHJpbmcgbW9kZSA9IEZPUktfTU9ERTsKKworICAgIC8qKiBob2xkIHRoZSB2ZXJzaW9uICovCisgICAgaW50IHZlcnNpb24gPSBCb3JsYW5kRGVwbG95bWVudFRvb2wuQkFTOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZlcnNpb24gYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbikgeworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1hbmQgbGF1bmNoaW5nIG1vZGU6IGphdmEgb3IgZm9yay4KKyAgICAgKiBAcGFyYW0gcyB0aGUgbW9kZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgcykgeworICAgICAgICBtb2RlID0gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB0dXJuIG9uIHRoZSBkZWJ1ZyBtb2RlIGZvciBlYWNoIG9mIHRoZSBCb3JsYW5kIHRvb2xzIGxhdW5jaGVkLgorICAgICAqIEBwYXJhbSBkZWJ1ZyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVKQiBKQVIgZmlsZS4KKyAgICAgKiBAcGFyYW0gZWpiZmlsZSB0aGUgZmlsZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWpiamFyKEZpbGUgZWpiZmlsZSkgeworICAgICAgICBlamJqYXJmaWxlID0gZWpiZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGllbnQgSkFSIGZpbGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gY2xpZW50amFyIHRoZSBmaWxlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRqYXIoRmlsZSBjbGllbnRqYXIpIHsKKyAgICAgICAgY2xpZW50amFyZmlsZSA9IGNsaWVudGphcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXRoIHRvIHVzZSBmb3IgY2xhc3NwYXRoLgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggdGhlIHBhdGggdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgcGF0aCB0byB0aGUgY2xhc3NwYXRoLgorICAgICAqIEByZXR1cm4gYSBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWZlcmVuY2UgdG8gZXhpc3RpbmcgcGF0aCwgdG8gdXNlIGFzIGEgY2xhc3NwYXRoLgorICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERvIHRoZSB3b3JrLgorICAgICAqCisgICAgICogVGhlIHdvcmsgaXMgYWN0dWFsbHkgZG9uZSBieSBjcmVhdGluZyBhIHNlcGFyYXRlIEpWTSB0byBydW4gYSBqYXZhIHRhc2suCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlamJqYXJmaWxlID09IG51bGwgfHwgZWpiamFyZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImludmFsaWQgZWpiIGphciBmaWxlLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsaWVudGphcmZpbGUgPT0gbnVsbCB8fCBjbGllbnRqYXJmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGxvZygiaW52YWxpZCBvciBtaXNzaW5nIGNsaWVudCBqYXIgZmlsZS4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIFN0cmluZyBlamJqYXJuYW1lID0gZWpiamFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIC8vY2xpZW50bmFtZSA9IGVqYmphcmZpbGUrY2xpZW50LmphcgorICAgICAgICAgICAgU3RyaW5nIGNsaWVudG5hbWUgPSBlamJqYXJuYW1lLnN1YnN0cmluZygwLCBlamJqYXJuYW1lLmxhc3RJbmRleE9mKCIuIikpOworICAgICAgICAgICAgY2xpZW50bmFtZSA9IGNsaWVudG5hbWUgKyAiY2xpZW50LmphciI7CisgICAgICAgICAgICBjbGllbnRqYXJmaWxlID0gbmV3IEZpbGUoY2xpZW50bmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobW9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2coIm1vZGUgaXMgbnVsbCBkZWZhdWx0IG1vZGUgIGlzIGphdmEiKTsKKyAgICAgICAgICAgIHNldE1vZGUoSkFWQV9NT0RFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKHZlcnNpb24gPT0gQm9ybGFuZERlcGxveW1lbnRUb29sLkJFUworICAgICAgICAgICAgfHwgdmVyc2lvbiA9PSBCb3JsYW5kRGVwbG95bWVudFRvb2wuQkFTKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ2ZXJzaW9uICIgKyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKworICAgICAgICBsb2coImNsaWVudCBqYXIgZmlsZSBpcyAiICsgY2xpZW50amFyZmlsZSk7CisKKyAgICAgICAgaWYgKG1vZGUuZXF1YWxzSWdub3JlQ2FzZShGT1JLX01PREUpKSB7CisgICAgICAgICAgICBleGVjdXRlRm9yaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhlY3V0ZUphdmEoKTsKKyAgICAgICAgfSAvLyBlbmQgb2YgZWxzZQorICAgIH0KKworICAgIC8qKgorICAgICAqIGxhdW5jaCB0aGUgZ2VuZXJhdGUgY2xpZW50IHVzaW5nIGphdmEgYXBpLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUphdmEoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gQm9ybGFuZERlcGxveW1lbnRUb29sLkJFUykgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImphdmEgbW9kZSBpcyBzdXBwb3J0ZWQgb25seSBmb3IgIgorICAgICAgICAgICAgICAgICAgICArICJwcmV2aW91cyB2ZXJzaW9uIDw9IiArIEJvcmxhbmREZXBsb3ltZW50VG9vbC5CQVMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2coIm1vZGUgOiBqYXZhIik7CisKKyAgICAgICAgICAgIEphdmEgZXhlY1Rhc2sgPSBudWxsOworICAgICAgICAgICAgZXhlY1Rhc2sgPSBuZXcgSmF2YSh0aGlzKTsKKworICAgICAgICAgICAgZXhlY1Rhc2suc2V0RGlyKG5ldyBGaWxlKCIuIikpOworICAgICAgICAgICAgZXhlY1Rhc2suc2V0Q2xhc3NuYW1lKCJjb20uaW5wcmlzZS5zZXJ2ZXIuY29tbWFuZGxpbmUuRUpCVXRpbGl0aWVzIik7CisgICAgICAgICAgICAvL2NsYXNzcGF0aAorICAgICAgICAgICAgLy9hZGQgYXQgdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoCisgICAgICAgICAgICAvL3RoZSBzeXN0ZW0gY2xhc3NwYXRoIGluIG9yZGVyIHRvIGZpbmQgdGhlIHRvb2xzLmphciBmaWxlCisgICAgICAgICAgICBleGVjVGFzay5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgpKTsKKworICAgICAgICAgICAgZXhlY1Rhc2suc2V0Rm9yayh0cnVlKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCJnZW5lcmF0ZWNsaWVudCIpOworICAgICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi10cmFjZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLXNob3J0Iik7CisgICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWphcmZpbGUiKTsKKyAgICAgICAgICAgIC8vIGVqYiBqYXIgZmlsZQorICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoZWpiamFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAvL2NsaWVudCBqYXIgZmlsZQorICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1zaW5nbGUiKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItY2xpZW50amFyZmlsZSIpOworICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoY2xpZW50amFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgICAgIGxvZygiQ2FsbGluZyBFSkJVdGlsaXRpZXMiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLmV4ZWN1dGUoKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSGF2ZSB0byBjYXRjaCB0aGlzIGJlY2F1c2Ugb2YgdGhlIHNlbWFudGljcyBvZiBjYWxsaW5nIG1haW4oKQorICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBnZW5lcmF0ZWNsaWVudCBEZXRhaWxzOiAiICsgZS50b1N0cmluZygpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsYXVuY2ggdGhlIGdlbmVyYXRlIGNsaWVudCB1c2luZyBzeXN0ZW0gYXBpLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkICB2b2lkIGV4ZWN1dGVGb3JrKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gQm9ybGFuZERlcGxveW1lbnRUb29sLkJBUykgeworICAgICAgICAgICAgZXhlY3V0ZUZvcmtWNCgpOworICAgICAgICB9CisgICAgICAgIGlmICh2ZXJzaW9uID09IEJvcmxhbmREZXBsb3ltZW50VG9vbC5CRVMpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVGb3JrVjUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGxhdW5jaCB0aGUgZ2VuZXJhdGUgY2xpZW50IHVzaW5nIHN5c3RlbSBhcGkuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgIHZvaWQgZXhlY3V0ZUZvcmtWNCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIGxvZygibW9kZSA6IGZvcmsgIiArIEJvcmxhbmREZXBsb3ltZW50VG9vbC5CQVMsIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICAgICAgRXhlY1Rhc2sgZXhlY1Rhc2sgPSBuZXcgRXhlY1Rhc2sodGhpcyk7CisKKyAgICAgICAgICAgIGV4ZWNUYXNrLnNldERpcihuZXcgRmlsZSgiLiIpKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLnNldEV4ZWN1dGFibGUoImlhc3Rvb2wiKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCJnZW5lcmF0ZWNsaWVudCIpOworICAgICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi10cmFjZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLXNob3J0Iik7CisgICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWphcmZpbGUiKTsKKyAgICAgICAgICAgIC8vIGVqYiBqYXIgZmlsZQorICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoZWpiamFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAvL2NsaWVudCBqYXIgZmlsZQorICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1zaW5nbGUiKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItY2xpZW50amFyZmlsZSIpOworICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoY2xpZW50amFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgICAgIGxvZygiQ2FsbGluZyBpYXN0b29sIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBleGVjVGFzay5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBIYXZlIHRvIGNhdGNoIHRoaXMgYmVjYXVzZSBvZiB0aGUgc2VtYW50aWNzIG9mIGNhbGxpbmcgbWFpbigpCisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nIGdlbmVyYXRlY2xpZW50IERldGFpbHM6ICIKKyAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsYXVuY2ggdGhlIGdlbmVyYXRlIGNsaWVudCB1c2luZyBzeXN0ZW0gYXBpLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkICB2b2lkIGV4ZWN1dGVGb3JrVjUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nKCJtb2RlIDogZm9yayAiICsgQm9ybGFuZERlcGxveW1lbnRUb29sLkJFUywgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgRXhlY1Rhc2sgZXhlY1Rhc2sgPSBuZXcgRXhlY1Rhc2sodGhpcyk7CisKKyAgICAgICAgICAgIGV4ZWNUYXNrLnNldERpcihuZXcgRmlsZSgiLiIpKTsKKworICAgICAgICAgICAgZXhlY1Rhc2suc2V0RXhlY3V0YWJsZSgiaWFzdG9vbCIpOworICAgICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1kZWJ1ZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1nZW5jbGllbnQiKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItamFycyIpOworICAgICAgICAgICAgLy8gZWpiIGphciBmaWxlCisgICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShlamJqYXJmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIC8vY2xpZW50IGphciBmaWxlCisgICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLXRhcmdldCIpOworICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoY2xpZW50amFyZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAvL2NsYXNzcGF0aAorICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1jcCIpOworICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoY2xhc3NwYXRoLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgbG9nKCJDYWxsaW5nIGlhc3Rvb2wiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGV4ZWNUYXNrLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEhhdmUgdG8gY2F0Y2ggdGhpcyBiZWNhdXNlIG9mIHRoZSBzZW1hbnRpY3Mgb2YgY2FsbGluZyBtYWluKCkKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIHdoaWxlIGNhbGxpbmcgZ2VuZXJhdGVjbGllbnQgRGV0YWlsczogIgorICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0Rlc2NyaXB0b3JIYW5kbGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRGVzY3JpcHRvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODM5MjYwNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9EZXNjcmlwdG9ySGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogSW5uZXIgY2xhc3MgdXNlZCBieSBFamJKYXIgdG8gZmFjaWxpdGF0ZSB0aGUgcGFyc2luZyBvZiBkZXBsb3ltZW50CisgKiBkZXNjcmlwdG9ycyBhbmQgdGhlIGNhcHR1cmUgb2YgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24uIEV4dGVuZHMKKyAqIEhhbmRsZXJCYXNlIHNvIGl0IG9ubHkgaW1wbGVtZW50cyB0aGUgbWV0aG9kcyBuZWVkZWQuIER1cmluZyBwYXJzaW5nCisgKiBjcmVhdGVzIGEgaGFzaHRhYmxlIGNvbnNpc3Rpbmcgb2YgZW50cmllcyBtYXBwaW5nIHRoZSBuYW1lIGl0IHNob3VsZCBiZQorICogaW5zZXJ0ZWQgaW50byBhbiBFSkIgamFyIGFzIHRvIGEgRmlsZSByZXByZXNlbnRpbmcgdGhlIGZpbGUgb24gZGlzay4gVGhpcworICogbGlzdCBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBnZXRGaWxlcygpIG1ldGhvZC4KKyAqLworcHVibGljIGNsYXNzIERlc2NyaXB0b3JIYW5kbGVyIGV4dGVuZHMgb3JnLnhtbC5zYXguSGFuZGxlckJhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hBU0hfVEFCTEVfU0laRSA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9MT09LSU5HX0VKQkpBUiA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOX0VKQkpBUiA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOX0JFQU5TID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU5fU0VTU0lPTiA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOX0VOVElUWSA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOX01FU1NBR0UgPSA2OworCisgICAgcHJpdmF0ZSBUYXNrIG93bmluZ1Rhc2s7CisKKyAgICBwcml2YXRlIFN0cmluZyBwdWJsaWNJZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBCdW5jaCBvZiBjb25zdGFudHMgdXNlZCBmb3Igc3RvcmluZyBlbnRyaWVzIGluIGEgaGFzaHRhYmxlLCBhbmQgZm9yCisgICAgICogY29uc3RydWN0aW5nIHRoZSBmaWxlbmFtZXMgb2YgdmFyaW91cyBwYXJ0cyBvZiB0aGUgZWpiIGphci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1JFRiAgICAgICAgICAgICAgID0gImVqYi1yZWYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTE9DQUxfUkVGICAgICAgICAgPSAiZWpiLWxvY2FsLXJlZiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTUVfSU5URVJGQUNFICAgICAgICA9ICJob21lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0lOVEVSRkFDRSAgICAgID0gInJlbW90ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0hPTUVfSU5URVJGQUNFICA9ICJsb2NhbC1ob21lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfSU5URVJGQUNFICAgICAgID0gImxvY2FsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9DTEFTUyAgICAgICAgICAgID0gImVqYi1jbGFzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0NMQVNTICAgICAgICAgICAgICA9ICJwcmltLWtleS1jbGFzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9OQU1FICAgICAgICAgICAgICA9ICJlamItbmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9KQVIgICAgICAgICAgICAgICA9ICJlamItamFyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5URVJQUklTRV9CRUFOUyAgICAgID0gImVudGVycHJpc2UtYmVhbnMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQkVBTiAgICAgICAgICAgPSAiZW50aXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9CRUFOICAgICAgICAgID0gInNlc3Npb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0JFQU4gICAgICAgICAgPSAibWVzc2FnZS1kcml2ZW4iOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXRlIG9mIHRoZSBwYXJzaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcGFyc2VTdGF0ZSA9IFNUQVRFX0xPT0tJTkdfRUpCSkFSOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSB2YXJpYWJsZSB1c2VkIHRvIHN0b3JlIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcKKyAgICAgKiBwcm9jZXNzZWQgYnkgdGhlIFNBWCBwYXJzZXIuICBBY2Nlc3NlZCBieSB0aGUgU0FYIHBhcnNlciBjYWxsLWJhY2sgbWV0aG9kcworICAgICAqIHN0YXJ0RWxlbWVudCgpIGFuZCBlbmRFbGVtZW50KCkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50RWxlbWVudCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBvZiB0aGUgY3VycmVudCBlbGVtZW50CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50VGV4dCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIGFzIHRoZXkgd2lsbCBiZQorICAgICAqIHB1dCBpbnRvIHRoZSBqYXIgZmlsZSwgbWFwcGVkIHRvIEZpbGUgb2JqZWN0cyAgQWNjZXNzZWQgYnkgdGhlIFNBWAorICAgICAqIHBhcnNlciBjYWxsLWJhY2sgbWV0aG9kIGNoYXJhY3RlcnMoKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGVqYkZpbGVzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgJmx0O2VqYi1uYW1lJmd0OyBlbGVtZW50CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBlamJOYW1lID0gbnVsbDsKKworICAgIHByaXZhdGUgSGFzaHRhYmxlIGZpbGVEVERzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgcHJpdmF0ZSBIYXNodGFibGUgcmVzb3VyY2VEVERzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgcHJpdmF0ZSBib29sZWFuIGluRUpCUmVmID0gZmFsc2U7CisKKyAgICBwcml2YXRlIEhhc2h0YWJsZSB1cmxEVERzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGJlYW4gY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4gVGhpcyBpcworICAgICAqIHVzZWQgZm9yIHBlcmZvcm1pbmcgZGVwZW5kZW5jeSBmaWxlIGxvb2t1cHMuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHNyY0RpcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBEZXNjcmlwdG9ySGFuZGxlci4KKyAgICAgKiBAcGFyYW0gdGFzayB0aGUgdGFzayB0aGF0IG93bnMgdGhpcyBkZXNjaXB0b3IKKyAgICAgKiBAcGFyYW0gc3JjRGlyIHRoZSBzb3VyY2UgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIERlc2NyaXB0b3JIYW5kbGVyKFRhc2sgdGFzaywgRmlsZSBzcmNEaXIpIHsKKyAgICAgICAgdGhpcy5vd25pbmdUYXNrID0gdGFzazsKKyAgICAgICAgdGhpcy5zcmNEaXIgPSBzcmNEaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBkdGQgd2l0aCBhIGxvY2F0aW9uLgorICAgICAqIFRoZSBsb2NhdGlvbiBpcyBvbmUgb2YgYSBmaWxlbmFtZSwgYSByZXNvdXJjZSBuYW1lIGluIHRoZSBjbGFzc3BhdGgsIG9yCisgICAgICogYSBVUkwuCisgICAgICogQHBhcmFtIHB1YmxpY0lkIHRoZSBwdWJsaWMgaWRlbnRpdHkgb2YgdGhlIGR0ZAorICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGR0ZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRFREKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGZpbGVEVEQgPSBuZXcgRmlsZShsb2NhdGlvbik7CisgICAgICAgIGlmICghZmlsZURURC5leGlzdHMoKSkgeworICAgICAgICAgICAgLy8gcmVzb2x2ZSByZWxhdGl2ZSB0byBwcm9qZWN0IGJhc2VkaXIKKyAgICAgICAgICAgIGZpbGVEVEQgPSBvd25pbmdUYXNrLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZShsb2NhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsZURURC5leGlzdHMoKSkgeworICAgICAgICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaWxlRFREcy5wdXQocHVibGljSWQsIGZpbGVEVEQpOworICAgICAgICAgICAgICAgIG93bmluZ1Rhc2subG9nKCJNYXBwZWQgcHVibGljSWQgIiArIHB1YmxpY0lkICsgIiB0byBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWxlRFRELCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRDbGFzcygpLmdldFJlc291cmNlKGxvY2F0aW9uKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc291cmNlRFREcy5wdXQocHVibGljSWQsIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBvd25pbmdUYXNrLmxvZygiTWFwcGVkIHB1YmxpY0lkICIgKyBwdWJsaWNJZCArICIgdG8gcmVzb3VyY2UgIgorICAgICAgICAgICAgICAgICAgICArIGxvY2F0aW9uLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFVSTCB1cmxkdGQgPSBuZXcgVVJMKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB1cmxEVERzLnB1dChwdWJsaWNJZCwgdXJsZHRkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vaWdub3JlZAorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHRoZSBlbnRpdHkuCisgICAgICogQHNlZSBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KFN0cmluZywgU3RyaW5nKS4KKyAgICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIHB1YmxpYyBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICBpZiBub25lIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZGVudGlmaWVyIHByb3ZpZGVkIGluIHRoZSBYTUwKKyAgICAgKiAgICAgICAgICAgICAgICAgZG9jdW1lbnQuIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEByZXR1cm4gYW4gaW5wdXRzb3VyY2UgZm9yIHRoaXMgaWRlbnRpZmllcgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKKworICAgICAgICBGaWxlIGR0ZEZpbGUgPSAoRmlsZSkgZmlsZURURHMuZ2V0KHB1YmxpY0lkKTsKKyAgICAgICAgaWYgKGR0ZEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvd25pbmdUYXNrLmxvZygiUmVzb2x2ZWQgIiArIHB1YmxpY0lkICsgIiB0byBsb2NhbCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgKyBkdGRGaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZHRkRmlsZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZHRkUmVzb3VyY2VOYW1lID0gKFN0cmluZykgcmVzb3VyY2VEVERzLmdldChwdWJsaWNJZCk7CisgICAgICAgIGlmIChkdGRSZXNvdXJjZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShkdGRSZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvd25pbmdUYXNrLmxvZygiUmVzb2x2ZWQgIiArIHB1YmxpY0lkICsgIiB0byBsb2NhbCByZXNvdXJjZSAiCisgICAgICAgICAgICAgICAgICAgICsgZHRkUmVzb3VyY2VOYW1lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFVSTCBkdGRVcmwgPSAoVVJMKSB1cmxEVERzLmdldChwdWJsaWNJZCk7CisgICAgICAgIGlmIChkdGRVcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGR0ZFVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgb3duaW5nVGFzay5sb2coIlJlc29sdmVkICIgKyBwdWJsaWNJZCArICIgdG8gdXJsICIKKyAgICAgICAgICAgICAgICAgICAgKyBkdGRVcmwsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoaXMpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG93bmluZ1Rhc2subG9nKCJDb3VsZCBub3QgcmVzb2x2ZSAoIHB1YmxpY0lkOiAiICsgcHVibGljSWQKKyAgICAgICAgICAgICsgIiwgc3lzdGVtSWQ6ICIgKyBzeXN0ZW1JZCArICIpIHRvIGEgbG9jYWwgZW50aXR5IiwgUHJvamVjdC5NU0dfSU5GTyk7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0dGVyIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHNldCBvZiBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBFSkIgamFyLgorICAgICAqIEByZXR1cm4gdGhlIG1hcCBvZiBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0RmlsZXMoKSB7CisgICAgICAgIHJldHVybiAoZWpiRmlsZXMgPT0gbnVsbCkgPyBuZXcgSGFzaHRhYmxlKCkgOiBlamJGaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHB1YmxpY0lkIG9mIHRoZSBEVEQKKyAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgeworICAgICAgICByZXR1cm4gcHVibGljSWQ7CisgICAgfQorCisgICAgIC8qKgorICAgICAqIEdldHRlciBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJmx0O2VqYi1uYW1lJmd0OyBlbGVtZW50LgorICAgICAqIEByZXR1cm4gdGhlIGVqYiBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFamJOYW1lKCkgeworICAgICAgICByZXR1cm4gZWpiTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTQVggcGFyc2VyIGNhbGwtYmFjayBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHZhbHVlcyBvZiBzb21lCisgICAgICogaW5zdGFuY2UgdmFyaWFibGVzIHRvIGVuc3VyZSBzYWZlIG9wZXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5lamJGaWxlcyA9IG5ldyBIYXNodGFibGUoREVGQVVMVF9IQVNIX1RBQkxFX1NJWkUsIDEpOworICAgICAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgaW5FSkJSZWYgPSBmYWxzZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNBWCBwYXJzZXIgY2FsbC1iYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgd2hlbiBhIG5ldyBlbGVtZW50IGlzIGVudGVyZWQKKyAgICAgKiBpbnRvLiAgVXNlZCB0byBzdG9yZSB0aGUgY29udGV4dCAoYXR0cmlidXRlIG5hbWUpIGluIHRoZSBjdXJyZW50QXR0cmlidXRlCisgICAgICogaW5zdGFuY2UgdmFyaWFibGUuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgYmVpbmcgZW50ZXJlZC4KKyAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBhc3NvY2lhdGVkIHRvIHRoZSBlbGVtZW50LgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IG5hbWU7CisgICAgICAgIGN1cnJlbnRUZXh0ID0gIiI7CisgICAgICAgIGlmIChuYW1lLmVxdWFscyhFSkJfUkVGKSB8fCBuYW1lLmVxdWFscyhFSkJfTE9DQUxfUkVGKSkgeworICAgICAgICAgICAgaW5FSkJSZWYgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfTE9PS0lOR19FSkJKQVIgJiYgbmFtZS5lcXVhbHMoRUpCX0pBUikpIHsKKyAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9JTl9FSkJKQVI7CisgICAgICAgIH0gZWxzZSBpZiAocGFyc2VTdGF0ZSA9PSBTVEFURV9JTl9FSkJKQVIgJiYgbmFtZS5lcXVhbHMoRU5URVJQUklTRV9CRUFOUykpIHsKKyAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9JTl9CRUFOUzsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJzZVN0YXRlID09IFNUQVRFX0lOX0JFQU5TICYmIG5hbWUuZXF1YWxzKFNFU1NJT05fQkVBTikpIHsKKyAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9JTl9TRVNTSU9OOworICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fQkVBTlMgJiYgbmFtZS5lcXVhbHMoRU5USVRZX0JFQU4pKSB7CisgICAgICAgICAgICBwYXJzZVN0YXRlID0gU1RBVEVfSU5fRU5USVRZOworICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fQkVBTlMgJiYgbmFtZS5lcXVhbHMoTUVTU0FHRV9CRUFOKSkgeworICAgICAgICAgICAgcGFyc2VTdGF0ZSA9IFNUQVRFX0lOX01FU1NBR0U7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNBWCBwYXJzZXIgY2FsbC1iYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgd2hlbiBhbiBlbGVtZW50IGlzIGV4aXRlZC4KKyAgICAgKiBVc2VkIHRvIGJsYW5rIG91dCAoc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcsIG5vdCBudWxsaWZ5KSB0aGUgbmFtZSBvZgorICAgICAqIHRoZSBjdXJyZW50QXR0cmlidXRlLiAgQSBiZXR0ZXIgbWV0aG9kIHdvdWxkIGJlIHRvIHVzZSBhIHN0YWNrIGFzIGFuCisgICAgICogaW5zdGFuY2UgdmFyaWFibGUsIGhvd2V2ZXIgc2luY2Ugd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBsZWFmLW5vZGUKKyAgICAgKiBkYXRhIHRoaXMgaXMgYSBzaW1wbGVyIGFuZCB3b3JrYWJsZSBzb2x1dGlvbi4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGJlaW5nIGV4aXRlZC4gSWdub3JlZAorICAgICAqICAgICAgICBpbiB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHByb2Nlc3NFbGVtZW50KCk7CisgICAgICAgIGN1cnJlbnRUZXh0ID0gIiI7CisgICAgICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSAiIjsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKEVKQl9SRUYpIHx8IG5hbWUuZXF1YWxzKEVKQl9MT0NBTF9SRUYpKSB7CisgICAgICAgICAgICBpbkVKQlJlZiA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fRU5USVRZICYmIG5hbWUuZXF1YWxzKEVOVElUWV9CRUFOKSkgeworICAgICAgICAgICAgcGFyc2VTdGF0ZSA9IFNUQVRFX0lOX0JFQU5TOworICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fU0VTU0lPTiAmJiBuYW1lLmVxdWFscyhTRVNTSU9OX0JFQU4pKSB7CisgICAgICAgICAgICBwYXJzZVN0YXRlID0gU1RBVEVfSU5fQkVBTlM7CisgICAgICAgIH0gZWxzZSBpZiAocGFyc2VTdGF0ZSA9PSBTVEFURV9JTl9NRVNTQUdFICYmIG5hbWUuZXF1YWxzKE1FU1NBR0VfQkVBTikpIHsKKyAgICAgICAgICAgIHBhcnNlU3RhdGUgPSBTVEFURV9JTl9CRUFOUzsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJzZVN0YXRlID09IFNUQVRFX0lOX0JFQU5TICYmIG5hbWUuZXF1YWxzKEVOVEVSUFJJU0VfQkVBTlMpKSB7CisgICAgICAgICAgICBwYXJzZVN0YXRlID0gU1RBVEVfSU5fRUpCSkFSOworICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fRUpCSkFSICYmIG5hbWUuZXF1YWxzKEVKQl9KQVIpKSB7CisgICAgICAgICAgICBwYXJzZVN0YXRlID0gU1RBVEVfTE9PS0lOR19FSkJKQVI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTQVggcGFyc2VyIGNhbGwtYmFjayBtZXRob2QgaW52b2tlZCB3aGVuZXZlciBjaGFyYWN0ZXJzIGFyZSBsb2NhdGVkIHdpdGhpbgorICAgICAqIGFuIGVsZW1lbnQuICBjdXJyZW50QXR0cmlidXRlIChtb2RpZmllZCBieSBzdGFydEVsZW1lbnQgYW5kIGVuZEVsZW1lbnQpCisgICAgICogdGVsbHMgdXMgd2hldGhlciB3ZSBhcmUgaW4gYW4gaW50ZXJlc3RpbmcgZWxlbWVudCAob25lIG9mIHRoZSB1cCB0byBmb3VyCisgICAgICogY2xhc3NlcyBvZiBhbiBFSkIpLiAgSWYgc28gdGhlbiBjb252ZXJ0cyB0aGUgY2xhc3NuYW1lIGZyb20gdGhlIGZvcm1hdAorICAgICAqIG9yZy5hcGFjaGUudG9vbHMuYW50LlBhcnNlciB0byB0aGUgY29udmVudGlvbiBmb3Igc3RvcmluZyBzdWNoIGEgY2xhc3MsCisgICAgICogb3JnL2FwYWNoZS90b29scy9hbnQvUGFyc2VyLmNsYXNzLiAgVGhpcyBpcyB0aGVuIHJlc29sdmVkIGludG8gYSBmaWxlCisgICAgICogb2JqZWN0IHVuZGVyIHRoZSBzcmNkaXIgd2hpY2ggaXMgc3RvcmVkIGluIGEgSGFzaHRhYmxlLgorICAgICAqIEBwYXJhbSBjaCBBIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgY2hhcmFjdGVycyBpbgorICAgICAqICAgICAgICB0aGUgZWxlbWVudCwgYW5kIG1heWJlIG90aGVycyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBzdGFydCBBbiBpbnRlZ2VyIG1hcmtpbmcgdGhlIHBvc2l0aW9uIGluIHRoZSBjaGFyCisgICAgICogICAgICAgIGFycmF5IHRvIHN0YXJ0IHJlYWRpbmcgZnJvbS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIEFuIGludGVnZXIgcmVwcmVzZW50aW5nIGFuIG9mZnNldCBpbnRvIHRoZQorICAgICAqICAgICAgICBjaGFyIGFycmF5IHdoZXJlIHRoZSBjdXJyZW50IGRhdGEgdGVybWluYXRlcy4KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIGN1cnJlbnRUZXh0ICs9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYW4gZW5kZWxlbWVudCBpcyBzZWVuLgorICAgICAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gaW4gZGVyaXZlZCBjbGFzc2VzLgorICAgICAqIFRoaXMgdXBkYXRlcyB0aGUgZWpiZmlsZXMgaWYgdGhlIGVsZW1lbnQgaXMgYW4gaW50ZXJmYWNlIG9yIGEgYmVhbiBjbGFzcy4KKyAgICAgKiBUaGlzIHVwZGF0ZXMgdGhlIGVqYm5hbWUgaWYgdGhlIGVsZW1lbnQgaXMgYW4gZWpiIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoKSB7CisgICAgICAgIGlmIChpbkVKQlJlZgorICAgICAgICAgICAgfHwgKHBhcnNlU3RhdGUgIT0gU1RBVEVfSU5fRU5USVRZCisgICAgICAgICAgICAgICAgJiYgcGFyc2VTdGF0ZSAhPSBTVEFURV9JTl9TRVNTSU9OCisgICAgICAgICAgICAgICAgJiYgcGFyc2VTdGF0ZSAhPSBTVEFURV9JTl9NRVNTQUdFKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmVxdWFscyhIT01FX0lOVEVSRkFDRSkKKyAgICAgICAgICAgIHx8IGN1cnJlbnRFbGVtZW50LmVxdWFscyhSRU1PVEVfSU5URVJGQUNFKQorICAgICAgICAgICAgfHwgY3VycmVudEVsZW1lbnQuZXF1YWxzKExPQ0FMX0lOVEVSRkFDRSkKKyAgICAgICAgICAgIHx8IGN1cnJlbnRFbGVtZW50LmVxdWFscyhMT0NBTF9IT01FX0lOVEVSRkFDRSkKKyAgICAgICAgICAgIHx8IGN1cnJlbnRFbGVtZW50LmVxdWFscyhCRUFOX0NMQVNTKQorICAgICAgICAgICAgfHwgY3VycmVudEVsZW1lbnQuZXF1YWxzKFBLX0NMQVNTKSkgeworCisgICAgICAgICAgICAvLyBHZXQgdGhlIGZpbGVuYW1lIGludG8gYSBTdHJpbmcgb2JqZWN0CisgICAgICAgICAgICBGaWxlIGNsYXNzRmlsZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY3VycmVudFRleHQudHJpbSgpOworCisgICAgICAgICAgICAvLyBJZiBpdCdzIGEgcHJpbWl0aXZlIHdyYXBwZXIgdGhlbiB3ZSBzaG91bGRuJ3QgdHJ5IGFuZCBwdXQKKyAgICAgICAgICAgIC8vIGl0IGludG8gdGhlIGphciwgc28gaWdub3JlIGl0LgorICAgICAgICAgICAgaWYgKCFjbGFzc05hbWUuc3RhcnRzV2l0aCgiamF2YS4iKQorICAgICAgICAgICAgICAgICYmICFjbGFzc05hbWUuc3RhcnRzV2l0aCgiamF2YXguIikpIHsKKyAgICAgICAgICAgICAgICAvLyBUcmFuc2xhdGUgcGVyaW9kcyBpbnRvIHBhdGggc2VwYXJhdG9ycywgYWRkIC5jbGFzcyB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBuYW1lLCBjcmVhdGUgdGhlIEZpbGUgb2JqZWN0IGFuZCBhZGQgaXQgdG8gdGhlIEhhc2h0YWJsZS4KKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lICs9ICIuY2xhc3MiOworICAgICAgICAgICAgICAgIGNsYXNzRmlsZSA9IG5ldyBGaWxlKHNyY0RpciwgY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoY2xhc3NOYW1lLCBjbGFzc0ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgPGVqYi1uYW1lPiB0YWcuICBPbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuZXF1YWxzKEVKQl9OQU1FKSkgeworICAgICAgICAgICAgaWYgKGVqYk5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVqYk5hbWUgPSBjdXJyZW50VGV4dC50cmltKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRUpCRGVwbG95bWVudFRvb2wuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9FSkJEZXBsb3ltZW50VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDA2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRUpCRGVwbG95bWVudFRvb2wuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOworCisKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisKKy8qKgorICogVGhlIGludGVyZmFjZSB0byBpbXBsZW1lbnQgZm9yIGRlcGxveW1lbnQgdG9vbHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRUpCRGVwbG95bWVudFRvb2wgeworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGdlbmVyYXRpbmcgdGhlIG5lY2Vzc2FyeSB2ZW5kb3Igc3BlY2lmaWMKKyAgICAgKiBkZXBsb3ltZW50IGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2NyaXB0b3JGaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICogQHBhcmFtIHNheFBhcnNlciBhIFNBWCBwYXJzZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcGFyc2UgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHZvaWQgcHJvY2Vzc0Rlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3JGaWxlbmFtZSwgU0FYUGFyc2VyIHNheFBhcnNlcikKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIHRvb2wgcGFyYW1ldGVycyBoYXZlIGJlZW4gY29uZmlndXJlZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHZvaWQgdmFsaWRhdGVDb25maWd1cmVkKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0YXNrIHdoaWNoIG93bnMgdGhpcyB0b29sCisgICAgICogQHBhcmFtIHRhc2sgdGhlIHRhc2suCisgICAgICovCisgICAgdm9pZCBzZXRUYXNrKFRhc2sgdGFzayk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhpcyB0b29sIGZvciB1c2UgaW4gdGhlIGVqYmphciB0YXNrLgorICAgICAqIEBwYXJhbSBjb25maWcgY29udGFpbnMgY29uZmlndXJhdGlvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICB2b2lkIGNvbmZpZ3VyZShFamJKYXIuQ29uZmlnIGNvbmZpZyk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRWpiSmFyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRWpiSmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2MWNhMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9FamJKYXIuamF2YQpAQCAtMCwwICsxLDYyOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKKworLy8gU3RhbmRhcmQgamF2YSBpbXBvcnRzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogUHJvdmlkZXMgYXV0b21hdGVkIEVKQiBKQVIgZmlsZSBjcmVhdGlvbi4KKyAqIDxwPgorICogRXh0ZW5kcyB0aGUKKyAqIE1hdGNoaW5nVGFzayBjbGFzcyBwcm92aWRlZCBpbiB0aGUgZGVmYXVsdCBhbnQgZGlzdHJpYnV0aW9uIHRvIHByb3ZpZGUgYQorICogZGlyZWN0b3J5IHNjYW5uaW5nIEVKQiBqYXJmaWxlIGdlbmVyYXRvci4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIFRoZSB0YXNrIHdvcmtzIGJ5IHRha2luZyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBvbmUgYXQgYSB0aW1lIGFuZAorICogcGFyc2luZyB0aGVtIHRvIGxvY2F0ZSB0aGUgbmFtZXMgb2YgdGhlIGNsYXNzZXMgd2hpY2ggc2hvdWxkIGJlIHBsYWNlZCBpbgorICogdGhlIGphci4gVGhlIGNsYXNzbmFtZXMgYXJlIHRyYW5zbGF0ZWQgdG8gamF2YS5pby5GaWxlcyBieSByZXBsYWNpbmcKKyAqIHBlcmlvZHMgd2l0aCBGaWxlLnNlcGFyYXRvckNoYXIgYW5kIHJlc29sdmluZyB0aGUgZ2VuZXJhdGVkIGZpbGVuYW1lIGFzIGEKKyAqIHJlbGF0aXZlIHBhdGggdW5kZXIgdGhlIHNyY0RpciBhdHRyaWJ1dGUuIEFsbCBuZWNlc3NhcnkgZmlsZXMgYXJlIHRoZW4KKyAqIGFzc2VtYmxlZCBpbnRvIGEgamFyZmlsZS4gT25lIGphcmZpbGUgaXMgY29uc3RydWN0ZWQgZm9yIGVhY2ggZGVwbG95bWVudAorICogZGVzY3JpcHRvciBmb3VuZC4KKyAqIDwvcD4KKyAqCisgKiAqLworcHVibGljIGNsYXNzIEVqYkphciBleHRlbmRzIE1hdGNoaW5nVGFzayB7CisKKyAgICAvKioKKyAgICAgKiBJbm5lciBjbGFzcyB1c2VkIHRvIHJlY29yZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24gb2YgYSBsb2NhbCBEVEQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERURExvY2F0aW9uCisgICAgICAgIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRFRETG9jYXRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2hpY2ggY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gc3RhdGUgb2YgdGhlIGVqYmphciB0YXNrLgorICAgICAqIFRoaXMgc3RhdGUgaXMgcGFzc2VkIHRvIHRoZSBkZXBsb3ltZW50IHRvb2xzIGZvciBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIENvbmZpZyB7CisgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9yZXMgYSBoYW5kbGUgdG8gdGhlIGRpcmVjdG9yeSB1bmRlciB3aGljaCB0byBzZWFyY2ggZm9yIGNsYXNzCisgICAgICAgICAqIGZpbGVzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmlsZSBzcmNEaXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3JlcyBhIGhhbmRsZSB0byB0aGUgZGlyZWN0b3J5IHVuZGVyIHdoaWNoIHRvIHNlYXJjaCBmb3IKKyAgICAgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9ycworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZpbGUgZGVzY3JpcHRvckRpcjsKKworICAgICAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBtYXJrcyB0aGUgZW5kIG9mIHRoZSAnYmFzZW5hbWUnICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYmFzZU5hbWVUZXJtaW5hdG9yID0gIi0iOworCisgICAgICAgIC8qKiBTdG9yZXMgYSBoYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIEVKQiBKYXIgZmlsZSAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGJhc2VKYXJOYW1lOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IGRldGVybWluZXMgd2hldGhlciB0byB1c2UgYSBwYWNrYWdlIHN0cnVjdHVyZQorICAgICAgICAgKiBvZiBhIGZsYXQgZGlyZWN0b3J5IGFzIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGphciBmaWxlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGZsYXREZXN0RGlyID0gZmFsc2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9hZGluZyBjbGFzc2VzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUGF0aCBjbGFzc3BhdGg7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgRmlsZXNldCBvZiBzdXBwb3J0IGNsYXNzZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMaXN0IHN1cHBvcnRGaWxlU2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxpc3Qgb2YgY29uZmlndXJlZCBEVEQgbG9jYXRpb25zCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0IGR0ZExvY2F0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWluZyBzY2hlbWUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGdlbmVyYXRlZCBqYXIgbmFtZQorICAgICAgICAgKiBmcm9tIHRoZSBkZXNjcmlwdG9yIGluZm9ybWF0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTmFtaW5nU2NoZW1lIG5hbWluZ1NjaGVtZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1hbmlmZXN0IGZpbGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGaWxlIG1hbmlmZXN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVwZW5kZW5jeSBhbmFseXplciB0byB1c2UgdG8gYWRkIGFkZGl0aW9uYWwgY2xhc3NlcyB0byB0aGUgamFyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGFuYWx5emVyOworICAgICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIEVudW1lcmF0ZWRBdHRyaWJ1dGUgY2xhc3MgZm9yIGhhbmRsaW5nIGRpZmZlcmVudCBFSkIgamFyIG5hbWluZworICAgICAqIHNjaGVtZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWluZ1NjaGVtZSBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKioKKyAgICAgICAgICogTmFtaW5nIHNjaGVtZSB3aGVyZSBnZW5lcmF0ZWQgamFyIGlzIGRldGVybWluZWQgZnJvbSB0aGUgZWpiLW5hbWUgaW4KKyAgICAgICAgICogdGhlIGRlcGxveW1lbnQgZGVzY3JpcG9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTkFNRSA9ICJlamItbmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5hbWluZyBzY2hlbWUgd2hlcmUgdGhlIGdlbmVyYXRlZCBqYXIgbmFtZSBpcyBiYXNlZCBvbiB0aGUKKyAgICAgICAgICogbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZID0gImRpcmVjdG9yeSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5hbWluZyBzY2hlbWUgd2hlcmUgdGhlIGdlbmVyYXRlZCBqYXIgbmFtZSBpcyBiYXNlZCBvbiB0aGUgbmFtZSBvZgorICAgICAgICAgKiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1IgPSAiZGVzY3JpcHRvciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5hbWluZyBzY2hlbWUgd2hlcmUgdGhlIGdlbmVyYXRlZCBqYXIgaXMgbmFtZWQgYnkgdGhlIGJhc2VqYXJuYW1lCisgICAgICAgICAqIGF0dHJpYnV0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRUpBUk5BTUUgPSAiYmFzZWphcm5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZXMgb2YgdGhlIE5hbWluZ1NjaGVtZQorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSB2YWx1ZXMgb2YgdGhpcyBhdHRyaWJ1dGUgY2xhc3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7RUpCX05BTUUsIERJUkVDVE9SWSwgREVTQ1JJUFRPUiwgQkFTRUpBUk5BTUV9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ01QIHZlcnNpb25zIHN1cHBvcnRlZAorICAgICAqIHZhbGlkIENNUCB2ZXJzaW9ucyBhcmUgMS4wIGFuZCAyLjAKKyAgICAgKiBAc2luY2UgYW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ01QVmVyc2lvbiBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKiogMS4wIHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNUDFfMCA9ICIxLjAiOworICAgICAgICAvKiogMi4wIHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNUDJfMCA9ICIyLjAiOworICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW117CisgICAgICAgICAgICAgICAgQ01QMV8wLAorICAgICAgICAgICAgICAgIENNUDJfMCwKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGhlIGNvbmZpZyB3aGljaCBpcyBidWlsdCBieSB0aGlzIHRhc2sgYW5kIHVzZWQgYnkgdGhlIHZhcmlvdXMgZGVwbG95bWVudAorICAgICAqIHRvb2xzIHRvIGFjY2VzcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZWpiamFyIHRhc2sKKyAgICAgKi8KKyAgICBwcml2YXRlIENvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKCk7CisKKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhIGhhbmRsZSB0byB0aGUgZGlyZWN0b3J5IHRvIHB1dCB0aGUgSmFyIGZpbGVzIGluLiBUaGlzIGlzCisgICAgICogb25seSB1c2VkIGJ5IHRoZSBnZW5lcmljIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0b29sIHdoaWNoIGlzIGNyZWF0ZWQKKyAgICAgKiBpZiBubyBvdGhlciBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdG9vbHMgYXJlIHByb3ZpZGVkLiBOb3JtYWxseSBlYWNoCisgICAgICogZGVwbG95bWVudCB0b29sIHdpbGwgc3BlY2lmeSB0aGUgZGVzaXRpbmF0aW9uIGRpciBpdHNlbGYuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGRlc3REaXI7CisKKyAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBqYXJmaWxlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyaWNKYXJTdWZmaXggPSAiLWdlbmVyaWMuamFyIjsKKworICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgQ01QIHZlcnNpb24gZm9yIHRoZSBqYm9zcyBqYXJmaWxlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGNtcFZlcnNpb24gPSBDTVBWZXJzaW9uLkNNUDFfMDsKKworICAgIC8qKiBUaGUgbGlzdCBvZiBkZXBsb3ltZW50IHRvb2xzIHdlIGFyZSBnb2luZyB0byBydW4uICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgZGVwbG95bWVudFRvb2xzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgZGVwbG95bWVudCB0b29sIHRvIHRoZSBsaXN0IG9mIGRlcGxveW1lbnQgdG9vbHMgdGhhdCB3aWxsIGJlCisgICAgICogcHJvY2Vzc2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVwbG95bWVudFRvb2wgYSBkZXBsb3ltZW50IHRvb2wgaW5zdGFuY2UgdG8gd2hpY2ggZGVzY3JpcHRvcnMKKyAgICAgKiAgICAgICAgd2lsbCBiZSBwYXNzZWQgZm9yIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkRGVwbG95bWVudFRvb2woRUpCRGVwbG95bWVudFRvb2wgZGVwbG95bWVudFRvb2wpIHsKKyAgICAgICAgZGVwbG95bWVudFRvb2wuc2V0VGFzayh0aGlzKTsKKyAgICAgICAgZGVwbG95bWVudFRvb2xzLmFkZChkZXBsb3ltZW50VG9vbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgV2VibG9naWMgc2VydmVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVwbG95bWVudCB0b29sIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIFdlYmxvZ2ljRGVwbG95bWVudFRvb2wgY3JlYXRlV2VibG9naWMoKSB7CisgICAgICAgIFdlYmxvZ2ljRGVwbG95bWVudFRvb2wgdG9vbCA9IG5ldyBXZWJsb2dpY0RlcGxveW1lbnRUb29sKCk7CisgICAgICAgIGFkZERlcGxveW1lbnRUb29sKHRvb2wpOworICAgICAgICByZXR1cm4gdG9vbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBXZWJzcGhlcmUgNC4wIHNlcnZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRlcGxveW1lbnQgdG9vbCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBXZWJzcGhlcmVEZXBsb3ltZW50VG9vbCBjcmVhdGVXZWJzcGhlcmUoKSB7CisgICAgICAgIFdlYnNwaGVyZURlcGxveW1lbnRUb29sIHRvb2wgPSBuZXcgV2Vic3BoZXJlRGVwbG95bWVudFRvb2woKTsKKyAgICAgICAgYWRkRGVwbG95bWVudFRvb2wodG9vbCk7CisgICAgICAgIHJldHVybiB0b29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIEJvcmxhbmQgc2VydmVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVwbG95bWVudCB0b29sIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIEJvcmxhbmREZXBsb3ltZW50VG9vbCBjcmVhdGVCb3JsYW5kKCkgeworICAgICAgICBsb2coIkJvcmxhbmQgZGVwbG95bWVudCB0b29scyIsICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBCb3JsYW5kRGVwbG95bWVudFRvb2wgdG9vbCA9IG5ldyBCb3JsYW5kRGVwbG95bWVudFRvb2woKTsKKyAgICAgICAgdG9vbC5zZXRUYXNrKHRoaXMpOworICAgICAgICBkZXBsb3ltZW50VG9vbHMuYWRkKHRvb2wpOworICAgICAgICByZXR1cm4gdG9vbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRlcGxveW1lbnQgdG9vbCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBJUGxhbmV0RGVwbG95bWVudFRvb2wgY3JlYXRlSXBsYW5ldCgpIHsKKyAgICAgICAgbG9nKCJpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciBkZXBsb3ltZW50IHRvb2xzIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgSVBsYW5ldERlcGxveW1lbnRUb29sIHRvb2wgPSBuZXcgSVBsYW5ldERlcGxveW1lbnRUb29sKCk7CisgICAgICAgIGFkZERlcGxveW1lbnRUb29sKHRvb2wpOworICAgICAgICByZXR1cm4gdG9vbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBKQm9zcyBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXBsb3ltZW50IHRvb2wgaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmJvc3NEZXBsb3ltZW50VG9vbCBjcmVhdGVKYm9zcygpIHsKKyAgICAgICAgSmJvc3NEZXBsb3ltZW50VG9vbCB0b29sID0gbmV3IEpib3NzRGVwbG95bWVudFRvb2woKTsKKyAgICAgICAgYWRkRGVwbG95bWVudFRvb2wodG9vbCk7CisgICAgICAgIHJldHVybiB0b29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIEpPbkFTIHNlcnZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRlcGxveW1lbnQgdG9vbCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBKb25hc0RlcGxveW1lbnRUb29sIGNyZWF0ZUpvbmFzKCkgeworICAgICAgICBsb2coIkpPbkFTIGRlcGxveW1lbnQgdG9vbHMiLCAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgSm9uYXNEZXBsb3ltZW50VG9vbCB0b29sID0gbmV3IEpvbmFzRGVwbG95bWVudFRvb2woKTsKKyAgICAgICAgYWRkRGVwbG95bWVudFRvb2wodG9vbCk7CisgICAgICAgIHJldHVybiB0b29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIFdlYmxvZ2ljIHdoZW4gdXNpbmcgdGhlIFRvcGxpbmsKKyAgICAgKiBPYmplY3QtUmVsYXRpb25hbCBtYXBwaW5nLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVwbG95bWVudCB0b29sIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIFdlYmxvZ2ljVE9QTGlua0RlcGxveW1lbnRUb29sIGNyZWF0ZVdlYmxvZ2ljdG9wbGluaygpIHsKKyAgICAgICAgbG9nKCJUaGUgPHdlYmxvZ2ljdG9wbGluaz4gZWxlbWVudCBpcyBubyBsb25nZXIgcmVxdWlyZWQuIFBsZWFzZSB1c2UgIgorICAgICAgICAgICAgKyAidGhlIDx3ZWJsb2dpYz4gZWxlbWVudCBhbmQgc2V0IG5ld0NNUD1cInRydWVcIiIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2wgdG9vbAorICAgICAgICAgICAgPSBuZXcgV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2woKTsKKyAgICAgICAgYWRkRGVwbG95bWVudFRvb2wodG9vbCk7CisgICAgICAgIHJldHVybiB0b29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdG8gdGhlIGNsYXNzcGF0aCB1c2VkIHRvIGxvY2F0ZSB0aGUgc3VwZXIgY2xhc3NlcyBhbmQKKyAgICAgKiBpbnRlcmZhY2VzIG9mIHRoZSBjbGFzc2VzIHRoYXQgd2lsbCBtYWtlIHVwIHRoZSBFSkIgSkFSLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcGF0aCB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGNvbmZpZy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnLmNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbmZpZy5jbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIERURCBsb2NhdGlvbiByZWNvcmQuIFRoaXMgc3RvcmVzIHRoZSBsb2NhdGlvbiBvZiBhIERURC4gVGhlCisgICAgICogRFREIGlzIGlkZW50aWZpZWQgYnkgaXRzIHB1YmxpYyBJZC4gVGhlIGxvY2F0aW9uIG1heSBlaXRoZXIgYmUgYSBmaWxlCisgICAgICogbG9jYXRpb24gb3IgYSByZXNvdXJjZSBsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIERURCBsb2NhdGlvbiBvYmplY3QgdG8gYmUgY29uZmlndXJlZCBieSBBbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgRFRETG9jYXRpb24gY3JlYXRlRFREKCkgeworICAgICAgICBEVERMb2NhdGlvbiBkdGRMb2NhdGlvbiA9IG5ldyBEVERMb2NhdGlvbigpOworICAgICAgICBjb25maWcuZHRkTG9jYXRpb25zLmFkZChkdGRMb2NhdGlvbik7CisKKyAgICAgICAgcmV0dXJuIGR0ZExvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmaWxlc2V0IGZvciBzdXBwb3J0IGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHJldHVybiBhIGZpbGVzZXQgd2hpY2ggY2FuIGJlIHBvcHVsYXRlZCB3aXRoIHN1cHBvcnQgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIEZpbGVTZXQgY3JlYXRlU3VwcG9ydCgpIHsKKyAgICAgICAgRmlsZVNldCBzdXBwb3J0RmlsZVNldCA9IG5ldyBGaWxlU2V0KCk7CisgICAgICAgIGNvbmZpZy5zdXBwb3J0RmlsZVNldHMuYWRkKHN1cHBvcnRGaWxlU2V0KTsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRGaWxlU2V0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBNYW5pZmVzdCBmaWxlIHRvIHVzZSB3aGVuIGphcnJpbmcuIEFzIG9mIEVKQiAxLjEsIG1hbmlmZXN0CisgICAgICogZmlsZXMgYXJlIG5vIGxvbmdlciB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgRUpCLiBIb3dldmVyLCB0aGV5IHN0aWxsCisgICAgICogaGF2ZSBhIHZpdGFsIGltcG9ydGFuY2UgaWYgdGhlIEVKQiBpcyBpbnRlbmRlZCB0byBiZSBwYWNrYWdlZCBpbiBhbgorICAgICAqIEVBUiBmaWxlLiBCeSBhZGRpbmcgIkNsYXNzLVBhdGgiIHNldHRpbmdzIHRvIGEgTWFuaWZlc3QgZmlsZSwgdGhlIEVKQgorICAgICAqIGNhbiBsb29rIGZvciBjbGFzc2VzIGluc2lkZSB0aGUgRUFSIGZpbGUgaXRzZWxmLCBhbGxvd2luZyBmb3IgZWFzaWVyCisgICAgICogZGVwbG95bWVudC4gVGhpcyBpcyBvdXRsaW5lZCBpbiB0aGUgSjJFRSBzcGVjaWZpY2F0aW9uLCBhbmQgYWxsIEoyRUUKKyAgICAgKiBjb21wb25lbnRzIGFyZSBtZWFudCB0byBzdXBwb3J0IGl0LgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmlmZXN0IHRoZSBtYW5pZmVzdCB0byBiZSB1c2VkIGluIHRoZSBFSkIgamFyCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldE1hbmlmZXN0KEZpbGUgbWFuaWZlc3QpIHsKKyAgICAgICAgIGNvbmZpZy5tYW5pZmVzdCA9IG1hbmlmZXN0OworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCB3aGljaCBpcyB0aGUgZGlyZWN0b3J5IHRoYXQKKyAgICAgKiBjb250YWlucyB0aGUgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEVKQiBqYXIuIFR5cGljYWxseQorICAgICAqIHRoaXMgd2lsbCBpbmNsdWRlIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBhbmQgdGhlIGJlYW4gY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5EaXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjZGlyKEZpbGUgaW5EaXIpIHsKKyAgICAgICAgY29uZmlnLnNyY0RpciA9IGluRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzY3JpcHRvciBkaXJlY3RvcnkuIFRoZSBkZXNjcmlwdG9yIGRpcmVjdG9yeSBjb250YWlucyB0aGUKKyAgICAgKiBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gVGhlc2UgYXJlIFhNTCBmaWxlcyB0aGF0IGRlY2xhcmUgdGhlCisgICAgICogcHJvcGVydGllcyBvZiBhIGJlYW4gaW4gYSBwYXJ0aWN1bGFyIGRlcGxveW1lbnQgc2NlbmFyaW8uIFN1Y2gKKyAgICAgKiBwcm9wZXJ0aWVzIGluY2x1ZGUsIGZvciBleGFtcGxlLCB0aGUgdHJhbnNhY3Rpb25hbCBuYXR1cmUgb2YgdGhlIGJlYW4KKyAgICAgKiBhbmQgdGhlIHNlY3VyaXR5IGFjY2VzcyBjb250cm9sIHRvIHRoZSBiZWFuJ3MgbWV0aG9kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbkRpciB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRvcmRpcihGaWxlIGluRGlyKSB7CisgICAgICAgIGNvbmZpZy5kZXNjcmlwdG9yRGlyID0gaW5EaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbmFseXplciB0byB1c2Ugd2hlbiBhZGRpbmcgaW4gZGVwZW5kZW5jaWVzIHRvIHRoZSBKQVIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5hbHl6ZXIgdGhlIG5hbWUgb2YgdGhlIGRlcGVuZGVuY3kgYW5hbHl6ZXIgb3IgYSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXBlbmRlbmN5KFN0cmluZyBhbmFseXplcikgeworICAgICAgICBjb25maWcuYW5hbHl6ZXIgPSBhbmFseXplcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJhc2UgbmFtZSBvZiB0aGUgRUpCIEpBUiB0aGF0IGlzIHRvIGJlIGNyZWF0ZWQgaWYgaXQgaXMgbm90CisgICAgICogdG8gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5WYWx1ZSB0aGUgYmFzZW5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB3cml0aW5nIHRoZSBqYXIKKyAgICAgKiAgICAgIGZpbGUgY29udGFpbmluZyB0aGUgRUpCCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFzZWphcm5hbWUoU3RyaW5nIGluVmFsdWUpIHsKKyAgICAgICAgY29uZmlnLmJhc2VKYXJOYW1lID0gaW5WYWx1ZTsKKyAgICAgICAgaWYgKGNvbmZpZy5uYW1pbmdTY2hlbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnLm5hbWluZ1NjaGVtZSA9IG5ldyBOYW1pbmdTY2hlbWUoKTsKKyAgICAgICAgICAgIGNvbmZpZy5uYW1pbmdTY2hlbWUuc2V0VmFsdWUoTmFtaW5nU2NoZW1lLkJBU0VKQVJOQU1FKTsKKyAgICAgICAgfSBlbHNlIGlmICghY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhOYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBiYXNlamFybmFtZSBhdHRyaWJ1dGUgaXMgbm90ICIKKyAgICAgICAgICAgICAgICArICJjb21wYXRpYmxlIHdpdGggdGhlICIKKyAgICAgICAgICAgICAgICArIGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKSArICIgbmFtaW5nIHNjaGVtZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1pbmcgc2NoZW1lIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgamFycworICAgICAqIGZyb20gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWluZ1NjaGVtZSB0aGUgbmFtaW5nIHNjaGVtZSB0byBiZSB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtaW5nKE5hbWluZ1NjaGVtZSBuYW1pbmdTY2hlbWUpIHsKKyAgICAgICAgY29uZmlnLm5hbWluZ1NjaGVtZSA9IG5hbWluZ1NjaGVtZTsKKyAgICAgICAgaWYgKCFjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKE5hbWluZ1NjaGVtZS5CQVNFSkFSTkFNRSkKKyAgICAgICAgICAgICYmIGNvbmZpZy5iYXNlSmFyTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBiYXNlamFybmFtZSBhdHRyaWJ1dGUgaXMgbm90ICIKKyAgICAgICAgICAgICAgICArICJjb21wYXRpYmxlIHdpdGggdGhlICIKKyAgICAgICAgICAgICAgICArIGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKSArICIgbmFtaW5nIHNjaGVtZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHJldHVybiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgKiBAc2luY2UgYW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldERlc3RkaXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlc3REaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIFRoZSBFSkIgamFyIGZpbGVzIHdpbGwgYmUgd3JpdHRlbiBpbnRvCisgICAgICogdGhpcyBkaXJlY3RvcnkuIFRoZSBqYXIgZmlsZXMgdGhhdCBleGlzdCBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgYWxzbworICAgICAqIHVzZWQgd2hlbiBkZXRlcm1pbmluZyBpZiB0aGUgY29udGVudHMgb2YgdGhlIGphciBmaWxlIGhhdmUgY2hhbmdlZC4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGlmIG5vIGRlcGxveW1lbnQgdG9vbHMgYXJlCisgICAgICogc3BlY2lmaWVkLiBUeXBpY2FsbHkgZWFjaCBkZXBsb3ltZW50IHRvb2wgd2lsbCBzcGVjaWZ5IGl0cyBvd24KKyAgICAgKiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5EaXIgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbiB3aGljaCB0byBnZW5lcmF0ZSBqYXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGluRGlyKSB7CisgICAgICAgIHRoaXMuZGVzdERpciA9IGluRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIENNUCB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHJldHVybiBDTVAgdmVyc2lvbgorICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbXB2ZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jbXBWZXJzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIENNUCB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHZlcnNpb24gQ01QIHZlcnNpb24uCisgICAgICogTXVzdCBiZSBlaXRoZXIgPGNvZGU+MS4wPC9jb2RlPiBvciA8Y29kZT4yLjA8L2NvZGU+Ljxici8+CisgICAgICogRGVmYXVsdCBpcyA8Y29kZT4xLjA8L2NvZGU+Ljxici8+CisgICAgICogSW5pdGlhbGx5LCBvbmx5IHRoZSBKQm9zcyBpbXBsZW1lbnRhdGlvbiBkb2VzIHNvbWV0aGluZyBzcGVjaWZpYyBmb3IgQ01QIDIuMC48YnIvPgorICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q21wdmVyc2lvbihDTVBWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgdGhpcy5jbXBWZXJzaW9uID0gdmVyc2lvbi5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIHJlc29sdmluZyBjbGFzc2VzIGZvciBpbmNsdXNpb24gaW4gdGhlIGphci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggdGhlIGNsYXNzcGF0aCB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGNvbmZpZy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciB0aGUKKyAgICAgKiBkZXN0aW5hdGlvbiBKQVJzIGFyZSB3cml0dGVuIG91dCBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdpdGgKKyAgICAgKiB0aGUgc2FtZSBoaWVyYXJjaGljYWwgc3RydWN0dXJlIGZyb20gd2hpY2ggdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKKyAgICAgKiBoYXZlIGJlZW4gcmVhZC4gSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSB0aGUgZ2VuZXJhdGVkIEVKQiBqYXJzIGFyZQorICAgICAqIHdyaXR0ZW4gaW50byB0aGUgcm9vdCBvZiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBvdGhlcndpc2UgdGhleQorICAgICAqIGFyZSB3cml0dGVuIG91dCBpbiB0aGUgc2FtZSByZWxhdGl2ZSBwb3NpdGlvbiBhcyB0aGUgZGVwbG95bWVudAorICAgICAqIGRlc2NyaXB0b3JzIGluIHRoZSBkZXNjcmlwdG9yIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpblZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYXRkZXN0ZGlyIGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmxhdGRlc3RkaXIoYm9vbGVhbiBpblZhbHVlKSB7CisgICAgICAgIGNvbmZpZy5mbGF0RGVzdERpciA9IGluVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWZmaXggZm9yIHRoZSBnZW5lcmF0ZWQgamFyIGZpbGUuIFdoZW4gZ2VuZXJpYyBqYXJzIGFyZQorICAgICAqIGdlbmVyYXRlZCwgdGhleSBoYXZlIGEgc3VmZml4IHdoaWNoIGlzIGFwcGVuZGVkIHRvIHRoZSB0aGUgYmVhbiBuYW1lCisgICAgICogdG8gY3JlYXRlIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZS4gTm90ZSB0aGF0IHRoaXMgc3VmZml4IGluY2x1ZGVzCisgICAgICogdGhlIGV4dGVuc2lvbiBmbyB0ZSBqYXIgZmlsZSBhbmQgc2hvdWxkIHRoZXJlZm9yZSBlbmQgd2l0aCBhbgorICAgICAqIGFwcHJvcHJpYXRlIGV4dGVuc2lvbiBzdWNoIGFzIC5qYXIgb3IgLmVhcgorICAgICAqCisgICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBzdWZmaXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2VuZXJpY2phcnN1ZmZpeChTdHJpbmcgaW5TdHJpbmcpIHsKKyAgICAgICAgdGhpcy5nZW5lcmljSmFyU3VmZml4ID0gaW5TdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyB3aGljaCB0ZXJtaW5hdGVzIHRoZSBiZWFuIG5hbWUuCisgICAgICogVGhlIGNvbnZlbnRpb24gdXNlZCBieSB0aGlzIHRhc2sgaXMKKyAgICAgKiB0aGF0IGJlYW4gZGVzY3JpcHRvcnMgYXJlIG5hbWVkIGFzIHRoZSBCZWFuTmFtZSB3aXRoIHNvbWUgc3VmZml4LiBUaGUKKyAgICAgKiBiYXNlTmFtZVRlcm1pbmF0b3Igc3RyaW5nIHNlcGFyYXRlcyB0aGUgYmVhbiBuYW1lIGFuZCB0aGUgc3VmZml4IGFuZAorICAgICAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBiZWFuIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5WYWx1ZSBhIHN0cmluZyB3aGljaCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBiYXNlbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlbmFtZXRlcm1pbmF0b3IoU3RyaW5nIGluVmFsdWUpIHsKKyAgICAgICAgY29uZmlnLmJhc2VOYW1lVGVybWluYXRvciA9IGluVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIGNvbmZpZyB0aGF0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgZnJvbSB0aGUgYnVpbGQgZmlsZQorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29uZmlnIGlzIG5vdCB2YWxpZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbmZpZygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb25maWcuc3JjRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHNyY0RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcuZGVzY3JpcHRvckRpciA9PSBudWxsKSB7CisgICAgICAgICAgICBjb25maWcuZGVzY3JpcHRvckRpciA9IGNvbmZpZy5zcmNEaXI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm5hbWluZ1NjaGVtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBjb25maWcubmFtaW5nU2NoZW1lID0gbmV3IE5hbWluZ1NjaGVtZSgpOworICAgICAgICAgICAgY29uZmlnLm5hbWluZ1NjaGVtZS5zZXRWYWx1ZShOYW1pbmdTY2hlbWUuREVTQ1JJUFRPUik7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhOYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpCisgICAgICAgICAgICAgICAgICAgICYmIGNvbmZpZy5iYXNlSmFyTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBiYXNlamFybmFtZSBhdHRyaWJ1dGUgbXVzdCAiCisgICAgICAgICAgICAgICAgKyAiYmUgc3BlY2lmaWVkIHdpdGggdGhlIGJhc2VqYXJuYW1lIG5hbWluZyBzY2hlbWUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZWQgYnkgQW50IGFmdGVyIHRoZSB0YXNrIGlzIHByZXBhcmVkLCB3aGVuIGl0IGlzIHJlYWR5IHRvIGV4ZWN1dGUKKyAgICAgKiB0aGlzIHRhc2suCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgY29uZmlndXJlIGFsbCBvZiB0aGUgbmVzdGVkIGRlcGxveW1lbnQgdG9vbHMgdG8gYWxsb3cgdGhlbSB0bworICAgICAqIHByb2Nlc3MgdGhlIGphci4gSWYgbm8gZGVwbG95bWVudCB0b29scyBoYXZlIGJlZW4gY29uZmlndXJlZCBhIGdlbmVyaWMKKyAgICAgKiB0b29sIGlzIGNyZWF0ZWQgdG8gaGFuZGxlIHRoZSBqYXIuCisgICAgICoKKyAgICAgKiBBIHBhcnNlciBpcyBjb25maWd1cmVkIGFuZCB0aGVuIGVhY2ggZGVzY3JpcHRvciBmb3VuZCBpcyBwYXNzZWQgdG8gYWxsCisgICAgICogdGhlIGRlcGxveW1lbnQgdG9vbCBlbGVtZW50cyBmb3IgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gdGhyb3duIHdoZW5ldmVyIGEgcHJvYmxlbSBpcworICAgICAqICAgICAgICAgICAgZW5jb3VudGVyZWQgdGhhdCBjYW5ub3QgYmUgcmVjb3ZlcmVkIGZyb20sIHRvIHNpZ25hbCB0byBhbnQKKyAgICAgKiAgICAgICAgICAgIHRoYXQgYSBtYWpvciBwcm9ibGVtIG9jY3VycmVkIHdpdGhpbiB0aGlzIHRhc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhbGlkYXRlQ29uZmlnKCk7CisKKyAgICAgICAgaWYgKGRlcGxveW1lbnRUb29scy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgR2VuZXJpY0RlcGxveW1lbnRUb29sIGdlbmVyaWNUb29sID0gbmV3IEdlbmVyaWNEZXBsb3ltZW50VG9vbCgpOworICAgICAgICAgICAgZ2VuZXJpY1Rvb2wuc2V0VGFzayh0aGlzKTsKKyAgICAgICAgICAgIGdlbmVyaWNUb29sLnNldERlc3RkaXIoZGVzdERpcik7CisgICAgICAgICAgICBnZW5lcmljVG9vbC5zZXRHZW5lcmljSmFyU3VmZml4KGdlbmVyaWNKYXJTdWZmaXgpOworICAgICAgICAgICAgZGVwbG95bWVudFRvb2xzLmFkZChnZW5lcmljVG9vbCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZXBsb3ltZW50VG9vbHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBFSkJEZXBsb3ltZW50VG9vbCB0b29sID0gKEVKQkRlcGxveW1lbnRUb29sKSBpLm5leHQoKTsKKyAgICAgICAgICAgIHRvb2wuY29uZmlndXJlKGNvbmZpZyk7CisgICAgICAgICAgICB0b29sLnZhbGlkYXRlQ29uZmlndXJlZCgpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcGFyc2VyIHVzaW5nIHdoYXRldmVyIHBhcnNlciB0aGUgc3lzdGVtIGRpY3RhdGVzCisgICAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBzYXhQYXJzZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7CisgICAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc2F4UGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKKworCisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihjb25maWcuZGVzY3JpcHRvckRpcik7CisgICAgICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKworICAgICAgICAgICAgbG9nKGZpbGVzLmxlbmd0aCArICIgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBsb2NhdGVkLiIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZmlsZXMuIEVhY2ggZmlsZSByZXByZXNlbnRzIG9uZSBkZXBsb3ltZW50CisgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLCBhbmQgaGVuY2Ugb25lIGJlYW4gaW4gb3VyIG1vZGVsLgorICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGZpbGVzLmxlbmd0aDsgKytpbmRleCkgeworICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbiBlYWNoIHRvb2wKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZXBsb3ltZW50VG9vbHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEVKQkRlcGxveW1lbnRUb29sIHRvb2wgPSAoRUpCRGVwbG95bWVudFRvb2wpIGkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICB0b29sLnByb2Nlc3NEZXNjcmlwdG9yKGZpbGVzW2luZGV4XSwgc2F4UGFyc2VyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJTQVhFeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgcGFyc2VyLiIKKyAgICAgICAgICAgICAgICArICIgIERldGFpbHM6ICIKKyAgICAgICAgICAgICAgICArIHNlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIHNlKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyBwYXJzZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiRGV0YWlsczogIiArIHBjZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBwY2UpOworICAgICAgICB9CisgICAgfSAvLyBlbmQgb2YgZXhlY3V0ZSgpCisKK30KKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0dlbmVyaWNEZXBsb3ltZW50VG9vbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0dlbmVyaWNEZXBsb3ltZW50VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMjAwNmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvR2VuZXJpY0RlcGxveW1lbnRUb29sLmphdmEKQEAgLTAsMCArMSw5NTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLkRlcGVuZGVuY3lBbmFseXplcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKworLyoqCisgKiBBIGRlcGxveW1lbnQgdG9vbCB3aGljaCBjcmVhdGVzIGdlbmVyaWMgRUpCIGphcnMuIEdlbmVyaWMgamFycyBjb250YWlucworICogb25seSB0aG9zZSBjbGFzc2VzIGFuZCBNRVRBLUlORiBlbnRyaWVzIHNwZWNpZmllZCBpbiB0aGUgRUpCIDEuMSBzdGFuZGFyZAorICoKKyAqIFRoaXMgY2xhc3MgaXMgYWxzbyB1c2VkIGFzIGEgZnJhbWV3b3JrIGZvciB0aGUgY3JlYXRpb24gb2YgdmVuZG9yIHNwZWNpZmljCisgKiBkZXBsb3ltZW50IHRvb2xzLiBBIG51bWJlciBvZiB0ZW1wbGF0ZSBtZXRob2RzIGFyZSBwcm92aWRlZCB0aHJvdWdoIHdoaWNoIHRoZQorICogdmVuZG9yIHNwZWNpZmljIHRvb2wgY2FuIGhvb2sgaW50byB0aGUgRUpCIGNyZWF0aW9uIHByb2Nlc3MuCisgKgorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0RlcGxveW1lbnRUb29sIGltcGxlbWVudHMgRUpCRGVwbG95bWVudFRvb2wgeworICAgIC8qKiBUaGUgZGVmYXVsdCBidWZmZXIgYnl0ZSBzaXplIHRvIHVzZSBmb3IgSU8gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gMTAyNDsKKyAgICAvKiogVGhlIGxldmVsIHRvIHVzZSBmb3IgY29tcHJlc3Npb24gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVJfQ09NUFJFU1NfTEVWRUwgID0gOTsKKworICAgIC8qKiBUaGUgc3RhbmRhcmQgTUVUQS1JTkYgZGlyZWN0b3J5IGluIGphciBmaWxlcyAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfRElSICA9ICJNRVRBLUlORi8iOworCisgICAgLyoqIFRoZSBzdGFuZGFyZCBNQU5JRkVTVCBmaWxlICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1QgID0gTUVUQV9ESVIgKyAiTUFOSUZFU1QuTUYiOworCisgICAgLyoqIE5hbWUgZm9yIEVKQiBEZXBsb3ltZW50IGRlc2NyaXB0b3Igd2l0aGluIEVKQiBqYXJzICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0REICAgID0gImVqYi1qYXIueG1sIjsKKworICAgIC8qKiBBIGRlcGVuZGVuY3kgYW5hbHl6ZXIgbmFtZSB0byBmaW5kIGFuY2VzdG9yIGNsYXNzZXMgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkFMWVpFUl9TVVBFUiA9ICJzdXBlciI7CisgICAgLyoqIEEgZGVwZW5kZW5jeSBhbmFseXplciBuYW1lIHRvIGZpbmQgYWxsIHJlbGF0ZWQgY2xhc3NlcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQUxZWkVSX0ZVTEwgPSAiZnVsbCI7CisgICAgLyoqIEEgZGVwZW5kZW5jeSBhbmFseXplciBuYW1lIGZvciBubyBhbmFseXplciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQUxZWkVSX05PTkUgPSAibm9uZSI7CisKKyAgICAvKiogVGhlIGRlZmF1bHQgYW5hbHl6ZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FOQUxZWkVSID0gQU5BTFlaRVJfU1VQRVI7CisKKyAgICAvKiogVGhlIGFuYWx5emVyIGNsYXNzIGZvciB0aGUgc3VwZXIgYW5hbHl6ZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkFMWVpFUl9DTEFTU19TVVBFUgorICAgICAgICA9ICJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZC5iY2VsLkFuY2VzdG9yQW5hbHl6ZXIiOworICAgIC8qKiBUaGUgYW5hbHl6ZXIgY2xhc3MgZm9yIHRoZSBzdXBlciBhbmFseXplciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOQUxZWkVSX0NMQVNTX0ZVTEwKKyAgICAgICAgPSAib3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5kZXBlbmQuYmNlbC5GdWxsQW5hbHl6ZXIiOworCisgICAgLyoqCisgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgY29udGFpbmluZyB0YXNrLiBUaGlzIGNvbmZpZyBjb21iaW5lZAorICAgICAqIHdpdGggdGhlIHNldHRpbmdzIG9mIHRoZSBpbmRpdmlkdWFsIGF0dHJpYnV0ZXMgaGVyZSBjb25zdGl0dWVzIHRoZQorICAgICAqIGNvbXBsZXRlIGNvbmZpZyBmb3IgdGhpcyBkZXBsb3ltZW50IHRvb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBFamJKYXIuQ29uZmlnIGNvbmZpZzsKKworICAgIC8qKiBTdG9yZXMgYSBoYW5kbGUgdG8gdGhlIGRpcmVjdG9yeSB0byBwdXQgdGhlIEphciBmaWxlcyBpbiAqLworICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOworCisgICAgLyoqIFRoZSBjbGFzc3BhdGggdG8gdXNlIHdpdGggdGhpcyBkZXBsb3ltZW50IHRvb2wuIFRoaXMgaXMgYXBwZW5kZWQgdG8KKyAgICAgICAgYW55IHBhdGhzIGZyb20gdGhlIGVqYmphciB0YXNrIGl0c2VsZi4qLworICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGg7CisKKyAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBqYXJmaWxlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyaWNKYXJTdWZmaXggPSAiLWdlbmVyaWMuamFyIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0YXNrIHRvIHdoaWNoIHRoaXMgdG9vbCBiZWxvbmdzLiBUaGlzIGlzIHVzZWQgdG8gYWNjZXNzIHNlcnZpY2VzCisgICAgICogcHJvdmlkZWQgYnkgdGhlIGFudCBjb3JlLCBzdWNoIGFzIGxvZ2dpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBUYXNrIHRhc2s7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3Nsb2FkZXIgZ2VuZXJhdGVkIGZyb20gdGhlIGdpdmVuIGNsYXNzcGF0aCB0byBsb2FkCisgICAgICogdGhlIHN1cGVyIGNsYXNzZXMgYW5kIHN1cGVyIGludGVyZmFjZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc3BhdGhMb2FkZXIgPSBudWxsOworCisgICAgIC8qKgorICAgICAqIFNldCBvZiBmaWxlcyBoYXZlIGJlZW4gbG9hZGVkIGludG8gdGhlIEVKQiBqYXIKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldCBhZGRlZGZpbGVzOworCisgICAgLyoqCisgICAgICogSGFuZGxlciB1c2VkIHRvIHBhcnNlIHRoZSBFSkIgWE1MIGRlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBwcml2YXRlIERlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXI7CisKKyAgICAvKioKKyAgICAgKiBEZXBlbmRlbmN5IGFuYWx5emVyIHVzZWQgdG8gY29sbGVjdCBjbGFzcyBkZXBlbmRlbmNpZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIERlcGVuZGVuY3lBbmFseXplciBkZXBlbmRlbmN5QW5hbHl6ZXI7CisKKyAgICAvKiogTm8gYXJnIGNvbnN0cnVjdG9yICovCisgICAgcHVibGljIEdlbmVyaWNEZXBsb3ltZW50VG9vbCgpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5OyByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gaW5EaXIgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZGlyKEZpbGUgaW5EaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gaW5EaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCBFSkIgamFycyBhcmUgdG8gYmUgd3JpdHRlbgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGdldERlc3REaXIoKSB7CisgICAgICAgIHJldHVybiBkZXN0RGlyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0YXNrIHdoaWNoIG93bnMgdGhpcyB0b29sCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFzayB0aGUgVGFzayB0byB3aGljaCB0aGlzIGRlcGxveW1lbnQgdG9vbCBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhc2soVGFzayB0YXNrKSB7CisgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0YXNrIGZvciB0aGlzIHRvb2wuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBUYXNrIGluc3RhbmNlIHRoaXMgdG9vbCBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIFRhc2sgZ2V0VGFzaygpIHsKKyAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBiYXNlbmFtZSB0ZXJtaW5hdG9yLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlamJqYXIgdGFzayBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIEVqYkphci5Db25maWcgZ2V0Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIGlmIHRoaXMgYnVpbGQgaXMgdXNpbmcgdGhlIGJhc2UgamFyIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBqYXIgaXMgY29taW5nIGZyb20gdGhlCisgICAgICogICAgICAgICAgICAgIGJhc2VqYXJuYW1lIGF0dHJpYnV0ZQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVzaW5nQmFzZUphck5hbWUoKSB7CisgICAgICAgIHJldHVybiBjb25maWcuYmFzZUphck5hbWUgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBqYXIgZmlsZS4KKyAgICAgKiBAcGFyYW0gaW5TdHJpbmcgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHN1ZmZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmljSmFyU3VmZml4KFN0cmluZyBpblN0cmluZykgeworICAgICAgICB0aGlzLmdlbmVyaWNKYXJTdWZmaXggPSBpblN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHVzZXIgY2xhc3NlcworICAgICAqCisgICAgICogQHJldHVybiBhIFBhdGggaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZCBieSBBbnQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHRhc2suZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgYnVpbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2xhc3NwYXRoIGJ5IGNvbWJpbmluZyB0aGUgb25lIGZyb20gdGhlIHN1cnJvdW5kaW5nIHRhc2ssIGlmIGFueQorICAgICAqIGFuZCB0aGUgb25lIGZyb20gdGhpcyB0b29sLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29tYmluZWQgY2xhc3NwYXRoCisgICAgICovCisgICAgcHJvdGVjdGVkIFBhdGggZ2V0Q29tYmluZWRDbGFzc3BhdGgoKSB7CisgICAgICAgIFBhdGggY29tYmluZWRQYXRoID0gY2xhc3NwYXRoOworICAgICAgICBpZiAoY29uZmlnLmNsYXNzcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29tYmluZWRQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb21iaW5lZFBhdGggPSBjb25maWcuY2xhc3NwYXRoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21iaW5lZFBhdGguYXBwZW5kKGNvbmZpZy5jbGFzc3BhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbWJpbmVkUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBBbnQgb3V0cHV0LgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLgorICAgICAqIEBwYXJhbSBsZXZlbCB0aGUgc2V2ZXJpdHkgb2YgdGhpcyBtZXNzYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxldmVsKSB7CisgICAgICAgIGdldFRhc2soKS5sb2cobWVzc2FnZSwgbGV2ZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYnVpbGQgZmlsZSBsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50J3MgdGFzay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRhc2sncyBsb2NhdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7CisgICAgICAgIHJldHVybiBnZXRUYXNrKCkuZ2V0TG9jYXRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5hbHl6ZXIoKSB7CisgICAgICAgIFN0cmluZyBhbmFseXplciA9IGNvbmZpZy5hbmFseXplcjsKKyAgICAgICAgaWYgKGFuYWx5emVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGFuYWx5emVyID0gREVGQVVMVF9BTkFMWVpFUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhbmFseXplci5lcXVhbHMoQU5BTFlaRVJfTk9ORSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBhbmFseXplckNsYXNzTmFtZSA9IG51bGw7CisgICAgICAgIGlmIChhbmFseXplci5lcXVhbHMoQU5BTFlaRVJfU1VQRVIpKSB7CisgICAgICAgICAgICBhbmFseXplckNsYXNzTmFtZSA9IEFOQUxZWkVSX0NMQVNTX1NVUEVSOworICAgICAgICB9IGVsc2UgaWYgKGFuYWx5emVyLmVxdWFscyhBTkFMWVpFUl9GVUxMKSkgeworICAgICAgICAgICAgYW5hbHl6ZXJDbGFzc05hbWUgPSBBTkFMWVpFUl9DTEFTU19GVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW5hbHl6ZXJDbGFzc05hbWUgPSBhbmFseXplcjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBhbmFseXplckNsYXNzID0gQ2xhc3MuZm9yTmFtZShhbmFseXplckNsYXNzTmFtZSk7CisgICAgICAgICAgICBkZXBlbmRlbmN5QW5hbHl6ZXIKKyAgICAgICAgICAgICAgICA9IChEZXBlbmRlbmN5QW5hbHl6ZXIpIGFuYWx5emVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGRlcGVuZGVuY3lBbmFseXplci5hZGRDbGFzc1BhdGgobmV3IFBhdGgodGFzay5nZXRQcm9qZWN0KCksCisgICAgICAgICAgICAgICAgY29uZmlnLnNyY0Rpci5nZXRQYXRoKCkpKTsKKyAgICAgICAgICAgIGRlcGVuZGVuY3lBbmFseXplci5hZGRDbGFzc1BhdGgoY29uZmlnLmNsYXNzcGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKKyAgICAgICAgICAgIGRlcGVuZGVuY3lBbmFseXplciA9IG51bGw7CisgICAgICAgICAgICB0YXNrLmxvZygiVW5hYmxlIHRvIGxvYWQgZGVwZW5kZW5jeSBhbmFseXplcjogIiArIGFuYWx5emVyQ2xhc3NOYW1lCisgICAgICAgICAgICAgICAgKyAiIC0gZGVwZW5kZW50IGNsYXNzIG5vdCBmb3VuZDogIiArIGUuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZGVwZW5kZW5jeUFuYWx5emVyID0gbnVsbDsKKyAgICAgICAgICAgIHRhc2subG9nKCJVbmFibGUgdG8gbG9hZCBkZXBlbmRlbmN5IGFuYWx5emVyOiAiICsgYW5hbHl6ZXJDbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgICsgIiAtIGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhpcyB0b29sIGZvciB1c2UgaW4gdGhlIGVqYmphciB0YXNrLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBzdXJyb3VuZGluZyBlamJqYXIgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoRWpiSmFyLkNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisKKyAgICAgICAgY3JlYXRlQW5hbHl6ZXIoKTsKKyAgICAgICAgY2xhc3NwYXRoTG9hZGVyID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgbG9naWMgb2YgYWRkaW5nIGEgZmlsZSBlbnRyeSB0bworICAgICAqIGEgLmphciBmaWxlLiAgVXNlZCBieSBleGVjdXRlKCkgdG8gYWRkIGVudHJpZXMgdG8gdGhlIGphciBmaWxlIGFzIGl0IGlzCisgICAgICogY29uc3RydWN0ZWQuCisgICAgICogQHBhcmFtIGpTdHJlYW0gQSBKYXJPdXRwdXRTdHJlYW0gaW50byB3aGljaCB0byB3cml0ZSB0aGUKKyAgICAgKiAgICAgICAgamFyIGVudHJ5LgorICAgICAqIEBwYXJhbSBpbnB1dEZpbGUgQSBGaWxlIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUKKyAgICAgKiAgICAgICAgY29udGVudHMgdGhlIGZpbGUgYmVpbmcgYWRkZWQuCisgICAgICogQHBhcmFtIGxvZ2ljYWxGaWxlbmFtZSBBIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUsIGluY2x1ZGluZworICAgICAqICAgICAgICBhbGwgcmVsZXZhbnQgcGF0aCBpbmZvcm1hdGlvbiwgdGhhdCBzaG91bGQgYmUgc3RvcmVkIGZvciB0aGUgZW50cnkKKyAgICAgKiAgICAgICAgYmVpbmcgYWRkZWQuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkRmlsZVRvSmFyKEphck91dHB1dFN0cmVhbSBqU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGlucHV0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZ2ljYWxGaWxlbmFtZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlTdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFhZGRlZGZpbGVzLmNvbnRhaW5zKGxvZ2ljYWxGaWxlbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgemlwIGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIGphciBmaWxlCisgICAgICAgICAgICAgICAgWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkobG9naWNhbEZpbGVuYW1lLnJlcGxhY2UoJ1xcJywgJy8nKSk7CisgICAgICAgICAgICAgICAgalN0cmVhbS5wdXROZXh0RW50cnkoemlwRW50cnkpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWxlIGlucHV0IHN0cmVhbSwgYW5kIGJ1ZmZlciBldmVyeXRoaW5nIG92ZXIKKyAgICAgICAgICAgICAgICAvLyB0byB0aGUgamFyIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICBieXRlW10gYnl0ZUJ1ZmZlciA9IG5ldyBieXRlWzIgKiBERUZBVUxUX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgalN0cmVhbS53cml0ZShieXRlQnVmZmVyLCAwLCBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gaVN0cmVhbS5yZWFkKGJ5dGVCdWZmZXIsIDAsIGJ5dGVCdWZmZXIubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAtMSk7CisKKyAgICAgICAgICAgICAgICAvL2FkZCBpdCB0byBsaXN0IG9mIGZpbGVzIGluIGphcgorICAgICAgICAgICAgICAgIGFkZGVkZmlsZXMuYWRkKGxvZ2ljYWxGaWxlbmFtZSk7CisgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBsb2coIldBUk5JTkc6IElPRXhjZXB0aW9uIHdoaWxlIGFkZGluZyBlbnRyeSAiCisgICAgICAgICAgICAgICAgKyBsb2dpY2FsRmlsZW5hbWUgKyAiIHRvIGphcmZpbGUgZnJvbSAiCisgICAgICAgICAgICAgICAgKyBpbnB1dEZpbGUuZ2V0UGF0aCgpICsgIiAiICArIGlvZS5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICsgIi0iICsgaW9lLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBDbG9zZSB1cCB0aGUgZmlsZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBjbGFzcyBmaWxlCisgICAgICAgICAgICBpZiAoaVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaVN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGNsb3NlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGRlc2NyaXB0aW9uSGFuZGxlci4KKyAgICAgKiBAcGFyYW0gc3JjRGlyIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4gYSBoYW5kbGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBEZXNjcmlwdG9ySGFuZGxlciBnZXREZXNjcmlwdG9ySGFuZGxlcihGaWxlIHNyY0RpcikgeworICAgICAgICBEZXNjcmlwdG9ySGFuZGxlciBoID0gbmV3IERlc2NyaXB0b3JIYW5kbGVyKGdldFRhc2soKSwgc3JjRGlyKTsKKworICAgICAgICByZWdpc3Rlcktub3duRFREcyhoKTsKKworICAgICAgICAvLyByZWdpc3RlciBhbnkgRFREcyBzdXBwbGllZCBieSB0aGUgdXNlcgorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDb25maWcoKS5kdGRMb2NhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBFamJKYXIuRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPSAoRWpiSmFyLkRURExvY2F0aW9uKSBpLm5leHQoKTsKKyAgICAgICAgICAgIGgucmVnaXN0ZXJEVEQoZHRkTG9jYXRpb24uZ2V0UHVibGljSWQoKSwgZHRkTG9jYXRpb24uZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIGxvY2F0aW9ucyBvZiBhbGwga25vd24gRFREcy4KKyAgICAgKgorICAgICAqIHZlbmRvci1zcGVjaWZpYyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBkZWZpbmUKKyAgICAgKiB0aGUgdmVuZG9yLXNwZWNpZmljIGxvY2F0aW9ucyBvZiB0aGUgRUpCIERURHMKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBubyB1c2VkIGluIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJLbm93bkRURHMoRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAvLyBub25lIHRvIHJlZ2lzdGVyIGZvciBnZW5lcmljCisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc0Rlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSwgU0FYUGFyc2VyIHNheFBhcnNlcikgeworCisgICAgICAgIGNoZWNrQ29uZmlndXJhdGlvbihkZXNjcmlwdG9yRmlsZU5hbWUsIHNheFBhcnNlcik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhhbmRsZXIgPSBnZXREZXNjcmlwdG9ySGFuZGxlcihjb25maWcuc3JjRGlyKTsKKworICAgICAgICAgICAgLy8gUmV0cml2ZSB0aGUgZmlsZXMgdG8gYmUgYWRkZWQgdG8gSkFSIGZyb20gRUpCIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIEhhc2h0YWJsZSBlamJGaWxlcyA9IHBhcnNlRWpiRmlsZXMoZGVzY3JpcHRvckZpbGVOYW1lLCBzYXhQYXJzZXIpOworCisgICAgICAgICAgICAvLyBBZGQgYW55IHN1cHBvcnQgY2xhc3NlcyBzcGVjaWZpZWQgaW4gdGhlIGJ1aWxkIGZpbGUKKyAgICAgICAgICAgIGFkZFN1cHBvcnRDbGFzc2VzKGVqYkZpbGVzKTsKKworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBKQVIgZmlsZW5hbWUgKHdpdGhvdXQgZmlsZW5hbWUgZXh0ZW5zaW9uKQorICAgICAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gZ2V0SmFyQmFzZU5hbWUoZGVzY3JpcHRvckZpbGVOYW1lKTsKKworICAgICAgICAgICAgU3RyaW5nIGRkUHJlZml4ID0gZ2V0VmVuZG9yRERQcmVmaXgoYmFzZU5hbWUsIGRlc2NyaXB0b3JGaWxlTmFtZSk7CisKKyAgICAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gZ2V0TWFuaWZlc3RGaWxlKGRkUHJlZml4KTsKKyAgICAgICAgICAgIGlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChNQU5JRkVTVCwgbWFuaWZlc3RGaWxlKTsKKyAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgICAgIC8vIEZpcnN0IHRoZSByZWd1bGFyIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgRUpCX0RELAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGNvbmZpZy5kZXNjcmlwdG9yRGlyLCBkZXNjcmlwdG9yRmlsZU5hbWUpKTsKKworICAgICAgICAgICAgLy8gbm93IHRoZSB2ZW5kb3Igc3BlY2lmaWMgZmlsZXMsIGlmIGFueQorICAgICAgICAgICAgYWRkVmVuZG9yRmlsZXMoZWpiRmlsZXMsIGRkUHJlZml4KTsKKworICAgICAgICAgICAgLy8gYWRkIGFueSBkZXBlbmRlbnQgZmlsZXMKKyAgICAgICAgICAgIGNoZWNrQW5kQWRkRGVwZW5kYW50cyhlamJGaWxlcyk7CisKKyAgICAgICAgICAgIC8vIExhc3RseSBjcmVhdGUgRmlsZSBvYmplY3QgZm9yIHRoZSBKYXIgZmlsZXMuIElmIHdlIGFyZSB1c2luZworICAgICAgICAgICAgLy8gYSBmbGF0IGRlc3RpbmF0aW9uIGRpciwgdGhlbiB3ZSBuZWVkIHRvIHJlZGVmaW5lIGJhc2VOYW1lIQorICAgICAgICAgICAgaWYgKGNvbmZpZy5mbGF0RGVzdERpciAmJiBiYXNlTmFtZS5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0TmFtZSA9IGJhc2VOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnROYW1lID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TmFtZSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGVuZE5hbWUgICA9IGJhc2VOYW1lLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyaW5nKHN0YXJ0TmFtZSwgZW5kTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGUgamFyRmlsZSA9IGdldFZlbmRvck91dHB1dEphckZpbGUoYmFzZU5hbWUpOworCisKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIGEgYnVpbGQgYW5kIHN0YXJ0IGRvaW5nIHRoZSB3b3JrIQorICAgICAgICAgICAgaWYgKG5lZWRUb1JlYnVpbGQoZWpiRmlsZXMsIGphckZpbGUpKSB7CisgICAgICAgICAgICAgICAgLy8gTG9nIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGJ1aWxkLi4uCisgICAgICAgICAgICAgICAgbG9nKCJidWlsZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGphckZpbGUuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZy52YWx1ZU9mKGVqYkZpbGVzLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmaWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPKTsKKworICAgICAgICAgICAgICAgIC8vIFVzZSBoZWxwZXIgbWV0aG9kIHRvIHdyaXRlIHRoZSBqYXJmaWxlCisgICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lkID0gZ2V0UHVibGljSWQoKTsKKyAgICAgICAgICAgICAgICB3cml0ZUphcihiYXNlTmFtZSwgamFyRmlsZSwgZWpiRmlsZXMsIHB1YmxpY0lkKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBMb2cgdGhhdCB0aGUgZmlsZSBpcyB1cCB0byBkYXRlLi4uCisgICAgICAgICAgICAgICAgbG9nKGphckZpbGUudG9TdHJpbmcoKSArICIgaXMgdXAgdG8gZGF0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlNBWEV4Y2VwdGlvbiB3aGlsZSBwYXJzaW5nICciCisgICAgICAgICAgICAgICAgKyBkZXNjcmlwdG9yRmlsZU5hbWUKKyAgICAgICAgICAgICAgICArICInLiBUaGlzIHByb2JhYmx5IGluZGljYXRlcyBiYWRseS1mb3JtZWQgWE1MLiIKKyAgICAgICAgICAgICAgICArICIgIERldGFpbHM6ICIKKyAgICAgICAgICAgICAgICArIHNlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIHNlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIklPRXhjZXB0aW9uIHdoaWxlIHBhcnNpbmcnIgorICAgICAgICAgICAgICAgICsgZGVzY3JpcHRvckZpbGVOYW1lCisgICAgICAgICAgICAgICAgKyAiJy4gIFRoaXMgcHJvYmFibHkgaW5kaWNhdGVzIHRoYXQgdGhlIGRlc2NyaXB0b3IiCisgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3QgZXhpc3QuIERldGFpbHM6ICIKKyAgICAgICAgICAgICAgICArIGlvZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHRoZSBmaXJzdCBzdGVwIGluIHRoZSBwcm9jZXNzRGVzY3JpcHRvciBtZXRob2QKKyAgICAgKiB0byBhbGxvdyB2ZW5kb3Itc3BlY2lmaWMgc3ViY2xhc3NlcyB0byB2YWxpZGF0ZSB0aGUgdGFzayBjb25maWd1cmF0aW9uCisgICAgICogcHJpb3IgdG8gcHJvY2Vzc2luZyB0aGUgZGVzY3JpcHRvci4gIElmIHRoZSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQsCisgICAgICogYSBCdWlsZEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2NyaXB0b3JGaWxlTmFtZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWUgb2YgYW4gRUpCCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBzYXhQYXJzZXIgICAgICAgICAgU0FYUGFyc2VyIHdoaWNoIG1heSBiZSB1c2VkIHRvIHBhcnNlIHRoZSBYTUwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb24oU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIHRoZSBHZW5lcmljRGVwbG95bWVudFRvb2wsIGRvIG5vdGhpbmcuICBWZW5kb3Igc3BlY2lmaWMKKyAgICAgICAgICogc3ViY2xhc3NlcyBzaG91bGQgdGhyb3cgYSBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBpcworICAgICAgICAgKiBpbnZhbGlkIGZvciB0aGVpciBzZXJ2ZXIuCisgICAgICAgICAqLworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIEVKQiBmaWxlcyBmb3VuZCB3aGVuIHRoZSBzcGVjaWZpZWQgRUpCCisgICAgICogZGVzY3JpcHRvciBpcyBwYXJzZWQgYW5kIHByb2Nlc3NlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yRmlsZU5hbWUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmlsZSBuYW1lIG9mIGFuIEVKQgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gc2F4UGFyc2VyICAgICAgICAgIFNBWFBhcnNlciB3aGljaCBtYXkgYmUgdXNlZCB0byBwYXJzZSB0aGUgWE1MCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgb2YgRUpCIGNsYXNzIChhbmQgb3RoZXIpIGZpbGVzIHRvIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCB0byB0aGUgY29tcGxldGVkIEpBUiBmaWxlCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gICAgICBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkgd3JhcHBpbmcgYW5vdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICBBbiBJT0V4Y2VwdGlvbiBmcm9tIHRoZSBwYXJzZXIsIHBvc3NpYmx5IGZyb20gYQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ5dGUgc3RyZWFtIG9yIGNoYXJhY3RlciBzdHJlYW0KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHBhcnNlRWpiRmlsZXMoU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSwgU0FYUGFyc2VyIHNheFBhcnNlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBkZXNjcmlwdG9yU3RyZWFtID0gbnVsbDsKKyAgICAgICAgSGFzaHRhYmxlIGVqYkZpbGVzID0gbnVsbDsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvKiBQYXJzZSB0aGUgZWpiIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFdoaWxlIGl0IG1heSBub3QKKyAgICAgICAgICAgICAqIGxvb2sgbGlrZSBtdWNoLCB3ZSB1c2UgYSBTQVhQYXJzZXIgYW5kIGFuIGlubmVyIGNsYXNzIHRvCisgICAgICAgICAgICAgKiBnZXQgaG9sZCBvZiBhbGwgdGhlIGNsYXNzZmlsZSBuYW1lcyBmb3IgdGhlIGRlc2NyaXB0b3IuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRlc2NyaXB0b3JTdHJlYW0KKyAgICAgICAgICAgICAgICA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoY29uZmlnLmRlc2NyaXB0b3JEaXIsIGRlc2NyaXB0b3JGaWxlTmFtZSkpOworICAgICAgICAgICAgc2F4UGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShkZXNjcmlwdG9yU3RyZWFtKSwgaGFuZGxlcik7CisKKyAgICAgICAgICAgIGVqYkZpbGVzID0gaGFuZGxlci5nZXRGaWxlcygpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvclN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvclN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGNsb3NlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlamJGaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFueSBjbGFzc2VzIHRoZSB1c2VyIHNwZWNpZmllcyB1c2luZyA8aT5zdXBwb3J0PC9pPiBuZXN0ZWQgZWxlbWVudHMKKyAgICAgKiB0byB0aGUgPGNvZGU+ZWpiRmlsZXM8L2NvZGU+IEhhc2h0YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlamJGaWxlcyBIYXNodGFibGUgb2YgRUpCIGNsYXNzZXMgKGFuZCBvdGhlcikgZmlsZXMgdGhhdCB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBjb21wbGV0ZWQgSkFSIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwb3J0Q2xhc3NlcyhIYXNodGFibGUgZWpiRmlsZXMpIHsKKyAgICAgICAgLy8gYWRkIGluIHN1cHBvcnQgY2xhc3NlcyBpZiBhbnkKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gdGFzay5nZXRQcm9qZWN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbmZpZy5zdXBwb3J0RmlsZVNldHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBGaWxlU2V0IHN1cHBvcnRGaWxlU2V0ID0gKEZpbGVTZXQpIGkubmV4dCgpOworICAgICAgICAgICAgRmlsZSBzdXBwb3J0QmFzZURpciA9IHN1cHBvcnRGaWxlU2V0LmdldERpcihwcm9qZWN0KTsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc3VwcG9ydFNjYW5uZXIgPSBzdXBwb3J0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOworICAgICAgICAgICAgc3VwcG9ydFNjYW5uZXIuc2NhbigpOworICAgICAgICAgICAgU3RyaW5nW10gc3VwcG9ydEZpbGVzID0gc3VwcG9ydFNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdXBwb3J0RmlsZXMubGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoc3VwcG9ydEZpbGVzW2pdLCBuZXcgRmlsZShzdXBwb3J0QmFzZURpciwgc3VwcG9ydEZpbGVzW2pdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVzaW5nIHRoZSBFSkIgZGVzY3JpcHRvciBmaWxlIG5hbWUgcGFzc2VkIGZyb20gdGhlIDxjb2RlPmVqYmphcjwvY29kZT4KKyAgICAgKiB0YXNrLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSAiYmFzZW5hbWUiIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBuYW1lIHRoZQorICAgICAqIGNvbXBsZXRlZCBKQVIgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yRmlsZU5hbWUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmlsZSBuYW1lIG9mIGFuIEVKQgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgIFRoZSAiYmFzZW5hbWUiIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBuYW1lIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkIEpBUiBmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRKYXJCYXNlTmFtZShTdHJpbmcgZGVzY3JpcHRvckZpbGVOYW1lKSB7CisKKyAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gIiI7CisKKyAgICAgICAgLy8gV29yayBvdXQgd2hhdCB0aGUgYmFzZSBuYW1lIGlzCisgICAgICAgIGlmIChjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpKSB7CisgICAgICAgICAgICBTdHJpbmcgY2Fub25pY2FsRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JGaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBjYW5vbmljYWxEZXNjcmlwdG9yLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBiYXNlTmFtZSA9IGRlc2NyaXB0b3JGaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJhc2VOYW1lICs9IGNvbmZpZy5iYXNlSmFyTmFtZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuREVTQ1JJUFRPUikpIHsKKyAgICAgICAgICAgIGludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBkZXNjcmlwdG9yRmlsZU5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOworICAgICAgICAgICAgaW50IGVuZEJhc2VOYW1lID0gLTE7CisgICAgICAgICAgICBpZiAobGFzdFNlcGFyYXRvckluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgZW5kQmFzZU5hbWUgPSBkZXNjcmlwdG9yRmlsZU5hbWUuaW5kZXhPZihjb25maWcuYmFzZU5hbWVUZXJtaW5hdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlcGFyYXRvckluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW5kQmFzZU5hbWUgPSBkZXNjcmlwdG9yRmlsZU5hbWUuaW5kZXhPZihjb25maWcuYmFzZU5hbWVUZXJtaW5hdG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVuZEJhc2VOYW1lICE9IC0xKSB7CisgICAgICAgICAgICAgICAgYmFzZU5hbWUgPSBkZXNjcmlwdG9yRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGVuZEJhc2VOYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGphciBuYW1lICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBkZXNjcmlwdG9yIFwiIiArIGRlc2NyaXB0b3JGaWxlTmFtZSArICJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKS5lcXVhbHMoRWpiSmFyLk5hbWluZ1NjaGVtZS5ESVJFQ1RPUlkpKSB7CisgICAgICAgICAgICBGaWxlIGRlc2NyaXB0b3JGaWxlID0gbmV3IEZpbGUoY29uZmlnLmRlc2NyaXB0b3JEaXIsIGRlc2NyaXB0b3JGaWxlTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRlc2NyaXB0b3JGaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgaW50IGxhc3RTZXBhcmF0b3JJbmRleAorICAgICAgICAgICAgICAgID0gcGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7CisgICAgICAgICAgICBpZiAobGFzdFNlcGFyYXRvckluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGRpcmVjdG9yeSBuYW1lIGhvbGRpbmcgZGVzY3JpcHRvciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGRpck5hbWUgPSBwYXRoLnN1YnN0cmluZygwLCBsYXN0U2VwYXJhdG9ySW5kZXgpOworICAgICAgICAgICAgaW50IGRpclNlcGFyYXRvckluZGV4ID0gZGlyTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7CisgICAgICAgICAgICBpZiAoZGlyU2VwYXJhdG9ySW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBkaXJOYW1lID0gZGlyTmFtZS5zdWJzdHJpbmcoZGlyU2VwYXJhdG9ySW5kZXggKyAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmFzZU5hbWUgPSBkaXJOYW1lOworICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKS5lcXVhbHMoRWpiSmFyLk5hbWluZ1NjaGVtZS5FSkJfTkFNRSkpIHsKKyAgICAgICAgICAgIGJhc2VOYW1lID0gaGFuZGxlci5nZXRFamJOYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJhc2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJlZml4IGZvciB2ZW5kb3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCBjb250YWluIHRoZSBwYXRoIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGRlc2NyaXB0b3IgbmFtZSwKKyAgICAgKiBkZXBlbmRpbmcgb24gdGhlIG5hbWluZyBzY2hlbWUKKyAgICAgKiBAcGFyYW0gYmFzZU5hbWUgdGhlIGJhc2UgbmFtZSB0byB1c2UuCisgICAgICogQHBhcmFtIGRlc2NyaXB0b3JGaWxlTmFtZSB0aGUgZmlsZSBuYW1lIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWZW5kb3JERFByZWZpeChTdHJpbmcgYmFzZU5hbWUsIFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUpIHsKKyAgICAgICAgU3RyaW5nIGRkUHJlZml4ID0gbnVsbDsKKworICAgICAgICBpZiAoY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhFamJKYXIuTmFtaW5nU2NoZW1lLkRFU0NSSVBUT1IpKSB7CisgICAgICAgICAgICBkZFByZWZpeCA9IGJhc2VOYW1lICsgY29uZmlnLmJhc2VOYW1lVGVybWluYXRvcjsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpCisgICAgICAgICAgICB8fCBjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuRUpCX05BTUUpCisgICAgICAgICAgICB8fCBjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuRElSRUNUT1JZKSkgeworICAgICAgICAgICAgU3RyaW5nIGNhbm9uaWNhbERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yRmlsZU5hbWUucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICAgICAgaW50IGluZGV4ID0gY2Fub25pY2FsRGVzY3JpcHRvci5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgZGRQcmVmaXggPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGRQcmVmaXggPSBkZXNjcmlwdG9yRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRkUHJlZml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbnkgdmVuZG9yIHNwZWNpZmljIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgKiBFSkIgSmFyLgorICAgICAqIEBwYXJhbSBlamJGaWxlcyBhIGhhc2h0YWJsZSBlbnRyeW5hbWUgLT4gZmlsZS4KKyAgICAgKiBAcGFyYW0gZGRQcmVmaXggYSBwcmVmaXggdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7CisgICAgICAgIC8vIG5vdGhpbmcgdG8gYWRkIGZvciBnZW5lcmljIHRvb2wuCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZlbmRvciBzcGVjaWZpYyBuYW1lIG9mIHRoZSBKYXIgdGhhdCB3aWxsIGJlIG91dHB1dC4gVGhlIG1vZGlmaWNhdGlvbiBkYXRlCisgICAgICogb2YgdGhpcyBqYXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIGRlcGVuZGVudCBiZWFuIGNsYXNzZXMuCisgICAgICogQHBhcmFtIGJhc2VOYW1lIHRoZSBiYXNlbmFtZSB0byB1c2UuCisgICAgICovCisgICAgRmlsZSBnZXRWZW5kb3JPdXRwdXRKYXJGaWxlKFN0cmluZyBiYXNlTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGVzdERpciwgYmFzZU5hbWUgKyBnZW5lcmljSmFyU3VmZml4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhlIHRpbWVzdGFtcCBvbiBlYWNoIGZpbGUgbGlzdGVkIGluIHRoZSA8Y29kZT4KKyAgICAgKiBlamJGaWxlczwvY29kZT4gYW5kIGNvbXBhcmVzIHRoZW0gdG8gdGhlIHRpbWVzdGFtcCBvbiB0aGUgPGNvZGU+amFyRmlsZQorICAgICAqIDwvY29kZT4uICBJZiB0aGUgPGNvZGU+amFyRmlsZTwvY29kZT4ncyB0aW1lc3RhbXAgaXMgbW9yZSByZWNlbnQgdGhhbgorICAgICAqIGVhY2ggRUpCIGZpbGUsIDxjb2RlPnRydWU8L2NvZGU+IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCA8Y29kZT5mYWxzZQorICAgICAqIDwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICogVE9ETzogZmluZCBhIHdheSB0byBjaGVjayB0aGUgbWFuaWZlc3QtZmlsZSwgdGhhdCBpcyBmb3VuZCBieSBuYW1pbmcgY29udmVudGlvbgorICAgICAqCisgICAgICogQHBhcmFtIGVqYkZpbGVzIEhhc2h0YWJsZSBvZiBFSkIgY2xhc3NlcyAoYW5kIG90aGVyKSBmaWxlcyB0aGF0IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGNvbXBsZXRlZCBKQVIgZmlsZQorICAgICAqIEBwYXJhbSBqYXJGaWxlICBKQVIgZmlsZSB3aGljaCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBFSkIgY2xhc3NlcyAoYW5kCisgICAgICogICAgICAgICAgICAgICAgIG90aGVyKSBmaWxlcworICAgICAqIEByZXR1cm4gICAgICAgICBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIDxjb2RlPmphckZpbGU8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgIGlzIHVwIHRvIGRhdGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkVG9SZWJ1aWxkKEhhc2h0YWJsZSBlamJGaWxlcywgRmlsZSBqYXJGaWxlKSB7CisgICAgICAgIGlmIChqYXJGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBsb25nIGxhc3RCdWlsZCA9IGphckZpbGUubGFzdE1vZGlmaWVkKCk7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGZpbGVJdGVyID0gZWpiRmlsZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKworICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBmaWxlcyBzZWVpbmcgaWYgYW55IGhhcyBiZWVuIHRvdWNoZWQKKyAgICAgICAgICAgIC8vIG1vcmUgcmVjZW50bHkgdGhhbiB0aGUgZGVzdGluYXRpb24gamFyLgorICAgICAgICAgICAgd2hpbGUgKGZpbGVJdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEZpbGUgY3VycmVudEZpbGUgPSAoRmlsZSkgZmlsZUl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChsYXN0QnVpbGQgPCBjdXJyZW50RmlsZS5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkJ1aWxkIG5lZWRlZCBiZWNhdXNlICIgKyBjdXJyZW50RmlsZS5nZXRQYXRoKCkgKyAiIGlzIG91dCBvZiBkYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBQdWJsaWMgSUQgb2YgdGhlIERURCBzcGVjaWZpZWQgaW4gdGhlIEVKQiBkZXNjcmlwdG9yLiAgTm90CisgICAgICogZXZlcnkgdmVuZG9yLXNwZWNpZmljIDxjb2RlPkRlcGxveW1lbnRUb29sPC9jb2RlPiB3aWxsIG5lZWQgdG8gcmVmZXJlbmNlCisgICAgICogdGhpcyB2YWx1ZSBvciBtYXkgd2FudCB0byBkZXRlcm1pbmUgdGhpcyB2YWx1ZSBpbiBhIHZlbmRvci1zcGVjaWZpYyB3YXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFB1YmxpYyBJRCBvZiB0aGUgRFREIHNwZWNpZmllZCBpbiB0aGUgRUpCIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0UHVibGljSWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1hbmlmZXRzIGZpbGUgdG8gdXNlIGZvciBidWlsZGluZyB0aGUgZ2VuZXJpYyBqYXIuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCB0aGUgZ2xvYmFsIG1hbmlmZXN0IGZyb20gdGhlIGNvbmZpZyBpcyB1c2VkCisgICAgICogb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IEFudCBtYW5pZmVzdCB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBwcmVmaXggd2hlcmUgdG8gbGxvb2sgZm9yIHRoZSBtYW5pZmVzdCBmaWxlIGJhc2VkIG9uCisgICAgICogICAgICAgIHRoZSBuYW1pbmcgY29udmVudGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1hbmlmZXN0IGZpbGUgb3IgbnVsbCBpZiB0aGUgbWFuaWZlc3QgZmlsZSBkb2VzIG5vdCBleGlzdAorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGdldE1hbmlmZXN0RmlsZShTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlCisgICAgICAgICAgICA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsIHByZWZpeCArICJtYW5pZmVzdC5tZiIpOworICAgICAgICBpZiAobWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gbWFuaWZlc3RGaWxlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tYW5pZmVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY29uZmlnLm1hbmlmZXN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSB3cml0aW5nIG9mIHRoZSBKQVIgZmlsZS4gSXRlcmF0ZXMgb3ZlciB0aGUKKyAgICAgKiBmaWxlbmFtZXMvamF2YS5pby5GaWxlcyBpbiB0aGUgSGFzaHRhYmxlIHN0b3JlZCBvbiB0aGUgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgKiBlamJGaWxlcy4KKyAgICAgKiBAcGFyYW0gYmFzZU5hbWUgdGhlIGJhc2UgbmFtZSB0byB1c2UuCisgICAgICogQHBhcmFtIGphcmZpbGUgIHRoZSBqYXIgZmlsZSB0byB3cml0ZSB0by4KKyAgICAgKiBAcGFyYW0gZmlsZXMgICAgdGhlIGZpbGVzIHRvIHdyaXRlIHRvIHRoZSBqYXIuCisgICAgICogQHBhcmFtIHB1YmxpY0lkIHRoZSBpZCB0byB1c2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVKYXIoU3RyaW5nIGJhc2VOYW1lLCBGaWxlIGphcmZpbGUsIEhhc2h0YWJsZSBmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHVibGljSWQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgSmFyT3V0cHV0U3RyZWFtIGphclN0cmVhbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjbGVhbiB0aGUgYWRkZWRmaWxlcyBzZXQKKyAgICAgICAgICAgIGlmIChhZGRlZGZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRlZGZpbGVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkZWRmaWxlcy5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB0aGUgamFyZmlsZSBhbHJlYWR5IGV4aXN0cyB0aGVuIHdoYWNrIGl0IGFuZCByZWNyZWF0ZSBpdC4KKyAgICAgICAgICAgICAqIFNob3VsZCBwcm9iYWJseSB0aGluayBvZiBhIG1vcmUgZWxlZ2FudCB3YXkgdG8gaGFuZGxlIHRoaXMKKyAgICAgICAgICAgICAqIHNvIHRoYXQgaW4gY2FzZSBvZiBlcnJvcnMgd2UgZG9uJ3QgbGVhdmUgcGVvcGxlIHdvcnNlIG9mZgorICAgICAgICAgICAgICogdGhhbiB3aGVuIHdlIHN0YXJ0ZWQgPSkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGphcmZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBqYXJmaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgamFyZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CisgICAgICAgICAgICBqYXJmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoTUFOSUZFU1QpOworICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCAmJiBtYW5pZmVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0RmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRNYW5pZmVzdCA9ICIvb3JnL2FwYWNoZS90b29scy9hbnQvZGVmYXVsdE1hbmlmZXN0Lm1mIjsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShkZWZhdWx0TWFuaWZlc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGVmYXVsdCBtYW5pZmVzdDogIiArIGRlZmF1bHRNYW5pZmVzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpbik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uICgiVW5hYmxlIHRvIHJlYWQgbWFuaWZlc3QiLCBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc3RyZWFtcyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIGphcmZpbGUKKworICAgICAgICAgICAgamFyU3RyZWFtID0gbmV3IEphck91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShqYXJmaWxlKSwgbWFuaWZlc3QpOworICAgICAgICAgICAgamFyU3RyZWFtLnNldE1ldGhvZChKYXJPdXRwdXRTdHJlYW0uREVGTEFURUQpOworCisgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBjbGFzcyBmaWxlcyBmb3VuZCBhbmQgYWRkIHRoZW0gdG8gdGhlIGphcgorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBlbnRyeUl0ZXJhdG9yID0gZmlsZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgZW50cnlJdGVyYXRvci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZSA9IChTdHJpbmcpIGVudHJ5SXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUuZXF1YWxzKE1BTklGRVNUKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBGaWxlIGVudHJ5RmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoZW50cnlOYW1lKTsKKworICAgICAgICAgICAgICAgIGxvZygiYWRkaW5nIGZpbGUgJyIgKyBlbnRyeU5hbWUgKyAiJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgICAgIGFkZEZpbGVUb0phcihqYXJTdHJlYW0sIGVudHJ5RmlsZSwgZW50cnlOYW1lKTsKKworICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBhcmUgYW55IGlubmVyIGNsYXNzZXMgZm9yIHRoaXMgY2xhc3MgYW5kIGFkZCB0aGVtIGluIGlmIHRoZXJlIGFyZQorICAgICAgICAgICAgICAgIElubmVyQ2xhc3NGaWxlbmFtZUZpbHRlciBmbHQgPSBuZXcgSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyKGVudHJ5RmlsZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIEZpbGUgZW50cnlEaXIgPSBlbnRyeUZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGlubmVyZmlsZXMgPSBlbnRyeURpci5saXN0KGZsdCk7CisgICAgICAgICAgICAgICAgaWYgKGlubmVyZmlsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IGlubmVyZmlsZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGFuZCBjbGVhbiB1cCBpbm5lcmNsYXNzIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbnRyeUluZGV4ID0gZW50cnlOYW1lLmxhc3RJbmRleE9mKGVudHJ5RmlsZS5nZXROYW1lKCkpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZSA9IGlubmVyZmlsZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZSA9IGVudHJ5TmFtZS5zdWJzdHJpbmcoMCwgZW50cnlJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBpbm5lcmZpbGVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlGaWxlID0gbmV3IEZpbGUoY29uZmlnLnNyY0RpciwgZW50cnlOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJhZGRpbmcgaW5uZXJjbGFzcyBmaWxlICciICsgZW50cnlOYW1lICsgIiciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmlsZVRvSmFyKGphclN0cmVhbSwgZW50cnlGaWxlLCBlbnRyeU5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJT0V4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIGVqYi1qYXIgZmlsZSAnIgorICAgICAgICAgICAgICAgICsgamFyZmlsZS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgKyAiJy4gRGV0YWlsczogIgorICAgICAgICAgICAgICAgICsgaW9lLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoamFyU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBqYXJTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBjbG9zZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vIGVuZCBvZiB3cml0ZUphcgorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYWxsIGF2YWlsYWJsZSBjbGFzc2VzLCB0aGF0IGRlcGVuZCBvbiBSZW1vdGUsIEhvbWUsIEJlYW4sIFBLCisgICAgICogQHBhcmFtIGNoZWNrRW50cmllcyBmaWxlcywgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQW5kQWRkRGVwZW5kYW50cyhIYXNodGFibGUgY2hlY2tFbnRyaWVzKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIGlmIChkZXBlbmRlbmN5QW5hbHl6ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZGVwZW5kZW5jeUFuYWx5emVyLnJlc2V0KCk7CisKKyAgICAgICAgSXRlcmF0b3IgaSA9IGNoZWNrRW50cmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBlbnRyeU5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChlbnRyeU5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGVudHJ5TmFtZS5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICAgICAgZW50cnlOYW1lLmxlbmd0aCgpIC0gIi5jbGFzcyIubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgnLycsICcuJyk7CisKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmN5QW5hbHl6ZXIuYWRkUm9vdENsYXNzKGNsYXNzTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFbnVtZXJhdGlvbiBlID0gZGVwZW5kZW5jeUFuYWx5emVyLmdldENsYXNzRGVwZW5kZW5jaWVzKCk7CisKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24KKyAgICAgICAgICAgICAgICA9IGNsYXNzbmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuY2xhc3MiOworICAgICAgICAgICAgRmlsZSBjbGFzc0ZpbGUgPSBuZXcgRmlsZShjb25maWcuc3JjRGlyLCBsb2NhdGlvbik7CisgICAgICAgICAgICBpZiAoY2xhc3NGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tFbnRyaWVzLnB1dChsb2NhdGlvbiwgY2xhc3NGaWxlKTsKKyAgICAgICAgICAgICAgICBsb2coImRlcGVuZGVudCBjbGFzczogIiArIGNsYXNzbmFtZSArICIgLSAiICsgY2xhc3NGaWxlLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIENsYXNzbG9hZGVyIG9iamVjdCB3aGljaCBwYXJzZXMgdGhlIHBhc3NlZCBpbiBnZW5lcmljIEVqYkphciBjbGFzc3BhdGguCisgICAgICogVGhlIGxvYWRlciBpcyB1c2VkIHRvIGR5bmFtaWNhbGx5IGxvYWQgY2xhc3NlcyBmcm9tIGphdmF4LmVqYi4qIGFuZCB0aGUgY2xhc3NlcworICAgICAqIGJlaW5nIGFkZGVkIHRvIHRoZSBqYXIuCisgICAgICogQHJldHVybiBhIGNsYXNzbG9hZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlckZvckJ1aWxkKCkgeworICAgICAgICBpZiAoY2xhc3NwYXRoTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc3BhdGhMb2FkZXI7CisgICAgICAgIH0KKworICAgICAgICBQYXRoIGNvbWJpbmVkQ2xhc3NwYXRoID0gZ2V0Q29tYmluZWRDbGFzc3BhdGgoKTsKKworICAgICAgICAvLyBvbmx5IGdlbmVyYXRlIGEgbmV3IENsYXNzTG9hZGVyIGlmIHdlIGhhdmUgYSBjbGFzc3BhdGgKKyAgICAgICAgaWYgKGNvbWJpbmVkQ2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aExvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aExvYWRlcgorICAgICAgICAgICAgICAgID0gZ2V0VGFzaygpLmdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjb21iaW5lZENsYXNzcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2xhc3NwYXRoTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSB0b29sIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIElmIHRoZSBEZXBsb3ltZW50IFRvb2wncyBjb25maWd1cmF0aW9uIGlzbid0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJlZCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoZGVzdERpciA9PSBudWxsKSB8fCAoIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQSB2YWxpZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInVzaW5nIHRoZSBcImRlc3RkaXJcIiBhdHRyaWJ1dGUuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXREZXBsb3ltZW50VG9vbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXREZXBsb3ltZW50VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGNhMGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldERlcGxveW1lbnRUb29sLmphdmEKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIgKGlBUykgNi4wIHN0dWJzIGFuZAorICogc2tlbGV0b25zIGFuZCBidWlsZCBhbiBFSkIgSmFyIGZpbGUuICBJdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggdGhlIEFudAorICogPGNvZGU+ZWpiamFyPC9jb2RlPiB0YXNrLiAgSWYgb25seSBzdHVicyBhbmQgc2tlbGV0b25zIG5lZWQgdG8gYmUgZ2VuZXJhdGVkCisgKiAoaW4gb3RoZXIgd29yZHMsIGlmIG5vIEpBUiBmaWxlIG5lZWRzIHRvIGJlIGNyZWF0ZWQpLCByZWZlciB0byB0aGUKKyAqIDxjb2RlPmlwbGFuZXQtZWpiYzwvY29kZT4gdGFzayBhbmQgdGhlIDxjb2RlPklQbGFuZXRFamJjVGFzazwvY29kZT4gY2xhc3MuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyOgorICogICA8dWw+CisgKiAgICAgPGxpPjxpPmRlc3RkaXI8L2k+IC0tIFRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgSkFSCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIHdpbGwgYmUgd3JpdHRlbi4gIEVhY2ggSkFSIGZpbGUgaXMgd3JpdHRlbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBkaXJlY3RvcmllcyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZWlyIGxvY2F0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgImRlc2NyaXB0b3JkaXIiIG5hbWVzcGFjZS4gIFRoaXMgaXMgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBhdHRyaWJ1dGUuCisgKiAgICAgPGxpPjxpPmNsYXNzcGF0aDwvaT4gLS0gVGhlIGNsYXNzcGF0aCB1c2VkIHdoZW4gZ2VuZXJhdGluZyBFSkIgc3R1YnMgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbGV0b25zLiAgVGhpcyBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21pdHRlZCwgdGhlIGNsYXNzcGF0aCBzcGVjaWZpZWQgaW4gdGhlICJlamJqYXIiCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IHRhc2sgd2lsbCBiZSB1c2VkKS4gIElmIHNwZWNpZmllZCwgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoIGVsZW1lbnRzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aCBzcGVjaWZpZWQgaW4gdGhlIHBhcmVudCAiZWpiamFyIiB0YXNrLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBuZXN0ZWQgImNsYXNzcGF0aCIgZWxlbWVudHMgbWF5IGFsc28gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkLgorICogICAgIDxsaT48aT5rZWVwZ2VuZXJhdGVkPC9pPiAtLSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIEphdmEgc291cmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgZWpiYyB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkIG9yIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4gIElmICJ5ZXMiLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc291cmNlIGZpbGVzIHdpbGwgYmUgcmV0YWluZWQuICBUaGlzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSAoaWYgb21pdHRlZCwgaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gIm5vIikuCisgKiAgICAgPGxpPjxpPmRlYnVnPC9pPiAtLSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGVqYmMgdXRpbGl0eSBzaG91bGQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHRvIHRoZSBzdGFuZGFyZAorICogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LiAgSWYgInllcyIsIHRoZSBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZCAoaWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIm5vIikuCisgKiAgICAgPGxpPjxpPmlhc2hvbWU8L2k+IC0tIE1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlICJob21lIiBkaXJlY3RvcnkgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaVBsYW5ldCBBcHBsaWNhdGlvbiBzZXJ2ZXIgaW5zdGFsbGF0aW9uLiAgVGhpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIHRvIGZpbmQgdGhlIGVqYmMgdXRpbGl0eSBpZiBpdCBpc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgdXNlcidzIHN5c3RlbSBwYXRoLiAgVGhpcyBpcyBhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBhdHRyaWJ1dGUgKGlmIHNwZWNpZmllZCwgaXQgc2hvdWxkIHJlZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5baW5zdGFsbC1sb2NhdGlvbl0vaXBsYW5ldC9pYXM2L2lhcworICogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvZGU+IGRpcmVjdG9yeSkuICBJZiBvbWl0dGVkLCB0aGUgZWpiYyB1dGlsaXR5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgb24gdGhlIHVzZXIncyBzeXN0ZW0gcGF0aC4KKyAqICAgICA8bGk+PGk+c3VmZml4PC9pPiAtLSBTdHJpbmcgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIEpBUiBmaWxlbmFtZSB3aGVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgZWFjaCBKQVIuICBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIi5qYXIiKS4KKyAqICAgPC91bD4KKyAqIDxwPgorICogRm9yIGVhY2ggRUpCIGRlc2NyaXB0b3IgZm91bmQgaW4gdGhlICJlamJqYXIiIHBhcmVudCB0YXNrLCB0aGlzIGRlcGxveW1lbnQKKyAqIHRvb2wgd2lsbCBsb2NhdGUgdGhlIHRocmVlIGNsYXNzZXMgdGhhdCBjb21wcmlzZSB0aGUgRUpCLiAgSWYgdGhlc2UgY2xhc3MKKyAqIGZpbGVzIGNhbm5vdCBiZSBsb2NhdGVkIGluIHRoZSBzcGVjaWZpZWQgPGNvZGU+c3JjZGlyPC9jb2RlPiBkaXJlY3RvcnksIHRoZQorICogdGFzayB3aWxsIGZhaWwuICBUaGUgdGFzayB3aWxsIGFsc28gYXR0ZW1wdCB0byBsb2NhdGUgdGhlIEVKQiBzdHVicyBhbmQKKyAqIHNrZWxldG9ucyBpbiB0aGlzIGRpcmVjdG9yeS4gIElmIGZvdW5kLCB0aGUgdGltZXN0YW1wcyBvbiB0aGUgc3R1YnMgYW5kCisgKiBza2VsZXRvbnMgd2lsbCBiZSBjaGVja2VkIHRvIGVuc3VyZSB0aGV5IGFyZSB1cCB0byBkYXRlLiAgT25seSBpZiB0aGVzZSBmaWxlcworICogY2Fubm90IGJlIGZvdW5kIG9yIGlmIHRoZXkgYXJlIG91dCBvZiBkYXRlIHdpbGwgZWpiYyBiZSBjYWxsZWQuCisgKgorICogQHNlZSAgICBJUGxhbmV0RWpiYworICovCitwdWJsaWMgY2xhc3MgSVBsYW5ldERlcGxveW1lbnRUb29sIGV4dGVuZHMgR2VuZXJpY0RlcGxveW1lbnRUb29sIHsKKworICAgIC8qIEF0dHJpYnV0ZXMgc2V0IGJ5IHRoZSBBbnQgYnVpbGQgZmlsZSAqLworICAgIHByaXZhdGUgRmlsZSAgICBpYXNob21lOworICAgIHByaXZhdGUgU3RyaW5nICBqYXJTdWZmaXggICAgID0gIi5qYXIiOworICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwZ2VuZXJhdGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnICAgICAgICAgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogRmlsZW5hbWVzIG9mIHRoZSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvciAod2hpY2ggaXMgcGFzc2VkIHRvIHRoaXMgY2xhc3MKKyAgICAgKiBmcm9tIHRoZSBwYXJlbnQgImVqYmphciIgdGFzaykgYW5kIHRoZSBpQVMtc3BlY2lmaWMgRUpCIGRlc2NyaXB0b3IKKyAgICAgKiAod2hvc2UgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHRoaXMgY2xhc3MpLiAgQm90aCBmaWxlbmFtZXMgYXJlIHJlbGF0aXZlCisgICAgICogdG8gdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlICJzcmNkaXIiIGF0dHJpYnV0ZSBpbiB0aGUgZWpiamFyIHRhc2suCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgIGRlc2NyaXB0b3JOYW1lOworICAgIHByaXZhdGUgU3RyaW5nICBpYXNEZXNjcmlwdG9yTmFtZTsKKworICAgIC8qCisgICAgICogVGhlIGRpc3BsYXlOYW1lIHZhcmlhYmxlIHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlICJkaXNwbGF5LW5hbWUiIGVsZW1lbnQKKyAgICAgKiBmcm9tIHRoZSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvci4gIEFzIGEgZnV0dXJlIGVuaGFuY2VtZW50IHRvIHRoaXMgdGFzaywKKyAgICAgKiB3ZSBtYXkgZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBFSkIgSkFSIGZpbGUgdXNpbmcgdGhpcyBkaXNwbGF5LW5hbWUsCisgICAgICogYnV0IHRoaXMgaGFzIG5vdCBiZSBpbXBsZW1lbnRlZCB5ZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgIGRpc3BsYXlOYW1lOworCisgICAgLyoKKyAgICAgKiBSZWdhcmRsZXNzIG9mIHRoZSBuYW1lIG9mIHRoZSBpQVMtc3BlY2lmaWMgRUpCIGRlc2NyaXB0b3IgZmlsZSwgaXQgd2lsbAorICAgICAqIHdyaXR0ZW4gaW4gdGhlIGNvbXBsZXRlZCBKQVIgZmlsZSBhcyAiaWFzLWVqYi1qYXIueG1sIi4gIFRoaXMgaXMgdGhlCisgICAgICogbmFtaW5nIGNvbnZlbnRpb24gaW1wbGVtZW50ZWQgYnkgaUFTLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQVNfREQgPSAiaWFzLWVqYi1qYXIueG1sIjsKKworICAgIC8qKgorICAgICAqIFNldHRlciBtZXRob2QgdXNlZCB0byBzdG9yZSB0aGUgImhvbWUiIGRpcmVjdG9yeSBvZiB0aGUgdXNlcidzIGlBUworICAgICAqIGluc3RhbGxhdGlvbi4gIFRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHNob3VsZCB0eXBpY2FsbHkgYmUKKyAgICAgKiA8Y29kZT5baW5zdGFsbC1sb2NhdGlvbl0vaXBsYW5ldC9pYXM2L2lhczwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWFzaG9tZSBUaGUgaG9tZSBkaXJlY3RvcnkgZm9yIHRoZSB1c2VyJ3MgaUFTIGluc3RhbGxhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJYXNob21lKEZpbGUgaWFzaG9tZSkgeworICAgICAgICB0aGlzLmlhc2hvbWUgPSBpYXNob21lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHRlciBtZXRob2QgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIEphdmEgc291cmNlIGZpbGVzIGdlbmVyYXRlZCBieQorICAgICAqIHRoZSBlamJjIHV0aWxpdHkgc2hvdWxkIGJlIHNhdmVkIG9yIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZWVwZ2VuZXJhdGVkIGJvb2xlYW4gd2hpY2gsIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBpbmRpY2F0ZXMgdGhhdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIEphdmEgc291cmNlIGZpbGVzIGdlbmVyYXRlZCBieSBlamJjIGZvciB0aGUgc3R1YnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgc2tlbGV0b25zIHNob3VsZCBiZSBrZXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBnZW5lcmF0ZWQoYm9vbGVhbiBrZWVwZ2VuZXJhdGVkKSB7CisgICAgICAgIHRoaXMua2VlcGdlbmVyYXRlZCA9IGtlZXBnZW5lcmF0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCBkZWJ1Z2dpbmcgb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gZWpiYyBpcworICAgICAqIGV4ZWN1dGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRlYnVnIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGRlYnVnZ2luZyBvdXRwdXQgc2hvdWxkIGJlIGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHRlciBtZXRob2QgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlbmFtZSBzdWZmaXggKGZvciBleGFtcGxlLCAiLmphciIpCisgICAgICogZm9yIHRoZSBKQVIgZmlsZXMgdG8gYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXJTdWZmaXggVGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIEpBUiBmaWxlbmFtZSBzdWZmaXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBqYXJTdWZmaXgpIHsKKyAgICAgICAgdGhpcy5qYXJTdWZmaXggPSBqYXJTdWZmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2luY2UgaUFTIGRvZXNuJ3QgZ2VuZXJhdGUgYSAiZ2VuZXJpYyIgSkFSIGFzIHBhcnQgb2YgaXRzIHByb2Nlc3NpbmcsCisgICAgICogdGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBhbmQgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBzdWZmaXguICBUaGlzIHBhcmFtZXRlciBpcworICAgICAqICAgICAgICAgICAgICAgICBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyaWNKYXJTdWZmaXgoU3RyaW5nIGluU3RyaW5nKSB7CisgICAgICAgIGxvZygiU2luY2UgYSBnZW5lcmljIEpBUiBmaWxlIGlzIG5vdCBjcmVhdGVkIGR1cmluZyBwcm9jZXNzaW5nLCB0aGUgIgorICAgICAgICAgICAgICAgICsgImlQbGFuZXQgRGVwbG95bWVudCBUb29sIGRvZXMgbm90IHN1cHBvcnQgdGhlICIKKyAgICAgICAgICAgICAgICArICJcImdlbmVyaWNqYXJzdWZmaXhcIiBhdHRyaWJ1dGUuICBJdCB3aWxsIGJlIGlnbm9yZWQuIiwKKyAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NEZXNjcmlwdG9yKFN0cmluZyBkZXNjcmlwdG9yTmFtZSwgU0FYUGFyc2VyIHNheFBhcnNlcikgeworICAgICAgICB0aGlzLmRlc2NyaXB0b3JOYW1lID0gZGVzY3JpcHRvck5hbWU7CisgICAgICAgIHRoaXMuaWFzRGVzY3JpcHRvck5hbWUgPSBudWxsOworCisgICAgICAgIGxvZygiaVBsYW5ldCBEZXBsb3ltZW50IFRvb2wgcHJvY2Vzc2luZzogIiArIGRlc2NyaXB0b3JOYW1lICsgIiAoYW5kICIKKyAgICAgICAgICAgICAgICArIGdldElhc0Rlc2NyaXB0b3JOYW1lKCkgKyAiKSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIHN1cGVyLnByb2Nlc3NEZXNjcmlwdG9yKGRlc2NyaXB0b3JOYW1lLCBzYXhQYXJzZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIHVzZXIgc2VsZWN0aW9ucyBhcmUgdmFsaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRvckZpbGVOYW1lIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZpbGUgbmFtZSBvZiBhbiBFSkIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHNheFBhcnNlciAgICAgICAgICBTQVhQYXJzZXIgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcGFyc2UgdGhlIFhNTAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gSWYgdGhlIHVzZXIgc2VsZWN0aW9ucyBhcmUgaW52YWxpZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb24oU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IHN0YXJ0T2ZOYW1lID0gZGVzY3JpcHRvckZpbGVOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAxOworICAgICAgICBTdHJpbmcgc3RkWG1sID0gZGVzY3JpcHRvckZpbGVOYW1lLnN1YnN0cmluZyhzdGFydE9mTmFtZSk7CisgICAgICAgIGlmIChzdGRYbWwuZXF1YWxzKEVKQl9ERCkgJiYgKGdldENvbmZpZygpLmJhc2VKYXJOYW1lID09IG51bGwpKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIk5vIG5hbWUgc3BlY2lmaWVkIGZvciB0aGUgY29tcGxldGVkIEpBUiBmaWxlLiAgVGhlIEVKQiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGVzY3JpcHRvciBzaG91bGQgYmUgcHJlcGVuZGVkIHdpdGggdGhlIEpBUiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibmFtZSBvciBpdCBzaG91bGQgYmUgc3BlY2lmaWVkIHVzaW5nIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlIFwiYmFzZWphcm5hbWVcIiBpbiB0aGUgXCJlamJqYXJcIiB0YXNrLiI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgaWFzRGVzY3JpcHRvciA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWFzRGVzY3JpcHRvck5hbWUoKSk7CisgICAgICAgIGlmICgoIWlhc0Rlc2NyaXB0b3IuZXhpc3RzKCkpIHx8ICghaWFzRGVzY3JpcHRvci5pc0ZpbGUoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVGhlIGlBUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvciAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWFzRGVzY3JpcHRvciArICIpIHdhcyBub3QgZm91bmQuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChpYXNob21lICE9IG51bGwpICYmICghaWFzaG9tZS5pc0RpcmVjdG9yeSgpKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJZiBcImlhc2hvbWVcIiBpcyBzcGVjaWZpZWQsIGl0IG11c3QgYmUgYSB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlyZWN0b3J5IChpdCB3YXMgc2V0IHRvICIgKyBpYXNob21lICsgIikuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgRUpCIGZpbGVzIGZvdW5kIHdoZW4gdGhlIHNwZWNpZmllZCBFSkIKKyAgICAgKiBkZXNjcmlwdG9yIGlzIHBhcnNlZCBhbmQgcHJvY2Vzc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2NyaXB0b3JGaWxlTmFtZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG5hbWUgb2YgYW4gRUpCCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBzYXhQYXJzZXIgICAgICAgICAgU0FYUGFyc2VyIHdoaWNoIG1heSBiZSB1c2VkIHRvIHBhcnNlIHRoZSBYTUwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IKKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBvZiBFSkIgY2xhc3MgKGFuZCBvdGhlcikgZmlsZXMgdG8gYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBjb21wbGV0ZWQgSkFSIGZpbGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgIEFuIElPRXhjZXB0aW9uIGZyb20gdGhlIHBhcnNlciwgcG9zc2libHkgZnJvbQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ5dGUgc3RyZWFtIG9yIGNoYXJhY3RlciBzdHJlYW0KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgICAgIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseSB3cmFwcGluZyBhbm90aGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHBhcnNlRWpiRmlsZXMoU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgSGFzaHRhYmxlIGZpbGVzOworCisgICAgICAgIC8qIEJ1aWxkIGFuZCBwb3B1bGF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZWpiYyB1dGlsaXR5ICovCisgICAgICAgIElQbGFuZXRFamJjIGVqYmMgPSBuZXcgSVBsYW5ldEVqYmMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvckZpbGVOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJYXNEZXNjcmlwdG9yTmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZygpLnNyY0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbWJpbmVkQ2xhc3NwYXRoKCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNheFBhcnNlcik7CisgICAgICAgIGVqYmMuc2V0UmV0YWluU291cmNlKGtlZXBnZW5lcmF0ZWQpOworICAgICAgICBlamJjLnNldERlYnVnT3V0cHV0KGRlYnVnKTsKKyAgICAgICAgaWYgKGlhc2hvbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgZWpiYy5zZXRJYXNIb21lRGlyKGlhc2hvbWUpOworICAgICAgICB9CisKKyAgICAgICAgLyogRXhlY3V0ZSB0aGUgZWpiYyB1dGlsaXR5IC0tIHN0dWJzL3NrZWxldG9ucyBhcmUgcmVidWlsdCwgaWYgbmVlZGVkICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlamJjLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSVBsYW5ldEVqYmMuRWpiY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXhlY3V0ZSB0aGUgaUFTIGVqYmMgdXRpbGl0eSIsIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgZGlzcGxheU5hbWUgICAgPSBlamJjLmdldERpc3BsYXlOYW1lKCk7CisgICAgICAgIGZpbGVzICAgICAgICAgID0gZWpiYy5nZXRFamJGaWxlcygpOworCisgICAgICAgIC8qIEFkZCBDTVAgZGVzY3JpcHRvcnMgdG8gdGhlIGxpc3Qgb2YgRUpCIGZpbGVzICovCisgICAgICAgIFN0cmluZ1tdIGNtcERlc2NyaXB0b3JzID0gZWpiYy5nZXRDbXBEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAoY21wRGVzY3JpcHRvcnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgRmlsZSBiYXNlRGlyID0gZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpcjsKKworICAgICAgICAgICAgaW50IGVuZE9mUGF0aCA9IGRlc2NyaXB0b3JGaWxlTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7CisgICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gZGVzY3JpcHRvckZpbGVOYW1lLnN1YnN0cmluZygwLCBlbmRPZlBhdGggKyAxKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbXBEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBlbmRPZkNtcCA9IGNtcERlc2NyaXB0b3JzW2ldLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNtcERlc2NyaXB0b3IgPSBjbXBEZXNjcmlwdG9yc1tpXS5zdWJzdHJpbmcoZW5kT2ZDbXAgKyAxKTsKKworICAgICAgICAgICAgICAgIEZpbGUgICBjbXBGaWxlID0gbmV3IEZpbGUoYmFzZURpciwgcmVsYXRpdmVQYXRoICsgY21wRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgaWYgKCFjbXBGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIENNUCBkZXNjcmlwdG9yIGZpbGUgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNtcEZpbGUgKyAiKSBjb3VsZCBub3QgYmUgZm91bmQuIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbGVzLnB1dChjbXBEZXNjcmlwdG9yc1tpXSwgY21wRmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBpQVMtc3BlY2lmaWMgRUpCIGRlc2NyaXB0b3IgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgd2hpY2ggd2lsbCBiZQorICAgICAqIHdyaXR0ZW4gdG8gdGhlIEpBUiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGVqYkZpbGVzIEhhc2h0YWJsZSBvZiBFSkIgY2xhc3MgKGFuZCBvdGhlcikgZmlsZXMgdG8gYmUgYWRkZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgdGhlIGNvbXBsZXRlZCBKQVIgZmlsZS4KKyAgICAgKiBAcGFyYW0gZGRQcmVmaXggbm90IHVzZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGUgZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgeworICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBJQVNfREQsIG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsCisgICAgICAgICAgICAgICAgICAgICBnZXRJYXNEZXNjcmlwdG9yTmFtZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBKYXIgdGhhdCB3aWxsIGJlIHdyaXR0ZW4uIFRoZSBtb2RpZmljYXRpb24gZGF0ZQorICAgICAqIG9mIHRoaXMgamFyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBkZXBlbmRlbnQgYmVhbiBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VOYW1lIFN0cmluZyBuYW1lIG9mIHRoZSBFSkIgSkFSIGZpbGUgdG8gYmUgd3JpdHRlbiAod2l0aG91dAorICAgICAqICAgICAgICAgICAgICAgICBhIGZpbGVuYW1lIGV4dGVuc2lvbikuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEZpbGUgcmVwcmVzZW50aW5nIHRoZSBKQVIgZmlsZSB3aGljaCB3aWxsIGJlIHdyaXR0ZW4uCisgICAgICovCisgICAgRmlsZSBnZXRWZW5kb3JPdXRwdXRKYXJGaWxlKFN0cmluZyBiYXNlTmFtZSkgeworICAgICAgICBGaWxlIGphckZpbGUgPSBuZXcgRmlsZShnZXREZXN0RGlyKCksIGJhc2VOYW1lICsgamFyU3VmZml4KTsKKyAgICAgICAgbG9nKCJKQVIgZmlsZSBuYW1lOiAiICsgamFyRmlsZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgcmV0dXJuIGphckZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGlBUyBlamJjIHV0aWxpdHkgZG9lc24ndCByZXF1aXJlIHRoZSBQdWJsaWMgSUQgb2YgdGhlIGRlc2NyaXB0b3IncworICAgICAqIERURCBmb3IgaXQgdG8gcHJvY2VzcyBjb3JyZWN0bHktLXRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGwKKyAgICAgKiA8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFB1YmxpY0lkKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBpQVMtc3BlY2lmaWMgRUpCIGRlc2NyaXB0b3IgdXNpbmcgdGhlCisgICAgICogc3BlY2lmaWVkIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yIG5hbWUuICBJbiBnZW5lcmFsLCB0aGUgc3RhbmRhcmQKKyAgICAgKiBkZXNjcmlwdG9yIHdpbGwgYmUgbmFtZWQgIltiYXNlbmFtZV0tZWpiLWphci54bWwiLCBhbmQgdGhpcyBtZXRob2Qgd2lsbAorICAgICAqIHJldHVybiAiW2Jhc2VuYW1lXS1pYXMtZWpiLWphci54bWwiLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgaUFTLXNwZWNpZmljIEVKQiBkZXNjcmlwdG9yIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SWFzRGVzY3JpcHRvck5hbWUoKSB7CisKKyAgICAgICAgLyogT25seSBjYWxjdWxhdGUgdGhlIGRlc2NyaXB0b3IgbmFtZSBvbmNlICovCisgICAgICAgIGlmIChpYXNEZXNjcmlwdG9yTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gaWFzRGVzY3JpcHRvck5hbWU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9ICIiOyAgIC8vIERpcmVjdG9yeSBwYXRoIG9mIHRoZSBFSkIgZGVzY3JpcHRvcgorICAgICAgICBTdHJpbmcgYmFzZW5hbWU7ICAgIC8vIEZpbGVuYW1lIGFwcGVhcmluZyBiZWZvcmUgbmFtZSB0ZXJtaW5hdG9yCisgICAgICAgIFN0cmluZyByZW1haW5kZXI7ICAgLy8gRmlsZW5hbWUgYXBwZWFyaW5nIGFmdGVyIHRoZSBuYW1lIHRlcm1pbmF0b3IKKworICAgICAgICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIHN0YW5kYXJkIGRlc2NyaXB0b3IncyByZWxhdGl2ZSBwYXRoICovCisgICAgICAgIGludCBzdGFydE9mRmlsZU5hbWUgPSBkZXNjcmlwdG9yTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICBpZiAoc3RhcnRPZkZpbGVOYW1lICE9IC0xKSB7CisgICAgICAgICAgICBwYXRoID0gZGVzY3JpcHRvck5hbWUuc3Vic3RyaW5nKDAsIHN0YXJ0T2ZGaWxlTmFtZSArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzdGFuZGFyZCBuYW1lIGlzIHVzZWQgKHRoZXJlJ3Mgbm8gYmFzZW5hbWUpICovCisgICAgICAgIGlmIChkZXNjcmlwdG9yTmFtZS5zdWJzdHJpbmcoc3RhcnRPZkZpbGVOYW1lICsgMSkuZXF1YWxzKEVKQl9ERCkpIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gIiI7CisgICAgICAgICAgICByZW1haW5kZXIgPSBFSkJfREQ7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBlbmRPZkJhc2VOYW1lID0gZGVzY3JpcHRvck5hbWUuaW5kZXhPZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZygpLmJhc2VOYW1lVGVybWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZGaWxlTmFtZSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2hlY2sgZm9yIHRoZSBvZGQgY2FzZSB3aGVyZSB0aGUgdGVybWluYXRvciBhbmQvb3IgZmlsZW5hbWUKKyAgICAgICAgICAgICAqIGV4dGVuc2lvbiBhcmVuJ3QgZm91bmQuICBUaGVzZSB3aWxsIGVuc3VyZSAiaWFzLSIgYXBwZWFycyBhdCB0aGUKKyAgICAgICAgICAgICAqIGVuZCBvZiB0aGUgbmFtZSBhbmQgYmVmb3JlIHRoZSAnLicgKGlmIHByZXNlbnQpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZW5kT2ZCYXNlTmFtZSA8IDApIHsKKyAgICAgICAgICAgICAgICBlbmRPZkJhc2VOYW1lID0gZGVzY3JpcHRvck5hbWUubGFzdEluZGV4T2YoJy4nKSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKGVuZE9mQmFzZU5hbWUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVuZE9mQmFzZU5hbWUgPSBkZXNjcmlwdG9yTmFtZS5sZW5ndGgoKSAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiYXNlbmFtZSA9IGRlc2NyaXB0b3JOYW1lLnN1YnN0cmluZyhzdGFydE9mRmlsZU5hbWUgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZCYXNlTmFtZSArIDEpOworICAgICAgICAgICAgcmVtYWluZGVyID0gZGVzY3JpcHRvck5hbWUuc3Vic3RyaW5nKGVuZE9mQmFzZU5hbWUgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlhc0Rlc2NyaXB0b3JOYW1lID0gcGF0aCArIGJhc2VuYW1lICsgImlhcy0iICsgcmVtYWluZGVyOworICAgICAgICByZXR1cm4gaWFzRGVzY3JpcHRvck5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldEVqYmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE4MDA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjLmphdmEKQEAgLTAsMCArMSwxNDkzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5IYW5kbGVyQmFzZTsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogQ29tcGlsZXMgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgZm9yIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uCisgKiBTZXJ2ZXIgKGlBUykuICBUaGUgY2xhc3Mgd2lsbCByZWFkIGEgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IgKGFzIHdlbGwgYXMgYW4KKyAqIEVKQiBkZXNjcmlwdG9yIHNwZWNpZmljIHRvIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyKSB0byBpZGVudGlmeSBvbmUgb3IKKyAqIG1vcmUgRUpCcyB0byBwcm9jZXNzLiAgSXQgd2lsbCBzZWFyY2ggZm9yIEVKQiAic291cmNlIiBjbGFzc2VzICh0aGUgcmVtb3RlCis7ICogaW50ZXJmYWNlLCBob21lIGludGVyZmFjZSwgYW5kIEVKQiBpbXBsZW1lbnRhdGlvbiBjbGFzcykgYW5kIHRoZSBFSkIgc3R1YnMKKyAqIGFuZCBza2VsZXRvbnMgaW4gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuICBPbmx5IGlmIHRoZSBzdHVicyBhbmQKKyAqIHNrZWxldG9ucyBjYW5ub3QgYmUgZm91bmQgb3IgaWYgdGhleSdyZSBvdXQgb2YgZGF0ZSB3aWxsIHRoZSBpUGxhbmV0CisgKiBBcHBsaWNhdGlvbiBTZXJ2ZXIgZWpiYyB1dGlsaXR5IGJlIHJ1bi4KKyAqIDxwPgorICogQmVjYXVzZSB0aGlzIGNsYXNzIChhbmQgaXQncyBhc3NvcnRlZCBpbm5lciBjbGFzc2VzKSBtYXkgYmUgYnVuZGxlZCBpbnRvIHRoZQorICogaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIgZGlzdHJpYnV0aW9uIGF0IHNvbWUgcG9pbnQgKGFuZCByZW1vdmVkIGZyb20gdGhlCisgKiBBbnQgZGlzdHJpYnV0aW9uKSwgdGhlIGNsYXNzIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYmUgaW5kZXBlbmRlbnQgb2YgYWxsCisgKiBBbnQtc3BlY2lmaWMgY2xhc3Nlcy4gIEl0IGlzIGFsc28gZm9yIHRoaXMgcmVhc29uIChhbmQgdG8gYXZvaWQgY2x1dHRlcmluZworICogdGhlIEFwYWNoZSBBbnQgc291cmNlIGZpbGVzKSB0aGF0IHRoaXMgdXRpbGl0eSBoYXMgYmVlbiBwYWNrYWdlZCBpbnRvIGEKKyAqIHNpbmdsZSBzb3VyY2UgZmlsZS4KKyAqIDxwPgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQW50IFRhc2tzIGZvciBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciwgc2VlIHRoZQorICogPGNvZGU+SVBsYW5ldERlcGxveW1lbnRUb29sPC9jb2RlPiBhbmQgPGNvZGU+SVBsYW5ldEVqYmNUYXNrPC9jb2RlPiBjbGFzc2VzLgorICoKKyAqIEBzZWUgICAgSVBsYW5ldERlcGxveW1lbnRUb29sCisgKiBAc2VlICAgIElQbGFuZXRFamJjVGFzaworICogQGFudC50YXNrIGlnbm9yZT0idHJ1ZSIKKyAqLworcHVibGljIGNsYXNzIElQbGFuZXRFamJjIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fTlVNX0FSR1MgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNX0FSR1MgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fQ0xBU1NFU19XSVRIX0lJT1AgPSAxNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0NMQVNTRVNfV0lUSE9VVF9JSU9QID0gOTsKKworICAgIC8qIENvbnN0YW50cyB1c2VkIGZvciB0aGUgImJlYW50eXBlIiBhdHRyaWJ1dGUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0JFQU4gICAgICAgPSAiZW50aXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVMRVNTX1NFU1NJT04gPSAic3RhdGVsZXNzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVGVUxfU0VTU0lPTiAgPSAic3RhdGVmdWwiOworCisgICAgLyogRmlsZW5hbWVzIG9mIHRoZSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvciBhbmQgdGhlIGlBUy1zcGVjaWZpYyBkZXNjcmlwdG9yICovCisgICAgcHJpdmF0ZSBGaWxlICAgICAgICBzdGREZXNjcmlwdG9yOworICAgIHByaXZhdGUgRmlsZSAgICAgICAgaWFzRGVzY3JpcHRvcjsKKworICAgIC8qCisgICAgICogRGlyZWN0b3J5IHdoZXJlICJzb3VyY2UiIEVKQiBmaWxlcyBhcmUgc3RvcmVkIGFuZCB3aGVyZSBzdHVicyBhbmQKKyAgICAgKiBza2VsZXRvbnMgd2lsbCBhbHNvIGJlIHdyaXR0ZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlICAgICAgICBkZXN0RGlyZWN0b3J5OworCisgICAgLyogQ2xhc3NwYXRoIHVzZWQgd2hlbiB0aGUgaUFTIGVqYmMgaXMgY2FsbGVkICovCisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICBjbGFzc3BhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSAgICBjbGFzc3BhdGhFbGVtZW50czsKKworICAgIC8qIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBpQVMgZWpiYyAqLworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgcmV0YWluU291cmNlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICBkZWJ1Z091dHB1dCAgPSBmYWxzZTsKKworICAgIC8qIGlBUyBpbnN0YWxsYXRpb24gZGlyZWN0b3J5ICh1c2VkIGlmIGVqYmMgaXNuJ3Qgb24gdXNlcidzIFBBVEgpICovCisgICAgcHJpdmF0ZSBGaWxlICAgICAgICBpYXNIb21lRGlyOworCisgICAgLyogUGFyc2VyIGFuZCBoYW5kbGVyIHVzZWQgdG8gcHJvY2VzcyBib3RoIEVKQiBkZXNjcmlwdG9yIGZpbGVzICovCisgICAgcHJpdmF0ZSBTQVhQYXJzZXIgICBwYXJzZXI7CisgICAgcHJpdmF0ZSBFamJjSGFuZGxlciBoYW5kbGVyID0gbmV3IEVqYmNIYW5kbGVyKCk7CisKKyAgICAvKgorICAgICAqIFRoaXMgSGFzaHRhYmxlIG1haW50YWlucyBhIGxpc3Qgb2YgRUpCIGNsYXNzIGZpbGVzIHByb2Nlc3NlZCBieSB0aGUgZWpiYworICAgICAqIHV0aWxpdHkgKGJvdGggInNvdXJjZSIgY2xhc3MgZmlsZXMgYXMgd2VsbCBhcyBzdHVicyBhbmQgc2tlbGV0b25zKS4gVGhlCisgICAgICoga2V5IGZvciB0aGUgSGFzaHRhYmxlIGlzIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgY2xhc3MgZmlsZQorICAgICAqIChyZWxhdGl2ZSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5KS4gIFRoZSB2YWx1ZSBmb3IgdGhlIEhhc2h0YWJsZSBpcworICAgICAqIGEgRmlsZSBvYmplY3Qgd2hpY2ggcmVmZXJlbmNlIHRoZSBhY3R1YWwgY2xhc3MgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSAgIGVqYkZpbGVzICAgICA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qIFZhbHVlIG9mIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCByZWFkIGZyb20gdGhlIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yICovCisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICBkaXNwbGF5TmFtZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugd2hpY2ggbWF5IGJlIHVzZWQgdG8gcHJvY2VzcyBFSkIgZGVzY3JpcHRvcnMgYW5kCisgICAgICogZ2VuZXJhdGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMsIGlmIG5lZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGREZXNjcmlwdG9yIEZpbGUgcmVmZXJlbmNpbmcgYSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvci4KKyAgICAgKiBAcGFyYW0gaWFzRGVzY3JpcHRvciBGaWxlIHJlZmVyZW5jaW5nIGFuIGlBUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvci4KKyAgICAgKiBAcGFyYW0gZGVzdERpcmVjdG9yeSBGaWxlIHJlZmVyZW5jaW5nIHRoZSBiYXNlIGRpcmVjdG9yeSB3aGVyZSBib3RoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgRUpCICJzb3VyY2UiIGZpbGVzIGFyZSBmb3VuZCBhbmQgd2hlcmUgc3R1YnMgYW5kCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2tlbGV0b25zIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoICAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGlBUyBlamJjIHV0aWxpdHkuCisgICAgICogQHBhcmFtIHBhcnNlciAgICAgICAgU0FYUGFyc2VyIHRvIGJlIHVzZWQgdG8gcHJvY2VzcyBib3RoIG9mIHRoZSBFSkIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycy4KKyAgICAgKiBAdG9kbyBjbGFzc3BhdGhFbGVtZW50cyBpcyBub3QgbmVlZGVkIGhlcmUsIGl0cyBuZXZlciB1c2VkCisgICAgICogICAgICAgKGF0IGxlYXN0IElERUEgdGVsbHMgbWUgc28hIDopCisgICAgICovCisgICAgcHVibGljIElQbGFuZXRFamJjKEZpbGUgc3RkRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBpYXNEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc3REaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgdGhpcy5zdGREZXNjcmlwdG9yID0gc3RkRGVzY3JpcHRvcjsKKyAgICAgICAgdGhpcy5pYXNEZXNjcmlwdG9yICAgICAgPSBpYXNEZXNjcmlwdG9yOworICAgICAgICB0aGlzLmRlc3REaXJlY3RvcnkgICAgICA9IGRlc3REaXJlY3Rvcnk7CisgICAgICAgIHRoaXMuY2xhc3NwYXRoICAgICAgICAgID0gY2xhc3NwYXRoOworICAgICAgICB0aGlzLnBhcnNlciAgICAgICAgICAgICA9IHBhcnNlcjsKKworICAgICAgICAvKgorICAgICAgICAgKiBQYXJzZSB0aGUgY2xhc3NwYXRoIGludG8gaXQncyBpbmRpdmlkdWFsIGVsZW1lbnRzIGFuZCBzdG9yZSB0aGUKKyAgICAgICAgICogcmVzdWx0cyBpbiB0aGUgImNsYXNzcGF0aEVsZW1lbnRzIiBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUucGF0aFNlcGFyYXRvcik7CisgICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKHN0Lm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXNzcGF0aEVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgID0gKFN0cmluZ1tdKSBlbGVtZW50cy50b0FycmF5KG5ldyBTdHJpbmdbZWxlbWVudHMuc2l6ZSgpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB0aGUgSmF2YSBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSB0aGUKKyAgICAgKiBlamJjIHByb2Nlc3MgYXJlIHJldGFpbmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJldGFpblNvdXJjZSBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgSmF2YSBzb3VyY2UgZmlsZXMgZm9yCisgICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyBzaG91bGQgYmUgcmV0YWluZWQuCisgICAgICogQHRvZG8gVGhpcyBpcyBub3QgZG9jdW1lbnRlZCBpbiB0aGUgSFRNTC4gT24gcHVycG9zZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXRhaW5Tb3VyY2UoYm9vbGVhbiByZXRhaW5Tb3VyY2UpIHsKKyAgICAgICAgdGhpcy5yZXRhaW5Tb3VyY2UgPSByZXRhaW5Tb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZW5hYmxlcyBkZWJ1Z2dpbmcgb3V0cHV0IHdoZW4gZWpiYyBpcyBleGVjdXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWJ1Z091dHB1dCBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBkZWJ1Z2dpbmcgb3V0cHV0IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z091dHB1dChib29sZWFuIGRlYnVnT3V0cHV0KSB7CisgICAgICAgIHRoaXMuZGVidWdPdXRwdXQgPSBkZWJ1Z091dHB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgdGhlIGxvY2F0aW9uIG9mIGEgbG9jYWwgRFREIGZpbGUgb3IgcmVzb3VyY2UuICBCeSByZWdpc3RlcmluZworICAgICAqIGEgbG9jYWwgRFRELCBFSkIgZGVzY3JpcHRvcnMgY2FuIGJlIHBhcnNlZCBldmVuIHdoZW4gdGhlIHJlbW90ZSBzZXJ2ZXJzCisgICAgICogd2hpY2ggY29udGFpbiB0aGUgInB1YmxpYyIgRFREcyBjYW5ub3QgYmUgYWNjZXNzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHVibGljSUQgVGhlIHB1YmxpYyBEVEQgaWRlbnRpZmllciBmb3VuZCBpbiBhbiBYTUwgZG9jdW1lbnQuCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBmaWxlIG9yIHJlc291cmNlIG5hbWUgZm9yIHRoZSBhcHByb3ByaWF0ZSBEVEQgc3RvcmVkCisgICAgICogICAgICAgICAgICAgICAgIG9uIHRoZSBsb2NhbCBtYWNoaW5lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRFREKFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQocHVibGljSUQsIGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSAiaG9tZSIgZGlyZWN0b3J5IGZvciB0aGlzIGlBUyBpbnN0YWxsYXRpb24uCisgICAgICogVGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgc2hvdWxkIHR5cGljYWxseSBiZQorICAgICAqIDxjb2RlPltpbnN0YWxsLWxvY2F0aW9uXS9pcGxhbmV0L2lhczYvaWFzPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpYXNIb21lRGlyIFRoZSBob21lIGRpcmVjdG9yeSBmb3IgdGhlIHVzZXIncyBpQVMgaW5zdGFsbGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElhc0hvbWVEaXIoRmlsZSBpYXNIb21lRGlyKSB7CisgICAgICAgIHRoaXMuaWFzSG9tZURpciA9IGlhc0hvbWVEaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIEhhc2h0YWJsZSB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YgRUpCIGNsYXNzIGZpbGVzIHByb2Nlc3NlZCBieQorICAgICAqIHRoZSBlamJjIHV0aWxpdHkgKGJvdGggInNvdXJjZSIgY2xhc3MgZmlsZXMgYXMgd2VsbCBhcyBzdHVicyBhbmQKKyAgICAgKiBza2VsZXRvbnMpLiBUaGUga2V5IGZvciB0aGUgSGFzaHRhYmxlIGlzIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aAorICAgICAqIHRvIHRoZSBjbGFzcyBmaWxlIChyZWxhdGl2ZSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5KS4gIFRoZSB2YWx1ZSBmb3IKKyAgICAgKiB0aGUgSGFzaHRhYmxlIGlzIGEgRmlsZSBvYmplY3Qgd2hpY2ggcmVmZXJlbmNlIHRoZSBhY3R1YWwgY2xhc3MgZmlsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRUpCIGZpbGVzIHByb2Nlc3NlZCBieSB0aGUgZWpiYyB1dGlsaXR5LgorICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0RWpiRmlsZXMoKSB7CisgICAgICAgIHJldHVybiBlamJGaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCByZWFkIGZyb20gdGhlIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgRUpCLUpBUiBkaXNwbGF5IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGRpc3BsYXlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgQ01QIGRlc2NyaXB0b3JzIHJlZmVyZW5jZWQgaW4gdGhlIEVKQiBkZXNjcmlwdG9ycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgQ01QIGRlc2NyaXB0b3JzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDbXBEZXNjcmlwdG9ycygpIHsKKyAgICAgICAgTGlzdCByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIEVqYkluZm9bXSBlamJzID0gaGFuZGxlci5nZXRFamJzKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlamJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBMaXN0IGRlc2NyaXB0b3JzID0gKExpc3QpIGVqYnNbaV0uZ2V0Q21wRGVzY3JpcHRvcnMoKTsKKyAgICAgICAgICAgIHJldHVybkxpc3QuYWRkQWxsKGRlc2NyaXB0b3JzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoU3RyaW5nW10pIHJldHVybkxpc3QudG9BcnJheShuZXcgU3RyaW5nW3JldHVybkxpc3Quc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFpbiBhcHBsaWNhdGlvbiBtZXRob2QgZm9yIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciBlamJjIHV0aWxpdHkuCisgICAgICogSWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1biB3aXRoIG5vIGNvbW1hbmRsaW5lIGFyZ3VtZW50cywgYSB1c2FnZQorICAgICAqIHN0YXRlbWVudCBpcyBwcmludGVkIGZvciB0aGUgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIFRoZSBjb21tYW5kbGluZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIEZpbGUgICAgICAgIHN0ZERlc2NyaXB0b3I7CisgICAgICAgIEZpbGUgICAgICAgIGlhc0Rlc2NyaXB0b3I7CisgICAgICAgIEZpbGUgICAgICAgIGRlc3REaXJlY3RvcnkgPSBudWxsOworICAgICAgICBTdHJpbmcgICAgICBjbGFzc3BhdGggICAgID0gbnVsbDsKKyAgICAgICAgU0FYUGFyc2VyICAgcGFyc2VyICAgICAgICA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gICAgIGRlYnVnICAgICAgICAgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiAgICAgcmV0YWluU291cmNlICA9IGZhbHNlOworICAgICAgICBJUGxhbmV0RWpiYyBlamJjOworCisgICAgICAgIGlmICgoYXJncy5sZW5ndGggPCBNSU5fTlVNX0FSR1MpIHx8IChhcmdzLmxlbmd0aCA+IE1BWF9OVU1fQVJHUykpIHsKKyAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdGREZXNjcmlwdG9yID0gbmV3IEZpbGUoYXJnc1thcmdzLmxlbmd0aCAtIDJdKTsKKyAgICAgICAgaWFzRGVzY3JpcHRvciA9IG5ldyBGaWxlKGFyZ3NbYXJncy5sZW5ndGggLSAxXSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aCAtIDI7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItY2xhc3NwYXRoIikpIHsKKyAgICAgICAgICAgICAgICBjbGFzc3BhdGggPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZCIpKSB7CisgICAgICAgICAgICAgICAgZGVzdERpcmVjdG9yeSA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZGVidWciKSkgeworICAgICAgICAgICAgICAgIGRlYnVnID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1rZWVwc291cmNlIikpIHsKKyAgICAgICAgICAgICAgICByZXRhaW5Tb3VyY2UgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHRoZSAtY2xhc3NwYXRoIGZsYWcgaXNuJ3Qgc3BlY2lmaWVkLCB1c2UgdGhlIHN5c3RlbSBjbGFzc3BhdGggKi8KKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IHByb3BzLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSAtZCBmbGFnIGlzbid0IHNwZWNpZmllZCwgdXNlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhcyB0aGUKKyAgICAgICAgICogZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgICAgICAqLworICAgICAgICBpZiAoZGVzdERpcmVjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGRlc3REaXJlY3RvcnkgPSBuZXcgRmlsZShwcm9wcy5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb25zdHJ1Y3QgYSBTQVhQYXJzZXIgdXNlZCB0byBwcm9jZXNzIHRoZSBkZXNjcmlwdG9ycyAqLworICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIHBhcnNlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyh0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTQVhFeGNlcHRpb24gb3IgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIGV4Y2VwdGlvbiB3YXMgZ2VuZXJhdGVkIHdoaWxlIHRyeWluZyB0byAiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIGEgbmV3IFNBWFBhcnNlci4iKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBCdWlsZCBhbmQgcG9wdWxhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGVqYmMgdXRpbGl0eSAqLworICAgICAgICBlamJjID0gbmV3IElQbGFuZXRFamJjKHN0ZERlc2NyaXB0b3IsIGlhc0Rlc2NyaXB0b3IsIGRlc3REaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aCwgcGFyc2VyKTsKKyAgICAgICAgZWpiYy5zZXREZWJ1Z091dHB1dChkZWJ1Zyk7CisgICAgICAgIGVqYmMuc2V0UmV0YWluU291cmNlKHJldGFpblNvdXJjZSk7CisKKyAgICAgICAgLyogRXhlY3V0ZSB0aGUgZWpiYyB1dGlsaXR5IC0tIHN0dWJzL3NrZWxldG9ucyBhcmUgcmVidWlsdCwgaWYgbmVlZGVkICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlamJjLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbiBJT0V4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgd2hpbGUgcmVhZGluZyB0aGUgIgorICAgICAgICAgICAgICAgICAgICArICJYTUwgZGVzY3JpcHRvcnMgKCIgKyBlLmdldE1lc3NhZ2UoKSArICIpLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBIFNBWEV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgd2hpbGUgcmVhZGluZyB0aGUgIgorICAgICAgICAgICAgICAgICAgICArICJYTUwgZGVzY3JpcHRvcnMgKCIgKyBlLmdldE1lc3NhZ2UoKSArICIpLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChJUGxhbmV0RWpiYy5FamJjRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyB0aGUgZWpiYyAiCisgICAgICAgICAgICAgICAgICAgICsgInV0aWxpdHkgKCIgKyBlLmdldE1lc3NhZ2UoKSArICIpLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSB1c2FnZSBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJqYXZhIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5JUGxhbmV0RWpiYyBcXCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgW09QVElPTlNdIFtFSkIgMS4xIGRlc2NyaXB0b3JdIFtpQVMgRUpCIGRlc2NyaXB0b3JdIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2hlcmUgT1BUSU9OUyBhcmU6Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtZGVidWcgLS0gZm9yIGFkZGl0aW9uYWwgZGVidWdnaW5nIG91dHB1dCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWtlZXBzb3VyY2UgLS0gdG8gcmV0YWluIEphdmEgc291cmNlIGZpbGVzIGdlbmVyYXRlZCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWNsYXNzcGF0aCBbY2xhc3NwYXRoXSAtLSBjbGFzc3BhdGggdXNlZCBmb3IgY29tcGlsYXRpb24iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1kIFtkZXN0aW5hdGlvbiBkaXJlY3RvcnldIC0tIGRpcmVjdG9yeSBmb3IgY29tcGlsZWQgY2xhc3NlcyIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklmIGEgY2xhc3NwYXRoIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid2lsbCBiZSB1c2VkLiAgSWYgYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaXMgbm90IHNwZWNpZmllZCwiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQgKGNsYXNzZXMgd2lsbCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0aWxsIGJlIHBsYWNlZCBpbiBzdWJmb2xkZXJzIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlaXIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwYWNrYWdlIG5hbWUpLiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBFSkIgaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UsIGFuZCBpbXBsZW1lbnRhdGlvbiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNsYXNzIG11c3QgYmUgZm91bmQgaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gIEluIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkaXRpb24sIHRoZSBkZXN0aW5hdGlvbiB3aWxsIGxvb2sgZm9yIHRoZSBzdHVicyBhbmQgc2tlbGV0b25zIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB0byBlbnN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZS4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlcyB0aGUgc3R1YiBhbmQgc2tlbGV0b25zIGZvciB0aGUgc3BlY2lmaWVkIEVKQnMsIGlmIHRoZXkgbmVlZCB0bworICAgICAqIGJlIHVwZGF0ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEVqYmNFeGNlcHRpb24gSWYgdGhlIGVqYmMgdXRpbGl0eSBjYW5ub3QgYmUgY29ycmVjdGx5IGNvbmZpZ3VyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgb25lIG9yIG1vcmUgb2YgdGhlIEVKQiAic291cmNlIiBjbGFzc2VzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgIElmIHRoZSBwYXJzZXIgZW5jb3VudGVycyBhIHByb2JsZW0gcmVhZGluZyB0aGUgWE1MCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGZpbGUKKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgSWYgdGhlIHBhcnNlciBlbmNvdW50ZXJzIGEgcHJvYmxlbSBwcm9jZXNzaW5nIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBYTUwgZGVzY3JpcHRvciAoaXQgbWF5IHdyYXAgYW5vdGhlciBleGNlcHRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBFamJjRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTsgICAvLyBUaHJvd3MgRWpiY0V4Y2VwdGlvbiBpZiB1bnN1Y2Nlc3NmdWwKKworICAgICAgICBFamJJbmZvW10gZWpicyA9IGdldEVqYnMoKTsgLy8gUmV0dXJucyBsaXN0IG9mIEVKQnMgZm9yIHByb2Nlc3NpbmcKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVqYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGxvZygiRUpCSW5mby4uLiIpOworICAgICAgICAgICAgbG9nKGVqYnNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVqYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEVqYkluZm8gZWpiID0gZWpic1tpXTsKKworICAgICAgICAgICAgZWpiLmNoZWNrQ29uZmlndXJhdGlvbihkZXN0RGlyZWN0b3J5KTsgIC8vIFRocm93cyBFamJjRXhjZXB0aW9uCisKKyAgICAgICAgICAgIGlmIChlamIubXVzdEJlUmVjb21waWxlZChkZXN0RGlyZWN0b3J5KSkgeworICAgICAgICAgICAgICAgIGxvZyhlamIuZ2V0TmFtZSgpICsgIiBtdXN0IGJlIHJlY29tcGlsZWQgdXNpbmcgZWpiYy4iKTsKKworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3VtZW50cyA9IGJ1aWxkQXJndW1lbnRMaXN0KGVqYik7CisgICAgICAgICAgICAgICAgY2FsbEVqYmMoYXJndW1lbnRzKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coZWpiLmdldE5hbWUoKSArICIgaXMgdXAgdG8gZGF0ZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciBlamJjIGNvbW1hbmQtbGluZSB1dGlsaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3VtZW50cyBDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZWpiYyB1dGlsaXR5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjYWxsRWpiYyhTdHJpbmdbXSBhcmd1bWVudHMpIHsKKworICAgICAgICAvKiBDb25jYXRlbmF0ZSBhbGwgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBTdHJpbmcgKi8KKyAgICAgICAgU3RyaW5nQnVmZmVyIGFyZ3MgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhcmdzLmFwcGVuZChhcmd1bWVudHNbaV0pLmFwcGVuZCgiICIpOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgYW4gaUFTIGhvbWUgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwgcHJlcGVuZCBpdCB0byB0aGUgY29tbW1hbmQgKi8KKyAgICAgICAgU3RyaW5nIGNvbW1hbmQ7CisgICAgICAgIGlmIChpYXNIb21lRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1hbmQgPSAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbW1hbmQgPSBpYXNIb21lRGlyLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJiaW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3I7CisgICAgICAgIH0KKyAgICAgICAgY29tbWFuZCArPSAiZWpiYyAiOworCisgICAgICAgIGxvZyhjb21tYW5kICsgYXJncyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXNlIHRoZSBSdW50aW1lIG9iamVjdCB0byBleGVjdXRlIGFuIGV4dGVybmFsIGNvbW1hbmQuICBVc2UgdGhlCisgICAgICAgICAqIFJlZGlyZWN0T3V0cHV0IGlubmVyIGNsYXNzIHRvIGRpcmVjdCB0aGUgc3RhbmRhcmQgYW5kIGVycm9yIG91dHB1dAorICAgICAgICAgKiBmcm9tIHRoZSBjb21tYW5kIHRvIHRoZSBKUkUncyBzdGFuZGFyZCBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm9jZXNzIHAgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQgKyBhcmdzKTsKKyAgICAgICAgICAgIFJlZGlyZWN0T3V0cHV0IG91dHB1dCA9IG5ldyBSZWRpcmVjdE91dHB1dChwLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgUmVkaXJlY3RPdXRwdXQgZXJyb3IgID0gbmV3IFJlZGlyZWN0T3V0cHV0KHAuZ2V0RXJyb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBvdXRwdXQuc3RhcnQoKTsKKyAgICAgICAgICAgIGVycm9yLnN0YXJ0KCk7CisgICAgICAgICAgICBwLndhaXRGb3IoKTsKKyAgICAgICAgICAgIHAuZGVzdHJveSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkFuIElPRXhjZXB0aW9uIGhhcyBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZXhlY3V0ZSBlamJjLiIpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCB0aGUgdXNlciBzZWxlY3Rpb25zIGFyZSB2YWxpZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRWpiY0V4Y2VwdGlvbiBJZiB0aGUgdXNlciBzZWxlY3Rpb25zIGFyZSBpbnZhbGlkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbigpIHRocm93cyBFamJjRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbXNnID0gIiI7CisKKyAgICAgICAgaWYgKHN0ZERlc2NyaXB0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNnICs9ICJBIHN0YW5kYXJkIFhNTCBkZXNjcmlwdG9yIGZpbGUgbXVzdCBiZSBzcGVjaWZpZWQuICAiOworICAgICAgICB9CisgICAgICAgIGlmIChpYXNEZXNjcmlwdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZyArPSAiQW4gaUFTLXNwZWNpZmljIFhNTCBkZXNjcmlwdG9yIGZpbGUgbXVzdCBiZSBzcGVjaWZpZWQuICAiOworICAgICAgICB9CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgbXNnICs9ICJBIGNsYXNzcGF0aCBtdXN0IGJlIHNwZWNpZmllZC4gICAgIjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZyArPSAiQW4gWE1MIHBhcnNlciBtdXN0IGJlIHNwZWNpZmllZC4gICAgIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0RGlyZWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZyArPSAiQSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQuICAiOworICAgICAgICB9IGVsc2UgaWYgKCFkZXN0RGlyZWN0b3J5LmV4aXN0cygpKSB7CisgICAgICAgICAgICBtc2cgKz0gIlRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0LiAgIjsKKyAgICAgICAgfSBlbHNlIGlmICghZGVzdERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBtc2cgKz0gIlRoZSBkZXN0aW5hdGlvbiBzcGVjaWZpZWQgaXMgbm90IGEgZGlyZWN0b3J5LiAgIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtc2cubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbihtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBFSkIgZGVzY3JpcHRvcnMgYW5kIHJldHVybnMgYSBsaXN0IG9mIEVKQnMgd2hpY2ggbWF5IG5lZWQgdG8KKyAgICAgKiBiZSBjb21waWxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICBBbiBhcnJheSBvZiBvYmplY3RzIHdoaWNoIGRlc2NyaWJlIHRoZSBFSkJzIHRvIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgSWYgdGhlIHBhcnNlciBlbmNvdW50ZXJzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBYTUwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMKKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgSWYgdGhlIHBhcnNlciBlbmNvdW50ZXJzIGEgcHJvYmxlbSBwcm9jZXNzaW5nIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBYTUwgZGVzY3JpcHRvciAoaXQgbWF5IHdyYXAgYW5vdGhlciBleGNlcHRpb24pCisgICAgICovCisgICAgcHJpdmF0ZSBFamJJbmZvW10gZ2V0RWpicygpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgRWpiSW5mb1tdIGVqYnMgPSBudWxsOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBFSkIgaW5mb3JtYXRpb24gaXMgZ2F0aGVyZWQgZnJvbSB0aGUgc3RhbmRhcmQgWE1MIEVKQiBkZXNjcmlwdG9yCisgICAgICAgICAqIGFuZCB0aGUgaUFTLXNwZWNpZmljIFhNTCBFSkIgZGVzY3JpcHRvciB1c2luZyBhIFNBWCBwYXJzZXIuCisgICAgICAgICAqLworCisgICAgICAgIHBhcnNlci5wYXJzZShzdGREZXNjcmlwdG9yLCBoYW5kbGVyKTsKKyAgICAgICAgcGFyc2VyLnBhcnNlKGlhc0Rlc2NyaXB0b3IsIGhhbmRsZXIpOworICAgICAgICBlamJzID0gaGFuZGxlci5nZXRFamJzKCk7CisKKyAgICAgICAgcmV0dXJuIGVqYnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzZWQgb24gdGhpcyBvYmplY3QncyBpbnN0YW5jZSB2YXJpYWJsZXMgYXMgd2VsbCBhcyB0aGUgRUpCIHRvIGJlCisgICAgICogcHJvY2Vzc2VkLCB0aGUgY29ycmVjdCBmbGFncyBhbmQgcGFyYW1ldGVycyBhcmUgc2V0IGZvciB0aGUgZWpiYworICAgICAqIGNvbW1hbmQtbGluZSB1dGlsaXR5LgorICAgICAqIEBwYXJhbSBlamIgVGhlIEVKQiBmb3Igd2hpY2ggc3R1YnMgYW5kIHNrZWxldG9ucyB3aWxsIGJlIGNvbXBpbGVkLgorICAgICAqIEByZXR1cm4gICAgQW4gYXJyYXkgb2YgU3RyaW5ncyB3aGljaCBhcmUgdGhlIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzIGZvcgorICAgICAqICAgICAgICAgICAgZm9yIHRoZSBlamJjIHV0aWxpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBidWlsZEFyZ3VtZW50TGlzdChFamJJbmZvIGVqYikgeworCisgICAgICAgIExpc3QgYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIC8qIE9QVElPTkFMIENPTU1BTkQgTElORSBQQVJBTUVURVJTICovCisKKyAgICAgICAgaWYgKGRlYnVnT3V0cHV0KSB7CisgICAgICAgICAgICBhcmd1bWVudHMuYWRkKCItZGVidWciKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vIGJlYW50eXBlIGZsYWcgaXMgbmVlZGVkIGZvciBhbiBlbnRpdHkgYmVhbiAqLworICAgICAgICBpZiAoZWpiLmdldEJlYW50eXBlKCkuZXF1YWxzKFNUQVRFTEVTU19TRVNTSU9OKSkgeworICAgICAgICAgICAgYXJndW1lbnRzLmFkZCgiLXNsIik7CisgICAgICAgIH0gZWxzZSBpZiAoZWpiLmdldEJlYW50eXBlKCkuZXF1YWxzKFNUQVRFRlVMX1NFU1NJT04pKSB7CisgICAgICAgICAgICBhcmd1bWVudHMuYWRkKCItc2YiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlamIuZ2V0SWlvcCgpKSB7CisgICAgICAgICAgICBhcmd1bWVudHMuYWRkKCItaWlvcCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVqYi5nZXRDbXAoKSkgeworICAgICAgICAgICAgYXJndW1lbnRzLmFkZCgiLWNtcCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldGFpblNvdXJjZSkgeworICAgICAgICAgICAgYXJndW1lbnRzLmFkZCgiLWdzIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZWpiLmdldEhhc2Vzc2lvbigpKSB7CisgICAgICAgICAgICBhcmd1bWVudHMuYWRkKCItZm8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJFUVVJUkVEIENPTU1BTkQgTElORSBQQVJBTUVURVJTICovCisKKyAgICAgICAgYXJndW1lbnRzLmFkZCgiLWNsYXNzcGF0aCIpOworICAgICAgICBhcmd1bWVudHMuYWRkKGNsYXNzcGF0aCk7CisKKyAgICAgICAgYXJndW1lbnRzLmFkZCgiLWQiKTsKKyAgICAgICAgYXJndW1lbnRzLmFkZChkZXN0RGlyZWN0b3J5LnRvU3RyaW5nKCkpOworCisgICAgICAgIGFyZ3VtZW50cy5hZGQoZWpiLmdldEhvbWUoKS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSk7CisgICAgICAgIGFyZ3VtZW50cy5hZGQoZWpiLmdldFJlbW90ZSgpLmdldFF1YWxpZmllZENsYXNzTmFtZSgpKTsKKyAgICAgICAgYXJndW1lbnRzLmFkZChlamIuZ2V0SW1wbGVtZW50YXRpb24oKS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSk7CisKKyAgICAgICAgLyogQ29udmVydCB0aGUgTGlzdCBpbnRvIGFuIEFycmF5IGFuZCByZXR1cm4gaXQgKi8KKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgYXJndW1lbnRzLnRvQXJyYXkobmV3IFN0cmluZ1thcmd1bWVudHMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHVzZWQgdG8gcHJpbnQgbWVzc2FnZXMgdG8gdGhlIHVzZXIgaWYgZGVidWdnaW5nCisgICAgICogbWVzc2FnZXMgYXJlIGVuYWJsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnIFRoZSBTdHJpbmcgdG8gcHJpbnQgdG8gc3RhbmRhcmQgb3V0cHV0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBpZiAoZGVidWdPdXRwdXQpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBJbm5lciBjbGFzc2VzIGZvbGxvdyAqLworCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHVzZWQgdG8gc2lnbmFsIGFueSBwcm9ibGVtcyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZgorICAgICAqIHRoZSBlamJjIGNvbXBpbGVyLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGNsYXNzIEVqYmNFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdGl2ZSBtZXNzYWdlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbXNnIERlc2NyaXB0aW9uIG9mIHRoZSBleGNlcHRpb24gd2hpY2ggaGFzIG9jY3VycmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVqYmNFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgfQorICAgIH0gIC8vIEVuZCBvZiBFamJjRXhjZXB0aW9uIGlubmVyIGNsYXNzCisKKworICAgIC8qKgorICAgICAqIFRoaXMgaW5uZXIgY2xhc3MgaXMgYW4gWE1MIGRvY3VtZW50IGhhbmRsZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXJzZSBFSkIKKyAgICAgKiBkZXNjcmlwdG9ycyAoYm90aCB0aGUgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IgYXMgd2VsbCBhcyB0aGUgaUFTLXNwZWNpZmljCisgICAgICogZGVzY3JpcHRvciB0aGF0IHN0b3JlcyBhZGRpdGlvbmFsIHZhbHVlcyBmb3IgaUFTKS4gIE9uY2UgdGhlIGRlc2NyaXB0b3JzCisgICAgICogaGF2ZSBiZWVuIHByb2Nlc3NlZCwgdGhlIGxpc3Qgb2YgRUpCcyBmb3VuZCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZworICAgICAqIHRoZSA8Y29kZT5nZXRFamJzKCk8L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBzZWUgICAgSVBsYW5ldEVqYmMuRWpiSW5mbworICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgRWpiY0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyQmFzZSB7CisgICAgICAgIC8qKiBFSkIgMS4xIElEICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNJRF9FSkIxMSA9CisgICAgICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iOworICAgICAgICAvKiogSVBsYW5ldCBJRCAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDSURfSVBMQU5FVF9FSkJfNjAgPQorICAgICAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBpQVMgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4wLy9FTiI7CisgICAgICAgIC8qKiBFSkIgMS4xIGxvY2F0aW9uICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lBUzYwX0VKQjExX0RURF9MT0NBVElPTiA9CisgICAgICAgICAgICAiZWpiLWphcl8xXzEuZHRkIjsKKyAgICAgICAgLyoqIElBUzYwIGxvY2F0aW9uICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lBUzYwX0RURF9MT0NBVElPTiA9CisgICAgICAgICAgICAiSUFTRWpiX2phcl8xXzAuZHRkIjsKKworICAgICAgICAvKgorICAgICAgICAgKiBUd28gTWFwcyBhcmUgdXNlZCB0byB0cmFjayBsb2NhbCBEVERzIHRoYXQgd2lsbCBiZSB1c2VkIGluIGNhc2UgdGhlCisgICAgICAgICAqIHJlbW90ZSBjb3BpZXMgb2YgdGhlc2UgRFREcyBjYW5ub3QgYmUgYWNjZXNzZWQuICBUaGUga2V5IGZvciB0aGUgTWFwCisgICAgICAgICAqIGlzIHRoZSBEVERzIHB1YmxpYyBJRCBhbmQgdGhlIHZhbHVlIGlzIHRoZSBsb2NhbCBsb2NhdGlvbiBmb3IgdGhlIERURAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBNYXAgICAgICAgcmVzb3VyY2VEdGRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcHJpdmF0ZSBNYXAgICAgICAgZmlsZUR0ZHMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgIHByaXZhdGUgTWFwICAgICAgIGVqYnMgPSBuZXcgSGFzaE1hcCgpOyAgICAgIC8vIExpc3Qgb2YgRUpCcyBmb3VuZCBpbiBYTUwKKyAgICAgICAgcHJpdmF0ZSBFamJJbmZvICAgY3VycmVudEVqYjsgICAgICAgICAgICAgLy8gT25lIGl0ZW0gd2l0aGluIHRoZSBNYXAKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgaWFzRGVzY3JpcHRvciA9IGZhbHNlOyAgLy8gSXMgZG9jIGlBUyBvciBFSkIgZGVzY3JpcHRvcgorCisgICAgICAgIHByaXZhdGUgU3RyaW5nICAgIGN1cnJlbnRMb2MgPSAiIjsgICAgICAgIC8vIFRyYWNrcyBjdXJyZW50IGVsZW1lbnQKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgICAgY3VycmVudFRleHQ7ICAgICAgICAgICAgLy8gVHJhY2tzIGN1cnJlbnQgdGV4dCBkYXRhCisgICAgICAgIHByaXZhdGUgU3RyaW5nICAgIGVqYlR5cGU7ICAgICAgICAgICAgICAgIC8vICJzZXNzaW9uIiBvciAiZW50aXR5IgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBoYW5kbGVyIGFuZCByZWdpc3RlcnMgbG9jYWwgY29waWVzCisgICAgICAgICAqIG9mIHRoZSBzdGFuZGFyZCBFSkIgMS4xIGRlc2NyaXB0b3IgRFREIGFzIHdlbGwgYXMgaUFTJ3MgRUpCCisgICAgICAgICAqIGRlc2NyaXB0b3IgRFRELgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVqYmNIYW5kbGVyKCkgeworICAgICAgICAgICAgcmVnaXN0ZXJEVEQoUFVCTElDSURfRUpCMTEsIERFRkFVTFRfSUFTNjBfRUpCMTFfRFREX0xPQ0FUSU9OKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyRFREKFBVQkxJQ0lEX0lQTEFORVRfRUpCXzYwLCBERUZBVUxUX0lBUzYwX0RURF9MT0NBVElPTik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBFSkIgb2JqZWN0cyBmb3VuZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdGhlCisgICAgICAgICAqIHN0YW5kYXJkIEVKQiAxLjEgZGVzY3JpcHRvciBhbmQgaUFTLXNwZWNpZmljIEVKQiBkZXNjcmlwdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIEVKQnMgd2hpY2ggd2VyZSBmb3VuZCBkdXJpbmcgdGhlIGRlc2NyaXB0b3IKKyAgICAgICAgICogICAgICAgICBwYXJzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVqYkluZm9bXSBnZXRFamJzKCkgeworICAgICAgICAgICAgcmV0dXJuIChFamJJbmZvW10pIGVqYnMudmFsdWVzKCkudG9BcnJheShuZXcgRWpiSW5mb1tlamJzLnNpemUoKV0pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBmb3VuZCBpbiB0aGUgc3RhbmRhcmQKKyAgICAgICAgICogRUpCIDEuMSBkZXNjcmlwdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyBkaXNwbGF5LW5hbWUgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXlOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVycyBhIGxvY2FsIERURCB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHBhcnNpbmcgYW4gRUpCCisgICAgICAgICAqIGRlc2NyaXB0b3IuICBXaGVuIHRoZSBEVEQncyBwdWJsaWMgaWRlbnRpZmllciBpcyBmb3VuZCBpbiBhbiBYTUwKKyAgICAgICAgICogZG9jdW1lbnQsIHRoZSBwYXJzZXIgd2lsbCByZWZlcmVuY2UgdGhlIGxvY2FsIERURCByYXRoZXIgdGhhbiB0aGUKKyAgICAgICAgICogcmVtb3RlIERURC4gIFRoaXMgZW5hYmxlcyBYTUwgZG9jdW1lbnRzIHRvIGJlIHByb2Nlc3NlZCBldmVuIHdoZW4gdGhlCisgICAgICAgICAqIHB1YmxpYyBEVEQgaXNuJ3QgYXZhaWxhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHVibGljSUQgVGhlIERURCdzIHB1YmxpYyBpZGVudGlmaWVyLgorICAgICAgICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBsb2NhbCBEVEQgY29weSAtLSB0aGUgbG9jYXRpb24KKyAgICAgICAgICogICAgICAgICAgICAgICAgIG1heSBlaXRoZXIgYmUgYSByZXNvdXJjZSBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoIG9yIGEKKyAgICAgICAgICogICAgICAgICAgICAgICAgIGxvY2FsIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRURChTdHJpbmcgcHVibGljSUQsIFN0cmluZyBsb2NhdGlvbikgeworICAgICAgICAgICAgbG9nKCJSZWdpc3RlcmluZzogIiArIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIGlmICgocHVibGljSUQgPT0gbnVsbCkgfHwgKGxvY2F0aW9uID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UobG9jYXRpb24pICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2coIkZvdW5kIHJlc291cmNlOiAiICsgbG9jYXRpb24pOworICAgICAgICAgICAgICAgIHJlc291cmNlRHRkcy5wdXQocHVibGljSUQsIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRmlsZSBkdGRGaWxlID0gbmV3IEZpbGUobG9jYXRpb24pOworICAgICAgICAgICAgICAgIGlmIChkdGRGaWxlLmV4aXN0cygpICYmIGR0ZEZpbGUuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZCBmaWxlOiAiICsgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICBmaWxlRHRkcy5wdXQocHVibGljSUQsIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb2x2ZXMgYW4gZXh0ZXJuYWwgZW50aXR5IGZvdW5kIGR1cmluZyBYTUwgcHJvY2Vzc2luZy4gIElmIGEgcHVibGljCisgICAgICAgICAqIElEIGlzIGZvdW5kIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBoYW5kbGVyLCBhbiA8Y29kZT4KKyAgICAgICAgICogSW5wdXRTb3VyY2U8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQgd2hpY2ggcmVmZXJzIHRvIHRoZSBsb2NhbCBjb3B5LgorICAgICAgICAgKiBJZiB0aGUgcHVibGljIElEIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgb3IgaWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUKKyAgICAgICAgICogc3VwZXJjbGFzcyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIERURCdzIHB1YmxpYyBpZGVudGlmaWVyLgorICAgICAgICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQsIGFzIGZvdW5kIGluIHRoZSBYTUwgZG9jdW1lbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKworCisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgLyogU2VhcmNoIHRoZSByZXNvdXJjZSBNYXAgYW5kIChpZiBub3QgZm91bmQpIGZpbGUgTWFwICovCisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSAoU3RyaW5nKSByZXNvdXJjZUR0ZHMuZ2V0KHB1YmxpY0lkKTsKKyAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShsb2NhdGlvbikub3BlblN0cmVhbSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gKFN0cmluZykgZmlsZUR0ZHMuZ2V0KHB1YmxpY0lkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVFbnRpdHkocHVibGljSWQsIHN5c3RlbUlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdGFydCBvZiBhbiBYTUwgZWxlbWVudCBoYXMgYmVlbiBmb3VuZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgU3RyaW5nIG5hbWUgb2YgdGhlIGVsZW1lbnQgZm91bmQuCisgICAgICAgICAqIEBwYXJhbSBhdHRzIEF0dHJpYnV0ZUxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgaW5jbHVkZWQgd2l0aCB0aGUgZWxlbWVudAorICAgICAgICAgKiAgICAgICAgICAgICAoaWYgYW55KS4KKyAgICAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgdGhlIHBhcnNlciBjYW5ub3QgcHJvY2VzcyB0aGUgZG9jdW1lbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cykKKyAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEkgbmVlZCB0byAicHVzaCIgdGhlIGVsZW1lbnQgb250byB0aGUgU3RyaW5nIChjdXJyZW50TG9jKSB3aGljaAorICAgICAgICAgICAgICogYWx3YXlzIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY3VycmVudExvYyArPSAiXFwiICsgbmFtZTsKKworICAgICAgICAgICAgLyogQSBuZXcgZWxlbWVudCBoYXMgc3RhcnRlZCwgc28gcmVzZXQgdGhlIHRleHQgYmVpbmcgY2FwdHVyZWQgKi8KKyAgICAgICAgICAgIGN1cnJlbnRUZXh0ID0gIiI7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50TG9jLmVxdWFscygiXFxlamItamFyIikpIHsKKyAgICAgICAgICAgICAgICBpYXNEZXNjcmlwdG9yID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKCJcXGlhcy1lamItamFyIikpIHsKKyAgICAgICAgICAgICAgICBpYXNEZXNjcmlwdG9yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChuYW1lLmVxdWFscygic2Vzc2lvbiIpKSB8fCAobmFtZS5lcXVhbHMoImVudGl0eSIpKSkgeworICAgICAgICAgICAgICAgIGVqYlR5cGUgPSBuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgY2hhcmFjdGVyIGRhdGEgaGFzIGJlZW4gZm91bmQgaW4gdGhlIFhNTAorICAgICAgICAgKiBkb2N1bWVudAorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2ggQXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnRpbmcgaW5kZXggb2YgdGhlIGRhdGEgZm91bmQgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3VuZCBpbiB0aGUgZG9jdW1lbnQuCisgICAgICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIElmIHRoZSBwYXJzZXIgY2Fubm90IHByb2Nlc3MgdGhlIGRvY3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbikKKyAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgY3VycmVudFRleHQgKz0gbmV3IFN0cmluZyhjaCkuc3Vic3RyaW5nKHN0YXJ0LCBzdGFydCArIGxlbik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCB0aGUgZW5kIG9mIGFuIFhNTCBlbGVtZW50IGhhcyBiZWVuIGZvdW5kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBTdHJpbmcgbmFtZSBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgdGhlIHBhcnNlciBjYW5ub3QgcHJvY2VzcyB0aGUgZG9jdW1lbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIHRoaXMgaXMgYSBzdGFuZGFyZCBFSkIgMS4xIGRlc2NyaXB0b3IsIHdlIGFyZSBsb29raW5nIGZvciBvbmUKKyAgICAgICAgICAgICAqIHNldCBvZiBkYXRhLCB3aGlsZSBpZiB0aGlzIGlzIGFuIGlBUy1zcGVjaWZpYyBkZXNjcmlwdG9yLCB3ZSdyZQorICAgICAgICAgICAgICogbG9va2luZyBmb3IgZGlmZmVyZW50IHNldCBvZiBkYXRhLiAgSGFuZCB0aGUgcHJvY2Vzc2luZyBvZmYgdG8KKyAgICAgICAgICAgICAqIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpYXNEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgaWFzQ2hhcmFjdGVycyhjdXJyZW50VGV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0ZENoYXJhY3RlcnMoY3VycmVudFRleHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSSBuZWVkIHRvICJwb3AiIHRoZSBlbGVtZW50IG9mZiB0aGUgU3RyaW5nIChjdXJyZW50TG9jKSB3aGljaAorICAgICAgICAgICAgICogYWx3YXlzIHJlcHJlc2VudHMgbXkgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgWE1MIGRvY3VtZW50LgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGludCBuYW1lTGVuZ3RoID0gbmFtZS5sZW5ndGgoKSArIDE7IC8vIEFkZCBvbmUgZm9yIHRoZSAiXCIKKyAgICAgICAgICAgIGludCBsb2NMZW5ndGggID0gY3VycmVudExvYy5sZW5ndGgoKTsKKworICAgICAgICAgICAgY3VycmVudExvYyA9IGN1cnJlbnRMb2Muc3Vic3RyaW5nKDAsIGxvY0xlbmd0aCAtIG5hbWVMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgY2hhcmFjdGVyIGRhdGEgaGFzIGJlZW4gZm91bmQgaW4gYSBzdGFuZGFyZAorICAgICAgICAgKiBFSkIgMS4xIGRlc2NyaXB0b3IuICBXZSdyZSBpbnRlcmVzdGVkIGluIHJldHJpZXZpbmcgdGhlIGhvbWUKKyAgICAgICAgICogaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlLCBpbXBsZW1lbnRhdGlvbiBjbGFzcywgdGhlIHR5cGUgb2YgYmVhbiwKKyAgICAgICAgICogYW5kIGlmIHRoZSBiZWFuIHVzZXMgQ01QLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgU3RyaW5nIGRhdGEgZm91bmQgaW4gdGhlIFhNTCBkb2N1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBzdGRDaGFyYWN0ZXJzKFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgICAgICBpZiAoY3VycmVudExvYy5lcXVhbHMoIlxcZWpiLWphclxcZGlzcGxheS1uYW1lIikpIHsKKyAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGJhc2UgPSAiXFxlamItamFyXFxlbnRlcnByaXNlLWJlYW5zXFwiICsgZWpiVHlwZTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxlamItbmFtZSIpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEVqYiA9IChFamJJbmZvKSBlamJzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFamIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWpiID0gbmV3IEVqYkluZm8odmFsdWUpOworICAgICAgICAgICAgICAgICAgICBlamJzLnB1dCh2YWx1ZSwgY3VycmVudEVqYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcaG9tZSIpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEVqYi5zZXRIb21lKHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXHJlbW90ZSIpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEVqYi5zZXRSZW1vdGUodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcZWpiLWNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldEltcGxlbWVudGF0aW9uKHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXHByaW0ta2V5LWNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldFByaW1hcnlLZXkodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcc2Vzc2lvbi10eXBlIikpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldEJlYW50eXBlKHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXHBlcnNpc3RlbmNlLXR5cGUiKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRFamIuc2V0Q21wKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IGNoYXJhY3RlciBkYXRhIGhhcyBiZWVuIGZvdW5kIGluIGFuCisgICAgICAgICAqIGlBUy1zcGVjaWZpYyBkZXNjcmlwdG9yLiAgV2UncmUgaW50ZXJlc3RlZCBpbiByZXRyaWV2aW5nIGRhdGEKKyAgICAgICAgICogaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBiZWFuIG11c3Qgc3VwcG9ydCBSTUkvSUlPUCBhY2Nlc3MsIHdoZXRoZXIKKyAgICAgICAgICogdGhlIGJlYW4gbXVzdCBwcm92aWRlIGhpZ2hseSBhdmFpbGFibGUgc3R1YnMgYW5kIHNrZWxldG9ucyAoaW4gdGhlCisgICAgICAgICAqIGNhc2Ugb2Ygc3RhdGVmdWwgc2Vzc2lvbiBiZWFucyksIGFuZCBpZiB0aGlzIGJlYW4gdXNlcyBhZGRpdGlvbmFsCisgICAgICAgICAqIENNUCBYTUwgZGVzY3JpcHRvcnMgKGluIHRoZSBjYXNlIG9mIGVudGl0eSBiZWFucyB3aXRoIENNUCkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgZGF0YSBmb3VuZCBpbiB0aGUgWE1MIGRvY3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGlhc0NoYXJhY3RlcnMoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBTdHJpbmcgYmFzZSA9ICJcXGlhcy1lamItamFyXFxlbnRlcnByaXNlLWJlYW5zXFwiICsgZWpiVHlwZTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxlamItbmFtZSIpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEVqYiA9IChFamJJbmZvKSBlamJzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFamIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWpiID0gbmV3IEVqYkluZm8odmFsdWUpOworICAgICAgICAgICAgICAgICAgICBlamJzLnB1dCh2YWx1ZSwgY3VycmVudEVqYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcaWlvcCIpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEVqYi5zZXRJaW9wKHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXGZhaWxvdmVyLXJlcXVpcmVkIikpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldEhhc2Vzc2lvbih2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxwZXJzaXN0ZW5jZS1tYW5hZ2VyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxccHJvcGVydGllcy1maWxlLWxvY2F0aW9uIikpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RWpiLmFkZENtcERlc2NyaXB0b3IodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgLy8gRW5kIG9mIEVqYmNIYW5kbGVyIGlubmVyIGNsYXNzCisKKworICAgIC8qKgorICAgICAqIFRoaXMgaW5uZXIgY2xhc3MgcmVwcmVzZW50cyBhbiBFSkIgdGhhdCB3aWxsIGJlIGNvbXBpbGVkIHVzaW5nIGVqYmMuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEVqYkluZm8geworICAgICAgICBwcml2YXRlIFN0cmluZyAgICAgbmFtZTsgICAgICAgICAgICAgIC8vIEVKQidzIGRpc3BsYXkgbmFtZQorICAgICAgICBwcml2YXRlIENsYXNzbmFtZSAgaG9tZTsgICAgICAgICAgICAgIC8vIEVKQidzIGhvbWUgaW50ZXJmYWNlIG5hbWUKKyAgICAgICAgcHJpdmF0ZSBDbGFzc25hbWUgIHJlbW90ZTsgICAgICAgICAgICAvLyBFSkIncyByZW1vdGUgaW50ZXJmYWNlIG5hbWUKKyAgICAgICAgcHJpdmF0ZSBDbGFzc25hbWUgIGltcGxlbWVudGF0aW9uOyAgICAgIC8vIEVKQidzIGltcGxlbWVudGF0aW9uIGNsYXNzCisgICAgICAgIHByaXZhdGUgQ2xhc3NuYW1lICBwcmltYXJ5S2V5OyAgICAgICAgLy8gRUpCJ3MgcHJpbWFyeSBrZXkgY2xhc3MKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgIGJlYW50eXBlID0gImVudGl0eSI7ICAvLyBvciAic3RhdGVmdWwiIG9yICJzdGF0ZWxlc3MiCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjbXAgICAgICAgPSBmYWxzZTsgICAgICAvLyBEb2VzIHRoaXMgRUpCIHN1cHBvcnQgQ01QPworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaWlvcCAgICAgID0gZmFsc2U7ICAgICAgLy8gRG9lcyB0aGlzIEVKQiBzdXBwb3J0IElJT1A/CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNlc3Npb24gPSBmYWxzZTsgICAgICAvLyBEb2VzIHRoaXMgRUpCIHJlcXVpcmUgZmFpbG92ZXI/CisgICAgICAgIHByaXZhdGUgTGlzdCBjbXBEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsgIC8vIENNUCBkZXNjcmlwdG9yIGxpc3QKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgbmV3IEVKQkluZm8gb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBFSkIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRWpiSW5mbyhTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIEVKQi4gIElmIGEgZGlzcGxheSBuYW1lIGhhcyBub3QgYmVlbgorICAgICAgICAgKiBzZXQsIGl0IHJldHVybnMgdGhlIEVKQiBpbXBsZW1lbnRhdGlvbiBjbGFzc25hbWUgKGlmIHRoZQorICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpcyBub3Qgc2V0LCBpdCByZXR1cm5zICJbdW5uYW1lZF0iKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgZGlzcGxheSBuYW1lIGZvciB0aGUgRUpCLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiW3VubmFtZWRdIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb24uZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBCZWxvdyBhcmUgZ2V0dGVyJ3MgYW5kIHNldHRlcidzIGZvciBlYWNoIG9mIHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMuCisgICAgICAgICAqIE5vdGUgdGhhdCAoaW4gYWRkaXRpb24gdG8gc3VwcG9ydGluZyBzZXR0ZXJzIHdpdGggdGhlIHNhbWUgdHlwZSBhcworICAgICAgICAgKiB0aGUgaW5zdGFuY2UgdmFyaWFibGUpIGEgc2V0dGVyIGlzIHByb3ZpZGVkIHdpdGggdGFrZXMgYSBTdHJpbmcKKyAgICAgICAgICogYXJndW1lbnQgLS0gdGhpcyBhcmUgcHJvdmlkZWQgc28gdGhlIFhNTCBkb2N1bWVudCBoYW5kbGVyIGNhbiBzZXQKKyAgICAgICAgICogdGhlIEVKQiB2YWx1ZXMgdXNpbmcgdGhlIFN0cmluZ3MgaXQgcGFyc2VzLgorICAgICAgICAgKi8KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyBob21lKSB7CisgICAgICAgICAgICBzZXRIb21lKG5ldyBDbGFzc25hbWUoaG9tZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SG9tZShDbGFzc25hbWUgaG9tZSkgeworICAgICAgICAgICAgdGhpcy5ob21lID0gaG9tZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc25hbWUgZ2V0SG9tZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBob21lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlKFN0cmluZyByZW1vdGUpIHsKKyAgICAgICAgICAgIHNldFJlbW90ZShuZXcgQ2xhc3NuYW1lKHJlbW90ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlKENsYXNzbmFtZSByZW1vdGUpIHsKKyAgICAgICAgICAgIHRoaXMucmVtb3RlID0gcmVtb3RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzbmFtZSBnZXRSZW1vdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVtb3RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb24oU3RyaW5nIGltcGxlbWVudGF0aW9uKSB7CisgICAgICAgICAgICBzZXRJbXBsZW1lbnRhdGlvbihuZXcgQ2xhc3NuYW1lKGltcGxlbWVudGF0aW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvbihDbGFzc25hbWUgaW1wbGVtZW50YXRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc25hbWUgZ2V0SW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5S2V5KFN0cmluZyBwcmltYXJ5S2V5KSB7CisgICAgICAgICAgICBzZXRQcmltYXJ5S2V5KG5ldyBDbGFzc25hbWUocHJpbWFyeUtleSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShDbGFzc25hbWUgcHJpbWFyeUtleSkgeworICAgICAgICAgICAgdGhpcy5wcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc25hbWUgZ2V0UHJpbWFyeUtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJ5S2V5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QmVhbnR5cGUoU3RyaW5nIGJlYW50eXBlKSB7CisgICAgICAgICAgICB0aGlzLmJlYW50eXBlID0gYmVhbnR5cGUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVhbnR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gYmVhbnR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbXAoYm9vbGVhbiBjbXApIHsKKyAgICAgICAgICAgIHRoaXMuY21wID0gY21wOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q21wKFN0cmluZyBjbXApIHsKKyAgICAgICAgICAgIHNldENtcChjbXAuZXF1YWxzKCJDb250YWluZXIiKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbXAoKSB7CisgICAgICAgICAgICByZXR1cm4gY21wOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SWlvcChib29sZWFuIGlpb3ApIHsKKyAgICAgICAgICAgIHRoaXMuaWlvcCA9IGlpb3A7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRJaW9wKFN0cmluZyBpaW9wKSB7CisgICAgICAgICAgICBzZXRJaW9wKGlpb3AuZXF1YWxzKCJ0cnVlIikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0SWlvcCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpaW9wOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SGFzZXNzaW9uKGJvb2xlYW4gaGFzZXNzaW9uKSB7CisgICAgICAgICAgICB0aGlzLmhhc2Vzc2lvbiA9IGhhc2Vzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEhhc2Vzc2lvbihTdHJpbmcgaGFzZXNzaW9uKSB7CisgICAgICAgICAgICBzZXRIYXNlc3Npb24oaGFzZXNzaW9uLmVxdWFscygidHJ1ZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldEhhc2Vzc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRDbXBEZXNjcmlwdG9yKFN0cmluZyBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBjbXBEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdCBnZXRDbXBEZXNjcmlwdG9ycygpIHsKKyAgICAgICAgICAgIHJldHVybiBjbXBEZXNjcmlwdG9yczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSBFSkIgaXMgdmFsaWQtLWlmIGl0IGlzIGludmFsaWQsIGFuIGV4Y2VwdGlvbiBpcworICAgICAgICAgKiB0aHJvd24KKyAgICAgICAgICoKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ1aWxkRGlyIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIEVKQiByZW1vdGUgaW50ZXJmYWNlLCBob21lCisgICAgICAgICAqICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBtdXN0IGJlIGZvdW5kLgorICAgICAgICAgKiBAdGhyb3dzIEVqYmNFeGNlcHRpb24gSWYgdGhlIEVKQiBpcyBpbnZhbGlkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbihGaWxlIGJ1aWxkRGlyKSB0aHJvd3MgRWpiY0V4Y2VwdGlvbiAgeworCisgICAgICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSB2YWxpZCAqLworICAgICAgICAgICAgaWYgKGhvbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJBIGhvbWUgaW50ZXJmYWNlIHdhcyBub3QgZm91bmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZvciB0aGUgIiArIG5hbWUgKyAiIEVKQi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZW1vdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJBIHJlbW90ZSBpbnRlcmZhY2Ugd2FzIG5vdCBmb3VuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZm9yIHRoZSAiICsgbmFtZSArICIgRUpCLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbigiQW4gRUpCIGltcGxlbWVudGF0aW9uIGNsYXNzIHdhcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZvdW5kIGZvciB0aGUgIiArIG5hbWUgKyAiIEVKQi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCghYmVhbnR5cGUuZXF1YWxzKEVOVElUWV9CRUFOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghYmVhbnR5cGUuZXF1YWxzKFNUQVRFTEVTU19TRVNTSU9OKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghYmVhbnR5cGUuZXF1YWxzKFNUQVRFRlVMX1NFU1NJT04pKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJUaGUgYmVhbnR5cGUgZm91bmQgKCIgKyBiZWFudHlwZSArICIpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpc24ndCB2YWxpZCBpbiB0aGUgIiArIG5hbWUgKyAiIEVKQi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNtcCAmJiAoIWJlYW50eXBlLmVxdWFscyhFTlRJVFlfQkVBTikpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDTVAgc3R1YnMgYW5kIHNrZWxldG9ucyBtYXkgbm90IGJlIGdlbmVyYXRlZCIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBhIFNlc3Npb24gQmVhbiAtLSB0aGUgXCJjbXBcIiBhdHRyaWJ1dGUgd2lsbCBiZSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlnbm9yZWRmb3IgdGhlICIgKyBuYW1lICsgIiBFSkIuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYXNlc3Npb24gJiYgKCFiZWFudHlwZS5lcXVhbHMoU1RBVEVGVUxfU0VTU0lPTikpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIaWdobHkgYXZhaWxhYmxlIHN0dWJzIGFuZCBza2VsZXRvbnMgbWF5ICIKKyAgICAgICAgICAgICAgICAgICAgKyAib25seSBiZSBnZW5lcmF0ZWQgZm9yIGEgU3RhdGVmdWwgU2Vzc2lvbiBCZWFuIC0tIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICsgIlwiaGFzZXNzaW9uXCIgYXR0cmlidXRlIHdpbGwgYmUgaWdub3JlZCBmb3IgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiBFSkIuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIEVKQiAic291cmNlIiBjbGFzc2VzIGFsbCBleGlzdCAqLworICAgICAgICAgICAgaWYgKCFyZW1vdGUuZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJUaGUgcmVtb3RlIGludGVyZmFjZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZW1vdGUuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgKyAiIGNvdWxkIG5vdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZm91bmQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhvbWUuZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJUaGUgaG9tZSBpbnRlcmZhY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG9tZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSArICIgY291bGQgbm90IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3VuZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaW1wbGVtZW50YXRpb24uZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJUaGUgRUpCIGltcGxlbWVudGF0aW9uIGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGltcGxlbWVudGF0aW9uLmdldFF1YWxpZmllZENsYXNzTmFtZSgpICsgIiBjb3VsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibm90IGJlIGZvdW5kLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERldGVybWluZXMgaWYgdGhlIGVqYmMgdXRpbGl0eSBuZWVkcyB0byBiZSBydW4gb3Igbm90LiAgSWYgdGhlIHN0dWJzCisgICAgICAgICAqIGFuZCBza2VsZXRvbnMgY2FuIGFsbCBiZSBmb3VuZCBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IEFORCBhbGwKKyAgICAgICAgICogb2YgdGhlaXIgdGltZXN0YW1wcyBhcmUgbW9yZSByZWNlbnQgdGhhbiB0aGUgRUpCIHNvdXJjZSBjbGFzc2VzCisgICAgICAgICAqIChob21lLCByZW1vdGUsIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzKSwgdGhlIG1ldGhvZCByZXR1cm5zCisgICAgICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gIE90aGVyd2lzZSwgdGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVzdERpciBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBFSkIgc291cmNlIGNsYXNzZXMsIHN0dWJzIGFuZAorICAgICAgICAgKiAgICAgICAgICAgICAgICBza2VsZXRvbnMgYXJlIGxvY2F0ZWQuCisgICAgICAgICAqIEByZXR1cm4gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGVqYmMgdXRpbGl0eSBuZWVkcyB0bworICAgICAgICAgKiAgICAgICAgIGJlIHJ1biB0byBicmluZyB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyB1cCB0byBkYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gbXVzdEJlUmVjb21waWxlZChGaWxlIGRlc3REaXIpIHsKKworICAgICAgICAgICAgbG9uZyBzb3VyY2VNb2RpZmllZCA9IHNvdXJjZUNsYXNzZXNNb2RpZmllZChkZXN0RGlyKTsKKworICAgICAgICAgICAgbG9uZyBkZXN0TW9kaWZpZWQgPSBkZXN0Q2xhc3Nlc01vZGlmaWVkKGRlc3REaXIpOworCisgICAgICAgICAgICByZXR1cm4gKGRlc3RNb2RpZmllZCA8IHNvdXJjZU1vZGlmaWVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGFtaW5lcyBlYWNoIG9mIHRoZSBFSkIgc291cmNlIGNsYXNzZXMgKGhvbWUsIHJlbW90ZSwgYW5kCisgICAgICAgICAqIGltcGxlbWVudGF0aW9uKSBhbmQgcmV0dXJucyB0aGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBmb3IgdGhlCisgICAgICAgICAqICJvbGRlc3QiIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIFRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB0byBmaW5kIHRoZSBzb3VyY2UgRUpCCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgY2xhc3Nlcy4gIElmIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgc3lzdGVtIGNsYXNzcGF0aAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgIGlzIHVzZWQuCisgICAgICAgICAqIEByZXR1cm4gVGhlIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSAib2xkZXN0IiBFSkIgc291cmNlIGNsYXNzLgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIElmIG9uZSBvZiB0aGUgRUpCIHNvdXJjZSBjbGFzc2VzIGNhbm5vdCBiZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kIG9uIHRoZSBjbGFzc3BhdGguCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGxvbmcgc291cmNlQ2xhc3Nlc01vZGlmaWVkKEZpbGUgYnVpbGREaXIpIHsKKyAgICAgICAgICAgIGxvbmcgbGF0ZXN0TW9kaWZpZWQ7IC8vIFRoZSB0aW1lc3RhbXAgb2YgdGhlICJuZXdlc3QiIGNsYXNzCisgICAgICAgICAgICBsb25nIG1vZGlmaWVkOyAgICAgICAvLyBUaW1lc3RhbXAgZm9yIGEgZ2l2ZW4gY2xhc3MKKyAgICAgICAgICAgIEZpbGUgcmVtb3RlRmlsZTsgICAgIC8vIEZpbGUgZm9yIHRoZSByZW1vdGUgaW50ZXJmYWNlIGNsYXNzCisgICAgICAgICAgICBGaWxlIGhvbWVGaWxlOyAgICAgICAvLyBGaWxlIGZvciB0aGUgaG9tZSBpbnRlcmZhY2UgY2xhc3MKKyAgICAgICAgICAgIEZpbGUgaW1wbEZpbGU7ICAgICAgIC8vIEZpbGUgZm9yIHRoZSBFSkIgaW1wbGVtZW50YXRpb24gY2xhc3MKKyAgICAgICAgICAgIEZpbGUgcGtGaWxlOyAgICAgICAgIC8vIEZpbGUgZm9yIHRoZSBFSkIgcHJpbWFyeSBrZXkgY2xhc3MKKworICAgICAgICAgICAgLyogQ2hlY2sgdGhlIHRpbWVzdGFtcCBvbiB0aGUgcmVtb3RlIGludGVyZmFjZSAqLworICAgICAgICAgICAgcmVtb3RlRmlsZSA9IHJlbW90ZS5nZXRDbGFzc0ZpbGUoYnVpbGREaXIpOworICAgICAgICAgICAgbW9kaWZpZWQgPSByZW1vdGVGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgaWYgKG1vZGlmaWVkID09IC0xKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlbW90ZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSArICIgY291bGRuJ3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZSBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGF0ZXN0TW9kaWZpZWQgPSBtb2RpZmllZDsKKworICAgICAgICAgICAgLyogQ2hlY2sgdGhlIHRpbWVzdGFtcCBvbiB0aGUgaG9tZSBpbnRlcmZhY2UgKi8KKyAgICAgICAgICAgIGhvbWVGaWxlID0gaG9tZS5nZXRDbGFzc0ZpbGUoYnVpbGREaXIpOworICAgICAgICAgICAgbW9kaWZpZWQgPSBob21lRmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGlmIChtb2RpZmllZCA9PSAtMSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBob21lLmdldFF1YWxpZmllZENsYXNzTmFtZSgpICsgIiBjb3VsZG4ndCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZvdW5kIG9uIHRoZSBjbGFzc3BhdGgiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXRlc3RNb2RpZmllZCA9IE1hdGgubWF4KGxhdGVzdE1vZGlmaWVkLCBtb2RpZmllZCk7CisKKyAgICAgICAgICAgIC8qIENoZWNrIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzICovCisgICAgICAgICAgICBpZiAocHJpbWFyeUtleSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGtGaWxlID0gcHJpbWFyeUtleS5nZXRDbGFzc0ZpbGUoYnVpbGREaXIpOworICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gcGtGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgICAgIGlmIChtb2RpZmllZCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByaW1hcnlLZXkuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgKyAiY291bGRuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZm91bmQgb24gdGhlIGNsYXNzcGF0aCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhdGVzdE1vZGlmaWVkID0gTWF0aC5tYXgobGF0ZXN0TW9kaWZpZWQsIG1vZGlmaWVkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGtGaWxlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ2hlY2sgdGhlIHRpbWVzdGFtcCBvbiB0aGUgRUpCIGltcGxlbWVudGF0aW9uIGNsYXNzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIE5vdGUgdGhhdCBpZiBPTkxZIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBoYXMgY2hhbmdlZCwgaXQncyBub3QKKyAgICAgICAgICAgICAqIG5lY2Vzc2FyeSB0byByZWJ1aWxkIHRoZSBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucy4gIEZvciB0aGlzCisgICAgICAgICAgICAgKiByZWFzb24sIHdlIGVuc3VyZSB0aGUgZmlsZSBleGlzdHMgKHVzaW5nIGxhc3RNb2RpZmllZCBhYm92ZSksIGJ1dAorICAgICAgICAgICAgICogd2UgRE9OJ1QgY29tcGFyZSBpdCdzIHRpbWVzdGFtcCB3aXRoIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSBob21lCisgICAgICAgICAgICAgKiBhbmQgcmVtb3RlIGludGVyZmFjZXMgKGJlY2F1c2UgaXQncyBpcnJlbGV2YW50IGluIGRldGVybWluaW5nIGlmCisgICAgICAgICAgICAgKiBlamJjIG11c3QgYmUgcnVuKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbXBsRmlsZSA9IGltcGxlbWVudGF0aW9uLmdldENsYXNzRmlsZShidWlsZERpcik7CisgICAgICAgICAgICBtb2RpZmllZCA9IGltcGxGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgaWYgKG1vZGlmaWVkID09IC0xKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGltcGxlbWVudGF0aW9uLmdldFF1YWxpZmllZENsYXNzTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb3VsZG4ndCBiZSBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgcGF0aFRvRmlsZSA9IHJlbW90ZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIHBhdGhUb0ZpbGUgPSBwYXRoVG9GaWxlLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyI7CisgICAgICAgICAgICBlamJGaWxlcy5wdXQocGF0aFRvRmlsZSwgcmVtb3RlRmlsZSk7CisKKyAgICAgICAgICAgIHBhdGhUb0ZpbGUgPSBob21lLmdldFF1YWxpZmllZENsYXNzTmFtZSgpOworICAgICAgICAgICAgcGF0aFRvRmlsZSA9IHBhdGhUb0ZpbGUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmNsYXNzIjsKKyAgICAgICAgICAgIGVqYkZpbGVzLnB1dChwYXRoVG9GaWxlLCBob21lRmlsZSk7CisKKyAgICAgICAgICAgIHBhdGhUb0ZpbGUgPSBpbXBsZW1lbnRhdGlvbi5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIHBhdGhUb0ZpbGUgPSBwYXRoVG9GaWxlLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyI7CisgICAgICAgICAgICBlamJGaWxlcy5wdXQocGF0aFRvRmlsZSwgaW1wbEZpbGUpOworCisgICAgICAgICAgICBpZiAocGtGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXRoVG9GaWxlID0gcHJpbWFyeUtleS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgICAgICBwYXRoVG9GaWxlID0gcGF0aFRvRmlsZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuY2xhc3MiOworICAgICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChwYXRoVG9GaWxlLCBwa0ZpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbGF0ZXN0TW9kaWZpZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRXhhbWluZXMgZWFjaCBvZiB0aGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgaW4gdGhlIGRlc3RpbmF0aW9uCisgICAgICAgICAqIGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBmb3IgdGhlICJvbGRlc3QiCisgICAgICAgICAqIGNsYXNzLiBJZiBvbmUgb2YgdGhlIHN0dWJzIG9yIHNrZWxldG9ucyBjYW5ub3QgYmUgZm91bmQsIDxjb2RlPi0xCisgICAgICAgICAqIDwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkZXN0IFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zIGFyZQorICAgICAgICAgKiAgICAgICAgICAgICBzdG9yZWQuCisgICAgICAgICAqIEByZXR1cm4gVGhlIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSAib2xkZXN0IiBFSkIgc3R1YiBvcgorICAgICAgICAgKiAgICAgICAgIHNrZWxldG9uLiAgSWYgb25lIG9mIHRoZSBjbGFzc2VzIGNhbm5vdCBiZSBmb3VuZCwgPGNvZGU+LTEKKyAgICAgICAgICogICAgICAgICA8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIElmIHRoZSBjYW5vbmljYWwgcGF0aCBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgY2Fubm90IGJlIGZvdW5kLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBsb25nIGRlc3RDbGFzc2VzTW9kaWZpZWQoRmlsZSBkZXN0RGlyKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBjbGFzc25hbWVzID0gY2xhc3Nlc1RvR2VuZXJhdGUoKTsgLy8gTGlzdCBvZiBhbGwgc3R1YnMgJiBza2VscworICAgICAgICAgICAgbG9uZyBkZXN0Q2xhc3Nlc01vZGlmaWVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7IC8vIEVhcmxpZXN0IG1vZCB0aW1lCisgICAgICAgICAgICBib29sZWFuIGFsbENsYXNzZXNGb3VuZCAgPSB0cnVlOyAgICAgICAgICAgLy8gSGFzIGVhY2ggYmVlbiBmb3VuZD8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIExvb3AgdGhyb3VnaCBlYWNoIHN0dWIvc2tlbGV0b24gY2xhc3MgdGhhdCBtdXN0IGJlIGdlbmVyYXRlZCwgYW5kCisgICAgICAgICAgICAgKiBkZXRlcm1pbmUgKGlmIGFsbCBleGlzdCkgd2hpY2ggZmlsZSBoYXMgdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzbmFtZXMubGVuZ3RoOyBpKyspIHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoVG9DbGFzcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWVzW2ldLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyI7CisgICAgICAgICAgICAgICAgRmlsZSBjbGFzc0ZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBwYXRoVG9DbGFzcyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFkZCBlYWNoIHN0dWIvc2tlbGV0b24gY2xhc3MgdG8gdGhlIGxpc3Qgb2YgRUpCIGZpbGVzLiAgTm90ZQorICAgICAgICAgICAgICAgICAqIHRoYXQgZWFjaCBjbGFzcyBpcyBhZGRlZCBldmVuIGlmIGl0IGRvZXNuJ3QgZXhpc3Qgbm93LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChwYXRoVG9DbGFzcywgY2xhc3NGaWxlKTsKKworICAgICAgICAgICAgICAgIGFsbENsYXNzZXNGb3VuZCA9IGFsbENsYXNzZXNGb3VuZCAmJiBjbGFzc0ZpbGUuZXhpc3RzKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYWxsQ2xhc3Nlc0ZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgZmlsZU1vZCA9IGNsYXNzRmlsZS5sYXN0TW9kaWZpZWQoKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBvbGRlc3QgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCAqLworICAgICAgICAgICAgICAgICAgICBkZXN0Q2xhc3Nlc01vZGlmaWVkID0gTWF0aC5taW4oZGVzdENsYXNzZXNNb2RpZmllZCwgZmlsZU1vZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKGFsbENsYXNzZXNGb3VuZCkgPyBkZXN0Q2xhc3Nlc01vZGlmaWVkIDogLTE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGRzIGFuIGFycmF5IG9mIGNsYXNzIG5hbWVzIHdoaWNoIHJlcHJlc2VudCB0aGUgc3R1YnMgYW5kCisgICAgICAgICAqIHNrZWxldG9ucyB3aGljaCBuZWVkIHRvIGJlIGdlbmVyYXRlZCBmb3IgYSBnaXZlbiBFSkIuICBUaGUgY2xhc3MKKyAgICAgICAgICogbmFtZXMgYXJlIGZ1bGx5IHF1YWxpZmllZC4gIE5pbmUgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkIGZvciBhbGwgRUpCcworICAgICAgICAgKiB3aGlsZSBhbiBhZGRpdGlvbmFsIHNpeCBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgZm9yIGJlYW5zIHJlcXVpcmluZworICAgICAgICAgKiBSTUkvSUlPUCBhY2Nlc3MuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgU3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcworICAgICAgICAgKiAgICAgICAgIG5hbWVzIGZvciB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyB0byBiZSBnZW5lcmF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZ1tdIGNsYXNzZXNUb0dlbmVyYXRlKCkgeworICAgICAgICAgICAgU3RyaW5nW10gY2xhc3NuYW1lcyA9IChpaW9wKQorICAgICAgICAgICAgICAgID8gbmV3IFN0cmluZ1tOVU1fQ0xBU1NFU19XSVRIX0lJT1BdCisgICAgICAgICAgICAgICAgOiBuZXcgU3RyaW5nW05VTV9DTEFTU0VTX1dJVEhPVVRfSUlPUF07CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZW1vdGVQa2cgICAgID0gcmVtb3RlLmdldFBhY2thZ2VOYW1lKCkgKyAiLiI7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVtb3RlQ2xhc3MgICA9IHJlbW90ZS5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBob21lUGtnICAgICAgID0gaG9tZS5nZXRQYWNrYWdlTmFtZSgpICsgIi4iOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhvbWVDbGFzcyAgICAgPSBob21lLmdldENsYXNzTmFtZSgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltcGxQa2cgICAgICAgPSBpbXBsZW1lbnRhdGlvbi5nZXRQYWNrYWdlTmFtZSgpICsgIi4iOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltcGxGdWxsQ2xhc3MgPSBpbXBsZW1lbnRhdGlvbi5nZXRRdWFsaWZpZWRXaXRoVW5kZXJzY29yZXMoKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgICAgIGNsYXNzbmFtZXNbaW5kZXgrK10gPSBpbXBsUGtnICsgImVqYl9mYWNfIiArIGltcGxGdWxsQ2xhc3M7CisgICAgICAgICAgICBjbGFzc25hbWVzW2luZGV4KytdID0gaW1wbFBrZyArICJlamJfaG9tZV8iICsgaW1wbEZ1bGxDbGFzczsKKyAgICAgICAgICAgIGNsYXNzbmFtZXNbaW5kZXgrK10gPSBpbXBsUGtnICsgImVqYl9za2VsXyIgKyBpbXBsRnVsbENsYXNzOworICAgICAgICAgICAgY2xhc3NuYW1lc1tpbmRleCsrXSA9IHJlbW90ZVBrZyArICJlamJfa2NwX3NrZWxfIiArIHJlbW90ZUNsYXNzOworICAgICAgICAgICAgY2xhc3NuYW1lc1tpbmRleCsrXSA9IGhvbWVQa2cgKyAiZWpiX2tjcF9za2VsXyIgKyBob21lQ2xhc3M7CisgICAgICAgICAgICBjbGFzc25hbWVzW2luZGV4KytdID0gcmVtb3RlUGtnICsgImVqYl9rY3Bfc3R1Yl8iICsgcmVtb3RlQ2xhc3M7CisgICAgICAgICAgICBjbGFzc25hbWVzW2luZGV4KytdID0gaG9tZVBrZyArICJlamJfa2NwX3N0dWJfIiArIGhvbWVDbGFzczsKKyAgICAgICAgICAgIGNsYXNzbmFtZXNbaW5kZXgrK10gPSByZW1vdGVQa2cgKyAiZWpiX3N0dWJfIiArIHJlbW90ZUNsYXNzOworICAgICAgICAgICAgY2xhc3NuYW1lc1tpbmRleCsrXSA9IGhvbWVQa2cgKyAiZWpiX3N0dWJfIiArIGhvbWVDbGFzczsKKworICAgICAgICAgICAgaWYgKCFpaW9wKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzbmFtZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsYXNzbmFtZXNbaW5kZXgrK10gPSAib3JnLm9tZy5zdHViLiIgKyByZW1vdGVQa2cgKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVtb3RlQ2xhc3MgKyAiX1N0dWIiOworICAgICAgICAgICAgY2xhc3NuYW1lc1tpbmRleCsrXSA9ICJvcmcub21nLnN0dWIuIiArIGhvbWVQa2cgKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG9tZUNsYXNzICsgIl9TdHViIjsKKyAgICAgICAgICAgIGNsYXNzbmFtZXNbaW5kZXgrK10gPSAib3JnLm9tZy5zdHViLiIgKyByZW1vdGVQa2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl9lamJfUm1pQ29yYmFCcmlkZ2VfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZW1vdGVDbGFzcyArICJfVGllIjsKKyAgICAgICAgICAgIGNsYXNzbmFtZXNbaW5kZXgrK10gPSAib3JnLm9tZy5zdHViLiIgKyBob21lUGtnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJfZWpiX1JtaUNvcmJhQnJpZGdlXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG9tZUNsYXNzICsgIl9UaWUiOworCisgICAgICAgICAgICBjbGFzc25hbWVzW2luZGV4KytdID0gcmVtb3RlUGtnICsgImVqYl9SbWlDb3JiYUJyaWRnZV8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVtb3RlQ2xhc3M7CisgICAgICAgICAgICBjbGFzc25hbWVzW2luZGV4KytdID0gaG9tZVBrZyArICJlamJfUm1pQ29yYmFCcmlkZ2VfIiArIGhvbWVDbGFzczsKKworICAgICAgICAgICAgcmV0dXJuIGNsYXNzbmFtZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGNyZWF0ZXMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYWxsIHRoZQorICAgICAgICAgKiBpbnN0YW5jZSB2YXJpYWJsZXMgb2YgYW4gRWpiSW5mbyBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBFamJJbmZvIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gIkVKQiBuYW1lOiAiICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5cciAgICAgICAgICAgICAgaG9tZTogICAgICAiICsgaG9tZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5cciAgICAgICAgICAgICAgcmVtb3RlOiAgICAiICsgcmVtb3RlCisgICAgICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBpbXBsOiAgICAgICIgKyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5cciAgICAgICAgICAgICAgcHJpbWFyeUtleTogIiArIHByaW1hcnlLZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuXHIgICAgICAgICAgICAgIGJlYW50eXBlOiAgIiArIGJlYW50eXBlCisgICAgICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBjbXA6ICAgICAgICIgKyBjbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuXHIgICAgICAgICAgICAgIGlpb3A6ICAgICAgIiArIGlpb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuXHIgICAgICAgICAgICAgIGhhc2Vzc2lvbjogIiArIGhhc2Vzc2lvbjsKKworICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGNtcERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBzICs9ICJcblxyICAgICAgICAgICAgICBDTVAgRGVzY3JpcHRvcjogIiArIGkubmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgfSAvLyBFbmQgb2YgRWpiSW5mbyBpbm5lciBjbGFzcworCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgY2xhc3MgdXNlZCB0byByZXByZXNlbnQgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YQorICAgICAqIGNsYXNzLiAgSXQgcHJvdmlkZXMgYW4gZWFzeSB3YXkgdG8gcmV0cmlldmUgY29tcG9uZW50cyBvZiB0aGUgY2xhc3MgbmFtZQorICAgICAqIGluIGEgZm9ybWF0IHRoYXQgaXMgY29udmVuaWVudCBmb3IgYnVpbGRpbmcgaUFTIHN0dWJzIGFuZCBza2VsZXRvbnMuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc25hbWUgeworICAgICAgICBwcml2YXRlIFN0cmluZyBxdWFsaWZpZWROYW1lOyAgLy8gRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWU7ICAgIC8vIE5hbWUgb2YgdGhlIHBhY2thZ2UgZm9yIHRoaXMgY2xhc3MKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOyAgICAgIC8vIE5hbWUgb2YgdGhlIGNsYXNzIHdpdGhvdXQgdGhlIHBhY2thZ2UKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBidWlsZHMgYW4gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYSBKYXZhCisgICAgICAgICAqIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDbGFzc25hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKKyAgICAgICAgICAgIGlmIChxdWFsaWZpZWROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMucXVhbGlmaWVkTmFtZSA9IHF1YWxpZmllZE5hbWU7CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IHF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHF1YWxpZmllZE5hbWU7CisgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lICAgPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRDbGFzc05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcXVhbGlmaWVkTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBwYWNrYWdlIG5hbWUgZm9yIHRoZSBKYXZhIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhlIGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYWNrYWdlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBKYXZhIGNsYXNzIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZSBzdHJ1Y3R1cmUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBmb3IgdGhlIGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHdpdGggdW5kZXJzY29yZXMKKyAgICAgICAgICogc2VwYXJhdGluZyB0aGUgY29tcG9uZW50cyBvZiB0aGUgY2xhc3MgbmFtZSByYXRoZXIgdGhhbiBwZXJpb2RzLgorICAgICAgICAgKiBUaGlzIGZvcm1hdCBpcyB1c2VkIGluIG5hbWluZyBzb21lIG9mIHRoZSBzdHViIGFuZCBza2VsZXRvbiBjbGFzc2VzCisgICAgICAgICAqIGZvciB0aGUgaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdXNpbmcKKyAgICAgICAgICogICAgICAgICB1bmRlcnNjb3JlcyBpbnN0ZWFkIG9mIHBlcmlvZHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZFdpdGhVbmRlcnNjb3JlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCAnXycpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBGaWxlIHdoaWNoIHJlZmVyZW5jZXMgdGhlIGNsYXNzIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICogZGlyZWN0b3J5LiAgTm90ZSB0aGF0IHRoZSBjbGFzcyBmaWxlIG1heSBvciBtYXkgbm90IGV4aXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGRpcmVjdG9yeSBBIEZpbGUgcmVmZXJlbmNpbmcgdGhlIGJhc2UgZGlyZWN0b3J5IGNvbnRhaW5pbmcKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgY2xhc3MgZmlsZXMuCisgICAgICAgICAqIEByZXR1cm4gRmlsZSByZWZlcmVuY2luZyB0aGlzIGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZpbGUgZ2V0Q2xhc3NGaWxlKEZpbGUgZGlyZWN0b3J5KSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aFRvRmlsZSA9IHF1YWxpZmllZE5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmNsYXNzIjsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShkaXJlY3RvcnksIHBhdGhUb0ZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNsYXNzIG5hbWUuICBJdCByZXR1cm5zIHRoZSBmdWxseQorICAgICAgICAgKiBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCk7CisgICAgICAgIH0KKyAgICB9ICAvLyBFbmQgb2YgQ2xhc3NuYW1lIGlubmVyIGNsYXNzCisKKworICAgIC8qKgorICAgICAqIFRocmVhZCBjbGFzcyB1c2VkIHRvIHJlZGlyZWN0IG91dHB1dCBmcm9tIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB0bworICAgICAqIHRoZSBKUkUgc3RhbmRhcmQgb3V0cHV0LiAgVGhpcyBjbGFzcyBtYXkgYmUgdXNlZCB0byByZWRpcmVjdCBvdXRwdXQgZnJvbQorICAgICAqIGFuIGV4dGVybmFsIHByb2Nlc3MgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZGlyZWN0T3V0cHV0IGV4dGVuZHMgVGhyZWFkIHsKKworICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIHN0cmVhbTsgIC8vIFN0cmVhbSB0byByZWFkIGFuZCByZWRpcmVjdCB0byBzdGFuZGFyZCBvdXRwdXQKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSB0aGF0IHdpbGwgcmVkaXJlY3Qgb3V0cHV0IGZyb20gdGhlCisgICAgICAgICAqIHNwZWNpZmllZCBzdHJlYW0gdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN0cmVhbSBJbnB1dFN0cmVhbSB3aGljaCB3aWxsIGJlIHJlYWQgYW5kIHJlZGlyZWN0ZWQgdG8gdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgc3RhbmRhcmQgb3V0cHV0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlZGlyZWN0T3V0cHV0KElucHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVhZHMgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJlZGlyZWN0cyBpdCB0byBzdGFuZGFyZCBvdXRwdXQKKyAgICAgICAgICogdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKTsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0OworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHRleHQgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gIC8vIEVuZCBvZiBSZWRpcmVjdE91dHB1dCBpbm5lciBjbGFzcworCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldEVqYmNUYXNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldEVqYmNUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjYmQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9JUGxhbmV0RWpiY1Rhc2suamF2YQpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBDb21waWxlcyBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucyBmb3IgdGhlIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyLgorICogVGhlIEVKQnMgdG8gYmUgcHJvY2Vzc2VkIGFyZSBzcGVjaWZpZWQgYnkgdGhlIEVKQiAxLjEgc3RhbmRhcmQgWE1MCisgKiBkZXNjcmlwdG9yLCBhbmQgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uCisgKiBTZXJ2ZXItc3BlY2lmaWMgWE1MIGRlc2NyaXB0b3IuICBTaW5jZSB0aGUgWE1MIGRlc2NyaXB0b3JzIGNhbiBpbmNsdWRlCisgKiBtdWx0aXBsZSBFSkJzLCB0aGlzIGlzIGEgY29udmVuaWVudCB3YXkgb2Ygc3BlY2lmeWluZyBtYW55IEVKQnMgaW4gYSBzaW5nbGUKKyAqIEFudCB0YXNrLiAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkOgorICogICA8dWw+CisgKiAgICAgPGxpPjxpPmVqYmRlc2NyaXB0b3I8L2k+IC0tIFN0YW5kYXJkIEVKQiAxLjEgWE1MIGRlc2NyaXB0b3IgKHR5cGljYWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZWQgImVqYi1qYXIueG1sIikuICBUaGlzIGF0dHJpYnV0ZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZC4KKyAqICAgICA8bGk+PGk+aWFzZGVzY3JpcHRvcjwvaT4gLS0gRUpCIFhNTCBkZXNjcmlwdG9yIGZvciBpUGxhbmV0IEFwcGxpY2F0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlciAodHlwaWNhbGx5IHRpdGxlZCAiaWFzLWVqYi1qYXIueG1sKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisgKiAgICAgPGxpPjxpPmRlc3Q8L2k+IC0tIFRoZSBpcyB0aGUgYmFzZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIFJNSSBzdHVicyBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc2tlbGV0b25zIGFyZSB3cml0dGVuLiAgSW4gYWRkaXRpb24sIHRoZSBjbGFzcyBmaWxlcworICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBiZWFuIChob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZSwgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEVKQiBpbXBsZW1lbnRhdGlvbikgbXVzdCBiZSBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisgKiAgICAgPGxpPjxpPmNsYXNzcGF0aDwvaT4gLS0gVGhlIGNsYXNzcGF0aCB1c2VkIHdoZW4gZ2VuZXJhdGluZyBFSkIgc3R1YnMgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbGV0b25zLiAgVGhpcyBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21pdHRlZCwgdGhlIGNsYXNzcGF0aCBzcGVjaWZpZWQgd2hlbiBBbnQgd2FzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCB3aWxsIGJlIHVzZWQpLiAgTmVzdGVkICJjbGFzc3BhdGgiCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgbWF5IGFsc28gYmUgdXNlZC4KKyAqICAgICA8bGk+PGk+a2VlcGdlbmVyYXRlZDwvaT4gLS0gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBKYXZhIHNvdXJjZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IGVqYmMgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZCBvciBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuICBJZiAieWVzIiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlcyB3aWxsIGJlIHJldGFpbmVkLiAgVGhpcyBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgKGlmIG9taXR0ZWQsIGl0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvICJubyIpLgorICogICAgIDxsaT48aT5kZWJ1ZzwvaT4gLS0gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBlamJjIHV0aWxpdHkgc2hvdWxkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBsb2cgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgc3RhdGVtZW50cyB0byB0aGUgc3RhbmRhcmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC4gIElmICJ5ZXMiLCB0aGUgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgc3RhdGVtZW50cworICogICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQgKGlmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvICJubyIpLgorICogICAgIDxsaT48aT5pYXNob21lPC9pPiAtLSBNYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSAiaG9tZSIgZGlyZWN0b3J5IGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyIGluc3RhbGxhdGlvbi4gIFRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZCB0byBmaW5kIHRoZSBlamJjIHV0aWxpdHkgaWYgaXQgaXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHVzZXIncyBzeXN0ZW0gcGF0aC4gIFRoaXMgaXMgYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgYXR0cmlidXRlIChpZiBzcGVjaWZpZWQsIGl0IHNob3VsZCByZWZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgPGNvZGU+W2luc3RhbGwtbG9jYXRpb25dL2lwbGFuZXQvaWFzNi9pYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2RlPiBkaXJlY3RvcnkpLiAgSWYgb21pdHRlZCwgdGhlIGVqYmMgdXRpbGl0eQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIG9uIHRoZSB1c2VyJ3Mgc3lzdGVtIHBhdGguCisgKiAgIDwvdWw+CisgKiA8cD4KKyAqIEZvciBlYWNoIEVKQiBzcGVjaWZpZWQsIHRoaXMgdGFzayB3aWxsIGxvY2F0ZSB0aGUgdGhyZWUgY2xhc3NlcyB0aGF0IGNvbXByaXNlCisgKiB0aGUgRUpCLiAgSWYgdGhlc2UgY2xhc3MgZmlsZXMgY2Fubm90IGJlIGxvY2F0ZWQgaW4gdGhlIDxjb2RlPmRlc3Q8L2NvZGU+CisgKiBkaXJlY3RvcnksIHRoZSB0YXNrIHdpbGwgZmFpbC4gIFRoZSB0YXNrIHdpbGwgYWxzbyBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgRUpCCisgKiBzdHVicyBhbmQgc2tlbGV0b25zIGluIHRoaXMgZGlyZWN0b3J5LiAgSWYgZm91bmQsIHRoZSB0aW1lc3RhbXBzIG9uIHRoZQorICogc3R1YnMgYW5kIHNrZWxldG9ucyB3aWxsIGJlIGNoZWNrZWQgdG8gZW5zdXJlIHRoZXkgYXJlIHVwIHRvIGRhdGUuICBPbmx5IGlmCisgKiB0aGVzZSBmaWxlcyBjYW5ub3QgYmUgZm91bmQgb3IgaWYgdGhleSBhcmUgb3V0IG9mIGRhdGUgd2lsbCBlamJjIGJlIGNhbGxlZAorICogdG8gZ2VuZXJhdGUgbmV3IHN0dWJzIGFuZCBza2VsZXRvbnMuCisgKgorICogQHNlZSAgICBJUGxhbmV0RWpiYworICoKKyAqIEBhbnQudGFzayBuYW1lPSJpcGxhbmV0LWVqYmMiIGNhdGVnb3J5PSJlamIiCisgKi8KK3B1YmxpYyBjbGFzcyBJUGxhbmV0RWpiY1Rhc2sgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8qIEF0dHJpYnV0ZXMgc2V0IGJ5IHRoZSBBbnQgYnVpbGQgZmlsZSAqLworICAgIHByaXZhdGUgRmlsZSAgICBlamJkZXNjcmlwdG9yOworICAgIHByaXZhdGUgRmlsZSAgICBpYXNkZXNjcmlwdG9yOworICAgIHByaXZhdGUgRmlsZSAgICBkZXN0OworICAgIHByaXZhdGUgUGF0aCAgICBjbGFzc3BhdGg7CisgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBnZW5lcmF0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWcgICAgICAgICA9IGZhbHNlOworICAgIHByaXZhdGUgRmlsZSAgICBpYXNob21lOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHN0YW5kYXJkIFhNTCBFSkIgZGVzY3JpcHRvci4gIFR5cGljYWxseSwgdGhpcworICAgICAqIGZpbGUgaXMgbmFtZWQgImVqYi1qYXIueG1sIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlamJkZXNjcmlwdG9yIFRoZSBuYW1lIGFuZCBsb2NhdGlvbiBvZiB0aGUgRUpCIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWpiZGVzY3JpcHRvcihGaWxlIGVqYmRlc2NyaXB0b3IpIHsKKyAgICAgICAgdGhpcy5lamJkZXNjcmlwdG9yID0gZWpiZGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgaUFTLXNwZWNpZmljIFhNTCBFSkIgZGVzY3JpcHRvci4gIFR5cGljYWxseSwKKyAgICAgKiB0aGlzIGZpbGUgaXMgbmFtZWQgImlhcy1lamItamFyLnhtbCIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWFzZGVzY3JpcHRvciBUaGUgbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIGlBUy1zcGVjaWZpYyBFSkIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElhc2Rlc2NyaXB0b3IgKEZpbGUgaWFzZGVzY3JpcHRvcikgeworICAgICAgICB0aGlzLmlhc2Rlc2NyaXB0b3IgPSBpYXNkZXNjcmlwdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgRUpCIHNvdXJjZSBjbGFzc2VzIG11c3QgZXhpc3QKKyAgICAgKiBhbmQgd2hlcmUgdGhlIHN0dWJzIGFuZCBza2VsZXRvbnMgd2lsbCBiZSB3cml0dGVuLiAgVGhlIGRlc3RpbmF0aW9uCisgICAgICogZGlyZWN0b3J5IG11c3QgZXhpc3QgYmVmb3JlIHRoaXMgdGFzayBpcyBleGVjdXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXN0IFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbXBpbGVkIGNsYXNzZXMgd2lsbCBiZSB3cml0dGVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3QoRmlsZSBkZXN0KSB7CisgICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBjb21waWxpbmcgdGhlIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0byB0aGUgY2xhc3NwYXRoIHVzZWQgd2hlbiBjb21waWxpbmcgdGhlIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIHBhdGguCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlIEphdmEgc291cmNlIGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgZWpiYyB3aWxsIGJlIHNhdmVkIC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZWVwZ2VuZXJhdGVkIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBKYXZhIHNvdXJjZSBmaWxlcyBmb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyBzaG91bGQgYmUgcmV0YWluZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2VlcGdlbmVyYXRlZChib29sZWFuIGtlZXBnZW5lcmF0ZWQpIHsKKyAgICAgICAgdGhpcy5rZWVwZ2VuZXJhdGVkID0ga2VlcGdlbmVyYXRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBkZWJ1Z2dpbmcgb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gZWpiYyBpcworICAgICAqIGV4ZWN1dGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRlYnVnIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGRlYnVnZ2luZyBvdXRwdXQgc2hvdWxkIGJlIGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlICJob21lIiBkaXJlY3RvcnkgZm9yIHRoaXMgaUFTIGluc3RhbGxhdGlvbi4KKyAgICAgKiBUaGUgZGlyZWN0b3J5IHNwZWNpZmllZCBzaG91bGQgdHlwaWNhbGx5IGJlCisgICAgICogPGNvZGU+W2luc3RhbGwtbG9jYXRpb25dL2lwbGFuZXQvaWFzNi9pYXM8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGlhc2hvbWUgVGhlIGhvbWUgZGlyZWN0b3J5IGZvciB0aGUgdXNlcidzIGlBUyBpbnN0YWxsYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWFzaG9tZShGaWxlIGlhc2hvbWUpIHsKKyAgICAgICAgdGhpcy5pYXNob21lID0gaWFzaG9tZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSB3b3JrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBleGVjdXRlRWpiYyhnZXRQYXJzZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCB0aGUgdXNlciBzZWxlY3Rpb25zIGFyZSB2YWxpZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gSWYgdGhlIHVzZXIgc2VsZWN0aW9ucyBhcmUgaW52YWxpZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZWpiZGVzY3JpcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlRoZSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvciBtdXN0IGJlIHNwZWNpZmllZCB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidGhlIFwiZWpiZGVzY3JpcHRvclwiIGF0dHJpYnV0ZS4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCghZWpiZGVzY3JpcHRvci5leGlzdHMoKSkgfHwgKCFlamJkZXNjcmlwdG9yLmlzRmlsZSgpKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUaGUgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IgKCIgKyBlamJkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSB3YXMgbm90IGZvdW5kIG9yIGlzbid0IGEgZmlsZS4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaWFzZGVzY3JpcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlRoZSBpQVMtc3BlaWZpYyBYTUwgZGVzY3JpcHRvciBtdXN0IGJlIHNwZWNpZmllZCB1c2luZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGhlIFwiaWFzZGVzY3JpcHRvclwiIGF0dHJpYnV0ZS4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCghaWFzZGVzY3JpcHRvci5leGlzdHMoKSkgfHwgKCFpYXNkZXNjcmlwdG9yLmlzRmlsZSgpKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUaGUgaUFTLXNwZWNpZmljIFhNTCBkZXNjcmlwdG9yICgiICsgaWFzZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgd2FzIG5vdCBmb3VuZCBvciBpc24ndCBhIGZpbGUuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0aGUgXCJkZXN0XCIgYXR0cmlidXRlLiI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCFkZXN0LmV4aXN0cygpKSB8fCAoIWRlc3QuaXNEaXJlY3RvcnkoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSAoIiArIGRlc3QgKyAiKSB3YXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3VuZCBvciBpc24ndCBhIGRpcmVjdG9yeS4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGlhc2hvbWUgIT0gbnVsbCkgJiYgKCFpYXNob21lLmlzRGlyZWN0b3J5KCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIklmIFwiaWFzaG9tZVwiIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBhIHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkaXJlY3RvcnkgKGl0IHdhcyBzZXQgdG8gIiArIGlhc2hvbWUgKyAiKS4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgU0FYUGFyc2VyIHRoYXQgbWF5IGJlIHVzZWQgdG8gcHJvY2VzcyB0aGUgWE1MIGRlc2NyaXB0b3JzLgorICAgICAqCisgICAgICogQHJldHVybiBQYXJzZXIgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcHJvY2VzcyB0aGUgRUpCIGRlc2NyaXB0b3JzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gSWYgdGhlIHBhcnNlciBjYW5ub3QgYmUgY3JlYXRlZCBvciBjb25maWd1cmVkLgorICAgICAqLworICAgIHByaXZhdGUgU0FYUGFyc2VyIGdldFBhcnNlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBzYXhQYXJzZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7CisgICAgICAgICAgICBzYXhQYXJzZXIgPSBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJVbmFibGUgdG8gY3JlYXRlIGEgU0FYUGFyc2VyOiAiICsgZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlVuYWJsZSB0byBjcmVhdGUgYSBTQVhQYXJzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNheFBhcnNlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgRUpCYyB1dGlsaXR5IHVzaW5nIHRoZSBTQVhQYXJzZXIgcHJvdmlkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2F4UGFyc2VyIFNBWFBhcnNlciB0aGF0IG1heSBiZSB1c2VkIHRvIHByb2Nlc3MgdGhlIEVKQgorICAgICAqICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIElmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgb3IgcGFyc2luZyB0aGUgWE1MCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlRWpiYyhTQVhQYXJzZXIgc2F4UGFyc2VyKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBJUGxhbmV0RWpiYyBlamJjID0gbmV3IElQbGFuZXRFamJjKGVqYmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhc2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzcGF0aCgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNheFBhcnNlcik7CisgICAgICAgIGVqYmMuc2V0UmV0YWluU291cmNlKGtlZXBnZW5lcmF0ZWQpOworICAgICAgICBlamJjLnNldERlYnVnT3V0cHV0KGRlYnVnKTsKKyAgICAgICAgaWYgKGlhc2hvbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgZWpiYy5zZXRJYXNIb21lRGlyKGlhc2hvbWUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVqYmMuZXhlY3V0ZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkFuIElPRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSBYTUwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRlc2NyaXB0b3IgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkEgU0FYRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSBYTUwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRlc2NyaXB0b3IgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gY2F0Y2ggKElQbGFuZXRFamJjLkVqYmNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJ1biB0aGUgZWpiYyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidXRpbGl0eTogIiArIGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBDTEFTU1BBVEggdG8gYmUgdXNlZCB3aGVuIGNhbGxpbmcgRUpCYy4gIElmIG5vIHVzZXIgQ0xBU1NQQVRICisgICAgICogaXMgc3BlY2lmaWVkLCB0aGUgU3lzdGVtIGNsYXNzcGF0aCBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBQYXRoIFRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgRUpCYy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggZ2V0Q2xhc3NwYXRoKCkgeworICAgICAgICBQYXRoIGNwID0gbnVsbDsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjcCA9IChuZXcgUGF0aChnZXRQcm9qZWN0KCkpKS5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImxhc3QiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNwID0gY2xhc3NwYXRoLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3A7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lubmVyQ2xhc3NGaWxlbmFtZUZpbHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lubmVyQ2xhc3NGaWxlbmFtZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MmQ5ODc5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lubmVyQ2xhc3NGaWxlbmFtZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CisKKy8qKgorICogQSBmaWxlbmFtZSBmaWx0ZXIgZm9yIGlubmVyIGNsYXNzIGZpbGVzIG9mIGEgcGFydGljdWxhciBjbGFzcy4KKyAqLworcHVibGljIGNsYXNzIElubmVyQ2xhc3NGaWxlbmFtZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVuYW1lRmlsdGVyIHsKKyAgICBwcml2YXRlIFN0cmluZyBiYXNlQ2xhc3NOYW1lOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igb2YgZmlsdGVyLgorICAgICAqIEBwYXJhbSBiYXNlY2xhc3MgdGhlIGNsYXNzIHRvIGZpbHRlciBpbm5lciBjbGFzc2VzIG9uLgorICAgICAqLworICAgIElubmVyQ2xhc3NGaWxlbmFtZUZpbHRlcihTdHJpbmcgYmFzZWNsYXNzKSB7CisgICAgICAgIGludCBleHRpZHggPSBiYXNlY2xhc3MubGFzdEluZGV4T2YoIi5jbGFzcyIpOworICAgICAgICBpZiAoZXh0aWR4ID09IC0xKSB7CisgICAgICAgICAgICBleHRpZHggPSBiYXNlY2xhc3MubGVuZ3RoKCkgLSAxOworICAgICAgICB9CisgICAgICAgIGJhc2VDbGFzc05hbWUgPSBiYXNlY2xhc3Muc3Vic3RyaW5nKDAsIGV4dGlkeCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGZpbGUgbmFtZSBwYXNzZXMgdGhlIGZpbHRlci4KKyAgICAgKiBAcGFyYW0gZGlyIG5vdCB1c2VkLgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gZmlsdGVyIG9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgaXMgYW4gaW5uZXIgY2xhc3Mgb2YgdGhlIGJhc2UgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgaWYgKChmaWxlbmFtZS5sYXN0SW5kZXhPZigiLiIpICE9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSkKKyAgICAgICAgICAgIHx8IChmaWxlbmFtZS5pbmRleE9mKGJhc2VDbGFzc05hbWUgKyAiJCIpICE9IDApKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0pib3NzRGVwbG95bWVudFRvb2wuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9KYm9zc0RlcGxveW1lbnRUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyODZiMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9KYm9zc0RlcGxveW1lbnRUb29sLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBUaGUgZGVwbG95bWVudCB0b29sIHRvIGFkZCB0aGUgamJvc3Mgc3BlY2lmaWMgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIHRoZSBlamIgamFyIGZpbGUuCisgKiBKYm9zcyBvbmx5IHJlcXVpcmVzIG9uZSBhZGRpdGlvbmFsIGZpbGUgamJvc3MueG1sIGFuZCBkb2VzIG5vdCByZXF1aXJlIGFueSBhZGRpdGlvbmFsCisgKiBjb21waWxhdGlvbi4KKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzZWUgRWpiSmFyI2NyZWF0ZUpib3NzCisgKi8KK3B1YmxpYyBjbGFzcyBKYm9zc0RlcGxveW1lbnRUb29sIGV4dGVuZHMgR2VuZXJpY0RlcGxveW1lbnRUb29sIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQk9TU19ERCA9ICJqYm9zcy54bWwiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpCT1NTX0NNUDEwRCA9ICJqYXdzLnhtbCI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkJPU1NfQ01QMjBEID0gImpib3NzY21wLWpkYmMueG1sIjsKKworICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgc3VmZml4IGZvciB0aGUgamJvc3MgamFyZmlsZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBqYXJTdWZmaXggPSAiLmphciI7CisKKyAgICAvKioKKyAgICAgKiBTZXR0ZXIgdXNlZCB0byBzdG9yZSB0aGUgc3VmZml4IGZvciB0aGUgZ2VuZXJhdGVkIEpCb3NzIGphciBmaWxlLgorICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgc3VmZml4LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1ZmZpeChTdHJpbmcgaW5TdHJpbmcpIHsKKyAgICAgICAgamFyU3VmZml4ID0gaW5TdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFueSB2ZW5kb3Igc3BlY2lmaWMgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZQorICAgICAqIEVKQiBKYXIuCisgICAgICogQHBhcmFtIGVqYkZpbGVzIHRoZSBoYXNodGFibGUgb2YgZmlsZXMgdG8gcG9wdWxhdGUuCisgICAgICogQHBhcmFtIGRkUHJlZml4IHRoZSBwcmVmaXggdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7CisgICAgICAgIEZpbGUgamJvc3NERCA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsIGRkUHJlZml4ICsgSkJPU1NfREQpOworICAgICAgICBpZiAoamJvc3NERC5leGlzdHMoKSkgeworICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgSkJPU1NfREQsIGpib3NzREQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9jYXRlIGpib3NzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIgorICAgICAgICAgICAgICAgICsgIkl0IHdhcyBleHBlY3RlZCB0byBiZSBpbiAiICsgamJvc3NERC5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSA9IEpCT1NTX0NNUDEwRDsKKyAgICAgICAgaWYgKEVqYkphci5DTVBWZXJzaW9uLkNNUDJfMC5lcXVhbHMoZ2V0UGFyZW50KCkuZ2V0Q21wdmVyc2lvbigpKSkgeworICAgICAgICAgICAgZGVzY3JpcHRvckZpbGVOYW1lID0gSkJPU1NfQ01QMjBEOworICAgICAgICB9CisgICAgICAgIEZpbGUgamJvc3NDTVBECisgICAgICAgICAgICA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsIGRkUHJlZml4ICsgZGVzY3JpcHRvckZpbGVOYW1lKTsKKworICAgICAgICBpZiAoamJvc3NDTVBELmV4aXN0cygpKSB7CisgICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBkZXNjcmlwdG9yRmlsZU5hbWUsIGpib3NzQ01QRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgamJvc3MgY21wIGRlc2NyaXB0b3IuICIKKyAgICAgICAgICAgICAgICArICJJdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW4gIgorICAgICAgICAgICAgICAgICsgamJvc3NDTVBELmdldFBhdGgoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZlbmRvciBzcGVjaWZpYyBuYW1lIG9mIHRoZSBKYXIgdGhhdCB3aWxsIGJlIG91dHB1dC4gVGhlIG1vZGlmaWNhdGlvbiBkYXRlCisgICAgICogb2YgdGhpcyBqYXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIGRlcGVuZGVudCBiZWFuIGNsYXNzZXMuCisgICAgICovCisgICAgRmlsZSBnZXRWZW5kb3JPdXRwdXRKYXJGaWxlKFN0cmluZyBiYXNlTmFtZSkgeworICAgICAgICBpZiAoZ2V0RGVzdERpcigpID09IG51bGwgJiYgZ2V0UGFyZW50KCkuZ2V0RGVzdGRpcigpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGVzdERpciBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldERlc3REaXIoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoZ2V0UGFyZW50KCkuZ2V0RGVzdGRpcigpLCBiYXNlTmFtZSArIGphclN1ZmZpeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoZ2V0RGVzdERpcigpLCBiYXNlTmFtZSArIGphclN1ZmZpeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgdG9vbCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBjb25maWd1cmVkLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBJZiB0aGUgRGVwbG95bWVudCBUb29sJ3MgY29uZmlndXJhdGlvbiBpc24ndAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQKKyAgICAgKiBAc2luY2UgYW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJlZCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHJpdmF0ZSBFamJKYXIgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gKEVqYkphcikgdGhpcy5nZXRUYXNrKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0pvbmFzRGVwbG95bWVudFRvb2wuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Kb25hc0RlcGxveW1lbnRUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjMWY2MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Kb25hc0RlcGxveW1lbnRUb29sLmphdmEKQEAgLTAsMCArMSw4MjMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIFRoZSBkZXBsb3ltZW50IHRvb2wgdG8gYWRkIHRoZSBqb25hcyBzcGVjaWZpYyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHRvIHRoZQorICogZWpiIEpBUiBmaWxlLiBKT05BUyBvbmx5IHJlcXVpcmVzIG9uZSBhZGRpdGlvbmFsIGZpbGUgam9uYXMtZWpiLWphci54bWwuCisgKgorICogQHZlcnNpb24gMS4wCisgKiBAc2VlIEVqYkphciNjcmVhdGVKb25hcworICovCitwdWJsaWMgY2xhc3MgSm9uYXNEZXBsb3ltZW50VG9vbCBleHRlbmRzIEdlbmVyaWNEZXBsb3ltZW50VG9vbCB7CisKKyAgICAvKiogUHVibGljIElkIG9mIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgRFRELiAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9KQVJfMV8xX1BVQkxJQ19JRAorICAgICAgICA9ICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0pBUl8yXzBfUFVCTElDX0lECisgICAgICAgID0gIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIjsKKworICAgIC8qKiBQdWJsaWMgSWQgb2YgdGhlIEpPbkFTLXNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvciBEVEQuICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9OQVNfRUpCX0pBUl8yXzRfUFVCTElDX0lECisgICAgICAgID0gIi0vL09iamVjdFdlYi8vRFREIEpPbkFTIDIuNC8vRU4iOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpPTkFTX0VKQl9KQVJfMl81X1BVQkxJQ19JRAorICAgICAgICA9ICItLy9PYmplY3RXZWIvL0RURCBKT25BUyAyLjUvL0VOIjsKKworICAgIC8qKiBSTUkgT1JCLiAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJNSV9PUkIgPSAiUk1JIjsKKworICAgIC8qKiBKRVJFTUlFIE9SQi4gKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKRVJFTUlFX09SQiA9ICJKRVJFTUlFIjsKKworICAgIC8qKiBEQVZJRCBPUkIuICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFWSURfT1JCID0gIkRBVklEIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvciBEVEQgKHRoZXNlIGZpbGVzIGFyZSBzdG9yZWQgaW4KKyAgICAgKiB0aGUgJHtKT05BU19ST09UfS94bWwgZGlyZWN0b3J5KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfSkFSXzFfMV9EVEQgPSAiZWpiLWphcl8xXzEuZHRkIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfSkFSXzJfMF9EVEQgPSAiZWpiLWphcl8yXzAuZHRkIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIEpPbkFTLXNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvciBEVEQgKHRoZXNlIGZpbGVzIGFyZQorICAgICAqIHN0b3JlZCBpbiB0aGUgJHtKT05BU19ST09UfS94bWwgZGlyZWN0b3J5KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKT05BU19FSkJfSkFSXzJfNF9EVEQKKyAgICAgICAgPSAiam9uYXMtZWpiLWphcl8yXzQuZHRkIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKT05BU19FSkJfSkFSXzJfNV9EVEQKKyAgICAgICAgPSAiam9uYXMtZWpiLWphcl8yXzUuZHRkIjsKKworICAgIC8qKiBEZWZhdWx0IEpPbkFTIGRlcGxveW1lbnQgZGVzY3JpcHRvciBuYW1lLiAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpPTkFTX0REID0gImpvbmFzLWVqYi1qYXIueG1sIjsKKworICAgIC8qKiBHZW5JQyBjbGFzcyBuYW1lIChKT25BUyAyLjUpICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VOSUNfQ0xBU1MgPQorICAgICJvcmcub2JqZWN0d2ViLmpvbmFzX2VqYi5nZW5pYy5HZW5JQyI7CisKKyAgICAvKiogT2xkIEdlbklDIGNsYXNzIG5hbWUgKEpPbkFTIDIuNC54KS4gKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfR0VOSUNfQ0xBU1NfMSA9CisgICAgICAgICJvcmcub2JqZWN0d2ViLmpvbmFzX2VqYi50b29scy5HZW5XaG9sZUlDIjsKKworICAgIC8qKiBPbGQgR2VuSUMgY2xhc3MgbmFtZS4gKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfR0VOSUNfQ0xBU1NfMiA9CisgICAgICAgICJvcmcub2JqZWN0d2ViLmpvbmFzX2VqYi50b29scy5HZW5JQyI7CisKKyAgICAvKioKKyAgICAgKiBGaWxlbmFtZSBvZiB0aGUgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IgKHdoaWNoIGlzIHBhc3NlZCB0byB0aGlzIGNsYXNzCisgICAgICogZnJvbSB0aGUgcGFyZW50ICJlamJqYXIiIHRhc2spLiBUaGlzIGZpbGUgaXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeQorICAgICAqIHNwZWNpZmllZCBieSB0aGUgInNyY2RpciIgYXR0cmlidXRlIGluIHRoZSBlamJqYXIgdGFzay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdG9yTmFtZTsKKworICAgIC8qKgorICAgICAqIEZpbGVuYW1lIG9mIHRoZSBKT25BUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvciAod2hpY2ggaXMgcGFzc2VkIHRvIHRoaXMKKyAgICAgKiBjbGFzcyBmcm9tIHRoZSBwYXJlbnQgImVqYmphciIgdGFzaykuIFRoaXMgZmlsZSBpcyByZWxhdGl2ZSB0byB0aGUKKyAgICAgKiBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSAic3JjZGlyIiBhdHRyaWJ1dGUgaW4gdGhlIGVqYmphciB0YXNrLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGpvbmFzRGVzY3JpcHRvck5hbWU7CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tICovCisgICAgLyogR2VuSUMgb3B0aW9ucyAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIFRlbXBvcmFyeSBvdXRwdXQgZGlyZWN0b3J5IHVzZWQgYnkgR2VuSUMuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dGRpcjsKKworICAgIC8qKgorICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpbnRlcm1lZGlhdGUgSmF2YSBzb3VyY2UgZmlsZXMgZ2VuZXJhdGVkIGJ5CisgICAgICogR2VuSUMgbXVzdCBiZSBkZWxldGVkIG9yIG5vdC4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBnZW5lcmF0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIG11c3Qgbm90IGJlIGNvbXBpbGVkIHZpYQorICAgICAqIHRoZSBqYXZhIGFuZCBybWkgY29tcGlsZXJzLiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5vY29tcGlsID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgWE1MIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBiZSBwYXJzZWQKKyAgICAgKiB3aXRob3V0IHZhbGlkYXRpb24uIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbm92YWxpZGF0aW9uID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBKYXZhIGNvbXBpbGVyIHRvIHVzZS4gVGhlIGRlZmF1bHQgaXMgdGhlIHZhbHVlIG9mCisgICAgICogPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGphdmFjOworCisgICAgLyoqIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgamF2YSBjb21waWxlci4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBqYXZhY29wdHM7CisKKyAgICAvKiogT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBybWkgY29tcGlsZXIuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcm1pY29wdHM7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgUk1JIHNrZWxldG9uIGFuZCBzdHViIG11c3QgYmUgbW9kaWZpZWQgdG8KKyAgICAgKiBpbXBsZW1lbnQgdGhlIGltcGxpY2l0IHByb3BhZ2F0aW9uIG9mIHRoZSBzZWN1cml0eSBjb250ZXh0ICh0aGUKKyAgICAgKiB0cmFuc2FjdGlvbmFsIGNvbnRleHQgaXMgYWx3YXlzIHByb3ZpZGVkKS4gVGhlIGRlZmF1bHQgaXMKKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNlY3Byb3BhZyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEdlbklDIGNhbGwgbXVzdCBiZSB2ZXJib3NlLiBUaGUgZGVmYXVsdAorICAgICAqIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworCisgICAgLyoqIEFkZGl0aW9uYWwgYXJncyB0byBzZW5kIHRvIEdlbklDLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGFkZGl0aW9uYWxhcmdzOworCisgICAgLyogLS0tLS0tLS0tLS0tLSAqLworICAgIC8qIG90aGVyIG9wdGlvbnMgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tICovCisKKyAgICAvKiogSk9uQVMgcm9vdCBkaXJlY3RvcnkuICovCisgICAgcHJpdmF0ZSBGaWxlIGpvbmFzcm9vdDsKKworICAgIC8qKgorICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnZW5lcmljIEpBUiBmaWxlIHVzZWQgYXMgaW5wdXQgdG8gR2VuSUMgbXVzdCBiZQorICAgICAqIHJldGFpbmVkLiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBnZW5lcmljID0gZmFsc2U7CisKKyAgICAvKiogU3RvcmVzIHRoZSBzdWZmaXggZm9yIHRoZSBKT25BUyBKQVIgZmlsZS4gVGhlIGRlZmF1bHQgaXMgJy5qYXInLiAqLworICAgIHByaXZhdGUgU3RyaW5nIHN1ZmZpeCA9ICIuamFyIjsKKworICAgIC8qKgorICAgICAqICBPUkIgdG8gdXNlIChSTUksIEpFUkVNSUUgb3IgREFWSUQpLiBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB0aGUgb25lCisgICAgICogIHByZXNlbnQgaW4gY2xhc3NwYXRoLiBJZiBzcGVjaWZpZWQsIHRoZSBjb3JyZXNwb25kaW5nIEpPbkFTIEpBUiBpcworICAgICAqICBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBjbGFzc3BhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb3JiOworCisgICAgLyoqCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgR2VuSUMgbXVzdCBub3QgYmUgcnVuIG9uIHRoZSBFSkIgSkFSLgorICAgICAqIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbm9nZW5pYyA9IGZhbHNlOworCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAvKiBHZW5JQyBvcHRpb25zIHNldHRlciAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5rZWVwZ2VuZXJhdGVkPC9jb2RlPiBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGFCb29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmbGFnIG11c3QgYmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBnZW5lcmF0ZWQoYm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICBrZWVwZ2VuZXJhdGVkID0gYUJvb2xlYW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYVN0cmluZyBhZGRpdGlvbmFsIGFyZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbGFyZ3MoU3RyaW5nIGFTdHJpbmcpIHsKKyAgICAgICAgYWRkaXRpb25hbGFyZ3MgPSBhU3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxjb2RlPm5vY29tcGlsPC9jb2RlPiBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGFCb29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmbGFnIG11c3QgYmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vY29tcGlsKGJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgbm9jb21waWwgPSBhQm9vbGVhbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5ub3ZhbGlkYXRpb248L2NvZGU+IGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYUJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZsYWcgbXVzdCBiZSBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm92YWxpZGF0aW9uKGJvb2xlYW4gYUJvb2xlYW4pIHsKKyAgICAgICAgbm92YWxpZGF0aW9uID0gYUJvb2xlYW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgamF2YSBjb21waWxlciB0byB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYVN0cmluZyB0aGUgamF2YSBjb21waWxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhYyhTdHJpbmcgYVN0cmluZykgeworICAgICAgICBqYXZhYyA9IGFTdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGphdmEgY29tcGlsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYVN0cmluZyB0aGUgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhY29wdHMoU3RyaW5nIGFTdHJpbmcpIHsKKyAgICAgICAgamF2YWNvcHRzID0gYVN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgcm1pIGNvbXBpbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGFTdHJpbmcgdGhlIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um1pY29wdHMoU3RyaW5nIGFTdHJpbmcpIHsKKyAgICAgICAgcm1pY29wdHMgPSBhU3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxjb2RlPnNlY3Byb3BhZzwvY29kZT4gZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhQm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmxhZyBtdXN0IGJlIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWNwcm9wYWcoYm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICBzZWNwcm9wYWcgPSBhQm9vbGVhbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT52ZXJib3NlPC9jb2RlPiBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGFCb29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmbGFnIG11c3QgYmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICB2ZXJib3NlID0gYUJvb2xlYW47CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAvKiBvdGhlciBvcHRpb25zIHNldHRlciAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEpPbkFTIHJvb3QgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGFGaWxlIHRoZSBKT25BUyByb290IGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKb25hc3Jvb3QoRmlsZSBhRmlsZSkgeworICAgICAgICBqb25hc3Jvb3QgPSBhRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5rZWVwZ2VuZXJpYzwvY29kZT4gZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhQm9vbGVhbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmxhZyBtdXN0IGJlIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZWVwZ2VuZXJpYyhib29sZWFuIGFCb29sZWFuKSB7CisgICAgICAgIGtlZXBnZW5lcmljID0gYUJvb2xlYW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgamFyIHN1ZmZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBzdWZmaXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SmFyc3VmZml4KFN0cmluZyBhU3RyaW5nKSB7CisgICAgICAgIHN1ZmZpeCA9IGFTdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+b3JiPC9jb2RlPiB0byBjb25zdHJ1Y3QgY2xhc3NwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIGFTdHJpbmcgJ1JNSScsICdKRVJFTUlFJywgb3IgJ0RBVklEJy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmIoU3RyaW5nIGFTdHJpbmcpIHsKKyAgICAgICAgb3JiID0gYVN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5ub2dlbmljPC9jb2RlPiBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGFCb29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmbGFnIG11c3QgYmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZ2VuaWMoYm9vbGVhbiBhQm9vbGVhbikgeworICAgICAgICBub2dlbmljID0gYUJvb2xlYW47CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLSAqLworICAgIC8qIG90aGVyIG1ldGhvZHMgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRGVzY3JpcHRvcihTdHJpbmcgYURlc2NyaXB0b3JOYW1lLCBTQVhQYXJzZXIgc2F4UGFyc2VyKSB7CisKKyAgICAgICAgZGVzY3JpcHRvck5hbWUgPSBhRGVzY3JpcHRvck5hbWU7CisKKyAgICAgICAgbG9nKCJKT25BUyBEZXBsb3ltZW50IFRvb2wgcHJvY2Vzc2luZzogIiArIGRlc2NyaXB0b3JOYW1lLAorICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgc3VwZXIucHJvY2Vzc0Rlc2NyaXB0b3IoZGVzY3JpcHRvck5hbWUsIHNheFBhcnNlcik7CisKKyAgICAgICAgaWYgKG91dHB1dGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB0aGUgbWV0aG9kIGRlbGV0ZU9uRXhpdCgpIGRvIG5vdCB3b3JrIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBpcyBub3QgZW1wdHkKKyAgICAgICAgICAgIGxvZygiRGVsZXRpbmcgdGVtcCBvdXRwdXQgZGlyZWN0b3J5ICciICsgb3V0cHV0ZGlyICsgIicuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBkZWxldGVBbGxGaWxlcyhvdXRwdXRkaXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVKYXIoU3RyaW5nIGJhc2VOYW1lLCBGaWxlIGphcmZpbGUsIEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIHB1YmxpY0lkKQorICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBnZW5lcmljIGphciBmaXJzdAorICAgICAgICBGaWxlIGdlbmVyaWNKYXJGaWxlID0gc3VwZXIuZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShiYXNlTmFtZSk7CisgICAgICAgIHN1cGVyLndyaXRlSmFyKGJhc2VOYW1lLCBnZW5lcmljSmFyRmlsZSwgZWpiRmlsZXMsIHB1YmxpY0lkKTsKKworICAgICAgICAvLyBHZW5JQyBjYWxsIG9uIGdlbmVyaWMgamFyCisgICAgICAgIGFkZEdlbklDR2VuZXJhdGVkRmlsZXMoZ2VuZXJpY0phckZpbGUsIGVqYkZpbGVzKTsKKworICAgICAgICAvLyBjcmVhdGUgdGhlIHJlYWwgamFyCisgICAgICAgIHN1cGVyLndyaXRlSmFyKGJhc2VOYW1lLCBnZXRWZW5kb3JPdXRwdXRKYXJGaWxlKGJhc2VOYW1lKSwgZWpiRmlsZXMsIHB1YmxpY0lkKTsKKworICAgICAgICBpZiAoIWtlZXBnZW5lcmljKSB7CisgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGdlbmVyaWMgSkFSICIgKyBnZW5lcmljSmFyRmlsZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGdlbmVyaWNKYXJGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkVmVuZG9yRmlsZXMoSGFzaHRhYmxlIGVqYkZpbGVzLCBTdHJpbmcgZGRQcmVmaXgpIHsKKworICAgIC8vIEpPbkFTLXNwZWNpZmljIGRlc2NyaXB0b3IgZGVwbG95bWVudAorICAgIGpvbmFzRGVzY3JpcHRvck5hbWUgPSBnZXRKb25hc0Rlc2NyaXB0b3JOYW1lKCk7CisgICAgICAgIEZpbGUgam9uYXNERCA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsIGpvbmFzRGVzY3JpcHRvck5hbWUpOworCisgICAgICAgIGlmIChqb25hc0RELmV4aXN0cygpKSB7CisgICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBKT05BU19ERCwgam9uYXNERCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgdGhlIEpPbkFTIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluOiAiCisgICAgICAgICAgICAgICAgKyBqb25hc0RELmdldFBhdGgoKSArICIuIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRWZW5kb3JPdXRwdXRKYXJGaWxlKFN0cmluZyBiYXNlTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZ2V0RGVzdERpcigpLCBiYXNlTmFtZSArIHN1ZmZpeCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgSk9uQVMtc3BlY2lmaWMgRUpCIGRlc2NyaXB0b3IgdXNpbmcgdGhlCisgICAgICogc3BlY2lmaWVkIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yIG5hbWUuIEluIGdlbmVyYWwsIHRoZSBzdGFuZGFyZAorICAgICAqIGRlc2NyaXB0b3Igd2lsbCBiZSBuYW1lZCAiW2Jhc2VuYW1lXS1lamItamFyLnhtbCIsIGFuZCB0aGlzIG1ldGhvZCB3aWxsCisgICAgICogcmV0dXJuICJbYmFzZW5hbWVdLWpvbmFzLWVqYi1qYXIueG1sIiBvciAiam9uYXMtW2Jhc2VuYW1lXS54bWwiCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBKT25BUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvciBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEpvbmFzRGVzY3JpcHRvck5hbWUoKSB7CisKKyAgICAgICAgLy8gZGVzY3JpcHRvck5hbWUgPSA8cGF0aD48YmFzZW5hbWU+PGJhc2VuYW1ldGVybWluYXRvcj48cmVtYWluZGVyPgorICAgICAgICAvLyBleGFtcGxlcyA9IC9vcmcvb2JqZWN0d2ViL2Zvb0FwcGxpL2Zvby9Gb28tZWpiLWphci54bWwKKyAgICAgICAgLy8gZXhhbXBsZXMgPSAvb3JnL29iamVjdHdlYi9mb29BcHBsaS9mb28vRm9vLnhtbCAoSk9uQVMgY29udmVudGlvbikKKworICAgICAgICBTdHJpbmcgam9uYXNETjsgLy8gSk9uQVMtc3BlY2lmaWMgREQKKyAgICAgICAgYm9vbGVhbiBqb25hc0NvbnZlbnRpb24gPSBmYWxzZTsgLy8gdHJ1ZSBpZiB0aGUgSk9uQVMgY29udmVudGlvbiBpcyB1c2VkIGZvciB0aGUgREQKKyAgICAgICAgU3RyaW5nIHBhdGg7ICAgICAgICAgICAgLy8gRGlyZWN0b3J5IHBhdGggb2YgdGhlIEVKQiBkZXNjcmlwdG9yCisgICAgICAgIFN0cmluZyBmaWxlTmFtZTsgICAgICAgIC8vIEVKQiBkZXNjcmlwdG9yIGZpbGUgbmFtZQorICAgICAgICBTdHJpbmcgYmFzZU5hbWU7ICAgICAgICAvLyBGaWxlbmFtZSBhcHBlYXJpbmcgYmVmb3JlIG5hbWUgdGVybWluYXRvcgorICAgICAgICBTdHJpbmcgcmVtYWluZGVyOyAgICAgICAvLyBGaWxlbmFtZSBhcHBlYXJpbmcgYWZ0ZXIgdGhlIG5hbWUgdGVybWluYXRvcgorCisgICAgICAgIGludCBzdGFydE9mRmlsZU5hbWUgPSBkZXNjcmlwdG9yTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICBpZiAoc3RhcnRPZkZpbGVOYW1lICE9IC0xKSB7CisgICAgICAgICAgICAvLyBleHRyYWN0IHBhdGggaW5mbworICAgICAgICAgICAgcGF0aCA9IGRlc2NyaXB0b3JOYW1lLnN1YnN0cmluZygwLCBzdGFydE9mRmlsZU5hbWUgKyAxKTsKKyAgICAgICAgICAgIGZpbGVOYW1lID0gZGVzY3JpcHRvck5hbWUuc3Vic3RyaW5nKHN0YXJ0T2ZGaWxlTmFtZSArIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZGVzY3JpcHRvck5hbWUgaXMganVzdCBhIGZpbGUgd2l0aG91dCBwYXRoCisgICAgICAgICAgICBwYXRoID0gIiI7CisgICAgICAgICAgICBmaWxlTmFtZSA9IGRlc2NyaXB0b3JOYW1lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoRUpCX0REKSkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGggKyBKT05BU19ERDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBlbmRPZkJhc2VOYW1lID0gZGVzY3JpcHRvck5hbWUuaW5kZXhPZihnZXRDb25maWcoKS5iYXNlTmFtZVRlcm1pbmF0b3IsIHN0YXJ0T2ZGaWxlTmFtZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgZm9yIHRoZSBvZGQgY2FzZSB3aGVyZSB0aGUgdGVybWluYXRvciBhbmQvb3IgZmlsZW5hbWUKKyAgICAgICAgICogZXh0ZW5zaW9uIGFyZW4ndCBmb3VuZC4gIFRoZXNlIHdpbGwgZW5zdXJlICJqb25hcy0iIGFwcGVhcnMgYXQgdGhlCisgICAgICAgICAqIGVuZCBvZiB0aGUgbmFtZSBhbmQgYmVmb3JlIHRoZSAnLicgKGlmIHByZXNlbnQpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGVuZE9mQmFzZU5hbWUgPCAwKSB7CisgICAgICAgICAgICAvLyBiYXNlTmFtZVRlcm1pbmF0b3Igbm90IGZvdW5kOiB0aGUgZGVzY3JpcHRvciB1c2UgdGhlCisgICAgICAgICAgICAvLyBKT25BUyBuYW1pbmcgY29udmVudGlvbiwgaWUgW0Zvby54bWwsam9uYXMtRm9vLnhtbF0gYW5kCisgICAgICAgICAgICAvLyBub3QgW0ZvbzxiYXNlTmFtZVRlcm1pbmF0b3I+LWVqYi1qYXIueG1sLAorICAgICAgICAgICAgLy8gRm9vPGJhc2VOYW1lVGVybWluYXRvcj4tam9uYXMtZWpiLWphci54bWxdLgorICAgICAgICAgICAgZW5kT2ZCYXNlTmFtZSA9IGRlc2NyaXB0b3JOYW1lLmxhc3RJbmRleE9mKCcuJykgLSAxOworICAgICAgICAgICAgaWYgKGVuZE9mQmFzZU5hbWUgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gLiBmb3VuZAorICAgICAgICAgICAgICAgIGVuZE9mQmFzZU5hbWUgPSBkZXNjcmlwdG9yTmFtZS5sZW5ndGgoKSAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGpvbmFzQ29udmVudGlvbiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBiYXNlTmFtZSA9IGRlc2NyaXB0b3JOYW1lLnN1YnN0cmluZyhzdGFydE9mRmlsZU5hbWUgKyAxLCBlbmRPZkJhc2VOYW1lICsgMSk7CisgICAgICAgIHJlbWFpbmRlciA9IGRlc2NyaXB0b3JOYW1lLnN1YnN0cmluZyhlbmRPZkJhc2VOYW1lICsgMSk7CisKKyAgICAgICAgaWYgKGpvbmFzQ29udmVudGlvbikgeworICAgICAgICAgICAgam9uYXNETiA9IHBhdGggKyAiam9uYXMtIiArIGJhc2VOYW1lICsgIi54bWwiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgam9uYXNETiA9IHBhdGggKyBiYXNlTmFtZSArICJqb25hcy0iICsgcmVtYWluZGVyOworICAgICAgICB9CisKKyAgICAgICAgbG9nKCJTdGFuZGFyZCBFSkIgZGVzY3JpcHRvciBuYW1lOiAiICsgZGVzY3JpcHRvck5hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBsb2coIkpPbkFTLXNwZWNpZmljIGRlc2NyaXB0b3IgbmFtZTogIiArIGpvbmFzRE4sIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIHJldHVybiBqb25hc0ROOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SmFyQmFzZU5hbWUoU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSkgeworCisgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IG51bGw7CisKKyAgICAgICAgaWYgKGdldENvbmZpZygpLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhFamJKYXIuTmFtaW5nU2NoZW1lLkRFU0NSSVBUT1IpKSB7CisKKyAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIEpPbkFTIHNwZWNpZmljIGNvbnZlbnRpb24gbmFtZQorICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JGaWxlTmFtZS5pbmRleE9mKGdldENvbmZpZygpLmJhc2VOYW1lVGVybWluYXRvcikgPT0gLTEpIHsKKworICAgICAgICAgICAgICAgIC8vIGJhc2VOYW1lVGVybWluYXRvciBub3QgZm91bmQ6IHRoZSBkZXNjcmlwdG9yIHVzZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBKT25BUyBuYW1pbmcgY29udmVudGlvbiwgaWUgW0Zvby54bWwsam9uYXMtRm9vLnhtbF0gYW5kCisgICAgICAgICAgICAgICAgLy8gbm90IFtGb288YmFzZU5hbWVUZXJtaW5hdG9yPi1lamItamFyLnhtbCwKKyAgICAgICAgICAgICAgICAvLyBGb288YmFzZU5hbWVUZXJtaW5hdG9yPi1qb25hcy1lamItamFyLnhtbF0uCisKKyAgICAgICAgICAgICAgICBTdHJpbmcgYUNhbm9uaWNhbERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yRmlsZU5hbWUucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICAgICAgICAgIGludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBhQ2Fub25pY2FsRGVzY3JpcHRvci5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgIGludCBlbmRPZkJhc2VOYW1lOworCisgICAgICAgICAgICAgICAgaWYgKGxhc3RTZXBhcmF0b3JJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBlbmRPZkJhc2VOYW1lID0gZGVzY3JpcHRvckZpbGVOYW1lLmluZGV4T2YoIi54bWwiLCBsYXN0U2VwYXJhdG9ySW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVuZE9mQmFzZU5hbWUgPSBkZXNjcmlwdG9yRmlsZU5hbWUuaW5kZXhPZigiLnhtbCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbmRPZkJhc2VOYW1lICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gZGVzY3JpcHRvckZpbGVOYW1lLnN1YnN0cmluZygwLCBlbmRPZkJhc2VOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmFzZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZWxzZSBnZXQgc3RhbmRhcmQgYmFzZU5hbWUKKyAgICAgICAgICAgIGJhc2VOYW1lID0gc3VwZXIuZ2V0SmFyQmFzZU5hbWUoZGVzY3JpcHRvckZpbGVOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZygiSkFSIGJhc2UgbmFtZTogIiArIGJhc2VOYW1lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICByZXR1cm4gYmFzZU5hbWU7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJLbm93bkRURHMoRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKEVKQl9KQVJfMV8xX1BVQkxJQ19JRCwKKyAgICAgICAgICAgICAgICAgICAgam9uYXNyb290ICsgRmlsZS5zZXBhcmF0b3IgKyAieG1sIiArIEZpbGUuc2VwYXJhdG9yICsgRUpCX0pBUl8xXzFfRFREKTsKKyAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChFSkJfSkFSXzJfMF9QVUJMSUNfSUQsCisgICAgICAgICAgICAgICAgICAgIGpvbmFzcm9vdCArIEZpbGUuc2VwYXJhdG9yICsgInhtbCIgKyBGaWxlLnNlcGFyYXRvciArIEVKQl9KQVJfMl8wX0RURCk7CisKKyAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChKT05BU19FSkJfSkFSXzJfNF9QVUJMSUNfSUQsCisgICAgICAgICAgICAgICAgICAgIGpvbmFzcm9vdCArIEZpbGUuc2VwYXJhdG9yICsgInhtbCIgKyBGaWxlLnNlcGFyYXRvciArIEpPTkFTX0VKQl9KQVJfMl80X0RURCk7CisgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoSk9OQVNfRUpCX0pBUl8yXzVfUFVCTElDX0lELAorICAgICAgICAgICAgICAgICAgICBqb25hc3Jvb3QgKyBGaWxlLnNlcGFyYXRvciArICJ4bWwiICsgRmlsZS5zZXBhcmF0b3IgKyBKT05BU19FSkJfSkFSXzJfNV9EVEQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0byB0aGUgZ2l2ZW4gaGFzaHRhYmxlIGFsbCB0aGUgZmlsZSBnZW5lcmF0ZWQgYnkgR2VuSUMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2VuZXJpY0phckZpbGUgamFyIGZpbGUuCisgICAgICogQHBhcmFtIGVqYkZpbGVzIHRoZSBoYXNodGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEdlbklDR2VuZXJhdGVkRmlsZXMoCisgICAgICAgIEZpbGUgZ2VuZXJpY0phckZpbGUsIEhhc2h0YWJsZSBlamJGaWxlcykgeworICAgICAgICBKYXZhIGdlbmljVGFzayA9IG51bGw7ICAgIC8vIEdlbklDIHRhc2sKKyAgICAgICAgU3RyaW5nIGdlbmljQ2xhc3MgPSBudWxsOyAvLyBHZW5JQyBjbGFzcyAoMyBhcmUgc3VwcG9ydGVkIGZvciB2YXJpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbnMKKyAgICAgICAgaWYgKG5vZ2VuaWMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmljVGFzayA9IG5ldyBKYXZhKGdldFRhc2soKSk7CisgICAgICAgIGdlbmljVGFzay5zZXRUYXNrTmFtZSgiZ2VuaWMiKTsKKyAgICAgICAgZ2VuaWNUYXNrLnNldEZvcmsodHJ1ZSk7CisKKyAgICAgICAgLy8gam9uYXNyb290CisgICAgICAgIGdlbmljVGFzay5jcmVhdGVKdm1hcmcoKS5zZXRWYWx1ZSgiLURpbnN0YWxsLnJvb3Q9IiArIGpvbmFzcm9vdCk7CisKKyAgICAgICAgLy8gamF2YSBwb2xpY3kgZmlsZQorICAgICAgICBTdHJpbmcgam9uYXNDb25maWdEaXIgPSBqb25hc3Jvb3QgKyBGaWxlLnNlcGFyYXRvciArICJjb25maWciOworICAgICAgICBGaWxlIGphdmFQb2xpY3lGaWxlID0gbmV3IEZpbGUoam9uYXNDb25maWdEaXIsICJqYXZhLnBvbGljeSIpOworICAgICAgICBpZiAoamF2YVBvbGljeUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGdlbmljVGFzay5jcmVhdGVKdm1hcmcoKS5zZXRWYWx1ZSgiLURqYXZhLnNlY3VyaXR5LnBvbGljeT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGphdmFQb2xpY3lGaWxlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3V0cHV0ZGlyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXRkaXIgPSBjcmVhdGVUZW1wRGlyKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGFJT0V4Y2VwdGlvbikgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDYW5ub3QgY3JlYXRlIHRlbXAgZGlyOiAiICsgYUlPRXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGFJT0V4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJVc2luZyB0ZW1wb3Jhcnkgb3V0cHV0IGRpcmVjdG9yeTogIiArIG91dHB1dGRpciwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgZ2VuaWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItZCIpOworICAgICAgICBnZW5pY1Rhc2suY3JlYXRlQXJnKCkuc2V0RmlsZShvdXRwdXRkaXIpOworCisgICAgICAgIC8vIHdvcmsgYXJvdW5kIGEgYnVnIG9mIEdlbklDIDIuNQorICAgICAgICBTdHJpbmcga2V5OworICAgICAgICBGaWxlIGY7CisgICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBlamJGaWxlcy5rZXlzKCk7CisgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBmID0gbmV3IEZpbGUob3V0cHV0ZGlyICsgRmlsZS5zZXBhcmF0b3IgKyBrZXkpOworICAgICAgICAgICAgZi5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJXb3JrZWQgYXJvdW5kIGEgYnVnIG9mIEdlbklDIDIuNS4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAvLyBjbGFzc3BhdGgKKyAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBnZXRDb21iaW5lZENsYXNzcGF0aCgpOworICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFRhc2soKS5nZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQobmV3IFBhdGgoY2xhc3NwYXRoLmdldFByb2plY3QoKSwgam9uYXNDb25maWdEaXIpKTsKKyAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChuZXcgUGF0aChjbGFzc3BhdGguZ2V0UHJvamVjdCgpLCBvdXRwdXRkaXIudG9TdHJpbmcoKSkpOworCisgICAgICAgIC8vIHRyeSB0byBjcmVhdGUgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIGNvcnJlY3QgT1JCCisgICAgICAgIGlmIChvcmIgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG9yYkphciA9IGpvbmFzcm9vdCArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKKyAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgb3JiICsgIl9qb25hcy5qYXIiOworICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChuZXcgUGF0aChjbGFzc3BhdGguZ2V0UHJvamVjdCgpLCBvcmJKYXIpKTsKKyAgICAgICAgfQorICAgICAgICBsb2coIlVzaW5nIGNsYXNzcGF0aDogIiArIGNsYXNzcGF0aC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgZ2VuaWNUYXNrLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOworCisgICAgICAgIC8vIGNsYXNzIG5hbWUgKHNlYXJjaCBpbiB0aGUgY2xhc3NwYXRoIHByb3ZpZGVkIGZvciB0aGUgZWpiamFyIGVsZW1lbnQpCisgICAgICAgIGdlbmljQ2xhc3MgPSBnZXRHZW5pY0NsYXNzTmFtZShjbGFzc3BhdGgpOworICAgICAgICBpZiAoZ2VuaWNDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkNhbm5vdCBmaW5kIEdlbklDIGNsYXNzIGluIGNsYXNzcGF0aC4iLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJHZW5JQyBjbGFzcyBub3QgZm91bmQsIHBsZWFzZSBjaGVjayB0aGUgY2xhc3NwYXRoLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJVc2luZyAnIiArIGdlbmljQ2xhc3MgKyAiJyBHZW5JQyBjbGFzcy4iICwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBnZW5pY1Rhc2suc2V0Q2xhc3NuYW1lKGdlbmljQ2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgLy8ga2VlcGdlbmVyYXRlZAorICAgICAgICBpZiAoa2VlcGdlbmVyYXRlZCkgeworICAgICAgICAgICAgZ2VuaWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCIta2VlcGdlbmVyYXRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm9jb21waWwKKyAgICAgICAgaWYgKG5vY29tcGlsKSB7CisgICAgICAgICAgICBnZW5pY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1ub2NvbXBpbCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm92YWxpZGF0aW9uCisgICAgICAgIGlmIChub3ZhbGlkYXRpb24pIHsKKyAgICAgICAgICAgIGdlbmljVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLW5vdmFsaWRhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gamF2YWMKKyAgICAgICAgaWYgKGphdmFjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdlbmljVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWphdmFjIik7CisgICAgICAgICAgICBnZW5pY1Rhc2suY3JlYXRlQXJnKCkuc2V0TGluZShqYXZhYyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBqYXZhY29wdHMKKyAgICAgICAgaWYgKGphdmFjb3B0cyAhPSBudWxsICYmICFqYXZhY29wdHMuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgZ2VuaWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItamF2YWNvcHRzIik7CisgICAgICAgICAgICBnZW5pY1Rhc2suY3JlYXRlQXJnKCkuc2V0TGluZShqYXZhY29wdHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcm1pY29wdHMKKyAgICAgICAgaWYgKHJtaWNvcHRzICE9IG51bGwgJiYgIXJtaWNvcHRzLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGdlbmljVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLXJtaWNvcHRzIik7CisgICAgICAgICAgICBnZW5pY1Rhc2suY3JlYXRlQXJnKCkuc2V0TGluZShybWljb3B0cyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZWNwcm9wYWcKKyAgICAgICAgaWYgKHNlY3Byb3BhZykgeworICAgICAgICAgICAgZ2VuaWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItc2VjcHJvcGFnIik7CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJib3NlCisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBnZW5pY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi12ZXJib3NlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGRpdGlvbmFsYXJncworICAgICAgICBpZiAoYWRkaXRpb25hbGFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZ2VuaWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKGFkZGl0aW9uYWxhcmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyBtdXN0IG5vdCBiZSBhZGRlZCBpbiB0aGUgZ2VuZXJpYyBKQVIhCisgICAgICAgIC8vIGlzIHRoYXQgYnVnZ3kgb24gb2xkIEpPbkFTICgyLjQpID8/CisgICAgICAgIGdlbmljVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLW5vYWRkaW5qYXIiKTsKKworICAgICAgICAvLyBpbnB1dCBmaWxlIHRvIHByb2Nlc3MgYnkgR2VuSUMKKyAgICAgICAgZ2VuaWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKGdlbmVyaWNKYXJGaWxlLmdldFBhdGgoKSk7CisKKyAgICAgICAgLy8gY2FsbGluZyBHZW5JQyB0YXNrCisgICAgICAgIGxvZygiQ2FsbGluZyAiICsgZ2VuaWNDbGFzcyArICIgZm9yICIgKyBnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyCisgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgZGVzY3JpcHRvck5hbWUgKyAiLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIGlmIChnZW5pY1Rhc2suZXhlY3V0ZUphdmEoKSAhPSAwKSB7CisKKyAgICAgICAgICAgIC8vIHRoZSBtZXRob2QgZGVsZXRlT25FeGl0KCkgZG8gbm90IHdvcmsgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eQorICAgICAgICAgICAgbG9nKCJEZWxldGluZyB0ZW1wIG91dHB1dCBkaXJlY3RvcnkgJyIgKyBvdXRwdXRkaXIgKyAiJy4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGRlbGV0ZUFsbEZpbGVzKG91dHB1dGRpcik7CisKKyAgICAgICAgICAgIGlmICgha2VlcGdlbmVyaWMpIHsKKyAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGdlbmVyaWMgSkFSICIgKyBnZW5lcmljSmFyRmlsZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICBnZW5lcmljSmFyRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJHZW5JQyByZXBvcnRlZCBhbiBlcnJvci4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvIHRoZSBlamJGaWxlcworICAgICAgICBhZGRBbGxGaWxlcyhvdXRwdXRkaXIsICIiLCBlamJGaWxlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBHZW5JQyBjbGFzcyBuYW1lIHRvIHVzZSBpbiB0aGUgZ2l2ZW4gY2xhc3NwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBjbGFzc3BhdGggd2hlcmUgdGhlIEdlbklDIGNsYXNzIG11c3QgYmUgc2VhcmNoZWQuCisgICAgICogQHJldHVybiB0aGUgR2VuSUMgY2xhc3MgbmFtZS4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjbGFzcyBuYW1lCisgICAgICogY2Fubm90IGJlIGZvdW5kLgorICAgICAqLworICAgIFN0cmluZyBnZXRHZW5pY0NsYXNzTmFtZShQYXRoIGNsYXNzcGF0aCkgeworCisgICAgICAgIGxvZygiTG9va2luZyBmb3IgR2VuSUMgY2xhc3MgaW4gY2xhc3NwYXRoOiAiCisgICAgICAgICAgICArIGNsYXNzcGF0aC50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBBbnRDbGFzc0xvYWRlciBjbCA9IGNsYXNzcGF0aC5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NwYXRoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2wubG9hZENsYXNzKEpvbmFzRGVwbG95bWVudFRvb2wuR0VOSUNfQ0xBU1MpOworICAgICAgICAgICAgbG9nKCJGb3VuZCBHZW5JQyBjbGFzcyAnIiArIEpvbmFzRGVwbG95bWVudFRvb2wuR0VOSUNfQ0xBU1MKKyAgICAgICAgICAgICAgICArICInIGluIGNsYXNzcGF0aC4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybiBKb25hc0RlcGxveW1lbnRUb29sLkdFTklDX0NMQVNTOworCisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mMSkgeworICAgICAgICAgICAgbG9nKCJHZW5JQyBjbGFzcyAnIiArIEpvbmFzRGVwbG95bWVudFRvb2wuR0VOSUNfQ0xBU1MKKyAgICAgICAgICAgICAgICArICInIG5vdCBmb3VuZCBpbiBjbGFzc3BhdGguIiwKKyAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsLmxvYWRDbGFzcyhKb25hc0RlcGxveW1lbnRUb29sLk9MRF9HRU5JQ19DTEFTU18xKTsKKyAgICAgICAgICAgIGxvZygiRm91bmQgR2VuSUMgY2xhc3MgJyIgKyBKb25hc0RlcGxveW1lbnRUb29sLk9MRF9HRU5JQ19DTEFTU18xCisgICAgICAgICAgICAgICAgKyAiJyBpbiBjbGFzc3BhdGguIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm4gSm9uYXNEZXBsb3ltZW50VG9vbC5PTERfR0VOSUNfQ0xBU1NfMTsKKworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZjIpIHsKKyAgICAgICAgICAgIGxvZygiR2VuSUMgY2xhc3MgJyIgKyBKb25hc0RlcGxveW1lbnRUb29sLk9MRF9HRU5JQ19DTEFTU18xCisgICAgICAgICAgICAgICAgKyAiJyBub3QgZm91bmQgaW4gY2xhc3NwYXRoLiIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbC5sb2FkQ2xhc3MoSm9uYXNEZXBsb3ltZW50VG9vbC5PTERfR0VOSUNfQ0xBU1NfMik7CisgICAgICAgICAgICBsb2coIkZvdW5kIEdlbklDIGNsYXNzICciICsgSm9uYXNEZXBsb3ltZW50VG9vbC5PTERfR0VOSUNfQ0xBU1NfMgorICAgICAgICAgICAgICAgICsgIicgaW4gY2xhc3NwYXRoLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuIEpvbmFzRGVwbG95bWVudFRvb2wuT0xEX0dFTklDX0NMQVNTXzI7CisKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmYzKSB7CisgICAgICAgICAgICBsb2coIkdlbklDIGNsYXNzICciICsgSm9uYXNEZXBsb3ltZW50VG9vbC5PTERfR0VOSUNfQ0xBU1NfMgorICAgICAgICAgICAgICAgICsgIicgbm90IGZvdW5kIGluIGNsYXNzcGF0aC4iLAorICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yRmlsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgZmlsZS4KKyAgICAgKiBAcGFyYW0gc2F4UGFyc2VyICAgICAgICAgIG5vdCB1c2VkLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBqb25hc3Jvb3QKKyAgICAgICAgaWYgKGpvbmFzcm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBqb25hc3Jvb3QgYXR0cmlidXQgaXMgbm90IHNldC4iKTsKKyAgICAgICAgfSBlbHNlIGlmICgham9uYXNyb290LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGpvbmFzcm9vdCBhdHRyaWJ1dCAnIiArIGpvbmFzcm9vdAorICAgICAgICAgICAgICAgICsgIicgaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5LiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3JiCisgICAgICAgIGlmIChvcmIgIT0gbnVsbCAmJiAhb3JiLmVxdWFscyhSTUlfT1JCKSAmJiAhb3JiLmVxdWFscyhKRVJFTUlFX09SQikKKyAgICAgICAgICAgICYmICFvcmIuZXF1YWxzKERBVklEX09SQikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIG9yYiBhdHRyaWJ1dCAnIiArIG9yYgorICAgICAgICAgICAgICAgICsgIicgaXMgbm90IHZhbGlkIChtdXN0IGJlIGVpdGhlciAiCisgICAgICAgICAgICAgICAgKyBSTUlfT1JCICsgIiwgIiArIEpFUkVNSUVfT1JCICsgIiBvciAiICsgREFWSURfT1JCICsgIikuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGRpdGlvbmFsYXJncworICAgICAgICBpZiAoYWRkaXRpb25hbGFyZ3MgIT0gbnVsbCAmJiBhZGRpdGlvbmFsYXJncy5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVtcHR5IGFkZGl0aW9uYWxhcmdzIGF0dHJpYnV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gamF2YWMKKyAgICAgICAgaWYgKGphdmFjICE9IG51bGwgJiYgamF2YWMuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFbXB0eSBqYXZhYyBhdHRyaWJ1dC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLyogdXRpbGl0YXJ5IG1ldGhvZHMgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgR2VuSUMgb3V0cHV0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGVtcCBkaXJlY3RvcnkuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhIHRlbXAgZGlyZWN0b3J5IGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBjcmVhdGVUZW1wRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSB0bXBEaXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJnZW5pYyIsIG51bGwsIG51bGwpOworICAgICAgICB0bXBEaXIuZGVsZXRlKCk7CisgICAgICAgIGlmICghdG1wRGlyLm1rZGlyKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSAnIiArIHRtcERpciArICInLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0bXBEaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgZmlsZS4gSWYgdGhlIGZpbGUgaXMgYSBkaXJlY3RvcnksIGRlbGV0ZSByZWN1cnNpdmx5IGFsbCB0aGUKKyAgICAgKiBmaWxlcyBpbnNpZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYUZpbGUgZmlsZSB0byBkZWxldGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbEZpbGVzKEZpbGUgYUZpbGUpIHsKKyAgICAgICAgaWYgKGFGaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIEZpbGVbXSBzb21lRmlsZXMgPSBhRmlsZS5saXN0RmlsZXMoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb21lRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZWxldGVBbGxGaWxlcyhzb21lRmlsZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFGaWxlLmRlbGV0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbGUgdG8gdGhlIGEgZ2l2ZW4gaGFzaHRhYmxlLiBJZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSwgYWRkCisgICAgICogcmVjdXJzaXZseSBhbGwgdGhlIGZpbGVzIGluc2lkZSB0byB0aGUgaGFzaHRhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gYWRkLgorICAgICAqIEBwYXJhbSByb290RGlyIHRoZSBjdXJyZW50IHN1Yi1kaXJlY3RvcnkgdG8gc2Nhbi4KKyAgICAgKiBAcGFyYW0gaGFzaHRhYmxlIHRoZSBoYXNodGFibGUgd2hlcmUgdG8gYWRkIHRoZSBmaWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkQWxsRmlsZXMoRmlsZSBmaWxlLCBTdHJpbmcgcm9vdERpciwgSGFzaHRhYmxlIGhhc2h0YWJsZSkgeworCisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5ld1Jvb3REaXI7CisgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJvb3REaXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1Jvb3REaXIgPSByb290RGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3Um9vdERpciA9IGZpbGVzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkQWxsRmlsZXMoZmlsZXNbaV0sIG5ld1Jvb3REaXIsIGhhc2h0YWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYXNodGFibGUucHV0KHJvb3REaXIsIGZpbGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dlYmxvZ2ljRGVwbG95bWVudFRvb2wuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY0RlcGxveW1lbnRUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1MDY2NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY0RlcGxveW1lbnRUb29sLmphdmEKQEAgLTAsMCArMSw5MjggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKy8qKgorICAgIFRoZSB3ZWJsb2dpYyBlbGVtZW50IGlzIHVzZWQgdG8gY29udHJvbCB0aGUgd2VibG9naWMuZWpiYyBjb21waWxlciBmb3IKKyAgICBnZW5lcmF0aW5nIHdlYmxvZ2ljIEVKQiBqYXJzLiBQcmlvciB0byBBbnQgMS4zLCB0aGUgbWV0aG9kIG9mIGxvY2F0aW5nIENNUAorICAgIGRlc2NyaXB0b3JzIHdhcyB0byB1c2UgdGhlIGVqYmphciBuYW1pbmcgY29udmVudGlvbi4gU28gaWYgeW91ciBlamItamFyIHdhcworICAgIGNhbGxlZCwgQ3VzdG9tZXItZWpiLWphci54bWwsIHlvdXIgd2VibG9naWMgZGVzY3JpcHRvciB3YXMgY2FsbGVkIEN1c3RvbWVyLQorICAgIHdlYmxvZ2ljLWVqYi1qYXIueG1sIGFuZCB5b3VyIENNUCBkZXNjcmlwdG9yIGhhZCB0byBiZSBDdXN0b21lci13ZWJsb2dpYy1jbXAtCisgICAgcmRibXMtamFyLnhtbC4gSW4gYWRkaXRpb24sIHRoZSAmbHQ7dHlwZS1zdG9yYWdlJmd0OyBlbGVtZW50IGluIHRoZSB3ZWJsb2dpYworICAgIGRlc2NyaXB0b3IgaGFkIHRvIGJlIHNldCB0byB0aGUgc3RhbmRhcmQgbmFtZSBNRVRBLUlORi93ZWJsb2dpYy1jbXAtcmRibXMtCisgICAgamFyLnhtbCwgYXMgdGhhdCBpcyB3aGVyZSB0aGUgQ01QIGRlc2NyaXB0b3Igd2FzIG1hcHBlZCB0byBpbiB0aGUgZ2VuZXJhdGVkCisgICAgamFyLgorKi8KK3B1YmxpYyBjbGFzcyBXZWJsb2dpY0RlcGxveW1lbnRUb29sIGV4dGVuZHMgR2VuZXJpY0RlcGxveW1lbnRUb29sIHsKKyAgICAvKiogRUpCMTEgaWQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNJRF9FSkIxMQorICAgICAgICAgPSAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iOworICAgIC8qKiBFSkIyMCBpZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0lEX0VKQjIwCisgICAgICAgICA9ICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiI7CisgICAgLyoqIFdlYmxvZ2ljIDUuMS4wIGlkICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDSURfV0VCTE9HSUNfRUpCNTEwCisgICAgICAgICA9ICItLy9CRUEgU3lzdGVtcywgSW5jLi8vRFREIFdlYkxvZ2ljIDUuMS4wIEVKQi8vRU4iOworICAgIC8qKiBXZWJsb2dpYyA2LjAuMCBpZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0lEX1dFQkxPR0lDX0VKQjYwMAorICAgICAgICAgPSAiLS8vQkVBIFN5c3RlbXMsIEluYy4vL0RURCBXZWJMb2dpYyA2LjAuMCBFSkIvL0VOIjsKKyAgICAvKiogV2VibG9naWMgNy4wLjAgaWQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNJRF9XRUJMT0dJQ19FSkI3MDAKKyAgICAgICAgID0gIi0vL0JFQSBTeXN0ZW1zLCBJbmMuLy9EVEQgV2ViTG9naWMgNy4wLjAgRUpCLy9FTiI7CisKKyAgICAvKiogV2VibG9naWMgNS4xIGR0ZCBsb2NhdGlvbiAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0w1MV9FSkIxMV9EVERfTE9DQVRJT04KKyAgICAgICAgID0gIi93ZWJsb2dpYy9lamIvZGVwbG95bWVudC94bWwvZWpiLWphci5kdGQiOworICAgIC8qKiBXZWJsb2dpYyA2LjAgZWpiIDEuMSBkdGQgbG9jYXRpb24gKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dMNjBfRUpCMTFfRFREX0xPQ0FUSU9OCisgICAgICAgICA9ICIvd2VibG9naWMvZWpiMjAvZGQveG1sL2VqYjExLWphci5kdGQiOworICAgIC8qKiBXZWJsb2dpYyA2LjAgZWpiIDIuMCBkdGQgbG9jYXRpb24gKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dMNjBfRUpCMjBfRFREX0xPQ0FUSU9OCisgICAgICAgICA9ICIvd2VibG9naWMvZWpiMjAvZGQveG1sL2VqYjIwLWphci5kdGQiOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XTDUxX0RURF9MT0NBVElPTgorICAgICAgICAgPSAiL3dlYmxvZ2ljL2VqYi9kZXBsb3ltZW50L3htbC93ZWJsb2dpYy1lamItamFyLmR0ZCI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XTDYwXzUxX0RURF9MT0NBVElPTgorICAgICAgICAgPSAiL3dlYmxvZ2ljL2VqYjIwL2RkL3htbC93ZWJsb2dpYzUxMC1lamItamFyLmR0ZCI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XTDYwX0RURF9MT0NBVElPTgorICAgICAgICAgPSAiL3dlYmxvZ2ljL2VqYjIwL2RkL3htbC93ZWJsb2dpYzYwMC1lamItamFyLmR0ZCI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XTDcwX0RURF9MT0NBVElPTgorICAgICAgICAgPSAiL3dlYmxvZ2ljL2VqYjIwL2RkL3htbC93ZWJsb2dpYzcwMC1lamItamFyLmR0ZCI7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBJTEVSID0gImRlZmF1bHQiOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0xfREQgPSAid2VibG9naWMtZWpiLWphci54bWwiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdMX0NNUF9ERCA9ICJ3ZWJsb2dpYy1jbXAtcmRibXMtamFyLnhtbCI7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9FSkIxMSA9ICJ3ZWJsb2dpYy5lamJjIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9FSkIyMCA9ICJ3ZWJsb2dpYy5lamJjMjAiOworCisgICAgLyoqIEZpbGUgdXRpbGl0aWVzIGluc3RhbmNlIGZvciBjb3B5aW5nIGphcnMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgc3VmZml4IGZvciB0aGUgd2VibG9naWMgamFyZmlsZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBqYXJTdWZmaXggPSAiLmphciI7CisKKyAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWJsb2dpYyBEVEQgZmlsZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyB3ZWJsb2dpY0RURDsKKworICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGVqYiAxLjEgRFREIGZpbGUuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZWpiMTFEVEQ7CisKKyAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgZ2VuZXJpYyBlamIgamFycyBhcmUga2VwdC4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4ga2VlcGdlbmVyYXRlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlCisgICAgICogd2VibG9naWMgRUpCQyBjb21waWxlcgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVqYmNDbGFzcyA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBhZGRpdGlvbmFsQXJncyA9ICIiOworCisgICAgLyoqCisgICAgICogYWRkaXRpb25hbCBhcmdzIHRvIHBhc3MgdG8gdGhlIHNwYXduZWQganZtCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWRkaXRpb25hbEp2bUFyZ3MgPSAiIjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwR2VuZXJpYyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBib29sZWFuIGFsd2F5c1JlYnVpbGQgPSB0cnVlOworCisgICAgLyoqIGNvbnRyb2xzIHdoZXRoZXIgZWpiYyBpcyBydW4gb24gdGhlIGdlbmVyYXRlZCBqYXIgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbm9FSkJDID0gZmFsc2U7CisKKyAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBvbGQgQ01QIGxvY2F0aW9uIGNvbnZlbnRpb24gaXMgdG8gYmUgdXNlZC4gICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5ld0NNUCA9IGZhbHNlOworCisgICAgLyoqIFRoZSBjbGFzc3BhdGggdG8gdGhlIHdlYmxvZ2ljIGNsYXNzZXMuICovCisgICAgcHJpdmF0ZSBQYXRoIHdsQ2xhc3NwYXRoID0gbnVsbDsKKworICAgIC8qKiBTeXN0ZW0gcHJvcGVydGllcyBmb3IgdGhlIEpWTS4gKi8KKyAgICBwcml2YXRlIFZlY3RvciBzeXNwcm9wcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB3ZWJsb2dpYy5TdGRvdXRTZXZlcml0eUxldmVsIHRvIHVzZSB3aGVuIHJ1bm5pbmcgdGhlIEpWTSB0aGF0CisgICAgICogZXhlY3V0ZXMgZWpiYy4gU2V0IHRvIDE2IHRvIGF2b2lkIHRoZSB3YXJuaW5ncyBhYm91dCBFSkIgSG9tZSBhbmQKKyAgICAgKiBSZW1vdGVzIGJlaW5nIGluIHRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVnZXIganZtRGVidWdMZXZlbCA9IG51bGw7CisKKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyOworCisgICAgLyoqCisgICAgICogQWRkIGEgbmVzdGVkIHN5c3Byb3BlcnR5IGVsZW1lbnQuCisgICAgICogQHBhcmFtIHN5c3AgdGhlIGVsZW1lbnQgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFN5c3Byb3BlcnR5KEVudmlyb25tZW50LlZhcmlhYmxlIHN5c3ApIHsKKyAgICAgICAgc3lzcHJvcHMuYWRkKHN5c3ApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGFzc3BhdGggdG8gdGhlIHdlYmxvZ2ljIGNsYXNzcGF0aHMuCisgICAgICogQHJldHVybiB0aGUgY2xhc3NwYXRoIHRvIGNvbmZpZ3VyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVXTENsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKHdsQ2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHdsQ2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0VGFzaygpLmdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdsQ2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgZWpiYyB3aWxsIHVzZSB0aGlzIGRpcmVjdG9yeSBhcyB0aGUgb3V0cHV0CisgICAgICogZGVzdGluYXRpb24gcmF0aGVyIHRoYW4gYSBqYXIgZmlsZS4gVGhpcyBhbGxvd3MgZm9yIHRoZQorICAgICAqIGdlbmVyYXRpb24gb2YgJnF1b3Q7ZXhwbG9kZWQmcXVvdDsgamFycy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0RGlyIHRoZSBkaXJlY3RvcnkgdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXIoRmlsZSBvdXRwdXREaXIpIHsKKyAgICAgICAgdGhpcy5vdXRwdXREaXIgPSBvdXRwdXREaXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPcHRpb25hbCBjbGFzc3BhdGggdG8gV0w2LjAuCisgICAgICogV2VibG9naWMgNi4wIHdpbGwgZ2l2ZSBhIHdhcm5pbmcgaWYgdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzCisgICAgICogb2YgYSBiZWFuIGFyZSBvbiB0aGUgc3lzdGVtIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biB3ZWJsb2dpYy5lamJjLgorICAgICAqIEluIHRoYXQgY2FzZSwgdGhlIHN0YW5kYXJkIHdlYmxvZ2ljIGNsYXNzZXMgc2hvdWxkIGJlIHNldCB3aXRoCisgICAgICogdGhpcyBhdHRyaWJ1dGUgKG9yIGVxdWl2YWxlbnQgbmVzdGVkIGVsZW1lbnQpIGFuZCB0aGUKKyAgICAgKiBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBsb2NhdGVkIHdpdGggdGhlIHN0YW5kYXJkIGNsYXNzcGF0aAorICAgICAqIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gd2xDbGFzc3BhdGggdGhlIHBhdGggdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXTENsYXNzcGF0aChQYXRoIHdsQ2xhc3NwYXRoKSB7CisgICAgICAgIHRoaXMud2xDbGFzc3BhdGggPSB3bENsYXNzcGF0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb21waWxlciAoc3dpdGNoIDxjb2RlPi1jb21waWxlcjwvY29kZT4pIHRvIHVzZTsgb3B0aW9uYWwuCisgICAgICogVGhpcyBhbGxvd3MgZm9yIHRoZSBzZWxlY3Rpb24gb2YgYSBkaWZmZXJlbnQgY29tcGlsZXIKKyAgICAgKiB0byBiZSB1c2VkIGZvciB0aGUgY29tcGlsYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBKYXZhCisgICAgICogZmlsZXMuIFRoaXMgY291bGQgYmUgc2V0LCBmb3IgZXhhbXBsZSwgdG8gSmlrZXMgdG8KKyAgICAgKiBjb21waWxlIHdpdGggdGhlIEppa2VzIGNvbXBpbGVyLiBJZiB0aGlzIGlzIG5vdCBzZXQKKyAgICAgKiBhbmQgdGhlIDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQKKyAgICAgKiB0byBqaWtlcywgdGhlIEppa2VzIGNvbXBpbGVyIHdpbGwgYmUgdXNlZC4gSWYgdGhpcworICAgICAqIGlzIG5vdCBkZXNpcmVkLCB0aGUgdmFsdWUgJnF1b3Q7PGNvZGU+ZGVmYXVsdDwvY29kZT4mcXVvdDsKKyAgICAgKiBtYXkgYmUgZ2l2ZW4gdG8gdXNlIHRoZSBkZWZhdWx0IGNvbXBpbGVyLgorICAgICAqIEBwYXJhbSBjb21waWxlciB0aGUgY29tcGlsZXIgdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21waWxlcihTdHJpbmcgY29tcGlsZXIpIHsKKyAgICAgICAgdGhpcy5jb21waWxlciA9IGNvbXBpbGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWJ1aWxkIGZsYWcgdG8gZmFsc2UgdG8gb25seSB1cGRhdGUgY2hhbmdlcyBpbiB0aGUgamFyIHJhdGhlcgorICAgICAqIHRoYW4gcmVydW5uaW5nIGVqYmM7IG9wdGlvbmFsLCBkZWZhdWx0IHRydWUuCisgICAgICogVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgd2VibG9naWMuZWpiYyBpcyBhbHdheXMKKyAgICAgKiBpbnZva2VkIHRvIGJ1aWxkIHRoZSBqYXIgZmlsZS4gSW4gY2VydGFpbiBjaXJjdW1zdGFuY2VzLAorICAgICAqIHN1Y2ggYXMgd2hlbiBvbmx5IGEgYmVhbiBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkLCB0aGUgamFyCisgICAgICogY2FuIGJlIGdlbmVyYXRlZCBieSBtZXJlbHkgcmVwbGFjaW5nIHRoZSBjaGFuZ2VkIGNsYXNzZXMKKyAgICAgKiBhbmQgbm90IHJlcnVubmluZyBlamJjLiBTZXR0aW5nIHRoaXMgdG8gZmFsc2Ugd2lsbCByZWR1Y2UKKyAgICAgKiB0aGUgdGltZSB0byBydW4gZWpiamFyLgorICAgICAqIEBwYXJhbSByZWJ1aWxkIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVidWlsZChib29sZWFuIHJlYnVpbGQpIHsKKyAgICAgICAgdGhpcy5hbHdheXNSZWJ1aWxkID0gcmVidWlsZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdlYmxvZ2ljLlN0ZG91dFNldmVyaXR5TGV2ZWwgdG8gdXNlIHdoZW4gcnVubmluZyB0aGUgSlZNIHRoYXQKKyAgICAgKiBleGVjdXRlcyBlamJjOyBvcHRpb25hbC4gU2V0IHRvIDE2IHRvIGF2b2lkIHRoZSB3YXJuaW5ncyBhYm91dCBFSkIgSG9tZSBhbmQKKyAgICAgKiBSZW1vdGVzIGJlaW5nIGluIHRoZSBjbGFzc3BhdGgKKyAgICAgKiBAcGFyYW0ganZtRGVidWdMZXZlbCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEp2bURlYnVnTGV2ZWwoSW50ZWdlciBqdm1EZWJ1Z0xldmVsKSB7CisgICAgICAgIHRoaXMuanZtRGVidWdMZXZlbCA9IGp2bURlYnVnTGV2ZWw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlYnVnIGxldmVsLgorICAgICAqIEByZXR1cm4gdGhlIGp2bSBkZWJ1ZyBsZXZlbCAobWF5IGJlIG51bGwpLgorICAgICAqLworICAgIHB1YmxpYyBJbnRlZ2VyIGdldEp2bURlYnVnTGV2ZWwoKSB7CisgICAgICAgIHJldHVybiBqdm1EZWJ1Z0xldmVsOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBTZXR0ZXIgdXNlZCB0byBzdG9yZSB0aGUgc3VmZml4IGZvciB0aGUgZ2VuZXJhdGVkIHdlYmxvZ2ljIGphciBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBzdWZmaXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBpblN0cmluZykgeworICAgICAgICB0aGlzLmphclN1ZmZpeCA9IGluU3RyaW5nOworICAgIH0KKworCisgICAgLyoqCisgICAgICogY29udHJvbHMgd2hldGhlciB0aGUgZ2VuZXJpYyBmaWxlIHVzZWQgYXMgaW5wdXQgdG8KKyAgICAgKiBlamJjIGlzIHJldGFpbmVkOyBkZWZhdWx0cyB0byBmYWxzZQorICAgICAqCisgICAgICogQHBhcmFtIGluVmFsdWUgdHJ1ZSBmb3Iga2VlcCBnZW5lcmljCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2VlcGdlbmVyaWMoYm9vbGVhbiBpblZhbHVlKSB7CisgICAgICAgIHRoaXMua2VlcEdlbmVyaWMgPSBpblZhbHVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciB3ZWJsb2dpYyB3aWxsIGtlZXAgdGhlIGdlbmVyYXRlZCBKYXZhCisgICAgICogZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgY2xhc3MgZmlsZXMgYWRkZWQgdG8gdGhlCisgICAgICogamFyLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmc7IGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5WYWx1ZSBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZWVwZ2VuZXJhdGVkKFN0cmluZyBpblZhbHVlKSB7CisgICAgICAgIHRoaXMua2VlcGdlbmVyYXRlZCA9IEJvb2xlYW4udmFsdWVPZihpblZhbHVlKS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFueSBvcHRpb25hbCBleHRyYSBhcmd1bWVudHMgcGFzcyB0byB0aGUgd2VibG9naWMuZWpiYworICAgICAqIHRvb2wuCisgICAgICogQHBhcmFtIGFyZ3MgZXh0cmEgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGVqYmMgdG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcmdzKFN0cmluZyBhcmdzKSB7CisgICAgICAgIHRoaXMuYWRkaXRpb25hbEFyZ3MgPSBhcmdzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3ZWJsb2dpYyBKVk07IG9wdGlvbmFsLgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBKVk0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKdm1hcmdzKFN0cmluZyBhcmdzKSB7CisgICAgICAgIHRoaXMuYWRkaXRpb25hbEp2bUFyZ3MgPSBhcmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NuYW1lIG9mIHRoZSBlamJjIGNvbXBpbGVyOyAgb3B0aW9uYWwKKyAgICAgKiBOb3JtYWxseSBlamJqYXIgZGV0ZXJtaW5lcworICAgICAqIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBiYXNlZCBvbiB0aGUgRFREIHVzZWQgZm9yIHRoZSBFSkIuIFRoZSBFSkIgMi4wIGNvbXBpbGVyCisgICAgICogZmVhdHVyZWQgaW4gd2VibG9naWMgNiBoYXMsIGhvd2V2ZXIsIGJlZW4gZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDcuIFdoZW4KKyAgICAgKiB1c2luZyB3aXRoIHZlcnNpb24gNyB0aGlzIGF0dHJpYnV0ZSBzaG91bGQgYmUgc2V0IHRvCisgICAgICogJnF1b3Q7d2VibG9naWMuZWpiYyZxdW90OyB0byBhdm9pZCB0aGUgZGVwcmVjYXRpb24gd2FybmluZy4KKyAgICAgKiBAcGFyYW0gZWpiY0NsYXNzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWpiY0NsYXNzKFN0cmluZyBlamJjQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5lamJjQ2xhc3MgPSBlamJjQ2xhc3M7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGVqYmMgY29tcGlsZXIgY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZWpiYyBjb21waWxlciBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVqYmNDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGVqYmNDbGFzczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIDxiPkRlcHJlY2F0ZWQ8L2I+LiBEZWZpbmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWpiLWphciBEVEQgaW4KKyAgICAgKiAgdGhlIHdlYmxvZ2ljIGNsYXNzIGhpZXJhcmNoeS4gU2hvdWxkIG5vdCBiZSBuZWVkZWQsIGFuZCB0aGUKKyAgICAgKiBuZXN0ZWQgJmx0O2R0ZCZndDsgZWxlbWVudCBpcyByZWNvbW1lbmRlZCB3aGVuIGl0IGlzLgorICAgICAqCisgICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBEVEQgbG9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2VibG9naWNkdGQoU3RyaW5nIGluU3RyaW5nKSB7CisgICAgICAgIHNldEVKQmR0ZChpblN0cmluZyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiA8Yj5EZXByZWNhdGVkPC9iPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2Ygd2VibG9naWMgRFREIGluCisgICAgICogIHRoZSB3ZWJsb2dpYyBjbGFzcyBoaWVyYXJjaHkuIFNob3VsZCBub3QgYmUgbmVlZGVkLCBhbmQgdGhlCisgICAgICogbmVzdGVkICZsdDtkdGQmZ3Q7IGVsZW1lbnQgaXMgcmVjb21tZW5kZWQgd2hlbiBpdCBpcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgRFREIGxvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdMZHRkKFN0cmluZyBpblN0cmluZykgeworICAgICAgICB0aGlzLndlYmxvZ2ljRFREID0gaW5TdHJpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiA8Yj5EZXByZWNhdGVkPC9iPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgU3VuJ3MgRUpCIERURCBpbgorICAgICAqICB0aGUgd2VibG9naWMgY2xhc3MgaGllcmFyY2h5LiBTaG91bGQgbm90IGJlIG5lZWRlZCwgYW5kIHRoZQorICAgICAqIG5lc3RlZCAmbHQ7ZHRkJmd0OyBlbGVtZW50IGlzIHJlY29tbWVuZGVkIHdoZW4gaXQgaXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5TdHJpbmcgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIERURCBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFSkJkdGQoU3RyaW5nIGluU3RyaW5nKSB7CisgICAgICAgIHRoaXMuZWpiMTFEVEQgPSBpblN0cmluZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIG9sZENNUCBzY2hlbWUuIFRoaXMgaXMgYW4gYW50b255bSBmb3IgbmV3Q01QCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlJworICAgICAqIEBwYXJhbSBvbGRDTVAgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbGRDTVAoYm9vbGVhbiBvbGRDTVApIHsKKyAgICAgICAgdGhpcy5uZXdDTVAgPSAhb2xkQ01QOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSwgdGhlIG5ldyBtZXRob2QgZm9yIGxvY2F0aW5nCisgICAgICogQ01QIGRlc2NyaXB0b3JzIHdpbGwgYmUgdXNlZDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICogPFA+CisgICAgICogVGhlIG9sZCBDTVAgc2NoZW1lIGxvY2F0ZXMgdGhlCisgICAgICogd2VibG9naWMgQ01QIGRlc2NyaXB0b3IgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uIHdoZXJlIHRoZQorICAgICAqIHdlYmxvZ2ljIENNUCBmaWxlIGlzIGV4cGVjdGVkIHRvIGJlIG5hbWVkIHdpdGggdGhlIGJlYW4gbmFtZSBhcyB0aGUKKyAgICAgKiBwcmVmaXguIFVuZGVyIHRoaXMgc2NoZW1lIHRoZSBuYW1lIG9mIHRoZSBDTVAgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaAorICAgICAqIHRoZSBuYW1lIGFjdHVhbGx5IHVzZWQgaW4gdGhlIG1haW4gd2VibG9naWMgRUpCIGRlc2NyaXB0b3IuIEFsc28sCisgICAgICogZGVzY3JpcHRvcnMgd2hpY2ggY29udGFpbiBtdWx0aXBsZSBDTVAgcmVmZXJlbmNlcyBjb3VsZCBub3QgYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gbmV3Q01QIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmV3Q01QKGJvb2xlYW4gbmV3Q01QKSB7CisgICAgICAgIHRoaXMubmV3Q01QID0gbmV3Q01QOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRG8gbm90IEVKQkMgdGhlIGphciBhZnRlciBpdCBoYXMgYmVlbiBwdXQgdG9nZXRoZXI7CisgICAgICogb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKKyAgICAgKiBAcGFyYW0gbm9FSkJDIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9FSkJDKGJvb2xlYW4gbm9FSkJDKSB7CisgICAgICAgIHRoaXMubm9FSkJDID0gbm9FSkJDOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIERURHMuCisgICAgICogQHBhcmFtIGhhbmRsZXIgdGhlIGhhbmRsZXIgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyS25vd25EVERzKERlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgLy8gcmVnaXN0ZXIgYWxsIHRoZSBrbm93biBEVERzCisgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfRUpCMTEsIERFRkFVTFRfV0w1MV9FSkIxMV9EVERfTE9DQVRJT04pOworICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX0VKQjExLCBERUZBVUxUX1dMNjBfRUpCMTFfRFREX0xPQ0FUSU9OKTsKKyAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChQVUJMSUNJRF9FSkIxMSwgZWpiMTFEVEQpOworICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX0VKQjIwLCBERUZBVUxUX1dMNjBfRUpCMjBfRFREX0xPQ0FUSU9OKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgd2VibG9naWMgZGVzY3JpcHRvciBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBzcmNEaXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkuCisgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvckhhbmRsZXIgZ2V0V2VibG9naWNEZXNjcmlwdG9ySGFuZGxlcihmaW5hbCBGaWxlIHNyY0RpcikgeworICAgICAgICBEZXNjcmlwdG9ySGFuZGxlciBoYW5kbGVyID0KKyAgICAgICAgICAgIG5ldyBEZXNjcmlwdG9ySGFuZGxlcihnZXRUYXNrKCksIHNyY0RpcikgeworICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50KCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuZXF1YWxzKCJ0eXBlLXN0b3JhZ2UiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmaWxlbmFtZSBvZiB2ZW5kb3Igc3BlY2lmaWMgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lV2l0aE1FVEEgPSBjdXJyZW50VGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJpbSB0aGUgTUVUQV9JTkZcIG9mZiBvZiB0aGUgZmlsZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmaWxlTmFtZVdpdGhNRVRBLnN1YnN0cmluZyhNRVRBX0RJUi5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZVdpdGhNRVRBLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZGVzY3JpcHRvckZpbGUgPSBuZXcgRmlsZShzcmNEaXIsIGZpbGVOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZWpiRmlsZXMucHV0KGZpbGVOYW1lV2l0aE1FVEEsIGRlc2NyaXB0b3JGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChQVUJMSUNJRF9XRUJMT0dJQ19FSkI1MTAsIERFRkFVTFRfV0w1MV9EVERfTE9DQVRJT04pOworICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX1dFQkxPR0lDX0VKQjUxMCwgREVGQVVMVF9XTDYwXzUxX0RURF9MT0NBVElPTik7CisgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfV0VCTE9HSUNfRUpCNjAwLCBERUZBVUxUX1dMNjBfRFREX0xPQ0FUSU9OKTsKKyAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChQVUJMSUNJRF9XRUJMT0dJQ19FSkI3MDAsIERFRkFVTFRfV0w3MF9EVERfTE9DQVRJT04pOworICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX1dFQkxPR0lDX0VKQjUxMCwgd2VibG9naWNEVEQpOworICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX1dFQkxPR0lDX0VKQjYwMCwgd2VibG9naWNEVEQpOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENvbmZpZygpLmR0ZExvY2F0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEVqYkphci5EVERMb2NhdGlvbiBkdGRMb2NhdGlvbiA9IChFamJKYXIuRFRETG9jYXRpb24pIGkubmV4dCgpOworCisgICAgICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKGR0ZExvY2F0aW9uLmdldFB1YmxpY0lkKCksIGR0ZExvY2F0aW9uLmdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYW5kbGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGFueSB2ZW5kb3Igc3BlY2lmaWMgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBFSkIgSmFyLgorICAgICAqIEBwYXJhbSBlamJGaWxlcyB0aGUgaGFzaCB0YWJsZSB0byBiZSBwb3B1bGF0ZWQuCisgICAgICogQHBhcmFtIGRkUHJlZml4IHRoZSBwcmVmaXggdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7CisgICAgICAgIEZpbGUgd2VibG9naWNERCA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsIGRkUHJlZml4ICsgV0xfREQpOworCisgICAgICAgIGlmICh3ZWJsb2dpY0RELmV4aXN0cygpKSB7CisgICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBXTF9ERCwKKyAgICAgICAgICAgICAgICB3ZWJsb2dpY0REKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvY2F0ZSB3ZWJsb2dpYyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICIKKyAgICAgICAgICAgICAgICArICJJdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW4gIgorICAgICAgICAgICAgICAgICsgd2VibG9naWNERC5nZXRQYXRoKCksIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFuZXdDTVApIHsKKyAgICAgICAgICAgIGxvZygiVGhlIG9sZCBtZXRob2QgZm9yIGxvY2F0aW5nIENNUCBmaWxlcyBoYXMgYmVlbiBERVBSRUNBVEVELiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgbG9nKCJQbGVhc2UgYWRqdXN0IHlvdXIgd2VibG9naWMgZGVzY3JpcHRvciBhbmQgc2V0ICIKKyAgICAgICAgICAgICAgICArICJuZXdDTVA9XCJ0cnVlXCIgdG8gdXNlIHRoZSBuZXcgQ01QIGRlc2NyaXB0b3IgIgorICAgICAgICAgICAgICAgICsgImluY2x1c2lvbiBtZWNoYW5pc20uICIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgLy8gVGhlIHRoZSB3ZWJsb2dpYyBjbXAgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICAgICAgICBGaWxlIHdlYmxvZ2ljQ01QREQgPSBuZXcgRmlsZShnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyLCBkZFByZWZpeCArIFdMX0NNUF9ERCk7CisKKyAgICAgICAgICAgIGlmICh3ZWJsb2dpY0NNUERELmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgV0xfQ01QX0RELAorICAgICAgICAgICAgICAgICAgICB3ZWJsb2dpY0NNUEREKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIHdlYmxvZ2ljIGRlc2NyaXB0b3IsIHdlIHBhcnNlIHRoZSBmaWxlCisgICAgICAgICAgICAvLyB0byBmaW5kIG90aGVyIGRlc2NyaXB0b3JzIG5lZWRlZCB0byBkZXBsb3kgdGhlIGJlYW4uCisgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIHRoZSB3ZWJsb2dpYy1jbXAtcmRibXMueG1sIG9yIGFueSBvdGhlciBPL1IKKyAgICAgICAgICAgIC8vIG1hcHBpbmcgdG9vbCBkZXNjcmlwdG9ycy4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZSBlamJEZXNjcmlwdG9yID0gKEZpbGUpIGVqYkZpbGVzLmdldChNRVRBX0RJUiArIEVKQl9ERCk7CisgICAgICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhQYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgICAgICAgc2F4UGFyc2VyRmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOworCisgICAgICAgICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IHNheFBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisgICAgICAgICAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlcgorICAgICAgICAgICAgICAgICAgICA9IGdldFdlYmxvZ2ljRGVzY3JpcHRvckhhbmRsZXIoZWpiRGVzY3JpcHRvci5nZXRQYXJlbnRGaWxlKCkpOworCisgICAgICAgICAgICAgICAgc2F4UGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZQorICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGVJbnB1dFN0cmVhbSh3ZWJsb2dpY0REKSksCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBodCA9IGhhbmRsZXIuZ2V0RmlsZXMoKTsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gaHQua2V5cygpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoa2V5LCBodC5nZXQoa2V5KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgVmVuZG9yIHNwZWNpZmljIGZpbGVzOiAiICsgZS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVuZG9yIHNwZWNpZmljIG5hbWUgb2YgdGhlIEphciB0aGF0IHdpbGwgYmUgb3V0cHV0LiBUaGUKKyAgICAgKiBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGphciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgZGVwZW5kZW50CisgICAgICogYmVhbiBjbGFzc2VzLgorICAgICAqLworICAgIEZpbGUgZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShTdHJpbmcgYmFzZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldERlc3REaXIoKSwgYmFzZU5hbWUgKyBqYXJTdWZmaXgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCBpbnZva2VkIGJ5IGV4ZWN1dGUoKSBmb3IgZWFjaCBXZWJMb2dpYyBqYXIgdG8gYmUgYnVpbHQuCisgICAgICogRW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBvZiBjb25zdHJ1Y3RpbmcgYSBqYXZhIHRhc2sgZm9yIGNhbGxpbmcKKyAgICAgKiB3ZWJsb2dpYy5lamJjIGFuZCBleGVjdXRpbmcgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlSmFyIGphdmEuaW8uRmlsZSByZXByZXNlbnRpbmcgdGhlIHNvdXJjZSAoRUpCMS4xKSBqYXJmaWxlLgorICAgICAqIEBwYXJhbSBkZXN0SmFyIGphdmEuaW8uRmlsZSByZXByZXNlbnRpbmcgdGhlIGRlc3RpbmF0aW9uLCBXZWJMb2dpYworICAgICAqICAgICAgamFyZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYnVpbGRXZWJsb2dpY0phcihGaWxlIHNvdXJjZUphciwgRmlsZSBkZXN0SmFyLCBTdHJpbmcgcHVibGljSWQpIHsKKyAgICAgICAgSmF2YSBqYXZhVGFzayA9IG51bGw7CisKKyAgICAgICAgaWYgKG5vRUpCQykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmNvcHlGaWxlKHNvdXJjZUphciwgZGVzdEphcik7CisgICAgICAgICAgICAgICAgaWYgKCFrZWVwZ2VuZXJhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZUphci5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIEVKQiBqYXIiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBlamJjQ2xhc3NOYW1lID0gZWpiY0NsYXNzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXZhVGFzayA9IG5ldyBKYXZhKGdldFRhc2soKSk7CisgICAgICAgICAgICBqYXZhVGFzay5zZXRUYXNrTmFtZSgiZWpiYyIpOworCisgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVKdm1hcmcoKS5zZXRMaW5lKGFkZGl0aW9uYWxKdm1BcmdzKTsKKyAgICAgICAgICAgIGlmICghKHN5c3Byb3BzLmlzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGVuID0gc3lzcHJvcHMuZWxlbWVudHMoKTsgZW4uaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LlZhcmlhYmxlIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICA9IChFbnZpcm9ubWVudC5WYXJpYWJsZSkgZW4ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgamF2YVRhc2suYWRkU3lzcHJvcGVydHkoZW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGdldEp2bURlYnVnTGV2ZWwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlSnZtYXJnKCkuc2V0TGluZSgiIC1Ed2VibG9naWMuU3Rkb3V0U2V2ZXJpdHlMZXZlbD0iICsganZtRGVidWdMZXZlbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlamJjQ2xhc3NOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZGV0ZXJtaW5lIGl0IGZyb20gcHVibGljSWQKKyAgICAgICAgICAgICAgICBpZiAoUFVCTElDSURfRUpCMTEuZXF1YWxzKHB1YmxpY0lkKSkgeworICAgICAgICAgICAgICAgICAgICBlamJjQ2xhc3NOYW1lID0gQ09NUElMRVJfRUpCMTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQVUJMSUNJRF9FSkIyMC5lcXVhbHMocHVibGljSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGVqYmNDbGFzc05hbWUgPSBDT01QSUxFUl9FSkIyMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coIlVucmVjb2duaXplZCBwdWJsaWNJZCAiICsgcHVibGljSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtIHVzaW5nIEVKQiAxLjEgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgZWpiY0NsYXNzTmFtZSA9IENPTVBJTEVSX0VKQjExOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgamF2YVRhc2suc2V0Q2xhc3NuYW1lKGVqYmNDbGFzc05hbWUpOworICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0TGluZShhZGRpdGlvbmFsQXJncyk7CisgICAgICAgICAgICBpZiAoa2VlcGdlbmVyYXRlZCkgeworICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCIta2VlcGdlbmVyYXRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbXBpbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB0cnkgdG8gdXNlIHRoZSBjb21waWxlciBzcGVjaWZpZWQgYnkgYnVpbGQuY29tcGlsZXIuCisgICAgICAgICAgICAgICAgLy8gUmlnaHQgbm93IHdlIGFyZSBqdXN0IGdvaW5nIHRvIGFsbG93IEppa2VzCisgICAgICAgICAgICAgICAgU3RyaW5nIGJ1aWxkQ29tcGlsZXIKKyAgICAgICAgICAgICAgICAgICAgPSBnZXRUYXNrKCkuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJidWlsZC5jb21waWxlciIpOworCisgICAgICAgICAgICAgICAgaWYgKGJ1aWxkQ29tcGlsZXIgIT0gbnVsbCAmJiBidWlsZENvbXBpbGVyLmVxdWFscygiamlrZXMiKSkgeworICAgICAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWNvbXBpbGVyIik7CisgICAgICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCJqaWtlcyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFjb21waWxlci5lcXVhbHMoREVGQVVMVF9DT01QSUxFUikpIHsKKyAgICAgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1jb21waWxlciIpOworICAgICAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRMaW5lKGNvbXBpbGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBhdGggY29tYmluZWRDbGFzc3BhdGggPSBnZXRDb21iaW5lZENsYXNzcGF0aCgpOworICAgICAgICAgICAgaWYgKHdsQ2xhc3NwYXRoICE9IG51bGwgJiYgY29tYmluZWRDbGFzc3BhdGggIT0gbnVsbAorICAgICAgICAgICAgICAgICAmJiBjb21iaW5lZENsYXNzcGF0aC50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWNsYXNzcGF0aCIpOworICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFBhdGgoY29tYmluZWRDbGFzc3BhdGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShzb3VyY2VKYXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKGRlc3RKYXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUob3V0cHV0RGlyLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBhdGggY2xhc3NwYXRoID0gd2xDbGFzc3BhdGg7CisKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsYXNzcGF0aCA9IGdldENvbWJpbmVkQ2xhc3NwYXRoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGphdmFUYXNrLnNldEZvcmsodHJ1ZSk7CisgICAgICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqYXZhVGFzay5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9nKCJDYWxsaW5nICIgKyBlamJjQ2xhc3NOYW1lICsgIiBmb3IgIiArIHNvdXJjZUphci50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgICAgICBpZiAoamF2YVRhc2suZXhlY3V0ZUphdmEoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFamJjIHJlcG9ydGVkIGFuIGVycm9yIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBIYXZlIHRvIGNhdGNoIHRoaXMgYmVjYXVzZSBvZiB0aGUgc2VtYW50aWNzIG9mIGNhbGxpbmcgbWFpbigpCisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nICIgKyBlamJjQ2xhc3NOYW1lCisgICAgICAgICAgICAgICAgKyAiLiBEZXRhaWxzOiAiICsgZS50b1N0cmluZygpOworCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogTWV0aG9kIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIHdyaXRpbmcgb2YgdGhlIEpBUiBmaWxlLiBJdGVyYXRlcyBvdmVyCisgICAgICogdGhlIGZpbGVuYW1lcy9qYXZhLmlvLkZpbGVzIGluIHRoZSBIYXNodGFibGUgc3RvcmVkIG9uIHRoZSBpbnN0YW5jZQorICAgICAqIHZhcmlhYmxlIGVqYkZpbGVzLgorICAgICAqIEBwYXJhbSBiYXNlTmFtZSB0aGUgYmFzZSBuYW1lLgorICAgICAqIEBwYXJhbSBqYXJGaWxlIHRoZSBqYXIgZmlsZSB0byBwb3B1bGF0ZS4KKyAgICAgKiBAcGFyYW0gZmlsZXMgICB0aGUgaGFzaCB0YWJsZSBvZiBmaWxlcyB0byB3cml0ZS4KKyAgICAgKiBAcGFyYW0gcHVibGljSWQgdGhlIGlkIHRvIHVzZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUphcihTdHJpbmcgYmFzZU5hbWUsIEZpbGUgamFyRmlsZSwgSGFzaHRhYmxlIGZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbmVlZCB0byBjcmVhdGUgYSBnZW5lcmljIGphciBmaXJzdC4KKyAgICAgICAgRmlsZSBnZW5lcmljSmFyRmlsZSA9IHN1cGVyLmdldFZlbmRvck91dHB1dEphckZpbGUoYmFzZU5hbWUpOworCisgICAgICAgIHN1cGVyLndyaXRlSmFyKGJhc2VOYW1lLCBnZW5lcmljSmFyRmlsZSwgZmlsZXMsIHB1YmxpY0lkKTsKKworICAgICAgICBpZiAoYWx3YXlzUmVidWlsZCB8fCBpc1JlYnVpbGRSZXF1aXJlZChnZW5lcmljSmFyRmlsZSwgamFyRmlsZSkpIHsKKyAgICAgICAgICAgIGJ1aWxkV2VibG9naWNKYXIoZ2VuZXJpY0phckZpbGUsIGphckZpbGUsIHB1YmxpY0lkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWtlZXBHZW5lcmljKSB7CisgICAgICAgICAgICBsb2coImRlbGV0aW5nIGdlbmVyaWMgamFyICIgKyBnZW5lcmljSmFyRmlsZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgZ2VuZXJpY0phckZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSB0b29sIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyZWQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBzdXBlci52YWxpZGF0ZUNvbmZpZ3VyZWQoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgdG8gc2VlIGlmIGEgd2VibG9naWMgRUJKMS4xIGphciBuZWVkcyB0byBiZQorICAgICAqIHJlYnVpbHQgdXNpbmcgZWpiYy4gQ2FsbGVkIGZyb20gd3JpdGVKYXIgaXQgc2VlcyBpZiB0aGUgIkJlYW4iIGNsYXNzZXMKKyAgICAgKiBhcmUgdGhlIG9ubHkgdGhpbmcgdGhhdCBuZWVkcyB0byBiZSB1cGRhdGVkIGFuZCBlaXRoZXIgdXBkYXRlcyB0aGUgSmFyCisgICAgICogd2l0aCB0aGUgQmVhbiBjbGFzc2ZpbGUgb3IgcmV0dXJucyB0cnVlLCBzYXlpbmcgdGhhdCB0aGUgd2hvbGUgd2VibG9naWMKKyAgICAgKiBqYXIgbmVlZHMgdG8gYmUgcmVnZW5lZCB3aXRoIGVqYmMuIFRoaXMgYWxsb3dzIGZhc3RlciBidWlsZCB0aW1lcyBmb3IKKyAgICAgKiB3b3JraW5nIGRldmVsb3BlcnMuIDxwPgorICAgICAqCisgICAgICogVGhlIHdheSB3ZWJsb2dpYyBlamJjIHdvcmtzIGlzIGl0IGNyZWF0ZXMgd3JhcHBlcnMgZm9yIHRoZSBwdWJsaWNseQorICAgICAqIGRlZmluZWQgbWV0aG9kcyBhcyB0aGV5IGFyZSBleHBvc2VkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLiBJZiB0aGUKKyAgICAgKiBhY3R1YWwgYmVhbiBjaGFuZ2VzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHRoZSBtZXRob2Qgc2lnbmF0dXJlcyB0aGVuCisgICAgICogb25seSB0aGUgYmVhbiBjbGFzc2ZpbGUgbmVlZHMgdG8gYmUgdXBkYXRlZCBhbmQgdGhlIHJlc3Qgb2YgdGhlCisgICAgICogd2VibG9naWMgamFyIGZpbGUgY2FuIHJlbWFpbiB0aGUgc2FtZS4gSWYgdGhlIEludGVyZmFjZXMsIGllLiB0aGUKKyAgICAgKiBtZXRob2Qgc2lnbmF0dXJlcyBjaGFuZ2Ugb3IgaWYgdGhlIHhtbCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGNoYW5nZWQsCisgICAgICogdGhlIHdob2xlIGphciBuZWVkcyB0byBiZSByZWJ1aWx0IHdpdGggZWpiYy4gVGhpcyBpcyBub3Qgc3RyaWN0bHkgdHJ1ZQorICAgICAqIGZvciB0aGUgeG1sIGZpbGVzLiBJZiB0aGUgSk5ESSBuYW1lIGNoYW5nZXMgdGhlbiB0aGUgamFyIGRvZXNudCBoYXZlIHRvCisgICAgICogYmUgcmVidWlsZCwgYnV0IGlmIHRoZSByZXNvdXJjZXMgcmVmZXJlbmNlcyBjaGFuZ2UgdGhlbiBpdCBkb2VzLiBBdAorICAgICAqIHRoaXMgcG9pbnQgdGhlIHdlYmxvZ2ljIGphciBnZXRzIHJlYnVpbHQgaWYgdGhlIHhtbCBmaWxlcyBjaGFuZ2UgYXQKKyAgICAgKiBhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2VuZXJpY0phckZpbGUgamF2YS5pby5GaWxlIFRoZSBnZW5lcmljIGphciBmaWxlLgorICAgICAqIEBwYXJhbSB3ZWJsb2dpY0phckZpbGUgamF2YS5pby5GaWxlIFRoZSB3ZWJsb2dpYyBqYXIgZmlsZSB0byBjaGVjayB0bworICAgICAqICAgICAgc2VlIGlmIGl0IG5lZWRzIHRvIGJlIHJlYnVpbHQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBqYXIgbmVlZHMgdG8gYmUgcmVidWlsdC4KKyAgICAgKi8KKyAgICAvLyBDaGVja1N0eWxlOk1ldGhvZExlbmd0aCBPRkYgLSB0aGlzIHdpbGwgbm8gYmUgZml4ZWQKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYnVpbGRSZXF1aXJlZChGaWxlIGdlbmVyaWNKYXJGaWxlLCBGaWxlIHdlYmxvZ2ljSmFyRmlsZSkgeworICAgICAgICBib29sZWFuIHJlYnVpbGQgPSBmYWxzZTsKKworICAgICAgICBKYXJGaWxlIGdlbmVyaWNKYXIgPSBudWxsOworICAgICAgICBKYXJGaWxlIHdsSmFyID0gbnVsbDsKKyAgICAgICAgRmlsZSBuZXdXTEphckZpbGUgPSBudWxsOworICAgICAgICBKYXJPdXRwdXRTdHJlYW0gbmV3SmFyU3RyZWFtID0gbnVsbDsKKyAgICAgICAgQ2xhc3NMb2FkZXIgZ2VuZXJpY0xvYWRlciA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZygiQ2hlY2tpbmcgaWYgd2VibG9naWMgSmFyIG5lZWRzIHRvIGJlIHJlYnVpbHQgZm9yIGphciAiICsgd2VibG9naWNKYXJGaWxlLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIC8vIE9ubHkgZ28gZm9yd2FyZCBpZiB0aGUgZ2VuZXJpYyBhbmQgdGhlIHdlYmxvZ2ljIGZpbGUgYm90aCBleGlzdAorICAgICAgICAgICAgaWYgKGdlbmVyaWNKYXJGaWxlLmV4aXN0cygpICYmIGdlbmVyaWNKYXJGaWxlLmlzRmlsZSgpCisgICAgICAgICAgICAgICAgICYmIHdlYmxvZ2ljSmFyRmlsZS5leGlzdHMoKSAmJiB3ZWJsb2dpY0phckZpbGUuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgICAgICAvL29wZW4gamFyIGZpbGVzCisgICAgICAgICAgICAgICAgZ2VuZXJpY0phciA9IG5ldyBKYXJGaWxlKGdlbmVyaWNKYXJGaWxlKTsKKyAgICAgICAgICAgICAgICB3bEphciA9IG5ldyBKYXJGaWxlKHdlYmxvZ2ljSmFyRmlsZSk7CisKKyAgICAgICAgICAgICAgICBIYXNodGFibGUgZ2VuZXJpY0VudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICAgICAgSGFzaHRhYmxlIHdsRW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgICAgICBIYXNodGFibGUgcmVwbGFjZUVudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgICAgICAgICAvL2dldCB0aGUgbGlzdCBvZiBnZW5lcmljIGphciBlbnRyaWVzCisgICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZ2VuZXJpY0phci5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gKEphckVudHJ5KSBlLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY0VudHJpZXMucHV0KGplLmdldE5hbWUoKS5yZXBsYWNlKCdcXCcsICcvJyksIGplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGxpc3Qgb2Ygd2VibG9naWMgamFyIGVudHJpZXMKKyAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSB3bEphci5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gKEphckVudHJ5KSBlLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgd2xFbnRyaWVzLnB1dChqZS5nZXROYW1lKCksIGplKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0N5Y2xlIFRocm91Z2ggZ2VuZXJpYyBhbmQgbWFrZSBzdXJlIGl0cyBpbiB3ZWJsb2dpYworICAgICAgICAgICAgICAgIGdlbmVyaWNMb2FkZXIgPSBnZXRDbGFzc0xvYWRlckZyb21KYXIoZ2VuZXJpY0phckZpbGUpOworCisgICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZ2VuZXJpY0VudHJpZXMua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZXBhdGggPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdsRW50cmllcy5jb250YWluc0tleShmaWxlcGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbmFtZS9wYXRoIG1hdGNoCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZpbGVzIHNlZSBpZiBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSBnZW5lcmljRW50cnkgPSAoSmFyRW50cnkpIGdlbmVyaWNFbnRyaWVzLmdldChmaWxlcGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSB3bEVudHJ5ID0gKEphckVudHJ5KSB3bEVudHJpZXMuZ2V0KGZpbGVwYXRoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnZW5lcmljRW50cnkuZ2V0Q3JjKCkgIT0gd2xFbnRyeS5nZXRDcmMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZ2VuZXJpY0VudHJ5LmdldFNpemUoKSAhPSB3bEVudHJ5LmdldFNpemUoKSkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmljRW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpbGUgYXJlIGRpZmZlcmVudCBzZWUgaWYgaXRzIGFuIG9iamVjdCBvciBhbiBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBnZW5lcmljRW50cnkuZ2V0TmFtZSgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZ2VuY2xhc3MgPSBnZW5lcmljTG9hZGVyLmxvYWRDbGFzcyhjbGFzc25hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5jbGFzcy5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVyZmFjZSBjaGFuZ2VkICAgcmVidWlsZCBqYXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkludGVyZmFjZSAiICsgZ2VuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBjaGFuZ2VkIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9PYmplY3QgY2xhc3MgQ2hhbmdlZCAgIHVwZGF0ZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VFbnRyaWVzLnB1dChmaWxlcGF0aCwgZ2VuZXJpY0VudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGl0IHRoZSBtYW5pZmVzdC4gSWYgc28gaWdub3JlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2VuZXJpY0VudHJ5LmdldE5hbWUoKS5lcXVhbHMoIk1FVEEtSU5GL01BTklGRVNULk1GIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlsZSBvdGhlciB0aGVuIGNsYXNzIGNoYW5nZWQgICByZWJ1aWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIk5vbiBjbGFzcyBmaWxlICIgKyBnZW5lcmljRW50cnkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBjaGFuZ2VkIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBmaWxlIGRvZXNudCBleGlzdCByZWJ1aWxkCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRmlsZSAiICsgZmlsZXBhdGggKyAiIG5vdCBwcmVzZW50IGluIHdlYmxvZ2ljIGphciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFyZWJ1aWxkKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiTm8gcmVidWlsZCBuZWVkZWQgLSB1cGRhdGluZyBqYXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3V0xKYXJGaWxlID0gbmV3IEZpbGUod2VibG9naWNKYXJGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIi50ZW1wIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdXTEphckZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1dMSmFyRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbSA9IG5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3V0xKYXJGaWxlKSk7CisgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5zZXRMZXZlbCgwKTsKKworICAgICAgICAgICAgICAgICAgICAvL0NvcHkgZmlsZXMgZnJvbSBvbGQgd2VibG9naWMgamFyCisgICAgICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHdsRW50cmllcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0RFRkFVTFRfQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzOworICAgICAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgamUgPSAoSmFyRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGplLmdldENvbXByZXNzZWRTaXplKCkgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBqZS5nZXRDb21wcmVzc2VkU2l6ZSgpID09IGplLmdldFNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5zZXRMZXZlbCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLnNldExldmVsKEpBUl9DT01QUkVTU19MRVZFTCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB3aXRoIGNoYW5nZWQgQmVhbiBjbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VFbnRyaWVzLmNvbnRhaW5zS2V5KGplLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlVwZGF0aW5nIEJlYW4gY2xhc3MgZnJvbSBnZW5lcmljIEphciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgamUuZ2V0TmFtZSgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGVudHJ5IGZyb20gdGhlIGdlbmVyaWMgamFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamUgPSAoSmFyRW50cnkpIHJlcGxhY2VFbnRyaWVzLmdldChqZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gZ2VuZXJpY0phci5nZXRJbnB1dFN0cmVhbShqZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNlIGZsZSBmcm9tIG9yaWdpbmFsIHdlYmxvZ2ljIGphcgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSB3bEphci5nZXRJbnB1dFN0cmVhbShqZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0ucHV0TmV4dEVudHJ5KG5ldyBKYXJFbnRyeShqZS5nZXROYW1lKCkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBpcy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coIldlYmxvZ2ljIEphciByZWJ1aWxkIG5lZWRlZCBkdWUgdG8gY2hhbmdlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaW50ZXJmYWNlIG9yIFhNTCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVidWlsZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgU3RyaW5nIGNuZm1zZyA9ICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgZWpiLWphciBmaWxlIgorICAgICAgICAgICAgICAgICArICIuIERldGFpbHM6ICIKKyAgICAgICAgICAgICAgICAgKyBjbmZlLmdldE1lc3NhZ2UoKTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNuZm1zZywgY25mZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJT0V4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIGVqYi1qYXIgZmlsZSAiCisgICAgICAgICAgICAgICAgICsgIi4gRGV0YWlsczogIgorICAgICAgICAgICAgICAgICArIGlvZS5nZXRNZXNzYWdlKCk7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGNsb3NlIGZpbGVzIGFuZCBwZXJoYXBzIHJlbmFtZSBvdXRwdXQKKyAgICAgICAgICAgIGlmIChnZW5lcmljSmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmljSmFyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gY2xvc2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3bEphciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd2xKYXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBjbG9zZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5ld0phclN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gY2xvc2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlbmFtZShuZXdXTEphckZpbGUsIHdlYmxvZ2ljSmFyRmlsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gcmVuYW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhyZW5hbWVFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgcmVidWlsZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdlbmVyaWNMb2FkZXIgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGdlbmVyaWNMb2FkZXIgaW5zdGFuY2VvZiBBbnRDbGFzc0xvYWRlcikgeworICAgICAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGxvYWRlciA9IChBbnRDbGFzc0xvYWRlcikgZ2VuZXJpY0xvYWRlcjsKKyAgICAgICAgICAgICAgICBsb2FkZXIuY2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlYnVpbGQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIGludm9rZWQgYnkgaXNSZWJ1aWxkUmVxdWlyZWQgdG8gZ2V0IGEgQ2xhc3NMb2FkZXIgZm9yIGEKKyAgICAgKiBKYXIgRmlsZSBwYXNzZWQgdG8gaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NqYXIgamF2YS5pby5GaWxlIHJlcHJlc2VudGluZyBqYXIgZmlsZSB0byBnZXQgY2xhc3NlcyBmcm9tLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzbG9hZGVyIGZvciB0aGUgamFyZmlsZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXJGcm9tSmFyKEZpbGUgY2xhc3NqYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggbG9va3VwUGF0aCA9IG5ldyBQYXRoKGdldFRhc2soKS5nZXRQcm9qZWN0KCkpOworCisgICAgICAgIGxvb2t1cFBhdGguc2V0TG9jYXRpb24oY2xhc3NqYXIpOworCisgICAgICAgIFBhdGggY2xhc3NwYXRoID0gZ2V0Q29tYmluZWRDbGFzc3BhdGgoKTsKKworICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvb2t1cFBhdGguYXBwZW5kKGNsYXNzcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ2V0VGFzaygpLmdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihsb29rdXBQYXRoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2wuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY1RPUExpbmtEZXBsb3ltZW50VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTY5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2wuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogRGVwbG95bWVudCB0b29sIGZvciBXZWJsb2dpYyBUT1BMaW5rLgorICovCitwdWJsaWMgY2xhc3MgV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2wgZXh0ZW5kcyBXZWJsb2dpY0RlcGxveW1lbnRUb29sIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUTF9EVERfTE9DCisgICAgICAgID0gImh0dHA6Ly93d3cub2JqZWN0cGVvcGxlLmNvbS90bHdsL2R0ZC90b3BsaW5rLWNtcF8yXzVfMS5kdGQiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9wbGlua0Rlc2NyaXB0b3I7CisgICAgcHJpdmF0ZSBTdHJpbmcgdG9wbGlua0RURDsKKworICAgIC8qKgorICAgICAqIFNldHRlciB1c2VkIHRvIHN0b3JlIHRoZSBuYW1lIG9mIHRoZSB0b3BsaW5rIGRlc2NyaXB0b3IuCisgICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBkZXNjcmlwdG9yIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG9wbGlua2Rlc2NyaXB0b3IoU3RyaW5nIGluU3RyaW5nKSB7CisgICAgICAgIHRoaXMudG9wbGlua0Rlc2NyaXB0b3IgPSBpblN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXR0ZXIgdXNlZCB0byBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlIHRvcGxpbmsgRFREIGZpbGUuCisgICAgICogVGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBVUkwgKGZpbGUgb3Igb3RoZXJ3aXNlKS4gSWYgcnVubmluZworICAgICAqIHRoaXMgb24gTlQgdXNpbmcgYSBmaWxlIFVSTCwgdGhlIHNhZmVzdCB0aGluZyB3b3VsZCBiZSB0byBub3QgdXNlIGEKKyAgICAgKiBkcml2ZSBzcGVjIGluIHRoZSBVUkwgYW5kIG1ha2Ugc3VyZSB0aGUgZmlsZSByZXNpZGVzIG9uIHRoZSBkcml2ZSB0aGF0CisgICAgICogQU5UIGlzIHJ1bm5pbmcgZnJvbS4gIFRoaXMgd2lsbCBrZWVwIHRoZSBzZXR0aW5nIGluIHRoZSBidWlsZCBYTUwKKyAgICAgKiBwbGF0Zm9ybSBpbmRlcGVuZGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgRFREIGxvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvcGxpbmtkdGQoU3RyaW5nIGluU3RyaW5nKSB7CisgICAgICAgIHRoaXMudG9wbGlua0RURCA9IGluU3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVzY3JpcHRvciBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBzcmNEaXIgdGhlIHNvdXJjZSBmaWxlLgorICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvckhhbmRsZXIgZ2V0RGVzY3JpcHRvckhhbmRsZXIoRmlsZSBzcmNEaXIpIHsKKyAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA9IHN1cGVyLmdldERlc2NyaXB0b3JIYW5kbGVyKHNyY0Rpcik7CisgICAgICAgIGlmICh0b3BsaW5rRFREICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoIi0vL1RoZSBPYmplY3QgUGVvcGxlLCBJbmMuLy8iCisgICAgICAgICAgICAgICAgKyAiRFREIFRPUExpbmsgZm9yIFdlYkxvZ2ljIENNUCAyLjUuMS8vRU4iLCB0b3BsaW5rRFREKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoIi0vL1RoZSBPYmplY3QgUGVvcGxlLCBJbmMuLy8iCisgICAgICAgICAgICAgICAgKyAiRFREIFRPUExpbmsgZm9yIFdlYkxvZ2ljIENNUCAyLjUuMS8vRU4iLCBUTF9EVERfTE9DKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW55IHZlbmRvciBzcGVjaWZpYyBmaWxlcyB3aGljaCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlCisgICAgICogRUpCIEphci4KKyAgICAgKiBAcGFyYW0gZWpiRmlsZXMgdGhlIGhhc2h0YWJsZSB0byBhZGQgZmlsZXMgdG8uCisgICAgICogQHBhcmFtIGRkUHJlZml4IHRoZSBwcmVmaXggdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7CisgICAgICAgIHN1cGVyLmFkZFZlbmRvckZpbGVzKGVqYkZpbGVzLCBkZFByZWZpeCk7CisgICAgICAgIC8vIFRoZW4gdGhlIHRvcGxpbmsgZGVwbG95bWVudCBkZXNjcmlwdG9yCisKKyAgICAgICAgLy8gU2V0dXAgYSBuYW1pbmcgc3RhbmRhcmQgaGVyZT8uCisKKworICAgICAgICBGaWxlIHRvcGxpbmtERCA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsIGRkUHJlZml4ICsgdG9wbGlua0Rlc2NyaXB0b3IpOworCisgICAgICAgIGlmICh0b3BsaW5rREQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGVqYkZpbGVzLnB1dChNRVRBX0RJUiArIHRvcGxpbmtEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvcGxpbmtERCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgdG9wbGluayBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICIKKyAgICAgICAgICAgICAgICArICJJdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW4gIgorICAgICAgICAgICAgICAgICsgdG9wbGlua0RELmdldFBhdGgoKSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgdG9vbCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBjb25maWd1cmVkLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDb25maWd1cmVkKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudmFsaWRhdGVDb25maWd1cmVkKCk7CisgICAgICAgIGlmICh0b3BsaW5rRGVzY3JpcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSB0b3BsaW5rZGVzY3JpcHRvciBhdHRyaWJ1dGUgbXVzdCAiCisgICAgICAgICAgICAgICAgKyAiYmUgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvV2Vic3BoZXJlRGVwbG95bWVudFRvb2wuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJzcGhlcmVEZXBsb3ltZW50VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjE3MTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvV2Vic3BoZXJlRGVwbG95bWVudFRvb2wuamF2YQpAQCAtMCwwICsxLDg5MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogV2Vic3BoZXJlIGRlcGxveW1lbnQgdG9vbCB0aGF0IGF1Z21lbnRzIHRoZSBlamJqYXIgdGFzay4KKyAqIFNlYXJjaGVzIGZvciB0aGUgd2Vic3BoZXJlIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYW5kCisgKiBhZGRzIHRoZW0gdG8gdGhlIGZpbmFsIGVqYiBqYXIgZmlsZS4gV2Vic3BoZXJlIGhhcyB0d28gc3BlY2lmaWMgZGVzY3JpcHRvcnMgZm9yIHNlc3Npb24KKyAqIGJlYW5zOgorICogPHVsPgorICogICAgPGxpPmlibS1lamItamFyLWJuZC54bWk8L2xpPgorICogICAgPGxpPmlibS1lamItamFyLWV4dC54bWk8L2xpPgorICogPC91bD4KKyAqIGFuZCBhbm90aGVyIHR3byBmb3IgY29udGFpbmVyIG1hbmFnZWQgZW50aXR5IGJlYW5zOgorICogPHVsPgorICogICAgPGxpPk1hcC5tYXB4bWk8L2xpPgorICogICAgPGxpPlNjaGVtYS5kYnhtaTwvbGk+CisgKiA8L3VsPgorICogSW4gdGVybXMgb2YgV2ViU3BoZXJlLCB0aGUgZ2VuZXJhdGlvbiBvZiBjb250YWluZXIgY29kZSBhbmQgc3R1YnMgaXMKKyAqIGNhbGxlZCA8Y29kZT5kZXBsb3ltZW50PC9jb2RlPi4gVGhpcyBzdGVwIGNhbiBiZSBwZXJmb3JtZWQgYnkgdGhlIHdlYnNwaGVyZQorICogZWxlbWVudCBhcyBwYXJ0IG9mIHRoZSBqYXIgZ2VuZXJhdGlvbiBwcm9jZXNzLiBJZiB0aGUgc3dpdGNoCisgKiA8Y29kZT5lamJkZXBsb3k8L2NvZGU+IGlzIG9uLCB0aGUgZWpiZGVwbG95IHRvb2wgZnJvbSB0aGUgd2Vic3BoZXJlIHRvb2xzZXQKKyAqIGlzIGNhbGxlZCBmb3IgZXZlcnkgZWpiLWphci4gVW5mb3J0dW5hdGVseSwgdGhpcyBzdGVwIG9ubHkgd29ya3MsIGlmIHlvdQorICogdXNlIHRoZSBpYm0gamRrLiBPdGhlcndpc2UsIHRoZSBybWljIChjYWxsZWQgYnkgZWpiZGVwbG95KSB0aHJvd3MgYQorICogQ2xhc3NGb3JtYXRFcnJvci4gQmUgc3VyZSB0byBzd2l0Y2ggZWpiZGVwbG95IG9mZiwgaWYgcnVuIGFudCB3aXRoCisgKiBzdW4gamRrLgorICoKKyAqLworcHVibGljIGNsYXNzIFdlYnNwaGVyZURlcGxveW1lbnRUb29sIGV4dGVuZHMgR2VuZXJpY0RlcGxveW1lbnRUb29sIHsKKworICAgIC8qKiBJRCBmb3IgZWpiIDEuMSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0lEX0VKQjExCisgICAgICAgICA9ICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiI7CisgICAgLyoqIElEIGZvciBlamIgMi4wICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDSURfRUpCMjAKKyAgICAgICAgID0gIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIjsKKyAgICAvKiogU2NoZW1hIGRpcmVjdG9yeSAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9ESVIgPSAiU2NoZW1hLyI7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXQVNfRVhUID0gImlibS1lamItamFyLWV4dC54bWkiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdBU19CTkQgPSAiaWJtLWVqYi1qYXItYm5kLnhtaSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FTX0NNUF9NQVAgPSAiTWFwLm1hcHhtaSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FTX0NNUF9TQ0hFTUEgPSAiU2NoZW1hLmRieG1pIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBzdWZmaXggZm9yIHRoZSB3ZWJzcGhlcmUgamFyZmlsZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBqYXJTdWZmaXggPSAiLmphciI7CisKKyAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBlamIgMS4xIERURCBmaWxlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIGVqYjExRFREOworCisgICAgLyoqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGdlbmVyaWMgZWpiIGphcnMgYXJlIGtlcHQuICovCisKKyAgICBwcml2YXRlIGJvb2xlYW4ga2VlcEdlbmVyaWMgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBhbHdheXNSZWJ1aWxkID0gdHJ1ZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBlamJkZXBsb3kgPSB0cnVlOworCisgICAgLyoqIEluZGljYXRlcyBpZiB0aGUgb2xkIENNUCBsb2NhdGlvbiBjb252ZW50aW9uIGlzIHRvIGJlIHVzZWQuICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5ld0NNUCA9IGZhbHNlOworCisgICAgLyoqIFRoZSBjbGFzc3BhdGggdG8gdGhlIHdlYnNwaGVyZSBjbGFzc2VzLiAqLworICAgIHByaXZhdGUgUGF0aCB3YXNDbGFzc3BhdGggPSBudWxsOworCisgICAgLyoqIFRoZSBEQiBWZW5kb3IgbmFtZSwgdGhlIEVKQiBpcyBwZXJzaXN0ZWQgYWdhaW5zdCAqLworICAgIHByaXZhdGUgU3RyaW5nIGRiVmVuZG9yOworCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSB0byBjcmVhdGUuIChGb3IgdG9wLWRvd24gbWFwcGluZyBvbmx5KSAqLworICAgIHByaXZhdGUgU3RyaW5nIGRiTmFtZTsKKworICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgc2NoZW1hIHRvIGNyZWF0ZS4gKEZvciB0b3AtZG93biBtYXBwaW5ncyBvbmx5KSAqLworICAgIHByaXZhdGUgU3RyaW5nIGRiU2NoZW1hOworCisgICAgLyoqIHRydWUgLSBPbmx5IGdlbmVyYXRlIHRoZSBkZXBsb3ltZW50IGNvZGUsIGRvIG5vdCBydW4gUk1JQyBvciBKYXZhYyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb2RlZ2VuOworCisgICAgLyoqIHRydWUgLSBPbmx5IG91dHB1dCBlcnJvciBtZXNzYWdlcywgc3VwcHJlc3MgaW5mb3JtYXRpb25hbCBtZXNzYWdlcyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBxdWlldCA9IHRydWU7CisKKyAgICAvKiogdHJ1ZSAtIERpc2FibGUgdGhlIHZhbGlkYXRpb24gc3RlcHMgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbm92YWxpZGF0ZTsKKworICAgIC8qKiB0cnVlIC0gRGlzYWJsZSB3YXJuaW5nIGFuZCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5vd2FybjsKKworICAgIC8qKiB0cnVlIC0gRGlzYWJsZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5vaW5mb3JtOworCisgICAgLyoqIHRydWUgLSBFbmFibGUgaW50ZXJuYWwgdHJhY2luZyAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0cmFjZTsKKworICAgIC8qKiBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIFJNSUMgKi8KKyAgICBwcml2YXRlIFN0cmluZyBybWljT3B0aW9uczsKKworICAgIC8qKiB0cnVlLSBVc2UgdGhlIFdlYlNwaGVyZSAzLjUgY29tcGF0aWJsZSBtYXBwaW5nIHJ1bGVzICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVzZTM1TWFwcGluZ1J1bGVzOworCisgICAgLyoqIHRoZSBzY3JhdGNoZGlyIGZvciB0aGUgZWpiZGVwbG95IG9wZXJhdGlvbiAqLworICAgIHByaXZhdGUgU3RyaW5nIHRlbXBkaXIgPSAiX2VqYmRlcGxveV90ZW1wIjsKKworICAgIC8qKiB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHdlYnNwaGVyZSAqLworICAgIHByaXZhdGUgRmlsZSB3ZWJzcGhlcmVIb21lOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGFzc3BhdGggdG8gdGhlIHdlYnNwaGVyZSBjbGFzc3BhdGhzLgorICAgICAqIEByZXR1cm4gdGhlIHdlYnNwaGVyZSBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlV0FTQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAod2FzQ2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHdhc0NsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFRhc2soKS5nZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3YXNDbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3ZWJzcGhlcmUgY2xhc3NwYXRoLgorICAgICAqIEBwYXJhbSB3YXNDbGFzc3BhdGggdGhlIHdlYnNwaGVyZSBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V0FTQ2xhc3NwYXRoKFBhdGggd2FzQ2xhc3NwYXRoKSB7CisgICAgICAgIHRoaXMud2FzQ2xhc3NwYXRoID0gd2FzQ2xhc3NwYXRoOworICAgIH0KKworCisgICAgLyoqIFNldHMgdGhlIERCIFZlbmRvciBmb3IgdGhlIEVudGl0eSBCZWFuIG1hcHBpbmcgOyBvcHRpb25hbC4KKyAgICAgKiA8cD4KKyAgICAgKiBWYWxpZCBvcHRpb25zIGNhbiBiZSBvYnRhaW5lZCBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyAgICAgKiA8Y29kZT4KKyAgICAgKiAmbHQ7V0FTX0hPTUUmZ3Q7L2Jpbi9FSkJEZXBsb3kuW3NoL2JhdF0gLWhlbHAKKyAgICAgKiA8L2NvZGU+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgYWxzbyB1c2VkIHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgTWFwLm1hcHhtaSBhbmQKKyAgICAgKiBTY2hlbWEuZGJ4bWkgZmlsZXMsIGZvciBleGFtcGxlIEFjY291bnQtREIyVURCX1Y4MS1NYXAubWFweG1pCisgICAgICogYW5kIEFjY291bnQtREIyVURCX1Y4MS1TY2hlbWEuZGJ4bWkuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRidmVuZG9yIGRhdGFiYXNlIHZlbmRvciB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGJ2ZW5kb3IoU3RyaW5nIGRidmVuZG9yKSB7CisgICAgICAgIHRoaXMuZGJWZW5kb3IgPSBkYnZlbmRvcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIERhdGFiYXNlIHRvIGNyZWF0ZTsgb3B0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGJOYW1lIG5hbWUgb2YgdGhlIGRhdGFiYXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGJuYW1lKFN0cmluZyBkYk5hbWUpIHsKKyAgICAgICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBzY2hlbWEgdG8gY3JlYXRlOyBvcHRpb25hbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYlNjaGVtYSBuYW1lIG9mIHRoZSBzY2hlbWEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYnNjaGVtYShTdHJpbmcgZGJTY2hlbWEpIHsKKyAgICAgICAgdGhpcy5kYlNjaGVtYSA9IGRiU2NoZW1hOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmxhZywgZGVmYXVsdCBmYWxzZSwgdG8gb25seSBnZW5lcmF0ZSB0aGUgZGVwbG95bWVudAorICAgICAqIGNvZGUsIGRvIG5vdCBydW4gUk1JQyBvciBKYXZhYworICAgICAqCisgICAgICogQHBhcmFtIGNvZGVnZW4gb3B0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29kZWdlbihib29sZWFuIGNvZGVnZW4pIHsKKyAgICAgICAgdGhpcy5jb2RlZ2VuID0gY29kZWdlbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZsYWcsIGRlZmF1bHQgdHJ1ZSwgdG8gb25seSBvdXRwdXQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVpZXQgb3B0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVpZXQoYm9vbGVhbiBxdWlldCkgeworICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGRpc2FibGUgdGhlIHZhbGlkYXRpb24gc3RlcHM7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5vdmFsaWRhdGUgb3B0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm92YWxpZGF0ZShib29sZWFuIG5vdmFsaWRhdGUpIHsKKyAgICAgICAgdGhpcy5ub3ZhbGlkYXRlID0gbm92YWxpZGF0ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gZGlzYWJsZSB3YXJuaW5nIGFuZCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub3dhcm4gb3B0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm93YXJuKGJvb2xlYW4gbm93YXJuKSB7CisgICAgICAgIHRoaXMubm93YXJuID0gbm93YXJuOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmxhZyB0byBkaXNhYmxlIGluZm9ybWF0aW9uYWwgbWVzc2FnZXM7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5vaW5mb3JtIGlmIHRydWUgZGlzYWJsZXMgaW5mb3JtYXRpb25hbCBtZXNzYWdlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vaW5mb3JtKGJvb2xlYW4gbm9pbmZvcm0pIHsKKyAgICAgICAgdGhpcy5ub2luZm9ybSA9IG5vaW5mb3JtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmxhZyB0byBlbmFibGUgaW50ZXJuYWwgdHJhY2luZyB3aGVuIHNldCwgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhY2UgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YXVsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFjZShib29sZWFuIHRyYWNlKSB7CisgICAgICAgIHRoaXMudHJhY2UgPSB0cmFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJtaWMgb3B0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSbWljb3B0aW9ucyhTdHJpbmcgb3B0aW9ucykgeworICAgICAgICB0aGlzLnJtaWNPcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIHVzZSB0aGUgV2ViU3BoZXJlIDMuNSBjb21wYXRpYmxlIG1hcHBpbmcgcnVsZXMgOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlMzUoYm9vbGVhbiBhdHRyKSB7CisgICAgICAgIHVzZTM1TWFwcGluZ1J1bGVzID0gYXR0cjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVidWlsZCBmbGFnIHRvIGZhbHNlIHRvIG9ubHkgdXBkYXRlIGNoYW5nZXMgaW4gdGhlIGphciByYXRoZXIKKyAgICAgKiB0aGFuIHJlcnVubmluZyBlamJkZXBsb3k7IG9wdGlvbmFsLCBkZWZhdWx0IHRydWUuCisgICAgICogQHBhcmFtIHJlYnVpbGQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWJ1aWxkKGJvb2xlYW4gcmVidWlsZCkgeworICAgICAgICB0aGlzLmFsd2F5c1JlYnVpbGQgPSByZWJ1aWxkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGVwbG95bWVudAorICAgICAqIGRlc2NyaXB0b3IgdG8gY3JlYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgV2ViTG9naWMgRUpCCisgICAgICogamFyIGZpbGUuIE9wdGlvbmFsLCBkZWZhdWx0ICcuamFyJy4KKyAgICAgKiBAcGFyYW0gaW5TdHJpbmcgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHN1ZmZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWZmaXgoU3RyaW5nIGluU3RyaW5nKSB7CisgICAgICAgIHRoaXMuamFyU3VmZml4ID0gaW5TdHJpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGdlbmVyaWMgZmlsZSB1c2VkIGFzIGlucHV0IHRvCisgICAgICogZWpiZGVwbG95IGlzIHJldGFpbmVkOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KKyAgICAgKiBAcGFyYW0gaW5WYWx1ZSBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2VlcGdlbmVyaWMoYm9vbGVhbiBpblZhbHVlKSB7CisgICAgICAgIHRoaXMua2VlcEdlbmVyaWMgPSBpblZhbHVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVjaWRlLCB3ZXRoZXIgZWpiZGVwbG95IHNob3VsZCBiZSBjYWxsZWQgb3Igbm90OworICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0IHRydWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWpiZGVwbG95IGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWpiZGVwbG95KGJvb2xlYW4gZWpiZGVwbG95KSB7CisgICAgICAgIHRoaXMuZWpiZGVwbG95ID0gZWpiZGVwbG95OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0dGVyIHVzZWQgdG8gc3RvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBTdW4ncyBHZW5lcmljIEVKQiBEVEQuIFRoaXMKKyAgICAgKiBjYW4gYmUgYSBmaWxlIG9uIHRoZSBzeXN0ZW0gb3IgYSByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBEVEQgbG9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RUpCZHRkKFN0cmluZyBpblN0cmluZykgeworICAgICAgICB0aGlzLmVqYjExRFREID0gaW5TdHJpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBvbGRDTVAgc2NoZW1lLiBUaGlzIGlzIGFuIGFudG9ueW0gZm9yIG5ld0NNUAorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKiBAcGFyYW0gb2xkQ01QIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2xkQ01QKGJvb2xlYW4gb2xkQ01QKSB7CisgICAgICAgIHRoaXMubmV3Q01QID0gIW9sZENNUDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIG5ld0NNUCBzY2hlbWUuIFRoZSBvbGQgQ01QIHNjaGVtZSBsb2NhdGVzIHRoZQorICAgICAqIHdlYnNwaGVyZSBDTVAgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24gd2hlcmUgdGhlCisgICAgICogd2Vic3BoZXJlIENNUCBmaWxlIGlzIGV4cGVjdGVkIHRvIGJlIG5hbWVkIHdpdGggdGhlIGJlYW4gbmFtZSBhcyB0aGUKKyAgICAgKiBwcmVmaXguIFVuZGVyIHRoaXMgc2NoZW1lIHRoZSBuYW1lIG9mIHRoZSBDTVAgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaAorICAgICAqIHRoZSBuYW1lIGFjdHVhbGx5IHVzZWQgaW4gdGhlIG1haW4gd2Vic3BoZXJlIEVKQiBkZXNjcmlwdG9yLiBBbHNvLAorICAgICAqIGRlc2NyaXB0b3JzIHdoaWNoIGNvbnRhaW4gbXVsdGlwbGUgQ01QIHJlZmVyZW5jZXMgY291bGQgbm90IGJlIHVzZWQuCisgICAgICogQHBhcmFtIG5ld0NNUCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5ld0NNUChib29sZWFuIG5ld0NNUCkgeworICAgICAgICB0aGlzLm5ld0NNUCA9IG5ld0NNUDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnksIHdoZXJlIGVqYmRlcGxveSB3aWxsIHdyaXRlIHRlbXBvcmFyeSBmaWxlczsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdHMgdG8gJ19lamJkZXBsb3lfdGVtcCcuCisgICAgICogQHBhcmFtIHRlbXBkaXIgdGhlIGRpcmVjdG9yeSBuYW1lIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUZW1wZGlyKFN0cmluZyB0ZW1wZGlyKSB7CisgICAgICAgIHRoaXMudGVtcGRpciA9IHRlbXBkaXI7CisgICAgfQorCisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvckhhbmRsZXIgZ2V0RGVzY3JpcHRvckhhbmRsZXIoRmlsZSBzcmNEaXIpIHsKKyAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA9IG5ldyBEZXNjcmlwdG9ySGFuZGxlcihnZXRUYXNrKCksIHNyY0Rpcik7CisgICAgICAgIC8vIHJlZ2lzdGVyIGFsbCB0aGUgRFREcywgYm90aCB0aGUgb25lcyB0aGF0IGFyZSBrbm93biBhbmQKKyAgICAgICAgLy8gYW55IHN1cHBsaWVkIGJ5IHRoZSB1c2VyCisgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfRUpCMTEsIGVqYjExRFREKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDb25maWcoKS5kdGRMb2NhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBFamJKYXIuRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPSAoRWpiSmFyLkRURExvY2F0aW9uKSBpLm5leHQoKTsKKworICAgICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChkdGRMb2NhdGlvbi5nZXRQdWJsaWNJZCgpLCBkdGRMb2NhdGlvbi5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoYW5kbGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGEgZGVzY3JpcHRpb24gaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gc3JjRGlyIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4gdGhlIGhhbmRsZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIERlc2NyaXB0b3JIYW5kbGVyIGdldFdlYnNwaGVyZURlc2NyaXB0b3JIYW5kbGVyKGZpbmFsIEZpbGUgc3JjRGlyKSB7CisgICAgICAgIERlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXIgPQorICAgICAgICAgICAgbmV3IERlc2NyaXB0b3JIYW5kbGVyKGdldFRhc2soKSwgc3JjRGlyKSB7CisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDb25maWcoKS5kdGRMb2NhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBFamJKYXIuRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPSAoRWpiSmFyLkRURExvY2F0aW9uKSBpLm5leHQoKTsKKworICAgICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChkdGRMb2NhdGlvbi5nZXRQdWJsaWNJZCgpLCBkdGRMb2NhdGlvbi5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhbnkgdmVuZG9yIHNwZWNpZmljIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgRUpCIEphci4KKyAgICAgKiBAcGFyYW0gZWpiRmlsZXMgYSBoYXNodGFibGUgZW50cnluYW1lIC0+IGZpbGUuCisgICAgICogQHBhcmFtIGJhc2VOYW1lIGEgcHJlZml4IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGUgZWpiRmlsZXMsIFN0cmluZyBiYXNlTmFtZSkgeworCisgICAgICAgIFN0cmluZyBkZFByZWZpeCA9ICh1c2luZ0Jhc2VKYXJOYW1lKCkgPyAiIiA6IGJhc2VOYW1lKTsKKyAgICAgICAgU3RyaW5nIGRiUHJlZml4ID0gKGRiVmVuZG9yID09IG51bGwpID8gIiIgOiBkYlZlbmRvciArICItIjsKKworICAgICAgICAvLyBHZXQgdGhlIEV4dGVuc2lvbnMgZG9jdW1lbnQKKyAgICAgICAgRmlsZSB3ZWJzcGhlcmVFWFQgPSBuZXcgRmlsZShnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyLCBkZFByZWZpeCArIFdBU19FWFQpOworCisgICAgICAgIGlmICh3ZWJzcGhlcmVFWFQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGVqYkZpbGVzLnB1dChNRVRBX0RJUiArIFdBU19FWFQsCisgICAgICAgICAgICAgICAgd2Vic3BoZXJlRVhUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvY2F0ZSB3ZWJzcGhlcmUgZXh0ZW5zaW9ucy4gIgorICAgICAgICAgICAgICAgICsgIkl0IHdhcyBleHBlY3RlZCB0byBiZSBpbiAiCisgICAgICAgICAgICAgICAgKyB3ZWJzcGhlcmVFWFQuZ2V0UGF0aCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgd2Vic3BoZXJlQk5EID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwgZGRQcmVmaXggKyBXQVNfQk5EKTsKKworICAgICAgICBpZiAod2Vic3BoZXJlQk5ELmV4aXN0cygpKSB7CisgICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBXQVNfQk5ELAorICAgICAgICAgICAgICAgIHdlYnNwaGVyZUJORCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgd2Vic3BoZXJlIGJpbmRpbmdzLiAiCisgICAgICAgICAgICAgICAgKyAiSXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluICIKKyAgICAgICAgICAgICAgICArIHdlYnNwaGVyZUJORC5nZXRQYXRoKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFuZXdDTVApIHsKKyAgICAgICAgICAgIGxvZygiVGhlIG9sZCBtZXRob2QgZm9yIGxvY2F0aW5nIENNUCBmaWxlcyBoYXMgYmVlbiBERVBSRUNBVEVELiIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBsb2coIlBsZWFzZSBhZGp1c3QgeW91ciB3ZWJzcGhlcmUgZGVzY3JpcHRvciBhbmQgc2V0ICIKKyAgICAgICAgICAgICAgICArICJuZXdDTVA9XCJ0cnVlXCIgdG8gdXNlIHRoZSBuZXcgQ01QIGRlc2NyaXB0b3IgIgorICAgICAgICAgICAgICAgICsgImluY2x1c2lvbiBtZWNoYW5pc20uICIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgYXR0ZW1wdCB0byBwdXQgaW4gdGhlIE1BUCBhbmQgU2NoZW1hIGZpbGVzIG9mIENNUCBiZWFucworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIE1hcCBmaWxlCisgICAgICAgICAgICAgICAgRmlsZSB3ZWJzcGhlcmVNQVAgPSBuZXcgRmlsZShnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyLAorICAgICAgICAgICAgICAgICAgICBkZFByZWZpeCArIGRiUHJlZml4ICsgV0FTX0NNUF9NQVApOworCisgICAgICAgICAgICAgICAgaWYgKHdlYnNwaGVyZU1BUC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBXQVNfQ01QX01BUCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYnNwaGVyZU1BUCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9jYXRlIHRoZSB3ZWJzcGhlcmUgTWFwOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHdlYnNwaGVyZU1BUC5nZXRQYXRoKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEZpbGUgd2Vic3BoZXJlU2NoZW1hID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwKKyAgICAgICAgICAgICAgICAgICAgZGRQcmVmaXggKyBkYlByZWZpeCArIFdBU19DTVBfU0NIRU1BKTsKKworICAgICAgICAgICAgICAgIGlmICh3ZWJzcGhlcmVTY2hlbWEuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgU0NIRU1BX0RJUiArIFdBU19DTVBfU0NIRU1BLAorICAgICAgICAgICAgICAgICAgICAgICAgd2Vic3BoZXJlU2NoZW1hKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgdGhlIHdlYnNwaGVyZSBTY2hlbWE6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgd2Vic3BoZXJlU2NoZW1hLmdldFBhdGgoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRoZXJlcyBub3RoaW5nIGVsc2UgdG8gc2VlIGhlcmUuLi5rZWVwIG1vdmluZyBzb25ueQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgVmVuZG9yIHNwZWNpZmljIGZpbGVzOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVuZG9yIHNwZWNpZmljIG5hbWUgb2YgdGhlIEphciB0aGF0IHdpbGwgYmUgb3V0cHV0LiBUaGUKKyAgICAgKiBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGphciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgZGVwZW5kZW50CisgICAgICogYmVhbiBjbGFzc2VzLgorICAgICAqLworICAgIEZpbGUgZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShTdHJpbmcgYmFzZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldERlc3REaXIoKSwgYmFzZU5hbWUgKyBqYXJTdWZmaXgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgb3B0aW9ucyBmb3IgdGhlIEVKQiBEZXBsb3kgb3BlcmF0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3B0aW9ucygpIHsKKyAgICAgICAgLy8gU2V0IHRoZSBvcHRpb25zCisgICAgICAgIFN0cmluZ0J1ZmZlciBvcHRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGlmIChkYlZlbmRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiIC1kYnZlbmRvciAiKS5hcHBlbmQoZGJWZW5kb3IpOworICAgICAgICB9CisgICAgICAgIGlmIChkYk5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIiAtZGJuYW1lIFwiIikuYXBwZW5kKGRiTmFtZSkuYXBwZW5kKCJcIiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRiU2NoZW1hICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCIgLWRic2NoZW1hIFwiIikuYXBwZW5kKGRiU2NoZW1hKS5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kZWdlbikgeworICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIiAtY29kZWdlbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHF1aWV0KSB7CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiIC1xdWlldCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5vdmFsaWRhdGUpIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCIgLW5vdmFsaWRhdGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChub3dhcm4pIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCIgLW5vd2FybiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5vaW5mb3JtKSB7CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiIC1ub2luZm9ybSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYWNlKSB7CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiIC10cmFjZSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZTM1TWFwcGluZ1J1bGVzKSB7CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiIC0zNSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJtaWNPcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCIgLXJtaWMgXCIiKS5hcHBlbmQocm1pY09wdGlvbnMpLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvcHRpb25zLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIGludm9rZWQgYnkgZXhlY3V0ZSgpIGZvciBlYWNoIHdlYnNwaGVyZSBqYXIgdG8gYmUgYnVpbHQuCisgICAgICogRW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBvZiBjb25zdHJ1Y3RpbmcgYSBqYXZhIHRhc2sgZm9yIGNhbGxpbmcKKyAgICAgKiB3ZWJzcGhlcmUuZWpiZGVwbG95IGFuZCBleGVjdXRpbmcgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlSmFyIGphdmEuaW8uRmlsZSByZXByZXNlbnRpbmcgdGhlIHNvdXJjZSAoRUpCMS4xKSBqYXJmaWxlLgorICAgICAqIEBwYXJhbSBkZXN0SmFyIGphdmEuaW8uRmlsZSByZXByZXNlbnRpbmcgdGhlIGRlc3RpbmF0aW9uLCB3ZWJzcGhlcmUKKyAgICAgKiAgICAgIGphcmZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkV2Vic3BoZXJlSmFyKEZpbGUgc291cmNlSmFyLCBGaWxlIGRlc3RKYXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChlamJkZXBsb3kpIHsKKyAgICAgICAgICAgICAgICBKYXZhIGphdmFUYXNrID0gbmV3IEphdmEoZ2V0VGFzaygpKTsKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIEp2bUFyZ3MKKyAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVKdm1hcmcoKS5zZXRWYWx1ZSgiLVhtczY0bSIpOworICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKCItWG14MTI4bSIpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBFbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICAgICAgICAgIEVudmlyb25tZW50LlZhcmlhYmxlIHZhciA9IG5ldyBFbnZpcm9ubWVudC5WYXJpYWJsZSgpOworCisgICAgICAgICAgICAgICAgdmFyLnNldEtleSgid2Vic3BoZXJlLmxpYi5kaXIiKTsKKyAgICAgICAgICAgICAgICBGaWxlIGxpYmRpciA9IG5ldyBGaWxlKHdlYnNwaGVyZUhvbWUsICJsaWIiKTsKKyAgICAgICAgICAgICAgICB2YXIuc2V0VmFsdWUobGliZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICBqYXZhVGFzay5hZGRTeXNwcm9wZXJ0eSh2YXIpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIGphdmFUYXNrLnNldERpcih3ZWJzcGhlcmVIb21lKTsKKworICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgSmF2YSBjbGFzcyBuYW1lCisgICAgICAgICAgICAgICAgamF2YVRhc2suc2V0VGFza05hbWUoImVqYmRlcGxveSIpOworICAgICAgICAgICAgICAgIGphdmFUYXNrLnNldENsYXNzbmFtZSgiY29tLmlibS5ldG9vbHMuZWpiZGVwbG95LkVKQkRlcGxveSIpOworCisgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoc291cmNlSmFyLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUodGVtcGRpcik7CisgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoZGVzdEphci5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldExpbmUoZ2V0T3B0aW9ucygpKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0Q29tYmluZWRDbGFzc3BhdGgoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIGdldENvbWJpbmVkQ2xhc3NwYXRoKCkudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1jcCIpOworICAgICAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZShnZXRDb21iaW5lZENsYXNzcGF0aCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFBhdGggY2xhc3NwYXRoID0gd2FzQ2xhc3NwYXRoOworCisgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aCA9IGdldENvbWJpbmVkQ2xhc3NwYXRoKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGphdmFUYXNrLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOworICAgICAgICAgICAgICAgICAgICBqYXZhVGFzay5zZXRGb3JrKHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGphdmFUYXNrLnNldEZvcmsodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbG9nKCJDYWxsaW5nIHdlYnNwaGVyZS5lamJkZXBsb3kgZm9yICIgKyBzb3VyY2VKYXIudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgICAgICAgICBqYXZhVGFzay5leGVjdXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBIYXZlIHRvIGNhdGNoIHRoaXMgYmVjYXVzZSBvZiB0aGUgc2VtYW50aWNzIG9mIGNhbGxpbmcgbWFpbigpCisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nIGVqYmRlcGxveS4gRGV0YWlsczogIiArIGUudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUphcihTdHJpbmcgYmFzZU5hbWUsIEZpbGUgamFyRmlsZSwgSGFzaHRhYmxlIGZpbGVzLCBTdHJpbmcgcHVibGljSWQpCisgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZWpiZGVwbG95KSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIC1nZW5lcmljLmphciwgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgIEZpbGUgZ2VuZXJpY0phckZpbGUgPSBzdXBlci5nZXRWZW5kb3JPdXRwdXRKYXJGaWxlKGJhc2VOYW1lKTsKKworICAgICAgICAgICAgc3VwZXIud3JpdGVKYXIoYmFzZU5hbWUsIGdlbmVyaWNKYXJGaWxlLCBmaWxlcywgcHVibGljSWQpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIG91dHB1dCAuamFyLCBpZiByZXF1aXJlZAorICAgICAgICAgICAgaWYgKGFsd2F5c1JlYnVpbGQgfHwgaXNSZWJ1aWxkUmVxdWlyZWQoZ2VuZXJpY0phckZpbGUsIGphckZpbGUpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRXZWJzcGhlcmVKYXIoZ2VuZXJpY0phckZpbGUsIGphckZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFrZWVwR2VuZXJpYykgeworICAgICAgICAgICAgICAgIGxvZygiZGVsZXRpbmcgZ2VuZXJpYyBqYXIgIiArIGdlbmVyaWNKYXJGaWxlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIGdlbmVyaWNKYXJGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSAidW5kZXBsb3llZCIgb3V0cHV0IC5qYXIsIGlmIHJlcXVpcmVkCisgICAgICAgICAgICBzdXBlci53cml0ZUphcihiYXNlTmFtZSwgamFyRmlsZSwgZmlsZXMsIHB1YmxpY0lkKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIHRvb2wgcGFyYW1ldGVycyBoYXZlIGJlZW4gY29uZmlndXJlZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJlZCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnZhbGlkYXRlQ29uZmlndXJlZCgpOworICAgICAgICBpZiAoZWpiZGVwbG95KSB7CisgICAgICAgICAgICBTdHJpbmcgaG9tZSA9IGdldFRhc2soKS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIndlYnNwaGVyZS5ob21lIik7CisgICAgICAgICAgICBpZiAoaG9tZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgJ3dlYnNwaGVyZS5ob21lJyBwcm9wZXJ0eSBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYmUgc2V0IHdoZW4gJ2VqYmRlcGxveT10cnVlJyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2Vic3BoZXJlSG9tZSA9IGdldFRhc2soKS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoaG9tZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgdG8gc2VlIGlmIGEgd2Vic3BoZXJlIEVCSjEuMSBqYXIgbmVlZHMgdG8gYmUKKyAgICAgKiByZWJ1aWx0IHVzaW5nIGVqYmRlcGxveS4gQ2FsbGVkIGZyb20gd3JpdGVKYXIgaXQgc2VlcyBpZiB0aGUgIkJlYW4iCisgICAgICogY2xhc3NlcyBhcmUgdGhlIG9ubHkgdGhpbmcgdGhhdCBuZWVkcyB0byBiZSB1cGRhdGVkIGFuZCBlaXRoZXIgdXBkYXRlcworICAgICAqIHRoZSBKYXIgd2l0aCB0aGUgQmVhbiBjbGFzc2ZpbGUgb3IgcmV0dXJucyB0cnVlLCBzYXlpbmcgdGhhdCB0aGUgd2hvbGUKKyAgICAgKiB3ZWJzcGhlcmUgamFyIG5lZWRzIHRvIGJlIHJlZ2VuZWQgd2l0aCBlamJkZXBsb3kuIFRoaXMgYWxsb3dzIGZhc3RlcgorICAgICAqIGJ1aWxkIHRpbWVzIGZvciB3b3JraW5nIGRldmVsb3BlcnMuIDxwPgorICAgICAqCisgICAgICogVGhlIHdheSB3ZWJzcGhlcmUgZWpiZGVwbG95IHdvcmtzIGlzIGl0IGNyZWF0ZXMgd3JhcHBlcnMgZm9yIHRoZQorICAgICAqIHB1YmxpY2x5IGRlZmluZWQgbWV0aG9kcyBhcyB0aGV5IGFyZSBleHBvc2VkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLgorICAgICAqIElmIHRoZSBhY3R1YWwgYmVhbiBjaGFuZ2VzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHRoZSBtZXRob2Qgc2lnbmF0dXJlcworICAgICAqIHRoZW4gb25seSB0aGUgYmVhbiBjbGFzc2ZpbGUgbmVlZHMgdG8gYmUgdXBkYXRlZCBhbmQgdGhlIHJlc3Qgb2YgdGhlCisgICAgICogd2Vic3BoZXJlIGphciBmaWxlIGNhbiByZW1haW4gdGhlIHNhbWUuIElmIHRoZSBJbnRlcmZhY2VzLCBpZS4gdGhlCisgICAgICogbWV0aG9kIHNpZ25hdHVyZXMgY2hhbmdlIG9yIGlmIHRoZSB4bWwgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBjaGFuZ2VkLAorICAgICAqIHRoZSB3aG9sZSBqYXIgbmVlZHMgdG8gYmUgcmVidWlsdCB3aXRoIGVqYmRlcGxveS4gVGhpcyBpcyBub3Qgc3RyaWN0bHkKKyAgICAgKiB0cnVlIGZvciB0aGUgeG1sIGZpbGVzLiBJZiB0aGUgSk5ESSBuYW1lIGNoYW5nZXMgdGhlbiB0aGUgamFyIGRvZXNudAorICAgICAqIGhhdmUgdG8gYmUgcmVidWlsZCwgYnV0IGlmIHRoZSByZXNvdXJjZXMgcmVmZXJlbmNlcyBjaGFuZ2UgdGhlbiBpdAorICAgICAqIGRvZXMuIEF0IHRoaXMgcG9pbnQgdGhlIHdlYnNwaGVyZSBqYXIgZ2V0cyByZWJ1aWx0IGlmIHRoZSB4bWwgZmlsZXMKKyAgICAgKiBjaGFuZ2UgYXQgYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGdlbmVyaWNKYXJGaWxlIGphdmEuaW8uRmlsZSBUaGUgZ2VuZXJpYyBqYXIgZmlsZS4KKyAgICAgKiBAcGFyYW0gd2Vic3BoZXJlSmFyRmlsZSBqYXZhLmlvLkZpbGUgVGhlIHdlYnNwaGVyZSBqYXIgZmlsZSB0byBjaGVjayB0bworICAgICAqICAgICAgc2VlIGlmIGl0IG5lZWRzIHRvIGJlIHJlYnVpbHQuCisgICAgICogQHJldHVybiB0cnVlIGlmIGEgcmVidWlsZCBpcyByZXF1aXJlZC4KKyAgICAgKi8KKyAgICAvLyBDaGVja1N0eWxlOk1ldGhvZExlbmd0aCBPRkYgLSB0aGlzIHdpbGwgbm8gYmUgZml4ZWQKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYnVpbGRSZXF1aXJlZChGaWxlIGdlbmVyaWNKYXJGaWxlLCBGaWxlIHdlYnNwaGVyZUphckZpbGUpIHsKKyAgICAgICAgYm9vbGVhbiByZWJ1aWxkID0gZmFsc2U7CisKKyAgICAgICAgSmFyRmlsZSBnZW5lcmljSmFyID0gbnVsbDsKKyAgICAgICAgSmFyRmlsZSB3YXNKYXIgPSBudWxsOworICAgICAgICBGaWxlIG5ld3dhc0phckZpbGUgPSBudWxsOworICAgICAgICBKYXJPdXRwdXRTdHJlYW0gbmV3SmFyU3RyZWFtID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nKCJDaGVja2luZyBpZiB3ZWJzcGhlcmUgSmFyIG5lZWRzIHRvIGJlIHJlYnVpbHQgZm9yIGphciAiCisgICAgICAgICAgICAgICAgKyB3ZWJzcGhlcmVKYXJGaWxlLmdldE5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAvLyBPbmx5IGdvIGZvcndhcmQgaWYgdGhlIGdlbmVyaWMgYW5kIHRoZSB3ZWJzcGhlcmUgZmlsZSBib3RoIGV4aXN0CisgICAgICAgICAgICBpZiAoZ2VuZXJpY0phckZpbGUuZXhpc3RzKCkgJiYgZ2VuZXJpY0phckZpbGUuaXNGaWxlKCkKKyAgICAgICAgICAgICAgICAgJiYgd2Vic3BoZXJlSmFyRmlsZS5leGlzdHMoKSAmJiB3ZWJzcGhlcmVKYXJGaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgLy9vcGVuIGphciBmaWxlcworICAgICAgICAgICAgICAgIGdlbmVyaWNKYXIgPSBuZXcgSmFyRmlsZShnZW5lcmljSmFyRmlsZSk7CisgICAgICAgICAgICAgICAgd2FzSmFyID0gbmV3IEphckZpbGUod2Vic3BoZXJlSmFyRmlsZSk7CisKKyAgICAgICAgICAgICAgICBIYXNodGFibGUgZ2VuZXJpY0VudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICAgICAgSGFzaHRhYmxlIHdhc0VudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICAgICAgSGFzaHRhYmxlIHJlcGxhY2VFbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGxpc3Qgb2YgZ2VuZXJpYyBqYXIgZW50cmllcworICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGdlbmVyaWNKYXIuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSBqZSA9IChKYXJFbnRyeSkgZS5uZXh0RWxlbWVudCgpOworCisgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNFbnRyaWVzLnB1dChqZS5nZXROYW1lKCkucmVwbGFjZSgnXFwnLCAnLycpLCBqZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBsaXN0IG9mIHdlYnNwaGVyZSBqYXIgZW50cmllcworICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHdhc0phci5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gKEphckVudHJ5KSBlLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgd2FzRW50cmllcy5wdXQoamUuZ2V0TmFtZSgpLCBqZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9DeWNsZSBUaHJvdWdoIGdlbmVyaWMgYW5kIG1ha2Ugc3VyZSBpdHMgaW4gd2Vic3BoZXJlCisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgZ2VuZXJpY0xvYWRlciA9IGdldENsYXNzTG9hZGVyRnJvbUphcihnZW5lcmljSmFyRmlsZSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBnZW5lcmljRW50cmllcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlcGF0aCA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAod2FzRW50cmllcy5jb250YWluc0tleShmaWxlcGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbmFtZS9wYXRoIG1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmaWxlcyBzZWUgaWYgc2FtZQorICAgICAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgZ2VuZXJpY0VudHJ5ID0gKEphckVudHJ5KSBnZW5lcmljRW50cmllcy5nZXQoZmlsZXBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgd2FzRW50cnkgPSAoSmFyRW50cnkpIHdhc0VudHJpZXMuZ2V0KGZpbGVwYXRoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnZW5lcmljRW50cnkuZ2V0Q3JjKCkgIT0gd2FzRW50cnkuZ2V0Q3JjKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGdlbmVyaWNFbnRyeS5nZXRTaXplKCkgIT0gd2FzRW50cnkuZ2V0U2l6ZSgpKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyaWNFbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlsZSBhcmUgZGlmZmVyZW50IHNlZSBpZiBpdHMgYW4gb2JqZWN0IG9yIGFuIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGdlbmVyaWNFbnRyeS5nZXROYW1lKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lLnN1YnN0cmluZygwLCBjbGFzc25hbWUubGFzdEluZGV4T2YoIi5jbGFzcyIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBnZW5jbGFzcyA9IGdlbmVyaWNMb2FkZXIubG9hZENsYXNzKGNsYXNzbmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmNsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZXJmYWNlIGNoYW5nZWQgICByZWJ1aWxkIGphci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiSW50ZXJmYWNlICIgKyBnZW5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaGFzIGNoYW5nZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL09iamVjdCBjbGFzcyBDaGFuZ2VkICAgdXBkYXRlIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUVudHJpZXMucHV0KGZpbGVwYXRoLCBnZW5lcmljRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgaXQgdGhlIG1hbmlmZXN0LiBJZiBzbyBpZ25vcmUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnZW5lcmljRW50cnkuZ2V0TmFtZSgpLmVxdWFscygiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaWxlIG90aGVyIHRoZW4gY2xhc3MgY2hhbmdlZCAgIHJlYnVpbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiTm9uIGNsYXNzIGZpbGUgIiArIGdlbmVyaWNFbnRyeS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaGFzIGNoYW5nZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZmlsZSBkb2Vzbid0IGV4aXN0IHJlYnVpbGQKKworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJGaWxlICIgKyBmaWxlcGF0aCArICIgbm90IHByZXNlbnQgaW4gd2Vic3BoZXJlIGphciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFyZWJ1aWxkKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiTm8gcmVidWlsZCBuZWVkZWQgLSB1cGRhdGluZyBqYXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3d2FzSmFyRmlsZSA9IG5ldyBGaWxlKHdlYnNwaGVyZUphckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLnRlbXAiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld3dhc0phckZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3dhc0phckZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0gPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ld3dhc0phckZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLnNldExldmVsKDApOworCisgICAgICAgICAgICAgICAgICAgIC8vQ29weSBmaWxlcyBmcm9tIG9sZCB3ZWJzcGhlcmUgamFyCisgICAgICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHdhc0VudHJpZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtERUZBVUxUX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpczsKKyAgICAgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gKEphckVudHJ5KSBlLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqZS5nZXRDb21wcmVzc2VkU2l6ZSgpID09IC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgamUuZ2V0Q29tcHJlc3NlZFNpemUoKSA9PSBqZS5nZXRTaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0uc2V0TGV2ZWwoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5zZXRMZXZlbChKQVJfQ09NUFJFU1NfTEVWRUwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgd2l0aCBjaGFuZ2VkIEJlYW4gY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlRW50cmllcy5jb250YWluc0tleShqZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJVcGRhdGluZyBCZWFuIGNsYXNzIGZyb20gZ2VuZXJpYyBKYXIgIiArIGplLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBlbnRyeSBmcm9tIHRoZSBnZW5lcmljIGphcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGplID0gKEphckVudHJ5KSByZXBsYWNlRW50cmllcy5nZXQoamUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyA9IGdlbmVyaWNKYXIuZ2V0SW5wdXRTdHJlYW0oamUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VzZSBmbGUgZnJvbSBvcmlnaW5hbCB3ZWJzcGhlcmUgamFyCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyA9IHdhc0phci5nZXRJbnB1dFN0cmVhbShqZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0ucHV0TmV4dEVudHJ5KG5ldyBKYXJFbnRyeShqZS5nZXROYW1lKCkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBpcy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coIndlYnNwaGVyZSBKYXIgcmVidWlsZCBuZWVkZWQgZHVlIHRvIGNoYW5nZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiaW50ZXJmYWNlIG9yIFhNTCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVidWlsZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgU3RyaW5nIGNuZm1zZyA9ICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgZWpiLWphciBmaWxlIgorICAgICAgICAgICAgICAgICArICIuIERldGFpbHM6ICIKKyAgICAgICAgICAgICAgICAgKyBjbmZlLmdldE1lc3NhZ2UoKTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNuZm1zZywgY25mZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJT0V4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIGVqYi1qYXIgZmlsZSAiCisgICAgICAgICAgICAgICAgICsgIi4gRGV0YWlsczogIgorICAgICAgICAgICAgICAgICArIGlvZS5nZXRNZXNzYWdlKCk7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGNsb3NlIGZpbGVzIGFuZCBwZXJoYXBzIHJlbmFtZSBvdXRwdXQKKyAgICAgICAgICAgIGlmIChnZW5lcmljSmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmljSmFyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gY2xvc2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2FzSmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3YXNKYXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBjbG9zZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZXdKYXJTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGNsb3NlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVuYW1lKG5ld3dhc0phckZpbGUsIHdlYnNwaGVyZUphckZpbGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHJlbmFtZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICBsb2cocmVuYW1lRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgIHJlYnVpbGQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWJ1aWxkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCBpbnZva2VkIGJ5IGlzUmVidWlsZFJlcXVpcmVkIHRvIGdldCBhIENsYXNzTG9hZGVyIGZvciBhCisgICAgICogSmFyIEZpbGUgcGFzc2VkIHRvIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzamFyIGphdmEuaW8uRmlsZSByZXByZXNlbnRpbmcgamFyIGZpbGUgdG8gZ2V0IGNsYXNzZXMgZnJvbS4KKyAgICAgKiBAcmV0dXJuIGEgY2xhc3Nsb2FkZXIgZm9yIHRoZSBqYXIgZmlsZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlckZyb21KYXIoRmlsZSBjbGFzc2phcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0aCBsb29rdXBQYXRoID0gbmV3IFBhdGgoZ2V0VGFzaygpLmdldFByb2plY3QoKSk7CisKKyAgICAgICAgbG9va3VwUGF0aC5zZXRMb2NhdGlvbihjbGFzc2phcik7CisKKyAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBnZXRDb21iaW5lZENsYXNzcGF0aCgpOworCisgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgbG9va3VwUGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBnZXRUYXNrKCkuZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGxvb2t1cFBhdGgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0NvbXBhdGFiaWxpdHkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9Db21wYXRhYmlsaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyZTI1NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9Db21wYXRhYmlsaXR5LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb247CisKKy8qKgorICogRW51bSB1c2VkIGluIChAbGluayBFeHRlbnNpb24pIHRvIGluZGljYXRlIHRoZSBjb21wYXRhYmlsaXR5CisgKiBvZiBvbmUgZXh0ZW5zaW9uIHRvIGFub3RoZXIuIFNlZSAoQGxpbmsgRXh0ZW5zaW9uKSBmb3IgaW5zdGFuY2VzCisgKiBvZiBvYmplY3QuCisgKgorICogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HCisgKiAgVGhpcyBmaWxlIGlzIGZyb20gZXhjYWxpYnVyLmV4dGVuc2lvbiBwYWNrYWdlLiBEb250IGVkaXQgdGhpcyBmaWxlCisgKiBkaXJlY3RseSBhcyB0aGVyZSBpcyBubyB1bml0IHRlc3RzIHRvIG1ha2Ugc3VyZSBpdCBpcyBvcGVyYXRpb25hbAorICogaW4gYW50LiBFZGl0IGZpbGUgaW4gZXhjYWxpYnVyIGFuZCBydW4gdGVzdHMgdGhlcmUgYmVmb3JlIGNoYW5naW5nCisgKiBhbnRzIGZpbGUuCisgKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKKyAqCisgKiBAc2VlIEV4dGVuc2lvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29tcGF0YWJpbGl0eSB7CisgICAgLyoqCisgICAgICogQSBzdHJpbmcgcmVwcmVzZW50YWl0b24gb2YgY29tcGF0YWJpbGl0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY29tcGF0YWJpbGl0eSBlbnVtIHdpdGggc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBjb21wYXRhYmlsaXR5IGxldmVsCisgICAgICovCisgICAgQ29tcGF0YWJpbGl0eShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBuYW1lIG9mIGNvbXBhdGFiaWxpdHkgbGV2ZWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIGNvbXBhdGFiaWxpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vQ29tcGF0aWJpbGl0eS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0NvbXBhdGliaWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjkxYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0NvbXBhdGliaWxpdHkuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbjsKKworLyoqCisgKiBFbnVtIHVzZWQgaW4gKEBsaW5rIEV4dGVuc2lvbikgdG8gaW5kaWNhdGUgdGhlIGNvbXBhdGliaWxpdHkKKyAqIG9mIG9uZSBleHRlbnNpb24gdG8gYW5vdGhlci4gU2VlIChAbGluayBFeHRlbnNpb24pIGZvciBpbnN0YW5jZXMKKyAqIG9mIG9iamVjdC4KKyAqCisgKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKKyAqICBUaGlzIGZpbGUgaXMgZnJvbSBleGNhbGlidXIuZXh0ZW5zaW9uIHBhY2thZ2UuIERvbnQgZWRpdCB0aGlzIGZpbGUKKyAqIGRpcmVjdGx5IGFzIHRoZXJlIGlzIG5vIHVuaXQgdGVzdHMgdG8gbWFrZSBzdXJlIGl0IGlzIG9wZXJhdGlvbmFsCisgKiBpbiBhbnQuIEVkaXQgZmlsZSBpbiBleGNhbGlidXIgYW5kIHJ1biB0ZXN0cyB0aGVyZSBiZWZvcmUgY2hhbmdpbmcKKyAqIGFudHMgZmlsZS4KKyAqIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORworICoKKyAqIEBzZWUgRXh0ZW5zaW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb21wYXRpYmlsaXR5IHsKKyAgICAvKioKKyAgICAgKiBBIHN0cmluZyByZXByZXNlbnRhaXRvbiBvZiBjb21wYXRpYmlsaXR5IGxldmVsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjb21wYXRpYmlsaXR5IGVudW0gd2l0aCBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGNvbXBhdGliaWxpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBDb21wYXRpYmlsaXR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG5hbWUgb2YgY29tcGF0aWJpbGl0eSBsZXZlbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgY29tcGF0aWJpbGl0eSBsZXZlbAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9EZXdleURlY2ltYWwuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9EZXdleURlY2ltYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk2M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0Rld2V5RGVjaW1hbC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uOworCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBjb250YWluIHZlcnNpb24gbnVtYmVycyBpbiAiRGV3ZXkgRGVjaW1hbCIKKyAqIHN5bnRheC4gIE51bWJlcnMgaW4gdGhlICJEZXdleSBEZWNpbWFsIiBzeW50YXggY29uc2lzdCBvZiBwb3NpdGl2ZQorICogZGVjaW1hbCBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkgcGVyaW9kcyAiLiIuICBGb3IgZXhhbXBsZSwgIjIuMCIgb3IKKyAqICIxLjIuMy40LjUuNi43Ii4gIFRoaXMgYWxsb3dzIGFuIGV4dGVuc2libGUgbnVtYmVyIHRvIGJlIHVzZWQgdG8KKyAqIHJlcHJlc2VudCBtYWpvciwgbWlub3IsIG1pY3JvLCBldGMgdmVyc2lvbnMuICBUaGUgdmVyc2lvbiBudW1iZXIKKyAqIG11c3QgYmVnaW4gd2l0aCBhIG51bWJlci4KKyAqCisgKiBPcmlnaW5hbCBJbXBsZW1lbnRhdGlvbiBtb3ZlZCB0byBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRld2V5RGVjaW1hbAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGV3ZXlEZWNpbWFsIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5EZXdleURlY2ltYWwgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgRGV3ZXlEZWNpbWFsIGZyb20gYW4gYXJyYXkgb2YgaW50ZWdlciBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMgYW4gYXJyYXkgb2YgaW50ZWdlciBjb21wb25lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBEZXdleURlY2ltYWwoZmluYWwgaW50W10gY29tcG9uZW50cykgeworICAgICAgICBzdXBlcihjb21wb25lbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBEZXdleURlY2ltYWwgZnJvbSBzdHJpbmcgaW4gRGV3ZXlEZWNpbWFsIGZvcm1hdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZyBpbiBkZXdleSBkZWNpbWFsIGZvcm1hdAorICAgICAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHN0cmluZyBpcyBtYWxmb3JtZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGV3ZXlEZWNpbWFsKGZpbmFsIFN0cmluZyBzdHJpbmcpCisgICAgICAgIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24geworICAgICAgICBzdXBlcihzdHJpbmcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTljM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsNjg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogPHA+VXRpbGl0eSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgZWl0aGVyIGFuIGF2YWlsYWJsZSAiT3B0aW9uYWwgUGFja2FnZSIKKyAqIChmb3JtZXJseSBrbm93biBhcyAiU3RhbmRhcmQgRXh0ZW5zaW9uIikgYXMgZGVzY3JpYmVkIGluIHRoZSBtYW5pZmVzdAorICogb2YgYSBKQVIgZmlsZSwgb3IgdGhlIHJlcXVpcmVtZW50IGZvciBzdWNoIGFuIG9wdGlvbmFsIHBhY2thZ2UuPC9wPgorICoKKyAqIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50CisgKiA8ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4gaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCisgKiBKYXZhMiBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluIGZpbGUKKyAqIDxjb2RlPmd1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9jb2RlPi48L3A+CisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uIHsKKyAgICAvKioKKyAgICAgKiBNYW5pZmVzdCBBdHRyaWJ1dGUgTmFtZSBvYmplY3QgZm9yIEVYVEVOU0lPTl9MSVNULgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlcy5OYW1lIEVYVEVOU0lPTl9MSVNUCisgICAgICAgID0gbmV3IEF0dHJpYnV0ZXMuTmFtZSgiRXh0ZW5zaW9uLUxpc3QiKTsKKworICAgIC8qKgorICAgICAqIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCBmb3IgPGNvZGU+T3B0aW9uYWwtRXh0ZW5zaW9uLUxpc3Q8L2NvZGU+CisgICAgICogbWFuaWZlc3QgYXR0cmlidXRlIHVzZWQgZm9yIGRlY2xhcmluZyBvcHRpb25hbCBkZXBlbmRlbmNpZXMgb24KKyAgICAgKiBpbnN0YWxsZWQgZXh0ZW5zaW9ucy4gTm90ZSB0aGF0IHRoZSBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgYnkgdGhpcyBtZXRob2QKKyAgICAgKiBhcmUgbm90IHJlcXVpcmVkIGZvciB0aGUgbGlicmFyeSB0byBvcGVyYXRlIGJ1dCBpZiBwcmVzZW50IHdpbGwgYmUgdXNlZC4KKyAgICAgKiBJdCBpcyBOT1QgcGFydCBvZiB0aGUgb2ZmaWNpYWwgIk9wdGlvbmFsIFBhY2thZ2UiIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3NwZWMuaHRtbCNkZXBlbmRuZWN5Ij4KKyAgICAgKiAgICAgIEluc3RhbGxlZCBleHRlbnNpb24gZGVwZW5kZW5jeTwvYT4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBPUFRJT05BTF9FWFRFTlNJT05fTElTVAorICAgICAgICA9IG5ldyBBdHRyaWJ1dGVzLk5hbWUoIk9wdGlvbmFsLUV4dGVuc2lvbi1MaXN0Iik7CisKKyAgICAvKioKKyAgICAgKiBNYW5pZmVzdCBBdHRyaWJ1dGUgTmFtZSBvYmplY3QgZm9yIEVYVEVOU0lPTl9OQU1FLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlcy5OYW1lIEVYVEVOU0lPTl9OQU1FID0KKyAgICAgICAgbmV3IEF0dHJpYnV0ZXMuTmFtZSgiRXh0ZW5zaW9uLU5hbWUiKTsKKyAgICAvKioKKyAgICAgKiBNYW5pZmVzdCBBdHRyaWJ1dGUgTmFtZSBvYmplY3QgZm9yIFNQRUNJRklDQVRJT05fVkVSU0lPTi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBTUEVDSUZJQ0FUSU9OX1ZFUlNJT04KKyAgICAgICAgPSBBdHRyaWJ1dGVzLk5hbWUuU1BFQ0lGSUNBVElPTl9WRVJTSU9OOworCisgICAgLyoqCisgICAgICogTWFuaWZlc3QgQXR0cmlidXRlIE5hbWUgb2JqZWN0IGZvciBTUEVDSUZJQ0FUSU9OX1ZFTkRPUi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBTUEVDSUZJQ0FUSU9OX1ZFTkRPUgorICAgICAgICA9IEF0dHJpYnV0ZXMuTmFtZS5TUEVDSUZJQ0FUSU9OX1ZFTkRPUjsKKworICAgIC8qKgorICAgICAqIE1hbmlmZXN0IEF0dHJpYnV0ZSBOYW1lIG9iamVjdCBmb3IgSU1QTEVNRU5UQVRJT05fVkVSU0lPTi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBJTVBMRU1FTlRBVElPTl9WRVJTSU9OCisgICAgICAgID0gQXR0cmlidXRlcy5OYW1lLklNUExFTUVOVEFUSU9OX1ZFUlNJT047CisKKyAgICAvKioKKyAgICAgKiBNYW5pZmVzdCBBdHRyaWJ1dGUgTmFtZSBvYmplY3QgZm9yIElNUExFTUVOVEFUSU9OX1ZFTkRPUi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBJTVBMRU1FTlRBVElPTl9WRU5ET1IKKyAgICAgICAgPSBBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVORE9SOworCisgICAgLyoqCisgICAgICogTWFuaWZlc3QgQXR0cmlidXRlIE5hbWUgb2JqZWN0IGZvciBJTVBMRU1FTlRBVElPTl9VUkwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVzLk5hbWUgSU1QTEVNRU5UQVRJT05fVVJMCisgICAgICAgID0gbmV3IEF0dHJpYnV0ZXMuTmFtZSgiSW1wbGVtZW50YXRpb24tVVJMIik7CisKKyAgICAvKioKKyAgICAgKiBNYW5pZmVzdCBBdHRyaWJ1dGUgTmFtZSBvYmplY3QgZm9yIElNUExFTUVOVEFUSU9OX1ZFTkRPUl9JRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBJTVBMRU1FTlRBVElPTl9WRU5ET1JfSUQKKyAgICAgICAgPSBuZXcgQXR0cmlidXRlcy5OYW1lKCJJbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQiKTsKKworICAgIC8qKgorICAgICAqIEVudW0gaW5kaWNhdGluZyB0aGF0IGV4dGVuc2lvbiBpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIgZXh0ZW5zaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGF0aWJpbGl0eSBDT01QQVRJQkxFCisgICAgICAgID0gbmV3IENvbXBhdGliaWxpdHkoIkNPTVBBVElCTEUiKTsKKworICAgIC8qKgorICAgICAqIEVudW0gaW5kaWNhdGluZyB0aGF0IGV4dGVuc2lvbiByZXF1aXJlcyBhbiB1cGdyYWRlCisgICAgICogb2Ygc3BlY2lmaWNhdGlvbiB0byBiZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgZXh0ZW5zaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGF0aWJpbGl0eSBSRVFVSVJFX1NQRUNJRklDQVRJT05fVVBHUkFERQorICAgICAgICA9IG5ldyBDb21wYXRpYmlsaXR5KCJSRVFVSVJFX1NQRUNJRklDQVRJT05fVVBHUkFERSIpOworCisgICAgLyoqCisgICAgICogRW51bSBpbmRpY2F0aW5nIHRoYXQgZXh0ZW5zaW9uIHJlcXVpcmVzIGEgdmVuZG9yCisgICAgICogc3dpdGNoIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBleHRlbnNpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXRpYmlsaXR5IFJFUVVJUkVfVkVORE9SX1NXSVRDSAorICAgICAgICA9IG5ldyBDb21wYXRpYmlsaXR5KCJSRVFVSVJFX1ZFTkRPUl9TV0lUQ0giKTsKKworICAgIC8qKgorICAgICAqIEVudW0gaW5kaWNhdGluZyB0aGF0IGV4dGVuc2lvbiByZXF1aXJlcyBhbiB1cGdyYWRlCisgICAgICogb2YgaW1wbGVtZW50YXRpb24gdG8gYmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIGV4dGVuc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhdGliaWxpdHkgUkVRVUlSRV9JTVBMRU1FTlRBVElPTl9VUEdSQURFCisgICAgICAgID0gbmV3IENvbXBhdGliaWxpdHkoIlJFUVVJUkVfSU1QTEVNRU5UQVRJT05fVVBHUkFERSIpOworCisgICAgLyoqCisgICAgICogRW51bSBpbmRpY2F0aW5nIHRoYXQgZXh0ZW5zaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoCisgICAgICogb3RoZXIgZXh0ZW5zaW9uIGluIHdheXMgb3RoZXIgdGhhbiBvdGhlciBlbnVtcworICAgICAqIGluZGljYXRlKS4gRm9yIGV4YW1wbGUgdGhlIG90aGVyIGV4dGVuc2lvbiBtYXkgaGF2ZQorICAgICAqIGEgZGlmZmVyZW50IElELgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGF0aWJpbGl0eSBJTkNPTVBBVElCTEUKKyAgICAgICAgPSBuZXcgQ29tcGF0aWJpbGl0eSgiSU5DT01QQVRJQkxFIik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uYWwgcGFja2FnZSBiZWluZyBtYWRlIGF2YWlsYWJsZSwgb3IgcmVxdWlyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXh0ZW5zaW9uTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSB2ZXJzaW9uIG51bWJlciAoZG90dGVkIGRlY2ltYWwgbm90YXRpb24pIG9mIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICogdG8gd2hpY2ggdGhpcyBvcHRpb25hbCBwYWNrYWdlIGNvbmZvcm1zLgorICAgICAqLworICAgIHByaXZhdGUgRGV3ZXlEZWNpbWFsIHNwZWNpZmljYXRpb25WZXJzaW9uOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIHRoYXQgb3JpZ2luYXRlZCB0aGUKKyAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHdoaWNoIHRoaXMgb3B0aW9uYWwgcGFja2FnZSBjb25mb3Jtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVuZG9yOworCisgICAgLyoqCisgICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvZHVjZWQgdGhlIG9wdGlvbmFsCisgICAgICogcGFja2FnZSBjb250YWluZWQgaW4gdGhpcyBKQVIgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbXBsZW1lbnRhdGlvblZlbmRvcklEOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIHRoYXQgcHJvZHVjZWQgdGhpcworICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgb3B0aW9uYWwgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbXBsZW1lbnRhdGlvblZlbmRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSB2ZXJzaW9uIG51bWJlciAoZG90dGVkIGRlY2ltYWwgbm90YXRpb24pIGZvciB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgICogb2YgdGhlIG9wdGlvbmFsIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBEZXdleURlY2ltYWwgaW1wbGVtZW50YXRpb25WZXJzaW9uOworCisgICAgLyoqCisgICAgICogVGhlIFVSTCBmcm9tIHdoaWNoIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHRoaXMgb3B0aW9uYWwgcGFja2FnZQorICAgICAqIGNhbiBiZSBvYnRhaW5lZCBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW1wbGVtZW50YXRpb25VUkw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+RXh0ZW5zaW9uPC9jb2RlPiBvYmplY3RzIHJlcHJlc2VudGluZyBvcHRpb25hbAorICAgICAqIHBhY2thZ2VzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgSkFSIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5NYW5pZmVzdDwvY29kZT4uICBJZiB0aGVyZSBhcmUgbm8gc3VjaCBvcHRpb25hbAorICAgICAqIHBhY2thZ2VzLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmlmZXN0IE1hbmlmZXN0IHRvIGJlIHBhcnNlZAorICAgICAqIEByZXR1cm4gdGhlICJhdmFpbGFibGUiIGV4dGVuc2lvbnMgaW4gc3BlY2lmaWVkIG1hbmlmZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25bXSBnZXRBdmFpbGFibGUoZmluYWwgTWFuaWZlc3QgbWFuaWZlc3QpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gbWFuaWZlc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uWyAwIF07CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBmaW5hbCBBdHRyaWJ1dGVzIG1haW5BdHRyaWJ1dGVzID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKKyAgICAgICAgaWYgKG51bGwgIT0gbWFpbkF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oIiIsIG1haW5BdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IGV4dGVuc2lvbikgeworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGV4dGVuc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNYXAgZW50cmllcyA9IG1hbmlmZXN0LmdldEVudHJpZXMoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3Iga2V5cyA9IGVudHJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7CisgICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSAoQXR0cmlidXRlcykgZW50cmllcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oIiIsIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgaWYgKG51bGwgIT0gZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoZXh0ZW5zaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoRXh0ZW5zaW9uW10pIHJlc3VsdHMudG9BcnJheShuZXcgRXh0ZW5zaW9uW3Jlc3VsdHMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgPGNvZGU+RXh0ZW5zaW9uPC9jb2RlPiBvYmplY3RzIHJlcHJlc2VudGluZyBvcHRpb25hbAorICAgICAqIHBhY2thZ2VzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjb250YWluZWQgaW4gdGhlIEpBUgorICAgICAqIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgPGNvZGU+TWFuaWZlc3Q8L2NvZGU+LiAgSWYgdGhlcmUKKyAgICAgKiBhcmUgbm8gc3VjaCBvcHRpb25hbCBwYWNrYWdlcywgYSB6ZXJvLWxlbmd0aCBsaXN0IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmlmZXN0IE1hbmlmZXN0IHRvIGJlIHBhcnNlZAorICAgICAqIEByZXR1cm4gdGhlIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gbWFuaWZlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uW10gZ2V0UmVxdWlyZWQoZmluYWwgTWFuaWZlc3QgbWFuaWZlc3QpIHsKKyAgICAgICAgcmV0dXJuIGdldExpc3RlZChtYW5pZmVzdCwgQXR0cmlidXRlcy5OYW1lLkVYVEVOU0lPTl9MSVNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiA8Y29kZT5FeHRlbnNpb248L2NvZGU+IG9iamVjdHMgcmVwcmVzZW50aW5nICJPcHRpb25hbAorICAgICAqIFBhY2thZ2VzIiB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkZWNsYXJlcyB0aGV5IHdpbGwgdXNlIGlmIHByZXNlbnQuIElmCisgICAgICogdGhlcmUgYXJlIG5vIHN1Y2ggb3B0aW9uYWwgcGFja2FnZXMsIGEgemVyby1sZW5ndGggbGlzdCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5pZmVzdCBNYW5pZmVzdCB0byBiZSBwYXJzZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBvcHRpb25hbCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIG1hbmlmZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25bXSBnZXRPcHRpb25zKGZpbmFsIE1hbmlmZXN0IG1hbmlmZXN0KSB7CisgICAgICAgIHJldHVybiBnZXRMaXN0ZWQobWFuaWZlc3QsIE9QVElPTkFMX0VYVEVOU0lPTl9MSVNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgRXh0ZW5zaW9uIHRvIHRoZSBzcGVjaWZpZWQgbWFuaWZlc3QgQXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIG9mIG1hbmlmZXN0IHRvIGFkZCB0bworICAgICAqIEBwYXJhbSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHRlbnNpb24oZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgYWRkRXh0ZW5zaW9uKGV4dGVuc2lvbiwgIiIsIGF0dHJpYnV0ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBFeHRlbnNpb24gdG8gdGhlIHNwZWNpZmllZCBtYW5pZmVzdCBBdHRyaWJ1dGVzLgorICAgICAqIFVzZSB0aGUgc3BlY2lmaWVkIHByZWZpeCBzbyB0aGF0IGRlcGVuZGVuY2llcyBjYW4gYWRkZWQKKyAgICAgKiB3aXRoIGEgcHJlZml4IHN1Y2ggYXMgImphdmEzZC0iIGV0Yy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIG9mIG1hbmlmZXN0IHRvIGFkZCB0bworICAgICAqIEBwYXJhbSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbgorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIG5hbWUgdG8gcHJlZml4IHRvIGV4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHRlbnNpb24oZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICBhdHRyaWJ1dGVzLnB1dFZhbHVlKHByZWZpeCArIEVYVEVOU0lPTl9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uTmFtZSgpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgc3BlY2lmaWNhdGlvblZlbmRvciA9IGV4dGVuc2lvbi5nZXRTcGVjaWZpY2F0aW9uVmVuZG9yKCk7CisgICAgICAgIGlmIChudWxsICE9IHNwZWNpZmljYXRpb25WZW5kb3IpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0VmFsdWUocHJlZml4ICsgU1BFQ0lGSUNBVElPTl9WRU5ET1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVuZG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIERld2V5RGVjaW1hbCBzcGVjaWZpY2F0aW9uVmVyc2lvbgorICAgICAgICAgICAgPSBleHRlbnNpb24uZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKTsKKyAgICAgICAgaWYgKG51bGwgIT0gc3BlY2lmaWNhdGlvblZlcnNpb24pIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0VmFsdWUocHJlZml4ICsgU1BFQ0lGSUNBVElPTl9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlcnNpb24udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgaW1wbGVtZW50YXRpb25WZW5kb3JJRAorICAgICAgICAgICAgPSBleHRlbnNpb24uZ2V0SW1wbGVtZW50YXRpb25WZW5kb3JJRCgpOworICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblZlbmRvcklEKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dFZhbHVlKHByZWZpeCArIElNUExFTUVOVEFUSU9OX1ZFTkRPUl9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uVmVuZG9ySUQpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVuZG9yID0gZXh0ZW5zaW9uLmdldEltcGxlbWVudGF0aW9uVmVuZG9yKCk7CisgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVuZG9yKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dFZhbHVlKHByZWZpeCArIElNUExFTUVOVEFUSU9OX1ZFTkRPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uVmVuZG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIERld2V5RGVjaW1hbCBpbXBsZW1lbnRhdGlvblZlcnNpb24KKyAgICAgICAgICAgID0gZXh0ZW5zaW9uLmdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpOworICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblZlcnNpb24pIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0VmFsdWUocHJlZml4ICsgSU1QTEVNRU5UQVRJT05fVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uVmVyc2lvbi50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBpbXBsZW1lbnRhdGlvblVSTCA9IGV4dGVuc2lvbi5nZXRJbXBsZW1lbnRhdGlvblVSTCgpOworICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblVSTCkgeworICAgICAgICAgICAgYXR0cmlidXRlcy5wdXRWYWx1ZShwcmVmaXggKyBJTVBMRU1FTlRBVElPTl9VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvblVSTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RydWN0b3IgdG8gY3JlYXRlIEV4dGVuc2lvbiBvYmplY3QuCisgICAgICogTm90ZSB0aGF0IGV2ZXJ5IGNvbXBvbmVudCBpcyBhbGxvd2VkIHRvIGJlIHNwZWNpZmllZAorICAgICAqIGJ1dCBvbmx5IHRoZSBleHRlbnNpb25OYW1lIGlzIG1hbmRhdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRlbnNpb25OYW1lIHRoZSBuYW1lIG9mIGV4dGVuc2lvbi4KKyAgICAgKiBAcGFyYW0gc3BlY2lmaWNhdGlvblZlcnNpb24gdGhlIHNwZWNpZmljYXRpb24gVmVyc2lvbiBvZiBleHRlbnNpb24uCisgICAgICogQHBhcmFtIHNwZWNpZmljYXRpb25WZW5kb3IgdGhlIHNwZWNpZmljYXRpb24gVmVuZG9yIG9mIGV4dGVuc2lvbi4KKyAgICAgKiBAcGFyYW0gaW1wbGVtZW50YXRpb25WZXJzaW9uIHRoZSBpbXBsZW1lbnRhdGlvbiBWZXJzaW9uIG9mIGV4dGVuc2lvbi4KKyAgICAgKiBAcGFyYW0gaW1wbGVtZW50YXRpb25WZW5kb3IgdGhlIGltcGxlbWVudGF0aW9uIFZlbmRvciBvZiBleHRlbnNpb24uCisgICAgICogQHBhcmFtIGltcGxlbWVudGF0aW9uVmVuZG9ySWQgdGhlIGltcGxlbWVudGF0aW9uIFZlbmRvcklkIG9mIGV4dGVuc2lvbi4KKyAgICAgKiBAcGFyYW0gaW1wbGVtZW50YXRpb25VUkwgdGhlIGltcGxlbWVudGF0aW9uIFVSTCBvZiBleHRlbnNpb24uCisgICAgICovCisgICAgcHVibGljIEV4dGVuc2lvbihmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3BlY2lmaWNhdGlvblZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNwZWNpZmljYXRpb25WZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW1wbGVtZW50YXRpb25WZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVuZG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uVVJMKSB7CisgICAgICAgIHRoaXMuZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWU7CisgICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlbmRvciA9IHNwZWNpZmljYXRpb25WZW5kb3I7CisKKyAgICAgICAgaWYgKG51bGwgIT0gc3BlY2lmaWNhdGlvblZlcnNpb24pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICA9IG5ldyBEZXdleURlY2ltYWwoc3BlY2lmaWNhdGlvblZlcnNpb24pOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvciA9ICJCYWQgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGZvcm1hdCAnIgorICAgICAgICAgICAgICAgICAgICArIHNwZWNpZmljYXRpb25WZXJzaW9uICsgIicgaW4gJyIgKyBleHRlbnNpb25OYW1lCisgICAgICAgICAgICAgICAgICAgICsgIicuIChSZWFzb246ICIgKyBuZmUgKyAiKSI7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVVJMID0gaW1wbGVtZW50YXRpb25VUkw7CisgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb25WZW5kb3IgPSBpbXBsZW1lbnRhdGlvblZlbmRvcjsKKyAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvblZlbmRvcklEID0gaW1wbGVtZW50YXRpb25WZW5kb3JJZDsKKworICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblZlcnNpb24pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvblZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgPSBuZXcgRGV3ZXlEZWNpbWFsKGltcGxlbWVudGF0aW9uVmVyc2lvbik7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yID0gIkJhZCBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uIGZvcm1hdCAnIgorICAgICAgICAgICAgICAgICAgICArIGltcGxlbWVudGF0aW9uVmVyc2lvbiArICInIGluICciICsgZXh0ZW5zaW9uTmFtZQorICAgICAgICAgICAgICAgICAgICArICInLiAoUmVhc29uOiAiICsgbmZlICsgIikiOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5leHRlbnNpb25OYW1lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImV4dGVuc2lvbk5hbWUgcHJvcGVydHkgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbk5hbWUoKSB7CisgICAgICAgIHJldHVybiBleHRlbnNpb25OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVuZG9yIG9mIHRoZSBleHRlbnNpb25zIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZW5kb3Igb2YgdGhlIGV4dGVuc2lvbnMgc3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmljYXRpb25WZW5kb3IoKSB7CisgICAgICAgIHJldHVybiBzcGVjaWZpY2F0aW9uVmVuZG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgZXh0ZW5zaW9ucyBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgZXh0ZW5zaW9ucyBzcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBEZXdleURlY2ltYWwgZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBzcGVjaWZpY2F0aW9uVmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVybCBvZiB0aGUgZXh0ZW5zaW9ucyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVybCBvZiB0aGUgZXh0ZW5zaW9ucyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVVJMKCkgeworICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25VUkw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2ZW5kb3Igb2YgdGhlIGV4dGVuc2lvbnMgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZW5kb3Igb2YgdGhlIGV4dGVuc2lvbnMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlbmRvcigpIHsKKyAgICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uVmVuZG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVuZG9ySUQgb2YgdGhlIGV4dGVuc2lvbnMgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZW5kb3JJRCBvZiB0aGUgZXh0ZW5zaW9ucyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVuZG9ySUQoKSB7CisgICAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvblZlbmRvcklEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgZXh0ZW5zaW9ucyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbnMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIERld2V5RGVjaW1hbCBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvblZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgQ29tcGF0aWJpbGl0eSBlbnVtIGluZGljYXRpbmcgdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGlzCisgICAgICogPGNvZGU+RXh0ZW5zaW9uPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQgPGNvZGU+RXh0ZW5zaW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1aXJlZCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVxdWlyZWQgb3B0aW9uYWwgcGFja2FnZQorICAgICAqIEByZXR1cm4gdGhlIGVudW0gaW5kaWNhdGluZyB0aGUgY29tcGF0aWJpbGl0eSAob3IgbGFjayB0aGVyZW9mKQorICAgICAqICAgICAgICAgb2Ygc3BlY2lmZWQgZXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIENvbXBhdGliaWxpdHkgZ2V0Q29tcGF0aWJpbGl0eVdpdGgoZmluYWwgRXh0ZW5zaW9uIHJlcXVpcmVkKSB7CisgICAgICAgIC8vIEV4dGVuc2lvbiBOYW1lIG11c3QgbWF0Y2gKKyAgICAgICAgaWYgKCFleHRlbnNpb25OYW1lLmVxdWFscyhyZXF1aXJlZC5nZXRFeHRlbnNpb25OYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5DT01QQVRJQkxFOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXZhaWxhYmxlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBtdXN0IGJlID49IHJlcXVpcmVkCisgICAgICAgIGZpbmFsIERld2V5RGVjaW1hbCByZXF1aXJlZFNwZWNpZmljYXRpb25WZXJzaW9uCisgICAgICAgICAgICA9IHJlcXVpcmVkLmdldFNwZWNpZmljYXRpb25WZXJzaW9uKCk7CisgICAgICAgIGlmIChudWxsICE9IHJlcXVpcmVkU3BlY2lmaWNhdGlvblZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChudWxsID09IHNwZWNpZmljYXRpb25WZXJzaW9uCisgICAgICAgICAgICAgICAgfHwgIWlzQ29tcGF0aWJsZShzcGVjaWZpY2F0aW9uVmVyc2lvbiwgcmVxdWlyZWRTcGVjaWZpY2F0aW9uVmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUkVRVUlSRV9TUEVDSUZJQ0FUSU9OX1VQR1JBREU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBWZW5kb3IgSUQgbXVzdCBtYXRjaAorICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWlyZWRJbXBsZW1lbnRhdGlvblZlbmRvcklECisgICAgICAgICAgICA9IHJlcXVpcmVkLmdldEltcGxlbWVudGF0aW9uVmVuZG9ySUQoKTsKKyAgICAgICAgaWYgKG51bGwgIT0gcmVxdWlyZWRJbXBsZW1lbnRhdGlvblZlbmRvcklEKSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBpbXBsZW1lbnRhdGlvblZlbmRvcklECisgICAgICAgICAgICAgICAgfHwgIWltcGxlbWVudGF0aW9uVmVuZG9ySUQuZXF1YWxzKHJlcXVpcmVkSW1wbGVtZW50YXRpb25WZW5kb3JJRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUkVRVUlSRV9WRU5ET1JfU1dJVENIOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gdmVyc2lvbiBtdXN0IGJlID49IHJlcXVpcmVkCisgICAgICAgIGZpbmFsIERld2V5RGVjaW1hbCByZXF1aXJlZEltcGxlbWVudGF0aW9uVmVyc2lvbgorICAgICAgICAgICAgPSByZXF1aXJlZC5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKTsKKyAgICAgICAgaWYgKG51bGwgIT0gcmVxdWlyZWRJbXBsZW1lbnRhdGlvblZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChudWxsID09IGltcGxlbWVudGF0aW9uVmVyc2lvbgorICAgICAgICAgICAgICAgIHx8ICFpc0NvbXBhdGlibGUoaW1wbGVtZW50YXRpb25WZXJzaW9uLCByZXF1aXJlZEltcGxlbWVudGF0aW9uVmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUkVRVUlSRV9JTVBMRU1FTlRBVElPTl9VUEdSQURFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBhdmFpbGFibGUgb3B0aW9uYWwgcGFja2FnZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cworICAgICAgICByZXR1cm4gQ09NUEFUSUJMRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5FeHRlbnNpb248L2NvZGU+CisgICAgICogKHdoaWNoIHJlcHJlc2VudHMgYW4gb3B0aW9uYWwgcGFja2FnZSByZXF1aXJlZCBieSBhbiBhcHBsaWNhdGlvbikKKyAgICAgKiBpcyBzYXRpc2ZpZWQgYnkgdGhpcyA8Y29kZT5FeHRlbnNpb248L2NvZGU+ICh3aGljaCByZXByZXNlbnRzIGFuCisgICAgICogb3B0aW9uYWwgcGFja2FnZSB0aGF0IGlzIGFscmVhZHkgaW5zdGFsbGVkLiAgT3RoZXJ3aXNlLCByZXR1cm4KKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQgRGVzY3JpcHRpb24gb2YgdGhlIHJlcXVpcmVkIG9wdGlvbmFsIHBhY2thZ2UKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBleHRlbnNpb24gaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgZXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aChmaW5hbCBFeHRlbnNpb24gcmVxdWlyZWQpIHsKKyAgICAgICAgcmV0dXJuIChDT01QQVRJQkxFID09IGdldENvbXBhdGliaWxpdHlXaXRoKHJlcXVpcmVkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBicmFjZSA9ICI6ICI7CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihFWFRFTlNJT05fTkFNRS50b1N0cmluZygpKTsKKyAgICAgICAgc2IuYXBwZW5kKGJyYWNlKTsKKyAgICAgICAgc2IuYXBwZW5kKGV4dGVuc2lvbk5hbWUpOworICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworCisgICAgICAgIGlmIChudWxsICE9IHNwZWNpZmljYXRpb25WZXJzaW9uKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoU1BFQ0lGSUNBVElPTl9WRVJTSU9OKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChicmFjZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3BlY2lmaWNhdGlvblZlcnNpb24pOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IHNwZWNpZmljYXRpb25WZW5kb3IpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTUEVDSUZJQ0FUSU9OX1ZFTkRPUik7CisgICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOworICAgICAgICAgICAgc2IuYXBwZW5kKHNwZWNpZmljYXRpb25WZW5kb3IpOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVyc2lvbikgeworICAgICAgICAgICAgc2IuYXBwZW5kKElNUExFTUVOVEFUSU9OX1ZFUlNJT04pOworICAgICAgICAgICAgc2IuYXBwZW5kKGJyYWNlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbXBsZW1lbnRhdGlvblZlcnNpb24pOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVuZG9ySUQpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChJTVBMRU1FTlRBVElPTl9WRU5ET1JfSUQpOworICAgICAgICAgICAgc2IuYXBwZW5kKGJyYWNlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbXBsZW1lbnRhdGlvblZlbmRvcklEKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblZlbmRvcikgeworICAgICAgICAgICAgc2IuYXBwZW5kKElNUExFTUVOVEFUSU9OX1ZFTkRPUik7CisgICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOworICAgICAgICAgICAgc2IuYXBwZW5kKGltcGxlbWVudGF0aW9uVmVuZG9yKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblVSTCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKElNUExFTUVOVEFUSU9OX1VSTCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOworICAgICAgICAgICAgc2IuYXBwZW5kKGltcGxlbWVudGF0aW9uVVJMKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpcnN0IHZlcnNpb24gbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbgorICAgICAqIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQ7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZpcnN0IEZpcnN0IHZlcnNpb24gbnVtYmVyIChkb3R0ZWQgZGVjaW1hbCkKKyAgICAgKiBAcGFyYW0gc2Vjb25kIFNlY29uZCB2ZXJzaW9uIG51bWJlciAoZG90dGVkIGRlY2ltYWwpCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGF0aWJsZShmaW5hbCBEZXdleURlY2ltYWwgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXdleURlY2ltYWwgc2Vjb25kKSB7CisgICAgICAgIHJldHVybiBmaXJzdC5pc0dyZWF0ZXJUaGFuT3JFcXVhbChzZWNvbmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGFsbCB0aGUgZXh0ZW5zaW9ucyBsaXN0ZWQgdW5kZXIgYSBwYXJ0aWN1bGFyIGtleQorICAgICAqIChVc3VhbGx5IEVYVEVOU0lPTl9MSVNUIG9yIE9QVElPTkFMX0VYVEVOU0lPTl9MSVNUKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5pZmVzdCB0aGUgbWFuaWZlc3QgdG8gZXh0cmFjdCBleHRlbnNpb25zIGZyb20KKyAgICAgKiBAcGFyYW0gbGlzdEtleSB0aGUga2V5IHVzZWQgdG8gZ2V0IGxpc3QgKFVzdWFsbHkKKyAgICAgKiAgICAgICAgRVhURU5TSU9OX0xJU1Qgb3IgT1BUSU9OQUxfRVhURU5TSU9OX0xJU1QpCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBsaXN0ZWQgZXh0ZW5zaW9ucworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEV4dGVuc2lvbltdIGdldExpc3RlZChmaW5hbCBNYW5pZmVzdCBtYW5pZmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBsaXN0S2V5KSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmaW5hbCBBdHRyaWJ1dGVzIG1haW5BdHRyaWJ1dGVzID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKKworICAgICAgICBpZiAobnVsbCAhPSBtYWluQXR0cmlidXRlcykgeworICAgICAgICAgICAgZ2V0RXh0ZW5zaW9uKG1haW5BdHRyaWJ1dGVzLCByZXN1bHRzLCBsaXN0S2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1hcCBlbnRyaWVzID0gbWFuaWZlc3QuZ2V0RW50cmllcygpOworICAgICAgICBmaW5hbCBJdGVyYXRvciBrZXlzID0gZW50cmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKKyAgICAgICAgICAgIGZpbmFsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IChBdHRyaWJ1dGVzKSBlbnRyaWVzLmdldChrZXkpOworICAgICAgICAgICAgZ2V0RXh0ZW5zaW9uKGF0dHJpYnV0ZXMsIHJlc3VsdHMsIGxpc3RLZXkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChFeHRlbnNpb25bXSkgcmVzdWx0cy50b0FycmF5KG5ldyBFeHRlbnNpb25bcmVzdWx0cy5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgcmVxdWlyZWQgb3B0aW9uYWwgcGFja2FnZXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogYXR0cmlidXRlcyBlbnRyeSwgaWYgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgQXR0cmlidXRlcyB0byBiZSBwYXJzZWQKKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQgbGlzdCB0byBhZGQgcmVxdWlyZWQgb3B0aW9uYWwgcGFja2FnZXMgdG8KKyAgICAgKiBAcGFyYW0gbGlzdEtleSB0aGUga2V5IHRvIHVzZSB0byBsb29rdXAgbGlzdCwgdXN1YWxseSBFWFRFTlNJT05fTElTVAorICAgICAqICAgIG9yIE9QVElPTkFMX0VYVEVOU0lPTl9MSVNUCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRFeHRlbnNpb24oZmluYWwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdCByZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVzLk5hbWUgbGlzdEtleSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZXMgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGxpc3RLZXkpOworICAgICAgICBpZiAobnVsbCA9PSBuYW1lcykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZXh0ZW50aW9ucyA9IHNwbGl0KG5hbWVzLCAiICIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVudGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBleHRlbnRpb25zWyBpIF0gKyAiLSI7CisgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb24gZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKHByZWZpeCwgYXR0cmlidXRlcyk7CisKKyAgICAgICAgICAgIGlmIChudWxsICE9IGV4dGVuc2lvbikgeworICAgICAgICAgICAgICAgIHJlcXVpcmVkLmFkZChleHRlbnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BsaXRzIHRoZSBzdHJpbmcgb24gZXZlcnkgdG9rZW4gaW50byBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nCisgICAgICogQHBhcmFtIG9uVG9rZW4gdGhlIHRva2VuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0YW50IGFycmF5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc3BsaXQoZmluYWwgU3RyaW5nIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb25Ub2tlbikgeworICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsIG9uVG9rZW4pOworICAgICAgICBmaW5hbCBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nWyB0b2tlbml6ZXIuY291bnRUb2tlbnMoKSBdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRbIGkgXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhbiBFeHRlbnNpb24gZnJvbSBBdHRyaWJ1dGVzLgorICAgICAqIFByZWZpeCBpbmRpY2F0ZXMgdGhlIHByZWZpeCBjaGVja2VkIGZvciBlYWNoIHN0cmluZy4KKyAgICAgKiBVc3VhbGx5IHRoZSBwcmVmaXggaXMgPGVtPiImbHQ7ZXh0ZW5zaW9uJmd0Oy0iPC9lbT4gaWYgbG9va2luZyBmb3IgYQorICAgICAqIDxiPlJlcXVpcmVkPC9iPiBleHRlbnNpb24uIElmIHlvdSBhcmUgbG9va2luZyBmb3IgYW4KKyAgICAgKiA8Yj5BdmFpbGFibGU8L2I+IGV4dGVuc2lvbgorICAgICAqIHRoZW4gdGhlIHByZWZpeCBpcyA8ZW0+IiI8L2VtPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCBmb3IgZWFjaCBhdHRyaWJ1dGUgbmFtZQorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIEF0dHJpYnV0ZXMgdG8gc2VhcmNoZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgRXh0ZW5zaW9uIG9iamVjdCwgb3IgbnVsbAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEV4dGVuc2lvbiBnZXRFeHRlbnNpb24oZmluYWwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICAvL1dBUk5JTkc6IFdlIHRyaW0gdGhlIHZhbHVlcyBvZiBhbGwgdGhlIGF0dHJpYnV0ZXMgYmVjYXVzZQorICAgICAgICAvL1NvbWUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucyBhcmUgYmFkbHkgZGVmaW5lZCAoaWUgaGF2ZSBzcGFjZXMKKyAgICAgICAgLy9hZnRlciB2ZXJzaW9uIG9yIHZlbmRvcklEKQorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZUtleSA9IHByZWZpeCArIEVYVEVOU0lPTl9OQU1FOworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGdldFRyaW1tZWRTdHJpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShuYW1lS2V5KSk7CisgICAgICAgIGlmIChudWxsID09IG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHNwZWNWZW5kb3JLZXkgPSBwcmVmaXggKyBTUEVDSUZJQ0FUSU9OX1ZFTkRPUjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNwZWNWZW5kb3IKKyAgICAgICAgICAgID0gZ2V0VHJpbW1lZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKHNwZWNWZW5kb3JLZXkpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNwZWNWZXJzaW9uS2V5ID0gcHJlZml4ICsgU1BFQ0lGSUNBVElPTl9WRVJTSU9OOworICAgICAgICBmaW5hbCBTdHJpbmcgc3BlY1ZlcnNpb24KKyAgICAgICAgICAgID0gZ2V0VHJpbW1lZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKHNwZWNWZXJzaW9uS2V5KSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGltcFZlcnNpb25LZXkgPSBwcmVmaXggKyBJTVBMRU1FTlRBVElPTl9WRVJTSU9OOworICAgICAgICBmaW5hbCBTdHJpbmcgaW1wVmVyc2lvbgorICAgICAgICAgICAgPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaW1wVmVyc2lvbktleSkpOworICAgICAgICBmaW5hbCBTdHJpbmcgaW1wVmVuZG9yS2V5ID0gcHJlZml4ICsgSU1QTEVNRU5UQVRJT05fVkVORE9SOworICAgICAgICBmaW5hbCBTdHJpbmcgaW1wVmVuZG9yCisgICAgICAgICAgICA9IGdldFRyaW1tZWRTdHJpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShpbXBWZW5kb3JLZXkpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGltcFZlbmRvcklES2V5ID0gcHJlZml4ICsgSU1QTEVNRU5UQVRJT05fVkVORE9SX0lEOworICAgICAgICBmaW5hbCBTdHJpbmcgaW1wVmVuZG9ySWQKKyAgICAgICAgICAgID0gZ2V0VHJpbW1lZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKGltcFZlbmRvcklES2V5KSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbXBVUkxLZXkgPSBwcmVmaXggKyBJTVBMRU1FTlRBVElPTl9VUkw7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbXBVUkwgPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaW1wVVJMS2V5KSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb24obmFtZSwgc3BlY1ZlcnNpb24sIHNwZWNWZW5kb3IsIGltcFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBWZW5kb3IsIGltcFZlbmRvcklkLCBpbXBVUkwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaW0gdGhlIHN1cHBsaWVkIHN0cmluZyBpZiB0aGUgc3RyaW5nIGlzIG5vbi1udWxsCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB0byB0cmltIG9yIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoZSB0cmltbWVkIHN0cmluZyBvciBudWxsCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRyaW1tZWRTdHJpbmcoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBudWxsID09IHZhbHVlID8gbnVsbCA6IHZhbHVlLnRyaW0oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uQWRhcHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvbkFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjAwYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvbkFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CisKKy8qKgorICogU2ltcGxlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhbiBFeHRlbnNpb24gYW5kIGNvbmZvcm1zIHRvIEFudHMKKyAqIHBhdHRlcm5zLgorICoKKyAqIEBhbnQuZGF0YXR5cGUgbmFtZT0iZXh0ZW5zaW9uIgorICovCitwdWJsaWMgY2xhc3MgRXh0ZW5zaW9uQWRhcHRlciBleHRlbmRzIERhdGFUeXBlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3B0aW9uYWwgcGFja2FnZSBiZWluZyBtYWRlIGF2YWlsYWJsZSwgb3IgcmVxdWlyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXh0ZW5zaW9uTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSB2ZXJzaW9uIG51bWJlciAoZG90dGVkIGRlY2ltYWwgbm90YXRpb24pIG9mIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICogdG8gd2hpY2ggdGhpcyBvcHRpb25hbCBwYWNrYWdlIGNvbmZvcm1zLgorICAgICAqLworICAgIHByaXZhdGUgRGV3ZXlEZWNpbWFsIHNwZWNpZmljYXRpb25WZXJzaW9uOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIHRoYXQgb3JpZ2luYXRlZCB0aGUKKyAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHdoaWNoIHRoaXMgb3B0aW9uYWwgcGFja2FnZSBjb25mb3Jtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVuZG9yOworCisgICAgLyoqCisgICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvZHVjZWQgdGhlIG9wdGlvbmFsCisgICAgICogcGFja2FnZSBjb250YWluZWQgaW4gdGhpcyBKQVIgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbXBsZW1lbnRhdGlvblZlbmRvcklEOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIHRoYXQgcHJvZHVjZWQgdGhpcworICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgb3B0aW9uYWwgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbXBsZW1lbnRhdGlvblZlbmRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSB2ZXJzaW9uIG51bWJlciAoZG90dGVkIGRlY2ltYWwgbm90YXRpb24pIGZvciB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgICogb2YgdGhlIG9wdGlvbmFsIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBEZXdleURlY2ltYWwgaW1wbGVtZW50YXRpb25WZXJzaW9uOworCisgICAgLyoqCisgICAgICogVGhlIFVSTCBmcm9tIHdoaWNoIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHRoaXMgb3B0aW9uYWwgcGFja2FnZQorICAgICAqIGNhbiBiZSBvYnRhaW5lZCBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW1wbGVtZW50YXRpb25VUkw7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvbk5hbWUgdGhlIG5hbWUgb2YgZXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uTmFtZShmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uTmFtZSkgeworICAgICAgICB2ZXJpZnlOb3RBUmVmZXJlbmNlKCk7CisgICAgICAgIHRoaXMuZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzcGVjaWZpY2F0aW9uVmVyc2lvbiBvZiBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BlY2lmaWNhdGlvblZlcnNpb24gdGhlIHNwZWNpZmljYXRpb25WZXJzaW9uIG9mIGV4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNwZWNpZmljYXRpb25WZXJzaW9uKGZpbmFsIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVyc2lvbikgeworICAgICAgICB2ZXJpZnlOb3RBUmVmZXJlbmNlKCk7CisgICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBuZXcgRGV3ZXlEZWNpbWFsKHNwZWNpZmljYXRpb25WZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmljYXRpb25WZW5kb3Igb2YgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNwZWNpZmljYXRpb25WZW5kb3IgdGhlIHNwZWNpZmljYXRpb25WZW5kb3Igb2YgZXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvblZlbmRvcihmaW5hbCBTdHJpbmcgc3BlY2lmaWNhdGlvblZlbmRvcikgeworICAgICAgICB2ZXJpZnlOb3RBUmVmZXJlbmNlKCk7CisgICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlbmRvciA9IHNwZWNpZmljYXRpb25WZW5kb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbXBsZW1lbnRhdGlvblZlbmRvcklEIG9mIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbXBsZW1lbnRhdGlvblZlbmRvcklEIHRoZSBpbXBsZW1lbnRhdGlvblZlbmRvcklEIG9mIGV4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVmVuZG9ySWQoZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVuZG9ySUQpIHsKKyAgICAgICAgdmVyaWZ5Tm90QVJlZmVyZW5jZSgpOworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVmVuZG9ySUQgPSBpbXBsZW1lbnRhdGlvblZlbmRvcklEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW1wbGVtZW50YXRpb25WZW5kb3Igb2YgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGltcGxlbWVudGF0aW9uVmVuZG9yIHRoZSBpbXBsZW1lbnRhdGlvblZlbmRvciBvZiBleHRlbnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvblZlbmRvcihmaW5hbCBTdHJpbmcgaW1wbGVtZW50YXRpb25WZW5kb3IpIHsKKyAgICAgICAgdmVyaWZ5Tm90QVJlZmVyZW5jZSgpOworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVmVuZG9yID0gaW1wbGVtZW50YXRpb25WZW5kb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbXBsZW1lbnRhdGlvblZlcnNpb24gb2YgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGltcGxlbWVudGF0aW9uVmVyc2lvbiB0aGUgaW1wbGVtZW50YXRpb25WZXJzaW9uIG9mIGV4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVmVyc2lvbihmaW5hbCBTdHJpbmcgaW1wbGVtZW50YXRpb25WZXJzaW9uKSB7CisgICAgICAgIHZlcmlmeU5vdEFSZWZlcmVuY2UoKTsKKyAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvblZlcnNpb24gPSBuZXcgRGV3ZXlEZWNpbWFsKGltcGxlbWVudGF0aW9uVmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbXBsZW1lbnRhdGlvblVSTCBvZiBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW1wbGVtZW50YXRpb25VUkwgdGhlIGltcGxlbWVudGF0aW9uVVJMIG9mIGV4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVXJsKGZpbmFsIFN0cmluZyBpbXBsZW1lbnRhdGlvblVSTCkgeworICAgICAgICB2ZXJpZnlOb3RBUmVmZXJlbmNlKCk7CisgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb25VUkwgPSBpbXBsZW1lbnRhdGlvblVSTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGlzIGluc3RhbmNlIGluIGVmZmVjdCBhIHJlZmVyZW5jZSB0byBhbm90aGVyIEV4dGVuc2lvbkFkYXB0ZXIKKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIDxwPllvdSBtdXN0IG5vdCBzZXQgYW5vdGhlciBhdHRyaWJ1dGUgb3IgbmVzdCBlbGVtZW50cyBpbnNpZGUKKyAgICAgKiB0aGlzIGVsZW1lbnQgaWYgeW91IG1ha2UgaXQgYSByZWZlcmVuY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlIHRvIHdoaWNoIHRoaXMgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhpcyBpbnN0YW5jZSBhbHJlYWR5IGhhcyBiZWVuIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoZmluYWwgUmVmZXJlbmNlIHJlZmVyZW5jZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG51bGwgIT0gZXh0ZW5zaW9uTmFtZQorICAgICAgICAgICAgfHwgbnVsbCAhPSBzcGVjaWZpY2F0aW9uVmVyc2lvbgorICAgICAgICAgICAgfHwgbnVsbCAhPSBzcGVjaWZpY2F0aW9uVmVuZG9yCisgICAgICAgICAgICB8fCBudWxsICE9IGltcGxlbWVudGF0aW9uVmVyc2lvbgorICAgICAgICAgICAgfHwgbnVsbCAhPSBpbXBsZW1lbnRhdGlvblZlbmRvcklECisgICAgICAgICAgICB8fCBudWxsICE9IGltcGxlbWVudGF0aW9uVmVuZG9yCisgICAgICAgICAgICB8fCBudWxsICE9IGltcGxlbWVudGF0aW9uVVJMKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIC8vIGNoYW5nZSB0aGlzIHRvIGdldCB0aGUgb2JqZWN0cyBmcm9tIHRoZSBvdGhlciByZWZlcmVuY2UKKyAgICAgICAgT2JqZWN0IG8gPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZE9iamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEV4dGVuc2lvbkFkYXB0ZXIpIHsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbkFkYXB0ZXIgb3RoZXIgPSAoRXh0ZW5zaW9uQWRhcHRlcikgbzsKKyAgICAgICAgICAgIGV4dGVuc2lvbk5hbWUgPSBvdGhlci5leHRlbnNpb25OYW1lOworICAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlcnNpb24gPSBvdGhlci5zcGVjaWZpY2F0aW9uVmVyc2lvbjsKKyAgICAgICAgICAgIHNwZWNpZmljYXRpb25WZW5kb3IgPSBvdGhlci5zcGVjaWZpY2F0aW9uVmVuZG9yOworICAgICAgICAgICAgaW1wbGVtZW50YXRpb25WZXJzaW9uID0gb3RoZXIuaW1wbGVtZW50YXRpb25WZXJzaW9uOworICAgICAgICAgICAgaW1wbGVtZW50YXRpb25WZW5kb3JJRCA9IG90aGVyLmltcGxlbWVudGF0aW9uVmVuZG9ySUQ7CisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvblZlbmRvciA9IG90aGVyLmltcGxlbWVudGF0aW9uVmVuZG9yOworICAgICAgICAgICAgaW1wbGVtZW50YXRpb25VUkwgPSBvdGhlci5pbXBsZW1lbnRhdGlvblVSTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZWZlcmVuY2UuZ2V0UmVmSWQoKSArICIgZG9lc25cJ3QgcmVmZXIgdG8gYSBFeHRlbnNpb24iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuc2V0UmVmaWQocmVmZXJlbmNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Tm90QVJlZmVyZW5jZSgpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGlzIGFkcGF0ZXIgb2JqZWN0IGludG8gYW4gZXh0ZW5zaW9uIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbiBvYmplY3QKKyAgICAgKi8KKyAgICBFeHRlbnNpb24gdG9FeHRlbnNpb24oKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAobnVsbCA9PSBleHRlbnNpb25OYW1lKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJFeHRlbnNpb24gaXMgbWlzc2luZyBuYW1lLiI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgc3BlY2lmaWNhdGlvblZlcnNpb25TdHJpbmcgPSBudWxsOworICAgICAgICBpZiAobnVsbCAhPSBzcGVjaWZpY2F0aW9uVmVyc2lvbikgeworICAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlcnNpb25TdHJpbmcgPSBzcGVjaWZpY2F0aW9uVmVyc2lvbi50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBpbXBsZW1lbnRhdGlvblZlcnNpb25TdHJpbmcgPSBudWxsOworICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblZlcnNpb24pIHsKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9uVmVyc2lvblN0cmluZyA9IGltcGxlbWVudGF0aW9uVmVyc2lvbi50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVyc2lvblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb25WZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvblZlcnNpb25TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvblZlbmRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uVmVuZG9ySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvblVSTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYSBkZWJ1ZyB0b1N0cmluZyBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIGluIGEgc3RyaW5nLgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJ7IiArIHRvRXh0ZW5zaW9uKCkudG9TdHJpbmcoKSArICJ9IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uUmVzb2x2ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb25SZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTUwNjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIEludGVyZmFjZSB0byBsb2NhdGUgYSBGaWxlIHRoYXQgc2F0aXNmaWVzIGV4dGVuc2lvbi4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uUmVzb2x2ZXIgeworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gbG9jYXRlIEZpbGUgdGhhdCBzYXRpc2ZpZXMKKyAgICAgKiBleHRlbnNpb24gdmlhIHJlc29sdmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIEFudCBwcm9qZWN0IGluc3RhbmNlCisgICAgICogQHJldHVybiB0aGUgRmlsZSBzYXRpc2Z5aW5nIGV4dGVuc2lvbiwgbnVsbAorICAgICAqICAgICAgICAgaWYgY2FuIG5vdCByZXNvbHZlIGV4dGVuc2lvbgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgZXJyb3Igb2NjdXJzIGF0dGVtcHRpbmcgdG8KKyAgICAgKiAgICAgICAgIHJlc29sdmUgZXh0ZW5zaW9uCisgICAgICovCisgICAgRmlsZSByZXNvbHZlKEV4dGVuc2lvbiBleHRlbnNpb24sIFByb2plY3QgcHJvamVjdCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblNldC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWYwOTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uU2V0LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CisKKy8qKgorICogVGhlIEV4dGVuc2lvbiBzZXQgbGlzdHMgYSBzZXQgb2YgIk9wdGlvbmFsIFBhY2thZ2VzIiAvCisgKiAiRXh0ZW5zaW9ucyIuCisgKgorICogQGFudC5kYXRhdHlwZSBuYW1lPSJleHRlbnNpb24tc2V0IgorICovCitwdWJsaWMgY2xhc3MgRXh0ZW5zaW9uU2V0CisgICAgZXh0ZW5kcyBEYXRhVHlwZSB7CisgICAgLyoqCisgICAgICogRXh0ZW5zaW9uQWRhcHRlciBvYmplY3RzIHJlcHJlc2VudGluZyBleHRlbnNpb25zLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBGaWxlc2V0cyBzcGVjaWZ5aW5nIGFsbCB0aGUgZXh0ZW5zaW9ucyB3YW50ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3QgZXh0ZW5zaW9uc0ZpbGVzZXRzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogQWRkcyBhbiBleHRlbnNpb24gdGhhdCB0aGlzIGxpYnJhcnkgcmVxdWlyZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uQWRhcHRlciBhbiBleHRlbnNpb24gdGhhdCB0aGlzIGxpYnJhcnkgcmVxdWlyZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKGZpbmFsIEV4dGVuc2lvbkFkYXB0ZXIgZXh0ZW5zaW9uQWRhcHRlcikgeworICAgICAgICBleHRlbnNpb25zLmFkZChleHRlbnNpb25BZGFwdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIGFib3V0IHdoaWNoIGV4dGVuc2lvbnMgZGF0YSB3aWxsIGJlIGV4dHJhY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlU2V0IGEgc2V0IG9mIGZpbGVzIGFib3V0IHdoaWNoIGV4dGVuc2lvbnMgZGF0YSB3aWxsIGJlIGV4dHJhY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWJmaWxlc2V0KGZpbmFsIExpYkZpbGVTZXQgZmlsZVNldCkgeworICAgICAgICBleHRlbnNpb25zRmlsZXNldHMuYWRkKGZpbGVTZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgYWJvdXQgd2hpY2ggZXh0ZW5zaW9ucyBkYXRhIHdpbGwgYmUgZXh0cmFjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVTZXQgYSBzZXQgb2YgZmlsZXMgYWJvdXQgd2hpY2ggZXh0ZW5zaW9ucyBkYXRhIHdpbGwgYmUgZXh0cmFjdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoZmluYWwgRmlsZVNldCBmaWxlU2V0KSB7CisgICAgICAgIGV4dGVuc2lvbnNGaWxlc2V0cy5hZGQoZmlsZVNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhIHNldCBvZiBFeHRlbnNpb24gb2JqZWN0cyBmcm9tIHRoZSBFeHRlbnNpb25TZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvaiB0aGUgcHJvamVjdCBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIEV4dGVuc2lvbnMgZnJvbSB0aGlzIHNldAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEV4dGVuc2lvbltdIHRvRXh0ZW5zaW9ucyhmaW5hbCBQcm9qZWN0IHByb2opCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdCBleHRlbnNpb25zTGlzdCA9IEV4dGVuc2lvblV0aWwudG9FeHRlbnNpb25zKGV4dGVuc2lvbnMpOworICAgICAgICBFeHRlbnNpb25VdGlsLmV4dHJhY3RFeHRlbnNpb25zKHByb2osIGV4dGVuc2lvbnNMaXN0LCBleHRlbnNpb25zRmlsZXNldHMpOworICAgICAgICByZXR1cm4gKEV4dGVuc2lvbltdKSBleHRlbnNpb25zTGlzdC50b0FycmF5KG5ldyBFeHRlbnNpb25bZXh0ZW5zaW9uc0xpc3Quc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgdGhpcyBpbnN0YW5jZSBpbiBlZmZlY3QgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBFeHRlbnNpb25TZXQKKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIDxwPllvdSBtdXN0IG5vdCBzZXQgYW5vdGhlciBhdHRyaWJ1dGUgb3IgbmVzdCBlbGVtZW50cyBpbnNpZGUKKyAgICAgKiB0aGlzIGVsZW1lbnQgaWYgeW91IG1ha2UgaXQgYSByZWZlcmVuY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlIHRvIHdoaWNoIHRoaXMgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhpcyBpbnN0YW5jZSBhbHJlYWR5IGhhcyBiZWVuIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoZmluYWwgUmVmZXJlbmNlIHJlZmVyZW5jZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFleHRlbnNpb25zLmlzRW1wdHkoKSB8fCAhZXh0ZW5zaW9uc0ZpbGVzZXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGFuZ2UgdGhpcyB0byBnZXQgdGhlIG9iamVjdHMgZnJvbSB0aGUgb3RoZXIgcmVmZXJlbmNlCisgICAgICAgIGZpbmFsIE9iamVjdCBvYmplY3QgPQorICAgICAgICAgICAgcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRPYmplY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2lvblNldCkgeworICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uU2V0IG90aGVyID0gKEV4dGVuc2lvblNldCkgb2JqZWN0OworICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGRBbGwob3RoZXIuZXh0ZW5zaW9ucyk7CisgICAgICAgICAgICBleHRlbnNpb25zRmlsZXNldHMuYWRkQWxsKG90aGVyLmV4dGVuc2lvbnNGaWxlc2V0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVmZXJlbmNlLmdldFJlZklkKCkgKyAiIGRvZXNuXCd0IHJlZmVyIHRvIGEgRXh0ZW5zaW9uU2V0IjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnNldFJlZmlkKHJlZmVyZW5jZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnNpb25zIGluIGEgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiRXh0ZW5zaW9uU2V0IiArIEFycmF5cy5hc0xpc3QodG9FeHRlbnNpb25zKGdldFByb2plY3QoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb25VdGlsLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OWM3ODkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uVXRpbC5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CisKKy8qKgorICogQSBzZXQgb2YgdXNlZnVsIG1ldGhvZHMgcmVsYXRpbmcgdG8gZXh0ZW5zaW9ucy4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHRlbnNpb25VdGlsIHsKKyAgICAvKioKKyAgICAgKiBDbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgRXh0ZW5zaW9uVXRpbCgpIHsKKyAgICAgICAgLy9hbGwgbWV0aG9kcyBzdGF0aWMKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgbGlzdCBvZiBleHRlbnNpb25BZGFwdGVyIG9iamVjdHMgdG8gZXh0ZW5zaW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVycyB0aGUgbGlzdCBvZiBFeHRlbnNpb25BZGFwdGVyc3MgdG8gYWRkIHRvIGNvbnZlcnQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHN0YXRpYyBBcnJheUxpc3QgdG9FeHRlbnNpb25zKGZpbmFsIExpc3QgYWRhcHRlcnMpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGZpbmFsIGludCBzaXplID0gYWRhcHRlcnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uQWRhcHRlciBhZGFwdGVyID0KKyAgICAgICAgICAgICAgICAoRXh0ZW5zaW9uQWRhcHRlcikgYWRhcHRlcnMuZ2V0KGkpOworICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGFkYXB0ZXIudG9FeHRlbnNpb24oKTsKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKGV4dGVuc2lvbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBhIGxpc3Qgb2YgZXh0ZW5zaW9ucyBmcm9tIGEgc3BlY2lmaWVkIGZpbGVzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlicmFyaWVzIHRoZSBsaXN0IHRvIGFkZCBleHRlbnNpb25zIHRvCisgICAgICogQHBhcmFtIGZpbGVzZXQgdGhlIGZpbGVzZXRzIGNvbnRhaW5pbmcgbGlicmFyeXMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHN0YXRpYyB2b2lkIGV4dHJhY3RFeHRlbnNpb25zKGZpbmFsIFByb2plY3QgcHJvamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdCBsaWJyYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3QgZmlsZXNldCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFmaWxlc2V0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMocHJvamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc2V0KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGxpYnJhcmllcy5hZGQoZXh0ZW5zaW9uc1sgaSBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGV4dGVuc2lvbnMgZnJvbSB0aGUgc3BlY2lmaWVkIGxpYnJhcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaWJyYXJpZXMgdGhlIGZpbGVzZXRzIGZvciBsaWJyYXJpZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnNpb25zIGNvbnRhaW5lZCBpbiBsaWJyYXJpZXMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGZhaWxpbmcgdG8gc2NhbiBsaWJyYXJpZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBFeHRlbnNpb25bXSBnZXRFeHRlbnNpb25zKGZpbmFsIFByb2plY3QgcHJvamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGxpYnJhcmllcykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlicmFyaWVzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEZpbGVTZXQgZmlsZVNldCA9IChGaWxlU2V0KSBpdGVyYXRvci5uZXh0KCk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZUltcGwgPSB0cnVlOworICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlVVJMID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKGZpbGVTZXQgaW5zdGFuY2VvZiBMaWJGaWxlU2V0KSB7CisgICAgICAgICAgICAgICAgTGliRmlsZVNldCBsaWJGaWxlU2V0ID0gKExpYkZpbGVTZXQpIGZpbGVTZXQ7CisgICAgICAgICAgICAgICAgaW5jbHVkZUltcGwgPSBsaWJGaWxlU2V0LmlzSW5jbHVkZUltcGwoKTsKKyAgICAgICAgICAgICAgICBpbmNsdWRlVVJMID0gbGliRmlsZVNldC5pc0luY2x1ZGVVUkwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gZmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOworICAgICAgICAgICAgZmluYWwgRmlsZSBiYXNlZGlyID0gc2Nhbm5lci5nZXRCYXNlZGlyKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGJhc2VkaXIsIGZpbGVzWyBpIF0pOworICAgICAgICAgICAgICAgIGxvYWRFeHRlbnNpb25zKGZpbGUsIGV4dGVuc2lvbnMsIGluY2x1ZGVJbXBsLCBpbmNsdWRlVVJMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEV4dGVuc2lvbltdKSBleHRlbnNpb25zLnRvQXJyYXkobmV3IEV4dGVuc2lvbltleHRlbnNpb25zLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgbGlzdCBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucyBmcm9tIHNwZWNpZmllZCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uTGlzdCB0aGUgbGlzdCB0byBhZGQgYXZhaWxhYmxlIGV4dGVuc2lvbnMgdG8KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkRXh0ZW5zaW9ucyhmaW5hbCBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdCBleHRlbnNpb25MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5jbHVkZUltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbmNsdWRlVVJMKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSk7CisgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25bXSBleHRlbnNpb25zID0KKyAgICAgICAgICAgICAgICBFeHRlbnNpb24uZ2V0QXZhaWxhYmxlKGphckZpbGUuZ2V0TWFuaWZlc3QoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1sgaSBdOworICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbihleHRlbnNpb25MaXN0LCBleHRlbnNpb24sIGluY2x1ZGVJbXBsLCBpbmNsdWRlVVJMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgZXh0ZW5zaW9uIHRvIGxpc3QuCisgICAgICogSWYgZXh0ZW5zaW9uIHNob3VsZCBub3QgaGF2ZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGJ1dAorICAgICAqIGRvZXMgc3RyaXAgdGhlbS4gSWYgZXh0ZW5zaW9uIHNob3VsZCBub3QgaGF2ZSB1cmwgYnV0IGRvZXMKKyAgICAgKiB0aGVuIHN0cmlwIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvbkxpc3QgdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyB0byBhZGQgdG8KKyAgICAgKiBAcGFyYW0gb3JpZ2luYWxFeHRlbnNpb24gdGhlIGV4dGVuc2lvbgorICAgICAqIEBwYXJhbSBpbmNsdWRlSW1wbCBmYWxzZSB0byBleGNsdWRlIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAgICAgKiBAcGFyYW0gaW5jbHVkZVVSTCBmYWxzZSB0byBleGNsdWRlIGltcGxlbWVudGF0aW9uIFVSTAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkRXh0ZW5zaW9uKGZpbmFsIExpc3QgZXh0ZW5zaW9uTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uIG9yaWdpbmFsRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGluY2x1ZGVJbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGluY2x1ZGVVUkwpIHsKKyAgICAgICAgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IG9yaWdpbmFsRXh0ZW5zaW9uOworICAgICAgICBpZiAoIWluY2x1ZGVVUkwKKyAgICAgICAgICAgICYmIG51bGwgIT0gZXh0ZW5zaW9uLmdldEltcGxlbWVudGF0aW9uVVJMKCkpIHsKKyAgICAgICAgICAgIGV4dGVuc2lvbiA9CisgICAgICAgICAgICAgICAgbmV3IEV4dGVuc2lvbihleHRlbnNpb24uZ2V0RXh0ZW5zaW9uTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nZXRTcGVjaWZpY2F0aW9uVmVyc2lvbigpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldFNwZWNpZmljYXRpb25WZW5kb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0SW1wbGVtZW50YXRpb25WZW5kb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0SW1wbGVtZW50YXRpb25WZW5kb3JJRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNJbXBsQXR0cmlidXRlcyA9CisgICAgICAgICAgICBudWxsICE9IGV4dGVuc2lvbi5nZXRJbXBsZW1lbnRhdGlvblVSTCgpCisgICAgICAgICAgICB8fCBudWxsICE9IGV4dGVuc2lvbi5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKQorICAgICAgICAgICAgfHwgbnVsbCAhPSBleHRlbnNpb24uZ2V0SW1wbGVtZW50YXRpb25WZW5kb3JJRCgpCisgICAgICAgICAgICB8fCBudWxsICE9IGV4dGVuc2lvbi5nZXRJbXBsZW1lbnRhdGlvblZlbmRvcigpOworCisgICAgICAgIGlmICghaW5jbHVkZUltcGwgJiYgaGFzSW1wbEF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGV4dGVuc2lvbiA9CisgICAgICAgICAgICAgICAgbmV3IEV4dGVuc2lvbihleHRlbnNpb24uZ2V0RXh0ZW5zaW9uTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nZXRTcGVjaWZpY2F0aW9uVmVyc2lvbigpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldFNwZWNpZmljYXRpb25WZW5kb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0SW1wbGVtZW50YXRpb25VUkwoKSk7CisgICAgICAgIH0KKworICAgICAgICBleHRlbnNpb25MaXN0LmFkZChleHRlbnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIG1hbmlmZXN0IGZvciBzcGVjaWZpZWQgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlCisgICAgICogQHJldHVybiB0aGUgbWFuaWZlc3QKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGVycnJvciBvY2N1cnMgKGZpbGUgZG9lc24ndCBleGlzdCwKKyAgICAgKiAgICAgICAgIGZpbGUgbm90IGEgamFyLCBtYW5pZmVzdCBkb2Vzbid0IGV4aXN0IGluIGZpbGUpCisgICAgICovCisgICAgc3RhdGljIE1hbmlmZXN0IGdldE1hbmlmZXN0KGZpbmFsIEZpbGUgZmlsZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEphckZpbGUgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGZpbGUpOworICAgICAgICAgICAgTWFuaWZlc3QgbSA9IGphckZpbGUuZ2V0TWFuaWZlc3QoKTsKKyAgICAgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZmlsZSArICIgZG9lc24ndCBoYXZlIGEgTUFOSUZFU1QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpLCBpb2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dHJhQXR0cmlidXRlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0cmFBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTJiZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dHJhQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGUgaG9sZGVyIGZvciBleHRyYSBhdHRyaWJ1dGVzIGluIG1haW4gc2VjdGlvbiBvZiBtYW5pZmVzdC4KKyAqCisgKiBAdG9kbyBSZWZhY3RvciB0aGlzIGFuZCBhbGwgdGhlIG90aGVyIHBhcmFtZXRlciwgc3lzcHJvcGVydHksCisgKiAgIHByb3BlcnR5IGV0YyBpbnRvIGEgc2luZ2xlIGNsYXNzIGluIGZyYW1ld29yaworICovCitwdWJsaWMgY2xhc3MgRXh0cmFBdHRyaWJ1dGUgeworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHBhcmFtZXRlciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgbmFtZSBvZiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHZhbHVlIG9mIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgdGhhdCBuZWl0aGVyIHRoZSBuYW1lIG9yIHRoZSB2YWx1ZQorICAgICAqIGlzIG51bGwuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGUgaXMgaW52YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IG5hbWUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIk1pc3NpbmcgbmFtZSBmcm9tIHBhcmFtZXRlci4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9IGVsc2UgaWYgKG51bGwgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIk1pc3NpbmcgdmFsdWUgZnJvbSBwYXJhbWV0ZXIgIiArIG5hbWUgKyAiLiI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliQXZhaWxhYmxlVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0phckxpYkF2YWlsYWJsZVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzg3YmUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0phckxpYkF2YWlsYWJsZVRhc2suamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGFuIGV4dGVuc2lvbiBpcyBwcmVzZW50IGluIGEgZmlsZXNldCBvciBhbiBleHRlbnNpb25TZXQuCisgKgorICogQGFudC50YXNrIG5hbWU9ImphcmxpYi1hdmFpbGFibGUiCisgKi8KK3B1YmxpYyBjbGFzcyBKYXJMaWJBdmFpbGFibGVUYXNrIGV4dGVuZHMgVGFzayB7CisgICAgLyoqCisgICAgICogVGhlIGxpYnJhcnkgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgbGlicmFyeUZpbGU7CisKKyAgICAvKioKKyAgICAgKiBGaWxlc2V0cyBzcGVjaWZ5aW5nIGFsbCB0aGUgbGlicmFyeXMKKyAgICAgKiB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVmVjdG9yIGV4dGVuc2lvbkZpbGVTZXRzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCBpZiBleHRlbnNpb24gaXMgYXZhaWxhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBleHRlbnNpb24gdGhhdCBpcyByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEV4dGVuc2lvbkFkYXB0ZXIgcmVxdWlyZWRFeHRlbnNpb247CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiBwcm9wZXJ0eSB0byBzZXQgaWYgZXh0ZW5zaW9ucyBhcmUgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldCBpZiBleHRlbnNpb25zIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSkFSIGxpYnJhcnkgdG8gY2hlY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBUaGUgamFyIGxpYnJhcnkgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5saWJyYXJ5RmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBFeHRlbnNpb24gbG9va2luZyBmb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIFNldCB0aGUgRXh0ZW5zaW9uIGxvb2tpbmcgZm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRFeHRlbnNpb24oZmluYWwgRXh0ZW5zaW9uQWRhcHRlciBleHRlbnNpb24pIHsKKyAgICAgICAgaWYgKG51bGwgIT0gcmVxdWlyZWRFeHRlbnNpb24pIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkNhbiBub3Qgc3BlY2lmeSBleHRlbnNpb24gdG8gIgorICAgICAgICAgICAgICAgICsgInNlYXJjaCBmb3IgbXVsdGlwbGUgdGltZXMuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICByZXF1aXJlZEV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIGV4dGVuc2lvbnMgdG8gc2VhcmNoIGluLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvblNldCBhIHNldCBvZiBleHRlbnNpb25zIHRvIHNlYXJjaCBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkRXh0ZW5zaW9uU2V0KGZpbmFsIEV4dGVuc2lvblNldCBleHRlbnNpb25TZXQpIHsKKyAgICAgICAgZXh0ZW5zaW9uRmlsZVNldHMuYWRkRWxlbWVudChleHRlbnNpb25TZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHRhc2suCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGlnbiBnb2VzIHdyb25nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIGZpbmFsIEV4dGVuc2lvbiB0ZXN0ID0gcmVxdWlyZWRFeHRlbnNpb24udG9FeHRlbnNpb24oKTsKKworICAgICAgICAvLyBDaGVjayBpZiBsaXN0IG9mIGZpbGVzIHRvIGNoZWNrIGhhcyBiZWVuIHNwZWNpZmllZAorICAgICAgICBpZiAoIWV4dGVuc2lvbkZpbGVTZXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRlbnNpb25GaWxlU2V0cy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblNldCBleHRlbnNpb25TZXQKKyAgICAgICAgICAgICAgICAgICAgPSAoRXh0ZW5zaW9uU2V0KSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9CisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNldC50b0V4dGVuc2lvbnMoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0NvbXBhdGlibGVXaXRoKHRlc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHlOYW1lLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgTWFuaWZlc3QgbWFuaWZlc3QgPSBFeHRlbnNpb25VdGlsLmdldE1hbmlmZXN0KGxpYnJhcnlGaWxlKTsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBFeHRlbnNpb24uZ2V0QXZhaWxhYmxlKG1hbmlmZXN0KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zWyBpIF07CisgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0NvbXBhdGlibGVXaXRoKHRlc3QpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHRhc2tzIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGludmFsaWQgcGFyYW1ldGVycyBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IHJlcXVpcmVkRXh0ZW5zaW9uKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJFeHRlbnNpb24gZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgPT0gbGlicmFyeUZpbGUgJiYgZXh0ZW5zaW9uRmlsZVNldHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJGaWxlIGF0dHJpYnV0ZSBub3Qgc3BlY2lmaWVkLiI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgIT0gbGlicmFyeUZpbGUgJiYgIWxpYnJhcnlGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJGaWxlICciICsgbGlicmFyeUZpbGUgKyAiJyBkb2VzIG5vdCBleGlzdC4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IGxpYnJhcnlGaWxlICYmICFsaWJyYXJ5RmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiXCciICsgbGlicmFyeUZpbGUgKyAiXCcgaXMgbm90IGEgZmlsZS4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0phckxpYkRpc3BsYXlUYXNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliRGlzcGxheVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVjM2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0phckxpYkRpc3BsYXlUYXNrLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworCisvKioKKyAqIERpc3BsYXlzIHRoZSAiT3B0aW9uYWwgUGFja2FnZSIgYW5kICJQYWNrYWdlIFNwZWNpZmljYXRpb24iIGluZm9ybWF0aW9uCisgKiBjb250YWluZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgSkFScy4KKyAqCisgKiA8cD5QcmlvciB0byBKREsxLjMsIGFuICJPcHRpb25hbCBQYWNrYWdlIiB3YXMga25vd24gYXMgYW4gRXh0ZW5zaW9uLgorICogVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSBpbiB0aGUgSkRLMS4zCisgKiBkb2N1bWVudGF0aW9uIGluIHRoZSBkaXJlY3RvcnkKKyAqICRKREtfSE9NRS9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sLiBBbHRlcm5hdGl2ZWx5IGl0IGlzCisgKiBhdmFpbGFibGUgb25saW5lIGF0IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCI+CisgKiBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2E+LjwvcD4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0iamFybGliLWRpc3BsYXkiCisgKi8KK3B1YmxpYyBjbGFzcyBKYXJMaWJEaXNwbGF5VGFzayBleHRlbmRzIFRhc2sgeworICAgIC8qKgorICAgICAqIFRoZSBsaWJyYXJ5IHRvIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGxpYnJhcnlGaWxlOworCisgICAgLyoqCisgICAgICogRmlsZXNldHMgc3BlY2lmeWluZyBhbGwgdGhlIGxpYnJhcnlzCisgICAgICogdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvciBsaWJyYXJ5RmlsZVNldHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSkFSIGxpYnJhcnkgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBmb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBUaGUgamFyIGxpYnJhcnkgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBmb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5saWJyYXJ5RmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHNldCBvZiBmaWxlcyBhYm91dCB3aGljaCBsaWJyYXJ5IGRhdGEgd2lsbCBiZSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZVNldCBhIHNldCBvZiBmaWxlcyBhYm91dCB3aGljaCBsaWJyYXJ5IGRhdGEgd2lsbCBiZSBkaXNwbGF5ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChmaW5hbCBGaWxlU2V0IGZpbGVTZXQpIHsKKyAgICAgICAgbGlicmFyeUZpbGVTZXRzLmFkZEVsZW1lbnQoZmlsZVNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHRhc2sgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhbGlkYXRlKCk7CisKKyAgICAgICAgZmluYWwgTGlicmFyeURpc3BsYXllciBkaXNwbGF5ZXIgPSBuZXcgTGlicmFyeURpc3BsYXllcigpOworICAgICAgICAvLyBDaGVjayBpZiBsaXN0IG9mIGZpbGVzIHRvIGNoZWNrIGhhcyBiZWVuIHNwZWNpZmllZAorICAgICAgICBpZiAoIWxpYnJhcnlGaWxlU2V0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlicmFyeUZpbGVTZXRzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZVNldCBmaWxlU2V0ID0gKEZpbGVTZXQpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIKKyAgICAgICAgICAgICAgICAgICAgPSBmaWxlU2V0LmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBzY2FubmVyLmdldEJhc2VkaXIoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoYmFzZWRpciwgZmlsZXNbIGkgXSk7CisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllci5kaXNwbGF5TGlicmFyeShmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXNwbGF5ZXIuZGlzcGxheUxpYnJhcnkobGlicmFyeUZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHRhc2tzIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGludmFsaWQgcGFyYW1ldGVycyBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IGxpYnJhcnlGaWxlICYmIGxpYnJhcnlGaWxlU2V0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkZpbGUgYXR0cmlidXRlIG5vdCBzcGVjaWZpZWQuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCAhPSBsaWJyYXJ5RmlsZSAmJiAhbGlicmFyeUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkZpbGUgJyIgKyBsaWJyYXJ5RmlsZSArICInIGRvZXMgbm90IGV4aXN0LiI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgIT0gbGlicmFyeUZpbGUgJiYgIWxpYnJhcnlGaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJcJyIgKyBsaWJyYXJ5RmlsZSArICJcJyBpcyBub3QgYSBmaWxlLiI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliTWFuaWZlc3RUYXNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliTWFuaWZlc3RUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiMjRhMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9KYXJMaWJNYW5pZmVzdFRhc2suamF2YQpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogR2VuZXJhdGVzIGEgbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyBhbGwgdGhlIGRlcGVuZGVuY2llcy4KKyAqIFRoZSBkZXBlbmRlbmNpZXMgYXJlIGRldGVybWluZWQgYnkgbG9va2luZyBpbiB0aGUKKyAqIHNwZWNpZmllZCBwYXRoIGFuZCBzZWFyY2hpbmcgZm9yIEV4dGVuc2lvbiAvICJPcHRpb25hbCBQYWNrYWdlIgorICogc3BlY2lmaWNhdGlvbnMgaW4gdGhlIG1hbmlmZXN0cyBvZiB0aGUgamFycy4KKyAqCisgKiA8cD5QcmlvciB0byBKREsxLjMsIGFuICJPcHRpb25hbCBQYWNrYWdlIiB3YXMga25vd24gYXMgYW4gRXh0ZW5zaW9uLgorICogVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSBpbiB0aGUgSkRLMS4zCisgKiBkb2N1bWVudGF0aW9uIGluIHRoZSBkaXJlY3RvcnkKKyAqICRKREtfSE9NRS9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sLiBBbHRlcm5hdGl2ZWx5IGl0IGlzCisgKiBhdmFpbGFibGUgb25saW5lIGF0IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCI+CisgKiBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2E+LjwvcD4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0iamFybGliLW1hbmlmZXN0IgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSmFyTGliTWFuaWZlc3RUYXNrIGV4dGVuZHMgVGFzayB7CisgICAgLyoqCisgICAgICogVmVyc2lvbiBvZiBtYW5pZmVzdCBzcGVjIHRoYXQgdGFzayBnZW5lcmF0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX1ZFUlNJT04gPSAiMS4wIjsKKworICAgIC8qKgorICAgICAqICJDcmVhdGVkLUJ5IiBzdHJpbmcgdXNlZCB3aGVuIGNyZWF0aW5nIG1hbmlmZXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVEX0JZID0gIkNyZWF0ZWQtQnkiOworCisgICAgLyoqCisgICAgICogVGhlIGxpYnJhcnkgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZGVzdEZpbGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXh0ZW5zaW9uIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkgKGlmIGFueSkuCisgICAgICovCisgICAgcHJpdmF0ZSBFeHRlbnNpb24gZXh0ZW5zaW9uOworCisgICAgLyoqCisgICAgICogRXh0ZW5zaW9uQWRhcHRlciBvYmplY3RzIHJlcHJlc2VudGluZworICAgICAqIGRlcGVuZGVuY2llcyByZXF1aXJlZCBieSBsaWJyYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0IGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIC8qKgorICAgICAqIEV4dGVuc2lvbkFkYXB0ZXIgb2JqZWN0cyByZXByZXNlbnRpbmcgb3B0aW9uYWwKKyAgICAgKiBkZXBlbmRlbmNpZXMgcmVxdWlyZWQgYnkgbGlicmFyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdCBvcHRpb25hbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBFeHRyYSBhdHRyaWJ1dGVzIHRoZSB1c2VyIHNwZWNpZmllcyBmb3IgbWFpbiBzZWN0aW9uCisgICAgICogaW4gbWFuaWZlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3QgZXh0cmFBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogVGhlIGxvY2F0aW9uIHdoZXJlIGdlbmVyYXRlZCBtYW5pZmVzdCBpcyBwbGFjZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgVGhlIGxvY2F0aW9uIHdoZXJlIGdlbmVyYXRlZCBtYW5pZmVzdCBpcyBwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGZpbGUoZmluYWwgRmlsZSBkZXN0RmlsZSkgeworICAgICAgICB0aGlzLmRlc3RGaWxlID0gZGVzdEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBleHRlbnNpb24gdGhhdCB0aGlzIGxpYnJhcnkgaW1wbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRlbnNpb25BZGFwdGVyIGFuIGV4dGVuc2lvbiB0aGF0IHRoaXMgbGlicmFyeSBpbXBsZW1lbnRzLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBtdWx0aXBsZSBleHRlbnNpb25zIGRldGVjdGVkCisgICAgICogICAgICAgICBpbiB0aGUgbGlicmFyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkRXh0ZW5zaW9uKGZpbmFsIEV4dGVuc2lvbkFkYXB0ZXIgZXh0ZW5zaW9uQWRhcHRlcikKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsICE9IGV4dGVuc2lvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4gbm90IGhhdmUgbXVsdGlwbGUgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIG9uZSBsaWJyYXJ5LiIpOworICAgICAgICB9CisgICAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbkFkYXB0ZXIudG9FeHRlbnNpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIGV4dGVuc2lvbnMgdGhhdCB0aGlzIGxpYnJhcnkgcmVxdWlyZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uU2V0IGEgc2V0IG9mIGV4dGVuc2lvbnMgdGhhdCB0aGlzIGxpYnJhcnkgcmVxdWlyZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZERlcGVuZHMoZmluYWwgRXh0ZW5zaW9uU2V0IGV4dGVuc2lvblNldCkgeworICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGV4dGVuc2lvblNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHNldCBvZiBleHRlbnNpb25zIHRoYXQgdGhpcyBsaWJyYXJ5IG9wdGlvbmFsbHkgcmVxdWlyZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uU2V0IGEgc2V0IG9mIGV4dGVuc2lvbnMgdGhhdCB0aGlzIGxpYnJhcnkgb3B0aW9uYWxseSByZXF1aXJlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkT3B0aW9ucyhmaW5hbCBFeHRlbnNpb25TZXQgZXh0ZW5zaW9uU2V0KSB7CisgICAgICAgIG9wdGlvbmFscy5hZGQoZXh0ZW5zaW9uU2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGF0dHJpYnV0ZSB0aGF0IGlzIHRvIGJlIHB1dCBpbiBtYWluIHNlY3Rpb24gb2YgbWFuaWZlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlIGFuIGF0dHJpYnV0ZSB0aGF0IGlzIHRvIGJlIHB1dCBpbiBtYWluIHNlY3Rpb24gb2YgbWFuaWZlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEF0dHJpYnV0ZShmaW5hbCBFeHRyYUF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKyAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHRhc2suCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSB0YXNrIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIGZpbmFsIE1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KCk7CisgICAgICAgIGZpbmFsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgYXR0cmlidXRlcy5wdXQoQXR0cmlidXRlcy5OYW1lLk1BTklGRVNUX1ZFUlNJT04sIE1BTklGRVNUX1ZFUlNJT04pOworICAgICAgICBhdHRyaWJ1dGVzLnB1dFZhbHVlKENSRUFURURfQlksICJBcGFjaGUgQW50ICIKKyAgICAgICAgICAgICAgICArIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9WRVJTSU9OKSk7CisKKyAgICAgICAgYXBwZW5kRXh0cmFBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworCisgICAgICAgIGlmIChudWxsICE9IGV4dGVuc2lvbikgeworICAgICAgICAgICAgRXh0ZW5zaW9uLmFkZEV4dGVuc2lvbihleHRlbnNpb24sIGF0dHJpYnV0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy9BZGQgYWxsIHRoZSBkZXBlbmRlbmN5IGRhdGEgdG8gbWFuaWZlc3QgZm9yIGRlcGVuZGVuY2llcworICAgICAgICBmaW5hbCBBcnJheUxpc3QgZGVwZW5kcyA9IHRvRXh0ZW5zaW9ucyhkZXBlbmRlbmNpZXMpOworICAgICAgICBhcHBlbmRFeHRlbnNpb25MaXN0KGF0dHJpYnV0ZXMsIEV4dGVuc2lvbi5FWFRFTlNJT05fTElTVCwgImxpYiIsIGRlcGVuZHMuc2l6ZSgpKTsKKyAgICAgICAgYXBwZW5kTGlicmFyeUxpc3QoYXR0cmlidXRlcywgImxpYiIsIGRlcGVuZHMpOworCisgICAgICAgIC8vIEFkZCBhbGwgdGhlIGRlcGVuZGVuY3kgZGF0YSB0byBtYW5pZmVzdCBmb3IgIm9wdGlvbmFsIgorICAgICAgICAvL2RlcGVuZGVuY2llcworICAgICAgICBmaW5hbCBBcnJheUxpc3Qgb3B0aW9uID0gdG9FeHRlbnNpb25zKG9wdGlvbmFscyk7CisgICAgICAgIGFwcGVuZEV4dGVuc2lvbkxpc3QoYXR0cmlidXRlcywgRXh0ZW5zaW9uLk9QVElPTkFMX0VYVEVOU0lPTl9MSVNULCAib3B0Iiwgb3B0aW9uLnNpemUoKSk7CisgICAgICAgIGFwcGVuZExpYnJhcnlMaXN0KGF0dHJpYnV0ZXMsICJvcHQiLCBvcHRpb24pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2coIkdlbmVyYXRpbmcgbWFuaWZlc3QgIiArIGRlc3RGaWxlLmdldEFic29sdXRlRmlsZSgpLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIHdyaXRlTWFuaWZlc3QobWFuaWZlc3QpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpLCBpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHRhc2tzIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGludmFsaWQgcGFyYW1ldGVycyBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IGRlc3RGaWxlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlc3RmaWxlIGF0dHJpYnV0ZSBub3Qgc3BlY2lmaWVkLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0RmlsZS5leGlzdHMoKSAmJiAhZGVzdEZpbGUuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihkZXN0RmlsZSArICIgaXMgbm90IGEgZmlsZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbnkgZXh0cmEgYXR0cmlidXRlcyB0byB0aGUgbWFuaWZlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgbWFuaWZlc3Qgc2VjdGlvbiB0byB3cml0ZQorICAgICAqICAgICAgICBhdHRyaWJ1dGVzIHRvCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZEV4dHJhQXR0cmlidXRlcyhmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRyYUF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgZmluYWwgRXh0cmFBdHRyaWJ1dGUgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICAoRXh0cmFBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0VmFsdWUoYXR0cmlidXRlLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIG91dCBtYW5pZmVzdCB0byBkZXN0ZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5pZmVzdCB0aGUgbWFuaWZlc3QKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGVycm9yIHdyaXRpbmcgZmlsZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZU1hbmlmZXN0KGZpbmFsIE1hbmlmZXN0IG1hbmlmZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSk7CisgICAgICAgICAgICBtYW5pZmVzdC53cml0ZShvdXRwdXQpOworICAgICAgICAgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAobnVsbCAhPSBvdXRwdXQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBzcGVjaWZpZWQgZXh0ZW5zaW9ucyB0byBzcGVjaWZpZWQgYXR0cmlidXRlcy4KKyAgICAgKiBVc2UgdGhlIGV4dGVuc2lvbktleSB0byBsaXN0IHRoZSBleHRlbnNpb25zLCB1c3VhbGx5ICJFeHRlbnNpb24tTGlzdDoiCisgICAgICogZm9yIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBhbmQgIk9wdGlvbmFsLUV4dGVuc2lvbi1MaXN0OiIgZm9yIG9wdGlvbmFsCisgICAgICogZGVwZW5kZW5jaWVzLiBOT1RFOiAiT3B0aW9uYWwiIGRlcGVuZGVuY2llcyBhcmUgbm90IHBhcnQgb2YgdGhlCisgICAgICogc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIGFkZCBleHRlbnNpb25zIHRvCisgICAgICogQHBhcmFtIGV4dGVuc2lvbnMgdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZExpYnJhcnlMaXN0KGZpbmFsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgZmluYWwgU3RyaW5nIGxpc3RQcmVmaXgsCisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3QgZXh0ZW5zaW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSBleHRlbnNpb25zLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHQgPSAoRXh0ZW5zaW9uKSBleHRlbnNpb25zLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBsaXN0UHJlZml4ICsgaSArICItIjsKKyAgICAgICAgICAgIEV4dGVuc2lvbi5hZGRFeHRlbnNpb24oZXh0LCBwcmVmaXgsIGF0dHJpYnV0ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGFuIGF0dHJpYnV0ZSBzdWNoIGFzICJFeHRlbnNpb24tTGlzdDogbGliMCBsaWIxIGxpYjIiCisgICAgICogdXNpbmcgc3BlY2lmaWVkIHByZWZpeCBhbmQgY291bnRpbmcgdXAgdG8gc3BlY2lmaWVkIHNpemUuCisgICAgICogQWxzbyB1c2Ugc3BlY2lmaWVkIGV4dGVuc2lvbktleSBzbyB0aGF0IGNhbiBnZW5lcmF0ZSBsaXN0IG9mCisgICAgICogb3B0aW9uYWwgZGVwZW5kZW5jaWVzIGFzd2VsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIHRoZSBudW1iZXIgb2YgbGlicmFyeXMgdG8gbGlzdAorICAgICAqIEBwYXJhbSBsaXN0UHJlZml4IHRoZSBwcmVmaXggZm9yIGFsbCBsaWJyYXJ5cworICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIGFkZCBrZXktdmFsdWUgdG8KKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uS2V5IHRoZSBrZXkgdG8gdXNlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZEV4dGVuc2lvbkxpc3QoZmluYWwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgZmluYWwgQXR0cmlidXRlcy5OYW1lIGV4dGVuc2lvbktleSwgZmluYWwgU3RyaW5nIGxpc3RQcmVmaXgsIGZpbmFsIGludCBzaXplKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChsaXN0UHJlZml4KTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOworICAgICAgICB9CisgICAgICAgIC8vYWRkIGluIHNvbWV0aGluZyBsaWtlCisgICAgICAgIC8vIkV4dGVuc2lvbi1MaXN0OiBqYXZhaGVscCBqYXZhM2QiCisgICAgICAgIGF0dHJpYnV0ZXMucHV0KGV4dGVuc2lvbktleSwgc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIGxpc3Qgb2YgRXh0ZW5zaW9uU2V0IG9iamVjdHMgdG8gZXh0ZW5zaW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRlbnNpb25TZXRzIHRoZSBsaXN0IG9mIEV4dGVuc2lvblNldHMgdG8gYWRkIHRvIGxpc3QKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0IHRvRXh0ZW5zaW9ucyhmaW5hbCBBcnJheUxpc3QgZXh0ZW5zaW9uU2V0cykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSBleHRlbnNpb25TZXRzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblNldCBzZXQgPSAoRXh0ZW5zaW9uU2V0KSBleHRlbnNpb25TZXRzLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBzZXQudG9FeHRlbnNpb25zKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4dGVuc2lvbnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChleHRlbnNpb25zWyBqIF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9KYXJMaWJSZXNvbHZlVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0phckxpYlJlc29sdmVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MDljZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9KYXJMaWJSZXNvbHZlVGFzay5qYXZhCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5yZXNvbHZlcnMuQW50UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLnJlc29sdmVycy5Mb2NhdGlvblJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5yZXNvbHZlcnMuVVJMUmVzb2x2ZXI7CisKKy8qKgorICogVHJpZXMgdG8gbG9jYXRlIGEgSkFSIHRvIHNhdGlzZnkgYW4gZXh0ZW5zaW9uIGFuZCBwbGFjZQorICogbG9jYXRpb24gb2YgSkFSIGludG8gcHJvcGVydHkuCisgKgorICogQGFudC50YXNrIG5hbWU9ImphcmxpYi1yZXNvbHZlIgorICovCitwdWJsaWMgY2xhc3MgSmFyTGliUmVzb2x2ZVRhc2sgZXh0ZW5kcyBUYXNrIHsKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaW4gd2hpY2ggdGhlIGxvY2F0aW9uIG9mCisgICAgICogbGlicmFyeSBpcyBzdG9yZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGV4dGVuc2lvbiB0aGF0IGlzIHJlcXVpcmVkLgorICAgICAqLworICAgIHByaXZhdGUgRXh0ZW5zaW9uIHJlcXVpcmVkRXh0ZW5zaW9uOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiByZXNvbHZlcnMgdG8gdXNlIHRvIGF0dGVtcHQgdG8gbG9jYXRlIGxpYnJhcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3QgcmVzb2x2ZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHlvdSBzaG91bGQgY2hlY2sgdGhhdAorICAgICAqIHRoZSBsaWJyYXJ5cyByZXNvbHZlZCBhY3R1YWxseSBjb250YWluCisgICAgICogZXh0ZW5zaW9uIGFuZCBpZiB0aGV5IGRvbid0IHRoZW4gcmFpc2UKKyAgICAgKiBhbiBleGNlcHRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRXh0ZW5zaW9uID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB5b3Ugc2hvdWxkCisgICAgICogdGhyb3cgYSBCdWlsZEV4Y2VwdGlvbiBpZiB5b3UgY2Fubm90IHJlc29sdmUKKyAgICAgKiBsaWJyYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25FcnJvciA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaW4gd2hpY2ggdGhlIGxvY2F0aW9uIG9mCisgICAgICogbGlicmFyeSBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHdoaWNoIHRoZSBsb2NhdGlvbiBvZgorICAgICAqICAgICAgICAgICAgICAgICBsaWJyYXJ5IGlzIHN0b3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBuZXN0ZWQgbGlicmFyaWVzIGZvciBleHRlbnNpb25zCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hlY2tFeHRlbnNpb24gaWYgdHJ1ZSwgbGlicmFyaWVzIHJldHVybmVkIGJ5IG5lc3RlZAorICAgICAqIHJlc29sdmVycyBzaG91bGQgYmUgY2hlY2tlZCB0byBzZWUgaWYgdGhleSBzdXBwbHkgZXh0ZW5zaW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrRXh0ZW5zaW9uKGZpbmFsIGJvb2xlYW4gY2hlY2tFeHRlbnNpb24pIHsKKyAgICAgICAgdGhpcy5jaGVja0V4dGVuc2lvbiA9IGNoZWNrRXh0ZW5zaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGZhaWwgaWYgZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFpbE9uRXJyb3IgaWYgdHJ1ZSwgZmFpbHVyZSB0byBsb2NhdGUgbGlicmFyeSBzaG91bGQgZmFpbCBidWlsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihmaW5hbCBib29sZWFuIGZhaWxPbkVycm9yKSB7CisgICAgICAgIHRoaXMuZmFpbE9uRXJyb3IgPSBmYWlsT25FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGxvY2F0aW9uIHJlc29sdmVyIHRvIGxvb2sgZm9yIGEgbGlicmFyeSBpbiBhIGxvY2F0aW9uCisgICAgICogcmVsYXRpdmUgdG8gcHJvamVjdCBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jIHRoZSByZXNvbHZlciBsb2NhdGlvbiB0byBzZWFyY2guCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZExvY2F0aW9uKGZpbmFsIExvY2F0aW9uUmVzb2x2ZXIgbG9jKSB7CisgICAgICAgIHJlc29sdmVycy5hZGQobG9jKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgVVJMIHJlc29sdmVyIHRvIGRvd25sb2FkIGEgbGlicmFyeSBmcm9tIGEgVVJMCisgICAgICogdG8gYSBsb2NhbCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCB0aGUgVVJMIHJlc29sdmVyIGZyb20gd2hpY2ggdG8gZG93bmxvYWQgdGhlIGxpYnJhcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkVXJsKGZpbmFsIFVSTFJlc29sdmVyIHVybCkgeworICAgICAgICByZXNvbHZlcnMuYWRkKHVybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBBbnQgcmVzb2x2ZXIgdG8gcnVuIGFuIEFudCBidWlsZCBmaWxlIHRvIGdlbmVyYXRlIGEgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbnQgdGhlIEFudFJlc29sdmVyIHRvIGdlbmVyYXRlIHRoZSBsaWJyYXJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRBbnQoZmluYWwgQW50UmVzb2x2ZXIgYW50KSB7CisgICAgICAgIHJlc29sdmVycy5hZGQoYW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEV4dGVuc2lvbiBsb29raW5nIGZvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRlbnNpb24gU2V0IHRoZSBFeHRlbnNpb24gbG9va2luZyBmb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEV4dGVuc2lvbihmaW5hbCBFeHRlbnNpb25BZGFwdGVyIGV4dGVuc2lvbikgeworICAgICAgICBpZiAobnVsbCAhPSByZXF1aXJlZEV4dGVuc2lvbikgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiQ2FuIG5vdCBzcGVjaWZ5IGV4dGVuc2lvbiB0byAiCisgICAgICAgICAgICAgICAgKyAicmVzb2x2ZSBtdWx0aXBsZSB0aW1lcy4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIHJlcXVpcmVkRXh0ZW5zaW9uID0gZXh0ZW5zaW9uLnRvRXh0ZW5zaW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHRhc2sgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhbGlkYXRlKCk7CisKKyAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiUmVzb2x2aW5nIGV4dGVuc2lvbjogIiArIHJlcXVpcmVkRXh0ZW5zaW9uLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBTdHJpbmcgY2FuZGlkYXRlID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisKKyAgICAgICAgaWYgKG51bGwgIT0gY2FuZGlkYXRlKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJQcm9wZXJ0eSBBbHJlYWR5IHNldCB0bzogIiArIGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBzaXplID0gcmVzb2x2ZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlc29sdmVyIHJlc29sdmVyID0KKyAgICAgICAgICAgICAgICAoRXh0ZW5zaW9uUmVzb2x2ZXIpIHJlc29sdmVycy5nZXQoaSk7CisKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIlNlYXJjaGluZyBmb3IgZXh0ZW5zaW9uIHVzaW5nIFJlc29sdmVyOiIgKyByZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gcmVzb2x2ZXIucmVzb2x2ZShyZXF1aXJlZEV4dGVuc2lvbiwgZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjaGVja0V4dGVuc2lvbihmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkZpbGUgIiArIGZpbGUgKyAiIHJldHVybmVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZXNvbHZlciBmYWlsZWQgdG8gc2F0aXNmeSBleHRlbnNpb24gZHVlIHRvOiAiICsgYmUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiRmFpbGVkIHRvIHJlc29sdmUgZXh0ZW5zaW9uIHRvIGZpbGUgIiArICJ1c2luZyByZXNvbHZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHJlc29sdmVyICsgIiBkdWUgdG86ICIgKyBiZTsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1pc3NpbmdFeHRlbnNpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHdpbGwgdGhyb3cgYSB7QGxpbmsgQnVpbGRFeGNlcHRpb259CisgICAgICogaWYge0BsaW5rICNmYWlsT25FcnJvcn0gaXMgdHJ1ZSBlbHNlIGl0IGp1c3QgZGlzcGxheXMKKyAgICAgKiBhIHdhcm5pbmcuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1pc3NpbmdFeHRlbnNpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byByZXNvbHZlIGV4dGVuc2lvbiB0byBhIGZpbGUiOworICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBnZXRQcm9qZWN0KCkubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgc3BlY2lmaWVkIGZpbGUgc2F0aXNmaWVzIGV4dGVuc2lvbi4KKyAgICAgKiBJZiBpdCBkb2VzIHRoZW4gc2V0IHRoZSByZWxldmVudCBwcm9wZXJ0eQorICAgICAqIGVsc2UgdGhyb3cgYSBCdWlsZEV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBjYW5kaWRhdGUgbGlicmFyeQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgbGlicmFyeSBkb2VzIG5vdCBzYXRpc2Z5IGV4dGVuc2lvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja0V4dGVuc2lvbihmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZpbGUgIiArIGZpbGUgKyAiIGRvZXMgbm90IGV4aXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZpbGUgIiArIGZpbGUgKyAiIGlzIG5vdCBhIGZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoZWNrRXh0ZW5zaW9uKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJTZXR0aW5nIHByb3BlcnR5IHRvICIgKyBmaWxlCisgICAgICAgICAgICAgICAgICAgICsgIiB3aXRob3V0IHZlcmlmeWluZyBsaWJyYXJ5IHNhdGlzZmllcyBleHRlbnNpb24iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHNldExpYnJhcnlQcm9wZXJ0eShmaWxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIkNoZWNraW5nIGZpbGUgIiArIGZpbGUgKyAiIHRvIHNlZSBpZiBpdCBzYXRpc2ZpZXMgZXh0ZW5zaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBmaW5hbCBNYW5pZmVzdCBtYW5pZmVzdCA9IEV4dGVuc2lvblV0aWwuZ2V0TWFuaWZlc3QoZmlsZSk7CisgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25bXSBleHRlbnNpb25zID0gRXh0ZW5zaW9uLmdldEF2YWlsYWJsZShtYW5pZmVzdCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1sgaSBdOworICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24uaXNDb21wYXRpYmxlV2l0aChyZXF1aXJlZEV4dGVuc2lvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0TGlicmFyeVByb3BlcnR5KGZpbGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiRmlsZSAiICsgZmlsZSArICIgc2tpcHBlZCBhcyBpdCAiCisgICAgICAgICAgICAgICAgKyAiZG9lcyBub3Qgc2F0aXNmeSBleHRlbnNpb24iOworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHNldCB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydHkKKyAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IHNwZWNpZmllZCBmaWxlIHNhdGlzZmllcyBsaWJyYXJ5CisgICAgICogcmVxdWlyZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGxpYnJhcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0TGlicmFyeVByb3BlcnR5KGZpbmFsIEZpbGUgZmlsZSkgeworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHlOYW1lLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgdGFza3MgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgaW52YWxpZCBwYXJhbWV0ZXJzIGZvdW5kCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG51bGwgPT0gcHJvcGVydHlOYW1lKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJQcm9wZXJ0eSBhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQuIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsID09IHJlcXVpcmVkRXh0ZW5zaW9uKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJFeHRlbnNpb24gZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0xpYkZpbGVTZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9MaWJGaWxlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxZmRhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9MaWJGaWxlU2V0LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKKworLyoqCisgKiBMaWJGaWxlU2V0IHJlcHJlc2VudHMgYSBmaWxlc2V0IGNvbnRhaW5pbmcgbGlicmFyaWVzLgorICogQXNvY2lhdGVkIHdpdGggdGhlIGxpYnJhcmllcyBpcyBkYXRhIHBlcnRhaW5pbmcgdG8KKyAqIGhvdyB0aGV5IGFyZSB0byBiZSBoYW5kbGVkIHdoZW4gYnVpbGRpbmcgbWFuaWZlc3RzLgorICoKKyAqLworcHVibGljIGNsYXNzIExpYkZpbGVTZXQKKyAgICBleHRlbmRzIEZpbGVTZXQgeworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHNob3VsZCBpbmNsdWRlIHRoZQorICAgICAqICJJbXBsZW1lbnRhdGlvbi1VUkwiIGF0dHJpYnV0ZSBpbiBtYW5pZmVzdC4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZVVSTDsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHNob3VsZCBpbmNsdWRlIHRoZQorICAgICAqICJJbXBsZW1lbnRhdGlvbi0qIiBhdHRyaWJ1dGVzIGluIG1hbmlmZXN0LgorICAgICAqIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlSW1wbDsKKworICAgIC8qKgorICAgICAqIFN0cmluZyB0aGF0IGlzIHRoZSBiYXNlIFVSTCBmb3IgdGhlIGxpYnJhcnlzCisgICAgICogd2hlbiBjb25zdHJ1Y3RpbmcgdGhlICJJbXBsZW1lbnRhdGlvbi1VUkwiCisgICAgICogYXR0cmlidXRlLiBGb3IgaW5zdGFuY2Ugc2V0dGluZyB0aGUgYmFzZSB0bworICAgICAqICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2F2YWxvbi9saWJzLyIgYW5kIHRoZW4KKyAgICAgKiBpbmNsdWRpbmcgdGhlIGxpYnJhcnkgImV4Y2FsaWJ1ci1jbGktMS4wLmphciIgaW4gdGhlCisgICAgICogZmlsZXNldCB3aWxsIHJlc3VsdCBpbiB0aGUgIkltcGxlbWVudGF0aW9uLVVSTCIgYXR0cmlidXRlCisgICAgICogYmVpbmcgc2V0IHRvICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2F2YWxvbi9saWJzL2V4Y2FsaWJ1ci1jbGktMS4wLmphciIKKyAgICAgKgorICAgICAqIE5vdGUgdGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIGxpYnJhcnkgZG9lcyBub3QgZGVmaW5lCisgICAgICogIkltcGxlbWVudGF0aW9uLVVSTCIgaXRzZWxmLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgYWxzbyBpbXBsaWVzIGluY2x1ZGVVUkw9dHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVybEJhc2U7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBzaG91bGQgaW5jbHVkZSB0aGUKKyAgICAgKiAiSW1wbGVtZW50YXRpb24tVVJMIiBhdHRyaWJ1dGUgaW4gbWFuaWZlc3QuCisgICAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZVVSTCB0aGUgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVVcmwoYm9vbGVhbiBpbmNsdWRlVVJMKSB7CisgICAgICAgIHRoaXMuaW5jbHVkZVVSTCA9IGluY2x1ZGVVUkw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgc2hvdWxkIGluY2x1ZGUgdGhlCisgICAgICogIkltcGxlbWVudGF0aW9uLSoiIGF0dHJpYnV0ZXMgaW4gbWFuaWZlc3QuCisgICAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZUltcGwgdGhlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW1wbChib29sZWFuIGluY2x1ZGVJbXBsKSB7CisgICAgICAgIHRoaXMuaW5jbHVkZUltcGwgPSBpbmNsdWRlSW1wbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVybCBiYXNlIGZvciBmaWxlc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHVybEJhc2UgdGhlIGJhc2UgdXJsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXJsQmFzZShTdHJpbmcgdXJsQmFzZSkgeworICAgICAgICB0aGlzLnVybEJhc2UgPSB1cmxCYXNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5jbHVkZVVSTCBmbGFnLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW5jbHVkZVVSTCBmbGFnLgorICAgICAqLworICAgIGJvb2xlYW4gaXNJbmNsdWRlVVJMKCkgeworICAgICAgICByZXR1cm4gaW5jbHVkZVVSTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluY2x1ZGVJbXBsIGZsYWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmNsdWRlSW1wbCBmbGFnLgorICAgICAqLworICAgIGJvb2xlYW4gaXNJbmNsdWRlSW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIGluY2x1ZGVJbXBsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdXJsYmFzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVybGJhc2UuCisgICAgICovCisgICAgU3RyaW5nIGdldFVybEJhc2UoKSB7CisgICAgICAgIHJldHVybiB1cmxCYXNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9MaWJyYXJ5RGlzcGxheWVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vTGlicmFyeURpc3BsYXllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjllODYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vTGlicmFyeURpc3BsYXllci5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIG91dHB1dCB0aGUgaW5mb3JtYXRpb24gaW4gYSBqYXIgcmVsYXRpbmcKKyAqIHRvICJPcHRpb25hbCBQYWNrYWdlcyIgKGZvcm1lbHkga25vd24gYXMgIkV4dGVuc2lvbnMiKQorICogYW5kIFBhY2thZ2UgU3BlY2lmaWNhdGlvbnMuCisgKgorICovCitjbGFzcyBMaWJyYXJ5RGlzcGxheWVyIHsKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBleHRlbnNpb25zIGFuZCBzcGVjaWZpY2F0aW9ucyBjb250YWluZWQKKyAgICAgKiB3aXRoaW4gc3BlY2lmaWVkIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgZmFpbCB0byByZWFkIGZpbGUKKyAgICAgKi8KKyAgICB2b2lkIGRpc3BsYXlMaWJyYXJ5KGZpbmFsIEZpbGUgZmlsZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWFuaWZlc3QgbWFuaWZlc3QgPSBFeHRlbnNpb25VdGlsLmdldE1hbmlmZXN0KGZpbGUpOworICAgICAgICBkaXNwbGF5TGlicmFyeShmaWxlLCBtYW5pZmVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGxheSB0aGUgZXh0ZW5zaW9ucyBhbmQgc3BlY2lmaWNhdGlvbnMgY29udGFpbmVkCisgICAgICogd2l0aGluIHNwZWNpZmllZCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gdXNlIHdoaWxlIHJlcG9ydGluZworICAgICAqIEBwYXJhbSBtYW5pZmVzdCB0aGUgbWFuaWZlc3Qgb2YgZmlsZQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgZmFpbCB0byByZWFkIGZpbGUKKyAgICAgKi8KKyAgICB2b2lkIGRpc3BsYXlMaWJyYXJ5KGZpbmFsIEZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYW5pZmVzdCBtYW5pZmVzdCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRXh0ZW5zaW9uW10gYXZhaWxhYmxlID0gRXh0ZW5zaW9uLmdldEF2YWlsYWJsZShtYW5pZmVzdCk7CisgICAgICAgIGZpbmFsIEV4dGVuc2lvbltdIHJlcXVpcmVkID0gRXh0ZW5zaW9uLmdldFJlcXVpcmVkKG1hbmlmZXN0KTsKKyAgICAgICAgZmluYWwgRXh0ZW5zaW9uW10gb3B0aW9ucyA9IEV4dGVuc2lvbi5nZXRPcHRpb25zKG1hbmlmZXN0KTsKKyAgICAgICAgZmluYWwgU3BlY2lmaWNhdGlvbltdIHNwZWNpZmljYXRpb25zID0gZ2V0U3BlY2lmaWNhdGlvbnMobWFuaWZlc3QpOworCisgICAgICAgIGlmICgwID09IGF2YWlsYWJsZS5sZW5ndGggJiYgMCA9PSByZXF1aXJlZC5sZW5ndGggJiYgMCA9PSBvcHRpb25zLmxlbmd0aAorICAgICAgICAgICAgJiYgMCA9PSBzcGVjaWZpY2F0aW9ucy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkZpbGU6ICIgKyBmaWxlOworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG1lc3NhZ2UubGVuZ3RoKCk7CisgICAgICAgIHByaW50TGluZShzaXplKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICBwcmludExpbmUoc2l6ZSk7CisgICAgICAgIGlmICgwICE9IGF2YWlsYWJsZS5sZW5ndGgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXh0ZW5zaW9ucyBTdXBwb3J0ZWQgQnkgTGlicmFyeToiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXZhaWxhYmxlLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGF2YWlsYWJsZVsgaSBdOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihleHRlbnNpb24udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoMCAhPSByZXF1aXJlZC5sZW5ndGgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXh0ZW5zaW9ucyBSZXF1aXJlZCBCeSBMaWJyYXJ5OiIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24gPSByZXF1aXJlZFsgaSBdOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihleHRlbnNpb24udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoMCAhPSBvcHRpb25zLmxlbmd0aCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHRlbnNpb25zIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IExpYnJhcnkgaWYgcHJlc2VudDoiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24gPSBvcHRpb25zWyBpIF07CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGV4dGVuc2lvbi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgwICE9IHNwZWNpZmljYXRpb25zLmxlbmd0aCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTcGVjaWZpY2F0aW9ucyBTdXBwb3J0ZWQgQnkgTGlicmFyeToiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlY2lmaWNhdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uc1sgaSBdOworICAgICAgICAgICAgICAgIGRpc3BsYXlTcGVjaWZpY2F0aW9uKHNwZWNpZmljYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgb3V0IGEgbGluZSBvZiAnLSdzIGVxdWFsIHRvIHNwZWNpZmllZCBzaXplLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgdGhlIG51bWJlciBvZiBkYXNoZXMgdG8gcHJpbnRvdXQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJpbnRMaW5lKGZpbmFsIGludCBzaXplKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCItIik7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHNwZWNpZmljYXRpb25zIGZyb20gbWFuaWZlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuaWZlc3QgdGhlIG1hbmlmZXN0CisgICAgICogQHJldHVybiB0aGUgc3BlY2lmaWNhdGlvbnMgb3IgbnVsbCBpZiBub25lCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBtYWxmb3JtZWQgc3BlY2lmaWNhdGlvbiBzZWN0aW9ucworICAgICAqLworICAgIHByaXZhdGUgU3BlY2lmaWNhdGlvbltdIGdldFNwZWNpZmljYXRpb25zKGZpbmFsIE1hbmlmZXN0IG1hbmlmZXN0KQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFNwZWNpZmljYXRpb24uZ2V0U3BlY2lmaWNhdGlvbnMobWFuaWZlc3QpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBQYXJzZUV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHBlLmdldE1lc3NhZ2UoKSwgcGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgb3V0IHNwZWNpZmljYXRpb24gZGV0YWlscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjaWZpY2F0aW9uIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlTcGVjaWZpY2F0aW9uKGZpbmFsIFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbikgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWN0aW9ucyA9IHNwZWNpZmljYXRpb24uZ2V0U2VjdGlvbnMoKTsKKyAgICAgICAgaWYgKG51bGwgIT0gc2VjdGlvbnMpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNlY3Rpb25zOiAiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VjdGlvbnNbIGkgXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2IpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzcGVjaWZpY2F0aW9uLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9TcGVjaWZpY2F0aW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vU3BlY2lmaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZGFjMjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vU3BlY2lmaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjA0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbjsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIDxwPlV0aWxpdHkgY2xhc3MgdGhhdCByZXByZXNlbnRzIGVpdGhlciBhbiBhdmFpbGFibGUgIk9wdGlvbmFsIFBhY2thZ2UiCisgKiAoZm9ybWVybHkga25vd24gYXMgIlN0YW5kYXJkIEV4dGVuc2lvbiIpIGFzIGRlc2NyaWJlZCBpbiB0aGUgbWFuaWZlc3QKKyAqIG9mIGEgSkFSIGZpbGUsIG9yIHRoZSByZXF1aXJlbWVudCBmb3Igc3VjaCBhbiBvcHRpb25hbCBwYWNrYWdlLjwvcD4KKyAqCisgKiA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudAorICogPGVtPk9wdGlvbmFsIFBhY2thZ2UgVmVyc2lvbmluZzwvZW0+IGluIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91cgorICogSmF2YTIgU3RhbmRhcmQgRWRpdGlvbiBwYWNrYWdlLCBpbiBmaWxlCisgKiA8Y29kZT5ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvY29kZT4uPC9wPgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNwZWNpZmljYXRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkcgPSAiTWlzc2luZyAiOworCisgICAgLyoqCisgICAgICogTWFuaWZlc3QgQXR0cmlidXRlIE5hbWUgb2JqZWN0IGZvciBTUEVDSUZJQ0FUSU9OX1RJVExFLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlcy5OYW1lIFNQRUNJRklDQVRJT05fVElUTEUKKyAgICAgICAgPSBBdHRyaWJ1dGVzLk5hbWUuU1BFQ0lGSUNBVElPTl9USVRMRTsKKworICAgIC8qKgorICAgICAqIE1hbmlmZXN0IEF0dHJpYnV0ZSBOYW1lIG9iamVjdCBmb3IgU1BFQ0lGSUNBVElPTl9WRVJTSU9OLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlcy5OYW1lIFNQRUNJRklDQVRJT05fVkVSU0lPTgorICAgICAgICA9IEF0dHJpYnV0ZXMuTmFtZS5TUEVDSUZJQ0FUSU9OX1ZFUlNJT047CisKKyAgICAvKioKKyAgICAgKiBNYW5pZmVzdCBBdHRyaWJ1dGUgTmFtZSBvYmplY3QgZm9yIFNQRUNJRklDQVRJT05fVkVORE9SLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlcy5OYW1lIFNQRUNJRklDQVRJT05fVkVORE9SCisgICAgICAgID0gQXR0cmlidXRlcy5OYW1lLlNQRUNJRklDQVRJT05fVkVORE9SOworCisgICAgLyoqCisgICAgICogTWFuaWZlc3QgQXR0cmlidXRlIE5hbWUgb2JqZWN0IGZvciBJTVBMRU1FTlRBVElPTl9USVRMRS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBJTVBMRU1FTlRBVElPTl9USVRMRQorICAgICAgICA9IEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9USVRMRTsKKworICAgIC8qKgorICAgICAqIE1hbmlmZXN0IEF0dHJpYnV0ZSBOYW1lIG9iamVjdCBmb3IgSU1QTEVNRU5UQVRJT05fVkVSU0lPTi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBJTVBMRU1FTlRBVElPTl9WRVJTSU9OCisgICAgICAgID0gQXR0cmlidXRlcy5OYW1lLklNUExFTUVOVEFUSU9OX1ZFUlNJT047CisKKyAgICAvKioKKyAgICAgKiBNYW5pZmVzdCBBdHRyaWJ1dGUgTmFtZSBvYmplY3QgZm9yIElNUExFTUVOVEFUSU9OX1ZFTkRPUi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0dHJpYnV0ZXMuTmFtZSBJTVBMRU1FTlRBVElPTl9WRU5ET1IKKyAgICAgICAgPSBBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVORE9SOworCisgICAgLyoqCisgICAgICogRW51bSBpbmRpY2F0aW5nIHRoYXQgZXh0ZW5zaW9uIGlzIGNvbXBhdGlibGUgd2l0aCBvdGhlciBQYWNrYWdlCisgICAgICogU3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhdGliaWxpdHkgQ09NUEFUSUJMRSA9CisgICAgICAgIG5ldyBDb21wYXRpYmlsaXR5KCJDT01QQVRJQkxFIik7CisKKyAgICAvKioKKyAgICAgKiBFbnVtIGluZGljYXRpbmcgdGhhdCBleHRlbnNpb24gcmVxdWlyZXMgYW4gdXBncmFkZQorICAgICAqIG9mIHNwZWNpZmljYXRpb24gdG8gYmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIFBhY2thZ2UgU3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhdGliaWxpdHkgUkVRVUlSRV9TUEVDSUZJQ0FUSU9OX1VQR1JBREUgPQorICAgICAgICBuZXcgQ29tcGF0aWJpbGl0eSgiUkVRVUlSRV9TUEVDSUZJQ0FUSU9OX1VQR1JBREUiKTsKKworICAgIC8qKgorICAgICAqIEVudW0gaW5kaWNhdGluZyB0aGF0IGV4dGVuc2lvbiByZXF1aXJlcyBhIHZlbmRvcgorICAgICAqIHN3aXRjaCB0byBiZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgUGFja2FnZSBTcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGF0aWJpbGl0eSBSRVFVSVJFX1ZFTkRPUl9TV0lUQ0ggPQorICAgICAgICBuZXcgQ29tcGF0aWJpbGl0eSgiUkVRVUlSRV9WRU5ET1JfU1dJVENIIik7CisKKyAgICAvKioKKyAgICAgKiBFbnVtIGluZGljYXRpbmcgdGhhdCBleHRlbnNpb24gcmVxdWlyZXMgYW4gdXBncmFkZQorICAgICAqIG9mIGltcGxlbWVudGF0aW9uIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBQYWNrYWdlIFNwZWNpZmljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXRpYmlsaXR5IFJFUVVJUkVfSU1QTEVNRU5UQVRJT05fQ0hBTkdFID0KKyAgICAgICAgbmV3IENvbXBhdGliaWxpdHkoIlJFUVVJUkVfSU1QTEVNRU5UQVRJT05fQ0hBTkdFIik7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGVudW0gaW5kaWNhdGVzIHRoYXQgYW4gZXh0ZW5zaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoCisgICAgICogb3RoZXIgUGFja2FnZSBTcGVjaWZpY2F0aW9uIGluIHdheXMgb3RoZXIgdGhhbiBvdGhlciBlbnVtcworICAgICAqIGluZGljYXRlLiBGb3IgZXhhbXBsZSwgdGhlIG90aGVyIFBhY2thZ2UgU3BlY2lmaWNhdGlvbgorICAgICAqIG1heSBoYXZlIGEgZGlmZmVyZW50IElELgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGF0aWJpbGl0eSBJTkNPTVBBVElCTEUgPQorICAgICAgICBuZXcgQ29tcGF0aWJpbGl0eSgiSU5DT01QQVRJQkxFIik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgUGFja2FnZSBTcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNwZWNpZmljYXRpb25UaXRsZTsKKworICAgIC8qKgorICAgICAqIFRoZSB2ZXJzaW9uIG51bWJlciAoZG90dGVkIGRlY2ltYWwgbm90YXRpb24pIG9mIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICogdG8gd2hpY2ggdGhpcyBvcHRpb25hbCBwYWNrYWdlIGNvbmZvcm1zLgorICAgICAqLworICAgIHByaXZhdGUgRGV3ZXlEZWNpbWFsIHNwZWNpZmljYXRpb25WZXJzaW9uOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIHRoYXQgb3JpZ2luYXRlZCB0aGUKKyAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHdoaWNoIHRoaXMgc3BlY2lmaWNhdGlvbiBjb25mb3Jtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVuZG9yOworCisgICAgLyoqCisgICAgICogVGhlIHRpdGxlIG9mIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGltcGxlbWVudGF0aW9uVGl0bGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcGFueSBvciBvcmdhbml6YXRpb24gdGhhdCBwcm9kdWNlZCB0aGlzCisgICAgICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyBzcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVuZG9yOworCisgICAgLyoqCisgICAgICogVGhlIHZlcnNpb24gc3RyaW5nIGZvciBpbXBsZW1lbnRhdGlvbi4gVGhlIHZlcnNpb24gc3RyaW5nIGlzCisgICAgICogb3BhcXVlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVyc2lvbjsKKworICAgIC8qKgorICAgICAqIFRoZSBzZWN0aW9ucyBvZiBqYXIgdGhhdCB0aGUgc3BlY2lmaWNhdGlvbiBhcHBsaWVzIHRvLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nW10gc2VjdGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9jb2RlPiBvYmplY3RzLgorICAgICAqIElmIHRoZXJlIGFyZSBubyBzdWNoIG9wdGlvbmFsIHBhY2thZ2VzLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmlmZXN0IE1hbmlmZXN0IHRvIGJlIHBhcnNlZAorICAgICAqIEByZXR1cm4gdGhlIFBhY2thZ2UgU3BlY2lmaWNhdGlvbnMgZXh0ZW5zaW9ucyBpbiBzcGVjaWZpZWQgbWFuaWZlc3QKKyAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBzcGVjaWZpY2F0aW9ucyBjYW5ub3QKKyAgICAgKiBiZSBwYXJzZWQgYWNjb3JkaW5nIHRvIHRoZWlyIGV4cGVjdGVkIGZvcm1hdHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTcGVjaWZpY2F0aW9uW10gZ2V0U3BlY2lmaWNhdGlvbnMoZmluYWwgTWFuaWZlc3QgbWFuaWZlc3QpCisgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IG1hbmlmZXN0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNwZWNpZmljYXRpb25bIDAgXTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGZpbmFsIE1hcCBlbnRyaWVzID0gbWFuaWZlc3QuZ2V0RW50cmllcygpOworICAgICAgICBmaW5hbCBJdGVyYXRvciBrZXlzID0gZW50cmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKKyAgICAgICAgICAgIGZpbmFsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IChBdHRyaWJ1dGVzKSBlbnRyaWVzLmdldChrZXkpOworICAgICAgICAgICAgZmluYWwgU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uCisgICAgICAgICAgICAgICAgPSBnZXRTcGVjaWZpY2F0aW9uKGtleSwgYXR0cmlidXRlcyk7CisgICAgICAgICAgICBpZiAobnVsbCAhPSBzcGVjaWZpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoc3BlY2lmaWNhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBcnJheUxpc3QgdHJpbW1lZFJlc3VsdHMgPSByZW1vdmVEdXBsaWNhdGVzKHJlc3VsdHMpOworICAgICAgICByZXR1cm4gKFNwZWNpZmljYXRpb25bXSkgdHJpbW1lZFJlc3VsdHMudG9BcnJheShuZXcgU3BlY2lmaWNhdGlvblt0cmltbWVkUmVzdWx0cy5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RydWN0b3IgdG8gY3JlYXRlIFBhY2thZ2UgU3BlY2lmaWNhdGlvbiBvYmplY3QuCisgICAgICogTm90ZSB0aGF0IGV2ZXJ5IGNvbXBvbmVudCBpcyBhbGxvd2VkIHRvIGJlIHNwZWNpZmllZAorICAgICAqIGJ1dCBvbmx5IHRoZSBzcGVjaWZpY2F0aW9uVGl0bGUgaXMgbWFuZGF0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIHNwZWNpZmljYXRpb25UaXRsZSB0aGUgbmFtZSBvZiBzcGVjaWZpY2F0aW9uLgorICAgICAqIEBwYXJhbSBzcGVjaWZpY2F0aW9uVmVyc2lvbiB0aGUgc3BlY2lmaWNhdGlvbiBWZXJzaW9uLgorICAgICAqIEBwYXJhbSBzcGVjaWZpY2F0aW9uVmVuZG9yIHRoZSBzcGVjaWZpY2F0aW9uIFZlbmRvci4KKyAgICAgKiBAcGFyYW0gaW1wbGVtZW50YXRpb25UaXRsZSB0aGUgdGl0bGUgb2YgaW1wbGVtZW50YXRpb24uCisgICAgICogQHBhcmFtIGltcGxlbWVudGF0aW9uVmVyc2lvbiB0aGUgaW1wbGVtZW50YXRpb24gVmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gaW1wbGVtZW50YXRpb25WZW5kb3IgdGhlIGltcGxlbWVudGF0aW9uIFZlbmRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3BlY2lmaWNhdGlvbihmaW5hbCBTdHJpbmcgc3BlY2lmaWNhdGlvblRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3BlY2lmaWNhdGlvblZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVuZG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW1wbGVtZW50YXRpb25UaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVuZG9yKSB7CisgICAgICAgIHRoaXMoc3BlY2lmaWNhdGlvblRpdGxlLCBzcGVjaWZpY2F0aW9uVmVyc2lvbiwgc3BlY2lmaWNhdGlvblZlbmRvciwKKyAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25UaXRsZSwgaW1wbGVtZW50YXRpb25WZXJzaW9uLCBpbXBsZW1lbnRhdGlvblZlbmRvciwKKyAgICAgICAgICAgICAgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBQYWNrYWdlIFNwZWNpZmljYXRpb24gb2JqZWN0LgorICAgICAqIE5vdGUgdGhhdCBldmVyeSBjb21wb25lbnQgaXMgYWxsb3dlZCB0byBiZSBzcGVjaWZpZWQKKyAgICAgKiBidXQgb25seSB0aGUgc3BlY2lmaWNhdGlvblRpdGxlIGlzIG1hbmRhdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjaWZpY2F0aW9uVGl0bGUgdGhlIG5hbWUgb2Ygc3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gc3BlY2lmaWNhdGlvblZlcnNpb24gdGhlIHNwZWNpZmljYXRpb24gVmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gc3BlY2lmaWNhdGlvblZlbmRvciB0aGUgc3BlY2lmaWNhdGlvbiBWZW5kb3IuCisgICAgICogQHBhcmFtIGltcGxlbWVudGF0aW9uVGl0bGUgdGhlIHRpdGxlIG9mIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBpbXBsZW1lbnRhdGlvblZlcnNpb24gdGhlIGltcGxlbWVudGF0aW9uIFZlcnNpb24uCisgICAgICogQHBhcmFtIGltcGxlbWVudGF0aW9uVmVuZG9yIHRoZSBpbXBsZW1lbnRhdGlvbiBWZW5kb3IuCisgICAgICogQHBhcmFtIHNlY3Rpb25zIHRoZSBzZWN0aW9ucy9wYWNrYWdlcyB0aGF0IFNwZWNpZmljYXRpb24gYXBwbGllcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3BlY2lmaWNhdGlvbihmaW5hbCBTdHJpbmcgc3BlY2lmaWNhdGlvblRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3BlY2lmaWNhdGlvblZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVuZG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW1wbGVtZW50YXRpb25UaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVuZG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWN0aW9ucykgeworICAgICAgICB0aGlzLnNwZWNpZmljYXRpb25UaXRsZSA9IHNwZWNpZmljYXRpb25UaXRsZTsKKyAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVuZG9yID0gc3BlY2lmaWNhdGlvblZlbmRvcjsKKworICAgICAgICBpZiAobnVsbCAhPSBzcGVjaWZpY2F0aW9uVmVyc2lvbikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uCisgICAgICAgICAgICAgICAgICAgID0gbmV3IERld2V5RGVjaW1hbChzcGVjaWZpY2F0aW9uVmVyc2lvbik7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yID0gIkJhZCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gZm9ybWF0ICciCisgICAgICAgICAgICAgICAgICAgICsgc3BlY2lmaWNhdGlvblZlcnNpb24gKyAiJyBpbiAnIiArIHNwZWNpZmljYXRpb25UaXRsZQorICAgICAgICAgICAgICAgICAgICArICInLiAoUmVhc29uOiAiICsgbmZlICsgIikiOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvblRpdGxlID0gaW1wbGVtZW50YXRpb25UaXRsZTsKKyAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvblZlbmRvciA9IGltcGxlbWVudGF0aW9uVmVuZG9yOworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVmVyc2lvbiA9IGltcGxlbWVudGF0aW9uVmVyc2lvbjsKKworICAgICAgICBpZiAobnVsbCA9PSB0aGlzLnNwZWNpZmljYXRpb25UaXRsZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzcGVjaWZpY2F0aW9uVGl0bGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGNvcHkgPSBudWxsOworICAgICAgICBpZiAobnVsbCAhPSBzZWN0aW9ucykgeworICAgICAgICAgICAgY29weSA9IG5ldyBTdHJpbmdbIHNlY3Rpb25zLmxlbmd0aCBdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzZWN0aW9ucywgMCwgY29weSwgMCwgc2VjdGlvbnMubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNlY3Rpb25zID0gY29weTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGl0bGUgb2Ygc3BlY2lpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVGl0bGUoKSB7CisgICAgICAgIHJldHVybiBzcGVjaWZpY2F0aW9uVGl0bGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2ZW5kb3Igb2YgdGhlIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZW5kb3Igb2YgdGhlIHNwZWNpZmljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTcGVjaWZpY2F0aW9uVmVuZG9yKCkgeworICAgICAgICByZXR1cm4gc3BlY2lmaWNhdGlvblZlbmRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGl0bGUgb2YgdGhlIHNwZWNpZmljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblRpdGxlKCkgeworICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25UaXRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBEZXdleURlY2ltYWwgZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBzcGVjaWZpY2F0aW9uVmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZlbmRvciBvZiB0aGUgZXh0ZW5zaW9ucyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZlbmRvciBvZiB0aGUgZXh0ZW5zaW9ucyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVuZG9yKCkgeworICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25WZW5kb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25WZXJzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHNlY3Rpb25zIHRvIHdoaWNoIHNwZWNpZmljYXRpb24gYXBwbGllcworICAgICAqIG9yIG51bGwgaWYgcmVsZXZlbnQgdG8gbm8gc2VjdGlvbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgc2VjdGlvbnMgdG8gd2hpY2ggc3BlY2lmaWNhdGlvbiBhcHBsaWVzCisgICAgICogICAgICAgICBvciBudWxsIGlmIHJlbGV2ZW50IHRvIG5vIHNlY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZWN0aW9ucygpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gc2VjdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG5ld1NlY3Rpb25zID0gbmV3IFN0cmluZ1sgc2VjdGlvbnMubGVuZ3RoIF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2VjdGlvbnMsIDAsIG5ld1NlY3Rpb25zLCAwLCBzZWN0aW9ucy5sZW5ndGgpOworICAgICAgICByZXR1cm4gbmV3U2VjdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgQ29tcGF0aWJpbGl0eSBlbnVtIGluZGljYXRpbmcgdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGlzCisgICAgICogPGNvZGU+UGFja2FnZSBTcGVjaWZpY2F0aW9uPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiA8Y29kZT5FeHRlbnNpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBzcGVjaWZpY2F0aW9uCisgICAgICogQHJldHVybiB0aGUgZW51bSBpbmRpY2F0aW5nIHRoZSBjb21wYXRpYmlsaXR5IChvciBsYWNrIHRoZXJlb2YpCisgICAgICogICAgICAgICBvZiBzcGVjaWZlZCBQYWNrYWdlIFNwZWNpZmljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGF0aWJpbGl0eSBnZXRDb21wYXRpYmlsaXR5V2l0aChmaW5hbCBTcGVjaWZpY2F0aW9uIG90aGVyKSB7CisgICAgICAgIC8vIFNwZWNpZmljYXRpb24gTmFtZSBtdXN0IG1hdGNoCisgICAgICAgIGlmICghc3BlY2lmaWNhdGlvblRpdGxlLmVxdWFscyhvdGhlci5nZXRTcGVjaWZpY2F0aW9uVGl0bGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBJTkNPTVBBVElCTEU7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdmFpbGFibGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIG11c3QgYmUgPj0gcmVxdWlyZWQKKyAgICAgICAgZmluYWwgRGV3ZXlEZWNpbWFsIG90aGVyU3BlY2lmaWNhdGlvblZlcnNpb24KKyAgICAgICAgICAgID0gb3RoZXIuZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKTsKKyAgICAgICAgaWYgKG51bGwgIT0gc3BlY2lmaWNhdGlvblZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChudWxsID09IG90aGVyU3BlY2lmaWNhdGlvblZlcnNpb24KKyAgICAgICAgICAgICAgICB8fCAhaXNDb21wYXRpYmxlKHNwZWNpZmljYXRpb25WZXJzaW9uLCBvdGhlclNwZWNpZmljYXRpb25WZXJzaW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSRVFVSVJFX1NQRUNJRklDQVRJT05fVVBHUkFERTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIFZlbmRvciBJRCBtdXN0IG1hdGNoCisgICAgICAgIGZpbmFsIFN0cmluZyBvdGhlckltcGxlbWVudGF0aW9uVmVuZG9yCisgICAgICAgICAgICA9IG90aGVyLmdldEltcGxlbWVudGF0aW9uVmVuZG9yKCk7CisgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVuZG9yKSB7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBvdGhlckltcGxlbWVudGF0aW9uVmVuZG9yCisgICAgICAgICAgICAgICAgfHwgIWltcGxlbWVudGF0aW9uVmVuZG9yLmVxdWFscyhvdGhlckltcGxlbWVudGF0aW9uVmVuZG9yKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSRVFVSVJFX1ZFTkRPUl9TV0lUQ0g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiB2ZXJzaW9uIG11c3QgYmUgPj0gcmVxdWlyZWQKKyAgICAgICAgZmluYWwgU3RyaW5nIG90aGVySW1wbGVtZW50YXRpb25WZXJzaW9uCisgICAgICAgICAgICA9IG90aGVyLmdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpOworICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChudWxsID09IG90aGVySW1wbGVtZW50YXRpb25WZXJzaW9uCisgICAgICAgICAgICAgICAgfHwgIWltcGxlbWVudGF0aW9uVmVyc2lvbi5lcXVhbHMob3RoZXJJbXBsZW1lbnRhdGlvblZlcnNpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJFUVVJUkVfSU1QTEVNRU5UQVRJT05fQ0hBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBhdmFpbGFibGUgb3B0aW9uYWwgcGFja2FnZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cworICAgICAgICByZXR1cm4gQ09NUEFUSUJMRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5wYWNrYWdlPC9jb2RlPgorICAgICAqIGlzIHNhdGlzZmllZCBieSB0aGlzIDxjb2RlPlNwZWNpZmljYXRpb248L2NvZGU+LiBPdGhlcndpc2UsIHJldHVybgorICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdGhlciB0aGUgc3BlY2lmaWNhdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWNhdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBzcGVjaWZpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aChmaW5hbCBTcGVjaWZpY2F0aW9uIG90aGVyKSB7CisgICAgICAgIHJldHVybiAoQ09NUEFUSUJMRSA9PSBnZXRDb21wYXRpYmlsaXR5V2l0aChvdGhlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgYnJhY2UgPSAiOiAiOworCisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYgorICAgICAgICAgICAgPSBuZXcgU3RyaW5nQnVmZmVyKFNQRUNJRklDQVRJT05fVElUTEUudG9TdHJpbmcoKSk7CisgICAgICAgIHNiLmFwcGVuZChicmFjZSk7CisgICAgICAgIHNiLmFwcGVuZChzcGVjaWZpY2F0aW9uVGl0bGUpOworICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworCisgICAgICAgIGlmIChudWxsICE9IHNwZWNpZmljYXRpb25WZXJzaW9uKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoU1BFQ0lGSUNBVElPTl9WRVJTSU9OKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChicmFjZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3BlY2lmaWNhdGlvblZlcnNpb24pOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IHNwZWNpZmljYXRpb25WZW5kb3IpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTUEVDSUZJQ0FUSU9OX1ZFTkRPUik7CisgICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOworICAgICAgICAgICAgc2IuYXBwZW5kKHNwZWNpZmljYXRpb25WZW5kb3IpOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVGl0bGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChJTVBMRU1FTlRBVElPTl9USVRMRSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOworICAgICAgICAgICAgc2IuYXBwZW5kKGltcGxlbWVudGF0aW9uVGl0bGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVyc2lvbikgeworICAgICAgICAgICAgc2IuYXBwZW5kKElNUExFTUVOVEFUSU9OX1ZFUlNJT04pOworICAgICAgICAgICAgc2IuYXBwZW5kKGJyYWNlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbXBsZW1lbnRhdGlvblZlcnNpb24pOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVuZG9yKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoSU1QTEVNRU5UQVRJT05fVkVORE9SKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChicmFjZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoaW1wbGVtZW50YXRpb25WZW5kb3IpOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlyc3QgdmVyc2lvbiBudW1iZXIgaXMgZ3JlYXRlciB0aGFuCisgICAgICogb3IgZXF1YWwgdG8gdGhlIHNlY29uZDsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlyc3QgRmlyc3QgdmVyc2lvbiBudW1iZXIgKGRvdHRlZCBkZWNpbWFsKQorICAgICAqIEBwYXJhbSBzZWNvbmQgU2Vjb25kIHZlcnNpb24gbnVtYmVyIChkb3R0ZWQgZGVjaW1hbCkKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wYXRpYmxlKGZpbmFsIERld2V5RGVjaW1hbCBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERld2V5RGVjaW1hbCBzZWNvbmQpIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0LmlzR3JlYXRlclRoYW5PckVxdWFsKHNlY29uZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tYmluZSBhbGwgc3BlY2lmaWNhdGlvbnMgb2JqZWN0cyB0aGF0IGFyZSBpZGVudGljYWwgZXhjZXB0CisgICAgICogZm9yIHRoZSBzZWN0aW9ucy4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhpcyBpcyB2ZXJ5IGluZWZmaWNlbnQgYW5kIHNob3VsZCBwcm9iYWJseSBiZSBmaXhlZAorICAgICAqIGluIHRoZSBmdXR1cmUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3QgdGhlIGFycmF5IG9mIHJlc3VsdHMgdG8gdHJpbQorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgbGlzdCB3aXRoIGFsbCBkdXBsaWNhdGVzIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgcmVtb3ZlRHVwbGljYXRlcyhmaW5hbCBBcnJheUxpc3QgbGlzdCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0IHNlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB3aGlsZSAobGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmaW5hbCBTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24gPSAoU3BlY2lmaWNhdGlvbikgbGlzdC5yZW1vdmUoMCk7CisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTcGVjaWZpY2F0aW9uIG90aGVyID0gKFNwZWNpZmljYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNFcXVhbChzcGVjaWZpY2F0aW9uLCBvdGhlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gb3RoZXJTZWN0aW9ucyA9IG90aGVyLmdldFNlY3Rpb25zKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG90aGVyU2VjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zLmFkZEFsbChBcnJheXMuYXNMaXN0KG90aGVyU2VjdGlvbnMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFNwZWNpZmljYXRpb24gbWVyZ2VkID0KKyAgICAgICAgICAgICAgICBtZXJnZUluU2VjdGlvbnMoc3BlY2lmaWNhdGlvbiwgc2VjdGlvbnMpOworICAgICAgICAgICAgcmVzdWx0cy5hZGQobWVyZ2VkKTsKKyAgICAgICAgICAgIC8vUmVzZXQgbGlzdCBvZiBzZWN0aW9ucworICAgICAgICAgICAgc2VjdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgdHdvIHNwZWNpZmljYXRpb25zIGFyZSBlcXVhbCBleGNlcHQgZm9yIHRoZWlyIHNlY3Rpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHNwZWNpZmljYXRpb24gb25lIHNwZWNpZmljYWl0b24KKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG9odGVyIHNwZWNpZmljYXRpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdHdvIHNwZWNpZmljYXRpb25zIGFyZSBlcXVhbCBleGNlcHQgZm9yIHRoZWlyCisgICAgICogICAgICAgICBzZWN0aW9ucywgZWxzZSBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChmaW5hbCBTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTcGVjaWZpY2F0aW9uIG90aGVyKSB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi5nZXRTcGVjaWZpY2F0aW9uVGl0bGUoKS5lcXVhbHMob3RoZXIuZ2V0U3BlY2lmaWNhdGlvblRpdGxlKCkpCisgICAgICAgICAgICAmJiBzcGVjaWZpY2F0aW9uLmdldFNwZWNpZmljYXRpb25WZXJzaW9uKCkuaXNFcXVhbChvdGhlci5nZXRTcGVjaWZpY2F0aW9uVmVyc2lvbigpKQorICAgICAgICAgICAgJiYgc3BlY2lmaWNhdGlvbi5nZXRTcGVjaWZpY2F0aW9uVmVuZG9yKCkuZXF1YWxzKG90aGVyLmdldFNwZWNpZmljYXRpb25WZW5kb3IoKSkKKyAgICAgICAgICAgICYmIHNwZWNpZmljYXRpb24uZ2V0SW1wbGVtZW50YXRpb25UaXRsZSgpLmVxdWFscyhvdGhlci5nZXRJbXBsZW1lbnRhdGlvblRpdGxlKCkpCisgICAgICAgICAgICAmJiBzcGVjaWZpY2F0aW9uLmdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpLmVxdWFscyhvdGhlci5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSkKKyAgICAgICAgICAgICYmIHNwZWNpZmljYXRpb24uZ2V0SW1wbGVtZW50YXRpb25WZW5kb3IoKS5lcXVhbHMob3RoZXIuZ2V0SW1wbGVtZW50YXRpb25WZW5kb3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVyZ2UgdGhlIHNwZWNpZmllZCBzZWN0aW9ucyBpbnRvIHNwZWNpZmllZCBzZWN0aW9uIGFuZCByZXR1cm4gcmVzdWx0LgorICAgICAqIElmIG5vIHNlY3Rpb25zIHRvIGJlIGFkZGVkIHRoZW4ganVzdCByZXR1cm4gb3JpZ2luYWwgc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjaWZpY2F0aW9uIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICogQHBhcmFtIHNlY3Rpb25zVG9BZGQgdGhlIGxpc3Qgb2Ygc2VjdGlvbnMgdG8gbWVyZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXJnZWQgc3BlY2lmaWNhdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNwZWNpZmljYXRpb24gbWVyZ2VJblNlY3Rpb25zKGZpbmFsIFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Qgc2VjdGlvbnNUb0FkZCkgeworICAgICAgICBpZiAoMCA9PSBzZWN0aW9uc1RvQWRkLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmljYXRpb247CisgICAgICAgIH0KKyAgICAgICAgc2VjdGlvbnNUb0FkZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChzcGVjaWZpY2F0aW9uLmdldFNlY3Rpb25zKCkpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWN0aW9ucyA9CisgICAgICAgICAgICAoU3RyaW5nW10pIHNlY3Rpb25zVG9BZGQudG9BcnJheShuZXcgU3RyaW5nW3NlY3Rpb25zVG9BZGQuc2l6ZSgpXSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTcGVjaWZpY2F0aW9uKHNwZWNpZmljYXRpb24uZ2V0U3BlY2lmaWNhdGlvblRpdGxlKCksCisgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi5nZXRTcGVjaWZpY2F0aW9uVmVyc2lvbigpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi5nZXRTcGVjaWZpY2F0aW9uVmVuZG9yKCksCisgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi5nZXRJbXBsZW1lbnRhdGlvblRpdGxlKCksCisgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uLmdldEltcGxlbWVudGF0aW9uVmVuZG9yKCksCisgICAgICAgICAgICAgICAgc2VjdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaW0gdGhlIHN1cHBsaWVkIHN0cmluZyBpZiB0aGUgc3RyaW5nIGlzIG5vbi1udWxsCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB0byB0cmltIG9yIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoZSB0cmltbWVkIHN0cmluZyBvciBudWxsCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRyaW1tZWRTdHJpbmcoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHZhbHVlLnRyaW0oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IGFuIFBhY2thZ2UgU3BlY2lmaWNhdGlvbiBmcm9tIEF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBBdHRyaWJ1dGVzIHRvIHNlYXJjaGVkCisgICAgICogQHJldHVybiB0aGUgbmV3IFNwZWNpZmljYXRpb24gb2JqZWN0LCBvciBudWxsCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3BlY2lmaWNhdGlvbiBnZXRTcGVjaWZpY2F0aW9uKGZpbmFsIFN0cmluZyBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAvL1dBUk5JTkc6IFdlIHRyaW0gdGhlIHZhbHVlcyBvZiBhbGwgdGhlIGF0dHJpYnV0ZXMgYmVjYXVzZQorICAgICAgICAvL1NvbWUgZXh0ZW5zaW9uIGRlY2xhcmF0aW9ucyBhcmUgYmFkbHkgZGVmaW5lZCAoaWUgaGF2ZSBzcGFjZXMKKyAgICAgICAgLy9hZnRlciB2ZXJzaW9uIG9yIHZlbmRvcikKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUKKyAgICAgICAgICAgID0gZ2V0VHJpbW1lZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKFNQRUNJRklDQVRJT05fVElUTEUpKTsKKyAgICAgICAgaWYgKG51bGwgPT0gbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgc3BlY1ZlbmRvcgorICAgICAgICAgICAgPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoU1BFQ0lGSUNBVElPTl9WRU5ET1IpKTsKKyAgICAgICAgaWYgKG51bGwgPT0gc3BlY1ZlbmRvcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKE1JU1NJTkcgKyBTUEVDSUZJQ0FUSU9OX1ZFTkRPUiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgc3BlY1ZlcnNpb24KKyAgICAgICAgICAgID0gZ2V0VHJpbW1lZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKFNQRUNJRklDQVRJT05fVkVSU0lPTikpOworICAgICAgICBpZiAobnVsbCA9PSBzcGVjVmVyc2lvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKE1JU1NJTkcgKyBTUEVDSUZJQ0FUSU9OX1ZFUlNJT04sIDApOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGltcFRpdGxlCisgICAgICAgICAgICA9IGdldFRyaW1tZWRTdHJpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShJTVBMRU1FTlRBVElPTl9USVRMRSkpOworICAgICAgICBpZiAobnVsbCA9PSBpbXBUaXRsZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKE1JU1NJTkcgKyBJTVBMRU1FTlRBVElPTl9USVRMRSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgaW1wVmVyc2lvbgorICAgICAgICAgICAgPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSU1QTEVNRU5UQVRJT05fVkVSU0lPTikpOworICAgICAgICBpZiAobnVsbCA9PSBpbXBWZXJzaW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oTUlTU0lORyArIElNUExFTUVOVEFUSU9OX1ZFUlNJT04sIDApOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGltcFZlbmRvcgorICAgICAgICAgICAgPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSU1QTEVNRU5UQVRJT05fVkVORE9SKSk7CisgICAgICAgIGlmIChudWxsID09IGltcFZlbmRvcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKE1JU1NJTkcgKyBJTVBMRU1FTlRBVElPTl9WRU5ET1IsIDApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBTcGVjaWZpY2F0aW9uKG5hbWUsIHNwZWNWZXJzaW9uLCBzcGVjVmVuZG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcFRpdGxlLCBpbXBWZXJzaW9uLCBpbXBWZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde3NlY3Rpb259KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vcmVzb2x2ZXJzL0FudFJlc29sdmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vcmVzb2x2ZXJzL0FudFJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjOTA3MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9yZXNvbHZlcnMvQW50UmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24ucmVzb2x2ZXJzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uRXh0ZW5zaW9uUmVzb2x2ZXI7CisKKy8qKgorICogUmVzb2x2ZXIgdGhhdCBqdXN0IHJldHVybnMgcyBzcGVjaWZpZWQgbG9jYXRpb24uCisgKgorICovCitwdWJsaWMgY2xhc3MgQW50UmVzb2x2ZXIgaW1wbGVtZW50cyBFeHRlbnNpb25SZXNvbHZlciB7CisgICAgcHJpdmF0ZSBGaWxlIGFudGZpbGU7CisgICAgcHJpdmF0ZSBGaWxlIGRlc3RmaWxlOworICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFudCBmaWxlCisgICAgICogQHBhcmFtIGFudGZpbGUgdGhlIGFudCBmaWxlIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFudGZpbGUoZmluYWwgRmlsZSBhbnRmaWxlKSB7CisgICAgICAgIHRoaXMuYW50ZmlsZSA9IGFudGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgICAqIEBwYXJhbSBkZXN0ZmlsZSB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RmaWxlKGZpbmFsIEZpbGUgZGVzdGZpbGUpIHsKKyAgICAgICAgdGhpcy5kZXN0ZmlsZSA9IGRlc3RmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldAorICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChmaW5hbCBTdHJpbmcgdGFyZ2V0KSB7CisgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlc29sdmVkIGZpbGUKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdAorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgcmVzb2x2ZWQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSByZXNvbHZlZAorICAgICAqLworICAgIHB1YmxpYyBGaWxlIHJlc29sdmUoZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhbGlkYXRlKCk7CisKKyAgICAgICAgZmluYWwgQW50IGFudCA9IG5ldyBBbnQoKTsKKyAgICAgICAgYW50LnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIGFudC5zZXRJbmhlcml0QWxsKGZhbHNlKTsKKyAgICAgICAgYW50LnNldEFudGZpbGUoYW50ZmlsZS5nZXROYW1lKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBGaWxlIGRpciA9CisgICAgICAgICAgICAgICAgYW50ZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICAgICAgYW50LnNldERpcihkaXIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpLCBpb2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgIT0gdGFyZ2V0KSB7CisgICAgICAgICAgICBhbnQuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBhbnQuZXhlY3V0ZSgpOworCisgICAgICAgIHJldHVybiBkZXN0ZmlsZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFZhbGlkYXRlcyBVUkwKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgIGlmIChudWxsID09IGFudGZpbGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIk11c3Qgc3BlY2lmeSBCdWlsZGZpbGUiOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bGwgPT0gZGVzdGZpbGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIk11c3Qgc3BlY2lmeSBkZXN0aW5hdGlvbiBmaWxlIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkFudFsiICsgYW50ZmlsZSArICI9PT4iICsgZGVzdGZpbGUgKyAiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL3Jlc29sdmVycy9Mb2NhdGlvblJlc29sdmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vcmVzb2x2ZXJzL0xvY2F0aW9uUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY5NzRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL3Jlc29sdmVycy9Mb2NhdGlvblJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24ucmVzb2x2ZXJzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uRXh0ZW5zaW9uUmVzb2x2ZXI7CisKKy8qKgorICogUmVzb2x2ZXIgdGhhdCBqdXN0IHJldHVybnMgcyBzcGVjaWZpZWQgbG9jYXRpb24uCisgKgorICovCitwdWJsaWMgY2xhc3MgTG9jYXRpb25SZXNvbHZlciBpbXBsZW1lbnRzIEV4dGVuc2lvblJlc29sdmVyIHsKKyAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIGZvciB0aGlzIHJlc29sdmVyCisgICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGZpbmFsIFN0cmluZyBsb2NhdGlvbikgeworICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgZmlsZQorICAgICAqIEBwYXJhbSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0CisgICAgICogQHJldHVybiB0aGUgZmlsZSByZXNvbHZlZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgbm8gbG9jYXRpb24gaXMgc2V0CisgICAgICovCisgICAgcHVibGljIEZpbGUgcmVzb2x2ZShmaW5hbCBFeHRlbnNpb24gZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAobnVsbCA9PSBsb2NhdGlvbikgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiTm8gbG9jYXRpb24gc3BlY2lmaWVkIGZvciByZXNvbHZlciI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvamVjdC5yZXNvbHZlRmlsZShsb2NhdGlvbik7CisgICAgfQorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvY2F0aW9uCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJMb2NhdGlvblsiICsgbG9jYXRpb24gKyAiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL3Jlc29sdmVycy9VUkxSZXNvbHZlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL3Jlc29sdmVycy9VUkxSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGY2OTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vcmVzb2x2ZXJzL1VSTFJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLnJlc29sdmVyczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5HZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uRXh0ZW5zaW9uUmVzb2x2ZXI7CisKKy8qKgorICogUmVzb2x2ZXIgdGhhdCBqdXN0IHJldHVybnMgcyBzcGVjaWZpZWQgbG9jYXRpb24uCisgKgorICovCitwdWJsaWMgY2xhc3MgVVJMUmVzb2x2ZXIgaW1wbGVtZW50cyBFeHRlbnNpb25SZXNvbHZlciB7CisgICAgcHJpdmF0ZSBGaWxlIGRlc3RmaWxlOworICAgIHByaXZhdGUgRmlsZSBkZXN0ZGlyOworICAgIHByaXZhdGUgVVJMIHVybDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIFVSTAorICAgICAqIEBwYXJhbSB1cmwgdGhlIHVybAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVybChmaW5hbCBVUkwgdXJsKSB7CisgICAgICAgIHRoaXMudXJsID0gdXJsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlc3RpbmF0aW9uIGZpbGUKKyAgICAgKiBAcGFyYW0gZGVzdGZpbGUgdGhlIGRlc3RpbmF0aW9uIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZmlsZShmaW5hbCBGaWxlIGRlc3RmaWxlKSB7CisgICAgICAgIHRoaXMuZGVzdGZpbGUgPSBkZXN0ZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gZGVzdGRpciB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihmaW5hbCBGaWxlIGRlc3RkaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0ZGlyID0gZGVzdGRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIHJlc29sdmVkIGZyb20gVVJMIGFuZCBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIHRoZSBleHRlbnRpb24KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdAorICAgICAqIEByZXR1cm4gZmlsZSB0aGUgZmlsZSByZXNvbHZlZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIFVSTCBpcyBpbnZhbGlkCisgICAgICovCisgICAgcHVibGljIEZpbGUgcmVzb2x2ZShmaW5hbCBFeHRlbnNpb24gZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKworICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBnZXREZXN0KCk7CisKKyAgICAgICAgZmluYWwgR2V0IGdldCA9IG5ldyBHZXQoKTsKKyAgICAgICAgZ2V0LnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIGdldC5zZXREZXN0KGZpbGUpOworICAgICAgICBnZXQuc2V0U3JjKHVybCk7CisgICAgICAgIGdldC5leGVjdXRlKCk7CisKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXRzIHRoZSBkZXN0aW5hdGlvbiBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGdldERlc3QoKSB7CisgICAgICAgIEZpbGUgcmVzdWx0OworICAgICAgICBpZiAobnVsbCAhPSBkZXN0ZmlsZSkgeworICAgICAgICAgICAgcmVzdWx0ID0gZGVzdGZpbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZSA9IHVybC5nZXRGaWxlKCk7CisgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWU7CisgICAgICAgICAgICBpZiAobnVsbCA9PSBmaWxlIHx8IGZpbGUubGVuZ3RoKCkgPD0gMSkgeworICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRlZmF1bHQuZmlsZSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbGUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBpZiAoLTEgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGUuc3Vic3RyaW5nKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKGRlc3RkaXIsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qCisgICAgICogVmFsaWRhdGVzIFVSTAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdXJsKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJNdXN0IHNwZWNpZnkgVVJMIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudWxsID09IGRlc3RkaXIgJiYgbnVsbCA9PSBkZXN0ZmlsZSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiTXVzdCBzcGVjaWZ5IGRlc3RpbmF0aW9uIGZpbGUgb3IgZGlyZWN0b3J5IjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIGlmIChudWxsICE9IGRlc3RkaXIgJiYgbnVsbCAhPSBkZXN0ZmlsZSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiTXVzdCBub3Qgc3BlY2lmeSBib3RoIGRlc3RpbmF0aW9uIGZpbGUgb3IgZGlyZWN0b3J5IjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSTAorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiVVJMWyIgKyB1cmwgKyAiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi9UcmFuc2xhdGUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vVHJhbnNsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhMjI2NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vVHJhbnNsYXRlLmphdmEKQEAgLTAsMCArMSw2MjcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaTE4bjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5MaW5lVG9rZW5pemVyOworCisvKioKKyAqIFRyYW5zbGF0ZXMgdGV4dCBlbWJlZGRlZCBpbiBmaWxlcyB1c2luZyBSZXNvdXJjZSBCdW5kbGUgZmlsZXMuCisgKiBTaW5jZSBhbnQgMS42IHByZXNlcnZlcyBsaW5lIGVuZGluZ3MKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc2xhdGUgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgeworICAgIC8qKgorICAgICAqIHNlYXJjaCBhIGJ1bmRsZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLCB0aGUgY291bnRyeSBhbmQgdGhlIHZhcmlhbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVORExFX1NQRUNJRklFRF9MQU5HVUFHRV9DT1VOVFJZX1ZBUklBTlQgPSAwOworICAgIC8qKgorICAgICAqIHNlYXJjaCBhIGJ1bmRsZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLCBhbmQgdGhlIGNvdW50cnkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVORExFX1NQRUNJRklFRF9MQU5HVUFHRV9DT1VOVFJZID0gMTsKKyAgICAvKioKKyAgICAgKiBzZWFyY2ggYSBidW5kbGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBsYW5ndWFnZSBvbmx5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVTkRMRV9TUEVDSUZJRURfTEFOR1VBR0UgPSAyOworICAgIC8qKgorICAgICAqIHNlYXJjaCBhIGJ1bmRsZSBtYXRjaGluZyBub3RoaW5nIHNwZWNpYWwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVORExFX05PTUFUQ0ggPSAzOworICAgIC8qKgorICAgICAqIHNlYXJjaCBhIGJ1bmRsZSBtYXRjaGluZyB0aGUgbGFuZ3VhZ2UsIHRoZSBjb3VudHJ5IGFuZCB0aGUgdmFyaWFudAorICAgICAqIG9mIHRoZSBjdXJyZW50IGxvY2FsZSBvZiB0aGUgY29tcHV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVORExFX0RFRkFVTFRfTEFOR1VBR0VfQ09VTlRSWV9WQVJJQU5UID0gNDsKKyAgICAvKioKKyAgICAgKiBzZWFyY2ggYSBidW5kbGUgbWF0Y2hpbmcgdGhlIGxhbmd1YWdlLCBhbmQgdGhlIGNvdW50cnkKKyAgICAgKiBvZiB0aGUgY3VycmVudCBsb2NhbGUgb2YgdGhlIGNvbXB1dGVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVTkRMRV9ERUZBVUxUX0xBTkdVQUdFX0NPVU5UUlkgPSA1OworICAgIC8qKgorICAgICAqIHNlYXJjaCBhIGJ1bmRsZSBtYXRjaGluZyB0aGUgbGFuZ3VhZ2Ugb25seQorICAgICAqIG9mIHRoZSBjdXJyZW50IGxvY2FsZSBvZiB0aGUgY29tcHV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVORExFX0RFRkFVTFRfTEFOR1VBR0UgPSA2OworICAgIC8qKgorICAgICAqIG51bWJlciBvZiBwb3NzaWJpbGl0aWVzIGZvciB0aGUgc2VhcmNoCisgICAgICovCisgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVU5ETEVfTUFYX0FMVEVSTkFUSVZFUyA9IEJVTkRMRV9ERUZBVUxUX0xBTkdVQUdFICsgMTsKKyAgICAvKioKKyAgICAgKiBGYW1pbHkgbmFtZSBvZiByZXNvdXJjZSBidW5kbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBidW5kbGU7CisKKyAgICAvKioKKyAgICAgKiBMb2NhbGUgc3BlY2lmaWMgbGFuZ3VhZ2Ugb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGJ1bmRsZUxhbmd1YWdlOworCisgICAgLyoqCisgICAgICogTG9jYWxlIHNwZWNpZmljIGNvdW50cnkgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGJ1bmRsZUNvdW50cnk7CisKKyAgICAvKioKKyAgICAgKiBMb2NhbGUgc3BlY2lmaWMgdmFyaWFudCBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYnVuZGxlVmFyaWFudDsKKworICAgIC8qKgorICAgICAqIERlc3RpbmF0aW9uIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgRmlsZSB0b0RpcjsKKworICAgIC8qKgorICAgICAqIFNvdXJjZSBmaWxlIGVuY29kaW5nIHNjaGVtZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNyY0VuY29kaW5nOworCisgICAgLyoqCisgICAgICogRGVzdGluYXRpb24gZmlsZSBlbmNvZGluZyBzY2hlbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXN0RW5jb2Rpbmc7CisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBCdW5kbGUgZmlsZSBlbmNvZGluZyBzY2hlbWUsIGRlZmF1bHRzIHRvIHNyY0VuY29kaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYnVuZGxlRW5jb2Rpbmc7CisKKyAgICAvKioKKyAgICAgKiBTdGFydGluZyB0b2tlbiB0byBpZGVudGlmeSBrZXlzCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhcnRUb2tlbjsKKworICAgIC8qKgorICAgICAqIEVuZGluZyB0b2tlbiB0byBpZGVudGlmeSBrZXlzCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5kVG9rZW47CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgYSBuZXcgZGVzdGluYXRpb24gZmlsZS4KKyAgICAgKiBEZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZvcmNlT3ZlcndyaXRlOworCisgICAgLyoqCisgICAgICogVmVjdG9yIHRvIGhvbGQgc291cmNlIGZpbGUgc2V0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIEhvbGRzIGtleSB2YWx1ZSBwYWlycyBsb2FkZWQgZnJvbSByZXNvdXJjZSBidW5kbGUgZmlsZQorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHJlc291cmNlTWFwID0gbmV3IEhhc2h0YWJsZSgpOworICAgIC8qKgorCisgICAgICogVXNlZCB0byByZXNvbHZlIGZpbGUgbmFtZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKioKKyAgICAgKiBMYXN0IE1vZGlmaWVkIFRpbWVzdGFtcCBvZiByZXNvdXJjZSBidW5kbGUgZmlsZSBiZWluZyB1c2VkLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZ1tdIGJ1bmRsZUxhc3RNb2RpZmllZCA9IG5ldyBsb25nW0JVTkRMRV9NQVhfQUxURVJOQVRJVkVTXTsKKworICAgIC8qKgorICAgICAqIExhc3QgTW9kaWZpZWQgVGltZXN0YW1wIG9mIHNvdXJjZSBmaWxlIGJlaW5nIHVzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHNyY0xhc3RNb2RpZmllZDsKKworICAgIC8qKgorICAgICAqIExhc3QgTW9kaWZpZWQgVGltZXN0YW1wIG9mIGRlc3RpbmF0aW9uIGZpbGUgYmVpbmcgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgZGVzdExhc3RNb2RpZmllZDsKKworICAgIC8qKgorICAgICAqIEhhcyBhdCBsZWFzdCBvbmUgZmlsZSBmcm9tIHRoZSBidW5kbGUgYmVlbiBsb2FkZWQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGxvYWRlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogU2V0cyBGYW1pbHkgbmFtZSBvZiByZXNvdXJjZSBidW5kbGU7IHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBidW5kbGUgZmFtaWx5IG5hbWUgb2YgcmVzb3VyY2UgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVuZGxlKFN0cmluZyBidW5kbGUpIHsKKyAgICAgICAgdGhpcy5idW5kbGUgPSBidW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBsb2NhbGUgc3BlY2lmaWMgbGFuZ3VhZ2Ugb2YgcmVzb3VyY2UgYnVuZGxlOyBvcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gYnVuZGxlTGFuZ3VhZ2UgbGFuZ2FnZSBvZiB0aGUgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVuZGxlTGFuZ3VhZ2UoU3RyaW5nIGJ1bmRsZUxhbmd1YWdlKSB7CisgICAgICAgIHRoaXMuYnVuZGxlTGFuZ3VhZ2UgPSBidW5kbGVMYW5ndWFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGxvY2FsZSBzcGVjaWZpYyBjb3VudHJ5IG9mIHJlc291cmNlIGJ1bmRsZTsgb3B0aW9uYWwuCisgICAgICogQHBhcmFtIGJ1bmRsZUNvdW50cnkgY291bnRyeSBvZiB0aGUgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVuZGxlQ291bnRyeShTdHJpbmcgYnVuZGxlQ291bnRyeSkgeworICAgICAgICB0aGlzLmJ1bmRsZUNvdW50cnkgPSBidW5kbGVDb3VudHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgbG9jYWxlIHNwZWNpZmljIHZhcmlhbnQgb2YgcmVzb3VyY2UgYnVuZGxlOyBvcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gYnVuZGxlVmFyaWFudCBsb2NhbGUgdmFyaWFudCBvZiByZXNvdXJjZSBidW5kbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdW5kbGVWYXJpYW50KFN0cmluZyBidW5kbGVWYXJpYW50KSB7CisgICAgICAgIHRoaXMuYnVuZGxlVmFyaWFudCA9IGJ1bmRsZVZhcmlhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBEZXN0aW5hdGlvbiBkaXJlY3Rvcnk7IHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSB0b0RpciBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb0RpcihGaWxlIHRvRGlyKSB7CisgICAgICAgIHRoaXMudG9EaXIgPSB0b0RpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHN0YXJ0aW5nIHRva2VuIHRvIGlkZW50aWZ5IGtleXM7IHJlcXVpcmVkLgorICAgICAqIEBwYXJhbSBzdGFydFRva2VuIHN0YXJ0aW5nIHRva2VuIHRvIGlkZW50aWZ5IGtleXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFRva2VuKFN0cmluZyBzdGFydFRva2VuKSB7CisgICAgICAgIHRoaXMuc3RhcnRUb2tlbiA9IHN0YXJ0VG9rZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBlbmRpbmcgdG9rZW4gdG8gaWRlbnRpZnkga2V5czsgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIGVuZFRva2VuIGVuZGluZyB0b2tlbiB0byBpZGVudGlmeSBrZXlzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5kVG9rZW4oU3RyaW5nIGVuZFRva2VuKSB7CisgICAgICAgIHRoaXMuZW5kVG9rZW4gPSBlbmRUb2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHNvdXJjZSBmaWxlIGVuY29kaW5nIHNjaGVtZTsgb3B0aW9uYWwsCisgICAgICogZGVmYXVsdHMgdG8gZW5jb2Rpbmcgb2YgbG9jYWwgc3lzdGVtLgorICAgICAqIEBwYXJhbSBzcmNFbmNvZGluZyBzb3VyY2UgZmlsZSBlbmNvZGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY0VuY29kaW5nKFN0cmluZyBzcmNFbmNvZGluZykgeworICAgICAgICB0aGlzLnNyY0VuY29kaW5nID0gc3JjRW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBkZXN0aW5hdGlvbiBmaWxlIGVuY29kaW5nIHNjaGVtZTsgb3B0aW9uYWwuICBEZWZhdWx0cyB0byBzb3VyY2UgZmlsZQorICAgICAqIGVuY29kaW5nCisgICAgICogQHBhcmFtIGRlc3RFbmNvZGluZyBkZXN0aW5hdGlvbiBmaWxlIGVuY29kaW5nIHNjaGVtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RFbmNvZGluZyhTdHJpbmcgZGVzdEVuY29kaW5nKSB7CisgICAgICAgIHRoaXMuZGVzdEVuY29kaW5nID0gZGVzdEVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgUmVzb3VyY2UgQnVuZGxlIGZpbGUgZW5jb2Rpbmcgc2NoZW1lOyBvcHRpb25hbC4gIERlZmF1bHRzIHRvIHNvdXJjZSBmaWxlCisgICAgICogZW5jb2RpbmcKKyAgICAgKiBAcGFyYW0gYnVuZGxlRW5jb2RpbmcgYnVuZGxlIGZpbGUgZW5jb2Rpbmcgc2NoZW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVuZGxlRW5jb2RpbmcoU3RyaW5nIGJ1bmRsZUVuY29kaW5nKSB7CisgICAgICAgIHRoaXMuYnVuZGxlRW5jb2RpbmcgPSBidW5kbGVFbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBpcnJlc3BlY3RpdmUgb2YKKyAgICAgKiB3aGV0aGVyIGl0IGlzIG5ld2VyIHRoYW4gdGhlIHNvdXJjZSBmaWxlIGFzIHdlbGwgYXMgdGhlCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGZpbGUuCisgICAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICogQHBhcmFtIGZvcmNlT3ZlcndyaXRlIHdoZXRoZXIgb3Igbm90IHRvIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlT3ZlcndyaXRlKGJvb2xlYW4gZm9yY2VPdmVyd3JpdGUpIHsKKyAgICAgICAgdGhpcy5mb3JjZU92ZXJ3cml0ZSA9IGZvcmNlT3ZlcndyaXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgdG8gdHJhbnNsYXRlIGFzIGEgbmVzdGVkIGZpbGVzZXQgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gc2V0IHRoZSBmaWxlc2V0IHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgYXR0cmlidXRlcyB2YWx1ZXMsIGxvYWQgcmVzb3VyY2UgbWFwIGFuZCB0cmFuc2xhdGUKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZSBub3Qgc2V0CisgICAgICogUmVxdWlyZWQgOiA8dWw+CisgICAgICogICAgICAgPGxpPmJ1bmRsZTwvbGk+CisgICAgICogICAgICAgPGxpPnN0YXJ0dG9rZW48L2xpPgorICAgICAqICAgICAgIDxsaT5lbmR0b2tlbjwvbGk+CisgICAgICogICAgICAgICAgICA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGJ1bmRsZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFydFRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHN0YXJ0dG9rZW4gYXR0cmlidXRlIG11c3QgYmUgc2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5kVG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZW5kdG9rZW4gYXR0cmlidXRlIG11c3QgYmUgc2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVuZGxlTGFuZ3VhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9jYWxlIGwgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOworICAgICAgICAgICAgYnVuZGxlTGFuZ3VhZ2UgID0gbC5nZXRMYW5ndWFnZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ1bmRsZUNvdW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgYnVuZGxlQ291bnRyeSA9IExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0Q291bnRyeSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ1bmRsZVZhcmlhbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9jYWxlIGwgPSBuZXcgTG9jYWxlKGJ1bmRsZUxhbmd1YWdlLCBidW5kbGVDb3VudHJ5KTsKKyAgICAgICAgICAgIGJ1bmRsZVZhcmlhbnQgPSBsLmdldFZhcmlhbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0b0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSB0b2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdG9EaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRvRGlyLm1rZGlycygpOworICAgICAgICB9IGVsc2UgaWYgKHRvRGlyLmlzRmlsZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odG9EaXIgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNyY0VuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyY0VuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdEVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3RFbmNvZGluZyA9IHNyY0VuY29kaW5nOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ1bmRsZUVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGJ1bmRsZUVuY29kaW5nID0gc3JjRW5jb2Rpbmc7CisgICAgICAgIH0KKworICAgICAgICBsb2FkUmVzb3VyY2VNYXBzKCk7CisKKyAgICAgICAgdHJhbnNsYXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCByZXNvdXJjZSBtYXBzIGJhc2VkIG9uIHJlc291cmNlIGJ1bmRsZSBlbmNvZGluZyBzY2hlbWUuCisgICAgICogVGhlIHJlc291cmNlIGJ1bmRsZSBsb29rdXAgc2VhcmNoZXMgZm9yIHJlc291cmNlIGZpbGVzIHdpdGggdmFyaW91cworICAgICAqIHN1ZmZpeGVzIG9uIHRoZSBiYXNpcyBvZiAoMSkgdGhlIGRlc2lyZWQgbG9jYWxlIGFuZCAoMikgdGhlIGRlZmF1bHQKKyAgICAgKiBsb2NhbGUgKGJhc2VidW5kbGVuYW1lKSwgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBmcm9tIGxvd2VyLWxldmVsCisgICAgICogKG1vcmUgc3BlY2lmaWMpIHRvIHBhcmVudC1sZXZlbCAobGVzcyBzcGVjaWZpYyk6CisgICAgICoKKyAgICAgKiBiYXNlYnVuZGxlbmFtZSArICJfIiArIGxhbmd1YWdlMSArICJfIiArIGNvdW50cnkxICsgIl8iICsgdmFyaWFudDEKKyAgICAgKiBiYXNlYnVuZGxlbmFtZSArICJfIiArIGxhbmd1YWdlMSArICJfIiArIGNvdW50cnkxCisgICAgICogYmFzZWJ1bmRsZW5hbWUgKyAiXyIgKyBsYW5ndWFnZTEKKyAgICAgKiBiYXNlYnVuZGxlbmFtZQorICAgICAqIGJhc2VidW5kbGVuYW1lICsgIl8iICsgbGFuZ3VhZ2UyICsgIl8iICsgY291bnRyeTIgKyAiXyIgKyB2YXJpYW50MgorICAgICAqIGJhc2VidW5kbGVuYW1lICsgIl8iICsgbGFuZ3VhZ2UyICsgIl8iICsgY291bnRyeTIKKyAgICAgKiBiYXNlYnVuZGxlbmFtZSArICJfIiArIGxhbmd1YWdlMgorICAgICAqCisgICAgICogVG8gdGhlIGdlbmVyYXRlZCBuYW1lLCBhICIucHJvcGVydGllcyIgc3RyaW5nIGlzIGFwcGVuZWRlZCBhbmQKKyAgICAgKiBvbmNlIHRoaXMgZmlsZSBpcyBsb2NhdGVkLCBpdCBpcyB0cmVhdGVkIGp1c3QgbGlrZSBhIHByb3BlcnRpZXMgZmlsZQorICAgICAqIGJ1dCB3aXRoIGJ1bmRsZSBlbmNvZGluZyBhbHNvIGNvbnNpZGVyZWQgd2hpbGUgbG9hZGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9hZFJlc291cmNlTWFwcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBuZXcgTG9jYWxlKGJ1bmRsZUxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVDb3VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVWYXJpYW50KTsKKyAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCkubGVuZ3RoKCkgPiAwCisgICAgICAgICAgICA/ICJfIiArIGxvY2FsZS5nZXRMYW5ndWFnZSgpIDogIiI7CisgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKS5sZW5ndGgoKSA+IDAKKyAgICAgICAgICAgID8gIl8iICsgbG9jYWxlLmdldENvdW50cnkoKSA6ICIiOworICAgICAgICBTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCkubGVuZ3RoKCkgPiAwCisgICAgICAgICAgICA/ICJfIiArIGxvY2FsZS5nZXRWYXJpYW50KCkgOiAiIjsKKyAgICAgICAgU3RyaW5nIGJ1bmRsZUZpbGUgPSBidW5kbGUgKyBsYW5ndWFnZSArIGNvdW50cnkgKyB2YXJpYW50OworICAgICAgICBwcm9jZXNzQnVuZGxlKGJ1bmRsZUZpbGUsIEJVTkRMRV9TUEVDSUZJRURfTEFOR1VBR0VfQ09VTlRSWV9WQVJJQU5ULCBmYWxzZSk7CisKKyAgICAgICAgYnVuZGxlRmlsZSA9IGJ1bmRsZSArIGxhbmd1YWdlICsgY291bnRyeTsKKyAgICAgICAgcHJvY2Vzc0J1bmRsZShidW5kbGVGaWxlLCBCVU5ETEVfU1BFQ0lGSUVEX0xBTkdVQUdFX0NPVU5UUlksIGZhbHNlKTsKKworICAgICAgICBidW5kbGVGaWxlID0gYnVuZGxlICsgbGFuZ3VhZ2U7CisgICAgICAgIHByb2Nlc3NCdW5kbGUoYnVuZGxlRmlsZSwgQlVORExFX1NQRUNJRklFRF9MQU5HVUFHRSwgZmFsc2UpOworCisgICAgICAgIGJ1bmRsZUZpbGUgPSBidW5kbGU7CisgICAgICAgIHByb2Nlc3NCdW5kbGUoYnVuZGxlRmlsZSwgQlVORExFX05PTUFUQ0gsIGZhbHNlKTsKKworICAgICAgICAvL0xvYWQgZGVmYXVsdCBsb2NhbGUgYnVuZGxlIGZpbGVzCisgICAgICAgIC8vdXNpbmcgZGVmYXVsdCBmaWxlIGVuY29kaW5nIHNjaGVtZS4KKyAgICAgICAgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKworICAgICAgICBsYW5ndWFnZSA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpLmxlbmd0aCgpID4gMAorICAgICAgICAgICAgPyAiXyIgKyBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSA6ICIiOworICAgICAgICBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKS5sZW5ndGgoKSA+IDAKKyAgICAgICAgICAgID8gIl8iICsgbG9jYWxlLmdldENvdW50cnkoKSA6ICIiOworICAgICAgICB2YXJpYW50ID0gbG9jYWxlLmdldFZhcmlhbnQoKS5sZW5ndGgoKSA+IDAKKyAgICAgICAgICAgID8gIl8iICsgbG9jYWxlLmdldFZhcmlhbnQoKSA6ICIiOworICAgICAgICBidW5kbGVFbmNvZGluZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOworCisgICAgICAgIGJ1bmRsZUZpbGUgPSBidW5kbGUgKyBsYW5ndWFnZSArIGNvdW50cnkgKyB2YXJpYW50OworICAgICAgICBwcm9jZXNzQnVuZGxlKGJ1bmRsZUZpbGUsIEJVTkRMRV9ERUZBVUxUX0xBTkdVQUdFX0NPVU5UUllfVkFSSUFOVCwgZmFsc2UpOworCisgICAgICAgIGJ1bmRsZUZpbGUgPSBidW5kbGUgKyBsYW5ndWFnZSArIGNvdW50cnk7CisgICAgICAgIHByb2Nlc3NCdW5kbGUoYnVuZGxlRmlsZSwgQlVORExFX0RFRkFVTFRfTEFOR1VBR0VfQ09VTlRSWSwgZmFsc2UpOworCisgICAgICAgIGJ1bmRsZUZpbGUgPSBidW5kbGUgKyBsYW5ndWFnZTsKKyAgICAgICAgcHJvY2Vzc0J1bmRsZShidW5kbGVGaWxlLCBCVU5ETEVfREVGQVVMVF9MQU5HVUFHRSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBlYWNoIGZpbGUgdGhhdCBtYWtlcyB1cCB0aGlzIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0J1bmRsZShmaW5hbCBTdHJpbmcgYnVuZGxlRmlsZSwgZmluYWwgaW50IGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja0xvYWRlZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSBwcm9wc0ZpbGUgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoYnVuZGxlRmlsZSArICIucHJvcGVydGllcyIpOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5zID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlucyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcHNGaWxlKTsKKyAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7CisgICAgICAgICAgICBidW5kbGVMYXN0TW9kaWZpZWRbaV0gPSBwcm9wc0ZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBsb2coIlVzaW5nICIgKyBwcm9wc0ZpbGUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIGxvYWRSZXNvdXJjZU1hcChpbnMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGxvZyhwcm9wc0ZpbGUgKyAiIG5vdCBmb3VuZC4iLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAvL2lmIGFsbCByZXNvdXJjZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidW5kbGUKKyAgICAgICAgICAgIC8vaGF2ZSBiZWVuIHNjYW5uZWQgZm9yIGFuZCBzdGlsbCBub3QgYWJsZSB0bworICAgICAgICAgICAgLy9maW5kIGEgc2luZ2xlIHJlc3JvdWNlIGZpbGUsIHRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgaWYgKCFsb2FkZWQgJiYgY2hlY2tMb2FkZWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHJlc291cmNlTWFwIHdpdGgga2V5IHZhbHVlIHBhaXJzLiAgVmFsdWVzIG9mIGV4aXN0aW5nIGtleXMKKyAgICAgKiBhcmUgbm90IG92ZXJ3cml0dGVuLiAgQnVuZGxlJ3MgZW5jb2Rpbmcgc2NoZW1lIGlzIHVzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRSZXNvdXJjZU1hcChGaWxlSW5wdXRTdHJlYW0gaW5zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOworICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucywgYnVuZGxlRW5jb2RpbmcpOworICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvL1NvIGxvbmcgYXMgdGhlIGxpbmUgaXNuJ3QgZW1wdHkgYW5kIGlzbid0IGEgY29tbWVudC4uLgorICAgICAgICAgICAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA+IDEgJiYgJyMnICE9IGxpbmUuY2hhckF0KDApICYmICchJyAhPSBsaW5lLmNoYXJBdCgwKSkgeworICAgICAgICAgICAgICAgICAgICAvL0xlZ2FsIEtleS1WYWx1ZSBzZXBhcmF0b3JzIGFyZSA6LCA9IGFuZCB3aGl0ZSBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgaW50IHNlcEluZGV4ID0gbGluZS5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgtMSA9PSBzZXBJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VwSW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPT0gc2VwSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbGluZS5sZW5ndGgoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1NwYWNlQ2hhcihsaW5lLmNoYXJBdChrKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwSW5kZXggPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9Pbmx5IGlmIHdlIGRvIGhhdmUgYSBrZXkgaXMgdGhlcmUgZ29pbmcgdG8gYmUgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBpZiAoLTEgIT0gc2VwSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBzZXBJbmRleCkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbGluZS5zdWJzdHJpbmcoc2VwSW5kZXggKyAxKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0hhbmRsZSBsaW5lIGNvbnRpbnVhdGlvbnMsIGlmIGFueQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlLmVuZHNXaXRoKCJcXCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gaW4ucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyBsaW5lLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSGFzIGtleSBhbHJlYWR5IGJlZW4gbG9hZGVkIGludG8gcmVzb3VyY2VNYXA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlTWFwLmdldChrZXkpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNYXAucHV0KGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBzb3VyY2UgZmlsZSBsaW5lIGJ5IGxpbmUgdXNpbmcgdGhlIHNvdXJjZSBlbmNvZGluZyBhbmQKKyAgICAgKiBzZWFyY2hlcyBmb3Iga2V5cyB0aGF0IGFyZSBzYW5kd2ljaGVkIGJldHdlZW4gdGhlIHN0YXJ0VG9rZW4KKyAgICAgKiBhbmQgZW5kVG9rZW4uICBUaGUgdmFsdWVzIGZvciB0aGVzZSBrZXlzIGFyZSBsb29rZWQgdXAgZnJvbQorICAgICAqIHRoZSBoYXNodGFibGUgYW5kIHN1YnN0aXR1dGVkLiAgSWYgdGhlIGhhc2h0YWJsZSBkb2Vzbid0CisgICAgICogY29udGFpbiB0aGUga2V5LCB0aGV5IGtleSBpdHNlbGYgaXMgdXNlZCBhcyB0aGUgdmFsdWUuCisgICAgICogRGV0aW5hdGlvbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQgYXMgbmVlZGVkLgorICAgICAqIFRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzIG92ZXJ3cml0dGVuIG9ubHkgaWYKKyAgICAgKiB0aGUgZm9yY2VvdmVyd3JpdHRlbiBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgaWYKKyAgICAgKiB0aGUgc291cmNlIGZpbGUgb3IgYW55IGFzc29jaWF0ZWQgYnVuZGxlIHJlc291cmNlIGZpbGUgaXMKKyAgICAgKiBuZXdlciB0aGFuIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0cmFuc2xhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpbnQgZmlsZXNQcm9jZXNzZWQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzZXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBTdHJpbmdbXSBzcmNGaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3JjRmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc3QgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKHRvRGlyLCBzcmNGaWxlc1tqXSk7CisgICAgICAgICAgICAgICAgICAgIC8vTWFrZSBzdXJlIHBhcmVudCBkaXJzIGV4aXN0LCBlbHNlLCBjcmVhdGUgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZGVzdERpciA9IG5ldyBGaWxlKGRlc3QuZ2V0UGFyZW50KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXN0RGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdERpci5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBjaGVjay9jcmVhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYXJlbnQgZGlyZWN0b3J5LiAgIiArIGUuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZXN0TGFzdE1vZGlmaWVkID0gZGVzdC5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBzcmMgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGRzLmdldEJhc2VkaXIoKSwgc3JjRmlsZXNbal0pOworICAgICAgICAgICAgICAgICAgICBzcmNMYXN0TW9kaWZpZWQgPSBzcmMubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgdG8gc2VlIGlmIGRlc3QgZmlsZSBoYXMgdG8gYmUgcmVjcmVhdGVkCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNXb3JrID0gZm9yY2VPdmVyd3JpdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlc3RMYXN0TW9kaWZpZWQgPCBzcmNMYXN0TW9kaWZpZWQ7CisgICAgICAgICAgICAgICAgICAgIGlmICghbmVlZHNXb3JrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpY291bnRlciA9IDA7IGljb3VudGVyIDwgQlVORExFX01BWF9BTFRFUk5BVElWRVM7IGljb3VudGVyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc1dvcmsgPSAoZGVzdExhc3RNb2RpZmllZCA8IGJ1bmRsZUxhc3RNb2RpZmllZFtpY291bnRlcl0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc1dvcmspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc1dvcmspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiUHJvY2Vzc2luZyAiICsgc3JjRmlsZXNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCBkZXN0RW5jb2RpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsIHNyY0VuY29kaW5nKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmVUb2tlbml6ZXIgbGluZVRva2VuaXplciA9IG5ldyBMaW5lVG9rZW5pemVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVG9rZW5pemVyLnNldEluY2x1ZGVEZWxpbXModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVRva2VuaXplci5nZXRUb2tlbihpbik7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyMDAzLTAyLTIxIG5ldyByZXBsYWNlIGFsZ29yaXRobSBieSB0YmVlICh0YmVlQHRiZWUub3JnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQgd2Fzbid0IGFibGUgdG8gcmVwbGFjZSBzb21ldGhpbmcgbGlrZSAiQGFhYTtAYmJiOyIKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgc3RhcnRUb2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVyZSBpcyBzdGlsbCBzdHVmZiBmb2xsb3dpbmcgdGhlIHN0YXJ0VG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRJbmRleCA9IGxpbmUuaW5kZXhPZihzdGFydFRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhcnRJbmRleCA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChzdGFydEluZGV4ICsgc3RhcnRUb2tlbi5sZW5ndGgoKSkgPD0gbGluZS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3IHZhbHVlLCB0aGlzIG5lZWRzIHRvIGJlIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCBpcyByZXF1aXJlZCB0byBjYWxjdWxhdGUgdGhlIG5leHQgcG9zaXRpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZyb20gYXQgdGhlIGVuZCBvZiB0aGUgbG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwbGFjZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZm91bmQgYSBzdGFydHRva2VuLCBpcyB0aGVyZSBhbiBlbmR0b2tlbiBmb2xsb3dpbmc/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGF0IHRva2VuK3Rva2VubGVuZ3RoIGJlY2F1c2Ugc3RhcnQgYW5kIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBtYXkgYmUgaW5kZW50aWNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kSW5kZXggPSBsaW5lLmluZGV4T2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUb2tlbiwgc3RhcnRJbmRleCArIHN0YXJ0VG9rZW4ubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFiIHRoZSB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gbGluZS5zdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCArIHN0YXJ0VG9rZW4ubGVuZ3RoKCksIGVuZEluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSB3aGl0ZSBzcGFjZSBvciA9IG9yIDosIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzbid0IHRvIGJlIHRyZWF0ZWQgYXMgYSB2YWxpZCBrZXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZhbGlkVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB0b2tlbi5sZW5ndGgoKSAmJiB2YWxpZFRva2VuOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSB0b2tlbi5jaGFyQXQoayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzonIHx8IGMgPT0gJz0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IENoYXJhY3Rlci5pc1NwYWNlQ2hhcihjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFRva2VuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWxpZFRva2VuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSByZXBsYWNlIHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU1hcC5jb250YWluc0tleSh0b2tlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSA9IChTdHJpbmcpIHJlc291cmNlTWFwLmdldCh0b2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJSZXBsYWNlbWVudCBzdHJpbmcgbWlzc2luZyBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9rZW4sIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlID0gc3RhcnRUb2tlbiArIHRva2VuICsgZW5kVG9rZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgbmV3IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVwbGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lLnN1YnN0cmluZyhlbmRJbmRleCArIGVuZFRva2VuLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBzdGFydCBwb3NpdGlvbiBmb3IgbmV4dCBzZWFyY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ICs9IHJlcGxhY2UubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIG5leHQgc3RhcnR0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gbGluZS5pbmRleE9mKHN0YXJ0VG9rZW4sIHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUobGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVUb2tlbml6ZXIuZ2V0VG9rZW4oaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICArK2ZpbGVzUHJvY2Vzc2VkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGluZyAiICsgc3JjRmlsZXNbal0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXMgZGVzdGluYXRpb24gZmlsZSBpcyB1cCB0byBkYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZygiVHJhbnNsYXRpb24gcGVyZm9ybWVkIG9uICIgKyBmaWxlc1Byb2Nlc3NlZCArICIgZmlsZShzKS4iLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3OWMwYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlLmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2U7CisKK2ltcG9ydCBjb20uc3VuLm1lZGlhLmphaS5jb2RlYy5GaWxlU2Vla2FibGVTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZS5EcmF3OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlLkltYWdlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlLlJvdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZS5TY2FsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZS5UcmFuc2Zvcm1PcGVyYXRpb247CisKK2ltcG9ydCBqYXZheC5tZWRpYS5qYWkuSkFJOworaW1wb3J0IGphdmF4Lm1lZGlhLmphaS5QbGFuYXJJbWFnZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiBBIE1hdGNoaW5nVGFzayB3aGljaCByZWxpZXMgb24gPGEKKyAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YS1tZWRpYS9qYWkiPkpBSSAoSmF2YQorICogQWR2YW5jZWQgSW1hZ2luZyk8L2E+IHRvIHBlcmZvcm0gaW1hZ2UgbWFuaXB1bGF0aW9uIG9wZXJhdGlvbnMgb24KKyAqIGV4aXN0aW5nIGltYWdlcy4gIFRoZSBvcGVyYXRpb25zIGFyZSByZXByZXNlbnRlZCBhcyBJbWFnZU9wZXJhdGlvbgorICogRGF0YVR5cGUgb2JqZWN0cy4gIFRoZSBvcGVyYXRpb25zIGFyZSBhcnJhbmdlZCB0byBjb25mb3JtIHRvIHRoZQorICogQ2hhaW5pbmcgTW9kZWwgb2YgSkFJLiAgQ2hlY2sgb3V0IHRoZSA8YQorICogaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhLW1lZGlhL2phaS9mb3JEZXZlbG9wZXJzL2phaTFfMF8xZ3VpZGUtdW5jLyI+CisgKiBKQUkgUHJvZ3JhbW1pbmcgR3VpZGU8L2E+LgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2UuSW1hZ2VPcGVyYXRpb24KKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGUKKyAqLworcHVibGljIGNsYXNzIEltYWdlIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBWZWN0b3IgaW5zdHJ1Y3Rpb25zID0gbmV3IFZlY3RvcigpOworICAgIHByb3RlY3RlZCBib29sZWFuIG92ZXJ3cml0ZSA9IGZhbHNlOworICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJvdGVjdGVkIEZpbGUgc3JjRGlyID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RGlyID0gbnVsbDsKKworICAgIC8vIENoZWNrU3R5bGU6TWVtYmVyTmFtZUNoZWNrIE9GRiAtIGJjCisKKyAgICAvL2Nhbm5vdCByZW1vdmUgdW5kZXJzY29yZXMgZHVlIHRvIHByb3RlY3RlZCB2aXNpYmlsaXR5ID46KAorICAgIHByb3RlY3RlZCBTdHJpbmcgc3RyX2VuY29kaW5nID0gIkpQRUciOworICAgIHByb3RlY3RlZCBib29sZWFuIGdhcmJhZ2VfY29sbGVjdCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxvbmVycm9yID0gdHJ1ZTsKKworICAgIC8vIENoZWNrU3R5bGU6TWVtYmVyTmFtZUNoZWNrIE9OCisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIGZpbGVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHNldCB0aGUgRmlsZVNldCB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gZmFpbCBvbiBlcnJvci4KKyAgICAgKiBJZiBmYWxzZSwgbm90ZSBlcnJvcnMgdG8gdGhlIG91dHB1dCBidXQga2VlcCBnb2luZy4KKyAgICAgKiBAcGFyYW0gZmFpbG9uZXJyb3IgdHJ1ZSBvciBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWxvbmVycm9yKSB7CisgICAgICAgIHRoaXMuZmFpbG9uZXJyb3IgPSBmYWlsb25lcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNvdXJjZSBkaXIgdG8gZmluZCB0aGUgaW1hZ2UgZmlsZXMuCisgICAgICogQHBhcmFtIHNyY0RpciB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBpbWFnZSBmaWxlcyByZXNpZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjZGlyKEZpbGUgc3JjRGlyKSB7CisgICAgICAgIHRoaXMuc3JjRGlyID0gc3JjRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW1hZ2UgZW5jb2RpbmcgdHlwZS4gIDxhCisgICAgICogaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhLW1lZGlhL2phaS9mb3JEZXZlbG9wZXJzL2phaTFfMF8xZ3VpZGUtdW5jL0VuY29kZS5kb2MuaHRtbCM1NjYxMCI+CisgICAgICogU2VlIHRoaXMgdGFibGUgaW4gdGhlIEpBSSBQcm9ncmFtbWluZyBHdWlkZTwvYT4uCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBTdHJpbmcgaW1hZ2UgZW5jb2RpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHN0cl9lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIG92ZXJ3cml0ZSBhIGZpbGUgaWYgdGhlcmUgaXMgYSBuYW1pbmcgY29uZmxpY3QuCisgICAgICogQHBhcmFtIG92ZXJ3cml0ZSB3aGV0aGVyIHRvIG92ZXJ3cml0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoYm9vbGVhbiBvdmVyd3JpdGUpIHsKKyAgICAgICAgdGhpcy5vdmVyd3JpdGUgPSBvdmVyd3JpdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gaW52b2tlIEdhcmJhZ2UgQ29sbGVjdGlvbiBhZnRlciBlYWNoIGltYWdlIHByb2Nlc3NlZC4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0gZ2Mgd2hldGhlciB0byBpbnZva2UgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdjKGJvb2xlYW4gZ2MpIHsKKyAgICAgICAgZ2FyYmFnZV9jb2xsZWN0ID0gZ2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZm9yIG1hbmlwdWxhdGVkIGltYWdlcy4KKyAgICAgKiBAcGFyYW0gZGVzdERpciBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3REaXIoRmlsZSBkZXN0RGlyKSB7CisgICAgICAgIHRoaXMuZGVzdERpciA9IGRlc3REaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIEltYWdlT3BlcmF0aW9uIHRvIGNoYWluLgorICAgICAqIEBwYXJhbSBpbnN0ciBUaGUgSW1hZ2VPcGVyYXRpb24gdG8gYXBwZW5kIHRvIHRoZSBjaGFpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJbWFnZU9wZXJhdGlvbihJbWFnZU9wZXJhdGlvbiBpbnN0cikgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGluc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBSb3RhdGUgSW1hZ2VPcGVyYXRpb24gdG8gdGhlIGNoYWluLgorICAgICAqIEBwYXJhbSBpbnN0ciBUaGUgUm90YXRlIG9wZXJhdGlvbiB0byBhZGQgdG8gdGhlIGNoYWluLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2UuUm90YXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUm90YXRlKFJvdGF0ZSBpbnN0cikgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGluc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBTY2FsZSBJbWFnZU9wZXJhdGlvbiB0byB0aGUgY2hhaW4uCisgICAgICogQHBhcmFtIGluc3RyIFRoZSBTY2FsZSBvcGVyYXRpb24gdG8gYWRkIHRvIHRoZSBjaGFpbi4KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlLlNjYWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2NhbGUoU2NhbGUgaW5zdHIpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChpbnN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgRHJhdyBJbWFnZU9wZXJhdGlvbiB0byB0aGUgY2hhaW4uICBEcmF3T3BlcmF0aW9uCisgICAgICogRGF0YVR5cGUgb2JqZWN0cyBjYW4gYmUgbmVzdGVkIGluc2lkZSB0aGUgRHJhdyBvYmplY3QuCisgICAgICogQHBhcmFtIGluc3RyIFRoZSBEcmF3IG9wZXJhdGlvbiB0byBhZGQgdG8gdGhlIGNoYWluLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2UuRHJhdworICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2UuRHJhd09wZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERyYXcoRHJhdyBpbnN0cikgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGluc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIEFkZCBhbiBJbWFnZU9wZXJhdGlvbiB0byBjaGFpbi4KKyAgICAqIEBwYXJhbSBpbnN0ciBUaGUgSW1hZ2VPcGVyYXRpb24gdG8gYXBwZW5kIHRvIHRoZSBjaGFpbi4KKyAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoSW1hZ2VPcGVyYXRpb24gaW5zdHIpIHsKKyAgICAgICAgYWRkSW1hZ2VPcGVyYXRpb24oaW5zdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGFsbCB0aGUgY2hhaW5lZCBJbWFnZU9wZXJhdGlvbnMgb24gdGhlIGZpbGUKKyAgICAgKiBzcGVjaWZpZWQuCisgICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nKCJQcm9jZXNzaW5nIEZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIEZpbGVTZWVrYWJsZVN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlU2Vla2FibGVTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICBQbGFuYXJJbWFnZSBpbWFnZSA9IEpBSS5jcmVhdGUoInN0cmVhbSIsIGlucHV0KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGluc3RyID0gaW5zdHJ1Y3Rpb25zLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UgPSAoKFRyYW5zZm9ybU9wZXJhdGlvbikgaW5zdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihpbWFnZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJOb3QgYSBUcmFuc2Zvcm1PcGVyYXRpb246ICIgKyBpbnN0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKKworICAgICAgICAgICAgaWYgKHN0cl9lbmNvZGluZy50b0xvd2VyQ2FzZSgpLmVxdWFscygianBnIikpIHsKKyAgICAgICAgICAgICAgICBzdHJfZW5jb2RpbmcgPSAiSlBFRyI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cl9lbmNvZGluZy50b0xvd2VyQ2FzZSgpLmVxdWFscygidGlmIikpIHsKKyAgICAgICAgICAgICAgICBzdHJfZW5jb2RpbmcgPSAiVElGRiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdERpciA9IHNyY0RpcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsIGZpbGUuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgaWYgKChvdmVyd3JpdGUgJiYgbmV3RmlsZS5leGlzdHMoKSkgJiYgKCFuZXdGaWxlLmVxdWFscyhmaWxlKSkpIHsKKyAgICAgICAgICAgICAgICBuZXdGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXdGaWxlKTsKKworICAgICAgICAgICAgSkFJLmNyZWF0ZSgiZW5jb2RlIiwgaW1hZ2UsIHN0cmVhbSwgc3RyX2VuY29kaW5nLnRvVXBwZXJDYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCk7CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7CisgICAgICAgICAgICBpZiAoIWZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgbG9nKCJFcnJvciBwcm9jZXNzaW5nIGZpbGU6ICAiICsgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHJlcnIpIHsKKyAgICAgICAgICAgIGlmICghZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBsb2coIkVycm9yIHByb2Nlc3NpbmcgZmlsZTogICIgKyByZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHJlcnIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIFRhc2suCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IG51bGw7CisgICAgICAgICAgICBBcnJheUxpc3QgZmlsZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgICAgICAvLyBkZWFsIHdpdGggc3BlY2lmaWVkIHNyY0RpcgorICAgICAgICAgICAgaWYgKHNyY0RpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZHMgPSBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0Rpcik7CisKKyAgICAgICAgICAgICAgICBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5hZGQobmV3IEZpbGUoc3JjRGlyLCBmaWxlc1tpXSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgZmlsZXNldHMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXNldHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgICAgICBGaWxlIGZyb21EaXIgPSBmcy5nZXREaXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5hZGQobmV3IEZpbGUoZnJvbURpciwgZmlsZXNbal0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW92ZXJ3cml0ZSkgeworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgZmlsZXMgdGhhdCBzaG91bGRuJ3QgYmUgb3ZlcndyaXR0ZW4uCisgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGZpbGVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZmlsZXNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSAoRmlsZSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsIGYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzVG9SZW1vdmUuYWRkKGYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5yZW1vdmVBbGwoZmlsZXNUb1JlbW92ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpdGVyYXRvciB0aHJvdWdoIGFsbCB0aGUgZmlsZXMgYW5kIHByb2Nlc3MgdGhlbS4KKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGZpbGVzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSkgaS5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShmaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2FyYmFnZV9jb2xsZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVycikgeworICAgICAgICAgICAgZXJyLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVyci5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHdlIGhhdmUgYSBjb25zaXN0ZW50IGFuZCBsZWdhbCBzZXQgb2YgYXR0cmlidXRlcywgYW5kIHNldAorICAgICAqIGFueSBpbnRlcm5hbCBmbGFncyBuZWNlc3NhcnkgYmFzZWQgb24gZGlmZmVyZW50IGNvbWJpbmF0aW9ucworICAgICAqIG9mIGF0dHJpYnV0ZXMuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoc3JjRGlyID09IG51bGwgJiYgZmlsZXNldHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3BlY2lmeSBhdCBsZWFzdCBvbmUgc291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi0tYSBzcmNEaXIgb3IgYSBmaWxlc2V0LiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzcmNEaXIgPT0gbnVsbCAmJiBkZXN0RGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3BlY2lmeSB0aGUgZGVzdERpciwgb3IgdGhlIHNyY0Rpci4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9BYnN0cmFjdEhvdERlcGxveW1lbnRUb29sLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0Fic3RyYWN0SG90RGVwbG95bWVudFRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJkZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9BYnN0cmFjdEhvdERlcGxveW1lbnRUb29sLmphdmEKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworLyoqCisgKiAgQWJzdHJhY3QgY2xhc3MgdG8gc3VwcG9ydCB2ZW5kb3Itc3BlY2lmaWMgaG90IGRlcGxveW1lbnQgdG9vbHMuCisgKiAgVGhpcyBjbGFzcyB3aWxsIHZhbGlkYXRlIGJvaWxlcnBsYXRlIGF0dHJpYnV0ZXMuCisgKgorICogIFN1YmNsYXNzaW5nIHRoaXMgY2xhc3MgZm9yIGEgdmVuZG9yIHNwZWNpZmljIHRvb2wgaW52b2x2ZXMgdGhlCisgKiAgZm9sbG93aW5nLgorICogIDxvbD48bGk+SW1wbGVtZW50IHRoZSA8Y29kZT5pc0FjdGlvblZhbGlkKCk8Y29kZT4gbWV0aG9kIHRvIGluc3VyZSB0aGUKKyAqICBhY3Rpb24gc3VwcGxpZWQgYXMgdGhlICJhY3Rpb24iIGF0dHJpYnV0ZSBvZiBTZXJ2ZXJEZXBsb3kgaXMgdmFsaWQuCisgKiAgPGxpPkltcGxlbWVudCB0aGUgPGNvZGU+dmFsaWRhdGVBdHRyaWJ1dGVzKCk8L2NvZGU+IG1ldGhvZCB0byBpbnN1cmUKKyAqICBhbGwgcmVxdWlyZWQgYXR0cmlidXRlcyBhcmUgc3VwcGxpZWQsIGFuZCBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0LgorICogIDxsaT5BZGQgYSA8Y29kZT5hZGQmbHQ7VE9PTCZndDs8L2NvZGU+IG1ldGhvZCB0byB0aGUgU2VydmVyRGVwbG95CisgKiAgY2xhc3MuICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIEFudCBlbmNvdW50ZXJzIGEKKyAqICA8Y29kZT5hZGQmbHQ7VE9PTCZndDs8L2NvZGU+IHRhc2sgbmVzdGVkIGluIHRoZQorICogIDxjb2RlPnNlcnZlcmRlcGxveTwvY29kZT4gdGFzay4KKyAqICA8bGk+RGVmaW5lIHRoZSA8Y29kZT5kZXBsb3k8L2NvZGU+IG1ldGhvZC4gIFRoaXMgbWV0aG9kIHNob3VsZCBwZXJmb3JtCisgKiAgd2hhdGV2ZXIgdGFzayBpdCB0YWtlcyB0byBob3QtZGVwbG95IHRoZSBjb21wb25lbnQuICBJRTogc3Bhd24gYSBKVk0gYW5kCisgKiAgcnVuIGNsYXNzLCBleGVjIGEgbmF0aXZlIGV4ZWN1dGFibGUsIHJ1biBKYXZhIGNvZGUuLi4KKyAqCisgKiAgQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLkhvdERlcGxveW1lbnRUb29sCisgKiAgQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLlNlcnZlckRlcGxveQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIb3REZXBsb3ltZW50VG9vbCBpbXBsZW1lbnRzIEhvdERlcGxveW1lbnRUb29sIHsKKyAgICAvKiogVGhlIHBhcmVudCB0YXNrICoqLworICAgIHByaXZhdGUgU2VydmVyRGVwbG95IHRhc2s7CisKKyAgICAvKiogVGhlIGNsYXNzcGF0aCBwYXNzZWQgdG8gdGhlIEpWTSBvbiBleGVjdXRpb24uICoqLworICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGg7CisKKyAgICAvKiogVGhlIHVzZXJuYW1lIGZvciB0aGUgZGVwbG95bWVudCBzZXJ2ZXIuICoqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJOYW1lOworCisgICAgLyoqIFRoZSBwYXNzd29yZCBmb3IgdGhlIGRlcGxveW1lbnQgc2VydmVyLiAqKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKKworICAgIC8qKiBUaGUgYWRkcmVzcyBvZiB0aGUgZGVwbG95bWVudCBzZXJ2ZXIgKiovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyOworCisgICAgLyoqCisgICAgICogIEFkZCBhIGNsYXNzcGF0aCBhcyBhIG5lc3RlZCBlbGVtZW50LgorICAgICAqICBAcmV0dXJuIEEgUGF0aCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgodGFzay5nZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBEZXRlcm1pbmVzIGlmIHRoZSAiYWN0aW9uIiBhdHRyaWJ1dGUgZGVmaW5lcyBhIHZhbGlkIGFjdGlvbi4KKyAgICAgKiAgPHA+U3ViY2xhc3NlcyBzaG91bGQgZGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gcGFzc2VkIGluIGlzCisgICAgICogIHN1cHBvcnRlZCBieSB0aGUgdmVuZG9yJ3MgZGVwbG95bWVudCB0b29sLgorICAgICAqICA8cD5BY3Rpb25zIG1heSBieSAiZGVwbG95IiwgImRlbGV0ZSIsIGV0Yy4uLiBJdCBhbGwgZGVwZW5kcworICAgICAqICBvbiB0aGUgdG9vbC4KKyAgICAgKiAgQHJldHVybiB0cnVlIGlmIHRoZSAiYWN0aW9uIiBhdHRyaWJ1dGUgaXMgdmFsaWQsIGZhbHNlIGlmIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0FjdGlvblZhbGlkKCk7CisKKyAgICAvKioKKyAgICAgKiAgVmFsaWRhdGVzIHRoZSBwYXNzZWQgaW4gYXR0cmlidXRlcy4KKyAgICAgKiAgU3ViY2xhc3NlcyBzaG91bGQgY2hhaW4gdG8gdGhpcyBzdXBlci1tZXRob2QgdG8gaW5zdXJlCisgICAgICogIHZhbGlkYXRpb24gb2YgYm9pbGVycGxhdGUgYXR0cmlidXRlcy4KKyAgICAgKiAgPHA+T25seSB0aGUgImFjdGlvbiIgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICBiYXNlIGNsYXNzLiAgU3ViY2xhc3NlcyBzaG91bGQgY2hlY2sgYXR0cmlidXRlcyBhY2NvcmRpbmdseS4KKyAgICAgKiAgQGV4Y2VwdGlvbiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBpZiB0aGUgYXR0cmlidXRlcyBhcmUgaW52YWxpZCBvciBpbmNvbXBsZXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQXR0cmlidXRlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0YXNrLmdldEFjdGlvbigpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIFwiYWN0aW9uXCIgYXR0cmlidXRlIG11c3QgYmUgc2V0Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzQWN0aW9uVmFsaWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIGFjdGlvbiBcIiIgKyB0YXNrLmdldEFjdGlvbigpICsgIlwiIHBhc3NlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBjbGFzc3BhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUGVyZm9ybSB0aGUgYWN0dWFsIGRlcGxveW1lbnQuCisgICAgICogIEl0J3MgdXAgdG8gdGhlIHN1YmNsYXNzZXMgdG8gaW1wbGVtZW50IHRoZSBhY3R1YWwgYmVoYXZpb3IuCisgICAgICogIEBleGNlcHRpb24gb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIGludmFsaWQgb3IgaW5jb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZXBsb3koKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiAgU2V0cyB0aGUgcGFyZW50IHRhc2suCisgICAgICogIEBwYXJhbSB0YXNrIGEgU2VydmVyRGVwbG95IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBhcmVudCB0YXNrLgorICAgICAqICBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFzayhTZXJ2ZXJEZXBsb3kgdGFzaykgeworICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgIH0KKworICAgIC8qKgorICAgICAqICBSZXR1cm5zIHRoZSB0YXNrIGZpZWxkLCBhIFNlcnZlckRlcGxveSBvYmplY3QuCisgICAgICogIEByZXR1cm4gQW4gU2VydmVyRGVwbG95IHJlcHJlc2VudGluZyB0aGUgcGFyZW50IHRhc2suCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlcnZlckRlcGxveSBnZXRUYXNrKCkgeworICAgICAgICByZXR1cm4gdGFzazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgZ2V0cyB0aGUgY2xhc3NwYXRoIGZpZWxkLgorICAgICAqICBAcmV0dXJuIEEgUGF0aCByZXByZXNlbnRpbmcgdGhlICJjbGFzc3BhdGgiIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoZSBjbGFzc3BhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBKVk0gcnVubmluZyB0aGUgdG9vbDsKKyAgICAgKiAgb3B0aW9uYWwgZGVwZW5kaW5nIHVwb24gdGhlIHRvb2wuCisgICAgICogIFRoZSBjbGFzc3BhdGggbWF5IGFsc28gYmUgc3VwcGxpZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKiAgQHBhcmFtIGNsYXNzcGF0aCBBIFBhdGggb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgImNsYXNzcGF0aCIgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUmV0dXJucyB0aGUgdXNlck5hbWUgZmllbGQuCisgICAgICogIEByZXR1cm4gQSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSAidXNlck5hbWUiIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gdXNlck5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoZSB1c2VyIHdpdGggcHJpdmlsZWdlcyB0byBkZXBsb3kgYXBwbGljYXRpb25zIHRvIHRoZSBzZXJ2ZXI7IG9wdGlvbmFsLgorICAgICAqICBAcGFyYW0gdXNlck5hbWUgQSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSAidXNlck5hbWUiIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyTmFtZShTdHJpbmcgdXNlck5hbWUpIHsKKyAgICAgICAgdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqICBSZXR1cm5zIHRoZSBwYXNzd29yZCBmaWVsZC4KKyAgICAgKiAgQHJldHVybiBBIFN0cmluZyByZXByZXNlbnRpbmcgdGhlICJwYXNzd29yZCIgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiBwYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgVGhlIHBhc3N3b3JkIG9mIHRoZSB1c2VyOyBvcHRpb25hbC4KKyAgICAgKiAgQHBhcmFtIHBhc3N3b3JkIEEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgInBhc3N3b3JkIiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUmV0dXJucyB0aGUgc2VydmVyIGZpZWxkLgorICAgICAqICBAcmV0dXJuIEEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgInNlcnZlciIgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyKCkgeworICAgICAgICByZXR1cm4gc2VydmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqICBUaGUgYWRkcmVzcyBvciBVUkwgZm9yIHRoZSBzZXJ2ZXIgd2hlcmUgdGhlIGNvbXBvbmVudCB3aWxsIGJlIGRlcGxveWVkLgorICAgICAqICBAcGFyYW0gc2VydmVyIEEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgInNlcnZlciIgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlcihTdHJpbmcgc2VydmVyKSB7CisgICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2oyZWUvR2VuZXJpY0hvdERlcGxveW1lbnRUb29sLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0dlbmVyaWNIb3REZXBsb3ltZW50VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMjVlNjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0dlbmVyaWNIb3REZXBsb3ltZW50VG9vbC5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogIEEgZ2VuZXJpYyB0b29sIGZvciBKMkVFIHNlcnZlciBob3QgZGVwbG95bWVudC4KKyAqICA8cD5UaGUgc2ltcGxlIGltcGxlbWVudGF0aW9uIHNwYXducyBhIEpWTSB3aXRoIHRoZSBzdXBwbGllZAorICogIGNsYXNzIG5hbWUsIGp2bSBhcmdzLCBhbmQgYXJndW1lbnRzLgorICoKKyAqICBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWUuSG90RGVwbG95bWVudFRvb2wKKyAqICBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWUuQWJzdHJhY3RIb3REZXBsb3ltZW50VG9vbAorICogIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZS5TZXJ2ZXJEZXBsb3kKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNIb3REZXBsb3ltZW50VG9vbCBleHRlbmRzIEFic3RyYWN0SG90RGVwbG95bWVudFRvb2wgeworICAgIC8qKiBBIEphdmEgdGFzayB1c2VkIHRvIHJ1biB0aGUgZGVwbG95bWVudCB0b29sICoqLworICAgIHByaXZhdGUgSmF2YSBqYXZhOworCisgICAgLyoqIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgZGVwbG95bWVudCB0b29sICoqLworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKworICAgIC8qKiBMaXN0IG9mIHZhbGlkIGFjdGlvbnMgKiovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfQUNUSU9OUyA9IHtBQ1RJT05fREVQTE9ZfTsKKworICAgIC8qKgorICAgICAqICBBZGQgYSBuZXN0ZWQgYXJndW1lbnQgZWxlbWVudCB0byBoYW5kIHRvIHRoZSBkZXBsb3ltZW50IHRvb2w7IG9wdGlvbmFsLgorICAgICAqICBAcmV0dXJuIEEgQ29tbWFuZGxpbmUuQXJndW1lbnQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUKKyAgICAgKiAgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGJlaW5nIHBhc3NlZCB3aGVuIHRoZSBkZXBsb3ltZW50CisgICAgICogIHRvb2wgaXMgcnVuLiAgSUU6ICItdXNlcj1tYXJrIiwgIi1wYXNzd29yZD12ZW50dXJlIi4uLgorICAgICAqLworICAgIHB1YmxpYyBDb21tYW5kbGluZS5Bcmd1bWVudCBjcmVhdGVBcmcoKSB7CisgICAgICAgIHJldHVybiBqYXZhLmNyZWF0ZUFyZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBBZGQgYSBuZXN0ZWQgYXJnbWVudCBlbGVtZW50IHRvIGhhbmQgdG8gdGhlIEpWTSBydW5uaW5nIHRoZQorICAgICAqICBkZXBsb3ltZW50IHRvb2wuCisgICAgICogIENyZWF0ZXMgYSBuZXN0ZWQgYXJnIGVsZW1lbnQuCisgICAgICogIEByZXR1cm4gQSBDb21tYW5kbGluZS5Bcmd1bWVudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQorICAgICAqICBKVk0gY29tbWFuZCBsaW5lIGFyZ3VtZW50IGJlaW5nIHBhc3NlZCB3aGVuIHRoZSBkZXBsb3ltZW50CisgICAgICogIHRvb2wgaXMgcnVuLiAgSUU6ICItbXM2NG0iLCAiLW14MTI4bSIuLi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tbWFuZGxpbmUuQXJndW1lbnQgY3JlYXRlSnZtYXJnKCkgeworICAgICAgICByZXR1cm4gamF2YS5jcmVhdGVKdm1hcmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgRGV0ZXJtaW5lcyBpZiB0aGUgImFjdGlvbiIgYXR0cmlidXRlIGRlZmluZXMgYSB2YWxpZCBhY3Rpb24uCisgICAgICogIDxwPlN1YmNsYXNzZXMgc2hvdWxkIGRldGVybWluZSBpZiB0aGUgYWN0aW9uIHBhc3NlZCBpbiBpcworICAgICAqICBzdXBwb3J0ZWQgYnkgdGhlIHZlbmRvcidzIGRlcGxveW1lbnQgdG9vbC4KKyAgICAgKiAgRm9yIHRoaXMgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiwgdGhlIG9ubHkgdmFsaWQgYWN0aW9uIGlzICJkZXBsb3kiCisgICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGUgImFjdGlvbiIgYXR0cmlidXRlIGlzIHZhbGlkLCBmYWxzZSBpZiBub3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBY3Rpb25WYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRUYXNrKCkuZ2V0QWN0aW9uKCkuZXF1YWxzKFZBTElEX0FDVElPTlNbMF0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgU2V0cyB0aGUgcGFyZW50IHRhc2suCisgICAgICogIEBwYXJhbSB0YXNrIEFuIFNlcnZlckRlcGxveSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwYXJlbnQgdGFzay4KKyAgICAgKiAgQGFudC5hdHRyaWJ1dGUgaWdub3JlZD0idHJ1ZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXNrKFNlcnZlckRlcGxveSB0YXNrKSB7CisgICAgICAgIHN1cGVyLnNldFRhc2sodGFzayk7CisgICAgICAgIGphdmEgPSBuZXcgSmF2YSh0YXNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUGVyZm9ybSB0aGUgYWN0dWFsIGRlcGxveW1lbnQuCisgICAgICogIEZvciB0aGlzIGdlbmVyaWMgaW1wbGVtZW50YXRpb24sIGEgSlZNIGlzIHNwYXduZWQgdXNpbmcgdGhlCisgICAgICogIHN1cHBsaWVkIGNsYXNzcGF0aCwgY2xhc3NuYW1lLCBKVk0gYXJncywgYW5kIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgICogIEBleGNlcHRpb24gb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIGludmFsaWQgb3IgaW5jb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXBsb3koKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBqYXZhLnNldENsYXNzbmFtZShjbGFzc05hbWUpOworICAgICAgICBqYXZhLnNldENsYXNzcGF0aChnZXRDbGFzc3BhdGgoKSk7CisgICAgICAgIGphdmEuc2V0Rm9yayh0cnVlKTsKKyAgICAgICAgamF2YS5zZXRGYWlsb25lcnJvcih0cnVlKTsKKyAgICAgICAgamF2YS5leGVjdXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFZhbGlkYXRlcyB0aGUgcGFzc2VkIGluIGF0dHJpYnV0ZXMuCisgICAgICogIEVuc3VyZXMgdGhlIGNsYXNzTmFtZSBhbmQgYXJndW1lbnRzIGF0dHJpYnV0ZSBoYXZlIGJlZW4gc2V0LgorICAgICAqICBAZXhjZXB0aW9uIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBpbnZhbGlkIG9yIGluY29tcGxldGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudmFsaWRhdGVBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBjbGFzc25hbWUgYXR0cmlidXRlIG11c3QgYmUgc2V0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGV4ZWN1dGUgdG8gcGVyZm9tCisgICAgICogIGRlcGxveW1lbnQ7IHJlcXVpcmVkLgorICAgICAqICBFeGFtcGxlOiAiY29tLmZvb2Jhci50b29scy5kZXBsb3kuRGVwbG95VG9vbCIKKyAgICAgKiAgQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogIHRvIHBlcmZvcm0gZGVwbG95bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGphdmEgYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gdGhlIGphdmEgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBKYXZhIGdldEphdmEoKSB7CisgICAgICAgIHJldHVybiBqYXZhOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2xhc3NuYW1lIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc25hbWUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9Ib3REZXBsb3ltZW50VG9vbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9Ib3REZXBsb3ltZW50VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzU1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0hvdERlcGxveW1lbnRUb29sLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogIEFuIGludGVyZmFjZSBmb3IgdmVuZG9yLXNwZWNpZmljICJob3QiIGRlcGxveW1lbnQgdG9vbHMuCisgKgorICogIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZS5BYnN0cmFjdEhvdERlcGxveW1lbnRUb29sCisgKiAgQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLlNlcnZlckRlcGxveQorICovCitwdWJsaWMgaW50ZXJmYWNlIEhvdERlcGxveW1lbnRUb29sIHsKKyAgICAvKiogVGhlIGRlbGV0ZSBhY3Rpb24gU3RyaW5nICoqLworICAgIFN0cmluZyBBQ1RJT05fREVMRVRFID0gImRlbGV0ZSI7CisKKyAgICAvKiogVGhlIGRlcGxveSBhY3Rpb24gU3RyaW5nICoqLworICAgIFN0cmluZyBBQ1RJT05fREVQTE9ZID0gImRlcGxveSI7CisKKyAgICAvKiogVGhlIGxpc3QgYWN0aW9uIFN0cmluZyAqKi8KKyAgICBTdHJpbmcgQUNUSU9OX0xJU1QgPSAibGlzdCI7CisKKyAgICAvKiogVGhlIHVuZGVwbG95IGFjdGlvbiBTdHJpbmcgKiovCisgICAgU3RyaW5nIEFDVElPTl9VTkRFUExPWSA9ICJ1bmRlcGxveSI7CisKKyAgICAvKiogVGhlIHVwZGF0ZSBhY3Rpb24gU3RyaW5nICoqLworICAgIFN0cmluZyBBQ1RJT05fVVBEQVRFID0gInVwZGF0ZSI7CisKKyAgICAvKioKKyAgICAgKiAgVmFsaWRhdGVzIHRoZSBwYXNzZWQgaW4gYXR0cmlidXRlcy4KKyAgICAgKiAgQGV4Y2VwdGlvbiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBpZiB0aGUgYXR0cmlidXRlcyBhcmUgaW52YWxpZCBvciBpbmNvbXBsZXRlLgorICAgICAqLworICAgIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogIFBlcmZvcm0gdGhlIGFjdHVhbCBkZXBsb3ltZW50LgorICAgICAqICBAZXhjZXB0aW9uIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBpbnZhbGlkIG9yIGluY29tcGxldGUuCisgICAgICovCisgICAgdm9pZCBkZXBsb3koKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiAgU2V0cyB0aGUgcGFyZW50IHRhc2suCisgICAgICogIEBwYXJhbSB0YXNrIEEgU2VydmVyRGVwbG95IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBhcmVudCB0YXNrLgorICAgICAqLworICAgIHZvaWQgc2V0VGFzayhTZXJ2ZXJEZXBsb3kgdGFzayk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0pvbmFzSG90RGVwbG95bWVudFRvb2wuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2oyZWUvSm9uYXNIb3REZXBsb3ltZW50VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWQ2YTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0pvbmFzSG90RGVwbG95bWVudFRvb2wuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworLyoqCisgKiAgQW4gQW50IHdyYXBwZXIgdGFzayBmb3IgdGhlIHdlYmxvZ2ljLmRlcGxveSB0b29sLiBUaGlzIGlzIHVzZWQKKyAqICB0byBob3QtZGVwbG95IEoyRUUgYXBwbGljYXRpb25zIHRvIGEgcnVubmluZyBXZWJMb2dpYyBzZXJ2ZXIuCisgKiAgVGhpcyBpcyA8Yj5ub3Q8L2I+IHRoZSBzYW1lIGFzIGNyZWF0aW5nIHRoZSBhcHBsaWNhdGlvbgorICogIGFyY2hpdmUuIFRoaXMgdGFzayBhc3N1bWVzIHRoZSBhcmNoaXZlIChFQVIsIEpBUiwgb3IgV0FSKSBmaWxlCisgKiAgaGFzIGJlZW4gYXNzZW1ibGVkIGFuZCBpcyBzdXBwbGllZCBhcyB0aGUgInNvdXJjZSIgYXR0cmlidXRlLgorICogIDxwPgorICoKKyAqICBJbiB0aGUgZW5kLCB0aGlzIHRhc2sgYXNzZW1ibGVzIHRoZSBjb21tYWRsaW5lIHBhcmFtZXRlcnMgYW5kCisgKiAgcnVucyB0aGUgd2VibG9naWMuZGVwbG95IHRvb2wgaW4gYSBzZXBlcmF0ZSBKVk0uCisgKgorICpAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWUuSG90RGVwbG95bWVudFRvb2wKKyAqQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLkFic3RyYWN0SG90RGVwbG95bWVudFRvb2wKKyAqQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLlNlcnZlckRlcGxveQorICovCitwdWJsaWMgY2xhc3MgSm9uYXNIb3REZXBsb3ltZW50VG9vbCBleHRlbmRzIEdlbmVyaWNIb3REZXBsb3ltZW50VG9vbCBpbXBsZW1lbnRzIEhvdERlcGxveW1lbnRUb29sIHsKKworICAgIC8qKgorICAgICAqICBEZXNjcmlwdGlvbiBvZiB0aGUgRmllbGQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09SQiA9ICJSTUkiOworCisgICAgLyoqCisgICAgICogIFRoZSBjbGFzc25hbWUgb2YgdGhlIHRvb2wgdG8gcnVuICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9OQVNfREVQTE9ZX0NMQVNTX05BTUUgPSAib3JnLm9iamVjdHdlYi5qb25hcy5hZG0uSm9uYXNBZG1pbiI7CisKKyAgICAvKioKKyAgICAgKiAgQWxsIHRoZSB2YWxpZCBhY3Rpb25zIHRoYXQgd2VibG9naWMuZGVwbG95IHBlcm1pdHMgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTElEX0FDVElPTlMKKyAgICAgICAgPSB7QUNUSU9OX0RFTEVURSwgQUNUSU9OX0RFUExPWSwgQUNUSU9OX0xJU1QsIEFDVElPTl9VTkRFUExPWSwgQUNUSU9OX1VQREFURX07CisKKyAgICAvKioKKyAgICAgKiAgRGVzY3JpcHRpb24gb2YgdGhlIEZpZWxkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGpvbmFzcm9vdDsKKworICAgIC8qKgorICAgICAqICBEZXNjcmlwdGlvbiBvZiB0aGUgRmllbGQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvcmIgPSBudWxsOworCisgICAgLyoqCisgICAgICogIERlc2NyaXB0aW9uIG9mIHRoZSBGaWVsZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRhdmlkSG9zdDsKKworICAgIC8qKgorICAgICAqICBEZXNjcmlwdGlvbiBvZiB0aGUgRmllbGQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBkYXZpZFBvcnQ7CisKKworICAgIC8qKgorICAgICAqICBTZXQgdGhlIGhvc3QgZm9yIHRoZSBEYXZpZCBPUkI7IHJlcXVpcmVkIGlmCisgICAgICogIE9SQj09ZGF2aWQuCisgICAgICoKKyAgICAgKkBwYXJhbSAgaW5WYWx1ZSAgVGhlIG5ldyBkYXZpZGhvc3QgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXZpZGhvc3QoZmluYWwgU3RyaW5nIGluVmFsdWUpIHsKKyAgICAgICAgZGF2aWRIb3N0ID0gaW5WYWx1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBTZXQgdGhlIHBvcnQgZm9yIHRoZSBEYXZpZCBPUkI7IHJlcXVpcmVkIGlmCisgICAgICogIE9SQj09ZGF2aWQuCisgICAgICoKKyAgICAgKkBwYXJhbSAgaW5WYWx1ZSAgVGhlIG5ldyBkYXZpZHBvcnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXZpZHBvcnQoZmluYWwgaW50IGluVmFsdWUpIHsKKyAgICAgICAgZGF2aWRQb3J0ID0gaW5WYWx1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBzZXQgdGhlIGpvbmFzIHJvb3QgZGlyZWN0b3J5ICgtRGluc3RhbGwucm9vdD0pLiBUaGlzCisgICAgICogIGVsZW1lbnQgaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKkBwYXJhbSAgaW5WYWx1ZSAgVGhlIG5ldyBqb25hc3Jvb3QgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKb25hc3Jvb3QoZmluYWwgRmlsZSBpblZhbHVlKSB7CisgICAgICAgIGpvbmFzcm9vdCA9IGluVmFsdWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIENob29zZSB5b3VyIE9SQiA6IFJNSSwgSkVSRU1JRSwgREFWSUQsIC4uLjsgb3B0aW9uYWwuCisgICAgICogSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMKKyAgICAgKiB0byB0aGUgb25lIHByZXNlbnQgaW4gY2xhc3NwYXRoLiBUaGUgY29ycmVzcG9uZGluZyBKT25BUyBKQVIgaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBjbGFzc3BhdGguIElmIHlvdXIgb3JiIGlzIERBVklEIChSTUkvSUlPUCkgeW91IG11c3QKKyAgICAgKiBzcGVjaWZ5IGRhdmlkaG9zdCBhbmQgZGF2aWRwb3J0IHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKkBwYXJhbSAgaW5WYWx1ZSAgUk1JLCBKRVJFTUlFLCBEQVZJRCwuLi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcmIoZmluYWwgU3RyaW5nIGluVmFsdWUpIHsKKyAgICAgICAgb3JiID0gaW5WYWx1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBnZXRzIHRoZSBjbGFzc3BhdGggZmllbGQuCisgICAgICoKKyAgICAgKkByZXR1cm4gICAgQSBQYXRoIHJlcHJlc2VudGluZyB0aGUgImNsYXNzcGF0aCIgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKKworICAgICAgICBQYXRoIGFDbGFzc1BhdGggPSBzdXBlci5nZXRDbGFzc3BhdGgoKTsKKworICAgICAgICBpZiAoYUNsYXNzUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBhQ2xhc3NQYXRoID0gbmV3IFBhdGgoZ2V0VGFzaygpLmdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9yYiAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgYU9yYkphciA9IG5ldyBGaWxlKGpvbmFzcm9vdCwgImxpYi8iICsgb3JiICsgIl9qb25hcy5qYXIiKS50b1N0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGFDb25maWdEaXIgPSBuZXcgRmlsZShqb25hc3Jvb3QsICJjb25maWcvIikudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFBhdGggYUpPbkFTT3JiUGF0aCA9IG5ldyBQYXRoKGFDbGFzc1BhdGguZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgICAgICAgICBhT3JiSmFyICsgRmlsZS5wYXRoU2VwYXJhdG9yICsgYUNvbmZpZ0Rpcik7CisgICAgICAgICAgICBhQ2xhc3NQYXRoLmFwcGVuZChhSk9uQVNPcmJQYXRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYUNsYXNzUGF0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBWYWxpZGF0ZXMgdGhlIHBhc3NlZCBpbiBhdHRyaWJ1dGVzLiA8cD4KKyAgICAgKgorICAgICAqICBUaGUgcnVsZXMgYXJlOgorICAgICAqICA8b2w+CisgICAgICogICAgPGxpPiBJZiBhY3Rpb24gaXMgImRlcGxveSIgb3IgInVwZGF0ZSIgdGhlICJhcHBsaWNhdGlvbiIKKyAgICAgKiAgICBhbmQgInNvdXJjZSIgYXR0cmlidXRlcyBtdXN0IGJlIHN1cHBsaWVkLgorICAgICAqICAgIDxsaT4gSWYgYWN0aW9uIGlzICJkZWxldGUiIG9yICJ1bmRlcGxveSIgdGhlCisgICAgICogICAgImFwcGxpY2F0aW9uIiBhdHRyaWJ1dGUgbXVzdCBiZSBzdXBwbGllZC4KKyAgICAgKgorICAgICAqQGV4Y2VwdGlvbiAgQnVpbGRFeGNlcHRpb24gICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCisgICAgICogICAgICBvZiBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyBzdXBlci52YWxpZGF0ZUF0dHJpYnV0ZXMoKTsgLy8gZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kCisKKyAgICAgICAgSmF2YSBqYXZhID0gZ2V0SmF2YSgpOworCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBnZXRUYXNrKCkuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgXCJhY3Rpb25cIiBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNBY3Rpb25WYWxpZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgYWN0aW9uIFwiIiArIGFjdGlvbiArICJcIiBwYXNzZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRDbGFzc05hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRDbGFzc05hbWUoSk9OQVNfREVQTE9ZX0NMQVNTX05BTUUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGpvbmFzcm9vdCA9PSBudWxsIHx8IGpvbmFzcm9vdC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBqYXZhLmNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKCItRGluc3RhbGwucm9vdD0iICsgam9uYXNyb290KTsKKyAgICAgICAgICAgIGphdmEuY3JlYXRlSnZtYXJnKCkuc2V0VmFsdWUoIi1EamF2YS5zZWN1cml0eS5wb2xpY3k9IiArIGpvbmFzcm9vdAorICAgICAgICAgICAgICAgICsgIi9jb25maWcvamF2YS5wb2xpY3kiKTsKKworICAgICAgICAgICAgaWYgKCJEQVZJRCIuZXF1YWxzKG9yYikpIHsKKyAgICAgICAgICAgICAgICBqYXZhLmNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKCItRG9yZy5vbWcuQ09SQkEuT1JCQ2xhc3MiCisgICAgICAgICAgICAgICAgICAgICsgIj1vcmcub2JqZWN0d2ViLmRhdmlkLmxpYnMuYmluZGluZy5vcmJzLmlpb3AuSUlPUE9SQiIpOworICAgICAgICAgICAgICAgIGphdmEuY3JlYXRlSnZtYXJnKCkuc2V0VmFsdWUoIi1Eb3JnLm9tZy5DT1JCQS5PUkJTaW5nbGV0b25DbGFzcz0iCisgICAgICAgICAgICAgICAgICAgICsgIm9yZy5vYmplY3R3ZWIuZGF2aWQubGlicy5iaW5kaW5nLm9yYnMuT1JCU2luZ2xldG9uQ2xhc3MiKTsKKyAgICAgICAgICAgICAgICBqYXZhLmNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKCItRGphdmF4LnJtaS5DT1JCQS5TdHViQ2xhc3M9IgorICAgICAgICAgICAgICAgICAgICArICJvcmcub2JqZWN0d2ViLmRhdmlkLmxpYnMuc3R1Yl9mYWN0b3JpZXMucm1pLlN0dWJEZWxlZ2F0ZSIpOworICAgICAgICAgICAgICAgIGphdmEuY3JlYXRlSnZtYXJnKCkuc2V0VmFsdWUoIi1EamF2YXgucm1pLkNPUkJBLlBvcnRhYmxlUmVtb3RlT2JqZWN0Q2xhc3M9IgorICAgICAgICAgICAgICAgICAgICArICJvcmcub2JqZWN0d2ViLmRhdmlkLmxpYnMuYmluZGluZy5ybWkuT1JCUG9ydGFibGVSZW1vdGVPYmplY3REZWxlZ2F0ZSIpOworICAgICAgICAgICAgICAgIGphdmEuY3JlYXRlSnZtYXJnKCkuc2V0VmFsdWUoIi1EamF2YXgucm1pLkNPUkJBLlV0aWxDbGFzcz0iCisgICAgICAgICAgICAgICAgICAgICsgIm9yZy5vYmplY3R3ZWIuZGF2aWQubGlicy5oZWxwZXJzLlJNSVV0aWxEZWxlZ2F0ZSIpOworICAgICAgICAgICAgICAgIGphdmEuY3JlYXRlSnZtYXJnKCkuc2V0VmFsdWUoIi1EZGF2aWQuQ29zTmFtaW5nLmRlZmF1bHRfbWV0aG9kPTAiKTsKKyAgICAgICAgICAgICAgICBqYXZhLmNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKCItRGRhdmlkLnJtaS5WYWx1ZUhhbmRsZXJDbGFzcz0iCisgICAgICAgICAgICAgICAgICAgICsgImNvbS5zdW4uY29yYmEuc2UuaW50ZXJuYWwuaW8uVmFsdWVIYW5kbGVySW1wbCIpOworICAgICAgICAgICAgICAgIGlmIChkYXZpZEhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBqYXZhLmNyZWF0ZUp2bWFyZygpLnNldFZhbHVlKCItRGRhdmlkLkNvc05hbWluZy5kZWZhdWx0X2hvc3Q9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXZpZEhvc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGF2aWRQb3J0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgamF2YS5jcmVhdGVKdm1hcmcoKS5zZXRWYWx1ZSgiLURkYXZpZC5Db3NOYW1pbmcuZGVmYXVsdF9wb3J0PSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGF2aWRQb3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0U2VydmVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgamF2YS5jcmVhdGVBcmcoKS5zZXRMaW5lKCItbiAiICsgZ2V0U2VydmVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0RFUExPWSkKKyAgICAgICAgICAgIHx8IGFjdGlvbi5lcXVhbHMoQUNUSU9OX1VQREFURSkKKyAgICAgICAgICAgIHx8IGFjdGlvbi5lcXVhbHMoInJlZGVwbG95IikpIHsKKyAgICAgICAgICAgIGphdmEuY3JlYXRlQXJnKCkuc2V0TGluZSgiLWEgIiArIGdldFRhc2soKS5nZXRTb3VyY2UoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fREVMRVRFKSB8fCBhY3Rpb24uZXF1YWxzKEFDVElPTl9VTkRFUExPWSkpIHsKKyAgICAgICAgICAgIGphdmEuY3JlYXRlQXJnKCkuc2V0TGluZSgiLXIgIiArIGdldFRhc2soKS5nZXRTb3VyY2UoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fTElTVCkpIHsKKyAgICAgICAgICAgIGphdmEuY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1sIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBEZXRlcm1pbmVzIGlmIHRoZSBhY3Rpb24gc3VwcGxpZWQgaXMgdmFsaWQuIDxwPgorICAgICAqCisgICAgICogIFZhbGlkIGFjdGlvbnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc3RhdGljIGFycmF5CisgICAgICogIFZBTElEX0FDVElPTlMKKyAgICAgKgorICAgICAqQHJldHVybiAgICB0cnVlIGlmIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIHZhbGlkLCBmYWxzZSBpZgorICAgICAqICAgICAgbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQWN0aW9uVmFsaWQoKSB7CisgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKKworICAgICAgICBTdHJpbmcgYWN0aW9uID0gZ2V0VGFzaygpLmdldEFjdGlvbigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMSURfQUNUSU9OUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoVkFMSURfQUNUSU9OU1tpXSkpIHsKKyAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsaWQ7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL1NlcnZlckRlcGxveS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9TZXJ2ZXJEZXBsb3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmJiMDkzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9TZXJ2ZXJEZXBsb3kuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworLyoqCisgKiAgQ29udHJvbHMgaG90IGRlcGxveW1lbnQgdG9vbHMgZm9yIEoyRUUgc2VydmVycy4KKyAqCisgKiAgVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgZnJhbWV3b3JrIGZvciB0aGUgY3JlYXRpb24gb2YgdmVuZG9yIHNwZWNpZmljCisgKiAgaG90IGRlcGxveW1lbnQgdG9vbHMuCisgKgorICogIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZS5Ib3REZXBsb3ltZW50VG9vbAorICogIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZS5BYnN0cmFjdEhvdERlcGxveW1lbnRUb29sCisgKiAgQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLkdlbmVyaWNIb3REZXBsb3ltZW50VG9vbAorICogIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZS5XZWJMb2dpY0hvdERlcGxveW1lbnRUb29sCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJEZXBsb3kgZXh0ZW5kcyBUYXNrIHsKKyAgICAvKiogVGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQuICBJRTogImRlcGxveSIsICJkZWxldGUiLCBldGMuLi4gKiovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uOworCisgICAgLyoqIFRoZSBzb3VyY2UgKGZ1bGx5LXF1YWxpZmllZCBwYXRoKSB0byB0aGUgY29tcG9uZW50IGJlaW5nIGRlcGxveWVkICoqLworICAgIHByaXZhdGUgRmlsZSBzb3VyY2U7CisKKyAgICAvKiogVGhlIHZlbmRvciBzcGVjaWZpYyB0b29sIGZvciBkZXBsb3lpbmcgdGhlIGNvbXBvbmVudCAqKi8KKyAgICBwcml2YXRlIFZlY3RvciB2ZW5kb3JUb29scyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vCisgICAgLy8gUGxhY2UgdmVuZG9yIHNwZWNpZmljIHRvb2wgY3JlYXRpb25zIGhlcmUuCisgICAgLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqICBDcmVhdGVzIGEgZ2VuZXJpYyBkZXBsb3ltZW50IHRvb2wuCisgICAgICogIDxwPkFudCBjYWxscyB0aGlzIG1ldGhvZCBvbiBjcmVhdGlvbiB0byBoYW5kbGUgZW1iZWRkZWQgImdlbmVyaWMiIGVsZW1lbnRzCisgICAgICogIGluIHRoZSBTZXJ2ZXJEZXBsb3kgdGFzay4KKyAgICAgKiAgQHBhcmFtIHRvb2wgQW4gaW5zdGFuY2Ugb2YgR2VuZXJpY0hvdERlcGxveW1lbnQgdG9vbCwgcGFzc2VkIGluIGJ5IEFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRHZW5lcmljKEdlbmVyaWNIb3REZXBsb3ltZW50VG9vbCB0b29sKSB7CisgICAgICAgIHRvb2wuc2V0VGFzayh0aGlzKTsKKyAgICAgICAgdmVuZG9yVG9vbHMuYWRkRWxlbWVudCh0b29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQ3JlYXRlcyBhIFdlYkxvZ2ljIGRlcGxveW1lbnQgdG9vbCwgZm9yIGRlcGxveW1lbnQgdG8gV2ViTG9naWMgc2VydmVycy4KKyAgICAgKiAgPHA+QW50IGNhbGxzIHRoaXMgbWV0aG9kIG9uIGNyZWF0aW9uIHRvIGhhbmRsZSBlbWJlZGRlZCAid2VibG9naWMiIGVsZW1lbnRzCisgICAgICogIGluIHRoZSBTZXJ2ZXJEZXBsb3kgdGFzay4KKyAgICAgKiAgQHBhcmFtIHRvb2wgQW4gaW5zdGFuY2Ugb2YgV2ViTG9naWNIb3REZXBsb3ltZW50IHRvb2wsIHBhc3NlZCBpbiBieSBBbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV2VibG9naWMoV2ViTG9naWNIb3REZXBsb3ltZW50VG9vbCB0b29sKSB7CisgICAgICAgIHRvb2wuc2V0VGFzayh0aGlzKTsKKyAgICAgICAgdmVuZG9yVG9vbHMuYWRkRWxlbWVudCh0b29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQ3JlYXRlcyBhIEpPbkFTIGRlcGxveW1lbnQgdG9vbCwgZm9yIGRlcGxveW1lbnQgdG8gSk9uQVMgc2VydmVycy4KKyAgICAgKiAgPHA+QW50IGNhbGxzIHRoaXMgbWV0aG9kIG9uIGNyZWF0aW9uIHRvIGhhbmRsZSBlbWJlZGRlZCAiam9uYXMiIGVsZW1lbnRzCisgICAgICogIGluIHRoZSBTZXJ2ZXJEZXBsb3kgdGFzay4KKyAgICAgKiAgQHBhcmFtIHRvb2wgQW4gaW5zdGFuY2Ugb2YgSm9uYXNIb3REZXBsb3ltZW50IHRvb2wsIHBhc3NlZCBpbiBieSBBbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSm9uYXMoSm9uYXNIb3REZXBsb3ltZW50VG9vbCB0b29sKSB7CisgICAgICAgIHRvb2wuc2V0VGFzayh0aGlzKTsKKyAgICAgICAgdmVuZG9yVG9vbHMuYWRkRWxlbWVudCh0b29sKTsKKyAgICB9CisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vCisgICAgLy8gRXhlY3V0ZSBtZXRob2QKKyAgICAvLworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLyoqCisgICAgICogIEV4ZWN1dGUgdGhlIHRhc2suCisgICAgICogIDxwPlRoaXMgbWV0aG9kIGNhbGxzIHRoZSBkZXBsb3koKSBtZXRob2Qgb24gZWFjaCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHRvb2xzCisgICAgICogIGluIHRoZSA8Y29kZT52ZW5kb3JUb29sczwvY29kZT4gY29sbGVjdGlvbi4gIFRoaXMgcGVyZm9ybXMgdGhlIGFjdHVhbAorICAgICAqICBwcm9jZXNzIG9mIGRlcGxveW1lbnQgb24gZWFjaCB0b29sLgorICAgICAqICBAZXhjZXB0aW9uIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzCisgICAgICogIGFyZSBpbnZhbGlkIG9yIGluY29tcGxldGUsIG9yIGEgZmFpbHVyZSBvY2N1cnMgaW4gdGhlIGRlcGxveW1lbnQgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gdmVuZG9yVG9vbHMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgICBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgSG90RGVwbG95bWVudFRvb2wgdG9vbCA9IChIb3REZXBsb3ltZW50VG9vbCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgdG9vbC52YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIHRvb2wuZGVwbG95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLworICAgIC8vIFNldC9nZXQgbWV0aG9kcworICAgIC8vCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKioKKyAgICAgKiAgUmV0dXJucyB0aGUgYWN0aW9uIGZpZWxkLgorICAgICAqICBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgImFjdGlvbiIgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gYWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqICBUaGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCwgdXN1YWxseSAiZGVwbG95IjsgcmVxdWlyZWQuCisgICAgICogICBTb21lIHRvb2xzIHN1cHBvcnQgYWRkaXRpb25hbCBhY3Rpb25zLCBzdWNoIGFzICJkZWxldGUiLCAibGlzdCIsICJ1bmRlcGxveSIsICJ1cGRhdGUiLi4uCisgICAgICogIEBwYXJhbSBhY3Rpb24gQSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSAiYWN0aW9uIiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogIFJldHVybnMgdGhlIHNvdXJjZSBmaWVsZCAodGhlIHBhdGgvZmlsZW5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZQorICAgICAqICBkZXBsb3llZC4KKyAgICAgKiAgQHJldHVybiBBIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgInNvdXJjZSIgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgVGhlIGZpbGVuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgZGVwbG95ZWQ7IG9wdGlvbmFsCisgICAgICogIGRlcGVuZGluZyB1cG9uIHRoZSB0b29sIGFuZCB0aGUgYWN0aW9uLgorICAgICAqICBAcGFyYW0gc291cmNlIFN0cmluZyByZXByZXNlbnRpbmcgdGhlICJzb3VyY2UiIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoRmlsZSBzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL1dlYkxvZ2ljSG90RGVwbG95bWVudFRvb2wuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2oyZWUvV2ViTG9naWNIb3REZXBsb3ltZW50VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYmJhZDIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL1dlYkxvZ2ljSG90RGVwbG95bWVudFRvb2wuamF2YQpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhOworCisvKioKKyAqICBBbiBBbnQgd3JhcHBlciB0YXNrIGZvciB0aGUgd2VibG9naWMuZGVwbG95IHRvb2wuICBUaGlzIGlzIHVzZWQgdG8KKyAqICBob3QtZGVwbG95IEoyRUUgYXBwbGljYXRpb25zIHRvIGEgcnVubmluZyBXZWJMb2dpYyBzZXJ2ZXIuCisgKiAgVGhpcyBpcyA8Yj5ub3Q8L2I+IHRoZSBzYW1lIGFzIGNyZWF0aW5nIHRoZSBhcHBsaWNhdGlvbiBhcmNoaXZlLgorICogIFRoaXMgdGFzayBhc3N1bWVzIHRoZSBhcmNoaXZlIChFQVIsIEpBUiwgb3IgV0FSKSBmaWxlIGhhcyBiZWVuCisgKiAgYXNzZW1ibGVkIGFuZCBpcyBzdXBwbGllZCBhcyB0aGUgInNvdXJjZSIgYXR0cmlidXRlLgorICogIDxwPkluIHRoZSBlbmQsIHRoaXMgdGFzayBhc3NlbWJsZXMgdGhlIGNvbW1hZGxpbmUgcGFyYW1ldGVycworICogIGFuZCBydW5zIHRoZSB3ZWJsb2dpYy5kZXBsb3kgdG9vbCBpbiBhIHNlcGVyYXRlIEpWTS4KKyAqCisgKiAgQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLkhvdERlcGxveW1lbnRUb29sCisgKiAgQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLkFic3RyYWN0SG90RGVwbG95bWVudFRvb2wKKyAqICBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWUuU2VydmVyRGVwbG95CisgKi8KK3B1YmxpYyBjbGFzcyBXZWJMb2dpY0hvdERlcGxveW1lbnRUb29sIGV4dGVuZHMgQWJzdHJhY3RIb3REZXBsb3ltZW50VG9vbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBIb3REZXBsb3ltZW50VG9vbCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUUklOR19CVUZGRVJfU0laRSA9IDEwMjQ7CisgICAgLyoqIFRoZSBjbGFzc25hbWUgb2YgdGhlIHRvb2wgdG8gcnVuICoqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJMT0dJQ19ERVBMT1lfQ0xBU1NfTkFNRSA9ICJ3ZWJsb2dpYy5kZXBsb3kiOworCisgICAgLyoqIEFsbCB0aGUgdmFsaWQgYWN0aW9ucyB0aGF0IHdlYmxvZ2ljLmRlcGxveSBwZXJtaXRzICoqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTElEX0FDVElPTlMKKyAgICAgICAgPSB7QUNUSU9OX0RFTEVURSwgQUNUSU9OX0RFUExPWSwgQUNUSU9OX0xJU1QsIEFDVElPTl9VTkRFUExPWSwgQUNUSU9OX1VQREFURX07CisKKyAgICAvKiogUmVwcmVzZW50cyB0aGUgIi1kZWJ1ZyIgZmxhZyBmcm9tIHdlYmxvZ2ljLmRlcGxveSAqKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWc7CisKKyAgICAvKiogVGhlIGFwcGxpY2F0aW9uIG5hbWUgdGhhdCBpcyBiZWluZyBkZXBsb3llZCAqKi8KKyAgICBwcml2YXRlIFN0cmluZyBhcHBsaWNhdGlvbjsKKworICAgIC8qKiBUaGUgY29tcG9uZW50IG5hbWU6dGFyZ2V0KHMpIGZvciB0aGUgIi1jb21wb25lbnQiIGFyZ3VtZW50IG9mIHdlYmxvZ2ljLmRlcGxveSAqKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21wb25lbnQ7CisKKyAgICAvKioKKyAgICAgKiAgUGVyZm9ybSB0aGUgYWN0dWFsIGRlcGxveW1lbnQuCisgICAgICogIEZvciB0aGlzIGltcGxlbWVudGF0aW9uLCBhIEpWTSBpcyBzcGF3bmVkIGFuZCB0aGUgd2VibG9naWMuZGVwbG95CisgICAgICogIHRvb2xzIGlzIGV4ZWN1dGVkLgorICAgICAqICBAZXhjZXB0aW9uIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBpbnZhbGlkIG9yIGluY29tcGxldGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVwbG95KCkgeworICAgICAgICBKYXZhIGphdmEgPSBuZXcgSmF2YShnZXRUYXNrKCkpOworICAgICAgICBqYXZhLnNldEZvcmsodHJ1ZSk7CisgICAgICAgIGphdmEuc2V0RmFpbG9uZXJyb3IodHJ1ZSk7CisgICAgICAgIGphdmEuc2V0Q2xhc3NwYXRoKGdldENsYXNzcGF0aCgpKTsKKworICAgICAgICBqYXZhLnNldENsYXNzbmFtZShXRUJMT0dJQ19ERVBMT1lfQ0xBU1NfTkFNRSk7CisgICAgICAgIGphdmEuY3JlYXRlQXJnKCkuc2V0TGluZShnZXRBcmd1bWVudHMoKSk7CisgICAgICAgIGphdmEuZXhlY3V0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBWYWxpZGF0ZXMgdGhlIHBhc3NlZCBpbiBhdHRyaWJ1dGVzLgorICAgICAqICA8cD5UaGUgcnVsZXMgYXJlOgorICAgICAqICA8b2w+PGxpPklmIGFjdGlvbiBpcyAiZGVwbG95IiBvciAidXBkYXRlIiB0aGUgImFwcGxpY2F0aW9uIiBhbmQgInNvdXJjZSIKKyAgICAgKiAgYXR0cmlidXRlcyBtdXN0IGJlIHN1cHBsaWVkLgorICAgICAqICA8bGk+SWYgYWN0aW9uIGlzICJkZWxldGUiIG9yICJ1bmRlcGxveSIgdGhlICJhcHBsaWNhdGlvbiIgYXR0cmlidXRlIG11c3QKKyAgICAgKiAgYmUgc3VwcGxpZWQuCisgICAgICogIEBleGNlcHRpb24gb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIGludmFsaWQgb3IgaW5jb21wbGV0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQXR0cmlidXRlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnZhbGlkYXRlQXR0cmlidXRlcygpOworCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBnZXRUYXNrKCkuZ2V0QWN0aW9uKCk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgcGFzc3dvcmQgaGFzIGJlZW4gc2V0CisgICAgICAgIGlmICgoZ2V0UGFzc3dvcmQoKSA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgcGFzc3dvcmQgYXR0cmlidXRlIG11c3QgYmUgc2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIG1pc3NpbmcgYXBwbGljYXRpb24gb24gZGVwbG95ICYgdXBkYXRlCisgICAgICAgIGlmICgoYWN0aW9uLmVxdWFscyhBQ1RJT05fREVQTE9ZKSB8fCBhY3Rpb24uZXF1YWxzKEFDVElPTl9VUERBVEUpKQorICAgICAgICAgICAgJiYgYXBwbGljYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlIG11c3QgYmUgc2V0ICIKKyAgICAgICAgICAgICAgICArICJpZiBhY3Rpb24gPSAiICsgYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGZvciBtaXNzaW5nIHNvdXJjZSBvbiBkZXBsb3kgJiB1cGRhdGUKKyAgICAgICAgaWYgKChhY3Rpb24uZXF1YWxzKEFDVElPTl9ERVBMT1kpIHx8IGFjdGlvbi5lcXVhbHMoQUNUSU9OX1VQREFURSkpCisgICAgICAgICAgICAmJiBnZXRUYXNrKCkuZ2V0U291cmNlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgc291cmNlIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBpZiAiCisgICAgICAgICAgICAgICAgKyAiYWN0aW9uID0gIiArIGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBmb3IgbWlzc2luZyBhcHBsaWNhdGlvbiBvbiBkZWxldGUgJiB1bmRlcGxveQorICAgICAgICBpZiAoKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0RFTEVURSkgfHwgYWN0aW9uLmVxdWFscyhBQ1RJT05fVU5ERVBMT1kpKQorICAgICAgICAgICAgJiYgYXBwbGljYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlIG11c3QgYmUgc2V0IGlmICIKKyAgICAgICAgICAgICAgICArICJhY3Rpb24gPSAiICsgYWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBCdWlsZHMgdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHdlYmxvZ2ljLmRlcGxveSBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogIHN1cHBsaWVkIGFjdGlvbi4KKyAgICAgKiAgQHJldHVybiBBIFN0cmluZyBjb250YWluaW5nIHRoZSBhcmd1bWVudHMgZm9yIHRoZSB3ZWJsb2dpYy5kZXBsb3kgdG9vbC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJndW1lbnRzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGdldFRhc2soKS5nZXRBY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIGFyZ3MgPSBudWxsOworCisgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9ERVBMT1kpIHx8IGFjdGlvbi5lcXVhbHMoQUNUSU9OX1VQREFURSkpIHsKKyAgICAgICAgICAgIGFyZ3MgPSBidWlsZERlcGxveUFyZ3MoKTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9ERUxFVEUpIHx8IGFjdGlvbi5lcXVhbHMoQUNUSU9OX1VOREVQTE9ZKSkgeworICAgICAgICAgICAgYXJncyA9IGJ1aWxkVW5kZXBsb3lBcmdzKCk7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fTElTVCkpIHsKKyAgICAgICAgICAgIGFyZ3MgPSBidWlsZExpc3RBcmdzKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgRGV0ZXJtaW5lcyBpZiB0aGUgYWN0aW9uIHN1cHBsaWVkIGlzIHZhbGlkLgorICAgICAqICA8cD5WYWxpZCBhY3Rpb25zIGFyZSBjb250YWluZWQgaW4gdGhlIHN0YXRpYyBhcnJheSBWQUxJRF9BQ1RJT05TCisgICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSBpcyB2YWxpZCwgZmFsc2UgaWYgbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQWN0aW9uVmFsaWQoKSB7CisgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKKworICAgICAgICBTdHJpbmcgYWN0aW9uID0gZ2V0VGFzaygpLmdldEFjdGlvbigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMSURfQUNUSU9OUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoVkFMSURfQUNUSU9OU1tpXSkpIHsKKyAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFsaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogIEJ1aWxkcyB0aGUgcHJlZml4IGFyZ3VtZW50cyB0byBwYXNzIHRvIHdlYmxvZ2ljLmRlcGxveS4KKyAgICAgKiAgVGhlc2UgYXJndW1lbnRzIGFyZSBnZW5lcmljIGFjcm9zcyBhbGwgYWN0aW9ucy4KKyAgICAgKiAgQHJldHVybiBBIFN0cmluZ0J1ZmZlciBjb250YWluaW5nIHRoZSBwcmVmaXggYXJndW1lbnRzLgorICAgICAqICBUaGUgYWN0aW9uLXNwZWNpZmljIGJ1aWxkIG1ldGhvZHMgd2lsbCBhcHBlbmQgdG8gdGhpcyBTdHJpbmdCdWZmZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBidWlsZEFyZ3NQcmVmaXgoKSB7CisgICAgICAgIFNlcnZlckRlcGxveSB0YXNrID0gZ2V0VGFzaygpOworICAgICAgICAvLyBjb25zdHJ1Y3RzIHRoZSAiLXVybCA8dXJsPiAtZGVidWcgPGFjdGlvbj4gPHBhc3N3b3JkPiIgcG9ydGlvbgorICAgICAgICAvLyBvZiB0aGUgY29tbW1hbmQgbGluZQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihTVFJJTkdfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgoZ2V0U2VydmVyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgPyAiLXVybCAiICsgZ2V0U2VydmVyKCkKKyAgICAgICAgICAgICAgICAgICAgOiAiIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGRlYnVnID8gIi1kZWJ1ZyAiIDogIiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgoZ2V0VXNlck5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICA/ICItdXNlcm5hbWUgIiArIGdldFVzZXJOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgOiAiIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKHRhc2suZ2V0QWN0aW9uKCkpLmFwcGVuZCgiICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChnZXRQYXNzd29yZCgpKS5hcHBlbmQoIiAiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQnVpbGRzIHRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB3ZWJsb2dpYy5kZXBsb3kgZm9yIGRlcGxveW1lbnQgYWN0aW9ucworICAgICAqICAoImRlcGxveSIgYW5kICJ1cGRhdGUiKS4KKyAgICAgKiAgQHJldHVybiBBIFN0cmluZyBjb250YWluaW5nIHRoZSBmdWxsIGFyZ3VtZW50IHN0cmluZyBmb3Igd2VibG9naWMuZGVwbG95LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYnVpbGREZXBsb3lBcmdzKCkgeworICAgICAgICBTdHJpbmcgYXJncyA9IGJ1aWxkQXJnc1ByZWZpeCgpCisgICAgICAgICAgICAgICAgLmFwcGVuZChhcHBsaWNhdGlvbikuYXBwZW5kKCIgIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGdldFRhc2soKS5nZXRTb3VyY2UoKSkKKyAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKKworICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFyZ3MgPSAiLWNvbXBvbmVudCAiICsgY29tcG9uZW50ICsgIiAiICsgYXJnczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqICBCdWlsZHMgdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHdlYmxvZ2ljLmRlcGxveSBmb3IgdW5kZXBsb3ltZW50IGFjdGlvbnMKKyAgICAgKiAgKCJ1bmRlcGxveSIgYW5kICJkZWxldGUiKS4KKyAgICAgKiAgQHJldHVybiBBIFN0cmluZyBjb250YWluaW5nIHRoZSBmdWxsIGFyZ3VtZW50IHN0cmluZyBmb3Igd2VibG9naWMuZGVwbG95LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYnVpbGRVbmRlcGxveUFyZ3MoKSB7CisgICAgICAgIHJldHVybiBidWlsZEFyZ3NQcmVmaXgoKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoYXBwbGljYXRpb24pLmFwcGVuZCgiICIpCisgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIEJ1aWxkcyB0aGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gd2VibG9naWMuZGVwbG95IGZvciB0aGUgbGlzdCBhY3Rpb24KKyAgICAgKiAgQHJldHVybiBBIFN0cmluZyBjb250YWluaW5nIHRoZSBmdWxsIGFyZ3VtZW50IHN0cmluZyBmb3Igd2VibG9naWMuZGVwbG95LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYnVpbGRMaXN0QXJncygpIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkQXJnc1ByZWZpeCgpCisgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIElmIHNldCB0byB0cnVlLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUKKyAgICAgKiAgcHJpbnRlZCBkdXJpbmcgdGhlIGRlcGxveW1lbnQgcHJvY2Vzczsgb3B0aW9uYWwuCisgICAgICogIEBwYXJhbSBkZWJ1ZyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdlYmxvZ2ljLmRlcGxveSAiLWRlYnVnIiBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqICBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gYmVpbmcgZGVwbG95ZWQ7IHJlcXVpcmVkLgorICAgICAqICBAcGFyYW0gYXBwbGljYXRpb24gQSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhcHBsaWNhdGlvbiBwb3J0aW9uIG9mIHRoZQorICAgICAqICB3ZWJsb2dpYy5kZXBsb3kgY29tbWFuZCBsaW5lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKFN0cmluZyBhcHBsaWNhdGlvbikgeworICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhlIGNvbXBvbmVudCBzdHJpbmcgZm9yIHRoZSBkZXBsb3ltZW50IHRhcmdldHM7IG9wdGlvbmFsLgorICAgICAqIEl0IGlzIGluIHRoZSBmb3JtIDxjb2RlPiZsdDtjb21wb25lbnQmZ3Q7OiZsdDt0YXJnZXQxJmd0OywmbHQ7dGFyZ2V0MiZndDsuLi48L2NvZGU+CisgICAgICogV2hlcmUgY29tcG9uZW50IGlzIHRoZSBhcmNoaXZlIG5hbWUgKG1pbnVzIHRoZSAuamFyLCAuZWFyLCAud2FyCisgICAgICogZXh0ZW5zaW9uKS4gIFRhcmdldHMgYXJlIHRoZSBzZXJ2ZXJzIHdoZXJlIHRoZSBjb21wb25lbnRzIHdpbGwgYmUgZGVwbG95ZWQKKworICAgICAqICBAcGFyYW0gY29tcG9uZW50IEEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICItY29tcG9uZW50IgorICAgICAqICBhcmd1bWVudCBvZiB0aGUgd2VibG9naWMuZGVwbG95IGNvbW1hbmQgbGluZSBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudCkgeworICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhY2MvSkpEb2MuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KSkRvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWVmMjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhY2MvSkpEb2MuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFjYzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKKworLyoqCisgKiBSdW5zIHRoZSBKSkRvYyBjb21waWxlciBjb21waWxlci4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKSkRvYyBleHRlbmRzIFRhc2sgeworCisgICAgLy8ga2V5cyB0byBvcHRpb25hbCBhdHRyaWJ1dGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GSUxFICAgICAgID0gIk9VVFBVVF9GSUxFIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCAgICAgICAgICAgICAgPSAiVEVYVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UQUJMRSAgICAgICAgID0gIk9ORV9UQUJMRSI7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZSBvcHRpb25hbEF0dHJzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIHBsYWluVGV4dCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VGRklYX0hUTUwgPSAiLmh0bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVRkZJWF9URVhUID0gIi50eHQiOworCisgICAgLy8gcmVxdWlyZWQgYXR0cmlidXRlcworICAgIHByaXZhdGUgRmlsZSB0YXJnZXRGaWxlICAgICAgPSBudWxsOworICAgIHByaXZhdGUgRmlsZSBqYXZhY2NIb21lICAgICAgPSBudWxsOworCisgICAgcHJpdmF0ZSBDb21tYW5kbGluZUphdmEgY21kbCA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgVEVYVCBCTkYgZG9jdW1lbnRhdGlvbiBvcHRpb24uCisgICAgICogQHBhcmFtIHBsYWluVGV4dCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRleHQoYm9vbGVhbiBwbGFpblRleHQpIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoVEVYVCwgcGxhaW5UZXh0ID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgICAgIHRoaXMucGxhaW5UZXh0ID0gcGxhaW5UZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIE9ORV9UQUJMRSBkb2N1bWVudGF0aW9uIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gb25lVGFibGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbmV0YWJsZShib29sZWFuIG9uZVRhYmxlKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KE9ORV9UQUJMRSwgb25lVGFibGUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3V0cHV0ZmlsZSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIEJORiBkb2N1bWVudGF0aW9uIGZpbGUgdG8uCisgICAgICogSWYgbm90IHNldCwgdGhlIGZpbGUgaXMgd3JpdHRlbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMKKyAgICAgKiB0aGUgSmF2YUNDIGdyYW1tYXIgZmlsZSB3aXRoIGEgc3VmZml4IC5odG1sIG9yIC50eHQuCisgICAgICogQHBhcmFtIG91dHB1dEZpbGUgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dGZpbGUoU3RyaW5nIG91dHB1dEZpbGUpIHsKKyAgICAgICAgdGhpcy5vdXRwdXRGaWxlID0gb3V0cHV0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgamF2YWNjIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLgorICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIGdyYW1tYXIgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoRmlsZSB0YXJnZXQpIHsKKyAgICAgICAgdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSmF2YUNDIGRpc3RyaWJ1dGlvbi4KKyAgICAgKiBAcGFyYW0gamF2YWNjSG9tZSB0aGUgaG9tZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SmF2YWNjaG9tZShGaWxlIGphdmFjY0hvbWUpIHsKKyAgICAgICAgdGhpcy5qYXZhY2NIb21lID0gamF2YWNjSG9tZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBKSkRvYygpIHsKKyAgICAgICAgY21kbC5zZXRWbShKYXZhRW52VXRpbHMuZ2V0SnJlRXhlY3V0YWJsZSgiamF2YSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgdGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIGxvYWQgY29tbWFuZCBsaW5lIHdpdGggb3B0aW9uYWwgYXR0cmlidXRlcworICAgICAgICBFbnVtZXJhdGlvbiBpdGVyID0gb3B0aW9uYWxBdHRycy5rZXlzKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSAgPSAoU3RyaW5nKSBpdGVyLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvcHRpb25hbEF0dHJzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGNtZGwuY3JlYXRlQXJndW1lbnQoKQorICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSgiLSIgKyBuYW1lICsgIjoiICsgdmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFyZ2V0RmlsZSA9PSBudWxsIHx8ICF0YXJnZXRGaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgdGFyZ2V0OiAiICsgdGFyZ2V0RmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkgLnNldFZhbHVlKCItIiArIE9VVFBVVF9GSUxFICsgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0RmlsZS5yZXBsYWNlKCdcXCcsICcvJykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGFyZ2V0IGFzIHRoZSBvdXRwdXQgZGlyZWN0b3J5CisgICAgICAgIEZpbGUgamF2YUZpbGUgPSBuZXcgRmlsZShjcmVhdGVPdXRwdXRGaWxlTmFtZSh0YXJnZXRGaWxlLCBvdXRwdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW5UZXh0KSk7CisKKyAgICAgICAgaWYgKGphdmFGaWxlLmV4aXN0cygpCisgICAgICAgICAgICAgJiYgdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSA8IGphdmFGaWxlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICBsb2coIlRhcmdldCBpcyBhbHJlYWR5IGJ1aWx0IC0gc2tpcHBpbmcgKCIgKyB0YXJnZXRGaWxlICsgIikiLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY21kbC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIGZpbmFsIFBhdGggY2xhc3NwYXRoID0gY21kbC5jcmVhdGVDbGFzc3BhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgZmluYWwgRmlsZSBqYXZhY2NKYXIgPSBKYXZhQ0MuZ2V0QXJjaGl2ZUZpbGUoamF2YWNjSG9tZSk7CisgICAgICAgIGNsYXNzcGF0aC5jcmVhdGVQYXRoRWxlbWVudCgpLnNldFBhdGgoamF2YWNjSmFyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgY2xhc3NwYXRoLmFkZEphdmFSdW50aW1lKCk7CisKKyAgICAgICAgY21kbC5zZXRDbGFzc25hbWUoSmF2YUNDLmdldE1haW5DbGFzcyhjbGFzc3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUNDLlRBU0tERUZfVFlQRV9KSkRPQykpOworCisgICAgICAgIGZpbmFsIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZyA9IGNtZGwuY3JlYXRlVm1Bcmd1bWVudCgpOworICAgICAgICBhcmcuc2V0VmFsdWUoIi1teDE0ME0iKTsKKyAgICAgICAgYXJnLnNldFZhbHVlKCItRGluc3RhbGwucm9vdD0iICsgamF2YWNjSG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0ZSBwcm9jZXNzID0KKyAgICAgICAgICAgIG5ldyBFeGVjdXRlKG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyksCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgbG9nKGNtZGwuZGVzY3JpYmVDb21tYW5kKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBwcm9jZXNzLnNldENvbW1hbmRsaW5lKGNtZGwuZ2V0Q29tbWFuZGxpbmUoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChwcm9jZXNzLmV4ZWN1dGUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJKSkRvYyBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIGxhdW5jaCBKSkRvYyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlT3V0cHV0RmlsZU5hbWUoRmlsZSBkZXN0RmlsZSwgU3RyaW5nIG9wdGlvbmFsT3V0cHV0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBsYWluKSB7CisgICAgICAgIFN0cmluZyBzdWZmaXggPSBERUZBVUxUX1NVRkZJWF9IVE1MOworICAgICAgICBTdHJpbmcgamF2YWNjRmlsZSA9IGRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKKworICAgICAgICBpZiAocGxhaW4pIHsKKyAgICAgICAgICAgIHN1ZmZpeCA9IERFRkFVTFRfU1VGRklYX1RFWFQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG9wdGlvbmFsT3V0cHV0RmlsZSA9PSBudWxsKSB8fCBvcHRpb25hbE91dHB1dEZpbGUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgaW50IGZpbGVQb3MgPSBqYXZhY2NGaWxlLmxhc3RJbmRleE9mKCIvIik7CisKKyAgICAgICAgICAgIGlmIChmaWxlUG9zID49IDApIHsKKyAgICAgICAgICAgICAgICBqYXZhY2NGaWxlID0gamF2YWNjRmlsZS5zdWJzdHJpbmcoZmlsZVBvcyArIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgc3VmZml4UG9zID0gamF2YWNjRmlsZS5sYXN0SW5kZXhPZignLicpOworCisgICAgICAgICAgICBpZiAoc3VmZml4UG9zID09IC0xKSB7CisgICAgICAgICAgICAgICAgb3B0aW9uYWxPdXRwdXRGaWxlID0gamF2YWNjRmlsZSArIHN1ZmZpeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRTdWZmaXggPSBqYXZhY2NGaWxlLnN1YnN0cmluZyhzdWZmaXhQb3MpOworCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWZmaXguZXF1YWxzKHN1ZmZpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxPdXRwdXRGaWxlID0gamF2YWNjRmlsZSArIHN1ZmZpeDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcHRpb25hbE91dHB1dEZpbGUgPSBqYXZhY2NGaWxlLnN1YnN0cmluZygwLCBzdWZmaXhQb3MpCisgICAgICAgICAgICAgICAgICAgICAgICArIHN1ZmZpeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcHRpb25hbE91dHB1dEZpbGUgPSBvcHRpb25hbE91dHB1dEZpbGUucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpICsgIi8iICsgb3B0aW9uYWxPdXRwdXRGaWxlKQorICAgICAgICAgICAgLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhY2MvSkpUcmVlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhY2MvSkpUcmVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxYzM5OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KSlRyZWUuamF2YQpAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFjYzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKKworLyoqCisgKiBSdW5zIHRoZSBKSlRyZWUgY29tcGlsZXIgY29tcGlsZXIuCisgKgorICovCitwdWJsaWMgY2xhc3MgSkpUcmVlIGV4dGVuZHMgVGFzayB7CisKKyAgICAvLyBrZXlzIHRvIG9wdGlvbmFsIGF0dHJpYnV0ZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0ZJTEUgICAgICAgPSAiT1VUUFVUX0ZJTEUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9OT0RFX0ZJTEVTICA9ICJCVUlMRF9OT0RFX0ZJTEVTIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVEkgICAgICAgICAgICAgPSAiTVVMVEkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0RFRkFVTFRfVk9JRCA9ICJOT0RFX0RFRkFVTFRfVk9JRCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfRkFDVE9SWSAgICAgID0gIk5PREVfRkFDVE9SWSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfU0NPUEVfSE9PSyAgID0gIk5PREVfU0NPUEVfSE9PSyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfVVNFU19QQVJTRVIgID0gIk5PREVfVVNFU19QQVJTRVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUMgICAgICAgICAgICA9ICJTVEFUSUMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJVE9SICAgICAgICAgICA9ICJWSVNJVE9SIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1BBQ0tBR0UgICAgICA9ICJOT0RFX1BBQ0tBR0UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJVE9SX0VYQ0VQVElPTiA9ICJWSVNJVE9SX0VYQ0VQVElPTiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUFJFRklYICAgICAgID0gIk5PREVfUFJFRklYIjsKKworICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlIG9wdGlvbmFsQXR0cnMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRGaWxlID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVRkZJWCA9ICIuamoiOworCisgICAgLy8gcmVxdWlyZWQgYXR0cmlidXRlcworICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgRmlsZSB0YXJnZXRGaWxlICAgICAgPSBudWxsOworICAgIHByaXZhdGUgRmlsZSBqYXZhY2NIb21lICAgICAgPSBudWxsOworCisgICAgcHJpdmF0ZSBDb21tYW5kbGluZUphdmEgY21kbCA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgQlVJTERfTk9ERV9GSUxFUyBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVpbGROb2RlRmlsZXMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZG5vZGVmaWxlcyhib29sZWFuIGJ1aWxkTm9kZUZpbGVzKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KEJVSUxEX05PREVfRklMRVMsIGJ1aWxkTm9kZUZpbGVzID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgTVVMVEkgZ3JhbW1hciBvcHRpb24uCisgICAgICogQHBhcmFtIG11bHRpIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGkoYm9vbGVhbiBtdWx0aSkgeworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChNVUxUSSwgbXVsdGkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBOT0RFX0RFRkFVTFRfVk9JRCBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gbm9kZURlZmF1bHRWb2lkIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZWRlZmF1bHR2b2lkKGJvb2xlYW4gbm9kZURlZmF1bHRWb2lkKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KE5PREVfREVGQVVMVF9WT0lELCBub2RlRGVmYXVsdFZvaWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBOT0RFX0ZBQ1RPUlkgZ3JhbW1hciBvcHRpb24uCisgICAgICogQHBhcmFtIG5vZGVGYWN0b3J5IGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZWZhY3RvcnkoYm9vbGVhbiBub2RlRmFjdG9yeSkgeworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChOT0RFX0ZBQ1RPUlksIG5vZGVGYWN0b3J5ID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgTk9ERV9TQ09QRV9IT09LIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBub2RlU2NvcGVIb29rIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZXNjb3BlaG9vayhib29sZWFuIG5vZGVTY29wZUhvb2spIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTk9ERV9TQ09QRV9IT09LLCBub2RlU2NvcGVIb29rID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgTk9ERV9VU0VTX1BBUlNFUiBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gbm9kZVVzZXNQYXJzZXIgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb2RldXNlc3BhcnNlcihib29sZWFuIG5vZGVVc2VzUGFyc2VyKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KE5PREVfVVNFU19QQVJTRVIsIG5vZGVVc2VzUGFyc2VyID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgU1RBVElDIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0aWNQYXJzZXIgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0aWMoYm9vbGVhbiBzdGF0aWNQYXJzZXIpIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoU1RBVElDLCBzdGF0aWNQYXJzZXIgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBWSVNJVE9SIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSB2aXNpdG9yIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihib29sZWFuIHZpc2l0b3IpIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoVklTSVRPUiwgdmlzaXRvciA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIE5PREVfUEFDS0FHRSBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gbm9kZVBhY2thZ2UgdGhlIG9wdGlvbiB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZXBhY2thZ2UoU3RyaW5nIG5vZGVQYWNrYWdlKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KE5PREVfUEFDS0FHRSwgbm9kZVBhY2thZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIFZJU0lUT1JfRVhDRVBUSU9OIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSB2aXNpdG9yRXhjZXB0aW9uIHRoZSBvcHRpb24gdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZpc2l0b3JFeGNlcHRpb24oU3RyaW5nIHZpc2l0b3JFeGNlcHRpb24pIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoVklTSVRPUl9FWENFUFRJT04sIHZpc2l0b3JFeGNlcHRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIE5PREVfUFJFRklYIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBub2RlUHJlZml4IHRoZSBvcHRpb24gdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZGVwcmVmaXgoU3RyaW5nIG5vZGVQcmVmaXgpIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTk9ERV9QUkVGSVgsIG5vZGVQcmVmaXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBKYXZhQ0MgZ3JhbW1hciBhbmQgbm9kZSBmaWxlcyB0by4KKyAgICAgKiBJZiBub3Qgc2V0LCB0aGUgZmlsZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeQorICAgICAqIGNvbnRhaW5pbmcgdGhlIGdyYW1tYXIgZmlsZS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0RGlyZWN0b3J5IHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dGRpcmVjdG9yeShGaWxlIG91dHB1dERpcmVjdG9yeSkgeworICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3V0cHV0ZmlsZSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIEphdmFDQyBncmFtbWFyIGZpbGUgdG8uCisgICAgICogSWYgbm90IHNldCwgdGhlIGZpbGUgaXMgd3JpdHRlbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMKKyAgICAgKiB0aGUgSkpUcmVlIGdyYW1tYXIgZmlsZSB3aXRoIGEgc3VmZml4IC5qai4KKyAgICAgKiBAcGFyYW0gb3V0cHV0RmlsZSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRmaWxlKFN0cmluZyBvdXRwdXRGaWxlKSB7CisgICAgICAgIHRoaXMub3V0cHV0RmlsZSA9IG91dHB1dEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGpqdHJlZSBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0RmlsZSB0aGUgZ3JhbW1hciBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChGaWxlIHRhcmdldEZpbGUpIHsKKyAgICAgICAgdGhpcy50YXJnZXRGaWxlID0gdGFyZ2V0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uCisgICAgICogQHBhcmFtIGphdmFjY0hvbWUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEphdmFDQy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhY2Nob21lKEZpbGUgamF2YWNjSG9tZSkgeworICAgICAgICB0aGlzLmphdmFjY0hvbWUgPSBqYXZhY2NIb21lOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIEpKVHJlZSgpIHsKKyAgICAgICAgY21kbC5zZXRWbShKYXZhRW52VXRpbHMuZ2V0SnJlRXhlY3V0YWJsZSgiamF2YSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRhc2suCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBsb2FkIGNvbW1hbmQgbGluZSB3aXRoIG9wdGlvbmFsIGF0dHJpYnV0ZXMKKyAgICAgICAgRW51bWVyYXRpb24gaXRlciA9IG9wdGlvbmFsQXR0cnMua2V5cygpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgID0gKFN0cmluZykgaXRlci5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb3B0aW9uYWxBdHRycy5nZXQobmFtZSk7CisgICAgICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0iICsgbmFtZSArICI6IiArIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldEZpbGUgPT0gbnVsbCB8fCAhdGFyZ2V0RmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIHRhcmdldDogIiArIHRhcmdldEZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBqYXZhRmlsZSA9IG51bGw7CisKKyAgICAgICAgLy8gdXNlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGFyZ2V0IGFzIHRoZSBvdXRwdXQgZGlyZWN0b3J5CisgICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gY29udmVydCBiYWNrc2xhc2hlcyB0byBzbGFzaGVzLCBvdGhlcndpc2Ugamp0cmVlIHdpbGwKKyAgICAgICAgICAgIC8vIHB1dCB0aGlzIGFzIGNvbW1lbnRzIGFuZCB0aGlzIHNlZW1zIHRvIGNvbmZ1c2UgamF2YWNjCisgICAgICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1PVVRQVVRfRElSRUNUT1JZOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldERlZmF1bHRPdXRwdXREaXJlY3RvcnkoKSk7CisKKyAgICAgICAgICAgIGphdmFGaWxlID0gbmV3IEZpbGUoY3JlYXRlT3V0cHV0RmlsZU5hbWUodGFyZ2V0RmlsZSwgb3V0cHV0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFvdXRwdXREaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJ291dHB1dGRpcmVjdG9yeScgIiArIG91dHB1dERpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb252ZXJ0IGJhY2tzbGFzaGVzIHRvIHNsYXNoZXMsIG90aGVyd2lzZSBqanRyZWUgd2lsbAorICAgICAgICAgICAgLy8gcHV0IHRoaXMgYXMgY29tbWVudHMgYW5kIHRoaXMgc2VlbXMgdG8gY29uZnVzZSBqYXZhY2MKKyAgICAgICAgICAgIGNtZGwuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLU9VVFBVVF9ESVJFQ1RPUlk6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnXFwnLCAnLycpKTsKKworICAgICAgICAgICAgamF2YUZpbGUgPSBuZXcgRmlsZShjcmVhdGVPdXRwdXRGaWxlTmFtZSh0YXJnZXRGaWxlLCBvdXRwdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhdGgoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGphdmFGaWxlLmV4aXN0cygpCisgICAgICAgICAgICAmJiB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpIDwgamF2YUZpbGUubGFzdE1vZGlmaWVkKCkpIHsKKyAgICAgICAgICAgIGxvZygiVGFyZ2V0IGlzIGFscmVhZHkgYnVpbHQgLSBza2lwcGluZyAoIiArIHRhcmdldEZpbGUgKyAiKSIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0iICsgT1VUUFVUX0ZJTEUgKyAiOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG91dHB1dEZpbGUucmVwbGFjZSgnXFwnLCAnLycpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNtZGwuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSh0YXJnZXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBmaW5hbCBQYXRoIGNsYXNzcGF0aCA9IGNtZGwuY3JlYXRlQ2xhc3NwYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIGZpbmFsIEZpbGUgamF2YWNjSmFyID0gSmF2YUNDLmdldEFyY2hpdmVGaWxlKGphdmFjY0hvbWUpOworICAgICAgICBjbGFzc3BhdGguY3JlYXRlUGF0aEVsZW1lbnQoKS5zZXRQYXRoKGphdmFjY0phci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGNsYXNzcGF0aC5hZGRKYXZhUnVudGltZSgpOworCisgICAgICAgIGNtZGwuc2V0Q2xhc3NuYW1lKEphdmFDQy5nZXRNYWluQ2xhc3MoY2xhc3NwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFDQy5UQVNLREVGX1RZUEVfSkpUUkVFKSk7CisKKyAgICAgICAgZmluYWwgQ29tbWFuZGxpbmUuQXJndW1lbnQgYXJnID0gY21kbC5jcmVhdGVWbUFyZ3VtZW50KCk7CisgICAgICAgIGFyZy5zZXRWYWx1ZSgiLW14MTQwTSIpOworICAgICAgICBhcmcuc2V0VmFsdWUoIi1EaW5zdGFsbC5yb290PSIgKyBqYXZhY2NIb21lLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBmaW5hbCBFeGVjdXRlIHByb2Nlc3MgPQorICAgICAgICAgICAgbmV3IEV4ZWN1dGUobmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICBsb2coY21kbC5kZXNjcmliZUNvbW1hbmQoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIHByb2Nlc3Muc2V0Q29tbWFuZGxpbmUoY21kbC5nZXRDb21tYW5kbGluZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHByb2Nlc3MuZXhlY3V0ZSgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkpKVHJlZSBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIGxhdW5jaCBKSlRyZWUiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZU91dHB1dEZpbGVOYW1lKEZpbGUgZGVzdEZpbGUsIFN0cmluZyBvcHRpb25hbE91dHB1dEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dERpcikgeworICAgICAgICBvcHRpb25hbE91dHB1dEZpbGUgPSB2YWxpZGF0ZU91dHB1dEZpbGUob3B0aW9uYWxPdXRwdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyKTsKKyAgICAgICAgU3RyaW5nIGpqdHJlZUZpbGUgPSBkZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKCdcXCcsICcvJyk7CisKKyAgICAgICAgaWYgKChvcHRpb25hbE91dHB1dEZpbGUgPT0gbnVsbCkgfHwgb3B0aW9uYWxPdXRwdXRGaWxlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGludCBmaWxlUG9zID0gamp0cmVlRmlsZS5sYXN0SW5kZXhPZigiLyIpOworCisgICAgICAgICAgICBpZiAoZmlsZVBvcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgamp0cmVlRmlsZSA9IGpqdHJlZUZpbGUuc3Vic3RyaW5nKGZpbGVQb3MgKyAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHN1ZmZpeFBvcyA9IGpqdHJlZUZpbGUubGFzdEluZGV4T2YoJy4nKTsKKworICAgICAgICAgICAgaWYgKHN1ZmZpeFBvcyA9PSAtMSkgeworICAgICAgICAgICAgICAgIG9wdGlvbmFsT3V0cHV0RmlsZSA9IGpqdHJlZUZpbGUgKyBERUZBVUxUX1NVRkZJWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRTdWZmaXggPSBqanRyZWVGaWxlLnN1YnN0cmluZyhzdWZmaXhQb3MpOworCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWZmaXguZXF1YWxzKERFRkFVTFRfU1VGRklYKSkgeworICAgICAgICAgICAgICAgICAgICBvcHRpb25hbE91dHB1dEZpbGUgPSBqanRyZWVGaWxlICsgREVGQVVMVF9TVUZGSVg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxPdXRwdXRGaWxlID0gamp0cmVlRmlsZS5zdWJzdHJpbmcoMCwgc3VmZml4UG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBERUZBVUxUX1NVRkZJWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG91dHB1dERpciA9PSBudWxsKSB8fCBvdXRwdXREaXIuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgb3V0cHV0RGlyID0gZ2V0RGVmYXVsdE91dHB1dERpcmVjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChvdXRwdXREaXIgKyAiLyIgKyBvcHRpb25hbE91dHB1dEZpbGUpLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHJ1bm5pbmcgSkpUcmVlIGZyb20gYW4gQW50IHRhc2tkZXNrIHRoZSAtT1VUUFVUX0RJUkVDVE9SWSBtdXN0CisgICAgICogYWx3YXlzIGJlIHNldC4gQnV0IHdoZW4gLU9VVFBVVF9ESVJFQ1RPUlkgaXMgc2V0LCAtT1VUUFVUX0ZJTEUgaXMKKyAgICAgKiBoYW5kbGVkIGFzIGlmIHJlbGF0aXZlIG9mIHRoaXMgLU9VVFBVVF9ESVJFQ1RPUlkuIFRodXMgd2hlbiB0aGUKKyAgICAgKiAtT1VUUFVUX0ZJTEUgaXMgYWJzb2x1dGUgb3IgY29udGFpbnMgYSBkcml2ZSBsZXR0ZXIgd2UgaGF2ZSBhIHByb2JsZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUKKyAgICAgKiBAcGFyYW0gb3V0cHV0RGlyCisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZU91dHB1dEZpbGUoU3RyaW5nIGRlc3RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0RGlyKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZGVzdEZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG91dHB1dERpciA9PSBudWxsKQorICAgICAgICAgICAgJiYgKGRlc3RGaWxlLnN0YXJ0c1dpdGgoIi8iKSB8fCBkZXN0RmlsZS5zdGFydHNXaXRoKCJcXCIpKSkgeworICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlT3V0cHV0RmlsZSA9IG1ha2VPdXRwdXRGaWxlUmVsYXRpdmUoZGVzdEZpbGUpOworICAgICAgICAgICAgc2V0T3V0cHV0ZmlsZShyZWxhdGl2ZU91dHB1dEZpbGUpOworCisgICAgICAgICAgICByZXR1cm4gcmVsYXRpdmVPdXRwdXRGaWxlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJvb3QgPSBnZXRSb290KG5ldyBGaWxlKGRlc3RGaWxlKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisKKyAgICAgICAgaWYgKChyb290Lmxlbmd0aCgpID4gMSkKKyAgICAgICAgICAgICYmIGRlc3RGaWxlLnN0YXJ0c1dpdGgocm9vdC5zdWJzdHJpbmcoMCwgcm9vdC5sZW5ndGgoKSAtIDEpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEcml2ZSBsZXR0ZXIgaW4gJ291dHB1dGZpbGUnIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3VwcG9ydGVkOiAiICsgZGVzdEZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlc3RGaWxlOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG1ha2VPdXRwdXRGaWxlUmVsYXRpdmUoU3RyaW5nIGRlc3RGaWxlKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZWxhdGl2ZVBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBkZWZhdWx0T3V0cHV0RGlyZWN0b3J5ID0gZ2V0RGVmYXVsdE91dHB1dERpcmVjdG9yeSgpOworICAgICAgICBpbnQgbmV4dFBvcyA9IGRlZmF1bHRPdXRwdXREaXJlY3RvcnkuaW5kZXhPZignLycpOworICAgICAgICBpbnQgc3RhcnRQb3MgPSBuZXh0UG9zICsgMTsKKworICAgICAgICB3aGlsZSAoc3RhcnRQb3MgPiAtMSAmJiBzdGFydFBvcyA8IGRlZmF1bHRPdXRwdXREaXJlY3RvcnkubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHJlbGF0aXZlUGF0aC5hcHBlbmQoIi8uLiIpOworICAgICAgICAgICAgbmV4dFBvcyA9IGRlZmF1bHRPdXRwdXREaXJlY3RvcnkuaW5kZXhPZignLycsIHN0YXJ0UG9zKTsKKworICAgICAgICAgICAgaWYgKG5leHRQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzdGFydFBvcyA9IG5leHRQb3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gbmV4dFBvcyArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZWxhdGl2ZVBhdGguYXBwZW5kKGRlc3RGaWxlKTsKKworICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdE91dHB1dERpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSByb290IGRpcmVjdG9yeSBmb3IgYSBnaXZlbiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUKKyAgICAgKiBAcmV0dXJuIGZpbGUncyByb290IGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBnZXRSb290KEZpbGUgZmlsZSkgeworICAgICAgICBGaWxlIHJvb3QgPSBmaWxlLmdldEFic29sdXRlRmlsZSgpOworCisgICAgICAgIHdoaWxlIChyb290LmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJvb3QgPSByb290LmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByb290OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KYXZhQ0MuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KYXZhQ0MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGYzZDkxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWNjL0phdmFDQy5qYXZhCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamF2YWNjOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKKworLyoqCisgKiBKYXZhQ0MgY29tcGlsZXIgY29tcGlsZXIgdGFzay4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhQ0MgZXh0ZW5kcyBUYXNrIHsKKworICAgIC8vIGtleXMgdG8gb3B0aW9uYWwgYXR0cmlidXRlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT09LQUhFQUQgICAgICAgICAgICAgID0gIkxPT0tBSEVBRCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIT0lDRV9BTUJJR1VJVFlfQ0hFQ0sgPSAiQ0hPSUNFX0FNQklHVUlUWV9DSEVDSyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9USEVSX0FNQklHVUlUWV9DSEVDSyAgPSAiT1RIRVJfQU1CSUdVSVRZX0NIRUNLIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUMgICAgICAgICAgICAgICAgID0gIlNUQVRJQyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1BBUlNFUiAgICAgICAgICAgPSAiREVCVUdfUEFSU0VSIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfTE9PS0FIRUFEICAgICAgICA9ICJERUJVR19MT09LQUhFQUQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19UT0tFTl9NQU5BR0VSICAgID0gIkRFQlVHX1RPS0VOX01BTkFHRVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJTUlaRV9UT0tFTl9NQU5BR0VSID0gIk9QVElNSVpFX1RPS0VOX01BTkFHRVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9SRVBPUlRJTkcgICAgICAgID0gIkVSUk9SX1JFUE9SVElORyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfVU5JQ09ERV9FU0NBUEUgICAgPSAiSkFWQV9VTklDT0RFX0VTQ0FQRSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSUNPREVfSU5QVVQgICAgICAgICAgPSAiVU5JQ09ERV9JTlBVVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9DQVNFICAgICAgICAgICAgPSAiSUdOT1JFX0NBU0UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NT05fVE9LRU5fQUNUSU9OICAgID0gIkNPTU1PTl9UT0tFTl9BQ1RJT04iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RPS0VOX01BTkFHRVIgICAgID0gIlVTRVJfVE9LRU5fTUFOQUdFUiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQ0hBUl9TVFJFQU0gICAgICAgPSAiVVNFUl9DSEFSX1NUUkVBTSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1BBUlNFUiAgICAgICAgICAgPSAiQlVJTERfUEFSU0VSIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfVE9LRU5fTUFOQUdFUiAgICA9ICJCVUlMRF9UT0tFTl9NQU5BR0VSIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FOSVRZX0NIRUNLICAgICAgICAgICA9ICJTQU5JVFlfQ0hFQ0siOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRV9MQV9DSEVDSyAgICAgICAgID0gIkZPUkNFX0xBX0NIRUNLIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVE9LRU5TICAgICAgICAgICA9ICJDQUNIRV9UT0tFTlMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRUVQX0xJTkVfQ09MVU1OICAgICAgID0gIktFRVBfTElORV9DT0xVTU4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKREtfVkVSU0lPTiAgICAgICAgICAgID0gIkpES19WRVJTSU9OIjsKKworICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlIG9wdGlvbmFsQXR0cnMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvLyByZXF1aXJlZCBhdHRyaWJ1dGVzCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlIHRhcmdldEZpbGUgICAgICA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlIGphdmFjY0hvbWUgICAgICA9IG51bGw7CisKKyAgICBwcml2YXRlIENvbW1hbmRsaW5lSmF2YSBjbWRsID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEFTS0RFRl9UWVBFX0pBVkFDQyA9IDE7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEFTS0RFRl9UWVBFX0pKVFJFRSA9IDI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEFTS0RFRl9UWVBFX0pKRE9DID0gMzsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVJDSElWRV9MT0NBVElPTlMgPQorICAgICAgICBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgIkphdmFDQy56aXAiLAorICAgICAgICAgICAgImJpbi9saWIvSmF2YUNDLnppcCIsCisgICAgICAgICAgICAiYmluL2xpYi9qYXZhY2MuamFyIiwKKyAgICAgICAgICAgICJqYXZhY2MuamFyIiwgLy8gdXNlZCBieSBqcGFja2FnZSBmb3IgSmF2YUNDIDMueAorICAgICAgICB9OworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBBUkNISVZFX0xPQ0FUSU9OU19WU19NQUpPUl9WRVJTSU9OID0KKyAgICAgICAgbmV3IGludFtdIHsKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgMywKKyAgICAgICAgICAgIDMsCisgICAgICAgIH07CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01fUEFDS0FHRSA9ICJDT00uc3VuLmxhYnMuIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01fSkFWQUNDX0NMQVNTID0gImphdmFjYy5NYWluIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01fSkpUUkVFX0NMQVNTID0gImpqdHJlZS5NYWluIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01fSkpET0NfQ0xBU1MgPSAiampkb2MuSkpEb2NNYWluIjsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19QQUNLQUdFXzNfMCA9ICJvcmcubmV0YmVhbnMuamF2YWNjLiI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX1BBQ0tBR0VfM18xID0gIm9yZy5qYXZhY2MuIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfSkFWQUNDX0NMQVNTID0gInBhcnNlci5NYWluIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfSkpUUkVFX0NMQVNTID0gQ09NX0pKVFJFRV9DTEFTUzsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfSkpET0NfQ0xBU1MgPSBDT01fSkpET0NfQ0xBU1M7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBMT09LQUhFQUQgZ3JhbW1hciBvcHRpb24uCisgICAgICogQHBhcmFtIGxvb2thaGVhZCBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvb2thaGVhZChpbnQgbG9va2FoZWFkKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KExPT0tBSEVBRCwgbmV3IEludGVnZXIobG9va2FoZWFkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgQ0hPSUNFX0FNQklHVUlUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gY2hvaWNlQW1iaWd1aXR5Q2hlY2sgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaG9pY2VhbWJpZ3VpdHljaGVjayhpbnQgY2hvaWNlQW1iaWd1aXR5Q2hlY2spIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoQ0hPSUNFX0FNQklHVUlUWV9DSEVDSywgbmV3IEludGVnZXIoY2hvaWNlQW1iaWd1aXR5Q2hlY2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBPVEhFUl9BTUJJR1VJVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uCisgICAgICogQHBhcmFtIG90aGVyQW1iaWd1aXR5Q2hlY2sgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdGhlcmFtYmlndWl0eUNoZWNrKGludCBvdGhlckFtYmlndWl0eUNoZWNrKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KE9USEVSX0FNQklHVUlUWV9DSEVDSywgbmV3IEludGVnZXIob3RoZXJBbWJpZ3VpdHlDaGVjaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIFNUQVRJQyBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gc3RhdGljUGFyc2VyIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdGljKGJvb2xlYW4gc3RhdGljUGFyc2VyKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KFNUQVRJQywgc3RhdGljUGFyc2VyID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgREVCVUdfUEFSU0VSIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBkZWJ1Z1BhcnNlciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVncGFyc2VyKGJvb2xlYW4gZGVidWdQYXJzZXIpIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoREVCVUdfUEFSU0VSLCBkZWJ1Z1BhcnNlciA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIERFQlVHX0xPT0tBSEVBRCBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gZGVidWdMb29rYWhlYWQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z2xvb2thaGVhZChib29sZWFuIGRlYnVnTG9va2FoZWFkKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KERFQlVHX0xPT0tBSEVBRCwgZGVidWdMb29rYWhlYWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBERUJVR19UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBkZWJ1Z1Rva2VuTWFuYWdlciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVndG9rZW5tYW5hZ2VyKGJvb2xlYW4gZGVidWdUb2tlbk1hbmFnZXIpIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoREVCVUdfVE9LRU5fTUFOQUdFUiwgZGVidWdUb2tlbk1hbmFnZXIgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBPUFRJTUlaRV9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBvcHRpbWl6ZVRva2VuTWFuYWdlciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9wdGltaXpldG9rZW5tYW5hZ2VyKGJvb2xlYW4gb3B0aW1pemVUb2tlbk1hbmFnZXIpIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVUb2tlbk1hbmFnZXIgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBFUlJPUl9SRVBPUlRJTkcgZ3JhbW1hciBvcHRpb24uCisgICAgICogQHBhcmFtIGVycm9yUmVwb3J0aW5nIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JyZXBvcnRpbmcoYm9vbGVhbiBlcnJvclJlcG9ydGluZykgeworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChFUlJPUl9SRVBPUlRJTkcsIGVycm9yUmVwb3J0aW5nID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgSkFWQV9VTklDT0RFX0VTQ0FQRSBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gamF2YVVuaWNvZGVFc2NhcGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhdW5pY29kZWVzY2FwZShib29sZWFuIGphdmFVbmljb2RlRXNjYXBlKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KEpBVkFfVU5JQ09ERV9FU0NBUEUsIGphdmFVbmljb2RlRXNjYXBlID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgVU5JQ09ERV9JTlBVVCBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gdW5pY29kZUlucHV0IGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5pY29kZWlucHV0KGJvb2xlYW4gdW5pY29kZUlucHV0KSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KFVOSUNPREVfSU5QVVQsIHVuaWNvZGVJbnB1dCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIElHTk9SRV9DQVNFIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlY2FzZShib29sZWFuIGlnbm9yZUNhc2UpIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoSUdOT1JFX0NBU0UsIGlnbm9yZUNhc2UgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBDT01NT05fVE9LRU5fQUNUSU9OIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBjb21tb25Ub2tlbkFjdGlvbiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1vbnRva2VuYWN0aW9uKGJvb2xlYW4gY29tbW9uVG9rZW5BY3Rpb24pIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoQ09NTU9OX1RPS0VOX0FDVElPTiwgY29tbW9uVG9rZW5BY3Rpb24gPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBVU0VSX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uCisgICAgICogQHBhcmFtIHVzZXJUb2tlbk1hbmFnZXIgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VydG9rZW5tYW5hZ2VyKGJvb2xlYW4gdXNlclRva2VuTWFuYWdlcikgeworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChVU0VSX1RPS0VOX01BTkFHRVIsIHVzZXJUb2tlbk1hbmFnZXIgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBVU0VSX0NIQVJfU1RSRUFNIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSB1c2VyQ2hhclN0cmVhbSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJjaGFyc3RyZWFtKGJvb2xlYW4gdXNlckNoYXJTdHJlYW0pIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoVVNFUl9DSEFSX1NUUkVBTSwgdXNlckNoYXJTdHJlYW0gPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBCVUlMRF9QQVJTRVIgZ3JhbW1hciBvcHRpb24uCisgICAgICogQHBhcmFtIGJ1aWxkUGFyc2VyIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVpbGRwYXJzZXIoYm9vbGVhbiBidWlsZFBhcnNlcikgeworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChCVUlMRF9QQVJTRVIsIGJ1aWxkUGFyc2VyID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgQlVJTERfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVpbGRUb2tlbk1hbmFnZXIgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZHRva2VubWFuYWdlcihib29sZWFuIGJ1aWxkVG9rZW5NYW5hZ2VyKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KEJVSUxEX1RPS0VOX01BTkFHRVIsIGJ1aWxkVG9rZW5NYW5hZ2VyID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgU0FOSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBzYW5pdHlDaGVjayBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNhbml0eWNoZWNrKGJvb2xlYW4gc2FuaXR5Q2hlY2spIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoU0FOSVRZX0NIRUNLLCBzYW5pdHlDaGVjayA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEZPUkNFX0xBX0NIRUNLIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBmb3JjZUxBQ2hlY2sgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZWxhY2hlY2soYm9vbGVhbiBmb3JjZUxBQ2hlY2spIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoRk9SQ0VfTEFfQ0hFQ0ssIGZvcmNlTEFDaGVjayA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIENBQ0hFX1RPS0VOUyBncmFtbWFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gY2FjaGVUb2tlbnMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZXRva2Vucyhib29sZWFuIGNhY2hlVG9rZW5zKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KENBQ0hFX1RPS0VOUywgY2FjaGVUb2tlbnMgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBLRUVQX0xJTkVfQ09MVU1OIGdyYW1tYXIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBrZWVwTGluZUNvbHVtbiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBsaW5lY29sdW1uKGJvb2xlYW4ga2VlcExpbmVDb2x1bW4pIHsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoS0VFUF9MSU5FX0NPTFVNTiwga2VlcExpbmVDb2x1bW4gPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBKREtfVkVSU0lPTiBvcHRpb24uCisgICAgICogQHBhcmFtIGpka1ZlcnNpb24gdGhlIHZlcnNpb24gdG8gdXNlLgorICAgICAqIEBzaW5jZSBBbnQxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKREt2ZXJzaW9uKFN0cmluZyBqZGtWZXJzaW9uKSB7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KEpES19WRVJTSU9OLCBqZGtWZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8uCisgICAgICogSWYgbm90IHNldCwgdGhlIGZpbGVzIGFyZSB3cml0dGVuIHRvIHRoZSBkaXJlY3RvcnkKKyAgICAgKiBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuCisgICAgICogQHBhcmFtIG91dHB1dERpcmVjdG9yeSB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRkaXJlY3RvcnkoRmlsZSBvdXRwdXREaXJlY3RvcnkpIHsKKyAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLgorICAgICAqIEBwYXJhbSB0YXJnZXRGaWxlIHRoZSBncmFtbWFyIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KEZpbGUgdGFyZ2V0RmlsZSkgeworICAgICAgICB0aGlzLnRhcmdldEZpbGUgPSB0YXJnZXRGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSmF2YUNDIGRpc3RyaWJ1dGlvbi4KKyAgICAgKiBAcGFyYW0gamF2YWNjSG9tZSB0aGUgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEphdmFjY2hvbWUoRmlsZSBqYXZhY2NIb21lKSB7CisgICAgICAgIHRoaXMuamF2YWNjSG9tZSA9IGphdmFjY0hvbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgSmF2YUNDKCkgeworICAgICAgICBjbWRsLnNldFZtKEphdmFFbnZVdGlscy5nZXRKcmVFeGVjdXRhYmxlKCJqYXZhIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIGxvYWQgY29tbWFuZCBsaW5lIHdpdGggb3B0aW9uYWwgYXR0cmlidXRlcworICAgICAgICBFbnVtZXJhdGlvbiBpdGVyID0gb3B0aW9uYWxBdHRycy5rZXlzKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSAgPSAoU3RyaW5nKSBpdGVyLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvcHRpb25hbEF0dHJzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGNtZGwuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLSIgKyBuYW1lICsgIjoiICsgdmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0aGUgdGFyZ2V0IGlzIGEgZmlsZQorICAgICAgICBpZiAodGFyZ2V0RmlsZSA9PSBudWxsIHx8ICF0YXJnZXRGaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgdGFyZ2V0OiAiICsgdGFyZ2V0RmlsZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0YXJnZXQgYXMgdGhlIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgICAgaWYgKG91dHB1dERpcmVjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRwdXREaXJlY3RvcnkgPSBuZXcgRmlsZSh0YXJnZXRGaWxlLmdldFBhcmVudCgpKTsKKyAgICAgICAgfSBlbHNlIGlmICghb3V0cHV0RGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT3V0cHV0ZGlyIG5vdCBhIGRpcmVjdG9yeS4iKTsKKyAgICAgICAgfQorICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1PVVRQVVRfRElSRUNUT1JZOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAvLyBkZXRlcm1pbmUgaWYgdGhlIGdlbmVyYXRlZCBqYXZhIGZpbGUgaXMgdXAtdG8tZGF0ZQorICAgICAgICBmaW5hbCBGaWxlIGphdmFGaWxlID0gZ2V0T3V0cHV0SmF2YUZpbGUob3V0cHV0RGlyZWN0b3J5LCB0YXJnZXRGaWxlKTsKKyAgICAgICAgaWYgKGphdmFGaWxlLmV4aXN0cygpICYmIHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgPCBqYXZhRmlsZS5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgbG9nKCJUYXJnZXQgaXMgYWxyZWFkeSBidWlsdCAtIHNraXBwaW5nICgiICsgdGFyZ2V0RmlsZSArICIpIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY21kbC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIGZpbmFsIFBhdGggY2xhc3NwYXRoID0gY21kbC5jcmVhdGVDbGFzc3BhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgZmluYWwgRmlsZSBqYXZhY2NKYXIgPSBKYXZhQ0MuZ2V0QXJjaGl2ZUZpbGUoamF2YWNjSG9tZSk7CisgICAgICAgIGNsYXNzcGF0aC5jcmVhdGVQYXRoRWxlbWVudCgpLnNldFBhdGgoamF2YWNjSmFyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgY2xhc3NwYXRoLmFkZEphdmFSdW50aW1lKCk7CisKKyAgICAgICAgY21kbC5zZXRDbGFzc25hbWUoSmF2YUNDLmdldE1haW5DbGFzcyhjbGFzc3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUNDLlRBU0tERUZfVFlQRV9KQVZBQ0MpKTsKKworICAgICAgICBmaW5hbCBDb21tYW5kbGluZS5Bcmd1bWVudCBhcmcgPSBjbWRsLmNyZWF0ZVZtQXJndW1lbnQoKTsKKyAgICAgICAgYXJnLnNldFZhbHVlKCItbXgxNDBNIik7CisgICAgICAgIGFyZy5zZXRWYWx1ZSgiLURpbnN0YWxsLnJvb3Q9IiArIGphdmFjY0hvbWUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIEV4ZWN1dGUucnVuQ29tbWFuZCh0aGlzLCBjbWRsLmdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgdGhlIHBhdGggdXNlZCB0byBzdG9yZSB0aGUgSmF2YUNDLnppcAorICAgICAqIG9yIGphdmFjYy5qYXIgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdmVyc2lvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9tZSB0aGUgamF2YWNjIGhvbWUgcGF0aCBkaXJlY3RvcnkuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGhvbWUgZGlyZWN0b3J5IGlzIGludmFsaWQKKyAgICAgKiBvciBpZiB0aGUgYXJjaGl2ZSBjb3VsZCBub3QgYmUgZm91bmQgZGVzcGl0ZSBhdHRlbXB0cyB0byBkbyBzby4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIG9iamVjdCBwb2ludGluZyB0byB0aGUgSmF2YUNDIGFyY2hpdmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBGaWxlIGdldEFyY2hpdmVGaWxlKEZpbGUgaG9tZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGhvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBUkNISVZFX0xPQ0FUSU9OU1tnZXRBcmNoaXZlTG9jYXRpb25JbmRleChob21lKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgbWFpbiBjbGFzcyB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB2ZXJzaW9ucy4KKyAgICAgKiBAcGFyYW0gaG9tZSB0aGUgamF2YWNjIGhvbWUgcGF0aCBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHRhc2tkZWYuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGhvbWUgZGlyZWN0b3J5IGlzIGludmFsaWQKKyAgICAgKiBvciBpZiB0aGUgYXJjaGl2ZSBjb3VsZCBub3QgYmUgZm91bmQgZGVzcGl0ZSBhdHRlbXB0cyB0byBkbyBzby4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYWluIGNsYXNzIGZvciB0aGUgdGFza2RlZi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRNYWluQ2xhc3MoRmlsZSBob21lLCBpbnQgdHlwZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChudWxsKTsKKyAgICAgICAgcC5jcmVhdGVQYXRoRWxlbWVudCgpLnNldExvY2F0aW9uKGdldEFyY2hpdmVGaWxlKGhvbWUpKTsKKyAgICAgICAgcC5hZGRKYXZhUnVudGltZSgpOworICAgICAgICByZXR1cm4gZ2V0TWFpbkNsYXNzKHAsIHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgbWFpbiBjbGFzcyB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB2ZXJzaW9ucy4KKyAgICAgKiBAcGFyYW0gcGF0aCBjbGFzc3BhdGggdG8gc2VhcmNoIGluLgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0YXNrZGVmLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBob21lIGRpcmVjdG9yeSBpcyBpbnZhbGlkCisgICAgICogb3IgaWYgdGhlIGFyY2hpdmUgY291bGQgbm90IGJlIGZvdW5kIGRlc3BpdGUgYXR0ZW1wdHMgdG8gZG8gc28uCisgICAgICogQHJldHVybiB0aGUgbWFpbiBjbGFzcyBmb3IgdGhlIHRhc2tkZWYuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRNYWluQ2xhc3MoUGF0aCBwYXRoLCBpbnQgdHlwZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VQcmVmaXggPSBudWxsOworICAgICAgICBTdHJpbmcgbWFpbkNsYXNzID0gbnVsbDsKKworICAgICAgICBBbnRDbGFzc0xvYWRlciBsID0gbmV3IEFudENsYXNzTG9hZGVyKCk7CisgICAgICAgIGwuc2V0Q2xhc3NQYXRoKHBhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKSk7CisgICAgICAgIFN0cmluZyBqYXZhY2NDbGFzcyA9IENPTV9QQUNLQUdFICsgQ09NX0pBVkFDQ19DTEFTUzsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBsLmdldFJlc291cmNlQXNTdHJlYW0oamF2YWNjQ2xhc3MucmVwbGFjZSgnLicsICcvJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmNsYXNzIik7CisgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWNrYWdlUHJlZml4ID0gQ09NX1BBQ0tBR0U7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVEFTS0RFRl9UWVBFX0pBVkFDQzoKKyAgICAgICAgICAgICAgICBtYWluQ2xhc3MgPSBDT01fSkFWQUNDX0NMQVNTOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVEFTS0RFRl9UWVBFX0pKVFJFRToKKyAgICAgICAgICAgICAgICBtYWluQ2xhc3MgPSBDT01fSkpUUkVFX0NMQVNTOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVEFTS0RFRl9UWVBFX0pKRE9DOgorICAgICAgICAgICAgICAgIG1haW5DbGFzcyA9IENPTV9KSkRPQ19DTEFTUzsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBGYWxsIFRocm91Z2gKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGphdmFjY0NsYXNzID0gT1JHX1BBQ0tBR0VfM18xICsgT1JHX0pBVkFDQ19DTEFTUzsKKyAgICAgICAgICAgIGlzID0gbC5nZXRSZXNvdXJjZUFzU3RyZWFtKGphdmFjY0NsYXNzLnJlcGxhY2UoJy4nLCAnLycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuY2xhc3MiKTsKKyAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFja2FnZVByZWZpeCA9IE9SR19QQUNLQUdFXzNfMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamF2YWNjQ2xhc3MgPSBPUkdfUEFDS0FHRV8zXzAgKyBPUkdfSkFWQUNDX0NMQVNTOworICAgICAgICAgICAgICAgIGlzID0gbC5nZXRSZXNvdXJjZUFzU3RyZWFtKGphdmFjY0NsYXNzLnJlcGxhY2UoJy4nLCAnLycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmNsYXNzIik7CisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZVByZWZpeCA9IE9SR19QQUNLQUdFXzNfMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUQVNLREVGX1RZUEVfSkFWQUNDOgorICAgICAgICAgICAgICAgICAgICBtYWluQ2xhc3MgPSBPUkdfSkFWQUNDX0NMQVNTOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRBU0tERUZfVFlQRV9KSlRSRUU6CisgICAgICAgICAgICAgICAgICAgIG1haW5DbGFzcyA9IE9SR19KSlRSRUVfQ0xBU1M7CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRBU0tERUZfVFlQRV9KSkRPQzoKKyAgICAgICAgICAgICAgICAgICAgbWFpbkNsYXNzID0gT1JHX0pKRE9DX0NMQVNTOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIEZhbGwgVGhyb3VnaAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWNrYWdlUHJlZml4ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmFpbGVkIHRvIGxvYWQgSmF2YUNDIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1haW5DbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInVua25vd24gdGFzayB0eXBlICIgKyB0eXBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja2FnZVByZWZpeCArIG1haW5DbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgYXJjaGl2ZSBsb2NhdGlvbiBpbmRleC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob21lIHRoZSBqYXZhY2MgaG9tZSBwYXRoIGRpcmVjdG9yeS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgaW52YWxpZAorICAgICAqIG9yIGlmIHRoZSBhcmNoaXZlIGNvdWxkIG5vdCBiZSBmb3VuZCBkZXNwaXRlIGF0dGVtcHRzIHRvIGRvIHNvLgorICAgICAqIEByZXR1cm4gdGhlIGFyY2hpdmUgbG9jYXRpb24gaW5kZXgKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0QXJjaGl2ZUxvY2F0aW9uSW5kZXgoRmlsZSBob21lKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIGlmIChob21lID09IG51bGwgfHwgIWhvbWUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJKYXZhQ0MgaG9tZSBtdXN0IGJlIGEgdmFsaWQgZGlyZWN0b3J5LiIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBUkNISVZFX0xPQ0FUSU9OUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoaG9tZSwgQVJDSElWRV9MT0NBVElPTlNbaV0pOworCisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBhIHBhdGggdG8gSmF2YUNDLnppcCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvciBqYXZhY2MuamFyIGZyb20gJyIgKyBob21lICsgIicuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyIG9mIEphdmFDQy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob21lIHRoZSBqYXZhY2MgaG9tZSBwYXRoIGRpcmVjdG9yeS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgaW52YWxpZAorICAgICAqIG9yIGlmIHRoZSBhcmNoaXZlIGNvdWxkIG5vdCBiZSBmb3VuZCBkZXNwaXRlIGF0dGVtcHRzIHRvIGRvIHNvLgorICAgICAqIEByZXR1cm4gYSB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRNYWpvclZlcnNpb25OdW1iZXIoRmlsZSBob21lKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHJldHVybgorICAgICAgICAgICAgQVJDSElWRV9MT0NBVElPTlNfVlNfTUFKT1JfVkVSU0lPTltnZXRBcmNoaXZlTG9jYXRpb25JbmRleChob21lKV07CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB0aGUgb3V0cHV0IEphdmEgZmlsZSB0byBiZSBnZW5lcmF0ZWQgYnkgdGhlIGdpdmVuIGdyYW1tYXIKKyAgICAgKiBmaWxlLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGdldE91dHB1dEphdmFGaWxlKEZpbGUgb3V0cHV0ZGlyLCBGaWxlIHNyY2ZpbGUpIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBzcmNmaWxlLmdldFBhdGgoKTsKKworICAgICAgICAvLyBFeHRyYWN0IGZpbGUncyBiYXNlLW5hbWUKKyAgICAgICAgaW50IHN0YXJ0QmFzZW5hbWUgPSBwYXRoLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgaWYgKHN0YXJ0QmFzZW5hbWUgIT0gLTEpIHsKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhzdGFydEJhc2VuYW1lICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBsYWNlIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uIHdpdGggJy5qYXZhJworICAgICAgICBpbnQgc3RhcnRFeHRuID0gcGF0aC5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAoc3RhcnRFeHRuICE9IC0xKSB7CisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgc3RhcnRFeHRuKSArICIuamF2YSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRoICs9ICIuamF2YSI7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGFuZ2UgdGhlIGRpcmVjdG9yeQorICAgICAgICBpZiAob3V0cHV0ZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGggPSBvdXRwdXRkaXIgKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEZpbGUocGF0aCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvSmF2YWhBZGFwdGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9KYXZhaEFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFmYTQyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvSmF2YWhBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFoOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuSmF2YWg7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBkaWZmZXJlbnQgYmFja2VuZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIEphdmFoIHRhc2suCisgKgorICogQHNpbmNlIEFudCAxLjYuMworICovCitwdWJsaWMgaW50ZXJmYWNlIEphdmFoQWRhcHRlciB7CisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGFjdHVhbCBjb21waWxhdGlvbi4KKyAgICAgKiBAcGFyYW0gamF2YWggdGhlIGNhbGxpbmcgamF2YWggdGFzay4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIGJvb2xlYW4gY29tcGlsZShKYXZhaCBqYXZhaCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvSmF2YWhBZGFwdGVyRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvSmF2YWhBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkM2FhODcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9KYXZhaEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhaDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5DbGFzc3BhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKKworLyoqCisgKiBDcmVhdGVzIHRoZSBKYXZhaEFkYXB0ZXIgYmFzZWQgb24gdGhlIHVzZXIgY2hvaWNlIGFuZAorICogcG90ZW50aWFsbHkgdGhlIFZNIHZlbmRvci4KKyAqCisgKiBAc2luY2UgQW50IDEuNi4zCisgKi8KKy8vIENoZWNrU3R5bGU6SGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yQ2hlY2sgT0ZGIChiYykKK3B1YmxpYyBjbGFzcyBKYXZhaEFkYXB0ZXJGYWN0b3J5IHsKKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgdGhlIGRlZmF1bHQgY2hvaWNlIG9mIGFkYXB0ZXIgYmFzZWQgb24gdGhlIFZNCisgICAgICogdmVuZG9yLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBjaG9pY2Ugb2YgYWRhcHRlciBiYXNlZCBvbiB0aGUgVk0KKyAgICAgKiB2ZW5kb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0KCkgeworICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzS2FmZmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIEthZmZlaC5JTVBMRU1FTlRBVElPTl9OQU1FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdW5KYXZhaC5JTVBMRU1FTlRBVElPTl9OQU1FOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIEphdmFoQWRhcHRlciBiYXNlZCBvbiB0aGUgdXNlciBjaG9pY2UgYW5kCisgICAgICogcG90ZW50aWFsbHkgdGhlIFZNIHZlbmRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaG9pY2UgdGhlIHVzZXIgY2hvaWNlIChpZiBhbnkpLgorICAgICAqIEBwYXJhbSBsb2cgYSBQcm9qZWN0Q29tcG9uZW50IGluc3RhbmNlIHVzZWQgdG8gYWNjZXNzIEFudCdzCisgICAgICogbG9nZ2luZyBzeXN0ZW0uCisgICAgICogQHJldHVybiBUaGUgYWRhcHRlciB0byB1c2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEphdmFoQWRhcHRlciBnZXRBZGFwdGVyKFN0cmluZyBjaG9pY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Q29tcG9uZW50IGxvZykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKChKYXZhRW52VXRpbHMuaXNLYWZmZSgpICYmIGNob2ljZSA9PSBudWxsKQorICAgICAgICAgICAgfHwgS2FmZmVoLklNUExFTUVOVEFUSU9OX05BTUUuZXF1YWxzKGNob2ljZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgS2FmZmVoKCk7CisgICAgICAgIH0gZWxzZSBpZiAoU3VuSmF2YWguSU1QTEVNRU5UQVRJT05fTkFNRS5lcXVhbHMoY2hvaWNlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdW5KYXZhaCgpOworICAgICAgICB9IGVsc2UgaWYgKGNob2ljZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUNsYXNzTmFtZShjaG9pY2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBkZWZhdWx0IGhhcyBiZWVuIGdvb2QgZW5vdWdoIHVudGlsIEFudCAxLjYuMywgc28gc3RpY2sKKyAgICAgICAgLy8gd2l0aCBpdAorICAgICAgICByZXR1cm4gbmV3IFN1bkphdmFoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gcmVzb2x2ZSB0aGUgZ2l2ZW4gY2xhc3NuYW1lIGludG8gYSBqYXZhaCBhZGFwdGVyLgorICAgICAqIFRocm93cyBhIGZpdCBpZiBpdCBjYW4ndC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgdG8gYmUgY3JlYXRlZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIFRoaXMgaXMgdGhlIGZpdCB0aGF0IGlzIHRocm93biBpZiBjbGFzc05hbWUKKyAgICAgKiBpc24ndCBhbiBpbnN0YW5jZSBvZiBKYXZhaEFkYXB0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSmF2YWhBZGFwdGVyIHJlc29sdmVDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoSmF2YWhBZGFwdGVyKSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZShjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgSmF2YWhBZGFwdGVyRmFjdG9yeS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLCBKYXZhaEFkYXB0ZXIuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL0thZmZlaC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvS2FmZmVoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3Zjc3MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL0thZmZlaC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamF2YWg7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkphdmFoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CisKKy8qKgorICogQWRhcHRlciB0byB0aGUgbmF0aXZlIGthZmZlaCBjb21waWxlci4KKyAqCisgKiBAc2luY2UgQW50IDEuNi4zCisgKi8KK3B1YmxpYyBjbGFzcyBLYWZmZWggaW1wbGVtZW50cyBKYXZhaEFkYXB0ZXIgeworCisgICAgLyoqIHRoZSBuYW1lIG9mIHRoZSBqYXZhaCBhZGFwdGVyIC0ga2FmZmVoICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fTkFNRSA9ICJrYWZmZWgiOworCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGFjdHVhbCBjb21waWxhdGlvbi4KKyAgICAgKiBAcGFyYW0gamF2YWggdGhlIGNhbGxpbmcgamF2YWggdGFzay4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbXBpbGUoSmF2YWggamF2YWgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwS2FmZmVoQ29tbWFuZChqYXZhaCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRlLnJ1bkNvbW1hbmQoamF2YWgsIGNtZC5nZXRDb21tYW5kbGluZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUiKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgc2V0dXBLYWZmZWhDb21tYW5kKEphdmFoIGphdmFoKSB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZShKYXZhRW52VXRpbHMuZ2V0SmRrRXhlY3V0YWJsZSgia2FmZmVoIikpOworCisgICAgICAgIGlmIChqYXZhaC5nZXREZXN0ZGlyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGphdmFoLmdldERlc3RkaXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoamF2YWguZ2V0T3V0cHV0ZmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbyIpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShqYXZhaC5nZXRPdXRwdXRmaWxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgUGF0aCBjcCA9IG5ldyBQYXRoKGphdmFoLmdldFByb2plY3QoKSk7CisgICAgICAgIGlmIChqYXZhaC5nZXRCb290Y2xhc3NwYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY3AuYXBwZW5kKGphdmFoLmdldEJvb3RjbGFzc3BhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgY3AgPSBjcC5jb25jYXRTeXN0ZW1Cb290Q2xhc3NwYXRoKCJpZ25vcmUiKTsKKyAgICAgICAgaWYgKGphdmFoLmdldENsYXNzcGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNwLmFwcGVuZChqYXZhaC5nZXRDbGFzc3BhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNwLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItY2xhc3NwYXRoIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGNwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghamF2YWguZ2V0T2xkKCkpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItam5pIik7CisgICAgICAgIH0KKworICAgICAgICBjbWQuYWRkQXJndW1lbnRzKGphdmFoLmdldEN1cnJlbnRBcmdzKCkpOworCisgICAgICAgIGphdmFoLmxvZ0FuZEFkZEZpbGVzKGNtZCk7CisgICAgICAgIHJldHVybiBjbWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9TdW5KYXZhaC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvU3VuSmF2YWguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE2NTVhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvU3VuSmF2YWguamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhaDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5Mb2NhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVKYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkphdmFoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKKworLyoqCisgKiBBZGFwdGVyIHRvIGNvbS5zdW4udG9vbHMuamF2YWgub2xkamF2YWguTWFpbiBvciBjb20uc3VuLnRvb2xzLmphdmFoLk1haW4uCisgKgorICogQHNpbmNlIEFudCAxLjYuMworICovCitwdWJsaWMgY2xhc3MgU3VuSmF2YWggaW1wbGVtZW50cyBKYXZhaEFkYXB0ZXIgeworCisgICAgLyoqIHRoZSBuYW1lIG9mIHRoZSBqYXZhaCBhZGFwdGVyIC0gc3VuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fTkFNRSA9ICJzdW4iOworCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGFjdHVhbCBjb21waWxhdGlvbi4KKyAgICAgKiBAcGFyYW0gamF2YWggdGhlIGNhbGxpbmcgamF2YWggdGFzay4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbXBpbGUoSmF2YWggamF2YWgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwSmF2YWhDb21tYW5kKGphdmFoKTsKKyAgICAgICAgRXhlY3V0ZUphdmEgZWogPSBuZXcgRXhlY3V0ZUphdmEoKTsKKyAgICAgICAgQ2xhc3MgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGZpcnN0IHNlYXJjaCBmb3IgdGhlICJvbGQiIGphdmFoIGNsYXNzIGluIDEuNC4yIHRvb2xzLmphcgorICAgICAgICAgICAgICAgIGMgPSBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnRvb2xzLmphdmFoLm9sZGphdmFoLk1haW4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBvbGRlciB0aGFuIDEuNC4yIHRvb2xzLmphcgorICAgICAgICAgICAgICAgIGMgPSBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnRvb2xzLmphdmFoLk1haW4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDYW4ndCBsb2FkIGphdmFoIiwgZXgsIGphdmFoLmdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGNtZC5zZXRFeGVjdXRhYmxlKGMuZ2V0TmFtZSgpKTsKKyAgICAgICAgZWouc2V0SmF2YUNvbW1hbmQoY21kKTsKKyAgICAgICAgRmlsZSBmID0gTG9jYXRvci5nZXRDbGFzc1NvdXJjZShjKTsKKyAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgZWouc2V0Q2xhc3NwYXRoKG5ldyBQYXRoKGphdmFoLmdldFByb2plY3QoKSwgZi5nZXRQYXRoKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZWouZm9yayhqYXZhaCkgPT0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbW1hbmRsaW5lIHNldHVwSmF2YWhDb21tYW5kKEphdmFoIGphdmFoKSB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworCisgICAgICAgIGlmIChqYXZhaC5nZXREZXN0ZGlyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGphdmFoLmdldERlc3RkaXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoamF2YWguZ2V0T3V0cHV0ZmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbyIpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShqYXZhaC5nZXRPdXRwdXRmaWxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGphdmFoLmdldENsYXNzcGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItY2xhc3NwYXRoIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGphdmFoLmdldENsYXNzcGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqYXZhaC5nZXRWZXJib3NlKCkpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdmVyYm9zZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChqYXZhaC5nZXRPbGQoKSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1vbGQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoamF2YWguZ2V0Rm9yY2UoKSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1mb3JjZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChqYXZhaC5nZXRTdHVicygpICYmICFqYXZhaC5nZXRPbGQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJzdHVicyBvbmx5IGF2YWlsYWJsZSBpbiBvbGQgbW9kZS4iLCBqYXZhaC5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqYXZhaC5nZXRTdHVicygpKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXN0dWJzIik7CisgICAgICAgIH0KKyAgICAgICAgUGF0aCBiY3AgPSBuZXcgUGF0aChqYXZhaC5nZXRQcm9qZWN0KCkpOworICAgICAgICBpZiAoamF2YWguZ2V0Qm9vdGNsYXNzcGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJjcC5hcHBlbmQoamF2YWguZ2V0Qm9vdGNsYXNzcGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBiY3AgPSBiY3AuY29uY2F0U3lzdGVtQm9vdENsYXNzcGF0aCgiaWdub3JlIik7CisgICAgICAgIGlmIChiY3Auc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ib290Y2xhc3NwYXRoIik7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGJjcCk7CisgICAgICAgIH0KKworICAgICAgICBjbWQuYWRkQXJndW1lbnRzKGphdmFoLmdldEN1cnJlbnRBcmdzKCkpOworCisgICAgICAgIGphdmFoLmxvZ0FuZEFkZEZpbGVzKGNtZCk7CisgICAgICAgIHJldHVybiBjbWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qZGVwZW5kL0pEZXBlbmRUYXNrLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qZGVwZW5kL0pEZXBlbmRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2NTQ3MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvSkRlcGVuZFRhc2suamF2YQpAQCAtMCwwICsxLDY3OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpkZXBlbmQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVdhdGNoZG9nOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ1N0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmVKYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkxvYWRlclV0aWxzOworCisvKioKKyAqIFJ1bnMgSkRlcGVuZCB0ZXN0cy4KKyAqCisgKiA8cD5KRGVwZW5kIGlzIGEgdG9vbCB0byBnZW5lcmF0ZSBkZXNpZ24gcXVhbGl0eSBtZXRyaWNzIGZvciBlYWNoIEphdmEgcGFja2FnZS4KKyAqIEl0IGhhcyBiZWVuIGluaXRpYWxseSBjcmVhdGVkIGJ5IE1pa2UgQ2xhcmsuIEpEZXBlbmQgY2FuIGJlIGZvdW5kIGF0IDxhCisgKiBocmVmPSJodHRwOi8vd3d3LmNsYXJrd2FyZS5jb20vc29mdHdhcmUvSkRlcGVuZC5odG1sIj5odHRwOi8vd3d3LmNsYXJrd2FyZS5jb20vc29mdHdhcmUvSkRlcGVuZC5odG1sPC9hPi4KKyAqCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBzcGF3biBhIG5ldyBKYXZhIFZNLgorICoKKyAqLworcHVibGljIGNsYXNzIEpEZXBlbmRUYXNrIGV4dGVuZHMgVGFzayB7CisgICAgLy9wcml2YXRlIENvbW1hbmRsaW5lSmF2YSBjb21tYW5kbGluZSA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsKKworICAgIC8vIHJlcXVpcmVkIGF0dHJpYnV0ZXMKKyAgICBwcml2YXRlIFBhdGggc291cmNlc1BhdGg7IC8vIERlcHJlY2F0ZWQhCisgICAgcHJpdmF0ZSBQYXRoIGNsYXNzZXNQYXRoOyAvLyBVc2UgdGhpcyBnb2luZyBmb3J3YXJkCisKKyAgICAvLyBvcHRpb25hbCBhdHRyaWJ1dGVzCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dEZpbGU7CisgICAgcHJpdmF0ZSBGaWxlIGRpcjsKKyAgICBwcml2YXRlIFBhdGggY29tcGlsZUNsYXNzcGF0aDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFsdG9uZXJyb3IgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZm9yayA9IGZhbHNlOworICAgIHByaXZhdGUgTG9uZyB0aW1lb3V0ID0gbnVsbDsKKworICAgIHByaXZhdGUgU3RyaW5nIGp2bSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0ID0gInRleHQiOworICAgIHByaXZhdGUgUGF0dGVyblNldCBkZWZhdWx0UGF0dGVybnMgPSBuZXcgUGF0dGVyblNldCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3IgcGFja2FnZUZpbHRlckM7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIHNldEZpbHRlcjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlUnVudGltZSA9IGZhbHNlOworICAgIHByaXZhdGUgUGF0aCBydW50aW1lQ2xhc3NlcyA9IG51bGw7CisKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgcGFja2FnZUZpbHRlciA9CisgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamRlcGVuZC5mcmFtZXdvcmsuUGFja2FnZUZpbHRlciIpOworICAgICAgICAgICAgcGFja2FnZUZpbHRlckMgPQorICAgICAgICAgICAgICAgIHBhY2thZ2VGaWx0ZXIuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge2phdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzfSk7CisgICAgICAgICAgICBzZXRGaWx0ZXIgPQorICAgICAgICAgICAgICAgIGpkZXBlbmQudGV4dHVpLkpEZXBlbmQuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoInNldEZpbHRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7cGFja2FnZUZpbHRlcn0pOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgaWYgKHNldEZpbHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFja2FnZUZpbHRlckMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwKKyAgICAgKiAgaW5jbHVkZSBqZGVwZW5kLmphciBpbiB0aGUgZm9ya2VkIFZNLgorICAgICAqCisgICAgICogQHBhcmFtIGIgaW5jbHVkZSBhbnQgcnVuIHRpbWUgeWVzIG9yIG5vCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcnVudGltZShib29sZWFuIGIpIHsKKyAgICAgICAgaW5jbHVkZVJ1bnRpbWUgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGltZW91dCB2YWx1ZSAoaW4gbWlsbGlzZWNvbmRzKS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBvcGVyYXRpb24gaXMgcnVubmluZyBmb3IgbW9yZSB0aGFuIHRoaXMgdmFsdWUsIHRoZSBqZGVwZW5kCisgICAgICogd2lsbCBiZSBjYW5jZWxlZC4gKHdvcmtzIG9ubHkgd2hlbiBpbiAnZm9yaycgbW9kZSkuPC9wPgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbWF4aW11bSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGFsbG93ZWQgYmVmb3JlCisgICAgICogZGVjbGFyaW5nIHRoZSB0ZXN0IGFzICd0aW1lZC1vdXQnCisgICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoTG9uZyB2YWx1ZSkgeworICAgICAgICB0aW1lb3V0ID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdGltZW91dCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBMb25nIGdldFRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiB0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvdXRwdXQgZmlsZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dEZpbGUgdGhlIG91dHB1dCBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlKEZpbGUgb3V0cHV0RmlsZSkgeworICAgICAgICB0aGlzLm91dHB1dEZpbGUgPSBvdXRwdXRGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRPdXRwdXRGaWxlKCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byBoYWx0IG9uIGZhaWx1cmUuIERlZmF1bHQ6IGZhbHNlLgorICAgICAqIEBwYXJhbSBoYWx0b25lcnJvciB0aGUgdmFsdWUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFsdG9uZXJyb3IoYm9vbGVhbiBoYWx0b25lcnJvcikgeworICAgICAgICB0aGlzLmhhbHRvbmVycm9yID0gaGFsdG9uZXJyb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGhhbHRvbmVycm9yIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEhhbHRvbmVycm9yKCkgeworICAgICAgICByZXR1cm4gaGFsdG9uZXJyb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZm9ya3MgaW50byBhIG5ldyBKVk0uIERlZmF1bHQ6IGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtICAgdmFsdWUgICA8dHQ+dHJ1ZTwvdHQ+IGlmIGEgSlZNIHNob3VsZCBiZSBmb3JrZWQsCisgICAgICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPHR0PmZhbHNlPHR0PgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmsoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBmb3JrID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZvcmsgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yaygpIHsKKyAgICAgICAgcmV0dXJuIGZvcms7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNvbW1hbmQgdXNlZCB0byBpbnZva2UgYSBmb3JrZWQgSmF2YSBWaXJ0dWFsIE1hY2hpbmUuCisgICAgICoKKyAgICAgKiBEZWZhdWx0IGlzIDx0dD5qYXZhPC90dD4uIElnbm9yZWQgaWYgbm8gSlZNIGlzIGZvcmtlZC4KKyAgICAgKiBAcGFyYW0gICB2YWx1ZSAgIHRoZSBuZXcgVk0gdG8gdXNlIGluc3RlYWQgb2YgPHR0PmphdmE8L3R0PgorICAgICAqIEBzZWUgI3NldEZvcmsoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKdm0oU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGp2bSA9IHZhbHVlOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhdGggdG8gc291cmNlIGNvZGUgdG8gYW5hbHl6ZS4KKyAgICAgKiBAcmV0dXJuIGEgc291cmNlIHBhdGgKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVTb3VyY2VzcGF0aCgpIHsKKyAgICAgICAgaWYgKHNvdXJjZXNQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZXNQYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc291cmNlc1BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNvdXJjZXBhdGguCisgICAgICogQHJldHVybiB0aGUgc291cmNlcyBwYXRoCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0U291cmNlc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBzb3VyY2VzUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCB0byBjbGFzcyBjb2RlIHRvIGFuYWx5emUuCisgICAgICogQHJldHVybiBhIGNsYXNzZXMgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzZXNwYXRoKCkgeworICAgICAgICBpZiAoY2xhc3Nlc1BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3Nlc1BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc2VzUGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY2xhc3Nlc3BhdGguCisgICAgICogQHJldHVybiB0aGUgY2xhc3NlcyBwYXRoCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Q2xhc3Nlc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjbGFzc2VzUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgVk0gaW4uIElnbm9yZWQgaWYgbm8gSlZNIGlzIGZvcmtlZC4KKyAgICAgKiBAcGFyYW0gICBkaXIgICAgIHRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBKVk0gZnJvbS4KKyAgICAgKiBAc2VlICNzZXRGb3JrKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgZGlyKSB7CisgICAgICAgIHRoaXMuZGlyID0gZGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGRpciBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXREaXIoKSB7CisgICAgICAgIHJldHVybiBkaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIGEgY2xhc3MgcGF0aCB0byBiZSB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGlmIChjb21waWxlQ2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXBpbGVDbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCisgICAgICogQHJldHVybiB0aGUgY2xhc3MgcGF0aCB1c2VkIGZvciBjb21waWxhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVDbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIGEgY2xhc3NwYXRoCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcGlsZUNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEpWTSBhcmd1bWVudC4gSWdub3JlZCBpZiBubyBKVk0gaXMgZm9ya2VkLgorICAgICAqIEBwYXJhbSBjb21tYW5kbGluZSB0aGUgY29tbWFuZGxpbmUgdG8gY3JlYXRlIHRoZSBhcmd1bWVudCBvbgorICAgICAqIEByZXR1cm4gIGNyZWF0ZSBhIG5ldyBKVk0gYXJndW1lbnQgc28gdGhhdCBhbnkgYXJndW1lbnQgY2FuCisgICAgICogICAgICAgICAgYmUgcGFzc2VkIHRvIHRoZSBKVk0uCisgICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBDb21tYW5kbGluZS5Bcmd1bWVudCBjcmVhdGVKdm1hcmcoQ29tbWFuZGxpbmVKYXZhIGNvbW1hbmRsaW5lKSB7CisgICAgICAgIHJldHVybiBjb21tYW5kbGluZS5jcmVhdGVWbUFyZ3VtZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICAgKiBAcGFyYW0gciBhIGNsYXNzcGF0aCByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0CisgICAgICogQHJldHVybiBhIHBhdHRlcm4gZm9yIHRoZSBleGNsdWRlcworICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUV4Y2x1ZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBleGNsdWRlcyBwYXR0ZXJucworICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuU2V0IGdldEV4Y2x1ZGVzKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBmb3JtYXQgdG8gd3JpdGUgdGhlIG91dHB1dCBpbiwgInhtbCIgb3IgInRleHQiLgorICAgICAqCisgICAgICogQHBhcmFtIGVhIHhtbCBvciB0ZXh0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9ybWF0KEZvcm1hdEF0dHJpYnV0ZSBlYSkgeworICAgICAgICBmb3JtYXQgPSBlYS5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2xhc3MgZm9yIHRoZSBlbnVtZXJhdGVkIGF0dHJpYnV0ZSBmb3JtYXQsCisgICAgICogdmFsdWVzIGFyZSB4bWwgYW5kIHRleHQuCisgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtYXRBdHRyaWJ1dGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgW10gZm9ybWF0cyA9IG5ldyBTdHJpbmdbXXsieG1sIiwgInRleHQifTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZm9ybWF0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vIHByb2JsZW1zIHdpdGggdGhpcyB0ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVUNDRVNTID0gMDsKKyAgICAvKioKKyAgICAgKiBBbiBlcnJvciBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JTID0gMTsKKworICAgIC8qKgorICAgICAqIFNlYXJjaCBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGQgdGhlIGRpcmVjdG9yeSBvciBhcmNoaXZlCisgICAgICogdGhhdCBjb250YWlucyBpdCB0byB0aGUgY2xhc3NwYXRoLgorICAgICAqCisgICAgICogPHA+RG9lc24ndCB3b3JrIGZvciBhcmNoaXZlcyBpbiBKREsgMS4xIGFzIHRoZSBVUkwgcmV0dXJuZWQgYnkKKyAgICAgKiBnZXRSZXNvdXJjZSBkb2Vzbid0IGNvbnRhaW4gdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIHRoYXQgb25lIHdhbnRzIHRvIGxvb2t1cAorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZENsYXNzcGF0aEVudHJ5KFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICAvKgorICAgICAgICAgKiBwcmUgQW50IDEuNiB0aGlzIG1ldGhvZCB1c2VkIHRvIGNhbGwgZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZQorICAgICAgICAgKiB3aGlsZSBBbnQgMS42IHdpbGwgY2FsbCBDbGFzc0xvYWRlci5nZXRSZXNvdXJjZSgpLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IENsYXNzLmdldFJlc291cmNlIGV4cGVjdHMgYSBsZWFkaW5nCisgICAgICAgICAqIHNsYXNoIGZvciAiYWJzb2x1dGUiIHJlc291cmNlcyBhbmQgd2lsbCBzdHJpcCBpdCBiZWZvcmUKKyAgICAgICAgICogZGVsZWdhdGluZyB0byBDbGFzc0xvYWRlci5nZXRSZXNvdXJjZSAtIHNvIHdlIG5vdyBoYXZlIHRvCisgICAgICAgICAqIGVtdWxhdGUgQ2xhc3MncyBiZWhhdmlvci4KKyAgICAgICAgICovCisgICAgICAgIGlmIChyZXNvdXJjZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHJlc291cmNlID0gcmVzb3VyY2Uuc3Vic3RyaW5nKDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb3VyY2UgPSAib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC8iCisgICAgICAgICAgICAgICAgKyByZXNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZiA9IExvYWRlclV0aWxzLmdldFJlc291cmNlU291cmNlKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UpOworICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkZvdW5kICIgKyBmLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICBydW50aW1lQ2xhc3Nlcy5jcmVhdGVQYXRoKCkuc2V0TG9jYXRpb24oZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIkNvdWxkblwndCBmaW5kICIgKyByZXNvdXJjZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZXhlY3V0ZSB0aGUgdGFzaworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBDb21tYW5kbGluZUphdmEgY29tbWFuZGxpbmUgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CisKKyAgICAgICAgaWYgKCJ0ZXh0Ii5lcXVhbHMoZm9ybWF0KSkgeworICAgICAgICAgICAgY29tbWFuZGxpbmUuc2V0Q2xhc3NuYW1lKCJqZGVwZW5kLnRleHR1aS5KRGVwZW5kIik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaWYgKCJ4bWwiLmVxdWFscyhmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZGxpbmUuc2V0Q2xhc3NuYW1lKCJqZGVwZW5kLnhtbHVpLkpEZXBlbmQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiAoanZtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLnNldFZtKGp2bSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldFNvdXJjZXNwYXRoKCkgPT0gbnVsbCAmJiBnZXRDbGFzc2VzcGF0aCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWlzc2luZyBjbGFzc2VzcGF0aCByZXF1aXJlZCBhcmd1bWVudCIpOworICAgICAgICB9IGVsc2UgaWYgKGdldENsYXNzZXNwYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9CisgICAgICAgICAgICAgICAgInNvdXJjZXNwYXRoIGlzIGRlcHJlY2F0ZWQgaW4gSkRlcGVuZCA+PSAyLjUgIgorICAgICAgICAgICAgICAgICsgIi0gcGxlYXNlIGNvbnZlcnQgdG8gY2xhc3Nlc3BhdGgiOworICAgICAgICAgICAgbG9nKG1zZyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBleGVjdXRlIHRoZSB0ZXN0IGFuZCBnZXQgdGhlIHJldHVybiBjb2RlCisgICAgICAgIGludCBleGl0VmFsdWUgPSBKRGVwZW5kVGFzay5FUlJPUlM7CisgICAgICAgIGJvb2xlYW4gd2FzS2lsbGVkID0gZmFsc2U7CisgICAgICAgIGlmICghZ2V0Rm9yaygpKSB7CisgICAgICAgICAgICBleGl0VmFsdWUgPSBleGVjdXRlSW5WTShjb21tYW5kbGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFeGVjdXRlV2F0Y2hkb2cgd2F0Y2hkb2cgPSBjcmVhdGVXYXRjaGRvZygpOworICAgICAgICAgICAgZXhpdFZhbHVlID0gZXhlY3V0ZUFzRm9ya2VkKGNvbW1hbmRsaW5lLCB3YXRjaGRvZyk7CisgICAgICAgICAgICAvLyBudWxsIHdhdGNoZG9nIG1lYW5zIG5vIHRpbWVvdXQsIHlvdSdkIGJldHRlciBub3QgY2hlY2sgd2l0aCBudWxsCisgICAgICAgICAgICBpZiAod2F0Y2hkb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdhc0tpbGxlZCA9IHdhdGNoZG9nLmtpbGxlZFByb2Nlc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yL2ZhaWx1cmUgYW5kIHRoYXQgaXQgc2hvdWxkIGhhbHQsIHN0b3AKKyAgICAgICAgLy8gZXZlcnl0aGluZyBvdGhlcndpc2UganVzdCBsb2cgYSBzdGF0ZW1lbnQKKyAgICAgICAgYm9vbGVhbiBlcnJvck9jY3VycmVkID0gZXhpdFZhbHVlID09IEpEZXBlbmRUYXNrLkVSUk9SUyB8fCB3YXNLaWxsZWQ7CisKKyAgICAgICAgaWYgKGVycm9yT2NjdXJyZWQpIHsKKyAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSAiSkRlcGVuZCBGQUlMRUQiCisgICAgICAgICAgICAgICAgKyAod2FzS2lsbGVkID8gIiAtIFRpbWVkIG91dCIgOiAiIik7CisKKyAgICAgICAgICAgIGlmICAoZ2V0SGFsdG9uZXJyb3IoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coZXJyb3JNZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGhpcyBjb21tZW50IGV4dHJhY3QgZnJvbSBKVW5pdCBUYXNrIG1heSBhbHNvIGFwcGx5IGhlcmUKKyAgICAvLyAiaW4gVk0gaXMgbm90IHZlcnkgbmljZSBzaW5jZSBpdCBjb3VsZCBwcm9iYWJseSBoYW5nIHRoZQorICAgIC8vIHdob2xlIGJ1aWxkLiBJTUhPIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhdm9pZGVkIGFuZCBpdCB3b3VsZCBiZSBiZXN0CisgICAgLy8gdG8gcmVtb3ZlIGl0IGluIGZ1dHVyZSB2ZXJzaW9ucy4gVEJELiAoU0JhKSIKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgaW5zaWRlIFZNLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1hbmRsaW5lIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKiBAcmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG12bQorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCBleGVjdXRlSW5WTShDb21tYW5kbGluZUphdmEgY29tbWFuZGxpbmUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGpkZXBlbmQudGV4dHVpLkpEZXBlbmQgamRlcGVuZDsKKworICAgICAgICBpZiAoInhtbCIuZXF1YWxzKGZvcm1hdCkpIHsKKyAgICAgICAgICAgIGpkZXBlbmQgPSBuZXcgamRlcGVuZC54bWx1aS5KRGVwZW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqZGVwZW5kID0gbmV3IGpkZXBlbmQudGV4dHVpLkpEZXBlbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGVXcml0ZXIgZncgPSBudWxsOworICAgICAgICBpZiAoZ2V0T3V0cHV0RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZncgPSBuZXcgRmlsZVdyaXRlcihnZXRPdXRwdXRGaWxlKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkpEZXBlbmQgRmFpbGVkIHdoZW4gY3JlYXRpbmcgdGhlIG91dHB1dCBmaWxlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgbG9nKG1zZyk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBqZGVwZW5kLnNldFdyaXRlcihuZXcgUHJpbnRXcml0ZXIoZncpKTsKKyAgICAgICAgICAgIGxvZygiT3V0cHV0IHRvIGJlIHN0b3JlZCBpbiAiICsgZ2V0T3V0cHV0RmlsZSgpLmdldFBhdGgoKSk7CisgICAgICAgIH0KKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZ2V0Q2xhc3Nlc3BhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbmV3LCBiZXR0ZXIgd2F5IC0gdXNlIGNsYXNzZXNwYXRoIGluc3RlYWQKKyAgICAgICAgICAgICAgICAvLyBvZiBzb3VyY2VzcGF0aC4gIFRoZSBjb2RlIGlzIGN1cnJlbnRseSB0aGUgc2FtZSAtIHlvdQorICAgICAgICAgICAgICAgIC8vIG5lZWQgY2xhc3MgZmlsZXMgaW4gYSBkaXJlY3RvcnkgdG8gdXNlIHRoaXMgb3IgamFyIGZpbGVzLgorICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNQID0gZ2V0Q2xhc3Nlc3BhdGgoKS5saXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjUC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShjUFtpXSk7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBuZWNlc3NhcnkgYXMgSkRlcGVuZCB3b3VsZCBmYWlsLCBidXQgd2h5IGxvb3NlCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgdGltZT8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZi5nZXRQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZmlsZSBvciBkaXJlY3RvcnkuIEpEZXBlbmQgd291bGQgZmFpbC4iOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgamRlcGVuZC5hZGREaXJlY3RvcnkoZi5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSkRlcGVuZCBGYWlsZWQgd2hlbiBhZGRpbmcgYSBjbGFzcyBkaXJlY3Rvcnk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRTb3VyY2VzcGF0aCgpICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9sZCB3YXkgYW5kIGlzIGRlcHJlY2F0ZWQgLSBjbGFzc2VzcGF0aCBpcworICAgICAgICAgICAgICAgIC8vIHRoZSByaWdodCB3YXkgdG8gZG8gdGhpcyBhbmQgaXMgYWJvdmUKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBzUCA9IGdldFNvdXJjZXNwYXRoKCkubGlzdCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1AubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoc1BbaV0pOworCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBuZWNlc3NhcnkgYXMgSkRlcGVuZCB3b3VsZCBmYWlsLCBidXQgd2h5IGxvb3NlCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgdGltZT8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLmV4aXN0cygpIHx8ICFmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmLmdldFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaXJlY3RvcnkuIEpEZXBlbmQgd291bGQgZmFpbC4iOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgamRlcGVuZC5hZGREaXJlY3RvcnkoZi5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSkRlcGVuZCBGYWlsZWQgd2hlbiBhZGRpbmcgYSBzb3VyY2UgZGlyZWN0b3J5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtc2cpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoaXMgYml0IHR1cm5zIDxleGNsdWRlPiBjaGlsZCB0YWdzIGludG8gcGF0dGVycyB0byBpZ25vcmUKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhdHRlcm5zID0gZGVmYXVsdFBhdHRlcm5zLmdldEV4Y2x1ZGVQYXR0ZXJucyhnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgaWYgKHBhdHRlcm5zICE9IG51bGwgJiYgcGF0dGVybnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChzZXRGaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KHBhdHRlcm5zW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBwYWNrYWdlRmlsdGVyQy5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge3Z9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpbHRlci5pbnZva2UoamRlcGVuZCwgbmV3IE9iamVjdFtdIHtvfSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coImV4Y2x1ZGVzIHdpbGwgYmUgaWdub3JlZCBhcyBKRGVwZW5kIGRvZXNuJ3QgbGlrZSBtZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJTb3JyeSwgeW91ciB2ZXJzaW9uIG9mIEpEZXBlbmQgZG9lc24ndCBzdXBwb3J0IGV4Y2x1ZGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgamRlcGVuZC5hbmFseXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZncpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTVUNDRVNTOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGFzayBieSBmb3JraW5nIGEgbmV3IEpWTS4gVGhlIGNvbW1hbmQgd2lsbCBibG9jayB1bnRpbAorICAgICAqIGl0IGZpbmlzaGVzLiBUbyBrbm93IGlmIHRoZSBwcm9jZXNzIHdhcyBkZXN0cm95ZWQgb3Igbm90LCB1c2UgdGhlCisgICAgICogPHR0PmtpbGxlZFByb2Nlc3MoKTwvdHQ+IG1ldGhvZCBvZiB0aGUgd2F0Y2hkb2cgY2xhc3MuCisgICAgICogQHBhcmFtIGNvbW1hbmRsaW5lIHRoZSBjb21tYW5kbGluZSBmb3IgZm9ya2VkIGp2bQorICAgICAqIEBwYXJhbSAgd2F0Y2hkb2cgICB0aGUgd2F0Y2hkb2cgaW4gY2hhcmdlIG9mIGNhbmNlbGxpbmcgdGhlIHRlc3QgaWYgaXQKKyAgICAgKiBleGNlZWRzIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4gQ2FuIGJlIDx0dD5udWxsPC90dD4uCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGpkZXBlbmQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGluIGNhc2Ugb2YgZXJyb3IKKyAgICAgKi8KKyAgICAvLyBKTDogY29tbWVudCBleHRyYWN0ZWQgZnJvbSBKVW5pdFRhc2sgKGFuZCBzbGlnaHRseSBtb2RpZmllZCkKKyAgICBwdWJsaWMgaW50IGV4ZWN1dGVBc0ZvcmtlZChDb21tYW5kbGluZUphdmEgY29tbWFuZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0ZVdhdGNoZG9nIHdhdGNoZG9nKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBydW50aW1lQ2xhc3NlcyA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIGFkZENsYXNzcGF0aEVudHJ5KCIvamRlcGVuZC90ZXh0dWkvSkRlcGVuZC5jbGFzcyIpOworCisgICAgICAgIC8vIGlmIG5vdCBzZXQsIGF1dG8tY3JlYXRlIHRoZSBDbGFzc1BhdGggZnJvbSB0aGUgcHJvamVjdAorICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKTsKKworICAgICAgICAvLyBub3Qgc3VyZSB3aGV0aGVyIHRoaXMgdGVzdCBpcyBuZWVkZWQgYnV0IGNvc3Qgbm90aGluZyB0byBwdXQuCisgICAgICAgIC8vIGhvcGUgaXQgd2lsbCBiZSByZXZpZXdlZCBieSBhbnlib2R5IGNvbXBldGVudAorICAgICAgICBpZiAoZ2V0Q2xhc3NwYXRoKCkudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGNyZWF0ZUp2bWFyZyhjb21tYW5kbGluZSkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsKKyAgICAgICAgICAgIGNyZWF0ZUp2bWFyZyhjb21tYW5kbGluZSkuc2V0VmFsdWUoZ2V0Q2xhc3NwYXRoKCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5jbHVkZVJ1bnRpbWUpIHsKKyAgICAgICAgICAgIFZlY3RvciB2ID0gRXhlY3V0ZS5nZXRQcm9jRW52aXJvbm1lbnQoKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB2LmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIkNMQVNTUEFUSD0iKSkgeworICAgICAgICAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVDbGFzc3BhdGgoZ2V0UHJvamVjdCgpKS5jcmVhdGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmV3IFBhdGgoZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN1YnN0cmluZygiQ0xBU1NQQVRIPSIubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZygiSW1wbGljaXRseSBhZGRpbmcgIiArIHJ1bnRpbWVDbGFzc2VzICsgIiB0byBDTEFTU1BBVEgiLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQ2xhc3NwYXRoKGdldFByb2plY3QoKSkuY3JlYXRlUGF0aCgpCisgICAgICAgICAgICAgICAgLmFwcGVuZChydW50aW1lQ2xhc3Nlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0T3V0cHV0RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGhhdmluZyBhIHNwYWNlIGJldHdlZW4gdGhlIGZpbGUgYW5kIGl0cyBwYXRoIGNhdXNlcyBjb21tYW5kbGluZQorICAgICAgICAgICAgLy8gdG8gYWRkIHF1b3RlcyBhcm91bmQgdGhlIGFyZ3VtZW50IHRodXMgbWFraW5nIEpEZXBlbmQgbm90IHRha2luZworICAgICAgICAgICAgLy8gaXQgaW50byBhY2NvdW50LiBUaHVzIHdlIHNwbGl0IGl0IGluIHR3bworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWZpbGUiKTsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUob3V0cHV0RmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBmaW5kIGEgY2xlYW5lciB3YXkgdG8gcHV0IHRoaXMgb3V0cHV0CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0U291cmNlc3BhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGRlcHJlY2F0ZWQgLSB1c2UgY2xhc3Nlc3BhdGggaW4gdGhlIGZ1dHVyZQorICAgICAgICAgICAgU3RyaW5nW10gc1AgPSBnZXRTb3VyY2VzcGF0aCgpLmxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1AubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzUFtpXSk7CisKKyAgICAgICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJ5IGFzIEpEZXBlbmQgd291bGQgZmFpbCwgYnV0IHdoeSBsb29zZQorICAgICAgICAgICAgICAgIC8vIHNvbWUgdGltZT8KKyAgICAgICAgICAgICAgICBpZiAoIWYuZXhpc3RzKCkgfHwgIWYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlwiIiArIGYuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaXJlY3RvcnkuIEpEZXBlbmQgd291bGQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZmFpbC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShmLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0Q2xhc3Nlc3BhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBuZXcgd2F5IC0gdXNlIGNsYXNzZXNwYXRoIC0gY29kZSBpcyB0aGUKKyAgICAgICAgICAgIC8vIHNhbWUgZm9yIG5vdworICAgICAgICAgICAgU3RyaW5nW10gY1AgPSBnZXRDbGFzc2VzcGF0aCgpLmxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY1AubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShjUFtpXSk7CisgICAgICAgICAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSBhcyBKRGVwZW5kIHdvdWxkIGZhaWwsIGJ1dCB3aHkgbG9vc2UKKyAgICAgICAgICAgICAgICAvLyBzb21lIHRpbWU/CisgICAgICAgICAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiXCIiICsgZi5nZXRQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZpbGUgb3IgZGlyZWN0b3J5LiBKRGVwZW5kIHdvdWxkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZhaWwuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZi5nZXRQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRXhlY3V0ZSBleGVjdXRlID0gbmV3IEV4ZWN1dGUobmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywKKyAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8sIFByb2plY3QuTVNHX1dBUk4pLCB3YXRjaGRvZyk7CisgICAgICAgIGV4ZWN1dGUuc2V0Q29tbWFuZGxpbmUoY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgIGlmIChnZXREaXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBleGVjdXRlLnNldFdvcmtpbmdEaXJlY3RvcnkoZ2V0RGlyKCkpOworICAgICAgICAgICAgZXhlY3V0ZS5zZXRBbnRSdW4oZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRPdXRwdXRGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJPdXRwdXQgdG8gYmUgc3RvcmVkIGluICIgKyBnZXRPdXRwdXRGaWxlKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBsb2coY29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGUuZXhlY3V0ZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb2Nlc3MgZm9yayBmYWlsZWQuIiwgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIDx0dD5udWxsPC90dD4gaWYgdGhlcmUgaXMgYSB0aW1lb3V0IHZhbHVlLCBvdGhlcndpc2UgdGhlCisgICAgICogd2F0Y2hkb2cgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVycm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIEV4ZWN1dGVXYXRjaGRvZyBjcmVhdGVXYXRjaGRvZygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRUaW1lb3V0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBFeGVjdXRlV2F0Y2hkb2coZ2V0VGltZW91dCgpLmxvbmdWYWx1ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9DbGFzc05hbWVSZWFkZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL0NsYXNzTmFtZVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZTlmYzUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9DbGFzc05hbWVSZWFkZXIuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qbGluazsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBSZWFkcyBqdXN0IGVub3VnaCBvZiBhIGNsYXNzIGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBjbGFzcycgZnVsbCBuYW1lLgorICoKKyAqIDxwPkV4dHJlbWVseSBtaW5pbWFsIGNvbnN0YW50IHBvb2wgaW1wbGVtZW50YXRpb24sIG1haW5seSB0byBzdXBwb3J0IGV4dHJhY3RpbmcKKyAqIHN0cmluZ3MgZnJvbSBhIGNsYXNzIGZpbGUuCisgKi8KK2NsYXNzIENvbnN0YW50UG9vbCB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICBzdGF0aWMgZmluYWwKKyAgICAgICAgYnl0ZSBVVEY4ID0gMSwgVU5VU0VEID0gMiwgSU5URUdFUiA9IDMsIEZMT0FUID0gNCwgTE9ORyA9IDUsIERPVUJMRSA9IDYsCisgICAgICAgIENMQVNTID0gNywgU1RSSU5HID0gOCwgRklFTERSRUYgPSA5LCBNRVRIT0RSRUYgPSAxMCwKKyAgICAgICAgSU5URVJGQUNFTUVUSE9EUkVGID0gMTEsIE5BTUVBTkRUWVBFID0gMTI7CisKKyAgICBieXRlW10gdHlwZXM7CisKKyAgICBPYmplY3RbXSB2YWx1ZXM7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNvbnN0YW50IHBvb2wuCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgaW5wdXQgY29udGFpbmluZyB0aGUgY2xhc3MuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBDb25zdGFudFBvb2woRGF0YUlucHV0IGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKCk7CisKKyAgICAgICAgaW50IGNvdW50ID0gZGF0YS5yZWFkVW5zaWduZWRTaG9ydCgpOworICAgICAgICB0eXBlcyA9IG5ldyBieXRlIFsgY291bnQgXTsKKyAgICAgICAgdmFsdWVzID0gbmV3IE9iamVjdCBbIGNvdW50IF07CisgICAgICAgIC8vIHJlYWQgaW4gYWxsIGNvbnN0YW50IHBvb2wgZW50cmllcy4KKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBieXRlIHR5cGUgPSBkYXRhLnJlYWRCeXRlKCk7CisgICAgICAgICAgICB0eXBlc1tpXSA9IHR5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVVRGOCA6CisgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gZGF0YS5yZWFkVVRGKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVU5VU0VEIDoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJTlRFR0VSIDoKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgSW50ZWdlcihkYXRhLnJlYWRJbnQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRkxPQVQgOgorICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ldyBGbG9hdChkYXRhLnJlYWRGbG9hdCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBMT05HIDoKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgTG9uZyhkYXRhLnJlYWRMb25nKCkpOworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBET1VCTEUgOgorICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ldyBEb3VibGUoZGF0YS5yZWFkRG91YmxlKCkpOworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDTEFTUyA6CisgICAgICAgICAgICBjYXNlIFNUUklORyA6CisgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gbmV3IEludGVnZXIoZGF0YS5yZWFkVW5zaWduZWRTaG9ydCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBGSUVMRFJFRiA6CisgICAgICAgICAgICBjYXNlIE1FVEhPRFJFRiA6CisgICAgICAgICAgICBjYXNlIElOVEVSRkFDRU1FVEhPRFJFRiA6CisgICAgICAgICAgICBjYXNlIE5BTUVBTkRUWVBFIDoKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgSW50ZWdlcihkYXRhLnJlYWRJbnQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBQcm92aWRlcyBhIHF1aWNrIGFuZCBkaXJ0eSB3YXkgdG8gZGV0ZXJtaW5lIHRoZSB0cnVlIG5hbWUgb2YgYSBjbGFzcworICogZ2l2ZW4ganVzdCBhbiBJbnB1dFN0cmVhbS4gUmVhZHMgaW4ganVzdCBlbm91Z2ggdG8gcGVyZm9ybSB0aGlzCisgKiBtaW5pbWFsIHRhc2sgb25seS4KKyAqLworcHVibGljIGNsYXNzIENsYXNzTmFtZVJlYWRlciBleHRlbmRzIE9iamVjdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMQVNTX01BR0lDX05VTUJFUiA9ICAweENBRkVCQUJFOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGFzcyBuYW1lIG9mIGEgY2xhc3MgaW4gYW4gaW5wdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB2YWx1ZQorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWUoSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBkYXRhID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbnB1dCk7CisgICAgICAgIC8vIHZlcmlmeSB0aGlzIGlzIGEgdmFsaWQgY2xhc3MgZmlsZS4KKyAgICAgICAgaW50IGNvb2tpZSA9IGRhdGEucmVhZEludCgpOworICAgICAgICBpZiAoY29va2llICE9IENMQVNTX01BR0lDX05VTUJFUikgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLyogaW50IHZlcnNpb24gPSAqLyBkYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgLy8gcmVhZCB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgICAgQ29uc3RhbnRQb29sIGNvbnN0YW50cyA9IG5ldyBDb25zdGFudFBvb2woZGF0YSk7CisgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IGNvbnN0YW50cy52YWx1ZXM7CisgICAgICAgIC8vIHJlYWQgYWNjZXNzIGZsYWdzIGFuZCBjbGFzcyBpbmRleC4KKyAgICAgICAgLyogaW50IGFjY2Vzc0ZsYWdzID0gKi8gZGF0YS5yZWFkVW5zaWduZWRTaG9ydCgpOworICAgICAgICBpbnQgY2xhc3NJbmRleCA9IGRhdGEucmVhZFVuc2lnbmVkU2hvcnQoKTsKKyAgICAgICAgSW50ZWdlciBzdHJpbmdJbmRleCA9IChJbnRlZ2VyKSB2YWx1ZXNbY2xhc3NJbmRleF07CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSB2YWx1ZXNbc3RyaW5nSW5kZXguaW50VmFsdWUoKV07CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisKK30KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9KbGlua1Rhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL0psaW5rVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOWY0MDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9KbGlua1Rhc2suamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qbGluazsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVmaW5lcyBvYmplY3RzIHRoYXQgY2FuIGxpbmsgdG9nZXRoZXIgdmFyaW91cyBqYXIgYW5kCisgKiB6aXAgZmlsZXMuCisgKgorICogPHA+SXQgaXMgYmFzaWNhbGx5IGEgd3JhcHBlciBmb3IgdGhlIGpsaW5rIGNvZGUgd3JpdHRlbiBvcmlnaW5hbGx5CisgKiBieSA8YSBocmVmPSJtYWlsdG86YmVhcmRAbmV0c2NhcGUuY29tIj5QYXRyaWNrIEJlYXJkPC9hPi4gIFRoZQorICogY2xhc3NlcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qbGluay5KbGluayBhbmQKKyAqIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpsaW5rLkNsYXNzTmFtZVJlYWRlcgorICogc3VwcG9ydCB0aGlzIGNsYXNzLjwvcD4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZToKKyAqIDxjb2RlPgorICogPHByZT4KKyAqICZsdDtqbGluayBjb21wcmVzcz0mcXVvdDtmYWxzZSZxdW90OyBvdXRmaWxlPSZxdW90O291dC5qYXImcXVvdDsvJmd0OworICogICAmbHQ7bWVyZ2VmaWxlcyZndDsKKyAqICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2J1aWxkLmRpcn0vbWVyZ2Vmb28uamFyJnF1b3Q7LyZndDsKKyAqICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2J1aWxkLmRpcn0vbWVyZ2ViYXIuamFyJnF1b3Q7LyZndDsKKyAqICAgJmx0Oy9tZXJnZWZpbGVzJmd0OworICogICAmbHQ7YWRkZmlsZXMmZ3Q7CisgKiAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtidWlsZC5kaXJ9L21hYy5qYXImcXVvdDsvJmd0OworICogICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7YnVpbGQuZGlyfS9wYy56aXAmcXVvdDsvJmd0OworICogICAmbHQ7L2FkZGZpbGVzJmd0OworICogJmx0Oy9qbGluayZndDsKKyAqIDwvcHJlPgorICogPC9jb2RlPgorICoKKyAqIEBhbnQudGFzayBpZ25vcmU9InRydWUiCisgKi8KK3B1YmxpYyBjbGFzcyBKbGlua1Rhc2sgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgeworCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dCBmaWxlIGZvciB0aGlzIHJ1biBvZiBqbGluay4gVXN1YWxseSBhIGphciBvciB6aXAgZmlsZS4KKyAgICAgKiBAcGFyYW0gb3V0ZmlsZSB0aGUgb3V0cHV0IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgIHZvaWQgc2V0T3V0ZmlsZShGaWxlIG91dGZpbGUpIHsKKyAgICAgICAgdGhpcy5vdXRmaWxlID0gb3V0ZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFc3RhYmxpc2hlcyB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGZpbGVzIHRvCisgICAgICogYmUgbWVyZ2VkIGludG8gdGhlIG91dHB1dC4KKyAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkCisgICAgICovCisgICAgcHVibGljICBQYXRoIGNyZWF0ZU1lcmdlZmlsZXMoKSB7CisgICAgICAgIGlmICh0aGlzLm1lcmdlZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5tZXJnZWZpbGVzID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5tZXJnZWZpbGVzLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmaWxlcyB0byBiZSBtZXJnZWQgaW50byB0aGUgb3V0cHV0LgorICAgICAqIEBwYXJhbSBtZXJnZWZpbGVzIGEgcGF0aAorICAgICAqLworICAgIHB1YmxpYyAgdm9pZCBzZXRNZXJnZWZpbGVzKFBhdGggbWVyZ2VmaWxlcykgeworICAgICAgICBpZiAodGhpcy5tZXJnZWZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMubWVyZ2VmaWxlcyA9IG1lcmdlZmlsZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLm1lcmdlZmlsZXMuYXBwZW5kKG1lcmdlZmlsZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXN0YWJsaXNoZXMgdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBmaWxlcyB0bworICAgICAqIGJlIGFkZGVkIHRvIHRoZSBvdXRwdXQuCisgICAgICogQHJldHVybiBhIHBhdGggdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyAgUGF0aCBjcmVhdGVBZGRmaWxlcygpIHsKKyAgICAgICAgaWYgKHRoaXMuYWRkZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5hZGRmaWxlcyA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkZmlsZXMuY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpbGVzIHRvIGJlIGFkZGVkIGludG8gdGhlIG91dHB1dC4KKyAgICAgKiBAcGFyYW0gYWRkZmlsZXMgYSBwYXRoCisgICAgICovCisgICAgcHVibGljICB2b2lkIHNldEFkZGZpbGVzKFBhdGggYWRkZmlsZXMpIHsKKyAgICAgICAgaWYgKHRoaXMuYWRkZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5hZGRmaWxlcyA9IGFkZGZpbGVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5hZGRmaWxlcy5hcHBlbmQoYWRkZmlsZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgb3V0cHV0IHNob3VsZCBiZSBjb21wYWN0ZWQuCisgICAgICogQHBhcmFtIGNvbXByZXNzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgIHZvaWQgc2V0Q29tcHJlc3MoYm9vbGVhbiBjb21wcmVzcykgeworICAgICAgICB0aGlzLmNvbXByZXNzID0gY29tcHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgYWRkaW5nIGFuZCBtZXJnaW5nLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vQmUgc3VyZSBldmVyeXRoaW5nIGhhcyBiZWVuIHNldC4KKyAgICAgICAgaWYgKG91dGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvdXRmaWxlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCEgIgorICAgICAgICAgICAgICAgICsgIlBsZWFzZSBzZXQuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFoYXZlQWRkRmlsZXMoKSAmJiAhaGF2ZU1lcmdlRmlsZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJhZGRmaWxlcyBvciBtZXJnZWZpbGVzIHJlcXVpcmVkISAiCisgICAgICAgICAgICAgICAgKyAiUGxlYXNlIHNldC4iKTsKKyAgICAgICAgfQorICAgICAgICBsb2coImxpbmtpbmc6ICAgICAiICsgb3V0ZmlsZS5nZXRQYXRoKCkpOworICAgICAgICBsb2coImNvbXByZXNzaW9uOiAiICsgY29tcHJlc3MsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBqbGluayBsaW5rZXIgPSBuZXcgamxpbmsoKTsKKyAgICAgICAgbGlua2VyLnNldE91dGZpbGUob3V0ZmlsZS5nZXRQYXRoKCkpOworICAgICAgICBsaW5rZXIuc2V0Q29tcHJlc3Npb24oY29tcHJlc3MpOworICAgICAgICBpZiAoaGF2ZU1lcmdlRmlsZXMoKSkgeworICAgICAgICAgICAgbG9nKCJtZXJnZSBmaWxlczogIiArIG1lcmdlZmlsZXMudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBsaW5rZXIuYWRkTWVyZ2VGaWxlcyhtZXJnZWZpbGVzLmxpc3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhdmVBZGRGaWxlcygpKSB7CisgICAgICAgICAgICBsb2coImFkZCBmaWxlczogIiArIGFkZGZpbGVzLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgbGlua2VyLmFkZEFkZEZpbGVzKGFkZGZpbGVzLmxpc3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5ICB7CisgICAgICAgICAgICBsaW5rZXIubGluaygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUFkZEZpbGVzKCkgeworICAgICAgICByZXR1cm4gaGF2ZUVudHJpZXMoYWRkZmlsZXMpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlTWVyZ2VGaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIGhhdmVFbnRyaWVzKG1lcmdlZmlsZXMpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlRW50cmllcyhQYXRoIHApIHsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChwLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlICBGaWxlIG91dGZpbGUgPSBudWxsOworCisgICAgcHJpdmF0ZSAgUGF0aCBtZXJnZWZpbGVzID0gbnVsbDsKKworICAgIHByaXZhdGUgIFBhdGggYWRkZmlsZXMgPSBudWxsOworCisgICAgcHJpdmF0ZSAgYm9vbGVhbiBjb21wcmVzcyA9IGZhbHNlOworCit9CisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamxpbmsvamxpbmsuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL2psaW5rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0NTgxNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL2psaW5rLmphdmEKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKy8qKgorICogamxpbmsuamF2YSBsaW5rcyB0b2dldGhlciBtdWx0aXBsZSAuamFyIGZpbGVzIE9yaWdpbmFsIGNvZGUgYnkgUGF0cmljaworICogQmVhcmQuIE1vZGlmaWNhdGlvbnMgdG8gd29yayB3aXRoIEFOVCBieSBNYXR0aGV3IEt1cGVydXMgSGV1bi4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamxpbms7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOworaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07CisKKy8vIENoZWNrU3R5bGU6VHlwZU5hbWVDaGVjayBPRkYgLSBiYworLyoqCisgKiBqbGluayBsaW5rcyB0b2dldGhlciBtdWx0aXBsZSAuamFyIGZpbGVzLgorICovCitwdWJsaWMgY2xhc3MgamxpbmsgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDgxOTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFQ1RPUl9JTklUX1NJWkUgPSAxMDsKKworICAgIHByaXZhdGUgU3RyaW5nIG91dGZpbGUgPSBudWxsOworCisgICAgcHJpdmF0ZSBWZWN0b3IgbWVyZ2VmaWxlcyA9IG5ldyBWZWN0b3IoVkVDVE9SX0lOSVRfU0laRSk7CisKKyAgICBwcml2YXRlIFZlY3RvciBhZGRmaWxlcyA9IG5ldyBWZWN0b3IoVkVDVE9SX0lOSVRfU0laRSk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29tcHJlc3Npb24gPSBmYWxzZTsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisKKyAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKworICAgIC8qKiBUaGUgZmlsZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIGpsaW5rLgorICAgICAqIEBwYXJhbSBvdXRmaWxlIHRoZSBmaWxlIHRvIGNyZWF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRmaWxlKFN0cmluZyBvdXRmaWxlKSB7CisgICAgICAgIGlmIChvdXRmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm91dGZpbGUgPSBvdXRmaWxlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIGZpbGUgdG8gYmUgbWVyZ2VkIGludG8gdGhlIG91dHB1dC4KKyAgICAgKiBAcGFyYW0gZmlsZVRvTWVyZ2UgdGhlIGZpbGUgdG8gbWVyZ2UgaW50byB0aGUgb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lcmdlRmlsZShTdHJpbmcgZmlsZVRvTWVyZ2UpIHsKKyAgICAgICAgaWYgKGZpbGVUb01lcmdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZXJnZWZpbGVzLmFkZEVsZW1lbnQoZmlsZVRvTWVyZ2UpOworICAgIH0KKworCisgICAgLyoqIEFkZHMgYSBmaWxlIHRvIGJlIGFkZGVkIGludG8gdGhlIG91dHB1dC4KKyAgICAgKiBAcGFyYW0gZmlsZVRvQWRkIHRoZSBmaWxlIHRvIGFkZCB0byB0aGUgb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFkZEZpbGUoU3RyaW5nIGZpbGVUb0FkZCkgeworICAgICAgICBpZiAoZmlsZVRvQWRkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhZGRmaWxlcy5hZGRFbGVtZW50KGZpbGVUb0FkZCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIHNldmVyYWwgZmlsZXMgdG8gYmUgbWVyZ2VkIGludG8gdGhlIG91dHB1dC4KKyAgICAgKiBAcGFyYW0gZmlsZXNUb01lcmdlIGFuIGFycmF5IG9mIGZpbGVzIHRvIG1lcmdlIGludG8gdGhlIG91dHB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNZXJnZUZpbGVzKFN0cmluZ1tdIGZpbGVzVG9NZXJnZSkgeworICAgICAgICBpZiAoZmlsZXNUb01lcmdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzVG9NZXJnZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkTWVyZ2VGaWxlKGZpbGVzVG9NZXJnZVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZHMgc2V2ZXJhbCBmaWxlIHRvIGJlIGFkZGVkIGludG8gdGhlIG91dHB1dC4KKyAgICAgKiBAcGFyYW0gZmlsZXNUb0FkZCBhbiBhcnJheSBvZiBmaWxlcyB0byBhZGQgdG8gdGhlIG91dHB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBZGRGaWxlcyhTdHJpbmdbXSBmaWxlc1RvQWRkKSB7CisgICAgICAgIGlmIChmaWxlc1RvQWRkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzVG9BZGQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEFkZEZpbGUoZmlsZXNUb0FkZFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciBvdXRwdXQgd2lsbCBiZSBjb21wcmVzc2VkLgorICAgICAqIEBwYXJhbSBjb21wcmVzcyBpZiB0cnVlIHVzZSBjb21wcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvbihib29sZWFuIGNvbXByZXNzKSB7CisgICAgICAgIHRoaXMuY29tcHJlc3Npb24gPSBjb21wcmVzczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBsaW5raW5nIG9mIGZpbGVzLiBBZGRmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIG91dHB1dCBhcy1pcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBqYXIgZmlsZSBpcyBhZGRlZCB0byB0aGUgb3V0cHV0IGFzIGEgamFyIGZpbGUuIEhvd2V2ZXIsCisgICAgICogbWVyZ2VmaWxlcyBhcmUgZmlyc3QgZXhhbWluZWQgZm9yIHRoZWlyIHR5cGUuIElmIGl0IGlzIGEgamFyIG9yIHppcAorICAgICAqIGZpbGUsIHRoZSBjb250ZW50cyB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBtZXJnZWZpbGUgYW5kIGVudGVyZWQKKyAgICAgKiBpbnRvIHRoZSBvdXRwdXQuIElmIGEgemlwIG9yIGphciBmaWxlIGlzIGVuY291bnRlcmVkIGluIGEgc3ViZGlyZWN0b3J5CisgICAgICogaXQgd2lsbCBiZSBhZGRlZCwgbm90IG1lcmdlZC4gSWYgYSBkaXJlY3RvcnkgaXMgZW5jb3VudGVyZWQsIGl0IGJlY29tZXMKKyAgICAgKiB0aGUgcm9vdCBlbnRyeSBvZiBhbGwgdGhlIGZpbGVzIGJlbG93IGl0LiBUaHVzLCB5b3UgY2FuIHByb3ZpZGUKKyAgICAgKiBtdWx0aXBsZSwgZGlzam9pbnQgZGlyZWN0b3JpZXMsIGFzIGFkZGZpbGVzOiB0aGV5IHdpbGwgYWxsIGJlIGFkZGVkIGluCisgICAgICogYSByYXRpb25hbCBtYW5uZXIgdG8gb3V0ZmlsZS4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsaW5rKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFppcE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dGZpbGUpKTsKKworICAgICAgICBpZiAoY29tcHJlc3Npb24pIHsKKyAgICAgICAgICAgIG91dHB1dC5zZXRNZXRob2QoWmlwT3V0cHV0U3RyZWFtLkRFRkxBVEVEKTsKKyAgICAgICAgICAgIG91dHB1dC5zZXRMZXZlbChEZWZsYXRlci5ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dHB1dC5zZXRNZXRob2QoWmlwT3V0cHV0U3RyZWFtLlNUT1JFRCk7CisgICAgICAgIH0KKworICAgICAgICBFbnVtZXJhdGlvbiBtZXJnZXMgPSBtZXJnZWZpbGVzLmVsZW1lbnRzKCk7CisKKyAgICAgICAgd2hpbGUgKG1lcmdlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBtZXJnZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOworCisgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSB8fCBmLmdldE5hbWUoKS5lbmRzV2l0aCgiLnppcCIpKSB7CisgICAgICAgICAgICAgICAgLy9EbyB0aGUgbWVyZ2UKKyAgICAgICAgICAgICAgICBtZXJnZVppcEphckNvbnRlbnRzKG91dHB1dCwgZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vQWRkIHRoaXMgZmlsZSB0byB0aGUgYWRkZmlsZXMgVmVjdG9yIGFuZCBhZGQgaXQKKyAgICAgICAgICAgICAgICAvL2xhdGVyIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG91dHB1dCBmaWxlLgorICAgICAgICAgICAgICAgIGFkZEFkZEZpbGUocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFbnVtZXJhdGlvbiBhZGRzID0gYWRkZmlsZXMuZWxlbWVudHMoKTsKKworICAgICAgICB3aGlsZSAoYWRkcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBhZGRzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShuYW1lKTsKKworICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpbiBqbGluazogYWRkaW5nIGRpcmVjdG9yeSBjb250ZW50cyBvZiAiICsgZi5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIGFkZERpckNvbnRlbnRzKG91dHB1dCwgZiwgZi5nZXROYW1lKCkgKyAnLycsIGNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkRmlsZShvdXRwdXQsIGYsICIiLCBjb21wcmVzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dHB1dCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tbWFuZCBsaW5lIGVudHJ5IHBvaW50IGZvciBqbGluay4KKyAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIC8vIGpsaW5rIG91dHB1dCBpbnB1dDEgLi4uIGlucHV0TgorICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVzYWdlOiBqbGluayBvdXRwdXQgaW5wdXQxIC4uLiBpbnB1dE4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgICAgICAgIGpsaW5rIGxpbmtlciA9IG5ldyBqbGluaygpOworCisgICAgICAgIGxpbmtlci5zZXRPdXRmaWxlKGFyZ3NbMF0pOworICAgICAgICAvLyBUbyBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGNvbW1hbmQtbGluZSB2ZXJzaW9uLAorICAgICAgICAvLyB3ZSB3aWxsIG9ubHkgYWRkIGZpbGVzIHRvIGJlIG1lcmdlZC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBsaW5rZXIuYWRkTWVyZ2VGaWxlKGFyZ3NbaV0pOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaW5rZXIubGluaygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBBY3R1YWxseSBwZXJmb3JtcyB0aGUgbWVyZ2luZyBvZiBmIGludG8gdGhlIG91dHB1dC4KKyAgICAgKiBmIHNob3VsZCBiZSBhIHppcCBvciBqYXIgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbWVyZ2VaaXBKYXJDb250ZW50cyhaaXBPdXRwdXRTdHJlYW0gb3V0cHV0LCBGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGZpbGUgd2l0aCBuYW1lICJuYW1lIiBleGlzdHMuCisgICAgICAgIGlmICghZi5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFppcEZpbGUgemlwZiA9IG5ldyBaaXBGaWxlKGYpOworICAgICAgICBFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwZi5lbnRyaWVzKCk7CisKKyAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFppcEVudHJ5IGlucHV0RW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIC8vSWdub3JlIG1hbmlmZXN0IGVudHJpZXMuICBUaGV5J3JlIGJvdW5kIHRvIGNhdXNlIGNvbmZsaWN0cyBiZXR3ZWVuCisgICAgICAgICAgICAvL2ZpbGVzIHRoYXQgYXJlIGJlaW5nIG1lcmdlZC4gIFVzZXIgc2hvdWxkIHN1cHBseSB0aGVpciBvd24KKyAgICAgICAgICAgIC8vbWFuaWZlc3QgZmlsZSB3aGVuIGRvaW5nIHRoZSBtZXJnZS4KKyAgICAgICAgICAgIFN0cmluZyBpbnB1dEVudHJ5TmFtZSA9IGlucHV0RW50cnkuZ2V0TmFtZSgpOworICAgICAgICAgICAgaW50IGluZGV4ID0gaW5wdXRFbnRyeU5hbWUuaW5kZXhPZigiTUVUQS1JTkYiKTsKKworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIC8vTUVUQS1JTkYgbm90IGZvdW5kIGluIHRoZSBuYW1lIG9mIHRoZSBlbnRyeS4gR28gYWhlYWQgYW5kIHByb2Nlc3MgaXQuCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dE5leHRFbnRyeShwcm9jZXNzRW50cnkoemlwZiwgaW5wdXRFbnRyeSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAvL0lmIHdlIGdldCBoZXJlLCBpdCBjb3VsZCBiZSBiZWNhdXNlIHdlIGFyZSB0cnlpbmcgdG8gcHV0IGEKKyAgICAgICAgICAgICAgICAgICAgLy9kaXJlY3RvcnkgZW50cnkgdGhhdCBhbHJlYWR5IGV4aXN0cy4KKyAgICAgICAgICAgICAgICAgICAgLy9Gb3IgZXhhbXBsZSwgd2UncmUgdHJ5aW5nIHRvIHdyaXRlICJjb20iLCBidXQgYSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAvL2VudHJ5IGZyb20gYW5vdGhlciBtZXJnZWZpbGUgd2FzIGNhbGxlZCAiY29tIi4KKyAgICAgICAgICAgICAgICAgICAgLy9JbiB0aGF0IGNhc2UsIGp1c3QgaWdub3JlIHRoZSBlcnJvciBhbmQgZ28gb24gdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vbmV4dCBlbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3MgPSBleC5nZXRNZXNzYWdlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3MuaW5kZXhPZigiZHVwbGljYXRlIikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9JdCB3YXMgdGhlIGR1cGxpY2F0ZSBlbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSSBoYXRlIHRvIGFkbWl0IGl0LCBidXQgd2UgZG9uJ3Qga25vdyB3aGF0IGhhcHBlbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlLiAgVGhyb3cgdGhlIEV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSB6aXBmLmdldElucHV0U3RyZWFtKGlucHV0RW50cnkpOworICAgICAgICAgICAgICAgIGludCBsZW4gPSBidWZmZXIubGVuZ3RoOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IC0xOworCisgICAgICAgICAgICAgICAgd2hpbGUgKChjb3VudCA9IGluLnJlYWQoYnVmZmVyLCAwLCBsZW4pKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZUVudHJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgemlwZi5jbG9zZSgpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBBZGRzIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IHRvIHRoZSBvdXRwdXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZERpckNvbnRlbnRzKFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIEZpbGUgZGlyLCBTdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbXByZXNzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBjb250ZW50cyA9IGRpci5saXN0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjb250ZW50c1tpXTsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgbmFtZSk7CisKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBhZGREaXJDb250ZW50cyhvdXRwdXQsIGZpbGUsIHByZWZpeCArIG5hbWUgKyAnLycsIGNvbXByZXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkRmlsZShvdXRwdXQsIGZpbGUsIHByZWZpeCwgY29tcHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYW4gZW50cnkgaW4gdGhlIGZpbGUuICBUaGlzIGlzIHRoZSByZWFsIG5hbWUKKyAgICAgKiB3aGljaCBmb3IgYSBjbGFzcyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB3aXRoIHRoZSBjbGFzcworICAgICAqIG5hbWUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RW50cnlOYW1lKEZpbGUgZmlsZSwgU3RyaW5nIHByZWZpeCkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworCisgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKyAgICAgICAgICAgIC8vIHNlZSBpZiB0aGUgZmlsZSBpcyBpbiBmYWN0IGEgLmNsYXNzIGZpbGUsIGFuZCBkZXRlcm1pbmUgaXRzIGFjdHVhbCBuYW1lLgorICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzTmFtZVJlYWRlci5nZXRDbGFzc05hbWUoaW5wdXQpOworCisgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRnJvbSAiICsgZmlsZS5nZXRQYXRoKCkgKyAiIGFuZCBwcmVmaXggIiArIHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjcmVhdGluZyBlbnRyeSAiICsgcHJlZml4ICsgbmFtZSk7CisgICAgICAgIHJldHVybiAocHJlZml4ICsgbmFtZSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIEFkZHMgYSBmaWxlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRGaWxlKFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIEZpbGUgZmlsZSwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbXByZXNzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvL01ha2Ugc3VyZSBmaWxlIGV4aXN0cworICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeShnZXRFbnRyeU5hbWUoZmlsZSwgcHJlZml4KSk7CisKKyAgICAgICAgZW50cnkuc2V0VGltZShmaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgZW50cnkuc2V0U2l6ZShmaWxlLmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKCFjb21wcmVzcykgeworICAgICAgICAgICAgZW50cnkuc2V0Q3JjKGNhbGNDaGVja3N1bShmaWxlKSk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKworICAgICAgICBhZGRUb091dHB1dFN0cmVhbShvdXRwdXQsIGlucHV0LCBlbnRyeSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgc2V2ZXJhbCBvdGhlciBtZXRob2RzIG1pZ2h0IGNhbGwuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRvT3V0cHV0U3RyZWFtKFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dHB1dC5wdXROZXh0RW50cnkoemUpOworICAgICAgICB9IGNhdGNoIChaaXBFeGNlcHRpb24gemlwRXgpIHsKKyAgICAgICAgICAgIC8vVGhpcyBlbnRyeSBhbHJlYWR5IGV4aXN0cy4gU28sIGdvIHdpdGggdGhlIGZpcnN0IG9uZS4KKyAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgbnVtQnl0ZXMgPSAtMTsKKworICAgICAgICB3aGlsZSAoKG51bUJ5dGVzID0gaW5wdXQucmVhZChidWZmZXIpKSA+IDApIHsKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShidWZmZXIsIDAsIG51bUJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQuY2xvc2VFbnRyeSgpOworICAgICAgICBpbnB1dC5jbG9zZSgpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBBIG1ldGhvZCB0aGF0IGRvZXMgdGhlIHdvcmsgb24gYSBnaXZlbiBlbnRyeSBpbiBhIG1lcmdlZmlsZS4KKyAgICAgKiBUaGUgYmlnIGRlYWwgaXMgdG8gc2V0IHRoZSByaWdodCBwYXJhbWV0ZXJzIGluIHRoZSBaaXBFbnRyeQorICAgICAqIG9uIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHByaXZhdGUgWmlwRW50cnkgcHJvY2Vzc0VudHJ5KFppcEZpbGUgemlwLCBaaXBFbnRyeSBpbnB1dEVudHJ5KSB7CisgICAgICAgIC8qCisgICAgICAgICAgRmlyc3QsIHNvbWUgbm90ZXMuCisgICAgICAgICAgT24gTVJKIDIuMi4yLCBnZXR0aW5nIHRoZSBzaXplLCBjb21wcmVzc2VkIHNpemUsIGFuZCBDUkMzMiBmcm9tIHRoZQorICAgICAgICAgIFppcElucHV0U3RyZWFtIGRvZXMgbm90IHdvcmsgZm9yIGNvbXByZXNzZWQgKGRlZmxhdGVkKSBmaWxlcy4gIFRob3NlIGNhbGxzIHJldHVybiAtMS4KKyAgICAgICAgICBGb3IgdW5jb21wcmVzc2VkIChzdG9yZWQpIGZpbGVzLCB0aG9zZSBjYWxscyBkbyB3b3JrLgorICAgICAgICAgIEhvd2V2ZXIsIHVzaW5nIFppcEZpbGUuZ2V0RW50cmllcygpIHdvcmtzIGZvciBib3RoIGNvbXByZXNzZWQgYW5kCisgICAgICAgICAgdW5jb21wcmVzc2VkIGZpbGVzLgorCisgICAgICAgICAgTm93LCBmcm9tIHNvbWUgc2ltcGxlIHRlc3RpbmcgSSBkaWQsIGl0IHNlZW1zIHRoYXQgdGhlIHZhbHVlIG9mIENSQy0zMiBpcworICAgICAgICAgIGluZGVwZW5kZW50IG9mIHRoZSBjb21wcmVzc2lvbiBzZXR0aW5nLiBTbywgaXQgc2hvdWxkIGJlIGVhc3kgdG8gcGFzcyB0aGlzCisgICAgICAgICAgaW5mb3JtYXRpb24gb24gdG8gdGhlIG91dHB1dCBlbnRyeS4KKyAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIG5hbWUgPSBpbnB1dEVudHJ5LmdldE5hbWUoKTsKKworICAgICAgICBpZiAoIShpbnB1dEVudHJ5LmlzRGlyZWN0b3J5KCkgfHwgbmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gemlwLmdldElucHV0U3RyZWFtKHppcC5nZXRFbnRyeShuYW1lKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzTmFtZVJlYWRlci5nZXRDbGFzc05hbWUoaW5wdXQpOworCisgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFppcEVudHJ5IG91dHB1dEVudHJ5ID0gbmV3IFppcEVudHJ5KG5hbWUpOworCisgICAgICAgIG91dHB1dEVudHJ5LnNldFRpbWUoaW5wdXRFbnRyeS5nZXRUaW1lKCkpOworICAgICAgICBvdXRwdXRFbnRyeS5zZXRFeHRyYShpbnB1dEVudHJ5LmdldEV4dHJhKCkpOworICAgICAgICBvdXRwdXRFbnRyeS5zZXRDb21tZW50KGlucHV0RW50cnkuZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgb3V0cHV0RW50cnkuc2V0VGltZShpbnB1dEVudHJ5LmdldFRpbWUoKSk7CisgICAgICAgIGlmIChjb21wcmVzc2lvbikgeworICAgICAgICAgICAgb3V0cHV0RW50cnkuc2V0TWV0aG9kKFppcEVudHJ5LkRFRkxBVEVEKTsKKyAgICAgICAgICAgIC8vTm90ZSwgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHNpemUgb3IgY3JjIGZvciBjb21wcmVzc2VkIGZpbGVzLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0cHV0RW50cnkuc2V0TWV0aG9kKFppcEVudHJ5LlNUT1JFRCk7CisgICAgICAgICAgICBvdXRwdXRFbnRyeS5zZXRDcmMoaW5wdXRFbnRyeS5nZXRDcmMoKSk7CisgICAgICAgICAgICBvdXRwdXRFbnRyeS5zZXRTaXplKGlucHV0RW50cnkuZ2V0U2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0cHV0RW50cnk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIE5lY2Vzc2FyeSBpbiB0aGUgY2FzZSB3aGVyZSB5b3UgYWRkIGEgZW50cnkgdGhhdAorICAgICAqIGlzIG5vdCBjb21wcmVzc2VkLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBjYWxjQ2hlY2tzdW0oRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmKSk7CisKKyAgICAgICAgcmV0dXJuIGNhbGNDaGVja3N1bShpbik7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIE5lY2Vzc2FyeSBpbiB0aGUgY2FzZSB3aGVyZSB5b3UgYWRkIGEgZW50cnkgdGhhdAorICAgICAqIGlzIG5vdCBjb21wcmVzc2VkLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBjYWxjQ2hlY2tzdW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENSQzMyIGNyYyA9IG5ldyBDUkMzMigpOworICAgICAgICBpbnQgbGVuID0gYnVmZmVyLmxlbmd0aDsKKyAgICAgICAgaW50IGNvdW50ID0gLTE7CisgICAgICAgIGludCBoYXZlUmVhZCA9IDA7CisKKyAgICAgICAgd2hpbGUgKChjb3VudCA9IGluLnJlYWQoYnVmZmVyLCAwLCBsZW4pKSA+IDApIHsKKyAgICAgICAgICAgIGhhdmVSZWFkICs9IGNvdW50OworICAgICAgICAgICAgY3JjLnVwZGF0ZShidWZmZXIsIDAsIGNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICByZXR1cm4gY3JjLmdldFZhbHVlKCk7CisgICAgfQorCisKK30KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvSmFzcGVyNDFNYW5nbGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvSmFzcGVyNDFNYW5nbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5OTM4YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9KYXNwZXI0MU1hbmdsZXIuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIHRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbmFtZSBtYW5nbGluZyBydWxlcyBvZiB0aGUgamFzcGVyIGluIHRvbWNhdDQuMS54CisgKiB3aGljaCBpcyBsaWtlbHkgdG8gcmVtYWluIGZvciBzb21lIHRpbWUKKyAqIEBzZWUgIm9yZy5hcGFjaGUuamFzcGVyLkpzcENvbXBpbGF0aW9uQ29udGV4dCIKKyAqLworcHVibGljIGNsYXNzIEphc3BlcjQxTWFuZ2xlciBpbXBsZW1lbnRzIEpzcE1hbmdsZXIgeworCisKKyAgICAvKioKKyAgICAgKiBtYXAgZnJvbSBhIGpzcCBmaWxlIHRvIGEgamF2YSBmaWxlbmFtZTsgZG9lcyBub3QgZG8gcGFja2FnZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBqc3BGaWxlIGZpbGUKKyAgICAgKiBAcmV0dXJuIGphdmEgZmlsZW5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG1hcEpzcFRvSmF2YU5hbWUoRmlsZSBqc3BGaWxlKSB7CisgICAgICAgIFN0cmluZyBqc3BVcmkgPSBqc3BGaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBpbnQgc3RhcnQgPSBqc3BVcmkubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKSArIDE7CisgICAgICAgIGludCBlbmQgPSBqc3BVcmkubGVuZ3RoKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBtb2RpZmllZENsYXNzTmFtZTsKKyAgICAgICAgbW9kaWZpZWRDbGFzc05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGpzcFVyaS5sZW5ndGgoKSAtIHN0YXJ0KTsKKyAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGpzcFVyaS5jaGFyQXQoc3RhcnQpKQorICAgICAgICAgICAgfHwganNwVXJpLmNoYXJBdChzdGFydCkgPT0gJ18nKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgZmlyc3QgY2hhciBpcyBub3QgYSBzdGFydCBvZiBKYXZhIGlkZW50aWZpZXIgb3IgaXMgXworICAgICAgICAgICAgLy8gcHJlcGVuZCBhICdfJy4KKyAgICAgICAgICAgIG1vZGlmaWVkQ2xhc3NOYW1lLmFwcGVuZCgnXycpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGNoID0ganNwVXJpLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY2gpKSB7CisgICAgICAgICAgICAgICAgbW9kaWZpZWRDbGFzc05hbWUuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgbW9kaWZpZWRDbGFzc05hbWUuYXBwZW5kKCdfJyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1vZGlmaWVkQ2xhc3NOYW1lLmFwcGVuZChtYW5nbGVDaGFyKGNoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vZGlmaWVkQ2xhc3NOYW1lLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFuZ2xlIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHRvIGNyZWF0ZSBhIGxlZ2FsIEphdmEgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFuZ2xlQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgIFN0cmluZyBzID0gSW50ZWdlci50b0hleFN0cmluZyhjaCk7CisgICAgICAgIGludCBuemVyb3MgPSA1IC0gcy5sZW5ndGgoKTsKKyAgICAgICAgY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyWzZdOworICAgICAgICByZXN1bHRbMF0gPSAnXyc7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG56ZXJvczsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSAnMCc7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IG56ZXJvcyArIDEsIGogPSAwOyBpIDwgNjsgaSsrLCBqKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IHMuY2hhckF0KGopOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHRha2luZyBpbiB0aGUgc3Vic3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIGRpcgorICAgICAqIHJldHVybiBhIG5ldyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZXN0aW5hdGlvbiBwYXRoCisgICAgICogQHBhcmFtIHBhdGggbm90IHVzZWQuCisgICAgICogQHJldHVybiBudWxsIGFzIHRoaXMgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAqIEB0b2RvCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBtYXBQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0pzcEMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9Kc3BDLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3MGFkOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9Kc3BDLmphdmEKQEAgLTAsMCArMSw2OTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3A7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuY29tcGlsZXJzLkpzcENvbXBpbGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuY29tcGlsZXJzLkpzcENvbXBpbGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CisKKy8qKgorICogUnVucyBhIEpTUCBjb21waWxlci4KKyAqCisgKiA8cD4gVGhpcyB0YXNrIHRha2VzIHRoZSBnaXZlbiBqc3AgZmlsZXMgYW5kIGNvbXBpbGVzIHRoZW0gaW50byBqYXZhCisgKiBmaWxlcy4gSXQgaXMgdGhlbiB1cCB0byB0aGUgdXNlciB0byBjb21waWxlIHRoZSBqYXZhIGZpbGVzIGludG8gY2xhc3Nlcy4KKyAqCisgKiA8cD4gVGhlIHRhc2sgcmVxdWlyZXMgdGhlIHNyY2RpciBhbmQgZGVzdGRpciBhdHRyaWJ1dGVzIHRvIGJlCisgKiBzZXQuIFRoaXMgVGFzayBpcyBhIE1hdGNoaW5nVGFzaywgc28gdGhlIGZpbGVzIHRvIGJlIGNvbXBpbGVkIGNhbiBiZQorICogc3BlY2lmaWVkIHVzaW5nIGluY2x1ZGVzL2V4Y2x1ZGVzIGF0dHJpYnV0ZXMgb3IgbmVzdGVkIGluY2x1ZGUvZXhjbHVkZQorICogZWxlbWVudHMuIE9wdGlvbmFsIGF0dHJpYnV0ZXMgYXJlIHZlcmJvc2UgKHNldCB0aGUgdmVyYm9zaXR5IGxldmVsIHBhc3NlZAorICogdG8gamFzcGVyKSwgcGFja2FnZSAobmFtZSBvZiB0aGUgZGVzdGluYXRpb24gcGFja2FnZSBmb3IgZ2VuZXJhdGVkIGphdmEKKyAqIGNsYXNzZXMgYW5kIGNsYXNzcGF0aCAodGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBydW5uaW5nIHRoZSBqc3AKKyAqIGNvbXBpbGVyKS4KKyAqIDxwPiBUaGlzIHRhc2sgc3VwcG9ydHMgdGhlIG5lc3RlZCBlbGVtZW50cyBjbGFzc3BhdGggKEEgUGF0aCkgYW5kCisgKiBjbGFzc3BhdGhyZWYgKEEgUmVmZXJlbmNlKSB3aGljaCBjYW4gYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIHRoZQorICogYXR0cmlidXRlIGNsYXNzcGF0aCwgaWYgdGhlIGpzcCBjb21waWxlciBpcyBub3QgYWxyZWFkeSBpbiB0aGUgYW50CisgKiBjbGFzc3BhdGguCisgKgorICogPHA+PGg0PlVzYWdlPC9oND4KKyAqIDxwcmU+CisgKiAmbHQ7anNwYyBzcmNkaXI9IiR7YmFzZWRpcn0vc3JjL3dhciIKKyAqICAgICAgIGRlc3RkaXI9IiR7YmFzZWRpcn0vZ2Vuc3JjIgorICogICAgICAgcGFja2FnZT0iY29tLmkzc3AuanNwIgorICogICAgICAgdmVyYm9zZT0iOSImZ3Q7CisgKiAgICZsdDtpbmNsdWRlIG5hbWU9IioqXC8qLmpzcCIgLyZndDsKKyAqICZsdDsvanNwYyZndDsKKyAqIDwvcHJlPgorICoKKyAqIDxwPiBMYXJnZSBBbW91bnQgb2YgY3V0dGluZyBhbmQgcGFzdGluZyBmcm9tIHRoZSBKYXZhYyB0YXNrLi4uCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBKc3BDIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKyAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOworICAgIHByaXZhdGUgUGF0aCBjb21waWxlckNsYXNzcGF0aDsKKyAgICBwcml2YXRlIFBhdGggc3JjOworICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOworICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lOworICAgIC8qKiBuYW1lIG9mIHRoZSBjb21waWxlciB0byB1c2UgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21waWxlck5hbWUgPSAiamFzcGVyIjsKKworICAgIC8qKgorICAgICAqICAtaWVwbHVnaW4gJmx0O2Nsc2lkJmd0OyBKYXZhIFBsdWdpbiBjbGFzc2lkIGZvciBJbnRlcm5ldCBFeHBsb3JlcgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGllcGx1Z2luaWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1hcHBlZDsKKyAgICBwcml2YXRlIGludCB2ZXJib3NlID0gMDsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBWZWN0b3IgY29tcGlsZUxpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgVmVjdG9yIGphdmFGaWxlcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqICBmbGFnIHRvIGNvbnRyb2wgYWN0aW9uIG9uIGV4ZWN1dGlvbiB0cm91YmxlCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOworCisgICAgLyoqCisgICAgICogIC11cmlyb290ICZsdDtkaXImZ3Q7IFRoZSByb290IGRpcmVjdG9yeSB0aGF0IHVyaSBmaWxlcyBzaG91bGQgYmUgcmVzb2x2ZWQKKyAgICAgKiAgYWdhaW5zdCwKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdXJpcm9vdDsKKworICAgIC8qKgorICAgICAqICAtd2ViaW5jICZsdDtmaWxlJmd0OyBDcmVhdGVzIHBhcnRpYWwgc2VydmxldCBtYXBwaW5ncyBmb3IgdGhlIC13ZWJhcHAgb3B0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHdlYmluYzsKKworICAgIC8qKgorICAgICAqICAtd2VieG1sICZsdDtmaWxlJmd0OyBDcmVhdGVzIGEgY29tcGxldGUgd2ViLnhtbCB3aGVuIHVzaW5nIHRoZSAtd2ViYXBwIG9wdGlvbi4KKyAgICAgKi8KKworICAgIHByaXZhdGUgRmlsZSB3ZWJ4bWw7CisKKyAgICAvKioKKyAgICAgKiAgd2ViIGFwcHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgV2ViQXBwUGFyYW1ldGVyIHdlYkFwcDsKKworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTF9NU0cKKyAgICAgICAgPSAiQ29tcGlsZSBmYWlsZWQsIG1lc3NhZ2VzIHNob3VsZCBoYXZlIGJlZW4gcHJvdmlkZWQuIjsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggZm9yIHNvdXJjZSBKU1AgZmlsZXMuCisgICAgICogQHBhcmFtIHNyY0RpciB0aGUgc291cmNlIHBhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjRGlyKFBhdGggc3JjRGlyKSB7CisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgc3JjID0gc3JjRGlyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjLmFwcGVuZChzcmNEaXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzb3VyY2UgZGlyLgorICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldFNyY0RpcigpIHsKKyAgICAgICAgcmV0dXJuIHNyYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKU1Agc291cmNlCisgICAgICogZmlsZXMgc2hvdWxkIGJlIGNvbXBpbGVkLgorICAgICAqIEBwYXJhbSBkZXN0RGlyIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RGVzdGRpcigpIHsKKyAgICAgICAgcmV0dXJuIGRlc3REaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoZSBjb21waWxlZCBqc3AgZmlsZXMgc2hvdWxkIGJlIGluLgorICAgICAqIEBwYXJhbSBwa2cgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZShTdHJpbmcgcGtnKSB7CisgICAgICAgIHRoaXMucGFja2FnZU5hbWUgPSBwa2c7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlLgorICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCkgeworICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2ZXJib3NlIGxldmVsIG9mIHRoZSBjb21waWxlcgorICAgICAqIEBwYXJhbSBpIHRoZSB2ZXJib3NlIGxldmVsIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGludCBpKSB7CisgICAgICAgIHZlcmJvc2UgPSBpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVyYm9zZSBsZXZlbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFZlcmJvc2UoKSB7CisgICAgICAgIHJldHVybiB2ZXJib3NlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBidWlsZCBzaG91bGQgaGFsdCBpZiBjb21waWxhdGlvbiBmYWlscy4KKyAgICAgKiBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmFpbCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvbmVycm9yKGJvb2xlYW4gZmFpbCkgeworICAgICAgICBmYWlsT25FcnJvciA9IGZhaWw7CisgICAgfQorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZhaWxvbmVycm9yIGZsYWcuCisgICAgICogQHJldHVybiB0aGUgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRGYWlsb25lcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIGZhaWxPbkVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgSUUgQ0xBU1NJRCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEllcGx1Z2luKCkgeworICAgICAgICByZXR1cm4gaWVwbHVnaW5pZDsKKyAgICB9CisgICAgLyoqCisgICAgICogSmF2YSBQbHVnaW4gQ0xBU1NJRCBmb3IgSW50ZXJuZXQgRXhwbG9yZXIKKyAgICAgKiBAcGFyYW0gaWVwbHVnaW5pZCB0aGUgaWQgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEllcGx1Z2luKFN0cmluZyBpZXBsdWdpbmlkKSB7CisgICAgICAgIHRoaXMuaWVwbHVnaW5pZCA9IGllcGx1Z2luaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZ2VuZXJhdGUgc2VwYXJhdGUgd3JpdGUoKSBjYWxscyBmb3IgZWFjaCBIVE1MIGxpbmUKKyAgICAgKiBpbiB0aGUgSlNQLgorICAgICAqIEByZXR1cm4gbWFwcGluZyBzdGF0dXMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBnZW5lcmF0ZSBzZXBhcmF0ZSB3cml0ZSgpIGNhbGxzIGZvciBlYWNoIEhUTUwgbGluZQorICAgICAqIGluIHRoZSBKU1AuCisgICAgICogQHBhcmFtIG1hcHBlZCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZChib29sZWFuIG1hcHBlZCkgeworICAgICAgICB0aGlzLm1hcHBlZCA9IG1hcHBlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIGNvbnRleHQgb2YgcmVsYXRpdmUgVVJJIHJlZmVyZW5jZXMgaW4gdGhlIEpTUCBwYWdlcy4KKyAgICAgKiBJZiBpdCBkb2VzIG5vdCBleGlzdCB0aGVuIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgbG9jYXRpb24KKyAgICAgKiBvZiB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgZGVjbGFyZWQgb3IgZGVyaXZlZCB2YWx1ZSBvZiB1cmlyb290LgorICAgICAqCisgICAgICogQHBhcmFtICB1cmliYXNlICBUaGUgbmV3IFVyaWJhc2UgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcmliYXNlKEZpbGUgdXJpYmFzZSkgeworICAgICAgICBsb2coIlVyaWJhc2UgaXMgY3VycmVudGx5IGFuIHVudXNlZCBwYXJhbWV0ZXIiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVyaSBiYXNlIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFVyaWJhc2UoKSB7CisgICAgICAgIHJldHVybiB1cmlyb290OworICAgIH0KKworICAgIC8qKgorICAgICAqICBUaGUgcm9vdCBkaXJlY3RvcnkgdGhhdCB1cmkgZmlsZXMgc2hvdWxkIGJlIHJlc29sdmVkCisgICAgICogIGFnYWluc3QuIChEZWZhdWx0IGlzIHRoZSBkaXJlY3RvcnkganNwYyBpcyBpbnZva2VkIGZyb20pCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHVyaXJvb3QgIFRoZSBuZXcgVXJpYmFzZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVyaXJvb3QoRmlsZSB1cmlyb290KSB7CisgICAgICAgIHRoaXMudXJpcm9vdCA9IHVyaXJvb3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB1cmkgcm9vdCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRVcmlyb290KCkgeworICAgICAgICByZXR1cm4gdXJpcm9vdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCisgICAgICogQHBhcmFtIGNwIHRoZSBwYXRoIHRvIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY3ApIHsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBjcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoY3ApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUKKyAgICAgKiBAcGFyYW0gciBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGFzc3BhdGguCisgICAgICogQHJldHVybiB0aGUgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHRvIGZpbmQgdGhpcyBjb21waWxlciBhZGFwdGVyCisgICAgICogQHBhcmFtIGNwIHRoZSBjb21waWxlciBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXJjbGFzc3BhdGgoUGF0aCBjcCkgeworICAgICAgICBpZiAoY29tcGlsZXJDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZXJDbGFzc3BhdGggPSBjcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbXBpbGVyQ2xhc3NwYXRoLmFwcGVuZChjcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGNsYXNzcGF0aCB1c2VkIHRvIGZpbmQgdGhlIGNvbXBpbGVyIGFkYXB0ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21waWxlciBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Q29tcGlsZXJjbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjb21waWxlckNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IG5lc3RlZCBjb21waWxlciBjbGFzc3BhdGgsIHVzZWQgdG8gbG9jYXRlIGNvbXBpbGVyIGFkYXB0ZXIKKyAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNvbXBpbGVyY2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoY29tcGlsZXJDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZXJDbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21waWxlckNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIEZpbGVuYW1lIGZvciB3ZWIueG1sLgorICAgICAqCisgICAgICogQHBhcmFtICB3ZWJ4bWwgIFRoZSBuZXcgV2VieG1sIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2VieG1sKEZpbGUgd2VieG1sKSB7CisgICAgICAgIHRoaXMud2VieG1sID0gd2VieG1sOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGVuYW1lIGZvciB3ZWIueG1sLgorICAgICAqIEByZXR1cm4gVGhlIGZpbGVuYW1lIGZvciB3ZWIueG1sLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFdlYnhtbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud2VieG1sOworICAgIH0KKworICAgIC8qKgorICAgICAqICBvdXRwdXQgZmlsZW5hbWUgZm9yIHRoZSBmcmFjdGlvbiBvZiB3ZWIueG1sIHRoYXQgbGlzdHMKKyAgICAgKiAgc2VydmxldHMuCisgICAgICogQHBhcmFtICB3ZWJpbmMgIFRoZSBuZXcgV2ViaW5jIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2ViaW5jKEZpbGUgd2ViaW5jKSB7CisgICAgICAgIHRoaXMud2ViaW5jID0gd2ViaW5jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgd2ViaW5jIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB3ZWJpbmMgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFdlYmluYygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud2ViaW5jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzaW5nbGUgd2ViYXBwLgorICAgICAqCisgICAgICogQHBhcmFtICB3ZWJhcHBQYXJhbSAgYWRkIGEgd2ViIGFwcCBwYXJhbWV0ZXIKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG1vcmUgdGhhbiBvbmUgd2ViYXBwIGlzIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXZWJBcHAoV2ViQXBwUGFyYW1ldGVyIHdlYmFwcFBhcmFtKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvL2RlbWFuZCBjcmVhdGUgdmVjdG9yIG9mIGZpbGVzZXRzCisgICAgICAgIGlmICh3ZWJBcHAgPT0gbnVsbCkgeworICAgICAgICAgICAgd2ViQXBwID0gd2ViYXBwUGFyYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIHdlYmFwcCBjYW4gYmUgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHdlYiBhcHAuCisgICAgICogQHJldHVybiB0aGUgd2ViIGFwcCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIFdlYkFwcFBhcmFtZXRlciBnZXRXZWJBcHAoKSB7CisgICAgICAgIHJldHVybiB3ZWJBcHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgbmFtZSBvZiBhIEpTUCBjb21waWxlciBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBjb21waWxlciB0aGUgY29tcGlsZXIgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21waWxlcihTdHJpbmcgY29tcGlsZXIpIHsKKyAgICAgICAgdGhpcy5jb21waWxlck5hbWUgPSBjb21waWxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIGdldCB0aGUgbGlzdCBvZiBmaWxlcyB0byBjb21waWxlCisgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzLgorICAgICovCisgICAgcHVibGljIFZlY3RvciBnZXRDb21waWxlTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIGV4ZWN1dGUgYnkgYnVpbGRpbmcgdXAgYSBsaXN0IG9mIGZpbGVzIHRoYXQKKyAgICAgKiBoYXZlIGNoYW5nZWQgYW5kIGhhbmQgdGhlbSBvZmYgdG8gYSBqc3AgY29tcGlsZXIKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlJ3ZlIGdvdCBhIGRlc3RkaXIKKyAgICAgICAgaWYgKGRlc3REaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0ZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFkZXN0RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGVzdGluYXRpb24gZGlyZWN0b3J5IFwiIiArIGRlc3REaXIKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5IiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGRlc3QgPSBnZXRBY3R1YWxEZXN0RGlyKCk7CisKKyAgICAgICAgLy9iaW5kIHRvIGEgY29tcGlsZXIKKyAgICAgICAgSnNwQ29tcGlsZXJBZGFwdGVyIGNvbXBpbGVyID0KKyAgICAgICAgICAgIEpzcENvbXBpbGVyQWRhcHRlckZhY3RvcnkuZ2V0Q29tcGlsZXIoY29tcGlsZXJOYW1lLCB0aGlzLAorICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjb21waWxlckNsYXNzcGF0aCkpOworCisgICAgICAgIC8vaWYgd2UgYXJlIGEgd2ViYXBwLCBoYW5kIG9mZiB0byB0aGUgY29tcGlsZXIsIHdoaWNoIGhhZCBiZXR0ZXIgaGFuZGxlIGl0CisgICAgICAgIGlmICh3ZWJBcHAgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9Db21waWxhdGlvbihjb21waWxlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSd2ZSBnb3QgYSBzcmNkaXIKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgW10gbGlzdCA9IHNyYy5saXN0KCk7CisgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIGlmIHRoZSBjb21waWxlciBkb2VzIGl0cyBvd24gZGVwZW5kZW5jeSBzdHVmZiwgd2UganVzdCBjYWxsIGl0IHJpZ2h0IG5vdworICAgICAgICBpZiAoY29tcGlsZXIuaW1wbGVtZW50c093bkRlcGVuZGVuY3lDaGVja2luZygpKSB7CisgICAgICAgICAgICBkb0NvbXBpbGF0aW9uKGNvbXBpbGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vdGhlIHJlbWFpbmRlciBvZiB0aGlzIG1ldGhvZCBpcyBvbmx5IGZvciBjb21waWxlcnMgdGhhdCBuZWVkIHRoZWlyIGRlcGVuZGVuY3kgd29yayBkb25lCisgICAgICAgIEpzcE1hbmdsZXIgbWFuZ2xlciA9IGNvbXBpbGVyLmNyZWF0ZU1hbmdsZXIoKTsKKworICAgICAgICAvLyBzY2FuIHNvdXJjZSBkaXJlY3RvcmllcyBhbmQgZGVzdCBkaXJlY3RvcnkgdG8gYnVpbGQgdXAgYm90aCBjb3B5CisgICAgICAgIC8vIGxpc3RzIGFuZCBjb21waWxlIGxpc3RzCisgICAgICAgIHJlc2V0RmlsZUxpc3RzKCk7CisgICAgICAgIGludCBmaWxlY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgc3JjRGlyID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGxpc3RbaV0pOworICAgICAgICAgICAgaWYgKCFzcmNEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBcIiIgKyBzcmNEaXIuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IGV4aXN0ISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHRoaXMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihzcmNEaXIpOworICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgICAgICBmaWxlY291bnQgPSBmaWxlcy5sZW5ndGg7CisgICAgICAgICAgICBzY2FuRGlyKHNyY0RpciwgZGVzdCwgbWFuZ2xlciwgZmlsZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29tcGlsZSB0aGUgc291cmNlIGZpbGVzCisKKyAgICAgICAgbG9nKCJjb21waWxpbmcgIiArIGNvbXBpbGVMaXN0LnNpemUoKSArICIgZmlsZXMiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBpZiAoY29tcGlsZUxpc3Quc2l6ZSgpID4gMCkgeworCisgICAgICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgY29tcGlsZUxpc3Quc2l6ZSgpICsgIiBzb3VyY2UgZmlsZSIKKyAgICAgICAgICAgICAgICArIChjb21waWxlTGlzdC5zaXplKCkgPT0gMSA/ICIiIDogInMiKQorICAgICAgICAgICAgICAgICsgIiB0byAiCisgICAgICAgICAgICAgICAgKyBkZXN0KTsKKyAgICAgICAgICAgIGRvQ29tcGlsYXRpb24oY29tcGlsZXIpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZmlsZWNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBsb2coInRoZXJlIHdlcmUgbm8gZmlsZXMgdG8gY29tcGlsZSIsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coImFsbCBmaWxlcyBhcmUgdXAgdG8gZGF0ZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2FsY3VsYXRlIHdoZXJlIHRoZSBmaWxlcyB3aWxsIGVuZCB1cDoKKyAgICAgKiB0aGlzIGlzIGRlc3REaXIgb3IgaXQgaWQgZGVzdERpciArIHRoZSBwYWNrYWdlIG5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZ2V0QWN0dWFsRGVzdERpcigpIHsKKyAgICAgICAgRmlsZSBkZXN0ID0gbnVsbDsKKyAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3QgPSBkZXN0RGlyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkZXN0RGlyLmdldFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yQ2hhcgorICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICBkZXN0ID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogZG8gdGhlIGNvbXBpbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZG9Db21waWxhdGlvbihKc3BDb21waWxlckFkYXB0ZXIgY29tcGlsZXIpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBwb3B1bGF0ZSB0aGUgY29tcGlsZXIgYWRhcHRlcgorICAgICAgICBjb21waWxlci5zZXRKc3BjKHRoaXMpOworCisgICAgICAgIC8vIGZpbmFsbHksIGxldHMgZXhlY3V0ZSB0aGUgY29tcGlsZXIhIQorICAgICAgICBpZiAoIWNvbXBpbGVyLmV4ZWN1dGUoKSkgeworICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEZBSUxfTVNHLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKEZBSUxfTVNHLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgY29tcGlsZWQgYW5kIGNvcGllZC4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRGaWxlTGlzdHMoKSB7CisgICAgICAgIGNvbXBpbGVMaXN0LnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbnMgdGhlIGRpcmVjdG9yeSBsb29raW5nIGZvciBzb3VyY2UgZmlsZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICogVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIHRoZSBjbGFzcyB2YXJpYWJsZSBjb21waWxlTGlzdAorICAgICAqIEBwYXJhbSBzcmNEaXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGRlc3QgICB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBtYW5nbGVyIHRoZSBqc3AgZmlsZW5hbWUgbWFuZ2xlci4KKyAgICAgKiBAcGFyYW0gZmlsZXMgICB0aGUgZmlsZSBuYW1lcyB0byBtYW5nbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2NhbkRpcigKKyAgICAgICAgRmlsZSBzcmNEaXIsIEZpbGUgZGVzdCwgSnNwTWFuZ2xlciBtYW5nbGVyLCBTdHJpbmdbXSBmaWxlcykgeworCisgICAgICAgIGxvbmcgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlc1tpXTsKKyAgICAgICAgICAgIEZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0RpciwgZmlsZW5hbWUpOworICAgICAgICAgICAgRmlsZSBqYXZhRmlsZSA9IG1hcFRvSmF2YUZpbGUobWFuZ2xlciwgc3JjRmlsZSwgc3JjRGlyLCBkZXN0KTsKKyAgICAgICAgICAgIGlmIChqYXZhRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzcmNGaWxlLmxhc3RNb2RpZmllZCgpID4gbm93KSB7CisgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBmaWxlIG1vZGlmaWVkIGluIHRoZSBmdXR1cmU6ICIgKyBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRDb21waWxlID0gZmFsc2U7CisgICAgICAgICAgICBzaG91bGRDb21waWxlID0gaXNDb21waWxlTmVlZGVkKHNyY0ZpbGUsIGphdmFGaWxlKTsKKyAgICAgICAgICAgIGlmIChzaG91bGRDb21waWxlKSB7CisgICAgICAgICAgICAgICBjb21waWxlTGlzdC5hZGRFbGVtZW50KHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgamF2YUZpbGVzLmFkZEVsZW1lbnQoamF2YUZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aGV0aGVyIG9yIG5vdCBjb21waWxhdGlvbiBpcyBuZWVkZWQuIEEgcmV0dXJuIHZhbHVlIG9mCisgICAgICogPGNvZGU+dHJ1ZTxjb2RlPiBtZWFucyB5ZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBtZWFucworICAgICAqIG91ciB0ZXN0cyBkbyBub3QgaW5kaWNhdGUgdGhpcywgYnV0IGFzIHRoZSBUTERzIGFyZQorICAgICAqIG5vdCB1c2VkIGZvciBkZXBlbmRlbmN5IGNoZWNraW5nIHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuCisgICAgICogVGhlIGN1cnJlbnQgdGVzdHMgYXJlCisgICAgICogPG9sPgorICAgICAqIDxsaT5ubyBkZXN0IGZpbGUKKyAgICAgKiA8bGk+ZGVzdCBmaWxlIG91dCBvZiBkYXRlIHcuci50IHNvdXJjZQorICAgICAqIDxsaT5kZXN0IGZpbGUgemVybyBieXRlcyBsb25nCisgICAgICogPC9vbD4KKyAgICAgKiBAcGFyYW0gc3JjRmlsZSBKU1Agc291cmNlIGZpbGUKKyAgICAgKiBAcGFyYW0gamF2YUZpbGUgSlNQIGRlc3QgZmlsZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIGNvbXBpbGUgaXMgZGVmaW5hdGVseSBuZWVkZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21waWxlTmVlZGVkKEZpbGUgc3JjRmlsZSwgRmlsZSBqYXZhRmlsZSkgeworICAgICAgICBib29sZWFuIHNob3VsZENvbXBpbGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFqYXZhRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgc2hvdWxkQ29tcGlsZSA9IHRydWU7CisgICAgICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgc3JjRmlsZS5nZXRQYXRoKCkKKyAgICAgICAgICAgICAgICArICIgYmVjYXVzZSBqYXZhIGZpbGUgIiArIGphdmFGaWxlLmdldFBhdGgoKQorICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGphdmFGaWxlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNob3VsZENvbXBpbGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgc3JjRmlsZS5nZXRQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWNhdXNlIGl0IGlzIG91dCBvZiBkYXRlIHdpdGggcmVzcGVjdCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGphdmFGaWxlLmdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhRmlsZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRDb21waWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ29tcGlsaW5nICIgKyBzcmNGaWxlLmdldFBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWNhdXNlIGphdmEgZmlsZSAiICsgamF2YUZpbGUuZ2V0UGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGVtcHR5IiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNob3VsZENvbXBpbGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBnZXQgYSBmaWxlbmFtZSBmcm9tIG91ciBqc3AgZmlsZS4KKyAgICAgKiBAcGFyYW0gbWFuZ2xlciB0aGUganNwIGZpbGVuYW1lIG1hbmFnbGVyLgorICAgICAqIEBwYXJhbSBzcmNGaWxlIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgKiBAcGFyYW0gc3JjRGlyICB0aGUgc291cmNlIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gZGVzdCAgICB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4gdGhlIGZpbGVuYW1lLgorICAgICAqIEB0b2RvIHN1cHBvcnQgcGFja2FnZXMgYW5kIHN1YmRpcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBtYXBUb0phdmFGaWxlKEpzcE1hbmdsZXIgbWFuZ2xlciwgRmlsZSBzcmNGaWxlLCBGaWxlIHNyY0RpciwgRmlsZSBkZXN0KSB7CisgICAgICAgIGlmICghc3JjRmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qc3AiKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGphdmFGaWxlTmFtZSA9IG1hbmdsZXIubWFwSnNwVG9KYXZhTmFtZShzcmNGaWxlKTsKKy8vICAgICAgICBTdHJpbmcgc3JjRmlsZURpcj1zcmNGaWxlLmdldFBhcmVudCgpOworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGVzdCwgamF2YUZpbGVOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkZWxldGUgYW55IGphdmEgb3V0cHV0IGZpbGVzIHRoYXQgYXJlIGVtcHR5CisgICAgICogdGhpcyBpcyB0byBnZXQgYXJvdW5kIGEgbGl0dGxlIGRlZmVjdCBpbiBqYXNwZXI6IHdoZW4gaXQKKyAgICAgKiBmYWlscywgaXQgbGVhdmVzIGluY29tcGxldGUgZmlsZXMgYXJvdW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUVtcHR5SmF2YUZpbGVzKCkgeworICAgICAgICBpZiAoamF2YUZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBqYXZhRmlsZXMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJkZWxldGluZyBlbXB0eSBvdXRwdXQgZmlsZSAiICsgZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc3RhdGljIGlubmVyIGNsYXNzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2ViQXBwUGFyYW1ldGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogdGhlIHNvbGUgb3B0aW9uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEZpbGUgZGlyZWN0b3J5OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBxdWVyeSBjdXJyZW50IGRpcmVjdG9yeQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkaXJlY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmlsZSBnZXREaXJlY3RvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gZGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNldCBkaXJlY3Rvcnk7IGFsdGVybmF0ZSBzeW50YXgKKyAgICAgICAgICogQHBhcmFtIGRpcmVjdG9yeSB0aGUgYmFzZSBkaXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYXNlRGlyKEZpbGUgZGlyZWN0b3J5KSB7CisgICAgICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKyAgICAgICAgfQorICAgIC8vZW5kIGlubmVyIGNsYXNzCisgICAgfQorCisKKy8vZW5kIGNsYXNzCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvSnNwTWFuZ2xlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0pzcE1hbmdsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjI0OTJjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0pzcE1hbmdsZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBUaGlzIGlzIGFuIGludGVyZmFjZSB0byB0aGUgTWFuZ2xlciBzZXJ2aWNlIHRoYXQganNwYyBuZWVkcyB0byBtYXAKKyAqIEpTUCBmaWxlIG5hbWVzIHRvIGphdmEgZmlsZXMuCisgKiBOb3RlIHRoZSBjb21wbGV0ZSBsYWNrIG9mIGNvcnJlbGF0aW9uCisgKiB3aXRoIEphc3BlcidzIG1hbmdsZXIgaW50ZXJmYWNlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEpzcE1hbmdsZXIgeworCisKKyAgICAvKioKKyAgICAgKiBtYXAgZnJvbSBhIGpzcCBmaWxlIHRvIGEgamF2YSBmaWxlbmFtZTsgZG9lcyBub3QgZG8gcGFja2FnZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBqc3BGaWxlIGZpbGUKKyAgICAgKiBAcmV0dXJuIGphdmEgZmlsZW5hbWUKKyAgICAgKi8KKyAgICBTdHJpbmcgbWFwSnNwVG9KYXZhTmFtZShGaWxlIGpzcEZpbGUpOworCisgICAgLyoqCisgICAgICogdGFraW5nIGluIHRoZSBzdWJzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZGlyCisgICAgICogcmV0dXJuIGEgbmV3IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlc3RpbmF0aW9uIHBhdGgKKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBtYXAuCisgICAgICogQHJldHVybiB0aGUgbWFwcGVkIHBhdGguCisgICAgICovCisgICAgU3RyaW5nIG1hcFBhdGgoU3RyaW5nIHBhdGgpOworCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvSnNwTmFtZU1hbmdsZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9Kc3BOYW1lTWFuZ2xlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYWFlNWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvSnNwTmFtZU1hbmdsZXIuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3A7CitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBUaGlzIGlzIGEgY2xhc3MgZGVyaXZlZCBmcm9tIHRoZSBKYXNwZXIgY29kZQorICogKG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkNvbW1hbmRMaW5lQ29tcGlsZXIpIHRvIG1hcCBmcm9tIGEgSlNQIGZpbGVuYW1lCisgKiB0byBhIHZhbGlkIEphdmEgY2xhc3NuYW1lLgorICoKKyAqLworcHVibGljIGNsYXNzIEpzcE5hbWVNYW5nbGVyIGltcGxlbWVudHMgSnNwTWFuZ2xlciB7CisKKyAgICAvLyBDaGVja1N0eWxlOkNvbnN0YW50TmFtZUNoZWNrIE9GRiAtIGJjCisKKyAgICAvKioKKyAgICAgKiB0aGlzIGlzIHRoZSBsaXN0IG9mIGtleXdvcmRzIHdoaWNoIGNhbiBub3QgYmUgdXNlZCBhcyBjbGFzc25hbWVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBrZXl3b3JkcyA9IHsKKyAgICAgICAgICAgICJhc3NlcnQiLAorICAgICAgICAgICAgImFic3RyYWN0IiwgImJvb2xlYW4iLCAiYnJlYWsiLCAiYnl0ZSIsCisgICAgICAgICAgICAiY2FzZSIsICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwKKyAgICAgICAgICAgICJjb25zdCIsICJjb250aW51ZSIsICJkZWZhdWx0IiwgImRvIiwKKyAgICAgICAgICAgICJkb3VibGUiLCAiZWxzZSIsICJleHRlbmRzIiwgImZpbmFsIiwKKyAgICAgICAgICAgICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsICJnb3RvIiwKKyAgICAgICAgICAgICJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsCisgICAgICAgICAgICAiaW5zdGFuY2VvZiIsICJpbnQiLCAiaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICJsb25nIiwgIm5hdGl2ZSIsICJuZXciLCAicGFja2FnZSIsCisgICAgICAgICAgICAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwKKyAgICAgICAgICAgICJyZXR1cm4iLCAic2hvcnQiLCAic3RhdGljIiwgInN1cGVyIiwKKyAgICAgICAgICAgICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwgInRoaXMiLAorICAgICAgICAgICAgInRocm93IiwgInRocm93cyIsICJ0cmFuc2llbnQiLAorICAgICAgICAgICAgInRyeSIsICJ2b2lkIiwgInZvbGF0aWxlIiwgIndoaWxlIgorICAgICAgICAgICAgfTsKKworICAgIC8vIENoZWNrU3R5bGU6Q29uc3RhbnROYW1lQ2hlY2sgT04KKworICAgIC8qKgorICAgICAqIG1hcCBmcm9tIGEganNwIGZpbGUgdG8gYSBqYXZhIGZpbGVuYW1lOyBkb2VzIG5vdCBkbyBwYWNrYWdlcworICAgICAqCisgICAgICogQHBhcmFtIGpzcEZpbGUgZmlsZQorICAgICAqIEByZXR1cm4gamF2YSBmaWxlbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbWFwSnNwVG9KYXZhTmFtZShGaWxlIGpzcEZpbGUpIHsKKyAgICAgICAgcmV0dXJuIG1hcEpzcFRvQmFzZU5hbWUoanNwRmlsZSkgKyAiLmphdmEiOworICAgIH0KKworCisgICAgLyoqCisgICAgICogbWFwIGZyb20gYSBqc3AgZmlsZSB0byBhIGJhc2UgbmFtZTsgZG9lcyBub3QgZGVhbCB3aXRoIGV4dGVuc2lvbnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBqc3BGaWxlIGpzcEZpbGUgZmlsZQorICAgICAqIEByZXR1cm4gZXhlbnNpb25sZXNzIHBvdGVudGlhbGx5IHJlbWFwcGVkIG5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtYXBKc3BUb0Jhc2VOYW1lKEZpbGUganNwRmlsZSkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lOworICAgICAgICBjbGFzc05hbWUgPSBzdHJpcEV4dGVuc2lvbihqc3BGaWxlKTsKKworICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBtYW5nbGUgZXh0ZW5zaW9ucyBsaWtlIHRoZSBzZXJ2bGV0IGRvZXMsCisgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGtleXdvcmRzIGFzIGNsYXNzIG5hbWVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5d29yZHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZXF1YWxzKGtleXdvcmRzW2ldKSkgeworICAgICAgICAgICAgICAgIGNsYXNzTmFtZSArPSAiJSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGaXggZm9yIGludmFsaWQgY2hhcmFjdGVycy4gSWYgeW91IHRoaW5rIG9mIG1vcmUgYWRkIHRvIHRoZSBsaXN0LgorICAgICAgICBTdHJpbmdCdWZmZXIgbW9kaWZpZWRDbGFzc05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGNsYXNzTmFtZS5sZW5ndGgoKSk7CisgICAgICAgIC8vIGZpcnN0IGNoYXIgaXMgbW9yZSByZXN0cmljdGl2ZSB0aGFuIHRoZSByZXN0CisgICAgICAgIGNoYXIgZmlyc3RDaGFyID0gY2xhc3NOYW1lLmNoYXJBdCgwKTsKKyAgICAgICAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoZmlyc3RDaGFyKSkgeworICAgICAgICAgICAgbW9kaWZpZWRDbGFzc05hbWUuYXBwZW5kKGZpcnN0Q2hhcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtb2RpZmllZENsYXNzTmFtZS5hcHBlbmQobWFuZ2xlQ2hhcihmaXJzdENoYXIpKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aGlzIGlzIHRoZSByZXN0CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY2xhc3NOYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgc3ViQ2hhciA9IGNsYXNzTmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHN1YkNoYXIpKSB7CisgICAgICAgICAgICAgICAgbW9kaWZpZWRDbGFzc05hbWUuYXBwZW5kKHN1YkNoYXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtb2RpZmllZENsYXNzTmFtZS5hcHBlbmQobWFuZ2xlQ2hhcihzdWJDaGFyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vZGlmaWVkQ2xhc3NOYW1lLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBnZXQgc2hvcnQgZmlsZW5hbWUgZnJvbSBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwRmlsZSBmaWxlIGluCisgICAgICogQHJldHVybiBmaWxlIHdpdGhvdXQgYW55IGpzcCBleHRlbnNpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdHJpcEV4dGVuc2lvbihGaWxlIGpzcEZpbGUpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLnJlbW92ZVN1ZmZpeChqc3BGaWxlLmdldE5hbWUoKSwgIi5qc3AiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGRlZmluaXRpb24gb2YgdGhlIGNoYXIgZXNjYXBpbmcgYWxnb3JpdGhtCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ggY2hhciB0byBtYW5nbGUKKyAgICAgKiBAcmV0dXJuIG1hbmdsZWQgc3RyaW5nOyA1IGRpZ2l0IGhleCB2YWx1ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYW5nbGVDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgaWYgKGNoID09IEZpbGUuc2VwYXJhdG9yQ2hhcikgeworICAgICAgICAgICAgY2ggPSAnLyc7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHMgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKTsKKyAgICAgICAgaW50IG56ZXJvcyA9IDUgLSBzLmxlbmd0aCgpOworICAgICAgICBjaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbNl07CisgICAgICAgIHJlc3VsdFswXSA9ICdfJzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbnplcm9zOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9ICcwJzsKKyAgICAgICAgfQorICAgICAgICBpbnQgcmVzdWx0SW5kZXggPSAwOworICAgICAgICBmb3IgKGludCBpID0gbnplcm9zICsgMTsgaSA8IDY7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gcy5jaGFyQXQocmVzdWx0SW5kZXgrKyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVzdWx0KTsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorICAgIH0KKworICAgIC8qKgorICAgICAqIHRha2luZyBpbiB0aGUgc3Vic3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIGRpcgorICAgICAqIHJldHVybiBhIG5ldyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZXN0aW5hdGlvbiBwYXRoCisgICAgICogbm90IHN1cHBvcnRlZCwgYXMgamFzcGVyIGluIHRvbWNhdDQuMCBkb2VzbnQgZWl0aGVyCisgICAgICogQHBhcmFtIHBhdGggbm90IHVzZWQKKyAgICAgKiBAcmV0dXJuIG51bGwgYWx3YXlzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbWFwUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9XTEpzcGMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9XTEpzcGMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGI2NTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL1dMSnNwYy5qYXZhCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcDsKKworLy9hcGFjaGUvYW50IGltcG9ydHMKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIFByZWNvbXBpbGVzIEpTUCdzIHVzaW5nIFdlYkxvZ2ljJ3MgSlNQIGNvbXBpbGVyICh3ZWJsb2dpYy5qc3BjKS4KKyAqCisgKiBUZXN0ZWQgb25seSBvbiBXZWJsb2dpYyA0LjUuMSAtIE5UNC4wIGFuZCBTb2xhcmlzIDUuNworICoKKyAqIHJlcXVpcmVkIGF0dHJpYnV0ZXMKKyAqICAgICAgc3JjIDogcm9vdCBvZiBzb3VyY2UgdHJlZSBmb3IgSlNQLCBpZSwgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHlvdXIgd2VibG9naWMgc2VydmVyCisgKiAgICAgIGRlc3QgOiByb290IG9mIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgd2hhdCB5b3UgaGF2ZSBzZXQgYXMKKyAqICAgICAgICAgICAgIFdvcmtpbmdEaXIgaW4gdGhlIHdlYmxvZ2ljIHByb3BlcnRpZXMKKyAqICAgICAgcGFja2FnZSA6IHN0YXJ0IHBhY2thZ2UgbmFtZSB1bmRlciB3aGljaCB5b3VyIEpTUCdzIHdvdWxkIGJlIGNvbXBpbGVkCisgKgorICogb3RoZXIgYXR0cmlidXRlcworICogICAgIGNsYXNzcGF0aAorICoKKyAqIEEgY2xhc3NwYXRoIHNob3VsZCBiZSBzZXQgd2hpY2ggY29udGFpbnMgdGhlIHdlYmxvZ2ljIGNsYXNzZXMgYXMgd2VsbCBhcyBhbGwKKyAqIGFwcGxpY2F0aW9uIGNsYXNzZXMgcmVmZXJlbmNlZCBieSB0aGUgSlNQLiBUaGUgc3lzdGVtIGNsYXNzcGF0aCBpcyBhbHNvCisgKiBhcHBlbmRlZCB3aGVuIHRoZSBqc3BjIGlzIGNhbGxlZCwgc28geW91IG1heSBjaG9vc2UgdG8gcHV0IGV2ZXJ5dGhpbmcgaW4KKyAqIHRoZSBjbGFzc3BhdGggd2hpbGUgY2FsbGluZyBBbnQuIEhvd2V2ZXIsIHNpbmNlIHByZXN1bWFibHkgdGhlIEpTUCdzIHdpbGwKKyAqIHJlZmVyZW5jZSBjbGFzc2VzIGJlaW5nIGJ1aWxkIGJ5IEFudCwgaXQgd291bGQgYmUgYmV0dGVyIHRvIGV4cGxpY2l0bHkgYWRkCisgKiB0aGUgY2xhc3NwYXRoIGluIHRoZSB0YXNrCisgKgorICogVGhlIHRhc2sgY2hlY2tzIHRpbWVzdGFtcHMgb24gdGhlIEpTUCdzIGFuZCB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMsIGFuZCBjb21waWxlcworICogb25seSB0aG9zZSBmaWxlcyB0aGF0IGhhdmUgY2hhbmdlZC4KKyAqCisgKiBJdCBmb2xsb3dzIHRoZSB3ZWJsb2dpYyBuYW1pbmcgY29udmVudGlvbiBvZiBwdXR0aW5nIGNsYXNzZXMgaW4KKyAqICA8Yj4gX2Rpck5hbWUvX2ZpbGVOYW1lLmNsYXNzIGZvciBkaXJuYW1lL2ZpbGVOYW1lLmpzcCAgIDwvYj4KKyAqCisgKiBMaW1pdGF0aW9uOiBJdCBjb21waWxlcyB0aGUgZmlsZXMgdGhydSB0aGUgQ2xhc3NpYyBjb21waWxlciBvbmx5LgorICogTGltaXRhdGlvbjogU2luY2UgaXQgaXMgbXkgZXhwZXJpZW5jZSB0aGF0IHdlYmxvZ2ljIGpzcGMgdGhyb3dzIG91dCBvZgorICogICAgICAgICAgICAgbWVtb3J5IGVycm9yIG9uIGJlaW5nIGdpdmVuIHRvbyBtYW55IGZpbGVzIGF0IG9uZSBnbywgaXQgaXMKKyAqICAgICAgICAgICAgIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIG9uZSBqc3AgZmlsZSBlYWNoLgorICoKKyAqIDxwcmU+CisgKiBleGFtcGxlCisgKiAmbHQ7dGFyZ2V0IG5hbWU9ImpzcGNvbXBpbGUiIGRlcGVuZHM9ImNvbXBpbGUiJmd0OworICogICAmbHQ7d2xqc3BjIHNyYz0iYzpcXHdlYmxvZ2ljXFxteXNlcnZlclxccHVibGljX2h0bWwiCisgKiAgICAgICAgICAgZGVzdD0iYzpcXHdlYmxvZ2ljXFxteXNlcnZlclxcc2VydmVyY2xhc3NlcyIgcGFja2FnZT0ibXlhcHAuanNwIiZndDsKKyAqICAgJmx0O2NsYXNzcGF0aCZndDsKKyAqICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt3ZWJsb2dpYy5jbGFzc3BhdGh9IiAvJmd0OworICogICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke2NvbXBpbGUuZGVzdH0iIC8mZ3Q7CisgKiAgICAgICZsdDsvY2xhc3NwYXRoJmd0OworICoKKyAqICAgJmx0Oy93bGpzcGMmZ3Q7CisgKiAmbHQ7L3RhcmdldCZndDsKKyAqIDwvcHJlPgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgV0xKc3BjIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKyAgICAvL1RPRE8gVGVzdCBvbiBvdGhlciB2ZXJzaW9ucyBvZiB3ZWJsb2dpYworICAgIC8vVE9ETyBhZGQgbW9yZSBhdHRyaWJ1dGVzIHRvIHRoZSB0YXNrLCB0byB0YWtlIGNhcmUgb2YgYWxsIGpzcGMgb3B0aW9ucworICAgIC8vVE9ETyBUZXN0IG9uIFVuaXgKKworICAgIC8qKiByb290IG9mIGNvbXBpbGVkIGZpbGVzIHRyZWUgKi8KKyAgICBwcml2YXRlIEZpbGUgZGVzdGluYXRpb25EaXJlY3Rvcnk7CisKKyAgICAvKiogcm9vdCBvZiBzb3VyY2UgZmlsZXMgdHJlZSAqLworICAgIHByaXZhdGUgRmlsZSBzb3VyY2VEaXJlY3Rvcnk7CisKKyAgICAvKiogcGFja2FnZSB1bmRlciB3aGljaCByZXN1bHRhbnQgY2xhc3NlcyB3aWxsIHJlc2lkZSAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc3RpbmF0aW9uUGFja2FnZTsKKworICAgIC8qKiBjbGFzc3BhdGggdXNlZCB0byBjb21waWxlIHRoZSBqc3AgZmlsZXMuICovCisgICAgcHJpdmF0ZSBQYXRoIGNvbXBpbGVDbGFzc3BhdGg7CisKKyAgICAvL3ByaXZhdGUgU3RyaW5nIGNvbXBpbGVyUGF0aDsgLy9mdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIGNvbXBpbGVyIGV4ZWN1dGFibGUKKworICAgIHByaXZhdGUgU3RyaW5nIHBhdGhUb1BhY2thZ2UgPSAiIjsKKyAgICBwcml2YXRlIFZlY3RvciBmaWxlc1RvRG8gPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRhc2suCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFkZXN0aW5hdGlvbkRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3RpbmF0aW9uIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgKyBkZXN0aW5hdGlvbkRpcmVjdG9yeS5nZXRQYXRoKCkgKyAiIGlzIG5vdCB2YWxpZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzb3VyY2VEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgZGlyZWN0b3J5ICIKKyAgICAgICAgICAgICAgICArIHNvdXJjZURpcmVjdG9yeS5nZXRQYXRoKCkgKyAiIGlzIG5vdCB2YWxpZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGFja2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInBhY2thZ2UgYXR0cmlidXRlIG11c3QgYmUgcHJlc2VudC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKworICAgICAgICBwYXRoVG9QYWNrYWdlCisgICAgICAgICAgICA9IHRoaXMuZGVzdGluYXRpb25QYWNrYWdlLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICAvLyBnZXQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgc291cmNlRGlyZWN0b3J5CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKHNvdXJjZURpcmVjdG9yeSk7CisKKyAgICAgICAgLy91c2UgdGhlIHN5c3RlbWNsYXNzcGF0aCBhcyB3ZWxsLCB0byBpbmNsdWRlIHRoZSBhbnQgamFyCisgICAgICAgIGlmIChjb21waWxlQ2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXBpbGVDbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisKKyAgICAgICAgY29tcGlsZUNsYXNzcGF0aCA9IGNvbXBpbGVDbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCk7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworCisgICAgICAgIC8vV2VibG9naWMuanNwYyBjYWxscyBTeXN0ZW0uZXhpdCgpIC4uLiBoYXZlIHRvIGZvcmsKKyAgICAgICAgLy8gVGhlcmVmb3JlLCB0YWtlcyBsb2FkcyBvZiB0aW1lCisgICAgICAgIC8vIENhbiBwYXNzIGRpcmVjdG9yaWVzIGF0IGEgdGltZSAoKi5qc3ApIGJ1dCBlYXNpbHkgcnVucyBvdXQgb2YKKyAgICAgICAgLy8gbWVtb3J5IG9uIGhlZnR5IGRpcnMgKGV2ZW4gb24gIGEgU3VuKQorICAgICAgICBKYXZhIGhlbHBlclRhc2sgPSBuZXcgSmF2YSh0aGlzKTsKKyAgICAgICAgaGVscGVyVGFzay5zZXRGb3JrKHRydWUpOworICAgICAgICBoZWxwZXJUYXNrLnNldENsYXNzbmFtZSgid2VibG9naWMuanNwYyIpOworICAgICAgICBoZWxwZXJUYXNrLnNldFRhc2tOYW1lKGdldFRhc2tOYW1lKCkpOworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1sxMl07CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKworICAgICAgICBGaWxlIGpzcEZpbGUgPSBudWxsOworICAgICAgICBTdHJpbmcgcGFyZW50cyA9ICIiOworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIC8vWFhYICB0aGlzIGFycmF5IHN0dWZmIGlzIGEgcmVtbmFudCBvZiBwcmV2IHRyaWFscy4uIGdvdHRhIHJlbW92ZS4KKyAgICAgICAgYXJnc1tqKytdID0gIi1kIjsKKyAgICAgICAgYXJnc1tqKytdID0gZGVzdGluYXRpb25EaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkudHJpbSgpOworICAgICAgICBhcmdzW2orK10gPSAiLWRvY3Jvb3QiOworICAgICAgICBhcmdzW2orK10gPSBzb3VyY2VEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkudHJpbSgpOworICAgICAgICBhcmdzW2orK10gPSAiLWtlZXBnZW5lcmF0ZWQiOworICAgICAgICAvL0NhbGwgY29tcGlsZXIgYXMgY2xhc3MuLi4gZG9udCB3YW50IHRvIGZvcmsgYWdhaW4KKyAgICAgICAgLy9Vc2UgY2xhc3NpYyBjb21waWxlciAtLSBjYW4gYmUgcGFyYW1ldGVyaXNlZD8KKyAgICAgICAgYXJnc1tqKytdID0gICItY29tcGlsZXJjbGFzcyI7CisgICAgICAgIGFyZ3NbaisrXSA9ICJzdW4udG9vbHMuamF2YWMuTWFpbiI7CisgICAgICAgIC8vV2VibG9naWMganNwYyBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgdW5sZXNzIHUgZXhwbGljaXRseSBzZXQgdGhpcy4uLgorICAgICAgICAvLyBEb2VzIG5vdCB0YWtlIHRoZSBjbGFzc3BhdGggZnJvbSB0aGUgZW52Li4uLgorICAgICAgICAvLyBBbSBpIG1pc3Npbmcgc29tZXRoaW5nIGFib3V0IHRoZSBKYXZhIHRhc2s/PworICAgICAgICBhcmdzW2orK10gPSAiLWNsYXNzcGF0aCI7CisgICAgICAgIGFyZ3NbaisrXSA9IGNvbXBpbGVDbGFzc3BhdGgudG9TdHJpbmcoKTsKKworICAgICAgICB0aGlzLnNjYW5EaXIoZmlsZXMpOworICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgZmlsZXNUb0RvLnNpemUoKSArICIgSlNQIGZpbGVzIik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc1RvRG8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIC8vWFhYCisgICAgICAgICAgICAvLyBBbGwgdGhpcyB0byBnZXQgcGFja2FnZSBhY2NvcmRpbmcgdG8gd2VibG9naWMgc3RhbmRhcmRzCisgICAgICAgICAgICAvLyBDYW4gYmUgd3JpdHRlbiBiZXR0ZXIuLi4gdGhpcyBpcyB0b28gaGFja3khCisgICAgICAgICAgICAvLyBDYXJlZnVsLi4gc2ltaWxhciBjb2RlIGluIHNjYW5EaXIgLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50ISEKKyAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IChTdHJpbmcpIGZpbGVzVG9Eby5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBqc3BGaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOworICAgICAgICAgICAgYXJnc1tqXSA9ICItcGFja2FnZSI7CisgICAgICAgICAgICBwYXJlbnRzID0ganNwRmlsZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmICgocGFyZW50cyAhPSBudWxsKSAgJiYgKCEoIiIpLmVxdWFscyhwYXJlbnRzKSkpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRzID0gIHRoaXMucmVwbGFjZVN0cmluZyhwYXJlbnRzLCBGaWxlLnNlcGFyYXRvciwgIl8uIik7CisgICAgICAgICAgICAgICAgYXJnc1tqICsgMV0gPSBkZXN0aW5hdGlvblBhY2thZ2UgKyAiLiIgKyAiXyIgKyBwYXJlbnRzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcmdzW2ogKyAxXSA9IGRlc3RpbmF0aW9uUGFja2FnZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBhcmdzW2ogKyAyXSA9ICBzb3VyY2VEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVuYW1lOworICAgICAgICAgICAgaGVscGVyVGFzay5jbGVhckFyZ3MoKTsKKworICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgaiArIDM7IHgrKykgeworICAgICAgICAgICAgICAgIGhlbHBlclRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoYXJnc1t4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisKKyAgICAgICAgICAgIGhlbHBlclRhc2suc2V0Q2xhc3NwYXRoKGNvbXBpbGVDbGFzc3BhdGgpOworICAgICAgICAgICAgaWYgKGhlbHBlclRhc2suZXhlY3V0ZUphdmEoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbG9nKGZpbGVuYW1lICsgIiBmYWlsZWQgdG8gY29tcGlsZSIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKKyAgICAgICAgaWYgKGNvbXBpbGVDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbXBpbGVDbGFzc3BhdGguYXBwZW5kKGNsYXNzcGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXliZSBjcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50LgorICAgICAqIEByZXR1cm4gYSBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcGlsZUNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2UganNwJ3MKKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIGRpck5hbWUgdGhlIGRpcmVjdG9yeSBjb250YWluZyB0aGUgc291cmNlIGpzcCdzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgZGlyTmFtZSkgeworCisgICAgICAgIHNvdXJjZURpcmVjdG9yeSA9IGRpck5hbWU7CisgICAgfQorCisgICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBqc3AncworICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyTmFtZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5nIHRoZSBzb3VyY2UganNwJ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0KEZpbGUgZGlyTmFtZSkgeworCisgICAgICAgIGRlc3RpbmF0aW9uRGlyZWN0b3J5ID0gZGlyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhY2thZ2UgdW5kZXIgd2hpY2ggdGhlIGNvbXBpbGVkIGNsYXNzZXMgZ28KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgcGFja2FnZSBuYW1lIGZvciB0aGUgY2xhc2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKKworICAgICAgICBkZXN0aW5hdGlvblBhY2thZ2UgPSBwYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FuIHRoZSBhcnJheSBvZiBmaWxlcyBhbmQgYWRkIHRoZSBqc3AKKyAgICAgKiBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgY29tcGlsZWQgdG8gdGhlIGZpbGVzVG9EbyBmaWVsZC4KKyAgICAgKiBAcGFyYW0gZmlsZXMgdGhlIGZpbGVzIHRvIHNjYW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2NhbkRpcihTdHJpbmdbXSBmaWxlcykgeworCisgICAgICAgIGxvbmcgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKyAgICAgICAgRmlsZSBqc3BGaWxlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHBhcmVudHMgPSBudWxsOworICAgICAgICBTdHJpbmcgcGFjayA9ICIiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZSh0aGlzLnNvdXJjZURpcmVjdG9yeSwgZmlsZXNbaV0pOworICAgICAgICAgICAgLy9YWFgKKyAgICAgICAgICAgIC8vIEFsbCB0aGlzIHRvIGNvbnZlcnQgc291cmNlIHRvIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhY2NvcmRpbmcKKyAgICAgICAgICAgIC8vIHRvIHdlYmxvZ2ljIHN0YW5kYXJkcyBDYW4gYmUgd3JpdHRlbiBiZXR0ZXIuLi4gdGhpcyBpcyB0b28gaGFja3khCisgICAgICAgICAgICBqc3BGaWxlID0gbmV3IEZpbGUoZmlsZXNbaV0pOworICAgICAgICAgICAgcGFyZW50cyA9IGpzcEZpbGUuZ2V0UGFyZW50KCk7CisKKyAgICAgICAgICAgIGlmICgocGFyZW50cyAhPSBudWxsKSAgJiYgKCEoIiIpLmVxdWFscyhwYXJlbnRzKSkpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRzID0gIHRoaXMucmVwbGFjZVN0cmluZyhwYXJlbnRzLCBGaWxlLnNlcGFyYXRvciwgIl8vIik7CisgICAgICAgICAgICAgICAgcGFjayA9IHBhdGhUb1BhY2thZ2UgKyBGaWxlLnNlcGFyYXRvciArICJfIiArIHBhcmVudHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhY2sgPSBwYXRoVG9QYWNrYWdlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBwYWNrICsgRmlsZS5zZXBhcmF0b3IgKyAiXyI7CisgICAgICAgICAgICBpbnQgc3RhcnRpbmdJbmRleCA9IGZpbGVzW2ldLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSAhPSAtMQorICAgICAgICAgICAgICAgICAgICA/IGZpbGVzW2ldLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEgOiAwOworICAgICAgICAgICAgaW50IGVuZGluZ0luZGV4ID0gZmlsZXNbaV0uaW5kZXhPZigiLmpzcCIpOworICAgICAgICAgICAgaWYgKGVuZGluZ0luZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGluZyAiICsgZmlsZXNbaV0gKyAiLiBOb3QgYSBKU1AiLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsZVBhdGggKz0gZmlsZXNbaV0uc3Vic3RyaW5nKHN0YXJ0aW5nSW5kZXgsIGVuZGluZ0luZGV4KTsKKyAgICAgICAgICAgIGZpbGVQYXRoICs9ICIuY2xhc3MiOworICAgICAgICAgICAgRmlsZSBjbGFzc0ZpbGUgPSBuZXcgRmlsZSh0aGlzLmRlc3RpbmF0aW9uRGlyZWN0b3J5LCBmaWxlUGF0aCk7CisKKyAgICAgICAgICAgIGlmIChzcmNGaWxlLmxhc3RNb2RpZmllZCgpID4gbm93KSB7CisgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBmaWxlIG1vZGlmaWVkIGluIHRoZSBmdXR1cmU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWxlc1tpXSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNsYXNzRmlsZS5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgICAgIGZpbGVzVG9Eby5hZGRFbGVtZW50KGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICBsb2coIlJlY29tcGlsaW5nIEZpbGUgIiArIGZpbGVzW2ldLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVwbGFjZSBvY2N1cmFuY2VzIG9mIGEgc3RyaW5nIHdpdGggYSByZXBsYWNlbWVudCBzdHJpbmcuCisgICAgICogQHBhcmFtIGlucFN0cmluZyB0aGUgc3RyaW5nIHRvIGNvbnZlcnQuCisgICAgICogQHBhcmFtIGVzY2FwZUNoYXJzIHRoZSBzdHJpbmcgdG8gcmVwbGFjZS4KKyAgICAgKiBAcGFyYW0gcmVwbGFjZUNoYXJzIHRoZSBzdHJpbmcgdG8gcGxhY2UuCisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlcGxhY2VTdHJpbmcoU3RyaW5nIGlucFN0cmluZywgU3RyaW5nIGVzY2FwZUNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwbGFjZUNoYXJzKSB7CisgICAgICAgIFN0cmluZyBsb2NhbFN0cmluZyA9ICIiOworICAgICAgICBpbnQgbnVtVG9rZW5zID0gMDsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnBTdHJpbmcsIGVzY2FwZUNoYXJzLCB0cnVlKTsKKyAgICAgICAgbnVtVG9rZW5zID0gc3QuY291bnRUb2tlbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub2tlbnM7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHRlc3QgPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIHRlc3QgPSAodGVzdC5lcXVhbHMoZXNjYXBlQ2hhcnMpID8gcmVwbGFjZUNoYXJzIDogdGVzdCk7CisgICAgICAgICAgICBsb2NhbFN0cmluZyArPSB0ZXN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBsb2NhbFN0cmluZzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0RlZmF1bHRKc3BDb21waWxlckFkYXB0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9jb21waWxlcnMvRGVmYXVsdEpzcENvbXBpbGVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjhjNmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0RlZmF1bHRKc3BDb21waWxlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5jb21waWxlcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuSnNwQzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEpzcENvbXBpbGVyQWRhcHRlciBpbnRlcmZhY2UuCisgKiBUaGlzIGlzIGN1cnJlbnRseSB2ZXJ5IGxpZ2h0IG9uIHRoZSBncm91bmQgc2luY2Ugb25seSBvbmUgY29tcGlsZXIgdHlwZSBpcworICogc3VwcG9ydGVkLgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmF1bHRKc3BDb21waWxlckFkYXB0ZXIKKyAgICBpbXBsZW1lbnRzIEpzcENvbXBpbGVyQWRhcHRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbFNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIC8qKgorICAgICAqIExvZ3MgdGhlIGNvbXBpbGF0aW9uIHBhcmFtZXRlcnMsIGFkZHMgdGhlIGZpbGVzIHRvIGNvbXBpbGUgYW5kIGxvZ3MgdGhlCisgICAgICogJnF1b3Q7bmljZVNvdXJjZUxpc3QmcXVvdDsKKyAgICAgKiBAcGFyYW0ganNwYyB0aGUgY29tcGlsZXIgdGFzayBmb3IgbG9nZ2luZworICAgICAqIEBwYXJhbSBjb21waWxlTGlzdCB0aGUgbGlzdCBvZiBmaWxlcyB0byBjb21waWxlCisgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lIHVzZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShKc3BDIGpzcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIGNvbXBpbGVMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRsaW5lSmF2YSBjbWQpIHsKKyAgICAgICAganNwYy5sb2coIkNvbXBpbGF0aW9uICIgKyBjbWQuZGVzY3JpYmVKYXZhQ29tbWFuZCgpLAorICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgbmljZVNvdXJjZUxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWxlIik7CisgICAgICAgIGlmIChjb21waWxlTGlzdC5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCJzIik7CisgICAgICAgIH0KKyAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCIgdG8gYmUgY29tcGlsZWQ6Iik7CisKKyAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKGxTZXApOworCisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBjb21waWxlTGlzdC5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGFyZyA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZyk7CisgICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoIiAgICAiKTsKKyAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChhcmcpOworICAgICAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKGxTZXApOworICAgICAgICB9CisKKyAgICAgICAganNwYy5sb2cobmljZVNvdXJjZUxpc3QudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgfQorCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKworICAgIC8qKgorICAgICAqIG91ciBvd25lcgorICAgICAqLworICAgIHByb3RlY3RlZCBKc3BDIG93bmVyOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIHNldCB0aGUgb3duZXIKKyAgICAgKiBAcGFyYW0gb3duZXIgdGhlIG93bmVyIEpzcEMgY29tcGlsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BjKEpzcEMgb3duZXIpIHsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgIH0KKworICAgIC8qKiBnZXQgdGhlIG93bmVyCisgICAgICogQHJldHVybiB0aGUgb3duZXI7IHNob3VsZCBuZXZlciBiZSBudWxsCisgICAgICovCisgICAgcHVibGljIEpzcEMgZ2V0SnNwYygpIHsKKyAgICAgICAgcmV0dXJuIG93bmVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIGFkZCBhbiBhcmd1bWVudCBvbmVwbGUgdG8gdGhlIGFyZ3VtZW50IGxpc3QsIGlmIHRoZSB2YWx1ZSBhaW50IG51bGwKKyAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKiBAcGFyYW0gIGFyZ3VtZW50ICBUaGUgYXJndW1lbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBcmcoQ29tbWFuZGxpbmVKYXZhIGNtZCwgU3RyaW5nIGFyZ3VtZW50KSB7CisgICAgICAgIGlmIChhcmd1bWVudCAhPSBudWxsICYmIGFyZ3VtZW50Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXJndW1lbnQpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgYWRkIGFuIGFyZ3VtZW50IHR1cGxlIHRvIHRoZSBhcmd1bWVudCBsaXN0LCBpZiB0aGUgdmFsdWUgYWludCBudWxsCisgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lCisgICAgICogQHBhcmFtICBhcmd1bWVudCAgVGhlIGFyZ3VtZW50CisgICAgICogQHBhcmFtICB2YWx1ZSAgICAgdGhlIHBhcmFtZXRlcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZEFyZyhDb21tYW5kbGluZUphdmEgY21kLCBTdHJpbmcgYXJndW1lbnQsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXJndW1lbnQpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGFkZCBhbiBhcmd1bWVudCB0dXBsZSB0byB0aGUgYXJnIGxpc3QsIGlmIHRoZSBmaWxlIHBhcmFtZXRlciBhaW50IG51bGwKKyAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKiBAcGFyYW0gIGFyZ3VtZW50ICBUaGUgYXJndW1lbnQKKyAgICAgKiBAcGFyYW0gIGZpbGUgICAgIHRoZSBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBcmcoQ29tbWFuZGxpbmVKYXZhIGNtZCwgU3RyaW5nIGFyZ3VtZW50LCBGaWxlIGZpbGUpIHsKKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXJndW1lbnQpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShmaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFzayBpZiBjb21waWxlciBjYW4gc29ydCBvdXQgaXRzIG93biBkZXBlbmRlbmNpZXMKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGVyIHdhbnRzIHRvIGRvIGl0cyBvd24KKyAgICAgKiBkZXBlbmRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaW1wbGVtZW50c093bkRlcGVuZGVuY3lDaGVja2luZygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBvdXIgcHJvamVjdAorICAgICAqIEByZXR1cm4gb3duZXIgcHJvamVjdCBkYXRhCisgICAgICovCisgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEpzcGMoKS5nZXRQcm9qZWN0KCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0phc3BlckMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9jb21waWxlcnMvSmFzcGVyQy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjhjNTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0phc3BlckMuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5jb21waWxlcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5Kc3BDOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5Kc3BNYW5nbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lSmF2YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgamFzcGVyIGNvbXBpbGVyLgorICogVGhpcyBpcyBhIGN1dC1hbmQtcGFzdGUgb2YgdGhlIG9yaWdpbmFsIEpzcGMgdGFzay4KKyAqCisgKiBAc2luY2UgYW50MS41CisgKi8KK3B1YmxpYyBjbGFzcyBKYXNwZXJDIGV4dGVuZHMgRGVmYXVsdEpzcENvbXBpbGVyQWRhcHRlciB7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgLyoqCisgICAgICogd2hhdCBwcm9kdWNlcyBqYXZhIGNsYXNzZXMgZnJvbSAuanNwIGZpbGVzCisgICAgICovCisgICAgSnNwTWFuZ2xlciBtYW5nbGVyOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBKYXNwZXJDLgorICAgICAqIEBwYXJhbSBtYW5nbGVyIGEgZmlsZW5hbWUgY29udmVydGVyCisgICAgICovCisgICAgcHVibGljIEphc3BlckMoSnNwTWFuZ2xlciBtYW5nbGVyKSB7CisgICAgICAgIHRoaXMubWFuZ2xlciA9IG1hbmdsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3VyIGV4ZWN1dGUgbWV0aG9kLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBnZXRKc3BjKCkubG9nKCJVc2luZyBqYXNwZXIgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGNtZCA9IHNldHVwSmFzcGVyQ29tbWFuZCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbXBpbGVyLCByZWRpcmVjdGluZyBvdXRwdXQgdG8KKyAgICAgICAgICAgIC8vIHRoZSBwcm9qZWN0IGxvZworICAgICAgICAgICAgSmF2YSBqYXZhID0gbmV3IEphdmEob3duZXIpOworICAgICAgICAgICAgUGF0aCBwID0gZ2V0Q2xhc3NwYXRoKCk7CisgICAgICAgICAgICBpZiAoZ2V0SnNwYygpLmdldENsYXNzcGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJ1c2luZyB1c2VyIHN1cHBsaWVkIGNsYXNzcGF0aDogIiArIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coInVzaW5nIHN5c3RlbSBjbGFzc3BhdGg6ICIgKyBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgamF2YS5zZXRDbGFzc3BhdGgocCk7CisgICAgICAgICAgICBqYXZhLnNldERpcihnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpKTsKKyAgICAgICAgICAgIGphdmEuc2V0Q2xhc3NuYW1lKCJvcmcuYXBhY2hlLmphc3Blci5Kc3BDIik7CisgICAgICAgICAgICAvL3RoaXMgaXMgcmVhbGx5IGlycml0YXRpbmc7IHdlIG5lZWQgYSB3YXkgdG8gc2V0IHN0dWZmCisgICAgICAgICAgICBTdHJpbmcgW11hcmdzID0gY21kLmdldEphdmFDb21tYW5kKCkuZ2V0QXJndW1lbnRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBqYXZhLmNyZWF0ZUFyZygpLnNldFZhbHVlKGFyZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgamF2YS5zZXRGYWlsb25lcnJvcihnZXRKc3BjKCkuZ2V0RmFpbG9uZXJyb3IoKSk7CisgICAgICAgICAgICAvL3dlIGFyZSBmb3JraW5nIGhlcmUgdG8gYmUgc3VyZSB0aGF0IGlmIEpzcEMgY2FsbHMKKyAgICAgICAgICAgIC8vU3lzdGVtLmV4aXQoKSBpdCBkb2Vzbid0IGhhbHQgdGhlIGJ1aWxkCisgICAgICAgICAgICBqYXZhLnNldEZvcmsodHJ1ZSk7CisgICAgICAgICAgICBqYXZhLnNldFRhc2tOYW1lKCJqYXNwZXJjIik7CisgICAgICAgICAgICBqYXZhLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSBleDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBydW5uaW5nIGpzcCBjb21waWxlcjogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgsIGdldEpzcGMoKS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGdldEpzcGMoKS5kZWxldGVFbXB0eUphdmFGaWxlcygpOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIGJ1aWxkIHVwIGEgY29tbWFuZCBsaW5lCisgICAgICogQHJldHVybiBhIGNvbW1hbmQgbGluZSBmb3IgamFzcGVyCisgICAgICovCisgICAgcHJpdmF0ZSBDb21tYW5kbGluZUphdmEgc2V0dXBKYXNwZXJDb21tYW5kKCkgeworICAgICAgICBDb21tYW5kbGluZUphdmEgY21kID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOworICAgICAgICBKc3BDIGpzcGMgPSBnZXRKc3BjKCk7CisgICAgICAgIGFkZEFyZyhjbWQsICItZCIsIGpzcGMuZ2V0RGVzdGRpcigpKTsKKyAgICAgICAgYWRkQXJnKGNtZCwgIi1wIiwganNwYy5nZXRQYWNrYWdlKCkpOworCisgICAgICAgIGlmICghaXNUb21jYXQ1eCgpKSB7CisgICAgICAgICAgICBhZGRBcmcoY21kLCAiLXYiICsganNwYy5nZXRWZXJib3NlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygidGhpcyB0YXNrIGRvZXNuJ3Qgc3VwcG9ydCBUb21jYXQgNS54IHByb3Blcmx5LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInBsZWFzZSB1c2UgdGhlIFRvbWNhdCBwcm92aWRlZCBqc3BjIHRhc2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpbnN0ZWFkIik7CisgICAgICAgIH0KKworICAgICAgICBhZGRBcmcoY21kLCAiLXVyaXJvb3QiLCBqc3BjLmdldFVyaXJvb3QoKSk7CisgICAgICAgIGFkZEFyZyhjbWQsICItdXJpYmFzZSIsIGpzcGMuZ2V0VXJpYmFzZSgpKTsKKyAgICAgICAgYWRkQXJnKGNtZCwgIi1pZXBsdWdpbiIsIGpzcGMuZ2V0SWVwbHVnaW4oKSk7CisgICAgICAgIGFkZEFyZyhjbWQsICItd2ViaW5jIiwganNwYy5nZXRXZWJpbmMoKSk7CisgICAgICAgIGFkZEFyZyhjbWQsICItd2VieG1sIiwganNwYy5nZXRXZWJ4bWwoKSk7CisgICAgICAgIGFkZEFyZyhjbWQsICItZGllOSIpOworCisgICAgICAgIGlmIChqc3BjLmlzTWFwcGVkKCkpIHsKKyAgICAgICAgICAgIGFkZEFyZyhjbWQsICItbWFwcGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGpzcGMuZ2V0V2ViQXBwKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBkaXIgPSBqc3BjLmdldFdlYkFwcCgpLmdldERpcmVjdG9yeSgpOworICAgICAgICAgICAgYWRkQXJnKGNtZCwgIi13ZWJhcHAiLCBkaXIpOworICAgICAgICB9CisgICAgICAgIGxvZ0FuZEFkZEZpbGVzVG9Db21waWxlKGdldEpzcGMoKSwgZ2V0SnNwYygpLmdldENvbXBpbGVMaXN0KCksIGNtZCk7CisgICAgICAgIHJldHVybiBjbWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgbWFuZ2xlciB0aGlzIGNvbXBpbGVyIHVzZXMKKyAgICAgKi8KKworICAgIHB1YmxpYyBKc3BNYW5nbGVyIGNyZWF0ZU1hbmdsZXIoKSB7CisgICAgICAgIHJldHVybiBtYW5nbGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggZ2V0Q2xhc3NwYXRoKCkgeworICAgICAgICBQYXRoIHAgPSBnZXRKc3BjKCkuZ2V0Q2xhc3NwYXRoKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgIHAgPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgcmV0dXJuIHAuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJvbmx5Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RvbWNhdDV4KCkgeworICAgICAgICBBbnRDbGFzc0xvYWRlciBsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGwgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoZ2V0Q2xhc3NwYXRoKCkpOworICAgICAgICAgICAgbC5sb2FkQ2xhc3MoIm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5JZiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGwuY2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL2NvbXBpbGVycy9Kc3BDb21waWxlckFkYXB0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9jb21waWxlcnMvSnNwQ29tcGlsZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkMmUwNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9jb21waWxlcnMvSnNwQ29tcGlsZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuY29tcGlsZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLkpzcEM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLkpzcE1hbmdsZXI7CisKKy8qKgorICogVGhlIGludGVyZmFjZSB0aGF0IGFsbCBqc3AgY29tcGlsZXIgYWRhcHRlcnMgbXVzdCBhZGhlciB0by4KKyAqCisgKiA8cD5BIGNvbXBpbGVyIGFkYXB0ZXIgaXMgYW4gYWRhcHRlciB0aGF0IGludGVycHJldHMgdGhlIGpzcGMncworICogcGFyYW1ldGVycyBpbiBwcmVwZXJhdGlvbiB0byBiZSBwYXNzZWQgb2ZmIHRvIHRoZSBjb21waWVyIHRoaXMKKyAqIGFkYXB0ZXIgcmVwcmVzZW50cy4gIEFzIGFsbCB0aGUgbmVjZXNzYXJ5IHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZQorICogSnNwYyB0YXNrIGl0c2VsZiwgdGhlIG9ubHkgdGhpbmcgYWxsIGFkYXB0ZXJzIG5lZWQgaXMgdGhlIGpzcAorICogdGFzaywgdGhlIGV4ZWN1dGUgY29tbWFuZCBhbmQgYSBwYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yIChmb3IKKyAqIHJlZmxlY3Rpb24pLjwvcD4KKyAqCisgKi8KKworcHVibGljIGludGVyZmFjZSBKc3BDb21waWxlckFkYXB0ZXIgeworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29tcGlsZXIgYXR0cmlidXRlcywgd2hpY2ggYXJlIHN0b3JlZCBpbiB0aGUgSnNwYyB0YXNrLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBqc3AgY29tcGlsZXIgYXR0cmlidXRlcworICAgICAqLworICAgIHZvaWQgc2V0SnNwYyhKc3BDIGF0dHJpYnV0ZXMpOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGhhcyB0aGUgY29tcGlsYXRpb24gYmVlbiBzdWNjZXNzZnVsCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIG1hbmdsZXIgdGhpcyBjb21waWxlciB1c2VzCisgICAgICovCisKKyAgICBKc3BNYW5nbGVyIGNyZWF0ZU1hbmdsZXIoKTsKKworICAgIC8qKgorICAgICAqIGFzayBpZiBjb21waWxlciBjYW4gc29ydCBvdXQgaXRzIG93biBkZXBlbmRlbmNpZXMKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGVyIHdhbnRzIHRvIGRvIGl0cyBvd24KKyAgICAgKiBkZXBlbmRzCisgICAgICovCisgICAgYm9vbGVhbiBpbXBsZW1lbnRzT3duRGVwZW5kZW5jeUNoZWNraW5nKCk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0pzcENvbXBpbGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9jb21waWxlcnMvSnNwQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOWEzYzEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0pzcENvbXBpbGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuY29tcGlsZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuSnNwTmFtZU1hbmdsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLkphc3BlcjQxTWFuZ2xlcjsKKworCisvKioKKyAqIENyZWF0ZXMgdGhlIG5lY2Vzc2FyeSBjb21waWxlciBhZGFwdGVyLCBnaXZlbiBiYXNpYyBjcml0ZXJpYS4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKc3BDb21waWxlckFkYXB0ZXJGYWN0b3J5IHsKKworICAgIC8qKiBUaGlzIGlzIGEgc2luZ2xldG9uIC0tIGNhbid0IGNyZWF0ZSBpbnN0YW5jZXMhISAqLworICAgIHByaXZhdGUgSnNwQ29tcGlsZXJBZGFwdGVyRmFjdG9yeSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlZCBvbiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiwgdGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5CisgICAgICogZmFjdG9yeSBkZXNpcmVkLgorICAgICAqCisgICAgICogVGhlIGN1cnJlbnQgbWFwcGluZyBmb3IgY29tcGlsZXIgbmFtZXMgYXJlIGFzIGZvbGxvd3M6CisgICAgICogPHVsPjxsaT5qYXNwZXIgPSBqYXNwZXIgY29tcGlsZXIgKHRoZSBkZWZhdWx0KQorICAgICAqIDxsaT48aT5hIGZ1bGx5IHF1YWxsaWZpZWQgY2xhc3NuYW1lPC9pPiA9IHRoZSBuYW1lIG9mIGEganNwIGNvbXBpbGVyCisgICAgICogYWRhcHRlcgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGlsZXJUeXBlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjb21waWxlciwgb3IgdGhlCisgICAgICogZnVsbCBjbGFzc25hbWUgb2YgdGhlIGNvbXBpbGVyJ3MgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gdGFzayBhIHRhc2sgdG8gbG9nIHRocm91Z2guCisgICAgICogQHJldHVybiB0aGUgY29tcGlsZXIKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxlciB0eXBlIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbnRvCisgICAgICogYSBjb21waWxlciBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSnNwQ29tcGlsZXJBZGFwdGVyIGdldENvbXBpbGVyKFN0cmluZyBjb21waWxlclR5cGUsIFRhc2sgdGFzaykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldENvbXBpbGVyKGNvbXBpbGVyVHlwZSwgdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKG51bGwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlZCBvbiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiwgdGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5CisgICAgICogZmFjdG9yeSBkZXNpcmVkLgorICAgICAqCisgICAgICogVGhlIGN1cnJlbnQgbWFwcGluZyBmb3IgY29tcGlsZXIgbmFtZXMgYXJlIGFzIGZvbGxvd3M6CisgICAgICogPHVsPjxsaT5qYXNwZXIgPSBqYXNwZXIgY29tcGlsZXIgKHRoZSBkZWZhdWx0KQorICAgICAqIDxsaT48aT5hIGZ1bGx5IHF1YWxsaWZpZWQgY2xhc3NuYW1lPC9pPiA9IHRoZSBuYW1lIG9mIGEganNwIGNvbXBpbGVyCisgICAgICogYWRhcHRlcgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGlsZXJUeXBlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjb21waWxlciwgb3IgdGhlCisgICAgICogZnVsbCBjbGFzc25hbWUgb2YgdGhlIGNvbXBpbGVyJ3MgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gdGFzayBhIHRhc2sgdG8gbG9nIHRocm91Z2guCisgICAgICogQHBhcmFtIGxvYWRlciBBbnRDbGFzc0xvYWRlciB3aXRoIHdoaWNoIHRoZSBjb21waWxlciBzaG91bGQgYmUgbG9hZGVkCisgICAgICogQHJldHVybiB0aGUgY29tcGlsZXIKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxlciB0eXBlIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBpbnRvCisgICAgICogYSBjb21waWxlciBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSnNwQ29tcGlsZXJBZGFwdGVyIGdldENvbXBpbGVyKFN0cmluZyBjb21waWxlclR5cGUsIFRhc2sgdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXNwZXIiKSkgeworICAgICAgICAgICAgLy90b21jYXQ0LjAgZ2V0cyB0aGUgb2xkIG1hbmdsZXIKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmFzcGVyQyhuZXcgSnNwTmFtZU1hbmdsZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXNwZXI0MSIpKSB7CisgICAgICAgICAgICAvL3RvbWNhdDQuMSBnZXRzIHRoZSBuZXcgb25lCisgICAgICAgICAgICByZXR1cm4gbmV3IEphc3BlckMobmV3IEphc3BlcjQxTWFuZ2xlcigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzb2x2ZUNsYXNzTmFtZShjb21waWxlclR5cGUsIGxvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gcmVzb2x2ZSB0aGUgZ2l2ZW4gY2xhc3NuYW1lIGludG8gYSBjb21waWxlciBhZGFwdGVyLgorICAgICAqIFRocm93cyBhIGZpdCBpZiBpdCBjYW4ndC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgdG8gYmUgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gY2xhc3Nsb2FkZXIgQ2xhc3Nsb2FkZXIgd2l0aCB3aGljaCB0byBsb2FkIHRoZSBjbGFzcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gVGhpcyBpcyB0aGUgZml0IHRoYXQgaXMgdGhyb3duIGlmIGNsYXNzTmFtZQorICAgICAqIGlzbid0IGFuIGluc3RhbmNlIG9mIEpzcENvbXBpbGVyQWRhcHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBKc3BDb21waWxlckFkYXB0ZXIgcmVzb2x2ZUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgYyA9IGNsYXNzbG9hZGVyLmZpbmRDbGFzcyhjbGFzc05hbWUpOworICAgICAgICAgICAgT2JqZWN0IG8gPSBjLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gKEpzcENvbXBpbGVyQWRhcHRlcikgbzsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oY2xhc3NOYW1lICsgIiBjYW5cJ3QgYmUgZm91bmQuIiwgY25mZSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihjbGFzc05hbWUgKyAiIGlzblwndCB0aGUgY2xhc3NuYW1lIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIGNvbXBpbGVyIGFkYXB0ZXIuIiwgY2NlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vIGZvciBhbGwgb3RoZXIgcG9zc2liaWxpdGllcworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXNzTmFtZSArICIgY2F1c2VkIGFuIGludGVyZXN0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJleGNlcHRpb24uIiwgdCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0FnZ3JlZ2F0ZVRyYW5zZm9ybWVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9BZ2dyZWdhdGVUcmFuc2Zvcm1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjlmOTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9BZ2dyZWdhdGVUcmFuc2Zvcm1lci5qYXZhCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWFNMVFByb2Nlc3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGVsZXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRlbXBGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSkFYUFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlVSTFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKKworLyoqCisgKiBUcmFuc2Zvcm0gYSBKVW5pdCB4bWwgcmVwb3J0LgorICogVGhlIGRlZmF1bHQgdHJhbnNmb3JtYXRpb24gZ2VuZXJhdGVzIGFuIGh0bWwgcmVwb3J0IGluIGVpdGhlciBmcmFtZWQgb3Igbm9uLWZyYW1lZAorICogc3R5bGUuIFRoZSBub24tZnJhbWVkIHN0eWxlIGlzIGNvbnZlbmllbnQgdG8gaGF2ZSBhIGNvbmNpc2UgcmVwb3J0IHZpYSBtYWlsLCB0aGUKKyAqIGZyYW1lZCByZXBvcnQgaXMgbXVjaCBtb3JlIGNvbnZlbmllbnQgaWYgeW91IHdhbnQgdG8gYnJvd3NlIGludG8gZGlmZmVyZW50CisgKiBwYWNrYWdlcyBvciB0ZXN0Y2FzZXMgc2luY2UgaXQgaXMgYSBKYXZhZG9jIGxpa2UgcmVwb3J0LgorICoKKyAqLworcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyIHsKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIHRoZSBmcmFtZXMgZm9ybWF0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FUyA9ICJmcmFtZXMiOworCisgICAgLyoqCisgICAgICogbmFtZSBvZiB0aGUgbm8gZnJhbWVzIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0ZSQU1FUyA9ICJub2ZyYW1lcyI7CisKKyAgICAvKioKKyAgICAgKiBkZWZpbmVzIGFjY2VwdGFibGUgZm9ybWF0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1hdCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKioKKyAgICAgICAgICogbGlzdCBhdXRob3JpemVkIHZhbHVlcy4KKyAgICAgICAgICogQHJldHVybiBhdXRob3JpemVkIHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tde0ZSQU1FUywgTk9GUkFNRVN9OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKiogVGFzayAqLworICAgIHByb3RlY3RlZCBUYXNrIHRhc2s7CisKKyAgICAvKiogdGhlIHhtbCBkb2N1bWVudCB0byBwcm9jZXNzICovCisgICAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OworCisgICAgLyoqIHRoZSBzdHlsZSBkaXJlY3RvcnkuIFhTTHMgc2hvdWxkIGJlIHJlYWQgZnJvbSBoZXJlIGlmIG5lY2Vzc2FyeSAqLworICAgIHByb3RlY3RlZCBGaWxlIHN0eWxlRGlyOworCisgICAgLyoqIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIHRoaXMgaXMgdGhlIHJvb3QgZnJvbSB3aGVyZSBodG1sIHNob3VsZCBiZSBnZW5lcmF0ZWQgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSB0b0RpcjsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJhbXMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgcGFyYW1zOworCisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgYSB1dGlsaXR5IGNsYXNzIHRvIHVzZSBmb3IgZmlsZSBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gZW5zdXJlIHRoZSB1bmlxdWVuZXNzIG9mIGEgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRlciA9IDA7CisKKyAgICAvKiogdGhlIGZvcm1hdCB0byB1c2UgZm9yIHRoZSByZXBvcnQuIE11c3QgYmUgPHR0PkZSQU1FUzwvdHQ+IG9yIDx0dD5OT0ZSQU1FUzwvdHQ+ICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXQgPSBGUkFNRVM7CisKKyAgICAvKiogWE1MIFBhcnNlciBmYWN0b3J5ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBwcml2YXRlREJGYWN0b3J5OworCisgICAgLyoqIFhNTCBQYXJzZXIgZmFjdG9yeSBhY2Nlc3NpYmxlIHRvIHN1YmNsYXNzZXMgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmYWN0b3J5OworCisgICAgc3RhdGljIHsKKyAgICAgICBwcml2YXRlREJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgIGRiZmFjdG9yeSA9IHByaXZhdGVEQkZhY3Rvcnk7CisgICAgfQorICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBjb25zdHJ1Y3RvciBjcmVhdGluZyB0aGUgdHJhbnNmb3JtZXIgZnJvbSB0aGUganVuaXRyZXBvcnQgdGFzay4KKyAgICAgKiBAcGFyYW0gdGFzayAgdGFzayBkZWxlZ2F0aW5nIHRvIHRoaXMgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQWdncmVnYXRlVHJhbnNmb3JtZXIoVGFzayB0YXNrKSB7CisgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CisgICAgICAgIHBhcmFtcyA9IG5ldyBWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIERvY3VtZW50IEJ1aWxkZXIgRmFjdG9yeQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBpbnN0YW5jZSBpbiB1c2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZ2V0RG9jdW1lbnRCdWlsZGVyRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIHByaXZhdGVEQkZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgZm9ybWF0LgorICAgICAqIEBwYXJhbSBmb3JtYXQgIE11c3QgYmUgPHR0PkZSQU1FUzwvdHQ+IG9yIDx0dD5OT0ZSQU1FUzwvdHQ+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9ybWF0KEZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSBpbnB1dCBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gZG9jIGlucHV0IGRvbSB0cmVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WG1sRG9jdW1lbnQoRG9jdW1lbnQgZG9jKSB7CisgICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB4bWwgZmlsZSB0byBiZSBwcm9jZXNzZWQuIFRoaXMgaXMgYSBoZWxwZXIgaWYgeW91IHdhbnQKKyAgICAgKiB0byBzZXQgdGhlIGZpbGUgZGlyZWN0bHkuIE11Y2ggbW9yZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAgKiBAcGFyYW0geG1sZmlsZSB4bWwgZmlsZSB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBjYW5ub3QgYmUgcGFyc2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFhtbGZpbGUoRmlsZSB4bWxmaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBwcml2YXRlREJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHhtbGZpbGUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKGluKTsKKyAgICAgICAgICAgICAgICBzZXRYbWxEb2N1bWVudChkb2MpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBwYXJzaW5nIGRvY3VtZW50OiAiICsgeG1sZmlsZSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIHN0eWxlIGRpcmVjdG9yeS4gSXQgaXMgb3B0aW9uYWwgYW5kIHdpbGwgb3ZlcnJpZGUgdGhlCisgICAgICogZGVmYXVsdCB4c2wgdXNlZC4KKyAgICAgKiBAcGFyYW0gc3R5bGVkaXIgIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgeHNsIGZpbGVzIGlmIHRoZSB1c2VyCisgICAgICogd291bGQgbGlrZSB0byBvdmVycmlkZSB3aXRoIGl0cyBvd24gc3R5bGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGVkaXIoRmlsZSBzdHlsZWRpcikgeworICAgICAgICB0aGlzLnN0eWxlRGlyID0gc3R5bGVkaXI7CisgICAgfQorCisgICAgLyoqIHNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSB0b2RpciB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG9kaXIoRmlsZSB0b2RpcikgeworICAgICAgICB0aGlzLnRvRGlyID0gdG9kaXI7CisgICAgfQorCisgICAgLyoqIHNldCB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBvdXRwdXQgZmlsZXMKKyAgICAgKiBAcGFyYW0gZXh0IGV4dGVuc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dCkgeworICAgICAgICB0YXNrLmxvZygiZXh0ZW5zaW9uIGlzIG5vdCB1c2VkIGFueW1vcmUiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gWFNMIHBhcmFtZXRlciBmb3IgY29uZmlndXJhdGlvbiBieSBBbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBQYXJhbSBjbGFzcyB0byBiZSBjb25maWd1cmVkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFhTTFRQcm9jZXNzLlBhcmFtIGNyZWF0ZVBhcmFtKCkgeworICAgICAgICBYU0xUUHJvY2Vzcy5QYXJhbSBwID0gbmV3IFhTTFRQcm9jZXNzLlBhcmFtKCk7CisgICAgICAgIHBhcmFtcy5hZGQocCk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRyYW5zZm9ybWF0aW9uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBleGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgdHJhbnNmb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tPcHRpb25zKCk7CisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IHRhc2suZ2V0UHJvamVjdCgpOworCisgICAgICAgIFRlbXBGaWxlIHRlbXBGaWxlVGFzayA9IG5ldyBUZW1wRmlsZSgpOworICAgICAgICB0ZW1wRmlsZVRhc2suYmluZFRvT3duZXIodGFzayk7CisKKyAgICAgICAgWFNMVFByb2Nlc3MgeHNsdFRhc2sgPSBuZXcgWFNMVFByb2Nlc3MoKTsKKyAgICAgICAgeHNsdFRhc2suYmluZFRvT3duZXIodGFzayk7CisKKyAgICAgICAgeHNsdFRhc2suc2V0WHNsUmVzb3VyY2UoZ2V0U3R5bGVzaGVldCgpKTsKKworICAgICAgICAvLyBhY3JvYmF0aWMgY2FzdC4KKyAgICAgICAgeHNsdFRhc2suc2V0SW4oKChYTUxSZXN1bHRBZ2dyZWdhdG9yKSB0YXNrKS5nZXREZXN0aW5hdGlvbkZpbGUoKSk7CisgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG51bGw7CisgICAgICAgIGlmIChmb3JtYXQuZXF1YWxzKEZSQU1FUykpIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZW1wRmlsZVByb3BlcnR5ID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyBTdHJpbmcudmFsdWVPZihjb3VudGVyKyspOworICAgICAgICAgICAgRmlsZSB0bXAgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKHByb2plY3QuZ2V0QmFzZURpcigpLCBwcm9qZWN0CisgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7CisgICAgICAgICAgICB0ZW1wRmlsZVRhc2suc2V0RGVzdERpcih0bXApOworICAgICAgICAgICAgdGVtcEZpbGVUYXNrLnNldFByb3BlcnR5KHRlbXBGaWxlUHJvcGVydHkpOworICAgICAgICAgICAgdGVtcEZpbGVUYXNrLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIG91dHB1dEZpbGUgPSBuZXcgRmlsZShwcm9qZWN0LmdldFByb3BlcnR5KHRlbXBGaWxlUHJvcGVydHkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dHB1dEZpbGUgPSBuZXcgRmlsZSh0b0RpciwgImp1bml0LW5vZnJhbWVzLmh0bWwiKTsKKyAgICAgICAgfQorICAgICAgICB4c2x0VGFzay5zZXRPdXQob3V0cHV0RmlsZSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhcmFtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFhTTFRQcm9jZXNzLlBhcmFtIHBhcmFtID0gKFhTTFRQcm9jZXNzLlBhcmFtKSBpLm5leHQoKTsKKyAgICAgICAgICAgIFhTTFRQcm9jZXNzLlBhcmFtIG5ld1BhcmFtID0geHNsdFRhc2suY3JlYXRlUGFyYW0oKTsKKyAgICAgICAgICAgIG5ld1BhcmFtLnNldFByb2plY3QodGFzay5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgbmV3UGFyYW0uc2V0TmFtZShwYXJhbS5nZXROYW1lKCkpOworICAgICAgICAgICAgbmV3UGFyYW0uc2V0RXhwcmVzc2lvbihwYXJhbS5nZXRFeHByZXNzaW9uKCkpOworICAgICAgICB9CisgICAgICAgIFhTTFRQcm9jZXNzLlBhcmFtIHBhcmFteCA9IHhzbHRUYXNrLmNyZWF0ZVBhcmFtKCk7CisgICAgICAgIHBhcmFteC5zZXRQcm9qZWN0KHRhc2suZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgcGFyYW14LnNldE5hbWUoIm91dHB1dC5kaXIiKTsKKyAgICAgICAgcGFyYW14LnNldEV4cHJlc3Npb24odG9EaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBmaW5hbCBsb25nIHQwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB4c2x0VGFzay5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9ycyB3aGlsZSBhcHBseWluZyB0cmFuc2Zvcm1hdGlvbnM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgbG9uZyBkdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDA7CisgICAgICAgIHRhc2subG9nKCJUcmFuc2Zvcm0gdGltZTogIiArIGR0ICsgIm1zIik7CisgICAgICAgIGlmIChmb3JtYXQuZXF1YWxzKEZSQU1FUykpIHsKKyAgICAgICAgICAgIERlbGV0ZSBkZWxldGUgPSBuZXcgRGVsZXRlKCk7CisgICAgICAgICAgICBkZWxldGUuYmluZFRvT3duZXIodGFzayk7CisgICAgICAgICAgICBkZWxldGUuc2V0RmlsZShvdXRwdXRGaWxlKTsKKyAgICAgICAgICAgIGRlbGV0ZS5leGVjdXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhY2Nlc3MgdGhlIHN0eWxlc2hlZXQgdG8gYmUgdXNlZCBhcyBhIHJlc291cmNlLgorICAgICAqIEByZXR1cm4gc3R5bGVzaGVldCBhcyBhIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc291cmNlIGdldFN0eWxlc2hlZXQoKSB7CisgICAgICAgIFN0cmluZyB4c2xuYW1lID0gImp1bml0LWZyYW1lcy54c2wiOworICAgICAgICBpZiAoTk9GUkFNRVMuZXF1YWxzKGZvcm1hdCkpIHsKKyAgICAgICAgICAgIHhzbG5hbWUgPSAianVuaXQtbm9mcmFtZXMueHNsIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGVEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgc3R5bGUgZGlyIGlzIG5vdCBzcGVjaWZpZWQgd2UgaGF2ZSB0byByZXRyaWV2ZQorICAgICAgICAgICAgLy8gdGhlIHN0eWxlc2hlZXQgZnJvbSB0aGUgY2xhc3Nsb2FkZXIKKyAgICAgICAgICAgIFVSTFJlc291cmNlIHN0eWxlc2hlZXQgPSBuZXcgVVJMUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIFVSTCBzdHlsZXNoZWV0VVJMID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKAorICAgICAgICAgICAgICAgICAgICAib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQveHNsLyIgKyB4c2xuYW1lKTsKKyAgICAgICAgICAgIHN0eWxlc2hlZXQuc2V0VVJMKHN0eWxlc2hlZXRVUkwpOworICAgICAgICAgICAgcmV0dXJuIHN0eWxlc2hlZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgd2UgYXJlIGhlcmUsIHRoZW4gdGhlIHN0eWxlIGRpciBpcyBoZXJlIGFuZCB3ZQorICAgICAgICAvLyBzaG91bGQgcmVhZCB0aGUgc3R5bGVzaGVldCBmcm9tIHRoZSBmaWxlc3lzdGVtCisgICAgICAgIEZpbGVSZXNvdXJjZSBzdHlsZXNoZWV0ID0gbmV3IEZpbGVSZXNvdXJjZSgpOworICAgICAgICBGaWxlIHN0eWxlc2hlZXRGaWxlID0gbmV3IEZpbGUoc3R5bGVEaXIsIHhzbG5hbWUpOworICAgICAgICBzdHlsZXNoZWV0LnNldEZpbGUoc3R5bGVzaGVldEZpbGUpOworICAgICAgICByZXR1cm4gc3R5bGVzaGVldDsKKyAgICB9CisKKworICAgIC8qKiBjaGVjayBmb3IgaW52YWxpZCBvcHRpb25zCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja09wdGlvbnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSByZWxhdGl2ZSBmcm9tIHRoZSBwcm9qZWN0IGlmIG5lZWRlZC4KKyAgICAgICAgaWYgKHRvRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRvRGlyID0gdGFzay5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIi4iKTsKKyAgICAgICAgfSBlbHNlIGlmICghdG9EaXIuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICB0b0RpciA9IHRhc2suZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKHRvRGlyLmdldFBhdGgoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN5c3RlbWlkIG9mIHRoZSBhcHByb3ByaWF0ZSBzdHlsZXNoZWV0IGJhc2VkIG9uIGl0cworICAgICAqIG5hbWUgYW5kIHN0eWxlZGlyLiBJZiBubyBzdHlsZWRpciBpcyBkZWZpbmVkIGl0IHdpbGwgbG9hZAorICAgICAqIGl0IGFzIGEgamF2YSByZXNvdXJjZSBpbiB0aGUgeHNsIGNoaWxkIHBhY2thZ2UsIG90aGVyd2lzZSBpdAorICAgICAqIHdpbGwgZ2V0IGl0IGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAgICAgKiBAcmV0dXJuIHN5c3RlbSBJRCBvZiB0aGUgc3R5bGVzaGVldC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHRocm93biBpZiB0aGUgcmVxdWVzdGVkIHN0eWxlc2hlZXQgZG9lcworICAgICAqIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN0eWxlc2hlZXRTeXN0ZW1JZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB4c2xuYW1lID0gImp1bml0LWZyYW1lcy54c2wiOworICAgICAgICBpZiAoTk9GUkFNRVMuZXF1YWxzKGZvcm1hdCkpIHsKKyAgICAgICAgICAgIHhzbG5hbWUgPSAianVuaXQtbm9mcmFtZXMueHNsIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGVEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoInhzbC8iICsgeHNsbmFtZSk7CisgICAgICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBqYXIgcmVzb3VyY2UgIiArIHhzbG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVybC50b0V4dGVybmFsRm9ybSgpOworICAgICAgICB9CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHN0eWxlRGlyLCB4c2xuYW1lKTsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBmaWxlICciICsgZmlsZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEpBWFBVdGlscy5nZXRTeXN0ZW1JZChmaWxlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0Jhc2VUZXN0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzZjMzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiBCYXNlY2xhc3MgZm9yIEJhdGNoVGVzdCBhbmQgSlVuaXRUZXN0LgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VUZXN0IHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBib29sZWFuIGhhbHRPbkVycm9yID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFsdE9uRmFpbCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIGZpbHRlcnRyYWNlID0gdHJ1ZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmb3JrID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIFN0cmluZyBpZlByb3BlcnR5ID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVubGVzc1Byb3BlcnR5ID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGZvcm1hdHRlcnMgPSBuZXcgVmVjdG9yKCk7CisgICAgLyoqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSAqLworICAgIHByb3RlY3RlZCBGaWxlIGRlc3REaXIgPSBudWxsOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBmYWlsdXJlUHJvcGVydHk7CisgICAgcHJvdGVjdGVkIFN0cmluZyBlcnJvclByb3BlcnR5OworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZpbHRlcnRyYWNlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJ0cmFjZShib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGZpbHRlcnRyYWNlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWx0ZXJ0cmFjZSBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEZpbHRlcnRyYWNlKCkgeworICAgICAgICByZXR1cm4gZmlsdGVydHJhY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmb3JrIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JrKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgZm9yayA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZm9yayBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmsoKSB7CisgICAgICAgIHJldHVybiBmb3JrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaGFsdG9uZXJyb3IgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB2YWx1ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhhbHRvbmVycm9yKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgaGFsdE9uRXJyb3IgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGhhbHRvbmZhaWx1cmUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB2YWx1ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhhbHRvbmZhaWx1cmUoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBoYWx0T25GYWlsID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBoYWx0b25lcnJvciBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEhhbHRvbmVycm9yKCkgeworICAgICAgICByZXR1cm4gaGFsdE9uRXJyb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBoYWx0b25mYWlsdXJlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SGFsdG9uZmFpbHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIGhhbHRPbkZhaWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpZiBhdHRyaWJ1dGUuCisgICAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBwcmVzZW50IGluIHByb2plY3QsCisgICAgICogdGhlIHRlc3Qgd2lsbCBiZSBydW4uCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gbG9vayBmb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWYoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICBpZlByb3BlcnR5ID0gcHJvcGVydHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdW5sZXNzIGF0dHJpYnV0ZS4KKyAgICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIHByZXNlbnQgaW4gcHJvamVjdCwKKyAgICAgKiB0aGUgdGVzdCB3aWxsICpub3QqIGJlIHJ1bi4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBsb29rIGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICB1bmxlc3NQcm9wZXJ0eSA9IHByb3BlcnR5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBhIGZvcm1hdHRlciBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gZWxlbSBhIGZvcm1hdHRlciBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGb3JtYXR0ZXIoRm9ybWF0dGVyRWxlbWVudCBlbGVtKSB7CisgICAgICAgIGZvcm1hdHRlcnMuYWRkRWxlbWVudChlbGVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGRlc3REaXIgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb2RpcihGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYXMgYW4gYWJzb2x1dGUgcGF0aCBpZiBpdCBleGlzdHMKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSByZXR1cm4gPHR0Pm51bGw8L3R0PgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9kaXIoKSB7CisgICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmFpbHVyZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCBvbiBmYWlsdXJlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFpbHVyZVByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gZmFpbHVyZVByb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgZmFpbHVyZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gZmFpbHVyZVByb3BlcnR5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0ZXN0IGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWx1cmVQcm9wZXJ0eShTdHJpbmcgZmFpbHVyZVByb3BlcnR5KSB7CisgICAgICAgIHRoaXMuZmFpbHVyZVByb3BlcnR5ID0gZmFpbHVyZVByb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmFpbHVyZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCBvbiBmYWlsdXJlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yUHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBlcnJvciBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gZXJyb3JQcm9wZXJ0eSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IGlmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIHRlc3QgaGFzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJvcGVydHkoU3RyaW5nIGVycm9yUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5lcnJvclByb3BlcnR5ID0gZXJyb3JQcm9wZXJ0eTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXRjaFRlc3QuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0JhdGNoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTAwNzEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXRjaFRlc3QuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlJlc291cmNlczsKKworLyoqCisgKiA8cD4gQ3JlYXRlIHRoZW4gcnVuIDxjb2RlPkpVbml0VGVzdDwvY29kZT4ncyBiYXNlZCBvbiB0aGUgbGlzdCBvZiBmaWxlcworICogICAgIGdpdmVuIGJ5IHRoZSBmaWxlc2V0IGF0dHJpYnV0ZS4KKyAqCisgKiA8cD4gRXZlcnkgPGNvZGU+LmphdmE8L2NvZGU+IG9yIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZSBpbiB0aGUgZmlsZXNldCBpcworICogYXNzdW1lZCB0byBiZSBhIHRlc3RjYXNlLgorICogQSA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+IGlzIGNyZWF0ZWQgZm9yIGVhY2ggb2YgdGhlc2UgbmFtZWQgY2xhc3NlcyB3aXRoCisgKiBiYXNpYyBzZXR1cCBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IDxjb2RlPkJhdGNoVGVzdDwvY29kZT4uCisgKgorICogQHNlZSBKVW5pdFRlc3QKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJhdGNoVGVzdCBleHRlbmRzIEJhc2VUZXN0IHsKKworICAgIC8qKiB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0ICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKiogdGhlIGxpc3Qgb2YgZmlsZXNldHMgY29udGFpbmluZyB0aGUgdGVzdGNhc2UgZmlsZW5hbWUgcnVsZXMgKi8KKyAgICBwcml2YXRlIFJlc291cmNlcyByZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgYSBuZXcgYmF0Y2h0ZXN0IGluc3RhbmNlCisgICAgICogQHBhcmFtIHByb2plY3QgICAgIHRoZSBwcm9qZWN0IGl0IGRlcGVuZHMgb24uCisgICAgICovCisgICAgcHVibGljIEJhdGNoVGVzdChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgZmlsZXNldCBpbnN0YW5jZSB0byB0aGlzIGJhdGNodGVzdC4gV2hhdGV2ZXIgdGhlIGZpbGVzZXQgaXMsCisgICAgICogb25seSBmaWxlbmFtZSB0aGF0IGFyZSA8dHQ+LmphdmE8L3R0PiBvciA8dHQ+LmNsYXNzPC90dD4gd2lsbCBiZQorICAgICAqIGNvbnNpZGVyZWQgYXMgJ2NhbmRpZGF0ZXMnLgorICAgICAqIEBwYXJhbSAgICAgZnMgdGhlIG5ldyBmaWxlc2V0IGNvbnRhaW5pbmcgdGhlIHJ1bGVzIHRvIGdldCB0aGUgdGVzdGNhc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVTZXQoRmlsZVNldCBmcykgeworICAgICAgICBhZGQoZnMpOworCisgICAgICAgIC8vIHRoaXMgb25lIGlzIGhlcmUgYmVjYXVzZSB0aGUgY2hhbmdlcyB0byBzdXBwb3J0IFJlc291cmNlQ29sbGVjdGlvbnMKKyAgICAgICAgLy8gaGF2ZSBicm9rZW4gTWFnaWMncyBKVW5pdFRlc3RUYXNrLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgdGFzayBhZGRzIGEgRmlsZVNldCB0byBhIEJhdGNoVGVzdCBpbnN0YW5jZSB1c2luZyB0aGUKKyAgICAgICAgLy8gSmF2YSBBUEkgYW5kIHdpdGhvdXQgdGVsbGluZyB0aGUgRmlsZVNldCBhYm91dCBpdHMgcHJvamVjdAorICAgICAgICAvLyBpbnN0YW5jZS4gIFRoZSBvcmlnaW5hbCBjb2RlIHdvdWxkIHBhc3MgaW4gcHJvamVjdCBvbiB0aGUKKyAgICAgICAgLy8gY2FsbCB0byBnZXREaXJlY3RvcnlTY2FubmVyIC0gd2hpY2ggaXMgbm93IGhpZGRlbiBkZWVwIGludG8KKyAgICAgICAgLy8gUmVzb3VyY2VzLml0ZXJhdG9yKCkgYW5kIG5vdCByZWFjaGFibGUuCisgICAgICAgIGlmIChmcy5nZXRQcm9qZWN0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgZnMuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IFJlc291cmNlQ29sbGVjdGlvbiBpbnN0YW5jZSB0byB0aGlzCisgICAgICogYmF0Y2h0ZXN0LiBXaGF0ZXZlciB0aGUgY29sbGVjdGlvbiBpcywgb25seSBuYW1lcyB0aGF0IGFyZQorICAgICAqIDx0dD4uamF2YTwvdHQ+IG9yIDx0dD4uY2xhc3M8L3R0PiB3aWxsIGJlIGNvbnNpZGVyZWQgYXMKKyAgICAgKiAnY2FuZGlkYXRlcycuCisgICAgICogQHBhcmFtIHJjIHRoZSBuZXcgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHJ1bGVzIHRvCisgICAgICogZ2V0IHRoZSB0ZXN0Y2FzZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CisgICAgICAgIHJlc291cmNlcy5hZGQocmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgPHR0PkpVbml0VGVzdDwvdHQ+IGluc3RhbmNlcyBvYnRhaW4gYnkgYXBwbHlpbmcgdGhlIGZpbGVzZXQgcnVsZXMuCisgICAgICogQHJldHVybiAgYW4gZW51bWVyYXRpb24gb2YgYWxsIGVsZW1lbnRzIG9mIHRoaXMgYmF0Y2h0ZXN0IHRoYXQgYXJlCisgICAgICogYSA8dHQ+SlVuaXRUZXN0PC90dD4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgeworICAgICAgICBKVW5pdFRlc3RbXSB0ZXN0cyA9IGNyZWF0ZUFsbEpVbml0VGVzdCgpOworICAgICAgICByZXR1cm4gRW51bWVyYXRpb25zLmZyb21BcnJheSh0ZXN0cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVudCBtZXRob2QgdG8gbWVyZ2UgdGhlIDx0dD5KVW5pdFRlc3Q8L3R0PnMgb2YgdGhpcyBiYXRjaHRlc3QKKyAgICAgKiB0byBhIDx0dD5WZWN0b3I8L3R0Pi4KKyAgICAgKiBAcGFyYW0gdiB0aGUgdmVjdG9yIHRvIHdoaWNoIHNob3VsZCBiZSBhZGRlZCBhbGwgaW5kaXZpZHVhbCB0ZXN0cyBvZiB0aGlzCisgICAgICogYmF0Y2ggdGVzdC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFRlc3RzVG8oVmVjdG9yIHYpIHsKKyAgICAgICAgSlVuaXRUZXN0W10gdGVzdHMgPSBjcmVhdGVBbGxKVW5pdFRlc3QoKTsKKyAgICAgICAgdi5lbnN1cmVDYXBhY2l0eSh2LnNpemUoKSArIHRlc3RzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudCh0ZXN0c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYWxsIDx0dD5KVW5pdFRlc3Q8L3R0PnMgYmFzZWQgb24gdGhlIGZpbGVzZXRzLiBFYWNoIGluc3RhbmNlCisgICAgICogaXMgY29uZmlndXJlZCB0byBtYXRjaCB0aGlzIGluc3RhbmNlIHByb3BlcnRpZXMuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgYWxsIDx0dD5KVW5pdFRlc3Q8L3R0PnMgdGhhdCBiZWxvbmdzIHRvIHRoaXMgYmF0Y2guCisgICAgICovCisgICAgcHJpdmF0ZSBKVW5pdFRlc3RbXSBjcmVhdGVBbGxKVW5pdFRlc3QoKSB7CisgICAgICAgIFN0cmluZ1tdIGZpbGVuYW1lcyA9IGdldEZpbGVuYW1lcygpOworICAgICAgICBKVW5pdFRlc3RbXSB0ZXN0cyA9IG5ldyBKVW5pdFRlc3RbZmlsZW5hbWVzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBqYXZhVG9DbGFzcyhmaWxlbmFtZXNbaV0pOworICAgICAgICAgICAgdGVzdHNbaV0gPSBjcmVhdGVKVW5pdFRlc3QoY2xhc3NuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVzdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZSBvdmVyIGFsbCBmaWxlc2V0cyBhbmQgcmV0dXJuIHRoZSBmaWxlbmFtZSBvZiBhbGwgZmlsZXMKKyAgICAgKiB0aGF0IGVuZCB3aXRoIDx0dD4uamF2YTwvdHQ+IG9yIDx0dD4uY2xhc3M8L3R0Pi4gVGhpcyBpcyB0byBhdm9pZAorICAgICAqIHdyYXBwaW5nIGEgPHR0PkpVbml0VGVzdDwvdHQ+IG92ZXIgYW4geG1sIGZpbGUgZm9yIGV4YW1wbGUuIEEgVGVzdGNhc2UKKyAgICAgKiBpcyBvYnZpb3VzbHkgYSBqYXZhIGZpbGUgKGNvbXBpbGVkIG9yIG5vdCkuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmaWxlbmFtZXMgd2l0aG91dCB0aGVpciBleHRlbnNpb24uIEFzIHRoZXkgc2hvdWxkCisgICAgICogbm9ybWFsbHkgYmUgdGFrZW4gZnJvbSB0aGVpciByb290LCBmaWxlbmFtZXMgc2hvdWxkIG1hdGNoIHRoZWlyIGZ1bGx5CisgICAgICogcXVhbGlmaWVkIGNsYXNzIG5hbWUgKElmIGl0IGlzIG5vdCB0aGUgY2FzZSBpdCB3aWxsIGZhaWwgd2hlbiBydW5uaW5nIHRoZSB0ZXN0KS4KKyAgICAgKiBGb3IgdGhlIGNsYXNzIDx0dD5vcmcvYXBhY2hlL1doYXRldmVyLmNsYXNzPC90dD4gaXQgd2lsbCByZXR1cm4gPHR0Pm9yZy9hcGFjaGUvV2hhdGV2ZXI8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIGdldEZpbGVuYW1lcygpIHsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBSZXNvdXJjZSByID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChyLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aG5hbWUgPSByLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aG5hbWUuZW5kc1dpdGgoIi5qYXZhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KHBhdGhuYW1lLnN1YnN0cmluZygwLCBwYXRobmFtZS5sZW5ndGgoKSAtICIuamF2YSIubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgeworICAgICAgICAgICAgICAgICAgICB2LmFkZEVsZW1lbnQocGF0aG5hbWUuc3Vic3RyaW5nKDAsIHBhdGhuYW1lLmxlbmd0aCgpIC0gIi5jbGFzcyIubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbdi5zaXplKCldOworICAgICAgICB2LmNvcHlJbnRvKGZpbGVzKTsKKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNvbnZlcnQgYSBwYXRobmFtZSB3aXRob3V0IGV4dGVuc2lvbiB0byBhCisgICAgICogZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZS4gRm9yIGV4YW1wbGUgPHR0Pm9yZy9hcGFjaGUvV2hhdGV2ZXI8L3R0PiB3aWxsCisgICAgICogYmUgY29udmVydGVkIHRvIDx0dD5vcmcuYXBhY2hlLldoYXRldmVyPC90dD4KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRvICJjb252ZXJ0IiB0byBhIGNsYXNzbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc25hbWUgbWF0Y2hpbmcgdGhlIGZpbGVuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGphdmFUb0NsYXNzKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICByZXR1cm4gZmlsZW5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJykucmVwbGFjZSgnLycsICcuJykKKyAgICAgICAgICAgIC5yZXBsYWNlKCdcXCcsICcuJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgPHR0PkpVbml0VGVzdDwvdHQ+IHRoYXQgaGFzIHRoZSBzYW1lIHByb3BlcnR5IGFzIHRoaXMKKyAgICAgKiA8dHQ+QmF0Y2hUZXN0PC90dD4gaW5zdGFuY2UuCisgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBzaG91bGQgYmUgcnVuIGFzIGEKKyAgICAgKiA8dHQ+SlVuaXRUZXN0PC90dD4uIEl0IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSA8dHQ+SlVuaXRUZXN0PC90dD4gb3ZlciB0aGUgZ2l2ZW4gY2xhc3NuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSlVuaXRUZXN0IGNyZWF0ZUpVbml0VGVzdChTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIEpVbml0VGVzdCB0ZXN0ID0gbmV3IEpVbml0VGVzdCgpOworICAgICAgICB0ZXN0LnNldE5hbWUoY2xhc3NuYW1lKTsKKyAgICAgICAgdGVzdC5zZXRIYWx0b25lcnJvcih0aGlzLmhhbHRPbkVycm9yKTsKKyAgICAgICAgdGVzdC5zZXRIYWx0b25mYWlsdXJlKHRoaXMuaGFsdE9uRmFpbCk7CisgICAgICAgIHRlc3Quc2V0RmlsdGVydHJhY2UodGhpcy5maWx0ZXJ0cmFjZSk7CisgICAgICAgIHRlc3Quc2V0Rm9yayh0aGlzLmZvcmspOworICAgICAgICB0ZXN0LnNldElmKHRoaXMuaWZQcm9wZXJ0eSk7CisgICAgICAgIHRlc3Quc2V0VW5sZXNzKHRoaXMudW5sZXNzUHJvcGVydHkpOworICAgICAgICB0ZXN0LnNldFRvZGlyKHRoaXMuZGVzdERpcik7CisgICAgICAgIHRlc3Quc2V0RmFpbHVyZVByb3BlcnR5KGZhaWx1cmVQcm9wZXJ0eSk7CisgICAgICAgIHRlc3Quc2V0RXJyb3JQcm9wZXJ0eShlcnJvclByb3BlcnR5KTsKKyAgICAgICAgRW51bWVyYXRpb24gbGlzdCA9IHRoaXMuZm9ybWF0dGVycy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAobGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgdGVzdC5hZGRGb3JtYXR0ZXIoKEZvcm1hdHRlckVsZW1lbnQpIGxpc3QubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlc3Q7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5OTIyNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0JyaWVmSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBQcmludHMgcGxhaW4gdGV4dCBvdXRwdXQgb2YgdGhlIHRlc3QgdG8gYSBzcGVjaWZpZWQgV3JpdGVyLgorICogSW5zcGlyZWQgYnkgdGhlIFBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIuCisgKgorICogQHNlZSBGb3JtYXR0ZXJFbGVtZW50CisgKiBAc2VlIFBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIKKyAqLworcHVibGljIGNsYXNzIEJyaWVmSlVuaXRSZXN1bHRGb3JtYXR0ZXIgaW1wbGVtZW50cyBKVW5pdFJlc3VsdEZvcm1hdHRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgT05FX1NFQ09ORCA9IDEwMDAuMDsKKworICAgIC8qKgorICAgICAqIFdoZXJlIHRvIHdyaXRlIHRoZSBsb2cgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0OworCisgICAgLyoqCisgICAgICogVXNlZCBmb3Igd3JpdGluZyB0aGUgcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByaW50V3JpdGVyIG91dHB1dDsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgcGFydCBvZiBmb3JtYXR0aW5nIHRoZSByZXN1bHRzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nV3JpdGVyIHJlc3VsdHM7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGZvciB3cml0aW5nIGZvcm1hdHRlZCByZXN1bHRzIHRvLgorICAgICAqLworICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgcmVzdWx0V3JpdGVyOworCisgICAgLyoqCisgICAgICogRm9ybWF0dGVyIGZvciB0aW1pbmdzLgorICAgICAqLworICAgIHByaXZhdGUgTnVtYmVyRm9ybWF0IG51bWJlckZvcm1hdCA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogT3V0cHV0IHN1aXRlIGhhcyB3cml0dGVuIHRvIFN5c3RlbS5vdXQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzeXN0ZW1PdXRwdXQgPSBudWxsOworCisgICAgLyoqCisgICAgICogT3V0cHV0IHN1aXRlIGhhcyB3cml0dGVuIHRvIFN5c3RlbS5lcnIKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzeXN0ZW1FcnJvciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlcigpIHsKKyAgICAgICAgcmVzdWx0cyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgcmVzdWx0V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHJlc3VsdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN0cmVhbSB0aGUgZm9ybWF0dGVyIGlzIHN1cHBvc2VkIHRvIHdyaXRlIGl0cyByZXN1bHRzIHRvLgorICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgb3V0cHV0ID0gbmV3IFByaW50V3JpdGVyKG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBKVW5pdFJlc3VsdEZvcm1hdHRlciNzZXRTeXN0ZW1PdXRwdXQoU3RyaW5nKQorICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbU91dHB1dChTdHJpbmcgb3V0KSB7CisgICAgICAgIHN5c3RlbU91dHB1dCA9IG91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIEpVbml0UmVzdWx0Rm9ybWF0dGVyI3NldFN5c3RlbUVycm9yKFN0cmluZykKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1FcnJvcihTdHJpbmcgZXJyKSB7CisgICAgICAgIHN5c3RlbUVycm9yID0gZXJyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHdob2xlIHRlc3RzdWl0ZSBzdGFydGVkLgorICAgICAqIEBwYXJhbSBzdWl0ZSB0aGUgdGVzdCBzdWl0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgeworICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gUXVpY2sgcmV0dXJuIC0gbm8gb3V0cHV0IGRvIG5vdGhpbmcuCisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdHN1aXRlOiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKHN1aXRlLmdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIG91dHB1dC53cml0ZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHdob2xlIHRlc3RzdWl0ZSBlbmRlZC4KKyAgICAgKiBAcGFyYW0gc3VpdGUgdGhlIHRlc3Qgc3VpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlRlc3RzIHJ1bjogIik7CisgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5ydW5Db3VudCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIEZhaWx1cmVzOiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKHN1aXRlLmZhaWx1cmVDb3VudCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIEVycm9yczogIik7CisgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5lcnJvckNvdW50KCkpOworICAgICAgICBzYi5hcHBlbmQoIiwgVGltZSBlbGFwc2VkOiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKG51bWJlckZvcm1hdC5mb3JtYXQoc3VpdGUuZ2V0UnVuVGltZSgpIC8gT05FX1NFQ09ORCkpOworICAgICAgICBzYi5hcHBlbmQoIiBzZWMiKTsKKyAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKworICAgICAgICAvLyBhcHBlbmQgdGhlIGVyciBhbmQgb3V0cHV0IHN0cmVhbXMgdG8gdGhlIGxvZworICAgICAgICBpZiAoc3lzdGVtT3V0cHV0ICE9IG51bGwgJiYgc3lzdGVtT3V0cHV0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0iKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN5c3RlbU91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLSIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN5c3RlbUVycm9yICE9IG51bGwgJiYgc3lzdGVtRXJyb3IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgRXJyb3IgLS0tLS0tLS0tLS0tLS0tLS0iKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN5c3RlbUVycm9yKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlc3VsdFdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShyZXN1bHRzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG91dHB1dC5mbHVzaCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob3V0ICE9IFN5c3RlbS5vdXQgJiYgb3V0ICE9IFN5c3RlbS5lcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0ZXN0IHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIHRlc3QgYSB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdGVzdCBlbmRlZC4KKyAgICAgKiBAcGFyYW0gdGVzdCBhIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZsdDs9IDMuNC4KKyAgICAgKgorICAgICAqIDxwPkEgVGVzdCBmYWlsZWQuCisgICAgICogQHBhcmFtIHRlc3QgYSB0ZXN0CisgICAgICogQHBhcmFtIHQgICAgdGhlIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgZm9ybWF0RXJyb3IoIlx0RkFJTEVEIiwgdGVzdCwgdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lciBmb3IgSlVuaXQgJmd0OyAzLjQuCisgICAgICoKKyAgICAgKiA8cD5BIFRlc3QgZmFpbGVkLgorICAgICAqIEBwYXJhbSB0ZXN0IGEgdGVzdAorICAgICAqIEBwYXJhbSB0ICAgIHRoZSBhc3NlcnRpb24gZmFpbGVkIGJ5IHRoZSB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKKyAgICAgICAgYWRkRmFpbHVyZSh0ZXN0LCAoVGhyb3dhYmxlKSB0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHRlc3QgY2F1c2VkIGFuIGVycm9yLgorICAgICAqIEBwYXJhbSB0ZXN0ICBhIHRlc3QKKyAgICAgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHRocm93biBieSB0aGUgdGVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgIGZvcm1hdEVycm9yKCJcdENhdXNlZCBhbiBFUlJPUiIsIHRlc3QsIGVycm9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgdGhlIHRlc3QgZm9yIHByaW50aW5nLi4KKyAgICAgKiBAcGFyYW0gdGVzdCBhIHRlc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgdGVzdG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFRlc3QoVGVzdCB0ZXN0KSB7CisgICAgICAgIGlmICh0ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiTnVsbCBUZXN0OiAiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICJUZXN0Y2FzZTogIiArIHRlc3QudG9TdHJpbmcoKSArICI6IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCBhbiBlcnJvciBhbmQgcHJpbnQgaXQuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgZXJyb3IKKyAgICAgKiBAcGFyYW0gdGVzdCB0aGUgdGVzdCB0aGF0IGZhaWxlZAorICAgICAqIEBwYXJhbSBlcnJvciB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlIHRlc3QgdGhyZXcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZm9ybWF0RXJyb3IoU3RyaW5nIHR5cGUsIFRlc3QgdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVuZFRlc3QodGVzdCk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHRXcml0ZXIucHJpbnRsbihmb3JtYXRUZXN0KHRlc3QpICsgdHlwZSk7CisgICAgICAgIHJlc3VsdFdyaXRlci5wcmludGxuKGVycm9yLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIFN0cmluZyBzdHJhY2UgPSBKVW5pdFRlc3RSdW5uZXIuZ2V0RmlsdGVyZWRUcmFjZShlcnJvcik7CisgICAgICAgIHJlc3VsdFdyaXRlci5wcmludGxuKHN0cmFjZSk7CisgICAgICAgIHJlc3VsdFdyaXRlci5wcmludGxuKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQ29uc3RhbnRzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWU2OGUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCisvKioKKyAqIENvbnN0YW50cywgbGlrZSBmaWxlbmFtZXMgc2hhcmVkIGJldHdlZW4gdmFyaW91cyBjbGFzc2VzIGluIHRoaXMgcGFja2FnZS4KKyAqLworcHVibGljIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTFRfT05fRVJST1IgPSAiaGFsdE9uRXJyb3I9IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTFRfT05fRkFJTFVSRSA9ICJoYWx0T25GYWlsdXJlPSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJUUkFDRSA9ICJmaWx0ZXJ0cmFjZT0iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JBU0hGSUxFID0gImNyYXNoZmlsZT0iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX0ZJUlNUX1RFU1QgPSAiQmVmb3JlRmlyc3RUZXN0IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BTRklMRSA9ICJwcm9wc2ZpbGU9IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dPVVRQVVQgPSAic2hvd291dHB1dD0iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX1RPX0ZPUk1BVFRFUlMgPSAib3V0cHV0dG9mb3JtYXR0ZXJzPSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVIgPSAiZm9ybWF0dGVyPSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dURVNUTElTVEVORVJFVkVOVFMgPSAibG9ndGVzdGxpc3RlbmVyZXZlbnRzPSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUU0ZJTEUgPSAidGVzdHNmaWxlPSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNSU5BVEVEX1NVQ0NFU1NGVUxMWSA9ICJ0ZXJtaW5hdGVkIHN1Y2Nlc3NmdWxseSI7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9ET01VdGlsLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9ET01VdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1YjAyNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0RPTVV0aWwuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247CitpbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKKworLyoqCisgKiBTb21lIHV0aWxpdGllcyB0aGF0IG1pZ2h0IGJlIHVzZWZ1bCB3aGVuIG1hbmlwdWxhdGluZyBET00gdHJlZXMuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRE9NVXRpbCB7CisKKyAgICAvKiogdW51c2VkIGNvbnN0cnVjdG9yICovCisgICAgcHJpdmF0ZSBET01VdGlsKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBpbnRlcmZhY2UgdG8gYmUgYXBwbGllZCB3aGVuIGl0ZXJhdGluZyBvdmVyIGEgRE9NIHRyZWUuCisgICAgICogSnVzdCB0aGluayBvZiBpdCBsaWtlIGEgPHR0PkZpbGVGaWx0ZXI8L3R0PiBjbG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE5vZGVGaWx0ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtICAgICAgIG5vZGUgICAgdGhlIG5vZGUgdG8gY2hlY2sgZm9yIGFjY2VwdGFuY2UuCisgICAgICAgICAqIEByZXR1cm4gICAgICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBub2RlIGlzIGFjY2VwdGVkIGJ5IHRoaXMgZmlsdGVyLAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPHR0PmZhbHNlPC90dD4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gYWNjZXB0KE5vZGUgbm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbGlzdCBhIHNldCBvZiBub2RlIHRoYXQgbWF0Y2ggYSBzcGVjaWZpYyBmaWx0ZXIuIFRoZSBsaXN0IGNhbiBiZSBtYWRlCisgICAgICogcmVjdXJzaXZlbHkgb3Igbm90LgorICAgICAqIEBwYXJhbSAgIHBhcmVudCAgdGhlIHBhcmVudCBub2RlIHRvIHNlYXJjaCBmcm9tCisgICAgICogQHBhcmFtICAgZmlsdGVyICB0aGUgZmlsdGVyIHRoYXQgY2hpbGRyZW4gc2hvdWxkIG1hdGNoLgorICAgICAqIEBwYXJhbSAgIHJlY3Vyc2UgPHR0PnRydWU8L3R0PiBpZiB5b3Ugd2FudCB0aGUgbGlzdCB0byBiZSBtYWRlIHJlY3Vyc2l2ZWx5CisgICAgICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPHR0PmZhbHNlPC90dD4uCisgICAgICogQHJldHVybiB0aGUgbm9kZSBsaXN0IHRoYXQgbWF0Y2hlcyB0aGUgZmlsdGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTm9kZUxpc3QgbGlzdENoaWxkTm9kZXMoTm9kZSBwYXJlbnQsIE5vZGVGaWx0ZXIgZmlsdGVyLCBib29sZWFuIHJlY3Vyc2UpIHsKKyAgICAgICAgTm9kZUxpc3RJbXBsIG1hdGNoZXMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7CisgICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBsZW4gPSBjaGlsZHJlbi5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGRFbGVtZW50KGNoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3QgcmVjbWF0Y2hlcyA9IGxpc3RDaGlsZE5vZGVzKGNoaWxkLCBmaWx0ZXIsIHJlY3Vyc2UpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVjbGVuZ3RoID0gcmVjbWF0Y2hlcy5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZWNsZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGRFbGVtZW50KHJlY21hdGNoZXMuaXRlbShpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfQorCisgICAgLyoqIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBhIG5vZGVsaXN0ICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb2RlTGlzdEltcGwgZXh0ZW5kcyBWZWN0b3IgaW1wbGVtZW50cyBOb2RlTGlzdCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMxNzU3NDkxNTAwODA5NDY0MjNMOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgbGlzdC4KKyAgICAgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBwYXJ0aWN1bGFyIG5vZGUuCisgICAgICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCBvZiB0aGUgbm9kZSB0byBnZXQuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5vZGUgaWYgdGhlIGluZGV4IGlzIGluIGJvdW5kcywgbnVsbCBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTm9kZSBpdGVtKGludCBpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoTm9kZSkgZWxlbWVudEF0KGkpOworICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gY29uZm9ybWluZyB0byBOb2RlTGlzdCBpbnRlcmZhY2UKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIGFuIGVsZW1lbnQuCisgICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgZnJvbS4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdlIGFyZSBsb29raW5nIGZvciB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUKKyAgICAgKiAgICAgICAgIGF0dHJpYnV0ZSB3YXMgbm90IGZvdW5kIG9yIGlmIDx0dD5ub2RlPC90dD4gaXMgbm90IGFuIDx0dD5FbGVtZW50PC90dD4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9kZUF0dHJpYnV0ZShOb2RlIG5vZGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgeworICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlIG92ZXIgdGhlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gbm9kZSBhbmQgcmV0dXJuIHRoZSBmaXJzdCBub2RlCisgICAgICogdGhhdCBoYXMgYSBzcGVjaWZpYyBuYW1lLgorICAgICAqIEBwYXJhbSAgIHBhcmVudCAgdGhlIG5vZGUgdG8gc2VhcmNoIGNoaWxkIGZyb20uIENhbiBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqIEBwYXJhbSAgIHRhZ25hbWUgdGhlIGNoaWxkIG5hbWUgd2UgYXJlIGxvb2tpbmcgZm9yLiBDYW5ub3QgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKiBAcmV0dXJuICB0aGUgZmlyc3QgY2hpbGQgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lIG9yIDx0dD5udWxsPC90dD4gaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBwYXJlbnQgaXMgPHR0Pm51bGw8L3R0PiBvciBpZiBhIGNoaWxkIGRvZXMgbm90IG1hdGNoIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgZ2l2ZW4gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0Q2hpbGRCeVRhZ05hbWUgKE5vZGUgcGFyZW50LCBTdHJpbmcgdGFnbmFtZSkgeworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIE5vZGVMaXN0IGNoaWxkTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgIGZpbmFsIGludCBsZW4gPSBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZExpc3QuaXRlbShpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUKKyAgICAgICAgICAgICAgICAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyh0YWduYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoRWxlbWVudCkgY2hpbGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIHRyZWUgd2Fsa2VyIHRoYXQgd2lsbCBjbG9uZSByZWN1cnNpdmVseSBhIG5vZGUuIFRoaXMgaXMgdG8KKyAgICAgKiBhdm9pZCB1c2luZyBwYXJzZXItc3BlY2lmaWMgQVBJIHN1Y2ggYXMgU3VuJ3MgPHR0PmNoYW5nZU5vZGVPd25lcjwvdHQ+CisgICAgICogd2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIERPTSBMMSBpbXBsZW1lbnRhdGlvbnMgc2luY2UgPHR0PmNsb25lTm9kZShib29sZWFuKTwvdHQ+CisgICAgICogd2lsbCBub3QgY2hhbmdlIHRoZSBvd25lciBkb2N1bWVudC4KKyAgICAgKiA8dHQ+Y2hhbmdlTm9kZU93bmVyPC90dD4gaXMgbXVjaCBmYXN0ZXIgYW5kIGF2b2lkIHRoZSBjb3N0bHkgY2xvbmluZyBwcm9jZXNzLgorICAgICAqIDx0dD5pbXBvcnROb2RlPC90dD4gaXMgaW4gdGhlIERPTSBMMiBpbnRlcmZhY2UuCisgICAgICogQHBhcmFtICAgcGFyZW50ICB0aGUgbm9kZSBwYXJlbnQgdG8gd2hpY2ggd2Ugc2hvdWxkIGRvIHRoZSBpbXBvcnQgdG8uCisgICAgICogQHBhcmFtICAgY2hpbGQgICB0aGUgbm9kZSB0byBjbG9uZSByZWN1cnNpdmVseS4gSXRzIGNsb25lIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgYXBwZW5kZWQgdG8gPHR0PnBhcmVudDwvdHQ+LgorICAgICAqIEByZXR1cm4gIHRoZSBjbG9uZWQgbm9kZSB0aGF0IGlzIGFwcGVuZGVkIHRvIDx0dD5wYXJlbnQ8L3R0PgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTm9kZSBpbXBvcnROb2RlKE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7CisgICAgICAgIE5vZGUgY29weSA9IG51bGw7CisgICAgICAgIGZpbmFsIERvY3VtZW50IGRvYyA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7CisKKyAgICAgICAgc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7CisgICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6CisgICAgICAgICAgICBjb3B5ID0gZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbigoKENEQVRBU2VjdGlvbikgY2hpbGQpLmdldERhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERToKKyAgICAgICAgICAgIGNvcHkgPSBkb2MuY3JlYXRlQ29tbWVudCgoKENvbW1lbnQpIGNoaWxkKS5nZXREYXRhKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgorICAgICAgICAgICAgY29weSA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KCgoRWxlbWVudCkgY2hpbGQpLmdldFRhZ05hbWUoKSk7CisgICAgICAgICAgICBjb3B5ID0gZWxlbTsKKyAgICAgICAgICAgIGZpbmFsIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZShhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERToKKyAgICAgICAgICAgIGNvcHkgPSBkb2MuY3JlYXRlRW50aXR5UmVmZXJlbmNlKGNoaWxkLmdldE5vZGVOYW1lKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6CisgICAgICAgICAgICBmaW5hbCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBjaGlsZDsKKyAgICAgICAgICAgIGNvcHkgPSBkb2MuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHBpLmdldFRhcmdldCgpLCBwaS5nZXREYXRhKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6CisgICAgICAgICAgICBjb3B5ID0gZG9jLmNyZWF0ZVRleHROb2RlKCgoVGV4dCkgY2hpbGQpLmdldERhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBub2RlIHR5cGU6ICIgKyBjaGlsZC5nZXROb2RlVHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9rYXkgd2UgaGF2ZSBhIGNvcHkgb2YgdGhlIGNoaWxkLCBub3cgdGhlIGNoaWxkIGJlY29tZXMgdGhlIHBhcmVudAorICAgICAgICAvLyBhbmQgd2UgYXJlIGl0ZXJhdGluZyByZWN1cnNpdmVseSBvdmVyIGl0cyBjaGlsZHJlbi4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIE5vZGVMaXN0IGNoaWxkcmVuID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGNoaWxkcmVuLmdldExlbmd0aCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5vZGUgbmV3Q2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0Tm9kZShjb3B5LCBuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJpbmdvIGFwcGVuZCBpdC4gKHRoaXMgc2hvdWxkIG5vcm1hbGx5IG5vdCBiZSBkb25lIGhlcmUpCisgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjb3B5KTsKKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRW51bWVyYXRpb25zLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9FbnVtZXJhdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjc1NDdlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRW51bWVyYXRpb25zLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKy8qKgorICogQSBjb3VwbGUgb2YgbWV0aG9kcyByZWxhdGVkIHRvIGVudW1lcmF0aW9ucyB0aGF0IG1pZ2h0IGJlIHVzZWZ1bC4KKyAqIFRoaXMgY2xhc3Mgc2hvdWxkIHByb2JhYmx5IGRpc2FwcGVhciBvbmNlIHRoZSByZXF1aXJlZCBKREsgaXMgc2V0IHRvIDEuMgorICogaW5zdGVhZCBvZiAxLjEuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW51bWVyYXRpb25zIHsKKworICAgICAgICBwcml2YXRlIEVudW1lcmF0aW9ucygpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBjcmVhdGVzIGFuIGVudW1lcmF0aW9uIGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cy4KKyAgICAgICAgICogQHBhcmFtICAgICAgIGFycmF5ICAgdGhlIGFycmF5IG9mIG9iamVjdCB0byBlbnVtZXJhdGUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIG92ZXIgdGhlIGFycmF5IG9mIG9iamVjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGZyb21BcnJheShPYmplY3RbXSBhcnJheSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlFbnVtZXJhdGlvbihhcnJheSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgKiBjcmVhdGVzIGFuIGVudW1lcmF0aW9uIGZyb20gYW4gYXJyYXkgb2YgZW51bWVyYXRpb24uIFRoZSBjcmVhdGVkIGVudW1lcmF0aW9uCisgICAgICAgICogd2lsbCBzZXF1ZW50aWFsbHkgZW51bWVyYXRlIG92ZXIgYWxsIGVsZW1lbnRzIG9mIGVhY2ggZW51bWVyYXRpb24gYW5kIHNraXAKKyAgICAgICAgKiA8dHQ+bnVsbDwvdHQ+IGVudW1lcmF0aW9uIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAgICAgICAgKiBAcGFyYW0gICAgICAgIGVudW1zICAgdGhlIGFycmF5IG9mIGVudW1lcmF0aW9ucy4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGlvbiBvdmVyIHRoZSBhcnJheSBvZiBlbnVtZXJhdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGZyb21Db21wb3VuZChFbnVtZXJhdGlvbltdIGVudW1zKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3VuZEVudW1lcmF0aW9uKGVudW1zKTsKKyAgICAgICAgfQorCit9CisKKworLyoqCisgKiBDb252ZW5pZW50IGVudW1lcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KKyAqLworY2xhc3MgQXJyYXlFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKKworICAgICAgICAvKiogb2JqZWN0IGFycmF5ICovCisgICAgICAgIHByaXZhdGUgT2JqZWN0W10gYXJyYXk7CisKKyAgICAgICAgLyoqIGN1cnJlbnQgaW5kZXggKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9zOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplIGEgbmV3IGVudW1lcmF0aW9uIHRoYXQgd3JhcHMgYW4gYXJyYXkuCisgICAgICAgICAqIEBwYXJhbSAgICAgICBhcnJheSAgIHRoZSBhcnJheSBvZiBvYmplY3QgdG8gZW51bWVyYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFycmF5RW51bWVyYXRpb24oT2JqZWN0W10gYXJyYXkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7CisgICAgICAgICAgICAgICAgdGhpcy5wb3MgPSAwOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0cyBpZiB0aGlzIGVudW1lcmF0aW9uIGNvbnRhaW5zIG1vcmUgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoaXMgZW51bWVyYXRpb24gb2JqZWN0CisgICAgICAgICAqICAgICAgICAgICBjb250YWlucyBhdCBsZWFzdCBvbmUgbW9yZSBlbGVtZW50IHRvIHByb3ZpZGU7CisgICAgICAgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChwb3MgPCBhcnJheS5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGlzIGVudW1lcmF0aW9uIGlmIHRoaXMgZW51bWVyYXRpb24KKyAgICAgICAgICogb2JqZWN0IGhhcyBhdCBsZWFzdCBvbmUgbW9yZSBlbGVtZW50IHRvIHByb3ZpZGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gICAgIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgICAgICogQHRocm93cyAgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiAgaWYgbm8gbW9yZSBlbGVtZW50cyBleGlzdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKGhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGFycmF5W3Bvc107CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICB9Cit9CisvKioKKyAqIENvbnZlbmllbnQgZW51bWVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiBlbnVtZXJhdGlvbi4gRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogRW51bWVyYXRpb24gZTEgPSB2MS5lbGVtZW50cygpOworICogd2hpbGUgKGUxLmhhc01vcmVFbGVtZW50cygpKSB7CisgKiAgICAvLyBkbyBzb21ldGhpbmcKKyAqIH0KKyAqIEVudW1lcmF0aW9uIGUyID0gdjIuZWxlbWVudHMoKTsKKyAqIHdoaWxlIChlMi5oYXNNb3JlRWxlbWVudHMoKSkgeworICogICAgLy8gZG8gdGhlIHNhbWUgdGhpbmcKKyAqIH0KKyAqIDwvcHJlPgorICogY2FuIGJlIHdyaXR0ZW4gYXM6CisgKiA8cHJlPgorICogRW51bWVyYXRpb25bXSBlbnVtcyA9IHsgdjEuZWxlbWVudHMoKSwgdjIuZWxlbWVudHMoKSB9OworICogRW51bWVyYXRpb24gZSA9IEVudW1lcmF0aW9ucy5mcm9tQ29tcG91bmQoZW51bXMpOworICogd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAqICAgIC8vIGRvIHNvbWV0aGluZworICogfQorICogPC9wcmU+CisgKiBOb3RlIHRoYXQgdGhlIGVudW1lcmF0aW9uIHdpbGwgc2tpcCBudWxsIGVsZW1lbnRzIGluIHRoZSBhcnJheS4gVGhlIGZvbGxvd2luZyBpcworICogdGh1cyBwb3NzaWJsZToKKyAqIDxwcmU+CisgKiBFbnVtZXJhdGlvbltdIGVudW1zID0geyB2MS5lbGVtZW50cygpLCBudWxsLCB2Mi5lbGVtZW50cygpIH07IC8vIGEgbnVsbCBlbnVtZXJhdGlvbiBpbiB0aGUgYXJyYXkKKyAqIEVudW1lcmF0aW9uIGUgPSBFbnVtZXJhdGlvbnMuZnJvbUNvbXBvdW5kKGVudW1zKTsKKyAqIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgKiAgICAvLyBkbyBzb21ldGhpbmcKKyAqIH0KKyAqIDwvcHJlPgorICovCisgY2xhc3MgQ29tcG91bmRFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKKworICAgICAgICAvKiogZW51bWVyYXRpb24gYXJyYXkgKi8KKyAgICAgICAgcHJpdmF0ZSBFbnVtZXJhdGlvbltdIGVudW1BcnJheTsKKworICAgICAgICAvKiogaW5kZXggaW4gdGhlIGVudW1zIGFycmF5ICovCisgICAgICAgIHByaXZhdGUgaW50IGluZGV4ID0gMDsKKworICAgIHB1YmxpYyBDb21wb3VuZEVudW1lcmF0aW9uKEVudW1lcmF0aW9uW10gZW51bWFycmF5KSB7CisgICAgICAgICAgICAgICAgdGhpcy5lbnVtQXJyYXkgPSBlbnVtYXJyYXk7CisgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0cyBpZiB0aGlzIGVudW1lcmF0aW9uIGNvbnRhaW5zIG1vcmUgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoaXMgZW51bWVyYXRpb24gb2JqZWN0CisgICAgICAgICAqICAgICAgICAgICBjb250YWlucyBhdCBsZWFzdCBvbmUgbW9yZSBlbGVtZW50IHRvIHByb3ZpZGU7CisgICAgICAgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbnVtQXJyYXkubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW51bUFycmF5W2luZGV4XSAhPSBudWxsICYmIGVudW1BcnJheVtpbmRleF0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyBlbnVtZXJhdGlvbiBpZiB0aGlzIGVudW1lcmF0aW9uCisgICAgICAgICAqIG9iamVjdCBoYXMgYXQgbGVhc3Qgb25lIG1vcmUgZWxlbWVudCB0byBwcm92aWRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgICB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgZW51bWVyYXRpb24uCisgICAgICAgICAqIEB0aHJvd3MgIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gIGlmIG5vIG1vcmUgZWxlbWVudHMgZXhpc3QuCisgICAgICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKGhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW51bUFycmF5W2luZGV4XS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9GYWlsdXJlUmVjb3JkZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0ZhaWx1cmVSZWNvcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODBhYmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9GYWlsdXJlUmVjb3JkZXIuamF2YQpAQCAtMCwwICsxLDQyMSBAQAorLyoNCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICoNCisgKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0Ow0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsNCitpbXBvcnQgamF2YS51dGlsLkRhdGU7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsNCitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7DQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsNCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7DQorDQorLyoqDQorICogPHA+Q29sbGVjdHMgYWxsIGZhaWxpbmcgdGVzdCA8aT5jYXNlczwvaT4gYW5kIGNyZWF0ZXMgYSBuZXcgSlVuaXQgdGVzdCBjbGFzcyBjb250YWluaW5nDQorICogYSBzdWl0ZSgpIG1ldGhvZCB3aGljaCBjYWxscyB0aGVzZSBmYWlsZWQgdGVzdHMuPC9wPg0KKyAqIDxwPkhhdmluZyBjbGFzc2VzIDxpPkE8L2k+IC4uLiA8aT5EPC9pPiB3aXRoIGVhY2ggc2V2ZXJhbCB0ZXN0Y2FzZXMgeW91IGNvdWxkIGVhcm4gYSBuZXcNCisgKiB0ZXN0IGNsYXNzIGxpa2UNCisgKiA8cHJlPg0KKyAqIC8vIGdlbmVyYXRlZCBvbjogMjAwNy4wOC4wNiAwOTo0MjozNCw1NTUNCisgKiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7DQorICogcHVibGljIGNsYXNzIEZhaWxlZFRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KKyAqICAgICBwdWJsaWMgRmFpbGVkVGVzdHMoU3RyaW5nIHRlc3RuYW1lKSB7DQorICogICAgICAgICBzdXBlcih0ZXN0bmFtZSk7DQorICogICAgIH0NCisgKiAgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KKyAqICAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KKyAqICAgICAgICAgc3VpdGUuYWRkVGVzdCggbmV3IEIoInRlc3QwNCIpICk7DQorICogICAgICAgICBzdWl0ZS5hZGRUZXN0KCBuZXcgb3JnLkQoInRlc3QxMCIpICk7DQorICogICAgICAgICByZXR1cm4gc3VpdGU7DQorICogICAgIH0NCisgKiB9DQorICogPC9wcmU+DQorICoNCisgKiBCZWNhdXNlIGVhY2ggcnVubmluZyB0ZXN0IGNhc2UgZ2V0cyBpdHMgb3duIGZvcm1hdHRlciwgd2UgY29sbGVjdA0KKyAqIHRoZSBmYWlsaW5nIHRlc3QgY2FzZXMgaW4gYSBzdGF0aWMgbGlzdC4gQmVjYXVzZSB3ZSBkb250IGhhdmUgYSBmaW5hbGl6ZXINCisgKiBtZXRob2QgaW4gdGhlIGZvcm1hdHRlcnMgImxpZmVjeWNsZSIsIHdlIHJlZ2lzdGVyIHRoaXMgZm9ybWF0dGVyIGFzDQorICogQnVpbGRMaXN0ZW5lciBhbmQgZ2VuZXJhdGUgdGhlIG5ldyBqYXZhIHNvdXJjZSBvbiB0YXNrRmluaXNoZWQgZXZlbnQuDQorICoNCisgKiBAc2luY2UgQW50IDEuOC4wDQorICovDQorcHVibGljIGNsYXNzIEZhaWx1cmVSZWNvcmRlciBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgSlVuaXRSZXN1bHRGb3JtYXR0ZXIsIEJ1aWxkTGlzdGVuZXIgew0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBpcyB0aGUgbmFtZSBvZiBhIG1hZ2ljIFN5c3RlbSBwcm9wZXJ0eSAoe0B2YWx1ZX0pLiBUaGUgdmFsdWUgb2YgdGhpcw0KKyAgICAgKiA8Yj5TeXN0ZW08L2I+IHByb3BlcnR5IHNob3VsZCBwb2ludCB0byB0aGUgbG9jYXRpb24gd2hlcmUgdG8gc3RvcmUgdGhlDQorICAgICAqIGdlbmVyYXRlZCBjbGFzcyAod2l0aG91dCBzdWZmaXgpLg0KKyAgICAgKiBEZWZhdWx0IGxvY2F0aW9uIGFuZCBuYW1lIGlzIGRlZmluZWQgaW4gREVGQVVMVF9DTEFTU19MT0NBVElPTi4NCisgICAgICogQHNlZSAjREVGQVVMVF9DTEFTU19MT0NBVElPTg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFHSUNfUFJPUEVSVFlfQ0xBU1NfTE9DQVRJT04NCisgICAgICAgID0gImFudC5qdW5pdC5mYWlsdXJlQ29sbGVjdG9yIjsNCisNCisgICAgLyoqIERlZmF1bHQgbG9jYXRpb24gYW5kIG5hbWUgZm9yIHRoZSBnZW5lcmF0ZWQgSlVuaXQgY2xhc3MgZmlsZS4ge0B2YWx1ZX0gKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTEFTU19MT0NBVElPTg0KKyAgICAgICAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikgKyAiRmFpbGVkVGVzdHMiOw0KKw0KKyAgICAvKiogUHJlZml4IGZvciBsb2dnaW5nLiB7QHZhbHVlfSAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1BSRUZJWCA9ICIgICAgW2p1bml0XSI7DQorDQorICAgIC8qKiBDbGFzcyBuYW1lcyBvZiBmYWlsZWQgdGVzdHMgd2l0aG91dCBkdXBsaWNhdGVzLiAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBTb3J0ZWRTZXQvKjxUZXN0SW5mb3M+Ki8gZmFpbGVkVGVzdHMgPSBuZXcgVHJlZVNldCgpOw0KKw0KKyAgICAvKiogQSB3cml0ZXIgZm9yIHdyaXRpbmcgdGhlIGdlbmVyYXRlZCBzb3VyY2UgdG8uICovDQorICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgd3JpdGVyOw0KKw0KKyAgICAvKioNCisgICAgICogTG9jYXRpb24gYW5kIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBKVW5pdCBjbGFzcy4NCisgICAgICogTGF6eSBpbnN0YW50aWF0ZWQgdmlhIGdldExvY2F0aW9uTmFtZSgpLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxvY2F0aW9uTmFtZTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIChsYXp5IGV2YWx1YXRlZCkgbG9jYXRpb24gZm9yIHRoZSBjb2xsZWN0b3IgY2xhc3MuDQorICAgICAqIE9yZGVyIGZvciBldmFsdWF0aW9uOiBTeXN0ZW0gcHJvcGVydHkgPiBBbnQgcHJvcGVydHkgPiBkZWZhdWx0IHZhbHVlDQorICAgICAqIEByZXR1cm4gbG9jYXRpb24gZm9yIHRoZSBjb2xsZWN0b3IgY2xhc3MNCisgICAgICogQHNlZSAjTUFHSUNfUFJPUEVSVFlfQ0xBU1NfTE9DQVRJT04NCisgICAgICogQHNlZSAjREVGQVVMVF9DTEFTU19MT0NBVElPTg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25OYW1lKCkgew0KKyAgICAgICAgaWYgKGxvY2F0aW9uTmFtZSA9PSBudWxsKSB7DQorICAgICAgICAgICAgU3RyaW5nIHN5c3Byb3BWYWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShNQUdJQ19QUk9QRVJUWV9DTEFTU19MT0NBVElPTik7DQorICAgICAgICAgICAgU3RyaW5nIGFudHByb3BWYWx1ZSA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShNQUdJQ19QUk9QRVJUWV9DTEFTU19MT0NBVElPTik7DQorDQorICAgICAgICAgICAgaWYgKHN5c3Byb3BWYWx1ZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGxvY2F0aW9uTmFtZSA9IHN5c3Byb3BWYWx1ZTsNCisgICAgICAgICAgICAgICAgdmVyYm9zZSgiU3lzdGVtIHByb3BlcnR5ICciICsgTUFHSUNfUFJPUEVSVFlfQ0xBU1NfTE9DQVRJT04gKyAiJyBzZXQsIHNvIHVzZSAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXRzIHZhbHVlICciICsgc3lzcHJvcFZhbHVlICsgIicgYXMgbG9jYXRpb24gZm9yIGNvbGxlY3RvciBjbGFzcy4iKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGFudHByb3BWYWx1ZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGxvY2F0aW9uTmFtZSA9IGFudHByb3BWYWx1ZTsNCisgICAgICAgICAgICAgICAgdmVyYm9zZSgiQW50IHByb3BlcnR5ICciICsgTUFHSUNfUFJPUEVSVFlfQ0xBU1NfTE9DQVRJT04gKyAiJyBzZXQsIHNvIHVzZSAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXRzIHZhbHVlICciICsgYW50cHJvcFZhbHVlICsgIicgYXMgbG9jYXRpb24gZm9yIGNvbGxlY3RvciBjbGFzcy4iKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBsb2NhdGlvbk5hbWUgPSBERUZBVUxUX0NMQVNTX0xPQ0FUSU9OOw0KKyAgICAgICAgICAgICAgICB2ZXJib3NlKCJTeXN0ZW0gcHJvcGVydHkgJyIgKyBNQUdJQ19QUk9QRVJUWV9DTEFTU19MT0NBVElPTiArICInIG5vdCBzZXQsIHNvIHVzZSAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAidmFsdWUgYXMgbG9jYXRpb24gZm9yIGNvbGxlY3RvciBjbGFzczogJyINCisgICAgICAgICAgICAgICAgICAgICAgICArIERFRkFVTFRfQ0xBU1NfTE9DQVRJT04gKyAiJyIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBGaWxlIGxvY2F0aW9uRmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uTmFtZSk7DQorICAgICAgICAgICAgaWYgKCFsb2NhdGlvbkZpbGUuaXNBYnNvbHV0ZSgpKSB7DQorICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIGxvY2F0aW9uTmFtZSk7DQorICAgICAgICAgICAgICAgIGxvY2F0aW9uTmFtZSA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7DQorICAgICAgICAgICAgICAgIHZlcmJvc2UoIkxvY2F0aW9uIGZpbGUgaXMgcmVsYXRpdmUgKCIgKyBsb2NhdGlvbkZpbGUgKyAiKSINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgdXNlIGFic29sdXRlIHBhdGggaW5zdGVhZCAoIiArIGxvY2F0aW9uTmFtZSArICIpIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIGxvY2F0aW9uTmFtZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBBbnQgcnVudGltZSBieSByZWZsZWN0aW9uLiBXZSB1c2UgdGhlIHByb2plY3QgcmVmZXJlbmNlIGZvcg0KKyAgICAgKiByZWdpc3RyYXRpb24gb2YgdGhpcyBjbGFzcyBhcyBCdWlsZExpc3RlbmVyLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gcHJvamVjdA0KKyAgICAgKiAgICAgICAgICAgIHByb2plY3QgcmVmZXJlbmNlDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgew0KKyAgICAgICAgLy8gc3RvcmUgcHJvamVjdCByZWZlcmVuY2UgZm9yIGxvZ2dpbmcNCisgICAgICAgIHN1cGVyLnNldFByb2plY3QocHJvamVjdCk7DQorICAgICAgICAvLyBjaGVjayBpZiBhbHJlYWR5IHJlZ2lzdGVyZWQNCisgICAgICAgIGJvb2xlYW4gYWxyZWFkeVJlZ2lzdGVyZWQgPSBmYWxzZTsNCisgICAgICAgIFZlY3RvciBhbGxMaXN0ZW5lcnMgPSBwcm9qZWN0LmdldEJ1aWxkTGlzdGVuZXJzKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbExpc3RlbmVycy5zaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIE9iamVjdCBsaXN0ZW5lciA9IGFsbExpc3RlbmVycy5nZXQoaSk7DQorICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgRmFpbHVyZVJlY29yZGVyKSB7DQorICAgICAgICAgICAgICAgIGFscmVhZHlSZWdpc3RlcmVkID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgLy8gcmVnaXN0ZXIgaWYgbmVlZGVkDQorICAgICAgICBpZiAoIWFscmVhZHlSZWdpc3RlcmVkKSB7DQorICAgICAgICAgICAgdmVyYm9zZSgiUmVnaXN0ZXIgRmFpbHVyZVJlY29yZGVyIChAIiArIHRoaXMuaGFzaENvZGUoKSArICIpIGFzIEJ1aWxkTGlzdGVuZXIiKTsNCisgICAgICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIodGhpcyk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLy8gPT09PT0gSlVuaXRSZXN1bHRGb3JtYXR0ZXIgPT09PT0NCisNCisgICAgLyoqDQorICAgICAqIE5vdCB1c2VkDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGVuZFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZCB0aGUgZmFpbGVkIHRlc3QgdG8gdGhlIGxpc3QuDQorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0IHRoYXQgZXJyb3JlZC4NCisgICAgICogQHBhcmFtIHRocm93YWJsZSB0aGUgcmVhc29uIGl0IGVycm9yZWQuDQorICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RMaXN0ZW5lciNhZGRFcnJvcihqdW5pdC5mcmFtZXdvcmsuVGVzdCwgamF2YS5sYW5nLlRocm93YWJsZSkNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHRocm93YWJsZSkgew0KKyAgICAgICAgZmFpbGVkVGVzdHMuYWRkKG5ldyBUZXN0SW5mb3ModGVzdCkpOw0KKyAgICB9DQorDQorICAgIC8vIENoZWNrU3R5bGU6TGluZUxlbmd0aENoZWNrIE9GRiAtIEBzZWUgaXMgbG9uZw0KKyAgICAvKioNCisgICAgICogQWRkIHRoZSBmYWlsZWQgdGVzdCB0byB0aGUgbGlzdC4NCisgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QgdGhhdCBmYWlsZWQuDQorICAgICAqIEBwYXJhbSBlcnJvciB0aGUgYXNzZXJ0aW9uIHRoYXQgZmFpbGVkLg0KKyAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0TGlzdGVuZXIjYWRkRmFpbHVyZShqdW5pdC5mcmFtZXdvcmsuVGVzdCwganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yKQ0KKyAgICAgKi8NCisgICAgLy8gQ2hlY2tTdHlsZTpMaW5lTGVuZ3RoQ2hlY2sgT04NCisgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIGVycm9yKSB7DQorICAgICAgICBmYWlsZWRUZXN0cy5hZGQobmV3IFRlc3RJbmZvcyh0ZXN0KSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIE5vdCB1c2VkDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChPdXRwdXRTdHJlYW0gb3V0KSB7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIE5vdCB1c2VkDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUVycm9yKFN0cmluZyBlcnIpIHsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogTm90IHVzZWQNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtT3V0cHV0KFN0cmluZyBvdXQpIHsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogTm90IHVzZWQNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gew0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBOb3QgdXNlZA0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkgew0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBOb3QgdXNlZA0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0ZXN0KSB7DQorICAgIH0NCisNCisgICAgLy8gPT09PT0gIlRlbXBsYXRlcyIgZm9yIGdlbmVyYXRpbmcgdGhlIEpVbml0IGNsYXNzID09PT09DQorDQorICAgIHByaXZhdGUgdm9pZCB3cml0ZUphdmFDbGFzcygpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoKGdldExvY2F0aW9uTmFtZSgpICsgIi5qYXZhIikpOw0KKyAgICAgICAgICAgIHZlcmJvc2UoIldyaXRlIGNvbGxlY3RvciBjbGFzcyB0byAnIiArIHNvdXJjZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiJyIpOw0KKw0KKyAgICAgICAgICAgIHNvdXJjZUZpbGUuZGVsZXRlKCk7DQorICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZUZpbGUpKTsNCisNCisgICAgICAgICAgICBjcmVhdGVDbGFzc0hlYWRlcigpOw0KKyAgICAgICAgICAgIGNyZWF0ZVN1aXRlTWV0aG9kKCk7DQorICAgICAgICAgICAgY3JlYXRlQ2xhc3NGb290ZXIoKTsNCisNCisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uod3JpdGVyKTsNCisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ2xhc3NIZWFkZXIoKSB7DQorICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0TG9jYXRpb25OYW1lKCkucmVwbGFjZSgnXFwnLCAnLycpOw0KKyAgICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKCcvJykgPiAtMSkgew0KKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcvJykgKyAxKTsNCisgICAgICAgIH0NCisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkuTU0uZGQgSEg6bW06c3MsU1NTIik7DQorICAgICAgICB3cml0ZXIucHJpbnQoIi8vIGdlbmVyYXRlZCBvbjogIik7DQorICAgICAgICB3cml0ZXIucHJpbnRsbihzZGYuZm9ybWF0KG5ldyBEYXRlKCkpKTsNCisgICAgICAgIHdyaXRlci5wcmludGxuKCJpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Iik7DQorICAgICAgICB3cml0ZXIucHJpbnQoInB1YmxpYyBjbGFzcyAiKTsNCisgICAgICAgIHdyaXRlci5wcmludChjbGFzc05hbWUpOw0KKyAgICAgICAgLy8gSWYgdGhpcyBjbGFzcyBkb2VzIG5vdCBleHRlbmQgVEMsIEFudCBkb2VzbnQgcnVuIHRoZXNlDQorICAgICAgICB3cml0ZXIucHJpbnRsbigiIGV4dGVuZHMgVGVzdENhc2UgeyIpOw0KKyAgICAgICAgLy8gc3RhbmRhcmQgU3RyaW5nLWNvbnN0cnVjdG9yDQorICAgICAgICB3cml0ZXIucHJpbnQoIiAgICBwdWJsaWMgIik7DQorICAgICAgICB3cml0ZXIucHJpbnQoY2xhc3NOYW1lKTsNCisgICAgICAgIHdyaXRlci5wcmludGxuKCIoU3RyaW5nIHRlc3RuYW1lKSB7Iik7DQorICAgICAgICB3cml0ZXIucHJpbnRsbigiICAgICAgICBzdXBlcih0ZXN0bmFtZSk7Iik7DQorICAgICAgICB3cml0ZXIucHJpbnRsbigiICAgIH0iKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3VpdGVNZXRob2QoKSB7DQorICAgICAgICB3cml0ZXIucHJpbnRsbigiICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsiKTsNCisgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsiKTsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGZhaWxlZFRlc3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgIFRlc3RJbmZvcyB0ZXN0SW5mb3MgPSAoVGVzdEluZm9zKSBpdGVyLm5leHQoKTsNCisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiAgICAgICAgc3VpdGUuYWRkVGVzdCgiKTsNCisgICAgICAgICAgICB3cml0ZXIucHJpbnQodGVzdEluZm9zKTsNCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiKTsiKTsNCisgICAgICAgIH0NCisgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgIHJldHVybiBzdWl0ZTsiKTsNCisgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgfSIpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDbGFzc0Zvb3RlcigpIHsNCisgICAgICAgIHdyaXRlci5wcmludGxuKCJ9Iik7DQorICAgIH0NCisNCisgICAgLy8gPT09PT0gSGVscGVyIGNsYXNzZXMgYW5kIG1ldGhvZHMgPT09PT0NCisNCisgICAgLyoqDQorICAgICAqIExvZ2dpbmcgZmFjYWRlIGluIElORk8tbW9kZS4NCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTG9nLW1lc3NhZ2UNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgew0KKyAgICAgICAgZ2V0UHJvamVjdCgpLmxvZyhMT0dfUFJFRklYICsgIiAiICsgbWVzc2FnZSwgUHJvamVjdC5NU0dfSU5GTyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIExvZ2dpbmcgZmFjYWRlIGluIFZFUkJPU0UtbW9kZS4NCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTG9nLW1lc3NhZ2UNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHZlcmJvc2UoU3RyaW5nIG1lc3NhZ2UpIHsNCisgICAgICAgIGdldFByb2plY3QoKS5sb2coTE9HX1BSRUZJWCArICIgIiArIG1lc3NhZ2UsIFByb2plY3QuTVNHX1ZFUkJPU0UpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUZXN0SW5mb3MgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiB0ZXN0IGZvciBsYXRlciB1c2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgY2xhc3MgVGVzdEluZm9zIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7DQorDQorICAgICAgICAvKiogVGhlIGNsYXNzIG5hbWUgb2YgdGhlIHRlc3QuICovDQorICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7DQorDQorICAgICAgICAvKiogVGhlIG1ldGhvZCBuYW1lIG9mIHRoZSB0ZXN0Y2FzZS4gKi8NCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZE5hbWU7DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoaXMgY29uc3RydWN0b3IgZXh0cmFjdHMgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiB0ZXN0Lg0KKyAgICAgICAgICogQHBhcmFtIHRlc3QgVGVzdCB0byBhbmFseXplDQorICAgICAgICAgKi8NCisgICAgICAgIHB1YmxpYyBUZXN0SW5mb3MoVGVzdCB0ZXN0KSB7DQorICAgICAgICAgICAgY2xhc3NOYW1lID0gdGVzdC5nZXRDbGFzcygpLmdldE5hbWUoKTsNCisgICAgICAgICAgICBtZXRob2ROYW1lID0gdGVzdC50b1N0cmluZygpOw0KKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLnN1YnN0cmluZygwLCBtZXRob2ROYW1lLmluZGV4T2YoJygnKSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoaXMgU3RyaW5nLVJlcHJlc2VudGF0aW9uIGNhbiBkaXJlY3RseSBiZSB1c2VkIGZvciBpbnN0YW50aWF0aW9uIG9mDQorICAgICAgICAgKiB0aGUgSlVuaXQgdGVzdGNhc2UuDQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQorICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQ0KKyAgICAgICAgICogQHNlZSBGYWlsdXJlUmVjb3JkZXIjY3JlYXRlU3VpdGVNZXRob2QoKQ0KKyAgICAgICAgICovDQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgICAgIHJldHVybiAibmV3ICIgKyBjbGFzc05hbWUgKyAiKFwiIiArIG1ldGhvZE5hbWUgKyAiXCIpIjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogVGhlIFNvcnRlZE1hcCBuZWVkcyBjb21wYXJhYmxlIGVsZW1lbnRzLg0KKyAgICAgICAgICogQHBhcmFtIG90aGVyIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0by4NCisgICAgICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbi4NCisgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKFQpDQorICAgICAgICAgKiBAc2VlIFNvcnRlZFNldCNjb21wYXJhdG9yKCkNCisgICAgICAgICAqLw0KKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKSB7DQorICAgICAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVGVzdEluZm9zKSB7DQorICAgICAgICAgICAgICAgIFRlc3RJbmZvcyBvdGhlckluZm9zID0gKFRlc3RJbmZvcykgb3RoZXI7DQorICAgICAgICAgICAgICAgIHJldHVybiB0b1N0cmluZygpLmNvbXBhcmVUbyhvdGhlckluZm9zLnRvU3RyaW5nKCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLy8gPT09PT0gQnVpbGRMaXN0ZW5lciA9PT09PQ0KKw0KKyAgICAvKioNCisgICAgICogTm90IHVzZWQNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIE5vdCB1c2VkDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIE5vdCB1c2VkDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgew0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBOb3QgdXNlZA0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIE5vdCB1c2VkDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgew0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgdGFzayBvdXRzaWRlIG9mIHRoaXMgSlVuaXRSZXN1bHRGb3JtYXR0ZXIgaXMgdGhlIDxqdW5pdD4gdGFzay4gU28gYWxsIHRlc3RzIHBhc3NlZA0KKyAgICAgKiBhbmQgd2UgY291bGQgY3JlYXRlIHRoZSBuZXcgamF2YSBjbGFzcy4NCisgICAgICogQHBhcmFtIGV2ZW50ICBub3QgdXNlZA0KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgew0KKyAgICAgICAgaWYgKCFmYWlsZWRUZXN0cy5pc0VtcHR5KCkpIHsNCisgICAgICAgICAgICB3cml0ZUphdmFDbGFzcygpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBOb3QgdXNlZA0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRm9ybWF0dGVyRWxlbWVudC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRm9ybWF0dGVyRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOGE5NzcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9Gb3JtYXR0ZXJFbGVtZW50LmphdmEKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKKworLyoqCisgKiA8cD4gQSB3cmFwcGVyIGZvciB0aGUgaW1wbGVtZW50YXRpb25zIG9mIDxjb2RlPkpVbml0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPi4KKyAqIEluIHBhcnRpY3VsYXIsIHVzZWQgYXMgYSBuZXN0ZWQgPGNvZGU+Jmx0O2Zvcm1hdHRlciZndDs8L2NvZGU+IGVsZW1lbnQgaW4KKyAqIGEgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gdGFzay4KKyAqIDxwPiBGb3IgZXhhbXBsZSwKKyAqIDxjb2RlPjxwcmU+CisgKiAgICAgICAmbHQ7anVuaXQgcHJpbnRzdW1tYXJ5PSJubyIgaGFsdG9uZmFpbHVyZT0ieWVzIiBmb3JrPSJmYWxzZSImZ3Q7CisgKiAgICAgICAgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiIC8mZ3Q7CisgKiAgICAgICAgICAgJmx0O3Rlc3QgbmFtZT0ib3JnLmFwYWNoZS5lY3MuSW50ZXJuYXRpb25hbENoYXJUZXN0IiAvJmd0OworICogICAgICAgJmx0Oy9qdW5pdCZndDs8L3ByZT48L2NvZGU+CisgKiBhZGRzIGEgPGNvZGU+cGxhaW48L2NvZGU+IHR5cGUgaW1wbGVtZW50YXRpb24KKyAqICg8Y29kZT5QbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPikgdG8gZGlzcGxheSB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdC4KKyAqCisgKiA8cD4gRWl0aGVyIHRoZSA8Y29kZT50eXBlPC9jb2RlPiBvciB0aGUgPGNvZGU+Y2xhc3NuYW1lPC9jb2RlPiBhdHRyaWJ1dGUKKyAqIG11c3QgYmUgc2V0LgorICoKKyAqIEBzZWUgSlVuaXRUYXNrCisgKiBAc2VlIFhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyCisgKiBAc2VlIEJyaWVmSlVuaXRSZXN1bHRGb3JtYXR0ZXIKKyAqIEBzZWUgUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlcgorICogQHNlZSBGYWlsdXJlUmVjb3JkZXIKKyAqIEBzZWUgSlVuaXRSZXN1bHRGb3JtYXR0ZXIKKyAqLworcHVibGljIGNsYXNzIEZvcm1hdHRlckVsZW1lbnQgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbjsKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQgPSBTeXN0ZW0ub3V0OworICAgIHByaXZhdGUgRmlsZSBvdXRGaWxlOworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VGaWxlID0gdHJ1ZTsKKyAgICBwcml2YXRlIFN0cmluZyBpZlByb3BlcnR5OworICAgIHByaXZhdGUgU3RyaW5nIHVubGVzc1Byb3BlcnR5OworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHByb2plY3QgcmVmZXJlbmNlIGZvciBwYXNzaW5nIGl0IHRvIG5lc3RlZCBjb21wb25lbnRzLgorICAgICAqIEBzaW5jZSBBbnQgMS44CisgICAgICovCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICAvKiogeG1sIGZvcm1hdHRlciBjbGFzcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GT1JNQVRURVJfQ0xBU1NfTkFNRSA9CisgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5YTUxKVW5pdFJlc3VsdEZvcm1hdHRlciI7CisgICAgLyoqIGJyaWVmIGZvcm1hdHRlciBjbGFzcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX0ZPUk1BVFRFUl9DTEFTU19OQU1FID0KKyAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkJyaWVmSlVuaXRSZXN1bHRGb3JtYXR0ZXIiOworICAgIC8qKiBwbGFpbiBmb3JtYXR0ZXIgY2xhc3MgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFJTl9GT1JNQVRURVJfQ0xBU1NfTkFNRSA9CisgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5QbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyIjsKKyAgICAvKiogZmFpbHVyZSByZWNvcmRlciBjbGFzcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVDT1JERVJfQ0xBU1NfTkFNRSA9CisgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5GYWlsdXJlUmVjb3JkZXIiOworCisgICAgLyoqCisgICAgICogPHA+IFF1aWNrIHdheSB0byB1c2UgYSBzdGFuZGFyZCBmb3JtYXR0ZXIuCisgICAgICoKKyAgICAgKiA8cD4gQXQgdGhlIG1vbWVudCwgdGhlcmUgYXJlIHRocmVlIHN1cHBvcnRlZCBzdGFuZGFyZCBmb3JtYXR0ZXJzLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IFRoZSA8Y29kZT54bWw8L2NvZGU+IHR5cGUgdXNlcyBhIDxjb2RlPlhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPi4KKyAgICAgKiA8bGk+IFRoZSA8Y29kZT5icmllZjwvY29kZT4gdHlwZSB1c2VzIGEgPGNvZGU+QnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlcjwvY29kZT4uCisgICAgICogPGxpPiBUaGUgPGNvZGU+cGxhaW48L2NvZGU+IHR5cGUgKHRoZSBkZWZhdWx0KSB1c2VzIGEgPGNvZGU+UGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlcjwvY29kZT4uCisgICAgICogPGxpPiBUaGUgPGNvZGU+ZmFpbHVyZTwvY29kZT4gdHlwZSB1c2VzIGEgPGNvZGU+RmFpbHVyZVJlY29yZGVyPC9jb2RlPi4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPHA+IFNldHMgPGNvZGU+Y2xhc3NuYW1lPC9jb2RlPiBhdHRyaWJ1dGUgLSBzbyB5b3UgY2FuJ3QgdXNlIHRoYXQKKyAgICAgKiBhdHRyaWJ1dGUgaWYgeW91IHVzZSB0aGlzIG9uZS4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZW51bWVyYXRlZCB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlQXR0cmlidXRlIHR5cGUpIHsKKyAgICAgICAgaWYgKCJ4bWwiLmVxdWFscyh0eXBlLmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgICBzZXRDbGFzc25hbWUoWE1MX0ZPUk1BVFRFUl9DTEFTU19OQU1FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgiYnJpZWYiLmVxdWFscyh0eXBlLmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgc2V0Q2xhc3NuYW1lKEJSSUVGX0ZPUk1BVFRFUl9DTEFTU19OQU1FKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCJmYWlsdXJlIi5lcXVhbHModHlwZS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRDbGFzc25hbWUoRkFJTFVSRV9SRUNPUkRFUl9DTEFTU19OQU1FKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBtdXN0IGJlIHBsYWluLCBlbnN1cmVkIGJ5IFR5cGVBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgc2V0Q2xhc3NuYW1lKFBMQUlOX0ZPUk1BVFRFUl9DTEFTU19OQU1FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4gU2V0IG5hbWUgb2YgY2xhc3MgdG8gYmUgdXNlZCBhcyB0aGUgZm9ybWF0dGVyLgorICAgICAqCisgICAgICogPHA+IFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgPGNvZGU+SlVuaXRSZXN1bHRGb3JtYXR0ZXI8L2NvZGU+CisgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgZm9ybWF0dGVyIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOworICAgICAgICBpZiAoWE1MX0ZPUk1BVFRFUl9DTEFTU19OQU1FLmVxdWFscyhjbGFzc25hbWUpKSB7CisgICAgICAgICAgIHNldEV4dGVuc2lvbigiLnhtbCIpOworICAgICAgICB9IGVsc2UgaWYgKFBMQUlOX0ZPUk1BVFRFUl9DTEFTU19OQU1FLmVxdWFscyhjbGFzc25hbWUpKSB7CisgICAgICAgICAgIHNldEV4dGVuc2lvbigiLnR4dCIpOworICAgICAgICB9IGVsc2UgaWYgKEJSSUVGX0ZPUk1BVFRFUl9DTEFTU19OQU1FLmVxdWFscyhjbGFzc25hbWUpKSB7CisgICAgICAgICAgIHNldEV4dGVuc2lvbigiLnR4dCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG5hbWUgb2YgY2xhc3MgdG8gYmUgdXNlZCBhcyB0aGUgZm9ybWF0dGVyLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NuYW1lKCkgeworICAgICAgICByZXR1cm4gY2xhc3NuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXh0ZW5zaW9uIHRvIHVzZSBmb3IgdGhlIHJlcG9ydCBmaWxlLgorICAgICAqIEBwYXJhbSBleHQgdGhlIGV4dGVuc2lvbiB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uKFN0cmluZyBleHQpIHsKKyAgICAgICAgdGhpcy5leHRlbnNpb24gPSBleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBleHRlbnNpb24gdXNlZCBmb3IgdGhlIHJlcG9ydCBmaWxlLgorICAgICAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4gU2V0IHRoZSBmaWxlIHdoaWNoIHRoZSBmb3JtYXR0ZSBzaG91bGQgbG9nIHRvLgorICAgICAqCisgICAgICogPHA+IE5vdGUgdGhhdCBsb2dnaW5nIHRvIGZpbGUgbXVzdCBiZSBlbmFibGVkIC4KKyAgICAgKi8KKyAgICB2b2lkIHNldE91dGZpbGUoRmlsZSBvdXQpIHsKKyAgICAgICAgdGhpcy5vdXRGaWxlID0gb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPiBTZXQgb3V0cHV0IHN0cmVhbSBmb3IgZm9ybWF0dGVyIHRvIHVzZS4KKyAgICAgKgorICAgICAqIDxwPiBEZWZhdWx0cyB0byBzdGFuZGFyZCBvdXQuCisgICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IHN0cmVhbSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIGZvcm1hdHRlciBzaG91bGQgbG9nIHRvIGZpbGUuCisgICAgICogQHBhcmFtIHVzZUZpbGUgaWYgdHJ1ZSB1c2UgYSBmaWxlLCBpZiBmYWxzZSBzZW5kCisgICAgICogICAgICAgICAgICAgICAgdG8gc3RhbmRhcmQgb3V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZUZpbGUoYm9vbGVhbiB1c2VGaWxlKSB7CisgICAgICAgIHRoaXMudXNlRmlsZSA9IHVzZUZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHdoZXRoZXIgdGhlIGZvcm1hdHRlciBzaG91bGQgbG9nIHRvIGZpbGUuCisgICAgICovCisgICAgYm9vbGVhbiBnZXRVc2VGaWxlKCkgeworICAgICAgICByZXR1cm4gdXNlRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIGZvcm1hdHRlciBzaG91bGQgYmUgdXNlZC4gIEl0IHdpbGwgYmUKKyAgICAgKiB1c2VkIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQsIG90aGVyd2lzZSBpdCB3b24ndC4KKyAgICAgKiBAcGFyYW0gaWZQcm9wZXJ0eSBuYW1lIG9mIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWYoU3RyaW5nIGlmUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5pZlByb3BlcnR5ID0gaWZQcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIGZvcm1hdHRlciBzaG91bGQgTk9UIGJlIHVzZWQuIEl0CisgICAgICogd2lsbCBub3QgYmUgdXNlZCBpZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0LCBvcnRod2lzZSBpdAorICAgICAqIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gdW5sZXNzUHJvcGVydHkgbmFtZSBvZiBwcm9wZXJ0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVubGVzcyhTdHJpbmcgdW5sZXNzUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy51bmxlc3NQcm9wZXJ0eSA9IHVubGVzc1Byb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgc2VsZWN0b3IgcGFzc2VzIHRoZSBjb25kaXRpb25zIHBsYWNlZAorICAgICAqIG9uIGl0IHdpdGggPGNvZGU+aWY8L2NvZGU+IGFuZCA8Y29kZT51bmxlc3M8L2NvZGU+IHByb3BlcnRpZXMuCisgICAgICogQHBhcmFtIHQgdGhlIHRhc2sgdGhlIHRoaXMgZm9ybWF0dGVyIGlzIHVzZWQgaW4uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmb3JtYXR0ZXIgc2hvdWxkIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlKFRhc2sgdCkgeworICAgICAgICBpZiAoaWZQcm9wZXJ0eSAhPSBudWxsICYmIHQuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KGlmUHJvcGVydHkpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodW5sZXNzUHJvcGVydHkgIT0gbnVsbCAmJiB0LmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSh1bmxlc3NQcm9wZXJ0eSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBBbnQgMS4yCisgICAgICovCisgICAgSlVuaXRUYXNrTWlycm9yLkpVbml0UmVzdWx0Rm9ybWF0dGVyTWlycm9yIGNyZWF0ZUZvcm1hdHRlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVGb3JtYXR0ZXIobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHByb2plY3QgcmVmZXJlbmNlIGZvciBwYXNzaW5nIGl0IHRvIG5lc3RlZCBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSByZWZlcmVuY2UKKyAgICAgKiBAc2luY2UgQW50IDEuOAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIEpVbml0VGFza01pcnJvci5KVW5pdFJlc3VsdEZvcm1hdHRlck1pcnJvciBjcmVhdGVGb3JtYXR0ZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoY2xhc3NuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigieW91IG11c3Qgc3BlY2lmeSB0eXBlIG9yIGNsYXNzbmFtZSIpOworICAgICAgICB9CisgICAgICAgIC8vYWx0aG91Z2ggdGhpcyBjb2RlIGFwcGVhcnMgdG8gZHVwbGljYXRlIHRoYXQgb2YgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UsCisgICAgICAgIC8vd2UgY2Fubm90IHVzZSB0aGF0IGJlY2F1c2UgdGhpcyBmb3JtYXR0ZXIgbWF5IHJ1biBpbiBhIGZvcmtlZCBwcm9jZXNzLAorICAgICAgICAvL3dpdGhvdXQgdGhhdCBjbGFzcy4KKyAgICAgICAgQ2xhc3MgZiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUsIHRydWUsIGxvYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJVc2luZyBsb2FkZXIgIiArIGxvYWRlciArICIgb24gY2xhc3MgIiArIGNsYXNzbmFtZQorICAgICAgICAgICAgICAgICsgIjogIiArIGUsIGUpOworICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlVzaW5nIGxvYWRlciAiICsgbG9hZGVyICsgIiBvbiBjbGFzcyAiICsgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgKyAiOiAiICsgZSwgZSk7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgbyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvID0gZi5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSlVuaXRUYXNrTWlycm9yLkpVbml0UmVzdWx0Rm9ybWF0dGVyTWlycm9yKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXNzbmFtZSArICIgaXMgbm90IGEgSlVuaXRSZXN1bHRGb3JtYXR0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBKVW5pdFRhc2tNaXJyb3IuSlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgciA9CisgICAgICAgICAgICAoSlVuaXRUYXNrTWlycm9yLkpVbml0UmVzdWx0Rm9ybWF0dGVyTWlycm9yKSBvOworICAgICAgICBpZiAodXNlRmlsZSAmJiBvdXRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIG9wZW4gZmlsZSAiICsgb3V0RmlsZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgci5zZXRPdXRwdXQob3V0KTsKKworCisgICAgICAgIGJvb2xlYW4gbmVlZFRvU2V0UHJvamVjdFJlZmVyZW5jZSA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IHIuZ2V0Q2xhc3MoKS5nZXRGaWVsZCgicHJvamVjdCIpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZmllbGQuZ2V0KHIpOworICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvamVjdCkgeworICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFscmVhZHkgYSBwcm9qZWN0IHJlZmVyZW5jZSBzbyBkb250IG92ZXJ3cml0ZSB0aGlzCisgICAgICAgICAgICAgICAgbmVlZFRvU2V0UHJvamVjdFJlZmVyZW5jZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gbm8gZmllbGQgcHJlc2VudCwgc28gbm8gcHJldmlvdXMgcmVmZXJlbmNlIGV4aXN0cworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRUb1NldFByb2plY3RSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIE1ldGhvZCBzZXR0ZXI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNldHRlciA9IHIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInNldFByb2plY3QiLCBuZXcgQ2xhc3NbXSB7UHJvamVjdC5jbGFzc30pOworICAgICAgICAgICAgICAgIHNldHRlci5pbnZva2UociwgbmV3IE9iamVjdFtdIHtwcm9qZWN0fSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIG5vIHNldFByb2plY3QgdG8gaW52b2tlOyBqdXN0IGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+IEVudW1lcmF0ZWQgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlcyAicGxhaW4iLCAieG1sIiwgImJyaWVmIiBhbmQgImZhaWx1cmUiLgorICAgICAqCisgICAgICogPHA+IFVzZSB0byBlbnVtZXJhdGUgb3B0aW9ucyBmb3IgPGNvZGU+dHlwZTwvY29kZT4gYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZUF0dHJpYnV0ZSBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJwbGFpbiIsICJ4bWwiLCAiYnJpZWYiLCAiZmFpbHVyZSJ9OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmZDQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIEludGVyZmFjZSBkZXNjcmliZXMgY2xhc3NlcyB0aGF0IGZvcm1hdCB0aGUgcmVzdWx0cyBvZiBhIEpVbml0CisgKiB0ZXN0cnVuLgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBKVW5pdFJlc3VsdEZvcm1hdHRlcgorICAgIGV4dGVuZHMgVGVzdExpc3RlbmVyLCBKVW5pdFRhc2tNaXJyb3IuSlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgeworICAgIC8qKgorICAgICAqIFRoZSB3aG9sZSB0ZXN0c3VpdGUgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gc3VpdGUgdGhlIHN1aXRlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgdm9pZCBzdGFydFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoZSB3aG9sZSB0ZXN0c3VpdGUgZW5kZWQuCisgICAgICogQHBhcmFtIHN1aXRlIHRoZSBzdWl0ZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHZvaWQgZW5kVGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3RyZWFtIHRoZSBmb3JtYXR0ZXIgaXMgc3VwcG9zZWQgdG8gd3JpdGUgaXRzIHJlc3VsdHMgdG8uCisgICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IHN0cmVhbSB0byB1c2UuCisgICAgICovCisgICAgdm9pZCBzZXRPdXRwdXQoT3V0cHV0U3RyZWFtIG91dCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHdoYXQgdGhlIHRlc3QgaGFzIHdyaXR0ZW4gdG8gU3lzdGVtLm91dAorICAgICAqIEBwYXJhbSBvdXQgdGhlIHN0cmluZyB0byB3cml0ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFN5c3RlbU91dHB1dChTdHJpbmcgb3V0KTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgd2hhdCB0aGUgdGVzdCBoYXMgd3JpdHRlbiB0byBTeXN0ZW0uZXJyCisgICAgICogQHBhcmFtIGVyciB0aGUgc3RyaW5nIHRvIHdyaXRlLgorICAgICAqLworICAgIHZvaWQgc2V0U3lzdGVtRXJyb3IoU3RyaW5nIGVycik7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2U4N2EKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2suamF2YQpAQCAtMCwwICsxLDE5MjAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVXYXRjaGRvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHVtcFN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQXNzZXJ0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBlcm1pc3Npb25zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlByb3BlcnR5U2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTG9hZGVyVXRpbHM7CisKKy8qKgorICogUnVucyBKVW5pdCB0ZXN0cy4KKyAqCisgKiA8cD4gSlVuaXQgaXMgYSBmcmFtZXdvcmsgdG8gY3JlYXRlIHVuaXQgdGVzdHMuIEl0IGhhcyBiZWVuIGluaXRpYWxseQorICogY3JlYXRlZCBieSBFcmljaCBHYW1tYSBhbmQgS2VudCBCZWNrLiAgSlVuaXQgY2FuIGJlIGZvdW5kIGF0IDxhCisgKiBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZyI+aHR0cDovL3d3dy5qdW5pdC5vcmc8L2E+LgorICoKKyAqIDxwPiA8Y29kZT5KVW5pdFRhc2s8L2NvZGU+IGNhbiBydW4gYSBzaW5nbGUgc3BlY2lmaWMKKyAqIDxjb2RlPkpVbml0VGVzdDwvY29kZT4gdXNpbmcgdGhlIDxjb2RlPnRlc3Q8L2NvZGU+IGVsZW1lbnQuPC9wPgorICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdGFyZ2V0IDxjb2RlPjxwcmU+CisgKiAgICZsdDt0YXJnZXQgbmFtZT0idGVzdC1pbnQtY2hhcnMiIGRlcGVuZHM9Imphci10ZXN0IiZndDsKKyAqICAgICAgICZsdDtlY2hvIG1lc3NhZ2U9InRlc3RpbmcgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzIi8mZ3Q7CisgKiAgICAgICAmbHQ7anVuaXQgcHJpbnRzdW1tYXJ5PSJubyIgaGFsdG9uZmFpbHVyZT0ieWVzIiBmb3JrPSJmYWxzZSImZ3Q7CisgKiAgICAgICAgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIi8mZ3Q7CisgKiAgICAgICAgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiIC8mZ3Q7CisgKiAgICAgICAgICAgJmx0O3Rlc3QgbmFtZT0ib3JnLmFwYWNoZS5lY3MuSW50ZXJuYXRpb25hbENoYXJUZXN0IiAvJmd0OworICogICAgICAgJmx0Oy9qdW5pdCZndDsKKyAqICAgJmx0Oy90YXJnZXQmZ3Q7CisgKiA8L3ByZT48L2NvZGU+CisgKiA8cD5ydW5zIGEgc2luZ2xlIGp1bml0IHRlc3QKKyAqICg8Y29kZT5vcmcuYXBhY2hlLmVjcy5JbnRlcm5hdGlvbmFsQ2hhclRlc3Q8L2NvZGU+KSBpbiB0aGUgY3VycmVudAorICogVk0gdXNpbmcgdGhlIHBhdGggd2l0aCBpZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGFzIGNsYXNzcGF0aCBhbmQKKyAqIHByZXNlbnRzIHRoZSByZXN1bHRzIGZvcm1hdHRlZCB1c2luZyB0aGUgc3RhbmRhcmQKKyAqIDxjb2RlPnBsYWluPC9jb2RlPiBmb3JtYXR0ZXIgb24gdGhlIGNvbW1hbmQgbGluZS48L3A+CisgKgorICogPHA+IFRoaXMgdGFzayBjYW4gYWxzbyBydW4gYmF0Y2hlcyBvZiB0ZXN0cy4gIFRoZQorICogPGNvZGU+YmF0Y2h0ZXN0PC9jb2RlPiBlbGVtZW50IGNyZWF0ZXMgYSA8Y29kZT5CYXRjaFRlc3Q8L2NvZGU+CisgKiBiYXNlZCBvbiBhIGZpbGVzZXQuICBUaGlzIGFsbG93cywgZm9yIGV4YW1wbGUsIGFsbCBjbGFzc2VzIGZvdW5kIGluCisgKiBkaXJlY3RvcnkgdG8gYmUgcnVuIGFzIHRlc3RjYXNlcy48L3A+CisgKgorICogPHA+Rm9yIGV4YW1wbGUsPC9wPjxjb2RlPjxwcmU+CisgKiAmbHQ7dGFyZ2V0IG5hbWU9InJ1bi10ZXN0cyIgZGVwZW5kcz0iZHVtcC1pbmZvLGNvbXBpbGUtdGVzdHMiIGlmPSJqdW5pdC5wcmVzZW50IiZndDsKKyAqICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ibm8iIGhhbHRvbmZhaWx1cmU9InllcyIgZm9yaz0iJHtqdW5pdC5mb3JrfSImZ3Q7CisgKiAgICAgJmx0O2p2bWFyZyB2YWx1ZT0iLWNsYXNzaWMiLyZndDsKKyAqICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0cy1jbGFzc3BhdGgiLyZndDsKKyAqICAgICAmbHQ7c3lzcHJvcGVydHkga2V5PSJidWlsZC50ZXN0cyIgdmFsdWU9IiR7YnVpbGQudGVzdHN9Ii8mZ3Q7CisgKiAgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJicmllZiIgdXNlZmlsZT0iZmFsc2UiIC8mZ3Q7CisgKiAgICAgJmx0O2JhdGNodGVzdCZndDsKKyAqICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHt0ZXN0cy5kaXJ9IiZndDsKKyAqICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiomIzA0NzsqVGVzdCoiIC8mZ3Q7CisgKiAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgKiAgICAgJmx0Oy9iYXRjaHRlc3QmZ3Q7CisgKiAgICZsdDsvanVuaXQmZ3Q7CisgKiAmbHQ7L3RhcmdldCZndDsKKyAqIDwvcHJlPjwvY29kZT4KKyAqIDxwPnRoaXMgdGFyZ2V0IGZpbmRzIGFueSBjbGFzc2VzIHdpdGggYSA8Y29kZT50ZXN0PC9jb2RlPiBkaXJlY3RvcnkKKyAqIGFueXdoZXJlIGluIHRoZWlyIHBhdGggKHVuZGVyIHRoZSB0b3AgPGNvZGU+JHt0ZXN0cy5kaXJ9PC9jb2RlPiwgb2YKKyAqIGNvdXJzZSkgYW5kIGNyZWF0ZXMgPGNvZGU+SlVuaXRUZXN0PC9jb2RlPidzIGZvciBlYWNoIG9uZS48L3A+CisgKgorICogPHA+IE9mIGNvdXJzZSwgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gYW5kCisgKiA8Y29kZT4mbHQ7YmF0Y2gmZ3Q7PC9jb2RlPiBlbGVtZW50cyBjYW4gYmUgY29tYmluZWQgZm9yIG1vcmUKKyAqIGNvbXBsZXggdGVzdHMuIEZvciBhbiBleGFtcGxlLCBzZWUgdGhlIGFudCA8Y29kZT5idWlsZC54bWw8L2NvZGU+CisgKiB0YXJnZXQgPGNvZGU+cnVuLXRlc3RzPC9jb2RlPiAodGhlIHNlY29uZCBleGFtcGxlIGlzIGFuIGVkaXRlZAorICogdmVyc2lvbikuPC9wPgorICoKKyAqIDxwPiBUbyBzcGF3biBhIG5ldyBKYXZhIFZNIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlcyBiZXR3ZWVuCisgKiBkaWZmZXJlbnQgdGVzdGNhc2VzLCB5b3UgbmVlZCB0byBlbmFibGUgPGNvZGU+Zm9yazwvY29kZT4uICBBCisgKiBudW1iZXIgb2YgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgYWxsb3cgeW91IHRvIHNldCB1cCBob3cgdGhpcyBKVk0KKyAqIHJ1bnMuCisgKgorICoKKyAqIEBzaW5jZSBBbnQgMS4yCisgKgorICogQHNlZSBKVW5pdFRlc3QKKyAqIEBzZWUgQmF0Y2hUZXN0CisgKi8KK3B1YmxpYyBjbGFzcyBKVW5pdFRhc2sgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUAorICAgICAgICA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIID0gIkNMQVNTUEFUSD0iOworICAgIHByaXZhdGUgQ29tbWFuZGxpbmVKYXZhIGNvbW1hbmRsaW5lOworICAgIHByaXZhdGUgVmVjdG9yIHRlc3RzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yIGJhdGNoVGVzdHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgZm9ybWF0dGVycyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIEZpbGUgZGlyID0gbnVsbDsKKworICAgIHByaXZhdGUgSW50ZWdlciB0aW1lb3V0ID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3VtbWFyeSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiByZWxvYWRpbmcgPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nIHN1bW1hcnlWYWx1ZSA9ICIiOworICAgIHByaXZhdGUgSlVuaXRUYXNrTWlycm9yLkpVbml0VGVzdFJ1bm5lck1pcnJvciBydW5uZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBib29sZWFuIG5ld0Vudmlyb25tZW50ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBFbnZpcm9ubWVudCBlbnYgPSBuZXcgRW52aXJvbm1lbnQoKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlQW50UnVudGltZSA9IHRydWU7CisgICAgcHJpdmF0ZSBQYXRoIGFudFJ1bnRpbWVDbGFzc2VzID0gbnVsbDsKKworICAgIC8vIERvIHdlIHNlbmQgb3V0cHV0IHRvIFN5c3RlbS5vdXQvLmVyciBpbiBhZGRpdGlvbiB0byB0aGUgZm9ybWF0dGVycz8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvd091dHB1dCA9IGZhbHNlOworCisgICAgLy8gRG8gd2Ugc2VuZCBvdXRwdXQgdG8gdGhlIGZvcm1hdHRlcnMgPworICAgIHByaXZhdGUgYm9vbGVhbiBvdXRwdXRUb0Zvcm1hdHRlcnMgPSB0cnVlOworCisgICAgcHJpdmF0ZSBGaWxlIHRtcERpcjsKKyAgICBwcml2YXRlIEFudENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIFBlcm1pc3Npb25zIHBlcm0gPSBudWxsOworICAgIHByaXZhdGUgRm9ya01vZGUgZm9ya01vZGUgPSBuZXcgRm9ya01vZGUoInBlclRlc3QiKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzcGxpdEp1bml0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBKVW5pdFRhc2tNaXJyb3IgZGVsZWdhdGU7CisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBtaXJyb3JMb2FkZXI7CisKKyAgICAvKiogQSBib29sZWFuIG9uIHdoZXRoZXIgdG8gZ2V0IHRoZSBmb3JrZWQgcGF0aCBmb3IgYW50IGNsYXNzZXMgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZm9ya2VkUGF0aENoZWNrZWQgPSBmYWxzZTsKKworICAgIC8vICAgQXR0cmlidXRlcyBmb3IgYmFzZXRlc3QKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFsdE9uRXJyb3IgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFsdE9uRmFpbCAgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyVHJhY2UgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBmb3JrICAgICAgICA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nICBmYWlsdXJlUHJvcGVydHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgIGVycm9yUHJvcGVydHk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HX0JVRkZFUl9TSVpFID0gMTI4OworICAgIC8qKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVExJU1RFTkVSX1BSRUZJWCA9CisgICAgICAgICJqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyOiAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBmb3JjZSBhbnQgdG8gcmUtY2xhc3Nsb2FkIGFsbCBjbGFzc2VzIGZvciBlYWNoIEpVbml0IFRlc3RDYXNlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgZm9yY2UgY2xhc3MgcmVsb2FkaW5nIGZvciBlYWNoIHRlc3QgY2FzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbG9hZGluZyhib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHJlbG9hZGluZyA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHNtYXJ0bHkgZmlsdGVyIHRoZSBzdGFjayBmcmFtZXMgb2YKKyAgICAgKiBKVW5pdCBlcnJvcnMgYW5kIGZhaWx1cmVzIGJlZm9yZSByZXBvcnRpbmcgdGhlbS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZAorICAgICAqIEpVbml0VGVzdCAodGVzdCkgaG93ZXZlciBpdCBjYW4gcG9zc2libHkgYmUgb3ZlcnJpZGRlbiBieSB0aGVpcgorICAgICAqIG93biBwcm9wZXJ0aWVzLjwvcD4KKyAgICAgKiBAcGFyYW0gdmFsdWUgPHR0PmZhbHNlPC90dD4gaWYgaXQgc2hvdWxkIG5vdCBmaWx0ZXIsIG90aGVyd2lzZQorICAgICAqIDx0dD50cnVlPHR0PgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJ0cmFjZShib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHRoaXMuZmlsdGVyVHJhY2UgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBzdG9wIHRoZSBidWlsZCBwcm9jZXNzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gYSB0ZXN0LgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZCBKVW5pdFRlc3QKKyAgICAgKiAodGVzdCkgaG93ZXZlciBpdCBjYW4gcG9zc2libHkgYmUgb3ZlcnJpZGRlbiBieSB0aGVpciBvd24KKyAgICAgKiBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSB2YWx1ZSA8dHQ+dHJ1ZTwvdHQ+IGlmIGl0IHNob3VsZCBoYWx0LCBvdGhlcndpc2UKKyAgICAgKiA8dHQ+ZmFsc2U8L3R0PgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIYWx0b25lcnJvcihib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHRoaXMuaGFsdE9uRXJyb3IgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSB0byBzZXQgdG8gInRydWUiIGlmIHRoZXJlIGlzIGEgZXJyb3IgaW4gYSB0ZXN0LgorICAgICAqCisgICAgICogPHA+VGhpcyBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGFsbCBCYXRjaFRlc3QgKGJhdGNodGVzdCkgYW5kCisgICAgICogSlVuaXRUZXN0ICh0ZXN0KSwgaG93ZXZlciwgaXQgY2FuIHBvc3NpYmx5IGJlIG92ZXJyaWRlbiBieQorICAgICAqIHRoZWlyIG93biBwcm9wZXJ0aWVzLjwvcD4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlCisgICAgICogZXZlbnQgb2YgYW4gZXJyb3IuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICB0aGlzLmVycm9yUHJvcGVydHkgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgc3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiBhIHRlc3QgZmFpbHMKKyAgICAgKiAoZXJyb3JzIGFyZSBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZAorICAgICAqIEpVbml0VGVzdCAodGVzdCkgaG93ZXZlciBpdCBjYW4gcG9zc2libHkgYmUgb3ZlcnJpZGRlbiBieSB0aGVpcgorICAgICAqIG93biBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSB2YWx1ZSA8dHQ+dHJ1ZTwvdHQ+IGlmIGl0IHNob3VsZCBoYWx0LCBvdGhlcndpc2UKKyAgICAgKiA8dHQ+ZmFsc2U8L3R0PgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIYWx0b25mYWlsdXJlKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgdGhpcy5oYWx0T25GYWlsID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvcGVydHkgdG8gc2V0IHRvICJ0cnVlIiBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgaW4gYSB0ZXN0LgorICAgICAqCisgICAgICogPHA+VGhpcyBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGFsbCBCYXRjaFRlc3QgKGJhdGNodGVzdCkgYW5kCisgICAgICogSlVuaXRUZXN0ICh0ZXN0KSwgaG93ZXZlciwgaXQgY2FuIHBvc3NpYmx5IGJlIG92ZXJyaWRlbiBieQorICAgICAqIHRoZWlyIG93biBwcm9wZXJ0aWVzLjwvcD4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlCisgICAgICogZXZlbnQgb2YgYW4gZmFpbHVyZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS40CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbHVyZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgdGhpcy5mYWlsdXJlUHJvcGVydHkgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgSlZNIHNob3VsZCBiZSBmb3JrZWQgZm9yIGVhY2ggdGVzdC4KKyAgICAgKgorICAgICAqIDxwPkl0IGF2b2lkcyBpbnRlcmZlcmVuY2UgYmV0d2VlbiB0ZXN0Y2FzZXMgYW5kIHBvc3NpYmx5IGF2b2lkcworICAgICAqIGhhbmdpbmcgdGhlIGJ1aWxkLiAgdGhpcyBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGFsbCBCYXRjaFRlc3QKKyAgICAgKiAoYmF0Y2h0ZXN0KSBhbmQgSlVuaXRUZXN0ICh0ZXN0KSBob3dldmVyIGl0IGNhbiBwb3NzaWJseSBiZQorICAgICAqIG92ZXJyaWRkZW4gYnkgdGhlaXIgb3duIHByb3BlcnRpZXMuPC9wPgorICAgICAqIEBwYXJhbSB2YWx1ZSA8dHQ+dHJ1ZTwvdHQ+IGlmIGEgSlZNIHNob3VsZCBiZSBmb3JrZWQsIG90aGVyd2lzZQorICAgICAqIDx0dD5mYWxzZTwvdHQ+CisgICAgICogQHNlZSAjc2V0VGltZW91dAorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JrKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgdGhpcy5mb3JrID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiZWhhdmlvciB3aGVuIHtAbGluayAjc2V0Rm9yayBmb3JrfSBmb3JrIGhhcyBiZWVuIGVuYWJsZWQuCisgICAgICoKKyAgICAgKiA8cD5Qb3NzaWJsZSB2YWx1ZXMgYXJlICJvbmNlIiwgInBlclRlc3QiIGFuZCAicGVyQmF0Y2giLiAgSWYKKyAgICAgKiBzZXQgdG8gIm9uY2UiLCBvbmx5IGEgc2luZ2xlIEphdmEgVk0gd2lsbCBiZSBmb3JrZWQgZm9yIGFsbAorICAgICAqIHRlc3RzLCB3aXRoICJwZXJUZXN0IiAodGhlIGRlZmF1bHQpIGVhY2ggdGVzdCB3aWxsIHJ1biBpbiBhCisgICAgICogZnJlc2ggSmF2YSBWTSBhbmQgInBlckJhdGNoIiB3aWxsIHJ1biBhbGwgdGVzdHMgZnJvbSB0aGUgc2FtZQorICAgICAqICZsdDtiYXRjaHRlc3QmZ3Q7IGluIHRoZSBzYW1lIEphdmEgVk0uPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkIGlmIHRlc3RzIHJ1biBpbiB0aGUgc2FtZSBWTQorICAgICAqIGFzIEFudC48L3A+CisgICAgICoKKyAgICAgKiA8cD5Pbmx5IHRlc3RzIHdpdGggdGhlIHNhbWUgY29uZmlndXJhdGlvbiBvZiBoYWx0b25lcnJvciwKKyAgICAgKiBoYWx0b25mYWlsdXJlLCBlcnJvcnByb3BlcnR5LCBmYWlsdXJlcHJvcGVydHkgYW5kIGZpbHRlcnRyYWNlCisgICAgICogY2FuIHNoYXJlIGEgZm9ya2VkIEphdmEgVk0sIHNvIGV2ZW4gaWYgeW91IHNldCB0aGUgdmFsdWUgdG8KKyAgICAgKiAib25jZSIsIEFudCBtYXkgbmVlZCB0byBmb3JrIG11dGxpcGxlIFZNcy48L3A+CisgICAgICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgdG8gdXNlLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JrTW9kZShGb3JrTW9kZSBtb2RlKSB7CisgICAgICAgIHRoaXMuZm9ya01vZGUgPSBtb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHByaW50IG9uZS1saW5lIHN0YXRpc3RpY3MgZm9yIGVhY2ggdGVzdCwgb3IgIndpdGhPdXRBbmRFcnIiCisgICAgICogdG8gYWxzbyBzaG93IHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3IuCisgICAgICoKKyAgICAgKiBDYW4gdGFrZSB0aGUgdmFsdWVzIG9uLCBvZmYsIGFuZCB3aXRoT3V0QW5kRXJyLgorICAgICAqIEBwYXJhbSB2YWx1ZSA8dHQ+dHJ1ZTwvdHQ+IHRvIHByaW50IGEgc3VtbWFyeSwKKyAgICAgKiA8dHQ+d2l0aE91dEFuZEVycjwvdHQ+IHRvIGluY2x1ZGUgdGhlIHRlc3QmYXBvcztzIG91dHB1dCBhcworICAgICAqIHdlbGwsIDx0dD5mYWxzZTwvdHQ+IG90aGVyd2lzZS4KKyAgICAgKiBAc2VlIFN1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlcgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmludHN1bW1hcnkoU3VtbWFyeUF0dHJpYnV0ZSB2YWx1ZSkgeworICAgICAgICBzdW1tYXJ5VmFsdWUgPSB2YWx1ZS5nZXRWYWx1ZSgpOworICAgICAgICBzdW1tYXJ5ID0gdmFsdWUuYXNCb29sZWFuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgc3VtbWFyeSBlbnVtZXJhdGlvbiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdW1tYXJ5QXR0cmlidXRlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBsaXN0IHRoZSBwb3NzaWJsZSB2YWx1ZXMKKyAgICAgICAgICogQHJldHVybiAgYXJyYXkgb2YgYWxsb3dlZCB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsidHJ1ZSIsICJ5ZXMiLCAiZmFsc2UiLCAibm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIiwgIm9mZiIsICJ3aXRoT3V0QW5kRXJyIn07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogZ2l2ZXMgdGhlIGJvb2xlYW4gZXF1aXZhbGVudCBvZiB0aGUgYXV0aG9yaXplZCB2YWx1ZXMKKyAgICAgICAgICogQHJldHVybiBib29sZWFuIGVxdWl2YWxlbnQgb2YgdGhlIHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhc0Jvb2xlYW4oKSB7CisgICAgICAgICAgICBTdHJpbmcgdiA9IGdldFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gInRydWUiLmVxdWFscyh2KQorICAgICAgICAgICAgICAgIHx8ICJvbiIuZXF1YWxzKHYpCisgICAgICAgICAgICAgICAgfHwgInllcyIuZXF1YWxzKHYpCisgICAgICAgICAgICAgICAgfHwgIndpdGhPdXRBbmRFcnIiLmVxdWFscyh2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGltZW91dCB2YWx1ZSAoaW4gbWlsbGlzZWNvbmRzKS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSB0ZXN0IGlzIHJ1bm5pbmcgZm9yIG1vcmUgdGhhbiB0aGlzIHZhbHVlLCB0aGUgdGVzdAorICAgICAqIHdpbGwgYmUgY2FuY2VsZWQuICh3b3JrcyBvbmx5IHdoZW4gaW4gJ2ZvcmsnIG1vZGUpLjwvcD4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG1heGltdW0gdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBhbGxvd2VkIGJlZm9yZQorICAgICAqIGRlY2xhcmluZyB0aGUgdGVzdCBhcyAndGltZWQtb3V0JworICAgICAqIEBzZWUgI3NldEZvcmsoYm9vbGVhbikKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgIHRpbWVvdXQgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gbWVtb3J5IHRvIGJlIHVzZWQgYnkgYWxsIGZvcmtlZCBKVk1zLgorICAgICAqIEBwYXJhbSAgIG1heCAgICAgdGhlIHZhbHVlIGFzIGRlZmluZWQgYnkgPHR0Pi1teDwvdHQ+IG9yIDx0dD4tWG14PC90dD4KKyAgICAgKiAgICAgICAgICAgICAgICAgIGluIHRoZSBqYXZhIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhtZW1vcnkoU3RyaW5nIG1heCkgeworICAgICAgICBnZXRDb21tYW5kbGluZSgpLnNldE1heG1lbW9yeShtYXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSwKKyAgICAgKiBkZWZhdWx0IGlzICdqYXZhJy4gVGhlIGNvbW1hbmQgaXMgcmVzb2x2ZWQgYnkKKyAgICAgKiBqYXZhLmxhbmcuUnVudGltZS5leGVjKCkuIElnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIHZhbHVlICAgdGhlIG5ldyBWTSB0byB1c2UgaW5zdGVhZCBvZiA8dHQ+amF2YTwvdHQ+CisgICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKdm0oU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGdldENvbW1hbmRsaW5lKCkuc2V0Vm0odmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBKVk0gYXJndW1lbnQ7IGlnbm9yZWQgaWYgbm90IGZvcmtpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNyZWF0ZSBhIG5ldyBKVk0gYXJndW1lbnQgc28gdGhhdCBhbnkgYXJndW1lbnQgY2FuIGJlCisgICAgICogcGFzc2VkIHRvIHRoZSBKVk0uCisgICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tbWFuZGxpbmUuQXJndW1lbnQgY3JlYXRlSnZtYXJnKCkgeworICAgICAgICByZXR1cm4gZ2V0Q29tbWFuZGxpbmUoKS5jcmVhdGVWbUFyZ3VtZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIFZNIGluLiBJZ25vcmVkIGlmIG5vIEpWTSBpcyBmb3JrZWQuCisgICAgICogQHBhcmFtICAgZGlyICAgICB0aGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgSlZNIGZyb20uCisgICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkaXIpIHsKKyAgICAgICAgdGhpcy5kaXIgPSBkaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHN5c3RlbSBwcm9wZXJ0eSB0aGF0IHRlc3RzIGNhbiBhY2Nlc3MuCisgICAgICogVGhpcyBtaWdodCBiZSB1c2VmdWwgdG8gdHJhbmZlciBBbnQgcHJvcGVydGllcyB0byB0aGUKKyAgICAgKiB0ZXN0Y2FzZXMgd2hlbiBKVk0gZm9ya2luZyBpcyBub3QgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS4zCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgYW50IDEuNgorICAgICAqIEBwYXJhbSBzeXNwIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFN5c3Byb3BlcnR5KEVudmlyb25tZW50LlZhcmlhYmxlIHN5c3ApIHsKKworICAgICAgICBnZXRDb21tYW5kbGluZSgpLmFkZFN5c3Byb3BlcnR5KHN5c3ApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzeXN0ZW0gcHJvcGVydHkgdGhhdCB0ZXN0cyBjYW4gYWNjZXNzLgorICAgICAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIHRvIHRyYW5mZXIgQW50IHByb3BlcnRpZXMgdG8gdGhlCisgICAgICogdGVzdGNhc2VzIHdoZW4gSlZNIGZvcmtpbmcgaXMgbm90IGVuYWJsZWQuCisgICAgICogQHBhcmFtIHN5c3AgbmV3IGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGFkZAorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFN5c3Byb3BlcnR5KEVudmlyb25tZW50LlZhcmlhYmxlIHN5c3ApIHsKKyAgICAgICAgLy8gZ2V0IGEgYnVpbGQgZXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgbWlzc2luZyBrZXkgb3IgdmFsdWUKKyAgICAgICAgLy8gc2VlIGJ1Z3ppbGxhIHJlcG9ydCAyMTY4NAorICAgICAgICBTdHJpbmcgdGVzdFN0cmluZyA9IHN5c3AuZ2V0Q29udGVudCgpOworICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJzeXNwcm9wZXJ0eSBhZGRlZCA6ICIgKyB0ZXN0U3RyaW5nLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIGdldENvbW1hbmRsaW5lKCkuYWRkU3lzcHJvcGVydHkoc3lzcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHN5c3RlbSBwcm9wZXJ0aWVzCisgICAgICogdGhhdCB0ZXN0cyBjYW4gYWNjZXNzLgorICAgICAqCisgICAgICogVGhpcyBtaWdodCBiZSB1c2VmdWwgdG8gdHJhbmZlciBBbnQgcHJvcGVydGllcyB0byB0aGUKKyAgICAgKiB0ZXN0Y2FzZXMgd2hlbiBKVk0gZm9ya2luZyBpcyBub3QgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzeXNwIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTeXNwcm9wZXJ0eXNldChQcm9wZXJ0eVNldCBzeXNwKSB7CisgICAgICAgIGdldENvbW1hbmRsaW5lKCkuYWRkU3lzcHJvcGVydHlzZXQoc3lzcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBwYXRoIHRvIGNsYXNzcGF0aCB1c2VkIGZvciB0ZXN0cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBjbGFzc3BhdGggaW4gdGhlIGVtYmVkZGVkIGphdmEgY29tbWFuZCBsaW5lCisgICAgICogQHNpbmNlIEFudCAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBnZXRDb21tYW5kbGluZSgpLmNyZWF0ZUNsYXNzcGF0aChnZXRQcm9qZWN0KCkpLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCB0byB0aGUgYm9vdGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgYm9vdGNsYXNzcGF0aCBpbiB0aGUgZW1iZWRkZWQgamF2YSBjb21tYW5kIGxpbmUKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUJvb3RjbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBnZXRDb21tYW5kbGluZSgpLmNyZWF0ZUJvb3RjbGFzc3BhdGgoZ2V0UHJvamVjdCgpKS5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZTsgdXNlZCB3aGVuIGZvcmtpbmcuCisgICAgICoKKyAgICAgKiA8cD5XaWxsIGJlIGlnbm9yZWQgaWYgd2UgYXJlIG5vdCBmb3JraW5nIGEgbmV3IFZNLjwvcD4KKyAgICAgKiBAcGFyYW0gdmFyIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGJlIGFkZGVkCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFbnYoRW52aXJvbm1lbnQuVmFyaWFibGUgdmFyKSB7CisgICAgICAgIGVudi5hZGRWYXJpYWJsZSh2YXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHVzZSBhIG5ldyBlbnZpcm9ubWVudCB3aGVuIGZvcmtlZC4KKyAgICAgKgorICAgICAqIDxwPldpbGwgYmUgaWdub3JlZCBpZiB3ZSBhcmUgbm90IGZvcmtpbmcgYSBuZXcgVk0uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG5ld2VudiBib29sZWFuIGluZGljYXRpbmcgaWYgc2V0dGluZyBhIG5ldyBlbnZpcm9ubWVudCBpcyB3aXNoZWQKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5ld2Vudmlyb25tZW50KGJvb2xlYW4gbmV3ZW52KSB7CisgICAgICAgIG5ld0Vudmlyb25tZW50ID0gbmV3ZW52OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdGVzdAorICAgICAqIGJlZm9yZSBjb25maWd1cmF0aW9uIGluIHRoZSBidWlsZAorICAgICAqIHNjcmlwdC4KKyAgICAgKiBUaGlzIGFsbG93cyBhdHRyaWJ1dGVzIGluIHRoZSA8anVuaXQ+IHRhc2sKKyAgICAgKiBiZSBiZSBkZWZhdWx0cyBmb3IgdGhlIHRlc3RzLCBidXQgYWxsb3dzCisgICAgICogaW5kaXZpZHVhbCB0ZXN0cyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByZUNvbmZpZ3VyZShCYXNlVGVzdCB0ZXN0KSB7CisgICAgICAgIHRlc3Quc2V0RmlsdGVydHJhY2UoZmlsdGVyVHJhY2UpOworICAgICAgICB0ZXN0LnNldEhhbHRvbmVycm9yKGhhbHRPbkVycm9yKTsKKyAgICAgICAgaWYgKGVycm9yUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGVzdC5zZXRFcnJvclByb3BlcnR5KGVycm9yUHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIHRlc3Quc2V0SGFsdG9uZmFpbHVyZShoYWx0T25GYWlsKTsKKyAgICAgICAgaWYgKGZhaWx1cmVQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICB0ZXN0LnNldEZhaWx1cmVQcm9wZXJ0eShmYWlsdXJlUHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIHRlc3Quc2V0Rm9yayhmb3JrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2luZ2xlIHRlc3RjYXNlLgorICAgICAqIEBwYXJhbSAgIHRlc3QgICAgYSBuZXcgc2luZ2xlIHRlc3RjYXNlCisgICAgICogQHNlZSBKVW5pdFRlc3QKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGVzdChKVW5pdFRlc3QgdGVzdCkgeworICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KHRlc3QpOworICAgICAgICBwcmVDb25maWd1cmUodGVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHNldCBvZiB0ZXN0cyBiYXNlZCBvbiBwYXR0ZXJuIG1hdGNoaW5nLgorICAgICAqCisgICAgICogQHJldHVybiAgYSBuZXcgaW5zdGFuY2Ugb2YgYSBiYXRjaCB0ZXN0LgorICAgICAqIEBzZWUgQmF0Y2hUZXN0CisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuMgorICAgICAqLworICAgIHB1YmxpYyBCYXRjaFRlc3QgY3JlYXRlQmF0Y2hUZXN0KCkgeworICAgICAgICBCYXRjaFRlc3QgdGVzdCA9IG5ldyBCYXRjaFRlc3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgYmF0Y2hUZXN0cy5hZGRFbGVtZW50KHRlc3QpOworICAgICAgICBwcmVDb25maWd1cmUodGVzdCk7CisgICAgICAgIHJldHVybiB0ZXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBmb3JtYXR0ZXIgdG8gYWxsIHRlc3RzIG9mIHRoaXMgdGFzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZSBmb3JtYXR0ZXIgZWxlbWVudAorICAgICAqIEBzaW5jZSBBbnQgMS4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRm9ybWF0dGVyKEZvcm1hdHRlckVsZW1lbnQgZmUpIHsKKyAgICAgICAgZm9ybWF0dGVycy5hZGRFbGVtZW50KGZlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBpbmNsdWRlIGFudC5qYXIsIG9wdGlvbmFsLmphciBhbmQganVuaXQuamFyIGluIHRoZSBmb3JrZWQgVk0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBpbmNsdWRlIGFudCBydW4gdGltZSB5ZXMgb3Igbm8KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVhbnRydW50aW1lKGJvb2xlYW4gYikgeworICAgICAgICBpbmNsdWRlQW50UnVudGltZSA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgc2VuZCBhbnkgb3V0cHV0IGdlbmVyYXRlZCBieSB0ZXN0cyB0byBBbnQncyBsb2dnaW5nIHN5c3RlbQorICAgICAqIGFzIHdlbGwgYXMgdG8gdGhlIGZvcm1hdHRlcnMuCisgICAgICogQnkgZGVmYXVsdCBvbmx5IHRoZSBmb3JtYXR0ZXJzIHJlY2VpdmUgdGhlIG91dHB1dC4KKyAgICAgKgorICAgICAqIDxwPk91dHB1dCB3aWxsIGFsd2F5cyBiZSBwYXNzZWQgdG8gdGhlIGZvcm1hdHRlcnMgYW5kIG5vdCBieQorICAgICAqIHNob3duIGJ5IGRlZmF1bHQuICBUaGlzIG9wdGlvbiBzaG91bGQgZm9yIGV4YW1wbGUgYmUgc2V0IGZvcgorICAgICAqIHRlc3RzIHRoYXQgYXJlIGludGVyYWN0aXZlIGFuZCBwcm9tcHQgdGhlIHVzZXIgdG8gZG8KKyAgICAgKiBzb21ldGhpbmcuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHNob3dPdXRwdXQgaWYgdHJ1ZSwgc2VuZCBvdXRwdXQgdG8gQW50J3MgbG9nZ2luZyBzeXN0ZW0gdG9vCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93T3V0cHV0KGJvb2xlYW4gc2hvd091dHB1dCkgeworICAgICAgICB0aGlzLnNob3dPdXRwdXQgPSBzaG93T3V0cHV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIHNlbmQgYW55IG91dHB1dCBnZW5lcmF0ZWQgYnkgdGVzdHMgdG8gdGhlIGZvcm1hdHRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0VG9Gb3JtYXR0ZXJzIGlmIHRydWUsIHNlbmQgb3V0cHV0IHRvIGZvcm1hdHRlcnMgKERlZmF1bHQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRydWUpLgorICAgICAqIEBzaW5jZSBBbnQgMS43LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRUb0Zvcm1hdHRlcnMoYm9vbGVhbiBvdXRwdXRUb0Zvcm1hdHRlcnMpIHsKKyAgICAgICAgdGhpcy5vdXRwdXRUb0Zvcm1hdHRlcnMgPSBvdXRwdXRUb0Zvcm1hdHRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0aW9ucyB0byBlbmFibGUgaW4gdGhpcyBwcm9ncmFtIChpZiBmb3JrPXRydWUpCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKiBAcGFyYW0gYXNzZXJ0cyBhc3NlcnRpb24gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQXNzZXJ0aW9ucyhBc3NlcnRpb25zIGFzc2VydHMpIHsKKyAgICAgICAgaWYgKGdldENvbW1hbmRsaW5lKCkuZ2V0QXNzZXJ0aW9ucygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgYXNzZXJ0aW9uIGRlY2xhcmF0aW9uIGlzIGFsbG93ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBnZXRDb21tYW5kbGluZSgpLnNldEFzc2VydGlvbnMoYXNzZXJ0cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGVybWlzc2lvbnMgZm9yIHRoZSBhcHBsaWNhdGlvbiBydW4gaW5zaWRlIHRoZSBzYW1lIEpWTS4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqIEByZXR1cm4gLgorICAgICAqLworICAgIHB1YmxpYyBQZXJtaXNzaW9ucyBjcmVhdGVQZXJtaXNzaW9ucygpIHsKKyAgICAgICAgaWYgKHBlcm0gPT0gbnVsbCkgeworICAgICAgICAgICAgcGVybSA9IG5ldyBQZXJtaXNzaW9ucygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwZXJtOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHNldCwgc3lzdGVtIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGNsb25lZCBWTSAtIGFzCisgICAgICogd2VsbCBhcyB0aGUgYm9vdGNsYXNzcGF0aCB1bmxlc3MgeW91IGhhdmUgZXhwbGljaXRseSBzcGVjaWZpZWQKKyAgICAgKiBhIGJvb3RjbGFzcGF0aC4KKyAgICAgKgorICAgICAqIDxwPkRvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0IHVubGVzcyBmb3JrIGlzIHRydWUuPC9wPgorICAgICAqIEBwYXJhbSBjbG9uZVZtIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbG9uZVZtKGJvb2xlYW4gY2xvbmVWbSkgeworICAgICAgICBnZXRDb21tYW5kbGluZSgpLnNldENsb25lVm0oY2xvbmVWbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKVW5pdFJ1bm5lciBhbmQgZW5hYmxlcyBmb3JrIG9mIGEgbmV3IEphdmEgVk0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB1bmRlciA/Pz8gY2lyY3Vtc3RhbmNlcworICAgICAqIEBzaW5jZSBBbnQgMS4yCisgICAgICovCisgICAgcHVibGljIEpVbml0VGFzaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBnZXRDb21tYW5kbGluZSgpCisgICAgICAgICAgICAuc2V0Q2xhc3NuYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3RSdW5uZXIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVyZSBBbnQgc2hvdWxkIHBsYWNlIHRlbXBvcmFyeSBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0bXBEaXIgbG9jYXRpb24gd2hlcmUgdGVtcG9yYXJ5IGZpbGVzIHNob3VsZCBnbyB0bworICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGVtcGRpcihGaWxlIHRtcERpcikgeworICAgICAgICBpZiAodG1wRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghdG1wRGlyLmV4aXN0cygpIHx8ICF0bXBEaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0bXBEaXIudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgdmFsaWQgdGVtcCBkaXJlY3RvcnkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLnRtcERpciA9IHRtcERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBqYXJzIG9yIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgQW50LCB0aGlzIHRhc2sgYW5kCisgICAgICogSlVuaXQgdG8gdGhlIGNsYXNzcGF0aCAtIHRoaXMgc2hvdWxkIG1ha2UgdGhlIGZvcmtlZCBKVk0gd29yaworICAgICAqIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgdGhlbSBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS40CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgYW50UnVudGltZUNsYXNzZXMgPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICBzcGxpdEp1bml0ID0gIWFkZENsYXNzcGF0aFJlc291cmNlKCIvanVuaXQvZnJhbWV3b3JrL1Rlc3RDYXNlLmNsYXNzIik7CisgICAgICAgIGFkZENsYXNzcGF0aEVudHJ5KCIvb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0FudE1haW4uY2xhc3MiKTsKKyAgICAgICAgYWRkQ2xhc3NwYXRoRW50cnkoIi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrLmNsYXNzIik7CisgICAgICAgIGFkZENsYXNzcGF0aEVudHJ5KCIvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0UnVubmVyLmNsYXNzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSlVuaXRUYXNrTWlycm9yIGNyZWF0ZU1pcnJvcihKVW5pdFRhc2sgdGFzaywgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCJqdW5pdC5mcmFtZXdvcmsuVGVzdCIpOyAvLyBzYW5pdHkgY2hlY2sKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGUgPGNsYXNzcGF0aD4gZm9yIDxqdW5pdD4gbXVzdCBpbmNsdWRlIGp1bml0LmphciAiCisgICAgICAgICAgICAgICAgICAgICsgImlmIG5vdCBpbiBBbnQncyBvd24gY2xhc3NwYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgZSwgdGFzay5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgYyA9IGxvYWRlci5sb2FkQ2xhc3MoSlVuaXRUYXNrTWlycm9yLmNsYXNzLmdldE5hbWUoKSArICJJbXBsIik7CisgICAgICAgICAgICBpZiAoYy5nZXRDbGFzc0xvYWRlcigpICE9IGxvYWRlcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT3ZlcmRlbGVnYXRpbmcgbG9hZGVyIiwgdGFzay5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnMgPSBjLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtKVW5pdFRhc2suY2xhc3N9KTsKKyAgICAgICAgICAgIHJldHVybiAoSlVuaXRUYXNrTWlycm9yKSBjb25zLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7dGFza30pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIHRhc2suZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFNwbGl0TG9hZGVyIGV4dGVuZHMgQW50Q2xhc3NMb2FkZXIgeworCisgICAgICAgIHB1YmxpYyBTcGxpdExvYWRlcihDbGFzc0xvYWRlciBwYXJlbnQsIFBhdGggcGF0aCkgeworICAgICAgICAgICAgc3VwZXIocGFyZW50LCBnZXRQcm9qZWN0KCksIHBhdGgsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yY2VMb2FkQ2xhc3MgaXMgbm90IGNvbnZlbmllbnQgaGVyZSBzaW5jZSBpdCB3b3VsZCBub3QKKyAgICAgICAgLy8gcHJvcGVybHkgZGVhbCB3aXRoIGlubmVyIGNsYXNzZXMgb2YgdGhlc2UgY2xhc3Nlcy4KKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzbmFtZSwgYm9vbGVhbiByZXNvbHZlKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGZpbmRMb2FkZWRDbGFzcyhjbGFzc25hbWUpOworICAgICAgICAgICAgaWYgKHRoZUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhlQ2xhc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNTcGxpdChjbGFzc25hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhlQ2xhc3MgPSBmaW5kQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkgeworICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2xhc3ModGhlQ2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhlQ2xhc3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5sb2FkQ2xhc3MoY2xhc3NuYW1lLCByZXNvbHZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gc3BsaXRDbGFzc2VzID0geworICAgICAgICAgICAgIkJyaWVmSlVuaXRSZXN1bHRGb3JtYXR0ZXIiLAorICAgICAgICAgICAgIkpVbml0UmVzdWx0Rm9ybWF0dGVyIiwKKyAgICAgICAgICAgICJKVW5pdFRhc2tNaXJyb3JJbXBsIiwKKyAgICAgICAgICAgICJKVW5pdFRlc3RSdW5uZXIiLAorICAgICAgICAgICAgIkpVbml0VmVyc2lvbkhlbHBlciIsCisgICAgICAgICAgICAiT3V0RXJyU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyIiwKKyAgICAgICAgICAgICJQbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyIiwKKyAgICAgICAgICAgICJTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIiLAorICAgICAgICAgICAgIlhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTcGxpdChTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgICAgICBTdHJpbmcgc2ltcGxlbmFtZSA9IGNsYXNzbmFtZS5zdWJzdHJpbmcoY2xhc3NuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BsaXRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpbXBsZW5hbWUuZXF1YWxzKHNwbGl0Q2xhc3Nlc1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHNpbXBsZW5hbWUuc3RhcnRzV2l0aChzcGxpdENsYXNzZXNbaV0gKyAnJCcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZGVsZWdhdGUgdGhhdCB3aWxsIGFjdHVhbGx5IHJ1biB0aGUgdGVzdHMuCisgICAgICoKKyAgICAgKiA8cD5XaWxsIGJlIGludm9rZWQgaW1wbGljaXRseSBvbmNlIHRoZSBkZWxlZ2F0ZSBpcyBuZWVkZWQuPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcuMQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldHVwSlVuaXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbXlMb2FkZXIgPSBKVW5pdFRhc2suY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKHNwbGl0SnVuaXQpIHsKKyAgICAgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBwYXRoLmFkZChhbnRSdW50aW1lQ2xhc3Nlcyk7CisgICAgICAgICAgICBQYXRoIGV4dHJhID0gZ2V0Q29tbWFuZGxpbmUoKS5nZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGF0aC5hZGQoZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWlycm9yTG9hZGVyID0gbmV3IFNwbGl0TG9hZGVyKG15TG9hZGVyLCBwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1pcnJvckxvYWRlciA9IG15TG9hZGVyOworICAgICAgICB9CisgICAgICAgIGRlbGVnYXRlID0gY3JlYXRlTWlycm9yKHRoaXMsIG1pcnJvckxvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyB0aGUgdGVzdGNhc2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGluIGNhc2Ugb2YgdGVzdCBmYWlsdXJlcyBvciBlcnJvcnMKKyAgICAgKiBAc2luY2UgQW50IDEuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBzZXR1cEpVbml0RGVsZWdhdGUoKTsKKworICAgICAgICBMaXN0IHRlc3RMaXN0cyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBib29sZWFuIGZvcmtQZXJUZXN0ID0gZm9ya01vZGUuZ2V0VmFsdWUoKS5lcXVhbHMoRm9ya01vZGUuUEVSX1RFU1QpOworICAgICAgICBpZiAoZm9ya1BlclRlc3QgfHwgZm9ya01vZGUuZ2V0VmFsdWUoKS5lcXVhbHMoRm9ya01vZGUuT05DRSkpIHsKKyAgICAgICAgICAgIHRlc3RMaXN0cy5hZGRBbGwoZXhlY3V0ZU9yUXVldWUoZ2V0SW5kaXZpZHVhbFRlc3RzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtQZXJUZXN0KSk7CisgICAgICAgIH0gZWxzZSB7IC8qIGZvcmtNb2RlLmdldFZhbHVlKCkuZXF1YWxzKEZvcmtNb2RlLlBFUl9CQVRDSCkgKi8KKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGJhdGNoVGVzdHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQmF0Y2hUZXN0IGJhdGNodGVzdCA9IChCYXRjaFRlc3QpIGJhdGNoVGVzdHMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgIHRlc3RMaXN0cy5hZGRBbGwoZXhlY3V0ZU9yUXVldWUoYmF0Y2h0ZXN0LmVsZW1lbnRzKCksIGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZXN0TGlzdHMuYWRkQWxsKGV4ZWN1dGVPclF1ZXVlKHRlc3RzLmVsZW1lbnRzKCksIGZvcmtQZXJUZXN0KSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHRlc3RMaXN0cy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgTGlzdCBsID0gKExpc3QpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChsLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoKEpVbml0VGVzdCkgbC5nZXQoMCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUobCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xlYW51cCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0ZXN0cy4KKyAgICAgKiBAcGFyYW0gYXJnIG9uZSBKdW5pdFRlc3QKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGluIGNhc2Ugb2YgdGVzdCBmYWlsdXJlcyBvciBlcnJvcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKEpVbml0VGVzdCBhcmcpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEpVbml0VGVzdCB0ZXN0ID0gKEpVbml0VGVzdCkgYXJnLmNsb25lKCk7CisgICAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgbm90IHNwZWNpZmllZAorICAgICAgICAvL0B0b2RvIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgdGVzdCBjbGFzcyBpbnN0ZWFkLgorICAgICAgICBpZiAodGVzdC5nZXRUb2RpcigpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRlc3Quc2V0VG9kaXIoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCIuIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRlc3QuZ2V0T3V0ZmlsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRlc3Quc2V0T3V0ZmlsZSgiVEVTVC0iICsgdGVzdC5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhlY3V0ZSB0aGUgdGVzdCBhbmQgZ2V0IHRoZSByZXR1cm4gY29kZQorICAgICAgICBUZXN0UmVzdWx0SG9sZGVyIHJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmICghdGVzdC5nZXRGb3JrKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGVJblZNKHRlc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRXhlY3V0ZVdhdGNoZG9nIHdhdGNoZG9nID0gY3JlYXRlV2F0Y2hkb2coKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGVBc0ZvcmtlZCh0ZXN0LCB3YXRjaGRvZywgbnVsbCk7CisgICAgICAgICAgICAvLyBudWxsIHdhdGNoZG9nIG1lYW5zIG5vIHRpbWVvdXQsIHlvdSdkIGJldHRlciBub3QgY2hlY2sgd2l0aCBudWxsCisgICAgICAgIH0KKyAgICAgICAgYWN0T25UZXN0UmVzdWx0KHJlc3VsdCwgdGVzdCwgIlRlc3QgIiArIHRlc3QuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgbGlzdCBvZiB0ZXN0cyBpbiBhIHNpbmdsZSBmb3JrZWQgSmF2YSBWTS4KKyAgICAgKiBAcGFyYW0gdGVzdExpc3QgdGhlIGxpc3Qgb2YgdGVzdHMgdG8gZXhlY3V0ZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoTGlzdCB0ZXN0TGlzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgSlVuaXRUZXN0IHRlc3QgPSBudWxsOworICAgICAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byBwYXNzIHRoZSB0ZXN0IGNhc2VzIHRvIHJ1biB0bworICAgICAgICAvLyB0aGUgcnVubmVyIChvbmUgdGVzdCBjYXNlIHBlciBsaW5lKQorICAgICAgICBGaWxlIGNhc2VzRmlsZSA9IGNyZWF0ZVRlbXBQcm9wZXJ0aWVzRmlsZSgianVuaXR0ZXN0Y2FzZXMiKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9CisgICAgICAgICAgICAgICAgbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihjYXNlc0ZpbGUpKSk7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gdGVzdExpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHRlc3QgPSAoSlVuaXRUZXN0KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQodGVzdC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmICh0ZXN0LmdldFRvZGlyKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiwiICsgZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCIuIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiLCIgKyB0ZXN0LmdldFRvZGlyKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0ZXN0LmdldE91dGZpbGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIsIiArICJURVNULSIgKyB0ZXN0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIiwiICsgdGVzdC5nZXRPdXRmaWxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB3cml0ZXIgPSBudWxsOworCisgICAgICAgICAgICAvLyBleGVjdXRlIHRoZSB0ZXN0IGFuZCBnZXQgdGhlIHJldHVybiBjb2RlCisgICAgICAgICAgICBFeGVjdXRlV2F0Y2hkb2cgd2F0Y2hkb2cgPSBjcmVhdGVXYXRjaGRvZygpOworICAgICAgICAgICAgVGVzdFJlc3VsdEhvbGRlciByZXN1bHQgPQorICAgICAgICAgICAgICAgIGV4ZWN1dGVBc0ZvcmtlZCh0ZXN0LCB3YXRjaGRvZywgY2FzZXNGaWxlKTsKKyAgICAgICAgICAgIGFjdE9uVGVzdFJlc3VsdChyZXN1bHQsIHRlc3QsICJUZXN0cyIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2FzZXNGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhIHRlc3RjYXNlIGJ5IGZvcmtpbmcgYSBuZXcgSlZNLiBUaGUgY29tbWFuZCB3aWxsIGJsb2NrCisgICAgICogdW50aWwgaXQgZmluaXNoZXMuIFRvIGtub3cgaWYgdGhlIHByb2Nlc3Mgd2FzIGRlc3Ryb3llZCBvciBub3QKKyAgICAgKiBvciB3aGV0aGVyIHRoZSBmb3JrZWQgSmF2YSBWTSBleGl0ZWQgYWJub3JtYWxseSwgdXNlIHRoZQorICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIHJldHVybmVkIGhvbGRlciBvYmplY3QuCisgICAgICogQHBhcmFtICB0ZXN0ICAgICAgIHRoZSB0ZXN0Y2FzZSB0byBleGVjdXRlLgorICAgICAqIEBwYXJhbSAgd2F0Y2hkb2cgICB0aGUgd2F0Y2hkb2cgaW4gY2hhcmdlIG9mIGNhbmNlbGxpbmcgdGhlIHRlc3QgaWYgaXQKKyAgICAgKiBleGNlZWRzIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4gQ2FuIGJlIDx0dD5udWxsPC90dD4sIGluIHRoaXMgY2FzZQorICAgICAqIHRoZSB0ZXN0IGNvdWxkIHByb2JhYmx5IGhhbmcgZm9yZXZlci4KKyAgICAgKiBAcGFyYW0gY2FzZXNGaWxlIGxpc3Qgb2YgdGVzdCBjYXNlcyB0byBleGVjdXRlLiBDYW4gYmUgPHR0Pm51bGw8L3R0PiwKKyAgICAgKiBpbiB0aGlzIGNhc2Ugb25seSBvbmUgdGVzdCBpcyBleGVjdXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0ZXN0IHJlc3VsdHMgZnJvbSB0aGUgSlZNIGl0c2VsZi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGluIGNhc2Ugb2YgZXJyb3IgY3JlYXRpbmcgYSB0ZW1wb3JhcnkgcHJvcGVydHkgZmlsZSwKKyAgICAgKiBvciBpZiB0aGUganVuaXQgcHJvY2VzcyBjYW4gbm90IGJlIGZvcmtlZAorICAgICAqLworICAgIHByaXZhdGUgVGVzdFJlc3VsdEhvbGRlciBleGVjdXRlQXNGb3JrZWQoSlVuaXRUZXN0IHRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRlV2F0Y2hkb2cgd2F0Y2hkb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGNhc2VzRmlsZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocGVybSAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2coIlBlcm1pc3Npb25zIGlnbm9yZWQgd2hlbiBydW5uaW5nIGluIGZvcmtlZCBtb2RlISIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKworICAgICAgICBDb21tYW5kbGluZUphdmEgY21kOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY21kID0gKENvbW1hbmRsaW5lSmF2YSkgKGdldENvbW1hbmRsaW5lKCkuY2xvbmUoKSk7CisgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhpcyBzaG91bGRuJ3QgaGFwcGVuIiwgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgY21kLnNldENsYXNzbmFtZSgib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUZXN0UnVubmVyIik7CisgICAgICAgIGlmIChjYXNlc0ZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGVzdC5nZXROYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJSdW5uaW5nIG11bHRpcGxlIHRlc3RzIGluIHRoZSBzYW1lIFZNIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDb25zdGFudHMuVEVTVFNGSUxFICsgY2FzZXNGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENvbnN0YW50cy5GSUxURVJUUkFDRSArIHRlc3QuZ2V0RmlsdGVydHJhY2UoKSk7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENvbnN0YW50cy5IQUxUX09OX0VSUk9SICsgdGVzdC5nZXRIYWx0b25lcnJvcigpKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ29uc3RhbnRzLkhBTFRfT05fRkFJTFVSRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRlc3QuZ2V0SGFsdG9uZmFpbHVyZSgpKTsKKyAgICAgICAgY2hlY2tJbmNsdWRlQW50UnVudGltZShjbWQpOworCisgICAgICAgIGNoZWNrSW5jbHVkZVN1bW1hcnkoY21kKTsKKworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDb25zdGFudHMuU0hPV09VVFBVVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZy52YWx1ZU9mKHNob3dPdXRwdXQpKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ29uc3RhbnRzLk9VVFBVVF9UT19GT1JNQVRURVJTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nLnZhbHVlT2Yob3V0cHV0VG9Gb3JtYXR0ZXJzKSk7CisKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoCisgICAgICAgICAgICBDb25zdGFudHMuTE9HVEVTVExJU1RFTkVSRVZFTlRTICsgInRydWUiKTsgLy8gIzMxODg1CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGZvcm1hdHRlckFyZyA9IG5ldyBTdHJpbmdCdWZmZXIoU1RSSU5HX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgZmluYWwgRm9ybWF0dGVyRWxlbWVudFtdIGZlQXJyYXkgPSBtZXJnZUZvcm1hdHRlcnModGVzdCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmVBcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRm9ybWF0dGVyRWxlbWVudCBmZSA9IGZlQXJyYXlbaV07CisgICAgICAgICAgICBpZiAoZmUuc2hvdWxkVXNlKHRoaXMpKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0dGVyQXJnLmFwcGVuZChDb25zdGFudHMuRk9STUFUVEVSKTsKKyAgICAgICAgICAgICAgICBmb3JtYXR0ZXJBcmcuYXBwZW5kKGZlLmdldENsYXNzbmFtZSgpKTsKKyAgICAgICAgICAgICAgICBGaWxlIG91dEZpbGUgPSBnZXRPdXRwdXQoZmUsIHRlc3QpOworICAgICAgICAgICAgICAgIGlmIChvdXRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyQXJnLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJBcmcuYXBwZW5kKG91dEZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShmb3JtYXR0ZXJBcmcudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZm9ybWF0dGVyQXJnID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRmlsZSB2bVdhdGNoZXIgPSBjcmVhdGVUZW1wUHJvcGVydGllc0ZpbGUoImp1bml0dm13YXRjaGVyIik7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENvbnN0YW50cy5DUkFTSEZJTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2bVdhdGNoZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBGaWxlIHByb3BzRmlsZSA9IGNyZWF0ZVRlbXBQcm9wZXJ0aWVzRmlsZSgianVuaXQiKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ29uc3RhbnRzLlBST1BTRklMRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BzRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIEhhc2h0YWJsZSBwID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHAua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgT2JqZWN0IGtleSA9IGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHByb3BzLnB1dChrZXksIHAuZ2V0KGtleSkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHByb3BzRmlsZSk7CisgICAgICAgICAgICBwcm9wcy5zdG9yZShvdXRzdHJlYW0sICJBbnQgSlVuaXRUYXNrIGdlbmVyYXRlZCBwcm9wZXJ0aWVzIGZpbGUiKTsKKyAgICAgICAgICAgIG91dHN0cmVhbS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHByb3BzRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgdGVtcG9yYXJ5IHByb3BlcnRpZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZpbGUuIiwgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBFeGVjdXRlIGV4ZWN1dGUgPSBuZXcgRXhlY3V0ZSgKKyAgICAgICAgICAgIG5ldyBKVW5pdExvZ1N0cmVhbUhhbmRsZXIoCisgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pLAorICAgICAgICAgICAgd2F0Y2hkb2cpOworICAgICAgICBleGVjdXRlLnNldENvbW1hbmRsaW5lKGNtZC5nZXRDb21tYW5kbGluZSgpKTsKKyAgICAgICAgZXhlY3V0ZS5zZXRBbnRSdW4oZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICBleGVjdXRlLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGVudmlyb25tZW50ID0gZW52LmdldFZhcmlhYmxlcygpOworICAgICAgICBpZiAoZW52aXJvbm1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnZpcm9ubWVudC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGxvZygiU2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZTogIiArIGVudmlyb25tZW50W2ldLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleGVjdXRlLnNldE5ld2Vudmlyb25tZW50KG5ld0Vudmlyb25tZW50KTsKKyAgICAgICAgZXhlY3V0ZS5zZXRFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7CisKKyAgICAgICAgbG9nKGNtZC5kZXNjcmliZUNvbW1hbmQoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgY2hlY2tGb3JrZWRQYXRoKGNtZCk7CisKKyAgICAgICAgVGVzdFJlc3VsdEhvbGRlciByZXN1bHQgPSBuZXcgVGVzdFJlc3VsdEhvbGRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzdWx0LmV4aXRDb2RlID0gZXhlY3V0ZS5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvY2VzcyBmb3JrIGZhaWxlZC4iLCBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFN0cmluZyB2bUNyYXNoU3RyaW5nID0gInVua25vd24iOworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAodm1XYXRjaGVyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHZtV2F0Y2hlcikpOworICAgICAgICAgICAgICAgICAgICB2bUNyYXNoU3RyaW5nID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2bUNyYXNoU3RyaW5nID0gIk1vbml0b3IgZmlsZSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdm1XYXRjaGVyLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBtaXNzaW5nLCBsb2NhdGlvbiBub3Qgd3JpdGFibGUsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0ZXN0Y2FzZSBub3Qgc3RhcnRlZCBvciBtaXhpbmcgYW50IHZlcnNpb25zPyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQuCisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShicik7CisgICAgICAgICAgICAgICAgaWYgKHZtV2F0Y2hlci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICB2bVdhdGNoZXIuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdhdGNoZG9nICE9IG51bGwgJiYgd2F0Y2hkb2cua2lsbGVkUHJvY2VzcygpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LnRpbWVkT3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb2dUaW1lb3V0KGZlQXJyYXksIHRlc3QsIHZtQ3Jhc2hTdHJpbmcpOworICAgICAgICAgICAgfSBlbHNlIGlmICghQ29uc3RhbnRzLlRFUk1JTkFURURfU1VDQ0VTU0ZVTExZLmVxdWFscyh2bUNyYXNoU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5jcmFzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb2dWbUNyYXNoKGZlQXJyYXksIHRlc3QsIHZtQ3Jhc2hTdHJpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXByb3BzRmlsZS5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZSB0ZW1wb3JhcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwcm9wZXJ0aWVzIGZpbGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZGluZyBhbnQgcnVudGltZS4KKyAgICAgKiBAcGFyYW0gY21kIGNvbW1hbmQgdG8gcnVuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSW5jbHVkZUFudFJ1bnRpbWUoQ29tbWFuZGxpbmVKYXZhIGNtZCkgeworICAgICAgICBpZiAoaW5jbHVkZUFudFJ1bnRpbWUpIHsKKyAgICAgICAgICAgIFZlY3RvciB2ID0gRXhlY3V0ZS5nZXRQcm9jRW52aXJvbm1lbnQoKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB2LmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoQ0xBU1NQQVRIKSkgeworICAgICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQ2xhc3NwYXRoKGdldFByb2plY3QoKSkuY3JlYXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG5ldyBQYXRoKGdldFByb2plY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdWJzdHJpbmcoQ0xBU1NQQVRILmxlbmd0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIkltcGxpY2l0bHkgYWRkaW5nICIgKyBhbnRSdW50aW1lQ2xhc3NlcyArICIgdG8gQ0xBU1NQQVRIIiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVDbGFzc3BhdGgoZ2V0UHJvamVjdCgpKS5jcmVhdGVQYXRoKCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGFudFJ1bnRpbWVDbGFzc2VzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogY2hlY2sgZm9yIHRoZSBwYXJhbWV0ZXIgYmVpbmcgIndpdGhvdXRhbmRlcnIiIGluIGEgbG9jYWxlLWluZGVwZW5kZW50IHdheS4KKyAgICAgKiBAcGFyYW0gc3VtbWFyeU9wdGlvbiB0aGUgc3VtbWFyeSBvcHRpb24gLWNhbiBiZSBudWxsCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBydW4gc2hvdWxkIGJlIHdpdGhvdXRwdXQgYW5kIGVycm9yCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGVxdWFsc1dpdGhPdXRBbmRFcnIoU3RyaW5nIHN1bW1hcnlPcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIHN1bW1hcnlPcHRpb24gIT0gbnVsbCAmJiAid2l0aG91dGFuZGVyciIuZXF1YWxzKAorICAgICAgICAgICAgc3VtbWFyeU9wdGlvbi50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0luY2x1ZGVTdW1tYXJ5KENvbW1hbmRsaW5lSmF2YSBjbWQpIHsKKyAgICAgICAgaWYgKHN1bW1hcnkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKKyAgICAgICAgICAgIGlmIChlcXVhbHNXaXRoT3V0QW5kRXJyKHN1bW1hcnlWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBwcmVmaXggPSAiT3V0RXJyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpCisgICAgICAgICAgICAgICAgLnNldFZhbHVlKENvbnN0YW50cy5GT1JNQVRURVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICArIHByZWZpeCArICJTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBwYXRoIGZvciBtdWx0aXBsZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKKyAgICAgKiBhbnQuCisgICAgICogQHBhcmFtIGNtZCBjb21tYW5kIHRvIGV4ZWN1dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JrZWRQYXRoKENvbW1hbmRsaW5lSmF2YSBjbWQpIHsKKyAgICAgICAgaWYgKGZvcmtlZFBhdGhDaGVja2VkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9ya2VkUGF0aENoZWNrZWQgPSB0cnVlOworICAgICAgICBpZiAoIWNtZC5oYXZlQ2xhc3NwYXRoKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBBbnRDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgQW50Q2xhc3NMb2FkZXIoCisgICAgICAgICAgICBnZXRQcm9qZWN0KCksIGNtZC5jcmVhdGVDbGFzc3BhdGgoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgIFN0cmluZyBwcm9qZWN0UmVzb3VyY2VOYW1lID0gTG9hZGVyVXRpbHMuY2xhc3NOYW1lVG9SZXNvdXJjZSgKKyAgICAgICAgICAgIFByb2plY3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgVVJMIHByZXZpb3VzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGxvYWRlci5nZXRSZXNvdXJjZXMocHJvamVjdFJlc291cmNlTmFtZSk7CisgICAgICAgICAgICAgICAgIGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgVVJMIGN1cnJlbnQgPSAoVVJMKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzICE9IG51bGwgJiYgIWN1cnJlbnQuZXF1YWxzKHByZXZpb3VzKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIldBUk5JTkc6IG11bHRpcGxlIHZlcnNpb25zIG9mIGFudCBkZXRlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJpbiBwYXRoIGZvciBqdW5pdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIExJTkVfU0VQICsgIiAgICAgICAgICIgKyBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgKyBMSU5FX1NFUCArICIgICAgIGFuZCAiICsgY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9uCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byBwYXNzIHRoZSBwcm9wZXJ0aWVzIHRvIGEgbmV3IHByb2Nlc3MuCisgICAgICogV2lsbCBhdXRvLWRlbGV0ZSBvbiAoZ3JhY2VmdWwpIGV4aXQuCisgICAgICogVGhlIGZpbGUgd2lsbCBiZSBpbiB0aGUgcHJvamVjdCBiYXNlZGlyIHVubGVzcyB0bXBEaXIgZGVjbGFyZXMKKyAgICAgKiBzb21ldGhpbmcgZWxzZS4KKyAgICAgKiBAcGFyYW0gcHJlZml4CisgICAgICogQHJldHVybiBjcmVhdGVkIGZpbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgY3JlYXRlVGVtcFByb3BlcnRpZXNGaWxlKFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgRmlsZSBwcm9wc0ZpbGUgPQorICAgICAgICAgICAgRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZShwcmVmaXgsICIucHJvcGVydGllcyIsCisgICAgICAgICAgICAgICAgdG1wRGlyICE9IG51bGwgPyB0bXBEaXIgOiBnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHByb3BzRmlsZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhc3Mgb3V0cHV0IHNlbnQgdG8gU3lzdGVtLm91dCB0byB0aGUgVGVzdFJ1bm5lciBzbyBpdCBjYW4KKyAgICAgKiBjb2xsZWN0IG90IGZvciB0aGUgZm9ybWF0dGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgb3V0cHV0IGNvbWluZyBmcm9tIFN5c3RlbS5vdXQKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU91dHB1dChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChvdXRwdXQuc3RhcnRzV2l0aChURVNUTElTVEVORVJfUFJFRklYKSkgeworICAgICAgICAgICAgbG9nKG91dHB1dCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0gZWxzZSBpZiAocnVubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRUb0Zvcm1hdHRlcnMpIHsKKyAgICAgICAgICAgICAgICBydW5uZXIuaGFuZGxlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvd091dHB1dCkgeworICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuaGFuZGxlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgYW4gaW5wdXQgcmVxdWVzdCBieSB0aGlzIHRhc2suCisgICAgICogQHNlZSBUYXNrI2hhbmRsZUlucHV0KGJ5dGVbXSwgaW50LCBpbnQpCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkZWxlZ2F0ZXMgdG8gYSBydW5uZXIgaWYgaXQKKyAgICAgKiBwcmVzZW50LgorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgaXMgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGF0IHdoaWNoIGRhdGEgaXMgc3RvcmVkLgorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIGFtb3VudCBvZiBkYXRhIHRvIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBkYXRhIGNhbm5vdCBiZSByZWFkLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGhhbmRsZUlucHV0KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChydW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJ1bm5lci5oYW5kbGVJbnB1dChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5oYW5kbGVJbnB1dChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFzcyBvdXRwdXQgc2VudCB0byBTeXN0ZW0ub3V0IHRvIHRoZSBUZXN0UnVubmVyIHNvIGl0IGNhbgorICAgICAqIGNvbGxlY3Qgb3QgZm9yIHRoZSBmb3JtYXR0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBvdXRwdXQgY29taW5nIGZyb20gU3lzdGVtLm91dAorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGbHVzaChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChydW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcnVubmVyLmhhbmRsZUZsdXNoKG91dHB1dCk7CisgICAgICAgICAgICBpZiAoc2hvd091dHB1dCkgeworICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZUZsdXNoKG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVGbHVzaChvdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzcyBvdXRwdXQgc2VudCB0byBTeXN0ZW0uZXJyIHRvIHRoZSBUZXN0UnVubmVyIHNvIGl0IGNhbgorICAgICAqIGNvbGxlY3QgaXQgZm9yIHRoZSBmb3JtYXR0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBvdXRwdXQgY29taW5nIGZyb20gU3lzdGVtLmVycgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlRXJyb3JPdXRwdXQoU3RyaW5nIG91dHB1dCkgeworICAgICAgICBpZiAocnVubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJ1bm5lci5oYW5kbGVFcnJvck91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgaWYgKHNob3dPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICBzdXBlci5oYW5kbGVFcnJvck91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuaGFuZGxlRXJyb3JPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFzcyBvdXRwdXQgc2VudCB0byBTeXN0ZW0uZXJyIHRvIHRoZSBUZXN0UnVubmVyIHNvIGl0IGNhbgorICAgICAqIGNvbGxlY3QgaXQgZm9yIHRoZSBmb3JtYXR0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dCBjb21pbmcgZnJvbSBTeXN0ZW0uZXJyCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZUVycm9yRmx1c2goU3RyaW5nIG91dHB1dCkgeworICAgICAgICBpZiAocnVubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJ1bm5lci5oYW5kbGVFcnJvckZsdXNoKG91dHB1dCk7CisgICAgICAgICAgICBpZiAoc2hvd091dHB1dCkgeworICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZUVycm9yRmx1c2gob3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmhhbmRsZUVycm9yRmx1c2gob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGluIFZNIGlzIG5vdCB2ZXJ5IG5pY2Ugc2luY2UgaXQgY291bGQgcHJvYmFibHkgaGFuZyB0aGUKKyAgICAvLyB3aG9sZSBidWlsZC4gSU1ITyB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYXZvaWRlZCBhbmQgaXQgd291bGQgYmUgYmVzdAorICAgIC8vIHRvIHJlbW92ZSBpdCBpbiBmdXR1cmUgdmVyc2lvbnMuIFRCRC4gKFNCYSkKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgaW5zaWRlIFZNLgorICAgICAqIEBwYXJhbSBhcmcgb25lIEpVbml0VGVzdAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdW5kZXIgdW5zcGVjaWZpZWQgY2lyY3Vtc3RhbmNlcworICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIFRlc3RSZXN1bHRIb2xkZXIgZXhlY3V0ZUluVk0oSlVuaXRUZXN0IGFyZykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlbGVnYXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldHVwSlVuaXREZWxlZ2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgSlVuaXRUZXN0IHRlc3QgPSAoSlVuaXRUZXN0KSBhcmcuY2xvbmUoKTsKKyAgICAgICAgdGVzdC5zZXRQcm9wZXJ0aWVzKGdldFByb2plY3QoKS5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiZGlyIGF0dHJpYnV0ZSBpZ25vcmVkIGlmIHJ1bm5pbmcgaW4gdGhlIHNhbWUgVk0iLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0Vudmlyb25tZW50IHx8IG51bGwgIT0gZW52LmdldFZhcmlhYmxlcygpKSB7CisgICAgICAgICAgICBsb2coIkNoYW5nZXMgdG8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBpZ25vcmVkIGlmIHJ1bm5pbmcgaW4gIgorICAgICAgICAgICAgICAgICsgInRoZSBzYW1lIFZNLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldENvbW1hbmRsaW5lKCkuZ2V0Qm9vdGNsYXNzcGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiYm9vdGNsYXNzcGF0aCBpcyBpZ25vcmVkIGlmIHJ1bm5pbmcgaW4gdGhlIHNhbWUgVk0uIiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbW1hbmRsaW5lSmF2YS5TeXNQcm9wZXJ0aWVzIHN5c1Byb3BlcnRpZXMgPQorICAgICAgICAgICAgICAgIGdldENvbW1hbmRsaW5lKCkuZ2V0U3lzdGVtUHJvcGVydGllcygpOworICAgICAgICBpZiAoc3lzUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBzeXNQcm9wZXJ0aWVzLnNldFN5c3RlbSgpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZygiVXNpbmcgU3lzdGVtIHByb3BlcnRpZXMgIiArIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBpZiAoc3BsaXRKdW5pdCkgeworICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gKEFudENsYXNzTG9hZGVyKSBkZWxlZ2F0ZS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNyZWF0ZUNsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLnNldFRocmVhZENvbnRleHRMb2FkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1bm5lciA9IGRlbGVnYXRlLm5ld0pVbml0VGVzdFJ1bm5lcih0ZXN0LCB0ZXN0LmdldEhhbHRvbmVycm9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QuZ2V0RmlsdGVydHJhY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC5nZXRIYWx0b25mYWlsdXJlKCksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBjbGFzc0xvYWRlcik7CisgICAgICAgICAgICBpZiAoc3VtbWFyeSkgeworCisgICAgICAgICAgICAgICAgSlVuaXRUYXNrTWlycm9yLlN1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlck1pcnJvciBmID0KKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUubmV3U3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyKCk7CisgICAgICAgICAgICAgICAgZi5zZXRXaXRoT3V0QW5kRXJyKGVxdWFsc1dpdGhPdXRBbmRFcnIoc3VtbWFyeVZhbHVlKSk7CisgICAgICAgICAgICAgICAgZi5zZXRPdXRwdXQoZ2V0RGVmYXVsdE91dHB1dCgpKTsKKyAgICAgICAgICAgICAgICBydW5uZXIuYWRkRm9ybWF0dGVyKGYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBydW5uZXIuc2V0UGVybWlzc2lvbnMocGVybSk7CisKKyAgICAgICAgICAgIGZpbmFsIEZvcm1hdHRlckVsZW1lbnRbXSBmZUFycmF5ID0gbWVyZ2VGb3JtYXR0ZXJzKHRlc3QpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZUFycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRm9ybWF0dGVyRWxlbWVudCBmZSA9IGZlQXJyYXlbaV07CisgICAgICAgICAgICAgICAgaWYgKGZlLnNob3VsZFVzZSh0aGlzKSkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIG91dEZpbGUgPSBnZXRPdXRwdXQoZmUsIHRlc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZS5zZXRPdXRmaWxlKG91dEZpbGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmUuc2V0T3V0cHV0KGdldERlZmF1bHRPdXRwdXQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcnVubmVyLmFkZEZvcm1hdHRlcihmZS5jcmVhdGVGb3JtYXR0ZXIoY2xhc3NMb2FkZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ1bm5lci5ydW4oKTsKKyAgICAgICAgICAgIFRlc3RSZXN1bHRIb2xkZXIgcmVzdWx0ID0gbmV3IFRlc3RSZXN1bHRIb2xkZXIoKTsKKyAgICAgICAgICAgIHJlc3VsdC5leGl0Q29kZSA9IHJ1bm5lci5nZXRSZXRDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN5c1Byb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN5c1Byb3BlcnRpZXMucmVzdG9yZVN5c3RlbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5yZXNldFRocmVhZENvbnRleHRMb2FkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gPHR0Pm51bGw8L3R0PiBpZiB0aGVyZSBpcyBhIHRpbWVvdXQgdmFsdWUsIG90aGVyd2lzZSB0aGUKKyAgICAgKiB3YXRjaGRvZyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdW5kZXIgdW5zcGVjaWZpZWQgY2lyY3Vtc3RhbmNlcworICAgICAqIEBzaW5jZSBBbnQgMS4yCisgICAgICovCisgICAgcHJvdGVjdGVkIEV4ZWN1dGVXYXRjaGRvZyBjcmVhdGVXYXRjaGRvZygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRXhlY3V0ZVdhdGNoZG9nKChsb25nKSB0aW1lb3V0LmludFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVmYXVsdCBvdXRwdXQgZm9yIGEgZm9ybWF0dGVyLgorICAgICAqCisgICAgICogQHJldHVybiBkZWZhdWx0IG91dHB1dCBzdHJlYW0gZm9yIGEgZm9ybWF0dGVyCisgICAgICogQHNpbmNlIEFudCAxLjMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGdldERlZmF1bHRPdXRwdXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX0lORk8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lcmdlIGFsbCBpbmRpdmlkdWFsIHRlc3RzIGZyb20gdGhlIGJhdGNodGVzdCB3aXRoIGFsbCBpbmRpdmlkdWFsIHRlc3RzCisgICAgICogYW5kIHJldHVybiBhbiBlbnVtZXJhdGlvbiBvdmVyIGFsbCA8dHQ+SlVuaXRUZXN0PC90dD4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVudW1lcmF0aW9uIG92ZXIgaW5kaXZpZHVhbCB0ZXN0cworICAgICAqIEBzaW5jZSBBbnQgMS4zCisgICAgICovCisgICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uIGdldEluZGl2aWR1YWxUZXN0cygpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gYmF0Y2hUZXN0cy5zaXplKCk7CisgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uW10gZW51bXMgPSBuZXcgRW51bWVyYXRpb25bIGNvdW50ICsgMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgQmF0Y2hUZXN0IGJhdGNodGVzdCA9IChCYXRjaFRlc3QpIGJhdGNoVGVzdHMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgZW51bXNbaV0gPSBiYXRjaHRlc3QuZWxlbWVudHMoKTsKKyAgICAgICAgfQorICAgICAgICBlbnVtc1tlbnVtcy5sZW5ndGggLSAxXSA9IHRlc3RzLmVsZW1lbnRzKCk7CisgICAgICAgIHJldHVybiBFbnVtZXJhdGlvbnMuZnJvbUNvbXBvdW5kKGVudW1zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gYW4gZW51bWVyYXRpb24gbGlzdGluZyBlYWNoIHRlc3QsIHRoZW4gZWFjaCBiYXRjaHRlc3QKKyAgICAgKiBAcmV0dXJuIGVudW1lcmF0aW9uCisgICAgICogQHNpbmNlIEFudCAxLjMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRW51bWVyYXRpb24gYWxsVGVzdHMoKSB7CisgICAgICAgIEVudW1lcmF0aW9uW10gZW51bXMgPSB7dGVzdHMuZWxlbWVudHMoKSwgYmF0Y2hUZXN0cy5lbGVtZW50cygpfTsKKyAgICAgICAgcmV0dXJuIEVudW1lcmF0aW9ucy5mcm9tQ29tcG91bmQoZW51bXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0ZXN0IGp1bml0IHRlc3QKKyAgICAgKiBAcmV0dXJuIGFycmF5IG9mIEZvcm1hdHRlckVsZW1lbnQKKyAgICAgKiBAc2luY2UgQW50IDEuMworICAgICAqLworICAgIHByaXZhdGUgRm9ybWF0dGVyRWxlbWVudFtdIG1lcmdlRm9ybWF0dGVycyhKVW5pdFRlc3QgdGVzdCkgeworICAgICAgICBWZWN0b3IgZmVWZWN0b3IgPSAoVmVjdG9yKSBmb3JtYXR0ZXJzLmNsb25lKCk7CisgICAgICAgIHRlc3QuYWRkRm9ybWF0dGVyc1RvKGZlVmVjdG9yKTsKKyAgICAgICAgRm9ybWF0dGVyRWxlbWVudFtdIGZlQXJyYXkgPSBuZXcgRm9ybWF0dGVyRWxlbWVudFtmZVZlY3Rvci5zaXplKCldOworICAgICAgICBmZVZlY3Rvci5jb3B5SW50byhmZUFycmF5KTsKKyAgICAgICAgcmV0dXJuIGZlQXJyYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIGZvcm1hdHRlciBzZW5kcyBvdXRwdXQgdG8gYSBmaWxlLCByZXR1cm4gdGhhdCBmaWxlLgorICAgICAqIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBmZSAgZm9ybWF0dGVyIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gdGVzdCBvbmUgSlVuaXQgdGVzdAorICAgICAqIEByZXR1cm4gZmlsZSByZWZlcmVuY2UKKyAgICAgKiBAc2luY2UgQW50IDEuMworICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGdldE91dHB1dChGb3JtYXR0ZXJFbGVtZW50IGZlLCBKVW5pdFRlc3QgdGVzdCkgeworICAgICAgICBpZiAoZmUuZ2V0VXNlRmlsZSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgYmFzZSA9IHRlc3QuZ2V0T3V0ZmlsZSgpOworICAgICAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJhc2UgPSBKVW5pdFRhc2tNaXJyb3IuSlVuaXRUZXN0UnVubmVyTWlycm9yLklHTk9SRURfRklMRV9OQU1FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gYmFzZSArIGZlLmdldEV4dGVuc2lvbigpOworICAgICAgICAgICAgRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHRlc3QuZ2V0VG9kaXIoKSwgZmlsZW5hbWUpOworICAgICAgICAgICAgU3RyaW5nIGFic0ZpbGVuYW1lID0gZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGFic0ZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkIHRoZSBkaXJlY3Rvcnkgb3IgYXJjaGl2ZQorICAgICAqIHRoYXQgY29udGFpbnMgaXQgdG8gdGhlIGNsYXNzcGF0aC4KKyAgICAgKgorICAgICAqIDxwPkRvZXNuJ3Qgd29yayBmb3IgYXJjaGl2ZXMgaW4gSkRLIDEuMSBhcyB0aGUgVVJMIHJldHVybmVkIGJ5CisgICAgICogZ2V0UmVzb3VyY2UgZG9lc24ndCBjb250YWluIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSB0aGF0IG9uZSB3YW50cyB0byBsb29rdXAKKyAgICAgKiBAc2luY2UgQW50IDEuNAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZENsYXNzcGF0aEVudHJ5KFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICBhZGRDbGFzc3BhdGhSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWRkQ2xhc3NwYXRoRW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgdGhhdCBvbmUgd2FudHMgdG8gbG9va3VwCisgICAgICogQHJldHVybiB0cnVlIGlmIHNvbWV0aGluZyB3YXMgaW4gZmFjdCBhZGRlZAorICAgICAqIEBzaW5jZSBBbnQgMS43LjEKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYWRkQ2xhc3NwYXRoUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIHByZSBBbnQgMS42IHRoaXMgbWV0aG9kIHVzZWQgdG8gY2FsbCBnZXRDbGFzcygpLmdldFJlc291cmNlCisgICAgICAgICAqIHdoaWxlIEFudCAxLjYgd2lsbCBjYWxsIENsYXNzTG9hZGVyLmdldFJlc291cmNlKCkuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgQ2xhc3MuZ2V0UmVzb3VyY2UgZXhwZWN0cyBhIGxlYWRpbmcKKyAgICAgICAgICogc2xhc2ggZm9yICJhYnNvbHV0ZSIgcmVzb3VyY2VzIGFuZCB3aWxsIHN0cmlwIGl0IGJlZm9yZQorICAgICAgICAgKiBkZWxlZ2F0aW5nIHRvIENsYXNzTG9hZGVyLmdldFJlc291cmNlIC0gc28gd2Ugbm93IGhhdmUgdG8KKyAgICAgICAgICogZW11bGF0ZSBDbGFzcydzIGJlaGF2aW9yLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHJlc291cmNlLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNvdXJjZSA9ICJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC8iCisgICAgICAgICAgICAgICAgKyByZXNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZiA9IExvYWRlclV0aWxzLmdldFJlc291cmNlU291cmNlKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UpOworICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkZvdW5kICIgKyBmLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICBhbnRSdW50aW1lQ2xhc3Nlcy5jcmVhdGVQYXRoKCkuc2V0TG9jYXRpb24oZik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZygiQ291bGRuXCd0IGZpbmQgIiArIHJlc291cmNlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlIGNhcmUgdGhhdCBzb21lIG91dHB1dCBpcyBwcm9kdWNlZCBpbiByZXBvcnQgZmlsZXMgaWYgdGhlCisgICAgICogd2F0Y2hkb2cga2lsbHMgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisKKyAgICBwcml2YXRlIHZvaWQgbG9nVGltZW91dChGb3JtYXR0ZXJFbGVtZW50W10gZmVBcnJheSwgSlVuaXRUZXN0IHRlc3QsIFN0cmluZyB0ZXN0Q2FzZSkgeworICAgICAgICBsb2dWbUV4aXQoCisgICAgICAgICAgICBmZUFycmF5LCB0ZXN0LAorICAgICAgICAgICAgIlRpbWVvdXQgb2NjdXJyZWQuIFBsZWFzZSBub3RlIHRoZSB0aW1lIGluIHRoZSByZXBvcnQgZG9lcyIKKyAgICAgICAgICAgICsgIiBub3QgcmVmbGVjdCB0aGUgdGltZSB1bnRpbCB0aGUgdGltZW91dC4iLAorICAgICAgICAgICAgdGVzdENhc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgY2FyZSB0aGF0IHNvbWUgb3V0cHV0IGlzIHByb2R1Y2VkIGluIHJlcG9ydCBmaWxlcyBpZiB0aGUKKyAgICAgKiBmb3JrZWQgbWFjaGluZSBleGl0ZWQgYmVmb3JlIHRoZSB0ZXN0IHN1aXRlIGZpbmlzaGVkIGJ1dCB0aGUKKyAgICAgKiByZWFzb24gaXMgbm90IGEgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZ1ZtQ3Jhc2goRm9ybWF0dGVyRWxlbWVudFtdIGZlQXJyYXksIEpVbml0VGVzdCB0ZXN0LCBTdHJpbmcgdGVzdENhc2UpIHsKKyAgICAgICAgbG9nVm1FeGl0KAorICAgICAgICAgICAgZmVBcnJheSwgdGVzdCwKKyAgICAgICAgICAgICJGb3JrZWQgSmF2YSBWTSBleGl0ZWQgYWJub3JtYWxseS4gUGxlYXNlIG5vdGUgdGhlIHRpbWUgaW4gdGhlIHJlcG9ydCIKKyAgICAgICAgICAgICsgIiBkb2VzIG5vdCByZWZsZWN0IHRoZSB0aW1lIHVudGlsIHRoZSBWTSBleGl0LiIsCisgICAgICAgICAgICB0ZXN0Q2FzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZSBjYXJlIHRoYXQgc29tZSBvdXRwdXQgaXMgcHJvZHVjZWQgaW4gcmVwb3J0IGZpbGVzIGlmIHRoZQorICAgICAqIGZvcmtlZCBtYWNoaW5lIHRlcm1pbmF0ZWQgYmVmb3JlIHRoZSB0ZXN0IHN1aXRlIGZpbmlzaGVkCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2dWbUV4aXQoRm9ybWF0dGVyRWxlbWVudFtdIGZlQXJyYXksIEpVbml0VGVzdCB0ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyB0ZXN0Q2FzZSkgeworICAgICAgICBpZiAoZGVsZWdhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0dXBKVW5pdERlbGVnYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nKCJVc2luZyBTeXN0ZW0gcHJvcGVydGllcyAiICsgU3lzdGVtLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGlmIChzcGxpdEp1bml0KSB7CisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSAoQW50Q2xhc3NMb2FkZXIpIGRlbGVnYXRlLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3JlYXRlQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuc2V0VGhyZWFkQ29udGV4dExvYWRlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZXN0LnNldENvdW50cygxLCAwLCAxKTsKKyAgICAgICAgICAgIHRlc3Quc2V0UHJvcGVydGllcyhnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmVBcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZvcm1hdHRlckVsZW1lbnQgZmUgPSBmZUFycmF5W2ldOworICAgICAgICAgICAgICAgIEZpbGUgb3V0RmlsZSA9IGdldE91dHB1dChmZSwgdGVzdCk7CisgICAgICAgICAgICAgICAgSlVuaXRUYXNrTWlycm9yLkpVbml0UmVzdWx0Rm9ybWF0dGVyTWlycm9yIGZvcm1hdHRlciA9CisgICAgICAgICAgICAgICAgICAgIGZlLmNyZWF0ZUZvcm1hdHRlcihjbGFzc0xvYWRlcik7CisgICAgICAgICAgICAgICAgaWYgKG91dEZpbGUgIT0gbnVsbCAmJiBmb3JtYXR0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuYWRkVm1FeGl0KHRlc3QsIGZvcm1hdHRlciwgb3V0LCBtZXNzYWdlLCB0ZXN0Q2FzZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1bW1hcnkpIHsKKyAgICAgICAgICAgICAgICBKVW5pdFRhc2tNaXJyb3IuU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyTWlycm9yIGYgPQorICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5uZXdTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIoKTsKKyAgICAgICAgICAgICAgICBmLnNldFdpdGhPdXRBbmRFcnIoIndpdGhvdXRhbmRlcnIiLmVxdWFsc0lnbm9yZUNhc2Uoc3VtbWFyeVZhbHVlKSk7CisgICAgICAgICAgICAgICAgZGVsZWdhdGUuYWRkVm1FeGl0KHRlc3QsIGYsIGdldERlZmF1bHRPdXRwdXQoKSwgbWVzc2FnZSwgdGVzdENhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5yZXNldFRocmVhZENvbnRleHRMb2FkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYW4gQW50Q2xhc3NMb2FkZXIgaW5zdGFuY2UgZnJvbSB0aGUKKyAgICAgKiBuZXN0ZWQgY2xhc3NwYXRoIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgUGF0aCB1c2VyQ2xhc3NwYXRoID0gZ2V0Q29tbWFuZGxpbmUoKS5nZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgaWYgKHVzZXJDbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJlbG9hZGluZyB8fCBjbGFzc0xvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IChQYXRoKSB1c2VyQ2xhc3NwYXRoLmNsb25lKCk7CisgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVBbnRSdW50aW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiSW1wbGljaXRseSBhZGRpbmcgIiArIGFudFJ1bnRpbWVDbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICArICIgdG8gQ0xBU1NQQVRIIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoYW50UnVudGltZUNsYXNzZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjbGFzc3BhdGgpOworICAgICAgICAgICAgICAgIGlmIChnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkgIT0gUHJvamVjdC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLnNldFBhcmVudChnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5zZXRQYXJlbnRGaXJzdChmYWxzZSk7CisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkSmF2YUxpYnJhcmllcygpOworICAgICAgICAgICAgICAgIGxvZygiVXNpbmcgQ0xBU1NQQVRIICIgKyBjbGFzc0xvYWRlci5nZXRDbGFzc3BhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB0ZXN0IHdpbGwgYmUgYWNjZXB0ZWQgYXMgYSBUZXN0Q2FzZQorICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFN5c3RlbVBhY2thZ2VSb290KCJqdW5pdCIpOworICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGVzdCBhbm5vdGF0aW9uIGFyZSBhY2NlcHRlZAorICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFN5c3RlbVBhY2thZ2VSb290KCJvcmcuanVuaXQiKTsKKyAgICAgICAgICAgICAgICAvLyB3aWxsIGNhdXNlIHRyb3VibGUgaW4gSkRLIDEuMSBpZiBvbWl0dGVkCisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkU3lzdGVtUGFja2FnZVJvb3QoIm9yZy5hcGFjaGUudG9vbHMuYW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIDxwPklzIGludm9rZWQgaW4ge0BsaW5rICNleGVjdXRlIGV4ZWN1dGV9LiAgU3ViY2xhc3NlcyB0aGF0CisgICAgICogZG9uJ3QgaW52b2tlIGV4ZWN1dGUgc2hvdWxkIGludm9rZSB0aGlzIG1ldGhvZCBpbiBhIGZpbmFsbHkKKyAgICAgKiBibG9jay48L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNy4xCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgZGVsZXRlQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgZGVsZWdhdGUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBjbGFzc2xvYWRlciBpZiBuZWVkZWQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlQ2xhc3NMb2FkZXIoKSB7CisgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc0xvYWRlci5jbGVhbnVwKCk7CisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1pcnJvckxvYWRlciBpbnN0YW5jZW9mIFNwbGl0TG9hZGVyKSB7CisgICAgICAgICAgICAoKFNwbGl0TG9hZGVyKSBtaXJyb3JMb2FkZXIpLmNsZWFudXAoKTsKKyAgICAgICAgfQorICAgICAgICBtaXJyb3JMb2FkZXIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gcnVuIHRoZSB0ZXN0cy4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHByb3RlY3RlZCBDb21tYW5kbGluZUphdmEgZ2V0Q29tbWFuZGxpbmUoKSB7CisgICAgICAgIGlmIChjb21tYW5kbGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZSA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tbWFuZGxpbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ya2VkIHRlc3Qgc3VwcG9ydAorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBGb3JrZWRUZXN0Q29uZmlndXJhdGlvbiB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJUcmFjZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhbHRPbkVycm9yOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFsdE9uRmFpbHVyZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JQcm9wZXJ0eTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZmFpbHVyZVByb3BlcnR5OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBjb25zdHJ1Y3RvciBmb3IgZm9ya2VkIHRlc3QgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBAcGFyYW0gZmlsdGVyVHJhY2UKKyAgICAgICAgICogQHBhcmFtIGhhbHRPbkVycm9yCisgICAgICAgICAqIEBwYXJhbSBoYWx0T25GYWlsdXJlCisgICAgICAgICAqIEBwYXJhbSBlcnJvclByb3BlcnR5CisgICAgICAgICAqIEBwYXJhbSBmYWlsdXJlUHJvcGVydHkKKyAgICAgICAgICovCisgICAgICAgIEZvcmtlZFRlc3RDb25maWd1cmF0aW9uKGJvb2xlYW4gZmlsdGVyVHJhY2UsIGJvb2xlYW4gaGFsdE9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFsdE9uRmFpbHVyZSwgU3RyaW5nIGVycm9yUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYWlsdXJlUHJvcGVydHkpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyVHJhY2UgPSBmaWx0ZXJUcmFjZTsKKyAgICAgICAgICAgIHRoaXMuaGFsdE9uRXJyb3IgPSBoYWx0T25FcnJvcjsKKyAgICAgICAgICAgIHRoaXMuaGFsdE9uRmFpbHVyZSA9IGhhbHRPbkZhaWx1cmU7CisgICAgICAgICAgICB0aGlzLmVycm9yUHJvcGVydHkgPSBlcnJvclByb3BlcnR5OworICAgICAgICAgICAgdGhpcy5mYWlsdXJlUHJvcGVydHkgPSBmYWlsdXJlUHJvcGVydHk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogY29uZmlndXJlIGZyb20gYSB0ZXN0OyBzZXRzIG1lbWJlciB2YXJpYWJsZXMgdG8gYXR0cmlidXRlcyBvZiB0aGUgdGVzdAorICAgICAgICAgKiBAcGFyYW0gdGVzdAorICAgICAgICAgKi8KKyAgICAgICAgRm9ya2VkVGVzdENvbmZpZ3VyYXRpb24oSlVuaXRUZXN0IHRlc3QpIHsKKyAgICAgICAgICAgIHRoaXModGVzdC5nZXRGaWx0ZXJ0cmFjZSgpLAorICAgICAgICAgICAgICAgICAgICB0ZXN0LmdldEhhbHRvbmVycm9yKCksCisgICAgICAgICAgICAgICAgICAgIHRlc3QuZ2V0SGFsdG9uZmFpbHVyZSgpLAorICAgICAgICAgICAgICAgICAgICB0ZXN0LmdldEVycm9yUHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdC5nZXRGYWlsdXJlUHJvcGVydHkoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogZXF1YWxpdHkgdGVzdCBjaGVja3MgYWxsIHRoZSBtZW1iZXIgdmFyaWFibGVzCisgICAgICAgICAqIEBwYXJhbSBvdGhlcgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyBpcyBlcXVhbAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICAgICAgaWYgKG90aGVyID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBvdGhlci5nZXRDbGFzcygpICE9IEZvcmtlZFRlc3RDb25maWd1cmF0aW9uLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRm9ya2VkVGVzdENvbmZpZ3VyYXRpb24gbyA9IChGb3JrZWRUZXN0Q29uZmlndXJhdGlvbikgb3RoZXI7CisgICAgICAgICAgICByZXR1cm4gZmlsdGVyVHJhY2UgPT0gby5maWx0ZXJUcmFjZQorICAgICAgICAgICAgICAgICYmIGhhbHRPbkVycm9yID09IG8uaGFsdE9uRXJyb3IKKyAgICAgICAgICAgICAgICAmJiBoYWx0T25GYWlsdXJlID09IG8uaGFsdE9uRmFpbHVyZQorICAgICAgICAgICAgICAgICYmICgoZXJyb3JQcm9wZXJ0eSA9PSBudWxsICYmIG8uZXJyb3JQcm9wZXJ0eSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAoZXJyb3JQcm9wZXJ0eSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAmJiBlcnJvclByb3BlcnR5LmVxdWFscyhvLmVycm9yUHJvcGVydHkpKSkKKyAgICAgICAgICAgICAgICAmJiAoKGZhaWx1cmVQcm9wZXJ0eSA9PSBudWxsICYmIG8uZmFpbHVyZVByb3BlcnR5ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIChmYWlsdXJlUHJvcGVydHkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgJiYgZmFpbHVyZVByb3BlcnR5LmVxdWFscyhvLmZhaWx1cmVQcm9wZXJ0eSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBoYXNoY29kZSBpcyBiYXNlZCBvbmx5IG9uIHRoZSBib29sZWFuIG1lbWJlcnMsIGFuZCByZXR1cm5zIGEgdmFsdWUKKyAgICAgICAgICogaW4gdGhlIHJhbmdlIDAtNy4KKyAgICAgICAgICogQHJldHVybiBoYXNoIGNvZGUgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICAgICAgcmV0dXJuIChmaWx0ZXJUcmFjZSA/IDEgOiAwKQorICAgICAgICAgICAgICAgICsgKGhhbHRPbkVycm9yID8gMiA6IDApCisgICAgICAgICAgICAgICAgKyAoaGFsdE9uRmFpbHVyZSA/IDQgOiAwKTsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZXNlIGFyZSB0aGUgZGlmZmVyZW50IGZvcmtpbmcgb3B0aW9ucworICAgICAqIEBzaW5jZSAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRm9ya01vZGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogZm9yayBvbmNlIG9ubHkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9OQ0UgPSAib25jZSI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBmb3JrIG9uY2UgcGVyIHRlc3QgY2xhc3MKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUl9URVNUID0gInBlclRlc3QiOworICAgICAgICAvKioKKyAgICAgICAgICogZm9yayBvbmNlIHBlciBiYXRjaCBvZiB0ZXN0cworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSX0JBVENIID0gInBlckJhdGNoIjsKKworICAgICAgICAvKiogTm8gYXJnIGNvbnN0cnVjdG9yLiAqLworICAgICAgICBwdWJsaWMgRm9ya01vZGUoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIHVzaW5nIGEgdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gdXNlIC0gb25jZSwgcGVyVGVzdCBvciBwZXJCYXRjaC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGb3JrTW9kZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge09OQ0UsIFBFUl9URVNULCBQRVJfQkFUQ0h9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYWxsIHRlc3RzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBmb3JrZWQgKG9yIGFsbCB0ZXN0cworICAgICAqIGlmIHRoZSBydW5JbmRpdmlkdWFsIGFyZ3VtZW50IGlzIHRydWUuICBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZgorICAgICAqIGxpc3RzIG9mIHRlc3RzIHRoYXQgc2hhcmUgdGhlIHNhbWUgVk0gY29uZmlndXJhdGlvbiBhbmQgaGF2ZW4ndAorICAgICAqIGJlZW4gZXhlY3V0ZWQgeWV0LgorICAgICAqIEBwYXJhbSB0ZXN0TGlzdCB0aGUgbGlzdCBvZiB0ZXN0cyB0byBiZSBleGVjdXRlZCBvciBxdWV1ZWQuCisgICAgICogQHBhcmFtIHJ1bkluZGl2aWR1YWwgaWYgdHJ1ZSBleGVjdXRlIGVhY2ggdGVzdCBpbmRpdmlkdWFsbHkuCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MgdG8gYmUgZXhlY3V0ZWQuCisgICAgICogQHNpbmNlIDEuNi4yCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZXhlY3V0ZU9yUXVldWUoRW51bWVyYXRpb24gdGVzdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBydW5JbmRpdmlkdWFsKSB7CisgICAgICAgIE1hcCB0ZXN0Q29uZmlndXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB3aGlsZSAodGVzdExpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEpVbml0VGVzdCB0ZXN0ID0gKEpVbml0VGVzdCkgdGVzdExpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICh0ZXN0LnNob3VsZFJ1bihnZXRQcm9qZWN0KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJ1bkluZGl2aWR1YWwgfHwgIXRlc3QuZ2V0Rm9yaygpKSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUodGVzdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgRm9ya2VkVGVzdENvbmZpZ3VyYXRpb24gYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRm9ya2VkVGVzdENvbmZpZ3VyYXRpb24odGVzdCk7CisgICAgICAgICAgICAgICAgICAgIExpc3QgbCA9IChMaXN0KSB0ZXN0Q29uZmlndXJhdGlvbnMuZ2V0KGMpOworICAgICAgICAgICAgICAgICAgICBpZiAobCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGVzdENvbmZpZ3VyYXRpb25zLnB1dChjLCBsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsLmFkZCh0ZXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlc3RDb25maWd1cmF0aW9ucy52YWx1ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2dzIGluZm9ybWF0aW9uIGFib3V0IGZhaWxlZCB0ZXN0cywgcG90ZW50aWFsbHkgc3RvcHMKKyAgICAgKiBwcm9jZXNzaW5nIChieSB0aHJvd2luZyBhIEJ1aWxkRXhjZXB0aW9uKSBpZiBhIGZhaWx1cmUvZXJyb3IKKyAgICAgKiBvY2N1cnJlZCBvciBzZXRzIGEgcHJvcGVydHkuCisgICAgICogQHBhcmFtIGV4aXRWYWx1ZSB0aGUgZXhpdFZhbHVlIG9mIHRoZSB0ZXN0LgorICAgICAqIEBwYXJhbSB3YXNLaWxsZWQgaWYgdHJ1ZSwgdGhlIHRlc3QgaGFkIGJlZW4ga2lsbGVkLgorICAgICAqIEBwYXJhbSB0ZXN0ICAgICAgdGhlIHRlc3QgaW4gcXVlc3Rpb24uCisgICAgICogQHBhcmFtIG5hbWUgICAgICB0aGUgbmFtZSBvZiB0aGUgdGVzdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWN0T25UZXN0UmVzdWx0KGludCBleGl0VmFsdWUsIGJvb2xlYW4gd2FzS2lsbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKVW5pdFRlc3QgdGVzdCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgVGVzdFJlc3VsdEhvbGRlciB0ID0gbmV3IFRlc3RSZXN1bHRIb2xkZXIoKTsKKyAgICAgICAgdC5leGl0Q29kZSA9IGV4aXRWYWx1ZTsKKyAgICAgICAgdC50aW1lZE91dCA9IHdhc0tpbGxlZDsKKyAgICAgICAgYWN0T25UZXN0UmVzdWx0KHQsIHRlc3QsIG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZ3MgaW5mb3JtYXRpb24gYWJvdXQgZmFpbGVkIHRlc3RzLCBwb3RlbnRpYWxseSBzdG9wcworICAgICAqIHByb2Nlc3NpbmcgKGJ5IHRocm93aW5nIGEgQnVpbGRFeGNlcHRpb24pIGlmIGEgZmFpbHVyZS9lcnJvcgorICAgICAqIG9jY3VycmVkIG9yIHNldHMgYSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0ICAgIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHRlc3QgICAgICB0aGUgdGVzdCBpbiBxdWVzdGlvbi4KKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgIHRoZSBuYW1lIG9mIHRoZSB0ZXN0LgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWN0T25UZXN0UmVzdWx0KFRlc3RSZXN1bHRIb2xkZXIgcmVzdWx0LCBKVW5pdFRlc3QgdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IvZmFpbHVyZSBhbmQgdGhhdCBpdCBzaG91bGQgaGFsdCwgc3RvcAorICAgICAgICAvLyBldmVyeXRoaW5nIG90aGVyd2lzZSBqdXN0IGxvZyBhIHN0YXRlbWVudAorICAgICAgICBib29sZWFuIGZhdGFsID0gcmVzdWx0LnRpbWVkT3V0IHx8IHJlc3VsdC5jcmFzaGVkOworICAgICAgICBib29sZWFuIGVycm9yT2NjdXJyZWRIZXJlID0KKyAgICAgICAgICAgIHJlc3VsdC5leGl0Q29kZSA9PSBKVW5pdFRhc2tNaXJyb3IuSlVuaXRUZXN0UnVubmVyTWlycm9yLkVSUk9SUyB8fCBmYXRhbDsKKyAgICAgICAgYm9vbGVhbiBmYWlsdXJlT2NjdXJyZWRIZXJlID0KKyAgICAgICAgICAgIHJlc3VsdC5leGl0Q29kZSAhPSBKVW5pdFRhc2tNaXJyb3IuSlVuaXRUZXN0UnVubmVyTWlycm9yLlNVQ0NFU1MgfHwgZmF0YWw7CisgICAgICAgIGlmIChlcnJvck9jY3VycmVkSGVyZSB8fCBmYWlsdXJlT2NjdXJyZWRIZXJlKSB7CisgICAgICAgICAgICBpZiAoKGVycm9yT2NjdXJyZWRIZXJlICYmIHRlc3QuZ2V0SGFsdG9uZXJyb3IoKSkKKyAgICAgICAgICAgICAgICB8fCAoZmFpbHVyZU9jY3VycmVkSGVyZSAmJiB0ZXN0LmdldEhhbHRvbmZhaWx1cmUoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obmFtZSArICIgZmFpbGVkIgorICAgICAgICAgICAgICAgICAgICArIChyZXN1bHQudGltZWRPdXQgPyAiICh0aW1lb3V0KSIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAocmVzdWx0LmNyYXNoZWQgPyAiIChjcmFzaGVkKSIgOiAiIiksIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2cobmFtZSArICIgRkFJTEVEIgorICAgICAgICAgICAgICAgICAgICArIChyZXN1bHQudGltZWRPdXQgPyAiICh0aW1lb3V0KSIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAocmVzdWx0LmNyYXNoZWQgPyAiIChjcmFzaGVkKSIgOiAiIiksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yT2NjdXJyZWRIZXJlICYmIHRlc3QuZ2V0RXJyb3JQcm9wZXJ0eSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHRlc3QuZ2V0RXJyb3JQcm9wZXJ0eSgpLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZU9jY3VycmVkSGVyZSAmJiB0ZXN0LmdldEZhaWx1cmVQcm9wZXJ0eSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHRlc3QuZ2V0RmFpbHVyZVByb3BlcnR5KCksICJ0cnVlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB2YWx1ZSBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgYSB0ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBUZXN0UmVzdWx0SG9sZGVyIHsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAgICAgLyoqIHRoZSBleGl0IGNvZGUgb2YgdGhlIHRlc3QuICovCisgICAgICAgIHB1YmxpYyBpbnQgZXhpdENvZGUgPSBKVW5pdFRhc2tNaXJyb3IuSlVuaXRUZXN0UnVubmVyTWlycm9yLkVSUk9SUzsKKyAgICAgICAgLyoqIHRydWUgaWYgdGhlIHRlc3QgdGltZWQgb3V0ICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgIC8qKiB0cnVlIGlmIHRoZSB0ZXN0IGNyYXNoZWQgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gY3Jhc2hlZCA9IGZhbHNlOworICAgICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc3RyZWFtIGhhbmRsZXIgZm9yIGhhbmRsaW5nIHRoZSBqdW5pdCB0YXNrLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBKVW5pdExvZ091dHB1dFN0cmVhbSBleHRlbmRzIExvZ091dHB1dFN0cmVhbSB7CisgICAgICAgIHByaXZhdGUgVGFzayB0YXNrOyAvLyBsb2NhbCBjb3B5IHNpbmNlIExvZ091dHB1dFN0cmVhbS50YXNrIGlzIHByaXZhdGUKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrIGJlaW5nIGxvZ2dlZC4KKyAgICAgICAgICogQHBhcmFtIGxldmVsIHRoZSBsb2cgbGV2ZWwgdXNlZCB0byBsb2cgZGF0YSB3cml0dGVuIHRvIHRoaXMgc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEpVbml0TG9nT3V0cHV0U3RyZWFtKFRhc2sgdGFzaywgaW50IGxldmVsKSB7CisgICAgICAgICAgICBzdXBlcih0YXNrLCBsZXZlbCk7CisgICAgICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvZ3MgYSBsaW5lLgorICAgICAgICAgKiBJZiB0aGUgbGluZSBzdGFydHMgd2l0aCBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyOiBzZXQgdGhlIGxldmVsCisgICAgICAgICAqIHRvIE1TR19WRVJCT1NFLgorICAgICAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBsb2cuCisgICAgICAgICAqIEBwYXJhbSBsZXZlbCB0aGUgbG9nZ2luZyBsZXZlbCB0byB1c2UuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGluZShTdHJpbmcgbGluZSwgaW50IGxldmVsKSB7CisgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKFRFU1RMSVNURU5FUl9QUkVGSVgpKSB7CisgICAgICAgICAgICAgICAgdGFzay5sb2cobGluZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1cGVyLnByb2Nlc3NMaW5lKGxpbmUsIGxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbG9nIHN0cmVhbSBoYW5kbGVyIGZvciBqdW5pdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSlVuaXRMb2dTdHJlYW1IYW5kbGVyIGV4dGVuZHMgUHVtcFN0cmVhbUhhbmRsZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrIHRvIGxvZy4KKyAgICAgICAgICogQHBhcmFtIG91dGxldmVsIHRoZSBsZXZlbCB0byB1c2UgZm9yIHN0YW5kYXJkIG91dHB1dC4KKyAgICAgICAgICogQHBhcmFtIGVycmxldmVsIHRoZSBsZXZlbCB0byB1c2UgZm9yIGVycm9yIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBKVW5pdExvZ1N0cmVhbUhhbmRsZXIoVGFzayB0YXNrLCBpbnQgb3V0bGV2ZWwsIGludCBlcnJsZXZlbCkgeworICAgICAgICAgICAgc3VwZXIobmV3IEpVbml0TG9nT3V0cHV0U3RyZWFtKHRhc2ssIG91dGxldmVsKSwKKyAgICAgICAgICAgICAgICAgIG5ldyBMb2dPdXRwdXRTdHJlYW0odGFzaywgZXJybGV2ZWwpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza01pcnJvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrTWlycm9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmYjA5ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza01pcnJvci5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBlcm1pc3Npb25zOworCisvKioKKyAqIEhhbmRsZXMgdGhlIHBvcnRpb25zIG9mIHtAbGluayBKVW5pdFRhc2t9IHdoaWNoIG5lZWQgdG8gZGlyZWN0bHkgYWNjZXNzCisgKiBhY3R1YWwgSlVuaXQgY2xhc3Nlcywgc28gdGhhdCBqdW5pdC5qYXIgbmVlZCBub3QgYmUgb24gQW50J3Mgc3RhcnR1cCBjbGFzc3BhdGguCisgKiBOZWl0aGVyIEpVbml0VGFzay5qYXZhIG5vciBKVW5pdFRhc2tNaXJyb3IuamF2YSBub3IgdGhlaXIgdHJhbnNpdGl2ZSBzdGF0aWMKKyAqIGRlcHMgbWF5IGltcG9ydCBhbnkganVuaXQuKiogY2xhc3NlcyEKKyAqIFNwZWNpZmljYWxseSwgbmVlZCB0byBub3QgcmVmZXIgdG8KKyAqIC0gSlVuaXRSZXN1bHRGb3JtYXR0ZXIgb3IgaXRzIHN1YmNsYXNzZXMKKyAqIC0gSlVuaXRWZXJzaW9uSGVscGVyCisgKiAtIEpVbml0VGVzdFJ1bm5lcgorICogQ2YuICBKVW5pdFRhc2suU3BsaXRMb2FkZXIjaXNTcGxpdChTdHJpbmcpCisgKiBQdWJsaWMgb25seSB0byBwZXJtaXQgYWNjZXNzIGZyb20gY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2U7IGRvIG5vdCB1c2UgZGlyZWN0bHkuCisgKgorICogQHNpbmNlIDEuNworICogQHNlZSAiYnVnICMzODc5OSIKKyAqLworcHVibGljIGludGVyZmFjZSBKVW5pdFRhc2tNaXJyb3IgeworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBmb3JtYXR0ZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGp2bSBleGl0cyBiZWZvcmUKKyAgICAgKiB0aGUgdGVzdCBzdWl0ZSBmaW5pc2hzLgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0LgorICAgICAqIEBwYXJhbSBmb3JtYXR0ZXIgdGhlIGZvbWF0dGVyIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXQgc3RyZWFtIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byB3cml0ZSBvdXQuCisgICAgICogQHBhcmFtIHRlc3RDYXNlIHRoZSBuYW1lIG9mIHRoZSB0ZXN0LgorICAgICAqLworICAgIHZvaWQgYWRkVm1FeGl0KEpVbml0VGVzdCB0ZXN0LCBKVW5pdFJlc3VsdEZvcm1hdHRlck1pcnJvciBmb3JtYXR0ZXIsCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHRlc3RDYXNlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB0ZXN0IHJ1bm5lciBmb3IgYSB0ZXN0LgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0IHRvIHJ1bi4KKyAgICAgKiBAcGFyYW0gaGFsdE9uRXJyb3IgaWYgdHJ1ZSBoYWx0IHRoZSB0ZXN0cyBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICogQHBhcmFtIGZpbHRlclRyYWNlIGlmIHRydWUgZmlsdGVyIHRoZSBzdGFjayB0cmFjZXMuCisgICAgICogQHBhcmFtIGhhbHRPbkZhaWx1cmUgaWYgdHJ1ZSBoYWx0IHRoZSB0ZXN0IGlmIGEgZmFpbHVyZSBvY2N1cnMuCisgICAgICogQHBhcmFtIHNob3dPdXRwdXQgICAgaWYgdHJ1ZSBzaG93IG91dHB1dC4KKyAgICAgKiBAcGFyYW0gbG9nVGVzdExpc3RlbmVyRXZlbnRzIGlmIHRydWUgbG9nIHRlc3QgbGlzdGVuZXIgZXZlbnRzLgorICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciAgICAgIHRoZSBjbGFzc2xvYWRlciB0byB1c2UgdG8gY3JlYXRlIHRoZSBydW5uZXIuCisgICAgICogQHJldHVybiB0aGUgdGVzdCBydW5uZXIuCisgICAgICovCisgICAgSlVuaXRUZXN0UnVubmVyTWlycm9yIG5ld0pVbml0VGVzdFJ1bm5lcihKVW5pdFRlc3QgdGVzdCwgYm9vbGVhbiBoYWx0T25FcnJvciwKKyAgICAgICAgICAgIGJvb2xlYW4gZmlsdGVyVHJhY2UsIGJvb2xlYW4gaGFsdE9uRmFpbHVyZSwgYm9vbGVhbiBzaG93T3V0cHV0LAorICAgICAgICAgICAgYm9vbGVhbiBsb2dUZXN0TGlzdGVuZXJFdmVudHMsIEFudENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN1bW1hcnkgcmVzdWx0IGZvcm1hdHRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGZvcm1hdHRlci4KKyAgICAgKi8KKyAgICBTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgbmV3U3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyKCk7CisKKworICAgIC8qKiBUaGUgaW50ZXJmYWNlIHRoYXQgSlVuaXRSZXN1bHRGb3JtYXR0ZXIgZXh0ZW5kcy4gKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEpVbml0UmVzdWx0Rm9ybWF0dGVyTWlycm9yIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgICogQHBhcmFtIG91dHB1dFN0cmVhbSB0aGUgc3RyZWFtIHRvIHVzZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pOworICAgIH0KKworICAgIC8qKiBUaGUgaW50ZXJmYWNlIHRoYXQgU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyIGV4dGVuZHMuICovCisgICAgcHVibGljIGludGVyZmFjZSBTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IKKyAgICAgICAgZXh0ZW5kcyBKVW5pdFJlc3VsdEZvcm1hdHRlck1pcnJvciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB3aGVyZSBzdGFuZGFyZCBvdXQgYW5kIHN0YW5kYXJkIGVycm9yIHNob3VsZCBiZSBpbmNsdWRlZC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIGlmIHRydWUgaW5jbHVkZSB0aGUgb3V0cHV0cyBpbiB0aGUgc3VtbWFyeS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0V2l0aE91dEFuZEVycihib29sZWFuIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiogSW50ZXJmYWNlIHRoYXQgdGVzdCBydW5uZXJzIGltcGxlbWVudC4gKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEpVbml0VGVzdFJ1bm5lck1pcnJvciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgaW4gZm9ybWF0dGVyIGFyZ3VtZW50cyBhcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgYmFzZW5hbWUKKyAgICAgICAgICogb2YgdGhlIG91dHB1dCBmaWxlICh3aGljaCBnZXRzIHJlcGxhY2VkIGJ5IGEgdGVzdCBzcGVjaWZpYworICAgICAgICAgKiBvdXRwdXQgZmlsZSBuYW1lIGxhdGVyKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIElHTk9SRURfRklMRV9OQU1FID0gIklHTk9SRVRISVMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBObyBwcm9ibGVtcyB3aXRoIHRoaXMgdGVzdC4KKyAgICAgICAgICovCisgICAgICAgIGludCBTVUNDRVNTID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU29tZSB0ZXN0cyBmYWlsZWQuCisgICAgICAgICAqLworICAgICAgICBpbnQgRkFJTFVSRVMgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBlcnJvciBvY2N1cnJlZC4KKyAgICAgICAgICovCisgICAgICAgIGludCBFUlJPUlMgPSAyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJtaXNzaW9ucyBmb3IgdGhlIHRlc3QgcnVuLgorICAgICAgICAgKiBAcGFyYW0gcGVybSB0aGUgcGVybWlzc2lvbnMgdG8gdXNlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRQZXJtaXNzaW9ucyhQZXJtaXNzaW9ucyBwZXJtKTsKKworICAgICAgICAvKiogUnVuIHRoZSB0ZXN0LiAqLworICAgICAgICB2b2lkIHJ1bigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBmb3JtYXR0ZXIgdG8gdGhlIHRlc3QuCisgICAgICAgICAqIEBwYXJhbSBmb3JtYXR0ZXIgdGhlIGZvcm1hdHRlciB0byB1c2UuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGFkZEZvcm1hdHRlcihKVW5pdFJlc3VsdEZvcm1hdHRlck1pcnJvciBmb3JtYXR0ZXIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoYXQgU3lzdGVtLmV4aXQoKSB3b3VsZCByZXR1cm4gaW4gdGhlIHN0YW5kYWxvbmUgdmVyc2lvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiAyIGlmIGVycm9ycyBvY2N1cnJlZCwgMSBpZiB0ZXN0cyBmYWlsZWQgZWxzZSAwLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGdldFJldENvZGUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIG91dHB1dCBzZW50IHRvIFN5c3RlbS5lcnIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXQgY29taW5nIGZyb20gU3lzdGVtLmVycgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBoYW5kbGVFcnJvckZsdXNoKFN0cmluZyBvdXRwdXQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgb3V0cHV0IHNlbnQgdG8gU3lzdGVtLmVyci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG91dHB1dCBvdXRwdXQgZm9yIFN5c3RlbS5lcnIKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgaGFuZGxlRXJyb3JPdXRwdXQoU3RyaW5nIG91dHB1dCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSBvdXRwdXQgc2VudCB0byBTeXN0ZW0ub3V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0IG91dHB1dCBmb3IgU3lzdGVtLm91dC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBvdXRwdXQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgYW4gaW5wdXQgcmVxdWVzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIGludG8gd2hpY2ggZGF0YSBpcyB0byBiZSByZWFkLgorICAgICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGF0IHdoaWNoIGRhdGEgaXMgc3RvcmVkLgorICAgICAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBhbW91bnQgb2YgZGF0YSB0byByZWFkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgZGF0YSBjYW5ub3QgYmUgcmVhZC4KKyAgICAgICAgICovCisgICAgICAgIGludCBoYW5kbGVJbnB1dChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSBvdXRwdXQgc2VudCB0byBTeXN0ZW0ub3V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0IG91dHB1dCBmb3IgU3lzdGVtLm91dC4KKyAgICAgICAgICovCisgICAgICAgdm9pZCBoYW5kbGVGbHVzaChTdHJpbmcgb3V0cHV0KTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza01pcnJvckltcGwuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza01pcnJvckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU3MjhiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrTWlycm9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwYXJ0IG9mIHRoZSBqdW5pdCB0YXNrIHdoaWNoIGNhbiBkaXJlY3RseSByZWZlciB0byBqdW5pdC4qIGNsYXNzZXMuCisgKiBQdWJsaWMgb25seSB0byBwZXJtaXQgdXNlIG9mIHJlZmxlY3Rpb247IGRvIG5vdCB1c2UgZGlyZWN0bHkuCisgKiBAc2VlIEpVbml0VGFza01pcnJvcgorICogQHNlZSAiYnVnICMzODc5OSIKKyAqIEBzaW5jZSAxLjcKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpVbml0VGFza01pcnJvckltcGwgaW1wbGVtZW50cyBKVW5pdFRhc2tNaXJyb3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBKVW5pdFRhc2sgdGFzazsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqIEBwYXJhbSB0YXNrIHRoZSBqdW5pdHRhc2sgdGhhdCB1c2VzIHRoaXMgbWlycm9yLgorICAgICAqLworICAgIHB1YmxpYyBKVW5pdFRhc2tNaXJyb3JJbXBsKEpVbml0VGFzayB0YXNrKSB7CisgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgYWRkVm1FeGl0KEpVbml0VGVzdCB0ZXN0LCBKVW5pdFRhc2tNaXJyb3IuSlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgYUZvcm1hdHRlciwKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgdGVzdENhc2UpIHsKKyAgICAgICAgSlVuaXRSZXN1bHRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKEpVbml0UmVzdWx0Rm9ybWF0dGVyKSBhRm9ybWF0dGVyOworICAgICAgICBmb3JtYXR0ZXIuc2V0T3V0cHV0KG91dCk7CisgICAgICAgIGZvcm1hdHRlci5zdGFydFRlc3RTdWl0ZSh0ZXN0KTsKKyAgICAgICAgLy90aGUgdHJpY2sgdG8gaW50ZWdyYXRpbmcgdGVzdCBvdXRwdXQgdG8gdGhlIGZvcm1hdHRlciwgaXMgdG8KKyAgICAgICAgLy9jcmVhdGUgYSBzcGVjaWFsIHRlc3QgY2xhc3MgdGhhdCBhc3NlcnRzIGFuIGVycm9yCisgICAgICAgIC8vYW5kIHRlbGwgdGhlIGZvcm1hdHRlciB0aGF0IGl0IHJhaXNlZC4KKyAgICAgICAgVGVzdENhc2UgdCA9IG5ldyBWbUV4aXRFcnJvclRlc3QobWVzc2FnZSwgdGVzdCwgdGVzdENhc2UpOworICAgICAgICBmb3JtYXR0ZXIuc3RhcnRUZXN0KHQpOworICAgICAgICBmb3JtYXR0ZXIuYWRkRXJyb3IodCwgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKG1lc3NhZ2UpKTsKKyAgICAgICAgZm9ybWF0dGVyLmVuZFRlc3RTdWl0ZSh0ZXN0KTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgSlVuaXRUYXNrTWlycm9yLkpVbml0VGVzdFJ1bm5lck1pcnJvciBuZXdKVW5pdFRlc3RSdW5uZXIoSlVuaXRUZXN0IHRlc3QsCisgICAgICAgICAgICBib29sZWFuIGhhbHRPbkVycm9yLCBib29sZWFuIGZpbHRlclRyYWNlLCBib29sZWFuIGhhbHRPbkZhaWx1cmUsCisgICAgICAgICAgICBib29sZWFuIHNob3dPdXRwdXQsIGJvb2xlYW4gbG9nVGVzdExpc3RlbmVyRXZlbnRzLCBBbnRDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICByZXR1cm4gbmV3IEpVbml0VGVzdFJ1bm5lcih0ZXN0LCBoYWx0T25FcnJvciwgZmlsdGVyVHJhY2UsIGhhbHRPbkZhaWx1cmUsCisgICAgICAgICAgICAgICAgc2hvd091dHB1dCwgbG9nVGVzdExpc3RlbmVyRXZlbnRzLCBjbGFzc0xvYWRlcik7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIEpVbml0VGFza01pcnJvci5TdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgbmV3U3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IFN1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlcigpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBWbUV4aXRFcnJvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgcHJpdmF0ZSBKVW5pdFRlc3QgdGVzdDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGVzdENhc2U7CisKKyAgICAgICAgVm1FeGl0RXJyb3JUZXN0KFN0cmluZyBhTWVzc2FnZSwgSlVuaXRUZXN0IGFuT3JpZ2luYWxUZXN0LCBTdHJpbmcgYVRlc3RDYXNlKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gYU1lc3NhZ2U7CisgICAgICAgICAgICB0ZXN0ID0gYW5PcmlnaW5hbFRlc3Q7CisgICAgICAgICAgICB0ZXN0Q2FzZSA9IGFUZXN0Q2FzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY291bnRUZXN0Q2FzZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcihtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXN0Q2FzZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGVzdC5nZXROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHRlc3QuZ2V0TmFtZSgpICsgIjoiICsgdGVzdENhc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3QuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzY2FjNTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3QuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIDxwPiBSdW4gYSBzaW5nbGUgSlVuaXQgdGVzdC4KKyAqCisgKiA8cD4gVGhlIEpVbml0IHRlc3QgaXMgYWN0dWFsbHkgcnVuIGJ5IHtAbGluayBKVW5pdFRlc3RSdW5uZXJ9LgorICogU28gcmVhZCB0aGUgZG9jIGNvbW1lbnRzIGZvciB0aGF0IGNsYXNzIDopCisgKgorICogQHNpbmNlIEFudCAxLjIKKyAqCisgKiBAc2VlIEpVbml0VGFzaworICogQHNlZSBKVW5pdFRlc3RSdW5uZXIKKyAqLworcHVibGljIGNsYXNzIEpVbml0VGVzdCBleHRlbmRzIEJhc2VUZXN0IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICAvKiogdGhlIG5hbWUgb2YgdGhlIHJlc3VsdCBmaWxlICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb3V0ZmlsZSA9IG51bGw7CisKKyAgICAvLyBAdG9kbyB0aGlzIGlzIGR1cGxpY2F0aW5nIFRlc3RSZXN1bHQgaW5mb3JtYXRpb24uIE9ubHkgdGhlIHRpbWUgaXMgbm90CisgICAgLy8gcGFydCBvZiB0aGUgcmVzdWx0LiBTbyB3ZSdkIGJldHRlciBkZXJpdmUgYSBuZXcgY2xhc3MgZnJvbSBUZXN0UmVzdWx0CisgICAgLy8gYW5kIGRlYWwgd2l0aCBpdC4gKFNCKQorICAgIHByaXZhdGUgbG9uZyBydW5zLCBmYWlsdXJlcywgZXJyb3JzOworICAgIHByaXZhdGUgbG9uZyBydW5UaW1lOworCisgICAgLy8gU25hcHNob3Qgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzID0gbnVsbDsKKworICAgIC8qKiBObyBhcmcgY29uc3RydWN0b3IuICovCisgICAgcHVibGljIEpVbml0VGVzdCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIG5hbWUuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHRlc3QuCisgICAgICovCisgICAgcHVibGljIEpVbml0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIG9wdGlvbnMuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIGhhbHRPbkVycm9yIGlmIHRydWUgaGFsdCB0aGUgdGVzdHMgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICogQHBhcmFtIGhhbHRPbkZhaWx1cmUgaWYgdHJ1ZSBoYWx0IHRoZSB0ZXN0cyBpZiB0aGVyZSBpcyBhIGZhaWx1cmUuCisgICAgICogQHBhcmFtIGZpbHRlcnRyYWNlIGlmIHRydWUgZmlsdGVyIHN0YWNrIHRyYWNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSlVuaXRUZXN0KFN0cmluZyBuYW1lLCBib29sZWFuIGhhbHRPbkVycm9yLCBib29sZWFuIGhhbHRPbkZhaWx1cmUsCisgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZpbHRlcnRyYWNlKSB7CisgICAgICAgIHRoaXMubmFtZSAgPSBuYW1lOworICAgICAgICB0aGlzLmhhbHRPbkVycm9yID0gaGFsdE9uRXJyb3I7CisgICAgICAgIHRoaXMuaGFsdE9uRmFpbCA9IGhhbHRPbkZhaWx1cmU7CisgICAgICAgIHRoaXMuZmlsdGVydHJhY2UgPSBmaWx0ZXJ0cmFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2xhc3MuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuYW1lIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBuYW1lID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRmaWxlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBvdXRmaWxlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNsYXNzLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE91dGZpbGUoKSB7CisgICAgICAgIHJldHVybiBvdXRmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIHJ1bnMsIGZhaWx1cmVzIGFuZCBlcnJvcnMuCisgICAgICogQHBhcmFtIHJ1bnMgICAgIHRoZSBudW1iZXIgb2YgcnVucy4KKyAgICAgKiBAcGFyYW0gZmFpbHVyZXMgdGhlIG51bWJlciBvZiBmYWlsdXJlcy4KKyAgICAgKiBAcGFyYW0gZXJyb3JzICAgdGhlIG51bWJlciBvZiBlcnJvcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q291bnRzKGxvbmcgcnVucywgbG9uZyBmYWlsdXJlcywgbG9uZyBlcnJvcnMpIHsKKyAgICAgICAgdGhpcy5ydW5zID0gcnVuczsKKyAgICAgICAgdGhpcy5mYWlsdXJlcyA9IGZhaWx1cmVzOworICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJ1bnRpbWUuCisgICAgICogQHBhcmFtIHJ1blRpbWUgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJ1blRpbWUobG9uZyBydW5UaW1lKSB7CisgICAgICAgIHRoaXMucnVuVGltZSA9IHJ1blRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgcnVucy4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcnVucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBydW5Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHJ1bnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgZmFpbHVyZXMuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGZhaWx1cmVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGZhaWx1cmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGVycm9ycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZXJyb3JzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGVycm9yQ291bnQoKSB7CisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBydW4gdGltZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBydW4gdGltZSBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UnVuVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHJ1blRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlc3QuCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gcHJvcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgaW4gdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHAgdGhlIHByb3BlcnRpZXMuCisgICAgICogICAgICAgICAgVGhpcyBpcyBhIGNvcHkgb2YgdGhlIHByb2plY3RzIGFudCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoSGFzaHRhYmxlIHApIHsKKyAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBwLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBwcm9wcy5wdXQoa2V5LCBwLmdldChrZXkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoaXMgdGVzdCBzaG91bGQgcnVuIGJhc2VkIG9uIHRoZSBpZiBhbmQgdW5sZXNzCisgICAgICogYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdCB0byB1c2UgdG8gY2hlY2sgaWYgdGhlIGlmIGFuZCB1bmxlc3MKKyAgICAgKiAgICAgICAgICBwcm9wZXJ0aWVzIGV4aXN0IGluLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHRlc3Qgb3IgdGVzdHN1aXRlIHNob3VsZCBiZSBydW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkUnVuKFByb2plY3QgcCkgeworICAgICAgICBpZiAoaWZQcm9wZXJ0eSAhPSBudWxsICYmIHAuZ2V0UHJvcGVydHkoaWZQcm9wZXJ0eSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHVubGVzc1Byb3BlcnR5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgcC5nZXRQcm9wZXJ0eSh1bmxlc3NQcm9wZXJ0eSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmb3JtYXR0ZXJzIHNldCBmb3IgdGhpcyB0ZXN0LgorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlcnMgYXMgYW4gYXJyYXkuCisgICAgICovCisgICAgcHVibGljIEZvcm1hdHRlckVsZW1lbnRbXSBnZXRGb3JtYXR0ZXJzKCkgeworICAgICAgICBGb3JtYXR0ZXJFbGVtZW50W10gZmVzID0gbmV3IEZvcm1hdHRlckVsZW1lbnRbZm9ybWF0dGVycy5zaXplKCldOworICAgICAgICBmb3JtYXR0ZXJzLmNvcHlJbnRvKGZlcyk7CisgICAgICAgIHJldHVybiBmZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVudCBtZXRob2QgdG8gYWRkIGZvcm1hdHRlcnMgdG8gYSB2ZWN0b3IKKyAgICAgKi8KKyAgICB2b2lkIGFkZEZvcm1hdHRlcnNUbyhWZWN0b3IgdikgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBmb3JtYXR0ZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoZm9ybWF0dGVycy5lbGVtZW50QXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKiBAcmV0dXJuIGEgY2xvbmUgb2YgdGhpcyB0ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKVW5pdFRlc3QgdCA9IChKVW5pdFRlc3QpIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICB0LnByb3BzID0gcHJvcHMgPT0gbnVsbCA/IG51bGwgOiAoUHJvcGVydGllcykgcHJvcHMuY2xvbmUoKTsKKyAgICAgICAgICAgIHQuZm9ybWF0dGVycyA9IChWZWN0b3IpIGZvcm1hdHRlcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBwbGFpbiBpbXBvc3NpYmxlCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdFJ1bm5lci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5YmI1MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsMTAzNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QZXJtaXNzaW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuVGVlT3V0cHV0U3RyZWFtOworCisvKioKKyAqIFNpbXBsZSBUZXN0cnVubmVyIGZvciBKVW5pdCB0aGF0IHJ1bnMgYWxsIHRlc3RzIG9mIGEgdGVzdHN1aXRlLgorICoKKyAqIDxwPlRoaXMgVGVzdFJ1bm5lciBleHBlY3RzIGEgbmFtZSBvZiBhIFRlc3RDYXNlIGNsYXNzIGFzIGl0cworICogYXJndW1lbnQuIElmIHRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzdGF0aWMgc3VpdGUoKSBtZXRob2QgaXQgd2lsbCBiZQorICogY2FsbGVkIGFuZCB0aGUgcmVzdWx0aW5nIFRlc3Qgd2lsbCBiZSBydW4uIFNvLCB0aGUgc2lnbmF0dXJlIHNob3VsZCBiZQorICogPHByZT48Y29kZT4KKyAqICAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkKKyAqIDwvY29kZT48L3ByZT4KKyAqCisgKiA8cD4gSWYgbm8gc3VjaCBtZXRob2QgZXhpc3RzLCBhbGwgcHVibGljIG1ldGhvZHMgc3RhcnRpbmcgd2l0aAorICogInRlc3QiIGFuZCB0YWtpbmcgbm8gYXJndW1lbnQgd2lsbCBiZSBydW4uCisgKgorICogPHA+IFN1bW1hcnkgb3V0cHV0IGlzIGdlbmVyYXRlZCBhdCB0aGUgZW5kLgorICoKKyAqIEBzaW5jZSBBbnQgMS4yCisgKi8KKworcHVibGljIGNsYXNzIEpVbml0VGVzdFJ1bm5lciBpbXBsZW1lbnRzIFRlc3RMaXN0ZW5lciwgSlVuaXRUYXNrTWlycm9yLkpVbml0VGVzdFJ1bm5lck1pcnJvciB7CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyB0aGUgcmVnaXN0ZXJlZCBmb3JtYXR0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIGZvcm1hdHRlcnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0cyBUZXN0UmVzdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRlc3RSZXN1bHQgcmVzOworCisgICAgLyoqCisgICAgICogRG8gd2UgZmlsdGVyIGp1bml0LiouKiBzdGFjayBmcmFtZXMgb3V0IG9mIGZhaWx1cmUgYW5kIGVycm9yIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaWx0ZXJ0cmFjZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBEbyB3ZSBzZW5kIG91dHB1dCB0byBTeXN0ZW0ub3V0Ly5lcnIgaW4gYWRkaXRpb24gdG8gdGhlIGZvcm1hdHRlcnM/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3dPdXRwdXQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBvdXRwdXRUb0Zvcm1hdHRlcnMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVGhlIHBlcm1pc3Npb25zIHNldCBmb3IgdGhlIHRlc3QgdG8gcnVuLgorICAgICAqLworICAgIHByaXZhdGUgUGVybWlzc2lvbnMgcGVybSA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1RSQUNFX0ZJTFRFUlMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICJqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UiLAorICAgICAgICAgICAgICAgICJqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCIsCisgICAgICAgICAgICAgICAgImp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUiLAorICAgICAgICAgICAgICAgICJqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LiIsIC8vIGRvbid0IGZpbHRlciBBc3NlcnRpb25GYWlsdXJlCisgICAgICAgICAgICAgICAgImp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lciIsCisgICAgICAgICAgICAgICAgImp1bml0LmF3dHVpLlRlc3RSdW5uZXIiLAorICAgICAgICAgICAgICAgICJqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lciIsCisgICAgICAgICAgICAgICAgImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoIiwKKyAgICAgICAgICAgICAgICAic3VuLnJlZmxlY3QuIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQuIiwKKyAgICAgICAgICAgICAgICAvLyBKVW5pdCA0IHN1cHBvcnQ6CisgICAgICAgICAgICAgICAgIm9yZy5qdW5pdC4iLAorICAgICAgICAgICAgICAgICJqdW5pdC5mcmFtZXdvcmsuSlVuaXQ0VGVzdEFkYXB0ZXIiLAorICAgICAgICAgICAgICAgIC8vIFNlZSB3cmFwTGlzdGVuZXIgZm9yIHJlYXNvbjoKKyAgICAgICAgICAgICAgICAiQ2F1c2VkIGJ5OiBqYXZhLmxhbmcuQXNzZXJ0aW9uRXJyb3IiLAorICAgICAgICAgICAgICAgICIgbW9yZSIsCisgICAgICAgIH07CisKKworICAgIC8qKgorICAgICAqIERvIHdlIHN0b3Agb24gZXJyb3JzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoYWx0T25FcnJvciA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRG8gd2Ugc3RvcCBvbiB0ZXN0IGZhaWx1cmVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoYWx0T25GYWlsdXJlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5jb2RlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmV0Q29kZSA9IFNVQ0NFU1M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVGVzdFN1aXRlIHdlIGFyZSBjdXJyZW50bHkgcnVubmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpVbml0VGVzdCBqdW5pdFRlc3Q7CisKKyAgICAvKiogb3V0cHV0IHdyaXR0ZW4gZHVyaW5nIHRoZSB0ZXN0ICovCisgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBzeXN0ZW1FcnJvcjsKKworICAgIC8qKiBFcnJvciBvdXRwdXQgZHVyaW5nIHRoZSB0ZXN0ICovCisgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBzeXN0ZW1PdXQ7CisKKyAgICAvKiogaXMgdGhpcyBydW5uZXIgcnVubmluZyBpbiBmb3JrZWQgbW9kZT8gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZm9ya2VkID0gZmFsc2U7CisKKyAgICAvKiogUnVubmluZyBtb3JlIHRoYW4gb25lIHRlc3Qgc3VpdGU/ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtdWx0aXBsZVRlc3RzID0gZmFsc2U7CisKKyAgICAvKiogQ2xhc3NMb2FkZXIgcGFzc2VkIGluIGluIG5vbi1mb3JrZWQgbW9kZS4gKi8KKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGxvYWRlcjsKKworICAgIC8qKiBEbyB3ZSBwcmludCBUZXN0TGlzdGVuZXIgZXZlbnRzPyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBsb2dUZXN0TGlzdGVuZXJFdmVudHMgPSBmYWxzZTsKKworICAgIC8qKiBUdXJuZWQgb24gaWYgd2UgYXJlIHVzaW5nIEpVbml0IDQgZm9yIHRoaXMgdGVzdCBzdWl0ZS4gc2VlICMzODgxMSAqLworICAgIHByaXZhdGUgYm9vbGVhbiBqdW5pdDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1aWxkIGNyYXNoZWQuCisgICAgICogRmlsZSB3aWxsIGJlIGVtcHR5IGluIGNhc2UgdGhlIGJ1aWxkIGRpZCBub3QgY3Jhc2guCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyYXNoRmlsZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgZm9yaz10cnVlIG9yIHdoZW4gdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCBhCisgICAgICogY2xhc3NwYXRoLgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0IHRvIHJ1bi4KKyAgICAgKiBAcGFyYW0gaGFsdE9uRXJyb3Igd2hldGhlciB0byBzdG9wIHRoZSBydW4gaWYgYW4gZXJyb3IgaXMgZm91bmQuCisgICAgICogQHBhcmFtIGZpbHRlcnRyYWNlIHdoZXRoZXIgdG8gZmlsdGVyIGp1bml0LiouKiBzdGFjayBmcmFtZXMgb3V0IG9mIGV4Y2VwdGlvbnMKKyAgICAgKiBAcGFyYW0gaGFsdE9uRmFpbHVyZSB3aGV0aGVyIHRvIHN0b3AgdGhlIHJ1biBpZiBmYWlsdXJlIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBKVW5pdFRlc3RSdW5uZXIoSlVuaXRUZXN0IHRlc3QsIGJvb2xlYW4gaGFsdE9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZpbHRlcnRyYWNlLCBib29sZWFuIGhhbHRPbkZhaWx1cmUpIHsKKyAgICAgICAgdGhpcyh0ZXN0LCBoYWx0T25FcnJvciwgZmlsdGVydHJhY2UsIGhhbHRPbkZhaWx1cmUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgZm9yaz10cnVlIG9yIHdoZW4gdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCBhCisgICAgICogY2xhc3NwYXRoLgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0IHRvIHJ1bi4KKyAgICAgKiBAcGFyYW0gaGFsdE9uRXJyb3Igd2hldGhlciB0byBzdG9wIHRoZSBydW4gaWYgYW4gZXJyb3IgaXMgZm91bmQuCisgICAgICogQHBhcmFtIGZpbHRlcnRyYWNlIHdoZXRoZXIgdG8gZmlsdGVyIGp1bml0LiouKiBzdGFjayBmcmFtZXMgb3V0IG9mIGV4Y2VwdGlvbnMKKyAgICAgKiBAcGFyYW0gaGFsdE9uRmFpbHVyZSB3aGV0aGVyIHRvIHN0b3AgdGhlIHJ1biBpZiBmYWlsdXJlIGlzIGZvdW5kLgorICAgICAqIEBwYXJhbSBzaG93T3V0cHV0ICAgIHdoZXRoZXIgdG8gc2VuZCBvdXRwdXQgdG8gU3lzdGVtLm91dC8uZXJyIGFzIHdlbGwgYXMgZm9ybWF0dGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSlVuaXRUZXN0UnVubmVyKEpVbml0VGVzdCB0ZXN0LCBib29sZWFuIGhhbHRPbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaWx0ZXJ0cmFjZSwgYm9vbGVhbiBoYWx0T25GYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaG93T3V0cHV0KSB7CisgICAgICAgIHRoaXModGVzdCwgaGFsdE9uRXJyb3IsIGZpbHRlcnRyYWNlLCBoYWx0T25GYWlsdXJlLCBzaG93T3V0cHV0LCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIGZvcms9dHJ1ZSBvciB3aGVuIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgYQorICAgICAqIGNsYXNzcGF0aC4KKyAgICAgKiBAcGFyYW0gdGVzdCB0aGUgdGVzdCB0byBydW4uCisgICAgICogQHBhcmFtIGhhbHRPbkVycm9yIHdoZXRoZXIgdG8gc3RvcCB0aGUgcnVuIGlmIGFuIGVycm9yIGlzIGZvdW5kLgorICAgICAqIEBwYXJhbSBmaWx0ZXJ0cmFjZSB3aGV0aGVyIHRvIGZpbHRlciBqdW5pdC4qLiogc3RhY2sgZnJhbWVzIG91dCBvZiBleGNlcHRpb25zCisgICAgICogQHBhcmFtIGhhbHRPbkZhaWx1cmUgd2hldGhlciB0byBzdG9wIHRoZSBydW4gaWYgZmFpbHVyZSBpcyBmb3VuZC4KKyAgICAgKiBAcGFyYW0gc2hvd091dHB1dCAgICB3aGV0aGVyIHRvIHNlbmQgb3V0cHV0IHRvIFN5c3RlbS5vdXQvLmVyciBhcyB3ZWxsIGFzIGZvcm1hdHRlcnMuCisgICAgICogQHBhcmFtIGxvZ1Rlc3RMaXN0ZW5lckV2ZW50cyB3aGV0aGVyIHRvIHByaW50IFRlc3RMaXN0ZW5lciBldmVudHMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgSlVuaXRUZXN0UnVubmVyKEpVbml0VGVzdCB0ZXN0LCBib29sZWFuIGhhbHRPbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaWx0ZXJ0cmFjZSwgYm9vbGVhbiBoYWx0T25GYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaG93T3V0cHV0LCBib29sZWFuIGxvZ1Rlc3RMaXN0ZW5lckV2ZW50cykgeworICAgICAgICB0aGlzKHRlc3QsIGhhbHRPbkVycm9yLCBmaWx0ZXJ0cmFjZSwgaGFsdE9uRmFpbHVyZSwgc2hvd091dHB1dCwKKyAgICAgICAgICAgICBsb2dUZXN0TGlzdGVuZXJFdmVudHMsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRvIHVzZSB3aGVuIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYSBjbGFzc3BhdGguCisgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QgdG8gcnVuLgorICAgICAqIEBwYXJhbSBoYWx0T25FcnJvciB3aGV0aGVyIHRvIHN0b3AgdGhlIHJ1biBpZiBhbiBlcnJvciBpcyBmb3VuZC4KKyAgICAgKiBAcGFyYW0gZmlsdGVydHJhY2Ugd2hldGhlciB0byBmaWx0ZXIganVuaXQuKi4qIHN0YWNrIGZyYW1lcyBvdXQgb2YgZXhjZXB0aW9ucworICAgICAqIEBwYXJhbSBoYWx0T25GYWlsdXJlIHdoZXRoZXIgdG8gc3RvcCB0aGUgcnVuIGlmIGZhaWx1cmUgaXMgZm91bmQuCisgICAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHJ1bm5pbmcgdGhlIHRlc3QuCisgICAgICovCisgICAgcHVibGljIEpVbml0VGVzdFJ1bm5lcihKVW5pdFRlc3QgdGVzdCwgYm9vbGVhbiBoYWx0T25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlsdGVydHJhY2UsIGJvb2xlYW4gaGFsdE9uRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICB0aGlzKHRlc3QsIGhhbHRPbkVycm9yLCBmaWx0ZXJ0cmFjZSwgaGFsdE9uRmFpbHVyZSwgZmFsc2UsIGxvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdG8gdXNlIHdoZW4gdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIGNsYXNzcGF0aC4KKyAgICAgKiBAcGFyYW0gdGVzdCB0aGUgdGVzdCB0byBydW4uCisgICAgICogQHBhcmFtIGhhbHRPbkVycm9yIHdoZXRoZXIgdG8gc3RvcCB0aGUgcnVuIGlmIGFuIGVycm9yIGlzIGZvdW5kLgorICAgICAqIEBwYXJhbSBmaWx0ZXJ0cmFjZSB3aGV0aGVyIHRvIGZpbHRlciBqdW5pdC4qLiogc3RhY2sgZnJhbWVzIG91dCBvZiBleGNlcHRpb25zCisgICAgICogQHBhcmFtIGhhbHRPbkZhaWx1cmUgd2hldGhlciB0byBzdG9wIHRoZSBydW4gaWYgZmFpbHVyZSBpcyBmb3VuZC4KKyAgICAgKiBAcGFyYW0gc2hvd091dHB1dCAgICB3aGV0aGVyIHRvIHNlbmQgb3V0cHV0IHRvIFN5c3RlbS5vdXQvLmVyciBhcyB3ZWxsIGFzIGZvcm1hdHRlcnMuCisgICAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHJ1bm5pbmcgdGhlIHRlc3QuCisgICAgICovCisgICAgcHVibGljIEpVbml0VGVzdFJ1bm5lcihKVW5pdFRlc3QgdGVzdCwgYm9vbGVhbiBoYWx0T25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlsdGVydHJhY2UsIGJvb2xlYW4gaGFsdE9uRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvd091dHB1dCwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHRoaXModGVzdCwgaGFsdE9uRXJyb3IsIGZpbHRlcnRyYWNlLCBoYWx0T25GYWlsdXJlLCBzaG93T3V0cHV0LAorICAgICAgICAgICAgIGZhbHNlLCBsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRvIHVzZSB3aGVuIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYSBjbGFzc3BhdGguCisgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QgdG8gcnVuLgorICAgICAqIEBwYXJhbSBoYWx0T25FcnJvciB3aGV0aGVyIHRvIHN0b3AgdGhlIHJ1biBpZiBhbiBlcnJvciBpcyBmb3VuZC4KKyAgICAgKiBAcGFyYW0gZmlsdGVydHJhY2Ugd2hldGhlciB0byBmaWx0ZXIganVuaXQuKi4qIHN0YWNrIGZyYW1lcyBvdXQgb2YgZXhjZXB0aW9ucworICAgICAqIEBwYXJhbSBoYWx0T25GYWlsdXJlIHdoZXRoZXIgdG8gc3RvcCB0aGUgcnVuIGlmIGZhaWx1cmUgaXMgZm91bmQuCisgICAgICogQHBhcmFtIHNob3dPdXRwdXQgICAgd2hldGhlciB0byBzZW5kIG91dHB1dCB0byBTeXN0ZW0ub3V0Ly5lcnIgYXMgd2VsbCBhcyBmb3JtYXR0ZXJzLgorICAgICAqIEBwYXJhbSBsb2dUZXN0TGlzdGVuZXJFdmVudHMgd2hldGhlciB0byBwcmludCBUZXN0TGlzdGVuZXIgZXZlbnRzLgorICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGNsYXNzbG9hZGVyIHRvIHVzZSBydW5uaW5nIHRoZSB0ZXN0LgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIEpVbml0VGVzdFJ1bm5lcihKVW5pdFRlc3QgdGVzdCwgYm9vbGVhbiBoYWx0T25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlsdGVydHJhY2UsIGJvb2xlYW4gaGFsdE9uRmFpbHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvd091dHB1dCwgYm9vbGVhbiBsb2dUZXN0TGlzdGVuZXJFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgSlVuaXRUZXN0UnVubmVyLmZpbHRlcnRyYWNlID0gZmlsdGVydHJhY2U7CisgICAgICAgIHRoaXMuanVuaXRUZXN0ID0gdGVzdDsKKyAgICAgICAgdGhpcy5oYWx0T25FcnJvciA9IGhhbHRPbkVycm9yOworICAgICAgICB0aGlzLmhhbHRPbkZhaWx1cmUgPSBoYWx0T25GYWlsdXJlOworICAgICAgICB0aGlzLnNob3dPdXRwdXQgPSBzaG93T3V0cHV0OworICAgICAgICB0aGlzLmxvZ1Rlc3RMaXN0ZW5lckV2ZW50cyA9IGxvZ1Rlc3RMaXN0ZW5lckV2ZW50czsKKyAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBzYXZlZE91dCA9IG51bGw7CisgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBzYXZlZEVyciA9IG51bGw7CisKKyAgICBwcml2YXRlIFByaW50U3RyZWFtIGNyZWF0ZUVtcHR5U3RyZWFtKCkgeworICAgICAgICByZXR1cm4gbmV3IFByaW50U3RyZWFtKAorICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gY3JlYXRlVGVlUHJpbnQoUHJpbnRTdHJlYW0gcHMxLCBQcmludFN0cmVhbSBwczIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmludFN0cmVhbShuZXcgVGVlT3V0cHV0U3RyZWFtKHBzMSwgcHMyKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwSU9TdHJlYW1zKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZSkgeworICAgICAgICBzeXN0ZW1PdXQgPSBuZXcgUHJpbnRTdHJlYW0obyk7CisgICAgICAgIHN5c3RlbUVycm9yID0gbmV3IFByaW50U3RyZWFtKGUpOworCisgICAgICAgIGlmIChmb3JrZWQpIHsKKyAgICAgICAgICAgIGlmICghb3V0cHV0VG9Gb3JtYXR0ZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzaG93T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIHNhdmVkT3V0ID0gU3lzdGVtLm91dDsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZWRFcnIgPSBTeXN0ZW0uZXJyOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KGNyZWF0ZUVtcHR5U3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKGNyZWF0ZUVtcHR5U3RyZWFtKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2F2ZWRPdXQgPSBTeXN0ZW0ub3V0OworICAgICAgICAgICAgICAgIHNhdmVkRXJyID0gU3lzdGVtLmVycjsKKyAgICAgICAgICAgICAgICBpZiAoIXNob3dPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLnNldE91dChzeXN0ZW1PdXQpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKHN5c3RlbUVycm9yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KGNyZWF0ZVRlZVByaW50KHNhdmVkT3V0LCBzeXN0ZW1PdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLnNldEVycihjcmVhdGVUZWVQcmludChzYXZlZEVyciwgc3lzdGVtRXJyb3IpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVybSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGVybSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGVybS5zZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHJlcyA9IG5ldyBUZXN0UmVzdWx0KCk7CisgICAgICAgIHJlcy5hZGRMaXN0ZW5lcih3cmFwTGlzdGVuZXIodGhpcykpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hdHRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHJlcy5hZGRMaXN0ZW5lcih3cmFwTGlzdGVuZXIoKFRlc3RMaXN0ZW5lcikgZm9ybWF0dGVycy5lbGVtZW50QXQoaSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnJTdHJtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0U3RybSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBzZXR1cElPU3RyZWFtcyhvdXRTdHJtLCBlcnJTdHJtKTsKKworICAgICAgICBUZXN0IHN1aXRlID0gbnVsbDsKKyAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gc3RhcnRUZXN0U3VpdGVTdWNjZXNzID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0ZXN0Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGp1bml0VGVzdC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3RDbGFzcyA9IENsYXNzLmZvck5hbWUoanVuaXRUZXN0LmdldE5hbWUoKSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhIHN0YXRpYyBzdWl0ZSBtZXRob2QgZmlyc3QsIGV2ZW4gd2hlbiB1c2luZworICAgICAgICAgICAgICAgIC8vIEpVbml0IDQKKyAgICAgICAgICAgICAgICBNZXRob2Qgc3VpdGVNZXRob2QgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgc3VpdGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIHN1aXRlTWV0aG9kID0gdGVzdENsYXNzLmdldE1ldGhvZCgic3VpdGUiLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGFwcHJvcHJpYXRlIHN1aXRlIG1ldGhvZCBmb3VuZC4gV2UgZG9uJ3QgcmVwb3J0IGFueQorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBoZXJlIHNpbmNlIGl0IG1pZ2h0IGJlIHBlcmZlY3RseSBub3JtYWwuCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN1aXRlTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBzdWl0ZSBtZXRob2QgYXZhaWxhYmxlLCB0aGVuIHRyeQorICAgICAgICAgICAgICAgICAgICAvLyB0byBleHRyYWN0IHRoZSBzdWl0ZSBmcm9tIGl0LiBJZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGl0IHdpbGwgYmUgY2F1Z2h0IGJlbG93IGFuZCByZXBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgc3VpdGUgPSAoVGVzdCkgc3VpdGVNZXRob2QuaW52b2tlKG51bGwsIG5ldyBDbGFzc1swXSk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDbGFzcyBqdW5pdDRUZXN0QWRhcHRlckNsYXNzID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgSkRLIDUgZmlyc3QuIFdpbGwgKm5vdCogaGVscCBvbiBKREsgMS40CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG9ubHkganVuaXQtNC4wLmphciBpbiBDUCBiZWNhdXNlIGluIHRoYXQgY2FzZQorICAgICAgICAgICAgICAgICAgICAvLyBsaW5rYWdlIG9mIHdob2xlIHRhc2sgd2lsbCBhbHJlYWR5IGhhdmUgZmFpbGVkISBCdXQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBoZWxwIGlmIENQIGhhcyBqdW5pdC0zLjguMi5qYXI6anVuaXQtNC4wLmphci4KKworICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGF0IGNhc2UgZmlyc3QgQy5mTiB3aWxsIGZhaWwgd2l0aCBDTkZFIGFuZCB3ZQorICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGF2b2lkIFVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IuCisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bml0NFRlc3RBZGFwdGVyQ2xhc3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqdW5pdC5mcmFtZXdvcmsuSlVuaXQ0VGVzdEFkYXB0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuaXQ0VGVzdEFkYXB0ZXJDbGFzcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImp1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPSywgZmFsbCBiYWNrIHRvIEpVbml0IDMuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAganVuaXQ0ID0ganVuaXQ0VGVzdEFkYXB0ZXJDbGFzcyAhPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIGlmIChqdW5pdDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIHVzZSBpdCEKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGVzdCkganVuaXQ0VGVzdEFkYXB0ZXJDbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7Q2xhc3MuY2xhc3N9KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge3Rlc3RDbGFzc30pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIEpVbml0IDMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBleHRyYWN0IGEgdGVzdCBzdWl0ZSBhdXRvbWF0aWNhbGx5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgaWYgdGhlIGNsYXNzIGlzIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWl0YWJsZSBUZXN0CisgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUodGVzdENsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIHJldENvZGUgPSBFUlJPUlM7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgICAgICBmaXJlU3RhcnRUZXN0U3VpdGUoKTsKKyAgICAgICAgICAgIHN0YXJ0VGVzdFN1aXRlU3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsgLy8gaGFkIGFuIGV4Y2VwdGlvbiBjb25zdHJ1Y3Rpbmcgc3VpdGUKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hdHRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKChUZXN0TGlzdGVuZXIpIGZvcm1hdHRlcnMuZWxlbWVudEF0KGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEVycm9yKG51bGwsIGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGp1bml0VGVzdC5zZXRDb3VudHMoMSwgMCwgMSk7CisgICAgICAgICAgICAgICAganVuaXRUZXN0LnNldFJ1blRpbWUoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ1Rlc3RMaXN0ZW5lckV2ZW50KCJ0ZXN0cyB0byBydW46ICIgKyBzdWl0ZS5jb3VudFRlc3RDYXNlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgc3VpdGUucnVuKHJlcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGp1bml0NCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gY250cyA9IGZpbmRKVW5pdDRGYWlsdXJlRXJyb3JDb3VudChyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAganVuaXRUZXN0LnNldENvdW50cyhyZXMucnVuQ291bnQoKSwgY250c1swXSwgY250c1sxXSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBqdW5pdFRlc3Quc2V0Q291bnRzKHJlcy5ydW5Db3VudCgpLCByZXMuZmFpbHVyZUNvdW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5lcnJvckNvdW50KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGp1bml0VGVzdC5zZXRSdW5UaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwZXJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwZXJtLnJlc3RvcmVTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzYXZlZE91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLnNldE91dChzYXZlZE91dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2F2ZWRFcnIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIoc2F2ZWRFcnIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeXN0ZW1FcnJvci5jbG9zZSgpOworICAgICAgICAgICAgc3lzdGVtRXJyb3IgPSBudWxsOworICAgICAgICAgICAgc3lzdGVtT3V0LmNsb3NlKCk7CisgICAgICAgICAgICBzeXN0ZW1PdXQgPSBudWxsOworICAgICAgICAgICAgaWYgKHN0YXJ0VGVzdFN1aXRlU3VjY2VzcykgeworICAgICAgICAgICAgICAgIHNlbmRPdXRBbmRFcnIobmV3IFN0cmluZyhvdXRTdHJtLnRvQnl0ZUFycmF5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhlcnJTdHJtLnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaXJlRW5kVGVzdFN1aXRlKCk7CisKKyAgICAgICAgaWYgKHJldENvZGUgIT0gU1VDQ0VTUyB8fCByZXMuZXJyb3JDb3VudCgpICE9IDApIHsKKyAgICAgICAgICAgIHJldENvZGUgPSBFUlJPUlM7CisgICAgICAgIH0gZWxzZSBpZiAocmVzLmZhaWx1cmVDb3VudCgpICE9IDApIHsKKyAgICAgICAgICAgIHJldENvZGUgPSBGQUlMVVJFUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hhdCBTeXN0ZW0uZXhpdCgpIHdvdWxkIHJldHVybiBpbiB0aGUgc3RhbmRhbG9uZSB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHJldHVybiAyIGlmIGVycm9ycyBvY2N1cnJlZCwgMSBpZiB0ZXN0cyBmYWlsZWQgZWxzZSAwLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmV0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lci4KKyAgICAgKgorICAgICAqIDxwPkEgbmV3IFRlc3QgaXMgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gdCB0aGUgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IEpVbml0VmVyc2lvbkhlbHBlci5nZXRUZXN0Q2FzZU5hbWUodCk7CisgICAgICAgIGxvZ1Rlc3RMaXN0ZW5lckV2ZW50KCJzdGFydFRlc3QoIiArIHRlc3ROYW1lICsgIikiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgVGVzdExpc3RlbmVyLgorICAgICAqCisgICAgICogPHA+QSBUZXN0IGlzIGZpbmlzaGVkLgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IEpVbml0VmVyc2lvbkhlbHBlci5nZXRUZXN0Q2FzZU5hbWUodGVzdCk7CisgICAgICAgIGxvZ1Rlc3RMaXN0ZW5lckV2ZW50KCJlbmRUZXN0KCIgKyB0ZXN0TmFtZSArICIpIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZ1Rlc3RMaXN0ZW5lckV2ZW50KFN0cmluZyBtc2cpIHsKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gc2F2ZWRPdXQgIT0gbnVsbCA/IHNhdmVkT3V0IDogU3lzdGVtLm91dDsKKyAgICAgICAgaWYgKGxvZ1Rlc3RMaXN0ZW5lckV2ZW50cykgeworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbihKVW5pdFRhc2suVEVTVExJU1RFTkVSX1BSRUZJWCArIG1zZyk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZsdDs9IDMuNC4KKyAgICAgKgorICAgICAqIDxwPkEgVGVzdCBmYWlsZWQuCisgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHQgICAgdGhlIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IEpVbml0VmVyc2lvbkhlbHBlci5nZXRUZXN0Q2FzZU5hbWUodGVzdCk7CisgICAgICAgIGxvZ1Rlc3RMaXN0ZW5lckV2ZW50KCJhZGRGYWlsdXJlKCIgKyB0ZXN0TmFtZSArICIsICIgKyB0LmdldE1lc3NhZ2UoKSArICIpIik7CisgICAgICAgIGlmIChoYWx0T25GYWlsdXJlKSB7CisgICAgICAgICAgICByZXMuc3RvcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lciBmb3IgSlVuaXQgJmd0OyAzLjQuCisgICAgICoKKyAgICAgKiA8cD5BIFRlc3QgZmFpbGVkLgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0LgorICAgICAqIEBwYXJhbSB0ICAgIHRoZSBhc3NlcnRpb24gdGhyb3duIGJ5IHRoZSB0ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7CisgICAgICAgIGFkZEZhaWx1cmUodGVzdCwgKFRocm93YWJsZSkgdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lci4KKyAgICAgKgorICAgICAqIDxwPkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHQgICAgdGhlIGVycm9yIHRocm93biBieSB0aGUgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0TmFtZSA9IEpVbml0VmVyc2lvbkhlbHBlci5nZXRUZXN0Q2FzZU5hbWUodGVzdCk7CisgICAgICAgIGxvZ1Rlc3RMaXN0ZW5lckV2ZW50KCJhZGRFcnJvcigiICsgdGVzdE5hbWUgKyAiLCAiICsgdC5nZXRNZXNzYWdlKCkgKyAiKSIpOworICAgICAgICBpZiAoaGFsdE9uRXJyb3IpIHsKKyAgICAgICAgICAgIHJlcy5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJtaXNzaW9ucyBmb3IgdGhlIHRlc3QgcnVuLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICogQHBhcmFtIHBlcm1pc3Npb25zIHRoZSBwZXJtaXNzaW9ucyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGVybWlzc2lvbnMoUGVybWlzc2lvbnMgcGVybWlzc2lvbnMpIHsKKyAgICAgICAgcGVybSA9IHBlcm1pc3Npb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSBhIHN0cmluZyBkZXN0aW5lZCBmb3Igc3RhbmRhcmQgb3V0cHV0LgorICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIHN0cmluZyB0byBvdXRwdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVPdXRwdXQoU3RyaW5nIG91dHB1dCkgeworICAgICAgICBpZiAoIWxvZ1Rlc3RMaXN0ZW5lckV2ZW50cyAmJiBvdXRwdXQuc3RhcnRzV2l0aChKVW5pdFRhc2suVEVTVExJU1RFTkVSX1BSRUZJWCkpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9IGVsc2UgaWYgKHN5c3RlbU91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBzeXN0ZW1PdXQucHJpbnQob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSBpbnB1dC4KKyAgICAgKiBAcGFyYW0gYnVmZmVyIG5vdCB1c2VkLgorICAgICAqIEBwYXJhbSBvZmZzZXQgbm90IHVzZWQuCisgICAgICogQHBhcmFtIGxlbmd0aCBub3QgdXNlZC4KKyAgICAgKiBAcmV0dXJuIC0xIGFsd2F5cy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG5ldmVyLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNoYW5kbGVJbnB1dChieXRlW10sIGludCwgaW50KQorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhbmRsZUlucHV0KGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVFcnJvck91dHB1dChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChzeXN0ZW1FcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICBzeXN0ZW1FcnJvci5wcmludChvdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlRmx1c2goU3RyaW5nIG91dHB1dCkgeworICAgICAgICBpZiAoc3lzdGVtT3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5c3RlbU91dC5wcmludChvdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlRXJyb3JGbHVzaChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGlmIChzeXN0ZW1FcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICBzeXN0ZW1FcnJvci5wcmludChvdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRPdXRBbmRFcnIoU3RyaW5nIG91dCwgU3RyaW5nIGVycikgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvcm1hdHRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEpVbml0UmVzdWx0Rm9ybWF0dGVyIGZvcm1hdHRlciA9CisgICAgICAgICAgICAgICAgKChKVW5pdFJlc3VsdEZvcm1hdHRlcikgZm9ybWF0dGVycy5lbGVtZW50QXQoaSkpOworCisgICAgICAgICAgICBmb3JtYXR0ZXIuc2V0U3lzdGVtT3V0cHV0KG91dCk7CisgICAgICAgICAgICBmb3JtYXR0ZXIuc2V0U3lzdGVtRXJyb3IoZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaXJlU3RhcnRUZXN0U3VpdGUoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9ybWF0dGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgKChKVW5pdFJlc3VsdEZvcm1hdHRlcikgZm9ybWF0dGVycy5lbGVtZW50QXQoaSkpCisgICAgICAgICAgICAgICAgLnN0YXJ0VGVzdFN1aXRlKGp1bml0VGVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmlyZUVuZFRlc3RTdWl0ZSgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYXR0ZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAoKEpVbml0UmVzdWx0Rm9ybWF0dGVyKSBmb3JtYXR0ZXJzLmVsZW1lbnRBdChpKSkKKyAgICAgICAgICAgICAgICAuZW5kVGVzdFN1aXRlKGp1bml0VGVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmb3JtYXR0ZXIuCisgICAgICogQHBhcmFtIGYgdGhlIGZvcm1hdHRlciB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRm9ybWF0dGVyKEpVbml0UmVzdWx0Rm9ybWF0dGVyIGYpIHsKKyAgICAgICAgZm9ybWF0dGVycy5hZGRFbGVtZW50KGYpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZvcm1hdHRlcihKVW5pdFRhc2tNaXJyb3IuSlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgZikgeworICAgICAgICBmb3JtYXR0ZXJzLmFkZEVsZW1lbnQoKEpVbml0UmVzdWx0Rm9ybWF0dGVyKSBmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnRyeSBwb2ludCBmb3Igc3RhbmRhbG9uZSAoZm9ya2VkKSBtb2RlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczogdGVzdGNhc2VjbGFzc25hbWUgcGx1cyBwYXJhbWV0ZXJzIGluIHRoZSBmb3JtYXQKKyAgICAgKiBrZXk9dmFsdWUsIG5vbmUgb2Ygd2hpY2ggaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiA8dGFibGUgY29scz0iNCIgYm9yZGVyPSIxIj4KKyAgICAgKiA8dHI+PHRoPmtleTwvdGg+PHRoPmRlc2NyaXB0aW9uPC90aD48dGg+ZGVmYXVsdCB2YWx1ZTwvdGg+PC90cj4KKyAgICAgKgorICAgICAqIDx0cj48dGQ+aGFsdE9uRXJyb3I8L3RkPjx0ZD5oYWx0IHRlc3Qgb24KKyAgICAgKiBlcnJvcnM/PC90ZD48dGQ+ZmFsc2U8L3RkPjwvdHI+CisgICAgICoKKyAgICAgKiA8dHI+PHRkPmhhbHRPbkZhaWx1cmU8L3RkPjx0ZD5oYWx0IHRlc3Qgb24KKyAgICAgKiBmYWlsdXJlcz88L3RkPjx0ZD5mYWxzZTwvdGQ+PC90cj4KKyAgICAgKgorICAgICAqIDx0cj48dGQ+Zm9ybWF0dGVyPC90ZD48dGQ+QSBKVW5pdFJlc3VsdEZvcm1hdHRlciBnaXZlbiBhcworICAgICAqIGNsYXNzbmFtZSxmaWxlbmFtZS4gSWYgZmlsZW5hbWUgaXMgb21taXR0ZWQsIFN5c3RlbS5vdXQgaXMKKyAgICAgKiBhc3N1bWVkLjwvdGQ+PHRkPm5vbmU8L3RkPjwvdHI+CisgICAgICoKKyAgICAgKiA8dHI+PHRkPnNob3dvdXRwdXQ8L3RkPjx0ZD5zZW5kIG91dHB1dCB0byBTeXN0ZW0uZXJyLy5vdXQgYXMKKyAgICAgKiB3ZWxsIGFzIHRvIHRoZSBmb3JtYXR0ZXJzPzwvdGQ+PHRkPmZhbHNlPC90ZD48L3RyPgorICAgICAqCisgICAgICogPHRyPjx0ZD5sb2d0ZXN0bGlzdGVuZXJldmVudHM8L3RkPjx0ZD5sb2cgVGVzdExpc3RlbmVyIGV2ZW50cyB0bworICAgICAqIFN5c3RlbS5vdXQuPC90ZD48dGQ+ZmFsc2U8L3RkPjwvdHI+CisgICAgICoKKyAgICAgKiA8L3RhYmxlPgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBoYWx0RXJyb3IgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBoYWx0RmFpbCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHN0YWNrZmlsdGVyID0gdHJ1ZTsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGJvb2xlYW4gc2hvd091dCA9IGZhbHNlOworICAgICAgICBib29sZWFuIG91dHB1dFRvRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiBsb2dUZXN0TGlzdGVuZXJFdmVudHMgPSBmYWxzZTsKKworCisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInJlcXVpcmVkIGFyZ3VtZW50IFRlc3RDbGFzc05hbWUgbWlzc2luZyIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoRVJST1JTKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcmdzWzBdLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlRFU1RTRklMRSkpIHsKKyAgICAgICAgICAgIG11bHRpcGxlVGVzdHMgPSB0cnVlOworICAgICAgICAgICAgYXJnc1swXSA9IGFyZ3NbMF0uc3Vic3RyaW5nKENvbnN0YW50cy5URVNUU0ZJTEUubGVuZ3RoKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKENvbnN0YW50cy5IQUxUX09OX0VSUk9SKSkgeworICAgICAgICAgICAgICAgIGhhbHRFcnJvciA9IFByb2plY3QudG9Cb29sZWFuKGFyZ3NbaV0uc3Vic3RyaW5nKENvbnN0YW50cy5IQUxUX09OX0VSUk9SLmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aChDb25zdGFudHMuSEFMVF9PTl9GQUlMVVJFKSkgeworICAgICAgICAgICAgICAgIGhhbHRGYWlsID0gUHJvamVjdC50b0Jvb2xlYW4oYXJnc1tpXS5zdWJzdHJpbmcoQ29uc3RhbnRzLkhBTFRfT05fRkFJTFVSRS5sZW5ndGgoKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLkZJTFRFUlRSQUNFKSkgeworICAgICAgICAgICAgICAgIHN0YWNrZmlsdGVyID0gUHJvamVjdC50b0Jvb2xlYW4oYXJnc1tpXS5zdWJzdHJpbmcoQ29uc3RhbnRzLkZJTFRFUlRSQUNFLmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aChDb25zdGFudHMuQ1JBU0hGSUxFKSkgeworICAgICAgICAgICAgICAgIGNyYXNoRmlsZSA9IGFyZ3NbaV0uc3Vic3RyaW5nKENvbnN0YW50cy5DUkFTSEZJTEUubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyVGVzdENhc2UoQ29uc3RhbnRzLkJFRk9SRV9GSVJTVF9URVNUKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKENvbnN0YW50cy5GT1JNQVRURVIpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlQW5kU3RvcmVGb3JtYXR0ZXIoYXJnc1tpXS5zdWJzdHJpbmcoQ29uc3RhbnRzLkZPUk1BVFRFUi5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdChFUlJPUlMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKENvbnN0YW50cy5QUk9QU0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhcmdzW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKENvbnN0YW50cy5QUk9QU0ZJTEUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlNIT1dPVVRQVVQpKSB7CisgICAgICAgICAgICAgICAgc2hvd091dCA9IFByb2plY3QudG9Cb29sZWFuKGFyZ3NbaV0uc3Vic3RyaW5nKENvbnN0YW50cy5TSE9XT1VUUFVULmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aChDb25zdGFudHMuTE9HVEVTVExJU1RFTkVSRVZFTlRTKSkgeworICAgICAgICAgICAgICAgIGxvZ1Rlc3RMaXN0ZW5lckV2ZW50cyA9IFByb2plY3QudG9Cb29sZWFuKAorICAgICAgICAgICAgICAgICAgICBhcmdzW2ldLnN1YnN0cmluZyhDb25zdGFudHMuTE9HVEVTVExJU1RFTkVSRVZFTlRTLmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aChDb25zdGFudHMuT1VUUFVUX1RPX0ZPUk1BVFRFUlMpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0VG9Gb3JtYXQgPSBQcm9qZWN0LnRvQm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgYXJnc1tpXS5zdWJzdHJpbmcoQ29uc3RhbnRzLk9VVFBVVF9UT19GT1JNQVRURVJTLmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQvb3ZlcmxheSBzeXN0ZW0gcHJvcGVydGllcyBvbiB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBBbnQgcHJvamVjdAorICAgICAgICBIYXNodGFibGUgcCA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHAua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgT2JqZWN0IGtleSA9IGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHByb3BzLnB1dChrZXksIHAuZ2V0KGtleSkpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJldHVybkNvZGUgPSBTVUNDRVNTOworICAgICAgICBpZiAobXVsdGlwbGVUZXN0cykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyKG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJnc1swXSkpOworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXN0Q2FzZU5hbWU7CisgICAgICAgICAgICAgICAgaW50IGNvZGUgPSAwOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZXJyb3JPY2N1cnJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFpbHVyZU9jY3VycmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdENhc2VOYW1lID0gc3QubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIEpVbml0VGVzdCB0ID0gbmV3IEpVbml0VGVzdCh0ZXN0Q2FzZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB0LnNldFRvZGlyKG5ldyBGaWxlKHN0Lm5leHRUb2tlbigpKSk7CisgICAgICAgICAgICAgICAgICAgIHQuc2V0T3V0ZmlsZShzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgICAgICAgICAgICAgIHQuc2V0UHJvcGVydGllcyhwcm9wcyk7CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBsYXVuY2godCwgaGFsdEVycm9yLCBzdGFja2ZpbHRlciwgaGFsdEZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd091dCwgb3V0cHV0VG9Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nVGVzdExpc3RlbmVyRXZlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JPY2N1cnJlZCA9IChjb2RlID09IEVSUk9SUyk7CisgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVPY2N1cnJlZCA9IChjb2RlICE9IFNVQ0NFU1MpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JPY2N1cnJlZCB8fCBmYWlsdXJlT2NjdXJyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZXJyb3JPY2N1cnJlZCAmJiBoYWx0RXJyb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGZhaWx1cmVPY2N1cnJlZCAmJiBoYWx0RmFpbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlck5vbkNyYXNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID4gcmV0dXJuQ29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlID0gY29kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJURVNUICIgKyB0LmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRkFJTEVEIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEpVbml0VGVzdCB0ID0gbmV3IEpVbml0VGVzdChhcmdzWzBdKTsKKyAgICAgICAgICAgIHQuc2V0UHJvcGVydGllcyhwcm9wcyk7CisgICAgICAgICAgICByZXR1cm5Db2RlID0gbGF1bmNoKAorICAgICAgICAgICAgICAgIHQsIGhhbHRFcnJvciwgc3RhY2tmaWx0ZXIsIGhhbHRGYWlsLAorICAgICAgICAgICAgICAgIHNob3dPdXQsIG91dHB1dFRvRm9ybWF0LCBsb2dUZXN0TGlzdGVuZXJFdmVudHMpOworICAgICAgICB9CisKKyAgICAgICAgcmVnaXN0ZXJOb25DcmFzaCgpOworICAgICAgICBTeXN0ZW0uZXhpdChyZXR1cm5Db2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBWZWN0b3IgZnJvbUNtZExpbmUgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyYW5zZmVyRm9ybWF0dGVycyhKVW5pdFRlc3RSdW5uZXIgcnVubmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpVbml0VGVzdCB0ZXN0KSB7CisgICAgICAgIHJ1bm5lci5hZGRGb3JtYXR0ZXIobmV3IEpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVuZFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbU91dHB1dChTdHJpbmcgb3V0KSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUVycm9yKFN0cmluZyBlcnIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCBhcmcwLCBUaHJvd2FibGUgYXJnMSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgYXJnMCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgYXJnMSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgYXJnMCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCBhcmcwKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZShKVW5pdFZlcnNpb25IZWxwZXIuZ2V0VGVzdENhc2VOYW1lKGFyZzApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJvbUNtZExpbmUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEZvcm1hdHRlckVsZW1lbnQgZmUgPSAoRm9ybWF0dGVyRWxlbWVudCkgZnJvbUNtZExpbmUuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgaWYgKG11bHRpcGxlVGVzdHMgJiYgZmUuZ2V0VXNlRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBkZXN0RmlsZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHRlc3QuZ2V0VG9kaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC5nZXRPdXRmaWxlKCkgKyBmZS5nZXRFeHRlbnNpb24oKSk7CisgICAgICAgICAgICAgICAgZmUuc2V0T3V0ZmlsZShkZXN0RmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5uZXIuYWRkRm9ybWF0dGVyKChKVW5pdFJlc3VsdEZvcm1hdHRlcikgZmUuY3JlYXRlRm9ybWF0dGVyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTGluZSBmb3JtYXQgaXM6IGZvcm1hdHRlcj08Y2xhc3NuYW1lPigsPHBhdGhuYW1lPik/CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVBbmRTdG9yZUZvcm1hdHRlcihTdHJpbmcgbGluZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgRm9ybWF0dGVyRWxlbWVudCBmZSA9IG5ldyBGb3JtYXR0ZXJFbGVtZW50KCk7CisgICAgICAgIGludCBwb3MgPSBsaW5lLmluZGV4T2YoJywnKTsKKyAgICAgICAgaWYgKHBvcyA9PSAtMSkgeworICAgICAgICAgICAgZmUuc2V0Q2xhc3NuYW1lKGxpbmUpOworICAgICAgICAgICAgZmUuc2V0VXNlRmlsZShmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZS5zZXRDbGFzc25hbWUobGluZS5zdWJzdHJpbmcoMCwgcG9zKSk7CisgICAgICAgICAgICBmZS5zZXRVc2VGaWxlKHRydWUpOworICAgICAgICAgICAgaWYgKCFtdWx0aXBsZVRlc3RzKSB7CisgICAgICAgICAgICAgICAgZmUuc2V0T3V0ZmlsZShuZXcgRmlsZShsaW5lLnN1YnN0cmluZyhwb3MgKyAxKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZk5hbWUgPSBsaW5lLmluZGV4T2YoSUdOT1JFRF9GSUxFX05BTUUpOworICAgICAgICAgICAgICAgIGlmIChmTmFtZSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGZlLnNldEV4dGVuc2lvbihsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGZOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSUdOT1JFRF9GSUxFX05BTUUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJvbUNtZExpbmUuYWRkRWxlbWVudChmZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZpbHRlcmVkIHN0YWNrIHRyYWNlLgorICAgICAqIFRoaXMgaXMgcmlwcGVkIG91dCBvZiBqdW5pdC5ydW5uZXIuQmFzZVRlc3RSdW5uZXIuCisgICAgICogQHBhcmFtIHQgdGhlIGV4Y2VwdGlvbiB0byBmaWx0ZXIuCisgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgc3RhY2sgdHJhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsdGVyZWRUcmFjZShUaHJvd2FibGUgdCkgeworICAgICAgICBTdHJpbmcgdHJhY2UgPSBTdHJpbmdVdGlscy5nZXRTdGFja1RyYWNlKHQpOworICAgICAgICByZXR1cm4gSlVuaXRUZXN0UnVubmVyLmZpbHRlclN0YWNrKHRyYWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXJzIHN0YWNrIGZyYW1lcyBmcm9tIGludGVybmFsIEpVbml0IGFuZCBBbnQgY2xhc3NlcworICAgICAqIEBwYXJhbSBzdGFjayB0aGUgc3RhY2sgdHJhY2UgdG8gZmlsdGVyLgorICAgICAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlclN0YWNrKFN0cmluZyBzdGFjaykgeworICAgICAgICBpZiAoIWZpbHRlcnRyYWNlKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhY2s7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7CisgICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc3RhY2spOworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihzcik7CisKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJMaW5lKGxpbmUpKSB7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIHN0YWNrOyAvLyByZXR1cm4gdGhlIHN0YWNrIHVuZmlsdGVyZWQKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGZpbHRlckxpbmUoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBERUZBVUxUX1RSQUNFX0ZJTFRFUlMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoREVGQVVMVF9UUkFDRV9GSUxURVJTW2ldKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGxhdW5jaChKVW5pdFRlc3QgdCwgYm9vbGVhbiBoYWx0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN0YWNrZmlsdGVyLCBib29sZWFuIGhhbHRGYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaG93T3V0LCBib29sZWFuIG91dHB1dFRvRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsb2dUZXN0TGlzdGVuZXJFdmVudHMpIHsKKyAgICAgICAgSlVuaXRUZXN0UnVubmVyIHJ1bm5lciA9CisgICAgICAgICAgICBuZXcgSlVuaXRUZXN0UnVubmVyKHQsIGhhbHRFcnJvciwgc3RhY2tmaWx0ZXIsIGhhbHRGYWlsLCBzaG93T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dUZXN0TGlzdGVuZXJFdmVudHMsIG51bGwpOworICAgICAgICBydW5uZXIuZm9ya2VkID0gdHJ1ZTsKKyAgICAgICAgcnVubmVyLm91dHB1dFRvRm9ybWF0dGVycyA9IG91dHB1dFRvRm9ybWF0OworICAgICAgICB0cmFuc2ZlckZvcm1hdHRlcnMocnVubmVyLCB0KTsKKworICAgICAgICBydW5uZXIucnVuKCk7CisgICAgICAgIHJldHVybiBydW5uZXIuZ2V0UmV0Q29kZSgpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXJOb25DcmFzaCgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY3Jhc2hGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGVXcml0ZXIgb3V0ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVXcml0ZXIoY3Jhc2hGaWxlKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoQ29uc3RhbnRzLlRFUk1JTkFURURfU1VDQ0VTU0ZVTExZICsgIlxuIik7CisgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVGVzdENhc2UoU3RyaW5nIHRlc3RDYXNlKSB7CisgICAgICAgIGlmIChjcmFzaEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVXcml0ZXIoY3Jhc2hGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHRlc3RDYXNlICsgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIGEgVGVzdExpc3RlbmVyIHdoZW4gcnVubmluZyBKVW5pdCA0OiB0cmVhdHMgQXNzZXJ0aW9uRmFpbGVkRXJyb3IKKyAgICAgKiBhcyBhIGZhaWx1cmUgbm90IGFuIGVycm9yLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIFRlc3RMaXN0ZW5lciB3cmFwTGlzdGVuZXIoZmluYWwgVGVzdExpc3RlbmVyIHRlc3RMaXN0ZW5lcikgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoanVuaXQ0ICYmIHQgaW5zdGFuY2VvZiBBc3NlcnRpb25GYWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICAvLyBKVW5pdCA0IGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gZXJyb3JzIGFuZCBmYWlsdXJlcworICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGluIHRoZSBKVW5pdCAzIGFkYXB0ZXIuCisgICAgICAgICAgICAgICAgICAgIC8vIFNvIHdlIG5lZWQgdG8gaGVscCBpdCBhIGJpdCB0byByZXRhaW4gY29tcGF0aWJpbGl0eSBmb3IgSlVuaXQgMyB0ZXN0cy4KKyAgICAgICAgICAgICAgICAgICAgdGVzdExpc3RlbmVyLmFkZEZhaWx1cmUodGVzdCwgKEFzc2VydGlvbkZhaWxlZEVycm9yKSB0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGp1bml0NCAmJiB0LmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiamF2YS5sYW5nLkFzc2VydGlvbkVycm9yIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN0cmljdGx5IG5lY2Vzc2FyeSBidXQgcHJvYmFibHkgZGVzaXJhYmxlLgorICAgICAgICAgICAgICAgICAgICAvLyBKVW5pdCA0LXNwZWNpZmljIHRlc3QgR1VJcyB3aWxsIHNob3cganVzdCAiZmFpbHVyZXMiLgorICAgICAgICAgICAgICAgICAgICAvLyBCdXQgQW50J3Mgb3V0cHV0IHNob3dzICJmYWlsdXJlcyIgdnMuICJlcnJvcnMiLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSB3b3VsZCBwcmVmZXIgdG8gc2hvdyAiZmFpbHVyZSIgZm9yIHRoaW5ncyB0aGF0IGxvZ2ljYWxseSBhcmUuCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gdC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBmYWlsdXJlID0gbXNnICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcihtc2cpIDogbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUbyBjb21waWxlIG9uIHByZS1KREsgNCAoZXZlbiB0aG91Z2ggdGhpcyBzaG91bGQgYWx3YXlzIHN1Y2NlZWQpOgorICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGluaXRDYXVzZSA9IFRocm93YWJsZS5jbGFzcy5nZXRNZXRob2QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRDYXVzZSIsIG5ldyBDbGFzc1tdIHtUaHJvd2FibGUuY2xhc3N9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDYXVzZS5pbnZva2UoZmFpbHVyZSwgbmV3IE9iamVjdFtdIHt0fSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TGlzdGVuZXIuYWRkRmFpbHVyZSh0ZXN0LCBmYWlsdXJlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhdHMuCisgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAvLyBzaG91bGQgbm90IGhhcHBlbgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdExpc3RlbmVyLmFkZEVycm9yKHRlc3QsIHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdExpc3RlbmVyLmFkZEVycm9yKHRlc3QsIHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7CisgICAgICAgICAgICAgICAgdGVzdExpc3RlbmVyLmFkZEZhaWx1cmUodGVzdCwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsgLy8gcHJlLTMuNAorICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdExpc3RlbmVyLmFkZEZhaWx1cmUodGVzdCwgKEFzc2VydGlvbkZhaWxlZEVycm9yKSB0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ZXN0TGlzdGVuZXIuYWRkRXJyb3IodGVzdCwgdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKKyAgICAgICAgICAgICAgICB0ZXN0TGlzdGVuZXIuZW5kVGVzdCh0ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChUZXN0IHRlc3QpIHsKKyAgICAgICAgICAgICAgICB0ZXN0TGlzdGVuZXIuc3RhcnRUZXN0KHRlc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSBpbnN0ZWFkIG9mIFRlc3RSZXN1bHQuZ2V0e0ZhaWx1cmUsRXJyb3J9Q291bnQgb24gSlVuaXQgNCwKKyAgICAgKiBzaW5jZSB0aGUgYWRhcHRlciBjbGFpbXMgdGhhdCBhbGwgZmFpbHVyZXMgYXJlIGVycm9ycy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByaXZhdGUgaW50W10gZmluZEpVbml0NEZhaWx1cmVFcnJvckNvdW50KFRlc3RSZXN1bHQgcmVzKSB7CisgICAgICAgIGludCBmYWlsdXJlcyA9IDA7CisgICAgICAgIGludCBlcnJvcnMgPSAwOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVzLmZhaWx1cmVzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBmYWlsdXJlcysrOworICAgICAgICB9CisgICAgICAgIGUgPSByZXMuZXJyb3JzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9ICgoVGVzdEZhaWx1cmUpIGUubmV4dEVsZW1lbnQoKSkudGhyb3duRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yCisgICAgICAgICAgICAgICAgfHwgdC5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5Bc3NlcnRpb25FcnJvciIpKSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZXMrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3JzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7ZmFpbHVyZXMsIGVycm9yc307CisgICAgfQorCit9IC8vIEpVbml0VGVzdFJ1bm5lcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRWZXJzaW9uSGVscGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFZlcnNpb25IZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY4MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRWZXJzaW9uSGVscGVyLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogV29yayBhcm91bmQgZm9yIHNvbWUgY2hhbmdlcyB0byB0aGUgcHVibGljIEpVbml0IEFQSSBiZXR3ZWVuCisgKiBkaWZmZXJlbnQgSlVuaXQgcmVsZWFzZXMuCisgKiBAc2luY2UgQW50IDEuNworICovCisvLyBDaGVja1N0eWxlOkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvckNoZWNrIE9GRiAoYmMpCitwdWJsaWMgY2xhc3MgSlVuaXRWZXJzaW9uSGVscGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCB0ZXN0Q2FzZU5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgSlVuaXQ0IGNsYXNzIHdlIGxvb2sgZm9yLgorICAgICAqIHtAdmFsdWV9CisgICAgICogQHNpbmNlIEFudCAxLjcuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpVTklUX0ZSQU1FV09SS19KVU5JVDRfVEVTVF9DQVNFX0ZBQ0FERQorICAgICAgICA9ICJqdW5pdC5mcmFtZXdvcmsuSlVuaXQ0VGVzdENhc2VGYWNhZGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX1RFU1RfQ0FTRV9OQU1FID0gInVua25vd24iOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RDYXNlTmFtZSA9IFRlc3RDYXNlLmNsYXNzLmdldE1ldGhvZCgiZ2V0TmFtZSIsIG5ldyBDbGFzc1swXSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBwcmUgSlVuaXQgMy43CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRlc3RDYXNlTmFtZSA9IFRlc3RDYXNlLmNsYXNzLmdldE1ldGhvZCgibmFtZSIsIG5ldyBDbGFzc1swXSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSlVuaXQgMy43IGludHJvZHVjZXMgVGVzdENhc2UuZ2V0TmFtZSgpIGFuZCBzdWJzZXF1ZW50IHZlcnNpb25zCisgICAgICogb2YgSlVuaXQgcmVtb3ZlIHRoZSBvbGQgbmFtZSgpIG1ldGhvZC4gIFRoaXMgbWV0aG9kIHByb3ZpZGVzCisgICAgICogYWNjZXNzIHRvIHRoZSBuYW1lIG9mIGEgVGVzdENhc2UgdmlhIHJlZmxlY3Rpb24gdGhhdCBpcworICAgICAqIHN1cHBvc2VkIHRvIHdvcmsgd2l0aCB2ZXJzaW9uIGJlZm9yZSBhbmQgYWZ0ZXIgSlVuaXQgMy43LgorICAgICAqCisgICAgICogPHA+c2luY2UgQW50IDEuNS4xIHRoaXMgbWV0aG9kIHdpbGwgaW52b2tlICZxdW90Ozxjb2RlPnB1YmxpYworICAgICAqIFN0cmluZyBnZXROYW1lKCk8L2NvZGU+JnF1b3Q7IG9uIGFueSBpbXBsZW1lbnRhdGlvbiBvZiBUZXN0IGlmCisgICAgICogaXQgZXhpc3RzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlNpbmNlIEFudCAxLjcgYWxzbyBjaGVja3MgZm9yIEpVbml0NFRlc3RDYXNlRmFjYWRlIGV4cGxpY2l0bHkuCisgICAgICogVGhpcyBpcyB1c2VkIGJ5IGp1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlci48L3A+CisgICAgICogQHBhcmFtIHQgdGhlIHRlc3QuCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXN0Q2FzZU5hbWUoVGVzdCB0KSB7CisgICAgICAgIGlmICh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX1RFU1RfQ0FTRV9OQU1FOworICAgICAgICB9CisgICAgICAgIGlmICh0LmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhKVU5JVF9GUkFNRVdPUktfSlVOSVQ0X1RFU1RfQ0FTRV9GQUNBREUpKSB7CisgICAgICAgICAgICAvLyBTZWxmLWRlc2NyaWJpbmcgYXMgb2YgSlVuaXQgNCAoIzM4ODExKS4gQnV0IHRyaW0gIihDbGFzc05hbWUpIi4KKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdC50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIikiKSkgeworICAgICAgICAgICAgICAgIGludCBwYXJlbiA9IG5hbWUubGFzdEluZGV4T2YoJygnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgcGFyZW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFRlc3RDYXNlICYmIHRlc3RDYXNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSB0ZXN0Q2FzZU5hbWUuaW52b2tlKHQsIG5ldyBPYmplY3RbMF0pOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGlnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTWV0aG9kIGdldE5hbWVNZXRob2QgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGdldE5hbWVNZXRob2QgPQorICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0TmFtZSIsIG5ldyBDbGFzcyBbMF0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGdldE5hbWVNZXRob2QgPSB0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzIFswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChnZXROYW1lTWV0aG9kICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgZ2V0TmFtZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgPT0gU3RyaW5nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBnZXROYW1lTWV0aG9kLmludm9rZSh0LCBuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgaWdub3JlZCkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBVTktOT1dOX1RFU1RfQ0FTRV9OQU1FOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIGZpbmQgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHdoaWNoIGEgdGVzdCByZXByZXNlbnRzCisgICAgICogYWNyb3NzIEpVbml0IDMgYW5kIDQuIEZvciBKdW5pdDQgaXQgcGFyc2VzIHRoZSB0b1N0cmluZygpIHZhbHVlIG9mIHRoZQorICAgICAqIHRlc3QsIGFuZCBleHRyYWN0cyBpdCBmcm9tIHRoZXJlLgorICAgICAqIEBzaW5jZSBBbnQgMS43LjEgKGl0IHdhcyBwcml2YXRlIHVudGlsIHRoZW4pCisgICAgICogQHBhcmFtIHRlc3QgdGVzdCBjYXNlIHRvIGxvb2sgYXQKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRyYWN0ZWQgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXN0Q2FzZUNsYXNzTmFtZShUZXN0IHRlc3QpIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHRlc3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgSlVuaXRUYXNrTWlycm9ySW1wbC5WbUV4aXRFcnJvclRlc3QpIHsKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9ICgoSlVuaXRUYXNrTWlycm9ySW1wbC5WbUV4aXRFcnJvclRlc3QpIHRlc3QpLmdldENsYXNzTmFtZSgpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgaWYgKGNsYXNzTmFtZS5lcXVhbHMoSlVOSVRfRlJBTUVXT1JLX0pVTklUNF9URVNUX0NBU0VfRkFDQURFKSkgeworICAgICAgICAgICAgLy8gSlVuaXQgNCB3cmFwcyBzb2xvIHRlc3RzIHRoaXMgd2F5LiBXZSBjYW4gZXh0cmFjdAorICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHRlc3QgbmFtZSB3aXRoIGEgbGl0dGxlIGhhY2suCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRlc3QudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGludCBwYXJlbiA9IG5hbWUubGFzdEluZGV4T2YoJygnKTsKKyAgICAgICAgICAgIGlmIChwYXJlbiAhPSAtMSAmJiBuYW1lLmVuZHNXaXRoKCIpIikpIHsKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBuYW1lLnN1YnN0cmluZyhwYXJlbiArIDEsIG5hbWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvT3V0RXJyU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9PdXRFcnJTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGRjMTZjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvT3V0RXJyU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCisvKioKKyAqIFVzZWQgaW5zdGVhZCBvZiBTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIgaW4gZm9ya2VkIHRlc3RzIGlmCisgKiB3aXRoT3V0QW5kRXJyIGlzIHJlcXVlc3RlZC4KKyAqLworCitwdWJsaWMgY2xhc3MgT3V0RXJyU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyCisgICAgZXh0ZW5kcyBTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIgeworCisgICAgLyoqCisgICAgICogRW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0RXJyU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRXaXRoT3V0QW5kRXJyKHRydWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1BsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1BsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGRiNzMxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworCisvKioKKyAqIFByaW50cyBwbGFpbiB0ZXh0IG91dHB1dCBvZiB0aGUgdGVzdCB0byBhIHNwZWNpZmllZCBXcml0ZXIuCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBQbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyIGltcGxlbWVudHMgSlVuaXRSZXN1bHRGb3JtYXR0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIE9ORV9TRUNPTkQgPSAxMDAwLjA7CisKKyAgICAvKioKKyAgICAgKiBGb3JtYXR0ZXIgZm9yIHRpbWluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBOdW1iZXJGb3JtYXQgbmYgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKKyAgICAvKioKKyAgICAgKiBUaW1pbmcgaGVscGVyLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHRlc3RTdGFydHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgLyoqCisgICAgICogV2hlcmUgdG8gd3JpdGUgdGhlIGxvZyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7CisgICAgLyoqCisgICAgICogSGVscGVyIHRvIHN0b3JlIGludGVybWVkaWF0ZSBvdXRwdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdXcml0ZXIgaW5uZXI7CisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbGF5ZXIgb24gdG9wIG9mIHtAbGluayAjaW5uZXIgaW5uZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgd3JpOworICAgIC8qKgorICAgICAqIFN1cHByZXNzIGVuZFRlc3QgaWYgdGVzdGNhc2UgZmFpbGVkLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIGZhaWxlZCA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIHN5c3RlbU91dHB1dCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc3lzdGVtRXJyb3IgPSBudWxsOworCisgICAgLyoqIE5vIGFyZyBjb25zdHJ1Y3RvciAqLworICAgIHB1YmxpYyBQbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgeworICAgICAgICBpbm5lciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgd3JpID0gbmV3IFByaW50V3JpdGVyKGlubmVyKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1PdXRwdXQoU3RyaW5nIG91dCkgeworICAgICAgICBzeXN0ZW1PdXRwdXQgPSBvdXQ7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtRXJyb3IoU3RyaW5nIGVycikgeworICAgICAgICBzeXN0ZW1FcnJvciA9IGVycjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd2hvbGUgdGVzdHN1aXRlIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIHN1aXRlIHRoZSB0ZXN0IHN1aXRlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gd3JpdGUgdGhlIG91dHB1dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIFF1aWNrIHJldHVybiAtIG5vIG91dHB1dCBkbyBub3RoaW5nLgorICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlRlc3RzdWl0ZTogIik7CisgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5nZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LndyaXRlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIG91dHB1dCIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3aG9sZSB0ZXN0c3VpdGUgZW5kZWQuCisgICAgICogQHBhcmFtIHN1aXRlIHRoZSB0ZXN0IHN1aXRlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gd3JpdGUgdGhlIG91dHB1dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlRlc3RzIHJ1bjogIik7CisgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5ydW5Db3VudCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIEZhaWx1cmVzOiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKHN1aXRlLmZhaWx1cmVDb3VudCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIEVycm9yczogIik7CisgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5lcnJvckNvdW50KCkpOworICAgICAgICBzYi5hcHBlbmQoIiwgVGltZSBlbGFwc2VkOiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKG5mLmZvcm1hdChzdWl0ZS5nZXRSdW5UaW1lKCkgLyBPTkVfU0VDT05EKSk7CisgICAgICAgIHNiLmFwcGVuZCgiIHNlYyIpOworICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworCisgICAgICAgIC8vIGFwcGVuZCB0aGUgZXJyIGFuZCBvdXRwdXQgc3RyZWFtcyB0byB0aGUgbG9nCisgICAgICAgIGlmIChzeXN0ZW1PdXRwdXQgIT0gbnVsbCAmJiBzeXN0ZW1PdXRwdXQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLSIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKHN5c3RlbU91dHB1dCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzeXN0ZW1FcnJvciAhPSBudWxsICYmIHN5c3RlbUVycm9yLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIEVycm9yIC0tLS0tLS0tLS0tLS0tLS0tIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoc3lzdGVtRXJyb3IpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLSIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworCisgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICB3cmkuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoaW5uZXIudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBvdXRwdXQiLCBpb2V4KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG91dCAhPSBTeXN0ZW0ub3V0ICYmIG91dCAhPSBTeXN0ZW0uZXJyKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIuCisgICAgICoKKyAgICAgKiA8cD5BIG5ldyBUZXN0IGlzIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIHQgdGhlIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdCkgeworICAgICAgICB0ZXN0U3RhcnRzLnB1dCh0LCBuZXcgTG9uZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOworICAgICAgICBmYWlsZWQucHV0KHQsIEJvb2xlYW4uRkFMU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIuCisgICAgICoKKyAgICAgKiA8cD5BIFRlc3QgaXMgZmluaXNoZWQuCisgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKKyAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoZmFpbGVkLmdldCh0ZXN0KSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHdyaSkgeworICAgICAgICAgICAgd3JpLnByaW50KCJUZXN0Y2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICsgSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlTmFtZSh0ZXN0KSk7CisgICAgICAgICAgICBMb25nIGwgPSAoTG9uZykgdGVzdFN0YXJ0cy5nZXQodGVzdCk7CisgICAgICAgICAgICBkb3VibGUgc2Vjb25kcyA9IDA7CisgICAgICAgICAgICAvLyBjYW4gYmUgbnVsbCBpZiBhbiBlcnJvciBvY2N1cnJlZCBpbiBzZXRVcAorICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlY29uZHMgPQorICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBsLmxvbmdWYWx1ZSgpKSAvIE9ORV9TRUNPTkQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdyaS5wcmludGxuKCIgdG9vayAiICsgbmYuZm9ybWF0KHNlY29uZHMpICsgIiBzZWMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIgZm9yIEpVbml0ICZsdDs9IDMuNC4KKyAgICAgKgorICAgICAqIDxwPkEgVGVzdCBmYWlsZWQuCisgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgZm9ybWF0RXJyb3IoIlx0RkFJTEVEIiwgdGVzdCwgdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lciBmb3IgSlVuaXQgJmd0OyAzLjQuCisgICAgICoKKyAgICAgKiA8cD5BIFRlc3QgZmFpbGVkLgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0LgorICAgICAqIEBwYXJhbSB0ICB0aGUgYXNzZXJ0aW9uIHRoYXQgZmFpbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7CisgICAgICAgIGFkZEZhaWx1cmUodGVzdCwgKFRocm93YWJsZSkgdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lci4KKyAgICAgKgorICAgICAqIDxwPkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHQgICAgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7CisgICAgICAgIGZvcm1hdEVycm9yKCJcdENhdXNlZCBhbiBFUlJPUiIsIHRlc3QsIHQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmb3JtYXRFcnJvcihTdHJpbmcgdHlwZSwgVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHdyaSkgeworICAgICAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVuZFRlc3QodGVzdCk7CisgICAgICAgICAgICAgICAgZmFpbGVkLnB1dCh0ZXN0LCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cmkucHJpbnRsbih0eXBlKTsKKyAgICAgICAgICAgIHdyaS5wcmludGxuKHQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBzdHJhY2UgPSBKVW5pdFRlc3RSdW5uZXIuZ2V0RmlsdGVyZWRUcmFjZSh0KTsKKyAgICAgICAgICAgIHdyaS5wcmludChzdHJhY2UpOworICAgICAgICAgICAgd3JpLnByaW50bG4oIiIpOworICAgICAgICB9CisgICAgfQorCit9IC8vIFBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1N1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlOTJjNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1N1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIFByaW50cyBzaG9ydCBzdW1tYXJ5IG91dHB1dCBvZiB0aGUgdGVzdCB0byBBbnQncyBsb2dnaW5nIHN5c3RlbS4KKyAqCisgKi8KKworcHVibGljIGNsYXNzIFN1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlcgorICAgIGltcGxlbWVudHMgSlVuaXRSZXN1bHRGb3JtYXR0ZXIsIEpVbml0VGFza01pcnJvci5TdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIE9ORV9TRUNPTkQgPSAxMDAwLjA7CisKKyAgICAvKioKKyAgICAgKiBGb3JtYXR0ZXIgZm9yIHRpbWluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBOdW1iZXJGb3JtYXQgbmYgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKKyAgICAvKioKKyAgICAgKiBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0OworCisgICAgcHJpdmF0ZSBib29sZWFuIHdpdGhPdXRBbmRFcnIgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBzeXN0ZW1PdXRwdXQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHN5c3RlbUVycm9yID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEVtcHR5CisgICAgICovCisgICAgcHVibGljIFN1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlcigpIHsKKyAgICB9CisgICAgLyoqCisgICAgICogVGhlIHRlc3RzdWl0ZSBzdGFydGVkLgorICAgICAqIEBwYXJhbSBzdWl0ZSB0aGUgdGVzdHN1aXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgeworICAgICAgICBTdHJpbmcgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiUnVubmluZyAiKTsKKyAgICAgICAgc2IuYXBwZW5kKHN1aXRlLmdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LndyaXRlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgc3VtbWFyeSBvdXRwdXQiLCBpb2V4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBFbXB0eQorICAgICAqIEBwYXJhbSB0IG5vdCB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChUZXN0IHQpIHsKKyAgICB9CisgICAgLyoqCisgICAgICogRW1wdHkKKyAgICAgKiBAcGFyYW0gdGVzdCBub3QgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkgeworICAgIH0KKyAgICAvKioKKyAgICAgKiBFbXB0eQorICAgICAqIEBwYXJhbSB0ZXN0IG5vdCB1c2VkLgorICAgICAqIEBwYXJhbSB0IG5vdCB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgeworICAgIH0KKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgVGVzdExpc3RlbmVyIGZvciBKVW5pdCAmZ3Q7IDMuNC4KKyAgICAgKgorICAgICAqIDxwPkEgVGVzdCBmYWlsZWQuCisgICAgICogQHBhcmFtIHRlc3Qgbm90IHVzZWQuCisgICAgICogQHBhcmFtIHQgbm90IHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKKyAgICAgICAgYWRkRmFpbHVyZSh0ZXN0LCAoVGhyb3dhYmxlKSB0KTsKKyAgICB9CisgICAgLyoqCisgICAgICogRW1wdHkKKyAgICAgKiBAcGFyYW0gdGVzdCBub3QgdXNlZC4KKyAgICAgKiBAcGFyYW0gdCBub3QgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtT3V0cHV0KFN0cmluZyBvdXQpIHsKKyAgICAgICAgc3lzdGVtT3V0cHV0ID0gb3V0OworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUVycm9yKFN0cmluZyBlcnIpIHsKKyAgICAgICAgc3lzdGVtRXJyb3IgPSBlcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvdWxkIHRoZSBvdXRwdXQgdG8gU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyciBiZSB3cml0dGVuIHRvCisgICAgICogdGhlIHN1bW1hcnkuCisgICAgICogQHBhcmFtIHZhbHVlIGlmIHRydWUgd3JpdGUgU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyciB0byB0aGUgc3VtbWFyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaXRoT3V0QW5kRXJyKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgd2l0aE91dEFuZEVyciA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3aG9sZSB0ZXN0c3VpdGUgZW5kZWQuCisgICAgICogQHBhcmFtIHN1aXRlIHRoZSB0ZXN0c3VpdGUuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdHMgcnVuOiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKHN1aXRlLnJ1bkNvdW50KCkpOworICAgICAgICBzYi5hcHBlbmQoIiwgRmFpbHVyZXM6ICIpOworICAgICAgICBzYi5hcHBlbmQoc3VpdGUuZmFpbHVyZUNvdW50KCkpOworICAgICAgICBzYi5hcHBlbmQoIiwgRXJyb3JzOiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKHN1aXRlLmVycm9yQ291bnQoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBUaW1lIGVsYXBzZWQ6ICIpOworICAgICAgICBzYi5hcHBlbmQobmYuZm9ybWF0KHN1aXRlLmdldFJ1blRpbWUoKSAvIE9ORV9TRUNPTkQpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgc2VjIik7CisgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKKworICAgICAgICBpZiAod2l0aE91dEFuZEVycikgeworICAgICAgICAgICAgaWYgKHN5c3RlbU91dHB1dCAhPSBudWxsICYmIHN5c3RlbU91dHB1dC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIk91dHB1dDoiKS5hcHBlbmQobmV3TGluZSkuYXBwZW5kKHN5c3RlbU91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuZXdMaW5lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN5c3RlbUVycm9yICE9IG51bGwgJiYgc3lzdGVtRXJyb3IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJFcnJvcjogIikuYXBwZW5kKG5ld0xpbmUpLmFwcGVuZChzeXN0ZW1FcnJvcikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuZXdMaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBzdW1tYXJ5IG91dHB1dCIsIGlvZXgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKG91dCAhPSBTeXN0ZW0ub3V0ICYmIG91dCAhPSBTeXN0ZW0uZXJyKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxDb25zdGFudHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNTZhYTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworLyoqCisgKiA8cD4gSW50ZXJmYWNlIGdyb3VwcyBYTUwgY29uc3RhbnRzLgorICogSW50ZXJmYWNlIHRoYXQgZ3JvdXBzIGFsbCBjb25zdGFudHMgdXNlZCB0aHJvdWdob3V0IHRoZSA8dHQ+WE1MPC90dD4KKyAqIGRvY3VtZW50cyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIDx0dD5YTUxKVW5pdFJlc3VsdEZvcm1hdHRlcjwvdHQ+LgorICogPHA+CisgKiBBcyBvZiBub3cgdGhlIERURCBpczoKKyAqIDxjb2RlPjxwcmU+CisgKiAmbHQ7IUVMRU1FTlQgdGVzdHN1aXRlcyAodGVzdHN1aXRlKikmZ3Q7CisgKgorICogJmx0OyFFTEVNRU5UIHRlc3RzdWl0ZSAocHJvcGVydGllcywgdGVzdGNhc2UqLAorICogICAgICAgICAgICAgICAgICAgIGZhaWx1cmU/LCBlcnJvcj8sCisgKiAgICAgICAgICAgICAgICAgICAgIHN5c3RlbS1vdXQ/LCBzeXN0ZW0tZXJyPykmZ3Q7CisgKiAmbHQ7IUFUVExJU1QgdGVzdHN1aXRlIG5hbWUgICAgICBDREFUQSAjUkVRVUlSRUQmZ3Q7CisgKiAmbHQ7IUFUVExJU1QgdGVzdHN1aXRlIHRlc3RzICAgICBDREFUQSAjUkVRVUlSRUQmZ3Q7CisgKiAmbHQ7IUFUVExJU1QgdGVzdHN1aXRlIGZhaWx1cmVzICBDREFUQSAjUkVRVUlSRUQmZ3Q7CisgKiAmbHQ7IUFUVExJU1QgdGVzdHN1aXRlIGVycm9ycyAgICBDREFUQSAjUkVRVUlSRUQmZ3Q7CisgKiAmbHQ7IUFUVExJU1QgdGVzdHN1aXRlIHRpbWUgICAgICBDREFUQSAjUkVRVUlSRUQmZ3Q7CisgKiAmbHQ7IUFUVExJU1QgdGVzdHN1aXRlIHBhY2thZ2UgICBDREFUQSAjSU1QTElFRCZndDsKKyAqICZsdDshQVRUTElTVCB0ZXN0c3VpdGUgaWQgICAgICAgIENEQVRBICNJTVBMSUVEJmd0OworICoKKyAqCisgKiAmbHQ7IUVMRU1FTlQgcHJvcGVydGllcyAocHJvcGVydHkqKSZndDsKKyAqCisgKiAmbHQ7IUVMRU1FTlQgcHJvcGVydHkgRU1QVFkmZ3Q7CisgKiAgICZsdDshQVRUTElTVCBwcm9wZXJ0eSBuYW1lICBDREFUQSAjUkVRVUlSRUQmZ3Q7CisgKiAgICZsdDshQVRUTElTVCBwcm9wZXJ0eSB2YWx1ZSBDREFUQSAjUkVRVUlSRUQmZ3Q7CisgKgorICogJmx0OyFFTEVNRU5UIHRlc3RjYXNlIChmYWlsdXJlPywgZXJyb3I/KSZndDsKKyAqICAgJmx0OyFBVFRMSVNUIHRlc3RjYXNlIG5hbWUgICAgICAgQ0RBVEEgI1JFUVVJUkVEJmd0OworICogICAmbHQ7IUFUVExJU1QgdGVzdGNhc2UgY2xhc3NuYW1lICBDREFUQSAjSU1QTElFRCZndDsKKyAqICAgJmx0OyFBVFRMSVNUIHRlc3RjYXNlIHRpbWUgICAgICAgQ0RBVEEgI1JFUVVJUkVEJmd0OworICoKKyAqICZsdDshRUxFTUVOVCBmYWlsdXJlICgjUENEQVRBKSZndDsKKyAqICAmbHQ7IUFUVExJU1QgZmFpbHVyZSBtZXNzYWdlIENEQVRBICNJTVBMSUVEJmd0OworICogICZsdDshQVRUTElTVCBmYWlsdXJlIHR5cGUgICAgQ0RBVEEgI1JFUVVJUkVEJmd0OworICoKKyAqICZsdDshRUxFTUVOVCBlcnJvciAoI1BDREFUQSkmZ3Q7CisgKiAgICZsdDshQVRUTElTVCBlcnJvciBtZXNzYWdlIENEQVRBICNJTVBMSUVEJmd0OworICogICAmbHQ7IUFUVExJU1QgZXJyb3IgdHlwZSAgICBDREFUQSAjUkVRVUlSRUQmZ3Q7CisgKgorICogJmx0OyFFTEVNRU5UIHN5c3RlbS1lcnIgKCNQQ0RBVEEpJmd0OworICoKKyAqICZsdDshRUxFTUVOVCBzeXN0ZW0tb3V0ICgjUENEQVRBKSZndDsKKyAqCisgKiA8L3ByZT48L2NvZGU+CisgKiBAc2VlIFhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyCisgKiBAc2VlIFhNTFJlc3VsdEFnZ3JlZ2F0b3IKKyAqLworLy8gQ2hlY2tTdHlsZTpJbnRlcmZhY2VJc1R5cGVDaGVjayBPRkYgKGJjKQorcHVibGljIGludGVyZmFjZSBYTUxDb25zdGFudHMgeworICAgIC8qKiB0aGUgdGVzdHN1aXRlcyBlbGVtZW50IGZvciB0aGUgYWdncmVnYXRlIGRvY3VtZW50ICovCisgICAgU3RyaW5nIFRFU1RTVUlURVMgPSAidGVzdHN1aXRlcyI7CisKKyAgICAvKiogdGhlIHRlc3RzdWl0ZSBlbGVtZW50ICovCisgICAgU3RyaW5nIFRFU1RTVUlURSA9ICJ0ZXN0c3VpdGUiOworCisgICAgLyoqIHRoZSB0ZXN0Y2FzZSBlbGVtZW50ICovCisgICAgU3RyaW5nIFRFU1RDQVNFID0gInRlc3RjYXNlIjsKKworICAgIC8qKiB0aGUgZXJyb3IgZWxlbWVudCAqLworICAgIFN0cmluZyBFUlJPUiA9ICJlcnJvciI7CisKKyAgICAvKiogdGhlIGZhaWx1cmUgZWxlbWVudCAqLworICAgIFN0cmluZyBGQUlMVVJFID0gImZhaWx1cmUiOworCisgICAgLyoqIHRoZSBzeXN0ZW0tZXJyIGVsZW1lbnQgKi8KKyAgICBTdHJpbmcgU1lTVEVNX0VSUiA9ICJzeXN0ZW0tZXJyIjsKKworICAgIC8qKiB0aGUgc3lzdGVtLW91dCBlbGVtZW50ICovCisgICAgU3RyaW5nIFNZU1RFTV9PVVQgPSAic3lzdGVtLW91dCI7CisKKyAgICAvKiogcGFja2FnZSBhdHRyaWJ1dGUgZm9yIHRoZSBhZ2dyZWdhdGUgZG9jdW1lbnQgKi8KKyAgICBTdHJpbmcgQVRUUl9QQUNLQUdFID0gInBhY2thZ2UiOworCisgICAgLyoqIG5hbWUgYXR0cmlidXRlIGZvciBwcm9wZXJ0eSwgdGVzdGNhc2UgYW5kIHRlc3RzdWl0ZSBlbGVtZW50cyAqLworICAgIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7CisKKyAgICAvKiogdGltZSBhdHRyaWJ1dGUgZm9yIHRlc3RjYXNlIGFuZCB0ZXN0c3VpdGUgZWxlbWVudHMgKi8KKyAgICBTdHJpbmcgQVRUUl9USU1FID0gInRpbWUiOworCisgICAgLyoqIGVycm9ycyBhdHRyaWJ1dGUgZm9yIHRlc3RzdWl0ZSBlbGVtZW50cyAqLworICAgIFN0cmluZyBBVFRSX0VSUk9SUyA9ICJlcnJvcnMiOworCisgICAgLyoqIGZhaWx1cmVzIGF0dHJpYnV0ZSBmb3IgdGVzdHN1aXRlIGVsZW1lbnRzICovCisgICAgU3RyaW5nIEFUVFJfRkFJTFVSRVMgPSAiZmFpbHVyZXMiOworCisgICAgLyoqIHRlc3RzIGF0dHJpYnV0ZSBmb3IgdGVzdHN1aXRlIGVsZW1lbnRzICovCisgICAgU3RyaW5nIEFUVFJfVEVTVFMgPSAidGVzdHMiOworCisgICAgLyoqIHR5cGUgYXR0cmlidXRlIGZvciBmYWlsdXJlIGFuZCBlcnJvciBlbGVtZW50cyAqLworICAgIFN0cmluZyBBVFRSX1RZUEUgPSAidHlwZSI7CisKKyAgICAvKiogbWVzc2FnZSBhdHRyaWJ1dGUgZm9yIGZhaWx1cmUgZWxlbWVudHMgKi8KKyAgICBTdHJpbmcgQVRUUl9NRVNTQUdFID0gIm1lc3NhZ2UiOworCisgICAgLyoqIHRoZSBwcm9wZXJ0aWVzIGVsZW1lbnQgKi8KKyAgICBTdHJpbmcgUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsKKworICAgIC8qKiB0aGUgcHJvcGVydHkgZWxlbWVudCAqLworICAgIFN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7CisKKyAgICAvKiogdmFsdWUgYXR0cmlidXRlIGZvciBwcm9wZXJ0eSBlbGVtZW50cyAqLworICAgIFN0cmluZyBBVFRSX1ZBTFVFID0gInZhbHVlIjsKKworICAgIC8qKiBjbGFzc25hbWUgYXR0cmlidXRlIGZvciB0ZXN0Y2FzZSBlbGVtZW50cyAqLworICAgIFN0cmluZyBBVFRSX0NMQVNTTkFNRSA9ICJjbGFzc25hbWUiOworCisgICAgLyoqIGlkIGF0dHJpYnV0ZSAqLworICAgIFN0cmluZyBBVFRSX0lEID0gImlkIjsKKworICAgIC8qKgorICAgICAqIHRpbWVzdGFtcCBvZiB0ZXN0IGNhc2VzCisgICAgICovCisgICAgU3RyaW5nIFRJTUVTVEFNUCA9ICJ0aW1lc3RhbXAiOworCisgICAgLyoqCisgICAgICogbmFtZSBvZiBob3N0IHJ1bm5pbmcgdGhlIHRlc3RzCisgICAgICovCisgICAgU3RyaW5nIEhPU1ROQU1FID0gImhvc3RuYW1lIjsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjIxY2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NRWxlbWVudFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRhdGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CisKKworLyoqCisgKiBQcmludHMgWE1MIG91dHB1dCBvZiB0aGUgdGVzdCB0byBhIHNwZWNpZmllZCBXcml0ZXIuCisgKgorICogQHNlZSBGb3JtYXR0ZXJFbGVtZW50CisgKi8KKworcHVibGljIGNsYXNzIFhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyIGltcGxlbWVudHMgSlVuaXRSZXN1bHRGb3JtYXR0ZXIsIFhNTENvbnN0YW50cyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgT05FX1NFQ09ORCA9IDEwMDAuMDsKKworICAgIC8qKiBjb25zdGFudCBmb3IgdW5ubmFtZWQgdGVzdHN1aXRlcy9jYXNlcyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOID0gInVua25vd24iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IoZXhjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBYTUwgZG9jdW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBEb2N1bWVudCBkb2M7CisgICAgLyoqCisgICAgICogVGhlIHdyYXBwZXIgZm9yIHRoZSB3aG9sZSB0ZXN0c3VpdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBFbGVtZW50IHJvb3RFbGVtZW50OworICAgIC8qKgorICAgICAqIEVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IHRlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgdGVzdEVsZW1lbnRzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIC8qKgorICAgICAqIHRlc3RzIHRoYXQgZmFpbGVkLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIGZhaWxlZFRlc3RzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIC8qKgorICAgICAqIFRpbWluZyBoZWxwZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgdGVzdFN0YXJ0cyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAvKioKKyAgICAgKiBXaGVyZSB0byB3cml0ZSB0aGUgbG9nIHRvLgorICAgICAqLworICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dDsKKworICAgIC8qKiBObyBhcmcgY29uc3RydWN0b3IuICovCisgICAgcHVibGljIFhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgeworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbU91dHB1dChTdHJpbmcgb3V0KSB7CisgICAgICAgIGZvcm1hdE91dHB1dChTWVNURU1fT1VULCBvdXQpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUVycm9yKFN0cmluZyBvdXQpIHsKKyAgICAgICAgZm9ybWF0T3V0cHV0KFNZU1RFTV9FUlIsIG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHdob2xlIHRlc3RzdWl0ZSBzdGFydGVkLgorICAgICAqIEBwYXJhbSBzdWl0ZSB0aGUgdGVzdHN1aXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgeworICAgICAgICBkb2MgPSBnZXREb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworICAgICAgICByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KFRFU1RTVUlURSk7CisgICAgICAgIFN0cmluZyBuID0gc3VpdGUuZ2V0TmFtZSgpOworICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9OQU1FLCBuID09IG51bGwgPyBVTktOT1dOIDogbik7CisKKyAgICAgICAgLy9hZGQgdGhlIHRpbWVzdGFtcAorICAgICAgICBmaW5hbCBTdHJpbmcgdGltZXN0YW1wID0gRGF0ZVV0aWxzLmZvcm1hdChuZXcgRGF0ZSgpLAorICAgICAgICAgICAgICAgIERhdGVVdGlscy5JU084NjAxX0RBVEVUSU1FX1BBVFRFUk4pOworICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoVElNRVNUQU1QLCB0aW1lc3RhbXApOworICAgICAgICAvL2FuZCB0aGUgaG9zdG5hbWUuCisgICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShIT1NUTkFNRSwgZ2V0SG9zdG5hbWUoKSk7CisKKyAgICAgICAgLy8gT3V0cHV0IHByb3BlcnRpZXMKKyAgICAgICAgRWxlbWVudCBwcm9wc0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChQUk9QRVJUSUVTKTsKKyAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQocHJvcHNFbGVtZW50KTsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IHN1aXRlLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHByb3BzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJvcEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChQUk9QRVJUWSk7CisgICAgICAgICAgICAgICAgcHJvcEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfTkFNRSwgbmFtZSk7CisgICAgICAgICAgICAgICAgcHJvcEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfVkFMVUUsIHByb3BzLmdldFByb3BlcnR5KG5hbWUpKTsKKyAgICAgICAgICAgICAgICBwcm9wc0VsZW1lbnQuYXBwZW5kQ2hpbGQocHJvcEVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBsb2NhbCBob3N0bmFtZQorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxvY2FsIGhvc3QsIG9yICJsb2NhbGhvc3QiIGlmIHdlIGNhbm5vdCB3b3JrIGl0IG91dAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEhvc3RuYW1lKCkgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gImxvY2FsaG9zdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd2hvbGUgdGVzdHN1aXRlIGVuZGVkLgorICAgICAqIEBwYXJhbSBzdWl0ZSB0aGUgdGVzdHN1aXRlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kVGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfVEVTVFMsICIiICsgc3VpdGUucnVuQ291bnQoKSk7CisgICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0ZBSUxVUkVTLCAiIiArIHN1aXRlLmZhaWx1cmVDb3VudCgpKTsKKyAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfRVJST1JTLCAiIiArIHN1aXRlLmVycm9yQ291bnQoKSk7CisgICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgKKyAgICAgICAgICAgIEFUVFJfVElNRSwgIiIgKyAoc3VpdGUuZ2V0UnVuVGltZSgpIC8gT05FX1NFQ09ORCkpOworICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFdyaXRlciB3cmkgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cmkgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJVVEY4IikpOworICAgICAgICAgICAgICAgIHdyaS53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7CisgICAgICAgICAgICAgICAgKG5ldyBET01FbGVtZW50V3JpdGVyKCkpLndyaXRlKHJvb3RFbGVtZW50LCB3cmksIDAsICIgICIpOworICAgICAgICAgICAgICAgIHdyaS5mbHVzaCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgbG9nIGZpbGUiLCBleGMpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob3V0ICE9IFN5c3RlbS5vdXQgJiYgb3V0ICE9IFN5c3RlbS5lcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHdyaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lci4KKyAgICAgKgorICAgICAqIDxwPkEgbmV3IFRlc3QgaXMgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gdCB0aGUgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0KSB7CisgICAgICAgIHRlc3RTdGFydHMucHV0KHQsIG5ldyBMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lci4KKyAgICAgKgorICAgICAqIDxwPkEgVGVzdCBpcyBmaW5pc2hlZC4KKyAgICAgKiBAcGFyYW0gdGVzdCB0aGUgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkgeworICAgICAgICAvLyBGaXggZm9yIGJ1ZyAjNTYzNyAtIGlmIGEganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXAgaXMKKyAgICAgICAgLy8gdXNlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgc2V0VXAgdGhlbiBzdGFydFRlc3QKKyAgICAgICAgLy8gd291bGQgbmV2ZXIgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBpZiAoIXRlc3RTdGFydHMuY29udGFpbnNLZXkodGVzdCkpIHsKKyAgICAgICAgICAgIHN0YXJ0VGVzdCh0ZXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIEVsZW1lbnQgY3VycmVudFRlc3QgPSBudWxsOworICAgICAgICBpZiAoIWZhaWxlZFRlc3RzLmNvbnRhaW5zS2V5KHRlc3QpKSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdCA9IGRvYy5jcmVhdGVFbGVtZW50KFRFU1RDQVNFKTsKKyAgICAgICAgICAgIFN0cmluZyBuID0gSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlTmFtZSh0ZXN0KTsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0LnNldEF0dHJpYnV0ZShBVFRSX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9PSBudWxsID8gVU5LTk9XTiA6IG4pOworICAgICAgICAgICAgLy8gYSBUZXN0U3VpdGUgY2FuIGNvbnRhaW4gVGVzdHMgZnJvbSBtdWx0aXBsZSBjbGFzc2VzLAorICAgICAgICAgICAgLy8gZXZlbiB0ZXN0cyB3aXRoIHRoZSBzYW1lIG5hbWUgLSBkaXNhbWJpZ3VhdGUgdGhlbS4KKyAgICAgICAgICAgIGN1cnJlbnRUZXN0LnNldEF0dHJpYnV0ZShBVFRSX0NMQVNTTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlQ2xhc3NOYW1lKHRlc3QpKTsKKyAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGN1cnJlbnRUZXN0KTsKKyAgICAgICAgICAgIHRlc3RFbGVtZW50cy5wdXQodGVzdCwgY3VycmVudFRlc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VycmVudFRlc3QgPSAoRWxlbWVudCkgdGVzdEVsZW1lbnRzLmdldCh0ZXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIExvbmcgbCA9IChMb25nKSB0ZXN0U3RhcnRzLmdldCh0ZXN0KTsKKyAgICAgICAgY3VycmVudFRlc3Quc2V0QXR0cmlidXRlKEFUVFJfVElNRSwKKyAgICAgICAgICAgICIiICsgKChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQorICAgICAgICAgICAgICAgICAgIC0gbC5sb25nVmFsdWUoKSkgLyBPTkVfU0VDT05EKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIFRlc3RMaXN0ZW5lciBmb3IgSlVuaXQgJmx0Oz0gMy40LgorICAgICAqCisgICAgICogPHA+QSBUZXN0IGZhaWxlZC4KKyAgICAgKiBAcGFyYW0gdGVzdCB0aGUgdGVzdC4KKyAgICAgKiBAcGFyYW0gdCB0aGUgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgeworICAgICAgICBmb3JtYXRFcnJvcihGQUlMVVJFLCB0ZXN0LCB0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgVGVzdExpc3RlbmVyIGZvciBKVW5pdCAmZ3Q7IDMuNC4KKyAgICAgKgorICAgICAqIDxwPkEgVGVzdCBmYWlsZWQuCisgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIHQgdGhlIGFzc2VydGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgeworICAgICAgICBhZGRGYWlsdXJlKHRlc3QsIChUaHJvd2FibGUpIHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBUZXN0TGlzdGVuZXIuCisgICAgICoKKyAgICAgKiA8cD5BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIHRoZSB0ZXN0LgorICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0LgorICAgICAqIEBwYXJhbSB0IHRoZSBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7CisgICAgICAgIGZvcm1hdEVycm9yKEVSUk9SLCB0ZXN0LCB0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZm9ybWF0RXJyb3IoU3RyaW5nIHR5cGUsIFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgZW5kVGVzdCh0ZXN0KTsKKyAgICAgICAgICAgIGZhaWxlZFRlc3RzLnB1dCh0ZXN0LCB0ZXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIEVsZW1lbnQgbmVzdGVkID0gZG9jLmNyZWF0ZUVsZW1lbnQodHlwZSk7CisgICAgICAgIEVsZW1lbnQgY3VycmVudFRlc3QgPSBudWxsOworICAgICAgICBpZiAodGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdCA9IChFbGVtZW50KSB0ZXN0RWxlbWVudHMuZ2V0KHRlc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VycmVudFRlc3QgPSByb290RWxlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRUZXN0LmFwcGVuZENoaWxkKG5lc3RlZCk7CisKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgbmVzdGVkLnNldEF0dHJpYnV0ZShBVFRSX01FU1NBR0UsIHQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBuZXN0ZWQuc2V0QXR0cmlidXRlKEFUVFJfVFlQRSwgdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICAgICAgU3RyaW5nIHN0cmFjZSA9IEpVbml0VGVzdFJ1bm5lci5nZXRGaWx0ZXJlZFRyYWNlKHQpOworICAgICAgICBUZXh0IHRyYWNlID0gZG9jLmNyZWF0ZVRleHROb2RlKHN0cmFjZSk7CisgICAgICAgIG5lc3RlZC5hcHBlbmRDaGlsZCh0cmFjZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZvcm1hdE91dHB1dChTdHJpbmcgdHlwZSwgU3RyaW5nIG91dHB1dCkgeworICAgICAgICBFbGVtZW50IG5lc3RlZCA9IGRvYy5jcmVhdGVFbGVtZW50KHR5cGUpOworICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChuZXN0ZWQpOworICAgICAgICBuZXN0ZWQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihvdXRwdXQpKTsKKyAgICB9CisKK30gLy8gWE1MSlVuaXRSZXN1bHRGb3JtYXR0ZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTFJlc3VsdEFnZ3JlZ2F0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTFJlc3VsdEFnZ3JlZ2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTY3NGNjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MUmVzdWx0QWdncmVnYXRvci5qYXZhCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NRWxlbWVudFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisKKy8qKgorICogQWdncmVnYXRlcyBhbGwgJmx0O2p1bml0Jmd0OyBYTUwgZm9ybWF0dGVyIHRlc3RzdWl0ZSBkYXRhIHVuZGVyCisgKiBhIHNwZWNpZmljIGRpcmVjdG9yeSBhbmQgdHJhbnNmb3JtcyB0aGUgcmVzdWx0cyB2aWEgWFNMVC4KKyAqIEl0IGlzIG5vdCBwYXJ0aWN1bGFyeSBjbGVhbiBidXQKKyAqIHNob3VsZCBiZSBoZWxwZnVsIHdoaWxlIEkgYW0gdGhpbmtpbmcgYWJvdXQgYW5vdGhlciB0ZWNobmlxdWUuCisgKgorICogPHA+IFRoZSBtYWluIHByb2JsZW0gaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQgYSBKVk0gY2FuIGJlIGZvcmtlZCBmb3IgYSB0ZXN0Y2FzZQorICogdGh1cyBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0byBhZ2dyZWdhdGUgYWxsIHRlc3RjYXNlcyBzaW5jZSB0aGUgbGlzdGVuZXIgaXMKKyAqIChvYnZpb3VzbHkpIGluIHRoZSBmb3JrZWQgSlZNLiBBIHNvbHV0aW9uIGNvdWxkIGJlIHRvIHdyaXRlIGEKKyAqIFRlc3RMaXN0ZW5lciB0aGF0IHdpbGwgcmVjZWl2ZSBldmVudHMgZnJvbSB0aGUgVGVzdFJ1bm5lciB2aWEgc29ja2V0cy4gVGhpcworICogaXMgSU1ITyB0aGUgc2ltcGxlc3Qgd2F5IHRvIGRvIGl0IHRvIGF2b2lkIHRoaXMgZmlsZSBoYWNraW5nIHRoaW5nLgorICoKKyAqIEBhbnQudGFzayBuYW1lPSJqdW5pdHJlcG9ydCIgY2F0ZWdvcnk9InRlc3RpbmciCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxSZXN1bHRBZ2dyZWdhdG9yIGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIFhNTENvbnN0YW50cyB7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8qKiB0aGUgbGlzdCBvZiBhbGwgZmlsZXNldHMsIHRoYXQgc2hvdWxkIGNvbnRhaW5zIHRoZSB4bWwgdG8gYWdncmVnYXRlICovCisgICAgcHJvdGVjdGVkIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0IGZpbGUgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvRmlsZTsKKworICAgIC8qKiB0aGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBmaWxlIHRvICovCisgICAgcHJvdGVjdGVkIEZpbGUgdG9EaXI7CisKKyAgICBwcm90ZWN0ZWQgVmVjdG9yIHRyYW5zZm9ybWVycyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKiBUaGUgZGVmYXVsdCBkaXJlY3Rvcnk6IDx0dD4mIzA0Njs8L3R0Pi4gSXQgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcHJvamVjdCBkaXJlY3RvcnkgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RJUiA9ICIuIjsKKworICAgIC8qKiB0aGUgZGVmYXVsdCBmaWxlIG5hbWU6IDx0dD5URVNUUy1UZXN0U3VpdGVzLnhtbDwvdHQ+ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GSUxFTkFNRSA9ICJURVNUUy1UZXN0U3VpdGVzLnhtbCI7CisKKyAgICAvKiogdGhlIGN1cnJlbnQgZ2VuZXJhdGVkIGlkICovCisgICAgcHJvdGVjdGVkIGludCBnZW5lcmF0ZWRJZCA9IDA7CisKKyAgICAvKioKKyAgICAgKiB0ZXh0IGNoZWNrZWQgZm9yIGluIHRlc3RzLCB7QHZhbHVlfQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTklOR19JU19QT1NTSUJMWV9DT1JSVVBURUQKKyAgICAgICAgPSAiIGlzIG5vdCBhIHZhbGlkIFhNTCBkb2N1bWVudC4gSXQgaXMgcG9zc2libHkgY29ycnVwdGVkLiI7CisgICAgLyoqCisgICAgICogdGV4dCBjaGVja2VkIGZvciBpbiB0ZXN0cywge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkdfSU5WQUxJRF9ST09UX0VMRU1FTlQKKyAgICAgICAgPSAiIGlzIG5vdCBhIHZhbGlkIHRlc3RzdWl0ZSBYTUwgZG9jdW1lbnQiOworICAgIC8qKgorICAgICAqIHRleHQgY2hlY2tlZCBmb3IgaW4gdGVzdHMsIHtAdmFsdWV9CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX0VNUFRZX0ZJTEUKKyAgICAgICAgPSAiIGlzIGVtcHR5LlxuVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IHRoZSB0ZXN0IEpWTSBleGl0aW5nIHVuZXhwZWN0ZWRseSI7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGEgcmVwb3J0IGJhc2VkIG9uIHRoZSBkb2N1bWVudCBjcmVhdGVkIGJ5IHRoZSBtZXJnZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgQWdncmVnYXRlVHJhbnNmb3JtZXIgY3JlYXRlUmVwb3J0KCkgeworICAgICAgICBBZ2dyZWdhdGVUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG5ldyBBZ2dyZWdhdGVUcmFuc2Zvcm1lcih0aGlzKTsKKyAgICAgICAgdHJhbnNmb3JtZXJzLmFkZEVsZW1lbnQodHJhbnNmb3JtZXIpOworICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBhZ2dyZWdlZ2F0ZWQgcmVzdWx0cyBmaWxlLiBJdCBtdXN0IGJlIHJlbGF0aXZlCisgICAgICogZnJvbSB0aGUgPHR0PnRvZGlyPC90dD4gYXR0cmlidXRlLiBJZiBub3Qgc2V0IGl0IHdpbGwgdXNlIHtAbGluayAjREVGQVVMVF9GSUxFTkFNRX0KKyAgICAgKiBAcGFyYW0gIHZhbHVlICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICogQHNlZSAjc2V0VG9kaXIoRmlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb2ZpbGUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRvRmlsZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSByZXN1bHRzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBub3QKKyAgICAgKiBzZXQgaWYgd2lsbCB1c2Uge0BsaW5rICNERUZBVUxUX0RJUn0uIFdoZW4gZ2l2ZW4gYSByZWxhdGl2ZSBkaXJlY3RvcnkKKyAgICAgKiBpdCB3aWxsIHJlc29sdmUgaXQgZnJvbSB0aGUgcHJvamVjdCBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIHZhbHVlICAgIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdG8gd3JpdGUgdGhlIHJlc3VsdHMsIGFic29sdXRlIG9yCisgICAgICogcmVsYXRpdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG9kaXIoRmlsZSB2YWx1ZSkgeworICAgICAgICB0b0RpciA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBmaWxlc2V0IGNvbnRhaW5pbmcgdGhlIFhNTCByZXN1bHRzIHRvIGFnZ3JlZ2F0ZQorICAgICAqIEBwYXJhbSAgICBmcyAgICAgIHRoZSBuZXcgZmlsZXNldCBvZiB4bWwgcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlU2V0KEZpbGVTZXQgZnMpIHsKKyAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChmcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWdncmVnYXRlIGFsbCB0ZXN0c3VpdGVzIGludG8gYSBzaW5nbGUgZG9jdW1lbnQgYW5kIHdyaXRlIGl0IHRvIHRoZQorICAgICAqIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGZpbGUuCisgICAgICogQHRocm93cyAgQnVpbGRFeGNlcHRpb24gIHRocm93biBpZiB0aGVyZSBpcyBhIHNlcmlvdXMgZXJyb3Igd2hpbGUgd3JpdGluZworICAgICAqICAgICAgICAgIHRoZSBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGNyZWF0ZURvY3VtZW50KCk7CisgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBnZXREZXN0aW5hdGlvbkZpbGUoKTsKKyAgICAgICAgLy8gd3JpdGUgdGhlIGRvY3VtZW50CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZURPTVRyZWUocm9vdEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBkZXN0RmlsZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIHRlc3QgYWdncmVnYXRlIHRvICciICsgZGVzdEZpbGUgKyAiJyIsIGUpOworICAgICAgICB9CisgICAgICAgIC8vIGFwcGx5IHRyYW5zZm9ybWF0aW9uCisgICAgICAgIEVudW1lcmF0aW9uIGUgPSB0cmFuc2Zvcm1lcnMuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0KKyAgICAgICAgICAgICAgICAoQWdncmVnYXRlVHJhbnNmb3JtZXIpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFhtbERvY3VtZW50KHJvb3RFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7CisgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZnVsbCBkZXN0aW5hdGlvbiBmaWxlIHdoZXJlIHRvIHdyaXRlIHRoZSByZXN1bHQuIEl0IGlzIG1hZGUgb2YKKyAgICAgKiB0aGUgPHR0PnRvZGlyPC90dD4gYW5kIDx0dD50b2ZpbGU8L3R0PiBhdHRyaWJ1dGVzLgorICAgICAqIEByZXR1cm4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgd2hlcmUgc2hvdWxkIGJlIHdyaXR0ZW4gdGhlIHJlc3VsdCBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldERlc3RpbmF0aW9uRmlsZSgpIHsKKyAgICAgICAgaWYgKHRvRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0b0ZpbGUgPSBERUZBVUxUX0ZJTEVOQU1FOworICAgICAgICB9CisgICAgICAgIGlmICh0b0RpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0b0RpciA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShERUZBVUxUX0RJUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHRvRGlyLCB0b0ZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgPGNvZGU+LnhtbDwvY29kZT4gZmlsZXMgaW4gdGhlIGZpbGVzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsbCBmaWxlcyBpbiB0aGUgZmlsZXNldCB0aGF0IGVuZCB3aXRoIGEgJy54bWwnLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlW10gZ2V0RmlsZXMoKSB7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGZpbGVzZXRzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGYgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGYubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aG5hbWUgPSBmW2pdOworICAgICAgICAgICAgICAgIGlmIChwYXRobmFtZS5lbmRzV2l0aCgiLnhtbCIpKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRzLmdldEJhc2VkaXIoKSwgcGF0aG5hbWUpOworICAgICAgICAgICAgICAgICAgICBmaWxlID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KGZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlW3Yuc2l6ZSgpXTsKKyAgICAgICAgdi5jb3B5SW50byhmaWxlcyk7CisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKyAgICAvLy0tLS0tIGZyb20gbm93LCB0aGUgbWV0aG9kcyBhcmUgYWxsIHJlbGF0ZWQgdG8gRE9NIHRyZWUgbWFuaXB1bGF0aW9uCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgRE9NIHRyZWUgdG8gYSBmaWxlLgorICAgICAqIEBwYXJhbSBkb2MgdGhlIFhNTCBkb2N1bWVudCB0byBkdW1wIHRvIGRpc2suCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGVuYW1lIHRvIHdyaXRlIHRoZSBkb2N1bWVudCB0by4gU2hvdWxkIG9idmlvdXNsbHkgYmUgYSAueG1sIGZpbGUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgd3JpdGluZyB0aGUgY29udGVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZURPTVRyZWUoRG9jdW1lbnQgZG9jLCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworICAgICAgICBQcmludFdyaXRlciB3cmkgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgICAgIHdyaSA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURjgiKSk7CisgICAgICAgICAgICB3cmkud3JpdGUoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz5cbiIpOworICAgICAgICAgICAgKG5ldyBET01FbGVtZW50V3JpdGVyKCkpLndyaXRlKGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSwgd3JpLCAwLCAiICAiKTsKKyAgICAgICAgICAgIHdyaS5mbHVzaCgpOworICAgICAgICAgICAgLy8gd3JpdGVycyBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucywgc28gY2hlY2sgZm9yIHRoZW0uCisgICAgICAgICAgICBpZiAod3JpLmNoZWNrRXJyb3IoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3Igd2hpbGUgd3JpdGluZyBET00gY29udGVudCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHdyaSk7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPiBDcmVhdGUgYSBET00gdHJlZS4KKyAgICAgKiBIYXMgJ3Rlc3RzdWl0ZXMnIGFzIGZpcnN0Y2hpbGQgYW5kIGFnZ3JlZ2F0ZXMgYWxsCisgICAgICogdGVzdHN1aXRlIHJlc3VsdHMgdGhhdCBleGlzdHMgaW4gdGhlIGJhc2UgZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4gIHRoZSByb290IGVsZW1lbnQgb2YgRE9NIHRyZWUgdGhhdCBhZ2dyZWdhdGVzIGFsbCB0ZXN0c3VpdGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZURvY3VtZW50KCkgeworICAgICAgICAvLyBjcmVhdGUgdGhlIGRvbSB0cmVlCisgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZ2V0RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKKyAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KFRFU1RTVUlURVMpOworICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOworCisgICAgICAgIGdlbmVyYXRlZElkID0gMDsKKworICAgICAgICAvLyBnZXQgYWxsIGZpbGVzIGFuZCBhZGQgdGhlbSB0byB0aGUgZG9jdW1lbnQKKyAgICAgICAgRmlsZVtdIGZpbGVzID0gZ2V0RmlsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZXNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvZygiUGFyc2luZyBmaWxlOiAnIiArIGZpbGUgKyAiJyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIGlmIChmaWxlLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCB0ZXN0c3VpdGVEb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGJ1aWxkZXIucGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS50b1VSSShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW0gPSB0ZXN0c3VpdGVEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgUkVBTExZIGEgdGVzdHN1aXRlLgorICAgICAgICAgICAgICAgICAgICBpZiAoVEVTVFNVSVRFLmVxdWFscyhlbGVtLmdldE5vZGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRUZXN0U3VpdGUocm9vdEVsZW1lbnQsIGVsZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkSWQrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vd3Jvbmcgcm9vdCBlbGVtZW50IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzc3VlIGEgd2FybmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygidGhlIGZpbGUgIiArIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXQVJOSU5HX0lOVkFMSURfUk9PVF9FTEVNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygidGhlIGZpbGUgIiArIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdBUk5JTkdfRU1QVFlfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGEgdGVzdGNhc2UgbWlnaHQgaGF2ZSBmYWlsZWQgYW5kIHdyaXRlIGEgemVyby1sZW5ndGggZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgLy8gSXQgaGFzIGFscmVhZHkgZmFpbGVkLCBidXQgaGV5Li4uLiBtbS4ganVzdCBwdXQgYSB3YXJuaW5nCisgICAgICAgICAgICAgICAgbG9nKCJUaGUgZmlsZSAiICsgZmlsZSArIFdBUk5JTkdfSVNfUE9TU0lCTFlfQ09SUlVQVEVELCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICBsb2coU3RyaW5nVXRpbHMuZ2V0U3RhY2tUcmFjZShlKSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZygiRXJyb3Igd2hpbGUgYWNjZXNzaW5nIGZpbGUgIiArIGZpbGUgKyAiOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPiBBZGQgYSBuZXcgdGVzdHN1aXRlIG5vZGUgdG8gdGhlIGRvY3VtZW50LgorICAgICAqIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCBpdAorICAgICAqIHNwbGl0IHRoZSBwcmV2aW91cyBmdWxseSBxdWFsaWZpZWQgbmFtZSBpbnRvIGEgcGFja2FnZSBhbmQgYSBuYW1lLgorICAgICAqIDxwPiBGb3IgZXhhbXBsZTogPHR0Pm9yZy5hcGFjaGUuV2hhdGV2ZXI8L3R0PiB3aWxsIGJlIHNwbGl0IGludG8KKyAgICAgKiA8dHQ+b3JnLmFwYWNoZTwvdHQ+IGFuZCA8dHQ+V2hhdGV2ZXI8L3R0Pi4KKyAgICAgKiBAcGFyYW0gcm9vdCB0aGUgcm9vdCBlbGVtZW50IHRvIHdoaWNoIHRoZSA8dHQ+dGVzdHN1aXRlPC90dD4gbm9kZSBzaG91bGQKKyAgICAgKiAgICAgICAgYmUgYXBwZW5kZWQuCisgICAgICogQHBhcmFtIHRlc3RzdWl0ZSB0aGUgZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlIGdpdmVuIHJvb3QuIEl0IHdpbGwgc2xpZ2h0bHkKKyAgICAgKiAgICAgICAgbW9kaWZ5IHRoZSBvcmlnaW5hbCBub2RlIHRvIGNoYW5nZSB0aGUgbmFtZSBhdHRyaWJ1dGUgYW5kIGFkZAorICAgICAqICAgICAgICBhIHBhY2thZ2Ugb25lLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFRlc3RTdWl0ZShFbGVtZW50IHJvb3QsIEVsZW1lbnQgdGVzdHN1aXRlKSB7CisgICAgICAgIFN0cmluZyBmdWxsY2xhc3NuYW1lID0gdGVzdHN1aXRlLmdldEF0dHJpYnV0ZShBVFRSX05BTUUpOworICAgICAgICBpbnQgcG9zID0gZnVsbGNsYXNzbmFtZS5sYXN0SW5kZXhPZignLicpOworCisgICAgICAgIC8vIGEgbWlzc2luZyAuIG1pZ2h0IGltcGx5IG5vIHBhY2thZ2UgYXQgYWxsLiBEb24ndCBnZXQgZm9vbGVkLgorICAgICAgICBTdHJpbmcgcGtnTmFtZSA9IChwb3MgPT0gLTEpID8gIiIgOiBmdWxsY2xhc3NuYW1lLnN1YnN0cmluZygwLCBwb3MpOworICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKHBvcyA9PSAtMSkgPyBmdWxsY2xhc3NuYW1lIDogZnVsbGNsYXNzbmFtZS5zdWJzdHJpbmcocG9zICsgMSk7CisgICAgICAgIEVsZW1lbnQgY29weSA9IChFbGVtZW50KSBET01VdGlsLmltcG9ydE5vZGUocm9vdCwgdGVzdHN1aXRlKTsKKworICAgICAgICAvLyBtb2RpZnkgdGhlIG5hbWUgYXR0cmlidXRlIGFuZCBzZXQgdGhlIHBhY2thZ2UKKyAgICAgICAgY29weS5zZXRBdHRyaWJ1dGUoQVRUUl9OQU1FLCBjbGFzc25hbWUpOworICAgICAgICBjb3B5LnNldEF0dHJpYnV0ZShBVFRSX1BBQ0tBR0UsIHBrZ05hbWUpOworICAgICAgICBjb3B5LnNldEF0dHJpYnV0ZShBVFRSX0lELCBJbnRlZ2VyLnRvU3RyaW5nKGdlbmVyYXRlZElkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGRvY3VtZW50IGJ1aWxkZXIuIFdpbGwgaXNzdWUgYW4gPHR0PkV4Y2VwdGlvbkluaXRpYWxpemVyRXJyb3I8L3R0PgorICAgICAqIGlmIHNvbWV0aGluZyBpcyBnb2luZyB3cm9uZy4gSXQgaXMgZmF0YWwgYW55d2F5LgorICAgICAqIEB0b2RvIGZhY3Rvcml6ZSB0aGlzIHNvbWV3aGVyZSBlbHNlLiBJdCBpcyBkdXBsaWNhdGVkIGNvZGUuCisgICAgICogQHJldHVybiBhIG5ldyBkb2N1bWVudCBidWlsZGVyIHRvIGNyZWF0ZSBhIERPTQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yKGV4Yyk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hhbGFuMkV4ZWN1dG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YYWxhbjJFeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOGEwZTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YYWxhbjJFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3QgdXNlZCBieSB0aGUgZnJhbWV3b3JrIGFueSBtb3JlLgorICogV2UgcGxhbiB0byByZW1vdmUgaXQgaW4gQW50IDEuOAorICogQGRlcHJlY2F0ZWQgc2luY2UgQW50IDEuNworICoKKyAqCisgKiBAYW50LnRhc2sgaWdub3JlPSJ0cnVlIgorICovCitwdWJsaWMgY2xhc3MgWGFsYW4yRXhlY3V0b3IgZXh0ZW5kcyBYYWxhbkV4ZWN1dG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEFDID0gIm9yZy5hcGFjaGUueGFsYW4uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQyA9ICJjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uIjsKKworICAgIHByaXZhdGUgVHJhbnNmb3JtZXJGYWN0b3J5IHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRmYWN0b3J5LmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvY1ZlcnNpb24oU3RyaW5nIGNsYXNzTmFtZUltcGwpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB4YWxhbiAyCisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lSW1wbC5lcXVhbHMoQVBBQyArICJwcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCIpCisgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICBjbGFzc05hbWVJbXBsLmVxdWFscyhBUEFDICsgInhzbHQuWFNMVFByb2Nlc3NvckZhY3RvcnkiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRYYWxhblZlcnNpb24oQVBBQyArICJwcm9jZXNzb3IuWFNMUHJvY2Vzc29yVmVyc2lvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8geGFsYW4geHNsdGMKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWVJbXBsLmVxdWFscyhBUEFDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAieHNsdGMudHJheC5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0WFNMVENWZXJzaW9uKEFQQUMgKyAieHNsdGMuUHJvY2Vzc29yVmVyc2lvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gamRrIDEuNSB4c2x0YworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZUltcGwKKyAgICAgICAgICAgICAgICAuZXF1YWxzKFNQQUMgKyAiaW50ZXJuYWwueHNsdGMudHJheC5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0WFNMVENWZXJzaW9uKFNQQUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImludGVybmFsLnhzbHRjLlByb2Nlc3NvclZlcnNpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgYSB2YWxpZCBwcm9jZXNzb3IgdmVyc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW1wbGVtZW50YXRpb24gZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWVJbXBsKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIHByb2Nlc3NvciB2ZXJzaW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpbXBsZW1lbnRhdGlvbiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IGNhbGxlci5nZXRTdHlsZXNoZWV0U3lzdGVtSWQoKTsKKyAgICAgICAgU291cmNlIHhzbFNyYyA9IG5ldyBTdHJlYW1Tb3VyY2Uoc3lzdGVtSWQpOworICAgICAgICBUcmFuc2Zvcm1lciB0Zm9ybWVyID0gdGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoeHNsU3JjKTsKKyAgICAgICAgU291cmNlIHhtbFNyYyA9IG5ldyBET01Tb3VyY2UoY2FsbGVyLmRvY3VtZW50KTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0Zm9ybWVyLnNldFBhcmFtZXRlcigib3V0cHV0LmRpciIsIGNhbGxlci50b0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7CisgICAgICAgICAgICB0Zm9ybWVyLnRyYW5zZm9ybSh4bWxTcmMsIHJlc3VsdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWGFsYW5FeGVjdXRvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWGFsYW5FeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YWZlMDUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YYWxhbkV4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHVzZWQgYnkgdGhlIGZyYW1ld29yayBhbnkgbW9yZS4KKyAqIFdlIHBsYW4gdG8gcmVtb3ZlIGl0IGluIEFudCAxLjgKKyAqIEBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjcKKyAqCisgKi8KK2Fic3RyYWN0IGNsYXNzIFhhbGFuRXhlY3V0b3IgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFID0KKyAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LiI7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8qKiB0aGUgdHJhbnNmb3JtZXIgY2FsbGVyICovCisgICAgcHJvdGVjdGVkIEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyIGNhbGxlcjsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqIHNldCB0aGUgY2FsbGVyIGZvciB0aGlzIG9iamVjdC4gKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Q2FsbGVyKEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyIGNhbGxlcikgeworICAgICAgICB0aGlzLmNhbGxlciA9IGNhbGxlcjsKKyAgICB9CisKKyAgICAvKiogZ2V0IHRoZSBhcHByb3ByaWF0ZSBzdHJlYW0gYmFzZWQgb24gdGhlIGZvcm1hdCAoZnJhbWVzL25vZnJhbWVzKSAqLworICAgIHByb3RlY3RlZCBmaW5hbCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyLkZSQU1FUy5lcXVhbHMoY2FsbGVyLmZvcm1hdCkpIHsKKyAgICAgICAgICAgIC8vIGR1bW15IG91dHB1dCBmb3IgdGhlIGZyYW1lZCByZXBvcnQKKyAgICAgICAgICAgIC8vIGl0J3MgYWxsIGRvbmUgYnkgZXh0ZW5zaW9uLi4uCisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShjYWxsZXIudG9EaXIsICJqdW5pdC1ub2ZyYW1lcy5odG1sIikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBvdmVycmlkZSB0byBwZXJmb3JtIHRyYW5zZm9ybWF0aW9uICovCisgICAgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHZhbGlkIFhhbGFuIGV4ZWN1dG9yLiBJdCBjaGVja3MgaWYgWGFsYW4yIGlzCisgICAgICogcHJlc2VudC4gSWYgbm9uZSBpcyBhdmFpbGFibGUsIGl0IGZhaWxzLgorICAgICAqIEBwYXJhbSBjYWxsZXIgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRyYW5zZm9ybWF0aW9uIGluZm9ybWF0aW9uLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdGhyb3duIGlmIGl0IGNvdWxkIG5vdCBmaW5kIGEgdmFsaWQgeGFsYW4KKyAgICAgKiBleGVjdXRvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgWGFsYW5FeGVjdXRvciBuZXdJbnN0YW5jZShBZ2dyZWdhdGVUcmFuc2Zvcm1lciBjYWxsZXIpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFhhbGFuRXhlY3V0b3IgZXhlY3V0b3IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UgKyAiWGFsYW4yRXhlY3V0b3IiKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yID0gKFhhbGFuRXhlY3V0b3IpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4c2x0Y0FwYWNoZU1pc3NpbmcpIHsKKyAgICAgICAgICAgIGNhbGxlci50YXNrLmxvZyh4c2x0Y0FwYWNoZU1pc3NpbmcudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCB4c3RsYyBub3IgeGFsYW4yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaW4gdGhlIGNsYXNzcGF0aC4gQ2hlY2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4taiIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBjbGFzc05hbWVJbXBsID0gZXhlY3V0b3IuZ2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBleGVjdXRvci5nZXRQcm9jVmVyc2lvbihjbGFzc05hbWVJbXBsKTsKKyAgICAgICAgY2FsbGVyLnRhc2subG9nKCJVc2luZyAiICsgdmVyc2lvbiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIGV4ZWN1dG9yLnNldENhbGxlcihjYWxsZXIpOworICAgICAgICByZXR1cm4gZXhlY3V0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2RzIHNob3VsZCByZXR1cm4gdGhlIGNsYXNzbmFtZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHhzbHQgcHJvY2Vzc29yCisgICAgICogQHJldHVybiB0aGUgY2xhc3NuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgZm9yIGV4YW1wbGU6CisgICAgICogb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbAorICAgICAqIEBzZWUgI2dldFByb2NWZXJzaW9uKFN0cmluZykKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZGlzY292ZXIgdGhlIHhzbHQgcHJvY2Vzc29yIHZlcnNpb24gYmFzZWQgb24gdGhlCisgICAgICogY2xhc3NOYW1lLiBUaGVyZSBpcyBub3RoaW5nIGNhcnZlZCBpbiBzdG9uZSBhbmQgaXQgY2FuIGNoYW5nZQorICAgICAqIGFueXRpbWUsIHNvIHRoaXMgaXMganVzdCBmb3IgdGhlIHNha2Ugb2YgZ2l2aW5nIGFkZGl0aW9uYWwKKyAgICAgKiBpbmZvcm1hdGlvbiBpZiB3ZSBjYW4gZmluZCBpdC4KKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lSW1wbCB0aGUgY2xhc3NuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIHhzbHQgcHJvY2Vzc29yCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGltcGxlbWVudGF0aW9uIHZlcnNpb24uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvY1ZlcnNpb24oU3RyaW5nIGNsYXNzTmFtZUltcGwpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKworICAgIC8qKiBhIGJpdCBzaW1wbGlzdGljIGJ1dCB4c2x0YyBkYXRhIGFyZSBjb252ZW5pZW50bHkgcHJpdmF0ZSBub24gZmluYWwgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFhTTFRDVmVyc2lvbihTdHJpbmcgcHJvY1ZlcnNpb25DbGFzc05hbWUpCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdGhlcmUncyBhIGNvbnZlbmllbnQgeHNsdGMgY2xhc3MgdmVyc2lvbiBidXQgZGF0YSBhcmUKKyAgICAgICAgLy8gcHJpdmF0ZSBzbyB1c2UgcGFja2FnZSBpbmZvcm1hdGlvbgorICAgICAgICBDbGFzcyBwcm9jVmVyc2lvbiA9IENsYXNzLmZvck5hbWUocHJvY1ZlcnNpb25DbGFzc05hbWUpOworICAgICAgICBQYWNrYWdlIHBrZyA9IHByb2NWZXJzaW9uLmdldFBhY2thZ2UoKTsKKyAgICAgICAgcmV0dXJuIHBrZy5nZXROYW1lKCkgKyAiICIgKyBwa2cuZ2V0SW1wbGVtZW50YXRpb25UaXRsZSgpCisgICAgICAgICAgICArICIgIiArIHBrZy5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKTsKKyAgICB9CisKKyAgICAvKiogcHJldHR5IHVzZWZ1bCBkYXRhIChYYWxhbiB2ZXJzaW9uIGluZm9ybWF0aW9uKSB0byBkaXNwbGF5LiAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0WGFsYW5WZXJzaW9uKFN0cmluZyBwcm9jVmVyc2lvbkNsYXNzTmFtZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBDbGFzcyBwcm9jVmVyc2lvbiA9IENsYXNzLmZvck5hbWUocHJvY1ZlcnNpb25DbGFzc05hbWUpOworICAgICAgICBTdHJpbmcgcGtnID0gcHJvY1ZlcnNpb24uZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpZWxkIGYgPSBwcm9jVmVyc2lvbi5nZXRGaWVsZCgiU19WRVJTSU9OIik7CisgICAgICAgICAgICByZXR1cm4gcGtnICsgIiAiICsgZi5nZXQobnVsbCkudG9TdHJpbmcoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBwa2cgKyAiID8uPyI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvRGVmYXVsdE5hdGl2ZTJBc2NpaS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL0RlZmF1bHROYXRpdmUyQXNjaWkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDlmOGYzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL0RlZmF1bHROYXRpdmUyQXNjaWkuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uYXRpdmUyYXNjaWk7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5OYXRpdmUyQXNjaWk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogZW5jYXBzdWxhdGVzIHRoZSBoYW5kbGluZyBjb21tb24gdG8gZGlmZmVudCBOYXRpdmUyQXNjaWlhZGFwdGVyCisgKiBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogQHNpbmNlIEFudCAxLjYuMworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVmYXVsdE5hdGl2ZTJBc2NpaSBpbXBsZW1lbnRzIE5hdGl2ZTJBc2NpaUFkYXB0ZXIgeworCisgICAgLyoqIE5vLWFyZyBjb25zdHJ1Y3Rvci4gKi8KKyAgICBwdWJsaWMgRGVmYXVsdE5hdGl2ZTJBc2NpaSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGxpdHMgdGhlIHRhc2sgaW50byBzZXR0aW5nIHVwIHRoZSBjb21tYW5kIGxpbmUgc3dpdGNoZXMKKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgbmF0aXZlIDIgYXNjaWkgYXJndW1lbnRzLgorICAgICAqIEBwYXJhbSBzcmNGaWxlIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgdGhlIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICogQHJldHVybiBydW4gaWYgdGhlIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICogKGRlbGVnYXRlZCB0byB7QGxpbmsgI3NldHVwIHNldHVwfSksIGFkZGluZyB0aGUgZmlsZSBuYW1lcworICAgICAqIChkZWxlZ2F0ZWQgdG8ge0BsaW5rICNhZGRGaWxlcyBhZGRGaWxlc30pIGFuZCBydW5uaW5nIHRoZSB0b29sCisgICAgICogKGRlbGVnYXRlZCB0byB7QGxpbmsgI3J1biBydW59KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjb252ZXJ0KE5hdGl2ZTJBc2NpaSBhcmdzLCBGaWxlIHNyY0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc3RGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgc2V0dXAoY21kLCBhcmdzKTsKKyAgICAgICAgYWRkRmlsZXMoY21kLCBhcmdzLCBzcmNGaWxlLCBkZXN0RmlsZSk7CisgICAgICAgIHJldHVybiBydW4oY21kLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoZSBpbml0aWFsIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIDxwPm9ubHkgdGhlIC1lbmNvZGluZyBhcmd1bWVudCBhbmQgbmVzdGVkIGFyZyBlbGVtZW50cyBnZXQKKyAgICAgKiBoYW5kbGVkIGhlcmUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBDb21tYW5kIGxpbmUgdG8gYWRkIHRvCisgICAgICogQHBhcmFtIGFyZ3MgcHJvdmlkZXMgdGhlIHVzZXItc2V0dGluZyBhbmQgYWNjZXNzIHRvIEFudCdzCisgICAgICogbG9nZ2luZyBzeXN0ZW0uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldHVwKENvbW1hbmRsaW5lIGNtZCwgTmF0aXZlMkFzY2lpIGFyZ3MpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhcmdzLmdldEVuY29kaW5nKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1lbmNvZGluZyIpOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXJncy5nZXRFbmNvZGluZygpKTsKKyAgICAgICAgfQorICAgICAgICBjbWQuYWRkQXJndW1lbnRzKGFyZ3MuZ2V0Q3VycmVudEFyZ3MoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzb3VyY2UgYW5kIGRlc3QgZmlsZXMgdG8gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyB0aGVtIHdpdGhvdXQgYW55IGxlYWRpbmcKKyAgICAgKiBxdWFsaWZpZXJzLCBzb3VyY2UgZmlyc3QuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBDb21tYW5kIGxpbmUgdG8gYWRkIHRvCisgICAgICogQHBhcmFtIGxvZyBwcm92aWRlcyBhY2Nlc3MgdG8gQW50J3MgbG9nZ2luZyBzeXN0ZW0uCisgICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIGZpbGUKKyAgICAgKiBAcGFyYW0gZGVzdCB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGaWxlcyhDb21tYW5kbGluZSBjbWQsIFByb2plY3RDb21wb25lbnQgbG9nLCBGaWxlIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoc3JjKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShkZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgQ29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gbG9nIHByb3ZpZGVzIGFjY2VzcyB0byBBbnQncyBsb2dnaW5nIHN5c3RlbS4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgZXhlY3V0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJ1bihDb21tYW5kbGluZSBjbWQsIFByb2plY3RDb21wb25lbnQgbG9nKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvS2FmZmVOYXRpdmUyQXNjaWkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9LYWZmZU5hdGl2ZTJBc2NpaS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGQzNmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvS2FmZmVOYXRpdmUyQXNjaWkuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5hdGl2ZTJhc2NpaTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZUphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuTmF0aXZlMkFzY2lpOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisvKioKKyAqIEFkYXB0ZXIgdG8ga2FmZmUudG9vbHMubmF0aXZlMmFzY2lpLk5hdGl2ZTJBc2NpaS4KKyAqCisgKiBAc2luY2UgQW50IDEuNi4zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBLYWZmZU5hdGl2ZTJBc2NpaSBleHRlbmRzIERlZmF1bHROYXRpdmUyQXNjaWkgeworCisgICAgLy8gc29ydGVkIGJ5IG5ld2VzdCBLYWZmZSB2ZXJzaW9uIGZpcnN0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTjJBX0NMQVNTTkFNRVMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiZ251LmNsYXNzcGF0aC50b29scy5uYXRpdmUyYXNjaWkuTmF0aXZlMkFzY2lpIiwKKyAgICAgICAgLy8gcHJlIEthZmZlIDEuMS41CisgICAgICAgICJrYWZmZS50b29scy5uYXRpdmUyYXNjaWkuTmF0aXZlMkFzY2lpIiwKKyAgICB9OworCisgICAgLyoqCisgICAgICogSWRlbnRpZmllcyB0aGlzIGFkYXB0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fTkFNRSA9ICJrYWZmZSI7CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldHVwKENvbW1hbmRsaW5lIGNtZCwgTmF0aXZlMkFzY2lpIGFyZ3MpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhcmdzLmdldFJldmVyc2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCItcmV2ZXJzZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEthZmZlIik7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0dXAoY21kLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJ1bihDb21tYW5kbGluZSBjbWQsIFByb2plY3RDb21wb25lbnQgbG9nKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBFeGVjdXRlSmF2YSBlaiA9IG5ldyBFeGVjdXRlSmF2YSgpOworICAgICAgICBDbGFzcyBjID0gZ2V0TjJhQ2xhc3MoKTsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZG4ndCBsb2FkIEthZmZlJ3MgTmF0aXZlMkFzY2lpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjbGFzcyIpOworICAgICAgICB9CisKKyAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoYy5nZXROYW1lKCkpOworICAgICAgICBlai5zZXRKYXZhQ29tbWFuZChjbWQpOworICAgICAgICBlai5leGVjdXRlKGxvZy5nZXRQcm9qZWN0KCkpOworICAgICAgICAvLyBvdGhlcndpc2UgRXhlY3V0ZUphdmEgaGFzIHRocm93biBhbiBleGNlcHRpb24KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogdHJpZXMgdG8gbG9hZCBLYWZmZSBOYXRpdmUyQXNjaWkgYW5kIGZhbGxzIGJhY2sgdG8gdGhlIG9sZGVyCisgICAgICogY2xhc3MgbmFtZSBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bGwgaWYgbmVpdGhlciBjbGFzcyBjYW4gZ2V0IGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXROMmFDbGFzcygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOMkFfQ0xBU1NOQU1FUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShOMkFfQ0xBU1NOQU1FU1tpXSk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9OYXRpdmUyQXNjaWlBZGFwdGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvTmF0aXZlMkFzY2lpQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Yzg2NjgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvTmF0aXZlMkFzY2lpQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmF0aXZlMmFzY2lpOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLk5hdGl2ZTJBc2NpaTsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGFuIGFkYXB0ZXIgdG8gYSBuYXRpdmUyYXNjaWkgaW1wbGVtZW50YXRpb24uCisgKgorICogQHNpbmNlIEFudCAxLjYuMworICovCisvLyBDaGVja1N0eWxlOkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvckNoZWNrIE9GRiAoYmMpCitwdWJsaWMgaW50ZXJmYWNlIE5hdGl2ZTJBc2NpaUFkYXB0ZXIgeworICAgIC8qKgorICAgICAqIENvbnZlcnQgdGhlIGVuY29kaW5nIG9mIHNyY0ZpbGUgd3JpdGluZyB0byBkZXN0RmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIFRhc2sgdGhhdCBob2xkcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBhbGxvd3MKKyAgICAgKiB0aGUgaW1wbGVtZW50YXRpb24gdG8gc2VuZCBtZXNzYWdlcyB0byBBbnQncyBsb2dnaW5nIHN5c3RlbQorICAgICAqIEBwYXJhbSBzcmNGaWxlIHRoZSBzb3VyY2UgdG8gY29udmVydAorICAgICAqIEBwYXJhbSBkZXN0RmlsZSB3aGVyZSB0byBzZW5kIG91dHB1dCB0bworICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgY29udmVyc2lvbiBoYXMgYmVlbiBzdWNjZXNzZnVsLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBib29sZWFuIGNvbnZlcnQoTmF0aXZlMkFzY2lpIGFyZ3MsIEZpbGUgc3JjRmlsZSwgRmlsZSBkZXN0RmlsZSkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL05hdGl2ZTJBc2NpaUFkYXB0ZXJGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvTmF0aXZlMkFzY2lpQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJhZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL05hdGl2ZTJBc2NpaUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uYXRpdmUyYXNjaWk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ2xhc3NwYXRoVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CisKKy8qKgorICogQ3JlYXRlcyB0aGUgTmF0aXZlMkFzY2lpQWRhcHRlciBiYXNlZCBvbiB0aGUgdXNlciBjaG9pY2UgYW5kCisgKiBwb3RlbnRpYWxseSB0aGUgVk0gdmVuZG9yLgorICoKKyAqIEBzaW5jZSBBbnQgMS42LjMKKyAqLworLy8gQ2hlY2tTdHlsZTpIaWRlVXRpbGl0eUNsYXNzQ29uc3RydWN0b3JDaGVjayBPRkYgKGJjKQorcHVibGljIGNsYXNzIE5hdGl2ZTJBc2NpaUFkYXB0ZXJGYWN0b3J5IHsKKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgdGhlIGRlZmF1bHQgY2hvaWNlIG9mIGFkYXB0ZXIgYmFzZWQgb24gdGhlIFZNCisgICAgICogdmVuZG9yLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBjaG9pY2Ugb2YgYWRhcHRlciBiYXNlZCBvbiB0aGUgVk0KKyAgICAgKiB2ZW5kb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0KCkgeworICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzS2FmZmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIEthZmZlTmF0aXZlMkFzY2lpLklNUExFTUVOVEFUSU9OX05BTUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN1bk5hdGl2ZTJBc2NpaS5JTVBMRU1FTlRBVElPTl9OQU1FOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIE5hdGl2ZTJBc2NpaUFkYXB0ZXIgYmFzZWQgb24gdGhlIHVzZXIgY2hvaWNlIGFuZCAqCisgICAgICogcG90ZW50aWFsbHkgdGhlIFZNIHZlbmRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaG9pY2UgdGhlIHVzZXIgY2hvaWNlIChpZiBhbnkpLgorICAgICAqIEBwYXJhbSBsb2cgYSBQcm9qZWN0Q29tcG9uZW50IGluc3RhbmNlIHVzZWQgdG8gYWNjZXNzIEFudCdzCisgICAgICogbG9nZ2luZyBzeXN0ZW0uCisgICAgICogQHJldHVybiBUaGUgYWRhcHRlciB0byB1c2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTmF0aXZlMkFzY2lpQWRhcHRlciBnZXRBZGFwdGVyKFN0cmluZyBjaG9pY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdENvbXBvbmVudCBsb2cpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoSmF2YUVudlV0aWxzLmlzS2FmZmUoKSAmJiBjaG9pY2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHx8IEthZmZlTmF0aXZlMkFzY2lpLklNUExFTUVOVEFUSU9OX05BTUUuZXF1YWxzKGNob2ljZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgS2FmZmVOYXRpdmUyQXNjaWkoKTsKKyAgICAgICAgfSBlbHNlIGlmIChTdW5OYXRpdmUyQXNjaWkuSU1QTEVNRU5UQVRJT05fTkFNRS5lcXVhbHMoY2hvaWNlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdW5OYXRpdmUyQXNjaWkoKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaG9pY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzc05hbWUoY2hvaWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgZGVmYXVsdCBoYXMgYmVlbiBnb29kIGVub3VnaCB1bnRpbCBBbnQgMS42LjMsIHNvIHN0aWNrCisgICAgICAgIC8vIHdpdGggaXQKKyAgICAgICAgcmV0dXJuIG5ldyBTdW5OYXRpdmUyQXNjaWkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byByZXNvbHZlIHRoZSBnaXZlbiBjbGFzc25hbWUgaW50byBhIG5hdGl2ZTJhc2NpaSBhZGFwdGVyLgorICAgICAqIFRocm93cyBhIGZpdCBpZiBpdCBjYW4ndC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgdG8gYmUgY3JlYXRlZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIFRoaXMgaXMgdGhlIGZpdCB0aGF0IGlzIHRocm93biBpZiBjbGFzc05hbWUKKyAgICAgKiBpc24ndCBhbiBpbnN0YW5jZSBvZiBOYXRpdmUyQXNjaWlBZGFwdGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE5hdGl2ZTJBc2NpaUFkYXB0ZXIgcmVzb2x2ZUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKE5hdGl2ZTJBc2NpaUFkYXB0ZXIpIENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKGNsYXNzTmFtZSwKKyAgICAgICAgICAgIE5hdGl2ZTJBc2NpaUFkYXB0ZXJGYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICBOYXRpdmUyQXNjaWlBZGFwdGVyLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvU3VuTmF0aXZlMkFzY2lpLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvU3VuTmF0aXZlMkFzY2lpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxZGI3YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9TdW5OYXRpdmUyQXNjaWkuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5hdGl2ZTJhc2NpaTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLk5hdGl2ZTJBc2NpaTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBBZGFwdGVyIHRvIHN1bi50b29scy5uYXRpdmUyYXNjaWkuTWFpbi4KKyAqCisgKiBAc2luY2UgQW50IDEuNi4zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdW5OYXRpdmUyQXNjaWkgZXh0ZW5kcyBEZWZhdWx0TmF0aXZlMkFzY2lpIHsKKworICAgIC8qKgorICAgICAqIElkZW50aWZpZXMgdGhpcyBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVEFUSU9OX05BTUUgPSAic3VuIjsKKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXAoQ29tbWFuZGxpbmUgY21kLCBOYXRpdmUyQXNjaWkgYXJncykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFyZ3MuZ2V0UmV2ZXJzZSgpKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXJldmVyc2UiKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXR1cChjbWQsIGFyZ3MpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcnVuKENvbW1hbmRsaW5lIGNtZCwgUHJvamVjdENvbXBvbmVudCBsb2cpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBuMmFNYWluID0gQ2xhc3MuZm9yTmFtZSgic3VuLnRvb2xzLm5hdGl2ZTJhc2NpaS5NYWluIik7CisgICAgICAgICAgICBDbGFzc1tdIHBhcmFtID0gbmV3IENsYXNzW10ge1N0cmluZ1tdLmNsYXNzfTsKKyAgICAgICAgICAgIE1ldGhvZCBjb252ZXJ0ID0gbjJhTWFpbi5nZXRNZXRob2QoImNvbnZlcnQiLCBwYXJhbSk7CisgICAgICAgICAgICBpZiAoY29udmVydCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBjb252ZXJ0KCkgbWV0aG9kIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3VuLnRvb2xzLm5hdGl2ZTJhc2NpaS5NYWluIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPYmplY3QgbyA9IG4yYU1haW4ubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGNvbnZlcnQuaW52b2tlKG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NtZC5nZXRBcmd1bWVudHMoKX0pCisgICAgICAgICAgICAgICAgICAgICkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvL3JldGhyb3cKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vd3JhcAorICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHN0YXJ0aW5nIFN1bidzIG5hdGl2ZTJhc2NpaTogIiwgZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjkzYWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQLmphdmEKQEAgLTAsMCArMSwyNTcwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUEZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQUmVwbHk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGVsZXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJldHJ5SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJldHJ5YWJsZTsKKworLyoqCisgKiBCYXNpYyBGVFAgY2xpZW50LiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisgKiA8dWw+CisgKiAgIDxsaT4gPHN0cm9uZz5zZW5kPC9zdHJvbmc+IC0gc2VuZCBmaWxlcyB0byBhIHJlbW90ZSBzZXJ2ZXIuIFRoaXMgaXMgdGhlCisgKiAgIGRlZmF1bHQgYWN0aW9uLjwvbGk+CisgKiAgIDxsaT4gPHN0cm9uZz5nZXQ8L3N0cm9uZz4gLSByZXRyaWV2ZSBmaWxlcyBmcm9tIGEgcmVtb3RlIHNlcnZlci48L2xpPgorICogICA8bGk+IDxzdHJvbmc+ZGVsPC9zdHJvbmc+IC0gZGVsZXRlIGZpbGVzIGZyb20gYSByZW1vdGUgc2VydmVyLjwvbGk+CisgKiAgIDxsaT4gPHN0cm9uZz5saXN0PC9zdHJvbmc+IC0gY3JlYXRlIGEgZmlsZSBsaXN0aW5nLjwvbGk+CisgKiAgIDxsaT4gPHN0cm9uZz5jaG1vZDwvc3Ryb25nPiAtIGNoYW5nZSB1bml4IGZpbGUgcGVybWlzc2lvbnMuPC9saT4KKyAqICAgPGxpPiA8c3Ryb25nPnJtZGlyPC9zdHJvbmc+IC0gcmVtb3ZlIGRpcmVjdG9yaWVzLCBpZiBlbXB0eSwgZnJvbSBhCisgKiAgIHJlbW90ZSBzZXJ2ZXIuPC9saT4KKyAqIDwvdWw+CisgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFNvbWUgRlRQIHNlcnZlcnMgLSBub3RhYmx5IHRoZSBTb2xhcmlzIHNlcnZlciAtIHNlZW0KKyAqIHRvIGhvbGQgZGF0YSBwb3J0cyBvcGVuIGFmdGVyIGEgInJldHIiIG9wZXJhdGlvbiwgYWxsb3dpbmcgdGhlbSB0byB0aW1lb3V0CisgKiBpbnN0ZWFkIG9mIHNodXR0aW5nIHRoZW0gZG93biBjbGVhbmx5LiBUaGlzIGhhcHBlbnMgaW4gYWN0aXZlIG9yIHBhc3NpdmUKKyAqIG1vZGUsIGFuZCB0aGUgcG9ydHMgd2lsbCByZW1haW4gb3BlbiBldmVuIGFmdGVyIGVuZGluZyB0aGUgRlRQIHNlc3Npb24uIEZUUAorICogInNlbmQiIG9wZXJhdGlvbnMgc2VlbSB0byBjbG9zZSBwb3J0cyBpbW1lZGlhdGVseS4gVGhpcyBiZWhhdmlvciBtYXkgY2F1c2UKKyAqIHByb2JsZW1zIG9uIHNvbWUgc3lzdGVtcyB3aGVuIGRvd25sb2FkaW5nIGxhcmdlIHNldHMgb2YgZmlsZXMuCisgKgorICogQHNpbmNlIEFudCAxLjMKKyAqLworcHVibGljIGNsYXNzIEZUUAorICAgICBleHRlbmRzIFRhc2sgeworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNFTkRfRklMRVMgPSAwOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEdFVF9GSUxFUyA9IDE7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVMX0ZJTEVTID0gMjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBMSVNUX0ZJTEVTID0gMzsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNS19ESVIgPSA0OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENITU9EID0gNTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSTV9ESVIgPSA2OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJVEVfQ01EID0gNzsKKyAgICAvKiogcmV0dXJuIGNvZGUgb2YgZnRwIC0gbm90IGltcGxlbWVudGVkIGluIGNvbW1vbnMtbmV0IHZlcnNpb24gMS4wICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPREVfNTIxID0gNTIxOworCisgICAgLyoqIGFkanVzdCB1cHRvZGF0ZSBjYWxjdWxhdGlvbnMgd2hlcmUgc2VydmVyIHRpbWVzdGFtcHMgYXJlIEhIOm1tIGFuZCBjbGllbnQncworICAgICAqIGFyZSBISDptbTpzcyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgR1JBTlVMQVJJVFlfTUlOVVRFID0gNjAwMDBMOworCisgICAgLyoqIERlZmF1bHQgcG9ydCBmb3IgRlRQICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9GVFBfUE9SVCA9IDIxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwcml2YXRlIFN0cmluZyByZW1vdGVkaXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyOworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJpZDsKKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKKyAgICBwcml2YXRlIFN0cmluZyBhY2NvdW50OworICAgIHByaXZhdGUgRmlsZSBsaXN0aW5nOworICAgIHByaXZhdGUgYm9vbGVhbiBiaW5hcnkgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBwYXNzaXZlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbmV3ZXJPbmx5ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBsb25nIHRpbWVEaWZmTWlsbGlzID0gMDsKKyAgICBwcml2YXRlIGxvbmcgZ3JhbnVsYXJpdHlNaWxsaXMgPSAwTDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdGltZURpZmZBdXRvID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgYWN0aW9uID0gU0VORF9GSUxFUzsKKyAgICBwcml2YXRlIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvciBkaXJDYWNoZSA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIGludCB0cmFuc2ZlcnJlZCA9IDA7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3RlRmlsZVNlcCA9ICIvIjsKKyAgICBwcml2YXRlIGludCBwb3J0ID0gREVGQVVMVF9GVFBfUE9SVDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcEZhaWxlZFRyYW5zZmVycyA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IHNraXBwZWQgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVOb25jcml0aWNhbEVycm9ycyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIGNobW9kID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyB1bWFzayA9IG51bGw7CisgICAgcHJpdmF0ZSBGVFBTeXN0ZW1UeXBlIHN5c3RlbVR5cGVLZXkgPSBGVFBTeXN0ZW1UeXBlLmdldERlZmF1bHQoKTsKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0RGF0ZUZvcm1hdENvbmZpZyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVjZW50RGF0ZUZvcm1hdENvbmZpZyA9IG51bGw7CisgICAgcHJpdmF0ZSBMYW5ndWFnZUNvZGUgc2VydmVyTGFuZ3VhZ2VDb2RlQ29uZmlnID0gTGFuZ3VhZ2VDb2RlLmdldERlZmF1bHQoKTsKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJUaW1lWm9uZUNvbmZpZyA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2hvcnRNb250aE5hbWVzQ29uZmlnID0gbnVsbDsKKyAgICBwcml2YXRlIEdyYW51bGFyaXR5IHRpbWVzdGFtcEdyYW51bGFyaXR5ID0gR3JhbnVsYXJpdHkuZ2V0RGVmYXVsdCgpOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbmZpZ3VyYXRpb25TZXQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCByZXRyaWVzQWxsb3dlZCA9IDA7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2l0ZUNvbW1hbmQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGluaXRpYWxTaXRlQ29tbWFuZCA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFDVElPTl9TVFJTID0geworICAgICAgICAic2VuZGluZyIsCisgICAgICAgICJnZXR0aW5nIiwKKyAgICAgICAgImRlbGV0aW5nIiwKKyAgICAgICAgImxpc3RpbmciLAorICAgICAgICAibWFraW5nIGRpcmVjdG9yeSIsCisgICAgICAgICJjaG1vZCIsCisgICAgICAgICJyZW1vdmluZyIsCisgICAgICAgICJzaXRlIgorICAgICAgICB9OworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01QTEVURURfQUNUSU9OX1NUUlMgPSB7CisgICAgICAgICJzZW50IiwKKyAgICAgICAgInJldHJpZXZlZCIsCisgICAgICAgICJkZWxldGVkIiwKKyAgICAgICAgImxpc3RlZCIsCisgICAgICAgICJjcmVhdGVkIGRpcmVjdG9yeSIsCisgICAgICAgICJtb2RlIGNoYW5nZWQiLAorICAgICAgICAicmVtb3ZlZCIsCisgICAgICAgICJzaXRlIGNvbW1hbmQgZXhlY3V0ZWQiCisgICAgICAgIH07CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFDVElPTl9UQVJHRVRfU1RSUyA9IHsKKyAgICAgICAgImZpbGVzIiwKKyAgICAgICAgImZpbGVzIiwKKyAgICAgICAgImZpbGVzIiwKKyAgICAgICAgImZpbGVzIiwKKyAgICAgICAgImRpcmVjdG9yeSIsCisgICAgICAgICJmaWxlcyIsCisgICAgICAgICJkaXJlY3RvcmllcyIsCisgICAgICAgICJzaXRlIGNvbW1hbmQiCisgICAgICAgIH07CisKKworICAgIC8qKgorICAgICAqIGludGVybmFsIGNsYXNzIGFsbG93aW5nIHRvIHJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgcmVtb3RlIGZpbGUgc3lzdGVtCisgICAgICogdXNpbmcgdGhlIEZUUCBwcm90b2NvbAorICAgICAqIHVzZWQgaW4gcGFydGljdWxhciBmb3IgZnRwIGdldCBvcGVyYXRpb25zCisgICAgICogZGlmZmVyZW5jZXMgd2l0aCBEaXJlY3RvcnlTY2FubmVyCisgICAgICogIiIgKHRoZSByb290IG9mIHRoZSBmaWxlc2V0KSBpcyBuZXZlciBpbmNsdWRlZCBpbiB0aGUgaW5jbHVkZWQgZGlyZWN0b3JpZXMKKyAgICAgKiBmb2xsb3dTeW1saW5rcyBkZWZhdWx0cyB0byBmYWxzZQorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBGVFBEaXJlY3RvcnlTY2FubmVyIGV4dGVuZHMgRGlyZWN0b3J5U2Nhbm5lciB7CisgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgICAgIHByb3RlY3RlZCBGVFBDbGllbnQgZnRwID0gbnVsbDsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgICAgICBwcml2YXRlIFN0cmluZyByb290UGF0aCA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNpbmNlIGFudCAxLjYKKyAgICAgICAgICogdGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBvbiBVTklYIGFuZCBjYW4gc2F2ZSBzY2FubmluZyB0aW1lCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3RlU3lzdGVtQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3RlU2Vuc2l0aXZpdHlDaGVja2VkID0gZmFsc2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNvbnN0cnVjdG9yCisgICAgICAgICAqIEBwYXJhbSBmdHAgIGZ0cGNsaWVudCBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGVFBEaXJlY3RvcnlTY2FubmVyKEZUUENsaWVudCBmdHApIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB0aGlzLmZ0cCA9IGZ0cDsKKyAgICAgICAgICAgIHRoaXMuc2V0Rm9sbG93U3ltbGlua3MoZmFsc2UpOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogc2NhbnMgdGhlIHJlbW90ZSBkaXJlY3RvcnksCisgICAgICAgICAqIHN0b3JpbmcgaW50ZXJuYWxseSB0aGUgaW5jbHVkZWQgZmlsZXMsIGRpcmVjdG9yaWVzLCAuLi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNjYW4oKSB7CisgICAgICAgICAgICBpZiAoaW5jbHVkZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIE5vIGluY2x1ZGVzIHN1cHBsaWVkLCBzbyBzZXQgaXQgdG8gJ21hdGNoZXMgYWxsJworICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgICAgICBpbmNsdWRlc1swXSA9ICIqKiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXhjbHVkZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4Y2x1ZGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsZXNJbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIGZpbGVzTm90SW5jbHVkZWQgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZGlyc0luY2x1ZGVkID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZGlyc05vdEluY2x1ZGVkID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZGlyc0V4Y2x1ZGVkID0gbmV3IFZlY3RvcigpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjd2QgPSBmdHAucHJpbnRXb3JraW5nRGlyZWN0b3J5KCk7CisgICAgICAgICAgICAgICAgLy8gYWx3YXlzIHN0YXJ0IGZyb20gdGhlIGN1cnJlbnQgZnRwIHdvcmtpbmcgZGlyCisgICAgICAgICAgICAgICAgZm9yY2VSZW1vdGVTZW5zaXRpdml0eUNoZWNrKCk7CisKKyAgICAgICAgICAgICAgICBjaGVja0luY2x1ZGVQYXR0ZXJucygpOworICAgICAgICAgICAgICAgIGNsZWFyQ2FjaGVzKCk7CisgICAgICAgICAgICAgICAgZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBzY2FuIEZUUCBzZXJ2ZXI6ICIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogdGhpcyByb3V0aW5lIGlzIGFjdHVhbGx5IGNoZWNraW5nIGFsbCB0aGUgaW5jbHVkZSBwYXR0ZXJucyBpbgorICAgICAgICAgKiBvcmRlciB0byBhdm9pZCBzY2FubmluZyBldmVyeXRoaW5nIHVuZGVyIGJhc2UgZGlyCisgICAgICAgICAqIEBzaW5jZSBhbnQxLjYKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0luY2x1ZGVQYXR0ZXJucygpIHsKKworICAgICAgICAgICAgSGFzaHRhYmxlIG5ld3Jvb3RzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgLy8gcHV0IGluIHRoZSBuZXdyb290cyB2ZWN0b3IgdGhlIGluY2x1ZGUgcGF0dGVybnMgd2l0aG91dAorICAgICAgICAgICAgLy8gd2lsZGNhcmQgdG9rZW5zCisgICAgICAgICAgICBmb3IgKGludCBpY291bnRlciA9IDA7IGljb3VudGVyIDwgaW5jbHVkZXMubGVuZ3RoOyBpY291bnRlcisrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5ld3BhdHRlcm4gPQorICAgICAgICAgICAgICAgICAgICBTZWxlY3RvclV0aWxzLnJ0cmltV2lsZGNhcmRUb2tlbnMoaW5jbHVkZXNbaWNvdW50ZXJdKTsKKyAgICAgICAgICAgICAgICBuZXdyb290cy5wdXQobmV3cGF0dGVybiwgaW5jbHVkZXNbaWNvdW50ZXJdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZW1vdGVkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZWRpciA9IGZ0cC5wcmludFdvcmtpbmdEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IHJlYWQgY3VycmVudCBmdHAgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFudEZUUEZpbGUgYmFzZUZUUEZpbGUgPSBuZXcgQW50RlRQUm9vdEZpbGUoZnRwLCByZW1vdGVkaXIpOworICAgICAgICAgICAgcm9vdFBhdGggPSBiYXNlRlRQRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBpdAorICAgICAgICAgICAgaWYgKG5ld3Jvb3RzLmNvbnRhaW5zS2V5KCIiKSkgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBnb2luZyB0byBzY2FuIGV2ZXJ5dGhpbmcgYW55d2F5CisgICAgICAgICAgICAgICAgc2NhbmRpcihyb290UGF0aCwgIiIsIHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IHNjYW4gZGlyZWN0b3JpZXMgdGhhdCBjYW4gaW5jbHVkZSBtYXRjaGVkIGZpbGVzIG9yCisgICAgICAgICAgICAgICAgLy8gZGlyZWN0b3JpZXMKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtMiA9IG5ld3Jvb3RzLmtleXMoKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtMi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudGVsZW1lbnQgPSAoU3RyaW5nKSBlbnVtMi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxwYXR0ZXJuID0gKFN0cmluZykgbmV3cm9vdHMuZ2V0KGN1cnJlbnRlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgQW50RlRQRmlsZSBteWZpbGUgPSBuZXcgQW50RlRQRmlsZShiYXNlRlRQRmlsZSwgY3VycmVudGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzT0sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRyYXZlcnNlc1N5bWxpbmtzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobXlmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVJlbW90ZVNlbnNpdGl2aXR5Q2hlY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdGVTZW5zaXRpdml0eUNoZWNrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZW1vdGVTeXN0ZW1DYXNlU2Vuc2l0aXZlICYmIGlzRm9sbG93U3ltbGlua3MoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvb2wgY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dlIGRvIG5vdCBuZWVkIHRvIHNjYW4gYWxsIHRoZSBzdWJkaXJzIGluIHRoZSByZWxhdGl2ZSBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG15ZmlsZS5nZXRGYXN0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBiZSBvbiBhIGNhc2UgaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW0uICBXZSB3YW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3VsdHMgdG8gc2hvdyB3aGF0J3MgcmVhbGx5IG9uIHRoZSBkaXNrLCBzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZG91YmxlIGNoZWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBteWZpbGUuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlc1N5bWxpbmtzID0gbXlmaWxlLmlzVHJhdmVyc2VTeW1saW5rcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIGNhdGNoIChJT0V4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oYmUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT0sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc09LID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRlbGVtZW50ID0gcGF0aC5yZXBsYWNlKHJlbW90ZUZpbGVTZXAuY2hhckF0KDApLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0ZvbGxvd1N5bWxpbmtzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmF2ZXJzZXNTeW1saW5rcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlZChjdXJyZW50ZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY3VycmVudGVsZW1lbnQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZERpcihjdXJyZW50ZWxlbWVudCwgbXlmaWxlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRlbGVtZW50Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRlbGVtZW50LmNoYXJBdChjdXJyZW50ZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IEZpbGUuc2VwYXJhdG9yQ2hhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRlbGVtZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGVsZW1lbnQgKyBGaWxlLnNlcGFyYXRvckNoYXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihteWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGN1cnJlbnRlbGVtZW50LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3JpZ2luYWxwYXR0ZXJuLmVxdWFscyhjdXJyZW50ZWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudEZvckluY2x1ZGVkRmlsZShjdXJyZW50ZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNDYXNlU2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBvcmlnaW5hbHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKGN1cnJlbnRlbGVtZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50Rm9ySW5jbHVkZWRGaWxlKGN1cnJlbnRlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIHNjYW5zIGEgcGFydGljdWxhciBkaXJlY3RvcnkKKyAgICAgICAgICogQHBhcmFtIGRpciBkaXJlY3RvcnkgdG8gc2NhbgorICAgICAgICAgKiBAcGFyYW0gdnBhdGggIHJlbGF0aXZlIHBhdGggdG8gdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSByZW1vdGUgZmlsZXNldAorICAgICAgICAgKiBhbHdheXMgZW5kZWQgd2l0aCBhIEZpbGUuc2VwYXJhdG9yCisgICAgICAgICAqIEBwYXJhbSBmYXN0IHNlZW1zIHRvIGJlIGFsd2F5cyB0cnVlIGluIHByYWN0aWNlCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuZGlyKFN0cmluZyBkaXIsIFN0cmluZyB2cGF0aCwgYm9vbGVhbiBmYXN0KSB7CisgICAgICAgICAgICAvLyBhdm9pZCBkb3VibGUgc2Nhbm5pbmcgb2YgZGlyZWN0b3JpZXMsIGNhbiBvbmx5IGhhcHBlbiBpbiBmYXN0IG1vZGUKKyAgICAgICAgICAgIGlmIChmYXN0ICYmIGhhc0JlZW5TY2FubmVkKHZwYXRoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCFmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShkaXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXRlUGF0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKCF2cGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlUGF0aCA9IHJvb3RQYXRoICsgcmVtb3RlRmlsZVNlcAorICAgICAgICAgICAgICAgICAgICAgICAgKyB2cGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgcmVtb3RlRmlsZVNlcC5jaGFyQXQoMCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlUGF0aCA9IHJvb3RQYXRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGVFBGaWxlW10gbmV3ZmlsZXMgPSBsaXN0RmlsZXMoY29tcGxldGVQYXRoLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobmV3ZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmdHAuY2hhbmdlVG9QYXJlbnREaXJlY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld2ZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEZUUEZpbGUgZmlsZSA9IG5ld2ZpbGVzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWZpbGUuZ2V0TmFtZSgpLmVxdWFscygiLiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWZpbGUuZ2V0TmFtZSgpLmVxdWFscygiLi4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb25pbmdBc0RpcmVjdG9yeShmdHAsIGRpciwgZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHZwYXRoICsgZmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzbG93U2NhbkFsbG93ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNGb2xsb3dTeW1saW5rcygpICYmIGZpbGUuaXNTeW1ib2xpY0xpbmsoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzRXhjbHVkZWQuYWRkRWxlbWVudChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvd1NjYW5BbGxvd2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0luY2x1ZGVkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZERpcihuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFudEZUUEZpbGUoZnRwLCBmaWxlLCBjb21wbGV0ZVBhdGgpICwgZmFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyc05vdEluY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0ICYmIGNvdWxkSG9sZEluY2x1ZGVkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZGlyKGZpbGUuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgRmlsZS5zZXBhcmF0b3IsIGZhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmFzdCAmJiBzbG93U2NhbkFsbG93ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihmaWxlLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgRmlsZS5zZXBhcmF0b3IsIGZhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB2cGF0aCArIGZpbGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNGb2xsb3dTeW1saW5rcygpICYmIGZpbGUuaXNTeW1ib2xpY0xpbmsoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uaW5nQXNGaWxlKGZ0cCwgZGlyLCBmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50Rm9ySW5jbHVkZWRGaWxlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmdHAuY2hhbmdlVG9QYXJlbnREaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHdoaWxlIGNvbW11bmljYXRpbmcgd2l0aCBGVFAgIgorICAgICAgICAgICAgICAgICAgICAgKyAic2VydmVyOiAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogcHJvY2VzcyBpbmNsdWRlZCBmaWxlCisgICAgICAgICAqIEBwYXJhbSBuYW1lICBwYXRoIG9mIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIGZpbGVzZXQKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBhY2NvdW50Rm9ySW5jbHVkZWRGaWxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBpZiAoIWZpbGVzSW5jbHVkZWQuY29udGFpbnMobmFtZSkKKyAgICAgICAgICAgICAgICAmJiAhZmlsZXNFeGNsdWRlZC5jb250YWlucyhuYW1lKSkgeworCisgICAgICAgICAgICAgICAgaWYgKGlzSW5jbHVkZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0luY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWxlc05vdEluY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHBhdGggb2YgdGhlIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IG9mCisgICAgICAgICAqIHRoZSBmaWxlc2V0CisgICAgICAgICAqIEBwYXJhbSBmaWxlIGRpcmVjdG9yeSBhcyBmaWxlCisgICAgICAgICAqIEBwYXJhbSBmYXN0CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYWNjb3VudEZvckluY2x1ZGVkRGlyKFN0cmluZyBuYW1lLCBBbnRGVFBGaWxlIGZpbGUsIGJvb2xlYW4gZmFzdCkgeworICAgICAgICAgICAgaWYgKCFkaXJzSW5jbHVkZWQuY29udGFpbnMobmFtZSkKKyAgICAgICAgICAgICAgICAmJiAhZGlyc0V4Y2x1ZGVkLmNvbnRhaW5zKG5hbWUpKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoIWlzRXhjbHVkZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzU3ltYm9saWNMaW5rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldENsaWVudCgpLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoZmlsZS5jdXJwd2QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjaGFuZ2UgZGlyZWN0b3J5IHRvIGN1cnB3ZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZGlyKGZpbGUuZ2V0TGluaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgRmlsZS5zZXBhcmF0b3IsIGZhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldENsaWVudCgpLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoZmlsZS5jdXJwd2QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjaGFuZ2UgZGlyZWN0b3J5IHRvIGN1cnB3ZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZGlyKGZpbGUuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgRmlsZS5zZXBhcmF0b3IsIGZhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRpcnNJbmNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRpcnNFeGNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdCAmJiBjb3VsZEhvbGRJbmNsdWRlZChuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldENsaWVudCgpLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoZmlsZS5jdXJwd2QpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIGRpcmVjdG9yeSB0byBjdXJwd2QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIoZmlsZS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKyBGaWxlLnNlcGFyYXRvciwgZmFzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIHRlbXBvcmFyeSB0YWJsZSB0byBzcGVlZCB1cCB0aGUgdmFyaW91cyBzY2FubmluZyBtZXRob2RzIGJlbG93CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE1hcCBmaWxlTGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBMaXN0IG9mIGFsbCBzY2FubmVkIGRpcmVjdG9yaWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTZXQgc2Nhbm5lZERpcnMgPSBuZXcgSGFzaFNldCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYXMgdGhlIGRpcmVjdG9yeSB3aXRoIHRoZSBnaXZlbiBwYXRoIHJlbGF0aXZlIHRvIHRoZSBiYXNlCisgICAgICAgICAqIGRpcmVjdG9yeSBhbHJlYWR5IGJlZW4gc2Nhbm5lZD8KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+UmVnaXN0ZXJzIHRoZSBnaXZlbiBkaXJlY3RvcnkgYXMgc2Nhbm5lZCBhcyBhIHNpZGUgZWZmZWN0LjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNCZWVuU2Nhbm5lZChTdHJpbmcgdnBhdGgpIHsKKyAgICAgICAgICAgIHJldHVybiAhc2Nhbm5lZERpcnMuYWRkKHZwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhciBpbnRlcm5hbCBjYWNoZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXJDYWNoZXMoKSB7CisgICAgICAgICAgICBmaWxlTGlzdE1hcC5jbGVhcigpOworICAgICAgICAgICAgc2Nhbm5lZERpcnMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogbGlzdCB0aGUgZmlsZXMgcHJlc2VudCBpbiBvbmUgZGlyZWN0b3J5LgorICAgICAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IGZ1bGwgcGF0aCBvbiB0aGUgcmVtb3RlIHNpZGUKKyAgICAgICAgICogQHBhcmFtIGNoYW5nZWRpciBpZiB0cnVlIGNoYW5nZSB0byBkaXJlY3RvcnkgZGlyZWN0b3J5IGJlZm9yZSBsaXN0aW5nCisgICAgICAgICAqIEByZXR1cm4gYXJyYXkgb2YgRlRQRmlsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZUUEZpbGVbXSBsaXN0RmlsZXMoU3RyaW5nIGRpcmVjdG9yeSwgYm9vbGVhbiBjaGFuZ2VkaXIpIHsKKyAgICAgICAgICAgIC8vZ2V0UHJvamVjdCgpLmxvZygibGlzdGluZyBmaWxlcyBpbiBkaXJlY3RvcnkgIiArIGRpcmVjdG9yeSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRQYXRoID0gZGlyZWN0b3J5OworICAgICAgICAgICAgaWYgKGNoYW5nZWRpcikgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoZGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gZnRwLnByaW50V29ya2luZ0RpcmVjdG9yeSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZUxpc3RNYXAuY29udGFpbnNLZXkoY3VycmVudFBhdGgpKSB7CisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiZmlsZWxpc3QgbWFwIHVzZWQgaW4gbGlzdGluZyBmaWxlcyIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChGVFBGaWxlW10pIGZpbGVMaXN0TWFwLmdldChjdXJyZW50UGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRlRQRmlsZVtdIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ0cC5saXN0RmlsZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsZUxpc3RNYXAucHV0KGN1cnJlbnRQYXRoLCByZXN1bHQpOworICAgICAgICAgICAgaWYgKCFyZW1vdGVTZW5zaXRpdml0eUNoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICBjaGVja1JlbW90ZVNlbnNpdGl2aXR5KHJlc3VsdCwgZGlyZWN0b3J5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZm9yY2VSZW1vdGVTZW5zaXRpdml0eUNoZWNrKCkgeworICAgICAgICAgICAgaWYgKCFyZW1vdGVTZW5zaXRpdml0eUNoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjaGVja1JlbW90ZVNlbnNpdGl2aXR5KGZ0cC5saXN0RmlsZXMoKSwgZnRwLnByaW50V29ya2luZ0RpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBjZCBpbnRvIG9uZSBkaXJlY3RvcnkgYW5kCisgICAgICAgICAqIGxpc3QgdGhlIGZpbGVzIHByZXNlbnQgaW4gb25lIGRpcmVjdG9yeS4KKyAgICAgICAgICogQHBhcmFtIGRpcmVjdG9yeSBmdWxsIHBhdGggb24gdGhlIHJlbW90ZSBzaWRlCisgICAgICAgICAqIEByZXR1cm4gYXJyYXkgb2YgRlRQRmlsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZUUEZpbGVbXSBsaXN0RmlsZXMoU3RyaW5nIGRpcmVjdG9yeSkgeworICAgICAgICAgICAgcmV0dXJuIGxpc3RGaWxlcyhkaXJlY3RvcnksIHRydWUpOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1JlbW90ZVNlbnNpdGl2aXR5KEZUUEZpbGVbXSBhcnJheSwgU3RyaW5nIGRpcmVjdG9yeSkgeworICAgICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIGNhbmRpZGF0ZUZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGljb3VudGVyID0gMDsgaWNvdW50ZXIgPCBhcnJheS5sZW5ndGg7IGljb3VudGVyKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaWNvdW50ZXJdICE9IG51bGwgJiYgYXJyYXlbaWNvdW50ZXJdLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheVtpY291bnRlcl0uZ2V0TmFtZSgpLmVxdWFscygiLiIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhYXJyYXlbaWNvdW50ZXJdLmdldE5hbWUoKS5lcXVhbHMoIi4uIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGZpZGRsZU5hbWUoYXJyYXlbaWNvdW50ZXJdLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJ3aWxsIHRyeSB0byBjZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXJnZXQgKyAiIHdoZXJlIGEgZGlyZWN0b3J5IGNhbGxlZCAiICsgYXJyYXlbaWNvdW50ZXJdLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleGlzdHMiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBwY291bnRlciA9IDA7IHBjb3VudGVyIDwgYXJyYXkubGVuZ3RoOyBwY291bnRlcisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W3Bjb3VudGVyXSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBjb3VudGVyICE9IGljb3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRhcmdldC5lcXVhbHMoYXJyYXlbcGNvdW50ZXJdLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlRm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYW5kaWRhdGVGb3VuZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coInRlc3RpbmcgY2FzZSBzZW5zaXRpdml0eSwgYXR0ZW1wdGluZyB0byBjZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRhcmdldCwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgICAgICByZW1vdGVTeXN0ZW1DYXNlU2Vuc2l0aXZlICA9ICFmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeSh0YXJnZXQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICByZW1vdGVTeXN0ZW1DYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoZGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJyZW1vdGUgc3lzdGVtIGlzIGNhc2Ugc2Vuc2l0aXZlIDogIiArIHJlbW90ZVN5c3RlbUNhc2VTZW5zaXRpdmUsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIHJlbW90ZVNlbnNpdGl2aXR5Q2hlY2tlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZmlkZGxlTmFtZShTdHJpbmcgb3JpZ2luKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaWNvdW50ZXIgPSAwOyBpY291bnRlciA8IG9yaWdpbi5sZW5ndGgoKTsgaWNvdW50ZXIrKykgeworICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uob3JpZ2luLmNoYXJBdChpY291bnRlcikpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKG9yaWdpbi5jaGFyQXQoaWNvdW50ZXIpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uob3JpZ2luLmNoYXJBdChpY291bnRlcikpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG9yaWdpbi5jaGFyQXQoaWNvdW50ZXIpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChvcmlnaW4uY2hhckF0KGljb3VudGVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBhbiBBbnRGVFBGaWxlIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYSByZW1vdGUgZmlsZQorICAgICAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEFudEZUUEZpbGUgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBmdHAgY2xpZW50CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByaXZhdGUgRlRQQ2xpZW50IGNsaWVudDsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBjdXJwd2Q7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIHRoZSBmaWxlIGl0c2VsZgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwcml2YXRlIEZUUEZpbGUgZnRwRmlsZTsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJpdmF0ZSBBbnRGVFBGaWxlIHBhcmVudCA9IG51bGw7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVsYXRpdmVQYXRoQ2FsY3VsYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlc1N5bWxpbmtzID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyByZWxhdGl2ZVBhdGggPSAiIjsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogY29uc3RydWN0b3IKKyAgICAgICAgICAgICAqIEBwYXJhbSBjbGllbnQgZnRwIGNsaWVudCB2YXJpYWJsZQorICAgICAgICAgICAgICogQHBhcmFtIGZ0cEZpbGUgdGhlIGZpbGUKKyAgICAgICAgICAgICAqIEBwYXJhbSBjdXJwd2QgYWJzb2x1dGUgcmVtb3RlIHBhdGggd2hlcmUgdGhlIGZpbGUgaXMgZm91bmQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIEFudEZUUEZpbGUoRlRQQ2xpZW50IGNsaWVudCwgRlRQRmlsZSBmdHBGaWxlLCBTdHJpbmcgY3VycHdkKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgdGhpcy5mdHBGaWxlID0gZnRwRmlsZTsKKyAgICAgICAgICAgICAgICB0aGlzLmN1cnB3ZCA9IGN1cnB3ZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogb3RoZXIgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBmaWxlCisgICAgICAgICAgICAgKiBAcGFyYW0gcGF0aCAgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBwYXJlbnQgZmlsZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgQW50RlRQRmlsZShBbnRGVFBGaWxlIHBhcmVudCwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IHBhcmVudC5jbGllbnQ7CisgICAgICAgICAgICAgICAgVmVjdG9yIHBhdGhFbGVtZW50cyA9IFNlbGVjdG9yVXRpbHMudG9rZW5pemVQYXRoKHBhdGgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdGhpcy5jbGllbnQuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShwYXJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGV4Y2VwdCBpZiBwYXJlbnQgaGFzIGJlZW4gZGVsZXRlZCBieSBhbm90aGVyIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnB3ZCA9IHBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHdvcmtpbmcgZGlyIHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyBwYXJlbnQuY3VycHdkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgZmNvdW50ID0gMDsgZmNvdW50IDwgcGF0aEVsZW1lbnRzLnNpemUoKSAtIDE7IGZjb3VudCsrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50UGF0aEVsZW1lbnQgPSAoU3RyaW5nKSBwYXRoRWxlbWVudHMuZWxlbWVudEF0KGZjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRoaXMuY2xpZW50LmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoY3VycmVudFBhdGhFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0ICYmICFpc0Nhc2VTZW5zaXRpdmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChyZW1vdGVTeXN0ZW1DYXNlU2Vuc2l0aXZlIHx8ICFyZW1vdGVTZW5zaXRpdml0eUNoZWNrZWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGF0aEVsZW1lbnQgPSBmaW5kUGF0aEVsZW1lbnRDYXNlVW5zZW5zaXRpdmUodGhpcy5jdXJwd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGhFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBhdGhFbGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycHdkID0gdGhpcy5jdXJwd2QgKyByZW1vdGVGaWxlU2VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50UGF0aEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHdvcmtpbmcgZGlyIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKFN0cmluZykgcGF0aEVsZW1lbnRzLmVsZW1lbnRBdChmY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gIiArIHRoaXMuY3VycHdkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0cGF0aGVsZW1lbnQgPSAoU3RyaW5nKSBwYXRoRWxlbWVudHMuZWxlbWVudEF0KHBhdGhFbGVtZW50cy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBGVFBGaWxlIFtdIHRoZUZpbGVzID0gbGlzdEZpbGVzKHRoaXMuY3VycHdkKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZ0cEZpbGUgPSBnZXRGaWxlKHRoZUZpbGVzLCBsYXN0cGF0aGVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBmaW5kIGEgZmlsZSBpbiBhIGRpcmVjdG9yeSBpbiBjYXNlIHVuc2Vuc2l0aXZlIHdheQorICAgICAgICAgICAgICogQHBhcmFtIHBhcmVudFBhdGggICAgICAgIHdoZXJlIHdlIGFyZQorICAgICAgICAgICAgICogQHBhcmFtIHNvdWdodFBhdGhFbGVtZW50IHdoYXQgaXMgYmVpbmcgc291Z2h0CisgICAgICAgICAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IGZpbGUgZm91bmQgb3IgbnVsbCBpZiBub3QgZm91bmQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZmluZFBhdGhFbGVtZW50Q2FzZVVuc2Vuc2l0aXZlKFN0cmluZyBwYXJlbnRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3VnaHRQYXRoRWxlbWVudCkgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBhbHJlYWR5IGluIHRoZSByaWdodCBwYXRoLCBzbyB0aGUgc2Vjb25kIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgIC8vIGlzIGZhbHNlCisgICAgICAgICAgICAgICAgRlRQRmlsZVtdIHRoZUZpbGVzID0gbGlzdEZpbGVzKHBhcmVudFBhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAodGhlRmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaWNvdW50ZXIgPSAwOyBpY291bnRlciA8IHRoZUZpbGVzLmxlbmd0aDsgaWNvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhlRmlsZXNbaWNvdW50ZXJdICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoZUZpbGVzW2ljb3VudGVyXS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShzb3VnaHRQYXRoRWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGVGaWxlc1tpY291bnRlcl0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBmaW5kIG91dCBpZiB0aGUgZmlsZSBleGlzdHMKKyAgICAgICAgICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGZpbGUgZXhpc3RzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZ0cEZpbGUgIT0gbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIGlmIHRoZSBmaWxlIGlzIGEgc3ltYm9saWMgbGluaywgZmluZCBvdXQgdG8gd2hhdCBpdCBpcyBwb2ludGluZworICAgICAgICAgICAgICogQHJldHVybiB0aGUgdGFyZ2V0IG9mIHRoZSBzeW1ib2xpYyBsaW5rCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnRwRmlsZS5nZXRMaW5rKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIGdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ0cEZpbGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBmaW5kIG91dCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICogQHJldHVybiBhYnNvbHV0ZSBwYXRoIGFzIHN0cmluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycHdkICsgcmVtb3RlRmlsZVNlcCArIGZ0cEZpbGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBmaW5kIG91dCB0aGUgcmVsYXRpdmUgcGF0aCBhc3N1bWluZyB0aGF0IHRoZSBwYXRoIHVzZWQgdG8gY29uc3RydWN0CisgICAgICAgICAgICAgKiB0aGlzIEFudEZUUEZpbGUgd2FzIHNwZWxsZWQgcHJvcGVybHkgd2l0aCByZWdhcmRzIHRvIGNhc2UuCisgICAgICAgICAgICAgKiBUaGlzIGlzIE9LIG9uIGEgY2FzZSBzZW5zaXRpdmUgc3lzdGVtIHN1Y2ggYXMgVU5JWAorICAgICAgICAgICAgICogQHJldHVybiByZWxhdGl2ZSBwYXRoCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFzdFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWJzUGF0aCA9IGdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChhYnNQYXRoLmluZGV4T2Yocm9vdFBhdGggKyByZW1vdGVGaWxlU2VwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYnNQYXRoLnN1YnN0cmluZyhyb290UGF0aC5sZW5ndGgoKSArIHJlbW90ZUZpbGVTZXAubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogZmluZCBvdXQgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3RQYXRoIG9mIHRoZSBlbmNsb3Npbmcgc2Nhbm5lci4KKyAgICAgICAgICAgICAqIHRoaXMgcmVsYXRpdmUgcGF0aCBpcyBzcGVsbGVkIGV4YWN0bHkgbGlrZSBvbiBkaXNrLAorICAgICAgICAgICAgICogZm9yIGluc3RhbmNlIGlmIHRoZSBBbnRGVFBGaWxlIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBhcyBBTFBIQSwKKyAgICAgICAgICAgICAqIGJ1dCB0aGUgZmlsZSBpcyByZWFsbHkgY2FsbGVkIGFscGhhLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbHBoYS4KKyAgICAgICAgICAgICAqIElmIGEgc3ltYm9saWMgbGluayBpcyBlbmNvdW50ZXJlZCwgaXQgaXMgZm9sbG93ZWQsIGJ1dCB0aGUgbmFtZSBvZiB0aGUgbGluaworICAgICAgICAgICAgICogcmF0aGVyIHRoYW4gdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAqIChpZSBkb2VzIG5vdCBiZWhhdmUgbGlrZSBGaWxlLmdldENhbm9uaWNhbFBhdGgoKSkKKyAgICAgICAgICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgcmVsYXRpdmUgcGF0aCwgc2VwYXJhdGVkIGJ5IHJlbW90ZUZpbGVTZXAKKyAgICAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgaWYgYSBjaGFuZ2UgZGlyZWN0b3J5IGZhaWxzLCAuLi4KKyAgICAgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgb25lIG9mIHRoZSBjb21wb25lbnRzIG9mIHRoZSByZWxhdGl2ZSBwYXRoIGNhbm5vdAorICAgICAgICAgICAgICogYmUgZm91bmQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKCFyZWxhdGl2ZVBhdGhDYWxjdWxhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VzU3ltbGlua3MgPSBwYXJlbnQuaXNUcmF2ZXJzZVN5bWxpbmtzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocGFyZW50LmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocm9vdFBhdGgsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aENhbGN1bGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIGdldCB0aGdlIHJlbGF0aXZlIHBhdGggb2YgdGhpcyBmaWxlCisgICAgICAgICAgICAgKiBAcGFyYW0gY3VycmVudFBhdGggICAgICAgICAgYmFzZSBwYXRoCisgICAgICAgICAgICAgKiBAcGFyYW0gY3VycmVudFJlbGF0aXZlUGF0aCAgcmVsYXRpdmUgcGF0aCBvZiB0aGUgYmFzZSBwYXRoIHdpdGggcmVnYXJkcyB0byByZW1vdGUgZGlyCisgICAgICAgICAgICAgKiBAcmV0dXJuIHJlbGF0aXZlIHBhdGgKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKFN0cmluZyBjdXJyZW50UGF0aCwgU3RyaW5nIGN1cnJlbnRSZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgICAgICAgICBWZWN0b3IgcGF0aEVsZW1lbnRzID0gU2VsZWN0b3JVdGlscy50b2tlbml6ZVBhdGgoZ2V0QWJzb2x1dGVQYXRoKCksIHJlbW90ZUZpbGVTZXApOworICAgICAgICAgICAgICAgIFZlY3RvciBwYXRoRWxlbWVudHMyID0gU2VsZWN0b3JVdGlscy50b2tlbml6ZVBhdGgoY3VycmVudFBhdGgsIHJlbW90ZUZpbGVTZXApOworICAgICAgICAgICAgICAgIFN0cmluZyByZWxQYXRoID0gY3VycmVudFJlbGF0aXZlUGF0aDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBwY291bnQgPSBwYXRoRWxlbWVudHMyLnNpemUoKTsgcGNvdW50IDwgcGF0aEVsZW1lbnRzLnNpemUoKTsgcGNvdW50KyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRFbGVtZW50ID0gKFN0cmluZykgcGF0aEVsZW1lbnRzLmVsZW1lbnRBdChwY291bnQpOworICAgICAgICAgICAgICAgICAgICBGVFBGaWxlW10gdGhlRmlsZXMgPSBsaXN0RmlsZXMoY3VycmVudFBhdGgpOworICAgICAgICAgICAgICAgICAgICBGVFBGaWxlIHRoZUZpbGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAodGhlRmlsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmlsZSA9IGdldEZpbGUodGhlRmlsZXMsIGN1cnJlbnRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbFBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVsUGF0aCA9IHJlbFBhdGggKyByZW1vdGVGaWxlU2VwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGVGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpdCBhIGhpZGRlbiBmaWxlIGFzc3VtZSBub3QgYSBzeW1saW5rCisgICAgICAgICAgICAgICAgICAgICAgICByZWxQYXRoID0gcmVsUGF0aCArIGN1cnJlbnRFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBjdXJyZW50UGF0aCArIHJlbW90ZUZpbGVTZXAgKyBjdXJyZW50RWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiSGlkZGVuIGZpbGUgIiArIHJlbFBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXNzdW1lZCB0byBub3QgYmUgYSBzeW1saW5rLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZXNTeW1saW5rcyA9IHRyYXZlcnNlc1N5bWxpbmtzIHx8IHRoZUZpbGUuaXNTeW1ib2xpY0xpbmsoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbFBhdGggPSByZWxQYXRoICsgdGhlRmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoICsgcmVtb3RlRmlsZVNlcCArIHRoZUZpbGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZWxQYXRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBmaW5kIGEgZmlsZSBtYXRjaGluZyBhIHN0cmluZyBpbiBhbiBhcnJheSBvZiBGVFBGaWxlLgorICAgICAgICAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBmaW5kICJhbHBoYSIgd2hlbiByZXF1ZXN0ZWQgZm9yICJBTFBIQSIKKyAgICAgICAgICAgICAqIGlmIGFuZCBvbmx5IGlmIHRoZSBjYXNlU2Vuc2l0aXZlIGF0dHJpYnV0ZSBpcyBzZXQgdG8gZmFsc2UuCisgICAgICAgICAgICAgKiBXaGVuIGNhc2VTZW5zaXRpdmUgaXMgc2V0IHRvIHRydWUsIG9ubHkgdGhlIGV4YWN0IG1hdGNoIGlzIHJldHVybmVkLgorICAgICAgICAgICAgICogQHBhcmFtIHRoZUZpbGVzICBhcnJheSBvZiBmaWxlcworICAgICAgICAgICAgICogQHBhcmFtIGxhc3RwYXRoZWxlbWVudCAgdGhlIGZpbGUgbmFtZSBiZWluZyBzb3VnaHQKKyAgICAgICAgICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQsIG90aGVyd2lzZSByZXR1cm4gdGhlIG1hdGNoaW5nIGZpbGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBGVFBGaWxlIGdldEZpbGUoRlRQRmlsZVtdIHRoZUZpbGVzLCBTdHJpbmcgbGFzdHBhdGhlbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGZjb3VudCA9IDA7IGZjb3VudCA8IHRoZUZpbGVzLmxlbmd0aDsgZmNvdW50KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzW2Zjb3VudF0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzW2Zjb3VudF0uZ2V0TmFtZSgpLmVxdWFscyhsYXN0cGF0aGVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoZUZpbGVzW2Zjb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nhc2VTZW5zaXRpdmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGVGaWxlc1tmY291bnRdLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RwYXRoZWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlRmlsZXNbZmNvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogdGVsbCBpZiBhIGZpbGUgaXMgYSBkaXJlY3RvcnkuCisgICAgICAgICAgICAgKiBub3RlIHRoYXQgaXQgd2lsbCByZXR1cm4gZmFsc2UgZm9yIHN5bWJvbGljIGxpbmtzIHBvaW50aW5nIHRvIGRpcmVjdG9yaWVzLgorICAgICAgICAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgZGlyZWN0b3JpZXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ0cEZpbGUuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogdGVsbCBpZiBhIGZpbGUgaXMgYSBzeW1ib2xpYyBsaW5rCisgICAgICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciBzeW1ib2xpYyBsaW5rcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bWJvbGljTGluaygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnRwRmlsZS5pc1N5bWJvbGljTGluaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiByZXR1cm4gdGhlIGF0dGFjaGVkIEZUUCBjbGllbnQgb2JqZWN0LgorICAgICAgICAgICAgICogV2FybmluZyA6IHRoaXMgaW5zdGFuY2UgaXMgcmVhbGx5IHNoYXJlZCB3aXRoIHRoZSBlbmNsb3NpbmcgY2xhc3MuCisgICAgICAgICAgICAgKiBAcmV0dXJuICBGVFAgY2xpZW50CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByb3RlY3RlZCBGVFBDbGllbnQgZ2V0Q2xpZW50KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogc2V0cyB0aGUgY3VycmVudCBwYXRoIG9mIGFuIEFudEZUUEZpbGUKKyAgICAgICAgICAgICAqIEBwYXJhbSBjdXJwd2QgdGhlIGN1cnJlbnQgcGF0aCBvbmUgd2FudHMgdG8gc2V0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldEN1cnB3ZChTdHJpbmcgY3VycHdkKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jdXJwd2QgPSBjdXJwd2Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIHJldHVybnMgdGhlIHBhdGggb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBBbnRGVFBGaWxlLgorICAgICAgICAgICAgICogb2YgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlsZSBpdHNlbGYgaW4gY2FzZSBvZiBBbnRGVFBSb290RmlsZQorICAgICAgICAgICAgICogQHJldHVybiBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBBbnRGVFBGaWxlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycHdkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjdXJwd2Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIGZpbmQgb3V0IGlmIGEgc3ltYm9saWMgbGluayBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGlzIGZpbGUKKyAgICAgICAgICAgICAqIGZyb20gcm9vdFBhdGguCisgICAgICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgc3ltYm9saWMgbGluayBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgcmVsYXRpdmUgcGF0aC4KKyAgICAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgb25lIG9mIHRoZSBjaGFuZ2UgZGlyZWN0b3J5IG9yIGRpcmVjdG9yeSBsaXN0aW5nIG9wZXJhdGlvbnMKKyAgICAgICAgICAgICAqIGZhaWxzCisgICAgICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGEgcGF0aCBjb21wb25lbnQgaW4gdGhlIHJlbGF0aXZlIHBhdGggY2Fubm90IGJlIGZvdW5kLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYXZlcnNlU3ltbGlua3MoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aENhbGN1bGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0UmVsYXRpdmVQYXRoIGFsc28gZmluZHMgYWJvdXQgc3ltbGlua3MKKyAgICAgICAgICAgICAgICAgICAgZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cmF2ZXJzZXNTeW1saW5rczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBHZXQgYSBzdHJpbmcgcmVwIG9mIHRoaXMgb2JqZWN0LgorICAgICAgICAgICAgICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBwd2QgYW5kIHRoZSBmaWxlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiQW50RnRwRmlsZTogIiArIGN1cnB3ZCArICIlIiArIGZ0cEZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIHNwZWNpYWwgY2xhc3MgdG8gcmVwcmVzZW50IHRoZSByZW1vdGUgZGlyZWN0b3J5IGl0c2VsZgorICAgICAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEFudEZUUFJvb3RGaWxlIGV4dGVuZHMgQW50RlRQRmlsZSB7CisgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3RlZGlyOworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICogQHBhcmFtIGFjbGllbnQgRlRQIGNsaWVudAorICAgICAgICAgICAgICogQHBhcmFtIHJlbW90ZWRpciByZW1vdGUgZGlyZWN0b3J5CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBwdWJsaWMgQW50RlRQUm9vdEZpbGUoRlRQQ2xpZW50IGFjbGllbnQsIFN0cmluZyByZW1vdGVkaXIpIHsKKyAgICAgICAgICAgICAgICAgc3VwZXIoYWNsaWVudCwgbnVsbCwgcmVtb3RlZGlyKTsKKyAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdGVkaXIgPSByZW1vdGVkaXI7CisgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsaWVudCgpLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkodGhpcy5yZW1vdGVkaXIpOworICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDdXJwd2QodGhpcy5nZXRDbGllbnQoKS5wcmludFdvcmtpbmdEaXJlY3RvcnkoKSk7CisgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIGZpbmQgdGhlIGFic29sdXRlIHBhdGgKKyAgICAgICAgICAgICAqIEByZXR1cm4gYWJzb2x1dGUgcGF0aAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJwd2QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogZmluZCBvdXQgdGhlIHJlbGF0aXZlIHBhdGggdG8gcm9vdAorICAgICAgICAgICAgICogQHJldHVybiBlbXB0eSBzdHJpbmcKKyAgICAgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWN0dWFsbHkgbmV2ZXIKKyAgICAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGFjdHVhbGx5IG5ldmVyCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBjaGVjayBGVFBGaWxlcyB0byBjaGVjayB3aGV0aGVyIHRoZXkgZnVuY3Rpb24gYXMgZGlyZWN0b3JpZXMgdG9vCisgICAgICogdGhlIEZUUEZpbGUgQVBJIHNlZW0gdG8gbWFrZSBkaXJlY3RvcnkgYW5kIHN5bWJvbGljIGxpbmtzIGluY29tcGF0aWJsZQorICAgICAqIHdlIHdhbnQgdG8gZmluZCBvdXQgaWYgd2UgY2FuIGNkIHRvIGEgc3ltYm9saWMgbGluaworICAgICAqIEBwYXJhbSBkaXIgIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlIHRvIHRlc3QKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byB0ZXN0CisgICAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGNkIHRvIHRoaXMgZGlyZWN0b3J5CisgICAgICogQHNpbmNlIGFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNGdW5jdGlvbmluZ0FzRGlyZWN0b3J5KEZUUENsaWVudCBmdHAsIFN0cmluZyBkaXIsIEZUUEZpbGUgZmlsZSkgeworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgICAgICBTdHJpbmcgY3VycmVudFdvcmtpbmdEaXIgPSBudWxsOworICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGN1cnJlbnRXb3JraW5nRGlyID0gZnRwLnByaW50V29ya2luZ0RpcmVjdG9yeSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coImNvdWxkIG5vdCBmaW5kIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgIiArIGRpcgorICAgICAgICAgICAgICAgICsgIiB3aGlsZSBjaGVja2luZyBhIHN5bWxpbmsiLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudFdvcmtpbmdEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShmaWxlLmdldExpbmsoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJjb3VsZCBub3QgY2QgdG8gIiArIGZpbGUuZ2V0TGluaygpICsgIiB3aGlsZSBjaGVja2luZyBhIHN5bWxpbmsiLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBjb21lYmFjayA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbWViYWNrID0gZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoY3VycmVudFdvcmtpbmdEaXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJjb3VsZCBub3QgY2QgYmFjayB0byAiICsgZGlyICsgIiB3aGlsZSBjaGVja2luZyBhIHN5bWxpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbWViYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjZCBiYWNrIHRvICIgKyBkaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2hpbGUgY2hlY2tpbmcgYSBzeW1saW5rIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgLyoqCisgICAgICogY2hlY2sgRlRQRmlsZXMgdG8gY2hlY2sgd2hldGhlciB0aGV5IGZ1bmN0aW9uIGFzIGRpcmVjdG9yaWVzIHRvbworICAgICAqIHRoZSBGVFBGaWxlIEFQSSBzZWVtIHRvIG1ha2UgZGlyZWN0b3J5IGFuZCBzeW1ib2xpYyBsaW5rcyBpbmNvbXBhdGlibGUKKyAgICAgKiB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHdlIGNhbiBjZCB0byBhIHN5bWJvbGljIGxpbmsKKyAgICAgKiBAcGFyYW0gZGlyICB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZmlsZSB0byB0ZXN0CisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gdGVzdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBjZCB0byB0aGlzIGRpcmVjdG9yeQorICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRnVuY3Rpb25pbmdBc0ZpbGUoRlRQQ2xpZW50IGZ0cCwgU3RyaW5nIGRpciwgRlRQRmlsZSBmaWxlKSB7CisgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIWlzRnVuY3Rpb25pbmdBc0RpcmVjdG9yeShmdHAsIGRpciwgZmlsZSk7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlbW90ZSBkaXJlY3Rvcnkgd2hlcmUgZmlsZXMgd2lsbCBiZSBwbGFjZWQuIFRoaXMgbWF5IGJlIGEKKyAgICAgKiByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoLCBhbmQgbXVzdCBiZSBpbiB0aGUgcGF0aCBzeW50YXggZXhwZWN0ZWQgYnkKKyAgICAgKiB0aGUgcmVtb3RlIHNlcnZlci4gTm8gY29ycmVjdGlvbiBvZiBwYXRoIHN5bnRheCB3aWxsIGJlIHBlcmZvcm1lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgdGhlIHJlbW90ZSBkaXJlY3RvcnkgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVkaXIoU3RyaW5nIGRpcikgeworICAgICAgICB0aGlzLnJlbW90ZWRpciA9IGRpcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEZUUCBzZXJ2ZXIgdG8gc2VuZCBmaWxlcyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHJlbW90ZSBzZXJ2ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXIoU3RyaW5nIHNlcnZlcikgeworICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEZUUCBwb3J0IHVzZWQgYnkgdGhlIHJlbW90ZSBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCBvbiB3aGljaCB0aGUgcmVtb3RlIHNlcnZlciBpcyBsaXN0ZW5pbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9naW4gdXNlciBpZCB0byB1c2Ugb24gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcmlkIHJlbW90ZSBzeXN0ZW0gdXNlcmlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJpZChTdHJpbmcgdXNlcmlkKSB7CisgICAgICAgIHRoaXMudXNlcmlkID0gdXNlcmlkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9naW4gcGFzc3dvcmQgZm9yIHRoZSBnaXZlbiB1c2VyIGlkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCBvbiB0aGUgcmVtb3RlIHN5c3RlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvZ2luIGFjY291bnQgdG8gdXNlIG9uIHRoZSBzcGVjaWZpZWQgc2VydmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBBY2NvdW50IHRoZSBhY2NvdW50IG5hbWUgb24gcmVtb3RlIHN5c3RlbQorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWNjb3VudChTdHJpbmcgcEFjY291bnQpIHsKKyAgICAgICAgdGhpcy5hY2NvdW50ID0gcEFjY291bnQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCB1c2VzIGJpbmFyeSBtb2RlLCBvdGhlcndpc2UgdGV4dCBtb2RlIChkZWZhdWx0IGlzIGJpbmFyeSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluYXJ5IGlmIHRydWUgdXNlIGJpbmFyeSBtb2RlIGluIHRyYW5zZmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCaW5hcnkoYm9vbGVhbiBiaW5hcnkpIHsKKyAgICAgICAgdGhpcy5iaW5hcnkgPSBiaW5hcnk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgcGFzc2l2ZSBtb2RlLiBTZXQgdG8gdHJ1ZSBpZiB5b3UgYXJlIGJlaGluZCBhCisgICAgICogZmlyZXdhbGwgYW5kIGNhbm5vdCBjb25uZWN0IHdpdGhvdXQgaXQuIFBhc3NpdmUgbW9kZSBpcyBkaXNhYmxlZCBieQorICAgICAqIGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc2l2ZSB0cnVlIGlzIHBhc3NpdmUgbW9kZSBzaG91bGQgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzaXZlKGJvb2xlYW4gcGFzc2l2ZSkgeworICAgICAgICB0aGlzLnBhc3NpdmUgPSBwYXNzaXZlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gYWJvdXQgZWFjaCBmaWxlIGFzIGl0IGlzCisgICAgICogdHJhbnNmZXJyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyYm9zZSB0cnVlIGlmIHZlcmJvc2Ugbm90aWZpY2F0aW9ucyBhcmUgcmVxdWlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgc3lub255bSBmb3IgPHR0PmRlcGVuZHM8L3R0Pi4gU2V0IHRvIHRydWUgdG8gdHJhbnNtaXQgb25seSBuZXcKKyAgICAgKiBvciBjaGFuZ2VkIGZpbGVzLgorICAgICAqCisgICAgICogU2VlIHRoZSByZWxhdGVkIGF0dHJpYnV0ZXMgdGltZWRpZmZtaWxsaXMgYW5kIHRpbWVkaWZmYXV0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdlciBpZiB0cnVlIG9ubHkgdHJhbnNmZXIgbmV3ZXIgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmV3ZXIoYm9vbGVhbiBuZXdlcikgeworICAgICAgICB0aGlzLm5ld2VyT25seSA9IG5ld2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gYWRkIHRvIHRoZSB0aW1lIG9uIHRoZSByZW1vdGUgbWFjaGluZQorICAgICAqIHRvIGdldCB0aGUgdGltZSBvbiB0aGUgbG9jYWwgbWFjaGluZS4KKyAgICAgKgorICAgICAqIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIDxjb2RlPm5ld2VyPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVEaWZmTWlsbGlzIG51bWJlciBvZiBtaWxsaXNlY29uZHMKKyAgICAgKgorICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZURpZmZNaWxsaXMobG9uZyB0aW1lRGlmZk1pbGxpcykgeworICAgICAgICB0aGlzLnRpbWVEaWZmTWlsbGlzID0gdGltZURpZmZNaWxsaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogJnF1b3Q7dHJ1ZSZxdW90OyB0byBmaW5kIG91dCBhdXRvbWF0aWNhbGx5IHRoZSB0aW1lIGRpZmZlcmVuY2UKKyAgICAgKiBiZXR3ZWVuIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZS4KKyAgICAgKgorICAgICAqIFRoaXMgcmVxdWlyZXMgcmlnaHQgdG8gY3JlYXRlCisgICAgICogYW5kIGRlbGV0ZSBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSByZW1vdGUgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVEaWZmQXV0byB0cnVlID0gZmluZCBhdXRvbWF0aWNhbGx5IHRoZSB0aW1lIGRpZmYKKyAgICAgKgorICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZURpZmZBdXRvKGJvb2xlYW4gdGltZURpZmZBdXRvKSB7CisgICAgICAgIHRoaXMudGltZURpZmZBdXRvID0gdGltZURpZmZBdXRvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0byB0cnVlIHRvIHByZXNlcnZlIG1vZGlmaWNhdGlvbiB0aW1lcyBmb3IgImdvdHRlbiIgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlc2VydmVMYXN0TW9kaWZpZWQgaWYgdHJ1ZSBwcmVzZXJ2ZXIgbW9kaWZpY2F0aW9uIHRpbWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZXNlcnZlTGFzdE1vZGlmaWVkKGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQpIHsKKyAgICAgICAgdGhpcy5wcmVzZXJ2ZUxhc3RNb2RpZmllZCA9IHByZXNlcnZlTGFzdE1vZGlmaWVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgdG8gdHJhbnNtaXQgb25seSBmaWxlcyB0aGF0IGFyZSBuZXcgb3IgY2hhbmdlZCBmcm9tIHRoZWlyCisgICAgICogcmVtb3RlIGNvdW50ZXJwYXJ0cy4gVGhlIGRlZmF1bHQgaXMgdG8gdHJhbnNtaXQgYWxsIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRlcGVuZHMgaWYgdHJ1ZSBvbmx5IHRyYW5zZmVyIG5ld2VyIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlcGVuZHMoYm9vbGVhbiBkZXBlbmRzKSB7CisgICAgICAgIHRoaXMubmV3ZXJPbmx5ID0gZGVwZW5kczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlbW90ZSBmaWxlIHNlcGFyYXRvciBjaGFyYWN0ZXIuIFRoaXMgbm9ybWFsbHkgZGVmYXVsdHMgdG8gdGhlCisgICAgICogVW5peCBzdGFuZGFyZCBmb3J3YXJkIHNsYXNoLCBidXQgY2FuIGJlIG1hbnVhbGx5IG92ZXJyaWRkZW4gdXNpbmcgdGhpcworICAgICAqIGNhbGwgaWYgdGhlIHJlbW90ZSBzZXJ2ZXIgcmVxdWlyZXMgc29tZSBvdGhlciBzZXBhcmF0b3IuIE9ubHkgdGhlIGZpcnN0CisgICAgICogY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXBhcmF0b3IgdGhlIGZpbGUgc2VwYXJhdG9yIG9uIHRoZSByZW1vdGUgc3lzdGVtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgc2VwYXJhdG9yKSB7CisgICAgICAgIHJlbW90ZUZpbGVTZXAgPSBzZXBhcmF0b3I7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmaWxlIHBlcm1pc3Npb24gbW9kZSAoVW5peCBvbmx5KSBmb3IgZmlsZXMgc2VudCB0byB0aGUKKyAgICAgKiBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlTW9kZSB1bml4IHN0eWxlIGZpbGUgbW9kZSBmb3IgdGhlIGZpbGVzIHNlbnQgdG8gdGhlIHJlbW90ZQorICAgICAqICAgICAgICBzeXN0ZW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2htb2QoU3RyaW5nIHRoZU1vZGUpIHsKKyAgICAgICAgdGhpcy5jaG1vZCA9IHRoZU1vZGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IG1hc2sgZm9yIGZpbGUgY3JlYXRpb24gb24gYSB1bml4IHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGVVbWFzayB1bml4IHN0eWxlIHVtYXNrIGZvciBmaWxlcyBjcmVhdGVkIG9uIHRoZSByZW1vdGUgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVtYXNrKFN0cmluZyB0aGVVbWFzaykgeworICAgICAgICB0aGlzLnVtYXNrID0gdGhlVW1hc2s7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgQSBzZXQgb2YgZmlsZXMgdG8gdXBsb2FkIG9yIGRvd25sb2FkCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2V0IHRoZSBzZXQgb2YgZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUKKyAgICAgKiAgICAgICAgdHJhbnNmZXJyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBGVFAgYWN0aW9uIHRvIGJlIHRha2VuLiBDdXJyZW50bHkgYWNjZXB0cyAicHV0IiwgImdldCIsICJkZWwiLAorICAgICAqICJta2RpciIsICJjaG1vZCIsICJsaXN0IiwgYW5kICJzaXRlIi4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIHNldEFjdGlvbihTdHJpbmcpIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlcGxhY2VkIHdpdGgKKyAgICAgKiAgICAgIHNldEFjdGlvbihGVFAuQWN0aW9uKSB0byBtYWtlIEFudCdzIEludHJvc3BlY3Rpb24gbWVjaGFuaXNtIGRvIHRoZQorICAgICAqICAgICAgd29yayBhbmQgYWxzbyB0byBlbmNhcHN1bGF0ZSBvcGVyYXRpb25zIG9uIHRoZSB0eXBlIGluIGl0cyBvd24KKyAgICAgKiAgICAgIGNsYXNzLgorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb24gdGhlIEZUUCBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgYWN0aW9uIGlzIG5vdCBhIHZhbGlkIGFjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIHNldEFjdGlvbihTdHJpbmcpIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkLiIKKyAgICAgICAgICAgICArICIgVXNlIHNldEFjdGlvbihGVFAuQWN0aW9uKSBpbnN0ZWFkLiIpOworCisgICAgICAgIEFjdGlvbiBhID0gbmV3IEFjdGlvbigpOworCisgICAgICAgIGEuc2V0VmFsdWUoYWN0aW9uKTsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSBhLmdldEFjdGlvbigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgRlRQIGFjdGlvbiB0byBiZSB0YWtlbi4gQ3VycmVudGx5IGFjY2VwdHMgInB1dCIsICJnZXQiLCAiZGVsIiwKKyAgICAgKiAibWtkaXIiLCAiY2htb2QiLCAibGlzdCIsIGFuZCAic2l0ZSIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBGVFAgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGFjdGlvbiBpcyBub3QgYSB2YWxpZCBhY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKEFjdGlvbiBhY3Rpb24pIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uLmdldEFjdGlvbigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dCBmaWxlIGZvciB0aGUgImxpc3QiIGFjdGlvbi4gVGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBmb3IKKyAgICAgKiBhbnkgb3RoZXIgYWN0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0aW5nIGZpbGUgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGxpc3RpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdGluZyhGaWxlIGxpc3RpbmcpIHsKKyAgICAgICAgdGhpcy5saXN0aW5nID0gbGlzdGluZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGVuYWJsZXMgdW5zdWNjZXNzZnVsIGZpbGUgcHV0LCBkZWxldGUgYW5kIGdldAorICAgICAqIG9wZXJhdGlvbnMgdG8gYmUgc2tpcHBlZCB3aXRoIGEgd2FybmluZyBhbmQgdGhlIHJlbWFpbmRlcgorICAgICAqIG9mIHRoZSBmaWxlcyBzdGlsbCB0cmFuc2ZlcnJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBza2lwRmFpbGVkVHJhbnNmZXJzIHRydWUgaWYgZmFpbHVyZXMgaW4gdHJhbnNmZXJzIGFyZSBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNraXBGYWlsZWRUcmFuc2ZlcnMoYm9vbGVhbiBza2lwRmFpbGVkVHJhbnNmZXJzKSB7CisgICAgICAgIHRoaXMuc2tpcEZhaWxlZFRyYW5zZmVycyA9IHNraXBGYWlsZWRUcmFuc2ZlcnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIGZsYWcgdG8gc2tpcCBlcnJvcnMgb24gZGlyZWN0b3J5IGNyZWF0aW9uLgorICAgICAqIChhbmQgbWF5YmUgbGF0ZXIgb3RoZXIgc2VydmVyIHNwZWNpZmljIGVycm9ycykKKyAgICAgKgorICAgICAqIEBwYXJhbSBpZ25vcmVOb25jcml0aWNhbEVycm9ycyB0cnVlIGlmIG5vbi1jcml0aWNhbCBlcnJvcnMgc2hvdWxkIG5vdAorICAgICAqICAgICAgICBjYXVzZSBhIGZhaWx1cmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlTm9uY3JpdGljYWxFcnJvcnMoYm9vbGVhbiBpZ25vcmVOb25jcml0aWNhbEVycm9ycykgeworICAgICAgICB0aGlzLmlnbm9yZU5vbmNyaXRpY2FsRXJyb3JzID0gaWdub3JlTm9uY3JpdGljYWxFcnJvcnM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyYXRpb25IYXNCZWVuU2V0KCkgeworICAgICAgICB0aGlzLmlzQ29uZmlndXJhdGlvblNldCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3lzdGVtVHlwZUtleSBhdHRyaWJ1dGUuCisgICAgICogTWV0aG9kIGZvciBzZXR0aW5nIDxjb2RlPkZUUENsaWVudENvbmZpZzwvY29kZT4gcmVtb3RlIHN5c3RlbSBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3lzdGVtS2V5IHRoZSBrZXkgdG8gYmUgc2V0IC0gQlVUIGlmIGJsYW5rCisgICAgICogdGhlIGRlZmF1bHQgdmFsdWUgb2YgbnVsbCAod2hpY2ggc2lnbmlmaWVzICJhdXRvZGV0ZWN0Iikgd2lsbCBiZSBrZXB0LgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQQ2xpZW50Q29uZmlnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtVHlwZUtleShGVFBTeXN0ZW1UeXBlIHN5c3RlbUtleSkgeworICAgICAgICBpZiAoc3lzdGVtS2V5ICE9IG51bGwgJiYgIXN5c3RlbUtleS5nZXRWYWx1ZSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRoaXMuc3lzdGVtVHlwZUtleSA9IHN5c3RlbUtleTsKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25IYXNCZWVuU2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0RGF0ZUZvcm1hdENvbmZpZyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGRlZmF1bHREYXRlRm9ybWF0IGNvbmZpZ3VyYXRpb24gdG8gYmUgc2V0LCB1bmxlc3MgaXQgaXMKKyAgICAgKiBudWxsIG9yIGVtcHR5IHN0cmluZywgaW4gd2hpY2ggY2FzZSBpZ25vcmVkLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQQ2xpZW50Q29uZmlnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdERhdGVGb3JtYXRDb25maWcoU3RyaW5nIGRlZmF1bHREYXRlRm9ybWF0KSB7CisgICAgICAgIGlmIChkZWZhdWx0RGF0ZUZvcm1hdCAhPSBudWxsICYmICFkZWZhdWx0RGF0ZUZvcm1hdC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aGlzLmRlZmF1bHREYXRlRm9ybWF0Q29uZmlnID0gZGVmYXVsdERhdGVGb3JtYXQ7CisgICAgICAgICAgICBjb25maWd1cmF0aW9uSGFzQmVlblNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcmVjZW50RGF0ZUZvcm1hdENvbmZpZyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHJlY2VudERhdGVGb3JtYXQgY29uZmlndXJhdGlvbiB0byBiZSBzZXQsIHVubGVzcyBpdCBpcworICAgICAqIG51bGwgb3IgZW1wdHkgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGlnbm9yZWQuCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnRDb25maWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWNlbnREYXRlRm9ybWF0Q29uZmlnKFN0cmluZyByZWNlbnREYXRlRm9ybWF0KSB7CisgICAgICAgIGlmIChyZWNlbnREYXRlRm9ybWF0ICE9IG51bGwgJiYgIXJlY2VudERhdGVGb3JtYXQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgdGhpcy5yZWNlbnREYXRlRm9ybWF0Q29uZmlnID0gcmVjZW50RGF0ZUZvcm1hdDsKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25IYXNCZWVuU2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZXJ2ZXJMYW5ndWFnZUNvZGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBzZXJ2ZXJMYW5ndWFnZUNvZGUgY29uZmlndXJhdGlvbiB0byBiZSBzZXQsIHVubGVzcyBpdCBpcworICAgICAqIG51bGwgb3IgZW1wdHkgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGlnbm9yZWQuCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnRDb25maWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcoTGFuZ3VhZ2VDb2RlIHNlcnZlckxhbmd1YWdlQ29kZSkgeworICAgICAgICBpZiAoc2VydmVyTGFuZ3VhZ2VDb2RlICE9IG51bGwgJiYgIXNlcnZlckxhbmd1YWdlQ29kZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aGlzLnNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZyA9IHNlcnZlckxhbmd1YWdlQ29kZTsKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25IYXNCZWVuU2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZXJ2ZXJUaW1lWm9uZUNvbmZpZyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHNlcnZlclRpbWVab25lSWQgY29uZmlndXJhdGlvbiB0byBiZSBzZXQsIHVubGVzcyBpdCBpcworICAgICAqIG51bGwgb3IgZW1wdHkgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGlnbm9yZWQuCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnRDb25maWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUaW1lWm9uZUNvbmZpZyhTdHJpbmcgc2VydmVyVGltZVpvbmVJZCkgeworICAgICAgICBpZiAoc2VydmVyVGltZVpvbmVJZCAhPSBudWxsICYmICFzZXJ2ZXJUaW1lWm9uZUlkLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyVGltZVpvbmVDb25maWcgPSBzZXJ2ZXJUaW1lWm9uZUlkOworICAgICAgICAgICAgY29uZmlndXJhdGlvbkhhc0JlZW5TZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNob3J0TW9udGhOYW1lc0NvbmZpZyBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzaG9ydE1vbnRoTmFtZXMgY29uZmlndXJhdGlvbiB0byBiZSBzZXQsIHVubGVzcyBpdCBpcworICAgICAqIG51bGwgb3IgZW1wdHkgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGlnbm9yZWQuCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnRDb25maWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydE1vbnRoTmFtZXNDb25maWcoU3RyaW5nIHNob3J0TW9udGhOYW1lcykgeworICAgICAgICBpZiAoc2hvcnRNb250aE5hbWVzICE9IG51bGwgJiYgIXNob3J0TW9udGhOYW1lcy5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aGlzLnNob3J0TW9udGhOYW1lc0NvbmZpZyA9IHNob3J0TW9udGhOYW1lczsKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25IYXNCZWVuU2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogRGVmaW5lcyBob3cgbWFueSB0aW1lcyB0byByZXRyeSBleGVjdXRpbmcgRlRQIGNvbW1hbmQgYmVmb3JlIGdpdmluZyB1cC4KKyAgICAgKiBEZWZhdWx0IGlzIDAgLSB0cnkgb25jZSBhbmQgaWYgZmFpbHVyZSB0aGVuIGdpdmUgdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV0cmllc0FsbG93ZWQgbnVtYmVyIG9mIHJldHJpZXMgdG8gYWxsb3cuICAtMSBtZWFucworICAgICAqIGtlZXAgdHJ5aW5nIGZvcmV2ZXIuICJmb3JldmVyIiBtYXkgYWxzbyBiZSBzcGVjaWZpZWQgYXMgYQorICAgICAqIHN5bm9ueW0gZm9yIC0xLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldHJpZXNBbGxvd2VkKFN0cmluZyByZXRyaWVzQWxsb3dlZCkgeworICAgICAgICBpZiAoIkZPUkVWRVIiLmVxdWFsc0lnbm9yZUNhc2UocmV0cmllc0FsbG93ZWQpKSB7CisgICAgICAgICAgICB0aGlzLnJldHJpZXNBbGxvd2VkID0gUmV0cnlhYmxlLlJFVFJZX0ZPUkVWRVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCByZXRyaWVzID0gSW50ZWdlci5wYXJzZUludChyZXRyaWVzQWxsb3dlZCk7CisgICAgICAgICAgICAgICAgaWYgKHJldHJpZXMgPCBSZXRyeWFibGUuUkVUUllfRk9SRVZFUikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWUgZm9yIHJldHJpZXNBbGxvd2VkIGF0dHJpYnV0ZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmV0cmllc0FsbG93ZWQpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucmV0cmllc0FsbG93ZWQgPSByZXRyaWVzOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHB4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWUgZm9yIHJldHJpZXNBbGxvd2VkIGF0dHJpYnV0ZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyByZXRyaWVzQWxsb3dlZCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3lzdGVtVHlwZUtleS4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0U3lzdGVtVHlwZUtleSgpIHsKKyAgICAgICAgcmV0dXJuIHN5c3RlbVR5cGVLZXkuZ2V0VmFsdWUoKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZhdWx0RGF0ZUZvcm1hdENvbmZpZy4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0RGVmYXVsdERhdGVGb3JtYXRDb25maWcoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0RGF0ZUZvcm1hdENvbmZpZzsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZWNlbnREYXRlRm9ybWF0Q29uZmlnLgorICAgICAqLworICAgIFN0cmluZyBnZXRSZWNlbnREYXRlRm9ybWF0Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gcmVjZW50RGF0ZUZvcm1hdENvbmZpZzsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcuCisgICAgICovCisgICAgU3RyaW5nIGdldFNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZy5nZXRWYWx1ZSgpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclRpbWVab25lQ29uZmlnLgorICAgICAqLworICAgIFN0cmluZyBnZXRTZXJ2ZXJUaW1lWm9uZUNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlclRpbWVab25lQ29uZmlnOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNob3J0TW9udGhOYW1lc0NvbmZpZy4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0U2hvcnRNb250aE5hbWVzQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc2hvcnRNb250aE5hbWVzQ29uZmlnOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRpbWVzdGFtcEdyYW51bGFyaXR5LgorICAgICAqLworICAgIEdyYW51bGFyaXR5IGdldFRpbWVzdGFtcEdyYW51bGFyaXR5KCkgeworICAgICAgICByZXR1cm4gdGltZXN0YW1wR3JhbnVsYXJpdHk7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRpbWVzdGFtcEdyYW51bGFyaXR5IGF0dHJpYnV0ZQorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBHcmFudWxhcml0eSBUaGUgdGltZXN0YW1wR3JhbnVsYXJpdHkgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcEdyYW51bGFyaXR5KEdyYW51bGFyaXR5IHRpbWVzdGFtcEdyYW51bGFyaXR5KSB7CisgICAgICAgIGlmIChudWxsID09IHRpbWVzdGFtcEdyYW51bGFyaXR5IHx8ICIiLmVxdWFscyh0aW1lc3RhbXBHcmFudWxhcml0eSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRpbWVzdGFtcEdyYW51bGFyaXR5ID0gdGltZXN0YW1wR3JhbnVsYXJpdHk7CisgICAgIH0KKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzaXRlQ29tbWFuZCBhdHRyaWJ1dGUuICBUaGlzIGF0dHJpYnV0ZQorICAgICAqIG5hbWVzIHRoZSBjb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBpZiB0aGUgYWN0aW9uCisgICAgICogaXMgInNpdGUiLgorICAgICAqIEBwYXJhbSBzaXRlQ29tbWFuZCBUaGUgc2l0ZUNvbW1hbmQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNpdGVDb21tYW5kKFN0cmluZyBzaXRlQ29tbWFuZCkgeworICAgICAgICB0aGlzLnNpdGVDb21tYW5kID0gc2l0ZUNvbW1hbmQ7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGluaXRpYWxTaXRlQ29tbWFuZCBhdHRyaWJ1dGUuICBUaGlzIGF0dHJpYnV0ZQorICAgICAqIG5hbWVzIGEgc2l0ZSBjb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseQorICAgICAqIGFmdGVyIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIGluaXRpYWxDb21tYW5kIFRoZSBpbml0aWFsU2l0ZUNvbW1hbmQgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTaXRlQ29tbWFuZChTdHJpbmcgaW5pdGlhbENvbW1hbmQpIHsKKyAgICAgICAgdGhpcy5pbml0aWFsU2l0ZUNvbW1hbmQgPSBpbml0aWFsQ29tbWFuZDsKKyAgICB9CisgICAgLyoqCisgICAgICogQ2hlY2tzIHRvIHNlZSB0aGF0IGFsbCByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBzZXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0F0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic2VydmVyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNlcmlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidXNlcmlkIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYXNzd29yZCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGFjdGlvbiA9PSBMSVNUX0ZJTEVTKSAmJiAobGlzdGluZyA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJsaXN0aW5nIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3IgbGlzdCAiCisgICAgICAgICAgICAgICAgICsgImFjdGlvbiEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhY3Rpb24gPT0gTUtfRElSICYmIHJlbW90ZWRpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInJlbW90ZWRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yICIKKyAgICAgICAgICAgICAgICAgKyAibWtkaXIgYWN0aW9uISIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBDSE1PRCAmJiBjaG1vZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNobW9kIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3IgY2htb2QgIgorICAgICAgICAgICAgICAgICArICJhY3Rpb24hIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGlvbiA9PSBTSVRFX0NNRCAmJiBzaXRlQ29tbWFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNpdGVjb21tYW5kIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3Igc2l0ZSAiCisgICAgICAgICAgICAgICAgICsgImFjdGlvbiEiKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKHRoaXMuaXNDb25maWd1cmF0aW9uU2V0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZyIpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAiY29tbW9ucy1uZXQuamFyID49IDEuNC4wIGlzIHJlcXVpcmVkIGZvciBhdCBsZWFzdCBvbmUiCisgICAgICAgICAgICAgICAgICsgIiBvZiB0aGUgYXR0cmlidXRlcyBzcGVjaWZpZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRhYmxlIGEgcmV0cnlhYmxlIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gaCB0aGUgcmV0cnkgaGFuZGVyLgorICAgICAqIEBwYXJhbSByIHRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgcmV0cmllZCB1bnRpbCBpdCBzdWNjZWVkcworICAgICAqICAgICAgICAgIG9yIHRoZSBudW1iZXIgb2YgcmV0cnlzIGlzIHJlYWNoZWQuCisgICAgICogQHBhcmFtIGRlc2NyIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQgdGhhdCBpcyBiZWluZyBydW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVJldHJ5YWJsZShSZXRyeUhhbmRsZXIgaCwgUmV0cnlhYmxlIHIsIFN0cmluZyBkZXNjcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaC5leGVjdXRlKHIsIGRlc2NyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZvciBlYWNoIGZpbGUgaW4gdGhlIGZpbGVzZXQsIGRvIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb246IHNlbmQsIGdldCwKKyAgICAgKiBkZWxldGUsIG9yIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnRwIHRoZSBGVFBDbGllbnQgaW5zdGFuY2UgdXNlZCB0byBwZXJmb3JtIEZUUCBhY3Rpb25zCisgICAgICogQHBhcmFtIGZzIHRoZSBmaWxlc2V0IG9uIHdoaWNoIHRoZSBhY3Rpb25zIGFyZSBwZXJmb3JtZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZXMgdG8gYmUgdHJhbnNmZXJyZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIGEgZmlsZQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHRoZSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgdHJhbnNmZXJGaWxlcyhmaW5hbCBGVFBDbGllbnQgZnRwLCBGaWxlU2V0IGZzKQorICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHM7CisgICAgICAgIGlmIChhY3Rpb24gPT0gU0VORF9GSUxFUykgeworICAgICAgICAgICAgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3YXJuIHRoYXQgc2VsZWN0b3JzIGFyZSBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICBpZiAoZnMuZ2V0U2VsZWN0b3JzKGdldFByb2plY3QoKSkubGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJzZWxlY3RvcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcmVtb3RlIGZpbGVzZXRzIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkcyA9IG5ldyBGVFBEaXJlY3RvcnlTY2FubmVyKGZ0cCk7CisgICAgICAgICAgICBmcy5zZXR1cERpcmVjdG9yeVNjYW5uZXIoZHMsIGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBkcy5zZXRGb2xsb3dTeW1saW5rcyhmcy5pc0ZvbGxvd1N5bWxpbmtzKCkpOworICAgICAgICAgICAgZHMuc2NhbigpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gZHNmaWxlcyA9IG51bGw7CisgICAgICAgIGlmIChhY3Rpb24gPT0gUk1fRElSKSB7CisgICAgICAgICAgICBkc2ZpbGVzID0gZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHNmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGlyID0gbnVsbDsKKworICAgICAgICBpZiAoKGRzLmdldEJhc2VkaXIoKSA9PSBudWxsKQorICAgICAgICAgICAgICYmICgoYWN0aW9uID09IFNFTkRfRklMRVMpIHx8IChhY3Rpb24gPT0gR0VUX0ZJTEVTKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIGRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIHNlbmQgIgorICAgICAgICAgICAgICAgICArICJhbmQgZ2V0IGFjdGlvbnMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoYWN0aW9uID09IFNFTkRfRklMRVMpIHx8IChhY3Rpb24gPT0gR0VUX0ZJTEVTKSkgeworICAgICAgICAgICAgICAgIGRpciA9IGRzLmdldEJhc2VkaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGFyZSBkb2luZyBhIGxpc3RpbmcsIHdlIG5lZWQgdGhlIG91dHB1dCBzdHJlYW0gY3JlYXRlZCBub3cuCisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBMSVNUX0ZJTEVTKSB7CisgICAgICAgICAgICAgICAgRmlsZSBwZCA9IGxpc3RpbmcuZ2V0UGFyZW50RmlsZSgpOworCisgICAgICAgICAgICAgICAgaWYgKCFwZC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBwZC5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobGlzdGluZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmV0cnlIYW5kbGVyIGggPSBuZXcgUmV0cnlIYW5kbGVyKHRoaXMucmV0cmllc0FsbG93ZWQsIHRoaXMpOworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBSTV9ESVIpIHsKKyAgICAgICAgICAgICAgICAvLyB0byByZW1vdmUgZGlyZWN0b3JpZXMsIHN0YXJ0IGJ5IHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAvLyB0aGUgdHJ1bmsgZG9lcyBub3QgbGV0IGl0c2VsZiBiZSByZW1vdmVkIGJlZm9yZSB0aGUgbGVhdmVzCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGRzZmlsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRzZmlsZSA9IGRzZmlsZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXRyeWFibGUoaCwgbmV3IFJldHJ5YWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtRGlyKGZ0cCwgZHNmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwgZHNmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkV3JpdGVyIGZidyA9IGJ3OworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmZGlyID0gZGlyOworICAgICAgICAgICAgICAgIGlmICh0aGlzLm5ld2VyT25seSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmdyYW51bGFyaXR5TWlsbGlzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXN0YW1wR3JhbnVsYXJpdHkuZ2V0TWlsbGlzZWNvbmRzKGFjdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHNmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZHNmaWxlID0gZHNmaWxlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCBuZXcgUmV0cnlhYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTRU5EX0ZJTEVTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEZpbGUoZnRwLCBmZGlyLCBkc2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0VUX0ZJTEVTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZShmdHAsIGZkaXIsIGRzZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUxfRklMRVM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxGaWxlKGZ0cCwgZHNmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1RfRklMRVM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0RmlsZShmdHAsIGZidywgZHNmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENITU9EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9TaXRlQ29tbWFuZChmdHAsICJjaG1vZCAiICsgY2htb2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIgKyByZXNvbHZlRmlsZShkc2ZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycmVkKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidW5rbm93biBmdHAgYWN0aW9uICIgKyBhY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwgZHNmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYncgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ3LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZHNmaWxlcy5sZW5ndGg7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhbGwgZmlsZXMgc3BlY2lmaWVkIGJ5IHRoZSBjb25maWd1cmVkIGZpbGVzZXRzIHRvIHRoZSByZW1vdGUKKyAgICAgKiBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnRwIHRoZSBGVFBDbGllbnQgaW5zdGFuY2UgdXNlZCB0byBwZXJmb3JtIEZUUCBhY3Rpb25zCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIGEgZmlsZQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHRoZSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRyYW5zZmVyRmlsZXMoRlRQQ2xpZW50IGZ0cCkKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cmFuc2ZlcnJlZCA9IDA7CisgICAgICAgIHNraXBwZWQgPSAwOworCisgICAgICAgIGlmIChmaWxlc2V0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJhdCBsZWFzdCBvbmUgZmlsZXNldCBtdXN0IGJlIHNwZWNpZmllZC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGdldCBmaWxlcyBmcm9tIGZpbGVzZXRzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzZXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckZpbGVzKGZ0cCwgZnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxvZyh0cmFuc2ZlcnJlZCArICIgIiArIEFDVElPTl9UQVJHRVRfU1RSU1thY3Rpb25dICsgIiAiCisgICAgICAgICAgICArIENPTVBMRVRFRF9BQ1RJT05fU1RSU1thY3Rpb25dKTsKKyAgICAgICAgaWYgKHNraXBwZWQgIT0gMCkgeworICAgICAgICAgICAgbG9nKHNraXBwZWQgKyAiICIgKyBBQ1RJT05fVEFSR0VUX1NUUlNbYWN0aW9uXQorICAgICAgICAgICAgICAgICsgIiB3ZXJlIG5vdCBzdWNjZXNzZnVsbHkgIiArIENPTVBMRVRFRF9BQ1RJT05fU1RSU1thY3Rpb25dKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29ycmVjdCBhIGZpbGUgcGF0aCB0byBjb3JyZXNwb25kIHRvIHRoZSByZW1vdGUgaG9zdCByZXF1aXJlbWVudHMuIFRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgYXNzdW1lcyB0aGF0IHRoZSByZW1vdGUgZW5kIGNhbiBoYW5kbGUKKyAgICAgKiBVbml4LXN0eWxlIHBhdGhzIHdpdGggZm9yd2FyZC1zbGFzaCBzZXBhcmF0b3JzLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuCisgICAgICogd2l0aCB0aGUgPGNvZGU+c2VwYXJhdG9yPC9jb2RlPiB0YXNrIHBhcmFtZXRlci4gTm8gYXR0ZW1wdCBpcyBtYWRlIHRvCisgICAgICogZGV0ZXJtaW5lIHdoYXQgc3ludGF4IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgcmVtb3RlIGhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgcmVtb3RlIGZpbGUgbmFtZSB0byBiZSByZXNvbHZlZAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUgYXMgaXQgd2lsbCBhcHBlYXIgb24gdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVGaWxlKFN0cmluZyBmaWxlKSB7CisgICAgICAgIHJldHVybiBmaWxlLnJlcGxhY2UoU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpLmNoYXJBdCgwKSwKKyAgICAgICAgICAgIHJlbW90ZUZpbGVTZXAuY2hhckF0KDApKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYWxsIHBhcmVudCBkaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gYSBjb21wbGV0ZSByZWxhdGl2ZQorICAgICAqIHBhdGhuYW1lLiBBdHRlbXB0cyB0byBjcmVhdGUgZXhpc3RpbmcgZGlyZWN0b3JpZXMgd2lsbCBub3QgY2F1c2UKKyAgICAgKiBlcnJvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnRwIHRoZSBGVFAgY2xpZW50IGluc3RhbmNlIHRvIHVzZSB0byBleGVjdXRlIEZUUCBhY3Rpb25zIG9uCisgICAgICogICAgICAgIHRoZSByZW1vdGUgc2VydmVyLgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aG9zZSBwYXJlbnRzIHNob3VsZCBiZSBjcmVhdGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gdW5kZXIgbm9uIGRvY3VtZW50ZWQgY2lyY3Vtc3RhbmNlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgaXQgaXMgaW1wb3NzaWJsZSB0byBjZCB0byBhIHJlbW90ZSBkaXJlY3RvcnkKKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhcmVudHMoRlRQQ2xpZW50IGZ0cCwgU3RyaW5nIGZpbGVuYW1lKQorICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShmaWxlbmFtZSk7CisgICAgICAgIGlmIChkaXJDYWNoZS5jb250YWlucyhkaXIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworCisgICAgICAgIFZlY3RvciBwYXJlbnRzID0gbmV3IFZlY3RvcigpOworICAgICAgICBTdHJpbmcgZGlybmFtZTsKKworICAgICAgICB3aGlsZSAoKGRpcm5hbWUgPSBkaXIuZ2V0UGFyZW50KCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgY2hlY2tEaXIgPSBuZXcgRmlsZShkaXJuYW1lKTsKKyAgICAgICAgICAgIGlmIChkaXJDYWNoZS5jb250YWlucyhjaGVja0RpcikpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpciA9IGNoZWNrRGlyOworICAgICAgICAgICAgcGFyZW50cy5hZGRFbGVtZW50KGRpcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5kIGZpcnN0IG5vbiBjYWNoZWQgZGlyCisgICAgICAgIGludCBpID0gcGFyZW50cy5zaXplKCkgLSAxOworCisgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBjd2QgPSBmdHAucHJpbnRXb3JraW5nRGlyZWN0b3J5KCk7CisgICAgICAgICAgICBTdHJpbmcgcGFyZW50ID0gZGlyLmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShyZXNvbHZlRmlsZShwYXJlbnQpKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjaGFuZ2UgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlyZWN0b3J5OiAiICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgIGRpciA9IChGaWxlKSBwYXJlbnRzLmVsZW1lbnRBdChpLS0pOworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGRpciBleGlzdHMgYnkgdHJ5aW5nIHRvIGNoYW5nZSBpbnRvIGl0LgorICAgICAgICAgICAgICAgIGlmICghZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoZGlyLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgbm90IGNoYW5nZSB0byBpdCAtIHRyeSB0byBjcmVhdGUgaXQKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJjcmVhdGluZyByZW1vdGUgZGlyZWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzb2x2ZUZpbGUoZGlyLmdldFBhdGgoKSksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZ0cC5tYWtlRGlyZWN0b3J5KGRpci5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNa0RpckZhaWx1cmUoZnRwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGRpci5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjaGFuZ2UgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRpcmVjdG9yeTogIiArIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaXJDYWNoZS5hZGRFbGVtZW50KGRpcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShjd2QpOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIGF1dG8gZmluZCB0aGUgdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gbG9jYWwgYW5kIHJlbW90ZQorICAgICAqIEBwYXJhbSBmdHAgaGFuZGxlIHRvIGZ0cCBjbGllbnQKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBtaWxsaXMgdG8gYWRkIHRvIHJlbW90ZSB0aW1lIHRvIG1ha2UgaXQgY29tcGFyYWJsZSB0byBsb2NhbCB0aW1lCisgICAgICogQHNpbmNlIGFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgZ2V0VGltZURpZmYoRlRQQ2xpZW50IGZ0cCkgeworICAgICAgICBsb25nIHJldHVyblZhbHVlID0gMDsKKyAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IGZpbmRGaWxlTmFtZShmdHApOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gY3JlYXRlIGEgbG9jYWwgdGVtcG9yYXJ5IGZpbGUKKyAgICAgICAgICAgIEZJTEVfVVRJTFMuY3JlYXRlTmV3RmlsZSh0ZW1wRmlsZSk7CisgICAgICAgICAgICBsb25nIGxvY2FsVGltZVN0YW1wID0gdGVtcEZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSh0ZW1wRmlsZSkpOworICAgICAgICAgICAgZnRwLnN0b3JlRmlsZSh0ZW1wRmlsZS5nZXROYW1lKCksIGluc3RyZWFtKTsKKyAgICAgICAgICAgIGluc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpOworICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBGVFBGaWxlIFtdIGZ0cEZpbGVzID0gZnRwLmxpc3RGaWxlcyh0ZW1wRmlsZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChmdHBGaWxlcy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHJlbW90ZVRpbWVTdGFtcCA9IGZ0cEZpbGVzWzBdLmdldFRpbWVzdGFtcCgpLmdldFRpbWUoKS5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbG9jYWxUaW1lU3RhbXAgLSByZW1vdGVUaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZ0cC5kZWxldGVGaWxlKGZ0cEZpbGVzWzBdLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkZWxlZ2F0ZSB0aGUgZGVsZXRpb24gb2YgdGhlIGxvY2FsIHRlbXAgZmlsZSB0byB0aGUgZGVsZXRlIHRhc2sKKyAgICAgICAgICAgIC8vIGJlY2F1c2Ugb2YgcmFjZSBjb25kaXRpb25zIG9jY3VyaW5nIG9uIFdpbmRvd3MKKyAgICAgICAgICAgIERlbGV0ZSBteWRlbGV0ZSA9IG5ldyBEZWxldGUoKTsKKyAgICAgICAgICAgIG15ZGVsZXRlLmJpbmRUb093bmVyKHRoaXMpOworICAgICAgICAgICAgbXlkZWxldGUuc2V0RmlsZSh0ZW1wRmlsZS5nZXRDYW5vbmljYWxGaWxlKCkpOworICAgICAgICAgICAgbXlkZWxldGUuZXhlY3V0ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogIGZpbmQgYSBzdWl0YWJsZSBuYW1lIGZvciBsb2NhbCBhbmQgcmVtb3RlIHRlbXBvcmFyeSBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGZpbmRGaWxlTmFtZShGVFBDbGllbnQgZnRwKSB7CisgICAgICAgIEZUUEZpbGUgW10gdGhlRmlsZXMgPSBudWxsOworICAgICAgICBmaW5hbCBpbnQgbWF4SXRlcmF0aW9ucyA9IDEwMDA7CisgICAgICAgIGZvciAoaW50IGNvdW50ZXIgPSAxOyBjb3VudGVyIDwgbWF4SXRlcmF0aW9uczsgY291bnRlcisrKSB7CisgICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoCisgICAgICAgICAgICAgICAgImFudCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50ZXIpLCAiLnRtcCIsCisgICAgICAgICAgICAgICAgbnVsbCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGxvY2FsRmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICh0aGVGaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRoZUZpbGVzID0gZnRwLmxpc3RGaWxlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb3VudGVyMiA9IDA7IGNvdW50ZXIyIDwgdGhlRmlsZXMubGVuZ3RoOyBjb3VudGVyMisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGVGaWxlc1tjb3VudGVyMl0gIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhlRmlsZXNbY291bnRlcjJdLmdldE5hbWUoKS5lcXVhbHMoZmlsZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIGxvY2FsRmlsZS5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxGaWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgVElNRVNUQU1QX0xPR0dJTkdfU0RGID0KKyAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MiKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIHJlbW90ZSBmaWxlIGlzIGN1cnJlbnQgYXMgY29tcGFyZWQgd2l0aCB0aGUgbG9jYWwKKyAgICAgKiBmaWxlLiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBmaWxlIGlzIHVwIHRvIGRhdGUuCisgICAgICogQHBhcmFtIGZ0cCBmdHBjbGllbnQKKyAgICAgKiBAcGFyYW0gbG9jYWxGaWxlIGxvY2FsIGZpbGUKKyAgICAgKiBAcGFyYW0gcmVtb3RlRmlsZSByZW1vdGUgZmlsZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGZpbGUgaXMgdXAgdG8gZGF0ZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGluIHVua25vd24gY2lyY3Vtc3RhbmNlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGRhdGUgb2YgdGhlIHJlbW90ZSBmaWxlcyBjYW5ub3QgYmUgZm91bmQgYW5kIHRoZSBhY3Rpb24gaXMKKyAgICAgKiBHRVRfRklMRVMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwVG9EYXRlKEZUUENsaWVudCBmdHAsIEZpbGUgbG9jYWxGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbW90ZUZpbGUpCisgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJjaGVja2luZyBkYXRlIGZvciAiICsgcmVtb3RlRmlsZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgRlRQRmlsZVtdIGZpbGVzID0gZnRwLmxpc3RGaWxlcyhyZW1vdGVGaWxlKTsKKworICAgICAgICAvLyBGb3IgTWljcm9zb2Z0J3MgRnRwLVNlcnZpY2UgYW4gQXJyYXkgd2l0aCBsZW5ndGggMCBpcworICAgICAgICAvLyByZXR1cm5lZCBpZiBjb25maWd1cmVkIHRvIHJldHVybiBsaXN0aW5ncyBpbiAiTVMtRE9TIi1Gb3JtYXQKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBzZW5kaW5nIGZpbGVzLCB0aGVuIGFzc3VtZSBvdXQgb2YgZGF0ZS4KKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBnZXR0aW5nIGZpbGVzLCB0aGVuIHRocm93IGFuIGVycm9yCisKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gU0VORF9GSUxFUykgeworICAgICAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGRhdGUgdGVzdCByZW1vdGUgZmlsZTogIiArIHJlbW90ZUZpbGUKKyAgICAgICAgICAgICAgICAgICAgICsgImFzc3VtaW5nIG91dCBvZiBkYXRlLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgZGF0ZSB0ZXN0IHJlbW90ZSBmaWxlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9uZyByZW1vdGVUaW1lc3RhbXAgPSBmaWxlc1swXS5nZXRUaW1lc3RhbXAoKS5nZXRUaW1lKCkuZ2V0VGltZSgpOworICAgICAgICBsb25nIGxvY2FsVGltZXN0YW1wID0gbG9jYWxGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICBsb25nIGFkanVzdGVkUmVtb3RlVGltZXN0YW1wID0KKyAgICAgICAgICAgIHJlbW90ZVRpbWVzdGFtcCArIHRoaXMudGltZURpZmZNaWxsaXMgKyB0aGlzLmdyYW51bGFyaXR5TWlsbGlzOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCIgICBbIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKFRJTUVTVEFNUF9MT0dHSU5HX1NERi5mb3JtYXQobmV3IERhdGUobG9jYWxUaW1lc3RhbXApKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJdIGxvY2FsIik7CisgICAgICAgIGxvZyhtc2cudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigiICAgWyIpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKFRJTUVTVEFNUF9MT0dHSU5HX1NERi5mb3JtYXQobmV3IERhdGUoYWRqdXN0ZWRSZW1vdGVUaW1lc3RhbXApKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJdIHJlbW90ZSIpOworICAgICAgICBpZiAocmVtb3RlVGltZXN0YW1wICE9IGFkanVzdGVkUmVtb3RlVGltZXN0YW1wKSB7CisgICAgICAgICAgICBtc2cuYXBwZW5kKCIgLSAocmF3OiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoVElNRVNUQU1QX0xPR0dJTkdfU0RGLmZvcm1hdChuZXcgRGF0ZShyZW1vdGVUaW1lc3RhbXApKSkKKyAgICAgICAgICAgIC5hcHBlbmQoIikiKTsKKyAgICAgICAgfQorICAgICAgICBsb2cobXNnLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisKKworICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT0gU0VORF9GSUxFUykgeworICAgICAgICAgICAgcmV0dXJuIGFkanVzdGVkUmVtb3RlVGltZXN0YW1wID49IGxvY2FsVGltZXN0YW1wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxvY2FsVGltZXN0YW1wID49IGFkanVzdGVkUmVtb3RlVGltZXN0YW1wOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAqIFNlbmRzIGEgc2l0ZSBjb21tYW5kIHRvIHRoZSBmdHAgc2VydmVyCisgICAgKiBAcGFyYW0gZnRwIGZ0cCBjbGllbnQKKyAgICAqIEBwYXJhbSB0aGVDTUQgY29tbWFuZCB0byBleGVjdXRlCisgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBpbiB1bmtub3duIGNpcmN1bXN0YW5jZXMKKyAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaW4gdW5rbm93biBjaXJjdW1zdGFuY2VzCisgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1NpdGVDb21tYW5kKEZUUENsaWVudCBmdHAsIFN0cmluZyB0aGVDTUQpCisgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiByYzsKKyAgICAgICAgU3RyaW5nW10gbXlSZXBseSA9IG51bGw7CisKKyAgICAgICAgbG9nKCJEb2luZyBTaXRlIENvbW1hbmQ6ICIgKyB0aGVDTUQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIHJjID0gZnRwLnNlbmRTaXRlQ29tbWFuZCh0aGVDTUQpOworCisgICAgICAgIGlmICghcmMpIHsKKyAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIGlzc3VlIFNpdGUgQ29tbWFuZDogIiArIHRoZUNNRCwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIG15UmVwbHkgPSBmdHAuZ2V0UmVwbHlTdHJpbmdzKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbXlSZXBseS5sZW5ndGg7IHgrKykgeworICAgICAgICAgICAgICAgIGlmIChteVJlcGx5W3hdLmluZGV4T2YoIjIwMCIpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhteVJlcGx5W3hdLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgc2luZ2xlIGZpbGUgdG8gdGhlIHJlbW90ZSBob3N0LiA8Y29kZT5maWxlbmFtZTwvY29kZT4gbWF5CisgICAgICogY29udGFpbiBhIHJlbGF0aXZlIHBhdGggc3BlY2lmaWNhdGlvbi4gV2hlbiB0aGlzIGlzIHRoZSBjYXNlLCA8Y29kZT5zZW5kRmlsZTwvY29kZT4KKyAgICAgKiB3aWxsIGF0dGVtcHQgdG8gY3JlYXRlIGFueSBuZWNlc3NhcnkgcGFyZW50IGRpcmVjdG9yaWVzIGJlZm9yZSBzZW5kaW5nCisgICAgICogdGhlIGZpbGUuIFRoZSBmaWxlIHdpbGwgdGhlbiBiZSBzZW50IHVzaW5nIHRoZSBlbnRpcmUgcmVsYXRpdmUgcGF0aAorICAgICAqIHNwZWMgLSBubyBhdHRlbXB0IGlzIG1hZGUgdG8gY2hhbmdlIGRpcmVjdG9yaWVzLiBJdCBpcyBhbnRpY2lwYXRlZCB0aGF0CisgICAgICogdGhpcyBtYXkgZXZlbnR1YWxseSBjYXVzZSBwcm9ibGVtcyB3aXRoIHNvbWUgRlRQIHNlcnZlcnMsIGJ1dCBpdAorICAgICAqIHNpbXBsaWZpZXMgdGhlIGNvZGluZy4KKyAgICAgKiBAcGFyYW0gZnRwIGZ0cCBjbGllbnQKKyAgICAgKiBAcGFyYW0gZGlyIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSBmaWxlIHRvIGJlIHNlbnQgKGxvY2FsKQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGJlIHNlbmQKKyAgICAgKiAgICAgICAgbG9jYWxseSByZWxhdGl2ZSB0byBkaXIKKyAgICAgKiAgICAgICAgcmVtb3RlbHkgcmVsYXRpdmUgdG8gdGhlIHJlbW90ZWRpciBhdHRyaWJ1dGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBpbiB1bmtub3duIGNpcmN1bXN0YW5jZXMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGluIHVua25vd24gY2lyY3Vtc3RhbmNlcworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRGaWxlKEZUUENsaWVudCBmdHAsIFN0cmluZyBkaXIsIFN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFhYWCAtIHdoeSBub3Qgc2ltcGx5IG5ldyBGaWxlKGRpciwgZmlsZW5hbWUpPworICAgICAgICAgICAgRmlsZSBmaWxlID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKG5ldyBGaWxlKGRpciwgZmlsZW5hbWUpLmdldFBhdGgoKSk7CisKKyAgICAgICAgICAgIGlmIChuZXdlck9ubHkgJiYgaXNVcFRvRGF0ZShmdHAsIGZpbGUsIHJlc29sdmVGaWxlKGZpbGVuYW1lKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJ0cmFuc2ZlcnJpbmcgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOworCisgICAgICAgICAgICBjcmVhdGVQYXJlbnRzKGZ0cCwgZmlsZW5hbWUpOworCisgICAgICAgICAgICBmdHAuc3RvcmVGaWxlKHJlc29sdmVGaWxlKGZpbGVuYW1lKSwgaW5zdHJlYW0pOworCisgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpOworCisgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICJjb3VsZCBub3QgcHV0IGZpbGU6ICIgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIGlmIChza2lwRmFpbGVkVHJhbnNmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhzLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIHNob3VsZCBpc3N1ZSBhIGNobW9kIGNvbW1hbmQKKyAgICAgICAgICAgICAgICBpZiAoY2htb2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkb1NpdGVDb21tYW5kKGZ0cCwgImNobW9kICIgKyBjaG1vZCArICIgIiArIHJlc29sdmVGaWxlKGZpbGVuYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZygiRmlsZSAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgY29waWVkIHRvICIgKyBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIHRyYW5zZmVycmVkKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaW5zdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGl0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgYSBmaWxlIGZyb20gdGhlIHJlbW90ZSBob3N0LgorICAgICAqIEBwYXJhbSBmdHAgZnRwIGNsaWVudAorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlIHRvIGRlbGV0ZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGluIHVua25vd24gY2lyY3Vtc3RhbmNlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc2tpcEZhaWxlZFRyYW5zZmVycyBpcyBzZXQgdG8gZmFsc2UKKyAgICAgKiBhbmQgdGhlIGRlbGV0aW9uIGNvdWxkIG5vdCBiZSBkb25lCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVsRmlsZShGVFBDbGllbnQgZnRwLCBTdHJpbmcgZmlsZW5hbWUpCisgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGxvZygiZGVsZXRpbmcgIiArIGZpbGVuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZnRwLmRlbGV0ZUZpbGUocmVzb2x2ZUZpbGUoZmlsZW5hbWUpKSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSAiY291bGQgbm90IGRlbGV0ZSBmaWxlOiAiICsgZnRwLmdldFJlcGx5U3RyaW5nKCk7CisKKyAgICAgICAgICAgIGlmIChza2lwRmFpbGVkVHJhbnNmZXJzKSB7CisgICAgICAgICAgICAgICAgbG9nKHMsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIHNraXBwZWQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJGaWxlICIgKyBmaWxlbmFtZSArICIgZGVsZXRlZCBmcm9tICIgKyBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB0cmFuc2ZlcnJlZCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgZGlyZWN0b3J5LCBpZiBlbXB0eSwgZnJvbSB0aGUgcmVtb3RlIGhvc3QuCisgICAgICogQHBhcmFtIGZ0cCBmdHAgY2xpZW50CisgICAgICogQHBhcmFtIGRpcm5hbWUgZGlyZWN0b3J5IHRvIGRlbGV0ZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGluIHVua25vd24gY2lyY3Vtc3RhbmNlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc2tpcEZhaWxlZFRyYW5zZmVycyBpcyBzZXQgdG8gZmFsc2UKKyAgICAgKiBhbmQgdGhlIGRlbGV0aW9uIGNvdWxkIG5vdCBiZSBkb25lCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcm1EaXIoRlRQQ2xpZW50IGZ0cCwgU3RyaW5nIGRpcm5hbWUpCisgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGxvZygicmVtb3ZpbmcgIiArIGRpcm5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmdHAucmVtb3ZlRGlyZWN0b3J5KHJlc29sdmVGaWxlKGRpcm5hbWUpKSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSAiY291bGQgbm90IHJlbW92ZSBkaXJlY3Rvcnk6ICIgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKTsKKworICAgICAgICAgICAgaWYgKHNraXBGYWlsZWRUcmFuc2ZlcnMpIHsKKyAgICAgICAgICAgICAgICBsb2cocywgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgc2tpcHBlZCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIkRpcmVjdG9yeSAiICsgZGlybmFtZSArICIgcmVtb3ZlZCBmcm9tICIgKyBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB0cmFuc2ZlcnJlZCsrOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHNpbmdsZSBmaWxlIGZyb20gdGhlIHJlbW90ZSBob3N0LiA8Y29kZT5maWxlbmFtZTwvY29kZT4gbWF5CisgICAgICogY29udGFpbiBhIHJlbGF0aXZlIHBhdGggc3BlY2lmaWNhdGlvbi4gPHA+CisgICAgICoKKyAgICAgKiBUaGUgZmlsZSB3aWxsIHRoZW4gYmUgcmV0cmVpdmVkIHVzaW5nIHRoZSBlbnRpcmUgcmVsYXRpdmUgcGF0aCBzcGVjIC0KKyAgICAgKiBubyBhdHRlbXB0IGlzIG1hZGUgdG8gY2hhbmdlIGRpcmVjdG9yaWVzLiBJdCBpcyBhbnRpY2lwYXRlZCB0aGF0IHRoaXMKKyAgICAgKiBtYXkgZXZlbnR1YWxseSBjYXVzZSBwcm9ibGVtcyB3aXRoIHNvbWUgRlRQIHNlcnZlcnMsIGJ1dCBpdCBzaW1wbGlmaWVzCisgICAgICogdGhlIGNvZGluZy48L3A+CisgICAgICogQHBhcmFtIGZ0cCB0aGUgZnRwIGNsaWVudAorICAgICAqIEBwYXJhbSBkaXIgbG9jYWwgYmFzZSBkaXJlY3RvcnkgdG8gd2hpY2ggdGhlIGZpbGUgc2hvdWxkIGdvIGJhY2sKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSBiYXNlZCB1cG9uIHRoZSBmdHAgcmVtb3RlIGRpcmVjdG9yeQorICAgICAqICAgICAgICBhbmQvb3IgdGhlIGxvY2FsIGJhc2UgZGlyZWN0b3J5IChkaXIpCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgaW4gdW5rbm93biBjaXJjdW1zdGFuY2VzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBza2lwRmFpbGVkVHJhbnNmZXJzIGlzIGZhbHNlCisgICAgICogYW5kIHRoZSBmaWxlIGNhbm5vdCBiZSByZXRyaWV2ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZ2V0RmlsZShGVFBDbGllbnQgZnRwLCBTdHJpbmcgZGlyLCBTdHJpbmcgZmlsZW5hbWUpCisgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtIG91dHN0cmVhbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUobmV3IEZpbGUoZGlyLCBmaWxlbmFtZSkuZ2V0UGF0aCgpKTsKKworICAgICAgICAgICAgaWYgKG5ld2VyT25seSAmJiBpc1VwVG9EYXRlKGZ0cCwgZmlsZSwgcmVzb2x2ZUZpbGUoZmlsZW5hbWUpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBsb2coInRyYW5zZmVycmluZyAiICsgZmlsZW5hbWUgKyAiIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGUgcGRpciA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworCisgICAgICAgICAgICBpZiAoIXBkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBwZGlyLm1rZGlycygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0c3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgICAgIGZ0cC5yZXRyaWV2ZUZpbGUocmVzb2x2ZUZpbGUoZmlsZW5hbWUpLCBvdXRzdHJlYW0pOworCisgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICJjb3VsZCBub3QgZ2V0IGZpbGU6ICIgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIGlmIChza2lwRmFpbGVkVHJhbnNmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhzLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJGaWxlICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiBjb3BpZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICArIHNlcnZlciwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgdHJhbnNmZXJyZWQrKzsKKyAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMYXN0TW9kaWZpZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0c3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIEZUUEZpbGVbXSByZW1vdGUgPSBmdHAubGlzdEZpbGVzKHJlc29sdmVGaWxlKGZpbGVuYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdGUubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5zZXRGaWxlTGFzdE1vZGlmaWVkKGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVbMF0uZ2V0VGltZXN0YW1wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChvdXRzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogTGlzdCBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBmaWxlIGZyb20gdGhlIHJlbW90ZSBob3N0LiA8Y29kZT5maWxlbmFtZTwvY29kZT4KKyAgICAgKiBtYXkgY29udGFpbiBhIHJlbGF0aXZlIHBhdGggc3BlY2lmaWNhdGlvbi4gPHA+CisgICAgICoKKyAgICAgKiBUaGUgZmlsZSBsaXN0aW5nIHdpbGwgdGhlbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlIGVudGlyZSByZWxhdGl2ZSBwYXRoCisgICAgICogc3BlYyAtIG5vIGF0dGVtcHQgaXMgbWFkZSB0byBjaGFuZ2UgZGlyZWN0b3JpZXMuIEl0IGlzIGFudGljaXBhdGVkIHRoYXQKKyAgICAgKiB0aGlzIG1heSBldmVudHVhbGx5IGNhdXNlIHByb2JsZW1zIHdpdGggc29tZSBGVFAgc2VydmVycywgYnV0IGl0CisgICAgICogc2ltcGxpZmllcyB0aGUgY29kaW5nLjwvcD4KKyAgICAgKiBAcGFyYW0gZnRwIGZ0cCBjbGllbnQKKyAgICAgKiBAcGFyYW0gYncgYnVmZmVyZWQgd3JpdGVyCisgICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBkaXJlY3Rvcnkgb25lIHdhbnRzIHRvIGxpc3QKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBpbiB1bmtub3duIGNpcmN1bXN0YW5jZXMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGluIHVua25vd24gY2lyY3Vtc3RhbmNlcworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxpc3RGaWxlKEZUUENsaWVudCBmdHAsIEJ1ZmZlcmVkV3JpdGVyIGJ3LCBTdHJpbmcgZmlsZW5hbWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGxvZygibGlzdGluZyAiICsgZmlsZW5hbWUpOworICAgICAgICB9CisgICAgICAgIEZUUEZpbGVbXSBmdHBmaWxlcyA9IGZ0cC5saXN0RmlsZXMocmVzb2x2ZUZpbGUoZmlsZW5hbWUpKTsKKworICAgICAgICBpZiAoZnRwZmlsZXMgIT0gbnVsbCAmJiBmdHBmaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBidy53cml0ZShmdHBmaWxlc1swXS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGJ3Lm5ld0xpbmUoKTsKKyAgICAgICAgICAgIHRyYW5zZmVycmVkKys7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBvbiB0aGUgcmVtb3RlIGhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnRwIFRoZSBGVFAgY2xpZW50IGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gZGlyIFRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlIChmb3JtYXQgbXVzdCBiZSBjb3JyZWN0IGZvciBob3N0CisgICAgICogICAgICB0eXBlKQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGluIHVua25vd24gY2lyY3Vtc3RhbmNlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgaWdub3JlTm9uY3JpdGljYWxFcnJvcnMgaGFzIG5vdCBiZWVuIHNldCB0byB0cnVlCisgICAgICogICAgICAgICBhbmQgYSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQsIGZvciBpbnN0YW5jZSBiZWNhdXNlIGl0IHdhcworICAgICAqICAgICAgICAgYWxyZWFkeSBleGlzdGluZy4gUHJlY2lzZWx5LCB0aGUgY29kZXMgNTIxLCA1NTAgYW5kIDU1MyB3aWxsIHRyaWdnZXIKKyAgICAgKiAgICAgICAgIGEgQnVpbGRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlUmVtb3RlRGlyKEZUUENsaWVudCBmdHAsIFN0cmluZyBkaXIpCisgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkgPSBmdHAucHJpbnRXb3JraW5nRGlyZWN0b3J5KCk7CisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBsb2coIkNyZWF0aW5nIGRpcmVjdG9yeTogIiArIGRpcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpci5pbmRleE9mKCIvIikgPT0gMCkgeworICAgICAgICAgICAgZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoIi8iKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgc3ViZGlyID0gIiI7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGlyLCAiLyIpOworICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBzdWJkaXIgPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGxvZygiQ2hlY2tpbmcgIiArIHN1YmRpciwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgaWYgKCFmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShzdWJkaXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmdHAubWFrZURpcmVjdG9yeShzdWJkaXIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVzIDUyMSwgNTUwIGFuZCA1NTMgY2FuIGJlIHByb2R1Y2VkIGJ5IEZUUCBTZXJ2ZXJzCisgICAgICAgICAgICAgICAgICAgIC8vICB0byBpbmRpY2F0ZSB0aGF0IGFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IGhhcworICAgICAgICAgICAgICAgICAgICAvLyAgZmFpbGVkIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cy4KKyAgICAgICAgICAgICAgICAgICAgaW50IHJjID0gZnRwLmdldFJlcGx5Q29kZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIShpZ25vcmVOb25jcml0aWNhbEVycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHJjID09IEZUUFJlcGx5LkNPREVfNTUwIHx8IHJjID09IEZUUFJlcGx5LkNPREVfNTUzCisgICAgICAgICAgICAgICAgICAgICAgICB8fCByYyA9PSBDT0RFXzUyMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEaXJlY3RvcnkgY3JlYXRlZCBPSyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHN1YmRpcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh3b3JraW5nRGlyZWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHdvcmtpbmdEaXJlY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbG9vayBhdCB0aGUgcmVzcG9uc2UgZm9yIGEgZmFpbGVkIG1rZGlyIGFjdGlvbiwgZGVjaWRlIHdoZXRoZXIKKyAgICAgKiBpdCBtYXR0ZXJzIG9yIG5vdC4gSWYgaXQgZG9lcywgd2UgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICogQHBhcmFtIGZ0cCBjdXJyZW50IGZ0cCBjb25uZWN0aW9uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGlzIGlzIGFuIGVycm9yIHRvIHNpZ25hbAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVNa0RpckZhaWx1cmUoRlRQQ2xpZW50IGZ0cCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCByYyA9IGZ0cC5nZXRSZXBseUNvZGUoKTsKKyAgICAgICAgaWYgKCEoaWdub3JlTm9uY3JpdGljYWxFcnJvcnMKKyAgICAgICAgICAgICAmJiAocmMgPT0gRlRQUmVwbHkuQ09ERV81NTAgfHwgcmMgPT0gRlRQUmVwbHkuQ09ERV81NTMgfHwgcmMgPT0gQ09ERV81MjEpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeTogIgorICAgICAgICAgICAgICAgICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyB0aGUgdGFzay4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHRhc2sgZmFpbHMgb3IgaXMgbm90IGNvbmZpZ3VyZWQKKyAgICAgKiAgICAgICAgIGNvcnJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgRlRQQ2xpZW50IGZ0cCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZygiT3BlbmluZyBGVFAgY29ubmVjdGlvbiB0byAiICsgc2VydmVyLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgZnRwID0gbmV3IEZUUENsaWVudCgpOworICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25maWd1cmF0aW9uU2V0KSB7CisgICAgICAgICAgICAgICAgZnRwID0gRlRQQ29uZmlndXJhdG9yLmNvbmZpZ3VyZShmdHAsIHRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdHAuY29ubmVjdChzZXJ2ZXIsIHBvcnQpOworICAgICAgICAgICAgaWYgKCFGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGVFAgY29ubmVjdGlvbiBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgbG9nKCJsb2dnaW5nIGluIHRvIEZUUCBzZXJ2ZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgaWYgKCh0aGlzLmFjY291bnQgIT0gbnVsbCAmJiAhZnRwLmxvZ2luKHVzZXJpZCwgcGFzc3dvcmQsIGFjY291bnQpKQorICAgICAgICAgICAgICAgICAgICB8fCAodGhpcy5hY2NvdW50ID09IG51bGwgJiYgIWZ0cC5sb2dpbih1c2VyaWQsIHBhc3N3b3JkKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2dpbiB0byBGVFAgc2VydmVyIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvZygibG9naW4gc3VjY2VlZGVkIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgICAgIGlmIChiaW5hcnkpIHsKKyAgICAgICAgICAgICAgICBmdHAuc2V0RmlsZVR5cGUob3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQLklNQUdFX0ZJTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgaWYgKCFGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IHNldCB0cmFuc2ZlciB0eXBlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZ0cC5zZXRGaWxlVHlwZShvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFAuQVNDSUlfRklMRV9UWVBFKTsKKyAgICAgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3Qgc2V0IHRyYW5zZmVyIHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhc3NpdmUpIHsKKyAgICAgICAgICAgICAgICBsb2coImVudGVyaW5nIHBhc3NpdmUgbW9kZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIGZ0cC5lbnRlckxvY2FsUGFzc2l2ZU1vZGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgZW50ZXIgaW50byBwYXNzaXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJtb2RlOiAiICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgYW4gaW5pdGlhbCBjb21tYW5kIHdhcyBjb25maWd1cmVkIHRoZW4gc2VuZCBpdC4KKyAgICAgICAgICAgIC8vIFNvbWUgRlRQIHNlcnZlcnMgb2ZmZXIgZGlmZmVyZW50IG1vZGVzIG9mIG9wZXJhdGlvbiwKKyAgICAgICAgICAgIC8vIEUuRy4gc3dpdGNoaW5nIGJldHdlZW4gYSBVTklYIGZpbGUgc3lzdGVtIG1vZGUgYW5kCisgICAgICAgICAgICAvLyBhIGxlZ2FjeSBmaWxlIHN5c3RlbS4KKyAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxTaXRlQ29tbWFuZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUmV0cnlIYW5kbGVyIGggPSBuZXcgUmV0cnlIYW5kbGVyKHRoaXMucmV0cmllc0FsbG93ZWQsIHRoaXMpOworICAgICAgICAgICAgICAgIGZpbmFsIEZUUENsaWVudCBsZnRwID0gZnRwOworICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXRyeWFibGUoaCwgbmV3IFJldHJ5YWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb1NpdGVDb21tYW5kKGxmdHAsIEZUUC50aGlzLmluaXRpYWxTaXRlQ29tbWFuZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCAiaW5pdGlhbCBzaXRlIGNvbW1hbmQ6ICIgKyB0aGlzLmluaXRpYWxTaXRlQ29tbWFuZCk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gRm9yIGEgdW5peCBmdHAgc2VydmVyIHlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IG1hc2sgZm9yIGFsbCBmaWxlcworICAgICAgICAgICAgLy8gY3JlYXRlZC4KKworICAgICAgICAgICAgaWYgKHVtYXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBSZXRyeUhhbmRsZXIgaCA9IG5ldyBSZXRyeUhhbmRsZXIodGhpcy5yZXRyaWVzQWxsb3dlZCwgdGhpcyk7CisgICAgICAgICAgICAgICAgZmluYWwgRlRQQ2xpZW50IGxmdHAgPSBmdHA7CisgICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCBuZXcgUmV0cnlhYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvU2l0ZUNvbW1hbmQobGZ0cCwgInVtYXNrICIgKyB1bWFzayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCAidW1hc2sgIiArIHVtYXNrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhlIGFjdGlvbiBpcyBNS19ESVIsIHRoZW4gdGhlIHNwZWNpZmllZCByZW1vdGUKKyAgICAgICAgICAgIC8vIGRpcmVjdG9yeSBpcyB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZS4KKworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNS19ESVIpIHsKKyAgICAgICAgICAgICAgICBSZXRyeUhhbmRsZXIgaCA9IG5ldyBSZXRyeUhhbmRsZXIodGhpcy5yZXRyaWVzQWxsb3dlZCwgdGhpcyk7CisgICAgICAgICAgICAgICAgZmluYWwgRlRQQ2xpZW50IGxmdHAgPSBmdHA7CisgICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCBuZXcgUmV0cnlhYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VSZW1vdGVEaXIobGZ0cCwgcmVtb3RlZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIHJlbW90ZWRpcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBTSVRFX0NNRCkgeworICAgICAgICAgICAgICAgICAgICBSZXRyeUhhbmRsZXIgaCA9IG5ldyBSZXRyeUhhbmRsZXIodGhpcy5yZXRyaWVzQWxsb3dlZCwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZUUENsaWVudCBsZnRwID0gZnRwOworICAgICAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKGgsIG5ldyBSZXRyeWFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1NpdGVDb21tYW5kKGxmdHAsIEZUUC50aGlzLnNpdGVDb21tYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSwgIlNpdGUgQ29tbWFuZDogIiArIHRoaXMuc2l0ZUNvbW1hbmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtb3RlZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJjaGFuZ2luZyB0aGUgcmVtb3RlIGRpcmVjdG9yeSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShyZW1vdGVkaXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IGNoYW5nZSByZW1vdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkaXJlY3Rvcnk6ICIgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5ld2VyT25seSAmJiB0aW1lRGlmZkF1dG8pIHsKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBmaW5kIGhvdyBtdWNoIHRpbWUgc3BhbiB0aGVyZSBpcyBiZXR3ZWVuIGxvY2FsCisgICAgICAgICAgICAgICAgLy8gYW5kIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICB0aW1lRGlmZk1pbGxpcyA9IGdldFRpbWVEaWZmKGZ0cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZyhBQ1RJT05fU1RSU1thY3Rpb25dICsgIiAiICsgQUNUSU9OX1RBUkdFVF9TVFJTW2FjdGlvbl0pOworICAgICAgICAgICAgICAgIHRyYW5zZmVyRmlsZXMoZnRwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJlcnJvciBkdXJpbmcgRlRQIHRyYW5zZmVyOiAiICsgZXgsIGV4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmdHAgIT0gbnVsbCAmJiBmdHAuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiZGlzY29ubmVjdGluZyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBmdHAubG9nb3V0KCk7CisgICAgICAgICAgICAgICAgICAgIGZ0cC5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGl0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBhbiBhY3Rpb24gdG8gcGVyZm9ybSwgb25lIG9mCisgICAgICogInNlbmQiLCAicHV0IiwgInJlY3YiLCAiZ2V0IiwgImRlbCIsICJkZWxldGUiLCAibGlzdCIsICJta2RpciIsICJjaG1vZCIsCisgICAgICogInJtZGlyIgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWN0aW9uIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfQUNUSU9OUyA9IHsKKyAgICAgICAgICAgICJzZW5kIiwgInB1dCIsICJyZWN2IiwgImdldCIsICJkZWwiLCAiZGVsZXRlIiwgImxpc3QiLCAibWtkaXIiLAorICAgICAgICAgICAgImNobW9kIiwgInJtZGlyIiwgInNpdGUiCisgICAgICAgICAgICB9OworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdmFsaWQgdmFsdWVzCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHZhbGlkIEZUUCBhY3Rpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxJRF9BQ1RJT05TOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBzeW1ib2xpYyBlcXVpdmFsZW50IG9mIHRoZSBhY3Rpb24gdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIFNZTUJPTCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGFjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKCkgeworICAgICAgICAgICAgU3RyaW5nIGFjdGlvbkwgPSBnZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisKKyAgICAgICAgICAgIGlmIChhY3Rpb25MLmVxdWFscygic2VuZCIpIHx8IGFjdGlvbkwuZXF1YWxzKCJwdXQiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTRU5EX0ZJTEVTOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25MLmVxdWFscygicmVjdiIpIHx8IGFjdGlvbkwuZXF1YWxzKCJnZXQiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBHRVRfRklMRVM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbkwuZXF1YWxzKCJkZWwiKSB8fCBhY3Rpb25MLmVxdWFscygiZGVsZXRlIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVMX0ZJTEVTOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25MLmVxdWFscygibGlzdCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExJU1RfRklMRVM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbkwuZXF1YWxzKCJjaG1vZCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENITU9EOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25MLmVxdWFscygibWtkaXIiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNS19ESVI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbkwuZXF1YWxzKCJybWRpciIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJNX0RJUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uTC5lcXVhbHMoInNpdGUiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTSVRFX0NNRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTRU5EX0ZJTEVTOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIHJlcHJlc2VudHMgb25lIG9mIHRoZSB2YWxpZCB0aW1lc3RhbXAgYWRqdXN0bWVudCB2YWx1ZXMKKyAgICAgKiByZWNvZ25pemVkIGJ5IHRoZSA8Y29kZT50aW1lc3RhbXBHcmFudWxhcml0eTwvY29kZT4gYXR0cmlidXRlLjxwPgorCisgICAgICogQSB0aW1lc3RhbXAgYWRqdXN0bWVudCBtYXkgYmUgdXNlZCBpbiBmaWxlIHRyYW5zZmVycyBmb3IgY2hlY2tpbmcKKyAgICAgKiB1cHRvZGF0ZW5lc3MuIE1JTlVURSBtZWFucyB0byBhZGQgb25lIG1pbnV0ZSB0byB0aGUgc2VydmVyCisgICAgICogdGltZXN0YW1wLiAgVGhpcyBpcyBkb25lIGJlY2F1c2UgRlRQIHNlcnZlcnMgdHlwaWNhbGx5IGxpc3QKKyAgICAgKiB0aW1lc3RhbXBzIEhIOm1tIGFuZCBjbGllbnQgRmlsZVN5c3RlbXMgdHlwaWNhbGx5IHVzZSBISDptbTpzcy4KKyAgICAgKgorICAgICAqIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSBNSU5VVEUgZm9yIFBVVCBhY3Rpb25zIGFuZCBOT05FIGZvciBHRVQKKyAgICAgKiBhY3Rpb25zLCBzaW5jZSBHRVRzIGhhdmUgdGhlIDxjb2RlPnByZXNlcnZlTGFzdE1vZGlmaWVkPC9jb2RlPgorICAgICAqIG9wdGlvbiwgd2hpY2ggdGFrZXMgY2FyZSBvZiB0aGUgcHJvYmxlbSBpbiBtb3N0IHVzZSBjYXNlcyB3aGVyZQorICAgICAqIHRoaXMgbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgaXMgYW4gaXNzdWUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyYW51bGFyaXR5IGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfR1JBTlVMQVJJVElFUyA9IHsKKyAgICAgICAgICAgICAgICAiIiwgIk1JTlVURSIsICJOT05FIgorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHZhbGlkIHZhbHVlcy4KKyAgICAgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB2YWxpZCBHcmFudWxhcml0eSB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgICAgICByZXR1cm4gVkFMSURfR1JBTlVMQVJJVElFUzsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgICogdGhlIGF0dHJpYnV0ZSwgd2hpY2ggY2FuIHZhcnkgaW4gc29tZSBjYXNlcyBkZXBlbmRpbmcKKyAgICAgICAgICogb24gdGhlIHZhbHVlIG9mIHRoZSBhY3Rpb24gcGFyYW1ldGVyLgorICAgICAgICAgKiBAcGFyYW0gYWN0aW9uIFNFTkRfRklMRVMgb3IgR0VUX0ZJTEVTCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgICAqIHRoZSBhdHRyaWJ1dGUsIGluIHRoZSBjb250ZXh0IG9mIHRoZSBzdXBwbGllZCBhY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGdldE1pbGxpc2Vjb25kcyhpbnQgYWN0aW9uKSB7CisgICAgICAgICAgICBTdHJpbmcgZ3JhbnVsYXJpdHlVID0gZ2V0VmFsdWUoKS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOworCisgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKGdyYW51bGFyaXR5VSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFNFTkRfRklMRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdSQU5VTEFSSVRZX01JTlVURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJNSU5VVEUiLmVxdWFscyhncmFudWxhcml0eVUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdSQU5VTEFSSVRZX01JTlVURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDBMOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBmaW5hbCBHcmFudWxhcml0eSBnZXREZWZhdWx0KCkgeworICAgICAgICAgICAgR3JhbnVsYXJpdHkgZyA9IG5ldyBHcmFudWxhcml0eSgpOworICAgICAgICAgICAgZy5zZXRWYWx1ZSgiIik7CisgICAgICAgICAgICByZXR1cm4gZzsKKyAgICAgICAgfQorCisgICB9CisgICAvKioKKyAgICAgICAgICogb25lIG9mIHRoZSB2YWxpZCBzeXN0ZW0gdHlwZSBrZXlzIHJlY29nbml6ZWQgYnkgdGhlIHN5c3RlbVR5cGVLZXkKKyAgICAgICAgICogYXR0cmlidXRlLgorICAgICAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZUUFN5c3RlbVR5cGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKworICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTElEX1NZU1RFTV9UWVBFUyA9IHsKKyAgICAgICAgICAgICAgICAgICAiIiwgIlVOSVgiLCAiVk1TIiwgIldJTkRPV1MiLCAiT1MvMiIsICJPUy80MDAiLAorICAgICAgICAgICAgICAgICAgICJNVlMiCisgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBHZXQgdGhlIHZhbGlkIHZhbHVlcy4KKyAgICAgICAgICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdmFsaWQgc3lzdGVtIHR5cGVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBWQUxJRF9TWVNURU1fVFlQRVM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRpYyBmaW5hbCBGVFBTeXN0ZW1UeXBlIGdldERlZmF1bHQoKSB7CisgICAgICAgICAgICAgICAgRlRQU3lzdGVtVHlwZSBmdHBzdCA9IG5ldyBGVFBTeXN0ZW1UeXBlKCk7CisgICAgICAgICAgICAgICAgZnRwc3Quc2V0VmFsdWUoIiIpOworICAgICAgICAgICAgICAgIHJldHVybiBmdHBzdDsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogRW51bWVyYXRlZCBjbGFzcyBmb3IgbGFuZ3VhZ2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGFuZ3VhZ2VDb2RlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9MQU5HVUFHRV9DT0RFUyA9CisgICAgICAgICAgICBnZXRWYWxpZExhbmd1YWdlQ29kZXMoKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRWYWxpZExhbmd1YWdlQ29kZXMoKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGMgPSBGVFBDbGllbnRDb25maWcuZ2V0U3VwcG9ydGVkTGFuZ3VhZ2VDb2RlcygpOworICAgICAgICAgICAgU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1tjLnNpemUoKSArIDFdOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgcmV0W2krK10gPSAiIjsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmV0W2ldID0gKFN0cmluZykgaXQubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisKKyAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIHZhbHVlcy4KKyAgICAgICAgICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHZhbGlkIGxhbmd1YWdlIHR5cGVzLgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICAgICAgIHJldHVybiBWQUxJRF9MQU5HVUFHRV9DT0RFUzsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBzdGF0aWMgZmluYWwgTGFuZ3VhZ2VDb2RlIGdldERlZmF1bHQoKSB7CisgICAgICAgICAgICAgICAgIExhbmd1YWdlQ29kZSBsYyA9IG5ldyBMYW5ndWFnZUNvZGUoKTsKKyAgICAgICAgICAgICAgICAgbGMuc2V0VmFsdWUoIiIpOworICAgICAgICAgICAgICAgICByZXR1cm4gbGM7CisgICAgICAgICAgICAgfQorICAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFBDb25maWd1cmF0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFBDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZjYTQyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUENvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBUaGUgc29sZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgKG5vdGUgdGhhdCBpdCBpcyBwYWNrYWdlLXByaXZhdGUKKyAqIGlzIHRvIHNlcnZlIGFzIGEgc2VwYXJhdGUsIHN0YXRpYyBjb21waWxhdGlvbiB1bml0IGZvciBpbXBvcnRpbmcKKyAqIEZUUENsaWVudENvbmZpZywgdG8gZW5hYmxlIHVzZXJzIHdobyB3aXNoIHRvIHVzZSB0aGUgRlRQIHRhc2sKKyAqIHdpdGhvdXQgdXNpbmcgaXRzIG5ldyBmZWF0dXJlcyB0byBhdm9pZCAgdGhlIG5lZWQgdG8KKyAqIHVwZ3JhZGUgdG8gamFrYXJ0YS1jb21tb25zLW5ldCAxLjQuMCwgd2hlcmUgRlRQQ2xpZW50Q29uZmlnIHdhcworICogaW50cm9kdWNlZC4KKyAgKi8KKy8vIENoZWNrU3R5bGU6SGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yQ2hlY2sgT0ZGIChiYykKK2NsYXNzIEZUUENvbmZpZ3VyYXRvciB7CisgICAgLyoqCisgICAgICogY29uZmlndXJlcyB0aGUgc3VwcGxpZWQgRlRQQ2xpZW50IHdpdGggdGhlIHZhcmlvdXMKKyAgICAgKiBhdHRyaWJ1dGVzIHNldCBpbiB0aGUgc3VwcGxpZWQgRlRQIHRhc2suCisgICAgICogQHBhcmFtIGNsaWVudCB0aGUgRlRQQ2xpZW50IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiBAcGFyYW0gdGFzayB0aGUgRlRQIHRhc2sgd2hvc2UgYXR0cmlidXRlcyBhcmUgdXNlZCB0bworICAgICAqIGNvbmZpZ3VyZSB0aGUgY2xpZW50CisgICAgICogQHJldHVybiB0aGUgY2xpZW50IGFzIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgc3RhdGljIEZUUENsaWVudCBjb25maWd1cmUoRlRQQ2xpZW50IGNsaWVudCwgRlRQIHRhc2spIHsKKyAgICAgICAgdGFzay5sb2coImN1c3RvbSBjb25maWd1cmF0aW9uIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIEZUUENsaWVudENvbmZpZyBjb25maWc7CisgICAgICAgIFN0cmluZyBzeXN0ZW1UeXBlS2V5ID0gdGFzay5nZXRTeXN0ZW1UeXBlS2V5KCk7CisgICAgICAgIGlmIChzeXN0ZW1UeXBlS2V5ICE9IG51bGwgJiYgISIiLmVxdWFscyhzeXN0ZW1UeXBlS2V5KSkgeworICAgICAgICAgICAgY29uZmlnID0gbmV3IEZUUENsaWVudENvbmZpZyhzeXN0ZW1UeXBlS2V5KTsKKyAgICAgICAgICAgIHRhc2subG9nKCJjdXN0b20gY29uZmlnOiBzeXN0ZW0ga2V5ID0gIgorICAgICAgICAgICAgICAgICAgICArIHN5c3RlbVR5cGVLZXksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnID0gbmV3IEZUUENsaWVudENvbmZpZygpOworICAgICAgICAgICAgdGFzay5sb2coImN1c3RvbSBjb25maWc6IHN5c3RlbSBrZXkgPSBkZWZhdWx0IChVTklYKSIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGRlZmF1bHREYXRlRm9ybWF0Q29uZmlnID0gdGFzay5nZXREZWZhdWx0RGF0ZUZvcm1hdENvbmZpZygpOworICAgICAgICBpZiAoZGVmYXVsdERhdGVGb3JtYXRDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnLnNldERlZmF1bHREYXRlRm9ybWF0U3RyKGRlZmF1bHREYXRlRm9ybWF0Q29uZmlnKTsKKyAgICAgICAgICAgIHRhc2subG9nKCJjdXN0b20gY29uZmlnOiBkZWZhdWx0IGRhdGUgZm9ybWF0ID0gIgorICAgICAgICAgICAgICAgICAgICArIGRlZmF1bHREYXRlRm9ybWF0Q29uZmlnLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZWNlbnREYXRlRm9ybWF0Q29uZmlnID0gdGFzay5nZXRSZWNlbnREYXRlRm9ybWF0Q29uZmlnKCk7CisgICAgICAgIGlmIChyZWNlbnREYXRlRm9ybWF0Q29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZy5zZXRSZWNlbnREYXRlRm9ybWF0U3RyKHJlY2VudERhdGVGb3JtYXRDb25maWcpOworICAgICAgICAgICAgdGFzay5sb2coImN1c3RvbSBjb25maWc6IHJlY2VudCBkYXRlIGZvcm1hdCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyByZWNlbnREYXRlRm9ybWF0Q29uZmlnLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcgPSB0YXNrLmdldFNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZygpOworICAgICAgICBpZiAoc2VydmVyTGFuZ3VhZ2VDb2RlQ29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZy5zZXRTZXJ2ZXJMYW5ndWFnZUNvZGUoc2VydmVyTGFuZ3VhZ2VDb2RlQ29uZmlnKTsKKyAgICAgICAgICAgIHRhc2subG9nKCJjdXN0b20gY29uZmlnOiBzZXJ2ZXIgbGFuZ3VhZ2UgY29kZSA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBzZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHNlcnZlclRpbWVab25lQ29uZmlnID0gdGFzay5nZXRTZXJ2ZXJUaW1lWm9uZUNvbmZpZygpOworICAgICAgICBpZiAoc2VydmVyVGltZVpvbmVDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnLnNldFNlcnZlclRpbWVab25lSWQoc2VydmVyVGltZVpvbmVDb25maWcpOworICAgICAgICAgICAgdGFzay5sb2coImN1c3RvbSBjb25maWc6IHNlcnZlciB0aW1lIHpvbmUgSUQgPSAiCisgICAgICAgICAgICAgICAgICAgICsgc2VydmVyVGltZVpvbmVDb25maWcsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHNob3J0TW9udGhOYW1lc0NvbmZpZyA9IHRhc2suZ2V0U2hvcnRNb250aE5hbWVzQ29uZmlnKCk7CisgICAgICAgIGlmIChzaG9ydE1vbnRoTmFtZXNDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnLnNldFNob3J0TW9udGhOYW1lcyhzaG9ydE1vbnRoTmFtZXNDb25maWcpOworICAgICAgICAgICAgdGFzay5sb2coImN1c3RvbSBjb25maWc6IHNob3J0IG1vbnRoIG5hbWVzID0gIgorICAgICAgICAgICAgICAgICAgICArIHNob3J0TW9udGhOYW1lc0NvbmZpZywgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50LmNvbmZpZ3VyZShjb25maWcpOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9NaW1lTWFpbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L01pbWVNYWlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhNDIxNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9NaW1lTWFpbC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuRW1haWxUYXNrOworCisvKioKKyAqIEEgdGFzayB0byBzZW5kIFNNVFAgZW1haWw7IFVzZSA8dHQ+bWFpbDwvdHQ+IGluc3RlYWQKKyAqCisgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KKyAqICAgICAgICAgICAgIFVzZSB7QGxpbmsgRW1haWxUYXNrfSBpbnN0ZWFkLgorICoKKyAqIEBzaW5jZSBBbnQxLjQKKyAqLworcHVibGljIGNsYXNzIE1pbWVNYWlsIGV4dGVuZHMgRW1haWxUYXNrIHsKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGlzIGJ1aWxkIHRhc2suCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIE9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBUaGUgIiArIGdldFRhc2tOYW1lKCkgKyAiIHRhc2sgaXMgZGVwcmVjYXRlZC4gIgorICAgICAgICAgICAgKyAiVXNlIHRoZSBtYWlsIHRhc2sgaW5zdGVhZC4iKTsKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9SRXhlY1Rhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9SRXhlY1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ExMTIzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L1JFeGVjVGFzay5qYXZhCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5ic2QuUkV4ZWNDbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworLyoqCisgKiBBdXRvbWF0ZXMgdGhlIHJleGVjIHByb3RvY29sLgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KKworcHVibGljIGNsYXNzIFJFeGVjVGFzayBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVVNFX1RJTUUgPSAyNTA7CisKKyAgICAvKioKKyAgICAgKiAgVGhlIHVzZXJpZCB0byBsb2dpbiB3aXRoLCBpZiBhdXRvbWF0ZWQgbG9naW4gaXMgdXNlZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJpZCAgPSBudWxsOworCisgICAgLyoqCisgICAgICogIFRoZSBwYXNzd29yZCB0byBsb2dpbiB3aXRoLCBpZiBhdXRvbWF0ZWQgbG9naW4gaXMgdXNlZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqICBUaGUgY29tbWFuZCB0byBleGVjdXRlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiAgVGhlIHNlcnZlciB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZlciAgPSBudWxsOworCisgICAgLyoqCisgICAgICogIFRoZSB0Y3AgcG9ydCB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHBvcnQgPSBSRXhlY0NsaWVudC5ERUZBVUxUX1BPUlQ7CisKKyAgICAvKioKKyAgICAgKiAgVGhlIGxpc3Qgb2YgcmVhZC93cml0ZSBjb21tYW5kcyBmb3IgdGhpcyBzZXNzaW9uCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3IgcmV4ZWNUYXNrcyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqICBJZiB0cnVlLCBhZGRzIGEgQ1IgdG8gYmVnaW5uaW5nIG9mIGxvZ2luIHNjcmlwdAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhZGRDYXJyaWFnZVJldHVybiA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogIERlZmF1bHQgdGltZSBhbGxvd2VkIGZvciB3YWl0aW5nIGZvciBhIHZhbGlkIHJlc3BvbnNlCisgICAgICogIGZvciBhbGwgY2hpbGQgcmVhZHMuICBBIHZhbHVlIG9mIDAgbWVhbnMgbm8gbGltaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlZ2VyIGRlZmF1bHRUaW1lb3V0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqICBUaGlzIGNsYXNzIGlzIHRoZSBwYXJlbnQgb2YgdGhlIFJlYWQgYW5kIFdyaXRlIHRhc2tzLgorICAgICAqICBJdCBoYW5kbGVzIHRoZSBjb21tb24gYXR0cmlidXRlcyBmb3IgYm90aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUkV4ZWNTdWJUYXNrIHsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyB0YXNrU3RyaW5nID0gIiI7CisgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4ZWN1dGUgdGhlIHN1YnRhc2suCisgICAgICAgICAqIEBwYXJhbSByZXhlYyB0aGUgY2xpZW50CisgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWx3YXlzIGFzIGl0IGlzIG5vdCBhbGxvd2VkIHRvIGluc3RhbnRpYXRlIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFudFJFeGVjQ2xpZW50IHJleGVjKQorICAgICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNob3VsZG4ndCBiZSBhYmxlIGluc3RhbnRpYXRlIGEgU3ViVGFzayBkaXJlY3RseSIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICB0aGUgbWVzc2FnZSBhcyBuZXN0ZWQgdGV4dAorICAgICAgICAgKiBAcGFyYW0gcyB0aGUgbmVzdGVkIHRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHNldFN0cmluZyhnZXRQcm9qZWN0KCkucmVwbGFjZVByb3BlcnRpZXMocykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRoZSBtZXNzYWdlIGFzIGFuIGF0dHJpYnV0ZQorICAgICAgICAgKiBAcGFyYW0gcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgcykgeworICAgICAgICAgICB0YXNrU3RyaW5nICs9IHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgU2VuZHMgdGV4dCB0byB0aGUgY29ubmVjdGVkIHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBSRXhlY1dyaXRlIGV4dGVuZHMgUkV4ZWNTdWJUYXNrIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGVjaG9TdHJpbmcgPSB0cnVlOworICAgICAgICAvKioKKyAgICAgICAgICogRXhlY3V0ZSB0aGUgd3JpdGUgZXhlYyB0YXNrLgorICAgICAgICAgKiBAcGFyYW0gcmV4ZWMgdGhlIHRhc2sgdG8gdXNlCisgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQW50UkV4ZWNDbGllbnQgcmV4ZWMpCisgICAgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICByZXhlYy5zZW5kU3RyaW5nKHRhc2tTdHJpbmcsIGVjaG9TdHJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBtZXNzYWdlIHNob3VsZCBiZSBlY2hvZWQgdG8gdGhlIGxvZy4KKyAgICAgICAgICogRGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICAgICAqIEBwYXJhbSBiIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEVjaG8oYm9vbGVhbiBiKSB7CisgICAgICAgICAgIGVjaG9TdHJpbmcgPSBiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIFJlYWRzIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29ubmVjdGVkIHNlcnZlcgorICAgICAqICB1bnRpbCB0aGUgcmVxdWlyZWQgc3RyaW5nIGlzIGZvdW5kIG9yIHdlIHRpbWUgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBSRXhlY1JlYWQgZXh0ZW5kcyBSRXhlY1N1YlRhc2sgeworICAgICAgICBwcml2YXRlIEludGVnZXIgdGltZW91dCA9IG51bGw7CisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGVjdXRlIHRoZSByZWFkIGV4ZWMgdGFzay4KKyAgICAgICAgICogQHBhcmFtIHJleGVjIHRoZSB0YXNrIHRvIHVzZQorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFudFJFeGVjQ2xpZW50IHJleGVjKQorICAgICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJleGVjLndhaXRGb3JTdHJpbmcodGFza1N0cmluZywgdGltZW91dCk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqICBhIHRpbWVvdXQgdmFsdWUgdGhhdCBvdmVycmlkZXMgYW55IHRhc2sgd2lkZSB0aW1lb3V0LgorICAgICAgICAgKiBAcGFyYW0gaSBhbiA8Y29kZT5JbnRlZ2VyPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChJbnRlZ2VyIGkpIHsKKyAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHRpbWVvdXQgaWYgbm9uZSBoYXMgYmVlbiBzZXQgYWxyZWFkeQorICAgICAgICAgKiBAcGFyYW0gZGVmYXVsdFRpbWVvdXQgYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4gdmFsdWUKKyAgICAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFRpbWVvdXQoSW50ZWdlciBkZWZhdWx0VGltZW91dCkgeworICAgICAgICAgICBpZiAodGltZW91dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHRpbWVvdXQgPSBkZWZhdWx0VGltZW91dDsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgYWJzdHJhY3Rpb24gb2YgdGhlIHJleGVjIHByb3RvY29sLgorICAgICAqICBDdXJyZW50bHkgaXQgaXMgYSB3cmFwcGVyIGFyb3VuZCA8YQorICAgICAqICBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbmV0L2luZGV4Lmh0bWwiPkpha2FydGEKKyAgICAgKiAgQ29tbW9ucyBOZXQ8L2E+LgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBBbnRSRXhlY0NsaWVudCBleHRlbmRzIFJFeGVjQ2xpZW50IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWQgZnJvbSB0aGUgcmV4ZWMgc2Vzc2lvbiB1bnRpbCB0aGUgc3RyaW5nIHdlIGFyZQorICAgICAgICAgKiB3YWl0aW5nIGZvciBpcyBmb3VuZAorICAgICAgICAgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIHdhaXQgb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHdhaXRGb3JTdHJpbmcocywgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVhZCBmcm9tIHRoZSByZXhlYyBzZXNzaW9uIHVudGlsIHRoZSBzdHJpbmcgd2UgYXJlCisgICAgICAgICAqIHdhaXRpbmcgZm9yIGlzIGZvdW5kIG9yIHRoZSB0aW1lb3V0IGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byB3YWl0IG9uCisgICAgICAgICAqIEBwYXJhbSB0aW1lb3V0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JTdHJpbmcoU3RyaW5nIHMsIEludGVnZXIgdGltZW91dCkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB0aGlzLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSBudWxsIHx8IHRpbWVvdXQuaW50VmFsdWUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzYi50b1N0cmluZygpLmluZGV4T2YocykgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgaXMucmVhZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENhbGVuZGFyIGVuZFRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBlbmRUaW1lLmFkZChDYWxlbmRhci5TRUNPTkQsIHRpbWVvdXQuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzYi50b1N0cmluZygpLmluZGV4T2YocykgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmJlZm9yZShlbmRUaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzLmF2YWlsYWJsZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoUEFVU0VfVElNRSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXMuYXZhaWxhYmxlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc3BvbnNlIHRpbWVkLW91dCB3YWl0aW5nIGZvciBcIiIgKyBzICsgJ1wiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIGlzLnJlYWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nKHNiLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBiZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoaXMgc3RyaW5nIHRvIHRoZSByZXhlYyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gcyAgICAgICAgICB0aGUgc3RyaW5nIHRvIHdyaXRlCisgICAgICAgICAqIEBwYXJhbSBlY2hvU3RyaW5nIGlmIHRydWUgbG9nIHRoZSBzdHJpbmcgc2VudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VuZFN0cmluZyhTdHJpbmcgcywgYm9vbGVhbiBlY2hvU3RyaW5nKSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSB0aGlzLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcy53cml0ZSgocyArICJcbiIpLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIGlmIChlY2hvU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhzLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3MuZmx1c2goKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkIGZyb20gdGhlIHJleGVjIHNlc3Npb24gdW50aWwgdGhlIEVPRiBpcyBmb3VuZCBvcgorICAgICAgICAgKiB0aGUgdGltZW91dCBoYXMgYmVlbiByZWFjaGVkCisgICAgICAgICAqIEBwYXJhbSB0aW1lb3V0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JFT0YoSW50ZWdlciB0aW1lb3V0KSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHRoaXMuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dC5pbnRWYWx1ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gaXMucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpIHJlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coc2IudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5kZWxldGUoMCwgc2IubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIgZW5kVGltZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUuYWRkKENhbGVuZGFyLlNFQ09ORCwgdGltZW91dC5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBpbnQgcmVhZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5iZWZvcmUoZW5kVGltZSkgJiYgaXMuYXZhaWxhYmxlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChQQVVTRV9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcy5hdmFpbGFibGUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coc2IudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzcG9uc2UgdGltZWQtb3V0IHdhaXRpbmcgZm9yIEVPRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCA9ICBpcy5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpIHJlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhzYi50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuZGVsZXRlKDAsIHNiLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbG9nKHNiLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgYmU7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorICAgIC8qKgorICAgICAqICBBIHN0cmluZyB0byB3YWl0IGZvciBmcm9tIHRoZSBzZXJ2ZXIuCisgICAgICogIEEgc3ViVGFzayAmbHQ7cmVhZCZndDsgdGFnIHdhcyBmb3VuZC4gIENyZWF0ZSB0aGUgb2JqZWN0LAorICAgICAqICBTYXZlIGl0IGluIG91ciBsaXN0LCBhbmQgcmV0dXJuIGl0LgorICAgICAqIEByZXR1cm4gYSByZWFkIHN1YiB0YXNrCisgICAgICovCisKKyAgICBwdWJsaWMgUkV4ZWNTdWJUYXNrIGNyZWF0ZVJlYWQoKSB7CisgICAgICAgIFJFeGVjU3ViVGFzayB0YXNrID0gKFJFeGVjU3ViVGFzaykgbmV3IFJFeGVjUmVhZCgpOworICAgICAgICByZXhlY1Rhc2tzLmFkZEVsZW1lbnQodGFzayk7CisgICAgICAgIHJldHVybiB0YXNrOworICAgIH0KKyAgICAvKioKKyAgICAgKiAgQWRkIHRleHQgdG8gc2VuZCB0byB0aGUgc2VydmVyCisgICAgICogIEEgc3ViVGFzayAmbHQ7d3JpdGUmZ3Q7IHRhZyB3YXMgZm91bmQuICBDcmVhdGUgdGhlIG9iamVjdCwKKyAgICAgKiAgU2F2ZSBpdCBpbiBvdXIgbGlzdCwgYW5kIHJldHVybiBpdC4KKyAgICAgKiBAcmV0dXJuIGEgd3JpdGUgc3ViIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgUkV4ZWNTdWJUYXNrIGNyZWF0ZVdyaXRlKCkgeworICAgICAgICBSRXhlY1N1YlRhc2sgdGFzayA9IChSRXhlY1N1YlRhc2spIG5ldyBSRXhlY1dyaXRlKCk7CisgICAgICAgIHJleGVjVGFza3MuYWRkRWxlbWVudCh0YXNrKTsKKyAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgfQorICAgIC8qKgorICAgICAqICBWZXJpZnkgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQuCisgICAgICogIENvbm5lY3QgYW5kIHBvc3NpYmx5IGxvZ2luLgorICAgICAqICBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgUmVhZHMgYW5kIHdyaXRlcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8qKiAgQSBzZXJ2ZXIgbmFtZSBpcyByZXF1aXJlZCB0byBjb250aW51ZSAqLworICAgICAgICBpZiAoc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gU2VydmVyIFNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIC8qKiAgQSB1c2VyaWQgYW5kIHBhc3N3b3JkIG11c3QgYXBwZWFyIHRvZ2V0aGVyCisgICAgICAgICAqICAgaWYgdGhleSBhcHBlYXIuICBUaGV5IGFyZSBub3QgcmVxdWlyZWQuCisgICAgICAgICAqLworICAgICAgICBpZiAodXNlcmlkID09IG51bGwgJiYgcGFzc3dvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBVc2VyaWQgU3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwgJiYgdXNlcmlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gUGFzc3dvcmQgU3BlY2lmaWVkIik7CisgICAgICAgIH0KKworICAgICAgICAvKiogIENyZWF0ZSB0aGUgdGVsbmV0IGNsaWVudCBvYmplY3QgKi8KKyAgICAgICAgQW50UkV4ZWNDbGllbnQgcmV4ZWMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV4ZWMgPSBuZXcgQW50UkV4ZWNDbGllbnQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV4ZWMuY29ubmVjdChzZXJ2ZXIsIHBvcnQpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgY29ubmVjdCB0byAiICsgc2VydmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1c2VyaWQgIT0gbnVsbCAmJiBwYXNzd29yZCAhPSBudWxsICYmIGNvbW1hbmQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHJleGVjVGFza3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBzaW1wbGUgb25lLXNob3QgZXhlY3V0aW9uCisgICAgICAgICAgICAgICAgcmV4ZWMucmV4ZWModXNlcmlkLCBwYXNzd29yZCwgY29tbWFuZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG5lZWQgbmVzdGVkIHJlYWQvd3JpdGUgZWxlbWVudHMKKyAgICAgICAgICAgICAgICBoYW5kbGVNdWx0aXBsZVRhc2tzKHJleGVjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIEtlZXAgcmVhZGluZyBpbnB1dCBzdHJlYW0gdW50aWwgZW5kIG9mIGl0IG9yIHRpbWUtb3V0ICovCisgICAgICAgICAgICByZXhlYy53YWl0Rm9yRU9GKGRlZmF1bHRUaW1lb3V0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciByLWV4ZWN1dGluZyBjb21tYW5kIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocmV4ZWMgIT0gbnVsbCAmJiByZXhlYy5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV4ZWMuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBkaXNjb25uZWN0aW5nIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiAgUHJvY2VzcyBhICd0eXBpY2FsJyBsb2dpbi4gIElmIGl0IGRpZmZlcnMsIHVzZSB0aGUgcmVhZAorICAgICAqICBhbmQgd3JpdGUgdGFza3MgZXhwbGljaXRlbHkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9naW4oQW50UkV4ZWNDbGllbnQgcmV4ZWMpIHsKKyAgICAgICAgaWYgKGFkZENhcnJpYWdlUmV0dXJuKSB7CisgICAgICAgICAgICByZXhlYy5zZW5kU3RyaW5nKCJcbiIsIHRydWUpOworICAgICAgICB9CisgICAgICAgIHJleGVjLndhaXRGb3JTdHJpbmcoIm9naW46Iik7CisgICAgICAgIHJleGVjLnNlbmRTdHJpbmcodXNlcmlkLCB0cnVlKTsKKyAgICAgICAgcmV4ZWMud2FpdEZvclN0cmluZygiYXNzd29yZDoiKTsKKyAgICAgICAgcmV4ZWMuc2VuZFN0cmluZyhwYXNzd29yZCwgZmFsc2UpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRoZSBjb21hbmQgdG8gZXhlY3V0ZSBvbiB0aGUgc2VydmVyOworICAgICAqIEBwYXJhbSBjIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1hbmQoU3RyaW5nIGMpIHsKKyAgICAgICAgdGhpcy5jb21tYW5kID0gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgc2VuZCBhIGNhcnJpYWdlIHJldHVybiBhZnRlciBjb25uZWN0aW5nOyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICogQHBhcmFtIGIgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxDUihib29sZWFuIGIpIHsKKyAgICAgICAgdGhpcy5hZGRDYXJyaWFnZVJldHVybiA9IGI7CisgICAgfQorICAgIC8qKgorICAgICAqICBTZXQgdGhlIHRoZSBsb2dpbiBwYXNzd29yZCB0byB1c2UKKyAgICAgKiByZXF1aXJlZCBpZiA8dHQ+dXNlcmlkPC90dD4gaXMgc2V0LgorICAgICAqIEBwYXJhbSBwIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwKSB7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwOworICAgIH0KKworICAgIC8qKgorICAgICAqICBTZXQgdGhlIHRjcCBwb3J0IHRvIGNvbm5lY3QgdG87IGRlZmF1bHQgaXMgMjMuCisgICAgICogQHBhcmFtIHAgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHApIHsKKyAgICAgICAgdGhpcy5wb3J0ID0gcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgU2V0IHRoZSBob3N0bmFtZSBvciBhZGRyZXNzIG9mIHRoZSByZW1vdGUgc2VydmVyLgorICAgICAqIEBwYXJhbSBtIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlcihTdHJpbmcgbSkgeworICAgICAgICB0aGlzLnNlcnZlciA9IG07CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IGEgZGVmYXVsdCB0aW1lb3V0IGluIHNlY29uZHMgdG8gd2FpdCBmb3IgYSByZXNwb25zZSwKKyAgICAgKiB6ZXJvIG1lYW5zIGZvcmV2ZXIgKHRoZSBkZWZhdWx0KQorICAgICAqIEBwYXJhbSBpIGFuIDxjb2RlPkludGVnZXI8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChJbnRlZ2VyIGkpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0VGltZW91dCA9IGk7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldCB0aGUgdGhlIGxvZ2luIGlkIHRvIHVzZSBvbiB0aGUgc2VydmVyOworICAgICAqIHJlcXVpcmVkIGlmIDx0dD5wYXNzd29yZDwvdHQ+IGlzIHNldC4KKyAgICAgKiBAcGFyYW0gdSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyaWQoU3RyaW5nIHUpIHsKKyAgICAgICAgdGhpcy51c2VyaWQgPSB1OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlYWxzIHdpdGggbXVsdGlwbGUgcmVhZC93cml0ZSBjYWxscy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlTXVsdGlwbGVUYXNrcyhBbnRSRXhlY0NsaWVudCByZXhlYykgeworCisgICAgICAgIC8qKiAgTG9naW4gaWYgdXNlcmlkIGFuZCBwYXNzd29yZCB3ZXJlIHNwZWNpZmllZCAqLworICAgICAgICBpZiAodXNlcmlkICE9IG51bGwgJiYgcGFzc3dvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9naW4ocmV4ZWMpOworICAgICAgICB9CisgICAgICAgIC8qKiAgUHJvY2VzcyBlYWNoIHN1YiBjb21tYW5kICovCisgICAgICAgIEVudW1lcmF0aW9uIHRhc2tzVG9SdW4gPSByZXhlY1Rhc2tzLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlICh0YXNrc1RvUnVuICE9IG51bGwgJiYgdGFza3NUb1J1bi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgUkV4ZWNTdWJUYXNrIHRhc2sgPSAoUkV4ZWNTdWJUYXNrKSB0YXNrc1RvUnVuLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAodGFzayBpbnN0YW5jZW9mIFJFeGVjUmVhZCAmJiBkZWZhdWx0VGltZW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKChSRXhlY1JlYWQpIHRhc2spLnNldERlZmF1bHRUaW1lb3V0KGRlZmF1bHRUaW1lb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhc2suZXhlY3V0ZShyZXhlYyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvU2V0UHJveHkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9TZXRQcm94eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGViNTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvU2V0UHJveHkuamF2YQpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uZXQ7CisKK2ltcG9ydCBqYXZhLm5ldC5BdXRoZW50aWNhdG9yOworaW1wb3J0IGphdmEubmV0LlBhc3N3b3JkQXV0aGVudGljYXRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUHJveHlTZXR1cDsKKworLyoqCisgKiBTZXRzIEphdmEncyB3ZWIgcHJveHkgcHJvcGVydGllcywgc28gdGhhdCB0YXNrcyBhbmQgY29kZSBydW4gaW4KKyAqIHRoZSBzYW1lIEpWTSBjYW4gaGF2ZSB0aHJvdWdoLXRoZS1maXJld2FsbCBhY2Nlc3MgdG8gcmVtb3RlIHdlYiBzaXRlcywKKyAqIGFuZCByZW1vdGUgZnRwIHNpdGVzLgorICogWW91IGNhbiBub21pbmF0ZSBhbiBodHRwIGFuZCBmdHAgcHJveHksIG9yIGEgc29ja3Mgc2VydmVyLCByZXNldCB0aGUgc2VydmVyCisgKiBzZXR0aW5ncywgb3IgZG8gbm90aGluZyBhdCBhbGwuCisgKiA8cD4KKyAqIEV4YW1wbGVzCisgKiA8cHJlPiZsdDtzZXRwcm94eS8mZ3Q7PC9wcmU+CisgKiBkbyBub3RoaW5nCisgKiA8cHJlPiZsdDtzZXRwcm94eSBwcm94eWhvc3Q9ImZpcmV3YWxsIi8mZ3Q7PC9wcmU+CisgKiBzZXQgdGhlIHByb3h5IHRvIGZpcmV3YWxsOjgwCisgKiA8cHJlPiZsdDtzZXRwcm94eSBwcm94eWhvc3Q9ImZpcmV3YWxsIiBwcm94eXBvcnQ9IjgxIi8mZ3Q7PC9wcmU+CisgKiBzZXQgdGhlIHByb3h5IHRvIGZpcmV3YWxsOjgxCisgKiA8cHJlPiZsdDtzZXRwcm94eSBwcm94eWhvc3Q9IiIvJmd0OzwvcHJlPgorICogc3RvcCB1c2luZyB0aGUgaHR0cCBwcm94eTsgZG9uJ3QgY2hhbmdlIHRoZSBzb2NrcyBzZXR0aW5ncworICogPHByZT4mbHQ7c2V0cHJveHkgc29ja3Nwcm94eWhvc3Q9InNvY2tzeSIvJmd0OzwvcHJlPgorICogdXNlIHNvY2tzIHZpYSBzb2Nrc3k6MTA4MAorICogPHByZT4mbHQ7c2V0cHJveHkgc29ja3Nwcm94eWhvc3Q9IiIvJmd0OzwvcHJlPgorICogc3RvcCB1c2luZyB0aGUgc29ja3Mgc2VydmVyLgorICogPHA+CisgKiBZb3UgY2FuIHNldCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgaHR0cCB3aXRoIHRoZSA8dHQ+cHJveHlIb3N0PC90dD4KKyAqIGFuZCA8dHQ+cHJveHlQYXNzd29yZDwvdHQ+IGF0dHJpYnV0ZXMuIE9uIEphdmExLjQgYW5kIGFib3ZlIHRoZXNlIGNhbiBhbHNvIGJlCisgKiB1c2VkIGFnYWluc3QgU09DS1M1IHNlcnZlcnMuCisgKiA8L3A+CisgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL25ldC9wcm9wZXJ0aWVzLmh0bWwiPgorICogIGphdmEgMS41IG5ldHdvcmsgcHJvcGVydHkgbGlzdDwvYT4KKyAgKkBzaW5jZSAgICAgICBBbnQgMS41CisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9Im5ldHdvcmsiCisgKi8KK3B1YmxpYyBjbGFzcyBTZXRQcm94eSBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQX1BPUlQgPSA4MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU09DS1NfUE9SVCA9IDEwODA7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiBwcm94eSBkZXRhaWxzCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcm94eUhvc3QgPSBudWxsOworCisgICAgLyoqCisgICAgICogbmFtZSBvZiBwcm94eSBwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBwcm94eVBvcnQgPSBIVFRQX1BPUlQ7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogc29ja3MgaG9zdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzb2Nrc1Byb3h5SG9zdCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTb2NrcyBwcm94eSBwb3J0LiBEZWZhdWx0IGlzIDEwODAuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc29ja3NQcm94eVBvcnQgPSBTT0NLU19QT1JUOworCisKKyAgICAvKioKKyAgICAgKiBsaXN0IG9mIG5vbiBwcm94eSBob3N0cworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vblByb3h5SG9zdHMgPSBudWxsOworCisgICAgLyoqCisgICAgICogdXNlciBmb3IgaHR0cCBvbmx5CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJveHlVc2VyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIHBhc3N3b3JkIGZvciBodHRwIG9ubHkKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm94eVBhc3N3b3JkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIHRoZSBIVFRQL2Z0cCBwcm94eSBob3N0LiBTZXQgdGhpcyB0byAiIiBmb3IgdGhlIGh0dHAgcHJveHkKKyAgICAgKiBvcHRpb24gdG8gYmUgZGlzYWJsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0bmFtZSB0aGUgbmV3IHByb3h5IGhvc3RuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJveHlIb3N0KFN0cmluZyBob3N0bmFtZSkgeworICAgICAgICBwcm94eUhvc3QgPSBob3N0bmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHRoZSBIVFRQL2Z0cCBwcm94eSBwb3J0IG51bWJlcjsgZGVmYXVsdCBpcyA4MAorICAgICAqCisgICAgICogQHBhcmFtIHBvcnQgcG9ydCBudW1iZXIgb2YgdGhlIHByb3h5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJveHlQb3J0KGludCBwb3J0KSB7CisgICAgICAgIHByb3h5UG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgYSBTb2NrcyBzZXJ2ZXIuIFNldCB0byAiIiB0byB0dXJuIHNvY2tzCisgICAgICogcHJveHlpbmcgb2ZmLgorICAgICAqCisgICAgICogQHBhcmFtIGhvc3QgVGhlIG5ldyBTb2Nrc1Byb3h5SG9zdCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvY2tzUHJveHlIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuc29ja3NQcm94eUhvc3QgPSBob3N0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBQcm94eVBvcnQgZm9yIHNvY2tzIGNvbm5lY3Rpb25zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxMDgwCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydCBUaGUgbmV3IFNvY2tzUHJveHlQb3J0IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U29ja3NQcm94eVBvcnQoaW50IHBvcnQpIHsKKyAgICAgICAgdGhpcy5zb2Nrc1Byb3h5UG9ydCA9IHBvcnQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIGxpc3Qgb2YgaG9zdHMgdG8gYnlwYXNzIHRoZSBwcm94eSBvbi4gVGhlc2Ugc2hvdWxkIGJlIHNlcGFyYXRlZAorICAgICAqIHdpdGggdGhlIHZlcnRpY2FsIGJhciBjaGFyYWN0ZXIgJ3wnLiBPbmx5IGluIEphdmEgMS40IGRvZXMgZnRwIHVzZQorICAgICAqIHRoaXMgbGlzdC4KKyAgICAgKiBlLmcuIGZvemJvdC5jb3JwLnN1bi5jb218Ki5lbmcuc3VuLmNvbQorICAgICAqIEBwYXJhbSBub25Qcm94eUhvc3RzIGxpc3RzIG9mIGhvc3RzIHRvIHRhbGsgZGlyZWN0IHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9uUHJveHlIb3N0cyhTdHJpbmcgbm9uUHJveHlIb3N0cykgeworICAgICAgICB0aGlzLm5vblByb3h5SG9zdHMgPSBub25Qcm94eUhvc3RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCB0aGUgcHJveHkgdXNlci4gUHJvYmFibHkgcmVxdWlyZXMgYSBwYXNzd29yZCB0byBhY2NvbXBhbnkgdGhpcworICAgICAqIHNldHRpbmcuIERlZmF1bHQ9IiIKKyAgICAgKiBAcGFyYW0gcHJveHlVc2VyIHVzZXJuYW1lCisgICAgICogQHNpbmNlIEFudDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3h5VXNlcihTdHJpbmcgcHJveHlVc2VyKSB7CisgICAgICAgIHRoaXMucHJveHlVc2VyID0gcHJveHlVc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFzc3dvcmQgZm9yIHRoZSBwcm94eS4gVXNlZCBvbmx5IGlmIHRoZSBwcm94eVVzZXIgaXMgc2V0LgorICAgICAqIEBwYXJhbSBwcm94eVBhc3N3b3JkIHBhc3N3b3JkIHRvIGdvIHdpdGggdGhlIHVzZXJuYW1lCisgICAgICogQHNpbmNlIEFudDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3h5UGFzc3dvcmQoU3RyaW5nIHByb3h5UGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5wcm94eVBhc3N3b3JkID0gcHJveHlQYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZiB0aGUgcHJveHkgcG9ydCBhbmQgaG9zdCBzZXR0aW5ncyBhcmUgbm90IG51bGwsIHRoZW4gdGhlIHNldHRpbmdzCisgICAgICogZ2V0IGFwcGxpZWQgdGhlc2Ugc2V0dGluZ3MgbGFzdCBiZXlvbmQgdGhlIGxpZmUgb2YgdGhlIG9iamVjdCBhbmQKKyAgICAgKiBhcHBseSB0byBhbGwgbmV0d29yayBjb25uZWN0aW9ucworICAgICAqIFJlbGV2YW50IGRvY3M6IGJ1Z2xpc3QgIzQxODMzNDAKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFwcGx5V2ViUHJveHlTZXR0aW5ncygpIHsKKyAgICAgICAgYm9vbGVhbiBzZXR0aW5nc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBlbmFibGluZ1Byb3h5ID0gZmFsc2U7CisgICAgICAgIFByb3BlcnRpZXMgc3lzcHJvcHMgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOworICAgICAgICBpZiAocHJveHlIb3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldHRpbmdzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAocHJveHlIb3N0Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB0cmFjZVNldHRpbmdJbmZvKCk7CisgICAgICAgICAgICAgICAgZW5hYmxpbmdQcm94eSA9IHRydWU7CisgICAgICAgICAgICAgICAgc3lzcHJvcHMucHV0KFByb3h5U2V0dXAuSFRUUF9QUk9YWV9IT1NULCBwcm94eUhvc3QpOworICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0U3RyaW5nID0gSW50ZWdlci50b1N0cmluZyhwcm94eVBvcnQpOworICAgICAgICAgICAgICAgIHN5c3Byb3BzLnB1dChQcm94eVNldHVwLkhUVFBfUFJPWFlfUE9SVCwgcG9ydFN0cmluZyk7CisgICAgICAgICAgICAgICAgc3lzcHJvcHMucHV0KFByb3h5U2V0dXAuSFRUUFNfUFJPWFlfSE9TVCwgcHJveHlIb3N0KTsKKyAgICAgICAgICAgICAgICBzeXNwcm9wcy5wdXQoUHJveHlTZXR1cC5IVFRQU19QUk9YWV9QT1JULCBwb3J0U3RyaW5nKTsKKyAgICAgICAgICAgICAgICBzeXNwcm9wcy5wdXQoUHJveHlTZXR1cC5GVFBfUFJPWFlfSE9TVCwgcHJveHlIb3N0KTsKKyAgICAgICAgICAgICAgICBzeXNwcm9wcy5wdXQoUHJveHlTZXR1cC5GVFBfUFJPWFlfUE9SVCwgcG9ydFN0cmluZyk7CisgICAgICAgICAgICAgICAgaWYgKG5vblByb3h5SG9zdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzeXNwcm9wcy5wdXQoUHJveHlTZXR1cC5IVFRQX05PTl9QUk9YWV9IT1NUUywgbm9uUHJveHlIb3N0cyk7CisgICAgICAgICAgICAgICAgICAgIHN5c3Byb3BzLnB1dChQcm94eVNldHVwLkhUVFBTX05PTl9QUk9YWV9IT1NUUywgbm9uUHJveHlIb3N0cyk7CisgICAgICAgICAgICAgICAgICAgIHN5c3Byb3BzLnB1dChQcm94eVNldHVwLkZUUF9OT05fUFJPWFlfSE9TVFMsIG5vblByb3h5SG9zdHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJveHlVc2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3lzcHJvcHMucHV0KFByb3h5U2V0dXAuSFRUUF9QUk9YWV9VU0VSTkFNRSwgcHJveHlVc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgc3lzcHJvcHMucHV0KFByb3h5U2V0dXAuSFRUUF9QUk9YWV9QQVNTV09SRCwgcHJveHlQYXNzd29yZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coInJlc2V0dGluZyBodHRwIHByb3h5IiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgc3lzcHJvcHMucmVtb3ZlKFByb3h5U2V0dXAuSFRUUF9QUk9YWV9IT1NUKTsKKyAgICAgICAgICAgICAgICBzeXNwcm9wcy5yZW1vdmUoUHJveHlTZXR1cC5IVFRQX1BST1hZX1BPUlQpOworICAgICAgICAgICAgICAgIHN5c3Byb3BzLnJlbW92ZShQcm94eVNldHVwLkhUVFBfUFJPWFlfVVNFUk5BTUUpOworICAgICAgICAgICAgICAgIHN5c3Byb3BzLnJlbW92ZShQcm94eVNldHVwLkhUVFBfUFJPWFlfUEFTU1dPUkQpOworICAgICAgICAgICAgICAgIHN5c3Byb3BzLnJlbW92ZShQcm94eVNldHVwLkhUVFBTX1BST1hZX0hPU1QpOworICAgICAgICAgICAgICAgIHN5c3Byb3BzLnJlbW92ZShQcm94eVNldHVwLkhUVFBTX1BST1hZX1BPUlQpOworICAgICAgICAgICAgICAgIHN5c3Byb3BzLnJlbW92ZShQcm94eVNldHVwLkZUUF9QUk9YWV9IT1NUKTsKKyAgICAgICAgICAgICAgICBzeXNwcm9wcy5yZW1vdmUoUHJveHlTZXR1cC5GVFBfUFJPWFlfUE9SVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL3NvY2tzCisgICAgICAgIGlmIChzb2Nrc1Byb3h5SG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXR0aW5nc0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKHNvY2tzUHJveHlIb3N0Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBlbmFibGluZ1Byb3h5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzeXNwcm9wcy5wdXQoUHJveHlTZXR1cC5TT0NLU19QUk9YWV9IT1NULCBzb2Nrc1Byb3h5SG9zdCk7CisgICAgICAgICAgICAgICAgc3lzcHJvcHMucHV0KFByb3h5U2V0dXAuU09DS1NfUFJPWFlfUE9SVCwgSW50ZWdlci50b1N0cmluZyhzb2Nrc1Byb3h5UG9ydCkpOworICAgICAgICAgICAgICAgIGlmIChwcm94eVVzZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvL3RoaXMgbWF5IGJlIGEgamF2YTEuNCB0aGluZ3kgb25seQorICAgICAgICAgICAgICAgICAgICBzeXNwcm9wcy5wdXQoUHJveHlTZXR1cC5TT0NLU19QUk9YWV9VU0VSTkFNRSwgcHJveHlVc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgc3lzcHJvcHMucHV0KFByb3h5U2V0dXAuU09DS1NfUFJPWFlfUEFTU1dPUkQsIHByb3h5UGFzc3dvcmQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coInJlc2V0dGluZyBzb2NrcyBwcm94eSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIHN5c3Byb3BzLnJlbW92ZShQcm94eVNldHVwLlNPQ0tTX1BST1hZX0hPU1QpOworICAgICAgICAgICAgICAgIHN5c3Byb3BzLnJlbW92ZShQcm94eVNldHVwLlNPQ0tTX1BST1hZX1BPUlQpOworICAgICAgICAgICAgICAgIHN5c3Byb3BzLnJlbW92ZShQcm94eVNldHVwLlNPQ0tTX1BST1hZX1VTRVJOQU1FKTsKKyAgICAgICAgICAgICAgICBzeXNwcm9wcy5yZW1vdmUoUHJveHlTZXR1cC5TT0NLU19QUk9YWV9QQVNTV09SRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJveHlVc2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChlbmFibGluZ1Byb3h5KSB7CisgICAgICAgICAgICAgICAgQXV0aGVudGljYXRvci5zZXREZWZhdWx0KG5ldyBQcm94eUF1dGgocHJveHlVc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5UGFzc3dvcmQpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3NDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgQXV0aGVudGljYXRvci5zZXREZWZhdWx0KG5ldyBQcm94eUF1dGgoIiIsICIiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsaXN0IG91dCB3aGF0IGlzIGdvaW5nIG9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRyYWNlU2V0dGluZ0luZm8oKSB7CisgICAgICAgIGxvZygiU2V0dGluZyBwcm94eSB0byAiCisgICAgICAgICAgICAgICAgKyAocHJveHlIb3N0ICE9IG51bGwgPyBwcm94eUhvc3QgOiAiJyciKQorICAgICAgICAgICAgICAgICsgIjoiICsgcHJveHlQb3J0LAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvZXMgdGhlIHdvcmsuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIHRocm93biBpbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBhcHBseVdlYlByb3h5U2V0dGluZ3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS42LjMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm94eUF1dGggZXh0ZW5kcyBBdXRoZW50aWNhdG9yIHsKKyAgICAgICAgcHJpdmF0ZSBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGF1dGg7CisKKyAgICAgICAgcHJpdmF0ZSBQcm94eUF1dGgoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzKSB7CisgICAgICAgICAgICBhdXRoID0gbmV3IFBhc3N3b3JkQXV0aGVudGljYXRpb24odXNlciwgcGFzcy50b0NoYXJBcnJheSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGdldFBhc3N3b3JkQXV0aGVudGljYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gYXV0aDsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L1RlbG5ldFRhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9UZWxuZXRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlYTI2MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9UZWxuZXRUYXNrLmphdmEKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LnRlbG5ldC5UZWxuZXRDbGllbnQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogQXV0b21hdGVzIHRoZSB0ZWxuZXQgcHJvdG9jb2wuCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBUZWxuZXRUYXNrIGV4dGVuZHMgVGFzayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfSU5URVJWQUwgPSAyNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFTE5FVF9QT1JUID0gMjM7CisKKyAgICAvKioKKyAgICAgKiAgVGhlIHVzZXJpZCB0byBsb2dpbiB3aXRoLCBpZiBhdXRvbWF0ZWQgbG9naW4gaXMgdXNlZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJpZCAgPSBudWxsOworCisgICAgLyoqCisgICAgICogIFRoZSBwYXNzd29yZCB0byBsb2dpbiB3aXRoLCBpZiBhdXRvbWF0ZWQgbG9naW4gaXMgdXNlZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqICBUaGUgc2VydmVyIHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyICA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiAgVGhlIHRjcCBwb3J0IHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IFRFTE5FVF9QT1JUOworCisgICAgLyoqCisgICAgICogIFRoZSBsaXN0IG9mIHJlYWQvd3JpdGUgY29tbWFuZHMgZm9yIHRoaXMgc2Vzc2lvbgorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIHRlbG5ldFRhc2tzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogIElmIHRydWUsIGFkZHMgYSBDUiB0byBiZWdpbm5pbmcgb2YgbG9naW4gc2NyaXB0CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFkZENhcnJpYWdlUmV0dXJuID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiAgRGVmYXVsdCB0aW1lIGFsbG93ZWQgZm9yIHdhaXRpbmcgZm9yIGEgdmFsaWQgcmVzcG9uc2UKKyAgICAgKiAgZm9yIGFsbCBjaGlsZCByZWFkcy4gIEEgdmFsdWUgb2YgMCBtZWFucyBubyBsaW1pdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVnZXIgZGVmYXVsdFRpbWVvdXQgPSBudWxsOworCisgICAgLyoqCisgICAgICogIFZlcmlmeSB0aGF0IGFsbCBwYXJhbWV0ZXJzIGFyZSBpbmNsdWRlZC4KKyAgICAgKiAgQ29ubmVjdCBhbmQgcG9zc2libHkgbG9naW4KKyAgICAgKiAgSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIFJlYWRzIGFuZCB3cml0ZXMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgLyoqICBBIHNlcnZlciBuYW1lIGlzIHJlcXVpcmVkIHRvIGNvbnRpbnVlICovCisgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gU2VydmVyIFNwZWNpZmllZCIpOworICAgICAgIH0KKyAgICAgICAvKiogIEEgdXNlcmlkIGFuZCBwYXNzd29yZCBtdXN0IGFwcGVhciB0b2dldGhlcgorICAgICAgICAqICAgaWYgdGhleSBhcHBlYXIuICBUaGV5IGFyZSBub3QgcmVxdWlyZWQuCisgICAgICAgICovCisgICAgICAgaWYgKHVzZXJpZCA9PSBudWxsICYmIHBhc3N3b3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBVc2VyaWQgU3BlY2lmaWVkIik7CisgICAgICAgfQorICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsICYmIHVzZXJpZCAhPSBudWxsKSB7CisgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gUGFzc3dvcmQgU3BlY2lmaWVkIik7CisgICAgICAgfQorCisgICAgICAgLyoqICBDcmVhdGUgdGhlIHRlbG5ldCBjbGllbnQgb2JqZWN0ICovCisgICAgICAgQW50VGVsbmV0Q2xpZW50IHRlbG5ldCA9IG51bGw7CisgICAgICAgdHJ5IHsKKyAgICAgICAgICAgdGVsbmV0ID0gbmV3IEFudFRlbG5ldENsaWVudCgpOworICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgdGVsbmV0LmNvbm5lY3Qoc2VydmVyLCBwb3J0KTsKKyAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4ndCBjb25uZWN0IHRvICIgKyBzZXJ2ZXIpOworICAgICAgICAgICB9CisgICAgICAgICAgIC8qKiAgTG9naW4gaWYgdXNlcmlkIGFuZCBwYXNzd29yZCB3ZXJlIHNwZWNpZmllZCAqLworICAgICAgICAgICBpZiAodXNlcmlkICE9IG51bGwgJiYgcGFzc3dvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgbG9naW4odGVsbmV0KTsKKyAgICAgICAgICAgfQorICAgICAgICAgICAvKiogIFByb2Nlc3MgZWFjaCBzdWIgY29tbWFuZCAqLworICAgICAgICAgICBFbnVtZXJhdGlvbiB0YXNrc1RvUnVuID0gdGVsbmV0VGFza3MuZWxlbWVudHMoKTsKKyAgICAgICAgICAgd2hpbGUgKHRhc2tzVG9SdW4gIT0gbnVsbCAmJiB0YXNrc1RvUnVuLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICBUZWxuZXRTdWJUYXNrIHRhc2sgPSAoVGVsbmV0U3ViVGFzaykgdGFza3NUb1J1bi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBUZWxuZXRSZWFkICYmIGRlZmF1bHRUaW1lb3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAoKFRlbG5ldFJlYWQpIHRhc2spLnNldERlZmF1bHRUaW1lb3V0KGRlZmF1bHRUaW1lb3V0KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHRhc2suZXhlY3V0ZSh0ZWxuZXQpOworICAgICAgICAgICB9CisgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgaWYgKHRlbG5ldCAhPSBudWxsICYmIHRlbG5ldC5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgIHRlbG5ldC5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBkaXNjb25uZWN0aW5nIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZlcik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIFByb2Nlc3MgYSAndHlwaWNhbCcgbG9naW4uICBJZiBpdCBkaWZmZXJzLCB1c2UgdGhlIHJlYWQKKyAgICAgKiAgYW5kIHdyaXRlIHRhc2tzIGV4cGxpY2l0ZWx5CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZ2luKEFudFRlbG5ldENsaWVudCB0ZWxuZXQpIHsKKyAgICAgICBpZiAoYWRkQ2FycmlhZ2VSZXR1cm4pIHsKKyAgICAgICAgICB0ZWxuZXQuc2VuZFN0cmluZygiXG4iLCB0cnVlKTsKKyAgICAgICB9CisgICAgICAgdGVsbmV0LndhaXRGb3JTdHJpbmcoIm9naW46Iik7CisgICAgICAgdGVsbmV0LnNlbmRTdHJpbmcodXNlcmlkLCB0cnVlKTsKKyAgICAgICB0ZWxuZXQud2FpdEZvclN0cmluZygiYXNzd29yZDoiKTsKKyAgICAgICB0ZWxuZXQuc2VuZFN0cmluZyhwYXNzd29yZCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGhlIGxvZ2luIGlkIHRvIHVzZSBvbiB0aGUgc2VydmVyOworICAgICAqIHJlcXVpcmVkIGlmIDx0dD5wYXNzd29yZDwvdHQ+IGlzIHNldC4KKyAgICAgKiBAcGFyYW0gdSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyaWQoU3RyaW5nIHUpIHsKKyAgICAgICAgdGhpcy51c2VyaWQgPSB1OworICAgIH0KKworICAgIC8qKgorICAgICAqICBTZXQgdGhlIHRoZSBsb2dpbiBwYXNzd29yZCB0byB1c2UKKyAgICAgKiByZXF1aXJlZCBpZiA8dHQ+dXNlcmlkPC90dD4gaXMgc2V0LgorICAgICAqIEBwYXJhbSBwIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwKSB7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwOworICAgIH0KKworICAgIC8qKgorICAgICAqICBTZXQgdGhlIGhvc3RuYW1lIG9yIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBzZXJ2ZXIuCisgICAgICogQHBhcmFtIG0gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyKFN0cmluZyBtKSB7CisgICAgICAgIHRoaXMuc2VydmVyID0gbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgU2V0IHRoZSB0Y3AgcG9ydCB0byBjb25uZWN0IHRvOyBkZWZhdWx0IGlzIDIzLgorICAgICAqIEBwYXJhbSBwIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwKSB7CisgICAgICAgIHRoaXMucG9ydCA9IHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogIHNlbmQgYSBjYXJyaWFnZSByZXR1cm4gYWZ0ZXIgY29ubmVjdGluZzsgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqIEBwYXJhbSBiIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsQ1IoYm9vbGVhbiBiKSB7CisgICAgICAgdGhpcy5hZGRDYXJyaWFnZVJldHVybiA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IGEgZGVmYXVsdCB0aW1lb3V0IGluIHNlY29uZHMgdG8gd2FpdCBmb3IgYSByZXNwb25zZSwKKyAgICAgKiB6ZXJvIG1lYW5zIGZvcmV2ZXIgKHRoZSBkZWZhdWx0KQorICAgICAqIEBwYXJhbSBpIGFuIDxjb2RlPkludGVnZXI8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChJbnRlZ2VyIGkpIHsKKyAgICAgICB0aGlzLmRlZmF1bHRUaW1lb3V0ID0gaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQSBzdHJpbmcgdG8gd2FpdCBmb3IgZnJvbSB0aGUgc2VydmVyLgorICAgICAqICBBIHN1YlRhc2sgJmx0O3JlYWQmZ3Q7IHRhZyB3YXMgZm91bmQuICBDcmVhdGUgdGhlIG9iamVjdCwKKyAgICAgKiAgU2F2ZSBpdCBpbiBvdXIgbGlzdCwgYW5kIHJldHVybiBpdC4KKyAgICAgKiBAcmV0dXJuIGEgcmVhZCB0ZWxuZXQgc3ViIHRhc2sKKyAgICAgKi8KKworICAgIHB1YmxpYyBUZWxuZXRTdWJUYXNrIGNyZWF0ZVJlYWQoKSB7CisgICAgICAgIFRlbG5ldFN1YlRhc2sgdGFzayA9IChUZWxuZXRTdWJUYXNrKSBuZXcgVGVsbmV0UmVhZCgpOworICAgICAgICB0ZWxuZXRUYXNrcy5hZGRFbGVtZW50KHRhc2spOworICAgICAgICByZXR1cm4gdGFzazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQWRkIHRleHQgdG8gc2VuZCB0byB0aGUgc2VydmVyCisgICAgICogIEEgc3ViVGFzayAmbHQ7d3JpdGUmZ3Q7IHRhZyB3YXMgZm91bmQuICBDcmVhdGUgdGhlIG9iamVjdCwKKyAgICAgKiAgU2F2ZSBpdCBpbiBvdXIgbGlzdCwgYW5kIHJldHVybiBpdC4KKyAgICAgKiBAcmV0dXJuIGEgd3JpdGUgdGVsbmV0IHN1YiB0YXNrCisgICAgICovCisgICAgcHVibGljIFRlbG5ldFN1YlRhc2sgY3JlYXRlV3JpdGUoKSB7CisgICAgICAgIFRlbG5ldFN1YlRhc2sgdGFzayA9IChUZWxuZXRTdWJUYXNrKSBuZXcgVGVsbmV0V3JpdGUoKTsKKyAgICAgICAgdGVsbmV0VGFza3MuYWRkRWxlbWVudCh0YXNrKTsKKyAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoaXMgY2xhc3MgaXMgdGhlIHBhcmVudCBvZiB0aGUgUmVhZCBhbmQgV3JpdGUgdGFza3MuCisgICAgICogIEl0IGhhbmRsZXMgdGhlIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciBib3RoLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBUZWxuZXRTdWJUYXNrIHsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyB0YXNrU3RyaW5nID0gIiI7CisgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGVjdXRlIHRoZSBzdWJ0YXNrLgorICAgICAgICAgKiBAcGFyYW0gdGVsbmV0IHRoZSBjbGllbnQKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMgYXMgaXQgaXMgbm90IGFsbG93ZWQgdG8gaW5zdGFudGlhdGUgdGhpcyBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQW50VGVsbmV0Q2xpZW50IHRlbG5ldCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTaG91bGRuJ3QgYmUgYWJsZSBpbnN0YW50aWF0ZSBhIFN1YlRhc2sgZGlyZWN0bHkiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiAgdGhlIG1lc3NhZ2UgYXMgbmVzdGVkIHRleHQKKyAgICAgICAgICogQHBhcmFtIHMgdGhlIG5lc3RlZCB0ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyBzKSB7CisgICAgICAgICAgICBzZXRTdHJpbmcoZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiB0aGUgbWVzc2FnZSBhcyBhbiBhdHRyaWJ1dGUKKyAgICAgICAgICogQHBhcmFtIHMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgdGFza1N0cmluZyArPSBzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIFNlbmRzIHRleHQgdG8gdGhlIGNvbm5lY3RlZCBzZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgVGVsbmV0V3JpdGUgZXh0ZW5kcyBUZWxuZXRTdWJUYXNrIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGVjaG9TdHJpbmcgPSB0cnVlOworICAgICAgICAvKioKKyAgICAgICAgICogRXhlY3V0ZSB0aGUgd3JpdGUgdGFzay4KKyAgICAgICAgICogQHBhcmFtIHRlbG5ldCB0aGUgdGFzayB0byB1c2UKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShBbnRUZWxuZXRDbGllbnQgdGVsbmV0KQorICAgICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgdGVsbmV0LnNlbmRTdHJpbmcodGFza1N0cmluZywgZWNob1N0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciBvciBub3QgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGVjaG9lZCB0byB0aGUgbG9nLgorICAgICAgICAgKiBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgICAgICogQHBhcmFtIGIgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RWNobyhib29sZWFuIGIpIHsKKyAgICAgICAgICAgZWNob1N0cmluZyA9IGI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUmVhZHMgdGhlIG91dHB1dCBmcm9tIHRoZSBjb25uZWN0ZWQgc2VydmVyCisgICAgICogIHVudGlsIHRoZSByZXF1aXJlZCBzdHJpbmcgaXMgZm91bmQgb3Igd2UgdGltZSBvdXQuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFRlbG5ldFJlYWQgZXh0ZW5kcyBUZWxuZXRTdWJUYXNrIHsKKyAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIHRpbWVvdXQgPSBudWxsOworICAgICAgICAvKioKKyAgICAgICAgICogRXhlY3V0ZSB0aGUgcmVhZCB0YXNrLgorICAgICAgICAgKiBAcGFyYW0gdGVsbmV0IHRoZSB0YXNrIHRvIHVzZQorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFudFRlbG5ldENsaWVudCB0ZWxuZXQpCisgICAgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgdGVsbmV0LndhaXRGb3JTdHJpbmcodGFza1N0cmluZywgdGltZW91dCk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqICBhIHRpbWVvdXQgdmFsdWUgdGhhdCBvdmVycmlkZXMgYW55IHRhc2sgd2lkZSB0aW1lb3V0LgorICAgICAgICAgKiBAcGFyYW0gaSBhbiA8Y29kZT5JbnRlZ2VyPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChJbnRlZ2VyIGkpIHsKKyAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHRpbWVvdXQgaWYgbm9uZSBoYXMgYmVlbiBzZXQgYWxyZWFkeQorICAgICAgICAgKiBAcGFyYW0gZGVmYXVsdFRpbWVvdXQgYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4gdmFsdWUKKyAgICAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFRpbWVvdXQoSW50ZWdlciBkZWZhdWx0VGltZW91dCkgeworICAgICAgICAgICBpZiAodGltZW91dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHRpbWVvdXQgPSBkZWZhdWx0VGltZW91dDsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgYWJzdHJhY3Rpb24gb2YgdGhlIHRlbG5ldCBwcm90b2NvbC4KKyAgICAgKiAgQ3VycmVudGx5IGl0IGlzIGEgd3JhcHBlciBhcm91bmQgPGEKKyAgICAgKiAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL25ldC9pbmRleC5odG1sIj5KYWthcnRhCisgICAgICogIENvbW1vbnMgTmV0PC9hPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgQW50VGVsbmV0Q2xpZW50IGV4dGVuZHMgVGVsbmV0Q2xpZW50IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWQgZnJvbSB0aGUgdGVsbmV0IHNlc3Npb24gdW50aWwgdGhlIHN0cmluZyB3ZSBhcmUKKyAgICAgICAgICogd2FpdGluZyBmb3IgaXMgZm91bmQKKyAgICAgICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byB3YWl0IG9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yU3RyaW5nKFN0cmluZyBzKSB7CisgICAgICAgICAgICB3YWl0Rm9yU3RyaW5nKHMsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWQgZnJvbSB0aGUgdGVsbmV0IHNlc3Npb24gdW50aWwgdGhlIHN0cmluZyB3ZSBhcmUKKyAgICAgICAgICogd2FpdGluZyBmb3IgaXMgZm91bmQgb3IgdGhlIHRpbWVvdXQgaGFzIGJlZW4gcmVhY2hlZAorICAgICAgICAgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIHdhaXQgb24KKyAgICAgICAgICogQHBhcmFtIHRpbWVvdXQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgd2FpdEZvclN0cmluZyhTdHJpbmcgcywgSW50ZWdlciB0aW1lb3V0KSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHRoaXMuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dC5pbnRWYWx1ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNiLnRvU3RyaW5nKCkuaW5kZXhPZihzKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBpcy5yZWFkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIgZW5kVGltZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUuYWRkKENhbGVuZGFyLlNFQ09ORCwgdGltZW91dC5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNiLnRvU3RyaW5nKCkuaW5kZXhPZihzKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKENhbGVuZGFyLmdldEluc3RhbmNlKCkuYmVmb3JlKGVuZFRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXMuYXZhaWxhYmxlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChXQUlUX0lOVEVSVkFMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcy5hdmFpbGFibGUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJSZWFkIGJlZm9yZSBydW5uaW5nIGludG8gdGltZW91dDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNiLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNwb25zZSB0aW1lZC1vdXQgd2FpdGluZyBmb3IgXCIiICsgcyArICdcIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBpcy5yZWFkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZyhzYi50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgYmU7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGlzIHN0cmluZyB0byB0aGUgdGVsbmV0IHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSBzICAgICAgICAgIHRoZSBzdHJpbmcgdG8gd3JpdGUKKyAgICAgICAgICogQHBhcmFtIGVjaG9TdHJpbmcgaWYgdHJ1ZSBsb2cgdGhlIHN0cmluZyBzZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZW5kU3RyaW5nKFN0cmluZyBzLCBib29sZWFuIGVjaG9TdHJpbmcpIHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IHRoaXMuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9zLndyaXRlKChzICsgIlxuIikuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgaWYgKGVjaG9TdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKHMsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcy5mbHVzaCgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9GU3RhdFA0T3V0cHV0SGFuZGxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvRlN0YXRQNE91dHB1dEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDhjMGEyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvRlN0YXRQNE91dHB1dEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5vcm8udGV4dC5wZXJsLlBlcmw1VXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogRlN0YXRQNE91dHB1dEhhbmRsZXIgIC0gc3BlemlhbGllZCBQZXJmb3JjZSBvdXRwdXQgaGFuZGxlcgorICogYWJsZSB0byBzb3J0IGZpbGVzIHJlY29nbml6ZWQgYXMgbWFuYWdlZCBieSBQZXJmb3JjZSBhbmQgZmlsZXMgbm90CisgKiBtYW5hZ2VkIGJ5IFBlcmZvcmNlIGluIHRoZSBvdXRwdXQKKyAqCisgKi8KK2NsYXNzIEZTdGF0UDRPdXRwdXRIYW5kbGVyIGV4dGVuZHMgUDRIYW5kbGVyQWRhcHRlciB7CisgICAgcHJpdmF0ZSBQNEZzdGF0IHBhcmVudDsKKyAgICBwcml2YXRlIEFycmF5TGlzdCBleGlzdGluZyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIEFycmF5TGlzdCBub25FeGlzdGluZyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBQZXJsNVV0aWwgdXRpbCA9IG5ldyBQZXJsNVV0aWwoKTsKKworICAgIHB1YmxpYyBGU3RhdFA0T3V0cHV0SGFuZGxlcihQNEZzdGF0IHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodXRpbC5tYXRjaCgiL14uLi4gY2xpZW50RmlsZSAoLispJC8iLCBsaW5lKSkgeworICAgICAgICAgICAgU3RyaW5nIGYgPSB1dGlsLmdyb3VwKDEpOworICAgICAgICAgICAgZXhpc3RpbmcuYWRkKGYpOworICAgICAgICB9IGVsc2UgaWYgKHV0aWwubWF0Y2goIi9eKC4rKSAtIG5vIHN1Y2ggZmlsZS8iLCBsaW5lKSkgeworICAgICAgICAgICAgU3RyaW5nIGYgPSB1dGlsLmdyb3VwKDEpOworICAgICAgICAgICAgbm9uRXhpc3RpbmcuYWRkKGYpOworICAgICAgICB9CisgICAgICAgIHBhcmVudC5sb2cocGFyZW50LnV0aWwuc3Vic3RpdHV0ZSgicy9eLio6IC8vIiwgbGluZSksCisgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgfQorCisgICAgcHVibGljIEFycmF5TGlzdCBnZXRFeGlzdGluZygpIHsKKyAgICAgICAgcmV0dXJuIGV4aXN0aW5nOworICAgIH0KKworICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0Tm9uRXhpc3RpbmcoKSB7CisgICAgICAgIHJldHVybiBub25FeGlzdGluZzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEFkZC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRBZGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjJkZTgyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRBZGQuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworLyoKKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQorICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CisKKy8qKgorICogQWRkcyBzcGVjaWZpZWQgZmlsZXMgdG8gUGVyZm9yY2UuCisgKgorICogPGI+RXhhbXBsZSBVc2FnZTo8L2I+CisgKiA8dGFibGUgYm9yZGVyPSIxIj4KKyAqIDx0aD5GdW5jdGlvbjwvdGg+PHRoPkNvbW1hbmQ8L3RoPgorICogPHRyPjx0ZD5BZGQgZmlsZXMgdXNpbmcgUDRVU0VSLCBQNFBPUlQgYW5kIFA0Q0xJRU5UIHNldHRpbmdzIHNwZWNpZmllZDwvdGQ+CisgKiA8dGQ+Jmx0O1A0YWRkIDxicj5QNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgPGJyPlA0VXNlcj0iZmJsb2dncyIKKyAqIDxicj5QNFBvcnQ9ImttMDE6MTY2NiIKKyAqIDxicj5QNENsaWVudD0iZmJsb2dnc2NsaWVudCImZ3Q7PGJyPiZsdDtmaWxlc2V0IGJhc2VkaXI9ImRpciIgaW5jbHVkZXM9IioqJiM0NzsqLmphdmEiJmd0Ozxicj4KKyAqICZsdDsvcDRhZGQmZ3Q7PC90ZD48L3RyPgorICogPHRyPjx0ZD5BZGQgZmlsZXMgdXNpbmcgUDRVU0VSLCBQNFBPUlQgYW5kIFA0Q0xJRU5UIHNldHRpbmdzIGRlZmluZWQgaW4gZW52aXJvbm1lbnQ8L3RkPjx0ZD4KKyAqICZsdDtQNGFkZCBQNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgLyZndDs8YnI+Jmx0O2ZpbGVzZXQgYmFzZWRpcj0iZGlyIgorICogaW5jbHVkZXM9IioqJiM0NzsqLmphdmEiJmd0Ozxicj4mbHQ7L3A0YWRkJmd0OzwvdGQ+PC90cj4KKyAqIDx0cj48dGQ+U3BlY2lmeSB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFzcyB0byBlYWNoIGludm9jYXRpb24gb2YgcDQ8L3RkPgorICogPHRkPiZsdDtwNGFkZCBDb21tYW5kbGVuZ3RoPSI0NTAiJmd0OzwvdGQ+PC90cj4KKyAqIDwvdGFibGU+CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBQNEFkZCBleHRlbmRzIFA0QmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ01EX0xFTkdUSCA9IDQ1MDsKKyAgICBwcml2YXRlIGludCBjaGFuZ2VsaXN0OworICAgIHByaXZhdGUgU3RyaW5nIGFkZENtZCA9ICIiOworICAgIHByaXZhdGUgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgaW50IGNtZExlbmd0aCA9IERFRkFVTFRfQ01EX0xFTkdUSDsKKworICAgIC8qKgorICAgICAqICAgU2V0IHRoZSBtYXhpbXVtIGxlbmd0aAorICAgICAqICAgb2YgdGhlIGNvbW1hbmRsaW5lIHdoZW4gY2FsbGluZyBQZXJmb3JjZSB0byBhZGQgdGhlIGZpbGVzLgorICAgICAqICAgRGVmYXVsdHMgdG8gNDUwLCBoaWdoZXIgdmFsdWVzIG1lYW4gZmFzdGVyIGV4ZWN1dGlvbiwKKyAgICAgKiAgIGJ1dCBhbHNvIHBvc3NpYmxlIGZhaWx1cmVzLgorICAgICAqICAgQHBhcmFtIGxlbiBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgZGVmYXVsdCBpcyA0NTAuCisgICAgICogICBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRyeWluZyB0byBzZXQgdGhlIGNvbW1hbmQgbGluZSBsZW5ndGggdG8gMCBvciBsZXNzLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZGxlbmd0aChpbnQgbGVuKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAobGVuIDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUDRBZGQ6IENvbW1hbmRsZW5ndGggc2hvdWxkIGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jbWRMZW5ndGggPSBsZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgc3BlY2lmaWVkIHRoZSBvcGVuIGZpbGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHBlbmRpbmcgY2hhbmdlbGlzdCBudW1iZXI7IG90aGVyd2lzZSB0aGUgb3BlbiBmaWxlcyBhcmUKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmF1bHQgY2hhbmdlbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFuZ2VsaXN0IHRoZSBjaGFuZ2UgbGlzdCBudW1iZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRyeWluZyB0byBzZXQgYSBjaGFuZ2UgbGlzdCBudW1iZXIgJmx0Oz0wLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoYW5nZWxpc3QoaW50IGNoYW5nZWxpc3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjaGFuZ2VsaXN0IDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUDRBZGQ6IENoYW5nZWxpc3QjIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlciIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY2hhbmdlbGlzdCA9IGNoYW5nZWxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZmlsZXNldCB3aG9zZSBmaWxlcyB3aWxsIGJlIGFkZGVkIHRvIFBlcmZvcmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNldCB0aGUgRmlsZVNldCB0aGF0IG9uZSB3YW50cyB0byBhZGQgdG8gUGVyZm9yY2UgU291cmNlIENvbnRyb2wuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0YXNrLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBQZXJmb3JjZSBjb21tYW5kIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoUDRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZENtZCA9IFA0VmlldzsKKyAgICAgICAgfQorICAgICAgICBQNENtZE9wdHMgPSAoY2hhbmdlbGlzdCA+IDApID8gKCItYyAiICsgY2hhbmdlbGlzdCkgOiAiIjsKKworICAgICAgICBTdHJpbmdCdWZmZXIgZmlsZWxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc2V0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworCisgICAgICAgICAgICBTdHJpbmdbXSBzcmNGaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgIGlmIChzcmNGaWxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzcmNGaWxlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkcy5nZXRCYXNlZGlyKCksIHNyY0ZpbGVzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsZWxpc3QuYXBwZW5kKCIgIikuYXBwZW5kKCciJykuYXBwZW5kKGYuZ2V0QWJzb2x1dGVQYXRoKCkpLmFwcGVuZCgnIicpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZWxpc3QubGVuZ3RoKCkgPiBjbWRMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNQNEFkZChmaWxlbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmlsZWxpc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWNQNEFkZChmaWxlbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coIk5vIGZpbGVzIHNwZWNpZmllZCB0byBhZGQhIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY1A0QWRkKFN0cmluZ0J1ZmZlciBsaXN0KSB7CisgICAgICAgIGxvZygiRXhlY2luZyBhZGQgIiArIFA0Q21kT3B0cyArICIgIiArIGFkZENtZCArIGxpc3QsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICBleGVjUDRDb21tYW5kKCItcyBhZGQgIiArIFA0Q21kT3B0cyArICIgIiArIGFkZENtZCArIGxpc3QsIG5ldyBTaW1wbGVQNE91dHB1dEhhbmRsZXIodGhpcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0QmFzZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhNzUxMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisvKgorICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCisgKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnBlcmwuUGVybDVVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworCisvKiogQmFzZSBjbGFzcyBmb3IgUGVyZm9yY2UgKFA0KSBBTlQgdGFza3MuIFNlZSBpbmRpdmlkdWFsIHRhc2sgZm9yIGV4YW1wbGUgdXNhZ2UuCisgKgorICogQHNlZSBQNFN5bmMKKyAqIEBzZWUgUDRIYXZlCisgKiBAc2VlIFA0Q2hhbmdlCisgKiBAc2VlIFA0RWRpdAorICogQHNlZSBQNFN1Ym1pdAorICogQHNlZSBQNExhYmVsCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFA0QmFzZSBleHRlbmRzIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sgeworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgLy8gQ2hlY2tTdHlsZTpNZW1iZXJOYW1lQ2hlY2sgT0ZGIC0gYmMKKyAgICAvKipQZXJsNSByZWdleHAgaW4gSmF2YSAtIGNvb2wgZWg/ICovCisgICAgcHJvdGVjdGVkIFBlcmw1VXRpbCB1dGlsID0gbnVsbDsKKyAgICAvKiogVGhlIE9TIHNoZWxsIHRvIHVzZSAoY21kLmV4ZSBvciAvYmluL3NoKSAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2hlbGw7CisKKyAgICAvL1A0IHJ1bnRpbWUgZGlyZWN0aXZlcworICAgIC8qKiBQZXJmb3JjZSBTZXJ2ZXIgUG9ydCAoZWcgS00wMToxNjY2KSAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgUDRQb3J0ID0gIiI7CisgICAgLyoqIFBlcmZvcmNlIENsaWVudCAoZWcgbXljbGllbnRzcGVjKSAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgUDRDbGllbnQgPSAiIjsKKyAgICAvKiogUGVyZm9yY2UgVXNlciAoZWcgZmJsb2dncykgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIFA0VXNlciA9ICIiOworICAgIC8qKiBQZXJmb3JjZSB2aWV3IGZvciBjb21tYW5kcy4gKGVnIC8vcHJvamVjdHMvZm9vYmFyL21haW4vc291cmNlLy4uLiApKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIFA0VmlldyA9ICIiOworCisgICAgLy8gUGVyZm9yY2UgdGFzayBkaXJlY3RpdmVzCisgICAgLyoqIEtlZXAgZ29pbmcgb3IgZmFpbCBvbiBlcnJvciAtIGRlZmF1bHRzIHRvIGZhaWwuICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOworCisgICAgLy9QNCBnLW9wdHMgYW5kIGNtZCBvcHRzIChydGZtKQorICAgIC8qKiBQZXJmb3JjZSAnZ2xvYmFsJyBvcHRzLgorICAgICAqIEZvcm1zIGhhbGYgb2YgbG93IGxldmVsIEFQSSAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgUDRPcHRzID0gIiI7CisgICAgLyoqIFBlcmZvcmNlIGNvbW1hbmQgb3B0cy4KKyAgICAgKiBGb3JtcyBoYWxmIG9mIGxvdyBsZXZlbCBBUEkgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIFA0Q21kT3B0cyA9ICIiOworCisgICAgLyoqIFNldCBieSB0aGUgdGFzayBvciBhIGhhbmRsZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdGFzayBoYXMgZmFpbGVkLiAgQnVpbGRFeGNlcHRpb25zCisgICAgICogY2FuIGFsc28gYmUgdGhyb3duIHRvIGluZGljYXRlIGZhaWx1cmUuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGluRXJyb3IgPSBmYWxzZTsKKworICAgIC8qKiBJZiBpbkVycm9yIGlzIHNldCwgdGhlbiBlcnJvck1lc3NhZ2UgbmVlZHMgdG8gY29udGFpbiB0aGUgcmVhc29uIHdoeS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSAiIjsKKworICAgIC8vIENoZWNrU3R5bGU6TWVtYmVyTmFtZUNoZWNrIE9OCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIGdldHMgd2hldGhlciBvciBub3QgdGhlIHRhc2sgaGFzIGVuY291bnRlcmVkIGFuIGVycm9yCisgICAgICogQHJldHVybiBlcnJvciBmbGFnCisgICAgICogQHNpbmNlIGFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbkVycm9yKCkgeworICAgICAgICByZXR1cm4gaW5FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSBlcnJvciBmbGFnIG9uIHRoZSB0YXNrCisgICAgICogQHBhcmFtIGluRXJyb3IgaWYgdHJ1ZSBhbiBlcnJvciBoYXMgYmVlbiBlbmNvdW50ZXJlZCBieSB0aGUgaGFuZGxlcgorICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5FcnJvcihib29sZWFuIGluRXJyb3IpIHsKKyAgICAgICAgdGhpcy5pbkVycm9yID0gaW5FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRzIHRoZSBlcnJvciBtZXNzYWdlIHJlY29yZGVkIGJ5IHRoZSBQZXJmb3JjZSBoYW5kbGVyCisgICAgICogQHJldHVybiBlcnJvciBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgZXJyb3IgbWVzc2FnZQorICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgbGluZSBvZiBlcnJvciBvdXRwdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgeworICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKKyAgICB9CisgICAgLy9TZXR0ZXJzIGNhbGxlZCBieSBBbnQKKworICAgIC8qKgorICAgICAqIFRoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87CisgICAgICogb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiCisgICAgICoKKyAgICAgKiBAcGFyYW0gcDRQb3J0IHRoZSBwb3J0IG9uZSB3YW50cyB0byBzZXQgc3VjaCBhcyBsb2NhbGhvc3Q6MTY2NgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoU3RyaW5nIHA0UG9ydCkgeworICAgICAgICB0aGlzLlA0UG9ydCA9ICItcCIgKyBwNFBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAqCisgICAgICogQHBhcmFtIHA0Q2xpZW50IHRoZSBuYW1lIG9mIHRoZSBQZXJmb3JjZSBjbGllbnQgc3BlYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsaWVudChTdHJpbmcgcDRDbGllbnQpIHsKKyAgICAgICAgdGhpcy5QNENsaWVudCA9ICItYyIgKyBwNENsaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcDQgdXNlcm5hbWU7CisgICAgICogb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBwNFVzZXIgdGhlIHVzZXIgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIHA0VXNlcikgeworICAgICAgICB0aGlzLlA0VXNlciA9ICItdSIgKyBwNFVzZXI7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldCBnbG9iYWwgUDQgb3B0aW9uczsgVXNlZCBvbiBhbGwKKyAgICAgKiBvZiB0aGUgUGVyZm9yY2UgdGFza3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcDRPcHRzIGdsb2JhbCBvcHRpb25zLCB0byB1c2UgYSBzcGVjaWZpYyBQNENvbmZpZyBmaWxlIGZvciBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdsb2JhbG9wdHMoU3RyaW5nIHA0T3B0cykgeworICAgICAgICB0aGlzLlA0T3B0cyA9IHA0T3B0czsKKyAgICB9CisgICAgLyoqCisgICAgICogVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworICAgICAqIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi4KKyAgICAgKgorICAgICAqIHRoZSB2aWV3IGlzIHJlcXVpcmVkIGZvciB0aGUgZm9sbG93aW5nIHRhc2tzIDoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPnA0ZGVsZXRlPC9saT4KKyAgICAgKiA8bGk+cDRlZGl0PC9saT4KKyAgICAgKiA8bGk+cDRyZW9wZW48L2xpPgorICAgICAqIDxsaT5wNHJlc29sdmU8L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcDRWaWV3IHRoZSB2aWV3IG9uZSB3YW50cyB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWaWV3KFN0cmluZyBwNFZpZXcpIHsKKyAgICAgICAgdGhpcy5QNFZpZXcgPSBwNFZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKKyAgICAgKiBvZiB0aGUgUGVyZm9yY2UgdGFza3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcDRDbWRPcHRzICBjb21tYW5kIGxpbmUgb3B0aW9ucyBnb2luZyBhZnRlciB0aGUgcGFydGljdWxhcgorICAgICAqIFBlcmZvcmNlIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbWRvcHRzKFN0cmluZyBwNENtZE9wdHMpIHsKKyAgICAgICAgdGhpcy5QNENtZE9wdHMgPSBwNENtZE9wdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogd2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkKKyAgICAgKiBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQKKyAgICAgKiBAcGFyYW0gZmFpbCBpbmRpY2F0ZXMgd2hldGhlciBvbmUgd2FudHMgdG8gZmFpbCB0aGUgYnVpbGQgaWYgYW4gZXJyb3IgY29tZXMgZnJvbSB0aGUKKyAgICAgKiBQZXJmb3JjZSBjb21tYW5kCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsKSB7CisgICAgICAgIGZhaWxPbkVycm9yID0gZmFpbDsKKyAgICB9CisgICAgLyoqCisgICAgICogIHNldHMgYXR0cmlidXRlcyBQb3J0LCBDbGllbnQsIFVzZXIgZnJvbSBwcm9wZXJ0aWVzCisgICAgICogIGlmIHRoZXNlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQuCisgICAgICogIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IFVua25vd25FbGVtZW50CisgICAgICogIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVW5rbm93bkVsZW1lbnQKKyAgICAgKiAgPHRhYmxlPgorICAgICAqICA8dHI+PHRoPlByb3BlcnR5PC90aD48dGg+QXR0cmlidXRlPC90aD48L3RyPgorICAgICAqICA8dHI+PHRkPnA0LnBvcnQ8L3RkPjx0ZD5Qb3J0PC90ZD48L3RyPgorICAgICAqICA8dHI+PHRkPnA0LmNsaWVudDwvdGQ+PHRkPkNsaWVudDwvdGQ+PC90cj4KKyAgICAgKiAgPHRyPjx0ZD5wNC51c2VyPC90ZD48dGQ+VXNlcjwvdGQ+PC90cj4KKyAgICAgKiAgPC90YWJsZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworCisgICAgICAgIHV0aWwgPSBuZXcgUGVybDVVdGlsKCk7CisKKyAgICAgICAgLy9HZXQgZGVmYXVsdCBQNCBzZXR0aW5ncyBmcm9tIGVudmlyb25tZW50IC0gTWFyayB3b3VsZCBoYXZlIGRvbmUgc29tZXRoaW5nIGNvb2wgd2l0aAorICAgICAgICAvL2ludHJvc3BlY3Rpb24gaGVyZS4uLi4uOi0pCisgICAgICAgIFN0cmluZyB0bXBwcm9wOworICAgICAgICAvLyBDaGVja1N0eWxlOklubmVyQXNzaWdubWVudCBPRkYKKyAgICAgICAgaWYgKCh0bXBwcm9wID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJwNC5wb3J0IikpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFBvcnQodG1wcHJvcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0bXBwcm9wID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJwNC5jbGllbnQiKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Q2xpZW50KHRtcHByb3ApOworICAgICAgICB9CisgICAgICAgIGlmICgodG1wcHJvcCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgicDQudXNlciIpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRVc2VyKHRtcHByb3ApOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrU3R5bGU6SW5uZXJBc3NpZ25tZW50IE9OCisgICAgfQorICAgIC8qKgorICAgICogIG5vIHVzYWdlcyBmb3VuZCBmb3IgdGhpcyBtZXRob2QKKyAgICAqICBydW5zIGEgUGVyZm9yY2UgY29tbWFuZCB3aXRob3V0IGEgaGFuZGxlcgorICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgdGhhdCBvbmUgd2FudHMgdG8gZXhlY3V0ZQorICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBmYWlsb25lcnJvciBpcyBzZXQgYW5kIHRoZSBjb21tYW5kIGZhaWxzCisgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjUDRDb21tYW5kKFN0cmluZyBjb21tYW5kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBleGVjUDRDb21tYW5kKGNvbW1hbmQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgUDQgY29tbWFuZCBhc3NlbWJsZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIHJ1bgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEEgUDRIYW5kbGVyIHRvIHByb2Nlc3MgYW55IGlucHV0IGFuZCBvdXRwdXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgZmFpbG9uZXJyb3IgaGFzIGJlZW4gc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjUDRDb21tYW5kKFN0cmluZyBjb21tYW5kLCBQNEhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHJlc2V0IGVycm9yIGZsYWdzIGJlZm9yZSBleGVjdXRpbmcgdGhlIGNvbW1hbmQKKyAgICAgICAgICAgIGluRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICIiOworICAgICAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZGxpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLnNldEV4ZWN1dGFibGUoInA0Iik7CisKKyAgICAgICAgICAgIC8vQ2hlY2sgQVBJIGZvciB0aGVzZSAtIGl0J3MgaG93IENWUyBkb2VzIGl0Li4uCisgICAgICAgICAgICBpZiAoUDRQb3J0ICE9IG51bGwgJiYgUDRQb3J0Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFA0UG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUDRVc2VyICE9IG51bGwgJiYgUDRVc2VyLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFA0VXNlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUDRDbGllbnQgIT0gbnVsbCAmJiBQNENsaWVudC5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShQNENsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUDRPcHRzICE9IG51bGwgJiYgUDRPcHRzLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldExpbmUoUDRPcHRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0TGluZShjb21tYW5kKTsKKworICAgICAgICAgICAgbG9nKGNvbW1hbmRsaW5lLmRlc2NyaWJlQ29tbWFuZCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgU2ltcGxlUDRPdXRwdXRIYW5kbGVyKHRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKGhhbmRsZXIsIG51bGwpOworCisgICAgICAgICAgICBleGUuc2V0QW50UnVuKGdldFByb2plY3QoKSk7CisKKyAgICAgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBleGUuZXhlY3V0ZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGluRXJyb3IgJiYgZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5zdG9wKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJFcnJvciBzdG9wcGluZyBleGVjdXRpb24gZnJhbWV3b3JrOiAiICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIGZhaWxNc2cgPSAiUHJvYmxlbSBleGVjJ2luZyBQNCBjb21tYW5kOiAiICsgZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZmFpbE1zZywgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coZmFpbE1zZywgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRDaGFuZ2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0Q2hhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljZjNlZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0Q2hhbmdlLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKy8qCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKKyAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIFJlcXVlc3RzIGEgbmV3IGNoYW5nZWxpc3QgZnJvbSB0aGUgUGVyZm9yY2Ugc2VydmVyLgorICogUDRDaGFuZ2UgY3JlYXRlcyBhIG5ldyBjaGFuZ2VsaXN0IGluIHBlcmZvcmNlLiBQNENoYW5nZSBzZXRzIHRoZSBwcm9wZXJ0eQorICogJHtwNC5jaGFuZ2V9IHdpdGggdGhlIG5ldyBjaGFuZ2VsaXN0IG51bWJlci4gVGhpcyBzaG91bGQgdGhlbiBiZSBwYXNzZWQgaW50bworICogcDRlZGl0IGFuZCBwNHN1Ym1pdC4KKyAqCisgKgorICogQHNlZSBQNEVkaXQKKyAqIEBzZWUgUDRTdWJtaXQKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InNjbSIKKyAqLworcHVibGljIGNsYXNzIFA0Q2hhbmdlIGV4dGVuZHMgUDRCYXNlIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgcHJvdGVjdGVkIFN0cmluZyBlbXB0eUNoYW5nZUxpc3QgPSBudWxsOworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSAiQXV0b1N1Ym1pdCBCeSBBbnQiOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBjcmVhdGVzIGEgbmV3IFBlcmZvcmNlIGNoYW5nZSBsaXN0CisgICAgICogc2V0cyB0aGUgcDQuY2hhbmdlIHByb3BlcnR5IHRvIHRoZSBudW1iZXIgb2YgdGhlIG5ldyBjaGFuZ2UgbGlzdAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHdvcmQgZXJyb3IgYXBwZWFycyBpbiB0aGUgb3V0cHV0IGNvbWluZyBmcm9tIFBlcmZvcmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGVtcHR5Q2hhbmdlTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBlbXB0eUNoYW5nZUxpc3QgPSBnZXRFbXB0eUNoYW5nZUxpc3QoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBQcm9qZWN0IG15UHJvaiA9IGdldFByb2plY3QoKTsKKworICAgICAgICBQNEhhbmRsZXIgaGFuZGxlciA9IG5ldyBQNEhhbmRsZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2VzcyhTdHJpbmcgbGluZSkgeworICAgICAgICAgICAgICAgIGlmICh1dGlsLm1hdGNoKCIvQ2hhbmdlLyIsIGxpbmUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgYW55IG5vbi1udW1lcmljYWwgY2hhcnMgLSBzaG91bGQgbGVhdmUgdGhlIGNoYW5nZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHV0aWwuc3Vic3RpdHV0ZSgicy9bXjAtOV0vL2ciLCBsaW5lKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlbnVtYmVyID0gSW50ZWdlci5wYXJzZUludChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJDaGFuZ2UgTnVtYmVyIGlzICIgKyBjaGFuZ2VudW1iZXIsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgICAgICBteVByb2ouc2V0UHJvcGVydHkoInA0LmNoYW5nZSIsICIiICsgY2hhbmdlbnVtYmVyKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXRpbC5tYXRjaCgiL2Vycm9yLyIsIGxpbmUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUGVyZm9yY2UgRXJyb3IsIGNoZWNrIGNsaWVudCBzZXR0aW5ncyBhbmQvb3Igc2VydmVyIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaGFuZGxlci5zZXRPdXRwdXQoZW1wdHlDaGFuZ2VMaXN0KTsKKworICAgICAgICBleGVjUDRDb21tYW5kKCJjaGFuZ2UgLWkiLCBoYW5kbGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRoZSB0ZXh0IG9mIGFuIGVtcHR5IGNoYW5nZSBsaXN0CisgICAgICogQHJldHVybiAgdGhlIHRleHQgb2YgYW4gZW1wdHkgY2hhbmdlIGxpc3QKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uICBpZiB0aGUgdGV4dCBlcnJvciBpcyBkaXNwbGF5ZWQKKyAgICAgKiBpbiB0aGUgUGVyZm9yY2Ugb3V0cHV0IG91dHNpZGUgb2YgYSBjb21tZW50IGxpbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVtcHR5Q2hhbmdlTGlzdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzdHJpbmdidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZXhlY1A0Q29tbWFuZCgiY2hhbmdlIC1vIiwgbmV3IFA0SGFuZGxlckFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB7CisgICAgICAgICAgICAgICAgaWYgKCF1dGlsLm1hdGNoKCIvXiMvIiwgbGluZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwubWF0Y2goIi9lcnJvci8iLCBsaW5lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJDbGllbnQgRXJyb3IiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUGVyZm9yY2UgRXJyb3IsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImNoZWNrIGNsaWVudCBzZXR0aW5ncyBhbmQvb3Igc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXRpbC5tYXRjaCgiLzxlbnRlciBkZXNjcmlwdGlvbiBoZXJlPi8iLCBsaW5lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlc2NhcGUgdGhlIGRlc2NyaXB0aW9uIGluIGNhc2UgdGhlcmUgYXJlIC8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gYmFja3NsYXNoKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB1dGlsLnN1YnN0aXR1dGUoInMvPGVudGVyIGRlc2NyaXB0aW9uIGhlcmU+LyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlc2NyaXB0aW9uICsgIi8iLCBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1dGlsLm1hdGNoKCIvXFwvXFwvLyIsIGxpbmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL01hdGNoICIvLyIgZm9yIGJlZ2luaW5nIG9mIGRlcG90IGZpbGVzcGVjCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nYnVmLmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc3RyaW5nYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgYSBzdHJpbmcgaXMgYmFja3NsYXNoaW5nIHNsYXNoZXMgc28gdGhhdCAgaXQgZG9lcyBub3QKKyAgICAgKiBjb25mdXNlIHRoZW0gd2l0aCBQZXJsIHN1YnN0aXR1dGlvbiBkZWxpbWl0ZXIgaW4gT3JvLiBCYWNrc2xhc2hlcyBhcmUKKyAgICAgKiBhbHdheXMgYmFja3NsYXNoZXMgaW4gYSBzdHJpbmcgdW5sZXNzIHRoZXkgZXNjYXBlIHRoZSBkZWxpbWl0ZXIuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBzdHJpbmcgdG8gYmFja3NsYXNoIGZvciBzbGFzaGVzCisgICAgICogQHJldHVybiB0aGUgYmFja3NsYXNoZWQgc3RyaW5nCisgICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL29yby9hcGkvb3JnL2FwYWNoZS9vcm8vdGV4dC9wZXJsL1Blcmw1VXRpbC5odG1sCisgICAgICogI3N1YnN0aXR1dGUoamF2YS5sYW5nLlN0cmluZywlMjBqYXZhLmxhbmcuU3RyaW5nKSI+T3JvPC9hPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGJhY2tzbGFzaChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUubGVuZ3RoKCkpOworICAgICAgICBmaW5hbCBpbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICcvJykgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ1xcJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGlvbiBmb3IgQ2hhbmdlTGlzdDtvcHRpb25hbC4KKyAgICAgKiBJZiBub25lIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBkZWZhdWx0IHRvICJBdXRvU3VibWl0IEJ5IEFudCIKKyAgICAgKiBAcGFyYW0gZGVzYyBkZXNjcmlwdGlvbiBmb3IgdGhlIGNoYW5nZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2M7CisgICAgfQorCit9IC8vRW9GCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNENvdW50ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0Q291bnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDEzZjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNENvdW50ZXIuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworLyoKKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQorICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogT2J0YWlucyBvciBzZXRzIHRoZSB2YWx1ZSBvZiBhIGNvdW50ZXIuCisgKgorICogPHA+IFdoZW4gdXNlZCBpbiBpdHMgYmFzZSBmb3JtCisgKiAod2hlcmUgb25seSB0aGUgY291bnRlciBuYW1lIGlzIHByb3ZpZGVkKSwgdGhlIGNvdW50ZXIgdmFsdWUgd2lsbCBiZQorICogcHJpbnRlZCB0byB0aGUgb3V0cHV0IHN0cmVhbS4gV2hlbiB0aGUgdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBjb3VudGVyCisgKiB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgcHJvdmlkZWQuIFdoZW4gYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkLAorICogdGhlIHByb3BlcnR5IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyLiBZb3UgbWF5CisgKiBub3Qgc3BlY2lmeSB0byBib3RoIGdldCBhbmQgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlciBpbiB0aGUgc2FtZQorICogVGFzay4KKyAqIDwvcD4KKyAqIDxQPgorICogVGhlIHVzZXIgcGVyZm9ybWluZyB0aGlzIHRhc2sgbXVzdCBoYXZlIFBlcmZvcmNlICZxdW90O3JldmlldyZxdW90OyBwZXJtaXNzaW9ucworICogYXMgZGVmaW5lZCBieSBQZXJmb3JjZSBwcm90ZWN0aW9ucyBpbiBvcmRlciBmb3IgdGhpcyB0YXNrIHRvIHN1Y2NlZWQuCis8L1A+CisKKyAqIEV4YW1wbGUgVXNhZ2U6PGJyPgorICogJmx0O3A0Y291bnRlciBuYW1lPSIke3A0LmNvdW50ZXJ9IiBwcm9wZXJ0eT0ke3A0LmNoYW5nZX0iLyZndDsKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InNjbSIKKyAqLworCitwdWJsaWMgY2xhc3MgUDRDb3VudGVyIGV4dGVuZHMgUDRCYXNlIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8qKgorICAgICAqIG5hbWUgb2YgdGhlIGNvdW50ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvdW50ZXIgPSBudWxsOworICAgIC8qKgorICAgICAqIG5hbWUgb2YgYW4gb3B0aW9uYWwgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHByb3BlcnR5ID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBmbGFnIHRlbGxpbmcgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIgc2hvdWxkIGJlIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFNldFZhbHVlID0gZmFsc2U7CisgICAgLyoqCisgICAgICogZmxhZyB0ZWxsaW5nIHdoZXRoZXIgYSBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkU2V0UHJvcGVydHkgPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBuZXcgdmFsdWUgZm9yIHRoZSBjb3VudGVyCisgICAgICovCisgICAgcHVibGljIGludCB2YWx1ZSA9IDA7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXI7IHJlcXVpcmVkCisgICAgICogQHBhcmFtIGNvdW50ZXIgbmFtZSBvZiB0aGUgY291bnRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGNvdW50ZXIpIHsKKyAgICAgICAgdGhpcy5jb3VudGVyID0gY291bnRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmV3IHZhbHVlIGZvciB0aGUgY291bnRlcjsgb3B0aW9uYWwuCisgICAgICogQHBhcmFtIHZhbHVlIG5ldyB2YWx1ZSBmb3IgdGhlIGNvdW50ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICBzaG91bGRTZXRWYWx1ZSA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBwcm9wZXJ0eSB0byBiZSBzZXQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgd2l0aCB0aGUgdmFsdWUKKyAgICAgKiBvZiB0aGUgY291bnRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgICAgIHNob3VsZFNldFByb3BlcnR5ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZ2FpbiwgcHJvcGVydGllcyBhcmUgbXV0YWJsZSBpbiB0aGlzIHRzaworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIG5vdCBzdXBwbGllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoKGNvdW50ZXIgPT0gbnVsbCkgfHwgY291bnRlci5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGNvdW50ZXIgc3BlY2lmaWVkIHRvIHJldHJpZXZlIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hvdWxkU2V0VmFsdWUgJiYgc2hvdWxkU2V0UHJvcGVydHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGJvdGggc2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYW5kIHJldHJpZXZlIHRoZSAiCisgICAgICAgICAgICAgICAgKyAidmFsdWUgb2YgdGhlIHByb3BlcnR5LiIpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAiY291bnRlciAiICsgUDRDbWRPcHRzICsgIiAiICsgY291bnRlcjsKKyAgICAgICAgaWYgKCFzaG91bGRTZXRQcm9wZXJ0eSkgeworICAgICAgICAgICAgLy8gTk9URSBraXJrQHJhZGlrLmNvbSAwNC1BcHJpbC0yMDAxIC0tIElmIHlvdSBwdXQgaW4gdGhlIC1zLCB5b3UKKyAgICAgICAgICAgIC8vIGhhdmUgdG8gc3RhcnQgcnVubmluZyB0aHJvdWdoIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaGVyZS4gTXVjaCBlYXNpZXIKKyAgICAgICAgICAgIC8vIHRvIGp1c3Qgbm90IGluY2x1ZGUgdGhlIHNjcmlwdGluZyBpbmZvcm1hdGlvbiB0aGFuIHRvIHRyeSB0byBhZGQgaXQKKyAgICAgICAgICAgIC8vIGFuZCBzdHJpcCBpdCBsYXRlci4KKyAgICAgICAgICAgIGNvbW1hbmQgPSAiLXMgIiArIGNvbW1hbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3VsZFNldFZhbHVlKSB7CisgICAgICAgICAgICBjb21tYW5kICs9ICIgIiArIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNob3VsZFNldFByb3BlcnR5KSB7CisgICAgICAgICAgICBmaW5hbCBQcm9qZWN0IG15UHJvaiA9IGdldFByb2plY3QoKTsKKworICAgICAgICAgICAgUDRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUDRIYW5kbGVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiUDRDb3VudGVyIHJldHJpZXZlZCBsaW5lIFwiIiArIGxpbmUgKyAiXCIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gSW50ZWdlci5wYXJzZUludChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15UHJvai5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgIiIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUGVyZm9yY2UgZXJyb3IuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIkNvdWxkIG5vdCByZXRyaWV2ZSBjb3VudGVyIHZhbHVlLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgZXhlY1A0Q29tbWFuZChjb21tYW5kLCBoYW5kbGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4ZWNQNENvbW1hbmQoY29tbWFuZCwgbmV3IFNpbXBsZVA0T3V0cHV0SGFuZGxlcih0aGlzKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNERlbGV0ZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDREZWxldGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjMxMzExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDREZWxldGUuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKiBDaGVja291dCBmaWxlcyBmb3IgZGVsZXRpb24uCisgKgorICogRXhhbXBsZSBVc2FnZTo8YnI+CisgKiAmbHQ7cDRkZWxldGUgY2hhbmdlPSIke3A0LmNoYW5nZX0iIHZpZXc9Ii8vZGVwb3QvcHJvamVjdC9mb28udHh0IiAvJmd0Ozxicj4KKyAqCisgKiBTaW1wbGUgcmUtd3JpdGUgb2YgUDRFZGl0IGNoYW5naW5nICdlZGl0JyB0byAnZGVsZXRlJy48YnI+CisgKgorICogQHRvZG8gV2hhdCB0byBkbyBpZiBmaWxlIGlzIGFscmVhZHkgb3BlbiBpbiBvbmUgb2Ygb3VyIGNoYW5nZWxpc3RzIHBlcmhhcHMKKyAqIChTZWUgYWxzbyB7QGxpbmsgUDRFZGl0IFA0RWRpdH0pPzxicj4KKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InNjbSIKKyAqLworcHVibGljIGNsYXNzIFA0RGVsZXRlIGV4dGVuZHMgUDRCYXNlIHsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgLyoqCisgICAgICogbnVtYmVyIG9mIHRoZSBjaGFuZ2UgbGlzdCB0byB3b3JrIG9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjaGFuZ2UgPSBudWxsOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBBbiBleGlzdGluZyBjaGFuZ2VsaXN0IG51bWJlciBmb3IgdGhlIGRlbGV0aW9uOyBvcHRpb25hbAorICAgICAqIGJ1dCBzdHJvbmdseSByZWNvbW1lbmRlZC4KKyAgICAgKiBAcGFyYW0gY2hhbmdlIHRoZSBudW1iZXIgb2YgYSBjaGFuZ2UgbGlzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoYW5nZShTdHJpbmcgY2hhbmdlKSB7CisgICAgICAgIHRoaXMuY2hhbmdlID0gY2hhbmdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGV4ZWN1dGVzIHRoZSBwNCBkZWxldGUgdGFzaworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gdmlldyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNoYW5nZSAhPSBudWxsKSB7CisgICAgICAgICAgICBQNENtZE9wdHMgPSAiLWMgIiArIGNoYW5nZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUDRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gdmlldyBzcGVjaWZpZWQgdG8gZGVsZXRlIik7CisgICAgICAgIH0KKyAgICAgICAgZXhlY1A0Q29tbWFuZCgiLXMgZGVsZXRlICIgKyBQNENtZE9wdHMgKyAiICIgKyBQNFZpZXcsIG5ldyBTaW1wbGVQNE91dHB1dEhhbmRsZXIodGhpcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0RWRpdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRFZGl0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxMzMxMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0RWRpdC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKy8qCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKKyAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBPcGVuIGZpbGUocykgZm9yIGVkaXQuCisgKiBQNENoYW5nZSBzaG91bGQgYmUgdXNlZCB0byBvYnRhaW4gYSBuZXcgY2hhbmdlbGlzdCBmb3IgUDRFZGl0IGFzLAorICogYWx0aG91Z2ggUDRFZGl0IGNhbiBvcGVuIGZpbGVzIHRvIHRoZSBkZWZhdWx0IGNoYW5nZSwKKyAqIFA0U3VibWl0IGNhbm5vdCB5ZXQgc3VibWl0IHRvIGl0LgorICogRXhhbXBsZSBVc2FnZTo8YnI+CisgKiAmbHQ7cDRlZGl0IGNoYW5nZT0iJHtwNC5jaGFuZ2V9IiB2aWV3PSIvL2RlcG90L3Byb2plY3QvZm9vLnR4dCIgLyZndDsKKyAqCisgKiBAdG9kbyBTaG91bGQgY2FsbCByZW9wZW4gaWYgZmlsZSBpcyBhbHJlYWR5IG9wZW4gaW4gb25lIG9mIG91ciBjaGFuZ2VsaXN0cyBwZXJoYXBzPworICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0ic2NtIgorICovCisKK3B1YmxpYyBjbGFzcyBQNEVkaXQgZXh0ZW5kcyBQNEJhc2UgeworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2YgdGhlIGNoYW5nZSBsaXN0IHRvIHdvcmsgb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNoYW5nZSA9IG51bGw7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogQW4gZXhpc3RpbmcgY2hhbmdlbGlzdCBudW1iZXIgdG8gYXNzaWduIGZpbGVzIHRvOyBvcHRpb25hbAorICAgICAqIGJ1dCBzdHJvbmdseSByZWNvbW1lbmRlZC4KKyAgICAgKiBAcGFyYW0gY2hhbmdlIHRoZSBjaGFuZ2UgbGlzdCBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFuZ2UoU3RyaW5nIGNoYW5nZSkgeworICAgICAgICB0aGlzLmNoYW5nZSA9IGNoYW5nZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHA0IGVkaXQgY29tbWFuZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gdmlldyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNoYW5nZSAhPSBudWxsKSB7CisgICAgICAgICAgICBQNENtZE9wdHMgPSAiLWMgIiArIGNoYW5nZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUDRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gdmlldyBzcGVjaWZpZWQgdG8gZWRpdCIpOworICAgICAgICB9CisgICAgICAgIGV4ZWNQNENvbW1hbmQoIi1zIGVkaXQgIiArIFA0Q21kT3B0cyArICIgIiArIFA0VmlldywgbmV3IFNpbXBsZVA0T3V0cHV0SGFuZGxlcih0aGlzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRGc3RhdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRGc3RhdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmQwNTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEZzdGF0LmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKy8qCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKKyAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2U7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKKworLyoqCisgKiBQNEZzdGF0LS1maW5kIG91dCB3aGljaCBmaWxlcyBhcmUgdW5kZXIgUGVyZm9yY2UgY29udHJvbCBhbmQgd2hpY2ggYXJlIG5vdC4KKyAqCisgKiA8YnI+PGI+RXhhbXBsZSBVc2FnZTo8L2I+PGJyPgorICogPHByZT4KKyAqICZsdDtwcm9qZWN0IG5hbWU9JnF1b3Q7cDRmc3RhdCZxdW90OyBkZWZhdWx0PSZxdW90O3A0ZnN0YXQmcXVvdDsKKyAqIGJhc2VkaXI9JnF1b3Q7QzpcZGV2XGdudSZxdW90OyZndDsKKyAqICAgICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7cDRmc3RhdCZxdW90OyAmZ3Q7CisgKiAgICAgICAgICZsdDtwNGZzdGF0IHNob3dmaWx0ZXI9JnF1b3Q7YWxsJnF1b3Q7Jmd0OworICogICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2RlcG90JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqXC8qJnF1b3Q7LyZndDsKKyAqICAgICAgICAgJmx0Oy9wNGZzdGF0Jmd0OworICogICAgICZsdDsvdGFyZ2V0Jmd0OworICogJmx0Oy9wcm9qZWN0Jmd0OworICogPC9wcmU+CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBQNEZzdGF0IGV4dGVuZHMgUDRCYXNlIHsKKworICAgIHByaXZhdGUgaW50IGNoYW5nZWxpc3Q7CisgICAgcHJpdmF0ZSBTdHJpbmcgYWRkQ21kID0gIiI7CisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ01EX0xFTkdUSCA9IDMwMDsKKyAgICBwcml2YXRlIGludCBjbWRMZW5ndGggPSBERUZBVUxUX0NNRF9MRU5HVEg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIT1dfQUxMID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19FWElTVElORyA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIT1dfTk9OX0VYSVNUSU5HID0gMjsKKyAgICBwcml2YXRlIGludCBzaG93ID0gU0hPV19OT05fRVhJU1RJTkc7CisgICAgcHJpdmF0ZSBGU3RhdFA0T3V0cHV0SGFuZGxlciBoYW5kbGVyOworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGZpbGVsaXN0OworICAgIHByaXZhdGUgaW50IGZpbGVOdW0gPSAwOworICAgIHByaXZhdGUgaW50IGRvbmVGaWxlTnVtID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWElTVElOR19IRUFERVIKKyAgICAgICAgPSAiRm9sbG93aW5nIGZpbGVzIGV4aXN0IGluIHBlcmZvcmNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORVhJU1RJTkdfSEVBREVSCisgICAgICAgID0gIkZvbGxvd2luZyBmaWxlcyBkbyBub3QgZXhpc3QgaW4gcGVyZm9yY2UiOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZmlsdGVyIHRoYXQgb25lIHdhbnRzIGFwcGxpZWQuCisgICAgICogPHRhYmxlPgorICAgICAqIDx0cj48dGg+T3B0aW9uPC90aD48dGg+TWVhbmluZzwvdGg+PC90cj4KKyAgICAgKiA8dHI+PHRkPmFsbDwvdGQ+PHRkPmFsbCBmaWxlcyB1bmRlciBQZXJmb3JjZSBjb250cm9sIG9yIG5vdDwvdGQ+PC90cj4KKyAgICAgKiA8dHI+PHRkPmV4aXN0aW5nPC90ZD48dGQ+b25seSBmaWxlcyB1bmRlciBQZXJmb3JjZSBjb250cm9sPC90ZD48L3RyPgorICAgICAqIDx0cj48dGQ+bm9uLWV4aXN0aW5nPC90ZD48dGQ+b25seSBmaWxlcyBub3QgdW5kZXIgUGVyZm9yY2UgY29udHJvbCBvciBub3Q8L3RkPjwvdHI+CisgICAgICogPC90YWJsZT4KKyAgICAgKiBAcGFyYW0gZmlsdGVyIHNob3VsZCBiZSBvbmUgb2YgYWxsfGV4aXN0aW5nfG5vbi1leGlzdGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93RmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKKyAgICAgICAgaWYgKGZpbHRlci5lcXVhbHNJZ25vcmVDYXNlKCJhbGwiKSkgeworICAgICAgICAgICAgc2hvdyA9IFNIT1dfQUxMOworICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5lcXVhbHNJZ25vcmVDYXNlKCJleGlzdGluZyIpKSB7CisgICAgICAgICAgICBzaG93ID0gU0hPV19FWElTVElORzsKKyAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIuZXF1YWxzSWdub3JlQ2FzZSgibm9uLWV4aXN0aW5nIikpIHsKKyAgICAgICAgICAgIHNob3cgPSBTSE9XX05PTl9FWElTVElORzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUDRGc3RhdDogU2hvd0ZpbHRlciBzaG91bGQgYmUgb25lIG9mOiAiCisgICAgICAgICAgICAgICAgKyAiYWxsLCBleGlzdGluZywgbm9uLWV4aXN0aW5nIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIG9wdGlvbmFsbHkgYSBjaGFuZ2UgbGlzdCBudW1iZXIuCisgICAgICogQHBhcmFtIGNoYW5nZWxpc3QgY2hhbmdlIGxpc3QgdGhhdCBvbmUgd2FudHMgaW5mb3JtYXRpb24gYWJvdXQuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY2hhbmdlIGxpc3QgbnVtYmVyIGlzIG5lZ2F0aXZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoYW5nZWxpc3QoaW50IGNoYW5nZWxpc3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjaGFuZ2VsaXN0IDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUDRGU3RhdDogQ2hhbmdlbGlzdCMgc2hvdWxkIGJlIGEgIgorICAgICAgICAgICAgICAgICsgInBvc2l0aXZlIG51bWJlciIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY2hhbmdlbGlzdCA9IGNoYW5nZWxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGZpbGVzZXQgdG8gYmUgZXhhbWluZWQgYnkgcDRmc3RhdC4KKyAgICAgKiBAcGFyYW0gc2V0IHRoZSBmaWxlc2V0IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7CisgICAgICAgIGZpbGVzZXRzLmFkZEVsZW1lbnQoc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgcDRmc3RhdCB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgbm8gZmlsZXMgYXJlIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaGFuZGxlciA9IG5ldyBGU3RhdFA0T3V0cHV0SGFuZGxlcih0aGlzKTsKKyAgICAgICAgaWYgKFA0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRDbWQgPSBQNFZpZXc7CisgICAgICAgIH0KKyAgICAgICAgUDRDbWRPcHRzID0gKGNoYW5nZWxpc3QgPiAwKSA/ICgiLWMgIiArIGNoYW5nZWxpc3QpIDogIiI7CisKKyAgICAgICAgZmlsZWxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc2V0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworCisgICAgICAgICAgICBTdHJpbmdbXSBzcmNGaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKworICAgICAgICAgICAgaWYgKHNyY0ZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaWxlTnVtID0gc3JjRmlsZXMubGVuZ3RoOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3JjRmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZHMuZ2V0QmFzZWRpcigpLCBzcmNGaWxlc1tqXSk7CisgICAgICAgICAgICAgICAgICAgIGZpbGVsaXN0LmFwcGVuZCgiICIpLmFwcGVuZCgnIicpLmFwcGVuZChmLmdldEFic29sdXRlUGF0aCgpKS5hcHBlbmQoJyInKTsKKyAgICAgICAgICAgICAgICAgICAgZG9uZUZpbGVOdW0rKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVsaXN0Lmxlbmd0aCgpID4gY21kTGVuZ3RoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNQNEZzdGF0KGZpbGVsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVsaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaWxlbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlY1A0RnN0YXQoZmlsZWxpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJObyBmaWxlcyBzcGVjaWZpZWQgdG8gcXVlcnkgc3RhdHVzIG9uISIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaG93ID09IFNIT1dfQUxMIHx8IHNob3cgPT0gU0hPV19FWElTVElORykgeworICAgICAgICAgICAgcHJpbnRSZXMoaGFuZGxlci5nZXRFeGlzdGluZygpLCBFWElTVElOR19IRUFERVIpOworICAgICAgICB9CisgICAgICAgIGlmIChzaG93ID09IFNIT1dfQUxMIHx8IHNob3cgPT0gU0hPV19OT05fRVhJU1RJTkcpIHsKKyAgICAgICAgICAgIHByaW50UmVzKGhhbmRsZXIuZ2V0Tm9uRXhpc3RpbmcoKSwgTk9ORVhJU1RJTkdfSEVBREVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGVzIHNlZW4uCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGVzIHNlZW4uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMZW5ndGhPZlRhc2soKSB7CisgICAgICAgIHJldHVybiBmaWxlTnVtOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhc3NlcyB0byBtYWtlLgorICAgICAqIElTIFRISVMgQkVJTkcgVVNFRD8KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBwYXNzZXMgKGhvdyBtYW55IGZpbGVzZXRzKS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0UGFzc2VzKCkgeworICAgICAgICByZXR1cm4gZmlsZXNldHMuc2l6ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFJlcyhBcnJheUxpc3QgYXIsIFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgbG9nKGhlYWRlciwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGxvZygoU3RyaW5nKSBhci5nZXQoaSksIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWNQNEZzdGF0KFN0cmluZ0J1ZmZlciBsaXN0KSB7CisgICAgICAgIFN0cmluZyBsID0gbGlzdC5zdWJzdHJpbmcoMCk7CisgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgbG9nKCJFeGVjdXRpbmcgZnN0YXQgIiArIFA0Q21kT3B0cyArICIgIiArIGFkZENtZCArIGwgKyAiXG4iLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICB9CisgICAgICAgIGV4ZWNQNENvbW1hbmQoImZzdGF0ICIgKyBQNENtZE9wdHMgKyAiICIgKyBhZGRDbWQgKyBsLCBoYW5kbGVyKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0SGFuZGxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwNjRhOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyOworCisvKiogSW50ZXJmYWNlIGZvciBwNCBqb2Igb3V0cHV0IHN0cmVhbSBoYW5kbGVyLiBDbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZQorICogY2FuIGJlIGNhbGxlZCBiYWNrIGJ5IFA0QmFzZS5leGVjUDRDb21tYW5kKCk7CisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFA0SGFuZGxlciBleHRlbmRzIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHsKKworICAgIC8qKgorICAgICAqIHByb2Nlc3Npbmcgb2Ygb25lIGxpbmUgb2Ygc3Rkb3V0IG9yIG9mIHN0ZGVycgorICAgICAqIEBwYXJhbSBsaW5lIGEgbGluZSBvZiBzdGRvdXQgb3Igc3RkZXJyIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwgcHJvY2VzcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYXQgdGhlIGRpc2NyZXRpb24gb2YgdGhlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHZvaWQgcHJvY2VzcyhTdHJpbmcgbGluZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogc2V0IGFueSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gUDQncyBzdGRpbgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSB0ZXh0IHRvIHdyaXRlIHRvIFA0J3Mgc3RkaW4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBsaW5lIGNhbm5vdCBiZSBwcm9jZXNzZWQuCisgICAgICovCisgICAgdm9pZCBzZXRPdXRwdXQoU3RyaW5nIGxpbmUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0SGFuZGxlckFkYXB0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0SGFuZGxlckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWMxM2M4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRIYW5kbGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlB1bXBTdHJlYW1IYW5kbGVyOworLyoqCisgKiBiYXNlIGNsYXNzIHRvIG1hbmFnZSBzdHJlYW1zIGFyb3VuZCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBQZXJmb3JjZQorICogY29tbWFuZCBsaW5lIGNsaWVudAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUDRIYW5kbGVyQWRhcHRlciAgaW1wbGVtZW50cyBQNEhhbmRsZXIgeworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgU3RyaW5nIHA0aW5wdXQgPSAiIjsKKyAgICBwcml2YXRlIFB1bXBTdHJlYW1IYW5kbGVyIG15SGFuZGxlciA9IG51bGw7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKyAgICAvKioKKyAgICAgKiAgc2V0IGFueSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gUDQncyBzdGRpbgorICAgICAqICBAcGFyYW0gcDRJbnB1dCB0aGUgdGV4dCB0byB3cml0ZSB0byBQNCdzIHN0ZGluCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KFN0cmluZyBwNElucHV0KSB7CisgICAgICAgIHRoaXMucDRpbnB1dCA9IHA0SW5wdXQ7CisgICAgfQorICAgIC8qKgorICAgICAqIHN1YmNsYXNzZXMgb2YgUDRIYW5kbGVyQWRhcHRlciBtdXN0IGltcGxlbWVudCB0aGlzIHJvdXRpbmUKKyAgICAgKiBwcm9jZXNzaW5nIG9mIG9uZSBsaW5lIG9mIHN0ZG91dCBvciBvZiBzdGRlcnIKKyAgICAgKiBAcGFyYW0gbGluZSBsaW5lIG9mIHN0ZG91dCBvciBzdGRlcnIgdG8gcHJvY2VzcworICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb2Nlc3MoU3RyaW5nIGxpbmUpOworCisgICAgLyoqCisgICAgICogdGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGJ5IHRoZSBleGVjdXRlIHJvdXRpbmUgb2YgdGhlIEV4ZWN1dGUgY2xhc3MKKyAgICAgKiBpdCBjb25uZWN0cyB0aGUgUHVtcFN0cmVhbUhhbmRsZXIgdG8gdGhlIGlucHV0L291dHB1dC9lcnJvciBzdHJlYW1zIG9mIHRoZSBwcm9jZXNzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBlcnJvci4KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGUjZXhlY3V0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHA0aW5wdXQgIT0gbnVsbCAmJiBwNGlucHV0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgbXlIYW5kbGVyID0gbmV3IFB1bXBTdHJlYW1IYW5kbGVyKG5ldyBQNE91dHB1dFN0cmVhbSh0aGlzKSwgbmV3IFA0T3V0cHV0U3RyZWFtKHRoaXMpLAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwNGlucHV0LmdldEJ5dGVzKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG15SGFuZGxlciA9IG5ldyBQdW1wU3RyZWFtSGFuZGxlcihuZXcgUDRPdXRwdXRTdHJlYW0odGhpcyksIG5ldyBQNE91dHB1dFN0cmVhbSh0aGlzKSk7CisgICAgICAgIH0KKyAgICAgICAgbXlIYW5kbGVyLnNldFByb2Nlc3NJbnB1dFN0cmVhbShvcyk7CisgICAgICAgIG15SGFuZGxlci5zZXRQcm9jZXNzRXJyb3JTdHJlYW0oZXMpOworICAgICAgICBteUhhbmRsZXIuc2V0UHJvY2Vzc091dHB1dFN0cmVhbShpcyk7CisgICAgICAgIG15SGFuZGxlci5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHN0b3BzIHRoZSBwcm9jZXNzaW5nIG9mIHN0cmVhbXMKKyAgICAgKiBjYWxsZWQgZnJvbSBQNEJhc2UjZXhlY1A0Q29tbWFuZChTdHJpbmcgY29tbWFuZCwgUDRIYW5kbGVyIGhhbmRsZXIpCisgICAgICogQHNlZSBQNEJhc2UjZXhlY1A0Q29tbWFuZChTdHJpbmcsIFA0SGFuZGxlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBpZiAobXlIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG1pZ2h0IG5ldmVyIGhhdmUgYmVlbiBzdGFydGVkLCBmb3Jmb3IgZXhhbXBsZSBpZmlmIHA0CisgICAgICAgICAgICAvLyBpcyBub3Qgb24gdGhlIFBBVEgKKyAgICAgICAgICAgIG15SGFuZGxlci5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIE91dHB1dFN0cmVhbSBvczsgICAgLy9JbnB1dAorICAgIElucHV0U3RyZWFtIGlzOyAgICAgLy9PdXRwdXQKKyAgICBJbnB1dFN0cmVhbSBlczsgICAgIC8vRXJyb3IKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogY29ubmVjdHMgdGhlIGhhbmRsZXIgdG8gdGhlIGlucHV0IHN0cmVhbSBpbnRvIFBlcmZvcmNlCisgICAgICogdXNlZCBpbmRpcmVjdGx5IGJ5IHRhc2tzIHJlcXVpcmluZyB0byBzZW5kIHNwZWNpZmljIHN0YW5kYXJkIGlucHV0CisgICAgICogc3VjaCBhcyBwNGxhYmVsLCBwNGNoYW5nZQorICAgICAqIEBwYXJhbSBvcyB0aGUgc3RyZWFtIGJyaW5naW5nIGlucHV0IHRvIHRoZSBwNCBleGVjdXRhYmxlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB1bmRlciB1bmtub3duIGNpcmN1bXN0YW5jZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzSW5wdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLm9zID0gb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29ubmVjdHMgdGhlIGhhbmRsZXIgdG8gdGhlIHN0ZGVyciBvZiB0aGUgUGVyZm9yY2UgcHJvY2VzcworICAgICAqIEBwYXJhbSBpcyBzdGRlcnIgY29taW5nIGZyb20gUGVyZm9yY2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHVuZGVyIHVua25vd24gY2lyY3Vtc3RhbmNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NFcnJvclN0cmVhbShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5lcyA9IGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbm5lY3RzIHRoZSBoYW5kbGVyIHRvIHRoZSBzdGRvdXQgb2YgdGhlIFBlcmZvcmNlIHByb2Nlc3MKKyAgICAgKiBAcGFyYW0gaXMgc3Rkb3V0IGNvbWluZyBmcm9tIFBlcmZvcmNlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB1bmRlciB1bmtub3duIGNpcmN1bXN0YW5jZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzT3V0cHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLmlzID0gaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRIYXZlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEhhdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc2ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRIYXZlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworLyoKKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQorICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKiBMaXN0cyBQZXJmb3JjZSBmaWxlcyBjdXJyZW50bHkgb24gY2xpZW50LgorICoKKyAqIFA0SGF2ZSBzaW1wbHkgZHVtcHMgdGhlIGN1cnJlbnQgZmlsZSB2ZXJzaW9uIGluZm8gaW50bworICogdGhlIEFudCBsb2cgKG9yIHN0ZG91dCkuCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBQNEhhdmUgZXh0ZW5kcyBQNEJhc2UgeworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgUGVyZm9yY2UgPGNvZGU+aGF2ZTwvY29kZT4gY29tbWFuZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgY2Fubm90IGJlIGV4ZWN1dGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBleGVjUDRDb21tYW5kKCJoYXZlICIgKyBQNENtZE9wdHMgKyAiICIgKyBQNFZpZXcsIG5ldyBTaW1wbGVQNE91dHB1dEhhbmRsZXIodGhpcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0SW50ZWdyYXRlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEludGVncmF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NGU4MzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNEludGVncmF0ZS5qYXZhCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisvKgorICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCisgKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogSW50ZWdyYXRlIGZpbGUocykuCisgKiBQNENoYW5nZSBzaG91bGQgYmUgdXNlZCB0byBvYnRhaW4gYSBuZXcgY2hhbmdlbGlzdCBmb3IgUDRJbnRlZ3JhdGUsCisgKiBhbHRob3VnaCBQNEludGVncmF0ZSBjYW4gb3BlbiBmaWxlcyB0byB0aGUgZGVmYXVsdCBjaGFuZ2UsCisgKiBQNFN1Ym1pdCBjYW5ub3QgeWV0IHN1Ym1pdCB0byBpdC4KKyAqIEV4YW1wbGUgVXNhZ2U6PGJyPgorICogJmx0O3A0aW50ZWdyYXRlIGNoYW5nZT0iJHtwNC5jaGFuZ2V9IgorICogZnJvbWZpbGU9Ii8vZGVwb3QvcHJvamVjdC9kZXYvZm9vLnR4dCIgdG9maWxlPSIvL2RlcG90L3Byb2plY3QvbWFpbi9mb28udHh0IiAvJmd0OworICoKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InNjbSIKKyAqLworCitwdWJsaWMgY2xhc3MgUDRJbnRlZ3JhdGUgZXh0ZW5kcyBQNEJhc2UgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgY2hhbmdlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBmcm9tZmlsZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgdG9maWxlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBicmFuY2ggPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiByZXN0b3JlZGVsZXRlZHJldmlzaW9ucyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZWludGVncmF0ZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBsZWF2ZXRhcmdldHJldmlzaW9uID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZWJhc2VsZXNzbWVyZ2VzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHNpbXVsYXRpb25tb2RlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHJldmVyc2VicmFuY2htYXBwaW5ncyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBwcm9wYWdhdGVzb3VyY2VmaWxldHlwZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBub2NvcHluZXd0YXJnZXRmaWxlcyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBjaGFuZ2VsaXN0IG51bWJlcgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY2hhbmdlbGlzdCBudW1iZXIgc2V0IGZvciB0aGlzIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYW5nZSgpIHsKKyAgICAgICAgcmV0dXJuIGNoYW5nZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIGNoYW5nZWxpc3QgbnVtYmVyIGZvciB0aGUgb3BlcmF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hhbmdlIEFuIGV4aXN0aW5nIGNoYW5nZWxpc3QgbnVtYmVyIHRvIGFzc2lnbiBmaWxlcyB0bzsgb3B0aW9uYWwKKyAgICAgKiBidXQgc3Ryb25nbHkgcmVjb21tZW5kZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlKFN0cmluZyBjaGFuZ2UpIHsKKyAgICAgICAgdGhpcy5jaGFuZ2UgPSBjaGFuZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBmcm9tIGZpbGUgc3BlY2lmaWNhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZnJvbSBmaWxlIHNwZWNpZmljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZyb21maWxlKCkgeworICAgICAgICByZXR1cm4gZnJvbWZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgZnJvbSBmaWxlIHNwZWNpZmljYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9tZiB0aGUgZnJvbSBmaWxlIHNwZWNpZmljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcm9tZmlsZShTdHJpbmcgZnJvbWYpIHsKKyAgICAgICAgdGhpcy5mcm9tZmlsZSA9IGZyb21mOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgdG8gZmlsZSBzcGVjaWZpY2F0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0byBmaWxlIHNwZWNpZmljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRvZmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRvZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSB0byBmaWxlIHNwZWNpZmljYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2YgdGhlIHRvIGZpbGUgc3BlY2lmaWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvZmlsZShTdHJpbmcgdG9mKSB7CisgICAgICAgIHRoaXMudG9maWxlID0gdG9mOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgYnJhbmNoCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBicmFuY2gKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJyYW5jaCgpIHsKKyAgICAgICAgcmV0dXJuIGJyYW5jaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSBicmFuY2gKKyAgICAgKgorICAgICAqIEBwYXJhbSBiciB0aGUgbmFtZSBvZiB0aGUgYnJhbmNoIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJyYW5jaChTdHJpbmcgYnIpIHsKKyAgICAgICAgdGhpcy5icmFuY2ggPSBicjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRzIHRoZSByZXN0b3JlZGVsZXRlZHJldmlzaW9ucyBmbGFnCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlc3RvcmUgZGVsZXRlZCByZXZpc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3RvcmVEZWxldGVkUmV2aXNpb25zKCkgeworICAgICAgICByZXR1cm4gcmVzdG9yZWRlbGV0ZWRyZXZpc2lvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgcmVzdG9yZWRlbGV0ZWRyZXZpc2lvbnMgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIHNldHJlc3QgdmFsdWUgY2hvc2VuIGZvciByZXN0b3JlZGVsZXRlZHJldmlzaW9ucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc3RvcmVEZWxldGVkUmV2aXNpb25zKGJvb2xlYW4gc2V0cmVzdCkgeworICAgICAgICB0aGlzLnJlc3RvcmVkZWxldGVkcmV2aXNpb25zID0gc2V0cmVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRzIHRoZSBmb3JjZWludGVncmF0ZSBmbGFnCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlc3RvcmUgZGVsZXRlZCByZXZpc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlSW50ZWdyYXRlKCkgeworICAgICAgICByZXR1cm4gZm9yY2VpbnRlZ3JhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgZm9yY2VpbnRlZ3JhdGUgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIHNldHJlc3QgdmFsdWUgY2hvc2VuIGZvciBmb3JjZWludGVncmF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSW50ZWdyYXRlKGJvb2xlYW4gc2V0cmVzdCkgeworICAgICAgICB0aGlzLmZvcmNlaW50ZWdyYXRlID0gc2V0cmVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXRzIHRoZSBsZWF2ZXRhcmdldHJldmlzaW9uIGZsYWcKKyAgICAgKgorICAgICAqIEByZXR1cm4gZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB0YXJnZXQgcmV2aXNpb24gc2hvdWxkIGJlIHByZXNlcnZlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTGVhdmVUYXJnZXRSZXZpc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGxlYXZldGFyZ2V0cmV2aXNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgbGVhdmV0YXJnZXRyZXZpc2lvbiBmbGFnCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2V0cmVzdCB2YWx1ZSBjaG9zZW4gZm9yIGxlYXZldGFyZ2V0cmV2aXNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZWF2ZVRhcmdldFJldmlzaW9uKGJvb2xlYW4gc2V0cmVzdCkgeworICAgICAgICB0aGlzLmxlYXZldGFyZ2V0cmV2aXNpb24gPSBzZXRyZXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldHMgdGhlIGVuYWJsZWJhc2VsZXNzbWVyZ2VzIGZsYWcKKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGJhc2VsZXNzIG1lcmdlcyBhcmUgZGVzaXJlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlQmFzZWxlc3NNZXJnZXMoKSB7CisgICAgICAgIHJldHVybiBlbmFibGViYXNlbGVzc21lcmdlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSBlbmFibGViYXNlbGVzc21lcmdlcyBmbGFnCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2V0cmVzdCB2YWx1ZSBjaG9zZW4gZm9yIGVuYWJsZWJhc2VsZXNzbWVyZ2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlQmFzZWxlc3NNZXJnZXMoYm9vbGVhbiBzZXRyZXN0KSB7CisgICAgICAgIHRoaXMuZW5hYmxlYmFzZWxlc3NtZXJnZXMgPSBzZXRyZXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldHMgdGhlIHNpbXVsYXRpb25tb2RlIGZsYWcKKyAgICAgKgorICAgICAqIEByZXR1cm4gc2ltdWxhdGlvbiBtb2RlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXVsYXRpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gc2ltdWxhdGlvbm1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgc2ltdWxhdGlvbm1vZGUgZmxhZworICAgICAqCisgICAgICogQHBhcmFtIHNldHJlc3QgdmFsdWUgY2hvc2VuIGZvciBzaW11bGF0aW9ubW9kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNpbXVsYXRpb25Nb2RlKGJvb2xlYW4gc2V0cmVzdCkgeworICAgICAgICB0aGlzLnNpbXVsYXRpb25tb2RlID0gc2V0cmVzdDsKKyAgICB9CisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgZmxhZyBpbmRpY2F0aW5nIGlmIHJldmVyc2UgYnJhbmNoIG1hcHBpbmdzIGFyZSBzb3VnaHQKKyAgICAgKgorICAgICAqIEByZXR1cm4gcmV2ZXJzZWJyYW5jaG1hcHBpbmdzIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VicmFuY2htYXBwaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIHJldmVyc2VicmFuY2htYXBwaW5nczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgc2V0cyB0aGUgcmV2ZXJzZWJyYW5jaG1hcHBpbmdzIGZsYWcKKyAgICAgKgorICAgICAqICBAcGFyYW0gcmV2ZXJzZWJyYW5jaG1hcHBpbmdzIGZsYWcgaW5kaWNhdGluZyBpZiByZXZlcnNlIGJyYW5jaCBtYXBwaW5ncyBhcmUgc291Z2h0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV2ZXJzZWJyYW5jaG1hcHBpbmdzKGJvb2xlYW4gcmV2ZXJzZWJyYW5jaG1hcHBpbmdzKSB7CisgICAgICAgIHRoaXMucmV2ZXJzZWJyYW5jaG1hcHBpbmdzID0gcmV2ZXJzZWJyYW5jaG1hcHBpbmdzOworICAgIH0KKyAgICAvKioKKyAgICAgKiAgcmV0dXJucyBmbGFnIGluZGljYXRpbmcgaWYgcHJvcGFnYXRpb24gb2Ygc291cmNlIGZpbGUgdHlwZSBpcyBzb3VnaHQKKyAgICAgKgorICAgICAqICBAcmV0dXJuIGZsYWcgc2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gcHJvcGFnYXRlIHNvdXJjZSBmaWxlIHR5cGUgZm9yIGV4aXN0aW5nIHRhcmdldCBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJvcGFnYXRlc291cmNlZmlsZXR5cGUoKSB7CisgICAgICAgIHJldHVybiBwcm9wYWdhdGVzb3VyY2VmaWxldHlwZTsKKyAgICB9CisgICAgLyoqCisgICAgICogICBzZXRzIGZsYWcgaW5kaWNhdGluZyBpZiBvbmUgd2FudHMgdG8gcHJvcGFnYXRlIHRoZSBzb3VyY2UgZmlsZSB0eXBlCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBwcm9wYWdhdGVzb3VyY2VmaWxldHlwZQorICAgICAqICAgc2V0IGl0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0eXBlIG9mIGV4aXN0aW5nIHRhcmdldCBmaWxlcworICAgICAqICAgYWNjb3JkaW5nIHRvIHR5cGUgb2Ygc291cmNlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGFnYXRlc291cmNlZmlsZXR5cGUoYm9vbGVhbiBwcm9wYWdhdGVzb3VyY2VmaWxldHlwZSkgeworICAgICAgICB0aGlzLnByb3BhZ2F0ZXNvdXJjZWZpbGV0eXBlID0gcHJvcGFnYXRlc291cmNlZmlsZXR5cGU7CisgICAgfQorICAgIC8qKgorICAgICAqICAgaW5kaWNhdGVzIGludGVudGlvbiB0byBzdXBwcmVzcyB0aGUgY29weWluZyBvbiB0aGUgbG9jYWwgaGFyZCBkaXNrIG9mIG5ldyB0YXJnZXQgZmlsZXMuCisgICAgICoKKyAgICAgKiAgIEByZXR1cm4gaW5kaWNhdGVzIGludGVudGlvbiB0byBzdXBwcmVzcyB0aGUgY29weWluZworICAgICAqICAgb24gdGhlIGxvY2FsIGhhcmQgZGlzayBvZiBuZXcgdGFyZ2V0IGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTm9jb3B5bmV3dGFyZ2V0ZmlsZXMoKSB7CisgICAgICAgIHJldHVybiBub2NvcHluZXd0YXJnZXRmaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgIHNldHMgbm9jb3B5bmV3dGFyZ2V0ZmlsZXMgZmxhZworICAgICAqCisgICAgICogICBAcGFyYW0gbm9jb3B5bmV3dGFyZ2V0ZmlsZXMgc2V0IGl0IHRvIHRydWUgdG8gZ2FpbiBzcGVlZCBpbiBpbnRlZ3JhdGlvbiBieSBub3QgY29weWluZyBvbgorICAgICAqICAgdGhlIGxvY2FsIFBlcmZvcmNlIGNsaWVudCBuZXcgdGFyZ2V0IGZpbGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9jb3B5bmV3dGFyZ2V0ZmlsZXMoYm9vbGVhbiBub2NvcHluZXd0YXJnZXRmaWxlcykgeworICAgICAgICB0aGlzLm5vY29weW5ld3RhcmdldGZpbGVzID0gbm9jb3B5bmV3dGFyZ2V0ZmlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogIGV4ZWN1dGUgdGhlIHA0IGludGVncmF0ZQorICAgICAqICBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBtaXNzaW5nIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNoYW5nZSAhPSBudWxsKSB7CisgICAgICAgICAgICBQNENtZE9wdHMgPSAiLWMgIiArIGNoYW5nZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5mb3JjZWludGVncmF0ZSkgeworICAgICAgICAgICAgUDRDbWRPcHRzID0gUDRDbWRPcHRzICsgIiAtZiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMucmVzdG9yZWRlbGV0ZWRyZXZpc2lvbnMpIHsKKyAgICAgICAgICAgICAgICBQNENtZE9wdHMgPSBQNENtZE9wdHMgKyAiIC1kIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubGVhdmV0YXJnZXRyZXZpc2lvbikgeworICAgICAgICAgICAgUDRDbWRPcHRzID0gUDRDbWRPcHRzICsgIiAtaCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZW5hYmxlYmFzZWxlc3NtZXJnZXMpIHsKKyAgICAgICAgICAgIFA0Q21kT3B0cyA9IFA0Q21kT3B0cyArICIgLWkiOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnNpbXVsYXRpb25tb2RlKSB7CisgICAgICAgICAgICBQNENtZE9wdHMgPSBQNENtZE9wdHMgKyAiIC1uIjsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5yZXZlcnNlYnJhbmNobWFwcGluZ3MpIHsKKyAgICAgICAgICAgIFA0Q21kT3B0cyA9IFA0Q21kT3B0cyArICIgLXIiOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnByb3BhZ2F0ZXNvdXJjZWZpbGV0eXBlKSB7CisgICAgICAgICAgICBQNENtZE9wdHMgPSBQNENtZE9wdHMgKyAiIC10IjsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5ub2NvcHluZXd0YXJnZXRmaWxlcykgeworICAgICAgICAgICAgUDRDbWRPcHRzID0gUDRDbWRPcHRzICsgIi12IjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgY29tbWFuZDsKKyAgICAgICAgaWYgKGJyYW5jaCA9PSBudWxsICYmIGZyb21maWxlICE9IG51bGwgJiYgdG9maWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgY29tbWFuZCA9IFA0Q21kT3B0cyArICIgIiArIGZyb21maWxlICsgIiAiICsgdG9maWxlOworICAgICAgICB9IGVsc2UgaWYgKGJyYW5jaCAhPSBudWxsICYmIGZyb21maWxlID09IG51bGwgJiYgdG9maWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1hbmQgPSBQNENtZE9wdHMgKyAiIC1iICIgKyBicmFuY2ggKyAiICIgKyB0b2ZpbGU7CisgICAgICAgIH0gZWxzZSBpZiAoYnJhbmNoICE9IG51bGwgJiYgZnJvbWZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgY29tbWFuZCA9IFA0Q21kT3B0cyArICIgLWIgIiArIGJyYW5jaCArICIgLXMgIiArIGZyb21maWxlICsgIiAiICsgdG9maWxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ5b3UgbmVlZCB0byBzcGVjaWZ5IGZyb21maWxlIGFuZCB0b2ZpbGUsICIKKyAgICAgICAgICAgICsgIm9yIGJyYW5jaCBhbmQgdG9maWxlLCBvciBicmFuY2ggYW5kIGZyb21maWxlLCBvciBicmFuY2ggYW5kIGZyb21maWxlIGFuZCB0b2ZpbGUgIik7CisgICAgICAgIH0KKyAgICAgICAgZXhlY1A0Q29tbWFuZCgiLXMgaW50ZWdyYXRlICIgKyBjb21tYW5kLCBuZXcgU2ltcGxlUDRPdXRwdXRIYW5kbGVyKHRoaXMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNExhYmVsLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNExhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyZWRiNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0TGFiZWwuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworLyoKKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQorICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiAgQ3JlYXRlcyBhIG5ldyBQZXJmb3JjZSBsYWJlbCBhbmQgc2V0IGNvbnRlbnRzIHRvIHJlZmxlY3QgY3VycmVudAorICogIGNsaWVudCBmaWxlIHJldmlzaW9ucy4KKyAqCisgKiAgTGFiZWwgbmFtZSBkZWZhdWx0cyB0byBBbnRMYWJlbCBpZiBub25lIHNldC4KKyAqCisgKiBFeGFtcGxlIFVzYWdlOgorICogPHByZT4KKyAqICAgJmx0O1A0TGFiZWwgbmFtZT0iTXlMYWJlbC0ke1RTVEFNUH0tJHtEU1RBTVB9IiBkZXNjPSJBdXRvIEJ1aWxkIExhYmVsIiAvJmd0OworICogPC9wcmU+CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBQNExhYmVsIGV4dGVuZHMgUDRCYXNlIHsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzYzsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2s7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBsYWJlbDsgb3B0aW9uYWwsIGRlZmF1bHQgIkFudExhYmVsIgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBsYWJlbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKkxhYmVsIERlc2NyaXB0aW9uOyBvcHRpb25hbAorICAgICAqIEBwYXJhbSBkZXNjIGRlc2NyaXB0aW9uIG9mIHRoZSBsYWJlbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB3aGVuIHNldCB0byAibG9ja2VkIiwgUGVyZm9yY2Ugd2lsbCBsb2NrIHRoZSBsYWJlbCBvbmNlIGNyZWF0ZWQ7IG9wdGlvbmFsLgorICAgICAqIEBwYXJhbSBsb2NrIG9ubHkgYWRtaXNzaWJsZSB2YWx1ZSAibG9ja2VkIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2soU3RyaW5nIGxvY2spIHsKKyAgICAgICAgdGhpcy5sb2NrID0gbG9jazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkbyB0aGUgd29yaworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgZmFpbG9uZXJyb3IgaGFzIGJlZW4gc2V0IHRvIHRydWUgYW5kIFBlcmZvcmNlIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZygiUDRMYWJlbCBleGVjOiIsIFByb2plY3QuTVNHX0lORk8pOworCisgICAgICAgIGlmIChQNFZpZXcgPT0gbnVsbCB8fCBQNFZpZXcubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICBsb2coIlZpZXcgbm90IHNldCwgYXNzdW1pbmcgLy9kZXBvdC8uLi4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIFA0VmlldyA9ICIvL2RlcG90Ly4uLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQNFZpZXcgPSBTdHJpbmdVdGlscy5yZXBsYWNlKFA0VmlldywgIjoiLCAiXG5cdCIpOworICAgICAgICAgICAgUDRWaWV3ID0gU3RyaW5nVXRpbHMucmVwbGFjZShQNFZpZXcsICI7IiwgIlxuXHQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXNjID09IG51bGwgfHwgZGVzYy5sZW5ndGgoKSA8IDEpIHsKKyAgICAgICAgICAgIGxvZygiTGFiZWwgRGVzY3JpcHRpb24gbm90IHNldCwgYXNzdW1pbmcgJ0FudExhYmVsJyIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICBkZXNjID0gIkFudExhYmVsIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NrICE9IG51bGwgJiYgIWxvY2suZXF1YWxzSWdub3JlQ2FzZSgibG9ja2VkIikpIHsKKyAgICAgICAgICAgIGxvZygibG9jayBhdHRyaWJ1dGUgaW52YWxpZCAtIGlnbm9yaW5nIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdHRlcgorICAgICAgICAgICAgICAgID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkuTU0uZGQtaGg6bW0iKTsKKyAgICAgICAgICAgIERhdGUgbm93ID0gbmV3IERhdGUoKTsKKyAgICAgICAgICAgIG5hbWUgPSAiQW50TGFiZWwtIiArIGZvcm1hdHRlci5mb3JtYXQobm93KTsKKyAgICAgICAgICAgIGxvZygibmFtZSBub3Qgc2V0LCBhc3N1bWluZyAnIiArIG5hbWUgKyAiJyIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisKKworICAgICAgICAvL1dlIGhhdmUgdG8gY3JlYXRlIGEgdW5sb2NrZWQgbGFiZWwgZmlyc3QKKyAgICAgICAgU3RyaW5nIG5ld0xhYmVsID0KKyAgICAgICAgICAgICAgICAiTGFiZWw6ICIgKyBuYW1lCisgICAgICAgICAgICAgICAgKyAiXG5EZXNjcmlwdGlvbjogIiArIGRlc2MKKyAgICAgICAgICAgICAgICArICJcbk9wdGlvbnM6IHVubG9ja2VkIgorICAgICAgICAgICAgICAgICsgIlxuVmlldzogXG5cdCIgKyBQNFZpZXc7CisKKyAgICAgICAgUDRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUDRIYW5kbGVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgICAgICAgICBsb2cobGluZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaGFuZGxlci5zZXRPdXRwdXQobmV3TGFiZWwpOworCisgICAgICAgIGV4ZWNQNENvbW1hbmQoImxhYmVsIC1pIiwgaGFuZGxlcik7CisKKyAgICAgICAgZXhlY1A0Q29tbWFuZCgibGFiZWxzeW5jIC1sICIgKyBuYW1lLCBuZXcgUDRIYW5kbGVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgICAgICAgICBsb2cobGluZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisKKyAgICAgICAgbG9nKCJDcmVhdGVkIExhYmVsICIgKyBuYW1lICsgIiAoIiArIGRlc2MgKyAiKSB3aXRoIHZpZXc6XG4iICsgUDRWaWV3LAorICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyk7CisKKyAgICAgICAgLy9Ob3cgbG9jayBpZiByZXF1aXJlZAorICAgICAgICBpZiAobG9jayAhPSBudWxsICYmIGxvY2suZXF1YWxzSWdub3JlQ2FzZSgibG9ja2VkIikpIHsKKworICAgICAgICAgICAgbG9nKCJNb2RpZnlpbmcgbG9jayBzdGF0dXMgdG8gJ2xvY2tlZCciLCBQcm9qZWN0Lk1TR19JTkZPKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGxhYmVsU3BlYyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAgICAgLy9SZWFkIGJhY2sgdGhlIGxhYmVsIHNwZWMgZnJvbSBwZXJmb3JjZSwKKyAgICAgICAgICAgIC8vUmVwbGFjZSBPcHRpb25zCisgICAgICAgICAgICAvL1N1Ym1pdCBiYWNrIHRvIFBlcmZvcmNlCisKKyAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgUDRIYW5kbGVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5tYXRjaCgiL15PcHRpb25zOi8iLCBsaW5lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9ICJPcHRpb25zOiAiICsgbG9jazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxhYmVsU3BlYy5hcHBlbmQobGluZSArICJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKworICAgICAgICAgICAgZXhlY1A0Q29tbWFuZCgibGFiZWwgLW8gIiArIG5hbWUsIGhhbmRsZXIpOworICAgICAgICAgICAgbG9nKGxhYmVsU3BlYy50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgICAgIGxvZygiTm93IGxvY2tpbmcgbGFiZWwuLi4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgUDRIYW5kbGVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhsaW5lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBoYW5kbGVyLnNldE91dHB1dChsYWJlbFNwZWMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBleGVjUDRDb21tYW5kKCJsYWJlbCAtaSIsIGhhbmRsZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRMYWJlbHN5bmMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0TGFiZWxzeW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3YzUwYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0TGFiZWxzeW5jLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKy8qCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGFyZSBiYXNlZCB1cG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUKKyAqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCisgKiBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogIFRoaXMgbWV0aG9kIHN5bmNzIGFuIGV4aXN0aW5nIFBlcmZvcmNlIGxhYmVsIGFnYWluc3QgdGhlIFBlcmZvcmNlIGNsaWVudAorICogIG9yIGFnYWluc3QgYSBzZXQgb2YgZmlsZXMvcmV2aXNpb25zLgorICoKKyAqCisgKiBFeGFtcGxlIFVzYWdlOgorICogPHByZT4KKyAqICAgJmx0O3A0bGFiZWxzeW5jIG5hbWU9Ik15TGFiZWwtJHtUU1RBTVB9LSR7RFNUQU1QfSIKKyAqICAgdmlldz0iLy9kZXBvdC8uLi4jaGVhZDsvL2RlcG90Mi9maWxlMSMyNSIgLyZndDsKKyAqIDwvcHJlPgorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0ic2NtIgorICovCitwdWJsaWMgY2xhc3MgUDRMYWJlbHN5bmMgZXh0ZW5kcyBQNEJhc2UgeworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGFkZDsgLyogLWEgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsZXRlOyAvKiAtbiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzaW11bGF0aW9ubW9kZTsgIC8qIC1uICovCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKyAgICAvKioKKyAgICAgKiAtYSBmbGFnIG9mIHA0IGxhYmVsc3luYyAtIHByZXNlcnZlIGZpbGVzIHdoaWNoIGV4aXN0IGluIHRoZSBsYWJlbCwKKyAgICAgKiBidXQgbm90IGluIHRoZSBjdXJyZW50IHZpZXcKKyAgICAgKiBAcmV0dXJuICBhZGQgYXR0cmlidXRlCisgICAgICogaWYgc2V0IHRvIHRydWUgdGhlIHRhc2sgd2lsbCBub3QgcmVtb3ZlIGFueSBmaWxlcyBmcm9tIHRoZSBsYWJlbAorICAgICAqIG9ubHkgYWRkIGZpbGVzIHdoaWNoIHdlcmUgbm90IHRoZXJlIHByZXZpb3VzbHkgb3IgdXBkYXRlIHRoZXNlIHdoZXJlIHRoZSByZXZpc2lvbiBoYXMgY2hhbmdlZAorICAgICAqIHRoZSBhZGQgYXR0cmlidXRlIGlzIHRoZSAtYSBmbGFnIG9mIHA0IGxhYmVsc3luYworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWRkKCkgeworICAgICAgICByZXR1cm4gYWRkOworICAgIH0KKyAgICAvKioKKyAgICAgKiAtYSBmbGFnIG9mIHA0IGxhYmVsc3luYyAtIHByZXNlcnZlIGZpbGVzIHdoaWNoIGV4aXN0IGluIHRoZSBsYWJlbCwKKyAgICAgKiBidXQgbm90IGluIHRoZSBjdXJyZW50IHZpZXcKKyAgICAgKiBAcGFyYW0gYWRkICBpZiBzZXQgdG8gdHJ1ZSB0aGUgdGFzayB3aWxsIG5vdCByZW1vdmUgYW55IGZpbGVzIGZyb20gdGhlIGxhYmVsCisgICAgICogb25seSBhZGQgZmlsZXMgd2hpY2ggd2VyZSBub3QgdGhlcmUgcHJldmlvdXNseSBvciB1cGRhdGUgdGhlc2Ugd2hlcmUgdGhlIHJldmlzaW9uIGhhcyBjaGFuZ2VkCisgICAgICogdGhlIGFkZCBhdHRyaWJ1dGUgaXMgdGhlIC1hIGZsYWcgb2YgcDQgbGFiZWxzeW5jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkKGJvb2xlYW4gYWRkKSB7CisgICAgICAgIHRoaXMuYWRkID0gYWRkOworICAgIH0KKyAgICAvKioKKyAgICAgKiAtZCBmbGFnIG9mIHA0IGxhYmVsc3luYzsgaW5kaWNhdGVzIGFuIGludGVudGlvbiBvZiBkZWxldGluZyBmcm9tIHRoZSBsYWJlbAorICAgICAqIHRoZSBmaWxlcyBzcGVjaWZpZWQgaW4gdGhlIHZpZXcKKyAgICAgKiBAcmV0dXJuICBkZWxldGUgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGUoKSB7CisgICAgICAgIHJldHVybiBkZWxldGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogLWQgZmxhZyBvZiBwNCBsYWJlbHN5bmM7IGluZGljYXRlcyBhbiBpbnRlbnRpb24gb2YgZGVsZXRpbmcgZnJvbSB0aGUgbGFiZWwKKyAgICAgKiAgdGhlIGZpbGVzIHNwZWNpZmllZCBpbiB0aGUgdmlldworICAgICAqIEBwYXJhbSBkZWxldGUgaW5kaWNhdGVzIGludGVudGlvbiBvZiBkZWxldGluZyBmcm9tIHRoZSBsYWJlbAorICAgICAqIHRoZSBmaWxlcyBzcGVjaWZpZWQgaW4gdGhlIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWxldGUoYm9vbGVhbiBkZWxldGUpIHsKKyAgICAgICAgdGhpcy5kZWxldGUgPSBkZWxldGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbGFiZWw7IG9wdGlvbmFsLCBkZWZhdWx0ICJBbnRMYWJlbCIKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgbGFiZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorICAgIC8qKgorICAgICAqIC1uIGZsYWcgb2YgcDQgbGFiZWxzeW5jIC0gZGlzcGxheSBjaGFuZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgdGhlbQorICAgICAqIEByZXR1cm4gLW4gZmxhZyBvZiBwNCBsYWJlbHN5bmMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXVsYXRpb25tb2RlKCkgeworICAgICAgICByZXR1cm4gc2ltdWxhdGlvbm1vZGU7CisgICAgfQorICAgIC8qKgorICAgICAqIC1uIGZsYWcgb2YgcDQgbGFiZWxzeW5jIC0gZGlzcGxheSBjaGFuZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgdGhlbQorICAgICAqIEBwYXJhbSBzaW11bGF0aW9ubW9kZSBkaXNwbGF5IGNoYW5nZXMgd2l0aG91dCBhY3R1YWxseSBkb2luZyB0aGVtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2ltdWxhdGlvbm1vZGUoYm9vbGVhbiBzaW11bGF0aW9ubW9kZSkgeworICAgICAgICB0aGlzLnNpbXVsYXRpb25tb2RlID0gc2ltdWxhdGlvbm1vZGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgZG8gdGhlIHdvcmsKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBsYWJlbCBuYW1lIGlzIG5vdCBzdXBwbGllZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBsb2coIlA0TGFiZWxzeW5jIGV4ZWM6IiwgUHJvamVjdC5NU0dfSU5GTyk7CisKKyAgICAgICAgaWYgKFA0VmlldyAhPSBudWxsICYmIFA0Vmlldy5sZW5ndGgoKSA+PSAxKSB7CisgICAgICAgICAgICBQNFZpZXcgPSBTdHJpbmdVdGlscy5yZXBsYWNlKFA0VmlldywgIjoiLCAiXG5cdCIpOworICAgICAgICAgICAgUDRWaWV3ID0gU3RyaW5nVXRpbHMucmVwbGFjZShQNFZpZXcsICI7IiwgIlxuXHQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUDRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIFA0VmlldyA9ICIiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpIDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJuYW1lIGF0dHJpYnV0ZSBpcyBjb21wdWxzb3J5IGZvciBsYWJlbHN5bmMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLmlzU2ltdWxhdGlvbm1vZGUoKSkgeworICAgICAgICAgICAgUDRDbWRPcHRzID0gUDRDbWRPcHRzICsgIiAtbiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuaXNEZWxldGUoKSkgeworICAgICAgICAgICAgUDRDbWRPcHRzID0gUDRDbWRPcHRzICsgIiAtZCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuaXNBZGQoKSkgeworICAgICAgICAgICAgUDRDbWRPcHRzID0gUDRDbWRPcHRzICsgIiAtYSI7CisgICAgICAgIH0KKworICAgICAgICBleGVjUDRDb21tYW5kKCItcyBsYWJlbHN5bmMgLWwgIiArIG5hbWUgKyAiICIgKyBQNENtZE9wdHMgKyAiICIgKyBQNFZpZXcsCisgICAgICAgICAgICBuZXcgU2ltcGxlUDRPdXRwdXRIYW5kbGVyKHRoaXMpKTsKKworCisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNE91dHB1dEhhbmRsZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0T3V0cHV0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ODJmNzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNE91dHB1dEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqIEludGVyZmFjZSBmb3IgcDQgam9iIG91dHB1dCBzdHJlYW0gaGFuZGxlci4gQ2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UKKyAqIGNhbiBiZSBjYWxsZWQgYmFjayBieSBQNEJhc2UuZXhlY1A0Q29tbWFuZCgpOworICoKKyAqLworcHVibGljIGludGVyZmFjZSBQNE91dHB1dEhhbmRsZXIgeworICAgIC8qKgorICAgICAqIGltcGxlbWVudGF0aW9ucyB3aWxsIGJlIGFibGUgdG8gcHJvY2VzcyBsaW5lcyBvZiBvdXRwdXQgZnJvbSBQZXJmb3JjZQorICAgICAqIEBwYXJhbSBsaW5lIGEgbGluZSBvZiBzdGRvdXQgb3Igc3RkZXJyIGNvbWluZyBmcm9tIFBlcmZvcmNlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpbXBsZW1lbnRhdGlvbnMgYXJlIGFsbG93ZWQgdG8gdGhyb3cgQnVpbGRFeGNlcHRpb24KKyAgICAgKi8KKyAgICB2b2lkIHByb2Nlc3MoU3RyaW5nIGxpbmUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0T3V0cHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNE91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzIyYmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNE91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogaGVhdmlseSBpbnNwaXJlZCBmcm9tIExvZ091dHB1dFN0cmVhbQorICogdGhpcyBzdHJlYW0gY2xhc3MgY2FsbHMgYmFjayB0aGUgUDRIYW5kbGVyIG9uIGVhY2ggbGluZSBvZiBzdGRvdXQgb3Igc3RkZXJyIHJlYWQKKyAqLworcHVibGljIGNsYXNzIFA0T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIFA0SGFuZGxlciBoYW5kbGVyOworICAgIHByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogY3JlYXRlcyBhIG5ldyBQNE91dHB1dFN0cmVhbSBmb3IgYSBQNEhhbmRsZXIKKyAgICAgKiBAcGFyYW0gaGFuZGxlciAgIHRoZSBoYW5kbGVyIHdoaWNoIHdpbGwgcHJvY2VzcyB0aGUgc3RyZWFtcworICAgICAqLworICAgIHB1YmxpYyBQNE91dHB1dFN0cmVhbShQNEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBidWZmZXIgYW5kIGZsdXNoIHRoZSBidWZmZXIsIGlmIGEgbGluZQorICAgICAqIHNlcGFyYXRvciBpcyBkZXRlY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYyBkYXRhIHRvIGxvZyAoYnl0ZSkuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4gSW4gcGFydGljdWxhciwKKyAgICAgKiAgICAgICAgICAgICBhbiA8Y29kZT5JT0V4Y2VwdGlvbjwvY29kZT4gbWF5IGJlIHRocm93biBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgICBvdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgY2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJ5dGUgYyA9IChieXRlKSBjYzsKKyAgICAgICAgaWYgKChjID09ICdcbicpIHx8IChjID09ICdccicpKSB7CisgICAgICAgICAgICBpZiAoIXNraXApIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXIud3JpdGUoY2MpOworICAgICAgICB9CisgICAgICAgIHNraXAgPSAoYyA9PSAnXHInKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBidWZmZXIgdG8gYSBzdHJpbmcgYW5kIHNlbmRzIGl0IHRvIDxjb2RlPnByb2Nlc3NMaW5lPC9jb2RlPgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCdWZmZXIoKSB7CisgICAgICAgIGhhbmRsZXIucHJvY2VzcyhidWZmZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbGwgcmVtYWluaW5nCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcm9jZXNzQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFJlb3Blbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRSZW9wZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDJiZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRSZW9wZW4uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisvKgorICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCisgKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogUmVvcGVuIFBlcmZvcmNlIGNoZWNrb3V0IGZpbGVzIGJldHdlZW4gY2hhbmdlbGlzdHMuCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBQNFJlb3BlbiBleHRlbmRzIFA0QmFzZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyB0b0NoYW5nZSA9ICIiOworCisgICAgLyoqCisgICAgICogVGhlIGNoYW5nZWxpc3QgdG8gbW92ZSBmaWxlcyB0bzsgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHRvQ2hhbmdlIG5ldyBjaGFuZ2UgbGlzdCBudW1iZXIKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjaGFuZ2UgcGFyYW1ldGVyIGlzIG51bGwgb3IgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb0NoYW5nZShTdHJpbmcgdG9DaGFuZ2UpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0b0NoYW5nZSA9PSBudWxsIHx8IHRvQ2hhbmdlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUDRSZW9wZW46IHRvY2hhbmdlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnRvQ2hhbmdlID0gdG9DaGFuZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogZG8gdGhlIHdvcmsKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIFA0VmlldyBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChQNFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyB2aWV3IHNwZWNpZmllZCB0byByZW9wZW4iKTsKKyAgICAgICAgfQorICAgICAgICBleGVjUDRDb21tYW5kKCItcyByZW9wZW4gLWMgIiArIHRvQ2hhbmdlICsgIiAiICsgUDRWaWV3LCBuZXcgU2ltcGxlUDRPdXRwdXRIYW5kbGVyKHRoaXMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFJlc29sdmUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0UmVzb2x2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2M4MWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFJlc29sdmUuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworLyoKKyogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCisqIG9yaWdpbmFsbHkgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsCisqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCisqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBQNFJlc29sdmUgZXh0ZW5kcyBQNEJhc2UgeworICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVtb2RlID0gbnVsbDsKKworCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZG9hbGw7IC8qIC1mICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNpbXVsYXRpb25tb2RlOyAgLyogLW4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2V0ZXh0bW9kZTsgIC8qIC10ICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1hcmtlcnNmb3JhbGw7IC8qIC12ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9NQVRJQyA9ICJhdXRvbWF0aWMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRSA9ICJmb3JjZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBRkUgPSAic2FmZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRUlSUyA9ICJ0aGVpcnMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBZT1VSUyA9ICJ5b3VycyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVTT0xWRV9NT0RFUyA9IHsKKyAgICAgICAgQVVUT01BVElDLAorICAgICAgICBGT1JDRSwKKyAgICAgICAgU0FGRSwKKyAgICAgICAgVEhFSVJTLAorICAgICAgICBZT1VSUworICAgIH07CisgICAvKioKKyAgICAqIHJldHVybnMgdGhlIHJlc29sdmUgbW9kZQorICAgICogQHJldHVybiAgcmV0dXJucyB0aGUgcmVzb2x2ZSBtb2RlCisgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVtb2RlKCkgeworICAgICAgICByZXR1cm4gcmVzb2x2ZW1vZGU7CisgICAgfQorICAgIC8qKgorICAgICAqIHZhbHVlcyBmb3IgcmVzb2x2ZW1vZGUKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiBhdXRvbWF0aWMgLWFtPC9saT4KKyAgICAgKiA8bGk+IGZvcmNlIC1hZiA8L2xpPgorICAgICAqIDxsaT4gc2FmZSAtYXMgPC9saT4KKyAgICAgKiA8bGk+IHRoZWlycyAtYXQgPC9saT4KKyAgICAgKiA8bGk+IHlvdXJzIC1heSA8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQHBhcmFtIHJlc29sdmVtb2RlIG9uZSBvZiBhdXRvbWF0aWMsIGZvcmNlLCBzYWZlLCB0aGVpcnMsIHlvdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZW1vZGUoU3RyaW5nIHJlc29sdmVtb2RlKSB7CisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBSRVNPTFZFX01PREVTLmxlbmd0aDsgY291bnRlcisrKSB7CisgICAgICAgICAgICBpZiAocmVzb2x2ZW1vZGUuZXF1YWxzKFJFU09MVkVfTU9ERVNbY291bnRlcl0pKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hY2NlcHRhYmxlIHZhbHVlIGZvciByZXNvbHZlIG1vZGUiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnJlc29sdmVtb2RlID0gcmVzb2x2ZW1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWxsb3dzIHByZXZpb3VzbHkgcmVzb2x2ZWQgZmlsZXMgdG8gYmUgcmVzb2x2ZWQgYWdhaW4KKyAgICAgKiBAcmV0dXJuIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9uZSB3YW50cyB0bworICAgICAqIGFsbG93IHByZXZpb3VzbHkgcmVzb2x2ZWQgZmlsZXMgdG8gYmUgcmVzb2x2ZWQgYWdhaW4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZG9hbGwoKSB7CisgICAgICAgIHJldHVybiByZWRvYWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCB0aGUgcmVkb2FsbCBmbGFnCisgICAgICogQHBhcmFtIHJlZG9hbGwgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb25lIHdhbnQgdG8KKyAgICAgKiBhbGxvdyBwcmV2aW91c2x5IHJlc29sdmVkIGZpbGVzIHRvIGJlIHJlc29sdmVkIGFnYWluCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVkb2FsbChib29sZWFuIHJlZG9hbGwpIHsKKyAgICAgICAgdGhpcy5yZWRvYWxsID0gcmVkb2FsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWFkIHRoZSBzaW11bGF0aW9uIG1vZGUgZmxhZworICAgICAqIEByZXR1cm4gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb25lIHdhbnRzIGp1c3QgdG8gc2ltdWxhdGUKKyAgICAgKiB0aGUgcDQgcmVzb2x2ZSBvcGVyYXRpb24gd2hpdGhvdXQgYWN0dWFsbHkgZG9pbmcgaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXVsYXRpb25tb2RlKCkgeworICAgICAgICByZXR1cm4gc2ltdWxhdGlvbm1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyBhIGZsYWcKKyAgICAgKiBAcGFyYW0gc2ltdWxhdGlvbm1vZGUgc2V0IHRvIHRydWUsIGxpc3RzIHRoZSBpbnRlZ3JhdGlvbnMgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkLAorICAgICAqIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgdGhlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaW11bGF0aW9ubW9kZShib29sZWFuIHNpbXVsYXRpb25tb2RlKSB7CisgICAgICAgIHRoaXMuc2ltdWxhdGlvbm1vZGUgPSBzaW11bGF0aW9ubW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgYXR0ZW1wdHMgYSB0ZXh0dWFsIG1lcmdlLCBldmVuIGZvciBiaW5hcnkgZmlsZXMKKyAgICAgKiBAcmV0dXJuIGZsYWcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvcmNldGV4dG1vZGUoKSB7CisgICAgICAgIHJldHVybiBmb3JjZXRleHRtb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHNldCB0byB0cnVlLCBhdHRlbXB0cyBhIHRleHR1YWwgbWVyZ2UsIGV2ZW4gZm9yIGJpbmFyeSBmaWxlcworICAgICAqIEBwYXJhbSBmb3JjZXRleHRtb2RlIHNldCB0aGUgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNldGV4dG1vZGUoYm9vbGVhbiBmb3JjZXRleHRtb2RlKSB7CisgICAgICAgIHRoaXMuZm9yY2V0ZXh0bW9kZSA9IGZvcmNldGV4dG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgc2V0IHRvIHRydWUsIHB1dHMgaW4gbWFya2VycyBmb3IgYWxsIGNoYW5nZXMsIGNvbmZsaWN0aW5nIG9yIG5vdAorICAgICAqIEByZXR1cm4gIGZsYWcgbWFya2Vyc2ZvcmFsbCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWFya2Vyc2ZvcmFsbCgpIHsKKyAgICAgICAgcmV0dXJuIG1hcmtlcnNmb3JhbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICAqIElmIHNldCB0byB0cnVlLCBwdXRzIGluIG1hcmtlcnMgZm9yIGFsbCBjaGFuZ2VzLCBjb25mbGljdGluZyBvciBub3QKKyAgICAgKiBAcGFyYW0gbWFya2Vyc2ZvcmFsbCBmbGFnIHRydWUgb3IgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXJrZXJzZm9yYWxsKGJvb2xlYW4gbWFya2Vyc2ZvcmFsbCkgeworICAgICAgICB0aGlzLm1hcmtlcnNmb3JhbGwgPSBtYXJrZXJzZm9yYWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqICBleGVjdXRlIHRoZSBwNCByZXNvbHZlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHdyb25nIHJlc29sdmUgbW9kZSBzcGVjaWZpZWQKKyAgICAgKiAgb3Igbm8gdmlldyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMucmVzb2x2ZW1vZGUuZXF1YWxzKEFVVE9NQVRJQykpIHsKKyAgICAgICAgICAgIFA0Q21kT3B0cyA9IFA0Q21kT3B0cyArICIgLWFtIjsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc29sdmVtb2RlLmVxdWFscyhGT1JDRSkpIHsKKyAgICAgICAgICAgIFA0Q21kT3B0cyA9IFA0Q21kT3B0cyArICIgLWFmIjsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc29sdmVtb2RlLmVxdWFscyhTQUZFKSkgeworICAgICAgICAgICAgUDRDbWRPcHRzID0gUDRDbWRPcHRzICsgIiAtYXMiOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb2x2ZW1vZGUuZXF1YWxzKFRIRUlSUykpIHsKKyAgICAgICAgICAgIFA0Q21kT3B0cyA9IFA0Q21kT3B0cyArICIgLWF0IjsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc29sdmVtb2RlLmVxdWFscyhZT1VSUykpIHsKKyAgICAgICAgICAgIFA0Q21kT3B0cyA9IFA0Q21kT3B0cyArICIgLWF5IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgb3IgYWJzZW50IHJlc29sdmUgbW9kZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChQNFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwbGVhc2Ugc3BlY2lmeSBhIHZpZXciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5pc1JlZG9hbGwoKSkgeworICAgICAgICAgICAgUDRDbWRPcHRzID0gUDRDbWRPcHRzICsgIiAtZiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuaXNTaW11bGF0aW9ubW9kZSgpKSB7CisgICAgICAgICAgICBQNENtZE9wdHMgPSBQNENtZE9wdHMgKyAiIC1uIjsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5pc0ZvcmNldGV4dG1vZGUoKSkgeworICAgICAgICAgICAgUDRDbWRPcHRzID0gUDRDbWRPcHRzICsgIiAtdCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuaXNNYXJrZXJzZm9yYWxsKCkpIHsKKyAgICAgICAgICAgIFA0Q21kT3B0cyA9IFA0Q21kT3B0cyArICIgLXYiOworICAgICAgICB9CisgICAgICAgIGV4ZWNQNENvbW1hbmQoIi1zIHJlc29sdmUgIiArIFA0Q21kT3B0cyArICIgIiArIFA0VmlldywgbmV3IFNpbXBsZVA0T3V0cHV0SGFuZGxlcih0aGlzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRSZXZlcnQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0UmV2ZXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlYjg5MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0UmV2ZXJ0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworLyoKKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQorICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIFJldmVydCBQZXJmb3JjZSBvcGVuIGZpbGVzIG9yIGZpbGVzIGluIGEgY2hhbmdlbGlzdAorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0ic2NtIgorICovCitwdWJsaWMgY2xhc3MgUDRSZXZlcnQgZXh0ZW5kcyBQNEJhc2UgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgcmV2ZXJ0Q2hhbmdlID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gb25seVVuY2hhbmdlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhlIGNoYW5nZWxpc3QgdG8gcmV2ZXJ0OyBvcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gcmV2ZXJ0Q2hhbmdlIDogdGhlIGNoYW5nZSBsaXN0IHRvIHJldmVydAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNoYW5nZSBsaXN0IGlzIG51bGwgb3IgZW1wdHkgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlKFN0cmluZyByZXZlcnRDaGFuZ2UpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXZlcnRDaGFuZ2UgPT0gbnVsbCB8fCByZXZlcnRDaGFuZ2UuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQNFJldmVydDogY2hhbmdlIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJldmVydENoYW5nZSA9IHJldmVydENoYW5nZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIGZsYWcgdG8gcmV2ZXJ0IG9ubHkgdW5jaGFuZ2VkIGZpbGVzIChwNCByZXZlcnQgLWEpOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KKyAgICAgKiBAcGFyYW0gb25seVVuY2hhbmdlZCBpZiBzZXQgdG8gdHJ1ZSByZXZlcnQgb25seSB1bmNoYW5nZWQgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXZlcnRPbmx5VW5jaGFuZ2VkKGJvb2xlYW4gb25seVVuY2hhbmdlZCkgeworICAgICAgICB0aGlzLm9ubHlVbmNoYW5nZWQgPSBvbmx5VW5jaGFuZ2VkOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRvIHRoZSB3b3JrCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIFBlcmZvcmNlIGNvbW1hbmQKKyAgICAgKiBhbmQgZmFpbG9uRXJyb3IgaXMgc2V0IHRvIHRydWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICAvKiBIZXJlIHdlIGNhbiBlaXRoZXIgcmV2ZXJ0IGFueSB1bmNoYW5nZWQgZmlsZXMgaW4gYSBjaGFuZ2VsaXN0CisgICAgICAgICAqIG9yCisgICAgICAgICAqIGFueSBmaWxlcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBoYXZlIGJlZW4gY2hhbmdlZCBvciBub3QKKyAgICAgICAgICoKKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHdob2xlIHByb2Nlc3MgYWxzbyBhY2NlcHRzIGEgcDQgZmlsZXNwZWMKKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBwNGNtZCA9ICItcyByZXZlcnQiOworICAgICAgICBpZiAob25seVVuY2hhbmdlZCkgeworICAgICAgICAgICAgcDRjbWQgKz0gIiAtYSI7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV2ZXJ0Q2hhbmdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHA0Y21kICs9ICIgLWMgIiArIHJldmVydENoYW5nZTsKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWNQNENvbW1hbmQocDRjbWQgKyAiICIgKyBQNFZpZXcsIG5ldyBTaW1wbGVQNE91dHB1dEhhbmRsZXIodGhpcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0U3VibWl0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFN1Ym1pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Mzg4M2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFN1Ym1pdC5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisvKgorICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgYmFzZWQgdXBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlCisgKiBvcmlnaW5hbGx5IHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLAorICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKiogU3VibWl0cyBhIG51bWJlcmVkIGNoYW5nZWxpc3QgdG8gUGVyZm9yY2UuCisgKgorICogPEI+Tm90ZTo8L0I+IFA0U3VibWl0IGNhbm5vdCAoeWV0KSBzdWJtaXQgdGhlIGRlZmF1bHQgY2hhbmdlbGlzdC4KKyAqIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBBTlQgdGFzayBhcyB0aGUgdXN1YWwgZmxvdyBpcworICogUDRDaGFuZ2UgdG8gY3JlYXRlIGEgbmV3IG51bWJlcmVkIGNoYW5nZSBmb2xsb3dlZCBieSBQNEVkaXQgdGhlbiBQNFN1Ym1pdC4KKyAqCisgKiBFeGFtcGxlIFVzYWdlOi08YnI+CisgKiAmbHQ7cDRzdWJtaXQgY2hhbmdlPSIke3A0LmNoYW5nZX0iIC8mZ3Q7CisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBQNFN1Ym1pdCBleHRlbmRzIFA0QmFzZSB7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8vVG9EbzogSWYgZGVhbGluZyB3aXRoIGRlZmF1bHQgY2wgbmVlZCB0byBwYXJzZSBvdXQgPGVudGVyIGRlc2NyaXB0aW9uIGhlcmU+CisgICAgLyoqCisgICAgICogY2hhbmdlIGxpc3QgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjaGFuZ2U7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKyAgICAvKioKKyAgICAgKiBjaGFuZ2UgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjaGFuZ2VQcm9wZXJ0eTsKKyAgICAvKioKKyAgICAgKiBuZWVkc3Jlc29sdmVwcm9wZXJ0eQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5lZWRzUmVzb2x2ZVByb3BlcnR5OworICAgIC8qKgorICAgICAqIHNldCB0aGUgY2hhbmdlIGxpc3QgbnVtYmVyIHRvIHN1Ym1pdAorICAgICAqIEBwYXJhbSBjaGFuZ2UgVGhlIGNoYW5nZWxpc3QgbnVtYmVyIHRvIHN1Ym1pdDsgcmVxdWlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlKFN0cmluZyBjaGFuZ2UpIHsKKyAgICAgICAgdGhpcy5jaGFuZ2UgPSBjaGFuZ2U7CisgICAgfQorICAgIC8qKgorICAgICAqIHByb3BlcnR5IGRlZmluaW5nIHRoZSBjaGFuZ2UgbnVtYmVyIGlmIHRoZSBjaGFuZ2UgbnVtYmVyIGdldHMgcmVudW1iZXJlZAorICAgICAqIEBwYXJhbSBjaGFuZ2VQcm9wZXJ0eSBuYW1lIG9mIGEgbmV3IHByb3BlcnR5IHRvIHdoaWNoIHRoZSBjaGFuZ2UgbnVtYmVyCisgICAgICogd2lsbCBiZSBhc3NpZ25lZCBpZiBpdCBjaGFuZ2VzCisgICAgICogQHNpbmNlIGFudCAxLjYuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoYW5nZVByb3BlcnR5KFN0cmluZyBjaGFuZ2VQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLmNoYW5nZVByb3BlcnR5ID0gY2hhbmdlUHJvcGVydHk7CisgICAgfQorICAgIC8qKgorICAgICAqIHByb3BlcnR5IGRlZmluaW5nIHRoZSBuZWVkIHRvIHJlc29sdmUgdGhlIGNoYW5nZSBsaXN0CisgICAgICogQHBhcmFtIG5lZWRzUmVzb2x2ZVByb3BlcnR5IGEgcHJvcGVydHkgd2hpY2ggd2lsbCBiZSBzZXQgaWYgdGhlIGNoYW5nZSBuZWVkcyByZXNvbHZlCisgICAgICogQHNpbmNlIGFudCAxLjYuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5lZWRzUmVzb2x2ZVByb3BlcnR5KFN0cmluZyBuZWVkc1Jlc29sdmVQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLm5lZWRzUmVzb2x2ZVByb3BlcnR5ID0gbmVlZHNSZXNvbHZlUHJvcGVydHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZG8gdGhlIHdvcmsKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG5vIGNoYW5nZSBsaXN0IHNwZWNpZmllZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoY2hhbmdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV4ZWNQNENvbW1hbmQoInN1Ym1pdCAtYyAiICsgY2hhbmdlLCAoUDRIYW5kbGVyQWRhcHRlcikgbmV3IFA0U3VibWl0QWRhcHRlcih0aGlzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL2hlcmUgd2UnZCBwYXJzZSB0aGUgb3V0cHV0IGZyb20gY2hhbmdlIC1vIGludG8gc3VibWl0IC1pCisgICAgICAgICAgICAvL2luIG9yZGVyIHRvIHN1cHBvcnQgZGVmYXVsdCBjaGFuZ2UuCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGNoYW5nZSBzcGVjaWZpZWQgKG5vIHN1cHBvcnQgZm9yIGRlZmF1bHQgY2hhbmdlIHlldC4uLi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGludGVybmFsIGNsYXNzIHVzZWQgdG8gcHJvY2VzcyB0aGUgb3V0cHV0IG9mIHA0IHN1Ym1pdAorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBQNFN1Ym1pdEFkYXB0ZXIgZXh0ZW5kcyBTaW1wbGVQNE91dHB1dEhhbmRsZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnQgYSBQNEJhc2UgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUDRTdWJtaXRBZGFwdGVyKFA0QmFzZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmVudCk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIHByb2Nlc3MgYSBsaW5lIG9mIHN0ZG91dC9zdGRlcnIgY29taW5nIGZyb20gUGVyZm9yY2UKKyAgICAgICAgICogQHBhcmFtIGxpbmUgbGluZSBvZiBzdGRvdXQgb3Igc3RkZXJyIGNvbWluZyBmcm9tIFBlcmZvcmNlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFN0cmluZyBsaW5lKSB7CisgICAgICAgICAgICBzdXBlci5wcm9jZXNzKGxpbmUpOworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJwNC5uZWVkc3Jlc29sdmUiLCAiMCIpOworICAgICAgICAgICAgLy8gdGhpcyB0eXBlIG9mIG91dHB1dCBtaWdodCBoYXBwZW4KKyAgICAgICAgICAgIC8vIENoYW5nZSAxOCByZW5hbWVkIGNoYW5nZSAyMCBhbmQgc3VibWl0dGVkLgorICAgICAgICAgICAgaWYgKHV0aWwubWF0Y2goIi9yZW5hbWVkLyIsIGxpbmUpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yIG15YXJyYXkgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHV0aWwuc3BsaXQobXlhcnJheSwgbGluZSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBteWFycmF5LnNpemUoKTsgY291bnRlcisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hudW0gPSAoU3RyaW5nKSBteWFycmF5LmVsZW1lbnRBdChjb3VudGVyICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5nZW51bWJlciA9IEludGVnZXIucGFyc2VJbnQoY2hudW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiUGVyZm9yY2UgY2hhbmdlIHJlbmFtZWQgIiArIGNoYW5nZW51bWJlciwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJwNC5jaGFuZ2UiLCAiIiArIGNoYW5nZW51bWJlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZVByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KGNoYW5nZVByb3BlcnR5LCBjaG51bSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChteWFycmF5LmVsZW1lbnRBdChjb3VudGVyKSkpLmVxdWFscygicmVuYW1lZCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG9yIEFycmF5T3V0T2ZCb25kc0V4Y2VwdGlvbiBjb3VsZCBoYXBwZW4gaGVyZQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIHBhcnNlICIgKyBsaW5lICArICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZHVlIHRvICIgKyBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHV0aWwubWF0Y2goIi9wNCBzdWJtaXQgLWMvIiwgbGluZSkpIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoInA0Lm5lZWRzcmVzb2x2ZSIsICIxIik7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRzUmVzb2x2ZVByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KG5lZWRzUmVzb2x2ZVByb3BlcnR5LCAidHJ1ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFN5bmMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0U3luYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjk2NmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9QNFN5bmMuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworLyoKKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQorICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKiBTeW5jaHJvbml6ZSBjbGllbnQgc3BhY2UgdG8gYSBQZXJmb3JjZSBkZXBvdCB2aWV3LgorICoKKyAqICBUaGUgQVBJIGFsbG93cyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlICJwNCBzeW5jIiBjb21tYW5kCisgKiAoc3VjaCBhcyAicDQgc3luYyAtZiAvLy4uLiNoYXZlIiBvciBvdGhlciBleG90aWMgaW52b2NhdGlvbnMpLjwvUD4KKyAqCisgKiA8Yj5FeGFtcGxlIFVzYWdlOjwvYj4KKyAqIDx0YWJsZSBib3JkZXI9IjEiPgorICogPHRoPkZ1bmN0aW9uPC90aD48dGg+Q29tbWFuZDwvdGg+CisgKiA8dHI+PHRkPlN5bmMgdG8gaGVhZCB1c2luZyBQNFVTRVIsIFA0UE9SVCBhbmQgUDRDTElFTlQgc2V0dGluZ3Mgc3BlY2lmaWVkPC90ZD4KKyAqIDx0ZD4mbHQ7UDRTeW5jIDxicj5QNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgPGJyPgorICogUDRVc2VyPSJmYmxvZ2dzIiA8YnI+UDRQb3J0PSJrbTAxOjE2NjYiIDxicj5QNENsaWVudD0iZmJsb2dnc2NsaWVudCIgLyZndDs8L3RkPjwvdHI+CisgKiA8dHI+PHRkPlN5bmMgdG8gaGVhZCB1c2luZyBQNFVTRVIsIFA0UE9SVCBhbmQgUDRDTElFTlQgc2V0dGluZ3MgZGVmaW5lZCBpbiBlbnZpcm9ubWVudDwvdGQ+CisgKiA8dGQ+Jmx0O1A0U3luYyBQNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgLyZndDs8L3RkPjwvdHI+CisgKiA8dHI+PHRkPkZvcmNlIGEgcmUtc3luYyB0byBoZWFkLCByZWZyZXNoaW5nIGFsbCBmaWxlczwvdGQ+CisgKiA8dGQ+Jmx0O1A0U3luYyBmb3JjZT0ieWVzIiBQNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgLyZndDs8L3RkPjwvdHI+CisgKiA8dHI+PHRkPlN5bmMgdG8gYSBsYWJlbDwvdGQ+PHRkPiZsdDtQNFN5bmMgbGFiZWw9Im15UGVyZm9yY2VMYWJlbCIgLyZndDs8L3RkPjwvdHI+CisgKiA8L3RhYmxlPgorICoKKyAqIEB0b2RvIEFkZCBkZWNlbnQgbGFiZWwgZXJyb3IgaGFuZGxpbmcgZm9yIG5vbi1leHNpdGFudCBsYWJlbHMKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InNjbSIKKyAqLworcHVibGljIGNsYXNzIFA0U3luYyBleHRlbmRzIFA0QmFzZSB7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIFN0cmluZyBsYWJlbDsKKyAgICBwcml2YXRlIFN0cmluZyBzeW5jQ21kID0gIiI7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIExhYmVsIHRvIHN5bmMgY2xpZW50IHRvOyBvcHRpb25hbC4KKyAgICAgKiBAcGFyYW0gbGFiZWwgbmFtZSBvZiBhIGxhYmVsIGFnYWluc3Qgd2hpY2ggb25lIHdhbnQgdG8gc3luYworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgbGFiZWwgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUDRTeW5jOiBMYWJlbHMgY2Fubm90IGJlIE51bGwgb3IgRW1wdHkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogZm9yY2UgYSByZWZyZXNoIG9mIGZpbGVzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQ7IGZhbHNlIGJ5IGRlZmF1bHQuCisgICAgICogQHBhcmFtIGZvcmNlIHN5bmMgYWxsIGZpbGVzLCB3aGV0aGVyIHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlIGFscmVhZHkgdXB0b2RhdGUgb3Igbm90LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYSBsYWJlbCBpcyBzZXQgYW5kIGZvcmNlIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZShTdHJpbmcgZm9yY2UpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmb3JjZSA9PSBudWxsICYmICFsYWJlbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlA0U3luYzogSWYgeW91IHdhbnQgdG8gZm9yY2UsIHNldCBmb3JjZSB0byBub24tbnVsbCBzdHJpbmchIik7CisgICAgICAgIH0KKyAgICAgICAgUDRDbWRPcHRzID0gIi1mIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkbyB0aGUgd29yaworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBQZXJmb3JjZSBjb21tYW5kCisgICAgICogYW5kIGZhaWxPbkVycm9yIGlzIHNldCB0byB0cnVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKworICAgICAgICBpZiAoUDRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNDbWQgPSBQNFZpZXc7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChsYWJlbCAhPSBudWxsICYmICFsYWJlbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBzeW5jQ21kID0gc3luY0NtZCArICJAIiArIGxhYmVsOworICAgICAgICB9CisKKworICAgICAgICBsb2coIkV4ZWNpbmcgc3luYyAiICsgUDRDbWRPcHRzICsgIiAiICsgc3luY0NtZCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgZXhlY1A0Q29tbWFuZCgiLXMgc3luYyAiICsgUDRDbWRPcHRzICsgIiAiICsgc3luY0NtZCwgbmV3IFNpbXBsZVA0T3V0cHV0SGFuZGxlcih0aGlzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvU2ltcGxlUDRPdXRwdXRIYW5kbGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9TaW1wbGVQNE91dHB1dEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVhM2NkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvU2ltcGxlUDRPdXRwdXRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworLyoKKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGJhc2VkIHVwb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZQorICogb3JpZ2luYWxseSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywKKyAqIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgUDRIYW5kbGVyQWRhcHRlciB1c2VkIGJ5IHRhc2tzIHdoaWNoIGFyZSBub3QKKyAqIGFjdHVhbGx5IHByb2Nlc3NpbmcgdGhlIG91dHB1dCBmcm9tIFBlcmZvcmNlCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVQNE91dHB1dEhhbmRsZXIgZXh0ZW5kcyBQNEhhbmRsZXJBZGFwdGVyIHsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgUDRCYXNlIHBhcmVudDsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogc2ltcGxlIGNvbnN0cnVjdG9yCisgICAgICogQHBhcmFtIHBhcmVudCAgYSBQNEJhc2UgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU2ltcGxlUDRPdXRwdXRIYW5kbGVyKFA0QmFzZSBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJvY2VzcyBvbmUgbGluZSBvZiBzdGRlcnIvc3Rkb3V0CisgICAgICogaWYgZXJyb3IgY29uZGl0aW9ucyBhcmUgZGV0ZWN0ZWQsIHRoZW4gc2V0dGVycyBhcmUgY2FsbGVkIG9uIHRoZQorICAgICAqIHBhcmVudAorICAgICAqIEBwYXJhbSBsaW5lIGxpbmUgb2Ygb3V0cHV0CisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBkb2VzIG5vdCB0aHJvdyBleGNlcHRpb25zIGFueSBtb3JlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvY2VzcyhTdHJpbmcgbGluZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBhcmVudC51dGlsLm1hdGNoKCIvXmV4aXQvIiwgbGluZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vVGhyb3cgZXhjZXB0aW9uIG9uIGVycm9ycyAoZXhjZXB0IHVwLXRvLWRhdGUpCisgICAgICAgIC8vCisgICAgICAgIC8vV2hlbiBhIHNlcnZlciBpcyBkb3duLCB0aGUgY29kZSBleHBlY3RzIDoKKyAgICAgICAgLy9QZXJmb3JjZSBjbGllbnQgZXJyb3I6CisgICAgICAgIC8vQ29ubmVjdCB0byBzZXJ2ZXIgZmFpbGVkOyBjaGVjayAkUDRQT1JULgorICAgICAgICAvL1RDUCBjb25uZWN0IHRvIGxvY2FsaG9zdDoxNjY2IGZhaWxlZC4KKyAgICAgICAgLy9jb25uZWN0OiBsb2NhbGhvc3Q6MTY2NjogQ29ubmVjdGlvbiByZWZ1c2VkCisgICAgICAgIC8vU29tZSBmb3JtcyBwcm9kdWNpbmcgY29tbWFuZHMgKHA0IC1zIGNoYW5nZSAtbykgZG8gdGFnIHRoZSBvdXRwdXQKKyAgICAgICAgLy9vdGhlcnMgZG9uJ3QuLi4uLgorICAgICAgICAvL090aGVycyBtYXJrIGVycm9ycyBhcyBpbmZvLCBmb3IgZXhhbXBsZSBlZGl0IGEgZmlsZQorICAgICAgICAvL3doaWNoIGlzIGFscmVhZHkgb3BlbiBmb3IgZWRpdC4uLi4uCisgICAgICAgIC8vSnVzdCBsb29rIGZvciBlcnJvcjogLSBjYXRjaGVzIG1vc3QgdGhpbmdzLi4uLgorCisgICAgICAgIGlmIChwYXJlbnQudXRpbC5tYXRjaCgiL15lcnJvcjovIiwgbGluZSkKKyAgICAgICAgICAgIHx8IHBhcmVudC51dGlsLm1hdGNoKCIvXlBlcmZvcmNlIGNsaWVudCBlcnJvcjovIiwgbGluZSkpIHsKKyAgICAgICAgICAgIC8vd2hlbiBydW5uaW5nIGxhYmVsc3luYywgaWYgdmlldyBlbGVtZW50cyBhcmUgaW4gc3luYywKKyAgICAgICAgICAgIC8vUGVyZm9yY2UgcHJvZHVjZXMgYSBsaW5lIG9mIG91dHB1dAorICAgICAgICAgICAgLy9sb29raW5nIGxpa2UgdGhpcyBvbmUgOgorICAgICAgICAgICAgLy9lcnJvcjogLy9kZXBvdC9maWxlMiAtIGxhYmVsIGluIHN5bmMuCisgICAgICAgICAgICBpZiAoIXBhcmVudC51dGlsLm1hdGNoKCIvbGFiZWwgaW4gc3luYy8iLCBsaW5lKQorICAgICAgICAgICAgICAgICYmICFwYXJlbnQudXRpbC5tYXRjaCgiL3VwLXRvLWRhdGUvIiwgbGluZSkpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQuc2V0SW5FcnJvcih0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9zeW5jIHNheXMgImVycm9yOiIgd2hlbiBhIGZpbGUgaXMgdXAtdG8tZGF0ZQorICAgICAgICAgICAgICAgIGxpbmUgPSBwYXJlbnQudXRpbC5zdWJzdGl0dXRlKCJzL15bXjpdKjogLy8iLCBsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQudXRpbC5tYXRjaCgiL15pbmZvLio/Oi8iLCBsaW5lKSkgeworICAgICAgICAgICAgLy9zb21ldGltZXMgdGhlcmUncyAiaW5mbzE6CisgICAgICAgICAgICBsaW5lID0gcGFyZW50LnV0aWwuc3Vic3RpdHV0ZSgicy9eW146XSo6IC8vIiwgbGluZSk7CisgICAgICAgIH0KKyAgICAgICAgcGFyZW50LmxvZyhsaW5lLCBwYXJlbnQuZ2V0SW5FcnJvcigpID8gUHJvamVjdC5NU0dfRVJSIDogUHJvamVjdC5NU0dfSU5GTyk7CisKKyAgICAgICAgaWYgKHBhcmVudC5nZXRJbkVycm9yKCkpIHsKKyAgICAgICAgICAgIHBhcmVudC5zZXRFcnJvck1lc3NhZ2UocGFyZW50LmdldEVycm9yTWVzc2FnZSgpICsgbGluZSArIFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL3BhY2thZ2UuaHRtbCBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWRkOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNDAgQEAKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxib2R5PgorQU5UIFRhc2tzIGZvciBQZXJmb3JjZSBpbnRlZ3JhdGlvbi4KKworVGhlc2UgdGFza3MgcHJvdmlkZSBiYXNpYyBQNCBjYXBhYmlsaXRpZXMgdG8gYXV0b21hdGVkIEFOVC1iYXNlZCBidWlsZCBzeXN0ZW1zLiA8Yj5Ob3RlOjwvYj4KK3RoZSB0YXNrcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBKYWthcnRhIE9STyAyLjAgbGlicmFyeSB3aGljaAorYnJpbmdzIHRoZSBwb3dlciBvZiBQZXJsIDUgcmVndWxhciBleHByZXNzaW9ucyB0byBKYXZhLgorCitUaGVzZSB0YXNrcyBhbHNvIHJlcXVpcmUgeW91IHRvIGhhdmUgdGhlIHA0IChvciBwNC5leGUpIGNsaWVudCBpbiB5b3VyIHBhdGguCisKK0BzZWUgPEEgSFJFRj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50IFByb2plY3Q8L0E+CitAc2VlIDxBIEhSRUY9Imh0dHA6Ly93d3cucGVyZm9yY2UuY29tLyI+UGVyZm9yY2U8L0E+CisKK0BzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRTeW5jCitAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0TGFiZWwKK0BzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRIYXZlCitAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0Q2hhbmdlCitAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0RWRpdAorQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNFN1Ym1pdAorQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNENvdW50ZXIKKworCisKK0BhdXRob3IgPEEgSFJFRj0ibWFpbHRvOmxlc2xpZS5odWdoZXNAcnVidXMuY29tIj5MZXMgSHVnaGVzPC9BPgorPC9ib2R5PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wdmNzL1B2Y3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2NhZTRkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzLmphdmEKQEAgLTAsMCArMSw2NzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucHZjczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ1N0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHVtcFN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICoKKyAqIEV4dHJhY3RzIHRoZSBsYXRlc3QgZWRpdGlvbiBvZiB0aGUgc291cmNlIGNvZGUgZnJvbSBhIFBWQ1MgcmVwb3NpdG9yeS4KKyAqIFBWQ1MgaXMgYSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtCisgKiBkZXZlbG9wZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5tZXJhbnQuY29tL3Byb2R1Y3RzL3B2Y3MiPk1lcmFudDwvYT4uCisgKiA8YnI+CisgKiBCZWZvcmUgdXNpbmcgdGhpcyB0YWcsIHRoZSB1c2VyIHJ1bm5pbmcgYW50IG11c3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGNvbW1hbmRzCisgKiBvZiBQVkNTIChnZXQgYW5kIHBjbGkpIGFuZCBtdXN0IGhhdmUgYWNjZXNzIHRvIHRoZSByZXBvc2l0b3J5LiBOb3RlIHRoYXQgdGhlIHdheSB0byBzcGVjaWZ5CisgKiB0aGUgcmVwb3NpdG9yeSBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQgc28gdXNlIHByb3BlcnR5IHRvIHNwZWNpZnkgbG9jYXRpb24gb2YgcmVwb3NpdG9yeS4KKyAqIDxicj4KKyAqIFRoaXMgdmVyc2lvbiBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zIFBWQ1MgdmVyc2lvbiA2LjUgYW5kIDYuNiB1bmRlciBXaW5kb3dzIGFuZCBTb2xhcmlzLgorCisgKgorICogPGI+MTktMDQtMjAwMTwvYj4gPHA+VGhlIHRhc2sgbm93IGhhcyBhIG1vcmUgcm9idXN0CisgKiBwYXJzZXIuIEl0IGFsbG93cyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRhbnQgZmlsZSBwYXRocworICogYW5kIHN1cHBvcnRzIGZpbGUgbmFtZXMgd2l0aCA8aT4oKTwvaT4uIFRoYW5rcyB0byBFcmlrIEh1c2J5IGZvcgorICogYnJpbmdpbmcgdGhlIGJ1ZyB0byBteSBhdHRlbnRpb24uCisgKgorICogPGI+MjctMDQtMjAwMTwvYj4gPHA+VU5DIHBhdGhzIGFyZSBub3cgaGFuZGxlZCBwcm9wZXJseS4KKyAqIEZpeCBwcm92aWRlZCBieSBEb24gSmVmZmVyeS4gSGUgYWxzbyBhZGRlZCBhbiA8aT5VcGRhdGVPbmx5PC9pPiBmbGFnCisgKiB0aGF0LCB3aGVuIHRydWUsIGNvbmRpdGlvbnMgdGhlIFBWQ1MgZ2V0IHVzaW5nIHRoZSAtVSBvcHRpb24gdG8gb25seQorICogdXBkYXRlIHRob3NlIGZpbGVzIHRoYXQgaGF2ZSBhIG1vZGlmaWNhdGlvbiB0aW1lIChpbiBQVkNTKSB0aGF0IGlzIG5ld2VyCisgKiB0aGFuIHRoZSBleGlzdGluZyB3b3JrZmlsZS4KKyAqCisgKiA8Yj4yNS0xMC0yMDAyPC9iPiA8cD5BZGRlZCBhIHJldmlzaW9uIGF0dHJpYnV0ZSB0aGF0IGN1cnJlbnRseSBpcyBhCisgKiBzeW5vbnltIGZvciBsYWJlbCwgYnV0IGluIGEgZnV0dXJlIHJlbGVhc2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBsYWJlbAorICogYXR0cmlidXRlIHdpbGwgY2hhbmdlIHRvIHVzZSB0aGUgLXYgb3B0aW9uIG9mIEdFVC4gIFNlZSBidWcgIzEzODQ3IGZvcgorICogZGlzY3Vzc2lvbi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQdmNzIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayB7CisgICAgLy8gQ2hlY2tTdHlsZSAtIG1hZ2ljIG51bWJlcnMKKyAgICAvLyBjaGVja2luZyBmb3IgIlg6XCAwPWRxdW90ZSwxPWxldHRlciwyPTosMz1cCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPU18xID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TXzIgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NfMyA9IDM7CisKKyAgICBwcml2YXRlIFN0cmluZyBwdmNzYmluOworICAgIHByaXZhdGUgU3RyaW5nIHJlcG9zaXRvcnk7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHZjc1Byb2plY3Q7CisgICAgcHJpdmF0ZSBWZWN0b3IgcHZjc1Byb2plY3RzOworICAgIHByaXZhdGUgU3RyaW5nIHdvcmtzcGFjZTsKKyAgICBwcml2YXRlIFN0cmluZyBmb3JjZTsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9tb3Rpb25ncm91cDsKKyAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsKKyAgICBwcml2YXRlIFN0cmluZyByZXZpc2lvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlcmM7CisgICAgcHJpdmF0ZSBib29sZWFuIHVwZGF0ZU9ubHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWVGb3JtYXQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbGluZVN0YXJ0OworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJJZDsKKyAgICBwcml2YXRlIFN0cmluZyBjb25maWc7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHRoZSB0aGluZyB0byBleGVjdXRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDTElfRVhFID0gInBjbGkiOworCisgICAgLyoKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIFBDTEkgbGlzdHZlcnNpb25lZGZpbGVzIHJlY3Vyc2l2ZSBpIGEgZm9ybWF0ICJnZXQiIHVuZGVyc3RhbmRzCisgICAgICovCisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDTElfTFZGX0FSR1MgPSAibHZmIC16IC1hdyI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHRoaW5nIHRvIGV4ZWN1dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0VYRSA9ICJnZXQiOworCisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIGNvbW1hbmQuCisgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXQgc3RyZWFtIGhhbmRsZXIgdG8gdXNlLgorICAgICAqIEByZXR1cm4gdGhlIGV4aXQgY29kZSBvZiB0aGUgY29tbWFuZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJ1bkNtZChDb21tYW5kbGluZSBjbWQsIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIG91dCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKKyAgICAgICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUob3V0KTsKKyAgICAgICAgICAgIGV4ZS5zZXRBbnRSdW4oYVByb2opOworICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoYVByb2ouZ2V0QmFzZURpcigpKTsKKyAgICAgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjbWQuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgICAgICByZXR1cm4gZXhlLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjbWQudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICsgIi4gRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEV4ZWN1dGFibGUoU3RyaW5nIGV4ZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgY29ycmVjdGVkRXhlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpZiAoZ2V0UHZjc2JpbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwdmNzYmluLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgICAgIGNvcnJlY3RlZEV4ZS5hcHBlbmQocHZjc2Jpbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvcnJlY3RlZEV4ZS5hcHBlbmQocHZjc2JpbikuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29ycmVjdGVkRXhlLmFwcGVuZChleGUpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGV4Y2VwdGlvbiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBTb21ldGhpbmcgaXMgc3RvcHBpbmcgdGhlIGJ1aWxkLi4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCByZXN1bHQgPSAwOworCisgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwgfHwgcmVwb3NpdG9yeS50cmltKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXF1aXJlZCBhcmd1bWVudCByZXBvc2l0b3J5IG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHdvcmtzcGFjZSBleGlzdHMKKyAgICAgICAgLy8gTGF1bmNoIFBDTEkgbGlzdHZlcnNpb25lZGZpbGVzIC16IC1hdworICAgICAgICAvLyBDYXB0dXJlIG91dHB1dAorICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldEV4ZWN1dGFibGUoUENMSV9FWEUpKTsKKworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJsdmYiKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXoiKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWF3Iik7CisgICAgICAgIGlmIChnZXRXb3Jrc3BhY2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc3AiICsgZ2V0V29ya3NwYWNlKCkpOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1wciIgKyBnZXRSZXBvc2l0b3J5KCkpOworCisgICAgICAgIFN0cmluZyB1aWQgPSBnZXRVc2VySWQoKTsKKworICAgICAgICBpZiAodWlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1pZCIgKyB1aWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVmYXVsdCBwdmNzIHByb2plY3QgaXMgIi8iCisgICAgICAgIGlmIChnZXRQdmNzcHJvamVjdCgpID09IG51bGwgJiYgZ2V0UHZjc3Byb2plY3RzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwdmNzUHJvamVjdCA9ICIvIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRQdmNzcHJvamVjdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0UHZjc3Byb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnZXRQdmNzcHJvamVjdHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRQdmNzcHJvamVjdHMoKS5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSAoKFB2Y3NQcm9qZWN0KSBlLm5leHRFbGVtZW50KCkpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCAocHJvamVjdE5hbWUudHJpbSgpKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibmFtZSBpcyBhIHJlcXVpcmVkIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJvZiBwdmNzcHJvamVjdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHByb2plY3ROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgdG1wID0gbnVsbDsKKyAgICAgICAgRmlsZSB0bXAyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICB0bXAgPSBuZXcgRmlsZSgicHZjc19hbnRfIiArIHJhbmQubmV4dExvbmcoKSArICIubG9nIik7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcCk7CisgICAgICAgICAgICB0bXAyID0gbmV3IEZpbGUoInB2Y3NfYW50XyIgKyByYW5kLm5leHRMb25nKCkgKyAiLmxvZyIpOworICAgICAgICAgICAgbG9nKGNvbW1hbmRMaW5lLmRlc2NyaWJlQ29tbWFuZCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcnVuQ21kKGNvbW1hbmRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHVtcFN0cmVhbUhhbmRsZXIoZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKSkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgIWlnbm9yZXJjKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF0bXAuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvbW11bmljYXRpb24gYmV0d2VlbiBhbnQgYW5kIHB2Y3MgIgorICAgICAgICAgICAgICAgICAgICArICJmYWlsZWQuIE5vIG91dHB1dCBnZW5lcmF0ZWQgZnJvbSBleGVjdXRpbmcgUFZDUyAiCisgICAgICAgICAgICAgICAgICAgICsgImNvbW1hbmRsaW5lIGludGVyZmFjZSBcInBjbGlcIiBhbmQgXCJnZXRcIiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgZm9sZGVycyBpbiB3b3Jrc3BhY2UKKyAgICAgICAgICAgIGxvZygiQ3JlYXRpbmcgZm9sZGVycyIsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgY3JlYXRlRm9sZGVycyh0bXApOworCisgICAgICAgICAgICAvLyBNYXNzYWdlIFBDTEkgbHZmIG91dHB1dCB0cmFuc2Zvcm1pbmcgJ1wnIHRvICcvJyBzbyBnZXQgY29tbWFuZCB3b3JrcyBhcHByb3ByaWF0ZWx5CisgICAgICAgICAgICBtYXNzYWdlUENMSSh0bXAsIHRtcDIpOworCisgICAgICAgICAgICAvLyBMYXVuY2ggZ2V0IG9uIG91dHB1dCBjYXB0dXJlZCBmcm9tIFBDTEkgbHZmCisgICAgICAgICAgICBjb21tYW5kTGluZS5jbGVhckFyZ3MoKTsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0RXhlY3V0YWJsZShHRVRfRVhFKSk7CisKKyAgICAgICAgICAgIGlmIChnZXRDb25maWcoKSAhPSBudWxsICYmIGdldENvbmZpZygpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jIiArIGdldENvbmZpZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGdldEZvcmNlKCkgIT0gbnVsbCAmJiBnZXRGb3JjZSgpLmVxdWFscygieWVzIikpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItWSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItTiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZ2V0UHJvbW90aW9uZ3JvdXAoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLUciCisgICAgICAgICAgICAgICAgICAgICsgZ2V0UHJvbW90aW9uZ3JvdXAoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChnZXRMYWJlbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXYiICsgZ2V0TGFiZWwoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFJldmlzaW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRSZXZpc2lvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVwZGF0ZU9ubHkpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItVSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJAIiArIHRtcDIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgbG9nKCJHZXR0aW5nIGZpbGVzIiwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICBsb2coIkV4ZWN1dGluZyAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXN1bHQgPSBydW5DbWQoY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgbmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywgUHJvamVjdC5NU0dfSU5GTywgUHJvamVjdC5NU0dfV0FSTikpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAwICYmICFpZ25vcmVyYykgeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLiBSZXR1cm4gY29kZSB3YXMgIiArIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICsgIi4gRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICsgIi4gRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICsgIi4gRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRtcC5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0bXAyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0bXAyLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBmaWxlIGFuZCBjcmVhdGVzIHRoZSBmb2xkZXJzIHNwZWNpZmllZCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlRm9sZGVycyhGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisgICAgICAgICAgICBNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoZ2V0RmlsZW5hbWVGb3JtYXQoKSk7CisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGluLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJDb25zaWRlcmluZyBcIiIgKyBsaW5lICsgIlwiIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiXCJcXCIpICAgIC8vIENoZWNraW5nIGZvciAiXAorICAgICAgICAgICAgICAgICAgICB8fCBsaW5lLnN0YXJ0c1dpdGgoIlwiLyIpICAvLyBvciAgICAgICAgICAgIi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgICAgICAgICAgICJYOlwuLi4KKyAgICAgICAgICAgICAgICAgICB8fCAobGluZS5sZW5ndGgoKSA+IFBPU18zICYmIGxpbmUuc3RhcnRzV2l0aCgiXCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKGxpbmUuY2hhckF0KFBPU18xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIFN0cmluZy52YWx1ZU9mKGxpbmUuY2hhckF0KFBPU18yKSkuZXF1YWxzKCI6IikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIFN0cmluZy52YWx1ZU9mKGxpbmUuY2hhckF0KFBPU18zKSkuZXF1YWxzKCJcXCIpKSkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBvYmpzID0gbWYucGFyc2UobGluZSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmID0gKFN0cmluZykgb2Jqc1sxXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGZyb20gdGhlIGZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGYubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShmLnN1YnN0cmluZygwLCBpbmRleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkNyZWF0aW5nICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIubWtkaXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJDcmVhdGVkICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkZhaWxlZCB0byBjcmVhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGV4aXN0cy4gU2tpcHBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRmlsZSBzZXBhcmF0b3IgcHJvYmxlbSB3aXRoICIgKyBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGVkIFwiIiArIGxpbmUgKyAiXCIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZSA9IGluLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNpbXBsZSBoYWNrIHRvIGhhbmRsZSB0aGUgUFZDUyBjb21tYW5kLWxpbmUgdG9vbHMgYm90Y2ggd2hlbgorICAgICAqIGhhbmRsaW5nIFVOQyBub3RhdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtYXNzYWdlUENMSShGaWxlIGluLCBGaWxlIG91dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5SZWFkZXIgPSBudWxsOworICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXRXcml0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaW4pKTsKKyAgICAgICAgICAgIG91dFdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihvdXQpKTsKKyAgICAgICAgICAgIFN0cmluZyBzID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlICgocyA9IGluUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc05vcm1hbCA9IHMucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICAgICAgICAgIG91dFdyaXRlci53cml0ZShzTm9ybWFsKTsKKyAgICAgICAgICAgICAgICBvdXRXcml0ZXIubmV3TGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGluUmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpblJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dFdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0V3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbmV0d29yayBuYW1lIG9mIHRoZSBQVkNTIHJlcG9zaXRvcnkKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoZSBmaWxlbmFtZUZvcm1hdCBhdHRyaWJ1dGUgZGVmaW5lcyBhIE1lc3NhZ2VGb3JtYXQgc3RyaW5nIHVzZWQKKyAgICAgKiAgdG8gcGFyc2UgdGhlIG91dHB1dCBvZiB0aGUgcGNsaSBjb21tYW5kLiAgSXQgZGVmYXVsdHMgdG8KKyAgICAgKiAgPGNvZGU+ezB9LWFyYyh7MX0pPC9jb2RlPi4gIFJlcG9zaXRvcmllcyB3aGVyZSB0aGUgYXJjaGl2ZQorICAgICAqICAgZXh0ZW5zaW9uIGlzIG5vdCAgLWFyYyBzaG91bGQgc2V0IHRoaXMuCisgICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUgZm9ybWF0IGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lRm9ybWF0KCkgeworICAgICAgICByZXR1cm4gZmlsZW5hbWVGb3JtYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdCBvZiB0aGUgZm9sZGVyIG5hbWVzOyBvcHRpb25hbC4KKyAgICAgKiBUaGlzIG11c3QgYmUgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yCisgICAgICogPGNvZGU+amF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ8L2NvZGU+LgorICAgICAqICBJbmRleCAxIG9mIHRoZSBmb3JtYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBmaWxlIG5hbWUuCisgICAgICogIERlZmF1bHRzIHRvIDxjb2RlPnswfS1hcmMoezF9KTwvY29kZT4KKyAgICAgKiBAcGFyYW0gZiB0aGUgZm9ybWF0IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZUZvcm1hdChTdHJpbmcgZikgeworICAgICAgICBmaWxlbmFtZUZvcm1hdCA9IGY7CisgICAgfQorCisgICAgLyoqCisKKyAgICAgKiBUaGUgbGluZVN0YXJ0IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHBhcnNlIHRoZSBvdXRwdXQgb2YgdGhlIHBjbGkKKyAgICAgKiBjb21tYW5kLiBJdCBkZWZhdWx0cyB0byA8Y29kZT4mcXVvdDtQOjwvY29kZT4uICBUaGUgcGFyc2VyIGFscmVhZHkKKyAgICAgKiBrbm93cyBhYm91dCAvIGFuZCBcXCwgdGhpcyBwcm9wZXJ0eSBpcyB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgdGhlCisgICAgICogcmVwb3NpdG9yeSBpcyBhY2Nlc3NlZCBvbiBhIFdpbmRvd3MgcGxhdGZvcm0gdmlhIGEgZHJpdmUgbGV0dGVyCisgICAgICogbWFwcGluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaW5lU3RhcnQgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluZVN0YXJ0KCkgeworICAgICAgICByZXR1cm4gbGluZVN0YXJ0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoYXQgYSB2YWxpZCByZXR1cm4gdmFsdWUgZnJvbSBQVkNTIGxvb2tzIGxpa2UKKyAgICAgKiAgd2hlbiBpdCBkZXNjcmliZXMgYSBmaWxlLiAgRGVmYXVsdHMgdG8gPGNvZGU+JnF1b3Q7UDo8L2NvZGU+LgorICAgICAqIElmIHlvdSBhcmUgbm90IHVzaW5nIGFuIFVOQyBuYW1lIGZvciB5b3VyIHJlcG9zaXRvcnkgYW5kIHRoZQorICAgICAqIGRyaXZlIGxldHRlciA8Y29kZT5QPC9jb2RlPiBpcyBpbmNvcnJlY3QgZm9yIHlvdXIgc2V0dXAsIHlvdSBtYXkKKyAgICAgKiBuZWVkIHRvIGNoYW5nZSB0aGlzIHZhbHVlLCBVTkMgbmFtZXMgd2lsbCBhbHdheXMgYmUKKyAgICAgKiBhY2NlcHRlZC4KKyAgICAgKiBAcGFyYW0gbCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpbmVTdGFydChTdHJpbmcgbCkgeworICAgICAgICBsaW5lU3RhcnQgPSBsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuZXR3b3JrIG5hbWUgb2YgdGhlIFBWQ1MgcmVwb3NpdG9yeTsgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIHJlcG8gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeShTdHJpbmcgcmVwbykgeworICAgICAgICByZXBvc2l0b3J5ID0gcmVwbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbmFtZSBvZiB0aGUgcHJvamVjdCBpbiB0aGUgUFZDUyByZXBvc2l0b3J5CisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFB2Y3Nwcm9qZWN0KCkgeworICAgICAgICByZXR1cm4gcHZjc1Byb2plY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHByb2plY3Qgd2l0aGluIHRoZSBQVkNTIHJlcG9zaXRvcnkgdG8gZXh0cmFjdCBmaWxlcyBmcm9tOworICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0ICZxdW90Oy8mcXVvdDsKKyAgICAgKiBAcGFyYW0gcHJqIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFB2Y3Nwcm9qZWN0KFN0cmluZyBwcmopIHsKKyAgICAgICAgcHZjc1Byb2plY3QgPSBwcmo7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG5hbWUgb2YgdGhlIHByb2plY3QgaW4gdGhlIFBWQ1MgcmVwb3NpdG9yeQorICAgICAqIEByZXR1cm4gVmVjdG9yCisgICAgICovCisgICAgcHVibGljIFZlY3RvciBnZXRQdmNzcHJvamVjdHMoKSB7CisgICAgICAgIHJldHVybiBwdmNzUHJvamVjdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG5hbWUgb2YgdGhlIHdvcmtzcGFjZSB0byBzdG9yZSB0aGUgcmV0cmlldmVkIGZpbGVzCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdvcmtzcGFjZSgpIHsKKyAgICAgICAgcmV0dXJuIHdvcmtzcGFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXb3Jrc3BhY2UgdG8gdXNlOyBvcHRpb25hbC4KKyAgICAgKiBCeSBzcGVjaWZ5aW5nIGEgd29ya3NwYWNlLCB0aGUgZmlsZXMgYXJlIGV4dHJhY3RlZCB0byB0aGF0IGxvY2F0aW9uLgorICAgICAqIEEgUFZDUyB3b3Jrc3BhY2UgaXMgYSBuYW1lIGZvciBhIGxvY2F0aW9uIG9mIHRoZSB3b3JrZmlsZXMgYW5kCisgICAgICogaXNuJ3QgYXMgc3VjaCB0aGUgbG9jYXRpb24gaXRzZWxmLgorICAgICAqIFlvdSBkZWZpbmUgdGhlIGxvY2F0aW9uIGZvciBhIHdvcmtzcGFjZSB1c2luZyB0aGUgUFZDUyBHVUkgY2xpZW50cy4KKyAgICAgKiBJZiB0aGlzIGlzbid0IHNwZWNpZmllZCB0aGUgZGVmYXVsdCB3b3Jrc3BhY2UgZm9yIHRoZSBjdXJyZW50IHVzZXIgaXMgdXNlZC4KKyAgICAgKiBAcGFyYW0gd3MgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V29ya3NwYWNlKFN0cmluZyB3cykgeworICAgICAgICB3b3Jrc3BhY2UgPSB3czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbmFtZSBvZiB0aGUgUFZDUyBiaW4gZGlyZWN0b3J5CisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFB2Y3NiaW4oKSB7CisgICAgICAgIHJldHVybiBwdmNzYmluOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIFBWQ1MgYmluIGRpcmVjdG9yeTsgb3B0aW9uYWwgaWYgb24gdGhlIFBBVEguCisgICAgICogT24gc29tZSBzeXN0ZW1zIHRoZSBQVkNTIGV4ZWN1dGFibGVzIDxpPnBjbGk8L2k+CisgICAgICogYW5kIDxpPmdldDwvaT4gYXJlIG5vdCBmb3VuZCBpbiB0aGUgUEFUSC4gSW4gc3VjaCBjYXNlcyB0aGlzIGF0dHJpYnV0ZQorICAgICAqIHNob3VsZCBiZSBzZXQgdG8gdGhlIGJpbiBkaXJlY3Rvcnkgb2YgdGhlIFBWQ1MgaW5zdGFsbGF0aW9uIGNvbnRhaW5pbmcKKyAgICAgKiB0aGUgZXhlY3V0YWJsZXMgbWVudGlvbmVkIGJlZm9yZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXNuJ3Qgc3BlY2lmaWVkIHRoZQorICAgICAqIHRhZyBleHBlY3RzIHRoZSBleGVjdXRhYmxlcyB0byBiZSBmb3VuZCB1c2luZyB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgKiBAcGFyYW0gYmluIFBWQ1MgYmluIGRpcmVjdG9yeQorICAgICAqIEB0b2RvIHVzZSBhIEZpbGUgc2V0dGVyIGFuZCByZXNvbHZlIHBhdGhzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFB2Y3NiaW4oU3RyaW5nIGJpbikgeworICAgICAgICBwdmNzYmluID0gYmluOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB2YWx1ZSBvZiBmb3JjZQorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGb3JjZSgpIHsKKyAgICAgICAgcmV0dXJuIGZvcmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgb2YgdGhlIGZvcmNlIGFyZ3VtZW50OyBvcHRpb25hbC4KKyAgICAgKiBJZiBzZXQgdG8gPGk+eWVzPC9pPiBhbGwgZmlsZXMgdGhhdCBleGlzdHMgYW5kIGFyZQorICAgICAqIHdyaXRhYmxlIGFyZSBvdmVyd3JpdHRlbi4gRGVmYXVsdCA8aT5ubzwvaT4gY2F1c2VzIHRoZSBmaWxlcworICAgICAqIHRoYXQgYXJlIHdyaXRhYmxlIHRvIGJlIGlnbm9yZWQuIFRoaXMgc3RvcHMgdGhlIFBWQ1MgY29tbWFuZAorICAgICAqIDxpPmdldDwvaT4gdG8gc3RvcCBhc2tpbmcgcXVlc3Rpb25zIQorICAgICAqIEB0b2RvIG1ha2UgYSBib29sZWFuIHNldHRlcgorICAgICAqIEBwYXJhbSBmIFN0cmluZyAoeWVzL25vKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlKFN0cmluZyBmKSB7CisgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5lcXVhbHNJZ25vcmVDYXNlKCJ5ZXMiKSkgeworICAgICAgICAgICAgZm9yY2UgPSAieWVzIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcmNlID0gIm5vIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB2YWx1ZSBvZiBwcm9tb3Rpb25ncm91cAorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9tb3Rpb25ncm91cCgpIHsKKyAgICAgICAgcmV0dXJuIHByb21vdGlvbmdyb3VwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJvbW90aW9uZ3JvdXAgYXJndW1lbnQKKyAgICAgKiBAcGFyYW0gdyBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9tb3Rpb25ncm91cChTdHJpbmcgdykgeworICAgICAgICBwcm9tb3Rpb25ncm91cCA9IHc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHZhbHVlIG9mIGxhYmVsCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogT25seSBmaWxlcyBtYXJrZWQgd2l0aCB0aGlzIGxhYmVsIGFyZSBleHRyYWN0ZWQ7IG9wdGlvbmFsLgorICAgICAqIEBwYXJhbSBsIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsKSB7CisgICAgICAgIGxhYmVsID0gbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdmFsdWUgb2YgcmV2aXNpb24KKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmV2aXNpb24oKSB7CisgICAgICAgIHJldHVybiByZXZpc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmx5IGZpbGVzIHdpdGggdGhpcyByZXZpc2lvbiBhcmUgZXh0cmFjdDsgb3B0aW9uYWwuCisgICAgICogQHBhcmFtIHIgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV2aXNpb24oU3RyaW5nIHIpIHsKKyAgICAgICAgcmV2aXNpb24gPSByOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB2YWx1ZSBvZiBpZ25vcmVyZXR1cm5jb2RlCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJZ25vcmVSZXR1cm5Db2RlKCkgeworICAgICAgICByZXR1cm4gaWdub3JlcmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgc2V0IHRvIHRydWUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGV4ZWN1dGluZyB0aGUgcHZjcworICAgICAqIGNvbW1hbmRzIGFyZSBpZ25vcmVkOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KKyAgICAgKiBAcGFyYW0gYiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZVJldHVybkNvZGUoYm9vbGVhbiBiKSB7CisgICAgICAgIGlnbm9yZXJjID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZ5IGEgcHJvamVjdCB3aXRoaW4gdGhlIFBWQ1MgcmVwb3NpdG9yeSB0byBleHRyYWN0IGZpbGVzIGZyb20uCisgICAgICogQHBhcmFtIHAgdGhlIHB2Y3MgcHJvamVjdCB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHZjc3Byb2plY3QoUHZjc1Byb2plY3QgcCkgeworICAgICAgICBwdmNzUHJvamVjdHMuYWRkRWxlbWVudChwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIHVwZGF0ZU9ubHkgYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZU9ubHkgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFVwZGF0ZU9ubHkoKSB7CisgICAgICAgIHJldHVybiB1cGRhdGVPbmx5OworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHNldCB0byA8aT50cnVlPC9pPiBmaWxlcyBhcmUgZmV0Y2hlZCBvbmx5IGlmCisgICAgICogbmV3ZXIgdGhhbiBleGlzdGluZyBsb2NhbCBmaWxlczsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICogQHBhcmFtIGwgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcGRhdGVPbmx5KGJvb2xlYW4gbCkgeworICAgICAgICB1cGRhdGVPbmx5ID0gbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gYmUgdXNlZAorICAgICAqIEByZXR1cm4gdGhlIHBhdGggb2YgdGhlIGNvbmZpZyBmaWxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWcoKSB7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IHRvIGJlIHVzZWQuCisgICAgICogVGhlc2UgZmlsZXMgaGF2ZSBhIC5jZmcgZXh0ZW5zaW9uIGFuZCBhcmUgb2Z0ZW4gZm91bmQgaW4gYXJjaGl2ZSBvciBwdmNzcHJvcCBmb2xkZXJzLgorICAgICAqIEBwYXJhbSBmIGNvbmZpZyBmaWxlIC0gY2FuIGJlIGdpdmVuIGFic29sdXRlIG9yIHJlbGF0aXZlIHRvIGFudCBiYXNlZGlyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnKEZpbGUgZikgeworICAgICAgICBjb25maWcgPSBmLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVzZXJpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VyaWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VySWQoKSB7CisgICAgICAgIHJldHVybiB1c2VySWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlciBJRAorICAgICAqIEBwYXJhbSB1IHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcklkKFN0cmluZyB1KSB7CisgICAgICAgIHVzZXJJZCA9IHU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFB2Y3Mgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIFB2Y3MoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHB2Y3NQcm9qZWN0ID0gbnVsbDsKKyAgICAgICAgcHZjc1Byb2plY3RzID0gbmV3IFZlY3RvcigpOworICAgICAgICB3b3Jrc3BhY2UgPSBudWxsOworICAgICAgICByZXBvc2l0b3J5ID0gbnVsbDsKKyAgICAgICAgcHZjc2JpbiA9IG51bGw7CisgICAgICAgIGZvcmNlID0gbnVsbDsKKyAgICAgICAgcHJvbW90aW9uZ3JvdXAgPSBudWxsOworICAgICAgICBsYWJlbCA9IG51bGw7CisgICAgICAgIGlnbm9yZXJjID0gZmFsc2U7CisgICAgICAgIHVwZGF0ZU9ubHkgPSBmYWxzZTsKKyAgICAgICAgbGluZVN0YXJ0ID0gIlwiUDoiOworICAgICAgICBmaWxlbmFtZUZvcm1hdCA9ICJ7MH0tYXJjKHsxfSkiOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzUHJvamVjdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzUHJvamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzZhMmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wdmNzL1B2Y3NQcm9qZWN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnB2Y3M7CisKKworCisvKioKKyAqIHJlcHJlc2VudHMgYSBwcm9qZWN0IHdpdGhpbiB0aGUgUFZDUyByZXBvc2l0b3J5IHRvIGV4dHJhY3QgZmlsZXMgZnJvbS4KKyAqLworcHVibGljIGNsYXNzIFB2Y3NQcm9qZWN0IHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgLyoqIG5vIGFyZyBjb25zdHJ1Y3RvciAqLworICAgIHB1YmxpYyBQdmNzUHJvamVjdCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgUHZjc1Byb2plY3QudGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L1NjcmlwdERlZi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L1NjcmlwdERlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiM2YyOGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvU2NyaXB0RGVmLmphdmEKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2NyaXB0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50VHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQ29tcG9uZW50SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5EZWZCYXNlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5DbGFzc3BhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlNjcmlwdFJ1bm5lckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TY3JpcHRSdW5uZXJIZWxwZXI7CisKKy8qKgorICogRGVmaW5lIGEgdGFzayB1c2luZyBhIHNjcmlwdAorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHREZWYgZXh0ZW5kcyBEZWZCYXNlIHsKKyAgICAvKioKKyAgICAgKiBzY3JpcHQgcnVubmVyIGhlbHBlcgorICAgICAqLworICAgIHByaXZhdGUgU2NyaXB0UnVubmVySGVscGVyIGhlbHBlciA9IG5ldyBTY3JpcHRSdW5uZXJIZWxwZXIoKTsKKyAgICAvKioKKyAgICAgKiBzY3JpcHQgcnVubmVyLgorICAgICAqLworICAgIC8qKiBVc2VkIHRvIHJ1biB0aGUgc2NyaXB0ICovCisgICAgcHJpdmF0ZSBTY3JpcHRSdW5uZXJCYXNlICAgcnVubmVyID0gbnVsbDsKKworICAgIC8qKiB0aGUgbmFtZSBieSB3aGljaCB0aGlzIHNjcmlwdCB3aWxsIGJlIGFjdGl2YXRlZCAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAvKiogQXR0cmlidXRlcyBkZWZpbml0aW9ucyBvZiB0aGlzIHNjcmlwdCAqLworICAgIHByaXZhdGUgTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqIE5lc3RlZCBFbGVtZW50IGRlZmluaXRpb25zIG9mIHRoaXMgc2NyaXB0ICovCisgICAgcHJpdmF0ZSBMaXN0IG5lc3RlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqIFRoZSBhdHRyaWJ1dGUgbmFtZXMgYXMgYSBzZXQgKi8KKyAgICBwcml2YXRlIFNldCBhdHRyaWJ1dGVTZXQ7CisKKyAgICAvKiogVGhlIG5lc3RlZCBlbGVtZW50IGRlZmluaXRpb25zIGluZGV4ZWQgYnkgdGhlaXIgbmFtZXMgKi8KKyAgICBwcml2YXRlIE1hcCBuZXN0ZWRFbGVtZW50TWFwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9qZWN0LgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRoYXQgdGhpcyBkZWYgYmVsb3dzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHN1cGVyLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIGhlbHBlci5zZXRQcm9qZWN0Q29tcG9uZW50KHRoaXMpOworICAgICAgICBoZWxwZXIuc2V0U2V0QmVhbnMoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGlzIHNjcmlwdCB3aWxsIGJlIGFjdGl2YXRlZCBpbiBhIGJ1aWxkCisgICAgICogZmlsZQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHNjcmlwdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFzayBzdXBwb3J0cyBhIGdpdmVuIGF0dHJpYnV0ZSBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBzY3JpcHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTdXBwb3J0ZWQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVNldC5jb250YWlucyhhdHRyaWJ1dGVOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gYXR0cmlidXRlIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKiBUaGUgYXR0cmlidXRlIG5hbWUgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBhdHRyaWJ1dGUgbmFtZQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiB0byB0aGlzIHNjcmlwdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgbmVzdGVkIGVsZW1lbnQgZGVmaW5pdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmVzdGVkRWxlbWVudCB7CisgICAgICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgbmVzZXRlZCBlbGVtZW50ICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgLyoqIFRoZSBBbnQgdHlwZSB0byB3aGljaCB0aGlzIG5lc3RlZCBlbGVtZW50IGNvcnJlc3BvbmRzLiAqLworICAgICAgICBwcml2YXRlIFN0cmluZyB0eXBlOworCisgICAgICAgIC8qKiBUaGUgY2xhc3MgdG8gYmUgY3JlYXRlZCBmb3IgdGhpcyBuZXN0ZWQgZWxlbWVudCAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNldCB0aGUgdGFnIG5hbWUgZm9yIHRoaXMgbmVzdGVkIGVsZW1lbnQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhpcyBuZXN0ZWQgZWxlbWVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgdHlwZSBvZiB0aGlzIGVsZW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgYW4KKyAgICAgICAgICogQW50IHRhc2sgb3IgdHlwZSB3aGljaCBpcyB0byBiZSB1c2VkIHdoZW4gdGhpcyBlbGVtZW50IGlzIHRvIGJlCisgICAgICAgICAqIGNyZWF0ZWQuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyB0aGUgY2xhc3MgbmFtZSBkaXJlY3RseQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbmFtZSBvZiBhbiBBbnQgdHlwZSwgb3IgdGFzaywgdG8gdXNlIGZvciB0aGlzIG5lc3RlZAorICAgICAgICAgKiBlbGVtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGNsYXNzbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgdXNlZCBmb3IgdGhlIG5lc3RlZCBlbGVtZW50LgorICAgICAgICAgKiBUaGlzIHNwZWNpZmllcyB0aGUgY2xhc3MgZGlyZWN0bHkgYW5kIGlzIGFuIGFsdGVybmF0aXZlIHRvIHNwZWNpZnlpbmcKKyAgICAgICAgICogdGhlIEFudCB0eXBlIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHVzZSBmb3IgdGhpcyBuZXN0ZWQKKyAgICAgICAgICogZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5lc3RlZCBlbGVtZW50IGRlZmluaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmVzdGVkRWxlbWVudCB0aGUgbmVzdGVkIGVsZW1lbnQgZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KE5lc3RlZEVsZW1lbnQgbmVzdGVkRWxlbWVudCkgeworICAgICAgICBuZXN0ZWRFbGVtZW50cy5hZGQobmVzdGVkRWxlbWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lIHRoZSBzY3JpcHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzY3JpcHRkZWYgcmVxdWlyZXMgYSBuYW1lIGF0dHJpYnV0ZSB0byAiCisgICAgICAgICAgICAgICAgKyAibmFtZSB0aGUgc2NyaXB0Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGVscGVyLmdldExhbmd1YWdlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCI8c2NyaXB0ZGVmPiByZXF1aXJlcyBhIGxhbmd1YWdlIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICAgICAgKyAidG8gc3BlY2lmeSB0aGUgc2NyaXB0IGxhbmd1YWdlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiBuZWVkIHRvIHNldCB0aGUgbG9hZGVyCisgICAgICAgIGlmIChnZXRBbnRsaWJDbGFzc0xvYWRlcigpICE9IG51bGwgfHwgaGFzQ3BEZWxlZ2F0ZSgpKSB7CisgICAgICAgICAgICBoZWxwZXIuc2V0Q2xhc3NMb2FkZXIoY3JlYXRlTG9hZGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IGNyZWF0ZSB0aGUgc2NyaXB0UnVubmVyCisgICAgICAgIHJ1bm5lciA9IGhlbHBlci5nZXRTY3JpcHRSdW5uZXIoKTsKKworICAgICAgICBhdHRyaWJ1dGVTZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGUpIGkubmV4dCgpOworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5uYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNjcmlwdGRlZiA8YXR0cmlidXRlPiBlbGVtZW50cyAiCisgICAgICAgICAgICAgICAgICAgICsgIm11c3Qgc3BlY2lmeSBhbiBhdHRyaWJ1dGUgbmFtZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXR0cmlidXRlU2V0LmNvbnRhaW5zKGF0dHJpYnV0ZS5uYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic2NyaXB0ZGVmIDwiICsgbmFtZSArICI+IGRlY2xhcmVzICIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhlICIgKyBhdHRyaWJ1dGUubmFtZSArICIgYXR0cmlidXRlIG1vcmUgdGhhbiBvbmNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyaWJ1dGVTZXQuYWRkKGF0dHJpYnV0ZS5uYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIG5lc3RlZEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXN0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE5lc3RlZEVsZW1lbnQgbmVzdGVkRWxlbWVudCA9IChOZXN0ZWRFbGVtZW50KSBpLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChuZXN0ZWRFbGVtZW50Lm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic2NyaXB0ZGVmIDxlbGVtZW50PiBlbGVtZW50cyAiCisgICAgICAgICAgICAgICAgICAgICsgIm11c3Qgc3BlY2lmeSBhbiBlbGVtZW50IG5hbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXN0ZWRFbGVtZW50TWFwLmNvbnRhaW5zS2V5KG5lc3RlZEVsZW1lbnQubmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNjcmlwdGRlZiA8IiArIG5hbWUgKyAiPiBkZWNsYXJlcyAiCisgICAgICAgICAgICAgICAgICAgICsgInRoZSAiICsgbmVzdGVkRWxlbWVudC5uYW1lICsgIiBuZXN0ZWQgZWxlbWVudCBtb3JlICIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhhbiBvbmNlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZXN0ZWRFbGVtZW50LmNsYXNzTmFtZSA9PSBudWxsCisgICAgICAgICAgICAgICAgJiYgbmVzdGVkRWxlbWVudC50eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNjcmlwdGRlZiA8ZWxlbWVudD4gZWxlbWVudHMgIgorICAgICAgICAgICAgICAgICAgICArICJtdXN0IHNwZWNpZnkgZWl0aGVyIGEgY2xhc3NuYW1lIG9yIHR5cGUgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmVzdGVkRWxlbWVudC5jbGFzc05hbWUgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG5lc3RlZEVsZW1lbnQudHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzY3JpcHRkZWYgPGVsZW1lbnQ+IGVsZW1lbnRzICIKKyAgICAgICAgICAgICAgICAgICAgKyAibXVzdCBzcGVjaWZ5IG9ubHkgb25lIG9mIHRoZSBjbGFzc25hbWUgYW5kIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICArICJhdHRyaWJ1dGVzIik7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgbmVzdGVkRWxlbWVudE1hcC5wdXQobmVzdGVkRWxlbWVudC5uYW1lLCBuZXN0ZWRFbGVtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpbmQgdGhlIHNjcmlwdCByZXBvc2l0b3J5IC0gaXQgaXMgc3RvcmVkIGluIHRoZSBwcm9qZWN0CisgICAgICAgIE1hcCBzY3JpcHRSZXBvc2l0b3J5ID0gbG9va3VwU2NyaXB0UmVwb3NpdG9yeSgpOworICAgICAgICBuYW1lID0gUHJvamVjdEhlbHBlci5nZW5Db21wb25lbnROYW1lKGdldFVSSSgpLCBuYW1lKTsKKyAgICAgICAgc2NyaXB0UmVwb3NpdG9yeS5wdXQobmFtZSwgdGhpcyk7CisgICAgICAgIEFudFR5cGVEZWZpbml0aW9uIGRlZiA9IG5ldyBBbnRUeXBlRGVmaW5pdGlvbigpOworICAgICAgICBkZWYuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgZGVmLnNldENsYXNzKFNjcmlwdERlZkJhc2UuY2xhc3MpOworICAgICAgICBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpKS5hZGREYXRhVHlwZURlZmluaXRpb24oZGVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIG9yIGNyZWF0ZSB0aGUgc2NyaXB0IHJlcG9zaXRvcnkgLSBpdCBpcyBzdG9yZWQgaW4gdGhlIHByb2plY3QuCisgICAgICogVGhpcyBtZXRob2QgaXMgc3luY2hyb25pemVkIG9uIHRoZSBwcm9qZWN0IHVuZGVyIHtAbGluayBNYWdpY05hbWVzI1NDUklQVF9SRVBPU0lUT1JZfQorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2NyaXB0IHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCBhcyBhIHJlZnJlbmNlLgorICAgICAqLworICAgIHByaXZhdGUgTWFwIGxvb2t1cFNjcmlwdFJlcG9zaXRvcnkoKSB7CisgICAgICAgIE1hcCBzY3JpcHRSZXBvc2l0b3J5ID0gbnVsbDsKKyAgICAgICAgUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHApIHsKKyAgICAgICAgICAgIHNjcmlwdFJlcG9zaXRvcnkgPQorICAgICAgICAgICAgICAgICAgICAoTWFwKSBwLmdldFJlZmVyZW5jZShNYWdpY05hbWVzLlNDUklQVF9SRVBPU0lUT1JZKTsKKyAgICAgICAgICAgIGlmIChzY3JpcHRSZXBvc2l0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRSZXBvc2l0b3J5ID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICBwLmFkZFJlZmVyZW5jZShNYWdpY05hbWVzLlNDUklQVF9SRVBPU0lUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0UmVwb3NpdG9yeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNjcmlwdFJlcG9zaXRvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmVzdGVkIGVsZW1lbnQgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIGVsZW1lbnQuCisgICAgICogQHJldHVybiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjcmVhdGVOZXN0ZWRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSkgeworICAgICAgICBOZXN0ZWRFbGVtZW50IGRlZmluaXRpb24KKyAgICAgICAgICAgID0gKE5lc3RlZEVsZW1lbnQpIG5lc3RlZEVsZW1lbnRNYXAuZ2V0KGVsZW1lbnROYW1lKTsKKyAgICAgICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCI8IiArIG5hbWUgKyAiPiBkb2VzIG5vdCBzdXBwb3J0ICIKKyAgICAgICAgICAgICAgICArICJ0aGUgPCIgKyBlbGVtZW50TmFtZSArICI+IG5lc3RlZCBlbGVtZW50Iik7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgaW5zdGFuY2UgPSBudWxsOworICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gZGVmaW5pdGlvbi5jbGFzc05hbWU7CisgICAgICAgIGlmIChjbGFzc25hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaW5zdGFuY2UgPSBnZXRQcm9qZWN0KCkuY3JlYXRlVGFzayhkZWZpbml0aW9uLnR5cGUpOworICAgICAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGdldFByb2plY3QoKS5jcmVhdGVEYXRhVHlwZShkZWZpbml0aW9uLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIC8vIHRyeSB0aGUgY29udGV4dCBjbGFzc2xvYWRlcgorICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyCisgICAgICAgICAgICAgICAgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGNyZWF0ZUxvYWRlcigpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NuYW1lLCBsb2FkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NuYW1lLCBTY3JpcHREZWYuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXRQcm9qZWN0UmVmZXJlbmNlKGluc3RhbmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIjwiICsgbmFtZSArICI+IGlzIHVuYWJsZSB0byBjcmVhdGUgIgorICAgICAgICAgICAgICAgICsgInRoZSA8IiArIGVsZW1lbnROYW1lICsgIj4gbmVzdGVkIGVsZW1lbnQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc2NyaXB0LgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgY29sbGVjdGlvbiBvZiBhdHRyaWJ1dGVzCisgICAgICogQHBhcmFtIGVsZW1lbnRzIGEgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudCB2YWx1ZXMuCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgorICAgICAqICAgICAgICAgICAgIFVzZSBleGVjdXRlU2NyaXB0KGF0dHJpYnV0ZSwgZWxlbWVudHMsIGluc3RhbmNlKSBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVTY3JpcHQoTWFwIGF0dHJpYnV0ZXMsIE1hcCBlbGVtZW50cykgeworICAgICAgICBleGVjdXRlU2NyaXB0KGF0dHJpYnV0ZXMsIGVsZW1lbnRzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBzY3JpcHQuCisgICAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHNjcmlwdCBpbnN0YW5jZSB0byBleGVjdXRlIHRoZSBzY3JpcHQgZm9yIHRoaXMKKyAgICAgKiBkZWZpbml0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgY29sbGVjdGlvbiBvZiBhdHRyaWJ1dGVzCisgICAgICogQHBhcmFtIGVsZW1lbnRzICAgYSBsaXN0IG9mIG5lc3RlZCBlbGVtZW50IHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gaW5zdGFuY2UgICB0aGUgc2NyaXB0IGluc3RhbmNlOyBjYW4gYmUgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVTY3JpcHQoTWFwIGF0dHJpYnV0ZXMsIE1hcCBlbGVtZW50cywgU2NyaXB0RGVmQmFzZSBpbnN0YW5jZSkgeworICAgICAgICBydW5uZXIuYWRkQmVhbigiYXR0cmlidXRlcyIsIGF0dHJpYnV0ZXMpOworICAgICAgICBydW5uZXIuYWRkQmVhbigiZWxlbWVudHMiLCBlbGVtZW50cyk7CisgICAgICAgIHJ1bm5lci5hZGRCZWFuKCJwcm9qZWN0IiwgZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJ1bm5lci5hZGRCZWFuKCJzZWxmIiwgaW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIHJ1bm5lci5leGVjdXRlU2NyaXB0KCJzY3JpcHRkZWZfIiArIG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciB0aGUgc2NyaXB0aW5nIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihTdHJpbmcgbWFuYWdlcikgeworICAgICAgICBoZWxwZXIuc2V0TWFuYWdlcihtYW5hZ2VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBsYW5ndWFnZSAocmVxdWlyZWQpLgorICAgICAqCisgICAgICogQHBhcmFtIGxhbmd1YWdlIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbmFtZSBmb3IgdGhlIHNjcmlwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgaGVscGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlIDsgb3B0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIGZpbGUpIHsKKyAgICAgICAgaGVscGVyLnNldFNyYyhmaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNjcmlwdCB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgYSBjb21wb25lbnQgb2YgdGhlIHNjcmlwdCB0ZXh0IHRvIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaGVscGVyLmFkZFRleHQodGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFueSBzb3VyY2UgcmVzb3VyY2UuCisgICAgICogQHNpbmNlIEFudDEuNy4xCisgICAgICogQHBhcmFtIHJlc291cmNlIHNvdXJjZSBvZiBzY3JpcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIHJlc291cmNlKSB7CisgICAgICAgIGhlbHBlci5hZGQocmVzb3VyY2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L1NjcmlwdERlZkJhc2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9TY3JpcHREZWZCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4ZTEwZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9TY3JpcHREZWZCYXNlLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2NyaXB0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY05hbWVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkR5bmFtaWNDb25maWd1cmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFRoZSBzY3JpcHQgZXhlY3V0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIGZpbmRzIHRoZSBkZWZpbmluZyBzY3JpcHQgdGFzaworICogYW5kIHBhc3NlcyBjb250cm9sIHRvIHRoYXQgdGFzaydzIGV4ZWN1dGVTY3JpcHQgbWV0aG9kLgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHREZWZCYXNlIGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIER5bmFtaWNDb25maWd1cmF0b3IgeworCisgICAgLyoqIE5lc3RlZCBlbGVtZW50cyAqLworICAgIHByaXZhdGUgTWFwIG5lc3RlZEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqIEF0dHJpYnV0ZXMgKi8KKyAgICBwcml2YXRlIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGUgdGhlIHNjcmlwdCBkZWZpbmluZyB0YXNrIGFuZCBleGVjdXRlIHRoZSBzY3JpcHQgYnkgcGFzc2luZworICAgICAqIGNvbnRyb2wgdG8gaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBnZXRTY3JpcHQoKS5leGVjdXRlU2NyaXB0KGF0dHJpYnV0ZXMsIG5lc3RlZEVsZW1lbnRNYXAsIHRoaXMpOworICAgIH0KKworICAgIHByaXZhdGUgU2NyaXB0RGVmIGdldFNjcmlwdCgpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRUYXNrVHlwZSgpOworICAgICAgICBNYXAgc2NyaXB0UmVwb3NpdG9yeQorICAgICAgICAgICAgPSAoTWFwKSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKE1hZ2ljTmFtZXMuU0NSSVBUX1JFUE9TSVRPUlkpOworICAgICAgICBpZiAoc2NyaXB0UmVwb3NpdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNjcmlwdCByZXBvc2l0b3J5IG5vdCBmb3VuZCBmb3IgIiArIG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgU2NyaXB0RGVmIGRlZmluaXRpb24gPSAoU2NyaXB0RGVmKSBzY3JpcHRSZXBvc2l0b3J5LmdldChnZXRUYXNrVHlwZSgpKTsKKyAgICAgICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTY3JpcHQgZGVmaW5pdGlvbiBub3QgZm91bmQgZm9yICIgKyBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmaW5pdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXN0ZWQgZWxlbWVudAorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5lc3RlZCBlbGVtZW50IG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUR5bmFtaWNFbGVtZW50KFN0cmluZyBuYW1lKSAgeworICAgICAgICBMaXN0IG5lc3RlZEVsZW1lbnRMaXN0ID0gKExpc3QpIG5lc3RlZEVsZW1lbnRNYXAuZ2V0KG5hbWUpOworICAgICAgICBpZiAobmVzdGVkRWxlbWVudExpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgbmVzdGVkRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBuZXN0ZWRFbGVtZW50TWFwLnB1dChuYW1lLCBuZXN0ZWRFbGVtZW50TGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBnZXRTY3JpcHQoKS5jcmVhdGVOZXN0ZWRFbGVtZW50KG5hbWUpOworICAgICAgICBuZXN0ZWRFbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7CisgICAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHRhc2sgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBhdHRyaWJ1dGUncyBzdHJpbmcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREeW5hbWljQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgU2NyaXB0RGVmIGRlZmluaXRpb24gPSBnZXRTY3JpcHQoKTsKKyAgICAgICAgaWYgKCFkZWZpbml0aW9uLmlzQXR0cmlidXRlU3VwcG9ydGVkKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCI8IiArIGdldFRhc2tUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiPiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBcIiIgKyBuYW1lICsgIlwiIGF0dHJpYnV0ZSIpOworICAgICAgICB9CisKKyAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2NyaXB0IHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBhIGNvbXBvbmVudCBvZiB0aGUgc2NyaXB0IHRleHQgdG8gYmUgYWRkZWQuCisgICAgICogQHNpbmNlIGFudDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgdGhpcy50ZXh0ID0gZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKHRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB0aGUgdGV4dCBvZiB0aGlzIGVsZW1lbnQ7IG1heSBiZSBudWxsCisgICAgICogQHJldHVybiB0ZXh0IG9yIG51bGwgZm9yIG5vIG5lc3RlZCB0ZXh0CisgICAgICogQHNpbmNlIGFudDEuNworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgZm9yIG5lc3RlZCBzY3JpcHRzOyB0aHJvd3MgYSBCdWlsZEV4Y2VwdGlvbgorICAgICAqIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBwYXNzIHRvIHRoZSBCdWlsZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWx3YXlzLgorICAgICAqIEBzaW5jZSBhbnQxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmYWlsKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1MuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzgwNWIwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPUy5qYXZhCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNvczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dTdHJlYW1IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogQSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyB0YXNrcyBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzIG9uIFNvdXJjZU9mZlNpdGUuCisgKgorICogIFRoZXNlIHRhc2tzIHdlcmUgaW5zcGlyZWQgYnkgdGhlIFZTUyB0YXNrcy4KKyAqCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFNPUyBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBTT1NDbWQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0VYSVRfU1RBVFVTID0gMjU1OworCisgICAgcHJpdmF0ZSBTdHJpbmcgc29zQ21kRGlyID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBzb3NVc2VybmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc29zUGFzc3dvcmQgPSAiIjsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0UGF0aCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgdnNzU2VydmVyUGF0aCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc29zU2VydmVyUGF0aCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc29zSG9tZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxQYXRoID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBsYWJlbCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWUgPSBudWxsOworCisgICAgcHJpdmF0ZSBib29sZWFuIG5vQ29tcHJlc3MgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbm9DYWNoZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiByZWN1cnNpdmUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKiogQ29tbWFuZGxpbmUgdG8gYmUgZXhlY3V0ZWQuICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGRpc2FibGUgdGhlIGNhY2hlIHdoZW4gc2V0LgorICAgICAqIFJlcXVpcmVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAqIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtICBub2NhY2hlICBUcnVlIHRvIGRpc2FibGUgY2FjaGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXROb0NhY2hlKGJvb2xlYW4gbm9jYWNoZSkgeworICAgICAgICBub0NhY2hlID0gbm9jYWNoZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGRpc2FibGUgY29tcHJlc3Npb24gd2hlbiBzZXQuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtICBub2NvbXByZXNzICBUcnVlIHRvIGRpc2FibGUgY29tcHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Tm9Db21wcmVzcyhib29sZWFuIG5vY29tcHJlc3MpIHsKKyAgICAgICAgbm9Db21wcmVzcyA9IG5vY29tcHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSBzb3NjbWQoLmV4ZSkgaXMgbG9jYXRlZC4KKyAgICAgKiBzb3NjbWQgbXVzdCBiZSBvbiB0aGUgcGF0aCBpZiBvbWl0dGVkLgorICAgICAqCisgICAgICogQHBhcmFtICBkaXIgIFRoZSBuZXcgc29zQ21kIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNvc0NtZChTdHJpbmcgZGlyKSB7CisgICAgICAgIHNvc0NtZERpciA9IEZpbGVVdGlscy50cmFuc2xhdGVQYXRoKGRpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFNvdXJjZVNhZmUgdXNlcm5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHVzZXJuYW1lICBUaGUgbmV3IHVzZXJuYW1lIHZhbHVlLgorICAgICAqCisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9InJlcXVpcmVkIgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICBzb3NVc2VybmFtZSA9IHVzZXJuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBTb3VyY2VTYWZlIHBhc3N3b3JkLgorICAgICAqCisgICAgICogQHBhcmFtICBwYXNzd29yZCAgVGhlIG5ldyBwYXNzd29yZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgc29zUGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgU291cmNlU2FmZSBwcm9qZWN0IHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHByb2plY3RwYXRoICBUaGUgbmV3IHByb2plY3RwYXRoIHZhbHVlLgorICAgICAqCisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9InJlcXVpcmVkIgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByb2plY3RQYXRoKFN0cmluZyBwcm9qZWN0cGF0aCkgeworICAgICAgICBpZiAocHJvamVjdHBhdGguc3RhcnRzV2l0aChTT1NDbWQuUFJPSkVDVF9QUkVGSVgpKSB7CisgICAgICAgICAgICBwcm9qZWN0UGF0aCA9IHByb2plY3RwYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvamVjdFBhdGggPSBTT1NDbWQuUFJPSkVDVF9QUkVGSVggKyBwcm9qZWN0cGF0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3MuaW5pIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHZzc1NlcnZlclBhdGggIFRoZSBuZXcgdnNzU2VydmVyUGF0aCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBhbnQuYXR0cmlidXRlIGdyb3VwPSJyZXF1aXJlZCIKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWc3NTZXJ2ZXJQYXRoKFN0cmluZyB2c3NTZXJ2ZXJQYXRoKSB7CisgICAgICAgIHRoaXMudnNzU2VydmVyUGF0aCA9IHZzc1NlcnZlclBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGF0aCB0byB0aGUgU291cmNlT2ZmU2l0ZSBob21lIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc29zSG9tZSAgVGhlIG5ldyBzb3NIb21lIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNvc0hvbWUoU3RyaW5nIHNvc0hvbWUpIHsKKyAgICAgICAgdGhpcy5zb3NIb21lID0gc29zSG9tZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWRkcmVzcyBhbmQgcG9ydCBvZiBTb3VyY2VPZmZTaXRlIFNlcnZlciwKKyAgICAgKiBmb3IgZXhhbXBsZSAxOTIuMTY4LjAuMTo4ODg4LgorICAgICAqCisgICAgICogQHBhcmFtICBzb3NTZXJ2ZXJQYXRoICBUaGUgbmV3IHNvc1NlcnZlclBhdGggdmFsdWUuCisgICAgICoKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBncm91cD0icmVxdWlyZWQiCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0U29zU2VydmVyUGF0aChTdHJpbmcgc29zU2VydmVyUGF0aCkgeworICAgICAgICB0aGlzLnNvc1NlcnZlclBhdGggPSBzb3NTZXJ2ZXJQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcGF0aCAgVGhlIG5ldyBsb2NhbFBhdGggdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TG9jYWxQYXRoKFBhdGggcGF0aCkgeworICAgICAgICBsb2NhbFBhdGggPSBwYXRoLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIHZlcmJvc2Ugb3V0cHV0LiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgdmVyYm9zZSAgVHJ1ZSBmb3IgdmVyYm9zZSBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvLyBTcGVjaWFsIHNldHRlcnMgZm9yIHRoZSBzdWItY2xhc3NlcworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmaWxlIG5hbWUuCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGVuYW1lIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbEZpbGVuYW1lKFN0cmluZyBmaWxlKSB7CisgICAgICAgIGZpbGVuYW1lID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlY3Vyc2l2ZSBmbGFnLgorICAgICAqIEBwYXJhbSByZWN1cnNlIGlmIHRydWUgdXNlIHRoZSByZWN1cnNpdmUgZmxhZyBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUmVjdXJzaXZlKGJvb2xlYW4gcmVjdXJzZSkgeworICAgICAgICByZWN1cnNpdmUgPSByZWN1cnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tbWVudCB0ZXh0LgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBjb21tZW50IHRleHQgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsQ29tbWVudChTdHJpbmcgdGV4dCkgeworICAgICAgICBjb21tZW50ID0gdGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxhYmVsLgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBsYWJlbCB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxMYWJlbChTdHJpbmcgdGV4dCkgeworICAgICAgICBsYWJlbCA9IHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB2ZXJzaW9uIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFZlcnNpb24oU3RyaW5nIHRleHQpIHsKKyAgICAgICAgdmVyc2lvbiA9IHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBleGVjdXRhYmxlIHRvIHJ1bi4gQWRkIHRoZSBwYXRoIGlmIGl0IHdhcyBzcGVjaWZlZCBpbiB0aGUgYnVpbGQgZmlsZQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZXhlY3V0YWJsZSB0byBydW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTb3NDb21tYW5kKCkgeworICAgICAgICBpZiAoc29zQ21kRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBDT01NQU5EX1NPU19FWEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc29zQ21kRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBDT01NQU5EX1NPU19FWEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbW1lbnQKKyAgICAgKiBAcmV0dXJuIGlmIGl0IHdhcyBzZXQsIG51bGwgaWYgbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2ZXJzaW9uCisgICAgICogQHJldHVybiBpZiBpdCB3YXMgc2V0LCBudWxsIGlmIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGFiZWwKKyAgICAgKiBAcmV0dXJuIGlmIGl0IHdhcyBzZXQsIG51bGwgaWYgbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKSB7CisgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVzZXJuYW1lCisgICAgICogQHJldHVybiBpZiBpdCB3YXMgc2V0LCBudWxsIGlmIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZXJuYW1lKCkgeworICAgICAgICByZXR1cm4gc29zVXNlcm5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXNzd29yZAorICAgICAqIEByZXR1cm4gZW1wdHkgc3RyaW5nIGlmIGl0IHdhc24ndCBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKyAgICAgICAgcmV0dXJuIHNvc1Bhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJvamVjdCBwYXRoCisgICAgICogQHJldHVybiBpZiBpdCB3YXMgc2V0LCBudWxsIGlmIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RQYXRoKCkgeworICAgICAgICByZXR1cm4gcHJvamVjdFBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBWU1Mgc2VydmVyIHBhdGgKKyAgICAgKiBAcmV0dXJuIGlmIGl0IHdhcyBzZXQsIG51bGwgaWYgbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VnNzU2VydmVyUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHZzc1NlcnZlclBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBTT1MgaG9tZSBkaXJlY3RvcnkuCisgICAgICogQHJldHVybiBpZiBpdCB3YXMgc2V0LCBudWxsIGlmIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNvc0hvbWUoKSB7CisgICAgICAgIHJldHVybiBzb3NIb21lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU09TIHNlcnZlIHBhdGguCisgICAgICogQHJldHVybiBpZiBpdCB3YXMgc2V0LCBudWxsIGlmIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNvc1NlcnZlclBhdGgoKSB7CisgICAgICAgIHJldHVybiBzb3NTZXJ2ZXJQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmlsZW5hbWUgdG8gYmUgYWN0ZWQgdXBvbi4KKyAgICAgKiBAcmV0dXJuIGlmIGl0IHdhcyBzZXQsIG51bGwgaWYgbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIE5vQ29tcHJlc3MgZmxhZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlICdub2NvbXByZXNzJyBGbGFnIGlmIHRoZSBhdHRyaWJ1dGUgd2FzICd0cnVlJywKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSBhbiBlbXB0eSBzdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXROb0NvbXByZXNzKCkgeworICAgICAgICByZXR1cm4gbm9Db21wcmVzcyA/IEZMQUdfTk9fQ09NUFJFU1NJT04gOiAiIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIE5vQ2FjaGUgZmxhZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlICdub2NhY2hlJyBGbGFnIGlmIHRoZSBhdHRyaWJ1dGUgd2FzICd0cnVlJywgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vQ2FjaGUoKSB7CisgICAgICAgIHJldHVybiBub0NhY2hlID8gRkxBR19OT19DQUNIRSA6ICIiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgJ3ZlcmJvc2UnIEZsYWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSAndmVyYm9zZScgRmxhZyBpZiB0aGUgYXR0cmlidXRlIHdhcyAndHJ1ZScsIG90aGVyd2lzZSBhbiBlbXB0eSBzdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJib3NlKCkgeworICAgICAgICByZXR1cm4gdmVyYm9zZSA/IEZMQUdfVkVSQk9TRSA6ICIiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgJ3JlY3Vyc2l2ZScgRmxhZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlICdyZWN1cnNpdmUnIEZsYWcgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgJ3RydWUnLCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVjdXJzaXZlKCkgeworICAgICAgICByZXR1cm4gcmVjdXJzaXZlID8gRkxBR19SRUNVUlNJT04gOiAiIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYW5kIHJldHVybnMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAqIDxwPgorICAgICAqIFRoZSBsb2NhbHBhdGggaXMgY3JlYXRlZCBpZiBpdCBkaWRuJ3QgZXhpc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExvY2FsUGF0aCgpIHsKKyAgICAgICAgaWYgKGxvY2FsUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBsb2NhbERpciBleGlzdHMsIGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0CisgICAgICAgICAgICBGaWxlIGRpciA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShsb2NhbFBhdGgpOworICAgICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGRvbmUgPSBkaXIubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgaWYgKCFkb25lKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRGlyZWN0b3J5ICIgKyBsb2NhbFBhdGggKyAiIGNyZWF0aW9uIHdhcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAic3VjY2Vzc2Z1bCBmb3IgYW4gdW5rbm93biByZWFzb24iOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiQ3JlYXRlZCBkaXI6ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IHRoZSBsb2dpYyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICBUaGUgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUuCisgICAgICovCisgICAgYWJzdHJhY3QgQ29tbWFuZGxpbmUgYnVpbGRDbWRMaW5lKCk7CisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIGNyZWF0ZWQgY29tbWFuZCBsaW5lLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGJ1aWxkQ21kTGluZSgpOworICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOworICAgICAgICBpZiAocmVzdWx0ID09IEVSUk9SX0VYSVRfU1RBVFVTKSB7ICAvLyBUaGlzIGlzIHRoZSBleGl0IHN0YXR1cworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgY3JlYXRlZCBjb21tYW5kIGxpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGNtZCAgICAgICAgICAgICAgVGhlIGNvbW1hbmQgbGluZSB0byBydW4uCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgIGludCB0aGUgZXhpdCBjb2RlLgorICAgICAqIEB0aHJvd3MgIEJ1aWxkRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBydW4oQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8sCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pKTsKKworICAgICAgICAgICAgZXhlLnNldEFudFJ1bihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSk7CisgICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY21kLmdldENvbW1hbmRsaW5lKCkpOworICAgICAgICAgICAgZXhlLnNldFZNTGF1bmNoZXIoZmFsc2UpOyAgLy8gVXNlIHRoZSBPUyBWTSBsYXVuY2hlciBzbyB3ZSBnZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICAgICAgICByZXR1cm4gZXhlLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogU2V0cyB0aGUgZXhlY3V0YWJsZSBhbmQgYWRkIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGVzIHRvIHRoZSBjb21tYW5kIGxpbmUuICovCisgICAgcHJvdGVjdGVkIHZvaWQgZ2V0UmVxdWlyZWRBdHRyaWJ1dGVzKCkgeworICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHNvc2NtZCguZXhlKQorICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldFNvc0NvbW1hbmQoKSk7CisgICAgICAgIC8vIFNPUyBzZXJ2ZXIgYWRkcmVzcyBpcyByZXF1aXJlZAorICAgICAgICBpZiAoZ2V0U29zU2VydmVyUGF0aCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic29zc2VydmVycGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1NPU19TRVJWRVIpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFNvc1NlcnZlclBhdGgoKSk7CisgICAgICAgIC8vIExvZ2luIGluZm8gaXMgcmVxdWlyZWQKKyAgICAgICAgaWYgKGdldFVzZXJuYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ1c2VybmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1VTRVJOQU1FKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRVc2VybmFtZSgpKTsKKyAgICAgICAgLy8gVGhlIFNPUyBjbGFzcyBrbm93cyB0aGF0IHRoZSBTT1Mgc2VydmVyIG5lZWRzIHRoZSBwYXNzd29yZCBmbGFnLAorICAgICAgICAvLyBldmVuIGlmIHRoZXJlIGlzIG5vIHBhc3N3b3JkICxzbyB3ZSBzZW5kIGEgIiAiCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19QQVNTV09SRCk7CisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgIC8vIFZTUyBJbmZvIGlzIHJlcXVpcmVkCisgICAgICAgIGlmIChnZXRWc3NTZXJ2ZXJQYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ2c3NzZXJ2ZXJwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfVlNTX1NFUlZFUik7CisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0VnNzU2VydmVyUGF0aCgpKTsKKyAgICAgICAgLy8gVlNTIHByb2plY3QgaXMgcmVxdWlyZWQKKyAgICAgICAgaWYgKGdldFByb2plY3RQYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwcm9qZWN0cGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1BST0pFQ1QpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFByb2plY3RQYXRoKCkpOworICAgIH0KKworICAgIC8qKiBBZGRzIHRoZSBvcHRpb25hbCBhdHRyaWJ1dGVzIHRvIHRoZSBjb21tYW5kIGxpbmUuICovCisgICAgcHJvdGVjdGVkIHZvaWQgZ2V0T3B0aW9uYWxBdHRyaWJ1dGVzKCkgeworICAgICAgICAvLyAtdmVyYm9zZQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZlcmJvc2UoKSk7CisgICAgICAgIC8vIERpc2FibGUgQ29tcHJlc3Npb24KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXROb0NvbXByZXNzKCkpOworICAgICAgICAvLyBQYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5IC9ob21lL3VzZXIvLnNvcworICAgICAgICBpZiAoZ2V0U29zSG9tZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIElmIC1zb3Nob21lIHdhcyBub3Qgc3BlY2lmaWVkIHRoZW4gd2UgY2FuIGxvb2sgZm9yIG5vY2FjaGUKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Tm9DYWNoZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19TT1NfSE9NRSk7CisgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFNvc0hvbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy9JZiBhIHdvcmtpbmcgZGlyZWN0b3J5IHdhcyBzcGVjaWZpZWQgdGhlbiBhZGQgaXQgdG8gdGhlIGNvbW1hbmQgbGluZQorICAgICAgICBpZiAoZ2V0TG9jYWxQYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1dPUktJTkdfRElSKTsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0TG9jYWxQYXRoKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0NoZWNraW4uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NDaGVja2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5NWYwNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NDaGVja2luLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogQ29tbWl0cyBhbmQgdW5sb2NrcyBmaWxlcyBpbiBWaXN1YWwgU291cmNlU2FmZSB2aWEgYSBTb3VyY2VPZmZTaXRlIHNlcnZlci4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0ic29zY2hlY2tpbiIgY2F0ZWdvcnk9InNjbSIKKyAqLworcHVibGljIGNsYXNzIFNPU0NoZWNraW4gZXh0ZW5kcyBTT1MgeworCisgICAgLyoqCisgICAgICogVGhlIGZpbGVuYW1lIHRvIGFjdCB1cG9uLgorICAgICAqIElmIG5vIGZpbGUgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIHRhc2sKKyAgICAgKiBhY3RzIHVwb24gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGZpbGVuYW1lICBUaGUgbmV3IGZpbGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRGaWxlKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbEZpbGVuYW1lKGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIHJlY3Vyc2l2ZWx5IGFwcGx5IHRoZSBhY3Rpb24uIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtICByZWN1cnNpdmUgIFRydWUgZm9yIHJlY3Vyc2l2ZSBvcGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsUmVjdXJzaXZlKHJlY3Vyc2l2ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNvbW1lbnQgdG8gYXBwbHkgdG8gYWxsIGZpbGVzIGJlaW5nIGxhYmVsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtICBjb21tZW50ICBUaGUgbmV3IGNvbW1lbnQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsQ29tbWVudChjb21tZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCB0aGUgY29tbWFuZCBsaW5lLiA8cD4KKyAgICAgKgorICAgICAqIENoZWNrSW5GaWxlIHJlcXVpcmVkIHBhcmFtZXRlcnM6IC1zZXJ2ZXIgLW5hbWUgLXBhc3N3b3JkIC1kYXRhYmFzZSAtcHJvamVjdAorICAgICAqICAtZmlsZTxicj4KKyAgICAgKiBDaGVja0luRmlsZSBvcHRpb25hbCBwYXJhbWV0ZXJzOiAtd29ya2RpciAtbG9nIC12ZXJib3NlIC1ub2NhY2hlIC1ub2NvbXByZXNzaW9uCisgICAgICogIC1zb3Nob21lPGJyPgorICAgICAqIENoZWNrSW5Qcm9qZWN0IHJlcXVpcmVkIHBhcmFtZXRlcnM6IC1zZXJ2ZXIgLW5hbWUgLXBhc3N3b3JkIC1kYXRhYmFzZQorICAgICAqICAtcHJvamVjdDxicj4KKyAgICAgKiBDaGVja0luUHJvamVjdCBvcHRpb25hbCBwYXJhbWV0ZXJzOiB3b3JrZGlyIC1yZWN1cnNpdmUgLWxvZyAtdmVyYm9zZQorICAgICAqICAtbm9jYWNoZSAtbm9jb21wcmVzc2lvbiAtc29zaG9tZTxicj4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgQ29tbWFuZGxpbmUgdGhlIGdlbmVyYXRlZCBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKKyAgICAgICAgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKworICAgICAgICAvLyBJZiB3ZSBmaW5kIGEgImZpbGUiIGF0dHJpYnV0ZSB0aGVuIGFjdCBvbiBhIGZpbGUgb3RoZXJ3aXNlIGFjdCBvbiBhIHByb2plY3QKKyAgICAgICAgaWYgKGdldEZpbGVuYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gYWRkIC1jb21tYW5kIENoZWNrSW5GaWxlIHRvIHRoZSBjb21tYW5kbGluZQorICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTT1NDbWQuRkxBR19DT01NQU5EKTsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoU09TQ21kLkNPTU1BTkRfQ0hFQ0tJTl9GSUxFKTsKKyAgICAgICAgICAgIC8vIGFkZCAtZmlsZSB4eHh4eCB0byB0aGUgY29tbWFuZGxpbmUKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoU09TQ21kLkZMQUdfRklMRSk7CisgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldEZpbGVuYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gYWRkIC1jb21tYW5kIENoZWNrSW5Qcm9qZWN0IHRvIHRoZSBjb21tYW5kbGluZQorICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTT1NDbWQuRkxBR19DT01NQU5EKTsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoU09TQ21kLkNPTU1BTkRfQ0hFQ0tJTl9QUk9KRUNUKTsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgcmVjdXJzaXZlIG9wdGlvbgorICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRSZWN1cnNpdmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBnZXRSZXF1aXJlZEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgZ2V0T3B0aW9uYWxBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgLy8gTG9vayBmb3IgYSBjb21tZW50CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTT1NDbWQuRkxBR19DT01NRU5UKTsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tbWFuZExpbmU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0NoZWNrb3V0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TQ2hlY2tvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWI2ZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0NoZWNrb3V0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBSZXRyaWV2ZXMgYW5kIGxvY2tzIGZpbGVzIGluIFZpc3VhbCBTb3VyY2VTYWZlIHZpYSBhIFNvdXJjZU9mZlNpdGUgc2VydmVyLgorICoKKyAqIEBhbnQudGFzayBuYW1lPSJzb3NjaGVja291dCIgY2F0ZWdvcnk9InNjbSIKKyAqLworcHVibGljIGNsYXNzIFNPU0NoZWNrb3V0IGV4dGVuZHMgU09TIHsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlbmFtZSB0byBhY3QgdXBvbi4KKyAgICAgKiBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB0YXNrCisgICAgICogYWN0cyB1cG9uIHRoZSBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtICBmaWxlbmFtZSAgVGhlIG5ldyBmaWxlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxGaWxlbmFtZShmaWxlbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmxhZyB0byByZWN1cnNpdmVseSBhcHBseSB0aGUgYWN0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVjdXJzaXZlICBUcnVlIGZvciByZWN1cnNpdmUgb3BlcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlY3Vyc2l2ZShib29sZWFuIHJlY3Vyc2l2ZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFJlY3Vyc2l2ZShyZWN1cnNpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgPGJyPgorICAgICAqCisgICAgICogQ2hlY2tPdXRGaWxlIHJlcXVpcmVkIHBhcmFtZXRlcnM6IC1zZXJ2ZXIgLW5hbWUgLXBhc3N3b3JkIC1kYXRhYmFzZSAtcHJvamVjdCAtZmlsZTxicj4KKyAgICAgKiBDaGVja091dEZpbGUgb3B0aW9uYWwgcGFyYW1ldGVyczogLXdvcmtkaXIgLXZlcmJvc2UgLW5vY2FjaGUgLW5vY29tcHJlc3Npb24gLXNvc2hvbWU8YnI+CisgICAgICoKKyAgICAgKiBDaGVja091dFByb2plY3QgcmVxdWlyZWQgcGFyYW1ldGVyczogLXNlcnZlciAtbmFtZSAtcGFzc3dvcmQgLWRhdGFiYXNlIC1wcm9qZWN0PGJyPgorICAgICAqIENoZWNrT3V0UHJvamVjdCBvcHRpb25hbCBwYXJhbWV0ZXJzOi13b3JrZGlyIC1yZWN1cnNpdmUgLXZlcmJvc2UgLW5vY2FjaGUKKyAgICAgKiAtbm9jb21wcmVzc2lvbiAtc29zaG9tZTxicj4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgQ29tbWFuZGxpbmUgdGhlIGdlbmVyYXRlZCBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKKyAgICAgICAgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKworICAgICAgICAvLyBJZiB3ZSBmaW5kIGEgImZpbGUiIGF0dHJpYnV0ZSB0aGVuIGFjdCBvbiBhIGZpbGUgb3RoZXJ3aXNlIGFjdCBvbiBhIHByb2plY3QKKyAgICAgICAgaWYgKGdldEZpbGVuYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gYWRkIC1jb21tYW5kIENoZWNrT3V0RmlsZSB0byB0aGUgY29tbWFuZGxpbmUKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoU09TQ21kLkZMQUdfQ09NTUFORCk7CisgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFNPU0NtZC5DT01NQU5EX0NIRUNLT1VUX0ZJTEUpOworICAgICAgICAgICAgLy8gYWRkIC1maWxlIHh4eHh4IHRvIHRoZSBjb21tYW5kbGluZQorICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTT1NDbWQuRkxBR19GSUxFKTsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhZGQgLWNvbW1hbmQgQ2hlY2tPdXRQcm9qZWN0IHRvIHRoZSBjb21tYW5kbGluZQorICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTT1NDbWQuRkxBR19DT01NQU5EKTsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoU09TQ21kLkNPTU1BTkRfQ0hFQ0tPVVRfUFJPSkVDVCk7CisgICAgICAgICAgICAvLyBsb29rIGZvciBhIHJlY3Vyc2l2ZSBvcHRpb24KKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0UmVjdXJzaXZlKCkpOworICAgICAgICB9CisKKyAgICAgICAgZ2V0UmVxdWlyZWRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGdldE9wdGlvbmFsQXR0cmlidXRlcygpOworCisgICAgICAgIHJldHVybiBjb21tYW5kTGluZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TQ21kLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TQ21kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0M2M0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NDbWQuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNvczsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gaG9sZCBjb25zdGFudHMgdXNlZCBieSB0aGUgU09TIHRhc2tzCisgKgorICovCisvLyBDaGVja1N0eWxlOkludGVyZmFjZUlzVHlwZUNoZWNrIE9GRiAoYmMpCitwdWJsaWMgaW50ZXJmYWNlIFNPU0NtZCB7CisgICAgLy8gc29zY21kIENvbW1hbmQgb3B0aW9ucworICAgIC8qKiBUaGUgc29zIGV4ZWN1dGFibGUgKi8KKyAgICBTdHJpbmcgQ09NTUFORF9TT1NfRVhFID0gInNvc2NtZCI7CisgICAgLyoqIFRoZSBnZXQgZmlsZSBjb21tYW5kICovCisgICAgU3RyaW5nIENPTU1BTkRfR0VUX0ZJTEUgPSAiR2V0RmlsZSI7CisgICAgLyoqIFRoZSBnZXQgcHJvamVjdCBjb21tYW5kICovCisgICAgU3RyaW5nIENPTU1BTkRfR0VUX1BST0pFQ1QgPSAiR2V0UHJvamVjdCI7CisgICAgLyoqIFRoZSBjaGVja291dCBmaWxlIGNvbW1hbmQgKi8KKyAgICBTdHJpbmcgQ09NTUFORF9DSEVDS09VVF9GSUxFID0gIkNoZWNrT3V0RmlsZSI7CisgICAgLyoqIFRoZSBjaGVja291dCBwcm9qZWN0IGNvbW1hbmQgKi8KKyAgICBTdHJpbmcgQ09NTUFORF9DSEVDS09VVF9QUk9KRUNUID0gIkNoZWNrT3V0UHJvamVjdCI7CisgICAgLyoqIFRoZSBjaGVja2luIGZpbGUgY29tbWFuZCAqLworICAgIFN0cmluZyBDT01NQU5EX0NIRUNLSU5fRklMRSA9ICJDaGVja0luRmlsZSI7CisgICAgLyoqIFRoZSBjaGVja2luIHByb2plY3QgY29tbWFuZCAqLworICAgIFN0cmluZyBDT01NQU5EX0NIRUNLSU5fUFJPSkVDVCA9ICJDaGVja0luUHJvamVjdCI7CisgICAgLyoqIFRoZSBnZXQgaGlzdG9yeSBjb21tYW5kICovCisgICAgU3RyaW5nIENPTU1BTkRfSElTVE9SWSA9ICJHZXRGaWxlSGlzdG9yeSI7CisgICAgLyoqIFRoZSBhZGQgbGFiZWwgY29tbWFuZCAqLworICAgIFN0cmluZyBDT01NQU5EX0xBQkVMID0gIkFkZExhYmVsIjsKKyAgICAvKiogVGhlIHByb2plY3QgcHJlZml4ICovCisgICAgU3RyaW5nIFBST0pFQ1RfUFJFRklYID0gIiQiOworCisgICAgLy8gc29zY21kIE9wdGlvbiBmbGFncworICAgIC8qKiBUaGUgY29tbWFuZCBvcHRpb24gKi8KKyAgICBTdHJpbmcgRkxBR19DT01NQU5EID0gIi1jb21tYW5kIjsKKyAgICAvKiogVGhlIGRhdGFiYXNlICh2c3Mgc2VydmVyKSBvcHRpb24gKi8KKyAgICBTdHJpbmcgRkxBR19WU1NfU0VSVkVSID0gIi1kYXRhYmFzZSI7CisgICAgLyoqIFRoZSB1c2VybmFtZSBvcHRpb24gKi8KKyAgICBTdHJpbmcgRkxBR19VU0VSTkFNRSA9ICItbmFtZSI7CisgICAgLyoqIFRoZSBwYXNzd29yZCBvcHRpb24gKi8KKyAgICBTdHJpbmcgRkxBR19QQVNTV09SRCA9ICItcGFzc3dvcmQiOworICAgIC8qKiBUaGUgbG9nIG9wdGlvbiAqLworICAgIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWxvZyI7CisgICAgLyoqIFRoZSB3b3JrZGlyIG9wdGlvbiAqLworICAgIFN0cmluZyBGTEFHX1dPUktJTkdfRElSID0gIi13b3JrZGlyIjsKKyAgICAvKiogVGhlIHJlY3Vyc2l2ZSBvcHRpb24gKi8KKyAgICBTdHJpbmcgRkxBR19SRUNVUlNJT04gPSAiLXJlY3Vyc2l2ZSI7CisgICAgLyoqIFRoZSByZXZpc2lvbiBvcHRpb24gKi8KKyAgICBTdHJpbmcgRkxBR19WRVJTSU9OID0gIi1yZXZpc2lvbiI7CisgICAgLyoqIFRoZSBsYWJlbCBvcHRpb24gKi8KKyAgICBTdHJpbmcgRkxBR19MQUJFTCA9ICItbGFiZWwiOworICAgIC8qKiBUaGUgbm8gY29tcHJlc3Npb24gb3B0aW9uICovCisgICAgU3RyaW5nIEZMQUdfTk9fQ09NUFJFU1NJT04gPSAiLW5vY29tcHJlc3MiOworICAgIC8qKiBUaGUgbm8gY2FjaGUgb3B0aW9uICovCisgICAgU3RyaW5nIEZMQUdfTk9fQ0FDSEUgPSAiLW5vY2FjaGUiOworICAgIC8qKiBUaGUgc2VydmVyIG9wdGlvbiAqLworICAgIFN0cmluZyBGTEFHX1NPU19TRVJWRVIgPSAiLXNlcnZlciI7CisgICAgLyoqIFRoZSBzb3MgaG9tZSBvcHRpb24gKi8KKyAgICBTdHJpbmcgRkxBR19TT1NfSE9NRSA9ICItc29zaG9tZSI7CisgICAgLyoqIFRoZSBwcm9qZWN0IG9wdGlvbiAqLworICAgIFN0cmluZyBGTEFHX1BST0pFQ1QgPSAiLXByb2plY3QiOworICAgIC8qKiBUaGUgZmlsZSBvcHRpb24gKi8KKyAgICBTdHJpbmcgRkxBR19GSUxFID0gIi1maWxlIjsKKyAgICAvKiogVGhlIHZlcmJvc2Ugb3B0aW9uICovCisgICAgU3RyaW5nIEZMQUdfVkVSQk9TRSA9ICItdmVyYm9zZSI7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TR2V0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TR2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiZjkyYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NHZXQuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBSZXRyaWV2ZXMgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3Qgb3IgZmlsZQorICogZnJvbSBWaXN1YWwgU291cmNlU2FmZSB2aWEgYSBTb3VyY2VPZmZTaXRlIHNlcnZlci4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0ic29zZ2V0IiBjYXRlZ29yeT0ic2NtIgorICovCitwdWJsaWMgY2xhc3MgU09TR2V0IGV4dGVuZHMgU09TIHsKKworICAgIC8qKgorICAgICAqIFRoZSBGaWxlbmFtZSB0byBhY3QgdXBvbi4KKyAgICAgKiBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB0YXNrcworICAgICAqIGFjdCB1cG9uIHRoZSBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtICBmaWxlbmFtZSAgVGhlIG5ldyBmaWxlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxGaWxlbmFtZShmaWxlbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmxhZyB0byByZWN1cnNpdmVseSBhcHBseSB0aGUgYWN0aW9uLiBEZWZhdWx0cyB0byBmYWxzZQorICAgICAqCisgICAgICogQHBhcmFtICByZWN1cnNpdmUgIFRydWUgZm9yIHJlY3Vyc2l2ZSBvcGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsUmVjdXJzaXZlKHJlY3Vyc2l2ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2ZXJzaW9uIG51bWJlciB0byBnZXQgLQorICAgICAqIG9ubHkgd29ya3Mgd2l0aCBTT1NHZXQgb24gYSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtICB2ZXJzaW9uICBUaGUgbmV3IHZlcnNpb24gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsVmVyc2lvbih2ZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFiZWxlZCB2ZXJzaW9uIHRvIG9wZXJhdGUgb24gaW4gU291cmNlU2FmZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgbGFiZWwgIFRoZSBuZXcgbGFiZWwgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxMYWJlbChsYWJlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGQgdGhlIGNvbW1hbmQgbGluZSA8YnI+CisgICAgICoKKyAgICAgKiBHZXRGaWxlIHJlcXVpcmVkIHBhcmFtZXRlcnM6IC1zZXJ2ZXIgLW5hbWUgLXBhc3N3b3JkIC1kYXRhYmFzZSAtcHJvamVjdCAtZmlsZTxicj4KKyAgICAgKiBHZXRGaWxlIG9wdGlvbmFsIHBhcmFtZXRlcnM6IC13b3JrZGlyIC1yZXZpc2lvbiAtdmVyYm9zZSAtbm9jYWNoZSAtbm9jb21wcmVzc2lvbiAtc29zaG9tZTxicj4KKyAgICAgKgorICAgICAqIEdldFByb2plY3QgcmVxdWlyZWQgcGFyYW1ldGVyczogLXNlcnZlciAtbmFtZSAtcGFzc3dvcmQgLWRhdGFiYXNlIC1wcm9qZWN0PGJyPgorICAgICAqIEdldFByb2plY3Qgb3B0aW9uYWwgcGFyYW1ldGVyczogLWxhYmVsIC13b3JrZGlyIC1yZWN1cnNpdmUgLXZlcmJvc2UgLW5vY2FjaGUKKyAgICAgKiAtbm9jb21wcmVzc2lvbiAtc29zaG9tZTxicj4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgQ29tbWFuZGxpbmUgdGhlIGdlbmVyYXRlZCBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKKyAgICAgICAgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKworICAgICAgICAvLyBJZiB3ZSBmaW5kIGEgImZpbGUiIGF0dHJpYnV0ZSB0aGVuIGFjdCBvbiBhIGZpbGUgb3RoZXJ3aXNlIGFjdCBvbiBhIHByb2plY3QKKyAgICAgICAgaWYgKGdldEZpbGVuYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gYWRkIC1jb21tYW5kIEdldEZpbGUgdG8gdGhlIGNvbW1hbmRsaW5lCisgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFNPU0NtZC5GTEFHX0NPTU1BTkQpOworICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTT1NDbWQuQ09NTUFORF9HRVRfRklMRSk7CisgICAgICAgICAgICAvLyBhZGQgLWZpbGUgeHh4eHggdG8gdGhlIGNvbW1hbmRsaW5lCisgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFNPU0NtZC5GTEFHX0ZJTEUpOworICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgdmVyc2lvbiBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGlmIChnZXRWZXJzaW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vYWRkIC1yZXZpc2lvbiB4eHh4eCB0byB0aGUgY29tbWFuZGxpbmUKKyAgICAgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFNPU0NtZC5GTEFHX1ZFUlNJT04pOworICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGFkZCAtY29tbWFuZCBHZXRQcm9qZWN0IHRvIHRoZSBjb21tYW5kbGluZQorICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTT1NDbWQuRkxBR19DT01NQU5EKTsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoU09TQ21kLkNPTU1BTkRfR0VUX1BST0pFQ1QpOworICAgICAgICAgICAgLy8gbG9vayBmb3IgYSByZWN1cnNpdmUgb3B0aW9uCisgICAgICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFJlY3Vyc2l2ZSgpKTsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgbGFiZWwgb3B0aW9uCisgICAgICAgICAgICBpZiAoZ2V0TGFiZWwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTT1NDbWQuRkxBR19MQUJFTCk7CisgICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRMYWJlbCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdldFJlcXVpcmVkQXR0cmlidXRlcygpOworICAgICAgICBnZXRPcHRpb25hbEF0dHJpYnV0ZXMoKTsKKworICAgICAgICByZXR1cm4gY29tbWFuZExpbmU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0xhYmVsLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TTGFiZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDZiMTNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0xhYmVsLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBMYWJlbHMgVmlzdWFsIFNvdXJjZVNhZmUgZmlsZXMgdmlhIGEgU291cmNlT2ZmU2l0ZSBzZXJ2ZXIuCisgKgorICogQGFudC50YXNrIG5hbWU9InNvc2xhYmVsIiBjYXRlZ29yeT0ic2NtIgorICovCitwdWJsaWMgY2xhc3MgU09TTGFiZWwgZXh0ZW5kcyBTT1MgeworCisgICAgLyoqCisgICAgICogVGhlIHZlcnNpb24gbnVtYmVyIHRvIGxhYmVsLgorICAgICAqCisgICAgICogQHBhcmFtICB2ZXJzaW9uICBUaGUgbmV3IHZlcnNpb24gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsVmVyc2lvbih2ZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFiZWwgdG8gYXBwbHkgdGhlIHRoZSBmaWxlcyBpbiBTb3VyY2VTYWZlLgorICAgICAqCisgICAgICogQHBhcmFtICBsYWJlbCAgVGhlIG5ldyBsYWJlbCB2YWx1ZQorICAgICAqCisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9InJlcXVpcmVkIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbExhYmVsKGxhYmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tbWVudCB0byBhcHBseSB0byBhbGwgZmlsZXMgYmVpbmcgbGFiZWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGNvbW1lbnQgIFRoZSBuZXcgY29tbWVudCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxDb21tZW50KGNvbW1lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBCdWlsZCB0aGUgY29tbWFuZCBsaW5lIDxicj4KKyAgICAgKiAgQWRkTGFiZWwgcmVxdWlyZWQgcGFyYW1ldGVyczogLXNlcnZlciAtbmFtZSAtcGFzc3dvcmQgLWRhdGFiYXNlIC1wcm9qZWN0IC1sYWJlbDxicj4KKyAgICAgKiAgQWRkTGFiZWwgb3B0aW9uYWwgcGFyYW1ldGVyczogLXZlcmJvc2UgLWNvbW1lbnQ8YnI+CisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgIENvbW1hbmRsaW5lIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCB0byBiZSBleGVjdXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBDb21tYW5kbGluZSBidWlsZENtZExpbmUoKSB7CisgICAgICAgIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CisKKyAgICAgICAgLy8gYWRkIC1jb21tYW5kIEFkZExhYmVsIHRvIHRoZSBjb21tYW5kbGluZQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFNPU0NtZC5GTEFHX0NPTU1BTkQpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKFNPU0NtZC5DT01NQU5EX0xBQkVMKTsKKworICAgICAgICBnZXRSZXF1aXJlZEF0dHJpYnV0ZXMoKTsKKworICAgICAgICAvLyBhIGxhYmVsIGlzIHJlcXVpcmVkCisgICAgICAgIGlmIChnZXRMYWJlbCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibGFiZWwgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoU09TQ21kLkZMQUdfTEFCRUwpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldExhYmVsKCkpOworCisgICAgICAgIC8vIC12ZXJib3NlCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0VmVyYm9zZSgpKTsKKyAgICAgICAgLy8gTG9vayBmb3IgYSBjb21tZW50CisgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTT1NDbWQuRkxBR19DT01NRU5UKTsKKyAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tbWFuZExpbmU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL3BhY2thZ2UuaHRtbCBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1MzhjMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyOSBAQAorPGh0bWw+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Ym9keT4KKyAgPHA+CisgICAgQW50IHRhc2tzIGZvciB3b3JraW5nIHdpdGggYSBTb3VyY2VPZmZTaXRlIHNvdXJjZSBjb250cm9sIHN5c3RlbS4KKyAgPC9wPgorICA8cD4KKyAgICBUaGUgJmx0O1NPU0dldCZndDsgUmV0cmVpdmVzIGZpbGUocykgZnJvbSBhIFNPUyBkYXRhYmFzZTxicj4KKyAgICBUaGUgJmx0O1NPU0NoZWNraW4mZ3Q7IENvbW1pdHMgYW5kIHVubG9ja3MgZmlsZShzKSBpbiBhIFNPUyBkYXRhYmFzZTxicj4KKyAgICBUaGUgJmx0O1NPU0NoZWNrb3V0Jmd0OyBSZXRyZWl2ZXMgYW5kIGxvY2sgZmlsZShzKSBpbiBhIFNPUyBkYXRhYmFzZTxicj4KKyAgICBUaGUgJmx0O1NPU0xhYmVsJmd0OyBMYWJlbCBhIFNPUyBkYXRhYmFzZTxicj4KKyAgPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc291bmQvQW50U291bmRQbGF5ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL0FudFNvdW5kUGxheWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxOTY2YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL0FudFNvdW5kUGxheWVyLmphdmEKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3VuZDsKKworLy8gYW50IGluY2x1ZGVzCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBqYXZheC5zb3VuZC5zYW1wbGVkLkF1ZGlvSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC5BdWRpb1N5c3RlbTsKK2ltcG9ydCBqYXZheC5zb3VuZC5zYW1wbGVkLkNsaXA7CitpbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC5EYXRhTGluZTsKK2ltcG9ydCBqYXZheC5zb3VuZC5zYW1wbGVkLkxpbmU7CitpbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC5MaW5lRXZlbnQ7CitpbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC5MaW5lTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC5MaW5lVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc291bmQuc2FtcGxlZC5VbnN1cHBvcnRlZEF1ZGlvRmlsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGJ5IGFueSBBbnRUYXNrIHRoYXQgcmVxdWlyZXMgYXVkaW8gb3V0cHV0LgorICoKKyAqIEl0IGltcGxlbWVudHMgdGhlIEJ1aWxkTGlzdGVuZXIgaW50ZXJmYWNlIHRvIGxpc3RlbiBmb3IgQnVpbGRFdmVudHMgYW5kIGNvdWxkCisgKiBiZSBlYXNpbHkgZXh0ZW5kZWQgdG8gcHJvdmlkZSBhdWRpbyBvdXRwdXQgdXBvbiBhbnkgc3BlY2lmaWMgYnVpbGQgZXZlbnRzIG9jY3VyaW5nLgorICoKKyAqIEkgaGF2ZSBvbmx5IHRlc3RlZCB0aGlzIHdpdGggLldBViBhbmQgLkFJRkYgc291bmQgZmlsZSBmb3JtYXRzLiBCb3RoIHNlZW0gdG8gd29yayBmaW5lLgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgQW50U291bmRQbGF5ZXIgaW1wbGVtZW50cyBMaW5lTGlzdGVuZXIsIEJ1aWxkTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBGaWxlIGZpbGVTdWNjZXNzID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBsb29wc1N1Y2Nlc3MgPSAwOworICAgIHByaXZhdGUgTG9uZyBkdXJhdGlvblN1Y2Nlc3MgPSBudWxsOworCisgICAgcHJpdmF0ZSBGaWxlIGZpbGVGYWlsID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBsb29wc0ZhaWwgPSAwOworICAgIHByaXZhdGUgTG9uZyBkdXJhdGlvbkZhaWwgPSBudWxsOworCisgICAgLyoqIENvbnN0cnVjdG9yIGZvciBBbnRTb3VuZFBsYXllci4gKi8KKyAgICBwdWJsaWMgQW50U291bmRQbGF5ZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBhdWRpbyBmaWxlIHRvIGJlIHBsYXllZCB3aGVuIHRoZQorICAgICAqICAgICAgICBidWlsZCBpcyBzdWNjZXNzZnVsCisgICAgICogQHBhcmFtIGxvb3BzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc2hvdWxkIGJlIHBsYXllZCB3aGVuCisgICAgICogICAgICAgIHRoZSBidWlsZCBpcyBzdWNjZXNzZnVsCisgICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoZSBmaWxlIHNob3VsZCBiZQorICAgICAqICAgICAgICBwbGF5ZWQgd2hlbiB0aGUgYnVpbGQgaXMgc3VjY2Vzc2Z1bAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEJ1aWxkU3VjY2Vzc2Z1bFNvdW5kKEZpbGUgZmlsZSwgaW50IGxvb3BzLCBMb25nIGR1cmF0aW9uKSB7CisgICAgICAgIHRoaXMuZmlsZVN1Y2Nlc3MgPSBmaWxlOworICAgICAgICB0aGlzLmxvb3BzU3VjY2VzcyA9IGxvb3BzOworICAgICAgICB0aGlzLmR1cmF0aW9uU3VjY2VzcyA9IGR1cmF0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHBhcmFtIGZpbGVGYWlsIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXVkaW8gZmlsZSB0byBiZSBwbGF5ZWQKKyAgICAgKiAgICAgICAgd2hlbiB0aGUgYnVpbGQgZmFpbHMKKyAgICAgKiBAcGFyYW0gbG9vcHNGYWlsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc2hvdWxkIGJlIHBsYXllZAorICAgICAqICAgICAgICB3aGVuIHRoZSBidWlsZCBpcyBmYWlscworICAgICAqIEBwYXJhbSBkdXJhdGlvbkZhaWwgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhlIGZpbGUgc2hvdWxkIGJlCisgICAgICogICAgICAgIHBsYXllZCB3aGVuIHRoZSBidWlsZCBmYWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEJ1aWxkRmFpbGVkU291bmQoRmlsZSBmaWxlRmFpbCwgaW50IGxvb3BzRmFpbCwgTG9uZyBkdXJhdGlvbkZhaWwpIHsKKyAgICAgICAgdGhpcy5maWxlRmFpbCA9IGZpbGVGYWlsOworICAgICAgICB0aGlzLmxvb3BzRmFpbCA9IGxvb3BzRmFpbDsKKyAgICAgICAgdGhpcy5kdXJhdGlvbkZhaWwgPSBkdXJhdGlvbkZhaWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGxheXMgdGhlIGZpbGUgZm9yIGR1cmF0aW9uIG1pbGxpc2Vjb25kcyBvciBsb29wcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGxheShQcm9qZWN0IHByb2plY3QsIEZpbGUgZmlsZSwgaW50IGxvb3BzLCBMb25nIGR1cmF0aW9uKSB7CisKKyAgICAgICAgQ2xpcCBhdWRpb0NsaXAgPSBudWxsOworCisgICAgICAgIEF1ZGlvSW5wdXRTdHJlYW0gYXVkaW9JbnB1dFN0cmVhbSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXVkaW9JbnB1dFN0cmVhbSA9IEF1ZGlvU3lzdGVtLmdldEF1ZGlvSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQXVkaW9GaWxlRXhjZXB0aW9uIHVhZmUpIHsKKyAgICAgICAgICAgIHByb2plY3QubG9nKCJBdWRpbyBmb3JtYXQgaXMgbm90IHlldCBzdXBwb3J0ZWQ6ICIKKyAgICAgICAgICAgICAgICArIHVhZmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBpb2UucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXVkaW9JbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICBBdWRpb0Zvcm1hdCBmb3JtYXQgPSBhdWRpb0lucHV0U3RyZWFtLmdldEZvcm1hdCgpOworICAgICAgICAgICAgRGF0YUxpbmUuSW5mbyAgIGluZm8gPSBuZXcgRGF0YUxpbmUuSW5mbyhDbGlwLmNsYXNzLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbS5OT1RfU1BFQ0lGSUVEKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXVkaW9DbGlwID0gKENsaXApIEF1ZGlvU3lzdGVtLmdldExpbmUoaW5mbyk7CisgICAgICAgICAgICAgICAgYXVkaW9DbGlwLmFkZExpbmVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBhdWRpb0NsaXAub3BlbihhdWRpb0lucHV0U3RyZWFtKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKExpbmVVbmF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5sb2coIlRoZSBzb3VuZCBkZXZpY2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGxheUNsaXAoYXVkaW9DbGlwLCBkdXJhdGlvbi5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBsYXlDbGlwKGF1ZGlvQ2xpcCwgbG9vcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9DbGlwLmRyYWluKCk7CisgICAgICAgICAgICBhdWRpb0NsaXAuY2xvc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2plY3QubG9nKCJDYW4ndCBnZXQgZGF0YSBmcm9tIGZpbGUgIiArIGZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwbGF5Q2xpcChDbGlwIGNsaXAsIGludCBsb29wcykgeworCisgICAgICAgIGNsaXAubG9vcChsb29wcyk7CisgICAgICAgIHdoaWxlIChjbGlwLmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAvLyBFbXB0eSBibG9jaworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsYXlDbGlwKENsaXAgY2xpcCwgbG9uZyBkdXJhdGlvbikgeworICAgICAgICBjbGlwLmxvb3AoQ2xpcC5MT09QX0NPTlRJTlVPVVNMWSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoZHVyYXRpb24pOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgRXhjZXB0aW9uCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGltcGxlbWVudGVkIHRvIGxpc3RlbiBmb3IgYW55IGxpbmUgZXZlbnRzIGFuZCBjbG9zZXMgdGhlCisgICAgICogY2xpcCBpZiByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGxpbmUgZXZlbnQgdG8gZm9sbG93CisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKExpbmVFdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaW5lRXZlbnQuVHlwZS5TVE9QKSkgeworICAgICAgICAgICAgTGluZSBsaW5lID0gZXZlbnQuZ2V0TGluZSgpOworICAgICAgICAgICAgbGluZS5jbG9zZSgpOworICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKS5lcXVhbHMoTGluZUV2ZW50LlR5cGUuQ0xPU0UpKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIFRoZXJlIGlzIGEgYnVnIGluIEphdmFTb3VuZCAwLjkwIChqZGsxLjNiZXRhKS4KKyAgICAgICAgICAgICAqICBJdCBwcmV2ZW50cyBjb3JyZWN0IHRlcm1pbmF0aW9uIG9mIHRoZSBWTS4KKyAgICAgICAgICAgICAqICBTbyB3ZSBoYXZlIHRvIGV4aXQgb3Vyc2VsdmVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvL1N5c3RlbS5leGl0KDApOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgRmlyZWQgYmVmb3JlIGFueSB0YXJnZXRzIGFyZSBzdGFydGVkLgorICAgICAqIEBwYXJhbSBldmVudCBpZ25vcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgRmlyZWQgYWZ0ZXIgdGhlIGxhc3QgdGFyZ2V0IGhhcyBmaW5pc2hlZC4gVGhpcyBldmVudAorICAgICAqICB3aWxsIHN0aWxsIGJlIHRocm93biBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGJ1aWxkLgorICAgICAqIEBwYXJhbSBldmVudCB0aGUgYnVpbGQgZmluaXNoZWQgZXZlbnQuCisgICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRFeGNlcHRpb24oKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCAmJiBmaWxlU3VjY2VzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBidWlsZCBzdWNjZXNzZnVsbCEKKyAgICAgICAgICAgIHBsYXkoZXZlbnQuZ2V0UHJvamVjdCgpLCBmaWxlU3VjY2VzcywgbG9vcHNTdWNjZXNzLCBkdXJhdGlvblN1Y2Nlc3MpOworICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEV4Y2VwdGlvbigpICE9IG51bGwgJiYgZmlsZUZhaWwgIT0gbnVsbCkgeworICAgICAgICAgICAgcGxheShldmVudC5nZXRQcm9qZWN0KCksIGZpbGVGYWlsLCBsb29wc0ZhaWwsIGR1cmF0aW9uRmFpbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgRmlyZWQgd2hlbiBhIHRhcmdldCBpcyBzdGFydGVkLgorICAgICAqIEBwYXJhbSBldmVudCBpZ25vcmVkLgorICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFyZ2V0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgRmlyZWQgd2hlbiBhIHRhcmdldCBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQgd2lsbAorICAgICAqICBzdGlsbCBiZSB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBidWlsZC4KKyAgICAgKiBAcGFyYW0gZXZlbnQgaWdub3JlZC4KKyAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldEV4Y2VwdGlvbigpCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqICBGaXJlZCB3aGVuIGEgdGFzayBpcyBzdGFydGVkLgorICAgICAqIEBwYXJhbSBldmVudCBpZ25vcmVkLgorICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFzaygpCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqICBGaXJlZCB3aGVuIGEgdGFzayBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQgd2lsbCBzdGlsbAorICAgICAqICBiZSB0aHJvdyBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGJ1aWxkLgorICAgICAqIEBwYXJhbSBldmVudCBpZ25vcmVkLgorICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqICBGaXJlZCB3aGVuZXZlciBhIG1lc3NhZ2UgaXMgbG9nZ2VkLgorICAgICAqICBAcGFyYW0gZXZlbnQgdGhlIGJ1aWxkIGV2ZW50CisgICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRNZXNzYWdlKCkKKyAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldFByaW9yaXR5KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL1NvdW5kVGFzay5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc291bmQvU291bmRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NDcwYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL1NvdW5kVGFzay5qYXZhCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc291bmQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworLyoqCisgKiBQbGF5cyBhIHNvdW5kIGZpbGUgYXQgdGhlIGVuZCBvZiB0aGUgYnVpbGQsIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBidWlsZCBmYWlsZWQgb3Igc3VjY2VlZGVkLgorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBhdHRyaWJ1dGVzIHRvIGJlIHNldDoKKyAqCisgKiA8Y29kZT5zb3VyY2U8L2NvZGU+OiB0aGUgbG9jYXRpb24gb2YgdGhlIGF1ZGlvIGZpbGUgdG8gYmUgcGxheWVkCisgKiA8Y29kZT5kdXJhdGlvbjwvY29kZT46IHBsYXkgdGhlIHNvdW5kIGZpbGUgY29udGludW91c2x5IHVudGlsICJkdXJhdGlvbiIgbWlsbGlzZWNvbmRzIGhhcyBleHBpcmVkCisgKiA8Y29kZT5sb29wczwvY29kZT46IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNvdW5kIGZpbGUgc2hvdWxkIGJlIHBsYXllZCB1bnRpbCBzdG9wcGVkCisgKgorICogSSBoYXZlIG9ubHkgdGVzdGVkIHRoaXMgd2l0aCAuV0FWIGFuZCAuQUlGRiBzb3VuZCBmaWxlIGZvcm1hdHMuIEJvdGggc2VlbQorICogdG8gd29yayBmaW5lLgorICoKKyAqIHBsYW5zIGZvciB0aGUgZnV0dXJlOgorICogLSB1c2UgdGhlIG1pZGkgYXBpIHRvIGRlZmluZSBzb3VuZHMgKG9yIGRydW0gYmVhdCBldGMpIGluIHhtbCBhbmQgaGF2ZQorICogICBBbnQgcGxheSB0aGVtIGJhY2sKKyAqCisgKi8KKworcHVibGljIGNsYXNzIFNvdW5kVGFzayBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBCdWlsZEFsZXJ0IHN1Y2Nlc3MgPSBudWxsOworICAgIHByaXZhdGUgQnVpbGRBbGVydCBmYWlsID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIGFkZCBhIHNvdW5kIHdoZW4gdGhlIGJ1aWxkIHN1Y2NlZWRzCisgICAgICogQHJldHVybiBhIEJ1aWxkQWxlcnQgdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBCdWlsZEFsZXJ0IGNyZWF0ZVN1Y2Nlc3MoKSB7CisgICAgICAgIHN1Y2Nlc3MgPSBuZXcgQnVpbGRBbGVydCgpOworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBzb3VuZCB3aGVuIHRoZSBidWlsZCBmYWlscworICAgICAqIEByZXR1cm4gYSBCdWlsZEFsZXJ0IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRBbGVydCBjcmVhdGVGYWlsKCkgeworICAgICAgICBmYWlsID0gbmV3IEJ1aWxkQWxlcnQoKTsKKyAgICAgICAgcmV0dXJuIGZhaWw7CisgICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgU291bmRUYXNrLiAqLworICAgIHB1YmxpYyBTb3VuZFRhc2soKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHRhc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKworICAgICAgICBBbnRTb3VuZFBsYXllciBzb3VuZFBsYXllciA9IG5ldyBBbnRTb3VuZFBsYXllcigpOworCisgICAgICAgIGlmIChzdWNjZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiTm8gbmVzdGVkIHN1Y2Nlc3MgZWxlbWVudCBmb3VuZC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNvdW5kUGxheWVyLmFkZEJ1aWxkU3VjY2Vzc2Z1bFNvdW5kKHN1Y2Nlc3MuZ2V0U291cmNlKCksCisgICAgICAgICAgICAgIHN1Y2Nlc3MuZ2V0TG9vcHMoKSwgc3VjY2Vzcy5nZXREdXJhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmYWlsID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiTm8gbmVzdGVkIGZhaWx1cmUgZWxlbWVudCBmb3VuZC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNvdW5kUGxheWVyLmFkZEJ1aWxkRmFpbGVkU291bmQoZmFpbC5nZXRTb3VyY2UoKSwKKyAgICAgICAgICAgICAgZmFpbC5nZXRMb29wcygpLCBmYWlsLmdldER1cmF0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgZ2V0UHJvamVjdCgpLmFkZEJ1aWxkTGlzdGVuZXIoc291bmRQbGF5ZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjbGFzcyB0byBiZSBleHRlbmRlZCBieSBhbnkgQnVpbGRBbGVydCdzIHRoYXQgcmVxdWlyZSB0aGUgb3V0cHV0CisgICAgICogb2Ygc291bmQuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIEJ1aWxkQWxlcnQgeworICAgICAgICBwcml2YXRlIEZpbGUgc291cmNlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbG9vcHMgPSAwOworICAgICAgICBwcml2YXRlIExvbmcgZHVyYXRpb24gPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdGhlIGZpbGUgc2hvdWxkIGJlIHBsYXllZDsgb3B0aW9uYWwuCisgICAgICAgICAqIEBwYXJhbSBkdXJhdGlvbiB0aGUgZHVyYXRpb24gaW4gbWlsbGlzY29uZHMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKExvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0byBnZXQgdGhlIGF1ZGlvOyByZXF1aXJlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgbmFtZSBvZiBhIHNvdW5kLWZpbGUgZGlyZWN0b3J5IG9yIG9mIHRoZSBhdWRpbyBmaWxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoRmlsZSBzb3VyY2UpIHsKKyAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc291cmNlIGZpbGUgc2hvdWxkIGJlIHBsYXllZDsgb3B0aW9uYWwuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb29wcyB0aGUgbnVtYmVyIG9mIGxvb3BzIHRvIHBsYXkgdGhlIHNvdXJjZSBmaWxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb29wcyhpbnQgbG9vcHMpIHsKKyAgICAgICAgICAgIHRoaXMubG9vcHMgPSBsb29wczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0byBnZXQgdGhlIGF1ZGlvLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGxvY2F0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmlsZSBnZXRTb3VyY2UoKSB7CisgICAgICAgICAgICBGaWxlIG5vZmlsZSA9IG51bGw7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBzb3VyY2UgaXMgYSBkaXJlY3RvcnkKKyAgICAgICAgICAgIGlmIChzb3VyY2UuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIGZpbGVzIGluIHRoZSBkaXIKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZW50cmllcyA9IHNvdXJjZS5saXN0KCk7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvciBmaWxlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzb3VyY2UsIGVudHJpZXNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5hZGRFbGVtZW50KGYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlcy5zaXplKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGZpbGVzIGZvdW5kIGluIGRpcmVjdG9yeSAiICsgc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtZmlsZXMgPSBmaWxlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAwIGFuZCB0aGUgbnVtYmVyIG9mIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIFJhbmRvbSBybiA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHggPSBybi5uZXh0SW50KG51bWZpbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBzb3VyY2UgdG8gdGhlIGZpbGUgYXQgdGhhdCBsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IChGaWxlKSBmaWxlcy5lbGVtZW50QXQoeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coc291cmNlICsgIjogaW52YWxpZCBwYXRoLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIHRoaXMuc291cmNlID0gbm9maWxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc291cmNlIGZpbGUgc2hvdWxkIGJlIHBsYXllZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxvb3BzIHRvIHBsYXkgdGhlIHNvdXJjZSBmaWxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldExvb3BzKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9vcHM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRoZSBmaWxlIHNob3VsZCBiZSBwbGF5ZWQuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExvbmcgZ2V0RHVyYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5kdXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3BsYXNoL1NwbGFzaFNjcmVlbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3BsYXNoL1NwbGFzaFNjcmVlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODYzYjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zcGxhc2gvU3BsYXNoU2NyZWVuLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zcGxhc2g7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LkZvbnQ7CitpbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnN3aW5nLkltYWdlSWNvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQcm9ncmVzc0JhcjsKK2ltcG9ydCBqYXZheC5zd2luZy5KV2luZG93OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lcjsKKworY2xhc3MgU3BsYXNoU2NyZWVuIGV4dGVuZHMgSldpbmRvdyBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyLCBCdWlsZExpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9OVF9TSVpFID0gMTI7CisgICAgcHJpdmF0ZSBKTGFiZWwgdGV4dDsKKyAgICBwcml2YXRlIEpQcm9ncmVzc0JhciBwYjsKKyAgICBwcml2YXRlIGludCB0b3RhbDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYID0gMjAwOworCisgICAgcHVibGljIFNwbGFzaFNjcmVlbihTdHJpbmcgbXNnKSB7CisgICAgICAgIGluaXQobnVsbCk7CisgICAgICAgIHNldFRleHQobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3BsYXNoU2NyZWVuKEltYWdlSWNvbiBpbWcpIHsKKyAgICAgICAgaW5pdChpbWcpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGluaXQoSW1hZ2VJY29uIGltZykgeworCisgICAgICAgIEpQYW5lbCBwYW4gPSAoSlBhbmVsKSBnZXRDb250ZW50UGFuZSgpOworICAgICAgICBKTGFiZWwgcGljY3k7CisgICAgICAgIGlmIChpbWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcGljY3kgPSBuZXcgSkxhYmVsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwaWNjeSA9IG5ldyBKTGFiZWwoaW1nKTsKKyAgICAgICAgfQorCisgICAgICAgIHBpY2N5LnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIoQ29sb3IuYmxhY2ssIDEpKTsKKyAgICAgICAgdGV4dCA9IG5ldyBKTGFiZWwoIkJ1aWxkaW5nLi4uLiIsIEpMYWJlbC5DRU5URVIpOworICAgICAgICB0ZXh0LnNldEZvbnQobmV3IEZvbnQoIlNhbnMtU2VyaWYiLCBGb250LkJPTEQsIEZPTlRfU0laRSkpOworICAgICAgICB0ZXh0LnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpKTsKKworICAgICAgICBwYiA9IG5ldyBKUHJvZ3Jlc3NCYXIoTUlOLCBNQVgpOworICAgICAgICBwYi5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXIuTE9XRVJFRCkpOworICAgICAgICBKUGFuZWwgcGFuMiA9IG5ldyBKUGFuZWwoKTsKKyAgICAgICAgcGFuMi5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKworICAgICAgICBwYW4yLmFkZCh0ZXh0LCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgICAgICBwYW4yLmFkZChwYiwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKworICAgICAgICBwYW4uc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIHBhbi5hZGQocGljY3ksIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICBwYW4uYWRkKHBhbjIsIEJvcmRlckxheW91dC5TT1VUSCk7CisKKyAgICAgICAgcGFuLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5CZXZlbEJvcmRlci5SQUlTRUQpKTsKKworICAgICAgICBwYWNrKCk7CisKKyAgICAgICAgRGltZW5zaW9uIHNpemUgPSBnZXRTaXplKCk7CisgICAgICAgIERpbWVuc2lvbiBzY3IgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuU2l6ZSgpOworICAgICAgICBpbnQgeCA9IChzY3Iud2lkdGggLSBzaXplLndpZHRoKSAvIDI7CisgICAgICAgIGludCB5ID0gKHNjci5oZWlnaHQgLSBzaXplLmhlaWdodCkgLyAyOworICAgICAgICBzZXRCb3VuZHMoeCwgeSwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHR4dCkgeworICAgICAgICB0ZXh0LnNldFRleHQodHh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgYSkgeworICAgICAgICBpZiAodG90YWwgPCBNQVgpIHsKKyAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0b3RhbCA9IE1JTjsKKyAgICAgICAgfQorICAgICAgICBwYi5zZXRWYWx1ZSh0b3RhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgYWN0aW9uUGVyZm9ybWVkKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICBwYi5zZXRWYWx1ZShNQVgpOworICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgZGlzcG9zZSgpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgYWN0aW9uUGVyZm9ybWVkKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgYWN0aW9uUGVyZm9ybWVkKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgYWN0aW9uUGVyZm9ybWVkKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGFjdGlvblBlcmZvcm1lZChudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgYWN0aW9uUGVyZm9ybWVkKG51bGwpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3BsYXNoL1NwbGFzaFRhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4YTQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hUYXNrLmphdmEKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zcGxhc2g7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YXguc3dpbmcuSW1hZ2VJY29uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkJhc2U2NENvbnZlcnRlcjsKKworLyoqCisgKiBDcmVhdGVzIGEgc3BsYXNoIHNjcmVlbi4gVGhlIHNwbGFzaCBzY3JlZW4gaXMgZGlzcGxheWVkCisgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBidWlsZCBhbmQgaW5jbHVkZXMgYSBoYW5keSBwcm9ncmVzcyBiYXIgYXMKKyAqIHdlbGwuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBzb3VuZCB0YXNrIHRvIHByb3ZpZGUgaW50ZXJlc3QKKyAqIHdoaWxzdCB3YWl0aW5nIGZvciB5b3VyIGJ1aWxkcyB0byBjb21wbGV0ZS4uLgorICogQHNpbmNlIEFudDEuNQorICovCitwdWJsaWMgY2xhc3MgU3BsYXNoVGFzayBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NIT1dfRFVSQVRJT04gPSA1MDAwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgaW1ndXJsID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBwcm94eSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlciA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHBvcnQgPSAiODAiOworICAgIHByaXZhdGUgaW50IHNob3dEdXJhdGlvbiA9IERFRkFVTFRfU0hPV19EVVJBVElPTjsKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlUHJveHkgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIFNwbGFzaFNjcmVlbiBzcGxhc2ggPSBudWxsOworCisgICAgLyoqCisgICAgICogQSBVUkwgcG9pbnRpbmcgdG8gYW4gaW1hZ2UgdG8gZGlzcGxheTsgb3B0aW9uYWwsIGRlZmF1bHQgYW50bG9nby5naWYKKyAgICAgKiBmcm9tIHRoZSBjbGFzc3BhdGguCisgICAgICogQHBhcmFtIGltZ3VybCB0aGUgdXJsIHN0cmluZyBwb2ludGluZyB0byB0aGUgaW1hZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZVVSTChTdHJpbmcgaW1ndXJsKSB7CisgICAgICAgIHRoaXMuaW1ndXJsID0gaW1ndXJsOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZsYWcgdG8gZW5hYmxlIHByb3h5IHNldHRpbmdzOyBvcHRpb25hbCwgZGVwcmVjYXRlZCA6IGNvbnNpZGVyCisgICAgICogdXNpbmcgJmx0O3NldHByb3h5Jmd0OyBpbnN0ZWFkCisgICAgICogQHBhcmFtIHVzZVByb3h5IGlmIHR1cmUsIGVuYWJsZSBwcm94eSBzZXR0aW5ncworICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgorICAgICAqICAgICAgICAgICAgIFVzZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5TZXRQcm94eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXByb3h5KGJvb2xlYW4gdXNlUHJveHkpIHsKKyAgICAgICAgdGhpcy51c2VQcm94eSA9IHVzZVByb3h5OworICAgIH0KKworICAgIC8qKgorICAgICAqIG5hbWUgb2YgcHJveHk7IG9wdGlvbmFsLgorICAgICAqIEBwYXJhbSBwcm94eSB0aGUgbmFtZSBvZiB0aGUgcHJveHkgaG9zdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3h5KFN0cmluZyBwcm94eSkgeworICAgICAgICB0aGlzLnByb3h5ID0gcHJveHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJveHkgcG9ydDsgb3B0aW9uYWwsIGRlZmF1bHQgODAuCisgICAgICogQHBhcmFtIHBvcnQgdGhlIHByb3h5IHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KFN0cmluZyBwb3J0KSB7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJveHkgdXNlcjsgb3B0aW9uYWwsIGRlZmF1bHQgPW5vbmUuCisgICAgICogQHBhcmFtIHVzZXIgdGhlIHByb3h5IHVzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyB1c2VyKSB7CisgICAgICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJveHkgcGFzc3dvcmQ7IHJlcXVpcmVkIGlmIDx0dD51c2VyPC90dD4gaXMgc2V0LgorICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgcHJveHkgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIGhvdyBsb25nIHRvIHNob3cgdGhlIHNwbGFzaCBzY3JlZW4gaW4gbWlsbGlzZWNvbmRzLAorICAgICAqIG9wdGlvbmFsOyBkZWZhdWx0IDUwMDAgbXMuCisgICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBzcGFzaCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93ZHVyYXRpb24oaW50IGR1cmF0aW9uKSB7CisgICAgICAgIHRoaXMuc2hvd0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNwbGFzaCAhPSBudWxsKSB7CisgICAgICAgICAgICBzcGxhc2guc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkucmVtb3ZlQnVpbGRMaXN0ZW5lcihzcGxhc2gpOworICAgICAgICAgICAgc3BsYXNoLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIHNwbGFzaCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBsb2coIkNyZWF0aW5nIG5ldyBTcGxhc2hTY3JlZW4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCisgICAgICAgIGlmIChpbWd1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKHVzZVByb3h5ICYmIChwcm94eSAhPSBudWxsICYmIHByb3h5Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBvcnQgIT0gbnVsbCAmJiBwb3J0Lmxlbmd0aCgpID4gMCkpIHsKKworICAgICAgICAgICAgICAgICAgICBsb2coIlVzaW5nIHByb3hpZWQgQ29ubmVjdGlvbiIsICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJodHRwLnByb3h5U2V0IiwgInRydWUiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoImh0dHAucHJveHlIb3N0IiwgcHJveHkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dCgiaHR0cC5wcm94eVBvcnQiLCBwb3J0KTsKKworICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChpbWd1cmwpOworCisgICAgICAgICAgICAgICAgICAgIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXIgIT0gbnVsbCAmJiB1c2VyLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydGVkIGZyb20gc3VuIGludGVybmFsIGNsYXNzZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBCYXNlNjRDb252ZXJ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHV0aWxpdHkgY2xhc3MgZXh0cmFjdGVkIGZyb20gR2V0IHRhc2sKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkY3JlZHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCYXNlNjRDb252ZXJ0ZXIoKS5lbmNvZGUodXNlciArICI6IiArIHBhc3N3b3JkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJQcm94eS1BdXRob3JpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRjcmVkcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJodHRwLnByb3h5U2V0IiwgImZhbHNlIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJodHRwLnByb3h5SG9zdCIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoImh0dHAucHJveHlQb3J0IiwgIiIpOworICAgICAgICAgICAgICAgICAgICBsb2coIlVzaW5nIERpcmVjdGlvbiBIVFRQIENvbm5lY3Rpb24iLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGltZ3VybCk7CisgICAgICAgICAgICAgICAgICAgIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29ubi5zZXREb0lucHV0KHRydWUpOworICAgICAgICAgICAgICAgIGNvbm4uc2V0RG9PdXRwdXQoZmFsc2UpOworCisgICAgICAgICAgICAgICAgaW4gPSBjb25uLmdldElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgICAgICAgICAvLyBDYXRjaCBldmVyeXRoaW5nIC0gc29tZSBvZiB0aGUgYWJvdmUgcmV0dXJuIG51bGxzLAorICAgICAgICAgICAgICAgIC8vIHRocm93IGV4Y2VwdGlvbnMgb3IgZ2VuZXJhbGx5IG1pc2JlaGF2ZQorICAgICAgICAgICAgICAgIC8vIGluIHRoZSBldmVudCBvZiBhIHByb2JsZW0gZXRjCisKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBpb2UpIHsKKyAgICAgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBkb3dubG9hZCBpbWFnZSwgdHJ5aW5nIGRlZmF1bHQgQW50IExvZ28iLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgbG9nKCIoRXhjZXB0aW9uIHdhcyBcIiIgKyBpb2UuZ2V0TWVzc2FnZSgpICsgIlwiIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gU3BsYXNoVGFzay5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgaWYgKGNsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbiA9IGNsLmdldFJlc291cmNlQXNTdHJlYW0oImltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW4gPSBDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbSgiaW1hZ2VzL2FudF9sb2dvX2xhcmdlLmdpZiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGludCBkYXRhOworICAgICAgICAgICAgICAgIHdoaWxlICgoZGF0YSA9IGRpbi5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGJvdXQud3JpdGUoKGJ5dGUpIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxvZygiR290IEJ5dGVBcnJheSwgY3JlYXRpbmcgc3BsYXNoIiwgIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEltYWdlSWNvbiBpbWcgPSBuZXcgSW1hZ2VJY29uKGJvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIHNwbGFzaCA9IG5ldyBTcGxhc2hTY3JlZW4oaW1nKTsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nSGVhZGxlc3MoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGRpbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzd2FsbG93IGlmIHRoZXJlIHdhcyBhbiBlcnJvciBiZWZvcmUgc28gdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBlcnJvciB3aWxsIGJlIHBhc3NlZCB1cAorICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNwbGFzaCA9IG5ldyBTcGxhc2hTY3JlZW4oIkltYWdlIFVuYXZhaWxhYmxlLiIpOworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBsb2dIZWFkbGVzcyhlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBzcGxhc2guc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHNwbGFzaC50b0Zyb250KCk7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuYWRkQnVpbGRMaXN0ZW5lcihzcGxhc2gpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoc2hvd0R1cmF0aW9uKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgRXhjZXB0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nSGVhZGxlc3MoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgbG9nKCJmYWlsZWQgdG8gZGlzcGxheSBTcGxhc2hTY3JlZW4sIGNhdWdodCAiCisgICAgICAgICAgICArIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHdpdGggbWVzc2FnZTogIiArIGUuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0Fic3RyYWN0U3NoTWVzc2FnZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0Fic3RyYWN0U3NoTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZGJiODgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvQWJzdHJhY3RTc2hNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zc2g7CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbDsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbEV4ZWM7CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNlc3Npb247CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkNoYW5uZWxTZnRwOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5TZnRwUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBBYnN0cmFjdCBjbGFzcyBmb3Igc3NoIHVwbG9hZCBhbmQgZG93bmxvYWQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3NoTWVzc2FnZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIE9ORV9TRUNPTkQgPSAxMDAwLjA7CisKKyAgICBwcml2YXRlIFNlc3Npb24gc2Vzc2lvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZTsKKyAgICBwcml2YXRlIExvZ0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvZ0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmc7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIEFic3RyYWN0U3NoTWVzc2FnZQorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzc2ggc2Vzc2lvbiB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RTc2hNZXNzYWdlKFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICB0aGlzKGZhbHNlLCBzZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RTc2hNZXNzYWdlCisgICAgICogQHBhcmFtIHZlcmJvc2UgaWYgdHJ1ZSBkbyB2ZXJib3NlIGxvZ2dpbmcKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiB0aGUgc3NoIHNlc3Npb24gdG8gdXNlCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdFNzaE1lc3NhZ2UoYm9vbGVhbiB2ZXJib3NlLCBTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKKyAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGFuIHNzaCBjaGFubmVsLgorICAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIHVzZQorICAgICAqIEByZXR1cm4gdGhlIGNoYW5uZWwKKyAgICAgKiBAdGhyb3dzIEpTY2hFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2hhbm5lbCBvcGVuRXhlY0NoYW5uZWwoU3RyaW5nIGNvbW1hbmQpIHRocm93cyBKU2NoRXhjZXB0aW9uIHsKKyAgICAgICAgQ2hhbm5lbEV4ZWMgY2hhbm5lbCA9IChDaGFubmVsRXhlYykgc2Vzc2lvbi5vcGVuQ2hhbm5lbCgiZXhlYyIpOworICAgICAgICBjaGFubmVsLnNldENvbW1hbmQoY29tbWFuZCk7CisKKyAgICAgICAgcmV0dXJuIGNoYW5uZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiBhbiBzc2ggc2Z0cCBjaGFubmVsLgorICAgICAqIEByZXR1cm4gdGhlIGNoYW5uZWwKKyAgICAgKiBAdGhyb3dzIEpTY2hFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2hhbm5lbFNmdHAgb3BlblNmdHBDaGFubmVsKCkgdGhyb3dzIEpTY2hFeGNlcHRpb24geworICAgICAgICBDaGFubmVsU2Z0cCBjaGFubmVsID0gKENoYW5uZWxTZnRwKSBzZXNzaW9uLm9wZW5DaGFubmVsKCJzZnRwIik7CisKKyAgICAgICAgcmV0dXJuIGNoYW5uZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhbiBhY2suCisgICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IHN0cmVhbSB0byB1c2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VuZEFjayhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgIGJ1ZlswXSA9IDA7CisgICAgICAgIG91dC53cml0ZShidWYpOworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgcmVzcG9uc2UsIHRocm93cyBhIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSByZXNwb25zZQorICAgICAqIGluZGljYXRlcyBhbiBlcnJvci4KKyAgICAgKiBAcGFyYW0gaW4gdGhlIGlucHV0IHN0cmVhbSB0byB1c2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIEkvTyBlcnJvcgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gb3RoZXIgZXJyb3JzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvckFjayhJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBiID0gaW4ucmVhZCgpOworCisgICAgICAgIC8vIGIgbWF5IGJlIDAgZm9yIHN1Y2Nlc3MsCisgICAgICAgIC8vICAgICAgICAgIDEgZm9yIGVycm9yLAorICAgICAgICAvLyAgICAgICAgICAyIGZvciBmYXRhbCBlcnJvciwKKworICAgICAgICBpZiAoYiA9PSAtMSkgeworICAgICAgICAgICAgLy8gZGlkbid0IHJlY2VpdmUgYW55IHJlc3BvbnNlCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHJlc3BvbnNlIGZyb20gc2VydmVyIik7CisgICAgICAgIH0gZWxzZSBpZiAoYiAhPSAwKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgICAgIGludCBjID0gaW4ucmVhZCgpOworICAgICAgICAgICAgd2hpbGUgKGMgPiAwICYmIGMgIT0gJ1xuJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgYyk7CisgICAgICAgICAgICAgICAgYyA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGIgPT0gMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic2VydmVyIGluZGljYXRlZCBhbiBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChiID09IDIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNlcnZlciBpbmRpY2F0ZWQgYSBmYXRhbCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInVua25vd24gcmVzcG9uc2UsIGNvZGUgIiArIGIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1lc3NhZ2U6ICIgKyBzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhcnJ5IG91dCB0aGUgdHJhbnNmZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBJL08gZXJyb3JzCisgICAgICogQHRocm93cyBKU2NoRXhjZXB0aW9uIG9uIHNzaCBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IGEgbG9nIGxpc3RlbmVyLgorICAgICAqIEBwYXJhbSBhTGlzdGVuZXIgdGhlIGxvZyBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvZ0xpc3RlbmVyKExvZ0xpc3RlbmVyIGFMaXN0ZW5lcikgeworICAgICAgICBsaXN0ZW5lciA9IGFMaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBsb2cgbGlzdGVuZXIuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gbG9nCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGxpc3RlbmVyLmxvZyhtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgdHJhbnNmZXIgc3RhdHMgdG8gdGhlIGxvZyBsaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gdGltZVN0YXJ0ZWQgdGhlIHRpbWUgc3RhcnRlZAorICAgICAqIEBwYXJhbSB0aW1lRW5kZWQgICB0aGUgZmluaXNoaW5nIHRpbWUKKyAgICAgKiBAcGFyYW0gdG90YWxMZW5ndGggdGhlIHRvdGFsIGxlbmd0aAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvZ1N0YXRzKGxvbmcgdGltZVN0YXJ0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZUVuZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRvdGFsTGVuZ3RoKSB7CisgICAgICAgIGRvdWJsZSBkdXJhdGlvbiA9ICh0aW1lRW5kZWQgLSB0aW1lU3RhcnRlZCkgLyBPTkVfU0VDT05EOworICAgICAgICBOdW1iZXJGb3JtYXQgZm9ybWF0ID0gTnVtYmVyRm9ybWF0LmdldE51bWJlckluc3RhbmNlKCk7CisgICAgICAgIGZvcm1hdC5zZXRNYXhpbXVtRnJhY3Rpb25EaWdpdHMoMik7CisgICAgICAgIGZvcm1hdC5zZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoMSk7CisgICAgICAgIGxpc3RlbmVyLmxvZygiRmlsZSB0cmFuc2ZlciB0aW1lOiAiICsgZm9ybWF0LmZvcm1hdChkdXJhdGlvbikKKyAgICAgICAgICAgICsgIiBBdmVyYWdlIFJhdGU6ICIgKyBmb3JtYXQuZm9ybWF0KHRvdGFsTGVuZ3RoIC8gZHVyYXRpb24pCisgICAgICAgICAgICArICIgQi9zIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIHZlcmJvc2UgYXR0cmlidXRlIHNldC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZlcmJvc2UgYXR0cmlidXRlIGlzIHNldAorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBnZXRWZXJib3NlKCkgeworICAgICAgICByZXR1cm4gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFjayBwcm9ncmVzcyBldmVyeSAxMCUgaWYgMTAwa2IgPCBmaWxlc2l6ZSA8IDFtYi4gRm9yIGxhcmdlcgorICAgICAqIGZpbGVzIHRyYWNrIHByb2dyZXNzIGZvciBldmVyeSBwZXJjZW50IHRyYW5zbWl0dGVkLgorICAgICAqIEBwYXJhbSBmaWxlc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBiZWVuIHRyYW5zbWl0dGVkCisgICAgICogQHBhcmFtIHRvdGFsTGVuZ3RoIHRoZSB0b3RhbCB0cmFuc21pc3Npb24gc2l6ZQorICAgICAqIEBwYXJhbSBwZXJjZW50VHJhbnNtaXR0ZWQgdGhlIGN1cnJlbnQgcGVyY2VudCB0cmFuc21pdHRlZAorICAgICAqIEByZXR1cm4gdGhlIHBlcmNlbnQgdGhhdCB0aGUgZmlsZSBpcyBvZiB0aGUgdG90YWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHRyYWNrUHJvZ3Jlc3MobG9uZyBmaWxlc2l6ZSwgbG9uZyB0b3RhbExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmNlbnRUcmFuc21pdHRlZCkgeworCisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgIGludCBwZXJjZW50ID0gKGludCkgTWF0aC5yb3VuZChNYXRoLmZsb29yKCh0b3RhbExlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZG91YmxlKSBmaWxlc2l6ZSkgKiAxMDApKTsKKworICAgICAgICBpZiAocGVyY2VudCA+IHBlcmNlbnRUcmFuc21pdHRlZCkgeworICAgICAgICAgICAgaWYgKGZpbGVzaXplIDwgMTA0ODU3NikgeworICAgICAgICAgICAgICAgIGlmIChwZXJjZW50ICUgMTAgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGVyY2VudCA9PSAxMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIDEwMCUiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIioiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnQgPT0gNTApIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgNTAlIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID09IDEwMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAxMDAlIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisKKyAgICAgICAgcmV0dXJuIHBlcmNlbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByb2dyZXNzIG1vbml0b3IuCisgICAgICogQHJldHVybiB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2Z0cFByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7CisgICAgICAgIGlmIChtb25pdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIG1vbml0b3IgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vbml0b3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQcm9ncmVzc01vbml0b3IgaW1wbGVtZW50cyBTZnRwUHJvZ3Jlc3NNb25pdG9yIHsKKyAgICAgICAgcHJpdmF0ZSBsb25nIGluaXRGaWxlU2l6ZSA9IDA7CisgICAgICAgIHByaXZhdGUgbG9uZyB0b3RhbExlbmd0aCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IHBlcmNlbnRUcmFuc21pdHRlZCA9IDA7CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChpbnQgb3AsIFN0cmluZyBzcmMsIFN0cmluZyBkZXN0LCBsb25nIG1heCkgeworICAgICAgICAgICAgaW5pdEZpbGVTaXplID0gbWF4OworICAgICAgICAgICAgdG90YWxMZW5ndGggPSAwOworICAgICAgICAgICAgcGVyY2VudFRyYW5zbWl0dGVkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvdW50KGxvbmcgbGVuKSB7CisgICAgICAgICAgICB0b3RhbExlbmd0aCArPSBsZW47CisgICAgICAgICAgICBwZXJjZW50VHJhbnNtaXR0ZWQgPSB0cmFja1Byb2dyZXNzKGluaXRGaWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRUcmFuc21pdHRlZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldFRvdGFsTGVuZ3RoKCkgeworICAgICAgICAgICAgcmV0dXJuIHRvdGFsTGVuZ3RoOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0RpcmVjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0RpcmVjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMmI1YjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvRGlyZWN0b3J5LmphdmEKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zc2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBBIGhlbHBlciBvYmplY3QgZm9yIFNjcCByZXByZXNlbnRpbmcgYSBkaXJlY3RvcnkgaW4gYSBmaWxlIHN5c3RlbS4KKyAqLworcHVibGljIGNsYXNzIERpcmVjdG9yeSB7CisKKyAgICBwcml2YXRlIEZpbGUgZGlyZWN0b3J5OworICAgIHByaXZhdGUgQXJyYXlMaXN0IGNoaWxkRGlyZWN0b3JpZXM7CisgICAgcHJpdmF0ZSBBcnJheUxpc3QgZmlsZXM7CisgICAgcHJpdmF0ZSBEaXJlY3RvcnkgcGFyZW50OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIGEgRGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBkaXJlY3RvcnkgYSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIERpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgeworICAgICAgICB0aGlzKGRpcmVjdG9yeSwgIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBhIERpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IGEgZGlyZWN0b3J5CisgICAgICogQHBhcmFtIHBhcmVudCAgICBhIHBhcmVudCBEaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5ICwgRGlyZWN0b3J5IHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgdGhpcy5jaGlsZERpcmVjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0aGlzLmZpbGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGNoaWxkIGRpcmVjdG9yaWVzLgorICAgICAqIEBwYXJhbSBkaXJlY3RvcnkgYSBEaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoRGlyZWN0b3J5IGRpcmVjdG9yeSkgeworICAgICAgICBpZiAoIWNoaWxkRGlyZWN0b3JpZXMuY29udGFpbnMoZGlyZWN0b3J5KSkgeworICAgICAgICAgICAgY2hpbGREaXJlY3Rvcmllcy5hZGQoZGlyZWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbGUgdG8gdGhlIGxpc3Qgb2YgZmlsZXMuCisgICAgICogQHBhcmFtIGZpbGUgYSBmaWxlIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIGZpbGVzLmFkZChmaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgY2hpbGQgRGlyZWN0b3JpZXMuCisgICAgICogQHJldHVybiBhbiBpdGVyYXRvcgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBkaXJlY3RvcnlJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGNoaWxkRGlyZWN0b3JpZXMuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZmlsZXMuCisgICAgICogQHJldHVybiBhbiBpdGVyYXRvcgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBmaWxlc0l0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gZmlsZXMuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBhcmVudCBEaXJlY3RvcnkuCisgICAgICogQHJldHVybiB0aGUgcGFyZW50IERpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyZWN0b3J5IGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGEgcm9vdCBEaXJlY3Rvcnk/CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIG5vIHBhcmVudCBEaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQgPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRpcmVjdG9yeSBmaWxlLgorICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdG9yeSBmaWxlCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gZGlyZWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNoaWxkIGRpcmVjdG9yeSBvZiB0aGlzIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgdG8gbG9vayBmb3IKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZCBkaXJlY3RvcnksIG9yIG51bGwgaWYgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIERpcmVjdG9yeSBnZXRDaGlsZChGaWxlIGRpcikgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRGlyZWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIERpcmVjdG9yeSBjdXJyZW50ID0gKERpcmVjdG9yeSkgY2hpbGREaXJlY3Rvcmllcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoY3VycmVudC5nZXREaXJlY3RvcnkoKS5lcXVhbHMoZGlyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVxdWFsaXR5IG1ldGhvZC4KKyAgICAgKiBUaGlzIGNoZWNrcyBpZiB0aGUgZGlyZWN0b3J5IGZpZWxkIGlzIHRoZSBzYW1lLgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBjb21wYXJlIHRvCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgb2JqZWN0IGhhcyBhbiBlcXVhbCBkaXJlY3RvcnkgZmllbGQgYXMgdGhlIG90aGVyIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEaXJlY3RvcnkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBEaXJlY3RvcnkgZCA9IChEaXJlY3RvcnkpIG9iajsKKworICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RvcnkuZXF1YWxzKGQuZGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGFzaGNvZGUgbWV0aG9kLgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBvZiB0aGUgZGlyZWN0b3J5IGZpZWxkCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yeS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGF0aCBjb21wb25lbnRzIG9mIHRoaXMgZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4gdGhlIHBhdGggY29tcG9uZW50cyBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gZ2V0UGF0aChkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBmaWxlIHBhdGggdG8gYW4gYXJyYXkgb2YgcGF0aCBjb21wb25lbnRzLgorICAgICAqIFRoaXMgdXNlcyBGaWxlLnNlcGF0YXRvciB0byBzcGxpdCB0aGUgZmlsZSBwYXRoIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gdGhlUGF0aCB0aGUgZmlsZSBwYXRoIHN0cmluZyB0byBjb252ZXJ0CisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBwYXRoIGNvbXBvbmVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBhdGgoU3RyaW5nIHRoZVBhdGgpIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGhlUGF0aCwKKyAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIFN0cmluZ1tdIHBhdGggPSBuZXcgU3RyaW5nWyB0b2tlbml6ZXIuY291bnRUb2tlbnMoKSBdOworCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIHBhdGhbaV0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBmaWxlcyBpbiB0aGUgZmlsZXMgYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBpbnQgZmlsZVNpemUoKSB7CisgICAgICAgIHJldHVybiBmaWxlcy5zaXplKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0xvZ0xpc3RlbmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvTG9nTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjRlMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0xvZ0xpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNzaDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHNzaCBsb2cgbGlzdGVuZXJzIHRvIGltcGxlbWVudC4KKyAqLworcHVibGljIGludGVyZmFjZSBMb2dMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogTWV0aG9kIGZvciB0aGUgbG9nbGlzdGVuZXIgdG8gaW1wbGVtZW50IHRvIHJlY2lldmUgbG9nIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGxvZworICAgICAqLworICAgIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TU0hCYXNlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU1NIQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Mzk5OGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU1NIQmFzZS5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNlc3Npb247CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2g7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgQW50IHRhc2tzIHVzaW5nIGpzY2guCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNTSEJhc2UgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgTG9nTGlzdGVuZXIgeworCisgICAgLyoqIERlZmF1bHQgbGlzdGVuIHBvcnQgZm9yIFNTSCBkYWVtb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1NIX1BPUlQgPSAyMjsKKworICAgIHByaXZhdGUgU3RyaW5nIGhvc3Q7CisgICAgcHJpdmF0ZSBTdHJpbmcga25vd25Ib3N0czsKKyAgICBwcml2YXRlIGludCBwb3J0ID0gU1NIX1BPUlQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZTsKKyAgICBwcml2YXRlIFNTSFVzZXJJbmZvIHVzZXJJbmZvOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFNTSEJhc2UuCisgICAgICovCisgICAgcHVibGljIFNTSEJhc2UoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHVzZXJJbmZvID0gbmV3IFNTSFVzZXJJbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3RlIGhvc3QsIGVpdGhlciBETlMgbmFtZSBvciBJUC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0ICBUaGUgbmV3IGhvc3QgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBob3N0LgorICAgICAqIEByZXR1cm4gdGhlIGhvc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiBob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmFpbG9uZXJyb3IgZmxhZy4KKyAgICAgKiBEZWZhdWx0IGlzIHRydWUKKyAgICAgKiBAcGFyYW0gZmFpbHVyZSBpZiB0cnVlIHRocm93IGEgYnVpbGQgZXhjZXB0aW9uIHdoZW4gYSBmYWlsdXJlIG9jY3VyaWVzLAorICAgICAqICAgICAgICAgICAgICAgIG90aGVyd2lzZSBqdXN0IGxvZyB0aGUgZmFpbHVyZSBhbmQgY29udGludWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsb25lcnJvcihib29sZWFuIGZhaWx1cmUpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSBmYWlsdXJlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmFpbG9uZXJyb3IgZmxhZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBmYWlsb25lcnJvciBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RmFpbG9uZXJyb3IoKSB7CisgICAgICAgIHJldHVybiBmYWlsT25FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZlcmJvc2UgZmxhZy4KKyAgICAgKiBAcGFyYW0gdmVyYm9zZSBpZiB0cnVlIG91dHB1dCBtb3JlIHZlcmJvc2UgbG9nZ2luZworICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgeworICAgICAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmVyYm9zZSBmbGFnLgorICAgICAqIEByZXR1cm4gdGhlIHZlcmJvc2UgZmxhZworICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWZXJib3NlKCkgeworICAgICAgICByZXR1cm4gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VybmFtZSBrbm93biB0byByZW1vdGUgaG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSAgVGhlIG5ldyB1c2VybmFtZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICB1c2VySW5mby5zZXROYW1lKHVzZXJuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhc3N3b3JkIGZvciB0aGUgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXNzd29yZCAgVGhlIG5ldyBwYXNzd29yZCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB1c2VySW5mby5zZXRQYXNzd29yZChwYXNzd29yZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUga2V5ZmlsZSBmb3IgdGhlIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ZmlsZSAgVGhlIG5ldyBrZXlmaWxlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5ZmlsZShTdHJpbmcga2V5ZmlsZSkgeworICAgICAgICB1c2VySW5mby5zZXRLZXlmaWxlKGtleWZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhc3NwaHJhc2UgZm9yIHRoZSB1c2VycyBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3BocmFzZSAgVGhlIG5ldyBwYXNzcGhyYXNlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3BocmFzZShTdHJpbmcgcGFzc3BocmFzZSkgeworICAgICAgICB1c2VySW5mby5zZXRQYXNzcGhyYXNlKHBhc3NwaHJhc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhdGggdG8gdGhlIGZpbGUgdGhhdCBoYXMgdGhlIGlkZW50aXRpZXMgb2YKKyAgICAgKiBhbGwga25vd24gaG9zdHMuICBUaGlzIGlzIHVzZWQgYnkgU1NIIHByb3RvY29sIHRvIHZhbGlkYXRlCisgICAgICogdGhlIGlkZW50aXR5IG9mIHRoZSBob3N0LiAgVGhlIGRlZmF1bHQgaXMKKyAgICAgKiA8aT4ke3VzZXIuaG9tZX0vLnNzaC9rbm93bl9ob3N0czwvaT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga25vd25Ib3N0cyBhIHBhdGggdG8gdGhlIGtub3duIGhvc3RzIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S25vd25ob3N0cyhTdHJpbmcga25vd25Ib3N0cykgeworICAgICAgICB0aGlzLmtub3duSG9zdHMgPSBrbm93bkhvc3RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHRpbmcgdGhpcyB0byB0cnVlIHRydXN0cyBob3N0cyB3aG9zZSBpZGVudGl0eSBpcyB1bmtub3duLgorICAgICAqCisgICAgICogQHBhcmFtIHllc09yTm8gaWYgdHJ1ZSB0cnVzdCB0aGUgaWRlbnRpdHkgb2YgdW5rbm93biBob3N0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcnVzdChib29sZWFuIHllc09yTm8pIHsKKyAgICAgICAgdXNlckluZm8uc2V0VHJ1c3QoeWVzT3JObyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgcG9ydCB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBob3N0LgorICAgICAqCisgICAgICogQHBhcmFtIHBvcnQgcG9ydCBudW1iZXIgb2YgcmVtb3RlIGhvc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcG9ydCBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgcG9ydAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgdGFzay4KKyAgICAgKiBUaGlzIGluaXRpYWxpeml6cyB0aGUga25vd24gaG9zdHMgYW5kIHNldHMgdGhlIGRlZmF1bHQgcG9ydC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmluaXQoKTsKKyAgICAgICAgdGhpcy5rbm93bkhvc3RzID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArICIvLnNzaC9rbm93bl9ob3N0cyI7CisgICAgICAgIHRoaXMucG9ydCA9IFNTSF9QT1JUOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gYW4gc3NoIHNlZXNzaW9uLgorICAgICAqIEByZXR1cm4gdGhlIG9wZW5lZCBzZXNzaW9uCisgICAgICogQHRocm93cyBKU2NoRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlc3Npb24gb3BlblNlc3Npb24oKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CisgICAgICAgIEpTY2gganNjaCA9IG5ldyBKU2NoKCk7CisgICAgICAgIGlmIChudWxsICE9IHVzZXJJbmZvLmdldEtleWZpbGUoKSkgeworICAgICAgICAgICAganNjaC5hZGRJZGVudGl0eSh1c2VySW5mby5nZXRLZXlmaWxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF1c2VySW5mby5nZXRUcnVzdCgpICYmIGtub3duSG9zdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJVc2luZyBrbm93biBob3N0czogIiArIGtub3duSG9zdHMsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIGpzY2guc2V0S25vd25Ib3N0cyhrbm93bkhvc3RzKTsKKyAgICAgICAgfQorCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGpzY2guZ2V0U2Vzc2lvbih1c2VySW5mby5nZXROYW1lKCksIGhvc3QsIHBvcnQpOworICAgICAgICBzZXNzaW9uLnNldFVzZXJJbmZvKHVzZXJJbmZvKTsKKyAgICAgICAgbG9nKCJDb25uZWN0aW5nIHRvICIgKyBob3N0ICsgIjoiICsgcG9ydCk7CisgICAgICAgIHNlc3Npb24uY29ubmVjdCgpOworICAgICAgICByZXR1cm4gc2Vzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVzZXIgaW5mb3JtYXRpb24uCisgICAgICogQHJldHVybiB0aGUgdXNlciBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTU0hVc2VySW5mbyBnZXRVc2VySW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJJbmZvOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TU0hFeGVjLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU1NIRXhlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzE1MzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU1NIRXhlYy5qYXZhCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLktlZXBBbGl2ZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlRlZU91dHB1dFN0cmVhbTsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5DaGFubmVsRXhlYzsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Vzc2lvbjsKKworLyoqCisgKiBFeGVjdXRlcyBhIGNvbW1hbmQgb24gYSByZW1vdGUgbWFjaGluZSB2aWEgc3NoLgorICogQHNpbmNlICAgICBBbnQgMS42IChjcmVhdGVkIEZlYnJ1YXJ5IDIsIDIwMDMpCisgKi8KK3B1YmxpYyBjbGFzcyBTU0hFeGVjIGV4dGVuZHMgU1NIQmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA4MTkyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVRSWV9JTlRFUlZBTCA9IDUwMDsKKworICAgIC8qKiB0aGUgY29tbWFuZCB0byBleGVjdXRlIHZpYSBzc2ggKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21tYW5kID0gbnVsbDsKKworICAgIC8qKiB1bml0cyBhcmUgbWlsbGlzZWNvbmRzLCBkZWZhdWx0IGlzIDA9aW5maW5pdGUgKi8KKyAgICBwcml2YXRlIGxvbmcgbWF4d2FpdCA9IDA7CisKKyAgICAvKiogZm9yIHdhaXRpbmcgZm9yIHRoZSBjb21tYW5kIHRvIGZpbmlzaCAqLworICAgIHByaXZhdGUgVGhyZWFkIHRocmVhZCA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRQcm9wZXJ0eSA9IG51bGw7ICAgLy8gbGlrZSA8ZXhlYz4KKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0RmlsZSA9IG51bGw7ICAgLy8gbGlrZSA8ZXhlYz4KKyAgICBwcml2YXRlIGJvb2xlYW4gYXBwZW5kID0gZmFsc2U7ICAgLy8gbGlrZSA8ZXhlYz4KKworICAgIHByaXZhdGUgUmVzb3VyY2UgY29tbWFuZFJlc291cmNlID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FT1VUX01FU1NBR0UgPQorICAgICAgICAiVGltZW91dCBwZXJpb2QgZXhjZWVkZWQsIGNvbm5lY3Rpb24gZHJvcHBlZC4iOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFNTSEV4ZWNUYXNrLgorICAgICAqLworICAgIHB1YmxpYyBTU0hFeGVjKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSBvbiB0aGUgcmVtb3RlIGhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWFuZCAgVGhlIG5ldyBjb21tYW5kIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChTdHJpbmcgY29tbWFuZCkgeworICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBjb21tYW5kUmVzb3VyY2UgZnJvbSBhIGZpbGUKKyAgICAgKiBAcGFyYW0gZiB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqIEBzaW5jZSBBbnQgMS43LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kUmVzb3VyY2UoU3RyaW5nIGYpIHsKKyAgICAgICAgdGhpcy5jb21tYW5kUmVzb3VyY2UgPSBuZXcgRmlsZVJlc291cmNlKG5ldyBGaWxlKGYpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiBjYW4gYmUgZHJvcHBlZCBhZnRlciBhIHNwZWNpZmllZCBudW1iZXIgb2YKKyAgICAgKiBtaWxsaXNlY29uZHMuIFRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCB3aGVuIGEgY29ubmVjdGlvbiBtYXkgYmUKKyAgICAgKiBmbGFreS4gRGVmYXVsdCBpcyAwLCB3aGljaCBtZWFucyAmcXVvdDt3YWl0IGZvcmV2ZXImcXVvdDsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCAgVGhlIG5ldyB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGxvbmcgdGltZW91dCkgeworICAgICAgICBtYXh3YWl0ID0gdGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB1c2VkLCBzdG9yZXMgdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCB0byB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRwdXQgIFRoZSBmaWxlIHRvIHdyaXRlIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChGaWxlIG91dHB1dCkgeworICAgICAgICBvdXRwdXRGaWxlID0gb3V0cHV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIG91dHB1dCBpcyBhcHBlbmRlZCB0byB0aGUgZmlsZSBnaXZlbiBpbgorICAgICAqIDxjb2RlPnNldE91dHB1dDwvY29kZT4uIERlZmF1bHQgaXMgZmFsc2UsIHRoYXQgaXMsIG92ZXJ3cml0ZQorICAgICAqIHRoZSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGVuZCAgVHJ1ZSB0byBhcHBlbmQgdG8gYW4gZXhpc3RpbmcgZmlsZSwgZmFsc2UgdG8gb3ZlcndyaXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcGVuZChib29sZWFuIGFwcGVuZCkgeworICAgICAgICB0aGlzLmFwcGVuZCA9IGFwcGVuZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQsIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGdpdmVuIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5ICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaW4gd2hpY2ggdGhlIGNvbW1hbmQgb3V0cHV0CisgICAgICogICAgICB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRwcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgb3V0cHV0UHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kIG9uIHRoZSByZW1vdGUgaG9zdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gIE1vc3QgbGlrZWx5IGEgbmV0d29yayBlcnJvciBvciBiYWQgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0SG9zdCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSG9zdCBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0VXNlckluZm8oKS5nZXROYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVc2VybmFtZSBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0VXNlckluZm8oKS5nZXRLZXlmaWxlKCkgPT0gbnVsbAorICAgICAgICAgICAgJiYgZ2V0VXNlckluZm8oKS5nZXRQYXNzd29yZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUGFzc3dvcmQgb3IgS2V5ZmlsZSBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsICYmIGNvbW1hbmRSZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvbW1hbmQgb3IgY29tbWFuZFJlc291cmNlIGlzIHJlcXVpcmVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2Vzc2lvbiA9IG9wZW5TZXNzaW9uKCk7CisgICAgICAgICAgICAvKiBjYWxsZWQgb25jZSAqLworICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygiY21kIDogIiArIGNvbW1hbmQsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBleGVjdXRlQ29tbWFuZChzZXNzaW9uLCBjb21tYW5kKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0UHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyNidWd6aWxsYSA0MzQzNworICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkob3V0cHV0UHJvcGVydHksIGNvbW1hbmQgKyAiIDogIiArIG91dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gcmVhZCBjb21tYW5kIHJlc291cmNlIGFuZCBleGVjdXRlIGZvciBlYWNoIGNvbW1hbmQKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29tbWFuZFJlc291cmNlLmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNtZDsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dCA9ICIiOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNtZCA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiY21kIDogIiArIGNtZCwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gZXhlY3V0ZUNvbW1hbmQoc2Vzc2lvbiwgY21kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBjbWQgKyAiIDogIiArIG91dCArICJcbiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vI2J1Z3ppbGxhIDQzNDM3CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkob3V0cHV0UHJvcGVydHksIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGJyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEpTY2hFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCAmJiBzZXNzaW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4ZWN1dGVDb21tYW5kKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIGNtZCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgVGVlT3V0cHV0U3RyZWFtIHRlZSA9IG5ldyBUZWVPdXRwdXRTdHJlYW0ob3V0LCBuZXcgS2VlcEFsaXZlT3V0cHV0U3RyZWFtKFN5c3RlbS5vdXQpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEV4ZWMgY2hhbm5lbDsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0VGltZW91dCgoaW50KSBtYXh3YWl0KTsKKyAgICAgICAgICAgIC8qIGV4ZWN1dGUgdGhlIGNvbW1hbmQgKi8KKyAgICAgICAgICAgIGNoYW5uZWwgPSAoQ2hhbm5lbEV4ZWMpIHNlc3Npb24ub3BlbkNoYW5uZWwoImV4ZWMiKTsKKyAgICAgICAgICAgIGNoYW5uZWwuc2V0Q29tbWFuZChjbWQpOworICAgICAgICAgICAgY2hhbm5lbC5zZXRPdXRwdXRTdHJlYW0odGVlKTsKKyAgICAgICAgICAgIGNoYW5uZWwuc2V0RXh0T3V0cHV0U3RyZWFtKHRlZSk7CisgICAgICAgICAgICBjaGFubmVsLmNvbm5lY3QoKTsKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIGl0IHRvIGZpbmlzaAorICAgICAgICAgICAgdGhyZWFkID0KKyAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIWNoYW5uZWwuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKFJFVFJZX0lOVEVSVkFMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICB0aHJlYWQuam9pbihtYXh3YWl0KTsKKworICAgICAgICAgICAgaWYgKHRocmVhZC5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyByYW4gb3V0IG9mIHRpbWUKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChnZXRGYWlsb25lcnJvcigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihUSU1FT1VUX01FU1NBR0UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyhUSU1FT1VUX01FU1NBR0UsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL3N1Y2Nlc3MKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVG9GaWxlKG91dC50b1N0cmluZygpLCBhcHBlbmQsIG91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHdyb25nIHRlc3QgaWYgdGhlIHJlbW90ZSBPUyBpcyBPcGVuVk1TLAorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSB3YXkgdG8gZGV0ZWN0IGl0LgorICAgICAgICAgICAgICAgIGludCBlYyA9IGNoYW5uZWwuZ2V0RXhpdFN0YXR1cygpOworICAgICAgICAgICAgICAgIGlmIChlYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUmVtb3RlIGNvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBzdGF0dXMgIiArIGVjOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RmFpbG9uZXJyb3IoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChKU2NoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJzZXNzaW9uIGlzIGRvd24iKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldEZhaWxvbmVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFRJTUVPVVRfTUVTU0FHRSwgZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKFRJTUVPVVRfTUVTU0FHRSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChnZXRGYWlsb25lcnJvcigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coIkNhdWdodCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGdldEZhaWxvbmVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc3RyaW5nIHRvIGEgZmlsZS4gSWYgZGVzdGluYXRpb24gZmlsZSBleGlzdHMsIGl0IG1heSBiZQorICAgICAqIG92ZXJ3cml0dGVuIGRlcGVuZGluZyBvbiB0aGUgImFwcGVuZCIgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbSAgICAgICAgICAgc3RyaW5nIHRvIHdyaXRlCisgICAgICogQHBhcmFtIHRvICAgICAgICAgICAgIGZpbGUgdG8gd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gYXBwZW5kICAgICAgICAgaWYgdHJ1ZSwgYXBwZW5kIHRvIGV4aXN0aW5nIGZpbGUsIGVsc2Ugb3ZlcndyaXRlCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gIG1vc3QgbGlrZWx5IGFuIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVG9GaWxlKFN0cmluZyBmcm9tLCBib29sZWFuIGFwcGVuZCwgRmlsZSB0bykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVXcml0ZXIodG8uZ2V0QWJzb2x1dGVQYXRoKCksIGFwcGVuZCk7CisgICAgICAgICAgICBTdHJpbmdSZWFkZXIgaW4gPSBuZXcgU3RyaW5nUmVhZGVyKGZyb20pOworICAgICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCA9IGluLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU1NIVXNlckluZm8uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TU0hVc2VySW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjlmMTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU1NIVXNlckluZm8uamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNzaDsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5Vc2VySW5mbzsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guVUlLZXlib2FyZEludGVyYWN0aXZlOworCisvKioKKyAqIENsYXNzIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gYW4gU1NIIHVzZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBTU0hVc2VySW5mbyBpbXBsZW1lbnRzIFVzZXJJbmZvLCBVSUtleWJvYXJkSW50ZXJhY3RpdmUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcga2V5ZmlsZTsKKyAgICBwcml2YXRlIFN0cmluZyBwYXNzcGhyYXNlID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdHJ1c3RBbGxDZXJ0aWZpY2F0ZXM7CisKKyAgICAvKiogQ29uc3RydWN0b3IgZm9yIFNTSFVzZXJJbmZvLiAqLworICAgIHB1YmxpYyBTU0hVc2VySW5mbygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy50cnVzdEFsbENlcnRpZmljYXRlcyA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBTU0hVc2VySW5mby4KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgdGhlIHVzZXIncyBwYXNzd29yZAorICAgICAqIEBwYXJhbSB0cnVzdEFsbENlcnRpZmljYXRlcyBpZiB0cnVlIHRydXN0IGhvc3RzIHdob3NlIGlkZW50aXR5IGlzIHVua25vd24KKyAgICAgKi8KKyAgICBwdWJsaWMgU1NIVXNlckluZm8oU3RyaW5nIHBhc3N3b3JkLCBib29sZWFuIHRydXN0QWxsQ2VydGlmaWNhdGVzKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgdGhpcy50cnVzdEFsbENlcnRpZmljYXRlcyA9IHRydXN0QWxsQ2VydGlmaWNhdGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVzZXIgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VyIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBhc3MgcGhyYXNlIG9mIHRoZSB1c2VyLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZQorICAgICAqIEByZXR1cm4gdGhlIHBhc3NwaHJhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3NwaHJhc2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIHBhc3NwaHJhc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdXNlcidzIHBhc3N3b3JkLgorICAgICAqIEByZXR1cm4gdGhlIHVzZXIncyBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiBwYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9tcHRzIGEgc3RyaW5nLgorICAgICAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZworICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgc3RyaW5nIHdhcyBwcm9tcHRlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHByb21wdChTdHJpbmcgc3RyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhIHJldHJ5IHdhcyBkb25lLgorICAgICAqIEByZXR1cm4gd2hldGhlciBhIHJldHJ5IHdhcyBkb25lCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmV0cnkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lLgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXNzcGhyYXNlLgorICAgICAqIEBwYXJhbSBwYXNzcGhyYXNlIFRoZSBwYXNzcGhyYXNlIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3NwaHJhc2UoU3RyaW5nIHBhc3NwaHJhc2UpIHsKKyAgICAgICAgdGhpcy5wYXNzcGhyYXNlID0gcGFzc3BocmFzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXNzd29yZC4KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdHJ1c3QuCisgICAgICogQHBhcmFtIHRydXN0IHdoZXRoZXIgdG8gdHJ1c3Qgb3Igbm90LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRydXN0KGJvb2xlYW4gdHJ1c3QpIHsKKyAgICAgICAgdGhpcy50cnVzdEFsbENlcnRpZmljYXRlcyA9IHRydXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gd2hldGhlciB0byB0cnVzdCBvciBub3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJ1c3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRydXN0QWxsQ2VydGlmaWNhdGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhc3NwaHJhc2UuCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3NwaHJhc2UoKSB7CisgICAgICAgIHJldHVybiBwYXNzcGhyYXNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGtleWZpbGUuCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEtleWZpbGUoKSB7CisgICAgICAgIHJldHVybiBrZXlmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGtleWZpbGUuCisgICAgICogQHBhcmFtIGtleWZpbGUgVGhlIGtleWZpbGUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5ZmlsZShTdHJpbmcga2V5ZmlsZSkgeworICAgICAgICB0aGlzLmtleWZpbGUgPSBrZXlmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgVXNlckluZm8gaW50ZXJmYWNlLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIGlnbm9yZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcHJvbXB0UGFzc3BocmFzZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFVzZXJJbmZvIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmRQcm9tcHQgaWdub3JlZAorICAgICAqIEByZXR1cm4gdHJ1ZSB0aGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcHJvbXB0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkUHJvbXB0KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgVXNlckluZm8gaW50ZXJmYWNlLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIGlnbm9yZWQKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0cnVzdEFsbENlcnRpZmljYXRlcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHByb21wdFllc05vKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJldHVybiB0cnVzdEFsbENlcnRpZmljYXRlczsKKyAgICB9CisKKy8vd2h5IGRvIHdlIGRvIG5vdGhpbmc/CisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBVc2VySW5mbyBpbnRlcmZhY2UgKG5vb3ApLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIGlnbm9yZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAvL2xvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgVUlLZXlib2FyZEludGVyYWN0aXZlI3Byb21wdEtleWJvYXJkSW50ZXJhY3RpdmUuCisgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIG5vdCB1c2VkLgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgICBub3QgdXNlZC4KKyAgICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb24gbm90IHVzZWQuCisgICAgICogQHBhcmFtIHByb21wdCAgICAgIHRoZSBtZXRob2QgY2hlY2tzIGlmIHRoaXMgaXMgb25lIGluIGxlbmd0aC4KKyAgICAgKiBAcGFyYW0gZWNobyAgICAgICAgdGhlIG1ldGhvZCBjaGVja3MgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgZmFsc2UuCisgICAgICogQHJldHVybiB0aGUgcGFzc3dvcmQgaW4gYW4gc2l6ZSBvbmUgYXJyYXkgaWYgdGhlcmUgaXMgYSBwYXNzd29yZAorICAgICAqICAgICAgICAgYW5kIGlmIHRoZSBwcm9tcHQgYW5kIGVjaG8gY2hlY2tzIHBhc3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIHByb21wdEtleWJvYXJkSW50ZXJhY3RpdmUoU3RyaW5nIGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnN0cnVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9tcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbltdIGVjaG8pIHsKKyAgICAgICAgaWYgKHByb21wdC5sZW5ndGggIT0gMSB8fCBlY2hvWzBdIHx8IHRoaXMucGFzc3dvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gcmVzcG9uc2UgPSBuZXcgU3RyaW5nWzFdOworICAgICAgICByZXNwb25zZVswXSA9IHRoaXMucGFzc3dvcmQ7CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3AuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3AuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzhkNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcC5qYXZhCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNlc3Npb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CisKKy8qKgorICogQW50IHRhc2sgZm9yIHNlbmRpbmcgZmlsZXMgdG8gcmVtb3RlIG1hY2hpbmUgb3ZlciBzc2gvc2NwLgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBTY3AgZXh0ZW5kcyBTU0hCYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZST01fQVRUUlMgPSB7CisgICAgICAgICJmaWxlIiwgImxvY2FsZmlsZSIsICJyZW1vdGVmaWxlIiB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVE9fQVRUUlMgPSB7CisgICAgICAgICJ0b2RpciIsICJsb2NhbHRvZGlyIiwgInJlbW90ZXRvZGlyIiwgImxvY2FsdG9maWxlIiwgInJlbW90ZXRvZmlsZSIgfTsKKworICAgIHByaXZhdGUgU3RyaW5nIGZyb21Vcmk7CisgICAgcHJpdmF0ZSBTdHJpbmcgdG9Vcmk7CisgICAgcHJpdmF0ZSBMaXN0IGZpbGVTZXRzID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNGcm9tUmVtb3RlLCBpc1RvUmVtb3RlOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NmdHAgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpbGUgdG8gYmUgdHJhbnNmZXJyZWQuICBUaGlzIGNhbiBlaXRoZXIgYmUgYSByZW1vdGUKKyAgICAgKiBmaWxlIG9yIGEgbG9jYWwgZmlsZS4gIFJlbW90ZSBmaWxlcyB0YWtlIHRoZSBmb3JtOjxicj4KKyAgICAgKiA8aT51c2VyOnBhc3N3b3JkQGhvc3Q6L2RpcmVjdG9yeS9wYXRoL2ZpbGUuZXhhbXBsZTwvaT48YnI+CisgICAgICogRmlsZXMgdG8gdHJhbnNmZXIgY2FuIGFsc28gaW5jbHVkZSBhIHdpbGRjYXJkIHRvIGluY2x1ZGUgYWxsCisgICAgICogZmlsZXMgaW4gYSByZW1vdGUgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGU6PGJyPgorICAgICAqIDxpPnVzZXI6cGFzc3dvcmRAaG9zdDovZGlyZWN0b3J5L3BhdGgvKjwvaT48YnI+CisgICAgICogQHBhcmFtIGFGcm9tVXJpIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmlsZSB0byB0cmFuc2Zlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKFN0cmluZyBhRnJvbVVyaSkgeworICAgICAgICBzZXRGcm9tVXJpKGFGcm9tVXJpKTsKKyAgICAgICAgdGhpcy5pc0Zyb21SZW1vdGUgPSBpc1JlbW90ZVVyaSh0aGlzLmZyb21VcmkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIHdoZXJlIGZpbGVzIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8uCisgICAgICogVGhpcyBjYW4gZWl0aGVyIGJlIGEgcmVtb3RlIGRpcmVjdG9yeSBvciBhIGxvY2FsIGRpcmVjdG9yeS4KKyAgICAgKiBSZW1vdGUgZGlyZWN0b3JpZXMgdGFrZSB0aGUgZm9ybSBvZjo8YnI+CisgICAgICogPGk+dXNlcjpwYXNzd29yZEBob3N0Oi9kaXJlY3RvcnkvcGF0aC88L2k+PGJyPgorICAgICAqIFRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorCisgICAgICogQHBhcmFtIGFUb1VyaSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRhcmdldCBvZiB0aGUgY29weS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb2RpcihTdHJpbmcgYVRvVXJpKSB7CisgICAgICAgIHNldFRvVXJpKGFUb1VyaSk7CisgICAgICAgIHRoaXMuaXNUb1JlbW90ZSA9IGlzUmVtb3RlVXJpKHRoaXMudG9VcmkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbWlsaWFyIHRvIHtAbGluayAjc2V0RmlsZSBzZXRGaWxlfSBidXQgZXhwbGljaXRseSBzdGF0ZXMgdGhhdAorICAgICAqIHRoZSBmaWxlIGlzIGEgbG9jYWwgZmlsZS4gIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIHNwZWNpZnkgYQorICAgICAqIGxvY2FsIGZpbGUgd2l0aCBhIEAgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSBhRnJvbVVyaSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNvdXJjZSBvZiB0aGUgY29weS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxGaWxlKFN0cmluZyBhRnJvbVVyaSkgeworICAgICAgICBzZXRGcm9tVXJpKGFGcm9tVXJpKTsKKyAgICAgICAgdGhpcy5pc0Zyb21SZW1vdGUgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1pbGlhciB0byB7QGxpbmsgI3NldEZpbGUgc2V0RmlsZX0gYnV0IGV4cGxpY2l0bHkgc3RhdGVzIHRoYXQKKyAgICAgKiB0aGUgZmlsZSBpcyBhIHJlbW90ZSBmaWxlLgorICAgICAqIEBwYXJhbSBhRnJvbVVyaSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNvdXJjZSBvZiB0aGUgY29weS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlRmlsZShTdHJpbmcgYUZyb21VcmkpIHsKKyAgICAgICAgc2V0RnJvbVVyaShhRnJvbVVyaSk7CisgICAgICAgIHRoaXMuaXNGcm9tUmVtb3RlID0gdHJ1ZTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogU2ltaWxpYXIgdG8ge0BsaW5rICNzZXRUb2RpciBzZXRUb2Rpcn0gYnV0IGV4cGxpY2l0bHkgc3RhdGVzCisgICAgICogdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGEgbG9jYWwuICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byBzcGVjaWZ5CisgICAgICogYSBsb2NhbCBkaXJlY3Rvcnkgd2l0aCBhIEAgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSBhVG9VcmkgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgb2YgdGhlIGNvcHkuCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsVG9kaXIoU3RyaW5nIGFUb1VyaSkgeworICAgICAgICBzZXRUb1VyaShhVG9VcmkpOworICAgICAgICB0aGlzLmlzVG9SZW1vdGUgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1pbGlhciB0byB7QGxpbmsgI3NldFRvZGlyIHNldFRvZGlyfSBidXQgZXhwbGljaXRseSBzdGF0ZXMKKyAgICAgKiB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgYSByZW1vdGUuCisgICAgICogQHBhcmFtIGFUb1VyaSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRhcmdldCBvZiB0aGUgY29weS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVG9kaXIoU3RyaW5nIGFUb1VyaSkgeworICAgICAgICBzZXRUb1VyaShhVG9VcmkpOworICAgICAgICB0aGlzLmlzVG9SZW1vdGUgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoYW5nZXMgdGhlIGZpbGUgbmFtZSB0byB0aGUgZ2l2ZW4gbmFtZSB3aGlsZSByZWNlaXZpbmcgaXQsCisgICAgICogb25seSB1c2VmdWwgaWYgcmVjZWl2aW5nIGEgc2luZ2xlIGZpbGUuCisgICAgICogQHBhcmFtIGFUb1VyaSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRhcmdldCBvZiB0aGUgY29weS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxUb2ZpbGUoU3RyaW5nIGFUb1VyaSkgeworICAgICAgICBzZXRUb1VyaShhVG9VcmkpOworICAgICAgICB0aGlzLmlzVG9SZW1vdGUgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2VzIHRoZSBmaWxlIG5hbWUgdG8gdGhlIGdpdmVuIG5hbWUgd2hpbGUgc2VuZGluZyBpdCwKKyAgICAgKiBvbmx5IHVzZWZ1bCBpZiBzZW5kaW5nIGEgc2luZ2xlIGZpbGUuCisgICAgICogQHBhcmFtIGFUb1VyaSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRhcmdldCBvZiB0aGUgY29weS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVG9maWxlKFN0cmluZyBhVG9VcmkpIHsKKyAgICAgICAgc2V0VG9VcmkoYVRvVXJpKTsKKyAgICAgICAgdGhpcy5pc1RvUmVtb3RlID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXR0aW5nIHRoaXMgdG8gdHJ1ZSB0byB1c2Ugc2Z0cCBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB5ZXNPck5vIGlmIHRydWUgc2Z0cCBwcm90b2NvbCB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Z0cChib29sZWFuIHllc09yTm8pIHsKKyAgICAgICAgaXNTZnRwID0geWVzT3JObzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgRmlsZVNldCB0cmFuZmVyIHRvIHJlbW90ZSBob3N0LiAgTk9URTogRWl0aGVyCisgICAgICogYWRkRmlsZVNldCgpIG9yIHNldEZpbGUoKSBhcmUgcmVxdWlyZWQuICBCdXQsIG5vdCBib3RoLgorICAgICAqCisgICAgICogQHBhcmFtIHNldCBGaWxlU2V0IHRvIHNlbmQgdG8gcmVtb3RlIGhvc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBpZiAoZmlsZVNldHMgPT0gbnVsbCkgeworICAgICAgICAgICAgZmlsZVNldHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICB9CisgICAgICAgIGZpbGVTZXRzLmFkZChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhpcyB0YXNrLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuaW5pdCgpOworICAgICAgICB0aGlzLnRvVXJpID0gbnVsbDsKKyAgICAgICAgdGhpcy5mcm9tVXJpID0gbnVsbDsKKyAgICAgICAgdGhpcy5maWxlU2V0cyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGlzIHRhc2suCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodG9VcmkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgZXhhY3RseU9uZShUT19BVFRSUyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyb21VcmkgPT0gbnVsbCAmJiBmaWxlU2V0cyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBleGFjdGx5T25lKEZST01fQVRUUlMsICJvbmUgb3IgbW9yZSBuZXN0ZWQgZmlsZXNldHMiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGlzRnJvbVJlbW90ZSAmJiAhaXNUb1JlbW90ZSkgeworICAgICAgICAgICAgICAgIGRvd25sb2FkKGZyb21VcmksIHRvVXJpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRnJvbVJlbW90ZSAmJiBpc1RvUmVtb3RlKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVTZXRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdXBsb2FkKGZpbGVTZXRzLCB0b1VyaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdXBsb2FkKGZyb21VcmksIHRvVXJpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRnJvbVJlbW90ZSAmJiBpc1RvUmVtb3RlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ29weWluZyBmcm9tIGEgcmVtb3RlIHNlcnZlciB0byBhIHJlbW90ZSBzZXJ2ZXIgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIndG9kaXInIGFuZCAnZmlsZScgYXR0cmlidXRlcyAiCisgICAgICAgICAgICAgICAgICAgICsgIm11c3QgaGF2ZSBzeW50YXggbGlrZSB0aGUgZm9sbG93aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICsgInVzZXI6cGFzc3dvcmRAaG9zdDovcGF0aCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGdldEZhaWxvbmVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkKFN0cmluZyBmcm9tU3NoVXJpLCBTdHJpbmcgdG9QYXRoKQorICAgICAgICB0aHJvd3MgSlNjaEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZmlsZSA9IHBhcnNlVXJpKGZyb21Tc2hVcmkpOworCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXNzaW9uID0gb3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgIFNjcEZyb21NZXNzYWdlIG1lc3NhZ2UgPSBudWxsOworICAgICAgICAgICAgaWYgKCFpc1NmdHApIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFNjcEZyb21NZXNzYWdlKGdldFZlcmJvc2UoKSwgc2Vzc2lvbiwgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSh0b1BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNzaFVyaS5lbmRzV2l0aCgiKiIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBTY3BGcm9tTWVzc2FnZUJ5U2Z0cChnZXRWZXJib3NlKCksIHNlc3Npb24sIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUodG9QYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Tc2hVcmkuZW5kc1dpdGgoIioiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIlJlY2VpdmluZyBmaWxlOiAiICsgZmlsZSk7CisgICAgICAgICAgICBtZXNzYWdlLnNldExvZ0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbWVzc2FnZS5leGVjdXRlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBsb2FkKExpc3QgZmlsZVNldCwgU3RyaW5nIHRvU3NoVXJpKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEpTY2hFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZmlsZSA9IHBhcnNlVXJpKHRvU3NoVXJpKTsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChmaWxlU2V0LnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWxlU2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEZpbGVTZXQgc2V0ID0gKEZpbGVTZXQpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIERpcmVjdG9yeSBkID0gY3JlYXRlRGlyZWN0b3J5KHNldCk7CisgICAgICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IG9wZW5TZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgU2NwVG9NZXNzYWdlIG1lc3NhZ2UgPSBudWxsOworICAgICAgICAgICAgICAgIGlmICghaXNTZnRwKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2NwVG9NZXNzYWdlKGdldFZlcmJvc2UoKSwgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgZmlsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG5ldyBTY3BUb01lc3NhZ2VCeVNmdHAoZ2V0VmVyYm9zZSgpLCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LCBmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRMb2dMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGxvYWQoU3RyaW5nIGZyb21QYXRoLCBTdHJpbmcgdG9Tc2hVcmkpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSlNjaEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBmaWxlID0gcGFyc2VVcmkodG9Tc2hVcmkpOworCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXNzaW9uID0gb3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgIFNjcFRvTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgICAgIGlmICghaXNTZnRwKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBTY3BUb01lc3NhZ2UoZ2V0VmVyYm9zZSgpLCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShmcm9tUGF0aCksIGZpbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFNjcFRvTWVzc2FnZUJ5U2Z0cChnZXRWZXJib3NlKCksIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGZyb21QYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0TG9nTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBtZXNzYWdlLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHBhcnNlVXJpKFN0cmluZyB1cmkpIHsKKworICAgICAgICBpbnQgaW5kZXhPZkF0ID0gdXJpLmluZGV4T2YoJ0AnKTsKKyAgICAgICAgaW50IGluZGV4T2ZDb2xvbiA9IHVyaS5pbmRleE9mKCc6Jyk7CisKKyAgICAgICAgaWYgKGluZGV4T2ZDb2xvbiA+IC0xICYmIGluZGV4T2ZDb2xvbiA8IGluZGV4T2ZBdCkgeworICAgICAgICAgICAgLy8gdXNlcjpwYXNzd29yZEBob3N0Oi9wYXRoIG5vdGF0aW9uCisgICAgICAgICAgICAvLyBldmVyeXRoaW5nIHVwdG8gdGhlIGxhc3QgQCBiZWZvcmUgdGhlIGxhc3QgOiBpcyBjb25zaWRlcmVkCisgICAgICAgICAgICAvLyBwYXNzd29yZC4gKHNvIGlmIHRoZSBwYXRoIGNvbnRhaW5zIGFuIEAgYW5kIGEgOiBpdCB3aWxsIG5vdCB3b3JrKQorICAgICAgICAgICAgaW50IGluZGV4T2ZDdXJyZW50QXQgPSBpbmRleE9mQXQ7CisgICAgICAgICAgICBpbnQgaW5kZXhPZkxhc3RDb2xvbiA9IHVyaS5sYXN0SW5kZXhPZignOicpOworICAgICAgICAgICAgd2hpbGUgKGluZGV4T2ZDdXJyZW50QXQgPiAtMSAmJiBpbmRleE9mQ3VycmVudEF0IDwgaW5kZXhPZkxhc3RDb2xvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleE9mQXQgPSBpbmRleE9mQ3VycmVudEF0OworICAgICAgICAgICAgICAgIGluZGV4T2ZDdXJyZW50QXQgPSB1cmkuaW5kZXhPZignQCcsIGluZGV4T2ZDdXJyZW50QXQgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFVzZXJuYW1lKHVyaS5zdWJzdHJpbmcoMCwgaW5kZXhPZkNvbG9uKSk7CisgICAgICAgICAgICBzZXRQYXNzd29yZCh1cmkuc3Vic3RyaW5nKGluZGV4T2ZDb2xvbiArIDEsIGluZGV4T2ZBdCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm8gcGFzc3dvcmQsIHdpbGwgcmVxdWlyZSBwYXNzcGhyYXNlCisgICAgICAgICAgICBzZXRVc2VybmFtZSh1cmkuc3Vic3RyaW5nKDAsIGluZGV4T2ZBdCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldFVzZXJJbmZvKCkuZ2V0UGFzc3dvcmQoKSA9PSBudWxsCisgICAgICAgICAgICAmJiBnZXRVc2VySW5mbygpLmdldFBhc3NwaHJhc2UoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5laXRoZXIgcGFzc3dvcmQgbm9yIHBhc3NwaHJhc2UgZm9yIHVzZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0VXNlckluZm8oKS5nZXROYW1lKCkgKyAiIGhhcyBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJnaXZlbi4gIENhbid0IGF1dGhlbnRpY2F0ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpbmRleE9mUGF0aCA9IHVyaS5pbmRleE9mKCc6JywgaW5kZXhPZkF0ICsgMSk7CisgICAgICAgIGlmIChpbmRleE9mUGF0aCA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJubyByZW1vdGUgcGF0aCBpbiAiICsgdXJpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldEhvc3QodXJpLnN1YnN0cmluZyhpbmRleE9mQXQgKyAxLCBpbmRleE9mUGF0aCkpOworICAgICAgICBTdHJpbmcgcmVtb3RlUGF0aCA9IHVyaS5zdWJzdHJpbmcoaW5kZXhPZlBhdGggKyAxKTsKKyAgICAgICAgaWYgKHJlbW90ZVBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgcmVtb3RlUGF0aCA9ICIuIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtb3RlUGF0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNSZW1vdGVVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICBib29sZWFuIGlzUmVtb3RlID0gdHJ1ZTsKKyAgICAgICAgaW50IGluZGV4T2ZBdCA9IHVyaS5pbmRleE9mKCdAJyk7CisgICAgICAgIGlmIChpbmRleE9mQXQgPCAwKSB7CisgICAgICAgICAgICBpc1JlbW90ZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpc1JlbW90ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIERpcmVjdG9yeSBjcmVhdGVEaXJlY3RvcnkoRmlsZVNldCBzZXQpIHsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gc2V0LmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgRGlyZWN0b3J5IHJvb3QgPSBuZXcgRGlyZWN0b3J5KHNjYW5uZXIuZ2V0QmFzZWRpcigpKTsKKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcGF0aCA9IERpcmVjdG9yeS5nZXRQYXRoKGZpbGVzW2pdKTsKKyAgICAgICAgICAgICAgICBEaXJlY3RvcnkgY3VycmVudCA9IHJvb3Q7CisgICAgICAgICAgICAgICAgRmlsZSBjdXJyZW50UGFyZW50ID0gc2Nhbm5lci5nZXRCYXNlZGlyKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRQYXJlbnQsIHBhdGhbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZERpcmVjdG9yeShuZXcgRGlyZWN0b3J5KGZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmdldENoaWxkKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IGN1cnJlbnQuZ2V0RGlyZWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGRGaWxlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2tpcAorICAgICAgICAgICAgcm9vdCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEZyb21VcmkoU3RyaW5nIGZyb21VcmkpIHsKKyAgICAgICAgaWYgKHRoaXMuZnJvbVVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBleGFjdGx5T25lKEZST01fQVRUUlMpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZnJvbVVyaSA9IGZyb21Vcmk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFRvVXJpKFN0cmluZyB0b1VyaSkgeworICAgICAgICBpZiAodGhpcy50b1VyaSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBleGFjdGx5T25lKFRPX0FUVFJTKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRvVXJpID0gdG9Vcmk7CisgICAgfQorCisgICAgcHJpdmF0ZSBCdWlsZEV4Y2VwdGlvbiBleGFjdGx5T25lKFN0cmluZ1tdIGF0dHJzKSB7CisgICAgICAgIHJldHVybiBleGFjdGx5T25lKGF0dHJzLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ1aWxkRXhjZXB0aW9uIGV4YWN0bHlPbmUoU3RyaW5nW10gYXR0cnMsIFN0cmluZyBhbHQpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIkV4YWN0bHkgb25lIG9mICIpLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAnWycpLmFwcGVuZChhdHRyc1swXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ3wnKS5hcHBlbmQoYXR0cnNbaV0pOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoJ10nKTsKKyAgICAgICAgaWYgKGFsdCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgb3IgIikuYXBwZW5kKGFsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZEV4Y2VwdGlvbihidWYuYXBwZW5kKCIgaXMgcmVxdWlyZWQuIikudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcEZyb21NZXNzYWdlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwRnJvbU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDUwNDAwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcEZyb21NZXNzYWdlLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zc2g7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Vzc2lvbjsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbDsKKworLyoqCisgKiBBIGhlbHBlciBvYmplY3QgcmVwcmVzZW50aW5nIGFuIHNjcCBkb3dubG9hZC4KKyAqLworcHVibGljIGNsYXNzIFNjcEZyb21NZXNzYWdlIGV4dGVuZHMgQWJzdHJhY3RTc2hNZXNzYWdlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVU5EUkVEX0tJTE9CWVRFUyA9IDEwMjQwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIExJTkVfRkVFRCA9IDB4MGE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAyNDsKKworICAgIHByaXZhdGUgU3RyaW5nIHJlbW90ZUZpbGU7CisgICAgcHJpdmF0ZSBGaWxlIGxvY2FsRmlsZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWN1cnNpdmUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBTY3BGcm9tTWVzc2FnZQorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzc2ggc2Vzc2lvbiB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU2NwRnJvbU1lc3NhZ2UoU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIHN1cGVyKHNlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBTY3BGcm9tTWVzc2FnZQorICAgICAqIEBwYXJhbSB2ZXJib3NlIGlmIHRydWUgZG8gdmVyYm9zZSBsb2dnaW5nCisgICAgICogQHBhcmFtIHNlc3Npb24gdGhlIHNzaCBzZXNzaW9uIHRvIHVzZQorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFNjcEZyb21NZXNzYWdlKGJvb2xlYW4gdmVyYm9zZSwgU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIHN1cGVyKHZlcmJvc2UsIHNlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBTY3BGcm9tTWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gdmVyYm9zZSBpZiB0cnVlIGxvZyBleHRyYSBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBTY3Agc2Vzc2lvbiB0byB1c2UKKyAgICAgKiBAcGFyYW0gYVJlbW90ZUZpbGUgdGhlIHJlbW90ZSBmaWxlIG5hbWUKKyAgICAgKiBAcGFyYW0gYUxvY2FsRmlsZSAgdGhlIGxvY2FsIGZpbGUKKyAgICAgKiBAcGFyYW0gcmVjdXJzaXZlICAgaWYgdHJ1ZSB1c2UgcmVjdXJzaW9uICgtciBvcHRpb24gdG8gc2NwKQorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgU2NwRnJvbU1lc3NhZ2UoYm9vbGVhbiB2ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhUmVtb3RlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBhTG9jYWxGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlY3Vyc2l2ZSkgeworICAgICAgICBzdXBlcih2ZXJib3NlLCBzZXNzaW9uKTsKKyAgICAgICAgdGhpcy5yZW1vdGVGaWxlID0gYVJlbW90ZUZpbGU7CisgICAgICAgIHRoaXMubG9jYWxGaWxlID0gYUxvY2FsRmlsZTsKKyAgICAgICAgdGhpcy5pc1JlY3Vyc2l2ZSA9IHJlY3Vyc2l2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2NwRnJvbU1lc3NhZ2UuCisgICAgICogQHBhcmFtIHNlc3Npb24gdGhlIFNjcCBzZXNzaW9uIHRvIHVzZQorICAgICAqIEBwYXJhbSBhUmVtb3RlRmlsZSB0aGUgcmVtb3RlIGZpbGUgbmFtZQorICAgICAqIEBwYXJhbSBhTG9jYWxGaWxlICB0aGUgbG9jYWwgZmlsZQorICAgICAqIEBwYXJhbSByZWN1cnNpdmUgICBpZiB0cnVlIHVzZSByZWN1cnNpb24gKC1yIG9wdGlvbiB0byBzY3ApCisgICAgICovCisgICAgcHVibGljIFNjcEZyb21NZXNzYWdlKFNlc3Npb24gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhUmVtb3RlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgYUxvY2FsRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgIHRoaXMoZmFsc2UsIHNlc3Npb24sIGFSZW1vdGVGaWxlLCBhTG9jYWxGaWxlLCByZWN1cnNpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhcnJ5IG91dCB0aGUgdHJhbnNmZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBpL28gZXJyb3JzCisgICAgICogQHRocm93cyBKU2NoRXhjZXB0aW9uIG9uIGVycm9ycyBkZXRlY3RlZCBieSBzY3AKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAic2NwIC1mICI7CisgICAgICAgIGlmIChpc1JlY3Vyc2l2ZSkgeworICAgICAgICAgICAgY29tbWFuZCArPSAiLXIgIjsKKyAgICAgICAgfQorICAgICAgICBjb21tYW5kICs9IHJlbW90ZUZpbGU7CisgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IG9wZW5FeGVjQ2hhbm5lbChjb21tYW5kKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGdldCBJL08gc3RyZWFtcyBmb3IgcmVtb3RlIHNjcAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IGNoYW5uZWwuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGNoYW5uZWwuZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgY2hhbm5lbC5jb25uZWN0KCk7CisKKyAgICAgICAgICAgIHNlbmRBY2sob3V0KTsKKyAgICAgICAgICAgIHN0YXJ0UmVtb3RlQ3BQcm90b2NvbChpbiwgb3V0LCBsb2NhbEZpbGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoYW5uZWwuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZygiZG9uZVxuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UmVtb3RlQ3BQcm90b2NvbChJbnB1dFN0cmVhbSBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzdGFydEZpbGUgPSBsb2NhbEZpbGU7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAvLyBDMDY0NCBmaWxlc2l6ZSBmaWxlbmFtZSAtIGhlYWRlciBmb3IgYSByZWd1bGFyIGZpbGUKKyAgICAgICAgICAgIC8vIFQgdGltZSAwIHRpbWUgMFxuIC0gcHJlc2VudCBpZiBwZXJzZXJ2ZSB0aW1lLgorICAgICAgICAgICAgLy8gRCBkaXJlY3RvcnkgLSB0aGlzIGlzIHRoZSBoZWFkZXIgZm9yIGEgZGlyZWN0b3J5LgorICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IHJlYWQgPSBpbi5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChieXRlKSByZWFkID09IExJTkVfRkVFRCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKHJlYWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHNlcnZlclJlc3BvbnNlID0gc3RyZWFtLnRvU3RyaW5nKCJVVEYtOCIpOworICAgICAgICAgICAgaWYgKHNlcnZlclJlc3BvbnNlLmNoYXJBdCgwKSA9PSAnQycpIHsKKyAgICAgICAgICAgICAgICBwYXJzZUFuZEZldGNoRmlsZShzZXJ2ZXJSZXNwb25zZSwgc3RhcnRGaWxlLCBvdXQsIGluKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyUmVzcG9uc2UuY2hhckF0KDApID09ICdEJykgeworICAgICAgICAgICAgICAgIHN0YXJ0RmlsZSA9IHBhcnNlQW5kQ3JlYXRlRGlyZWN0b3J5KHNlcnZlclJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRGaWxlKTsKKyAgICAgICAgICAgICAgICBzZW5kQWNrKG91dCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZlclJlc3BvbnNlLmNoYXJBdCgwKSA9PSAnRScpIHsKKyAgICAgICAgICAgICAgICBzdGFydEZpbGUgPSBzdGFydEZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgIHNlbmRBY2sob3V0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyUmVzcG9uc2UuY2hhckF0KDApID09ICdcMDEnCisgICAgICAgICAgICAgICAgICAgIHx8IHNlcnZlclJlc3BvbnNlLmNoYXJBdCgwKSA9PSAnXDAyJykgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgaW5kaWNhdGVzIGFuIGVycm9yLgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihzZXJ2ZXJSZXNwb25zZS5zdWJzdHJpbmcoMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlIHBhcnNlQW5kQ3JlYXRlRGlyZWN0b3J5KFN0cmluZyBzZXJ2ZXJSZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBsb2NhbEZpbGUpIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gc2VydmVyUmVzcG9uc2UuaW5kZXhPZigiICIpOworICAgICAgICAvLyBhcHBlYXJzIHRoYXQgdGhlIG5leHQgdG9rZW4gaXMgbm90IHVzZWQgYW5kIGl0J3MgemVyby4KKyAgICAgICAgc3RhcnQgPSBzZXJ2ZXJSZXNwb25zZS5pbmRleE9mKCIgIiwgc3RhcnQgKyAxKTsKKyAgICAgICAgU3RyaW5nIGRpcmVjdG9yeU5hbWUgPSBzZXJ2ZXJSZXNwb25zZS5zdWJzdHJpbmcoc3RhcnQgKyAxKTsKKyAgICAgICAgaWYgKGxvY2FsRmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGxvY2FsRmlsZSwgZGlyZWN0b3J5TmFtZSk7CisgICAgICAgICAgICBkaXIubWtkaXIoKTsKKyAgICAgICAgICAgIGxvZygiQ3JlYXRpbmc6ICIgKyBkaXIpOworICAgICAgICAgICAgcmV0dXJuIGRpcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VBbmRGZXRjaEZpbGUoU3RyaW5nIHNlcnZlclJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGludCBlbmQgPSBzZXJ2ZXJSZXNwb25zZS5pbmRleE9mKCIgIiwgc3RhcnQgKyAxKTsKKyAgICAgICAgc3RhcnQgPSBlbmQgKyAxOworICAgICAgICBlbmQgPSBzZXJ2ZXJSZXNwb25zZS5pbmRleE9mKCIgIiwgc3RhcnQgKyAxKTsKKyAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IExvbmcucGFyc2VMb25nKHNlcnZlclJlc3BvbnNlLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHNlcnZlclJlc3BvbnNlLnN1YnN0cmluZyhlbmQgKyAxKTsKKyAgICAgICAgbG9nKCJSZWNlaXZpbmc6ICIgKyBmaWxlbmFtZSArICIgOiAiICsgZmlsZXNpemUpOworICAgICAgICBGaWxlIHRyYW5zZmVyRmlsZSA9IChsb2NhbEZpbGUuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgICAgICA/IG5ldyBGaWxlKGxvY2FsRmlsZSwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgOiBsb2NhbEZpbGU7CisgICAgICAgIGZldGNoRmlsZSh0cmFuc2ZlckZpbGUsIGZpbGVzaXplLCBvdXQsIGluKTsKKyAgICAgICAgd2FpdEZvckFjayhpbik7CisgICAgICAgIHNlbmRBY2sob3V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmV0Y2hGaWxlKEZpbGUgbG9jYWxGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZmlsZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgc2VuZEFjayhvdXQpOworCisgICAgICAgIC8vIHJlYWQgYSBjb250ZW50IG9mIGxmaWxlCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obG9jYWxGaWxlKTsKKyAgICAgICAgaW50IGxlbmd0aDsKKyAgICAgICAgbG9uZyB0b3RhbExlbmd0aCA9IDA7CisgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gb25seSB0cmFjayBwcm9ncmVzcyBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gMTAwa2IgaW4gdmVyYm9zZSBtb2RlCisgICAgICAgIGJvb2xlYW4gdHJhY2tQcm9ncmVzcyA9IGdldFZlcmJvc2UoKSAmJiBmaWxlc2l6ZSA+IEhVTkRSRURfS0lMT0JZVEVTOworICAgICAgICAvLyBzaW5jZSBmaWxlc2l6ZSBrZWVwcyBvbiBkZWNyZWFzaW5nIHdlIGhhdmUgdG8gc3RvcmUgdGhlCisgICAgICAgIC8vIGluaXRpYWwgZmlsZXNpemUKKyAgICAgICAgbG9uZyBpbml0RmlsZXNpemUgPSBmaWxlc2l6ZTsKKyAgICAgICAgaW50IHBlcmNlbnRUcmFuc21pdHRlZCA9IDA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gaW4ucmVhZChidWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlVGRkVSX1NJWkUgPCBmaWxlc2l6ZSkgPyBCVUZGRVJfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludCkgZmlsZXNpemUpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmaWxlc2l6ZSAtPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgdG90YWxMZW5ndGggKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmIChmaWxlc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0cmFja1Byb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRUcmFuc21pdHRlZCA9IHRyYWNrUHJvZ3Jlc3MoaW5pdEZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRUcmFuc21pdHRlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBsb2dTdGF0cyhzdGFydFRpbWUsIGVuZFRpbWUsIHRvdGFsTGVuZ3RoKTsKKyAgICAgICAgICAgIGZvcy5mbHVzaCgpOworICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BGcm9tTWVzc2FnZUJ5U2Z0cC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcEZyb21NZXNzYWdlQnlTZnRwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1NGIwOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BGcm9tTWVzc2FnZUJ5U2Z0cC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Vzc2lvbjsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbFNmdHA7CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNmdHBFeGNlcHRpb247CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNmdHBBVFRSUzsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Z0cFByb2dyZXNzTW9uaXRvcjsKKworLyoqCisgKiBBIGhlbHBlciBvYmplY3QgcmVwcmVzZW50aW5nIGFuIHNjcCBkb3dubG9hZC4KKyAqLworcHVibGljIGNsYXNzIFNjcEZyb21NZXNzYWdlQnlTZnRwIGV4dGVuZHMgU2NwRnJvbU1lc3NhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhVTkRSRURfS0lMT0JZVEVTID0gMTAyNDAwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3RlRmlsZTsKKyAgICBwcml2YXRlIEZpbGUgbG9jYWxGaWxlOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlY3Vyc2l2ZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2NwRnJvbU1lc3NhZ2VCeVNmdHAuCisgICAgICogQHBhcmFtIHZlcmJvc2UgaWYgdHJ1ZSBsb2cgZXh0cmEgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiB0aGUgU2NwIHNlc3Npb24gdG8gdXNlCisgICAgICogQHBhcmFtIGFSZW1vdGVGaWxlIHRoZSByZW1vdGUgZmlsZSBuYW1lCisgICAgICogQHBhcmFtIGFMb2NhbEZpbGUgIHRoZSBsb2NhbCBmaWxlCisgICAgICogQHBhcmFtIHJlY3Vyc2l2ZSAgIGlmIHRydWUgdXNlIHJlY3Vyc2lvbgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFNjcEZyb21NZXNzYWdlQnlTZnRwKGJvb2xlYW4gdmVyYm9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYVJlbW90ZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgYUxvY2FsRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZWN1cnNpdmUpIHsKKyAgICAgICAgc3VwZXIodmVyYm9zZSwgc2Vzc2lvbik7CisgICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7CisgICAgICAgIHRoaXMucmVtb3RlRmlsZSA9IGFSZW1vdGVGaWxlOworICAgICAgICB0aGlzLmxvY2FsRmlsZSA9IGFMb2NhbEZpbGU7CisgICAgICAgIHRoaXMuaXNSZWN1cnNpdmUgPSByZWN1cnNpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFNjcEZyb21NZXNzYWdlQnlTZnRwLgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBTY3Agc2Vzc2lvbiB0byB1c2UKKyAgICAgKiBAcGFyYW0gYVJlbW90ZUZpbGUgdGhlIHJlbW90ZSBmaWxlIG5hbWUKKyAgICAgKiBAcGFyYW0gYUxvY2FsRmlsZSAgdGhlIGxvY2FsIGZpbGUKKyAgICAgKiBAcGFyYW0gcmVjdXJzaXZlICAgaWYgdHJ1ZSB1c2UgcmVjdXJzaW9uCisgICAgICovCisgICAgcHVibGljIFNjcEZyb21NZXNzYWdlQnlTZnRwKFNlc3Npb24gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFSZW1vdGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGFMb2NhbEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgIHRoaXMoZmFsc2UsIHNlc3Npb24sIGFSZW1vdGVGaWxlLCBhTG9jYWxGaWxlLCByZWN1cnNpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhcnJ5IG91dCB0aGUgdHJhbnNmZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBpL28gZXJyb3JzCisgICAgICogQHRocm93cyBKU2NoRXhjZXB0aW9uIG9uIGVycm9ycyBkZXRlY3RlZCBieSBzY3AKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKKyAgICAgICAgQ2hhbm5lbFNmdHAgY2hhbm5lbCA9IG9wZW5TZnRwQ2hhbm5lbCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbC5jb25uZWN0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNmdHBBVFRSUyBhdHRycyA9IGNoYW5uZWwuc3RhdChyZW1vdGVGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cnMuaXNEaXIoKSAmJiAhcmVtb3RlRmlsZS5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZUZpbGUgPSByZW1vdGVGaWxlICsgIi8iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFNmdHBFeGNlcHRpb24gZWUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXREaXIoY2hhbm5lbCwgcmVtb3RlRmlsZSwgbG9jYWxGaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoU2Z0cEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSlNjaEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoYW5uZWwuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZygiZG9uZVxuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldERpcihDaGFubmVsU2Z0cCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbW90ZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBTZnRwRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHB3ZCA9IHJlbW90ZUZpbGU7CisgICAgICAgIGlmIChyZW1vdGVGaWxlLmxhc3RJbmRleE9mKCcvJykgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChyZW1vdGVGaWxlLmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgIHB3ZCA9IHJlbW90ZUZpbGUuc3Vic3RyaW5nKDAsIHJlbW90ZUZpbGUubGFzdEluZGV4T2YoJy8nKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2hhbm5lbC5jZChwd2QpOworICAgICAgICBpZiAoIWxvY2FsRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbG9jYWxGaWxlLm1rZGlycygpOworICAgICAgICB9CisgICAgICAgIGphdmEudXRpbC5WZWN0b3IgZmlsZXMgPSBjaGFubmVsLmxzKHJlbW90ZUZpbGUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBDaGFubmVsU2Z0cC5Mc0VudHJ5IGxlID0gKENoYW5uZWxTZnRwLkxzRW50cnkpIGZpbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbGUuZ2V0RmlsZW5hbWUoKTsKKyAgICAgICAgICAgIGlmIChsZS5nZXRBdHRycygpLmlzRGlyKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIi4iKSB8fCBuYW1lLmVxdWFscygiLi4iKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2V0RGlyKGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwucHdkKCkgKyAiLyIgKyBuYW1lICsgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShsb2NhbEZpbGUsIGxlLmdldEZpbGVuYW1lKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2V0RmlsZShjaGFubmVsLCBsZSwgbG9jYWxGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjaGFubmVsLmNkKCIuLiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRGaWxlKENoYW5uZWxTZnRwIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFNmdHAuTHNFbnRyeSBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBTZnRwRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJlbW90ZUZpbGUgPSBsZS5nZXRGaWxlbmFtZSgpOworICAgICAgICBpZiAoIWxvY2FsRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBpbnQgaSA9IHBhdGgubGFzdEluZGV4T2YoRmlsZS5wYXRoU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGlmIChpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPiBGaWxlLnBhdGhTZXBhcmF0b3IubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUocGF0aC5zdWJzdHJpbmcoMCwgaSkpLm1rZGlycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NhbEZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxGaWxlLCByZW1vdGVGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgdG90YWxMZW5ndGggPSBsZS5nZXRBdHRycygpLmdldFNpemUoKTsKKworICAgICAgICBTZnRwUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBudWxsOworICAgICAgICBib29sZWFuIHRyYWNrUHJvZ3Jlc3MgPSBnZXRWZXJib3NlKCkgJiYgdG90YWxMZW5ndGggPiBIVU5EUkVEX0tJTE9CWVRFUzsKKyAgICAgICAgaWYgKHRyYWNrUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIG1vbml0b3IgPSBnZXRQcm9ncmVzc01vbml0b3IoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nKCJSZWNlaXZpbmc6ICIgKyByZW1vdGVGaWxlICsgIiA6ICIgKyBsZS5nZXRBdHRycygpLmdldFNpemUoKSk7CisgICAgICAgICAgICBjaGFubmVsLmdldChyZW1vdGVGaWxlLCBsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIG1vbml0b3IpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBsb2dTdGF0cyhzdGFydFRpbWUsIGVuZFRpbWUsIChpbnQpIHRvdGFsTGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BUb01lc3NhZ2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BUb01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFjODQzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcFRvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkNoYW5uZWw7CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNlc3Npb247CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBjYXJyeSBvdXQgYW4gdXBsb2FkIHNjcCB0cmFuc2Zlci4KKyAqLworcHVibGljIGNsYXNzIFNjcFRvTWVzc2FnZSBleHRlbmRzIEFic3RyYWN0U3NoTWVzc2FnZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFVORFJFRF9LSUxPQllURVMgPSAxMDI0MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAyNDsKKworICAgIHByaXZhdGUgRmlsZSBsb2NhbEZpbGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3RlUGF0aDsKKyAgICBwcml2YXRlIExpc3QgZGlyZWN0b3J5TGlzdDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBTY3BUb01lc3NhZ2UKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiB0aGUgc3NoIHNlc3Npb24gdG8gdXNlCisgICAgICovCisgICAgcHVibGljIFNjcFRvTWVzc2FnZShTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgc3VwZXIoc2Vzc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFNjcFRvTWVzc2FnZQorICAgICAqIEBwYXJhbSB2ZXJib3NlIGlmIHRydWUgZG8gdmVyYm9zZSBsb2dnaW5nCisgICAgICogQHBhcmFtIHNlc3Npb24gdGhlIHNzaCBzZXNzaW9uIHRvIHVzZQorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFNjcFRvTWVzc2FnZShib29sZWFuIHZlcmJvc2UsIFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBzdXBlcih2ZXJib3NlLCBzZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBsb2NhbCBmaWxlIHRvIHJlbW90ZS4KKyAgICAgKiBAcGFyYW0gdmVyYm9zZSBpZiB0cnVlIGRvIHZlcmJvc2UgbG9nZ2luZworICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzY3Agc2Vzc2lvbiB0byB1c2UKKyAgICAgKiBAcGFyYW0gYUxvY2FsRmlsZSB0aGUgbG9jYWwgZmlsZQorICAgICAqIEBwYXJhbSBhUmVtb3RlUGF0aCB0aGUgcmVtb3RlIHBhdGgKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHVibGljIFNjcFRvTWVzc2FnZShib29sZWFuIHZlcmJvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGFMb2NhbEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYVJlbW90ZVBhdGgpIHsKKyAgICAgICAgdGhpcyh2ZXJib3NlLCBzZXNzaW9uLCBhUmVtb3RlUGF0aCk7CisKKyAgICAgICAgdGhpcy5sb2NhbEZpbGUgPSBhTG9jYWxGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBhIGxvY2FsIGRpcmVjdG9yaWVzIHRvIHJlbW90ZS4KKyAgICAgKiBAcGFyYW0gdmVyYm9zZSBpZiB0cnVlIGRvIHZlcmJvc2UgbG9nZ2luZworICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzY3Agc2Vzc2lvbiB0byB1c2UKKyAgICAgKiBAcGFyYW0gYURpcmVjdG9yeUxpc3QgYSBsaXN0IG9mIGRpcmVjdG9yaWVzCisgICAgICogQHBhcmFtIGFSZW1vdGVQYXRoIHRoZSByZW1vdGUgcGF0aAorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgU2NwVG9NZXNzYWdlKGJvb2xlYW4gdmVyYm9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgYURpcmVjdG9yeUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYVJlbW90ZVBhdGgpIHsKKyAgICAgICAgdGhpcyh2ZXJib3NlLCBzZXNzaW9uLCBhUmVtb3RlUGF0aCk7CisKKyAgICAgICAgdGhpcy5kaXJlY3RvcnlMaXN0ID0gYURpcmVjdG9yeUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFNjcFRvTWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gdmVyYm9zZSBpZiB0cnVlIGRvIHZlcmJvc2UgbG9nZ2luZworICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzY3Agc2Vzc2lvbiB0byB1c2UKKyAgICAgKiBAcGFyYW0gYVJlbW90ZVBhdGggdGhlIHJlbW90ZSBwYXRoCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHByaXZhdGUgU2NwVG9NZXNzYWdlKGJvb2xlYW4gdmVyYm9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFSZW1vdGVQYXRoKSB7CisgICAgICAgIHN1cGVyKHZlcmJvc2UsIHNlc3Npb24pOworICAgICAgICB0aGlzLnJlbW90ZVBhdGggPSBhUmVtb3RlUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2NwVG9NZXNzYWdlLgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzY3Agc2Vzc2lvbiB0byB1c2UKKyAgICAgKiBAcGFyYW0gYUxvY2FsRmlsZSB0aGUgbG9jYWwgZmlsZQorICAgICAqIEBwYXJhbSBhUmVtb3RlUGF0aCB0aGUgcmVtb3RlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgU2NwVG9NZXNzYWdlKFNlc3Npb24gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgYUxvY2FsRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhUmVtb3RlUGF0aCkgeworICAgICAgICB0aGlzKGZhbHNlLCBzZXNzaW9uLCBhTG9jYWxGaWxlLCBhUmVtb3RlUGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFNjcFRvTWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiB0aGUgc2NwIHNlc3Npb24gdG8gdXNlCisgICAgICogQHBhcmFtIGFEaXJlY3RvcnlMaXN0IGEgbGlzdCBvZiBkaXJlY3RvcmllcworICAgICAqIEBwYXJhbSBhUmVtb3RlUGF0aCB0aGUgcmVtb3RlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgU2NwVG9NZXNzYWdlKFNlc3Npb24gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGFEaXJlY3RvcnlMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhUmVtb3RlUGF0aCkgeworICAgICAgICB0aGlzKGZhbHNlLCBzZXNzaW9uLCBhRGlyZWN0b3J5TGlzdCwgYVJlbW90ZVBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhcnJ5IG91dCB0aGUgdHJhbnNmZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBpL28gZXJyb3JzCisgICAgICogQHRocm93cyBKU2NoRXhjZXB0aW9uIG9uIGVycm9ycyBkZXRlY3RlZCBieSBzY3AKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRpcmVjdG9yeUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9NdWx0aXBsZVRyYW5zZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvY2FsRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBkb1NpbmdsZVRyYW5zZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJkb25lLlxuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvU2luZ2xlVHJhbnNmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTY2hFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY21kID0gInNjcCAtdCAiICsgcmVtb3RlUGF0aDsKKyAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gb3BlbkV4ZWNDaGFubmVsKGNtZCk7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBjaGFubmVsLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBjaGFubmVsLmdldElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgICAgIGNoYW5uZWwuY29ubmVjdCgpOworCisgICAgICAgICAgICB3YWl0Rm9yQWNrKGluKTsKKyAgICAgICAgICAgIHNlbmRGaWxlVG9SZW1vdGUobG9jYWxGaWxlLCBpbiwgb3V0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb011bHRpcGxlVHJhbnNmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTY2hFeGNlcHRpb24geworICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBvcGVuRXhlY0NoYW5uZWwoInNjcCAtciAtZCAtdCAiICsgcmVtb3RlUGF0aCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gY2hhbm5lbC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gY2hhbm5lbC5nZXRJbnB1dFN0cmVhbSgpOworCisgICAgICAgICAgICBjaGFubmVsLmNvbm5lY3QoKTsKKworICAgICAgICAgICAgd2FpdEZvckFjayhpbik7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkaXJlY3RvcnlMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIERpcmVjdG9yeSBjdXJyZW50ID0gKERpcmVjdG9yeSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgc2VuZERpcmVjdG9yeShjdXJyZW50LCBpbiwgb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kRGlyZWN0b3J5KERpcmVjdG9yeSBjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgZmlsZUl0ID0gY3VycmVudC5maWxlc0l0ZXJhdG9yKCk7IGZpbGVJdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBzZW5kRmlsZVRvUmVtb3RlKChGaWxlKSBmaWxlSXQubmV4dCgpLCBpbiwgb3V0KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGRpckl0ID0gY3VycmVudC5kaXJlY3RvcnlJdGVyYXRvcigpOyBkaXJJdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBEaXJlY3RvcnkgZGlyID0gKERpcmVjdG9yeSkgZGlySXQubmV4dCgpOworICAgICAgICAgICAgc2VuZERpcmVjdG9yeVRvUmVtb3RlKGRpciwgaW4sIG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZERpcmVjdG9yeVRvUmVtb3RlKERpcmVjdG9yeSBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAiRDA3NTUgMCAiOworICAgICAgICBjb21tYW5kICs9IGRpcmVjdG9yeS5nZXREaXJlY3RvcnkoKS5nZXROYW1lKCk7CisgICAgICAgIGNvbW1hbmQgKz0gIlxuIjsKKworICAgICAgICBvdXQud3JpdGUoY29tbWFuZC5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisKKyAgICAgICAgd2FpdEZvckFjayhpbik7CisgICAgICAgIHNlbmREaXJlY3RvcnkoZGlyZWN0b3J5LCBpbiwgb3V0KTsKKyAgICAgICAgb3V0LndyaXRlKCJFXG4iLmdldEJ5dGVzKCkpOworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgd2FpdEZvckFjayhpbik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRGaWxlVG9SZW1vdGUoRmlsZSBsb2NhbEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBzZW5kICJDMDY0NCBmaWxlc2l6ZSBmaWxlbmFtZSIsIHdoZXJlIGZpbGVuYW1lIHNob3VsZCBub3QgaW5jbHVkZSAnLycKKyAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IGxvY2FsRmlsZS5sZW5ndGgoKTsKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAiQzA2NDQgIiArIGZpbGVzaXplICsgIiAiOworICAgICAgICBjb21tYW5kICs9IGxvY2FsRmlsZS5nZXROYW1lKCk7CisgICAgICAgIGNvbW1hbmQgKz0gIlxuIjsKKworICAgICAgICBvdXQud3JpdGUoY29tbWFuZC5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisKKyAgICAgICAgd2FpdEZvckFjayhpbik7CisKKyAgICAgICAgLy8gc2VuZCBhIGNvbnRlbnQgb2YgbGZpbGUKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obG9jYWxGaWxlKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyB0b3RhbExlbmd0aCA9IDA7CisKKyAgICAgICAgLy8gb25seSB0cmFjayBwcm9ncmVzcyBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gMTAwa2IgaW4gdmVyYm9zZSBtb2RlCisgICAgICAgIGJvb2xlYW4gdHJhY2tQcm9ncmVzcyA9IGdldFZlcmJvc2UoKSAmJiBmaWxlc2l6ZSA+IEhVTkRSRURfS0lMT0JZVEVTOworICAgICAgICAvLyBzaW5jZSBmaWxlc2l6ZSBrZWVwcyBvbiBkZWNyZWFzaW5nIHdlIGhhdmUgdG8gc3RvcmUgdGhlCisgICAgICAgIC8vIGluaXRpYWwgZmlsZXNpemUKKyAgICAgICAgbG9uZyBpbml0RmlsZXNpemUgPSBmaWxlc2l6ZTsKKyAgICAgICAgaW50IHBlcmNlbnRUcmFuc21pdHRlZCA9IDA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0aGlzLmdldFZlcmJvc2UoKSkgeworICAgICAgICAgICAgICAgIGxvZygiU2VuZGluZzogIiArIGxvY2FsRmlsZS5nZXROYW1lKCkgKyAiIDogIiArIGxvY2FsRmlsZS5sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBmaXMucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICB0b3RhbExlbmd0aCArPSBsZW47CisKKyAgICAgICAgICAgICAgICBpZiAodHJhY2tQcm9ncmVzcykgeworICAgICAgICAgICAgICAgICAgICBwZXJjZW50VHJhbnNtaXR0ZWQgPSB0cmFja1Byb2dyZXNzKGluaXRGaWxlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50VHJhbnNtaXR0ZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgc2VuZEFjayhvdXQpOworICAgICAgICAgICAgd2FpdEZvckFjayhpbik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAodGhpcy5nZXRWZXJib3NlKCkpIHsKKyAgICAgICAgICAgICAgICBsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBsb2dTdGF0cyhzdGFydFRpbWUsIGVuZFRpbWUsIHRvdGFsTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsb2NhbCBmaWxlCisgICAgICogQHJldHVybiB0aGUgbG9jYWwgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldExvY2FsRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlbW90ZSBwYXRoCisgICAgICogQHJldHVybiB0aGUgcmVtb3RlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVBhdGgoKSB7CisgICAgICAgIHJldHVybiByZW1vdGVQYXRoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BUb01lc3NhZ2VCeVNmdHAuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BUb01lc3NhZ2VCeVNmdHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDlmODViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcFRvTWVzc2FnZUJ5U2Z0cC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNlc3Npb247CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkNoYW5uZWxTZnRwOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5TZnRwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5TZnRwUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gY2Fycnkgb3V0IGFuIHVwbG9hZCBieSBzZnRwLgorICovCitwdWJsaWMgY2xhc3MgU2NwVG9NZXNzYWdlQnlTZnRwIGV4dGVuZHMgU2NwVG9NZXNzYWdlLypBYnN0cmFjdFNzaE1lc3NhZ2UqLyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFVORFJFRF9LSUxPQllURVMgPSAxMDI0MDA7CisKKyAgICBwcml2YXRlIEZpbGUgbG9jYWxGaWxlOworICAgIHByaXZhdGUgU3RyaW5nIHJlbW90ZVBhdGg7CisgICAgcHJpdmF0ZSBMaXN0IGRpcmVjdG9yeUxpc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBsb2NhbCBmaWxlIHRvIHJlbW90ZS4KKyAgICAgKiBAcGFyYW0gdmVyYm9zZSBpZiB0cnVlIGRvIHZlcmJvc2UgbG9nZ2luZworICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzY3Agc2Vzc2lvbiB0byB1c2UKKyAgICAgKiBAcGFyYW0gYUxvY2FsRmlsZSB0aGUgbG9jYWwgZmlsZQorICAgICAqIEBwYXJhbSBhUmVtb3RlUGF0aCB0aGUgcmVtb3RlIHBhdGgKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBTY3BUb01lc3NhZ2VCeVNmdHAoYm9vbGVhbiB2ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBhTG9jYWxGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFSZW1vdGVQYXRoKSB7CisgICAgICAgIHRoaXModmVyYm9zZSwgc2Vzc2lvbiwgYVJlbW90ZVBhdGgpOworCisgICAgICAgIHRoaXMubG9jYWxGaWxlID0gYUxvY2FsRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBsb2NhbCBkaXJlY3RvcmllcyB0byByZW1vdGUuCisgICAgICogQHBhcmFtIHZlcmJvc2UgaWYgdHJ1ZSBkbyB2ZXJib3NlIGxvZ2dpbmcKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiB0aGUgc2NwIHNlc3Npb24gdG8gdXNlCisgICAgICogQHBhcmFtIGFEaXJlY3RvcnlMaXN0IGEgbGlzdCBvZiBkaXJlY3RvcmllcworICAgICAqIEBwYXJhbSBhUmVtb3RlUGF0aCB0aGUgcmVtb3RlIHBhdGgKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBTY3BUb01lc3NhZ2VCeVNmdHAoYm9vbGVhbiB2ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBhRGlyZWN0b3J5TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhUmVtb3RlUGF0aCkgeworICAgICAgICB0aGlzKHZlcmJvc2UsIHNlc3Npb24sIGFSZW1vdGVQYXRoKTsKKworICAgICAgICB0aGlzLmRpcmVjdG9yeUxpc3QgPSBhRGlyZWN0b3J5TGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2NwVG9NZXNzYWdlLgorICAgICAqIEBwYXJhbSB2ZXJib3NlIGlmIHRydWUgZG8gdmVyYm9zZSBsb2dnaW5nCisgICAgICogQHBhcmFtIHNlc3Npb24gdGhlIHNjcCBzZXNzaW9uIHRvIHVzZQorICAgICAqIEBwYXJhbSBhUmVtb3RlUGF0aCB0aGUgcmVtb3RlIHBhdGgKKyAgICAgKiBAc2luY2UgQW50IDEuNi4yCisgICAgICovCisgICAgcHJpdmF0ZSBTY3BUb01lc3NhZ2VCeVNmdHAoYm9vbGVhbiB2ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYVJlbW90ZVBhdGgpIHsKKyAgICAgICAgc3VwZXIodmVyYm9zZSwgc2Vzc2lvbik7CisgICAgICAgIHRoaXMucmVtb3RlUGF0aCA9IGFSZW1vdGVQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBTY3BUb01lc3NhZ2UuCisgICAgICogQHBhcmFtIHNlc3Npb24gdGhlIHNjcCBzZXNzaW9uIHRvIHVzZQorICAgICAqIEBwYXJhbSBhTG9jYWxGaWxlIHRoZSBsb2NhbCBmaWxlCisgICAgICogQHBhcmFtIGFSZW1vdGVQYXRoIHRoZSByZW1vdGUgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBTY3BUb01lc3NhZ2VCeVNmdHAoU2Vzc2lvbiBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBhTG9jYWxGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFSZW1vdGVQYXRoKSB7CisgICAgICAgIHRoaXMoZmFsc2UsIHNlc3Npb24sIGFMb2NhbEZpbGUsIGFSZW1vdGVQYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2NwVG9NZXNzYWdlLgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzY3Agc2Vzc2lvbiB0byB1c2UKKyAgICAgKiBAcGFyYW0gYURpcmVjdG9yeUxpc3QgYSBsaXN0IG9mIGRpcmVjdG9yaWVzCisgICAgICogQHBhcmFtIGFSZW1vdGVQYXRoIHRoZSByZW1vdGUgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBTY3BUb01lc3NhZ2VCeVNmdHAoU2Vzc2lvbiBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBhRGlyZWN0b3J5TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhUmVtb3RlUGF0aCkgeworICAgICAgICB0aGlzKGZhbHNlLCBzZXNzaW9uLCBhRGlyZWN0b3J5TGlzdCwgYVJlbW90ZVBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhcnJ5IG91dCB0aGUgdHJhbnNmZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBpL28gZXJyb3JzCisgICAgICogQHRocm93cyBKU2NoRXhjZXB0aW9uIG9uIGVycm9ycyBkZXRlY3RlZCBieSBzY3AKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRpcmVjdG9yeUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9NdWx0aXBsZVRyYW5zZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvY2FsRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBkb1NpbmdsZVRyYW5zZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJkb25lLlxuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvU2luZ2xlVHJhbnNmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTY2hFeGNlcHRpb24geworICAgICAgICBDaGFubmVsU2Z0cCBjaGFubmVsID0gb3BlblNmdHBDaGFubmVsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLmNvbm5lY3QoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VuZEZpbGVUb1JlbW90ZShjaGFubmVsLCBsb2NhbEZpbGUsIHJlbW90ZVBhdGgpOworICAgICAgICAgICAgfSBjYXRjaCAoU2Z0cEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpTY2hFeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb011bHRpcGxlVHJhbnNmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTY2hFeGNlcHRpb24geworICAgICAgICBDaGFubmVsU2Z0cCBjaGFubmVsID0gb3BlblNmdHBDaGFubmVsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLmNvbm5lY3QoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjaGFubmVsLmNkKHJlbW90ZVBhdGgpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRpcmVjdG9yeUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeSBjdXJyZW50ID0gKERpcmVjdG9yeSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHNlbmREaXJlY3RvcnkoY2hhbm5lbCwgY3VycmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoU2Z0cEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpTY2hFeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kRGlyZWN0b3J5KENoYW5uZWxTZnRwIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5IGN1cnJlbnQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2Z0cEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgZmlsZUl0ID0gY3VycmVudC5maWxlc0l0ZXJhdG9yKCk7IGZpbGVJdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBzZW5kRmlsZVRvUmVtb3RlKGNoYW5uZWwsIChGaWxlKSBmaWxlSXQubmV4dCgpLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGRpckl0ID0gY3VycmVudC5kaXJlY3RvcnlJdGVyYXRvcigpOyBkaXJJdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBEaXJlY3RvcnkgZGlyID0gKERpcmVjdG9yeSkgZGlySXQubmV4dCgpOworICAgICAgICAgICAgc2VuZERpcmVjdG9yeVRvUmVtb3RlKGNoYW5uZWwsIGRpcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZERpcmVjdG9yeVRvUmVtb3RlKENoYW5uZWxTZnRwIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnkgZGlyZWN0b3J5KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNmdHBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZGlyID0gZGlyZWN0b3J5LmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYW5uZWwuc3RhdChkaXIpOworICAgICAgICB9IGNhdGNoIChTZnRwRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGRpciBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICAgIGlmIChlLmlkID09IENoYW5uZWxTZnRwLlNTSF9GWF9OT19TVUNIX0ZJTEUpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsLm1rZGlyKGRpcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2hhbm5lbC5jZChkaXIpOworICAgICAgICBzZW5kRGlyZWN0b3J5KGNoYW5uZWwsIGRpcmVjdG9yeSk7CisgICAgICAgIGNoYW5uZWwuY2QoIi4uIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRGaWxlVG9SZW1vdGUoQ2hhbm5lbFNmdHAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVtb3RlUGF0aCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZnRwRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IGxvY2FsRmlsZS5sZW5ndGgoKTsKKworICAgICAgICBpZiAocmVtb3RlUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICByZW1vdGVQYXRoID0gbG9jYWxGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgdG90YWxMZW5ndGggPSBmaWxlc2l6ZTsKKworICAgICAgICAvLyBvbmx5IHRyYWNrIHByb2dyZXNzIGZvciBmaWxlcyBsYXJnZXIgdGhhbiAxMDBrYiBpbiB2ZXJib3NlIG1vZGUKKyAgICAgICAgYm9vbGVhbiB0cmFja1Byb2dyZXNzID0gZ2V0VmVyYm9zZSgpICYmIGZpbGVzaXplID4gSFVORFJFRF9LSUxPQllURVM7CisKKyAgICAgICAgU2Z0cFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbnVsbDsKKyAgICAgICAgaWYgKHRyYWNrUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIG1vbml0b3IgPSBnZXRQcm9ncmVzc01vbml0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGhpcy5nZXRWZXJib3NlKCkpIHsKKyAgICAgICAgICAgICAgICBsb2coIlNlbmRpbmc6ICIgKyBsb2NhbEZpbGUuZ2V0TmFtZSgpICsgIiA6ICIgKyBmaWxlc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFubmVsLnB1dChsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHJlbW90ZVBhdGgsIG1vbml0b3IpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHRoaXMuZ2V0VmVyYm9zZSgpKSB7CisgICAgICAgICAgICAgICAgbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbG9nU3RhdHMoc3RhcnRUaW1lLCBlbmRUaW1lLCAoaW50KSB0b3RhbExlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxvY2FsIGZpbGUuCisgICAgICogQHJldHVybiB0aGUgbG9jYWwgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRMb2NhbEZpbGUoKSB7CisgICAgICAgIHJldHVybiBsb2NhbEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZW1vdGUgcGF0aC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZW1vdGUgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVBhdGgoKSB7CisgICAgICAgIHJldHVybiByZW1vdGVQYXRoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Rlc3RpbmcvQmxvY2tGb3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Rlc3RpbmcvQmxvY2tGb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI5NzhhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdGVzdGluZy9CbG9ja0Zvci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudGVzdGluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLldhaXRGb3I7CisKKy8qKgorICogQHNpbmNlIEFudCAxLjgKKyAqLworCitwdWJsaWMgY2xhc3MgQmxvY2tGb3IgZXh0ZW5kcyBXYWl0Rm9yIHsKKworICAgIC8qKgorICAgICAqIFRleHQgdG8gaW5jbHVkZSBpbiBhIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0ZXh0OworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIHRoZSBuYW1lIG9mIHRoZSB0YXNrIGluIHRoZSB0YXNrIG5hbWUuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgQmxvY2tGb3IoKSB7CisgICAgICAgIHN1cGVyKCJibG9ja2ZvciIpOworICAgICAgICB0ZXh0ID0gZ2V0VGFza05hbWUoKSArICIgdGltZWQgb3V0IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIHRoZSBuYW1lIG9mIHRoZSB0YXNrIGluIHRoZSB0YXNrIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFza05hbWUgdGhlIG5hbWUgb2YgdGhlIHRhc2suCisgICAgICovCisgICAgcHVibGljIEJsb2NrRm9yKFN0cmluZyB0YXNrTmFtZSkgeworICAgICAgICBzdXBlcih0YXNrTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHdhaXQgZmFpbHMsIGEgQnVpbGRFeGNlcHRpb24gaXMgdGhyb3duLiBBbGwgdGhlIHN1cGVyY2xhc3NlcyBhY3Rpb25zIGFyZSBjYWxsZWQgZmlyc3QuCisgICAgICogQHRocm93cyBCdWlsZFRpbWVvdXRFeGNlcHRpb24gb24gdGltZW91dCwgdXNpbmcgdGhlIHRleHQgaW4ge0BsaW5rICN0ZXh0fQorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RpbWVvdXQoKSB0aHJvd3MgQnVpbGRUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIucHJvY2Vzc1RpbWVvdXQoKTsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVGltZW91dEV4Y2VwdGlvbih0ZXh0LCBnZXRMb2NhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVycm9yIHRleHQ7IGFsbCBwcm9wZXJ0aWVzIGFyZSBleHBhbmRlZCBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSB0ZXh0IHRvIHVzZSBpbiBhIGZhaWx1cmUgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGV4dCA9IGdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcyhtZXNzYWdlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Rlc3RpbmcvQnVpbGRUaW1lb3V0RXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC90ZXN0aW5nL0J1aWxkVGltZW91dEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0M2QwOGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC90ZXN0aW5nL0J1aWxkVGltZW91dEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudGVzdGluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkxvY2F0aW9uOworCisvKioKKyAqCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIHRpbWVvdXRzLgorICogQHNpbmNlIEFudDEuOAorICoKKyAqLworCitwdWJsaWMgY2xhc3MgQnVpbGRUaW1lb3V0RXhjZXB0aW9uIGV4dGVuZHMgQnVpbGRFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgwNTc2NDQ2MDMyNDYyOTc1NjJMOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGJ1aWxkIGV4Y2VwdGlvbiB3aXRoIG5vIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZFRpbWVvdXRFeGNlcHRpb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgZGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkVGltZW91dEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24gYXMKKyAgICAgKiBhIHJvb3QgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGRlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyBhIGNhdXNlIGlzIHNwZWNpZmllZC4KKyAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIHRoaXMgb25lLgorICAgICAqICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkVGltZW91dEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24gYXMKKyAgICAgKiBhIHJvb3QgY2F1c2UgYW5kIGEgbG9jYXRpb24gaW4gYSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBBIGRlc2NyaXB0aW9uIG9mIG9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24uCisgICAgICogICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyBhIGNhdXNlIGlzIHNwZWNpZmllZC4KKyAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIHRoaXMgb25lLgorICAgICAqICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBpbiB0aGUgcHJvamVjdCBmaWxlIHdoZXJlIHRoZSBlcnJvcgorICAgICAqICAgICAgICAgICAgICAgICBvY2N1cnJlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkVGltZW91dEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UsIExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKG1zZywgY2F1c2UsIGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBleGNlcHRpb24gYXMgYSByb290IGNhdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNhdXNlIFRoZSBleGNlcHRpb24gdGhhdCBtaWdodCBoYXZlIGNhdXNlZCB0aGlzIG9uZS4KKyAgICAgKiAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRUaW1lb3V0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRpdmUgbWVzc2FnZSBhbmQgYQorICAgICAqIGxvY2F0aW9uIGluIGEgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgZGVzY3JpcHRpb24gb2Ygb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiAgICAgICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBpbiB0aGUgcHJvamVjdCBmaWxlIHdoZXJlIHRoZSBlcnJvcgorICAgICAqICAgICAgICAgICAgICAgICBvY2N1cnJlZC4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkVGltZW91dEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgbG9jYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGV4Y2VwdGlvbiBhcworICAgICAqIGEgcm9vdCBjYXVzZSBhbmQgYSBsb2NhdGlvbiBpbiBhIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IGhhdmUgY2F1c2VkIHRoaXMgb25lLgorICAgICAqICAgICAgICAgICAgICBTaG91bGQgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gaW4gdGhlIHByb2plY3QgZmlsZSB3aGVyZSB0aGUgZXJyb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgb2NjdXJyZWQuIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZFRpbWVvdXRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBzdXBlcihjYXVzZSwgbG9jYXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Rlc3RpbmcvRnVudGVzdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdGVzdGluZy9GdW50ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmYTEzNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Rlc3RpbmcvRnVudGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudGVzdGluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQWRhcHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLldvcmtlckFudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29uZGl0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlBhcmFsbGVsOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNlcXVlbnRpYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuV2FpdEZvcjsKKworLyoqCisgKiBUYXNrIHRvIHByb3ZpZGUgZnVuY3Rpb25hbCB0ZXN0aW5nIHVuZGVyIEFudCwgd2l0aCBhIGZhaXJseSBjb21wbGV4IHdvcmZsb3cgb2Y6CisgKgorICogPHVsPgorICogPGxpPkNvbmRpdGlvbmFsIGV4ZWN1dGlvbjwvbGk+CisgKiA8bGk+QXBwbGljYXRpb24gdG8gc3RhcnQ8L2xpPgorICogPGxpPkEgcHJvYmUgdG8gIndhaXRmb3IiIGJlZm9yZSBydW5uaW5nIHRlc3RzPC9saT4KKyAqIDxsaT5BIHRlc3RzIHNlcXVlbmNlPC9saT4KKyAqIDxsaT5BIHJlcG9ydGluZyBzZXF1ZW5jZSB0aGF0IHJ1bnMgYWZ0ZXIgdGhlIHRlc3RzIGhhdmUgZmluaXNoZWQ8L2xpPgorICogPGxpPkEgInRlYXJkb3duIiBjbGF1c2UgdGhhdCBydW5zIGFmdGVyIHRoZSByZXN0LjwvbGk+CisgKiA8bGk+QXV0b21hdGVkIHRlcm1pbmF0aW9uIG9mIHRoZSBwcm9ncmFtIGl0IGV4ZWN1dGVzLCBpZiBhIHRpbWVvdXQgaXMgbm90IG1ldDwvbGk+CisgKiA8bGk+Q2hlY2tpbmcgb2YgYSBmYWlsdXJlIHByb3BlcnR5IGFuZCBhdXRvbWF0aWMgcmFpc2luZyBvZiBhIGZhdWx0CisgKiAgICAgKHdpdGggdGhlIHRleHQgaW4gZmFpbHVyZVRleHQpCisgKiBpZiB0ZXN0IHNodXRkb3duIGFuZCByZXBvcnRpbmcgc3VjY2VlZGVkPC9saT4KKyAqICA8L3VsPgorICoKKyAqIFRoZSB0YXNrIGlzIGRlc2lnbmVkIHRvIGJlIGZyYW1ld29yayBuZXV0cmFsOyBpdCB3aWxsIHdvcmsgd2l0aCBKVW5pdCwKKyAqICBUZXN0TkcgYW5kIG90aGVyIHRlc3QgZnJhbWV3b3JrcyBUaGF0IGNhbiBiZQorICogZXhlY3V0ZWQgZnJvbSBBbnQuIEl0IGJlYXJzIGEgcmVzZW1ibGFuY2UgdG8gdGhlIEZ1bmN0aW9uYWxUZXN0IHRhc2sgZnJvbQorICogU21hcnRGcm9nLCBhcyB0aGUgYXR0cmlidXRlIG5hbWVzIHdlcmUKKyAqIGNob3NlbiB0byBtYWtlIG1pZ3JhdGlvbiBlYXNpZXIuIEhvd2V2ZXIsIHRoaXMgdGFzayBiZW5lZml0cyBmcm9tIHRoZQorICogYWJpbGl0eSB0byB0d2VhayBBbnQncyBpbnRlcm5hbHMsIGFuZCBzbworICogc2ltcGxpZnkgdGhlIHdvcmtmbG93LCBhbmQgZnJvbSB0aGUgZXhwZXJpZW5jZSBvZiB1c2luZyB0aGUgU21hcnRGcm9nIHRhc2suCisgKiBObyBjb2RlIGhhcyBiZWVuIHNoYXJlZC4KKyAqCisgKiBAc2luY2UgQW50IDEuOAorICovCisKK3B1YmxpYyBjbGFzcyBGdW50ZXN0IGV4dGVuZHMgVGFzayB7CisKKyAgICAvKioKKyAgICAgKiBBIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgdHJ1ZSBiZWZvcmUgdGhlIHRlc3RzIGFyZSBydW4uIFRoaXMgbWFrZXMgaXQKKyAgICAgKiBlYXNpZXIgdG8gZGVmaW5lIGNvbXBsZXggdGVzdHMgdGhhdCBvbmx5CisgICAgICogcnVuIGlmIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgbWV0LCBzdWNoIGFzIE9TIG9yIG5ldHdvcmsgc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBDb25kaXRpb24gY29uZGl0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBVc2VkIGludGVybmFsbHkgdG8gc2V0IHRoZSB3b3JrZmxvdyB1cAorICAgICAqLworICAgIHByaXZhdGUgUGFyYWxsZWwgdGltZWRUZXN0czsKKworICAgIC8qKgorICAgICAqIFNldHVwIHJ1bnMgaWYgdGhlIGNvbmRpdGlvbiBpcyBtZXQuIE9uY2Ugc2V0dXAgaXMgY29tcGxldGUsIHRlYXJkb3duCisgICAgICogd2lsbCBiZSBydW4gd2hlbiB0aGUgdGFzayBmaW5pc2hlcworICAgICAqLworICAgIHByaXZhdGUgU2VxdWVudGlhbCBzZXR1cDsKKworICAgIC8qKgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiB0byBydW4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcXVlbnRpYWwgYXBwbGljYXRpb247CisKKyAgICAvKioKKyAgICAgKiBBIGJsb2NrIHRoYXQgaGFsdHMgdGhlIHRlc3RzIHVudGlsIG1ldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJsb2NrRm9yIGJsb2NrOworCisgICAgLyoqCisgICAgICogVGVzdHMgdG8gcnVuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXF1ZW50aWFsIHRlc3RzOworCisgICAgLyoqCisgICAgICogUmVwb3J0aW5nIG9ubHkgcnVucyBpZiB0aGUgdGVzdHMgd2VyZSBleGVjdXRlZC4gSWYgdGhlIGJsb2NrIHN0b3BwZWQKKyAgICAgKiB0aGVtLCByZXBvcnRpbmcgaXMgc2tpcHBlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcXVlbnRpYWwgcmVwb3J0aW5nOworCisgICAgLyoqCisgICAgICogQW55IHRlYXJkb3duIG9wZXJhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXF1ZW50aWFsIHRlYXJkb3duOworCisgICAgLyoqCisgICAgICogdGltZSBmb3IgdGhlIHRlc3RzIHRvIHRpbWUgb3V0CisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHRpbWVvdXQ7CisKKyAgICBwcml2YXRlIGxvbmcgdGltZW91dFVuaXRNdWx0aXBsaWVyID0gV2FpdEZvci5PTkVfTUlMTElTRUNPTkQ7CisKKyAgICAvKioKKyAgICAgKiB0aW1lIGZvciB0aGUgZXhlY3V0aW9uIHRvIHRpbWUgb3V0LgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBzaHV0ZG93blRpbWUgPSAxMCAqIFdhaXRGb3IuT05FX1NFQ09ORDsKKworICAgIHByaXZhdGUgbG9uZyBzaHV0ZG93blVuaXRNdWx0aXBsaWVyID0gV2FpdEZvci5PTkVfTUlMTElTRUNPTkQ7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIGEgcHJvcGVydHkgdG8gbG9vayBmb3IKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmYWlsdXJlUHJvcGVydHk7CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIHRvIHNlbmQgd2hlbiB0ZXN0cyBmYWlsZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmYWlsdXJlTWVzc2FnZSA9ICJUZXN0cyBmYWlsZWQiOworCisgICAgLyoqCisgICAgICogRmxhZyB0byBzZXQgdG8gdHJ1ZSBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBhbnkgc2h1dGRvd24gZXJyb3JzLgorICAgICAqIDxwLz4KKyAgICAgKiBJbiB0aGF0IHNpdHVhdGlvbiwgZXJyb3JzIHJhaXNlZCBkdXJpbmcgdGVhcmRvd24gYXJlIGxvZ2dlZCBidXQgbm90CisgICAgICogdHVybmVkIGludG8gQnVpbGRGYXVsdCBldmVudHMuIFNpbWlsYXIgdG8gY2F0Y2hpbmcgYW5kIGlnbm9yaW5nCisgICAgICogPGNvZGU+ZmluYWxseSB7fTwvY29kZT4gY2xhdXNlcyBpbiBKYXZhLworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25UZWFyZG93bkVycm9ycyA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIFdoYXQgd2FzIHRocm93biBpbiB0aGUgdGVzdCBydW4gKGluY2x1ZGluZyByZXBvcnRpbmcpCisgICAgICovCisgICAgcHJpdmF0ZSBCdWlsZEV4Y2VwdGlvbiB0ZXN0RXhjZXB0aW9uOworICAgIC8qKgorICAgICAqIFdoYXQgZ290IHRocm93biBkdXJpbmcgdGVhcmRvd24KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ1aWxkRXhjZXB0aW9uIHRlYXJkb3duRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRGlkIHRoZSBhcHBsaWNhdGlvbiB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ1aWxkRXhjZXB0aW9uIGFwcGxpY2F0aW9uRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRGlkIHRoZSB0YXNrIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgQnVpbGRFeGNlcHRpb24gdGFza0V4Y2VwdGlvbjsKKworICAgIC8qKiB7QHZhbHVlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5fT1ZFUlJJRElORyA9ICJPdmVycmlkaW5nIHByZXZpb3VzIGRlZmluaXRpb24gb2YgIjsKKyAgICAvKioge0B2YWx1ZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9GT1JDSUJMWV9TSFVUX0RPV04gPSAiQXBwbGljYXRpb24gZm9yY2libHkgc2h1dCBkb3duIjsKKyAgICAvKioge0B2YWx1ZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSFVURE9XTl9JTlRFUlJVUFRFRCA9ICJTaHV0ZG93biBpbnRlcnJ1cHRlZCI7CisgICAgLyoqIHtAdmFsdWV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUFBJTkdfVEVTVFMKKyAgICAgICAgPSAiQ29uZGl0aW9uIGZhaWxlZCAtc2tpcHBpbmcgdGVzdHMiOworICAgIC8qKiBBcHBsaWNhdGlvbiBleGNlcHRpb24gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9FWENFUFRJT04gPSAiQXBwbGljYXRpb24gRXhjZXB0aW9uIjsKKyAgICAvKiogVGVhcmRvd24gZXhjZXB0aW9uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVBUkRPV05fRVhDRVBUSU9OID0gIlRlYXJkb3duIEV4Y2VwdGlvbiI7CisKKyAgICAvKioKKyAgICAgKiBMb2cgaWYgdGhlIGRlZmluaXRpb24gaXMgb3ZlcnJpZGluZyBzb21ldGhpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgIHdoYXQgaXMgYmVpbmcgZGVmaW5lZAorICAgICAqIEBwYXJhbSBkZWZpbml0aW9uIHdoYXQgc2hvdWxkIGJlIG51bGwgaWYgeW91IGRvbid0IHdhbnQgYSB3YXJuaW5nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvZ092ZXJyaWRlKFN0cmluZyBuYW1lLCBPYmplY3QgZGVmaW5pdGlvbikgeworICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2coV0FSTl9PVkVSUklESU5HICsgJzwnICsgbmFtZSArICc+JywgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb25kaXRpb24uCisgICAgICogQHBhcmFtIG5ld0NvbmRpdGlvbiB0aGUgY29uZGl0aW9uIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25kaXRpb24oQ29uZGl0aW9uIG5ld0NvbmRpdGlvbikgeworICAgICAgICBsb2dPdmVycmlkZSgiY29uZGl0aW9uIiwgY29uZGl0aW9uKTsKKyAgICAgICAgY29uZGl0aW9uID0gbmV3Q29uZGl0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gc2VxdWVuY2UgdGhlIGFwcGxpY2F0aW9uIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBcHBsaWNhdGlvbihTZXF1ZW50aWFsIHNlcXVlbmNlKSB7CisgICAgICAgIGxvZ092ZXJyaWRlKCJhcHBsaWNhdGlvbiIsIGFwcGxpY2F0aW9uKTsKKyAgICAgICAgYXBwbGljYXRpb24gPSBzZXF1ZW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXR1cCBzZXF1ZW5jZS4KKyAgICAgKiBAcGFyYW0gc2VxdWVuY2UgdGhlIHNldHVwIHNlcXVlbmNlIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZXR1cChTZXF1ZW50aWFsIHNlcXVlbmNlKSB7CisgICAgICAgIGxvZ092ZXJyaWRlKCJzZXR1cCIsIHNldHVwKTsKKyAgICAgICAgc2V0dXAgPSBzZXF1ZW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBibG9jay4KKyAgICAgKiBAcGFyYW0gc2VxdWVuY2UgdGhlIGJsb2NrIGZvciB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQmxvY2soQmxvY2tGb3Igc2VxdWVuY2UpIHsKKyAgICAgICAgbG9nT3ZlcnJpZGUoImJsb2NrIiwgYmxvY2spOworICAgICAgICBibG9jayA9IHNlcXVlbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCB0ZXN0cy4KKyAgICAgKiBAcGFyYW0gc2VxdWVuY2UgYSBzZXF1ZW5jZSB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGVzdHMoU2VxdWVudGlhbCBzZXF1ZW5jZSkgeworICAgICAgICBsb2dPdmVycmlkZSgidGVzdHMiLCB0ZXN0cyk7CisgICAgICAgIHRlc3RzID0gc2VxdWVuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHJlcG9ydGluZyBzZXF1ZW5jZSBvZiB0YXNrcy4KKyAgICAgKiBAcGFyYW0gc2VxdWVuY2UgYSByZXBvcnRpbmcgc2VxdWVuY2UgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlcG9ydGluZyhTZXF1ZW50aWFsIHNlcXVlbmNlKSB7CisgICAgICAgIGxvZ092ZXJyaWRlKCJyZXBvcnRpbmciLCByZXBvcnRpbmcpOworICAgICAgICByZXBvcnRpbmcgPSBzZXF1ZW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGVhcmRvd24gc2VxdWVuY2Ugb2YgdGFza3MuCisgICAgICogQHBhcmFtIHNlcXVlbmNlIGEgdGVhcmRvd24gc2VxdWVuY2UgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRlYXJkb3duKFNlcXVlbnRpYWwgc2VxdWVuY2UpIHsKKyAgICAgICAgbG9nT3ZlcnJpZGUoInRlYXJkb3duIiwgdGVhcmRvd24pOworICAgICAgICB0ZWFyZG93biA9IHNlcXVlbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmFpbE9uVGVhcmRvd25FcnJvcnMgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBmYWlsT25UZWFyZG93bkVycm9ycyB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPblRlYXJkb3duRXJyb3JzKGJvb2xlYW4gZmFpbE9uVGVhcmRvd25FcnJvcnMpIHsKKyAgICAgICAgdGhpcy5mYWlsT25UZWFyZG93bkVycm9ycyA9IGZhaWxPblRlYXJkb3duRXJyb3JzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmFpbHVyZU1lc3NhZ2UgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBmYWlsdXJlTWVzc2FnZSB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWx1cmVNZXNzYWdlKFN0cmluZyBmYWlsdXJlTWVzc2FnZSkgeworICAgICAgICB0aGlzLmZhaWx1cmVNZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmYWlsdXJlUHJvcGVydHkgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBmYWlsdXJlUHJvcGVydHkgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlUHJvcGVydHkoU3RyaW5nIGZhaWx1cmVQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLmZhaWx1cmVQcm9wZXJ0eSA9IGZhaWx1cmVQcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNodXRkb3duVGltZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHNodXRkb3duVGltZSB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNodXRkb3duVGltZShsb25nIHNodXRkb3duVGltZSkgeworICAgICAgICB0aGlzLnNodXRkb3duVGltZSA9IHNodXRkb3duVGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpbWVvdXQgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIHRpbWVvdXQpIHsKKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpbWVvdXR1bml0IGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gdW5pdCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXRVbml0KFdhaXRGb3IuVW5pdCB1bml0KSB7CisgICAgICAgIHRpbWVvdXRVbml0TXVsdGlwbGllciA9IHVuaXQuZ2V0TXVsdGlwbGllcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2h1dGRvd251bml0IGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gdW5pdCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNodXRkb3duVW5pdChXYWl0Rm9yLlVuaXQgdW5pdCkgeworICAgICAgICBzaHV0ZG93blVuaXRNdWx0aXBsaWVyID0gdW5pdC5nZXRNdWx0aXBsaWVyKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcHBsaWNhdGlvbiBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uIGdldEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gYXBwbGljYXRpb25FeGNlcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0ZWFyZG93biBleGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgdGVhcmRvd24gZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbiBnZXRUZWFyZG93bkV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRlYXJkb3duRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGVzdCBleGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgdGVzdCBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uIGdldFRlc3RFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiB0ZXN0RXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGFzayBleGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgdGFzayBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkRXhjZXB0aW9uIGdldFRhc2tFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiB0YXNrRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmQgYW5kIGluaXRpYWxpc2UgYSB0YXNrCisgICAgICogQHBhcmFtIHRhc2sgdGFzayB0byBiaW5kCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJpbmQoVGFzayB0YXNrKSB7CisgICAgICAgIHRhc2suYmluZFRvT3duZXIodGhpcyk7CisgICAgICAgIHRhc2suaW5pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ld2x5IGJvdW5kIHBhcmFsbGVsIGluc3RhbmNlCisgICAgICogQHBhcmFtIHBhcmFsbGVsVGltZW91dCB0aW1lb3V0CisgICAgICogQHJldHVybiBhIGJvdW5kIGFuZCBpbml0aWFsaXNlZCBwYXJhbGxlbCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhcmFsbGVsIG5ld1BhcmFsbGVsKGxvbmcgcGFyYWxsZWxUaW1lb3V0KSB7CisgICAgICAgIFBhcmFsbGVsIHBhciA9IG5ldyBQYXJhbGxlbCgpOworICAgICAgICBiaW5kKHBhcik7CisgICAgICAgIHBhci5zZXRGYWlsT25BbnkodHJ1ZSk7CisgICAgICAgIHBhci5zZXRUaW1lb3V0KHBhcmFsbGVsVGltZW91dCk7CisgICAgICAgIHJldHVybiBwYXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3bHkgYm91bmQgcGFyYWxsZWwgaW5zdGFuY2Ugd2l0aCBvbmUgY2hpbGQKKyAgICAgKiBAcGFyYW0gcGFyYWxsZWxUaW1lb3V0IHRpbWVvdXQKKyAgICAgKiBAcGFyYW0gY2hpbGQgdGFzaworICAgICAqIEByZXR1cm4gYSBib3VuZCBhbmQgaW5pdGlhbGlzZWQgcGFyYWxsZWwgaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXJhbGxlbCBuZXdQYXJhbGxlbChsb25nIHBhcmFsbGVsVGltZW91dCwgVGFzayBjaGlsZCkgeworICAgICAgICBQYXJhbGxlbCBwYXIgPSBuZXdQYXJhbGxlbChwYXJhbGxlbFRpbWVvdXQpOworICAgICAgICBwYXIuYWRkVGFzayhjaGlsZCk7CisgICAgICAgIHJldHVybiBwYXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSBmdW5jdGlvbmFsIHRlc3Qgc2VxdWVuY2UuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgaXMgYSBmYWlybHkgY29tcGxleCB3b3JrZmxvdyAtd2hhdCBpcyBnb2luZyBvbiBpcyB0aGF0IHdlIHRyeSB0byBjbGVhbiB1cAorICAgICAqIG5vIG1hdHRlciBob3cgdGhlIHJ1biBlbmRlZCwgYW5kIHRvIHJldGFpbiB0aGUgaW5uZXJtb3N0IGV4Y2VwdGlvbiB0aGF0IGdvdCB0aHJvd24KKyAgICAgKiBkdXJpbmcgY2xlYW51cC4gVGhhdCBpcywgaWYgdGVhcmRvd24gZmFpbHMgYWZ0ZXIgdGhlIHRlc3RzIHRoZW1zZWx2ZXMgZmFpbGVkLCBpdCBpcyB0aGUKKyAgICAgKiB0ZXN0IGZhaWxpbmcgdGhhdCBpcyBtb3JlIGltcG9ydGFudC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyB3YXMgY2F1Z2h0IGR1cmluZyB0aGUgcnVuIG9yIHRlYXJkb3duLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vYmVmb3JlIGFueXRoaW5nIGVsc2UsIGNoZWNrIHRoZSBjb25kaXRpb24KKyAgICAgICAgLy9hbmQgYmFpbCBvdXQgaWYgaXQgaXMgZGVmaW5lZCBidXQgbm90IHRydWUKKyAgICAgICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsICYmICFjb25kaXRpb24uZXZhbCgpKSB7CisgICAgICAgICAgICAvL3dlIGFyZSBza2lwcGluZyB0aGUgdGVzdAorICAgICAgICAgICAgbG9nKFNLSVBQSU5HX1RFU1RTKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgdGltZW91dE1pbGxpcyA9IHRpbWVvdXQgKiB0aW1lb3V0VW5pdE11bHRpcGxpZXI7CisKKyAgICAgICAgLy9zZXQgdXAgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1biBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBQYXJhbGxlbCBhcHBsaWNhdGlvblJ1biA9IG5ld1BhcmFsbGVsKHRpbWVvdXRNaWxsaXMpOworICAgICAgICAvL3dpdGggYSB3b3JrZXIgd2hpY2ggd2UgY2FuIHVzZSB0byBtYW5hZ2UgaXQKKyAgICAgICAgV29ya2VyQW50IHdvcmtlciA9IG5ldyBXb3JrZXJBbnQoYXBwbGljYXRpb25SdW4sIG51bGwpOworICAgICAgICBpZiAoYXBwbGljYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgYXBwbGljYXRpb25SdW4uYWRkVGFzayhhcHBsaWNhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvL1RoZSB0ZXN0IHJ1biBjb25zaXN0cyBvZiB0aGUgYmxvY2sgZm9sbG93ZWQgYnkgdGhlIHRlc3RzLgorICAgICAgICBsb25nIHRlc3RSdW5UaW1lb3V0ID0gMDsKKyAgICAgICAgU2VxdWVudGlhbCB0ZXN0UnVuID0gbmV3IFNlcXVlbnRpYWwoKTsKKyAgICAgICAgYmluZCh0ZXN0UnVuKTsKKyAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vd2FpdGZvciBpcyBub3QgYSB0YXNrLCBpdCBuZWVkcyB0byBiZSBhZGFwdGVkCisgICAgICAgICAgICB0ZXN0UnVuLmFkZFRhc2sobmV3IFRhc2tBZGFwdGVyKGJsb2NrKSk7CisgICAgICAgICAgICAvL2FkZCB0aGUgYmxvY2sgdGltZSB0byB0aGUgdG90YWwgdGVzdCBydW4gdGltZW91dAorICAgICAgICAgICAgdGVzdFJ1blRpbWVvdXQgPSBibG9jay5jYWxjdWxhdGVNYXhXYWl0TWlsbGlzKCk7CisgICAgICAgIH0KKworICAgICAgICAvL2FkZCB0aGUgdGVzdHMgYW5kIG1vcmUgZGVsYXkKKyAgICAgICAgaWYgKHRlc3RzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRlc3RSdW4uYWRkVGFzayh0ZXN0cyk7CisgICAgICAgICAgICB0ZXN0UnVuVGltZW91dCArPSB0aW1lb3V0TWlsbGlzOworICAgICAgICB9CisgICAgICAgIC8vYWRkIHRoZSByZXBvcnRpbmcgYW5kIG1vcmUgZGVsYXkKKyAgICAgICAgaWYgKHJlcG9ydGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0ZXN0UnVuLmFkZFRhc2socmVwb3J0aW5nKTsKKyAgICAgICAgICAgIHRlc3RSdW5UaW1lb3V0ICs9IHRpbWVvdXRNaWxsaXM7CisgICAgICAgIH0KKworICAgICAgICAvL3dyYXAgdGhpcyBpbiBhIHBhcmFsbGVsIHB1cmVseSB0byBzZXQgdXAgdGltZW91dHMgZm9yIHRoZQorICAgICAgICAvL3Rlc3QgcnVuCisgICAgICAgIHRpbWVkVGVzdHMgPSBuZXdQYXJhbGxlbCh0ZXN0UnVuVGltZW91dCwgdGVzdFJ1bik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vcnVuIGFueSBzZXR1cCB0YXNrCisgICAgICAgICAgICBpZiAoc2V0dXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFBhcmFsbGVsIHNldHVwUnVuID0gbmV3UGFyYWxsZWwodGltZW91dE1pbGxpcywgc2V0dXApOworICAgICAgICAgICAgICAgIHNldHVwUnVuLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc3RhcnQgdGhlIHdvcmtlciB0aHJlYWQgYW5kIGxlYXZlIGl0IHJ1bm5pbmcKKyAgICAgICAgICAgIHdvcmtlci5zdGFydCgpOworICAgICAgICAgICAgLy9zdGFydCB0aGUgcHJvYmUrdGVzdCBzZXF1ZW5jZQorICAgICAgICAgICAgdGltZWRUZXN0cy5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vUmVjb3JkIHRoZSBleGNlcHRpb24gYW5kIGNvbnRpbnVlCisgICAgICAgICAgICB0ZXN0RXhjZXB0aW9uID0gZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vdGVhcmRvd24gYWx3YXlzIHJ1bnM7IGl0cyBmYXVsdHMgYXJlIGZpbGVkIGF3YXkKKyAgICAgICAgICAgIGlmICh0ZWFyZG93biAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgUGFyYWxsZWwgdGVhcmRvd25SdW4gPSBuZXdQYXJhbGxlbCh0aW1lb3V0TWlsbGlzLCB0ZWFyZG93bik7CisgICAgICAgICAgICAgICAgICAgIHRlYXJkb3duUnVuLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRlYXJkb3duRXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL3dlIGdldCBoZXJlIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXN0cy90ZWFyZG93biBoYXZlIHRocm93biBhIEJ1aWxkRXhjZXB0aW9uLgorICAgICAgICAvL2RvIGEgZm9yY2VkIHNodXRkb3duIG9mIHRoZSBydW5uaW5nIGFwcGxpY2F0aW9uLCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmF1bHRzCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vd2FpdCBmb3IgdGhlIHdvcmtlciB0byBoYXZlIGZpbmlzaGVkCisgICAgICAgICAgICBsb25nIHNodXRkb3duVGltZU1pbGxpcyA9IHNodXRkb3duVGltZSAqIHNodXRkb3duVW5pdE11bHRpcGxpZXI7CisgICAgICAgICAgICB3b3JrZXIud2FpdFVudGlsRmluaXNoZWQoc2h1dGRvd25UaW1lTWlsbGlzKTsKKyAgICAgICAgICAgIGlmICh3b3JrZXIuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgLy90aGVuLCBpZiBpdCBpcyBzdGlsbCBydW5uaW5nLCBpbnRlcnJ1cHQgaXQgYSBzZWNvbmQgdGltZS4KKyAgICAgICAgICAgICAgICBsb2coQVBQTElDQVRJT05fRk9SQ0lCTFlfU0hVVF9ET1dOLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICB3b3JrZXIuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgd29ya2VyLndhaXRVbnRpbEZpbmlzaGVkKHNodXRkb3duVGltZU1pbGxpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vc3VjY2Vzcywgc29tZXRoaW5nIGludGVycnVwdGVkIHRoZSBzaHV0ZG93bi4gVGhlcmUgbWF5IGJlIGEgbGVha2VkCisgICAgICAgICAgICAvL3dvcmtlcjsKKyAgICAgICAgICAgIGxvZyhTSFVURE9XTl9JTlRFUlJVUFRFRCwgZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKyAgICAgICAgYXBwbGljYXRpb25FeGNlcHRpb24gPSB3b3JrZXIuZ2V0QnVpbGRFeGNlcHRpb24oKTsKKworICAgICAgICAvL05vdyBmYXVsdHMgYXJlIGFuYWx5c2VkCisKKyAgICAgICAgcHJvY2Vzc0V4Y2VwdGlvbnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3cgZmF1bHRzIGFyZSBhbmFseXNlZC4KKyAgICAgKiA8cD4gVGhlIHByaW9yaXR5IGlzCisgICAgICogPG9sPgorICAgICAqIDxsaT50ZXN0ZXhjZXB0aW9ucywgZXhjZXB0IHRob3NlIGluZGljYXRpbmcgYSBidWlsZCB0aW1lb3V0IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGl0c2VsZgorICAgICBmYWlsZWQuPGJyPgorICAgICAoYmVjYXVzZSBvZnRlbiBpdCBpcyB0aGUgYXBwbGljYXRpb24gZmF1bHQgdGhhdCBpcyBtb3JlIGludGVyZXN0aW5nIHRoYW4gdGhlIHByb2JlCisgICAgIGZhaWx1cmUsIHdoaWNoIGlzIHVzdWFsbHkgdHJpZ2dlcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBub3Qgc3RhcnRpbmcKKyAgICAgPC9saT48bGk+CisgICAgIEFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgKGFib3ZlIHRlc3QgdGltZW91dCBleGNlcHRpb25zKQorICAgICA8L2xpPjxsaT4KKyAgICAgVGVhcmRvd24gZXhjZXB0aW9ucyAtZXhjZXB0IHdoZW4gdGhleSBhcmUgYmVpbmcgaWdub3JlZAorICAgICA8L2xpPjxsaT4KKyAgICAgVGVzdCBmYWlsdXJlcyBhcyBpbmRpY2F0ZWQgYnkgdGhlIGZhaWx1cmUgcHJvcGVydHkKKyAgICAgPC9saT48L29sPgorCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V4Y2VwdGlvbnMoKSB7CisgICAgICAgIHRhc2tFeGNlcHRpb24gPSB0ZXN0RXhjZXB0aW9uOworCisgICAgICAgIC8vbG9vayBmb3IgYW4gYXBwbGljYXRpb24gZmF1bHQKKyAgICAgICAgaWYgKGFwcGxpY2F0aW9uRXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0YXNrRXhjZXB0aW9uID09IG51bGwgfHwgdGFza0V4Y2VwdGlvbiBpbnN0YW5jZW9mIEJ1aWxkVGltZW91dEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRhc2tFeGNlcHRpb24gPSBhcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWdub3JpbmdUaHJvd2FibGUoQVBQTElDQVRJT05fRVhDRVBUSU9OLCBhcHBsaWNhdGlvbkV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL25vdyBsb29rIGZvciB0ZWFyZG93biBmYXVsdHMsIHdoaWNoIG1heSBiZSBpZ25vcmVkCisgICAgICAgIGlmICh0ZWFyZG93bkV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodGFza0V4Y2VwdGlvbiA9PSBudWxsICYmIGZhaWxPblRlYXJkb3duRXJyb3JzKSB7CisgICAgICAgICAgICAgICAgdGFza0V4Y2VwdGlvbiA9IHRlYXJkb3duRXhjZXB0aW9uOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL2Rvbid0IGxldCB0aGUgY2xlYW51cCBleGNlcHRpb24gZ2V0IGluIHRoZSB3YXkgb2YgYW55IG90aGVyIGZhaWx1cmUKKyAgICAgICAgICAgICAgICBpZ25vcmluZ1Rocm93YWJsZShURUFSRE9XTl9FWENFUFRJT04sIHRlYXJkb3duRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vbm93LCBhbmFseXNlIHRoZSB0ZXN0cworICAgICAgICBpZiAoZmFpbHVyZVByb3BlcnR5ICE9IG51bGwKKyAgICAgICAgICAgICAmJiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoZmFpbHVyZVByb3BlcnR5KSAhPSBudWxsKSB7CisgICAgICAgICAgICAvL3dlJ3ZlIGZhaWxlZAorICAgICAgICAgICAgbG9nKGZhaWx1cmVNZXNzYWdlKTsKKyAgICAgICAgICAgIGlmICh0YXNrRXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0YXNrRXhjZXB0aW9uID0gbmV3IEJ1aWxkRXhjZXB0aW9uKGZhaWx1cmVNZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vYXQgdGhpcyBwb2ludCB0YXNrRXhjZXB0aW9uIGlzIG51bGwgb3Igbm90LgorICAgICAgICAvL2lmIG5vdCwgdGhyb3cgdGhlIGV4Y2VwdGlvbgorICAgICAgICBpZiAodGFza0V4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyB0YXNrRXhjZXB0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbG9nIHRoYXQgd2UgYXJlIGlnbm9yaW5nIHNvbWV0aGluZyByYXRoZXIgdGhhbiByZXRocm93aW5nIGl0LgorICAgICAqIEBwYXJhbSB0eXBlIG5hbWUgb2YgZXhjZXB0aW9uCisgICAgICogQHBhcmFtIHRocm93biB3aGF0IHdhcyB0aHJvd24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpZ25vcmluZ1Rocm93YWJsZShTdHJpbmcgdHlwZSwgVGhyb3dhYmxlIHRocm93bikgeworICAgICAgICBsb2codHlwZSArICI6ICIgKyB0aHJvd24udG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICB0aHJvd24sCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9BYnN0cmFjdEFjY2Vzc1Rhc2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvQWJzdHJhY3RBY2Nlc3NUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5M2NmNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvQWJzdHJhY3RBY2Nlc3NUYXNrLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworLyoKKyAqIFNpbmNlIHRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhpcyBmaWxlIHdhcyBkZXZlb2xwZWQgb24gdGhlIGNsb2NrIG9uCisgKiBhbiBOU0YgZ3JhbnQgSSBzaG91bGQgc2F5IHRoZSBmb2xsb3dpbmcgYm9pbGVycGxhdGU6CisgKgorICogVGhpcyBtYXRlcmlhbCBpcyBiYXNlZCB1cG9uIHdvcmsgc3VwcG9ydGVkIGJ5IHRoZSBOYXRpb25hbCBTY2llbmNlCisgKiBGb3VuZGF0b24gdW5kZXIgR3JhbnQgTm8uIEVJQS0wMTk2NDA0LiBBbnkgb3BpbmlvbnMsIGZpbmRpbmdzLCBhbmQKKyAqIGNvbmNsdXNpb25zIG9yIHJlY29tbWVuZGF0aW9ucyBleHByZXNzZWQgaW4gdGhpcyBtYXRlcmlhbCBhcmUgdGhvc2UKKyAqIG9mIHRoZSBhdXRob3IgYW5kIGRvIG5vdCBuZWNlc3NhcmlseSByZWZsZWN0IHRoZSB2aWV3cyBvZiB0aGUKKyAqIE5hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnVuaXg7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKKworLyoqCisgKiBAc2luY2UgQW50IDEuNgorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY2Nlc3NUYXNrCisgICAgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlT24geworCisgICAgLyoqCisgICAgICogQ2htb2QgdGFzayBmb3Igc2V0dGluZyBmaWxlIGFuZCBkaXJlY3RvcnkgcGVybWlzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0QWNjZXNzVGFzaygpIHsKKyAgICAgICAgc3VwZXIuc2V0UGFyYWxsZWwodHJ1ZSk7CisgICAgICAgIHN1cGVyLnNldFNraXBFbXB0eUZpbGVzZXRzKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmlsZSB3aGljaCBzaG91bGQgaGF2ZSBpdHMgYWNjZXNzIGF0dHJpYnV0ZXMgbW9kaWZpZWQuCisgICAgICogQHBhcmFtIHNyYyB0aGUgZmlsZSB0byBtb2RpZnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgc3JjKSB7CisgICAgICAgIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOworICAgICAgICBmcy5zZXRGaWxlKHNyYyk7CisgICAgICAgIGFkZEZpbGVzZXQoZnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgdGhlIHVzZXIgZnJvbSBzcGVjaWZ5aW5nIGEgZGlmZmVyZW50IGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICogQHBhcmFtIGNtZGwgQSB1c2VyIHN1cHBsaWVkIGNvbW1hbmQgbGluZSB0aGF0IHdlIHdvbid0IGFjY2VwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kKENvbW1hbmRsaW5lIGNtZGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSBjb21tYW5kIGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IHRoZSBza2lwcGluZyBvZiBlbXB0eSBmaWxlc2V0cworICAgICAqCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqIEBwYXJhbSBza2lwIEEgdXNlciBzdXBwbGllZCBib29sZWFuIHdlIHdvbid0IGFjY2VwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTa2lwRW1wdHlGaWxlc2V0cyhib29sZWFuIHNraXApIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tUeXBlKCkgKyAiIGRvZXNuXCd0IHN1cHBvcnQgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNraXBlbXB0eWZpbGVzZXQgYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgdGhlIHVzZSBvZiB0aGUgYWRkc291cmNlZmlsZSBhdHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKiBAcGFyYW0gYiBBIHVzZXIgc3VwcGxpZWQgYm9vbGVhbiB3ZSB3b24ndCBhY2NlcHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkc291cmNlZmlsZShib29sZWFuIGIpIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tUeXBlKCkKKyAgICAgICAgICAgICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSBhZGRzb3VyY2VmaWxlIGF0dHJpYnV0ZSIsIGdldExvY2F0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF1dG9tYXRpY2FsbHkgYXBwcm92ZSBVbml4IE9TJ3MuCisgICAgICogQHJldHVybiB0cnVlIGlmIGEgdmFsaWQgT1MsIGZvciB1bml4IHRoaXMgaXMgYWx3YXlzIHRydWUsIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgICB1c2UgdGhlIHN1cGVyY2xhc3NlcycgdGVzdCAodXNlciBzZXQpLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRPcygpIHsKKyAgICAgICAgcmV0dXJuIE9zLmlzRmFtaWx5KCJ1bml4IikgJiYgc3VwZXIuaXNWYWxpZE9zKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9DaGdycC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9DaGdycC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwM2ZjMmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L0NoZ3JwLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogU2luY2UgdGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlzIGZpbGUgd2FzIGRldmVvbHBlZCBvbiB0aGUgY2xvY2sgb24KKyAqIGFuIE5TRiBncmFudCBJIHNob3VsZCBzYXkgdGhlIGZvbGxvd2luZyBib2lsZXJwbGF0ZToKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIGJhc2VkIHVwb24gd29yayBzdXBwb3J0ZWQgYnkgdGhlIE5hdGlvbmFsIFNjaWVuY2UKKyAqIEZvdW5kYXRvbiB1bmRlciBHcmFudCBOby4gRUlBLTAxOTY0MDQuIEFueSBvcGluaW9ucywgZmluZGluZ3MsIGFuZAorICogY29uY2x1c2lvbnMgb3IgcmVjb21tZW5kYXRpb25zIGV4cHJlc3NlZCBpbiB0aGlzIG1hdGVyaWFsIGFyZSB0aG9zZQorICogb2YgdGhlIGF1dGhvciBhbmQgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIHZpZXdzIG9mIHRoZQorICogTmF0aW9uYWwgU2NpZW5jZSBGb3VuZGF0aW9uLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudW5peDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIENoZ3JwIGVxdWl2YWxlbnQgZm9yIHVuaXgtbGlrZSBlbnZpcm9ubWVudHMuCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCisgKi8KK3B1YmxpYyBjbGFzcyBDaGdycCBleHRlbmRzIEFic3RyYWN0QWNjZXNzVGFzayB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUdyb3VwID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDaGdycCB0YXNrIGZvciBzZXR0aW5nIHVuaXggZ3JvdXAgb2YgYSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBDaGdycCgpIHsKKyAgICAgICAgc3VwZXIuc2V0RXhlY3V0YWJsZSgiY2hncnAiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdyb3VwIGF0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwICAgIFRoZSBuZXcgZ3JvdXAgZm9yIHRoZSBmaWxlKHMpIG9yIGRpcmVjdG9yeShpZXMpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXAoU3RyaW5nIGdyb3VwKSB7CisgICAgICAgIGNyZWF0ZUFyZygpLnNldFZhbHVlKGdyb3VwKTsKKyAgICAgICAgaGF2ZUdyb3VwID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBhbGwgdGhlIHJlcXVpcmVkIGFyZ3VtZW50cyBhbmQgb3RoZXIgY29uZGl0aW9ucyBoYXZlCisgICAgICogYmVlbiBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgeworICAgICAgICBpZiAoIWhhdmVHcm91cCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXF1aXJlZCBhdHRyaWJ1dGUgZ3JvdXAgbm90IHNldCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2hncnAiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5jaGVja0NvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXZSBkb24ndCB3YW50IHRvIGV4cG9zZSB0aGUgZXhlY3V0YWJsZSBhdHJpYnV0ZSwgc28gb3ZlcmlkZSBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlIFVzZXIgc3VwcGxpZWQgZXhlY3V0YWJsZSB0aGF0IHdlIHdvbid0IGFjY2VwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlKFN0cmluZyBlKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgZXhlY3V0YWJsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L0Nob3duLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L0Nob3duLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExMDI4YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvQ2hvd24uamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qCisgKiBTaW5jZSB0aGUgaW5pdGlhbCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB3YXMgZGV2ZW9scGVkIG9uIHRoZSBjbG9jayBvbgorICogYW4gTlNGIGdyYW50IEkgc2hvdWxkIHNheSB0aGUgZm9sbG93aW5nIGJvaWxlcnBsYXRlOgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgYmFzZWQgdXBvbiB3b3JrIHN1cHBvcnRlZCBieSB0aGUgTmF0aW9uYWwgU2NpZW5jZQorICogRm91bmRhdG9uIHVuZGVyIEdyYW50IE5vLiBFSUEtMDE5NjQwNC4gQW55IG9waW5pb25zLCBmaW5kaW5ncywgYW5kCisgKiBjb25jbHVzaW9ucyBvciByZWNvbW1lbmRhdGlvbnMgZXhwcmVzc2VkIGluIHRoaXMgbWF0ZXJpYWwgYXJlIHRob3NlCisgKiBvZiB0aGUgYXV0aG9yIGFuZCBkbyBub3QgbmVjZXNzYXJpbHkgcmVmbGVjdCB0aGUgdmlld3Mgb2YgdGhlCisgKiBOYXRpb25hbCBTY2llbmNlIEZvdW5kYXRpb24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC51bml4OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogQ2hvd24gZXF1aXZhbGVudCBmb3IgdW5peC1saWtlIGVudmlyb25tZW50cy4KKyAqCisgKiBAc2luY2UgQW50IDEuNgorICoKKyAqIEBhbnQudGFzayBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKKyAqLworcHVibGljIGNsYXNzIENob3duIGV4dGVuZHMgQWJzdHJhY3RBY2Nlc3NUYXNrIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlT3duZXIgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENob3duIHRhc2sgZm9yIHNldHRpbmcgZmlsZSBhbmQgZGlyZWN0b3J5IHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyBDaG93bigpIHsKKyAgICAgICAgc3VwZXIuc2V0RXhlY3V0YWJsZSgiY2hvd24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG93bmVyIGF0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyICAgIFRoZSBuZXcgb3duZXIgZm9yIHRoZSBmaWxlKHMpIG9yIGRpcmVjdG9yeShpZXMpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3duZXIoU3RyaW5nIG93bmVyKSB7CisgICAgICAgIGNyZWF0ZUFyZygpLnNldFZhbHVlKG93bmVyKTsKKyAgICAgICAgaGF2ZU93bmVyID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBhbGwgdGhlIHJlcXVpcmVkIGFyZ3VtZW50cyBhbmQgb3RoZXIgY29uZGl0aW9ucyBoYXZlCisgICAgICogYmVlbiBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgeworICAgICAgICBpZiAoIWhhdmVPd25lcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXF1aXJlZCBhdHRyaWJ1dGUgb3duZXIgbm90IHNldCBpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY2hvd24iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5jaGVja0NvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXZSBkb24ndCB3YW50IHRvIGV4cG9zZSB0aGUgZXhlY3V0YWJsZSBhdHJpYnV0ZSwgc28gb3ZlcmlkZSBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlIFVzZXIgc3VwcGxpZWQgZXhlY3V0YWJsZSB0aGF0IHdlIHdvbid0IGFjY2VwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlKFN0cmluZyBlKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgZXhlY3V0YWJsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L1N5bWxpbmsuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvU3ltbGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDI5NjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L1N5bWxpbmsuamF2YQpAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogU2luY2UgdGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlzIGZpbGUgd2FzIGRldmVsb3BlZCBvbiB0aGUgY2xvY2sgb24KKyAqIGFuIE5TRiBncmFudCBJIHNob3VsZCBzYXkgdGhlIGZvbGxvd2luZyBib2lsZXJwbGF0ZToKKyAqCisgKiBUaGlzIG1hdGVyaWFsIGlzIGJhc2VkIHVwb24gd29yayBzdXBwb3J0ZWQgYnkgdGhlIE5hdGlvbmFsIFNjaWVuY2UKKyAqIEZvdW5kYXRvbiB1bmRlciBHcmFudCBOby4gRUlBLTAxOTY0MDQuIEFueSBvcGluaW9ucywgZmluZGluZ3MsIGFuZAorICogY29uY2x1c2lvbnMgb3IgcmVjb21tZW5kYXRpb25zIGV4cHJlc3NlZCBpbiB0aGlzIG1hdGVyaWFsIGFyZSB0aG9zZQorICogb2YgdGhlIGF1dGhvciBhbmQgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIHZpZXdzIG9mIHRoZQorICogTmF0aW9uYWwgU2NpZW5jZSBGb3VuZGF0aW9uLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudW5peDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5kaXNwYXRjaC5EaXNwYXRjaFRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZGlzcGF0Y2guRGlzcGF0Y2hVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIENyZWF0ZXMsIERlbGV0ZXMsIFJlY29yZHMgYW5kIFJlc3RvcmVzIFN5bWxpbmtzLgorICoKKyAqIDxwPiBUaGlzIHRhc2sgcGVyZm9ybXMgc2V2ZXJhbCByZWxhdGVkIG9wZXJhdGlvbnMuIEluIHRoZSBtb3N0IHRyaXZpYWwKKyAqIGFuZCBkZWZhdWx0IHVzYWdlLCBpdCBjcmVhdGVzIGEgbGluayBzcGVjaWZpZWQgaW4gdGhlIGxpbmsgYXR0cmlidXRlIHRvCisgKiBhIHJlc291cmNlIHNwZWNpZmllZCBpbiB0aGUgcmVzb3VyY2UgYXR0cmlidXRlLiBUaGUgc2Vjb25kIHVzYWdlIG9mIHRoaXMKKyAqIHRhc2sgaXMgdG8gdHJhdmVyc2UgYSBkaXJlY3Rvcnkgc3RydWN0dXJlIHNwZWNpZmllZCBieSBhIGZpbGVzZXQsCisgKiBhbmQgd3JpdGUgYSBwcm9wZXJ0aWVzIGZpbGUgaW4gZWFjaCBpbmNsdWRlZCBkaXJlY3RvcnkgZGVzY3JpYmluZyB0aGUKKyAqIGxpbmtzIGZvdW5kIGluIHRoYXQgZGlyZWN0b3J5LiBUaGUgdGhpcmQgdXNhZ2UgaXMgdG8gdHJhdmVyc2UgYQorICogZGlyZWN0b3J5IHN0cnVjdHVyZSBzcGVjaWZpZWQgYnkgYSBmaWxlc2V0LCBsb29raW5nIGZvciBwcm9wZXJ0aWVzIGZpbGVzCisgKiAoYWxzbyBzcGVjaWZpZWQgYXMgaW5jbHVkZWQgaW4gdGhlIGZpbGVzZXQpIGFuZCByZWNyZWF0ZSB0aGUgbGlua3MKKyAqIHRoYXQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVjb3JkZWQgZm9yIGVhY2ggZGlyZWN0b3J5LiBGaW5hbGx5LCBpdCBjYW4gYmUKKyAqIHVzZWQgdG8gcmVtb3ZlIGEgc3ltbGluayB3aXRob3V0IGRlbGV0aW5nIHRoZSBhc3NvY2lhdGVkIHJlc291cmNlLgorICoKKyAqIDxwPiBVc2FnZSBleGFtcGxlczoKKyAqCisgKiA8cD4gTWFrZSBhIGxpbmsgbmFtZWQgJnF1b3Q7Zm9vJnF1b3Q7IHRvIGEgcmVzb3VyY2UgbmFtZWQKKyAqICZxdW90O2Jhci5mb28mcXVvdDsgaW4gc3ViZGlyOgorICogPHByZT4KKyAqICZsdDtzeW1saW5rIGxpbms9JnF1b3Q7JHtkaXIudG9wfS9mb28mcXVvdDsgcmVzb3VyY2U9JnF1b3Q7JHtkaXIudG9wfS9zdWJkaXIvYmFyLmZvbyZxdW90Oy8mZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4gUmVjb3JkIGFsbCBsaW5rcyBpbiBzdWJkaXIgYW5kIGl0cyBkZXNjZW5kYW50cyBpbiBmaWxlcyBuYW1lZAorICogJnF1b3Q7ZGlyLmxpbmtzJnF1b3Q7OgorICogPHByZT4KKyAqICZsdDtzeW1saW5rIGFjdGlvbj0mcXVvdDtyZWNvcmQmcXVvdDsgbGlua2ZpbGVuYW1lPSZxdW90O2Rpci5saW5rcyZxdW90OyZndDsKKyAqICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2Rpci50b3B9JnF1b3Q7IGluY2x1ZGVzPSZxdW90O3N1YmRpciYjNDc7KiomcXVvdDsgLyZndDsKKyAqICZsdDsvc3ltbGluayZndDsKKyAqIDwvcHJlPgorICoKKyAqIDxwPiBSZWNyZWF0ZSB0aGUgbGlua3MgcmVjb3JkZWQgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGU6CisgKiA8cHJlPgorICogJmx0O3N5bWxpbmsgYWN0aW9uPSZxdW90O3JlY3JlYXRlJnF1b3Q7Jmd0OworICogICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7ZGlyLnRvcH0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7c3ViZGlyJiM0NzsqKiYjNDc7ZGlyLmxpbmtzJnF1b3Q7IC8mZ3Q7CisgKiAmbHQ7L3N5bWxpbmsmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4gRGVsZXRlIGEgbGluayBuYW1lZCAmcXVvdDtmb28mcXVvdDsgdG8gYSByZXNvdXJjZSBuYW1lZAorICogJnF1b3Q7YmFyLmZvbyZxdW90OyBpbiBzdWJkaXI6CisgKiA8cHJlPgorICogJmx0O3N5bWxpbmsgYWN0aW9uPSZxdW90O2RlbGV0ZSZxdW90OyBsaW5rPSZxdW90OyR7ZGlyLnRvcH0vZm9vJnF1b3Q7LyZndDsKKyAqIDwvcHJlPgorICoKKyAqIDxwPjxzdHJvbmc+TElNSVRBVElPTlM6PC9zdHJvbmc+IEJlY2F1c2UgSmF2YSBoYXMgbm8gZGlyZWN0IHN1cHBvcnQgZm9yCisgKiBoYW5kbGluZyBzeW1saW5rcyB0aGlzIHRhc2sgZGl2aW5lcyB0aGVtIGJ5IGNvbXBhcmluZyBjYW5vbmljYWwgYW5kCisgKiBhYnNvbHV0ZSBwYXRocy4gT24gbm9uLXVuaXggc3lzdGVtcyB0aGlzIG1heSBjYXVzZSBmYWxzZSBwb3NpdGl2ZXMuCisgKiBGdXJ0aGVybW9yZSwgYW55IG9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGNvbW1hbmQKKyAqIDxjb2RlPmxuIC1zIGxpbmsgcmVzb3VyY2U8L2NvZGU+IGlzIG5vdCBhIHZhbGlkIGNvbW1hbmQgb24gdGhlIGNvbW1hbmQgbGluZQorICogd2lsbCBub3QgYmUgYWJsZSB0byB1c2UgYWN0aW9uPSZxdW90O2RlbGV0ZSZxdW90OywgYWN0aW9uPSZxdW90O3NpbmdsZSZxdW90OworICogb3IgYWN0aW9uPSZxdW90O3JlY3JlYXRlJnF1b3Q7LCBidXQgYWN0aW9uPSZxdW90O3JlY29yZCZxdW90OyBzaG91bGQgc3RpbGwKKyAqIHdvcmsuIEZpbmFsbHksIHRoZSBsYWNrIG9mIHN1cHBvcnQgZm9yIHN5bWxpbmtzIGluIEphdmEgbWVhbnMgdGhhdCBhbGwgbGlua3MKKyAqIGFyZSByZWNvcmRlZCBhcyBsaW5rcyB0byB0aGUgPHN0cm9uZz5jYW5vbmljYWw8L3N0cm9uZz4gcmVzb3VyY2UgbmFtZS4KKyAqIFRoZXJlZm9yZSB0aGUgbGluazogPGNvZGU+bGluayAtLT4gc3ViZGlyL2Rpci8uLi9mb28uYmFyPC9jb2RlPiB3aWxsIGJlCisgKiByZWNvcmRlZCBhcyA8Y29kZT5saW5rPXN1YmRpci9mb28uYmFyPC9jb2RlPiBhbmQgcmVzdG9yZWQgYXMKKyAqIDxjb2RlPmxpbmsgLS0+IHN1YmRpci9mb28uYmFyPC9jb2RlPi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTeW1saW5rIGV4dGVuZHMgRGlzcGF0Y2hUYXNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlOworICAgIHByaXZhdGUgU3RyaW5nIGxpbms7CisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsZVNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbGlua0ZpbGVOYW1lOworICAgIHByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxvbmVycm9yOworICAgIHByaXZhdGUgYm9vbGVhbiBleGVjdXRpbmcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIHRhc2suCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuaW5pdCgpOworICAgICAgICBzZXREZWZhdWx0cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdGFuZGFyZCBtZXRob2QgZm9yIGV4ZWN1dGluZyBhbnkgdGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGV4ZWN1dGluZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJJbmZpbml0ZSByZWN1cnNpb24gZGV0ZWN0ZWQgaW4gU3ltbGluay5leGVjdXRlKCkiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIERpc3BhdGNoVXRpbHMuZXhlY3V0ZSh0aGlzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dGluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc3ltbGluay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2luZ2xlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoIk11c3QgZGVmaW5lIHRoZSByZXNvdXJjZSB0byBzeW1saW5rIHRvISIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiTXVzdCBkZWZpbmUgdGhlIGxpbmsgbmFtZSBmb3Igc3ltbGluayEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkb0xpbmsocmVzb3VyY2UsIGxpbmspOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2V0RGVmYXVsdHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhIHN5bWxpbmsuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobGluayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoIk11c3QgZGVmaW5lIHRoZSBsaW5rIG5hbWUgZm9yIHN5bWxpbmshIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJSZW1vdmluZyBzeW1saW5rOiAiICsgbGluayk7CisgICAgICAgICAgICBkZWxldGVTeW1saW5rKGxpbmspOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgeworICAgICAgICAgICAgaGFuZGxlRXJyb3IoZm5mZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihpb2UudG9TdHJpbmcoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXREZWZhdWx0cygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdG9yZSBzeW1saW5rcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjcmVhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZpbGVTZXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJGaWxlIHNldCBpZGVudGlmeWluZyBsaW5rIGZpbGUocykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlcXVpcmVkIGZvciBhY3Rpb24gcmVjcmVhdGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQcm9wZXJ0aWVzIGxpbmtzID0gbG9hZExpbmtzKGZpbGVTZXRzKTsKKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBraXRyID0gbGlua3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsga2l0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxuayA9IChTdHJpbmcpIGtpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyByZXMgPSBsaW5rcy5nZXRQcm9wZXJ0eShsbmspOworICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBsbmsgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IChidWcgMjUxODEpCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSB0ZXN0ID0gbmV3IEZpbGUobG5rKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGSUxFX1VUSUxTLmlzU3ltYm9saWNMaW5rKG51bGwsIGxuaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvTGluayhyZXMsIGxuayk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRlc3QuZ2V0Q2Fub25pY2FsUGF0aCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHJlcykuZ2V0Q2Fub25pY2FsUGF0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlU3ltbGluayhsbmspOworICAgICAgICAgICAgICAgICAgICAgICAgZG9MaW5rKHJlcywgbG5rKTsKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbHNlIGxuayBleGlzdHMsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoIklPIGV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyBsaW5rIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2V0RGVmYXVsdHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCBzeW1saW5rcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjb3JkKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaWxlU2V0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiRmlsZXNldCBpZGVudGlmeWluZyBsaW5rcyB0byByZWNvcmQgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGlua0ZpbGVOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiTmFtZSBvZiBmaWxlIHRvIHJlY29yZCBsaW5rcyBpbiByZXF1aXJlZCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGhhc2h0YWJsZSB0byBncm91cCB0aGVtIGJ5IHBhcmVudCBkaXJlY3Rvcnk6CisgICAgICAgICAgICBIYXNodGFibGUgYnlEaXIgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgICAgIC8vIGdldCBhbiBJdGVyYXRvciBvZiBmaWxlIG9iamVjdHMgcmVwcmVzZW50aW5nIGxpbmtzIChjYW5vbmljYWwpOgorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBsaXRyID0gZmluZExpbmtzKGZpbGVTZXRzKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGxpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEZpbGUgdGhpc0xpbmsgPSAoRmlsZSkgbGl0ci5uZXh0KCk7CisgICAgICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSB0aGlzTGluay5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAgICAgVmVjdG9yIHYgPSAoVmVjdG9yKSBieURpci5nZXQocGFyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIGJ5RGlyLnB1dChwYXJlbnQsIHYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2LmFkZEVsZW1lbnQodGhpc0xpbmspOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd3JpdGUgYSBQcm9wZXJ0aWVzIGZpbGUgaW4gZWFjaCBkaXJlY3Rvcnk6CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGRpcnMgPSBieURpci5rZXlTZXQoKS5pdGVyYXRvcigpOyBkaXJzLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGRpciA9IChGaWxlKSBkaXJzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBWZWN0b3IgbGlua3NJbkRpciA9IChWZWN0b3IpIGJ5RGlyLmdldChkaXIpOworICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgbGlua3NUb1N0b3JlID0gbmV3IFByb3BlcnRpZXMoKTsKKworICAgICAgICAgICAgICAgIC8vIGZpbGwgdXAgYSBQcm9wZXJ0aWVzIG9iamVjdCB3aXRoIGxpbmsgYW5kIHJlc291cmNlIG5hbWVzOgorICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZGxuayA9IGxpbmtzSW5EaXIuaXRlcmF0b3IoKTsgZGxuay5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgbG5rID0gKEZpbGUpIGRsbmsubmV4dCgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlua3NUb1N0b3JlLnB1dChsbmsuZ2V0TmFtZSgpLCBsbmsuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiQ291bGRuJ3QgZ2V0IGNhbm9uaWNhbCBuYW1lIG9mIHBhcmVudCBsaW5rIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eUZpbGUobGlua3NUb1N0b3JlLCBkaXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2V0RGVmYXVsdHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgdmFyaWFibGVzIHRvIHRoZWlyIGRlZmF1bHQgc3RhdGUgZm9yIHRoZSBuZXh0IGludm9jYXRpb24uCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdHMoKSB7CisgICAgICAgIHJlc291cmNlID0gbnVsbDsKKyAgICAgICAgbGluayA9IG51bGw7CisgICAgICAgIGxpbmtGaWxlTmFtZSA9IG51bGw7CisgICAgICAgIGZhaWxvbmVycm9yID0gdHJ1ZTsgICAvLyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGZhaWwgb24gYW4gZXJyb3IKKyAgICAgICAgb3ZlcndyaXRlID0gZmFsc2U7ICAgIC8vIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gbm90IG92ZXJ3cml0ZQorICAgICAgICBzZXRBY3Rpb24oInNpbmdsZSIpOyAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3IgaXMgbWFrZSBhIHNpbmdsZSBsaW5rCisgICAgICAgIGZpbGVTZXRzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG92ZXJ3cml0ZSBtb2RlLiBJZiBzZXQgdG8gZmFsc2UgKGRlZmF1bHQpCisgICAgICogdGhlIHRhc2sgd2lsbCBub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGxpbmtzLCBhbmQgbWF5IHN0b3AgdGhlIGJ1aWxkCisgICAgICogaWYgYSBsaW5rIGFscmVhZHkgZXhpc3RzIGRlcGVuZGluZyBvbiB0aGUgc2V0dGluZyBvZiBmYWlsb25lcnJvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd3JpdGUgSWYgdHJ1ZSBvdmVyd3JpdGUgZXhpc3RpbmcgbGlua3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlKGJvb2xlYW4gb3dyaXRlKSB7CisgICAgICAgIHRoaXMub3ZlcndyaXRlID0gb3dyaXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBmYWlsb25lcnJvciBtb2RlLiBJZiBzZXQgdG8gdHJ1ZSAoZGVmYXVsdCkgdGhlIGVudGlyZSBidWlsZCBmYWlscworICAgICAqIHVwb24gZXJyb3I7IG90aGVyd2lzZSB0aGUgZXJyb3IgaXMgbG9nZ2VkIGFuZCB0aGUgYnVpbGQgd2lsbCBjb250aW51ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmb2UgICAgSWYgdHJ1ZSB0aHJvdyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvciwgZWxzZSBsb2cgaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbE9uRXJyb3IoYm9vbGVhbiBmb2UpIHsKKyAgICAgICAgdGhpcy5mYWlsb25lcnJvciA9IGZvZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQuICBNYXkgYmUgJnF1b3Q7c2luZ2xlJnF1b3Q7LAorICAgICAqICZxdW90O2RlbGV0ZSZxdW90OywgJnF1b3Q7cmVjcmVhdGUmcXVvdDsgb3IgJnF1b3Q7cmVjb3JkJnF1b3Q7LgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGlvbiAgICBUaGUgYWN0aW9uIHRvIHBlcmZvcm0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgc3VwZXIuc2V0QWN0aW9uKGFjdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBsaW5rLiBVc2VkIHdoZW4gYWN0aW9uID0gJnF1b3Q7c2luZ2xlJnF1b3Q7LgorICAgICAqCisgICAgICogQHBhcmFtIGxuayAgICAgVGhlIG5hbWUgZm9yIHRoZSBsaW5rLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIGxuaykgeworICAgICAgICB0aGlzLmxpbmsgPSBsbms7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byB3aGljaCBhIGxpbmsgc2hvdWxkIGJlIGNyZWF0ZWQuCisgICAgICogVXNlZCB3aGVuIGFjdGlvbiA9ICZxdW90O3NpbmdsZSZxdW90Oy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmMgICAgICBUaGUgcmVzb3VyY2UgdG8gYmUgbGlua2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlKFN0cmluZyBzcmMpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHNyYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gd2hpY2ggbGlua3Mgd2lsbCBiZSB3cml0dGVuLgorICAgICAqIFVzZWQgd2hlbiBhY3Rpb24gPSAmcXVvdDtyZWNvcmQmcXVvdDsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGYgICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byB3cml0ZSBsaW5rcyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaW5rZmlsZW5hbWUoU3RyaW5nIGxmKSB7CisgICAgICAgIHRoaXMubGlua0ZpbGVOYW1lID0gbGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZmlsZXNldCB0byB0aGlzIHRhc2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2V0ICAgICAgVGhlIGZpbGVzZXQgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKKyAgICAgICAgZmlsZVNldHMuYWRkRWxlbWVudChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhIHN5bWxpbmsgKHdpdGhvdXQgZGVsZXRpbmcgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2UpLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHNpbXBseSBpbnZva2VzCisgICAgICogPGNvZGU+ZGVsZXRlU3ltbGluayhqYXZhLmlvLkZpbGUpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggb2YgdGhlIHN5bWxpbmsgdG8gZGVsZXRlLgorICAgICAqCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gICBXaGVuIHRoZSBwYXRoIHJlc3VsdHMgaW4gYQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5GaWxlPC9jb2RlPiB0aGF0IGRvZXNuJ3QgZXhpc3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICBJZiBjYWxscyB0byA8Y29kZT5GaWxlLnJlbmFtZTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgPGNvZGU+RmlsZS5kZWxldGU8L2NvZGU+IGZhaWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVN5bWxpbmsoU3RyaW5nIHBhdGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgZGVsZXRlU3ltbGluayhuZXcgRmlsZShwYXRoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgc3ltbGluayAod2l0aG91dCBkZWxldGluZyB0aGUgYXNzb2NpYXRlZCByZXNvdXJjZSkuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGlzIGEgdXRpbGl0eSBtZXRob2QgdGhhdCByZW1vdmVzIGEgdW5peCBzeW1saW5rIHdpdGhvdXQgcmVtb3ZpbmcKKyAgICAgKiB0aGUgcmVzb3VyY2UgdGhhdCB0aGUgc3ltbGluayBwb2ludHMgdG8uIElmIGl0IGlzIGFjY2lkZW50YWxseSBpbnZva2VkCisgICAgICogb24gYSByZWFsIGZpbGUsIHRoZSByZWFsIGZpbGUgd2lsbCBub3QgYmUgaGFybWVkLCBidXQgYW4gZXhjZXB0aW9uCisgICAgICogd2lsbCBiZSB0aHJvd24gd2hlbiB0aGUgZGVsZXRpb24gaXMgYXR0ZW1wdGVkLiBUaGlzIG1ldGhvZCB3b3JrcyBieQorICAgICAqIGdldHRpbmcgdGhlIGNhbm9uaWNhbCBwYXRoIG9mIHRoZSBsaW5rLCB1c2luZyB0aGUgY2Fub25pY2FsIHBhdGggdG8KKyAgICAgKiByZW5hbWUgdGhlIHJlc291cmNlIChicmVha2luZyB0aGUgbGluaykgYW5kIHRoZW4gZGVsZXRpbmcgdGhlIGxpbmsuCisgICAgICogVGhlIHJlc291cmNlIGlzIHRoZW4gcmV0dXJuZWQgdG8gaXRzIG9yaWdpbmFsIG5hbWUgaW5zaWRlIGEgZmluYWxseQorICAgICAqIGJsb2NrIHRvIGVuc3VyZSB0aGF0IHRoZSByZXNvdXJjZSBpcyB1bmhhcm1lZCBldmVuIGluIHRoZSBldmVudCBvZgorICAgICAqIGFuIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5rZmlsICAgIEEgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IG9mIHRoZSBzeW1saW5rIHRvIGRlbGV0ZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgSWYgY2FsbHMgdG8gPGNvZGU+RmlsZS5yZW5hbWU8L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5GaWxlLmRlbGV0ZTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+RmlsZS5nZXRDYW5vbmljYWxQYXRoPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVTeW1saW5rKEZpbGUgbGlua2ZpbCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFsaW5rZmlsLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBzdWNoIHN5bWxpbms6ICIgKyBsaW5rZmlsKTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaW5kIHRoZSByZXNvdXJjZSBvZiB0aGUgZXhpc3RpbmcgbGluazoKKyAgICAgICAgRmlsZSBjYW5maWwgPSBsaW5rZmlsLmdldENhbm9uaWNhbEZpbGUoKTsKKworICAgICAgICAvLyByZW5hbWUgdGhlIHJlc291cmNlLCB0aHVzIGJyZWFraW5nIHRoZSBsaW5rOgorICAgICAgICBGaWxlIHRlbXAgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKCJzeW1saW5rIiwgIi50bXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmZpbC5nZXRQYXJlbnRGaWxlKCksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVuYW1lKGNhbmZpbCwgdGVtcCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcmVuYW1lIHJlc291cmNlIHdoZW4gYXR0ZW1wdGluZyB0byBkZWxldGUgIgorICAgICAgICAgICAgICAgICAgICArIGxpbmtmaWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSAobm93KSBicm9rZW4gbGluazoKKyAgICAgICAgICAgIGlmICghbGlua2ZpbC5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGRuJ3QgZGVsZXRlIHN5bWxpbms6ICIgKyBsaW5rZmlsCisgICAgICAgICAgICAgICAgICAgICsgIiAod2FzIGl0IGEgcmVhbCBmaWxlPyBpcyB0aGlzIG5vdCBhIFVOSVggc3lzdGVtPykiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcmVzb3VyY2UgdG8gaXRzIG9yaWdpbmFsIG5hbWU6CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVuYW1lKHRlbXAsIGNhbmZpbCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZG4ndCByZXR1cm4gcmVzb3VyY2UgIiArIHRlbXAKKyAgICAgICAgICAgICAgICAgICAgKyAiIHRvIGl0cyBvcmlnaW5hbCBuYW1lOiAiICsgY2FuZmlsLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICsgIlxuIFRIRSBSRVNPVVJDRSdTIE5BTUUgT04gRElTSyBIQVMgIgorICAgICAgICAgICAgICAgICAgICArICJCRUVOIENIQU5HRUQgQlkgVEhJUyBFUlJPUiFcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBwcm9wZXJ0aWVzIGZpbGUuIFRoaXMgbWV0aG9kIHVzZXMgPGNvZGU+UHJvcGVydGllcy5zdG9yZTwvY29kZT4KKyAgICAgKiBhbmQgdGh1cyBtYXkgdGhyb3cgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIHdoaWxlIHdyaXRpbmcgdGhlIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAgICAgVGhlIHByb3BlcnRpZXMgb2JqZWN0IHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGRpciAgICAgICAgICAgIFRoZSBkaXJlY3RvcnkgZm9yIHdoaWNoIHdlIGFyZSB3cml0aW5nIHRoZSBsaW5rcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBwcm9wZXJ0eSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUHJvcGVydHlGaWxlKFByb3BlcnRpZXMgcHJvcGVydGllcywgRmlsZSBkaXIpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGlyLCBsaW5rRmlsZU5hbWUpKSk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKGJvcywgIlN5bWxpbmtzIGZyb20gIiArIGRpcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoYm9zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSBlcnJvcnMgYmFzZWQgb24gdGhlIHNldHRpbmcgb2YgZmFpbG9uZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnICAgIFRoZSBtZXNzYWdlIHRvIGxvZywgb3IgaW5jbHVkZSBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIDxjb2RlPkJ1aWxkRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHdpdGggdGhlIG1lc3NhZ2UgaWYgZmFpbG9uZXJyb3I9dHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFcnJvcihTdHJpbmcgbXNnKSB7CisgICAgICAgIGlmIChmYWlsb25lcnJvcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgbG9nKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZHVjdCB0aGUgYWN0dWFsIGNvbnN0cnVjdGlvbiBvZiBhIGxpbmsuCisgICAgICoKKyAgICAgKiA8cD4gVGhlIGxpbmsgaXMgY29uc3RydWN0ZWQgYnkgY2FsbGluZyA8Y29kZT5FeGVjdXRlLnJ1bkNvbW1hbmQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcyAgIFRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSB3ZSBhcmUgbGlua2luZyB0by4KKyAgICAgKiBAcGFyYW0gbG5rICAgICAgIFRoZSBuYW1lIG9mIHRoZSBsaW5rIHdlIHdpc2ggdG8gbWFrZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHdoZW4gdGhpbmdzIGdvIHdyb25nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvTGluayhTdHJpbmcgcmVzLCBTdHJpbmcgbG5rKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBGaWxlIGxpbmtmaWwgPSBuZXcgRmlsZShsbmspOworICAgICAgICBTdHJpbmcgb3B0aW9ucyA9ICItcyI7CisgICAgICAgIGlmIChvdmVyd3JpdGUpIHsKKyAgICAgICAgICAgIG9wdGlvbnMgKz0gImYiOworICAgICAgICAgICAgaWYgKGxpbmtmaWwuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVTeW1saW5rKGxpbmtmaWwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiU3ltbGluayBkaXNhcHBlYXJlZCBiZWZvcmUgaXQgd2FzIGRlbGV0ZWQ6ICIgKyBsbmspOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBvdmVyd3JpdGUgcHJlZXhpc3RpbmcgbGluayBvciBmaWxlOiAiICsgbG5rLAorICAgICAgICAgICAgICAgICAgICAgICAgaW9lLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gY21kID0gbmV3IFN0cmluZ1tdIHsibG4iLCBvcHRpb25zLCByZXMsIGxua307CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRlLnJ1bkNvbW1hbmQodGhpcywgY21kKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZmFpbGVkVG9FeGVjdXRlKSB7CisgICAgICAgICAgICBpZiAoZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBmYWlsZWRUb0V4ZWN1dGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vbG9nIGF0IHRoZSBpbmZvIGxldmVsLCBhbmQga2VlcCBnb2luZy4KKyAgICAgICAgICAgICAgICBsb2coZmFpbGVkVG9FeGVjdXRlLmdldE1lc3NhZ2UoKSwgZmFpbGVkVG9FeGVjdXRlLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYWxsIHRoZSBsaW5rcyBpbiBhbGwgc3VwcGxpZWQgZmlsZXNldHMuCisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzCisgICAgICogJnF1b3Q7cmVjb3JkJnF1b3Q7LiBUaGlzIG1lYW5zIHRoYXQgZmlsZXNldHMgYXJlIGludGVycHJldGVkCisgICAgICogYXMgdGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIGxpbmtzIG1heSBiZSBmb3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ICAgVGhlIGZpbGVzZXRzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAgICAgKiBAcmV0dXJuIEEgSGFzaFNldCBvZiA8Y29kZT5GaWxlPC9jb2RlPiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlCisgICAgICogICAgICAgICBsaW5rcyAod2l0aCBjYW5vbmljYWwgcGFyZW50IGRpcmVjdG9yaWVzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hTZXQgZmluZExpbmtzKFZlY3RvciB2KSB7CisgICAgICAgIEhhc2hTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIHYuZ2V0KGkpOworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIFN0cmluZ1tdW10gZm5kID0gbmV3IFN0cmluZ1tdW10KKyAgICAgICAgICAgICAgICB7ZHMuZ2V0SW5jbHVkZWRGaWxlcygpLCBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCl9OworICAgICAgICAgICAgRmlsZSBkaXIgPSBmcy5nZXREaXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZm5kLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBmbmRbal0ubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgZm5kW2pdW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgcGYgPSBmLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRklMRV9VVElMUy5pc1N5bWJvbGljTGluayhwZiwgbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBGaWxlKHBmLmdldENhbm9uaWNhbEZpbGUoKSwgbmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiSU9FeGNlcHRpb246ICIgKyBmbmRbal1ba10gKyAiIG9taXR0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgbGlua3MgZnJvbSBwcm9wZXJ0aWVzIGZpbGVzIGluY2x1ZGVkIGluIG9uZSBvciBtb3JlIEZpbGVTZXRzLgorICAgICAqCisgICAgICogPHA+IFRoaXMgbWV0aG9kIGlzIG9ubHkgaW52b2tlZCB3aGVuIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIHNldCB0bworICAgICAqICZxdW90O3JlY3JlYXRlJnF1b3Q7LiBUaGUgZmlsZXNldHMgcGFzc2VkIGluIGFyZSBhc3N1bWVkIHRvIHNwZWNpZnkgdGhlCisgICAgICogbmFtZXMgb2YgdGhlIHByb3BlcnR5IGZpbGVzIHdpdGggdGhlIGxpbmsgaW5mb3JtYXRpb24gYW5kIHRoZQorICAgICAqIHN1YmRpcmVjdG9yaWVzIGluIHdoaWNoIHRvIGxvb2sgZm9yIHRoZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdiAgICBUaGUgPGNvZGU+RmlsZVNldDwvY29kZT5zIGZvciB0aGlzIHRhc2suCisgICAgICogQHJldHVybiAgICAgICAgICAgIFRoZSBsaW5rcyB0byBiZSBtYWRlLgorICAgICAqLworICAgIHByaXZhdGUgUHJvcGVydGllcyBsb2FkTGlua3MoVmVjdG9yIHYpIHsKKyAgICAgICAgUHJvcGVydGllcyBmaW5hbExpc3QgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIHN1cHBsaWVkIGZpbGUgc2V0czoKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIHYuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgICAgICBmcy5zZXR1cERpcmVjdG9yeVNjYW5uZXIoZHMsIGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBkcy5zZXRGb2xsb3dTeW1saW5rcyhmYWxzZSk7CisgICAgICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgICAgICBTdHJpbmdbXSBpbmNzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICAgICAgRmlsZSBkaXIgPSBmcy5nZXREaXIoZ2V0UHJvamVjdCgpKTsKKworICAgICAgICAgICAgLy8gbG9hZCBpbmNsdWRlZCBmaWxlcyBhcyBwcm9wZXJ0aWVzIGZpbGVzOgorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbmNzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgRmlsZSBpbmMgPSBuZXcgRmlsZShkaXIsIGluY3Nbal0pOworICAgICAgICAgICAgICAgIEZpbGUgcGYgPSBpbmMuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgbG5rcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbG5rcy5sb2FkKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5jKSkpOworICAgICAgICAgICAgICAgICAgICBwZiA9IHBmLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiVW5hYmxlIHRvIGZpbmQgIiArIGluY3Nbal0gKyAiOyBza2lwcGluZyBpdC4iKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJVbmFibGUgdG8gb3BlbiAiICsgaW5jc1tqXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgb3IgaXRzIHBhcmVudCBkaXI7IHNraXBwaW5nIGl0LiIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG5rcy5saXN0KG5ldyBQcmludFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19JTkZPKSkpOworICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBjb250ZW50cyB0byBvdXIgbWFzdGVyIGxpc3Qgb2YgbGlua3MKKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgYWxsIGxpbmtzIGFyZSBkZWZpbmVkIGluCisgICAgICAgICAgICAgICAgLy8gdGVybXMgb2YgYWJzb2x1dGUgcGF0aHMsIG9yIHBhdGhzIHJlbGF0aXZlIHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIHdvcmtpbmcgZGlyZWN0b3J5OgorICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3Iga2l0ciA9IGxua3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsga2l0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBraXRyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxMaXN0LnB1dChuZXcgRmlsZShwZiwga2V5KS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxua3MuZ2V0UHJvcGVydHkoa2V5KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5hbExpc3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDA0ODdjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTLmphdmEKQEAgLTAsMCArMSw3ODMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBBIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHRhc2tzIGZvciBleGVjdXRpbmcgY29tbWFuZHMgb24gVmlzdWFsIFNvdXJjZVNhZmUuCisgKiA8cD4KKyAqIFRoZSBjbGFzcyBleHRlbmRzIHRoZSAnZXhlYycgdGFzayBhcyBpdCBvcGVyYXRlcyBieSBleGVjdXRpbmcgdGhlIHNzLmV4ZSBwcm9ncmFtCisgKiBzdXBwbGllZCB3aXRoIFNvdXJjZVNhZmUuIEJ5IGRlZmF1bHQgdGhlIHRhc2sgZXhwZWN0cyBzcy5leGUgdG8gYmUgaW4gdGhlIHBhdGgsCisgKiB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYmUgc3BlY2lmeWluZyB0aGUgc3NkaXIgYXR0cmlidXRlLgorICogPC9wPgorICogPHA+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHNldCBhbmQgZ2V0IG1ldGhvZHMgZm9yICdsb2dpbicgYW5kICd2c3NwYXRoJyBhdHRyaWJ1dGVzLiBJdAorICogYWxzbyBjb250YWlucyBjb25zdGFudHMgZm9yIHRoZSBmbGFncyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gU1MuCisgKiA8L3A+CisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTVNWU1MgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgTVNWU1NDb25zdGFudHMgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3NEaXIgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHZzc0xvZ2luID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyB2c3NQYXRoID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJQYXRoID0gbnVsbDsKKworICAgIC8qKiAgVmVyc2lvbiAqLworICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb24gPSBudWxsOworICAgIC8qKiAgRGF0ZSAqLworICAgIHByaXZhdGUgU3RyaW5nIGRhdGUgPSBudWxsOworICAgIC8qKiAgTGFiZWwgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsYWJlbCA9IG51bGw7CisgICAgLyoqICBBdXRvIHJlc3BvbnNlICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0b1Jlc3BvbnNlID0gbnVsbDsKKyAgICAvKiogIExvY2FsIHBhdGggKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2NhbFBhdGggPSBudWxsOworICAgIC8qKiAgQ29tbWVudCAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOworICAgIC8qKiAgRnJvbSBsYWJlbCAqLworICAgIHByaXZhdGUgU3RyaW5nIGZyb21MYWJlbCA9IG51bGw7CisgICAgLyoqICBUbyBsYWJlbCAqLworICAgIHByaXZhdGUgU3RyaW5nIHRvTGFiZWwgPSBudWxsOworICAgIC8qKiAgT3V0cHV0IGZpbGUgbmFtZSAqLworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEZpbGVOYW1lID0gbnVsbDsKKyAgICAvKiogIFVzZXIgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VyID0gbnVsbDsKKyAgICAvKiogIEZyb20gZGF0ZSAqLworICAgIHByaXZhdGUgU3RyaW5nIGZyb21EYXRlID0gbnVsbDsKKyAgICAvKiogIFRvIGRhdGUgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0b0RhdGUgPSBudWxsOworICAgIC8qKiAgSGlzdG9yeSBzdHlsZSAqLworICAgIHByaXZhdGUgU3RyaW5nIHN0eWxlID0gbnVsbDsKKyAgICAvKiogIFF1aWV0IGRlZmF1bHRzIHRvIGZhbHNlICovCisgICAgcHJpdmF0ZSBib29sZWFuIHF1aWV0ID0gZmFsc2U7CisgICAgLyoqICBSZWN1cnNpdmUgZGVmYXVsdHMgdG8gZmFsc2UgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVjdXJzaXZlID0gZmFsc2U7CisgICAgLyoqICBXcml0YWJsZSBkZWZhdWx0cyB0byBmYWxzZSAqLworICAgIHByaXZhdGUgYm9vbGVhbiB3cml0YWJsZSA9IGZhbHNlOworICAgIC8qKiAgRmFpbCBvbiBlcnJvciBkZWZhdWx0cyB0byB0cnVlICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKKyAgICAvKiogIEdldCBsb2NhbCBjb3B5IGZvciBjaGVja291dCBkZWZhdWx0cyB0byB0cnVlICovCisgICAgcHJpdmF0ZSBib29sZWFuIGdldExvY2FsQ29weSA9IHRydWU7CisgICAgLyoqICBOdW1iZXIgb2YgZGF5cyBvZmZzZXQgZm9yIEhpc3RvcnkgKi8KKyAgICBwcml2YXRlIGludCBudW1EYXlzID0gSW50ZWdlci5NSU5fVkFMVUU7CisgICAgLyoqICBEYXRlIGZvcm1hdCBmb3IgSGlzdG9yeSAqLworICAgIHByaXZhdGUgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCk7CisgICAgLyoqICBUaW1lc3RhbXAgZm9yIHJldHJlaXZlZCBmaWxlcyAqLworICAgIHByaXZhdGUgQ3VycmVudE1vZFVwZGF0ZWQgdGltZXN0YW1wID0gbnVsbDsKKyAgICAvKiogIEJlaGF2aW91ciBmb3Igd3JpdGFibGUgZmlsZXMgKi8KKyAgICBwcml2YXRlIFdyaXRhYmxlRmlsZXMgd3JpdGFibGVGaWxlcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBFYWNoIHN1Yi1jbGFzcyBtdXN0IGltcGxlbW50IHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gdGhlIGNvbnN0cnVjdGVkCisgICAgICogY29tbWFuZCBsaW5lIHRvIGJlIGV4ZWN1dGVkLiBJdCBpcyB1cCB0byB0aGUgc3ViLXRhc2sgdG8gZGV0ZXJtaW5lIHRoZQorICAgICAqIHJlcXVpcmVkIGF0dHJ1YnV0ZXMgYW5kIHRoZWlyIG9yZGVyLgorICAgICAqIEByZXR1cm4gICAgVGhlIENvbnN0cnVjdGVkIGNvbW1hbmQgbGluZS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBDb21tYW5kbGluZSBidWlsZENtZExpbmUoKTsKKworICAgIC8qKgorICAgICAqIERpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXMuCisgICAgICogQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILgorICAgICAqIEBwYXJhbSAgZGlyICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc3MuZXhlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNzZGlyKFN0cmluZyBkaXIpIHsKKyAgICAgICAgdGhpcy5zc0RpciA9IEZpbGVVdGlscy50cmFuc2xhdGVQYXRoKGRpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCIuCisgICAgICogPHA+CisgICAgICogWW91IGNhbiBvbWl0IHRoZSBwYXNzd29yZCBpZiB5b3VyIGRhdGFiYXNlIGlzIG5vdCBwYXNzd29yZCBwcm90ZWN0ZWQuCisgICAgICogSWYgeW91IGhhdmUgYSBwYXNzd29yZCBhbmQgb21pdCBpdCwgQW50IHdpbGwgaGFuZy4KKyAgICAgKiBAcGFyYW0gIHZzc0xvZ2luICBUaGUgbG9naW4gc3RyaW5nIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRMb2dpbihmaW5hbCBTdHJpbmcgdnNzTG9naW4pIHsKKyAgICAgICAgdGhpcy52c3NMb2dpbiA9IHZzc0xvZ2luOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byBwZXJmb3JtCisgICAgICogdGhlIGFjdGlvbiBvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHByZWZpeCBvZiAndnNzOi8vJyB3aWxsIGJlIHJlbW92ZWQgaWYgc3BlY2lmaWVkLgorICAgICAqIEBwYXJhbSAgdnNzUGF0aCAgVGhlIFZTUyBwcm9qZWN0IHBhdGguCisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9InJlcXVpcmVkIgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZzc3BhdGgoZmluYWwgU3RyaW5nIHZzc1BhdGgpIHsKKyAgICAgICAgU3RyaW5nIHByb2plY3RQYXRoOworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICBpZiAodnNzUGF0aC5zdGFydHNXaXRoKCJ2c3M6Ly8iKSkgeyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBwcm9qZWN0UGF0aCA9IHZzc1BhdGguc3Vic3RyaW5nKDUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvamVjdFBhdGggPSB2c3NQYXRoOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKworICAgICAgICBpZiAocHJvamVjdFBhdGguc3RhcnRzV2l0aChQUk9KRUNUX1BSRUZJWCkpIHsKKyAgICAgICAgICAgIHRoaXMudnNzUGF0aCA9IHByb2plY3RQYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy52c3NQYXRoID0gUFJPSkVDVF9QUkVGSVggKyBwcm9qZWN0UGF0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlcy4KKyAgICAgKiBAcGFyYW0gIHNlcnZlclBhdGggIFRoZSBwYXRoIHRvIHRoZSBWU1Mgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNlcnZlcnBhdGgoZmluYWwgU3RyaW5nIHNlcnZlclBhdGgpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXJQYXRoID0gc2VydmVyUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGJ1aWxkIHNob3VsZCBmYWlsIGlmIHRoZSBTb3VyY2VzYWZlIGNvbW1hbmQgZG9lcy4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKiBAcGFyYW0gZmFpbE9uRXJyb3IgVHJ1ZSBpZiB0YXNrIHNob3VsZCBmYWlsIG9uIGFueSBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRGYWlsT25FcnJvcihmaW5hbCBib29sZWFuIGZhaWxPbkVycm9yKSB7CisgICAgICAgIHRoaXMuZmFpbE9uRXJyb3IgPSBmYWlsT25FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4gPGJyPgorICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIHNzLmV4ZSBhbmQgdGhlbiBjYWxscyBFeGVjJ3MgcnVuIG1ldGhvZAorICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGNhbm5vdCBleGVjdXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBidWlsZENtZExpbmUoKTsKKyAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyb3IoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgZm9ybWF0Q29tbWFuZExpbmUoY29tbWFuZExpbmUpCisgICAgICAgICAgICAgICAgICAgICArICIgV2l0aCBhIHJldHVybiBjb2RlIG9mICIgKyByZXN1bHQ7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNwZWNpYWwgc2V0dGVycyBmb3IgdGhlIHN1Yi1jbGFzc2VzCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGludGVybmFsIGNvbW1lbnQgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBjb21tZW50IHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxDb21tZW50KGZpbmFsIFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRvIHJlc3BvbnNlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gYXV0b1Jlc3BvbnNlIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxBdXRvUmVzcG9uc2UoZmluYWwgU3RyaW5nIGF1dG9SZXNwb25zZSkgeworICAgICAgICB0aGlzLmF1dG9SZXNwb25zZSA9IGF1dG9SZXNwb25zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRhdGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBkYXRlIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxEYXRlKGZpbmFsIFN0cmluZyBkYXRlKSB7CisgICAgICAgIHRoaXMuZGF0ZSA9IGRhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkYXRlIGZvcm1hdCBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGRhdGVGb3JtYXQgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbERhdGVGb3JtYXQoZmluYWwgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0KSB7CisgICAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IGRhdGVGb3JtYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmYWlsT25FcnJvciBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGZhaWxPbkVycm9yIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxGYWlsT25FcnJvcihmaW5hbCBib29sZWFuIGZhaWxPbkVycm9yKSB7CisgICAgICAgIHRoaXMuZmFpbE9uRXJyb3IgPSBmYWlsT25FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZyb20gZGF0ZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGZyb21EYXRlIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxGcm9tRGF0ZShmaW5hbCBTdHJpbmcgZnJvbURhdGUpIHsKKyAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IGZyb21EYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZnJvbSBsYWJlbCBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGZyb21MYWJlbCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsRnJvbUxhYmVsKGZpbmFsIFN0cmluZyBmcm9tTGFiZWwpIHsKKyAgICAgICAgdGhpcy5mcm9tTGFiZWwgPSBmcm9tTGFiZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsYWJlbCBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGxhYmVsIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxMYWJlbChmaW5hbCBTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYWwgcGF0aCBjb21tZW50IGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxQYXRoIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxMb2NhbFBhdGgoZmluYWwgU3RyaW5nIGxvY2FsUGF0aCkgeworICAgICAgICB0aGlzLmxvY2FsUGF0aCA9IGxvY2FsUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG51bSBkYXlzIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gbnVtRGF5cyB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsTnVtRGF5cyhmaW5hbCBpbnQgbnVtRGF5cykgeworICAgICAgICB0aGlzLm51bURheXMgPSBudW1EYXlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0RmlsZU5hbWUgY29tbWVudCBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIG91dHB1dEZpbGVOYW1lIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxPdXRwdXRGaWxlbmFtZShmaW5hbCBTdHJpbmcgb3V0cHV0RmlsZU5hbWUpIHsKKyAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZSA9IG91dHB1dEZpbGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcXVpZXQgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBxdWlldCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUXVpZXQoZmluYWwgYm9vbGVhbiBxdWlldCkgeworICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWN1cnNpdmUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSByZWN1cnNpdmUgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFJlY3Vyc2l2ZShmaW5hbCBib29sZWFuIHJlY3Vyc2l2ZSkgeworICAgICAgICB0aGlzLnJlY3Vyc2l2ZSA9IHJlY3Vyc2l2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0eWxlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFN0eWxlKGZpbmFsIFN0cmluZyBzdHlsZSkgeworICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0byBkYXRlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gdG9EYXRlIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxUb0RhdGUoZmluYWwgU3RyaW5nIHRvRGF0ZSkgeworICAgICAgICB0aGlzLnRvRGF0ZSA9IHRvRGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRvIGxhYmVsIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gdG9MYWJlbCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsVG9MYWJlbChmaW5hbCBTdHJpbmcgdG9MYWJlbCkgeworICAgICAgICB0aGlzLnRvTGFiZWwgPSB0b0xhYmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHVzZXIgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFVzZXIoZmluYWwgU3RyaW5nIHVzZXIpIHsKKyAgICAgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZlcnNpb24gYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxWZXJzaW9uKGZpbmFsIFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3cml0YWJsZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHdyaXRhYmxlIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxXcml0YWJsZShmaW5hbCBib29sZWFuIHdyaXRhYmxlKSB7CisgICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpbWVzdGFtcCBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsRmlsZVRpbWVTdGFtcChmaW5hbCBDdXJyZW50TW9kVXBkYXRlZCB0aW1lc3RhbXApIHsKKyAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3cml0YWJsZUZpbGVzIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gd3JpdGFibGVGaWxlcyB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsV3JpdGFibGVGaWxlcyhmaW5hbCBXcml0YWJsZUZpbGVzIHdyaXRhYmxlRmlsZXMpIHsKKyAgICAgICAgdGhpcy53cml0YWJsZUZpbGVzID0gd3JpdGFibGVGaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdldExvY2FsQ29weSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGdldExvY2FsQ29weSB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEludGVybmFsR2V0TG9jYWxDb3B5KGZpbmFsIGJvb2xlYW4gZ2V0TG9jYWxDb3B5KSB7CisgICAgICAgIHRoaXMuZ2V0TG9jYWxDb3B5ID0gZ2V0TG9jYWxDb3B5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNzY29tbWFuZCBzdHJpbmcuICJzcyIgb3IgImM6XHBhdGhcdG9cc3MiCisgICAgICogQHJldHVybiAgICBUaGUgcGF0aCB0byBzcy5leGUgb3IganVzdCBzcyBpZiBzc2NvbW1hbmQgaXMgbm90IHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNTQ29tbWFuZCgpIHsKKyAgICAgICAgaWYgKHNzRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBTU19FWEU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNzRGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSA/IHNzRGlyICsgU1NfRVhFIDogc3NEaXIKKyAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIFNTX0VYRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2c3NzZXJ2ZXJwYXRoIHN0cmluZy4KKyAgICAgKiBAcmV0dXJuICAgIG51bGwgaWYgdnNzc2VydmVycGF0aCBpcyBub3Qgc2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VnNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHZzc1BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcXVpZXQgc3RyaW5nLiAtTy0KKyAgICAgKiBAcmV0dXJuIEFuIGVtcHR5IHN0cmluZyBpZiBxdWlldCBpcyBub3Qgc2V0IG9yIGlzIGZhbHNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UXVpZXQoKSB7CisgICAgICAgIHJldHVybiBxdWlldCA/IEZMQUdfUVVJRVQgOiAiIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByZWN1cnNpdmUgc3RyaW5nLiAiLVIiCisgICAgICogQHJldHVybiBBbiBlbXB0eSBzdHJpbmcgaWYgcmVjdXJzaXZlIGlzIG5vdCBzZXQgb3IgaXMgZmFsc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZWN1cnNpdmUoKSB7CisgICAgICAgIHJldHVybiByZWN1cnNpdmUgPyBGTEFHX1JFQ1VSU0lPTiA6ICIiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHdyaXRhYmxlIHN0cmluZy4gIi1XIgorICAgICAqIEByZXR1cm4gQW4gZW1wdHkgc3RyaW5nIGlmIHdyaXRhYmxlIGlzIG5vdCBzZXQgb3IgaXMgZmFsc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXcml0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyaXRhYmxlID8gRkxBR19XUklUQUJMRSA6ICIiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxhYmVsIHN0cmluZy4gIi1MYnVpbGQxIgorICAgICAqIE1heCBsYWJlbCBsZW5ndGggaXMgMzIgY2hhcnMKKyAgICAgKiBAcmV0dXJuIEFuIGVtcHR5IHN0cmluZyBpZiBsYWJlbCBpcyBub3Qgc2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKSB7CisgICAgICAgIFN0cmluZyBzaG9ydExhYmVsID0gIiI7CisgICAgICAgIGlmIChsYWJlbCAhPSBudWxsICYmIGxhYmVsLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHNob3J0TGFiZWwgPSBGTEFHX0xBQkVMICsgZ2V0U2hvcnRMYWJlbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzaG9ydExhYmVsOworICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXQgbW9zdCB0aGUgMzAgZmlyc3QgY2hhcnMgb2YgdGhlIGxhYmVsLAorICAgICAqIGxvZ2dpbmcgYSB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgdGhlIHRydW5jYXRpb24KKyAgICAgKiBAcmV0dXJuIGF0IG1vc3QgdGhlIDMwIGZpcnN0IGNoYXJzIG9mIHRoZSBsYWJlbAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFNob3J0TGFiZWwoKSB7CisgICAgICAgIFN0cmluZyBzaG9ydExhYmVsOworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICBpZiAobGFiZWwgIT0gIG51bGwgJiYgbGFiZWwubGVuZ3RoKCkgPiAzMSkgeworICAgICAgICAgICAgc2hvcnRMYWJlbCA9IHRoaXMubGFiZWwuc3Vic3RyaW5nKDAsIDMwKTsKKyAgICAgICAgICAgIGxvZygiTGFiZWwgaXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVycywgdHJ1bmNhdGVkIHRvOiAiICsgc2hvcnRMYWJlbCwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNob3J0TGFiZWwgPSBsYWJlbDsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisgICAgICAgIHJldHVybiBzaG9ydExhYmVsOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzdHlsZSBzdHJpbmcuICItTGJ1aWxkMSIKKyAgICAgKiBAcmV0dXJuIEFuIGVtcHR5IHN0cmluZyBpZiBsYWJlbCBpcyBub3Qgc2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3R5bGUoKSB7CisgICAgICAgIHJldHVybiBzdHlsZSAhPSBudWxsID8gc3R5bGUgOiAiIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2ZXJzaW9uIHN0cmluZy4gUmV0dXJucyB0aGUgZmlyc3Qgc3BlY2lmaWVkIG9mIHZlcnNpb24gIi1WMS4wIiwKKyAgICAgKiBkYXRlICItVmQwMS4wMS4wMSIsIGxhYmVsICItVmxidWlsZDEiLgorICAgICAqIEByZXR1cm4gQW4gZW1wdHkgc3RyaW5nIGlmIGEgdmVyc2lvbiwgZGF0ZSBhbmQgbGFiZWwgYXJlIG5vdCBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uRGF0ZUxhYmVsKCkgeworICAgICAgICBTdHJpbmcgdmVyc2lvbkRhdGVMYWJlbCA9ICIiOworICAgICAgICBpZiAodmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB2ZXJzaW9uRGF0ZUxhYmVsID0gRkxBR19WRVJTSU9OICsgdmVyc2lvbjsKKyAgICAgICAgfSBlbHNlIGlmIChkYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZlcnNpb25EYXRlTGFiZWwgPSBGTEFHX1ZFUlNJT05fREFURSArIGRhdGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2UgZ2V0U2hvcnRMYWJlbCgpIHNvIGxhYmVscyBsb25nZXIgdGhlbiAzMCBjaGFyIGFyZSB0cnVuY2F0ZWQKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgdXNlciBpcyB3YXJuZWQKKyAgICAgICAgICAgIFN0cmluZyBzaG9ydExhYmVsID0gZ2V0U2hvcnRMYWJlbCgpOworICAgICAgICAgICAgaWYgKHNob3J0TGFiZWwgIT0gbnVsbCAmJiAhc2hvcnRMYWJlbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgdmVyc2lvbkRhdGVMYWJlbCA9IEZMQUdfVkVSU0lPTl9MQUJFTCArIHNob3J0TGFiZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZlcnNpb25EYXRlTGFiZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmVyc2lvbiBzdHJpbmcuCisgICAgICogQHJldHVybiBBbiBlbXB0eSBzdHJpbmcgaWYgYSB2ZXJzaW9uIGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdmVyc2lvbiAhPSBudWxsID8gRkxBR19WRVJTSU9OICsgdmVyc2lvbiA6ICIiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxvY2FscGF0aCBzdHJpbmcuICItR0xjOlxzb3VyY2UiIDxwPgorICAgICAqIFRoZSBsb2NhbHBhdGggaXMgY3JlYXRlZCBpZiBpdCBkaWRuJ3QgZXhpc3QuCisgICAgICogQHJldHVybiBBbiBlbXB0eSBzdHJpbmcgaWYgbG9jYWxwYXRoIGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbHBhdGgoKSB7CisgICAgICAgIFN0cmluZyBsY2xQYXRoID0gIiI7IC8vc2V0IHRvIGVtcHR5IHN0ciBpZiBubyBsb2NhbCBwYXRoIHJldHVybgorICAgICAgICBpZiAobG9jYWxQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vbWFrZSBzdXJlIG1fTG9jYWxEaXIgZXhpc3RzLCBjcmVhdGUgaXQgaWYgaXQgZG9lc24ndAorICAgICAgICAgICAgRmlsZSBkaXIgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUobG9jYWxQYXRoKTsKKyAgICAgICAgICAgIGlmICghZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBkb25lID0gZGlyLm1rZGlycygpOworICAgICAgICAgICAgICAgIGlmICghZG9uZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkRpcmVjdG9yeSAiICsgbG9jYWxQYXRoICsgIiBjcmVhdGlvbiB3YXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzdWNjZXNzZnVsIGZvciBhbiB1bmtub3duIHJlYXNvbiI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJDcmVhdGVkIGRpcjogIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsY2xQYXRoID0gRkxBR19PVkVSUklERV9XT1JLSU5HX0RJUiArIGxvY2FsUGF0aDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGNsUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjb21tZW50IHN0cmluZy4gIi1DY29tbWVudCB0ZXh0IgorICAgICAqIEByZXR1cm4gQSBjb21tZW50IG9mICItIiBpZiBjb21tZW50IGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gY29tbWVudCAhPSBudWxsID8gRkxBR19DT01NRU5UICsgY29tbWVudCA6IEZMQUdfQ09NTUVOVCArICItIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhdXRvIHJlc3BvbnNlIHN0cmluZy4gVGhpcyBjYW4gYmUgWSAiLUktWSIgb3IgTiAiLUktTiIuCisgICAgICogQHJldHVybiBUaGUgZGVmYXVsdCB2YWx1ZSAiLUktIiBpZiBhdXRvcmVzcG9uc2UgaXMgbm90IHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF1dG9yZXNwb25zZSgpIHsKKyAgICAgICAgaWYgKGF1dG9SZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gRkxBR19BVVRPUkVTUE9OU0VfREVGOworICAgICAgICB9IGVsc2UgaWYgKGF1dG9SZXNwb25zZS5lcXVhbHNJZ25vcmVDYXNlKCJZIikpIHsKKyAgICAgICAgICAgIHJldHVybiBGTEFHX0FVVE9SRVNQT05TRV9ZRVM7CisgICAgICAgIH0gZWxzZSBpZiAoYXV0b1Jlc3BvbnNlLmVxdWFsc0lnbm9yZUNhc2UoIk4iKSkgeworICAgICAgICAgICAgcmV0dXJuIEZMQUdfQVVUT1JFU1BPTlNFX05POworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEZMQUdfQVVUT1JFU1BPTlNFX0RFRjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxvZ2luIHN0cmluZy4gVGhpcyBjYW4gYmUgdXNlciBhbmQgcGFzc3dvcmQsICItWXVzZXIscGFzc3dvcmQiCisgICAgICogb3IganVzdCB1c2VyICItWXVzZXIiLgorICAgICAqIEByZXR1cm4gQW4gZW1wdHkgc3RyaW5nIGlmIGxvZ2luIGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2dpbigpIHsKKyAgICAgICAgcmV0dXJuIHZzc0xvZ2luICE9IG51bGwgPyBGTEFHX0xPR0lOICsgdnNzTG9naW4gOiAiIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBvdXRwdXQgZmlsZSBzdHJpbmcuICItT291dHB1dC5maWxlIgorICAgICAqIEByZXR1cm4gQW4gZW1wdHkgc3RyaW5nIGlmIHVzZXIgaXMgbm90IHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE91dHB1dCgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dEZpbGVOYW1lICE9IG51bGwgPyBGTEFHX09VVFBVVCArIG91dHB1dEZpbGVOYW1lIDogIiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdXNlciBzdHJpbmcuICItVXVzZXJuYW1lIgorICAgICAqIEByZXR1cm4gQW4gZW1wdHkgc3RyaW5nIGlmIHVzZXIgaXMgbm90IHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZXIoKSB7CisgICAgICAgIHJldHVybiB1c2VyICE9IG51bGwgPyBGTEFHX1VTRVIgKyB1c2VyIDogIiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmVyc2lvbiBzdHJpbmcuIFRoaXMgY2FuIGJlIHRvLWZyb20gIi1WTGJ1aWxkMn5MYnVpbGQxIiwgZnJvbQorICAgICAqICJ+TGJ1aWxkMSIgb3IgdG8gIi1WTGJ1aWxkMiIuCisgICAgICogQHJldHVybiBBbiBlbXB0eSBzdHJpbmcgaWYgbmVpdGhlciB0b2xhYmVsIG9yIGZyb21sYWJlbCBhcmUgc2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvbkxhYmVsKCkgeworICAgICAgICBpZiAoZnJvbUxhYmVsID09IG51bGwgJiYgdG9MYWJlbCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgaWYgKGZyb21MYWJlbCAhPSBudWxsICYmIHRvTGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGZyb21MYWJlbC5sZW5ndGgoKSA+IDMxKSB7CisgICAgICAgICAgICAgICAgZnJvbUxhYmVsID0gZnJvbUxhYmVsLnN1YnN0cmluZygwLCAzMCk7CisgICAgICAgICAgICAgICAgbG9nKCJGcm9tTGFiZWwgaXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVycywgdHJ1bmNhdGVkIHRvOiAiCisgICAgICAgICAgICAgICAgICAgICsgZnJvbUxhYmVsLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b0xhYmVsLmxlbmd0aCgpID4gMzEpIHsKKyAgICAgICAgICAgICAgICB0b0xhYmVsID0gdG9MYWJlbC5zdWJzdHJpbmcoMCwgMzApOworICAgICAgICAgICAgICAgIGxvZygiVG9MYWJlbCBpcyBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLCB0cnVuY2F0ZWQgdG86ICIKKyAgICAgICAgICAgICAgICAgICAgKyB0b0xhYmVsLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBGTEFHX1ZFUlNJT05fTEFCRUwgKyB0b0xhYmVsICsgVkFMVUVfRlJPTUxBQkVMICsgZnJvbUxhYmVsOworICAgICAgICB9IGVsc2UgaWYgKGZyb21MYWJlbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZnJvbUxhYmVsLmxlbmd0aCgpID4gMzEpIHsKKyAgICAgICAgICAgICAgICBmcm9tTGFiZWwgPSBmcm9tTGFiZWwuc3Vic3RyaW5nKDAsIDMwKTsKKyAgICAgICAgICAgICAgICBsb2coIkZyb21MYWJlbCBpcyBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLCB0cnVuY2F0ZWQgdG86ICIKKyAgICAgICAgICAgICAgICAgICAgKyBmcm9tTGFiZWwsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEZMQUdfVkVSU0lPTiArIFZBTFVFX0ZST01MQUJFTCArIGZyb21MYWJlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0b0xhYmVsLmxlbmd0aCgpID4gMzEpIHsKKyAgICAgICAgICAgICAgICB0b0xhYmVsID0gdG9MYWJlbC5zdWJzdHJpbmcoMCwgMzApOworICAgICAgICAgICAgICAgIGxvZygiVG9MYWJlbCBpcyBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLCB0cnVuY2F0ZWQgdG86ICIKKyAgICAgICAgICAgICAgICAgICAgKyB0b0xhYmVsLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBGTEFHX1ZFUlNJT05fTEFCRUwgKyB0b0xhYmVsOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBWZXJzaW9uIGRhdGUgc3RyaW5nLgorICAgICAqIEByZXR1cm4gQW4gZW1wdHkgc3RyaW5nIGlmIG5laXRoZXIgVG9kYXRlIG9yIGZyb20gZGF0ZSBhcmUgc2V0LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uRGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmcm9tRGF0ZSA9PSBudWxsICYmIHRvRGF0ZSA9PSBudWxsCisgICAgICAgICAgICAmJiBudW1EYXlzID09IEludGVnZXIuTUlOX1ZBTFVFKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyb21EYXRlICE9IG51bGwgJiYgdG9EYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBGTEFHX1ZFUlNJT05fREFURSArIHRvRGF0ZSArIFZBTFVFX0ZST01EQVRFICsgZnJvbURhdGU7CisgICAgICAgIH0gZWxzZSBpZiAodG9EYXRlICE9IG51bGwgJiYgbnVtRGF5cyAhPSBJbnRlZ2VyLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkxBR19WRVJTSU9OX0RBVEUgKyB0b0RhdGUgKyBWQUxVRV9GUk9NREFURQorICAgICAgICAgICAgICAgICAgICAgICAgKyBjYWxjRGF0ZSh0b0RhdGUsIG51bURheXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHBhcnNpbmcgZGF0ZTogIiArIHRvRGF0ZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmcm9tRGF0ZSAhPSBudWxsICYmIG51bURheXMgIT0gSW50ZWdlci5NSU5fVkFMVUUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMQUdfVkVSU0lPTl9EQVRFICsgY2FsY0RhdGUoZnJvbURhdGUsIG51bURheXMpCisgICAgICAgICAgICAgICAgICAgICAgICArIFZBTFVFX0ZST01EQVRFICsgZnJvbURhdGU7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3IgcGFyc2luZyBkYXRlOiAiICsgZnJvbURhdGU7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZnJvbURhdGUgIT0gbnVsbCA/IEZMQUdfVkVSU0lPTiArIFZBTFVFX0ZST01EQVRFCisgICAgICAgICAgICAgICAgICAgICsgZnJvbURhdGUgOiBGTEFHX1ZFUlNJT05fREFURSArIHRvRGF0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhbmQgcmV0dXJucyB0aGUgLUctIGZsYWcgaWYgcmVxdWlyZWQuCisgICAgICogQHJldHVybiBBbiBlbXB0eSBzdHJpbmcgaWYgZ2V0IGxvY2FsIGNvcHkgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEdldExvY2FsQ29weSgpIHsKKyAgICAgICAgcmV0dXJuICghZ2V0TG9jYWxDb3B5KSA/IEZMQUdfTk9fR0VUIDogIiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZhaWwgb24gZXJyb3IgZmxhZy4KKyAgICAgKiBAcmV0dXJuICAgIFRydWUgaWYgdGhlIEZhaWxPbkVycm9yIGZsYWcgaGFzIGJlZW4gc2V0IG9yIGlmICd3cml0YWJsZWZpbGVzPXNraXAnLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBnZXRGYWlsT25FcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIGdldFdyaXRhYmxlRmlsZXMoKS5lcXVhbHMoV1JJVEFCTEVfU0tJUCkgPyBmYWxzZSA6IGZhaWxPbkVycm9yOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgc2V0IGZvciB0aGUgRmlsZVRpbWVTdGFtcC4KKyAgICAgKiBpZiBpdCBlcXVhbHMgImN1cnJlbnQiIHRoZW4gd2UgcmV0dXJuIC1HVEMKKyAgICAgKiBpZiBpdCBlcXVhbHMgIm1vZGlmaWVkIiB0aGVuIHdlIHJldHVybiAtR1RNCisgICAgICogaWYgaXQgZXF1YWxzICJ1cGRhdGVkIiB0aGVuIHdlIHJldHVybiAtR1RVCisgICAgICogb3RoZXJ3aXNlIHdlIHJldHVybiAtR1RDCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IGZpbGUgdGltZSBmbGFnLCBpZiBub3Qgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVRpbWVTdGFtcCgpIHsKKyAgICAgICAgaWYgKHRpbWVzdGFtcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wLmdldFZhbHVlKCkuZXF1YWxzKFRJTUVfTU9ESUZJRUQpKSB7CisgICAgICAgICAgICByZXR1cm4gRkxBR19GSUxFVElNRV9NT0RJRklFRDsKKyAgICAgICAgfSBlbHNlIGlmICh0aW1lc3RhbXAuZ2V0VmFsdWUoKS5lcXVhbHMoVElNRV9VUERBVEVEKSkgeworICAgICAgICAgICAgcmV0dXJuIEZMQUdfRklMRVRJTUVfVVBEQVRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBGTEFHX0ZJTEVUSU1FX0RFRjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIHRoZSBiZWhhdmlvdXIgd2hlbiBlbmNvdW50ZXJpbmcgd3JpdGFibGUgZmlsZXMuCisgICAgICogQHJldHVybiBBbiBlbXB0eSBTdHJpbmcsIGlmIG5vdCBzZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRXcml0YWJsZUZpbGVzKCkgeworICAgICAgICBpZiAod3JpdGFibGVGaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0gZWxzZSBpZiAod3JpdGFibGVGaWxlcy5nZXRWYWx1ZSgpLmVxdWFscyhXUklUQUJMRV9SRVBMQUNFKSkgeworICAgICAgICAgICAgcmV0dXJuIEZMQUdfUkVQTEFDRV9XUklUQUJMRTsKKyAgICAgICAgfSBlbHNlIGlmICh3cml0YWJsZUZpbGVzLmdldFZhbHVlKCkuZXF1YWxzKFdSSVRBQkxFX1NLSVApKSB7CisgICAgICAgICAgICAvLyBzcy5leGUgZXhpdHMgd2l0aCAnMTAwJywgd2hlbiBmaWxlcyBoYXZlIGJlZW4gc2tpcHBlZAorICAgICAgICAgICAgLy8gc28gd2UgaGF2ZSB0byBpZ25vcmUgdGhlIGZhaWx1cmUKKyAgICAgICAgICAgIGZhaWxPbkVycm9yID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRkxBR19TS0lQX1dSSVRBQkxFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIFNldHMgdXAgdGhlIHJlcXVpcmVkIGVudmlyb25tZW50IGFuZCBleGVjdXRlcyB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtICBjbWQgIFRoZSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZS4KKyAgICAgKiBAcmV0dXJuICAgICAgVGhlIHJldHVybiBjb2RlIGZyb20gdGhlIGV4ZWMnZCBwcm9jZXNzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJ1bihDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4ZWN1dGUgZXhlID0gbmV3IEV4ZWN1dGUobmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTikpOworCisgICAgICAgICAgICAvLyBJZiBsb2NhdGlvbiBvZiBzcy5pbmkgaXMgc3BlY2lmaWVkIHdlIG5lZWQgdG8gc2V0IHRoZQorICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQtdmFyaWFibGUgU1NESVIgdG8gdGhpcyB2YWx1ZQorICAgICAgICAgICAgaWYgKHNlcnZlclBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGVudiA9IGV4ZS5nZXRFbnZpcm9ubWVudCgpOworICAgICAgICAgICAgICAgIGlmIChlbnYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlbnYgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBuZXdFbnYgPSBuZXcgU3RyaW5nW2Vudi5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVudiwgMCwgbmV3RW52LCAwLCBlbnYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBuZXdFbnZbZW52Lmxlbmd0aF0gPSAiU1NESVI9IiArIHNlcnZlclBhdGg7CisKKyAgICAgICAgICAgICAgICBleGUuc2V0RW52aXJvbm1lbnQobmV3RW52KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXhlLnNldEFudFJ1bihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSk7CisgICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY21kLmdldENvbW1hbmRsaW5lKCkpOworICAgICAgICAgICAgLy8gVXNlIHRoZSBPUyBsYXVuY2hlciBzbyB3ZSBnZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICAgICAgICBleGUuc2V0Vk1MYXVuY2hlcihmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gZXhlLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgIC8qKgorICAgICAqIENhbGN1bGF0ZXMgdGhlIHN0YXJ0IGRhdGUgZm9yIHZlcnNpb24gY29tcGFyaXNvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxjdWxhdGVzIHRoZSBkYXRlIG51bURheSBkYXlzIGVhcmxpZXIgdGhhbiBzdGFydGRhdGUuCisgICAgICogQHBhcmFtICAgc3RhcnREYXRlICAgIFRoZSBzdGFydCBkYXRlLgorICAgICAqIEBwYXJhbSAgIGRheXNUb0FkZCAgICAgVGhlIG51bWJlciBvZiBkYXlzIHRvIGFkZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBjYWxjdWxhdGVkIGRhdGUuCisgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNhbGNEYXRlKFN0cmluZyBzdGFydERhdGUsIGludCBkYXlzVG9BZGQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgIERhdGUgY3VycmVudERhdGUgPSBkYXRlRm9ybWF0LnBhcnNlKHN0YXJ0RGF0ZSk7CisgICAgICAgIGNhbGVuZGFyLnNldFRpbWUoY3VycmVudERhdGUpOworICAgICAgICBjYWxlbmRhci5hZGQoQ2FsZW5kYXIuREFURSwgZGF5c1RvQWRkKTsKKyAgICAgICAgcmV0dXJuIGRhdGVGb3JtYXQuZm9ybWF0KGNhbGVuZGFyLmdldFRpbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgcGFzc3dvcmQgdG8gJyoqKicgc28gaXQgaXNuJ3QgZGlzcGxheWVkIG9uIHNjcmVlbiBpZiB0aGUgYnVpbGQgZmFpbHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbWQgICBUaGUgY29tbWFuZCBsaW5lIHRvIGNsZWFuCisgICAgICogQHJldHVybiBUaGUgY29tbWFuZCBsaW5lIGFzIGEgc3RyaW5nIHdpdGggb3V0IHRoZSBwYXNzd29yZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZvcm1hdENvbW1hbmRMaW5lKENvbW1hbmRsaW5lIGNtZCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc0J1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKGNtZC50b1N0cmluZygpKTsKKyAgICAgICAgaW50IGluZGV4VXNlciA9IHNCdWZmLnN1YnN0cmluZygwKS5pbmRleE9mKEZMQUdfTE9HSU4pOworICAgICAgICBpZiAoaW5kZXhVc2VyID4gMCkgeworICAgICAgICAgICAgaW50IGluZGV4UGFzcyA9IHNCdWZmLnN1YnN0cmluZygwKS5pbmRleE9mKCIsIiwgaW5kZXhVc2VyKTsKKyAgICAgICAgICAgIGludCBpbmRleEFmdGVyUGFzcyA9IHNCdWZmLnN1YnN0cmluZygwKS5pbmRleE9mKCIgIiwgaW5kZXhQYXNzKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4UGFzcyArIDE7IGkgPCBpbmRleEFmdGVyUGFzczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc0J1ZmYuc2V0Q2hhckF0KGksICcqJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNCdWZmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0ZW50aW9uIG9mIEVudW1lcmF0ZWRBdHRyaWJ1dGUgdG8gaG9sZCB0aGUgdmFsdWVzIGZvciBmaWxlIHRpbWUgc3RhbXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXJyZW50TW9kVXBkYXRlZCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBhbGxvd2FibGUgdmFsdWVzLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7VElNRV9DVVJSRU5ULCBUSU1FX01PRElGSUVELCBUSU1FX1VQREFURUR9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0ZW50aW9uIG9mIEVudW1lcmF0ZWRBdHRyaWJ1dGUgdG8gaG9sZCB0aGUgdmFsdWVzIGZvciB3cml0YWJsZSBmaWxlc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXcml0YWJsZUZpbGVzIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbG93YWJsZSB2YWx1ZXMuCisgICAgICAgICAqIEByZXR1cm4gVGhlIHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtXUklUQUJMRV9SRVBMQUNFLCBXUklUQUJMRV9TS0lQLCBXUklUQUJMRV9GQUlMfTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0FERC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQURELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0MWVlMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0FERC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworLyoqCisgKiBQZXJmb3JtcyBBZGQgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgorICoKKyAqIEBhbnQudGFzayBuYW1lPSJ2c3NhZGQiIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBNU1ZTU0FERCBleHRlbmRzIE1TVlNTIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsUGF0aCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBzcy4KKyAgICAgKiBAcmV0dXJuICAgICBUaGUgY29uc3RydWN0ZWQgY29tbWFuZGxpbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKworICAgICAgICAvLyBmaXJzdCBvZmYsIG1ha2Ugc3VyZSB0aGF0IHdlJ3ZlIGdvdCBhIGNvbW1hbmQgYW5kIGEgbG9jYWxQYXRoIC4uLgorICAgICAgICBpZiAoZ2V0TG9jYWxwYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJsb2NhbFBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdCB0aGUgZm9ybWF0IGlzCisgICAgICAgIC8vIHNzIEFkZCBWU1MgaXRlbXMgWy1CXSBbLUNdIFstRC1dIFstSF0gWy1JLV0gWy1LXSBbLU5dIFstT10gWy1SXSBbLVddIFstWV0gWy0/XQorICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gdGhlIFNTLkVYRSBoZWxwCisgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0U1NDb21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfQUREKTsKKworICAgICAgICAvLyBWU1MgaXRlbXMKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRMb2NhbHBhdGgoKSk7CisgICAgICAgIC8vIC1JLSBvciAtSS1ZIG9yIC1JLU4KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRBdXRvcmVzcG9uc2UoKSk7CisgICAgICAgIC8vIC1SCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0UmVjdXJzaXZlKCkpOworICAgICAgICAvLyAtVworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFdyaXRhYmxlKCkpOworICAgICAgICAvLyAtWQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldExvZ2luKCkpOworICAgICAgICAvLyAtQworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnQoKSk7CisKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRMaW5lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvY2FsIHBhdGggd2l0aG91dCB0aGUgZmxhZy47IHJlcXVpcmVkCisgICAgICogQHRvZG8gU2VlIHdoeSB0aGlzIHJldHVybnMgdGhlIGxvY2FsIHBhdGggd2l0aG91dCB0aGUgZmxhZy4KKyAgICAgKiBAcmV0dXJuIFRoZSBsb2NhbCBwYXRoIHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TG9jYWxwYXRoKCkgeworICAgICAgICByZXR1cm4gbG9jYWxQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBmaWxlcyByZWN1cnNpdmVseS4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjdXJzaXZlICBUaGUgYm9vbGVhbiB2YWx1ZSBmb3IgcmVjdXJzaXZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlY3Vyc2l2ZShib29sZWFuIHJlY3Vyc2l2ZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFJlY3Vyc2l2ZShyZWN1cnNpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuc2V0IHRoZSBSRUFELU9OTFkgZmxhZyBvbiBsb2NhbCBjb3BpZXMgb2YgZmlsZXMgYWRkZWQgdG8gVlNTLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIHdyaXRhYmxlIFRoZSBib29sZWFuIHZhbHVlIGZvciB3cml0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRXcml0YWJsZShib29sZWFuIHdyaXRhYmxlKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsV3JpdGFibGUod3JpdGFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF1dG9yZXNwb25jZSBiZWhhdmlvdXIuIFZhbGlkIG9wdGlvbnMgYXJlIFkgYW5kIE4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGF1dG8gcmVzcG9uc2UgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b3Jlc3BvbnNlKFN0cmluZyByZXNwb25zZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbEF1dG9SZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbWVudCB0byBhcHBseSB0byBmaWxlcyBhZGRlZCB0byBTb3VyY2VTYWZlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1lbnQgVGhlIGNvbW1lbnQgdG8gYXBwbHkgaW4gU291cmNlU2FmZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxDb21tZW50KGNvbW1lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSBwcm9qZWN0IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtICAgbG9jYWxQYXRoICAgVGhlIHBhdGggb24gZGlzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbHBhdGgoUGF0aCBsb2NhbFBhdGgpIHsKKyAgICAgICAgdGhpcy5sb2NhbFBhdGggPSBsb2NhbFBhdGgudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDSEVDS0lOLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDSEVDS0lOLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1MjFhYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NIRUNLSU4uamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKKy8qKgorICogUGVyZm9ybXMgQ2hlY2tJbiBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCisgKgorICogQGFudC50YXNrIG5hbWU9InZzc2NoZWNraW4iIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBNU1ZTU0NIRUNLSU4gZXh0ZW5kcyBNU1ZTUyB7CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBzcy4KKyAgICAgKiBAcmV0dXJuICAgICBUaGUgY29uc3RydWN0ZWQgY29tbWFuZGxpbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKworICAgICAgICAvLyBmaXJzdCBvZmYsIG1ha2Ugc3VyZSB0aGF0IHdlJ3ZlIGdvdCBhIGNvbW1hbmQgYW5kIGEgdnNzZGlyIC4uLgorICAgICAgICBpZiAoZ2V0VnNzcGF0aCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290IHRoZSBmb3JtYXQgaXMKKyAgICAgICAgLy8gc3MgQ2hlY2tpbiBWU1MgaXRlbXMgWy1IXSBbLUNdIFstSS1dIFstTl0gWy1PXSBbLVJdIFstV10gWy1ZXSBbLT9dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgU1MuRVhFIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRTU0NvbW1hbmQoKSk7CisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ09NTUFORF9DSEVDS0lOKTsKKworICAgICAgICAvLyBWU1MgaXRlbXMKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWc3NwYXRoKCkpOworICAgICAgICAvLyAtR0wKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRMb2NhbHBhdGgoKSk7CisgICAgICAgIC8vIC1JLSBvciAtSS1ZIG9yIC1JLU4KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRBdXRvcmVzcG9uc2UoKSk7CisgICAgICAgIC8vIC1SCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0UmVjdXJzaXZlKCkpOworICAgICAgICAvLyAtVworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFdyaXRhYmxlKCkpOworICAgICAgICAvLyAtWQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldExvZ2luKCkpOworICAgICAgICAvLyAtQworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnQoKSk7CisKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRMaW5lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSBwcm9qZWN0IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtICAgbG9jYWxQYXRoICAgVGhlIHBhdGggb24gZGlzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbHBhdGgoUGF0aCBsb2NhbFBhdGgpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxMb2NhbFBhdGgobG9jYWxQYXRoLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrLWluIGZpbGVzIHJlY3Vyc2l2ZWx5LiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWN1cnNpdmUgIFRoZSBib29sZWFuIHZhbHVlIGZvciByZWN1cnNpdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsUmVjdXJzaXZlKHJlY3Vyc2l2ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5zZXQgdGhlIFJFQUQtT05MWSBmbGFnIG9uIGxvY2FsIGNvcGllcyBvZiBmaWxlcyBjaGVja2VkLWluIHRvIFZTUy4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIHdyaXRhYmxlIFRoZSBib29sZWFuIHZhbHVlIGZvciB3cml0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRXcml0YWJsZShib29sZWFuIHdyaXRhYmxlKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsV3JpdGFibGUod3JpdGFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF1dG9yZXNwb25jZSBiZWhhdmlvdXIuIFZhbGlkIG9wdGlvbnMgYXJlIFkgYW5kIE4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGF1dG8gcmVzcG9uc2UgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b3Jlc3BvbnNlKFN0cmluZyByZXNwb25zZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbEF1dG9SZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbWVudCB0byBhcHBseSB0byBmaWxlcyBjaGVja2VkLWluIHRvIFNvdXJjZVNhZmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCBUaGUgY29tbWVudCB0byBhcHBseSBpbiBTb3VyY2VTYWZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbENvbW1lbnQoY29tbWVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ0hFQ0tPVVQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NIRUNLT1VULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiY2RlOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NIRUNLT1VULmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIFBlcmZvcm1zIENoZWNrT3V0IGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0idnNzY2hlY2tvdXQiIGNhdGVnb3J5PSJzY20iCisgKiBAYW50LmF0dHJpYnV0ZS5ncm91cCBuYW1lPSJ2ZGwiIGRlc2NyaXB0aW9uPSJPbmx5IG9uZSBvZiB2ZXJzaW9uLCBkYXRlIG9yIGxhYmVsIgorICovCitwdWJsaWMgY2xhc3MgTVNWU1NDSEVDS09VVCBleHRlbmRzIE1TVlNTIHsKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIHNzLgorICAgICAqIEByZXR1cm4gICAgIFRoZSBjb25zdHJ1Y3RlZCBjb21tYW5kbGluZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgYnVpbGRDbWRMaW5lKCkgeworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworCisgICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgY29tbWFuZCBhbmQgYSB2c3NkaXIgLi4uCisgICAgICAgIGlmIChnZXRWc3NwYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcworICAgICAgICAvLyBzcyBDaGVja291dCBWU1MgaXRlbXMgWy1HXSBbLUNdIFstSF0gWy1JLV0gWy1OXSBbLU9dIFstUl0gWy1WXSBbLVldIFstP10KKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBTUy5FWEUgaGVscAorICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldFNTQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX0NIRUNLT1VUKTsKKworICAgICAgICAvLyBWU1MgaXRlbXMKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWc3NwYXRoKCkpOworICAgICAgICAvLyAtR0wKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRMb2NhbHBhdGgoKSk7CisgICAgICAgIC8vIC1JLSBvciAtSS1ZIG9yIC1JLU4KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRBdXRvcmVzcG9uc2UoKSk7CisgICAgICAgIC8vIC1SCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0UmVjdXJzaXZlKCkpOworICAgICAgICAvLyAtVgorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZlcnNpb25EYXRlTGFiZWwoKSk7CisgICAgICAgIC8vIC1ZCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0TG9naW4oKSk7CisgICAgICAgIC8vIC1HCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0RmlsZVRpbWVTdGFtcCgpKTsKKyAgICAgICAgLy8gLUdXUyBvciAtR1dSCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0V3JpdGFibGVGaWxlcygpKTsKKyAgICAgICAgLy8gLUctCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0R2V0TG9jYWxDb3B5KCkpOworCisgICAgICAgIHJldHVybiBjb21tYW5kTGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgcHJvamVjdCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIGxvY2FsUGF0aCAgIFRoZSBwYXRoIG9uIGRpc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxwYXRoKFBhdGggbG9jYWxQYXRoKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsTG9jYWxQYXRoKGxvY2FsUGF0aC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjay1vdXQgZmlsZXMgcmVjdXJzaXZlbHkuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY3Vyc2l2ZSAgVGhlIGJvb2xlYW4gdmFsdWUgZm9yIHJlY3Vyc2l2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWN1cnNpdmUoYm9vbGVhbiByZWN1cnNpdmUpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxSZWN1cnNpdmUocmVjdXJzaXZlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJzaW9uIHRvIGNoZWNrLW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgdmVyc2lvbiBUaGUgdmVyc2lvbiB0byBjaGVjay1vdXQuCisgICAgICoKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBncm91cD0idmRsIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxWZXJzaW9uKHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIERhdGUgdG8gY2hlY2stb3V0LgorICAgICAqCisgICAgICogQHBhcmFtICBkYXRlIFRoZSBkYXRlIHRvIGNoZWNrLW91dC4KKyAgICAgKgorICAgICAqIEBhbnQuYXR0cmlidXRlIGdyb3VwPSJ2ZGwiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZShTdHJpbmcgZGF0ZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbERhdGUoZGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGFiZWwgdG8gY2hlY2stb3V0LgorICAgICAqCisgICAgICogQHBhcmFtICBsYWJlbCBUaGUgbGFiZWwgdG8gY2hlY2stb3V0LgorICAgICAqCisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9InZkbCIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxMYWJlbChsYWJlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXV0b3Jlc3BvbmNlIGJlaGF2aW91ci4gVmFsaWQgb3B0aW9ucyBhcmUgWSBhbmQgTi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgYXV0byByZXNwb25zZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvcmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsQXV0b1Jlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEYXRlIGFuZCB0aW1lIHN0YW1wIGdpdmVuIHRvIHRoZSBsb2NhbCBjb3B5LiBEZWZhdWx0cyB0byA8Y29kZT5jdXJyZW50PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgICAgIFRoZSBmaWxlIHRpbWUgc3RhbXBpbmcgYmVoYXZpb3VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVUaW1lU3RhbXAoQ3VycmVudE1vZFVwZGF0ZWQgdGltZXN0YW1wKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsRmlsZVRpbWVTdGFtcCh0aW1lc3RhbXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdGlvbiB0YWtlbiB3aGVuIGxvY2FsIGZpbGVzIGFyZSB3cml0YWJsZS4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFpbDwvY29kZT4uCisgICAgICogPHA+CisgICAgICogRHVlIHRvIHNzLmV4ZSByZXR1cm5pbmcgd2l0aCBhbiBleGl0IGNvZGUgb2YgJzEwMCcgZm9yIGJvdGggZXJyb3JzIGFuZCB3aGVuCisgICAgICogYSBmaWxlIGhhcyBiZWVuIHNraXBwZWQsIDxjb2RlPmZhaWxvbmVycm9yPC9jb2RlPiBpcyBzZXQgdG8gZmFsc2Ugd2hlbiB1c2luZworICAgICAqIHRoZSA8Y29kZT5za2lwPC9jb2RlPiBvcHRpb24uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVzICAgICBUaGUgd3JpdGFibGUgZmlsZXMgYmVoYXZpb3VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V3JpdGFibGVGaWxlcyhXcml0YWJsZUZpbGVzIGZpbGVzKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsV3JpdGFibGVGaWxlcyhmaWxlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgYSBsb2NhbCBjb3B5IGR1cmluZyBhIGNoZWNrb3V0LiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqCisgICAgICogQHBhcmFtIGdldCAgIFRoZSBnZXQgbG9jYWwgY29weSBiZWhhdmlvdXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHZXRMb2NhbENvcHkoYm9vbGVhbiBnZXQpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxHZXRMb2NhbENvcHkoZ2V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDUC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ1AuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTJmY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ1AuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogUGVyZm9ybXMgQ1AgKENoYW5nZSBQcm9qZWN0KSBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCisgKiA8cD5UaGlzIHRhc2sgaXMgdHlwaWNhbGx5IHVzZWQgYmVmb3JlIGEgVnNzQWRkIGluIG9yZGVyIHRvIHNldCB0aGUgdGFyZ2V0IHByb2plY3Q8L3A+CisgKgorICogQGFudC50YXNrIG5hbWU9InZzc2NwIiBjYXRlZ29yeT0ic2NtIgorICovCitwdWJsaWMgY2xhc3MgTVNWU1NDUCBleHRlbmRzIE1TVlNTIHsKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIHNzLgorICAgICAqIEByZXR1cm4gICAgIFRoZSBjb25zdHJ1Y3RlZCBjb21tYW5kbGluZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgYnVpbGRDbWRMaW5lKCkgeworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworCisgICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgY29tbWFuZCBhbmQgYSB2c3NkaXIgLi4uCisgICAgICAgIGlmIChnZXRWc3NwYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcworICAgICAgICAvLyBzcyBDUCBWU1MgaXRlbXMgWy1IXSBbLUktXSBbLVldIFstP10KKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBTUy5FWEUgaGVscAorICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldFNTQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX0NQKTsKKworICAgICAgICAvLyBWU1MgaXRlbXMKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWc3NwYXRoKCkpOworICAgICAgICAvLyAtSS0gb3IgLUktWSBvciAtSS1OCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0QXV0b3Jlc3BvbnNlKCkpOworICAgICAgICAvLyAtWQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldExvZ2luKCkpOworCisgICAgICAgIHJldHVybiBjb21tYW5kTGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdXRvcmVzcG9uY2UgYmVoYXZpb3VyLiBWYWxpZCBvcHRpb25zIGFyZSBZIGFuZCBOLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBhdXRvIHJlc3BvbnNlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9yZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxBdXRvUmVzcG9uc2UocmVzcG9uc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NSRUFURS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ1JFQVRFLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYyOThjMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NSRUFURS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IHByb2plY3QgaW4gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgorICoKKyAqIEBhbnQudGFzayBuYW1lPSJ2c3NjcmVhdGUiIGNhdGVnb3J5PSJzY20iCisgKi8KK3B1YmxpYyBjbGFzcyBNU1ZTU0NSRUFURSBleHRlbmRzIE1TVlNTIHsKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIHNzLgorICAgICAqIEByZXR1cm4gICAgIFRoZSBjb25zdHJ1Y3RlZCBjb21tYW5kbGluZS4KKyAgICAgKi8KKyAgICBDb21tYW5kbGluZSBidWlsZENtZExpbmUoKSB7CisgICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CisKKyAgICAgICAgLy8gZmlyc3Qgb2ZmLCBtYWtlIHN1cmUgdGhhdCB3ZSd2ZSBnb3QgYSBjb21tYW5kIGFuZCBhIHZzc2Rpci4uLgorICAgICAgICBpZiAoZ2V0VnNzcGF0aCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHdoYXQgd2UgZ290CisgICAgICAgIC8vIHRoZSBmb3JtYXQgaXM6CisgICAgICAgIC8vIHNzIENyZWF0ZSBWU1MgaXRlbXMgWy1DXSBbLUhdIFstSS1dIFstTl0gWy1PXSBbLVNdIFstWV0gWy0/XQorICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gdGhlIFNTLkVYRSBoZWxwCisgICAgICAgIGNvbW1hbmRMaW5lLnNldEV4ZWN1dGFibGUoZ2V0U1NDb21tYW5kKCkpOworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENPTU1BTkRfQ1JFQVRFKTsKKworICAgICAgICAvLyBWU1MgaXRlbXMKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWc3NwYXRoKCkpOworICAgICAgICAvLyAtQworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnQoKSk7CisgICAgICAgIC8vIC1JLSBvciAtSS1ZIG9yIC1JLU4KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRBdXRvcmVzcG9uc2UoKSk7CisgICAgICAgIC8vIC1PLQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFF1aWV0KCkpOworICAgICAgICAvLyAtWQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldExvZ2luKCkpOworCisgICAgICAgIHJldHVybiBjb21tYW5kTGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21tZW50IHRvIGFwcGx5IHRvIHRoZSBwcm9qZWN0IGNyZWF0ZWQgaW4gU291cmNlU2FmZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tZW50IFRoZSBjb21tZW50IHRvIGFwcGx5IGluIFNvdXJjZVNhZmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsQ29tbWVudChjb21tZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgcXVpZXQgbW9kZS4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICBxdWlldCBUaGUgYm9vbGVhbiB2YWx1ZSBmb3IgcXVpZXQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0UXVpZXQgKGJvb2xlYW4gcXVpZXQpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxRdWlldChxdWlldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXV0b3Jlc3BvbmNlIGJlaGF2aW91ci4gVmFsaWQgb3B0aW9ucyBhcmUgWSBhbmQgTi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgYXV0byByZXNwb25zZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvcmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsQXV0b1Jlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDb25zdGFudHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDRkNDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3M7CisKKy8qKgorICogIEhvbGRzIGFsbCB0aGUgY29uc3RhbnRzIGZvciB0aGUgVlNTIHRhc2tzLgorICoKKyAqLworLy8gQ2hlY2tTdHlsZTpJbnRlcmZhY2VJc1R5cGUgT0ZGIChiYykKK3B1YmxpYyBpbnRlcmZhY2UgTVNWU1NDb25zdGFudHMgeworICAgIC8qKiAgQ29uc3RhbnQgZm9yIHRoZSB0aGluZyB0byBleGVjdXRlICAqLworICAgIFN0cmluZyBTU19FWEUgPSAic3MiOworICAgIC8qKiBEb2xsYXIgU2lnaCB0byBwcmVmaXggdGhlIHByb2plY3QgcGF0aCAqLworICAgIFN0cmluZyBQUk9KRUNUX1BSRUZJWCA9ICIkIjsKKworICAgIC8qKiAgVGhlICdDUCcgY29tbWFuZCAgKi8KKyAgICBTdHJpbmcgQ09NTUFORF9DUCA9ICJDUCI7CisgICAgLyoqICBUaGUgJ0FkZCcgY29tbWFuZCAgKi8KKyAgICBTdHJpbmcgQ09NTUFORF9BREQgPSAiQWRkIjsKKyAgICAvKiogIFRoZSAnR2V0JyBjb21tYW5kICAqLworICAgIFN0cmluZyBDT01NQU5EX0dFVCA9ICJHZXQiOworICAgIC8qKiAgVGhlICdDaGVja291dCcgY29tbWFuZCAgKi8KKyAgICBTdHJpbmcgQ09NTUFORF9DSEVDS09VVCA9ICJDaGVja291dCI7CisgICAgLyoqICBUaGUgJ0NoZWNraW4nIGNvbW1hbmQgICovCisgICAgU3RyaW5nIENPTU1BTkRfQ0hFQ0tJTiA9ICJDaGVja2luIjsKKyAgICAvKiogIFRoZSAnTGFiZWwnIGNvbW1hbmQgICovCisgICAgU3RyaW5nIENPTU1BTkRfTEFCRUwgPSAiTGFiZWwiOworICAgIC8qKiAgVGhlICdIaXN0b3J5JyBjb21tYW5kICAqLworICAgIFN0cmluZyBDT01NQU5EX0hJU1RPUlkgPSAiSGlzdG9yeSI7CisgICAgLyoqICBUaGUgJ0NyZWF0ZScgY29tbWFuZCAgKi8KKyAgICBTdHJpbmcgQ09NTUFORF9DUkVBVEUgPSAiQ3JlYXRlIjsKKworICAgIC8qKiAgVGhlIGJyaWVmIHN0eWxlIGZsYWcgICovCisgICAgU3RyaW5nIFNUWUxFX0JSSUVGID0gImJyaWVmIjsKKyAgICAvKiogIFRoZSBjb2RlZGlmZiBzdHlsZSBmbGFnICAqLworICAgIFN0cmluZyBTVFlMRV9DT0RFRElGRiA9ICJjb2RlZGlmZiI7CisgICAgLyoqICBUaGUgbm9maWxlIHN0eWxlIGZsYWcgICovCisgICAgU3RyaW5nIFNUWUxFX05PRklMRSA9ICJub2ZpbGUiOworICAgIC8qKiAgVGhlIGRlZmF1bHQgc3R5bGUgZmxhZyAgKi8KKyAgICBTdHJpbmcgU1RZTEVfREVGQVVMVCA9ICJkZWZhdWx0IjsKKworICAgIC8qKiAgVGhlIHRleHQgZm9yICBjdXJyZW50IChkZWZhdWx0KSB0aW1lc3RhbXAgKi8KKyAgICBTdHJpbmcgVElNRV9DVVJSRU5UID0gImN1cnJlbnQiOworICAgIC8qKiAgVGhlIHRleHQgZm9yICBtb2RpZmllZCB0aW1lc3RhbXAgKi8KKyAgICBTdHJpbmcgVElNRV9NT0RJRklFRCA9ICJtb2RpZmllZCI7CisgICAgLyoqICBUaGUgdGV4dCBmb3IgIHVwZGF0ZWQgdGltZXN0YW1wICovCisgICAgU3RyaW5nIFRJTUVfVVBEQVRFRCA9ICJ1cGRhdGVkIjsKKworICAgIC8qKiAgVGhlIHRleHQgZm9yIHJlcGxhY2luZyB3cml0YWJsZSBmaWxlcyAgICovCisgICAgU3RyaW5nIFdSSVRBQkxFX1JFUExBQ0UgPSAicmVwbGFjZSI7CisgICAgLyoqICBUaGUgdGV4dCBmb3Igc2tpcGluZyB3cml0YWJsZSBmaWxlcyAgKi8KKyAgICBTdHJpbmcgV1JJVEFCTEVfU0tJUCA9ICJza2lwIjsKKyAgICAvKiogIFRoZSB0ZXh0IGZvciBmYWlsaW5nIG9uIHdyaXRhYmxlIGZpbGVzICAqLworICAgIFN0cmluZyBXUklUQUJMRV9GQUlMID0gImZhaWwiOworCisgICAgLyoqIC1ZIGZsYWcgKi8KKyAgICBTdHJpbmcgRkxBR19MT0dJTiA9ICItWSI7CisgICAgLyoqIC1HTCBmbGFnICovCisgICAgU3RyaW5nIEZMQUdfT1ZFUlJJREVfV09SS0lOR19ESVIgPSAiLUdMIjsKKyAgICAvKiogLUktIGZsYWcgKi8KKyAgICBTdHJpbmcgRkxBR19BVVRPUkVTUE9OU0VfREVGID0gIi1JLSI7CisgICAgLyoqIC1JLVkgZmxhZyAqLworICAgIFN0cmluZyBGTEFHX0FVVE9SRVNQT05TRV9ZRVMgPSAiLUktWSI7CisgICAgLyoqIC1JLU4gZmxhZyAqLworICAgIFN0cmluZyBGTEFHX0FVVE9SRVNQT05TRV9OTyA9ICItSS1OIjsKKyAgICAvKiogLVIgZmxhZyAqLworICAgIFN0cmluZyBGTEFHX1JFQ1VSU0lPTiA9ICItUiI7CisgICAgLyoqIC1WIGZsYWcgKi8KKyAgICBTdHJpbmcgRkxBR19WRVJTSU9OID0gIi1WIjsKKyAgICAvKiogLVZkIGZsYWcgKi8KKyAgICBTdHJpbmcgRkxBR19WRVJTSU9OX0RBVEUgPSAiLVZkIjsKKyAgICAvKiogLVZMIGZsYWcgKi8KKyAgICBTdHJpbmcgRkxBR19WRVJTSU9OX0xBQkVMID0gIi1WTCI7CisgICAgLyoqIC1XIGZsYWcgKi8KKyAgICBTdHJpbmcgRkxBR19XUklUQUJMRSA9ICItVyI7CisgICAgLyoqIC1OIGZsYWcgKi8KKyAgICBTdHJpbmcgVkFMVUVfTk8gPSAiLU4iOworICAgIC8qKiAtWSBmbGFnICovCisgICAgU3RyaW5nIFZBTFVFX1lFUyA9ICItWSI7CisgICAgLyoqIC1PLSBmbGFnICovCisgICAgU3RyaW5nIEZMQUdfUVVJRVQgPSAiLU8tIjsKKyAgICAvKiogLUMgZmxhZyAqLworICAgIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLUMiOworICAgIC8qKiAtTCBmbGFnICovCisgICAgU3RyaW5nIEZMQUdfTEFCRUwgPSAiLUwiOworICAgIC8qKiB+ZCBmbGFnICovCisgICAgU3RyaW5nIFZBTFVFX0ZST01EQVRFID0gIn5kIjsKKyAgICAvKiogfkwgZmxhZyAqLworICAgIFN0cmluZyBWQUxVRV9GUk9NTEFCRUwgPSAifkwiOworICAgIC8qKiAtTyBmbGFnICovCisgICAgU3RyaW5nIEZMQUdfT1VUUFVUID0gIi1PIjsKKyAgICAvKiogLVUgZmxhZyAqLworICAgIFN0cmluZyBGTEFHX1VTRVIgPSAiLVUiOworICAgIC8qKiAtRi0gZmxhZyAqLworICAgIFN0cmluZyBGTEFHX05PX0ZJTEUgPSAiLUYtIjsKKyAgICAvKiogLUIgZmxhZyAqLworICAgIFN0cmluZyBGTEFHX0JSSUVGID0gIi1CIjsKKyAgICAvKiogLUQgZmxhZyAqLworICAgIFN0cmluZyBGTEFHX0NPREVESUZGID0gIi1EIjsKKyAgICAvKiogLUdUQyBmbGFnICovCisgICAgU3RyaW5nIEZMQUdfRklMRVRJTUVfREVGID0gIi1HVEMiOworICAgIC8qKiAtR1RNIGZsYWcgKi8KKyAgICBTdHJpbmcgRkxBR19GSUxFVElNRV9NT0RJRklFRCA9ICItR1RNIjsKKyAgICAvKiogLUdUVSBmbGFnICovCisgICAgU3RyaW5nIEZMQUdfRklMRVRJTUVfVVBEQVRFRCA9ICItR1RVIjsKKyAgICAvKiogLUdXUiBmbGFnICovCisgICAgU3RyaW5nIEZMQUdfUkVQTEFDRV9XUklUQUJMRSA9ICItR1dSIjsKKyAgICAvKiogLUdXUyBmbGFnICovCisgICAgU3RyaW5nIEZMQUdfU0tJUF9XUklUQUJMRSA9ICItR1dTIjsKKyAgICAvKiogLUctIGZsYWcgKi8KKyAgICBTdHJpbmcgRkxBR19OT19HRVQgPSAiLUctIjsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0dFVC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTR0VULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1ZWQwOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0dFVC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworLyoqCisgKiBQZXJmb3JtIEdldCBjb21tYW5kcyBmcm9tIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0idnNzZ2V0IiBjYXRlZ29yeT0ic2NtIgorICogQGFudC5hdHRyaWJ1dGUuZ3JvdXAgbmFtZT0idmRsIiBkZXNjcmlwdGlvbj0iT25seSBvbmUgb2YgdmVyc2lvbiwgZGF0ZSBvciBsYWJlbCIKKyAqLworcHVibGljIGNsYXNzIE1TVlNTR0VUIGV4dGVuZHMgTVNWU1MgeworCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgc3MuCisgICAgICogQHJldHVybiAgICAgVGhlIGNvbnN0cnVjdGVkIGNvbW1hbmRsaW5lLgorICAgICAqLworICAgIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKKyAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKworICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcworICAgICAgICAvLyBzcyBHZXQgVlNTIGl0ZW1zIFstR10gWy1IXSBbLUktXSBbLU5dIFstT10gWy1SXSBbLVZdIFstV10gWy1ZXSBbLT9dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgU1MuRVhFIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRTU0NvbW1hbmQoKSk7CisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ09NTUFORF9HRVQpOworCisgICAgICAgIGlmIChnZXRWc3NwYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZzc3BhdGgoKSk7CisKKyAgICAgICAgLy8gLUdMCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0TG9jYWxwYXRoKCkpOworICAgICAgICAvLyAtSS0gb3IgLUktWSBvciAtSS1OCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0QXV0b3Jlc3BvbnNlKCkpOworICAgICAgICAvLyAtTy0KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRRdWlldCgpKTsKKyAgICAgICAgLy8gLVIKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRSZWN1cnNpdmUoKSk7CisgICAgICAgIC8vIC1WCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0VmVyc2lvbkRhdGVMYWJlbCgpKTsKKyAgICAgICAgLy8gLVcKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRXcml0YWJsZSgpKTsKKyAgICAgICAgLy8gLVkKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRMb2dpbigpKTsKKyAgICAgICAgLy8gLUcKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRGaWxlVGltZVN0YW1wKCkpOworICAgICAgICAvLyAtR1dTIG9yIC1HV1IKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRXcml0YWJsZUZpbGVzKCkpOworCisgICAgICAgIHJldHVybiBjb21tYW5kTGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgcHJvamVjdCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIGxvY2FsUGF0aCAgIFRoZSBwYXRoIG9uIGRpc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxwYXRoKFBhdGggbG9jYWxQYXRoKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsTG9jYWxQYXRoKGxvY2FsUGF0aC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZmlsZXMgcmVjdXJzaXZlbHkuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY3Vyc2l2ZSAgVGhlIGJvb2xlYW4gdmFsdWUgZm9yIHJlY3Vyc2l2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSZWN1cnNpdmUoYm9vbGVhbiByZWN1cnNpdmUpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxSZWN1cnNpdmUocmVjdXJzaXZlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgcXVpZXQgbW9kZS4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICBxdWlldCBUaGUgYm9vbGVhbiB2YWx1ZSBmb3IgcXVpZXQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0UXVpZXQgKGJvb2xlYW4gcXVpZXQpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxRdWlldChxdWlldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5zZXQgdGhlIFJFQUQtT05MWSBmbGFnIG9uIGZpbGVzIHJldHJpZXZlZCBmcm9tIFZTUy4gRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICB3cml0YWJsZSBUaGUgYm9vbGVhbiB2YWx1ZSBmb3Igd3JpdGFibGUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0V3JpdGFibGUoYm9vbGVhbiB3cml0YWJsZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFdyaXRhYmxlKHdyaXRhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJzaW9uIHRvIGdldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgdmVyc2lvbiBUaGUgdmVyc2lvbiB0byBnZXQuCisgICAgICoKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBncm91cD0idmRsIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxWZXJzaW9uKHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIERhdGUgdG8gZ2V0LgorICAgICAqCisgICAgICogQHBhcmFtICBkYXRlIFRoZSBkYXRlIHRvIGdldC4KKyAgICAgKgorICAgICAqIEBhbnQuYXR0cmlidXRlIGdyb3VwPSJ2ZGwiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZShTdHJpbmcgZGF0ZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbERhdGUoZGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGFiZWwgdG8gZ2V0LgorICAgICAqCisgICAgICogQHBhcmFtICBsYWJlbCBUaGUgbGFiZWwgdG8gZ2V0LgorICAgICAqCisgICAgICogQGFudC5hdHRyaWJ1dGUgZ3JvdXA9InZkbCIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxMYWJlbChsYWJlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXV0b3Jlc3BvbmNlIGJlaGF2aW91ci4gVmFsaWQgb3B0aW9ucyBhcmUgWSBhbmQgTi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgYXV0byByZXNwb25zZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvcmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsQXV0b1Jlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEYXRlIGFuZCB0aW1lIHN0YW1wIGdpdmVuIHRvIHRoZSBsb2NhbCBjb3B5LiBEZWZhdWx0cyB0byA8Y29kZT5jdXJyZW50PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgICAgIFRoZSBmaWxlIHRpbWUgc3RhbXBpbmcgYmVoYXZpb3VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVUaW1lU3RhbXAoQ3VycmVudE1vZFVwZGF0ZWQgdGltZXN0YW1wKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsRmlsZVRpbWVTdGFtcCh0aW1lc3RhbXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjdGlvbiB0YWtlbiB3aGVuIGxvY2FsIGZpbGVzIGFyZSB3cml0YWJsZS4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFpbDwvY29kZT4uCisgICAgICogPHA+CisgICAgICogRHVlIHRvIHNzLmV4ZSByZXR1cm5pbmcgd2l0aCBhbiBleGl0IGNvZGUgb2YgJzEwMCcgZm9yIGJvdGggZXJyb3JzIGFuZCB3aGVuCisgICAgICogYSBmaWxlIGhhcyBiZWVuIHNraXBwZWQsIDxjb2RlPmZhaWxvbmVycm9yPC9jb2RlPiBpcyBzZXQgdG8gZmFsc2Ugd2hlbiB1c2luZworICAgICAqIHRoZSA8Y29kZT5za2lwPC9jb2RlPiBvcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZXMgVGhlIGFjdGlvbiB0byB0YWtlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdyaXRhYmxlRmlsZXMoV3JpdGFibGVGaWxlcyBmaWxlcykgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFdyaXRhYmxlRmlsZXMoZmlsZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0hJU1RPUlkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0hJU1RPUlkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjNiOGVjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTSElTVE9SWS5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKKworLyoqCisgKiBQZXJmb3JtcyBIaXN0b3J5IGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KKyAqCisgKiBAYW50LnRhc2sgbmFtZT0idnNzaGlzdG9yeSIgY2F0ZWdvcnk9InNjbSIKKyAqLworcHVibGljIGNsYXNzIE1TVlNTSElTVE9SWSBleHRlbmRzIE1TVlNTIHsKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIGNvbW1hbmQgbGluZSB0byBleGVjdXRlIHNzLgorICAgICAqIEByZXR1cm4gICAgIFRoZSBjb25zdHJ1Y3RlZCBjb21tYW5kbGluZS4KKyAgICAgKi8KKyAgICBDb21tYW5kbGluZSBidWlsZENtZExpbmUoKSB7CisgICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CisKKyAgICAgICAgLy8gZmlyc3Qgb2ZmLCBtYWtlIHN1cmUgdGhhdCB3ZSd2ZSBnb3QgYSBjb21tYW5kIGFuZCBhIHZzc2RpciBhbmQgYSBsYWJlbCAuLi4KKyAgICAgICAgaWYgKGdldFZzc3BhdGgoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gInZzc3BhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdCB0aGUgZm9ybWF0IGlzCisgICAgICAgIC8vIHNzIEhpc3RvcnkgZWxlbWVudHMgWy1IXSBbLUxdIFstTl0gWy1PXSBbLVZdIFstWV0gWy0jXSBbLT9dCisgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgU1MuRVhFIGhlbHAKKyAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRTU0NvbW1hbmQoKSk7CisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ09NTUFORF9ISVNUT1JZKTsKKworICAgICAgICAvLyBWU1MgaXRlbXMKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWc3NwYXRoKCkpOworICAgICAgICAvLyAtSS0KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0FVVE9SRVNQT05TRV9ERUYpOyAgLy8gaWdub3JlIGFsbCBlcnJvcnMKKyAgICAgICAgLy8gLVZkCisgICAgICAgIGNvbW1hbmRMaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0VmVyc2lvbkRhdGUoKSk7CisgICAgICAgIC8vIC1WTAorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZlcnNpb25MYWJlbCgpKTsKKyAgICAgICAgLy8gLVIKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRSZWN1cnNpdmUoKSk7CisgICAgICAgIC8vIC1CIC8gLUQgLyAtRi0KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRTdHlsZSgpKTsKKyAgICAgICAgLy8gLVkKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRMb2dpbigpKTsKKyAgICAgICAgLy8gLU8KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRPdXRwdXQoKSk7CisKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRMaW5lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGhpc3RvcnkgcmVjdXJzaXZlbHkuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY3Vyc2l2ZSAgVGhlIGJvb2xlYW4gdmFsdWUgZm9yIHJlY3Vyc2l2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWN1cnNpdmUoYm9vbGVhbiByZWN1cnNpdmUpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxSZWN1cnNpdmUocmVjdXJzaXZlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB1c2VyIHdob3NlIGNoYW5nZSBoaXN0b3J5IGlzIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIHVzZXIgVGhlIHVzZXJuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIHVzZXIpIHsKKyAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxVc2VyKHVzZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERhdGUgcmVwcmVzZW50aW5nIHRoZSAnc3RhcnQnIG9mIHRoZSByYW5nZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIGZyb21EYXRlICAgIFRoZSBzdGFydCBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb21EYXRlKFN0cmluZyBmcm9tRGF0ZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbEZyb21EYXRlKGZyb21EYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEYXRlIHJlcHJlc2VudGluZyB0aGUgJ2VuZCcgb2YgdGhlIHJhbmdlLgorICAgICAqCisgICAgICogQHBhcmFtICAgdG9EYXRlICAgIFRoZSBlbmQgZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb0RhdGUoU3RyaW5nIHRvRGF0ZSkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFRvRGF0ZSh0b0RhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExhYmVsIHJlcHJlc2VudGluZyB0aGUgJ3N0YXJ0JyBvZiB0aGUgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICBmcm9tTGFiZWwgICAgVGhlIHN0YXJ0IGxhYmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb21MYWJlbChTdHJpbmcgZnJvbUxhYmVsKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsRnJvbUxhYmVsKGZyb21MYWJlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGFiZWwgcmVwcmVzZW50aW5nIHRoZSAnZW5kJyBvZiB0aGUgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICB0b0xhYmVsICAgIFRoZSBlbmQgbGFiZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG9MYWJlbChTdHJpbmcgdG9MYWJlbCkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFRvTGFiZWwodG9MYWJlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGRheXMgZm9yIGNvbXBhcmlzb24uCisgICAgICogRGVmYXVsdHMgdG8gMiBkYXlzLgorICAgICAqCisgICAgICogQHBhcmFtICAgbnVtZCAgICBUaGUgbnVtYmVyIG9mIGRheXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtZGF5cyhpbnQgbnVtZCkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbE51bURheXMobnVtZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3V0cHV0IGZpbGUgbmFtZSBmb3IgdGhlIGhpc3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICBvdXRmaWxlIFRoZSBvdXRwdXQgZmlsZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChGaWxlIG91dGZpbGUpIHsKKyAgICAgICAgaWYgKG91dGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxPdXRwdXRGaWxlbmFtZShvdXRmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCBvZiBkYXRlcyBpbiA8Y29kZT5mcm9tRGF0ZTwvY29kZSBhbmQgPGNvZGU+dG9EYXRlPC9jb2RlPi4KKyAgICAgKiBVc2VkIHdoZW4gY2FsY3VsYXRpbmcgZGF0ZXMgd2l0aCB0aGUgbnVtZGF5cyBhdHRyaWJ1dGUuCisgICAgICogVGhpcyBzdHJpbmcgdXNlcyB0aGUgZm9ybWF0dGluZyBydWxlcyBvZiA8Y29kZT5TaW1wbGVEYXRlRm9ybWF0PC9jb2RlPi4KKyAgICAgKiBEZWZhdWx0cyB0byA8Y29kZT5EYXRlRm9ybWF0LlNIT1JUPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIGRhdGVGb3JtYXQgIFRoZSBkYXRlIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlRm9ybWF0KFN0cmluZyBkYXRlRm9ybWF0KSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsRGF0ZUZvcm1hdChuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0KSk7CisgICAgfQorCisgICAvKioKKyAgICAgKiBPdXRwdXQgc3R5bGUuIFZhbGlkIG9wdGlvbnMgYXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YnJpZWY6ICAgIC1CIERpc3BsYXkgYSBicmllZiBoaXN0b3J5LgorICAgICAqIDxsaT5jb2RlZGlmZjogLUQgRGlzcGxheSBsaW5lLWJ5LWxpbmUgZmlsZSBjaGFuZ2VzLgorICAgICAqIDxsaT5ub2ZpbGU6ICAgLUYtIERvIG5vdCBkaXNwbGF5IGluZGl2aWR1YWwgZmlsZSB1cGRhdGVzIGluIHRoZSBwcm9qZWN0IGhpc3RvcnkuCisgICAgICogPGxpPmRlZmF1bHQ6ICBObyBvcHRpb24gc3BlY2lmaWVkLiBEaXNwbGF5IGluIFNvdXJjZSBTYWZlJ3MgZGVmYXVsdCBmb3JtYXQuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyIFRoZSBoaXN0b3J5IHN0eWxlOgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKEJyaWVmQ29kZWRpZmZOb2ZpbGUgYXR0cikgeworICAgICAgICBTdHJpbmcgb3B0aW9uID0gYXR0ci5nZXRWYWx1ZSgpOworICAgICAgICBpZiAob3B0aW9uLmVxdWFscyhTVFlMRV9CUklFRikpIHsKKyAgICAgICAgICAgIHN1cGVyLnNldEludGVybmFsU3R5bGUoRkxBR19CUklFRik7CisgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscyhTVFlMRV9DT0RFRElGRikpIHsKKyAgICAgICAgICAgIHN1cGVyLnNldEludGVybmFsU3R5bGUoRkxBR19DT0RFRElGRik7CisgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscyhTVFlMRV9ERUZBVUxUKSkgeworICAgICAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxTdHlsZSgiIik7CisgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmVxdWFscyhTVFlMRV9OT0ZJTEUpKSB7CisgICAgICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFN0eWxlKEZMQUdfTk9fRklMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlN0eWxlICIgKyBhdHRyICsgIiB1bmtub3duLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0ZW50aW9uIG9mIEVudW1lcmF0ZWRBdHRyaWJ1dGUgdG8gaG9sZCB0aGUgdmFsdWVzIGZvciBzdHlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJyaWVmQ29kZWRpZmZOb2ZpbGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsb3dhYmxlIHZhbHVlcy4KKyAgICAgICAgICogQHJldHVybiBUaGUgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge1NUWUxFX0JSSUVGLCBTVFlMRV9DT0RFRElGRiwgU1RZTEVfTk9GSUxFLCBTVFlMRV9ERUZBVUxUfTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0xBQkVMLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NMQUJFTC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTlkN2IKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NMQUJFTC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogUGVyZm9ybXMgTGFiZWwgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgorICoKKyAqIEBhbnQudGFzayBuYW1lPSJ2c3NsYWJlbCIgY2F0ZWdvcnk9InNjbSIKKyAqLworcHVibGljIGNsYXNzIE1TVlNTTEFCRUwgZXh0ZW5kcyBNU1ZTUyB7CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBzcy4KKyAgICAgKiBAcmV0dXJuICAgICBUaGUgY29uc3RydWN0ZWQgY29tbWFuZGxpbmUuCisgICAgICovCisgICAgQ29tbWFuZGxpbmUgYnVpbGRDbWRMaW5lKCkgeworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOworCisgICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgY29tbWFuZCBhbmQgYSB2c3NkaXIgYW5kIGEgbGFiZWwgLi4uCisgICAgICAgIGlmIChnZXRWc3NwYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBsYWJlbCA9IGdldExhYmVsKCk7CisgICAgICAgIGlmIChsYWJlbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gImxhYmVsIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcworICAgICAgICAvLyBzcyBMYWJlbCBWU1MgaXRlbXMgWy1DXSBbLUhdIFstSS1dIFstTGxhYmVsXSBbLU5dIFstT10gWy1WXSBbLVldIFstP10KKyAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIHRoZSBTUy5FWEUgaGVscAorICAgICAgICBjb21tYW5kTGluZS5zZXRFeGVjdXRhYmxlKGdldFNTQ29tbWFuZCgpKTsKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDT01NQU5EX0xBQkVMKTsKKworICAgICAgICAvLyBWU1MgaXRlbXMKKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWc3NwYXRoKCkpOworICAgICAgICAvLyAtQworICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnQoKSk7CisgICAgICAgIC8vIC1JLSBvciAtSS1ZIG9yIC1JLU4KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRBdXRvcmVzcG9uc2UoKSk7CisgICAgICAgIC8vIC1MIFNwZWNpZnkgdGhlIG5ldyBsYWJlbCBvbiB0aGUgY29tbWFuZCBsaW5lIChpbnN0ZWFkIG9mIGJlaW5nIHByb21wdGVkKQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGxhYmVsKTsKKyAgICAgICAgLy8gLVYgTGFiZWwgYW4gZXhpc3RpbmcgZmlsZSBvciBwcm9qZWN0IHZlcnNpb24KKyAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWZXJzaW9uKCkpOworICAgICAgICAvLyAtWQorICAgICAgICBjb21tYW5kTGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldExvZ2luKCkpOworCisgICAgICAgIHJldHVybiBjb21tYW5kTGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYWJlbCB0byBhcHBseSBpbiBTb3VyY2VTYWZlLgorICAgICAqCisgICAgICogQHBhcmFtICBsYWJlbCBUaGUgbGFiZWwgdG8gYXBwbHkuCisgICAgICoKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBncm91cD0icmVxdWlyZWQiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsTGFiZWwobGFiZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcnNpb24gdG8gbGFiZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHZlcnNpb24gVGhlIHZlcnNpb24gdG8gbGFiZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFZlcnNpb24odmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbWVudCB0byBhcHBseSB0byBmaWxlcyBsYWJlbGVkIGluIFNvdXJjZVNhZmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWVudCBUaGUgY29tbWVudCB0byBhcHBseSBpbiBTb3VyY2VTYWZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgeworICAgICAgICBzdXBlci5zZXRJbnRlcm5hbENvbW1lbnQoY29tbWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXV0b3Jlc3BvbmNlIGJlaGF2aW91ci4gVmFsaWQgb3B0aW9ucyBhcmUgWSBhbmQgTi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgYXV0byByZXNwb25zZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvcmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIHN1cGVyLnNldEludGVybmFsQXV0b1Jlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC93aW5kb3dzL0F0dHJpYi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvd2luZG93cy9BdHRyaWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGMzMzhmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvd2luZG93cy9BdHRyaWIuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLndpbmRvd3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlT247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQXR0cmliIGVxdWl2YWxlbnQgZm9yIFdpbjMyIGVudmlyb25tZW50cy4KKyAqIE5vdGU6IEF0dHJpYiBwYXJhbWV0ZXJzIC9TIGFuZCAvRCBhcmUgbm90IGhhbmRsZWQuCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIEF0dHJpYiBleHRlbmRzIEV4ZWN1dGVPbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRUFET05MWSA9ICJSIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUkNISVZFICA9ICJBIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TWVNURU0gICA9ICJTIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ISURERU4gICA9ICJIIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUICAgID0gIisiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNFVCAgPSAiLSI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUF0dHIgPSBmYWxzZTsKKworICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgQXR0cmliLiAqLworICAgIHB1YmxpYyBBdHRyaWIoKSB7CisgICAgICAgIHN1cGVyLnNldEV4ZWN1dGFibGUoImF0dHJpYiIpOworICAgICAgICBzdXBlci5zZXRQYXJhbGxlbChmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmaWxlIHRvIGJlIGF0dHJpYmVkLgorICAgICAqIEBwYXJhbSBzcmMgYSBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIHNyYykgeworICAgICAgICBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKKyAgICAgICAgZnMuc2V0RmlsZShzcmMpOworICAgICAgICBhZGRGaWxlc2V0KGZzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFJlYWRPbmx5IGZpbGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSB2YWx1ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVhZG9ubHkoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBhZGRBcmcodmFsdWUsIEFUVFJfUkVBRE9OTFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQXJjaGl2ZSBmaWxlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyY2hpdmUoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBhZGRBcmcodmFsdWUsIEFUVFJfQVJDSElWRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTeXN0ZW0gZmlsZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHZhbHVlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW0oYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBhZGRBcmcodmFsdWUsIEFUVFJfU1lTVEVNKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEhpZGRlbiBmaWxlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhpZGRlbihib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGFkZEFyZyh2YWx1ZSwgQVRUUl9ISURERU4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgaWYgKCFoYXZlQXR0cigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgYXR0cmlidXRlIHBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuY2hlY2tDb25maWd1cmF0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBleGVjdXRhYmxlLgorICAgICAqIFRoaXMgaXMgbm90IGFsbG93ZWQsIGFuZCBpdCBhbHdheXMgdGhyb3dzIGEgQnVpbGRFeGNlcHRpb24uCisgICAgICogQHBhcmFtIGUgaWdub3JlZAorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlKFN0cmluZyBlKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCisgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgZXhlY3V0YWJsZSBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGV4ZWN1dGFibGUuCisgICAgICogVGhpcyBpcyBub3QgYWxsb3dlZCwgYW5kIGl0IGFsd2F5cyB0aHJvd3MgYSBCdWlsZEV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gZSBpZ25vcmVkCisgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1hbmQoU3RyaW5nIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tUeXBlKCkKKyAgICAgICAgICAgICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSBjb21tYW5kIGF0dHJpYnV0ZSIsIGdldExvY2F0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBzb3VyY2UgZmlsZS4KKyAgICAgKiBUaGlzIGlzIG5vdCBhbGxvd2VkLCBhbmQgaXQgYWx3YXlzIHRocm93cyBhIEJ1aWxkRXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBiIGlnbm9yZWQKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkc291cmNlZmlsZShib29sZWFuIGIpIHsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tUeXBlKCkKKyAgICAgICAgICAgICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSBhZGRzb3VyY2VmaWxlIGF0dHJpYnV0ZSIsIGdldExvY2F0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBza2lwIGVtcHR5IGZpbGUgc2V0cy4KKyAgICAgKiBUaGlzIGlzIG5vdCBhbGxvd2VkLCBhbmQgaXQgYWx3YXlzIHRocm93cyBhIEJ1aWxkRXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBza2lwIGlnbm9yZWQKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2tpcEVtcHR5RmlsZXNldHMoYm9vbGVhbiBza2lwKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJza2lwZW1wdHlmaWxlc2V0IGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcGFyYWxsZWwuCisgICAgICogVGhpcyBpcyBub3QgYWxsb3dlZCwgYW5kIGl0IGFsd2F5cyB0aHJvd3MgYSBCdWlsZEV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYWxsZWwgaWdub3JlZAorICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbGxlbChib29sZWFuIHBhcmFsbGVsKSB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgcGFyYWxsZWwgYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBtYXggcGFyYWxsZWwuCisgICAgICogVGhpcyBpcyBub3QgYWxsb3dlZCwgYW5kIGl0IGFsd2F5cyB0aHJvd3MgYSBCdWlsZEV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gbWF4IGlnbm9yZWQKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4UGFyYWxsZWwoaW50IG1heCkgeworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza1R5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuXCd0IHN1cHBvcnQgdGhlIG1heHBhcmFsbGVsIGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgb3MgaXMgdmFsaWQuCisgICAgICogQWx3YXlzIGluY2x1ZGUgd2luZG93cworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb3MgaXMgdmFsaWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZE9zKCkgeworICAgICAgICByZXR1cm4gT3MuaXNGYW1pbHkoIndpbmRvd3MiKSAmJiBzdXBlci5pc1ZhbGlkT3MoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2lnblN0cmluZyhib29sZWFuIGF0dHIpIHsKKyAgICAgICAgcmV0dXJuIChhdHRyID8gU0VUIDogVU5TRVQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRBcmcoYm9vbGVhbiBzaWduLCBTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgIGNyZWF0ZUFyZygpLnNldFZhbHVlKGdldFNpZ25TdHJpbmcoc2lnbikgKyBhdHRyaWJ1dGUpOworICAgICAgICBoYXZlQXR0ciA9IHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhdmVBdHRyKCkgeworICAgICAgICByZXR1cm4gaGF2ZUF0dHI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL0RlZmF1bHRSbWljQWRhcHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9EZWZhdWx0Um1pY0FkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjIwMTViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9EZWZhdWx0Um1pY0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDQ5MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJtaWM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVOYW1lTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFJtaWNBZGFwdGVyIGludGVyZmFjZS4KKyAqIEN1cnJlbnRseSwgdGhpcyBpcyBhIGN1dC1hbmQtcGFzdGUgb2YgdGhlIG9yaWdpbmFsIHJtaWMgdGFzayBhbmQKKyAqIERlZmF1bHRDb3BtcGlsZXJBZGFwdGVyLgorICoKKyAqIEBzaW5jZSBBbnQgMS40CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZhdWx0Um1pY0FkYXB0ZXIgaW1wbGVtZW50cyBSbWljQWRhcHRlciB7CisKKyAgICBwcml2YXRlIFJtaWMgYXR0cmlidXRlczsKKyAgICBwcml2YXRlIEZpbGVOYW1lTWFwcGVyIG1hcHBlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gUkFORCA9IG5ldyBSYW5kb20oKTsKKyAgICAvKiogc3VmZml4IGRlbm90aW5nIGEgc3R1YiBmaWxlOiB7QHZhbHVlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJNSV9TVFVCX1NVRkZJWCA9ICJfU3R1YiI7CisgICAgLyoqIHN1ZmZpeCBkZW5vdGluZyBhIHNrZWwgZmlsZToge0B2YWx1ZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSTUlfU0tFTF9TVUZGSVggPSAiX1NrZWwiOworICAgIC8qKiBzdWZmaXggZGVub3RpbmcgYSB0aWUgZmlsZToge0B2YWx1ZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSTUlfVElFX1NVRkZJWCA9ICJfVGllIjsKKyAgICAvKiogYXJnIGZvciBjb21wYXQ6IHtAdmFsdWV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVQl9DT01QQVQgPSAiLXZjb21wYXQiOworICAgIC8qKiBhcmcgZm9yIDEuMToge0B2YWx1ZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVCXzFfMSA9ICItdjEuMSI7CisgICAgLyoqIGFyZyBmb3IgMS4yOiB7QHZhbHVlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUJfMV8yID0gIi12MS4yIjsKKworICAgIC8qKgorICAgICAqIG9wdGlvbiBmb3Igc3R1YiAxLjEgaW4gdGhlIHJtaWMgdGFzazoge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVCX09QVElPTl8xXzEgPSAiMS4xIjsKKyAgICAvKioKKyAgICAgKiBvcHRpb24gZm9yIHN0dWIgMS4yIGluIHRoZSBybWljIHRhc2s6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVQl9PUFRJT05fMV8yID0gIjEuMiI7CisgICAgLyoqCisgICAgICogb3B0aW9uIGZvciBzdHViIGNvbXBhdCBpbiB0aGUgcm1pYyB0YXNrOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUJfT1BUSU9OX0NPTVBBVCA9ICJjb21wYXQiOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBEZWZhdWx0Um1pY0FkYXB0ZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBSbWljIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgcm1pYyBhdHRyaWJ1dGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um1pYyhmaW5hbCBSbWljIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICAgICAgbWFwcGVyID0gbmV3IFJtaWNGaWxlTmFtZU1hcHBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgUm1pYyBhdHRyaWJ1dGVzCisgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlcyBhcyBhIFJtaWMgdGFza2RlZgorICAgICAqLworICAgIHB1YmxpYyBSbWljIGdldFJtaWMoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHN0dWIgY2xhc3Mgc3VmZml4CisgICAgICogQHJldHVybiB0aGUgc3R1YiBzdWZmaXggJnF1b3Q7X1N0dWImcXVvdDsKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN0dWJDbGFzc1N1ZmZpeCgpIHsKKyAgICAgICAgcmV0dXJuIFJNSV9TVFVCX1NVRkZJWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBza2VsZXRvbiBjbGFzcyBzdWZmaXgKKyAgICAgKiBAcmV0dXJuIHRoZSBza2VsZXRvbiBzdWZmaXggJnF1b3Q7X1NrZWwmcXVvdDsKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNrZWxDbGFzc1N1ZmZpeCgpIHsKKyAgICAgICAgcmV0dXJuIFJNSV9TS0VMX1NVRkZJWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aWUgY2xhc3Mgc3VmZml4CisgICAgICogQHJldHVybiB0aGUgdGllIHN1ZmZpeCAmcXVvdDtfVGllJnF1b3Q7CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUaWVDbGFzc1N1ZmZpeCgpIHsKKyAgICAgICAgcmV0dXJuIFJNSV9USUVfU1VGRklYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIG1hcHBlciB0aGF0IG1heSByZXR1cm4gdXAgdG8gdHdvCisgICAgICogZmlsZSBuYW1lcy4KKyAgICAgKgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5mb3IgSlJNUCBpdCB3aWxsIHJldHVybiAqX2dldFN0dWJDbGFzc1N1ZmZpeCAoYW5kCisgICAgICogICAqX2dldFNrZWxDbGFzc1N1ZmZpeCBpZiBKREsgMS4xIGlzIHVzZWQpPC9saT4KKyAgICAgKgorICAgICAqICAgPGxpPmZvciBJREwgaXQgd2lsbCByZXR1cm4gYSByYW5kb20gbmFtZSwgY2F1c2luZyAmbHQ7cm1pYyZndDsgdG8KKyAgICAgKiAgICAgYWx3YXlzIHJlY29tcGlsZS48L2xpPgorICAgICAqCisgICAgICogICA8bGk+Zm9yIElJT1AgaXQgd2lsbCByZXR1cm4gXypfZ2V0U3R1YkNsYXNzU3VmZml4IGZvcgorICAgICAqICAgaW50ZXJmYWNlcyBhbmQgXypfZ2V0U3R1YkNsYXNzU3VmZml4IGZvciBub24taW50ZXJmYWNlcyAoYW5kCisgICAgICogICBkZXRlcm1pbmUgdGhlIGludGVyZmFjZSBhbmQgY3JlYXRlIF8qX1N0dWIgZnJvbSB0aGF0KS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQHJldHVybiBhIDxjb2RlPkZpbGVOYW1lTWFwcGVyPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBGaWxlTmFtZU1hcHBlciBnZXRNYXBwZXIoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgQ0xBU1NQQVRIIHRoaXMgcm1pYyBwcm9jZXNzIHdpbGwgdXNlLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbXBpbGVDbGFzc3BhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgdGhlIGNvbXBpbGF0aW9uIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGF0aCBnZXRDb21waWxlQ2xhc3NwYXRoKCkgeworICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKGF0dHJpYnV0ZXMuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgLy8gYWRkIGRlc3QgZGlyIHRvIGNsYXNzcGF0aCBzbyB0aGF0IHByZXZpb3VzbHkgY29tcGlsZWQgYW5kCisgICAgICAgIC8vIHVudG91Y2hlZCBjbGFzc2VzIGFyZSBvbiBjbGFzc3BhdGgKKyAgICAgICAgY2xhc3NwYXRoLnNldExvY2F0aW9uKGF0dHJpYnV0ZXMuZ2V0QmFzZSgpKTsKKworICAgICAgICAvLyBDb21iaW5lIHRoZSBidWlsZCBjbGFzc3BhdGggd2l0aCB0aGUgc3lzdGVtIGNsYXNzcGF0aCwgaW4gYW4KKyAgICAgICAgLy8gb3JkZXIgZGV0ZXJtaW5lZCBieSB0aGUgdmFsdWUgb2YgYnVpbGQuc3lzY2xhc3NwYXRoCisKKyAgICAgICAgUGF0aCBjcCA9IGF0dHJpYnV0ZXMuZ2V0Q2xhc3NwYXRoKCk7CisgICAgICAgIGlmIChjcCA9PSBudWxsKSB7CisgICAgICAgICAgICBjcCA9IG5ldyBQYXRoKGF0dHJpYnV0ZXMuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRJbmNsdWRlYW50cnVudGltZSgpKSB7CisgICAgICAgICAgICBjbGFzc3BhdGguYWRkRXhpc3RpbmcoY3AuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0IikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFkZEV4aXN0aW5nKGNwLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0SW5jbHVkZWphdmFydW50aW1lKCkpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aC5hZGRKYXZhUnVudGltZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0dXAgcm1pYyBhcmd1bWVudCBmb3Igcm1pYy4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgc2V0dXBSbWljQ29tbWFuZCgpIHsKKyAgICAgICAgcmV0dXJuIHNldHVwUm1pY0NvbW1hbmQobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0dXAgcm1pYyBhcmd1bWVudCBmb3Igcm1pYy4KKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgbmVlZGVkIGJ5IGEgc3BlY2lmaWMKKyAgICAgKiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgc2V0dXBSbWljQ29tbWFuZChTdHJpbmdbXSBvcHRpb25zKSB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworCisgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKG9wdGlvbnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUGF0aCBjbGFzc3BhdGggPSBnZXRDb21waWxlQ2xhc3NwYXRoKCk7CisKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kIik7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldEZpbGUoYXR0cmlidXRlcy5nZXRCYXNlKCkpOworCisgICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldEV4dGRpcnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWV4dGRpcnMiKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoYXR0cmlidXRlcy5nZXRFeHRkaXJzKCkpOworICAgICAgICB9CisKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsKKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChjbGFzc3BhdGgpOworICAgICAgICBTdHJpbmcgc3R1Yk9wdGlvbiA9IGFkZFN0dWJWZXJzaW9uT3B0aW9ucygpOworICAgICAgICBpZiAoc3R1Yk9wdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAvL3NldCB0aGUgbm9uLW51bGwgc3R1Yk9wdGlvbgorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoc3R1Yk9wdGlvbik7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChudWxsICE9IGF0dHJpYnV0ZXMuZ2V0U291cmNlQmFzZSgpKSB7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWtlZXBnZW5lcmF0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldElpb3AoKSkgeworICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIklJT1AgaGFzIGJlZW4gdHVybmVkIG9uLiIsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1paW9wIik7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRJaW9wb3B0cygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiSUlPUCBPcHRpb25zOiAiICsgYXR0cmlidXRlcy5nZXRJaW9wb3B0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGF0dHJpYnV0ZXMuZ2V0SWlvcG9wdHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRJZGwoKSkgIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItaWRsIik7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiSURMIGhhcyBiZWVuIHR1cm5lZCBvbi4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldElkbG9wdHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXR0cmlidXRlcy5nZXRJZGxvcHRzKCkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJJREwgT3B0aW9uczogIiArIGF0dHJpYnV0ZXMuZ2V0SWRsb3B0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0RGVidWcoKSkgeworICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1nIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBjb21waWxlckFyZ3MgPSBhdHRyaWJ1dGVzLmdldEN1cnJlbnRDb21waWxlckFyZ3MoKTsKKyAgICAgICAgY29tcGlsZXJBcmdzID0gcHJlcHJvY2Vzc0NvbXBpbGVyQXJncyhjb21waWxlckFyZ3MpOworICAgICAgICBjbWQuYWRkQXJndW1lbnRzKGNvbXBpbGVyQXJncyk7CisKKyAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKKyAgICAgICAgcmV0dXJuIGNtZDsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludDsgZ2V0IHRoZSBzdHViIHZlcnNpb24gb2ZmIHRoZSBybWljIGNvbW1hbmQgYW5kCisgICAgICogdHJhbnNsYXRlIHRoYXQgaW50byBhIGNvbXBpbGVyLXNwZWNpZmljIGFyZ3VtZW50CisgICAgICogQHJldHVybiBhIHN0cmluZyB0byB1c2UgZm9yIHRoZSBzdHViIHZlcnNpb247IGNhbiBiZSBudWxsCisgICAgICogQHNpbmNlIEFudDEuNy4xCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhZGRTdHViVmVyc2lvbk9wdGlvbnMoKSB7CisgICAgICAgIC8vaGFuZGxlIHRoZSBtYW55IGRpZmZlcmVudCBzdHViIG9wdGlvbnMuCisgICAgICAgIFN0cmluZyBzdHViVmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0U3R1YlZlcnNpb24oKTsKKyAgICAgICAgLy9kZWZhdWx0IGlzIGNvbXBhdGliaWxpdHkKKyAgICAgICAgU3RyaW5nIHN0dWJPcHRpb24gPSBudWxsOworICAgICAgICBpZiAobnVsbCAhPSBzdHViVmVyc2lvbikgeworICAgICAgICAgICAgaWYgKFNUVUJfT1BUSU9OXzFfMS5lcXVhbHMoc3R1YlZlcnNpb24pKSB7CisgICAgICAgICAgICAgICAgc3R1Yk9wdGlvbiA9IFNUVUJfMV8xOworICAgICAgICAgICAgfSBlbHNlIGlmIChTVFVCX09QVElPTl8xXzIuZXF1YWxzKHN0dWJWZXJzaW9uKSkgeworICAgICAgICAgICAgICAgIHN0dWJPcHRpb24gPSBTVFVCXzFfMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU1RVQl9PUFRJT05fQ09NUEFULmVxdWFscyhzdHViVmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICBzdHViT3B0aW9uID0gU1RVQl9DT01QQVQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vYW55dGhpbmcgZWxzZQorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVbmtub3duIHN0dWIgb3B0aW9uICIgKyBzdHViVmVyc2lvbik7CisgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nIHdpdGggdGhlIHZhbHVlPyBvciBnbyAtditzdHViVmVyc2lvbj8/CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9mb3IgamF2YTEuNSssIHdlIGdlbmVyYXRlIGNvbXBhdGlibGUgc3R1YnMsIHRoYXQgaXMsIHVubGVzcworICAgICAgICAvL3RoZSBjYWxsZXIgYXNrZWQgZm9yIElETCBvciBJSU9QIHN1cHBvcnQuCisgICAgICAgIGlmIChzdHViT3B0aW9uID09IG51bGwKKyAgICAgICAgICAgICYmICFhdHRyaWJ1dGVzLmdldElpb3AoKQorICAgICAgICAgICAgJiYgIWF0dHJpYnV0ZXMuZ2V0SWRsKCkpIHsKKyAgICAgICAgICAgIHN0dWJPcHRpb24gPSBTVFVCX0NPTVBBVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3R1Yk9wdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwcm9jZXNzIHRoZSBjb21waWxlciBhcmd1bWVudHMgaW4gYW55IHdheSB5b3Ugc2VlIGZpdC4KKyAgICAgKiBUaGlzIGlzIHRvIGFsbG93IGNvbXBpbGVyIGFkYXB0ZXJzIHRvIHZhbGlkYXRlIG9yIGZpbHRlciB0aGUgYXJndW1lbnRzLgorICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIG9yaWdpbmFsIGNvbXBpbGVyIGFyZ3VtZW50cyB1bmNoYW5nZWQuCisgICAgICogQHBhcmFtIGNvbXBpbGVyQXJncyB0aGUgb3JpZ2luYWwgY29tcGlsZXIgYXJndW1lbnRzCisgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgc2V0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBwcmVwcm9jZXNzQ29tcGlsZXJBcmdzKFN0cmluZ1tdIGNvbXBpbGVyQXJncykgeworICAgICAgICByZXR1cm4gY29tcGlsZXJBcmdzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RyaXAgb3V0IGFsbCAtSiBhcmdzIGZyb20gdGhlIGNvbW1hbmQgbGlzdC4gSW52b2tlIHRoaXMgZnJvbQorICAgICAqIHtAbGluayAjcHJlcHJvY2Vzc0NvbXBpbGVyQXJncyhTdHJpbmdbXSl9IGlmIHlvdSBoYXZlIGEgbm9uLWZvcmtpbmcKKyAgICAgKiBjb21waWxlci4KKyAgICAgKiBAcGFyYW0gY29tcGlsZXJBcmdzIHRoZSBvcmlnaW5hbCBjb21waWxlciBhcmd1bWVudHMKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGZpbHRlckp2bUNvbXBpbGVyQXJncyhTdHJpbmdbXSBjb21waWxlckFyZ3MpIHsKKyAgICAgICAgaW50IGxlbiA9IGNvbXBpbGVyQXJncy5sZW5ndGg7CisgICAgICAgIExpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QobGVuKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGFyZyA9IGNvbXBpbGVyQXJnc1tpXTsKKyAgICAgICAgICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoIi1KIikpIHsKKyAgICAgICAgICAgICAgICBhcmdzLmFkZChhcmcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiRHJvcHBpbmcgIiArIGFyZyArICIgZnJvbSBjb21waWxlciBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSBhcmdzLnNpemUoKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgYXJncy50b0FycmF5KG5ldyBTdHJpbmdbY291bnRdKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvZ3MgdGhlIGNvbXBpbGF0aW9uIHBhcmFtZXRlcnMsIGFkZHMgdGhlIGZpbGVzIHRvIGNvbXBpbGUgYW5kIGxvZ3MgdGhlCisgICAgICogJnF1b3Q7bmljZVNvdXJjZUxpc3QmcXVvdDsKKyAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kbGluZSBhcmdzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIFZlY3RvciBjb21waWxlTGlzdCA9IGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZUxpc3QoKTsKKworICAgICAgICBhdHRyaWJ1dGVzLmxvZygiQ29tcGlsYXRpb24gIiArIGNtZC5kZXNjcmliZUFyZ3VtZW50cygpLAorICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgbmljZVNvdXJjZUxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWxlIik7CisgICAgICAgIGludCBjTGlzdFNpemUgPSBjb21waWxlTGlzdC5zaXplKCk7CisgICAgICAgIGlmIChjTGlzdFNpemUgIT0gMSkgeworICAgICAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCJzIik7CisgICAgICAgIH0KKyAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCIgdG8gYmUgY29tcGlsZWQ6Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjTGlzdFNpemU7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGFyZyA9IChTdHJpbmcpIGNvbXBpbGVMaXN0LmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZyk7CisgICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoIiAgICAiKTsKKyAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChhcmcpOworICAgICAgICB9CisKKyAgICAgICAgYXR0cmlidXRlcy5sb2cobmljZVNvdXJjZUxpc3QudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwcGVyIHRoYXQgbWF5IHJldHVybiB1cCB0byB0d28gZmlsZSBuYW1lcy4KKyAgICAgKgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5mb3IgSlJNUCBpdCB3aWxsIHJldHVybiAqX2dldFN0dWJDbGFzc1N1ZmZpeCAoYW5kCisgICAgICogICAqX2dldFNrZWxDbGFzc1N1ZmZpeCBpZiBKREsgMS4xIGlzIHVzZWQpPC9saT4KKyAgICAgKgorICAgICAqICAgPGxpPmZvciBJREwgaXQgd2lsbCByZXR1cm4gYSByYW5kb20gbmFtZSwgY2F1c2luZyA8cm1pYz4gdG8KKyAgICAgKiAgICAgYWx3YXlzIHJlY29tcGlsZS48L2xpPgorICAgICAqCisgICAgICogICA8bGk+Zm9yIElJT1AgaXQgd2lsbCByZXR1cm4gXypfZ2V0U3R1YkNsYXNzU3VmZml4IGZvcgorICAgICAqICAgaW50ZXJmYWNlcyBhbmQgXypfZ2V0U3R1YkNsYXNzU3VmZml4IGZvciBub24taW50ZXJmYWNlcyAoYW5kCisgICAgICogICBkZXRlcm1pbmUgdGhlIGludGVyZmFjZSBhbmQgY3JlYXRlIF8qX1N0dWIgZnJvbSB0aGF0KS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBSbWljRmlsZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBGaWxlTmFtZU1hcHBlciB7CisKKyAgICAgICAgUm1pY0ZpbGVOYW1lTWFwcGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVtcHR5IGltcGxlbWVudGF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgcykgeworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyBzKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCAhbmFtZS5lbmRzV2l0aCgiLmNsYXNzIikKKyAgICAgICAgICAgICAgICB8fCBuYW1lLmVuZHNXaXRoKGdldFN0dWJDbGFzc1N1ZmZpeCgpICsgIi5jbGFzcyIpCisgICAgICAgICAgICAgICAgfHwgbmFtZS5lbmRzV2l0aChnZXRTa2VsQ2xhc3NTdWZmaXgoKSArICIuY2xhc3MiKQorICAgICAgICAgICAgICAgIHx8IG5hbWUuZW5kc1dpdGgoZ2V0VGllQ2xhc3NTdWZmaXgoKSArICIuY2xhc3MiKSkgeworICAgICAgICAgICAgICAgIC8vIE5vdCBhIC5jbGFzcyBmaWxlIG9yIHRoZSBvbmUgd2UnZCBnZW5lcmF0ZQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3ZSBrbm93IHRoYXQgbmFtZS5lbmRzV2l0aCgiLmNsYXNzIikKKyAgICAgICAgICAgIFN0cmluZyBiYXNlID0gU3RyaW5nVXRpbHMucmVtb3ZlU3VmZml4KG5hbWUsICIuY2xhc3MiKTsKKworICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGJhc2UucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRWZXJpZnkoKQorICAgICAgICAgICAgICAgICYmICFhdHRyaWJ1dGVzLmlzVmFsaWRSbWlSZW1vdGUoY2xhc3NuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogZmFsbGJhY2sgaW4gY2FzZSB3ZSBoYXZlIHRyb3VibGUgbG9hZGluZyB0aGUgY2xhc3Mgb3IKKyAgICAgICAgICAgICAqIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSBpdCAodGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8KKyAgICAgICAgICAgICAqIGtub3cgd2hhdCBJREwgbW9kZSB3b3VsZCBnZW5lcmF0ZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIGlzIHN1cHBvc2VkIHRvIG1ha2UgQW50IGFsd2F5cyByZWNvbXBpbGUgdGhlCisgICAgICAgICAgICAgKiBjbGFzcywgYXMgYSBmaWxlIG9mIHRoYXQgbmFtZSBzaG91bGQgbm90IGV4aXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTdHJpbmdbXSB0YXJnZXQgPSBuZXcgU3RyaW5nW10ge25hbWUgKyAiLnRtcC4iICsgUkFORC5uZXh0TG9uZygpfTsKKworICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLmdldElpb3AoKSAmJiAhYXR0cmlidXRlcy5nZXRJZGwoKSkgeworICAgICAgICAgICAgICAgIC8vIEpSTVAgd2l0aCBzaW1wbGUgbmFtaW5nIGNvbnZlbnRpb24KKyAgICAgICAgICAgICAgICBpZiAoU1RVQl9PUFRJT05fMV8yLmVxdWFscyhhdHRyaWJ1dGVzLmdldFN0dWJWZXJzaW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgZ2V0U3R1YkNsYXNzU3VmZml4KCkgKyAiLmNsYXNzIgorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgZ2V0U3R1YkNsYXNzU3VmZml4KCkgKyAiLmNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBnZXRTa2VsQ2xhc3NTdWZmaXgoKSArICIuY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF0dHJpYnV0ZXMuZ2V0SWRsKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gYmFzZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGRpcm5hbWUgPSAiIjsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEkga25vdywgdGhpcyBpcyBub3QgbmVjZXNzYXJ5LCBidXQgSSBwcmVmZXIgaXQgZXhwbGljaXQgKFNCKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC0xOworICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gcGFja2FnZQorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBsYXN0U2xhc2ggKyAxOworICAgICAgICAgICAgICAgICAgICBkaXJuYW1lID0gYmFzZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGJhc2Uuc3Vic3RyaW5nKGluZGV4KTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIGMgPSBhdHRyaWJ1dGVzLmdldExvYWRlcigpLmxvYWRDbGFzcyhjbGFzc25hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgc3R1Yiwgbm8gdGllCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcm5hbWUgKyAiXyIgKyBmaWxlbmFtZSArIGdldFN0dWJDbGFzc1N1ZmZpeCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmNsYXNzIgorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHViIGlzIGRlcml2ZWQgZnJvbSBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRpZSBmcm9tIGludGVyZmFjZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBpbnRlcmYgPSBhdHRyaWJ1dGVzLmdldFJlbW90ZUludGVyZmFjZShjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpTmFtZSA9IGludGVyZi5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaURpciA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlJbmRleCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3REb3QgPSBpTmFtZS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3REb3QgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBwYWNrYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUluZGV4ID0gbGFzdERvdCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURpciA9IGlOYW1lLnN1YnN0cmluZygwLCBpSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEaXIgPSBpRGlyLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcm5hbWUgKyAiXyIgKyBmaWxlbmFtZSArIGdldFRpZUNsYXNzU3VmZml4KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEaXIgKyAiXyIgKyBpTmFtZS5zdWJzdHJpbmcoaUluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0U3R1YkNsYXNzU3VmZml4KCkgKyAiLmNsYXNzIgorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVW5hYmxlIHRvIHZlcmlmeSBjbGFzcyAiICsgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi4gSXQgY291bGQgbm90IGJlIGZvdW5kLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIlVuYWJsZSB0byB2ZXJpZnkgY2xhc3MgIiArIGNsYXNzbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuIEl0IGlzIG5vdCBkZWZpbmVkLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVbmFibGUgdG8gdmVyaWZ5IGNsYXNzICIgKyBjbGFzc25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBMb2FkaW5nIGNhdXNlZCBFeGNlcHRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0LmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvRm9ya2luZ1N1blJtaWMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvRm9ya2luZ1N1blJtaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE4N2QxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9Gb3JraW5nU3VuUm1pYy5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJtaWM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2dTdHJlYW1IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgc3VuIHJtaWMgY29tcGlsZXIsIHdoaWNoIGZvcmtzIHJhdGhlciB0aGFuCisgKiBleGVjdXRlcyBpdCBpbmxpbmUuIFdoeSBzbz8gQmVjYXVzZSBybWljIGlzIGRvZyBzbG93LCBidXQgaWYgeW91IGZvcmsgdGhlCisgKiBjb21waWxlciB5b3UgY2FuIGhhdmUgbXVsdGlwbGUgY29waWVzIGNvbXBpbGluZyBkaWZmZXJlbnQgYml0cyBvZiB5b3VyIHByb2plY3QKKyAqIGF0IHRoZSBzYW1lIHRpbWUuIFdoaWNoLCBvbiBhIG11bHRpLWNwdSBzeXN0ZW0gcmVzdWx0cyBpbiBzaWduaWZpY2FudCBzcGVlZHVwcy4KKyAqCisgKiBBbHNvLCBKYXZhMS42IGJlaGF2ZXMgb2RkbHkgd2l0aCAtWE5ldywgc28gd2Ugc3dpdGNoIGl0IG9uIGhlcmUgaWYgbmVlZGVkLgorICogQHNpbmNlIGFudDEuNworICovCitwdWJsaWMgY2xhc3MgRm9ya2luZ1N1blJtaWMgZXh0ZW5kcyBEZWZhdWx0Um1pY0FkYXB0ZXIgeworCisgICAgLyoqCisgICAgICogdGhlIG5hbWUgb2YgdGhpcyBhZGFwdGVyIGZvciB1c2VycyB0byBzZWxlY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9OQU1FID0gImZvcmtpbmciOworCisgICAgLyoqCisgICAgICogZXhlYyBieSBjcmVhdGluZyBhIG5ldyBjb21tYW5kCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21tYW5kIHJhbiBzdWNjZXNzZnVsbHkKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFJtaWMgb3duZXIgPSBnZXRSbWljKCk7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwUm1pY0NvbW1hbmQoKTsKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gb3duZXIuZ2V0UHJvamVjdCgpOworICAgICAgICAvL3JlbHkgb24gUk1JQyBiZWluZyBvbiB0aGUgcGF0aAorICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZShKYXZhRW52VXRpbHMuZ2V0SmRrRXhlY3V0YWJsZShnZXRFeGVjdXRhYmxlTmFtZSgpKSk7CisKKyAgICAgICAgLy9zZXQgdXAgdGhlIGFyZ3MKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IGNtZC5nZXRDb21tYW5kbGluZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKG5ldyBMb2dTdHJlYW1IYW5kbGVyKG93bmVyLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19JTkZPLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKSk7CisgICAgICAgICAgICBleGUuc2V0QW50UnVuKHByb2plY3QpOworICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkocHJvamVjdC5nZXRCYXNlRGlyKCkpOworICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGFyZ3MpOworICAgICAgICAgICAgZXhlLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIHJldHVybiAhZXhlLmlzRmFpbHVyZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgcnVubmluZyAiICsgZ2V0RXhlY3V0YWJsZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgLW1heWJlIGl0IGlzIG5vdCBvbiB0aGUgcGF0aCIsIGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBleGVjdXRhYmxlIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIFN1blJtaWMuUk1JQ19FWEVDVVRBQkxFOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvS2FmZmVSbWljLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL0thZmZlUm1pYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDhhNjgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL0thZmZlUm1pYy5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucm1pYzsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZUphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBybWljIGZvciBLYWZmZQorICoKKyAqIEBzaW5jZSBBbnQgMS40CisgKi8KK3B1YmxpYyBjbGFzcyBLYWZmZVJtaWMgZXh0ZW5kcyBEZWZhdWx0Um1pY0FkYXB0ZXIgeworICAgIC8vIHNvcnRlZCBieSBuZXdlc3QgS2FmZmUgdmVyc2lvbiBmaXJzdAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJNSUNfQ0xBU1NOQU1FUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICJnbnUuY2xhc3NwYXRoLnRvb2xzLnJtaS5ybWljLlJNSUMiLAorICAgICAgICAvLyBwcmUgS2FmZmUgMS4xLjUKKyAgICAgICAgImdudS5qYXZhLnJtaS5ybWljLlJNSUMiLAorICAgICAgICAvLyBwcmUgS2FmZmUgMS4xLjIKKyAgICAgICAgImthZmZlLnJtaS5ybWljLlJNSUMiLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGlzIGFkYXB0ZXIgZm9yIHVzZXJzIHRvIHNlbGVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX05BTUUgPSAia2FmZmUiOworCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Um1pYygpLmxvZygiVXNpbmcgS2FmZmUgcm1pYyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBzZXR1cFJtaWNDb21tYW5kKCk7CisKKyAgICAgICAgQ2xhc3MgYyA9IGdldFJtaWNDbGFzcygpOworICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiQ2Fubm90IHVzZSBLYWZmZSBybWljLCBhcyBpdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYXZhaWxhYmxlLiAgTm9uZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvZiAiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUk1JQ19DTEFTU05BTUVTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoUk1JQ19DTEFTU05BTUVTW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBoYXZlIGJlZW4gZm91bmQuIEEgY29tbW9uIHNvbHV0aW9uIGlzIHRvIHNldCB0aGUiCisgICAgICAgICAgICAgICAgICAgICAgICsgIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBKQVZBX0hPTUUgb3IgQ0xBU1NQQVRILiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGJ1Zi50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJtaWMoKS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNtZC5zZXRFeGVjdXRhYmxlKGMuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKCFjLmdldE5hbWUoKS5lcXVhbHMoUk1JQ19DTEFTU05BTUVTW1JNSUNfQ0xBU1NOQU1FUy5sZW5ndGggLSAxXSkpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEthZmZlIDEuMS4yCisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXZlcmJvc2UiKTsKKyAgICAgICAgICAgIGdldFJtaWMoKS5sb2coQ29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKGNtZCkpOworICAgICAgICB9CisgICAgICAgIEV4ZWN1dGVKYXZhIGVqID0gbmV3IEV4ZWN1dGVKYXZhKCk7CisgICAgICAgIGVqLnNldEphdmFDb21tYW5kKGNtZCk7CisgICAgICAgIHJldHVybiBlai5mb3JrKGdldFJtaWMoKSkgPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IGZvciBrYWZmZSBiZWluZyBvbiB0aGUgc3lzdGVtCisgICAgICogQHJldHVybiB0cnVlIGlmIGthZmZlIGlzIG9uIHRoZSBjdXJyZW50IGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFJtaWNDbGFzcygpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogdHJpZXMgdG8gbG9hZCBLYWZmZSBSTUlDIGFuZCBmYWxscyBiYWNrIHRvIHRoZSBvbGRlciBjbGFzcyBuYW1lCisgICAgICogaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHJldHVybiBudWxsIGlmIG5laXRoZXIgY2xhc3MgY2FuIGdldCBsb2FkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0Um1pY0NsYXNzKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJNSUNfQ0xBU1NOQU1FUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShSTUlDX0NMQVNTTkFNRVNbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9SbWljQWRhcHRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9SbWljQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTNkNGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1JtaWNBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SbWljOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKKworLyoqCisgKiBUaGUgaW50ZXJmYWNlIHRoYXQgYWxsIHJtaWMgYWRhcHRlcnMgbXVzdCBhZGhlcmUgdG8uCisgKgorICogPHA+QSBybWljIGFkYXB0ZXIgaXMgYW4gYWRhcHRlciB0aGF0IGludGVycHJldHMgdGhlIHJtaWMncworICogcGFyYW1ldGVycyBpbiBwcmVwZXJhdGlvbiB0byBiZSBwYXNzZWQgb2ZmIHRvIHRoZSBjb21waWxlciB0aGlzCisgKiBhZGFwdGVyIHJlcHJlc2VudHMuICBBcyBhbGwgdGhlIG5lY2Vzc2FyeSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUKKyAqIFJtaWMgdGFzayBpdHNlbGYsIHRoZSBvbmx5IHRoaW5nIGFsbCBhZGFwdGVycyBuZWVkIGlzIHRoZSBybWljCisgKiB0YXNrLCB0aGUgZXhlY3V0ZSBjb21tYW5kIGFuZCBhIHBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3IgKGZvcgorICogcmVmbGVjdGlvbikuPC9wPgorICoKKyAqIEBzaW5jZSBBbnQgMS40CisgKi8KKworcHVibGljIGludGVyZmFjZSBSbWljQWRhcHRlciB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBybWljIGF0dHJpYnV0ZXMsIHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIFJtaWMgdGFzay4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgcm1pYyBhdHRyaWJ1dGVzIHRvIHVzZQorICAgICAqLworICAgIHZvaWQgc2V0Um1pYyhSbWljIGF0dHJpYnV0ZXMpOworCisgICAgLyoqCisgICAgICogQ2FsbCB0aGUgcm1pYyBjb21waWxlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgdGhlIGNvbXBpbGF0aW9uIGJlZW4gc3VjY2Vzc2Z1bAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHNvdXJjZSBjbGFzcyBmaWxlcyB0byB0aGUgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoaXMgcm1pYworICAgICAqIGltcGxlbWVudGF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGZpbGVuYW1lIG1hcHBlciB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKi8KKyAgICBGaWxlTmFtZU1hcHBlciBnZXRNYXBwZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBDTEFTU1BBVEggdGhpcyBybWljIHByb2Nlc3Mgd2lsbCB1c2UuCisgICAgICogQHJldHVybiB0aGUgY2xhc3NwYWh0IHRoaXMgcm1pYyBwcm9jZXNzIHdpbGwgdXNlCisgICAgICovCisgICAgUGF0aCBnZXRDbGFzc3BhdGgoKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvUm1pY0FkYXB0ZXJGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1JtaWNBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjEzMDkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1JtaWNBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucm1pYzsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5DbGFzc3BhdGhVdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKworLyoqCisgKiBDcmVhdGVzIHRoZSBuZWNlc3Nhcnkgcm1pYyBhZGFwdGVyLCBnaXZlbiBiYXNpYyBjcml0ZXJpYS4KKyAqCisgKiBAc2luY2UgMS40CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSbWljQWRhcHRlckZhY3RvcnkgeworICAgIC8qKiBUaGUgZXJyb3IgbWVzc2FnZSB0byBiZSB1c2VkIHdoZW4gdGhlIGNvbXBpbGVyIGNhbm5vdCBiZSBmb3VuZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9VTktOT1dOX0NPTVBJTEVSID0gIkNsYXNzIG5vdCBmb3VuZDogIjsKKworICAgIC8qKiBUaGUgZXJyb3IgbWVzc2FnZSB0byBiZSB1c2VkIHdoZW4gdGhlIGNsYXNzIGlzIG5vdCBhbiBybWljIGFkYXB0ZXIuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9UX1JNSUNfQURBUFRFUiA9ICJDbGFzcyBvZiB1bmV4cGVjdGVkIFR5cGU6ICI7CisKKyAgICAvKiogSWYgdGhlIGNvbXBpbGVyIGhhcyB0aGlzIG5hbWUgdXNlIGEgZGVmYXVsdCBjb21waWxlci4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTVBJTEVSID0gImRlZmF1bHQiOworCisgICAgLyoqIFRoaXMgaXMgYSBzaW5nbGV0b24gLS0gY2FuJ3QgY3JlYXRlIGluc3RhbmNlcyEhICovCisgICAgcHJpdmF0ZSBSbWljQWRhcHRlckZhY3RvcnkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzZWQgb24gdGhlIHBhcmFtZXRlciBwYXNzZWQgaW4sIHRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIG5lY2Vzc2FyeQorICAgICAqIGZhY3RvcnkgZGVzaXJlZC4KKyAgICAgKgorICAgICAqIDxwPlRoZSBjdXJyZW50IG1hcHBpbmcgZm9yIHJtaWMgbmFtZXMgYXJlIGFzIGZvbGxvd3M6PC9wPgorICAgICAqIDx1bD48bGk+c3VuID0gU1VOJ3Mgcm1pYworICAgICAqIDxsaT5rYWZmZSA9IEthZmZlJ3Mgcm1pYworICAgICAqIDxsaT48aT5hIGZ1bGx5IHF1YWxsaWZpZWQgY2xhc3NuYW1lPC9pPiA9IHRoZSBuYW1lIG9mIGEgcm1pYworICAgICAqIGFkYXB0ZXIKKyAgICAgKiA8bGk+d2VibG9naWMgPSB3ZWJsb2dpYyBjb21waWxlcgorICAgICAqIDxsaT5mb3JraW5nID0gU3VuJ3MgUk1JQyBieSBmb3JraW5nIGEgbmV3IEpWTQorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcm1pY1R5cGUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHJtaWMsIG9yIHRoZQorICAgICAqIGZ1bGwgY2xhc3NuYW1lIG9mIHRoZSBybWljJ3MgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gdGFzayBhIHRhc2sgdG8gbG9nIHRocm91Z2guCisgICAgICogQHJldHVybiB0aGUgY29tcGlsZXIgYWRhcHRlcgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHJtaWMgdHlwZSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgaW50bworICAgICAqIGEgcm1pYyBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUm1pY0FkYXB0ZXIgZ2V0Um1pYyhTdHJpbmcgcm1pY1R5cGUsIFRhc2sgdGFzaykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy9jb252ZXJ0IHRvIGxvd2VyIGNhc2UgaW4gdGhlIEVuZ2xpc2ggbG9jYWxlLAorICAgICAgICBTdHJpbmcgY29tcGlsZXIgPSBybWljVHlwZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CisKKyAgICAgICAgLy9oYW5kbGUgZGVmYXVsdCBzcGVjaWFsbHkgYnkgY2hvb3NpbmcgdGhlIHN1biBvciBrYWZmZSBjb21waWxlcgorICAgICAgICBpZiAoREVGQVVMVF9DT01QSUxFUi5lcXVhbHMoY29tcGlsZXIpIHx8IGNvbXBpbGVyLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGNvbXBpbGVyID0gS2FmZmVSbWljLmlzQXZhaWxhYmxlKCkKKyAgICAgICAgICAgICAgICA/IEthZmZlUm1pYy5DT01QSUxFUl9OQU1FCisgICAgICAgICAgICAgICAgOiBTdW5SbWljLkNPTVBJTEVSX05BTUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFN1blJtaWMuQ09NUElMRVJfTkFNRS5lcXVhbHMoY29tcGlsZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1blJtaWMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChLYWZmZVJtaWMuQ09NUElMRVJfTkFNRS5lcXVhbHMoY29tcGlsZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEthZmZlUm1pYygpOworICAgICAgICB9IGVsc2UgaWYgKFdMUm1pYy5DT01QSUxFUl9OQU1FLmVxdWFscyhjb21waWxlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV0xSbWljKCk7CisgICAgICAgIH0gZWxzZSBpZiAoRm9ya2luZ1N1blJtaWMuQ09NUElMRVJfTkFNRS5lcXVhbHMoY29tcGlsZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZvcmtpbmdTdW5SbWljKCk7CisgICAgICAgIH0gZWxzZSBpZiAoWE5ld1JtaWMuQ09NUElMRVJfTkFNRS5lcXVhbHMoY29tcGlsZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhOZXdSbWljKCk7CisgICAgICAgIH0KKyAgICAgICAgLy9ubyBtYXRjaD8gYXNrIGZvciB0aGUgbm9uLWxvd2VyLWNhc2VkIHR5cGUKKyAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzc05hbWUocm1pY1R5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIHJlc29sdmUgdGhlIGdpdmVuIGNsYXNzbmFtZSBpbnRvIGEgcm1pYyBhZGFwdGVyLgorICAgICAqIFRocm93cyBhIGZpdCBpZiBpdCBjYW4ndC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgdG8gYmUgY3JlYXRlZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIFRoaXMgaXMgdGhlIGZpdCB0aGF0IGlzIHRocm93biBpZiBjbGFzc05hbWUKKyAgICAgKiBpc24ndCBhbiBpbnN0YW5jZSBvZiBSbWljQWRhcHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBSbWljQWRhcHRlciByZXNvbHZlQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKFJtaWNBZGFwdGVyKSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZShjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgUm1pY0FkYXB0ZXJGYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCksIFJtaWNBZGFwdGVyLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1N1blJtaWMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvU3VuUm1pYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Mzk0MzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1N1blJtaWMuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKKworLyoqCisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJtaWMgZm9yIFNVTidzIEpESy4KKyAqCisgKiBAc2luY2UgQW50IDEuNAorICovCitwdWJsaWMgY2xhc3MgU3VuUm1pYyBleHRlbmRzIERlZmF1bHRSbWljQWRhcHRlciB7CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJNSUNfQ0xBU1NOQU1FID0gInN1bi5ybWkucm1pYy5NYWluIjsKKworICAgIC8qKgorICAgICAqIHRoZSBuYW1lIG9mIHRoaXMgYWRhcHRlciBmb3IgdXNlcnMgdG8gc2VsZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfTkFNRSA9ICJzdW4iOworCisgICAgLyoqCisgICAgICogbmFtZSBvZiB0aGUgZXhlY3V0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJNSUNfRVhFQ1VUQUJMRSA9ICJybWljIjsKKyAgICAvKiogRXJyb3IgbWVzc2FnZSB0byB1c2Ugd2l0aCB0aGUgc3VuIHJtaWMgaXMgbm90IHRoZSBjbGFzc3BhdGguICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fUk1JQ19PTl9DTEFTU1BBVEggPSAiQ2Fubm90IHVzZSBTVU4gcm1pYywgYXMgaXQgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXZhaWxhYmxlLiAgQSBjb21tb24gc29sdXRpb24gaXMgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSkFWQV9IT01FIjsKKyAgICAvKiogRXJyb3IgbWVzc2FnZSB0byB1c2Ugd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBzdGFydGluZyB0aGUgc3VuIHJtaWMgY29tcGlsZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9STUlDX0ZBSUxFRCA9ICJFcnJvciBzdGFydGluZyBTVU4gcm1pYzogIjsKKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgcm1pYyBjb21waWxlci4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGF0aW9uIHN1Y2NlZWRlZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Um1pYygpLmxvZygiVXNpbmcgU1VOIHJtaWMgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gc2V0dXBSbWljQ29tbWFuZCgpOworCisgICAgICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcm1pYywgcmVkaXJlY3Rpbmcgb3V0cHV0IHRvCisgICAgICAgIC8vIHRoZSBwcm9qZWN0IGxvZworICAgICAgICBMb2dPdXRwdXRTdHJlYW0gbG9nc3RyID0gbmV3IExvZ091dHB1dFN0cmVhbShnZXRSbWljKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShSTUlDX0NMQVNTTkFNRSk7CisgICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zCisgICAgICAgICAgICAgICAgPSBjLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdICB7T3V0cHV0U3RyZWFtLmNsYXNzLCBTdHJpbmcuY2xhc3N9KTsKKyAgICAgICAgICAgIE9iamVjdCBybWljID0gY29ucy5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge2xvZ3N0ciwgInJtaWMifSk7CisKKyAgICAgICAgICAgIE1ldGhvZCBkb1JtaWMgPSBjLmdldE1ldGhvZCgiY29tcGlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzIFtdIHtTdHJpbmdbXS5jbGFzc30pOworICAgICAgICAgICAgQm9vbGVhbiBvayA9CisgICAgICAgICAgICAgICAgKEJvb2xlYW4pIGRvUm1pYy5pbnZva2Uocm1pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgT2JqZWN0W10ge2NtZC5nZXRBcmd1bWVudHMoKX0pKTsKKyAgICAgICAgICAgIHJldHVybiBvay5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX1JNSUNfT05fQ0xBU1NQQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJtaWMoKS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgZXg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9STUlDX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgsIGdldFJtaWMoKS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9nc3RyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdHJpcCBvdXQgYWxsIC1KIGFyZ3MgZnJvbSB0aGUgY29tbWFuZCBsaXN0LgorICAgICAqIEBwYXJhbSBjb21waWxlckFyZ3MgdGhlIG9yaWdpbmFsIGNvbXBpbGVyIGFyZ3VtZW50cworICAgICAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcHJlcHJvY2Vzc0NvbXBpbGVyQXJncyhTdHJpbmdbXSBjb21waWxlckFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlckp2bUNvbXBpbGVyQXJncyhjb21waWxlckFyZ3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvV0xSbWljLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1dMUm1pYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxM2RlNTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1dMUm1pYy5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucm1pYzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CisKKy8qKgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBybWljIGZvciBXZWJMb2dpYworICoKKyAqIEBzaW5jZSBBbnQgMS40CisgKi8KK3B1YmxpYyBjbGFzcyBXTFJtaWMgZXh0ZW5kcyBEZWZhdWx0Um1pY0FkYXB0ZXIgeworICAgIC8qKiBUaGUgY2xhc3NuYW1lIG9mIHRoZSB3ZWJsb2dpYyBybWljICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0xSTUlDX0NMQVNTTkFNRSA9ICJ3ZWJsb2dpYy5ybWljIjsKKyAgICAvKioKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGlzIGFkYXB0ZXIgZm9yIHVzZXJzIHRvIHNlbGVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX05BTUUgPSAid2VibG9naWMiOworCisgICAgLyoqIFRoZSBlcnJvciBzdHJpbmcgdG8gdXNlIGlmIG5vdCBhYmxlIHRvIGZpbmQgdGhlIHdlYmxvZ2ljIHJtaWMgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19XTFJNSUNfT05fQ0xBU1NQQVRIID0KKyAgICAgICAgIkNhbm5vdCB1c2UgV2ViTG9naWMgcm1pYywgYXMgaXQgaXMgbm90ICIKKyAgICAgICAgKyAiYXZhaWxhYmxlLiBBZGQgaXQgdG8gQW50J3MgY2xhc3NwYXRoIHdpdGggdGhlIC1saWIgb3B0aW9uIjsKKworICAgIC8qKiBUaGUgZXJyb3Igc3RyaW5nIHRvIHVzZSBpZiBub3QgYWJsZSB0byBzdGFydCB0aGUgd2VibG9naWMgcm1pYyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1dMUk1JQ19GQUlMRUQgPSAiRXJyb3Igc3RhcnRpbmcgV2ViTG9naWMgcm1pYzogIjsKKyAgICAvKiogVGhlIHN0dWIgc3VmZml4ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0xfUk1JX1NUVUJfU1VGRklYID0gIl9XTFN0dWIiOworICAgIC8qKiBUaGUgc2tlbGV0b24gc3VmZml4ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0xfUk1JX1NLRUxfU1VGRklYID0gIl9XTFNrZWwiOworICAgIC8qKiB1cHN1cHBvcnRlZCBlcnJvciBtZXNzYWdlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TVVBQT1JURURfU1RVQl9PUFRJT04gPSAiVW5zdXBwb3J0ZWQgc3R1YiBvcHRpb246ICI7CisKKyAgICAvKioKKyAgICAgKiBDYXJyeSBvdXQgdGhlIHJtaWMgY29tcGlsYXRpb24uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21waWxhdGlvbiBzdWNjZWVkZWQKKyAgICAgKiBAdGhyb3dzICBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBnZXRSbWljKCkubG9nKCJVc2luZyBXZWJMb2dpYyBybWljIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwUm1pY0NvbW1hbmQobmV3IFN0cmluZ1tdIHsiLW5vZXhpdCJ9KTsKKworICAgICAgICBBbnRDbGFzc0xvYWRlciBsb2FkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBybWljCisgICAgICAgICAgICBDbGFzcyBjID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChnZXRSbWljKCkuZ2V0Q2xhc3NwYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMgPSBDbGFzcy5mb3JOYW1lKFdMUk1JQ19DTEFTU05BTUUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgPSBnZXRSbWljKCkuZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGdldFJtaWMoKS5nZXRDbGFzc3BhdGgoKSk7CisgICAgICAgICAgICAgICAgYyA9IENsYXNzLmZvck5hbWUoV0xSTUlDX0NMQVNTTkFNRSwgdHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1ldGhvZCBkb1JtaWMgPSBjLmdldE1ldGhvZCgibWFpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzIFtdIHtTdHJpbmdbXS5jbGFzc30pOworICAgICAgICAgICAgZG9SbWljLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge2NtZC5nZXRBcmd1bWVudHMoKX0pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19XTFJNSUNfT05fQ0xBU1NQQVRILCBnZXRSbWljKCkuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoQnVpbGRFeGNlcHRpb24pIGV4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfV0xSTUlDX0ZBSUxFRCwgZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJtaWMoKS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvYWRlci5jbGVhbnVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN1ZmZpeCBmb3IgdGhlIHJtaWMgc3R1YiBjbGFzc2VzCisgICAgICogQHJldHVybiB0aGUgc3R1YiBzdWZmaXgKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0dWJDbGFzc1N1ZmZpeCgpIHsKKyAgICAgICAgcmV0dXJuIFdMX1JNSV9TVFVCX1NVRkZJWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN1ZmZpeCBmb3IgdGhlIHJtaWMgc2tlbGV0b24gY2xhc3NlcworICAgICAqIEByZXR1cm4gdGhlIHNrZWxldG9uIHN1ZmZpeAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2tlbENsYXNzU3VmZml4KCkgeworICAgICAgICByZXR1cm4gV0xfUk1JX1NLRUxfU1VGRklYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmlwIG91dCBhbGwgLUogYXJncyBmcm9tIHRoZSBjb21tYW5kIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGlsZXJBcmdzIHRoZSBvcmlnaW5hbCBjb21waWxlciBhcmd1bWVudHMKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIHByZXByb2Nlc3NDb21waWxlckFyZ3MoU3RyaW5nW10gY29tcGlsZXJBcmdzKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXJKdm1Db21waWxlckFyZ3MoY29tcGlsZXJBcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGFuIG92ZXJyaWRlIHBvaW50OyBubyBzdHViIHZlcnNpb24gaXMgcmV0dXJuZWQuIElmIGFueQorICAgICAqIHN0dWIgb3B0aW9uIGlzIHNldCwgYSB3YXJuaW5nIGlzIHByaW50ZWQuCisgICAgICogQHJldHVybiBudWxsLCBmb3Igbm8gc3R1YiB2ZXJzaW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhZGRTdHViVmVyc2lvbk9wdGlvbnMoKSB7CisgICAgICAgIC8vaGFuZGxlIHRoZSBtYW55IGRpZmZlcmVudCBzdHViIG9wdGlvbnMuCisgICAgICAgIFN0cmluZyBzdHViVmVyc2lvbiA9IGdldFJtaWMoKS5nZXRTdHViVmVyc2lvbigpOworICAgICAgICBpZiAobnVsbCAhPSBzdHViVmVyc2lvbikgeworICAgICAgICAgICAgZ2V0Um1pYygpLmxvZyhVTlNVUFBPUlRFRF9TVFVCX09QVElPTiArIHN0dWJWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvWE5ld1JtaWMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvWE5ld1JtaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWI5YWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9YTmV3Um1pYy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucm1pYzsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisvKioKKyAqIFJ1biBybWljIGluIGEgbmV3IHByb2Nlc3Mgd2l0aCAtWG5ldyBzZXQuCisgKiBUaGlzIHN3aXRjaGVzIHJtaWMgdG8gdXNlIGEgbmV3IGNvbXBpbGVyLCBvbmUgdGhhdCBkb2VzbnQgd29yayBpbi1wcm9jZXNzCisgKiBvbiBhbnQgb24gamF2YTEuNi4KKyAqIHNlZTogPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zODczMiI+CisgKiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM4NzMyPC9hPgorICovCitwdWJsaWMgY2xhc3MgWE5ld1JtaWMgZXh0ZW5kcyBGb3JraW5nU3VuUm1pYyB7CisKKyAgICAvKioKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGlzIGFkYXB0ZXIgZm9yIHVzZXJzIHRvIHNlbGVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVSX05BTUUgPSAieG5ldyI7CisKKyAgICAvKiogTm8tYXJnIGNvbnN0cnVjdG9yLiAqLworICAgIHB1YmxpYyBYTmV3Um1pYygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBub3JtYWwgY29tbWFuZCBsaW5lLCB0aGVuIHdpdGggLVhuZXcgYXQgdGhlIGZyb250CisgICAgICogQHJldHVybiBhIGNvbW1hbmQgbGluZSB0aGF0IGhhbmRzIG9mZiB0byB0aHcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgc2V0dXBSbWljQ29tbWFuZCgpIHsKKyAgICAgICAgU3RyaW5nW10gb3B0aW9ucyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgIi1YbmV3IgorICAgICAgICB9OworICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kbGluZSA9IHN1cGVyLnNldHVwUm1pY0NvbW1hbmQob3B0aW9ucyk7CisgICAgICAgIHJldHVybiBjb21tYW5kbGluZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fic3RyYWN0RmlsZVNldC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQWJzdHJhY3RGaWxlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwMDU0NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fic3RyYWN0RmlsZVNldC5qYXZhCkBAIC0wLDAgKzEsODI4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5GaWxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5PclNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5BbmRTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuTm90U2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRhdGVTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5Ob25lU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNpemVTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuVHlwZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EZXB0aFNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EZXBlbmRTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRXh0ZW5kU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNlbGVjdFNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5QcmVzZW50U2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNlbGVjdG9yU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQ29udGFpbnNTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZW5hbWVTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuTWFqb3JpdHlTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGlmZmVyZW50U2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNlbGVjdG9yQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5Db250YWluc1JlZ2V4cFNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLk1vZGlmaWVkU2VsZWN0b3I7CisKKy8qKgorICogQ2xhc3MgdGhhdCBob2xkcyBhbiBpbXBsaWNpdCBwYXR0ZXJuc2V0IGFuZCBzdXBwb3J0cyBuZXN0ZWQKKyAqIHBhdHRlcm5zZXRzIGFuZCBjcmVhdGVzIGEgRGlyZWN0b3J5U2Nhbm5lciB1c2luZyB0aGVzZSBwYXR0ZXJucy4KKyAqCisgKiA8cD5Db21tb24gYmFzZSBjbGFzcyBmb3IgRGlyU2V0IGFuZCBGaWxlU2V0LjwvcD4KKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZpbGVTZXQgZXh0ZW5kcyBEYXRhVHlwZQorICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZWxlY3RvckNvbnRhaW5lciB7CisKKyAgICBwcml2YXRlIFBhdHRlcm5TZXQgZGVmYXVsdFBhdHRlcm5zID0gbmV3IFBhdHRlcm5TZXQoKTsKKyAgICBwcml2YXRlIFZlY3RvciBhZGRpdGlvbmFsUGF0dGVybnMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3Igc2VsZWN0b3JzID0gbmV3IFZlY3RvcigpOworCisgICAgcHJpdmF0ZSBGaWxlIGRpcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGZvbGxvd1N5bWxpbmtzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZXJyb3JPbk1pc3NpbmdEaXIgPSB0cnVlOworCisgICAgLyogY2FjaGVkIERpcmVjdG9yeVNjYW5uZXIgaW5zdGFuY2UgZm9yIG91ciBvd24gUHJvamVjdCBvbmx5ICovCisgICAgcHJpdmF0ZSBEaXJlY3RvcnlTY2FubmVyIGRpcmVjdG9yeVNjYW5uZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IDxjb2RlPkFic3RyYWN0RmlsZVNldDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0RmlsZVNldCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+QWJzdHJhY3RGaWxlU2V0PC9jb2RlPiwgc2hhbGxvd2x5IGNsb25lZAorICAgICAqIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5BYnN0cmFjdEZpbGVTZXQ8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWxlc2V0IHRoZSA8Y29kZT5BYnN0cmFjdEZpbGVTZXQ8L2NvZGU+IHRvIHVzZSBhcyBhIHRlbXBsYXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBBYnN0cmFjdEZpbGVTZXQoQWJzdHJhY3RGaWxlU2V0IGZpbGVzZXQpIHsKKyAgICAgICAgdGhpcy5kaXIgPSBmaWxlc2V0LmRpcjsKKyAgICAgICAgdGhpcy5kZWZhdWx0UGF0dGVybnMgPSBmaWxlc2V0LmRlZmF1bHRQYXR0ZXJuczsKKyAgICAgICAgdGhpcy5hZGRpdGlvbmFsUGF0dGVybnMgPSBmaWxlc2V0LmFkZGl0aW9uYWxQYXR0ZXJuczsKKyAgICAgICAgdGhpcy5zZWxlY3RvcnMgPSBmaWxlc2V0LnNlbGVjdG9yczsKKyAgICAgICAgdGhpcy51c2VEZWZhdWx0RXhjbHVkZXMgPSBmaWxlc2V0LnVzZURlZmF1bHRFeGNsdWRlczsKKyAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZlID0gZmlsZXNldC5jYXNlU2Vuc2l0aXZlOworICAgICAgICB0aGlzLmZvbGxvd1N5bWxpbmtzID0gZmlsZXNldC5mb2xsb3dTeW1saW5rczsKKyAgICAgICAgdGhpcy5lcnJvck9uTWlzc2luZ0RpciA9IGZpbGVzZXQuZXJyb3JPbk1pc3NpbmdEaXI7CisgICAgICAgIHNldFByb2plY3QoZmlsZXNldC5nZXRQcm9qZWN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFub3RoZXIgYXR0cmlidXRlIG9yIG5lc3QgZWxlbWVudHMgaW5zaWRlCisgICAgICogdGhpcyBlbGVtZW50IGlmIHlvdSBtYWtlIGl0IGEgcmVmZXJlbmNlLjwvcD4KKyAgICAgKiBAcGFyYW0gciB0aGUgPGNvZGU+UmVmZXJlbmNlPC9jb2RlPiB0byB1c2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZGlyICE9IG51bGwgfHwgZGVmYXVsdFBhdHRlcm5zLmhhc1BhdHRlcm5zKGdldFByb2plY3QoKSkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhZGRpdGlvbmFsUGF0dGVybnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGlmICghc2VsZWN0b3JzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBiYXNlLWRpcmVjdG9yeSBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkncyA8Y29kZT5GaWxlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldERpcihGaWxlIGRpcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5kaXIgPSBkaXI7CisgICAgICAgIGRpcmVjdG9yeVNjYW5uZXIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgYmFzZS1kaXJlY3RvcnkgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHJldHVybiA8Y29kZT5GaWxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXREaXIoKSB7CisgICAgICAgIHJldHVybiBnZXREaXIoZ2V0UHJvamVjdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGJhc2UtZGlyZWN0b3J5IGZvciB0aGlzIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBwIHRoZSA8Y29kZT5Qcm9qZWN0PC9jb2RlPiBhZ2FpbnN0IHdoaWNoIHRoZQorICAgICAqICAgICAgICAgIHJlZmVyZW5jZSBpcyByZXNvbHZlZCwgaWYgc2V0LgorICAgICAqIEByZXR1cm4gPGNvZGU+RmlsZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBGaWxlIGdldERpcihQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIChpc1JlZmVyZW5jZSgpKSA/IGdldFJlZihwKS5nZXREaXIocCkgOiBkaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5lc3RlZCBwYXR0ZXJuc2V0LgorICAgICAqIEByZXR1cm4gPGNvZGU+UGF0dGVyblNldDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQYXR0ZXJuU2V0IGNyZWF0ZVBhdHRlcm5TZXQoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIFBhdHRlcm5TZXQgcGF0dGVybnMgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBhZGRpdGlvbmFsUGF0dGVybnMuYWRkRWxlbWVudChwYXR0ZXJucyk7CisgICAgICAgIGRpcmVjdG9yeVNjYW5uZXIgPSBudWxsOworICAgICAgICByZXR1cm4gcGF0dGVybnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmFtZSBlbnRyeSB0byB0aGUgaW5jbHVkZSBsaXN0LgorICAgICAqIEByZXR1cm4gPGNvZGU+UGF0dGVyblNldC5OYW1lRW50cnk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgZGlyZWN0b3J5U2Nhbm5lciA9IG51bGw7CisgICAgICAgIHJldHVybiBkZWZhdWx0UGF0dGVybnMuY3JlYXRlSW5jbHVkZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5hbWUgZW50cnkgdG8gdGhlIGluY2x1ZGUgZmlsZXMgbGlzdC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPlBhdHRlcm5TZXQuTmFtZUVudHJ5PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFBhdHRlcm5TZXQuTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGVzRmlsZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgZGlyZWN0b3J5U2Nhbm5lciA9IG51bGw7CisgICAgICAgIHJldHVybiBkZWZhdWx0UGF0dGVybnMuY3JlYXRlSW5jbHVkZXNGaWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmFtZSBlbnRyeSB0byB0aGUgZXhjbHVkZSBsaXN0LgorICAgICAqIEByZXR1cm4gPGNvZGU+UGF0dGVyblNldC5OYW1lRW50cnk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlRXhjbHVkZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgZGlyZWN0b3J5U2Nhbm5lciA9IG51bGw7CisgICAgICAgIHJldHVybiBkZWZhdWx0UGF0dGVybnMuY3JlYXRlRXhjbHVkZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5hbWUgZW50cnkgdG8gdGhlIGV4Y2x1ZGVzIGZpbGVzIGxpc3QuCisgICAgICogQHJldHVybiA8Y29kZT5QYXR0ZXJuU2V0Lk5hbWVFbnRyeTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlc0ZpbGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGRpcmVjdG9yeVNjYW5uZXIgPSBudWxsOworICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUV4Y2x1ZGVzRmlsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzaW5nbGUgZmlsZSBmaWxlc2V0LgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBzaW5nbGUgPGNvZGU+RmlsZTwvY29kZT4gaW5jbHVkZWQgaW4gdGhpcworICAgICAqICAgICAgICAgICAgIDxjb2RlPkFic3RyYWN0RmlsZVNldDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHNldERpcihmaWxlLmdldFBhcmVudEZpbGUoKSk7CisgICAgICAgIGNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKGZpbGUuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiB0byB0aGUgY3VycmVudCBsaXN0IG9mIGluY2x1ZGUKKyAgICAgKiBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIDxwPlBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYSBvciBhIHNwYWNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlcyB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmcgaW5jbHVkZXMpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdFBhdHRlcm5zLnNldEluY2x1ZGVzKGluY2x1ZGVzKTsKKyAgICAgICAgZGlyZWN0b3J5U2Nhbm5lciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyA8Y29kZT5pbmNsdWRlczwvY29kZT4gdG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBpbmNsdWRlCisgICAgICogcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZXMgYXJyYXkgY29udGFpbmluZyB0aGUgaW5jbHVkZSBwYXR0ZXJucy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhcHBlbmRJbmNsdWRlcyhTdHJpbmdbXSBpbmNsdWRlcykgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jbHVkZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGRlZmF1bHRQYXR0ZXJucy5jcmVhdGVJbmNsdWRlKCkuc2V0TmFtZShpbmNsdWRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXJlY3RvcnlTY2FubmVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgPGNvZGU+ZXhjbHVkZXM8L2NvZGU+IHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgZXhjbHVkZQorICAgICAqIHBhdHRlcm5zLgorICAgICAqCisgICAgICogPHA+UGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hIG9yIGEgc3BhY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2x1ZGVzIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEV4Y2x1ZGVzKFN0cmluZyBleGNsdWRlcykgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0UGF0dGVybnMuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOworICAgICAgICBkaXJlY3RvcnlTY2FubmVyID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIDxjb2RlPmV4Y2x1ZGVzPC9jb2RlPiB0byB0aGUgY3VycmVudCBsaXN0IG9mIGluY2x1ZGUKKyAgICAgKiBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsdWRlcyBhcnJheSBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFwcGVuZEV4Y2x1ZGVzKFN0cmluZ1tdIGV4Y2x1ZGVzKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIGlmIChleGNsdWRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKGV4Y2x1ZGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpcmVjdG9yeVNjYW5uZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+RmlsZTwvY29kZT4gY29udGFpbmluZyB0aGUgaW5jbHVkZXMgcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbCA8Y29kZT5GaWxlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEluY2x1ZGVzZmlsZShGaWxlIGluY2wpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHRQYXR0ZXJucy5zZXRJbmNsdWRlc2ZpbGUoaW5jbCk7CisgICAgICAgIGRpcmVjdG9yeVNjYW5uZXIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxjb2RlPkZpbGU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGV4Y2x1ZGVzIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2wgPGNvZGU+RmlsZTwvY29kZT4gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFeGNsdWRlc2ZpbGUoRmlsZSBleGNsKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0UGF0dGVybnMuc2V0RXhjbHVkZXNmaWxlKGV4Y2wpOworICAgICAgICBkaXJlY3RvcnlTY2FubmVyID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VEZWZhdWx0RXhjbHVkZXMgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldERlZmF1bHRleGNsdWRlcyhib29sZWFuIHVzZURlZmF1bHRFeGNsdWRlcykgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnVzZURlZmF1bHRFeGNsdWRlcyA9IHVzZURlZmF1bHRFeGNsdWRlczsKKyAgICAgICAgZGlyZWN0b3J5U2Nhbm5lciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90LgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZXhjbHVzaW9ucyB2YWx1ZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGdldERlZmF1bHRleGNsdWRlcygpIHsKKyAgICAgICAgcmV0dXJuIChpc1JlZmVyZW5jZSgpKQorICAgICAgICAgICAgPyBnZXRSZWYoZ2V0UHJvamVjdCgpKS5nZXREZWZhdWx0ZXhjbHVkZXMoKSA6IHVzZURlZmF1bHRFeGNsdWRlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIGZpbGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7CisgICAgICAgIGRpcmVjdG9yeVNjYW5uZXIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgb3V0IGlmIHRoZSBmaWxlc2V0IGlzIGNhc2Ugc2Vuc2l0aXZlLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGVzZXQgaXMKKyAgICAgKiBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIChpc1JlZmVyZW5jZSgpKQorICAgICAgICAgICAgPyBnZXRSZWYoZ2V0UHJvamVjdCgpKS5pc0Nhc2VTZW5zaXRpdmUoKSA6IGNhc2VTZW5zaXRpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCBzeW1ib2xpYyBsaW5rcyBzaG91bGQgYmUgZm9sbG93ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9sbG93U3ltbGlua3Mgd2hldGhlciBvciBub3Qgc3ltYm9saWMgbGlua3Mgc2hvdWxkIGJlIGZvbGxvd2VkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRGb2xsb3dTeW1saW5rcyhib29sZWFuIGZvbGxvd1N5bWxpbmtzKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZm9sbG93U3ltbGlua3MgPSBmb2xsb3dTeW1saW5rczsKKyAgICAgICAgZGlyZWN0b3J5U2Nhbm5lciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBvdXQgaWYgdGhlIGZpbGVzZXQgd2FudHMgdG8gZm9sbG93IHN5bWJvbGljIGxpbmtzLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgc3ltYm9saWMgbGlua3MKKyAgICAgKiAgICAgICAgIHNob3VsZCBiZSBmb2xsb3dlZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRm9sbG93U3ltbGlua3MoKSB7CisgICAgICAgIHJldHVybiAoaXNSZWZlcmVuY2UoKSkKKyAgICAgICAgICAgID8gZ2V0UmVmKGdldFByb2plY3QoKSkuaXNGb2xsb3dTeW1saW5rcygpIDogZm9sbG93U3ltbGlua3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIGFuIGVycm9yIGlzIHRocm93biBpZiBhIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvck9uTWlzc2luZ0RpciB0cnVlIGlmIG1pc3NpbmcgZGlyZWN0b3JpZXMgY2F1c2UgZXJyb3JzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgbm90LgorICAgICAqLworICAgICBwdWJsaWMgdm9pZCBzZXRFcnJvck9uTWlzc2luZ0Rpcihib29sZWFuIGVycm9yT25NaXNzaW5nRGlyKSB7CisgICAgICAgICB0aGlzLmVycm9yT25NaXNzaW5nRGlyID0gZXJyb3JPbk1pc3NpbmdEaXI7CisgICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBzY2FubmVyIG5lZWRlZCB0byBhY2Nlc3MgdGhlIGZpbGVzIHRvIHByb2Nlc3MuCisgICAgICogQHJldHVybiBhIDxjb2RlPkRpcmVjdG9yeVNjYW5uZXI8L2NvZGU+IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBEaXJlY3RvcnlTY2FubmVyIGdldERpcmVjdG9yeVNjYW5uZXIoKSB7CisgICAgICAgIHJldHVybiBnZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IHNjYW5uZXIgbmVlZGVkIHRvIGFjY2VzcyB0aGUgZmlsZXMgdG8gcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gcCB0aGUgUHJvamVjdCBhZ2FpbnN0IHdoaWNoIHRoZSBEaXJlY3RvcnlTY2FubmVyIHNob3VsZCBiZSBjb25maWd1cmVkLgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5EaXJlY3RvcnlTY2FubmVyPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyZWN0b3J5U2Nhbm5lciBnZXREaXJlY3RvcnlTY2FubmVyKFByb2plY3QgcCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXREaXJlY3RvcnlTY2FubmVyKHApOworICAgICAgICB9CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChkaXJlY3RvcnlTY2FubmVyICE9IG51bGwgJiYgcCA9PSBnZXRQcm9qZWN0KCkpIHsKKyAgICAgICAgICAgICAgICBkcyA9IGRpcmVjdG9yeVNjYW5uZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGRpcmVjdG9yeSBzcGVjaWZpZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RGF0YVR5cGVOYW1lKCkgKyAiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWRpci5leGlzdHMoKSAmJiBlcnJvck9uTWlzc2luZ0RpcikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZGlyLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGZvdW5kLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWRpci5pc0RpcmVjdG9yeSgpICYmIGRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZGlyLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgICAgICAgICAgc2V0dXBEaXJlY3RvcnlTY2FubmVyKGRzLCBwKTsKKyAgICAgICAgICAgICAgICBkcy5zZXRGb2xsb3dTeW1saW5rcyhmb2xsb3dTeW1saW5rcyk7CisgICAgICAgICAgICAgICAgZHMuc2V0RXJyb3JPbk1pc3NpbmdEaXIoZXJyb3JPbk1pc3NpbmdEaXIpOworICAgICAgICAgICAgICAgIGRpcmVjdG9yeVNjYW5uZXIgPSAocCA9PSBnZXRQcm9qZWN0KCkpID8gZHMgOiBkaXJlY3RvcnlTY2FubmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgcmV0dXJuIGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB1cCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBzY2FubmVyIGFnYWluc3QgdGhpcworICAgICAqIEFic3RyYWN0RmlsZVNldCdzIFByb2plY3QuCisgICAgICogQHBhcmFtIGRzIGEgPGNvZGU+RmlsZVNjYW5uZXI8L2NvZGU+IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldHVwRGlyZWN0b3J5U2Nhbm5lcihGaWxlU2Nhbm5lciBkcykgeworICAgICAgICBzZXR1cERpcmVjdG9yeVNjYW5uZXIoZHMsIGdldFByb2plY3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHVwIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHNjYW5uZXIgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHByb2plY3QuCisgICAgICogQHBhcmFtIGRzIGEgPGNvZGU+RmlsZVNjYW5uZXI8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBwIGFuIEFudCA8Y29kZT5Qcm9qZWN0PC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0dXBEaXJlY3RvcnlTY2FubmVyKEZpbGVTY2FubmVyIGRzLCBQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIGdldFJlZihwKS5zZXR1cERpcmVjdG9yeVNjYW5uZXIoZHMsIHApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChkcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkcyBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGRzLnNldEJhc2VkaXIoZGlyKTsKKworICAgICAgICBQYXR0ZXJuU2V0IHBzID0gbWVyZ2VQYXR0ZXJucyhwKTsKKyAgICAgICAgcC5sb2coZ2V0RGF0YVR5cGVOYW1lKCkgKyAiOiBTZXR1cCBzY2FubmVyIGluIGRpciAiICsgZGlyCisgICAgICAgICAgICArICIgd2l0aCAiICsgcHMsIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICBkcy5zZXRJbmNsdWRlcyhwcy5nZXRJbmNsdWRlUGF0dGVybnMocCkpOworICAgICAgICBkcy5zZXRFeGNsdWRlcyhwcy5nZXRFeGNsdWRlUGF0dGVybnMocCkpOworICAgICAgICBpZiAoZHMgaW5zdGFuY2VvZiBTZWxlY3RvclNjYW5uZXIpIHsKKyAgICAgICAgICAgIFNlbGVjdG9yU2Nhbm5lciBzcyA9IChTZWxlY3RvclNjYW5uZXIpIGRzOworICAgICAgICAgICAgc3Muc2V0U2VsZWN0b3JzKGdldFNlbGVjdG9ycyhwKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzZURlZmF1bHRFeGNsdWRlcykgeworICAgICAgICAgICAgZHMuYWRkRGVmYXVsdEV4Y2x1ZGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgY2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybnMgdGhlCisgICAgICogcmVmZXJlbmNlZCBGaWxlU2V0LgorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2VkIEZpbGVTZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWxlU2V0IGdldFJlZihQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIChBYnN0cmFjdEZpbGVTZXQpIGdldENoZWNrZWRSZWYocCk7CisgICAgfQorCisgICAgLy8gU2VsZWN0b3JDb250YWluZXIgbWV0aG9kcworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzZWxlY3RvcnMgaGVyZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBhbnkgc2VsZWN0b3JzIGFyZSBpbiB0aGlzIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzU2VsZWN0b3JzKCkgeworICAgICAgICByZXR1cm4gKGlzUmVmZXJlbmNlKCkgJiYgZ2V0UHJvamVjdCgpICE9IG51bGwpCisgICAgICAgICAgICA/IGdldFJlZihnZXRQcm9qZWN0KCkpLmhhc1NlbGVjdG9ycygpIDogIShzZWxlY3RvcnMuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBhcmUgYW55IHBhdHRlcm5zIGhlcmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgYW55IHBhdHRlcm5zIGFyZSBpbiB0aGlzIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzUGF0dGVybnMoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpICYmIGdldFByb2plY3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKGdldFByb2plY3QoKSkuaGFzUGF0dGVybnMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVmYXVsdFBhdHRlcm5zLmhhc1BhdHRlcm5zKGdldFByb2plY3QoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBhZGRpdGlvbmFsUGF0dGVybnMuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFBhdHRlcm5TZXQgcHMgPSAoUGF0dGVyblNldCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKHBzLmhhc1BhdHRlcm5zKGdldFByb2plY3QoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIGluIHRoaXMgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lciBhcyBhbiA8Y29kZT5pbnQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNlbGVjdG9yQ291bnQoKSB7CisgICAgICAgIHJldHVybiAoaXNSZWZlcmVuY2UoKSAmJiBnZXRQcm9qZWN0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgID8gZ2V0UmVmKGdldFByb2plY3QoKSkuc2VsZWN0b3JDb3VudCgpIDogc2VsZWN0b3JzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc2VsZWN0b3JzIGFzIGFuIGFycmF5LgorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+RmlsZVNlbGVjdG9yW108L2NvZGU+IG9mIHRoZSBzZWxlY3RvcnMgaW4gdGhpcyBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBGaWxlU2VsZWN0b3JbXSBnZXRTZWxlY3RvcnMoUHJvamVjdCBwKSB7CisgICAgICAgIHJldHVybiAoaXNSZWZlcmVuY2UoKSkKKyAgICAgICAgICAgID8gZ2V0UmVmKHApLmdldFNlbGVjdG9ycyhwKSA6IChGaWxlU2VsZWN0b3JbXSkgKHNlbGVjdG9ycy50b0FycmF5KAorICAgICAgICAgICAgbmV3IEZpbGVTZWxlY3RvcltzZWxlY3RvcnMuc2l6ZSgpXSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRvciBmb3IgYWNjZXNzaW5nIHRoZSBzZXQgb2Ygc2VsZWN0b3JzLgorICAgICAqCisgICAgICogQHJldHVybiBhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2Ygc2VsZWN0b3JzLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRW51bWVyYXRpb24gc2VsZWN0b3JFbGVtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIChpc1JlZmVyZW5jZSgpICYmIGdldFByb2plY3QoKSAhPSBudWxsKQorICAgICAgICAgICAgPyBnZXRSZWYoZ2V0UHJvamVjdCgpKS5zZWxlY3RvckVsZW1lbnRzKCkgOiBzZWxlY3RvcnMuZWxlbWVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VsZWN0b3IgaW50byB0aGlzIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgbmV3IDxjb2RlPkZpbGVTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhcHBlbmRTZWxlY3RvcihGaWxlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgc2VsZWN0b3JzLmFkZEVsZW1lbnQoc2VsZWN0b3IpOworICAgICAgICBkaXJlY3RvcnlTY2FubmVyID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiBNZXRob2RzIGJlbG93IGFsbCBhZGQgc3BlY2lmaWMgc2VsZWN0b3JzICovCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSAiU2VsZWN0IiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPlNlbGVjdFNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VsZWN0b3IoU2VsZWN0U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiAiQW5kIiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPkFuZFNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQW5kKEFuZFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gIk9yIiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPk9yU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRPcihPclNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSAiTm90IiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPk5vdFNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTm90KE5vdFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSAiTm9uZSIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5Ob25lU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGROb25lKE5vbmVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbWFqb3JpdHkgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5NYWpvcml0eVNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWFqb3JpdHkoTWFqb3JpdHlTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2VsZWN0b3IgZGF0ZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPkRhdGVTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERhdGUoRGF0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZWxlY3RvciBzaXplIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+U2l6ZVNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2l6ZShTaXplU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIERpZmZlcmVudFNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+RGlmZmVyZW50U2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREaWZmZXJlbnQoRGlmZmVyZW50U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNlbGVjdG9yIGZpbGVuYW1lIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+RmlsZW5hbWVTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVuYW1lKEZpbGVuYW1lU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNlbGVjdG9yIHR5cGUgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5UeXBlU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUeXBlKFR5cGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGV4dGVuZGVkIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+RXh0ZW5kU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDdXN0b20oRXh0ZW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGNvbnRhaW5zIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+Q29udGFpbnNTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnRhaW5zKENvbnRhaW5zU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHByZXNlbnQgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5QcmVzZW50U2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcmVzZW50KFByZXNlbnRTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZGVwdGggc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5EZXB0aFNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVwdGgoRGVwdGhTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZGVwZW5kcyBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPkRlcGVuZFNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVwZW5kKERlcGVuZFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZWd1bGFyIGV4cHJlc3Npb24gc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5Db250YWluc1JlZ2V4cFNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29udGFpbnNSZWdleHAoQ29udGFpbnNSZWdleHBTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBtb2RpZmllZCBzZWxlY3Rvci4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPk1vZGlmaWVkU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KKyAgICAgKiBAc2luY2UgYW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1vZGlmaWVkKE1vZGlmaWVkU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhcmJpdGFyeSBzZWxlY3Rvci4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPkZpbGVTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKEZpbGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmNsdWRlZCBmaWxlcyBhcyBhIGxpc3Qgb2Ygc2VtaWNvbG9uLXNlcGFyYXRlZCBmaWxlbmFtZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvZiBpbmNsdWRlZCBmaWxlbmFtZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJzsnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChmaWxlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGRlZXAgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZSwgZXhjZXB0IGZvciB0aGUgbmVzdGVkCisgICAgICogc2VsZWN0b3JzICh0aGUgbGlzdCBvZiBzZWxlY3RvcnMgaXMgYSBzaGFsbG93IGNsb25lIG9mIHRoaXMKKyAgICAgKiBpbnN0YW5jZSdzIGxpc3QpLgorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCBvYmplY3QKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGNsb25lKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIChnZXRSZWYoZ2V0UHJvamVjdCgpKSkuY2xvbmUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGZzID0gKEFic3RyYWN0RmlsZVNldCkgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBmcy5kZWZhdWx0UGF0dGVybnMgPSAoUGF0dGVyblNldCkgZGVmYXVsdFBhdHRlcm5zLmNsb25lKCk7CisgICAgICAgICAgICAgICAgZnMuYWRkaXRpb25hbFBhdHRlcm5zID0gbmV3IFZlY3RvcihhZGRpdGlvbmFsUGF0dGVybnMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gYWRkaXRpb25hbFBhdHRlcm5zLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZnMuYWRkaXRpb25hbFBhdHRlcm5zCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWxlbWVudCgoKFBhdHRlcm5TZXQpIGUubmV4dEVsZW1lbnQoKSkuY2xvbmUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZzLnNlbGVjdG9ycyA9IG5ldyBWZWN0b3Ioc2VsZWN0b3JzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnM7CisgICAgICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtZXJnZWQgaW5jbHVkZSBwYXR0ZXJucyBmb3IgdGhpcyBBYnN0cmFjdEZpbGVTZXQuCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gdXNlLgorICAgICAqIEByZXR1cm4gdGhlIGluY2x1ZGUgcGF0dGVybnMgb2YgdGhlIGRlZmF1bHQgcGF0dGVybiBzZXQgYW5kIGFsbAorICAgICAqIG5lc3RlZCBwYXR0ZXJuc2V0cy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIG1lcmdlSW5jbHVkZXMoUHJvamVjdCBwKSB7CisgICAgICAgIHJldHVybiBtZXJnZVBhdHRlcm5zKHApLmdldEluY2x1ZGVQYXR0ZXJucyhwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1lcmdlZCBleGNsdWRlIHBhdHRlcm5zIGZvciB0aGlzIEFic3RyYWN0RmlsZVNldC4KKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdCB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgZXhjbHVkZSBwYXR0ZXJucyBvZiB0aGUgZGVmYXVsdCBwYXR0ZXJuIHNldCBhbmQgYWxsCisgICAgICogbmVzdGVkIHBhdHRlcm5zZXRzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gbWVyZ2VFeGNsdWRlcyhQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIG1lcmdlUGF0dGVybnMocCkuZ2V0RXhjbHVkZVBhdHRlcm5zKHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVyZ2VkIHBhdHRlcm5zIGZvciB0aGlzIEFic3RyYWN0RmlsZVNldC4KKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdCB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBwYXR0ZXJuc2V0IG1lcmdlZCB3aXRoIHRoZSBhZGRpdGlvbmFsIHNldHMKKyAgICAgKiBpbiBhIG5ldyBQYXR0ZXJuU2V0IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFBhdHRlcm5TZXQgbWVyZ2VQYXR0ZXJucyhQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYocCkubWVyZ2VQYXR0ZXJucyhwKTsKKyAgICAgICAgfQorICAgICAgICBQYXR0ZXJuU2V0IHBzID0gKFBhdHRlcm5TZXQpIGRlZmF1bHRQYXR0ZXJucy5jbG9uZSgpOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBhZGRpdGlvbmFsUGF0dGVybnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gYWRkaXRpb25hbFBhdHRlcm5zLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIHBzLmFwcGVuZCgoUGF0dGVyblNldCkgbywgcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQW50RmlsdGVyUmVhZGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BbnRGaWx0ZXJSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzdiY2VjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQW50RmlsdGVyUmVhZGVyLmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIEFuIEFudEZpbHRlclJlYWRlciBpcyBhIHdyYXBwZXIgY2xhc3MgdGhhdCBlbmNsb3NlcyB0aGUgY2xhc3NuYW1lCisgKiBhbmQgY29uZmlndXJhdGlvbiBvZiBhIENvbmZpZ3VyYWJsZSBGaWx0ZXJSZWFkZXIuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbnRGaWx0ZXJSZWFkZXIKKyAgICBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKworICAgIHByaXZhdGUgZmluYWwgVmVjdG9yIHBhcmFtZXRlcnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc05hbWUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzTmFtZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbSBhIDxjb2RlPlBhcmFtZXRlcjwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbShmaW5hbCBQYXJhbWV0ZXIgcGFyYW0pIHsKKyAgICAgICAgcGFyYW1ldGVycy5hZGRFbGVtZW50KHBhcmFtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBsb2FkIHRoZSBGaWx0ZXJSZWFkZXIgdGhyb3VnaCAoYXR0cmlidXRlKS4KKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIGEgY2xhc3NwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gbG9hZCB0aGUgRmlsdGVyUmVhZGVyIHRocm91Z2ggKG5lc3RlZCBlbGVtZW50KS4KKyAgICAgKiBAcmV0dXJuIGEgY2xhc3NwYXRoIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzcGF0aC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gbG9hZCB0aGUgRmlsdGVyUmVhZGVyIHRocm91Z2ggdmlhCisgICAgICogcmVmZXJlbmNlIChhdHRyaWJ1dGUpLgorICAgICAqIEBwYXJhbSByIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGZpbHRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5QYXJhbWV0ZXJbXTwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyW10gZ2V0UGFyYW1zKCkgeworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBuZXcgUGFyYW1ldGVyW3BhcmFtZXRlcnMuc2l6ZSgpXTsKKyAgICAgICAgcGFyYW1ldGVycy5jb3B5SW50byhwYXJhbXMpOworICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgQW50RmlsdGVyUmVhZGVyCisgICAgICogaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFub3RoZXIgYXR0cmlidXRlIG9yIG5lc3QgZWxlbWVudHMgaW5zaWRlCisgICAgICogdGhpcyBlbGVtZW50IGlmIHlvdSBtYWtlIGl0IGEgcmVmZXJlbmNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gd2hpY2ggdGhpcyBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGlzIGluc3RhbmNlIGFscmVhZHkgaGFzIGJlZW4gY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJzLmlzRW1wdHkoKSB8fCBjbGFzc05hbWUgIT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IGNsYXNzcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIC8vIGNoYW5nZSB0aGlzIHRvIGdldCB0aGUgb2JqZWN0cyBmcm9tIHRoZSBvdGhlciByZWZlcmVuY2UKKyAgICAgICAgT2JqZWN0IG8gPSByLmdldFJlZmVyZW5jZWRPYmplY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBbnRGaWx0ZXJSZWFkZXIpIHsKKyAgICAgICAgICAgIEFudEZpbHRlclJlYWRlciBhZnIgPSAoQW50RmlsdGVyUmVhZGVyKSBvOworICAgICAgICAgICAgc2V0Q2xhc3NOYW1lKGFmci5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgICAgICBzZXRDbGFzc3BhdGgoYWZyLmdldENsYXNzcGF0aCgpKTsKKyAgICAgICAgICAgIFBhcmFtZXRlcltdIHAgPSBhZnIuZ2V0UGFyYW1zKCk7CisgICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKHBbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSByLmdldFJlZklkKCkgKyAiIGRvZXNuXCd0IHJlZmVyIHRvIGEgRmlsdGVyUmVhZGVyIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuc2V0UmVmaWQocik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXJjaGl2ZUZpbGVTZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0FyY2hpdmVGaWxlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjc4MDM4OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0FyY2hpdmVGaWxlU2V0LmphdmEKQEAgLTAsMCArMSw0OTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlVuaXhTdGF0OworCisvKioKKyAqIEEgQXJjaGl2ZUZpbGVTZXQgaXMgYSBGaWxlU2V0IHdpdGggZXh0cmEgYXR0cmlidXRlcyB1c2VmdWwgaW4gdGhlCisgKiBjb250ZXh0IG9mIGFyY2hpdmluZyB0YXNrcy4KKyAqCisgKiBJdCBpbmNsdWRlcyBhIHByZWZpeCBhdHRyaWJ1dGUgd2hpY2ggaXMgcHJlcGVuZGVkIHRvIGVhY2ggZW50cnkgaW4KKyAqIHRoZSBvdXRwdXQgYXJjaGl2ZSBmaWxlIGFzIHdlbGwgYXMgYSBmdWxscGF0aCBhdHRyaWJ1dGUuICBJdCBhbHNvCisgKiBzdXBwb3J0cyBVbml4IGZpbGUgcGVybWlzc2lvbnMgZm9yIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKyAqCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXJjaGl2ZUZpbGVTZXQgZXh0ZW5kcyBGaWxlU2V0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVNFX09DVEFMID0gODsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBkaXJtb2RlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0RJUl9NT0RFID0KKyAgICAgICAgVW5peFN0YXQuRElSX0ZMQUcgfCBVbml4U3RhdC5ERUZBVUxUX0RJUl9QRVJNOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZpbGVtb2RlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZJTEVfTU9ERSA9CisgICAgICAgIFVuaXhTdGF0LkZJTEVfRkxBRyB8IFVuaXhTdGF0LkRFRkFVTFRfRklMRV9QRVJNOworCisgICAgcHJpdmF0ZSBSZXNvdXJjZSBzcmMgICAgICAgICAgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeCAgICAgICAgID0gIiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgZnVsbHBhdGggICAgICAgPSAiIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzRGlyICAgICAgICA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IGZpbGVNb2RlICAgICAgICAgID0gREVGQVVMVF9GSUxFX01PREU7CisgICAgcHJpdmF0ZSBpbnQgZGlyTW9kZSAgICAgICAgICAgPSBERUZBVUxUX0RJUl9NT0RFOworCisgICAgcHJpdmF0ZSBib29sZWFuIGZpbGVNb2RlSGFzQmVlblNldCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBkaXJNb2RlSGFzQmVlblNldCAgPSBmYWxzZTsKKworICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZUZpbGVTZXQgKi8KKyAgICBwdWJsaWMgQXJjaGl2ZUZpbGVTZXQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNpbmcgYSBmaWxlc2V0IGFyZ3VlbWVudC4KKyAgICAgKiBAcGFyYW0gZmlsZXNldCB0aGUgZmlsZXNldCB0byB1c2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJjaGl2ZUZpbGVTZXQoRmlsZVNldCBmaWxlc2V0KSB7CisgICAgICAgIHN1cGVyKGZpbGVzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzaW5nIGEgYXJjaGl2ZSBmaWxlc2V0IGFyZ3VlbWVudC4KKyAgICAgKiBAcGFyYW0gZmlsZXNldCB0aGUgYXJjaGl2ZWZpbGVzZXQgdG8gdXNlCisgICAgICovCisgICAgcHJvdGVjdGVkIEFyY2hpdmVGaWxlU2V0KEFyY2hpdmVGaWxlU2V0IGZpbGVzZXQpIHsKKyAgICAgICAgc3VwZXIoZmlsZXNldCk7CisgICAgICAgIHNyYyA9IGZpbGVzZXQuc3JjOworICAgICAgICBwcmVmaXggPSBmaWxlc2V0LnByZWZpeDsKKyAgICAgICAgZnVsbHBhdGggPSBmaWxlc2V0LmZ1bGxwYXRoOworICAgICAgICBoYXNEaXIgPSBmaWxlc2V0Lmhhc0RpcjsKKyAgICAgICAgZmlsZU1vZGUgPSBmaWxlc2V0LmZpbGVNb2RlOworICAgICAgICBkaXJNb2RlID0gZmlsZXNldC5kaXJNb2RlOworICAgICAgICBmaWxlTW9kZUhhc0JlZW5TZXQgPSBmaWxlc2V0LmZpbGVNb2RlSGFzQmVlblNldDsKKyAgICAgICAgZGlyTW9kZUhhc0JlZW5TZXQgPSBmaWxlc2V0LmRpck1vZGVIYXNCZWVuU2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXNldC4KKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlc2V0CisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICBpZiAoc3JjICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHNldCBib3RoIGRpciBhbmQgc3JjIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXREaXIoZGlyKTsKKyAgICAgICAgaGFzRGlyID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNvdXJjZSBBcmNoaXZlIGZpbGUgZm9yIHRoZSBhcmNoaXZlZmlsZXNldC4gIFByZXZlbnRzIGJvdGgKKyAgICAgKiAiZGlyIiBhbmQgInNyYyIgZnJvbSBiZWluZyBzcGVjaWZpZWQuCisgICAgICogQHBhcmFtIGEgdGhlIGFyY2hpdmUgYXMgYSBzaW5nbGUgZWxlbWVudCBSZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWQoUmVzb3VyY2VDb2xsZWN0aW9uIGEpIHsKKyAgICAgICAgY2hlY2tDaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgaWYgKGEuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib25seSBzaW5nbGUgYXJndW1lbnQgcmVzb3VyY2UgY29sbGVjdGlvbnMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFyZSBzdXBwb3J0ZWQgYXMgYXJjaGl2ZXMiKTsKKyAgICAgICAgfQorICAgICAgICBzZXRTcmNSZXNvdXJjZSgoUmVzb3VyY2UpIGEuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc291cmNlIEFyY2hpdmUgZmlsZSBmb3IgdGhlIGFyY2hpdmVmaWxlc2V0LiAgUHJldmVudHMgYm90aAorICAgICAqICJkaXIiIGFuZCAic3JjIiBmcm9tIGJlaW5nIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmNGaWxlIFRoZSBhcmNoaXZlIGZyb20gd2hpY2ggdG8gZXh0cmFjdCBlbnRyaWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIHNyY0ZpbGUpIHsKKyAgICAgICAgc2V0U3JjUmVzb3VyY2UobmV3IEZpbGVSZXNvdXJjZShzcmNGaWxlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2UgQXJjaGl2ZSBmaWxlIGZvciB0aGUgYXJjaGl2ZWZpbGVzZXQuICBQcmV2ZW50cyBib3RoCisgICAgICogImRpciIgYW5kICJzcmMiIGZyb20gYmVpbmcgc3BlY2lmaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBUaGUgYXJjaGl2ZSBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgZW50cmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmNSZXNvdXJjZShSZXNvdXJjZSBzcmMpIHsKKyAgICAgICAgY2hlY2tBcmNoaXZlQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgaWYgKGhhc0RpcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGJvdGggZGlyIGFuZCBzcmMgYXR0cmlidXRlcyIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc3JjID0gc3JjOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXJjaGl2ZSBmcm9tIHdoaWNoIGVudHJpZXMgd2lsbCBiZSBleHRyYWN0ZWQuCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gdXNlCisgICAgICogQHJldHVybiB0aGUgc291cmNlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRTcmMoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlRmlsZVNldCkgZ2V0UmVmKHApKS5nZXRTcmMocCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFNyYygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXJjaGl2ZSBmaWxlIGZyb20gd2hpY2ggZW50cmllcyB3aWxsIGJlIGV4dHJhY3RlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcmNoaXZlIGluIGNhc2UgdGhlIGFyY2hpdmUgaXMgYSBmaWxlLCBudWxsIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRTcmMoKSB7CisgICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEZpbGVSZXNvdXJjZSkgc3JjKS5nZXRGaWxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGVuZCB0aGlzIHByZWZpeCB0byB0aGUgcGF0aCBmb3IgZWFjaCBhcmNoaXZlIGVudHJ5LgorICAgICAqIFByZXZlbnRzIGJvdGggcHJlZml4IGFuZCBmdWxscGF0aCBmcm9tIGJlaW5nIHNwZWNpZmllZAorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIHByZXBlbmQgdG8gZW50cmllcyBpbiB0aGUgYXJjaGl2ZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIGNoZWNrQXJjaGl2ZUF0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIGlmICghIiIuZXF1YWxzKHByZWZpeCkgJiYgISIiLmVxdWFscyhmdWxscGF0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHNldCBib3RoIGZ1bGxwYXRoIGFuZCBwcmVmaXggYXR0cmlidXRlcyIpOworICAgICAgICB9CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJlZml4IHByZXBlbmRlZCB0byBlbnRyaWVzIGluIHRoZSBhcmNoaXZlIGZpbGUuCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gdXNlCisgICAgICogQHJldHVybiB0aGUgcHJlZml4CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlRmlsZVNldCkgZ2V0UmVmKHApKS5nZXRQcmVmaXgocCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByZWZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHNpbmdsZSBlbnRyeSBpbiB0aGlzIGZpbGVzZXQuCisgICAgICogUHJldmVudHMgYm90aCBwcmVmaXggYW5kIGZ1bGxwYXRoIGZyb20gYmVpbmcgc3BlY2lmaWVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnVsbHBhdGggdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHNpbmdsZSBlbnRyeSBpbiB0aGlzIGZpbGVzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnVsbHBhdGgoU3RyaW5nIGZ1bGxwYXRoKSB7CisgICAgICAgIGNoZWNrQXJjaGl2ZUF0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIGlmICghIiIuZXF1YWxzKHByZWZpeCkgJiYgISIiLmVxdWFscyhmdWxscGF0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHNldCBib3RoIGZ1bGxwYXRoIGFuZCBwcmVmaXggYXR0cmlidXRlcyIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZnVsbHBhdGggPSBmdWxscGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHNpbmdsZSBlbnRyeSBpbiB0aGlzIGZpbGVzZXQuCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gdXNlCisgICAgICogQHJldHVybiB0aGUgZnVsbCBwYXRoCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxscGF0aChQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEFyY2hpdmVGaWxlU2V0KSBnZXRSZWYocCkpLmdldEZ1bGxwYXRoKHApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmdWxscGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc2Nhbm5lciBmb3IgdGhpcyB0eXBlIG9mIGFyY2hpdmUuCisgICAgICogQHJldHVybiB0aGUgc2Nhbm5lci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQXJjaGl2ZVNjYW5uZXIgbmV3QXJjaGl2ZVNjYW5uZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgRGlyZWN0b3J5U2Nhbm5lciBhc3NvY2lhdGVkIHdpdGggdGhpcyBGaWxlU2V0LgorICAgICAqIElmIHRoZSBBcmNoaXZlRmlsZVNldCBkZWZpbmVzIGEgc291cmNlIEFyY2hpdmUgZmlsZSwgdGhlbiBhbiBBcmNoaXZlU2Nhbm5lcgorICAgICAqIGlzIHJldHVybmVkIGluc3RlYWQuCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gdXNlCisgICAgICogQHJldHVybiBhIGRpcmVjdG9yeSBzY2FubmVyCisgICAgICovCisgICAgcHVibGljIERpcmVjdG9yeVNjYW5uZXIgZ2V0RGlyZWN0b3J5U2Nhbm5lcihQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYocCkuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKHApOworICAgICAgICB9CisgICAgICAgIGlmICghc3JjLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAidGhlIGFyY2hpdmUgIiArIHNyYy5nZXROYW1lKCkgKyAiIGRvZXNuJ3QgZXhpc3QiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIGFyY2hpdmUgIiArIHNyYy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY2FuJ3QgYmUgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorICAgICAgICBBcmNoaXZlU2Nhbm5lciBhcyA9IG5ld0FyY2hpdmVTY2FubmVyKCk7CisgICAgICAgIGFzLnNldFNyYyhzcmMpOworICAgICAgICBzdXBlci5zZXREaXIocC5nZXRCYXNlRGlyKCkpOworICAgICAgICBzZXR1cERpcmVjdG9yeVNjYW5uZXIoYXMsIHApOworICAgICAgICBhcy5pbml0KCk7CisgICAgICAgIHJldHVybiBhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZUNvbGxlY3Rpb24pIChnZXRSZWYoZ2V0UHJvamVjdCgpKSkpLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaXRlcmF0b3IoKTsKKyAgICAgICAgfQorICAgICAgICBBcmNoaXZlU2Nhbm5lciBhcyA9IChBcmNoaXZlU2Nhbm5lcikgZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICByZXR1cm4gYXMuZ2V0UmVzb3VyY2VGaWxlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24gYXMgaW50LgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2VDb2xsZWN0aW9uKSAoZ2V0UmVmKGdldFByb2plY3QoKSkpKS5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIEFyY2hpdmVTY2FubmVyIGFzID0gKEFyY2hpdmVTY2FubmVyKSBnZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgIHJldHVybiBhcy5nZXRJbmNsdWRlZEZpbGVzQ291bnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgUmVzb3VyY2VDb2xsZWN0aW9uIGlzIGNvbXBvc2VkIGVudGlyZWx5IG9mCisgICAgICogUmVzb3VyY2VzIGFjY2Vzc2libGUgdmlhIGxvY2FsIGZpbGVzeXN0ZW0gY29udmVudGlvbnMuICBJZiB0cnVlLAorICAgICAqIGFsbCBSZXNvdXJjZXMgcmV0dXJuZWQgZnJvbSB0aGlzIFJlc291cmNlQ29sbGVjdGlvbiBzaG91bGQgYmUKKyAgICAgKiBpbnN0YW5jZXMgb2YgRmlsZVJlc291cmNlLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgZmlsZXN5c3RlbS1vbmx5IHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgeworICAgICAgICByZXR1cm4gc3JjID09IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSAzIGRpZ2l0IG9jdGFsIHN0cmluZywgc3BlY2lmeSB0aGUgdXNlciwgZ3JvdXAgYW5kCisgICAgICogb3RoZXIgbW9kZXMgaW4gdGhlIHN0YW5kYXJkIFVuaXggZmFzaGlvbjsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdD0wNjQ0CisgICAgICogQHBhcmFtIG9jdGFsU3RyaW5nIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVNb2RlKFN0cmluZyBvY3RhbFN0cmluZykgeworICAgICAgICBjaGVja0FyY2hpdmVBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICBpbnRlZ2VyU2V0RmlsZU1vZGUoSW50ZWdlci5wYXJzZUludChvY3RhbFN0cmluZywgQkFTRV9PQ1RBTCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNwZWNpZnkgdGhlIHVzZXIsIGdyb3VwIGFuZAorICAgICAqIG90aGVyIG1vZGVzIGluIHRoZSBzdGFuZGFyZCBVbml4IGZhc2hpb247CisgICAgICogb3B0aW9uYWwsIGRlZmF1bHQ9MDY0NAorICAgICAqCisgICAgICogPHA+V2UgdXNlIHRoZSBzdHJhbmdlIG5hbWUgc28gdGhpcyBtZXRob2QgZG9lc24ndCBhcHBlYXIgaW4KKyAgICAgKiBJbnRyb3NwZWN0aW9uSGVscGVycyBsaXN0IG9mIGF0dHJpYnV0ZSBzZXR0ZXJzLjwvcD4KKyAgICAgKiBAcGFyYW0gbW9kZSBhIDxjb2RlPmludDwvY29kZT4gdmFsdWUKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludGVnZXJTZXRGaWxlTW9kZShpbnQgbW9kZSkgeworICAgICAgICBmaWxlTW9kZUhhc0JlZW5TZXQgPSB0cnVlOworICAgICAgICB0aGlzLmZpbGVNb2RlID0gVW5peFN0YXQuRklMRV9GTEFHIHwgbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1vZGUgb2YgdGhlIGFyY2hpdmUgZmlsZXNldAorICAgICAqIEBwYXJhbSBwIHRoZSBwcm9qZWN0IHRvIHVzZQorICAgICAqIEByZXR1cm4gdGhlIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEZpbGVNb2RlKFByb2plY3QgcCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoQXJjaGl2ZUZpbGVTZXQpIGdldFJlZihwKSkuZ2V0RmlsZU1vZGUocCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGUgbW9kZSBleHBsaWNpdGx5LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBoYXMgYmVlbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWxlTW9kZUJlZW5TZXQoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlRmlsZVNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLmhhc0ZpbGVNb2RlQmVlblNldCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlTW9kZUhhc0JlZW5TZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSAzIGRpZ2l0IG9jdGFsIHN0cmluZywgc3BlY2lmeSB0aGUgdXNlciwgZ3JvdXAgYW5kCisgICAgICogb3RoZXIgbW9kZXMgaW4gdGhlIHN0YW5kYXJkIFVuaXggZmFzaGlvbjsKKyAgICAgKiBvcHRpb25hbCwgZGVmYXVsdD0wNzU1CisgICAgICogQHBhcmFtIG9jdGFsU3RyaW5nIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpck1vZGUoU3RyaW5nIG9jdGFsU3RyaW5nKSB7CisgICAgICAgIGNoZWNrQXJjaGl2ZUF0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIGludGVnZXJTZXREaXJNb2RlKEludGVnZXIucGFyc2VJbnQob2N0YWxTdHJpbmcsIEJBU0VfT0NUQUwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzcGVjaWZ5IHRoZSB1c2VyLCBncm91cCBhbmQKKyAgICAgKiBvdGhlciBtb2RlcyBpbiB0aGUgc3RhbmRhcmQgVW5peCBmYXNoaW9uOworICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0PTA3NTUKKyAgICAgKiA8cD5XZSB1c2UgdGhlIHN0cmFuZ2UgbmFtZSBzbyB0aGlzIG1ldGhvZCBkb2Vzbid0IGFwcGVhciBpbgorICAgICAqIEludHJvc3BlY3Rpb25IZWxwZXJzIGxpc3Qgb2YgYXR0cmlidXRlIHNldHRlcnMuPC9wPgorICAgICAqIEBwYXJhbSBtb2RlIGEgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZQorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW50ZWdlclNldERpck1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgZGlyTW9kZUhhc0JlZW5TZXQgPSB0cnVlOworICAgICAgICB0aGlzLmRpck1vZGUgPSBVbml4U3RhdC5ESVJfRkxBRyB8IG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkaXIgbW9kZSBvZiB0aGUgYXJjaGl2ZSBmaWxlc2V0CisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gdXNlCisgICAgICogQHJldHVybiB0aGUgbW9kZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGlyTW9kZShQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEFyY2hpdmVGaWxlU2V0KSBnZXRSZWYocCkpLmdldERpck1vZGUocCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpck1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIHRoZSBtb2RlIGV4cGxpY2l0bHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgaXQgaGFzIGJlZW4gc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGlyTW9kZUJlZW5TZXQoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlRmlsZVNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLmhhc0Rpck1vZGVCZWVuU2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpck1vZGVIYXNCZWVuU2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgQXJjaGl2ZUZpbGVzZXQgYWNjZXB0cyBhbm90aGVyIEFyY2hpdmVGaWxlU2V0IG9yIGEgRmlsZVNldCBhcyByZWZlcmVuY2UKKyAgICAgKiBGaWxlU2V0cyBhcmUgb2Z0ZW4gdXNlZCBieSB0aGUgd2FyIHRhc2sgZm9yIHRoZSBsaWIgYXR0cmlidXRlCisgICAgICogQHBhcmFtIHpmcyB0aGUgcHJvamVjdCB0byB1c2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVGaWxlU2V0KEFyY2hpdmVGaWxlU2V0IHpmcykgeworICAgICAgICB6ZnMuc2V0UHJlZml4KHByZWZpeCk7CisgICAgICAgIHpmcy5zZXRGdWxscGF0aChmdWxscGF0aCk7CisgICAgICAgIHpmcy5maWxlTW9kZUhhc0JlZW5TZXQgPSBmaWxlTW9kZUhhc0JlZW5TZXQ7CisgICAgICAgIHpmcy5maWxlTW9kZSA9IGZpbGVNb2RlOworICAgICAgICB6ZnMuZGlyTW9kZUhhc0JlZW5TZXQgPSBkaXJNb2RlSGFzQmVlblNldDsKKyAgICAgICAgemZzLmRpck1vZGUgPSBkaXJNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEFyY2hpdmVGaWxlU2V0IHRoYXQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMKKyAgICAgKiBhcyB0aGlzIG9uZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgYXJjaGl2ZUZpbGVTZXQKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlRmlsZVNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIGZpbGUtYmFzZWQgYXJjaGl2ZWZpbGVzZXRzLCByZXR1cm4gdGhlIHNhbWUgYXMgZm9yIG5vcm1hbCBmaWxlc2V0czsKKyAgICAgKiBlbHNlIGp1c3QgcmV0dXJuIHRoZSBwYXRoIG9mIHRoZSB6aXAuCisgICAgICogQHJldHVybiBmb3IgZmlsZSBiYXNlZCBhcmNoaXZlZmlsZXNldHMsIGluY2x1ZGVkIGZpbGVzIGFzIGEgbGlzdAorICAgICAqIG9mIHNlbWljb2xvbi1zZXBhcmF0ZWQgZmlsZW5hbWVzLiBlbHNlIGp1c3QgdGhlIG5hbWUgb2YgdGhlIHppcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBpZiAoaGFzRGlyICYmIGdldFByb2plY3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3JjID09IG51bGwgPyBudWxsIDogc3JjLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByZWZpeCBwcmVwZW5kZWQgdG8gZW50cmllcyBpbiB0aGUgYXJjaGl2ZSBmaWxlLgorICAgICAqIEByZXR1cm4gdGhlIHByZWZpeC4KKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7CisgICAgICAgIHJldHVybiBwcmVmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBzaW5nbGUgZW50cnlaIGluIHRoaXMgZmlsZXNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lLgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxwYXRoKCkgeworICAgICAgICByZXR1cm4gZnVsbHBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZmlsZSBtb2RlLgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEZpbGVNb2RlKCkgeworICAgICAgICByZXR1cm4gZmlsZU1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZGlyIG1vZGUuCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGlyTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIGRpck1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjaGVjayBhdHRyaWJ1dGVzIGZvciBhcmNoaXZlRmlsZVNldC4KKyAgICAgKiBJZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSwgYW5kCisgICAgICogaXQgaXMgYSBBcmNoaXZlRmlsZVNldCwgdGhlIGFyY2hpdmUgZmlsZXNldCBhdHRyaWJ1dGVzCisgICAgICogY2Fubm90IGJlIHVzZWQuCisgICAgICogKE5vdGUsIHdlIGNhbiBvbmx5IHNlZSBpZiB0aGUgcmVmZXJlbmNlIGlzIGFuIGFyY2hpdmUKKyAgICAgKiBmaWxlc2V0IGlmIHRoZSBwcm9qZWN0IGhhcyBiZWVuIHNldCkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQXJjaGl2ZUF0dHJpYnV0ZXNBbGxvd2VkKCkgeworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpID09IG51bGwKKyAgICAgICAgICAgIHx8IChpc1JlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgJiYgKGdldFJlZmlkKCkuZ2V0UmVmZXJlbmNlZE9iamVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSkKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VvZiBBcmNoaXZlRmlsZVNldCkpKSB7CisgICAgICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BcmNoaXZlU2Nhbm5lci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXJjaGl2ZVNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OWI4OTkwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXJjaGl2ZVNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZUl0ZXJhdG9yOworCisvKioKKyAqIEFyY2hpdmVTY2FubmVyIGFjY2Vzc2VzIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGFsZ29yaXRobSBpbiBEaXJlY3RvcnlTY2FubmVyLAorICogd2hpY2ggYXJlIHByb3RlY3RlZCBtZXRob2RzIHRoYXQgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYnkgc3ViY2xhc3NpbmcuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBGaWxlU2Nhbm5lciBkZWZpbmVzIGdldEluY2x1ZGVkRmlsZXMgdG8gcmV0dXJuCisgKiB0aGUgbWF0Y2hpbmcgYXJjaGl2ZSBlbnRyaWVzLgorICoKKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcmNoaXZlU2Nhbm5lciBleHRlbmRzIERpcmVjdG9yeVNjYW5uZXIgeworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJjaGl2ZSBmaWxlIHdoaWNoIHNob3VsZCBiZSBzY2FubmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIHNyY0ZpbGU7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogVGhlIGFyY2hpdmUgcmVzb3VyY2Ugd2hpY2ggc2hvdWxkIGJlIHNjYW5uZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXNvdXJjZSBzcmM7CisKKyAgICAvKioKKyAgICAgKiB0byByZWNvcmQgdGhlIGxhc3Qgc2Nhbm5lZCB6aXAgZmlsZSB3aXRoIGl0cyBtb2RpZmljYXRpb24gZGF0ZQorICAgICAqLworICAgIHByaXZhdGUgUmVzb3VyY2UgbGFzdFNjYW5uZWRSZXNvdXJjZTsKKworICAgIC8qKgorICAgICAqIHJlY29yZCBsaXN0IG9mIGFsbCBmaWxlIHppcCBlbnRyaWVzCisgICAgICovCisgICAgcHJpdmF0ZSBUcmVlTWFwIGZpbGVFbnRyaWVzID0gbmV3IFRyZWVNYXAoKTsKKworICAgIC8qKgorICAgICAqIHJlY29yZCBsaXN0IG9mIGFsbCBkaXJlY3RvcnkgemlwIGVudHJpZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFRyZWVNYXAgZGlyRW50cmllcyA9IG5ldyBUcmVlTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiByZWNvcmQgbGlzdCBvZiBtYXRjaGluZyBmaWxlIHppcCBlbnRyaWVzCisgICAgICovCisgICAgcHJpdmF0ZSBUcmVlTWFwIG1hdGNoRmlsZUVudHJpZXMgPSBuZXcgVHJlZU1hcCgpOworCisgICAgLyoqCisgICAgICogcmVjb3JkIGxpc3Qgb2YgbWF0Y2hpbmcgZGlyZWN0b3J5IHppcCBlbnRyaWVzCisgICAgICovCisgICAgcHJpdmF0ZSBUcmVlTWFwIG1hdGNoRGlyRW50cmllcyA9IG5ldyBUcmVlTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBlbmNvZGluZyBvZiBmaWxlIG5hbWVzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKworICAgIC8qKgorICAgICAqIERvbid0IHNjYW4gd2hlbiB3ZSBoYXZlIG5vIHppcGZpbGUuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzY2FuKCkgeworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zY2FuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3JjRmlsZSBmb3Igc2Nhbm5pbmcuIFRoaXMgaXMgdGhlIGphciBvciB6aXAgZmlsZSB0aGF0CisgICAgICogaXMgc2Nhbm5lZCBmb3IgbWF0Y2hpbmcgZW50cmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmNGaWxlIHRoZSAobm9uLW51bGwpIGFyY2hpdmUgZmlsZSBuYW1lIGZvciBzY2FubmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIHNyY0ZpbGUpIHsKKyAgICAgICAgc2V0U3JjKG5ldyBGaWxlUmVzb3VyY2Uoc3JjRmlsZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNyYyBmb3Igc2Nhbm5pbmcuIFRoaXMgaXMgdGhlIGphciBvciB6aXAgZmlsZSB0aGF0CisgICAgICogaXMgc2Nhbm5lZCBmb3IgbWF0Y2hpbmcgZW50cmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmMgdGhlIChub24tbnVsbCkgYXJjaGl2ZSByZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhSZXNvdXJjZSBzcmMpIHsKKyAgICAgICAgdGhpcy5zcmMgPSBzcmM7CisgICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHNyY0ZpbGUgPSAoKEZpbGVSZXNvdXJjZSkgc3JjKS5nZXRGaWxlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGVuY29kaW5nIG9mIGZpbGUgbmFtZXMuCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyBmb3JtYXQKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIHdoaWNoIG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAqIGluY2x1ZGUgcGF0dGVybnMgYW5kIG5vbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICogICAgICAgICBpbmNsdWRlIHBhdHRlcm5zIGFuZCBub25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlZEZpbGVzKCkgeworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgc2Nhbm1lKCk7CisgICAgICAgIFNldCBzID0gbWF0Y2hGaWxlRW50cmllcy5rZXlTZXQoKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgKHMudG9BcnJheShuZXcgU3RyaW5nW3Muc2l6ZSgpXSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHBhcmVudCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIGNvdW50IG9mIGluY2x1ZGVkIGZpbGVzLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmNsdWRlZEZpbGVzQ291bnQoKSB7CisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluY2x1ZGVkRmlsZXNDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHNjYW5tZSgpOworICAgICAgICByZXR1cm4gbWF0Y2hGaWxlRW50cmllcy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHdoaWNoIG1hdGNoZWQgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAqIGluY2x1ZGUgcGF0dGVybnMgYW5kIG5vbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogVGhlIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgd2hpY2ggbWF0Y2hlZCBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICogaW5jbHVkZSBwYXR0ZXJucyBhbmQgbm9uZSBvZiB0aGUgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpIHsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgICAgICB9CisgICAgICAgIHNjYW5tZSgpOworICAgICAgICBTZXQgcyA9IG1hdGNoRGlyRW50cmllcy5rZXlTZXQoKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgKHMudG9BcnJheShuZXcgU3RyaW5nW3Muc2l6ZSgpXSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHBhcmVudCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIGNvdW50IG9mIGluY2x1ZGVkIGRpcmVjdG9yaWVzLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmNsdWRlZERpcnNDb3VudCgpIHsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5jbHVkZWREaXJzQ291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBzY2FubWUoKTsKKyAgICAgICAgcmV0dXJuIG1hdGNoRGlyRW50cmllcy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXQgb2YgUmVzb3VyY2VzIHRoYXQgcmVwcmVzZW50IGZpbGVzLgorICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb2YgUmVzb3VyY2VzLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgLyogcGFja2FnZS1wcml2YXRlIGZvciBub3cgKi8gSXRlcmF0b3IgZ2V0UmVzb3VyY2VGaWxlcygpIHsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZUl0ZXJhdG9yKGdldEJhc2VkaXIoKSwgZ2V0SW5jbHVkZWRGaWxlcygpKTsKKyAgICAgICAgfQorICAgICAgICBzY2FubWUoKTsKKyAgICAgICAgcmV0dXJuIG1hdGNoRmlsZUVudHJpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNldCBvZiBSZXNvdXJjZXMgdGhhdCByZXByZXNlbnQgZGlyZWN0b3JpZXMuCisgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlLXByaXZhdGUgZm9yIG5vdyAqLyAgSXRlcmF0b3IgZ2V0UmVzb3VyY2VEaXJlY3RvcmllcygpIHsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZUl0ZXJhdG9yKGdldEJhc2VkaXIoKSwgZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpKTsKKyAgICAgICAgfQorICAgICAgICBzY2FubWUoKTsKKyAgICAgICAgcmV0dXJuIG1hdGNoRGlyRW50cmllcy52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgRGlyZWN0b3J5U2Nhbm5lciBkYXRhIHN0cnVjdHVyZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYgKGluY2x1ZGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE5vIGluY2x1ZGVzIHN1cHBsaWVkLCBzbyBzZXQgaXQgdG8gJ21hdGNoZXMgYWxsJworICAgICAgICAgICAgaW5jbHVkZXMgPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgaW5jbHVkZXNbMF0gPSAiKioiOworICAgICAgICB9CisgICAgICAgIGlmIChleGNsdWRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBleGNsdWRlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVzIGEgamFyIGVudHJ5IGFnYWluc3QgdGhlIGluY2x1ZGVzL2V4Y2x1ZGVzIGxpc3QsCisgICAgICogbm9ybWFsaXppbmcgdGhlIHBhdGggc2VwYXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggdGhlIChub24tbnVsbCkgcGF0aCBuYW1lIHRvIHRlc3QgZm9yIGluY2x1c2lvbgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGF0aCBzaG91bGQgYmUgaW5jbHVkZWQKKyAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIHZwYXRoID0gcGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS4KKyAgICAgICAgICAgIHJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgcmV0dXJuIGlzSW5jbHVkZWQodnBhdGgpICYmICFpc0V4Y2x1ZGVkKHZwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWVkIFJlc291cmNlLgorICAgICAqIEBwYXJhbSBuYW1lIHBhdGggbmFtZSBvZiB0aGUgZmlsZSBzb3VnaHQgaW4gdGhlIGFyY2hpdmUKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZQorICAgICAqIEBzaW5jZSBBbnQgMS41LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2UobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGluIFpJUHMsIHdlIGRvIG5vdCB3YW50IHRoaXMgdGhpbmcgaW5jbHVkZWQKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2UoIiIsIHRydWUsIExvbmcuTUFYX1ZBTFVFLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiB0aGUgYXJjaGl2ZSBuZWVkcyB0byBiZSBzY2FubmVkIGFnYWluCisgICAgICAgIHNjYW5tZSgpOworICAgICAgICBpZiAoZmlsZUVudHJpZXMuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoUmVzb3VyY2UpIGZpbGVFbnRyaWVzLmdldChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBuYW1lID0gdHJpbVNlcGFyYXRvcihuYW1lKTsKKworICAgICAgICBpZiAoZGlyRW50cmllcy5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIChSZXNvdXJjZSkgZGlyRW50cmllcy5nZXQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWxscyB0aGUgZmlsZSBhbmQgZGlyZWN0b3J5IG1hcHMgd2l0aCByZXNvdXJjZXMgcmVhZCBmcm9tIHRoZSBhcmNoaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGFyY2hpdmUgdGhlIGFyY2hpdmUgdG8gc2Nhbi4KKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgZW5jb2RpbmcgdXNlZCB0byBlbmNvZGUgZmlsZSBuYW1lcyBpbnNpZGUgdGhlIGFyY2hpdmUuCisgICAgICogQHBhcmFtIGZpbGVFbnRyaWVzIE1hcCAobmFtZSB0byByZXNvdXJjZSkgb2Ygbm9uLWRpcmVjdG9yeQorICAgICAqIHJlc291cmNlcyBmb3VuZCBpbnNpZGUgdGhlIGFyY2hpdmUuCisgICAgICogQHBhcmFtIG1hdGNoRmlsZUVudHJpZXMgTWFwIChuYW1lIHRvIHJlc291cmNlKSBvZiBub24tZGlyZWN0b3J5CisgICAgICogcmVzb3VyY2VzIGZvdW5kIGluc2lkZSB0aGUgYXJjaGl2ZSB0aGF0IG1hdGNoZWQgYWxsIGluY2x1ZGUKKyAgICAgKiBwYXR0ZXJucyBhbmQgZGlkbid0IG1hdGNoIGFueSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqIEBwYXJhbSBkaXJFbnRyaWVzIE1hcCAobmFtZSB0byByZXNvdXJjZSkgb2YgZGlyZWN0b3J5CisgICAgICogcmVzb3VyY2VzIGZvdW5kIGluc2lkZSB0aGUgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gbWF0Y2hEaXJFbnRyaWVzIE1hcCAobmFtZSB0byByZXNvdXJjZSkgb2YgZGlyZWN0b3J5CisgICAgICogcmVzb3VyY2VzIGZvdW5kIGluc2lkZSB0aGUgYXJjaGl2ZSB0aGF0IG1hdGNoZWQgYWxsIGluY2x1ZGUKKyAgICAgKiBwYXR0ZXJucyBhbmQgZGlkbid0IG1hdGNoIGFueSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxNYXBzRnJvbUFyY2hpdmUoUmVzb3VyY2UgYXJjaGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBmaWxlRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBtYXRjaEZpbGVFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGRpckVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbWF0Y2hEaXJFbnRyaWVzKTsKKworICAgIC8qKgorICAgICAqIGlmIHRoZSBkYXRldGltZSBvZiB0aGUgYXJjaGl2ZSBkaWQgbm90IGNoYW5nZSBzaW5jZQorICAgICAqIGxhc3RTY2FubmVkUmVzb3VyY2Ugd2FzIGluaXRpYWxpemVkIHJldHVybnMgaW1tZWRpYXRlbHkgZWxzZSBpZgorICAgICAqIHRoZSBhcmNoaXZlIGhhcyBub3QgYmVlbiBzY2FubmVkIHlldCwgdGhlbiBhbGwgdGhlIHppcCBlbnRyaWVzCisgICAgICogYXJlIHB1dCBpbnRvIHRoZSBhcHByb3ByaWF0ZSB0YWJsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNjYW5tZSgpIHsKKyAgICAgICAgLy9kbyBub3QgdXNlIGEgRmlsZVJlc291cmNlIGIvYyBpdCBwdWxscyBGaWxlIGluZm8gZnJvbSB0aGUgZmlsZXN5c3RlbToKKyAgICAgICAgUmVzb3VyY2UgdGhpc3Jlc291cmNlID0gbmV3IFJlc291cmNlKHNyYy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuaXNFeGlzdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRMYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIC8vIHNwYXJlIHNjYW5uaW5nIGFnYWluIGFuZCBhZ2FpbgorICAgICAgICBpZiAobGFzdFNjYW5uZWRSZXNvdXJjZSAhPSBudWxsCisgICAgICAgICAgICAmJiBsYXN0U2Nhbm5lZFJlc291cmNlLmdldE5hbWUoKS5lcXVhbHModGhpc3Jlc291cmNlLmdldE5hbWUoKSkKKyAgICAgICAgICAgICYmIGxhc3RTY2FubmVkUmVzb3VyY2UuZ2V0TGFzdE1vZGlmaWVkKCkKKyAgICAgICAgICAgID09IHRoaXNyZXNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGluaXQoKTsKKworICAgICAgICBmaWxlRW50cmllcy5jbGVhcigpOworICAgICAgICBkaXJFbnRyaWVzLmNsZWFyKCk7CisgICAgICAgIG1hdGNoRmlsZUVudHJpZXMuY2xlYXIoKTsKKyAgICAgICAgbWF0Y2hEaXJFbnRyaWVzLmNsZWFyKCk7CisgICAgICAgIGZpbGxNYXBzRnJvbUFyY2hpdmUoc3JjLCBlbmNvZGluZywgZmlsZUVudHJpZXMsIG1hdGNoRmlsZUVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyRW50cmllcywgbWF0Y2hEaXJFbnRyaWVzKTsKKworICAgICAgICAvLyByZWNvcmQgZGF0YSBhYm91dCB0aGUgbGFzdCBzY2FubmVkIHJlc291cmNlCisgICAgICAgIGxhc3RTY2FubmVkUmVzb3VyY2UgPSB0aGlzcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRyYWlsaW5nIHNsYXNoIGlmIHByZXNlbnQuCisgICAgICogQHBhcmFtIHMgdGhlIGZpbGUgbmFtZSB0byB0cmltLgorICAgICAqIEByZXR1cm4gdGhlIHRyaW1lZCBmaWxlIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgdHJpbVNlcGFyYXRvcihTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gcy5lbmRzV2l0aCgiLyIpID8gcy5zdWJzdHJpbmcoMCwgcy5sZW5ndGgoKSAtIDEpIDogczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fzc2VydGlvbnMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fzc2VydGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQwZDFlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXNzZXJ0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKKworLyoqCisgKiBUaGUgYXNzZXJ0aW9uIGRhdGF0eXBlLiBUaGlzIHR5cGUgZGVzY3JpYmVzCisgKiBhc3NlcnRpb24gc2V0dGluZ3MgZm9yIHRoZSAmbHQ7amF2YSZndDsgdGFzayBhbmQgb3RoZXJzLgorICogT25lIGNhbiBzZXQgdGhlIHN5c3RlbSBhc3NlcnRpb25zLCBhbmQgZW5hYmxlL2Rpc2FibGUgdGhvc2UgaW4KKyAqIHBhY2thZ2VzIGFuZCBjbGFzc2VzLgorICogQXNzZXJ0aW9ucyBjYW4gb25seSBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHdoZW4gZm9ya2luZyBKYXZhLgorICoKKyAqIEV4YW1wbGU6IHNldCBzeXN0ZW0gYXNzZXJ0aW9ucyBhbmQgYWxsIG9yZy5hcGFjaGUgcGFja2FnZXMgZXhjZXB0CisgKiBmb3IgYW50LCBhbmQgdGhlIGNsYXNzIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4uCisgKiA8cHJlPgorICogJmx0O2Fzc2VydGlvbnMgZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucz0idHJ1ZSIgJmd0OworICogICAmbHQ7ZW5hYmxlIHBhY2thZ2U9Im9yZy5hcGFjaGUiIC8mZ3Q7CisgKiAgICZsdDtkaXNhYmxlIHBhY2thZ2U9Im9yZy5hcGFjaGUuYW50IiAvJmd0OworICogICAmbHQ7ZW5hYmxlIGNsYXNzPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluIi8mZ3Q7CisgKiAmbHQ7L2Fzc2VydGlvbnMmZ3Q7CisgKjwvcHJlPgorICogRGlzYWJsZSBzeXN0ZW0gYXNzZXJ0aW9uczsgZW5hYmxlIHRob3NlIGluIHRoZSBhbm9ueW1vdXMgcGFja2FnZQorICogPHByZT4KKyAqICZsdDthc3NlcnRpb25zIGVuYWJsZVN5c3RlbUFzc2VydGlvbnM9ImZhbHNlIiAmZ3Q7CisgKiAgICZsdDtlbmFibGUgcGFja2FnZT0iLi4uIiAvJmd0OworICogJmx0Oy9hc3NlcnRpb25zJmd0OworICogPC9wcmU+CisgKiBlbmFibGUgYXNzZXJ0aW9ucyBpbiBhIGNsYXNzIGNhbGxlZCBUZXN0CisgKiA8cHJlPgorICogJmx0O2Fzc2VydGlvbnMgJmd0OworICogICAmbHQ7ZW5hYmxlIGNsYXNzPSJUZXN0IiAvJmd0OworICogJmx0Oy9hc3NlcnRpb25zJmd0OworICogPC9wcmU+CisgKiBUaGlzIHR5cGUgaXMgYSBkYXRhdHlwZSwgc28geW91IGNhbiBkZWNsYXJlIGFzc2VydGlvbnMgYW5kIHVzZSB0aGVtIGxhdGVyCisgKgorICogPHByZT4KKyAqICZsdDthc3NlcnRpb25zIGlkPSJwcm9qZWN0LmFzc2VydGlvbnMiICZndDsKKyAqICAgJmx0O2VuYWJsZSBwcm9qZWN0PSJvcmcuYXBhY2hlLnRlc3QiIC8mZ3Q7CisgKiAmbHQ7L2Fzc2VydGlvbnMmZ3Q7CisgKgorICogJmx0O2Fzc2VydGlvbnMgcmVmaWQ9InByb2plY3QuYXNzZXJ0aW9ucyIgLyZndDsKKyAqCisgKiA8L3ByZT4KKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBBc3NlcnRpb25zIGV4dGVuZHMgRGF0YVR5cGUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisgICAgLyoqCisgICAgICogZW5hYmxlL2Rpc2FibGUgc3lzIGFzc2VydGlvbnM7IG51bGwgbWVhbnMgdW5kZWZpbmVkCisgICAgICovCisgICAgcHJpdmF0ZSBCb29sZWFuIGVuYWJsZVN5c3RlbUFzc2VydGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBsaXN0IG9mIHR5cGUgQmFzZUFzc2VydGlvbgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0IGFzc2VydGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIGVuYWJsZSBhc3NlcnRpb25zCisgICAgICogQHBhcmFtIGFzc2VydGlvbiBhbiBlbmFibGUgYXNzZXJ0aW9uIG5lc3RlZCBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRW5hYmxlKEVuYWJsZWRBc3NlcnRpb24gYXNzZXJ0aW9uKSB7CisgICAgICAgIGNoZWNrQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIGFzc2VydGlvbkxpc3QuYWRkKGFzc2VydGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZGlzYWJsZSBhc3NlcnRpb25zCisgICAgICogQHBhcmFtIGFzc2VydGlvbiBhIGRpc2FibGUgYXNzZXJ0aW9uIG5lc3RlZCBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGlzYWJsZShEaXNhYmxlZEFzc2VydGlvbiBhc3NlcnRpb24pIHsKKyAgICAgICAgY2hlY2tDaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgYXNzZXJ0aW9uTGlzdC5hZGQoYXNzZXJ0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlbmFibGUgb3IgZGlzYWJsZSBzeXN0ZW0gYXNzZXJ0aW9ucy4KKyAgICAgKiBEZWZhdWx0IGlzIG5vdCBzZXQgKG5laXRoZXIgLWVuYWJsZXN5c3RlbWFzc2Vyc2lvbnMgb3IgLWRpc2FibGVzeXRlbWFzc2VydGlvbnMKKyAgICAgKiBhcmUgdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lKS4KKyAgICAgKiBAcGFyYW0gZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucyBpZiB0cnVlIGVuYWJsZSBzeXN0ZW0gYXNzZXJ0aW9ucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZVN5c3RlbUFzc2VydGlvbnMoQm9vbGVhbiBlbmFibGVTeXN0ZW1Bc3NlcnRpb25zKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgdGhpcy5lbmFibGVTeXN0ZW1Bc3NlcnRpb25zID0gZW5hYmxlU3lzdGVtQXNzZXJ0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSByZWZpZCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiA8cD5TdWJjbGFzc2VzIG1heSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgYW55IG90aGVyIGF0dHJpYnV0ZXMKKyAgICAgKiBoYXZlIGJlZW4gc2V0IGFzIHdlbGwgb3IgY2hpbGQgZWxlbWVudHMgaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kCisgICAgICogdGh1cyBvdmVycmlkZSB0aGlzIG1ldGhvZC4gaWYgdGhleSBkbyB0aGUgbXVzdCBjYWxsCisgICAgICogPGNvZGU+c3VwZXIuc2V0UmVmaWQ8L2NvZGU+LjwvcD4KKyAgICAgKiBAcGFyYW0gcmVmIHRoZSByZWZlcmVuY2UgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHJlZikgeworICAgICAgICBpZiAoYXNzZXJ0aW9uTGlzdC5zaXplKCkgPiAwIHx8IGVuYWJsZVN5c3RlbUFzc2VydGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyZWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCB3aGF0ZXZlciB3ZSBhcmUgcmVmZXJlbmNpbmcgdG8uIFRoaXMgY291bGQgYmUgb3Vyc2VsZi4KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgYXNzZXJ0aW9uIGluZm8KKyAgICAgKi8KKyAgICBwcml2YXRlIEFzc2VydGlvbnMgZ2V0RmluYWxSZWZlcmVuY2UoKSB7CisgICAgICAgIGlmIChnZXRSZWZpZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBnZXRSZWZpZCgpLmdldFJlZmVyZW5jZWRPYmplY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBBc3NlcnRpb25zKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicmVmZXJlbmNlIGlzIG9mIHdyb25nIHR5cGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoQXNzZXJ0aW9ucykgbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGhvdyBtYW55IGFzc2VydGlvbnMgYXJlIG1hZGUuLi53aWxsIHJlc29sdmUgcmVmZXJlbmNlcyBiZWZvcmUgcmV0dXJuaW5nCisgICAgICogQHJldHVybiB0b3RhbCAjIG9mIGNvbW1hbmRzIHRvIG1ha2UKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIEFzc2VydGlvbnMgY2xhdXNlID0gZ2V0RmluYWxSZWZlcmVuY2UoKTsKKyAgICAgICAgcmV0dXJuIGNsYXVzZS5nZXRGaW5hbFNpemUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHdoYXQgaXMgdGhlIGZpbmFsIHNpemUgb2YgdGhpcyBvYmplY3QKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0RmluYWxTaXplKCkgeworICAgICAgICByZXR1cm4gYXNzZXJ0aW9uTGlzdC5zaXplKCkgKyAoZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucyAhPSBudWxsID8gMSA6IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCB0aGUgYXNzZXJ0aW9ucyB0byBhIGxpc3QgaW4gYSBmb3JtYXQgc3VpdGFibGUKKyAgICAgKiBmb3IgYWRkaW5nIHRvIGEgY29tbWFuZCBsaW5lCisgICAgICogQHBhcmFtIGNvbW1hbmRMaXN0IHRoZSBjb21tYW5kIGxpbmUgdG8gZm9ybWF0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwbHlBc3NlcnRpb25zKExpc3QgY29tbWFuZExpc3QpIHsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiQXBwbHlpbmcgYXNzZXJ0aW9ucyIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgQXNzZXJ0aW9ucyBjbGF1c2UgPSBnZXRGaW5hbFJlZmVyZW5jZSgpOworICAgICAgICAvL2RvIHRoZSBzeXN0ZW0gYXNzZXJ0aW9ucworICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjbGF1c2UuZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucykpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIkVuYWJsaW5nIHN5c3RlbSBhc3NlcnRpb25zIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgY29tbWFuZExpc3QuYWRkKCItZW5hYmxlc3lzdGVtYXNzZXJ0aW9ucyIpOworICAgICAgICB9IGVsc2UgaWYgKEJvb2xlYW4uRkFMU0UuZXF1YWxzKGNsYXVzZS5lbmFibGVTeXN0ZW1Bc3NlcnRpb25zKSkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiZGlzYWJsaW5nIHN5c3RlbSBhc3NlcnRpb25zIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgY29tbWFuZExpc3QuYWRkKCItZGlzYWJsZXN5c3RlbWFzc2VydGlvbnMiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vbm93IGFueSBpbm5lciBhc3NlcnRpb25zCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gY2xhdXNlLmFzc2VydGlvbkxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgQmFzZUFzc2VydGlvbiBhc3NlcnRpb24gPSAoQmFzZUFzc2VydGlvbikgaXQubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIGFyZyA9IGFzc2VydGlvbi50b0NvbW1hbmQoKTsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coImFkZGluZyBhc3NlcnRpb24gIiArIGFyZywgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgY29tbWFuZExpc3QuYWRkKGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhcHBseSBhbGwgdGhlIGFzc2VydGlvbnMgdG8gdGhlIGNvbW1hbmQuCisgICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgbGluZSB0byBmb3JtYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBseUFzc2VydGlvbnMoQ29tbWFuZGxpbmVKYXZhIGNvbW1hbmQpIHsKKyAgICAgICAgQXNzZXJ0aW9ucyBjbGF1c2UgPSBnZXRGaW5hbFJlZmVyZW5jZSgpOworICAgICAgICAvL2RvIHRoZSBzeXN0ZW0gYXNzZXJ0aW9ucworICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjbGF1c2UuZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucykpIHsKKyAgICAgICAgICAgIGFkZFZtQXJndW1lbnQoY29tbWFuZCwgIi1lbmFibGVzeXN0ZW1hc3NlcnRpb25zIik7CisgICAgICAgIH0gZWxzZSBpZiAoQm9vbGVhbi5GQUxTRS5lcXVhbHMoY2xhdXNlLmVuYWJsZVN5c3RlbUFzc2VydGlvbnMpKSB7CisgICAgICAgICAgICBhZGRWbUFyZ3VtZW50KGNvbW1hbmQsICItZGlzYWJsZXN5c3RlbWFzc2VydGlvbnMiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vbm93IGFueSBpbm5lciBhc3NlcnRpb25zCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gY2xhdXNlLmFzc2VydGlvbkxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgQmFzZUFzc2VydGlvbiBhc3NlcnRpb24gPSAoQmFzZUFzc2VydGlvbikgaXQubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIGFyZyA9IGFzc2VydGlvbi50b0NvbW1hbmQoKTsKKyAgICAgICAgICAgIGFkZFZtQXJndW1lbnQoY29tbWFuZCwgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCB0aGUgYXNzZXJ0aW9ucyB0byBhIGxpc3QgaW4gYSBmb3JtYXQgc3VpdGFibGUKKyAgICAgKiBmb3IgYWRkaW5nIHRvIGEgY29tbWFuZCBsaW5lCisgICAgICogQHBhcmFtIGNvbW1hbmRJdGVyYXRvciBsaXN0IG9mIGNvbW1hbmRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwbHlBc3NlcnRpb25zKGZpbmFsIExpc3RJdGVyYXRvciBjb21tYW5kSXRlcmF0b3IpIHsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiQXBwbHlpbmcgYXNzZXJ0aW9ucyIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgQXNzZXJ0aW9ucyBjbGF1c2UgPSBnZXRGaW5hbFJlZmVyZW5jZSgpOworICAgICAgICAvL2RvIHRoZSBzeXN0ZW0gYXNzZXJ0aW9ucworICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjbGF1c2UuZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucykpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIkVuYWJsaW5nIHN5c3RlbSBhc3NlcnRpb25zIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgY29tbWFuZEl0ZXJhdG9yLmFkZCgiLWVuYWJsZXN5c3RlbWFzc2VydGlvbnMiKTsKKyAgICAgICAgfSBlbHNlIGlmIChCb29sZWFuLkZBTFNFLmVxdWFscyhjbGF1c2UuZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucykpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coImRpc2FibGluZyBzeXN0ZW0gYXNzZXJ0aW9ucyIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIGNvbW1hbmRJdGVyYXRvci5hZGQoIi1kaXNhYmxlc3lzdGVtYXNzZXJ0aW9ucyIpOworICAgICAgICB9CisKKyAgICAgICAgLy9ub3cgYW55IGlubmVyIGFzc2VydGlvbnMKKyAgICAgICAgSXRlcmF0b3IgaXQgPSBjbGF1c2UuYXNzZXJ0aW9uTGlzdC5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBCYXNlQXNzZXJ0aW9uIGFzc2VydGlvbiA9IChCYXNlQXNzZXJ0aW9uKSBpdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgYXJnID0gYXNzZXJ0aW9uLnRvQ29tbWFuZCgpOworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiYWRkaW5nIGFzc2VydGlvbiAiICsgYXJnLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICBjb21tYW5kSXRlcmF0b3IuYWRkKGFyZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBoZWxwZXIgbWV0aG9kIHRvIGFkZCBhIHN0cmluZyBKVk0gYXJndW1lbnQgdG8gYSBjb21tYW5kCisgICAgICogQHBhcmFtIGNvbW1hbmQKKyAgICAgKiBAcGFyYW0gYXJnCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRWbUFyZ3VtZW50KENvbW1hbmRsaW5lSmF2YSBjb21tYW5kLCBTdHJpbmcgYXJnKSB7CisgICAgICAgIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZ3VtZW50OworICAgICAgICBhcmd1bWVudCA9IGNvbW1hbmQuY3JlYXRlVm1Bcmd1bWVudCgpOworICAgICAgICBhcmd1bWVudC5zZXRWYWx1ZShhcmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNsb25lIHRoZSBvYmplY3RzLgorICAgICAqIFRoaXMgaXMgbm90IGEgZnVsbCBkZXB0aCBjbG9uZTsgdGhlIGxpc3Qgb2YgYXNzZXJ0aW9ucyBpcyBjbG9uZWQsCisgICAgICogYnV0IGl0IGRvZXMgbm90IGNsb25lIHRoZSB1bmRlcmx5aW5nIGFzc2VydGlvbnMuCisgICAgICogQHJldHVybiBhIGNsaQorICAgICAqIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgdGhlIHN1cGVyIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgY2xvbmluZworICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBBc3NlcnRpb25zIHRoYXQgPSAoQXNzZXJ0aW9ucykgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgdGhhdC5hc3NlcnRpb25MaXN0ID0gKEFycmF5TGlzdCkgYXNzZXJ0aW9uTGlzdC5jbG9uZSgpOworICAgICAgICByZXR1cm4gdGhhdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBiYXNlIGNsYXNzIGZvciBvdXIgYXNzZXJ0aW9uIGVsZW1lbnRzLgorICAgICAqLworCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCYXNlQXNzZXJ0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogbmFtZSBhIGNsYXNzCisgICAgICAgICAqIEBwYXJhbSBjbGFzc05hbWUgYSBjbGFzcyBuYW1lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBuYW1lIGEgcGFja2FnZQorICAgICAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgYSBwYWNrYWdlIG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogd2hhdCBpcyB0aGUgY2xhc3MgbmFtZT8KKyAgICAgICAgICogQHJldHVybiBjbGFzc25hbWUgb3IgbnVsbAorICAgICAgICAgKiBAc2VlICNzZXRDbGFzcworICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHdoYXQgaXMgdGhlIHBhY2thZ2UgbmFtZT8KKyAgICAgICAgICogQHJldHVybiBwYWNrYWdlIG5hbWUgb3IgbnVsbAorICAgICAgICAgKiBAc2VlICNzZXRQYWNrYWdlCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGdldCB0aGUgcHJlZml4IHVzZWQgdG8gYmVnaW4gdGhlIGNvbW1hbmQ7IC1lYSBvciAtZGEuCisgICAgICAgICAqIEByZXR1cm4gcHJlZml4CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENvbW1hbmRQcmVmaXgoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogY3JlYXRlIGEgZnVsbCBjb21tYW5kIHN0cmluZyBmcm9tIHRoaXMgY2xhc3MKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHRyb3VibGUKKyAgICAgICAgICogQHJldHVybiBUaGUgY29tbWFuZCBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9Db21tYW5kKCkgeworICAgICAgICAgICAgLy9jYXRjaCBpbnZhbGlkbmVzcworICAgICAgICAgICAgaWYgKGdldFBhY2thZ2VOYW1lKCkgIT0gbnVsbCAmJiBnZXRDbGFzc05hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCb3RoIHBhY2thZ2UgYW5kIGNsYXNzIGhhdmUgYmVlbiBzZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjb21tYW5kID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRDb21tYW5kUHJlZml4KCkpOworICAgICAgICAgICAgLy9zZWUgaWYgaXQgaXMgYSBwYWNrYWdlIG9yIGEgY2xhc3MKKyAgICAgICAgICAgIGlmIChnZXRQYWNrYWdlTmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvL3BhY2thZ2VzIGdldCBhIC4uLiBwcmVmaXgKKyAgICAgICAgICAgICAgICBjb21tYW5kLmFwcGVuZCgnOicpOworICAgICAgICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKGdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAgICAgICAgIGlmICghY29tbWFuZC50b1N0cmluZygpLmVuZHNXaXRoKCIuLi4iKSkgeworICAgICAgICAgICAgICAgICAgICAvL2FwcGVuZCB0aGUgLi4uIHN1ZmZpeCBpZiBub3QgdGhlcmUgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICBjb21tYW5kLmFwcGVuZCgiLi4uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRDbGFzc05hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy9jbGFzc2VzIGp1c3QgZ2V0IHRoZSBjbGFzc25hbWUKKyAgICAgICAgICAgICAgICBjb21tYW5kLmFwcGVuZCgnOicpOworICAgICAgICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKGdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb21tYW5kLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGFuIGVuYWJsZWQgYXNzZXJ0aW9uIGVuYWJsZXMgdGhpbmdzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbmFibGVkQXNzZXJ0aW9uIGV4dGVuZHMgQmFzZUFzc2VydGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBnZXQgdGhlIHByZWZpeCB1c2VkIHRvIGJlZ2luIHRoZSBjb21tYW5kOyAtZWEgb3IgLWRhLgorICAgICAgICAgKiBAcmV0dXJuIHByZWZpeAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb21tYW5kUHJlZml4KCkgeworICAgICAgICAgICAgcmV0dXJuICItZWEiOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGRpc2FibGVkIGFzc2VydGlvbiBkaXNhYmxlcyB0aGluZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpc2FibGVkQXNzZXJ0aW9uIGV4dGVuZHMgQmFzZUFzc2VydGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBnZXQgdGhlIHByZWZpeCB1c2VkIHRvIGJlZ2luIHRoZSBjb21tYW5kOyAtZWEgb3IgLWRhLgorICAgICAgICAgKiBAcmV0dXJuIHByZWZpeAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb21tYW5kUHJlZml4KCkgeworICAgICAgICAgICAgcmV0dXJuICItZGEiOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTI4MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmUuamF2YQpAQCAtMCwwICsxLDYyMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKKworLyoqCisgKiBDb21tYW5kbGluZSBvYmplY3RzIGhlbHAgaGFuZGxpbmcgY29tbWFuZCBsaW5lcyBzcGVjaWZ5aW5nIHByb2Nlc3NlcyB0bworICogZXhlY3V0ZS4KKyAqCisgKiBUaGUgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGEgY29tbWFuZCBsaW5lIGFzIG5lc3RlZCBlbGVtZW50cyBvciBhcyBhCisgKiBoZWxwZXIgdG8gZGVmaW5lIGEgY29tbWFuZCBsaW5lIGJ5IGFuIGFwcGxpY2F0aW9uLgorICogPHA+CisgKiA8Y29kZT4KKyAqICZsdDtzb21lZWxlbWVudCZndDs8YnI+CisgKiAmbmJzcDsmbmJzcDsmbHQ7YWNvbW1hbmRsaW5lIGV4ZWN1dGFibGU9Ii9leGVjdXRhYmxlL3RvL3J1biImZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2FyZ3VtZW50IHZhbHVlPSJhcmd1bWVudCAxIiAvJmd0Ozxicj4KKyAqICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthcmd1bWVudCBsaW5lPSJhcmd1bWVudF8xIGFyZ3VtZW50XzIgYXJndW1lbnRfMyIgLyZndDs8YnI+CisgKiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YXJndW1lbnQgdmFsdWU9ImFyZ3VtZW50IDQiIC8mZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jmx0Oy9hY29tbWFuZGxpbmUmZ3Q7PGJyPgorICogJmx0Oy9zb21lZWxlbWVudCZndDs8YnI+CisgKiA8L2NvZGU+CisgKiBUaGUgZWxlbWVudCA8Y29kZT5zb21lZWxlbWVudDwvY29kZT4gbXVzdCBwcm92aWRlIGEgbWV0aG9kCisgKiA8Y29kZT5jcmVhdGVBY29tbWFuZGxpbmU8L2NvZGU+IHdoaWNoIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tYW5kbGluZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgLyoqIHdpbjl4IHVzZXMgYSAoc2h1ZGRlcikgYmF0IGZpbGUgKGFudFJ1bi5iYXQpIGZvciBleGVjdXRpbmcgY29tbWFuZHMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1dJTl85WCA9IE9zLmlzRmFtaWx5KCJ3aW45eCIpOworCisgICAgLyoqCisgICAgICogVGhlIGFyZ3VtZW50cyBvZiB0aGUgY29tbWFuZAorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIGFyZ3VtZW50cyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBleGVjdXRhYmxlID0gbnVsbDsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NMQUlNRVIgPQorICAgICAgICBTdHJpbmdVdGlscy5MSU5FX1NFUAorICAgICAgICArICJUaGUgXCcgY2hhcmFjdGVycyBhcm91bmQgdGhlIGV4ZWN1dGFibGUgYW5kIGFyZ3VtZW50cyBhcmUiCisgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKKyAgICAgICAgKyAibm90IHBhcnQgb2YgdGhlIGNvbW1hbmQuIgorICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY29tbWFuZCBsaW5lIGZyb20gYSBzdHJpbmcuCisgICAgICogQHBhcmFtIHRvUHJvY2VzcyB0aGUgbGluZTogdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgZXhlY3V0YWJsZSwgdGhlIHJlc3QKKyAgICAgKiB0aGUgYXJndW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBDb21tYW5kbGluZShTdHJpbmcgdG9Qcm9jZXNzKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIFN0cmluZ1tdIHRtcCA9IHRyYW5zbGF0ZUNvbW1hbmRsaW5lKHRvUHJvY2Vzcyk7CisgICAgICAgIGlmICh0bXAgIT0gbnVsbCAmJiB0bXAubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgc2V0RXhlY3V0YWJsZSh0bXBbMF0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0bXAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHRtcFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQ3JlYXRlIGFuIGVtcHR5IGNvbW1hbmQgbGluZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tbWFuZGxpbmUoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBmb3IgbmVzdGVkIHhtbCBjb21tYW5kIGxpbmUgZGVmaW5pdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmd1bWVudCBleHRlbmRzIFByb2plY3RDb21wb25lbnQgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gcGFydHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIHNpbmdsZSBjb21tYW5kbGluZSBhcmd1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIGEgc2luZ2xlIGNvbW1hbmRsaW5lIGFyZ3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBwYXJ0cyA9IG5ldyBTdHJpbmdbXSB7dmFsdWV9OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgbGluZSB0byBzcGxpdCBpbnRvIHNldmVyYWwgY29tbWFuZGxpbmUgYXJndW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbGluZSBsaW5lIHRvIHNwbGl0IGludG8gc2V2ZXJhbCBjb21tYW5kbGluZSBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaW5lKFN0cmluZyBsaW5lKSB7CisgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFydHMgPSB0cmFuc2xhdGVDb21tYW5kbGluZShsaW5lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgYSBzaW5nbGUgY29tbWFuZGxpbmUgYXJndW1lbnQgYW5kIHRyZWF0cyBpdCBsaWtlIGEKKyAgICAgICAgICogUEFUSC0tZW5zdXJpbmcgdGhlIHJpZ2h0IHNlcGFyYXRvciBmb3IgdGhlIGxvY2FsIHBsYXRmb3JtCisgICAgICAgICAqIGlzIHVzZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBhIHNpbmdsZSBjb21tYW5kbGluZSBhcmd1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoUGF0aCB2YWx1ZSkgeworICAgICAgICAgICAgcGFydHMgPSBuZXcgU3RyaW5nW10ge3ZhbHVlLnRvU3RyaW5nKCl9OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIHNpbmdsZSBjb21tYW5kbGluZSBhcmd1bWVudCBmcm9tIGEgcmVmZXJlbmNlIHRvIGEKKyAgICAgICAgICogcGF0aC0tZW5zdXJpbmcgdGhlIHJpZ2h0IHNlcGFyYXRvciBmb3IgdGhlIGxvY2FsIHBsYXRmb3JtCisgICAgICAgICAqIGlzIHVzZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBhIHNpbmdsZSBjb21tYW5kbGluZSBhcmd1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGhyZWYoUmVmZXJlbmNlIHZhbHVlKSB7CisgICAgICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgcC5zZXRSZWZpZCh2YWx1ZSk7CisgICAgICAgICAgICBwYXJ0cyA9IG5ldyBTdHJpbmdbXSB7cC50b1N0cmluZygpfTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgYSBzaW5nbGUgY29tbWFuZGxpbmUgYXJndW1lbnQgdG8gdGhlIGFic29sdXRlIGZpbGVuYW1lCisgICAgICAgICAqIG9mIHRoZSBnaXZlbiBmaWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgYSBzaW5nbGUgY29tbWFuZGxpbmUgYXJndW1lbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgdmFsdWUpIHsKKyAgICAgICAgICAgIHBhcnRzID0gbmV3IFN0cmluZ1tdIHt2YWx1ZS5nZXRBYnNvbHV0ZVBhdGgoKX07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBjb25zdGl0dWVudCBwYXJ0cyBvZiB0aGlzIEFyZ3VtZW50LgorICAgICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFydHMoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFydHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBwb3NpdGlvbiBvZiBhbiBBcmd1bWVudC4KKyAgICAgPHA+VGhpcyBjbGFzcyBpcyB0aGVyZSB0byBzdXBwb3J0IHRoZSBzcmNmaWxlIGFuZCB0YXJnZXRmaWxlCisgICAgIGVsZW1lbnRzIG9mICZsdDtleGVjb24mZ3Q7IGFuZCAmbHQ7dHJhbnNmb3JtJmd0OyAtIGRvbid0IGtub3cKKyAgICAgd2hldGhlciB0aGVyZSBtaWdodCBiZSBhZGRpdGlvbmFsIHVzZSBjYXNlcy48L3A+IC0tU0IKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTWFya2VyIHsKKworICAgICAgICBwcml2YXRlIGludCBwb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcmVhbFBvcyA9IC0xOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBtYXJrZXIgZm9yIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisgICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gdG8gbWFyay4KKyAgICAgICAgICovCisgICAgICAgIE1hcmtlcihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhhdCBwcmVjZWRlZCB0aGlzIG1hcmtlci4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgLS0gaWYgc2V0IC0tIGlzIGNvdW50ZWQgYXMgdGhlCisgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50LjwvcD4KKyAgICAgICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhpcyBtYXJrZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgeworICAgICAgICAgICAgaWYgKHJlYWxQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZWFsUG9zID0gKGV4ZWN1dGFibGUgPT0gbnVsbCA/IDAgOiAxKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9uOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQXJndW1lbnQgYXJnID0gKEFyZ3VtZW50KSBhcmd1bWVudHMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgICAgICByZWFsUG9zICs9IGFyZy5nZXRQYXJ0cygpLmxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVhbFBvczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBhcmd1bWVudCBvYmplY3QuCisgICAgICoKKyAgICAgKiA8cD5FYWNoIGNvbW1hbmRsaW5lIG9iamVjdCBoYXMgYXQgbW9zdCBvbmUgaW5zdGFuY2Ugb2YgdGhlCisgICAgICogYXJndW1lbnQgY2xhc3MuICBUaGlzIG1ldGhvZCBjYWxscworICAgICAqIDxjb2RlPnRoaXMuY3JlYXRlQXJndW1lbnQoZmFsc2UpPC9jb2RlPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNjcmVhdGVBcmd1bWVudChib29sZWFuKQorICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJndW1lbnQgY3JlYXRlQXJndW1lbnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFyZ3VtZW50KGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gYXJndW1lbnQgb2JqZWN0IGFuZCBhZGQgaXQgdG8gb3VyIGxpc3Qgb2YgYXJncy4KKyAgICAgKgorICAgICAqIDxwPkVhY2ggY29tbWFuZGxpbmUgb2JqZWN0IGhhcyBhdCBtb3N0IG9uZSBpbnN0YW5jZSBvZiB0aGUKKyAgICAgKiBhcmd1bWVudCBjbGFzcy48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zZXJ0QXRTdGFydCBpZiB0cnVlLCB0aGUgYXJndW1lbnQgaXMgaW5zZXJ0ZWQgYXQgdGhlCisgICAgICogYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG9mIGFyZ3MsIG90aGVyd2lzZSBpdCBpcyBhcHBlbmRlZC4KKyAgICAgKiBAcmV0dXJuIGFuIGFyZ3VtZW50IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJndW1lbnQgY3JlYXRlQXJndW1lbnQoYm9vbGVhbiBpbnNlcnRBdFN0YXJ0KSB7CisgICAgICAgIEFyZ3VtZW50IGFyZ3VtZW50ID0gbmV3IEFyZ3VtZW50KCk7CisgICAgICAgIGlmIChpbnNlcnRBdFN0YXJ0KSB7CisgICAgICAgICAgICBhcmd1bWVudHMuaW5zZXJ0RWxlbWVudEF0KGFyZ3VtZW50LCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ3VtZW50cy5hZGRFbGVtZW50KGFyZ3VtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJndW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBleGVjdXRhYmxlIHRvIHJ1bi4gQWxsIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgc3RyaW5nCisgICAgICogYXJlIGNvbnZlcnRlZCB0byB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgdmFsdWUuCisgICAgICogQHBhcmFtIGV4ZWN1dGFibGUgdGhlIFN0cmluZyBleGVjdXRhYmxlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgZXhlY3V0YWJsZSkgeworICAgICAgICBpZiAoZXhlY3V0YWJsZSA9PSBudWxsIHx8IGV4ZWN1dGFibGUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRoaXMuZXhlY3V0YWJsZSA9IGV4ZWN1dGFibGUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikKKyAgICAgICAgICAgIC5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBleGVjdXRhYmxlLgorICAgICAqIEByZXR1cm4gdGhlIHByb2dyYW0gdG8gcnVuLS1udWxsIGlmIG5vdCB5ZXQgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBhcmd1bWVudHMgdG8gdGhlIGV4aXN0aW5nIGNvbW1hbmQuCisgICAgICogQHBhcmFtIGxpbmUgYW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGFwcGVuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBcmd1bWVudHMoU3RyaW5nW10gbGluZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobGluZVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4ZWN1dGFibGUgYW5kIGFsbCBkZWZpbmVkIGFyZ3VtZW50cy4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kbGluZSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb21tYW5kbGluZSgpIHsKKyAgICAgICAgTGlzdCBjb21tYW5kcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIExpc3RJdGVyYXRvciBsaXN0ID0gY29tbWFuZHMubGlzdEl0ZXJhdG9yKCk7CisgICAgICAgIGFkZENvbW1hbmRUb0xpc3QobGlzdCk7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY29tbWFuZHMuc2l6ZSgpXTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgY29tbWFuZHMudG9BcnJheShyZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZW50aXJlIGNvbW1hbmQsIGluY2x1ZGluZyAob3B0aW9uYWwpIGV4ZWN1dGFibGUgdG8gYSBsaXN0LgorICAgICAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IHRvIGFkZCB0by4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbW1hbmRUb0xpc3QoTGlzdEl0ZXJhdG9yIGxpc3QpIHsKKyAgICAgICAgaWYgKGV4ZWN1dGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdC5hZGQoZXhlY3V0YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkQXJndW1lbnRzVG9MaXN0KGxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIGFyZ3VtZW50cyBkZWZpbmVkIGJ5IDxjb2RlPmFkZExpbmU8L2NvZGU+LAorICAgICAqIDxjb2RlPmFkZFZhbHVlPC9jb2RlPiBvciB0aGUgYXJndW1lbnQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50cyBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKSB7CisgICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChhcmd1bWVudHMuc2l6ZSgpICogMik7CisgICAgICAgIGFkZEFyZ3VtZW50c1RvTGlzdChyZXN1bHQubGlzdEl0ZXJhdG9yKCkpOworICAgICAgICBTdHJpbmcgW10gcmVzID0gbmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0LnRvQXJyYXkocmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYWxsIHRoZSBhcmd1bWVudHMgdG8gdGhlIHRhaWwgb2YgYSBzdXBwbGllZCBsaXN0LgorICAgICAqIEBwYXJhbSBsaXN0IHRoZSBsaXN0IG9mIGFyZ3VtZW50cy4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50c1RvTGlzdChMaXN0SXRlcmF0b3IgbGlzdCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQXJndW1lbnQgYXJnID0gKEFyZ3VtZW50KSBhcmd1bWVudHMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgU3RyaW5nW10gcyA9IGFyZy5nZXRQYXJ0cygpOworICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbW1hbmQgbGluZSBhcyBhIHN0cmluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKGdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dCBxdW90ZXMgYXJvdW5kIHRoZSBnaXZlbiBTdHJpbmcgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogPHA+SWYgdGhlIGFyZ3VtZW50IGRvZXNuJ3QgaW5jbHVkZSBzcGFjZXMgb3IgcXVvdGVzLCByZXR1cm4gaXQKKyAgICAgKiBhcyBpcy4gSWYgaXQgY29udGFpbnMgZG91YmxlIHF1b3RlcywgdXNlIHNpbmdsZSBxdW90ZXMgLSBlbHNlCisgICAgICogc3Vycm91bmQgdGhlIGFyZ3VtZW50IGJ5IGRvdWJsZSBxdW90ZXMuPC9wPgorICAgICAqIEBwYXJhbSBhcmd1bWVudCB0aGUgYXJndW1lbnQgdG8gcXVvdGUgaWYgbmVjZXNzYXJ5LgorICAgICAqIEByZXR1cm4gdGhlIHF1b3RlZCBhcmd1bWVudC4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBjb250YWlucyBib3RoLCBzaW5nbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkb3VibGUgcXVvdGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlQXJndW1lbnQoU3RyaW5nIGFyZ3VtZW50KSB7CisgICAgICAgIGlmIChhcmd1bWVudC5pbmRleE9mKCJcIiIpID4gLTEpIHsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudC5pbmRleE9mKCJcJyIpID4gLTEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhblwndCBoYW5kbGUgc2luZ2xlIGFuZCBkb3VibGUiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcXVvdGVzIGluIHNhbWUgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICdcJycgKyBhcmd1bWVudCArICdcJyc7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnQuaW5kZXhPZigiXCciKSA+IC0xCisgICAgICAgICAgICAgICAgICAgfHwgYXJndW1lbnQuaW5kZXhPZigiICIpID4gLTEKKyAgICAgICAgICAgICAgICAgICAvLyBXSU45eCB1c2VzIGEgYmF0IGZpbGUgZm9yIGV4ZWN1dGluZyBjb21tYW5kcworICAgICAgICAgICAgICAgICAgIHx8IChJU19XSU5fOVggJiYgYXJndW1lbnQuaW5kZXhPZignOycpICE9IC0xKSkgeworICAgICAgICAgICAgcmV0dXJuICdcIicgKyBhcmd1bWVudCArICdcIic7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYXJndW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdW90ZSB0aGUgcGFydHMgb2YgdGhlIGdpdmVuIGFycmF5IGluIHdheSB0aGF0IG1ha2VzIHRoZW0KKyAgICAgKiB1c2FibGUgYXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGlzdCBvZiBhcmd1bWVudHMgdG8gcXVvdGUuCisgICAgICogQHJldHVybiBlbXB0eSBzdHJpbmcgZm9yIG51bGwgb3Igbm8gY29tbWFuZCwgZWxzZSBldmVyeSBhcmd1bWVudCBzcGxpdAorICAgICAqIGJ5IHNwYWNlcyBhbmQgcXVvdGVkIGJ5IHF1b3RpbmcgcnVsZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nW10gbGluZSkgeworICAgICAgICAvLyBlbXB0eSBwYXRoIHJldHVybiBlbXB0eSBzdHJpbmcKKyAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCB8fCBsaW5lLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgLy8gcGF0aCBjb250YWluaW5nIG9uZSBvciBtb3JlIGVsZW1lbnRzCisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChxdW90ZUFyZ3VtZW50KGxpbmVbaV0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JhY2sgYSBjb21tYW5kIGxpbmUuCisgICAgICogQHBhcmFtIHRvUHJvY2VzcyB0aGUgY29tbWFuZCBsaW5lIHRvIHByb2Nlc3MuCisgICAgICogQHJldHVybiB0aGUgY29tbWFuZCBsaW5lIGJyb2tlbiBpbnRvIHN0cmluZ3MuCisgICAgICogQW4gZW1wdHkgb3IgbnVsbCB0b1Byb2Nlc3MgcGFyYW1ldGVyIHJlc3VsdHMgaW4gYSB6ZXJvIHNpemVkIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdHJhbnNsYXRlQ29tbWFuZGxpbmUoU3RyaW5nIHRvUHJvY2VzcykgeworICAgICAgICBpZiAodG9Qcm9jZXNzID09IG51bGwgfHwgdG9Qcm9jZXNzLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIC8vbm8gY29tbWFuZD8gbm8gc3RyaW5nCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICAvLyBwYXJzZSB3aXRoIGEgc2ltcGxlIGZpbml0ZSBzdGF0ZSBtYWNoaW5lCisKKyAgICAgICAgZmluYWwgaW50IG5vcm1hbCA9IDA7CisgICAgICAgIGZpbmFsIGludCBpblF1b3RlID0gMTsKKyAgICAgICAgZmluYWwgaW50IGluRG91YmxlUXVvdGUgPSAyOworICAgICAgICBpbnQgc3RhdGUgPSBub3JtYWw7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRvUHJvY2VzcywgIlwiXCcgIiwgdHJ1ZSk7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICBTdHJpbmdCdWZmZXIgY3VycmVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBsYXN0VG9rZW5IYXNCZWVuUXVvdGVkID0gZmFsc2U7CisKKyAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuZXh0VG9rID0gdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBpblF1b3RlOgorICAgICAgICAgICAgICAgIGlmICgiXCciLmVxdWFscyhuZXh0VG9rKSkgeworICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW5IYXNCZWVuUXVvdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBub3JtYWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hcHBlbmQobmV4dFRvayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBpbkRvdWJsZVF1b3RlOgorICAgICAgICAgICAgICAgIGlmICgiXCIiLmVxdWFscyhuZXh0VG9rKSkgeworICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW5IYXNCZWVuUXVvdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBub3JtYWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hcHBlbmQobmV4dFRvayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoIlwnIi5lcXVhbHMobmV4dFRvaykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBpblF1b3RlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIlwiIi5lcXVhbHMobmV4dFRvaykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBpbkRvdWJsZVF1b3RlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIiAiLmVxdWFscyhuZXh0VG9rKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFRva2VuSGFzQmVlblF1b3RlZCB8fCBjdXJyZW50Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudChjdXJyZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYXBwZW5kKG5leHRUb2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0VG9rZW5IYXNCZWVuUXVvdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhc3RUb2tlbkhhc0JlZW5RdW90ZWQgfHwgY3VycmVudC5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoY3VycmVudC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUgPT0gaW5RdW90ZSB8fCBzdGF0ZSA9PSBpbkRvdWJsZVF1b3RlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInVuYmFsYW5jZWQgcXVvdGVzIGluICIgKyB0b1Byb2Nlc3MpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW3Yuc2l6ZSgpXTsKKyAgICAgICAgdi5jb3B5SW50byhhcmdzKTsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2l6ZSBvcGVyYXRvci4gVGhpcyBhY3R1YWxseSBjcmVhdGVzIHRoZSBjb21tYW5kIGxpbmUsIHNvIGl0IGlzIG5vdAorICAgICAqIGEgemVybyBjb3N0IG9wZXJhdGlvbi4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29tbWFuZCwgaW5jbHVkaW5nIHRoZSBleGVjdXRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbW1hbmRsaW5lKCkubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGEgZGVlcCBjbG9uZSBvZiB0aGUgY29udGFpbmVkIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIGEgY2xvbmUgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29tbWFuZGxpbmUgYyA9IChDb21tYW5kbGluZSkgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgIGMuYXJndW1lbnRzID0gKFZlY3RvcikgYXJndW1lbnRzLmNsb25lKCk7CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgb3V0IHRoZSB3aG9sZSBjb21tYW5kIGxpbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGV4ZWN1dGFibGUgPSBudWxsOworICAgICAgICBhcmd1bWVudHMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBvdXQgdGhlIGFyZ3VtZW50cyBidXQgbGVhdmUgdGhlIGV4ZWN1dGFibGUgaW4gcGxhY2UgZm9yCisgICAgICogYW5vdGhlciBvcGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJBcmdzKCkgeworICAgICAgICBhcmd1bWVudHMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBtYXJrZXIuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1hcmtlciBjYW4gYmUgdXNlZCB0byBsb2NhdGUgYSBwb3NpdGlvbiBvbiB0aGUKKyAgICAgKiBjb21tYW5kbGluZS0tdG8gaW5zZXJ0IHNvbWV0aGluZyBmb3IgZXhhbXBsZS0td2hlbiBhbGwKKyAgICAgKiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBzZXQuPC9wPgorICAgICAqIEByZXR1cm4gYSBtYXJrZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFya2VyIGNyZWF0ZU1hcmtlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXJrZXIoYXJndW1lbnRzLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgc3VpdGFibGUgZm9yCisgICAgICogdmVyYm9zZSBvdXRwdXQgYmVmb3JlIGEgY2FsbCB0byA8Y29kZT5SdW50aW1lLmV4ZWMoU3RyaW5nW10pPGNvZGU+LgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cy4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpYmVDb21tYW5kKCkgeworICAgICAgICByZXR1cm4gZGVzY3JpYmVDb21tYW5kKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgYXJndW1lbnRzIHN1aXRhYmxlIGZvcgorICAgICAqIHZlcmJvc2Ugb3V0cHV0IGJlZm9yZSBhIGNhbGwgdG8gPGNvZGU+UnVudGltZS5leGVjKFN0cmluZ1tdKTxjb2RlPi4KKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBhcmd1bWVudHMuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gZGVzY3JpYmVBcmd1bWVudHModGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgc3VpdGFibGUgZm9yCisgICAgICogdmVyYm9zZSBvdXRwdXQgYmVmb3JlIGEgY2FsbCB0byA8Y29kZT5SdW50aW1lLmV4ZWMoU3RyaW5nW10pPGNvZGU+LgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBDb21tYW5kbGluZSB0byBkZXNjcmliZS4KKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmliZUNvbW1hbmQoQ29tbWFuZGxpbmUgbGluZSkgeworICAgICAgICByZXR1cm4gZGVzY3JpYmVDb21tYW5kKGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBhcmd1bWVudHMgc3VpdGFibGUgZm9yCisgICAgICogdmVyYm9zZSBvdXRwdXQgYmVmb3JlIGEgY2FsbCB0byA8Y29kZT5SdW50aW1lLmV4ZWMoU3RyaW5nW10pPGNvZGU+LgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBDb21tYW5kbGluZSB3aG9zZSBhcmd1bWVudHMgdG8gZGVzY3JpYmUuCisgICAgICogQHJldHVybiBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgYXJndW1lbnRzLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpYmVBcmd1bWVudHMoQ29tbWFuZGxpbmUgbGluZSkgeworICAgICAgICByZXR1cm4gZGVzY3JpYmVBcmd1bWVudHMobGluZS5nZXRBcmd1bWVudHMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgc3VpdGFibGUgZm9yCisgICAgICogdmVyYm9zZSBvdXRwdXQgYmVmb3JlIGEgY2FsbCB0byA8Y29kZT5SdW50aW1lLmV4ZWMoU3RyaW5nW10pPGNvZGU+LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgdGhlCisgICAgICogZXhlY3V0YWJsZSB0byBydW4uPC9wPgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgdG8gZGVzY3JpYmUgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncworICAgICAqIEByZXR1cm4gYSBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cy4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaWJlQ29tbWFuZChTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJFeGVjdXRpbmcgXCciKTsKKyAgICAgICAgYnVmLmFwcGVuZChhcmdzWzBdKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiXCciKTsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIHdpdGggIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGRlc2NyaWJlQXJndW1lbnRzKGFyZ3MsIDEpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoRElTQ0xBSU1FUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgYXJndW1lbnRzIHN1aXRhYmxlIGZvcgorICAgICAqIHZlcmJvc2Ugb3V0cHV0IGJlZm9yZSBhIGNhbGwgdG8gPGNvZGU+UnVudGltZS5leGVjKFN0cmluZ1tdKTxjb2RlPi4KKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZCBsaW5lIHRvIGRlc2NyaWJlIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgICAgICogQHJldHVybiBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgYXJndW1lbnRzLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpYmVBcmd1bWVudHMoU3RyaW5nW10gYXJncykgeworICAgICAgICByZXR1cm4gZGVzY3JpYmVBcmd1bWVudHMoYXJncywgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBhcmd1bWVudHMgc3VpdGFibGUgZm9yCisgICAgICogdmVyYm9zZSBvdXRwdXQgYmVmb3JlIGEgY2FsbCB0byA8Y29kZT5SdW50aW1lLmV4ZWMoU3RyaW5nW10pPGNvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIGNvbW1hbmQgbGluZSB0byBkZXNjcmliZSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorICAgICAqIEBwYXJhbSBvZmZzZXQgaWdub3JlIGVudHJpZXMgYmVmb3JlIHRoaXMgaW5kZXguCisgICAgICogQHJldHVybiBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgYXJndW1lbnRzCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGRlc2NyaWJlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MsIGludCBvZmZzZXQpIHsKKyAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA8PSBvZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiYXJndW1lbnQiKTsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gb2Zmc2V0KSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJzIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiOiIpLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcJyIpLmFwcGVuZChhcmdzW2ldKS5hcHBlbmQoIlwnIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKERJU0NMQUlNRVIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBhcmd1bWVudHMgbGlzdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gYXJndW1lbnRzLml0ZXJhdG9yKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZUphdmEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFhNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhLmphdmEKQEAgLTAsMCArMSw2OTkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBKYXZhIGNvbW1hbmQgbGluZSB0aGF0IGlzCisgKiBhIGNvbXBvc2l0ZSBvZiAyIDx0dD5Db21tYW5kbGluZTwvdHQ+cy4gT25lIGlzIHVzZWQgZm9yIHRoZQorICogdm0vb3B0aW9ucyBhbmQgb25lIGZvciB0aGUgY2xhc3NuYW1lL2FyZ3VtZW50cy4gSXQgcHJvdmlkZXMKKyAqIHNwZWNpZmljIG1ldGhvZHMgZm9yIGEgSmF2YSBjb21tYW5kIGxpbmUuCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29tbWFuZGxpbmVKYXZhIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgIC8qKgorICAgICAqIGNvbW1hbmRzIHRvIHRoZSBKVk0KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbW1hbmRsaW5lIHZtQ29tbWFuZCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgIC8qKgorICAgICAqIGFjdHVhbCBqYXZhIGNvbW1hbmRzCisgICAgICovCisgICAgcHJpdmF0ZSBDb21tYW5kbGluZSBqYXZhQ29tbWFuZCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgIC8qKgorICAgICAqIHByb3BlcnRpZXMgdG8gYWRkIHVzaW5nIC1ECisgICAgICovCisgICAgcHJpdmF0ZSBTeXNQcm9wZXJ0aWVzIHN5c1Byb3BlcnRpZXMgPSBuZXcgU3lzUHJvcGVydGllcygpOworICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGggPSBudWxsOworICAgIHByaXZhdGUgUGF0aCBib290Y2xhc3NwYXRoID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyB2bVZlcnNpb247CisgICAgcHJpdmF0ZSBTdHJpbmcgbWF4TWVtb3J5ID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiAgYW55IGFzc2VydGlvbnMgdG8gbWFrZT8gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGluIGZvcmtlZCBKVk1zCisgICAgICovCisgICAgcHJpdmF0ZSBBc3NlcnRpb25zIGFzc2VydGlvbnMgPSBudWxsOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGUgd2hldGhlciBpdCB3aWxsIGV4ZWN1dGUgYSBqYXIgZmlsZSBvciBub3QsIGluIHRoaXMgY2FzZQorICAgICAqIHRoZSBmaXJzdCB2bSBvcHRpb24gbXVzdCBiZSBhIC1qYXIgYW5kIHRoZSAnZXhlY3V0YWJsZScgaXMgYSBqYXIgZmlsZS4KKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVKYXIgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgc3lzdGVtIHByb3BlcnRpZXMgYW5kIGJvb3RjbGFzc3BhdGggc2hhbGwgYmUgY2xvbmVkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNsb25lVm0gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemVkIEVudmlyb25tZW50IGNsYXNzIGZvciBTeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN5c1Byb3BlcnRpZXMgZXh0ZW5kcyBFbnZpcm9ubWVudCBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgICAgIC8qKiB0aGUgc3lzdGVtIHByb3BlcnRpZXMuICovCisgICAgICAgIFByb3BlcnRpZXMgc3lzID0gbnVsbDsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKyAgICAgICAgcHJpdmF0ZSBWZWN0b3IgcHJvcGVydHlTZXRzID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHByb3BlcnRpZXMgYXMgYW4gYXJyYXk7IHRoaXMgaXMgYW4gb3ZlcnJpZGUgb2YgdGhlCisgICAgICAgICAqIHN1cGVyY2xhc3MsIGFzIGl0IGV2YWx1YXRlcyBhbGwgdGhlIHByb3BlcnRpZXMuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGRlZmluaXRpb25zOyBtYXkgYmUgbnVsbC4KKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYXJpYWJsZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgICAgICBMaXN0IGRlZmluaXRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgIExpc3RJdGVyYXRvciBsaXN0ID0gZGVmaW5pdGlvbnMubGlzdEl0ZXJhdG9yKCk7CisgICAgICAgICAgICBhZGREZWZpbml0aW9uc1RvTGlzdChsaXN0KTsKKyAgICAgICAgICAgIGlmIChkZWZpbml0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBkZWZpbml0aW9ucy50b0FycmF5KG5ldyBTdHJpbmdbZGVmaW5pdGlvbnMuc2l6ZSgpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGFsbCBkZWZpbml0aW9ucyAoaW5jbHVkaW5nIHByb3BlcnR5IHNldHMpIHRvIGEgbGlzdC4KKyAgICAgICAgICogQHBhcmFtIGxpc3RJdCBsaXN0IGl0ZXJhdG9yIHN1cHBvcnRpbmcgYWRkIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluaXRpb25zVG9MaXN0KExpc3RJdGVyYXRvciBsaXN0SXQpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb3BzID0gc3VwZXIuZ2V0VmFyaWFibGVzKCk7CisgICAgICAgICAgICBpZiAocHJvcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdEl0LmFkZCgiLUQiICsgcHJvcHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydHlTZXRQcm9wZXJ0aWVzID0gbWVyZ2VQcm9wZXJ0eVNldHMoKTsKKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHByb3BlcnR5U2V0UHJvcGVydGllcy5rZXlzKCk7CisgICAgICAgICAgICAgICAgIGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eVNldFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgICAgICAgICBsaXN0SXQuYWRkKCItRCIgKyBrZXkgKyAiPSIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSBzeXNwcm9wZXJ0aWVzIGluc3RhbmNlLiBUaGlzIG1lcmdlcyBhbGwKKyAgICAgICAgICogcHJvcGVydHkgc2V0cywgc28gaXMgbm90IGFuIE8oMSkgb3BlcmF0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzeXNwcm9wZXJ0aWVzIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbWVyZ2VQcm9wZXJ0eVNldHMoKTsKKyAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZXMuc2l6ZSgpICsgcC5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FjaGUgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGFuZCBzZXQgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIHRvIHRoZQorICAgICAgICAgKiBuZXcgdmFsdWVzLgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIFNlY3VyaXR5IHByZXZlbnRlZCB0aGlzIG9wZXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN5cyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBzeXMucHJvcGVydHlOYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcC5wdXQobmFtZSwgc3lzLmdldFByb3BlcnR5KG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcC5wdXRBbGwobWVyZ2VQcm9wZXJ0eVNldHMoKSk7CisgICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gdmFyaWFibGVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LlZhcmlhYmxlIHYgPSAoRW52aXJvbm1lbnQuVmFyaWFibGUpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgdi52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBwLnB1dCh2LmdldEtleSgpLCB2LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBtb2RpZnkgc3lzdGVtIHByb3BlcnRpZXMiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXN0b3JlIHRoZSBzeXN0ZW0gcHJvcGVydGllcyB0byB0aGUgY2FjaGVkIHZhbHVlLgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uICBpZiBTZWN1cml0eSBwcmV2ZW50ZWQgdGhpcyBvcGVyYXRpb24sIG9yCisgICAgICAgICAqIHRoZXJlIHdlcmUgbm8gc3lzdGVtIHByb3BlcnRpZXMgdG8gcmVzdG9yZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVTeXN0ZW0oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHN5cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmJhbGFuY2VkIG5lc3Rpbmcgb2YgU3lzUHJvcGVydGllcyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHN5cyk7CisgICAgICAgICAgICAgICAgc3lzID0gbnVsbDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBtb2RpZnkgc3lzdGVtIHByb3BlcnRpZXMiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBkZWVwIGNsb25lLgorICAgICAgICAgKiBAcmV0dXJuIGEgY2xvbmVkIGluc3RhbmNlIG9mIFN5c1Byb3BlcnRpZXMuCisgICAgICAgICAqIEBleGNlcHRpb24gQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZm9yIHNpZ25hdHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTeXNQcm9wZXJ0aWVzIGMgPSAoU3lzUHJvcGVydGllcykgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBjLnZhcmlhYmxlcyA9IChWZWN0b3IpIHZhcmlhYmxlcy5jbG9uZSgpOworICAgICAgICAgICAgICAgIGMucHJvcGVydHlTZXRzID0gKFZlY3RvcikgcHJvcGVydHlTZXRzLmNsb25lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgcHJvcGVydHlzZXQgdG8gdGhlIHRvdGFsIHNldC4KKyAgICAgICAgICogQHBhcmFtIHBzIHRoZSBuZXcgcHJvcGVydHkgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkU3lzcHJvcGVydHlzZXQoUHJvcGVydHlTZXQgcHMpIHsKKyAgICAgICAgICAgIHByb3BlcnR5U2V0cy5hZGRFbGVtZW50KHBzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBwcm9wZXJ0eXNldCB0byB0aGUgdG90YWwgc2V0LgorICAgICAgICAgKiBAcGFyYW0gcHMgdGhlIG5ldyBwcm9wZXJ0eSBzZXQuCisgICAgICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFN5c3Byb3BlcnRpZXMoU3lzUHJvcGVydGllcyBwcykgeworICAgICAgICAgICAgdmFyaWFibGVzLmFkZEFsbChwcy52YXJpYWJsZXMpOworICAgICAgICAgICAgcHJvcGVydHlTZXRzLmFkZEFsbChwcy5wcm9wZXJ0eVNldHMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1lcmdlIGFsbCBwcm9wZXJ0eSBzZXRzIGludG8gYSBzaW5nbGUgUHJvcGVydGllcyBvYmplY3QuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG1lcmdlZCBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFByb3BlcnRpZXMgbWVyZ2VQcm9wZXJ0eVNldHMoKSB7CisgICAgICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gcHJvcGVydHlTZXRzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgIGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgUHJvcGVydHlTZXQgcHMgPSAoUHJvcGVydHlTZXQpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBwLnB1dEFsbChwcy5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZXMgdGhlIFZNIHdlIGFyZSBydW5uaW5nIG9uIG5vdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tbWFuZGxpbmVKYXZhKCkgeworICAgICAgICBzZXRWbShKYXZhRW52VXRpbHMuZ2V0SnJlRXhlY3V0YWJsZSgiamF2YSIpKTsKKyAgICAgICAgc2V0Vm12ZXJzaW9uKEphdmFFbnZVdGlscy5nZXRKYXZhVmVyc2lvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgYXJndW1lbnQgdG8gdGhlIGphdmEgcHJvZ3JhbS4KKyAgICAgKiBAcmV0dXJuIGFuIGFyZ3VtZW50IHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUFyZ3VtZW50KCkgeworICAgICAgICByZXR1cm4gamF2YUNvbW1hbmQuY3JlYXRlQXJndW1lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSlZNIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gYW4gYXJndW1lbnQgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tbWFuZGxpbmUuQXJndW1lbnQgY3JlYXRlVm1Bcmd1bWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHZtQ29tbWFuZC5jcmVhdGVBcmd1bWVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gc3lzcCBhIHByb3BlcnR5IHRvIGJlIHNldCBpbiB0aGUgSlZNLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFN5c3Byb3BlcnR5KEVudmlyb25tZW50LlZhcmlhYmxlIHN5c3ApIHsKKyAgICAgICAgc3lzUHJvcGVydGllcy5hZGRWYXJpYWJsZShzeXNwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXQgb2Ygc3lzdGVtIHByb3BlcnRpZXMuCisgICAgICogQHBhcmFtIHN5c3AgYSBzZXQgb2YgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTeXNwcm9wZXJ0eXNldChQcm9wZXJ0eVNldCBzeXNwKSB7CisgICAgICAgIHN5c1Byb3BlcnRpZXMuYWRkU3lzcHJvcGVydHlzZXQoc3lzcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSBzeXNwIGEgc2V0IG9mIHByb3BlcnRpZXMuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFN5c3Byb3BlcnRpZXMoU3lzUHJvcGVydGllcyBzeXNwKSB7CisgICAgICAgIHN5c1Byb3BlcnRpZXMuYWRkU3lzcHJvcGVydGllcyhzeXNwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGV4ZWN1dGFibGUgdXNlZCB0byBzdGFydCB0aGUgbmV3IEpWTS4KKyAgICAgKiBAcGFyYW0gdm0gdGhlIGV4ZWN1dGFibGUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZtKFN0cmluZyB2bSkgeworICAgICAgICB2bUNvbW1hbmQuc2V0RXhlY3V0YWJsZSh2bSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKVk0gdmVyc2lvbiByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZlcnNpb24gcmVxdWlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Vm12ZXJzaW9uKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB2bVZlcnNpb24gPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBzeXN0ZW0gcHJvcGVydGllcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgY2xvbmVkIFZNLS1hcworICAgICAqIHdlbGwgYXMgdGhlIGJvb3RjbGFzc3BhdGggdW5sZXNzIHlvdSBoYXZlIGV4cGxpY2l0bHkgc3BlY2lmaWVkCisgICAgICogYSBib290Y2xhc3NwYXRoLgorICAgICAqIEBwYXJhbSBjbG9uZVZtIGlmIHRydWUgY29weSB0aGUgc3lzdGVtIHByb3BlcnRpZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbG9uZVZtKGJvb2xlYW4gY2xvbmVWbSkgeworICAgICAgICB0aGlzLmNsb25lVm0gPSBjbG9uZVZtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBhc3NlcnRpb25zLgorICAgICAqIEByZXR1cm4gYXNzZXJ0aW9ucyBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBBc3NlcnRpb25zIGdldEFzc2VydGlvbnMoKSB7CisgICAgICAgIHJldHVybiBhc3NlcnRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhc3NlcnRpb24gc2V0IHRvIHRoZSBjb21tYW5kLgorICAgICAqIEBwYXJhbSBhc3NlcnRpb25zIGFzc2VydGlvbnMgdG8gbWFrZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRpb25zKEFzc2VydGlvbnMgYXNzZXJ0aW9ucykgeworICAgICAgICB0aGlzLmFzc2VydGlvbnMgPSBhc3NlcnRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIGphciBmaWxlIHRvIGV4ZWN1dGUgdmlhIHRoZSAtamFyIG9wdGlvbi4KKyAgICAgKiBAcGFyYW0gamFycGF0aG5hbWUgdGhlIHBhdGhuYW1lIG9mIHRoZSBqYXIgdG8gZXhlY3V0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKYXIoU3RyaW5nIGphcnBhdGhuYW1lKSB7CisgICAgICAgIGphdmFDb21tYW5kLnNldEV4ZWN1dGFibGUoamFycGF0aG5hbWUpOworICAgICAgICBleGVjdXRlSmFyID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGphciB0byBiZSBydW4uCisgICAgICogQHJldHVybiB0aGUgcGF0aG5hbWUgb2YgdGhlIGphciBmaWxlIHRvIHJ1biB2aWEgLWphciBvcHRpb24KKyAgICAgKiBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIGlzIG5vIGphciB0byBydW4uCisgICAgICogQHNlZSAjZ2V0Q2xhc3NuYW1lKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEphcigpIHsKKyAgICAgICAgaWYgKGV4ZWN1dGVKYXIpIHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhQ29tbWFuZC5nZXRFeGVjdXRhYmxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc25hbWUgdG8gZXhlY3V0ZS4KKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIGphdmFDb21tYW5kLnNldEV4ZWN1dGFibGUoY2xhc3NuYW1lKTsKKyAgICAgICAgZXhlY3V0ZUphciA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgcnVuLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHJ1biBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIGlzIG5vIGNsYXNzLgorICAgICAqIEBzZWUgI2dldEphcigpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7CisgICAgICAgIGlmICghZXhlY3V0ZUphcikgeworICAgICAgICAgICAgcmV0dXJuIGphdmFDb21tYW5kLmdldEV4ZWN1dGFibGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjbGFzc3BhdGguCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gdXNlIHRvIGNyZWF0ZSB0aGUgcGF0aC4KKyAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aChQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGJvb3QgY2xhc3NwYXRoLgorICAgICAqIEBwYXJhbSBwIHRoZSBwcm9qZWN0IHRvIHVzZSB0byBjcmVhdGUgdGhlIHBhdGguCisgICAgICogQHJldHVybiBhIHBhdGggdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUJvb3RjbGFzc3BhdGgoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChib290Y2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGJvb3RjbGFzc3BhdGggPSBuZXcgUGF0aChwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm9vdGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZtIHZlcnNpb24uCisgICAgICogQHJldHVybiB0aGUgdm0gdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZtdmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHZtVmVyc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbW1hbmQgbGluZSB0byBydW4gYSBKYXZhIHZtLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIGFyZ3VtZW50cyBuZWNlc3NhcnkgdG8gcnVuIHRoZSB2bS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWFuZGxpbmUoKSB7CisgICAgICAgIC8vY3JlYXRlIHRoZSBsaXN0CisgICAgICAgIExpc3QgY29tbWFuZHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBmaW5hbCBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yID0gY29tbWFuZHMubGlzdEl0ZXJhdG9yKCk7CisgICAgICAgIC8vZmlsbCBpdAorICAgICAgICBhZGRDb21tYW5kc1RvTGlzdChsaXN0SXRlcmF0b3IpOworICAgICAgICAvL2NvbnZlcnQgdG8gYW4gYXJyYXkKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgY29tbWFuZHMudG9BcnJheShuZXcgU3RyaW5nW2NvbW1hbmRzLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbGwgdGhlIGNvbW1hbmRzIHRvIGEgbGlzdCBpZGVudGlmaWVkIGJ5IHRoZSBpdGVyYXRvciBwYXNzZWQgaW4uCisgICAgICogQHBhcmFtIGxpc3RJdGVyYXRvciBhbiBpdGVyYXRvciB0aGF0IHN1cHBvcnRzIHRoZSBhZGQgbWV0aG9kLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZENvbW1hbmRzVG9MaXN0KGZpbmFsIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IpIHsKKyAgICAgICAgLy9jcmVhdGUgdGhlIGNvbW1hbmQgdG8gcnVuIEphdmEsIGluY2x1ZGluZyB1c2VyIHNwZWNpZmllZCBvcHRpb25zCisgICAgICAgIGdldEFjdHVhbFZNQ29tbWFuZCgpLmFkZENvbW1hbmRUb0xpc3QobGlzdEl0ZXJhdG9yKTsKKyAgICAgICAgLy8gcHJvcGVydGllcyBhcmUgcGFydCBvZiB0aGUgdm0gb3B0aW9ucy4uLgorICAgICAgICBzeXNQcm9wZXJ0aWVzLmFkZERlZmluaXRpb25zVG9MaXN0KGxpc3RJdGVyYXRvcik7CisKKyAgICAgICAgaWYgKGlzQ2xvbmVWbSgpKSB7CisgICAgICAgICAgICBTeXNQcm9wZXJ0aWVzIGNsb25lZFN5c1Byb3BlcnRpZXMgPSBuZXcgU3lzUHJvcGVydGllcygpOworICAgICAgICAgICAgUHJvcGVydHlTZXQgcHMgPSBuZXcgUHJvcGVydHlTZXQoKTsKKyAgICAgICAgICAgIFByb3BlcnR5U2V0LkJ1aWx0aW5Qcm9wZXJ0eVNldE5hbWUgc3lzID0KKyAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlTZXQuQnVpbHRpblByb3BlcnR5U2V0TmFtZSgpOworICAgICAgICAgICAgc3lzLnNldFZhbHVlKCJzeXN0ZW0iKTsKKyAgICAgICAgICAgIHBzLmFwcGVuZEJ1aWx0aW4oc3lzKTsKKyAgICAgICAgICAgIGNsb25lZFN5c1Byb3BlcnRpZXMuYWRkU3lzcHJvcGVydHlzZXQocHMpOworICAgICAgICAgICAgY2xvbmVkU3lzUHJvcGVydGllcy5hZGREZWZpbml0aW9uc1RvTGlzdChsaXN0SXRlcmF0b3IpOworICAgICAgICB9CisgICAgICAgIC8vYm9vdCBjbGFzc3BhdGgKKyAgICAgICAgUGF0aCBiY3AgPSBjYWxjdWxhdGVCb290Y2xhc3NwYXRoKHRydWUpOworICAgICAgICBpZiAoYmNwLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGxpc3RJdGVyYXRvci5hZGQoIi1YYm9vdGNsYXNzcGF0aDoiICsgYmNwLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIC8vbWFpbiBjbGFzc3BhdGgKKyAgICAgICAgaWYgKGhhdmVDbGFzc3BhdGgoKSkgeworICAgICAgICAgICAgbGlzdEl0ZXJhdG9yLmFkZCgiLWNsYXNzcGF0aCIpOworICAgICAgICAgICAgbGlzdEl0ZXJhdG9yLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIikudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy9ub3cgYW55IGFzc2VydGlvbnMgYXJlIGFkZGVkCisgICAgICAgIGlmIChnZXRBc3NlcnRpb25zKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0QXNzZXJ0aW9ucygpLmFwcGx5QXNzZXJ0aW9ucyhsaXN0SXRlcmF0b3IpOworICAgICAgICB9CisgICAgICAgIC8vIEpESyB1c2FnZSBjb21tYW5kIGxpbmUgc2F5cyB0aGF0IC1qYXIgbXVzdCBiZSB0aGUgZmlyc3Qgb3B0aW9uLCBhcyB0aGVyZSBpcworICAgICAgICAvLyBhIGJ1ZyBpbiBKREsgPCAxLjQgdGhhdCBmb3JjZXMgdGhlIGp2bSB0eXBlIHRvIGJlIHNwZWNpZmllZCBhcyB0aGUgZmlyc3QKKyAgICAgICAgLy8gb3B0aW9uLCBpdCBpcyBhcHBlbmRlZCBoZXJlIGFzIHNwZWNpZmllZCBpbiB0aGUgZG9jcyBldmVuIHRob3VnaCB0aGVyZSBpcworICAgICAgICAvLyBpbiBmYWN0IG5vIG9yZGVyLgorICAgICAgICBpZiAoZXhlY3V0ZUphcikgeworICAgICAgICAgICAgbGlzdEl0ZXJhdG9yLmFkZCgiLWphciIpOworICAgICAgICB9CisgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNsYXNzbmFtZSB0byBydW4gYXMgd2VsbCBhcyBpdHMgYXJndW1lbnRzLgorICAgICAgICAvLyBpbiBjYXNlIG9mICdleGVjdXRlSmFyJywgdGhlIGV4ZWN1dGFibGUgaXMgYSBqYXIgZmlsZS4KKyAgICAgICAgamF2YUNvbW1hbmQuYWRkQ29tbWFuZFRvTGlzdChsaXN0SXRlcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgbWF4IG1lbW9yeSBvZiB0aGUgSlZNLgorICAgICAqIC1teCBvciAtWG14IGRlcGVuZGluZyBvbiBWTSB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSBtYXggdGhlIHN0cmluZyB0byBwYXNzIHRvIHRoZSBqdm0gdG8gc3BlY2lmaXkgdGhlIG1heCBtZW1vcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4bWVtb3J5KFN0cmluZyBtYXgpIHsKKyAgICAgICAgdGhpcy5tYXhNZW1vcnkgPSBtYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc3RyaW5nIGRlc2NyaXB0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGNvbW1hbmQgbGluZSBhcyBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gQ29tbWFuZGxpbmUudG9TdHJpbmcoZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgc3VpdGFibGUgZm9yCisgICAgICogdmVyYm9zZSBvdXRwdXQgYmVmb3JlIGEgY2FsbCB0byA8Y29kZT5SdW50aW1lLmV4ZWMoU3RyaW5nW10pPGNvZGU+LgorICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIHN0cmluZy4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpYmVDb21tYW5kKCkgeworICAgICAgICByZXR1cm4gQ29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKGdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgamF2YSBjb21tYW5kIGFuZCBhcmd1bWVudHMKKyAgICAgKiBmb3IgaW4tVk0gZXhlY3V0aW9ucy4KKyAgICAgKgorICAgICAqIDxwPlRoZSBjbGFzcyBuYW1lIGlzIHRoZSBleGVjdXRhYmxlIGluIHRoaXMgY29udGV4dC48L3A+CisgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gc3RyaW5nLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBkZXNjcmliZUphdmFDb21tYW5kKCkgeworICAgICAgICByZXR1cm4gQ29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKGdldEphdmFDb21tYW5kKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgVk0gY29tbWFuZCBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgbWVtb3J5IHNldHRpbmdzLgorICAgICAqIEByZXR1cm4gdGhlIFZNIGNvbW1hbmQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tbWFuZGxpbmUgZ2V0QWN0dWFsVk1Db21tYW5kKCkgeworICAgICAgICBDb21tYW5kbGluZSBhY3R1YWxWTUNvbW1hbmQgPSAoQ29tbWFuZGxpbmUpIHZtQ29tbWFuZC5jbG9uZSgpOworICAgICAgICBpZiAobWF4TWVtb3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2bVZlcnNpb24uc3RhcnRzV2l0aCgiMS4xIikpIHsKKyAgICAgICAgICAgICAgICBhY3R1YWxWTUNvbW1hbmQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW14IiArIG1heE1lbW9yeSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFjdHVhbFZNQ29tbWFuZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItWG14IiArIG1heE1lbW9yeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdHVhbFZNQ29tbWFuZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGphdmEgY29tbWFuZCBsaW5lLiBUaGlzIGlzIGEgZmFpcmx5IGludGVuc2l2ZQorICAgICAqIG9wZXJhdGlvbiwgYXMgaXQgaGFzIHRvIGV2YWx1YXRlIHRoZSBzaXplIG9mIG1hbnkgY29tcG9uZW50cy4KKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBqYXZhIGNvbW1hbmQgbGluZS4KKyAgICAgKiBAc2VlICNnZXRDb21tYW5kbGluZSgpCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgorICAgICAqICAgICAgICAgICAgIFBsZWFzZSBkb250IHVzZSB0aGlzLCBpdCBlZmZlY3RpdmVseSBjcmVhdGVzIHRoZQorICAgICAqICAgICAgICAgICAgIGVudGlyZSBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgaW50IHNpemUgPSBnZXRBY3R1YWxWTUNvbW1hbmQoKS5zaXplKCkgKyBqYXZhQ29tbWFuZC5zaXplKCkKKyAgICAgICAgICAgICsgc3lzUHJvcGVydGllcy5zaXplKCk7CisgICAgICAgIC8vIGNsb25lZCBzeXN0ZW0gcHJvcGVydGllcworICAgICAgICBpZiAoaXNDbG9uZVZtKCkpIHsKKyAgICAgICAgICAgIHNpemUgKz0gU3lzdGVtLmdldFByb3BlcnRpZXMoKS5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2xhc3NwYXRoIGlzICItY2xhc3NwYXRoIDxjbGFzc3BhdGg+IiAtPiAyIGFyZ3MKKyAgICAgICAgaWYgKGhhdmVDbGFzc3BhdGgoKSkgeworICAgICAgICAgICAgc2l6ZSArPSAyOworICAgICAgICB9CisgICAgICAgIC8vIGJvb3RjbGFzc3BhdGggaXMgIi1YYm9vdGNsYXNzcGF0aDo8Y2xhc3NwYXRoPiIgLT4gMSBhcmcKKyAgICAgICAgaWYgKGNhbGN1bGF0ZUJvb3RjbGFzc3BhdGgodHJ1ZSkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICB9CisgICAgICAgIC8vIGphciBleGVjdXRpb24gcmVxdWlyZXMgYW4gYWRkaXRpb25hbCAtamFyIG9wdGlvbgorICAgICAgICBpZiAoZXhlY3V0ZUphcikgeworICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICB9CisgICAgICAgIC8vYXNzZXJ0aW9ucyB0YWtlIHVwIHNwYWNlIHRvbworICAgICAgICBpZiAoZ2V0QXNzZXJ0aW9ucygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNpemUgKz0gZ2V0QXNzZXJ0aW9ucygpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIEphdmEgY29tbWFuZCB0byBiZSB1c2VkLgorICAgICAqIEByZXR1cm4gdGhlIGphdmEgY29tbWFuZC0tbm90IGEgY2xvbmUuCisgICAgICovCisgICAgcHVibGljIENvbW1hbmRsaW5lIGdldEphdmFDb21tYW5kKCkgeworICAgICAgICByZXR1cm4gamF2YUNvbW1hbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBWTSBjb21tYW5kLCBpbmNsdWRpbmcgbWVtb3J5LgorICAgICAqIEByZXR1cm4gQSBkZWVwIGNsb25lIG9mIHRoZSBpbnN0YW5jZSdzIFZNIGNvbW1hbmQsIHdpdGggbWVtb3J5IHNldHRpbmdzIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb21tYW5kbGluZSBnZXRWbUNvbW1hbmQoKSB7CisgICAgICAgIHJldHVybiBnZXRBY3R1YWxWTUNvbW1hbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIGNvbW1hbmQuCisgICAgICogQHJldHVybiB0aGUgY2xhc3NwYXRoIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCkgeworICAgICAgICByZXR1cm4gY2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYm9vdCBjbGFzc3BhdGguCisgICAgICogQHJldHVybiBib290IGNsYXNzcGF0aCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldEJvb3RjbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBib290Y2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhY2hlIGN1cnJlbnQgc3lzdGVtIHByb3BlcnRpZXMgYW5kIHNldCB0aGVtIHRvIHRob3NlIGluIHRoaXMKKyAgICAgKiBKYXZhIGNvbW1hbmQuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiAgaWYgU2VjdXJpdHkgcHJldmVudGVkIHRoaXMgb3BlcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbVByb3BlcnRpZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBzeXNQcm9wZXJ0aWVzLnNldFN5c3RlbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RvcmUgdGhlIGNhY2hlZCBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uICBpZiBTZWN1cml0eSBwcmV2ZW50ZWQgdGhpcyBvcGVyYXRpb24sIG9yCisgICAgICogdGhlcmUgd2FzIG5vIHN5c3RlbSBwcm9wZXJ0aWVzIHRvIHJlc3RvcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlU3lzdGVtUHJvcGVydGllcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHN5c1Byb3BlcnRpZXMucmVzdG9yZVN5c3RlbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3lzdGVtIHByb3BlcnRpZXMgb2JqZWN0LgorICAgICAqIEByZXR1cm4gVGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3lzUHJvcGVydGllcyBnZXRTeXN0ZW1Qcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gc3lzUHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWVwIGNsb25lIHRoZSBvYmplY3QuCisgICAgICogQHJldHVybiBhIENvbW1hbmRsaW5lSmF2YSBvYmplY3QuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbnl0aGluZyB3ZW50IHdyb25nLgorICAgICAqIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gbmV2ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb21tYW5kbGluZUphdmEgYyA9IChDb21tYW5kbGluZUphdmEpIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICBjLnZtQ29tbWFuZCA9IChDb21tYW5kbGluZSkgdm1Db21tYW5kLmNsb25lKCk7CisgICAgICAgICAgICBjLmphdmFDb21tYW5kID0gKENvbW1hbmRsaW5lKSBqYXZhQ29tbWFuZC5jbG9uZSgpOworICAgICAgICAgICAgYy5zeXNQcm9wZXJ0aWVzID0gKFN5c1Byb3BlcnRpZXMpIHN5c1Byb3BlcnRpZXMuY2xvbmUoKTsKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xhc3NwYXRoID0gKFBhdGgpIGNsYXNzcGF0aC5jbG9uZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJvb3RjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuYm9vdGNsYXNzcGF0aCA9IChQYXRoKSBib290Y2xhc3NwYXRoLmNsb25lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXNzZXJ0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5hc3NlcnRpb25zID0gKEFzc2VydGlvbnMpIGFzc2VydGlvbnMuY2xvbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBvdXQgdGhlIGphdmEgYXJndW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFySmF2YUFyZ3MoKSB7CisgICAgICAgIGphdmFDb21tYW5kLmNsZWFyQXJncygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBjbGFzc3BhdGggaGFzIGJlZW4gc3BlY2lmaWVkLCBhbmQgd2hldGhlciBpdCBzaGFsbAorICAgICAqIHJlYWxseSBiZSB1c2VkIG9yIGJlIG51bGxlZCBieSBidWlsZC5zeXNjbGFzc3BhdGguCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGFzc3BhdGggaXMgdG8gYmUgdXNlZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhdmVDbGFzc3BhdGgoKSB7CisgICAgICAgIFBhdGggZnVsbENsYXNzcGF0aCA9IGNsYXNzcGF0aCAhPSBudWxsCisgICAgICAgICAgICA/IGNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpIDogbnVsbDsKKyAgICAgICAgcmV0dXJuIGZ1bGxDbGFzc3BhdGggIT0gbnVsbAorICAgICAgICAgICAgJiYgZnVsbENsYXNzcGF0aC50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJvb3RjbGFzc3BhdGggaGFzIGJlZW4gc3BlY2lmaWVkLCBhbmQgd2hldGhlciBpdAorICAgICAqIHNoYWxsIHJlYWxseSBiZSB1c2VkIChidWlsZC5zeXNjbGFzc3BhdGggY291bGQgYmUgc2V0IG9yIHRoZSBWTSBtYXkgbm90CisgICAgICogc3VwcG9ydCBpdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nIHdoZXRoZXIgdG8gbG9nIGEgd2FybmluZyBpZiBhIGJvb3RjbGFzc3BhdGggaGFzIGJlZW4KKyAgICAgKiBzcGVjaWZpZWQgYnV0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJvb3RjbGFzc3BhdGggaXMgdG8gYmUgdXNlZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhdmVCb290Y2xhc3NwYXRoKGJvb2xlYW4gbG9nKSB7CisgICAgICAgIHJldHVybiBjYWxjdWxhdGVCb290Y2xhc3NwYXRoKGxvZykuc2l6ZSgpID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGJvb3RjbGFzc3BhdGggYmFzZWQgb24gdGhlIGJvb3RjbGFzc3BhdGgKKyAgICAgKiBzcGVjaWZpZWQsIHRoZSBidWlsZC5zeXNjbGFzc3BhdGggYW5kIGFudC5idWlsZC5jbG9uZXZtIG1hZ2ljCisgICAgICogcHJvcGVydGllcyBhcyB3ZWxsIGFzIHRoZSBjbG9uZVZtIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gbG9nIHdoZXRoZXIgdG8gd3JpdGUgbWVzc2FnZXMgdG8gdGhlIGxvZy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByaXZhdGUgUGF0aCBjYWxjdWxhdGVCb290Y2xhc3NwYXRoKGJvb2xlYW4gbG9nKSB7CisgICAgICAgIGlmICh2bVZlcnNpb24uc3RhcnRzV2l0aCgiMS4xIikpIHsKKyAgICAgICAgICAgIGlmIChib290Y2xhc3NwYXRoICE9IG51bGwgJiYgbG9nKSB7CisgICAgICAgICAgICAgICAgYm9vdGNsYXNzcGF0aC5sb2coIklnbm9yaW5nIGJvb3RjbGFzc3BhdGggYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRoZSB0YXJnZXQgVk0gZG9lc24ndCBzdXBwb3J0IGl0LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGJvb3RjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBib290Y2xhc3NwYXRoLmNvbmNhdFN5c3RlbUJvb3RDbGFzc3BhdGgoaXNDbG9uZVZtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gImxhc3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJpZ25vcmUiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDbG9uZVZtKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGF0aC5zeXN0ZW1Cb290Q2xhc3NwYXRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUGF0aChudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIG91dCB3aGV0aGVyIGVpdGhlciBvZiB0aGUgY2xvbmVWbSBhdHRyaWJ1dGUgb3IgdGhlIG1hZ2ljIHByb3BlcnR5CisgICAgICogYW50LmJ1aWxkLmNsb25ldm0gaGFzIGJlZW4gc2V0LgorICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4uCisgICAgICogQHNpbmNlIDEuNworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0Nsb25lVm0oKSB7CisgICAgICAgIHJldHVybiBjbG9uZVZtCisgICAgICAgICAgICB8fCAidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LmJ1aWxkLmNsb25ldm0iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tcGFyaXNvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tcGFyaXNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwNTdkMGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21wYXJpc29uLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBFbnVtZXJhdGVkQXR0cmlidXRlIGZvciBnZW5lcmljIGNvbXBhcmlzb25zLiAgQWNjZXB0cyB2YWx1ZXMKKyAqICJlcXVhbCIsICJncmVhdGVyIiwgIm1vcmUiLCAibGVzcyIsICJuZSIgKG5vdCBlcXVhbCksCisgKiAiZ2UiIChncmVhdGVyIG9yIGVxdWFsKSwgImxlIiAobGVzcyBvciBlcXVhbCksICJlcSIgKGVxdWFsKSwKKyAqICJndCIgKGdyZWF0ZXIpLCAibHQiIChsZXNzKS4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBDb21wYXJpc29uIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVTCisgICAgICAgID0gbmV3IFN0cmluZ1tdIHsiZXF1YWwiLCAiZ3JlYXRlciIsICJsZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZSIsICJnZSIsICJsZSIsICJlcSIsICJndCIsICJsdCIsICJtb3JlIn07CisKKyAgICAvKiogRXF1YWwgQ29tcGFyaXNvbi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmlzb24gRVFVQUwgPSBuZXcgQ29tcGFyaXNvbigiZXF1YWwiKTsKKworICAgIC8qKiBOb3QtRXF1YWwgQ29tcGFyaXNvbi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmlzb24gTk9UX0VRVUFMID0gbmV3IENvbXBhcmlzb24oIm5lIik7CisKKyAgICAvKiogR3JlYXRlciBDb21wYXJpc29uLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyaXNvbiBHUkVBVEVSID0gbmV3IENvbXBhcmlzb24oImdyZWF0ZXIiKTsKKworICAgIC8qKiBMZXNzIENvbXBhcmlzb24uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJpc29uIExFU1MgPSBuZXcgQ29tcGFyaXNvbigibGVzcyIpOworCisgICAgLyoqIEdyZWF0ZXItb3ItRXF1YWwgQ29tcGFyaXNvbi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmlzb24gR1JFQVRFUl9FUVVBTCA9IG5ldyBDb21wYXJpc29uKCJnZSIpOworCisgICAgLyoqIExlc3Mtb3ItRXF1YWwgQ29tcGFyaXNvbi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmlzb24gTEVTU19FUVVBTCA9IG5ldyBDb21wYXJpc29uKCJsZSIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gRVFVQUxfSU5ERVggPSB7MCwgNCwgNSwgNn07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTEVTU19JTkRFWCA9IHsyLCAzLCA1LCA4fTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBHUkVBVEVSX0lOREVYID0gezEsIDMsIDQsIDcsIDl9OworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGFyaXNvbigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ29tcGFyaXNvbiB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBFbnVtZXJhdGVkQXR0cmlidXRlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBDb21wYXJpc29uKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwb3NzaWJsZSB2YWx1ZXMuCisgICAgICogQHJldHVybiBTdHJpbmdbXSBvZiBFbnVtZXJhdGVkQXR0cmlidXRlIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gVkFMVUVTOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlIGEgY29tcGFyaXNvbiByZXN1bHQgYXMgZnJvbSBDb21wYXJhdG9yLmNvbXBhcmUoKSBvciBDb21wYXJhYmxlLmNvbXBhcmVUbygpLgorICAgICAqIEBwYXJhbSBjb21wYXJpc29uUmVzdWx0IHRoZSByZXN1bHQgdG8gZXZhbHVhdGUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wYXJpc29uIHJlc3VsdCBmZWxsIHdpdGhpbiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIENvbXBhcmlzb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoaW50IGNvbXBhcmlzb25SZXN1bHQpIHsKKyAgICAgICAgaWYgKGdldEluZGV4KCkgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ29tcGFyaXNvbiB2YWx1ZSBub3Qgc2V0LiIpOworICAgICAgICB9CisgICAgICAgIGludFtdIGkgPSBjb21wYXJpc29uUmVzdWx0IDwgMCA/IExFU1NfSU5ERVgKKyAgICAgICAgICAgIDogY29tcGFyaXNvblJlc3VsdCA+IDAgPyBHUkVBVEVSX0lOREVYIDogRVFVQUxfSU5ERVg7CisgICAgICAgIHJldHVybiBBcnJheXMuYmluYXJ5U2VhcmNoKGksIGdldEluZGV4KCkpID49IDA7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RURExvY2F0aW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EVERMb2NhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZGVlZTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EVERMb2NhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKKy8qKgorICogPHA+SGVscGVyIGNsYXNzIHRvIGhhbmRsZSB0aGUgRFREIG5lc3RlZCBlbGVtZW50LiAgSW5zdGFuY2VzIG9mCisgKiB0aGlzIGNsYXNzIGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPlBVQkxJQzwvY29kZT4gY2F0YWxvZyBlbnRyeSB0eXBlCisgKiBvZiB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly9vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+CisgKiBPQVNJUyAiT3BlbiBDYXRhbG9nIiBzdGFuZGFyZDwvYT4uPC9wPgorICoKKyAqIDxwPlBvc3NpYmxlIEZ1dHVyZSBFbmhhbmNlbWVudDogQnJpbmcgdGhlIEFudCBlbGVtZW50IG5hbWUgaW50bworICogY29uZm9ybWFuY2Ugd2l0aCB0aGUgT0FTSVMgc3RhbmRhcmQuPC9wPgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuQ2F0YWxvZworICovCitwdWJsaWMgY2xhc3MgRFRETG9jYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUxvY2F0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RhdGFUeXBlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EYXRhVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzk1OTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EYXRhVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkNvbXBvbmVudEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSWRlbnRpdHlTdGFjazsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciB0aG9zZSBjbGFzc2VzIHRoYXQgY2FuIGFwcGVhciBpbnNpZGUgdGhlIGJ1aWxkIGZpbGUKKyAqIGFzIHN0YW5kIGFsb25lIGRhdGEgdHlwZXMuCisgKgorICogPHA+VGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBjb21tb24gZGVzY3JpcHRpb24gYXR0cmlidXRlIGFuZCBwcm92aWRlcworICogYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciByZWZlcmVuY2UgaGFuZGxpbmcgYW5kIGNoZWNraW5nIGZvcgorICogY2lyY3VsYXIgcmVmZXJlbmNlcyB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0eXBlcyB0aGF0IGNhbiBub3QgYmUKKyAqIG5lc3RlZCBpbnNpZGUgZWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZSAoaS5lLiAmbHQ7cGF0dGVybnNldCZndDsKKyAqIGJ1dCBub3QgJmx0O3BhdGgmZ3Q7KS48L3A+CisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YVR5cGUgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYKKworICAgIC8qKgorICAgICAqIFZhbHVlIHRvIHRoZSByZWZpZCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjcuCisgICAgICogICAgICAgICAgICAgVGhlIHVzZXIgc2hvdWxkIG5vdCBiZSBkaXJlY3RseSByZWZlcmVuY2luZworICAgICAqICAgICAgICAgICAgIHZhcmlhYmxlLiBQbGVhc2UgdXNlIHtAbGluayAjZ2V0UmVmaWR9IGluc3RlYWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlZmVyZW5jZSByZWY7CisKKyAgICAvKioKKyAgICAgKiBBcmUgd2Ugc3VyZSB3ZSBkb24ndCBob2xkIGNpcmN1bGFyIHJlZmVyZW5jZXM/CisgICAgICoKKyAgICAgKiA8cD5TdWJjbGFzc2VzIGFyZSByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB0aGlzIHZhbHVlIHRvIGZhbHNlCisgICAgICogaWYgd2UnZCBuZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgY29uZGl0aW9uICh1c3VhbGx5IGJlY2F1c2UgYQorICAgICAqIGNoaWxkIGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgdGhhdCBpcyBhIHN1YmNsYXNzIG9mCisgICAgICogRGF0YVR5cGUpLjwvcD4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNy4KKyAgICAgKiAgICAgICAgICAgICBUaGUgdXNlciBzaG91bGQgbm90IGJlIGRpcmVjdGx5IHJlZmVyZW5jaW5nCisgICAgICogICAgICAgICAgICAgdmFyaWFibGUuIFBsZWFzZSB1c2Uge0BsaW5rICNzZXRDaGVja2VkfSBvcgorICAgICAqICAgICAgICAgICAgIHtAbGluayAjaXNDaGVja2VkfSBpbnN0ZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrZWQgPSB0cnVlOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhlIHJlZmlkIGF0dHJpYnV0ZSBvZiB0aGlzIGVsZW1lbnQgYmVlbiBzZXQ/CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWZpZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKSB7CisgICAgICAgIHJldHVybiByZWYgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSByZWZpZCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiA8cD5TdWJjbGFzc2VzIG1heSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgYW55IG90aGVyIGF0dHJpYnV0ZXMKKyAgICAgKiBoYXZlIGJlZW4gc2V0IGFzIHdlbGwgb3IgY2hpbGQgZWxlbWVudHMgaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kCisgICAgICogdGh1cyBvdmVycmlkZSB0aGlzIG1ldGhvZC4gaWYgdGhleSBkbyB0aGUgbXVzdCBjYWxsCisgICAgICogPGNvZGU+c3VwZXIuc2V0UmVmaWQ8L2NvZGU+LjwvcD4KKyAgICAgKiBAcGFyYW0gcmVmIHRoZSByZWZlcmVuY2UgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoZmluYWwgUmVmZXJlbmNlIHJlZikgeworICAgICAgICB0aGlzLnJlZiA9IHJlZjsKKyAgICAgICAgY2hlY2tlZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYXMgZGVzY3JpcHRpdmUgYXMgcG9zc2libGUgYSBuYW1lIHVzZWQgZm9yIHRoaXMgZGF0YXR5cGUgaW5zdGFuY2UuCisgICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+IG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRIZWxwZXIuZ2V0RWxlbWVudE5hbWUoZ2V0UHJvamVjdCgpLCB0aGlzLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCkgeworICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKGdldFByb2plY3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kLgorICAgICAqIEBwYXJhbSBwIHRoZSBBbnQgUHJvamVjdCBpbnN0YW5jZSBhZ2FpbnN0IHdoaWNoIHRvIHJlc29sdmUgcmVmZXJlbmNlcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChjaGVja2VkIHx8ICFpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZShuZXcgSWRlbnRpdHlTdGFjayh0aGlzKSwgcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgYW55IERhdGFUeXBlIHdlIGhvbGQgcmVmZXJlbmNlcyB0byBpcworICAgICAqIGluY2x1ZGVkIGluIHRoZSBTdGFjayAod2hpY2ggaG9sZHMgYWxsIERhdGFUeXBlIGluc3RhbmNlcyB0aGF0CisgICAgICogZGlyZWN0bHkgb3IgaW5kaXJlY3RseSByZWZlcmVuY2UgdGhpcyBpbnN0YW5jZSwgaW5jbHVkaW5nIHRoaXMKKyAgICAgKiBpbnN0YW5jZSBpdHNlbGYpLgorICAgICAqCisgICAgICogPHA+SWYgb25lIGlzIGluY2x1ZGVkLCB0aHJvdyBhIEJ1aWxkRXhjZXB0aW9uIGNyZWF0ZWQgYnkge0BsaW5rCisgICAgICogI2NpcmN1bGFyUmVmZXJlbmNlIGNpcmN1bGFyUmVmZXJlbmNlfS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIGlzIGFwcHJvcHJpYXRlIG9ubHkgZm9yIGEgRGF0YVR5cGUgdGhhdAorICAgICAqIGNhbm5vdCBob2xkIG90aGVyIERhdGFUeXBlcyBhcyBjaGlsZHJlbi48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgZ2VuZXJhbCBjb250cmFjdCBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IGl0IHNob3VsZG4ndCBkbworICAgICAqIGFueXRoaW5nIGlmIHtAbGluayAjY2hlY2tlZCA8Y29kZT5jaGVja2VkPC9jb2RlPn0gaXMgdHJ1ZSBhbmQKKyAgICAgKiBzZXQgaXQgdG8gdHJ1ZSBvbiBleGl0LjwvcD4KKyAgICAgKiBAcGFyYW0gc3RhY2sgdGhlIHN0YWNrIG9mIHJlZmVyZW5jZXMgdG8gY2hlY2suCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gdXNlIHRvIGRlcmVmZXJlbmNlIHRoZSByZWZlcmVuY2VzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShmaW5hbCBTdGFjayBzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoY2hlY2tlZCB8fCAhaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBvID0gcmVmLmdldFJlZmVyZW5jZWRPYmplY3QocHJvamVjdCk7CisKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEYXRhVHlwZSkgeworICAgICAgICAgICAgSWRlbnRpdHlTdGFjayBpZCA9IElkZW50aXR5U3RhY2suZ2V0SW5zdGFuY2Uoc3RhY2spOworCisgICAgICAgICAgICBpZiAoaWQuY29udGFpbnMobykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBjaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZC5wdXNoKG8pOworICAgICAgICAgICAgICAgICgoRGF0YVR5cGUpIG8pLmRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoaWQsIHByb2plY3QpOworICAgICAgICAgICAgICAgIGlkLnBvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNoZWNrZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IERhdGFUeXBlcyBvdXRzaWRlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzIHRvIGluZGlyZWN0bHkgY2FsbAorICAgICAqIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Ugb24gbmVzdGVkIERhdGFUeXBlcy4KKyAgICAgKiBAcGFyYW0gZHQgdGhlIERhdGFUeXBlIHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSBzdGsgdGhlIHN0YWNrIG9mIHJlZmVyZW5jZXMgdG8gY2hlY2suCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gdXNlIHRvIGRlcmVmZXJlbmNlIHRoZSByZWZlcmVuY2VzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjayhEYXRhVHlwZSBkdCwgU3RhY2sgc3RrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgcCkgeworICAgICAgICBkdC5kaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHN0aywgcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQorICAgICAqIHJlZmVyZW5jZWQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIGRlcmVmZXJlbmNlZCBvYmplY3QuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcmVmZXJlbmNlIGlzIGludmFsaWQgKGNpcmN1bGFyIHJlZiwgd3JvbmcgY2xhc3MsIGV0YykuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldENoZWNrZWRSZWYoKSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKGdldFByb2plY3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQorICAgICAqIHJlZmVyZW5jZWQgb2JqZWN0LgorICAgICAqIEBwYXJhbSBwIHRoZSBBbnQgUHJvamVjdCBpbnN0YW5jZSBhZ2FpbnN0IHdoaWNoIHRvIHJlc29sdmUgcmVmZXJlbmNlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZXJlZmVyZW5jZWQgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHJlZmVyZW5jZSBpcyBpbnZhbGlkIChjaXJjdWxhciByZWYsIHdyb25nIGNsYXNzLCBldGMpLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRDaGVja2VkUmVmKFByb2plY3QgcCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihnZXRDbGFzcygpLCBnZXREYXRhVHlwZU5hbWUoKSwgcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQorICAgICAqIHJlZmVyZW5jZWQgb2JqZWN0LgorICAgICAqIEBwYXJhbSByZXF1aXJlZENsYXNzIHRoZSBjbGFzcyB0aGF0IHRoaXMgcmVmZXJlbmNlIHNob3VsZCBiZSBhIHN1YmNsYXNzIG9mLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZU5hbWUgIHRoZSBuYW1lIG9mIHRoZSBkYXRhdHlwZSB0aGF0IHRoZSByZWZlcmVuY2Ugc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKGVycm9yIG1lc3NhZ2UgdXNlIG9ubHkpLgorICAgICAqIEByZXR1cm4gdGhlIGRlcmVmZXJlbmNlZCBvYmplY3QuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcmVmZXJlbmNlIGlzIGludmFsaWQgKGNpcmN1bGFyIHJlZiwgd3JvbmcgY2xhc3MsIGV0YykuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRDaGVja2VkUmVmKGZpbmFsIENsYXNzIHJlcXVpcmVkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhVHlwZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYocmVxdWlyZWRDbGFzcywgZGF0YVR5cGVOYW1lLCBnZXRQcm9qZWN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBjaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiByZWZlcmVuY2VkIG9iamVjdC4gIFRoaXMgdmVyc2lvbiBhbGxvd3MgdGhlIGZhbGxiYWNrIFByb2plY3QgaW5zdGFuY2UgdG8gYmUgc3BlY2lmaWVkLgorICAgICAqIEBwYXJhbSByZXF1aXJlZENsYXNzIHRoZSBjbGFzcyB0aGF0IHRoaXMgcmVmZXJlbmNlIHNob3VsZCBiZSBhIHN1YmNsYXNzIG9mLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZU5hbWUgIHRoZSBuYW1lIG9mIHRoZSBkYXRhdHlwZSB0aGF0IHRoZSByZWZlcmVuY2Ugc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKGVycm9yIG1lc3NhZ2UgdXNlIG9ubHkpLgorICAgICAqIEBwYXJhbSBwcm9qZWN0ICAgICAgIHRoZSBmYWxsYmFjayBQcm9qZWN0IGluc3RhbmNlIGZvciBkZXJlZmVyZW5jaW5nLgorICAgICAqIEByZXR1cm4gdGhlIGRlcmVmZXJlbmNlZCBvYmplY3QuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcmVmZXJlbmNlIGlzIGludmFsaWQgKGNpcmN1bGFyIHJlZiwgd3JvbmcgY2xhc3MsIGV0YyksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBpZiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0Q2hlY2tlZFJlZihmaW5hbCBDbGFzcyByZXF1aXJlZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YVR5cGVOYW1lLCBmaW5hbCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBQcm9qZWN0IHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UocHJvamVjdCk7CisgICAgICAgIE9iamVjdCBvID0gcmVmLmdldFJlZmVyZW5jZWRPYmplY3QocHJvamVjdCk7CisgICAgICAgIGlmICghKHJlcXVpcmVkQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvLmdldENsYXNzKCkpKSkgeworICAgICAgICAgICAgbG9nKCJDbGFzcyAiICsgby5nZXRDbGFzcygpICsgIiBpcyBub3QgYSBzdWJjbGFzcyBvZiAiICsgcmVxdWlyZWRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gcmVmLmdldFJlZklkKCkgKyAiIGRvZXNuXCd0IGRlbm90ZSBhICIgKyBkYXRhVHlwZU5hbWU7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGV4Y2VwdGlvbiB0aGF0IGluZGljYXRlcyB0aGF0IHJlZmlkIGhhcyB0byBiZSB0aGUKKyAgICAgKiBvbmx5IGF0dHJpYnV0ZSBpZiBpdCBpcyBzZXQuCisgICAgICogQHJldHVybiB0aGUgZXhjZXB0aW9uIHRvIHRocm93CisgICAgICovCisgICAgcHJvdGVjdGVkIEJ1aWxkRXhjZXB0aW9uIHRvb01hbnlBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lICIKKyAgICAgICAgICAgICsgImF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBleGNlcHRpb24gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIFhNTCBlbGVtZW50IG11c3QKKyAgICAgKiBub3QgaGF2ZSBjaGlsZCBlbGVtZW50cyBpZiB0aGUgcmVmaWQgYXR0cmlidXRlIGlzIHNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24gdG8gdGhyb3cKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQnVpbGRFeGNlcHRpb24gbm9DaGlsZHJlbkFsbG93ZWQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyAiCisgICAgICAgICAgICArICJ3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBleGNlcHRpb24gdGhhdCBpbmRpY2F0ZXMgdGhlIHVzZXIgaGFzIGdlbmVyYXRlZCBhCisgICAgICogbG9vcCBvZiBkYXRhIHR5cGVzIHJlZmVyZW5jaW5nIGVhY2ggb3RoZXIuCisgICAgICogQHJldHVybiB0aGUgZXhjZXB0aW9uIHRvIHRocm93CisgICAgICovCisgICAgcHJvdGVjdGVkIEJ1aWxkRXhjZXB0aW9uIGNpcmN1bGFyUmVmZXJlbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyICIKKyAgICAgICAgICAgICsgInJlZmVyZW5jZS4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmxhZyB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBjaXJjdWxhciByZWZlcmVuY2VzIGhhdmUgYmVlbiBjaGVja2VkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjaXJjdWxhciByZWZlcmVuY2VzIGhhdmUgYmVlbiBjaGVja2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGVja2VkKCkgeworICAgICAgICByZXR1cm4gY2hlY2tlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZsYWcgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgY2lyY3VsYXIgcmVmZXJlbmNlcyBoYXZlIGJlZW4gY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gY2hlY2tlZCBpZiB0cnVlLCBpZiBjaXJjdWxhciByZWZlcmVuY2VzIGhhdmUgYmVlbiBjaGVja2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2hlY2tlZChmaW5hbCBib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIHJlZmVyZW5jZSBzZXQgb24gdGhpcyBvYmplY3QKKyAgICAgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2Ugb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBSZWZlcmVuY2UgZ2V0UmVmaWQoKSB7CisgICAgICAgIHJldHVybiByZWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hlY2sgdGhhdCBpdCBpcyBvayB0byBzZXQgYXR0cmlidXRlcywgaS5lIHRoYXQgbm8gcmVmZXJlbmNlIGlzIGRlZmluZWQKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgbm90IGFsbG93ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNoZWNrIHRoYXQgaXQgaXMgb2sgdG8gYWRkIGNoaWxkcmVuLCBpLmUgdGhhdCBubyByZWZlcmVuY2UgaXMgZGVmaW5lZAorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBub3QgYWxsb3dlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ2hpbGRyZW5BbGxvd2VkKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2ljIERhdGFUeXBlIHRvU3RyaW5nKCkuCisgICAgICogQHJldHVybiB0aGlzIERhdGFUeXBlIGZvcm1hdHRlZCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgZCA9IGdldERlc2NyaXB0aW9uKCk7CisgICAgICAgIHJldHVybiBkID09IG51bGwgPyBnZXREYXRhVHlwZU5hbWUoKSA6IGdldERhdGFUeXBlTmFtZSgpICsgIiAiICsgZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBEYXRhVHlwZS4KKyAgICAgKiBAdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgRGF0YVR5cGUgZHQgPSAoRGF0YVR5cGUpIHN1cGVyLmNsb25lKCk7CisgICAgICAgIGR0LnNldERlc2NyaXB0aW9uKGdldERlc2NyaXB0aW9uKCkpOworICAgICAgICBpZiAoZ2V0UmVmaWQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBkdC5zZXRSZWZpZChnZXRSZWZpZCgpKTsKKyAgICAgICAgfQorICAgICAgICBkdC5zZXRDaGVja2VkKGlzQ2hlY2tlZCgpKTsKKyAgICAgICAgcmV0dXJuIGR0OworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGVzY3JpcHRpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Rlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmOWNlYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Rlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyLlByb2plY3RIZWxwZXIyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVW5rbm93bkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci5Qcm9qZWN0SGVscGVySW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKworLyoqCisgKiBEZXNjcmlwdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgYSBwcm9qZWN0LXdpZGUgZGVzY3JpcHRpb24gZWxlbWVudAorICogKHRoYXQgaXMsIGEgZGVzY3JpcHRpb24gdGhhdCBhcHBsaWVzIHRvIGEgYnVpbGRmaWxlIGFzIGEgd2hvbGUpLgorICogSWYgcHJlc2VudCwgdGhlICZsdDtkZXNjcmlwdGlvbiZndDsgZWxlbWVudCBpcyBwcmludGVkIG91dCBiZWZvcmUgdGhlCisgKiB0YXJnZXQgZGVzY3JpcHRpb25zLgorICoKKyAqIERlc2NyaXB0aW9uIGhhcyBubyBhdHRyaWJ1dGVzLCBvbmx5IHRleHQuICBUaGVyZSBjYW4gb25seSBiZSBvbmUKKyAqIHByb2plY3QgZGVzY3JpcHRpb24gcGVyIHByb2plY3QuICBBIHNlY29uZCBkZXNjcmlwdGlvbiBlbGVtZW50IHdpbGwKKyAqIG92ZXJ3cml0ZSB0aGUgZmlyc3QuCisgKgorICoKKyAqIEBhbnQuZGF0YXR5cGUgaWdub3JlPSJ0cnVlIgorICovCitwdWJsaWMgY2xhc3MgRGVzY3JpcHRpb24gZXh0ZW5kcyBEYXRhVHlwZSB7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGRlc2NyaXB0aXZlIHRleHQgdG8gdGhlIHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgZGVzY3JpcHRpdmUgdGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKworICAgICAgICBQcm9qZWN0SGVscGVyIHBoID0gUHJvamVjdEhlbHBlci5nZXRQcm9qZWN0SGVscGVyKCk7CisgICAgICAgIGlmICghKHBoIGluc3RhbmNlb2YgUHJvamVjdEhlbHBlckltcGwpKSB7CisgICAgICAgICAgICAvLyBOZXcgYmVoYXZpb3IgZm9yIGRlbGF5ZWQgdGFzayBjcmVhdGlvbi4gRGVzY3JpcHRpb24KKyAgICAgICAgICAgIC8vIHdpbGwgYmUgZXZhbHVhdGVkIGluIFByb2plY3QuZ2V0RGVzY3JpcHRpb24oKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBjdXJyZW50RGVzY3JpcHRpb24gPSBnZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgaWYgKGN1cnJlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0RGVzY3JpcHRpb24odGV4dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0RGVzY3JpcHRpb24oY3VycmVudERlc2NyaXB0aW9uICsgdGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aW9ucyBmcm9tIGFsbCB0aGUgdGFyZ2V0cyBvZgorICAgICAqIGEgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIGdldCB0aGUgZGVzY3JpcHRpb25zIGZvci4KKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBkZXNjcmlwdGlvbnMgb2YKKyAgICAgKiAgICAgICAgIHRoZSB0YXJnZXRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBWZWN0b3IgdGFyZ2V0cyA9IChWZWN0b3IpIHByb2plY3QuZ2V0UmVmZXJlbmNlKFByb2plY3RIZWxwZXIyLlJFRklEX1RBUkdFVFMpOworICAgICAgICBpZiAodGFyZ2V0cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgZGVzY3JpcHRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgVGFyZ2V0IHQgPSAoVGFyZ2V0KSB0YXJnZXRzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGNvbmNhdERlc2NyaXB0aW9ucyhwcm9qZWN0LCB0LCBkZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb25jYXREZXNjcmlwdGlvbnMoUHJvamVjdCBwcm9qZWN0LCBUYXJnZXQgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFZlY3RvciB0YXNrcyA9IGZpbmRFbGVtZW50SW5UYXJnZXQocHJvamVjdCwgdCwgImRlc2NyaXB0aW9uIik7CisgICAgICAgIGlmICh0YXNrcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgVGFzayB0YXNrID0gKFRhc2spIHRhc2tzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGlmICghKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVua25vd25FbGVtZW50IHVlID0gKChVbmtub3duRWxlbWVudCkgdGFzayk7CisgICAgICAgICAgICBTdHJpbmcgZGVzY0NvbXAgPSB1ZS5nZXRXcmFwcGVyKCkuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoZGVzY0NvbXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmFwcGVuZChwcm9qZWN0LnJlcGxhY2VQcm9wZXJ0aWVzKGRlc2NDb21wKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBWZWN0b3IgZmluZEVsZW1lbnRJblRhcmdldChQcm9qZWN0IHByb2plY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0IHQsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIFRhc2tbXSB0YXNrcyA9IHQuZ2V0VGFza3MoKTsKKyAgICAgICAgVmVjdG9yIGVsZW1zID0gbmV3IFZlY3RvcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHModGFza3NbaV0uZ2V0VGFza05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBlbGVtcy5hZGRFbGVtZW50KHRhc2tzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZWxlbXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EaXJTZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RpclNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0N2RiOTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EaXJTZXQuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZUl0ZXJhdG9yOworCisvKioKKyAqIFN1YmNsYXNzIGFzIGhpbnQgZm9yIHN1cHBvcnRpbmcgdGFza3MgdGhhdCB0aGUgaW5jbHVkZWQgZGlyZWN0b3JpZXMKKyAqIGluc3RlYWQgb2YgZmlsZXMgc2hvdWxkIGJlIHVzZWQuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIERpclNldCBleHRlbmRzIEFic3RyYWN0RmlsZVNldCBpbXBsZW1lbnRzIFJlc291cmNlQ29sbGVjdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRGlyU2V0LgorICAgICAqLworICAgIHB1YmxpYyBEaXJTZXQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERpclNldCwgd2l0aCBEaXJTZXQgdG8gc2hhbGxvd2x5IGNsb25lLgorICAgICAqIEBwYXJhbSBkaXJzZXQgdGhlIGRpcnNldCB0byBjbG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlyU2V0KERpclNldCBkaXJzZXQpIHsKKyAgICAgICAgc3VwZXIoZGlyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBEaXJTZXQgdGhhdCBoYXMgdGhlIHNhbWUgYmFzZWRpciBhbmQgc2FtZSBwYXR0ZXJuc2V0cworICAgICAqIGFzIHRoaXMgb25lLgorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCBkaXJzZXQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKERpclNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLmNsb25lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9mIFJlc291cmNlcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKERpclNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvcihnZXREaXIoZ2V0UHJvamVjdCgpKSwKKyAgICAgICAgICAgIGdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKS5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChEaXJTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKS5nZXRJbmNsdWRlZERpcnNDb3VudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsd2F5cyByZXR1cm5zIHRydWUuCisgICAgICogQHJldHVybiB0cnVlIGluZGljYXRpbmcgdGhhdCBhbGwgZWxlbWVudHMgd2lsbCBiZSBGaWxlUmVzb3VyY2VzLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmNsdWRlZCBkaXJlY3RvcmllcyBhcyBhIGxpc3Qgb2Ygc2VtaWNvbG9uLXNlcGFyYXRlZCBwYXRocy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9mIGluY2x1ZGVkIGRpcmVjdG9yaWVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBnZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgIFN0cmluZ1tdIGRpcnMgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnOycpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKGRpcnNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW51bWVyYXRlZEF0dHJpYnV0ZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW51bWVyYXRlZEF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZTc5NGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnVtZXJhdGVkQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3IgYXR0cmlidXRlcyB0aGF0IGNhbiBvbmx5IHRha2Ugb25lIG9mIGEgZml4ZWQgbGlzdAorICogb2YgdmFsdWVzLgorICoKKyAqIDxwPlNlZSB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRml4Q1JMRiBGaXhDUkxGfSBmb3IgYW4KKyAqIGV4YW1wbGUuCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvKioKKyAgICAgKiBUaGUgc2VsZWN0ZWQgdmFsdWUgaW4gdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgdmFsdWUgaW4gdGhlIGFycmF5LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGluZGV4ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBvbmx5IG1ldGhvZCBhIHN1YmNsYXNzIG5lZWRzIHRvIGltcGxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgaG9sZGluZyBhbGwgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgKiBUaGUgb3JkZXIgb2YgZWxlbWVudHMgbXVzdCBiZSBmaXhlZCBzbyB0aGF0IDx0dD5pbmRleE9mVmFsdWUoU3RyaW5nKTwvdHQ+CisgICAgICogYWx3YXlzIHJldHVybiB0aGUgc2FtZSBpbmRleCBmb3IgdGhlIHNhbWUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbHVlcygpOworCisgICAgLyoqIGJlYW4gY29uc3RydWN0b3IgKi8KKyAgICBwcm90ZWN0ZWQgRW51bWVyYXRlZEF0dHJpYnV0ZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgaW5zdGFudGlhdGluZyBFQXMgdmlhIEFQSSBpbiBhIG1vcmUKKyAgICAgKiBkZXZlbG9wZXIgZnJpZW5kbHkgd2F5LgorICAgICAqIEBwYXJhbSBjbGF6eiAgICAgICAgICAgICBDbGFzcywgZXh0ZW5kaW5nIEVBLCB3aGljaCB0byBpbnN0YW50aWF0ZQorICAgICAqIEBwYXJhbSB2YWx1ZSAgICAgICAgICAgICBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoYXQgRUEKKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgQ29uZmlndXJlZCBFQQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gICBJZiB0aGUgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kIG9yIHRoZSB2YWx1ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgdmFsaWQgZm9yIHRoZSBnaXZlbiBFQS1jbGFzcy4KKyAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MzEiPgorICAgICAqIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MzE8L2E+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbnVtZXJhdGVkQXR0cmlidXRlIGdldEluc3RhbmNlKAorICAgICAgICBDbGFzcy8qPD8gZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlPiovIGNsYXp6LAorICAgICAgICBTdHJpbmcgdmFsdWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghRW51bWVyYXRlZEF0dHJpYnV0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJZb3UgaGF2ZSB0byBwcm92aWRlIGEgc3ViY2xhc3MgZnJvbSBFbnVtZXJhdGVkQXR0cmlidXQgYXMgY2xhenotcGFyYW1ldGVyLiIpOworICAgICAgICB9CisgICAgICAgIEVudW1lcmF0ZWRBdHRyaWJ1dGUgZWEgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZWEgPSAoRW51bWVyYXRlZEF0dHJpYnV0ZSkgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBlYS5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgIHJldHVybiBlYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IHtAbGluayBvcmcuYXBhY2hlLnRvb2xzLmFudC5JbnRyb3NwZWN0aW9uSGVscGVyIEludHJvc3BlY3Rpb25IZWxwZXJ9LgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkIGZvciB0aGUgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpbnQgaWR4ID0gaW5kZXhPZlZhbHVlKHZhbHVlKTsKKyAgICAgICAgaWYgKGlkeCA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHZhbHVlICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmluZGV4ID0gaWR4OworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhpcyB2YWx1ZSBpbmNsdWRlZCBpbiB0aGUgZW51bWVyYXRpb24/CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlIHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIHZhbGlkCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY29udGFpbnNWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIChpbmRleE9mVmFsdWUodmFsdWUpICE9IC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGluZGV4IG9mIGEgdmFsdWUgaW4gdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB2YWx1ZSB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgdmFsdWUgaW4gdGhlIGFycmF5IG9mIHN0cmluZ3MKKyAgICAgKiBvciAtMSBpZiBpdCBjYW5ub3QgYmUgZm91bmQuCisgICAgICogQHNlZSAjZ2V0VmFsdWVzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGluZGV4T2ZWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gZ2V0VmFsdWVzKCk7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHModmFsdWVzW2ldKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIHZhbHVlIGluIHRoZSBhcnJheS4KKyAgICAgKiBAc2VlICNnZXRWYWx1ZXMoKQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSB2YWx1ZSB0byBpdHMgc3RyaW5nIGZvcm0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnZpcm9ubWVudC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW52aXJvbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTY5NWI5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW52aXJvbm1lbnQuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBXcmFwcGVyIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgRW52aXJvbm1lbnQgeworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisKKyAgICAvKioKKyAgICAgKiBhIHZlY3RvciBvZiB0eXBlIEVudmlyb21tZW50LlZhcmlhYmxlCisgICAgICogQHNlZSBWYXJpYWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgdmFyaWFibGVzOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGVudiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFyaWFibGUgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBlbnYga2V5IGFuZCB2YWx1ZSBwYWlyOyBldmVyeXRoaW5nIGdldHMgZXhwYW5kZWQgdG8gYSBzdHJpbmcKKyAgICAgICAgICogZHVyaW5nIGFzc2lnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGtleSwgdmFsdWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIGZvciB2YXJpYWJsZQorICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFZhcmlhYmxlKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBzZXQgdGhlIGtleQorICAgICAgICAgKiBAcGFyYW0ga2V5IHN0cmluZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHNldCB0aGUgdmFsdWUKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHN0cmluZyB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICoga2V5IGFjY2Vzc29yCisgICAgICAgICAqIEByZXR1cm4ga2V5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmtleTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiB2YWx1ZSBhY2Nlc3NvcgorICAgICAgICAgKiBAcmV0dXJuIHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogc3RyaW5naWZ5IHBhdGggYW5kIGFzc2lnbiB0byB0aGUgdmFsdWUuCisgICAgICAgICAqIFRoZSB2YWx1ZSB3aWxsIGNvbnRhaW4gYWxsIHBhdGggZWxlbWVudHMgc2VwYXJhdGVkIGJ5IHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgKiBzZXBhcmF0b3IKKyAgICAgICAgICogQHBhcmFtIHBhdGggcGF0aAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGF0aChQYXRoIHBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSBwYXRoLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogZ2V0IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIGEgZmlsZSBhbmQgYXNzaWduIGl0IHRvIHRoZSB2YWx1ZQorICAgICAgICAgKiBAcGFyYW0gZmlsZSBmaWxlIHRvIHVzZSBhcyB0aGUgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoamF2YS5pby5GaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGdldCB0aGUgYXNzaWdtZW50IHN0cmluZworICAgICAgICAgKiBUaGlzIGlzIG5vdCByZWFkeSBmb3IgaW5zZXJ0aW9uIGludG8gYSBwcm9wZXJ0eSBmaWxlIHdpdGhvdXQgZm9sbG93aW5nCisgICAgICAgICAqIHRoZSBlc2NhcGluZyBydWxlcyBvZiB0aGUgcHJvcGVydGllcyBjbGFzcy4KKyAgICAgICAgICogQHJldHVybiBhIHN0cmluZyBvZiB0aGUgZm9ybSBrZXk9dmFsdWUuCisgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYga2V5IG9yIHZhbHVlIGFyZSB1bmFzc2lnbmVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoa2V5LnRyaW0oKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIj0iKS5hcHBlbmQodmFsdWUudHJpbSgpKTsKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNoZWNrcyB3aGV0aGVyIGFsbCByZXF1aXJlZCBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzcGVjaWZpZWQuCisgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYga2V5IG9yIHZhbHVlIGFyZSB1bmFzc2lnbmVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJrZXkgYW5kIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIEVudmlyb25tZW50KCkgeworICAgICAgICB2YXJpYWJsZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgdmFyaWFibGUuCisgICAgICogVmFsaWRpdHkgY2hlY2tpbmcgaXMgPGk+bm90PC9pPiBwZXJmb3JtZWQgYXQgdGhpcyBwb2ludC4gRHVwbGljYXRlcworICAgICAqIGFyZSBub3QgY2F1Z2h0IGVpdGhlci4KKyAgICAgKiBAcGFyYW0gdmFyIG5ldyB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRWYXJpYWJsZShWYXJpYWJsZSB2YXIpIHsKKyAgICAgICAgdmFyaWFibGVzLmFkZEVsZW1lbnQodmFyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIHZhcmlhYmxlIGxpc3QgYXMgYW4gYXJyYXkKKyAgICAgKiBAcmV0dXJuIGFycmF5IG9mIGtleT12YWx1ZSBhc3NpZ25tZW50IHN0cmluZ3MKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSB2YXJpYWJsZSBpcyBtaXNjb25maWd1cmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFZhcmlhYmxlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YXJpYWJsZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbdmFyaWFibGVzLnNpemUoKV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSAoKFZhcmlhYmxlKSB2YXJpYWJsZXMuZWxlbWVudEF0KGkpKS5nZXRDb250ZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJhdyB2ZWN0b3Igb2YgdmFyaWFibGVzLiBUaGlzIGlzIG5vdCBhIGNsb25lLgorICAgICAqIEByZXR1cm4gYSBwb3RlbnRpYWxseSBlbXB0eSAoYnV0IG5ldmVyIG51bGwpIHZlY3RvciBvZiBlbGVtZW50cyBvZiB0eXBlCisgICAgICogVmFyaWFibGUKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBWZWN0b3IgZ2V0VmFyaWFibGVzVmVjdG9yKCkgeworICAgICAgICByZXR1cm4gdmFyaWFibGVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVMaXN0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMTYzNmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlTGlzdC5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZUl0ZXJhdG9yOworCisvKioKKyAqIEZpbGVMaXN0IHJlcHJlc2VudHMgYW4gZXhwbGljaXRseSBuYW1lZCBsaXN0IG9mIGZpbGVzLiAgRmlsZUxpc3RzCisgKiBhcmUgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gY2FwdHVyZSBhIGxpc3Qgb2YgZmlsZXMgcmVnYXJkbGVzcyBvZgorICogd2hldGhlciB0aGV5IGN1cnJlbnRseSBleGlzdC4gIEJ5IGNvbnRyYXN0LCBGaWxlU2V0IG9wZXJhdGVzIGFzIGEKKyAqIGZpbHRlciwgb25seSByZXR1cm5pbmcgdGhlIG5hbWUgb2YgYSBtYXRjaGVkIGZpbGUgaWYgaXQgY3VycmVudGx5CisgKiBleGlzdHMgaW4gdGhlIGZpbGUgc3lzdGVtLgorICovCitwdWJsaWMgY2xhc3MgRmlsZUxpc3QgZXh0ZW5kcyBEYXRhVHlwZSBpbXBsZW1lbnRzIFJlc291cmNlQ29sbGVjdGlvbiB7CisKKyAgICBwcml2YXRlIFZlY3RvciBmaWxlbmFtZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBGaWxlIGRpcjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIEZpbGVMaXN0KCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbGlzdCBhIDxjb2RlPkZpbGVMaXN0PC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlTGlzdChGaWxlTGlzdCBmaWxlbGlzdCkgeworICAgICAgICB0aGlzLmRpciAgICAgICA9IGZpbGVsaXN0LmRpcjsKKyAgICAgICAgdGhpcy5maWxlbmFtZXMgPSBmaWxlbGlzdC5maWxlbmFtZXM7CisgICAgICAgIHNldFByb2plY3QoZmlsZWxpc3QuZ2V0UHJvamVjdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGlzIGluc3RhbmNlIGluIGVmZmVjdCBhIHJlZmVyZW5jZSB0byBhbm90aGVyIEZpbGVMaXN0CisgICAgICogaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFub3RoZXIgYXR0cmlidXRlIG9yIG5lc3QgZWxlbWVudHMgaW5zaWRlCisgICAgICogdGhpcyBlbGVtZW50IGlmIHlvdSBtYWtlIGl0IGEgcmVmZXJlbmNlLjwvcD4KKyAgICAgKiBAcGFyYW0gciB0aGUgcmVmZXJlbmNlIHRvIGFub3RoZXIgZmlsZWxpc3QuCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoZGlyICE9IG51bGwpIHx8IChmaWxlbmFtZXMuc2l6ZSgpICE9IDApKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSB0aGlzIGZpbGVsaXN0IGlzIHJlbGF0aXZlIHRvLgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyKEZpbGUgZGlyKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIHRoaXMuZGlyID0gZGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcmV0dXJuIHRoZSBkaXJlY3RvcnkgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RGlyKFByb2plY3QgcCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXREaXIocCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZpbGVuYW1lcyBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWVzIGEgc3RyaW5nIGNvbnRhaW5zIGZpbGVuYW1lcywgc2VwYXJhdGVkIGJ5ICwgb3IKKyAgICAgKiAgICAgICAgYnkgd2hpdGVzcGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlcyhTdHJpbmcgZmlsZW5hbWVzKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgaWYgKGZpbGVuYW1lcyAhPSBudWxsICYmIGZpbGVuYW1lcy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKAorICAgICAgICAgICAgICAgIGZpbGVuYW1lcywgIiwgXHRcblxyXGYiLCBmYWxzZSk7CisgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgdGhpcy5maWxlbmFtZXMuYWRkRWxlbWVudCh0b2submV4dFRva2VuKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmaWxlcyByZXByZXNlbnRlZCBieSB0aGlzIEZpbGVMaXN0LgorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzIHJlcHJlc2VudGVkIGJ5IHRoaXMgRmlsZUxpc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEZpbGVzKFByb2plY3QgcCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXRGaWxlcyhwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBkaXJlY3Rvcnkgc3BlY2lmaWVkIGZvciBmaWxlbGlzdC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlbmFtZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gZmlsZXMgc3BlY2lmaWVkIGZvciBmaWxlbGlzdC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbZmlsZW5hbWVzLnNpemUoKV07CisgICAgICAgIGZpbGVuYW1lcy5jb3B5SW50byhyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBjaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiByZWZlcmVuY2VkIEZpbGVMaXN0LgorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcmV0dXJuIHRoZSBGaWxlTGlzdCByZXByZXNlbnRlZCBieSBhIHJlZmVyZW5jZWQgZmlsZWxpc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGVMaXN0IGdldFJlZihQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIChGaWxlTGlzdCkgZ2V0Q2hlY2tlZFJlZihwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbm5lciBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSAmbHQ7ZmlsZSZndDsgbmVzdGVkIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlTmFtZSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgZmlsZSBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIGZpbGUgdG8gYWRkIHRvIHRoZSBmaWxlIGxpc3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpbGUgZm9yIHRoaXMgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmVzdGVkICZsdDtmaWxlJmd0OyBuZXN0ZWQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGEgY29uZmlndXJlZCBmaWxlIGVsZW1lbnQgd2l0aCBhIG5hbWUuCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRGaWxlKEZpbGVOYW1lIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiTm8gbmFtZSBzcGVjaWZpZWQgaW4gbmVzdGVkIGZpbGUgZWxlbWVudCIpOworICAgICAgICB9CisgICAgICAgIGZpbGVuYW1lcy5hZGRFbGVtZW50KG5hbWUuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChGaWxlTGlzdCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvcihkaXIsCisgICAgICAgICAgICAoU3RyaW5nW10pIChmaWxlbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2ZpbGVuYW1lcy5zaXplKCldKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChGaWxlTGlzdCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZW5hbWVzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbHdheXMgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgYWxsIGVsZW1lbnRzIHdpbGwgYmUgRmlsZVJlc291cmNlcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZVNldC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0M2VmZTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZUl0ZXJhdG9yOworCisvKioKKyAqIE1vdmVkIG91dCBvZiBNYXRjaGluZ1Rhc2sgdG8gbWFrZSBpdCBhIHN0YW5kYWxvbmUgb2JqZWN0IHRoYXQgY291bGQKKyAqIGJlIHJlZmVyZW5jZWQgKGJ5IHNjcmlwdHMgZm9yIGV4YW1wbGUpLgorICoKKyAqLworcHVibGljIGNsYXNzIEZpbGVTZXQgZXh0ZW5kcyBBYnN0cmFjdEZpbGVTZXQgaW1wbGVtZW50cyBSZXNvdXJjZUNvbGxlY3Rpb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIEZpbGVTZXQuCisgICAgICovCisgICAgcHVibGljIEZpbGVTZXQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIEZpbGVTZXQsIHdpdGggRmlsZVNldCB0byBzaGFsbG93bHkgY2xvbmUuCisgICAgICogQHBhcmFtIGZpbGVzZXQgdGhlIGZpbGVzZXQgdG8gY2xvbmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZVNldChGaWxlU2V0IGZpbGVzZXQpIHsKKyAgICAgICAgc3VwZXIoZmlsZXNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgRmlsZVNldCB0aGF0IGhhcyB0aGUgc2FtZSBiYXNlZGlyIGFuZCBzYW1lIHBhdHRlcm5zZXRzCisgICAgICogYXMgdGhpcyBvbmUuCisgICAgICogQHJldHVybiB0aGUgY2xvbmVkIGZpbGVzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoRmlsZVNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLmNsb25lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9mIFJlc291cmNlcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5pdGVyYXRvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRmlsZVJlc291cmNlSXRlcmF0b3IoZ2V0RGlyKGdldFByb2plY3QoKSksCisgICAgICAgICAgICBnZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSkuZ2V0SW5jbHVkZWRGaWxlcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW50LgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoRmlsZVNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpLmdldEluY2x1ZGVkRmlsZXNDb3VudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsd2F5cyByZXR1cm5zIHRydWUuCisgICAgICogQHJldHVybiB0cnVlIGluZGljYXRpbmcgdGhhdCBhbGwgZWxlbWVudHMgd2lsbCBiZSBGaWxlUmVzb3VyY2VzLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWx0ZXJDaGFpbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyQ2hhaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk5OWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyQ2hhaW4uamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkNoYWluYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkNsYXNzQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuRXNjYXBlVW5pY29kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkV4cGFuZFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5IZWFkRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuTGluZUNvbnRhaW5zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuTGluZUNvbnRhaW5zUmVnRXhwOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuUHJlZml4TGluZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5SZXBsYWNlVG9rZW5zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuU3RyaXBKYXZhQ29tbWVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5TdHJpcExpbmVCcmVha3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5TdHJpcExpbmVDb21tZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlRhYnNUb1NwYWNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlRhaWxGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5Ub2tlbkZpbHRlcjsKKworCisvKioKKyAqIEZpbHRlckNoYWluIG1heSBjb250YWluIGEgY2hhaW5lZCBzZXQgb2YgZmlsdGVyIHJlYWRlcnMuCisgKgorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyQ2hhaW4gZXh0ZW5kcyBEYXRhVHlwZQorICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgIHByaXZhdGUgVmVjdG9yIGZpbHRlclJlYWRlcnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gQW50RmlsdGVyUmVhZGVyIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJSZWFkZXIgYW4gPGNvZGU+QW50RmlsdGVyUmVhZGVyPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbHRlclJlYWRlcihmaW5hbCBBbnRGaWx0ZXJSZWFkZXIgZmlsdGVyUmVhZGVyKSB7CisgICAgICAgIGZpbHRlclJlYWRlcnMuYWRkRWxlbWVudChmaWx0ZXJSZWFkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlsdGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5WZWN0b3I8L2NvZGU+IHZhbHVlIGNvbnRhaW5pbmcgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgVmVjdG9yIGdldEZpbHRlclJlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXJSZWFkZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIENsYXNzQ29uc3RhbnRzIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0NvbnN0YW50cyBhIDxjb2RlPkNsYXNzQ29uc3RhbnRzPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENsYXNzQ29uc3RhbnRzKGZpbmFsIENsYXNzQ29uc3RhbnRzIGNsYXNzQ29uc3RhbnRzKSB7CisgICAgICAgIGZpbHRlclJlYWRlcnMuYWRkRWxlbWVudChjbGFzc0NvbnN0YW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIEV4cGFuZFByb3BlcnRpZXMgZmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cGFuZFByb3BlcnRpZXMgYW4gPGNvZGU+RXhwYW5kUHJvcGVydGllczwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFeHBhbmRQcm9wZXJ0aWVzKGZpbmFsIEV4cGFuZFByb3BlcnRpZXMgZXhwYW5kUHJvcGVydGllcykgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQoZXhwYW5kUHJvcGVydGllcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgSGVhZEZpbHRlciBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGVhZEZpbHRlciBhIDxjb2RlPkhlYWRGaWx0ZXI8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSGVhZEZpbHRlcihmaW5hbCBIZWFkRmlsdGVyIGhlYWRGaWx0ZXIpIHsKKyAgICAgICAgZmlsdGVyUmVhZGVycy5hZGRFbGVtZW50KGhlYWRGaWx0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIExpbmVDb250YWlucyBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZUNvbnRhaW5zIGEgPGNvZGU+TGluZUNvbnRhaW5zPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpbmVDb250YWlucyhmaW5hbCBMaW5lQ29udGFpbnMgbGluZUNvbnRhaW5zKSB7CisgICAgICAgIGZpbHRlclJlYWRlcnMuYWRkRWxlbWVudChsaW5lQ29udGFpbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIExpbmVDb250YWluc1JlZ0V4cCBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZUNvbnRhaW5zUmVnRXhwIGEgPGNvZGU+TGluZUNvbnRhaW5zUmVnRXhwPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpbmVDb250YWluc1JlZ0V4cChmaW5hbCBMaW5lQ29udGFpbnNSZWdFeHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVDb250YWluc1JlZ0V4cCkgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQobGluZUNvbnRhaW5zUmVnRXhwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBQcmVmaXhMaW5lcyBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4TGluZXMgYSA8Y29kZT5QcmVmaXhMaW5lczwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcmVmaXhMaW5lcyhmaW5hbCBQcmVmaXhMaW5lcyBwcmVmaXhMaW5lcykgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQocHJlZml4TGluZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFJlcGxhY2VUb2tlbnMgZmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcGxhY2VUb2tlbnMgYSA8Y29kZT5SZXBsYWNlVG9rZW5zPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlcGxhY2VUb2tlbnMoZmluYWwgUmVwbGFjZVRva2VucyByZXBsYWNlVG9rZW5zKSB7CisgICAgICAgIGZpbHRlclJlYWRlcnMuYWRkRWxlbWVudChyZXBsYWNlVG9rZW5zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBTdHJpcEphdmFDb21tYW5kcyBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaXBKYXZhQ29tbWVudHMgYSA8Y29kZT5TdHJpcEphdmFDb21tZW50czwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTdHJpcEphdmFDb21tZW50cyhmaW5hbCBTdHJpcEphdmFDb21tZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBKYXZhQ29tbWVudHMpIHsKKyAgICAgICAgZmlsdGVyUmVhZGVycy5hZGRFbGVtZW50KHN0cmlwSmF2YUNvbW1lbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBTdHJpcExpbmVCcmVha3MgZmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmlwTGluZUJyZWFrcyBhIDxjb2RlPlN0cmlwTGluZUJyZWFrczwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTdHJpcExpbmVCcmVha3MoZmluYWwgU3RyaXBMaW5lQnJlYWtzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcExpbmVCcmVha3MpIHsKKyAgICAgICAgZmlsdGVyUmVhZGVycy5hZGRFbGVtZW50KHN0cmlwTGluZUJyZWFrcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgU3RyaXBMaW5lQ29tbWVudHMgZmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmlwTGluZUNvbW1lbnRzIGEgPGNvZGU+U3RyaXBMaW5lQ29tbWVudHM8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU3RyaXBMaW5lQ29tbWVudHMoZmluYWwgU3RyaXBMaW5lQ29tbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwTGluZUNvbW1lbnRzKSB7CisgICAgICAgIGZpbHRlclJlYWRlcnMuYWRkRWxlbWVudChzdHJpcExpbmVDb21tZW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgVGFic1RvU3BhY2VzIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWJzVG9TcGFjZXMgYSA8Y29kZT5UYWJzVG9TcGFjZXM8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGFic1RvU3BhY2VzKGZpbmFsIFRhYnNUb1NwYWNlcyB0YWJzVG9TcGFjZXMpIHsKKyAgICAgICAgZmlsdGVyUmVhZGVycy5hZGRFbGVtZW50KHRhYnNUb1NwYWNlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgVGFpbEZpbHRlciBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFpbEZpbHRlciBhIDxjb2RlPlRhaWxGaWx0ZXI8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGFpbEZpbHRlcihmaW5hbCBUYWlsRmlsdGVyIHRhaWxGaWx0ZXIpIHsKKyAgICAgICAgZmlsdGVyUmVhZGVycy5hZGRFbGVtZW50KHRhaWxGaWx0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBFc2NhcGVVbmljb2RlIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlc2NhcGVVbmljb2RlIGFuIDxjb2RlPkVzY2FwZVVuaWNvZGU8L2NvZGU+IHZhbHVlCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFc2NhcGVVbmljb2RlKGZpbmFsIEVzY2FwZVVuaWNvZGUgZXNjYXBlVW5pY29kZSkgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQoZXNjYXBlVW5pY29kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgVG9rZW5GaWx0ZXIgZmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuRmlsdGVyIGEgPGNvZGU+VG9rZW5GaWx0ZXI8L2NvZGU+IHZhbHVlCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUb2tlbkZpbHRlcihmaW5hbCBUb2tlbkZpbHRlciB0b2tlbkZpbHRlcikgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQodG9rZW5GaWx0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGRlbGV0ZSBjaGFyYWN0ZXJzIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXIgYSA8Y29kZT5Ub2tlbkZpbHRlci5EZWxldGVDaGFyYWN0ZXJzPC9jb2RlPiB2YWx1ZQorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVsZXRlQ2hhcmFjdGVycyhUb2tlbkZpbHRlci5EZWxldGVDaGFyYWN0ZXJzIGZpbHRlcikgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb250YWluc3JlZ2V4IGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXIgYSA8Y29kZT5Ub2tlbkZpbHRlci5Db250YWluc1JlZ2V4PC9jb2RlPiB2YWx1ZQorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29udGFpbnNSZWdleChUb2tlbkZpbHRlci5Db250YWluc1JlZ2V4IGZpbHRlcikgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZXBsYWNlcmVnZXggZmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlciBhIDxjb2RlPlRva2VuRmlsdGVyLlJlcGxhY2VSZWdleDwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZXBsYWNlUmVnZXgoVG9rZW5GaWx0ZXIuUmVwbGFjZVJlZ2V4IGZpbHRlcikgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB0cmltIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXIgYSA8Y29kZT5Ub2tlbkZpbHRlci5UcmltPC9jb2RlPiB2YWx1ZQorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVHJpbShUb2tlbkZpbHRlci5UcmltIGZpbHRlcikgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZXBsYWNlc3RyaW5nIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXIgYSA8Y29kZT5Ub2tlbkZpbHRlci5SZXBsYWNlU3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVwbGFjZVN0cmluZygKKyAgICAgICAgVG9rZW5GaWx0ZXIuUmVwbGFjZVN0cmluZyBmaWx0ZXIpIHsKKyAgICAgICAgZmlsdGVyUmVhZGVycy5hZGRFbGVtZW50KGZpbHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGlnbm9yZUJsYW5rIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXIgYSA8Y29kZT5Ub2tlbkZpbHRlci5JZ25vcmVCbGFuazwvY29kZT4gdmFsdWUKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZElnbm9yZUJsYW5rKAorICAgICAgICBUb2tlbkZpbHRlci5JZ25vcmVCbGFuayBmaWx0ZXIpIHsKKyAgICAgICAgZmlsdGVyUmVhZGVycy5hZGRFbGVtZW50KGZpbHRlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGlzIGluc3RhbmNlIGluIGVmZmVjdCBhIHJlZmVyZW5jZSB0byBhbm90aGVyIEZpbHRlckNoYWluCisgICAgICogaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFub3RoZXIgYXR0cmlidXRlIG9yIG5lc3QgZWxlbWVudHMgaW5zaWRlCisgICAgICogdGhpcyBlbGVtZW50IGlmIHlvdSBtYWtlIGl0IGEgcmVmZXJlbmNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gd2hpY2ggdGhpcyBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGlzIGluc3RhbmNlIGFscmVhZHkgaGFzIGJlZW4gY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFmaWx0ZXJSZWFkZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGFuZ2UgdGhpcyB0byBnZXQgdGhlIG9iamVjdHMgZnJvbSB0aGUgb3RoZXIgcmVmZXJlbmNlCisgICAgICAgIE9iamVjdCBvID0gci5nZXRSZWZlcmVuY2VkT2JqZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRmlsdGVyQ2hhaW4pIHsKKyAgICAgICAgICAgIEZpbHRlckNoYWluIGZjID0gKEZpbHRlckNoYWluKSBvOworICAgICAgICAgICAgZmlsdGVyUmVhZGVycyA9IGZjLmdldEZpbHRlclJlYWRlcnMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSByLmdldFJlZklkKCkgKyAiIGRvZXNuXCd0IHJlZmVyIHRvIGEgRmlsdGVyQ2hhaW4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjaGFpbmZpbHRlciBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyIGEgPGNvZGU+Q2hhaW5hYmxlUmVhZGVyPC9jb2RlPiB2YWx1ZQorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBhZGQoQ2hhaW5hYmxlUmVhZGVyIGZpbHRlcikgeworICAgICAgICBmaWx0ZXJSZWFkZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyNzI1YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldC5qYXZhCkBAIC0wLDAgKzEsNjE1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIEEgc2V0IG9mIGZpbHRlcnMgdG8gYmUgYXBwbGllZCB0byBzb21ldGhpbmcuCisgKgorICogQSBmaWx0ZXIgc2V0IG1heSBoYXZlIGJlZ2ludG9rZW4gYW5kIGVuZHRva2VucyBkZWZpbmVkLgorICoKKyAqLworcHVibGljIGNsYXNzIEZpbHRlclNldCBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgIC8qKgorICAgICAqIEluZGl2aWR1YWwgZmlsdGVyIGNvbXBvbmVudCBvZiBmaWx0ZXJzZXQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlciB7CisgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgICAgIC8qKiBUb2tlbiB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGluIHRoZSBmaWx0ZXIgb3BlcmF0aW9uLiAqLworICAgICAgICBTdHJpbmcgdG9rZW47CisKKyAgICAgICAgLyoqIFRoZSB2YWx1ZSB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIHRva2VuIGluIHRoZSBmaWx0ZXJpbmcgb3BlcmF0aW9uLiAqLworICAgICAgICBTdHJpbmcgdmFsdWU7CisgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgRmlsdGVyIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRva2VuICBUaGUgdG9rZW4gd2hpY2ggd2lsbCBiZSByZXBsYWNlZCB3aGVuIGZpbHRlcmluZy4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlICBUaGUgdmFsdWUgd2hpY2ggd2lsbCByZXBsYWNlIHRoZSB0b2tlbiB3aGVuIGZpbHRlcmluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGaWx0ZXIoU3RyaW5nIHRva2VuLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgc2V0VG9rZW4odG9rZW4pOworICAgICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTm8tYXJndW1lbnQgY29ubXN0cnVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZpbHRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBUb2tlbiBhdHRyaWJ1dGUgb2YgdGhlIEZpbHRlciBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0b2tlbiAgVGhlIG5ldyBUb2tlbiB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRva2VuKFN0cmluZyB0b2tlbikgeworICAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgVmFsdWUgYXR0cmlidXRlIG9mIHRoZSBGaWx0ZXIgb2JqZWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgIFRoZSBuZXcgVmFsdWUgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIFRva2VuIGF0dHJpYnV0ZSBvZiB0aGUgRmlsdGVyIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiAgIFRoZSBUb2tlbiB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7CisgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBWYWx1ZSBhdHRyaWJ1dGUgb2YgdGhlIEZpbHRlciBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gICBUaGUgVmFsdWUgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlcnNmaWxlIG5lc3RlZCBlbGVtZW50LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGNsYXNzIEZpbHRlcnNGaWxlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBGaWx0ZXJzRmlsZSBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmlsdGVyc0ZpbGUoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgZmlsZSBmcm9tIHdoaWNoIGZpbHRlcnMgd2lsbCBiZSByZWFkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBmcm9tIHdoaWNoIGZpbHRlcnMgd2lsbCBiZSByZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgZmlsdGVyc0ZpbGVzLmFkZChmaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZWRBdHRyaWJ1dGUgdG8gc2V0IGJlaGF2aW9yIFdSVCBtaXNzaW5nIGZpbHRlcnNmaWxlczoKKyAgICAgKiAiZmFpbCIgKGRlZmF1bHQpLCAid2FybiIsICJpZ25vcmUiLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPbk1pc3NpbmcgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVTCisgICAgICAgICAgICA9IG5ldyBTdHJpbmdbXSB7ImZhaWwiLCAid2FybiIsICJpZ25vcmUifTsKKworICAgICAgICAvKiogRmFpbCB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9uTWlzc2luZyBGQUlMID0gbmV3IE9uTWlzc2luZygiZmFpbCIpOworICAgICAgICAvKiogV2FybiB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9uTWlzc2luZyBXQVJOID0gbmV3IE9uTWlzc2luZygid2FybiIpOworICAgICAgICAvKiogSWdub3JlIHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT25NaXNzaW5nIElHTk9SRSA9IG5ldyBPbk1pc3NpbmcoImlnbm9yZSIpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQUlMX0lOREVYID0gMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5fSU5ERVggPSAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFX0lOREVYID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPbk1pc3NpbmcoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgY29uc3RydWN0b3IuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9uTWlzc2luZyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vaW5oZXJpdCBkb2MKKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUVTOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRoZSBkZWZhdWx0IHRva2VuIHN0YXJ0IHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVE9LRU5fU1RBUlQgPSAiQCI7CisKKyAgICAvKiogVGhlIGRlZmF1bHQgdG9rZW4gZW5kIHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVE9LRU5fRU5EID0gIkAiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhcnRPZlRva2VuID0gREVGQVVMVF9UT0tFTl9TVEFSVDsKKyAgICBwcml2YXRlIFN0cmluZyBlbmRPZlRva2VuID0gREVGQVVMVF9UT0tFTl9FTkQ7CisKKyAgICAvKiogQ29udGFpbnMgYSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMgKi8KKyAgICBwcml2YXRlIFZlY3RvciBwYXNzZWRUb2tlbnM7CisgICAgLyoqIGlmIGEgZHVwbGljYXRlIHRva2VuIGlzIGZvdW5kLCB0aGlzIGlzIHNldCB0byB0cnVlICovCisgICAgcHJpdmF0ZSBib29sZWFuIGR1cGxpY2F0ZVRva2VuID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVjdXJzZSA9IHRydWU7CisgICAgcHJpdmF0ZSBIYXNodGFibGUgZmlsdGVySGFzaCA9IG51bGw7CisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsdGVyc0ZpbGVzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgT25NaXNzaW5nIG9uTWlzc2luZ0ZpbHRlcnNGaWxlID0gT25NaXNzaW5nLkZBSUw7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlYWRpbmdGaWxlcyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBpbnQgcmVjdXJzZURlcHRoID0gMDsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2Ygb3JkZXJlZCBmaWx0ZXJzIGFuZCBmaWx0ZXIgZmlsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsdGVycyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEZpbHRlclNldCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBGaWx0ZXJzZXQgZnJvbSBhbm90aGVyIGZpbHRlcnNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJzZXQgdGhlIGZpbHRlcnNldCB1cG9uIHdoaWNoIHRoaXMgZmlsdGVyc2V0IHdpbGwgYmUgYmFzZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbHRlclNldChGaWx0ZXJTZXQgZmlsdGVyc2V0KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuZmlsdGVycyA9IChWZWN0b3IpIGZpbHRlcnNldC5nZXRGaWx0ZXJzKCkuY2xvbmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpbHRlcnMgaW4gdGhlIGZpbHRlciBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgVmVjdG9yIG9mIEZpbHRlciBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBWZWN0b3IgZ2V0RmlsdGVycygpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRGaWx0ZXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgLy9zaWxseSBoYWNrIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93Li4uCisgICAgICAgIGlmICghcmVhZGluZ0ZpbGVzKSB7CisgICAgICAgICAgICByZWFkaW5nRmlsZXMgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gZmlsdGVyc0ZpbGVzLnNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICAgICAgICByZWFkRmlsdGVyc0Zyb21GaWxlKChGaWxlKSBmaWx0ZXJzRmlsZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbHRlcnNGaWxlcy5jbGVhcigpOworICAgICAgICAgICAgcmVhZGluZ0ZpbGVzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbHRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZWZlcmVuY2VkIGZpbHRlciBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXJzZXQgZnJvbSB0aGUgcmVmZXJlbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWx0ZXJTZXQgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gKEZpbHRlclNldCkgZ2V0Q2hlY2tlZFJlZihGaWx0ZXJTZXQuY2xhc3MsICJmaWx0ZXJzZXQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaWx0ZXIgaGFzaCBvZiB0aGUgRmlsdGVyU2V0LgorICAgICAqCisgICAgICogQHJldHVybiAgIFRoZSBoYXNoIG9mIHRoZSB0b2tlbnMgYW5kIHZhbHVlcyBmb3IgcXVpY2sgbG9va3VwLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSGFzaHRhYmxlIGdldEZpbHRlckhhc2goKSB7CisgICAgICAgIGlmIChmaWx0ZXJIYXNoID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbHRlckhhc2ggPSBuZXcgSGFzaHRhYmxlKGdldEZpbHRlcnMoKS5zaXplKCkpOworICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZ2V0RmlsdGVycygpLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICBGaWx0ZXIgZmlsdGVyID0gKEZpbHRlcikgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgZmlsdGVySGFzaC5wdXQoZmlsdGVyLmdldFRva2VuKCksIGZpbHRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsdGVySGFzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZmlsdGVycyBmb3IgdGhpcyBmaWx0ZXJzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyc0ZpbGUgc2V0cyB0aGUgZmlsdGVyIGZpbGUgZnJvbSB3aGljaCB0byByZWFkIGZpbHRlcnMKKyAgICAgKiAgICAgICAgZm9yIHRoaXMgZmlsdGVyIHNldC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnNmaWxlKEZpbGUgZmlsdGVyc0ZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIGZpbHRlcnNGaWxlcy5hZGQoZmlsdGVyc0ZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyaW5nIHVzZWQgdG8gaWQgdGhlIGJlZ2lubmluZyBvZiBhIHRva2VuLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0T2ZUb2tlbiAgVGhlIG5ldyBCZWdpbnRva2VuIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJlZ2luVG9rZW4oU3RyaW5nIHN0YXJ0T2ZUb2tlbikgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhcnRPZlRva2VuID09IG51bGwgfHwgIiIuZXF1YWxzKHN0YXJ0T2ZUb2tlbikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYmVnaW5Ub2tlbiBtdXN0IG5vdCBiZSBlbXB0eSIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc3RhcnRPZlRva2VuID0gc3RhcnRPZlRva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYmVnaW4gdG9rZW4gZm9yIHRoaXMgZmlsdGVyc2V0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlsdGVyIHNldCdzIGJlZ2luIHRva2VuIGZvciBmaWx0ZXJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCZWdpblRva2VuKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldEJlZ2luVG9rZW4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhcnRPZlRva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyaW5nIHVzZWQgdG8gaWQgdGhlIGVuZCBvZiBhIHRva2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGVuZE9mVG9rZW4gIFRoZSBuZXcgRW5kdG9rZW4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5kVG9rZW4oU3RyaW5nIGVuZE9mVG9rZW4pIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuZE9mVG9rZW4gPT0gbnVsbCB8fCAiIi5lcXVhbHMoZW5kT2ZUb2tlbikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZW5kVG9rZW4gbXVzdCBub3QgYmUgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmVuZE9mVG9rZW4gPSBlbmRPZlRva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZW5kIHRva2VuIGZvciB0aGlzIGZpbHRlcnNldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpbHRlciBzZXQncyBlbmQgdG9rZW4gZm9yIHJlcGxhY2VtZW50IGRlbGltaXRpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbmRUb2tlbigpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRFbmRUb2tlbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbmRPZlRva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHJlY3Vyc2l2ZSB0b2tlbiBleHBhbnNpb24gaXMgZW5hYmxlZC4KKyAgICAgKiBAcGFyYW0gcmVjdXJzZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aGV0aGVyIHRvIHJlY3Vyc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVjdXJzZShib29sZWFuIHJlY3Vyc2UpIHsKKyAgICAgICAgdGhpcy5yZWN1cnNlID0gcmVjdXJzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgd2hldGhlciByZWN1cnNpdmUgdG9rZW4gZXhwYW5zaW9uIGlzIGVuYWJsZWQuCisgICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aGV0aGVyIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWN1cnNlKCkgeworICAgICAgICByZXR1cm4gcmVjdXJzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBmaWx0ZXJzIGZyb20gdGhlIGdpdmVuIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyc0ZpbGUgICAgICAgIHRoZSBmaWxlIGZyb20gd2hpY2ggZmlsdGVycyBhcmUgcmVhZC4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIHdoZW4gdGhlIGZpbGUgY2Fubm90IGJlIHJlYWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlYWRGaWx0ZXJzRnJvbUZpbGUoRmlsZSBmaWx0ZXJzRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWx0ZXJzRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICBoYW5kbGVNaXNzaW5nRmlsZSgiQ291bGQgbm90IHJlYWQgZmlsdGVycyBmcm9tIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsdGVyc0ZpbGUgKyAiIGFzIGl0IGRvZXNuJ3QgZXhpc3QuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbHRlcnNGaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgIGxvZygiUmVhZGluZyBmaWx0ZXJzIGZyb20gIiArIGZpbHRlcnNGaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWx0ZXJzRmlsZSk7CisgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOworCisgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgICAgICAgIFZlY3RvciBmaWx0cyA9IGdldEZpbHRlcnMoKTsKKyAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgU3RyaW5nIHN0clByb3BOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShzdHJQcm9wTmFtZSk7CisgICAgICAgICAgICAgICAgIGZpbHRzLmFkZEVsZW1lbnQobmV3IEZpbHRlcihzdHJQcm9wTmFtZSwgc3RyVmFsdWUpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVhZCBmaWx0ZXJzIGZyb20gZmlsZTogIgorICAgICAgICAgICAgICAgICAgKyBmaWx0ZXJzRmlsZSwgZXgpOworICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOworICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGhhbmRsZU1pc3NpbmdGaWxlKAorICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhIGZpbGUgcmF0aGVyIHRoYW4gYSBkaXJlY3RvcnkgaW4gIgorICAgICAgICAgICAgICAgKyAidGhlIGZpbHRlcnNmaWxlIGF0dHJpYnV0ZToiICsgZmlsdGVyc0ZpbGUpOworICAgICAgICB9CisgICAgICAgIGZpbHRlckhhc2ggPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvZXMgcmVwbGFjZW1lbnQgb24gdGhlIGdpdmVuIHN0cmluZyB3aXRoIHRva2VuIG1hdGNoaW5nLgorICAgICAqIFRoaXMgdXNlcyB0aGUgZGVmaW5lZCBiZWdpbnRva2VuIGFuZCBlbmR0b2tlbiB2YWx1ZXMgd2hpY2ggZGVmYXVsdAorICAgICAqIHRvIEAgZm9yIGJvdGguCisgICAgICogVGhpcyByZXNldHMgdGhlIHBhc3NlZFRva2VucyBhbmQgY2FsbHMgaVJlcGxhY2VUb2tlbnMgdG8KKyAgICAgKiBkbyB0aGUgYWN0dWFsIHJlcGxhY2VtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lICBUaGUgbGluZSBpbiB3aGljaCB0byBwcm9jZXNzIGVtYmVkZGVkIHRva2Vucy4KKyAgICAgKiBAcmV0dXJuICAgICAgVGhlIGlucHV0IHN0cmluZyBhZnRlciB0b2tlbiByZXBsYWNlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyByZXBsYWNlVG9rZW5zKFN0cmluZyBsaW5lKSB7CisgICAgICAgIHJldHVybiBpUmVwbGFjZVRva2VucyhsaW5lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgZmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIHRvIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRGaWx0ZXIoRmlsdGVyIGZpbHRlcikgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBmaWx0ZXJzLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICAgICAgZmlsdGVySGFzaCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEZpbHRlcnNGaWxlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZmlsdGVyc2ZpbGUgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyc0ZpbGUgY3JlYXRlRmlsdGVyc2ZpbGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRmlsdGVyc0ZpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgZmlsdGVyIG1hZGUgZnJvbSB0aGUgZ2l2ZW4gdG9rZW4gYW5kIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIG5ldyBmaWx0ZXIuCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhlIG5ldyBmaWx0ZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEZpbHRlcihTdHJpbmcgdG9rZW4sIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBhZGRGaWx0ZXIobmV3IEZpbHRlcih0b2tlbiwgdmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBGaWx0ZXJzZXQgdG8gdGhpcyBmaWx0ZXIgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlclNldCB0aGUgZmlsdGVyc2V0IHRvIGJlIGFkZGVkIHRvIHRoaXMgZmlsdGVyc2V0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbmZpZ3VyZWRGaWx0ZXJTZXQoRmlsdGVyU2V0IGZpbHRlclNldCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWx0ZXJTZXQuZ2V0RmlsdGVycygpLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBhZGRGaWx0ZXIoKEZpbHRlcikgZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICogVGVzdCB0byBzZWUgaWYgdGhpcyBmaWx0ZXIgc2V0IGhhcyBmaWx0ZXJzLgorICAgICoKKyAgICAqIEByZXR1cm4gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGZpbHRlcnMgaW4gdGhpcyBzZXQuCisgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzRmlsdGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldEZpbHRlcnMoKS5zaXplKCkgPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb25lIHRoZSBmaWx0ZXJzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgZGVlcCBjbG9uZSBvZiB0aGlzIGZpbHRlcnNldC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNsb25lIGNhbm5vdCBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoRmlsdGVyU2V0KSBnZXRSZWYoKSkuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsdGVyU2V0IGZzID0gKEZpbHRlclNldCkgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgIGZzLmZpbHRlcnMgPSAoVmVjdG9yKSBnZXRGaWx0ZXJzKCkuY2xvbmUoKTsKKyAgICAgICAgICAgIGZzLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIHJldHVybiBmczsKKyAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiZWhhdmlvciBXUlQgbWlzc2luZyBmaWx0ZXJzZmlsZXMuCisgICAgICogQHBhcmFtIG9uTWlzc2luZ0ZpbHRlcnNGaWxlIHRoZSBPbk1pc3NpbmcgZGVzY3JpYmluZyB0aGUgYmVoYXZpb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25NaXNzaW5nRmlsdGVyc0ZpbGUoT25NaXNzaW5nIG9uTWlzc2luZ0ZpbHRlcnNGaWxlKSB7CisgICAgICAgIHRoaXMub25NaXNzaW5nRmlsdGVyc0ZpbGUgPSBvbk1pc3NpbmdGaWx0ZXJzRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG9uTWlzc2luZ0ZpbHRlcnNGaWxlIHNldHRpbmcuCisgICAgICogQHJldHVybiB0aGUgT25NaXNzaW5nIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBPbk1pc3NpbmcgZ2V0T25NaXNzaW5nRmlsdGVyc0ZpbGUoKSB7CisgICAgICAgIHJldHVybiBvbk1pc3NpbmdGaWx0ZXJzRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHJlcGxhY2VtZW50IG9uIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCB0b2tlbiBtYXRjaGluZy4KKyAgICAgKiBUaGlzIHVzZXMgdGhlIGRlZmluZWQgYmVnaW50b2tlbiBhbmQgZW5kdG9rZW4gdmFsdWVzIHdoaWNoIGRlZmF1bHQKKyAgICAgKiB0byBAIGZvciBib3RoLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUgIFRoZSBsaW5lIHRvIHByb2Nlc3MgdGhlIHRva2VucyBpbi4KKyAgICAgKiBAcmV0dXJuICAgICAgVGhlIHN0cmluZyB3aXRoIHRoZSB0b2tlbnMgcmVwbGFjZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU3RyaW5nIGlSZXBsYWNlVG9rZW5zKFN0cmluZyBsaW5lKSB7CisgICAgICAgIFN0cmluZyBiZWdpblRva2VuID0gZ2V0QmVnaW5Ub2tlbigpOworICAgICAgICBTdHJpbmcgZW5kVG9rZW4gPSBnZXRFbmRUb2tlbigpOworICAgICAgICBpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoYmVnaW5Ub2tlbik7CisKKyAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgICAgIEhhc2h0YWJsZSB0b2tlbnMgPSBnZXRGaWx0ZXJIYXNoKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAvL2Nhbid0IGhhdmUgemVyby1sZW5ndGggdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gbGluZS5pbmRleE9mKGVuZFRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKyBiZWdpblRva2VuLmxlbmd0aCgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgID0gbGluZS5zdWJzdHJpbmcoaW5kZXggKyBiZWdpblRva2VuLmxlbmd0aCgpLCBlbmRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKGksIGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnNLZXkodG9rZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIHRva2Vucy5nZXQodG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2UgJiYgIXZhbHVlLmVxdWFscyh0b2tlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGFub3RoZXIgdG9rZW4sIGxldCdzIHBhcnNlIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVwbGFjZVRva2Vucyh2YWx1ZSwgdG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJSZXBsYWNpbmc6ICIgKyBiZWdpblRva2VuICsgdG9rZW4gKyBlbmRUb2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtPiAiICsgdmFsdWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGluZGV4ICsgYmVnaW5Ub2tlbi5sZW5ndGgoKSArIHRva2VuLmxlbmd0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbmRUb2tlbi5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYXBwZW5kIGJlZ2luVG9rZW4gYW5kIHNlYXJjaCBmdXJ0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZChiZWdpblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpbmRleCArIGJlZ2luVG9rZW4ubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBsaW5lLmluZGV4T2YoYmVnaW5Ub2tlbiwgaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYi5hcHBlbmQobGluZS5zdWJzdHJpbmcoaSkpOworICAgICAgICAgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHBhcnNlcyB0b2tlbnMgd2hpY2ggcG9pbnQgdG8gdG9rZW5zLgorICAgICAqIEl0IGFsc28gbWFpbnRhaW5zIGEgbGlzdCBvZiBjdXJyZW50bHkgdXNlZCB0b2tlbnMsIHNvIHdlIGNhbm5vdAorICAgICAqIGdldCBpbnRvIGFuIGluZmluaXRlIGxvb3AuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIHZhbHVlIC8gdG9rZW4gdG8gcGFyc2UuCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IHRva2VuICg9IHRoZSB0b2tlbiBpdCB3YXMgcGFyc2VkIGZyb20pLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIFN0cmluZyByZXBsYWNlVG9rZW5zKFN0cmluZyBsaW5lLCBTdHJpbmcgcGFyZW50KQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYmVnaW5Ub2tlbiA9IGdldEJlZ2luVG9rZW4oKTsKKyAgICAgICAgU3RyaW5nIGVuZFRva2VuID0gZ2V0RW5kVG9rZW4oKTsKKyAgICAgICAgaWYgKHJlY3Vyc2VEZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBwYXNzZWRUb2tlbnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVjdXJzZURlcHRoKys7CisgICAgICAgIGlmIChwYXNzZWRUb2tlbnMuY29udGFpbnMocGFyZW50KSAmJiAhZHVwbGljYXRlVG9rZW4pIHsKKyAgICAgICAgICAgIGR1cGxpY2F0ZVRva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAiSW5maW5pdGUgbG9vcCBpbiB0b2tlbnMuIEN1cnJlbnRseSBrbm93biB0b2tlbnMgOiAiCisgICAgICAgICAgICAgICAgKyBwYXNzZWRUb2tlbnMudG9TdHJpbmcoKSArICJcblByb2JsZW0gdG9rZW4gOiAiICsgYmVnaW5Ub2tlbgorICAgICAgICAgICAgICAgICsgcGFyZW50ICsgZW5kVG9rZW4gKyAiIGNhbGxlZCBmcm9tICIgKyBiZWdpblRva2VuCisgICAgICAgICAgICAgICAgKyBwYXNzZWRUb2tlbnMubGFzdEVsZW1lbnQoKS50b1N0cmluZygpICsgZW5kVG9rZW4pOworICAgICAgICAgICAgcmVjdXJzZURlcHRoLS07CisgICAgICAgICAgICByZXR1cm4gcGFyZW50OworICAgICAgICB9CisgICAgICAgIHBhc3NlZFRva2Vucy5hZGRFbGVtZW50KHBhcmVudCk7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGlSZXBsYWNlVG9rZW5zKGxpbmUpOworICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihiZWdpblRva2VuKSA9PSAtMSAmJiAhZHVwbGljYXRlVG9rZW4KKyAgICAgICAgICAgICAgICAmJiByZWN1cnNlRGVwdGggPT0gMSkgeworICAgICAgICAgICAgcGFzc2VkVG9rZW5zID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIGlmIChkdXBsaWNhdGVUb2tlbikgeworICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZS4uLgorICAgICAgICAgICAgaWYgKHBhc3NlZFRva2Vucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBwYXNzZWRUb2tlbnMucmVtb3ZlKHBhc3NlZFRva2Vucy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAocGFzc2VkVG9rZW5zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYmVnaW5Ub2tlbiArIHZhbHVlICsgZW5kVG9rZW47CisgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZVRva2VuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlY3Vyc2VEZXB0aC0tOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1pc3NpbmdGaWxlKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN3aXRjaCAob25NaXNzaW5nRmlsdGVyc0ZpbGUuZ2V0SW5kZXgoKSkgeworICAgICAgICBjYXNlIE9uTWlzc2luZy5JR05PUkVfSU5ERVg6CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgT25NaXNzaW5nLkZBSUxfSU5ERVg6CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIGNhc2UgT25NaXNzaW5nLldBUk5fSU5ERVg6CisgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgdmFsdWUgZm9yIG9uTWlzc2luZ0ZpbHRlcnNGaWxlIik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldENvbGxlY3Rpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldENvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmFiYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyU2V0Q29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCisvLyBqYXZhIGlvIGNsYXNzZXMKKworCisKKworLy8gamF2YSB1dGlsIGNsYXNzZXMKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy8gYW50IGNsYXNzZXMKKworCisKKworLyoqCisgKiBBIEZpbHRlclNldENvbGxlY3Rpb24gaXMgYSBjb2xsZWN0aW9uIG9mIGZpbHRlcnNldHMgZWFjaCBvZiB3aGljaCBtYXkgaGF2ZQorICogYSBkaWZmZXJlbnQgc3RhcnQvZW5kIHRva2VuIHNldHRpbmdzLgorICoKKyAqLworcHVibGljIGNsYXNzIEZpbHRlclNldENvbGxlY3Rpb24geworCisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsdGVyU2V0cyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBhIEZpbHRlclNldENvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIEZpbHRlclNldENvbGxlY3Rpb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIGEgRmlsdGVyU2V0Q29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZmlsdGVyU2V0IGEgZmlsdGVyc2V0IHRvIHN0YXJ0IHRoZSBjb2xsZWN0aW9uIHdpdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyU2V0Q29sbGVjdGlvbihGaWx0ZXJTZXQgZmlsdGVyU2V0KSB7CisgICAgICAgIGFkZEZpbHRlclNldChmaWx0ZXJTZXQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgZmlsdGVyc2V0IHRvIHRoZSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlclNldCBhIDxjb2RlPkZpbHRlclNldDwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJTZXQoRmlsdGVyU2V0IGZpbHRlclNldCkgeworICAgICAgICBmaWx0ZXJTZXRzLmFkZEVsZW1lbnQoZmlsdGVyU2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHJlcGxhY2VtZW50IG9uIHRoZSBnaXZlbiBzdHJpbmcgd2l0aCB0b2tlbiBtYXRjaGluZy4KKyAgICAgKiBUaGlzIHVzZXMgdGhlIGRlZmluZWQgYmVnaW50b2tlbiBhbmQgZW5kdG9rZW4gdmFsdWVzIHdoaWNoIGRlZmF1bHQgdG8gQCBmb3IgYm90aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lICBUaGUgbGluZSB0byBwcm9jZXNzIHRoZSB0b2tlbnMgaW4uCisgICAgICogQHJldHVybiAgICAgIFRoZSBzdHJpbmcgd2l0aCB0aGUgdG9rZW5zIHJlcGxhY2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgcmVwbGFjZVRva2VucyhTdHJpbmcgbGluZSkgeworICAgICAgICBTdHJpbmcgcmVwbGFjZWRMaW5lID0gbGluZTsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZmlsdGVyU2V0cy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgRmlsdGVyU2V0IGZpbHRlclNldCA9IChGaWx0ZXJTZXQpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHJlcGxhY2VkTGluZSA9IGZpbHRlclNldC5yZXBsYWNlVG9rZW5zKHJlcGxhY2VkTGluZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGxhY2VkTGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFRlc3QgdG8gc2VlIGlmIHRoaXMgZmlsdGVyIHNldCBpdCBlbXB0eS4KKyAgICAqCisgICAgKiBAcmV0dXJuICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGZpbHRlciBpbiB0aGlzIHNldCBvdGhlcndpc2UgZmFsc2UuCisgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWx0ZXJzKCkgeworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWx0ZXJTZXRzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBGaWx0ZXJTZXQgZmlsdGVyU2V0ID0gKEZpbHRlclNldCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKGZpbHRlclNldC5oYXNGaWx0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmxleEludGVnZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZsZXhJbnRlZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NzQyOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZsZXhJbnRlZ2VyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB3aGljaCBjYW4gYmUgdXNlZCBmb3IgQW50IHRhc2sgYXR0cmlidXRlIHNldHRlciBtZXRob2RzIHRvIGFsbG93CisgKiB0aGUgYnVpbGQgZmlsZSB0byBzcGVjaWZ5IGFuIGludGVnZXIgaW4gZWl0aGVyIGRlY2ltYWwsIG9jdGFsLCBvciBoZXhhZGVjaW1hbAorICogZm9ybWF0LgorICoKKyAqIEBzZWUgamF2YS5sYW5nLkludGVnZXIjZGVjb2RlKFN0cmluZykKKyAqLworcHVibGljIGNsYXNzIEZsZXhJbnRlZ2VyIHsKKyAgICBwcml2YXRlIEludGVnZXIgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGJ5IEFudCdzIGludHJvc3BlY3Rpb24gbWVjaGFuaXNtIGZvciBhdHRyaWJ1dGUgcG9wdWxhdGlvbgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gZGVjb2RlCisgICAgICovCisgICAgcHVibGljIEZsZXhJbnRlZ2VyKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gSW50ZWdlci5kZWNvZGUodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlY2ltYWwgaW50ZWdlciB2YWx1ZQorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIG1ldGhvZCB0byByZXR1cm4gdGhlIGRlY2ltYWwgdmFsdWUgZm9yIGRpc3BsYXkKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHZlcnNpb24gb2YgdGhlIGludGVnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Mb2dMZXZlbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvTG9nTGV2ZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDJiOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvTG9nTGV2ZWwuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIFRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgQW50J3MgbG9nIGxldmVsLgorICovCitwdWJsaWMgY2xhc3MgTG9nTGV2ZWwgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKworICAgIC8qKiBFUlIgbG9nbGV2ZWwgY29uc3RhbnQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dMZXZlbCBFUlIgPSBuZXcgTG9nTGV2ZWwoImVycm9yIik7CisKKyAgICAvKiogV0FSTiBsb2dsZXZlbCBjb25zdGFudC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZ0xldmVsIFdBUk4gPSBuZXcgTG9nTGV2ZWwoIndhcm4iKTsKKworICAgIC8qKiBJTkZPIGxvZ2xldmVsIGNvbnN0YW50LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nTGV2ZWwgSU5GTyA9IG5ldyBMb2dMZXZlbCgiaW5mbyIpOworCisgICAgLyoqIFZFUkJPU0UgbG9nbGV2ZWwgY29uc3RhbnQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dMZXZlbCBWRVJCT1NFID0gbmV3IExvZ0xldmVsKCJ2ZXJib3NlIik7CisKKyAgICAvKiogREVCVUcgbG9nbGV2ZWwgY29uc3RhbnQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dMZXZlbCBERUJVRyA9IG5ldyBMb2dMZXZlbCgiZGVidWciKTsKKworICAgIC8qKgorICAgICAqIFB1YmxpYyBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nTGV2ZWwoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBMb2dMZXZlbChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcygpOworICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlI2dldFZhbHVlcworICAgICAqIEByZXR1cm4gdGhlIHN0cmluZ3MgYWxsb3dlZCBmb3IgdGhlIGxldmVsIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImVycm9yIiwKKyAgICAgICAgICAgICJ3YXJuIiwKKyAgICAgICAgICAgICJ3YXJuaW5nIiwKKyAgICAgICAgICAgICJpbmZvIiwKKyAgICAgICAgICAgICJ2ZXJib3NlIiwKKyAgICAgICAgICAgICJkZWJ1ZyJ9OworICAgIH0KKworICAgIC8qKgorICAgICAqIG1hcHBpbmcgb2YgZW51bWVyYXRlZCB2YWx1ZXMgdG8gbG9nIGxldmVscworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludFtdIGxldmVscyA9IHsKKyAgICAgICAgUHJvamVjdC5NU0dfRVJSLAorICAgICAgICBQcm9qZWN0Lk1TR19XQVJOLAorICAgICAgICBQcm9qZWN0Lk1TR19XQVJOLAorICAgICAgICBQcm9qZWN0Lk1TR19JTkZPLAorICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFLAorICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGxldmVsIG9mIHRoZSBlY2hvIG9mIHRoZSBjdXJyZW50IHZhbHVlCisgICAgICogQHJldHVybiB0aGUgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExldmVsKCkgeworICAgICAgICByZXR1cm4gbGV2ZWxzW2dldEluZGV4KCldOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01hcHBlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiM2E1MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01hcHBlci5qYXZhCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Db21wb3NpdGVNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Db250YWluZXJNYXBwZXI7CisKKy8qKgorICogRWxlbWVudCB0byBkZWZpbmUgYSBGaWxlTmFtZU1hcHBlci4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBwZXIgZXh0ZW5kcyBEYXRhVHlwZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKworICAgIHByb3RlY3RlZCBNYXBwZXJUeXBlIHR5cGUgPSBudWxsOworICAgIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NuYW1lID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgUGF0aCBjbGFzc3BhdGggPSBudWxsOworICAgIHByb3RlY3RlZCBTdHJpbmcgZnJvbSA9IG51bGw7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0byA9IG51bGw7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgcHJpdmF0ZSBDb250YWluZXJNYXBwZXIgY29udGFpbmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5NYXBwZXI8L2NvZGU+IGVsZW1lbnQuCisgICAgICogQHBhcmFtIHAgICB0aGUgb3duaW5nIEFudCA8Y29kZT5Qcm9qZWN0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwcGVyKFByb2plY3QgcCkgeworICAgICAgICBzZXRQcm9qZWN0KHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdHlwZSBvZiA8Y29kZT5GaWxlTmFtZU1hcHBlcjwvY29kZT4gdG8gdXNlLgorICAgICAqIEBwYXJhbSB0eXBlICAgdGhlIDxjb2RlPk1hcHBlclR5cGU8L2NvZGU+IGVudW1lcmF0ZWQgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoTWFwcGVyVHlwZSB0eXBlKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2Fubm90IG1peCBhZGQgYW5kIGFkZGNvbmZpZ3VyZWQgaW4gc2FtZSB0eXBlLCBzbworICAgICAqIHByb3ZpZGUgdGhpcyB0byBvdmVycmlkZSB0aGUgYWRkIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gZmlsZU5hbWVNYXBwZXIgICB0aGUgPGNvZGU+RmlsZU5hbWVNYXBwZXI8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyKSB7CisgICAgICAgIGFkZChmaWxlTmFtZU1hcHBlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmVzdGVkIDxjb2RlPkZpbGVOYW1lTWFwcGVyPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmlsZU5hbWVNYXBwZXIgICB0aGUgPGNvZGU+RmlsZU5hbWVNYXBwZXI8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZU5hbWVNYXBwZXIgZmlsZU5hbWVNYXBwZXIpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsICYmIGNsYXNzbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZU1hcHBlcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBtID0gZ2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAobSBpbnN0YW5jZW9mIENvbnRhaW5lck1hcHBlcikgeworICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSAoQ29udGFpbmVyTWFwcGVyKSBtOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihtKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1hcHBlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG5lc3RlZCBtYXBwZXJzISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb250YWluZXIuYWRkKGZpbGVOYW1lTWFwcGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBNYXBwZXIKKyAgICAgKiBAcGFyYW0gbWFwcGVyIHRoZSBtYXBwZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZE1hcHBlcihNYXBwZXIgbWFwcGVyKSB7CisgICAgICAgIGFkZChtYXBwZXIuZ2V0SW1wbGVtZW50YXRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBGaWxlTmFtZU1hcHBlciB0byB1c2UuCisgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBsb2FkIHRoZSBGaWxlTmFtZU1hcHBlciB0aHJvdWdoIChhdHRyaWJ1dGUpLgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggdGhlIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGxvYWQgdGhlIEZpbGVOYW1lTWFwcGVyIHRocm91Z2ggKG5lc3RlZCBlbGVtZW50KS4KKyAgICAgKiBAcmV0dXJuIGEgcGF0aCBvYmplY3QgdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5jbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGxvYWQgdGhlIEZpbGVOYW1lTWFwcGVyIHRocm91Z2ggdmlhCisgICAgICogcmVmZXJlbmNlIChhdHRyaWJ1dGUpLgorICAgICAqIEBwYXJhbSByZWYgdGhlIHJlZmVyZW5jZSB0byB0aGUgRmlsZU5hbWVNYXBwZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHJlZikgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyZWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXJndW1lbnQgdG8gRmlsZU5hbWVNYXBwZXIuc2V0RnJvbQorICAgICAqIEBwYXJhbSBmcm9tIHRoZSBmcm9tIGF0dHJpYnV0ZSB0byBwYXNzIHRvIHRoZSBGaWxlTmFtZU1hcHBlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFyZ3VtZW50IHRvIEZpbGVOYW1lTWFwcGVyLnNldFRvCisgICAgICogQHBhcmFtIHRvIHRoZSB0byBhdHRyaWJ1dGUgdG8gcGFzcyB0byB0aGUgRmlsZU5hbWVNYXBwZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50byA9IHRvOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgdGhpcyBNYXBwZXIgaW5zdGFuY2UgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBNYXBwZXIuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFueSBvdGhlciBhdHRyaWJ1dGUgaWYgeW91IG1ha2UgaXQgYQorICAgICAqIHJlZmVyZW5jZS48L3A+CisgICAgICogQHBhcmFtIHIgdGhlIHJlZmVyZW5jZSB0byBhbm90aGVyIG1hcHBlcgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgb3RoZXIgYXR0cmlidXRlcyBhcmUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwgfHwgZnJvbSAhPSBudWxsIHx8IHRvICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZ1bGx5IGNvbmZpZ3VyZWQgRmlsZU5hbWVNYXBwZXIgaW1wbGVtZW50YXRpb24uCisgICAgICogQHJldHVybiBhIEZpbGVOYW1lTWFwcGVyIG9iamVjdCB0byBiZSBjb25maWd1cmVkCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBGaWxlTmFtZU1hcHBlciBnZXRJbXBsZW1lbnRhdGlvbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CisgICAgICAgICAgICBSZWZlcmVuY2UgciA9IGdldFJlZmlkKCk7CisgICAgICAgICAgICBPYmplY3QgbyA9IHIuZ2V0UmVmZXJlbmNlZE9iamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBGaWxlTmFtZU1hcHBlcikgeworICAgICAgICAgICAgICAgIHJldHVybiAoRmlsZU5hbWVNYXBwZXIpIG87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1hcHBlcikgeworICAgICAgICAgICAgICAgIHJldHVybiAoKE1hcHBlcikgbykuZ2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBvZCA9IG8gPT0gbnVsbCA/ICJudWxsIiA6IG8uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ob2QgKyAiIGF0IHJlZmVyZW5jZSAnIgorICAgICAgICAgICAgICAgICsgci5nZXRSZWZJZCgpICsgIicgaXMgbm90IGEgdmFsaWQgbWFwcGVyIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlID09IG51bGwgJiYgY2xhc3NuYW1lID09IG51bGwgJiYgY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAibmVzdGVkIG1hcHBlciBvciAiCisgICAgICAgICAgICAgICAgKyAib25lIG9mIHRoZSBhdHRyaWJ1dGVzIHR5cGUgb3IgY2xhc3NuYW1lIGlzIHJlcXVpcmVkIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIGNsYXNzbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIm11c3Qgbm90IHNwZWNpZnkgYm90aCB0eXBlIGFuZCBjbGFzc25hbWUgYXR0cmlidXRlIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZU5hbWVNYXBwZXIgbQorICAgICAgICAgICAgICAgID0gKEZpbGVOYW1lTWFwcGVyKSAoZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpLm5ld0luc3RhbmNlKCkpOworICAgICAgICAgICAgZmluYWwgUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHAuc2V0UHJvamVjdFJlZmVyZW5jZShtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG0uc2V0RnJvbShmcm9tKTsKKyAgICAgICAgICAgIG0uc2V0VG8odG8pOworCisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIHRocm93IGJlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgIC8qKgorICAgICAqIEdldHMgdGhlIENsYXNzIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1hcHBlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPkNsYXNzPC9jb2RlPi4KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBmb3VuZAorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyBnZXRJbXBsZW1lbnRhdGlvbkNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBjTmFtZSA9IHRoaXMuY2xhc3NuYW1lOworICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjTmFtZSA9IHR5cGUuZ2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IChjbGFzc3BhdGggPT0gbnVsbCkKKyAgICAgICAgICAgID8gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpCisgICAgICAgICAgICA6IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjbGFzc3BhdGgpOworCisgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNOYW1lLCB0cnVlLCBsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBjaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiByZWZlcmVuY2VkIE1hcHBlci4KKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSBBbnQgMS43LjEgYmVjYXVzZSBhIG1hcHBlciBtaWdodCByZWYgYQorICAgICAqICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIGltcGxlbWVudGF0aW9uIGRpcmVjdGx5LgorICAgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgTWFwcGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcHBlciBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiAoTWFwcGVyKSBnZXRDaGVja2VkUmVmKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgYXMgQXJndW1lbnQgdG8gRmlsZU5hbWVNYXBwZXIuc2V0VHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcHBlclR5cGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGltcGxlbWVudGF0aW9uczsKKworICAgICAgICAvKiogQ29uc3RydWN0b3IgZm9yIHRoZSBNYXBwZXJUeXBlIGVudW1lcmF0aW9uICovCisgICAgICAgIHB1YmxpYyBNYXBwZXJUeXBlKCkgeworICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy5wdXQoImlkZW50aXR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSWRlbnRpdHlNYXBwZXIiKTsKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy5wdXQoImZsYXR0ZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GbGF0RmlsZU5hbWVNYXBwZXIiKTsKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy5wdXQoImdsb2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5HbG9iUGF0dGVybk1hcHBlciIpOworICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLnB1dCgibWVyZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5NZXJnaW5nTWFwcGVyIik7CisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMucHV0KCJyZWdleHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZWdleHBQYXR0ZXJuTWFwcGVyIik7CisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMucHV0KCJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUGFja2FnZU5hbWVNYXBwZXIiKTsKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy5wdXQoInVucGFja2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlVuUGFja2FnZU5hbWVNYXBwZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBmaWxlbmFtZW1hcHBlciBuYW1lcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJpZGVudGl0eSIsICJmbGF0dGVuIiwgImdsb2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lcmdlIiwgInJlZ2V4cCIsICJwYWNrYWdlIiwgInVucGFja2FnZSJ9OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNsYXNzbmFtZSBmb3IgdGhlIGZpbGVuYW1lbWFwcGVyIG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25zLmdldFByb3BlcnR5KGdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXJhbWV0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMTZkMmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCisvKioKKyAqIEEgcGFyYW1ldGVyIGlzIGNvbXBvc2VkIG9mIGEgbmFtZSwgdHlwZSBhbmQgdmFsdWUuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGFyYW1ldGVyIHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdHlwZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGZpbmFsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdHlwZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXJhbWV0ZXJpemFibGUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhcmFtZXRlcml6YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWNlMWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXJhbWV0ZXJpemFibGUuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCisvKioKKyAqIFBhcmFtZXRlcml6YWJsZSBvYmplY3RzIHRha2UgZ2VucmljIGtleSB2YWx1ZSBwYWlycy4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUGFyYW1ldGVyaXphYmxlIHsKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIGFuIGFycmF5IG9mIG5hbWUvdHlwZS92YWx1ZSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHZvaWQgc2V0UGFyYW1ldGVycyhQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdGguamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmY0ZGNlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0aC5qYXZhCkBAIC0wLDAgKzEsNzUxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlBhdGhUb2tlbml6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworCisvKioKKyAqIFRoaXMgb2JqZWN0IHJlcHJlc2VudHMgYSBwYXRoIGFzIHVzZWQgYnkgQ0xBU1NQQVRIIG9yIFBBVEgKKyAqIGVudmlyb25tZW50IHZhcmlhYmxlLiBBIHBhdGggbWlnaHQgYWxzbyBiZSBkZXNjcmliZWQgYXMgYSBjb2xsZWN0aW9uCisgKiBvZiB1bmlxdWUgZmlsZXN5c3RlbSByZXNvdXJjZXMuCisgKiA8cD4KKyAqIDxjb2RlPgorICogJmx0O3NvbWV0YXNrJmd0Ozxicj4KKyAqICZuYnNwOyZuYnNwOyZsdDtzb21lcGF0aCZndDs8YnI+CisgKiAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249Ii9wYXRoL3RvL2ZpbGUuamFyIiAvJmd0Ozxicj4KKyAqICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtwYXRoZWxlbWVudAorICogIHBhdGg9Ii9wYXRoL3RvL2ZpbGUyLmphcjovcGF0aC90by9jbGFzczI7L3BhdGgvdG8vY2xhc3MzIiAvJmd0OworICogPGJyPgorICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIvcGF0aC90by9maWxlMy5qYXIiIC8mZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIvcGF0aC90by9maWxlNC5qYXIiIC8mZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jmx0Oy9zb21lcGF0aCZndDs8YnI+CisgKiAmbHQ7L3NvbWV0YXNrJmd0Ozxicj4KKyAqIDwvY29kZT4KKyAqIDxwPgorICogVGhlIG9iamVjdCBpbXBsZW1lbnRpb24gPGNvZGU+c29tZXRhc2s8L2NvZGU+IG11c3QgcHJvdmlkZSBhIG1ldGhvZCBjYWxsZWQKKyAqIDxjb2RlPmNyZWF0ZVNvbWVwYXRoPC9jb2RlPiB3aGljaCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIDxjb2RlPlBhdGg8L2NvZGU+LgorICogTmVzdGVkIHBhdGggZGVmaW5pdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlIFBhdGggb2JqZWN0IGFuZCBtdXN0IGJlIGxhYmVsZWQKKyAqIDxjb2RlPnBhdGhlbGVtZW50PC9jb2RlPi48cD4KKyAqCisgKiBUaGUgcGF0aCBlbGVtZW50IHRha2VzIGEgcGFyYW1ldGVyIDxjb2RlPnBhdGg8L2NvZGU+IHdoaWNoIHdpbGwgYmUgcGFyc2VkCisgKiBhbmQgc3BsaXQgaW50byBzaW5nbGUgZWxlbWVudHMuIEl0IHdpbGwgdXN1YWxseSBiZSB1c2VkCisgKiB0byBkZWZpbmUgYSBwYXRoIGZyb20gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCisgKi8KKworcHVibGljIGNsYXNzIFBhdGggZXh0ZW5kcyBEYXRhVHlwZSBpbXBsZW1lbnRzIENsb25lYWJsZSwgUmVzb3VyY2VDb2xsZWN0aW9uIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgLyoqIFRoZSBzeXN0ZW0gY2xhc3NwYXRoIGFzIGEgUGF0aCBvYmplY3QgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhdGggc3lzdGVtQ2xhc3NwYXRoID0KKyAgICAgICAgbmV3IFBhdGgobnVsbCwgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzeXN0ZW0gYm9vdGNsYXNzcGF0aCBhcyBhIFBhdGggb2JqZWN0LgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBzeXN0ZW1Cb290Q2xhc3NwYXRoID0KKyAgICAgICAgbmV3IFBhdGgobnVsbCwgU3lzdGVtLmdldFByb3BlcnR5KCJzdW4uYm9vdC5jbGFzcy5wYXRoIikpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3IgRU1QVFlfSVRFUkFUT1IKKyAgICAgICAgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQuaXRlcmF0b3IoKTsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgY2xhc3MsIGhvbGRzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O3BhdGhlbGVtZW50Jmd0OzwvY29kZT4gdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBQYXRoRWxlbWVudCBpbXBsZW1lbnRzIFJlc291cmNlQ29sbGVjdGlvbiB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gcGFydHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgbG9jYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2MgYSA8Y29kZT5GaWxlPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oRmlsZSBsb2MpIHsKKyAgICAgICAgICAgIHBhcnRzID0gbmV3IFN0cmluZ1tdIHt0cmFuc2xhdGVGaWxlKGxvYy5nZXRBYnNvbHV0ZVBhdGgoKSl9OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgcGF0aC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhdGggYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICBwYXJ0cyA9IFBhdGgudHJhbnNsYXRlUGF0aChnZXRQcm9qZWN0KCksIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgY29udmVydGVkIHBhdGhlbGVtZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBhIDxjb2RlPlN0cmluZ1tdPC9jb2RlPiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFBhcnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhcnRzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBpdGVyYXRvci4KKyAgICAgICAgICogQHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVJlc291cmNlSXRlcmF0b3IobnVsbCwgcGFydHMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrIGlmIHRoaXMgcmVzb3VyY2UgaXMgb25seSBmb3IgZmlsZXN5c3RlbXMuCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG51bWJlciBvZiByZXNvdXJjZXMuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJ0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJ0cyA9PSBudWxsID8gMCA6IHBhcnRzLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBCb29sZWFuIHByZXNlcnZlQkM7CisKKyAgICBwcml2YXRlIFVuaW9uIHVuaW9uID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYnkgSW50cm9zcGVjdGlvbkhlbHBlciBmb3IgPGNvZGU+c2V0WFhYKFBhdGggcCk8L2NvZGU+CisgICAgICogYXR0cmlidXRlIHNldHRlcnMuCisgICAgICogQHBhcmFtIHAgdGhlIDxjb2RlPlByb2plY3Q8L2NvZGU+IGZvciB0aGlzIHBhdGguCisgICAgICogQHBhcmFtIHBhdGggdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gcGF0aCBkZWZpbml0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoKFByb2plY3QgcCwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcyhwKTsKKyAgICAgICAgY3JlYXRlUGF0aEVsZW1lbnQoKS5zZXRQYXRoKHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBlbXB0eSA8Y29kZT5QYXRoPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgPGNvZGU+UHJvamVjdDwvY29kZT4gZm9yIHRoaXMgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZWxlbWVudCBkZWZpbml0aW9uIHRvIHRoZSBwYXRoLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgdG8gYWRkIChtdXN0IG5vdCBiZQorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG5vciBlbXB0eS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oRmlsZSBsb2NhdGlvbikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICBjcmVhdGVQYXRoRWxlbWVudCgpLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBwYXRoIGRlZmluaXRpb24gYW5kIGNyZWF0ZXMgc2luZ2xlIFBhdGhFbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBwYXRoIGRlZmluaXRpb24uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgY3JlYXRlUGF0aEVsZW1lbnQoKS5zZXRQYXRoKHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgUGF0aCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIDxwPllvdSBtdXN0IG5vdCBzZXQgYW5vdGhlciBhdHRyaWJ1dGUgb3IgbmVzdCBlbGVtZW50cyBpbnNpZGUKKyAgICAgKiB0aGlzIGVsZW1lbnQgaWYgeW91IG1ha2UgaXQgYSByZWZlcmVuY2UuPC9wPgorICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gYW5vdGhlciBQYXRoCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodW5pb24gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O3BhdGhlbGVtZW50Jmd0OzwvY29kZT4gZWxlbWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5QYXRoRWxlbWVudDwvY29kZT4gdG8gYmUgY29uZmlndXJlZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aEVsZW1lbnQgY3JlYXRlUGF0aEVsZW1lbnQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBQYXRoRWxlbWVudCBwZSA9IG5ldyBQYXRoRWxlbWVudCgpOworICAgICAgICBhZGQocGUpOworICAgICAgICByZXR1cm4gcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGVsZW1lbnQuCisgICAgICogQHBhcmFtIGZzIGEgPGNvZGU+RmlsZVNldDwvY29kZT4gdG8gYmUgYWRkZWQgdG8gdGhlIHBhdGgKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IGZzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZnMuZ2V0UHJvamVjdCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIGZzLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICBhZGQoZnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4gZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gZmwgYSA8Y29kZT5GaWxlTGlzdDwvY29kZT4gdG8gYmUgYWRkZWQgdG8gdGhlIHBhdGgKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZWxpc3QoRmlsZUxpc3QgZmwpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmbC5nZXRQcm9qZWN0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgZmwuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIGFkZChmbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5lc3RlZCA8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4gZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gZHNldCBhIDxjb2RlPkRpclNldDwvY29kZT4gdG8gYmUgYWRkZWQgdG8gdGhlIHBhdGgKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGlyc2V0KERpclNldCBkc2V0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoZHNldC5nZXRQcm9qZWN0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgZHNldC5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkKGRzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXN0ZWQgcGF0aAorICAgICAqIEBwYXJhbSBwYXRoIGEgPGNvZGU+UGF0aDwvY29kZT4gdG8gYmUgYWRkZWQgdG8gdGhlIHBhdGgKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUGF0aCBwYXRoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAocGF0aCA9PSB0aGlzKSB7CisgICAgICAgICAgICB0aHJvdyBjaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXRoLmdldFByb2plY3QoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXRoLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICBhZGQoKFJlc291cmNlQ29sbGVjdGlvbikgcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmVzdGVkIDxjb2RlPlJlc291cmNlQ29sbGVjdGlvbjwvY29kZT4uCisgICAgICogQHBhcmFtIGMgdGhlIFJlc291cmNlQ29sbGVjdGlvbiB0byBhZGQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIGMpIHsKKyAgICAgICAgY2hlY2tDaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh1bmlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB1bmlvbiA9IG5ldyBVbmlvbigpOworICAgICAgICAgICAgdW5pb24uc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgdW5pb24uc2V0Q2FjaGUoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHVuaW9uLmFkZChjKTsKKyAgICAgICAgc2V0Q2hlY2tlZChmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5lc3RlZCA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGVsZW1lbnQuCisgICAgICogQHJldHVybiBhIDxjb2RlPlBhdGg8L2NvZGU+IHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlUGF0aCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIGFkZChwKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSBjb250ZW50cyBvZiB0aGUgb3RoZXIgUGF0aCBpbnN0YW5jZSB0byB0aGlzLgorICAgICAqIEBwYXJhbSBvdGhlciBhIDxjb2RlPlBhdGg8L2NvZGU+IHRvIGJlIGFkZGVkIHRvIHRoZSBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kKFBhdGggb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhZGQob3RoZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGNvbXBvbmVudHMgb24gdGhlIGdpdmVuIHBhdGggd2hpY2ggZXhpc3QgdG8gdGhpcworICAgICAqIFBhdGguIENvbXBvbmVudHMgdGhhdCBkb24ndCBleGlzdCBhcmVuJ3QgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIC0gc291cmNlIHBhdGggd2hvc2UgY29tcG9uZW50cyBhcmUgZXhhbWluZWQgZm9yIGV4aXN0ZW5jZQorICAgICAqLworICAgICBwdWJsaWMgdm9pZCBhZGRFeGlzdGluZyhQYXRoIHNvdXJjZSkgeworICAgICAgICAgYWRkRXhpc3Rpbmcoc291cmNlLCBmYWxzZSk7CisgICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMgYWRkRXhpc3RpbmcsIGJ1dCBzdXBwb3J0IGNsYXNzcGF0aCBiZWhhdmlvciBpZiB0cnlVc2VyRGlyCisgICAgICogaXMgdHJ1ZS4gQ2xhc3NwYXRocyBhcmUgcmVsYXRpdmUgdG8gdXNlciBkaXIsIG5vdCB0aGUgcHJvamVjdCBiYXNlLgorICAgICAqIFRoYXQgdXNlZCB0byBicmVhayBqc3BjIHRlc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBwYXRoCisgICAgICogQHBhcmFtIHRyeVVzZXJEaXIgIGlmIHRydWUgdHJ5IHRoZSB1c2VyIGRpcmVjdG9yeSBpZiB0aGUgZmlsZSBpcyBub3QgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEV4aXN0aW5nKFBhdGggc291cmNlLCBib29sZWFuIHRyeVVzZXJEaXIpIHsKKyAgICAgICAgU3RyaW5nW10gbGlzdCA9IHNvdXJjZS5saXN0KCk7CisgICAgICAgIEZpbGUgdXNlckRpciA9ICh0cnlVc2VyRGlyKSA/IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSkKKyAgICAgICAgICAgICAgICA6IG51bGw7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIGYgPSByZXNvbHZlRmlsZShnZXRQcm9qZWN0KCksIGxpc3RbaV0pOworCisgICAgICAgICAgICAvLyBwcm9iYWJseSBub3QgdGhlIGJlc3QgY2hvaWNlLCBidXQgaXQgc29sdmVzIHRoZSBwcm9ibGVtIG9mCisgICAgICAgICAgICAvLyByZWxhdGl2ZSBwYXRocyBpbiBDTEFTU1BBVEgKKyAgICAgICAgICAgIGlmICh0cnlVc2VyRGlyICYmICFmLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKHVzZXJEaXIsIGxpc3RbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBzZXRMb2NhdGlvbihmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJkcm9wcGluZyAiICsgZiArICIgZnJvbSBwYXRoIGFzIGl0IGRvZXNuJ3QgZXhpc3QiLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHBhdGggZWxlbWVudHMgZGVmaW5lZCBieSB0aGlzIGFuZCBuZXN0ZWQgcGF0aCBvYmplY3RzLgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBwYXRoIGVsZW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBsaXN0KCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUGF0aCkgZ2V0Q2hlY2tlZFJlZigpKS5saXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFzc2VydEZpbGVzeXN0ZW1Pbmx5KHVuaW9uKSA9PSBudWxsCisgICAgICAgICAgICA/IG5ldyBTdHJpbmdbMF0gOiB1bmlvbi5saXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhdGgsIHdoaWNoIGNhbiBiZSB1c2VkIGFzCisgICAgICogQ0xBU1NQQVRIIG9yIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgZGVmaW5pdGlvbi4KKyAgICAgKiBAcmV0dXJuIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/IGdldENoZWNrZWRSZWYoKS50b1N0cmluZygpCisgICAgICAgICAgICA6IHVuaW9uID09IG51bGwgPyAiIiA6IHVuaW9uLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BsaXRzIGEgUEFUSCAod2l0aCA6IG9yIDsgYXMgc2VwYXJhdG9ycykgaW50byBpdHMgcGFydHMuCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gdXNlCisgICAgICogQHBhcmFtIHNvdXJjZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3MsIG9uZSBmb3IgZWFjaCBwYXRoIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRyYW5zbGF0ZVBhdGgoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc291cmNlKSB7CisgICAgICAgIGZpbmFsIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgUGF0aFRva2VuaXplciB0b2sgPSBuZXcgUGF0aFRva2VuaXplcihzb3VyY2UpOworICAgICAgICBTdHJpbmdCdWZmZXIgZWxlbWVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoRWxlbWVudCA9IHRvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmQocmVzb2x2ZUZpbGUocHJvamVjdCwgcGF0aEVsZW1lbnQpLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5sb2coIkRyb3BwaW5nIHBhdGggZWxlbWVudCAiICsgcGF0aEVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFzIGl0IGlzIG5vdCB2YWxpZCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50Lmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cmFuc2xhdGVGaWxlU2VwKGVsZW1lbnQsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFkZEVsZW1lbnQoZWxlbWVudC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gcmVzID0gbmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXTsKKyAgICAgICAgcmVzdWx0LmNvcHlJbnRvKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpdHMgYXJndW1lbnQgd2l0aCBhbGwgZmlsZSBzZXBhcmF0b3IgY2hhcmFjdGVycworICAgICAqIHJlcGxhY2VkIHNvIHRoYXQgdGhleSBtYXRjaCB0aGUgbG9jYWwgT1MgY29udmVudGlvbnMuCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgcGF0aCB0byBjb252ZXJ0CisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVGaWxlKFN0cmluZyBzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIHRyYW5zbGF0ZUZpbGVTZXAocmVzdWx0LCBpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlcyBvY2N1cnJlbmNlcyBhdCBhIHBvc2l0aW9uIG9mIC8gb3IgXCB0byBjb3JyZWN0IHNlcGFyYXRvciBvZiB0aGUKKyAgICAgKiBjdXJyZW50IHBsYXRmb3JtIGFuZCByZXR1cm5zIHdoZXRoZXIgaXQgaGFkIHRvIGRvIGEKKyAgICAgKiByZXBsYWNlbWVudC4KKyAgICAgKiBAcGFyYW0gYnVmZmVyIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSBzdHJpbmcKKyAgICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIGJ1ZmZlciB0byBjb252ZXJ0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgd2FzIGEgLyBvciBcCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHRyYW5zbGF0ZUZpbGVTZXAoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvcykgeworICAgICAgICBpZiAoYnVmZmVyLmNoYXJBdChwb3MpID09ICcvJyB8fCBidWZmZXIuY2hhckF0KHBvcykgPT0gJ1xcJykgeworICAgICAgICAgICAgYnVmZmVyLnNldENoYXJBdChwb3MsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGVsZW1lbnRzIGFzIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUGF0aCkgZ2V0Q2hlY2tlZFJlZigpKS5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICByZXR1cm4gdW5pb24gPT0gbnVsbCA/IDAgOiBhc3NlcnRGaWxlc3lzdGVtT25seSh1bmlvbikuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb25lIHRoaXMgUGF0aC4KKyAgICAgKiBAcmV0dXJuIFBhdGggd2l0aCBzaGFsbG93bHkgY2xvbmVkIFJlc291cmNlIGNoaWxkcmVuLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYXRoIHJlc3VsdCA9IChQYXRoKSBzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgcmVzdWx0LnVuaW9uID0gdW5pb24gPT0gbnVsbCA/IHVuaW9uIDogKFVuaW9uKSB1bmlvbi5jbG9uZSgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHRoZSB2ZXJzaW9uIG9mIERhdGFUeXBlIHRvIHJlY3Vyc2Ugb24gYWxsIERhdGFUeXBlCisgICAgICogY2hpbGQgZWxlbWVudHMgdGhhdCBtYXkgaGF2ZSBiZWVuIGFkZGVkLgorICAgICAqIEBwYXJhbSBzdGsgdGhlIHN0YWNrIG9mIGRhdGEgdHlwZXMgdG8gdXNlIChyZWN1cnNpdmVseSkuCisgICAgICogQHBhcmFtIHAgICB0aGUgcHJvamVjdCB0byB1c2UgdG8gZGVyZWZlcmVuY2UgdGhlIHJlZmVyZW5jZXMuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjayBzdGssIFByb2plY3QgcCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLmRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh1bmlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RrLnB1c2godW5pb24pOworICAgICAgICAgICAgICAgIGludm9rZUNpcmN1bGFyUmVmZXJlbmNlQ2hlY2sodW5pb24sIHN0aywgcCk7CisgICAgICAgICAgICAgICAgc3RrLnBvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgYSBmaWxlbmFtZSB3aXRoIFByb2plY3QncyBoZWxwIC0gaWYgd2Uga25vdyBvbmUgdGhhdCBpcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIHJlc29sdmVGaWxlKFByb2plY3QgcHJvamVjdCwgU3RyaW5nIHJlbGF0aXZlTmFtZSkgeworICAgICAgICByZXR1cm4gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKAorICAgICAgICAgICAgKHByb2plY3QgPT0gbnVsbCkgPyBudWxsIDogcHJvamVjdC5nZXRCYXNlRGlyKCksIHJlbGF0aXZlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uY2F0ZW5hdGVzIHRoZSBzeXN0ZW0gY2xhc3MgcGF0aCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5CisgICAgICogdGhlICR7YnVpbGQuc3lzY2xhc3NwYXRofSBwcm9wZXJ0eSAtIHVzaW5nICZxdW90O2xhc3QmcXVvdDsgYXMKKyAgICAgKiBkZWZhdWx0IHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIGNvbmNhdGVuYXRlZCBwYXRoCisgICAgICovCisgICAgcHVibGljIFBhdGggY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCkgeworICAgICAgICByZXR1cm4gY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uY2F0ZW5hdGVzIHRoZSBzeXN0ZW0gY2xhc3MgcGF0aCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5CisgICAgICogdGhlICR7YnVpbGQuc3lzY2xhc3NwYXRofSBwcm9wZXJ0eSAtIHVzaW5nIHRoZSBzdXBwbGllZCB2YWx1ZQorICAgICAqIGlmICR7YnVpbGQuc3lzY2xhc3NwYXRofSBoYXMgbm90IGJlZW4gc2V0LgorICAgICAqIEBwYXJhbSBkZWZWYWx1ZSB0aGUgb3JkZXIgKCJmaXJzdCIsICJsYXN0IiwgIm9ubHkiKQorICAgICAqIEByZXR1cm4gdGhlIGNvbmNhdGVuYXRlZCBwYXRoCisgICAgICovCisgICAgcHVibGljIFBhdGggY29uY2F0U3lzdGVtQ2xhc3NwYXRoKFN0cmluZyBkZWZWYWx1ZSkgeworICAgICAgICByZXR1cm4gY29uY2F0U3BlY2lhbFBhdGgoZGVmVmFsdWUsIFBhdGguc3lzdGVtQ2xhc3NwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25jYXRlbmF0ZXMgdGhlIHN5c3RlbSBib290IGNsYXNzIHBhdGggaW4gdGhlIG9yZGVyIHNwZWNpZmllZAorICAgICAqIGJ5IHRoZSAke2J1aWxkLnN5c2NsYXNzcGF0aH0gcHJvcGVydHkgLSB1c2luZyB0aGUgc3VwcGxpZWQKKyAgICAgKiB2YWx1ZSBpZiAke2J1aWxkLnN5c2NsYXNzcGF0aH0gaGFzIG5vdCBiZWVuIHNldC4KKyAgICAgKiBAcGFyYW0gZGVmVmFsdWUgdGhlIG9yZGVyICgiZmlyc3QiLCAibGFzdCIsICJvbmx5IikKKyAgICAgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0ZWQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNvbmNhdFN5c3RlbUJvb3RDbGFzc3BhdGgoU3RyaW5nIGRlZlZhbHVlKSB7CisgICAgICAgIHJldHVybiBjb25jYXRTcGVjaWFsUGF0aChkZWZWYWx1ZSwgUGF0aC5zeXN0ZW1Cb290Q2xhc3NwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25jYXRlbmF0ZXMgYSBjbGFzcyBwYXRoIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgdGhlCisgICAgICogJHtidWlsZC5zeXNjbGFzc3BhdGh9IHByb3BlcnR5IC0gdXNpbmcgdGhlIHN1cHBsaWVkIHZhbHVlIGlmCisgICAgICogJHtidWlsZC5zeXNjbGFzc3BhdGh9IGhhcyBub3QgYmVlbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXRoIGNvbmNhdFNwZWNpYWxQYXRoKFN0cmluZyBkZWZWYWx1ZSwgUGF0aCBwKSB7CisgICAgICAgIFBhdGggcmVzdWx0ID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKworICAgICAgICBTdHJpbmcgb3JkZXIgPSBkZWZWYWx1ZTsKKyAgICAgICAgaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbyA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYnVpbGQuc3lzY2xhc3NwYXRoIik7CisgICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3JkZXIgPSBvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvcmRlci5lcXVhbHMoIm9ubHkiKSkgeworICAgICAgICAgICAgLy8gb25seTogdGhlIGRldmVsb3BlciBrbm93cyB3aGF0IChzKWhlIGlzIGRvaW5nCisgICAgICAgICAgICByZXN1bHQuYWRkRXhpc3RpbmcocCwgdHJ1ZSk7CisKKyAgICAgICAgfSBlbHNlIGlmIChvcmRlci5lcXVhbHMoImZpcnN0IikpIHsKKyAgICAgICAgICAgIC8vIGZpcnN0OiBkZXZlbG9wZXIgY291bGQgdXNlIGEgbGl0dGxlIGhlbHAKKyAgICAgICAgICAgIHJlc3VsdC5hZGRFeGlzdGluZyhwLCB0cnVlKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRFeGlzdGluZyh0aGlzKTsKKworICAgICAgICB9IGVsc2UgaWYgKG9yZGVyLmVxdWFscygiaWdub3JlIikpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZTogZG9uJ3QgdHJ1c3QgYW55b25lCisgICAgICAgICAgICByZXN1bHQuYWRkRXhpc3RpbmcodGhpcyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGxhc3Q6IGRvbid0IHRydXN0IHRoZSBkZXZlbG9wZXIKKyAgICAgICAgICAgIGlmICghb3JkZXIuZXF1YWxzKCJsYXN0IikpIHsKKyAgICAgICAgICAgICAgICBsb2coImludmFsaWQgdmFsdWUgZm9yIGJ1aWxkLnN5c2NsYXNzcGF0aDogIiArIG9yZGVyLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hZGRFeGlzdGluZyh0aGlzKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRFeGlzdGluZyhwLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgSmF2YSBSdW50aW1lIGNsYXNzZXMgdG8gdGhpcyBQYXRoIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEphdmFSdW50aW1lKCkgeworICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzS2FmZmUoKSkgeworICAgICAgICAgICAgLy8gbmV3ZXIgdmVyc2lvbnMgb2YgS2FmZmUgKDEuMS4xKykgd29uJ3QgaGF2ZSB0aGlzLAorICAgICAgICAgICAgLy8gYnV0IHRoaXMgd2lsbCBiZSBzb3J0ZWQgYnkgRmlsZVNldCBhbnl3YXkuCisgICAgICAgICAgICBGaWxlIGthZmZlU2hhcmUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInNoYXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJrYWZmZSIpOworICAgICAgICAgICAgaWYgKGthZmZlU2hhcmUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIEZpbGVTZXQga2FmZmVKYXJGaWxlcyA9IG5ldyBGaWxlU2V0KCk7CisgICAgICAgICAgICAgICAga2FmZmVKYXJGaWxlcy5zZXREaXIoa2FmZmVTaGFyZSk7CisgICAgICAgICAgICAgICAga2FmZmVKYXJGaWxlcy5zZXRJbmNsdWRlcygiKi5qYXIiKTsKKyAgICAgICAgICAgICAgICBhZGRGaWxlc2V0KGthZmZlSmFyRmlsZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJHTlUgbGliZ2NqIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLm5hbWUiKSkpIHsKKyAgICAgICAgICAgIGFkZEV4aXN0aW5nKHN5c3RlbUJvb3RDbGFzc3BhdGgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZW5kb3IiKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLmluZGV4T2YoIm1pY3Jvc29mdCIpID49IDApIHsKKyAgICAgICAgICAgIC8vIFhYWCBpcyB0aGlzIGNvZGUgc3RpbGwgbmVjZXNzYXJ5PyBpcyB0aGVyZSBhbnkgMS4yKyBwb3J0PworICAgICAgICAgICAgLy8gUHVsbCBpbiAqLnppcCBmcm9tIHBhY2thZ2VzIGRpcmVjdG9yeQorICAgICAgICAgICAgRmlsZVNldCBtc1ppcEZpbGVzID0gbmV3IEZpbGVTZXQoKTsKKyAgICAgICAgICAgIG1zWmlwRmlsZXMuc2V0RGlyKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKKyAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIlBhY2thZ2VzIikpOworICAgICAgICAgICAgbXNaaXBGaWxlcy5zZXRJbmNsdWRlcygiKi5aSVAiKTsKKyAgICAgICAgICAgIGFkZEZpbGVzZXQobXNaaXBGaWxlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBKREsgMS4yKyBzZWVtcyB0byBzZXQgamF2YS5ob21lIHRvIHRoZSBKUkUgZGlyZWN0b3J5LgorICAgICAgICAgICAgYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJydC5qYXIiKSk7CisgICAgICAgICAgICAvLyBKdXN0IGtlZXAgdGhlIG9sZCB2ZXJzaW9uIGFzIHdlbGwgYW5kIGxldCBhZGRFeGlzdGluZworICAgICAgICAgICAgLy8gc29ydCBpdCBvdXQuCisgICAgICAgICAgICBhZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJqcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAicnQuamFyIikpOworCisgICAgICAgICAgICAvLyBTdW4ncyBhbmQgQXBwbGUncyAxLjQgaGF2ZSBKQ0UgYW5kIEpTU0UgaW4gc2VwYXJhdGUgamFycy4KKyAgICAgICAgICAgIFN0cmluZ1tdIHNlY0phcnMgPSB7ImpjZSIsICJqc3NlIn07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlY0phcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgc2VjSmFyc1tpXSArICIuamFyIikpOworICAgICAgICAgICAgICAgIGFkZEV4aXN0aW5nKG5ldyBQYXRoKG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJDbGFzc2VzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBzZWNKYXJzW2ldICsgIi5qYXIiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElCTSdzIDEuNCBoYXMgcnQuamFyIHNwbGl0IGludG8gNCBzbWFsbGVyIGphcnMgYW5kIGEgY29tYmluZWQKKyAgICAgICAgICAgIC8vIEpDRS9KU1NFIGluIHNlY3VyaXR5Lmphci4KKyAgICAgICAgICAgIFN0cmluZ1tdIGlibUphcnMKKyAgICAgICAgICAgICAgICA9IHsiY29yZSIsICJncmFwaGljcyIsICJzZWN1cml0eSIsICJzZXJ2ZXIiLCAieG1sIn07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlibUphcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgaWJtSmFyc1tpXSArICIuamFyIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGRlZCBmb3IgTWFjT1MgWAorICAgICAgICAgICAgYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIkNsYXNzZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImNsYXNzZXMuamFyIikpOworICAgICAgICAgICAgYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIkNsYXNzZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInVpLmphciIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVtdWxhdGlvbiBvZiBleHRkaXJzIGZlYXR1cmUgaW4gamF2YSA+PSAxLjIuCisgICAgICogVGhpcyBtZXRob2QgYWRkcyBhbGwgZmlsZXMgaW4gdGhlIGdpdmVuCisgICAgICogZGlyZWN0b3JpZXMgKGJ1dCBub3QgaW4gc3ViLWRpcmVjdG9yaWVzISkgdG8gdGhlIGNsYXNzcGF0aCwKKyAgICAgKiBzbyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIHNwZWNpZnkgdGhlbSBhbGwgb25lIGJ5IG9uZS4KKyAgICAgKiBAcGFyYW0gZXh0ZGlycyAtIFBhdGggdG8gYXBwZW5kIGZpbGVzIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXh0ZGlycyhQYXRoIGV4dGRpcnMpIHsKKyAgICAgICAgaWYgKGV4dGRpcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGV4dFByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuZXh0LmRpcnMiKTsKKyAgICAgICAgICAgIGlmIChleHRQcm9wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBleHRkaXJzID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpLCBleHRQcm9wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gZGlycyA9IGV4dGRpcnMubGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gcmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLCBkaXJzW2ldKTsKKyAgICAgICAgICAgIGlmIChkaXIuZXhpc3RzKCkgJiYgZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKKyAgICAgICAgICAgICAgICBmcy5zZXREaXIoZGlyKTsKKyAgICAgICAgICAgICAgICBmcy5zZXRJbmNsdWRlcygiKiIpOworICAgICAgICAgICAgICAgIGFkZEZpbGVzZXQoZnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LiBUaGUgSXRlcmF0b3IgcmV0dXJuZWQKKyAgICAgKiB3aWxsIHRocm93IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb25zIGlmIFJlc291cmNlQ29sbGVjdGlvbnMKKyAgICAgKiBhcmUgYWRkZWQgdG8gdGhpcyBjb250YWluZXIgd2hpbGUgdGhlIEl0ZXJhdG9yIGlzIGluIHVzZS4KKyAgICAgKiBAcmV0dXJuIGEgImZhaWwtZmFzdCIgSXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFBhdGgpIGdldENoZWNrZWRSZWYoKSkuaXRlcmF0b3IoKTsKKyAgICAgICAgfQorICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CisgICAgICAgIGlmIChnZXRQcmVzZXJ2ZUJDKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVJlc291cmNlSXRlcmF0b3IobnVsbCwgbGlzdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdW5pb24gPT0gbnVsbCA/IEVNUFRZX0lURVJBVE9SCisgICAgICAgICAgICA6IGFzc2VydEZpbGVzeXN0ZW1Pbmx5KHVuaW9uKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGZpbGVzeXN0ZW0tb25seSByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUGF0aCkgZ2V0Q2hlY2tlZFJlZigpKS5pc0ZpbGVzeXN0ZW1Pbmx5KCk7CisgICAgICAgIH0KKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICBhc3NlcnRGaWxlc3lzdGVtT25seSh1bmlvbik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGUgc3BlY2lmaWVkIFJlc291cmNlQ29sbGVjdGlvbiBpcyBmaWxlc3lzdGVtLW9ubHkuCisgICAgICogQHBhcmFtIHJjIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gdG8gY2hlY2suCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiA8Y29kZT5yYzwvY29kZT4gaXMgbm90IGZpbGVzeXN0ZW0tb25seS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXNzZWQgaW4gUmVzb3VyY2VDb2xsZWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbGxlY3Rpb24gYXNzZXJ0RmlsZXN5c3RlbU9ubHkoUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CisgICAgICAgIGlmIChyYyAhPSBudWxsICYmICEocmMuaXNGaWxlc3lzdGVtT25seSgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgKyAiIGFsbG93cyBvbmx5IGZpbGVzeXN0ZW0gcmVzb3VyY2VzLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwcyBkZXRlcm1pbmUgd2hldGhlciB0byBwcmVzZXJ2ZSBCQyBieSBjYWxsaW5nIDxjb2RlPmxpc3QoKTwvY29kZT4gb24gc3ViY2xhc3Nlcy4KKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGFueSBzdWJjbGFzcworICAgICAqIHRoYXQgaW1wbGVtZW50cyA8Y29kZT5saXN0KCk8L2NvZGU+OyB0aGlzIGNhbiwgb2YgY291cnNlLCBiZSBhdm9pZGVkIGJ5IG92ZXJyaWRpbmcKKyAgICAgKiB0aGlzIG1ldGhvZCB0byByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LiBJdCBpcyBub3QgZXhwZWN0ZWQgdGhhdCB0aGUgcmVzdWx0IG9mIHRoaXMKKyAgICAgKiBtZXRob2Qgc2hvdWxkIGNoYW5nZSBvdmVyIHRpbWUsIHRodXMgaXQgaXMgY2FsbGVkIG9ubHkgb25jZS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPml0ZXJhdG9yKCk8L2NvZGU+IHNob3VsZCBkZWxlZ2F0ZSB0byA8Y29kZT5saXN0KCk8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRlbGVnYXRlSXRlcmF0b3JUb0xpc3QoKSB7CisgICAgICAgIGlmIChnZXRDbGFzcygpLmVxdWFscyhQYXRoLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbGlzdE1ldGhvZCA9IGdldENsYXNzKCkuZ2V0TWV0aG9kKCJsaXN0IiwgKENsYXNzW10pIG51bGwpOworICAgICAgICAgICAgcmV0dXJuICFsaXN0TWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZXF1YWxzKFBhdGguY2xhc3MpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9zaG91bGRuJ3QgaGFwcGVuLCBidXQKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gZ2V0UHJlc2VydmVCQygpIHsKKyAgICAgICAgaWYgKHByZXNlcnZlQkMgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJlc2VydmVCQyA9IGRlbGVnYXRlSXRlcmF0b3JUb0xpc3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByZXNlcnZlQkMuYm9vbGVhblZhbHVlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0dGVyblNldC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0dGVyblNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjVkNTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0LmphdmEKQEAgLTAsMCArMSw1MTEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogTmFtZWQgY29sbGVjdGlvbiBvZiBpbmNsdWRlL2V4Y2x1ZGUgdGFncy4KKyAqCisgKiA8cD5Nb3ZlZCBvdXQgb2YgTWF0Y2hpbmdUYXNrIHRvIG1ha2UgaXQgYSBzdGFuZGFsb25lIG9iamVjdCB0aGF0CisgKiBjb3VsZCBiZSByZWZlcmVuY2VkIChieSBzY3JpcHRzIGZvciBleGFtcGxlKS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQYXR0ZXJuU2V0IGV4dGVuZHMgRGF0YVR5cGUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworICAgIHByaXZhdGUgVmVjdG9yIGluY2x1ZGVMaXN0ID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yIGV4Y2x1ZGVMaXN0ID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yIGluY2x1ZGVzRmlsZUxpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgZXhjbHVkZXNGaWxlTGlzdCA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIGlubmVyIGNsYXNzIHRvIGhvbGQgYSBuYW1lIG9uIGxpc3QuICAiSWYiIGFuZCAiVW5sZXNzIiBhdHRyaWJ1dGVzCisgICAgICogbWF5IGJlIHVzZWQgdG8gaW52YWxpZGF0ZSB0aGUgZW50cnkgYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZiBhCisgICAgICogcHJvcGVydHkgKHR5cGljYWxseSBzZXQgdGhydSB0aGUgdXNlIG9mIHRoZSBBdmFpbGFibGUgdGFzaykuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIE5hbWVFbnRyeSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGlmQ29uZDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdW5sZXNzQ29uZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgbmFtZSBwYXR0ZXJuLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcGF0dGVybiBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGlmIGF0dHJpYnV0ZS4gVGhpcyBhdHRyaWJ1dGUgYW5kIHRoZSAidW5sZXNzIgorICAgICAgICAgKiBhdHRyaWJ1dGUgYXJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIG5hbWUsIGJhc2VkIGluIHRoZQorICAgICAgICAgKiBleGlzdGVuY2Ugb2YgdGhlIHByb3BlcnR5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29uZCBBIHByb3BlcnR5IG5hbWUuIElmIHRoaXMgcHJvcGVydHkgaXMgbm90CisgICAgICAgICAqICAgICAgICAgICAgIHByZXNlbnQsIHRoZSBuYW1lIGlzIGludmFsaWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZihTdHJpbmcgY29uZCkgeworICAgICAgICAgICAgaWZDb25kID0gY29uZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSB1bmxlc3MgYXR0cmlidXRlLiBUaGlzIGF0dHJpYnV0ZSBhbmQgdGhlICJpZiIKKyAgICAgICAgICogYXR0cmlidXRlIGFyZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBuYW1lLCBiYXNlZCBpbiB0aGUKKyAgICAgICAgICogZXhpc3RlbmNlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbmQgQSBwcm9wZXJ0eSBuYW1lLiBJZiB0aGlzIHByb3BlcnR5IGlzCisgICAgICAgICAqICAgICAgICAgICAgIHByZXNlbnQsIHRoZSBuYW1lIGlzIGludmFsaWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoU3RyaW5nIGNvbmQpIHsKKyAgICAgICAgICAgIHVubGVzc0NvbmQgPSBjb25kOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgYXR0cmlidXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB2YWxpZGF0ZXMgdGhlIG5hbWUgLSBjaGVja3MgdGhlIGlmIGFuZCB1bmxlc3MKKyAgICAgICAgICogcHJvcGVydGllcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHAgdGhlIGN1cnJlbnQgcHJvamVjdCwgdXNlZCB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb3IKKyAgICAgICAgICogICAgICAgICAgYWJzZW5jZSBvZiBhIHByb3BlcnR5LgorICAgICAgICAgKiBAcmV0dXJuICB0aGUgbmFtZSBhdHRyaWJ1dGUgb3IgbnVsbCBpZiB0aGUgImlmIiBvciAidW5sZXNzIgorICAgICAgICAgKiAgICAgICAgICBwcm9wZXJ0aWVzIGFyZSBub3QvYXJlIHNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZXZhbE5hbWUoUHJvamVjdCBwKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsaWQocCkgPyBuYW1lIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZChQcm9qZWN0IHApIHsKKyAgICAgICAgICAgIGlmIChpZkNvbmQgIT0gbnVsbCAmJiBwLmdldFByb3BlcnR5KGlmQ29uZCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1bmxlc3NDb25kICE9IG51bGwgJiYgcC5nZXRQcm9wZXJ0eSh1bmxlc3NDb25kKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBhIHByaW50YWJsZSBmb3JtIG9mIHRoaXMgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgibm9uYW1lIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGlmQ29uZCAhPSBudWxsKSB8fCAodW5sZXNzQ29uZCAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29ubmVjdG9yID0gIiI7CisKKyAgICAgICAgICAgICAgICBpZiAoaWZDb25kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiaWYtPiIpOworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGlmQ29uZCk7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvciA9ICI7IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHVubGVzc0NvbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNvbm5lY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInVubGVzcy0+Iik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQodW5sZXNzQ29uZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW52ZXJ0ZWRQYXR0ZXJuU2V0IGV4dGVuZHMgUGF0dGVyblNldCB7CisgICAgICAgIHByaXZhdGUgSW52ZXJ0ZWRQYXR0ZXJuU2V0KFBhdHRlcm5TZXQgcCkgeworICAgICAgICAgICAgc2V0UHJvamVjdChwLmdldFByb2plY3QoKSk7CisgICAgICAgICAgICBhZGRDb25maWd1cmVkUGF0dGVybnNldChwKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZVBhdHRlcm5zKFByb2plY3QgcCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEV4Y2x1ZGVQYXR0ZXJucyhwKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZVBhdHRlcm5zKFByb2plY3QgcCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluY2x1ZGVQYXR0ZXJucyhwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGF0dGVyblNldDwvY29kZT4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5TZXQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgdGhpcyBpbnN0YW5jZSBpbiBlZmZlY3QgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBQYXR0ZXJuU2V0CisgICAgICogaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFub3RoZXIgYXR0cmlidXRlIG9yIG5lc3QgZWxlbWVudHMgaW5zaWRlCisgICAgICogdGhpcyBlbGVtZW50IGlmIHlvdSBtYWtlIGl0IGEgcmVmZXJlbmNlLjwvcD4KKyAgICAgKiBAcGFyYW0gciB0aGUgcmVmZXJlbmNlIHRvIGFub3RoZXIgcGF0dGVybnNldC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoIWluY2x1ZGVMaXN0LmlzRW1wdHkoKSB8fCAhZXhjbHVkZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBwYXR0ZXJuc2V0IG5lc3RlZCBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHAgYSBjb25maWd1cmVkIHBhdHRlcm5zZXQgbmVzdGVkIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFBhdHRlcm5zZXQoUGF0dGVyblNldCBwKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIG5lc3RlZEluY2x1ZGVzID0gcC5nZXRJbmNsdWRlUGF0dGVybnMoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgU3RyaW5nW10gbmVzdGVkRXhjbHVkZXMgPSBwLmdldEV4Y2x1ZGVQYXR0ZXJucyhnZXRQcm9qZWN0KCkpOworCisgICAgICAgIGlmIChuZXN0ZWRJbmNsdWRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZEluY2x1ZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUobmVzdGVkSW5jbHVkZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuZXN0ZWRFeGNsdWRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZEV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlRXhjbHVkZSgpLnNldE5hbWUobmVzdGVkRXhjbHVkZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0CisgICAgICogQHJldHVybiBhIG5lc3RlZCBpbmNsdWRlIGVsZW1lbnQgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZUVudHJ5IGNyZWF0ZUluY2x1ZGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRQYXR0ZXJuVG9MaXN0KGluY2x1ZGVMaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QKKyAgICAgKiBAcmV0dXJuIGEgbmVzdGVkIGluY2x1ZGVzZmlsZSBlbGVtZW50IHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIE5hbWVFbnRyeSBjcmVhdGVJbmNsdWRlc0ZpbGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGRQYXR0ZXJuVG9MaXN0KGluY2x1ZGVzRmlsZUxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdAorICAgICAqIEByZXR1cm4gYSBuZXN0ZWQgZXhjbHVkZSBlbGVtZW50IHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIE5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRkUGF0dGVyblRvTGlzdChleGNsdWRlTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBmaWxlcyBsaXN0CisgICAgICogQHJldHVybiBhIG5lc3RlZCBleGNsdWRlc2ZpbGUgZWxlbWVudCB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBOYW1lRW50cnkgY3JlYXRlRXhjbHVkZXNGaWxlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRkUGF0dGVyblRvTGlzdChleGNsdWRlc0ZpbGVMaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiB0byB0aGUgY3VycmVudCBsaXN0IG9mIGluY2x1ZGUgcGF0dGVybnMuCisgICAgICogUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hIG9yIGEgc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBpbmNsdWRlIHBhdHRlcm5zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nIGluY2x1ZGVzKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsICYmIGluY2x1ZGVzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5jbHVkZXMsICIsICIsIGZhbHNlKTsKKyAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUodG9rLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgPGNvZGU+ZXhjbHVkZXM8L2NvZGU+IHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEgb3IgYSBzcGFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsdWRlcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4Y2x1ZGUgcGF0dGVybnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmcgZXhjbHVkZXMpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4Y2x1ZGVzICE9IG51bGwgJiYgZXhjbHVkZXMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihleGNsdWRlcywgIiwgIiwgZmFsc2UpOworICAgICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVFeGNsdWRlKCkuc2V0TmFtZSh0b2submV4dFRva2VuKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgbmFtZSBlbnRyeSB0byB0aGUgZ2l2ZW4gbGlzdAorICAgICAqLworICAgIHByaXZhdGUgTmFtZUVudHJ5IGFkZFBhdHRlcm5Ub0xpc3QoVmVjdG9yIGxpc3QpIHsKKyAgICAgICAgTmFtZUVudHJ5IHJlc3VsdCA9IG5ldyBOYW1lRW50cnkoKTsKKyAgICAgICAgbGlzdC5hZGRFbGVtZW50KHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbmNsdWRlcyBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlc0ZpbGUgVGhlIGZpbGUgdG8gZmV0Y2ggdGhlIGluY2x1ZGUgcGF0dGVybnMgZnJvbS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc2ZpbGUoRmlsZSBpbmNsdWRlc0ZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgICB9CisgICAgICAgICBjcmVhdGVJbmNsdWRlc0ZpbGUoKS5zZXROYW1lKGluY2x1ZGVzRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZXhjbHVkZXMgcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjbHVkZXNGaWxlIFRoZSBmaWxlIHRvIGZldGNoIHRoZSBleGNsdWRlIHBhdHRlcm5zIGZyb20uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXNmaWxlKEZpbGUgZXhjbHVkZXNGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICAgfQorICAgICAgICAgY3JlYXRlRXhjbHVkZXNGaWxlKCkuc2V0TmFtZShleGNsdWRlc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUmVhZHMgcGF0aCBtYXRjaGluZyBwYXR0ZXJucyBmcm9tIGEgZmlsZSBhbmQgYWRkcyB0aGVtIHRvIHRoZQorICAgICAqICBpbmNsdWRlcyBvciBleGNsdWRlcyBsaXN0IChhcyBhcHByb3ByaWF0ZSkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRQYXR0ZXJucyhGaWxlIHBhdHRlcm5maWxlLCBWZWN0b3IgcGF0dGVybmxpc3QsIFByb2plY3QgcCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcGF0dGVyblJlYWRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBHZXQgYSBGaWxlUmVhZGVyCisgICAgICAgICAgICBwYXR0ZXJuUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHBhdHRlcm5maWxlKSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBvbmUgTmFtZUVudHJ5IGluIHRoZSBhcHByb3ByaWF0ZSBwYXR0ZXJuIGxpc3QgZm9yIGVhY2gKKyAgICAgICAgICAgIC8vIGxpbmUgaW4gdGhlIGZpbGUuCisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHBhdHRlcm5SZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHAucmVwbGFjZVByb3BlcnRpZXMobGluZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm5Ub0xpc3QocGF0dGVybmxpc3QpLnNldE5hbWUobGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmUgPSBwYXR0ZXJuUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBmcm9tIHBhdHRlcm4gZmlsZTogIgorICAgICAgICAgICAgICAgICAgICArIHBhdHRlcm5maWxlLCBpb2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHBhdHRlcm5SZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgcGF0dGVybnMgb2YgdGhlIG90aGVyIGluc3RhbmNlIHRvIHRoaXMgc2V0LgorICAgICAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgUGF0dGVyblNldCBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gcCB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGVuZChQYXR0ZXJuU2V0IG90aGVyLCBQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGFwcGVuZCB0byBhIHJlZmVyZW5jZSIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGluY2wgPSBvdGhlci5nZXRJbmNsdWRlUGF0dGVybnMocCk7CisgICAgICAgIGlmIChpbmNsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKGluY2xbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGV4Y2wgPSBvdGhlci5nZXRFeGNsdWRlUGF0dGVybnMocCk7CisgICAgICAgIGlmIChleGNsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKGV4Y2xbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlsdGVyZWQgaW5jbHVkZSBwYXR0ZXJucy4KKyAgICAgKiBAcGFyYW0gcCB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGluY2x1ZGVkIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlUGF0dGVybnMoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKHApLmdldEluY2x1ZGVQYXR0ZXJucyhwKTsKKyAgICAgICAgfQorICAgICAgICByZWFkRmlsZXMocCk7CisgICAgICAgIHJldHVybiBtYWtlQXJyYXkoaW5jbHVkZUxpc3QsIHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmVkIGluY2x1ZGUgcGF0dGVybnMuCisgICAgICogQHBhcmFtIHAgdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBleGNsdWRlZCBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZVBhdHRlcm5zKFByb2plY3QgcCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXRFeGNsdWRlUGF0dGVybnMocCk7CisgICAgICAgIH0KKyAgICAgICAgcmVhZEZpbGVzKHApOworICAgICAgICByZXR1cm4gbWFrZUFycmF5KGV4Y2x1ZGVMaXN0LCBwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZm9yIEZpbGVTZXQgY2xhc3Nlcy4KKyAgICAgKiBDaGVjayBpZiB0aGVyZSBhcmUgcGF0dGVybnMgZGVmaW5lZC4KKyAgICAgKiBAcGFyYW0gcCB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUGF0dGVybnMoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKHApLmhhc1BhdHRlcm5zKHApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbmNsdWRlc0ZpbGVMaXN0LnNpemUoKSA+IDAgfHwgZXhjbHVkZXNGaWxlTGlzdC5zaXplKCkgPiAwCisgICAgICAgICAgICAgICAgfHwgaW5jbHVkZUxpc3Quc2l6ZSgpID4gMCB8fCBleGNsdWRlTGlzdC5zaXplKCkgPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBjaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiByZWZlcmVuY2VkIFBhdHRlcm5TZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXR0ZXJuU2V0IGdldFJlZihQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIChQYXR0ZXJuU2V0KSBnZXRDaGVja2VkUmVmKHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSB2ZWN0b3Igb2YgTmFtZUVudHJ5IGVsZW1lbnRzIGludG8gYW4gYXJyYXkgb2YgU3RyaW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIG1ha2VBcnJheShWZWN0b3IgbGlzdCwgUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChsaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBWZWN0b3IgdG1wTmFtZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGxpc3QuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIE5hbWVFbnRyeSBuZSA9IChOYW1lRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gbmUuZXZhbE5hbWUocCk7CisgICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsICYmIHBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdG1wTmFtZXMuYWRkRWxlbWVudChwYXR0ZXJuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3RtcE5hbWVzLnNpemUoKV07CisgICAgICAgIHRtcE5hbWVzLmNvcHlJbnRvKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBpbmNsdWRlc2ZpbGUgb3QgZXhjbHVkZXNmaWxlIGlmIG5vdCBhbHJlYWR5IGRvbmUgc28uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRGaWxlcyhQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKGluY2x1ZGVzRmlsZUxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGluY2x1ZGVzRmlsZUxpc3QuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgTmFtZUVudHJ5IG5lID0gKE5hbWVFbnRyeSkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG5lLmV2YWxOYW1lKHApOworICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgaW5jbEZpbGUgPSBwLnJlc29sdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbmNsdWRlc2ZpbGUgIiArIGluY2xGaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgZm91bmQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVhZFBhdHRlcm5zKGluY2xGaWxlLCBpbmNsdWRlTGlzdCwgcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5jbHVkZXNGaWxlTGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICB9CisgICAgICAgIGlmIChleGNsdWRlc0ZpbGVMaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBleGNsdWRlc0ZpbGVMaXN0LmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIE5hbWVFbnRyeSBuZSA9IChOYW1lRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBuZS5ldmFsTmFtZShwKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGV4Y2xGaWxlID0gcC5yZXNvbHZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZXhjbEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhjbHVkZXNmaWxlICIgKyBleGNsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGZvdW5kLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlYWRQYXR0ZXJucyhleGNsRmlsZSwgZXhjbHVkZUxpc3QsIHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4Y2x1ZGVzRmlsZUxpc3QucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgZm9ybSBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gInBhdHRlcm5TZXR7IGluY2x1ZGVzOiAiICsgaW5jbHVkZUxpc3QgKyAiIGV4Y2x1ZGVzOiAiICsgZXhjbHVkZUxpc3QgKyAiIH0iOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICogQHJldHVybiBhIGNsb25lIG9mIHRoaXMgcGF0dGVybnNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGF0dGVyblNldCBwcyA9IChQYXR0ZXJuU2V0KSBzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgcHMuaW5jbHVkZUxpc3QgPSAoVmVjdG9yKSBpbmNsdWRlTGlzdC5jbG9uZSgpOworICAgICAgICAgICAgcHMuZXhjbHVkZUxpc3QgPSAoVmVjdG9yKSBleGNsdWRlTGlzdC5jbG9uZSgpOworICAgICAgICAgICAgcHMuaW5jbHVkZXNGaWxlTGlzdCA9IChWZWN0b3IpIGluY2x1ZGVzRmlsZUxpc3QuY2xvbmUoKTsKKyAgICAgICAgICAgIHBzLmV4Y2x1ZGVzRmlsZUxpc3QgPSAoVmVjdG9yKSBleGNsdWRlc0ZpbGVMaXN0LmNsb25lKCk7CisgICAgICAgICAgICByZXR1cm4gcHM7CisgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBpbnZlcnRlZCBwYXR0ZXJuc2V0LgorICAgICAqIEBwYXJhbSBwIHRoZSBwYXR0ZXJuIHRvIGludmVydCBhbmQgYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRJbnZlcnQoUGF0dGVyblNldCBwKSB7CisgICAgICAgIGFkZENvbmZpZ3VyZWRQYXR0ZXJuc2V0KG5ldyBJbnZlcnRlZFBhdHRlcm5TZXQocCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Blcm1pc3Npb25zLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QZXJtaXNzaW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjViMDgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QZXJtaXNzaW9ucy5qYXZhCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlVucmVzb2x2ZWRQZXJtaXNzaW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGl0RXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNlY3VyaXR5IG1hbmFnZXIgbWVhbnQgZm9yIHVzYWdlIGJ5IHRhc2tzIHRoYXQgcnVuIGluc2lkZSB0aGUKKyAqIEFudCBWTS4gQW4gZXhhbXBsZXMgYXJlIHRoZSBKYXZhIFRhc2sgYW5kIEpVbml0VGFzay4KKyAqCisgKiBUaGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBpcyB0aGF0IG5vdGhpbmcgKGV4Y2VwdCBmb3IgYSBiYXNlIHNldCBvZiBwZXJtaXNzaW9ucykgaXMgYWxsb3dlZCwgdW5sZXNzCisgKiB0aGUgcGVybWlzc2lvbiBpcyBncmFudGVkIGVpdGhlciBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkuCisgKiBJZiBhIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0aGlzIGNhbiBiZSBvdmVycnVsZWQgYnkgZXhwbGljaXRseSByZXZva2luZyB0aGUgcGVybWlzc2lvbi4KKyAqCisgKiBJdCBpcyBub3QgcGVybWlzc2libGUgdG8gYWRkIHBlcm1pc3Npb25zIChlaXRoZXIgZ3JhbnRlZCBvciByZXZva2VkKSB3aGlsZSB0aGUgU2VjdXJpdHkgTWFuYWdlcgorICogaXMgYWN0aXZlIChhZnRlciBjYWxsaW5nIHNldFNlY3VyaXR5TWFuYWdlcigpIGJ1dCBiZWZvcmUgY2FsbGluZyByZXN0b3JlU2VjdXJpdHlNYW5hZ2VyKCkpLgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBQZXJtaXNzaW9ucyB7CisKKyAgICBwcml2YXRlIExpc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICBwcml2YXRlIExpc3QgcmV2b2tlZFBlcm1pc3Npb25zID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICBwcml2YXRlIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbnMgZ3JhbnRlZCA9IG51bGw7CisgICAgcHJpdmF0ZSBTZWN1cml0eU1hbmFnZXIgb3JpZ1NtID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gYWN0aXZlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGRlbGVnYXRlVG9PbGRTTTsKKworICAgIC8vIE1hbmRhdG9yeSBjb25zdHJ1Y3RvciBmb3IgcGVybWlzc2lvbiBvYmplY3QuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBQQVJBTVMgPSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc2V0IG9mIFBlcm1pc3Npb25zLiAgRXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICogPGNvZGU+bmV3IFBlcm1pc3Npb25zKGZhbHNlKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFBlcm1pc3Npb25zKCkgeworICAgICAgICB0aGlzKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBzZXQgb2YgcGVybWlzc2lvbnMuCisgICAgICogQHBhcmFtIGRlbGVnYXRlVG9PbGRTTSAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIG9sZCBzZWN1cml0eSBtYW5hZ2VyCisgICAgICogd2lsbCBiZSB1c2VkIGlmIHRoZSBwZXJtaXNzaW9uIGhhcyBub3QgYmVlbiBleHBsaWNpdGx5IGdyYW50ZWQgb3IgcmV2b2tlZAorICAgICAqIGluIHRoaXMgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFBlcm1pc3Npb25zKGJvb2xlYW4gZGVsZWdhdGVUb09sZFNNKSB7CisgICAgICAgIHRoaXMuZGVsZWdhdGVUb09sZFNNID0gZGVsZWdhdGVUb09sZFNNOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwZXJtaXNzaW9uIHRvIGJlIGdyYW50ZWQuCisgICAgICogQHBhcmFtIHBlcm0gVGhlIFBlcm1pc3Npb25zLlBlcm1pc3Npb24gdG8gYmUgZ3JhbnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkR3JhbnQoUGVybWlzc2lvbnMuUGVybWlzc2lvbiBwZXJtKSB7CisgICAgICAgIGdyYW50ZWRQZXJtaXNzaW9ucy5hZGQocGVybSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHBlcm1pc3Npb24gdG8gYmUgcmV2b2tlZC4KKyAgICAgKiBAcGFyYW0gcGVybSBUaGUgUGVybWlzc2lvbnMuUGVybWlzc2lvbiB0byBiZSByZXZva2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFJldm9rZShQZXJtaXNzaW9ucy5QZXJtaXNzaW9uIHBlcm0pIHsKKyAgICAgICAgcmV2b2tlZFBlcm1pc3Npb25zLmFkZChwZXJtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUbyBiZSB1c2VkIGJ5IHRhc2tzIHdpc2hpbmcgdG8gdXNlIHRoaXMgc2VjdXJpdHkgbW9kZWwgYmVmb3JlIGV4ZWN1dGluZyB0aGUgcGFydCB0byBiZQorICAgICAqIHN1YmplY3QgdG8gdGhlc2UgUGVybWlzc2lvbnMuIE5vdGUgdGhhdCBzZXR0aW5nIHRoZSBTZWN1cml0eU1hbmFnZXIgdG9vIGVhcmx5IG1heQorICAgICAqIHByZXZlbnQgeW91ciBwYXJ0IGZyb20gc3RhcnRpbmcsIGFzIGZvciBpbnN0YW5jZSBjaGFuZ2luZyBjbGFzc2xvYWRlcnMgbWF5IGJlIHByb2hpYml0ZWQuCisgICAgICogVGhlIGNsYXNzbG9hZGVyIGZvciB0aGUgbmV3IHNpdHVhdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBwcmVzZW50LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2VjdXJpdHlNYW5hZ2VyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgb3JpZ1NtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICBpbml0KCk7CisgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IE15U00oKSk7CisgICAgICAgIGFjdGl2ZSA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucywgY2hlY2tzIHRoZSBsaXN0IG9mIHJldm9rZWQgcGVybWlzc2lvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBncmFudGVkID0gbmV3IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbnMoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcmV2b2tlZFBlcm1pc3Npb25zLmxpc3RJdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFBlcm1pc3Npb25zLlBlcm1pc3Npb24gcCA9IChQZXJtaXNzaW9ucy5QZXJtaXNzaW9uKSBpLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChwLmdldENsYXNzTmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJldm9rZWQgcGVybWlzc2lvbiAiICsgcCArICIgZG9lcyBub3QgY29udGFpbiBhIGNsYXNzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdyYW50ZWRQZXJtaXNzaW9ucy5saXN0SXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBQZXJtaXNzaW9ucy5QZXJtaXNzaW9uIHAgPSAoUGVybWlzc2lvbnMuUGVybWlzc2lvbikgaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAocC5nZXRDbGFzc05hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJHcmFudGVkIHBlcm1pc3Npb24gIiArIHAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBjb250YWluIGEgY2xhc3MuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiBwZXJtID0gY3JlYXRlUGVybWlzc2lvbihwKTsKKyAgICAgICAgICAgICAgICBncmFudGVkLmFkZChwZXJtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBBZGQgYmFzZSBzZXQgb2YgcGVybWlzc2lvbnMKKyAgICAgICAgZ3JhbnRlZC5hZGQobmV3IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24oImxvY2FsaG9zdDoxMDI0LSIsICJsaXN0ZW4iKSk7CisgICAgICAgIGdyYW50ZWQuYWRkKG5ldyBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uKCJqYXZhLnZlcnNpb24iLCAicmVhZCIpKTsKKyAgICAgICAgZ3JhbnRlZC5hZGQobmV3IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24oImphdmEudmVuZG9yIiwgInJlYWQiKSk7CisgICAgICAgIGdyYW50ZWQuYWRkKG5ldyBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uKCJqYXZhLnZlbmRvci51cmwiLCAicmVhZCIpKTsKKyAgICAgICAgZ3JhbnRlZC5hZGQobmV3IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24oImphdmEuY2xhc3MudmVyc2lvbiIsICJyZWFkIikpOworICAgICAgICBncmFudGVkLmFkZChuZXcgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbigib3MubmFtZSIsICJyZWFkIikpOworICAgICAgICBncmFudGVkLmFkZChuZXcgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbigib3MudmVyc2lvbiIsICJyZWFkIikpOworICAgICAgICBncmFudGVkLmFkZChuZXcgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbigib3MuYXJjaCIsICJyZWFkIikpOworICAgICAgICBncmFudGVkLmFkZChuZXcgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbigiZmlsZS5lbmNvZGluZyIsICJyZWFkIikpOworICAgICAgICBncmFudGVkLmFkZChuZXcgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbigiZmlsZS5zZXBhcmF0b3IiLCAicmVhZCIpKTsKKyAgICAgICAgZ3JhbnRlZC5hZGQobmV3IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24oInBhdGguc2VwYXJhdG9yIiwgInJlYWQiKSk7CisgICAgICAgIGdyYW50ZWQuYWRkKG5ldyBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uKCJsaW5lLnNlcGFyYXRvciIsICJyZWFkIikpOworICAgICAgICBncmFudGVkLmFkZChuZXcgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbigiamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iLCAicmVhZCIpKTsKKyAgICAgICAgZ3JhbnRlZC5hZGQobmV3IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24oImphdmEuc3BlY2lmaWNhdGlvbi52ZW5kb3IiLCAicmVhZCIpKTsKKyAgICAgICAgZ3JhbnRlZC5hZGQobmV3IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24oImphdmEuc3BlY2lmaWNhdGlvbi5uYW1lIiwgInJlYWQiKSk7CisgICAgICAgIGdyYW50ZWQuYWRkKG5ldyBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uKCJqYXZhLnZtLnNwZWNpZmljYXRpb24udmVyc2lvbiIsICJyZWFkIikpOworICAgICAgICBncmFudGVkLmFkZChuZXcgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbigiamF2YS52bS5zcGVjaWZpY2F0aW9uLnZlbmRvciIsICJyZWFkIikpOworICAgICAgICBncmFudGVkLmFkZChuZXcgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbigiamF2YS52bS5zcGVjaWZpY2F0aW9uLm5hbWUiLCAicmVhZCIpKTsKKyAgICAgICAgZ3JhbnRlZC5hZGQobmV3IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24oImphdmEudm0udmVyc2lvbiIsICJyZWFkIikpOworICAgICAgICBncmFudGVkLmFkZChuZXcgamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbigiamF2YS52bS52ZW5kb3IiLCAicmVhZCIpKTsKKyAgICAgICAgZ3JhbnRlZC5hZGQobmV3IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24oImphdmEudm0ubmFtZSIsICJyZWFkIikpOworICAgIH0KKworICAgIHByaXZhdGUgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIGNyZWF0ZVBlcm1pc3Npb24oCisgICAgICAgICAgICBQZXJtaXNzaW9ucy5QZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGFkZCBleHBsaWNpdGx5IGFscmVhZHkgcmVzb2x2ZWQgcGVybWlzc2lvbnMgd2lsbCBub3QgYmUKKyAgICAgICAgICAgIC8vIHJlc29sdmVkIHdoZW4gYWRkZWQgYXMgdW5yZXNvbHZlZCBwZXJtaXNzaW9uLgorICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHBlcm1pc3Npb24uZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwZXJtaXNzaW9uLmdldE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb25zID0gcGVybWlzc2lvbi5nZXRBY3Rpb25zKCk7CisgICAgICAgICAgICBDb25zdHJ1Y3RvciBjdHIgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihQQVJBTVMpOworICAgICAgICAgICAgcmV0dXJuIChqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pIGN0ci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geworICAgICAgICAgICAgICAgICAgICBuYW1lLCBhY3Rpb25zIH0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gTGV0IHRoZSBVbnJlc29sdmVkUGVybWlzc2lvbiBoYW5kbGUgaXQuCisgICAgICAgICAgICByZXR1cm4gbmV3IFVucmVzb2x2ZWRQZXJtaXNzaW9uKHBlcm1pc3Npb24uZ2V0Q2xhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24uZ2V0TmFtZSgpLCBwZXJtaXNzaW9uLmdldEFjdGlvbnMoKSwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUbyBiZSB1c2VkIGJ5IHRhc2tzIHRoYXQganVzdCBmaW5pc2hlZCBleGVjdXRpbmcgdGhlIHBhcnRzIHN1YmplY3QgdG8gdGhlc2UgcGVybWlzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc3RvcmVTZWN1cml0eU1hbmFnZXIoKSB7CisgICAgICAgIGFjdGl2ZSA9IGZhbHNlOworICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG9yaWdTbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpbm5lciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBhY3R1YWwgU2VjdXJpdHlNYW5hZ2VyIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGFza3MKKyAgICAgKiBzdXBwb3J0aW5nIFBlcm1pc3Npb25zLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgTXlTTSBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4aXQgaXMgdHJlYXRlZCBpbiBhIHNwZWNpYWwgd2F5IGluIG9yZGVyIHRvIGJlIGFibGUgdG8gcmV0dXJuIHRoZSBleGl0IGNvZGUKKyAgICAgICAgICogdG93YXJkcyB0YXNrcy4KKyAgICAgICAgICogQW4gRXhpdEV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zdGVhZCBvZiBhIHNpbXBsZSBTZWN1cml0eUV4Y2VwdGlvbiB0byBpbmRpY2F0ZSB0aGUgZXhpdAorICAgICAgICAgKiBjb2RlLgorICAgICAgICAgKiBPdmVycmlkZGVuIGZyb20gamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlcgorICAgICAgICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBleGl0IHN0YXR1cyByZXF1ZXN0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0V4aXQoaW50IHN0YXR1cykgeworICAgICAgICAgICAgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHBlcm0gPSBuZXcgamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uKCJleGl0Vk0iLCBudWxsKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hlY2tQZXJtaXNzaW9uKHBlcm0pOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGl0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjZW50cmFsIHBvaW50IGluIGNoZWNraW5nIHBlcm1pc3Npb25zLgorICAgICAgICAgKiBPdmVycmlkZGVuIGZyb20gamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlcgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGVybSBUaGUgcGVybWlzc2lvbiByZXF1ZXN0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHBlcm0pIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVsZWdhdGVUb09sZFNNICYmICFwZXJtLmdldE5hbWUoKS5lcXVhbHMoImV4aXRWTSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGVybU9LID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChncmFudGVkLmltcGxpZXMocGVybSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1PSyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tSZXZva2VkKHBlcm0pOworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHBlcm1pc3Npb24gd2FzIG5vdCBleHBsaWNpdGx5IGdyYW50ZWQgb3IgcmV2b2tlZAorICAgICAgICAgICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHNlY3VyaXR5IG1hbmFnZXIgd2lsbCBkbyBpdHMgd29yaworICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXBlcm1PSyAmJiBvcmlnU20gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ1NtLmNoZWNrUGVybWlzc2lvbihwZXJtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWdyYW50ZWQuaW1wbGllcyhwZXJtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJQZXJtaXNzaW9uICIgKyBwZXJtICsgIiB3YXMgbm90IGdyYW50ZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tSZXZva2VkKHBlcm0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoaXMgcGVybWlzc2lvbiBpcyByZXZva2VkCisgICAgICAgICAqIEBwYXJhbSBwZXJtIHRoZSBwZXJtaXNzaW9uIGJlaW5nIGNoZWNrZWQKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1Jldm9rZWQoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHBlcm0pIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJldm9rZWRQZXJtaXNzaW9ucy5saXN0SXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgaWYgKCgoUGVybWlzc2lvbnMuUGVybWlzc2lvbikgaS5uZXh0KCkpLm1hdGNoZXMocGVybSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJQZXJtaXNzaW9uICIgKyBwZXJtICsgIiB3YXMgcmV2b2tlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBSZXByZXNlbnRzIGEgcGVybWlzc2lvbi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcm1pc3Npb24geworICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGFjdGlvblN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSBTZXQgYWN0aW9uczsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBjbGFzcywgbWFuZGF0b3J5LgorICAgICAgICAgKiBAcGFyYW0gYUNsYXNzIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3MoU3RyaW5nIGFDbGFzcykgeworICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGFDbGFzcy50cmltKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBjbGFzcyBvZiB0aGUgcGVybWlzc2lvbi4KKyAgICAgICAgICogQHJldHVybiBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgcGVybWlzc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24uCisgICAgICAgICAqIEBwYXJhbSBhTmFtZSBUaGUgbmFtZSBvZiB0aGUgcGVybWlzc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGFOYW1lKSB7CisgICAgICAgICAgICBuYW1lID0gYU5hbWUudHJpbSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgcGVybWlzc2lvbi4KKyAgICAgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcGVybWlzc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgYWN0aW9ucy4KKyAgICAgICAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGFjdGlvbnMgb2YgdGhlIHBlcm1pc3Npb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25zKFN0cmluZyBhY3Rpb25zKSB7CisgICAgICAgICAgICBhY3Rpb25TdHJpbmcgPSBhY3Rpb25zOworICAgICAgICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gcGFyc2VBY3Rpb25zKGFjdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgYWN0aW9ucy4KKyAgICAgICAgICogQHJldHVybiBUaGUgYWN0aW9ucyBvZiB0aGUgcGVybWlzc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBhY3Rpb25TdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTGVhcm4gd2hldGhlciB0aGUgcGVybWlzc2lvbiBtYXRjaGVzIGluIGNhc2Ugb2YgYSByZXZva2VkIHBlcm1pc3Npb24uCisgICAgICAgICAqIEBwYXJhbSBwZXJtIFRoZSBwZXJtaXNzaW9uIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG1hdGNoZXMoamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uIHBlcm0pIHsKKyAgICAgICAgICAgIGlmICghY2xhc3NOYW1lLmVxdWFscyhwZXJtLmdldENsYXNzKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiKiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGVybS5nZXROYW1lKCkuc3RhcnRzV2l0aChuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKHBlcm0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNldCBhcyA9IHBhcnNlQWN0aW9ucyhwZXJtLmdldEFjdGlvbnMoKSk7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBhcy5zaXplKCk7CisgICAgICAgICAgICAgICAgYXMucmVtb3ZlQWxsKGFjdGlvbnMpOworICAgICAgICAgICAgICAgIGlmIChhcy5zaXplKCkgPT0gc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBOb25lIG9mIHRoZSBhY3Rpb25zIHJldm9rZWQsIHNvIGFsbCBhbGxvd2VkLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2VzIHRoZSBhY3Rpb25zIGludG8gYSBzZXQgb2Ygc2VwYXJhdGUgc3RyaW5ncy4KKyAgICAgICAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGFjdGlvbnMgdG8gYmUgcGFyc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTZXQgcGFyc2VBY3Rpb25zKFN0cmluZyBhY3Rpb25zKSB7CisgICAgICAgICAgICBTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0ayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYWN0aW9ucywgIiwiKTsKKyAgICAgICAgICAgIHdoaWxlICh0ay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbSA9IHRrLm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGl0ZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgc3RyaW5nIGRlc2NyaXB0aW9uIG9mIHRoZSBwZXJtaXNzaW9ucy4KKyAgICAgICAgICogQHJldHVybiBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIHBlcm1pc3Npb25zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAoIlBlcm1pc3Npb246ICIgKyBjbGFzc05hbWUgKyAiIChcIiIgKyBuYW1lICsgIlwiLCBcIiIgKyBhY3Rpb25zICsgIlwiKSIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUHJvcGVydHlTZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Byb3BlcnR5U2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5Nzc2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Byb3BlcnR5U2V0LmphdmEKQEAgLTAsMCArMSw1MDYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlByb3BlcnR5UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cE1hdGNoZXJGYWN0b3J5OworCisvKioKKyAqIEEgc2V0IG9mIHByb3BlcnRpZXMuCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5U2V0IGV4dGVuZHMgRGF0YVR5cGUgaW1wbGVtZW50cyBSZXNvdXJjZUNvbGxlY3Rpb24geworCisgICAgcHJpdmF0ZSBib29sZWFuIGR5bmFtaWMgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBuZWdhdGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIFNldCBjYWNoZWROYW1lczsKKyAgICBwcml2YXRlIFZlY3RvciBwdHlSZWZzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yIHNldFJlZnMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBNYXBwZXIgbWFwcGVyOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIG5lc3RlZCBjbGFzcyBjb250YWluaW5nIGEgcmVmZXJlbmNlIHRvIHNvbWUgcHJvcGVydGllcworICAgICAqIGFuZCBvcHRpb25hbGx5IGEgc291cmNlIG9mIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eVJlZiB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlZ2V4OworICAgICAgICBwcml2YXRlIFN0cmluZyBwcmVmaXg7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGJ1aWx0aW47CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgbmFtZS4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgYXNzZXJ0VmFsaWQoIm5hbWUiLCBuYW1lKTsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlIHRvIGZpbHRlciB0aGUgcHJvcGVydGllcy4KKyAgICAgICAgICogQHBhcmFtIHJlZ2V4IGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVnZXgoU3RyaW5nIHJlZ2V4KSB7CisgICAgICAgICAgICBhc3NlcnRWYWxpZCgicmVnZXgiLCByZWdleCk7CisgICAgICAgICAgICB0aGlzLnJlZ2V4ID0gcmVnZXg7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBwcmVmaXggdG8gdXNlLgorICAgICAgICAgKiBAcGFyYW0gcHJlZml4IGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgICAgICBhc3NlcnRWYWxpZCgicHJlZml4IiwgcHJlZml4KTsKKyAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWx0aW4gcHJvcGVydHkgbmFtZXMgLSBhbGwsIHN5c3RlbSBvciBjb21tYW5kbGluZS4KKyAgICAgICAgICogQHBhcmFtIGIgYW4gZW51bWVyYXRlZCA8Y29kZT5CdWlsZGluUHJvcGVydHlTZXROYW1lPC9jb2RlPiB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEJ1aWx0aW4oQnVpbHRpblByb3BlcnR5U2V0TmFtZSBiKSB7CisgICAgICAgICAgICBTdHJpbmcgcEJ1aWx0SW4gPSBiLmdldFZhbHVlKCk7CisgICAgICAgICAgICBhc3NlcnRWYWxpZCgiYnVpbHRpbiIsIHBCdWlsdEluKTsKKyAgICAgICAgICAgIHRoaXMuYnVpbHRpbiA9IHBCdWlsdEluOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFZhbGlkKFN0cmluZyBhdHRyLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpIDwgMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBhdHRyaWJ1dGU6ICIgKyBhdHRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCsrY291bnQgIT0gMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXR0cmlidXRlcyBuYW1lLCByZWdleCwgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgKyAicHJlZml4IGFyZSBtdXR1YWxseSBleGNsdXNpdmUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGRlYnVnIHRvU3RyaW5nKCkuCisgICAgICAgICAqIEByZXR1cm4gYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIm5hbWU9IiArIG5hbWUgKyAiLCByZWdleD0iICsgcmVnZXggKyAiLCBwcmVmaXg9IiArIHByZWZpeAorICAgICAgICAgICAgICAgICsgIiwgYnVpbHRpbj0iICsgYnVpbHRpbjsKKyAgICAgICAgfQorCisgICAgfSAvL2VuZCBuZXN0ZWQgY2xhc3MKKworICAgIC8qKgorICAgICAqIEFsbG93IHByb3BlcnRpZXMgb2YgYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIHNldC4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkgbmFtZSB0byBhbGxvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFByb3BlcnR5UmVmIHIgPSBuZXcgUHJvcGVydHlSZWYoKTsKKyAgICAgICAgci5zZXROYW1lKG5hbWUpOworICAgICAgICBhZGRQcm9wZXJ0eXJlZihyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIG1hdGNoIGEgcmVnZXggaW4gdGhlIHNldC4KKyAgICAgKiBAcGFyYW0gcmVnZXggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kUmVnZXgoU3RyaW5nIHJlZ2V4KSB7CisgICAgICAgIFByb3BlcnR5UmVmIHIgPSBuZXcgUHJvcGVydHlSZWYoKTsKKyAgICAgICAgci5zZXRSZWdleChyZWdleCk7CisgICAgICAgIGFkZFByb3BlcnR5cmVmKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCBhIHByZWZpeCBpbiB0aGUgc2V0LgorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgUHJvcGVydHlSZWYgciA9IG5ldyBQcm9wZXJ0eVJlZigpOworICAgICAgICByLnNldFByZWZpeChwcmVmaXgpOworICAgICAgICBhZGRQcm9wZXJ0eXJlZihyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBidWlsdGluIChhbGwsIHN5c3RlbSBvciBjb21tYW5kbGluZSkgcHJvcGVydGllcyBpbiB0aGUgc2V0LgorICAgICAqIEBwYXJhbSBiIHRoZSB0eXBlIG9mIGJ1aWx0aW4gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRCdWlsdGluKEJ1aWx0aW5Qcm9wZXJ0eVNldE5hbWUgYikgeworICAgICAgICBQcm9wZXJ0eVJlZiByID0gbmV3IFByb3BlcnR5UmVmKCk7CisgICAgICAgIHIuc2V0QnVpbHRpbihiKTsKKyAgICAgICAgYWRkUHJvcGVydHlyZWYocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbWFwcGVyIHRvIGNoYW5nZSBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgKiBAcGFyYW0gdHlwZSBtYXBwZXIgdHlwZS4KKyAgICAgKiBAcGFyYW0gZnJvbSBzb3VyY2UgcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gdG8gb3V0cHV0IHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGVyKFN0cmluZyB0eXBlLCBTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB7CisgICAgICAgIE1hcHBlciBtID0gY3JlYXRlTWFwcGVyKCk7CisgICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIG1hcHBlclR5cGUgPSBuZXcgTWFwcGVyLk1hcHBlclR5cGUoKTsKKyAgICAgICAgbWFwcGVyVHlwZS5zZXRWYWx1ZSh0eXBlKTsKKyAgICAgICAgbS5zZXRUeXBlKG1hcHBlclR5cGUpOworICAgICAgICBtLnNldEZyb20oZnJvbSk7CisgICAgICAgIG0uc2V0VG8odG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHByb3BlcnR5IHJlZmVyZW5jZSAobmVzdGVkIGVsZW1lbnQpIHRvIHRoZSByZWZlcmVuY2VzIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIHJlZiBhIHByb3BlcnR5IHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eXJlZihQcm9wZXJ0eVJlZiByZWYpIHsKKyAgICAgICAgYXNzZXJ0Tm90UmVmZXJlbmNlKCk7CisgICAgICAgIHB0eVJlZnMuYWRkRWxlbWVudChyZWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbm90aGVyIHByb3BlcnR5IHNldCB0byB0aGlzIHNldC4KKyAgICAgKiBAcGFyYW0gcmVmIGFub3RoZXIgcHJvcGVydHkgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5c2V0KFByb3BlcnR5U2V0IHJlZikgeworICAgICAgICBhc3NlcnROb3RSZWZlcmVuY2UoKTsKKyAgICAgICAgc2V0UmVmcy5hZGRFbGVtZW50KHJlZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbWFwcGVyIHRvIG1hcCB0aGUgcHJvcGVydHkgbmFtZXMuCisgICAgICogQHJldHVybiBhIG1hcHBlciB0byBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBNYXBwZXIgY3JlYXRlTWFwcGVyKCkgeworICAgICAgICBhc3NlcnROb3RSZWZlcmVuY2UoKTsKKyAgICAgICAgaWYgKG1hcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRvbyBtYW55IDxtYXBwZXI+cyEiKTsKKyAgICAgICAgfQorICAgICAgICBtYXBwZXIgPSBuZXcgTWFwcGVyKGdldFByb2plY3QoKSk7CisgICAgICAgIHJldHVybiBtYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmVzdGVkIEZpbGVOYW1lTWFwcGVyLgorICAgICAqIEBwYXJhbSBmaWxlTmFtZU1hcHBlciB0aGUgbWFwcGVyIHRvIGFkZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyKSB7CisgICAgICAgIGNyZWF0ZU1hcHBlcigpLmFkZChmaWxlTmFtZU1hcHBlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gcmVldmFsdWF0ZSB0aGUgc2V0IGV2ZXJ5dGltZSB0aGUgc2V0IGlzIHVzZWQuCisgICAgICogRGVmYXVsdCBpcyB0cnVlLgorICAgICAqCisgICAgICogQHBhcmFtIGR5bmFtaWMgaWYgdHJ1ZSwgcmVldmFsdWF0ZSB0aGUgcHJvcGVydHkgc2V0IGVhY2ggdGltZQorICAgICAqICAgICAgICAgICAgICAgIHRoZSBzZXQgaXMgdXNlZC4gaWYgZmFsc2UgY2FjaGUgdGhlIHByb3BlcnR5IHNldAorICAgICAqICAgICAgICAgICAgICAgIHRoZSBmaXJzdCB0aW1lIGFuZCB1c2UgdGhlIGNhY2hlZCBzZXQgb24gc3Vic2VxdWVudAorICAgICAqICAgICAgICAgICAgICAgIG9jY2FzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREeW5hbWljKGJvb2xlYW4gZHluYW1pYykgeworICAgICAgICBhc3NlcnROb3RSZWZlcmVuY2UoKTsKKyAgICAgICAgdGhpcy5keW5hbWljID0gZHluYW1pYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBuZWdhdGUgcmVzdWx0cy4KKyAgICAgKiBJZiAidHJ1ZSIsIGFsbCBwcm9wZXJ0aWVzIG5vdCBzZWxlY3RlZCBieSBuZXN0ZWQgZWxlbWVudHMgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKiAgRGVmYXVsdCBpcyAiZmFsc2UiLgorICAgICAqIEBwYXJhbSBuZWdhdGUgaWYgdHJ1ZSwgbmVnYXRlIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmVnYXRlKGJvb2xlYW4gbmVnYXRlKSB7CisgICAgICAgIGFzc2VydE5vdFJlZmVyZW5jZSgpOworICAgICAgICB0aGlzLm5lZ2F0ZSA9IG5lZ2F0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGR5bmFtaWMgYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgc2V0IGlzIHRvIGJlIGV2YWx1bGF0ZWQgZWFjaCB0aW1lIGl0IGlzIHVzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RHluYW1pYygpIHsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkgPyBnZXRSZWYoKS5keW5hbWljIDogZHluYW1pYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1hcHBlciBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgbWFwcGVyIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwcGVyIGdldE1hcHBlcigpIHsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkgPyBnZXRSZWYoKS5tYXBwZXIgOiBtYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gYSBoYXNodGFibGUuCisgICAgICogVXNlIHByb3BlcnR5bmFtZXMgdG8gZ2V0IHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgKGluY2x1ZGluZworICAgICAqIGRlZmF1bHQgb25lcykuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgZ2V0QWxsU3lzdGVtUHJvcGVydGllcygpIHsKKyAgICAgICAgSGFzaHRhYmxlIHJldCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgICAgICAgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgcmV0LnB1dChuYW1lLCBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KG5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIG9wZXJhdGlvbiB0byBnZXQgdGhlIGV4aXN0aW5nIG9yIHJlY2FsY3VsYXRlZCBwcm9wZXJ0aWVzLgorICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgcHJvcGVydHlzZXQuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgU2V0IG5hbWVzID0gbnVsbDsKKyAgICAgICAgUHJvamVjdCBwcmogPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIEhhc2h0YWJsZSBwcm9wcyA9CisgICAgICAgICAgICBwcmogPT0gbnVsbCA/IGdldEFsbFN5c3RlbVByb3BlcnRpZXMoKSA6IHByai5nZXRQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgLy9xdWljayAmIGRpcnR5LCB0byBtYWtlIG5lc3RlZCBtYXBwZWQgcC1zZXRzIHdvcms6CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHNldFJlZnMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFByb3BlcnR5U2V0IHNldCA9IChQcm9wZXJ0eVNldCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgcHJvcHMucHV0QWxsKHNldC5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldER5bmFtaWMoKSB8fCBjYWNoZWROYW1lcyA9PSBudWxsKSB7CisgICAgICAgICAgICBuYW1lcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBhZGRQcm9wZXJ0eU5hbWVzKG5hbWVzLCBwcm9wcyk7CisgICAgICAgICAgICAvLyBBZGQgdGhpcyBQcm9wZXJ0eVNldCdzIG5lc3RlZCBQcm9wZXJ0eVNldHMnIHByb3BlcnR5IG5hbWVzLgorICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gc2V0UmVmcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgIFByb3BlcnR5U2V0IHNldCA9IChQcm9wZXJ0eVNldCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIG5hbWVzLmFkZEFsbChzZXQuZ2V0UHJvcGVydGllcygpLmtleVNldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZWdhdGUpIHsKKyAgICAgICAgICAgICAgICAvL21ha2UgYSBjb3B5Li4uCisgICAgICAgICAgICAgICAgSGFzaFNldCBjb21wbGVtZW50ID0gbmV3IEhhc2hTZXQocHJvcHMua2V5U2V0KCkpOworICAgICAgICAgICAgICAgIGNvbXBsZW1lbnQucmVtb3ZlQWxsKG5hbWVzKTsKKyAgICAgICAgICAgICAgICBuYW1lcyA9IGNvbXBsZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWdldER5bmFtaWMoKSkgeworICAgICAgICAgICAgICAgIGNhY2hlZE5hbWVzID0gbmFtZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYW1lcyA9IGNhY2hlZE5hbWVzOworICAgICAgICB9CisgICAgICAgIEZpbGVOYW1lTWFwcGVyIG0gPSBudWxsOworICAgICAgICBNYXBwZXIgbXlNYXBwZXIgPSBnZXRNYXBwZXIoKTsKKyAgICAgICAgaWYgKG15TWFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG0gPSBteU1hcHBlci5nZXRJbXBsZW1lbnRhdGlvbigpOworICAgICAgICB9CisgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIC8vaXRlcmF0ZSB0aHJvdWdoIHRoZSBuYW1lcywgZ2V0IHRoZSBtYXRjaGluZyB2YWx1ZXMKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcHJvcHMuZ2V0KG5hbWUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBtYXkgYmUgbnVsbCBpZiBhIHN5c3RlbSBwcm9wZXJ0eSBoYXMgYmVlbiBhZGRlZAorICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRoZSBwcm9qZWN0IGluc3RhbmNlIGhhcyBiZWVuIGluaXRpYWxpemVkCisgICAgICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvL21hcCB0aGUgbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbmV3bmFtZSA9IG0ubWFwRmlsZU5hbWUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXduYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuZXduYW1lWzBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSAgbmFtZXMgdGhlIG91dHB1dCBTZXQgdG8gZmlsbCB3aXRoIHRoZSBwcm9wZXJ0eSBuYW1lcworICAgICAqICAgICAgICAgbWF0Y2hpbmcgdGhpcyBQcm9wZXJ0eVNldCBzZWxlY3Rpb24gY3JpdGVyaWEuCisgICAgICogQHBhcmFtICBwcm9wZXJ0aWVzIHRoZSBjdXJyZW50IFByb2plY3QgcHJvcGVydGllcywgcGFzc2VkIGluIHRvCisgICAgICogICAgICAgICBhdm9pZCBuZWVkbGVzcyBkdXBsaWNhdGlvbiBvZiB0aGUgSGFzaHRhYmxlIGR1cmluZyByZWN1cnNpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5TmFtZXMoU2V0IG5hbWVzLCBIYXNodGFibGUgcHJvcGVydGllcykgeworICAgICAgICAvLyBBZGQgdGhpcyBQcm9wZXJ0eVNldCdzIHByb3BlcnR5IG5hbWVzLgorICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBwdHlSZWZzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBQcm9wZXJ0eVJlZiByID0gKFByb3BlcnR5UmVmKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoci5uYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5nZXQoci5uYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChyLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoci5wcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gcCA9IHByb3BlcnRpZXMua2V5cygpOyBwLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHAubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChyLnByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoci5yZWdleCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUmVnZXhwTWF0Y2hlckZhY3RvcnkgbWF0Y2hNYWtlciA9IG5ldyBSZWdleHBNYXRjaGVyRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIFJlZ2V4cE1hdGNoZXIgbWF0Y2hlciA9IG1hdGNoTWFrZXIubmV3UmVnZXhwTWF0Y2hlcigpOworICAgICAgICAgICAgICAgIG1hdGNoZXIuc2V0UGF0dGVybihyLnJlZ2V4KTsKKyAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIHAgPSBwcm9wZXJ0aWVzLmtleXMoKTsgcC5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBwLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoci5idWlsdGluICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIGlmIChyLmJ1aWx0aW4uZXF1YWxzKEJ1aWx0aW5Qcm9wZXJ0eVNldE5hbWUuQUxMKSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGRBbGwocHJvcGVydGllcy5rZXlTZXQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLmJ1aWx0aW4uZXF1YWxzKEJ1aWx0aW5Qcm9wZXJ0eVNldE5hbWUuU1lTVEVNKSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGRBbGwoU3lzdGVtLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLmJ1aWx0aW4uZXF1YWxzKEJ1aWx0aW5Qcm9wZXJ0eVNldE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ09NTUFORExJTkUpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZEFsbChnZXRQcm9qZWN0KCkuZ2V0VXNlclByb3BlcnRpZXMoKS5rZXlTZXQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbXBvc3NpYmxlOiBJbnZhbGlkIGJ1aWx0aW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbXBvc3NpYmxlOiBJbnZhbGlkIFByb3BlcnR5UmVmISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQorICAgICAqIHJlZmVyZW5jZWQgUHJvcGVydHlTZXQuCisgICAgICogQHJldHVybiB0aGUgcmVmZXJlbmNlZCBQcm9wZXJ0eVNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlTZXQgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gKFByb3BlcnR5U2V0KSBnZXRDaGVja2VkUmVmKFByb3BlcnR5U2V0LmNsYXNzLCAicHJvcGVydHlzZXQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVmaWQgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtICByIHRoZSByZWZlcmVuY2UgdGhpcyBkYXRhdHlwZSBzaG91bGQgcG9pbnQgdG8uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbm90aGVyIGF0dHJpYnV0ZSB3YXMgc2V0LCBzaW5jZQorICAgICAqICAgICAgICAgcmVmaWQgYW5kIGFsbCBvdGhlciBhdHRyaWJ1dGVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgaWYgKCFub0F0dHJpYnV0ZVNldCkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoaXMgZGF0YSB0eXBlIGlzIG5vdCBhIHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIDxwPkNhbGxpbmcgdGhpcyBtZXRob2QgYXMgdGhlIGZpcnN0IGxpbmUgb2YgZXZlcnkgYmVhbiBtZXRob2Qgb2YKKyAgICAgKiB0aGlzIGRhdGEgdHlwZSAoc2V0WHl6LCBhZGRYeXosIGNyZWF0ZVh5eikgZW5zdXJlIHByb3BlciBoYW5kbGluZworICAgICAqIG9mIHRoZSByZWZpZCBhdHRyaWJ1dGUuPC9wPgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcmVmaWQgYXR0cmlidXRlIHdhcyBhbHJlYWR5IHNldCwgc2luY2UKKyAgICAgKiAgICAgICAgIHJlZmlkIGFuZCBhbGwgb3RoZXIgYXR0cmlidXRlcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFzc2VydE5vdFJlZmVyZW5jZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgbm9BdHRyaWJ1dGVTZXQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHdoaWNoIHRyYWNrcyB3aGV0aGVyIGFueSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0OyB1c2VkIGJ5CisgICAgICoge0BsaW5rICNhc3NlcnROb3RSZWZlcmVuY2UoKX0gYW5kIHtAbGluayAjc2V0UmVmaWQoUmVmZXJlbmNlKX0uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5vQXR0cmlidXRlU2V0ID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIHByb3BlcnR5cmVmJ3MgYnVpbHRpbiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsdGluUHJvcGVydHlTZXROYW1lIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gImFsbCI7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNID0gInN5c3RlbSI7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORExJTkUgPSAiY29tbWFuZGxpbmUiOworICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge0FMTCwgU1lTVEVNLCBDT01NQU5ETElORX07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGRlYnVnIHRvU3RyaW5nLgorICAgICAqIFRoaXMgZ2V0cyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGtleT12YWx1ZSBwYWlycyBmb3IKKyAgICAgKiB0aGUgcHJvcGVydGllcyBpbiB0aGUgc2V0LgorICAgICAqIFRoZSBvdXRwdXQgb3JkZXIgaXMgc29ydGVkIGFjY29yZGluZyB0byB0aGUga2V5cycgPGk+bmF0dXJhbCBvcmRlcjwvaT4uCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXAgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFRyZWVNYXAgc29ydGVkID0gbmV3IFRyZWVNYXAoZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc29ydGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworICAgICAgICAgICAgaWYgKGIubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYi5hcHBlbmQoZS5nZXRLZXkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGIuYXBwZW5kKCI9Iik7CisgICAgICAgICAgICBiLmFwcGVuZChlLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb2YgUmVzb3VyY2VzLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbiBlID0gZ2V0UHJvcGVydGllcygpLnByb3BlcnR5TmFtZXMoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVJlc291cmNlKGdldFByb2plY3QoKSwgKFN0cmluZykgZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gZ2V0UmVmKCkuc2l6ZSgpIDogZ2V0UHJvcGVydGllcygpLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBmaWxlc3lzdGVtLW9ubHkgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSAmJiBnZXRSZWYoKS5pc0ZpbGVzeXN0ZW1Pbmx5KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9RdWFudGlmaWVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9RdWFudGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWMxYjg0YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1F1YW50aWZpZXIuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIEVudW1lcmF0ZWRBdHRyaWJ1dGUgZm9yIHF1YW50aWZpZXIgY29tcGFyaXNvbnMuIEV2YWx1YXRlcyBhCisgKiA8Y29kZT5ib29sZWFuW108L2NvZGU+IG9yIHJhdyA8Y29kZT50cnVlPC9jb2RlPiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+CisgKiBjb3VudHMuIEFjY2VwdHMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6PHVsPgorICogPGxpPiJhbGwiPC9saT4gLSBub25lIDxjb2RlPmZhbHNlPC9jb2RlPgorICogPGxpPiJlYWNoIjwvbGk+IC0gbm9uZSA8Y29kZT5mYWxzZTwvY29kZT4KKyAqIDxsaT4iZXZlcnkiPC9saT4gLSBub25lIDxjb2RlPmZhbHNlPC9jb2RlPgorICogPGxpPiJhbnkiPC9saT4gLSBhdCBsZWFzdCBvbmUgPGNvZGU+dHJ1ZTwvY29kZT4KKyAqIDxsaT4ic29tZSI8L2xpPiAtIGF0IGxlYXN0IG9uZSA8Y29kZT50cnVlPC9jb2RlPgorICogPGxpPiJvbmUiPC9saT4gLSBleGFjdGx5IG9uZSA8Y29kZT50cnVlPC9jb2RlPgorICogPGxpPiJtYWpvcml0eSI8L2xpPiAtIG1vcmUgPGNvZGU+dHJ1ZTwvY29kZT4gdGhhbiA8Y29kZT5mYWxzZTwvY29kZT4KKyAqIDxsaT4ibW9zdCI8L2xpPiAtIG1vcmUgPGNvZGU+dHJ1ZTwvY29kZT4gdGhhbiA8Y29kZT5mYWxzZTwvY29kZT4KKyAqIDxsaT4ibm9uZSI8L2xpPiAtIG5vbmUgPGNvZGU+dHJ1ZTwvY29kZT4KKyAqIDwvdWw+CisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgUXVhbnRpZmllciBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTFVFUworICAgICAgICA9IG5ldyBTdHJpbmdbXSB7ImFsbCIsICJlYWNoIiwgImV2ZXJ5IiwgImFueSIsICJzb21lIiwgIm9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFqb3JpdHkiLCAibW9zdCIsICJub25lIn07CisKKyAgICAvKiogQUxMIGluc3RhbmNlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFudGlmaWVyIEFMTCA9IG5ldyBRdWFudGlmaWVyKCJhbGwiKTsKKyAgICAvKiogQU5ZIGluc3RhbmNlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFudGlmaWVyIEFOWSA9IG5ldyBRdWFudGlmaWVyKCJhbnkiKTsKKyAgICAvKiogT05FIGluc3RhbmNlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFudGlmaWVyIE9ORSA9IG5ldyBRdWFudGlmaWVyKCJvbmUiKTsKKyAgICAvKiogTUFKT1JJVFkgaW5zdGFuY2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YW50aWZpZXIgTUFKT1JJVFkgPSBuZXcgUXVhbnRpZmllcigibWFqb3JpdHkiKTsKKyAgICAvKiogTk9ORSBpbnN0YW5jZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbnRpZmllciBOT05FID0gbmV3IFF1YW50aWZpZXIoIm5vbmUiKTsKKworICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFByZWRpY2F0ZSB7CisgICAgICAgIGFic3RyYWN0IGJvb2xlYW4gZXZhbChpbnQgdCwgaW50IGYpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByZWRpY2F0ZSBBTExfUFJFRCA9IG5ldyBQcmVkaWNhdGUoKSB7CisgICAgICAgIGJvb2xlYW4gZXZhbChpbnQgdCwgaW50IGYpIHsgcmV0dXJuIGYgPT0gMDsgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGUgQU5ZX1BSRUQgPSBuZXcgUHJlZGljYXRlKCkgeworICAgICAgICBib29sZWFuIGV2YWwoaW50IHQsIGludCBmKSB7IHJldHVybiB0ID4gMDsgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGUgT05FX1BSRUQgPSBuZXcgUHJlZGljYXRlKCkgeworICAgICAgICBib29sZWFuIGV2YWwoaW50IHQsIGludCBmKSB7IHJldHVybiB0ID09IDE7IH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJlZGljYXRlIE1BSk9SSVRZX1BSRUQgPSBuZXcgUHJlZGljYXRlKCkgeworICAgICAgICBib29sZWFuIGV2YWwoaW50IHQsIGludCBmKSB7IHJldHVybiB0ID4gZjsgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGUgTk9ORV9QUkVEID0gbmV3IFByZWRpY2F0ZSgpIHsKKyAgICAgICAgYm9vbGVhbiBldmFsKGludCB0LCBpbnQgZikgeyByZXR1cm4gdCA9PSAwOyB9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByZWRpY2F0ZVtdIFBSRURTID0gbmV3IFByZWRpY2F0ZVtWQUxVRVMubGVuZ3RoXTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgIFBSRURTWzBdID0gQUxMX1BSRUQ7CisgICAgICAgIFBSRURTWzFdID0gQUxMX1BSRUQ7CisgICAgICAgIFBSRURTWzJdID0gQUxMX1BSRUQ7CisgICAgICAgIFBSRURTWzNdID0gQU5ZX1BSRUQ7CisgICAgICAgIFBSRURTWzRdID0gQU5ZX1BSRUQ7CisgICAgICAgIFBSRURTWzVdID0gT05FX1BSRUQ7CisgICAgICAgIFBSRURTWzZdID0gTUFKT1JJVFlfUFJFRDsKKyAgICAgICAgUFJFRFNbN10gPSBNQUpPUklUWV9QUkVEOworICAgICAgICBQUkVEU1s4XSA9IE5PTkVfUFJFRDsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFF1YW50aWZpZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFF1YW50aWZpZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgRW51bWVyYXRlZEF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVhbnRpZmllcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9zc2libGUgdmFsdWVzLgorICAgICAqIEByZXR1cm4gU3RyaW5nW10gb2YgRW51bWVyYXRlZEF0dHJpYnV0ZSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIFZBTFVFUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSBhIDxjb2RlPmJvb2xlYW48Y29kZT4gYXJyYXkuCisgICAgICogQHBhcmFtIGIgdGhlIDxjb2RlPmJvb2xlYW5bXTwvY29kZT4gdG8gZXZhbHVhdGUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBmZWxsIHdpdGhpbiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIFF1YW50aWZpZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoYm9vbGVhbltdIGIpIHsKKyAgICAgICAgaW50IHQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChiW2ldKSB7CisgICAgICAgICAgICAgICAgdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBldmFsdWF0ZSh0LCBiLmxlbmd0aCAtIHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlIGludGVnZXIgPGNvZGU+dHJ1ZTwvY29kZT4gdnMuIDxjb2RlPmZhbHNlPC9jb2RlPiBjb3VudHMuCisgICAgICogQHBhcmFtIHQgdGhlIG51bWJlciBvZiA8Y29kZT50cnVlPC9jb2RlPiB2YWx1ZXMuCisgICAgICogQHBhcmFtIGYgdGhlIG51bWJlciBvZiA8Y29kZT5mYWxzZTwvY29kZT4gdmFsdWVzLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnRzIGZlbGwgd2l0aGluIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgUXVhbnRpZmllci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShpbnQgdCwgaW50IGYpIHsKKyAgICAgICAgaW50IGluZGV4ID0gZ2V0SW5kZXgoKTsKKyAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlF1YW50aWZpZXIgdmFsdWUgbm90IHNldC4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUFJFRFNbaW5kZXhdLmV2YWwodCwgZik7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1JlZGlyZWN0b3JFbGVtZW50LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWRpcmVjdG9yRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMzc1NTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWRpcmVjdG9yRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZWRpcmVjdG9yOworCisvKioKKyAqIEVsZW1lbnQgcmVwcmVzZW50YXRpb24gb2YgYSA8Y29kZT5SZWRpcmVjdG9yPC9jb2RlPi4KKyAqIEBzaW5jZSBBbnQgMS42LjIKKyAqLworcHVibGljIGNsYXNzIFJlZGlyZWN0b3JFbGVtZW50IGV4dGVuZHMgRGF0YVR5cGUgeworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgaW5wdXQgbWFwcGVyIHdhcyBzZXQgdmlhIDxjb2RlPnNldE91dHB1dDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVzaW5nSW5wdXQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIG91dHB1dCBtYXBwZXIgd2FzIHNldCB2aWEgPGNvZGU+c2V0T3V0cHV0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdXNpbmdPdXRwdXQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGVycm9yIG1hcHBlciB3YXMgc2V0IHZpYSA8Y29kZT5zZXRFcnJvcjwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVzaW5nRXJyb3IgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiBzdGFuZGFyZCBlcnJvciBzaG91bGQgYmUgbG9nZ2VkIHRvIEFudCdzIGxvZyBzeXN0ZW0KKyAgICAgKiByYXRoZXIgdGhhbiB0aGUgb3V0cHV0LiBUaGlzIGhhcyBubyBlZmZlY3QgaWYgc3RhbmRhcmQgZXJyb3IgaXMKKyAgICAgKiByZWRpcmVjdGVkIHRvIGEgZmlsZSBvciBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJvb2xlYW4gbG9nRXJyb3I7CisKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGludG8gd2hpY2ggb3V0cHV0IGlzIHRvIGJlIHN0b3JlZCAqLworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dFByb3BlcnR5OworCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbnRvIHdoaWNoIGVycm9yIG91dHB1dCBpcyB0byBiZSBzdG9yZWQgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlcnJvclByb3BlcnR5OworCisgICAgLyoqIFN0cmluZyBmcm9tIHdoaWNoIGlucHV0IGlzIHRha2VuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5wdXRTdHJpbmc7CisKKyAgICAvKiogRmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgZXJyb3IgYW5kIG91dHB1dCBmaWxlcyBhcmUgdG8gYmUgYXBwZW5kZWQuICovCisgICAgcHJpdmF0ZSBCb29sZWFuIGFwcGVuZDsKKworICAgIC8qKiBGbGFnIHdoaWNoIGluZGljYXRlcyB0aGF0IG91dHB1dCBzaG91bGQgYmUgYWx3YXlzIHNlbnQgdG8gdGhlIGxvZyAqLworICAgIHByaXZhdGUgQm9vbGVhbiBhbHdheXNMb2c7CisKKyAgICAvKiogRmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBmaWxlcyBzaG91bGQgYmUgY3JlYXRlZCBldmVuIGlmIGVtcHR5LiAqLworICAgIHByaXZhdGUgQm9vbGVhbiBjcmVhdGVFbXB0eUZpbGVzOworCisgICAgLyoqIElucHV0IGZpbGUgbWFwcGVyLiAqLworICAgIHByaXZhdGUgTWFwcGVyIGlucHV0TWFwcGVyOworCisgICAgLyoqIE91dHB1dCBmaWxlIG1hcHBlci4gKi8KKyAgICBwcml2YXRlIE1hcHBlciBvdXRwdXRNYXBwZXI7CisKKyAgICAvKiogRXJyb3IgZmlsZSBtYXBwZXIuICovCisgICAgcHJpdmF0ZSBNYXBwZXIgZXJyb3JNYXBwZXI7CisKKyAgICAvKiogaW5wdXQgZmlsdGVyIGNoYWlucy4gKi8KKyAgICBwcml2YXRlIFZlY3RvciBpbnB1dEZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKiBvdXRwdXQgZmlsdGVyIGNoYWlucy4gKi8KKyAgICBwcml2YXRlIFZlY3RvciBvdXRwdXRGaWx0ZXJDaGFpbnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKiogZXJyb3IgZmlsdGVyIGNoYWlucy4gKi8KKyAgICBwcml2YXRlIFZlY3RvciBlcnJvckZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKiBUaGUgb3V0cHV0IGVuY29kaW5nICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RW5jb2Rpbmc7CisKKyAgICAvKiogVGhlIGVycm9yIGVuY29kaW5nICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JFbmNvZGluZzsKKworICAgIC8qKiBUaGUgaW5wdXQgZW5jb2RpbmcgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbnB1dEVuY29kaW5nOworCisgICAgLyoqIHdoZXRoZXIgdG8gbG9nIHRoZSBpbnB1dHN0cmluZyAqLworICAgIHByaXZhdGUgQm9vbGVhbiBsb2dJbnB1dFN0cmluZzsKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgaW5wdXQgZmlsZSBtYXBwZXIuCisgICAgICogQHBhcmFtIGlucHV0TWFwcGVyICAgPGNvZGU+TWFwcGVyPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkSW5wdXRNYXBwZXIoTWFwcGVyIGlucHV0TWFwcGVyKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmlucHV0TWFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh1c2luZ0lucHV0KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJhdHRyaWJ1dGUgXCJpbnB1dFwiIgorICAgICAgICAgICAgICAgICAgICArICIgY2Fubm90IGNvZXhpc3Qgd2l0aCBhIG5lc3RlZCA8aW5wdXRtYXBwZXI+Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGhhdmUgPiAxIDxpbnB1dG1hcHBlcj4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLmlucHV0TWFwcGVyID0gaW5wdXRNYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBvdXRwdXQgZmlsZSBtYXBwZXIuCisgICAgICogQHBhcmFtIG91dHB1dE1hcHBlciAgIDxjb2RlPk1hcHBlcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZE91dHB1dE1hcHBlcihNYXBwZXIgb3V0cHV0TWFwcGVyKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLm91dHB1dE1hcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodXNpbmdPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImF0dHJpYnV0ZSBcIm91dHB1dFwiIgorICAgICAgICAgICAgICAgICAgICArICIgY2Fubm90IGNvZXhpc3Qgd2l0aCBhIG5lc3RlZCA8b3V0cHV0bWFwcGVyPiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBoYXZlID4gMSA8b3V0cHV0bWFwcGVyPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMub3V0cHV0TWFwcGVyID0gb3V0cHV0TWFwcGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZXJyb3IgZmlsZSBtYXBwZXIuCisgICAgICogQHBhcmFtIGVycm9yTWFwcGVyICAgPGNvZGU+TWFwcGVyPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkRXJyb3JNYXBwZXIoTWFwcGVyIGVycm9yTWFwcGVyKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmVycm9yTWFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh1c2luZ0Vycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJhdHRyaWJ1dGUgXCJlcnJvclwiIgorICAgICAgICAgICAgICAgICAgICArICIgY2Fubm90IGNvZXhpc3Qgd2l0aCBhIG5lc3RlZCA8ZXJyb3JtYXBwZXI+Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGhhdmUgPiAxIDxlcnJvcm1hcHBlcj4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLmVycm9yTWFwcGVyID0gZXJyb3JNYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSB0aGlzIGluc3RhbmNlIGluIGVmZmVjdCBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGluc3RhbmNlLgorICAgICAqCisgICAgICogPHA+WW91IG11c3Qgbm90IHNldCBhbm90aGVyIGF0dHJpYnV0ZSBvciBuZXN0IGVsZW1lbnRzIGluc2lkZQorICAgICAqIHRoaXMgZWxlbWVudCBpZiB5b3UgbWFrZSBpdCBhIHJlZmVyZW5jZS48L3A+CisgICAgICogQHBhcmFtIHIgdGhlIHJlZmVyZW5jZSB0byB1c2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVzaW5nSW5wdXQKKyAgICAgICAgICAgIHx8IHVzaW5nT3V0cHV0CisgICAgICAgICAgICB8fCB1c2luZ0Vycm9yCisgICAgICAgICAgICB8fCBpbnB1dFN0cmluZyAhPSBudWxsCisgICAgICAgICAgICB8fCBsb2dFcnJvciAhPSBudWxsCisgICAgICAgICAgICB8fCBhcHBlbmQgIT0gbnVsbAorICAgICAgICAgICAgfHwgY3JlYXRlRW1wdHlGaWxlcyAhPSBudWxsCisgICAgICAgICAgICB8fCBpbnB1dEVuY29kaW5nICE9IG51bGwKKyAgICAgICAgICAgIHx8IG91dHB1dEVuY29kaW5nICE9IG51bGwKKyAgICAgICAgICAgIHx8IGVycm9yRW5jb2RpbmcgIT0gbnVsbAorICAgICAgICAgICAgfHwgb3V0cHV0UHJvcGVydHkgIT0gbnVsbAorICAgICAgICAgICAgfHwgZXJyb3JQcm9wZXJ0eSAhPSBudWxsCisgICAgICAgICAgICB8fCBsb2dJbnB1dFN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW5wdXQgdG8gdXNlIGZvciB0aGUgdGFzay4KKyAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGZpbGUgZnJvbSB3aGljaCBpbnB1dCBpcyByZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0KEZpbGUgaW5wdXQpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIFwiaW5wdXRcIiBhbmQgXCJpbnB1dHN0cmluZ1wiICIKKyAgICAgICAgICAgICAgICArICJhdHRyaWJ1dGVzIGNhbm5vdCBib3RoIGJlIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIHVzaW5nSW5wdXQgPSB0cnVlOworICAgICAgICBpbnB1dE1hcHBlciA9IGNyZWF0ZU1lcmdlTWFwcGVyKGlucHV0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0cmluZyB0byB1c2UgYXMgaW5wdXQKKyAgICAgKiBAcGFyYW0gaW5wdXRTdHJpbmcgdGhlIHN0cmluZyB3aGljaCBpcyB1c2VkIGFzIHRoZSBpbnB1dCBzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dFN0cmluZyhTdHJpbmcgaW5wdXRTdHJpbmcpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzaW5nSW5wdXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIFwiaW5wdXRcIiBhbmQgXCJpbnB1dHN0cmluZ1wiICIKKyAgICAgICAgICAgICAgICArICJhdHRyaWJ1dGVzIGNhbm5vdCBib3RoIGJlIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuaW5wdXRTdHJpbmcgPSBpbnB1dFN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBpbmNsdWRlIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgc3RyaW5nIGluIGxvZyBtZXNzYWdlcy4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqIEBwYXJhbSBsb2dJbnB1dFN0cmluZyB0cnVlIG9yIGZhbHNlLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9nSW5wdXRTdHJpbmcoYm9vbGVhbiBsb2dJbnB1dFN0cmluZykgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmxvZ0lucHV0U3RyaW5nID0gbG9nSW5wdXRTdHJpbmcgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLiBJZiBlcnJvciBpcyBub3QKKyAgICAgKiByZWRpcmVjdGVkLCBpdCB0b28gd2lsbCBhcHBlYXIgaW4gdGhlIG91dHB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgdGhlIGZpbGUgdG8gd2hpY2ggb3V0cHV0IHN0cmVhbSBpcyB3cml0dGVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChGaWxlIG91dCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm91dHB1dCBmaWxlIHNwZWNpZmllZCBhcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgdXNpbmdPdXRwdXQgPSB0cnVlOworICAgICAgICBvdXRwdXRNYXBwZXIgPSBjcmVhdGVNZXJnZU1hcHBlcihvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0IGVuY29kaW5nLgorICAgICAqIEBwYXJhbSBvdXRwdXRFbmNvZGluZyAgIDxjb2RlPlN0cmluZzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RW5jb2RpbmcoU3RyaW5nIG91dHB1dEVuY29kaW5nKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHRoaXMub3V0cHV0RW5jb2RpbmcgPSBvdXRwdXRFbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVycm9yIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yRW5jb2RpbmcgICA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yRW5jb2RpbmcoU3RyaW5nIGVycm9yRW5jb2RpbmcpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5lcnJvckVuY29kaW5nID0gZXJyb3JFbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGlucHV0IGVuY29kaW5nLgorICAgICAqIEBwYXJhbSBpbnB1dEVuY29kaW5nICAgPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dEVuY29kaW5nKFN0cmluZyBpbnB1dEVuY29kaW5nKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHRoaXMuaW5wdXRFbmNvZGluZyA9IGlucHV0RW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciBlcnJvciBvdXRwdXQgb2YgZXhlYyBpcyBsb2dnZWQuIFRoaXMgaXMgb25seSB1c2VmdWwKKyAgICAgKiB3aGVuIG91dHB1dCBpcyBiZWluZyByZWRpcmVjdGVkIGFuZCBlcnJvciBvdXRwdXQgaXMgZGVzaXJlZCBpbiB0aGUKKyAgICAgKiBBbnQgbG9nLgorICAgICAqIEBwYXJhbSBsb2dFcnJvciBpZiB0cnVlIHRoZSBzdGFuZGFyZCBlcnJvciBpcyBzZW50IHRvIHRoZSBBbnQgbG9nIHN5c3RlbQorICAgICAqICAgICAgICBhbmQgbm90IHNlbnQgdG8gb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvZ0Vycm9yKGJvb2xlYW4gbG9nRXJyb3IpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5sb2dFcnJvciA9ICgobG9nRXJyb3IpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmaWxlIHRvIHdoaWNoIHN0YW5kYXJkIGVycm9yIGlzIHRvIGJlIHJlZGlyZWN0ZWQuCisgICAgICogQHBhcmFtIGVycm9yIHRoZSBmaWxlIHRvIHdoaWNoIGVycm9yIGlzIHRvIGJlIHdyaXR0ZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3IoRmlsZSBlcnJvcikgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXJyb3IgZmlsZSBzcGVjaWZpZWQgYXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHVzaW5nRXJyb3IgPSB0cnVlOworICAgICAgICBlcnJvck1hcHBlciA9IGNyZWF0ZU1lcmdlTWFwcGVyKGVycm9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSBuYW1lIHdob3NlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gdGhlIG91dHB1dCBvZgorICAgICAqIHRoZSBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBvdXRwdXRQcm9wZXJ0eSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2V0IHdpdGggdGhlCisgICAgICogICAgICAgIHRhc2sncyBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0UHJvcGVydHkoU3RyaW5nIG91dHB1dFByb3BlcnR5KSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHRoaXMub3V0cHV0UHJvcGVydHkgPSBvdXRwdXRQcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuCisgICAgICogRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICogQHBhcmFtIGFwcGVuZCBpZiB0cnVlIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtcyBhcmUgYXBwZW5kZWQgdG8gdGhlaXIKKyAgICAgKiAgICAgICAgcmVzcGVjdGl2ZSBmaWxlcywgaWYgc3BlY2lmaWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcGVuZChib29sZWFuIGFwcGVuZCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmFwcGVuZCA9ICgoYXBwZW5kKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIChlcnJvciBhbmQgbm9uLWVycm9yKSBvdXRwdXQgd2lsbCBiZSAidGVlZCIsIHJlZGlyZWN0ZWQKKyAgICAgKiBhcyBzcGVjaWZpZWQgd2hpbGUgYmVpbmcgc2VudCB0byBBbnQncyBsb2dnaW5nIG1lY2hhbmlzbSBhcyBpZiBubworICAgICAqIHJlZGlyZWN0aW9uIGhhZCB0YWtlbiBwbGFjZS4gIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqIEBwYXJhbSBhbHdheXNMb2cgPGNvZGU+Ym9vbGVhbjwvY29kZT4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWx3YXlzTG9nKGJvb2xlYW4gYWx3YXlzTG9nKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHRoaXMuYWx3YXlzTG9nID0gKChhbHdheXNMb2cpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciBvdXRwdXQgYW5kIGVycm9yIGZpbGVzIHNob3VsZCBiZSBjcmVhdGVkIGV2ZW4gd2hlbiBlbXB0eS4KKyAgICAgKiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqIEBwYXJhbSBjcmVhdGVFbXB0eUZpbGVzIDxjb2RlPmJvb2xlYW48L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZUVtcHR5RmlsZXMoYm9vbGVhbiBjcmVhdGVFbXB0eUZpbGVzKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY3JlYXRlRW1wdHlGaWxlcyA9ICgoY3JlYXRlRW1wdHlGaWxlcykKKyAgICAgICAgICAgID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvcGVydHkgbmFtZSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBlcnJvciBvZgorICAgICAqIHRoZSBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBlcnJvclByb3BlcnR5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZXQKKyAgICAgKiAgICAgICAgd2l0aCB0aGUgZXJyb3Igb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJvcGVydHkoU3RyaW5nIGVycm9yUHJvcGVydHkpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5lcnJvclByb3BlcnR5ID0gZXJyb3JQcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXN0ZWQgaW5wdXQgPGNvZGU+RmlsdGVyQ2hhaW48L2NvZGU+LgorICAgICAqIEByZXR1cm4gPGNvZGU+RmlsdGVyQ2hhaW48L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJDaGFpbiBjcmVhdGVJbnB1dEZpbHRlckNoYWluKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBGaWx0ZXJDaGFpbiByZXN1bHQgPSBuZXcgRmlsdGVyQ2hhaW4oKTsKKyAgICAgICAgcmVzdWx0LnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaW5wdXRGaWx0ZXJDaGFpbnMuYWRkKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmVzdGVkIG91dHB1dCA8Y29kZT5GaWx0ZXJDaGFpbjwvY29kZT4uCisgICAgICogQHJldHVybiA8Y29kZT5GaWx0ZXJDaGFpbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEZpbHRlckNoYWluIGNyZWF0ZU91dHB1dEZpbHRlckNoYWluKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBGaWx0ZXJDaGFpbiByZXN1bHQgPSBuZXcgRmlsdGVyQ2hhaW4oKTsKKyAgICAgICAgcmVzdWx0LnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgb3V0cHV0RmlsdGVyQ2hhaW5zLmFkZChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5lc3RlZCBlcnJvciA8Y29kZT5GaWx0ZXJDaGFpbjwvY29kZT4uCisgICAgICogQHJldHVybiA8Y29kZT5GaWx0ZXJDaGFpbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEZpbHRlckNoYWluIGNyZWF0ZUVycm9yRmlsdGVyQ2hhaW4oKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIEZpbHRlckNoYWluIHJlc3VsdCA9IG5ldyBGaWx0ZXJDaGFpbigpOworICAgICAgICByZXN1bHQuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICBlcnJvckZpbHRlckNoYWlucy5hZGQocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIHNwZWNpZmllZCA8Y29kZT5SZWRpcmVjdG9yPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gcmVkaXJlY3RvciAgIDxjb2RlPlJlZGlyZWN0b3I8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShSZWRpcmVjdG9yIHJlZGlyZWN0b3IpIHsKKyAgICAgICAgY29uZmlndXJlKHJlZGlyZWN0b3IsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSB0aGUgc3BlY2lmaWVkIDxjb2RlPlJlZGlyZWN0b3I8L2NvZGU+CisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgc291cmNlZmlsZS4KKyAgICAgKiBAcGFyYW0gcmVkaXJlY3RvciAgIDxjb2RlPlJlZGlyZWN0b3I8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzb3VyY2VmaWxlICAgPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUmVkaXJlY3RvciByZWRpcmVjdG9yLCBTdHJpbmcgc291cmNlZmlsZSkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgZ2V0UmVmKCkuY29uZmlndXJlKHJlZGlyZWN0b3IsIHNvdXJjZWZpbGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhbHdheXNMb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRBbHdheXNMb2coYWx3YXlzTG9nLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9nRXJyb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRMb2dFcnJvcihsb2dFcnJvci5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcGVuZCAhPSBudWxsKSB7CisgICAgICAgICAgICByZWRpcmVjdG9yLnNldEFwcGVuZChhcHBlbmQuYm9vbGVhblZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjcmVhdGVFbXB0eUZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0Q3JlYXRlRW1wdHlGaWxlcyhjcmVhdGVFbXB0eUZpbGVzLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0cHV0UHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRPdXRwdXRQcm9wZXJ0eShvdXRwdXRQcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9yUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRFcnJvclByb3BlcnR5KGVycm9yUHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dFN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICByZWRpcmVjdG9yLnNldElucHV0U3RyaW5nKGlucHV0U3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9nSW5wdXRTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRMb2dJbnB1dFN0cmluZyhsb2dJbnB1dFN0cmluZy5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0TWFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGlucHV0VGFyZ2V0cyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlucHV0VGFyZ2V0cyA9CisgICAgICAgICAgICAgICAgICAgIGlucHV0TWFwcGVyLmdldEltcGxlbWVudGF0aW9uKCkubWFwRmlsZU5hbWUoc291cmNlZmlsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlblBlYUV4KSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZWZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlblBlYUV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnB1dFRhcmdldHMgIT0gbnVsbCAmJiBpbnB1dFRhcmdldHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0SW5wdXQodG9GaWxlQXJyYXkoaW5wdXRUYXJnZXRzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dHB1dE1hcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBvdXRwdXRUYXJnZXRzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0cHV0VGFyZ2V0cyA9CisgICAgICAgICAgICAgICAgICAgIG91dHB1dE1hcHBlci5nZXRJbXBsZW1lbnRhdGlvbigpLm1hcEZpbGVOYW1lKHNvdXJjZWZpbGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZW5QZWFFeCkgeworICAgICAgICAgICAgICAgIGlmIChzb3VyY2VmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW5QZWFFeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0VGFyZ2V0cyAhPSBudWxsICYmIG91dHB1dFRhcmdldHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0T3V0cHV0KHRvRmlsZUFycmF5KG91dHB1dFRhcmdldHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3JNYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nW10gZXJyb3JUYXJnZXRzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZXJyb3JUYXJnZXRzID0KKyAgICAgICAgICAgICAgICAgICAgZXJyb3JNYXBwZXIuZ2V0SW1wbGVtZW50YXRpb24oKS5tYXBGaWxlTmFtZShzb3VyY2VmaWxlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGVuUGVhRXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGVuUGVhRXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm9yVGFyZ2V0cyAhPSBudWxsICYmIGVycm9yVGFyZ2V0cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRFcnJvcih0b0ZpbGVBcnJheShlcnJvclRhcmdldHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRGaWx0ZXJDaGFpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRJbnB1dEZpbHRlckNoYWlucyhpbnB1dEZpbHRlckNoYWlucyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dHB1dEZpbHRlckNoYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICByZWRpcmVjdG9yLnNldE91dHB1dEZpbHRlckNoYWlucyhvdXRwdXRGaWx0ZXJDaGFpbnMpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnJvckZpbHRlckNoYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICByZWRpcmVjdG9yLnNldEVycm9yRmlsdGVyQ2hhaW5zKGVycm9yRmlsdGVyQ2hhaW5zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRFbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICByZWRpcmVjdG9yLnNldElucHV0RW5jb2RpbmcoaW5wdXRFbmNvZGluZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dHB1dEVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0T3V0cHV0RW5jb2Rpbmcob3V0cHV0RW5jb2RpbmcpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnJvckVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0RXJyb3JFbmNvZGluZyhlcnJvckVuY29kaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG1lcmdlIG1hcHBlciBwb2ludGluZyB0byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICogQHBhcmFtIGRlc3RmaWxlICAgPGNvZGU+RmlsZTwvY29kZT4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPk1hcHBlcjwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcHBlciBjcmVhdGVNZXJnZU1hcHBlcihGaWxlIGRlc3RmaWxlKSB7CisgICAgICAgIE1hcHBlciByZXN1bHQgPSBuZXcgTWFwcGVyKGdldFByb2plY3QoKSk7CisgICAgICAgIHJlc3VsdC5zZXRDbGFzc25hbWUoCisgICAgICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLk1lcmdpbmdNYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmVzdWx0LnNldFRvKGRlc3RmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSA8Y29kZT5GaWxlW108L2NvZGU+IGZyb20gdGhlIHNwZWNpZmllZCBzZXQgb2YgZmlsZW5hbWVzLgorICAgICAqIEBwYXJhbSBuYW1lICAgPGNvZGU+U3RyaW5nW108L2NvZGU+CisgICAgICogQHJldHVybiA8Y29kZT5GaWxlW108L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlW10gdG9GaWxlQXJyYXkoU3RyaW5nW10gbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvL3JlbW92ZSBhbnkgbnVsbCBlbGVtZW50cworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QobmFtZS5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuYW1lW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUobmFtZVtpXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoRmlsZVtdKSAobGlzdC50b0FycmF5KG5ldyBGaWxlW2xpc3Quc2l6ZSgpXSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgdmVyc2lvbiBvZiBEYXRhVHlwZSB0byByZWN1cnNlIG9uIGFsbCBEYXRhVHlwZQorICAgICAqIGNoaWxkIGVsZW1lbnRzIHRoYXQgbWF5IGhhdmUgYmVlbiBhZGRlZC4KKyAgICAgKiBAcGFyYW0gc3RrIHRoZSBzdGFjayBvZiBkYXRhIHR5cGVzIHRvIHVzZSAocmVjdXJzaXZlbHkpLgorICAgICAqIEBwYXJhbSBwICAgdGhlIHByb2plY3QgdG8gdXNlIHRvIGRlcmVmZXJlbmNlIHRoZSByZWZlcmVuY2VzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjayBzdGssIFByb2plY3QgcCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLmRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1hcHBlcltdIG0gPSBuZXcgTWFwcGVyW10ge2lucHV0TWFwcGVyLCBvdXRwdXRNYXBwZXIsIGVycm9yTWFwcGVyfTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RrLnB1c2gobVtpXSk7CisgICAgICAgICAgICAgICAgICAgIG1baV0uZGllT25DaXJjdWxhclJlZmVyZW5jZShzdGssIHApOworICAgICAgICAgICAgICAgICAgICBzdGsucG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVmVjdG9yW10gdiA9IG5ldyBWZWN0b3JbXQorICAgICAgICAgICAgICAgIHtpbnB1dEZpbHRlckNoYWlucywgb3V0cHV0RmlsdGVyQ2hhaW5zLCBlcnJvckZpbHRlckNoYWluc307CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodltpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZmNpID0gdltpXS5pdGVyYXRvcigpOyBmY2kuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ2hhaW4gZmMgPSAoRmlsdGVyQ2hhaW4pIGZjaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGsucHVzaChmYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmYy5kaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHN0aywgcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGsucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDaGVja2VkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSB0aGUgY2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMsIHJldHVybmluZyB0aGUKKyAgICAgKiByZWZlcmVuY2VkIFJlZGlyZWN0b3JFbGVtZW50LgorICAgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgUmVkaXJlY3RvckVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBSZWRpcmVjdG9yRWxlbWVudCBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiAoUmVkaXJlY3RvckVsZW1lbnQpIGdldENoZWNrZWRSZWYoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1JlZmVyZW5jZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlOWIyNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1JlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIENsYXNzIHRvIGhvbGQgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBvYmplY3QgaW4gdGhlIHByb2plY3QuCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVmZXJlbmNlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHJlZmlkOworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcmVmZXJlbmNlLgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNy4KKyAgICAgKiAgICAgICAgICAgICBQbGVhc2UgdXNlIHtAbGluayBSZWZlcmVuY2UjUmVmZXJlbmNlKFByb2plY3QsU3RyaW5nKX0KKyAgICAgKiAgICAgICAgICAgICBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBSZWZlcmVuY2UoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIGEgbmFtZWQgSUQuCisgICAgICogQHBhcmFtIGlkIHRoZSBuYW1lIG9mIHRoaXMgcmVmZXJlbmNlCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgorICAgICAqICAgICAgICAgICAgIFBsZWFzZSB1c2Uge0BsaW5rIFJlZmVyZW5jZSNSZWZlcmVuY2UoUHJvamVjdCxTdHJpbmcpfQorICAgICAqICAgICAgICAgICAgIGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIFJlZmVyZW5jZShTdHJpbmcgaWQpIHsKKyAgICAgICAgc2V0UmVmSWQoaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBhIG5hbWVkIElEIGluIGEgcGFydGljdWxhciBwcm9qZWN0LgorICAgICAqIEBwYXJhbSBwIHRoZSBwcm9qZWN0IHRoaXMgcmVmZXJlbmNlIGlzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIEBwYXJhbSBpZCB0aGUgbmFtZSBvZiB0aGlzIHJlZmVyZW5jZQorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVmZXJlbmNlKFByb2plY3QgcCwgU3RyaW5nIGlkKSB7CisgICAgICAgIHNldFJlZklkKGlkKTsKKyAgICAgICAgc2V0UHJvamVjdChwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlZmVyZW5jZSBpZC4gU2hvdWxkIG5vdCBub3JtYWxseSBiZSBuZWNlc3Nhcnk7CisgICAgICogdXNlIHtAbGluayBSZWZlcmVuY2UjUmVmZXJlbmNlKFByb2plY3QsIFN0cmluZyl9LgorICAgICAqIEBwYXJhbSBpZCB0aGUgcmVmZXJlbmNlIGlkIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZklkKFN0cmluZyBpZCkgeworICAgICAgICByZWZpZCA9IGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVmZXJlbmNlIGlkIG9mIHRoaXMgcmVmZXJlbmNlLgorICAgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZSBpZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmSWQoKSB7CisgICAgICAgIHJldHVybiByZWZpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFzc29jaWF0ZWQgcHJvamVjdC4gU2hvdWxkIG5vdCBub3JtYWxseSBiZSBuZWNlc3Nhcnk7CisgICAgICogdXNlIHtAbGluayBSZWZlcmVuY2UjUmVmZXJlbmNlKFByb2plY3QsU3RyaW5nKX0uCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gdXNlCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwKSB7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhc3NvY2lhdGVkIHByb2plY3QsIGlmIGFueTsgbWF5IGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBwcm9qZWN0CisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgdGhlIHJlZmVyZW5jZSwgdXNpbmcgdGhlIGFzc29jaWF0ZWQgcHJvamVjdCBpZgorICAgICAqIGl0IHNldCwgb3RoZXJ3aXNlIHVzZSB0aGUgcGFzc2VkIGluIHByb2plY3QuCisgICAgICogQHBhcmFtIGZhbGxiYWNrIHRoZSBmYWxsYmFjayBwcm9qZWN0IHRvIHVzZSBpZiB0aGUgcHJvamVjdCBhdHRyaWJ1dGUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIGlzIG5vdCBzZXQuCisgICAgICogQHJldHVybiB0aGUgZGVyZWZlcmVuY2VkIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSByZWZlcmVuY2UgY2Fubm90IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZWRPYmplY3QoUHJvamVjdCBmYWxsYmFjaykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlZmlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcmVmZXJlbmNlIHNwZWNpZmllZCIpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IG8gPSBwcm9qZWN0ID09IG51bGwgPyBmYWxsYmFjay5nZXRSZWZlcmVuY2UocmVmaWQpIDogcHJvamVjdC5nZXRSZWZlcmVuY2UocmVmaWQpOworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlZmVyZW5jZSAiICsgcmVmaWQgKyAiIG5vdCBmb3VuZC4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHRoZSByZWZlcmVuY2UsIGxvb2tpbmcgaW4gdGhlIGFzc29jaWF0ZWQgcHJvamVjdC4KKyAgICAgKiBAc2VlIFByb2plY3QjZ2V0UmVmZXJlbmNlCisgICAgICogQHJldHVybiB0aGUgZGVyZWZlcmVuY2VkIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBwcm9qZWN0IGlzIG51bGwgb3IgdGhlIHJlZmVyZW5jZSBjYW5ub3QgYmUgZGVyZWZlcmVuY2VkCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlZE9iamVjdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcHJvamVjdCBzZXQgb24gcmVmZXJlbmNlIHRvICIgKyByZWZpZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFJlZmVyZW5jZWRPYmplY3QocHJvamVjdCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWd1bGFyRXhwcmVzc2lvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVndWxhckV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTA5MWRlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVndWxhckV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cEZhY3Rvcnk7CisKKy8qKgorICogQSByZWd1bGFyIGV4cHJlc3Npb24gZGF0YXR5cGUuICBLZWVwcyBhbiBpbnN0YW5jZSBvZiB0aGUKKyAqIGNvbXBpbGVkIGV4cHJlc3Npb24gZm9yIHNwZWVkIHB1cnBvc2VzLiAgVGhpcyBjb21waWxlZAorICogZXhwcmVzc2lvbiBpcyBsYXppbHkgZXZhbHVhdGVkIChpdCBpcyBjb21waWxlZCB0aGUgZmlyc3QKKyAqIHRpbWUgaXQgaXMgbmVlZGVkKS4gIFRoZSBzeW50YXggaXMgdGhlIGRlcGVuZGVudCBvbiB3aGljaAorICogcmVndWxhciBleHByZXNzaW9uIHR5cGUgeW91IGFyZSB1c2luZy4gIFRoZSBzeXN0ZW0gcHJvcGVydHkKKyAqICJhbnQucmVnZXhwLnJlZ2V4cGltcGwiIHdpbGwgYmUgdGhlIGNsYXNzbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24KKyAqIHRoYXQgd2lsbCBiZSB1c2VkLgorICoKKyAqIDxwcmU+CisgKiBGb3IgamRrICAmbHQ7PSAxLjMsIHRoZXJlIGFyZSB0d28gYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uczoKKyAqICAgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmFrYXJ0YU9yb1JlZ2V4cCAodGhlIGRlZmF1bHQpCisgKiAgICAgICAgQmFzZWQgb24gdGhlIGpha2FydGEtb3JvIHBhY2thZ2UKKyAqCisgKiAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLkpha2FydGFSZWdleHBSZWdleHAKKyAqICAgICAgICBCYXNlZCBvbiB0aGUgamFrYXJ0YS1yZWdleHAgcGFja2FnZQorICoKKyAqIEZvciBqZGsgJmd0Oz0gMS40IGFuIGFkZGl0aW9uYWwgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlOgorICogICBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KZGsxNFJlZ2V4cFJlZ2V4cAorICogICAgICAgIEJhc2VkIG9uIHRoZSBqZGsgMS40IGJ1aWx0IGluIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYWNrYWdlLgorICogPC9wcmU+CisgKgorICogPHByZT4KKyAqICAgJmx0O3JlZ2V4cCBbIFtpZD0iaWQiXSBwYXR0ZXJuPSJleHByZXNzaW9uIiB8IHJlZmlkPSJpZCIgXQorICogICAvJmd0OworICogPC9wcmU+CisgKgorICogQHNlZSBvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4LlBlcmw1Q29tcGlsZXIKKyAqIEBzZWUgb3JnLmFwYWNoZS5yZWdleHAuUkUKKyAqIEBzZWUgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4KKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cAorICoKKyAqIEBhbnQuZGF0YXR5cGUgbmFtZT0icmVnZXhwIgorICovCitwdWJsaWMgY2xhc3MgUmVndWxhckV4cHJlc3Npb24gZXh0ZW5kcyBEYXRhVHlwZSB7CisgICAgLyoqIE5hbWUgb2YgdGhpcyBkYXRhIHR5cGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1RZUEVfTkFNRSA9ICJyZWdleHAiOworICAgIHByaXZhdGUgYm9vbGVhbiBhbHJlYWR5SW5pdCA9IGZhbHNlOworCisgICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmYWN0b3J5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVnZXhwRmFjdG9yeSBGQUNUT1JZID0gbmV3IFJlZ2V4cEZhY3RvcnkoKTsKKworICAgIHByaXZhdGUgUmVnZXhwIHJlZ2V4cCA9IG51bGw7CisgICAgLy8gdGVtcG9yYXJ5IHZhcmlhYmxlCisgICAgcHJpdmF0ZSBTdHJpbmcgbXlQYXR0ZXJuOworICAgIHByaXZhdGUgYm9vbGVhbiBzZXRQYXR0ZXJuUGVuZGluZyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBSZWd1bGFyRXhwcmVzc2lvbigpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChQcm9qZWN0IHApIHsKKyAgICAgICAgaWYgKCFhbHJlYWR5SW5pdCkgeworICAgICAgICAgICAgdGhpcy5yZWdleHAgPSBGQUNUT1JZLm5ld1JlZ2V4cChwKTsKKyAgICAgICAgICAgIGFscmVhZHlJbml0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIHZvaWQgc2V0UGF0dGVybigpIHsKKyAgICAgICAgaWYgKHNldFBhdHRlcm5QZW5kaW5nKSB7CisgICAgICAgICAgICByZWdleHAuc2V0UGF0dGVybihteVBhdHRlcm4pOworICAgICAgICAgICAgc2V0UGF0dGVyblBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworICAgICAgICBpZiAocmVnZXhwID09IG51bGwpIHsKKyAgICAgICAgICAgIG15UGF0dGVybiA9IHBhdHRlcm47CisgICAgICAgICAgICBzZXRQYXR0ZXJuUGVuZGluZyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdleHAuc2V0UGF0dGVybihwYXR0ZXJuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioKKyAgICAgKiBHZXRzIHRoZSBwYXR0ZXJuIHN0cmluZyBmb3IgdGhpcyBSZWd1bGFyRXhwcmVzc2lvbiBpbiB0aGUKKyAgICAgKiBnaXZlbiBwcm9qZWN0LgorICAgICAqIEBwYXJhbSBwIHByb2plY3QKKyAgICAgKiBAcmV0dXJuIHBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oUHJvamVjdCBwKSB7CisgICAgICAgIGluaXQocCk7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKHApLmdldFBhdHRlcm4ocCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0UGF0dGVybigpOworICAgICAgICByZXR1cm4gcmVnZXhwLmdldFBhdHRlcm4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgUmVnZXhwIGNvbnRhaW5lZCBpbiB0aGlzCisgICAgICogQHBhcmFtIHAgIHByb2plY3QKKyAgICAgKiBAcmV0dXJuICAgUmVnZXhwIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlZ3VsYXJFeHByZXNzaW9uIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIFJlZ2V4cCBnZXRSZWdleHAoUHJvamVjdCBwKSB7CisgICAgICAgIGluaXQocCk7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKHApLmdldFJlZ2V4cChwKTsKKyAgICAgICAgfQorICAgICAgICBzZXRQYXR0ZXJuKCk7CisgICAgICAgIHJldHVybiB0aGlzLnJlZ2V4cDsKKyAgICB9CisKKyAgICAvKioqCisgICAgICogR2V0IHRoZSBSZWd1bGFyRXhwcmVzc2lvbiB0aGlzIHJlZmVyZW5jZSByZWZlcnMgdG8gaW4KKyAgICAgKiB0aGUgZ2l2ZW4gcHJvamVjdC4gIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIHRvbworICAgICAqIEBwYXJhbSBwIHByb2plY3QKKyAgICAgKiBAcmV0dXJuIHJlc29sdmVkIFJlZ3VsYXJFeHByZXNzaW9uIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIFJlZ3VsYXJFeHByZXNzaW9uIGdldFJlZihQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIChSZWd1bGFyRXhwcmVzc2lvbikgZ2V0Q2hlY2tlZFJlZihwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWFhNTdiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQyNCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKy8qKgorICogRGVzY3JpYmVzIGEgIkZpbGUtbGlrZSIgcmVzb3VyY2UgKEZpbGUsIFppcEVudHJ5LCBldGMuKS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgY2xhc3NlcyBuZWVkaW5nIHRvIHJlY29yZCBwYXRoCisgKiBhbmQgZGF0ZS90aW1lIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZSwgYSB6aXAgZW50cnkgb3Igc29tZSBzaW1pbGFyCisgKiByZXNvdXJjZSAoVVJMLCBhcmNoaXZlIGluIGEgdmVyc2lvbiBjb250cm9sIHJlcG9zaXRvcnksIC4uLikuCisgKgorICogQHNpbmNlIEFudCAxLjUuMgorICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuVG91Y2hhYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZSBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBDb21wYXJhYmxlLCBSZXNvdXJjZUNvbGxlY3Rpb24geworCisgICAgLyoqIENvbnN0YW50IHVua25vd24gc2l6ZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVTktOT1dOX1NJWkUgPSAtMTsKKworICAgIC8qKiBDb25zdGFudCB1bmtub3duIGRhdGV0aW1lIGZvciBnZXRMYXN0TW9kaWZpZWQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVU5LTk9XTl9EQVRFVElNRSA9IDBMOworCisgICAgLyoqIE1hZ2ljIG51bWJlciAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE1BR0lDID0gZ2V0TWFnaWNOdW1iZXIoIlJlc291cmNlIi5nZXRCeXRlcygpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVUxMX05BTUUgPSBnZXRNYWdpY051bWJlcigibnVsbCBuYW1lIi5nZXRCeXRlcygpKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhICJtYWdpYyBudW1iZXIiIGZvciB1c2UgaW4gaGFzaENvZGUgY2FsY3VsYXRpb25zLgorICAgICAqIEBwYXJhbSBzZWVkIGJ5dGVbXSB0byBzZWVkIHdpdGguCisgICAgICogQHJldHVybiBhIG1hZ2ljIG51bWJlciBhcyBpbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0TWFnaWNOdW1iZXIoYnl0ZVtdIHNlZWQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHNlZWQpLmludFZhbHVlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBCb29sZWFuIGV4aXN0cyA9IG51bGw7CisgICAgcHJpdmF0ZSBMb25nIGxhc3Rtb2RpZmllZCA9IG51bGw7CisgICAgcHJpdmF0ZSBCb29sZWFuIGRpcmVjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSBMb25nIHNpemUgPSBudWxsOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogT25seSBzZXRzIHRoZSBuYW1lLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIGR1bW15LCB1c2VkIGZvciBub3QgZXhpc3RpbmcgcmVzb3VyY2VzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHJlbGF0aXZlIHBhdGggb2YgdGhlIHJlc291cmNlLiAgRXhwZWN0cworICAgICAqICZxdW90Oy8mcXVvdDsgdG8gYmUgdXNlZCBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcyhuYW1lLCBmYWxzZSwgMCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUsIGxhc3Rtb2RpZmllZCBmbGFnLCBhbmQgZXhpc3RzIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4gIEV4cGVjdHMKKyAgICAgKiAmcXVvdDsvJnF1b3Q7IHRvIGJlIHVzZWQgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IuCisgICAgICogQHBhcmFtIGV4aXN0cyBpZiB0cnVlLCB0aGlzIHJlc291cmNlIGV4aXN0cy4KKyAgICAgKiBAcGFyYW0gbGFzdG1vZGlmaWVkIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoaXMgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlKFN0cmluZyBuYW1lLCBib29sZWFuIGV4aXN0cywgbG9uZyBsYXN0bW9kaWZpZWQpIHsKKyAgICAgICAgdGhpcyhuYW1lLCBleGlzdHMsIGxhc3Rtb2RpZmllZCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUsIGxhc3Rtb2RpZmllZCBmbGFnLCBleGlzdHMgZmxhZywgYW5kIGRpcmVjdG9yeSBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2UuICBFeHBlY3RzCisgICAgICogJnF1b3Q7LyZxdW90OyB0byBiZSB1c2VkIGFzIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorICAgICAqIEBwYXJhbSBleGlzdHMgaWYgdHJ1ZSB0aGUgcmVzb3VyY2UgZXhpc3RzCisgICAgICogQHBhcmFtIGxhc3Rtb2RpZmllZCB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gZGlyZWN0b3J5ICAgIGlmIHRydWUsIHRoaXMgcmVzb3VyY2UgaXMgYSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZXhpc3RzLCBsb25nIGxhc3Rtb2RpZmllZCwgYm9vbGVhbiBkaXJlY3RvcnkpIHsKKyAgICAgICAgdGhpcyhuYW1lLCBleGlzdHMsIGxhc3Rtb2RpZmllZCwgZGlyZWN0b3J5LCBVTktOT1dOX1NJWkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUsIGxhc3Rtb2RpZmllZCBmbGFnLCBleGlzdHMgZmxhZywgZGlyZWN0b3J5IGZsYWcsIGFuZCBzaXplLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2UuICBFeHBlY3RzCisgICAgICogJnF1b3Q7LyZxdW90OyB0byBiZSB1c2VkIGFzIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorICAgICAqIEBwYXJhbSBleGlzdHMgaWYgdHJ1ZSB0aGUgcmVzb3VyY2UgZXhpc3RzCisgICAgICogQHBhcmFtIGxhc3Rtb2RpZmllZCB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gZGlyZWN0b3J5ICAgIGlmIHRydWUsIHRoaXMgcmVzb3VyY2UgaXMgYSBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGlzIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBleGlzdHMsIGxvbmcgbGFzdG1vZGlmaWVkLCBib29sZWFuIGRpcmVjdG9yeSwgbG9uZyBzaXplKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldEV4aXN0cyhleGlzdHMpOworICAgICAgICBzZXRMYXN0TW9kaWZpZWQobGFzdG1vZGlmaWVkKTsKKyAgICAgICAgc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSk7CisgICAgICAgIHNldFNpemUoc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBhdHRyaWJ1dGUgd2lsbCBjb250YWluIHRoZSBwYXRoIG9mIGEgZmlsZSByZWxhdGl2ZSB0byB0aGUKKyAgICAgKiByb290IGRpcmVjdG9yeSBvZiBpdHMgZmlsZXNldCBvciB0aGUgcmVjb3JkZWQgcGF0aCBvZiBhIHppcAorICAgICAqIGVudHJ5LgorICAgICAqCisgICAgICogPHA+ZXhhbXBsZSBmb3IgYSBmaWxlIHdpdGggZnVsbHBhdGggL3Zhci9vcHQvYWRtL3Jlc291cmNlLnR4dAorICAgICAqIGluIGEgZmlsZSBzZXQgd2l0aCByb290IGRpciAvdmFyL29wdCBpdCB3aWxsIGJlCisgICAgICogYWRtL3Jlc291cmNlLnR4dC48L3A+CisgICAgICoKKyAgICAgKiA8cD4mcXVvdDsvJnF1b3Q7IHdpbGwgYmUgdXNlZCBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvci48L3A+CisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkgPyAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE5hbWUoKSA6IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHBhcmFtIG5hbWUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2UuICBFeHBlY3RzCisgICAgICogJnF1b3Q7LyZxdW90OyB0byBiZSB1c2VkIGFzIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBleGlzdHMgYXR0cmlidXRlIHRlbGxzIHdoZXRoZXIgYSByZXNvdXJjZSBleGlzdHMuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgZXhpc3RzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXhpc3RzKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNFeGlzdHMoKTsKKyAgICAgICAgfQorICAgICAgICAvL2RlZmF1bHQgdHJ1ZToKKyAgICAgICAgcmV0dXJuIGV4aXN0cyA9PSBudWxsIHx8IGV4aXN0cy5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGV4aXN0cyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGV4aXN0cyBpZiB0cnVlLCB0aGlzIHJlc291cmNlIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGlzdHMoYm9vbGVhbiBleGlzdHMpIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICB0aGlzLmV4aXN0cyA9IGV4aXN0cyA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbHMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSAwMS4wMS4xOTcwICh0aGUgImVwb2NoIikuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtb2RpZmljYXRpb24gdGltZSwgaWYgdGhhdCBpcyBtZWFuaW5nZnVsCisgICAgICogICAgICAgICAgICAoZS5nLiBmb3IgYSBmaWxlIHJlc291cmNlIHdoaWNoIGV4aXN0cyk7CisgICAgICogICAgICAgICAwIGlmIHRoZSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCwgdG8gbWlycm9yIHRoZSBiZWhhdmlvcgorICAgICAqICAgICAgICAgb2Yge0BsaW5rIGphdmEuaW8uRmlsZSNsYXN0TW9kaWZpZWR9OworICAgICAqICAgICAgICAgb3IgMCBpZiB0aGUgbm90aW9uIG9mIG1vZGlmaWNhdGlvbiB0aW1lIGlzIG1lYW5pbmdsZXNzIGZvciB0aGlzIGNsYXNzCisgICAgICogICAgICAgICAgIG9mIHJlc291cmNlIChlLmcuIGFuIGlubGluZSBzdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc0V4aXN0cygpIHx8IGxhc3Rtb2RpZmllZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9EQVRFVElNRTsKKyAgICAgICAgfQorICAgICAgICBsb25nIHJlc3VsdCA9IGxhc3Rtb2RpZmllZC5sb25nVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA8IFVOS05PV05fREFURVRJTUUgPyBVTktOT1dOX0RBVEVUSU1FIDogcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbGFzdCBtb2RpZmljYXRpb24gYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBsYXN0bW9kaWZpZWQgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSAwMS4wMS4xOTcwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIGxhc3Rtb2RpZmllZCkgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIHRoaXMubGFzdG1vZGlmaWVkID0gbmV3IExvbmcobGFzdG1vZGlmaWVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxscyBpZiB0aGUgcmVzb3VyY2UgaXMgYSBkaXJlY3RvcnkuCisgICAgICogQHJldHVybiBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgcmVzb3VyY2UgaXMgYSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5pc0RpcmVjdG9yeSgpOworICAgICAgICB9CisgICAgICAgIC8vZGVmYXVsdCBmYWxzZToKKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yeSAhPSBudWxsICYmIGRpcmVjdG9yeS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGRpcmVjdG9yeSBpZiB0cnVlLCB0aGlzIHJlc291cmNlIGlzIGEgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShib29sZWFuIGRpcmVjdG9yeSkgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5ID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNpemUgb2YgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSwgYXMgYSBsb25nLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGxvbmcgc2l6ZSkgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIHRoaXMuc2l6ZSA9IG5ldyBMb25nKHNpemUgPiBVTktOT1dOX1NJWkUgPyBzaXplIDogVU5LTk9XTl9TSVpFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplLCBhcyBhIGxvbmcsIDAgaWYgdGhlIFJlc291cmNlIGRvZXMgbm90IGV4aXN0IChmb3IKKyAgICAgKiAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBqYXZhLmlvLkZpbGUpLCBvciBVTktOT1dOX1NJWkUgaWYgbm90IGtub3duLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpc0V4aXN0cygpCisgICAgICAgICAgICA/IChzaXplICE9IG51bGwgPyBzaXplLmxvbmdWYWx1ZSgpIDogVU5LTk9XTl9TSVpFKQorICAgICAgICAgICAgOiAwTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9uZSB0aGlzIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gY29weSBvZiB0aGlzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZm9yIGEgUmVzb3VyY2UgY2F1Z2h0LiAiCisgICAgICAgICAgICAgICAgICAgICsgIkRlcml2ZWQgY2xhc3NlcyBtdXN0IHN1cHBvcnQgY2xvbmluZy4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlcyB0byBhIGNvbXBhcmlzb24gb2YgbmFtZXMuCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0by4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgUmVzb3VyY2UKKyAgICAgKiAgICAgICAgIGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIFJlc291cmNlLgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChDb21wYXJhYmxlKSBnZXRDaGVja2VkUmVmKCkpLmNvbXBhcmVUbyhvdGhlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBSZXNvdXJjZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbiBvbmx5IGJlIGNvbXBhcmVkIHdpdGggUmVzb3VyY2VzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuY29tcGFyZVRvKG90aGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCBiYXNpYyBSZXNvdXJjZSBlcXVhbGl0eS4KKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG9iamVjdCB0byBjaGVjayBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIE9iamVjdCBpcyBlcXVhbCB0byB0aGlzIFJlc291cmNlLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5lcXVhbHMob3RoZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdGhlci5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSAmJiBjb21wYXJlVG8ob3RoZXIpID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBoYXNoIGNvZGUgYXMgaW50LgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIE1BR0lDICogKG5hbWUgPT0gbnVsbCA/IE5VTExfTkFNRSA6IG5hbWUuaGFzaENvZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIElucHV0U3RyZWFtIGZvciB0aGUgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSBjb250YWluaW5nIHRoaXMgUmVzb3VyY2UncyBjb250ZW50LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdW5hYmxlIHRvIHByb3ZpZGUgdGhlIGNvbnRlbnQgb2YgdGhpcworICAgICAqICAgICAgICAgUmVzb3VyY2UgYXMgYSBzdHJlYW0uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBJbnB1dFN0cmVhbXMgYXJlIG5vdAorICAgICAqICAgICAgICAgc3VwcG9ydGVkIGZvciB0aGlzIFJlc291cmNlIHR5cGUuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gT3V0cHV0U3RyZWFtIGZvciB0aGUgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhbiBPdXRwdXRTdHJlYW0gdG8gd2hpY2ggY29udGVudCBjYW4gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBwcm92aWRlIHRoZSBjb250ZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIFJlc291cmNlIGFzIGEgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgT3V0cHV0U3RyZWFtcyBhcmUgbm90CisgICAgICogICAgICAgICBzdXBwb3J0ZWQgZm9yIHRoaXMgUmVzb3VyY2UgdHlwZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9mIFJlc291cmNlcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkgPyAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLml0ZXJhdG9yKCkKKyAgICAgICAgICAgIDogbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFkb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZS50aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgUmVzb3VyY2VDb2xsZWN0aW9uLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuc2l6ZSgpIDogMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgUmVzb3VyY2UgaXMgYSBGaWxlUmVzb3VyY2UuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgeworICAgICAgICAvL2RlZmF1bHQgZmFsc2U6CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpICYmICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNGaWxlc3lzdGVtT25seSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGlzIFJlc291cmNlIGZvcm1hdHRlZCBhcyBhIFN0cmluZy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG4gPSBnZXROYW1lKCk7CisgICAgICAgIHJldHVybiBuID09IG51bGwgPyAiKGFub255bW91cykiIDogbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBsb25nIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFJlc291cmNlLgorICAgICAqIFRoaXMgdHlwaWNhbGx5IHNob3VsZCBiZSB0aGUgdmFsdWUgb2YgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4KKyAgICAgKiBwcmVmaXhlZCBieSBhIHR5cGUgZGVzY3JpcHRpb24uCisgICAgICogQHJldHVybiB0aGlzIFJlc291cmNlIGZvcm1hdHRlZCBhcyBhIGxvbmcgU3RyaW5nLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b0xvbmdTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS50b0xvbmdTdHJpbmcoKQorICAgICAgICAgICAgOiBnZXREYXRhVHlwZU5hbWUoKSArICIgXCIiICsgdG9TdHJpbmcoKSArICciJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIGJhc2UgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVmZXJlbmNlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgeworICAgICAgICBpZiAobmFtZSAhPSBudWxsCisgICAgICAgICAgICB8fCBleGlzdHMgIT0gbnVsbAorICAgICAgICAgICAgfHwgbGFzdG1vZGlmaWVkICE9IG51bGwKKyAgICAgICAgICAgIHx8IGRpcmVjdG9yeSAhPSBudWxsCisgICAgICAgICAgICB8fCBzaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0UmVmaWQocik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUNvbGxlY3Rpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmZWY4OGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUNvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIEludGVyZmFjZSBkZXNjcmliaW5nIGEgY29sbGVjdGlvbiBvZiBSZXNvdXJjZXMuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlQ29sbGVjdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gSXRlcmF0b3Igb3ZlciB0aGUgY29udGVudHMgb2YgdGhpcyBSZXNvdXJjZUNvbGxlY3Rpb24sIHdob3NlIGVsZW1lbnRzCisgICAgICogYXJlIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlPC9jb2RlPiBpbnN0YW5jZXMuCisgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCisgICAgICovCisgICAgSXRlcmF0b3IgaXRlcmF0b3IoKTsKKworICAgIC8qKgorICAgICAqIExlYXJuIHRoZSBudW1iZXIgb2YgY29udGFpbmVkIFJlc291cmNlcy4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCisgICAgICovCisgICAgaW50IHNpemUoKTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgdGhpcyBSZXNvdXJjZUNvbGxlY3Rpb24gaXMgY29tcG9zZWQgZW50aXJlbHkgb2YKKyAgICAgKiBSZXNvdXJjZXMgYWNjZXNzaWJsZSB2aWEgbG9jYWwgZmlsZXN5c3RlbSBjb252ZW50aW9ucy4gIElmIHRydWUsCisgICAgICogYWxsIFJlc291cmNlcyByZXR1cm5lZCBmcm9tIHRoaXMgUmVzb3VyY2VDb2xsZWN0aW9uIHNob3VsZCBiZQorICAgICAqIGluc3RhbmNlcyBvZiBGaWxlUmVzb3VyY2UuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBmaWxlc3lzdGVtLW9ubHkgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2VGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTUzMThlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworLyoqCisgKiB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyAoU2Nhbm5lcnMpIG5lZWRpbmcKKyAqIHRvIGRlbGl2ZXIgaW5mb3JtYXRpb24gYWJvdXQgcmVzb3VyY2VzLgorICoKKyAqIEBzaW5jZSBBbnQgMS41LjIKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogUXVlcnkgYSByZXNvdXJjZSAoZmlsZSwgemlwZW50cnksIC4uLikgYnkgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgYWJvdXQgd2hpY2gKKyAgICAgKiBpbmZvcm1hdGlvbiBpcyBzb3VnaHQuICBFeHBlY3RzICZxdW90Oy8mcXVvdDsgdG8gYmUgdXNlZCBhcyB0aGUKKyAgICAgKiBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgUmVzb3VyY2U7IHRoZSBleGlzdHMgYXR0cmlidXRlIG9mIFJlc291cmNlCisgICAgICogd2lsbCB0ZWxsIHdoZXRoZXIgdGhlIHNvdWdodCByZXNvdXJjZSBleGlzdHMKKyAgICAgKi8KKyAgICBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUxvY2F0aW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUxvY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhNDRlYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlTG9jYXRpb24uamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiA8cD5IZWxwZXIgY2xhc3MgdG8gaGFuZGxlIHRoZSA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gYW5kCisgKiA8Y29kZT4mbHQ7ZW50aXR5Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnRzLiAgVGhlc2UgY29ycmVzcG9uZCB0bworICogdGhlIDxjb2RlPlBVQkxJQzwvY29kZT4gYW5kIDxjb2RlPlVSSTwvY29kZT4gY2F0YWxvZyBlbnRyeSB0eXBlcywKKyAqIHJlc3BlY3RpdmVseSwgYXMgZGVmaW5lZCBpbiB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly9vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+CisgKiBPQVNJUyAiT3BlbiBDYXRhbG9nIiBzdGFuZGFyZDwvYT4uPC9wPgorICoKKyAqIDxwPlBvc3NpYmxlIEZ1dHVyZSBFbmhhbmNlbWVudHM6CisgKiA8dWw+CisgKiA8bGk+QnJpbmcgdGhlIEFudCBlbGVtZW50IG5hbWVzIGludG8gY29uZm9ybWFuY2Ugd2l0aCB0aGUgT0FTSVMgc3RhbmRhcmQ8L2xpPgorICogPGxpPkFkZCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIE9BU0lTIGNhdGFsb2cgZW50cnkgdHlwZXM8L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2cKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUxvY2F0aW9uIHsKKworICAgIC8vLS0gRmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvKiogcHVibGljSWQgb2YgdGhlIGR0ZC9lbnRpdHkuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOworCisgICAgLyoqIGxvY2F0aW9uIG9mIHRoZSBkdGQvZW50aXR5IC0gYSBmaWxlL3Jlc291cmNlL1VSTC4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBiYXNlIFVSTCBvZiB0aGUgZHRkL2VudGl0eSwgb3IgbnVsbC4gSWYgbnVsbCwgdGhlIEFudCBwcm9qZWN0CisgICAgICogYmFzZWRpciBpcyBhc3N1bWVkLiAgSWYgdGhlIGxvY2F0aW9uIHNwZWNpZmllcyBhIHJlbGF0aXZlCisgICAgICogVVJML3BhdGhuYW1lLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgYmFzZS4gIFRoZSBkZWZhdWx0IGJhc2UKKyAgICAgKiBmb3IgYW4gZXh0ZXJuYWwgY2F0YWxvZyBmaWxlIGlzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggaXQgaXMKKyAgICAgKiBsb2NhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgVVJMIGJhc2UgPSBudWxsOworCisgICAgLy8tLSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHB1YmxpY0lkIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZCkgeworICAgICAgICB0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqICAgICAgcHVibGljSWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYmFzZSB0aGUgYmFzZSBVUkwgb2YgdGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBwdWJsaWNJZC4gIElmIHRoZSBsb2NhdGlvbiBzcGVjaWZpZXMgYSByZWxhdGl2ZSBVUkwvcGF0aG5hbWUsCisgICAgICogaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlIGJhc2UuICBUaGUgZGVmYXVsdCBiYXNlIGZvciBhbgorICAgICAqIGV4dGVybmFsIGNhdGFsb2cgZmlsZSBpcyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGlzIGxvY2F0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFzZShVUkwgYmFzZSkgeworICAgICAgICB0aGlzLmJhc2UgPSBiYXNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHB1YmxpY0lkIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgeworICAgICAgICByZXR1cm4gcHVibGljSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhlIHB1YmxpY0lkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7CisgICAgICAgIHJldHVybiBsb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBiYXNlIG9mIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoZSBwdWJsaWNJZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldEJhc2UoKSB7CisgICAgICAgIHJldHVybiBiYXNlOworICAgIH0KKworfSAvLy0tIFJlc291cmNlTG9jYXRpb24KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1N1YnN0aXR1dGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvU3Vic3RpdHV0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzZjRjNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1N1YnN0aXR1dGlvbi5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKioKKyAqIEEgcmVndWxhciBleHByZXNzaW9uIHN1YnN0aXR1dGlvbiBkYXRhdHlwZS4gIEl0IGlzIGFuIGV4cHJlc3Npb24KKyAqIHRoYXQgaXMgbWVhbnQgdG8gcmVwbGFjZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAqCisgKiA8cHJlPgorICogICAmbHQ7c3Vic3RpdHV0aW9uIFsgW2lkPSJpZCJdIGV4cHJlc3Npb249ImV4cHJlc3Npb24iIHwgcmVmaWQ9ImlkIiBdCisgKiAgIC8mZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGVybDVTdWJzdGl0dXRpb24KKyAqLworcHVibGljIGNsYXNzIFN1YnN0aXR1dGlvbiBleHRlbmRzIERhdGFUeXBlIHsKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhpcyBkYXRhIHR5cGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1RZUEVfTkFNRSA9ICJzdWJzdGl0dXRpb24iOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZXhwcmVzc2lvbjsKKworICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgU3Vic3RpdHV0aW9uLiAqLworICAgIHB1YmxpYyBTdWJzdGl0dXRpb24oKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXR0ZXJuIHN0cmluZyBmb3IgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gc3Vic3RpdHV0aW9uLgorICAgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgIH0KKworICAgIC8qKioKKyAgICAgKiBHZXRzIHRoZSBwYXR0ZXJuIHN0cmluZyBmb3IgdGhpcyBSZWd1bGFyRXhwcmVzc2lvbiBpbiB0aGUKKyAgICAgKiBnaXZlbiBwcm9qZWN0LgorICAgICAqIEBwYXJhbSBwIHRoZSBwcm9qZWN0IHRvIGxvb2sgZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaWYgdGhpcyBvYmplY3QgaXMKKyAgICAgKiAgICAgICAgICBhIHJlZmVyZW5jZQorICAgICAqIEByZXR1cm4gdGhlIHBhdHRlcm4gc3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uKFByb2plY3QgcCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXRFeHByZXNzaW9uKHApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgfQorCisgICAgLyoqKgorICAgICAqIEdldCB0aGUgUmVndWxhckV4cHJlc3Npb24gdGhpcyByZWZlcmVuY2UgcmVmZXJzIHRvIGluCisgICAgICogdGhlIGdpdmVuIHByb2plY3QuICBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyB0b28uCisgICAgICogQHBhcmFtIHAgdGhlIHByb2plY3QgdG8gbG9vayBmb3IgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiByZWZlcmVuY2UKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3Vic3RpdHV0aW9uIGdldFJlZihQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIChTdWJzdGl0dXRpb24pIGdldENoZWNrZWRSZWYocCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGFyRmlsZVNldC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGFyRmlsZVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkNjFhZTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UYXJGaWxlU2V0LmphdmEKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIEEgVGFyRmlsZVNldCBpcyBhIEZpbGVTZXQgd2l0aCBleHRyYSBhdHRyaWJ1dGVzIHVzZWZ1bCBpbiB0aGUgY29udGV4dCBvZgorICogVGFyL0phciB0YXNrcy4KKyAqCisgKiBBIFRhckZpbGVTZXQgZXh0ZW5kcyBGaWxlU2V0cyB3aXRoIHRoZSBhYmlsaXR5IHRvIGV4dHJhY3QgYSBzdWJzZXQgb2YgdGhlCisgKiBlbnRyaWVzIG9mIGEgVGFyIGZpbGUgZm9yIGluY2x1c2lvbiBpbiBhbm90aGVyIFRhciBmaWxlLiAgSXQgYWxzbyBpbmNsdWRlcworICogYSBwcmVmaXggYXR0cmlidXRlIHdoaWNoIGlzIHByZXBlbmRlZCB0byBlYWNoIGVudHJ5IGluIHRoZSBvdXRwdXQgVGFyIGZpbGUuCisgKgorICovCitwdWJsaWMgY2xhc3MgVGFyRmlsZVNldCBleHRlbmRzIEFyY2hpdmVGaWxlU2V0IHsKKworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VyTmFtZVNldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZ3JvdXBOYW1lU2V0OworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VySWRTZXQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGdyb3VwSWRTZXQ7CisKKyAgICBwcml2YXRlIFN0cmluZyB1c2VyTmFtZSA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwTmFtZSA9ICIiOworICAgIHByaXZhdGUgaW50ICAgIHVpZDsKKyAgICBwcml2YXRlIGludCAgICBnaWQ7CisKKyAgICAvKiogQ29uc3RydWN0b3IgZm9yIFRhckZpbGVTZXQgKi8KKyAgICBwdWJsaWMgVGFyRmlsZVNldCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhIGZpbGVzZXQgYXJndWVtZW50LgorICAgICAqIEBwYXJhbSBmaWxlc2V0IHRoZSBmaWxlc2V0IHRvIHVzZQorICAgICAqLworICAgIHByb3RlY3RlZCBUYXJGaWxlU2V0KEZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICBzdXBlcihmaWxlc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhIHRhcmZpbGVzZXQgYXJndWVtZW50LgorICAgICAqIEBwYXJhbSBmaWxlc2V0IHRoZSB0YXJmaWxlc2V0IHRvIHVzZQorICAgICAqLworICAgIHByb3RlY3RlZCBUYXJGaWxlU2V0KFRhckZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICBzdXBlcihmaWxlc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlcm5hbWUgZm9yIHRoZSB0YXIgZW50cnkKKyAgICAgKiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgVUlELgorICAgICAqIEBwYXJhbSB1c2VyTmFtZSB0aGUgdXNlciBuYW1lIGZvciB0aGUgdGFyIGVudHJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJOYW1lKFN0cmluZyB1c2VyTmFtZSkgeworICAgICAgICBjaGVja1RhckZpbGVTZXRBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICB1c2VyTmFtZVNldCA9IHRydWU7CisgICAgICAgIHRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VyIG5hbWUgZm9yIHRoZSB0YXIgZW50cnkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoVGFyRmlsZVNldCkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRVc2VyTmFtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1c2VyTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHVzZXIgbmFtZSBoYXMgYmVlbiBleHBsaWNpdGx5IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNVc2VyTmFtZUJlZW5TZXQoKSB7CisgICAgICAgIHJldHVybiB1c2VyTmFtZVNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdWlkIGZvciB0aGUgdGFyIGVudHJ5CisgICAgICogVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIFVzZXIgbmFtZS4KKyAgICAgKiBAcGFyYW0gdWlkIHRoZSBpZCBvZiB0aGUgdXNlciBmb3IgdGhlIHRhciBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVaWQoaW50IHVpZCkgeworICAgICAgICBjaGVja1RhckZpbGVTZXRBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICB1c2VySWRTZXQgPSB0cnVlOworICAgICAgICB0aGlzLnVpZCA9IHVpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1aWQgZm9yIHRoZSB0YXIgZW50cnkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFVpZCgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFRhckZpbGVTZXQpIGdldENoZWNrZWRSZWYoKSkuZ2V0VWlkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHVzZXIgaWQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzVXNlcklkQmVlblNldCgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJJZFNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ3JvdXBuYW1lIGZvciB0aGUgdGFyIGVudHJ5OyBvcHRpb25hbCwgZGVmYXVsdD0iIgorICAgICAqIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBHSUQuCisgICAgICogQHBhcmFtIGdyb3VwTmFtZSB0aGUgZ3JvdXAgbmFtZSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXAoU3RyaW5nIGdyb3VwTmFtZSkgeworICAgICAgICBjaGVja1RhckZpbGVTZXRBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICBncm91cE5hbWVTZXQgPSB0cnVlOworICAgICAgICB0aGlzLmdyb3VwTmFtZSA9IGdyb3VwTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBncm91cCBuYW1lIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoVGFyRmlsZVNldCkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRHcm91cCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBncm91cE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBncm91cCBuYW1lIGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0dyb3VwQmVlblNldCgpIHsKKyAgICAgICAgcmV0dXJuIGdyb3VwTmFtZVNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgR0lEIGZvciB0aGUgdGFyIGVudHJ5OyBvcHRpb25hbCwgZGVmYXVsdD0iMCIKKyAgICAgKiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZ3JvdXAgbmFtZS4KKyAgICAgKiBAcGFyYW0gZ2lkIHRoZSBncm91cCBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHaWQoaW50IGdpZCkgeworICAgICAgICBjaGVja1RhckZpbGVTZXRBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICBncm91cElkU2V0ID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5naWQgPSBnaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZ3JvdXAgaWRlbnRpZmllci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEdpZCgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFRhckZpbGVTZXQpIGdldENoZWNrZWRSZWYoKSkuZ2V0R2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdyb3VwIGlkIGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0dyb3VwSWRCZWVuU2V0KCkgeworICAgICAgICByZXR1cm4gZ3JvdXBJZFNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc2Nhbm5lci4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHNjYW5uZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFyY2hpdmVTY2FubmVyIG5ld0FyY2hpdmVTY2FubmVyKCkgeworICAgICAgICBUYXJTY2FubmVyIHpzID0gbmV3IFRhclNjYW5uZXIoKTsKKyAgICAgICAgcmV0dXJuIHpzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFub3RoZXIgYXR0cmlidXRlIG9yIG5lc3QgZWxlbWVudHMgaW5zaWRlCisgICAgICogdGhpcyBlbGVtZW50IGlmIHlvdSBtYWtlIGl0IGEgcmVmZXJlbmNlLjwvcD4KKyAgICAgKiBAcGFyYW0gciB0aGUgPGNvZGU+UmVmZXJlbmNlPC9jb2RlPiB0byB1c2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodXNlck5hbWVTZXQgfHwgdXNlcklkU2V0IHx8IGdyb3VwTmFtZVNldCB8fCBncm91cElkU2V0KSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgVGFyRmlsZXNldCBhY2NlcHRzIGFub3RoZXIgVGFyRmlsZVNldCBvciBhIEZpbGVTZXQgYXMgcmVmZXJlbmNlCisgICAgICogRmlsZVNldHMgYXJlIG9mdGVuIHVzZWQgYnkgdGhlIHdhciB0YXNrIGZvciB0aGUgbGliIGF0dHJpYnV0ZQorICAgICAqIEBwYXJhbSBwIHRoZSBwcm9qZWN0IHRvIHVzZQorICAgICAqIEByZXR1cm4gdGhlIGFic3RyYWN0IGZpbGVzZXQgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWxlU2V0IGdldFJlZihQcm9qZWN0IHApIHsKKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZShwKTsKKyAgICAgICAgT2JqZWN0IG8gPSBnZXRSZWZpZCgpLmdldFJlZmVyZW5jZWRPYmplY3QocCk7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFyRmlsZVNldCkgeworICAgICAgICAgICAgcmV0dXJuIChBYnN0cmFjdEZpbGVTZXQpIG87CisgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEZpbGVTZXQpIHsKKyAgICAgICAgICAgIFRhckZpbGVTZXQgemZzID0gbmV3IFRhckZpbGVTZXQoKEZpbGVTZXQpIG8pOworICAgICAgICAgICAgY29uZmlndXJlRmlsZVNldCh6ZnMpOworICAgICAgICAgICAgcmV0dXJuIHpmczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSBnZXRSZWZpZCgpLmdldFJlZklkKCkgKyAiIGRvZXNuXCd0IGRlbm90ZSBhIHRhcmZpbGVzZXQgb3IgYSBmaWxlc2V0IjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGEgZmlsZXNldCBiYXNlZCBvbiB0aGlzIGZpbGVzZXQuCisgICAgICogSWYgdGhlIGZpbGVzZXQgaXMgYSBUYXJGaWxlU2V0IGNvcHkgaW4gdGhlIHRhcmZpbGVzZXQKKyAgICAgKiBzcGVjaWZpYyBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSB6ZnMgdGhlIGFyY2hpdmUgZmlsZXNldCB0byBjb25maWd1cmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRmlsZVNldChBcmNoaXZlRmlsZVNldCB6ZnMpIHsKKyAgICAgICAgc3VwZXIuY29uZmlndXJlRmlsZVNldCh6ZnMpOworICAgICAgICBpZiAoemZzIGluc3RhbmNlb2YgVGFyRmlsZVNldCkgeworICAgICAgICAgICAgVGFyRmlsZVNldCB0ZnMgPSAoVGFyRmlsZVNldCkgemZzOworICAgICAgICAgICAgdGZzLnNldFVzZXJOYW1lKHVzZXJOYW1lKTsKKyAgICAgICAgICAgIHRmcy5zZXRHcm91cChncm91cE5hbWUpOworICAgICAgICAgICAgdGZzLnNldFVpZCh1aWQpOworICAgICAgICAgICAgdGZzLnNldEdpZChnaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgVGFyRmlsZVNldCB0aGF0IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzCisgICAgICogYXMgdGhpcyBvbmUuCisgICAgICogQHJldHVybiB0aGUgY2xvbmVkIHRhckZpbGVTZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoVGFyRmlsZVNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLmNsb25lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2hlY2sgYXR0cmlidXRlcyBmb3IgVGFyRmlsZVNldC4KKyAgICAgKiBJZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSwgYW5kCisgICAgICogaXQgaXMgYSBUYXJGaWxlU2V0LCB0aGUgdGFyIGZpbGVzZXQgYXR0cmlidXRlcworICAgICAqIGNhbm5vdCBiZSB1c2VkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1RhckZpbGVTZXRBdHRyaWJ1dGVzQWxsb3dlZCgpIHsKKyAgICAgICAgaWYgKGdldFByb2plY3QoKSA9PSBudWxsCisgICAgICAgICAgICB8fCAoaXNSZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgICYmIChnZXRSZWZpZCgpLmdldFJlZmVyZW5jZWRPYmplY3QoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkpCisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlb2YgVGFyRmlsZVNldCkpKSB7CisgICAgICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1RhclNjYW5uZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1RhclNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZWIwZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGFyU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5UYXJSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnRhci5UYXJFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnRhci5UYXJJbnB1dFN0cmVhbTsKKworLyoqCisgKiBTY2FucyB0YXIgYXJjaGl2ZXMgZm9yIHJlc291cmNlcy4KKyAqLworcHVibGljIGNsYXNzIFRhclNjYW5uZXIgZXh0ZW5kcyBBcmNoaXZlU2Nhbm5lciB7CisKKyAgICAvKioKKyAgICAgKiBGaWxscyB0aGUgZmlsZSBhbmQgZGlyZWN0b3J5IG1hcHMgd2l0aCByZXNvdXJjZXMgcmVhZCBmcm9tIHRoZQorICAgICAqIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBhcmNoaXZlIHRvIHNjYW4uCisgICAgICogQHBhcmFtIGVuY29kaW5nIGVuY29kaW5nIHVzZWQgdG8gZW5jb2RlIGZpbGUgbmFtZXMgaW5zaWRlIHRoZSBhcmNoaXZlLgorICAgICAqIEBwYXJhbSBmaWxlRW50cmllcyBNYXAgKG5hbWUgdG8gcmVzb3VyY2UpIG9mIG5vbi1kaXJlY3RvcnkKKyAgICAgKiByZXNvdXJjZXMgZm91bmQgaW5zaWRlIHRoZSBhcmNoaXZlLgorICAgICAqIEBwYXJhbSBtYXRjaEZpbGVFbnRyaWVzIE1hcCAobmFtZSB0byByZXNvdXJjZSkgb2Ygbm9uLWRpcmVjdG9yeQorICAgICAqIHJlc291cmNlcyBmb3VuZCBpbnNpZGUgdGhlIGFyY2hpdmUgdGhhdCBtYXRjaGVkIGFsbCBpbmNsdWRlCisgICAgICogcGF0dGVybnMgYW5kIGRpZG4ndCBtYXRjaCBhbnkgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKiBAcGFyYW0gZGlyRW50cmllcyBNYXAgKG5hbWUgdG8gcmVzb3VyY2UpIG9mIGRpcmVjdG9yeQorICAgICAqIHJlc291cmNlcyBmb3VuZCBpbnNpZGUgdGhlIGFyY2hpdmUuCisgICAgICogQHBhcmFtIG1hdGNoRGlyRW50cmllcyBNYXAgKG5hbWUgdG8gcmVzb3VyY2UpIG9mIGRpcmVjdG9yeQorICAgICAqIHJlc291cmNlcyBmb3VuZCBpbnNpZGUgdGhlIGFyY2hpdmUgdGhhdCBtYXRjaGVkIGFsbCBpbmNsdWRlCisgICAgICogcGF0dGVybnMgYW5kIGRpZG4ndCBtYXRjaCBhbnkgZXhjbHVkZSBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsTWFwc0Zyb21BcmNoaXZlKFJlc291cmNlIHNyYywgU3RyaW5nIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGZpbGVFbnRyaWVzLCBNYXAgbWF0Y2hGaWxlRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBkaXJFbnRyaWVzLCBNYXAgbWF0Y2hEaXJFbnRyaWVzKSB7CisgICAgICAgIFRhckVudHJ5IGVudHJ5ID0gbnVsbDsKKyAgICAgICAgVGFySW5wdXRTdHJlYW0gdGkgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRpID0gbmV3IFRhcklucHV0U3RyZWFtKHNyYy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwcm9ibGVtIG9wZW5pbmcgIiArIHNyY0ZpbGUsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB0aS5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFJlc291cmNlIHIgPSBuZXcgVGFyUmVzb3VyY2Uoc3JjLCBlbnRyeSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRyaW1TZXBhcmF0b3IobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGRpckVudHJpZXMucHV0KG5hbWUsIHIpOworICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRGlyRW50cmllcy5wdXQobmFtZSwgcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWxlRW50cmllcy5wdXQobmFtZSwgcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaChuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGaWxlRW50cmllcy5wdXQobmFtZSwgcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByb2JsZW0gcmVhZGluZyAiICsgc3JjRmlsZSwgZXgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHRpKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UaW1lQ29tcGFyaXNvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGltZUNvbXBhcmlzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNWMxMzZlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGltZUNvbXBhcmlzb24uamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIEVudW1lcmF0ZWRBdHRyaWJ1dGUgZm9yIHRpbWUgY29tcGFyaXNvbnMuICBBY2NlcHRzIHZhbHVlcworICogImJlZm9yZSIsICJhZnRlciIsICJlcXVhbCIuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgVGltZUNvbXBhcmlzb24gZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxVRVMKKyAgICAgICAgPSBuZXcgU3RyaW5nW10geyJiZWZvcmUiLCAiYWZ0ZXIiLCAiZXF1YWwifTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqIEJlZm9yZSBDb21wYXJpc29uLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZUNvbXBhcmlzb24gQkVGT1JFID0gbmV3IFRpbWVDb21wYXJpc29uKCJiZWZvcmUiKTsKKworICAgIC8qKiBBZnRlciBDb21wYXJpc29uLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZUNvbXBhcmlzb24gQUZURVIgPSBuZXcgVGltZUNvbXBhcmlzb24oImFmdGVyIik7CisKKyAgICAvKiogRXF1YWwgQ29tcGFyaXNvbi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRpbWVDb21wYXJpc29uIEVRVUFMID0gbmV3IFRpbWVDb21wYXJpc29uKCJlcXVhbCIpOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGltZUNvbXBhcmlzb24oKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFRpbWVDb21wYXJpc29uIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIEVudW1lcmF0ZWRBdHRyaWJ1dGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFRpbWVDb21wYXJpc29uKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwb3NzaWJsZSB2YWx1ZXMuCisgICAgICogQHJldHVybiBTdHJpbmdbXSBvZiBFbnVtZXJhdGVkQXR0cmlidXRlIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gVkFMVUVTOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlIHR3byB0aW1lcyBhZ2FpbnN0IHRoaXMgVGltZUNvbXBhcmlzb24uCisgICAgICogQHBhcmFtIHQxIHRoZSBmaXJzdCB0aW1lIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHQyIHRoZSBzZWNvbmQgdGltZSB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGFyaXNvbiByZXN1bHQgZmVsbCB3aXRoaW4gdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBUaW1lQ29tcGFyaXNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZShsb25nIHQxLCBsb25nIHQyKSB7CisgICAgICAgIHJldHVybiBldmFsdWF0ZSh0MSwgdDIsIEZJTEVfVVRJTFMuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlIHR3byB0aW1lcyBhZ2FpbnN0IHRoaXMgVGltZUNvbXBhcmlzb24uCisgICAgICogQHBhcmFtIHQxIHRoZSBmaXJzdCB0aW1lIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHQyIHRoZSBzZWNvbmQgdGltZSB0byBjb21wYXJlLgorICAgICAqIEBwYXJhbSBnIHRoZSB0aW1lc3RhbXAgZ3JhbnVsYXJpdHkuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wYXJpc29uIHJlc3VsdCBmZWxsIHdpdGhpbiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIFRpbWVDb21wYXJpc29uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKGxvbmcgdDEsIGxvbmcgdDIsIGxvbmcgZykgeworICAgICAgICBpbnQgY21wID0gZ2V0SW5kZXgoKTsKKyAgICAgICAgaWYgKGNtcCA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaW1lQ29tcGFyaXNvbiB2YWx1ZSBub3Qgc2V0LiIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbXAgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHQxIC0gZyA8IHQyOworICAgICAgICB9CisgICAgICAgIGlmIChjbXAgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHQxICsgZyA+IHQyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNYXRoLmFicyh0MSAtIHQyKSA8PSBnOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdHdvIHRpbWVzLgorICAgICAqIEBwYXJhbSB0MSB0aGUgZmlyc3QgdGltZSB0byBjb21wYXJlLgorICAgICAqIEBwYXJhbSB0MiB0aGUgc2Vjb25kIHRpbWUgdG8gY29tcGFyZS4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBvciB6ZXJvIGFzIHQxIGlzCisgICAgICogICAgICAgICBiZWZvcmUsIGFmdGVyLCBvciBlcXVhbCB0byB0MiBhY2NvdW50aW5nIGZvciB0aGUgZGVmYXVsdCBncmFudWxhcml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKGxvbmcgdDEsIGxvbmcgdDIpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmUodDEsIHQyLCBGSUxFX1VUSUxTLmdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byB0aW1lcy4KKyAgICAgKiBAcGFyYW0gdDEgdGhlIGZpcnN0IHRpbWUgdG8gY29tcGFyZS4KKyAgICAgKiBAcGFyYW0gdDIgdGhlIHNlY29uZCB0aW1lIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIGcgdGhlIHRpbWVzdGFtcCBncmFudWxhcml0eS4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBvciB6ZXJvIGFzIHQxIGlzCisgICAgICogICAgICAgICBiZWZvcmUsIGFmdGVyLCBvciBlcXVhbCB0byB0MiBhY2NvdW50aW5nIGZvciB0aGUgc3BlY2lmaWVkIGdyYW51bGFyaXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUobG9uZyB0MSwgbG9uZyB0MiwgbG9uZyBnKSB7CisgICAgICAgIGxvbmcgZGlmZiA9IHQxIC0gdDI7CisgICAgICAgIGxvbmcgYWJzID0gTWF0aC5hYnMoZGlmZik7CisgICAgICAgIHJldHVybiBhYnMgPiBNYXRoLmFicyhnKSA/IChpbnQpIChkaWZmIC8gYWJzKSA6IDA7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1hNTENhdGFsb2cuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1hNTENhdGFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjQxM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWE1MQ2F0YWxvZy5qYXZhCkBAIC0wLDAgKzEsMTEwNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KQVhQVXRpbHM7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKKworCisKKy8qKgorICogPHA+VGhpcyBkYXRhIHR5cGUgcHJvdmlkZXMgYSBjYXRhbG9nIG9mIHJlc291cmNlIGxvY2F0aW9ucyAoc3VjaCBhcworICogRFREcyBhbmQgWE1MIGVudGl0aWVzKSwgYmFzZWQgb24gdGhlIDxhCisgKiBocmVmPSJodHRwOi8vb2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvc3BlYy0yMDAxLTA4LTA2Lmh0bWwiPgorICogT0FTSVMgIk9wZW4gQ2F0YWxvZyIgc3RhbmRhcmQ8L2E+LiAgVGhlIGNhdGFsb2cgZW50cmllcyBhcmUgdXNlZAorICogYm90aCBmb3IgRW50aXR5IHJlc29sdXRpb24gYW5kIFVSSSByZXNvbHV0aW9uLCBpbiBhY2NvcmRhbmNlIHdpdGgKKyAqIHRoZSB7QGxpbmsgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgRW50aXR5UmVzb2x2ZXJ9IGFuZCB7QGxpbmsKKyAqIGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXIgVVJJUmVzb2x2ZXJ9IGludGVyZmFjZXMgYXMgZGVmaW5lZAorICogaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheHAiPkphdmEgQVBJIGZvciBYTUwKKyAqIFByb2Nlc3NpbmcgU3BlY2lmaWNhdGlvbjwvYT4uPC9wPgorICoKKyAqIDxwPlJlc291cmNlIGxvY2F0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBpbi1saW5lIG9yIGluCisgKiBleHRlcm5hbCBjYXRhbG9nIGZpbGUocyksIG9yIGJvdGguICBJbiBvcmRlciB0byB1c2UgYW4gZXh0ZXJuYWwKKyAqIGNhdGFsb2cgZmlsZSwgdGhlIHhtbC1jb21tb25zIHJlc29sdmVyIGxpYnJhcnkgKCJyZXNvbHZlci5qYXIiKQorICogbXVzdCBiZSBpbiB5b3VyIGNsYXNzcGF0aC4gIEV4dGVybmFsIGNhdGFsb2cgZmlsZXMgbWF5IGJlIGVpdGhlciA8YQorICogaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L2JhY2tncm91bmQvOTQwMS5odG1sIj4KKyAqIHBsYWluIHRleHQgZm9ybWF0PC9hPiBvciA8YQorICogaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+CisgKiBYTUwgZm9ybWF0PC9hPi4gIElmIHRoZSB4bWwtY29tbW9ucyByZXNvbHZlciBsaWJyYXJ5IGlzIG5vdCBmb3VuZAorICogaW4gdGhlIGNsYXNzcGF0aCwgZXh0ZXJuYWwgY2F0YWxvZyBmaWxlcywgc3BlY2lmaWVkIGluCisgKiA8Y29kZT4mbHQ7Y2F0YWxvZ3BhdGgmZ3Q7PC9jb2RlPiBwYXRocywgd2lsbCBiZSBpZ25vcmVkIGFuZCBhIHdhcm5pbmcgd2lsbAorICogYmUgbG9nZ2VkLiAgSW4gdGhpcyBjYXNlLCBob3dldmVyLCBwcm9jZXNzaW5nIG9mIGlubGluZSBlbnRyaWVzIHdpbGwgcHJvY2VlZAorICogbm9ybWFsbHkuPC9wPgorICoKKyAqIDxwPkN1cnJlbnRseSwgb25seSA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gYW5kCisgKiA8Y29kZT4mbHQ7ZW50aXR5Jmd0OzwvY29kZT4gZWxlbWVudHMgbWF5IGJlIHNwZWNpZmllZCBpbmxpbmU7IHRoZXNlCisgKiBjb3JyZXNwb25kIHRvIE9BU0lTIGNhdGFsb2cgZW50cnkgdHlwZXMgPGNvZGU+UFVCTElDPC9jb2RlPiBhbmQKKyAqIDxjb2RlPlVSSTwvY29kZT4gcmVzcGVjdGl2ZWx5LjwvcD4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIGlzIGEgdXNhZ2UgZXhhbXBsZTo8L3A+CisgKgorICogPGNvZGU+CisgKiAmbHQ7eG1sY2F0YWxvZyZndDs8YnI+CisgKiAmbmJzcDsmbmJzcDsmbHQ7ZHRkIHB1YmxpY0lkPSIiIGxvY2F0aW9uPSIvcGF0aC90by9maWxlLmphciIgLyZndDs8YnI+CisgKiAmbmJzcDsmbmJzcDsmbHQ7ZHRkIHB1YmxpY0lkPSIiIGxvY2F0aW9uPSIvcGF0aC90by9maWxlMi5qYXIiIC8mZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jmx0O2VudGl0eSBwdWJsaWNJZD0iIiBsb2NhdGlvbj0iL3BhdGgvdG8vZmlsZTMuamFyIiAvJmd0Ozxicj4KKyAqICZuYnNwOyZuYnNwOyZsdDtlbnRpdHkgcHVibGljSWQ9IiIgbG9jYXRpb249Ii9wYXRoL3RvL2ZpbGU0LmphciIgLyZndDs8YnI+CisgKiAmbmJzcDsmbmJzcDsmbHQ7Y2F0YWxvZ3BhdGgmZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIvZXRjL3NnbWwvY2F0YWxvZyIvJmd0Ozxicj4KKyAqICZuYnNwOyZuYnNwOyZsdDsvY2F0YWxvZ3BhdGgmZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jmx0O2NhdGFsb2dmaWxlcyBkaXI9Ii9vcHQvY2F0YWxvZ3MvIiBpbmNsdWRlcz0iKipcY2F0YWxvZy54bWwiIC8mZ3Q7PGJyPgorICogJmx0Oy94bWxjYXRhbG9nJmd0Ozxicj4KKyAqIDwvY29kZT4KKyAqIDxwPgorICogVGFza3Mgd2lzaGluZyB0byB1c2UgPGNvZGU+Jmx0O3htbGNhdGFsb2cmZ3Q7PC9jb2RlPiBtdXN0IHByb3ZpZGUgYSBtZXRob2QgY2FsbGVkCisgKiA8Y29kZT5jcmVhdGVYTUxDYXRhbG9nPC9jb2RlPiB3aGljaCByZXR1cm5zIGFuIGluc3RhbmNlIG9mCisgKiA8Y29kZT5YTUxDYXRhbG9nPC9jb2RlPi4gTmVzdGVkIERURCBhbmQgZW50aXR5IGRlZmluaXRpb25zIGFyZSBoYW5kbGVkIGJ5CisgKiB0aGUgWE1MQ2F0YWxvZyBvYmplY3QgYW5kIG11c3QgYmUgbGFiZWxlZCA8Y29kZT5kdGQ8L2NvZGU+IGFuZAorICogPGNvZGU+ZW50aXR5PC9jb2RlPiByZXNwZWN0aXZlbHkuPC9wPgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVzb2x1dGlvbiBhbGdvcml0aG06CisgKiBlbnRpdGllcy9VUklzL2R0ZHMgYXJlIGxvb2tlZCB1cCBpbiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgY29udGV4dHMsCisgKiBzdG9wcGluZyB3aGVuIGEgdmFsaWQgYW5kIHJlYWRhYmxlIHJlc291cmNlIGlzIGZvdW5kOgorICogPG9sPgorICogPGxpPkluIHRoZSBsb2NhbCBmaWxlc3lzdGVtPC9saT4KKyAqIDxsaT5JbiB0aGUgY2xhc3NwYXRoPC9saT4KKyAqIDxsaT5Vc2luZyB0aGUgQXBhY2hlIHhtbC1jb21tb25zIHJlc29sdmVyIChpZiBpdCBpcyBhdmFpbGFibGUpPC9saT4KKyAqIDxsaT5JbiBVUkwtc3BhY2U8L2xpPgorICogPC9vbD4KKyAqIDwvcD4KKyAqCisgKiA8cD5TZWUge0BsaW5rCisgKiBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5YTUxWYWxpZGF0ZVRhc2sKKyAqIFhNTFZhbGlkYXRlVGFza30gZm9yIGFuIGV4YW1wbGUgb2YgYSB0YXNrIHRoYXQgaGFzIGludGVncmF0ZWQKKyAqIHN1cHBvcnQgZm9yIFhNTENhdGFsb2dzLjwvcD4KKyAqCisgKiA8cD5Qb3NzaWJsZSBmdXR1cmUgZXh0ZW5zaW9uIGNvdWxkIHByb3ZpZGUgZm9yIGFkZGl0aW9uYWwgT0FTSVMKKyAqIGVudHJ5IHR5cGVzIHRvIGJlIHNwZWNpZmllZCBpbmxpbmUuPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIFhNTENhdGFsb2cgZXh0ZW5kcyBEYXRhVHlwZQorICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBFbnRpdHlSZXNvbHZlciwgVVJJUmVzb2x2ZXIgeworCisgICAgLyoqIGhlbHBlciBmb3Igc29tZSBGaWxlLnRvVVJMIGNvbm52ZXJzaW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLy8tLSBGaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqIEhvbGRzIGR0ZC9lbnRpdHkgb2JqZWN0cyB1bnRpbCBuZWVkZWQuICovCisgICAgcHJpdmF0ZSBWZWN0b3IgZWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBDbGFzc3BhdGggaW4gd2hpY2ggdG8gYXR0ZW1wdCB0byByZXNvbHZlIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOworCisgICAgLyoqCisgICAgICogUGF0aCBsaXN0aW5nIGV4dGVybmFsIGNhdGFsb2cgZmlsZXMgdG8gc2VhcmNoIHdoZW4gcmVzb2x2aW5nIGVudGl0aWVzCisgICAgICovCisgICAgcHJpdmF0ZSBQYXRoIGNhdGFsb2dQYXRoOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGJyaWRnZSB0byB0aGUgQXBhY2hlIHhtbC1jb21tb25zIHJlc29sdmVyCisgICAgICogY2xhc3MsIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcmVzb2x2ZXIuamFyIGlzIHByZXNlbnQgaW4gdGhlCisgICAgICogY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQQUNIRV9SRVNPTFZFUgorICAgICAgICA9ICJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvbHZlci5BcGFjaGVDYXRhbG9nUmVzb2x2ZXIiOworCisgICAgLyoqCisgICAgICogUmVzb2x2ZXIgYmFzZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfUkVTT0xWRVIKKyAgICAgICAgPSAib3JnLmFwYWNoZS54bWwucmVzb2x2ZXIudG9vbHMuQ2F0YWxvZ1Jlc29sdmVyIjsKKworICAgICAgICAvLy0tIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIFhNTENhdGFsb2coKSB7CisgICAgICAgIHNldENoZWNrZWQoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBjYXRhbG9nIC0gUmVzb3VyY2VMb2NhdGlvbiBvYmplY3RzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIGNhdGFsb2cgLSBSZXNvdXJjZUxvY2F0aW9uIG9iamVjdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBnZXRFbGVtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZigpLmVsZW1lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBpbiB3aGljaCB0byBhdHRlbXB0IHRvIHJlc29sdmUgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY2xhc3NwYXRoCisgICAgICovCisgICAgcHJpdmF0ZSBQYXRoIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZigpLmNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50cy4gTm90IGFsbG93ZWQgaWYgdGhpcyBjYXRhbG9nCisgICAgICogaXMgaXRzZWxmIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY2F0YWxvZyAtLSB0aGF0IGlzLCBhIGNhdGFsb2cKKyAgICAgKiBjYW5ub3QgYm90aCByZWZlciB0byBhbm90aGVyIDxlbT5hbmQ8L2VtPiBjb250YWluIGVsZW1lbnRzIG9yCisgICAgICogb3RoZXIgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBQYXRoIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHNldENoZWNrZWQoZmFsc2UpOworICAgICAgICByZXR1cm4gdGhpcy5jbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyBzaW1wbGUgY2xhc3NwYXRoIHN0cmluZy4gIE5vdCBhbGxvd2VkIGlmIHRoaXMgY2F0YWxvZyBpcworICAgICAqIGl0c2VsZiBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGNhdGFsb2cgLS0gdGhhdCBpcywgYSBjYXRhbG9nCisgICAgICogY2Fubm90IGJvdGggcmVmZXIgdG8gYW5vdGhlciA8ZW0+YW5kPC9lbT4gY29udGFpbiBlbGVtZW50cyBvcgorICAgICAqIG90aGVyIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIHRoZSBjbGFzc3BhdGggdG8gdXNlIHRvIGxvb2sgdXAgZW50aXRpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOworICAgICAgICB9CisgICAgICAgIHNldENoZWNrZWQoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyBjbGFzc3BhdGggcmVmZXJlbmNlLiAgTm90IGFsbG93ZWQgaWYgdGhpcyBjYXRhbG9nIGlzCisgICAgICogaXRzZWxmIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY2F0YWxvZyAtLSB0aGF0IGlzLCBhIGNhdGFsb2cKKyAgICAgKiBjYW5ub3QgYm90aCByZWZlciB0byBhbm90aGVyIDxlbT5hbmQ8L2VtPiBjb250YWluIGVsZW1lbnRzIG9yCisgICAgICogb3RoZXIgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIGFuIEFudCByZWZlcmVuY2UgY29udGFpbmluZyBhIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgICAgIHNldENoZWNrZWQoZmFsc2UpOworICAgIH0KKworICAgIC8qKiBDcmVhdGVzIGEgbmVzdGVkIDxjb2RlPiZsdDtjYXRhbG9ncGF0aCZndDs8L2NvZGU+IGVsZW1lbnQuCisgICAgICogTm90IGFsbG93ZWQgaWYgdGhpcyBjYXRhbG9nIGlzIGl0c2VsZiBhIHJlZmVyZW5jZSB0byBhbm90aGVyCisgICAgICogY2F0YWxvZyAtLSB0aGF0IGlzLCBhIGNhdGFsb2cgY2Fubm90IGJvdGggcmVmZXIgdG8gYW5vdGhlcgorICAgICAqIDxlbT5hbmQ8L2VtPiBjb250YWluIGVsZW1lbnRzIG9yIG90aGVyIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkIGFzIHRoZSBjYXRhbG9nIHBhdGguCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbgorICAgICAqIGlmIHRoaXMgaXMgYSByZWZlcmVuY2UgYW5kIG5vIG5lc3RlZCBlbGVtZW50cyBhcmUgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDYXRhbG9nUGF0aCgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuY2F0YWxvZ1BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jYXRhbG9nUGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0Q2hlY2tlZChmYWxzZSk7CisgICAgICAgIHJldHVybiB0aGlzLmNhdGFsb2dQYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgY2F0YWxvZ3BhdGggcmVmZXJlbmNlLiAgTm90IGFsbG93ZWQgaWYgdGhpcyBjYXRhbG9nIGlzCisgICAgICogaXRzZWxmIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY2F0YWxvZyAtLSB0aGF0IGlzLCBhIGNhdGFsb2cKKyAgICAgKiBjYW5ub3QgYm90aCByZWZlciB0byBhbm90aGVyIDxlbT5hbmQ8L2VtPiBjb250YWluIGVsZW1lbnRzIG9yCisgICAgICogb3RoZXIgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIGFuIEFudCByZWZlcmVuY2UgY29udGFpbmluZyBhIGNsYXNzcGF0aCB0byBiZSB1c2VkIGFzCisgICAgICogdGhlIGNhdGFsb2cgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nUGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBjcmVhdGVDYXRhbG9nUGF0aCgpLnNldFJlZmlkKHIpOworICAgICAgICBzZXRDaGVja2VkKGZhbHNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNhdGFsb2cgcGF0aCBpbiB3aGljaCB0byBhdHRlbXB0IHRvIHJlc29sdmUgRFREcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNhdGFsb2cgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldENhdGFsb2dQYXRoKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVmKCkuY2F0YWxvZ1BhdGg7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnQuICBOb3QKKyAgICAgKiBhbGxvd2VkIGlmIHRoaXMgY2F0YWxvZyBpcyBpdHNlbGYgYSByZWZlcmVuY2UgdG8gYW5vdGhlcgorICAgICAqIGNhdGFsb2cgLS0gdGhhdCBpcywgYSBjYXRhbG9nIGNhbm5vdCBib3RoIHJlZmVyIHRvIGFub3RoZXIKKyAgICAgKiA8ZW0+YW5kPC9lbT4gY29udGFpbiBlbGVtZW50cyBvciBvdGhlciBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGR0ZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFBVQkxJQyByZXNvdXJjZSBtYXBwaW5nIHRvCisgICAgICogICAgICAgICAgICBiZSBhZGRlZCB0byB0aGUgY2F0YWxvZworICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhpcyBpcyBhIHJlZmVyZW5jZSBhbmQgbm8gbmVzdGVkCisgICAgICogICAgICAgZWxlbWVudHMgYXJlIGFsbG93ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRFREKFJlc291cmNlTG9jYXRpb24gZHRkKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGdldEVsZW1lbnRzKCkuYWRkRWxlbWVudChkdGQpOworICAgICAgICBzZXRDaGVja2VkKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2VudGl0eSZndDs8L2NvZGU+IGVsZW1lbnQuICAgIE5vdAorICAgICAqIGFsbG93ZWQgaWYgdGhpcyBjYXRhbG9nIGlzIGl0c2VsZiBhIHJlZmVyZW5jZSB0byBhbm90aGVyCisgICAgICogY2F0YWxvZyAtLSB0aGF0IGlzLCBhIGNhdGFsb2cgY2Fubm90IGJvdGggcmVmZXIgdG8gYW5vdGhlcgorICAgICAqIDxlbT5hbmQ8L2VtPiBjb250YWluIGVsZW1lbnRzIG9yIG90aGVyIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5IHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVVJJIHJlc291cmNlIG1hcHBpbmcgdG8gYmUKKyAgICAgKiAgICAgICBhZGRlZCB0byB0aGUgY2F0YWxvZy4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoaXMgaXMgYSByZWZlcmVuY2UgYW5kIG5vIG5lc3RlZAorICAgICAqICAgICAgIGVsZW1lbnRzIGFyZSBhbGxvd2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVudGl0eShSZXNvdXJjZUxvY2F0aW9uIGVudGl0eSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkRFREKGVudGl0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYSBuZXN0ZWQgPGNvZGU+Jmx0O3htbGNhdGFsb2cmZ3Q7PC9jb2RlPiBpbnRvIG91cgorICAgICAqIGRlZmluaXRpb24uICBOb3QgYWxsb3dlZCBpZiB0aGlzIGNhdGFsb2cgaXMgaXRzZWxmIGEgcmVmZXJlbmNlCisgICAgICogdG8gYW5vdGhlciBjYXRhbG9nIC0tIHRoYXQgaXMsIGEgY2F0YWxvZyBjYW5ub3QgYm90aCByZWZlciB0bworICAgICAqIGFub3RoZXIgPGVtPmFuZDwvZW0+IGNvbnRhaW4gZWxlbWVudHMgb3Igb3RoZXIgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXRhbG9nIE5lc3RlZCBYTUxDYXRhbG9nCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFhNTENhdGFsb2coWE1MQ2F0YWxvZyBjYXRhbG9nKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIGFsbCBuZXN0ZWQgZWxlbWVudHMgdG8gb3VyIGNhdGFsb2cKKyAgICAgICAgVmVjdG9yIG5ld0VsZW1lbnRzID0gY2F0YWxvZy5nZXRFbGVtZW50cygpOworICAgICAgICBWZWN0b3Igb3VyRWxlbWVudHMgPSBnZXRFbGVtZW50cygpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gbmV3RWxlbWVudHMuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIG91ckVsZW1lbnRzLmFkZEVsZW1lbnQoZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFwcGVuZCB0aGUgY2xhc3NwYXRoIG9mIHRoZSBuZXN0ZWQgY2F0YWxvZworICAgICAgICBQYXRoIG5lc3RlZENsYXNzcGF0aCA9IGNhdGFsb2cuZ2V0Q2xhc3NwYXRoKCk7CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLmFwcGVuZChuZXN0ZWRDbGFzc3BhdGgpOworCisgICAgICAgIC8vIEFwcGVuZCB0aGUgY2F0YWxvZyBwYXRoIG9mIHRoZSBuZXN0ZWQgY2F0YWxvZworICAgICAgICBQYXRoIG5lc3RlZENhdGFsb2dQYXRoID0gY2F0YWxvZy5nZXRDYXRhbG9nUGF0aCgpOworICAgICAgICBjcmVhdGVDYXRhbG9nUGF0aCgpLmFwcGVuZChuZXN0ZWRDYXRhbG9nUGF0aCk7CisgICAgICAgIHNldENoZWNrZWQoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgWE1MQ2F0YWxvZworICAgICAqIGluc3RhbmNlLgorICAgICAqCisgICAgICogPHA+WW91IG11c3Qgbm90IHNldCBhbm90aGVyIGF0dHJpYnV0ZSBvciBuZXN0IGVsZW1lbnRzIGluc2lkZQorICAgICAqIHRoaXMgZWxlbWVudCBpZiB5b3UgbWFrZSBpdCBhIHJlZmVyZW5jZS4gIFRoYXQgaXMsIGEgY2F0YWxvZworICAgICAqIGNhbm5vdCBib3RoIHJlZmVyIHRvIGFub3RoZXIgPGVtPmFuZDwvZW0+IGNvbnRhaW4gZWxlbWVudHMgb3IKKyAgICAgKiBhdHRyaWJ1dGVzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gd2hpY2ggdGhpcyBjYXRhbG9nIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoaXMgaW5zdGFuY2UgYWxyZWFkeSBoYXMgYmVlbiBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIHRoZSBFbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5KCkgaW50ZXJmYWNlIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gcHVibGljSWQgdGhlIHB1YmxpYyBpZCB0byByZXNvbHZlLgorICAgICAqIEBwYXJhbSBzeXN0ZW1JZCB0aGUgc3lzdGVtIGlkIHRvIHJlc29sdmUuCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwYXJzaW5nIHByb2JsZW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBJTyBwcm9ibGVtLgorICAgICAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGVudGl0eS4KKyAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOworICAgICAgICB9CisKKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworCisgICAgICAgIGxvZygicmVzb2x2ZUVudGl0eTogJyIgKyBwdWJsaWNJZCArICInOiAnIiArIHN5c3RlbUlkICsgIiciLAorICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworCisgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0KKyAgICAgICAgICAgIGdldENhdGFsb2dSZXNvbHZlcigpLnJlc29sdmVFbnRpdHkocHVibGljSWQsIHN5c3RlbUlkKTsKKworICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJObyBtYXRjaGluZyBjYXRhbG9nIGVudHJ5IGZvdW5kLCBwYXJzZXIgd2lsbCB1c2U6ICciCisgICAgICAgICAgICAgICAgKyBzeXN0ZW1JZCArICInIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlucHV0U291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgdGhlIFVSSVJlc29sdmVyLnJlc29sdmUoKSBpbnRlcmZhY2UgbWV0aG9kLgorICAgICAqIEBwYXJhbSBocmVmIGFuIGhyZWYgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBiYXNlIHRoZSBiYXNlIFVSSS4KKyAgICAgKiBAcmV0dXJuIGEgU291cmNlIG9iamVjdCwgb3IgbnVsbCBpZiBocmVmIGNhbm5vdCBiZSByZXNvbHZlZC4KKyAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAc2VlIGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXIjcmVzb2x2ZQorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2UgcmVzb2x2ZShTdHJpbmcgaHJlZiwgU3RyaW5nIGJhc2UpCisgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5yZXNvbHZlKGhyZWYsIGJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworCisgICAgICAgIFNBWFNvdXJjZSBzb3VyY2UgPSBudWxsOworCisgICAgICAgIFN0cmluZyB1cmkgPSByZW1vdmVGcmFnbWVudChocmVmKTsKKworICAgICAgICBsb2coInJlc29sdmU6ICciICsgdXJpICsgIicgd2l0aCBiYXNlOiAnIiArIGJhc2UgKyAiJyIsIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICBzb3VyY2UgPSAoU0FYU291cmNlKSBnZXRDYXRhbG9nUmVzb2x2ZXIoKS5yZXNvbHZlKHVyaSwgYmFzZSk7CisKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2coIk5vIG1hdGNoaW5nIGNhdGFsb2cgZW50cnkgZm91bmQsIHBhcnNlciB3aWxsIHVzZTogJyIKKyAgICAgICAgICAgICAgICArIGhyZWYgKyAiJyIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDYW5ub3QgcmV0dXJuIGEgbnVsbCBzb3VyY2UsIGJlY2F1c2Ugd2UgaGF2ZSB0byBjYWxsCisgICAgICAgICAgICAvLyBzZXRFbnRpdHlSZXNvbHZlciAoc2VlIHNldEVudGl0eVJlc29sdmVyIGphdmFkb2MgY29tbWVudCkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBzb3VyY2UgPSBuZXcgU0FYU291cmNlKCk7CisgICAgICAgICAgICBVUkwgYmFzZVVSTCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCA9IEZJTEVfVVRJTFMuZ2V0RmlsZVVSTChnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiYXNlVVJMID0gbmV3IFVSTChiYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVVJMIHVybCA9ICh1cmkubGVuZ3RoKCkgPT0gMCA/IGJhc2VVUkwgOiBuZXcgVVJMKGJhc2VVUkwsIHVyaSkpOworICAgICAgICAgICAgICAgIHNvdXJjZS5zZXRJbnB1dFNvdXJjZShuZXcgSW5wdXRTb3VyY2UodXJsLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHByb2JhYmx5IGluIGZhaWx1cmUgbW9kZSwgYnV0CisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSB0aGUgYmFyZSBVUkkgYXMgYSBsYXN0IGdhc3AKKyAgICAgICAgICAgICAgICBzb3VyY2Uuc2V0SW5wdXRTb3VyY2UobmV3IElucHV0U291cmNlKHVyaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2V0RW50aXR5UmVzb2x2ZXIoc291cmNlKTsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgWE1MQ2F0YWxvZyBnZXRSZWYoKSB7CisgICAgICAgIGlmICghaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChYTUxDYXRhbG9nKSBnZXRDaGVja2VkUmVmKFhNTENhdGFsb2cuY2xhc3MsICJ4bWxjYXRhbG9nIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGluc3RhbmNlIG9mIHRoZSBDYXRhbG9nUmVzb2x2ZXIgc3RyYXRlZ3kgdG8gdXNlLgorICAgICAqLworICAgIHByaXZhdGUgQ2F0YWxvZ1Jlc29sdmVyIGNhdGFsb2dSZXNvbHZlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIGFwcHJvcHJpYXRlIENhdGFsb2dSZXNvbHZlcgorICAgICAqIHN0cmF0ZWd5IGltcGxlbWVudGF0aW9uLgorICAgICAqIDxwPiBVbnRpbCB3ZSBxdWVyeSB0aGUgY2xhc3NwYXRoLCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIEFwYWNoZQorICAgICAqIHJlc29sdmVyIChOb3JtIFdhbHNoJ3MgbGlicmFyeSBmcm9tIHhtbC1jb21tb25zKSBpcyBhdmFpbGFibGUgb3Igbm90LgorICAgICAqIFRoaXMgbWV0aG9kIGRldGVybWluZXMgd2hldGhlciB0aGUgbGlicmFyeSBpcyBhdmFpbGFibGUgYW5kIGNyZWF0ZXMgdGhlCisgICAgICogYXBwcm9wcmlhdGUgaW1wbGVtZW50YXRpb24gb2YgQ2F0YWxvZ1Jlc29sdmVyIGJhc2VkIG9uIHRoZSBhbnN3ZXIuPC9wPgorICAgICAqIDxwPlRoaXMgaXMgYW4gYXBwbGljYXRpb24gb2YgdGhlIEdhbmcgb2YgRm91ciBTdHJhdGVneSBQYXR0ZXJuCisgICAgICogY29tYmluZWQgd2l0aCBUZW1wbGF0ZSBNZXRob2QuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgQ2F0YWxvZ1Jlc29sdmVyIGdldENhdGFsb2dSZXNvbHZlcigpIHsKKworICAgICAgICBpZiAoY2F0YWxvZ1Jlc29sdmVyID09IG51bGwpIHsKKworICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gbnVsbDsKKworICAgICAgICAgICAgbG9hZGVyID0gZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKFBhdGguc3lzdGVtQ2xhc3NwYXRoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoQVBBQ0hFX1JFU09MVkVSLCB0cnVlLCBsb2FkZXIpOworCisgICAgICAgICAgICAgICAgLy8gVGhlIEFwYWNoZSByZXNvbHZlciBpcyBwcmVzZW50IC0gTmVlZCB0byBjaGVjayBpZiBpdCBjYW4KKyAgICAgICAgICAgICAgICAvLyBiZSBzZWVuIGJ5IHRoZSBjYXRhbG9nIHJlc29sdmVyIGNsYXNzLiBTdGFydCBieSBnZXR0aW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBsb2FkZXIKKyAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBhcGFjaGVSZXNvbHZlckxvYWRlciA9IGNsYXp6LmdldENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBiYXNlIGNsYXNzIHRocm91Z2ggdGhpcyBsb2FkZXIuCisgICAgICAgICAgICAgICAgQ2xhc3MgYmFzZVJlc29sdmVyQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgPSBDbGFzcy5mb3JOYW1lKENBVEFMT0dfUkVTT0xWRVIsIHRydWUsIGFwYWNoZVJlc29sdmVyTG9hZGVyKTsKKworICAgICAgICAgICAgICAgIC8vIGFuZCBmaW5kIGl0cyBhY3R1YWwgbG9hZGVyCisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgYmFzZVJlc29sdmVyTG9hZGVyCisgICAgICAgICAgICAgICAgICAgID0gYmFzZVJlc29sdmVyQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIGxvYWRlciB3aGljaCBpcyBiZWluZyB1c2VkIHRvIGxvYWQgdGhlCisgICAgICAgICAgICAgICAgLy8gQ2F0YWxvZ1Jlc29sdmVyLiBDYW4gaXQgc2VlIHRoZSBBcGFjaGVSZXNvbHZlcj8gVGhlCisgICAgICAgICAgICAgICAgLy8gYmFzZSByZXNvbHZlciB3aWxsIG9ubHkgYmUgYWJsZSB0byBjcmVhdGUgdGhlIEFwYWNoZVJlc29sdmVyCisgICAgICAgICAgICAgICAgLy8gaWYgaXQgY2FuIHNlZSBpdCAtIGRvZXNuJ3QgdXNlIHRoZSBjb250ZXh0IGxvYWRlci4KKyAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoQVBBQ0hFX1JFU09MVkVSLCB0cnVlLCBiYXNlUmVzb2x2ZXJMb2FkZXIpOworCisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiAgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gU3VjY2VzcyEgIFRoZSB4bWwtY29tbW9ucyByZXNvbHZlciBsaWJyYXJ5IGlzCisgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlLCBzbyB1c2UgaXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBjYXRhbG9nUmVzb2x2ZXIgPSBuZXcgRXh0ZXJuYWxSZXNvbHZlcihjbGF6eiwgb2JqKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhlIHhtbC1jb21tb25zIHJlc29sdmVyIGxpYnJhcnkgaXMgbm90CisgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlLCBzbyB3ZSBjYW4ndCB1c2UgaXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBjYXRhbG9nUmVzb2x2ZXIgPSBuZXcgSW50ZXJuYWxSZXNvbHZlcigpOworICAgICAgICAgICAgICAgIGlmIChnZXRDYXRhbG9nUGF0aCgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgZ2V0Q2F0YWxvZ1BhdGgoKS5saXN0KCkubGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogWE1MIHJlc29sdmVyIG5vdCBmb3VuZDsgZXh0ZXJuYWwgY2F0YWxvZ3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdpbGwgYmUgaWdub3JlZCIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gbG9hZCBBcGFjaGUgcmVzb2x2ZXI6ICIgKyBleCwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjYXRhbG9nUmVzb2x2ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgVVJJUmVzb2x2ZXIgdG8gc2V0IGFuIEVudGl0eVJlc29sdmVyCisgICAgICogb24gdGhlIFNBWCBwYXJzZXIgdG8gYmUgdXNlZCBmb3IgbmV3IFhNTCBkb2N1bWVudHMgdGhhdCBhcmUKKyAgICAgKiBlbmNvdW50ZXJlZCBhcyBhIHJlc3VsdCBvZiB0aGUgZG9jdW1lbnQoKSBmdW5jdGlvbiwgeHNsOmltcG9ydCwKKyAgICAgKiBvciB4c2w6aW5jbHVkZS4gIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRoZSBYU0xUIHByb2Nlc3NvciBjYWxscworICAgICAqIG91dCB0byB0aGUgU0FYUGFyc2VyRmFjdG9yeSBpdHNlbGYgdG8gY3JlYXRlIGEgbmV3IFNBWFBhcnNlciB0bworICAgICAqIHBhcnNlIHRoZSBuZXcgZG9jdW1lbnQuICBUaGUgbmV3IHBhcnNlciBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5CisgICAgICogaW5oZXJpdCB0aGUgRW50aXR5UmVzb2x2ZXIgb2YgdGhlIG9yaWdpbmFsIChhbHRob3VnaCBhcmd1YWJseQorICAgICAqIGl0IHNob3VsZCkuICBTZWUgYmVsb3c6PC9wPgorICAgICAqCisgICAgICogPHR0PiJJZiBhbiBhcHBsaWNhdGlvbiB3YW50cyB0byBzZXQgdGhlIEVycm9ySGFuZGxlciBvcgorICAgICAqIEVudGl0eVJlc29sdmVyIGZvciBhbiBYTUxSZWFkZXIgdXNlZCBkdXJpbmcgYSB0cmFuc2Zvcm1hdGlvbiwKKyAgICAgKiBpdCBzaG91bGQgdXNlIGEgVVJJUmVzb2x2ZXIgdG8gcmV0dXJuIHRoZSBTQVhTb3VyY2Ugd2hpY2gKKyAgICAgKiBwcm92aWRlcyAod2l0aCBnZXRYTUxSZWFkZXIpIGEgcmVmZXJlbmNlIHRvIHRoZSBYTUxSZWFkZXIiPC90dD4KKyAgICAgKgorICAgICAqIDxwPi4uLnF1b3RlZCBmcm9tIHBhZ2UgMTE4IG9mIHRoZSBKYXZhIEFQSSBmb3IgWE1MCisgICAgICogUHJvY2Vzc2luZyAxLjEgc3BlY2lmaWNhdGlvbjwvcD4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRFbnRpdHlSZXNvbHZlcihTQVhTb3VyY2Ugc291cmNlKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24geworCisgICAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBzb3VyY2UuZ2V0WE1MUmVhZGVyKCk7CisgICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcEZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBzcEZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlYWRlciA9IHNwRmFjdG9yeS5uZXdTQVhQYXJzZXIoKS5nZXRYTUxSZWFkZXIoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIodGhpcyk7CisgICAgICAgIHNvdXJjZS5zZXRYTUxSZWFkZXIocmVhZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgUmVzb3VyY2VMb2NhdGlvbiBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHB1YmxpY0lkLgorICAgICAqCisgICAgICogQHBhcmFtIHB1YmxpY0lkIHRoZSBwdWJsaWNJZCBvZiB0aGUgUmVzb3VyY2UgZm9yIHdoaWNoIGxvY2FsIGluZm9ybWF0aW9uCisgICAgICogICAgICAgIGlzIHJlcXVpcmVkLgorICAgICAqIEByZXR1cm4gYSBSZXNvdXJjZUxvY2F0aW9uIGluc3RhbmNlIHdpdGggaW5mb3JtYXRpb24gb24gdGhlIGxvY2FsIGxvY2F0aW9uCisgICAgICogICAgICAgICBvZiB0aGUgUmVzb3VyY2Ugb3IgbnVsbCBpZiBubyBzdWNoIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc291cmNlTG9jYXRpb24gZmluZE1hdGNoaW5nRW50cnkoU3RyaW5nIHB1YmxpY0lkKSB7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cygpLmVsZW1lbnRzKCk7CisgICAgICAgIFJlc291cmNlTG9jYXRpb24gZWxlbWVudCA9IG51bGw7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgUmVzb3VyY2VMb2NhdGlvbikgeworICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAoUmVzb3VyY2VMb2NhdGlvbikgbzsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRQdWJsaWNJZCgpLmVxdWFscyhwdWJsaWNJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHJlbW92ZSB0cmFpbGluZyBmcmFnbWVudCBmcm9tIGEgVVJJLgorICAgICAqIEZvciBleGFtcGxlLAorICAgICAqIDxjb2RlPmh0dHA6Ly9qYXZhLnN1bi5jb20vaW5kZXguaHRtbCNjaGFwdGVyMTwvY29kZT4KKyAgICAgKiB3b3VsZCByZXR1cm4gPGNvZGU+aHR0cDovL2phdmEuc3VuLmNvbS9pbmRleC5odG1sPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSB0byBwcm9jZXNzLiAgSXQgbWF5IG9yIG1heSBub3QgY29udGFpbiBhCisgICAgICogICAgICAgICAgICBmcmFnbWVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSBVUkkgc2FucyBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZW1vdmVGcmFnbWVudChTdHJpbmcgdXJpKSB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSB1cmk7CisgICAgICAgIGludCBoYXNoUG9zID0gdXJpLmluZGV4T2YoIiMiKTsKKyAgICAgICAgaWYgKGhhc2hQb3MgPj0gMCkgeworICAgICAgICAgICAgcmVzdWx0ID0gdXJpLnN1YnN0cmluZygwLCBoYXNoUG9zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGxvb2t1cCBhIFJlc291cmNlTG9jYXRpb24gaW4gdGhlIGZpbGVzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIElucHV0U291cmNlIGZvciByZWFkaW5nIHRoZSBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnB1dFNvdXJjZSBmaWxlc3lzdGVtTG9va3VwKFJlc291cmNlTG9jYXRpb24gbWF0Y2hpbmdFbnRyeSkgeworCisgICAgICAgIFN0cmluZyB1cmkgPSBtYXRjaGluZ0VudHJ5LmdldExvY2F0aW9uKCk7CisgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgbGluZSBzZWVtcyB0byBiZSBuZWNlc3Nhcnkgb24gV2luZG93cyB1bmRlciBKREsgMS4yCisgICAgICAgIHVyaSA9IHVyaS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgVVJMIGJhc2VVUkwgPSBudWxsOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBSZXNvdXJjZUxvY2F0aW9uIG1heSBzcGVjaWZ5IGEgcmVsYXRpdmUgcGF0aCBmb3IgaXRzCisgICAgICAgIC8vIGxvY2F0aW9uIGF0dHJpYnV0ZS4gIFRoaXMgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgIC8vIGJhc2UuCisgICAgICAgIC8vCisgICAgICAgIGlmIChtYXRjaGluZ0VudHJ5LmdldEJhc2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBiYXNlVVJMID0gbWF0Y2hpbmdFbnRyeS5nZXRCYXNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJhc2VVUkwgPSBGSUxFX1VUSUxTLmdldEZpbGVVUkwoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb2plY3QgYmFzZWRpciBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgVVJMIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBudWxsOworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoYmFzZVVSTCwgdXJpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyB0aGlzIHByb2Nlc3NpbmcgaXMgdXNlZnVsIHVuZGVyIFdpbmRvd3Mgd2hlbiB0aGUgbG9jYXRpb24gb2YgdGhlIERURAorICAgICAgICAgICAgLy8gaGFzIGJlZW4gZ2l2ZW4gYXMgYW4gYWJzb2x1dGUgcGF0aAorICAgICAgICAgICAgLy8gc2VlIEJ1Z3ppbGxhIFJlcG9ydCAyMzkxMworICAgICAgICAgICAgRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKHVyaSk7CisgICAgICAgICAgICBpZiAodGVzdEZpbGUuZXhpc3RzKCkgJiYgdGVzdEZpbGUuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nKCJ1cmkgOiAnIgorICAgICAgICAgICAgICAgICAgICArIHVyaSArICInIG1hdGNoZXMgYSByZWFkYWJsZSBmaWxlIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHVybCA9IEZJTEVfVVRJTFMuZ2V0RmlsZVVSTCh0ZXN0RmlsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4MSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgYW4gVVJMIGZvciA6IiArIHRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygidXJpIDogJyIKKyAgICAgICAgICAgICAgICAgICAgKyB1cmkgKyAiJyBkb2VzIG5vdCBtYXRjaCBhIHJlYWRhYmxlIGZpbGUiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiB1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gRklMRV9VVElMUy5mcm9tVVJJKHVybC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJmaWxlTmFtZSAiICsgZmlsZU5hbWUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICBGaWxlIHJlc0ZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc0ZpbGUuZXhpc3RzKCkgJiYgcmVzRmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKHJlc0ZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzeXNpZCA9IEpBWFBVdGlscy5nZXRTeXN0ZW1JZChyZXNGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChzeXNpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coImNhdGFsb2cgZW50cnkgbWF0Y2hlZCBhIHJlYWRhYmxlIGZpbGU6ICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzeXNpZCArICInIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBsb29rdXAgYSBSZXNvdXJjZUxvY2F0aW9uIGluIHRoZSBjbGFzc3BhdGguCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIElucHV0U291cmNlIGZvciByZWFkaW5nIHRoZSByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICBpZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGNsYXNzcGF0aCBvciBpcyBub3QgcmVhZGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnB1dFNvdXJjZSBjbGFzc3BhdGhMb29rdXAoUmVzb3VyY2VMb2NhdGlvbiBtYXRjaGluZ0VudHJ5KSB7CisKKyAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbnVsbDsKKworICAgICAgICBBbnRDbGFzc0xvYWRlciBsb2FkZXIgPSBudWxsOworICAgICAgICBQYXRoIGNwID0gY2xhc3NwYXRoOworICAgICAgICBpZiAoY3AgIT0gbnVsbCkgeworICAgICAgICAgICAgY3AgPSBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNwID0gKG5ldyBQYXRoKGdldFByb2plY3QoKSkpLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgibGFzdCIpOworICAgICAgICB9CisgICAgICAgIGxvYWRlciA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjcCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gZm9yIGNsYXNzcGF0aCBsb29rdXAgd2UgaWdub3JlIHRoZSBiYXNlIGRpcmVjdG9yeQorICAgICAgICAvLworICAgICAgICBJbnB1dFN0cmVhbSBpcworICAgICAgICAgICAgPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShtYXRjaGluZ0VudHJ5LmdldExvY2F0aW9uKCkpOworCisgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaXMpOworICAgICAgICAgICAgVVJMIGVudHJ5VVJMID0gbG9hZGVyLmdldFJlc291cmNlKG1hdGNoaW5nRW50cnkuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICBTdHJpbmcgc3lzaWQgPSBlbnRyeVVSTC50b0V4dGVybmFsRm9ybSgpOworICAgICAgICAgICAgc291cmNlLnNldFN5c3RlbUlkKHN5c2lkKTsKKyAgICAgICAgICAgIGxvZygiY2F0YWxvZyBlbnRyeSBtYXRjaGVkIGEgcmVzb3VyY2UgaW4gdGhlIGNsYXNzcGF0aDogJyIKKyAgICAgICAgICAgICAgICArIHN5c2lkICsgIiciLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGxvb2t1cCBhIFJlc291cmNlTG9jYXRpb24gaW4gVVJMLXNwYWNlLgorICAgICAqCisgICAgICogQHJldHVybiBBbiBJbnB1dFNvdXJjZSBmb3IgcmVhZGluZyB0aGUgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogICAgaWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGlkZW50aWZ5IGEgdmFsaWQgVVJMIG9yIGlzIG5vdCByZWFkYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIElucHV0U291cmNlIHVybExvb2t1cChSZXNvdXJjZUxvY2F0aW9uIG1hdGNoaW5nRW50cnkpIHsKKworICAgICAgICBTdHJpbmcgdXJpID0gbWF0Y2hpbmdFbnRyeS5nZXRMb2NhdGlvbigpOworICAgICAgICBVUkwgYmFzZVVSTCA9IG51bGw7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIFJlc291cmNlTG9jYXRpb24gbWF5IHNwZWNpZnkgYSByZWxhdGl2ZSB1cmwgZm9yIGl0cworICAgICAgICAvLyBsb2NhdGlvbiBhdHRyaWJ1dGUuICBUaGlzIGlzIHJlc29sdmVkIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAvLyBiYXNlLgorICAgICAgICAvLworICAgICAgICBpZiAobWF0Y2hpbmdFbnRyeS5nZXRCYXNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYmFzZVVSTCA9IG1hdGNoaW5nRW50cnkuZ2V0QmFzZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiYXNlVVJMID0gRklMRV9VVElMUy5nZXRGaWxlVVJMKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9qZWN0IGJhc2VkaXIgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIFVSTCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbnVsbDsKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoYmFzZVVSTCwgdXJpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc291cmNlID0gbmV3IElucHV0U291cmNlKGlzKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN5c2lkID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChzeXNpZCk7CisgICAgICAgICAgICAgICAgICAgIGxvZygiY2F0YWxvZyBlbnRyeSBtYXRjaGVkIGFzIGEgVVJMOiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBzeXNpZCArICInIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc291cmNlOworCisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGJvdGggdGhlIEludGVybmFsUmVzb2x2ZXIgc3RyYXRlZ3kgYW5kCisgICAgICogdGhlIEV4dGVybmFsUmVzb2x2ZXIgc3RyYXRlZ3kuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgQ2F0YWxvZ1Jlc29sdmVyIGV4dGVuZHMgVVJJUmVzb2x2ZXIsIEVudGl0eVJlc29sdmVyIHsKKworICAgICAgICBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKKworICAgICAgICBTb3VyY2UgcmVzb2x2ZShTdHJpbmcgaHJlZiwgU3RyaW5nIGJhc2UpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSW50ZXJuYWxSZXNvbHZlciBzdHJhdGVneSBpcyB1c2VkIGlmIHRoZSBBcGFjaGUgcmVzb2x2ZXIKKyAgICAgKiBsaWJyYXJ5IChOb3JtIFdhbHNoJ3MgbGlicmFyeSBmcm9tIHhtbC1jb21tb25zKSBpcyBub3QKKyAgICAgKiBhdmFpbGFibGUuICBJbiB0aGlzIGNhc2UsIGV4dGVybmFsIGNhdGFsb2cgZmlsZXMgd2lsbCBiZQorICAgICAqIGlnbm9yZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEludGVybmFsUmVzb2x2ZXIgaW1wbGVtZW50cyBDYXRhbG9nUmVzb2x2ZXIgeworCisgICAgICAgIHB1YmxpYyBJbnRlcm5hbFJlc29sdmVyKCkgeworICAgICAgICAgICAgbG9nKCJBcGFjaGUgcmVzb2x2ZXIgbGlicmFyeSBub3QgZm91bmQsIGludGVybmFsIHJlc29sdmVyIHdpbGwgYmUgdXNlZCIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCkgeworICAgICAgICAgICAgSW5wdXRTb3VyY2UgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgIFJlc291cmNlTG9jYXRpb24gbWF0Y2hpbmdFbnRyeSA9IGZpbmRNYXRjaGluZ0VudHJ5KHB1YmxpY0lkKTsKKworICAgICAgICAgICAgaWYgKG1hdGNoaW5nRW50cnkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgbG9nKCJNYXRjaGluZyBjYXRhbG9nIGVudHJ5IGZvdW5kIGZvciBwdWJsaWNJZDogJyIKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaGluZ0VudHJ5LmdldFB1YmxpY0lkKCkgKyAiJyBsb2NhdGlvbjogJyIKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaGluZ0VudHJ5LmdldExvY2F0aW9uKCkgKyAiJyIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbGVzeXN0ZW1Mb29rdXAobWF0Y2hpbmdFbnRyeSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2xhc3NwYXRoTG9va3VwKG1hdGNoaW5nRW50cnkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB1cmxMb29rdXAobWF0Y2hpbmdFbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb3VyY2UgcmVzb2x2ZShTdHJpbmcgaHJlZiwgU3RyaW5nIGJhc2UpCisgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBTQVhTb3VyY2UgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG51bGw7CisKKyAgICAgICAgICAgIFJlc291cmNlTG9jYXRpb24gbWF0Y2hpbmdFbnRyeSA9IGZpbmRNYXRjaGluZ0VudHJ5KGhyZWYpOworCisgICAgICAgICAgICBpZiAobWF0Y2hpbmdFbnRyeSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBsb2coIk1hdGNoaW5nIGNhdGFsb2cgZW50cnkgZm91bmQgZm9yIHVyaTogJyIKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaGluZ0VudHJ5LmdldFB1YmxpY0lkKCkgKyAiJyBsb2NhdGlvbjogJyIKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaGluZ0VudHJ5LmdldExvY2F0aW9uKCkgKyAiJyIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBwYXNzZWQgaW4gYmFzZSBpbiBwcmVmZXJlbmNlIHRvIHRoZSBiYXNlCisgICAgICAgICAgICAgICAgLy8gZnJvbSBtYXRjaGluZ0VudHJ5LCB3aGljaCBpcyBlaXRoZXIgbnVsbCBvciB0aGUKKyAgICAgICAgICAgICAgICAvLyBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGV4dGVybmFsIGNhdGFsb2cgZmlsZSBmcm9tCisgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXQgd2FzIG9idGFpbmVkIGlzIGxvY2F0ZWQuICBXZSBtYWtlIGEgY29weQorICAgICAgICAgICAgICAgIC8vIHNvIG1hdGNoaW5nRW50cnkncyBvcmlnaW5hbCBiYXNlIGlzIHVudG91Y2hlZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIGFzIHBlciBteSByZWFkaW5nIG9mCisgICAgICAgICAgICAgICAgLy8gdGhlIEpBWFAgYW5kIFhNTCBDYXRhbG9nIHNwZWNzLiAgQ0tTIDExLzcvMjAwMgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiBlbnRyeUNvcHkgPSBtYXRjaGluZ0VudHJ5OworICAgICAgICAgICAgICAgIGlmIChiYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBiYXNlVVJMID0gbmV3IFVSTChiYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Q29weSA9IG5ldyBSZXNvdXJjZUxvY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeUNvcHkuc2V0QmFzZShiYXNlVVJMKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRyeUNvcHkuc2V0UHVibGljSWQobWF0Y2hpbmdFbnRyeS5nZXRQdWJsaWNJZCgpKTsKKyAgICAgICAgICAgICAgICBlbnRyeUNvcHkuc2V0TG9jYXRpb24obWF0Y2hpbmdFbnRyeS5nZXRMb2NhdGlvbigpKTsKKworICAgICAgICAgICAgICAgIHNvdXJjZSA9IGZpbGVzeXN0ZW1Mb29rdXAoZW50cnlDb3B5KTsKKworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBjbGFzc3BhdGhMb29rdXAoZW50cnlDb3B5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc291cmNlID0gdXJsTG9va3VwKGVudHJ5Q29weSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTQVhTb3VyY2Uoc291cmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEV4dGVybmFsUmVzb2x2ZXIgc3RyYXRlZ3kgaXMgdXNlZCBpZiB0aGUgQXBhY2hlIHJlc29sdmVyCisgICAgICogbGlicmFyeSAoTm9ybSBXYWxzaCdzIGxpYnJhcnkgZnJvbSB4bWwtY29tbW9ucykgaXMgYXZhaWxhYmxlIGluCisgICAgICogdGhlIGNsYXNzcGF0aC4gIFRoZSBFeHRlcm5hbFJlc29sdmVyIGlzIGEgZXNzZW50aWFsbHkgYSBzdXBlcnNldAorICAgICAqIG9mIHRoZSBJbnRlcm5hbFJlc29sdmVyLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBFeHRlcm5hbFJlc29sdmVyIGltcGxlbWVudHMgQ2F0YWxvZ1Jlc29sdmVyIHsKKworICAgICAgICBwcml2YXRlIE1ldGhvZCBzZXRYTUxDYXRhbG9nID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgcGFyc2VDYXRhbG9nID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgcmVzb2x2ZUVudGl0eSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgTWV0aG9kIHJlc29sdmUgPSBudWxsOworCisgICAgICAgIC8qKiBUaGUgaW5zdGFuY2Ugb2YgdGhlIEFwYWNoZUNhdGFsb2dSZXNvbHZlciBicmlkZ2UgY2xhc3MgKi8KKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZXJJbXBsID0gbnVsbDsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZXh0ZXJuYWxDYXRhbG9nc1Byb2Nlc3NlZCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBFeHRlcm5hbFJlc29sdmVyKENsYXNzIHJlc29sdmVySW1wbENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJlc29sdmVySW1wbCkgeworCisgICAgICAgICAgICB0aGlzLnJlc29sdmVySW1wbCA9IHJlc29sdmVySW1wbDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEdldCBNZXRob2QgaW5zdGFuY2VzIGZvciBlYWNoIG9mIHRoZSBtZXRob2RzIHdlIG5lZWQgdG8KKyAgICAgICAgICAgIC8vIGNhbGwgb24gdGhlIHJlc29sdmVySW1wbCB1c2luZyByZWZsZWN0aW9uLiAgV2UgY2FuJ3QKKyAgICAgICAgICAgIC8vIGNhbGwgdGhlbSBkaXJlY3RseSwgYmVjYXVzZSB0aGV5IHJlcXVpcmUgb24gdGhlCisgICAgICAgICAgICAvLyB4bWwtY29tbW9ucyByZXNvbHZlciBsaWJyYXJ5IHdoaWNoIG1heSBub3QgYmUgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBpbiB0aGUgY2xhc3NwYXRoLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2V0WE1MQ2F0YWxvZyA9CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVySW1wbENsYXNzLmdldE1ldGhvZCgic2V0WE1MQ2F0YWxvZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7WE1MQ2F0YWxvZy5jbGFzc30pOworCisgICAgICAgICAgICAgICAgcGFyc2VDYXRhbG9nID0KKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXJJbXBsQ2xhc3MuZ2V0TWV0aG9kKCJwYXJzZUNhdGFsb2ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge1N0cmluZy5jbGFzc30pOworCisgICAgICAgICAgICAgICAgcmVzb2x2ZUVudGl0eSA9CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVySW1wbENsYXNzLmdldE1ldGhvZCgicmVzb2x2ZUVudGl0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9KTsKKworICAgICAgICAgICAgICAgIHJlc29sdmUgPQorICAgICAgICAgICAgICAgICAgICByZXNvbHZlckltcGxDbGFzcy5nZXRNZXRob2QoInJlc29sdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge1N0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzfSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2coIkFwYWNoZSByZXNvbHZlciBsaWJyYXJ5IGZvdW5kLCB4bWwtY29tbW9ucyByZXNvbHZlciB3aWxsIGJlIHVzZWQiLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3lzdGVtSWQpIHsKKyAgICAgICAgICAgIElucHV0U291cmNlIHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgICAgIHByb2Nlc3NFeHRlcm5hbENhdGFsb2dzKCk7CisKKyAgICAgICAgICAgIFJlc291cmNlTG9jYXRpb24gbWF0Y2hpbmdFbnRyeSA9IGZpbmRNYXRjaGluZ0VudHJ5KHB1YmxpY0lkKTsKKworICAgICAgICAgICAgaWYgKG1hdGNoaW5nRW50cnkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgbG9nKCJNYXRjaGluZyBjYXRhbG9nIGVudHJ5IGZvdW5kIGZvciBwdWJsaWNJZDogJyIKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaGluZ0VudHJ5LmdldFB1YmxpY0lkKCkgKyAiJyBsb2NhdGlvbjogJyIKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaGluZ0VudHJ5LmdldExvY2F0aW9uKCkgKyAiJyIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbGVzeXN0ZW1Mb29rdXAobWF0Y2hpbmdFbnRyeSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2xhc3NwYXRoTG9va3VwKG1hdGNoaW5nRW50cnkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW5wdXRTb3VyY2UpIHJlc29sdmVFbnRpdHkuaW52b2tlKHJlc29sdmVySW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwdWJsaWNJZCwgc3lzdGVtSWR9KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBtYXRjaCBhIFJlc291cmNlTG9jYXRpb24sIGJ1dCBzaW5jZSB3ZQorICAgICAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBQVUJMSUMgYW5kIFVSSSBlbnRyeSB0eXBlcyBpbnRlcm5hbGx5LAorICAgICAgICAgICAgICAgIC8vIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgYW5vdGhlciBlbnRyeSBpbgorICAgICAgICAgICAgICAgIC8vIGFuIGV4dGVybmFsIGNhdGFsb2cgdGhhdCB3aWxsIG1hdGNoLiAgV2UgY2FsbAorICAgICAgICAgICAgICAgIC8vIEFwYWNoZSByZXNvbHZlcidzIHJlc29sdmVFbnRpdHkgbWV0aG9kIHRvIGNvdmVyCisgICAgICAgICAgICAgICAgLy8gdGhpcyBwb3NzaWJpbGl0eS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoSW5wdXRTb3VyY2UpIHJlc29sdmVFbnRpdHkuaW52b2tlKHJlc29sdmVySW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3B1YmxpY0lkLCBzeXN0ZW1JZH0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTb3VyY2UgcmVzb2x2ZShTdHJpbmcgaHJlZiwgU3RyaW5nIGJhc2UpCisgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBTQVhTb3VyY2UgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG51bGw7CisKKyAgICAgICAgICAgIHByb2Nlc3NFeHRlcm5hbENhdGFsb2dzKCk7CisKKyAgICAgICAgICAgIFJlc291cmNlTG9jYXRpb24gbWF0Y2hpbmdFbnRyeSA9IGZpbmRNYXRjaGluZ0VudHJ5KGhyZWYpOworCisgICAgICAgICAgICBpZiAobWF0Y2hpbmdFbnRyeSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBsb2coIk1hdGNoaW5nIGNhdGFsb2cgZW50cnkgZm91bmQgZm9yIHVyaTogJyIKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaGluZ0VudHJ5LmdldFB1YmxpY0lkKCkgKyAiJyBsb2NhdGlvbjogJyIKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaGluZ0VudHJ5LmdldExvY2F0aW9uKCkgKyAiJyIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBwYXNzZWQgaW4gYmFzZSBpbiBwcmVmZXJlbmNlIHRvIHRoZSBiYXNlCisgICAgICAgICAgICAgICAgLy8gZnJvbSBtYXRjaGluZ0VudHJ5LCB3aGljaCBpcyBlaXRoZXIgbnVsbCBvciB0aGUKKyAgICAgICAgICAgICAgICAvLyBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGV4dGVybmFsIGNhdGFsb2cgZmlsZSBmcm9tCisgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXQgd2FzIG9idGFpbmVkIGlzIGxvY2F0ZWQuICBXZSBtYWtlIGEgY29weQorICAgICAgICAgICAgICAgIC8vIHNvIG1hdGNoaW5nRW50cnkncyBvcmlnaW5hbCBiYXNlIGlzIHVudG91Y2hlZC4gIE9mCisgICAgICAgICAgICAgICAgLy8gY291cnNlLCBpZiB0aGVyZSBpcyBubyBiYXNlLCBubyBuZWVkIHRvIG1ha2UgYQorICAgICAgICAgICAgICAgIC8vIGNvcHkuLi4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIGFzIHBlciBteSByZWFkaW5nIG9mCisgICAgICAgICAgICAgICAgLy8gdGhlIEpBWFAgYW5kIFhNTCBDYXRhbG9nIHNwZWNzLiAgQ0tTIDExLzcvMjAwMgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiBlbnRyeUNvcHkgPSBtYXRjaGluZ0VudHJ5OworICAgICAgICAgICAgICAgIGlmIChiYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBiYXNlVVJMID0gbmV3IFVSTChiYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Q29weSA9IG5ldyBSZXNvdXJjZUxvY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeUNvcHkuc2V0QmFzZShiYXNlVVJMKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRyeUNvcHkuc2V0UHVibGljSWQobWF0Y2hpbmdFbnRyeS5nZXRQdWJsaWNJZCgpKTsKKyAgICAgICAgICAgICAgICBlbnRyeUNvcHkuc2V0TG9jYXRpb24obWF0Y2hpbmdFbnRyeS5nZXRMb2NhdGlvbigpKTsKKworICAgICAgICAgICAgICAgIHNvdXJjZSA9IGZpbGVzeXN0ZW1Mb29rdXAoZW50cnlDb3B5KTsKKworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBjbGFzc3BhdGhMb29rdXAoZW50cnlDb3B5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNBWFNvdXJjZShzb3VyY2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTQVhTb3VyY2UpIHJlc29sdmUuaW52b2tlKHJlc29sdmVySW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7aHJlZiwgYmFzZX0pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2UgZGlkbid0IG1hdGNoIGEgUmVzb3VyY2VMb2NhdGlvbiwgYnV0IHNpbmNlIHdlCisgICAgICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IFBVQkxJQyBhbmQgVVJJIGVudHJ5IHR5cGVzIGludGVybmFsbHksCisgICAgICAgICAgICAgICAgLy8gaXQgaXMgc3RpbGwgcG9zc2libGUgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGVudHJ5IGluCisgICAgICAgICAgICAgICAgLy8gYW4gZXh0ZXJuYWwgY2F0YWxvZyB0aGF0IHdpbGwgbWF0Y2guICBXZSBjYWxsCisgICAgICAgICAgICAgICAgLy8gQXBhY2hlIHJlc29sdmVyJ3MgcmVzb2x2ZUVudGl0eSBtZXRob2QgdG8gY292ZXIKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHBvc3NpYmlsaXR5LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChTQVhTb3VyY2UpIHJlc29sdmUuaW52b2tlKHJlc29sdmVySW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtocmVmLCBiYXNlfSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzIGVhY2ggZXh0ZXJuYWwgY2F0YWxvZyBmaWxlIHNwZWNpZmllZCBpbiBhCisgICAgICAgICAqIDxjb2RlPiZsdDtjYXRhbG9ncGF0aCZndDs8L2NvZGU+LiAgSXQgd2lsbCBiZQorICAgICAgICAgKiBwYXJzZWQgYnkgdGhlIHJlc29sdmVyIGxpYnJhcnksIGFuZCB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cworICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIGJhY2sgdG8gdXMgKHRoYXQgaXMsIHRoZSBjb250cm9sbGluZworICAgICAgICAgKiBYTUxDYXRhbG9nIGluc3RhbmNlKSB2aWEgYSBjYWxsYmFjayBtZWNoYW5pc20uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0V4dGVybmFsQ2F0YWxvZ3MoKSB7CisKKyAgICAgICAgICAgIGlmICghZXh0ZXJuYWxDYXRhbG9nc1Byb2Nlc3NlZCkgeworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2V0WE1MQ2F0YWxvZy5pbnZva2UocmVzb2x2ZXJJbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge1hNTENhdGFsb2cudGhpc30pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFBhcnNlIGVhY2ggY2F0YWxvZyBsaXN0ZWQgaW4gbmVzdGVkIDxjYXRhbG9ncGF0aD4gZWxlbWVudHMKKyAgICAgICAgICAgICAgICBQYXRoIGNhdFBhdGggPSBnZXRDYXRhbG9nUGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChjYXRQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJVc2luZyBjYXRhbG9ncGF0aCAnIiArIGdldENhdGFsb2dQYXRoKCkgKyAiJyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNhdFBhdGhMaXN0ID0gZ2V0Q2F0YWxvZ1BhdGgoKS5saXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRQYXRoTGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBjYXRGaWxlID0gbmV3IEZpbGUoY2F0UGF0aExpc3RbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJQYXJzaW5nICIgKyBjYXRGaWxlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlQ2F0YWxvZy5pbnZva2UocmVzb2x2ZXJJbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjYXRGaWxlLmdldFBhdGgoKX0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4dGVybmFsQ2F0YWxvZ3NQcm9jZXNzZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfSAvLy0tIFhNTENhdGFsb2cKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcEZpbGVTZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcEZpbGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmNjNjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWmlwRmlsZVNldC5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBBIFppcEZpbGVTZXQgaXMgYSBGaWxlU2V0IHdpdGggZXh0cmEgYXR0cmlidXRlcyB1c2VmdWwgaW4gdGhlIGNvbnRleHQgb2YKKyAqIFppcC9KYXIgdGFza3MuCisgKgorICogQSBaaXBGaWxlU2V0IGV4dGVuZHMgRmlsZVNldHMgd2l0aCB0aGUgYWJpbGl0eSB0byBleHRyYWN0IGEgc3Vic2V0IG9mIHRoZQorICogZW50cmllcyBvZiBhIFppcCBmaWxlIGZvciBpbmNsdXNpb24gaW4gYW5vdGhlciBaaXAgZmlsZS4gIEl0IGFsc28gaW5jbHVkZXMKKyAqIGEgcHJlZml4IGF0dHJpYnV0ZSB3aGljaCBpcyBwcmVwZW5kZWQgdG8gZWFjaCBlbnRyeSBpbiB0aGUgb3V0cHV0IFppcCBmaWxlLgorICoKKyAqIFNpbmNlIGFudCAxLjYgWmlwRmlsZVNldCBjYW4gYmUgZGVmaW5lZCB3aXRoIGFuIGlkIGFuZCByZWZlcmVuY2VkIGluIHBhY2thZ2luZyB0YXNrcworICoKKyAqLworcHVibGljIGNsYXNzIFppcEZpbGVTZXQgZXh0ZW5kcyBBcmNoaXZlRmlsZVNldCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CisKKyAgICAvKiogQ29uc3RydWN0b3IgZm9yIFppcEZpbGVTZXQgKi8KKyAgICBwdWJsaWMgWmlwRmlsZVNldCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhIGZpbGVzZXQgYXJndWVtZW50LgorICAgICAqIEBwYXJhbSBmaWxlc2V0IHRoZSBmaWxlc2V0IHRvIHVzZQorICAgICAqLworICAgIHByb3RlY3RlZCBaaXBGaWxlU2V0KEZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICBzdXBlcihmaWxlc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2luZyBhIHppcGZpbGVzZXQgYXJndWVtZW50LgorICAgICAqIEBwYXJhbSBmaWxlc2V0IHRoZSB6aXBmaWxlc2V0IHRvIHVzZQorICAgICAqLworICAgIHByb3RlY3RlZCBaaXBGaWxlU2V0KFppcEZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICBzdXBlcihmaWxlc2V0KTsKKyAgICAgICAgZW5jb2RpbmcgPSBmaWxlc2V0LmVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgdGhpcyBaaXBGaWxlU2V0LgorICAgICAqIEBwYXJhbSBlbmMgZW5jb2RpbmcgYXMgU3RyaW5nLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuYykgeworICAgICAgICBjaGVja1ppcEZpbGVTZXRBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgdGhpcyBaaXBGaWxlU2V0LgorICAgICAqIEByZXR1cm4gU3RyaW5nIGVuY29kaW5nLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIEFic3RyYWN0RmlsZVNldCByZWYgPSBnZXRSZWYoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBaaXBGaWxlU2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoWmlwRmlsZVNldCkgcmVmKS5nZXRFbmNvZGluZygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IGFyY2hpdmUgc2Nhbm5lciBiYXNlZCBvbiB0aGlzIG9uZS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IFppcFNjYW5uZXIgd2l0aCB0aGUgc2FtZSBlbmNvZGluZyBhcyB0aGlzIG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJjaGl2ZVNjYW5uZXIgbmV3QXJjaGl2ZVNjYW5uZXIoKSB7CisgICAgICAgIFppcFNjYW5uZXIgenMgPSBuZXcgWmlwU2Nhbm5lcigpOworICAgICAgICB6cy5zZXRFbmNvZGluZyhlbmNvZGluZyk7CisgICAgICAgIHJldHVybiB6czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIFppcEZpbGVzZXQgYWNjZXB0cyBhbm90aGVyIFppcEZpbGVTZXQgb3IgYSBGaWxlU2V0IGFzIHJlZmVyZW5jZQorICAgICAqIEZpbGVTZXRzIGFyZSBvZnRlbiB1c2VkIGJ5IHRoZSB3YXIgdGFzayBmb3IgdGhlIGxpYiBhdHRyaWJ1dGUKKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdCB0byB1c2UKKyAgICAgKiBAcmV0dXJuIHRoZSBhYnN0cmFjdCBmaWxlc2V0IGluc3RhbmNlCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsZVNldCBnZXRSZWYoUHJvamVjdCBwKSB7CisgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UocCk7CisgICAgICAgIE9iamVjdCBvID0gZ2V0UmVmaWQoKS5nZXRSZWZlcmVuY2VkT2JqZWN0KHApOworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFppcEZpbGVTZXQpIHsKKyAgICAgICAgICAgIHJldHVybiAoQWJzdHJhY3RGaWxlU2V0KSBvOworICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGaWxlU2V0KSB7CisgICAgICAgICAgICBaaXBGaWxlU2V0IHpmcyA9IG5ldyBaaXBGaWxlU2V0KChGaWxlU2V0KSBvKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZUZpbGVTZXQoemZzKTsKKyAgICAgICAgICAgIHJldHVybiB6ZnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gZ2V0UmVmaWQoKS5nZXRSZWZJZCgpICsgIiBkb2VzblwndCBkZW5vdGUgYSB6aXBmaWxlc2V0IG9yIGEgZmlsZXNldCI7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFppcEZpbGVTZXQgdGhhdCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcworICAgICAqIGFzIHRoaXMgb25lLgorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCB6aXBGaWxlU2V0CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFppcEZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5jbG9uZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNoZWNrIGF0dHJpYnV0ZXMgZm9yIHppcEZpbGVTZXQuCisgICAgICogSWYgdGhlcmUgaXMgYSByZWZlcmVuY2UsIGFuZAorICAgICAqIGl0IGlzIGEgWmlwRmlsZVNldCwgdGhlIHppcCBmaWxlc2V0IGF0dHJpYnV0ZXMKKyAgICAgKiBjYW5ub3QgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2taaXBGaWxlU2V0QXR0cmlidXRlc0FsbG93ZWQoKSB7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbAorICAgICAgICAgICAgfHwgKGlzUmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICAmJiAoZ2V0UmVmaWQoKS5nZXRSZWZlcmVuY2VkT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpKQorICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZW9mIFppcEZpbGVTZXQpKSkgeworICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBTY2FubmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhODliZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcFNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlppcFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGU7CisKKy8qKgorICogU2NhbnMgemlwIGFyY2hpdmVzIGZvciByZXNvdXJjZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBaaXBTY2FubmVyIGV4dGVuZHMgQXJjaGl2ZVNjYW5uZXIgeworCisgICAgLyoqCisgICAgICogRmlsbHMgdGhlIGZpbGUgYW5kIGRpcmVjdG9yeSBtYXBzIHdpdGggcmVzb3VyY2VzIHJlYWQgZnJvbSB0aGUKKyAgICAgKiBhcmNoaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyB0aGUgYXJjaGl2ZSB0byBzY2FuLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBlbmNvZGluZyB1c2VkIHRvIGVuY29kZSBmaWxlIG5hbWVzIGluc2lkZSB0aGUgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gZmlsZUVudHJpZXMgTWFwIChuYW1lIHRvIHJlc291cmNlKSBvZiBub24tZGlyZWN0b3J5CisgICAgICogcmVzb3VyY2VzIGZvdW5kIGluc2lkZSB0aGUgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gbWF0Y2hGaWxlRW50cmllcyBNYXAgKG5hbWUgdG8gcmVzb3VyY2UpIG9mIG5vbi1kaXJlY3RvcnkKKyAgICAgKiByZXNvdXJjZXMgZm91bmQgaW5zaWRlIHRoZSBhcmNoaXZlIHRoYXQgbWF0Y2hlZCBhbGwgaW5jbHVkZQorICAgICAqIHBhdHRlcm5zIGFuZCBkaWRuJ3QgbWF0Y2ggYW55IGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICogQHBhcmFtIGRpckVudHJpZXMgTWFwIChuYW1lIHRvIHJlc291cmNlKSBvZiBkaXJlY3RvcnkKKyAgICAgKiByZXNvdXJjZXMgZm91bmQgaW5zaWRlIHRoZSBhcmNoaXZlLgorICAgICAqIEBwYXJhbSBtYXRjaERpckVudHJpZXMgTWFwIChuYW1lIHRvIHJlc291cmNlKSBvZiBkaXJlY3RvcnkKKyAgICAgKiByZXNvdXJjZXMgZm91bmQgaW5zaWRlIHRoZSBhcmNoaXZlIHRoYXQgbWF0Y2hlZCBhbGwgaW5jbHVkZQorICAgICAqIHBhdHRlcm5zIGFuZCBkaWRuJ3QgbWF0Y2ggYW55IGV4Y2x1ZGUgcGF0dGVybnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmlsbE1hcHNGcm9tQXJjaGl2ZShSZXNvdXJjZSBzcmMsIFN0cmluZyBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBmaWxlRW50cmllcywgTWFwIG1hdGNoRmlsZUVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZGlyRW50cmllcywgTWFwIG1hdGNoRGlyRW50cmllcykgeworICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IG51bGw7CisgICAgICAgIFppcEZpbGUgemYgPSBudWxsOworCisgICAgICAgIEZpbGUgc3JjRmlsZSA9IG51bGw7CisgICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHNyY0ZpbGUgPSAoKEZpbGVSZXNvdXJjZSkgc3JjKS5nZXRGaWxlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm9ubHkgZmlsZSByZXNvdXJjZXMgYXJlIHN1cHBvcnRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgemYgPSBuZXcgWmlwRmlsZShzcmNGaWxlLCBlbmNvZGluZyk7CisgICAgICAgICAgICB9IGNhdGNoIChaaXBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByb2JsZW0gcmVhZGluZyAiICsgc3JjRmlsZSwgZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByb2JsZW0gb3BlbmluZyAiICsgc3JjRmlsZSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHpmLmdldEVudHJpZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgZW50cnkgPSAoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZSByID0gbmV3IFppcFJlc291cmNlKHNyY0ZpbGUsIGVuY29kaW5nLCBlbnRyeSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRyaW1TZXBhcmF0b3IobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGRpckVudHJpZXMucHV0KG5hbWUsIHIpOworICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRGlyRW50cmllcy5wdXQobmFtZSwgcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWxlRW50cmllcy5wdXQobmFtZSwgcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaChuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGaWxlRW50cmllcy5wdXQobmFtZSwgcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBaaXBGaWxlLmNsb3NlUXVpZXRseSh6Zik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvY29uZGl0aW9ucy9hbnRsaWIueG1sIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvY29uZGl0aW9ucy9hbnRsaWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOWExZTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9jb25kaXRpb25zL2FudGxpYi54bWwKQEAgLTAsMCArMSw4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8YW50bGliPgorICA8IS0tCisvKgorICogICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisgIC0tPgorICA8IS0tIEFudCAxLjYrIGFudGxpYiBkZWNsYXJhdGlvbiBmb3IgY29uZGl0aW9uczoKKyAgVXNlIHdpdGggdGhlIGRlY2xhcmF0aW9uIHhtbG5zOmNvbmQ9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC5jb25kaXRpb24iCisgIHRvCisgIHRyaWdnZXIgQW50J3MgYXV0b2xvYWQgb2YgdGhpcyBmaWxlIGludG8gbmFtZXNwYWNlICdjb25kJyAob3Igd2hhdGV2ZXIgbmFtZQorICBzdWl0cykuCisKKyAgUGxlYXNlIGtlZXAgdGhpcyBsaXN0IGluIGFscGhhYmV0aWNhbCBvcmRlcjsgaXQgaXMgZWFzaWVyIHRvIHZlcmlmeSB0aGF0IHdheS4KKworICBBZGRpdGlvbmFsbHksIENvbmRpdGlvbkJhc2UgdXNlcyB0aGlzIGFudGxpYiB0byBkaXNjb3ZlciBidWlsdC1pbiBjb25kaXRpb25zLgorICBQcmlvciB0byBBbnQgMS43LCBhIG5ldyBidWlsdC1pbiBjb25kaXRpb24gcmVxdWlyZWQgYW4gYWRkWFhYIG1ldGhvZCB0byBiZQorICBhZGRlZCB0byBDb25kaXRpb25CYXNlLiAgQ29uZGl0aW9ucyBhZGRlZCBpbiBvciBhZnRlciB2ZXJzaW9uIDEuNyBuZWVkIG9ubHkKKyAgdG8gYmUgYWRkZWQgdG8gdGhpcyBhbnRsaWIuCisgIC0tPgorCisgIDx0eXBlZGVmIG5hbWU9ImFuZCIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5BbmQiLz4KKyAgPHR5cGVkZWYgbmFtZT0iYW50dmVyc2lvbiIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5BbnRWZXJzaW9uIi8+CisgIDx0eXBlZGVmIG5hbWU9ImNvbnRhaW5zIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbnRhaW5zIi8+CisgIDx0eXBlZGVmIG5hbWU9ImVxdWFscyIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5FcXVhbHMiLz4KKyAgPHR5cGVkZWYgbmFtZT0iZmlsZXNtYXRjaCIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5GaWxlc01hdGNoIi8+CisgIDx0eXBlZGVmIG5hbWU9Imhhc2ZyZWVzcGFjZSIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5IYXNGcmVlU3BhY2UiLz4KKyAgPHR5cGVkZWYgbmFtZT0iaHR0cCIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5IdHRwIi8+CisgIDx0eXBlZGVmIG5hbWU9ImlzZmFpbHVyZSIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc0ZhaWx1cmUiLz4KKyAgPHR5cGVkZWYgbmFtZT0iaXNmYWxzZSIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc0ZhbHNlIi8+CisgIDx0eXBlZGVmIG5hbWU9ImlzZmlsZXNlbGVjdGVkIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzRmlsZVNlbGVjdGVkIi8+CisgIDx0eXBlZGVmIG5hbWU9ImlzcmVhY2hhYmxlIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzUmVhY2hhYmxlIi8+CisgIDx0eXBlZGVmIG5hbWU9ImlzcmVmZXJlbmNlIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzUmVmZXJlbmNlIi8+CisgIDx0eXBlZGVmIG5hbWU9Imlzc2V0IiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzU2V0Ii8+CisgIDx0eXBlZGVmIG5hbWU9Imlzc2lnbmVkIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzU2lnbmVkIi8+CisgIDx0eXBlZGVmIG5hbWU9ImlzdHJ1ZSIgIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSXNUcnVlIi8+CisgIDx0eXBlZGVmIG5hbWU9Im5vdCIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Ob3QiLz4KKyAgPHR5cGVkZWYgbmFtZT0ibWF0Y2hlcyIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5NYXRjaGVzIi8+CisgIDx0eXBlZGVmIG5hbWU9Im9yIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9yIi8+CisgIDx0eXBlZGVmIG5hbWU9Im9zIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zIi8+CisgIDx0eXBlZGVmIG5hbWU9InBhcnNlcnN1cHBvcnRzIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLlBhcnNlclN1cHBvcnRzIi8+CisgIDx0eXBlZGVmIG5hbWU9InJlc291cmNlc21hdGNoIiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLlJlc291cmNlc01hdGNoIi8+CisgIDx0eXBlZGVmIG5hbWU9InJlc291cmNlY29udGFpbnMiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uUmVzb3VyY2VDb250YWlucyIvPgorICA8dHlwZWRlZiBuYW1lPSJzY3JpcHRjb25kaXRpb24iIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5TY3JpcHRDb25kaXRpb24iLz4KKyAgPHR5cGVkZWYgbmFtZT0ic29ja2V0IiBvbmVycm9yPSJpZ25vcmUiCisgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLlNvY2tldCIvPgorICA8dHlwZWRlZiBuYW1lPSJ0eXBlZm91bmQiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uVHlwZUZvdW5kIi8+CisgIDx0eXBlZGVmIG5hbWU9InhvciIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Yb3IiLz4KKzwvYW50bGliPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL2RlZmF1bHRzLnByb3BlcnRpZXMgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9kZWZhdWx0cy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNGM2OTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9kZWZhdWx0cy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOTIgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2Rlc2NyaXB0aW9uPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRlc2NyaXB0aW9uCitmaWx0ZXJjaGFpbj1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJDaGFpbgorZmlsdGVycmVhZGVyPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkFudEZpbHRlclJlYWRlcgorZmlsdGVyc2V0PW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldAorbWFwcGVyPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlcgorcmVkaXJlY3Rvcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWRpcmVjdG9yRWxlbWVudAorcGF0dGVybnNldD1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0CityZWdleHA9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVndWxhckV4cHJlc3Npb24KK3N1YnN0aXR1dGlvbj1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5TdWJzdGl0dXRpb24KK3htbGNhdGFsb2c9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZworZXh0ZW5zaW9uU2V0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5FeHRlbnNpb25TZXQKK2V4dGVuc2lvbj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uRXh0ZW5zaW9uQWRhcHRlcgorc2VsZWN0b3I9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNlbGVjdFNlbGVjdG9yCitzaWduZWRzZWxlY3Rvcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2lnbmVkU2VsZWN0b3IKK3NjcmlwdGZpbHRlcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5TY3JpcHRGaWx0ZXIKK2Fzc2VydGlvbnM9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQXNzZXJ0aW9ucworY29uY2F0ZmlsdGVyPW9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuQ29uY2F0RmlsdGVyCittYXZlbnJlcG9zaXRvcnk9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucmVwb3NpdG9yeS5NYXZlblJlcG9zaXRvcnkKK3NjcmlwdHNlbGVjdG9yPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLlNjcmlwdFNlbGVjdG9yCitzY3JpcHRtYXBwZXI9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuU2NyaXB0TWFwcGVyCisKKyMgZGlmZmVyZW50IGZpbGVuYW1lIG1hcHBlcnMKK2lkZW50aXR5bWFwcGVyPW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSWRlbnRpdHlNYXBwZXIKK2ZsYXR0ZW5tYXBwZXI9b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GbGF0RmlsZU5hbWVNYXBwZXIKK2dsb2JtYXBwZXI9b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5HbG9iUGF0dGVybk1hcHBlcgorbWVyZ2VtYXBwZXI9b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5NZXJnaW5nTWFwcGVyCityZWdleHBtYXBwZXI9b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZWdleHBQYXR0ZXJuTWFwcGVyCitwYWNrYWdlbWFwcGVyPW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUGFja2FnZU5hbWVNYXBwZXIKK3VucGFja2FnZW1hcHBlcj1vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlVuUGFja2FnZU5hbWVNYXBwZXIKK2NvbXBvc2l0ZW1hcHBlcj1vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbXBvc2l0ZU1hcHBlcgorY2hhaW5lZG1hcHBlcj1vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNoYWluZWRNYXBwZXIKK2ZpbHRlcm1hcHBlcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5tYXBwZXJzLkZpbHRlck1hcHBlcgorCisjdGhpcyBjb25kaXRpb24gaXMgaW4gaGVyZSBiZWNhdXNlIGl0IGlzIHRoZSBzb2xlCisjY29uZGl0aW9uIGRlZmluZWQgaW4gQW50MS42CisjcGxlYXNlIGFkZCBuZXcgY29uZGl0aW9ucyB0byBvYXRhLnR5cGVzLmNvbmRpdGlvbnMvYW50bGliLnhtbCBpbnN0ZWFkIG9mCisjaGVyZSwgdG8gYXZvaWQgbmFtZXNwYWNlIGNsYXNoIHdpdGggdGhpbmdzIGxpa2Ugc2VsZWN0b3JzLgoraXNmaWxlc2VsZWN0ZWQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzRmlsZVNlbGVjdGVkCitzY3JpcHRjb25kaXRpb249b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuU2NyaXB0Q29uZGl0aW9uCisKKyNSZXNvdXJjZUNvbGxlY3Rpb25zOgorZGlyc2V0PW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRpclNldAorZmlsZWxpc3Q9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZUxpc3QKK2ZpbGVzZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldAorcGF0aD1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoCitwcm9wZXJ0eXNldD1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Qcm9wZXJ0eVNldAoremlwZmlsZXNldD1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0CitjbGFzc2ZpbGVzZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuZGVwZW5kLkNsYXNzZmlsZVNldAorbGliZmlsZXNldD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uTGliRmlsZVNldAorZmlsZXM9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVzCityZXN0cmljdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuUmVzdHJpY3QKK3VuaW9uPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5VbmlvbgorZGlmZmVyZW5jZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRGlmZmVyZW5jZQoraW50ZXJzZWN0PW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5JbnRlcnNlY3QKK3NvcnQ9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlNvcnQKK3Jlc291cmNlcz1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuUmVzb3VyY2VzCitmaXJzdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlyc3QKK2xhc3Q9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkxhc3QKK3RhcmZpbGVzZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuVGFyRmlsZVNldAordG9rZW5zPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5Ub2tlbnMKKworI1Jlc291cmNlcyAoc2luZ2xlLWVsZW1lbnQgUmVzb3VyY2VDb2xsZWN0aW9ucyk6CityZXNvdXJjZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZQorZmlsZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlCit1cmw9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlVSTFJlc291cmNlCitzdHJpbmc9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlN0cmluZ1Jlc291cmNlCit6aXBlbnRyeT1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuWmlwUmVzb3VyY2UKK3Byb3BlcnR5cmVzb3VyY2U9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlByb3BlcnR5UmVzb3VyY2UKK3RhcmVudHJ5PW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5UYXJSZXNvdXJjZQorZ3ppcHJlc291cmNlPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5HWmlwUmVzb3VyY2UKK2J6aXAycmVzb3VyY2U9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkJaaXAyUmVzb3VyY2UKK2phdmFyZXNvdXJjZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuSmF2YVJlc291cmNlCisKKyN0b2tlbml6ZXIgaW1wbGVtZW50YXRpb25zCitsaW5ldG9rZW5pemVyPW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTGluZVRva2VuaXplcgorc3RyaW5ndG9rZW5pemVyPW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVG9rZW5pemVyCitmaWxldG9rZW5pemVyPW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVRva2VuaXplcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9GaWx0ZXJNYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvRmlsdGVyTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxYTNmNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvRmlsdGVyTWFwcGVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm1hcHBlcnM7CisKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5VbnN1cHBvcnRlZEF0dHJpYnV0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLnV0aWwuQ2hhaW5SZWFkZXJIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyQ2hhaW47CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBUaGlzIGlzIGEgRmlsZU5hbWVNYXBwZXIgYmFzZWQgb24gYSBGaWx0ZXJDaGFpbi4KKyAqLworcHVibGljIGNsYXNzIEZpbHRlck1hcHBlciBleHRlbmRzIEZpbHRlckNoYWluIGltcGxlbWVudHMgRmlsZU5hbWVNYXBwZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gODE5MjsKKworICAgIC8qKgorICAgICAqIEZyb20gYXR0cmlidXRlIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHBhcmFtIGZyb20gYSBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGFsd2F5cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQXR0cmlidXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgImZpbHRlcm1hcHBlciBkb2Vzbid0IHN1cHBvcnQgdGhlIFwiZnJvbVwiIGF0dHJpYnV0ZS4iLCAiZnJvbSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZyb20gYXR0cmlidXRlIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHBhcmFtIHRvIGEgc3RyaW5nCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQXR0cmlidXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgImZpbHRlcm1hcHBlciBkb2Vzbid0IHN1cHBvcnQgdGhlIFwidG9cIiBhdHRyaWJ1dGUuIiwgInRvIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGZpbHRlcnMgb24gdGhlIHNvdXJjZWZpbGVuYW1lLgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZSB0aGUgZmlsZW5hbWUgdG8gbWFwCisgICAgICogQHJldHVybiAgYSBvbmUtZWxlbWVudCBhcnJheSBvZiBjb252ZXJ0ZWQgZmlsZW5hbWVzLCBvciBudWxsIGlmCisgICAgICogICAgICAgICAgdGhlIGZpbHRlcmNoYWluIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgc291cmNlRmlsZU5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlYWRlciBzdHJpbmdSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNvdXJjZUZpbGVOYW1lKTsKKyAgICAgICAgICAgIENoYWluUmVhZGVySGVscGVyIGhlbHBlciA9IG5ldyBDaGFpblJlYWRlckhlbHBlcigpOworICAgICAgICAgICAgaGVscGVyLnNldEJ1ZmZlclNpemUoQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgaGVscGVyLnNldFByaW1hcnlSZWFkZXIoc3RyaW5nUmVhZGVyKTsKKyAgICAgICAgICAgIGhlbHBlci5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBWZWN0b3IgZmlsdGVyQ2hhaW5zID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZmlsdGVyQ2hhaW5zLmFkZCh0aGlzKTsKKyAgICAgICAgICAgIGhlbHBlci5zZXRGaWx0ZXJDaGFpbnMoZmlsdGVyQ2hhaW5zKTsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBGaWxlVXRpbHMuc2FmZVJlYWRGdWxseShoZWxwZXIuZ2V0QXNzZW1ibGVkUmVhZGVyKCkpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge3Jlc3VsdH07CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvQWJzdHJhY3RTY3JpcHRDb21wb25lbnQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL0Fic3RyYWN0U2NyaXB0Q29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5YmQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL0Fic3RyYWN0U2NyaXB0Q29tcG9uZW50LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TY3JpcHRSdW5uZXJCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU2NyaXB0UnVubmVySGVscGVyOworCisvKioKKyAqIFRoaXMgaXMgYSB7QGxpbmsgUHJvamVjdENvbXBvbmVudH0gdGhhdCBoYXMgc2NyaXB0IHN1cHBvcnQgYnVpbHQgaW4KKyAqIFVzZSBpdCBhcyBhIGZvdW5kYXRpb24gZm9yIHNjcmlwdGFibGUgdGhpbmdzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTY3JpcHRDb21wb25lbnQgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IHsKKyAgICAvKioKKyAgICAgKiBzY3JpcHQgcnVubmVyIGhlbHBlcgorICAgICAqLworICAgIHByaXZhdGUgU2NyaXB0UnVubmVySGVscGVyIGhlbHBlciA9IG5ldyBTY3JpcHRSdW5uZXJIZWxwZXIoKTsKKworICAgIC8qKgorICAgICAqIHNjcmlwdCBydW5uZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTY3JpcHRSdW5uZXJCYXNlICAgcnVubmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvamVjdC4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgb3duZXIgb2YgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgc3VwZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgaGVscGVyLnNldFByb2plY3RDb21wb25lbnQodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG91ciBzY3JpcHQgcnVubmVyCisgICAgICogQHJldHVybiB0aGUgcnVubmVyCisgICAgICovCisgICAgcHVibGljIFNjcmlwdFJ1bm5lckJhc2UgZ2V0UnVubmVyKCkgeworICAgICAgICBpbml0U2NyaXB0UnVubmVyKCk7CisgICAgICAgIHJldHVybiBydW5uZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgc2NyaXB0IGZyb20gYW4gZXh0ZXJuYWwgZmlsZSA7IG9wdGlvbmFsLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0IHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBmaWxlKSB7CisgICAgICAgIGhlbHBlci5zZXRTcmMoZmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNjcmlwdCB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgYSBjb21wb25lbnQgb2YgdGhlIHNjcmlwdCB0ZXh0IHRvIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaGVscGVyLmFkZFRleHQodGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSBzY3JpcHRpbmcgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBtYW5hZ2VyKSB7CisgICAgICAgIGhlbHBlci5zZXRNYW5hZ2VyKG1hbmFnZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIGxhbmd1YWdlIChyZXF1aXJlZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBuYW1lIGZvciB0aGUgc2NyaXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICBoZWxwZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIHNjcmlwdCBydW5uZXIuIENhbGxzIHRoaXMgYmVmb3JlIHJ1bm5pbmcgdGhlIHN5c3RlbQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRTY3JpcHRSdW5uZXIoKSB7CisgICAgICAgIGlmIChydW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGhlbHBlci5zZXRQcm9qZWN0Q29tcG9uZW50KHRoaXMpOworICAgICAgICBydW5uZXIgPSBoZWxwZXIuZ2V0U2NyaXB0UnVubmVyKCk7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggYW4gQW50IFBhdGggb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNlYXJjaCBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBoZWxwZXIuc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gZW1wdHkgUGF0aCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkIGJ5IEFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBoZWxwZXIuY3JlYXRlQ2xhc3NwYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggYnkgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgYSBSZWZlcmVuY2UgdG8gYSBQYXRoIGluc3RhbmNlIHRvIGJlIHVzZWQgYXMgdGhlIGNsYXNzcGF0aAorICAgICAqICAgICAgICAgIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBoZWxwZXIuc2V0Q2xhc3NwYXRoUmVmKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biBhIHNjcmlwdAorICAgICAqIEBwYXJhbSBleGVjTmFtZSBuYW1lIG9mIHRoZSBzY3JpcHQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlU2NyaXB0KFN0cmluZyBleGVjTmFtZSkgeworICAgICAgICBnZXRSdW5uZXIoKS5leGVjdXRlU2NyaXB0KGV4ZWNOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSBhIHNjcmlwdC4KKyAgICAgKiBAcGFyYW0gZXhlY05hbWUgbmFtZSBvZiB0aGUgc2NyaXB0LgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWx1YXRlU2NyaXB0KFN0cmluZyBleGVjTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0UnVubmVyKCkuZXZhbHVhdGVTY3JpcHQoZXhlY05hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdENvbmRpdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0Q29uZGl0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkM2NlNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdENvbmRpdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29uZGl0aW9uOworCisvKioKKyAqIEEgY29uZGl0aW9uIHRoYXQgbGV0cyB5b3UgaW5jbHVkZSBzY3JpcHQuCisgKiBUaGUgY29uZGl0aW9uIGNvbXBvbmVudCBzZXRzIGEgYmVhbiAic2VsZiIsIHdob3NlIGF0dHJpYnV0ZSAidmFsdWUiCisgKiBtdXN0IGJlIHNldCB0byB0cnVlIGZvciB0aGUgY29uZGl0aW9uIHRvIHN1Y2NlZWQsIGZhbHNlIHRvIGZhaWwuCisgKiBUaGUgZGVmYXVsdCBpcyAnZmFsc2UnCisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRDb25kaXRpb24gZXh0ZW5kcyBBYnN0cmFjdFNjcmlwdENvbXBvbmVudCBpbXBsZW1lbnRzIENvbmRpdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiByZXN1bHQgZmllbGQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsdWUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgY29uZGl0aW9uIHRydWU/CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlCisgICAgICoKKyAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRTY3JpcHRSdW5uZXIoKTsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGV2YWx1YXRlU2NyaXB0KCJhbnRfY29uZGl0aW9uIik7CisgICAgICAgIHJldHVybiByZXN1bHQgaW5zdGFuY2VvZiBCb29sZWFuID8gKChCb29sZWFuKSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpIDogZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbmRpdG9uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25kaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldCB0aGUgdmFsdWUgb2YgdGhlIGNvbmRpdGlvbi4KKyAgICAgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIHNjcmlwdCB0byBwYXNzIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICogSXQgY2FuIGJlIHVzZWQgYnkgYW4gYXR0cmlidXRlLCBpbiB3aGljaCBjYXNlIGl0IHNldHMgdGhlIGRlZmF1bHQKKyAgICAgKiB2YWx1ZQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0IHRoZSBjb25kaXRpb24gdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRGaWx0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Zjc0OGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5Ub2tlbkZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlNjcmlwdFJ1bm5lckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TY3JpcHRSdW5uZXJIZWxwZXI7CisKKy8qKgorICogTW9zdCBvZiB0aGlzIGlzIENBUCAoQ3V0IEFuZCBQYXN0ZSkgZnJvbSB0aGUgU2NyaXB0IHRhc2sKKyAqIFNjcmlwdEZpbHRlciBjbGFzcywgaW1wbGVtZW50cyBUb2tlbkZpbHRlci5GaWx0ZXIKKyAqIGZvciBzY3JpcHRzIHRvIHVzZS4KKyAqIFRoaXMgcHJvdmlkZXMgdGhlIHNhbWUgYmVhbnMgYXMgdGhlIFNjcmlwdCBUYXNrCisgKiB0byBhIHNjcmlwdC4KKyAqIFRoZSBzY3JpcHQgaXMgbWVhbnQgdG8gdXNlIGdldCBzZWxmLnRva2VuIGFuZAorICogc2V0IHNlbGYudG9rZW4gaW4gdGhlIHJlcGx5LgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRGaWx0ZXIgZXh0ZW5kcyBUb2tlbkZpbHRlci5DaGFpbmFibGVSZWFkZXJGaWx0ZXIgeworICAgIC8qKiBzY3JpcHQgcnVubmVyIGhlbHBlciAqLworICAgIHByaXZhdGUgU2NyaXB0UnVubmVySGVscGVyIGhlbHBlciA9IG5ldyBTY3JpcHRSdW5uZXJIZWxwZXIoKTsKKworICAgIC8qKiBzY3JpcHQgcnVubmVyLiAqLworICAgIHByaXZhdGUgU2NyaXB0UnVubmVyQmFzZSAgIHJ1bm5lciA9IG51bGw7CisKKyAgICAvKiogdGhlIHRva2VuIHVzZWQgYnkgdGhlIHNjcmlwdCAqLworICAgIHByaXZhdGUgU3RyaW5nIHRva2VuOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9qZWN0LgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBvd25lciBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBzdXBlci5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBoZWxwZXIuc2V0UHJvamVjdENvbXBvbmVudCh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBsYW5ndWFnZSAocmVxdWlyZWQpLgorICAgICAqCisgICAgICogQHBhcmFtIGxhbmd1YWdlIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbmFtZSBmb3IgdGhlIHNjcmlwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgaGVscGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGluZyBnb2VzIHdyb25nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAocnVubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBydW5uZXIgPSBoZWxwZXIuZ2V0U2NyaXB0UnVubmVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgdG9rZW4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbiB0aGUgc3RyaW5nIGZpbHRlcmVkIGJ5IHRoZSBzY3JpcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb2tlbihTdHJpbmcgdG9rZW4pIHsKKyAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHRva2VuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgZmlsdGVyZWQgYnkgdGhlIHNjcmlwdAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZmlsdGVyIHRoZSB0b2tlbi4KKyAgICAgKiBUaGlzIHNldHMgdGhlIHRva2VuIGluIHRoaXMgb2JqZWN0LCBjYWxscworICAgICAqIHRoZSBzY3JpcHQgYW5kIHJldHVybnMgdGhlIHRva2VuLgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuIHRoZSB0b2tlbiB0byBiZSBmaWx0ZXJlZAorICAgICAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIHRva2VuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIHRva2VuKSB7CisgICAgICAgIGluaXQoKTsKKyAgICAgICAgc2V0VG9rZW4odG9rZW4pOworICAgICAgICBydW5uZXIuZXhlY3V0ZVNjcmlwdCgiYW50X2ZpbHRlciIpOworICAgICAgICByZXR1cm4gZ2V0VG9rZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlIDsgb3B0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIGZpbGUpIHsKKyAgICAgICAgaGVscGVyLnNldFNyYyhmaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NyaXB0IHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBhIGNvbXBvbmVudCBvZiB0aGUgc2NyaXB0IHRleHQgdG8gYmUgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICBoZWxwZXIuYWRkVGV4dCh0ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgdGhlIHNjcmlwdGluZyBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hbmFnZXIoU3RyaW5nIG1hbmFnZXIpIHsKKyAgICAgICAgaGVscGVyLnNldE1hbmFnZXIobWFuYWdlcik7CisgICAgfQorICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggYW4gQW50IFBhdGggb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNlYXJjaCBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBoZWxwZXIuc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gZW1wdHkgUGF0aCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkIGJ5IEFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBoZWxwZXIuY3JlYXRlQ2xhc3NwYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggYnkgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgYSBSZWZlcmVuY2UgdG8gYSBQYXRoIGluc3RhbmNlIHRvIGJlIHVzZWQgYXMgdGhlIGNsYXNzcGF0aAorICAgICAqICAgICAgICAgIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihSZWZlcmVuY2UgcikgeworICAgICAgICBoZWxwZXIuc2V0Q2xhc3NwYXRoUmVmKHIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0TWFwcGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmY3MTE1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0TWFwcGVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFNjcmlwdCBzdXBwb3J0IGF0IG1hcCB0aW1lLgorICogQHNpbmNlIEFudDEuNworICovCitwdWJsaWMgY2xhc3MgU2NyaXB0TWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RTY3JpcHRDb21wb25lbnQgaW1wbGVtZW50cyBGaWxlTmFtZU1hcHBlciB7CisKKworICAgIHByaXZhdGUgQXJyYXlMaXN0IGZpbGVzOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmcm9tIHBhcnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIHJ1bGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbSBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBmcm9tKSB7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0byBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBydWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHRvIGEgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgeworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIGxpc3Qgb2YgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG1hcHBlZCBuYW1lCisgICAgICogQHBhcmFtIG1hcHBpbmcgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNYXBwZWROYW1lKFN0cmluZyBtYXBwaW5nKSB7CisgICAgICAgIGZpbGVzLmFkZChtYXBwaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHRhcmdldCBmaWxlbmFtZShzKSBmb3IgdGhlIGdpdmVuIHNvdXJjZQorICAgICAqIGZpbGUuCisgICAgICogPHAvPgorICAgICAqIDxwPmlmIHRoZSBnaXZlbiBydWxlIGRvZXNuJ3QgYXBwbHkgdG8gdGhlIHNvdXJjZSBmaWxlLCBpbXBsZW1lbnRhdGlvbgorICAgICAqIG11c3QgcmV0dXJuIG51bGwuIFNvdXJjZUZpbGVTY2FubmVyIHdpbGwgdGhlbiBvbWl0IHRoZSBzb3VyY2UgZmlsZSBpbgorICAgICAqIHF1ZXN0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgcmVsYXRpdmUgdG8gc29tZSBnaXZlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncyBpZiB0aGUgcnVsZSBhcHBsaWVzIHRvIHRoZSBzb3VyY2UgZmlsZSwgb3IKKyAgICAgKiAgICAgICAgIG51bGwgaWYgaXQgZG9lcyBub3QuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoU3RyaW5nIHNvdXJjZUZpbGVOYW1lKSB7CisgICAgICAgIGluaXRTY3JpcHRSdW5uZXIoKTsKKyAgICAgICAgZ2V0UnVubmVyKCkuYWRkQmVhbigic291cmNlIiwgc291cmNlRmlsZU5hbWUpOworICAgICAgICBjbGVhcigpOworICAgICAgICBleGVjdXRlU2NyaXB0KCJhbnRfbWFwcGVyIik7CisgICAgICAgIGlmIChmaWxlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBmaWxlcy50b0FycmF5KEVNUFRZX1NUUklOR19BUlJBWSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0U2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTI4ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0U2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlNjcmlwdFJ1bm5lckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TY3JpcHRSdW5uZXJIZWxwZXI7CisKKy8qKgorICogU2VsZWN0b3IgdGhhdCBsZXRzIHlvdSBydW4gYSBzY3JpcHQgd2l0aCBzZWxlY3Rpb24gbG9naWMgaW5saW5lCisgKiBAc2luY2UgQW50MS43CisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRTZWxlY3RvciBleHRlbmRzIEJhc2VTZWxlY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBzY3JpcHQgcnVubmVyIGhlbHBlcgorICAgICAqLworICAgIHByaXZhdGUgU2NyaXB0UnVubmVySGVscGVyIGhlbHBlciA9IG5ldyBTY3JpcHRSdW5uZXJIZWxwZXIoKTsKKworICAgIC8qKgorICAgICAqIHNjcmlwdCBydW5uZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIFNjcmlwdFJ1bm5lckJhc2UgcnVubmVyOworCisgICAgLyoqCisgICAgICogZmllbGRzIHVwZGF0ZWQgZm9yIGV2ZXJ5IHNlbGVjdGlvbgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBiYXNlZGlyOworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lOworICAgIHByaXZhdGUgRmlsZSBmaWxlOworCisgICAgLyoqCisgICAgICogc2VsZWN0ZWQgZmxhZworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvamVjdC4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgb3duZXIgb2YgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgc3VwZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgaGVscGVyLnNldFByb2plY3RDb21wb25lbnQodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSBzY3JpcHRpbmcgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBtYW5hZ2VyKSB7CisgICAgICAgIGhlbHBlci5zZXRNYW5hZ2VyKG1hbmFnZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIGxhbmd1YWdlIChyZXF1aXJlZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBuYW1lIGZvciB0aGUgc2NyaXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICBoZWxwZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgb24gZGVtYW5kLgorICAgICAqCisgICAgICogQHRocm93cyBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgIGlmIHNvbWV0aW5nIGdvZXMgd3JvbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChydW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJ1bm5lciA9IGhlbHBlci5nZXRTY3JpcHRSdW5uZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlIDsgb3B0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhGaWxlIGZpbGUpIHsKKyAgICAgICAgaGVscGVyLnNldFNyYyhmaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NyaXB0IHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBhIGNvbXBvbmVudCBvZiB0aGUgc2NyaXB0IHRleHQgdG8gYmUgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICBoZWxwZXIuYWRkVGV4dCh0ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIGFuIEFudCBQYXRoIG9iamVjdCBjb250YWluaW5nIHRoZSBzZWFyY2ggcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsKKyAgICAgICAgaGVscGVyLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IFBhdGggaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZCBieSBBbnQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICByZXR1cm4gaGVscGVyLmNyZWF0ZUNsYXNzcGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIGJ5IHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIGEgUmVmZXJlbmNlIHRvIGEgUGF0aCBpbnN0YW5jZSB0byBiZSB1c2VkIGFzIHRoZSBjbGFzc3BhdGgKKyAgICAgKiAgICAgICAgICB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgaGVscGVyLnNldENsYXNzcGF0aFJlZihyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNldGJlYW5zIGF0dHJpYnV0ZS4KKyAgICAgKiBJZiB0aGlzIGlzIHRydWUsICZsdDtzY3JpcHQmZ3Q7IHdpbGwgY3JlYXRlIHZhcmlhYmxlcyBpbiB0aGUKKyAgICAgKiBzY3JpcHQgaW5zdGFuY2UgZm9yIGFsbAorICAgICAqIHByb3BlcnRpZXMsIHRhcmdldHMgYW5kIHJlZmVyZW5jZXMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgKiBJdCB0aGlzIGlzIGZhbHNlLCBvbmx5IHRoZSBwcm9qZWN0IGFuZCBzZWxmIHZhcmlhYmxlcyB3aWxsCisgICAgICogYmUgc2V0LgorICAgICAqIFRoZSBkZWZhdWx0IGlzIHRydWUuCisgICAgICogQHBhcmFtIHNldEJlYW5zIHRoZSB2YWx1ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2V0QmVhbnMoYm9vbGVhbiBzZXRCZWFucykgeworICAgICAgICBoZWxwZXIuc2V0U2V0QmVhbnMoc2V0QmVhbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCB0aGF0IGVhY2ggc2VsZWN0b3Igd2lsbCBpbXBsZW1lbnQgdG8gY3JlYXRlIHRoZWlyIHNlbGVjdGlvbgorICAgICAqIGJlaGF2aW91ci4gSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIHNldHVwIG9mIGEgc2VsZWN0b3IsIGl0IGNhbgorICAgICAqIHRocm93IGEgQnVpbGRFeGNlcHRpb24gdG8gaW5kaWNhdGUgdGhlIHByb2JsZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciAgQSBqYXZhLmlvLkZpbGUgb2JqZWN0IGZvciB0aGUgYmFzZSBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY2hlY2sKKyAgICAgKiBAcGFyYW0gZmlsZSAgICAgQSBGaWxlIG9iamVjdCBmb3IgdGhpcyBmaWxlbmFtZQorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZCBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKKyAgICAgICAgaW5pdCgpOworICAgICAgICBzZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgdGhpcy5iYXNlZGlyID0gYmFzZWRpcjsKKyAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOworICAgICAgICBydW5uZXIuYWRkQmVhbigiYmFzZWRpciIsIGJhc2VkaXIpOworICAgICAgICBydW5uZXIuYWRkQmVhbigiZmlsZW5hbWUiLCBmaWxlbmFtZSk7CisgICAgICAgIHJ1bm5lci5hZGRCZWFuKCJmaWxlIiwgZmlsZSk7CisgICAgICAgIHJ1bm5lci5leGVjdXRlU2NyaXB0KCJhbnRfc2VsZWN0b3IiKTsKKyAgICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGJhc2UgZGlyZWN0b3J5CisgICAgICogQHJldHVybiB0aGUgYmFzZSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRCYXNlZGlyKCkgeworICAgICAgICByZXR1cm4gYmFzZWRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlCisgICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgdGhhdCBpcyBjdXJyZW50bHkgYmVlbiB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkgeworICAgICAgICByZXR1cm4gZmlsZW5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBmaWxlIHRoYXQgaXMgY3VycmVudGx5IHRvIGJlIHRlc3RlZAorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgdGhhdCBpcyBjdXJyZW50bHkgYmVlbiB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgeworICAgICAgICByZXR1cm4gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgc3RhdGUgb2Ygc2VsZWN0ZWQgZmxhZworICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgeworICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0IHRoZSBzZWxlY3RlZCBzdGF0ZQorICAgICAqIEludGVuZGVkIGZvciBzY3JpcHQgdXNlLCBub3QgYXMgYW4gQW50IGF0dHJpYnV0ZQorICAgICAqIEBwYXJhbSBzZWxlY3RlZCB0aGUgc2VsZWN0ZWQgc3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7CisgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2RlcGVuZC9DbGFzc2ZpbGVTZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2RlcGVuZC9DbGFzc2ZpbGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M4NzNiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzZmlsZVNldC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmRlcGVuZDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CisKKy8qKgorICogQSBDbGFzc2ZpbGVTZXQgaXMgYSBGaWxlU2V0IHRoYXQgZW5saXN0cyBhbGwgY2xhc3NlcyB0aGF0IGRlcGVuZCBvbiBhCisgKiBjZXJ0YWluIHNldCBvZiByb290IGNsYXNzZXMuCisgKgorICogQ2xhc3NmaWxlU2V0IGV4dGVuZHMgRmlsZVNldCwgaXRzIGluaGVyaXRlZCBwcm9wZXJ0aWVzCisgKiBkZWZpbmluZyB0aGUgZG9tYWluIHNlYXJjaGVkIGZvciBkZXBlbmRlbnQgY2xhc3Nlcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc2ZpbGVTZXQgZXh0ZW5kcyBGaWxlU2V0IHsKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiByb290IGNsYXNzZXMgZm9yIHRoaXMgY2xhc3MgZmlsZSBzZXQuIFRoZXNlIGFyZSB0aGUKKyAgICAgKiBjbGFzc2VzIHdoaWNoIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbGVzZXQgYW5kIHdoaWNoIGFyZSB0aGUKKyAgICAgKiBzdGFydGluZyBwb2ludCBmb3IgdGhlIGRlcGVuZGVuY3kgc2VhcmNoLgorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIHJvb3RDbGFzc2VzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgZmlsZXNldHMgd2hpY2ggY29udGFpbiByb290IGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3Igcm9vdEZpbGVTZXRzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogSW5uZXIgY2xhc3MgdXNlZCB0byBjb250YWluIGluZm8gYWJvdXQgcm9vdCBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhc3NSb290IHsKKyAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSByb290IGNsYXNzICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJvb3RDbGFzczsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSByb290IGNsYXNzIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByb290IGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLnJvb3RDbGFzcyA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSByb290IGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByb290IGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcm9vdENsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NmaWxlU2V0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbGVzZXQgdG8gd2hpY2ggY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIHJvb3QgY2xhc3NlcyB1c2VkIHRvCisgICAgICogZHJpdmUgdGhlIHNlYXJjaCBmcm9tIGNsYXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdEZpbGVTZXQgYSByb290IGZpbGUgc2V0IHRvIGJlIHVzZWQgdG8gc2VhcmNoIGZvciBkZXBlbmRlbnQKKyAgICAgKiBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJvb3RGaWxlc2V0KEZpbGVTZXQgcm9vdEZpbGVTZXQpIHsKKyAgICAgICAgcm9vdEZpbGVTZXRzLmFkZEVsZW1lbnQocm9vdEZpbGVTZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIENsYXNzZmlsZVNldCBmcm9tIGFub3RoZXIgQ2xhc3NmaWxlU2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIG90aGVyIGNsYXNzZmlsZXNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NmaWxlU2V0KENsYXNzZmlsZVNldCBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgICAgICByb290Q2xhc3NlcyA9IChWZWN0b3IpIHMucm9vdENsYXNzZXMuY2xvbmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJvb3QgY2xhc3MgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3RDbGFzcyB0aGUgbmFtZSBvZiB0aGUgcm9vdCBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb290Q2xhc3MoU3RyaW5nIHJvb3RDbGFzcykgeworICAgICAgICByb290Q2xhc3Nlcy5hZGRFbGVtZW50KHJvb3RDbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBEaXJlY3RvcnlTY2FubmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEZpbGVTZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdCB1c2VkIHRvIHJlc29sdmUgZGlycywgZXRjLgorICAgICAqCisgICAgICogQHJldHVybiBhIGRlcGVuZGVuY3kgc2Nhbm5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyZWN0b3J5U2Nhbm5lciBnZXREaXJlY3RvcnlTY2FubmVyKFByb2plY3QgcCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXREaXJlY3RvcnlTY2FubmVyKHApOworICAgICAgICB9CisgICAgICAgIFZlY3RvciBhbGxSb290Q2xhc3NlcyA9IChWZWN0b3IpIHJvb3RDbGFzc2VzLmNsb25lKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHJvb3RGaWxlU2V0cy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgRmlsZVNldCBhZGRpdGlvbmFsUm9vdFNldCA9IChGaWxlU2V0KSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGFkZGl0aW9uYWxTY2FubmVyCisgICAgICAgICAgICAgICAgPSBhZGRpdGlvbmFsUm9vdFNldC5nZXREaXJlY3RvcnlTY2FubmVyKHApOworICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBhZGRpdGlvbmFsU2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVuZHNXaXRoKCIuY2xhc3MiKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NGaWxlUGF0aCA9IFN0cmluZ1V0aWxzLnJlbW92ZVN1ZmZpeChmaWxlc1tpXSwgIi5jbGFzcyIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICA9IGNsYXNzRmlsZVBhdGgucmVwbGFjZSgnLycsICcuJykucmVwbGFjZSgnXFwnLCAnLicpOworICAgICAgICAgICAgICAgICAgICBhbGxSb290Q2xhc3Nlcy5hZGRFbGVtZW50KGNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgcGFyZW50U2Nhbm5lciA9IHN1cGVyLmdldERpcmVjdG9yeVNjYW5uZXIocCk7CisgICAgICAgIERlcGVuZFNjYW5uZXIgc2Nhbm5lciA9IG5ldyBEZXBlbmRTY2FubmVyKHBhcmVudFNjYW5uZXIpOworICAgICAgICBzY2FubmVyLnNldEJhc2VkaXIoZ2V0RGlyKHApKTsKKyAgICAgICAgc2Nhbm5lci5zZXRSb290Q2xhc3NlcyhhbGxSb290Q2xhc3Nlcyk7CisgICAgICAgIHNjYW5uZXIuc2NhbigpOworICAgICAgICByZXR1cm4gc2Nhbm5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXN0ZWQgcm9vdCBjbGFzcyBkZWZpbml0aW9uIHRvIHRoaXMgY2xhc3MgZmlsZSBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCB0aGUgY29uZmlndXJlZCBjbGFzcyByb290LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRSb290KENsYXNzUm9vdCByb290KSB7CisgICAgICAgIHJvb3RDbGFzc2VzLmFkZEVsZW1lbnQocm9vdC5nZXRDbGFzc25hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvbmUgdGhpcyBkYXRhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY2xvbmUgb2YgdGhlIGNsYXNzIGZpbGUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NmaWxlU2V0KGlzUmVmZXJlbmNlKCkKKyAgICAgICAgICAgID8gKENsYXNzZmlsZVNldCkgKGdldFJlZihnZXRQcm9qZWN0KCkpKSA6IHRoaXMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0RlcGVuZFNjYW5uZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmRTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhODFmNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmRTY2FubmVyLmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuZGVwZW5kOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLkRlcGVuZGVuY3lBbmFseXplcjsKKworCisvKioKKyAqIERpcmVjdG9yeVNjYW5uZXIgZm9yIGZpbmRpbmcgY2xhc3MgZGVwZW5kZW5jaWVzLgorICovCitwdWJsaWMgY2xhc3MgRGVwZW5kU2Nhbm5lciBleHRlbmRzIERpcmVjdG9yeVNjYW5uZXIgeworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhbmFseXplciB0byB1c2UgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FOQUxZWkVSX0NMQVNTCisgICAgICAgID0gIm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLmJjZWwuRnVsbEFuYWx5emVyIjsKKworICAgIC8qKgorICAgICAqIFRoZSByb290IGNsYXNzZXMgdG8gZHJpdmUgdGhlIHNlYXJjaCBmb3IgZGVwZW5kZW50IGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3Igcm9vdENsYXNzZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZXMgb2YgdGhlIGNsYXNzZXMgdG8gaW5jbHVkZSBpbiB0aGUgZmlsZXNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBpbmNsdWRlZDsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJlbnQgc2Nhbm5lciB3aGljaCBnaXZlcyB0aGUgYmFzaWMgc2V0IG9mIGZpbGVzLiBPbmx5IGZpbGVzIHdoaWNoCisgICAgICogYXJlIGluIHRoaXMgc2V0IGFuZCB3aGljaCBjYW4gYmUgcmVhY2hlZCBmcm9tIGEgcm9vdCBjbGFzcyB3aWxsIGVuZAorICAgICAqIHVwIGJlaW5nIGluY2x1ZGVkIGluIHRoZSByZXN1bHQgc2V0LgorICAgICAqLworICAgIHByaXZhdGUgRGlyZWN0b3J5U2Nhbm5lciBwYXJlbnRTY2FubmVyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgRGVwZW5kU2Nhbm5lciwgdXNpbmcgdGhlIGdpdmVuIHNjYW5uZXIgdG8gcHJvdmlkZSB0aGUgYmFzaWMKKyAgICAgKiBzZXQgb2YgZmlsZXMgZnJvbSB3aGljaCBjbGFzcyBmaWxlcyBjb21lLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudFNjYW5uZXIgdGhlIERpcmVjdG9yeVNjYW5uZXIgd2hpY2ggcmV0dXJucyB0aGUgZmlsZXMgZnJvbQorICAgICAqICAgICAgICB3aGljaCBjbGFzcyBmaWxlcyBtdXN0IGNvbWUuCisgICAgICovCisgICAgcHVibGljIERlcGVuZFNjYW5uZXIoRGlyZWN0b3J5U2Nhbm5lciBwYXJlbnRTY2FubmVyKSB7CisgICAgICAgIHRoaXMucGFyZW50U2Nhbm5lciA9IHBhcmVudFNjYW5uZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcm9vdCBjbGFzc2VzIHRvIGJlIHVzZWQgdG8gZHJpdmUgdGhlIHNjYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdENsYXNzZXMgdGhlIHJvb3RDbGFzc2VzIHRvIGJlIHVzZWQgZm9yIHRoaXMgc2Nhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Um9vdENsYXNzZXMoVmVjdG9yIHJvb3RDbGFzc2VzKSB7CisgICAgICAgIHRoaXMucm9vdENsYXNzZXMgPSByb290Q2xhc3NlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBjbGFzcyBmaWxlcyBvbiB3aGljaCBiYXNlQ2xhc3MgZGVwZW5kcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZWRGaWxlcygpIHsKKyAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2dldEluY2x1ZGVkRmlsZXNDb3VudCgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmlsZXNbaV0gPSAoU3RyaW5nKSBpbmNsdWRlZC5lbGVtZW50QXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEluY2x1ZGVkRmlsZXNDb3VudCgpIHsKKyAgICAgICAgaWYgKGluY2x1ZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5jbHVkZWQuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW5zIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgZmlsZXMgb24gd2hpY2ggYmFzZUNsYXNzIGRlcGVuZHMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aGVuIGJhc2VkaXIgd2FzIHNldCBpbmNvcnJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2NhbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgU3RyaW5nIGFuYWx5emVyQ2xhc3NOYW1lID0gREVGQVVMVF9BTkFMWVpFUl9DTEFTUzsKKyAgICAgICAgRGVwZW5kZW5jeUFuYWx5emVyIGFuYWx5emVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGFuYWx5emVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGFuYWx5emVyQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGFuYWx5emVyID0gKERlcGVuZGVuY3lBbmFseXplcikgYW5hbHl6ZXJDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBkZXBlbmRlbmN5IGFuYWx5emVyOiAiCisgICAgICAgICAgICAgICAgKyBhbmFseXplckNsYXNzTmFtZSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgYW5hbHl6ZXIuYWRkQ2xhc3NQYXRoKG5ldyBQYXRoKG51bGwsIGJhc2VkaXIuZ2V0UGF0aCgpKSk7CisKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gcm9vdENsYXNzZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyByb290Q2xhc3MgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBhbmFseXplci5hZGRSb290Q2xhc3Mocm9vdENsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBFbnVtZXJhdGlvbiBlID0gYW5hbHl6ZXIuZ2V0Q2xhc3NEZXBlbmRlbmNpZXMoKTsKKworICAgICAgICBTdHJpbmdbXSBwYXJlbnRGaWxlcyA9IHBhcmVudFNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICBIYXNodGFibGUgcGFyZW50U2V0ID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmVudEZpbGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBwYXJlbnRTZXQucHV0KHBhcmVudEZpbGVzW2ldLCBwYXJlbnRGaWxlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBjbGFzc25hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgIi5jbGFzcyI7CisgICAgICAgICAgICBGaWxlIGRlcEZpbGUgPSBuZXcgRmlsZShiYXNlZGlyLCBmaWxlbmFtZSk7CisgICAgICAgICAgICBpZiAoZGVwRmlsZS5leGlzdHMoKSAmJiBwYXJlbnRTZXQuY29udGFpbnNLZXkoZmlsZW5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBpbmNsdWRlZAorICAgICAgICAgICAgICAgIGluY2x1ZGVkLmFkZEVsZW1lbnQoZmlsZW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBEaXJlY3RvcnlTY2FubmVyI2FkZERlZmF1bHRFeGNsdWRlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERlZmF1bHRFeGNsdWRlcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIERpcmVjdG9yeVNjYW5uZXIjZ2V0RXhjbHVkZWREaXJlY3RvcmllcworICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZERpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIERpcmVjdG9yeVNjYW5uZXIjZ2V0RXhjbHVkZWRGaWxlcworICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZEZpbGVzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIERpcmVjdG9yeVNjYW5uZXIjZ2V0SW5jbHVkZWREaXJlY3RvcmllcworICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIERpcmVjdG9yeVNjYW5uZXIjZ2V0SW5jbHVkZWREaXJzQ291bnQKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgaW50IGdldEluY2x1ZGVkRGlyc0NvdW50KCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIERpcmVjdG9yeVNjYW5uZXIjZ2V0Tm90SW5jbHVkZWREaXJlY3RvcmllcworICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXROb3RJbmNsdWRlZERpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIERpcmVjdG9yeVNjYW5uZXIjZ2V0Tm90SW5jbHVkZWRGaWxlcworICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXROb3RJbmNsdWRlZEZpbGVzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIERpcmVjdG9yeVNjYW5uZXIjc2V0RXhjbHVkZXMKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmdbXSBleGNsdWRlcykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgRGlyZWN0b3J5U2Nhbm5lciNzZXRJbmNsdWRlcworICAgICAqLworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKFN0cmluZ1tdIGluY2x1ZGVzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBEaXJlY3RvcnlTY2FubmVyI3NldENhc2VTZW5zaXRpdmUKKyAgICAgKi8KKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvQXJjLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9BcmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjY0ZDFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvQXJjLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2U7CisKK2ltcG9ydCBqYXZheC5tZWRpYS5qYWkuUGxhbmFySW1hZ2U7CitpbXBvcnQgamF2YS5hd3QuQmFzaWNTdHJva2U7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLkFyYzJEOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CisKKy8qKgorICogRHJhdyBhbiBhcmMuCisgKi8KK3B1YmxpYyBjbGFzcyBBcmMgZXh0ZW5kcyBCYXNpY1NoYXBlIGltcGxlbWVudHMgRHJhd09wZXJhdGlvbiB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICBwcm90ZWN0ZWQgaW50IHdpZHRoID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IGhlaWdodCA9IDA7CisgICAgcHJvdGVjdGVkIGludCBzdGFydCA9IDA7CisgICAgcHJvdGVjdGVkIGludCBzdG9wID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IHR5cGUgPSBBcmMyRC5PUEVOOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGFyYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgYXJjLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KSB7CisgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RhcnQgb2YgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBhcmMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IHN0YXJ0KSB7CisgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0b3Agb2YgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gc3RvcCB0aGUgc3RvcCBvZiB0aGUgYXJjLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3AoaW50IHN0b3ApIHsKKyAgICAgICAgdGhpcy5zdG9wID0gc3RvcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHR5cGUgb2YgYXJjLgorICAgICAqIEBwYXJhbSBzdHJUeXBlIHRoZSB0eXBlIHRvIHVzZSAtIG9wZW4sIHBpZSBvciBjaG9yZC4KKyAgICAgKiBAdG9kbyByZWZhY3RvciB1c2luZyBhbiBFbnVtZXJhdGVkQXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgc3RyVHlwZSkgeworICAgICAgICBpZiAoc3RyVHlwZS50b0xvd2VyQ2FzZSgpLmVxdWFscygib3BlbiIpKSB7CisgICAgICAgICAgICB0eXBlID0gQXJjMkQuT1BFTjsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJUeXBlLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJwaWUiKSkgeworICAgICAgICAgICAgdHlwZSA9IEFyYzJELlBJRTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJUeXBlLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJjaG9yZCIpKSB7CisgICAgICAgICAgICB0eXBlID0gQXJjMkQuQ0hPUkQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgUGxhbmFySW1hZ2UgZXhlY3V0ZURyYXdPcGVyYXRpb24oKSB7CisgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBuZXcgQnVmZmVyZWRJbWFnZSh3aWR0aCArIChzdHJva2Vfd2lkdGggKiAyKSwKKyAgICAgICAgICAgIGhlaWdodCArIChzdHJva2Vfd2lkdGggKiAyKSwgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1JfUFJFKTsKKworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisKKyAgICAgICAgaWYgKCFzdHJva2UuZXF1YWxzKCJ0cmFuc3BhcmVudCIpKSB7CisgICAgICAgICAgICBCYXNpY1N0cm9rZSBiU3Ryb2tlID0gbmV3IEJhc2ljU3Ryb2tlKHN0cm9rZV93aWR0aCk7CisgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShzdHJva2UpKTsKKyAgICAgICAgICAgIGdyYXBoaWNzLnNldFN0cm9rZShiU3Ryb2tlKTsKKyAgICAgICAgICAgIGdyYXBoaWNzLmRyYXcobmV3IEFyYzJELkRvdWJsZShzdHJva2Vfd2lkdGgsIHN0cm9rZV93aWR0aCwgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LCBzdGFydCwgc3RvcCwgdHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmaWxsLmVxdWFscygidHJhbnNwYXJlbnQiKSkgeworICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Q29sb3IoQ29sb3JNYXBwZXIuZ2V0Q29sb3JCeU5hbWUoZmlsbCkpOworICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbChuZXcgQXJjMkQuRG91YmxlKHN0cm9rZV93aWR0aCwgc3Ryb2tlX3dpZHRoLAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHN0YXJ0LCBzdG9wLCB0eXBlKSk7CisgICAgICAgIH0KKworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBJbWFnZU9wZXJhdGlvbiBpbnN0ciA9ICgoSW1hZ2VPcGVyYXRpb24pIGluc3RydWN0aW9ucy5lbGVtZW50QXQoaSkpOworICAgICAgICAgICAgaWYgKGluc3RyIGluc3RhbmNlb2YgRHJhd09wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIFBsYW5hckltYWdlIGltZyA9ICgoRHJhd09wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVEcmF3T3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0ltYWdlKGltZy5nZXRBc0J1ZmZlcmVkSW1hZ2UoKSwgbnVsbCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RyIGluc3RhbmNlb2YgVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MgPSAoR3JhcGhpY3MyRCkgYmkuZ2V0R3JhcGhpY3MoKTsKKyAgICAgICAgICAgICAgICBQbGFuYXJJbWFnZSBpbWFnZSA9ICgoVHJhbnNmb3JtT3BlcmF0aW9uKSBpbnN0cikKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpKTsKKyAgICAgICAgICAgICAgICBiaSA9IGltYWdlLmdldEFzQnVmZmVyZWRJbWFnZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBQbGFuYXJJbWFnZS53cmFwUmVuZGVyZWRJbWFnZShiaSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvQmFzaWNTaGFwZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvQmFzaWNTaGFwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjExM2EKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9CYXNpY1NoYXBlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZTsKKworCisvKiogRHJhdyBhIGJhc2ljIHNoYXBlICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzaWNTaGFwZSBleHRlbmRzIEltYWdlT3BlcmF0aW9uIGltcGxlbWVudHMgRHJhd09wZXJhdGlvbiB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICAvLyBDaGVja1N0eWxlOk1lbWJlck5hbWVDaGVjayBPRkYgLSBiYworICAgIHByb3RlY3RlZCBpbnQgc3Ryb2tlX3dpZHRoID0gMDsKKyAgICAvLyBDaGVja1N0eWxlOk1lbWJlck5hbWVDaGVjayBPTgorICAgIHByb3RlY3RlZCBTdHJpbmcgZmlsbCA9ICJ0cmFuc3BhcmVudCI7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzdHJva2UgPSAiYmxhY2siOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmlsbCBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGNvbCB0aGUgY29sb3IgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGwoU3RyaW5nIGNvbCkgeworICAgICAgICBmaWxsID0gY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3Ryb2tlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2xvciB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3Ryb2tlKFN0cmluZyBjb2wpIHsKKyAgICAgICAgc3Ryb2tlID0gY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3Ryb2tlIHdpZHRoIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJva2V3aWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgc3Ryb2tlX3dpZHRoID0gd2lkdGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvQ29sb3JNYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0NvbG9yTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwMWE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0NvbG9yTWFwcGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2U7CisKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKKworLyoqCisgKgorICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZS5JbWFnZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29sb3JNYXBwZXIgeworICAgIC8qKiBwcml2YXRlIGNvbnN0cnVjdG9yIGZvciBVdGlsaXR5IGNsYXNzICovCisgICAgcHJpdmF0ZSBDb2xvck1hcHBlcigpIHsKKyAgICB9CisKKyAgICAvKiogYmxhY2sgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQkxBQ0sgPSAiYmxhY2siOworICAgIC8qKiBibHVlIHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0JMVUUgPSAiYmx1ZSI7CisgICAgLyoqIGN5YW4gc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQ1lBTiA9ICJjeWFuIjsKKyAgICAvKiogYmxhY2sgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfREFSS0dSQVkgPSAiZGFya2dyYXkiOworICAgIC8qKiBncmF5IHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0dSQVkgPSAiZ3JheSI7CisgICAgLyoqIGxpZ2h0Z3JheSBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9MSUdIVEdSQVkgPSAibGlnaHRncmF5IjsKKyAgICAvLyBHb3R0YSBhdGxlYXN0IHB1dCBpbiB0aGUgcHJvcGVyIHNwZWxsaW5nIDotUAorICAgIC8qKiBkYXJrZ3JleSBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9EQVJLR1JFWSA9ICJkYXJrZ3JleSI7CisgICAgLyoqIGdyZXkgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfR1JFWSA9ICJncmV5IjsKKyAgICAvKiogbGlnaHRncmV5IHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0xJR0hUR1JFWSA9ICJsaWdodGdyZXkiOworICAgIC8qKiBncmVlbiBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9HUkVFTiA9ICJncmVlbiI7CisgICAgLyoqIG1hZ2VudGEgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfTUFHRU5UQSA9ICJtYWdlbnRhIjsKKyAgICAvKiogb3JhbmdlIHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX09SQU5HRSA9ICJvcmFuZ2UiOworICAgIC8qKiBwaW5rIHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX1BJTksgPSAicGluayI7CisgICAgLyoqIHJlZyBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9SRUQgPSAicmVkIjsKKyAgICAvKiogd2hpdGUgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfV0hJVEUgPSAid2hpdGUiOworICAgIC8qKiB5ZWxsb3cgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfWUVMTE9XID0gInllbGxvdyI7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgY29sb3IgbmFtZSB0byBhIGNvbG9yIHZhbHVlLgorICAgICAqIEBwYXJhbSBjb2xvck5hbWUgYSBzdHJpbmcgcmVwciBvZiB0aGUgY29sb3IuCisgICAgICogQHJldHVybiB0aGUgY29sb3IgdmFsdWUuCisgICAgICogQHRvZG8gcmVmYWN0b3IgdG8gdXNlIGFuIEVudW1lcmF0ZWRBdHRyaWJ1dGUgKG1heWJlPykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldENvbG9yQnlOYW1lKFN0cmluZyBjb2xvck5hbWUpIHsKKyAgICAgICAgY29sb3JOYW1lID0gY29sb3JOYW1lLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgaWYgKGNvbG9yTmFtZS5lcXVhbHMoQ09MT1JfQkxBQ0spKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sb3IuYmxhY2s7CisgICAgICAgIH0gZWxzZSBpZiAoY29sb3JOYW1lLmVxdWFscyhDT0xPUl9CTFVFKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbG9yLmJsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoY29sb3JOYW1lLmVxdWFscyhDT0xPUl9DWUFOKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbG9yLmN5YW47CisgICAgICAgIH0gZWxzZSBpZiAoY29sb3JOYW1lLmVxdWFscyhDT0xPUl9EQVJLR1JBWSkgfHwgY29sb3JOYW1lLmVxdWFscyhDT0xPUl9EQVJLR1JFWSkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5kYXJrR3JheTsKKyAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzKENPTE9SX0dSQVkpIHx8IGNvbG9yTmFtZS5lcXVhbHMoQ09MT1JfR1JFWSkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5ncmF5OworICAgICAgICB9IGVsc2UgaWYgKGNvbG9yTmFtZS5lcXVhbHMoQ09MT1JfTElHSFRHUkFZKSB8fCBjb2xvck5hbWUuZXF1YWxzKENPTE9SX0xJR0hUR1JFWSkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5saWdodEdyYXk7CisgICAgICAgIH0gZWxzZSBpZiAoY29sb3JOYW1lLmVxdWFscyhDT0xPUl9HUkVFTikpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5ncmVlbjsKKyAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzKENPTE9SX01BR0VOVEEpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sb3IubWFnZW50YTsKKyAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzKENPTE9SX09SQU5HRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5vcmFuZ2U7CisgICAgICAgIH0gZWxzZSBpZiAoY29sb3JOYW1lLmVxdWFscyhDT0xPUl9QSU5LKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbG9yLnBpbms7CisgICAgICAgIH0gZWxzZSBpZiAoY29sb3JOYW1lLmVxdWFscyhDT0xPUl9SRUQpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sb3IucmVkOworICAgICAgICB9IGVsc2UgaWYgKGNvbG9yTmFtZS5lcXVhbHMoQ09MT1JfV0hJVEUpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sb3Iud2hpdGU7CisgICAgICAgIH0gZWxzZSBpZiAoY29sb3JOYW1lLmVxdWFscyhDT0xPUl9ZRUxMT1cpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sb3IueWVsbG93OworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xvci5ibGFjazsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0RyYXcuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0RyYXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDZhZTQxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvRHJhdy5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlOworCitpbXBvcnQgamF2YXgubWVkaWEuamFpLlBsYW5hckltYWdlOworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKKworLyoqCisgKgorICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZS5JbWFnZQorICovCitwdWJsaWMgY2xhc3MgRHJhdyBleHRlbmRzIFRyYW5zZm9ybU9wZXJhdGlvbiB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICBwcm90ZWN0ZWQgaW50IHhsb2MgPSAwOworICAgIHByb3RlY3RlZCBpbnQgeWxvYyA9IDA7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgWCBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0geCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhsb2MoaW50IHgpIHsKKyAgICAgICAgeGxvYyA9IHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBZIGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSB5IHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WWxvYyhpbnQgeSkgeworICAgICAgICB5bG9jID0geTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZWN0YW5nbGUoUmVjdGFuZ2xlIHJlY3QpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChyZWN0KTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFRleHQgdGV4dCkgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKHRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbGxpcHNlLgorICAgICAqIEBwYXJhbSBlbGlwIHRoZSBlbGxpcHNlIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFbGxpcHNlKEVsbGlwc2UgZWxpcCkgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGVsaXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhcmMuCisgICAgICogQHBhcmFtIGFyYyB0aGUgYXJjIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBcmMoQXJjIGFyYykgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGFyYyk7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIFBsYW5hckltYWdlIGV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oUGxhbmFySW1hZ2UgaW1hZ2UpIHsKKyAgICAgICAgQnVmZmVyZWRJbWFnZSBiaSA9IGltYWdlLmdldEFzQnVmZmVyZWRJbWFnZSgpOworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEltYWdlT3BlcmF0aW9uIGluc3RyID0gKChJbWFnZU9wZXJhdGlvbikgaW5zdHJ1Y3Rpb25zLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgUGxhbmFySW1hZ2Ugb3AgPSAoKERyYXdPcGVyYXRpb24pIGluc3RyKS5leGVjdXRlRHJhd09wZXJhdGlvbigpOworICAgICAgICAgICAgICAgIGxvZygiXHREcmF3aW5nIHRvIHg9IiArIHhsb2MgKyAiIHk9IiArIHlsb2MpOworICAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdJbWFnZShvcC5nZXRBc0J1ZmZlcmVkSW1hZ2UoKSwgbnVsbCwgeGxvYywgeWxvYyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RyIGluc3RhbmNlb2YgVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgUGxhbmFySW1hZ2Ugb3AKKyAgICAgICAgICAgICAgICAgICAgPSAoKFRyYW5zZm9ybU9wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24obnVsbCk7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBjaGlsZCA9IG9wLmdldEFzQnVmZmVyZWRJbWFnZSgpOworICAgICAgICAgICAgICAgIGxvZygiXHREcmF3aW5nIHRvIHg9IiArIHhsb2MgKyAiIHk9IiArIHlsb2MpOworICAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdJbWFnZShjaGlsZCwgbnVsbCwgeGxvYywgeWxvYyk7CisgICAgICAgICAgICAgICAgUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGltYWdlID0gUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpOworCisgICAgICAgIHJldHVybiBpbWFnZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9EcmF3T3BlcmF0aW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9EcmF3T3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2NzM2YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0RyYXdPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlOworCitpbXBvcnQgamF2YXgubWVkaWEuamFpLlBsYW5hckltYWdlOworCisvKioKKyAqIEludGVyZmFjZSB3aGljaCByZXByZXNlbnRzIGFuIE9wZXJhdGlvbiB3aGljaCBpcyAiZHJhd2FibGUiLCBzdWNoCisgKiBhcyBhIFJlY3RhbmdsZSwgQ2lyY2xlIG9yIFRleHQuICBUaGUgT3BlcmF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvcgorICogY3JlYXRpbmcgaXRzIG93biBpbWFnZSBidWZmZXIgYW5kIGRyYXdpbmcgaXRzZWxmIGludG8gaXQsIHRoZW4KKyAqIHdyYXBwaW5nIGFuZCByZXR1cm5pbmcgaXQgYXMgYSBQbGFuYXJJbWFnZS4gIFRoaXMgYWxsb3dzIG11bHRpYmxlCisgKiAiZHJhd2FibGUiIG9iamVjdHMgdG8gYmUgbmVzdGVkLgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2UKKyAqLworcHVibGljIGludGVyZmFjZSBEcmF3T3BlcmF0aW9uIHsKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdCBtZXRob2Qgd2hpY2ggaXMgaW50ZW5kZWQgdG8gY3JlYXRlIGFuIGltYWdlIGJ1ZmZlcgorICAgICAqIGFuZCByZXR1cm4gaXQgc28gaXQgY2FuIGJlIGRyYXduIGludG8gYW5vdGhlciBvYmplY3QuICBVc2UKKyAgICAgKiBhbiBBbHBoYSBjaGFubmVsIGZvciBhICJ0cmFuc3BhcmVudCIgYmFja2dyb3VuZC4KKyAgICAgKiBAcmV0dXJuIGEgcGxhbmFyIGltYWdlCisgICAgICovCisgICAgUGxhbmFySW1hZ2UgZXhlY3V0ZURyYXdPcGVyYXRpb24oKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0VsbGlwc2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0VsbGlwc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDcwMWUxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvRWxsaXBzZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2U7CisKK2ltcG9ydCBqYXZheC5tZWRpYS5qYWkuUGxhbmFySW1hZ2U7CitpbXBvcnQgamF2YS5hd3QuQmFzaWNTdHJva2U7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLkVsbGlwc2UyRDsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworCisvKioKKyAqIERyYXcgYW4gZWxsaXBzZS4KKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2UKKyAqLworcHVibGljIGNsYXNzIEVsbGlwc2UgZXh0ZW5kcyBCYXNpY1NoYXBlIGltcGxlbWVudHMgRHJhd09wZXJhdGlvbiB7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKyAgICBwcm90ZWN0ZWQgaW50IHdpZHRoID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IGhlaWdodCA9IDA7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd2lkdGguCisgICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZWxpcHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpZHRoKGludCB3aWR0aCkgeworICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBoZWlnaHQuCisgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBlbGlwc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKKyAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIFBsYW5hckltYWdlIGV4ZWN1dGVEcmF3T3BlcmF0aW9uKCkgeworICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2Uod2lkdGgsIGhlaWdodCwgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1JfUFJFKTsKKworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisKKyAgICAgICAgaWYgKCFzdHJva2UuZXF1YWxzKCJ0cmFuc3BhcmVudCIpKSB7CisgICAgICAgICAgICBCYXNpY1N0cm9rZSBiU3Ryb2tlID0gbmV3IEJhc2ljU3Ryb2tlKHN0cm9rZV93aWR0aCk7CisgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShzdHJva2UpKTsKKyAgICAgICAgICAgIGdyYXBoaWNzLnNldFN0cm9rZShiU3Ryb2tlKTsKKyAgICAgICAgICAgIGdyYXBoaWNzLmRyYXcobmV3IEVsbGlwc2UyRC5Eb3VibGUoMCwgMCwgd2lkdGgsIGhlaWdodCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmaWxsLmVxdWFscygidHJhbnNwYXJlbnQiKSkgeworICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Q29sb3IoQ29sb3JNYXBwZXIuZ2V0Q29sb3JCeU5hbWUoZmlsbCkpOworICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbChuZXcgRWxsaXBzZTJELkRvdWJsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgIH0KKworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBJbWFnZU9wZXJhdGlvbiBpbnN0ciA9ICgoSW1hZ2VPcGVyYXRpb24pIGluc3RydWN0aW9ucy5lbGVtZW50QXQoaSkpOworICAgICAgICAgICAgaWYgKGluc3RyIGluc3RhbmNlb2YgRHJhd09wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIFBsYW5hckltYWdlIGltZyA9ICgoRHJhd09wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVEcmF3T3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0ltYWdlKGltZy5nZXRBc0J1ZmZlcmVkSW1hZ2UoKSwgbnVsbCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RyIGluc3RhbmNlb2YgVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MgPSAoR3JhcGhpY3MyRCkgYmkuZ2V0R3JhcGhpY3MoKTsKKyAgICAgICAgICAgICAgICBQbGFuYXJJbWFnZSBpbWFnZSA9ICgoVHJhbnNmb3JtT3BlcmF0aW9uKSBpbnN0cikKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpKTsKKyAgICAgICAgICAgICAgICBiaSA9IGltYWdlLmdldEFzQnVmZmVyZWRJbWFnZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBQbGFuYXJJbWFnZS53cmFwUmVuZGVyZWRJbWFnZShiaSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2VPcGVyYXRpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0ltYWdlT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2Yzg0OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0ltYWdlT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRhdGFUeXBlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2UKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlT3BlcmF0aW9uIGV4dGVuZHMgRGF0YVR5cGUgeworICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBWZWN0b3IgaW5zdHJ1Y3Rpb25zID0gbmV3IFZlY3RvcigpOworICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogQWRkIGEgcm90YXRlIHRvIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIGluc3RyIHRoZSByb3RhdGUgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJvdGF0ZShSb3RhdGUgaW5zdHIpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChpbnN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZHJhdyB0byB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBpbnN0ciB0aGUgZHJhdyB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRHJhdyhEcmF3IGluc3RyKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQoaW5zdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHJlY3RhbmdsZSB0byB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBpbnN0ciB0aGUgcmVjdGFuZ2xlIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZWN0YW5nbGUoUmVjdGFuZ2xlIGluc3RyKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQoaW5zdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0ZXh0IHRvIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIGluc3RyIHRoZSB0ZXh0IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFRleHQgaW5zdHIpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChpbnN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2NhbGUgdG8gdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gaW5zdHIgdGhlIHNjYWxlIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTY2FsZShTY2FsZSBpbnN0cikgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGluc3RyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9SZWN0YW5nbGUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1JlY3RhbmdsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjA0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9SZWN0YW5nbGUuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZTsKKworaW1wb3J0IGphdmF4Lm1lZGlhLmphaS5QbGFuYXJJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5CYXNpY1N0cm9rZTsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CisKKy8qKgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2UKKyAqLworcHVibGljIGNsYXNzIFJlY3RhbmdsZSBleHRlbmRzIEJhc2ljU2hhcGUgaW1wbGVtZW50cyBEcmF3T3BlcmF0aW9uIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBpbnQgd2lkdGggPSAwOworICAgIHByb3RlY3RlZCBpbnQgaGVpZ2h0ID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IGFyY3dpZHRoID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IGFyY2hlaWdodCA9IDA7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd2lkdGguCisgICAgICogQHBhcmFtIHcgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgdykgeworICAgICAgICB3aWR0aCA9IHc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBoZWlnaHQuCisgICAgICogQHBhcmFtIGggdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGgpIHsKKyAgICAgICAgaGVpZ2h0ID0gaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFyYyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gdyB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyY3dpZHRoKGludCB3KSB7CisgICAgICAgIGFyY3dpZHRoID0gdzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFyYyBoZWlnaHQuCisgICAgICogQHBhcmFtIGggdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcmNoZWlnaHQoaW50IGgpIHsKKyAgICAgICAgYXJjaGVpZ2h0ID0gaDsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgUGxhbmFySW1hZ2UgZXhlY3V0ZURyYXdPcGVyYXRpb24oKSB7CisgICAgICAgIGxvZygiXHRDcmVhdGluZyBSZWN0YW5nbGUgdz0iICsgd2lkdGggKyAiIGg9IiArIGhlaWdodCArICIgYXJjdz0iCisgICAgICAgICAgICArIGFyY3dpZHRoICsgIiBhcmNoPSIgKyBhcmNoZWlnaHQpOworICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2Uod2lkdGgsIGhlaWdodCwgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1JfUFJFKTsKKworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisKKyAgICAgICAgaWYgKCFzdHJva2UuZXF1YWxzKCJ0cmFuc3BhcmVudCIpKSB7CisgICAgICAgICAgICBCYXNpY1N0cm9rZSBiU3Ryb2tlID0gbmV3IEJhc2ljU3Ryb2tlKHN0cm9rZV93aWR0aCk7CisgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShzdHJva2UpKTsKKyAgICAgICAgICAgIGdyYXBoaWNzLnNldFN0cm9rZShiU3Ryb2tlKTsKKworICAgICAgICAgICAgaWYgKChhcmN3aWR0aCAhPSAwKSB8fCAoYXJjaGVpZ2h0ICE9IDApKSB7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd1JvdW5kUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBhcmN3aWR0aCwgYXJjaGVpZ2h0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd1JlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZpbGwuZXF1YWxzKCJ0cmFuc3BhcmVudCIpKSB7CisgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShmaWxsKSk7CisgICAgICAgICAgICBpZiAoKGFyY3dpZHRoICE9IDApIHx8IChhcmNoZWlnaHQgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBncmFwaGljcy5maWxsUm91bmRSZWN0KHN0cm9rZV93aWR0aCwgc3Ryb2tlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICB3aWR0aCAtIChzdHJva2Vfd2lkdGggKiAyKSwgaGVpZ2h0IC0gKHN0cm9rZV93aWR0aCAqIDIpLAorICAgICAgICAgICAgICAgICAgICBhcmN3aWR0aCwgYXJjaGVpZ2h0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbFJlY3Qoc3Ryb2tlX3dpZHRoLCBzdHJva2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKHN0cm9rZV93aWR0aCAqIDIpLCBoZWlnaHQgLSAoc3Ryb2tlX3dpZHRoICogMikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RydWN0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgSW1hZ2VPcGVyYXRpb24gaW5zdHIgPSAoKEltYWdlT3BlcmF0aW9uKSBpbnN0cnVjdGlvbnMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgICAgIGlmIChpbnN0ciBpbnN0YW5jZW9mIERyYXdPcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBQbGFuYXJJbWFnZSBpbWcgPSAoKERyYXdPcGVyYXRpb24pIGluc3RyKS5leGVjdXRlRHJhd09wZXJhdGlvbigpOworICAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdJbWFnZShpbWcuZ2V0QXNCdWZmZXJlZEltYWdlKCksIG51bGwsIDAsIDApOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0ciBpbnN0YW5jZW9mIFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisgICAgICAgICAgICAgICAgUGxhbmFySW1hZ2UgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgPSAoKFRyYW5zZm9ybU9wZXJhdGlvbikgaW5zdHIpCisgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKFBsYW5hckltYWdlLndyYXBSZW5kZXJlZEltYWdlKGJpKSk7CisgICAgICAgICAgICAgICAgYmkgPSBpbWFnZS5nZXRBc0J1ZmZlcmVkSW1hZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1JvdGF0ZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvUm90YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwZGVkMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1JvdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlOworCitpbXBvcnQgamF2YXgubWVkaWEuamFpLlBsYW5hckltYWdlOworaW1wb3J0IGphdmF4Lm1lZGlhLmphaS5JbnRlcnBvbGF0aW9uTmVhcmVzdDsKK2ltcG9ydCBqYXZheC5tZWRpYS5qYWkuSkFJOworaW1wb3J0IGphdmEuYXd0LmltYWdlLnJlbmRlcmFibGUuUGFyYW1ldGVyQmxvY2s7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworCisvKioKKyAqIEltYWdlT3BlcmF0aW9uIHRvIHJvdGF0ZSBhbiBpbWFnZSBieSBhIGNlcnRhaW4gZGVncmVlCisgKgorICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZS5JbWFnZQorICovCitwdWJsaWMgY2xhc3MgUm90YXRlIGV4dGVuZHMgVHJhbnNmb3JtT3BlcmF0aW9uIGltcGxlbWVudHMgRHJhd09wZXJhdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSEFMRl9DSVJDTEUgPSAxODAuMEY7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBmbG9hdCBhbmdsZSA9IDAuMEY7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIGRlZ3JlZXMuCisgICAgICogQHBhcmFtIGFuZyBUaGUgYW5nbGUgYXQgd2hpY2ggdG8gcm90YXRlIHRoZSBpbWFnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFuZ2xlKFN0cmluZyBhbmcpIHsKKyAgICAgICAgYW5nbGUgPSBGbG9hdC5wYXJzZUZsb2F0KGFuZyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSb3RhdGUgYW4gaW1hZ2UuCisgICAgICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSB0byByb3RhdGUuCisgICAgICogQHJldHVybiB0aGUgcm90YXRlZCBpbWFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGxhbmFySW1hZ2UgcGVyZm9ybVJvdGF0ZShQbGFuYXJJbWFnZSBpbWFnZSkgeworICAgICAgICBmbG9hdCB0QW5nbGUgPSAoZmxvYXQpIChhbmdsZSAqIChNYXRoLlBJIC8gSEFMRl9DSVJDTEUpKTsKKyAgICAgICAgUGFyYW1ldGVyQmxvY2sgcGIgPSBuZXcgUGFyYW1ldGVyQmxvY2soKTsKKyAgICAgICAgcGIuYWRkU291cmNlKGltYWdlKTsKKyAgICAgICAgcGIuYWRkKDAuMEYpOworICAgICAgICBwYi5hZGQoMC4wRik7CisgICAgICAgIHBiLmFkZCh0QW5nbGUpOworICAgICAgICBwYi5hZGQobmV3IEludGVycG9sYXRpb25OZWFyZXN0KCkpOworICAgICAgICByZXR1cm4gSkFJLmNyZWF0ZSgiUm90YXRlIiwgcGIsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGltYWdlIHJvdGF0aW9uIHdoZW4gYmVpbmcgaGFuZGxlZCBhcyBhIFRyYW5zZm9ybU9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRvIHBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uIG9uLgorICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIGltYWdlLgorICAgICAqLworICAgIHB1YmxpYyBQbGFuYXJJbWFnZSBleGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKFBsYW5hckltYWdlIGltYWdlKSB7CisgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBudWxsOworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEltYWdlT3BlcmF0aW9uIGluc3RyID0gKChJbWFnZU9wZXJhdGlvbikgaW5zdHJ1Y3Rpb25zLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBUcmFuc2Zvcm1PcGVyYXRpb24gaGFzIERyYXdPcGVyYXRpb24gY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAvLyB0aGVuIFJvdGF0ZSB0aGUgZmlyc3QgY2hpbGQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4ZWNpbmcgRHJhd3MiKTsKKyAgICAgICAgICAgICAgICBQbGFuYXJJbWFnZSBvcCA9ICgoRHJhd09wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVEcmF3T3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgaW1hZ2UgPSBwZXJmb3JtUm90YXRlKG9wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW1hZ2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RyIGluc3RhbmNlb2YgVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYmkgPSBpbWFnZS5nZXRBc0J1ZmZlcmVkSW1hZ2UoKTsKKyAgICAgICAgICAgICAgICBncmFwaGljcyA9IChHcmFwaGljczJEKSBiaS5nZXRHcmFwaGljcygpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhlY2luZyBUcmFuc2Zvcm1zIik7CisgICAgICAgICAgICAgICAgaW1hZ2UgPSAoKFRyYW5zZm9ybU9wZXJhdGlvbikgaW5zdHIpCisgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKFBsYW5hckltYWdlLndyYXBSZW5kZXJlZEltYWdlKGJpKSk7CisgICAgICAgICAgICAgICAgYmkgPSBpbWFnZS5nZXRBc0J1ZmZlcmVkSW1hZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4ZWNpbmcgYXMgVHJhbnNmb3JtT3BlcmF0aW9uIik7CisgICAgICAgIGltYWdlID0gcGVyZm9ybVJvdGF0ZShpbWFnZSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbWFnZSk7CisgICAgICAgIHJldHVybiBpbWFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUGVyZm9ybXMgdGhlIGltYWdlIHJvdGF0aW9uIHdoZW4gYmVpbmcgaGFuZGxlZCBhcyBhIERyYXdPcGVyYXRpb24uCisgICAgICogIEl0IGFic29sdXRlbHkgcmVxdWlyZXMgdGhhdCB0aGVyZSBiZSBhIERyYXdPcGVyYXRpb24gbmVzdGVkIGJlbmVhdGggaXQsCisgICAgICogIGJ1dCBvbmx5IHRoZSBGSVJTVCBEcmF3T3BlcmF0aW9uIHdpbGwgYmUgaGFuZGxlZCBzaW5jZSBpdCBjYW4gb25seSByZXR1cm4KKyAgICAgKiAgT05FIGltYWdlLgorICAgICAqIEByZXR1cm4gdGhlIGltYWdlLgorICAgICAqLworICAgIHB1YmxpYyBQbGFuYXJJbWFnZSBleGVjdXRlRHJhd09wZXJhdGlvbigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEltYWdlT3BlcmF0aW9uIGluc3RyID0gKChJbWFnZU9wZXJhdGlvbikgaW5zdHJ1Y3Rpb25zLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBUcmFuc2Zvcm1PcGVyYXRpb24gaGFzIERyYXdPcGVyYXRpb24gY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAvLyB0aGVuIFJvdGF0ZSB0aGUgZmlyc3QgY2hpbGQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICBQbGFuYXJJbWFnZSBvcCA9ICgoRHJhd09wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVEcmF3T3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgb3AgPSBwZXJmb3JtUm90YXRlKG9wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3A7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9TY2FsZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvU2NhbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjI3OWUyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvU2NhbGUuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CisKK2ltcG9ydCBqYXZheC5tZWRpYS5qYWkuSkFJOworaW1wb3J0IGphdmF4Lm1lZGlhLmphaS5QbGFuYXJJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmEuYXd0LmltYWdlLnJlbmRlcmFibGUuUGFyYW1ldGVyQmxvY2s7CisKKy8qKgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2UKKyAqLworcHVibGljIGNsYXNzIFNjYWxlIGV4dGVuZHMgVHJhbnNmb3JtT3BlcmF0aW9uIGltcGxlbWVudHMgRHJhd09wZXJhdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhVTkRSRUQgPSAxMDA7CisKKyAgICBwcml2YXRlIFN0cmluZyB3aWR0aFN0ciA9ICIxMDAlIjsKKyAgICBwcml2YXRlIFN0cmluZyBoZWlnaHRTdHIgPSAiMTAwJSI7CisgICAgcHJpdmF0ZSBib29sZWFuIHhQZXJjZW50ID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4geVBlcmNlbnQgPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nIHByb3BvcnRpb25zID0gImlnbm9yZSI7CisKKyAgICAvKiogRW51bWVyYXRlZCBjbGFzcyBmb3IgcHJvcG9ydGlvbnMgYXR0cmlidXRlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvcG9ydGlvbnNBdHRyaWJ1dGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiaWdub3JlIiwgIndpZHRoIiwgImhlaWdodCIsICJjb3ZlciIsICJmaXQifTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBTZXRzIHRoZSBiZWhhdmlvdXIgcmVnYXJkaW5nIHRoZSBpbWFnZSBwcm9wb3J0aW9ucy4KKyAgICAgKiBAcGFyYW0gcGEgdGhlIGVudW1lcmF0ZWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcG9ydGlvbnMoUHJvcG9ydGlvbnNBdHRyaWJ1dGUgcGEpIHsKKyAgICAgICAgcHJvcG9ydGlvbnMgPSBwYS5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSwgZWl0aGVyIGFzIGFuIGludGVnZXIgb3IgYSAlLgorICAgICAqIERlZmF1bHRzIHRvIDEwMCUuCisgICAgICogQHBhcmFtIHdpZHRoIHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB7CisgICAgICAgIHdpZHRoU3RyID0gd2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UsIGVpdGhlciBhcyBhbiBpbnRlZ2VyIG9yIGEgJS4gIERlZmF1bHRzIHRvIDEwMCUuCisgICAgICogQHBhcmFtIGhlaWdodCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlaWdodChTdHJpbmcgaGVpZ2h0KSB7CisgICAgICAgIGhlaWdodFN0ciA9IGhlaWdodDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHdpZHRoLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGNvbnZlcnRlZCBmcm9tIHRoZSB3aWR0aCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFdpZHRoKCkgeworICAgICAgICBmbG9hdCB3aWR0aCA9IDAuMEY7CisgICAgICAgIGludCBwZXJjSW5kZXggPSB3aWR0aFN0ci5pbmRleE9mKCclJyk7CisgICAgICAgIGlmIChwZXJjSW5kZXggPiAwKSB7CisgICAgICAgICAgICB3aWR0aCA9IEZsb2F0LnBhcnNlRmxvYXQod2lkdGhTdHIuc3Vic3RyaW5nKDAsIHBlcmNJbmRleCkpOworICAgICAgICAgICAgeFBlcmNlbnQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHdpZHRoIC8gSFVORFJFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHhQZXJjZW50ID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gRmxvYXQucGFyc2VGbG9hdCh3aWR0aFN0cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhlaWdodC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBjb252ZXJ0ZWQgZnJvbSB0aGUgaGVpZ2h0IHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0SGVpZ2h0KCkgeworICAgICAgICBpbnQgcGVyY0luZGV4ID0gaGVpZ2h0U3RyLmluZGV4T2YoJyUnKTsKKyAgICAgICAgaWYgKHBlcmNJbmRleCA+IDApIHsKKyAgICAgICAgICAgIGZsb2F0IGhlaWdodCA9IEZsb2F0LnBhcnNlRmxvYXQoaGVpZ2h0U3RyLnN1YnN0cmluZygwLCBwZXJjSW5kZXgpKTsKKyAgICAgICAgICAgIHlQZXJjZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBoZWlnaHQgLyBIVU5EUkVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeVBlcmNlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBGbG9hdC5wYXJzZUZsb2F0KGhlaWdodFN0cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FsZSBhbiBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlIHRvIHNjYWxlLgorICAgICAqIEByZXR1cm4gdGhlIHNjYWxlZCBpbWFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGxhbmFySW1hZ2UgcGVyZm9ybVNjYWxlKFBsYW5hckltYWdlIGltYWdlKSB7CisgICAgICAgIFBhcmFtZXRlckJsb2NrIHBiID0gbmV3IFBhcmFtZXRlckJsb2NrKCk7CisgICAgICAgIHBiLmFkZFNvdXJjZShpbWFnZSk7CisgICAgICAgIGZsb2F0IHhGbCA9IGdldFdpZHRoKCk7CisgICAgICAgIGZsb2F0IHlGbCA9IGdldEhlaWdodCgpOworCisgICAgICAgIGlmICgheFBlcmNlbnQpIHsKKyAgICAgICAgICAgIHhGbCA9ICh4RmwgLyBpbWFnZS5nZXRXaWR0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXlQZXJjZW50KSB7CisgICAgICAgICAgICB5RmwgPSAoeUZsIC8gaW1hZ2UuZ2V0SGVpZ2h0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCJ3aWR0aCIuZXF1YWxzKHByb3BvcnRpb25zKSkgeworICAgICAgICAgICAgeUZsID0geEZsOworICAgICAgICB9IGVsc2UgaWYgKCJoZWlnaHQiLmVxdWFscyhwcm9wb3J0aW9ucykpIHsKKyAgICAgICAgICAgIHhGbCA9IHlGbDsKKyAgICAgICAgfSBlbHNlIGlmICgiZml0Ii5lcXVhbHMocHJvcG9ydGlvbnMpKSB7CisgICAgICAgICAgICB5RmwgPSBNYXRoLm1pbih4RmwsIHlGbCk7CisgICAgICAgICAgICB4RmwgPSB5Rmw7CisgICAgICAgIH0gZWxzZSBpZiAoImNvdmVyIi5lcXVhbHMocHJvcG9ydGlvbnMpKSB7CisgICAgICAgICAgICB5RmwgPSBNYXRoLm1heCh4RmwsIHlGbCk7CisgICAgICAgICAgICB4RmwgPSB5Rmw7CisgICAgICAgIH0KKworICAgICAgICBwYi5hZGQobmV3IEZsb2F0KHhGbCkpOworICAgICAgICBwYi5hZGQobmV3IEZsb2F0KHlGbCkpOworCisgICAgICAgIGxvZygiXHRTY2FsaW5nIHRvICIgKyAoeEZsICogSFVORFJFRCkgKyAiJSB4ICIKKyAgICAgICAgICAgICsgKHlGbCAqIEhVTkRSRUQpICsgIiUiKTsKKworICAgICAgICByZXR1cm4gSkFJLmNyZWF0ZSgic2NhbGUiLCBwYik7CisgICAgfQorCisKKyAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBwdWJsaWMgUGxhbmFySW1hZ2UgZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihQbGFuYXJJbWFnZSBpbWFnZSkgeworICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEltYWdlT3BlcmF0aW9uIGluc3RyID0gKChJbWFnZU9wZXJhdGlvbikgaW5zdHJ1Y3Rpb25zLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1TY2FsZShpbWFnZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RyIGluc3RhbmNlb2YgVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYmkgPSBpbWFnZS5nZXRBc0J1ZmZlcmVkSW1hZ2UoKTsKKyAgICAgICAgICAgICAgICBpbWFnZSA9ICgoVHJhbnNmb3JtT3BlcmF0aW9uKSBpbnN0cikKKyAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpKTsKKyAgICAgICAgICAgICAgICBiaSA9IGltYWdlLmdldEFzQnVmZmVyZWRJbWFnZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwZXJmb3JtU2NhbGUoaW1hZ2UpOworICAgIH0KKworCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIFBsYW5hckltYWdlIGV4ZWN1dGVEcmF3T3BlcmF0aW9uKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RydWN0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgSW1hZ2VPcGVyYXRpb24gaW5zdHIgPSAoKEltYWdlT3BlcmF0aW9uKSBpbnN0cnVjdGlvbnMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgICAgIGlmIChpbnN0ciBpbnN0YW5jZW9mIERyYXdPcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBQbGFuYXJJbWFnZSBpbWFnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBUcmFuc2Zvcm1PcGVyYXRpb24gaGFzIERyYXdPcGVyYXRpb24gY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAvLyB0aGVuIFJvdGF0ZSB0aGUgZmlyc3QgY2hpbGQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICBwZXJmb3JtU2NhbGUoaW1hZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9UZXh0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9UZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlYzVmNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1RleHQuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZTsKKworaW1wb3J0IGphdmF4Lm1lZGlhLmphaS5QbGFuYXJJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5Gb250OworaW1wb3J0IGphdmEuYXd0LkZvbnRNZXRyaWNzOworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKKworLyoqCisgKgorICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZS5JbWFnZQorICovCitwdWJsaWMgY2xhc3MgVGV4dCBleHRlbmRzIEltYWdlT3BlcmF0aW9uIGltcGxlbWVudHMgRHJhd09wZXJhdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9JTlQgPSAxMDsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0clRleHQgPSAiIjsKKyAgICBwcml2YXRlIFN0cmluZyBmb250ID0gIkFyaWFsIjsKKyAgICBwcml2YXRlIGludCBwb2ludCA9IERFRkFVTFRfUE9JTlQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGJvbGQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXRhbGljID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29sb3IgPSAiYmxhY2siOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0ZXh0LgorICAgICAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgICAgIHN0clRleHQgPSBzdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmb250IHRvIGJlIHVzZWQgdG8gZHJhdyB0aGUgdGV4dC4KKyAgICAgKiBAcGFyYW0gZiB0aGUgZm9udCB0byBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvbnQoU3RyaW5nIGYpIHsKKyAgICAgICAgZm9udCA9IGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIHAgYW4gaW50ZWdlciB2YWx1ZSBhcyBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb2ludChTdHJpbmcgcCkgeworICAgICAgICBwb2ludCA9IEludGVnZXIucGFyc2VJbnQocCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb2xvciBvZiB0aGUgdGV4dC4KKyAgICAgKiBAcGFyYW0gYyB0aGUgY29sb3IgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgYykgeworICAgICAgICBjb2xvciA9IGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRvZG8gaXMgdGhpcyB1c2VkPworICAgICAqIEBwYXJhbSBzdGF0ZSBub3QgdXNlZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvbGQoYm9vbGVhbiBzdGF0ZSkgeworICAgICAgICBib2xkID0gc3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRvZG8gaXMgdGhpcyB1c2VkPworICAgICAqIEBwYXJhbSBzdGF0ZSBub3QgdXNlZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEl0YWxpYyhib29sZWFuIHN0YXRlKSB7CisgICAgICAgIGl0YWxpYyA9IHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyYXcgdGhlIHRleHQuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0YW50IGltYWdlLgorICAgICAqLworICAgIHB1YmxpYyBQbGFuYXJJbWFnZSBleGVjdXRlRHJhd09wZXJhdGlvbigpIHsKKyAgICAgICAgbG9nKCJcdENyZWF0aW5nIFRleHQgXCIiICsgc3RyVGV4dCArICJcIiIpOworCisgICAgICAgIENvbG9yIGNvdWxvaXIgPSBDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShjb2xvcik7CisgICAgICAgIGludCB3aWR0aCA9IDE7CisgICAgICAgIGludCBoZWlnaHQgPSAxOworCisgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBuZXcgQnVmZmVyZWRJbWFnZSh3aWR0aCwgaGVpZ2h0LCBCdWZmZXJlZEltYWdlLlRZUEVfNEJZVEVfQUJHUl9QUkUpOworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisgICAgICAgIGdyYXBoaWNzLnNldFJlbmRlcmluZ0hpbnQoCisgICAgICAgICAgICBSZW5kZXJpbmdIaW50cy5LRVlfQU5USUFMSUFTSU5HLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9BTlRJQUxJQVNfT04pOworICAgICAgICBncmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KAorICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuS0VZX0ZSQUNUSU9OQUxNRVRSSUNTLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9GUkFDVElPTkFMTUVUUklDU19PTik7CisgICAgICAgIEZvbnQgZiA9IG5ldyBGb250KGZvbnQsIEZvbnQuUExBSU4sIHBvaW50KTsKKyAgICAgICAgRm9udE1ldHJpY3MgZm1ldHJpY3MgPSBncmFwaGljcy5nZXRGb250TWV0cmljcyhmKTsKKyAgICAgICAgaGVpZ2h0ID0gZm1ldHJpY3MuZ2V0TWF4QXNjZW50KCkgKyBmbWV0cmljcy5nZXRNYXhEZXNjZW50KCk7CisgICAgICAgIHdpZHRoID0gZm1ldHJpY3Muc3RyaW5nV2lkdGgoc3RyVGV4dCk7CisKKworICAgICAgICBiaSA9IG5ldyBCdWZmZXJlZEltYWdlKHdpZHRoLCBoZWlnaHQsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV80QllURV9BQkdSX1BSRSk7CisgICAgICAgIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisKKyAgICAgICAgZ3JhcGhpY3Muc2V0UmVuZGVyaW5nSGludCgKKyAgICAgICAgICAgIFJlbmRlcmluZ0hpbnRzLktFWV9BTlRJQUxJQVNJTkcsIFJlbmRlcmluZ0hpbnRzLlZBTFVFX0FOVElBTElBU19PTik7CisgICAgICAgIGdyYXBoaWNzLnNldFJlbmRlcmluZ0hpbnQoCisgICAgICAgICAgICBSZW5kZXJpbmdIaW50cy5LRVlfRlJBQ1RJT05BTE1FVFJJQ1MsIFJlbmRlcmluZ0hpbnRzLlZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09OKTsKKworICAgICAgICBncmFwaGljcy5zZXRGb250KGYpOworICAgICAgICBncmFwaGljcy5zZXRDb2xvcihjb3Vsb2lyKTsKKyAgICAgICAgZ3JhcGhpY3MuZHJhd1N0cmluZyhzdHJUZXh0LCAwLCBoZWlnaHQgLSBmbWV0cmljcy5nZXRNYXhEZXNjZW50KCkpOworICAgICAgICBQbGFuYXJJbWFnZSBpbWFnZSA9IFBsYW5hckltYWdlLndyYXBSZW5kZXJlZEltYWdlKGJpKTsKKyAgICAgICAgcmV0dXJuIGltYWdlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1RyYW5zZm9ybU9wZXJhdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvVHJhbnNmb3JtT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1MGEyMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1RyYW5zZm9ybU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2U7CitpbXBvcnQgamF2YXgubWVkaWEuamFpLlBsYW5hckltYWdlOworCisvKioKKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmltYWdlLkltYWdlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2Zvcm1PcGVyYXRpb24gZXh0ZW5kcyBJbWFnZU9wZXJhdGlvbiB7CisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAgKiBAcGFyYW0gaW1nIFRoZSBpbWFnZSB0byBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbiBvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCBpbWFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgUGxhbmFySW1hZ2UgZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihQbGFuYXJJbWFnZSBpbWcpOworCisgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlY3RhbmdsZShSZWN0YW5nbGUgaW5zdHIpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChpbnN0cik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvQXBhY2hlQ2F0YWxvZy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvQXBhY2hlQ2F0YWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTkyNGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci9BcGFjaGVDYXRhbG9nLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvbHZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2c7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuQ2F0YWxvZ0VudHJ5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuaGVscGVycy5QdWJsaWNJZDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIENhdGFsb2cgY2xhc3MgcHJvdmlkZWQgYnkgTm9ybWFuIFdhbHNoJ3MKKyAqIHJlc29sdmVyIGxpYnJhcnkgaW4geG1sLWNvbW1vbnMgaW4gb3JkZXIgdG8gYWRkIGNsYXNzcGF0aCBlbnRpdHkKKyAqIGFuZCBVUkkgcmVzb2x1dGlvbi4gIFNpbmNlIFhNTENhdGFsb2cgYWxyZWFkeSBkb2VzIGNsYXNzcGF0aAorICogcmVzb2x1dGlvbiwgd2Ugc2ltcGx5IGFkZCBhbGwgQ2F0YWxvZ0VudHJ5IGluc3RhbmNlcyBiYWNrIHRvIHRoZQorICogY29udHJvbGxpbmcgWE1MQ2F0YWxvZyBpbnN0YW5jZS4gIFRoaXMgaXMgZG9uZSB2aWEgYSBjYWxsYmFjaworICogbWVjaGFuaXNtLiAgQXBhY2hlQ2F0YWxvZyBpcyA8ZW0+b25seTwvZW0+IHVzZWQgZm9yIGV4dGVybmFsCisgKiBjYXRhbG9nIGZpbGVzLiAgSW5saW5lIGVudHJpZXMgKGN1cnJlbnRseSA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4KKyAqIGFuZCA8Y29kZT4mbHQ7ZW50aXR5Jmd0OzwvY29kZT4pIGFyZSBub3QgYWRkZWQgdG8gQXBhY2hlQ2F0YWxvZy4KKyAqIFNlZSBYTUxDYXRhbG9nLmphdmEgZm9yIHRoZSBkZXRhaWxzIG9mIHRoZSBlbnRpdHkgYW5kIFVSSQorICogcmVzb2x1dGlvbiBhbGdvcml0aG1zLgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZy5DYXRhbG9nUmVzb2x2ZXIKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBBcGFjaGVDYXRhbG9nIGV4dGVuZHMgQ2F0YWxvZyB7CisKKyAgICAvKiogVGhlIHJlc29sdmVyIG9iamVjdCB0byBjYWxsYmFjay4gKi8KKyAgICBwcml2YXRlIEFwYWNoZUNhdGFsb2dSZXNvbHZlciByZXNvbHZlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiA8cD5DcmVhdGUgYSBuZXcgQXBhY2hlQ2F0YWxvZyBpbnN0YW5jZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUKKyAgICAgKiAgaW4gb3JkZXIgdG8gc2V0IHRoZSByZXNvbHZlciBvYmplY3QgZm9yIGNhbGxiYWNrcy4gIFRoZSByZWFzb24KKyAgICAgKiAgd2UgaGF2ZSB0byBkbyB0aGlzIGlzIHRoYXQgaW50ZXJuYWxseSBDYXRhbG9nIGNyZWF0ZXMgYSBuZXcKKyAgICAgKiAgaW5zdGFuY2Ugb2YgaXRzZWxmIGZvciBlYWNoIGV4dGVybmFsIGNhdGFsb2cgZmlsZSBwcm9jZXNzZWQuCisgICAgICogIFRoYXQgaXMsIGlmIHR3byBleHRlcm5hbCBjYXRhbG9nIGZpbGVzIGFyZSBwcm9jZXNzZWQsIHRoZXJlCisgICAgICogIHdpbGwgYmUgYSB0b3RhbCBvZiB0d28gQXBhY2hlQ2F0YWxvZyBpbnN0YW5jZXMsIGFuZCBzbyBvbi48L3A+CisgICAgICogQHJldHVybiB0aGUgY2F0YWxvZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2F0YWxvZyBuZXdDYXRhbG9nKCkgeworICAgICAgICBBcGFjaGVDYXRhbG9nIGNhdCA9IChBcGFjaGVDYXRhbG9nKSBzdXBlci5uZXdDYXRhbG9nKCk7CisgICAgICAgIGNhdC5zZXRSZXNvbHZlcihyZXNvbHZlcik7CisgICAgICAgIHJldHVybiBjYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvbHZlciBvYmplY3QgdG8gY2FsbGJhY2suCisgICAgICogQHBhcmFtIHJlc29sdmVyIHRoZSBhcGFjaGUgY2F0YWxvZyByZXNvbHZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlcihBcGFjaGVDYXRhbG9nUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZQorICAgICAqIGluIG9yZGVyIHRvIGFkZCBjYXRhbG9nIGVudHJpZXMgYmFjayB0byB0aGUgY29udHJvbGxpbmcKKyAgICAgKiBYTUxDYXRhbG9nIGluc3RhbmNlLiAgSW4gdGhpcyB3YXksIHdlIGNhbiBhZGQgY2xhc3NwYXRoIGxvb2t1cAorICAgICAqIGZvciB0aGVzZSBlbnRyaWVzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPldoZW4gd2UgYWRkIGFuIGV4dGVybmFsIGNhdGFsb2cgZmlsZSwgdGhlIGVudHJpZXMgaW5zaWRlIGl0CisgICAgICogZ2V0IHBhcnNlZCBieSB0aGlzIG1ldGhvZC4gIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgaXQgdG8gYWRkCisgICAgICogZWFjaCBvZiB0aGVtIGJhY2sgdG8gdGhlIGNvbnRyb2xsaW5nIFhNTENhdGFsb2cgaW5zdGFuY2UuICBUaGlzCisgICAgICogaXMgZG9uZSBieSBwZXJmb3JtaW5nIGEgY2FsbGJhY2sgdG8gdGhlIEFwYWNoZUNhdGFsb2dSZXNvbHZlciwKKyAgICAgKiB3aGljaCBpbiB0dXJuIGNhbGxzIHRoZSBYTUxDYXRhbG9nLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlhNTENhdGFsb2cgY3VycmVudGx5IG9ubHkgdW5kZXJzdGFuZHMgPGNvZGU+UFVCTElDPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5VUkk8L2NvZGU+IGVudHJ5IHR5cGVzLCBzbyB3ZSBpZ25vcmUgdGhlIG90aGVyIHR5cGVzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyeSBUaGUgQ2F0YWxvZ0VudHJ5IHRvIHByb2Nlc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRW50cnkoQ2F0YWxvZ0VudHJ5IGVudHJ5KSB7CisKKyAgICAgICAgaW50IHR5cGUgPSBlbnRyeS5nZXRFbnRyeVR5cGUoKTsKKworICAgICAgICBpZiAodHlwZSA9PSBQVUJMSUMpIHsKKworICAgICAgICAgICAgU3RyaW5nIHB1YmxpY2lkID0gUHVibGljSWQubm9ybWFsaXplKGVudHJ5LmdldEVudHJ5QXJnKDApKTsKKyAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1pZCA9IG5vcm1hbGl6ZVVSSShlbnRyeS5nZXRFbnRyeUFyZygxKSk7CisKKyAgICAgICAgICAgIGlmIChyZXNvbHZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2F0YWxvZ01hbmFnZXIuZGVidWcKKyAgICAgICAgICAgICAgICAgICAgLm1lc3NhZ2UoMSwgIkludGVybmFsIEVycm9yOiBudWxsIEFwYWNoZUNhdGFsb2dSZXNvbHZlciIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNvbHZlci5hZGRQdWJsaWNFbnRyeShwdWJsaWNpZCwgc3lzdGVtaWQsIGJhc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBVUkkpIHsKKworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5vcm1hbGl6ZVVSSShlbnRyeS5nZXRFbnRyeUFyZygwKSk7CisgICAgICAgICAgICBTdHJpbmcgYWx0VVJJID0gbm9ybWFsaXplVVJJKGVudHJ5LmdldEVudHJ5QXJnKDEpKTsKKworICAgICAgICAgICAgaWYgKHJlc29sdmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYXRhbG9nTWFuYWdlci5kZWJ1ZworICAgICAgICAgICAgICAgICAgICAubWVzc2FnZSgxLCAiSW50ZXJuYWwgRXJyb3I6IG51bGwgQXBhY2hlQ2F0YWxvZ1Jlc29sdmVyIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc29sdmVyLmFkZFVSSUVudHJ5KHVyaSwgYWx0VVJJLCBiYXNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuYWRkRW50cnkoZW50cnkpOworICAgIH0KKworfSAvLy0gQXBhY2hlQ2F0YWxvZwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvQXBhY2hlQ2F0YWxvZ1Jlc29sdmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci9BcGFjaGVDYXRhbG9nUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWRhZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvQXBhY2hlQ2F0YWxvZ1Jlc29sdmVyLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvbHZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5YTUxDYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlTG9jYXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5DYXRhbG9nOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2dNYW5hZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIudG9vbHMuQ2F0YWxvZ1Jlc29sdmVyOworCisvKioKKyAqIDxwPlRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgQ2F0YWxvZ1Jlc29sdmVyIGNsYXNzIHByb3ZpZGVkIGJ5IE5vcm1hbgorICogV2Fsc2gncyByZXNvbHZlciBsaWJyYXJ5IGluIHhtbC1jb21tb25zLiAgSXQgcHJvdmlkZXMgdGhlIGJyaWRnZQorICogYmV0d2VlbiB0aGUgQW50IFhNTENhdGFsb2cgZGF0YXR5cGUgYW5kIHRoZSB4bWwtY29tbW9ucyBDYXRhbG9nCisgKiBjbGFzcy4gIFhNTENhdGFsb2cgY2FsbHMgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHVzaW5nIFJlZmxlY3Rpb24gaW4KKyAqIG9yZGVyIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgeG1sLWNvbW1vbnMgcmVzb2x2ZXIgbGlicmFyeSBpbiB0aGUKKyAqIHBhdGguPC9wPgorICoKKyAqIDxwPlRoZSB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb2x2ZXIuQXBhY2hlQ2F0YWxvZworICogQXBhY2hlQ2F0YWxvZ30gY2xhc3MgaXMgdXNlZCB0byBwYXJzZSBleHRlcm5hbCBjYXRhbG9nIGZpbGVzLCB3aGljaAorICogY2FuIGJlIGluIGVpdGhlciA8YQorICogaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L2JhY2tncm91bmQvOTQwMS5odG1sIj4KKyAqIHBsYWluIHRleHQgZm9ybWF0PC9hPiBvciA8YQorICogaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+CisgKiBYTUwgZm9ybWF0PC9hPi48L3A+CisgKgorICogPHA+Rm9yIGVhY2ggZW50cnkgZm91bmQgaW4gYW4gZXh0ZXJuYWwgY2F0YWxvZyBmaWxlLCBpZiBhbnksIGFuCisgKiBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VMb2NhdGlvbgorICogUmVzb3VyY2VMb2NhdGlvbn0gaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIGNvbnRyb2xsaW5nCisgKiBYTUxDYXRhbG9nIGRhdGF0eXBlLiAgSW4gdGhpcyB3YXksIHRoZXNlIGVudHJpZXMgd2lsbCBiZSBpbmNsdWRlZAorICogaW4gWE1MQ2F0YWxvZydzIGxvb2t1cCBhbGdvcml0aG0uICBTZWUgWE1MQ2F0YWxvZy5qYXZhIGZvciBtb3JlCisgKiBkZXRhaWxzLjwvcD4KKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2cuQ2F0YWxvZ1Jlc29sdmVyCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2dNYW5hZ2VyCisgKiBAc2luY2UgQW50IDEuNgorICovCisKK3B1YmxpYyBjbGFzcyBBcGFjaGVDYXRhbG9nUmVzb2x2ZXIgZXh0ZW5kcyBDYXRhbG9nUmVzb2x2ZXIgeworCisgICAgLyoqIFRoZSBYTUxDYXRhbG9nIG9iamVjdCB0byBjYWxsYmFjay4gKi8KKyAgICBwcml2YXRlIFhNTENhdGFsb2cgeG1sQ2F0YWxvZyA9IG51bGw7CisKKyAgICBzdGF0aWMgeworICAgICAgICAvLworICAgICAgICAvLyBJZiB5b3UgZG9uJ3QgZG8gdGhpcywgeW91IGdldCBhbGwgc29ydHMgb2YgYW5ub3lpbmcKKyAgICAgICAgLy8gd2FybmluZ3MgYWJvdXQgYSBtaXNzaW5nIHByb3BlcnRpZXMgZmlsZS4gIEhvd2V2ZXIsIGl0CisgICAgICAgIC8vIHNlZW1zIHRvIHdvcmsganVzdCBmaW5lIHdpdGggZGVmYXVsdCB2YWx1ZXMuICBVbHRpbWF0ZWx5LAorICAgICAgICAvLyB3ZSBzaG91bGQgcHJvYmFibHkgaW5jbHVkZSBhICJDYXRhbG9nTWFuYWdlci5wcm9wZXJ0aWVzIgorICAgICAgICAvLyBmaWxlIGluIHRoZSBhbnQgamFyZmlsZSB3aXRoIHNvbWUgZGVmYXVsdCBwcm9wZXJ0eQorICAgICAgICAvLyBzZXR0aW5ncy4gIFNlZSBDYXRhbG9nTWFuYWdlci5qYXZhIGZvciBtb3JlIGRldGFpbHMuCisgICAgICAgIC8vCisgICAgICAgIENhdGFsb2dNYW5hZ2VyLmdldFN0YXRpY01hbmFnZXIoKS5zZXRJZ25vcmVNaXNzaW5nUHJvcGVydGllcyh0cnVlKTsKKworICAgICAgICAvLworICAgICAgICAvLyBNYWtlIHN1cmUgQ2F0YWxvZ1Jlc29sdmVyIGluc3RhbnRpYXRlcyBBcGFjaGVDYXRhbG9nLAorICAgICAgICAvLyByYXRoZXIgdGhhbiBhIHBsYWluIENhdGFsb2cKKyAgICAgICAgLy8KKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoInhtbC5jYXRhbG9nLmNsYXNzTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZUNhdGFsb2cuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICAgICBDYXRhbG9nTWFuYWdlci5nZXRTdGF0aWNNYW5hZ2VyKCkuc2V0VXNlU3RhdGljQ2F0YWxvZyhmYWxzZSk7CisKKyAgICAgICAgLy8gZGVidWcKKyAgICAgICAgLy8gQ2F0YWxvZ01hbmFnZXIuZ2V0U3RhdGljTWFuYWdlcigpLnNldFZlcmJvc2l0eSg0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFhNTENhdGFsb2cgb2JqZWN0IHRvIGNhbGxiYWNrLgorICAgICAqIEBwYXJhbSB4bWxDYXRhbG9nIHRoZSBYTUxDYXRhbG9nIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYTUxDYXRhbG9nKFhNTENhdGFsb2cgeG1sQ2F0YWxvZykgeworICAgICAgICB0aGlzLnhtbENhdGFsb2cgPSB4bWxDYXRhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFhNTENhdGFsb2cgY2FsbHMgdGhpcyB0byBhZGQgYW4gZXh0ZXJuYWwgY2F0YWxvZyBmaWxlIGZvciBlYWNoCisgICAgICogZmlsZSB3aXRoaW4gYSA8Y29kZT4mbHQ7Y2F0YWxvZ2ZpbGVzJmd0OzwvY29kZT4gZmlsZXNldC4KKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZXh0ZXJuYWwgY2F0YWxvZyBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlQ2F0YWxvZyhTdHJpbmcgZmlsZSkgeworCisgICAgICAgIENhdGFsb2cgY2F0YWxvZyA9IGdldENhdGFsb2coKTsKKyAgICAgICAgaWYgKCEoY2F0YWxvZyBpbnN0YW5jZW9mIEFwYWNoZUNhdGFsb2cpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIldyb25nIGNhdGFsb2cgdHlwZSBmb3VuZDogIiArIGNhdGFsb2cuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEFwYWNoZUNhdGFsb2cgYXBhY2hlQ2F0YWxvZyA9IChBcGFjaGVDYXRhbG9nKSBjYXRhbG9nOworCisgICAgICAgIC8vIFBhc3MgaW4gcmVmZXJlbmNlIHRvIG91cnNlbHZlcyBzbyB3ZSBjYW4gYmUgY2FsbGVkIGJhY2suCisgICAgICAgIGFwYWNoZUNhdGFsb2cuc2V0UmVzb2x2ZXIodGhpcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFwYWNoZUNhdGFsb2cucGFyc2VDYXRhbG9nKGZpbGUpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QWRkIGEgUFVCTElDIGNhdGFsb2cgZW50cnkgdG8gdGhlIGNvbnRyb2xsaW5nIFhNTENhdGFsb2cgaW5zdGFuY2UuCisgICAgICogQXBhY2hlQ2F0YWxvZyBjYWxscyB0aGlzIGZvciBlYWNoIFBVQkxJQyBlbnRyeSBmb3VuZCBpbiBhbiBleHRlcm5hbAorICAgICAqIGNhdGFsb2cgZmlsZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcHVibGljaWQgVGhlIHB1YmxpYyBJRCBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gc3lzdGVtaWQgVGhlIHN5c3RlbSBJRCAoYWthIGxvY2F0aW9uKSBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gYmFzZSBUaGUgYmFzZSBVUkwgb2YgdGhlIHJlc291cmNlLiAgSWYgdGhlIHN5c3RlbWlkCisgICAgICogc3BlY2lmaWVzIGEgcmVsYXRpdmUgVVJML3BhdGhuYW1lLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUKKyAgICAgKiBiYXNlLiAgVGhlIGRlZmF1bHQgYmFzZSBmb3IgYW4gZXh0ZXJuYWwgY2F0YWxvZyBmaWxlIGlzIHRoZQorICAgICAqIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY2F0YWxvZyBpcyBsb2NhdGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHVibGljRW50cnkoU3RyaW5nIHB1YmxpY2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgYmFzZSkgeworCisgICAgICAgIFJlc291cmNlTG9jYXRpb24gZHRkID0gbmV3IFJlc291cmNlTG9jYXRpb24oKTsKKyAgICAgICAgZHRkLnNldEJhc2UoYmFzZSk7CisgICAgICAgIGR0ZC5zZXRQdWJsaWNJZChwdWJsaWNpZCk7CisgICAgICAgIGR0ZC5zZXRMb2NhdGlvbihzeXN0ZW1pZCk7CisKKyAgICAgICAgeG1sQ2F0YWxvZy5hZGREVEQoZHRkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgYSBVUkkgY2F0YWxvZyBlbnRyeSB0byB0aGUgY29udHJvbGxpbmcgWE1MQ2F0YWxvZyBpbnN0YW5jZS4KKyAgICAgKiBBcGFjaGVDYXRhbG9nIGNhbGxzIHRoaXMgZm9yIGVhY2ggVVJJIGVudHJ5IGZvdW5kIGluIGFuIGV4dGVybmFsCisgICAgICogY2F0YWxvZyBmaWxlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gYWx0VVJJIFRoZSBVUkkgdG8gd2hpY2ggdGhlIHJlc291cmNlIHNob3VsZCBiZSBtYXBwZWQKKyAgICAgKiAoYWthIHRoZSBsb2NhdGlvbikKKyAgICAgKiBAcGFyYW0gYmFzZSBUaGUgYmFzZSBVUkwgb2YgdGhlIHJlc291cmNlLiAgSWYgdGhlIGFsdFVSSQorICAgICAqIHNwZWNpZmllcyBhIHJlbGF0aXZlIFVSTC9wYXRobmFtZSwgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlCisgICAgICogYmFzZS4gIFRoZSBkZWZhdWx0IGJhc2UgZm9yIGFuIGV4dGVybmFsIGNhdGFsb2cgZmlsZSBpcyB0aGUKKyAgICAgKiBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNhdGFsb2cgaXMgbG9jYXRlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFVSSUVudHJ5KFN0cmluZyB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFsdFVSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgYmFzZSkgeworCisgICAgICAgIFJlc291cmNlTG9jYXRpb24gZW50aXR5ID0gbmV3IFJlc291cmNlTG9jYXRpb24oKTsKKyAgICAgICAgZW50aXR5LnNldEJhc2UoYmFzZSk7CisgICAgICAgIGVudGl0eS5zZXRQdWJsaWNJZCh1cmkpOworICAgICAgICBlbnRpdHkuc2V0TG9jYXRpb24oYWx0VVJJKTsKKworICAgICAgICB4bWxDYXRhbG9nLmFkZEVudGl0eShlbnRpdHkpOworICAgIH0KKworfSAvLy0tIEFwYWNoZUNhdGFsb2dSZXNvbHZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvcGFja2FnZS5odG1sIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjNjNzcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwzNSBAQAorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJvZHk+CitBbnQgaW50ZWdyYXRpb24gd2l0aCB4bWwtY29tbW9ucyByZXNvbHZlci4KKworPHA+VGhlc2UgY2xhc3NlcyBlbmhhbmNlIHRoZSA8Y29kZT4mbHQ7eG1sY2F0YWxvZyZndDs8L2NvZGU+IGRhdGF0eXBlCit0byBzdXBwb3J0IGV4dGVybmFsIGNhdGFsb2cgZmlsZXMgdXNpbmcgdGhlIHhtbC1jb21tb25zIHJlc29sdmVyLCBpbgorYWNjb3JkYW5jZSB3aXRoIHRoZQorPGEgaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KK09BU0lTICJPcGVuIENhdGFsb2ciIHN0YW5kYXJkPC9hPi4gIFRoZXkgd2lsbCBiZSB1c2VkIGlmIGFuZCBvbmx5IGlmCit0aGUgeG1sLWNvbW1vbnMgcmVzb2x2ZXIgbGlicmFyeSBpcyBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC48L3A+CisKK0BzZWUgPEEgSFJFRj0iaHR0cDovL3htbC5hcGFjaGUub3JnL2NvbW1vbnMiPkFwYWNoZSB4bWwtY29tbW9ucyBQcm9qZWN0PC9BPgorCitAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2cKK0BzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb2x2ZXIuQXBhY2hlQ2F0YWxvZ1Jlc29sdmVyCitAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc29sdmVyLkFwYWNoZUNhdGFsb2cKKworQGF1dGhvciA8QSBIUkVGPSJtYWlsdG86Y3N0cm9uZ0BhcmllbHBhcnRuZXJzLmNvbSI+Q3JhZWcgU3Ryb25nPC9BPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQWJzdHJhY3RDbGFzc3BhdGhSZXNvdXJjZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0Fic3RyYWN0Q2xhc3NwYXRoUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWY5ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0Fic3RyYWN0Q2xhc3NwYXRoUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKgorICogQSBSZXNvdXJjZSByZXByZXNlbnRhdGlvbiBvZiBhbnl0aGluZyB0aGF0IGlzIGFjY2Vzc2VkIHZpYSBhIEphdmEgY2xhc3Nsb2FkZXIuCisgKiBUaGUgY29yZSBtZXRob2RzIHRvIHNldC9yZXNvbHZlIHRoZSBjbGFzc3BhdGggYXJlIHByb3ZpZGVkLgorICogQHNpbmNlIEFudCAxLjgKKyAqCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2xhc3NwYXRoUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aDsKKyAgICBwcml2YXRlIFJlZmVyZW5jZSBsb2FkZXI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0byBhZGQgdG8gYW55IGV4aXN0aW5nIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBjbGFzc3BhdGggdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgY2hlY2tDaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZSwKKyAgICAgKiBnaXZlbiBhcyByZWZlcmVuY2UgdG8gYSAmbHQ7cGF0aCZndDsgZGVmaW5lZCBlbHNld2hlcmUKKyAgICAgKiBAcGFyYW0gciBUaGUgcmVmZXJlbmNlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBjbGFzc3BhdGggdXNlZCBieSB0aGlzIDxjb2RlPkxvYWRQcm9wZXJ0aWVzPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIFRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpCisgICAgICAgICAgICA/ICgoSmF2YVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldENsYXNzcGF0aCgpIDogY2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbG9hZGVyLgorICAgICAqIEByZXR1cm4gdGhlIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVmZXJlbmNlIGdldExvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIHJlZmVyZW5jZSB0byBsb2NhdGUgdGhlIGxvYWRlci4gSWYgdGhlIGxvYWRlciBpcyBub3QKKyAgICAgKiBmb3VuZCwgdGFza2RlZiB3aWxsIHVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzcGF0aCBhbmQgcmVnaXN0ZXIgaXQKKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIFRoaXMgYWxsb3cgbXVsdGlwbGUgdGFza2RlZi90eXBlZGVmIHRvIHVzZSB0aGUgc2FtZSBjbGFzcyBsb2FkZXIsCisgICAgICogc28gdGhleSBjYW4gYmUgdXNlZCB0b2dldGhlci4gSXQgZWxpbWluYXRlIHRoZSBuZWVkIHRvCisgICAgICogcHV0IHRoZW0gaW4gdGhlIENMQVNTUEFUSC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gbG9jYXRlIHRoZSBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGVyUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgbG9hZGVyID0gcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIHN1cGVyIHZlcnNpb24uCisgICAgICogQHBhcmFtIHIgdGhlIFJlZmVyZW5jZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsIHx8IGNsYXNzcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlYXJuIHdoZXRoZXIgdGhpcyByZXNvdXJjZSBleGlzdHMuIFRoaXMgaW1wbGVtZW50YXRpb24gb3BlbnMgdGhlIGlucHV0IHN0cmVhbQorICAgICAqIGFzIHRoZSB0ZXN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4aXN0cygpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAgKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5pc0V4aXN0cygpOworICAgICAgICB9CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzID0gZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBpcyAhPSBudWxsOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZyB0aGUgY29udGVudHMgb2YgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGFuIElucHV0U3RyZWFtIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfQorICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7CisgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpIGxvYWRlci5nZXRSZWZlcmVuY2VkT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChnZXRDbGFzc3BhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2wgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NwYXRoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2wgPSBKYXZhUmVzb3VyY2UuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCAmJiBjbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZShsb2FkZXIuZ2V0UmVmSWQoKSwgY2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9wZW5JbnB1dFN0cmVhbShjbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogb3BlbiB0aGUgaW5wb3V0IHN0cmVhbSBmcm9tIGEgc3BlY2lmaWMgY2xhc3Nsb2FkZXIKKyAgICAgKiBAcGFyYW0gY2wgdGhlIGNsYXNzbG9hZGVyIHRvIHVzZS4gV2lsbCBiZSBudWxsIGlmIHRoZSBzeXN0ZW0gY2xhc3Nsb2FkZXIgaXMgdXNlZAorICAgICAqIEByZXR1cm4gYW4gb3BlbiBpbnB1dCBzdHJlYW0gZm9yIHRoZSByZXNvdXJjZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW0oQ2xhc3NMb2FkZXIgY2wpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BcmNoaXZlUmVzb3VyY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BcmNoaXZlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzVkMmE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0FyY2hpdmVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CisKKy8qKgorICogQSBSZXNvdXJjZSByZXByZXNlbnRhdGlvbiBvZiBhbiBlbnRyeSBpbnNpZGUgYW4gYXJjaGl2ZS4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcmNoaXZlUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTExfQVJDSElWRQorICAgICAgICA9IFJlc291cmNlLmdldE1hZ2ljTnVtYmVyKCJudWxsIGFyY2hpdmUiLmdldEJ5dGVzKCkpOworCisgICAgcHJpdmF0ZSBSZXNvdXJjZSBhcmNoaXZlOworICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlRW50cnkgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbW9kZVNldCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1vZGUgPSAwOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJjaGl2ZVJlc291cmNlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIEFyY2hpdmVSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gYSB0aGUgYXJjaGl2ZSBhcyBGaWxlLgorICAgICAqLworICAgIHB1YmxpYyBBcmNoaXZlUmVzb3VyY2UoRmlsZSBhKSB7CisgICAgICAgIHRoaXMoYSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIEFyY2hpdmVSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gYSB0aGUgYXJjaGl2ZSBhcyBGaWxlLgorICAgICAqIEBwYXJhbSB3aXRoRW50cnkgaWYgdGhlIGVudHJ5IGhhcyBiZWVuIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJjaGl2ZVJlc291cmNlKEZpbGUgYSwgYm9vbGVhbiB3aXRoRW50cnkpIHsKKyAgICAgICAgc2V0QXJjaGl2ZShhKTsKKyAgICAgICAgaGF2ZUVudHJ5ID0gd2l0aEVudHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIEFyY2hpdmVSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gYSB0aGUgYXJjaGl2ZSBhcyBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gd2l0aEVudHJ5IGlmIHRoZSBlbnRyeSBoYXMgYmVlbiBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHVibGljIEFyY2hpdmVSZXNvdXJjZShSZXNvdXJjZSBhLCBib29sZWFuIHdpdGhFbnRyeSkgeworICAgICAgICBhZGRDb25maWd1cmVkKGEpOworICAgICAgICBoYXZlRW50cnkgPSB3aXRoRW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhcmNoaXZlIHRoYXQgaG9sZHMgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYSB0aGUgYXJjaGl2ZSBhcyBhIEZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJjaGl2ZShGaWxlIGEpIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICBhcmNoaXZlID0gbmV3IEZpbGVSZXNvdXJjZShhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmaWxlIG9yIGRpciBtb2RlIGZvciB0aGlzIHJlc291cmNlLgorICAgICAqIEBwYXJhbSBtb2RlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgVW5peCBwZXJtaXNzaW9uIG1hc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIHRoaXMubW9kZSA9IG1vZGU7CisgICAgICAgIG1vZGVTZXQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFyY2hpdmUgdGhhdCBob2xkcyB0aGlzIGFzIGEgc2luZ2xlIGVsZW1lbnQgUmVzb3VyY2UKKyAgICAgKiBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSBhIHRoZSBhcmNoaXZlIGFzIGEgc2luZ2xlIGVsZW1lbnQgUmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKFJlc291cmNlQ29sbGVjdGlvbiBhKSB7CisgICAgICAgIGNoZWNrQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIGlmIChhcmNoaXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigieW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJjaGl2ZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChhLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm9ubHkgc2luZ2xlIGFyZ3VtZW50IHJlc291cmNlIGNvbGxlY3Rpb25zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcmUgc3VwcG9ydGVkIGFzIGFyY2hpdmVzIik7CisgICAgICAgIH0KKyAgICAgICAgYXJjaGl2ZSA9IChSZXNvdXJjZSkgYS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFyY2hpdmUgdGhhdCBob2xkcyB0aGlzIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gdGhlIGFyY2hpdmUgYXMgYSBSZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0QXJjaGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkKKyAgICAgICAgICAgID8gKChBcmNoaXZlUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0QXJjaGl2ZSgpIDogYXJjaGl2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiB0aGlzIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tFbnRyeSgpOworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgbG9uZyBzaXplIG9mIHRoaXMgUmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldFNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0VudHJ5KCk7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRTaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGVhcm4gd2hldGhlciB0aGlzIFJlc291cmNlIHJlcHJlc2VudHMgYSBkaXJlY3RvcnkuCisgICAgICogQHJldHVybiBib29sZWFuIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbnRyeSBpcyBhIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmlzRGlyZWN0b3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tFbnRyeSgpOworICAgICAgICByZXR1cm4gc3VwZXIuaXNEaXJlY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIG91dCB3aGV0aGVyIHRoaXMgUmVzb3VyY2UgcmVwcmVzZW50cyBhbiBleGlzdGluZyBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZXhpc3RlbmNlIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFeGlzdHMoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5pc0V4aXN0cygpOworICAgICAgICB9CisgICAgICAgIGNoZWNrRW50cnkoKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmlzRXhpc3RzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWxlIG9yIGRpciBtb2RlIGZvciB0aGlzIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBVbml4IHBlcm1pc3Npb24gbWFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1vZGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0TW9kZSgpOworICAgICAgICB9CisgICAgICAgIGNoZWNrRW50cnkoKTsKKyAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHRoZSBzdXBlciB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSByIHRoZSBSZWZlcmVuY2UgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGlmIChhcmNoaXZlICE9IG51bGwgfHwgbW9kZVNldCkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHRoaXMgQXJjaGl2ZVJlc291cmNlIHRvIGFub3RoZXIgUmVzb3VyY2UuCisgICAgICogQHBhcmFtIGFub3RoZXIgdGhlIG90aGVyIFJlc291cmNlIGFnYWluc3Qgd2hpY2ggdG8gY29tcGFyZS4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgUmVzb3VyY2UKKyAgICAgKiAgICAgICAgIGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIFJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBhbm90aGVyKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVxdWFscyhhbm90aGVyKSA/IDAgOiBzdXBlci5jb21wYXJlVG8oYW5vdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSBhbm90aGVyIE9iamVjdCB0byB0aGlzIEFyY2hpdmVSZXNvdXJjZSBmb3IgZXF1YWxpdHkuCisgICAgICogQHBhcmFtIGFub3RoZXIgdGhlIG90aGVyIE9iamVjdCB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbm90aGVyIGlzIGEgUmVzb3VyY2UgcmVwcmVzZW50aW5nCisgICAgICogICAgICAgICAgICAgIHRoZSBzYW1lIGVudHJ5IGluIHRoZSBzYW1lIGFyY2hpdmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbm90aGVyKSB7CisgICAgICAgIGlmICh0aGlzID09IGFub3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLmVxdWFscyhhbm90aGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShhbm90aGVyLmdldENsYXNzKCkuZXF1YWxzKGdldENsYXNzKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEFyY2hpdmVSZXNvdXJjZSByID0gKEFyY2hpdmVSZXNvdXJjZSkgYW5vdGhlcjsKKyAgICAgICAgcmV0dXJuIGdldEFyY2hpdmUoKS5lcXVhbHMoci5nZXRBcmNoaXZlKCkpCisgICAgICAgICAgICAmJiBnZXROYW1lKCkuZXF1YWxzKHIuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGhhc2ggY29kZSBhcyBpbnQuCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCkKKyAgICAgICAgICAgICogKGdldEFyY2hpdmUoKSA9PSBudWxsID8gTlVMTF9BUkNISVZFIDogZ2V0QXJjaGl2ZSgpLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCB0aGlzIFJlc291cmNlIGFzIGEgU3RyaW5nLgorICAgICAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGF0YXRpb24gb2YgdGhpcyBSZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/IGdldENoZWNrZWRSZWYoKS50b1N0cmluZygpCisgICAgICAgICAgICA6IGdldEFyY2hpdmUoKS50b1N0cmluZygpICsgJzonICsgZ2V0TmFtZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tFbnRyeSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoYXZlRW50cnkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJlbnRyeSBuYW1lIG5vdCBzZXQiKTsKKyAgICAgICAgfQorICAgICAgICBSZXNvdXJjZSByID0gZ2V0QXJjaGl2ZSgpOworICAgICAgICBpZiAociA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImFyY2hpdmUgYXR0cmlidXRlIG5vdCBzZXQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXIuaXNFeGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHIudG9TdHJpbmcoKSArICIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHIgKyAiIGRlbm90ZXMgYSBkaXJlY3RvcnkuIik7CisgICAgICAgIH0KKyAgICAgICAgZmV0Y2hFbnRyeSgpOworICAgICAgICBoYXZlRW50cnkgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZldGNoZXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgbmFtZWQgZW50cnkgaW5zaWRlIHRoZSBhcmNoaXZlLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZldGNoRW50cnkoKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CQ0ZpbGVTZXQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CQ0ZpbGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWUyZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0JDRmlsZVNldC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKKworLyoqCisgKiBVdGlsaXR5IEZpbGVTZXQgdGhhdCBpbmNsdWRlcyBkaXJlY3RvcmllcyBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkKKyAqIHdpdGggY2VydGFpbiB0YXNrcyBlLmcuIERlbGV0ZS4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBCQ0ZpbGVTZXQgZXh0ZW5kcyBGaWxlU2V0IHsKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCQ0ZpbGVTZXQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEJDRmlsZVNldCBmcm9tIHRoZSBzcGVjaWZpZWQgRmlsZVNldC4KKyAgICAgKiBAcGFyYW0gZnMgdGhlIEZpbGVTZXQgZnJvbSB3aGljaCB0byBpbmhlcml0IGNvbmZpZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQkNGaWxlU2V0KEZpbGVTZXQgZnMpIHsKKyAgICAgICAgc3VwZXIoZnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9mIFJlc291cmNlcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5pdGVyYXRvcigpOworICAgICAgICB9CisgICAgICAgIEZpbGVSZXNvdXJjZUl0ZXJhdG9yIHJlc3VsdCA9IG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvcihnZXREaXIoKSk7CisgICAgICAgIHJlc3VsdC5hZGRGaWxlcyhnZXREaXJlY3RvcnlTY2FubmVyKCkuZ2V0SW5jbHVkZWRGaWxlcygpKTsKKyAgICAgICAgcmVzdWx0LmFkZEZpbGVzKGdldERpcmVjdG9yeVNjYW5uZXIoKS5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChGaWxlU2V0KSBnZXRSZWYoZ2V0UHJvamVjdCgpKSkuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXREaXJlY3RvcnlTY2FubmVyKCkuZ2V0SW5jbHVkZWRGaWxlc0NvdW50KCkKKyAgICAgICAgICAgICsgZ2V0RGlyZWN0b3J5U2Nhbm5lcigpLmdldEluY2x1ZGVkRGlyc0NvdW50KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQlppcDJSZXNvdXJjZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0JaaXAyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjhjZjdjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0JaaXAyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYnppcDIuQ0JaaXAySW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5iemlwMi5DQlppcDJPdXRwdXRTdHJlYW07CisKKy8qKgorICogQSBCemlwMiBjb21wcmVzc2VkIHJlc291cmNlLgorICoKKyAqIDxwPldyYXBzIGFyb3VuZCBhbm90aGVyIHJlc291cmNlLCBkZWxlZ2F0ZXMgYWxsIHF1cmllcyB0byB0aGF0CisgKiBvdGhlciByZXNvdXJjZSBidXQgdW5jb21wcmVzc2VzL2NvbXByZXNzZXMgc3RyZWFtcyBvbiB0aGUgZmx5LjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgQlppcDJSZXNvdXJjZSBleHRlbmRzIENvbXByZXNzZWRSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIE1BR0lDID0gbmV3IGNoYXJbXSB7J0InLCAnWid9OworCisgICAgLyoqIEEgbm8tYXJnIGNvbnN0cnVjdG9yICovCisgICAgcHVibGljIEJaaXAyUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igd2l0aCBhbm90aGVyIHJlc291cmNlIHRvIHdyYXAuCisgICAgICogQHBhcmFtIG90aGVyIHRoZSByZXNvdXJjZSB0byB3cmFwLgorICAgICAqLworICAgIHB1YmxpYyBCWmlwMlJlc291cmNlKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbiBvdGhlcikgeworICAgICAgICBzdXBlcihvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb21wcmVzcyBvbiB0aGUgZmx5IHVzaW5nIHtAbGluayBDQlppcDJJbnB1dFN0cmVhbX0uCisgICAgICogQHBhcmFtIGluIHRoZSBzdHJlYW0gdG8gd3JhcC4KKyAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gd3JhcFN0cmVhbShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQUdJQy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGluLnJlYWQoKSAhPSBNQUdJQ1tpXSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBiejIgc3RyZWFtLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQ0JaaXAySW5wdXRTdHJlYW0oaW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXByZXNzIG9uIHRoZSBmbHkgdXNpbmcge0BsaW5rIENCWmlwMk91dHB1dFN0cmVhbX0uCisgICAgICogQHBhcmFtIG91dCB0aGUgc3RyZWFtIHRvIHdyYXAuCisgICAgICogQHJldHVybiB0aGUgd3JhcHBlZCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIE91dHB1dFN0cmVhbSB3cmFwU3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFHSUMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG91dC53cml0ZShNQUdJQ1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDQlppcDJPdXRwdXRTdHJlYW0ob3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgIkJ6aXAyIi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXByZXNzaW9uTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJCemlwMiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0Jhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CYXNlUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyMmIzYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CYXNlUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRhdGFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBSZXNvdXJjZUNvbGxlY3Rpb25zIHRoYXQgbmVzdCBtdWx0aXBsZSBSZXNvdXJjZUNvbGxlY3Rpb25zLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIKKyAgICBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgUmVzb3VyY2VDb2xsZWN0aW9uLCBDbG9uZWFibGUgeworICAgIHByaXZhdGUgTGlzdCByYyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIENvbGxlY3Rpb24gY29sbCA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIGNhY2hlID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGNhY2hlIGNvbGxlY3Rpb25zLgorICAgICAqIEBwYXJhbSBiIGJvb2xlYW4gY2FjaGUgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2FjaGUoYm9vbGVhbiBiKSB7CisgICAgICAgIGNhY2hlID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWFybiB3aGV0aGVyIHRvIGNhY2hlIGNvbGxlY3Rpb25zLiBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjYWNoZSBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0NhY2hlKCkgeworICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIHJjLmNsZWFyKCk7CisgICAgICAgIEZhaWxGYXN0LmludmFsaWRhdGUodGhpcyk7CisgICAgICAgIGNvbGwgPSBudWxsOworICAgICAgICBzZXRDaGVja2VkKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBSZXNvdXJjZUNvbGxlY3Rpb24gdG8gdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAcGFyYW0gYyB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIHRvIGFkZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIGMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHJvamVjdC5nZXRQcm9qZWN0KGMpID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgICAgIGlmIChwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwLnNldFByb2plY3RSZWZlcmVuY2UoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmMuYWRkKGMpOworICAgICAgICBGYWlsRmFzdC5pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICBjb2xsID0gbnVsbDsKKyAgICAgICAgc2V0Q2hlY2tlZChmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBDb2xsZWN0aW9uIG9mIFJlc291cmNlQ29sbGVjdGlvbnMgdG8gdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAcGFyYW0gYyB0aGUgQ29sbGVjdGlvbiB3aG9zZSBlbGVtZW50cyB0byBhZGQuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQWxsKENvbGxlY3Rpb24gYykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgYWRkKChSZXNvdXJjZUNvbGxlY3Rpb24pIGkubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4gVGhlIEl0ZXJhdG9yIHJldHVybmVkCisgICAgICogd2lsbCB0aHJvdyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ucyBpZiBSZXNvdXJjZUNvbGxlY3Rpb25zCisgICAgICogYXJlIGFkZGVkIHRvIHRoaXMgY29udGFpbmVyIHdoaWxlIHRoZSBJdGVyYXRvciBpcyBpbiB1c2UuCisgICAgICogQHJldHVybiBhICJmYWlsLWZhc3QiIEl0ZXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChCYXNlUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyKSBnZXRDaGVja2VkUmVmKCkpLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICByZXR1cm4gbmV3IEZhaWxGYXN0KHRoaXMsIGNhY2hlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIpIGdldENoZWNrZWRSZWYoKSkuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKKyAgICAgICAgcmV0dXJuIGNhY2hlQ29sbGVjdGlvbigpLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBmaWxlc3lzdGVtLW9ubHkgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIpIGdldENoZWNrZWRSZWYoKSkuaXNGaWxlc3lzdGVtT25seSgpOworICAgICAgICB9CisgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKKyAgICAgICAgLy9maXJzdCB0aGUgZWFzeSB3YXksIGlmIGFsbCBjaGlsZHJlbiBhcmUgZmlsZXN5c3RlbS1vbmx5LCByZXR1cm4gdHJ1ZToKKyAgICAgICAgYm9vbGVhbiBnb0Vhcmx5ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcmMuaXRlcmF0b3IoKTsgZ29FYXJseSAmJiBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGdvRWFybHkgPSAoKFJlc291cmNlQ29sbGVjdGlvbikgaS5uZXh0KCkpLmlzRmlsZXN5c3RlbU9ubHkoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ29FYXJseSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLyogbm93IGNoZWNrIGVhY2ggUmVzb3VyY2UgaW4gY2FzZSB0aGUgY2hpbGQgb25seQorICAgICAgICAgICBsZXRzIHRocm91Z2ggZmlsZXMgZnJvbSBhbnkgY2hpbGRyZW4gSVQgbWF5IGhhdmU6ICovCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNhY2hlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaWYgKCEoaS5uZXh0KCkgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgdmVyc2lvbiBvZiBEYXRhVHlwZSB0byByZWN1cnNlIG9uIGFsbCBEYXRhVHlwZQorICAgICAqIGNoaWxkIGVsZW1lbnRzIHRoYXQgbWF5IGhhdmUgYmVlbiBhZGRlZC4KKyAgICAgKiBAcGFyYW0gc3RrIHRoZSBzdGFjayBvZiBkYXRhIHR5cGVzIHRvIHVzZSAocmVjdXJzaXZlbHkpLgorICAgICAqIEBwYXJhbSBwICAgdGhlIHByb2plY3QgdG8gdXNlIHRvIGRlcmVmZXJlbmNlIHRoZSByZWZlcmVuY2VzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoU3RhY2sgc3RrLCBQcm9qZWN0IHApCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICBzdXBlci5kaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHN0aywgcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByYy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RrLnB1c2gobyk7CisgICAgICAgICAgICAgICAgICAgIGludm9rZUNpcmN1bGFyUmVmZXJlbmNlQ2hlY2soKERhdGFUeXBlKSBvLCBzdGssIHApOworICAgICAgICAgICAgICAgICAgICBzdGsucG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmVzdGVkIFJlc291cmNlQ29sbGVjdGlvbnMuCisgICAgICogQHJldHVybiBMaXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBzeW5jaHJvbml6ZWQgTGlzdCBnZXRSZXNvdXJjZUNvbGxlY3Rpb25zKCkgeworICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSBtZXRob2QgZm9yIHN1YmNsYXNzZXMgdG8gcmV0dXJuIGEgQ29sbGVjdGlvbiBvYmplY3Qgb2YgUmVzb3VyY2VzLgorICAgICAqIEByZXR1cm4gQ29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgY2xvbmUuICBUaGUgc2V0IG9mIG5lc3RlZCByZXNvdXJjZQorICAgICAqIGNvbGxlY3Rpb25zIGlzIHNoYWxsb3dseSBjbG9uZWQuCisgICAgICogQHJldHVybiBhIGNsb25lZCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQmFzZVJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lciBjCisgICAgICAgICAgICAgICAgPSAoQmFzZVJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lcikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgIGMucmMgPSBuZXcgQXJyYXlMaXN0KHJjKTsKKyAgICAgICAgICAgIGMuY29sbCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgdGhpcyBCYXNlUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyIGFzIGEgU3RyaW5nLgorICAgICAqIEByZXR1cm4gYSBkZXNjcmlwdGl2ZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGlmIChjYWNoZUNvbGxlY3Rpb24oKS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29sbC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoaS5uZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIENvbGxlY3Rpb24gY2FjaGVDb2xsZWN0aW9uKCkgeworICAgICAgICBpZiAoY29sbCA9PSBudWxsIHx8ICFpc0NhY2hlKCkpIHsKKyAgICAgICAgICAgIGNvbGwgPSBnZXRDb2xsZWN0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQmFzZVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CYXNlUmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjE0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQmFzZVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGEgUmVzb3VyY2VDb2xsZWN0aW9uIHRoYXQgd3JhcHMgYSBzaW5nbGUgbmVzdGVkCisgKiBSZXNvdXJjZUNvbGxlY3Rpb24uCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIKKyAgICBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgUmVzb3VyY2VDb2xsZWN0aW9uLCBDbG9uZWFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfTkVTVEVEX01FU1NBR0UKKyAgICAgICAgPSAiIGV4cGVjdHMgZXhhY3RseSBvbmUgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24uIjsKKworICAgIHByaXZhdGUgUmVzb3VyY2VDb2xsZWN0aW9uIHJjOworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBjb2xsID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gY2FjaGUgY29sbGVjdGlvbnMuCisgICAgICogQHBhcmFtIGIgYm9vbGVhbiBjYWNoZSBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDYWNoZShib29sZWFuIGIpIHsKKyAgICAgICAgY2FjaGUgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlYXJuIHdoZXRoZXIgdG8gY2FjaGUgY29sbGVjdGlvbnMuIERlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICogQHJldHVybiBib29sZWFuIGNhY2hlIGZsYWcuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ2FjaGUoKSB7CisgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBSZXNvdXJjZUNvbGxlY3Rpb24gdG8gdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAcGFyYW0gYyB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIHRvIGFkZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIGMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgb25lTmVzdGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBjOworICAgICAgICBpZiAoUHJvamVjdC5nZXRQcm9qZWN0KHJjKSA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7CisgICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcC5zZXRQcm9qZWN0UmVmZXJlbmNlKHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZXRDaGVja2VkKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyKSBnZXRDaGVja2VkUmVmKCkpLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICByZXR1cm4gbmV3IEZhaWxGYXN0KHRoaXMsIGNhY2hlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyKSBnZXRDaGVja2VkUmVmKCkpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CisgICAgICAgIHJldHVybiBjYWNoZUNvbGxlY3Rpb24oKS5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgZmlsZXN5c3RlbS1vbmx5IHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChCYXNlUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyKSBnZXRDaGVja2VkUmVmKCkpLmlzRmlsZXN5c3RlbU9ubHkoKTsKKyAgICAgICAgfQorICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CisKKyAgICAgICAgaWYgKHJjID09IG51bGwgfHwgcmMuaXNGaWxlc3lzdGVtT25seSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvKiBub3cgY2hlY2sgZWFjaCBSZXNvdXJjZSBpbiBjYXNlIHRoZSBjaGlsZCBvbmx5CisgICAgICAgICAgIGxldHMgdGhyb3VnaCBmaWxlcyBmcm9tIGFueSBjaGlsZHJlbiBJVCBtYXkgaGF2ZTogKi8KKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY2FjaGVDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoIShpLm5leHQoKSBpbnN0YW5jZW9mIEZpbGVSZXNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHRoZSB2ZXJzaW9uIG9mIERhdGFUeXBlIHRvIHJlY3Vyc2Ugb24gYWxsIERhdGFUeXBlCisgICAgICogY2hpbGQgZWxlbWVudHMgdGhhdCBtYXkgaGF2ZSBiZWVuIGFkZGVkLgorICAgICAqIEBwYXJhbSBzdGsgdGhlIHN0YWNrIG9mIGRhdGEgdHlwZXMgdG8gdXNlIChyZWN1cnNpdmVseSkuCisgICAgICogQHBhcmFtIHAgICB0aGUgcHJvamVjdCB0byB1c2UgdG8gZGVyZWZlcmVuY2UgdGhlIHJlZmVyZW5jZXMuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjayBzdGssIFByb2plY3QgcCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLmRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyYyBpbnN0YW5jZW9mIERhdGFUeXBlKSB7CisgICAgICAgICAgICAgICAgc3RrLnB1c2gocmMpOworICAgICAgICAgICAgICAgIGludm9rZUNpcmN1bGFyUmVmZXJlbmNlQ2hlY2soKERhdGFUeXBlKSByYywgc3RrLCBwKTsKKyAgICAgICAgICAgICAgICBzdGsucG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDaGVja2VkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuZXN0ZWQgUmVzb3VyY2VDb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4gYSBSZXNvdXJjZUNvbGxlY3Rpb24uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBubyBuZXN0ZWQgUmVzb3VyY2VDb2xsZWN0aW9uIGhhcyBiZWVuIHByb3ZpZGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBzeW5jaHJvbml6ZWQgUmVzb3VyY2VDb2xsZWN0aW9uIGdldFJlc291cmNlQ29sbGVjdGlvbigpIHsKKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICBpZiAocmMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgb25lTmVzdGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFJlc291cmNlcy4KKyAgICAgKiBAcmV0dXJuIENvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IENvbGxlY3Rpb24gZ2V0Q29sbGVjdGlvbigpOworCisgICAgLyoqCisgICAgICogRm9ybWF0IHRoaXMgQmFzZVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIgYXMgYSBTdHJpbmcuCisgICAgICogQHJldHVybiBhIGRlc2NyaXB0aXZlIDxjb2RlPlN0cmluZzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhY2hlQ29sbGVjdGlvbigpLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb2xsLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChpLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiBjYWNoZUNvbGxlY3Rpb24oKSB7CisgICAgICAgIGlmIChjb2xsID09IG51bGwgfHwgIWlzQ2FjaGUoKSkgeworICAgICAgICAgICAgY29sbCA9IGdldENvbGxlY3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29sbDsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ1aWxkRXhjZXB0aW9uIG9uZU5lc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZEV4Y2VwdGlvbihzdXBlci50b1N0cmluZygpICsgT05FX05FU1RFRF9NRVNTQUdFKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Db21wcmVzc2VkUmVzb3VyY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Db21wcmVzc2VkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTllNmYzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0NvbXByZXNzZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogQSBjb21wcmVzc2VkIHJlc291cmNlLgorICoKKyAqIDxwPldyYXBzIGFyb3VuZCBhbm90aGVyIHJlc291cmNlLCBkZWxlZ2F0ZXMgYWxsIHF1ZXJpZXMgKGV4Y2VwdAorICogZ2V0U2l6ZSkgdG8gdGhhdCBvdGhlciByZXNvdXJjZSBidXQgdW5jb21wcmVzc2VzL2NvbXByZXNzZXMgc3RyZWFtcworICogb24gdGhlIGZseS48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXByZXNzZWRSZXNvdXJjZSBleHRlbmRzIFJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDgxOTI7CisKKyAgICBwcml2YXRlIFJlc291cmNlIHJlc291cmNlOworCisgICAgLyoqIG5vIGFyZyBjb25zdHJ1Y3RvciAqLworICAgIHB1YmxpYyBDb21wcmVzc2VkUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igd2l0aCBhbm90aGVyIHJlc291cmNlIHRvIHdyYXAuCisgICAgICogQHBhcmFtIG90aGVyIHRoZSByZXNvdXJjZSB0byB3cmFwLgorICAgICAqLworICAgIHB1YmxpYyBDb21wcmVzc2VkUmVzb3VyY2UoUmVzb3VyY2VDb2xsZWN0aW9uIG90aGVyKSB7CisgICAgICAgIGFkZENvbmZpZ3VyZWQob3RoZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlc291cmNlIHRvIHdyYXAgdXNpbmcgYSBzaW5nbGUtZWxlbWVudCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSBhIHRoZSByZXNvdXJjZSB0byB3cmFwIGFzIGEgc2luZ2xlIGVsZW1lbnQgUmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKFJlc291cmNlQ29sbGVjdGlvbiBhKSB7CisgICAgICAgIGNoZWNrQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInlvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHJlc291cmNlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib25seSBzaW5nbGUgYXJndW1lbnQgcmVzb3VyY2UgY29sbGVjdGlvbnMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFyZSBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZSA9IChSZXNvdXJjZSkgYS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHdyYXBwZWQgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuLCBub3QgYWxsb3dlZCB0byBzZXQgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLgorICAgICAqIEBwYXJhbSBuYW1lIG5vdCB1c2VkLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWx3YXlzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigieW91IGNhbid0IGNoYW5nZSB0aGUgbmFtZSBvZiBhIGNvbXByZXNzZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcmVzb3VyY2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXhpc3RzIGF0dHJpYnV0ZSB0ZWxscyB3aGV0aGVyIGEgZmlsZSBleGlzdHMuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgZXhpc3RzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXhpc3RzKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2UoKS5pc0V4aXN0cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXhpc3RzIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gZXhpc3RzIGlmIHRydWUsIHRoaXMgcmVzb3VyY2UgZXhpc3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4aXN0cyhib29sZWFuIGV4aXN0cykgeworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInlvdSBjYW4ndCBjaGFuZ2UgdGhlIGV4aXN0cyBzdGF0ZSBvZiBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb21wcmVzc2VkIHJlc291cmNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbHMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSAwMS4wMS4xOTcwIC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gMCBpZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgdG8gbWlycm9yIHRoZSBiZWhhdmlvcgorICAgICAqIG9mIHtAbGluayBqYXZhLmlvLkZpbGUgRmlsZX0uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2UoKS5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBzZXRMYXN0TW9kaWZpZWQuCisgICAgICogQHBhcmFtIGxhc3Rtb2RpZmllZCBub3QgdXNlZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGFsd2F5cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyBsYXN0bW9kaWZpZWQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigieW91IGNhbid0IGNoYW5nZSB0aGUgdGltZXN0YW1wIG9mIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNvbXByZXNzZWQgcmVzb3VyY2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxscyBpZiB0aGUgcmVzb3VyY2UgaXMgYSBkaXJlY3RvcnkuCisgICAgICogQHJldHVybiBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgcmVzb3VyY2UgaXMgYSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZSgpLmlzRGlyZWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgc2V0RGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBkaXJlY3Rvcnkgbm90IHVzZWQuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KGJvb2xlYW4gZGlyZWN0b3J5KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInlvdSBjYW4ndCBjaGFuZ2UgdGhlIGRpcmVjdG9yeSBzdGF0ZSBvZiBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb21wcmVzc2VkIHJlc291cmNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgc2l6ZSwgYXMgYSBsb25nLCAwIGlmIHRoZSBSZXNvdXJjZSBkb2VzIG5vdCBleGlzdCAoZm9yCisgICAgICogICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggamF2YS5pby5GaWxlKSwgb3IgVU5LTk9XTl9TSVpFIGlmIG5vdCBrbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworICAgICAgICBpZiAoaXNFeGlzdHMoKSkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbiA9IGdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IHJlYWROb3c7CisgICAgICAgICAgICAgICAgd2hpbGUgKChyZWFkTm93ID0gaW4ucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSByZWFkTm93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjYXVnaHQgZXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldE5hbWUoKSwgZXgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBzZXRTaXplLgorICAgICAqIEBwYXJhbSBzaXplIG5vdCB1c2VkLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWx3YXlzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNpemUobG9uZyBzaXplKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInlvdSBjYW4ndCBjaGFuZ2UgdGhlIHNpemUgb2YgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY29tcHJlc3NlZCByZXNvdXJjZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlcyB0byBhIGNvbXBhcmlzb24gb2YgbmFtZXMuCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBvYmplY3QgdG8gY29tcGFyZSB0by4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgUmVzb3VyY2UKKyAgICAgKiAgICAgICAgIGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIFJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQ29tcHJlc3NlZFJlc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2UoKS5jb21wYXJlVG8oCisgICAgICAgICAgICAgICAgKChDb21wcmVzc2VkUmVzb3VyY2UpIG90aGVyKS5nZXRSZXNvdXJjZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2UoKS5jb21wYXJlVG8ob3RoZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gaGFzaCBjb2RlIGFzIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2UoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBJbnB1dFN0cmVhbSBmb3IgdGhlIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gY29udGFpbmluZyB0aGlzIFJlc291cmNlJ3MgY29udGVudC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBwcm92aWRlIHRoZSBjb250ZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIFJlc291cmNlIGFzIGEgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgSW5wdXRTdHJlYW1zIGFyZSBub3QKKyAgICAgKiAgICAgICAgIHN1cHBvcnRlZCBmb3IgdGhpcyBSZXNvdXJjZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gZ2V0UmVzb3VyY2UoKS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgaW4gPSB3cmFwU3RyZWFtKGluKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIE91dHB1dFN0cmVhbSBmb3IgdGhlIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gYW4gT3V0cHV0U3RyZWFtIHRvIHdoaWNoIGNvbnRlbnQgY2FuIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB1bmFibGUgdG8gcHJvdmlkZSB0aGUgY29udGVudCBvZiB0aGlzCisgICAgICogICAgICAgICBSZXNvdXJjZSBhcyBhIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIE91dHB1dFN0cmVhbXMgYXJlIG5vdAorICAgICAqICAgICAgICAgc3VwcG9ydGVkIGZvciB0aGlzIFJlc291cmNlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gZ2V0UmVzb3VyY2UoKS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQgPSB3cmFwU3RyZWFtKG91dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgUmVzb3VyY2UgaXMgYSBGaWxlUmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGlzIFJlc291cmNlIGZvcm1hdHRlZCBhcyBhIFN0cmluZy4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRDb21wcmVzc2lvbk5hbWUoKSArICIgY29tcHJlc3NlZCAiCisgICAgICAgICAgICArIGdldFJlc291cmNlKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIGJhc2UgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVmZXJlbmNlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgeworICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyBzdXBwb3NlZCB0byB3cmFwIHRoZSBzdHJlYW0gdG8gYWxsb3cgZGVjb21wcmVzc2lvbiBvbiB0aGUgZmx5LgorICAgICAqCisgICAgICogQHBhcmFtIGluIElucHV0U3RyZWFtIHRvIHdyYXAsIHdpbGwgbmV2ZXIgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIGEgY29tcHJlc3NlZCBpbnB1dHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSW5wdXRTdHJlYW0gd3JhcFN0cmVhbShJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogSXMgc3VwcG9zZWQgdG8gd3JhcCB0aGUgc3RyZWFtIHRvIGFsbG93IGNvbXByZXNzaW9uIG9uIHRoZSBmbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0IE91dHB1dFN0cmVhbSB0byB3cmFwLCB3aWxsIG5ldmVyIGJlIG51bGwuCisgICAgICogQHJldHVybiBhIGNvbXByZXNzZWQgb3V0cHV0c3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPdXRwdXRTdHJlYW0gd3JhcFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21wcmVzc2lvbk5hbWUoKTsKKworICAgIHByaXZhdGUgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJubyByZXNvdXJjZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRGlmZmVyZW5jZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0RpZmZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGM1YWZiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0RpZmZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworCisvKioKKyAqIFJlc291cmNlQ29sbGVjdGlvbiByZXByZXNlbnRpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICogdHdvIG9yIG1vcmUgbmVzdGVkIFJlc291cmNlQ29sbGVjdGlvbnMuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgRGlmZmVyZW5jZSBleHRlbmRzIEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIgeworCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSBuZXN0ZWQgUmVzb3VyY2VDb2xsZWN0aW9ucy4KKyAgICAgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBSZXNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q29sbGVjdGlvbigpIHsKKyAgICAgICAgTGlzdCByYyA9IGdldFJlc291cmNlQ29sbGVjdGlvbnMoKTsKKyAgICAgICAgaW50IHNpemUgPSByYy5zaXplKCk7CisgICAgICAgIGlmIChzaXplIDwgMikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZGlmZmVyZW5jZSBvZiAiICsgc2l6ZQorICAgICAgICAgICAgICAgICsgIiByZXNvdXJjZSBjb2xsZWN0aW9uIiArICgoc2l6ZSA9PSAxKSA/ICIiIDogInMiKQorICAgICAgICAgICAgICAgICsgIiBpcyB1bmRlZmluZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgSGFzaFNldCBocyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIEFycmF5TGlzdCBhbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciByY0l0ZXIgPSByYy5pdGVyYXRvcigpOyByY0l0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciByID0gbmV4dFJDKHJjSXRlcikuaXRlcmF0b3IoKTsgci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG5leHQgPSByLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaHMuYWRkKG5leHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGFsLmFkZChuZXh0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbC5yZW1vdmUobmV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUNvbGxlY3Rpb24gbmV4dFJDKEl0ZXJhdG9yIGkpIHsKKyAgICAgICAgcmV0dXJuIChSZXNvdXJjZUNvbGxlY3Rpb24pIGkubmV4dCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZhaWxGYXN0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmFpbEZhc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDI0ZTcxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZhaWxGYXN0LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3IgUmVzb3VyY2VDb2xsZWN0aW9ucyB0byByZXR1cm4gSXRlcmF0b3JzCisgKiB0aGF0IGZhaWwgb24gY2hhbmdlcyB0byB0aGUgb2JqZWN0LgorICogQHNpbmNlIEFudCAxLjcKKyAqLworLypwYWNrYWdlLXByaXZhdGUqLyBjbGFzcyBGYWlsRmFzdCBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWFrSGFzaE1hcCBNQVAgPSBuZXcgV2Vha0hhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGUgYW55IGluLXVzZSBJdGVyYXRvcnMgZnJvbSB0aGUgc3BlY2lmaWVkIE9iamVjdC4KKyAgICAgKiBAcGFyYW0gbyB0aGUgcGFyZW50IE9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgaW52YWxpZGF0ZShPYmplY3QgbykgeworICAgICAgICBTZXQgcyA9IChTZXQpIChNQVAuZ2V0KG8pKTsKKyAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEZhaWxGYXN0IGYpIHsKKyAgICAgICAgU2V0IHMgPSAoU2V0KSAoTUFQLmdldChmLnBhcmVudCkpOworICAgICAgICBpZiAocyA9PSBudWxsKSB7CisgICAgICAgICAgICBzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIE1BUC5wdXQoZi5wYXJlbnQsIHMpOworICAgICAgICB9CisgICAgICAgIHMuYWRkKGYpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShGYWlsRmFzdCBmKSB7CisgICAgICAgIFNldCBzID0gKFNldCkgKE1BUC5nZXQoZi5wYXJlbnQpKTsKKyAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5yZW1vdmUoZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBmYWlsRmFzdChGYWlsRmFzdCBmKSB7CisgICAgICAgIFNldCBzID0gKFNldCkgKE1BUC5nZXQoZi5wYXJlbnQpKTsKKyAgICAgICAgaWYgKCFzLmNvbnRhaW5zKGYpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgcGFyZW50OworICAgIHByaXZhdGUgSXRlcmF0b3Igd3JhcHBlZDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBGYWlsRmFzdCBJdGVyYXRvciB3cmFwcGluZyB0aGUgc3BlY2lmaWVkIEl0ZXJhdG9yCisgICAgICogYW5kIGRlcGVuZGVudCB1cG9uIHRoZSBzcGVjaWZpZWQgcGFyZW50IE9iamVjdC4KKyAgICAgKiBAcGFyYW0gbyB0aGUgcGFyZW50IE9iamVjdC4KKyAgICAgKiBAcGFyYW0gaSB0aGUgd3JhcHBlZCBJdGVyYXRvci4KKyAgICAgKi8KKyAgICBGYWlsRmFzdChPYmplY3QgbywgSXRlcmF0b3IgaSkgeworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnQgb2JqZWN0IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW5ub3Qgd3JhcCBudWxsIGl0ZXJhdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgcGFyZW50ID0gbzsKKyAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICB3cmFwcGVkID0gaTsKKyAgICAgICAgICAgIGFkZCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIEl0ZXJhdG9yIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICBpZiAod3JhcHBlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmFpbEZhc3QodGhpcyk7CisgICAgICAgIHJldHVybiB3cmFwcGVkLmhhc05leHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBJdGVyYXRvciBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIG5vIG1vcmUgZWxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICBpZiAod3JhcHBlZCA9PSBudWxsIHx8ICF3cmFwcGVkLmhhc05leHQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsRmFzdCh0aGlzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLm5leHQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICghd3JhcHBlZC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVkID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZW1vdmUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBJdGVyYXRvciBjb250cmFjdC4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZVByb3ZpZGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzZjA4OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKg0KKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQorDQorLyoqDQorICogVGhpcyBpcyBhbiBpbnRlcmZhY2UgdGhhdCByZXNvdXJjZXMgdGhhdCBjYW4gcHJvdmlkZSBhIGZpbGUgc2hvdWxkIGltcGxlbWVudC4NCisgKiBUaGlzIGlzIGEgcmVmYWN0b3Jpbmcgb2Yge0BsaW5rIEZpbGVSZXNvdXJjZX0sIHRvIGFsbG93IG90aGVyIHJlc291cmNlcw0KKyAqIHRvIGFjdCBhcyBzb3VyY2VzIG9mIGZpbGVzIChhbmQgdG8gbWFrZSBjb21wb25lbnRzIHRoYXQgb25seSBzdXBwb3J0DQorICogZmlsZS1iYXNlZCByZXNvdXJjZXMgZnJvbSBvbmx5IHN1cHBvcnQgRmlsZVJlc291cmNlIHJlc291cmNlcy4NCisgKiBAc2luY2UgQW50IDEuOA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgRmlsZVByb3ZpZGVyIHsNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzIFJlc291cmNlLg0KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlLg0KKyAgICAgKi8NCisgICAgRmlsZSBnZXRGaWxlKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJhNzMxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZpbGVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VGYWN0b3J5OworCisvKioKKyAqIEEgUmVzb3VyY2UgcmVwcmVzZW50YXRpb24gb2YgYSBGaWxlLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEZpbGVSZXNvdXJjZSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgVG91Y2hhYmxlLCBGaWxlUHJvdmlkZXIsCisgICAgICAgIFJlc291cmNlRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9GSUxFCisgICAgICAgID0gUmVzb3VyY2UuZ2V0TWFnaWNOdW1iZXIoIm51bGwgZmlsZSIuZ2V0Qnl0ZXMoKSk7CisKKyAgICBwcml2YXRlIEZpbGUgZmlsZTsKKyAgICBwcml2YXRlIEZpbGUgYmFzZURpcjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEZpbGVSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRmlsZVJlc291cmNlIHVzaW5nIHRoZSBzcGVjaWZpZWQgYmFzZWRpciBhbmQgcmVsYXRpdmUgbmFtZS4KKyAgICAgKiBAcGFyYW0gYiAgICAgIHRoZSBiYXNlZGlyIGFzIEZpbGUuCisgICAgICogQHBhcmFtIG5hbWUgICB0aGUgcmVsYXRpdmUgZmlsZW5hbWUuCisgICAgICovCisgICAgcHVibGljIEZpbGVSZXNvdXJjZShGaWxlIGIsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNldEZpbGUoRklMRV9VVElMUy5yZXNvbHZlRmlsZShiLCBuYW1lKSk7CisgICAgICAgIHNldEJhc2VEaXIoYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEZpbGVSZXNvdXJjZSBmcm9tIGEgRmlsZS4KKyAgICAgKiBAcGFyYW0gZiB0aGUgRmlsZSByZXByZXNlbnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZVJlc291cmNlKEZpbGUgZikgeworICAgICAgICBzZXRGaWxlKGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBBbnQgYXR0cmlidXRlIGludHJvc3BlY3Rpb24uCisgICAgICogQHBhcmFtIHAgdGhlIFByb2plY3QgYWdhaW5zdCB3aGljaCB0byByZXNvbHZlIDxjb2RlPnM8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzIHRoZSBhYnNvbHV0ZSBvciBQcm9qZWN0LXJlbGF0aXZlIGZpbGVuYW1lIGFzIGEgU3RyaW5nLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuSW50cm9zcGVjdGlvbkhlbHBlcgorICAgICAqLworICAgIHB1YmxpYyBGaWxlUmVzb3VyY2UoUHJvamVjdCBwLCBTdHJpbmcgcykgeworICAgICAgICB0aGlzKHAucmVzb2x2ZUZpbGUocykpOworICAgICAgICBzZXRQcm9qZWN0KHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgRmlsZSBmb3IgdGhpcyBGaWxlUmVzb3VyY2UuCisgICAgICogQHBhcmFtIGYgdGhlIEZpbGUgdG8gYmUgcmVwcmVzZW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGYpIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICBmaWxlID0gZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBGaWxlUmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgRmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/ICgoRmlsZVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldEZpbGUoKSA6IGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiYXNlZGlyIGZvciB0aGlzIEZpbGVSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYiB0aGUgYmFzZWRpciBhcyBGaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VEaXIoRmlsZSBiKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgYmFzZURpciA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiYXNlZGlyIHRvIHdoaWNoIHRoZSBuYW1lIGlzIHJlbGF0aXZlLgorICAgICAqIEByZXR1cm4gdGhlIGJhc2VkaXIgYXMgRmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRCYXNlRGlyKCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKQorICAgICAgICAgICAgPyAoKEZpbGVSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRCYXNlRGlyKCkgOiBiYXNlRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgc3VwZXIgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVmZXJlbmNlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgeworICAgICAgICBpZiAoZmlsZSAhPSBudWxsIHx8IGJhc2VEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBGaWxlUmVzb3VyY2UuICBJZiB0aGUgYmFzZWRpciBpcyBzZXQsCisgICAgICogdGhlIG5hbWUgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGF0LiAgT3RoZXJ3aXNlIHRoZSBiYXNlbmFtZQorICAgICAqIG9ubHkgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIEZpbGUgYiA9IGdldEJhc2VEaXIoKTsKKyAgICAgICAgcmV0dXJuIGIgPT0gbnVsbCA/IGdldE5vdE51bGxGaWxlKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICA6IEZJTEVfVVRJTFMucmVtb3ZlTGVhZGluZ1BhdGgoYiwgZ2V0Tm90TnVsbEZpbGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGVhcm4gd2hldGhlciB0aGlzIGZpbGUgZXhpc3RzLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4aXN0cygpIHsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkgPyAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmlzRXhpc3RzKCkKKyAgICAgICAgICAgIDogZ2V0Tm90TnVsbEZpbGUoKS5leGlzdHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSAwMS4wMS4xOTcwIC4KKyAgICAgKiBAcmV0dXJuIDAgaWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkKKyAgICAgICAgICAgID8gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRMYXN0TW9kaWZpZWQoKQorICAgICAgICAgICAgOiBnZXROb3ROdWxsRmlsZSgpLmxhc3RNb2RpZmllZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlYXJuIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGEgZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGhlIHJlc291cmNlIGlzIGEgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNEaXJlY3RvcnkoKQorICAgICAgICAgICAgOiBnZXROb3ROdWxsRmlsZSgpLmlzRGlyZWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgc2l6ZSwgYXMgYSBsb25nLCAwIGlmIHRoZSBSZXNvdXJjZSBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0U2l6ZSgpCisgICAgICAgICAgICA6IGdldE5vdE51bGxGaWxlKCkubGVuZ3RoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIElucHV0U3RyZWFtIGZvciByZWFkaW5nIHRoZSBjb250ZW50cyBvZiB0aGlzIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gb2JqZWN0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpCisgICAgICAgICAgICA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0SW5wdXRTdHJlYW0oKQorICAgICAgICAgICAgOiBuZXcgRmlsZUlucHV0U3RyZWFtKGdldE5vdE51bGxGaWxlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBPdXRwdXRTdHJlYW0gZm9yIHRoZSBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGFuIE91dHB1dFN0cmVhbSB0byB3aGljaCBjb250ZW50IGNhbiBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdW5hYmxlIHRvIHByb3ZpZGUgdGhlIGNvbnRlbnQgb2YgdGhpcworICAgICAqICAgICAgICAgUmVzb3VyY2UgYXMgYSBzdHJlYW0uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBPdXRwdXRTdHJlYW1zIGFyZSBub3QKKyAgICAgKiAgICAgICAgIHN1cHBvcnRlZCBmb3IgdGhpcyBSZXNvdXJjZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICB9CisgICAgICAgIEZpbGUgZiA9IGdldE5vdE51bGxGaWxlKCk7CisgICAgICAgIGlmIChmLmV4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAoZi5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWxlIHAgPSBmLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgIShwLmV4aXN0cygpKSkgeworICAgICAgICAgICAgICAgIHAubWtkaXJzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdGhpcyBGaWxlUmVzb3VyY2UgdG8gYW5vdGhlciBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYW5vdGhlciB0aGUgb3RoZXIgUmVzb3VyY2UgYWdhaW5zdCB3aGljaCB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBGaWxlUmVzb3VyY2UKKyAgICAgKiAgICAgICAgIGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIFJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBhbm90aGVyKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChDb21wYXJhYmxlKSBnZXRDaGVja2VkUmVmKCkpLmNvbXBhcmVUbyhhbm90aGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5lcXVhbHMoYW5vdGhlcikpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChhbm90aGVyLmdldENsYXNzKCkuZXF1YWxzKGdldENsYXNzKCkpKSB7CisgICAgICAgICAgICBGaWxlUmVzb3VyY2Ugb3RoZXJmciA9IChGaWxlUmVzb3VyY2UpIGFub3RoZXI7CisgICAgICAgICAgICBGaWxlIGYgPSBnZXRGaWxlKCk7CisgICAgICAgICAgICBpZiAoZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZSBvZiA9IG90aGVyZnIuZ2V0RmlsZSgpOworICAgICAgICAgICAgaWYgKG9mID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmLmNvbXBhcmVUbyhvZik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmVUbyhhbm90aGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIGFub3RoZXIgT2JqZWN0IHRvIHRoaXMgRmlsZVJlc291cmNlIGZvciBlcXVhbGl0eS4KKyAgICAgKiBAcGFyYW0gYW5vdGhlciB0aGUgb3RoZXIgT2JqZWN0IHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiB0cnVlIGlmIGFub3RoZXIgaXMgYSBGaWxlUmVzb3VyY2UgcmVwcmVzZW50aW5nIHRoZSBzYW1lIGZpbGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbm90aGVyKSB7CisgICAgICAgIGlmICh0aGlzID09IGFub3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLmVxdWFscyhhbm90aGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShhbm90aGVyLmdldENsYXNzKCkuZXF1YWxzKGdldENsYXNzKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEZpbGVSZXNvdXJjZSBvdGhlcmZyID0gKEZpbGVSZXNvdXJjZSkgYW5vdGhlcjsKKyAgICAgICAgcmV0dXJuIGdldEZpbGUoKSA9PSBudWxsCisgICAgICAgICAgICA/IG90aGVyZnIuZ2V0RmlsZSgpID09IG51bGwKKyAgICAgICAgICAgIDogZ2V0RmlsZSgpLmVxdWFscyhvdGhlcmZyLmdldEZpbGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBoYXNoIGNvZGUgYXMgaW50LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1BR0lDICogKGdldEZpbGUoKSA9PSBudWxsID8gTlVMTF9GSUxFIDogZ2V0RmlsZSgpLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGlzIEZpbGVSZXNvdXJjZSBmb3JtYXR0ZWQgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIih1bmJvdW5kIGZpbGUgcmVzb3VyY2UpIjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgYWJzb2x1dGVQYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgcmV0dXJuIEZJTEVfVVRJTFMubm9ybWFsaXplKGFic29sdXRlUGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIFJlc291cmNlIGlzIGEgRmlsZVJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CisgICAgICAgIHJldHVybiAhaXNSZWZlcmVuY2UoKQorICAgICAgICAgICAgfHwgKChGaWxlUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNGaWxlc3lzdGVtT25seSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgVG91Y2hhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAcGFyYW0gbW9kVGltZSBuZXcgbGFzdCBtb2RpZmljYXRpb24gdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0b3VjaChsb25nIG1vZFRpbWUpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgICgoRmlsZVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLnRvdWNoKG1vZFRpbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGdldE5vdE51bGxGaWxlKCkuc2V0TGFzdE1vZGlmaWVkKG1vZFRpbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzIEZpbGVSZXNvdXJjZSwgZW5zdXJpbmcgaXQgaXMgbm90IG51bGwuCisgICAgICogQHJldHVybiB0aGUgbm90LW51bGwgRmlsZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGZpbGUgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXROb3ROdWxsRmlsZSgpIHsKKyAgICAgICAgaWYgKGdldEZpbGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgYXR0cmlidXRlIGlzIG51bGwhIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldEZpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgcmVzb3VyY2UgdGhhdCBtYXRjaGVzIGEgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aC4KKyAgICAgKiBJZiB0aGUgY3VycmVudCBpbnN0YW5jZSBoYXMgYSBiYXNlRGlyIGF0dHJpYnV0ZSwgaXQgaXMgY29waWVkLgorICAgICAqIEBwYXJhbSBwYXRoIHJlbGF0aXZlL2Fic29sdXRlIHBhdGggdG8gYSByZXNvdXJjZQorICAgICAqIEByZXR1cm4gYSBuZXcgcmVzb3VyY2Ugb2YgdHlwZSBGaWxlUmVzb3VyY2UKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGRlc2lyZWQKKyAgICAgKiBAc2luY2UgQW50MS44CisgICAgICovCisgICAgcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIEZpbGUgbmV3ZmlsZSA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0RmlsZSgpLCBwYXRoKTsKKyAgICAgICAgRmlsZVJlc291cmNlIGZpbGVSZXNvdXJjZSA9IG5ldyBGaWxlUmVzb3VyY2UobmV3ZmlsZSk7CisgICAgICAgIGZpbGVSZXNvdXJjZS5zZXRCYXNlRGlyKGdldEJhc2VEaXIoKSk7CisgICAgICAgIHJldHVybiBmaWxlUmVzb3VyY2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZpbGVSZXNvdXJjZUl0ZXJhdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZVJlc291cmNlSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGJkYmRhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZpbGVSZXNvdXJjZUl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBJdGVyYXRvciBvZiBGaWxlUmVzb3VyY2VzIGZyb20gZmlsZW5hbWVzLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEZpbGVSZXNvdXJjZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgeworICAgIHByaXZhdGUgRmlsZSBiYXNlZGlyOworICAgIHByaXZhdGUgU3RyaW5nW10gZmlsZXM7CisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZVJlc291cmNlSXRlcmF0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEZpbGVSZXNvdXJjZUl0ZXJhdG9yIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBiYXNlIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gZiB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZVJlc291cmNlSXRlcmF0b3IoRmlsZSBmKSB7CisgICAgICAgIGJhc2VkaXIgPSBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvciBvdmVyIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWVzLAorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgYmFzZSBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGYgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoaXMgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHMgdGhlIFN0cmluZ1tdIG9mIGZpbGVuYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZVJlc291cmNlSXRlcmF0b3IoRmlsZSBmLCBTdHJpbmdbXSBzKSB7CisgICAgICAgIHRoaXMoZik7CisgICAgICAgIGFkZEZpbGVzKHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhcnJheSBvZiBmaWxlbmFtZXMgdG8gdGhpcyBGaWxlUmVzb3VyY2VJdGVyYXRvci4KKyAgICAgKiBAcGFyYW0gcyB0aGUgZmlsZW5hbWVzIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlcyhTdHJpbmdbXSBzKSB7CisgICAgICAgIGludCBzdGFydCA9IChmaWxlcyA9PSBudWxsKSA/IDAgOiBmaWxlcy5sZW5ndGg7CisgICAgICAgIFN0cmluZ1tdIG5ld2ZpbGVzID0gbmV3IFN0cmluZ1tzdGFydCArIHMubGVuZ3RoXTsKKyAgICAgICAgaWYgKHN0YXJ0ID4gMCkgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmaWxlcywgMCwgbmV3ZmlsZXMsIDAsIHN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBmaWxlcyA9IG5ld2ZpbGVzOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHMsIDAsIGZpbGVzLCBzdGFydCwgcy5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgb3V0IHdoZXRoZXIgdGhpcyBGaWxlUmVzb3VyY2VJdGVyYXRvciBoYXMgbW9yZSBlbGVtZW50cy4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgUmVzb3VyY2VzIHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gcG9zIDwgZmlsZXMubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhpcyBGaWxlUmVzb3VyY2VJdGVyYXRvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IE9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgIHJldHVybiBuZXh0UmVzb3VyY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3QgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBuZXh0IHJlc291cmNlLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgRmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZVJlc291cmNlIG5leHRSZXNvdXJjZSgpIHsKKyAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2UoYmFzZWRpciwgZmlsZXNbcG9zKytdKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlcy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZpbGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0ZjVkZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlcy5qYXZhCkBAIC0wLDAgKzEsNTA2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkFic3RyYWN0U2VsZWN0b3JDb250YWluZXI7CisKKy8qKgorICogUmVzb3VyY2VDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uOyBsaWtlIEFic3RyYWN0RmlsZVNldCB3aXRoIGFic29sdXRlIHBhdGhzLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEZpbGVzIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RvckNvbnRhaW5lcgorICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBSZXNvdXJjZUNvbGxlY3Rpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3IgRU1QVFlfSVRFUkFUT1IKKyAgICAgICAgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQuaXRlcmF0b3IoKTsKKworICAgIHByaXZhdGUgUGF0dGVyblNldCBkZWZhdWx0UGF0dGVybnMgPSBuZXcgUGF0dGVyblNldCgpOworICAgIHByaXZhdGUgVmVjdG9yIGFkZGl0aW9uYWxQYXR0ZXJucyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvciBzZWxlY3RvcnMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGZvbGxvd1N5bWxpbmtzID0gdHJ1ZTsKKworICAgIC8qIGNhY2hlZCBEaXJlY3RvcnlTY2FubmVyIGluc3RhbmNlICovCisgICAgcHJpdmF0ZSBEaXJlY3RvcnlTY2FubmVyIGRzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5GaWxlczwvY29kZT4gY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZXMoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IDxjb2RlPkZpbGVzPC9jb2RlPiBjb2xsZWN0aW9uLCBzaGFsbG93bHkgY2xvbmVkCisgICAgICogZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPkZpbGVzPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZiB0aGUgPGNvZGU+RmlsZXM8L2NvZGU+IHRvIHVzZSBhcyBhIHRlbXBsYXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlcyhGaWxlcyBmKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdFBhdHRlcm5zID0gZi5kZWZhdWx0UGF0dGVybnM7CisgICAgICAgIHRoaXMuYWRkaXRpb25hbFBhdHRlcm5zID0gZi5hZGRpdGlvbmFsUGF0dGVybnM7CisgICAgICAgIHRoaXMuc2VsZWN0b3JzID0gZi5zZWxlY3RvcnM7CisgICAgICAgIHRoaXMudXNlRGVmYXVsdEV4Y2x1ZGVzID0gZi51c2VEZWZhdWx0RXhjbHVkZXM7CisgICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGYuY2FzZVNlbnNpdGl2ZTsKKyAgICAgICAgdGhpcy5mb2xsb3dTeW1saW5rcyA9IGYuZm9sbG93U3ltbGlua3M7CisgICAgICAgIHRoaXMuZHMgPSBmLmRzOworICAgICAgICBzZXRQcm9qZWN0KGYuZ2V0UHJvamVjdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoaXMgaW5zdGFuY2UgaW4gZWZmZWN0IGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiA8cD5Zb3UgbXVzdCBub3Qgc2V0IGFub3RoZXIgYXR0cmlidXRlIG9yIG5lc3QgZWxlbWVudHMgaW5zaWRlCisgICAgICogdGhpcyBlbGVtZW50IGlmIHlvdSBtYWtlIGl0IGEgcmVmZXJlbmNlLjwvcD4KKyAgICAgKiBAcGFyYW0gciB0aGUgPGNvZGU+UmVmZXJlbmNlPC9jb2RlPiB0byB1c2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoYXNQYXR0ZXJucyhkZWZhdWx0UGF0dGVybnMpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIGlmICghYWRkaXRpb25hbFBhdHRlcm5zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNlbGVjdG9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmVzdGVkIHBhdHRlcm5zZXQuCisgICAgICogQHJldHVybiA8Y29kZT5QYXR0ZXJuU2V0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFBhdHRlcm5TZXQgY3JlYXRlUGF0dGVyblNldCgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgUGF0dGVyblNldCBwYXR0ZXJucyA9IG5ldyBQYXR0ZXJuU2V0KCk7CisgICAgICAgIGFkZGl0aW9uYWxQYXR0ZXJucy5hZGRFbGVtZW50KHBhdHRlcm5zKTsKKyAgICAgICAgZHMgPSBudWxsOworICAgICAgICByZXR1cm4gcGF0dGVybnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmFtZSBlbnRyeSB0byB0aGUgaW5jbHVkZSBsaXN0LgorICAgICAqIEByZXR1cm4gPGNvZGU+UGF0dGVyblNldC5OYW1lRW50cnk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgZHMgPSBudWxsOworICAgICAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUluY2x1ZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuYW1lIGVudHJ5IHRvIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QuCisgICAgICogQHJldHVybiA8Y29kZT5QYXR0ZXJuU2V0Lk5hbWVFbnRyeTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVJbmNsdWRlc0ZpbGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGRzID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRQYXR0ZXJucy5jcmVhdGVJbmNsdWRlc0ZpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuYW1lIGVudHJ5IHRvIHRoZSBleGNsdWRlIGxpc3QuCisgICAgICogQHJldHVybiA8Y29kZT5QYXR0ZXJuU2V0Lk5hbWVFbnRyeTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBkcyA9IG51bGw7CisgICAgICAgIHJldHVybiBkZWZhdWx0UGF0dGVybnMuY3JlYXRlRXhjbHVkZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5hbWUgZW50cnkgdG8gdGhlIGV4Y2x1ZGVzIGZpbGVzIGxpc3QuCisgICAgICogQHJldHVybiA8Y29kZT5QYXR0ZXJuU2V0Lk5hbWVFbnRyeTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlc0ZpbGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGRzID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRQYXR0ZXJucy5jcmVhdGVFeGNsdWRlc0ZpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgPGNvZGU+aW5jbHVkZXM8L2NvZGU+IHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgaW5jbHVkZQorICAgICAqIHBhdHRlcm5zLgorICAgICAqCisgICAgICogPHA+UGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hIG9yIGEgc3BhY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVzIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGluY2x1ZGUgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEluY2x1ZGVzKFN0cmluZyBpbmNsdWRlcykgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIGRlZmF1bHRQYXR0ZXJucy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7CisgICAgICAgIGRzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgPGNvZGU+aW5jbHVkZXM8L2NvZGU+IHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgaW5jbHVkZQorICAgICAqIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVzIGFycmF5IGNvbnRhaW5pbmcgdGhlIGluY2x1ZGUgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFwcGVuZEluY2x1ZGVzKFN0cmluZ1tdIGluY2x1ZGVzKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgaWYgKGluY2x1ZGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UGF0dGVybnMuY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUoaW5jbHVkZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIDxjb2RlPmV4Y2x1ZGVzPC9jb2RlPiB0byB0aGUgY3VycmVudCBsaXN0IG9mIGV4Y2x1ZGUKKyAgICAgKiBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIDxwPlBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYSBvciBhIHNwYWNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsdWRlcyB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFeGNsdWRlcyhTdHJpbmcgZXhjbHVkZXMpIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICBkZWZhdWx0UGF0dGVybnMuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOworICAgICAgICBkcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIDxjb2RlPmV4Y2x1ZGVzPC9jb2RlPiB0byB0aGUgY3VycmVudCBsaXN0IG9mIGluY2x1ZGUKKyAgICAgKiBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsdWRlcyBhcnJheSBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhcHBlbmRFeGNsdWRlcyhTdHJpbmdbXSBleGNsdWRlcykgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIGlmIChleGNsdWRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFBhdHRlcm5zLmNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKGV4Y2x1ZGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+RmlsZTwvY29kZT4gY29udGFpbmluZyB0aGUgaW5jbHVkZXMgcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbCA8Y29kZT5GaWxlPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SW5jbHVkZXNmaWxlKEZpbGUgaW5jbCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICBkZWZhdWx0UGF0dGVybnMuc2V0SW5jbHVkZXNmaWxlKGluY2wpOworICAgICAgICBkcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5GaWxlPC9jb2RlPiBjb250YWluaW5nIHRoZSBleGNsdWRlcyBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNsIDxjb2RlPkZpbGU8L2NvZGU+IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFeGNsdWRlc2ZpbGUoRmlsZSBleGNsKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIGRlZmF1bHRQYXR0ZXJucy5zZXRFeGNsdWRlc2ZpbGUoZXhjbCk7CisgICAgICAgIGRzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZURlZmF1bHRFeGNsdWRlcyA8Y29kZT5ib29sZWFuPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0RGVmYXVsdGV4Y2x1ZGVzKGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgdGhpcy51c2VEZWZhdWx0RXhjbHVkZXMgPSB1c2VEZWZhdWx0RXhjbHVkZXM7CisgICAgICAgIGRzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgd2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90LgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHRleGNsdXNpb25zIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBnZXREZWZhdWx0ZXhjbHVkZXMoKSB7CisgICAgICAgIHJldHVybiAoaXNSZWZlcmVuY2UoKSkKKyAgICAgICAgICAgID8gZ2V0UmVmKCkuZ2V0RGVmYXVsdGV4Y2x1ZGVzKCkgOiB1c2VEZWZhdWx0RXhjbHVkZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGNhc2Utc2Vuc2l0aXZpdHkgb2YgdGhlIEZpbGVzIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOworICAgICAgICB0aGlzLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlOworICAgICAgICBkcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBvdXQgaWYgdGhpcyBGaWxlcyBjb2xsZWN0aW9uIGlzIGNhc2Utc2Vuc2l0aXZlLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIEZpbGVzCisgICAgICogY29sbGVjdGlvbiBpcyBjYXNlLXNlbnNpdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKCkgeworICAgICAgICByZXR1cm4gKGlzUmVmZXJlbmNlKCkpCisgICAgICAgICAgICA/IGdldFJlZigpLmlzQ2FzZVNlbnNpdGl2ZSgpIDogY2FzZVNlbnNpdGl2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciBvciBub3Qgc3ltYm9saWMgbGlua3Mgc2hvdWxkIGJlIGZvbGxvd2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGZvbGxvd1N5bWxpbmtzIHdoZXRoZXIgb3Igbm90IHN5bWJvbGljIGxpbmtzIHNob3VsZCBiZSBmb2xsb3dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Rm9sbG93U3ltbGlua3MoYm9vbGVhbiBmb2xsb3dTeW1saW5rcykgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIHRoaXMuZm9sbG93U3ltbGlua3MgPSBmb2xsb3dTeW1saW5rczsKKyAgICAgICAgZHMgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgb3V0IHdoZXRoZXIgc3ltYm9saWMgbGlua3Mgc2hvdWxkIGJlIGZvbGxvd2VkLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT5ib29sZWFuPC9jb2RlPiBpbmRpY2F0aW5nIHdoZXRoZXIgc3ltYm9saWMgbGlua3MKKyAgICAgKiAgICAgICAgIHNob3VsZCBiZSBmb2xsb3dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGb2xsb3dTeW1saW5rcygpIHsKKyAgICAgICAgcmV0dXJuIChpc1JlZmVyZW5jZSgpKQorICAgICAgICAgICAgPyBnZXRSZWYoKS5pc0ZvbGxvd1N5bWxpbmtzKCkgOiBmb2xsb3dTeW1saW5rczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5pdGVyYXRvcigpOworICAgICAgICB9CisgICAgICAgIGVuc3VyZURpcmVjdG9yeVNjYW5uZXJTZXR1cCgpOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGludCBmY3QgPSBkcy5nZXRJbmNsdWRlZEZpbGVzQ291bnQoKTsKKyAgICAgICAgaW50IGRjdCA9IGRzLmdldEluY2x1ZGVkRGlyc0NvdW50KCk7CisgICAgICAgIGlmIChmY3QgKyBkY3QgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0lURVJBVE9SOworICAgICAgICB9CisgICAgICAgIEZpbGVSZXNvdXJjZUl0ZXJhdG9yIHJlc3VsdCA9IG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvcigpOworICAgICAgICBpZiAoZmN0ID4gMCkgeworICAgICAgICAgICAgcmVzdWx0LmFkZEZpbGVzKGRzLmdldEluY2x1ZGVkRmlsZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRjdCA+IDApIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRGaWxlcyhkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGVsZW1lbnRzIGFzIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBlbnN1cmVEaXJlY3RvcnlTY2FubmVyU2V0dXAoKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICByZXR1cm4gZHMuZ2V0SW5jbHVkZWRGaWxlc0NvdW50KCkgKyBkcy5nZXRJbmNsdWRlZERpcnNDb3VudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgb3V0IHdoZXRoZXIgdGhpcyBGaWxlcyBjb2xsZWN0aW9uIGhhcyBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBhbnkgcGF0dGVybnMgYXJlIGluIHRoaXMgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNQYXR0ZXJucygpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5oYXNQYXR0ZXJucygpOworICAgICAgICB9CisgICAgICAgIGlmIChoYXNQYXR0ZXJucyhkZWZhdWx0UGF0dGVybnMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhZGRpdGlvbmFsUGF0dGVybnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoaGFzUGF0dGVybnMoKFBhdHRlcm5TZXQpIGkubmV4dCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VsZWN0b3IgaW50byB0aGlzIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgbmV3IDxjb2RlPkZpbGVTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhcHBlbmRTZWxlY3RvcihGaWxlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgICAgICBkcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ybWF0IHRoaXMgRmlsZXMgY29sbGVjdGlvbiBhcyBhIFN0cmluZy4KKyAgICAgKiBAcmV0dXJuIGEgZGVzY3JpcHRpdmUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgSXRlcmF0b3IgaSA9IGl0ZXJhdG9yKCk7CisgICAgICAgIGlmICghaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChpLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZGVlcCBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLCBleGNlcHQgZm9yIHRoZSBuZXN0ZWQgc2VsZWN0b3JzCisgICAgICogKHRoZSBsaXN0IG9mIHNlbGVjdG9ycyBpcyBhIHNoYWxsb3cgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZSdzIGxpc3QpLgorICAgICAqIEByZXR1cm4gYSBjbG9uZWQgT2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGNsb25lKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVzIGYgPSAoRmlsZXMpIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICBmLmRlZmF1bHRQYXR0ZXJucyA9IChQYXR0ZXJuU2V0KSBkZWZhdWx0UGF0dGVybnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGYuYWRkaXRpb25hbFBhdHRlcm5zID0gbmV3IFZlY3RvcihhZGRpdGlvbmFsUGF0dGVybnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFkZGl0aW9uYWxQYXR0ZXJucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBQYXR0ZXJuU2V0IHBzID0gKFBhdHRlcm5TZXQpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGYuYWRkaXRpb25hbFBhdHRlcm5zLmFkZChwcy5jbG9uZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGYuc2VsZWN0b3JzID0gbmV3IFZlY3RvcihzZWxlY3RvcnMpOworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVyZ2VkIGluY2x1ZGUgcGF0dGVybnMgZm9yIHRoaXMgRmlsZXMgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcCBQcm9qZWN0IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIGluY2x1ZGUgcGF0dGVybnMgb2YgdGhlIGRlZmF1bHQgcGF0dGVybiBzZXQgYW5kIGFsbAorICAgICAqIG5lc3RlZCBwYXR0ZXJuc2V0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gbWVyZ2VJbmNsdWRlcyhQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIG1lcmdlUGF0dGVybnMocCkuZ2V0SW5jbHVkZVBhdHRlcm5zKHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVyZ2VkIGV4Y2x1ZGUgcGF0dGVybnMgZm9yIHRoaXMgRmlsZXMgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcCBQcm9qZWN0IGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIGV4Y2x1ZGUgcGF0dGVybnMgb2YgdGhlIGRlZmF1bHQgcGF0dGVybiBzZXQgYW5kIGFsbAorICAgICAqIG5lc3RlZCBwYXR0ZXJuc2V0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gbWVyZ2VFeGNsdWRlcyhQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIG1lcmdlUGF0dGVybnMocCkuZ2V0RXhjbHVkZVBhdHRlcm5zKHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVyZ2VkIHBhdHRlcm5zIGZvciB0aGlzIEZpbGVzIGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHAgUHJvamVjdCBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHBhdHRlcm5zZXQgbWVyZ2VkIHdpdGggdGhlIGFkZGl0aW9uYWwgc2V0cworICAgICAqIGluIGEgbmV3IFBhdHRlcm5TZXQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQYXR0ZXJuU2V0IG1lcmdlUGF0dGVybnMoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkubWVyZ2VQYXR0ZXJucyhwKTsKKyAgICAgICAgfQorICAgICAgICBQYXR0ZXJuU2V0IHBzID0gbmV3IFBhdHRlcm5TZXQoKTsKKyAgICAgICAgcHMuYXBwZW5kKGRlZmF1bHRQYXR0ZXJucywgcCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGFkZGl0aW9uYWxQYXR0ZXJucy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBhZGRpdGlvbmFsUGF0dGVybnMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgcHMuYXBwZW5kKChQYXR0ZXJuU2V0KSBvLCBwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWx3YXlzIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaW5kaWNhdGluZyB0aGF0IGFsbCBlbGVtZW50cyBvZiBhIEZpbGVzIGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgICAgd2lsbCBiZSBGaWxlUmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gdGhlCisgICAgICogcmVmZXJlbmNlZCBGaWxlcyBjb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4gPGNvZGU+RmlsZUNvbGxlY3Rpb248L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlcyBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiAoRmlsZXMpIGdldENoZWNrZWRSZWYoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGVuc3VyZURpcmVjdG9yeVNjYW5uZXJTZXR1cCgpIHsKKyAgICAgICAgaWYgKGRzID09IG51bGwpIHsKKyAgICAgICAgICAgIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgICAgIFBhdHRlcm5TZXQgcHMgPSBtZXJnZVBhdHRlcm5zKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBkcy5zZXRJbmNsdWRlcyhwcy5nZXRJbmNsdWRlUGF0dGVybnMoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgICAgICBkcy5zZXRFeGNsdWRlcyhwcy5nZXRFeGNsdWRlUGF0dGVybnMoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgICAgICBkcy5zZXRTZWxlY3RvcnMoZ2V0U2VsZWN0b3JzKGdldFByb2plY3QoKSkpOworICAgICAgICAgICAgaWYgKHVzZURlZmF1bHRFeGNsdWRlcykgeworICAgICAgICAgICAgICAgIGRzLmFkZERlZmF1bHRFeGNsdWRlcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZShjYXNlU2Vuc2l0aXZlKTsKKyAgICAgICAgICAgIGRzLnNldEZvbGxvd1N5bWxpbmtzKGZvbGxvd1N5bWxpbmtzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQYXR0ZXJucyhQYXR0ZXJuU2V0IHBzKSB7CisgICAgICAgIFN0cmluZ1tdIGluY2x1ZGVQYXR0ZXJucyA9IHBzLmdldEluY2x1ZGVQYXR0ZXJucyhnZXRQcm9qZWN0KCkpOworICAgICAgICBTdHJpbmdbXSBleGNsdWRlUGF0dGVybnMgPSBwcy5nZXRFeGNsdWRlUGF0dGVybnMoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgcmV0dXJuIChpbmNsdWRlUGF0dGVybnMgIT0gbnVsbCAmJiBpbmNsdWRlUGF0dGVybnMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHx8IChpbmNsdWRlUGF0dGVybnMgIT0gbnVsbCAmJiBleGNsdWRlUGF0dGVybnMubGVuZ3RoID4gMCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlyc3QuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaXJzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YzI3MDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlyc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIFJlc291cmNlQ29sbGVjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBmaXJzdCA8Y29kZT5jb3VudDwvY29kZT4gZWxlbWVudHMgb2YKKyAqIGFub3RoZXIgUmVzb3VyY2VDb2xsZWN0aW9uLCBhIGxhIHRoZSBVTklYIGhlYWQgY29tbWFuZC4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBGaXJzdCBleHRlbmRzIFNpemVMaW1pdENvbGxlY3Rpb24geworCisgICAgLyoqCisgICAgICogVGFrZSB0aGUgZmlyc3QgPGNvZGU+Y291bnQ8L2NvZGU+IGVsZW1lbnRzLgorICAgICAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKCkgeworICAgICAgICBpbnQgY3QgPSBnZXRWYWxpZENvdW50KCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKS5pdGVyYXRvcigpOworICAgICAgICBBcnJheUxpc3QgYWwgPSBuZXcgQXJyYXlMaXN0KGN0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdCAmJiBpdGVyLmhhc05leHQoKTsgaSsrKSB7CisgICAgICAgICAgICBhbC5hZGQoaXRlci5uZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9HWmlwUmVzb3VyY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9HWmlwUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWZlODc5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0daaXBSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKKworLyoqCisgKiBBIEdaaXAgY29tcHJlc3NlZCByZXNvdXJjZS4KKyAqCisgKiA8cD5XcmFwcyBhcm91bmQgYW5vdGhlciByZXNvdXJjZSwgZGVsZWdhdGVzIGFsbCBxdXJpZXMgdG8gdGhhdAorICogb3RoZXIgcmVzb3VyY2UgYnV0IHVuY29tcHJlc3Nlcy9jb21wcmVzc2VzIHN0cmVhbXMgb24gdGhlIGZseS48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEdaaXBSZXNvdXJjZSBleHRlbmRzIENvbXByZXNzZWRSZXNvdXJjZSB7CisKKyAgICAvKiogQSBuby1hcmcgY29uc3RydWN0b3IgKi8KKyAgICBwdWJsaWMgR1ppcFJlc291cmNlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHdpdGggYW5vdGhlciByZXNvdXJjZSB0byB3cmFwLgorICAgICAqIEBwYXJhbSBvdGhlciB0aGUgcmVzb3VyY2UgdG8gd3JhcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgR1ppcFJlc291cmNlKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbiBvdGhlcikgeworICAgICAgICBzdXBlcihvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb21wcmVzcyBvbiB0aGUgZmx5IHVzaW5nIGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtLgorICAgICAqIEBwYXJhbSBpbiB0aGUgc3RyZWFtIHRvIHdyYXAuCisgICAgICogQHJldHVybiB0aGUgd3JhcHBlZCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIHdyYXBTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgR1pJUElucHV0U3RyZWFtKGluKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wcmVzcyBvbiB0aGUgZmx5IHVzaW5nIGphdmEudXRpbC56aXAuR1pJUE91dFN0cmVhbS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBzdHJlYW0gdG8gd3JhcC4KKyAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICAgcHJvdGVjdGVkIE91dHB1dFN0cmVhbSB3cmFwU3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgR1pJUE91dHB1dFN0cmVhbShvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kLgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyAiR1ppcCIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wcmVzc2lvbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAiR1ppcCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSW1tdXRhYmxlUmVzb3VyY2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjdjY2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogRXhjZXB0aW9uIHRocm93biB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBnZXQgYW4gT3V0cHV0U3RyZWFtCisgKiBmcm9tIGFuIGltbXV0YWJsZSBSZXNvdXJjZS4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBJbW11dGFibGVSZXNvdXJjZUV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBJbW11dGFibGVSZXNvdXJjZUV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gcyB0aGUgbWVzc2FnZSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIEltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uKFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ludGVyc2VjdC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ludGVyc2VjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YjA3NmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSW50ZXJzZWN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKKworLyoqCisgKiBSZXNvdXJjZUNvbGxlY3Rpb24gcmVwcmVzZW50aW5nIHRoZSBpbnRlcnNlY3Rpb24KKyAqIG9mIG11bHRpcGxlIG5lc3RlZCBSZXNvdXJjZUNvbGxlY3Rpb25zLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEludGVyc2VjdCBleHRlbmRzIEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIgeworCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG5lc3RlZCBSZXNvdXJjZUNvbGxlY3Rpb25zLgorICAgICAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKCkgeworICAgICAgICBMaXN0IHJjcyA9IGdldFJlc291cmNlQ29sbGVjdGlvbnMoKTsKKyAgICAgICAgaW50IHNpemUgPSByY3Muc2l6ZSgpOworICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGludGVyc2VjdGlvbiBvZiAiICsgc2l6ZQorICAgICAgICAgICAgICAgICsgIiByZXNvdXJjZSBjb2xsZWN0aW9uIiArICgoc2l6ZSA9PSAxKSA/ICIiIDogInMiKQorICAgICAgICAgICAgICAgICsgIiBpcyB1bmRlZmluZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0IGFsID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciByYyA9IHJjcy5pdGVyYXRvcigpOworICAgICAgICBhbC5hZGRBbGwoY29sbGVjdChyYy5uZXh0KCkpKTsKKyAgICAgICAgd2hpbGUgKHJjLmhhc05leHQoKSkgeworICAgICAgICAgICAgYWwucmV0YWluQWxsKGNvbGxlY3QocmMubmV4dCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsOworICAgIH0KKworICAgIHByaXZhdGUgQXJyYXlMaXN0IGNvbGxlY3QoT2JqZWN0IG8pIHsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChSZXNvdXJjZUNvbGxlY3Rpb24pIG8pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgcmVzdWx0LmFkZChpLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSmF2YUNvbnN0YW50UmVzb3VyY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9KYXZhQ29uc3RhbnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjIwNzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSmF2YUNvbnN0YW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworCisvKioKKyAqIEEgcmVzb3VyY2UgdGhhdCBpcyBhIGphdmEgY29uc3RhbnQuCisgKiBUaGlzIGxldHMgeW91IGV4dHJhY3QgdmFsdWVzIG9mZiB0aGUgY2xhc3NwYXRoIGFuZCB1c2UgdGhlbSBlbHNld2hlcmUKKyAqIEBzaW5jZSBBbnQxLjcKKyAqCisgKi8KKworcHVibGljIGNsYXNzIEphdmFDb25zdGFudFJlc291cmNlIGV4dGVuZHMgQWJzdHJhY3RDbGFzc3BhdGhSZXNvdXJjZSB7CisgICAgLyoqCisgICAgICogb3BlbiB0aGUgaW5wb3V0IHN0cmVhbSBmcm9tIGEgc3BlY2lmaWMgY2xhc3Nsb2FkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbCB0aGUgY2xhc3Nsb2FkZXIgdG8gdXNlLiBXaWxsIGJlIG51bGwgaWYgdGhlIHN5c3RlbSBjbGFzc2xvYWRlciBpcyB1c2VkCisgICAgICogQHJldHVybiBhbiBvcGVuIGlucHV0IHN0cmVhbSBmb3IgdGhlIHJlc291cmNlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIG9wZW5JbnB1dFN0cmVhbShDbGFzc0xvYWRlciBjbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgY2xheno7CisgICAgICAgIFN0cmluZyBjb25zdGFudCA9IGdldE5hbWUoKTsKKyAgICAgICAgaW50IGluZGV4MSA9IGNvbnN0YW50Lmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChpbmRleDEgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5vIGNsYXNzIG5hbWUgaW4gIiArIGNvbnN0YW50KTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaW5kZXggPSBpbmRleDE7CisgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBjb25zdGFudC5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICBTdHJpbmcgZmllbGRuYW1lID0gY29uc3RhbnQuc3Vic3RyaW5nKGluZGV4ICsgMSwgY29uc3RhbnQubGVuZ3RoKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xhenogPQorICAgICAgICAgICAgICAgIGNsICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IENsYXNzLmZvck5hbWUoY2xhc3NuYW1lLCB0cnVlLCBjbCkKKyAgICAgICAgICAgICAgICA6IENsYXNzLmZvck5hbWUoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gY2xhenouZ2V0RmllbGQoZmllbGRuYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpZWxkLmdldChudWxsKS50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh2YWx1ZS5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDbGFzcyBub3QgZm91bmQ6IiArIGNsYXNzbmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRmllbGQgbm90IGZvdW5kOiIgKyBmaWVsZG5hbWUgKyAiIGluICIgKyBjbGFzc25hbWUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSWxsZWdhbCBhY2Nlc3MgdG8gOiIgKyBmaWVsZG5hbWUgKyAiIGluICIgKyBjbGFzc25hbWUpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm90IGEgc3RhdGljIGZpZWxkOiAiICsgZmllbGRuYW1lICsgIiBpbiAiICsgY2xhc3NuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSmF2YVJlc291cmNlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSmF2YVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmZDg4YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9KYXZhUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIEEgUmVzb3VyY2UgcmVwcmVzZW50YXRpb24gb2Ygc29tZXRoaW5nIGxvYWRhYmxlIHZpYSBhIEphdmEgY2xhc3Nsb2FkZXIuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlIGV4dGVuZHMgQWJzdHJhY3RDbGFzc3BhdGhSZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBKYXZhUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEphdmFSZXNvdXJjZSB1c2luZyB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kCisgICAgICogY2xhc3NwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgICB0aGUgcmVzb3VyY2UgbmFtZS4KKyAgICAgKiBAcGFyYW0gcGF0aCAgIHRoZSBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIEphdmFSZXNvdXJjZShTdHJpbmcgbmFtZSwgUGF0aCBwYXRoKSB7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgICAgIHNldENsYXNzcGF0aChwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBvcGVuIHRoZSBpbnBvdXQgc3RyZWFtIGZyb20gYSBzcGVjaWZpYyBjbGFzc2xvYWRlcgorICAgICAqIEBwYXJhbSBjbCB0aGUgY2xhc3Nsb2FkZXIgdG8gdXNlLiBXaWxsIGJlIG51bGwgaWYgdGhlIHN5c3RlbSBjbGFzc2xvYWRlciBpcyB1c2VkCisgICAgICogQHJldHVybiBhbiBvcGVuIGlucHV0IHN0cmVhbSBmb3IgdGhlIHJlc291cmNlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIG9wZW5JbnB1dFN0cmVhbShDbGFzc0xvYWRlciBjbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNsID09IG51bGwgPyBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKGdldE5hbWUoKSkKKyAgICAgICAgICAgIDogY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbShnZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdGhpcyBKYXZhUmVzb3VyY2UgdG8gYW5vdGhlciBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYW5vdGhlciB0aGUgb3RoZXIgUmVzb3VyY2UgYWdhaW5zdCB3aGljaCB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcworICAgICAqIEphdmFSZXNvdXJjZSBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlCisgICAgICogc3BlY2lmaWVkIFJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBhbm90aGVyKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChDb21wYXJhYmxlKSBnZXRDaGVja2VkUmVmKCkpLmNvbXBhcmVUbyhhbm90aGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYW5vdGhlci5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkgeworICAgICAgICAgICAgSmF2YVJlc291cmNlIG90aGVyanIgPSAoSmF2YVJlc291cmNlKSBhbm90aGVyOworICAgICAgICAgICAgaWYgKCFnZXROYW1lKCkuZXF1YWxzKG90aGVyanIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCkuY29tcGFyZVRvKG90aGVyanIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRMb2FkZXIoKSAhPSBvdGhlcmpyLmdldExvYWRlcigpKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldExvYWRlcigpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3RoZXJqci5nZXRMb2FkZXIoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TG9hZGVyKCkuZ2V0UmVmSWQoKQorICAgICAgICAgICAgICAgICAgICAuY29tcGFyZVRvKG90aGVyanIuZ2V0TG9hZGVyKCkuZ2V0UmVmSWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQYXRoIHAgPSBnZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgICAgIFBhdGggb3AgPSBvdGhlcmpyLmdldENsYXNzcGF0aCgpOworICAgICAgICAgICAgaWYgKHAgIT0gb3ApIHsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBwLnRvU3RyaW5nKCkuY29tcGFyZVRvKG9wLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmVUbyhhbm90aGVyKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9MYXN0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvTGFzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NWE0NWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvTGFzdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKKworLyoqCisgKiBSZXNvdXJjZUNvbGxlY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbGFzdCA8Y29kZT5jb3VudDwvY29kZT4gZWxlbWVudHMgb2YKKyAqIGFub3RoZXIgUmVzb3VyY2VDb2xsZWN0aW9uLCBhIGxhIHRoZSBVTklYIHRhaWwgY29tbWFuZC4KKyAqIEBzaW5jZSBBbnQgMS43LjEKKyAqLworcHVibGljIGNsYXNzIExhc3QgZXh0ZW5kcyBTaXplTGltaXRDb2xsZWN0aW9uIHsKKworICAgIC8qKgorICAgICAqIFRha2UgdGhlIGxhc3QgPGNvZGU+Y291bnQ8L2NvZGU+IGVsZW1lbnRzLgorICAgICAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKCkgeworICAgICAgICBpbnQgY291bnQgPSBnZXRWYWxpZENvdW50KCk7CisgICAgICAgIFJlc291cmNlQ29sbGVjdGlvbiByYyA9IGdldFJlc291cmNlQ29sbGVjdGlvbigpOworICAgICAgICBpbnQgaSA9IGNvdW50OworICAgICAgICBJdGVyYXRvciBpdGVyID0gcmMuaXRlcmF0b3IoKTsKKyAgICAgICAgaW50IHNpemUgPSByYy5zaXplKCk7CisgICAgICAgIGZvciAoOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpdGVyLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEFycmF5TGlzdCBhbCA9IG5ldyBBcnJheUxpc3QoY291bnQpOworICAgICAgICBmb3IgKDsgaXRlci5oYXNOZXh0KCk7IGkrKykgeworICAgICAgICAgICAgYWwuYWRkKGl0ZXIubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZm91bmQgPSBhbC5zaXplKCk7CisgICAgICAgIGlmIChmb3VuZCA9PSBjb3VudCB8fCAoc2l6ZSA8IGNvdW50ICYmIGZvdW5kID09IHNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gYWw7CisgICAgICAgIH0KKworICAgICAgICAvL21pc21hdGNoOgorICAgICAgICBTdHJpbmcgbXNnID0gIlJlc291cmNlIGNvbGxlY3Rpb24gIiArIHJjICsgIiByZXBvcnRzIHNpemUgIiArIHNpemUKKyAgICAgICAgICAgICsgIiBidXQgcmV0dXJucyAiICsgaSArICIgZWxlbWVudHMuIjsKKworICAgICAgICAvL3NpemUgd2FzIHVuZGVyc3RhdGVkIC0+IHRvbyBtYW55IHJlc3VsdHM7IHdhcm4gYW5kIGNvbnRpbnVlOgorICAgICAgICBpZiAoZm91bmQgPiBjb3VudCkgeworICAgICAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICByZXR1cm4gYWwuc3ViTGlzdChmb3VuZCAtIGNvdW50LCBmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgLy9zaXplIHdhcyBvdmVyc3RhdGVkOyB3ZSBtaXNzZWQgc29tZSBhbmQgYXJlIG5vdyBpbiBlcnJvci1sYW5kOgorICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Qcm9wZXJ0eVJlc291cmNlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUHJvcGVydHlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNjNiNWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUHJvcGVydHlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUHJvcGVydHlPdXRwdXRTdHJlYW07CisKKy8qKgorICogRXhwb3NlcyBhbiBBbnQgcHJvcGVydHkgYXMgYSBSZXNvdXJjZS4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UgeworCisgICAgLyoqIE1hZ2ljIG51bWJlciAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NQUdJQworICAgICAgICA9IFJlc291cmNlLmdldE1hZ2ljTnVtYmVyKCJQcm9wZXJ0eVJlc291cmNlIi5nZXRCeXRlcygpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElucHV0U3RyZWFtIFVOU0VUID0gbmV3IElucHV0U3RyZWFtKCkgeworICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvcGVydHlSZXNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdCB0byB1c2UuCisgICAgICogQHBhcmFtIG4gdGhlIFN0cmluZyBuYW1lIG9mIHRoaXMgUHJvcGVydHlSZXNvdXJjZSAoQW50IHByb3BlcnR5IG5hbWUva2V5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlSZXNvdXJjZShQcm9qZWN0IHAsIFN0cmluZyBuKSB7CisgICAgICAgIHN1cGVyKG4pOworICAgICAgICBzZXRQcm9qZWN0KHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhpcyBQcm9wZXJ0eVJlc291cmNlLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgUHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOworICAgICAgICByZXR1cm4gcCA9PSBudWxsID8gbnVsbCA6IHAuZ2V0UHJvcGVydHkoZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIG91dCB3aGV0aGVyIHRoaXMgUmVzb3VyY2UgZXhpc3RzLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgUHJvcGVydHkgaXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFeGlzdHMoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZSgpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgc2l6ZSwgYXMgYSBsb25nLCAwIGlmIHRoZSBSZXNvdXJjZSBkb2VzIG5vdCBleGlzdCAoZm9yCisgICAgICogICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggamF2YS5pby5GaWxlKSwgb3IgVU5LTk9XTl9TSVpFIGlmIG5vdCBrbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpc0V4aXN0cygpID8gKGxvbmcpIGdldFZhbHVlKCkubGVuZ3RoKCkgOiAwTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGhhc2ggY29kZSBhcyBpbnQuCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKSAqIFBST1BFUlRZX01BR0lDOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyaW5nLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBJbnB1dFN0cmVhbSBmb3IgdGhlIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gY29udGFpbmluZyB0aGlzIFJlc291cmNlJ3MgY29udGVudC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBwcm92aWRlIHRoZSBjb250ZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIFJlc291cmNlIGFzIGEgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgSW5wdXRTdHJlYW1zIGFyZSBub3QKKyAgICAgKiAgICAgICAgIHN1cHBvcnRlZCBmb3IgdGhpcyBSZXNvdXJjZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpc0V4aXN0cygpID8gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGdldFZhbHVlKCkuZ2V0Qnl0ZXMoKSkgOiBVTlNFVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gT3V0cHV0U3RyZWFtIGZvciB0aGUgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhbiBPdXRwdXRTdHJlYW0gdG8gd2hpY2ggY29udGVudCBjYW4gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBwcm92aWRlIHRoZSBjb250ZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIFJlc291cmNlIGFzIGEgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgT3V0cHV0U3RyZWFtcyBhcmUgbm90CisgICAgICogICAgICAgICBzdXBwb3J0ZWQgZm9yIHRoaXMgUmVzb3VyY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNFeGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eU91dHB1dFN0cmVhbShnZXRQcm9qZWN0KCksIGdldE5hbWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzb3VyY2VzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzb3VyY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3MTlmOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9SZXNvdXJjZXMuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRhdGFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKKworLyoqCisgKiBHZW5lcmljIFJlc291cmNlQ29sbGVjdGlvbjogRWl0aGVyIHN0b3JlcyBuZXN0ZWQgUmVzb3VyY2VDb2xsZWN0aW9ucywKKyAqIG1ha2luZyBubyBhdHRlbXB0IHRvIHJlbW92ZSBkdXBsaWNhdGVzLCBvciByZWZlcmVuY2VzIGFub3RoZXIgUmVzb3VyY2VDb2xsZWN0aW9uLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlcyBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgUmVzb3VyY2VDb2xsZWN0aW9uIHsKKyAgICAvKiogc3RhdGljIGVtcHR5IFJlc291cmNlQ29sbGVjdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVzb3VyY2VDb2xsZWN0aW9uIE5PTkUgPSBuZXcgUmVzb3VyY2VDb2xsZWN0aW9uKCkgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0lURVJBVE9SOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKiBzdGF0aWMgZW1wdHkgSXRlcmF0b3IgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZX0lURVJBVE9SID0gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBjbGFzcyBNeUNvbGxlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24geworICAgICAgICBwcml2YXRlIGludCBzaXplOworCisgICAgICAgIE15Q29sbGVjdGlvbigpIHsKKyAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciByY2kgPSBnZXROZXN0ZWQoKS5pdGVyYXRvcigpOyByY2kuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIHNpemUgKz0gKChSZXNvdXJjZUNvbGxlY3Rpb24pIHJjaS5uZXh0KCkpLnNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15SXRlcmF0b3IoKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIGNsYXNzIE15SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7CisgICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yIHJjaSA9IGdldE5lc3RlZCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yIHJpID0gbnVsbDsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHJpICE9IG51bGwgJiYgcmkuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgIHdoaWxlICghcmVzdWx0ICYmIHJjaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmkgPSAoKFJlc291cmNlQ29sbGVjdGlvbikgcmNpLm5leHQoKSkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmkuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByaS5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFZlY3RvciByYzsKKyAgICBwcml2YXRlIENvbGxlY3Rpb24gY29sbDsKKworICAgIC8qKgorICAgICAqIEFkZCBhIFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYyB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKFJlc291cmNlQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmMuYWRkKGMpOworICAgICAgICBGYWlsRmFzdC5pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICBjb2xsID0gbnVsbDsKKyAgICAgICAgc2V0Q2hlY2tlZChmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb2YgUmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgfQorICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICByZXR1cm4gbmV3IEZhaWxGYXN0KHRoaXMsIGNvbGwuaXRlcmF0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGVsZW1lbnRzIGFzIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICByZXR1cm4gY29sbC5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgUmVzb3VyY2VzIHJlcHJlc2VudCBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmlzRmlsZXN5c3RlbU9ubHkoKTsKKyAgICAgICAgfQorICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldE5lc3RlZCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaWYgKCghKChSZXNvdXJjZUNvbGxlY3Rpb24pIGkubmV4dCgpKS5pc0ZpbGVzeXN0ZW1Pbmx5KCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCB0aGlzIDxjb2RlPlJlc291cmNlczwvY29kZT4gYXMgYSBTdHJpbmcuCisgICAgICogQHJldHVybiBhIGRlc2NyaXB0aXZlIDxjb2RlPlN0cmluZzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbGwgPT0gbnVsbCB8fCBjb2xsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29sbC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoaS5uZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgdmVyc2lvbiBvZiBEYXRhVHlwZSB0byByZWN1cnNlIG9uIGFsbCBEYXRhVHlwZQorICAgICAqIGNoaWxkIGVsZW1lbnRzIHRoYXQgbWF5IGhhdmUgYmVlbiBhZGRlZC4KKyAgICAgKiBAcGFyYW0gc3RrIHRoZSBzdGFjayBvZiBkYXRhIHR5cGVzIHRvIHVzZSAocmVjdXJzaXZlbHkpLgorICAgICAqIEBwYXJhbSBwICAgdGhlIHByb2plY3QgdG8gdXNlIHRvIGRlcmVmZXJlbmNlIHRoZSByZWZlcmVuY2VzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjayBzdGssIFByb2plY3QgcCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHN1cGVyLmRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldE5lc3RlZCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEYXRhVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBpbnZva2VDaXJjdWxhclJlZmVyZW5jZUNoZWNrKChEYXRhVHlwZSkgbywgc3RrLCBwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDaGVja2VkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZXMgcmVmZXJlbmNlcywgYWxsb3dpbmcgYW55IFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2VkIFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc291cmNlQ29sbGVjdGlvbiBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiAoUmVzb3VyY2VDb2xsZWN0aW9uKSBnZXRDaGVja2VkUmVmKAorICAgICAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAiUmVzb3VyY2VDb2xsZWN0aW9uIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICBjb2xsID0gKGNvbGwgPT0gbnVsbCkgPyBuZXcgTXlDb2xsZWN0aW9uKCkgOiBjb2xsOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIExpc3QgZ2V0TmVzdGVkKCkgeworICAgICAgICByZXR1cm4gcmMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiByYzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzdHJpY3QuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9SZXN0cmljdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTU4MWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzdHJpY3QuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLlJlc291cmNlU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5SZXNvdXJjZVNlbGVjdG9yQ29udGFpbmVyOworCisvKioKKyAqIFJlc291cmNlQ29sbGVjdGlvbiB0aGF0IGFsbG93cyBhIG51bWJlciBvZiBzZWxlY3RvcnMgdG8gYmUKKyAqIGFwcGxpZWQgdG8gYSBzaW5nbGUgUmVzb3VyY2VDb2xsZWN0aW9uIGZvciB0aGUgcHVycG9zZXMgb2YKKyAqIHJlc3RyaWN0aW5nIG9yIG5hcnJvd2luZyByZXN1bHRzLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIFJlc3RyaWN0CisgICAgZXh0ZW5kcyBSZXNvdXJjZVNlbGVjdG9yQ29udGFpbmVyIGltcGxlbWVudHMgUmVzb3VyY2VDb2xsZWN0aW9uIHsKKworICAgIHByaXZhdGUgQmFzZVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIgdyA9IG5ldyBCYXNlUmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlcigpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc3RyaWN0IHRoZSBuZXN0ZWQgUmVzb3VyY2VDb2xsZWN0aW9uIGJhc2VkIG9uIHRoZSBuZXN0ZWQgc2VsZWN0b3JzLgorICAgICAgICAgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBSZXNvdXJjZXMuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKCkgeworICAgICAgICAgICAgQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKK291dGVyOiAgICAgIGZvciAoSXRlcmF0b3IgcmkgPSB3LmdldFJlc291cmNlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IHJpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZSByID0gKFJlc291cmNlKSByaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0U2VsZWN0b3JzKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBpZiAoISgoUmVzb3VyY2VTZWxlY3RvcikgKGkubmV4dCgpKSkuaXNTZWxlY3RlZChyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIGMgdGhlIFJlc291cmNlQ29sbGVjdGlvbiB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gYykgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdy5hZGQoYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gY2FjaGUgY29sbGVjdGlvbnMuCisgICAgICogQHBhcmFtIGIgYm9vbGVhbiBjYWNoZSBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDYWNoZShib29sZWFuIGIpIHsKKyAgICAgICAgdy5zZXRDYWNoZShiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWFybiB3aGV0aGVyIHRvIGNhY2hlIGNvbGxlY3Rpb25zLiBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBjYWNoZSBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0NhY2hlKCkgeworICAgICAgICByZXR1cm4gdy5pc0NhY2hlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgUmVzb3VyY2VTZWxlY3Rvci4KKyAgICAgKiBAcGFyYW0gcyB0aGUgUmVzb3VyY2VTZWxlY3RvciB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChSZXNvdXJjZVNlbGVjdG9yIHMpIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN1cGVyLmFkZChzKTsKKyAgICAgICAgRmFpbEZhc3QuaW52YWxpZGF0ZSh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc3RyaWN0KSBnZXRDaGVja2VkUmVmKCkpLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICByZXR1cm4gdy5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc3RyaWN0KSBnZXRDaGVja2VkUmVmKCkpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CisgICAgICAgIHJldHVybiB3LnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBmaWxlc3lzdGVtLW9ubHkgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc3RyaWN0KSBnZXRDaGVja2VkUmVmKCkpLmlzRmlsZXN5c3RlbU9ubHkoKTsKKyAgICAgICAgfQorICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CisgICAgICAgIHJldHVybiB3LmlzRmlsZXN5c3RlbU9ubHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgdGhpcyBSZXN0cmljdCBjb2xsZWN0aW9uIGFzIGEgU3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGlzIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICByZXR1cm4gdy50b1N0cmluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1NpemVMaW1pdENvbGxlY3Rpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9TaXplTGltaXRDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViNDJkZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9TaXplTGltaXRDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXNvdXJjZUNvbGxlY3Rpb24gdGhhdCBpbXBvc2VzIGEgc2l6ZSBsaW1pdCBvbiBhbm90aGVyIFJlc291cmNlQ29sbGVjdGlvbi4KKyAqIEBzaW5jZSBBbnQgMS43LjEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNpemVMaW1pdENvbGxlY3Rpb24gZXh0ZW5kcyBCYXNlUmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBRF9DT1VOVAorICAgICAgICA9ICJzaXplLWxpbWl0ZWQgY29sbGVjdGlvbiBjb3VudCBzaG91bGQgYmUgc2V0IHRvIGFuIGludCA+PSAwIjsKKworICAgIHByaXZhdGUgaW50IGNvdW50ID0gMTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIHJlc291cmNlcyB0byBiZSBpbmNsdWRlZC4KKyAgICAgKiBAcGFyYW0gaSB0aGUgY291bnQgYXMgPGNvZGU+aW50PC9jb3VudD4uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENvdW50KGludCBpKSB7CisgICAgICAgIGNvdW50ID0gaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiByZXNvdXJjZXMgdG8gYmUgaW5jbHVkZWQuIERlZmF1bHQgaXMgMS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudCBhcyA8Y29kZT5pbnQ8L2NvdW50Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVmZmljaWVudCBzaXplIGltcGxlbWVudGF0aW9uLgorICAgICAqIEByZXR1cm4gaW50IHNpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgeworICAgICAgICBpbnQgc3ogPSBnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKS5zaXplKCk7CisgICAgICAgIGludCBjdCA9IGdldFZhbGlkQ291bnQoKTsKKyAgICAgICAgcmV0dXJuIHN6IDwgY3QgPyBzeiA6IGN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY291bnQsIHZlcmlmeWluZyBpdCBpcyA+PSAwLgorICAgICAqIEByZXR1cm4gaW50IGNvdW50CisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRWYWxpZENvdW50KCkgeworICAgICAgICBpbnQgY3QgPSBnZXRDb3VudCgpOworICAgICAgICBpZiAoY3QgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oQkFEX0NPVU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3Q7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvU29ydC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1NvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNmMjRmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1NvcnQuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzLlJlc291cmNlQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yOworCisvKioKKyAqIFJlc291cmNlQ29sbGVjdGlvbiB0aGF0IHNvcnRzIGFub3RoZXIgUmVzb3VyY2VDb2xsZWN0aW9uLgorICoKKyAqIE5vdGUgdGhhdCBTb3J0IG11c3Qgbm90IGJlIHVzZWQgaW4gY2FzZXMgd2hlcmUgdGhlIG9yZGVyaW5nIG9mIHRoZSBvYmplY3RzCisgKiBiZWluZyBzb3J0ZWQgbWlnaHQgY2hhbmdlIGR1cmluZyB0aGUgc29ydGluZyBwcm9jZXNzLgorICoKKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBTb3J0IGV4dGVuZHMgQmFzZVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIgeworCisgICAgLy9zb3J0ZWQgYmFnIGltcGwuIGJvcnJvd2VkIGZyb20gY29tbW9ucy1jb2xsZWN0aW9ucyBUcmVlQmFnOgorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNvcnRlZEJhZyBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbiB7CisgICAgICAgIHByaXZhdGUgY2xhc3MgTXV0YWJsZUludCB7CisgICAgICAgICAgICBwcml2YXRlIGludCB2YWx1ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBNeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgeworICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBrZXlJdGVyID0gdC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgcHJpdmF0ZSBPYmplY3QgY3VycmVudDsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG9jY3VycmVuY2U7CisgICAgICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2NjdXJyZW5jZSA+IDAgfHwga2V5SXRlci5oYXNOZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvY2N1cnJlbmNlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGtleUl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlID0gKChNdXRhYmxlSW50KSB0LmdldChjdXJyZW50KSkudmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC0tb2NjdXJyZW5jZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIFRyZWVNYXAgdDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc2l6ZTsKKworICAgICAgICBTb3J0ZWRCYWcoQ29tcGFyYXRvciBjKSB7CisgICAgICAgICAgICB0ID0gbmV3IFRyZWVNYXAoYyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTXlJdGVyYXRvcigpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGQoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICArK3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNdXRhYmxlSW50IG0gPSAoTXV0YWJsZUludCkgKHQuZ2V0KG8pKTsKKyAgICAgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtID0gbmV3IE11dGFibGVJbnQoKTsKKyAgICAgICAgICAgICAgICB0LnB1dChvLCBtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG0udmFsdWUrKzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yIGNvbXAgPSBuZXcgRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBTb3J0IHRoZSBjb250YWluZWQgZWxlbWVudHMuCisgICAgICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgUmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKCkgeworICAgICAgICBSZXNvdXJjZUNvbGxlY3Rpb24gcmMgPSBnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IHJjLml0ZXJhdG9yKCk7CisgICAgICAgIGlmICghKGl0ZXIuaGFzTmV4dCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKKyAgICAgICAgfQorICAgICAgICBTb3J0ZWRCYWcgYiA9IG5ldyBTb3J0ZWRCYWcoY29tcCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgYi5hZGQoaXRlci5uZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFJlc291cmNlQ29tcGFyYXRvciB0byB0aGlzIFNvcnQgUmVzb3VyY2VDb2xsZWN0aW9uLgorICAgICAqIElmIG11bHRpcGxlIFJlc291cmNlQ29tcGFyYXRvcnMgYXJlIGFkZGVkLCB0aGV5IHdpbGwgYmUgcHJvY2Vzc2VkIGluIExJRk8gb3JkZXIuCisgICAgICogQHBhcmFtIGMgdGhlIFJlc291cmNlQ29tcGFyYXRvciB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChSZXNvdXJjZUNvbXBhcmF0b3IgYykgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBjb21wLmFkZChjKTsKKyAgICAgICAgRmFpbEZhc3QuaW52YWxpZGF0ZSh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIgdmVyc2lvbgorICAgICAqIHRvIHJlY3Vyc2Ugb24gbmVzdGVkIFJlc291cmNlQ29tcGFyYXRvcnMuCisgICAgICogQHBhcmFtIHN0ayB0aGUgc3RhY2sgb2YgZGF0YSB0eXBlcyB0byB1c2UgKHJlY3Vyc2l2ZWx5KS4KKyAgICAgKiBAcGFyYW0gcCAgIHRoZSBwcm9qZWN0IHRvIHVzZSB0byBkZXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrIHN0aywgUHJvamVjdCBwKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgc3VwZXIuZGllT25DaXJjdWxhclJlZmVyZW5jZShzdGssIHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRGF0YVR5cGUuaW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjayhjb21wLCBzdGssIHApOworICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1N0cmluZ1Jlc291cmNlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvU3RyaW5nUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGI0ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1N0cmluZ1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKKworLyoqCisgKiBFeHBvc2VzIGEgc3RyaW5nIGFzIGEgUmVzb3VyY2UuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgU3RyaW5nUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7CisKKyAgICAvKiogTWFnaWMgbnVtYmVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUUklOR19NQUdJQworICAgICAgICA9IFJlc291cmNlLmdldE1hZ2ljTnVtYmVyKCJTdHJpbmdSZXNvdXJjZSIuZ2V0Qnl0ZXMoKSk7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBTdHJpbmdSZXNvdXJjZSB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoaXMgU3RyaW5nUmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1Jlc291cmNlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzKG51bGwsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBTdHJpbmdSZXNvdXJjZSB3aXRoIHRoZSBzdXBwbGllZCBwcm9qZWN0IGFuZCB2YWx1ZSwKKyAgICAgKiBkb2luZyBwcm9wZXJ0eSByZXBsYWNlbWVudCBhZ2FpbnN0IHRoZSBwcm9qZWN0IGlmIG5vbi1udWxsLgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBvd25pbmcgUHJvamVjdC4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoaXMgU3RyaW5nUmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1Jlc291cmNlKFByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIHNldFZhbHVlKHByb2plY3QgPT0gbnVsbCA/IHZhbHVlIDogcHJvamVjdC5yZXBsYWNlUHJvcGVydGllcyh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZm9yY2UgU3RyaW5nIGltbXV0YWJpbGl0eS4KKyAgICAgKiBAcGFyYW0gcyB0aGUgbmV3IG5hbWUvdmFsdWUgZm9yIHRoaXMgU3RyaW5nUmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE5hbWUoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKGdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obmV3IEltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldE5hbWUocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBhIHNlbWFudGljYWxseSBzdXBlcmlvciBhbGlhcyBmb3IgdGhlIG5hbWUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBzIHRoZSBTdHJpbmcncyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHMpIHsKKyAgICAgICAgc2V0TmFtZShzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSBhY2Nlc3MuCisgICAgICogQHJldHVybiB0aGUgbmFtZS92YWx1ZSBvZiB0aGlzIFN0cmluZ1Jlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGlzIFN0cmluZ1Jlc291cmNlLCByZXNvbHZpbmcgdG8gdGhlIHJvb3QgcmVmZXJlbmNlIGlmIG5lZWRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXByZXNlbnRlZCBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGV4aXN0cyBhdHRyaWJ1dGUgdGVsbHMgd2hldGhlciBhIHJlc291cmNlIGV4aXN0cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4aXN0cygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKCkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbmVzdGVkIHRleHQgdG8gdGhpcyByZXNvdXJjZS4KKyAgICAgKiBQcm9wZXJ0aWVzIHdpbGwgYmUgZXhwYW5kZWQgZHVyaW5nIHRoaXMgcHJvY2Vzcy4KKyAgICAgKiBAc2luY2UgQW50IDEuNy4xCisgICAgICogQHBhcmFtIHRleHQgdGV4dCB0byB1c2UgYXMgdGhlIHN0cmluZyByZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgY2hlY2tDaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgc2V0VmFsdWUoZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKHRleHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVuY29kaW5nIHRvIGJlIHVzZWQgZm9yIHRoaXMgU3RyaW5nUmVzb3VyY2UuCisgICAgICogQHBhcmFtIHMgdGhlIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBzKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgZW5jb2RpbmcgPSBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZW5jb2RpbmcgdXNlZCBieSB0aGlzIFN0cmluZ1Jlc291cmNlLgorICAgICAqIEByZXR1cm4gdGhlIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplLCBhcyBhIGxvbmcsIDAgaWYgdGhlIFJlc291cmNlIGRvZXMgbm90IGV4aXN0IChmb3IKKyAgICAgKiAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBqYXZhLmlvLkZpbGUpLCBvciBVTktOT1dOX1NJWkUgaWYgbm90IGtub3duLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0U2l6ZSgpCisgICAgICAgICAgICAgICAgOiBnZXRDb250ZW50KCkubGVuZ3RoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBoYXNoIGNvZGUgYXMgaW50LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpICogU1RSSU5HX01BR0lDOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyaW5nLiBTZWUge0BsaW5rICNnZXRDb250ZW50KCl9CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgY29udGVudHMgb2YgdGhlIHJlc291cmNlLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldENvbnRlbnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIElucHV0U3RyZWFtIGZvciB0aGUgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSBjb250YWluaW5nIHRoaXMgUmVzb3VyY2UncyBjb250ZW50LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdW5hYmxlIHRvIHByb3ZpZGUgdGhlIGNvbnRlbnQgb2YgdGhpcworICAgICAqICAgICAgICAgUmVzb3VyY2UgYXMgYSBzdHJlYW0uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBJbnB1dFN0cmVhbXMgYXJlIG5vdAorICAgICAqICAgICAgICAgc3VwcG9ydGVkIGZvciB0aGlzIFJlc291cmNlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gZ2V0Q29udGVudCgpOworICAgICAgICBpZiAoY29udGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bnNldCBzdHJpbmcgdmFsdWUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVuY29kaW5nID09IG51bGwKKyAgICAgICAgICAgICAgICA/IGNvbnRlbnQuZ2V0Qnl0ZXMoKSA6IGNvbnRlbnQuZ2V0Qnl0ZXMoZW5jb2RpbmcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gT3V0cHV0U3RyZWFtIGZvciB0aGUgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhbiBPdXRwdXRTdHJlYW0gdG8gd2hpY2ggY29udGVudCBjYW4gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBwcm92aWRlIHRoZSBjb250ZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIFJlc291cmNlIGFzIGEgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgT3V0cHV0U3RyZWFtcyBhcmUgbm90CisgICAgICogICAgICAgICBzdXBwb3J0ZWQgZm9yIHRoaXMgUmVzb3VyY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldFZhbHVlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdSZXNvdXJjZUZpbHRlck91dHB1dFN0cmVhbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgc3VwZXIgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVmZXJlbmNlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgeworICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBTdHJpbmdSZXNvdXJjZS4gU2VlIHtAbGluayAjZ2V0VmFsdWUoKX0KKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gdmFsdWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0Q29udGVudCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgb25seSBmb3IgdXNlIGJ5IG91ciBwcml2YXRlIGhlbHBlciBvdXRwdXQgc3RyZWFtLgorICAgICAqIEl0IGNvbnRhaW5zIHNwZWNpZmljIGxvZ2ljIGZvciBleHBhbmRpbmcgcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVGcm9tT3V0cHV0U3RyZWFtKFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKG91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9IG91dHB1dDsKKyAgICAgICAgfQorICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTdHJpbmdSZXNvdXJjZUZpbHRlck91dHB1dFN0cmVhbSBleHRlbmRzIEZpbHRlck91dHB1dFN0cmVhbSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3M7CisKKyAgICAgICAgcHVibGljIFN0cmluZ1Jlc291cmNlRmlsdGVyT3V0cHV0U3RyZWFtKCkgeworICAgICAgICAgICAgc3VwZXIobmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGJhb3MgPSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKSBvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGVuY29kaW5nID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBiYW9zLnRvU3RyaW5nKCkgOiBiYW9zLnRvU3RyaW5nKGVuY29kaW5nKTsKKworICAgICAgICAgICAgU3RyaW5nUmVzb3VyY2UudGhpcy5zZXRWYWx1ZUZyb21PdXRwdXRTdHJlYW0ocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9UYXJSZXNvdXJjZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1RhclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0MGJmNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9UYXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMudGFyLlRhckVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMudGFyLlRhcklucHV0U3RyZWFtOworCisvKioKKyAqIEEgUmVzb3VyY2UgcmVwcmVzZW50YXRpb24gb2YgYW4gZW50cnkgaW4gYSB0YXIgYXJjaGl2ZS4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBUYXJSZXNvdXJjZSBleHRlbmRzIEFyY2hpdmVSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyB1c2VyTmFtZSA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwTmFtZSA9ICIiOworICAgIHByaXZhdGUgaW50ICAgIHVpZDsKKyAgICBwcml2YXRlIGludCAgICBnaWQ7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBUYXJSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBUYXJSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gYSB0aGUgYXJjaGl2ZSBhcyBGaWxlLgorICAgICAqIEBwYXJhbSBlIHRoZSBUYXJFbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFyUmVzb3VyY2UoRmlsZSBhLCBUYXJFbnRyeSBlKSB7CisgICAgICAgIHN1cGVyKGEsIHRydWUpOworICAgICAgICBzZXRFbnRyeShlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBUYXJSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gYSB0aGUgYXJjaGl2ZSBhcyBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gZSB0aGUgVGFyRW50cnkuCisgICAgICovCisgICAgcHVibGljIFRhclJlc291cmNlKFJlc291cmNlIGEsIFRhckVudHJ5IGUpIHsKKyAgICAgICAgc3VwZXIoYSwgdHJ1ZSk7CisgICAgICAgIHNldEVudHJ5KGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZyB0aGUgY29udGVudHMgb2YgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGFuIElucHV0U3RyZWFtIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB0YXIgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLAorICAgICAqICAgICAgICAgb3IgdGhlIGVudHJ5IGNhbm5vdCBiZSByZWFkLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisgICAgICAgIFJlc291cmNlIGFyY2hpdmUgPSBnZXRBcmNoaXZlKCk7CisgICAgICAgIGZpbmFsIFRhcklucHV0U3RyZWFtIGkgPSBuZXcgVGFySW5wdXRTdHJlYW0oYXJjaGl2ZS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgVGFyRW50cnkgdGUgPSBudWxsOworICAgICAgICB3aGlsZSAoKHRlID0gaS5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRlLmdldE5hbWUoKS5lcXVhbHMoZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGkpOworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5vIGVudHJ5ICIgKyBnZXROYW1lKCkgKyAiIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0QXJjaGl2ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gT3V0cHV0U3RyZWFtIGZvciB0aGUgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhbiBPdXRwdXRTdHJlYW0gdG8gd2hpY2ggY29udGVudCBjYW4gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBwcm92aWRlIHRoZSBjb250ZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIFJlc291cmNlIGFzIGEgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgT3V0cHV0U3RyZWFtcyBhcmUgbm90CisgICAgICogICAgICAgICBzdXBwb3J0ZWQgZm9yIHRoaXMgUmVzb3VyY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAiVXNlIHRoZSB0YXIgdGFzayBmb3IgdGFyIG91dHB1dC4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VyIG5hbWUgZm9yIHRoZSB0YXIgZW50cnkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoVGFyUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0VXNlck5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXNlck5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZ3JvdXAgbmFtZSBmb3IgdGhlIHRhciBlbnRyeQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXAoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChUYXJSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRHcm91cCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBncm91cE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdWlkIGZvciB0aGUgdGFyIGVudHJ5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRVaWQoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChUYXJSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRVaWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdWlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHVpZCBmb3IgdGhlIHRhciBlbnRyeQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0R2lkKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoVGFyUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0R2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmZXRjaGVzIGluZm9ybWF0aW9uIGZyb20gdGhlIG5hbWVkIGVudHJ5IGluc2lkZSB0aGUgYXJjaGl2ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmZXRjaEVudHJ5KCkgeworICAgICAgICBSZXNvdXJjZSBhcmNoaXZlID0gZ2V0QXJjaGl2ZSgpOworICAgICAgICBUYXJJbnB1dFN0cmVhbSBpID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGkgPSBuZXcgVGFySW5wdXRTdHJlYW0oYXJjaGl2ZS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIFRhckVudHJ5IHRlID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlICgodGUgPSBpLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHRlLmdldE5hbWUoKS5lcXVhbHMoZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRFbnRyeSh0ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZyhlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZXRFbnRyeShudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0RW50cnkoVGFyRW50cnkgZSkgeworICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRFeGlzdHMoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNldE5hbWUoZS5nZXROYW1lKCkpOworICAgICAgICBzZXRFeGlzdHModHJ1ZSk7CisgICAgICAgIHNldExhc3RNb2RpZmllZChlLmdldE1vZFRpbWUoKS5nZXRUaW1lKCkpOworICAgICAgICBzZXREaXJlY3RvcnkoZS5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgc2V0U2l6ZShlLmdldFNpemUoKSk7CisgICAgICAgIHNldE1vZGUoZS5nZXRNb2RlKCkpOworICAgICAgICB1c2VyTmFtZSA9IGUuZ2V0VXNlck5hbWUoKTsKKyAgICAgICAgZ3JvdXBOYW1lID0gZS5nZXRHcm91cE5hbWUoKTsKKyAgICAgICAgdWlkID0gZS5nZXRVc2VySWQoKTsKKyAgICAgICAgZ2lkID0gZS5nZXRHcm91cElkKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVG9rZW5zLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVG9rZW5zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwZDc5MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Ub2tlbnMuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ29uY2F0UmVzb3VyY2VJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkxpbmVUb2tlbml6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Ub2tlbml6ZXI7CisKKy8qKgorICogUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnNpc3Rpbmcgb2YgU3RyaW5nUmVzb3VyY2VzIGdhdGhlcmVkIGZyb20gdG9rZW5pemluZworICogYW5vdGhlciBSZXNvdXJjZUNvbGxlY3Rpb24gd2l0aCBhIFRva2VuaXplciBpbXBsZW1lbnRhdGlvbi4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBUb2tlbnMgZXh0ZW5kcyBCYXNlUmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlciB7CisKKyAgICBwcml2YXRlIFRva2VuaXplciB0b2tlbml6ZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7CisKKyAgICAvKioKKyAgICAgKiBTb3J0IHRoZSBjb250YWluZWQgZWxlbWVudHMuCisgICAgICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgUmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKCkgeworICAgICAgICBSZXNvdXJjZUNvbGxlY3Rpb24gcmMgPSBnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgaWYgKHJjLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOworICAgICAgICB9CisgICAgICAgIGlmICh0b2tlbml6ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdG9rZW5pemVyID0gbmV3IExpbmVUb2tlbml6ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtIGNhdCA9IG5ldyBDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtKHJjKTsKKyAgICAgICAgY2F0LnNldE1hbmFnaW5nQ29tcG9uZW50KHRoaXMpOworCisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJkciA9IG51bGw7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY2F0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmRyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGNhdCwgZW5jb2RpbmcpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzID0gdG9rZW5pemVyLmdldFRva2VuKHJkcik7IHMgIT0gbnVsbDsgcyA9IHRva2VuaXplci5nZXRUb2tlbihyZHIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgU3RyaW5nUmVzb3VyY2Uocyk7CisgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgdG9rZW5zIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVuY29kaW5nIHVzZWQgdG8gY3JlYXRlIHRoZSB0b2tlbnMuCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBuZXN0ZWQgVG9rZW5pemVyIHRvIHRoaXMgVG9rZW5zIFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKiBBIExpbmVUb2tlbml6ZXIgd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQuCisgICAgICogQHBhcmFtIHRva2VuaXplciB0aGUgdG9rZW5pemVyIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKFRva2VuaXplciB0b2tlbml6ZXIpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMudG9rZW5pemVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgbmVzdGVkIHRva2VuaXplciBhbGxvd2VkLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMudG9rZW5pemVyID0gdG9rZW5pemVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgQmFzZVJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lciB2ZXJzaW9uCisgICAgICogdG8gY2hlY2sgdGhlIG5lc3RlZCBUb2tlbml6ZXIuCisgICAgICogQHBhcmFtIHN0ayB0aGUgc3RhY2sgb2YgZGF0YSB0eXBlcyB0byB1c2UgKHJlY3Vyc2l2ZWx5KS4KKyAgICAgKiBAcGFyYW0gcCAgIHRoZSBwcm9qZWN0IHRvIHVzZSB0byBkZXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlcy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrIHN0aywgUHJvamVjdCBwKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgc3VwZXIuZGllT25DaXJjdWxhclJlZmVyZW5jZShzdGssIHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHRva2VuaXplciBpbnN0YW5jZW9mIERhdGFUeXBlKSB7CisgICAgICAgICAgICAgICAgc3RrLnB1c2godG9rZW5pemVyKTsKKyAgICAgICAgICAgICAgICBpbnZva2VDaXJjdWxhclJlZmVyZW5jZUNoZWNrKChEYXRhVHlwZSkgdG9rZW5pemVyLCBzdGssIHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1RvdWNoYWJsZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1RvdWNoYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTRhNjkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVG91Y2hhYmxlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5ICJ0b3VjaGFibGUiIHJlc291cmNlczsKKyAqIHRoYXQgaXMsIHRob3NlIHdob3NlIG1vZGlmaWNhdGlvbiB0aW1lIGNhbiBiZSBhbHRlcmVkLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGludGVyZmFjZSBUb3VjaGFibGUgeworICAgIC8qKgorICAgICAqIE1ldGhvZCBjYWxsZWQgdG8gInRvdWNoIiB0aGUgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIG1vZFRpbWUgdGhlIHRpbWUgdG8gc2V0IHRoZSBtb2RpZmllZCAiZmllbGQiIG9mIHRoZSByZXNvdXJjZSwKKyAgICAgKiAgICAgICAgICAgICAgICBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAqLworICAgIHZvaWQgdG91Y2gobG9uZyBtb2RUaW1lKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9VUkxSZXNvdXJjZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1VSTFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmZDRkMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9VUkxSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSmFyVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBFeHBvc2VzIGEgVVJMIGFzIGEgUmVzb3VyY2UuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgVVJMUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTExfVVJMCisgICAgICAgID0gUmVzb3VyY2UuZ2V0TWFnaWNOdW1iZXIoIm51bGwgVVJMIi5nZXRCeXRlcygpKTsKKworICAgIHByaXZhdGUgVVJMIHVybDsKKyAgICBwcml2YXRlIFVSTENvbm5lY3Rpb24gY29ubjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFVSTFJlc291cmNlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yLgorICAgICAqIEBwYXJhbSB1IHRoZSBVUkwgdG8gZXhwb3NlLgorICAgICAqLworICAgIHB1YmxpYyBVUkxSZXNvdXJjZShVUkwgdSkgeworICAgICAgICBzZXRVUkwodSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIGYgdGhlIEZpbGUgdG8gc2V0IGFzIGEgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBVUkxSZXNvdXJjZShGaWxlIGYpIHsKKyAgICAgICAgc2V0RmlsZShmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJpbmcgY29uc3RydWN0b3IgZm9yIEFudCBhdHRyaWJ1dGUgaW50cm9zcGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gdSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVUkwuCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5JbnRyb3NwZWN0aW9uSGVscGVyCisgICAgICovCisgICAgcHVibGljIFVSTFJlc291cmNlKFN0cmluZyB1KSB7CisgICAgICAgIHRoaXMobmV3VVJMKHUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVSTCBmb3IgdGhpcyBVUkxSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gdSB0aGUgVVJMIHRvIGV4cG9zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VVJMKFVSTCB1KSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKKyAgICAgICAgdXJsID0gdTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVSTCBmcm9tIGEgRmlsZS4KKyAgICAgKiBAcGFyYW0gZiB0aGUgRmlsZSB0byBzZXQgYXMgYSBVUkwuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEZpbGUoRmlsZSBmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRVUkwoRklMRV9VVElMUy5nZXRGaWxlVVJMKGYpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgVVJMIHVzZWQgYnkgdGhpcyBVUkxSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGEgVVJMIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFVSTCBnZXRVUkwoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChVUkxSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRVUkwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJsOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIHN1cGVyIHZlcnNpb24uCisgICAgICogQHBhcmFtIHIgdGhlIFJlZmVyZW5jZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB7CisgICAgICAgIC8vbm90IHVzaW5nIHRoZSBhY2Nlc3NvciBpbiB0aGlzIGNhc2UgdG8gYXZvaWQgc2lkZSBlZmZlY3RzCisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBVUkxSZXNvdXJjZQorICAgICAqIChpdHMgZmlsZSBjb21wb25lbnQgbWludXMgdGhlIGxlYWRpbmcgc2VwYXJhdG9yKS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFVSTCgpLmdldEZpbGUoKTsKKyAgICAgICAgcmV0dXJuICIiLmVxdWFscyhuYW1lKSA/IG5hbWUgOiBuYW1lLnN1YnN0cmluZygxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBVUkxSZXNvdXJjZSBmb3JtYXR0ZWQgYXMgYSBTdHJpbmcuCisgICAgICogQHJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSTFJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKQorICAgICAgICAgICAgPyBnZXRDaGVja2VkUmVmKCkudG9TdHJpbmcoKSA6IFN0cmluZy52YWx1ZU9mKGdldFVSTCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIG91dCB3aGV0aGVyIHRoZSBVUkwgZXhpc3RzIC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBleGlzdHMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRXhpc3RzKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNFeGlzdHMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNFeGlzdHMoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgb3V0IHdoZXRoZXIgdGhlIFVSTCBleGlzdHMsIGFuZCBjbG9zZSB0aGUgY29ubmVjdGlvbgorICAgICAqIG9wZW5lZCB0byB0aGUgVVJMIGlmIGNsb3NlQ29ubmVjdGlvbiBpcyB0cnVlLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgZW5zdXJlIHRoYXQgaWY6CisgICAgICogLSB0aGUgcmVzb3VyY2UgZXhpc3RzIChpZiBpdCByZXR1cm5zIHRydWUpCisgICAgICogLSBhbmQgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZQorICAgICAqIChpc1JlZmVyZW5jZSgpIHJldHVybnMgZmFsc2UpCisgICAgICogLSBhbmQgaWYgaXQgd2FzIGNhbGxlZCB3aXRoIGNsb3NlQ29ubmVjdGlvbiB0byBmYWxzZSwKKyAgICAgKgorICAgICAqIHRoZW4gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIFVSTCAoc3RvcmVkIGluIHRoZSBjb25uCisgICAgICogcHJpdmF0ZSBmaWVsZCkgd2lsbCBiZSBvcGVuZWQsIGFuZCByZXF1aXJlIHRvIGJlIGNsb3NlZAorICAgICAqIGJ5IHRoZSBjYWxsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xvc2VDb25uZWN0aW9uIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGNsb3NlZAorICAgICAqIGFmdGVyIHRoZSBjYWxsLCBmYWxzZSBpZiBpdCBzaG91bGQgc3RheSBvcGVuLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGlzRXhpc3RzKGJvb2xlYW4gY2xvc2VDb25uZWN0aW9uKSB7CisgICAgICAgIGlmIChnZXRVUkwoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm5lY3QoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY2xvc2VDb25uZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVsbHMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSAwMS4wMS4xOTcwIC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gMCBpZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgdG8gbWlycm9yIHRoZSBiZWhhdmlvcgorICAgICAqIG9mIHtAbGluayBqYXZhLmlvLkZpbGUgRmlsZX0uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICB9CisgICAgICAgIGlmICghaXNFeGlzdHMoZmFsc2UpKSB7CisgICAgICAgICAgICByZXR1cm4gMEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbm4uZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbHMgaWYgdGhlIHJlc291cmNlIGlzIGEgZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBhIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpCisgICAgICAgICAgICA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNEaXJlY3RvcnkoKQorICAgICAgICAgICAgOiBnZXROYW1lKCkuZW5kc1dpdGgoIi8iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplLCBhcyBhIGxvbmcsIDAgaWYgdGhlIFJlc291cmNlIGRvZXMgbm90IGV4aXN0IChmb3IKKyAgICAgKiAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBqYXZhLmlvLkZpbGUpLCBvciBVTktOT1dOX1NJWkUgaWYgbm90IGtub3duLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRTaXplKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmICghaXNFeGlzdHMoZmFsc2UpKSB7CisgICAgICAgICAgICByZXR1cm4gMEw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm5lY3QoKTsKKyAgICAgICAgICAgIGxvbmcgY29udGVudGxlbmd0aCA9IGNvbm4uZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50bGVuZ3RoOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9TSVpFOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aGV0aGVyIGFuIE9iamVjdCBlcXVhbHMgdGhpcyBVUkxSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYW5vdGhlciB0aGUgb3RoZXIgT2JqZWN0IHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgUmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhPYmplY3QgYW5vdGhlcikgeworICAgICAgICBpZiAodGhpcyA9PSBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5lcXVhbHMoYW5vdGhlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoYW5vdGhlci5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBVUkxSZXNvdXJjZSBvdGhlcnUgPSAoVVJMUmVzb3VyY2UpIGFub3RoZXI7CisgICAgICAgIHJldHVybiBnZXRVUkwoKSA9PSBudWxsCisgICAgICAgICAgICA/IG90aGVydS5nZXRVUkwoKSA9PSBudWxsCisgICAgICAgICAgICA6IGdldFVSTCgpLmVxdWFscyhvdGhlcnUuZ2V0VVJMKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gaGFzaCBjb2RlIGFzIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTUFHSUMgKiAoKGdldFVSTCgpID09IG51bGwpID8gTlVMTF9VUkwgOiBnZXRVUkwoKS5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gSW5wdXRTdHJlYW0gZm9yIHRoZSBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGFuIElucHV0U3RyZWFtIGNvbnRhaW5pbmcgdGhpcyBSZXNvdXJjZSdzIGNvbnRlbnQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB1bmFibGUgdG8gcHJvdmlkZSB0aGUgY29udGVudCBvZiB0aGlzCisgICAgICogICAgICAgICBSZXNvdXJjZSBhcyBhIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIElucHV0U3RyZWFtcyBhcmUgbm90CisgICAgICogICAgICAgICBzdXBwb3J0ZWQgZm9yIHRoaXMgUmVzb3VyY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIH0KKyAgICAgICAgY29ubmVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbm4gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIE91dHB1dFN0cmVhbSBmb3IgdGhlIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gYW4gT3V0cHV0U3RyZWFtIHRvIHdoaWNoIGNvbnRlbnQgY2FuIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB1bmFibGUgdG8gcHJvdmlkZSB0aGUgY29udGVudCBvZiB0aGlzCisgICAgICogICAgICAgICBSZXNvdXJjZSBhcyBhIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIE91dHB1dFN0cmVhbXMgYXJlIG5vdAorICAgICAqICAgICAgICAgc3VwcG9ydGVkIGZvciB0aGlzIFJlc291cmNlIHR5cGUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgVVJMIGNhbm5vdCBiZSBvcGVuZWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICB9CisgICAgICAgIGNvbm5lY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjb25uLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjb25uZWN0aW9uIGNhbm5vdCBiZSBlc3RhYmxpc2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFVSTCB1ID0gZ2V0VVJMKCk7CisgICAgICAgIGlmICh1ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVVJMIG5vdCBzZXQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29ubiA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm4gPSB1Lm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgY29ubi5jb25uZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBVUkwgY29ubmVjdGlvbiBpZjoKKyAgICAgKiAtIGl0IGlzIG9wZW5lZCAoaS5lLiB0aGUgZmllbGQgY29ubiBpcyBub3QgbnVsbCkKKyAgICAgKiAtIHRoaXMgdHlwZSBvZiBVUkxDb25uZWN0aW9uIHN1cHBvcnRzIHNvbWUgc29ydCBvZiBjbG9zZSBtZWNoYW5pc20KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIGZpZWxkIGNvbm4gd2lsbCBiZSBudWxsIGFmdGVyIHRoZSBjYWxsLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoY29ubiBpbnN0YW5jZW9mIEphclVSTENvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgSmFyVVJMQ29ubmVjdGlvbiBqdWMgPSAoSmFyVVJMQ29ubmVjdGlvbikgY29ubjsKKyAgICAgICAgICAgICAgICAgICAgSmFyRmlsZSBqZiA9IGp1Yy5nZXRKYXJGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGpmLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGpmID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbm4gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAoKEh0dHBVUkxDb25uZWN0aW9uKSBjb25uKS5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY29ubiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBVUkwgbmV3VVJMKFN0cmluZyB1KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1KTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1VuaW9uLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVW5pb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM3MmIyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1VuaW9uLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CisKKy8qKgorICogUmVzb3VyY2VDb2xsZWN0aW9uIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgbXVsdGlwbGUgbmVzdGVkIFJlc291cmNlQ29sbGVjdGlvbnMuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgVW5pb24gZXh0ZW5kcyBCYXNlUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyIHsKKworICAgIC8qKgorICAgICAqIFN0YXRpYyBjb252ZW5pZW5jZSBtZXRob2QgdG8gdW5pb24gYW4gYXJiaXRyYXJ5IHNldCBvZiBSZXNvdXJjZXMuCisgICAgICogQHBhcmFtIHJjIGEgUmVzb3VyY2VDb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4gYSBVbmlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVuaW9uIGdldEluc3RhbmNlKFJlc291cmNlQ29sbGVjdGlvbiByYykgeworICAgICAgICByZXR1cm4gcmMgaW5zdGFuY2VvZiBVbmlvbiA/IChVbmlvbikgcmMgOiBuZXcgVW5pb24ocmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFVuaW9uKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yLgorICAgICAqIEBwYXJhbSByYyB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVW5pb24oUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CisgICAgICAgIGFkZChyYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgUmVzb3VyY2VzIGluIFN0cmluZyBmb3JtYXQuIFByb3ZpZGVkIGZvcgorICAgICAqIGNvbnZlbmllbmNlIGluIGltcGxlbWVudGluZyBQYXRoLgorICAgICAqIEByZXR1cm4gU3RyaW5nIGFycmF5IG9mIFJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gbGlzdCgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFVuaW9uKSBnZXRDaGVja2VkUmVmKCkpLmxpc3QoKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IGdldENvbGxlY3Rpb24odHJ1ZSk7CisgICAgICAgIHJldHVybiAoU3RyaW5nW10pIChyZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kLgorICAgICAqIEByZXR1cm4gUmVzb3VyY2VbXQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZVtdIGxpc3RSZXNvdXJjZXMoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChVbmlvbikgZ2V0Q2hlY2tlZFJlZigpKS5saXN0UmVzb3VyY2VzKCk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbiByZXN1bHQgPSBnZXRDb2xsZWN0aW9uKCk7CisgICAgICAgIHJldHVybiAoUmVzb3VyY2VbXSkgKHJlc3VsdC50b0FycmF5KG5ldyBSZXNvdXJjZVtyZXN1bHQuc2l6ZSgpXSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuaWZ5IHRoZSBjb250YWluZWQgUmVzb3VyY2VzLgorICAgICAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gZ2V0Q29sbGVjdGlvbihmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5pZnkgdGhlIGNvbnRhaW5lZCBSZXNvdXJjZXMuCisgICAgICogQHBhcmFtIGFzU3RyaW5nIGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXN1bHRpbmcgQ29sbGVjdGlvbgorICAgICAqICAgICAgICBzaG91bGQgY29udGFpbiBTdHJpbmdzIGluc3RlYWQgb2YgUmVzb3VyY2VzLgorICAgICAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDb2xsZWN0aW9uKGJvb2xlYW4gYXNTdHJpbmcpIHsKKyAgICAgICAgTGlzdCByYyA9IGdldFJlc291cmNlQ29sbGVjdGlvbnMoKTsKKyAgICAgICAgaWYgKHJjLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIH0KKyAgICAgICAgLy9wcmVzZXJ2ZSBvcmRlci1lbmNvdW50ZXJlZCB1c2luZyBhIGxpc3Q7IGVuZm9yY2Ugc2V0IGxvZ2ljIG1hbnVhbGx5OgorICAgICAgICAvLyAoTGlua2VkSGFzaFNldCBiZXR0ZXIsIGJ1dCBKREsgMS40KykKKyAgICAgICAgQXJyYXlMaXN0IHVuaW9uID0gbmV3IEFycmF5TGlzdChyYy5zaXplKCkgKiAyKTsKKyAgICAgICAgLy8gVXNlIGEgc2V0IGFzIGxpc3QuY29udGFpbnMoKSBjYW4gYmUgZXhwZW5zaXZlIGZvciBsb3RzIG9mIHJlc291cmNlcworICAgICAgICBTZXQgc2V0ID0gbmV3IEhhc2hTZXQocmMuc2l6ZSgpICogMik7CisgICAgICAgIGZvciAoSXRlcmF0b3IgcmNJdGVyID0gcmMuaXRlcmF0b3IoKTsgcmNJdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgciA9IG5leHRSQyhyY0l0ZXIpLml0ZXJhdG9yKCk7IHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGFzU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG8gPSBvLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzZXQuYWRkKG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHVuaW9uLmFkZChvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVuaW9uOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQ29sbGVjdGlvbiBuZXh0UkMoSXRlcmF0b3IgaSkgeworICAgICAgICByZXR1cm4gKFJlc291cmNlQ29sbGVjdGlvbikgaS5uZXh0KCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvWmlwUmVzb3VyY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9aaXBSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYWIxMDIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvWmlwUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBFbnRyeTsKKworLyoqCisgKiBBIFJlc291cmNlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVudHJ5IGluIGEgemlwZmlsZS4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBaaXBSZXNvdXJjZSBleHRlbmRzIEFyY2hpdmVSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFppcFJlc291cmNlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIFppcFJlc291cmNlIHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkCisgICAgICogZW50cnkgaW4gdGhlIHNwZWNpZmllZCB6aXBmaWxlLgorICAgICAqIEBwYXJhbSB6IHRoZSB6aXBmaWxlIGFzIEZpbGUuCisgICAgICogQHBhcmFtIGVuYyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgZmlsZW5hbWVzLgorICAgICAqIEBwYXJhbSBlIHRoZSBaaXBFbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwUmVzb3VyY2UoRmlsZSB6LCBTdHJpbmcgZW5jLCBaaXBFbnRyeSBlKSB7CisgICAgICAgIHN1cGVyKHosIHRydWUpOworICAgICAgICBzZXRFbmNvZGluZyhlbmMpOworICAgICAgICBzZXRFbnRyeShlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHppcGZpbGUgdGhhdCBob2xkcyB0aGlzIFppcFJlc291cmNlLgorICAgICAqIEBwYXJhbSB6IHRoZSB6aXBmaWxlIGFzIGEgRmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRaaXBmaWxlKEZpbGUgeikgeworICAgICAgICBzZXRBcmNoaXZlKHopOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgemlwZmlsZSB0aGF0IGhvbGRzIHRoaXMgWmlwUmVzb3VyY2UuCisgICAgICogQHJldHVybiB0aGUgemlwZmlsZSBhcyBhIEZpbGUuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0WmlwZmlsZSgpIHsKKyAgICAgICAgRmlsZVJlc291cmNlIHIgPSAoRmlsZVJlc291cmNlKSBnZXRBcmNoaXZlKCk7CisgICAgICAgIHJldHVybiByLmdldEZpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhcmNoaXZlIHRoYXQgaG9sZHMgdGhpcyBhcyBhIHNpbmdsZSBlbGVtZW50IFJlc291cmNlCisgICAgICogY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYSB0aGUgYXJjaGl2ZSBhcyBhIHNpbmdsZSBlbGVtZW50IFJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChSZXNvdXJjZUNvbGxlY3Rpb24gYSkgeworICAgICAgICBzdXBlci5hZGRDb25maWd1cmVkKGEpOworICAgICAgICBpZiAoIWEuaXNGaWxlc3lzdGVtT25seSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm9ubHkgZmlsZXN5c3RlbSByZXNvdXJjZXMgYXJlIHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlbmNvZGluZyB0byB1c2Ugd2l0aCB0aGUgemlwZmlsZS4KKyAgICAgKiBAcGFyYW0gZW5jIHRoZSBTdHJpbmcgZW5jb2RpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuYykgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7CisgICAgICAgIGVuY29kaW5nID0gZW5jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZW5jb2RpbmcgdG8gdXNlIHdpdGggdGhlIHppcGZpbGUuCisgICAgICogQHJldHVybiBTdHJpbmcgZW5jb2RpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkKKyAgICAgICAgICAgID8gKChaaXBSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRFbmNvZGluZygpIDogZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHRoZSBzdXBlciB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSByIHRoZSBSZWZlcmVuY2UgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZyB0aGUgY29udGVudHMgb2YgdGhpcyBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGFuIElucHV0U3RyZWFtIG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB6aXAgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLAorICAgICAqICAgICAgICAgb3IgdGhlIGVudHJ5IGNhbm5vdCBiZSByZWFkLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFppcEZpbGUgeiA9IG5ldyBaaXBGaWxlKGdldFppcGZpbGUoKSwgZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIFppcEVudHJ5IHplID0gei5nZXRFbnRyeShnZXROYW1lKCkpOworICAgICAgICBpZiAoemUgPT0gbnVsbCkgeworICAgICAgICAgICAgei5jbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJubyBlbnRyeSAiICsgZ2V0TmFtZSgpICsgIiBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRBcmNoaXZlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRmlsdGVySW5wdXRTdHJlYW0oei5nZXRJbnB1dFN0cmVhbSh6ZSkpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOworICAgICAgICAgICAgICAgIHouY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gT3V0cHV0U3RyZWFtIGZvciB0aGUgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhbiBPdXRwdXRTdHJlYW0gdG8gd2hpY2ggY29udGVudCBjYW4gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBwcm92aWRlIHRoZSBjb250ZW50IG9mIHRoaXMKKyAgICAgKiAgICAgICAgIFJlc291cmNlIGFzIGEgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgT3V0cHV0U3RyZWFtcyBhcmUgbm90CisgICAgICogICAgICAgICBzdXBwb3J0ZWQgZm9yIHRoaXMgUmVzb3VyY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAiVXNlIHRoZSB6aXAgdGFzayBmb3IgemlwIG91dHB1dC4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmZXRjaGVzIGluZm9ybWF0aW9uIGZyb20gdGhlIG5hbWVkIGVudHJ5IGluc2lkZSB0aGUgYXJjaGl2ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmZXRjaEVudHJ5KCkgeworICAgICAgICBaaXBGaWxlIHogPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgeiA9IG5ldyBaaXBGaWxlKGdldFppcGZpbGUoKSwgZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgICAgICBzZXRFbnRyeSh6LmdldEVudHJ5KGdldE5hbWUoKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh6ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB6LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLz8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0RW50cnkoWmlwRW50cnkgZSkgeworICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRFeGlzdHMoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNldE5hbWUoZS5nZXROYW1lKCkpOworICAgICAgICBzZXRFeGlzdHModHJ1ZSk7CisgICAgICAgIHNldExhc3RNb2RpZmllZChlLmdldFRpbWUoKSk7CisgICAgICAgIHNldERpcmVjdG9yeShlLmlzRGlyZWN0b3J5KCkpOworICAgICAgICBzZXRTaXplKGUuZ2V0U2l6ZSgpKTsKKyAgICAgICAgc2V0TW9kZShlLmdldFVuaXhNb2RlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0NvbnRlbnQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9Db250ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTgxMGI2NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9Db250ZW50LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZXNvdXJjZVV0aWxzOworCisvKioKKyAqIENvbXBhcmVzIFJlc291cmNlcyBieSBjb250ZW50LgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIENvbnRlbnQgZXh0ZW5kcyBSZXNvdXJjZUNvbXBhcmF0b3IgeworCisgICAgcHJpdmF0ZSBib29sZWFuIGJpbmFyeSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYmluYXJ5IG1vZGUgZm9yIHRoaXMgQ29udGVudCBSZXNvdXJjZUNvbXBhcmF0b3IuIElmIHRoaXMKKyAgICAgKiBhdHRyaWJ1dGUgaXMgc2V0IHRvIGZhbHNlLCBSZXNvdXJjZSBjb250ZW50IHdpbGwgYmUgY29tcGFyZWQKKyAgICAgKiBpZ25vcmluZyBwbGF0Zm9ybSBsaW5lLWVuZGluZyBjb252ZW50aW9ucy4KKyAgICAgKiBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqIEBwYXJhbSBiIHdoZXRoZXIgdG8gY29tcGFyZSBjb250ZW50IGluIGJpbmFyeSBtb2RlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJpbmFyeShib29sZWFuIGIpIHsKKyAgICAgICAgYmluYXJ5ID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWFybiB3aGV0aGVyIHRoaXMgQ29udGVudCBSZXNvdXJjZUNvbXBhcmF0b3IgaXMgb3BlcmF0aW5nIGluIGJpbmFyeSBtb2RlLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBiaW5hcnkgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKKyAgICAgICAgcmV0dXJuIGJpbmFyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBSZXNvdXJjZXMgYnkgY29udGVudC4KKyAgICAgKiBAcGFyYW0gZm9vIHRoZSBmaXJzdCBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYmFyIHRoZSBzZWNvbmQgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QKKyAgICAgKiAgICAgICAgIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgSS9PIGVycm9ycyBvY2N1ci4KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVzb3VyY2VVdGlscyNjb21wYXJlQ29udGVudChSZXNvdXJjZSwgUmVzb3VyY2UsIGJvb2xlYW4pLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcmVzb3VyY2VDb21wYXJlKFJlc291cmNlIGZvbywgUmVzb3VyY2UgYmFyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VVdGlscy5jb21wYXJlQ29udGVudChmb28sIGJhciwgIWJpbmFyeSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0RhdGUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9EYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjZiZTY2YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9EYXRlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKKworLyoqCisgKiBDb21wYXJlcyBSZXNvdXJjZXMgYnkgbGFzdCBtb2RpZmljYXRpb24gZGF0ZS4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlIGV4dGVuZHMgUmVzb3VyY2VDb21wYXJhdG9yIHsKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBSZXNvdXJjZXMuCisgICAgICogQHBhcmFtIGZvbyB0aGUgZmlyc3QgUmVzb3VyY2UuCisgICAgICogQHBhcmFtIGJhciB0aGUgc2Vjb25kIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0CisgICAgICogICAgICAgICBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJlc291cmNlQ29tcGFyZShSZXNvdXJjZSBmb28sIFJlc291cmNlIGJhcikgeworICAgICAgICBsb25nIGRpZmYgPSBmb28uZ2V0TGFzdE1vZGlmaWVkKCkgLSBiYXIuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgIGlmIChkaWZmID4gMCkgeworICAgICAgICAgICAgcmV0dXJuICsxOworICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0RlbGVnYXRlZFJlc291cmNlQ29tcGFyYXRvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0RlbGVnYXRlZFJlc291cmNlQ29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNWM1YjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzOworCitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKKworLyoqCisgKiBEZWxlZ2F0ZXMgdG8gb3RoZXIgUmVzb3VyY2VDb21wYXJhdG9ycyBvciwgaWYgbm9uZSBzcGVjaWZpZWQsCisgKiB1c2VzIFJlc291cmNlcycgbmF0dXJhbCBvcmRlcmluZy4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0ZWRSZXNvdXJjZUNvbXBhcmF0b3IgZXh0ZW5kcyBSZXNvdXJjZUNvbXBhcmF0b3IgeworCisgICAgcHJpdmF0ZSBWZWN0b3IgdiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBkZWxlZ2F0ZSBSZXNvdXJjZUNvbXBhcmF0b3IuCisgICAgICogQHBhcmFtIGMgdGhlIG5leHQgZGVsZWdhdGUgUmVzb3VyY2VDb21wYXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoUmVzb3VyY2VDb21wYXJhdG9yIGMpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHYgPSAodiA9PSBudWxsKSA/IG5ldyBWZWN0b3IoKSA6IHY7CisgICAgICAgIHYuYWRkKGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWFsaXR5IG1ldGhvZCBiYXNlZCBvbiB0aGUgdmVjdG9yIG9mIHJlc291cmNlcywKKyAgICAgKiBvciBpZiBhIHJlZmVyZW5jZSwgdGhlIHJlZmVycmVkdG8gb2JqZWN0LgorICAgICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgdG8gY2hlY2sgYWdhaW5zdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgZXF1YWxpdHkuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5lcXVhbHMobyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIERlbGVnYXRlZFJlc291cmNlQ29tcGFyYXRvcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBWZWN0b3Igb3YgPSAoKERlbGVnYXRlZFJlc291cmNlQ29tcGFyYXRvcikgbykudjsKKyAgICAgICAgcmV0dXJuIHYgPT0gbnVsbCA/IG92ID09IG51bGwgOiB2LmVxdWFscyhvdik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFzaGNvZGUgYmFzZWQgb24gdGhlIHJ1bGVzIGZvciBlcXVhbGl0eS4KKyAgICAgKiBAcmV0dXJuIGEgaGFzaGNvZGUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHYgPT0gbnVsbCA/IDAgOiB2Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGludCByZXNvdXJjZUNvbXBhcmUoUmVzb3VyY2UgZm9vLCBSZXNvdXJjZSBiYXIpIHsKKyAgICAgICAgLy9pZiBubyBuZXN0ZWQsIG5hdHVyYWwgb3JkZXI6CisgICAgICAgIGlmICh2ID09IG51bGwgfHwgdi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmb28uY29tcGFyZVRvKGJhcik7CisgICAgICAgIH0KKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHYuaXRlcmF0b3IoKTsgcmVzdWx0ID09IDAgJiYgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKFJlc291cmNlQ29tcGFyYXRvcikgaS5uZXh0KCkpLnJlc291cmNlQ29tcGFyZShmb28sIGJhcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIHZlcnNpb24gZnJvbSBEYXRhVHlwZSB0byByZWN1cnNlIG9uIG5lc3RlZCBSZXNvdXJjZVNlbGVjdG9yCitzLgorICAgICAqIEBwYXJhbSBzdGsgdGhlIFN0YWNrIG9mIHJlZmVyZW5jZXMuCisgICAgICogQHBhcmFtIHAgICB0aGUgUHJvamVjdCB0byByZXNvbHZlIGFnYWluc3QuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrIHN0aywgUHJvamVjdCBwKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgc3VwZXIuZGllT25DaXJjdWxhclJlZmVyZW5jZShzdGssIHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEodiA9PSBudWxsIHx8IHYuaXNFbXB0eSgpKSkgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHYuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRGF0YVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ay5wdXNoKG8pOworICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjaygoRGF0YVR5cGUpIG8sIHN0aywgcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDaGVja2VkKHRydWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0V4aXN0cy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0V4aXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU4MzIxNTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvRXhpc3RzLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKKworLyoqCisgKiBDb21wYXJlcyBSZXNvdXJjZXMgYnkgZXhpc3RlbmNlLiAgTm90IGV4aXN0aW5nIGlzICJsZXNzIHRoYW4iIGV4aXN0aW5nLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEV4aXN0cyBleHRlbmRzIFJlc291cmNlQ29tcGFyYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBSZXNvdXJjZXMuCisgICAgICogQHBhcmFtIGZvbyB0aGUgZmlyc3QgUmVzb3VyY2UuCisgICAgICogQHBhcmFtIGJhciB0aGUgc2Vjb25kIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0CisgICAgICogICAgICAgICBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJlc291cmNlQ29tcGFyZShSZXNvdXJjZSBmb28sIFJlc291cmNlIGJhcikgeworICAgICAgICBib29sZWFuIGYgPSBmb28uaXNFeGlzdHMoKTsKKyAgICAgICAgaWYgKGYgPT0gYmFyLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmID8gMSA6IC0xOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0ZpbGVTeXN0ZW0uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9GaWxlU3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5YzdiNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9GaWxlU3lzdGVtLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBDb21wYXJlcyBmaWxlc3lzdGVtIFJlc291cmNlcy4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlU3lzdGVtIGV4dGVuZHMgUmVzb3VyY2VDb21wYXJhdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdHdvIFJlc291cmNlcy4KKyAgICAgKiBAcGFyYW0gZm9vIHRoZSBmaXJzdCBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYmFyIHRoZSBzZWNvbmQgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QKKyAgICAgKiAgICAgICAgIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIGVpdGhlciByZXNvdXJjZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgRmlsZVJlc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcmVzb3VyY2VDb21wYXJlKFJlc291cmNlIGZvbywgUmVzb3VyY2UgYmFyKSB7CisgICAgICAgIEZpbGUgZm9vZmlsZSA9ICgoRmlsZVJlc291cmNlKSBmb28pLmdldEZpbGUoKTsKKyAgICAgICAgRmlsZSBiYXJmaWxlID0gKChGaWxlUmVzb3VyY2UpIGJhcikuZ2V0RmlsZSgpOworICAgICAgICByZXR1cm4gZm9vZmlsZS5lcXVhbHMoYmFyZmlsZSkgPyAwCisgICAgICAgICAgICA6IEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChmb29maWxlLCBiYXJmaWxlKSA/IC0xCisgICAgICAgICAgICA6IEZJTEVfVVRJTFMubm9ybWFsaXplKGZvb2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLmNvbXBhcmVUbygKKyAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShiYXJmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvTmFtZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL05hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMDQ4YWMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL05hbWUuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworCisvKioKKyAqIENvbXBhcmVzIFJlc291cmNlcyBieSBuYW1lLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIE5hbWUgZXh0ZW5kcyBSZXNvdXJjZUNvbXBhcmF0b3IgeworICAgIC8qKgorICAgICAqIENvbXBhcmUgdHdvIFJlc291cmNlcy4KKyAgICAgKiBAcGFyYW0gZm9vIHRoZSBmaXJzdCBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gYmFyIHRoZSBzZWNvbmQgUmVzb3VyY2UuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QKKyAgICAgKiAgICAgICAgIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcmVzb3VyY2VDb21wYXJlKFJlc291cmNlIGZvbywgUmVzb3VyY2UgYmFyKSB7CisgICAgICAgIHJldHVybiBmb28uZ2V0TmFtZSgpLmNvbXBhcmVUbyhiYXIuZ2V0TmFtZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9SZXNvdXJjZUNvbXBhcmF0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9SZXNvdXJjZUNvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzNjMDg1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1Jlc291cmNlQ29tcGFyYXRvci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKKworLyoqCisgKiBBYnN0cmFjdCBSZXNvdXJjZSBDb21wYXJhdG9yLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlc291cmNlQ29tcGFyYXRvciBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgQ29tcGFyYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBvYmplY3RzLgorICAgICAqIEBwYXJhbSBmb28gdGhlIGZpcnN0IE9iamVjdC4KKyAgICAgKiBAcGFyYW0gYmFyIHRoZSBzZWNvbmQgT2JqZWN0LgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0CisgICAgICogICAgICAgICBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBlaXRoZXIgYXJndW1lbnQgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGNvbXBhcmUoT2JqZWN0IGZvbywgT2JqZWN0IGJhcikgeworICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CisgICAgICAgIFJlc291cmNlQ29tcGFyYXRvciBjID0KKyAgICAgICAgICAgIGlzUmVmZXJlbmNlKCkgPyAoUmVzb3VyY2VDb21wYXJhdG9yKSBnZXRDaGVja2VkUmVmKCkgOiB0aGlzOworICAgICAgICByZXR1cm4gYy5yZXNvdXJjZUNvbXBhcmUoKFJlc291cmNlKSBmb28sIChSZXNvdXJjZSkgYmFyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciBlcXVhbGl0eSB3aXRoIHRoaXMgUmVzb3VyY2VDb21wYXJhdG9yLgorICAgICAqIEBwYXJhbSBvIHRoZSBPYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIE9iamVjdCBlcXVhbHMgdGhpcyBvbmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLmVxdWFscyhvKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG8gPT0gdGhpcyB8fCBvLmdldENsYXNzKCkuZXF1YWxzKGdldENsYXNzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhc2hjb2RlIGJhc2VkIG9uIHRoZSBydWxlcyBmb3IgZXF1YWxpdHkuCisgICAgICogQHJldHVybiBhIGhhc2hjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0d28gUmVzb3VyY2VzLgorICAgICAqIEBwYXJhbSBmb28gdGhlIGZpcnN0IFJlc291cmNlLgorICAgICAqIEBwYXJhbSBiYXIgdGhlIHNlY29uZCBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdAorICAgICAqICAgICAgICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCByZXNvdXJjZUNvbXBhcmUoUmVzb3VyY2UgZm9vLCBSZXNvdXJjZSBiYXIpOworCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvUmV2ZXJzZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1JldmVyc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lN2MxZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1JldmVyc2UuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworCisvKioKKyAqIFJldmVyc2VzIGFub3RoZXIgUmVzb3VyY2VDb21wYXJhdG9yLiAgSWYgbm8gbmVzdGVkIFJlc291cmNlQ29tcGFyYXRvcgorICogaXMgc3VwcGxpZWQsIHRoZSBjb21wYXJlZCBSZXNvdXJjZXMnIG5hdHVyYWwgb3JkZXIgd2lsbCBiZSByZXZlcnNlZC4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBSZXZlcnNlIGV4dGVuZHMgUmVzb3VyY2VDb21wYXJhdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX05FU1RFRAorICAgICAgICA9ICJZb3UgbXVzdCBub3QgbmVzdCBtb3JlIHRoYW4gb25lIFJlc291cmNlQ29tcGFyYXRvciBmb3IgcmV2ZXJzYWwuIjsKKworICAgIHByaXZhdGUgUmVzb3VyY2VDb21wYXJhdG9yIG5lc3RlZDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFJldmVyc2UoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFJldmVyc2UsIHN1cHBseWluZyB0aGUgUmVzb3VyY2VDb21wYXJhdG9yIHRvIGJlIHJldmVyc2VkLgorICAgICAqIEBwYXJhbSBjIHRoZSBSZXNvdXJjZUNvbXBhcmF0b3IgdG8gcmV2ZXJzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmV2ZXJzZShSZXNvdXJjZUNvbXBhcmF0b3IgYykgeworICAgICAgICBhZGQoYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBSZXNvdXJjZUNvbXBhcmF0b3IgdG8gcmV2ZXJzZS4KKyAgICAgKiBAcGFyYW0gYyB0aGUgUmVzb3VyY2VDb21wYXJhdG9yIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb21wYXJhdG9yIGMpIHsKKyAgICAgICAgaWYgKG5lc3RlZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oT05FX05FU1RFRCk7CisgICAgICAgIH0KKyAgICAgICAgbmVzdGVkID0gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBSZXNvdXJjZXMuCisgICAgICogQHBhcmFtIGZvbyB0aGUgZmlyc3QgUmVzb3VyY2UuCisgICAgICogQHBhcmFtIGJhciB0aGUgc2Vjb25kIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0CisgICAgICogICAgICAgICBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4sIGVxdWFsIHRvLCBvciBsZXNzIHRoYW4gdGhlIHNlY29uZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJlc291cmNlQ29tcGFyZShSZXNvdXJjZSBmb28sIFJlc291cmNlIGJhcikgeworICAgICAgICByZXR1cm4gLTEgKiAobmVzdGVkID09IG51bGwKKyAgICAgICAgICAgID8gZm9vLmNvbXBhcmVUbyhiYXIpIDogbmVzdGVkLmNvbXBhcmUoZm9vLCBiYXIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9TaXplLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvU2l6ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2MDhhOTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvU2l6ZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CisKKy8qKgorICogQ29tcGFyZXMgUmVzb3VyY2VzIGJ5IHNpemUuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgU2l6ZSBleHRlbmRzIFJlc291cmNlQ29tcGFyYXRvciB7CisgICAgLyoqCisgICAgICogQ29tcGFyZSB0d28gUmVzb3VyY2VzLgorICAgICAqIEBwYXJhbSBmb28gdGhlIGZpcnN0IFJlc291cmNlLgorICAgICAqIEBwYXJhbSBiYXIgdGhlIHNlY29uZCBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdAorICAgICAqICAgICAgICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCByZXNvdXJjZUNvbXBhcmUoUmVzb3VyY2UgZm9vLCBSZXNvdXJjZSBiYXIpIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIChmb28uZ2V0U2l6ZSgpIC0gYmFyLmdldFNpemUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvVHlwZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzA4MmVmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1R5cGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworCisvKioKKyAqIENvbXBhcmVzIFJlc291cmNlcyBieSBpcy1kaXJlY3Rvcnkgc3RhdHVzLiAgQXMgYSBjb250YWluZXIKKyAqIG9mIGZpbGVzLCBhIGRpcmVjdG9yeSBpcyBkZWVtZWQgImdyZWF0ZXIiIHRoYW4gYSBmaWxlLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIFR5cGUgZXh0ZW5kcyBSZXNvdXJjZUNvbXBhcmF0b3IgeworCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0d28gUmVzb3VyY2VzLgorICAgICAqIEBwYXJhbSBmb28gdGhlIGZpcnN0IFJlc291cmNlLgorICAgICAqIEBwYXJhbSBiYXIgdGhlIHNlY29uZCBSZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdAorICAgICAqICAgICAgICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCByZXNvdXJjZUNvbXBhcmUoUmVzb3VyY2UgZm9vLCBSZXNvdXJjZSBiYXIpIHsKKyAgICAgICAgYm9vbGVhbiBmID0gZm9vLmlzRGlyZWN0b3J5KCk7CisgICAgICAgIGlmIChmID09IGJhci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZiA/IDEgOiAtMTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvQW5kLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0FuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkYmIyOTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0FuZC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworCisvKioKKyAqIEFuZCBSZXNvdXJjZVNlbGVjdG9yLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEFuZCBleHRlbmRzIFJlc291cmNlU2VsZWN0b3JDb250YWluZXIgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEFuZCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVzb3VyY2VTZWxlY3RvcltdIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5kKFJlc291cmNlU2VsZWN0b3JbXSByKSB7CisgICAgICAgIHN1cGVyKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgUmVzb3VyY2UgaXMgc2VsZWN0ZWQuCisgICAgICogQHBhcmFtIHIgdGhlIFJlc291cmNlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgUmVzb3VyY2Ugd2FzIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoUmVzb3VyY2UgcikgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZWxlY3RvcnMoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoISgoUmVzb3VyY2VTZWxlY3RvcikgaS5uZXh0KCkpLmlzU2VsZWN0ZWQocikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0NvbXBhcmUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvQ29tcGFyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZDdkMGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0NvbXBhcmUuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tcGFyaXNvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5RdWFudGlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzLlJlc291cmNlQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yOworCisvKioKKyAqIFJlc291cmNlU2VsZWN0b3IgdGhhdCBjb21wYXJlcyBhZ2FpbnN0ICJjb250cm9sIiBSZXNvdXJjZShzKQorICogdXNpbmcgUmVzb3VyY2VDb21wYXJhdG9ycy4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBDb21wYXJlIGV4dGVuZHMgRGF0YVR5cGUgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfQ09OVFJPTF9NRVNTQUdFCisgICAgICAgID0gIiB0aGUgPGNvbnRyb2w+IGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCBleGFjdGx5IG9uY2UuIjsKKworICAgIHByaXZhdGUgRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yIGNvbXAgPSBuZXcgRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yKCk7CisgICAgcHJpdmF0ZSBRdWFudGlmaWVyIGFnYWluc3QgPSBRdWFudGlmaWVyLkFMTDsKKworICAgIHByaXZhdGUgQ29tcGFyaXNvbiB3aGVuID0gQ29tcGFyaXNvbi5FUVVBTDsKKworICAgIHByaXZhdGUgVW5pb24gY29udHJvbDsKKworICAgIC8qKgorICAgICAqIEFkZCBhIFJlc291cmNlQ29tcGFyYXRvciB0byB0aGlzIENvbXBhcmUgc2VsZWN0b3IuCisgICAgICogSWYgbXVsdGlwbGUgUmVzb3VyY2VDb21wYXJhdG9ycyBhcmUgYWRkZWQsIHRoZXkgd2lsbCBiZSBwcm9jZXNzZWQgaW4gTElGTyBvcmRlci4KKyAgICAgKiBAcGFyYW0gYyB0aGUgUmVzb3VyY2VDb21wYXJhdG9yIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKFJlc291cmNlQ29tcGFyYXRvciBjKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGNvbXAuYWRkKGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcXVhbnRpZmllciB0byBiZSB1c2VkLiBEZWZhdWx0ICJhbGwiLgorICAgICAqIEBwYXJhbSBhZ2FpbnN0IHRoZSBRdWFudGlmaWVyIEVudW1lcmF0ZWRBdHRyaWJ1dGUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBZ2FpbnN0KFF1YW50aWZpZXIgYWdhaW5zdCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmFnYWluc3QgPSBhZ2FpbnN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcGFyaXNvbiB0byBiZSB1c2VkLiBEZWZhdWx0ICJlcXVhbCIuCisgICAgICogQHBhcmFtIHdoZW4gdGhlIENvbXBhcmlzb24gRW51bWVyYXRlZEF0dHJpYnV0ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFdoZW4oQ29tcGFyaXNvbiB3aGVuKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIHRoaXMud2hlbiA9IHdoZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBuZXN0ZWQgY29udHJvbCBlbGVtZW50LiBUaGVzZSBhcmUgdGhlCisgICAgICogcmVzb3VyY2VzIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgKiBAcmV0dXJuIFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFJlc291cmNlQ29sbGVjdGlvbiBjcmVhdGVDb250cm9sKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBvbmVDb250cm9sKCk7CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbCA9IG5ldyBVbmlvbigpOworICAgICAgICByZXR1cm4gY29udHJvbDsKKyAgICB9CisKKyAgICAvL2ltcGxlbWVudCBSZXNvdXJjZVNlbGVjdG9yOyBpbmhlcml0IGRvYworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2VsZWN0ZWQoUmVzb3VyY2UgcikgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2VTZWxlY3RvcikgZ2V0Q2hlY2tlZFJlZigpKS5pc1NlbGVjdGVkKHIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb250cm9sID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG9uZUNvbnRyb2woKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdCA9IDAsIGYgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29udHJvbC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAod2hlbi5ldmFsdWF0ZShjb21wLmNvbXBhcmUociwgKFJlc291cmNlKSBpdC5uZXh0KCkpKSkgeworICAgICAgICAgICAgICAgIHQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhZ2FpbnN0LmV2YWx1YXRlKHQsIGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgdmVyc2lvbiBmcm9tIERhdGFUeXBlCisgICAgICogdG8gcmVjdXJzZSBvbiBuZXN0ZWQgUmVzb3VyY2VDb21wYXJhdG9ycy4KKyAgICAgKiBAcGFyYW0gc3RrIHRoZSBzdGFjayBvZiBkYXRhIHR5cGVzIHRvIHVzZSAocmVjdXJzaXZlbHkpLgorICAgICAqIEBwYXJhbSBwICAgdGhlIHByb2plY3QgdG8gdXNlIHRvIGRlcmVmZXJlbmNlIHRoZSByZWZlcmVuY2VzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoU3RhY2sgc3RrLCBQcm9qZWN0IHApCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICBzdXBlci5kaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHN0aywgcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRGF0YVR5cGUuaW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjayhjb250cm9sLCBzdGssIHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGF0YVR5cGUuaW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjayhjb21wLCBzdGssIHApOworICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQnVpbGRFeGNlcHRpb24gb25lQ29udHJvbCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZEV4Y2VwdGlvbihzdXBlci50b1N0cmluZygpICsgT05FX0NPTlRST0xfTUVTU0FHRSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9EYXRlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTI4OTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9EYXRlLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczsKKworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuVGltZUNvbXBhcmlzb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogRGF0ZSBSZXNvdXJjZVNlbGVjdG9yLiAgQmFzZWQgb24gdGhlIGRhdGUgRmlsZVNlbGVjdG9yLCB3aXRoIHRoZSBtb3N0CisgKiBub3RhYmxlIGRpZmZlcmVuY2UgYmVpbmcgdGhlIGxhY2sgb2Ygc3VwcG9ydCBmb3IgdGhlIGluY2x1ZGVkaXJzIGF0dHJpYnV0ZS4KKyAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGVmZmVjdCBvZiBpbmNsdWRlRGlycyA9ICJmYWxzZSIgYmUgYWNoaWV2ZWQgZm9yCisgKiByZXNvdXJjZXMgYnkgZW5jbG9zaW5nIGEgImRpciIgVHlwZSBSZXNvdXJjZVNlbGVjdG9yIGFuZCBhIERhdGUKKyAqIFJlc291cmNlU2VsZWN0b3IgaW4gYW4gT3IgUmVzb3VyY2VTZWxlY3Rvci4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlIGltcGxlbWVudHMgUmVzb3VyY2VTZWxlY3RvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTExJU19PUl9EQVRFVElNRQorICAgICAgICA9ICJFaXRoZXIgdGhlIG1pbGxpcyBvciB0aGUgZGF0ZXRpbWUgYXR0cmlidXRlIG11c3QgYmUgc2V0LiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwcml2YXRlIExvbmcgbWlsbGlzID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBkYXRlVGltZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybiA9IG51bGw7CisgICAgcHJpdmF0ZSBUaW1lQ29tcGFyaXNvbiB3aGVuID0gVGltZUNvbXBhcmlzb24uRVFVQUw7CisgICAgcHJpdmF0ZSBsb25nIGdyYW51bGFyaXR5ID0gRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGF0ZS90aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwLgorICAgICAqIEBwYXJhbSBtIHRoZSBudW1iZXIgb2YgbWlsbGlzLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNaWxsaXMobG9uZyBtKSB7CisgICAgICAgIG1pbGxpcyA9IG5ldyBMb25nKG0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGF0ZS90aW1lIGluIG1zLgorICAgICAqIEByZXR1cm4gbG9uZyBudW1iZXIgb2YgbWlsbGlzIHNpbmNlIDE5NzAuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldE1pbGxpcygpIHsKKyAgICAgICAgcmV0dXJuIG1pbGxpcyA9PSBudWxsID8gLTFMIDogbWlsbGlzLmxvbmdWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGF0ZSBhbmQgdGltZSBhcyBhIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gcyB0aGUgZGF0ZSAmIHRpbWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREYXRlVGltZShTdHJpbmcgcykgeworICAgICAgICBkYXRlVGltZSA9IHM7CisgICAgICAgIG1pbGxpcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkYXRlICYgdGltZSBpbiBTdHJpbmcgZm9ybWF0LgorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50aW5nIGEgZGF0ZSAmIHRpbWUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGF0ZXRpbWUoKSB7CisgICAgICAgIHJldHVybiBkYXRlVGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdyYW51bGFyaXR5IHRvIHVzZSBmb3IgdGhpcyBSZXNvdXJjZVNlbGVjdG9yLgorICAgICAqIEBwYXJhbSBnIHRoZSB0aW1lc3RhbXAgZ3JhbnVsYXJpdHkuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEdyYW51bGFyaXR5KGxvbmcgZykgeworICAgICAgICBncmFudWxhcml0eSA9IGc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0aW1lc3RhbXAgZ3JhbnVsYXJpdHkgdXNlZCBieSB0aGlzIFJlc291cmNlU2VsZWN0b3IuCisgICAgICogQHJldHVybiB0aGUgbG9uZyBncmFudWxhcml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0R3JhbnVsYXJpdHkoKSB7CisgICAgICAgIHJldHVybiBncmFudWxhcml0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9wdGlvbmFsIHBhdHRlcm4gdG8gdXNlIHdpdGggdGhlIGRhdGV0aW1lIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gcCB0aGUgU2ltcGxlRGF0ZUZvcm1hdC1jb21wYXRpYmxlIHBhdHRlcm4gc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwKSB7CisgICAgICAgIHBhdHRlcm4gPSBwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGF0dGVybiBmb3IgdXNlIHdpdGggdGhlIGRhdGV0aW1lIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIGEgU2ltcGxlRGF0ZUZvcm1hdC1jb21wYXRpYmxlIHBhdHRlcm4gc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFBhdHRlcm4oKSB7CisgICAgICAgIHJldHVybiBwYXR0ZXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcGFyaXNvbiBtb2RlLgorICAgICAqIEBwYXJhbSBjIGEgVGltZUNvbXBhcmlzb24gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRXaGVuKFRpbWVDb21wYXJpc29uIGMpIHsKKyAgICAgICAgd2hlbiA9IGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb21wYXJpc29uIG1vZGUuCisgICAgICogQHJldHVybiBhIFRpbWVDb21wYXJpc29uIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFRpbWVDb21wYXJpc29uIGdldFdoZW4oKSB7CisgICAgICAgIHJldHVybiB3aGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgUmVzb3VyY2UgaXMgc2VsZWN0ZWQuCisgICAgICogQHBhcmFtIHIgdGhlIFJlc291cmNlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgUmVzb3VyY2Ugd2FzIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKKyAgICAgICAgaWYgKGRhdGVUaW1lID09IG51bGwgJiYgbWlsbGlzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihNSUxMSVNfT1JfREFURVRJTUUpOworICAgICAgICB9CisgICAgICAgIGlmIChtaWxsaXMgPT0gbnVsbCkgeworICAgICAgICAgICAgRGF0ZUZvcm1hdCBkZiA9ICgocGF0dGVybiA9PSBudWxsKQorICAgICAgICAgICAgICAgID8gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICBEYXRlRm9ybWF0LlNIT1JULCBEYXRlRm9ybWF0LlNIT1JULCBMb2NhbGUuVVMpCisgICAgICAgICAgICAgICAgOiBuZXcgU2ltcGxlRGF0ZUZvcm1hdChwYXR0ZXJuKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbSA9IGRmLnBhcnNlKGRhdGVUaW1lKS5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKG0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGF0ZSBvZiAiICsgZGF0ZVRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXN1bHRzIGluIG5lZ2F0aXZlIG1pbGxpc2Vjb25kcyB2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZWxhdGl2ZSB0byBlcG9jaCAoSmFudWFyeSAxLCAxOTcwLCAwMDowMDowMCBHTVQpLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRNaWxsaXMobSk7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGF0ZSBvZiAiICsgZGF0ZVRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBDYW5ub3QgYmUgcGFyc2VkIGNvcnJlY3RseS4gSXQgc2hvdWxkIGJlIGluIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAocGF0dGVybiA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA/ICIgTU0vREQvWVlZWSBISDpNTSBBTV9QTSIgOiBwYXR0ZXJuKSArICIgZm9ybWF0LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB3aGVuLmV2YWx1YXRlKHIuZ2V0TGFzdE1vZGlmaWVkKCksIG1pbGxpcy5sb25nVmFsdWUoKSwgZ3JhbnVsYXJpdHkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9FeGlzdHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvRXhpc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWI0OThiYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvRXhpc3RzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CisKKy8qKgorICogRXhpc3RzIFJlc291cmNlU2VsZWN0b3IuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgRXhpc3RzIGltcGxlbWVudHMgUmVzb3VyY2VTZWxlY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIGlzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSByIHRoZSBSZXNvdXJjZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFJlc291cmNlIHdhcyBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKKyAgICAgICAgcmV0dXJuIHIuaXNFeGlzdHMoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvSW5zdGFuY2VPZi5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9JbnN0YW5jZU9mLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWU3YjE2YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvSW5zdGFuY2VPZi5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Db21wb25lbnRIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50VHlwZURlZmluaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CisKKy8qKgorICogSW5zdGFuY2VPZiBSZXNvdXJjZVNlbGVjdG9yLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIEluc3RhbmNlT2YgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX09OTFkgPSAiRXhhY3RseSBvbmUgb2YgY2xhc3N8dHlwZSBtdXN0IGJlIHNldC4iOworCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisgICAgcHJpdmF0ZSBDbGFzcyBjbGF6ejsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlOworICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgUHJvamVjdCBpbnN0YW5jZSBmb3IgdGhpcyBJbnN0YW5jZU9mIHNlbGVjdG9yLgorICAgICAqIEBwYXJhbSBwIHRoZSBQcm9qZWN0IGluc3RhbmNlIHVzZWQgZm9yIHR5cGUgY29tcGFyaXNvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHApIHsKKyAgICAgICAgcHJvamVjdCA9IHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzcyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICogQHBhcmFtIGMgdGhlIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzKENsYXNzIGMpIHsKKyAgICAgICAgaWYgKGNsYXp6ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGNsYXNzIGF0dHJpYnV0ZSBoYXMgYWxyZWFkeSBiZWVuIHNldC4iKTsKKyAgICAgICAgfQorICAgICAgICBjbGF6eiA9IGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBBbnQgdHlwZSB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICogQHBhcmFtIHMgdGhlIHR5cGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBzKSB7CisgICAgICAgIHR5cGUgPSBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVVJJIGluIHdoaWNoIHRoZSBBbnQgdHlwZSwgaWYgc3BlY2lmaWVkLCBzaG91bGQgYmUgZGVmaW5lZC4KKyAgICAgKiBAcGFyYW0gdSB0aGUgVVJJLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdSkgeworICAgICAgICB1cmkgPSB1OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29tcGFyaXNvbiBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBDbGFzcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldENoZWNrQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBjbGF6ejsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbXBhcmlzb24gdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgdHlwZW5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUncyBVUkkuCisgICAgICogQHJldHVybiB0aGUgU3RyaW5nIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIGlzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSByIHRoZSBSZXNvdXJjZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFJlc291cmNlIHdhcyBzZWxlY3RlZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKKyAgICAgICAgaWYgKChjbGF6eiA9PSBudWxsKSA9PSAodHlwZSA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKE9ORV9PTkxZKTsKKyAgICAgICAgfQorICAgICAgICBDbGFzcyBjID0gY2xheno7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJObyBwcm9qZWN0IHNldCBmb3IgSW5zdGFuY2VPZiBSZXNvdXJjZVNlbGVjdG9yOyAiCisgICAgICAgICAgICAgICAgICAgICsgInRoZSB0eXBlIGF0dHJpYnV0ZSBpcyBpbnZhbGlkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQW50VHlwZURlZmluaXRpb24gZCA9IENvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRIZWxwZXIoCisgICAgICAgICAgICAgICAgcHJvamVjdCkuZ2V0RGVmaW5pdGlvbihQcm9qZWN0SGVscGVyLmdlbkNvbXBvbmVudE5hbWUodXJpLCB0eXBlKSk7CisgICAgICAgICAgICBpZiAoZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0eXBlICIgKyB0eXBlICsgIiBub3QgZm91bmQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGMgPSBkLmlubmVyR2V0VHlwZUNsYXNzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGMuaXNBc3NpZ25hYmxlRnJvbShyLmdldENsYXNzKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9NYWpvcml0eS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9NYWpvcml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkyYjBkMjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL01ham9yaXR5LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CisKKy8qKgorICogTWFqb3JpdHkgUmVzb3VyY2VTZWxlY3Rvci4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBNYWpvcml0eQorICAgIGV4dGVuZHMgUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lciBpbXBsZW1lbnRzIFJlc291cmNlU2VsZWN0b3IgeworCisgICAgcHJpdmF0ZSBib29sZWFuIHRpZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBNYWpvcml0eSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVzb3VyY2VTZWxlY3RvcltdIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFqb3JpdHkoUmVzb3VyY2VTZWxlY3RvcltdIHIpIHsKKyAgICAgICAgc3VwZXIocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGllcyBhcmUgYWxsb3dlZC4KKyAgICAgKiBAcGFyYW0gYiB3aGV0aGVyIGEgdGllIGlzIGEgcGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0QWxsb3d0aWUoYm9vbGVhbiBiKSB7CisgICAgICAgIHRpZSA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBSZXNvdXJjZSBpcyBzZWxlY3RlZC4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVzb3VyY2UgdG8gY2hlY2suCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBSZXNvdXJjZSB3YXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2VsZWN0ZWQoUmVzb3VyY2UgcikgeworICAgICAgICBpbnQgcGFzc2VkID0gMDsKKyAgICAgICAgaW50IGZhaWxlZCA9IDA7CisgICAgICAgIGludCBjb3VudCA9IHNlbGVjdG9yQ291bnQoKTsKKyAgICAgICAgYm9vbGVhbiBldmVuID0gY291bnQgJSAyID09IDA7CisgICAgICAgIGludCB0aHJlc2hvbGQgPSBjb3VudCAvIDI7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0U2VsZWN0b3JzKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaWYgKCgoUmVzb3VyY2VTZWxlY3RvcikgaS5uZXh0KCkpLmlzU2VsZWN0ZWQocikpIHsKKyAgICAgICAgICAgICAgICArK3Bhc3NlZDsKKyAgICAgICAgICAgICAgICBpZiAocGFzc2VkID4gdGhyZXNob2xkIHx8IChldmVuICYmIHRpZSAmJiBwYXNzZWQgPT0gdGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrZmFpbGVkOworICAgICAgICAgICAgICAgIGlmIChmYWlsZWQgPiB0aHJlc2hvbGQgfHwgKGV2ZW4gJiYgIXRpZSAmJiBmYWlsZWQgPT0gdGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vZHVtbXkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9OYW1lLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL05hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMDcxN2NiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9OYW1lLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNlbGVjdG9yVXRpbHM7CisKKy8qKgorICogTmFtZSBSZXNvdXJjZVNlbGVjdG9yLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIE5hbWUgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKKyAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuOworICAgIHByaXZhdGUgYm9vbGVhbiBjcyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdHRlcm4gdG8gY29tcGFyZSBuYW1lcyBhZ2FpbnN0LgorICAgICAqIEBwYXJhbSBuIHRoZSBwYXR0ZXJuIFN0cmluZyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbikgeworICAgICAgICBwYXR0ZXJuID0gbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBhdHRlcm4gdXNlZCBieSB0aGlzIE5hbWUgUmVzb3VyY2VTZWxlY3Rvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgc2VsZWN0aW9uIHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gcGF0dGVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGUgbmFtZSBjb21wYXJpc29ucyBhcmUgY2FzZS1zZW5zaXRpdmUuCisgICAgICogQHBhcmFtIGIgYm9vbGVhbiBjYXNlLXNlbnNpdGl2aXR5IGZsYWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIGIpIHsKKyAgICAgICAgY3MgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlYXJuIHdoZXRoZXIgdGhpcyBOYW1lIFJlc291cmNlU2VsZWN0b3IgaXMgY2FzZS1zZW5zaXRpdmUuCisgICAgICogQHJldHVybiBib29sZWFuIGNhc2Utc2Vuc2l0aXZpdHkgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7CisgICAgICAgIHJldHVybiBjczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIGlzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSByIHRoZSBSZXNvdXJjZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFJlc291cmNlIHdhcyBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKKyAgICAgICAgU3RyaW5nIG4gPSByLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKFNlbGVjdG9yVXRpbHMubWF0Y2gocGF0dGVybiwgbiwgY3MpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcyA9IHIudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHMuZXF1YWxzKG4pID8gZmFsc2UgOiBTZWxlY3RvclV0aWxzLm1hdGNoKHBhdHRlcm4sIHMsIGNzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvTm9uZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Ob25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTZhMWI2MgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvTm9uZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworCisvKioKKyAqIE5vbmUgUmVzb3VyY2VTZWxlY3Rvci4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBOb25lCisgICAgZXh0ZW5kcyBSZXNvdXJjZVNlbGVjdG9yQ29udGFpbmVyIGltcGxlbWVudHMgUmVzb3VyY2VTZWxlY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBOb25lKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yLgorICAgICAqIEBwYXJhbSByIHRoZSBSZXNvdXJjZVNlbGVjdG9yW10gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyBOb25lKFJlc291cmNlU2VsZWN0b3JbXSByKSB7CisgICAgICAgIHN1cGVyKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgUmVzb3VyY2UgaXMgc2VsZWN0ZWQuCisgICAgICogQHBhcmFtIHIgdGhlIFJlc291cmNlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgUmVzb3VyY2Ugd2FzIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoUmVzb3VyY2UgcikgeworICAgICAgICBib29sZWFuIG5vbmUgPSB0cnVlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZWxlY3RvcnMoKTsgbm9uZSAmJiBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIG5vbmUgPSAhKChSZXNvdXJjZVNlbGVjdG9yKSBpLm5leHQoKSkuaXNTZWxlY3RlZChyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9uZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvTm90LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL05vdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjNjdkYTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL05vdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworCisvKioKKyAqIE5vdCBSZXNvdXJjZVNlbGVjdG9yLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIE5vdCBpbXBsZW1lbnRzIFJlc291cmNlU2VsZWN0b3IgeworCisgICAgcHJpdmF0ZSBSZXNvdXJjZVNlbGVjdG9yIHNlbDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIE5vdCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiBAcGFyYW0gcyB0aGUgUmVzb3VyY2VTZWxlY3RvciB0byBuZWdhdGUuCisgICAgICovCisgICAgcHVibGljIE5vdChSZXNvdXJjZVNlbGVjdG9yIHMpIHsKKyAgICAgICAgYWRkKHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgUmVzb3VyY2VTZWxlY3Rvci4KKyAgICAgKiBAcGFyYW0gcyB0aGUgUmVzb3VyY2VTZWxlY3RvciB0byBuZWdhdGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYWxyZWFkeSBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKFJlc291cmNlU2VsZWN0b3IgcykgeworICAgICAgICBpZiAoc2VsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSBOb3QgUmVzb3VyY2VTZWxlY3RvciBhY2NlcHRzIGEgc2luZ2xlIG5lc3RlZCBSZXNvdXJjZVNlbGVjdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgc2VsID0gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIGlzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSByIHRoZSBSZXNvdXJjZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFJlc291cmNlIHdhcyBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKKyAgICAgICAgcmV0dXJuICEoc2VsLmlzU2VsZWN0ZWQocikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Pci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Pci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxNDM4YzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL09yLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CisKKy8qKgorICogT3IgUmVzb3VyY2VTZWxlY3Rvci4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBPciBleHRlbmRzIFJlc291cmNlU2VsZWN0b3JDb250YWluZXIgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIE9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yLgorICAgICAqIEBwYXJhbSByIHRoZSBSZXNvdXJjZVNlbGVjdG9yW10gdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyBPcihSZXNvdXJjZVNlbGVjdG9yW10gcikgeworICAgICAgICBzdXBlcihyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIGlzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSByIHRoZSBSZXNvdXJjZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFJlc291cmNlIHdhcyBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0U2VsZWN0b3JzKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaWYgKCgoUmVzb3VyY2VTZWxlY3RvcikgaS5uZXh0KCkpLmlzU2VsZWN0ZWQocikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL1Jlc291cmNlU2VsZWN0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvUmVzb3VyY2VTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3MTUxZWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL1Jlc291cmNlU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGEgUmVzb3VyY2Ugc2VsZWN0b3IuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlU2VsZWN0b3IgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBSZXNvdXJjZSBpcyBzZWxlY3RlZC4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVzb3VyY2UgdG8gY2hlY2suCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBSZXNvdXJjZSB3YXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpOworCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL1Jlc291cmNlU2VsZWN0b3JDb250YWluZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1OGZiYzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL1Jlc291cmNlU2VsZWN0b3JDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGU7CisKKy8qKgorICogUmVzb3VyY2VTZWxlY3RvciBjb250YWluZXIuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lciBleHRlbmRzIERhdGFUeXBlIHsKKworICAgIHByaXZhdGUgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZVNlbGVjdG9yQ29udGFpbmVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBSZXNvdXJjZVNlbGVjdG9yQ29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBhcnJheSBvZiBzZWxlY3RvcnMuCisgICAgICogQHBhcmFtIHIgdGhlIFJlc291cmNlU2VsZWN0b3JbXSB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlU2VsZWN0b3JDb250YWluZXIoUmVzb3VyY2VTZWxlY3RvcltdIHIpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGQocltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBSZXNvdXJjZVNlbGVjdG9yIHRvIHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHMgdGhlIFJlc291cmNlU2VsZWN0b3IgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZVNlbGVjdG9yIHMpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHYuYWRkKHMpOworICAgICAgICBzZXRDaGVja2VkKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWFybiB3aGV0aGVyIHRoaXMgUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lciBoYXMgc2VsZWN0b3JzLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgc2VsZWN0b3JzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1NlbGVjdG9ycygpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlU2VsZWN0b3JDb250YWluZXIpIGdldENoZWNrZWRSZWYoKSkuaGFzU2VsZWN0b3JzKCk7CisgICAgICAgIH0KKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICByZXR1cm4gIXYuaXNFbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY291bnQgb2YgbmVzdGVkIHNlbGVjdG9ycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBzZWxlY3RvciBjb3VudCBhcyBpbnQuCisgICAgICovCisgICAgcHVibGljIGludCBzZWxlY3RvckNvdW50KCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lcikgZ2V0Q2hlY2tlZFJlZigpKS5zZWxlY3RvckNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOworICAgICAgICByZXR1cm4gdi5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEl0ZXJhdG9yIG92ZXIgdGhlIG5lc3RlZCBzZWxlY3RvcnMuCisgICAgICogQHJldHVybiBJdGVyYXRvciBvZiBSZXNvdXJjZVNlbGVjdG9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0U2VsZWN0b3JzKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lcikgZ2V0Q2hlY2tlZFJlZigpKS5nZXRTZWxlY3RvcnMoKTsKKyAgICAgICAgfQorICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHYpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHRoZSB2ZXJzaW9uIGZyb20gRGF0YVR5cGUgdG8gcmVjdXJzZSBvbiBuZXN0ZWQgUmVzb3VyY2VTZWxlY3RvcnMuCisgICAgICogQHBhcmFtIHN0ayB0aGUgU3RhY2sgb2YgcmVmZXJlbmNlcy4KKyAgICAgKiBAcGFyYW0gcCAgIHRoZSBQcm9qZWN0IHRvIHJlc29sdmUgYWdhaW5zdC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoU3RhY2sgc3RrLCBQcm9qZWN0IHApCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICBzdXBlci5kaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHN0aywgcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB2Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEYXRhVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBzdGsucHVzaChvKTsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjaygoRGF0YVR5cGUpIG8sIHN0aywgcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9TaXplLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL1NpemUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMzA5ZDdlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9TaXplLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tcGFyaXNvbjsKKworLyoqCisgKiBTaXplIFJlc291cmNlU2VsZWN0b3IuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgU2l6ZSBpbXBsZW1lbnRzIFJlc291cmNlU2VsZWN0b3IgeworICAgIHByaXZhdGUgbG9uZyBzaXplID0gLTE7CisgICAgcHJpdmF0ZSBDb21wYXJpc29uIHdoZW4gPSBDb21wYXJpc29uLkVRVUFMOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzaXplIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgKiBAcGFyYW0gbCB0aGUgbG9uZyByZXNvdXJjZSBzaXplLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNpemUobG9uZyBsKSB7CisgICAgICAgIHNpemUgPSBsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2l6ZSBjb21wYXJlZCB0byBieSB0aGlzIFNpemUgUmVzb3VyY2VTZWxlY3Rvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb25nIHJlc291cmNlIHNpemUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21wYXJpc29uIG1vZGUuCisgICAgICogQHBhcmFtIGMgYSBDb21wYXJpc29uIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaGVuKENvbXBhcmlzb24gYykgeworICAgICAgICB3aGVuID0gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbXBhcmlzb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIGEgQ29tcGFyaXNvbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIENvbXBhcmlzb24gZ2V0V2hlbigpIHsKKyAgICAgICAgcmV0dXJuIHdoZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBSZXNvdXJjZSBpcyBzZWxlY3RlZC4KKyAgICAgKiBAcGFyYW0gciB0aGUgUmVzb3VyY2UgdG8gY2hlY2suCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBSZXNvdXJjZSB3YXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChSZXNvdXJjZSByKSB7CisgICAgICAgIGxvbmcgZGlmZiA9IHIuZ2V0U2l6ZSgpIC0gc2l6ZTsKKyAgICAgICAgcmV0dXJuIHdoZW4uZXZhbHVhdGUoZGlmZiA9PSAwID8gMCA6IChpbnQpIChkaWZmIC8gTWF0aC5hYnMoZGlmZikpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvVHlwZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmZiNjEzMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworCisvKioKKyAqIFR5cGUgZmlsZS9kaXIgUmVzb3VyY2VTZWxlY3Rvci4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlIGltcGxlbWVudHMgUmVzb3VyY2VTZWxlY3RvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9BVFRSID0gImZpbGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfQVRUUiA9ICJkaXIiOworCisgICAgLyoqIFN0YXRpYyBmaWxlIHR5cGUgc2VsZWN0b3IuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIEZJTEUgPSBuZXcgVHlwZShuZXcgRmlsZURpcihGSUxFX0FUVFIpKTsKKworICAgIC8qKiBTdGF0aWMgZGlyIHR5cGUgc2VsZWN0b3IuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIERJUiA9IG5ldyBUeXBlKG5ldyBGaWxlRGlyKERJUl9BVFRSKSk7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIHRoZSB0eXBlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVEaXIgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVTID0gbmV3IFN0cmluZ1tdIHtGSUxFX0FUVFIsIERJUl9BVFRSfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGaWxlRGlyKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIFN0cmluZyBFbnVtZXJhdGVkQXR0cmlidXRlIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZpbGVEaXIoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBwb3NzaWJsZSB2YWx1ZXMuCisgICAgICAgICAqIEByZXR1cm4gYSBTdHJpbmcgYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIFZBTFVFUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRmlsZURpciB0eXBlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFR5cGUoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIGZkIHRoZSBGaWxlRGlyIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFR5cGUoRmlsZURpciBmZCkgeworICAgICAgICBzZXRUeXBlKGZkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdHlwZTsgZmlsZXxkaXIuCisgICAgICogQHBhcmFtIGZkIGEgRmlsZURpciBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShGaWxlRGlyIGZkKSB7CisgICAgICAgIHR5cGUgPSBmZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFJlc291cmNlIGlzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSByIHRoZSBSZXNvdXJjZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFJlc291cmNlIHdhcyBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgdHlwZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IGkgPSB0eXBlLmdldEluZGV4KCk7CisgICAgICAgIHJldHVybiByLmlzRGlyZWN0b3J5KCkgPyBpID09IDEgOiBpID09IDA7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQWJzdHJhY3RTZWxlY3RvckNvbnRhaW5lci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Fic3RyYWN0U2VsZWN0b3JDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE4MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Fic3RyYWN0U2VsZWN0b3JDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGEgYmFzZSBjbGFzcyBhIGNvbnRhaW5lciBvZiBzZWxlY3RvcnMgLSBpdCBkb2VzCisgKiBub3QgbmVlZCBkbyBiZSBhIHNlbGVjdG9yIGl0c2VsZi4KKyAqCisgKiBAc2luY2UgMS43CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdG9yQ29udGFpbmVyIGV4dGVuZHMgRGF0YVR5cGUKKyAgICAgICAgaW1wbGVtZW50cyBTZWxlY3RvckNvbnRhaW5lciB7CisKKyAgICBwcml2YXRlIFZlY3RvciBzZWxlY3RvcnNMaXN0ID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzZWxlY3RvcnMgaGVyZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIHNlbGVjdG9ycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1NlbGVjdG9ycygpIHsKKyAgICAgICAgcmV0dXJuICEoc2VsZWN0b3JzTGlzdC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lcgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzZWxlY3RvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNlbGVjdG9yQ291bnQoKSB7CisgICAgICAgIHJldHVybiBzZWxlY3RvcnNMaXN0LnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc2VsZWN0b3JzIGFzIGFuIGFycmF5LgorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNlbGVjdG9ycworICAgICAqLworICAgIHB1YmxpYyBGaWxlU2VsZWN0b3JbXSBnZXRTZWxlY3RvcnMoUHJvamVjdCBwKSB7CisgICAgICAgIEZpbGVTZWxlY3RvcltdIHJlc3VsdCA9IG5ldyBGaWxlU2VsZWN0b3Jbc2VsZWN0b3JzTGlzdC5zaXplKCldOworICAgICAgICBzZWxlY3RvcnNMaXN0LmNvcHlJbnRvKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdG9yIGZvciBhY2Nlc3NpbmcgdGhlIHNldCBvZiBzZWxlY3RvcnMuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdG9yIGZvciB0aGUgc2VsZWN0b3JzCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIHNlbGVjdG9yRWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBzZWxlY3RvcnNMaXN0LmVsZW1lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgU2VsZWN0b3JzIHdpdGhpbiB0aGlzIGNvbnRhaW5lciB0byBhIHN0cmluZy4gVGhpcyB3aWxsCisgICAgICoganVzdCBiZSBhIGhlbHBlciBjbGFzcyBmb3IgdGhlIHN1YmNsYXNzZXMgdGhhdCBwdXQgdGhlaXIgb3duIG5hbWUKKyAgICAgKiBhcm91bmQgdGhlIGNvbnRlbnRzIGxpc3RlZCBoZXJlLgorICAgICAqCisgICAgICogQHJldHVybiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBTZWxlY3RvcnMgY29udGFpbmVkIGluIHRoaXMgb25lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHNlbGVjdG9yRWxlbWVudHMoKTsKKyAgICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChlLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHNlbGVjdG9yIGludG8gdGhpcyBjb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIG5ldyBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRTZWxlY3RvcihGaWxlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgc2VsZWN0b3JzTGlzdC5hZGRFbGVtZW50KHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHZhbGlkYXRlcyBlYWNoIGNvbnRhaW5lZCBzZWxlY3RvcgorICAgICAqIHByb3ZpZGVkIHRoYXQgdGhlIHNlbGVjdG9yIGltcGxlbWVudHMgdGhlIHZhbGlkYXRlIGludGVyZmFjZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+T3JkaW5hcmlseSwgdGhpcyB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgZWxlbWVudHMgb2YgYSBzZWxlY3RvcgorICAgICAqIGNvbnRhaW5lciBldmVuIGlmIHRoZSBpc1NlbGVjdGVkKCkgbWV0aG9kIG9mIHNvbWUgZWxlbWVudHMgaXMKKyAgICAgKiBuZXZlciBjYWxsZWQuIFRoaXMgaGFzIHR3byBlZmZlY3RzOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlZhbGlkYXRpb24gd2lsbCBvZnRlbiBvY2N1ciB0d2ljZS4KKyAgICAgKiA8bGk+U2luY2UgaXQgaXMgbm90IHJlcXVpcmVkIHRoYXQgc2VsZWN0b3JzIGRlcml2ZSBmcm9tCisgICAgICogQmFzZVNlbGVjdG9yLCB0aGVyZSBjb3VsZCBiZSBzZWxlY3RvcnMgaW4gdGhlIGNvbnRhaW5lciB3aG9zZQorICAgICAqIGVycm9yIGNvbmRpdGlvbnMgYXJlIG5vdCBkZXRlY3RlZCBpZiB0aGVpciBpc1NlbGVjdGVkKCkgY2FsbAorICAgICAqIGlzIG5ldmVyIG1hZGUuCisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHNlbGVjdG9yRWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBCYXNlU2VsZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAoKEJhc2VTZWxlY3RvcikgbykudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogTWV0aG9kcyBiZWxvdyBhbGwgYWRkIHNwZWNpZmljIHNlbGVjdG9ycyAqLworCisgICAgLyoqCisgICAgICogYWRkIGEgIlNlbGVjdCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdG9yKFNlbGVjdFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW4gIkFuZCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFuZChBbmRTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGFuICJPciIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9yKE9yU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhICJOb3QiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGROb3QoTm90U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhICJOb25lIiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTm9uZShOb25lU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG1ham9yaXR5IHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNYWpvcml0eShNYWpvcml0eVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBzZWxlY3RvciBkYXRlIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREYXRlKERhdGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgc2VsZWN0b3Igc2l6ZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2l6ZShTaXplU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIHNlbGVjdG9yIGZpbGVuYW1lIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlbmFtZShGaWxlbmFtZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW4gZXh0ZW5kZWQgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEN1c3RvbShFeHRlbmRTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgY29udGFpbnMgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnRhaW5zKENvbnRhaW5zU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIHByZXNlbnQgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByZXNlbnQoUHJlc2VudFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBkZXB0aCBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVwdGgoRGVwdGhTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgZGVwZW5kcyBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVwZW5kKERlcGVuZFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRzIGEgZGlmZmVyZW50IHNlbGVjdG9yIHRvIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREaWZmZXJlbnQoRGlmZmVyZW50U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZHMgYSB0eXBlIHNlbGVjdG9yIHRvIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUeXBlKFR5cGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgcmVndWxhciBleHByZXNzaW9uIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb250YWluc1JlZ2V4cChDb250YWluc1JlZ2V4cFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgdGhlIG1vZGlmaWVkIHNlbGVjdG9yCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKiBAc2luY2UgYW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1vZGlmaWVkKE1vZGlmaWVkU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbiBhcmJpdGFyeSBzZWxlY3RvcgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9BbmRTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0FuZFNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4NDllMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9BbmRTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCisvKioKKyAqIFRoaXMgc2VsZWN0b3IgaGFzIGEgY29sbGVjdGlvbiBvZiBvdGhlciBzZWxlY3RvcnMsIGFsbCBvZiB3aGljaCBoYXZlIHRvCisgKiBzZWxlY3QgYSBmaWxlIGluIG9yZGVyIGZvciB0aGlzIHNlbGVjdG9yIHRvIHNlbGVjdCBpdC4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBBbmRTZWxlY3RvciBleHRlbmRzIEJhc2VTZWxlY3RvckNvbnRhaW5lciB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBBbmRTZWxlY3RvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWxlY3RvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChoYXNTZWxlY3RvcnMoKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgie2FuZHNlbGVjdDogIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgKHRoZSBmaWxlIGlzIHNlbGVjdGVkKSBvbmx5IGlmIGFsbCBvdGhlciBzZWxlY3RvcnMKKyAgICAgKiBhZ3JlZSB0aGF0IHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlZGlyIHRoZSBiYXNlIGRpcmVjdG9yeSB0aGUgc2NhbiBpcyBiZWluZyBkb25lIGZyb20KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY2hlY2sKKyAgICAgKiBAcGFyYW0gZmlsZSBhIGphdmEuaW8uRmlsZSBvYmplY3QgZm9yIHRoZSBmaWxlbmFtZSB0aGF0IHRoZSBzZWxlY3RvcgorICAgICAqIGNhbiB1c2UKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlIHNlbGVjdGVkIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgeworICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gc2VsZWN0b3JFbGVtZW50cygpOworICAgICAgICBib29sZWFuIHJlc3VsdDsKKworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gKChGaWxlU2VsZWN0b3IpIGUubmV4dEVsZW1lbnQoKSkuaXNTZWxlY3RlZChiYXNlZGlyLAorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VFeHRlbmRTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VFeHRlbmRTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxN2NhMDIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZUV4dGVuZFNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CisKKy8qKgorICogQ29udmVuaWVuY2UgYmFzZSBjbGFzcyBmb3IgYWxsIHNlbGVjdG9ycyBhY2Nlc3NlZCB0aHJvdWdoIEV4dGVuZFNlbGVjdG9yLgorICogSXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgZ2F0aGVyaW5nIHRoZSBwYXJhbWV0ZXJzIHRvZ2V0aGVyIGFzIHdlbGwgYXMgZm9yCisgKiBhc3NpZ25pbmcgYW4gZXJyb3IgbWVzc2FnZSBhbmQgdGhyb3dpbmcgYSBidWlsZCBleGNlcHRpb24gaWYgYW4gZXJyb3IgaXMKKyAqIGRldGVjdGVkLgorICoKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFeHRlbmRTZWxlY3RvcgorICAgICAgICBleHRlbmRzIEJhc2VTZWxlY3RvcgorICAgICAgICBpbXBsZW1lbnRzIEV4dGVuZEZpbGVTZWxlY3RvciB7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgLyoqIFRoZSBwYXNzZWQgaW4gcGFyYW1ldGVyIGFycmF5LiAqLworICAgIHByb3RlY3RlZCBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gbnVsbDsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCYXNlRXh0ZW5kU2VsZWN0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFsbCB0aGUgUGFyYW1ldGVycyBmb3IgdGhpcyBjdXN0b20gc2VsZWN0b3IsIGNvbGxlY3RlZCBieQorICAgICAqIHRoZSBFeHRlbmRTZWxlY3RvciBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBjb21wbGV0ZSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhpcyBzZWxlY3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyBhY2Nlc3MgdG8gdGhlIHBhcmFtZXRlcnMgZ2F0aGVyZWQgYW5kIHNldCB3aXRoaW4gdGhlCisgICAgICogJmx0O2N1c3RvbSZndDsgdGFnLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIHBhcmFtZXRlcnMgZGVmaW5lZCBmb3IgdGhpcyBzZWxlY3RvcgorICAgICAqLworICAgIHByb3RlY3RlZCBQYXJhbWV0ZXJbXSBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdGhhdCBlYWNoIHNlbGVjdG9yIHdpbGwgaW1wbGVtZW50IHRvIGNyZWF0ZSB0aGVpcgorICAgICAqIHNlbGVjdGlvbiBiZWhhdmlvdXIuIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBzZXR1cAorICAgICAqIG9mIGEgc2VsZWN0b3IsIGl0IGNhbiB0aHJvdyBhIEJ1aWxkRXhjZXB0aW9uIHRvIGluZGljYXRlCisgICAgICogdGhlIHByb2JsZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciBBIGphdmEuaW8uRmlsZSBvYmplY3QgZm9yIHRoZSBiYXNlIGRpcmVjdG9yeQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBmaWxlIEEgRmlsZSBvYmplY3QgZm9yIHRoaXMgZmlsZW5hbWUKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlIHNlbGVjdGVkIG9yIG5vdAorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZVNlbGVjdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZVNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlZWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9CYXNlU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRhdGFUeXBlOworCisvKioKKyAqIEEgY29udmVuaWVuY2UgYmFzZSBjbGFzcyB0aGF0IHlvdSBjYW4gc3ViY2xhc3MgU2VsZWN0b3JzIGZyb20uIEl0CisgKiBwcm92aWRlcyBzb21lIGhlbHBmdWwgY29tbW9uIGJlaGF2aW91ci4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIG5lZWQKKyAqIGZvciBTZWxlY3RvcnMgdG8gaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MsIGl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQKKyAqIHRoZXkgaW1wbGVtZW50IEZpbGVTZWxlY3Rvci4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2VsZWN0b3IgZXh0ZW5kcyBEYXRhVHlwZSBpbXBsZW1lbnRzIEZpbGVTZWxlY3RvciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBlcnJtc2cgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEbyBub3RoaW5nIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCYXNlU2VsZWN0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGFsbCBzZWxlY3RvcnMgdG8gaW5kaWNhdGUgYSBzZXR1cCBlcnJvci4gTm90ZSB0aGF0IG9ubHkKKyAgICAgKiB0aGUgZmlyc3QgZXJyb3IgbWVzc2FnZSBpcyByZWNvcmRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgVGhlIGVycm9yIG1lc3NhZ2UgYW55IEJ1aWxkRXhjZXB0aW9uIHNob3VsZCB0aHJvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvcihTdHJpbmcgbXNnKSB7CisgICAgICAgIGlmIChlcnJtc2cgPT0gbnVsbCkgeworICAgICAgICAgICAgZXJybXNnID0gbXNnOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZXJyb3IgY29uZGl0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIGVycm1zZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIDxwPlN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgY2hlY2tpbmcgb2YgdGhlaXIKKyAgICAgKiBzdGF0ZS4gU28gbG9uZyBhcyB0aGV5IGNhbGwgdmFsaWRhdGUoKSBmcm9tIGlzU2VsZWN0ZWQoKSwgdGhpcyB3aWxsCisgICAgICogYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgKHVubGVzcyB0aGV5IG92ZXJyaWRlIHZhbGlkYXRlKCkpLjwvcD4KKyAgICAgKiA8cD5JbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGNoZWNrIGZvciBpbmNvcnJlY3Qgc2V0dGluZ3MgYW5kIGNhbGwKKyAgICAgKiBzZXRFcnJvcigpIGFzIG5lY2Vzc2FyeS48L3A+CisgICAgICovCisgICAgcHVibGljIHZvaWQgdmVyaWZ5U2V0dGluZ3MoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICAoKEJhc2VTZWxlY3RvcikgZ2V0Q2hlY2tlZFJlZigpKS52ZXJpZnlTZXR0aW5ncygpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIGNhbiB1c2UgdGhpcyB0byB0aHJvdyB0aGUgcmVxdWlzaXRlIGV4Y2VwdGlvbgorICAgICAqIGluIGlzU2VsZWN0ZWQoKSBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvciBjb25kaXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgIGlmIChnZXRFcnJvcigpID09IG51bGwpIHsKKyAgICAgICAgICAgIHZlcmlmeVNldHRpbmdzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldEVycm9yKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycm1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdGhhdCBlYWNoIHNlbGVjdG9yIHdpbGwgaW1wbGVtZW50IHRvIGNyZWF0ZSB0aGVpcgorICAgICAqIHNlbGVjdGlvbiBiZWhhdmlvdXIuIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBzZXR1cAorICAgICAqIG9mIGEgc2VsZWN0b3IsIGl0IGNhbiB0aHJvdyBhIEJ1aWxkRXhjZXB0aW9uIHRvIGluZGljYXRlCisgICAgICogdGhlIHByb2JsZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciBBIGphdmEuaW8uRmlsZSBvYmplY3QgZm9yIHRoZSBiYXNlIGRpcmVjdG9yeQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBmaWxlIEEgRmlsZSBvYmplY3QgZm9yIHRoaXMgZmlsZW5hbWUKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlIHNlbGVjdGVkIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUpOworCit9CisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3RvckNvbnRhaW5lci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3RvckNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTQ0YjkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZVNlbGVjdG9yQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLk1vZGlmaWVkU2VsZWN0b3I7CisKKy8qKgorICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3Igc2VsZWN0b3JzIHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgc2VsZWN0b3JzLgorICoKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VTZWxlY3RvckNvbnRhaW5lciBleHRlbmRzIEJhc2VTZWxlY3RvcgorICAgICAgICBpbXBsZW1lbnRzIFNlbGVjdG9yQ29udGFpbmVyIHsKKworICAgIHByaXZhdGUgVmVjdG9yIHNlbGVjdG9yc0xpc3QgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCYXNlU2VsZWN0b3JDb250YWluZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzZWxlY3RvcnMgaGVyZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIHNlbGVjdG9ycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1NlbGVjdG9ycygpIHsKKyAgICAgICAgcmV0dXJuICEoc2VsZWN0b3JzTGlzdC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lcgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzZWxlY3RvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNlbGVjdG9yQ291bnQoKSB7CisgICAgICAgIHJldHVybiBzZWxlY3RvcnNMaXN0LnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc2VsZWN0b3JzIGFzIGFuIGFycmF5LgorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNlbGVjdG9ycworICAgICAqLworICAgIHB1YmxpYyBGaWxlU2VsZWN0b3JbXSBnZXRTZWxlY3RvcnMoUHJvamVjdCBwKSB7CisgICAgICAgIEZpbGVTZWxlY3RvcltdIHJlc3VsdCA9IG5ldyBGaWxlU2VsZWN0b3Jbc2VsZWN0b3JzTGlzdC5zaXplKCldOworICAgICAgICBzZWxlY3RvcnNMaXN0LmNvcHlJbnRvKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdG9yIGZvciBhY2Nlc3NpbmcgdGhlIHNldCBvZiBzZWxlY3RvcnMuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdG9yIGZvciB0aGUgc2VsZWN0b3JzCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIHNlbGVjdG9yRWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBzZWxlY3RvcnNMaXN0LmVsZW1lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgU2VsZWN0b3JzIHdpdGhpbiB0aGlzIGNvbnRhaW5lciB0byBhIHN0cmluZy4gVGhpcyB3aWxsCisgICAgICoganVzdCBiZSBhIGhlbHBlciBjbGFzcyBmb3IgdGhlIHN1YmNsYXNzZXMgdGhhdCBwdXQgdGhlaXIgb3duIG5hbWUKKyAgICAgKiBhcm91bmQgdGhlIGNvbnRlbnRzIGxpc3RlZCBoZXJlLgorICAgICAqCisgICAgICogQHJldHVybiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBTZWxlY3RvcnMgY29udGFpbmVkIGluIHRoaXMgb25lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHNlbGVjdG9yRWxlbWVudHMoKTsKKyAgICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChlLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHNlbGVjdG9yIGludG8gdGhpcyBjb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIG5ldyBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRTZWxlY3RvcihGaWxlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgc2VsZWN0b3JzTGlzdC5hZGRFbGVtZW50KHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIHZhbGlkYXRlcyB0aGUgY29udGFpbmVyIGJ5IGNhbGxpbmcKKyAgICAgKiB2ZXJpZnlTZXR0aW5ncygpIGFuZCB0aGVuIHZhbGlkYXRlcyBlYWNoIGNvbnRhaW5lZCBzZWxlY3RvcgorICAgICAqIHByb3ZpZGVkIHRoYXQgdGhlIHNlbGVjdG9yIGltcGxlbWVudHMgdGhlIHZhbGlkYXRlIGludGVyZmFjZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+T3JkaW5hcmlseSwgdGhpcyB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgZWxlbWVudHMgb2YgYSBzZWxlY3RvcgorICAgICAqIGNvbnRhaW5lciBldmVuIGlmIHRoZSBpc1NlbGVjdGVkKCkgbWV0aG9kIG9mIHNvbWUgZWxlbWVudHMgaXMKKyAgICAgKiBuZXZlciBjYWxsZWQuIFRoaXMgaGFzIHR3byBlZmZlY3RzOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlZhbGlkYXRpb24gd2lsbCBvZnRlbiBvY2N1ciB0d2ljZS4KKyAgICAgKiA8bGk+U2luY2UgaXQgaXMgbm90IHJlcXVpcmVkIHRoYXQgc2VsZWN0b3JzIGRlcml2ZSBmcm9tCisgICAgICogQmFzZVNlbGVjdG9yLCB0aGVyZSBjb3VsZCBiZSBzZWxlY3RvcnMgaW4gdGhlIGNvbnRhaW5lciB3aG9zZQorICAgICAqIGVycm9yIGNvbmRpdGlvbnMgYXJlIG5vdCBkZXRlY3RlZCBpZiB0aGVpciBpc1NlbGVjdGVkKCkgY2FsbAorICAgICAqIGlzIG5ldmVyIG1hZGUuCisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgdmVyaWZ5U2V0dGluZ3MoKTsKKyAgICAgICAgU3RyaW5nIGVycm1zZyA9IGdldEVycm9yKCk7CisgICAgICAgIGlmIChlcnJtc2cgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycm1zZyk7CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHNlbGVjdG9yRWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBCYXNlU2VsZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAoKEJhc2VTZWxlY3RvcikgbykudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogTWV0aG9kIHRoYXQgZWFjaCBzZWxlY3RvciB3aWxsIGltcGxlbWVudCB0byBjcmVhdGUgdGhlaXIgc2VsZWN0aW9uCisgICAgICogYmVoYXZpb3VyLiBUaGlzIGlzIHdoYXQgbWFrZXMgU2VsZWN0b3JDb250YWluZXIgYWJzdHJhY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciB0aGUgYmFzZSBkaXJlY3RvcnkgdGhlIHNjYW4gaXMgYmVpbmcgZG9uZSBmcm9tCisgICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNoZWNrCisgICAgICogQHBhcmFtIGZpbGUgYSBqYXZhLmlvLkZpbGUgb2JqZWN0IGZvciB0aGUgZmlsZW5hbWUgdGhhdCB0aGUgc2VsZWN0b3IKKyAgICAgKiBjYW4gdXNlCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZCBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlKTsKKworCisgICAgLyogTWV0aG9kcyBiZWxvdyBhbGwgYWRkIHNwZWNpZmljIHNlbGVjdG9ycyAqLworCisgICAgLyoqCisgICAgICogYWRkIGEgIlNlbGVjdCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdG9yKFNlbGVjdFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW4gIkFuZCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFuZChBbmRTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGFuICJPciIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9yKE9yU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhICJOb3QiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGROb3QoTm90U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhICJOb25lIiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTm9uZShOb25lU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIG1ham9yaXR5IHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNYWpvcml0eShNYWpvcml0eVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBzZWxlY3RvciBkYXRlIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREYXRlKERhdGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgc2VsZWN0b3Igc2l6ZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2l6ZShTaXplU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIHNlbGVjdG9yIGZpbGVuYW1lIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlbmFtZShGaWxlbmFtZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW4gZXh0ZW5kZWQgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEN1c3RvbShFeHRlbmRTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgY29udGFpbnMgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnRhaW5zKENvbnRhaW5zU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhIHByZXNlbnQgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByZXNlbnQoUHJlc2VudFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBkZXB0aCBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVwdGgoRGVwdGhTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgZGVwZW5kcyBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGVwZW5kKERlcGVuZFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRzIGEgZGlmZmVyZW50IHNlbGVjdG9yIHRvIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREaWZmZXJlbnQoRGlmZmVyZW50U2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZHMgYSB0eXBlIHNlbGVjdG9yIHRvIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUeXBlKFR5cGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkIGEgcmVndWxhciBleHByZXNzaW9uIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb250YWluc1JlZ2V4cChDb250YWluc1JlZ2V4cFNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgdGhlIG1vZGlmaWVkIHNlbGVjdG9yCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKiBAc2luY2UgYW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1vZGlmaWVkKE1vZGlmaWVkU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBhbiBhcmJpdGFyeSBzZWxlY3RvcgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Db250YWluc1JlZ2V4cFNlbGVjdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNSZWdleHBTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTI3MjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNSZWdleHBTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZ3VsYXJFeHByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5SZXNvdXJjZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cDsKKworLyoqCisgKiBTZWxlY3RvciB0aGF0IGZpbHRlcnMgZmlsZXMgYmFzZWQgb24gYSByZWd1bGFyIGV4cHJlc3Npb24uCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIENvbnRhaW5zUmVnZXhwU2VsZWN0b3IgZXh0ZW5kcyBCYXNlRXh0ZW5kU2VsZWN0b3IKKyAgICAgICAgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJQcm92aWRlZEV4cHJlc3Npb24gPSBudWxsOworICAgIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb24gbXlSZWdFeHAgPSBudWxsOworICAgIHByaXZhdGUgUmVnZXhwIG15RXhwcmVzc2lvbiA9IG51bGw7CisgICAgLyoqIEtleSB0byB1c2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fS0VZID0gImV4cHJlc3Npb24iOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250YWluc1JlZ2V4cFNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbnNSZWdleHBTZWxlY3RvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigKKyAgICAgICAgICAgICAgICAie2NvbnRhaW5zcmVnZXhwc2VsZWN0b3IgZXhwcmVzc2lvbjogIik7CisgICAgICAgIGJ1Zi5hcHBlbmQodXNlclByb3ZpZGVkRXhwcmVzc2lvbik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBzZWFyY2ggdGhlIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlZXhwcmVzc2lvbiB0aGlzIG11c3QgbWF0Y2ggYSBsaW5lIGluIHRoZSBmaWxlIHRvIGJlIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oU3RyaW5nIHRoZWV4cHJlc3Npb24pIHsKKyAgICAgICAgdGhpcy51c2VyUHJvdmlkZWRFeHByZXNzaW9uID0gdGhlZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHVzaW5nIHRoaXMgYXMgYSBjdXN0b20gc2VsZWN0b3IsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLgorICAgICAqIEl0IHRyYW5zbGF0ZXMgZWFjaCBwYXJhbWV0ZXIgaW50byB0aGUgYXBwcm9wcmlhdGUgc2V0WFhYKCkgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBjb21wbGV0ZSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhpcyBzZWxlY3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1uYW1lID0gcGFyYW1ldGVyc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKEVYUFJFU1NJT05fS0VZLmVxdWFsc0lnbm9yZUNhc2UocGFyYW1uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRFeHByZXNzaW9uKHBhcmFtZXRlcnNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoIkludmFsaWQgcGFyYW1ldGVyICIgKyBwYXJhbW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IGFuIGV4cHJlc3Npb24gd2FzIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgeworICAgICAgICBpZiAodXNlclByb3ZpZGVkRXhwcmVzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRFcnJvcigiVGhlIGV4cHJlc3Npb24gYXR0cmlidXRlIGlzIHJlcXVpcmVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhZ2FpbnN0IGVhY2ggbGluZSBvZiB0ZXh0IGluIHRoZSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VkaXIgdGhlIGJhc2UgZGlyZWN0b3J5IHRoZSBzY2FuIGlzIGJlaW5nIGRvbmUgZnJvbQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBmaWxlIGlzIGEgamF2YS5pby5GaWxlIG9iamVjdCB0aGUgc2VsZWN0b3IgY2FuIHVzZQorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CisgICAgICAgIHJldHVybiBpc1NlbGVjdGVkKG5ldyBGaWxlUmVzb3VyY2UoZmlsZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGEgcmVndWxhciBleHByZXNzaW9uIGFnYWluc3QgZWFjaCBsaW5lIG9mIHRleHQgaW4gYSBSZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIHRoZSBSZXNvdXJjZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFJlc291cmNlIGlzIHNlbGVjdGVkIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoUmVzb3VyY2UgcikgeworICAgICAgICBTdHJpbmcgdGVzdHN0ciA9IG51bGw7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKKworICAgICAgICAvLyB0aHJvdyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorCisgICAgICAgIHZhbGlkYXRlKCk7CisKKyAgICAgICAgaWYgKHIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobXlSZWdFeHAgPT0gbnVsbCkgeworICAgICAgICAgICAgbXlSZWdFeHAgPSBuZXcgUmVndWxhckV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgIG15UmVnRXhwLnNldFBhdHRlcm4odXNlclByb3ZpZGVkRXhwcmVzc2lvbik7CisgICAgICAgICAgICBteUV4cHJlc3Npb24gPSBteVJlZ0V4cC5nZXRSZWdleHAoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoci5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgSW5wdXRTdHJlYW0gZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICsgci50b0xvbmdTdHJpbmcoKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RzdHIgPSBpbi5yZWFkTGluZSgpOworCisgICAgICAgICAgICB3aGlsZSAodGVzdHN0ciAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBpZiAobXlFeHByZXNzaW9uLm1hdGNoZXModGVzdHN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlc3RzdHIgPSBpbi5yZWFkTGluZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVhZCAiICsgci50b0xvbmdTdHJpbmcoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNsb3NlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByLnRvTG9uZ1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zU2VsZWN0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Db250YWluc1NlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjNWM1YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Db250YWluc1NlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuUmVzb3VyY2VTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBTZWxlY3RvciB0aGF0IGZpbHRlcnMgZmlsZXMvcmVzb3VyY2VzIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBjb250YWluIGEKKyAqIHBhcnRpY3VsYXIgc3RyaW5nLgorICoKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGNsYXNzIENvbnRhaW5zU2VsZWN0b3IgZXh0ZW5kcyBCYXNlRXh0ZW5kU2VsZWN0b3IgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRhaW5zID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZXdoaXRlc3BhY2UgPSBmYWxzZTsKKyAgICAvKiogS2V5IHRvIHVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9LRVkgPSAiZXhwcmVzc2lvbiI7CisgICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTlNfS0VZID0gInRleHQiOworICAgIC8qKiBVc2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfS0VZID0gImNhc2VzZW5zaXRpdmUiOworICAgIC8qKiBVc2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFU1BBQ0VfS0VZID0gImlnbm9yZXdoaXRlc3BhY2UiOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRhaW5zU2VsZWN0b3I8L2NvZGU+IGluc3RhbmNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5zU2VsZWN0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIntjb250YWluc3NlbGVjdG9yIHRleHQ6ICIpOworICAgICAgICBidWYuYXBwZW5kKCciJykuYXBwZW5kKGNvbnRhaW5zKS5hcHBlbmQoJyInKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIGNhc2VzZW5zaXRpdmU6ICIpOworICAgICAgICBidWYuYXBwZW5kKGNhc2VzZW5zaXRpdmUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIGlnbm9yZXdoaXRlc3BhY2U6ICIpOworICAgICAgICBidWYuYXBwZW5kKGlnbm9yZXdoaXRlc3BhY2UgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yIHdpdGhpbiBhIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbnMgdGhlIHN0cmluZyB0aGF0IGEgZmlsZSBtdXN0IGNvbnRhaW4gdG8gYmUgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgY29udGFpbnMpIHsKKyAgICAgICAgdGhpcy5jb250YWlucyA9IGNvbnRhaW5zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gaWdub3JlIGNhc2UgaW4gdGhlIHN0cmluZyBiZWluZyBzZWFyY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXNlc2Vuc2l0aXZlIHdoZXRoZXIgdG8gcGF5IGF0dGVudGlvbiB0byBjYXNlIHNlbnNpdGl2aXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FzZXNlbnNpdGl2ZShib29sZWFuIGNhc2VzZW5zaXRpdmUpIHsKKyAgICAgICAgdGhpcy5jYXNlc2Vuc2l0aXZlID0gY2FzZXNlbnNpdGl2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGlnbm9yZSB3aGl0ZXNwYWNlIGluIHRoZSBzdHJpbmcgYmVpbmcgc2VhcmNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWdub3Jld2hpdGVzcGFjZSB3aGV0aGVyIHRvIGlnbm9yZSBhbnkgd2hpdGVzcGFjZQorICAgICAqICAgICAgICAoc3BhY2VzLCB0YWJzLCBldGMuKSBpbiB0aGUgc2VhcmNoc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWdub3Jld2hpdGVzcGFjZShib29sZWFuIGlnbm9yZXdoaXRlc3BhY2UpIHsKKyAgICAgICAgdGhpcy5pZ25vcmV3aGl0ZXNwYWNlID0gaWdub3Jld2hpdGVzcGFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHVzaW5nIHRoaXMgYXMgYSBjdXN0b20gc2VsZWN0b3IsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLgorICAgICAqIEl0IHRyYW5zbGF0ZXMgZWFjaCBwYXJhbWV0ZXIgaW50byB0aGUgYXBwcm9wcmlhdGUgc2V0WFhYKCkgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBjb21wbGV0ZSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhpcyBzZWxlY3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1uYW1lID0gcGFyYW1ldGVyc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKENPTlRBSU5TX0tFWS5lcXVhbHNJZ25vcmVDYXNlKHBhcmFtbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0VGV4dChwYXJhbWV0ZXJzW2ldLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ0FTRV9LRVkuZXF1YWxzSWdub3JlQ2FzZShwYXJhbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldENhc2VzZW5zaXRpdmUoUHJvamVjdC50b0Jvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tpXS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChXSElURVNQQUNFX0tFWS5lcXVhbHNJZ25vcmVDYXNlKHBhcmFtbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0SWdub3Jld2hpdGVzcGFjZShQcm9qZWN0LnRvQm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW2ldLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigiSW52YWxpZCBwYXJhbWV0ZXIgIiArIHBhcmFtbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRvIG1ha2Ugc3VyZSBhbGwgc2V0dGluZ3MgYXJlIGtvc2hlci4gSW4gdGhpcyBjYXNlLCBpdAorICAgICAqIG1lYW5zIHRoYXQgdGhlIHBhdHRlcm4gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgeworICAgICAgICBpZiAoY29udGFpbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RXJyb3IoIlRoZSB0ZXh0IGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIFRoaXMgaXMgd2hlcmUgdGhlIHNlbGVjdG9yIGdldHMgdG8gZGVjaWRlCisgICAgICogb24gdGhlIGluY2x1c2lvbiBvZiBhIGZpbGUgaW4gYSBwYXJ0aWN1bGFyIGZpbGVzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciB0aGUgYmFzZSBkaXJlY3RvcnkgdGhlIHNjYW4gaXMgYmVpbmcgZG9uZSBmcm9tCisgICAgICogQHBhcmFtIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNoZWNrCisgICAgICogQHBhcmFtIGZpbGUgaXMgYSBqYXZhLmlvLkZpbGUgb2JqZWN0IHRoZSBzZWxlY3RvciBjYW4gdXNlCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZCBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQobmV3IEZpbGVSZXNvdXJjZShmaWxlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIFRoaXMgaXMgd2hlcmUgdGhlIHNlbGVjdG9yIGdldHMgdG8gZGVjaWRlCisgICAgICogb24gdGhlIGluY2x1c2lvbiBvZiBhIFJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHIgdGhlIFJlc291cmNlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgUmVzb3VyY2UgaXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChSZXNvdXJjZSByKSB7CisKKyAgICAgICAgLy8gdGhyb3cgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgICAgdmFsaWRhdGUoKTsKKworICAgICAgICBpZiAoci5pc0RpcmVjdG9yeSgpIHx8IGNvbnRhaW5zLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVzZXJzdHIgPSBjb250YWluczsKKyAgICAgICAgaWYgKCFjYXNlc2Vuc2l0aXZlKSB7CisgICAgICAgICAgICB1c2Vyc3RyID0gY29udGFpbnMudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaWdub3Jld2hpdGVzcGFjZSkgeworICAgICAgICAgICAgdXNlcnN0ciA9IFNlbGVjdG9yVXRpbHMucmVtb3ZlV2hpdGVzcGFjZSh1c2Vyc3RyKTsKKyAgICAgICAgfQorICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoci5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgSW5wdXRTdHJlYW0gZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICsgci50b0xvbmdTdHJpbmcoKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0c3RyID0gaW4ucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHdoaWxlICh0ZXN0c3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNhc2VzZW5zaXRpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdHN0ciA9IHRlc3RzdHIudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlnbm9yZXdoaXRlc3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdHN0ciA9IFNlbGVjdG9yVXRpbHMucmVtb3ZlV2hpdGVzcGFjZSh0ZXN0c3RyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRlc3RzdHIuaW5kZXhPZih1c2Vyc3RyKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXN0c3RyID0gaW4ucmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCByZWFkICIgKyByLnRvTG9uZ1N0cmluZygpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CisgICAgICAgIH0KKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RhdGVTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RhdGVTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzFkMTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGF0ZVNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5UaW1lQ29tcGFyaXNvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBTZWxlY3RvciB0aGF0IGNob29zZXMgZmlsZXMgYmFzZWQgb24gdGhlaXIgbGFzdCBtb2RpZmllZCBkYXRlLgorICoKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGNsYXNzIERhdGVTZWxlY3RvciBleHRlbmRzIEJhc2VFeHRlbmRTZWxlY3RvciB7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJpdmF0ZSBsb25nIG1pbGxpcyA9IC0xOworICAgIHByaXZhdGUgU3RyaW5nIGRhdGVUaW1lID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZURpcnMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGxvbmcgZ3JhbnVsYXJpdHkgPSAwOworICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm47CisgICAgcHJpdmF0ZSBUaW1lQ29tcGFyaXNvbiB3aGVuID0gVGltZUNvbXBhcmlzb24uRVFVQUw7CisKKyAgICAvKiogS2V5IHRvIHVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlMTElTX0tFWSA9ICJtaWxsaXMiOworICAgIC8qKiBLZXkgdG8gdXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFVElNRV9LRVkgPSAiZGF0ZXRpbWUiOworICAgIC8qKiBLZXkgdG8gdXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0RJUlNfS0VZID0gImNoZWNrZGlycyI7CisgICAgLyoqIEtleSB0byB1c2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQU5VTEFSSVRZX0tFWSA9ICJncmFudWxhcml0eSI7CisgICAgLyoqIEtleSB0byB1c2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRU5fS0VZID0gIndoZW4iOworICAgIC8qKiBLZXkgdG8gdXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOX0tFWSA9ICJwYXR0ZXJuIjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGF0ZVNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBEYXRlU2VsZWN0b3IoKSB7CisgICAgICAgIGdyYW51bGFyaXR5ID0gRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigie2RhdGVzZWxlY3RvciBkYXRlOiAiKTsKKyAgICAgICAgYnVmLmFwcGVuZChkYXRlVGltZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBjb21wYXJlOiAiKS5hcHBlbmQod2hlbi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIGdyYW51bGFyaXR5OiAiKTsKKyAgICAgICAgYnVmLmFwcGVuZChncmFudWxhcml0eSk7CisgICAgICAgIGlmIChwYXR0ZXJuICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBwYXR0ZXJuOiAiKS5hcHBlbmQocGF0dGVybik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aW1lOyBmb3IgdXNlcnMgd2hvIHByZWZlciB0byBleHByZXNzIHRpbWUgaW4gbXMgc2luY2UgMTk3MC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaWxsaXMgdGhlIHRpbWUgdG8gY29tcGFyZSBmaWxlJ3MgbGFzdCBtb2RpZmllZCBkYXRlIHRvLAorICAgICAqICAgICAgICBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1pbGxpcyhsb25nIG1pbGxpcykgeworICAgICAgICB0aGlzLm1pbGxpcyA9IG1pbGxpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaWxsaXNlY29uZCB2YWx1ZSB0aGUgc2VsZWN0b3IgaXMgc2V0IGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBtaWxsaXNlY29uZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNaWxsaXMoKSB7CisgICAgICAgIGlmIChkYXRlVGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtaWxsaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGF0ZS4gVGhlIHVzZXIgbXVzdCBzdXBwbHkgaXQgaW4gTU0vREQvWVlZWSBISDpNTSBBTV9QTSBmb3JtYXQsCisgICAgICogdW5sZXNzIGFuIGFsdGVybmF0ZSBwYXR0ZXJuIGlzIHNwZWNpZmllZCB2aWEgdGhlIHBhdHRlcm4gYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGVUaW1lIGEgZm9ybWF0dGVkIGRhdGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRldGltZShTdHJpbmcgZGF0ZVRpbWUpIHsKKyAgICAgICAgdGhpcy5kYXRlVGltZSA9IGRhdGVUaW1lOworICAgICAgICBtaWxsaXMgPSAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBjaGVjayBkYXRlcyBvbiBkaXJlY3Rvcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlRGlycyB3aGV0aGVyIHRvIGNoZWNrIHRoZSB0aW1lc3RhbXAgb24gZGlyZWN0b3JpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tkaXJzKGJvb2xlYW4gaW5jbHVkZURpcnMpIHsKKyAgICAgICAgdGhpcy5pbmNsdWRlRGlycyA9IGluY2x1ZGVEaXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgbGVld2F5IHdlIHdpbGwgZ2l2ZSBiZWZvcmUgd2UgY29uc2lkZXIKKyAgICAgKiBhIGZpbGUgbm90IHRvIGhhdmUgbWF0Y2hlZCBhIGRhdGUuCisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHcmFudWxhcml0eShpbnQgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgdGhpcy5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHR5cGUgb2YgY29tcGFyaXNvbiB0byBiZSBkb25lIG9uIHRoZSBmaWxlJ3MgbGFzdCBtb2RpZmllZAorICAgICAqIGRhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGNtcCBUaGUgY29tcGFyaXNvbiB0byBwZXJmb3JtLCBhbiBFbnVtZXJhdGVkQXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdoZW4oVGltZUNvbXBhcmlzb25zIHRjbXApIHsKKyAgICAgICAgc2V0V2hlbigoVGltZUNvbXBhcmlzb24pIHRjbXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcGFyaXNvbiB0eXBlLgorICAgICAqIEBwYXJhbSB0IFRpbWVDb21wYXJpc29uIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaGVuKFRpbWVDb21wYXJpc29uIHQpIHsKKyAgICAgICAgd2hlbiA9IHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGF0dGVybiB0byBiZSB1c2VkIGZvciB0aGUgU2ltcGxlRGF0ZUZvcm1hdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRoYXQgZGVmaW5lcyB0aGUgZGF0ZSBmb3JtYXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdXNpbmcgdGhpcyBhcyBhIGN1c3RvbSBzZWxlY3RvciwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCisgICAgICogSXQgdHJhbnNsYXRlcyBlYWNoIHBhcmFtZXRlciBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzZXRYWFgoKSBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIGNvbXBsZXRlIHNldCBvZiBwYXJhbWV0ZXJzIGZvciB0aGlzIHNlbGVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1uYW1lID0gcGFyYW1ldGVyc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKE1JTExJU19LRVkuZXF1YWxzSWdub3JlQ2FzZShwYXJhbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRNaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyYW1ldGVyc1tpXS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCJJbnZhbGlkIG1pbGxpc2Vjb25kIHNldHRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtZXRlcnNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERBVEVUSU1FX0tFWS5lcXVhbHNJZ25vcmVDYXNlKHBhcmFtbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RGF0ZXRpbWUocGFyYW1ldGVyc1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENIRUNLRElSU19LRVkuZXF1YWxzSWdub3JlQ2FzZShwYXJhbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldENoZWNrZGlycyhQcm9qZWN0LnRvQm9vbGVhbihwYXJhbWV0ZXJzW2ldLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEdSQU5VTEFSSVRZX0tFWS5lcXVhbHNJZ25vcmVDYXNlKHBhcmFtbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEdyYW51bGFyaXR5KEludGVnZXIucGFyc2VJbnQocGFyYW1ldGVyc1tpXS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCJJbnZhbGlkIGdyYW51bGFyaXR5IHNldHRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyYW1ldGVyc1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoV0hFTl9LRVkuZXF1YWxzSWdub3JlQ2FzZShwYXJhbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFdoZW4obmV3IFRpbWVDb21wYXJpc29uKHBhcmFtZXRlcnNbaV0uZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9LRVkuZXF1YWxzSWdub3JlQ2FzZShwYXJhbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFBhdHRlcm4ocGFyYW1ldGVyc1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigiSW52YWxpZCBwYXJhbWV0ZXIgIiArIHBhcmFtbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIGNvbnNpc3RlbmN5IGNoZWNrIHRvIGVuc3VyZSB0aGUgc2VsZWN0b3IncyByZXF1aXJlZAorICAgICAqIHZhbHVlcyBoYXZlIGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgeworICAgICAgICBpZiAoZGF0ZVRpbWUgPT0gbnVsbCAmJiBtaWxsaXMgPCAwKSB7CisgICAgICAgICAgICBzZXRFcnJvcigiWW91IG11c3QgcHJvdmlkZSBhIGRhdGV0aW1lIG9yIHRoZSBudW1iZXIgb2YgIgorICAgICAgICAgICAgICAgICAgICArICJtaWxsaXNlY29uZHMuIik7CisgICAgICAgIH0gZWxzZSBpZiAobWlsbGlzIDwgMCAmJiBkYXRlVGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBjaGVjayBtaWxsaXMgYW5kIG9ubHkgc2V0IGl0IG9uY2UuCisgICAgICAgICAgICBEYXRlRm9ybWF0IGRmID0gKChwYXR0ZXJuID09IG51bGwpCisgICAgICAgICAgICAgICAgPyBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIERhdGVGb3JtYXQuU0hPUlQsIERhdGVGb3JtYXQuU0hPUlQsIExvY2FsZS5VUykKKyAgICAgICAgICAgICAgICA6IG5ldyBTaW1wbGVEYXRlRm9ybWF0KHBhdHRlcm4pKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXRNaWxsaXMoZGYucGFyc2UoZGF0ZVRpbWUpLmdldFRpbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1pbGxpcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoIkRhdGUgb2YgIiArIGRhdGVUaW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcmVzdWx0cyBpbiBuZWdhdGl2ZSBtaWxsaXNlY29uZHMgdmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcmVsYXRpdmUgdG8gZXBvY2ggKEphbnVhcnkgMSwgMTk3MCwgMDA6MDA6MDAgR01UKS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgICAgIHNldEVycm9yKCJEYXRlIG9mICIgKyBkYXRlVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIENhbm5vdCBiZSBwYXJzZWQgY29ycmVjdGx5LiBJdCBzaG91bGQgYmUgaW4iCisgICAgICAgICAgICAgICAgICAgICAgICArICgocGF0dGVybiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgPyAiIE1NL0REL1lZWVkgSEg6TU0gQU1fUE0iIDogcGF0dGVybikgKyAiIGZvcm1hdC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBoZWFydCBvZiB0aGUgbWF0dGVyLiBUaGlzIGlzIHdoZXJlIHRoZSBzZWxlY3RvciBnZXRzIHRvIGRlY2lkZQorICAgICAqIG9uIHRoZSBpbmNsdXNpb24gb2YgYSBmaWxlIGluIGEgcGFydGljdWxhciBmaWxlc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VkaXIgdGhlIGJhc2UgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGhlIHNjYW4gaXMgYmVpbmcgcGVyZm9ybWVkLgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjay4KKyAgICAgKiBAcGFyYW0gZmlsZSBpcyBhIGphdmEuaW8uRmlsZSBvYmplY3QgdGhlIHNlbGVjdG9yIGNhbiB1c2UuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIGlzIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgeworCisgICAgICAgIHZhbGlkYXRlKCk7CisKKyAgICAgICAgcmV0dXJuIChmaWxlLmlzRGlyZWN0b3J5KCkgJiYgIWluY2x1ZGVEaXJzKQorICAgICAgICAgICAgfHwgd2hlbi5ldmFsdWF0ZShmaWxlLmxhc3RNb2RpZmllZCgpLCBtaWxsaXMsIGdyYW51bGFyaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgZm9yIHRpbWUgY29tcGFyaXNvbi4KKyAgICAgKiA8cD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRpbWVDb21wYXJpc29ucyBleHRlbmRzIFRpbWVDb21wYXJpc29uIHsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwZW5kU2VsZWN0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXBlbmRTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMmFkMjkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwZW5kU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIFNlbGVjdG9yIHRoYXQgZmlsdGVycyBmaWxlcyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIG5ld2VyIHRoYW4KKyAqIGEgbWF0Y2hpbmcgZmlsZSBpbiBhbm90aGVyIGRpcmVjdG9yeSB0cmVlLiBJdCBjYW4gY29udGFpbiBhIG1hcHBlcgorICogZWxlbWVudCwgc28gaXNuJ3QgYXZhaWxhYmxlIGFzIGFuIEV4dGVuZFNlbGVjdG9yIChzaW5jZSB0aG9zZQorICogcGFyYW1ldGVycyBjYW4ndCBob2xkIG90aGVyIGVsZW1lbnRzKS4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBEZXBlbmRTZWxlY3RvciBleHRlbmRzIE1hcHBpbmdTZWxlY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRlcGVuZFNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBEZXBlbmRTZWxlY3RvcigpIHsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJ7ZGVwZW5kc2VsZWN0b3IgdGFyZ2V0ZGlyOiAiKTsKKyAgICAgICAgaWYgKHRhcmdldGRpciA9PSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJOT1QgWUVUIFNFVCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmLmFwcGVuZCh0YXJnZXRkaXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIgZ3JhbnVsYXJpdHk6ICIpOworICAgICAgICBidWYuYXBwZW5kKGdyYW51bGFyaXR5KTsKKyAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgbWFwcGVyOiAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobWFwLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgaWYgKG1hcHBlckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIG1hcHBlcjogIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKG1hcHBlckVsZW1lbnQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB0aGlzIHRlc3QgaXMgb3VyIHNlbGVjdGlvbiB0ZXN0IHRoYXQgY29tcGFyZWQgdGhlIGZpbGUgd2l0aCB0aGUgZGVzdGZpbGUKKyAgICAgKiBAcGFyYW0gc3JjZmlsZSB0aGUgc291cmNlIGZpbGUKKyAgICAgKiBAcGFyYW0gZGVzdGZpbGUgdGhlIGRlc3RpbmF0aW9uIGZpbGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZGVzdGluYXRpb24gaXMgb3V0IG9mIGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3Rpb25UZXN0KEZpbGUgc3JjZmlsZSwgRmlsZSBkZXN0ZmlsZSkgeworICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gU2VsZWN0b3JVdGlscy5pc091dE9mRGF0ZShzcmNmaWxlLCBkZXN0ZmlsZSwKKyAgICAgICAgICAgICAgICBncmFudWxhcml0eSk7CisgICAgICAgIHJldHVybiBzZWxlY3RlZDsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RlcHRoU2VsZWN0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXB0aFNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2MTY1MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXB0aFNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKKworLyoqCisgKiBTZWxlY3RvciB0aGF0IGZpbHRlcnMgZmlsZXMgYmFzZWQgb24gdGhlIGhvdyBkZWVwIGluIHRoZSBkaXJlY3RvcnkKKyAqIHRyZWUgdGhleSBhcmUuCisgKgorICogQHNpbmNlIDEuNQorICovCitwdWJsaWMgY2xhc3MgRGVwdGhTZWxlY3RvciBleHRlbmRzIEJhc2VFeHRlbmRTZWxlY3RvciB7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworCisgICAgLyoqIG1pbiBhdHRyaWJ1dGUgKi8KKyAgICBwdWJsaWMgaW50IG1pbiA9IC0xOworICAgIC8qKiBtYXggYXR0cmlidXRlICovCisgICAgcHVibGljIGludCBtYXggPSAtMTsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKiogVXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fS0VZID0gIm1pbiI7CisgICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0tFWSA9ICJtYXgiOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZXB0aFNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBEZXB0aFNlbGVjdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJ7ZGVwdGhzZWxlY3RvciBtaW46ICIpOworICAgICAgICBidWYuYXBwZW5kKG1pbik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBtYXg6ICIpOworICAgICAgICBidWYuYXBwZW5kKG1heCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtaW5pbXVtIGRlcHRoIGJlbG93IHRoZSBiYXNlZGlyIGJlZm9yZSBhIGZpbGUgaXMgc2VsZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWluIG1pbmltdW0gZGlyZWN0b3J5IGxldmVscyBiZWxvdyBiYXNlZGlyIHRvIGdvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWluKGludCBtaW4pIHsKKyAgICAgICAgdGhpcy5taW4gPSBtaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1pbmltdW0gZGVwdGggYmVsb3cgdGhlIGJhc2VkaXIgYmVmb3JlIGEgZmlsZSBpcyBzZWxlY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXggbWF4aW11bSBkaXJlY3RvcnkgbGV2ZWxzIGJlbG93IGJhc2VkaXIgdG8gZ28KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXgoaW50IG1heCkgeworICAgICAgICB0aGlzLm1heCA9IG1heDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHVzaW5nIHRoaXMgYXMgYSBjdXN0b20gc2VsZWN0b3IsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLgorICAgICAqIEl0IHRyYW5zbGF0ZXMgZWFjaCBwYXJhbWV0ZXIgaW50byB0aGUgYXBwcm9wcmlhdGUgc2V0WFhYKCkgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBjb21wbGV0ZSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhpcyBzZWxlY3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1uYW1lID0gcGFyYW1ldGVyc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKE1JTl9LRVkuZXF1YWxzSWdub3JlQ2FzZShwYXJhbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRNaW4oSW50ZWdlci5wYXJzZUludChwYXJhbWV0ZXJzW2ldLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCJJbnZhbGlkIG1pbmltdW0gdmFsdWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtZXRlcnNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1BWF9LRVkuZXF1YWxzSWdub3JlQ2FzZShwYXJhbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRNYXgoSW50ZWdlci5wYXJzZUludChwYXJhbWV0ZXJzW2ldLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCJJbnZhbGlkIG1heGltdW0gdmFsdWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtZXRlcnNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigiSW52YWxpZCBwYXJhbWV0ZXIgIiArIHBhcmFtbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRvIG1ha2Ugc3VyZSBhbGwgc2V0dGluZ3MgYXJlIGtvc2hlci4gSW4gdGhpcyBjYXNlLCBpdAorICAgICAqIG1lYW5zIHRoYXQgdGhlIG1heCBkZXB0aCBpcyBub3QgbG93ZXIgdGhhbiB0aGUgbWluIGRlcHRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgeworICAgICAgICBpZiAobWluIDwgMCAmJiBtYXggPCAwKSB7CisgICAgICAgICAgICBzZXRFcnJvcigiWW91IG11c3Qgc2V0IGF0IGxlYXN0IG9uZSBvZiB0aGUgbWluIG9yIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICsgIm1heCBsZXZlbHMuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heCA8IG1pbiAmJiBtYXggPiAtMSkgeworICAgICAgICAgICAgc2V0RXJyb3IoIlRoZSBtYXhpbXVtIGRlcHRoIGlzIGxvd2VyIHRoYW4gdGhlIG1pbmltdW0uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gVGhpcyBpcyB3aGVyZSB0aGUgc2VsZWN0b3IgZ2V0cyB0byBkZWNpZGUKKyAgICAgKiBvbiB0aGUgaW5jbHVzaW9uIG9mIGEgZmlsZSBpbiBhIHBhcnRpY3VsYXIgZmlsZXNldC4gTW9zdCBvZiB0aGUgd29yaworICAgICAqIGZvciB0aGlzIHNlbGVjdG9yIGlzIG9mZmxvYWRlZCBpbnRvIFNlbGVjdG9yVXRpbHMsIGEgc3RhdGljIGNsYXNzCisgICAgICogdGhhdCBwcm92aWRlcyB0aGUgc2FtZSBzZXJ2aWNlcyBmb3IgYm90aCBGaWxlbmFtZVNlbGVjdG9yIGFuZAorICAgICAqIERpcmVjdG9yeVNjYW5uZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciB0aGUgYmFzZSBkaXJlY3RvcnkgdGhlIHNjYW4gaXMgYmVpbmcgZG9uZSBmcm9tCisgICAgICogQHBhcmFtIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNoZWNrCisgICAgICogQHBhcmFtIGZpbGUgaXMgYSBqYXZhLmlvLkZpbGUgb2JqZWN0IHRoZSBzZWxlY3RvciBjYW4gdXNlCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZCBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKKworICAgICAgICAvLyB0aHJvdyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIGludCBkZXB0aCA9IC0xOworICAgICAgICAvLyBJZiB5b3UgZmVsdCBkYXJpbmcsIHlvdSBjb3VsZCBjYWNoZSB0aGUgYmFzZWRpciBhYnNvbHV0ZSBwYXRoCisgICAgICAgIFN0cmluZyBhYnNCYXNlID0gYmFzZWRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGFic0ZpbGUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rQmFzZSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYWJzQmFzZSwKKyAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tGaWxlID0gbmV3IFN0cmluZ1Rva2VuaXplcihhYnNGaWxlLAorICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgd2hpbGUgKHRva0ZpbGUuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZXRva2VuID0gdG9rRmlsZS5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICh0b2tCYXNlLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBiYXNldG9rZW4gPSB0b2tCYXNlLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjay4gRGl0Y2ggaXQgaWYgeW91IHdhbnQgZmFzdGVyIHBlcmZvcm1hbmNlCisgICAgICAgICAgICAgICAgaWYgKCFiYXNldG9rZW4uZXF1YWxzKGZpbGV0b2tlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlICIgKyBmaWxlbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBhcHBlYXIgd2l0aGluICIgKyBhYnNCYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlyZWN0b3J5Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXB0aCArPSAxOworICAgICAgICAgICAgICAgIGlmIChtYXggPiAtMSAmJiBkZXB0aCA+IG1heCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0b2tCYXNlLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlICIgKyBmaWxlbmFtZQorICAgICAgICAgICAgICAgICsgIiBpcyBvdXRzaWRlIG9mICIgKyBhYnNCYXNlICsgImRpcmVjdG9yeSB0cmVlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1pbiA+IC0xICYmIGRlcHRoIDwgbWluKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EaWZmZXJlbnRTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RpZmZlcmVudFNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExMjU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EaWZmZXJlbnRTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIHNlbGVjdG9yIHNlbGVjdHMgZmlsZXMgYWdhaW5zdCBhIG1hcHBlZCBzZXQgb2YgdGFyZ2V0IGZpbGVzLCBzZWxlY3RpbmcKKyAqIGFsbCB0aG9zZSBmaWxlcyB3aGljaCBhcmUgZGlmZmVyZW50LgorICogRmlsZXMgd2l0aCBkaWZmZXJlbnQgbGVuZ3RocyBhcmUgZGVlbWVkIGRpZmZlcmVudAorICogYXV0b21hdGljYWxseQorICogRmlsZXMgd2l0aCBpZGVudGljYWwgdGltZXN0YW1wcyBhcmUgdmlld2VkIGFzIG1hdGNoaW5nIGJ5CisgKiBkZWZhdWx0LCB1bmxlc3MgeW91IHNwZWNpZnkgb3RoZXJ3aXNlLgorICogQ29udGVudHMgYXJlIGNvbXBhcmVkIGlmIHRoZSBsZW5ndGhzIGFyZSB0aGUgc2FtZQorICogYW5kIHRoZSB0aW1lc3RhbXBzIGFyZSBpZ25vcmVkIG9yIHRoZSBzYW1lLAorICogZXhjZXB0IGlmIHlvdSBkZWNpZGUgdG8gaWdub3JlIGNvbnRlbnRzIHRvIGdhaW4gc3BlZWQuCisgKiA8cD4KKyAqIFRoaXMgaXMgYSB1c2VmdWwgc2VsZWN0b3IgdG8gd29yayB3aXRoIHByb2dyYW1zIGFuZCB0YXNrcyB0aGF0IGRvbid0IGhhbmRsZQorICogZGVwZW5kZW5jeSBjaGVja2luZyBwcm9wZXJseTsgRXZlbiBpZiBhIHByZWRlY2Vzc29yIHRhc2sgYWx3YXlzIGNyZWF0ZXMgaXRzCisgKiBvdXRwdXQgZmlsZXMsIGZvbGxvd3VwIHRhc2tzIGNhbiBiZSBkcml2ZW4gb2ZmIGNvcGllcyBtYWRlIHdpdGggYSBkaWZmZXJlbnQKKyAqIHNlbGVjdG9yLCBzbyB0aGVpciBkZXBlbmRlbmNpZXMgYXJlIGRyaXZlbiBvbiB0aGUgYWJzb2x1dGUgc3RhdGUgb2YgdGhlCisgKiBmaWxlcywgbm90IGEgdGltZXN0YW1wLgorICogPHA+CisgKiBDbGVhcmx5LCBob3dldmVyLCBidWxrIGZpbGUgY29tcGFyaXNvbnMgaXMgaW5lZmZpY2llbnQ7IGFueXRoaW5nIHRoYXQgY2FuCisgKiB1c2UgdGltZXN0YW1wcyBpcyB0byBiZSBwcmVmZXJyZWQuIElmIHRoaXMgc2VsZWN0b3IgbXVzdCBiZSB1c2VkLCB1c2UgaXQKKyAqIG92ZXIgYXMgZmV3IGZpbGVzIGFzIHBvc3NpYmxlLCBwZXJoYXBzIGZvbGxvd2luZyBpdCB3aXRoIGFuICZsdDt1cHRvZGF0ZTsmZ3QKKyAqIHRvIGtlZXAgdGhlIGRlc2NlbmRlbnQgcm91dGluZXMgY29uZGl0aW9uYWwuCisgKgorICovCitwdWJsaWMgY2xhc3MgRGlmZmVyZW50U2VsZWN0b3IgZXh0ZW5kcyBNYXBwaW5nU2VsZWN0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlRmlsZVRpbWVzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlQ29udGVudHMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhpcyBmbGFnIHRlbGxzIHRoZSBzZWxlY3RvciB0byBpZ25vcmUgZmlsZSB0aW1lcyBpbiB0aGUgY29tcGFyaXNvbgorICAgICAqIEBwYXJhbSBpZ25vcmVGaWxlVGltZXMgaWYgdHJ1ZSBpZ25vcmUgZmlsZSB0aW1lcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUZpbGVUaW1lcyhib29sZWFuIGlnbm9yZUZpbGVUaW1lcykgeworICAgICAgICB0aGlzLmlnbm9yZUZpbGVUaW1lcyA9IGlnbm9yZUZpbGVUaW1lczsKKyAgICB9CisgICAgLyoqCisgICAgICogVGhpcyBmbGFnIHRlbGxzIHRoZSBzZWxlY3RvciB0byBpZ25vcmUgY29udGVudHMKKyAgICAgKiBAcGFyYW0gaWdub3JlQ29udGVudHMgaWYgdHJ1ZSBpZ25vcmUgY29udGVudHMKKyAgICAgKiBAc2luY2UgYW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlQ29udGVudHMoYm9vbGVhbiBpZ25vcmVDb250ZW50cykgeworICAgICAgICB0aGlzLmlnbm9yZUNvbnRlbnRzID0gaWdub3JlQ29udGVudHM7CisgICAgfQorICAgIC8qKgorICAgICAqIHRoaXMgdGVzdCBpcyBvdXIgc2VsZWN0aW9uIHRlc3QgdGhhdCBjb21wYXJlZCB0aGUgZmlsZSB3aXRoIHRoZSBkZXN0ZmlsZQorICAgICAqIEBwYXJhbSBzcmNmaWxlIHRoZSBzb3VyY2UgZmlsZQorICAgICAqIEBwYXJhbSBkZXN0ZmlsZSB0aGUgZGVzdGluYXRpb24gZmlsZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZXMgYXJlIGRpZmZlcmVudAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNlbGVjdGlvblRlc3QoRmlsZSBzcmNmaWxlLCBGaWxlIGRlc3RmaWxlKSB7CisKKyAgICAgICAgLy9pZiBlaXRoZXIgb2YgdGhlbSBpcyBtaXNzaW5nLCB0aGV5IGFyZSBkaWZmZXJlbnQKKyAgICAgICAgaWYgKHNyY2ZpbGUuZXhpc3RzKCkgIT0gZGVzdGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNyY2ZpbGUubGVuZ3RoKCkgIT0gZGVzdGZpbGUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBzaXplID0+ZGlmZmVyZW50IGZpbGVzCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaWdub3JlRmlsZVRpbWVzKSB7CisgICAgICAgICAgICAvL3NhbWUgZGF0ZSBpZiBkZXN0IHRpbWVzdGFtcCBpcyB3aXRoaW4gZ3JhbnVsYXJpdHkgb2YgdGhlIHNyY2ZpbGUKKyAgICAgICAgICAgIGJvb2xlYW4gc2FtZURhdGU7CisgICAgICAgICAgICBzYW1lRGF0ZSA9IGRlc3RmaWxlLmxhc3RNb2RpZmllZCgpID49IHNyY2ZpbGUubGFzdE1vZGlmaWVkKCkgLSBncmFudWxhcml0eQorICAgICAgICAgICAgICAgICAgICAmJiBkZXN0ZmlsZS5sYXN0TW9kaWZpZWQoKSA8PSBzcmNmaWxlLmxhc3RNb2RpZmllZCgpICsgZ3JhbnVsYXJpdHk7CisKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBkYXRlcyA9PiBkaWZmZXJlbnQgZmlsZXMKKyAgICAgICAgICAgIGlmICghc2FtZURhdGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlnbm9yZUNvbnRlbnRzKSB7CisgICAgICAgICAgICAvL2hlcmUgZG8gYSBidWxrIGNvbXBhcmlzb24KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMoc3JjZmlsZSwgZGVzdGZpbGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigid2hpbGUgY29tcGFyaW5nICIgKyBzcmNmaWxlICsgIiBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXN0ZmlsZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRXh0ZW5kRmlsZVNlbGVjdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRXh0ZW5kRmlsZVNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2NGQxMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9FeHRlbmRGaWxlU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyaXphYmxlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0byBiZSB1c2VkIGJ5IGFsbCBjdXN0b20gc2VsZWN0b3JzLCB0aG9zZSB0aGF0IGFyZQorICogY2FsbGVkIHRocm91Z2ggdGhlICZsdDtjdXN0b20mZ3Q7IHRhZy4gSXQgaXMgdGhlIGFtYWxnYW1hdGlvbiBvZiB0d28KKyAqIGludGVyZmFjZXMsIHRoZSBGaWxlU2VsZWN0b3IgYW5kIHRoZSBQYXJhbXRlcml6YWJsZSBpbnRlcmZhY2UuIE5vdGUgdGhhdAorICogeW91IHdpbGwgYWxtb3N0IGNlcnRhaW5seSB3YW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgaGFuZGxpbmcKKyAqIFBhcmFtZXRlcnMsIHNvIHlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSB0aGUgQmFzZUV4dGVuZFNlbGVjdG9yIGNsYXNzCisgKiBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgeW91ciBjdXN0b20gc2VsZWN0b3IgcmF0aGVyIHRoYW4gaW1wbGVtZW50aW5nCisgKiB0aGlzIGludGVyZmFjZSBmcm9tIHNjcmF0Y2guCisgKgorICogQHNpbmNlIDEuNQorICovCitwdWJsaWMgaW50ZXJmYWNlIEV4dGVuZEZpbGVTZWxlY3RvciBleHRlbmRzIEZpbGVTZWxlY3RvciwgUGFyYW1ldGVyaXphYmxlIHsKKworICAgIC8vIE5vIGZ1cnRoZXIgbWV0aG9kcyBuZWNlc3NhcnkuIFRoaXMgaXMganVzdCBhbiBhbWFsZ2FtYXRpb24gb2YgdHdvIG90aGVyCisgICAgLy8gaW50ZXJmYWNlcy4KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0V4dGVuZFNlbGVjdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRXh0ZW5kU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWJjMjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0V4dGVuZFNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworCisvKioKKyAqIFNlbGVjdG9yIHRoYXQgc2VsZWN0cyBmaWxlcyBieSBmb3J3YXJkaW5nIHRoZSByZXF1ZXN0IG9uIHRvIG90aGVyIGNsYXNzZXMuCisgKgorICogQHNpbmNlIDEuNQorICovCitwdWJsaWMgY2xhc3MgRXh0ZW5kU2VsZWN0b3IgZXh0ZW5kcyBCYXNlU2VsZWN0b3IgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NuYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIEZpbGVTZWxlY3RvciBkeW5zZWxlY3RvciA9IG51bGw7CisgICAgcHJpdmF0ZSBWZWN0b3IgcGFyYW1WZWMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBFeHRlbmRTZWxlY3RvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGFzc25hbWUgb2YgdGhlIGN1c3RvbSBzZWxlY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgaXMgdGhlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhpcyBzZWxlY3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyB0aGUgaWRlbnRpZmllZCBjdXN0b20gc2VsZWN0b3IgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0b3JDcmVhdGUoKSB7CisgICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCAmJiBjbGFzc25hbWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzIGMgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgYyA9IENsYXNzLmZvck5hbWUoY2xhc3NuYW1lLCB0cnVlLCBhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR5bnNlbGVjdG9yID0gKEZpbGVTZWxlY3RvcikgYy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHAuc2V0UHJvamVjdFJlZmVyZW5jZShkeW5zZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZleGNlcHQpIHsKKyAgICAgICAgICAgICAgICBzZXRFcnJvcigiU2VsZWN0b3IgIiArIGNsYXNzbmFtZQorICAgICAgICAgICAgICAgICAgICArICIgbm90IGluaXRpYWxpemVkLCBubyBzdWNoIGNsYXNzIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlleGNlcHQpIHsKKyAgICAgICAgICAgICAgICBzZXRFcnJvcigiU2VsZWN0b3IgIiArIGNsYXNzbmFtZQorICAgICAgICAgICAgICAgICAgICArICIgbm90IGluaXRpYWxpemVkLCBjb3VsZCBub3QgY3JlYXRlIGNsYXNzIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZXhjZXB0KSB7CisgICAgICAgICAgICAgICAgc2V0RXJyb3IoIlNlbGVjdG9yICIgKyBjbGFzc25hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBpbml0aWFsaXplZCwgY2xhc3Mgbm90IGFjY2Vzc2libGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEVycm9yKCJUaGVyZSBpcyBubyBjbGFzc25hbWUgc3BlY2lmaWVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHBhcmFtZXRlcnMgdG8gcGFzcyB0byBjdXN0b20gc2VsZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcCBUaGUgbmV3IFBhcmFtZXRlciBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbShQYXJhbWV0ZXIgcCkgeworICAgICAgICBwYXJhbVZlYy5hZGRFbGVtZW50KHApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gbG9hZCB0aGUgY2xhc3NuYW1lIHNwZWNpZmllZCB1c2luZyBhbiBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgdGhlIGNsYXNzcGF0aCB0byB1c2UgdG8gbG9hZCB0aGUgU2VsZWN0b3IgKG5lc3RlZCBlbGVtZW50KS4KKyAgICAgKiBAcmV0dXJuIGEgY2xhc3NwYXRoIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzcGF0aAorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBQYXRoIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byB1c2UgZm9yIGxvYWRpbmcgYSBjdXN0b20gc2VsZWN0b3IgYnkgdXNpbmcKKyAgICAgKiBhIHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0gciBhIHJlZmVyZW5jZSB0byB0aGUgY2xhc3NwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRocmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZXNlIGFyZSBlcnJvcnMgc3BlY2lmaWMgdG8gRXh0ZW5kU2VsZWN0b3Igb25seS4gSWYgdGhlcmUgYXJlCisgICAgICogZXJyb3JzIGluIHRoZSBjdXN0b20gc2VsZWN0b3IsIGl0IHNob3VsZCB0aHJvdyBhIEJ1aWxkRXhjZXB0aW9uCisgICAgICogd2hlbiBpc1NlbGVjdGVkKCkgaXMgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgeworICAgICAgICAvLyBDcmVhdGlvbiBpcyBkb25lIGhlcmUgcmF0aGVyIHRoYW4gaW4gaXNTZWxlY3RlZCgpIGJlY2F1c2Ugc29tZQorICAgICAgICAvLyBjb250YWluZXJzIG1heSBkbyBhIHZhbGlkYXRpb24gcGFzcyBiZWZvcmUgcnVubmluZyBpc1NlbGVjdGVkKCksCisgICAgICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBjcmVhdGVkIGNsYXNzLgorICAgICAgICBpZiAoZHluc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0b3JDcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhc3NuYW1lID09IG51bGwgfHwgY2xhc3NuYW1lLmxlbmd0aCgpIDwgMSkgeworICAgICAgICAgICAgc2V0RXJyb3IoIlRoZSBjbGFzc25hbWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIik7CisgICAgICAgIH0gZWxzZSBpZiAoZHluc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RXJyb3IoIkludGVybmFsIEVycm9yOiBUaGUgY3VzdG9tIHNlbGVjdG9yIHdhcyBub3QgY3JlYXRlZCIpOworICAgICAgICB9IGVsc2UgaWYgKCEoZHluc2VsZWN0b3IgaW5zdGFuY2VvZiBFeHRlbmRGaWxlU2VsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICYmIChwYXJhbVZlYy5zaXplKCkgPiAwKSkgeworICAgICAgICAgICAgc2V0RXJyb3IoIkNhbm5vdCBzZXQgcGFyYW1ldGVycyBvbiBjdXN0b20gc2VsZWN0b3IgdGhhdCBkb2VzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICsgImltcGxlbWVudCBFeHRlbmRGaWxlU2VsZWN0b3IiKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQWxsb3dzIHRoZSBjdXN0b20gc2VsZWN0b3IgdG8gY2hvb3NlIHdoZXRoZXIgdG8gc2VsZWN0IGEgZmlsZS4gVGhpcworICAgICAqIGlzIGFsc28gd2hlcmUgdGhlIFBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0byB0aGUgY3VzdG9tIHNlbGVjdG9yLAorICAgICAqIHNpbmNlIHdlIGtub3cgd2UgbXVzdCBoYXZlIHRoZW0gYWxsIGJ5IG5vdy4gQW5kIHNpbmNlIHdlIG11c3Qga25vdworICAgICAqIGJvdGggY2xhc3NwYXRoIGFuZCBjbGFzc25hbWUsIGNyZWF0aW5nIHRoZSBjbGFzcyBpcyBkZWZlcnJlZCB0byBoZXJlCisgICAgICogYXMgd2VsbC4KKyAgICAgKiBAcGFyYW0gYmFzZWRpciBUaGUgdGhlIGJhc2UgZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjay4KKyAgICAgKiBAcGFyYW0gZmlsZSBBIEZpbGUgb2JqZWN0IGZvciB0aGlzIGZpbGVuYW1lLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90LgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIGlmIChwYXJhbVZlYy5zaXplKCkgPiAwICYmIGR5bnNlbGVjdG9yIGluc3RhbmNlb2YgRXh0ZW5kRmlsZVNlbGVjdG9yKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbUFycmF5ID0gbmV3IFBhcmFtZXRlcltwYXJhbVZlYy5zaXplKCldOworICAgICAgICAgICAgcGFyYW1WZWMuY29weUludG8ocGFyYW1BcnJheSk7CisgICAgICAgICAgICAvLyBXZSBrbm93IHRoYXQgZHluc2VsZWN0b3IgbXVzdCBiZSBub24tbnVsbCBpZiBubyBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAoKEV4dGVuZEZpbGVTZWxlY3RvcikgZHluc2VsZWN0b3IpLnNldFBhcmFtZXRlcnMocGFyYW1BcnJheSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGR5bnNlbGVjdG9yLmlzU2VsZWN0ZWQoYmFzZWRpciwgZmlsZW5hbWUsIGZpbGUpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRmlsZVNlbGVjdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRmlsZVNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0YTk3MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9GaWxlU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIGJlIHVzZWQgYnkgYWxsIHNlbGVjdG9ycy4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmlsZVNlbGVjdG9yIHsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCB0aGF0IGVhY2ggc2VsZWN0b3Igd2lsbCBpbXBsZW1lbnQgdG8gY3JlYXRlIHRoZWlyCisgICAgICogc2VsZWN0aW9uIGJlaGF2aW91ci4gSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIHNldHVwCisgICAgICogb2YgYSBzZWxlY3RvciwgaXQgY2FuIHRocm93IGEgQnVpbGRFeGNlcHRpb24gdG8gaW5kaWNhdGUKKyAgICAgKiB0aGUgcHJvYmxlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlZGlyIEEgamF2YS5pby5GaWxlIG9iamVjdCBmb3IgdGhlIGJhc2UgZGlyZWN0b3J5CisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNoZWNrCisgICAgICogQHBhcmFtIGZpbGUgQSBGaWxlIG9iamVjdCBmb3IgdGhpcyBmaWxlbmFtZQorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90CisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgc2VsZWN0b3Igd2FzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseQorICAgICAqLworICAgIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKQorICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9GaWxlbmFtZVNlbGVjdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRmlsZW5hbWVTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWQ0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRmlsZW5hbWVTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CisKKy8qKgorICogU2VsZWN0b3IgdGhhdCBmaWx0ZXJzIGZpbGVzIGJhc2VkIG9uIHRoZSBmaWxlbmFtZS4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlbmFtZVNlbGVjdG9yIGV4dGVuZHMgQmFzZUV4dGVuZFNlbGVjdG9yIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm4gPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gdHJ1ZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBuZWdhdGVkID0gZmFsc2U7CisgICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9LRVkgPSAibmFtZSI7CisgICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9LRVkgPSAiY2FzZXNlbnNpdGl2ZSI7CisgICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVHQVRFX0tFWSA9ICJuZWdhdGUiOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GaWxlbmFtZVNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBGaWxlbmFtZVNlbGVjdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJ7ZmlsZW5hbWVzZWxlY3RvciBuYW1lOiAiKTsKKyAgICAgICAgYnVmLmFwcGVuZChwYXR0ZXJuKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIG5lZ2F0ZTogIik7CisgICAgICAgIGlmIChuZWdhdGVkKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJ0cnVlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJmYWxzZSIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBjYXNlc2Vuc2l0aXZlOiAiKTsKKyAgICAgICAgaWYgKGNhc2VzZW5zaXRpdmUpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInRydWUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoImZhbHNlIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUsIG9yIHRoZSBwYXR0ZXJuIGZvciB0aGUgbmFtZSwgdGhhdAorICAgICAqIHNob3VsZCBiZSB1c2VkIGZvciBzZWxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgZmlsZSBwYXR0ZXJuIHRoYXQgYW55IGZpbGVuYW1lIG11c3QgbWF0Y2gKKyAgICAgKiAgICAgICAgICAgICAgICBhZ2FpbnN0IGluIG9yZGVyIHRvIGJlIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgnXFwnLAorICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgIGlmIChwYXR0ZXJuLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgcGF0dGVybiArPSAiKioiOworICAgICAgICB9CisgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBpZ25vcmUgY2FzZSB3aGVuIGNoZWNraW5nIGZpbGVuYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXNlc2Vuc2l0aXZlIHdoZXRoZXIgdG8gcGF5IGF0dGVudGlvbiB0byBjYXNlIHNlbnNpdGl2aXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FzZXNlbnNpdGl2ZShib29sZWFuIGNhc2VzZW5zaXRpdmUpIHsKKyAgICAgICAgdGhpcy5jYXNlc2Vuc2l0aXZlID0gY2FzZXNlbnNpdGl2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgcmV2ZXJzZSB0aGUgc2VsZWN0aW9uIG9mIHRoaXMgc2VsZWN0b3IsCisgICAgICogdGhlcmVieSBlbXVsYXRpbmcgYW4gJmx0O2V4Y2x1ZGUmZ3Q7IHRhZywgYnkgc2V0dGluZyB0aGUgYXR0cmlidXRlCisgICAgICogbmVnYXRlIHRvIHRydWUuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHN1cnJvdW5kaW5nIHRoZSBzZWxlY3RvcgorICAgICAqIHdpdGggJmx0O25vdCZndDsmbHQ7L25vdCZndDsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmVnYXRlZCB3aGV0aGVyIHRvIG5lZ2F0ZSB0aGlzIHNlbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5lZ2F0ZShib29sZWFuIG5lZ2F0ZWQpIHsKKyAgICAgICAgdGhpcy5uZWdhdGVkID0gbmVnYXRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHVzaW5nIHRoaXMgYXMgYSBjdXN0b20gc2VsZWN0b3IsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLgorICAgICAqIEl0IHRyYW5zbGF0ZXMgZWFjaCBwYXJhbWV0ZXIgaW50byB0aGUgYXBwcm9wcmlhdGUgc2V0WFhYKCkgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBjb21wbGV0ZSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhpcyBzZWxlY3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1uYW1lID0gcGFyYW1ldGVyc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKE5BTUVfS0VZLmVxdWFsc0lnbm9yZUNhc2UocGFyYW1uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBzZXROYW1lKHBhcmFtZXRlcnNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDQVNFX0tFWS5lcXVhbHNJZ25vcmVDYXNlKHBhcmFtbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Q2FzZXNlbnNpdGl2ZShQcm9qZWN0LnRvQm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW2ldLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE5FR0FURV9LRVkuZXF1YWxzSWdub3JlQ2FzZShwYXJhbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5lZ2F0ZShQcm9qZWN0LnRvQm9vbGVhbihwYXJhbWV0ZXJzW2ldLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigiSW52YWxpZCBwYXJhbWV0ZXIgIiArIHBhcmFtbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRvIG1ha2Ugc3VyZSBhbGwgc2V0dGluZ3MgYXJlIGtvc2hlci4gSW4gdGhpcyBjYXNlLCBpdAorICAgICAqIG1lYW5zIHRoYXQgdGhlIG5hbWUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgeworICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRFcnJvcigiVGhlIG5hbWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gVGhpcyBpcyB3aGVyZSB0aGUgc2VsZWN0b3IgZ2V0cyB0byBkZWNpZGUKKyAgICAgKiBvbiB0aGUgaW5jbHVzaW9uIG9mIGEgZmlsZSBpbiBhIHBhcnRpY3VsYXIgZmlsZXNldC4gTW9zdCBvZiB0aGUgd29yaworICAgICAqIGZvciB0aGlzIHNlbGVjdG9yIGlzIG9mZmxvYWRlZCBpbnRvIFNlbGVjdG9yVXRpbHMsIGEgc3RhdGljIGNsYXNzCisgICAgICogdGhhdCBwcm92aWRlcyB0aGUgc2FtZSBzZXJ2aWNlcyBmb3IgYm90aCBGaWxlbmFtZVNlbGVjdG9yIGFuZAorICAgICAqIERpcmVjdG9yeVNjYW5uZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciB0aGUgYmFzZSBkaXJlY3RvcnkgdGhlIHNjYW4gaXMgYmVpbmcgZG9uZSBmcm9tCisgICAgICogQHBhcmFtIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNoZWNrCisgICAgICogQHBhcmFtIGZpbGUgaXMgYSBqYXZhLmlvLkZpbGUgb2JqZWN0IHRoZSBzZWxlY3RvciBjYW4gdXNlCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZCBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKworICAgICAgICByZXR1cm4gKFNlbGVjdG9yVXRpbHMubWF0Y2hQYXRoKHBhdHRlcm4sIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgIGNhc2VzZW5zaXRpdmUpID09ICEobmVnYXRlZCkpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTWFqb3JpdHlTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01ham9yaXR5U2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzdlZThlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01ham9yaXR5U2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICogVGhpcyBzZWxlY3RvciBpcyBoZXJlIGp1c3QgdG8gc2hha2UgdXAgeW91ciB0aGlua2luZyBhIGJpdC4gRG9uJ3QgZ2V0CisgKiB0b28gY2F1Z2h0IHVwIGluIGJvb2xlYW4sIHRoZXJlIGFyZSBvdGhlciB3YXlzIHlvdSBjYW4gZXZhbHVhdGUgYQorICogY29sbGVjdGlvbiBvZiBzZWxlY3RvcnMuIFRoaXMgb25lIHRha2VzIGEgdm90ZSBvZiB0aGUgc2VsZWN0b3JzIGl0CisgKiBjb250YWlucywgYW5kIG1ham9yaXR5IHdpbnMuIFlvdSBjb3VsZCBhbHNvIGhhdmUgYW4gImFsbC1idXQtb25lIgorICogc2VsZWN0b3IsIGEgIndlaWdodGVkLWF2ZXJhZ2UiIHNlbGVjdG9yLCBhbmQgc28gb24uIFRoZXNlIGFyZSBsZWZ0CisgKiBhcyBleGVyY2lzZXMgZm9yIHRoZSByZWFkZXIgKGFzIGFyZSB0aGUgdXNlY2FzZXMgd2hlcmUgdGhpcyB3b3VsZAorICogYmUgbmVjZXNzYXJ5KS4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBNYWpvcml0eVNlbGVjdG9yIGV4dGVuZHMgQmFzZVNlbGVjdG9yQ29udGFpbmVyIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd3RpZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBNYWpvcml0eVNlbGVjdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChoYXNTZWxlY3RvcnMoKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgie21ham9yaXR5c2VsZWN0OiAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJ9Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgYXR0cmlidXRlIHRvIHNwZWNpZnkgd2hhdCB3aWxsIGhhcHBlbiBpZiBudW1iZXIKKyAgICAgKiBvZiB5ZXMgdm90ZXMgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBubyB2b3RlcworICAgICAqIGRlZmF1bHRzIHRvIHRydWUKKyAgICAgKgorICAgICAqIEBwYXJhbSB0aWVicmVha2VyIHRoZSB2YWx1ZSB0byBnaXZlIGlmIHRoZXJlIGlzIGEgdGllCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxsb3d0aWUoYm9vbGVhbiB0aWVicmVha2VyKSB7CisgICAgICAgIGFsbG93dGllID0gdGllYnJlYWtlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgKHRoZSBmaWxlIGlzIHNlbGVjdGVkKSBpZiBtb3N0IG9mIHRoZSBvdGhlciBzZWxlY3RvcnMKKyAgICAgKiBhZ3JlZS4gSW4gY2FzZSBvZiBhIHRpZSwgZ28gYnkgdGhlIGFsbG93dGllIHNldHRpbmcuIFRoYXQgZGVmYXVsdHMKKyAgICAgKiB0byB0cnVlLCBtZWFuaW5nIGluIGNhc2Ugb2YgYSB0aWUsIHRoZSBmaWxlIGlzIHNlbGVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VkaXIgdGhlIGJhc2UgZGlyZWN0b3J5IHRoZSBzY2FuIGlzIGJlaW5nIGRvbmUgZnJvbQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBmaWxlIGlzIGEgamF2YS5pby5GaWxlIG9iamVjdCBmb3IgdGhlIGZpbGVuYW1lIHRoYXQgdGhlIHNlbGVjdG9yCisgICAgICogY2FuIHVzZQorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIGludCB5ZXN2b3RlcyA9IDA7CisgICAgICAgIGludCBub3ZvdGVzID0gMDsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHNlbGVjdG9yRWxlbWVudHMoKTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQ7CisKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICgoRmlsZVNlbGVjdG9yKSBlLm5leHRFbGVtZW50KCkpLmlzU2VsZWN0ZWQoYmFzZWRpciwKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGZpbGUpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHllc3ZvdGVzID0geWVzdm90ZXMgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBub3ZvdGVzID0gbm92b3RlcyArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHllc3ZvdGVzID4gbm92b3RlcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAobm92b3RlcyA+IHllc3ZvdGVzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSBoYXZlIGEgdGllLgorICAgICAgICByZXR1cm4gYWxsb3d0aWU7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTWFwcGluZ1NlbGVjdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTWFwcGluZ1NlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzNTYwNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9NYXBwaW5nU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLklkZW50aXR5TWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQSBtYXBwaW5nIHNlbGVjdG9yIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFkZGluZyBtYXBwaW5nIHN1cHBvcnQgdG8gdGhlIGJhc2UKKyAqIHNlbGVjdG9yCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNYXBwaW5nU2VsZWN0b3IgZXh0ZW5kcyBCYXNlU2VsZWN0b3IgeworCisgICAgLyoqIFV0aWxpdGllcyB1c2VkIGZvciBmaWxlIG9wZXJhdGlvbnMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisKKyAgICBwcm90ZWN0ZWQgRmlsZSB0YXJnZXRkaXIgPSBudWxsOworICAgIHByb3RlY3RlZCBNYXBwZXIgbWFwcGVyRWxlbWVudCA9IG51bGw7CisgICAgcHJvdGVjdGVkIEZpbGVOYW1lTWFwcGVyIG1hcCA9IG51bGw7CisgICAgcHJvdGVjdGVkIGludCBncmFudWxhcml0eSA9IDA7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwaW5nU2VsZWN0b3I8L2NvZGU+IGluc3RhbmNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIE1hcHBpbmdTZWxlY3RvcigpIHsKKyAgICAgICAgZ3JhbnVsYXJpdHkgPSAoaW50KSBGSUxFX1VUSUxTLmdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHdoaWNoIGlzIGNoZWNrZWQgZm9yIG91dC1vZi1kYXRlCisgICAgICogZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0ZGlyIHRoZSBkaXJlY3RvcnkgdG8gc2NhbiBsb29raW5nIGZvciBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRkaXIoRmlsZSB0YXJnZXRkaXIpIHsKKyAgICAgICAgdGhpcy50YXJnZXRkaXIgPSB0YXJnZXRkaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgRmlsZU5hbWVNYXBwZXIgdG8gdXNlIChuZXN0ZWQgbWFwcGVyIGVsZW1lbnQpLgorICAgICAqIEByZXR1cm4gYSBtYXBwZXIgdG8gYmUgY29uZmlndXJlZAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgbW9yZSB0aGF0IG9uZSBtYXBwZXIgZGVmaW5lZAorICAgICAqLworICAgIHB1YmxpYyBNYXBwZXIgY3JlYXRlTWFwcGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgZGVmaW5lIG1vcmUgdGhhbiBvbmUgbWFwcGVyIik7CisgICAgICAgIH0KKyAgICAgICAgbWFwcGVyRWxlbWVudCA9IG5ldyBNYXBwZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgcmV0dXJuIG1hcHBlckVsZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRvIG1ha2Ugc3VyZSBhbGwgc2V0dGluZ3MgYXJlIGtvc2hlci4gSW4gdGhpcyBjYXNlLCBpdAorICAgICAqIG1lYW5zIHRoYXQgdGhlIGRlc3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldCBhbmQgd2UgaGF2ZSBhIG1hcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlTZXR0aW5ncygpIHsKKyAgICAgICAgaWYgKHRhcmdldGRpciA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRFcnJvcigiVGhlIHRhcmdldGRpciBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgbWFwID0gbmV3IElkZW50aXR5TWFwcGVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXAgPSBtYXBwZXJFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRFcnJvcigiQ291bGQgbm90IHNldCA8bWFwcGVyPiBlbGVtZW50LiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIFRoaXMgaXMgd2hlcmUgdGhlIHNlbGVjdG9yIGdldHMgdG8gZGVjaWRlCisgICAgICogb24gdGhlIGluY2x1c2lvbiBvZiBhIGZpbGUgaW4gYSBwYXJ0aWN1bGFyIGZpbGVzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciB0aGUgYmFzZSBkaXJlY3RvcnkgdGhlIHNjYW4gaXMgYmVpbmcgZG9uZSBmcm9tCisgICAgICogQHBhcmFtIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNoZWNrCisgICAgICogQHBhcmFtIGZpbGUgaXMgYSBqYXZhLmlvLkZpbGUgb2JqZWN0IHRoZSBzZWxlY3RvciBjYW4gdXNlCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZCBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKKworICAgICAgICAvLyB0aHJvdyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIC8vIERldGVybWluZSBmaWxlIHdob3NlIG91dC1vZi1kYXRlbmVzcyBpcyB0byBiZSBjaGVja2VkCisgICAgICAgIFN0cmluZ1tdIGRlc3RmaWxlcyA9IG1hcC5tYXBGaWxlTmFtZShmaWxlbmFtZSk7CisgICAgICAgIC8vIElmIGZpbGVuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBUbyBhdHRyaWJ1dGUgb2YgdGhlIG1hcHBlcgorICAgICAgICAvLyB0aGVuIGZpbHRlciBpdCBvdXQgb2YgdGhlIGZpbGVzIHdlIGFyZSBjb25zaWRlcmluZworICAgICAgICBpZiAoZGVzdGZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBTYW5pdHkgY2hlY2sKKyAgICAgICAgaWYgKGRlc3RmaWxlcy5sZW5ndGggIT0gMSB8fCBkZXN0ZmlsZXNbMF0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIGRlc3RpbmF0aW9uIGZpbGUgcmVzdWx0cyBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIHRhcmdldGRpci5nZXROYW1lKCkgKyAiIHdpdGggZmlsZW5hbWUgIiArIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGVzdG5hbWUgPSBkZXN0ZmlsZXNbMF07CisgICAgICAgIEZpbGUgZGVzdGZpbGUgPSBuZXcgRmlsZSh0YXJnZXRkaXIsIGRlc3RuYW1lKTsKKworICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gc2VsZWN0aW9uVGVzdChmaWxlLCBkZXN0ZmlsZSk7CisgICAgICAgIHJldHVybiBzZWxlY3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIHRlc3QgaXMgb3VyIHNlbGVjdGlvbiB0ZXN0IHRoYXQgY29tcGFyZWQgdGhlIGZpbGUgd2l0aCB0aGUgZGVzdGZpbGUKKyAgICAgKiBAcGFyYW0gc3JjZmlsZSBmaWxlIHRvIHRlc3Q7IG1heSBiZSBudWxsCisgICAgICogQHBhcmFtIGRlc3RmaWxlIGRlc3RpbmF0aW9uIGZpbGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc291cmNlIGZpbGUgY29tcGFyZXMgd2l0aCBkZXN0aW5hdGlvbiBmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc2VsZWN0aW9uVGVzdChGaWxlIHNyY2ZpbGUsIEZpbGUgZGVzdGZpbGUpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgd2Ugd2lsbCBnaXZlIGJlZm9yZSB3ZSBjb25zaWRlcgorICAgICAqIGEgZmlsZSBvdXQgb2YgZGF0ZS4gRGVmYXVsdHMgdG8gMjAwMCBvbiBNUy1ET1MgZGVyaXZhdGl2ZXMgYW5kIDEwMDAgb24KKyAgICAgKiBvdGhlcnMuCisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IHRoZSBsZWV3YXkgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JhbnVsYXJpdHkoaW50IGdyYW51bGFyaXR5KSB7CisgICAgICAgIHRoaXMuZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ob25lU2VsZWN0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ob25lU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDFmMDAxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL05vbmVTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCisvKioKKyAqIFRoaXMgc2VsZWN0b3IgaGFzIGEgY29sbGVjdGlvbiBvZiBvdGhlciBzZWxlY3RvcnMuIEFsbCBvZiB0aG9zZSBzZWxlY3RvcnMKKyAqIG11c3QgcmVmdXNlIHRvIHNlbGVjdCBhIGZpbGUgYmVmb3JlIHRoZSBmaWxlIGlzIGNvbnNpZGVyZWQgc2VsZWN0ZWQgYnkKKyAqIHRoaXMgc2VsZWN0b3IuCisgKgorICogQHNpbmNlIDEuNQorICovCitwdWJsaWMgY2xhc3MgTm9uZVNlbGVjdG9yIGV4dGVuZHMgQmFzZVNlbGVjdG9yQ29udGFpbmVyIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIE5vbmVTZWxlY3RvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWxlY3RvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChoYXNTZWxlY3RvcnMoKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgie25vbmVzZWxlY3Q6ICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlICh0aGUgZmlsZSBpcyBzZWxlY3RlZCkgb25seSBpZiBhbGwgb3RoZXIgc2VsZWN0b3JzCisgICAgICogYWdyZWUgdGhhdCB0aGUgZmlsZSBzaG91bGQgbm90IGJlIHNlbGVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VkaXIgdGhlIGJhc2UgZGlyZWN0b3J5IHRoZSBzY2FuIGlzIGJlaW5nIGRvbmUgZnJvbQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBmaWxlIGlzIGEgamF2YS5pby5GaWxlIG9iamVjdCBmb3IgdGhlIGZpbGVuYW1lIHRoYXQgdGhlIHNlbGVjdG9yCisgICAgICogY2FuIHVzZQorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBzZWxlY3RvckVsZW1lbnRzKCk7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0OworCisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKEZpbGVTZWxlY3RvcikgZS5uZXh0RWxlbWVudCgpKS5pc1NlbGVjdGVkKGJhc2VkaXIsCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ob3RTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL05vdFNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmZjk3YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ob3RTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKKworLyoqCisgKiBUaGlzIHNlbGVjdG9yIGhhcyBvbmUgb3RoZXIgc2VsZWN0b3JzIHdob3NlIG1lYW5pbmcgaXQgaW52ZXJ0cy4gSXQKKyAqIGFjdHVhbGx5IHJlbGllcyBvbiBOb25lU2VsZWN0b3IgZm9yIGl0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGlzU2VsZWN0ZWQoKSBtZXRob2QsIGJ1dCBpdCBhZGRzIGEgY2hlY2sgdG8gZW5zdXJlIHRoZXJlIGlzIG9ubHkgb25lCisgKiBvdGhlciBzZWxlY3RvciBjb250YWluZWQgd2l0aGluLgorICoKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGNsYXNzIE5vdFNlbGVjdG9yIGV4dGVuZHMgTm9uZVNlbGVjdG9yIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIE5vdFNlbGVjdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRoYXQgaW52ZXJ0cyB0aGUgbWVhbmluZyBvZiBpdHMgYXJndW1lbnQuCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBzZWxlY3RvciB0byBpbnZlcnQKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBOb3RTZWxlY3RvcihGaWxlU2VsZWN0b3Igb3RoZXIpIHsKKyAgICAgICAgdGhpcygpOworICAgICAgICBhcHBlbmRTZWxlY3RvcihvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2VsZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpZiAoaGFzU2VsZWN0b3JzKCkpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIntub3RzZWxlY3Q6ICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgc3VyZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGVudHJ5LCBzZXRzIGFuIGVycm9yIG1lc3NhZ2UgaWYKKyAgICAgKiBub3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmVyaWZ5U2V0dGluZ3MoKSB7CisgICAgICAgIGlmIChzZWxlY3RvckNvdW50KCkgIT0gMSkgeworICAgICAgICAgICAgc2V0RXJyb3IoIk9uZSBhbmQgb25seSBvbmUgc2VsZWN0b3IgaXMgYWxsb3dlZCB3aXRoaW4gdGhlICIKKyAgICAgICAgICAgICAgICArICI8bm90PiB0YWciKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvT3JTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL09yU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTgzM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL09yU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqCisgKiBUaGlzIHNlbGVjdG9yIGhhcyBhIGNvbGxlY3Rpb24gb2Ygb3RoZXIgc2VsZWN0b3JzLCBhbnkgb2Ygd2hpY2ggaGF2ZSB0bworICogc2VsZWN0IGEgZmlsZSBpbiBvcmRlciBmb3IgdGhpcyBzZWxlY3RvciB0byBzZWxlY3QgaXQuCisgKgorICogQHNpbmNlIDEuNQorICovCitwdWJsaWMgY2xhc3MgT3JTZWxlY3RvciBleHRlbmRzIEJhc2VTZWxlY3RvckNvbnRhaW5lciB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBPclNlbGVjdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlbGVjdG9yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKGhhc1NlbGVjdG9ycygpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJ7b3JzZWxlY3Q6ICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlICh0aGUgZmlsZSBpcyBzZWxlY3RlZCkgaWYgYW55IG9mIHRoZSBvdGhlciBzZWxlY3RvcnMKKyAgICAgKiBhZ3JlZSB0aGF0IHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlZGlyIHRoZSBiYXNlIGRpcmVjdG9yeSB0aGUgc2NhbiBpcyBiZWluZyBkb25lIGZyb20KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY2hlY2sKKyAgICAgKiBAcGFyYW0gZmlsZSBhIGphdmEuaW8uRmlsZSBvYmplY3QgZm9yIHRoZSBmaWxlbmFtZSB0aGF0IHRoZSBzZWxlY3RvcgorICAgICAqIGNhbiB1c2UKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlIHNlbGVjdGVkIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgeworICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gc2VsZWN0b3JFbGVtZW50cygpOworICAgICAgICBib29sZWFuIHJlc3VsdDsKKworICAgICAgICAvLyBGaXJzdCwgY2hlY2sgdGhhdCBhbGwgZWxlbWVudHMgYXJlIGNvcnJlY3RseSBjb25maWd1cmVkCisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKEZpbGVTZWxlY3RvcikgZS5uZXh0RWxlbWVudCgpKS5pc1NlbGVjdGVkKGJhc2VkaXIsCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9QcmVzZW50U2VsZWN0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9QcmVzZW50U2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI1NzhhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1ByZXNlbnRTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLklkZW50aXR5TWFwcGVyOworCisvKioKKyAqIFNlbGVjdG9yIHRoYXQgZmlsdGVycyBmaWxlcyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXBwZWFyIGluIGFub3RoZXIKKyAqIGRpcmVjdG9yeSB0cmVlLiBJdCBjYW4gY29udGFpbiBhIG1hcHBlciBlbGVtZW50LCBzbyBpc24ndCBhdmFpbGFibGUKKyAqIGFzIGFuIEV4dGVuZFNlbGVjdG9yIChzaW5jZSB0aG9zZSBwYXJhbWV0ZXJzIGNhbid0IGhvbGQgb3RoZXIKKyAqIGVsZW1lbnRzKS4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBQcmVzZW50U2VsZWN0b3IgZXh0ZW5kcyBCYXNlU2VsZWN0b3IgeworCisgICAgcHJpdmF0ZSBGaWxlIHRhcmdldGRpciA9IG51bGw7CisgICAgcHJpdmF0ZSBNYXBwZXIgbWFwcGVyRWxlbWVudCA9IG51bGw7CisgICAgcHJpdmF0ZSBGaWxlTmFtZU1hcHBlciBtYXAgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBkZXN0bXVzdGV4aXN0ID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJlc2VudFNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBQcmVzZW50U2VsZWN0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIntwcmVzZW50c2VsZWN0b3IgdGFyZ2V0ZGlyOiAiKTsKKyAgICAgICAgaWYgKHRhcmdldGRpciA9PSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJOT1QgWUVUIFNFVCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmLmFwcGVuZCh0YXJnZXRkaXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIgcHJlc2VudDogIik7CisgICAgICAgIGlmIChkZXN0bXVzdGV4aXN0KSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJib3RoIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJzcmNvbmx5Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKG1hcC50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtYXBwZXJFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobWFwcGVyRWxlbWVudC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJ9Iik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBvciBkaXJlY3Rvcnkgd2hpY2ggaXMgY2hlY2tlZCBmb3IgbWF0Y2hpbmcKKyAgICAgKiBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXRkaXIgdGhlIGRpcmVjdG9yeSB0byBzY2FuIGxvb2tpbmcgZm9yIG1hdGNoaW5nIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldGRpcihGaWxlIHRhcmdldGRpcikgeworICAgICAgICB0aGlzLnRhcmdldGRpciA9IHRhcmdldGRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBGaWxlTmFtZU1hcHBlciB0byB1c2UgKG5lc3RlZCBtYXBwZXIgZWxlbWVudCkuCisgICAgICogQHJldHVybiBhIG1hcHBlciB0byBiZSBjb25maWd1cmVkCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBtb3JlIHRoYXQgb25lIG1hcHBlciBkZWZpbmVkCisgICAgICovCisgICAgcHVibGljIE1hcHBlciBjcmVhdGVNYXBwZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAobWFwcGVyRWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBkZWZpbmUgbW9yZSB0aGFuIG9uZSBtYXBwZXIiKTsKKyAgICAgICAgfQorICAgICAgICBtYXBwZXJFbGVtZW50ID0gbmV3IE1hcHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICByZXR1cm4gbWFwcGVyRWxlbWVudDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgc2V0cyB3aGV0aGVyIHRvIHNlbGVjdCBhIGZpbGUgaWYgaXRzIGRlc3QgZmlsZSBpcyBwcmVzZW50LgorICAgICAqIEl0IGNvdWxkIGJlIGEgPGNvZGU+bmVnYXRlPC9jb2RlPiBib29sZWFuLCBidXQgYnkgZG9pbmcgdGhpbmdzCisgICAgICogdGhpcyB3YXksIHdlIGdldCBzb21lIGRvY3VtZW50YXRpb24gb24gaG93IHRoZSBzeXN0ZW0gd29ya3MuCisgICAgICogQSB1c2VyIGxvb2tpbmcgYXQgdGhlIGRvY3VtZW50YXRpb24gc2hvdWxkIGNsZWFybHkgdW5kZXJzdGFuZAorICAgICAqIHRoYXQgdGhlIE9OTFkgZmlsZXMgd2hvc2UgcHJlc2VuY2UgaXMgYmVpbmcgdGVzdGVkIGFyZSB0aG9zZQorICAgICAqIHRoYXQgYWxyZWFkeSBleGlzdCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSwgaGVuY2UgdGhlIGxhY2sgb2YKKyAgICAgKiBhIDxjb2RlPmRlc3Rvbmx5PC9jb2RlPiBvcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnAgQW4gYXR0cmlidXRlIHNldCB0byBlaXRoZXIgPGNvZGU+c3Jjb25seTwvY29kZSBvcgorICAgICAqICAgICAgICAgICA8Y29kZT5ib3RoPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVzZW50KEZpbGVQcmVzZW5jZSBmcCkgeworICAgICAgICBpZiAoZnAuZ2V0SW5kZXgoKSA9PSAwKSB7CisgICAgICAgICAgICBkZXN0bXVzdGV4aXN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gbWFrZSBzdXJlIGFsbCBzZXR0aW5ncyBhcmUga29zaGVyLiBJbiB0aGlzIGNhc2UsIGl0CisgICAgICogbWVhbnMgdGhhdCB0aGUgdGFyZ2V0ZGlyIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQgYW5kIHdlIGhhdmUgYSBtYXBwZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmVyaWZ5U2V0dGluZ3MoKSB7CisgICAgICAgIGlmICh0YXJnZXRkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RXJyb3IoIlRoZSB0YXJnZXRkaXIgYXR0cmlidXRlIGlzIHJlcXVpcmVkLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXBwZXJFbGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1hcCA9IG5ldyBJZGVudGl0eU1hcHBlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFwID0gbWFwcGVyRWxlbWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RXJyb3IoIkNvdWxkIG5vdCBzZXQgPG1hcHBlcj4gZWxlbWVudC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBoZWFydCBvZiB0aGUgbWF0dGVyLiBUaGlzIGlzIHdoZXJlIHRoZSBzZWxlY3RvciBnZXRzIHRvIGRlY2lkZQorICAgICAqIG9uIHRoZSBpbmNsdXNpb24gb2YgYSBmaWxlIGluIGEgcGFydGljdWxhciBmaWxlc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VkaXIgdGhlIGJhc2UgZGlyZWN0b3J5IHRoZSBzY2FuIGlzIGJlaW5nIGRvbmUgZnJvbQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBmaWxlIGlzIGEgamF2YS5pby5GaWxlIG9iamVjdCB0aGUgc2VsZWN0b3IgY2FuIHVzZQorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CisKKyAgICAgICAgLy8gdGhyb3cgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgICAgdmFsaWRhdGUoKTsKKworICAgICAgICAvLyBEZXRlcm1pbmUgZmlsZSB3aG9zZSBleGlzdGVuY2UgaXMgdG8gYmUgY2hlY2tlZAorICAgICAgICBTdHJpbmdbXSBkZXN0ZmlsZXMgPSBtYXAubWFwRmlsZU5hbWUoZmlsZW5hbWUpOworICAgICAgICAvLyBJZiBmaWxlbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgVG8gYXR0cmlidXRlIG9mIHRoZSBtYXBwZXIKKyAgICAgICAgLy8gdGhlbiBmaWx0ZXIgaXQgb3V0IG9mIHRoZSBmaWxlcyB3ZSBhcmUgY29uc2lkZXJpbmcKKyAgICAgICAgaWYgKGRlc3RmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgICAgIGlmIChkZXN0ZmlsZXMubGVuZ3RoICE9IDEgfHwgZGVzdGZpbGVzWzBdID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBkZXN0aW5hdGlvbiBmaWxlIHJlc3VsdHMgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgKyB0YXJnZXRkaXIgKyAiIHdpdGggZmlsZW5hbWUgIiArIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGVzdG5hbWUgPSBkZXN0ZmlsZXNbMF07CisgICAgICAgIEZpbGUgZGVzdGZpbGUgPSBuZXcgRmlsZSh0YXJnZXRkaXIsIGRlc3RuYW1lKTsKKyAgICAgICAgcmV0dXJuIGRlc3RmaWxlLmV4aXN0cygpID09IGRlc3RtdXN0ZXhpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWVzIGZvciBpbmRpY2F0aW5nIHdoZXJlIGEgZmlsZSdzCisgICAgICogcHJlc2VuY2UgaXMgYWxsb3dlZCBhbmQgcmVxdWlyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlUHJlc2VuY2UgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlcyBhcyBhbiBhcnJheSBvZiBzdHJpbmdzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsic3Jjb25seSIsICJib3RoIn07CisgICAgICAgIH0KKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdFNlbGVjdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2VsZWN0U2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTk2MTZlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdFNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBUaGlzIHNlbGVjdG9yIGp1c3QgaG9sZHMgb25lIG90aGVyIHNlbGVjdG9yIGFuZCBmb3J3YXJkcyBhbGwKKyAqIHJlcXVlc3RzIHRvIGl0LiBJdCBleGlzdHMgc28gdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSBzZWxlY3RvcgorICogdHlwZSB0aGF0IGNhbiBleGlzdCBvdXRzaWRlIG9mIGFueSB0YXJnZXRzLCBhcyBhbiBlbGVtZW50IG9mCisgKiBwcm9qZWN0LiBJdCBvdmVycmlkZXMgYWxsIG9mIHRoZSByZWZlcmVuY2Ugc3R1ZmYgc28gdGhhdCBpdAorICogd29ya3MgYXMgZXhwZWN0ZWQuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHNlbGVjdG9yIHlvdQorICogY2FuIHJlZmVyZW5jZS4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBTZWxlY3RTZWxlY3RvciBleHRlbmRzIEJhc2VTZWxlY3RvckNvbnRhaW5lciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBpZlByb3BlcnR5OworICAgIHByaXZhdGUgU3RyaW5nIHVubGVzc1Byb3BlcnR5OworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0U2VsZWN0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKGhhc1NlbGVjdG9ycygpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJ7c2VsZWN0Iik7CisgICAgICAgICAgICBpZiAoaWZQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIGlmOiAiKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGlmUHJvcGVydHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVubGVzc1Byb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgdW5sZXNzOiAiKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHVubGVzc1Byb3BlcnR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJ9Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBjaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiByZWZlcmVuY2VkIFNlbGVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgU2VsZWN0U2VsZWN0b3IgZ2V0UmVmKCkgeworICAgICAgICBPYmplY3QgbyA9IGdldENoZWNrZWRSZWYodGhpcy5nZXRDbGFzcygpLCAiU2VsZWN0U2VsZWN0b3IiKTsKKyAgICAgICAgcmV0dXJuIChTZWxlY3RTZWxlY3RvcikgbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBhcmUgYW55IHNlbGVjdG9ycyBoZXJlLgorICAgICAqIEByZXR1cm4gd2hldGhlciBhbnkgc2VsZWN0b3JzIGFyZSBpbiB0aGlzIGNvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1NlbGVjdG9ycygpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5oYXNTZWxlY3RvcnMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuaGFzU2VsZWN0b3JzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZXMgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIGluIHRoaXMgY29udGFpbmVyCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2VsZWN0b3JDb3VudCgpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5zZWxlY3RvckNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnNlbGVjdG9yQ291bnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc2VsZWN0b3JzIGFzIGFuIGFycmF5LgorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyBGaWxlU2VsZWN0b3JbXSBnZXRTZWxlY3RvcnMoUHJvamVjdCBwKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0U2VsZWN0b3JzKHApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRTZWxlY3RvcnMocCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdG9yIGZvciBhY2Nlc3NpbmcgdGhlIHNldCBvZiBzZWxlY3RvcnMuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdG9yIHRoYXQgZ29lcyB0aHJvdWdoIGVhY2ggb2YgdGhlIHNlbGVjdG9ycworICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBzZWxlY3RvckVsZW1lbnRzKCkgeworICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNlbGVjdG9yRWxlbWVudHMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuc2VsZWN0b3JFbGVtZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBzZWxlY3RvciBpbnRvIHRoaXMgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBuZXcgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kU2VsZWN0b3IoRmlsZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLmFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1ha2VzIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBlbnRyeSwgc2V0cyBhbiBlcnJvciBtZXNzYWdlIGlmCisgICAgICogbm90LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgeworICAgICAgICBpbnQgY250ID0gc2VsZWN0b3JDb3VudCgpOworICAgICAgICBpZiAoY250IDwgMCB8fCBjbnQgPiAxKSB7CisgICAgICAgICAgICBzZXRFcnJvcigiT25seSBvbmUgc2VsZWN0b3IgaXMgYWxsb3dlZCB3aXRoaW4gdGhlICIKKyAgICAgICAgICAgICAgICArICI8c2VsZWN0b3I+IHRhZyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IHRoZSBzZWxlY3RvciBwYXNzZXMgdGhlIGNvbmRpdGlvbnMgcGxhY2VkCisgICAgICogb24gaXQgd2l0aCA8Y29kZT5pZjwvY29kZT4gYW5kIDxjb2RlPnVubGVzczwvY29kZT4uCisgICAgICogQHJldHVybiB0cnVlIGlmIGNvbmRpdGlvbnMgYXJlIHBhc3NlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBhc3Nlc0NvbmRpdGlvbnMoKSB7CisgICAgICAgIGlmIChpZlByb3BlcnR5ICE9IG51bGwKKyAgICAgICAgICAgICYmIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShpZlByb3BlcnR5KSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAodW5sZXNzUHJvcGVydHkgIT0gbnVsbAorICAgICAgICAgICAgJiYgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KHVubGVzc1Byb3BlcnR5KSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaWYgYXR0cmlidXRlIHRvIGEgcHJvcGVydHkgd2hpY2ggbXVzdCBleGlzdCBmb3IgdGhlCisgICAgICogc2VsZWN0b3IgdG8gc2VsZWN0IGFueSBmaWxlcy4KKyAgICAgKiBAcGFyYW0gaWZQcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gY2hlY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZihTdHJpbmcgaWZQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLmlmUHJvcGVydHkgPSBpZlByb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHVubGVzcyBhdHRyaWJ1dGUgdG8gYSBwcm9wZXJ0eSB3aGljaCBjYW5ub3QgZXhpc3QgZm9yIHRoZQorICAgICAqIHNlbGVjdG9yIHRvIHNlbGVjdCBhbnkgZmlsZXMuCisgICAgICogQHBhcmFtIHVubGVzc1Byb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBjaGVjaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVubGVzcyhTdHJpbmcgdW5sZXNzUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy51bmxlc3NQcm9wZXJ0eSA9IHVubGVzc1Byb3BlcnR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSAodGhlIGZpbGUgaXMgc2VsZWN0ZWQpIG9ubHkgaWYgdGhlIGlmIHByb3BlcnR5IChpZiBhbnkpCisgICAgICogZXhpc3RzLCB0aGUgdW5sZXNzIHByb3BlcnR5IChpZiBhbnkpIGRvZXNuJ3QgZXhpc3QsIGFuZCB0aGUKKyAgICAgKiBjb250YWluZWQgc2VsZWN0b3IgKGlmIGFueSkgc2VsZWN0cyB0aGUgZmlsZS4gSWYgdGhlcmUgaXMgbm8gY29udGFpbmVkCisgICAgICogc2VsZWN0b3IsIHJldHVybiB0cnVlIChiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoZSBwb2ludCB3YXMgdG8gdGVzdAorICAgICAqIHRoZSBpZiBhbmQgdW5sZXNzIGNvbmRpdGlvbnMpLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VkaXIgdGhlIGJhc2UgZGlyZWN0b3J5IHRoZSBzY2FuIGlzIGJlaW5nIGRvbmUgZnJvbQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBmaWxlIGEgamF2YS5pby5GaWxlIG9iamVjdCBmb3IgdGhlIGZpbGVuYW1lIHRoYXQgdGhlIHNlbGVjdG9yCisgICAgICogY2FuIHVzZQorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CisgICAgICAgIHZhbGlkYXRlKCk7CisKKyAgICAgICAgLy8gRGVhbCB3aXRoIGlmIGFuZCB1bmxlc3MgcHJvcGVydGllcyBmaXJzdAorICAgICAgICBpZiAoIShwYXNzZXNDb25kaXRpb25zKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBFbnVtZXJhdGlvbiBlID0gc2VsZWN0b3JFbGVtZW50cygpOworICAgICAgICBpZiAoIShlLmhhc01vcmVFbGVtZW50cygpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRmlsZVNlbGVjdG9yIGYgPSAoRmlsZVNlbGVjdG9yKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIHJldHVybiBmLmlzU2VsZWN0ZWQoYmFzZWRpciwgZmlsZW5hbWUsIGZpbGUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yQ29udGFpbmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2VsZWN0b3JDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzJhMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3Igc2VsZWN0b3JzIHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgc2VsZWN0b3JzLgorICoKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGludGVyZmFjZSBTZWxlY3RvckNvbnRhaW5lciB7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBhcmUgYW55IHNlbGVjdG9ycyBoZXJlLgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIGFueSBzZWxlY3RvcnMgYXJlIGluIHRoaXMgY29udGFpbmVyCisgICAgICovCisgICAgYm9vbGVhbiBoYXNTZWxlY3RvcnMoKTsKKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lcgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lcgorICAgICAqLworICAgIGludCBzZWxlY3RvckNvdW50KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc2VsZWN0b3JzIGFzIGFuIGFycmF5LgorICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lcgorICAgICAqLworICAgIEZpbGVTZWxlY3RvcltdIGdldFNlbGVjdG9ycyhQcm9qZWN0IHApOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdG9yIGZvciBhY2Nlc3NpbmcgdGhlIHNldCBvZiBzZWxlY3RvcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0b3IgdGhhdCBnb2VzIHRocm91Z2ggZWFjaCBvZiB0aGUgc2VsZWN0b3JzCisgICAgICovCisgICAgRW51bWVyYXRpb24gc2VsZWN0b3JFbGVtZW50cygpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHNlbGVjdG9yIGludG8gdGhpcyBjb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIG5ldyBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICB2b2lkIGFwcGVuZFNlbGVjdG9yKEZpbGVTZWxlY3RvciBzZWxlY3Rvcik7CisKKyAgICAvKiBNZXRob2RzIGJlbG93IGFsbCBhZGQgc3BlY2lmaWMgc2VsZWN0b3JzICovCisKKyAgICAvKioKKyAgICAgKiBhZGQgYSAiU2VsZWN0IiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgdm9pZCBhZGRTZWxlY3RvcihTZWxlY3RTZWxlY3RvciBzZWxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBhZGQgYW4gIkFuZCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHZvaWQgYWRkQW5kKEFuZFNlbGVjdG9yIHNlbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIGFkZCBhbiAiT3IiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICB2b2lkIGFkZE9yKE9yU2VsZWN0b3Igc2VsZWN0b3IpOworCisgICAgLyoqCisgICAgICogYWRkIGEgIk5vdCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHZvaWQgYWRkTm90KE5vdFNlbGVjdG9yIHNlbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIGFkZCBhICJOb25lIiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgdm9pZCBhZGROb25lKE5vbmVTZWxlY3RvciBzZWxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBtYWpvcml0eSBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgdm9pZCBhZGRNYWpvcml0eShNYWpvcml0eVNlbGVjdG9yIHNlbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIGFkZCBhIHNlbGVjdG9yIGRhdGUgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHZvaWQgYWRkRGF0ZShEYXRlU2VsZWN0b3Igc2VsZWN0b3IpOworCisgICAgLyoqCisgICAgICogYWRkIGEgc2VsZWN0b3Igc2l6ZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgdm9pZCBhZGRTaXplKFNpemVTZWxlY3RvciBzZWxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBzZWxlY3RvciBmaWxlbmFtZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgdm9pZCBhZGRGaWxlbmFtZShGaWxlbmFtZVNlbGVjdG9yIHNlbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIGFkZCBhbiBleHRlbmRlZCBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgdm9pZCBhZGRDdXN0b20oRXh0ZW5kU2VsZWN0b3Igc2VsZWN0b3IpOworCisgICAgLyoqCisgICAgICogYWRkIGEgY29udGFpbnMgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqLworICAgIHZvaWQgYWRkQ29udGFpbnMoQ29udGFpbnNTZWxlY3RvciBzZWxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBhZGQgYSBwcmVzZW50IHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICB2b2lkIGFkZFByZXNlbnQoUHJlc2VudFNlbGVjdG9yIHNlbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIGFkZCBhIGRlcHRoIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICB2b2lkIGFkZERlcHRoKERlcHRoU2VsZWN0b3Igc2VsZWN0b3IpOworCisgICAgLyoqCisgICAgICogYWRkIGEgZGVwZW5kcyBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICovCisgICAgdm9pZCBhZGREZXBlbmQoRGVwZW5kU2VsZWN0b3Igc2VsZWN0b3IpOworCisgICAgLyoqCisgICAgICogYWRkIGEgcmVndWxhciBleHByZXNzaW9uIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKi8KKyAgICB2b2lkIGFkZENvbnRhaW5zUmVnZXhwKENvbnRhaW5zUmVnZXhwU2VsZWN0b3Igc2VsZWN0b3IpOworCisgICAgLyoqCisgICAgICogYWRkIHRoZSB0eXBlIHNlbGVjdG9yCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKiBAc2luY2UgYW50IDEuNgorICAgICAqLworICAgIHZvaWQgYWRkVHlwZShUeXBlU2VsZWN0b3Igc2VsZWN0b3IpOworCisgICAgLyoqCisgICAgICogYWRkIHRoZSBkaWZmZXJlbnQgc2VsZWN0b3IKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAorICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICovCisgICAgdm9pZCBhZGREaWZmZXJlbnQoRGlmZmVyZW50U2VsZWN0b3Igc2VsZWN0b3IpOworCisgICAgLyoqCisgICAgICogYWRkIHRoZSBtb2RpZmllZCBzZWxlY3RvcgorICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCisgICAgICogQHNpbmNlIGFudCAxLjYKKyAgICAgKi8KKyAgICB2b2lkIGFkZE1vZGlmaWVkKE1vZGlmaWVkU2VsZWN0b3Igc2VsZWN0b3IpOworCisgICAgLyoqCisgICAgICogYWRkIGFuIGFyYml0YXJ5IHNlbGVjdG9yCisgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHZvaWQgYWRkKEZpbGVTZWxlY3RvciBzZWxlY3Rvcik7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2VsZWN0b3JTY2FubmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2VsZWN0b3JTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4ZGJjMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TZWxlY3RvclNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgdXNlZCB0byBkZXNjcmliZSB0aGUgYWN0aW9ucyByZXF1aXJlZCBieSBhbnkgdHlwZSBvZgorICogZGlyZWN0b3J5IHNjYW5uZXIgdGhhdCBzdXBwb3J0cyBTZWxlY3RlcnMuCisgKgorICogQHNpbmNlIDEuNQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNlbGVjdG9yU2Nhbm5lciB7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VsZWN0b3JzIHRoZSBzY2FubmVyIHNob3VsZCB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3JzIHRoZSBsaXN0IG9mIHNlbGVjdG9ycworICAgICAqLworICAgIHZvaWQgc2V0U2VsZWN0b3JzKEZpbGVTZWxlY3RvcltdIHNlbGVjdG9ycyk7CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3RvcmllcyB3aGljaCB3ZXJlIHNlbGVjdGVkIG91dCBvZiBhIHNjYW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgZGlyZWN0b3JpZXMgbm90IHNlbGVjdGVkCisgICAgICovCisgICAgU3RyaW5nW10gZ2V0RGVzZWxlY3RlZERpcmVjdG9yaWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBGaWxlcyB3aGljaCB3ZXJlIHNlbGVjdGVkIG91dCBvZiBhIHNjYW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgZmlsZXMgbm90IHNlbGVjdGVkCisgICAgICovCisgICAgU3RyaW5nW10gZ2V0RGVzZWxlY3RlZEZpbGVzKCk7CisKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yVXRpbHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TZWxlY3RvclV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkNzM3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TZWxlY3RvclV0aWxzLmphdmEKQEAgLTAsMCArMSw2ODEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKKworLyoqCisgKiA8cD5UaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB1c2VkIGJ5IHNlbGVjdG9ycyBhbmQgRGlyZWN0b3J5U2Nhbm5lci4gVGhlCisgKiBmdW5jdGlvbmFsaXR5IG1vcmUgcHJvcGVybHkgYmVsb25ncyBqdXN0IHRvIHNlbGVjdG9ycywgYnV0IHVuZm9ydHVuYXRlbHkKKyAqIERpcmVjdG9yeVNjYW5uZXIgZXhwb3NlZCB0aGVzZSBhcyBwcm90ZWN0ZWQgbWV0aG9kcy4gVGh1cyB3ZSBoYXZlIHRvCisgKiBzdXBwb3J0IGFueSBzdWJjbGFzc2VzIG9mIERpcmVjdG9yeVNjYW5uZXIgdGhhdCBtYXkgYWNjZXNzIHRoZXNlIG1ldGhvZHMuCisgKiA8L3A+CisgKiA8cD5UaGlzIGlzIGEgU2luZ2xldG9uLjwvcD4KKyAqCisgKiBAc2luY2UgMS41CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZWxlY3RvclV0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIFNlbGVjdG9yVXRpbHMgaW5zdGFuY2UgPSBuZXcgU2VsZWN0b3JVdGlscygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHByaXZhdGUgU2VsZWN0b3JVdGlscygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGluc3RhbmNlIG9mIHRoZSBTaW5nbGV0b24uCisgICAgICogQHJldHVybiBzaW5nbGV0b24gaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlbGVjdG9yVXRpbHMgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIHBhdGggbWF0Y2hlcyB0aGUgc3RhcnQgb2YgYSBnaXZlbgorICAgICAqIHBhdHRlcm4gdXAgdG8gdGhlIGZpcnN0ICIqKiIuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgdGVzdCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKKyAgICAgKiBjYW4gbGl2ZSB3aXRoIGZhbHNlIHBvc2l0aXZlcy4gRm9yIGV4YW1wbGUsIDxjb2RlPnBhdHRlcm49KipcYTwvY29kZT4KKyAgICAgKiBhbmQgPGNvZGU+c3RyPWI8L2NvZGU+IHdpbGwgeWllbGQgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0LiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzdHIgICAgIFRoZSBwYXRoIHRvIG1hdGNoLCBhcyBhIFN0cmluZy4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgYSBnaXZlbiBwYXRoIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4KKyAgICAgKiBwYXR0ZXJuIHVwIHRvIHRoZSBmaXJzdCAiKioiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFBhdHRlcm5TdGFydChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHN0cikgeworICAgICAgICByZXR1cm4gbWF0Y2hQYXR0ZXJuU3RhcnQocGF0dGVybiwgc3RyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIHBhdGggbWF0Y2hlcyB0aGUgc3RhcnQgb2YgYSBnaXZlbgorICAgICAqIHBhdHRlcm4gdXAgdG8gdGhlIGZpcnN0ICIqKiIuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgdGVzdCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKKyAgICAgKiBjYW4gbGl2ZSB3aXRoIGZhbHNlIHBvc2l0aXZlcy4gRm9yIGV4YW1wbGUsIDxjb2RlPnBhdHRlcm49KipcYTwvY29kZT4KKyAgICAgKiBhbmQgPGNvZGU+c3RyPWI8L2NvZGU+IHdpbGwgeWllbGQgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0LiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzdHIgICAgIFRoZSBwYXRoIHRvIG1hdGNoLCBhcyBhIFN0cmluZy4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIFdoZXRoZXIgb3Igbm90IG1hdGNoaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vuc2l0aXZlbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gcGF0aCBtYXRjaGVzIHRoZSBzdGFydCBvZiBhIGdpdmVuCisgICAgICogcGF0dGVybiB1cCB0byB0aGUgZmlyc3QgIioqIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuU3RhcnQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIC8vIFdoZW4gc3RyIHN0YXJ0cyB3aXRoIGEgRmlsZS5zZXBhcmF0b3IsIHBhdHRlcm4gaGFzIHRvIHN0YXJ0IHdpdGggYQorICAgICAgICAvLyBGaWxlLnNlcGFyYXRvci4KKyAgICAgICAgLy8gV2hlbiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgRmlsZS5zZXBhcmF0b3IsIHN0ciBoYXMgdG8gc3RhcnQgd2l0aCBhCisgICAgICAgIC8vIEZpbGUuc2VwYXJhdG9yLgorICAgICAgICBpZiAoc3RyLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpCisgICAgICAgICAgICAgICAgIT0gcGF0dGVybi5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gcGF0RGlycyA9IHRva2VuaXplUGF0aEFzQXJyYXkocGF0dGVybik7CisgICAgICAgIFN0cmluZ1tdIHN0ckRpcnMgPSB0b2tlbml6ZVBhdGhBc0FycmF5KHN0cik7CisKKyAgICAgICAgaW50IHBhdElkeFN0YXJ0ID0gMDsKKyAgICAgICAgaW50IHBhdElkeEVuZCA9IHBhdERpcnMubGVuZ3RoIC0gMTsKKyAgICAgICAgaW50IHN0cklkeFN0YXJ0ID0gMDsKKyAgICAgICAgaW50IHN0cklkeEVuZCA9IHN0ckRpcnMubGVuZ3RoIC0gMTsKKworICAgICAgICAvLyB1cCB0byBmaXJzdCAnKionCisgICAgICAgIHdoaWxlIChwYXRJZHhTdGFydCA8PSBwYXRJZHhFbmQgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0RGlyID0gcGF0RGlyc1twYXRJZHhTdGFydF07CisgICAgICAgICAgICBpZiAocGF0RGlyLmVxdWFscygiKioiKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtYXRjaChwYXREaXIsIHN0ckRpcnNbc3RySWR4U3RhcnRdLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKKyAgICAgICAgICAgIHN0cklkeFN0YXJ0Kys7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVja1N0eWxlOlNpbXBsaWZ5Qm9vbGVhblJldHVybkNoZWNrIE9GRgorICAgICAgICAvLyBDaGVjayB0dXJuZWQgb2ZmIGFzIHRoZSBjb2RlIG5lZWRzIHRoZSBjb21tZW50cyBmb3IgdGhlIHZhcmlvdXMKKyAgICAgICAgLy8gY29kZSBwYXRocy4KKyAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7CisgICAgICAgICAgICAvLyBTdHJpbmcgaXMgZXhoYXVzdGVkCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRJZHhTdGFydCA+IHBhdElkeEVuZCkgeworICAgICAgICAgICAgLy8gU3RyaW5nIG5vdCBleGhhdXN0ZWQsIGJ1dCBwYXR0ZXJuIGlzLiBGYWlsdXJlLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcGF0dGVybiBub3cgaG9sZHMgKiogd2hpbGUgc3RyaW5nIGlzIG5vdCBleGhhdXN0ZWQKKyAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBnZW5lcmF0ZSBmYWxzZSBwb3NpdGl2ZXMgYnV0IHdlIGNhbiBsaXZlIHdpdGggdGhhdC4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBvciBub3QgYSBnaXZlbiBwYXRoIG1hdGNoZXMgYSBnaXZlbiBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdC4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3RyICAgICBUaGUgcGF0aCB0byBtYXRjaCwgYXMgYSBTdHJpbmcuIE11c3Qgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgYWdhaW5zdCB0aGUgc3RyaW5nLAorICAgICAqICAgICAgICAgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXRoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyKSB7CisgICAgICAgIHJldHVybiBtYXRjaFBhdGgocGF0dGVybiwgc3RyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIHBhdGggbWF0Y2hlcyBhIGdpdmVuIHBhdHRlcm4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0LiBNdXN0IG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzdHIgICAgIFRoZSBwYXRoIHRvIG1hdGNoLCBhcyBhIFN0cmluZy4gTXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIFdoZXRoZXIgb3Igbm90IG1hdGNoaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vuc2l0aXZlbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgYWdhaW5zdCB0aGUgc3RyaW5nLAorICAgICAqICAgICAgICAgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hQYXRoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgU3RyaW5nW10gcGF0RGlycyA9IHRva2VuaXplUGF0aEFzQXJyYXkocGF0dGVybik7CisgICAgICAgIFN0cmluZ1tdIHN0ckRpcnMgPSB0b2tlbml6ZVBhdGhBc0FycmF5KHN0cik7CisKKyAgICAgICAgaW50IHBhdElkeFN0YXJ0ID0gMDsKKyAgICAgICAgaW50IHBhdElkeEVuZCA9IHBhdERpcnMubGVuZ3RoIC0gMTsKKyAgICAgICAgaW50IHN0cklkeFN0YXJ0ID0gMDsKKyAgICAgICAgaW50IHN0cklkeEVuZCA9IHN0ckRpcnMubGVuZ3RoIC0gMTsKKworICAgICAgICAvLyB1cCB0byBmaXJzdCAnKionCisgICAgICAgIHdoaWxlIChwYXRJZHhTdGFydCA8PSBwYXRJZHhFbmQgJiYgc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0RGlyID0gcGF0RGlyc1twYXRJZHhTdGFydF07CisgICAgICAgICAgICBpZiAocGF0RGlyLmVxdWFscygiKioiKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtYXRjaChwYXREaXIsIHN0ckRpcnNbc3RySWR4U3RhcnRdLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgcGF0RGlycyA9IG51bGw7CisgICAgICAgICAgICAgICAgc3RyRGlycyA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKKyAgICAgICAgICAgIHN0cklkeFN0YXJ0Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7CisgICAgICAgICAgICAvLyBTdHJpbmcgaXMgZXhoYXVzdGVkCisgICAgICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBhdERpcnNbaV0uZXF1YWxzKCIqKiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdERpcnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBzdHJEaXJzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBhdElkeFN0YXJ0ID4gcGF0SWR4RW5kKSB7CisgICAgICAgICAgICAgICAgLy8gU3RyaW5nIG5vdCBleGhhdXN0ZWQsIGJ1dCBwYXR0ZXJuIGlzLiBGYWlsdXJlLgorICAgICAgICAgICAgICAgIHBhdERpcnMgPSBudWxsOworICAgICAgICAgICAgICAgIHN0ckRpcnMgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwIHRvIGxhc3QgJyoqJworICAgICAgICB3aGlsZSAocGF0SWR4U3RhcnQgPD0gcGF0SWR4RW5kICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkgeworICAgICAgICAgICAgU3RyaW5nIHBhdERpciA9IHBhdERpcnNbcGF0SWR4RW5kXTsKKyAgICAgICAgICAgIGlmIChwYXREaXIuZXF1YWxzKCIqKiIpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hdGNoKHBhdERpciwgc3RyRGlyc1tzdHJJZHhFbmRdLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgcGF0RGlycyA9IG51bGw7CisgICAgICAgICAgICAgICAgc3RyRGlycyA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0SWR4RW5kLS07CisgICAgICAgICAgICBzdHJJZHhFbmQtLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIC8vIFN0cmluZyBpcyBleGhhdXN0ZWQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghcGF0RGlyc1tpXS5lcXVhbHMoIioqIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0RGlycyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHN0ckRpcnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocGF0SWR4U3RhcnQgIT0gcGF0SWR4RW5kICYmIHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkgeworICAgICAgICAgICAgaW50IHBhdElkeFRtcCA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0ICsgMTsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwYXREaXJzW2ldLmVxdWFscygiKioiKSkgeworICAgICAgICAgICAgICAgICAgICBwYXRJZHhUbXAgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGF0SWR4VG1wID09IHBhdElkeFN0YXJ0ICsgMSkgeworICAgICAgICAgICAgICAgIC8vICcqKi8qKicgc2l0dWF0aW9uLCBzbyBza2lwIG9uZQorICAgICAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBwYXR0ZXJuIGJldHdlZW4gcGFkSWR4U3RhcnQgJiBwYWRJZHhUbXAgaW4gc3RyIGJldHdlZW4KKyAgICAgICAgICAgIC8vIHN0cklkeFN0YXJ0ICYgc3RySWR4RW5kCisgICAgICAgICAgICBpbnQgcGF0TGVuZ3RoID0gKHBhdElkeFRtcCAtIHBhdElkeFN0YXJ0IC0gMSk7CisgICAgICAgICAgICBpbnQgc3RyTGVuZ3RoID0gKHN0cklkeEVuZCAtIHN0cklkeFN0YXJ0ICsgMSk7CisgICAgICAgICAgICBpbnQgZm91bmRJZHggPSAtMTsKKyAgICAgICAgICAgIHN0ckxvb3A6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHJMZW5ndGggLSBwYXRMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGF0TGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlBhdCA9IHBhdERpcnNbcGF0SWR4U3RhcnQgKyBqICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdWJTdHIgPSBzdHJEaXJzW3N0cklkeFN0YXJ0ICsgaSArIGpdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKHN1YlBhdCwgc3ViU3RyLCBpc0Nhc2VTZW5zaXRpdmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzdHJMb29wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJZHggPSBzdHJJZHhTdGFydCArIGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3VuZElkeCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHBhdERpcnMgPSBudWxsOworICAgICAgICAgICAgICAgIHN0ckRpcnMgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGF0SWR4U3RhcnQgPSBwYXRJZHhUbXA7CisgICAgICAgICAgICBzdHJJZHhTdGFydCA9IGZvdW5kSWR4ICsgcGF0TGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXBhdERpcnNbaV0uZXF1YWxzKCIqKiIpKSB7CisgICAgICAgICAgICAgICAgcGF0RGlycyA9IG51bGw7CisgICAgICAgICAgICAgICAgc3RyRGlycyA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBvciBub3QgYSBzdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IGEgcGF0dGVybi4KKyAgICAgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiB0d28gc3BlY2lhbCBjaGFyYWN0ZXJzOjxicj4KKyAgICAgKiAnKicgbWVhbnMgemVybyBvciBtb3JlIGNoYXJhY3RlcnM8YnI+CisgICAgICogJz8nIG1lYW5zIG9uZSBhbmQgb25seSBvbmUgY2hhcmFjdGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0LgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzdHIgICAgIFRoZSBzdHJpbmcgd2hpY2ggbXVzdCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHBhdHRlcm4uCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwYXR0ZXJuLAorICAgICAqICAgICAgICAgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIpIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoKHBhdHRlcm4sIHN0ciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBvciBub3QgYSBzdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IGEgcGF0dGVybi4KKyAgICAgKiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiB0d28gc3BlY2lhbCBjaGFyYWN0ZXJzOjxicj4KKyAgICAgKiAnKicgbWVhbnMgemVybyBvciBtb3JlIGNoYXJhY3RlcnM8YnI+CisgICAgICogJz8nIG1lYW5zIG9uZSBhbmQgb25seSBvbmUgY2hhcmFjdGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0LgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzdHIgICAgIFRoZSBzdHJpbmcgd2hpY2ggbXVzdCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHBhdHRlcm4uCisgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgV2hldGhlciBvciBub3QgbWF0Y2hpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzZW5zaXRpdmVseS4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgYWdhaW5zdCB0aGUgcGF0dGVybiwKKyAgICAgKiAgICAgICAgIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgY2hhcltdIHBhdEFyciA9IHBhdHRlcm4udG9DaGFyQXJyYXkoKTsKKyAgICAgICAgY2hhcltdIHN0ckFyciA9IHN0ci50b0NoYXJBcnJheSgpOworICAgICAgICBpbnQgcGF0SWR4U3RhcnQgPSAwOworICAgICAgICBpbnQgcGF0SWR4RW5kID0gcGF0QXJyLmxlbmd0aCAtIDE7CisgICAgICAgIGludCBzdHJJZHhTdGFydCA9IDA7CisgICAgICAgIGludCBzdHJJZHhFbmQgPSBzdHJBcnIubGVuZ3RoIC0gMTsKKyAgICAgICAgY2hhciBjaDsKKworICAgICAgICBib29sZWFuIGNvbnRhaW5zU3RhciA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdEFyci5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHBhdEFycltpXSA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBjb250YWluc1N0YXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb250YWluc1N0YXIpIHsKKyAgICAgICAgICAgIC8vIE5vICcqJ3MsIHNvIHdlIG1ha2UgYSBzaG9ydGN1dAorICAgICAgICAgICAgaWYgKHBhdElkeEVuZCAhPSBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFBhdHRlcm4gYW5kIHN0cmluZyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNoID0gcGF0QXJyW2ldOworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPycpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVudChjYXNlU2Vuc2l0aXZlLCBjaCwgc3RyQXJyW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBDaGFyYWN0ZXIgbWlzbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBTdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHBhdHRlcm4KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXRJZHhFbmQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFBhdHRlcm4gY29udGFpbnMgb25seSAnKicsIHdoaWNoIG1hdGNoZXMgYW55dGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgY2hhcmFjdGVycyBiZWZvcmUgZmlyc3Qgc3RhcgorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY2ggPSBwYXRBcnJbcGF0SWR4U3RhcnRdOworICAgICAgICAgICAgaWYgKGNoID09ICcqJyB8fCBzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoICE9ICc/JykgeworICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbnQoY2FzZVNlbnNpdGl2ZSwgY2gsIHN0ckFycltzdHJJZHhTdGFydF0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKKyAgICAgICAgICAgIHN0cklkeFN0YXJ0Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7CisgICAgICAgICAgICAvLyBBbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1c2VkLiBDaGVjayBpZiBvbmx5ICcqJ3MgYXJlCisgICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSBwYXR0ZXJuLiBJZiBzbywgd2Ugc3VjY2VlZGVkLiBPdGhlcndpc2UgZmFpbHVyZS4KKyAgICAgICAgICAgIHJldHVybiBhbGxTdGFycyhwYXRBcnIsIHBhdElkeFN0YXJ0LCBwYXRJZHhFbmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyBjaGFyYWN0ZXJzIGFmdGVyIGxhc3Qgc3RhcgorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY2ggPSBwYXRBcnJbcGF0SWR4RW5kXTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnKicgfHwgc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCAhPSAnPycpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlmZmVyZW50KGNhc2VTZW5zaXRpdmUsIGNoLCBzdHJBcnJbc3RySWR4RW5kXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBDaGFyYWN0ZXIgbWlzbWF0Y2gKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRJZHhFbmQtLTsKKyAgICAgICAgICAgIHN0cklkeEVuZC0tOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgeworICAgICAgICAgICAgLy8gQWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXNlZC4gQ2hlY2sgaWYgb25seSAnKidzIGFyZQorICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgcGF0dGVybi4gSWYgc28sIHdlIHN1Y2NlZWRlZC4gT3RoZXJ3aXNlIGZhaWx1cmUuCisgICAgICAgICAgICByZXR1cm4gYWxsU3RhcnMocGF0QXJyLCBwYXRJZHhTdGFydCwgcGF0SWR4RW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgcGF0dGVybiBiZXR3ZWVuIHN0YXJzLiBwYWRJZHhTdGFydCBhbmQgcGF0SWR4RW5kIHBvaW50CisgICAgICAgIC8vIGFsd2F5cyB0byBhICcqJy4KKyAgICAgICAgd2hpbGUgKHBhdElkeFN0YXJ0ICE9IHBhdElkeEVuZCAmJiBzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpIHsKKyAgICAgICAgICAgIGludCBwYXRJZHhUbXAgPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydCArIDE7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0QXJyW2ldID09ICcqJykgeworICAgICAgICAgICAgICAgICAgICBwYXRJZHhUbXAgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGF0SWR4VG1wID09IHBhdElkeFN0YXJ0ICsgMSkgeworICAgICAgICAgICAgICAgIC8vIFR3byBzdGFycyBuZXh0IHRvIGVhY2ggb3RoZXIsIHNraXAgdGhlIGZpcnN0IG9uZS4KKyAgICAgICAgICAgICAgICBwYXRJZHhTdGFydCsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmluZCB0aGUgcGF0dGVybiBiZXR3ZWVuIHBhZElkeFN0YXJ0ICYgcGFkSWR4VG1wIGluIHN0ciBiZXR3ZWVuCisgICAgICAgICAgICAvLyBzdHJJZHhTdGFydCAmIHN0cklkeEVuZAorICAgICAgICAgICAgaW50IHBhdExlbmd0aCA9IChwYXRJZHhUbXAgLSBwYXRJZHhTdGFydCAtIDEpOworICAgICAgICAgICAgaW50IHN0ckxlbmd0aCA9IChzdHJJZHhFbmQgLSBzdHJJZHhTdGFydCArIDEpOworICAgICAgICAgICAgaW50IGZvdW5kSWR4ID0gLTE7CisgICAgICAgICAgICBzdHJMb29wOgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyTGVuZ3RoIC0gcGF0TGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhdExlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gcGF0QXJyW3BhdElkeFN0YXJ0ICsgaiArIDFdOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz8nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZmVyZW50KGNhc2VTZW5zaXRpdmUsIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJBcnJbc3RySWR4U3RhcnQgKyBpICsgal0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgc3RyTG9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvdW5kSWR4ID0gc3RySWR4U3RhcnQgKyBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm91bmRJZHggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhdElkeFN0YXJ0ID0gcGF0SWR4VG1wOworICAgICAgICAgICAgc3RySWR4U3RhcnQgPSBmb3VuZElkeCArIHBhdExlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHVzZWQuIENoZWNrIGlmIG9ubHkgJyoncyBhcmUgbGVmdAorICAgICAgICAvLyBpbiB0aGUgcGF0dGVybi4gSWYgc28sIHdlIHN1Y2NlZWRlZC4gT3RoZXJ3aXNlIGZhaWx1cmUuCisgICAgICAgIHJldHVybiBhbGxTdGFycyhwYXRBcnIsIHBhdElkeFN0YXJ0LCBwYXRJZHhFbmQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWxsU3RhcnMoY2hhcltdIGNoYXJzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgKytpKSB7CisgICAgICAgICAgICBpZiAoY2hhcnNbaV0gIT0gJyonKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlmZmVyZW50KAorICAgICAgICBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGNoYXIgY2gsIGNoYXIgb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGNhc2VTZW5zaXRpdmUKKyAgICAgICAgICAgID8gY2ggIT0gb3RoZXIKKyAgICAgICAgICAgIDogQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKSAhPSBDaGFyYWN0ZXIudG9VcHBlckNhc2Uob3RoZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJyZWFrcyBhIHBhdGggdXAgaW50byBhIFZlY3RvciBvZiBwYXRoIGVsZW1lbnRzLCB0b2tlbml6aW5nIG9uCisgICAgICogPGNvZGU+RmlsZS5zZXBhcmF0b3I8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0b2tlbml6ZS4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgVmVjdG9yIG9mIHBhdGggZWxlbWVudHMgZnJvbSB0aGUgdG9rZW5pemVkIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFZlY3RvciB0b2tlbml6ZVBhdGggKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiB0b2tlbml6ZVBhdGgocGF0aCwgRmlsZS5zZXBhcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJyZWFrcyBhIHBhdGggdXAgaW50byBhIFZlY3RvciBvZiBwYXRoIGVsZW1lbnRzLCB0b2tlbml6aW5nIG9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHRva2VuaXplLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIHRoZSBzZXBhcmF0b3IgYWdhaW5zdCB3aGljaCB0byB0b2tlbml6ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBWZWN0b3Igb2YgcGF0aCBlbGVtZW50cyBmcm9tIHRoZSB0b2tlbml6ZWQgcGF0aAorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBWZWN0b3IgdG9rZW5pemVQYXRoIChTdHJpbmcgcGF0aCwgU3RyaW5nIHNlcGFyYXRvcikgeworICAgICAgICBWZWN0b3IgcmV0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBpZiAoRmlsZVV0aWxzLmlzQWJzb2x1dGVQYXRoKHBhdGgpKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBzID0gRklMRV9VVElMUy5kaXNzZWN0KHBhdGgpOworICAgICAgICAgICAgcmV0LmFkZChzWzBdKTsKKyAgICAgICAgICAgIHBhdGggPSBzWzFdOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0aCwgc2VwYXJhdG9yKTsKKyAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgcmV0LmFkZEVsZW1lbnQoc3QubmV4dFRva2VuKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI3Rva2VuaXplUGF0aCB0b2tlbml6ZVBhdGh9IGJ1dCBob3BlZnVsbHkgZmFzdGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplUGF0aEFzQXJyYXkoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIHJvb3QgPSBudWxsOworICAgICAgICBpZiAoRmlsZVV0aWxzLmlzQWJzb2x1dGVQYXRoKHBhdGgpKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBzID0gRklMRV9VVElMUy5kaXNzZWN0KHBhdGgpOworICAgICAgICAgICAgcm9vdCA9IHNbMF07CisgICAgICAgICAgICBwYXRoID0gc1sxXTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgaW50IGxlbiA9IHBhdGgubGVuZ3RoKCk7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyA8IGxlbjsgcG9zKyspIHsKKyAgICAgICAgICAgIGlmIChwYXRoLmNoYXJBdChwb3MpID09IHNlcCkgeworICAgICAgICAgICAgICAgIGlmIChwb3MgIT0gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhcnQgPSBwb3MgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsZW4gIT0gc3RhcnQpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gbCA9IG5ldyBTdHJpbmdbY291bnQgKyAoKHJvb3QgPT0gbnVsbCkgPyAwIDogMSldOworCisgICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxbMF0gPSByb290OworICAgICAgICAgICAgY291bnQgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgbGVuOyBwb3MrKykgeworICAgICAgICAgICAgaWYgKHBhdGguY2hhckF0KHBvcykgPT0gc2VwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcyAhPSBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rID0gcGF0aC5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CisgICAgICAgICAgICAgICAgICAgIGxbY291bnQrK10gPSB0b2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGVuICE9IHN0YXJ0KSB7CisgICAgICAgICAgICBTdHJpbmcgdG9rID0gcGF0aC5zdWJzdHJpbmcoc3RhcnQpOworICAgICAgICAgICAgbFtjb3VudC8qKysqL10gPSB0b2s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIG9uIHRoZXNlIHR3byBmaWxlcy4gSWYgc3JjIGhhcyBiZWVuCisgICAgICogbW9kaWZpZWQgbGF0ZXIgdGhhbiB0YXJnZXQsIGl0IHJldHVybnMgdHJ1ZS4gSWYgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QsCisgICAgICogaXQgbGlrZXdpc2UgcmV0dXJucyB0cnVlLiBPdGhlcndpc2UsIHRhcmdldCBpcyBuZXdlciB0aGFuIHNyYyBhbmQKKyAgICAgKiBpcyBub3Qgb3V0IG9mIGRhdGUsIHRodXMgdGhlIG1ldGhvZCByZXR1cm5zIGZhbHNlLiBJdCBhbHNvIHJldHVybnMKKyAgICAgKiBmYWxzZSBpZiB0aGUgc3JjIGZpbGUgZG9lc24ndCBldmVuIGV4aXN0LCBzaW5jZSBob3cgY291bGQgdGhlCisgICAgICogdGFyZ2V0IHRoZW4gYmUgb3V0IG9mIGRhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBvcmlnaW5hbCBmaWxlCisgICAgICogQHBhcmFtIHRhcmdldCB0aGUgZmlsZSBiZWluZyBjb21wYXJlZCBhZ2FpbnN0CisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IHRoZSBhbW91bnQgaW4gc2Vjb25kcyBvZiBzbGFjayB3ZSB3aWxsIGdpdmUgaW4KKyAgICAgKiAgICAgICAgZGV0ZXJtaW5pbmcgb3V0IG9mIGRhdGVuZXNzCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgb3V0IG9mIGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPdXRPZkRhdGUoRmlsZSBzcmMsIEZpbGUgdGFyZ2V0LCBpbnQgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgaWYgKCFzcmMuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXRhcmdldC5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzcmMubGFzdE1vZGlmaWVkKCkgLSBncmFudWxhcml0eSkgPiB0YXJnZXQubGFzdE1vZGlmaWVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gb24gdGhlc2UgdHdvIHJlc291cmNlcy4gSWYgc3JjIGhhcyBiZWVuCisgICAgICogbW9kaWZpZWQgbGF0ZXIgdGhhbiB0YXJnZXQsIGl0IHJldHVybnMgdHJ1ZS4gSWYgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QsCisgICAgICogaXQgbGlrZXdpc2UgcmV0dXJucyB0cnVlLiBPdGhlcndpc2UsIHRhcmdldCBpcyBuZXdlciB0aGFuIHNyYyBhbmQKKyAgICAgKiBpcyBub3Qgb3V0IG9mIGRhdGUsIHRodXMgdGhlIG1ldGhvZCByZXR1cm5zIGZhbHNlLiBJdCBhbHNvIHJldHVybnMKKyAgICAgKiBmYWxzZSBpZiB0aGUgc3JjIGZpbGUgZG9lc24ndCBldmVuIGV4aXN0LCBzaW5jZSBob3cgY291bGQgdGhlCisgICAgICogdGFyZ2V0IHRoZW4gYmUgb3V0IG9mIGRhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBvcmlnaW5hbCByZXNvdXJjZQorICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHJlc291cmNlIGJlaW5nIGNvbXBhcmVkIGFnYWluc3QKKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgdGhlIGludCBhbW91bnQgaW4gc2Vjb25kcyBvZiBzbGFjayB3ZSB3aWxsIGdpdmUgaW4KKyAgICAgKiAgICAgICAgZGV0ZXJtaW5pbmcgb3V0IG9mIGRhdGVuZXNzCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgb3V0IG9mIGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPdXRPZkRhdGUoUmVzb3VyY2Ugc3JjLCBSZXNvdXJjZSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmFudWxhcml0eSkgeworICAgICAgICByZXR1cm4gaXNPdXRPZkRhdGUoc3JjLCB0YXJnZXQsIChsb25nKSBncmFudWxhcml0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIG9uIHRoZXNlIHR3byByZXNvdXJjZXMuIElmIHNyYyBoYXMgYmVlbgorICAgICAqIG1vZGlmaWVkIGxhdGVyIHRoYW4gdGFyZ2V0LCBpdCByZXR1cm5zIHRydWUuIElmIHRhcmdldCBkb2Vzbid0IGV4aXN0LAorICAgICAqIGl0IGxpa2V3aXNlIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlLCB0YXJnZXQgaXMgbmV3ZXIgdGhhbiBzcmMgYW5kCisgICAgICogaXMgbm90IG91dCBvZiBkYXRlLCB0aHVzIHRoZSBtZXRob2QgcmV0dXJucyBmYWxzZS4gSXQgYWxzbyByZXR1cm5zCisgICAgICogZmFsc2UgaWYgdGhlIHNyYyBmaWxlIGRvZXNuJ3QgZXZlbiBleGlzdCwgc2luY2UgaG93IGNvdWxkIHRoZQorICAgICAqIHRhcmdldCB0aGVuIGJlIG91dCBvZiBkYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyB0aGUgb3JpZ2luYWwgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSByZXNvdXJjZSBiZWluZyBjb21wYXJlZCBhZ2FpbnN0CisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IHRoZSBsb25nIGFtb3VudCBpbiBzZWNvbmRzIG9mIHNsYWNrIHdlIHdpbGwgZ2l2ZSBpbgorICAgICAqICAgICAgICBkZXRlcm1pbmluZyBvdXQgb2YgZGF0ZW5lc3MKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHRhcmdldCBpcyBvdXQgb2YgZGF0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc091dE9mRGF0ZShSZXNvdXJjZSBzcmMsIFJlc291cmNlIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBncmFudWxhcml0eSkgeworICAgICAgICBsb25nIHNvdXJjZUxhc3RNb2RpZmllZCA9IHNyYy5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgc291cmNlIGV4aXN0cyAtIHVzZSBzb3VyY2VMYXN0TW9kaWZpZWQgZm9yIGZpbGUgcmVzb3VyY2VzCisgICAgICAgIC8vIGFzIGl0IGlzIHF1aWNrZXIgdGhhbiBjaGVja2luZyBleGlzdHMoKSBhZ2FpbiwgaG93ZXZlciBzdHJpbmcgcmVzb3VyY2VzCisgICAgICAgIC8vIGhhdmUgYSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgMAorICAgICAgICBib29sZWFuIHNvdXJjZUV4aXN0cyA9IChzcmMgaW5zdGFuY2VvZiBGaWxlUmVzb3VyY2UpCisgICAgICAgICAgICA/IHNvdXJjZUxhc3RNb2RpZmllZCAhPSAwTCA6IHNyYy5pc0V4aXN0cygpOworCisgICAgICAgIGxvbmcgdGFyZ2V0TGFzdE1vZGlmaWVkID0gdGFyZ2V0LmdldExhc3RNb2RpZmllZCgpOworICAgICAgICBpZiAodGFyZ2V0TGFzdE1vZGlmaWVkID09IDBMKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNvdXJjZUxhc3RNb2RpZmllZCAtIGdyYW51bGFyaXR5KSA+IHRhcmdldExhc3RNb2RpZmllZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAiRmxhdHRlbnMiIGEgc3RyaW5nIGJ5IHJlbW92aW5nIGFsbCB3aGl0ZXNwYWNlIChzcGFjZSwgdGFiLCBsaW5lZmVlZCwKKyAgICAgKiBjYXJyaWFnZSByZXR1cm4sIGFuZCBmb3JtZmVlZCkuIFRoaXMgdXNlcyBTdHJpbmdUb2tlbml6ZXIgYW5kIHRoZQorICAgICAqIGRlZmF1bHQgc2V0IG9mIHRva2VucyBhcyBkb2N1bWVudGVkIGluIHRoZSBzaW5nbGUgYXJndWVtZW50IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IGEgU3RyaW5nIHRvIHJlbW92ZSBhbGwgd2hpdGVzcGFjZS4KKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHRoYXQgaGFzIGhhZCBhbGwgd2hpdGVzcGFjZSByZW1vdmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVdoaXRlc3BhY2UoU3RyaW5nIGlucHV0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGlucHV0KTsKKyAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHN0Lm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgaWYgYSBzdHJpbmcgY29udGFpbnMgc3RhcnMgb3IgcXVlc3Rpb24gbWFya3MKKyAgICAgKiBAcGFyYW0gaW5wdXQgYSBTdHJpbmcgd2hpY2ggb25lIHdhbnRzIHRvIHRlc3QgZm9yIGNvbnRhaW5pbmcgd2lsZGNhcmQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjb250YWlucyBhdCBsZWFzdCBhIHN0YXIgb3IgYSBxdWVzdGlvbiBtYXJrCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1dpbGRjYXJkcyhTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIChpbnB1dC5pbmRleE9mKCcqJykgIT0gLTEgfHwgaW5wdXQuaW5kZXhPZignPycpICE9IC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZW1vdmVzIGZyb20gYSBwYXR0ZXJuIGFsbCB0b2tlbnMgdG8gdGhlIHJpZ2h0IGNvbnRhaW5pbmcgd2lsZGNhcmRzCisgICAgICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBsZWZ0bW9zdCBwYXJ0IG9mIHRoZSBwYXR0ZXJuIHdpdGhvdXQgd2lsZGNhcmRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcnRyaW1XaWxkY2FyZFRva2VucyhTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gdG9rZW5pemVQYXRoQXNBcnJheShpbnB1dCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChoYXNXaWxkY2FyZHModG9rZW5zW2ldKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPiAwICYmIHNiLmNoYXJBdChzYi5sZW5ndGgoKSAtIDEpICE9IEZpbGUuc2VwYXJhdG9yQ2hhcikgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChGaWxlLnNlcGFyYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQodG9rZW5zW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TaWduZWRTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpZ25lZFNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmOGJkNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TaWduZWRTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRhdGFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc1NpZ25lZDsKKworLyoqCisgKiBTZWxlY3RvciB0aGF0IGNob29zZXMgZmlsZXMgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBzaWduZWQgb3Igbm90LgorICoKKyAqIEBzaW5jZSAxLjcKKyAqLworcHVibGljIGNsYXNzIFNpZ25lZFNlbGVjdG9yIGV4dGVuZHMgRGF0YVR5cGUgaW1wbGVtZW50cyBGaWxlU2VsZWN0b3IgeworICAgIHByaXZhdGUgSXNTaWduZWQgaXNTaWduZWQgPSBuZXcgSXNTaWduZWQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzaWduYXR1cmUgbmFtZSB0byBjaGVjayBqYXJmaWxlIGZvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHNpZ25hdHVyZSB0byBsb29rIGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlzU2lnbmVkLnNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIFRoaXMgaXMgd2hlcmUgdGhlIHNlbGVjdG9yIGdldHMgdG8gZGVjaWRlCisgICAgICogb24gdGhlIGluY2x1c2lvbiBvZiBhIGZpbGUgaW4gYSBwYXJ0aWN1bGFyIGZpbGVzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciBub3QgdXNlZCBieSB0aGlzIHNlbGVjdG9yCisgICAgICogQHBhcmFtIGZpbGVuYW1lIG5vdCB1c2VkIGJ5IHRoaXMgc2VsZWN0b3IKKyAgICAgKiBAcGFyYW0gZmlsZSAgICAgcGF0aCB0byBmaWxlIHRvIGJlIHNlbGVjdGVkCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZCBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKKyAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBRdWljayByZXR1cm46IGRpcmVjdG9yaWVzIGNhbm5vdCBiZSBzaWduZWQKKyAgICAgICAgfQorICAgICAgICBpc1NpZ25lZC5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIGlzU2lnbmVkLnNldEZpbGUoZmlsZSk7CisgICAgICAgIHJldHVybiBpc1NpZ25lZC5ldmFsKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpemVTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpemVTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDg2NDcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2l6ZVNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21wYXJpc29uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworCisvKioKKyAqIFNlbGVjdG9yIHRoYXQgZmlsdGVycyBmaWxlcyBiYXNlZCBvbiB0aGVpciBzaXplLgorICoKKyAqIEBzaW5jZSAxLjUKKyAqLworcHVibGljIGNsYXNzIFNpemVTZWxlY3RvciBleHRlbmRzIEJhc2VFeHRlbmRTZWxlY3RvciB7CisKKyAgICAvKiogQ29uc3RhbnRzIGZvciBraWxvLCBraWJpIGV0YyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgS0lMTyA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBLSUJJID0gMTAyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIEtJQklfUE9TID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIE1FR0EgPSAxMDAwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgTUVHQV9QT1MgPSA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgTUVCSSA9IDEwNDg1NzY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBNRUJJX1BPUyA9IDEzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgR0lHQSA9IDEwMDAwMDAwMDBMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgR0lHQV9QT1MgPSAxODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEdJQkkgPSAxMDczNzQxODI0TDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIEdJQklfUE9TID0gMjI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVJBID0gMTAwMDAwMDAwMDAwMEw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBURVJBX1BPUyA9IDI3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEVCSSA9IDEwOTk1MTE2Mjc3NzZMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgVEVCSV9QT1MgPSAzMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIEVORF9QT1MgPSAzNjsKKworICAgIC8qKiBVc2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJWkVfS0VZID0gInZhbHVlIjsKKyAgICAvKiogVXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTklUU19LRVkgPSAidW5pdHMiOworICAgIC8qKiBVc2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRU5fS0VZID0gIndoZW4iOworCisgICAgcHJpdmF0ZSBsb25nIHNpemUgPSAtMTsKKyAgICBwcml2YXRlIGxvbmcgbXVsdGlwbGllciA9IDE7CisgICAgcHJpdmF0ZSBsb25nIHNpemVsaW1pdCA9IC0xOworICAgIHByaXZhdGUgQ29tcGFyaXNvbiB3aGVuID0gQ29tcGFyaXNvbi5FUVVBTDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2l6ZVNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTaXplU2VsZWN0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkCisgICAgICogU2l6ZVNlbGVjdG9yLiBUaGlzIGlzICJ7c2l6ZXNlbGVjdG9yIHZhbHVlOiAiICsgPCJjb21wYXJlIiwKKyAgICAgKiAibGVzcyIsICJtb3JlIiwgImVxdWFsIj4gKyAifSIuCisgICAgICogQHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIntzaXplc2VsZWN0b3IgdmFsdWU6ICIpOworICAgICAgICBidWYuYXBwZW5kKHNpemVsaW1pdCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoImNvbXBhcmU6ICIpLmFwcGVuZCh3aGVuLmdldFZhbHVlKCkpOworICAgICAgICBidWYuYXBwZW5kKCJ9Iik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNpemUgc2VsZWN0b3IgbmVlZHMgdG8ga25vdyB3aGF0IHNpemUgdG8gYmFzZSBpdHMgc2VsZWN0aW5nIG9uLgorICAgICAqIFRoaXMgd2lsbCBiZSBmdXJ0aGVyIG1vZGlmaWVkIGJ5IHRoZSBtdWx0aXBsaWVyIHRvIGdldCBhbgorICAgICAqIGFjdHVhbCBzaXplIGxpbWl0LgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgdG8gc2VsZWN0IGFnYWluc3QgZXhwcmVzc2VkIGluIHVuaXRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGxvbmcgc2l6ZSkgeworICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgICBpZiAobXVsdGlwbGllciAhPSAwICYmIHNpemUgPiAtMSkgeworICAgICAgICAgICAgc2l6ZWxpbWl0ID0gc2l6ZSAqIG11bHRpcGxpZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB1bml0cyB0byB1c2UgZm9yIHRoZSBjb21wYXJpc29uLiBUaGlzIGlzIGEgbGl0dGxlCisgICAgICogY29tcGxpY2F0ZWQgYmVjYXVzZSBjb21tb24gdXNhZ2UgaGFzIGNyZWF0ZWQgc3RhbmRhcmRzIHRoYXQKKyAgICAgKiBwbGF5IGhhdm9jIHdpdGggY2FwaXRhbGl6YXRpb24gcnVsZXMuIFRodXMsIHNvbWUgcGVvcGxlIHdpbGwKKyAgICAgKiB1c2UgIksiIGZvciBpbmRpY2F0aW5nIDEwMDAncywgd2hlbiB0aGUgU0kgc3RhbmRhcmQgY2FsbHMgZm9yCisgICAgICogImsiLiBPdGhlcnMgaGF2ZSB0cmllZCB0byBpbnRyb2R1Y2UgIksiIGFzIGEgbXVsdGlwbGUgb2YgMTAyNCwKKyAgICAgKiBidXQgdGhhdCBmYWxscyBkb3duIHdoZW4geW91IHJlYWNoICJNIiwgc2luY2UgIm0iIGlzIGFscmVhZHkKKyAgICAgKiBkZWZpbmVkIGFzIDAuMDAxLgorICAgICAqIDxwPgorICAgICAqIFRvIGdldCBhcm91bmQgdGhpcyBjb21wbGV4aXR5LCBhIG51bWJlciBvZiBzdGFuZGFyZHMgYm9kaWVzCisgICAgICogaGF2ZSBwcm9wb3NlZCB0aGUgMl4xMCBzdGFuZGFyZCwgYW5kIGF0IGxlYXN0IG9uZSBoYXMgYWRvcHRlZAorICAgICAqIGl0LiBCdXQgd2UgYXJlIHN0aWxsIGxlZnQgd2l0aCBhIHBvcHVsYWNlIHRoYXQgaXNuJ3QgY2xlYXIgb24KKyAgICAgKiBob3cgY2FwaXRhbGl6YXRpb24gc2hvdWxkIHdvcmsuCisgICAgICogPHA+CisgICAgICogV2UgdGhlcmVmb3JlIGlnbm9yZSBjYXBpdGFsaXphdGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgICAqIENvbXBsZXRlbHkgbWl4ZWQgY2FzZSBpcyBub3QgcG9zc2libGUsIGJ1dCBhbGwgdXBwZXIgYW5kIGxvd2VyCisgICAgICogZm9ybXMgYXJlIGFjY2VwdGVkIGZvciBhbGwgbG9uZyBhbmQgc2hvcnQgZm9ybXMuIFNpbmNlIHdlIGhhdmUKKyAgICAgKiBubyBuZWVkIHRvIHdvcmsgd2l0aCB0aGUgMC4wMDEgY2FzZSwgdGhpcyBwcmFjdGljZSB3b3JrcyBoZXJlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyBhbGwgdGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIHRoYXQgYQorICAgICAqIHVuaXQgcHJlZml4IGNhbiBvY2N1ciBpbiBhbmQgdHJhbnNsYXRlcyB0aGVtIGludG8gYSBzaW5nbGUKKyAgICAgKiBtdWx0aXBsaWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHVuaXRzIFRoZSB1bml0cyB0byBjb21wYXJlIHRoZSBzaXplIHRvLCB1c2luZyBhbgorICAgICAqICAgICAgICBFbnVtZXJhdGVkQXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVuaXRzKEJ5dGVVbml0cyB1bml0cykgeworICAgICAgICBpbnQgaSA9IHVuaXRzLmdldEluZGV4KCk7CisgICAgICAgIG11bHRpcGxpZXIgPSAwOworICAgICAgICBpZiAoaSA+IC0xICYmIGkgPCBLSUJJX1BPUykgeworICAgICAgICAgICAgbXVsdGlwbGllciA9IEtJTE87CisgICAgICAgIH0gZWxzZSBpZiAoaSA8IE1FR0FfUE9TKSB7CisgICAgICAgICAgICBtdWx0aXBsaWVyID0gS0lCSTsKKyAgICAgICAgfSBlbHNlIGlmIChpIDwgTUVCSV9QT1MpIHsKKyAgICAgICAgICAgIG11bHRpcGxpZXIgPSBNRUdBOworICAgICAgICB9IGVsc2UgaWYgKGkgPCBHSUdBX1BPUykgeworICAgICAgICAgICAgbXVsdGlwbGllciA9IE1FQkk7CisgICAgICAgIH0gZWxzZSBpZiAoaSA8IEdJQklfUE9TKSB7CisgICAgICAgICAgICBtdWx0aXBsaWVyID0gR0lHQTsKKyAgICAgICAgfSBlbHNlIGlmIChpIDwgVEVSQV9QT1MpIHsKKyAgICAgICAgICAgIG11bHRpcGxpZXIgPSBHSUJJOworICAgICAgICB9IGVsc2UgaWYgKGkgPCBURUJJX1BPUykgeworICAgICAgICAgICAgbXVsdGlwbGllciA9IFRFUkE7CisgICAgICAgIH0gZWxzZSBpZiAoaSA8IEVORF9QT1MpIHsKKyAgICAgICAgICAgIG11bHRpcGxpZXIgPSBURUJJOworICAgICAgICB9CisgICAgICAgIGlmIChtdWx0aXBsaWVyID4gMCAmJiBzaXplID4gLTEpIHsKKyAgICAgICAgICAgIHNpemVsaW1pdCA9IHNpemUgKiBtdWx0aXBsaWVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBzcGVjaWZpZXMgd2hlbiB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQsIHdoZXRoZXIgaXQgYmUKKyAgICAgKiB3aGVuIHRoZSBmaWxlIG1hdGNoZXMgYSBwYXJ0aWN1bGFyIHNpemUsIHdoZW4gaXQgaXMgc21hbGxlciwKKyAgICAgKiBvciB3aGV0aGVyIGl0IGlzIGxhcmdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGVuIFRoZSBjb21wYXJpc29uIHRvIHBlcmZvcm0sIGFuIEVudW1lcmF0ZWRBdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2hlbihTaXplQ29tcGFyaXNvbnMgd2hlbikgeworICAgICAgICB0aGlzLndoZW4gPSB3aGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdXNpbmcgdGhpcyBhcyBhIGN1c3RvbSBzZWxlY3RvciwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCisgICAgICogSXQgdHJhbnNsYXRlcyBlYWNoIHBhcmFtZXRlciBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzZXRYWFgoKSBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIGNvbXBsZXRlIHNldCBvZiBwYXJhbWV0ZXJzIGZvciB0aGlzIHNlbGVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOworICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1uYW1lID0gcGFyYW1ldGVyc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKFNJWkVfS0VZLmVxdWFsc0lnbm9yZUNhc2UocGFyYW1uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUoTG9uZy5wYXJzZUxvbmcocGFyYW1ldGVyc1tpXS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCJJbnZhbGlkIHNpemUgc2V0dGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyYW1ldGVyc1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVU5JVFNfS0VZLmVxdWFsc0lnbm9yZUNhc2UocGFyYW1uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBCeXRlVW5pdHMgdW5pdHMgPSBuZXcgQnl0ZVVuaXRzKCk7CisgICAgICAgICAgICAgICAgICAgIHVuaXRzLnNldFZhbHVlKHBhcmFtZXRlcnNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHNldFVuaXRzKHVuaXRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFdIRU5fS0VZLmVxdWFsc0lnbm9yZUNhc2UocGFyYW1uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBTaXplQ29tcGFyaXNvbnMgc2NtcCA9IG5ldyBTaXplQ29tcGFyaXNvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgc2NtcC5zZXRWYWx1ZShwYXJhbWV0ZXJzW2ldLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRXaGVuKHNjbXApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciAiICsgcGFyYW1uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5DaGVja3MgdG8gbWFrZSBzdXJlIGFsbCBzZXR0aW5ncyBhcmUga29zaGVyLiBJbiB0aGlzIGNhc2UsIGl0CisgICAgICogbWVhbnMgdGhhdCB0aGUgc2l6ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0ICh0byBhIHBvc2l0aXZlIHZhbHVlKSwKKyAgICAgKiB0aGF0IHRoZSBtdWx0aXBsaWVyIGhhcyBhIHZhbGlkIHNldHRpbmcsIGFuZCB0aGF0IHRoZSBzaXplIGxpbWl0CisgICAgICogaXMgdmFsaWQuIFNpbmNlIHRoZSBsYXR0ZXIgaXMgYSBjYWxjdWxhdGVkIHZhbHVlLCB0aGlzIGNhbiBvbmx5CisgICAgICogZmFpbCBkdWUgdG8gYSBwcm9ncmFtbWluZyBlcnJvci4KKyAgICAgKiA8L3A+CisgICAgICogPHA+SWYgYSBwcm9ibGVtIGlzIGRldGVjdGVkLCB0aGUgc2V0RXJyb3IoKSBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlTZXR0aW5ncygpIHsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBzZXRFcnJvcigiVGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCwgYW5kIG11c3QgYmUgcG9zaXRpdmUiKTsKKyAgICAgICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyIDwgMSkgeworICAgICAgICAgICAgc2V0RXJyb3IoIkludmFsaWQgVW5pdHMgc3VwcGxpZWQsIG11c3QgYmUgSyxLaSxNLE1pLEcsR2ksVCxvciBUaSIpOworICAgICAgICB9IGVsc2UgaWYgKHNpemVsaW1pdCA8IDApIHsKKyAgICAgICAgICAgIHNldEVycm9yKCJJbnRlcm5hbCBlcnJvcjogQ29kZSBpcyBub3Qgc2V0dGluZyBzaXplbGltaXQgY29ycmVjdGx5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gVGhpcyBpcyB3aGVyZSB0aGUgc2VsZWN0b3IgZ2V0cyB0byBkZWNpZGUKKyAgICAgKiBvbiB0aGUgaW5jbHVzaW9uIG9mIGEgZmlsZSBpbiBhIHBhcnRpY3VsYXIgZmlsZXNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlZGlyIEEgamF2YS5pby5GaWxlIG9iamVjdCBmb3IgdGhlIGJhc2UgZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjay4KKyAgICAgKiBAcGFyYW0gZmlsZSBBIEZpbGUgb2JqZWN0IGZvciB0aGlzIGZpbGVuYW1lLgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgeworCisgICAgICAgIC8vIHRocm93IEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICAgIHZhbGlkYXRlKCk7CisKKyAgICAgICAgLy8gRGlyZWN0b3J5IHNpemUgbmV2ZXIgc2VsZWN0ZWQgZm9yCisgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGxvbmcgZGlmZiA9IGZpbGUubGVuZ3RoKCkgLSBzaXplbGltaXQ7CisgICAgICAgIHJldHVybiB3aGVuLmV2YWx1YXRlKGRpZmYgPT0gMCA/IDAgOiAoaW50KSAoZGlmZiAvIE1hdGguYWJzKGRpZmYpKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgZm9yIHVuaXRzLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgdHJlYXRzIHRoZSBzdGFuZGFyZCBTSSB1bml0cyBhcyByZXByZXNlbnRpbmcgcG93ZXJzIG9mIHRlbiwKKyAgICAgKiBhcyB0aGV5IHNob3VsZC4gSWYgeW91IHdhbnQgdGhlIHBvd2VycyBvZiAyIHRoYXQgYXBwcm94aW1hdGUKKyAgICAgKiB0aGUgU0kgdW5pdHMsIHVzZSB0aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgYQorICAgICAqIDxjb2RlPmJpPC9jb2RlPi4gU28gMTAyNCAoMl4xMCkgYmVjb21lcyA8Y29kZT5raWJpPC9jb2RlPiwKKyAgICAgKiAxMDQ4NTc2ICgyXjIwKSBiZWNvbWVzIDxjb2RlPm1lYmk8L2NvZGU+LCAxMDczNzQxODI0ICgyXjMwKQorICAgICAqIGJlY29tZXMgPGNvZGU+Z2liaTwvY29kZT4sIGFuZCBzbyBvbi4gVGhlIHN5bWJvbHMgYXJlIGFsc28KKyAgICAgKiBhY2NlcHRlZCwgYW5kIHRoZXNlIGFyZSB0aGUgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkIGZvbGxvd2VkCisgICAgICogYnkgYW4gPGNvZGU+aTwvY29kZT4uIDxjb2RlPktpPC9jb2RlPiwgPGNvZGU+TWk8L2NvZGU+LAorICAgICAqIDxjb2RlPkdpPC9jb2RlPiwgYW5kIHNvIG9uLiBDYXBpdGFsaXphdGlvbiB2YXJpYXRpb25zIG9uIHRoZXNlCisgICAgICogYXJlIGFsc28gYWNjZXB0ZWQuCisgICAgICogPHA+CisgICAgICogVGhpcyBiaW5hcnkgcHJlZml4IHN5c3RlbSBpcyBhcHByb3ZlZCBieSB0aGUgSUVDIGFuZCBhcHBlYXJzIG9uCisgICAgICogaXRzIHdheSBmb3IgYXBwcm92YWwgYnkgb3RoZXIgYWdlbmNpZXMsIGJ1dCBpdCBpcyBub3QgYW4gU0kKKyAgICAgKiBzdGFuZGFyZC4gSXQgZGlzYW1iaWd1YXRlcyB0aGluZ3MgZm9yIHVzLCB0aG91Z2guCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCeXRlVW5pdHMgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlcyBhcyBhbiBhcnJheSBvZiBzdHJpbmdzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsiSyIsICJrIiwgImtpbG8iLCAiS0lMTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLaSIsICJLSSIsICJraSIsICJraWJpIiwgIktJQkkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTSIsICJtIiwgIm1lZ2EiLCAiTUVHQSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaSIsICJNSSIsICJtaSIsICJtZWJpIiwgIk1FQkkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRyIsICJnIiwgImdpZ2EiLCAiR0lHQSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHaSIsICJHSSIsICJnaSIsICJnaWJpIiwgIkdJQkkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVCIsICJ0IiwgInRlcmEiLCAiVEVSQSIsCisgICAgICAgICAgIC8qIFlvdSB3aXNoISAqLyAgICAgICJUaSIsICJUSSIsICJ0aSIsICJ0ZWJpIiwgIlRFQkkiCisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWVzIGZvciBzaXplIGNvbXBhcmlzb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaXplQ29tcGFyaXNvbnMgZXh0ZW5kcyBDb21wYXJpc29uIHsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1R5cGVTZWxlY3Rvci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1R5cGVTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYWM0NDMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVHlwZVNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKKworLyoqCisgKiBTZWxlY3RvciB0aGF0IHNlbGVjdHMgYSBjZXJ0YWluIGtpbmQgb2YgZmlsZTogZGlyZWN0b3J5IG9yIHJlZ3VsYXIuCisgKgorICogQHNpbmNlIDEuNgorICovCitwdWJsaWMgY2xhc3MgVHlwZVNlbGVjdG9yIGV4dGVuZHMgQmFzZUV4dGVuZFNlbGVjdG9yIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOworCisgICAgLyoqIEtleSB0byB1c2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfS0VZID0gInR5cGUiOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UeXBlU2VsZWN0b3I8L2NvZGU+IGluc3RhbmNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFR5cGVTZWxlY3RvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigie3R5cGVzZWxlY3RvciB0eXBlOiAiKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0eXBlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0eXBlIG9mIGZpbGUgdG8gcmVxdWlyZS4KKyAgICAgKiBAcGFyYW0gZmlsZVR5cGVzIHRoZSB0eXBlIG9mIGZpbGUgLSBmaWxlIG9yIGRpcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoRmlsZVR5cGUgZmlsZVR5cGVzKSB7CisgICAgICAgIHRoaXMudHlwZSA9IGZpbGVUeXBlcy5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdXNpbmcgdGhpcyBhcyBhIGN1c3RvbSBzZWxlY3RvciwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCisgICAgICogSXQgdHJhbnNsYXRlcyBlYWNoIHBhcmFtZXRlciBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzZXRYWFgoKSBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIGNvbXBsZXRlIHNldCBvZiBwYXJhbWV0ZXJzIGZvciB0aGlzIHNlbGVjdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKSB7CisgICAgICAgIHN1cGVyLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbW5hbWUgPSBwYXJhbWV0ZXJzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoVFlQRV9LRVkuZXF1YWxzSWdub3JlQ2FzZShwYXJhbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVUeXBlIHQgPSBuZXcgRmlsZVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShwYXJhbWV0ZXJzW2ldLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRUeXBlKHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciAiICsgcGFyYW1uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gbWFrZSBzdXJlIGFsbCBzZXR0aW5ncyBhcmUga29zaGVyLiBJbiB0aGlzIGNhc2UsIGl0CisgICAgICogbWVhbnMgdGhhdCB0aGUgcGF0dGVybiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmVyaWZ5U2V0dGluZ3MoKSB7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldEVycm9yKCJUaGUgdHlwZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBoZWFydCBvZiB0aGUgbWF0dGVyLiBUaGlzIGlzIHdoZXJlIHRoZSBzZWxlY3RvciBnZXRzIHRvIGRlY2lkZQorICAgICAqIG9uIHRoZSBpbmNsdXNpb24gb2YgYSBmaWxlIGluIGEgcGFydGljdWxhciBmaWxlc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VkaXIgdGhlIGJhc2UgZGlyZWN0b3J5IHRoZSBzY2FuIGlzIGJlaW5nIGRvbmUgZnJvbQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBmaWxlIGlzIGEgamF2YS5pby5GaWxlIG9iamVjdCB0aGUgc2VsZWN0b3IgY2FuIHVzZQorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CisKKyAgICAgICAgLy8gdGhyb3cgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgICAgdmFsaWRhdGUoKTsKKworICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoRmlsZVR5cGUuRElSKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhGaWxlVHlwZS5GSUxFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZWQgYXR0cmlidXRlIHdpdGggdGhlIHZhbHVlcyBmb3IgdHlwZXMgb2YgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZVR5cGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqIHRoZSBzdHJpbmcgdmFsdWUgZm9yIGZpbGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRSA9ICJmaWxlIjsKKyAgICAgICAgLyoqIHRoZSBzdHJpbmcgdmFsdWUgZm9yIGRpciAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVIgPSAiZGlyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWVzIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tde0ZJTEUsIERJUn07CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvQWxnb3JpdGhtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9BbGdvcml0aG0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmUwNDNiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvQWxnb3JpdGhtLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKworLyoqCisgKiBUaGUgPGk+QWxnb3JpdGhtPC9pPiBkZWZpbmVzIGhvdyBhIHZhbHVlIGZvciBhIGZpbGUgaXMgY29tcHV0ZWQuCisgKiBJdCBtdXN0IGJlIHN1cmUgdGhhdCBtdWx0aXBsZSBjYWxscyBmb3IgdGhlIHNhbWUgZmlsZSByZXN1bHRzIGluIHRoZQorICogc2FtZSB2YWx1ZS4KKyAqIFRoZSBpbXBsZW1lbnRpbmcgY2xhc3Mgc2hvdWxkIGltcGxlbWVudCBhIHVzZWZ1bCB0b1N0cmluZygpIG1ldGhvZC4KKyAqCisgKiBAdmVyc2lvbiAyMDAzLTA5LTEzCisgKiBAc2luY2UgIEFudCAxLjYKKyAqLworcHVibGljIGludGVyZmFjZSBBbGdvcml0aG0geworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGl0cyBwcmVyZXF1aXNpdGVzLgorICAgICAqIEByZXR1cm4gPGk+dHJ1ZTwvaT4gaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPGk+ZmFsc2U8L2k+LgorICAgICAqLworICAgIGJvb2xlYW4gaXNWYWxpZCgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBmaWxlLgorICAgICAqIEBwYXJhbSBmaWxlICAgIEZpbGUgb2JqZWN0IGZvciB3aGljaCB0aGUgdmFsdWUgc2hvdWxkIGJlIGV2YWx1YXRlZC4KKyAgICAgKiBAcmV0dXJuICAgICAgICBUaGUgdmFsdWUgZm9yIHRoYXQgZmlsZQorICAgICAqLworICAgIFN0cmluZyBnZXRWYWx1ZShGaWxlIGZpbGUpOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvQ2FjaGUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0NhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhNjFmYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0NhY2hlLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKworLyoqCisgKiBBIENhY2hlIGxldCB0aGUgdXNlciBzdG9yZSBrZXktdmFsdWUtcGFpcnMgaW4gYSBwZXJtYW5lbnQgbWFubmVyIGFuZCBhY2Nlc3MKKyAqIHRoZW0uCisgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGEgY2xpZW50IHVzZXMgZ2V0KCkgYmVmb3JlIGxvYWQoKSB0aGVyZWZvcmUgdGhlCisgKiBpbXBsZW1lbnRhdGlvbiBtdXN0IGVuc3VyZSB0aGF0IG5vIGVycm9yIG9jY3VycmVkIGJlY2F1c2Ugb2YgdGhlIHdyb25nCisgKiA8aT5vcmRlcjwvaT4uCisgKiBUaGUgaW1wbGVtZW50aW5nIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQgYSB1c2VmdWwgdG9TdHJpbmcoKSBtZXRob2QuCisgKgorICogQHZlcnNpb24gMjAwMy0wOS0xMworICogQHNpbmNlICBBbnQgMS42CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2FjaGUgeworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGl0cyBwcmVyZXF1aXNpdGVzLgorICAgICAqIEByZXR1cm4gPGk+dHJ1ZTwvaT4gaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPGk+ZmFsc2U8L2k+LgorICAgICAqLworICAgIGJvb2xlYW4gaXNWYWxpZCgpOworCisgICAgLyoqIERlbGV0ZXMgdGhlIGNhY2hlLiBJZiBmaWxlIGJhc2VkIHRoZSBmaWxlIGhhcyB0byBiZSBkZWxldGVkIGFsc28uICovCisgICAgdm9pZCBkZWxldGUoKTsKKworICAgIC8qKiBMb2FkcyB0aGUgY2FjaGUsIG11c3QgaGFuZGxlIG5vdCBleGlzdGluZyBjYWNoZS4gKi8KKyAgICB2b2lkIGxvYWQoKTsKKworICAgIC8qKiBTYXZlcyBtb2RpZmljYXRpb24gb2YgdGhlIGNhY2hlLiAqLworICAgIHZvaWQgc2F2ZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZhbHVlIGZvciBhIGdpdmVuIGtleSBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKKyAgICAgKiBAcmV0dXJuIHRoZSBzdG9yZWQgdmFsdWUKKyAgICAgKi8KKyAgICBPYmplY3QgZ2V0KE9iamVjdCBrZXkpOworCisgICAgLyoqCisgICAgICogU2F2ZXMgYSBrZXktdmFsdWUtcGFpciBpbiB0aGUgY2FjaGUuCisgICAgICogQHBhcmFtIGtleSB0aGUga2V5CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQorICAgICAqLworICAgIHZvaWQgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgaW4gdGhlIGNhY2hlLgorICAgICAqIEByZXR1cm4gQW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cy4KKyAgICAgKi8KKyAgICBJdGVyYXRvciBpdGVyYXRvcigpOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvQ2hlY2tzdW1BbGdvcml0aG0uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0NoZWNrc3VtQWxnb3JpdGhtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhZWU1MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0NoZWNrc3VtQWxnb3JpdGhtLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3RvcjsKKworCitpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja3N1bTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOworaW1wb3J0IGphdmEudXRpbC56aXAuQWRsZXIzMjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNoZWNrZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQ29tcHV0ZXMgYSAnY2hlY2tzdW0nIGZvciB0aGUgY29udGVudCBvZiBmaWxlIHVzaW5nCisgKiBqYXZhLnV0aWwuemlwLkNSQzMyIGFuZCBqYXZhLnV0aWwuemlwLkFkbGVyMzIuCisgKiBVc2Ugb2YgdGhpcyBhbGdvcml0aG0gZG9lc24ndCByZXF1aXJlIGFueSBhZGRpdGlvbmFsIG5lc3RlZCA8cGFyYW0+cy4KKyAqIFN1cHBvcnRlZCA8cGFyYW0+cyBhcmU6CisgKiA8dGFibGU+CisgKiA8dHI+CisgKiAgIDx0aD5uYW1lPC90aD48dGg+dmFsdWVzPC90aD48dGg+ZGVzY3JpcHRpb248L3RoPjx0aD5yZXF1aXJlZDwvdGg+CisgKiA8L3RyPgorICogPHRyPgorICogICA8dGQ+IGFsZ29yaXRobS5hbGdvcml0aG0gPC90ZD4KKyAqICAgPHRkPiBBRExFUiB8IENSQyAoIGRlZmF1bHQgKSA8L3RkPgorICogICA8dGQ+IG5hbWUgb2YgdGhlIGFsZ29yaXRobSB0aGUgY2hlY2tzdW0gc2hvdWxkIHVzZSA8L3RkPgorICogICA8dGQ+IG5vLCBkZWZhdWx0cyB0byBDUkMgPC90ZD4KKyAqIDwvdHI+CisgKiA8L3RhYmxlPgorICoKKyAqIEB2ZXJzaW9uIDIwMDQtMDYtMTcKKyAqIEBzaW5jZSAgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgQ2hlY2tzdW1BbGdvcml0aG0gaW1wbGVtZW50cyBBbGdvcml0aG0geworCisKKyAgICAvLyAtLS0tLSAgbWVtYmVyIHZhcmlhYmxlcyAgLS0tLS0KKworCisgICAgLyoqCisgICAgICogQ2hlY2tzdW0gYWxnb3JpdGhtIHRvIGJlIHVzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWxnb3JpdGhtID0gIkNSQyI7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3N1bSBpbnRlcmZhY2UgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIENoZWNrc3VtIGNoZWNrc3VtID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0gIEFsZ29yaXRobS1Db25maWd1cmF0aW9uICAtLS0tLQorCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFsZ29yaXRobSB0byBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGNoZWNrc3VtLgorICAgICAqIERlZmF1bHRzIHRvICJDUkMiLiBPdGhlciBwb3B1bGFyIGFsZ29yaXRobXMgbGlrZSAiQURMRVIiIG1heSBiZSB1c2VkIGFzIHdlbGwuCisgICAgICogQHBhcmFtIGFsZ29yaXRobSB0aGUgZGlnZXN0IGFsZ29yaXRobSB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGdvcml0aG0oU3RyaW5nIGFsZ29yaXRobSkgeworICAgICAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobTsKKyAgICB9CisKKworICAgIC8qKiBJbml0aWFsaXplIHRoZSBjaGVja3N1bSBpbnRlcmZhY2UuICovCisgICAgcHVibGljIHZvaWQgaW5pdENoZWNrc3VtKCkgeworICAgICAgICBpZiAoY2hlY2tzdW0gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgiQ1JDIi5lcXVhbHNJZ25vcmVDYXNlKGFsZ29yaXRobSkpIHsKKyAgICAgICAgICAgIGNoZWNrc3VtID0gbmV3IENSQzMyKCk7CisgICAgICAgIH0gZWxzZSBpZiAoIkFETEVSIi5lcXVhbHNJZ25vcmVDYXNlKGFsZ29yaXRobSkpIHsKKyAgICAgICAgICAgIGNoZWNrc3VtID0gbmV3IEFkbGVyMzIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihuZXcgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLSAgTG9naWMgIC0tLS0tCisKKworICAgIC8qKgorICAgICAqIFRoaXMgYWxnb3JpdGhtIHN1cHBvcnRzIG9ubHkgQ1JDIGFuZCBBZGxlci4KKyAgICAgKiBAcmV0dXJuIDxpPnRydWU8L2k+IGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDxpPmZhbHNlPC9pPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gIkNSQyIuZXF1YWxzSWdub3JlQ2FzZShhbGdvcml0aG0pIHx8ICJBRExFUiIuZXF1YWxzSWdub3JlQ2FzZShhbGdvcml0aG0pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tcHV0ZXMgYSB2YWx1ZSBmb3IgYSBmaWxlIGNvbnRlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNoZWNrc3VtIGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gZmlsZSAgICBGaWxlIG9iamVjdCBmb3Igd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBldmFsdWF0ZWQuCisgICAgICogQHJldHVybiAgICAgICAgVGhlIHZhbHVlIGZvciB0aGF0IGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKEZpbGUgZmlsZSkgeworICAgICAgICBpbml0Q2hlY2tzdW0oKTsKKyAgICAgICAgU3RyaW5nIHJ2YWwgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAgY2hlY2tzdW0ucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgIENoZWNrZWRJbnB1dFN0cmVhbSBjaGVjayA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0oZmlzLCBjaGVja3N1bSk7CisgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjaGVjayk7CisgICAgICAgICAgICAgICAgIHdoaWxlIChpbi5yZWFkKCkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBydmFsID0gTG9uZy50b1N0cmluZyhjaGVjay5nZXRDaGVja3N1bSgpLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcnZhbCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2YWw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBPYmplY3QudG9TdHJpbmcoKS4KKyAgICAgKiBAcmV0dXJuIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhbGdvcml0aG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiPENoZWNrc3VtQWxnb3JpdGhtOiIpOworICAgICAgICBidWYuYXBwZW5kKCJhbGdvcml0aG09IikuYXBwZW5kKGFsZ29yaXRobSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIj4iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0RpZ2VzdEFsZ29yaXRobS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvRGlnZXN0QWxnb3JpdGhtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5NzE4MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0RpZ2VzdEFsZ29yaXRobS5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3I7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQ29tcHV0ZXMgYSAnaGFzaHZhbHVlJyBmb3IgdGhlIGNvbnRlbnQgb2YgZmlsZSB1c2luZworICogamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0LgorICogVXNlIG9mIHRoaXMgYWxnb3JpdGhtIGRvZXNuJ3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbCBuZXN0ZWQgPHBhcmFtPnMuCisgKiBTdXBwb3J0ZWQgPHBhcmFtPnMgYXJlOgorICogPHRhYmxlPgorICogPHRyPgorICogICA8dGg+bmFtZTwvdGg+PHRoPnZhbHVlczwvdGg+PHRoPmRlc2NyaXB0aW9uPC90aD48dGg+cmVxdWlyZWQ8L3RoPgorICogPC90cj4KKyAqIDx0cj4KKyAqICAgPHRkPiBhbGdvcml0aG0uYWxnb3JpdGhtIDwvdGQ+CisgKiAgIDx0ZD4gTUQ1IHwgU0hBIChkZWZhdWx0IHByb3ZpZGVyKSA8L3RkPgorICogICA8dGQ+IG5hbWUgb2YgdGhlIGFsZ29yaXRobSB0aGUgcHJvdmlkZXIgc2hvdWxkIHVzZSA8L3RkPgorICogICA8dGQ+IG5vLCBkZWZhdWx0cyB0byBNRDUgPC90ZD4KKyAqIDwvdHI+CisgKiA8dHI+CisgKiAgIDx0ZD4gYWxnb3JpdGhtLnByb3ZpZGVyIDwvdGQ+CisgKiAgIDx0ZD4gPC90ZD4KKyAqICAgPHRkPiBuYW1lIG9mIHRoZSBwcm92aWRlciB0byB1c2UgPC90ZD4KKyAqICAgPHRkPiBubywgZGVmYXVsdHMgdG8gPGk+bnVsbDwvaT4gPC90ZD4KKyAqIDwvdHI+CisgKiA8L3RhYmxlPgorICoKKyAqIEB2ZXJzaW9uIDIwMDQtMDctMDgKKyAqIEBzaW5jZSAgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgRGlnZXN0QWxnb3JpdGhtIGltcGxlbWVudHMgQWxnb3JpdGhtIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFX01BU0sgPSAweEZGOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDgxOTI7CisKKyAgICAvLyAtLS0tLSAgbWVtYmVyIHZhcmlhYmxlcyAgLS0tLS0KKworCisgICAgLyoqCisgICAgICogTWVzc2FnZURpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhbGdvcml0aG0gPSAiTUQ1IjsKKworICAgIC8qKgorICAgICAqIE1lc3NhZ2VEaWdlc3QgQWxnb3JpdGhtIHByb3ZpZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvdmlkZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogTWVzc2FnZSBEaWdlc3QgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIE1lc3NhZ2VEaWdlc3QgbWVzc2FnZURpZ2VzdCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTaXplIG9mIHRoZSByZWFkIGJ1ZmZlciB0byB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmVhZEJ1ZmZlclNpemUgPSBCVUZGRVJfU0laRTsKKworCisgICAgLy8gLS0tLS0gIEFsZ29yaXRobS1Db25maWd1cmF0aW9uICAtLS0tLQorCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFsZ29yaXRobSB0byBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGNoZWNrc3VtLgorICAgICAqIERlZmF1bHRzIHRvICJNRDUiLiBPdGhlciBwb3B1bGFyIGFsZ29yaXRobXMgbGlrZSAiU0hBIiBtYXkgYmUgdXNlZCBhcyB3ZWxsLgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0gdGhlIGRpZ2VzdCBhbGdvcml0aG0gdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxnb3JpdGhtKFN0cmluZyBhbGdvcml0aG0pIHsKKyAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBNZXNzYWdlRGlnZXN0IGFsZ29yaXRobSBwcm92aWRlciB0byBiZSB1c2VkCisgICAgICogdG8gY2FsY3VsYXRlIHRoZSBjaGVja3N1bS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIgcHJvdmlkZXIgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvdmlkZXIoU3RyaW5nIHByb3ZpZGVyKSB7CisgICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICB9CisKKworICAgIC8qKiBJbml0aWFsaXplIHRoZSBzZWN1cml0eSBtZXNzYWdlIGRpZ2VzdC4gKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0TWVzc2FnZURpZ2VzdCgpIHsKKyAgICAgICAgaWYgKG1lc3NhZ2VEaWdlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwcm92aWRlciAhPSBudWxsKSAmJiAhIiIuZXF1YWxzKHByb3ZpZGVyKSAmJiAhIm51bGwiLmVxdWFscyhwcm92aWRlcikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZURpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtLCBwcm92aWRlcik7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbm9hbGdvKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG5vYWxnbyk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBub3Byb3ZpZGVyKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG5vcHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlRGlnZXN0ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShhbGdvcml0aG0pOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG5vYWxnbykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihub2FsZ28pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLSAgTG9naWMgIC0tLS0tCisKKworICAgIC8qKgorICAgICAqIFRoaXMgYWxnb3JpdGhtIHN1cHBvcnRzIG9ubHkgTUQ1IGFuZCBTSEEuCisgICAgICogQHJldHVybiA8aT50cnVlPC9pPiBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8aT5mYWxzZTwvaT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuICJTSEEiLmVxdWFsc0lnbm9yZUNhc2UoYWxnb3JpdGhtKSB8fCAiTUQ1Ii5lcXVhbHNJZ25vcmVDYXNlKGFsZ29yaXRobSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyBhIHZhbHVlIGZvciBhIGZpbGUgY29udGVudCB3aXRoIHRoZSBzcGVjaWZpZWQgZGlnZXN0IGFsZ29yaXRobS4KKyAgICAgKiBAcGFyYW0gZmlsZSAgICBGaWxlIG9iamVjdCBmb3Igd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBldmFsdWF0ZWQuCisgICAgICogQHJldHVybiAgICAgICAgVGhlIHZhbHVlIGZvciB0aGF0IGZpbGUKKyAgICAgKi8KKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZyb20gLi4udGFza2RlZnMuQ2hlY2tzdW0sIHRoYW5rcyB0byBNYWdlc2ggZm9yIGhpbnQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKEZpbGUgZmlsZSkgeworICAgICAgICBpbml0TWVzc2FnZURpZ2VzdCgpOworICAgICAgICBTdHJpbmcgY2hlY2tzdW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFmaWxlLmNhblJlYWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtyZWFkQnVmZmVyU2l6ZV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VEaWdlc3QucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgICAgIERpZ2VzdElucHV0U3RyZWFtIGRpcyA9IG5ldyBEaWdlc3RJbnB1dFN0cmVhbShmaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VEaWdlc3QpOworICAgICAgICAgICAgICAgIHdoaWxlIChkaXMucmVhZChidWYsIDAsIHJlYWRCdWZmZXJTaXplKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIGZpcyA9IG51bGw7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGZpbGVEaWdlc3QgPSBtZXNzYWdlRGlnZXN0LmRpZ2VzdCgpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjaGVja3N1bVNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZURpZ2VzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGV4U3RyCisgICAgICAgICAgICAgICAgICAgICAgICA9IEludGVnZXIudG9IZXhTdHJpbmcoQllURV9NQVNLICYgZmlsZURpZ2VzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZXhTdHIubGVuZ3RoKCkgPCAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bVNiLmFwcGVuZCgiMCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtU2IuYXBwZW5kKGhleFN0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW1TYi50b1N0cmluZygpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGVja3N1bTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIE9iamVjdC50b1N0cmluZygpLgorICAgICAqIEByZXR1cm4gc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFsZ29yaXRobS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCI8RGlnZXN0QWxnb3JpdGhtOiIpOworICAgICAgICBidWYuYXBwZW5kKCJhbGdvcml0aG09IikuYXBwZW5kKGFsZ29yaXRobSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIjtwcm92aWRlcj0iKS5hcHBlbmQocHJvdmlkZXIpOworICAgICAgICBidWYuYXBwZW5kKCI+Iik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9FcXVhbENvbXBhcmF0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0VxdWFsQ29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzIyYWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9FcXVhbENvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3I7CisKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCisKKy8qKgorICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIENvbXBhcmF0b3IgZm9yIHVzZSBpbiBDYWNoZVNlbGVjdG9yLgorICogY29tcGFyZSgpIHJldHVybnMgJzAnIChzaG91bGQgbm90IGJlIHNlbGVjdGVkKSBpZiBib3RoIHBhcmFtZXRlcgorICogYXJlIGVxdWFsIG90aGVyd2lzZSAnMScgKHNob3VsZCBiZSBzZWxlY3RlZCkuCisgKgorICogQHZlcnNpb24gMjAwMy0wOS0xMworICogQHNpbmNlICBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBFcXVhbENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgQ29tcGFyYXRvci5jb21wYXJlKCkuCisgICAgICogQHBhcmFtIG8xIHRoZSBmaXJzdCBvYmplY3QKKyAgICAgKiBAcGFyYW0gbzIgdGhlIHNlY29uZCBvYmplY3QKKyAgICAgKiBAcmV0dXJuIDAsIGlmIGJvdGggYXJlIGVxdWFsLCBvdGhlcndpc2UgMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICBpZiAobzEgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG8yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAobzEuZXF1YWxzKG8yKSkgPyAwIDogMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBPYmplY3QudG9TdHJpbmcoKS4KKyAgICAgKiBAcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcGFyYXRvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiRXF1YWxDb21wYXJhdG9yIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9IYXNodmFsdWVBbGdvcml0aG0uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0hhc2h2YWx1ZUFsZ29yaXRobS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjc0NzAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9IYXNodmFsdWVBbGdvcml0aG0uamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3I7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworCisvKioKKyAqIENvbXB1dGVzIGEgJ2hhc2h2YWx1ZScgZm9yIHRoZSBjb250ZW50IG9mIGZpbGUgdXNpbmcgU3RyaW5nLmhhc2hWYWx1ZSgpLgorICogVXNlIG9mIHRoaXMgYWxnb3JpdGhtIGRvZXNuJ3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbCBuZXN0ZWQgPHBhcmFtPnMgYW5kCisgKiBkb2Vzbid0IHN1cHBvcnQgYW55LgorICoKKyAqIEB2ZXJzaW9uIDIwMDMtMDktMTMKKyAqIEBzaW5jZSAgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgSGFzaHZhbHVlQWxnb3JpdGhtIGltcGxlbWVudHMgQWxnb3JpdGhtIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgYWxnb3JpdGhtIGRvZXNuJ3QgbmVlZCBhbnkgY29uZmlndXJhdGlvbi4KKyAgICAgKiBUaGVyZWZvcmUgaXQncyBhbHdheXMgdmFsaWQuCisgICAgICogQHJldHVybiBhbHdheXMgdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGVzIGEgJ2hhc2h2YWx1ZScgZm9yIGEgZmlsZSBjb250ZW50LgorICAgICAqIEl0IHJlYWRzIHRoZSBjb250ZW50IG9mIGEgZmlsZSwgY29udmVydCB0aGF0IHRvIFN0cmluZyBhbmQgdXNlIHRoZQorICAgICAqIFN0cmluZy5oYXNoQ29kZSgpIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gZmlsZSAgVGhlIGZpbGUgZm9yIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgY29tcHV0ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBoYXNodmFsdWUgb3IgPGk+bnVsbDwvaT4gaWYgdGhlIGZpbGUgY291bGRuJ3QgYmUgcmVhZAorICAgICAqLworICAgICAvLyBCZWNhdXNlIHRoZSBjb250ZW50IGlzIG9ubHkgcmVhZCB0aGUgZmlsZSB3aWxsIG5vdCBiZSBkYW1hZ2VkLiBJIHRlc3RlZAorICAgICAvLyB3aXRoIEpQRywgWklQIGFuZCBQREYgYXMgYmluYXJ5IGZpbGVzLgorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoRmlsZSBmaWxlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWZpbGUuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICBieXRlW10gY29udGVudCA9IG5ldyBieXRlW2Zpcy5hdmFpbGFibGUoKV07CisgICAgICAgICAgICBmaXMucmVhZChjb250ZW50KTsKKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGNvbnRlbnQpOworICAgICAgICAgICAgaW50IGhhc2ggPSBzLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhoYXNoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBPYmplY3QudG9TdHJpbmcoKS4KKyAgICAgKiBAcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcGFyYXRvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSGFzaHZhbHVlQWxnb3JpdGhtIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL01vZGlmaWVkU2VsZWN0b3IuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL01vZGlmaWVkU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmE4YzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvTW9kaWZpZWRTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsOTc0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3I7CisKKworLy8gSmF2YQoraW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLy8gQW50CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5JbnRyb3NwZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5SZXNvdXJjZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlRXh0ZW5kU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZXNvdXJjZVV0aWxzOworCisKKy8qKgorICogPHA+U2VsZWN0b3IgY2xhc3MgdGhhdCB1c2VzIDxpPkFsZ29yaXRobTwvaT4sIDxpPkNhY2hlPC9pPiBhbmQgPGk+Q29tcGFyYXRvcjwvaT4KKyAqIGZvciBpdHMgd29yay4KKyAqIFRoZSA8aT5BbGdvcml0aG08L2k+IGlzIHVzZWQgZm9yIGNvbXB1dGluZyBhIGhhc2h2YWx1ZSBmb3IgYSBmaWxlLgorICogVGhlIDxpPkNvbXBhcmF0b3I8L2k+IGRlY2lkZXMgd2hldGhlciB0byBzZWxlY3Qgb3Igbm90LgorICogVGhlIDxpPkNhY2hlPC9pPiBzdG9yZXMgdGhlIG90aGVyIHZhbHVlIGZvciBjb21wYXJpc29uIGJ5IHRoZSA8aT5Db21wYXJhdG9yPC9pPgorICogaW4gYSBwZXJzaXN0ZW50IG1hbm5lci48L3A+CisgKgorICogPHA+VGhlIE1vZGlmaWVkU2VsZWN0b3IgaXMgaW1wbGVtZW50ZWQgYXMgYSA8Yj5Db3JlU2VsZWN0b3I8L2I+IGFuZCB1c2VzIGRlZmF1bHQKKyAqIHZhbHVlcyBmb3IgYWxsIGl0cyBhdHRyaWJ1dGVzIHRoZXJlZm9yZSB0aGUgc2ltcGxpZXN0IGV4YW1wbGUgaXMgPHByZT4KKyAqICAgJmx0O2NvcHkgdG9kaXI9ImRlc3QiJmd0OworICogICAgICAgJmx0O2ZpbGVsaXN0IGRpcj0ic3JjIiZndDsKKyAqICAgICAgICAgICAmbHQ7bW9kaWZpZWQvJmd0OworICogICAgICAgJmx0Oy9maWxlbGlzdCZndDsKKyAqICAgJmx0Oy9jb3B5Jmd0OworICogPC9wcmU+PC9wPgorICoKKyAqIDxwPlRoZSBzYW1lIGV4YW1wbGUgcmV3cml0dGVuIGFzIENvcmVTZWxlY3RvciB3aXRoIHNldHRpbmcgdGhlIGFsbCB2YWx1ZXMKKyAqIChzYW1lIGFzIGRlZmF1bHRzIGFyZSkgd291bGQgYmUgPHByZT4KKyAqICAgJmx0O2NvcHkgdG9kaXI9ImRlc3QiJmd0OworICogICAgICAgJmx0O2ZpbGVsaXN0IGRpcj0ic3JjIiZndDsKKyAqICAgICAgICAgICAmbHQ7bW9kaWZpZWQgdXBkYXRlPSJ0cnVlIgorICogICAgICAgICAgICAgICAgICAgICBjYWNoZT0icHJvcGVydHlmaWxlIgorICogICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG09ImRpZ2VzdCIKKyAqICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcj0iZXF1YWwiJmd0OworICogICAgICAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0iY2FjaGUuY2FjaGVmaWxlIiAgICAgdmFsdWU9ImNhY2hlLnByb3BlcnRpZXMiLyZndDsKKyAqICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobS5hbGdvcml0aG0iIHZhbHVlPSJNRDUiLyZndDsKKyAqICAgICAgICAgICAmbHQ7L21vZGlmaWVkJmd0OworICogICAgICAgJmx0Oy9maWxlbGlzdCZndDsKKyAqICAgJmx0Oy9jb3B5Jmd0OworICogPC9wcmU+PC9wPgorICoKKyAqIDxwPkFuZCB0aGUgc2FtZSByZXdyaXR0ZW4gYXMgQ3VzdG9tU2VsZWN0b3Igd291bGQgYmU8cHJlPgorICogICAmbHQ7Y29weSB0b2Rpcj0iZGVzdCImZ3Q7CisgKiAgICAgICAmbHQ7ZmlsZWxpc3QgZGlyPSJzcmMiJmd0OworICogICAgICAgICAgICZsdDtjdXN0b20gY2xhc3M9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGUuc2VsZWN0b3JzLk1vZGlmaWVkU2VsZWN0b3IiJmd0OworICogICAgICAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0idXBkYXRlIiAgICAgdmFsdWU9InRydWUiLyZndDsKKyAqICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImNhY2hlIiAgICAgIHZhbHVlPSJwcm9wZXJ0eWZpbGUiLyZndDsKKyAqICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobSIgIHZhbHVlPSJkaWdlc3QiLyZndDsKKyAqICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImNvbXBhcmF0b3IiIHZhbHVlPSJlcXVhbCIvJmd0OworICogICAgICAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0iY2FjaGUuY2FjaGVmaWxlIiAgICAgdmFsdWU9ImNhY2hlLnByb3BlcnRpZXMiLyZndDsKKyAqICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobS5hbGdvcml0aG0iIHZhbHVlPSJNRDUiLyZndDsKKyAqICAgICAgICAgICAmbHQ7L2N1c3RvbSZndDsKKyAqICAgICAgICZsdDsvZmlsZWxpc3QmZ3Q7CisgKiAgICZsdDsvY29weSZndDsKKyAqIDwvcHJlPjwvcD4KKyAqCisgKiA8cD5JZiB5b3Ugd2FudCB0byBwcm92aWRlIHlvdXIgb3duIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiB5b3UgY2FuIGRvCisgKiB0aGF0IHZpYSB0aGUgKmNsYXNzbmFtZSBhdHRyaWJ1dGVzLiBJZiB0aGUgY2xhc3NlcyBhcmUgbm90IG9uIEFudCdzIGNvcmUKKyAqIGNsYXNzcGF0aCwgeW91IHdpbGwgaGF2ZSB0byBwcm92aWRlIHRoZSBwYXRoIHZpYSBuZXN0ZWQgJmx0O2NsYXNzcGF0aCZndDsKKyAqIGVsZW1lbnQsIHNvIHRoYXQgdGhlIHNlbGVjdG9yIGNhbiBmaW5kIHRoZSBjbGFzc2VzLiA8cHJlPgorICogICAmbHQ7bW9kaWZpZWQgY2FjaGVjbGFzc25hbWU9ImNvbS5teWNvbXBhbnkuTXlDYWNoZSImZ3Q7CisgKiAgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICogICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0ibGliL215Y29tcG9ueS1hbnR1dGlsLmphciIvJmd0OworICogICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CisgKiAgICZsdDsvbW9kaWZpZWQmZ3Q7CisgKiA8L3ByZT48L3A+CisgKgorICogPHA+QWxsIHRoZXNlIHRocmVlIGV4YW1wbGVzIGNvcHkgdGhlIGZpbGVzIGZyb20gPGk+c3JjPC9pPiB0byA8aT5kZXN0PC9pPgorICogdXNpbmcgdGhlIE1vZGlmaWVkU2VsZWN0b3IuIFRoZSBNb2RpZmllZFNlbGVjdG9yIHVzZXMgdGhlIDxpPlByb3BlcnR5ZmlsZUNhY2hlCisgKiA8L2k+LCB0aGUgPGk+RGlnZXN0QWxnb3JpdGhtPC9pPiBhbmQgdGhlIDxpPkVxdWFsQ29tcGFyYXRvcjwvaT4gZm9yIGl0cworICogd29yay4gVGhlIFByb3BlcnR5ZmlsZUNhY2hlIHN0b3JlcyBrZXktdmFsdWUtcGFpcnMgaW4gYSBzaW1wbGUgamF2YQorICogcHJvcGVydGllcyBmaWxlLiBUaGUgZmlsZW5hbWUgaXMgPGk+Y2FjaGUucHJvcGVydGllczwvaT4uIFRoZSA8aT51cGRhdGU8L2k+CisgKiBmbGFnIGxldHMgdGhlIHNlbGVjdG9yIHVwZGF0ZSB0aGUgdmFsdWVzIGluIHRoZSBjYWNoZSAoYW5kIG9uIGZpcnN0IGNhbGwKKyAqIGNyZWF0ZXMgdGhlIGNhY2hlKS4gVGhlIDxpPkRpZ2VzdEFsZ29yaXRobTwvaT4gY29tcHV0ZXMgYSBoYXNodmFsdWUgdXNpbmcgdGhlCisgKiBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QgY2xhc3Mgd2l0aCBpdHMgTUQ1LUFsZ29yaXRobSBhbmQgaXRzIHN0YW5kYXJkCisgKiBwcm92aWRlci4gVGhlIG5ldyBjb21wdXRlZCBoYXNodmFsdWUgYW5kIHRoZSBzdG9yZWQgb25lIGFyZSBjb21wYXJlZCBieQorICogdGhlIDxpPkVxdWFsQ29tcGFyYXRvcjwvaT4gd2hpY2ggcmV0dXJucyAndHJ1ZScgKG1vcmUgY29ycmVjdCBhIHZhbHVlIG5vdAorICogZXF1YWxzIHplcm8gKDEpKSBpZiB0aGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgdXNpbmcgc2ltcGxlIFN0cmluZworICogY29tcGFyaXNvbi48L3A+CisgKgorICogPHA+QSB1c2VmdWwgc2NlbmFyaW8gZm9yIHRoaXMgc2VsZWN0b3IgaXMgaW5zaWRlIGEgYnVpbGQgZW52aXJvbm1lbnQKKyAqIGZvciBob21lcGFnZSBnZW5lcmF0aW9uIChlLmcuIHdpdGggPGEgaHJlZj0iaHR0cDovL2ZvcnJlc3QuYXBhY2hlLm9yZy8iPgorICogQXBhY2hlIEZvcnJlc3Q8L2E+KS4gPHByZT4KKyAqICZsdDt0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtYW5kLXVwbG9hZC1zaXRlIiZndDsKKyAqICAgICAmbHQ7ZWNobyZndDsgZ2VuZXJhdGUgdGhlIHNpdGUgdXNpbmcgZm9ycmVzdCAmbHQ7L2VjaG8mZ3Q7CisgKiAgICAgJmx0O2FudGNhbGwgdGFyZ2V0PSJzaXRlIi8mZ3Q7CisgKgorICogICAgICZsdDtlY2hvJmd0OyB1cGxvYWQgdGhlIGNoYW5nZWQgZmlsZXMgJmx0Oy9lY2hvJmd0OworICogICAgICZsdDtmdHAgc2VydmVyPSIke2Z0cC5zZXJ2ZXJ9IiB1c2VyaWQ9IiR7ZnRwLnVzZXJ9IiBwYXNzd29yZD0iJHtmdHAucHdkfSImZ3Q7CisgKiAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iaHRkb2NzL21hbnVhbCImZ3Q7CisgKiAgICAgICAgICAgICAmbHQ7bW9kaWZpZWQvJmd0OworICogICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgKiAgICAgJmx0Oy9mdHAmZ3Q7CisgKiAmbHQ7L3RhcmdldCZndDsKKyAqIDwvcHJlPiBIZXJlIGFsbCA8Yj5jaGFuZ2VkPC9iPiBmaWxlcyBhcmUgdXBsb2FkZWQgdG8gdGhlIHNlcnZlci4gVGhlCisgKiBNb2RpZmllZFNlbGVjdG9yIHNhdmVzIHRoZXJlZm9yZSBtdWNoIHVwbG9hZCB0aW1lLjwvcD4KKyAqCisgKgorICogPHA+VGhpcyBzZWxlY3RvciB1c2VzIHJlZmxlY3Rpb24gZm9yIHNldHRpbmcgdGhlIHZhbHVlcyBvZiBpdHMgdGhyZWUgaW50ZXJmYWNlcworICogKHVzaW5nIG9yZy5hcGFjaGUudG9vbHMuYW50LkludHJvc3BlY3Rpb25IZWxwZXIpIHRoZXJlZm9yZSBubyBzcGVjaWFsCisgKiAnY29uZmlndXJhdGlvbiBpbnRlcmZhY2VzJyBoYXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgbmV3IGNhY2hlcywgYWxnb3JpdGhtcyBvcgorICogY29tcGFyYXRvcnMuIEFsbCBwcmVzZW50IDxpPnNldDwvaT5YWCBtZXRob2RzIGNhbiBiZSB1c2VkLiBFLmcuIHRoZSBEaWdlc3RBbGdvcml0aG0KKyAqIGNhbiB1c2UgYSBzcGVjaWZpZWQgcHJvdmlkZXIgZm9yIGNvbXB1dGluZyBpdHMgdmFsdWUuIEZvciBzZWxlY3RpbmcgdGhpcworICogdGhlcmUgaXMgYSA8aT5zZXRQcm92aWRlcihTdHJpbmcgcHJvdmlkZXJuYW1lKTwvaT4gbWV0aG9kLiBTbyB5b3UgY2FuIHVzZQorICogYSBuZXN0ZWQgPGk+Jmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobS5wcm92aWRlciIgdmFsdWU9Ik15UHJvdmlkZXIiLyZndDs8L2k+LgorICoKKyAqCisgKiBAc2luY2UgIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIE1vZGlmaWVkU2VsZWN0b3IgZXh0ZW5kcyBCYXNlRXh0ZW5kU2VsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciwgUmVzb3VyY2VTZWxlY3RvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfUFJFRklYID0gImNhY2hlLiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMR09SSVRITV9QUkVGSVggPSAiYWxnb3JpdGhtLiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBUkFUT1JfUFJFRklYID0gImNvbXBhcmF0b3IuIjsKKworCisgICAgLy8gLS0tLS0gIGF0dHJpYnV0ZXMgIC0tLS0tCisKKworICAgIC8qKiBDYWNoZSBuYW1lIGZvciBsYXRlciBpbnN0YW50aWF0aW9uLiAqLworICAgIHByaXZhdGUgQ2FjaGVOYW1lIGNhY2hlTmFtZSA9IG51bGw7CisKKyAgICAvKiogVXNlciBzcGVjaWZpZWQgY2xhc3NuYW1lIGZvciBDYWNoZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBjYWNoZUNsYXNzOworCisgICAgLyoqIEFsZ29yaXRobSBuYW1lIGZvciBsYXRlciBpbnN0YW50aWF0aW9uLiAqLworICAgIHByaXZhdGUgQWxnb3JpdGhtTmFtZSBhbGdvTmFtZSA9IG51bGw7CisKKyAgICAvKiogVXNlciBzcGVjaWZpZWQgY2xhc3NuYW1lIGZvciBBbGdvcml0aG0uICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWxnb3JpdGhtQ2xhc3M7CisKKyAgICAvKiogQ29tcGFyYXRvciBuYW1lIGZvciBsYXRlciBpbnN0YW50aWF0aW9uLiAqLworICAgIHByaXZhdGUgQ29tcGFyYXRvck5hbWUgY29tcE5hbWUgPSBudWxsOworCisgICAgLyoqIFVzZXIgc3BlY2lmaWVkIGNsYXNzbmFtZSBmb3IgQ29tcGFyYXRvci4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21wYXJhdG9yQ2xhc3M7CisKKyAgICAvKiogU2hvdWxkIHRoZSBjYWNoZSBiZSB1cGRhdGVkPyAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGUgPSB0cnVlOworCisgICAgLyoqIEFyZSBkaXJlY3RvcmllcyBzZWxlY3RlZD8gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2VsZWN0RGlyZWN0b3JpZXMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogU2hvdWxkIFJlc291cmNlcyB3aGl0aG91dCBhbiBJbnB1dFN0cmVhbSwgYW5kCisgICAgICogdGhlcmVmb3JlIHdpdGhvdXQgY2hlY2tpbmcsIGJlIHNlbGVjdGVkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzZWxlY3RSZXNvdXJjZXNXaXRob3V0SW5wdXRTdHJlYW0gPSB0cnVlOworCisgICAgLyoqIERlbGF5IHRoZSB3cml0aW5nIG9mIHRoZSBjYWNoZSBmaWxlICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlbGF5VXBkYXRlID0gdHJ1ZTsKKworCisgICAgLy8gLS0tLS0gaW50ZXJuYWwgbWVtYmVyIHZhcmlhYmxlcyAtLS0tLQorCisKKyAgICAvKiogSG93IHNob3VsZCB0aGUgY2FjaGVkIHZhbHVlIGFuZCB0aGUgbmV3IG9uZSBjb21wYXJlZD8gKi8KKyAgICBwcml2YXRlIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IG51bGw7CisKKyAgICAvKiogQWxnb3JpdGhtIGZvciBjb21wdXRpbmcgbmV3IHZhbHVlcyBhbmQgdXBkYXRpbmcgdGhlIGNhY2hlLiAqLworICAgIHByaXZhdGUgQWxnb3JpdGhtIGFsZ29yaXRobSA9IG51bGw7CisKKyAgICAvKiogVGhlIENhY2hlIGNvbnRhaW5pbmcgdGhlIG9sZCB2YWx1ZXMuICovCisgICAgcHJpdmF0ZSBDYWNoZSBjYWNoZSA9IG51bGw7CisKKyAgICAvKiogQ291bnQgb2YgbW9kaWZpZWQgcHJvcGVydGllcyAqLworICAgIHByaXZhdGUgaW50IG1vZGlmaWVkID0gMDsKKworICAgIC8qKiBGbGFnIHdoZXRoZXIgdGhpcyBvYmplY3QgaXMgY29uZmlndXJlZC4gQ29uZmlndXJhdGlvbiBpcyBvbmx5IGRvbmUgb25jZS4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb25maWd1cmVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBQYXJhbWV0ZXIgdmVjdG9yIHdpdGggcGFyYW1ldGVycyBmb3IgbGF0ZXIgaW5pdGlhbGl6YXRpb24uCisgICAgICogQHNlZSAjY29uZmlndXJlCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3IgY29uZmlnUGFyYW1ldGVyID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqCisgICAgICogUGFyYW1ldGVyIHZlY3RvciB3aXRoIHNwZWNpYWwgcGFyYW1ldGVycyBmb3IgbGF0ZXIgaW5pdGlhbGl6YXRpb24uCisgICAgICogVGhlIG5hbWVzIGhhdmUgdGhlIHBhdHRlcm4gJyouKicsIGUuZy4gJ2NhY2hlLmNhY2hlZmlsZScuCisgICAgICogVGhlc2UgcGFyYW1ldGVycyBhcmUgdXNlZCA8Yj5hZnRlcjwvYj4gdGhlIHBhcmFtZXRlcnMgd2l0aCB0aGUgcGF0dGVybiAnKicuCisgICAgICogQHNlZSAjY29uZmlndXJlCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3Igc3BlY2lhbFBhcmFtZXRlciA9IG5ldyBWZWN0b3IoKTsKKworICAgIC8qKiBUaGUgY2xhc3Nsb2FkZXIgb2YgdGhpcyBjbGFzcy4gKi8KKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIG15Q2xhc3NMb2FkZXIgPSBudWxsOworCisgICAgLyoqIHByb3ZpZGVkIGNsYXNzcGF0aCBmb3IgdGhlIGNsYXNzbG9hZGVyICovCisgICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tICBjb25zdHJ1Y3RvcnMgIC0tLS0tCisKKworICAgIC8qKiBCZWFuLUNvbnN0cnVjdG9yLiAqLworICAgIHB1YmxpYyBNb2RpZmllZFNlbGVjdG9yKCkgeworICAgIH0KKworCisgICAgLy8gLS0tLS0gY29uZmlndXJhdGlvbiAgLS0tLS0KKworCisgICAgLyoqIE92ZXJyaWRlcyBCYXNlU2VsZWN0b3IudmVyaWZ5U2V0dGluZ3MoKS4gKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlTZXR0aW5ncygpIHsKKyAgICAgICAgY29uZmlndXJlKCk7CisgICAgICAgIGlmIChjYWNoZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRFcnJvcigiQ2FjaGUgbXVzdCBiZSBzZXQuIik7CisgICAgICAgIH0gZWxzZSBpZiAoYWxnb3JpdGhtID09IG51bGwpIHsKKyAgICAgICAgICAgIHNldEVycm9yKCJBbGdvcml0aG0gbXVzdCBiZSBzZXQuIik7CisgICAgICAgIH0gZWxzZSBpZiAoIWNhY2hlLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgc2V0RXJyb3IoIkNhY2hlIG11c3QgYmUgcHJvcGVyIGNvbmZpZ3VyZWQuIik7CisgICAgICAgIH0gZWxzZSBpZiAoIWFsZ29yaXRobS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHNldEVycm9yKCJBbGdvcml0aG0gbXVzdCBiZSBwcm9wZXIgY29uZmlndXJlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGlzIFNlbGVjdG9yLgorICAgICAqIERvZXMgdGhpcyB3b3JrIG9ubHkgb25jZSBwZXIgU2VsZWN0b3Igb2JqZWN0LgorICAgICAqIDxwPkJlY2F1c2Ugc29tZSBwcm9ibGVtcyB3aGlsZSBjb25maWd1cmluZyBmcm9tIDxjdXN0b20+U2VsZWN0b3IKKyAgICAgKiB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6PG9sPgorICAgICAqIDxsaT4gY29sbGVjdCB0aGUgY29uZmlndXJhdGlvbiBkYXRhIDwvbGk+CisgICAgICogPGxpPiB3YWl0IGZvciB0aGUgZmlyc3QgaXNTZWxlY3RlZCgpIGNhbGwgPC9saT4KKyAgICAgKiA8bGk+IHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgPC9saT4KKyAgICAgKiA8bGk+IHNldCB2YWx1ZXMgZm9yIG5hbWUgcGF0dGVybiAnKic6IHVwZGF0ZSwgY2FjaGUsIGFsZ29yaXRobSwgY29tcGFyYXRvciA8L2xpPgorICAgICAqIDxsaT4gc2V0IHZhbHVlcyBmb3IgbmFtZSBwYXR0ZXJuICcqLio6IGNhY2hlLmNhY2hlZmlsZSwgLi4uIDwvbGk+CisgICAgICogPC9vbD48L3A+CisgICAgICogPHA+VGhpcyBjb25maWd1cmF0aW9uIGFsZ29yaXRobSBpcyBuZWVkZWQgYmVjYXVzZSB5b3UgZG9uJ3Qga25vdworICAgICAqIHRoZSBvcmRlciBvZiBhcnJpdmluZyBjb25maWctZGF0YS4gRS5nLiBpZiB5b3UgZmlyc3Qgc2V0IHRoZQorICAgICAqIDxpPmNhY2hlLmNhY2hlZmlsZW5hbWU8L2k+IGFuZCBhZnRlciB0aGF0IHRoZSA8aT5jYWNoZTwvaT4gaXRzZWxmLAorICAgICAqIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBjYWNoZWZpbGVuYW1lIGlzIHVzZWQsIGJlY2F1c2Ugc2V0dGluZyB0aGUKKyAgICAgKiBjYWNoZSBpbXBsaWVzIGNyZWF0aW5nIGEgbmV3IENhY2hlIGluc3RhbmNlIC0gd2l0aCBpdHMgZGVmYXVsdHMuPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLS0tLS0gIFRoZSAiU2luZ2xldG9uIiAgLS0tLS0KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKGlzQ29uZmlndXJlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlzQ29uZmlndXJlZCA9IHRydWU7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLS0tLS0gIFNldCBkZWZhdWx0IHZhbHVlcyAgLS0tLS0KKyAgICAgICAgLy8KKyAgICAgICAgUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAiY2FjaGUucHJvcGVydGllcyI7CisgICAgICAgIEZpbGUgY2FjaGVmaWxlID0gbnVsbDsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm9ybWFsIHVzZSBpbnNpZGUgQW50CisgICAgICAgICAgICBjYWNoZWZpbGUgPSBuZXcgRmlsZShwLmdldEJhc2VEaXIoKSwgZmlsZW5hbWUpOworCisgICAgICAgICAgICAvLyBzZXQgc2VsZiBhcyBhIEJ1aWxkTGlzdGVuZXIgdG8gZGVsYXkgY2FjaGVmaWxlIHNhdmVzCisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuYWRkQnVpbGRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vIHJlZmVyZW5jZSB0byBwcm9qZWN0IC0gZS5nLiBkdXJpbmcgbm9ybWFsIEpVbml0IHRlc3RzCisgICAgICAgICAgICBjYWNoZWZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7CisgICAgICAgICAgICBzZXREZWxheVVwZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgQ2FjaGUgICAgICBkZWZhdWx0Q2FjaGUgICAgICA9IG5ldyBQcm9wZXJ0aWVzZmlsZUNhY2hlKGNhY2hlZmlsZSk7CisgICAgICAgIEFsZ29yaXRobSAgZGVmYXVsdEFsZ29yaXRobSAgPSBuZXcgRGlnZXN0QWxnb3JpdGhtKCk7CisgICAgICAgIENvbXBhcmF0b3IgZGVmYXVsdENvbXBhcmF0b3IgPSBuZXcgRXF1YWxDb21wYXJhdG9yKCk7CisgICAgICAgIHVwZGF0ZSA9IHRydWU7CisgICAgICAgIHNlbGVjdERpcmVjdG9yaWVzID0gdHJ1ZTsKKworICAgICAgICAvLworICAgICAgICAvLyAtLS0tLSAgU2V0IHRoZSBtYWluIGF0dHJpYnV0ZXMsIHBhdHRlcm4gJyonICAtLS0tLQorICAgICAgICAvLworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0Q29uZmlnID0gY29uZmlnUGFyYW1ldGVyLml0ZXJhdG9yKCk7IGl0Q29uZmlnLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwYXIgPSAoUGFyYW1ldGVyKSBpdENvbmZpZy5uZXh0KCk7CisgICAgICAgICAgICBpZiAocGFyLmdldE5hbWUoKS5pbmRleE9mKCIuIikgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhICouKiBwYXJhbWV0ZXIgZm9yIGxhdGVyIHVzZQorICAgICAgICAgICAgICAgIHNwZWNpYWxQYXJhbWV0ZXIuYWRkKHBhcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVzZVBhcmFtZXRlcihwYXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbmZpZ1BhcmFtZXRlciA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICAvLyBzcGVjaWZ5IHRoZSBhbGdvcml0aG0gY2xhc3NuYW1lCisgICAgICAgIGlmIChhbGdvTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB1c2UgQWxnb3JpdGhtIGRlZmluZWQgdmlhIG5hbWUKKyAgICAgICAgICAgIGlmICgiaGFzaHZhbHVlIi5lcXVhbHMoYWxnb05hbWUuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICBhbGdvcml0aG0gPSBuZXcgSGFzaHZhbHVlQWxnb3JpdGhtKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJkaWdlc3QiLmVxdWFscyhhbGdvTmFtZS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgIGFsZ29yaXRobSA9IG5ldyBEaWdlc3RBbGdvcml0aG0oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImNoZWNrc3VtIi5lcXVhbHMoYWxnb05hbWUuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICBhbGdvcml0aG0gPSBuZXcgQ2hlY2tzdW1BbGdvcml0aG0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhbGdvcml0aG1DbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIEFsZ29yaXRobSBzcGVjaWZpZWQgYnkgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgYWxnb3JpdGhtID0gKEFsZ29yaXRobSkgbG9hZENsYXNzKAorICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG1DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhbiBBbGdvcml0aG0uIiwKKyAgICAgICAgICAgICAgICAgICAgQWxnb3JpdGhtLmNsYXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbm90aGluZyBzcGVjaWZpZWQgLSB1c2UgZGVmYXVsdAorICAgICAgICAgICAgICAgIGFsZ29yaXRobSA9IGRlZmF1bHRBbGdvcml0aG07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzcGVjaWZ5IHRoZSBjYWNoZSBjbGFzc25hbWUKKyAgICAgICAgaWYgKGNhY2hlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB1c2UgQ2FjaGUgZGVmaW5lZCB2aWEgbmFtZQorICAgICAgICAgICAgaWYgKCJwcm9wZXJ0eWZpbGUiLmVxdWFscyhjYWNoZU5hbWUuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICBjYWNoZSA9IG5ldyBQcm9wZXJ0aWVzZmlsZUNhY2hlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2FjaGVDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIENhY2hlIHNwZWNpZmllZCBieSBjbGFzc25hbWUKKyAgICAgICAgICAgICAgICBjYWNoZSA9IChDYWNoZSkgbG9hZENsYXNzKGNhY2hlQ2xhc3MsICJpcyBub3QgYSBDYWNoZS4iLCBDYWNoZS5jbGFzcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgc3BlY2lmaWVkIC0gdXNlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICBjYWNoZSA9IGRlZmF1bHRDYWNoZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNwZWNpZnkgdGhlIGNvbXBhcmF0b3IgY2xhc3NuYW1lCisgICAgICAgIGlmIChjb21wTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyB1c2UgQWxnb3JpdGhtIGRlZmluZWQgdmlhIG5hbWUKKyAgICAgICAgICAgIGlmICgiZXF1YWwiLmVxdWFscyhjb21wTmFtZS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IgPSBuZXcgRXF1YWxDb21wYXJhdG9yKCk7CisgICAgICAgICAgICAgfSBlbHNlIGlmICgicnVsZSIuZXF1YWxzKGNvbXBOYW1lLmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBSQkMuCisgICAgICAgICAgICAgICAgLy8geW91IGhhdmUgdG8gcHJvdmlkZSB0aGUgcnVsZXMgaW4gdGhlIGNvbnN0cnVjdG9ycyAtIG5vIHNldHRlcnMKKyAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSdWxlQmFzZWRDb2xsYXRvciBub3QgeWV0IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgICAgICAvLyBIYXZlIHRvIHRoaW5rIGFib3V0IGxhenkgaW5pdGlhbGl6YXRpb24gaGVyZS4uLiAgSkhNCisgICAgICAgICAgICAgICAgLy8gY29tcGFyYXRvciA9IG5ldyBqYXZhLnRleHQuUnVsZUJhc2VkQ29sbGF0b3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjb21wYXJhdG9yQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHVzZSBBbGdvcml0aG0gc3BlY2lmaWVkIGJ5IGNsYXNzbmFtZQorICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IgPSAoQ29tcGFyYXRvcikgbG9hZENsYXNzKAorICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICJpcyBub3QgYSBDb21wYXJhdG9yLiIsCisgICAgICAgICAgICAgICAgICAgIENvbXBhcmF0b3IuY2xhc3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHNwZWNpZmllZCAtIHVzZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgY29tcGFyYXRvciA9IGRlZmF1bHRDb21wYXJhdG9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLS0tLS0gIFNldCB0aGUgc3BlY2lhbCBhdHRyaWJ1dGVzLCBwYXR0ZXJuICcqLionICAtLS0tLQorICAgICAgICAvLworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0U3BlY2lhbCA9IHNwZWNpYWxQYXJhbWV0ZXIuaXRlcmF0b3IoKTsgaXRTcGVjaWFsLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwYXIgPSAoUGFyYW1ldGVyKSBpdFNwZWNpYWwubmV4dCgpOworICAgICAgICAgICAgdXNlUGFyYW1ldGVyKHBhcik7CisgICAgICAgIH0KKyAgICAgICAgc3BlY2lhbFBhcmFtZXRlciA9IG5ldyBWZWN0b3IoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvYWRzIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIGluaXRpYWxpemVzIGFuIG9iamVjdCBvZiB0aGF0IGNsYXNzLgorICAgICAqIFRocm93cyBhIEJ1aWxkRXhjZXB0aW9uIHVzaW5nIHRoZSBnaXZlbiBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcKKyAgICAgKiBsb2FkaW5nL2luc3RhbnRpYXRpb24gb3IgaWYgdGhlIG9iamVjdCBpcyBub3QgZnJvbSB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBjbGFzc25hbWUKKyAgICAgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlLXBhcnQgZm9yIHRoZSBCdWlsZEV4Y2VwdGlvbgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRvIGNoZWNrIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIGEgY2FzdGFibGUgb2JqZWN0CisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzbmFtZSwgU3RyaW5nIG1zZywgQ2xhc3MgdHlwZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gbG9hZCB0aGUgc3BlY2lmaWVkIGNsYXNzCisgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IGdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgICAgICBpZiAoY2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gY2wubG9hZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPYmplY3QgcnYgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgICBpZiAoIXR5cGUuaXNJbnN0YW5jZShydikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNwZWNpZmllZCBjbGFzcyAoIiArIGNsYXNzbmFtZSArICIpICIgKyBtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3BlY2lmaWVkIGNsYXNzICgiICsgY2xhc3NuYW1lICsgIikgbm90IGZvdW5kLiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLSAgdGhlIHNlbGVjdGlvbiB3b3JrICAtLS0tLQorCisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBSZXNvdXJjZVNlbGVjdG9yLmlzU2VsZWN0ZWQoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHNlbGVjdGVkCisgICAgICogQHNlZSBSZXNvdXJjZVNlbGVjdG9yI2lzU2VsZWN0ZWQoUmVzb3VyY2UpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICBpZiAocmVzb3VyY2UuaXNGaWxlc3lzdGVtT25seSgpKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgJ3Jlc291cmNlZCcgZmlsZSwgc28gcmVjb252ZXJ0IGl0IGFuZCB1c2UKKyAgICAgICAgICAgIC8vIHRoZSAnb2xkJyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgIEZpbGVSZXNvdXJjZSBmaWxlUmVzb3VyY2UgPSAoRmlsZVJlc291cmNlKSByZXNvdXJjZTsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IGZpbGVSZXNvdXJjZS5nZXRGaWxlKCk7CisgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlUmVzb3VyY2UuZ2V0TmFtZSgpOworICAgICAgICAgICAgRmlsZSBiYXNlZGlyID0gZmlsZVJlc291cmNlLmdldEJhc2VEaXIoKTsKKyAgICAgICAgICAgIHJldHVybiBpc1NlbGVjdGVkKGJhc2VkaXIsIGZpbGVuYW1lLCBmaWxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gSG93IHRvIGhhbmRsZSBub24tZmlsZS1SZXNvdXJjZXM/IEkgY29weSB0ZW1wb3JhcmlseSB0aGUKKyAgICAgICAgICAgICAgICAvLyByZXNvdXJjZSB0byBhIGZpbGUgYW5kIHVzZSB0aGUgZmlsZS1pbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMgZnUgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgICAgICAgICAgICAgRmlsZSB0bXBGaWxlID0gZnUuY3JlYXRlVGVtcEZpbGUoIm1vZGlmaWVkLSIsICIudG1wIiwgbnVsbCwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIFJlc291cmNlIHRtcFJlc291cmNlID0gbmV3IEZpbGVSZXNvdXJjZSh0bXBGaWxlKTsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLmNvcHlSZXNvdXJjZShyZXNvdXJjZSwgdG1wUmVzb3VyY2UpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWQodG1wRmlsZS5nZXRQYXJlbnRGaWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBGaWxlLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnRvTG9uZ1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBpc1NlbGVjdGVkOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gdW9lKSB7CisgICAgICAgICAgICAgICAgbG9nKCJUaGUgcmVzb3VyY2UgJyIKKyAgICAgICAgICAgICAgICAgICsgcmVzb3VyY2UuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICArICInIGRvZXMgbm90IHByb3ZpZGUgYW4gSW5wdXRTdHJlYW0sIHNvIGl0IGlzIG5vdCBjaGVja2VkLiAiCisgICAgICAgICAgICAgICAgICArICJBa2tvcmRpbmcgdG8gJ3NlbHJlcycgYXR0cmlidXRlIHZhbHVlIGl0IGlzICIKKyAgICAgICAgICAgICAgICAgICsgKChzZWxlY3RSZXNvdXJjZXNXaXRob3V0SW5wdXRTdHJlYW0pID8gIiIgOiAiIG5vdCIpCisgICAgICAgICAgICAgICAgICArICJzZWxlY3RlZC4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0UmVzb3VyY2VzV2l0aG91dElucHV0U3RyZWFtOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIEJhc2VFeHRlbmRTZWxlY3Rvci5pc1NlbGVjdGVkKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZWRpciBhcyBkZXNjcmliZWQgaW4gQmFzZUV4dGVuZFNlbGVjdG9yCisgICAgICogQHBhcmFtIGZpbGVuYW1lIGFzIGRlc2NyaWJlZCBpbiBCYXNlRXh0ZW5kU2VsZWN0b3IKKyAgICAgKiBAcGFyYW0gZmlsZSBhcyBkZXNjcmliZWQgaW4gQmFzZUV4dGVuZFNlbGVjdG9yCisgICAgICogQHJldHVybiBhcyBkZXNjcmliZWQgaW4gQmFzZUV4dGVuZFNlbGVjdG9yCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CisgICAgICAgIHJldHVybiBpc1NlbGVjdGVkKGJhc2VkaXIsIGZpbGVuYW1lLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBidXNpbmVzcyBsb2dpYyBvZiB0aGlzIHNlbGVjdG9yIGZvciB1c2UgYXMgUmVzb3VyY2VTZWxlY3RvciBvZgorICAgICAqIEZpbGVTZWxlY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlZGlyIGFzIGRlc2NyaWJlZCBpbiBCYXNlRXh0ZW5kU2VsZWN0b3IKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgYXMgZGVzY3JpYmVkIGluIEJhc2VFeHRlbmRTZWxlY3RvcgorICAgICAqIEBwYXJhbSBjYWNoZUtleSB0aGUgbmFtZSBmb3IgdGhlIGtleSBmb3Igc3RvcmluZyB0aGUgaGFzaHZhbHVlCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgY2FjaGVLZXkpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYmFzZWRpciwgZmlsZW5hbWUpOworCisgICAgICAgIC8vIFlvdSBjYW4gbm90IGNvbXB1dGUgYSB2YWx1ZSBmb3IgYSBkaXJlY3RvcnkKKyAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdERpcmVjdG9yaWVzOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZXMgYW5kIGRvIHRoZSBjb21wYXJpc29uCisgICAgICAgIFN0cmluZyBjYWNoZWRWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGNhY2hlLmdldChmLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IGFsZ29yaXRobS5nZXRWYWx1ZShmKTsKKworICAgICAgICBib29sZWFuIHJ2ID0gKGNvbXBhcmF0b3IuY29tcGFyZShjYWNoZWRWYWx1ZSwgbmV3VmFsdWUpICE9IDApOworCisgICAgICAgIC8vIE1heWJlIHVwZGF0ZSB0aGUgY2FjaGUKKyAgICAgICAgaWYgKHVwZGF0ZSAmJiBydikgeworICAgICAgICAgICAgY2FjaGUucHV0KGYuZ2V0QWJzb2x1dGVQYXRoKCksIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIHNldE1vZGlmaWVkKGdldE1vZGlmaWVkKCkgKyAxKTsKKyAgICAgICAgICAgIGlmICghZ2V0RGVsYXlVcGRhdGUoKSkgeworICAgICAgICAgICAgICAgIHNhdmVDYWNoZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKworCisgICAvKioKKyAgICAqIHNhdmUgdGhlIGNhY2hlIGZpbGUKKyAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNhdmVDYWNoZSgpIHsKKyAgICAgICAgaWYgKGdldE1vZGlmaWVkKCkgPiAwKSB7CisgICAgICAgICAgICBjYWNoZS5zYXZlKCk7CisgICAgICAgICAgICBzZXRNb2RpZmllZCgwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0gIGF0dHJpYnV0ZSBhbmQgbmVzdGVkIGVsZW1lbnQgc3VwcG9ydCAgLS0tLS0KKworCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciBhbGdvcml0aG1DbGFzcy4KKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lICBuZXcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGdvcml0aG1DbGFzcyhTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIGFsZ29yaXRobUNsYXNzID0gY2xhc3NuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciBjb21wYXJhdG9yQ2xhc3MuCisgICAgICogQHBhcmFtIGNsYXNzbmFtZSAgbmV3IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvckNsYXNzKFN0cmluZyBjbGFzc25hbWUpIHsKKyAgICAgICAgY29tcGFyYXRvckNsYXNzID0gY2xhc3NuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciBjYWNoZUNsYXNzLgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgIG5ldyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhY2hlQ2xhc3MoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICBjYWNoZUNsYXNzID0gY2xhc3NuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3VwcG9ydCBmb3IgPGk+dXBkYXRlPC9pPiBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHVwZGF0ZSBuZXcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcGRhdGUoYm9vbGVhbiB1cGRhdGUpIHsKKyAgICAgICAgdGhpcy51cGRhdGUgPSB1cGRhdGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IGZvciA8aT5zZWxkaXJzPC9pPiBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHNlbGRpcnMgbmV3IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZGlycyhib29sZWFuIHNlbGRpcnMpIHsKKyAgICAgICAgc2VsZWN0RGlyZWN0b3JpZXMgPSBzZWxkaXJzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3VwcG9ydCBmb3IgPGk+c2VscmVzPC9pPiBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxyZXMoYm9vbGVhbiBuZXdWYWx1ZSkgeworICAgICAgICB0aGlzLnNlbGVjdFJlc291cmNlc1dpdGhvdXRJbnB1dFN0cmVhbSA9IG5ld1ZhbHVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0dGVyIGZvciB0aGUgbW9kaWZpZWQgY291bnQKKyAgICAgKiBAcmV0dXJuIG1vZGlmaWVkIGNvdW50CisgICAgICovCisgICAgcHVibGljIGludCBnZXRNb2RpZmllZCgpIHsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciB0aGUgbW9kaWZpZWQgY291bnQKKyAgICAgKiBAcGFyYW0gbW9kaWZpZWQgY291bnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmllZChpbnQgbW9kaWZpZWQpIHsKKyAgICAgICAgdGhpcy5tb2RpZmllZCA9IG1vZGlmaWVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0dGVyIGZvciB0aGUgZGVsYXkgdXBkYXRlCisgICAgICogQHJldHVybiB0cnVlIGlmIHdlIHNob3VsZCBkZWxheSBmb3IgcGVyZm9ybWFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWxheVVwZGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGF5VXBkYXRlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciB0aGUgZGVsYXkgdXBkYXRlCisgICAgICogQHBhcmFtIGRlbGF5VXBkYXRlIHRydWUgaWYgd2Ugc2hvdWxkIGRlbGF5IGZvciBwZXJmb3JtYW5jZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlbGF5VXBkYXRlKGJvb2xlYW4gZGVsYXlVcGRhdGUpIHsKKyAgICAgICAgdGhpcy5kZWxheVVwZGF0ZSA9IGRlbGF5VXBkYXRlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBjbGFzc3BhdGguCisgICAgICogQHBhcmFtIHBhdGggdGhlIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENsYXNzcGF0aChQYXRoIHBhdGgpIHsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIjxjbGFzc3BhdGg+IGNhbiBiZSBzZXQgb25seSBvbmNlLiIpOworICAgICAgICB9CisgICAgICAgIGNsYXNzcGF0aCA9IHBhdGg7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuZCBpbml0aWFsaXplcyB0aGUgY2xhc3Nsb2FkZXIgZm9yIHRoaXMgY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgY2xhc3Nsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIGlmIChteUNsYXNzTG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG15Q2xhc3NMb2FkZXIgPSAoY2xhc3NwYXRoID09IG51bGwpCisgICAgICAgICAgICAgICAgLy8gdGhlIHVzdWFsIGNsYXNzbG9hZGVyCisgICAgICAgICAgICAgICAgPyBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKKyAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHVzZSB0aGUgcHJvdmlkZWQgY2xhc3NwYXRoCisgICAgICAgICAgICAgICAgOiBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbXlDbGFzc0xvYWRlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlZCBDbGFzc0xvYWRlci4KKyAgICAgKiBJZiB5b3UgaW52b2tlIHRoaXMgc2VsZWN0b3IgYnkgQVBJIChlLmcuIGluc2lkZSBzb21lIHRlc3RjYXNlcykgdGhlIHNlbGVjdG9yCisgICAgICogd2lsbCB1c2UgYSBkaWZmZXJlbnQgY2xhc3Nsb2FkZXIgZm9yIGxvYWRpbmcgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMgdGhhbgorICAgICAqIHRoZSBjYWxsZXIuIFRoZXJlZm9yZSB5b3Ugd2lsbCBnZXQgYSBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgeW91IGdldCB0aGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgZnJvbSB0aGUgc2VsZWN0b3IgYW5kIGNhc3QgdGhlbS4KKyAgICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBDbGFzc0xvYWRlciB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgbXlDbGFzc0xvYWRlciA9IGxvYWRlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgZm9yIG5lc3RlZCAmbHQ7cGFyYW0mZ3Q7IHRhZ3MuCisgICAgICogQHBhcmFtIGtleSB0aGUga2V5IG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgUGFyYW1ldGVyIHBhciA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgcGFyLnNldE5hbWUoa2V5KTsKKyAgICAgICAgcGFyLnNldFZhbHVlKFN0cmluZy52YWx1ZU9mKHZhbHVlKSk7CisgICAgICAgIGNvbmZpZ1BhcmFtZXRlci5hZGQocGFyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgZm9yIG5lc3RlZCAmbHQ7cGFyYW0mZ3Q7IHRhZ3MuCisgICAgICogQHBhcmFtIHBhcmFtZXRlciB0aGUgcGFyYW1ldGVyIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgY29uZmlnUGFyYW1ldGVyLmFkZChwYXJhbWV0ZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVmaW5lZCBpbiBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXJpemFibGUuCisgICAgICogT3ZlcndyaXRlIGltcGxlbWVudGF0aW9uIGluIHN1cGVyY2xhc3MgYmVjYXVzZSBvbmx5IHNwZWNpYWwKKyAgICAgKiBwYXJhbWV0ZXJzIGFyZSB2YWxpZC4KKyAgICAgKiBAc2VlICNhZGRQYXJhbShTdHJpbmcsT2JqZWN0KS4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgcGFyYW1ldGVycyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbmZpZ1BhcmFtZXRlci5hZGQocGFyYW1ldGVyc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgZm9yIG5lc3RlZCA8cGFyYW0gbmFtZT0iIiB2YWx1ZT0iIi8+IHRhZ3MuCisgICAgICogUGFyYW1ldGVyIG5hbWVkIDxpPmNhY2hlPC9pPiwgPGk+YWxnb3JpdGhtPC9pPiwKKyAgICAgKiA8aT5jb21wYXJhdG9yPC9pPiBvciA8aT51cGRhdGU8L2k+IGFyZSBtYXBwZWQgdG8KKyAgICAgKiB0aGUgcmVzcGVjdGl2ZSBzZXQtTWV0aG9kLgorICAgICAqIFBhcmFtZXRlciB3aGljaCBuYW1lcyBzdGFydHMgd2l0aCA8aT5jYWNoZS48L2k+IG9yCisgICAgICogPGk+YWxnb3JpdGhtLjwvaT4gb3IgPGk+Y29tcGFyYXRvci48L2k+IGFyZSB0cmllZAorICAgICAqIHRvIHNldCBvbiB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0IHZpYSBpdHMgc2V0LW1ldGhvZHMuCisgICAgICogT3RoZXIgcGFyYW1ldGVycyBhcmUgaW52YWxpZCBhbmQgYW4gQnVpbGRFeGNlcHRpb24gd2lsbAorICAgICAqIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIgIEtleSBhbmQgdmFsdWUgYXMgcGFyYW1ldGVyIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVzZVBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBwYXJhbWV0ZXIuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKCJjYWNoZSIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgIENhY2hlTmFtZSBjbiA9IG5ldyBDYWNoZU5hbWUoKTsKKyAgICAgICAgICAgIGNuLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIHNldENhY2hlKGNuKTsKKyAgICAgICAgfSBlbHNlIGlmICgiYWxnb3JpdGhtIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgQWxnb3JpdGhtTmFtZSBhbiA9IG5ldyBBbGdvcml0aG1OYW1lKCk7CisgICAgICAgICAgICBhbi5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICBzZXRBbGdvcml0aG0oYW4pOworICAgICAgICB9IGVsc2UgaWYgKCJjb21wYXJhdG9yIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgQ29tcGFyYXRvck5hbWUgY24gPSBuZXcgQ29tcGFyYXRvck5hbWUoKTsKKyAgICAgICAgICAgIGNuLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIHNldENvbXBhcmF0b3IoY24pOworICAgICAgICB9IGVsc2UgaWYgKCJ1cGRhdGUiLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICBib29sZWFuIHVwZGF0ZVZhbHVlID0KKyAgICAgICAgICAgICAgICAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgICAgID8gdHJ1ZQorICAgICAgICAgICAgICAgIDogZmFsc2U7CisgICAgICAgICAgICBzZXRVcGRhdGUodXBkYXRlVmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKCJkZWxheXVwZGF0ZSIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlVmFsdWUgPQorICAgICAgICAgICAgICAgICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpCisgICAgICAgICAgICAgICAgPyB0cnVlCisgICAgICAgICAgICAgICAgOiBmYWxzZTsKKyAgICAgICAgICAgIHNldERlbGF5VXBkYXRlKHVwZGF0ZVZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICgic2VsZGlycyIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc2RWYWx1ZSA9CisgICAgICAgICAgICAgICAgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkKKyAgICAgICAgICAgICAgICA/IHRydWUKKyAgICAgICAgICAgICAgICA6IGZhbHNlOworICAgICAgICAgICAgc2V0U2VsZGlycyhzZFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChDQUNIRV9QUkVGSVgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGtleS5zdWJzdHJpbmcoQ0FDSEVfUFJFRklYLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIHRyeVRvU2V0QVBhcmFtZXRlcihjYWNoZSwgbmFtZSwgdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5zdGFydHNXaXRoKEFMR09SSVRITV9QUkVGSVgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGtleS5zdWJzdHJpbmcoQUxHT1JJVEhNX1BSRUZJWC5sZW5ndGgoKSk7CisgICAgICAgICAgICB0cnlUb1NldEFQYXJhbWV0ZXIoYWxnb3JpdGhtLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoQ09NUEFSQVRPUl9QUkVGSVgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGtleS5zdWJzdHJpbmcoQ09NUEFSQVRPUl9QUkVGSVgubGVuZ3RoKCkpOworICAgICAgICAgICAgdHJ5VG9TZXRBUGFyYW1ldGVyKGNvbXBhcmF0b3IsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciAiICsga2V5KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVHJ5IHRvIHNldCBhIHZhbHVlIG9uIGFuIG9iamVjdCB1c2luZyByZWZsZWN0aW9uLgorICAgICAqIEhlbHBlciBtZXRob2QgZm9yIGVhc2llciBhY2Nlc3MgdG8gSW50cm9zcGVjdGlvbkhlbHBlci5zZXRBdHRyaWJ1dGUoKS4KKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgc2V0CisgICAgICogQHBhcmFtIG5hbWUgdGhlIGF0dHJpYnV0ZW5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRyeVRvU2V0QVBhcmFtZXRlcihPYmplY3Qgb2JqLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFByb2plY3QgcHJqID0gKGdldFByb2plY3QoKSAhPSBudWxsKSA/IGdldFByb2plY3QoKSA6IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIgaUhlbHBlcgorICAgICAgICAgICAgPSBJbnRyb3NwZWN0aW9uSGVscGVyLmdldEhlbHBlcihwcmosIG9iai5nZXRDbGFzcygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlIZWxwZXIuc2V0QXR0cmlidXRlKHByaiwgb2JqLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tICdiZWF1dGlmdWwnIG91dHB1dCAtLS0tLQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBPYmplY3QudG9TdHJpbmcoKS4KKyAgICAgKiBAcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2VsZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigie21vZGlmaWVkc2VsZWN0b3IiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIHVwZGF0ZT0iKS5hcHBlbmQodXBkYXRlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIHNlbGRpcnM9IikuYXBwZW5kKHNlbGVjdERpcmVjdG9yaWVzKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiIGNhY2hlPSIpLmFwcGVuZChjYWNoZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBhbGdvcml0aG09IikuYXBwZW5kKGFsZ29yaXRobSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiBjb21wYXJhdG9yPSIpLmFwcGVuZChjb21wYXJhdG9yKTsKKyAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLSBCdWlsZExpc3RlbmVyIGludGVyZmFjZSBtZXRob2RzIC0tLS0tCisKKworICAgIC8qKgorICAgICAqIFNpZ25hbHMgdGhhdCB0aGUgbGFzdCB0YXJnZXQgaGFzIGZpbmlzaGVkLgorICAgICAqIEBwYXJhbSBldmVudCByZWNpZXZlZCBCdWlsZEV2ZW50CisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGdldERlbGF5VXBkYXRlKCkpIHsKKyAgICAgICAgICAgIHNhdmVDYWNoZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIHRoYXQgYSB0YXJnZXQgaGFzIGZpbmlzaGVkLgorICAgICAqIEBwYXJhbSBldmVudCByZWNpZXZlZCBCdWlsZEV2ZW50CisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChnZXREZWxheVVwZGF0ZSgpKSB7CisgICAgICAgICAgICBzYXZlQ2FjaGUoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2lnbmFscyB0aGF0IGEgdGFzayBoYXMgZmluaXNoZWQuCisgICAgICogQHBhcmFtIGV2ZW50IHJlY2lldmVkIEJ1aWxkRXZlbnQKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChnZXREZWxheVVwZGF0ZSgpKSB7CisgICAgICAgICAgICBzYXZlQ2FjaGUoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2lnbmFscyB0aGF0IGEgYnVpbGQgaGFzIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIGV2ZW50IHJlY2lldmVkIEJ1aWxkRXZlbnQKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIHRoYXQgYSB0YXJnZXQgaXMgc3RhcnRpbmcuCisgICAgICogQHBhcmFtIGV2ZW50IHJlY2VpdmVkIEJ1aWxkRXZlbnQKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAvLyBuby1vcAorICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIHRoYXQgYSB0YXNrIGlzIHN0YXJ0aW5nLgorICAgICAqIEBwYXJhbSBldmVudCByZWNpZXZlZCBCdWlsZEV2ZW50CisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIGEgbWVzc2FnZSBsb2dnaW5nIGV2ZW50LgorICAgICAqIEBwYXJhbSBldmVudCByZWNpZXZlZCBCdWlsZEV2ZW50CisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9CisKKworICAgIC8vIFRoZSBFbnVtZXJhdGVkQXR0cmlidXRlcyBmb3IgdGhlIHRocmVlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMuCisgICAgLy8gTmFtZS1DbGFzc25hbWUgbWFwcGluZyBpcyBkb25lIGluIHRoZSBjb25maWd1cmUoKSBtZXRob2QuCisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2FjaGUgdHlwZSB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgZW51bWVyYXRlZCBjYWNoZSB0eXBlCisgICAgICovCisgICAgcHVibGljIENhY2hlIGdldENhY2hlKCkgeworICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYWNoZSB0eXBlIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gbmFtZSBhbiBlbnVtZXJhdGVkIGNhY2hlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGUoQ2FjaGVOYW1lIG5hbWUpIHsKKyAgICAgICAgY2FjaGVOYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW51bWVyYXRlZCB0eXBlIGZvciBjYWNoZS4KKyAgICAgKiBUaGUgdmFsdWVzIGFyZSAicHJvcGVydHlmaWxlIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhY2hlTmFtZSBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICAvKioKKyAgICAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsicHJvcGVydHlmaWxlIiB9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhbGdvcml0aG0gdHlwZSB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgZW51bWVyYXRlZCBhbGdvcml0aG0gdHlwZQorICAgICAqLworICAgIHB1YmxpYyBBbGdvcml0aG0gZ2V0QWxnb3JpdGhtKCkgeworICAgICAgICByZXR1cm4gYWxnb3JpdGhtOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWxnb3JpdGhtIHR5cGUgdG8gdXNlLgorICAgICAqIEBwYXJhbSBuYW1lIGFuIGVudW1lcmF0ZWQgYWxnb3JpdGhtIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxnb3JpdGhtKEFsZ29yaXRobU5hbWUgbmFtZSkgeworICAgICAgICBhbGdvTmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVudW1lcmF0ZWQgdHlwZSBmb3IgYWxnb3JpdGhtLgorICAgICAqIFRoZSB2YWx1ZXMgYXJlICJoYXNoVmFsdWUiLCAiZGlnZXN0IiBhbmQgImNoZWNrc3VtIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsZ29yaXRobU5hbWUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlI2dldFZhbHVlcygpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7Imhhc2h2YWx1ZSIsICJkaWdlc3QiLCAiY2hlY2tzdW0iIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbXBhcmF0b3IgdHlwZSB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgZW51bWVyYXRlZCBjb21wYXJhdG9yIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgeworICAgICAgICByZXR1cm4gY29tcGFyYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbXBhcmF0b3IgdHlwZSB0byB1c2UuCisgICAgICogQHBhcmFtIG5hbWUgYW4gZW51bWVyYXRlZCBjb21wYXJhdG9yIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihDb21wYXJhdG9yTmFtZSBuYW1lKSB7CisgICAgICAgIGNvbXBOYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW51bWVyYXRlZCB0eXBlIGZvciBhbGdvcml0aG0uCisgICAgICogVGhlIHZhbHVlcyBhcmUgImVxdWFsIiBhbmQgInJ1bGUiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGFyYXRvck5hbWUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlI2dldFZhbHVlcygpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImVxdWFsIiwgInJ1bGUiIH07CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL1Byb3BlcnRpZXNmaWxlQ2FjaGUuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL1Byb3BlcnRpZXNmaWxlQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmZjZDk3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvUHJvcGVydGllc2ZpbGVDYWNoZS5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3I7CisKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworCisKKy8qKgorICogVXNlIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGZvciBzdG9yaW5nIHRoZSB2YWx1ZXMuCisgKiBUaGUgdXNlIG9mIHRoaXMgQ2FjaGUtaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgcGFyYW1ldGVyCisgKiA8cGFyYW0gbmFtZT0iY2FjaGUuY2FjaGVmaWxlIiAuLi4vPiBmb3IgZGVmaW5pbmcsIHdoZXJlIHRvIHN0b3JlIHRoZQorICogcHJvcGVydGllcyBmaWxlLgorICoKKyAqIFRoZSBNb2RpZmllZFNlbGVjdG9yIHNldHMgdGhlIDxpPmNhY2hlZmlsZTwvaT4gdG8gdGhlIGRlZmF1bHQgdmFsdWUKKyAqIDxpPmNhY2hlLnByb3BlcnRpZXM8L2k+LgorICoKKyAqIFN1cHBvcnRlZCA8cGFyYW0+cyBhcmU6CisgKiA8dGFibGU+CisgKiA8dHI+CisgKiAgIDx0aD5uYW1lPC90aD48dGg+dmFsdWVzPC90aD48dGg+ZGVzY3JpcHRpb248L3RoPjx0aD5yZXF1aXJlZDwvdGg+CisgKiA8L3RyPgorICogPHRyPgorICogICA8dGQ+IGNhY2hlLmNhY2hlZmlsZSA8L3RkPgorICogICA8dGQ+IDxpPnBhdGggdG8gZmlsZTwvaT4gPC90ZD4KKyAqICAgPHRkPiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydGllcyBmaWxlIDwvdGQ+CisgKiAgIDx0ZD4geWVzIDwvdGQ+CisgKiA8L3RyPgorICogPC90YWJsZT4KKyAqCisgKiBAdmVyc2lvbiAyMDAzLTA5LTEzCisgKiBAc2luY2UgIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnRpZXNmaWxlQ2FjaGUgaW1wbGVtZW50cyBDYWNoZSB7CisKKworICAgIC8vIC0tLS0tICBtZW1iZXIgdmFyaWFibGVzIC0gY29uZmlndXJhdGlvbiAgLS0tLS0KKworCisgICAgLyoqIFdoZXJlIHRvIHN0b3JlIHRoZSBwcm9wZXJ0aWVzPyAqLworICAgIHByaXZhdGUgRmlsZSBjYWNoZWZpbGUgPSBudWxsOworCisgICAgLyoqIE9iamVjdCBmb3Igc3RvcmluZyB0aGUga2V5LXZhbHVlLXBhaXJzLiAqLworICAgIHByaXZhdGUgUHJvcGVydGllcyBjYWNoZSA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKworICAgIC8vIC0tLS0tICBtZW1iZXIgdmFyaWFibGVzIC0gaW50ZXJuYWwgdXNlICAtLS0tLQorCisKKyAgICAvKiogSXMgdGhlIGNhY2hlIGFscmVhZHkgbG9hZGVkPyBQcmV2ZW50cyBmcm9tIG11bHRpcGxlIGxvYWQgb3BlcmF0aW9ucy4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGVMb2FkZWQgPSBmYWxzZTsKKworICAgIC8qKiBNdXN0IHRoZSBjYWNoZSBiZSBzYXZlZD8gUHJldmVudHMgZnJvbSBtdWx0aXBsZSBzYXZlIG9wZXJhdGlvbnMuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNhY2hlRGlydHkgID0gdHJ1ZTsKKworCisgICAgLy8gLS0tLS0gIENvbnN0cnVjdG9ycyAgLS0tLS0KKworCisgICAgLyoqIEJlYW4tQ29uc3RydWN0b3IuICovCisgICAgcHVibGljIFByb3BlcnRpZXNmaWxlQ2FjaGUoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIGNhY2hlZmlsZSBzZXQgdGhlIGNhY2hlZmlsZQorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0aWVzZmlsZUNhY2hlKEZpbGUgY2FjaGVmaWxlKSB7CisgICAgICAgIHRoaXMuY2FjaGVmaWxlID0gY2FjaGVmaWxlOworICAgIH0KKworCisgICAgLy8gLS0tLS0gIENhY2hlLUNvbmZpZ3VyYXRpb24gIC0tLS0tCisKKworICAgIC8qKgorICAgICAqIFNldHRlci4KKyAgICAgKiBAcGFyYW0gZmlsZSBuZXcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZWZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIGNhY2hlZmlsZSA9IGZpbGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXR0ZXIuCisgICAgICogQHJldHVybiB0aGUgY2FjaGVmaWxlCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0Q2FjaGVmaWxlKCkgeworICAgICAgICByZXR1cm4gY2FjaGVmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2FjaGUgaXMgdmFsaWQgaWYgdGhlIGNhY2hlZmlsZSBpcyBzZXQuCisgICAgICogQHJldHVybiB0cnVlIGlmIGFsbCBpcyBvayBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gKGNhY2hlZmlsZSAhPSBudWxsKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tICBEYXRhIEFjY2VzcworCisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBjYWNoZSBmcm9tIHVuZGVybHlpbmcgcHJvcGVydGllcyBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7CisgICAgICAgIGlmICgoY2FjaGVmaWxlICE9IG51bGwpICYmIGNhY2hlZmlsZS5pc0ZpbGUoKSAmJiBjYWNoZWZpbGUuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oY2FjaGVmaWxlKSk7CisgICAgICAgICAgICAgICAgY2FjaGUubG9hZChiaXMpOworICAgICAgICAgICAgICAgIGJpcy5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGFmdGVyIGxvYWRpbmcgdGhlIGNhY2hlIGlzIHVwIHRvIGRhdGUgd2l0aCB0aGUgZmlsZQorICAgICAgICBjYWNoZUxvYWRlZCA9IHRydWU7CisgICAgICAgIGNhY2hlRGlydHkgID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZXMgbW9kaWZpY2F0aW9uIG9mIHRoZSBjYWNoZS4KKyAgICAgKiBDYWNoZSBpcyBvbmx5IHNhdmVkIGlmIHRoZXJlIGlzIG9uZSBvcmUgbW9yZSBlbnRyaWVzLgorICAgICAqIEJlY2F1c2UgZW50cmllcyBjYW4gbm90IGJlIGRlbGV0ZWQgYnkgdGhpcyBBUEksIHRoaXMgQ2FjaGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBjaGVja3MgdGhlIGV4aXN0ZW5jZSBvZiBlbnRyaWVzIGJlZm9yZSBjcmVhdGluZyB0aGUgZmlsZQorICAgICAqIGZvciBwZXJmb3JtYW5jZSBvcHRpbWlzYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZSgpIHsKKyAgICAgICAgaWYgKCFjYWNoZURpcnR5KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjYWNoZWZpbGUgIT0gbnVsbCkgJiYgY2FjaGUucHJvcGVydHlOYW1lcygpLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShjYWNoZWZpbGUpKTsKKyAgICAgICAgICAgICAgICBjYWNoZS5zdG9yZShib3MsIG51bGwpOworICAgICAgICAgICAgICAgIGJvcy5mbHVzaCgpOworICAgICAgICAgICAgICAgIGJvcy5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhY2hlRGlydHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogRGVsZXRlcyB0aGUgY2FjaGUgYW5kIGl0cyB1bmRlcmx5aW5nIGZpbGUuICovCisgICAgcHVibGljIHZvaWQgZGVsZXRlKCkgeworICAgICAgICBjYWNoZSA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGNhY2hlZmlsZS5kZWxldGUoKTsKKyAgICAgICAgY2FjaGVMb2FkZWQgPSB0cnVlOworICAgICAgICBjYWNoZURpcnR5ID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZhbHVlIGZvciBhIGdpdmVuIGtleSBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKKyAgICAgKiBAcmV0dXJuIHRoZSBzdG9yZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgIGlmICghY2FjaGVMb2FkZWQpIHsKKyAgICAgICAgICAgIGxvYWQoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldFByb3BlcnR5KFN0cmluZy52YWx1ZU9mKGtleSkpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlcyBhIGtleS12YWx1ZS1wYWlyIGluIHRoZSBjYWNoZS4KKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBjYWNoZS5wdXQoU3RyaW5nLnZhbHVlT2Yoa2V5KSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKKyAgICAgICAgY2FjaGVEaXJ0eSA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIGluIHRoZSBjYWNoZS4KKyAgICAgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICBWZWN0b3IgdiA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7CisgICAgICAgIEVudW1lcmF0aW9uIGVuID0gY2FjaGUucHJvcGVydHlOYW1lcygpOworICAgICAgICB3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIHYuYWRkKGVuLm5leHRFbGVtZW50KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2Lml0ZXJhdG9yKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLSAgYWRkaXRpb25hbCAgLS0tLS0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgT2JqZWN0LnRvU3RyaW5nKCkuCisgICAgICogQHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNhY2hlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiPFByb3BlcnRpZXNmaWxlQ2FjaGU6Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQoImNhY2hlZmlsZT0iKS5hcHBlbmQoY2FjaGVmaWxlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiO25vT2ZFbnRyaWVzPSIpLmFwcGVuZChjYWNoZS5zaXplKCkpOworICAgICAgICBidWYuYXBwZW5kKCI+Iik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zcGkvUHJvdmlkZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NwaS9Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZGZlNzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zcGkvUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNwaTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogQU5UIEphci1UYXNrIFNQSSBleHRlbnNpb24KKyAqIFRoaXMgY2xhc3MgY29ycmVzcG9uZHMgdG8gdGhlIG5lc3RlZCBlbGVtZW50CisgKiAmbHQ7cHJvdmlkZXIgdHlwZT0idHlwZSImZ3Q7IGluIHRoZSAmbHQ7c2VydmljZSB0eXBlPSIiJmd0OworICogbmVzdGVkIGVsZW1lbnQgb2YgdGhlIGphciB0YXNrLgorICogQHNlZSA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMxNTIwIj4KKyAqIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzE1MjA8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBQcm92aWRlciBleHRlbmRzIFByb2plY3RDb21wb25lbnQgeworICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb3ZpZGVyIGNsYXNzbmFtZS4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdmFsdWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gY29uZmlndXJlZCBjb3JyZWN0bHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hlY2soKSB7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiY2xhc3NuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3IgcHJvdmlkZXIgZWxlbWVudCIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIGVtcHR5IGNsYXNzbmFtZSIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc3BpL1NlcnZpY2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NwaS9TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4M2I1ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NwaS9TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc3BpOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIEFOVCBKYXItVGFzayBTUEkgZXh0ZW5zaW9uCisgKgorICogQHNlZSA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMxNTIwIj4KKyAqIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzE1MjA8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2aWNlIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCB7CisgICAgcHJpdmF0ZSBMaXN0IHByb3ZpZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm92aWRlciBjbGFzc25hbWUuCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3NuYW1lIG9mIGEgcHJvdmlkZXIgb2YgdGhpcyBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3ZpZGVyKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIoKTsKKyAgICAgICAgcHJvdmlkZXIuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgIHByb3ZpZGVyTGlzdC5hZGQocHJvdmlkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5lc3RlZCBwcm92aWRlciBlbGVtZW50LgorICAgICAqIEBwYXJhbSBwcm92aWRlciBhIHByb3ZpZGVyIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFByb3ZpZGVyKFByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIHByb3ZpZGVyLmNoZWNrKCk7CisgICAgICAgIHByb3ZpZGVyTGlzdC5hZGQocHJvdmlkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHNlcnZpY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VydmljZSB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBzZXJ2aWNlIHR5cGUsIGEgY2xhc3NuYW1lIG9mCisgICAgICogICAgICAgICAgICAgYW4gaW50ZXJmYWNlIG9yIGEgY2xhc3MgKG5vcm1hbGx5CisgICAgICogICAgICAgICAgICAgYWJzdHJhY3QpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzCisgICAgICogc2VydmljZXMgYXMgYW4gaW5wdXRzdHJlYW0uCisgICAgICogQHJldHVybiBhbiBpbnB1dHN0cmVhbSBvZiB0aGUgY2xhc3NuYW1lIG5hbWVzCisgICAgICogICAgICAgICBlbmNvZGVkIGFzIFVURi04LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldEFzU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFycmF5T3V0OworICAgICAgICBXcml0ZXIgd3JpdGVyOworICAgICAgICBJdGVyYXRvciBwcm92aWRlckl0ZXJhdG9yOworICAgICAgICBQcm92aWRlciBwcm92aWRlcjsKKworICAgICAgICBhcnJheU91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihhcnJheU91dCwgIlVURi04Iik7CisgICAgICAgIHByb3ZpZGVySXRlcmF0b3IgPSBwcm92aWRlckxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHByb3ZpZGVySXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBwcm92aWRlciA9IChQcm92aWRlcikgcHJvdmlkZXJJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUocHJvdmlkZXIuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJcbiIpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGFycmF5T3V0LnRvQnl0ZUFycmF5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoaXMgb2JqZWN0IGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGFzIGEgbmVzdGVkCisgICAgICogZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVjaygpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJ0eXBlIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3Igc2VydmljZSBlbGVtZW50IiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkludmFsaWQgZW1wdHkgdHlwZSBjbGFzc25hbWUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvdmlkZXJMaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInByb3ZpZGVyIGF0dHJpYnV0ZSBvciBuZXN0ZWQgcHJvdmlkZXIgZWxlbWVudCBtdXN0IGJlIHNldCEiLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9CYXNlNjRDb252ZXJ0ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQmFzZTY0Q29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmN2U1YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQmFzZTY0Q29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworLyoqCisgKiBCQVNFIDY0IGVuY29kaW5nIG9mIGEgU3RyaW5nIG9yIGFuIGFycmF5IG9mIGJ5dGVzLgorICoKKyAqIEJhc2VkIG9uIFJGQyAxNDIxLgorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCYXNlNjRDb252ZXJ0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEUgICAgICA9IDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdPUkQgICAgICA9IDE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFX01BU0sgPSAweEZGOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NfMF9NQVNLID0gMHgwMDAwMDAzRjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TXzFfTUFTSyA9IDB4MDAwMDBGQzA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPU18xX1NISUZUID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TXzJfTUFTSyA9IDB4MDAwM0YwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPU18yX1NISUZUID0gMTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPU18zX01BU0sgPSAweDAwRkMwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NfM19TSElGVCA9IDE4OworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQUxQSEFCRVQgPSB7CisgICAgICAgICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAgLy8gIDAgdG8gIDcKKyAgICAgICAgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICAvLyAgOCB0byAxNQorICAgICAgICAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgIC8vIDE2IHRvIDIzCisgICAgICAgICdZJywgJ1onLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAgLy8gMjQgdG8gMzEKKyAgICAgICAgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICAvLyAzMiB0byAzOQorICAgICAgICAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgIC8vIDQwIHRvIDQ3CisgICAgICAgICd3JywgJ3gnLCAneScsICd6JywgJzAnLCAnMScsICcyJywgJzMnLCAgLy8gNDggdG8gNTUKKyAgICAgICAgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJysnLCAnLyd9OyAvLyA1NiB0byA2MworCisgICAgLy8gQ2hlY2tTdHlsZTpDb25zdGFudE5hbWVDaGVjayBPRkYgLSBiYworICAgIC8qKiBQcm92aWRlZCBmb3IgQkMgcHVycG9zZXMgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBhbHBoYWJldCA9IEFMUEhBQkVUOworICAgIC8vIENoZWNrU3R5bGU6Q29uc3RhbnROYW1lQ2hlY2sgT04KKworCisgICAgLyoqCisgICAgICogRW5jb2RlIGEgc3RyaW5nIGludG8gYmFzZTY0IGVuY29kaW5nLgorICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gZW5jb2RlLgorICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlbmNvZGUocy5nZXRCeXRlcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgYSBieXRlIGFycmF5IGludG8gYmFzZTY0IGVuY29kaW5nLgorICAgICAqIEBwYXJhbSBvY3RldFN0cmluZyB0aGUgYnl0ZSBhcnJheSB0byBlbmNvZGUuCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGUoYnl0ZVtdIG9jdGV0U3RyaW5nKSB7CisgICAgICAgIGludCBiaXRzMjQ7CisgICAgICAgIGludCBiaXRzNjsKKworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICBjaGFyW10gb3V0ID0gbmV3IGNoYXJbKChvY3RldFN0cmluZy5sZW5ndGggLSAxKSAvIDMgKyAxKSAqIDRdOworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisgICAgICAgIGludCBvdXRJbmRleCA9IDA7CisgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICB3aGlsZSAoKGkgKyAzKSA8PSBvY3RldFN0cmluZy5sZW5ndGgpIHsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9jdGV0cworICAgICAgICAgICAgYml0czI0ID0gKG9jdGV0U3RyaW5nW2krK10gJiBCWVRFX01BU0spIDw8IFdPUkQ7CisgICAgICAgICAgICBiaXRzMjQgfD0gKG9jdGV0U3RyaW5nW2krK10gJiBCWVRFX01BU0spIDw8IEJZVEU7CisgICAgICAgICAgICBiaXRzMjQgfD0gb2N0ZXRTdHJpbmdbaSsrXTsKKworICAgICAgICAgICAgYml0czYgPSAoYml0czI0ICYgUE9TXzNfTUFTSykgPj4gUE9TXzNfU0hJRlQ7CisgICAgICAgICAgICBvdXRbb3V0SW5kZXgrK10gPSBBTFBIQUJFVFtiaXRzNl07CisgICAgICAgICAgICBiaXRzNiA9IChiaXRzMjQgJiBQT1NfMl9NQVNLKSA+PiBQT1NfMl9TSElGVDsKKyAgICAgICAgICAgIG91dFtvdXRJbmRleCsrXSA9IEFMUEhBQkVUW2JpdHM2XTsKKyAgICAgICAgICAgIGJpdHM2ICA9IChiaXRzMjQgJiBQT1NfMV9NQVNLKSA+PiBQT1NfMV9TSElGVDsKKyAgICAgICAgICAgIG91dFtvdXRJbmRleCsrXSA9IEFMUEhBQkVUW2JpdHM2XTsKKyAgICAgICAgICAgIGJpdHM2ID0gKGJpdHMyNCAmIFBPU18wX01BU0spOworICAgICAgICAgICAgb3V0W291dEluZGV4KytdID0gQUxQSEFCRVRbYml0czZdOworICAgICAgICB9CisgICAgICAgIGlmIChvY3RldFN0cmluZy5sZW5ndGggLSBpID09IDIpIHsKKyAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBvY3RldHMKKyAgICAgICAgICAgIGJpdHMyNCA9IChvY3RldFN0cmluZ1tpXSAmIEJZVEVfTUFTSykgPDwgV09SRDsKKyAgICAgICAgICAgIGJpdHMyNCB8PSAob2N0ZXRTdHJpbmdbaSArIDFdICYgQllURV9NQVNLKSA8PCBCWVRFOworICAgICAgICAgICAgYml0czYgPSAoYml0czI0ICYgUE9TXzNfTUFTSykgPj4gUE9TXzNfU0hJRlQ7CisgICAgICAgICAgICBvdXRbb3V0SW5kZXgrK10gPSBBTFBIQUJFVFtiaXRzNl07CisgICAgICAgICAgICBiaXRzNiA9IChiaXRzMjQgJiBQT1NfMl9NQVNLKSA+PiBQT1NfMl9TSElGVDsKKyAgICAgICAgICAgIG91dFtvdXRJbmRleCsrXSA9IEFMUEhBQkVUW2JpdHM2XTsKKyAgICAgICAgICAgIGJpdHM2ID0gKGJpdHMyNCAmIFBPU18xX01BU0spID4+IFBPU18xX1NISUZUOworICAgICAgICAgICAgb3V0W291dEluZGV4KytdID0gQUxQSEFCRVRbYml0czZdOworCisgICAgICAgICAgICAvLyBwYWRkaW5nCisgICAgICAgICAgICBvdXRbb3V0SW5kZXgrK10gPSAnPSc7CisgICAgICAgIH0gZWxzZSBpZiAob2N0ZXRTdHJpbmcubGVuZ3RoIC0gaSA9PSAxKSB7CisgICAgICAgICAgICAvLyBzdG9yZSB0aGUgb2N0ZXRzCisgICAgICAgICAgICBiaXRzMjQgPSAob2N0ZXRTdHJpbmdbaV0gJiBCWVRFX01BU0spIDw8IFdPUkQ7CisgICAgICAgICAgICBiaXRzNiA9IChiaXRzMjQgJiBQT1NfM19NQVNLKSA+PiBQT1NfM19TSElGVDsKKyAgICAgICAgICAgIG91dFtvdXRJbmRleCsrXSA9IEFMUEhBQkVUW2JpdHM2XTsKKyAgICAgICAgICAgIGJpdHM2ID0gKGJpdHMyNCAmIFBPU18yX01BU0spID4+IFBPU18yX1NISUZUOworICAgICAgICAgICAgb3V0W291dEluZGV4KytdID0gQUxQSEFCRVRbYml0czZdOworCisgICAgICAgICAgICAvLyBwYWRkaW5nCisgICAgICAgICAgICBvdXRbb3V0SW5kZXgrK10gPSAnPSc7CisgICAgICAgICAgICBvdXRbb3V0SW5kZXgrK10gPSAnPSc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcob3V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NoYWluZWRNYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ2hhaW5lZE1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkyMDU0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NoYWluZWRNYXBwZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQSA8Q09ERT5Db250YWluZXJNYXBwZXI8L0NPREU+IHRoYXQgY2hhaW5zIHRoZSByZXN1bHRzIG9mIHRoZSBmaXJzdAorICogbmVzdGVkIDxDT0RFPkZpbGVOYW1lTWFwcGVyPC9DT0RFPnMgaW50byBzb3VyY2VmaWxlcyBmb3IgdGhlIHNlY29uZCwKKyAqIHRoZSBzZWNvbmQgdG8gdGhlIHRoaXJkLCBhbmQgc28gb24sIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIG1hcHBlZAorICogZmlsZW5hbWVzIGZyb20gdGhlIGxhc3QgbmVzdGVkIDxDT0RFPkZpbGVOYW1lTWFwcGVyPC9DT0RFPi4KKyAqLworcHVibGljIGNsYXNzIENoYWluZWRNYXBwZXIgZXh0ZW5kcyBDb250YWluZXJNYXBwZXIgeworCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgeworICAgICAgICBMaXN0IGlucHV0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICByZXN1bHRzLmFkZChzb3VyY2VGaWxlTmFtZSk7CisgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IG51bGw7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBtSXRlciA9IGdldE1hcHBlcnMoKS5pdGVyYXRvcigpOyBtSXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBtYXBwZXIgPSAoRmlsZU5hbWVNYXBwZXIpIChtSXRlci5uZXh0KCkpOworICAgICAgICAgICAgaWYgKG1hcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5wdXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaW5wdXRzLmFkZEFsbChyZXN1bHRzKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmNsZWFyKCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaW5wdXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbWFwcGVkID0gbWFwcGVyLm1hcEZpbGVOYW1lKChTdHJpbmcpIChpdC5uZXh0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1hcHBlZCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVzdWx0cy5zaXplKCkgPT0gMCkgPyBudWxsCisgICAgICAgICAgICA6IChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ2xhc3NwYXRoVXRpbHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ2xhc3NwYXRoVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGRiMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DbGFzc3BhdGhVdGlscy5qYXZhCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKKworLy8gQ2hlY2tTdHlsZTpIaWRlVXRpbGl0eUNsYXNzQ29uc3RydWN0b3JDaGVjayBPRkYgLSBiYworCisvKioKKyAqIE9mZmVycyBzb21lIGhlbHBlciBtZXRob2RzIG9uIHRoZSBQYXRoIHN0cnVjdHVyZSBpbiBhbnQuCisgKgorICogPHA+VGhlIGJhc2ljIGlkZWEgYmVoaW5kIHRoaXMgdXRpbGl0eSBjbGFzcyBpcyB0byB1c2UgaXQgZnJvbSBpbnNpZGUgdGhlCisgKiBkaWZmZXJlbnQgQW50IG9iamVjdHMgKGFuZCB1c2VyIGRlZmluZWQgb2JqZWN0cykgdGhhdCBuZWVkIGNsYXNzTG9hZGluZworICogZm9yIHRoZWlyIG9wZXJhdGlvbi4KKyAqIE5vcm1hbGx5IHRob3NlIHdvdWxkIGhhdmUgYSBzZXRDbGFzc3BhdGhSZWYoKSB7Zm9yIHRoZSBAY2xhc3NwYXRocmVmfQorICogYW5kL29yIGEgY3JlYXRlQ2xhc3NwYXRoKCkge2ZvciB0aGUgbmVzdGVkICZsdDtjbGFzc3BhdGgmZ3Q7fQorICogVHlwaWNhbGx5IG9uZSB3b3VsZCBoYXZlIGluIHlvdXIgQW50IFRhc2sgb3IgRGF0YVR5cGU8L3A+CisgKgorICogPHByZT48Y29kZT4KKyAqIENsYXNzcGF0aFV0aWxzLkRlbGVnYXRlIGNwRGVsZWdhdGU7CisgKgorICogcHVibGljIHZvaWQgaW5pdCgpIHsKKyAqICAgICB0aGlzLmNwRGVsZWdhdGUgPSBDbGFzc3BhdGhVdGlscy5nZXREZWxlZ2F0ZSh0aGlzKTsKKyAqICAgICBzdXBlci5pbml0KCk7CisgKiB9CisgKgorICogcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgKiAgICAgdGhpcy5jcERlbGVnYXRlLnNldENsYXNzcGF0aFJlZihyKTsKKyAqIH0KKyAqCisgKiBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgKiAgICAgcmV0dXJuIHRoaXMuY3BEZWxlZ2F0ZS5jcmVhdGVDbGFzc3BhdGgoKTsKKyAqIH0KKyAqCisgKiBwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIGZxY24pIHsKKyAqICAgICB0aGlzLmNwRGVsZWdhdGUuc2V0Q2xhc3NuYW1lKGZxY24pOworICogfQorICogPC9jb2RlPjwvcHJlPgorICoKKyAqIDxwPkF0IGV4ZWN1dGlvbiB0aW1lLCB3aGVuIHlvdSBhY3R1YWxseSBuZWVkIHRoZSBjbGFzc2xvYWRpbmcKKyAqIHlvdSBjYW4ganVzdDo8L3A+CisgKgorICogPHByZT48Y29kZT4KKyAqICAgICBPYmplY3QgbyA9IHRoaXMuY3BEZWxlZ2F0ZS5uZXdJbnN0YW5jZSgpOworICogPC9jb2RlPjwvcHJlPgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc3BhdGhVdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBtYWdpYyBwcm9wZXJ0eSB0aGF0IGNvbnRyb2xzIGNsYXNzbG9hZGVyIHJldXNlIGluIEFudCAxLjQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0VfTE9BREVSX1JFRiA9IE1hZ2ljTmFtZXMuUkVGSURfQ0xBU1NQQVRIX1JFVVNFX0xPQURFUjsKKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkZWQgdmVyc2lvbiBvZiB7QGxpbmsKKyAgICAgKiAjZ2V0Q2xhc3NMb2FkZXJGb3JQYXRoKFByb2plY3QsIFJlZmVyZW5jZSwgYm9vbGVhbil9LgorICAgICAqCisgICAgICogPHA+QXNzdW1lcyB0aGUgbG9naWNhbCAnZmFsc2UnIGZvciB0aGUgcmV2ZXJzZUxvYWRlci48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdAorICAgICAqIEBwYXJhbSByZWYgdGhlIHJlZmVyZW5jZQorICAgICAqIEByZXR1cm4gVGhlIGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXJGb3JQYXRoKFByb2plY3QgcCwgUmVmZXJlbmNlIHJlZikgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3NMb2FkZXJGb3JQYXRoKHAsIHJlZiwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkZWQgdmVyc2lvbiBvZiB7QGxpbmsgI2dldENsYXNzTG9hZGVyRm9yUGF0aChQcm9qZWN0LCBQYXRoLAorICAgICAqIFN0cmluZywgYm9vbGVhbil9LgorICAgICAqCisgICAgICogPHA+RGVsZWdhdGVzIHRvIHRoZSBvdGhlciBvbmUgYWZ0ZXIgZXh0cmFjdGluZyB0aGUgcmVmZXJlbmNlZAorICAgICAqIFBhdGggZnJvbSB0aGUgUHJvamVjdC4gVGhpcyBjaGVja3MgYWxzbyB0aGF0IHRoZSBwYXNzZWQKKyAgICAgKiBSZWZlcmVuY2UgaXMgcG9pbnRpbmcgdG8gYSBQYXRoIGFsbCByaWdodC48L3A+CisgICAgICogQHBhcmFtIHAgY3VycmVudCBBbnQgcHJvamVjdAorICAgICAqIEBwYXJhbSByZWYgUmVmZXJlbmNlIHRvIFBhdGggc3RydWN0dXJlCisgICAgICogQHBhcmFtIHJldmVyc2VMb2FkZXIgaWYgc2V0IHRvIHRydWUgdGhpcyBuZXcgbG9hZGVyIHdpbGwgdGFrZQorICAgICAqIHByZWNlZGVuY2Ugb3ZlciBpdHMgcGFyZW50ICh3aGljaCBpcyBjb250cmEgdGhlIHJlZ3VsYXIKKyAgICAgKiBjbGFzc2xvYWRlciBiZWhhdmlvdXIpCisgICAgICogQHJldHVybiBUaGUgY2xhc3MgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlckZvclBhdGgoCisgICAgICAgIFByb2plY3QgcCwgUmVmZXJlbmNlIHJlZiwgYm9vbGVhbiByZXZlcnNlTG9hZGVyKSB7CisgICAgICAgIFN0cmluZyBwYXRoSWQgPSByZWYuZ2V0UmVmSWQoKTsKKyAgICAgICAgT2JqZWN0IHBhdGggPSBwLmdldFJlZmVyZW5jZShwYXRoSWQpOworICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgUGF0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHNwZWNpZmllZCBjbGFzc3BhdGhyZWYgIiArIHBhdGhJZAorICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgcmVmZXJlbmNlIGEgUGF0aC4iKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbG9hZGVySWQgPSBNYWdpY05hbWVzLlJFRklEX0NMQVNTUEFUSF9MT0FERVJfUFJFRklYICsgcGF0aElkOworICAgICAgICByZXR1cm4gZ2V0Q2xhc3NMb2FkZXJGb3JQYXRoKHAsIChQYXRoKSBwYXRoLCBsb2FkZXJJZCwgcmV2ZXJzZUxvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugb3ZlcmxvYWRlZCB2ZXJzaW9uIG9mIHtAbGluaworICAgICAqICNnZXRDbGFzc0xvYWRlckZvclBhdGgoUHJvamVjdCwgUGF0aCwgU3RyaW5nLCBib29sZWFuKX0uCisgICAgICoKKyAgICAgKiA8cD5Bc3N1bWVzIHRoZSBsb2dpY2FsICdmYWxzZScgZm9yIHRoZSByZXZlcnNlTG9hZGVyLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwIGN1cnJlbnQgQW50IHByb2plY3QKKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAorICAgICAqIEBwYXJhbSBsb2FkZXJJZCB0aGUgbG9hZGVyIGlkIHN0cmluZworICAgICAqIEByZXR1cm4gVGhlIGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXJGb3JQYXRoKFByb2plY3QgcCwgUGF0aCBwYXRoLCBTdHJpbmcgbG9hZGVySWQpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzTG9hZGVyRm9yUGF0aChwLCBwYXRoLCBsb2FkZXJJZCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkZWQgdmVyc2lvbiBvZiB7QGxpbmsKKyAgICAgKiAjZ2V0Q2xhc3NMb2FkZXJGb3JQYXRoKFByb2plY3QsIFBhdGgsIFN0cmluZywgYm9vbGVhbiwgYm9vbGVhbil9LgorICAgICAqCisgICAgICogPHA+U2V0cyB2YWx1ZSBmb3IgJ3JldXNlTG9hZGVyJyB0byB0cnVlIGlmIHRoZSBtYWdpYyBwcm9wZXJ0eQorICAgICAqIGhhcyBiZWVuIHNldC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdAorICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCisgICAgICogQHBhcmFtIGxvYWRlcklkIHRoZSBsb2FkZXIgaWQgc3RyaW5nCisgICAgICogQHBhcmFtIHJldmVyc2VMb2FkZXIgaWYgc2V0IHRvIHRydWUgdGhpcyBuZXcgbG9hZGVyIHdpbGwgdGFrZQorICAgICAqIHByZWNlZGVuY2Ugb3ZlciBpdHMgcGFyZW50ICh3aGljaCBpcyBjb250cmEgdGhlIHJlZ3VsYXIKKyAgICAgKiBjbGFzc2xvYWRlciBiZWhhdmlvdXIpCisgICAgICogQHJldHVybiBUaGUgY2xhc3MgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlckZvclBhdGgoCisgICAgICAgICAgICBQcm9qZWN0IHAsIFBhdGggcGF0aCwgU3RyaW5nIGxvYWRlcklkLCBib29sZWFuIHJldmVyc2VMb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzTG9hZGVyRm9yUGF0aChwLCBwYXRoLCBsb2FkZXJJZCwgcmV2ZXJzZUxvYWRlciwgaXNNYWdpY1Byb3BlcnR5U2V0KHApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgY2xhc3Nsb2FkZXIgdGhhdCBsb2FkcyBjbGFzc2VzIGZyb20gdGhlIGNsYXNzcGF0aAorICAgICAqIGRlZmluZWQgaW4gdGhlIHBhdGggYXJndW1lbnQuCisgICAgICoKKyAgICAgKiA8cD5CYXNlZCBvbiB0aGUgc2V0dGluZyBvZiB0aGUgbWFnaWMgcHJvcGVydHkKKyAgICAgKiAnYW50LnJldXNlLmxvYWRlcicgdGhpcyB3aWxsIHRyeSB0byByZXVzZSB0aGUgcHJldmlvdXNseQorICAgICAqIGNyZWF0ZWQgbG9hZGVyIHdpdGggdGhhdCBpZCwgYW5kIG9mIGNvdXJzZSBzdG9yZSBpdCB0aGVyZSB1cG9uCisgICAgICogY3JlYXRpb24uPC9wPgorICAgICAqIEBwYXJhbSBwICAgICAgICAgICAgIEFudCBQcm9qZWN0IHdoZXJlIHRoZSBoYW5kbGVkIGNvbXBvbmVudHMgYXJlIGxpdmluZyBpbi4KKyAgICAgKiBAcGFyYW0gcGF0aCAgICAgICAgICBQYXRoIG9iamVjdCB0byBiZSB1c2VkIGFzIGNsYXNzcGF0aCBmb3IgdGhpcyBjbGFzc2xvYWRlcgorICAgICAqIEBwYXJhbSBsb2FkZXJJZCAgICAgIGlkZW50aWZpY2F0aW9uIGZvciB0aGlzIExvYWRlciwKKyAgICAgKiBAcGFyYW0gcmV2ZXJzZUxvYWRlciBpZiBzZXQgdG8gdHJ1ZSB0aGlzIG5ldyBsb2FkZXIgd2lsbCB0YWtlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZSBvdmVyIGl0cyBwYXJlbnQgKHdoaWNoIGlzIGNvbnRyYSB0aGUgcmVndWxhcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbG9hZGVyIGJlaGF2aW91cikKKyAgICAgKiBAcGFyYW0gcmV1c2VMb2FkZXIgICBpZiB0cnVlIHJldXNlIHRoZSBsb2FkZXIgaWYgaXQgaXMgZm91bmQKKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICBDbGFzc0xvYWRlciB0aGF0IHVzZXMgdGhlIFBhdGggYXMgaXRzIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyRm9yUGF0aCgKKyAgICAgICAgICAgIFByb2plY3QgcCwgUGF0aCBwYXRoLCBTdHJpbmcgbG9hZGVySWQsIGJvb2xlYW4gcmV2ZXJzZUxvYWRlciwgYm9vbGVhbiByZXVzZUxvYWRlcikgeworICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7CisKKyAgICAgICAgLy8gbWFnaWMgcHJvcGVydHkKKyAgICAgICAgaWYgKGxvYWRlcklkICE9IG51bGwgJiYgcmV1c2VMb2FkZXIpIHsKKyAgICAgICAgICAgIE9iamVjdCByZXVzZWRMb2FkZXIgPSBwLmdldFJlZmVyZW5jZShsb2FkZXJJZCk7CisgICAgICAgICAgICBpZiAocmV1c2VkTG9hZGVyICE9IG51bGwgJiYgIShyZXVzZWRMb2FkZXIgaW5zdGFuY2VvZiBDbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBzcGVjaWZpZWQgbG9hZGVyIGlkICIgKyBsb2FkZXJJZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IHJlZmVyZW5jZSBhIGNsYXNzIGxvYWRlciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpIHJldXNlZExvYWRlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2wgPT0gbnVsbCkgeworICAgICAgICAgICAgY2wgPSBnZXRVbmlxdWVDbGFzc0xvYWRlckZvclBhdGgocCwgcGF0aCwgcmV2ZXJzZUxvYWRlcik7CisgICAgICAgICAgICBpZiAobG9hZGVySWQgIT0gbnVsbCAmJiByZXVzZUxvYWRlcikgeworICAgICAgICAgICAgICAgIHAuYWRkUmVmZXJlbmNlKGxvYWRlcklkLCBjbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBmcmVzaCwgZGlmZmVyZW50LCBwcmV2aW91c2x5IHVudXNlZCBjbGFzc2xvYWRlciB0aGF0IHVzZXMgdGhlCisgICAgICogcGFzc2VkIHBhdGggYXMgaXRzIGNsYXNzcGF0aC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGNvbXBsZXRlbHkgaWdub3JlcyB0aGUgYW50LnJldXNlLmxvYWRlciBtYWdpYworICAgICAqIHByb3BlcnR5IGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoIGNhdXRpb24uPC9wPgorICAgICAqIEBwYXJhbSBwICAgICAgICAgICAgIEFudCBQcm9qZWN0IHdoZXJlIHRoZSBoYW5kbGVkIGNvbXBvbmVudHMgYXJlIGxpdmluZyBpbi4KKyAgICAgKiBAcGFyYW0gcGF0aCAgICAgICAgICB0aGUgY2xhc3NwYXRoIGZvciB0aGlzIGxvYWRlcgorICAgICAqIEBwYXJhbSByZXZlcnNlTG9hZGVyIGlmIHNldCB0byB0cnVlIHRoaXMgbmV3IGxvYWRlciB3aWxsIHRha2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcmVjZWRlbmNlIG92ZXIgaXRzIHBhcmVudCAod2hpY2ggaXMgY29udHJhIHRoZSByZWd1bGFyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY2xhc3Nsb2FkZXIgYmVoYXZpb3VyKQorICAgICAqIEByZXR1cm4gVGhlIGZyZXNoLCBkaWZmZXJlbnQsIHByZXZpb3VzbHkgdW51c2VkIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGdldFVuaXF1ZUNsYXNzTG9hZGVyRm9yUGF0aChQcm9qZWN0IHAsIFBhdGggcGF0aCwKKyAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZUxvYWRlcikgeworICAgICAgICBBbnRDbGFzc0xvYWRlciBhY2wgPSBwLmNyZWF0ZUNsYXNzTG9hZGVyKHBhdGgpOworICAgICAgICBpZiAocmV2ZXJzZUxvYWRlcikgeworICAgICAgICAgICAgYWNsLnNldFBhcmVudEZpcnN0KGZhbHNlKTsKKyAgICAgICAgICAgIGFjbC5hZGRKYXZhTGlicmFyaWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnJlc2ggb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3NuYW1lLgorICAgICAqCisgICAgICogPHA+IFRoaXMgdXNlcyB0aGUgdXNlckRlZmluZWRMb2FkZXIgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIGNsYXNzLAorICAgICAqIGFuZCB0aGVuIG1ha2VzIGFuIGluc3RhbmNlIHVzaW5nIHRoZSBkZWZhdWx0IG5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gbG9hZC4KKyAgICAgKiBAcGFyYW0gdXNlckRlZmluZWRMb2FkZXIgdGhlIGNsYXNzbG9hZGVyIHRvIHVzZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBmcmVzaCBvYmplY3QgaW5zdGFuY2UKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHdoZW4gbG9hZGluZyBvciBpbnN0YW50aWF0aW9uIGZhaWxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciB1c2VyRGVmaW5lZExvYWRlcikgeworICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCB1c2VyRGVmaW5lZExvYWRlciwgT2JqZWN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnJlc2ggb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3NuYW1lLgorICAgICAqCisgICAgICogPHA+IFRoaXMgdXNlcyB0aGUgdXNlckRlZmluZWRMb2FkZXIgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIGNsYXNzLAorICAgICAqIGFuZCB0aGVuIG1ha2VzIGFuIGluc3RhbmNlIHVzaW5nIHRoZSBkZWZhdWx0IG5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGZ1bGwgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdG8gbG9hZC4KKyAgICAgKiBAcGFyYW0gdXNlckRlZmluZWRMb2FkZXIgdGhlIGNsYXNzbG9hZGVyIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIHRoZSBDbGFzcyB0aGF0IHRoZSByZXN1bHQgc2hvdWxkIGJlIGFzc2lnbm1lbnQKKyAgICAgKiBjb21wYXRpYmxlIHdpdGguIChObyBDbGFzc0Nhc3RFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaW4gY2FzZQorICAgICAqIHRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgY2FzdGVkIHRvIHRoZSBleHBlY3RlZFR5cGUpCisgICAgICogQHJldHVybiBUaGUgZnJlc2ggb2JqZWN0IGluc3RhbmNlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgb3IgaW5zdGFudGlhdGlvbiBmYWlsZWQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciB1c2VyRGVmaW5lZExvYWRlciwKKyAgICAgICAgICAgIENsYXNzIGV4cGVjdGVkVHlwZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgdXNlckRlZmluZWRMb2FkZXIpOworICAgICAgICAgICAgT2JqZWN0IG8gPSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgaWYgKCFleHBlY3RlZFR5cGUuaXNJbnN0YW5jZShvKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2xhc3Mgb2YgdW5leHBlY3RlZCBUeXBlOiAiICsgY2xhc3NOYW1lICsgIiBleHBlY3RlZCA6IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBlY3RlZFR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDbGFzcyBub3QgZm91bmQ6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGluc3RhbnRpYXRlICIgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLiBTcGVjaWZpZWQgY2xhc3Mgc2hvdWxkIGhhdmUgYSBubyAiICsgImFyZ3VtZW50IGNvbnN0cnVjdG9yLiIsIGUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGluc3RhbnRpYXRlICIgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLiBTcGVjaWZpZWQgY2xhc3Mgc2hvdWxkIGhhdmUgYSAiICsgInB1YmxpYyBjb25zdHJ1Y3Rvci4iLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2xhc3MgIiArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICArICIgY291bGQgbm90IGJlIGxvYWRlZCBiZWNhdXNlIG9mIGFuIGludmFsaWQgZGVwZW5kZW5jeS4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9idGFpbnMgYSBkZWxlZ2F0ZSB0aGF0IGhlbHBzIG91dCB3aXRoIGNsYXNzaWMgY2xhc3NwYXRoIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50IHlvdXIgcHJvamVjdENvbXBvbmVudCB0aGF0IG5lZWRzIHRoZSBhc3Npc3RlbmNlCisgICAgICogQHJldHVybiB0aGUgaGVscGVyLCBkZWxlZ2F0ZS4KKyAgICAgKiBAc2VlIENsYXNzcGF0aFV0aWxzLkRlbGVnYXRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEZWxlZ2F0ZSBnZXREZWxlZ2F0ZShQcm9qZWN0Q29tcG9uZW50IGNvbXBvbmVudCkgeworICAgICAgICByZXR1cm4gbmV3IERlbGVnYXRlKGNvbXBvbmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGZvciB0aGUgbWFnaWMgcHJvcGVydHkgdGhhdCBlbmFibGVzIGNsYXNzIGxvYWRlciByZXVzZQorICAgICAqIGZvciA8dGFza2RlZj4gYW5kIDx0eXBlZGVmPiBpbiBBbnQgMS41IGFuZCBlYXJsaWVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNYWdpY1Byb3BlcnR5U2V0KFByb2plY3QgcCkgeworICAgICAgICByZXR1cm4gcC5nZXRQcm9wZXJ0eShSRVVTRV9MT0FERVJfUkVGKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlIHRoYXQgaGVscHMgb3V0IGFueSBzcGVjaWZpYyBQcm9qZWN0Q29tcG9uZW50IHRoYXQgbmVlZHMKKyAgICAgKiBkeW5hbWljIGNsYXNzbG9hZGluZy4KKyAgICAgKgorICAgICAqIDxwPkFudCBQcm9qZWN0Q29tcG9uZW50cyB0aGF0IG5lZWQgYSB0byBiZSBhYmxlIHRvIGR5bmFtaWNhbGx5IGxvYWQKKyAgICAgKiBDbGFzc2VzIGFuZCBpbnN0YW50aWF0ZSB0aGVtIG9mdGVuIGV4cG9zZSB0aGUgZm9sbG93aW5nIGFudCBzeW50YXgKKyAgICAgKiBzdWdhcjogPC9wPgorICAgICAqCisgICAgICogPHVsPjxsaT4gbmVzdGVkICZsdDtjbGFzc3BhdGgmZ3Q7IDwvbGk+CisgICAgICogPGxpPiBhdHRyaWJ1dGUgQGNsYXNzcGF0aHJlZiA8L2xpPgorICAgICAqIDxsaT4gYXR0cmlidXRlIEBjbGFzc25hbWUgPC9saT48L3VsPgorICAgICAqCisgICAgICogPHA+IFRoaXMgY2xhc3MgZnVuY3Rpb25zIGFzIGEgZGVsZWdhdGUgaGFuZGxpbmcgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBpc3N1ZXMgZm9yIHRoaXMgcmVjdXJyaW5nIHBhdHRlcm4uICBJdHMgdXNhZ2UgcGF0dGVybiwgYXMgdGhlIG5hbWUKKyAgICAgKiBzdWdnZXN0cywgaXMgZGVsZWdhdGlvbiByYXRoZXIgdGhhbiBpbmhlcml0YW5jZS4gPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlbGVnYXRlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29tcG9uZW50IGNvbXBvbmVudDsKKyAgICAgICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NwYXRoSWQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbG9hZGVySWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiByZXZlcnNlTG9hZGVyID0gZmFsc2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdCBhIERlbGVnYXRlCisgICAgICAgICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIFByb2plY3RDb21wb25lbnQgdGhpcyBkZWxlZ2F0ZSBpcyBmb3IuCisgICAgICAgICAqLworICAgICAgICBEZWxlZ2F0ZShQcm9qZWN0Q29tcG9uZW50IGNvbXBvbmVudCkgeworICAgICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgYSBEZWxlZ2F0ZSBtZXRob2QgaGFuZGxpbmcgdGhlIEBjbGFzc3BhdGggYXR0cmlidXRlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UaGlzIGF0dHJpYnV0ZSBjYW4gc2V0IGEgcGF0aCB0byBhZGQgdG8gdGhlIGNsYXNzcGF0aC48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGFzc3BhdGggdGhlIHBhdGggdG8gdXNlIGZvciB0aGUgY2xhc3NwYXRoLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWxlZ2F0ZSBtZXRob2QgaGFuZGxpbmcgdGhlICZsdDtjbGFzc3BhdGgmZ3Q7IHRhZy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VGhpcyBuZXN0ZWQgcGF0aC1saWtlIHN0cnVjdHVyZSBjYW4gc2V0IGEgcGF0aCB0byBhZGQgdG8gdGhlCisgICAgICAgICAqIGNsYXNzcGF0aC48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgcGF0aC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVsZWdhdGUgbWV0aG9kIGhhbmRsaW5nIHRoZSBAY2xhc3NuYW1lIGF0dHJpYnV0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VGhpcyBhdHRyaWJ1dGUgc2V0cyB0aGUgZnVsbCBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MKKyAgICAgICAgICogdG8gbG9hZCBhbmQgaW5zdGFudGlhdGUuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmNxbiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gbG9hZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgZmNxbikgeworICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBmY3FuOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlbGVnYXRlIG1ldGhvZCBoYW5kbGluZyB0aGUgQGNsYXNzcGF0aHJlZiBhdHRyaWJ1dGUuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRoaXMgYXR0cmlidXRlIGNhbiBhZGQgYSByZWZlcmVuY2VkIHBhdGgtbGlrZSBzdHJ1Y3R1cmUgdG8gdGhlCisgICAgICAgICAqIGNsYXNzcGF0aC48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aHJlZihSZWZlcmVuY2UgcikgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGhJZCA9IHIuZ2V0UmVmSWQoKTsKKyAgICAgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlbGVnYXRlIG1ldGhvZCBoYW5kbGluZyB0aGUgQHJldmVyc2VMb2FkZXIgYXR0cmlidXRlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UaGlzIGF0dHJpYnV0ZSBjYW4gc2V0IGEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZWQKKyAgICAgICAgICogY2xhc3Nsb2FkZXIgc2hvdWxkIE5PVCBmb2xsb3cgdGhlIGNsYXNzaWNhbCBwYXJlbnQtZmlyc3Qgc2NoZW1lLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPkJ5IGRlZmF1bHQgdGhpcyBpcyBzdXBwb3NlZCB0byBiZSBmYWxzZS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPkNhdXRpb246IHRoaXMgYmVoYXZpb3VyIGlzIGNvbnRyYWRpY3RvcnkgdG8gdGhlIG5vcm1hbCB3YXkKKyAgICAgICAgICogY2xhc3Nsb2FkZXJzIHdvcmsuICBEbyBub3QgbGV0IHlvdXIgUHJvamVjdENvbXBvbmVudCB1c2UgaXQgaWYKKyAgICAgICAgICogeW91IGFyZSBub3QgcmVhbGx5IHN1cmUuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmV2ZXJzZUxvYWRlciBpZiB0cnVlIHJldmVyc2UgdGhlIG9yZGVyIG9mIGxvb2tpbmcgdXAgYSBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJldmVyc2VMb2FkZXIoYm9vbGVhbiByZXZlcnNlTG9hZGVyKSB7CisgICAgICAgICAgICB0aGlzLnJldmVyc2VMb2FkZXIgPSByZXZlcnNlTG9hZGVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGxvYWRlclJlZi4KKyAgICAgICAgICogQHBhcmFtIHIgdGhlIHJlZmVyZW5jZSB0byB0aGUgbG9hZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0TG9hZGVyUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgICAgICB0aGlzLmxvYWRlcklkID0gci5nZXRSZWZJZCgpOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogRmluZHMgb3IgY3JlYXRlcyB0aGUgY2xhc3Nsb2FkZXIgZm9yIHRoaXMgb2JqZWN0LgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBjbGFzcyBsb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NMb2FkZXJGb3JQYXRoKGdldENvbnRleHRQcm9qZWN0KCksIGNsYXNzcGF0aCwgZ2V0Q2xhc3NMb2FkSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZUxvYWRlciwgbG9hZGVySWQgIT0gbnVsbCB8fCBpc01hZ2ljUHJvcGVydHlTZXQoZ2V0Q29udGV4dFByb2plY3QoKSkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwcm9qZWN0IG9mIHRoZSBQcm9qZWN0Q29tcG9uZW50IHdlIGFyZSB3b3JraW5nIGZvci4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgUHJvamVjdCBnZXRDb250ZXh0UHJvamVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0UHJvamVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXB1dGVzIHRoZSBsb2FkZXJJZCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcG9uZW50LgorICAgICAgICAgKiBAcmV0dXJuIGEgbG9hZGVyIGlkZW50aWZpZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTG9hZElkKCkgeworICAgICAgICAgICAgaWYgKGxvYWRlcklkID09IG51bGwgJiYgY2xhc3NwYXRoSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBNYWdpY05hbWVzLlJFRklEX0NMQVNTUEFUSF9MT0FERVJfUFJFRklYICsgY2xhc3NwYXRoSWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXJJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBIZWxwZXIgbWV0aG9kIG9idGFpbmluZyBhIGZyZXNoIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBzcGVjaWZpZWQKKyAgICAgICAgICogaW4gdGhlIEBjbGFzc25hbWUgYW5kIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBmcmVzaCBpbnN0YW50aWF0ZWQgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZSh0aGlzLmNsYXNzTmFtZSwgZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNsYXNzcGF0aC4KKyAgICAgICAgICogQHJldHVybiB0aGUgY2xhc3NwYXRoLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHJldmVyc2VMb2FkZXIgc2V0dGluZy4KKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIGxvb2tpbmcgdXAgaW4gcmV2ZXJzZSBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZUxvYWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiByZXZlcnNlTG9hZGVyOworICAgICAgICB9CisKKyAgICAgICAgLy9UT0RPIG5vIG1ldGhvZHMgeWV0IGZvciBnZXRDbGFzc25hbWUKKyAgICAgICAgLy9UT0RPIG5vIG1ldGhvZCBmb3IgbmV3SW5zdGFuY2UgdXNpbmcgYSByZXZlcnNlLWNsYXNzbG9hZGVyCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db2xsZWN0aW9uVXRpbHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29sbGVjdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4Y2YxZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29sbGVjdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLy8gQ2hlY2tTdHlsZTpIaWRlVXRpbGl0eUNsYXNzQ29uc3RydWN0b3JDaGVjayBPRkYgLSBiYworCisvKioKKyAqIEEgc2V0IG9mIGhlbHBlciBtZXRob2RzIHJlbGF0ZWQgdG8gY29sbGVjdGlvbiBtYW5pcHVsYXRpb24uCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIENvbGxlY3Rpb25VdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBQbGVhc2UgdXNlIFZlY3Rvci5lcXVhbHMoKSBvciBMaXN0LmVxdWFscygpLgorICAgICAqIEBwYXJhbSB2MSB0aGUgZmlyc3QgdmVjdG9yLgorICAgICAqIEBwYXJhbSB2MiB0aGUgc2Vjb25kIHZlY3Rvci4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhWZWN0b3IgdjEsIFZlY3RvciB2MikgeworICAgICAgICBpZiAodjEgPT0gdjIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHYxID09IG51bGwgfHwgdjIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHYxLmVxdWFscyh2Mik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGljdGlvbmFyeSBkb2VzIG5vdCBoYXZlIGFuIGVxdWFscy4KKyAgICAgKiBQbGVhc2UgdXNlICBNYXAuZXF1YWxzKCkuCisgICAgICoKKyAgICAgKiA8cD5Gb2xsb3dzIHRoZSBlcXVhbHMgY29udHJhY3Qgb2YgSmF2YSAyJ3MgTWFwLjwvcD4KKyAgICAgKiBAcGFyYW0gZDEgdGhlIGZpcnN0IGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gZDIgdGhlIHNlY29uZCBkaXJlY3RvcnkuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkaXJlY3RvcmllcyBhcmUgZXF1YWwuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKERpY3Rpb25hcnkgZDEsIERpY3Rpb25hcnkgZDIpIHsKKyAgICAgICAgaWYgKGQxID09IGQyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkMSA9PSBudWxsIHx8IGQyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkMS5zaXplKCkgIT0gZDIuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBFbnVtZXJhdGlvbiBlMSA9IGQxLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKGUxLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBPYmplY3Qga2V5ID0gZTEubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZTEgPSBkMS5nZXQoa2V5KTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZTIgPSBkMi5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZTIgPT0gbnVsbCB8fCAhdmFsdWUxLmVxdWFscyh2YWx1ZTIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZG9uJ3QgbmVlZCB0aGUgb3Bwb3NpdGUgY2hlY2sgYXMgdGhlIERpY3Rpb25hcmllcyBoYXZlIHRoZQorICAgICAgICAvLyBzYW1lIHNpemUsIHNvIHdlJ3ZlIGFsc28gY292ZXJlZCBhbGwga2V5cyBvZiBkMiBhbHJlYWR5LgorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpY3Rpb25hcnkgZG9lcyBub3Qga25vdyB0aGUgcHV0QWxsIG1ldGhvZC4gUGxlYXNlIHVzZSBNYXAucHV0QWxsKCkuCisgICAgICogQHBhcmFtIG0xIHRoZSB0byBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIG0yIHRoZSBmcm9tIGRpcmVjdG9yeS4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRBbGwoRGljdGlvbmFyeSBtMSwgRGljdGlvbmFyeSBtMikgeworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGl0ID0gbTIua2V5cygpOyBpdC5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgbTEucHV0KGtleSwgbTIuZ2V0KGtleSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gZW1wdHkgZW51bWVyYXRpb24uCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVtcHR5RW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CisgICAgICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgdGhlIEVtcHR5RW51bWVyYXRpb24gKi8KKyAgICAgICAgcHVibGljIEVtcHR5RW51bWVyYXRpb24oKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBmYWxzZSBhbHdheXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBub3RoaW5nLgorICAgICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gYWx3YXlzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgb25lIGVudW1lcmF0aW9uIHRvIGFub3RoZXIuCisgICAgICogRWxlbWVudHMgYXJlIGV2YWx1YXRlZCBsYXppbHkuCisgICAgICogQHBhcmFtIGUxIHRoZSBmaXJzdCBlbnVtZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gZTIgdGhlIHN1YnNlcXVlbnQgZW51bWVyYXRpb24uCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiByZXByZXNlbnRpbmcgZTEgZm9sbG93ZWQgYnkgZTIuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gYXBwZW5kKEVudW1lcmF0aW9uIGUxLCBFbnVtZXJhdGlvbiBlMikgeworICAgICAgICByZXR1cm4gbmV3IENvbXBvdW5kRW51bWVyYXRpb24oZTEsIGUyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIEl0ZXJhdG9yIHRvIHRoZSBFbnVtZXJhdGlvbiBpbnRlcmZhY2UuCisgICAgICogQHBhcmFtIGl0ZXIgdGhlIEl0ZXJhdG9yIHRvIGFkYXB0LgorICAgICAqIEByZXR1cm4gYW4gRW51bWVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBhc0VudW1lcmF0aW9uKGZpbmFsIEl0ZXJhdG9yIGl0ZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlci5oYXNOZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIEVudW1lcmF0aW9uIHRvIHRoZSBJdGVyYXRvciBpbnRlcmZhY2UuCisgICAgICogQHBhcmFtIGUgdGhlIEVudW1lcmF0aW9uIHRvIGFkYXB0LgorICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBhc0l0ZXJhdG9yKGZpbmFsIEVudW1lcmF0aW9uIGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21wb3VuZEVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24geworCisgICAgICAgIHByaXZhdGUgZmluYWwgRW51bWVyYXRpb24gZTEsIGUyOworCisgICAgICAgIHB1YmxpYyBDb21wb3VuZEVudW1lcmF0aW9uKEVudW1lcmF0aW9uIGUxLCBFbnVtZXJhdGlvbiBlMikgeworICAgICAgICAgICAgdGhpcy5lMSA9IGUxOworICAgICAgICAgICAgdGhpcy5lMiA9IGUyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIGUxLmhhc01vcmVFbGVtZW50cygpIHx8IGUyLmhhc01vcmVFbGVtZW50cygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChlMS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlMS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZTIubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbXBvc2l0ZU1hcHBlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db21wb3NpdGVNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OGY3MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db21wb3NpdGVNYXBwZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBBIDxDT0RFPkNvbnRhaW5lck1hcHBlcjwvQ09ERT4gdGhhdCB1bml0ZXMgdGhlIHJlc3VsdHMgb2YgaXRzIGNvbnN0aXR1ZW50CisgKiA8Q09ERT5GaWxlTmFtZU1hcHBlcjwvQ09ERT5zIGludG8gYSBzaW5nbGUgc2V0IG9mIHJlc3VsdCBmaWxlbmFtZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wb3NpdGVNYXBwZXIgZXh0ZW5kcyBDb250YWluZXJNYXBwZXIgeworCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgeworICAgICAgICBIYXNoU2V0IHJlc3VsdHMgPSBuZXcgSGFzaFNldCgpOworCisgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IG51bGw7CisgICAgICAgIGZvciAoSXRlcmF0b3IgbUl0ZXIgPSBnZXRNYXBwZXJzKCkuaXRlcmF0b3IoKTsgbUl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgbWFwcGVyID0gKEZpbGVOYW1lTWFwcGVyKSAobUl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIG1hcHBlZCA9IG1hcHBlci5tYXBGaWxlTmFtZShzb3VyY2VGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1hcHBlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkQWxsKEFycmF5cy5hc0xpc3QobWFwcGVkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVzdWx0cy5zaXplKCkgPT0gMCkgPyBudWxsCisgICAgICAgICAgICA6IChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db25jYXRGaWxlSW5wdXRTdHJlYW0uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29uY2F0RmlsZUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Q1MDk4NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29uY2F0RmlsZUlucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworLyoqCisgKiBTcGVjaWFsIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB0aGF0IHdpbGwKKyAqIGNvbmNhdGVuYXRlIHRoZSBjb250ZW50cyBvZiBhbiBhcnJheSBvZiBmaWxlcy4KKyAqLworcHVibGljIGNsYXNzIENvbmNhdEZpbGVJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFT0YgPSAtMTsKKyAgICBwcml2YXRlIGludCBjdXJyZW50SW5kZXggPSAtMTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZW9mID0gZmFsc2U7CisgICAgcHJpdmF0ZSBGaWxlW10gZmlsZTsKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGN1cnJlbnRTdHJlYW07CisgICAgcHJpdmF0ZSBQcm9qZWN0Q29tcG9uZW50IG1hbmFnaW5nUGM7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5Db25jYXRGaWxlSW5wdXRTdHJlYW08L2NvZGU+CisgICAqIHdpdGggdGhlIHNwZWNpZmllZCA8Y29kZT5GaWxlW108L2NvZGU+LgorICAgKiBAcGFyYW0gZmlsZSAgIDxjb2RlPkZpbGVbXTwvY29kZT4uCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgSS9PIGVycm9ycyBvY2N1ci4KKyAgICovCisgICAgcHVibGljIENvbmNhdEZpbGVJbnB1dFN0cmVhbShGaWxlW10gZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbG9zZUN1cnJlbnQoKTsKKyAgICAgICAgZW9mID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgYnl0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlICgwIC0gMjU1KSBvciAtMSBpZiB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCByZXN1bHQgPSByZWFkQ3VycmVudCgpOworICAgICAgICBpZiAocmVzdWx0ID09IEVPRiAmJiAhZW9mKSB7CisgICAgICAgICAgICBvcGVuRmlsZSgrK2N1cnJlbnRJbmRleCk7CisgICAgICAgICAgICByZXN1bHQgPSByZWFkQ3VycmVudCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbWFuYWdpbmcgPGNvZGU+VGFzazwvY29kZT4gZm9yCisgICAgICogdGhpcyA8Y29kZT5Db25jYXRGaWxlSW5wdXRTdHJlYW08L2NvZGU+LgorICAgICAqIEBwYXJhbSB0YXNrICAgdGhlIG1hbmFnaW5nIDxjb2RlPlRhc2s8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hbmFnaW5nVGFzayhUYXNrIHRhc2spIHsKKyAgICAgICAgc2V0TWFuYWdpbmdDb21wb25lbnQodGFzayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbWFuYWdpbmcgPGNvZGU+VGFzazwvY29kZT4gZm9yCisgICAgICogdGhpcyA8Y29kZT5Db25jYXRGaWxlSW5wdXRTdHJlYW08L2NvZGU+LgorICAgICAqIEBwYXJhbSBwYyB0aGUgbWFuYWdpbmcgPGNvZGU+VGFzazwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdpbmdDb21wb25lbnQoUHJvamVjdENvbXBvbmVudCBwYykgeworICAgICAgICB0aGlzLm1hbmFnaW5nUGMgPSBwYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgYSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBsb2dnaW5nIGxldmVsLgorICAgICAqIEBwYXJhbSBtZXNzYWdlICAgIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGxvZ2xldmVsICAgdGhlIDxjb2RlPmludDwvY29kZT4gbG9nZ2luZyBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIGludCBsb2dsZXZlbCkgeworICAgICAgICBpZiAobWFuYWdpbmdQYyAhPSBudWxsKSB7CisgICAgICAgICAgICBtYW5hZ2luZ1BjLmxvZyhtZXNzYWdlLCBsb2dsZXZlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobG9nbGV2ZWwgPiBQcm9qZWN0Lk1TR19XQVJOKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZWFkQ3VycmVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoZW9mIHx8IGN1cnJlbnRTdHJlYW0gPT0gbnVsbCkgPyBFT0YgOiBjdXJyZW50U3RyZWFtLnJlYWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb3BlbkZpbGUoaW50IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbG9zZUN1cnJlbnQoKTsKKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBpbmRleCA8IGZpbGUubGVuZ3RoKSB7CisgICAgICAgICAgICBsb2coIk9wZW5pbmcgIiArIGZpbGVbaW5kZXhdLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY3VycmVudFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVbaW5kZXhdKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleWVPaEV4KSB7CisgICAgICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gb3BlbiAiICsgZmlsZVtpbmRleF0sIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgdGhyb3cgZXllT2hFeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVvZiA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xvc2VDdXJyZW50KCkgeworICAgICAgICBGaWxlVXRpbHMuY2xvc2UoY3VycmVudFN0cmVhbSk7CisgICAgICAgIGN1cnJlbnRTdHJlYW0gPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29uY2F0UmVzb3VyY2VJbnB1dFN0cmVhbS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db25jYXRSZXNvdXJjZUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOThiNjEzYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29uY2F0UmVzb3VyY2VJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKKworLyoqCisgKiBTcGVjaWFsIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB0aGF0IHdpbGwKKyAqIGNvbmNhdGVuYXRlIHRoZSBjb250ZW50cyBvZiBSZXNvdXJjZXMgZnJvbSBhIHNpbmdsZSBSZXNvdXJjZUNvbGxlY3Rpb24uCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgQ29uY2F0UmVzb3VyY2VJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFT0YgPSAtMTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZW9mID0gZmFsc2U7CisgICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyOworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gY3VycmVudFN0cmVhbTsKKyAgICBwcml2YXRlIFByb2plY3RDb21wb25lbnQgbWFuYWdpbmdQYzsKKyAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlRXJyb3JzID0gZmFsc2U7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIG5ldyBDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtCisgICAqIGZvciB0aGUgc3BlY2lmaWVkIFJlc291cmNlQ29sbGVjdGlvbi4KKyAgICogQHBhcmFtIHJjIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gdG8gY29tYmluZS4KKyAgICovCisgICAgcHVibGljIENvbmNhdFJlc291cmNlSW5wdXRTdHJlYW0oUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CisgICAgICAgIGl0ZXIgPSByYy5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoaXMgQ29uY2F0UmVzb3VyY2VJbnB1dFN0cmVhbSBpZ25vcmVzIGVycm9ycy4KKyAgICAgKiBAcGFyYW0gYiB3aGV0aGVyIHRvIGlnbm9yZSBlcnJvcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlRXJyb3JzKGJvb2xlYW4gYikgeworICAgICAgICBpZ25vcmVFcnJvcnMgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgb3V0IHdoZXRoZXIgdGhpcyBDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtIGlnbm9yZXMgZXJyb3JzLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBpZ25vcmUtZXJyb3JzIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmVFcnJvcnMoKSB7CisgICAgICAgIHJldHVybiBpZ25vcmVFcnJvcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNsb3NlQ3VycmVudCgpOworICAgICAgICBlb2YgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBieXRlLgorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgKDAgLSAyNTUpIG9yIC0xIGlmIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGVvZikgeworICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgICAgfQorICAgICAgICBpbnQgcmVzdWx0ID0gcmVhZEN1cnJlbnQoKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFT0YpIHsKKyAgICAgICAgICAgIG5leHRSZXNvdXJjZSgpOworICAgICAgICAgICAgcmVzdWx0ID0gcmVhZEN1cnJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIG1hbmFnaW5nIDxjb2RlPlByb2plY3RDb21wb25lbnQ8L2NvZGU+IGZvcgorICAgICAqIHRoaXMgPGNvZGU+Q29uY2F0UmVzb3VyY2VJbnB1dFN0cmVhbTwvY29kZT4uCisgICAgICogQHBhcmFtIHBjICAgdGhlIG1hbmFnaW5nIDxjb2RlPlByb2plY3RDb21wb25lbnQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hbmFnaW5nQ29tcG9uZW50KFByb2plY3RDb21wb25lbnQgcGMpIHsKKyAgICAgICAgdGhpcy5tYW5hZ2luZ1BjID0gcGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZSB3aXRoIHRoZSBzcGVjaWZpZWQgbG9nZ2luZyBsZXZlbC4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAgICB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBsb2dsZXZlbCAgIHRoZSA8Y29kZT5pbnQ8L2NvZGU+IGxvZ2dpbmcgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBpbnQgbG9nbGV2ZWwpIHsKKyAgICAgICAgaWYgKG1hbmFnaW5nUGMgIT0gbnVsbCkgeworICAgICAgICAgICAgbWFuYWdpbmdQYy5sb2cobWVzc2FnZSwgbG9nbGV2ZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKGxvZ2xldmVsID4gUHJvamVjdC5NU0dfV0FSTiA/IFN5c3RlbS5vdXQgOiBTeXN0ZW0uZXJyKS5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmVhZEN1cnJlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW9mIHx8IGN1cnJlbnRTdHJlYW0gPT0gbnVsbCA/IEVPRiA6IGN1cnJlbnRTdHJlYW0ucmVhZCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBuZXh0UmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbG9zZUN1cnJlbnQoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBSZXNvdXJjZSByID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghci5pc0V4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIkNvbmNhdGluZyAiICsgci50b0xvbmdTdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV5ZU9oRXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZUVycm9ycykgeworICAgICAgICAgICAgICAgICAgICBsb2coIkZhaWxlZCB0byBnZXQgaW5wdXQgc3RyZWFtIGZvciAiICsgciwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXllT2hFeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZW9mID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xvc2VDdXJyZW50KCkgeworICAgICAgICBGaWxlVXRpbHMuY2xvc2UoY3VycmVudFN0cmVhbSk7CisgICAgICAgIGN1cnJlbnRTdHJlYW0gPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29udGFpbmVyTWFwcGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbnRhaW5lck1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0N2Y0MjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbnRhaW5lck1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7CisKKy8qKgorICogQSA8Y29kZT5GaWxlTmFtZU1hcHBlcjwvY29kZT4gdGhhdCBjb250YWlucworICogb3RoZXIgPGNvZGU+RmlsZU5hbWVNYXBwZXI8L2NvZGU+cy4KKyAqIEBzZWUgRmlsZU5hbWVNYXBwZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRhaW5lck1hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKKworICAgIHByaXZhdGUgTGlzdCBtYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgPGNvZGU+TWFwcGVyPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbWFwcGVyIHRoZSA8Y29kZT5NYXBwZXI8L2NvZGU+IHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkTWFwcGVyKE1hcHBlciBtYXBwZXIpIHsKKyAgICAgICAgYWRkKG1hcHBlci5nZXRJbXBsZW1lbnRhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhZGQgY29uZmlndXJlZCB2ZXJzaW9uIG9mIHRoZSBhZGQgbWV0aG9kLgorICAgICAqIFRoaXMgY2xhc3MgdXNlZCB0byBjb250YWluIGFuIGFkZCBtZXRob2QgYW5kIGFuCisgICAgICogYWRkQ29uZmlndXJlZE1hcHBlciBtZXRob2QuIER1ciB0byBvcmRlcmluZywKKyAgICAgKiB0aGUgYWRkIG1ldGhvZCB3YXMgYWx3YXlzIGNhbGxlZCBmaXJzdC4gVGhpcworICAgICAqIGFkZENvbmZpZ3VlZCBtZXRob2QgaGFzIGJlZW4gYWRkZWQgdG8gYWxsb3cKKyAgICAgKiBjaGFpbmluZyB0byB3b3JrIGNvcnJlY3RseS4KKyAgICAgKiBAcGFyYW0gZmlsZU5hbWVNYXBwZXIgYSA8Y29kZT5GaWxlTmFtZU1hcHBlcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChGaWxlTmFtZU1hcHBlciBmaWxlTmFtZU1hcHBlcikgeworICAgICAgICBhZGQoZmlsZU5hbWVNYXBwZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIDxjb2RlPkZpbGVOYW1lTWFwcGVyPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmlsZU5hbWVNYXBwZXIgYSA8Y29kZT5GaWxlTmFtZU1hcHBlcjwvY29kZT4uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYXR0ZW1wdGluZyB0byBhZGQgdGhpcworICAgICAqICAgICAgICAgPGNvZGU+Q29udGFpbmVyTWFwcGVyPC9jb2RlPiB0byBpdHNlbGYsIG9yIGlmIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIDxjb2RlPkZpbGVOYW1lTWFwcGVyPC9jb2RlPiBpcyBpdHNlbGYgYSA8Y29kZT5Db250YWluZXJNYXBwZXI8L2NvZGU+CisgICAgICogICAgICAgICB0aGF0IGNvbnRhaW5zIHRoaXMgPGNvZGU+Q29udGFpbmVyTWFwcGVyPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyKSB7CisgICAgICAgIGlmICh0aGlzID09IGZpbGVOYW1lTWFwcGVyCisgICAgICAgICAgICB8fCAoZmlsZU5hbWVNYXBwZXIgaW5zdGFuY2VvZiBDb250YWluZXJNYXBwZXIKKyAgICAgICAgICAgICYmICgoQ29udGFpbmVyTWFwcGVyKSBmaWxlTmFtZU1hcHBlcikuY29udGFpbnModGhpcykpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDaXJjdWxhciBtYXBwZXIgY29udGFpbm1lbnQgY29uZGl0aW9uIGRldGVjdGVkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXBwZXJzLmFkZChmaWxlTmFtZU1hcHBlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5Db250YWluZXJNYXBwZXI8L2NvZGU+IG9yIGFueSBvZgorICAgICAqIGl0cyBzdWItZWxlbWVudHMgY29udGFpbnMgdGhlIHNwZWNpZmllZCA8Y29kZT5GaWxlTmFtZU1hcHBlcjwvY29kZT4uCisgICAgICogQHBhcmFtIGZpbGVOYW1lTWFwcGVyICAgdGhlIDxjb2RlPkZpbGVOYW1lTWFwcGVyPC9jb2RlPiB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4gPGNvZGU+Ym9vbGVhbjwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zKEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyKSB7CisgICAgICAgIGJvb2xlYW4gZm91bmRpdCA9IGZhbHNlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpICYmICFmb3VuZGl0OykgeworICAgICAgICAgICAgRmlsZU5hbWVNYXBwZXIgbmV4dCA9IChGaWxlTmFtZU1hcHBlcikgKGl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgIGZvdW5kaXQgPSAobmV4dCA9PSBmaWxlTmFtZU1hcHBlcgorICAgICAgICAgICAgICAgIHx8IChuZXh0IGluc3RhbmNlb2YgQ29udGFpbmVyTWFwcGVyCisgICAgICAgICAgICAgICAgJiYgKChDb250YWluZXJNYXBwZXIpIG5leHQpLmNvbnRhaW5zKGZpbGVOYW1lTWFwcGVyKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3VuZGl0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgPGNvZGU+TGlzdDwvY29kZT4gb2YgPGNvZGU+RmlsZU5hbWVNYXBwZXI8L2NvZGU+cy4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPkxpc3Q8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdCBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtYXBwZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gaWdub3JlIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgaWdub3JlKSB7CisgICAgICAgIC8vRW1wdHkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gaWdub3JlIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG8oU3RyaW5nIGlnbm9yZSkgeworICAgICAgICAvL0VtcHR5CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NRWxlbWVudFdyaXRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9ET01FbGVtZW50V3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1ZmUzNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NRWxlbWVudFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsNTg1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CisKKy8qKgorICogV3JpdGVzIGEgRE9NIHRyZWUgdG8gYSBnaXZlbiBXcml0ZXIuCisgKiB3YXJuaW5nOiB0aGlzIHV0aWxpdHkgY3VycmVudGx5IGRvZXMgbm90IGRlY2xhcmUgWE1MIE5hbWVzcGFjZXMuCisgKiA8cD5VdGlsaXR5IGNsYXNzIHVzZWQgYnkge0BsaW5rIG9yZy5hcGFjaGUudG9vbHMuYW50LlhtbExvZ2dlcgorICogWG1sTG9nZ2VyfSBhbmQKKyAqIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyCisgKiBYTUxKVW5pdFJlc3VsdEZvcm1hdHRlcn0uPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIERPTUVsZW1lbnRXcml0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFWCA9IDE2OworCisgICAgLyoqIHByZWZpeCBmb3IgZ2VuZXJhdGVkIHByZWZpeGVzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5TID0gIm5zIjsKKworICAgIC8qKiB4bWwgZGVjbGFyYXRpb24gaXMgb24gYnkgZGVmYXVsdCAqLworICAgIHByaXZhdGUgYm9vbGVhbiB4bWxEZWNsYXJhdGlvbiA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBYTUwgTmFtZXNwYWNlcyBhcmUgaWdub3JlZCBieSBkZWZhdWx0LgorICAgICAqLworICAgIHByaXZhdGUgWG1sTmFtZXNwYWNlUG9saWN5IG5hbWVzcGFjZVBvbGljeSA9IFhtbE5hbWVzcGFjZVBvbGljeS5JR05PUkU7CisKKyAgICAvKioKKyAgICAgKiBNYXAgKFVSSSB0byBwcmVmaXgpIG9mIGtub3duIG5hbWVzcGFjZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIG5zUHJlZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBnZW5lcmF0ZWQgcHJlZml4IHRvIHVzZSBuZXh0LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG5leHRQcmVmaXggPSAwOworCisgICAgLyoqCisgICAgICogTWFwIChFbGVtZW50IHRvIFVSSSkgb2YgbmFtZXNwYWNlcyBkZWZpbmVkIG9uIGEgZ2l2ZW4gZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgbnNVUklCeUVsZW1lbnQgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciBuYW1lc3BhY2VzIHNob3VsZCBiZSBpZ25vcmVkIGZvciBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBYbWxOYW1lc3BhY2VQb2xpY3kgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcXVhbGlmeUVsZW1lbnRzOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcXVhbGlmeUF0dHJpYnV0ZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElnbm9yZXMgbmFtZXNwYWNlcyBmb3IgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIHRoZSBkZWZhdWx0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBYbWxOYW1lc3BhY2VQb2xpY3kgSUdOT1JFID0KKyAgICAgICAgICAgIG5ldyBYbWxOYW1lc3BhY2VQb2xpY3koZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSWdub3JlcyBuYW1lc3BhY2VzIGZvciBhdHRyaWJ1dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBYbWxOYW1lc3BhY2VQb2xpY3kgT05MWV9RVUFMSUZZX0VMRU1FTlRTID0KKyAgICAgICAgICAgIG5ldyBYbWxOYW1lc3BhY2VQb2xpY3kodHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWFsaWZpZXMgbmFtZXNwYWNlcyBmb3IgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFhtbE5hbWVzcGFjZVBvbGljeSBRVUFMSUZZX0FMTCA9CisgICAgICAgICAgICBuZXcgWG1sTmFtZXNwYWNlUG9saWN5KHRydWUsIHRydWUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gcXVhbGlmeUVsZW1lbnRzIHdoZXRoZXIgdG8gcXVhbGlmeSBlbGVtZW50cworICAgICAgICAgKiBAcGFyYW0gcXVhbGlmeUF0dHJpYnV0ZXMgd2hldGhlciB0byBxdWFsaWZ5IGVsZW1lbnRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgWG1sTmFtZXNwYWNlUG9saWN5KGJvb2xlYW4gcXVhbGlmeUVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcXVhbGlmeUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHRoaXMucXVhbGlmeUVsZW1lbnRzID0gcXVhbGlmeUVsZW1lbnRzOworICAgICAgICAgICAgdGhpcy5xdWFsaWZ5QXR0cmlidXRlcyA9IHF1YWxpZnlBdHRyaWJ1dGVzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVsZW1lbnQgd3JpdGVyLgorICAgICAqIFRoZSA/eG1sPyBkZWNsYXJhdGlvbiB3aWxsIGJlIGluY2x1ZGVkLCBuYW1lc3BhY2VzIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIERPTUVsZW1lbnRXcml0ZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVsZW1lbnQgd3JpdGVyCisgICAgICogWE1MIG5hbWVzcGFjZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSB4bWxEZWNsYXJhdGlvbiBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlID94bWw/IGRlY2xhcmF0aW9uCisgICAgICogc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgICAqIEBzaW5jZSBBbnQxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgRE9NRWxlbWVudFdyaXRlcihib29sZWFuIHhtbERlY2xhcmF0aW9uKSB7CisgICAgICAgIHRoaXMoeG1sRGVjbGFyYXRpb24sIFhtbE5hbWVzcGFjZVBvbGljeS5JR05PUkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBlbGVtZW50IHdyaXRlcgorICAgICAqIFhNTCBuYW1lc3BhY2VzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0geG1sRGVjbGFyYXRpb24gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSA/eG1sPyBkZWNsYXJhdGlvbgorICAgICAqIHNob3VsZCBiZSBpbmNsdWRlZC4KKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlUG9saWN5IHRoZSBwb2xpY3kgdG8gdXNlLgorICAgICAqIEBzaW5jZSBBbnQxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgRE9NRWxlbWVudFdyaXRlcihib29sZWFuIHhtbERlY2xhcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbE5hbWVzcGFjZVBvbGljeSBuYW1lc3BhY2VQb2xpY3kpIHsKKyAgICAgICAgdGhpcy54bWxEZWNsYXJhdGlvbiA9IHhtbERlY2xhcmF0aW9uOworICAgICAgICB0aGlzLm5hbWVzcGFjZVBvbGljeSA9IG5hbWVzcGFjZVBvbGljeTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbFNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgLyoqCisgICAgICogRG9uJ3QgdHJ5IHRvIGJlIHRvbyBzbWFydCBidXQgYXQgbGVhc3QgcmVjb2duaXplIHRoZSBwcmVkZWZpbmVkCisgICAgICogZW50aXRpZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGtub3duRW50aXRpZXMgPSB7Imd0IiwgImFtcCIsICJsdCIsICJhcG9zIiwgInF1b3QifTsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBET00gdHJlZSB0byBhIHN0cmVhbSBpbiBVVEY4IGVuY29kaW5nLiBOb3RlIHRoYXQKKyAgICAgKiBpdCBwcmVwZW5kcyB0aGUgJmx0Oz94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPyZndDsgaWYKKyAgICAgKiB0aGUgeG1sRGVjbGFyYXRpb24gZmllbGQgaXMgdHJ1ZS4KKyAgICAgKiBUaGUgaW5kZW50IG51bWJlciBpcyBzZXQgdG8gMCBhbmQgYSAyLXNwYWNlIGluZGVudC4KKyAgICAgKiBAcGFyYW0gcm9vdCB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBET00gdHJlZS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXRzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShFbGVtZW50IHJvb3QsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFdyaXRlciB3cmkgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURjgiKTsKKyAgICAgICAgd3JpdGVYTUxEZWNsYXJhdGlvbih3cmkpOworICAgICAgICB3cml0ZShyb290LCB3cmksIDAsICIgICIpOworICAgICAgICB3cmkuZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIFhNTCBkZWNsYXJhdGlvbiBpZiB4bWxEZWNsYXJhdGlvbiBpcyB0cnVlLgorICAgICAqIEBwYXJhbSB3cmkgdGhlIHdyaXRlciB0byB3cml0ZSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqIEBzaW5jZSBBbnQgMS43LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVhNTERlY2xhcmF0aW9uKFdyaXRlciB3cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh4bWxEZWNsYXJhdGlvbikgeworICAgICAgICAgICAgd3JpLndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgRE9NIHRyZWUgdG8gYSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgUm9vdCBET00gZWxlbWVudCBvZiB0aGUgdHJlZQorICAgICAqIEBwYXJhbSBvdXQgd2hlcmUgdG8gc2VuZCB0aGUgb3V0cHV0CisgICAgICogQHBhcmFtIGluZGVudCBudW1iZXIgb2YKKyAgICAgKiBAcGFyYW0gaW5kZW50V2l0aCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBpbmRlbnQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB0YWcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShFbGVtZW50IGVsZW1lbnQsIFdyaXRlciBvdXQsIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluZGVudFdpdGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gV3JpdGUgY2hpbGQgZWxlbWVudHMgYW5kIHRleHQKKyAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgYm9vbGVhbiBoYXNDaGlsZHJlbiA9IChjaGlsZHJlbi5nZXRMZW5ndGgoKSA+IDApOworICAgICAgICBib29sZWFuIGhhc0NoaWxkRWxlbWVudHMgPSBmYWxzZTsKKyAgICAgICAgb3BlbkVsZW1lbnQoZWxlbWVudCwgb3V0LCBpbmRlbnQsIGluZGVudFdpdGgsIGhhc0NoaWxkcmVuKTsKKworICAgICAgICBpZiAoaGFzQ2hpbGRyZW4pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZEVsZW1lbnRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGxTZXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKChFbGVtZW50KSBjaGlsZCwgb3V0LCBpbmRlbnQgKyAxLCBpbmRlbnRXaXRoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoZW5jb2RlKGNoaWxkLmdldE5vZGVWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI8IS0tIik7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShlbmNvZGUoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCItLT4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjwhW0NEQVRBWyIpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoZW5jb2RlZGF0YSgoKFRleHQpIGNoaWxkKS5nZXREYXRhKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJdXT4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJyYnKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGNoaWxkLmdldE5vZGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJzsnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjw/Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjaGlsZC5nZXROb2RlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSBjaGlsZC5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI/PiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvc2VFbGVtZW50KGVsZW1lbnQsIG91dCwgaW5kZW50LCBpbmRlbnRXaXRoLCBoYXNDaGlsZEVsZW1lbnRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgb3BlbmluZyB0YWcgLSBpbmNsdWRpbmcgYWxsIGF0dHJpYnV0ZXMgLQorICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gYSBET00gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBET00gZWxlbWVudCB0byB3cml0ZQorICAgICAqIEBwYXJhbSBvdXQgd2hlcmUgdG8gc2VuZCB0aGUgb3V0cHV0CisgICAgICogQHBhcmFtIGluZGVudCBudW1iZXIgb2YKKyAgICAgKiBAcGFyYW0gaW5kZW50V2l0aCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBpbmRlbnQgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB0YWcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvcGVuRWxlbWVudChFbGVtZW50IGVsZW1lbnQsIFdyaXRlciBvdXQsIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluZGVudFdpdGgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG9wZW5FbGVtZW50KGVsZW1lbnQsIG91dCwgaW5kZW50LCBpbmRlbnRXaXRoLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG9wZW5pbmcgdGFnIC0gaW5jbHVkaW5nIGFsbCBhdHRyaWJ1dGVzIC0KKyAgICAgKiBjb3JyZXNwb25kaW5nIHRvIGEgRE9NIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgRE9NIGVsZW1lbnQgdG8gd3JpdGUKKyAgICAgKiBAcGFyYW0gb3V0IHdoZXJlIHRvIHNlbmQgdGhlIG91dHB1dAorICAgICAqIEBwYXJhbSBpbmRlbnQgbnVtYmVyIG9mCisgICAgICogQHBhcmFtIGluZGVudFdpdGggc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gaW5kZW50IHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdGFnLgorICAgICAqIEBwYXJhbSBoYXNDaGlsZHJlbiB3aGV0aGVyIHRoaXMgZWxlbWVudCBoYXMgY2hpbGRyZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHN0cmVhbS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9wZW5FbGVtZW50KEVsZW1lbnQgZWxlbWVudCwgV3JpdGVyIG91dCwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5kZW50V2l0aCwgYm9vbGVhbiBoYXNDaGlsZHJlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gV3JpdGUgaW5kZW50IGNoYXJhY3RlcnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgeworICAgICAgICAgICAgb3V0LndyaXRlKGluZGVudFdpdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgZWxlbWVudAorICAgICAgICBvdXQud3JpdGUoIjwiKTsKKyAgICAgICAgaWYgKG5hbWVzcGFjZVBvbGljeS5xdWFsaWZ5RWxlbWVudHMpIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSBnZXROYW1lc3BhY2VVUkkoZWxlbWVudCk7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbnNQcmVmaXhNYXAuZ2V0KHVyaSk7CisgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobnNQcmVmaXhNYXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IE5TICsgKG5leHRQcmVmaXgrKyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5zUHJlZml4TWFwLnB1dCh1cmksIHByZWZpeCk7CisgICAgICAgICAgICAgICAgYWRkTlNEZWZpbml0aW9uKGVsZW1lbnQsIHVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKHByZWZpeCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI6Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKGVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKKworICAgICAgICAvLyBXcml0ZSBhdHRyaWJ1dGVzCisgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBhdHRycy5pdGVtKGkpOworICAgICAgICAgICAgb3V0LndyaXRlKCIgIik7CisgICAgICAgICAgICBpZiAobmFtZXNwYWNlUG9saWN5LnF1YWxpZnlBdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGdldE5hbWVzcGFjZVVSSShhdHRyKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbnNQcmVmaXhNYXAuZ2V0KHVyaSk7CisgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IE5TICsgKG5leHRQcmVmaXgrKyk7CisgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4TWFwLnB1dCh1cmksIHByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgIGFkZE5TRGVmaW5pdGlvbihlbGVtZW50LCB1cmkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQud3JpdGUocHJlZml4KTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjoiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC53cml0ZShhdHRyLmdldE5hbWUoKSk7CisgICAgICAgICAgICBvdXQud3JpdGUoIj1cIiIpOworICAgICAgICAgICAgb3V0LndyaXRlKGVuY29kZShhdHRyLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgIG91dC53cml0ZSgiXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyaXRlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMKKyAgICAgICAgQXJyYXlMaXN0IGFsID0gKEFycmF5TGlzdCkgbnNVUklCeUVsZW1lbnQuZ2V0KGVsZW1lbnQpOworICAgICAgICBpZiAoYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGFsLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIG5zUHJlZml4TWFwLmdldCh1cmkpOworICAgICAgICAgICAgICAgIG91dC53cml0ZSgiIHhtbG5zIik7CisgICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMocHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHByZWZpeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKHVyaSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhc0NoaWxkcmVuKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoIj4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbW92ZU5TRGVmaW5pdGlvbnMoZWxlbWVudCk7CisgICAgICAgICAgICBvdXQud3JpdGUoIiAvPiIpOworICAgICAgICAgICAgb3V0LndyaXRlKGxTZXApOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBET00gdHJlZSB0byBhIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50IHRoZSBSb290IERPTSBlbGVtZW50IG9mIHRoZSB0cmVlCisgICAgICogQHBhcmFtIG91dCB3aGVyZSB0byBzZW5kIHRoZSBvdXRwdXQKKyAgICAgKiBAcGFyYW0gaW5kZW50IG51bWJlciBvZgorICAgICAqIEBwYXJhbSBpbmRlbnRXaXRoIHN0cmluZyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGluZGVudCB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHRhZy4KKyAgICAgKiBAcGFyYW0gaGFzQ2hpbGRyZW4gaWYgdHJ1ZSBpbmRlbnQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBXcml0ZXIgb3V0LCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5kZW50V2l0aCwgYm9vbGVhbiBoYXNDaGlsZHJlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gSWYgd2UgaGFkIGNoaWxkIGVsZW1lbnRzLCB3ZSBuZWVkIHRvIGluZGVudCBiZWZvcmUgd2UgY2xvc2UKKyAgICAgICAgLy8gdGhlIGVsZW1lbnQsIG90aGVyd2lzZSB3ZSdyZSBvbiB0aGUgc2FtZSBsaW5lIGFuZCBkb24ndCBuZWVkCisgICAgICAgIC8vIHRvIGluZGVudAorICAgICAgICBpZiAoaGFzQ2hpbGRyZW4pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoaW5kZW50V2l0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBlbGVtZW50IGNsb3NlCisgICAgICAgIG91dC53cml0ZSgiPC8iKTsKKyAgICAgICAgaWYgKG5hbWVzcGFjZVBvbGljeS5xdWFsaWZ5RWxlbWVudHMpIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSBnZXROYW1lc3BhY2VVUkkoZWxlbWVudCk7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbnNQcmVmaXhNYXAuZ2V0KHVyaSk7CisgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgISIiLmVxdWFscyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKHByZWZpeCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI6Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZW1vdmVOU0RlZmluaXRpb25zKGVsZW1lbnQpOworICAgICAgICB9CisgICAgICAgIG91dC53cml0ZShlbGVtZW50LmdldFRhZ05hbWUoKSk7CisgICAgICAgIG91dC53cml0ZSgiPiIpOworICAgICAgICBvdXQud3JpdGUobFNlcCk7CisgICAgICAgIG91dC5mbHVzaCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVzY2FwZSAmbHQ7LCAmZ3Q7ICZhbXA7ICZhcG9zOywgJnF1b3Q7IGFzIHRoZWlyIGVudGl0aWVzIGFuZAorICAgICAqIGRyb3AgY2hhcmFjdGVycyB0aGF0IGFyZSBpbGxlZ2FsIGluIFhNTCBkb2N1bWVudHMuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBzdHJpbmcgdG8gZW5jb2RlLgorICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGludCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZsdDsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmd0OyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmFwb3M7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImcXVvdDsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyYnOgorICAgICAgICAgICAgICAgIGludCBuZXh0U2VtaSA9IHZhbHVlLmluZGV4T2YoIjsiLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dFNlbWkgPCAwCisgICAgICAgICAgICAgICAgICAgIHx8ICFpc1JlZmVyZW5jZSh2YWx1ZS5zdWJzdHJpbmcoaSwgbmV4dFNlbWkgKyAxKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnJicpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKGlzTGVnYWxDaGFyYWN0ZXIoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2Iuc3Vic3RyaW5nKDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyb3AgY2hhcmFjdGVycyB0aGF0IGFyZSBpbGxlZ2FsIGluIFhNTCBkb2N1bWVudHMuCisgICAgICoKKyAgICAgKiA8cD5BbHNvIGVuc3VyZSB0aGF0IHdlIGFyZSBub3QgaW5jbHVkaW5nIGFuIDxjb2RlPl1dJmd0OzwvY29kZT4KKyAgICAgKiBtYXJrZXIgYnkgcmVwbGFjaW5nIHRoYXQgc2VxdWVuY2Ugd2l0aAorICAgICAqIDxjb2RlPiZhbXA7I3g1ZDsmYW1wOyN4NWQ7JmFtcDtndDs8L2NvZGU+LjwvcD4KKyAgICAgKgorICAgICAqIDxwPlNlZSBYTUwgMS4wIDIuMiA8YQorICAgICAqIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCNjaGFyc2V0cyI+CisgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI2NoYXJzZXRzPC9hPiBhbmQKKyAgICAgKiAyLjcgPGEKKyAgICAgKiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAjc2VjLWNkYXRhLXNlY3QiPmh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCNzZWMtY2RhdGEtc2VjdDwvYT4uPC9wPgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgZW5jb2RlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHZhbHVlLgorCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVkYXRhKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGludCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGlzTGVnYWxDaGFyYWN0ZXIoYykpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2Iuc3Vic3RyaW5nKDApOworICAgICAgICBpbnQgY2RFbmQgPSByZXN1bHQuaW5kZXhPZigiXV0+Iik7CisgICAgICAgIHdoaWxlIChjZEVuZCAhPSAtMSkgeworICAgICAgICAgICAgc2Iuc2V0TGVuZ3RoKGNkRW5kKTsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgICAgICBzYi5hcHBlbmQoIiYjeDVkOyYjeDVkOyZndDsiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQocmVzdWx0LnN1YnN0cmluZyhjZEVuZCArIDMpKTsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgICAgIHJlc3VsdCA9IHNiLnN1YnN0cmluZygwKTsKKyAgICAgICAgICAgIGNkRW5kID0gcmVzdWx0LmluZGV4T2YoIl1dPiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgZ2l2ZW4gYXJndW1lbnQgYSBjaGFyYWN0ZXIgb3IgZW50aXR5IHJlZmVyZW5jZT8KKyAgICAgKiBAcGFyYW0gZW50IHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhbiBlbnRpdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoU3RyaW5nIGVudCkgeworICAgICAgICBpZiAoIShlbnQuY2hhckF0KDApID09ICcmJykgfHwgIWVudC5lbmRzV2l0aCgiOyIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW50LmNoYXJBdCgxKSA9PSAnIycpIHsKKyAgICAgICAgICAgIGlmIChlbnQuY2hhckF0KDIpID09ICd4JykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoZW50LnN1YnN0cmluZygzLCBlbnQubGVuZ3RoKCkgLSAxKSwgSEVYKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoZW50LnN1YnN0cmluZygyLCBlbnQubGVuZ3RoKCkgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBuYW1lID0gZW50LnN1YnN0cmluZygxLCBlbnQubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bkVudGl0aWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoa25vd25FbnRpdGllc1tpXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIGdpdmVuIGNoYXJhY3RlciBhbGxvd2VkIGluc2lkZSBhbiBYTUwgZG9jdW1lbnQ/CisgICAgICoKKyAgICAgKiA8cD5TZWUgWE1MIDEuMCAyLjIgPGEKKyAgICAgKiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAjY2hhcnNldHMiPgorICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCNjaGFyc2V0czwvYT4uPC9wPgorICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBhbGxvd2VkLgorICAgICAqIEBzaW5jZSAxLjEwLCBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMZWdhbENoYXJhY3RlcihjaGFyIGMpIHsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgaWYgKGMgPT0gMHg5IHx8IGMgPT0gMHhBIHx8IGMgPT0gMHhEKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjIDwgMHgyMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGMgPD0gMHhEN0ZGKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjIDwgMHhFMDAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoYyA8PSAweEZGRkQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVOU0RlZmluaXRpb25zKEVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICBBcnJheUxpc3QgYWwgPSAoQXJyYXlMaXN0KSBuc1VSSUJ5RWxlbWVudC5nZXQoZWxlbWVudCk7CisgICAgICAgIGlmIChhbCAhPSBudWxsKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gYWwuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIG5zUHJlZml4TWFwLnJlbW92ZShpdGVyLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuc1VSSUJ5RWxlbWVudC5yZW1vdmUoZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkTlNEZWZpbml0aW9uKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVyaSkgeworICAgICAgICBBcnJheUxpc3QgYWwgPSAoQXJyYXlMaXN0KSBuc1VSSUJ5RWxlbWVudC5nZXQoZWxlbWVudCk7CisgICAgICAgIGlmIChhbCA9PSBudWxsKSB7CisgICAgICAgICAgICBhbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIG5zVVJJQnlFbGVtZW50LnB1dChlbGVtZW50LCBhbCk7CisgICAgICAgIH0KKyAgICAgICAgYWwuYWRkKHVyaSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG4pIHsKKyAgICAgICAgU3RyaW5nIHVyaSA9IG4uZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRklYTUU6IElzICJObyBOYW1lc3BhY2UgaXMgRW1wdHkgTmFtZXNwYWNlIiByZWFsbHkgT0s/CisgICAgICAgICAgICB1cmkgPSAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NVXRpbHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzNmYWJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9ET01VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CisKKy8vIENoZWNrU3R5bGU6SGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yQ2hlY2sgT0ZGIC0gYmMKKworLyoqCisgKiBTb21lIHV0aWxpdHkgbWV0aG9kcyBmb3IgY29tbW9uIHRhc2tzIHdoZW4gYnVpbGRpbmcgRE9NIHRyZWVzIGluIG1lbW9yeS4KKyAqCisgKiA8cD5JbiB0aGlzIGRvY3VtZW50YXRpb24gPGNvZGU+Jmx0O2EmZ3Q7PC9jb2RlPiBtZWFucyBhbiB7QGxpbmsKKyAqIG9yZy53M2MuZG9tLkVsZW1lbnQgRWxlbWVudH0gaW5zdGFuY2Ugd2l0aCBuYW1lIDxjb2RlPmE8L2NvZGU+LjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuNi4zCisgKi8KK3B1YmxpYyBjbGFzcyBET01VdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgRG9jdW1lbnQgaW5zdGFuY2UsCisgICAgICogQHJldHVybiB0aGUgZG9jdW1lbnQuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgbmV3RG9jdW1lbnQoKSB7CisgICAgICAgIHJldHVybiBKQVhQVXRpbHMuZ2V0RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmFtZWQgRWxlbWVudCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZ2l2ZW4gZWxlbWVudCwKKyAgICAgKiByZXR1cm5zIGl0LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZWFucworICAgICAqIDxwcmU+Y3JlYXRlQ2hpbGRFbGVtZW50KCZsdDthJmd0OywgImIiKTwvcHJlPgorICAgICAqIGNyZWF0ZXMKKyAgICAgKiA8cHJlPgorICAgICAqICZsdDthJmd0OworICAgICAqICAgJmx0O2IvJmd0OworICAgICAqICZsdDsvYSZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBhbmQgcmV0dXJucyA8Y29kZT4mbHQ7YiZndDs8L2NvZGU+LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgZWxlbWVudCB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgbmV3IGVsZW1lbnQgYXMgY2hpbGQuCisgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgbmV3IGVsZW1lbnQuCisgICAgICogQHJldHVybiB0aGUgbmV3IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUNoaWxkRWxlbWVudChFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKKyAgICAgICAgRWxlbWVudCBlID0gZG9jLmNyZWF0ZUVsZW1lbnQobmFtZSk7CisgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlKTsKKyAgICAgICAgcmV0dXJuIGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBuZXN0ZWQgdGV4dC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWVhbnMKKyAgICAgKiA8cHJlPmFwcGVuZFRleHQoJmx0O2EmZ3Q7LCAiYiIpPC9wcmU+CisgICAgICogY3JlYXRlcworICAgICAqIDxwcmU+CisgICAgICogJmx0O2EmZ3Q7YiZsdDsvYSZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IGVsZW1lbnQgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIG5ldyBlbGVtZW50IGFzIGNoaWxkLgorICAgICAqIEBwYXJhbSBjb250ZW50IHRleHQgY29udGVudC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kVGV4dChFbGVtZW50IHBhcmVudCwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKKyAgICAgICAgVGV4dCB0ID0gZG9jLmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpOworICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5lc3RlZCBDREFUQSBzZWN0aW9uLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZWFucworICAgICAqIDxwcmU+YXBwZW5kQ0RBVEEoJmx0O2EmZ3Q7LCAiYiIpPC9wcmU+CisgICAgICogY3JlYXRlcworICAgICAqIDxwcmU+CisgICAgICogJmx0O2EmZ3Q7Jmx0O1shQ0RBVEFbYl1dJmd0OyZsdDsvYSZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IGVsZW1lbnQgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIG5ldyBlbGVtZW50IGFzIGNoaWxkLgorICAgICAqIEBwYXJhbSBjb250ZW50IHRleHQgY29udGVudC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kQ0RBVEEoRWxlbWVudCBwYXJlbnQsIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIERvY3VtZW50IGRvYyA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7CisgICAgICAgIENEQVRBU2VjdGlvbiBjID0gZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihjb250ZW50KTsKKyAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgbmVzdGVkIHRleHQgaW4gYSBuZXcgY2hpbGQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWVhbnMKKyAgICAgKiA8cHJlPmFwcGVuZFRleHRFbGVtZW50KCZsdDthJmd0OywgImIiLCAiYyIpPC9wcmU+CisgICAgICogY3JlYXRlcworICAgICAqIDxwcmU+CisgICAgICogJmx0O2EmZ3Q7CisgICAgICogICAmbHQ7YiZndDtjJmx0Oy9iJmd0OworICAgICAqICZsdDsvYSZndDsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IGVsZW1lbnQgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIG5ldyBlbGVtZW50IGFzIGNoaWxkLgorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBjaGlsZCBlbGVtZW50LgorICAgICAqIEBwYXJhbSBjb250ZW50IHRleHQgY29udGVudC4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kVGV4dEVsZW1lbnQoRWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCkgeworICAgICAgICBFbGVtZW50IGUgPSBjcmVhdGVDaGlsZEVsZW1lbnQocGFyZW50LCBuYW1lKTsKKyAgICAgICAgYXBwZW5kVGV4dChlLCBjb250ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmVzdGVkIENEQVRBIHNlY3Rpb24gaW4gYSBuZXcgY2hpbGQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWVhbnMKKyAgICAgKiA8cHJlPmFwcGVuZENEQVRBRWxlbWVudCgmbHQ7YSZndDssICJiIiwgImMiKTwvcHJlPgorICAgICAqIGNyZWF0ZXMKKyAgICAgKiA8cHJlPgorICAgICAqICZsdDthJmd0OworICAgICAqICAgJmx0O2ImZ3Q7Jmx0OyFbQ0RBVEFbY11dPiZsdDsvYiZndDsKKyAgICAgKiAmbHQ7L2EmZ3Q7CisgICAgICogPC9wcmU+CisgICAgICogPC9wcmU+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBlbGVtZW50IHRoYXQgd2lsbCByZWNlaXZlIHRoZSBuZXcgZWxlbWVudCBhcyBjaGlsZC4KKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gY29udGVudCB0ZXh0IGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZENEQVRBRWxlbWVudChFbGVtZW50IHBhcmVudCwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCkgeworICAgICAgICBFbGVtZW50IGUgPSBjcmVhdGVDaGlsZEVsZW1lbnQocGFyZW50LCBuYW1lKTsKKyAgICAgICAgYXBwZW5kQ0RBVEEoZSwgY29udGVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9EYXRlVXRpbHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGF0ZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmZDg4NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGF0ZVV0aWxzLmphdmEKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEudGV4dC5DaG9pY2VGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworLyoqCisgKiBIZWxwZXIgbWV0aG9kcyB0byBkZWFsIHdpdGggZGF0ZS90aW1lIGZvcm1hdHRpbmcgd2l0aCBhIHNwZWNpZmljCisgKiBkZWZpbmVkIGZvcm1hdCAoPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSI+SVNPODYwMTwvYT4pCisgKiBvciBhIHBsdXJpYWxpemF0aW9uIGNvcnJlY3QgZWxhcHNlZCB0aW1lIGluIG1pbnV0ZXMgYW5kIHNlY29uZHMuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEYXRlVXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9ORV9TRUNPTkQgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPTkVfTUlOVVRFID0gNjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9ORV9IT1VSID0gNjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFTiA9IDEwOworICAgIC8qKgorICAgICAqIElTTzg2MDEtbGlrZSBwYXR0ZXJuIGZvciBkYXRlLXRpbWUuIEl0IGRvZXMgbm90IHN1cHBvcnQgdGltZXpvbmUuCisgICAgICogIDx0dD55eXl5LU1NLWRkVEhIOm1tOnNzPC90dD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU084NjAxX0RBVEVUSU1FX1BBVFRFUk4KKyAgICAgICAgICAgID0gInl5eXktTU0tZGQnVCdISDptbTpzcyI7CisKKyAgICAvKioKKyAgICAgKiBJU084NjAxLWxpa2UgcGF0dGVybiBmb3IgZGF0ZS4gPHR0Pnl5eXktTU0tZGQ8L3R0PgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTTzg2MDFfREFURV9QQVRURVJOCisgICAgICAgICAgICA9ICJ5eXl5LU1NLWRkIjsKKworICAgIC8qKgorICAgICAqIElTTzg2MDEtbGlrZSBwYXR0ZXJuIGZvciB0aW1lLiAgPHR0PkhIOm1tOnNzPC90dD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU084NjAxX1RJTUVfUEFUVEVSTgorICAgICAgICAgICAgPSAiSEg6bW06c3MiOworCisgICAgLyoqCisgICAgICogRm9ybWF0IHVzZWQgZm9yIFNNVFAgKGFuZCBwcm9iYWJseSBvdGhlcikgRGF0ZSBoZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBEQVRFX0hFQURFUl9GT1JNQVQKKyAgICAgICAgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFLCBkZCBNTU0geXl5eSBISDptbTpzcyAiLCBMb2NhbGUuVVMpOworCisKKy8vIGNvZGUgZnJvbSBNYWdlc2ggbW92ZWQgZnJvbSBEZWZhdWx0TG9nZ2VyIGFuZCBzbGlnaHRseSBtb2RpZmllZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VGb3JtYXQgTUlOVVRFX1NFQ09ORFMKKyAgICAgICAgICAgID0gbmV3IE1lc3NhZ2VGb3JtYXQoInswfXsxfSIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlW10gTElNSVRTID0gezAsIDEsIDJ9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUlOVVRFU19QQVJUID0geyIiLCAiMSBtaW51dGUgIiwgInswLG51bWJlcn0gbWludXRlcyAifTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNFQ09ORFNfUEFSVCA9IHsiMCBzZWNvbmRzIiwgIjEgc2Vjb25kIiwgInsxLG51bWJlcn0gc2Vjb25kcyJ9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hvaWNlRm9ybWF0IE1JTlVURVNfRk9STUFUID0KKyAgICAgICAgICAgIG5ldyBDaG9pY2VGb3JtYXQoTElNSVRTLCBNSU5VVEVTX1BBUlQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hvaWNlRm9ybWF0IFNFQ09ORFNfRk9STUFUID0KKyAgICAgICAgICAgIG5ldyBDaG9pY2VGb3JtYXQoTElNSVRTLCBTRUNPTkRTX1BBUlQpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgTUlOVVRFX1NFQ09ORFMuc2V0Rm9ybWF0KDAsIE1JTlVURVNfRk9STUFUKTsKKyAgICAgICAgTUlOVVRFX1NFQ09ORFMuc2V0Rm9ybWF0KDEsIFNFQ09ORFNfRk9STUFUKTsKKyAgICB9CisKKyAgICAvKiogcHJpdmF0ZSBjb25zdHJ1Y3RvciAqLworICAgIHByaXZhdGUgRGF0ZVV0aWxzKCkgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogRm9ybWF0IGEgZGF0ZS90aW1lIGludG8gYSBzcGVjaWZpYyBwYXR0ZXJuLgorICAgICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIGZvcm1hdCBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRvIHVzZSB0byBmb3JtYXQgdGhlIGRhdGUuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIGRhdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KGxvbmcgZGF0ZSwgU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdChuZXcgRGF0ZShkYXRlKSwgcGF0dGVybik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgYSBkYXRlL3RpbWUgaW50byBhIHNwZWNpZmljIHBhdHRlcm4uCisgICAgICogQHBhcmFtIGRhdGUgdGhlIGRhdGUgdG8gZm9ybWF0IGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gdXNlIHRvIGZvcm1hdCB0aGUgZGF0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoRGF0ZSBkYXRlLCBTdHJpbmcgcGF0dGVybikgeworICAgICAgICBEYXRlRm9ybWF0IGRmID0gY3JlYXRlRGF0ZUZvcm1hdChwYXR0ZXJuKTsKKyAgICAgICAgcmV0dXJuIGRmLmZvcm1hdChkYXRlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZvcm1hdCBhbiBlbGFwc2VkIHRpbWUgaW50byBhIHBsdXJpYWxpemF0aW9uIGNvcnJlY3Qgc3RyaW5nLgorICAgICAqIEl0IGlzIGxpbWl0ZWQgb25seSB0byByZXBvcnQgZWxhcHNlZCB0aW1lIGluIG1pbnV0ZXMgYW5kCisgICAgICogc2Vjb25kcyBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3IuCisgICAgICogPHVsPgorICAgICAqIDxsaT5taW51dGVzIGFyZSBub3QgZGlzcGxheWVkIHdoZW4gMC4gKGllOiAiNDUgc2Vjb25kcyIpPC9saT4KKyAgICAgKiA8bGk+c2Vjb25kcyBhcmUgYWx3YXlzIGRpc3BsYXllZCBpbiBwbHVyYWwgZm9ybSAoaWUgIjAgc2Vjb25kcyIgb3IKKyAgICAgKiAiMTAgc2Vjb25kcyIpIGV4Y2VwdCBmb3IgMSAoaWUgIjEgc2Vjb25kIik8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQHBhcmFtIG1pbGxpcyB0aGUgZWxhcHNlZCB0aW1lIHRvIHJlcG9ydCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHRleHQgaW4gbWludXRlcy9zZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdEVsYXBzZWRUaW1lKGxvbmcgbWlsbGlzKSB7CisgICAgICAgIGxvbmcgc2Vjb25kcyA9IG1pbGxpcyAvIE9ORV9TRUNPTkQ7CisgICAgICAgIGxvbmcgbWludXRlcyA9IHNlY29uZHMgLyBPTkVfTUlOVVRFOworICAgICAgICBPYmplY3RbXSBhcmdzID0ge25ldyBMb25nKG1pbnV0ZXMpLCBuZXcgTG9uZyhzZWNvbmRzICUgT05FX01JTlVURSl9OworICAgICAgICByZXR1cm4gTUlOVVRFX1NFQ09ORFMuZm9ybWF0KGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIGxlbmllbnQgZGF0ZSBmb3JtYXQgc2V0IHRvIEdNVCB0aW1lIHpvbmUuCisgICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdXNlZCBmb3IgZGF0ZS90aW1lIGZvcm1hdHRpbmcuCisgICAgICogQHJldHVybiB0aGUgY29uZmlndXJlZCBmb3JtYXQgZm9yIHRoaXMgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBEYXRlRm9ybWF0IGNyZWF0ZURhdGVGb3JtYXQoU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChwYXR0ZXJuKTsKKyAgICAgICAgVGltZVpvbmUgZ210ID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpOworICAgICAgICBzZGYuc2V0VGltZVpvbmUoZ210KTsKKyAgICAgICAgc2RmLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJldHVybiBzZGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBwaGFzZSBvZiB0aGUgbW9vbiBmb3IgYSBnaXZlbiBkYXRlLgorICAgICAqCisgICAgICogPHA+Q29kZSBoZWF2aWx5IGluZmx1ZW5jZWQgYnkgaGFja2xpYi5jIGluIDxhCisgICAgICogaHJlZj0iaHR0cDovL3d3dy5uZXRoYWNrLm9yZy8iPk5ldGhhY2s8L2E+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIEFsZ29yaXRobToKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogbW9vbiBwZXJpb2QgPSAyOS41MzA1OCBkYXlzIH49IDMwLCB5ZWFyID0gMzY1LjI0MjIgZGF5cworICAgICAqCisgICAgICogZGF5cyBtb29uIHBoYXNlIGFkdmFuY2VzIG9uIGZpcnN0IGRheSBvZiB5ZWFyIGNvbXBhcmVkIHRvIHByZWNlZGluZyB5ZWFyCisgICAgICogID0gMzY1LjI0MjIgLSAxMioyOS41MzA1OCB+PSAxMQorICAgICAqCisgICAgICogeWVhcnMgaW4gTWV0b25pYyBjeWNsZSAodGltZSB1bnRpbCBzYW1lIHBoYXNlcyBmYWxsIG9uIHRoZSBzYW1lIGRheXMgb2YKKyAgICAgKiAgdGhlIG1vbnRoKSA9IDE4LjYgfj0gMTkKKyAgICAgKgorICAgICAqIG1vb24gcGhhc2Ugb24gZmlyc3QgZGF5IG9mIHllYXIgKGVwYWN0KSB+PSAoMTEqKHllYXIlMTkpICsgMTgpICUgMzAKKyAgICAgKiAgKDE4IGFzIGluaXRpYWwgY29uZGl0aW9uIGZvciAxOTAwKQorICAgICAqCisgICAgICogY3VycmVudCBwaGFzZSBpbiBkYXlzID0gZmlyc3QgZGF5IHBoYXNlICsgZGF5cyBlbGFwc2VkIGluIHllYXIKKyAgICAgKgorICAgICAqIDYgbW9vbnMgfj0gMTc3IGRheXMKKyAgICAgKiAxNzcgfj0gOCByZXBvcnRlZCBwaGFzZXMgKiAyMgorICAgICAqICsgMTEvMjIgZm9yIHJvdW5kaW5nCisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsIHRoZSBjYWxhbmRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBoYXNlIG9mIHRoZSBtb29uIGFzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNyB3aXRoCisgICAgICogICAgICAgICAwIG1lYW5pbmcgbmV3IG1vb24gYW5kIDQgbWVhbmluZyBmdWxsIG1vb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4yLCBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UGhhc2VPZk1vb24oQ2FsZW5kYXIgY2FsKSB7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgIGludCBkYXlPZlRoZVllYXIgPSBjYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9ZRUFSKTsKKyAgICAgICAgaW50IHllYXJJbk1ldG9uaWNDeWNsZSA9ICgoY2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIDE5MDApICUgMTkpICsgMTsKKyAgICAgICAgaW50IGVwYWN0ID0gKDExICogeWVhckluTWV0b25pY0N5Y2xlICsgMTgpICUgMzA7CisgICAgICAgIGlmICgoZXBhY3QgPT0gMjUgJiYgeWVhckluTWV0b25pY0N5Y2xlID4gMTEpIHx8IGVwYWN0ID09IDI0KSB7CisgICAgICAgICAgICBlcGFjdCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKCgoKGRheU9mVGhlWWVhciArIGVwYWN0KSAqIDYpICsgMTEpICUgMTc3KSAvIDIyKSAmIDc7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IERhdGUgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGEgU01UUCBkYXRlCisgICAgICogaGVhZGVyLgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGF0ZUZvckhlYWRlcigpIHsKKyAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgVGltZVpvbmUgdHogPSBjYWwuZ2V0VGltZVpvbmUoKTsKKyAgICAgICAgaW50IG9mZnNldCA9IHR6LmdldE9mZnNldChjYWwuZ2V0KENhbGVuZGFyLkVSQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsLmdldChDYWxlbmRhci5ZRUFSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCkpOworICAgICAgICBTdHJpbmdCdWZmZXIgdHpNYXJrZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG9mZnNldCA8IDAgPyAiLSIgOiAiKyIpOworICAgICAgICBvZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOworICAgICAgICBpbnQgaG91cnMgPSBvZmZzZXQgLyAoT05FX0hPVVIgKiBPTkVfTUlOVVRFICogT05FX1NFQ09ORCk7CisgICAgICAgIGludCBtaW51dGVzID0gb2Zmc2V0IC8gKE9ORV9NSU5VVEUgKiBPTkVfU0VDT05EKSAtIE9ORV9IT1VSICogaG91cnM7CisgICAgICAgIGlmIChob3VycyA8IFRFTikgeworICAgICAgICAgICAgdHpNYXJrZXIuYXBwZW5kKCIwIik7CisgICAgICAgIH0KKyAgICAgICAgdHpNYXJrZXIuYXBwZW5kKGhvdXJzKTsKKyAgICAgICAgaWYgKG1pbnV0ZXMgPCBURU4pIHsKKyAgICAgICAgICAgIHR6TWFya2VyLmFwcGVuZCgiMCIpOworICAgICAgICB9CisgICAgICAgIHR6TWFya2VyLmFwcGVuZChtaW51dGVzKTsKKyAgICAgICAgcmV0dXJuIERBVEVfSEVBREVSX0ZPUk1BVC5mb3JtYXQoY2FsLmdldFRpbWUoKSkgKyB0ek1hcmtlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgc3RyaW5nIGFzIGEgZGF0ZXRpbWUgdXNpbmcgdGhlIElTTzg2MDFfREFURVRJTUUgZm9ybWF0IHdoaWNoIGlzCisgICAgICogPGNvZGU+eXl5eS1NTS1kZCdUJ0hIOm1tOnNzPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGVzdHIgc3RyaW5nIHRvIGJlIHBhcnNlZAorICAgICAqCisgICAgICogQHJldHVybiBhIGphdmEudXRpbC5EYXRlIG9iamVjdCBhcyBwYXJzZWQgYnkgdGhlIGZvcm1hdC4KKyAgICAgKiBAZXhjZXB0aW9uIFBhcnNlRXhjZXB0aW9uIGlmIHRoZSBzdXBwbGllZCBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZCBieQorICAgICAqIHRoaXMgcGF0dGVybi4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBwYXJzZUlzbzg2MDFEYXRlVGltZShTdHJpbmcgZGF0ZXN0cikKKyAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KElTTzg2MDFfREFURVRJTUVfUEFUVEVSTikucGFyc2UoZGF0ZXN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYSBzdHJpbmcgYXMgYSBkYXRlIHVzaW5nIHRoZSBJU084NjAxX0RBVEUgZm9ybWF0IHdoaWNoIGlzCisgICAgICogPGNvZGU+eXl5eS1NTS1kZDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRlc3RyIHN0cmluZyB0byBiZSBwYXJzZWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBqYXZhLnV0aWwuRGF0ZSBvYmplY3QgYXMgcGFyc2VkIGJ5IHRoZSBmb3JtYXQuCisgICAgICogQGV4Y2VwdGlvbiBQYXJzZUV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGNhbm5vdCBiZSBwYXJzZWQgYnkKKyAgICAgKiB0aGlzIHBhdHRlcm4uCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGUgcGFyc2VJc284NjAxRGF0ZShTdHJpbmcgZGF0ZXN0cikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KElTTzg2MDFfREFURV9QQVRURVJOKS5wYXJzZShkYXRlc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIHN0cmluZyBhcyBhIGRhdGUgdXNpbmcgdGhlIGVpdGhlciB0aGUgSVNPODYwMV9EQVRFVElNRQorICAgICAqIG9yIElTTzg2MDFfREFURSBmb3JtYXRzLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGVzdHIgc3RyaW5nIHRvIGJlIHBhcnNlZAorICAgICAqCisgICAgICogQHJldHVybiBhIGphdmEudXRpbC5EYXRlIG9iamVjdCBhcyBwYXJzZWQgYnkgdGhlIGZvcm1hdHMuCisgICAgICogQGV4Y2VwdGlvbiBQYXJzZUV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGNhbm5vdCBiZSBwYXJzZWQgYnkKKyAgICAgKiBlaXRoZXIgb2YgdGhlc2UgcGF0dGVybnMuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGUgcGFyc2VJc284NjAxRGF0ZVRpbWVPckRhdGUoU3RyaW5nIGRhdGVzdHIpCisgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VJc284NjAxRGF0ZVRpbWUoZGF0ZXN0cik7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHB4KSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VJc284NjAxRGF0ZShkYXRlc3RyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGV3ZXlEZWNpbWFsLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0Rld2V5RGVjaW1hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYTM5NDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0Rld2V5RGVjaW1hbC5qYXZhCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gY29udGFpbiB2ZXJzaW9uIG51bWJlcnMgaW4gIkRld2V5IERlY2ltYWwiCisgKiBzeW50YXguICBOdW1iZXJzIGluIHRoZSAiRGV3ZXkgRGVjaW1hbCIgc3ludGF4IGNvbnNpc3Qgb2YgcG9zaXRpdmUKKyAqIGRlY2ltYWwgaW50ZWdlcnMgc2VwYXJhdGVkIGJ5IHBlcmlvZHMgIi4iLiAgRm9yIGV4YW1wbGUsICIyLjAiIG9yCisgKiAiMS4yLjMuNC41LjYuNyIuICBUaGlzIGFsbG93cyBhbiBleHRlbnNpYmxlIG51bWJlciB0byBiZSB1c2VkIHRvCisgKiByZXByZXNlbnQgbWFqb3IsIG1pbm9yLCBtaWNybywgZXRjIHZlcnNpb25zLiAgVGhlIHZlcnNpb24gbnVtYmVyCisgKiBtdXN0IGJlZ2luIHdpdGggYSBudW1iZXIuCisgKgorICovCitwdWJsaWMgY2xhc3MgRGV3ZXlEZWNpbWFsIHsKKworICAgIC8qKiBBcnJheSBvZiBjb21wb25lbnRzIHRoYXQgbWFrZSB1cCBEZXdleURlY2ltYWwgKi8KKyAgICBwcml2YXRlIGludFtdIGNvbXBvbmVudHM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBEZXdleURlY2ltYWwgZnJvbSBhbiBhcnJheSBvZiBpbnRlZ2VyIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50cyBhbiBhcnJheSBvZiBpbnRlZ2VyIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHVibGljIERld2V5RGVjaW1hbChmaW5hbCBpbnRbXSBjb21wb25lbnRzKSB7CisgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IG5ldyBpbnRbY29tcG9uZW50cy5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbXBvbmVudHMsIDAsIHRoaXMuY29tcG9uZW50cywgMCwgY29tcG9uZW50cy5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIERld2V5RGVjaW1hbCBmcm9tIHN0cmluZyBpbiBEZXdleURlY2ltYWwgZm9ybWF0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIGluIGRld2V5IGRlY2ltYWwgZm9ybWF0CisgICAgICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgc3RyaW5nIGlzIG1hbGZvcm1lZAorICAgICAqLworICAgIHB1YmxpYyBEZXdleURlY2ltYWwoZmluYWwgU3RyaW5nIHN0cmluZykKKyAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cmluZywgIi4iLCB0cnVlKTsKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKKworICAgICAgICBjb21wb25lbnRzID0gbmV3IGludFsgKHNpemUgKyAxKSAvIDIgXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb21wb25lbnQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJFbXB0eSBjb21wb25lbnQgaW4gc3RyaW5nIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbXBvbmVudHNbIGkgXSA9IEludGVnZXIucGFyc2VJbnQoY29tcG9uZW50KTsKKworICAgICAgICAgICAgLy9TdHJpcCAnLicgdG9rZW4KKyAgICAgICAgICAgIGlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgdG9rZW5pemVyLm5leHRUb2tlbigpOworCisgICAgICAgICAgICAgICAgLy9JZiBpdCBlbmRlZCBpbiBhIGRvdCwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgaWYgKCF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIkRld2V5RGVjaW1hbCBlbmRlZCBpbiBhICcuJyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBudW1iZXIgb2YgY29tcG9uZW50cyBpbiA8Y29kZT5EZXdleURlY2ltYWw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gZGV3ZXkgZGVjaW1hbAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudHMubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29tcG9uZW50IGF0IHNwZWNpZmllZCBpbmRleC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgY29tcG9uZW50cworICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIGNvbXBvbmVudCBhdCBpbmRleAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0KGZpbmFsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gY29tcG9uZW50c1sgaW5kZXggXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5EZXdleURlY2ltYWw8L2NvZGU+IGlzCisgICAgICogZXF1YWwgdG8gdGhlIG90aGVyIDxjb2RlPkRld2V5RGVjaW1hbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIERld2V5RGVjaW1hbAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbCB0byBvdGhlciBEZXdleURlY2ltYWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXF1YWwoZmluYWwgRGV3ZXlEZWNpbWFsIG90aGVyKSB7CisgICAgICAgIGZpbmFsIGludCBtYXggPSBNYXRoLm1heChvdGhlci5jb21wb25lbnRzLmxlbmd0aCwgY29tcG9uZW50cy5sZW5ndGgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb21wb25lbnQxID0gKGkgPCBjb21wb25lbnRzLmxlbmd0aCkgPyBjb21wb25lbnRzWyBpIF0gOiAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvbXBvbmVudDIgPSAoaSA8IG90aGVyLmNvbXBvbmVudHMubGVuZ3RoKSA/IG90aGVyLmNvbXBvbmVudHNbIGkgXSA6IDA7CisKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQyICE9IGNvbXBvbmVudDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRXhhY3QgbWF0Y2gKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5EZXdleURlY2ltYWw8L2NvZGU+IGlzCisgICAgICogbGVzcyB0aGFuIHRoZSBvdGhlciA8Y29kZT5EZXdleURlY2ltYWw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBEZXdleURlY2ltYWwKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbGVzcyB0aGFuIG90aGVyIERld2V5RGVjaW1hbCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMZXNzVGhhbihmaW5hbCBEZXdleURlY2ltYWwgb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuICFpc0dyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgPGNvZGU+RGV3ZXlEZWNpbWFsPC9jb2RlPiBpcworICAgICAqIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIgPGNvZGU+RGV3ZXlEZWNpbWFsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdGhlciB0aGUgb3RoZXIgRGV3ZXlEZWNpbWFsCisgICAgICogQHJldHVybiB0cnVlIGlmIGxlc3MgdGhhbiBvciBlcXVhbCB0byBvdGhlciBEZXdleURlY2ltYWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTGVzc1RoYW5PckVxdWFsKGZpbmFsIERld2V5RGVjaW1hbCBvdGhlcikgeworICAgICAgICByZXR1cm4gIWlzR3JlYXRlclRoYW4ob3RoZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIDxjb2RlPkRld2V5RGVjaW1hbDwvY29kZT4gaXMKKyAgICAgKiBncmVhdGVyIHRoYW4gdGhlIG90aGVyIDxjb2RlPkRld2V5RGVjaW1hbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIERld2V5RGVjaW1hbAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBncmVhdGVyIHRoYW4gb3RoZXIgRGV3ZXlEZWNpbWFsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0dyZWF0ZXJUaGFuKGZpbmFsIERld2V5RGVjaW1hbCBvdGhlcikgeworICAgICAgICBmaW5hbCBpbnQgbWF4ID0gTWF0aC5tYXgob3RoZXIuY29tcG9uZW50cy5sZW5ndGgsIGNvbXBvbmVudHMubGVuZ3RoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY29tcG9uZW50MSA9IChpIDwgY29tcG9uZW50cy5sZW5ndGgpID8gY29tcG9uZW50c1sgaSBdIDogMDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb21wb25lbnQyID0gKGkgPCBvdGhlci5jb21wb25lbnRzLmxlbmd0aCkgPyBvdGhlci5jb21wb25lbnRzWyBpIF0gOiAwOworCisgICAgICAgICAgICBpZiAoY29tcG9uZW50MiA+IGNvbXBvbmVudDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tcG9uZW50MiA8IGNvbXBvbmVudDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRXhhY3QgbWF0Y2gKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5EZXdleURlY2ltYWw8L2NvZGU+IGlzCisgICAgICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvdGhlciA8Y29kZT5EZXdleURlY2ltYWw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG90aGVyIHRoZSBvdGhlciBEZXdleURlY2ltYWwKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG90aGVyIERld2V5RGVjaW1hbCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNHcmVhdGVyVGhhbk9yRXF1YWwoZmluYWwgRGV3ZXlEZWNpbWFsIG90aGVyKSB7CisgICAgICAgIGZpbmFsIGludCBtYXggPSBNYXRoLm1heChvdGhlci5jb21wb25lbnRzLmxlbmd0aCwgY29tcG9uZW50cy5sZW5ndGgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb21wb25lbnQxID0gKGkgPCBjb21wb25lbnRzLmxlbmd0aCkgPyBjb21wb25lbnRzWyBpIF0gOiAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvbXBvbmVudDIgPSAoaSA8IG90aGVyLmNvbXBvbmVudHMubGVuZ3RoKSA/IG90aGVyLmNvbXBvbmVudHNbIGkgXSA6IDA7CisKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQyID4gY29tcG9uZW50MSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb21wb25lbnQyIDwgY29tcG9uZW50MSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7IC8vIEV4YWN0IG1hdGNoCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiA8Y29kZT5EZXdleURlY2ltYWw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIERld2V5RGVjaW1hbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcuJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoY29tcG9uZW50c1sgaSBdKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZU5hbWVNYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZU5hbWVNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQzMmIzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlTmFtZU1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCisvKioKKyAqIEludGVyZmFjZSB0byBiZSB1c2VkIGJ5IFNvdXJjZUZpbGVTY2FubmVyLgorICoKKyAqIDxwPlVzZWQgdG8gZmluZCB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUocykgY29ycmVzcG9uZGluZyB0byBhCisgKiBzb3VyY2UgZmlsZS48L3A+CisgKgorICogPHA+VGhlIHJ1bGUgYnkgd2hpY2ggdGhlIGZpbGUgbmFtZXMgYXJlIHRyYW5zZm9ybWVkIGlzIHNwZWNpZmllZAorICogdmlhIHRoZSBzZXRGcm9tIGFuZCBzZXRUbyBtZXRob2RzLiBUaGUgZXhhY3QgbWVhbmluZyBvZiB0aGVzZSBpcworICogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LjwvcD4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmlsZU5hbWVNYXBwZXIgeworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZnJvbSBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBydWxlLgorICAgICAqIEBwYXJhbSBmcm9tIGEgc3RyaW5nLgorICAgICAqLworICAgIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0byBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBydWxlLgorICAgICAqIEBwYXJhbSB0byBhIHN0cmluZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFRvKFN0cmluZyB0byk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHRhcmdldCBmaWxlbmFtZShzKSBmb3IgdGhlCisgICAgICogZ2l2ZW4gc291cmNlIGZpbGUuCisgICAgICoKKyAgICAgKiA8cD5pZiB0aGUgZ2l2ZW4gcnVsZSBkb2Vzbid0IGFwcGx5IHRvIHRoZSBzb3VyY2UgZmlsZSwKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBtdXN0IHJldHVybiBudWxsLiBTb3VyY2VGaWxlU2Nhbm5lciB3aWxsIHRoZW4KKyAgICAgKiBvbWl0IHRoZSBzb3VyY2UgZmlsZSBpbiBxdWVzdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHJlbGF0aXZlIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHNvbWUgZ2l2ZW4gYmFzZWRpcmVjdG9yeS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3MgaWYgdGhlIHJ1bGQgYXBwbGllcyB0byB0aGUgc291cmNlIGZpbGUsIG9yCisgICAgICogICAgICAgICBudWxsIGlmIGl0IGRvZXMgbm90LgorICAgICAqLworICAgIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSk7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVUb2tlbml6ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVRva2VuaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZWU5NzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVUb2tlbml6ZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CisKKy8qKgorICogQ2xhc3MgdG8gcmVhZCB0aGUgY29tcGxldGUgaW5wdXQgaW50byBhIHN0cmluZy4KKyAqIEBzaW5jZSBBbnQgMS43CisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVG9rZW5pemVyIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCBpbXBsZW1lbnRzIFRva2VuaXplciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbXBsZXRlIGlucHV0IGFzIGEgc3RyaW5nCisgICAgICogQHBhcmFtIGluIHRoZSByZWFkZXIgb2JqZWN0CisgICAgICogQHJldHVybiB0aGUgY29tcGxldGUgaW5wdXQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGVycm9yIHJlYWRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKFJlYWRlciBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5yZWFkRnVsbHkoaW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW50cmEtdG9rZW4gc3RyaW5nCisgICAgICogQHJldHVybiBhbiBlbXB0eSBzdHJpbmcgYWx3YXlzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQb3N0VG9rZW4oKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVVdGlscy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY2OTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlVXRpbHMuamF2YQpAQCAtMCwwICsxLDE1NzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUGF0aFRva2VuaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5Mb2NhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJTZXRDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBhbHNvIGVuY2Fwc3VsYXRlcyBtZXRob2RzIHdoaWNoIGFsbG93IEZpbGVzIHRvIGJlCisgKiByZWZlcnJlZCB0byB1c2luZyBhYnN0cmFjdCBwYXRoIG5hbWVzIHdoaWNoIGFyZSB0cmFuc2xhdGVkIHRvIG5hdGl2ZQorICogc3lzdGVtIGZpbGUgcGF0aHMgYXQgcnVudGltZSBhcyB3ZWxsIGFzIGNvcHlpbmcgZmlsZXMgb3Igc2V0dGluZworICogdGhlaXIgbGFzdCBtb2RpZmljYXRpb24gdGltZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfU1BBQ0UgPSA1MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgUFJJTUFSWV9JTlNUQU5DRSA9IG5ldyBGaWxlVXRpbHMoKTsKKworICAgIC8vZ2V0IHNvbWUgbm9uLWNyeXB0by1ncmFkZSByYW5kb21uZXNzIGZyb20gdmFyaW91cyBwbGFjZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisgICAgICAgICAgICArIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIE9OX05FVFdBUkUgPSBPcy5pc0ZhbWlseSgibmV0d2FyZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gT05fRE9TID0gT3MuaXNGYW1pbHkoImRvcyIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gT05fV0lOOVggPSBPcy5pc0ZhbWlseSgid2luOXgiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIE9OX1dJTkRPV1MgPSBPcy5pc0ZhbWlseSgid2luZG93cyIpOworCisgICAgc3RhdGljIGZpbmFsIGludCBCVUZfU0laRSA9IDgxOTI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBncmFudWxhcml0eSBvZiB0aW1lc3RhbXBzIHVuZGVyIEZBVC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRkFUX0ZJTEVfVElNRVNUQU1QX0dSQU5VTEFSSVRZID0gMjAwMDsKKworICAgIC8qKgorICAgICAqIFRoZSBncmFudWxhcml0eSBvZiB0aW1lc3RhbXBzIHVuZGVyIFVuaXguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFVOSVhfRklMRV9USU1FU1RBTVBfR1JBTlVMQVJJVFkgPSAxMDAwOworCisgICAgLyoqCisgICAgICogVGhlIGdyYW51bGFyaXR5IG9mIHRpbWVzdGFtcHMgdW5kZXIgdGhlIE5UIEZpbGUgU3lzdGVtLgorICAgICAqIE5URlMgaGFzIGEgZ3JhbnVsYXJpdHkgb2YgMTAwIG5hbm9zZWNvbmRzLCB3aGljaCBpcyBsZXNzCisgICAgICogdGhhbiAxIG1pbGxpc2Vjb25kLCBzbyB3ZSByb3VuZCB0aGlzIHVwIHRvIDEgbWlsbGlzZWNvbmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE5URlNfRklMRV9USU1FU1RBTVBfR1JBTlVMQVJJVFkgPSAxOworCisgICAgLyoqCisgICAgICogQSBvbmUgaXRlbSBjYWNoZSBmb3IgZnJvbVVyaS4KKyAgICAgKiBmcm9tVXJpIGlzIGNhbGxlZCBmb3IgZWFjaCBlbGVtZW50IHdoZW4gcGFyc2VpbmcgYW50IGJ1aWxkCisgICAgICogZmlsZXMuIEl0IGlzIGEgY29zdGx5IG9wZXJhdGlvbi4gVGhpcyBqdXN0IGNhY2hlcyB0aGUgcmVzdWx0CisgICAgICogb2YgdGhlIGxhc3QgY2FsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBjYWNoZUZyb21VcmlMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgU3RyaW5nIGNhY2hlRnJvbVVyaVJlcXVlc3QgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGNhY2hlRnJvbVVyaVJlc3BvbnNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBGaWxlVXRpbHMuCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgorICAgICAqICAgICAgICAgICAgIFVzZSBnZXRGaWxlVXRpbHMgaW5zdGVhZCwKKyAgICAgKiBGaWxlVXRpbHMgZG8gbm90IGhhdmUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlVXRpbHMgbmV3RmlsZVV0aWxzKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGVVdGlscygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCB0byByZXRyaWV2ZSBUaGUgRmlsZVV0aWxzLCB3aGljaCBpcyBzaGFyZWQgYnkgYWxsIHVzZXJzIG9mIHRoaXMKKyAgICAgKiBtZXRob2QuCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBGaWxlVXRpbHMuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZVV0aWxzIGdldEZpbGVVdGlscygpIHsKKyAgICAgICAgcmV0dXJuIFBSSU1BUllfSU5TVEFOQ0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW1wdHkgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGVVdGlscygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFVSTCBmb3IgYSBmaWxlIHRha2luZyBpbnRvIGFjY291bnQgIyBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgd2hvc2UgVVJMIHJlcHJlc2VudGF0aW9uIGlzIHJlcXVpcmVkLgorICAgICAqIEByZXR1cm4gVGhlIEZpbGVVUkwgdmFsdWUuCisgICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIFVSTCByZXByZXNlbnRhdGlvbiBjYW5ub3QgYmUKKyAgICAgKiAgICAgIGZvcm1lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldEZpbGVVUkwoRmlsZSBmaWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVUkwodG9VUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb3B5IGEgZmlsZSBmcm9tIGEgc291cmNlIHRvIGEgZGVzdGluYXRpb24uCisgICAgICogTm8gZmlsdGVyaW5nIGlzIHBlcmZvcm1lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIE5hbWUgb2YgZmlsZSB0byBjb3B5IGZyb20uCisgICAgICogICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGRlc3RGaWxlIE5hbWUgb2YgZmlsZSB0byBjb3B5IHRvLgorICAgICAqICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGNvcHlpbmcgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29weUZpbGUoU3RyaW5nIHNvdXJjZUZpbGUsIFN0cmluZyBkZXN0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weUZpbGUobmV3IEZpbGUoc291cmNlRmlsZSksIG5ldyBGaWxlKGRlc3RGaWxlKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uCisgICAgICogc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGUgTmFtZSBvZiBmaWxlIHRvIGNvcHkgZnJvbS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgTmFtZSBvZiBmaWxlIHRvIGNvcHkgdG8uCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWx0ZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhpcyBjb3B5LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29weWluZyBmYWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc291cmNlRmlsZSwgU3RyaW5nIGRlc3RGaWxlLCBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb3B5RmlsZShuZXcgRmlsZShzb3VyY2VGaWxlKSwgbmV3IEZpbGUoZGVzdEZpbGUpLCBmaWx0ZXJzLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb3B5IGEgZmlsZSBmcm9tIGEgc291cmNlIHRvIGEgZGVzdGluYXRpb24gc3BlY2lmeWluZyBpZiB0b2tlbgorICAgICAqIGZpbHRlcmluZyBtdXN0IGJlIHVzZWQgYW5kIGlmIHNvdXJjZSBmaWxlcyBtYXkgb3ZlcndyaXRlIG5ld2VyIGRlc3RpbmF0aW9uIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGUgTmFtZSBvZiBmaWxlIHRvIGNvcHkgZnJvbS4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGRlc3RGaWxlIE5hbWUgb2YgZmlsZSB0byBjb3B5IHRvLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmlsdGVycyB0aGUgY29sbGVjdGlvbiBvZiBmaWx0ZXJzIHRvIGFwcGx5IHRvIHRoaXMgY29weS4KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIFdoZXRoZXIgb3Igbm90IHRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5CisgICAgICogICAgICAgICAgICBleGlzdHMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjb3B5aW5nIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGaWxlLCBTdHJpbmcgZGVzdEZpbGUsIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weUZpbGUobmV3IEZpbGUoc291cmNlRmlsZSksIG5ldyBGaWxlKGRlc3RGaWxlKSwgZmlsdGVycywgb3ZlcndyaXRlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYSBkZXN0aW5hdGlvbgorICAgICAqIHNwZWNpZnlpbmcgaWYgdG9rZW4KKyAgICAgKiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLCBpZiBzb3VyY2UgZmlsZXMgbWF5IG92ZXJ3cml0ZSBuZXdlciBkZXN0aW5hdGlvbgorICAgICAqIGZpbGVzIGFuZCB0aGUgbGFzdAorICAgICAqIG1vZGlmaWVkIHRpbWUgb2YgPGNvZGU+ZGVzdEZpbGU8L2NvZGU+IGZpbGUgc2hvdWxkIGJlIG1hZGUgZXF1YWwgdG8KKyAgICAgKiB0aGUgbGFzdCBtb2RpZmllZCB0aW1lCisgICAgICogb2YgPGNvZGU+c291cmNlRmlsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZSBOYW1lIG9mIGZpbGUgdG8gY29weSBmcm9tLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgTmFtZSBvZiBmaWxlIHRvIGNvcHkgdG8uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWx0ZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhpcyBjb3B5LgorICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hldGhlciBvciBub3QgdGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAgICAgKiBAcGFyYW0gcHJlc2VydmVMYXN0TW9kaWZpZWQgV2hldGhlciBvciBub3QgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZgorICAgICAqICAgICAgICAgICAgdGhlIHJlc3VsdGluZyBmaWxlCisgICAgICogICAgICAgICAgICBzaG91bGQgYmUgc2V0IHRvIHRoYXQgb2YgdGhlIHNvdXJjZSBmaWxlLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29weWluZyBmYWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc291cmNlRmlsZSwgU3RyaW5nIGRlc3RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weUZpbGUobmV3IEZpbGUoc291cmNlRmlsZSksIG5ldyBGaWxlKGRlc3RGaWxlKSwgZmlsdGVycywgb3ZlcndyaXRlLAorICAgICAgICAgICAgICAgICBwcmVzZXJ2ZUxhc3RNb2RpZmllZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYSBkZXN0aW5hdGlvbiBzcGVjaWZ5aW5nIGlmIHRva2VuCisgICAgICogZmlsdGVyaW5nIG11c3QgYmUgdXNlZCwgaWYgc291cmNlIGZpbGVzIG1heSBvdmVyd3JpdGUgbmV3ZXIgZGVzdGluYXRpb24gZmlsZXMgYW5kIHRoZSBsYXN0CisgICAgICogbW9kaWZpZWQgdGltZSBvZiA8Y29kZT5kZXN0RmlsZTwvY29kZT4gZmlsZSBzaG91bGQgYmUgbWFkZSBlcXVhbCB0byB0aGUgbGFzdCBtb2RpZmllZCB0aW1lCisgICAgICogb2YgPGNvZGU+c291cmNlRmlsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZSBOYW1lIG9mIGZpbGUgdG8gY29weSBmcm9tLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgTmFtZSBvZiBmaWxlIHRvIGNvcHkgdG8uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWx0ZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhpcyBjb3B5LgorICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hldGhlciBvciBub3QgdGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkKKyAgICAgKiAgICAgICAgICAgIGV4aXN0cy4KKyAgICAgKiBAcGFyYW0gcHJlc2VydmVMYXN0TW9kaWZpZWQgV2hldGhlciBvciBub3QgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUgcmVzdWx0aW5nIGZpbGUKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSBzZXQgdG8gdGhhdCBvZiB0aGUgc291cmNlIGZpbGUuCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSBmaWxlcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGNvcHlpbmcgZmFpbHMuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGaWxlLCBTdHJpbmcgZGVzdEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLCBib29sZWFuIG92ZXJ3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlTGFzdE1vZGlmaWVkLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvcHlGaWxlKG5ldyBGaWxlKHNvdXJjZUZpbGUpLCBuZXcgRmlsZShkZXN0RmlsZSksIGZpbHRlcnMsCisgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZSwgcHJlc2VydmVMYXN0TW9kaWZpZWQsIGVuY29kaW5nKTsKKyAgICB9CisKKyAgICAvLyBDaGVja1N0eWxlOlBhcmFtZXRlck51bWJlckNoZWNrIE9GRiAtIGJjCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYQorICAgICAqIGRlc3RpbmF0aW9uIHNwZWNpZnlpbmcgaWYgdG9rZW4gZmlsdGVyaW5nIG11c3QgYmUgdXNlZCwgaWYKKyAgICAgKiBmaWx0ZXIgY2hhaW5zIG11c3QgYmUgdXNlZCwgaWYgc291cmNlIGZpbGVzIG1heSBvdmVyd3JpdGUKKyAgICAgKiBuZXdlciBkZXN0aW5hdGlvbiBmaWxlcyBhbmQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZgorICAgICAqIDxjb2RlPmRlc3RGaWxlPC9jb2RlPiBmaWxlIHNob3VsZCBiZSBtYWRlIGVxdWFsCisgICAgICogdG8gdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiA8Y29kZT5zb3VyY2VGaWxlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIE5hbWUgb2YgZmlsZSB0byBjb3B5IGZyb20uCisgICAgICogICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGRlc3RGaWxlIE5hbWUgb2YgZmlsZSB0byBjb3B5IHRvLgorICAgICAqICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmlsdGVycyB0aGUgY29sbGVjdGlvbiBvZiBmaWx0ZXJzIHRvIGFwcGx5IHRvIHRoaXMgY29weS4KKyAgICAgKiBAcGFyYW0gZmlsdGVyQ2hhaW5zIGZpbHRlckNoYWlucyB0byBhcHBseSBkdXJpbmcgdGhlIGNvcHkuCisgICAgICogQHBhcmFtIG92ZXJ3cml0ZSBXaGV0aGVyIG9yIG5vdCB0aGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICAgICAqIEBwYXJhbSBwcmVzZXJ2ZUxhc3RNb2RpZmllZCBXaGV0aGVyIG9yIG5vdCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgZmlsZSBzaG91bGQgYmUgc2V0IHRvIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNvdXJjZSBmaWxlLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdXNlZCB0byByZWFkIGFuZCB3cml0ZSB0aGUgZmlsZXMuCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjb3B5aW5nIGZhaWxzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc291cmNlRmlsZSwgU3RyaW5nIGRlc3RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywgVmVjdG9yIGZpbHRlckNoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcsIFByb2plY3QgcHJvamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weUZpbGUobmV3IEZpbGUoc291cmNlRmlsZSksIG5ldyBGaWxlKGRlc3RGaWxlKSwgZmlsdGVycywgZmlsdGVyQ2hhaW5zLCBvdmVyd3JpdGUsCisgICAgICAgICAgICAgICAgcHJlc2VydmVMYXN0TW9kaWZpZWQsIGVuY29kaW5nLCBwcm9qZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uIHNwZWNpZnlpbmcgaWYgdG9rZW4KKyAgICAgKiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLCBpZiBmaWx0ZXIgY2hhaW5zIG11c3QgYmUgdXNlZCwgaWYgc291cmNlIGZpbGVzIG1heSBvdmVyd3JpdGUgbmV3ZXIKKyAgICAgKiBkZXN0aW5hdGlvbiBmaWxlcyBhbmQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiA8Y29kZT5kZXN0RmlsZTwvY29kZT4gZmlsZSBzaG91bGQgYmUgbWFkZQorICAgICAqIGVxdWFsIHRvIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgPGNvZGU+c291cmNlRmlsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZSBOYW1lIG9mIGZpbGUgdG8gY29weSBmcm9tLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgTmFtZSBvZiBmaWxlIHRvIGNvcHkgdG8uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWx0ZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhpcyBjb3B5LgorICAgICAqIEBwYXJhbSBmaWx0ZXJDaGFpbnMgZmlsdGVyQ2hhaW5zIHRvIGFwcGx5IGR1cmluZyB0aGUgY29weS4KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIFdoZXRoZXIgb3Igbm90IHRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5CisgICAgICogICAgICAgICAgICBleGlzdHMuCisgICAgICogQHBhcmFtIHByZXNlcnZlTGFzdE1vZGlmaWVkIFdoZXRoZXIgb3Igbm90IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgdGhlIHJlc3VsdGluZyBmaWxlCisgICAgICogICAgICAgICAgICBzaG91bGQgYmUgc2V0IHRvIHRoYXQgb2YgdGhlIHNvdXJjZSBmaWxlLgorICAgICAqIEBwYXJhbSBpbnB1dEVuY29kaW5nIHRoZSBlbmNvZGluZyB1c2VkIHRvIHJlYWQgdGhlIGZpbGVzLgorICAgICAqIEBwYXJhbSBvdXRwdXRFbmNvZGluZyB0aGUgZW5jb2RpbmcgdXNlZCB0byB3cml0ZSB0aGUgZmlsZXMuCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjb3B5aW5nIGZhaWxzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc291cmNlRmlsZSwgU3RyaW5nIGRlc3RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywgVmVjdG9yIGZpbHRlckNoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRFbmNvZGluZywgU3RyaW5nIG91dHB1dEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgcHJvamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weUZpbGUobmV3IEZpbGUoc291cmNlRmlsZSksIG5ldyBGaWxlKGRlc3RGaWxlKSwgZmlsdGVycywgZmlsdGVyQ2hhaW5zLCBvdmVyd3JpdGUsCisgICAgICAgICAgICAgICAgcHJlc2VydmVMYXN0TW9kaWZpZWQsIGlucHV0RW5jb2RpbmcsIG91dHB1dEVuY29kaW5nLCBwcm9qZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uLiBObyBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIGZpbGUgdG8gY29weSBmcm9tLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgdGhlIGZpbGUgdG8gY29weSB0by4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjb3B5aW5nIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsIG51bGwsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYSBkZXN0aW5hdGlvbgorICAgICAqIHNwZWNpZnlpbmcgaWYgdG9rZW4gZmlsdGVyaW5nIG11c3QgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIHRoZSBmaWxlIHRvIGNvcHkgZnJvbS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgdGhlIGZpbGUgdG8gY29weSB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGZpbHRlcnMgdGhlIGNvbGxlY3Rpb24gb2YgZmlsdGVycyB0byBhcHBseSB0byB0aGlzIGNvcHkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjb3B5aW5nIGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsIGZpbHRlcnMsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvcHkgYSBmaWxlIGZyb20gYSBzb3VyY2UgdG8gYQorICAgICAqIGRlc3RpbmF0aW9uIHNwZWNpZnlpbmcgaWYgdG9rZW4gZmlsdGVyaW5nIG11c3QgYmUgdXNlZCBhbmQgaWYKKyAgICAgKiBzb3VyY2UgZmlsZXMgbWF5IG92ZXJ3cml0ZSBuZXdlciBkZXN0aW5hdGlvbiBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIHRoZSBmaWxlIHRvIGNvcHkgZnJvbS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZGVzdEZpbGUgdGhlIGZpbGUgdG8gY29weSB0by4KKyAgICAgKiAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGZpbHRlcnMgdGhlIGNvbGxlY3Rpb24gb2YgZmlsdGVycyB0byBhcHBseSB0byB0aGlzIGNvcHkuCisgICAgICogQHBhcmFtIG92ZXJ3cml0ZSBXaGV0aGVyIG9yIG5vdCB0aGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29weWluZyBmYWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUsIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsIGZpbHRlcnMsIG92ZXJ3cml0ZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb3B5IGEgZmlsZSBmcm9tIGEgc291cmNlIHRvIGEKKyAgICAgKiBkZXN0aW5hdGlvbiBzcGVjaWZ5aW5nIGlmIHRva2VuIGZpbHRlcmluZyBtdXN0IGJlIHVzZWQsIGlmCisgICAgICogc291cmNlIGZpbGVzIG1heSBvdmVyd3JpdGUgbmV3ZXIgZGVzdGluYXRpb24gZmlsZXMgYW5kIHRoZQorICAgICAqIGxhc3QgbW9kaWZpZWQgdGltZSBvZiA8Y29kZT5kZXN0RmlsZTwvY29kZT4gZmlsZSBzaG91bGQgYmUgbWFkZSBlcXVhbAorICAgICAqIHRvIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgPGNvZGU+c291cmNlRmlsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgZmlsZSB0byBjb3B5IGZyb20uCisgICAgICogICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGRlc3RGaWxlIHRoZSBmaWxlIHRvIGNvcHkgdG8uCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWx0ZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhpcyBjb3B5LgorICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hldGhlciBvciBub3QgdGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAgICAgKiBAcGFyYW0gcHJlc2VydmVMYXN0TW9kaWZpZWQgV2hldGhlciBvciBub3QgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0aW5nIGZpbGUgc2hvdWxkIGJlIHNldCB0byB0aGF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGNvcHlpbmcgZmFpbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29weUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlLCBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvdmVyd3JpdGUsIGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlLCBmaWx0ZXJzLCBvdmVyd3JpdGUsIHByZXNlcnZlTGFzdE1vZGlmaWVkLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhIGRlc3RpbmF0aW9uIHNwZWNpZnlpbmcgaWYgdG9rZW4KKyAgICAgKiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLCBpZiBzb3VyY2UgZmlsZXMgbWF5IG92ZXJ3cml0ZSBuZXdlciBkZXN0aW5hdGlvbiBmaWxlcywgdGhlIGxhc3QKKyAgICAgKiBtb2RpZmllZCB0aW1lIG9mIDxjb2RlPmRlc3RGaWxlPC9jb2RlPiBmaWxlIHNob3VsZCBiZSBtYWRlIGVxdWFsIHRvIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUKKyAgICAgKiBvZiA8Y29kZT5zb3VyY2VGaWxlPC9jb2RlPiBhbmQgd2hpY2ggY2hhcmFjdGVyIGVuY29kaW5nIHRvIGFzc3VtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIHRoZSBmaWxlIHRvIGNvcHkgZnJvbS4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGRlc3RGaWxlIHRoZSBmaWxlIHRvIGNvcHkgdG8uIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWx0ZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhpcyBjb3B5LgorICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hldGhlciBvciBub3QgdGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkKKyAgICAgKiAgICAgICAgICAgIGV4aXN0cy4KKyAgICAgKiBAcGFyYW0gcHJlc2VydmVMYXN0TW9kaWZpZWQgV2hldGhlciBvciBub3QgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUgcmVzdWx0aW5nIGZpbGUKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSBzZXQgdG8gdGhhdCBvZiB0aGUgc291cmNlIGZpbGUuCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSBmaWxlcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGNvcHlpbmcgZmFpbHMuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMsIGJvb2xlYW4gb3ZlcndyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weUZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUsIGZpbHRlcnMsIG51bGwsIG92ZXJ3cml0ZSwKKyAgICAgICAgICAgICAgICAgcHJlc2VydmVMYXN0TW9kaWZpZWQsIGVuY29kaW5nLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSBhIGZpbGUgZnJvbSBhIHNvdXJjZSB0byBhCisgICAgICogZGVzdGluYXRpb24gc3BlY2lmeWluZyBpZiB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLCBpZgorICAgICAqIGZpbHRlciBjaGFpbnMgbXVzdCBiZSB1c2VkLCBpZiBzb3VyY2UgZmlsZXMgbWF5IG92ZXJ3cml0ZQorICAgICAqIG5ld2VyIGRlc3RpbmF0aW9uIGZpbGVzIGFuZCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mCisgICAgICogPGNvZGU+ZGVzdEZpbGU8L2NvZGU+IGZpbGUgc2hvdWxkIGJlIG1hZGUgZXF1YWwKKyAgICAgKiB0byB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIDxjb2RlPnNvdXJjZUZpbGU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIGZpbGUgdG8gY29weSBmcm9tLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBkZXN0RmlsZSB0aGUgZmlsZSB0byBjb3B5IHRvLgorICAgICAqICAgICAgICAgICAgICAgICBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmlsdGVycyB0aGUgY29sbGVjdGlvbiBvZiBmaWx0ZXJzIHRvIGFwcGx5IHRvIHRoaXMgY29weS4KKyAgICAgKiBAcGFyYW0gZmlsdGVyQ2hhaW5zIGZpbHRlckNoYWlucyB0byBhcHBseSBkdXJpbmcgdGhlIGNvcHkuCisgICAgICogQHBhcmFtIG92ZXJ3cml0ZSBXaGV0aGVyIG9yIG5vdCB0aGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICAgICAqIEBwYXJhbSBwcmVzZXJ2ZUxhc3RNb2RpZmllZCBXaGV0aGVyIG9yIG5vdCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgZmlsZSBzaG91bGQgYmUgc2V0IHRvIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNvdXJjZSBmaWxlLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdXNlZCB0byByZWFkIGFuZCB3cml0ZSB0aGUgZmlsZXMuCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjb3B5aW5nIGZhaWxzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLCBWZWN0b3IgZmlsdGVyQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3ZlcndyaXRlLCBib29sZWFuIHByZXNlcnZlTGFzdE1vZGlmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZywgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb3B5RmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSwgZmlsdGVycywgZmlsdGVyQ2hhaW5zLAorICAgICAgICAgICAgICAgICBvdmVyd3JpdGUsIHByZXNlcnZlTGFzdE1vZGlmaWVkLCBlbmNvZGluZywgZW5jb2RpbmcsIHByb2plY3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb3B5IGEgZmlsZSBmcm9tIGEgc291cmNlIHRvIGEKKyAgICAgKiBkZXN0aW5hdGlvbiBzcGVjaWZ5aW5nIGlmIHRva2VuIGZpbHRlcmluZyBtdXN0IGJlIHVzZWQsIGlmCisgICAgICogZmlsdGVyIGNoYWlucyBtdXN0IGJlIHVzZWQsIGlmIHNvdXJjZSBmaWxlcyBtYXkgb3ZlcndyaXRlCisgICAgICogbmV3ZXIgZGVzdGluYXRpb24gZmlsZXMgYW5kIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YKKyAgICAgKiA8Y29kZT5kZXN0RmlsZTwvY29kZT4gZmlsZSBzaG91bGQgYmUgbWFkZSBlcXVhbAorICAgICAqIHRvIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgPGNvZGU+c291cmNlRmlsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgZmlsZSB0byBjb3B5IGZyb20uCisgICAgICogICAgICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGRlc3RGaWxlIHRoZSBmaWxlIHRvIGNvcHkgdG8uCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWx0ZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhpcyBjb3B5LgorICAgICAqIEBwYXJhbSBmaWx0ZXJDaGFpbnMgZmlsdGVyQ2hhaW5zIHRvIGFwcGx5IGR1cmluZyB0aGUgY29weS4KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIFdoZXRoZXIgb3Igbm90IHRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuCisgICAgICogQHBhcmFtIHByZXNlcnZlTGFzdE1vZGlmaWVkIFdoZXRoZXIgb3Igbm90IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdGluZyBmaWxlIHNob3VsZCBiZSBzZXQgdG8gdGhhdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc291cmNlIGZpbGUuCisgICAgICogQHBhcmFtIGlucHV0RW5jb2RpbmcgdGhlIGVuY29kaW5nIHVzZWQgdG8gcmVhZCB0aGUgZmlsZXMuCisgICAgICogQHBhcmFtIG91dHB1dEVuY29kaW5nIHRoZSBlbmNvZGluZyB1c2VkIHRvIHdyaXRlIHRoZSBmaWxlcy4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29weWluZyBmYWlscy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29weUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywgVmVjdG9yIGZpbHRlckNoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRFbmNvZGluZywgU3RyaW5nIG91dHB1dEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgcHJvamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VVdGlscy5jb3B5UmVzb3VyY2UoCisgICAgICAgICAgICBuZXcgRmlsZVJlc291cmNlKHNvdXJjZUZpbGUpLCBuZXcgRmlsZVJlc291cmNlKGRlc3RGaWxlKSwKKyAgICAgICAgICAgIGZpbHRlcnMsIGZpbHRlckNoYWlucywgb3ZlcndyaXRlLCBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKKyAgICAgICAgICAgIGlucHV0RW5jb2RpbmcsIG91dHB1dEVuY29kaW5nLCBwcm9qZWN0KTsKKyAgICB9CisKKyAgICAvLyBDaGVja1N0eWxlOlBhcmFtZXRlck51bWJlckNoZWNrIE9OCisKKyAgICAvKioKKyAgICAgKiBDYWxscyBGaWxlLnNldExhc3RNb2RpZmllZChsb25nIHRpbWUpLiBPcmlnaW5hbGx5IHdyaXR0ZW4gdG8KKyAgICAgKiB0byBkeW5hbWljYWxseSBiaW5kIHRvIHRoYXQgY2FsbCBvbiBKYXZhMS4yKy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHdob3NlIG1vZGlmaWVkIHRpbWUgaXMgdG8gYmUgc2V0CisgICAgICogQHBhcmFtIHRpbWUgdGhlIHRpbWUgdG8gd2hpY2ggdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBpcyB0byBiZSBzZXQuCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBpcyAtMSwgdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVMYXN0TW9kaWZpZWQoRmlsZSBmaWxlLCBsb25nIHRpbWUpIHsKKyAgICAgICAgUmVzb3VyY2VVdGlscy5zZXRMYXN0TW9kaWZpZWQobmV3IEZpbGVSZXNvdXJjZShmaWxlKSwgdGltZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJwcmV0IHRoZSBmaWxlbmFtZSBhcyBhIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIGZpbGUKKyAgICAgKiB1bmxlc3MgdGhlIGZpbGVuYW1lIGFscmVhZHkgcmVwcmVzZW50cyBhbiBhYnNvbHV0ZSBmaWxlbmFtZS4KKyAgICAgKiBEaWZmZXJzIGZyb20gPGNvZGU+bmV3IEZpbGUoZmlsZSwgZmlsZW5hbWUpPC9jb2RlPiBpbiB0aGF0CisgICAgICogdGhlIHJlc3VsdGluZyBGaWxlJ3MgcGF0aCB3aWxsIGFsd2F5cyBiZSBhIG5vcm1hbGl6ZWQsCisgICAgICogYWJzb2x1dGUgcGF0aG5hbWUuICBBbHNvLCBpZiBpdCBpcyBkZXRlcm1pbmVkIHRoYXQKKyAgICAgKiA8Y29kZT5maWxlbmFtZTwvY29kZT4gaXMgY29udGV4dC1yZWxhdGl2ZSwgPGNvZGU+ZmlsZTwvY29kZT4KKyAgICAgKiB3aWxsIGJlIGRpc2NhcmRlZCBhbmQgdGhlIHJlZmVyZW5jZSB3aWxsIGJlIHJlc29sdmVkIHVzaW5nCisgICAgICogYXZhaWxhYmxlIGNvbnRleHQvc3RhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgInJlZmVyZW5jZSIgZmlsZSBmb3IgcmVsYXRpdmUgcGF0aHMuIFRoaXMKKyAgICAgKiBpbnN0YW5jZSBtdXN0IGJlIGFuIGFic29sdXRlIGZpbGUgYW5kIG11c3Qgbm90IGNvbnRhaW4KKyAgICAgKiAmcXVvdDsuLyZxdW90OyBvciAmcXVvdDsuLi8mcXVvdDsgc2VxdWVuY2VzIChzYW1lIGZvciBcIGluc3RlYWQKKyAgICAgKiBvZiAvKS4gIElmIGl0IGlzIG51bGwsIHRoaXMgY2FsbCBpcyBlcXVpdmFsZW50IHRvCisgICAgICogPGNvZGU+bmV3IGphdmEuaW8uRmlsZShmaWxlbmFtZSkuZ2V0QWJzb2x1dGVGaWxlKCk8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lIGEgZmlsZSBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBhYnNvbHV0ZSBmaWxlLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGZpbGVuYW1lIGlzIG51bGwuCisgICAgICovCisgICAgcHVibGljIEZpbGUgcmVzb2x2ZUZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgaWYgKCFpc0Fic29sdXRlUGF0aChmaWxlbmFtZSkpIHsKKyAgICAgICAgICAgIGNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOworICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKCcvJywgc2VwKS5yZXBsYWNlKCdcXCcsIHNlcCk7CisgICAgICAgICAgICBpZiAoaXNDb250ZXh0UmVsYXRpdmVQYXRoKGZpbGVuYW1lKSkgeworICAgICAgICAgICAgICAgIGZpbGUgPSBudWxsOworICAgICAgICAgICAgICAgIC8vIG9uIGN5Z3dpbiwgb3VyIGN1cnJlbnQgZGlyZWN0b3J5IGNhbiBiZSBhIFVOQzsKKyAgICAgICAgICAgICAgICAvLyBhc3N1bWUgdXNlci5kaXIgaXMgYWJzb2x1dGUgb3IgYWxsIGhlbGwgYnJlYWtzIGxvb3NlLi4uCisgICAgICAgICAgICAgICAgU3RyaW5nIHVkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lLmNoYXJBdCgwKSA9PSBzZXAgJiYgdWRpci5jaGFyQXQoMCkgPT0gc2VwKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZGlzc2VjdCh1ZGlyKVswXSArIGZpbGVuYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWxlbmFtZSA9IG5ldyBGaWxlKGZpbGUsIGZpbGVuYW1lKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9ybWFsaXplKGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbiBET1MgYW5kIE5ldFdhcmUsIHRoZSBldmFsdWF0aW9uIG9mIGNlcnRhaW4gZmlsZQorICAgICAqIHNwZWNpZmljYXRpb25zIGlzIGNvbnRleHQtZGVwZW5kZW50LiAgVGhlc2UgYXJlIGZpbGVuYW1lcworICAgICAqIGJlZ2lubmluZyB3aXRoIGEgc2luZ2xlIHNlcGFyYXRvciAocmVsYXRpdmUgdG8gY3VycmVudCByb290IGRpcmVjdG9yeSkKKyAgICAgKiBhbmQgZmlsZW5hbWVzIHdpdGggYSBkcml2ZSBzcGVjaWZpY2F0aW9uIGFuZCBubyBpbnRlcnZlbmluZyBzZXBhcmF0b3IKKyAgICAgKiAocmVsYXRpdmUgdG8gY3VycmVudCBkaXJlY3Rvcnkgb2YgdGhlIHNwZWNpZmllZCByb290KS4KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRvIGV2YWx1YXRlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgaXMgcmVsYXRpdmUgdG8gc3lzdGVtIGNvbnRleHQuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZmlsZW5hbWUgaXMgbnVsbC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRleHRSZWxhdGl2ZVBhdGgoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIGlmICghKE9OX0RPUyB8fCBPTl9ORVRXQVJFKSB8fCBmaWxlbmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7CisgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUucmVwbGFjZSgnLycsIHNlcCkucmVwbGFjZSgnXFwnLCBzZXApOworICAgICAgICBjaGFyIGMgPSBmaWxlbmFtZS5jaGFyQXQoMCk7CisgICAgICAgIGludCBsZW4gPSBmaWxlbmFtZS5sZW5ndGgoKTsKKyAgICAgICAgcmV0dXJuIChjID09IHNlcCAmJiAobGVuID09IDEgfHwgZmlsZW5hbWUuY2hhckF0KDEpICE9IHNlcCkpCisgICAgICAgICAgICAgICAgfHwgKENoYXJhY3Rlci5pc0xldHRlcihjKSAmJiBsZW4gPiAxCisgICAgICAgICAgICAgICAgJiYgZmlsZW5hbWUuaW5kZXhPZignOicpID09IDEKKyAgICAgICAgICAgICAgICAmJiAobGVuID09IDIgfHwgZmlsZW5hbWUuY2hhckF0KDIpICE9IHNlcCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSByZXByZXNlbnRzIGFuIGFic29sdXRlIHBhdGguCisgICAgICogRGlmZmVycyBmcm9tIG5ldyBqYXZhLmlvLkZpbGUoImZpbGVuYW1lIikuaXNBYnNvbHV0ZSgpIGluIHRoYXQgYSBwYXRoCisgICAgICogYmVnaW5uaW5nIHdpdGggYSBkb3VibGUgZmlsZSBzZXBhcmF0b3ItLXNpZ25pZnlpbmcgYSBXaW5kb3dzIFVOQy0tbXVzdAorICAgICAqIGF0IG1pbmltdW0gbWF0Y2ggIlxcYVxiIiB0byBiZSBjb25zaWRlcmVkIGFuIGFic29sdXRlIHBhdGguCisgICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBiZSBjaGVja2VkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgcmVwcmVzZW50cyBhbiBhYnNvbHV0ZSBwYXRoLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGZpbGVuYW1lIGlzIG51bGwuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fic29sdXRlUGF0aChTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKCcvJywgc2VwKS5yZXBsYWNlKCdcXCcsIHNlcCk7CisgICAgICAgIGNoYXIgYyA9IGZpbGVuYW1lLmNoYXJBdCgwKTsKKyAgICAgICAgaWYgKCEoT05fRE9TIHx8IE9OX05FVFdBUkUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGMgPT0gc2VwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSBzZXApIHsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgICAgICBpZiAoIShPTl9ET1MgJiYgbGVuID4gNCAmJiBmaWxlbmFtZS5jaGFyQXQoMSkgPT0gc2VwKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgICAgIGludCBuZXh0c2VwID0gZmlsZW5hbWUuaW5kZXhPZihzZXAsIDIpOworICAgICAgICAgICAgcmV0dXJuIG5leHRzZXAgPiAyICYmIG5leHRzZXAgKyAxIDwgbGVuOworICAgICAgICB9CisgICAgICAgIGludCBjb2xvbiA9IGZpbGVuYW1lLmluZGV4T2YoJzonKTsKKyAgICAgICAgcmV0dXJuIChDaGFyYWN0ZXIuaXNMZXR0ZXIoYykgJiYgY29sb24gPT0gMQorICAgICAgICAgICAgICAgICYmIGZpbGVuYW1lLmxlbmd0aCgpID4gMiAmJiBmaWxlbmFtZS5jaGFyQXQoMikgPT0gc2VwKQorICAgICAgICAgICAgICAgIHx8IChPTl9ORVRXQVJFICYmIGNvbG9uID4gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIGEgcGF0aCBpbnRvIGl0cyBuYXRpdmUgKHBsYXRmb3JtIHNwZWNpZmljKSBmb3JtYXQuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgdXNlcyBQYXRoVG9rZW5pemVyIHRvIHNlcGFyYXRlIHRoZSBpbnB1dCBwYXRoCisgICAgICogaW50byBpdHMgY29tcG9uZW50cy4gVGhpcyBoYW5kbGVzIERPUyBzdHlsZSBwYXRocyBpbiBhIHJlbGF0aXZlbHkKKyAgICAgKiBzZW5zaWJsZSB3YXkuIFRoZSBmaWxlIHNlcGFyYXRvcnMgYXJlIHRoZW4gY29udmVydGVkIHRvIHRoZWlyIHBsYXRmb3JtCisgICAgICogc3BlY2lmaWMgdmVyc2lvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9Qcm9jZXNzIFRoZSBwYXRoIHRvIGJlIHRyYW5zbGF0ZWQuCisgICAgICogICAgICAgICAgICAgICAgICBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWVkIHBhdGggb3IKKyAgICAgKiAgICAgICAgIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcGF0aCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBhbnQgMS43CisgICAgICogQHNlZSBQYXRoVG9rZW5pemVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJhbnNsYXRlUGF0aChTdHJpbmcgdG9Qcm9jZXNzKSB7CisgICAgICAgIGlmICh0b1Byb2Nlc3MgPT0gbnVsbCB8fCB0b1Byb2Nlc3MubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcih0b1Byb2Nlc3MubGVuZ3RoKCkgKyBFWFBBTkRfU1BBQ0UpOworICAgICAgICBQYXRoVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBQYXRoVG9rZW5pemVyKHRvUHJvY2Vzcyk7CisgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aENvbXBvbmVudCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIHBhdGhDb21wb25lbnQgPSBwYXRoQ29tcG9uZW50LnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICAgICAgcGF0aENvbXBvbmVudCA9IHBhdGhDb21wb25lbnQucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0aC5hcHBlbmQocGF0aENvbXBvbmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAmcXVvdDtOb3JtYWxpemUmcXVvdDsgdGhlIGdpdmVuIGFic29sdXRlIHBhdGguCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGluY2x1ZGVzOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5VcHBlcmNhc2UgdGhlIGRyaXZlIGxldHRlciBpZiB0aGVyZSBpcyBvbmUuPC9saT4KKyAgICAgKiAgIDxsaT5SZW1vdmUgcmVkdW5kYW50IHNsYXNoZXMgYWZ0ZXIgdGhlIGRyaXZlIHNwZWMuPC9saT4KKyAgICAgKiAgIDxsaT5SZXNvbHZlIGFsbCAuLywgLlwsIC4uLyBhbmQgLi5cIHNlcXVlbmNlcy48L2xpPgorICAgICAqICAgPGxpPkRPUyBzdHlsZSBwYXRocyB0aGF0IHN0YXJ0IHdpdGggYSBkcml2ZSBsZXR0ZXIgd2lsbCBoYXZlCisgICAgICogICAgIFwgYXMgdGhlIHNlcGFyYXRvci48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogVW5saWtlIHtAbGluayBGaWxlI2dldENhbm9uaWNhbFBhdGgoKX0gdGhpcyBtZXRob2QKKyAgICAgKiBzcGVjaWZpY2FsbHkgZG9lcyBub3QgcmVzb2x2ZSBzeW1ib2xpYyBsaW5rcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgICogQHJldHVybiB0aGUgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBwYXRoLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcGF0aCBpcyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIG5vcm1hbGl6ZShmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICBTdGFjayBzID0gbmV3IFN0YWNrKCk7CisgICAgICAgIFN0cmluZ1tdIGRpc3NlY3QgPSBkaXNzZWN0KHBhdGgpOworICAgICAgICBzLnB1c2goZGlzc2VjdFswXSk7CisKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGlzc2VjdFsxXSwgRmlsZS5zZXBhcmF0b3IpOworICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHRoaXNUb2tlbiA9IHRvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICgiLiIuZXF1YWxzKHRoaXNUb2tlbikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgiLi4iLmVxdWFscyh0aGlzVG9rZW4pKSB7CisgICAgICAgICAgICAgICAgaWYgKHMuc2l6ZSgpIDwgMikgeworICAgICAgICAgICAgICAgICAgICAvLyBDYW5ub3QgcmVzb2x2ZSBpdCwgc28gc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLnBvcCgpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gcGxhaW4gY29tcG9uZW50CisgICAgICAgICAgICAgICAgcy5wdXNoKHRoaXNUb2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMSkgeworICAgICAgICAgICAgICAgIC8vIG5vdCBiZWZvcmUgdGhlIGZpbGVzeXN0ZW0gcm9vdCBhbmQgbm90IGFmdGVyIGl0LCBzaW5jZSByb290CisgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjb250YWlucyBvbmUKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChzLmVsZW1lbnRBdChpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHNiLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3NlY3QgdGhlIHNwZWNpZmllZCBhYnNvbHV0ZSBwYXRoLgorICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGRpc3NlY3QuCisgICAgICogQHJldHVybiBTdHJpbmdbXSB7cm9vdCwgcmVtYWluaW5nIHBhdGh9LgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHBhdGggaXMgbnVsbC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBkaXNzZWN0KFN0cmluZyBwYXRoKSB7CisgICAgICAgIGNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOworICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCcvJywgc2VwKS5yZXBsYWNlKCdcXCcsIHNlcCk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gYWJzb2x1dGUgcGF0aAorICAgICAgICBpZiAoIWlzQWJzb2x1dGVQYXRoKHBhdGgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocGF0aCArICIgaXMgbm90IGFuIGFic29sdXRlIHBhdGgiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcm9vdCA9IG51bGw7CisgICAgICAgIGludCBjb2xvbiA9IHBhdGguaW5kZXhPZignOicpOworICAgICAgICBpZiAoY29sb24gPiAwICYmIChPTl9ET1MgfHwgT05fTkVUV0FSRSkpIHsKKworICAgICAgICAgICAgaW50IG5leHQgPSBjb2xvbiArIDE7CisgICAgICAgICAgICByb290ID0gcGF0aC5zdWJzdHJpbmcoMCwgbmV4dCk7CisgICAgICAgICAgICBjaGFyW10gY2EgPSBwYXRoLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICByb290ICs9IHNlcDsKKyAgICAgICAgICAgIC8vcmVtb3ZlIHRoZSBpbml0aWFsIHNlcGFyYXRvcjsgdGhlIHJvb3QgaGFzIGl0LgorICAgICAgICAgICAgbmV4dCA9IChjYVtuZXh0XSA9PSBzZXApID8gbmV4dCArIDEgOiBuZXh0OworCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2JQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgLy8gRWxpbWluYXRlIGNvbnNlY3V0aXZlIHNsYXNoZXMgYWZ0ZXIgdGhlIGRyaXZlIHNwZWM6CisgICAgICAgICAgICBmb3IgKGludCBpID0gbmV4dDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhW2ldICE9IHNlcCB8fCBjYVtpIC0gMV0gIT0gc2VwKSB7CisgICAgICAgICAgICAgICAgICAgIHNiUGF0aC5hcHBlbmQoY2FbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGggPSBzYlBhdGgudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRoLmxlbmd0aCgpID4gMSAmJiBwYXRoLmNoYXJBdCgxKSA9PSBzZXApIHsKKyAgICAgICAgICAgIC8vIFVOQyBkcml2ZQorICAgICAgICAgICAgaW50IG5leHRzZXAgPSBwYXRoLmluZGV4T2Yoc2VwLCAyKTsKKyAgICAgICAgICAgIG5leHRzZXAgPSBwYXRoLmluZGV4T2Yoc2VwLCBuZXh0c2VwICsgMSk7CisgICAgICAgICAgICByb290ID0gKG5leHRzZXAgPiAyKSA/IHBhdGguc3Vic3RyaW5nKDAsIG5leHRzZXAgKyAxKSA6IHBhdGg7CisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcocm9vdC5sZW5ndGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByb290ID0gRmlsZS5zZXBhcmF0b3I7CisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7cm9vdCwgcGF0aH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFZNUyBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSA8Y29kZT5GaWxlPC9jb2RlPiBvYmplY3QuCisgICAgICogVGhpcyBpcyB1c2VmdWwgc2luY2UgdGhlIEpWTSBieSBkZWZhdWx0IGludGVybmFsbHkgY29udmVydHMgVk1TIHBhdGhzCisgICAgICogdG8gVW5peCBzdHlsZS4KKyAgICAgKiBUaGUgcmV0dXJuZWQgU3RyaW5nIGlzIGFsd2F5cyBhbiBhYnNvbHV0ZSBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIGYgVGhlIDxjb2RlPkZpbGU8L2NvZGU+IHRvIGdldCB0aGUgVk1TIHBhdGggZm9yLgorICAgICAqIEByZXR1cm4gVGhlIGFic29sdXRlIFZNUyBwYXRoIHRvIDxjb2RlPmY8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9WTVNQYXRoKEZpbGUgZikgeworICAgICAgICAvLyBmb3JtYXQ6ICJERVZJQ0U6W0RJUi5TVUJESVJdRklMRSIKKyAgICAgICAgU3RyaW5nIG9zUGF0aDsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBub3JtYWxpemUoZi5nZXRBYnNvbHV0ZVBhdGgoKSkuZ2V0UGF0aCgpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworICAgICAgICBib29sZWFuIGlzQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PSBGaWxlLnNlcGFyYXRvckNoYXI7CisgICAgICAgIC8vIHRyZWF0IGRpcmVjdG9yaWVzIHNwZWNpZmllZCB1c2luZyAuRElSIHN5bnRheCBhcyBmaWxlcworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICBib29sZWFuIGlzRGlyZWN0b3J5ID0gZi5pc0RpcmVjdG9yeSgpCisgICAgICAgICAgICAgICAgJiYgIW5hbWUucmVnaW9uTWF0Y2hlcyh0cnVlLCBuYW1lLmxlbmd0aCgpIC0gNCwgIi5ESVIiLCAwLCA0KTsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorICAgICAgICBTdHJpbmcgZGV2aWNlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGRpcmVjdG9yeSA9IG51bGw7CisgICAgICAgIFN0cmluZyBmaWxlID0gbnVsbDsKKworICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgIGlmIChpc0Fic29sdXRlKSB7CisgICAgICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIDEpOworICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDEpICsgIjpbMDAwMDAwXSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBwYXRoLnN1YnN0cmluZygxLCBpbmRleCsrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNEaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIGRpcmVjdG9yeSA9IG5ldyBTdHJpbmdCdWZmZXIocGF0aC5zdWJzdHJpbmcoaW5kZXgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBkaXJFbmQgPSBwYXRoLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhciwgcGF0aC5sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAoZGlyRW5kID09IC0xIHx8IGRpckVuZCA8IGluZGV4KSB7CisgICAgICAgICAgICAgICAgZmlsZSA9IHBhdGguc3Vic3RyaW5nKGluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gbmV3IFN0cmluZ0J1ZmZlcihwYXRoLnN1YnN0cmluZyhpbmRleCwgZGlyRW5kKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGRpckVuZCArIDE7CisgICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPiBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBmaWxlID0gcGF0aC5zdWJzdHJpbmcoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzQWJzb2x1dGUgJiYgZGlyZWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRpcmVjdG9yeS5pbnNlcnQoMCwgJy4nKTsKKyAgICAgICAgfQorICAgICAgICBvc1BhdGggPSAoKGRldmljZSAhPSBudWxsKSA/IGRldmljZSArICI6IiA6ICIiKQorICAgICAgICAgICAgICAgICsgKChkaXJlY3RvcnkgIT0gbnVsbCkgPyAiWyIgKyBkaXJlY3RvcnkgKyAiXSIgOiAiIikKKyAgICAgICAgICAgICAgICArICgoZmlsZSAhPSBudWxsKSA/IGZpbGUgOiAiIik7CisgICAgICAgIHJldHVybiBvc1BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgRmlsZSBvYmplY3QgZm9yIGEgdGVtcG9yYXJ5IGZpbGUgaW4gYSBnaXZlbiBkaXJlY3RvcnkuIFdpdGhvdXQKKyAgICAgKiBhY3R1YWxseSBjcmVhdGluZyB0aGUgZmlsZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBmaWxlIGRlbm90ZWQgYnkgdGhlIHJldHVybmVkIGFic3RyYWN0IHBhdGhuYW1lIGRpZCBub3QgZXhpc3QgYmVmb3JlCisgICAgICogdGhpcyBtZXRob2Qgd2FzIGludm9rZWQsIGFueSBzdWJzZXF1ZW50IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbAorICAgICAqIHlpZWxkIGEgZGlmZmVyZW50IGZpbGUgbmFtZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGZpbGVuYW1lIGlzIHByZWZpeE5OTk5Oc3VmZml4IHdoZXJlIE5OTk4gaXMgYSByYW5kb20gbnVtYmVyLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXgKKyAgICAgKiAgICAgICAgICAgIHByZWZpeCBiZWZvcmUgdGhlIHJhbmRvbSBudW1iZXIuCisgICAgICogQHBhcmFtIHN1ZmZpeAorICAgICAqICAgICAgICAgICAgZmlsZSBleHRlbnNpb247IGluY2x1ZGUgdGhlICcuJy4KKyAgICAgKiBAcGFyYW0gcGFyZW50RGlyCisgICAgICogICAgICAgICAgICBEaXJlY3RvcnkgdG8gY3JlYXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbjsgamF2YS5pby50bXBkaXIgdXNlZAorICAgICAqICAgICAgICAgICAgaWYgbm90IHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIGFudCAxLjcuMSB1c2UgY3JlYXRlVGVtcEZpbGUoU3RyaW5nLCBTdHJpbmcsIEZpbGUsCisgICAgICogYm9vbGVhbiwgYm9vbGVhbikgaW5zdGVhZC4KKyAgICAgKiBAcmV0dXJuIGEgRmlsZSByZWZlcmVuY2UgdG8gdGhlIG5ldywgbm9uZXhpc3RlbnQgdGVtcG9yYXJ5IGZpbGUuCisgICAgICovCisgICAgcHVibGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCwgRmlsZSBwYXJlbnREaXIpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVRlbXBGaWxlKHByZWZpeCwgc3VmZml4LCBwYXJlbnREaXIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgaW4gYSBnaXZlbiBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZmlsZSBkZW5vdGVkIGJ5IHRoZSByZXR1cm5lZCBhYnN0cmFjdCBwYXRobmFtZSBkaWQgbm90CisgICAgICogZXhpc3QgYmVmb3JlIHRoaXMgbWV0aG9kIHdhcyBpbnZva2VkLCBhbnkgc3Vic2VxdWVudCBpbnZvY2F0aW9uCisgICAgICogb2YgdGhpcyBtZXRob2Qgd2lsbCB5aWVsZCBhIGRpZmZlcmVudCBmaWxlIG5hbWUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBwcmVmaXggYmVmb3JlIHRoZSByYW5kb20gbnVtYmVyLgorICAgICAqIEBwYXJhbSBzdWZmaXggZmlsZSBleHRlbnNpb247IGluY2x1ZGUgdGhlICcuJy4KKyAgICAgKiBAcGFyYW0gcGFyZW50RGlyIERpcmVjdG9yeSB0byBjcmVhdGUgdGhlIHRlbXBvcmFyeSBmaWxlIGluOworICAgICAqIGphdmEuaW8udG1wZGlyIHVzZWQgaWYgbm90IHNwZWNpZmllZC4KKyAgICAgKiBAcGFyYW0gZGVsZXRlT25FeGl0IHdoZXRoZXIgdG8gc2V0IHRoZSB0ZW1wZmlsZSBmb3IgZGVsZXRpb24gb24KKyAgICAgKiAgICAgICAgbm9ybWFsIFZNIGV4aXQuCisgICAgICogQHBhcmFtIGNyZWF0ZUZpbGUgdHJ1ZSBpZiB0aGUgZmlsZSBtdXN0IGFjdHVhbGx5IGJlIGNyZWF0ZWQuIElmIGZhbHNlCisgICAgICogY2hhbmNlcyBleGlzdCB0aGF0IGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgY3JlYXRlZCBpbiB0aGUgdGltZQorICAgICAqIGJldHdlZW4gaW52b2tpbmcgdGhpcyBtZXRob2QgYW5kIHRoZSBtb21lbnQgdGhlIGZpbGUgaXMgYWN0dWFsbHkgY3JlYXRlZC4KKyAgICAgKiBJZiBwb3NzaWJsZSBzZXQgdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBGaWxlIHJlZmVyZW5jZSB0byB0aGUgbmV3IHRlbXBvcmFyeSBmaWxlLgorICAgICAqIEBzaW5jZSBBbnQgMS43LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3VmZml4LCBGaWxlIHBhcmVudERpciwKKyAgICAgICAgICAgIGJvb2xlYW4gZGVsZXRlT25FeGl0LCBib29sZWFuIGNyZWF0ZUZpbGUpIHsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBudWxsOworICAgICAgICBTdHJpbmcgcGFyZW50ID0gKHBhcmVudERpciA9PSBudWxsKQorICAgICAgICAgICAgICAgID8gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpCisgICAgICAgICAgICAgICAgOiBwYXJlbnREaXIuZ2V0UGF0aCgpOworCisgICAgICAgIGlmIChjcmVhdGVGaWxlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUocHJlZml4LCBzdWZmaXgsIG5ldyBGaWxlKHBhcmVudCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSB0ZW1wZmlsZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmVudCwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZWNpbWFsRm9ybWF0IGZtdCA9IG5ldyBEZWNpbWFsRm9ybWF0KCIjIyMjIyIpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChyYW5kKSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgRmlsZShwYXJlbnQsIHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZm10LmZvcm1hdChNYXRoLmFicyhyYW5kLm5leHRJbnQoKSkpICsgc3VmZml4KTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChyZXN1bHQuZXhpc3RzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlbGV0ZU9uRXhpdCkgeworICAgICAgICAgICAgcmVzdWx0LmRlbGV0ZU9uRXhpdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgRmlsZSBvYmplY3QgZm9yIGEgdGVtcG9yYXJ5IGZpbGUgaW4gYSBnaXZlbiBkaXJlY3RvcnkuIFdpdGhvdXQKKyAgICAgKiBhY3R1YWxseSBjcmVhdGluZyB0aGUgZmlsZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBmaWxlIGRlbm90ZWQgYnkgdGhlIHJldHVybmVkIGFic3RyYWN0IHBhdGhuYW1lIGRpZCBub3QgZXhpc3QgYmVmb3JlCisgICAgICogdGhpcyBtZXRob2Qgd2FzIGludm9rZWQsIGFueSBzdWJzZXF1ZW50IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbAorICAgICAqIHlpZWxkIGEgZGlmZmVyZW50IGZpbGUgbmFtZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGZpbGVuYW1lIGlzIHByZWZpeE5OTk5Oc3VmZml4IHdoZXJlIE5OTk4gaXMgYSByYW5kb20gbnVtYmVyLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXgKKyAgICAgKiAgICAgICAgICAgIHByZWZpeCBiZWZvcmUgdGhlIHJhbmRvbSBudW1iZXIuCisgICAgICogQHBhcmFtIHN1ZmZpeAorICAgICAqICAgICAgICAgICAgZmlsZSBleHRlbnNpb247IGluY2x1ZGUgdGhlICcuJy4KKyAgICAgKiBAcGFyYW0gcGFyZW50RGlyCisgICAgICogICAgICAgICAgICBEaXJlY3RvcnkgdG8gY3JlYXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbjsgamF2YS5pby50bXBkaXIgdXNlZAorICAgICAqICAgICAgICAgICAgaWYgbm90IHNwZWNpZmllZC4KKyAgICAgKiBAcGFyYW0gZGVsZXRlT25FeGl0CisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRvIHNldCB0aGUgdGVtcGZpbGUgZm9yIGRlbGV0aW9uIG9uIG5vcm1hbCBWTSBleGl0LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgYW50IDEuNy4xIHVzZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcsIFN0cmluZywgRmlsZSwKKyAgICAgKiBib29sZWFuLCBib29sZWFuKSBpbnN0ZWFkLgorICAgICAqIEByZXR1cm4gYSBGaWxlIHJlZmVyZW5jZSB0byB0aGUgbmV3LCBub25leGlzdGVudCB0ZW1wb3JhcnkgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3VmZml4LAorICAgICAgICAgICAgRmlsZSBwYXJlbnREaXIsIGJvb2xlYW4gZGVsZXRlT25FeGl0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVUZW1wRmlsZShwcmVmaXgsIHN1ZmZpeCwgcGFyZW50RGlyLCBkZWxldGVPbkV4aXQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgY29udGVudHMgb2YgdHdvIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGYxIHRoZSBmaWxlIHdob3NlIGNvbnRlbnQgaXMgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHBhcmFtIGYyIHRoZSBvdGhlciBmaWxlIHdob3NlIGNvbnRlbnQgaXMgdG8gYmUgY29tcGFyZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGVzIGlzIHRoZSBzYW1lLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZXMgY2Fubm90IGJlIHJlYWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGVudEVxdWFscyhGaWxlIGYxLCBGaWxlIGYyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29udGVudEVxdWFscyhmMSwgZjIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgY29udGVudHMgb2YgdHdvIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGYxIHRoZSBmaWxlIHdob3NlIGNvbnRlbnQgaXMgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHBhcmFtIGYyIHRoZSBvdGhlciBmaWxlIHdob3NlIGNvbnRlbnQgaXMgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHBhcmFtIHRleHRmaWxlIHRydWUgaWYgdGhlIGZpbGUgaXMgdG8gYmUgdHJlYXRlZCBhcyBhIHRleHQgZmlsZSBhbmQKKyAgICAgKiAgICAgICAgZGlmZmVyZW5jZXMgaW4ga2luZCBvZiBsaW5lIGJyZWFrIGFyZSB0byBiZSBpZ25vcmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlcyBpcyB0aGUgc2FtZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGVzIGNhbm5vdCBiZSByZWFkLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250ZW50RXF1YWxzKEZpbGUgZjEsIEZpbGUgZjIsIGJvb2xlYW4gdGV4dGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBSZXNvdXJjZVV0aWxzLmNvbnRlbnRFcXVhbHMobmV3IEZpbGVSZXNvdXJjZShmMSksIG5ldyBGaWxlUmVzb3VyY2UoZjIpLCB0ZXh0ZmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB3YXMgb3JpZ2luYWxseSBhbiBlbXVsYXRpb24gb2Yge0BsaW5rIEZpbGUjZ2V0UGFyZW50RmlsZX0gZm9yIEpESyAxLjEsIGJ1dCBpdCBpcyBub3cKKyAgICAgKiBpbXBsZW1lbnRlZCB1c2luZyB0aGF0IG1ldGhvZCAoQW50IDEuNi4zIG9ud2FyZHMpLgorICAgICAqCisgICAgICogQHBhcmFtIGYgdGhlIGZpbGUgd2hvc2UgcGFyZW50IGlzIHJlcXVpcmVkLgorICAgICAqIEByZXR1cm4gdGhlIGdpdmVuIGZpbGUncyBwYXJlbnQsIG9yIG51bGwgaWYgdGhlIGZpbGUgZG9lcyBub3QgaGF2ZSBhIHBhcmVudC4KKyAgICAgKiBAc2luY2UgMS4xMAorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNy4gSnVzdCB1c2Uge0BsaW5rIEZpbGUjZ2V0UGFyZW50RmlsZX0gZGlyZWN0bHkuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0UGFyZW50RmlsZShGaWxlIGYpIHsKKyAgICAgICAgcmV0dXJuIChmID09IG51bGwpID8gbnVsbCA6IGYuZ2V0UGFyZW50RmlsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZnJvbSByZWFkZXIgdGlsbCBFT0YuCisgICAgICogQHBhcmFtIHJkciB0aGUgcmVhZGVyIGZyb20gd2hpY2ggdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyByZWFkIG91dCBvZiB0aGUgZ2l2ZW4gcmVhZGVyLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29udGVudHMgY291bGQgbm90IGJlIHJlYWQgb3V0IGZyb20gdGhlCisgICAgICogICAgICAgICByZWFkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZEZ1bGx5KFJlYWRlciByZHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkRnVsbHkocmRyLCBCVUZfU0laRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBmcm9tIHJlYWRlciB0aWxsIEVPRi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZHIgdGhlIHJlYWRlciBmcm9tIHdoaWNoIHRvIHJlYWQuCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemUgdGhlIGJ1ZmZlciBzaXplIHRvIHVzZSB3aGVuIHJlYWRpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyByZWFkIG91dCBvZiB0aGUgZ2l2ZW4gcmVhZGVyLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29udGVudHMgY291bGQgbm90IGJlIHJlYWQgb3V0IGZyb20gdGhlCisgICAgICogICAgICAgICByZWFkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZEZ1bGx5KFJlYWRlciByZHIsIGludCBidWZmZXJTaXplKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0aGFuIDAiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgIGludCBidWZmZXJMZW5ndGggPSAwOworICAgICAgICBTdHJpbmdCdWZmZXIgdGV4dEJ1ZmZlciA9IG51bGw7CisgICAgICAgIHdoaWxlIChidWZmZXJMZW5ndGggIT0gLTEpIHsKKyAgICAgICAgICAgIGJ1ZmZlckxlbmd0aCA9IHJkci5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoYnVmZmVyTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHRleHRCdWZmZXIgPSAodGV4dEJ1ZmZlciA9PSBudWxsKSA/IG5ldyBTdHJpbmdCdWZmZXIoKSA6IHRleHRCdWZmZXI7CisgICAgICAgICAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQobmV3IFN0cmluZyhidWZmZXIsIDAsIGJ1ZmZlckxlbmd0aCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAodGV4dEJ1ZmZlciA9PSBudWxsKSA/IG51bGwgOiB0ZXh0QnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FmZSByZWFkIGZ1bGx5IC0gZG8gbm90IHJldHVybiBhIG51bGwgZm9yIGFuIGVtcHR5IHJlYWRlci4KKyAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBpbnB1dCB0byByZWFkIGZyb20uCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdW5hYmxlIHRvIHJlYWQgZnJvbSByZWFkZXIuCisgICAgICogQHNpbmNlIEFudCAxLjcuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhZmVSZWFkRnVsbHkoUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJldCA9IHJlYWRGdWxseShyZWFkZXIpOworICAgICAgICByZXR1cm4gcmV0ID09IG51bGwgPyAiIiA6IHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHdhcyBvcmlnaW5hbGx5IGFuIGVtdWxhdGlvbiBvZiBGaWxlLmNyZWF0ZU5ld0ZpbGUgZm9yIEpESyAxLjEsCisgICAgICogYnV0IGl0IGlzIG5vdyBpbXBsZW1lbnRlZCB1c2luZyB0aGF0IG1ldGhvZCAoQW50IDEuNi4zIG9ud2FyZHMpLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgaGFzIGhpc3RvcmljYWxseSA8c3Ryb25nPm5vdDwvc3Ryb25nPiBndWFyYW50ZWVkIHRoYXQgdGhlCisgICAgICogb3BlcmF0aW9uIHdhcyBhdG9taWMuIEluIGl0cyBjdXJyZW50IGltcGxlbWVudGF0aW9uIGl0IGlzLgorICAgICAqCisgICAgICogQHBhcmFtIGYgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgZGlkIG5vdCBleGlzdCBhbHJlYWR5LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVOZXdGaWxlKEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGYuY3JlYXRlTmV3RmlsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBmaWxlLCBvcHRpb25hbGx5IGNyZWF0aW5nIHBhcmVudCBkaXJlY3Rvcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIG1rZGlycyA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aGV0aGVyIHRvIGNyZWF0ZSBwYXJlbnQgZGlyZWN0b3JpZXMuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGRpZCBub3QgZXhpc3QgYWxyZWFkeS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVOZXdGaWxlKEZpbGUgZiwgYm9vbGVhbiBta2RpcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIGlmIChta2RpcnMgJiYgIShwYXJlbnQuZXhpc3RzKCkpKSB7CisgICAgICAgICAgICBwYXJlbnQubWtkaXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGYuY3JlYXRlTmV3RmlsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gZmlsZSBpcyBhIHN5bWJvbGljIGxpbmsuCisgICAgICoKKyAgICAgKiA8cD5JdCBkb2Vzbid0IHJlYWxseSB0ZXN0IGZvciBzeW1ib2xpYyBsaW5rcyBidXQgd2hldGhlciB0aGUKKyAgICAgKiBjYW5vbmljYWwgYW5kIGFic29sdXRlIHBhdGhzIG9mIHRoZSBmaWxlIGFyZSBpZGVudGljYWwtLXRoaXMKKyAgICAgKiBtYXkgbGVhZCB0byBmYWxzZSBwb3NpdGl2ZXMgb24gc29tZSBwbGF0Zm9ybXMuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZmlsZSB0byB0ZXN0CisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gdGVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBhIHN5bWJvbGljIGxpbmsuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3ltYm9saWNMaW5rKEZpbGUgcGFyZW50LCBTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShuYW1lKTsKKyAgICAgICAgICAgIHBhcmVudCA9IGYuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgbmFtZSA9IGYuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIEZpbGUgdG9UZXN0ID0gbmV3IEZpbGUocGFyZW50LmdldENhbm9uaWNhbFBhdGgoKSwgbmFtZSk7CisgICAgICAgIHJldHVybiAhdG9UZXN0LmdldEFic29sdXRlUGF0aCgpLmVxdWFscyh0b1Rlc3QuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbGVhZGluZyBwYXRoIGZyb20gYSBzZWNvbmQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWFkaW5nIFRoZSBsZWFkaW5nIHBhdGgsIG11c3Qgbm90IGJlIG51bGwsIG11c3QgYmUgYWJzb2x1dGUuCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gcmVtb3ZlIGZyb20sIG11c3Qgbm90IGJlIG51bGwsIG11c3QgYmUgYWJzb2x1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhdGgncyBub3JtYWxpemVkIGFic29sdXRlIGlmIGl0IGRvZXNuJ3Qgc3RhcnQgd2l0aAorICAgICAqIGxlYWRpbmc7IHBhdGgncyBwYXRoIHdpdGggbGVhZGluZydzIHBhdGggcmVtb3ZlZCBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1BhdGgoRmlsZSBsZWFkaW5nLCBGaWxlIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIGwgPSBub3JtYWxpemUobGVhZGluZy5nZXRBYnNvbHV0ZVBhdGgoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIFN0cmluZyBwID0gbm9ybWFsaXplKHBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBpZiAobC5lcXVhbHMocCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICAvLyBlbnN1cmUgdGhhdCBsIGVuZHMgd2l0aCBhIC8KKyAgICAgICAgLy8gc28gd2UgbmV2ZXIgdGhpbmsgL2ZvbyB3YXMgYSBwYXJlbnQgZGlyZWN0b3J5IG9mIC9mb29iYXIKKyAgICAgICAgaWYgKCFsLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgbCArPSBGaWxlLnNlcGFyYXRvcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHAuc3RhcnRzV2l0aChsKSkgPyBwLnN1YnN0cmluZyhsLmxlbmd0aCgpKSA6IHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGVhcm4gd2hldGhlciBvbmUgcGF0aCAibGVhZHMiIGFub3RoZXIuCisgICAgICogQHBhcmFtIGxlYWRpbmcgVGhlIGxlYWRpbmcgcGF0aCwgbXVzdCBub3QgYmUgbnVsbCwgbXVzdCBiZSBhYnNvbHV0ZS4KKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byByZW1vdmUgZnJvbSwgbXVzdCBub3QgYmUgbnVsbCwgbXVzdCBiZSBhYnNvbHV0ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGF0aCBzdGFydHMgd2l0aCBsZWFkaW5nOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xlYWRpbmdQYXRoKEZpbGUgbGVhZGluZywgRmlsZSBwYXRoKSB7CisgICAgICAgIFN0cmluZyBsID0gbm9ybWFsaXplKGxlYWRpbmcuZ2V0QWJzb2x1dGVQYXRoKCkpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBTdHJpbmcgcCA9IG5vcm1hbGl6ZShwYXRoLmdldEFic29sdXRlUGF0aCgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgaWYgKGwuZXF1YWxzKHApKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBlbnN1cmUgdGhhdCBsIGVuZHMgd2l0aCBhIC8KKyAgICAgICAgLy8gc28gd2UgbmV2ZXIgdGhpbmsgL2ZvbyB3YXMgYSBwYXJlbnQgZGlyZWN0b3J5IG9mIC9mb29iYXIKKyAgICAgICAgaWYgKCFsLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICAgICAgbCArPSBGaWxlLnNlcGFyYXRvcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcC5zdGFydHNXaXRoKGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSA8Y29kZT5maWxlOjwvY29kZT4gVVJJIHRoYXQgcmVwcmVzZW50cyB0aGUKKyAgICAgKiBleHRlcm5hbCBmb3JtIG9mIHRoZSBnaXZlbiBwYXRobmFtZS4KKyAgICAgKgorICAgICAqIDxwPldpbGwgYmUgYW4gYWJzb2x1dGUgVVJJIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFic29sdXRlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgY29kZSBlbmNvZGVzIG5vbiBBU0NJSSBjaGFyYWN0ZXJzIHRvby48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgY29kaW5nIG9mIHRoZSBvdXRwdXQgaXMgdGhlIHNhbWUgYXMgd2hhdCBGaWxlLnRvVVJJKCkudG9BU0NJSVN0cmluZygpIHByb2R1Y2VzPC9wPgorICAgICAqCisgICAgICogU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbDExLyNkdC1zeXNpZCI+ZHQtc3lzaWQ8L2E+CisgICAgICogd2hpY2ggbWFrZXMgc29tZSBtZW50aW9uIG9mIGhvdworICAgICAqIGNoYXJhY3RlcnMgbm90IHN1cHBvcnRlZCBieSBVUkkgUmVmZXJlbmNlIHN5bnRheCBzaG91bGQgYmUgZXNjYXBlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBVUkkgdmVyc2lvbiBvZiB0aGUgbG9jYWwgcGF0aC4KKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9VUkkoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgLy8gIzgwMzE6IGZpcnN0IHRyeSBKYXZhIDEuNC4KKyAgICAgICAgQ2xhc3MgdXJpQ2xhenogPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJpQ2xhenogPSBDbGFzcy5mb3JOYW1lKCJqYXZhLm5ldC5VUkkiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSywgSmF2YSAxLjMuCisgICAgICAgIH0KKyAgICAgICAgaWYgKHVyaUNsYXp6ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVGaWxlKCk7CisgICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHRvVVJJTWV0aG9kID0gRmlsZS5jbGFzcy5nZXRNZXRob2QoInRvVVJJIiwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgdXJpT2JqID0gdG9VUklNZXRob2QuaW52b2tlKGYsIG5ldyBPYmplY3RbXSB7fSk7CisgICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHRvQVNDSUlTdHJpbmdNZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgID0gdXJpQ2xhenouZ2V0TWV0aG9kKCJ0b0FTQ0lJU3RyaW5nIiwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgdG9BU0NJSVN0cmluZ01ldGhvZC5pbnZva2UodXJpT2JqLCBuZXcgT2JqZWN0W10ge30pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWZsZWN0aW9uIHByb2JsZW1zPyBTaG91bGQgbm90IGhhcHBlbiwgZGVidWcuCisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBib29sZWFuIGlzRGlyID0gbmV3IEZpbGUocGF0aCkuaXNEaXJlY3RvcnkoKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJmaWxlOiIpOworCisgICAgICAgIHBhdGggPSByZXNvbHZlRmlsZShudWxsLCBwYXRoKS5nZXRQYXRoKCk7CisgICAgICAgIHNiLmFwcGVuZCgiLy8iKTsKKyAgICAgICAgLy8gYWRkIGFuIGV4dHJhIHNsYXNoIGZvciBmaWxlc3lzdGVtcyB3aXRoIGRyaXZlLXNwZWNpZmllcnMKKyAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfQorICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoTG9jYXRvci5lbmNvZGVVUkkocGF0aCkpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4Yyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzRGlyICYmICFwYXRoLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnLycpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmaWxlIHBhdGggZnJvbSBhIDxjb2RlPmZpbGU6PC9jb2RlPiBVUkkuCisgICAgICoKKyAgICAgKiA8cD5XaWxsIGJlIGFuIGFic29sdXRlIHBhdGggaWYgdGhlIGdpdmVuIFVSSSBpcyBhYnNvbHV0ZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5Td2FsbG93cyAnJScgdGhhdCBhcmUgbm90IGZvbGxvd2VkIGJ5IHR3byBjaGFyYWN0ZXJzLAorICAgICAqIGRvZXNuJ3QgZGVhbCB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBkZXNpZ25hdGluZyBhIGZpbGUgaW4gdGhlIGxvY2FsIGZpbGVzeXN0ZW0uCisgICAgICogQHJldHVybiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gcGF0aCBmb3IgdGhlIGZpbGUuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZyb21VUkkoU3RyaW5nIHVyaSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlRnJvbVVyaUxvY2spIHsKKyAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKGNhY2hlRnJvbVVyaVJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlRnJvbVVyaVJlc3BvbnNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBMb2NhdG9yLmZyb21VUkkodXJpKTsKKyAgICAgICAgICAgIFN0cmluZyByZXQgPSBpc0Fic29sdXRlUGF0aChwYXRoKSA/IG5vcm1hbGl6ZShwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKSA6IHBhdGg7CisgICAgICAgICAgICBjYWNoZUZyb21VcmlSZXF1ZXN0ID0gdXJpOworICAgICAgICAgICAgY2FjaGVGcm9tVXJpUmVzcG9uc2UgPSByZXQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdHdvIGZpbGVuYW1lcy4KKyAgICAgKgorICAgICAqIDxwPlVubGlrZSBqYXZhLmlvLkZpbGUjZXF1YWxzIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIGNvbXBhcmUKKyAgICAgKiB0aGUgYWJzb2x1dGUgcGF0aHMgYW5kICZxdW90O25vcm1hbGl6ZSZxdW90OyB0aGUgZmlsZW5hbWVzCisgICAgICogYmVmb3JlIGNvbXBhcmluZyB0aGVtLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmMSB0aGUgZmlsZSB3aG9zZSBuYW1lIGlzIHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEBwYXJhbSBmMiB0aGUgb3RoZXIgZmlsZSB3aG9zZSBuYW1lIGlzIHRvIGJlIGNvbXBhcmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGFyZSBmb3IgdGhlIHNhbWUgZmlsZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaWxlTmFtZUVxdWFscyhGaWxlIGYxLCBGaWxlIGYyKSB7CisgICAgICAgIHJldHVybiBub3JtYWxpemUoZjEuZ2V0QWJzb2x1dGVQYXRoKCkpLmdldEFic29sdXRlUGF0aCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICBub3JtYWxpemUoZjIuZ2V0QWJzb2x1dGVQYXRoKCkpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5hbWVzIGEgZmlsZSwgZXZlbiBpZiB0aGF0IGludm9sdmVzIGNyb3NzaW5nIGZpbGUgc3lzdGVtIGJvdW5kYXJpZXMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIHdpbGwgcmVtb3ZlIDxjb2RlPnRvPC9jb2RlPiAoaWYgaXQgZXhpc3RzKSwgZW5zdXJlIHRoYXQKKyAgICAgKiA8Y29kZT50bzwvY29kZT4ncyBwYXJlbnQgZGlyZWN0b3J5IGV4aXN0cyBhbmQgbW92ZQorICAgICAqIDxjb2RlPmZyb208L2NvZGU+LCB3aGljaCBpbnZvbHZlcyBkZWxldGluZyA8Y29kZT5mcm9tPC9jb2RlPiBhcworICAgICAqIHdlbGwuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZyb20gdGhlIGZpbGUgdG8gbW92ZS4KKyAgICAgKiBAcGFyYW0gdG8gdGhlIG5ldyBmaWxlIG5hbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueXRoaW5nIGJhZCBoYXBwZW5zIGR1cmluZyB0aGlzCisgICAgICogcHJvY2Vzcy4gIE5vdGUgdGhhdCA8Y29kZT50bzwvY29kZT4gbWF5IGhhdmUgYmVlbiBkZWxldGVkCisgICAgICogYWxyZWFkeSB3aGVuIHRoaXMgaGFwcGVucy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVuYW1lKEZpbGUgZnJvbSwgRmlsZSB0bykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZnJvbSA9IG5vcm1hbGl6ZShmcm9tLmdldEFic29sdXRlUGF0aCgpKS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIHRvID0gbm9ybWFsaXplKHRvLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgaWYgKCFmcm9tLmV4aXN0cygpKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCByZW5hbWUgbm9uZXhpc3RlbnQgZmlsZSAiICsgZnJvbSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyb20uZXF1YWxzKHRvKSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJSZW5hbWUgb2YgIiArIGZyb20gKyAiIHRvICIgKyB0byArICIgaXMgYSBuby1vcC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodG8uZXhpc3RzKCkgJiYgIShmcm9tLmVxdWFscyh0by5nZXRDYW5vbmljYWxGaWxlKCkpIHx8IHRvLmRlbGV0ZSgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGVsZXRlICIgKyB0byArICIgd2hpbGUgdHJ5aW5nIHRvIHJlbmFtZSAiICsgZnJvbSk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBwYXJlbnQgPSB0by5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpICYmICFwYXJlbnQubWtkaXJzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgIiArIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aGlsZSB0cnlpbmcgdG8gcmVuYW1lICIgKyBmcm9tKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZyb20ucmVuYW1lVG8odG8pKSB7CisgICAgICAgICAgICBjb3B5RmlsZShmcm9tLCB0byk7CisgICAgICAgICAgICBpZiAoIWZyb20uZGVsZXRlKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBkZWxldGUgIiArIGZyb20gKyAiIHdoaWxlIHRyeWluZyB0byByZW5hbWUgaXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGdyYW51bGFyaXR5IG9mIGZpbGUgdGltZXN0YW1wcy4gVGhlIGNob2ljZSBpcyBtYWRlIGJhc2VkIG9uIE9TLCB3aGljaCBpcworICAgICAqIGluY29ycmVjdC0taXQgc2hvdWxkIHJlYWxseSBiZSBieSBmaWxlc3lzdGVtLiBXZSBkbyBub3QgaGF2ZSBhbiBlYXN5IHdheSB0byBwcm9iZSBmb3IgZmlsZQorICAgICAqIHN5c3RlbXMsIGhvd2V2ZXIsIHNvIHRoaXMgaGV1cmlzdGljIGdpdmVzIHVzIGEgZGVjZW50IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkaWZmZXJlbmNlLCBpbiBtaWxsaXNlY29uZHMsIHdoaWNoIHR3byBmaWxlIHRpbWVzdGFtcHMgbXVzdCBoYXZlIGluIG9yZGVyIGZvciB0aGUKKyAgICAgKiAgICAgICAgIHR3byBmaWxlcyB0byBiZSBjb25zaWRlcmVkIHRvIGhhdmUgZGlmZmVyZW50IHRpbWVzdGFtcHMuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkgeworICAgICAgICBpZiAoT05fV0lOOVgpIHsKKyAgICAgICAgICAgIHJldHVybiBGQVRfRklMRV9USU1FU1RBTVBfR1JBTlVMQVJJVFk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE9OX1dJTkRPV1MpIHsKKyAgICAgICAgICAgIHJldHVybiBOVEZTX0ZJTEVfVElNRVNUQU1QX0dSQU5VTEFSSVRZOworICAgICAgICB9CisgICAgICAgIGlmIChPTl9ET1MpIHsKKyAgICAgICAgICAgIHJldHVybiBGQVRfRklMRV9USU1FU1RBTVBfR1JBTlVMQVJJVFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFVOSVhfRklMRV9USU1FU1RBTVBfR1JBTlVMQVJJVFk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB3aGV0aGVyIGEgZmlsZSBvciBkaXJlY3RvcnkgZXhpc3RzLCB3aXRoIGFuIGVycm9yIGluIHRoZQorICAgICAqIHVwcGVyL2xvd2VyIGNhc2Ugc3BlbGxpbmcgb2YgdGhlIG5hbWUuCisgICAgICogVXNpbmcgdGhpcyBtZXRob2QgaXMgb25seSBpbnRlcmVzdGluZyBvbiBjYXNlIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcworICAgICAqIChXaW5kb3dzKS48YnIvPgorICAgICAqIEl0IHdpbGwgcmV0dXJuIHRydWUgb25seSBpZiAzIGNvbmRpdGlvbnMgYXJlIG1ldCA6CisgICAgICogPGJyLz4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+b3BlcmF0aW5nIHN5c3RlbSBpcyBjYXNlIGluc2Vuc2l0aXZlPC9saT4KKyAgICAgKiAgIDxsaT5maWxlIGV4aXN0czwvbGk+CisgICAgICogICA8bGk+YWN0dWFsIG5hbWUgZnJvbSBkaXJlY3RvcnkgcmVhZGluZyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgICAgKiAgICAgICBzdXBwbGllZCBhcmd1bWVudDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiAgPGJyLz4KKyAgICAgKiB0aGUgcHVycG9zZSBpcyB0byBpZGVudGlmeSBmaWxlcyBvciBkaXJlY3RvcmllcyBvbiBjYXNlLWluc2Vuc2l0aXZlCisgICAgICogZmlsZXN5c3RlbXMgd2hvc2UgY2FzZSBpcyBub3Qgd2hhdCBpcyBleHBlY3RlZC48YnIvPgorICAgICAqIFBvc3NpYmx5IHRvIHJlbmFtZSB0aGVtIGFmdGVyd2FyZHMgdG8gdGhlIGRlc2lyZWQgdXBwZXIvbG93ZXJjYXNlCisgICAgICogY29tYmluYXRpb24uCisgICAgICogPGJyLz4KKyAgICAgKiBAcGFyYW0gbG9jYWxGaWxlIGZpbGUgdG8gdGVzdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIHRoZSBjYXNlIG9mIHRoZSBhY3R1YWwgZmlsZQorICAgICAqICAgICAgICAgICAgICBpcyBub3QgdGhlIGNhc2Ugb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIEBzaW5jZSBBbnQgMS43LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvckluQ2FzZShGaWxlIGxvY2FsRmlsZSkgeworICAgICAgICBsb2NhbEZpbGUgPSBub3JtYWxpemUobG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgaWYgKCFsb2NhbEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxGaWxlTmFtZSA9IGxvY2FsRmlsZS5nZXROYW1lKCk7CisgICAgICAgIEZpbGVuYW1lRmlsdGVyIGZmID0gbmV3IEZpbGVuYW1lRmlsdGVyICgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGxvY2FsRmlsZU5hbWUpICYmICghbmFtZS5lcXVhbHMobG9jYWxGaWxlTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IGxvY2FsRmlsZS5nZXRQYXJlbnRGaWxlKCkubGlzdChmZik7CisgICAgICAgIHJldHVybiBuYW1lcyAhPSBudWxsICYmIG5hbWVzLmxlbmd0aCA9PSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc291cmNlIGlzIG9sZGVyIHRoYW4gdGhlIGRlc3QuCisgICAgICogSWYgdGhlIGRlc3QgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbiB0aGUgdGVzdCByZXR1cm5zIGZhbHNlOyBpdCBpcworICAgICAqIGltcGxpY2l0bHkgbm90IHVwIGRvIGRhdGUuCisgICAgICogQHBhcmFtIHNvdXJjZSBzb3VyY2UgZmlsZSAoc2hvdWxkIGJlIHRoZSBvbGRlcikuCisgICAgICogQHBhcmFtIGRlc3QgZGVzdCBmaWxlIChzaG91bGQgYmUgdGhlIG5ld2VyKS4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgYW4gb2Zmc2V0IGFkZGVkIHRvIHRoZSBzb3VyY2UgdGltZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZSBpcyBvbGRlciB0aGFuIHRoZSBkZXN0IGFmdGVyIGFjY291bnRpbmcKKyAgICAgKiAgICAgICAgICAgICAgZm9yIGdyYW51bGFyaXR5LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VwVG9EYXRlKEZpbGUgc291cmNlLCBGaWxlIGRlc3QsIGxvbmcgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgLy9kbyBhIGNoZWNrIGZvciB0aGUgZGVzdGluYXRpb24gZmlsZSBleGlzdGluZworICAgICAgICBpZiAoIWRlc3QuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIC8vaWYgaXQgZG9lcyBub3QsIHRoZW4gdGhlIGZpbGUgaXMgbm90IHVwIHRvIGRhdGUuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBzb3VyY2VUaW1lID0gc291cmNlLmxhc3RNb2RpZmllZCgpOworICAgICAgICBsb25nIGRlc3RUaW1lID0gZGVzdC5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgcmV0dXJuIGlzVXBUb0RhdGUoc291cmNlVGltZSwgZGVzdFRpbWUsIGdyYW51bGFyaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNvdXJjZSBpcyBvbGRlciB0aGFuIHRoZSBkZXN0LgorICAgICAqIEBwYXJhbSBzb3VyY2Ugc291cmNlIGZpbGUgKHNob3VsZCBiZSB0aGUgb2xkZXIpLgorICAgICAqIEBwYXJhbSBkZXN0IGRlc3QgZmlsZSAoc2hvdWxkIGJlIHRoZSBuZXdlcikuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2UgaXMgb2xkZXIgdGhhbiB0aGUgZGVzdCwgdGFraW5nIHRoZSBncmFudWxhcml0eSBpbnRvIGFjY291bnQuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVXBUb0RhdGUoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgeworICAgICAgICByZXR1cm4gaXNVcFRvRGF0ZShzb3VyY2UsIGRlc3QsIGdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byB0aW1lc3RhbXBzIGZvciBiZWluZyB1cCB0byBkYXRlIHVzaW5nCisgICAgICogdGhlIHNwZWNpZmllZCBncmFudWxhcml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VUaW1lIHRpbWVzdGFtcCBvZiBzb3VyY2UgZmlsZS4KKyAgICAgKiBAcGFyYW0gZGVzdFRpbWUgdGltZXN0YW1wIG9mIGRlc3QgZmlsZS4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgb3MvZmlsZXN5cyBncmFudWxhcml0eS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRlc3QgZmlsZSBpcyBjb25zaWRlcmVkIHVwIHRvIGRhdGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVcFRvRGF0ZShsb25nIHNvdXJjZVRpbWUsIGxvbmcgZGVzdFRpbWUsIGxvbmcgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgcmV0dXJuIGRlc3RUaW1lICE9IC0xICYmIGRlc3RUaW1lID49IHNvdXJjZVRpbWUgKyBncmFudWxhcml0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byB0aW1lc3RhbXBzIGZvciBiZWluZyB1cCB0byBkYXRlIHVzaW5nIHRoZQorICAgICAqIGN1cnJlbnQgZ3JhbnVsYXJpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlVGltZSAgdGltZXN0YW1wIG9mIHNvdXJjZSBmaWxlLgorICAgICAqIEBwYXJhbSBkZXN0VGltZSAgICB0aW1lc3RhbXAgb2YgZGVzdCBmaWxlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGVzdCBmaWxlIGlzIGNvbnNpZGVyZWQgdXAgdG8gZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VwVG9EYXRlKGxvbmcgc291cmNlVGltZSwgbG9uZyBkZXN0VGltZSkgeworICAgICAgICByZXR1cm4gaXNVcFRvRGF0ZShzb3VyY2VUaW1lLCBkZXN0VGltZSwgZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGEgV3JpdGVyIHdpdGhvdXQgdGhyb3dpbmcgYW55IGV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4KKyAgICAgKiBEbyBub3QgYXR0ZW1wdCB0byBjbG9zZSBpdCBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIG91dHB1dCB3cml0ZXIsIGNhbiBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShXcml0ZXIgZGV2aWNlKSB7CisgICAgICAgIGlmIChudWxsICE9IGRldmljZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkZXZpY2UuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBSZWFkZXIgd2l0aG91dCB0aHJvd2luZyBhbnkgZXhjZXB0aW9uIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLgorICAgICAqIERvIG5vdCBhdHRlbXB0IHRvIGNsb3NlIGl0IGlmIHRoZSBhcmd1bWVudCBpcyBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZWFkZXIsIGNhbiBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShSZWFkZXIgZGV2aWNlKSB7CisgICAgICAgIGlmIChudWxsICE9IGRldmljZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkZXZpY2UuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJlYW0gd2l0aG91dCB0aHJvd2luZyBhbnkgZXhjZXB0aW9uIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLgorICAgICAqIERvIG5vdCBhdHRlbXB0IHRvIGNsb3NlIGl0IGlmIHRoZSBhcmd1bWVudCBpcyBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBzdHJlYW0sIGNhbiBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShPdXRwdXRTdHJlYW0gZGV2aWNlKSB7CisgICAgICAgIGlmIChudWxsICE9IGRldmljZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkZXZpY2UuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJlYW0gd2l0aG91dCB0aHJvd2luZyBhbnkgZXhjZXB0aW9uIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLgorICAgICAqIERvIG5vdCBhdHRlbXB0IHRvIGNsb3NlIGl0IGlmIHRoZSBhcmd1bWVudCBpcyBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBzdHJlYW0sIGNhbiBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShJbnB1dFN0cmVhbSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gZGV2aWNlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRldmljZS5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhlIGZpbGUgd2l0aCB7QGxpbmsgRmlsZSNkZWxldGUoKX0gaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBudWxsLgorICAgICAqIERvIG5vdGhpbmcgb24gYSBudWxsIGFyZ3VtZW50LgorICAgICAqIEBwYXJhbSBmaWxlIGZpbGUgdG8gZGVsZXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGVzIHRoZSByZWxhdGl2ZSBwYXRoIGJldHdlZW4gdHdvIGZpbGVzLgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGF0aW9uIG5vdGU6PGJyLz4gVGhpcyBmdW5jdGlvbiBtYXkgdGhyb3cgYW4gSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqIGJlY2F1c2UgaXRzIHVzZSBvZiB0aGUgY2Fub25pY2FsIHBhdGhuYW1lIG1heSByZXF1aXJlIGZpbGVzeXN0ZW0gcXVlcmllcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbUZpbGUgdGhlIDxjb2RlPkZpbGU8L2NvZGU+IHRvIGNhbGN1bGF0ZSB0aGUgcGF0aCBmcm9tCisgICAgICogQHBhcmFtIHRvRmlsZSB0aGUgPGNvZGU+RmlsZTwvY29kZT4gdG8gY2FsY3VsYXRlIHRoZSBwYXRoIHRvCisgICAgICogQHJldHVybiB0aGUgcmVsYXRpdmUgcGF0aCBiZXR3ZWVuIHRoZSBmaWxlcworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGZvciB1bmRvY3VtZW50ZWQgcmVhc29ucworICAgICAqIEBzZWUgRmlsZSNnZXRDYW5vbmljYWxQYXRoKCkKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKEZpbGUgZnJvbUZpbGUsIEZpbGUgdG9GaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZyb21QYXRoID0gZnJvbUZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICBTdHJpbmcgdG9QYXRoID0gdG9GaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKworICAgICAgICAvLyBidWlsZCB0aGUgcGF0aCBzdGFjayBpbmZvIHRvIGNvbXBhcmUKKyAgICAgICAgU3RyaW5nW10gZnJvbVBhdGhTdGFjayA9IGdldFBhdGhTdGFjayhmcm9tUGF0aCk7CisgICAgICAgIFN0cmluZ1tdIHRvUGF0aFN0YWNrID0gZ2V0UGF0aFN0YWNrKHRvUGF0aCk7CisKKyAgICAgICAgaWYgKDAgPCB0b1BhdGhTdGFjay5sZW5ndGggJiYgMCA8IGZyb21QYXRoU3RhY2subGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoIWZyb21QYXRoU3RhY2tbMF0uZXF1YWxzKHRvUGF0aFN0YWNrWzBdKSkgeworICAgICAgICAgICAgICAgIC8vIG5vdCB0aGUgc2FtZSBkZXZpY2UgKHdvdWxkIGJlICIiIG9uIExpbnV4L1VuaXgpCisKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGF0aChBcnJheXMuYXNMaXN0KHRvUGF0aFN0YWNrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBubyBjb21wYXJpc29uIHBvc3NpYmxlCisgICAgICAgICAgICByZXR1cm4gZ2V0UGF0aChBcnJheXMuYXNMaXN0KHRvUGF0aFN0YWNrKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWluTGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhdGhTdGFjay5sZW5ndGgsIHRvUGF0aFN0YWNrLmxlbmd0aCk7CisgICAgICAgIGludCBzYW1lID0gMTsgLy8gVXNlZCBvdXRzaWRlIHRoZSBmb3IgbG9vcAorCisgICAgICAgIC8vIGdldCBpbmRleCBvZiBwYXJ0cyB3aGljaCBhcmUgZXF1YWwKKyAgICAgICAgZm9yICg7CisgICAgICAgICAgICAgc2FtZSA8IG1pbkxlbmd0aCAmJiBmcm9tUGF0aFN0YWNrW3NhbWVdLmVxdWFscyh0b1BhdGhTdGFja1tzYW1lXSk7CisgICAgICAgICAgICAgc2FtZSsrKSB7CisgICAgICAgICAgICAvLyBEbyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBMaXN0IHJlbGF0aXZlUGF0aFN0YWNrID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIC8vIGlmICJmcm9tIiBwYXJ0IGlzIGxvbmdlciwgZmlsbCBpdCB1cCB3aXRoICIuLiIKKyAgICAgICAgLy8gdG8gcmVhY2ggcGF0aCB3aGljaCBpcyBlcXVhbCB0byBib3RoIHBhdGhzCisgICAgICAgIGZvciAoaW50IGkgPSBzYW1lOyBpIDwgZnJvbVBhdGhTdGFjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVsYXRpdmVQYXRoU3RhY2suYWRkKCIuLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmlsbCBpdCB1cCBwYXRoIHdpdGggcGFydHMgd2hpY2ggd2VyZSBub3QgZXF1YWwKKyAgICAgICAgZm9yIChpbnQgaSA9IHNhbWU7IGkgPCB0b1BhdGhTdGFjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVsYXRpdmVQYXRoU3RhY2suYWRkKHRvUGF0aFN0YWNrW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBnZXRQYXRoKHJlbGF0aXZlUGF0aFN0YWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFsbCBuYW1lcyBvZiB0aGUgcGF0aCBhcyBhbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHRvIGdldCBuYW1lcyBmcm9tCisgICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+cywgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQYXRoU3RhY2soU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKworICAgICAgICAvLyBzaW5jZSBKYXZhIDEuNAorICAgICAgICAvL3JldHVybiBub3JtYWxpemVkUGF0aC5zcGxpdCgiLyIpOworICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBKYXZhIDEuMi0xLjMKKyAgICAgICAgT2JqZWN0W10gdG9rZW5zID0gU3RyaW5nVXRpbHMuc3BsaXQobm9ybWFsaXplZFBhdGgsICcvJykudG9BcnJheSgpOworICAgICAgICBTdHJpbmdbXSBydiA9IG5ldyBTdHJpbmdbdG9rZW5zLmxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG9rZW5zLCAwLCBydiwgMCwgdG9rZW5zLmxlbmd0aCk7CisKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgcGF0aCBmcm9tIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aFN0YWNrIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT5zIHRvIGJlIGNvbmNhdGVuYXRlZCBhcyBhIHBhdGguCisgICAgICogQHJldHVybiA8Y29kZT5TdHJpbmc8L2NvZGU+LCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKExpc3QgcGF0aFN0YWNrKSB7CisgICAgICAgIC8vIGNhbiBzYWZlbHkgdXNlICcvJyBiZWNhdXNlIFdpbmRvd3MgdW5kZXJzdGFuZHMgJy8nIGFzIHNlcGFyYXRvcgorICAgICAgICByZXR1cm4gZ2V0UGF0aChwYXRoU3RhY2ssICcvJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBwYXRoIGZyb20gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoU3RhY2sgPGNvZGU+TGlzdDwvY29kZT4gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPnMgdG8gYmUgY29uY2F0ZWQgYXMgYSBwYXRoLgorICAgICAqIEBwYXJhbSBzZXBhcmF0b3JDaGFyIDxjb2RlPmNoYXI8L2NvZGU+IHRvIGJlIHVzZWQgYXMgc2VwYXJhdG9yIGJldHdlZW4gbmFtZXMgaW4gcGF0aAorICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nPC9jb2RlPiwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChmaW5hbCBMaXN0IHBhdGhTdGFjaywgZmluYWwgY2hhciBzZXBhcmF0b3JDaGFyKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IHBhdGhTdGFjay5pdGVyYXRvcigpOworICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaXRlci5uZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaXRlci5uZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICogVGhpcyBpcyBkb25lIGJ5IG9wZW5pbmcgYW4gSW5wdXRTdHJlYW1SZWFkZXIgb24KKyAgICAgKiBhIGR1bW15IElucHV0U3RyZWFtIGFuZCBnZXR0aW5nIHRoZSBlbmNvZGluZy4KKyAgICAgKiBDb3VsZCB1c2UgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIiksIGJ1dCBjYW5ub3QKKyAgICAgKiBzZWUgd2hlcmUgdGhpcyBpcyBkb2N1bWVudGVkLgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZmlsZSBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRFbmNvZGluZygpIHsKKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gaXMuZ2V0RW5jb2RpbmcoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlKGlzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmxhdEZpbGVOYW1lTWFwcGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZsYXRGaWxlTmFtZU1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMGNjYzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZsYXRGaWxlTmFtZU1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIEZpbGVOYW1lTWFwcGVyIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNvdXJjZQorICogZmlsZSBuYW1lIHdpdGhvdXQgYW55IGxlYWRpbmcgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgorICoKKyAqIDxwPlRoaXMgaXMgdGhlIGRlZmF1bHQgRmlsZU5hbWVNYXBwZXIgZm9yIHRoZSBjb3B5IGFuZCBtb3ZlCisgKiB0YXNrcyBpZiB0aGUgZmxhdHRlbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LjwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGbGF0RmlsZU5hbWVNYXBwZXIgaW1wbGVtZW50cyBGaWxlTmFtZU1hcHBlciB7CisKKyAgICAvKioKKyAgICAgKiBJZ25vcmVkLgorICAgICAqIEBwYXJhbSBmcm9tIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIElnbm9yZWQuCisgICAgICogQHBhcmFtIHRvIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG8oU3RyaW5nIHRvKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBvbmUtZWxlbWVudCBhcnJheSBjb250YWluaW5nIHRoZSBzb3VyY2UgZmlsZSBuYW1lCisgICAgICogd2l0aG91dCBhbnkgbGVhZGluZyBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIHRoZSBuYW1lIHRvIG1hcC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIG5hbWUgaW4gYSBvbmUtZWxlbWVudCBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoU3RyaW5nIHNvdXJjZUZpbGVOYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge25ldyBqYXZhLmlvLkZpbGUoc291cmNlRmlsZU5hbWUpLmdldE5hbWUoKX07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9HbG9iUGF0dGVybk1hcHBlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9HbG9iUGF0dGVybk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjM5NzIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0dsb2JQYXR0ZXJuTWFwcGVyLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIEZpbGVOYW1lTWFwcGVyIHRoYXQgZG9lcyBzaW1wbGUgd2lsZGNhcmQgcGF0dGVybgorICogcmVwbGFjZW1lbnRzLgorICoKKyAqIDxwPlRoaXMgZG9lcyBzaW1wbGUgdHJhbnNsYXRpb25zIGxpa2UgKi5mb28gLT4gKi5iYXIgd2hlcmUgdGhlCisgKiBwcmVmaXggdG8gLmZvbyB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkLiBJdCBvbmx5IGhhbmRsZXMgYSBzaW5nbGUgKgorICogY2hhcmFjdGVyLCB1c2UgcmVndWxhciBleHByZXNzaW9ucyBmb3IgbW9yZSBjb21wbGljYXRlZAorICogc2l0dWF0aW9ucy48L3A+CisgKgorICogPHA+VGhpcyBpcyBvbmUgb2YgdGhlIG1vcmUgdXNlZnVsIE1hcHBlcnMsIGl0IGlzIHVzZWQgYnkgamF2YWMgZm9yCisgKiBleGFtcGxlLjwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBHbG9iUGF0dGVybk1hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgLyoqCisgICAgICogUGFydCBvZiAmcXVvdDtmcm9tJnF1b3Q7IHBhdHRlcm4gYmVmb3JlIHRoZSAqLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZnJvbVByZWZpeCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBQYXJ0IG9mICZxdW90O2Zyb20mcXVvdDsgcGF0dGVybiBhZnRlciB0aGUgKi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZyb21Qb3N0Zml4ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIExlbmd0aCBvZiB0aGUgcHJlZml4ICgmcXVvdDtmcm9tJnF1b3Q7IHBhdHRlcm4pLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcHJlZml4TGVuZ3RoOworCisgICAgLyoqCisgICAgICogTGVuZ3RoIG9mIHRoZSBwb3N0Zml4ICgmcXVvdDtmcm9tJnF1b3Q7IHBhdHRlcm4pLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcG9zdGZpeExlbmd0aDsKKworICAgIC8qKgorICAgICAqIFBhcnQgb2YgJnF1b3Q7dG8mcXVvdDsgcGF0dGVybiBiZWZvcmUgdGhlICouCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0b1ByZWZpeCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBQYXJ0IG9mICZxdW90O3RvJnF1b3Q7IHBhdHRlcm4gYWZ0ZXIgdGhlICouCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0b1Bvc3RmaXggPSBudWxsOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVEaXJTZXAgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgc3BlY2lmaW5nIHdoZXRoZXIgdG8gaWdub3JlIHRoZSBkaWZmZXJlbmNlCisgICAgICogYmV0d2VlbiAvIGFuZCBcICh0aGUgdHdvIGNvbW1vbiBkaXJlY3RvcnkgY2hhcmFjdGVycykuCisgICAgICogQHBhcmFtIGhhbmRsZURpclNlcCBhIGJvb2xlYW4sIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZURpclNlcChib29sZWFuIGhhbmRsZURpclNlcCkgeworICAgICAgICB0aGlzLmhhbmRsZURpclNlcCA9IGhhbmRsZURpclNlcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgc3BlY2lmaW5nIHdoZXRoZXIgdG8gaWdub3JlIHRoZSBjYXNlIGRpZmZlcmVuY2UKKyAgICAgKiBpbiB0aGUgbmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZSBhIGJvb2xlYW4sIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgJnF1b3Q7ZnJvbSZxdW90OyBwYXR0ZXJuLiBSZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gZnJvbSBhIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHsKKyAgICAgICAgaW50IGluZGV4ID0gZnJvbS5sYXN0SW5kZXhPZigiKiIpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIGZyb21QcmVmaXggPSBmcm9tOworICAgICAgICAgICAgZnJvbVBvc3RmaXggPSAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyb21QcmVmaXggPSBmcm9tLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICBmcm9tUG9zdGZpeCA9IGZyb20uc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJlZml4TGVuZ3RoID0gZnJvbVByZWZpeC5sZW5ndGgoKTsKKyAgICAgICAgcG9zdGZpeExlbmd0aCA9IGZyb21Qb3N0Zml4Lmxlbmd0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlICZxdW90O3RvJnF1b3Q7IHBhdHRlcm4uIFJlcXVpcmVkLgorICAgICAqIEBwYXJhbSB0byBhIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgeworICAgICAgICBpbnQgaW5kZXggPSB0by5sYXN0SW5kZXhPZigiKiIpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHRvUHJlZml4ID0gdG87CisgICAgICAgICAgICB0b1Bvc3RmaXggPSAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRvUHJlZml4ID0gdG8uc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgIHRvUG9zdGZpeCA9IHRvLnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBzb3VyY2UgZmlsZSBuYW1lIGRvZXNuJ3QgbWF0Y2ggdGhlCisgICAgICogJnF1b3Q7ZnJvbSZxdW90OyBwYXR0ZXJuLCBhbiBvbmUtZWxlbWVudCBhcnJheSBjb250YWluaW5nIHRoZQorICAgICAqIHRyYW5zbGF0ZWQgZmlsZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIHRoZSBmaWxlbmFtZSB0byBtYXAKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBjb252ZXJ0ZWQgZmlsZW5hbWVzCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgeworICAgICAgICBpZiAoZnJvbVByZWZpeCA9PSBudWxsCisgICAgICAgICAgICB8fCAhbW9kaWZ5TmFtZShzb3VyY2VGaWxlTmFtZSkuc3RhcnRzV2l0aChtb2RpZnlOYW1lKGZyb21QcmVmaXgpKQorICAgICAgICAgICAgfHwgIW1vZGlmeU5hbWUoc291cmNlRmlsZU5hbWUpLmVuZHNXaXRoKG1vZGlmeU5hbWUoZnJvbVBvc3RmaXgpKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7dG9QcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXh0cmFjdFZhcmlhYmxlUGFydChzb3VyY2VGaWxlTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9Qb3N0Zml4fTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJ0IG9mIHRoZSBnaXZlbiBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSAqIGluIHRoZQorICAgICAqICZxdW90O2Zyb20mcXVvdDsgcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgc291cmNlIGZpbGUgbmFtZQorICAgICAqIEByZXR1cm4gdGhlIHZhcmlhYmxlIHBhcnQgb2YgdGhlIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RWYXJpYWJsZVBhcnQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKHByZWZpeExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUubGVuZ3RoKCkgLSBwb3N0Zml4TGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtb2RpZnkgc3RyaW5nIGJhc2VkIG9uIGRpciBjaGFyIG1hcHBpbmcgYW5kIGNhc2Ugc2Vuc2l0aXZpdHkKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBjb252ZXJ0CisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIG5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtb2RpZnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlRGlyU2VwKSB7CisgICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCdcXCcpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSWRlbnRpdHlNYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSWRlbnRpdHlNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmM2YzdlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9JZGVudGl0eU1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIEZpbGVOYW1lTWFwcGVyIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNvdXJjZSBmaWxlIG5hbWUuCisgKgorICogPHA+VGhpcyBpcyB0aGUgZGVmYXVsdCBGaWxlTmFtZU1hcHBlciBmb3IgdGhlIGNvcHkgYW5kIG1vdmUKKyAqIHRhc2tzLjwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJZGVudGl0eU1hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKKworICAgIC8qKgorICAgICAqIElnbm9yZWQuCisgICAgICogQHBhcmFtIGZyb20gaWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBmcm9tKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3JlZC4KKyAgICAgKiBAcGFyYW0gdG8gaWdub3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIG9uZS1lbGVtZW50IGFycmF5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlIG5hbWUuCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIHRoZSBuYW1lIHRvIG1hcC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZmlsZW5hbWUgaW4gYSBvbmUtZWxlbWVudCBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoU3RyaW5nIHNvdXJjZUZpbGVOYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge3NvdXJjZUZpbGVOYW1lfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0lkZW50aXR5U3RhY2suamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSWRlbnRpdHlTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmOTVjZjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0lkZW50aXR5U3RhY2suamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCisvKioKKyAqIElkZW50aXR5IFN0YWNrLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIElkZW50aXR5U3RhY2sgZXh0ZW5kcyBTdGFjayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTU1NTUyMjYyMDA2MDA3NzA0Nkw7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gSWRlbnRpdHlTdGFjayBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIFN0YWNrLgorICAgICAqIEBwYXJhbSBzIHRoZSBTdGFjayB0byBjb3B5OyBpZ25vcmVkIGlmIG51bGwuCisgICAgICogQHJldHVybiBhbiBJZGVudGl0eVN0YWNrIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSWRlbnRpdHlTdGFjayBnZXRJbnN0YW5jZShTdGFjayBzKSB7CisgICAgICAgIGlmIChzIGluc3RhbmNlb2YgSWRlbnRpdHlTdGFjaykgeworICAgICAgICAgICAgcmV0dXJuIChJZGVudGl0eVN0YWNrKSBzOworICAgICAgICB9CisgICAgICAgIElkZW50aXR5U3RhY2sgcmVzdWx0ID0gbmV3IElkZW50aXR5U3RhY2soKTsKKyAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIElkZW50aXR5U3RhY2soKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IElkZW50aXR5U3RhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIE9iamVjdAorICAgICAqIGFzIHRoZSBib3R0b20gZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gbyB0aGUgYm90dG9tIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIElkZW50aXR5U3RhY2soT2JqZWN0IG8pIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgcHVzaChvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBtZXRob2RzIHRoYXQgdXNlIDxjb2RlPi5lcXVhbHMoKTwvY29kZT4gY29tcGFyaXNvbnMgb24gZWxlbWVudHMuCisgICAgICogQHBhcmFtIG8gdGhlIE9iamVjdCB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RhY2sgY29udGFpbnMgdGhlIG9iamVjdC4KKyAgICAgKiBAc2VlIGphdmEudXRpbC5WZWN0b3IjY29udGFpbnMoT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICByZXR1cm4gaW5kZXhPZihvKSA+PSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIG1ldGhvZHMgdGhhdCB1c2UgPGNvZGU+LmVxdWFscygpPC9jb2RlPiBjb21wYXJpc29ucyBvbiBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gbyAgIHRoZSBPYmplY3QgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBmcm9tIHdoaWNoIHRvIHNlYXJjaC4KKyAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LCAtMSBpZiBub3QgZm91bmQuCisgICAgICogQHNlZSBqYXZhLnV0aWwuVmVjdG9yI2luZGV4T2YoT2JqZWN0LCBpbnQpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgaW5kZXhPZihPYmplY3QgbywgaW50IHBvcykgeworICAgICAgICBmb3IgKGludCBpID0gcG9zOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChnZXQoaSkgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBtZXRob2RzIHRoYXQgdXNlIDxjb2RlPi5lcXVhbHMoKTwvY29kZT4gY29tcGFyaXNvbnMgb24gZWxlbWVudHMuCisgICAgICogQHBhcmFtIG8gICB0aGUgT2JqZWN0IHRvIHNlYXJjaCBmb3IuCisgICAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gZnJvbSB3aGljaCB0byBzZWFyY2ggKGJhY2t3YXJkKS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LCAtMSBpZiBub3QgZm91bmQuCisgICAgICogQHNlZSBqYXZhLnV0aWwuVmVjdG9yI2luZGV4T2YoT2JqZWN0LCBpbnQpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8sIGludCBwb3MpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHBvczsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGlmIChnZXQoaSkgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSkFYUFV0aWxzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0pBWFBVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzEwZmIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0pBWFBVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlBhcnNlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworCisvLyBDaGVja1N0eWxlOkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvckNoZWNrIE9GRiAtIGJjCisKKy8qKgorICogQ29sbGVjdGlvbiBvZiBoZWxwZXIgbWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgUGFyc2VyRmFjdG9yeSBvcgorICogUGFyc2VycyBhbmQgUmVhZGVycy4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIHdpbGwgY3JlYXRlIG9ubHkgYSBzaW5nbGUgZmFjdG9yeSBpbnN0YW5jZS48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIEpBWFBVdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZm9yIHN5c3RlbUlkLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8qKgorICAgICAqIFBhcnNlciBmYWN0b3J5IHRvIHVzZSB0byBjcmVhdGUgcGFyc2Vycy4KKyAgICAgKiBAc2VlICNnZXRQYXJzZXJGYWN0b3J5CisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXIgRmFjdG9yeSB0byBjcmVhdGUgTmFtZXNwYWNlIGF3YXJlIHBhcnNlcnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgbnNQYXJzZXJGYWN0b3J5ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFBhcnNlciBmYWN0b3J5IHRvIHVzZSB0byBjcmVhdGUgZG9jdW1lbnQgYnVpbGRlcnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYnVpbGRlckZhY3RvcnkgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyc2VyIGZhY3RvcnkgdG8gdXNlLiBPbmx5IG9uZSBwYXJzZXIgZmFjdG9yeSBpcworICAgICAqIGV2ZXIgY3JlYXRlZCBieSB0aGlzIG1ldGhvZCBhbmQgaXMgdGhlbiBjYWNoZWQgZm9yIGZ1dHVyZSB1c2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgU0FYUGFyc2VyRmFjdG9yeSB0byB1c2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU0FYUGFyc2VyRmFjdG9yeSBnZXRQYXJzZXJGYWN0b3J5KCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocGFyc2VyRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXJzZXJGYWN0b3J5ID0gbmV3UGFyc2VyRmFjdG9yeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXJzZXJGYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhcnNlciBmYWN0b3J5IHRvIHVzZSB0byBjcmVhdGUgbmFtZXNwYWNlIGF3YXJlIHBhcnNlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgU0FYUGFyc2VyRmFjdG9yeSB0byB1c2Ugd2hpY2ggc3VwcG9ydHMgbWFudWZhY3R1cmUgb2YKKyAgICAgKiBuYW1lc3BhY2UgYXdhcmUgcGFyc2Vycy4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTQVhQYXJzZXJGYWN0b3J5IGdldE5TUGFyc2VyRmFjdG9yeSgpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKG5zUGFyc2VyRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICBuc1BhcnNlckZhY3RvcnkgPSBuZXdQYXJzZXJGYWN0b3J5KCk7CisgICAgICAgICAgICBuc1BhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5zUGFyc2VyRmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3ICBwYXJzZXIgZmFjdG9yeSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhcnNlciBmYWN0b3J5LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgbmV3UGFyc2VyRmFjdG9yeSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJYTUwgcGFyc2VyIGZhY3RvcnkgaGFzIG5vdCBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjb25maWd1cmVkIGNvcnJlY3RseTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ld2x5IGNyZWF0ZWQgU0FYIDEgUGFyc2VyLCB1c2luZyB0aGUgZGVmYXVsdCBwYXJzZXIKKyAgICAgKiBmYWN0b3J5LgorICAgICAqCisgICAgICogQHJldHVybiBhIFNBWCAxIFBhcnNlci4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqIEBzZWUgI2dldFBhcnNlckZhY3RvcnkKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyc2VyIGdldFBhcnNlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3U0FYUGFyc2VyKGdldFBhcnNlckZhY3RvcnkoKSkuZ2V0UGFyc2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBjb252ZXJ0VG9CdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXdseSBjcmVhdGVkIFNBWCAyIFhNTFJlYWRlciwgdXNpbmcgdGhlIGRlZmF1bHQgcGFyc2VyCisgICAgICogZmFjdG9yeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBTQVggMiBYTUxSZWFkZXIuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKiBAc2VlICNnZXRQYXJzZXJGYWN0b3J5CisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFhNTFJlYWRlciBnZXRYTUxSZWFkZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ld1NBWFBhcnNlcihnZXRQYXJzZXJGYWN0b3J5KCkpLmdldFhNTFJlYWRlcigpOworICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgY29udmVydFRvQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBTQVggMiBYTUxSZWFkZXIsIHdoaWNoIGlzIG5hbWVzcGFjZSBhd2FyZQorICAgICAqCisgICAgICogQHJldHVybiBhIFNBWCAyIFhNTFJlYWRlci4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqIEBzZWUgI2dldFBhcnNlckZhY3RvcnkKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgWE1MUmVhZGVyIGdldE5hbWVzcGFjZVhNTFJlYWRlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3U0FYUGFyc2VyKGdldE5TUGFyc2VyRmFjdG9yeSgpKS5nZXRYTUxSZWFkZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGNvbnZlcnRUb0J1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIGJlc3QgYXR0ZW1wdCB0byBwcm92aWRlIGEgVVJMLnRvRXh0ZXJuYWxGb3JtKCkgZnJvbQorICAgICAqIGEgZmlsZSBVUkwuIFNvbWUgcGFyc2VycyBsaWtlIENyaW1zb24gY2hva2Ugb24gdXJpIHRoYXQgYXJlIG1hZGUgb2YKKyAgICAgKiBiYWNrc2xhc2hlZCBwYXRocyAoaWUgd2luZG93cykgYXMgaXQgaXMgZG9lcyBub3QgY29uZm9ybQorICAgICAqIFVSSSBzcGVjaWZpY2F0aW9ucy4KKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSB0byBjcmVhdGUgdGhlIHN5c3RlbSBpZCBmcm9tLgorICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbWlkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZpbGUuCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbUlkKEZpbGUgZmlsZSkgeworICAgICAgICByZXR1cm4gRklMRV9VVElMUy50b1VSSShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBEb2N1bWVudEJ1aWxkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgRG9jdW1lbnRCdWlsZGVyLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICogQHNpbmNlIEFudCAxLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldERvY3VtZW50QnVpbGRlckZhY3RvcnkoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgbmV3IFNBWFBhcnNlciBpbnN0YW5jZSBhcyBoZWxwZXIgZm9yIGdldFBhcnNlciBhbmQKKyAgICAgKiBnZXRYTUxSZWFkZXIuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNBWFBhcnNlciBuZXdTQVhQYXJzZXIoU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5KQorICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBwYXJzZXIgZm9yIHRoZSBnaXZlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29uZmlndXJhdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGNvbnZlcnRUb0J1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIGEgU0FYRXhjZXB0aW9uIGludG8gYSBCdWlsZEV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCdWlsZEV4Y2VwdGlvbiBjb252ZXJ0VG9CdWlsZEV4Y2VwdGlvbihTQVhFeGNlcHRpb24gZSkgeworICAgICAgICBFeGNlcHRpb24gbmVzdGVkID0gZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKG5lc3RlZCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKG5lc3RlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyB0aGUgZGVmYXVsdCBidWlsZGVyIGZhY3RvcnkgaWYgbm90IGFscmVhZHkuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZAorICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGdldERvY3VtZW50QnVpbGRlckZhY3RvcnkoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoYnVpbGRlckZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBidWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRG9jdW1lbnQgYnVpbGRlciBmYWN0b3J5IGhhcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZWVuIGNvbmZpZ3VyZWQgY29ycmVjdGx5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyRmFjdG9yeTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSmF2YUVudlV0aWxzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0phdmFFbnZVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZWEyNTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0phdmFFbnZVdGlscy5qYXZhCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworCisvKioKKyAqIEEgc2V0IG9mIGhlbHBlciBtZXRob2RzIHJlbGF0ZWQgdG8gbG9jYXRpbmcgZXhlY3V0YWJsZXMgb3IgY2hlY2tpbmcKKyAqIGNvbmRpdG9ucyBvZiBhIGdpdmVuIEphdmEgaW5zdGFsbGF0aW9uLgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKYXZhRW52VXRpbHMgeworCisgICAgcHJpdmF0ZSBKYXZhRW52VXRpbHMoKSB7CisgICAgfQorCisgICAgLyoqIEFyZSB3ZSBvbiBhIERPUy1iYXNlZCBzeXN0ZW0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0RPUyA9IE9zLmlzRmFtaWx5KCJkb3MiKTsKKyAgICAvKiogQXJlIHdlIG9uIE5vdmVsbCBOZXRXYXJlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19ORVRXQVJFID0gT3MuaXNOYW1lKCJuZXR3YXJlIik7CisgICAgLyoqIEFyZSB3ZSBvbiBBSVggKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0FJWCA9IE9zLmlzTmFtZSgiYWl4Iik7CisKKyAgICAvKiogc2hvcnRjdXQgZm9yIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9IT01FID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsKKworICAgIC8qKiBGaWxlVXRpbHMgaW5zdGFuY2UgZm9yIHBhdGggbm9ybWFsaXphdGlvbiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqIFZlcnNpb24gb2YgY3VycmVudGx5IHJ1bm5pbmcgVk0uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGphdmFWZXJzaW9uOworCisgICAgLyoqIGZsb2F0aW5nIHZlcnNpb24gb2YgdGhlIEpWTSAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBqYXZhVmVyc2lvbk51bWJlcjsKKworICAgIC8qKiBWZXJzaW9uIGNvbnN0YW50IGZvciBKYXZhIDEuMCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfMV8wID0gIjEuMCI7CisgICAgLyoqIE51bWJlciBWZXJzaW9uIGNvbnN0YW50IGZvciBKYXZhIDEuMCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8wID0gMTA7CisKKyAgICAvKiogVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxLjEgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBXzFfMSA9ICIxLjEiOworICAgIC8qKiBOdW1iZXIgVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxLjEgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMSA9IDExOworCisgICAgLyoqIFZlcnNpb24gY29uc3RhbnQgZm9yIEphdmEgMS4yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xXzIgPSAiMS4yIjsKKyAgICAvKiogTnVtYmVyIFZlcnNpb24gY29uc3RhbnQgZm9yIEphdmEgMS4yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzIgPSAxMjsKKworICAgIC8qKiBWZXJzaW9uIGNvbnN0YW50IGZvciBKYXZhIDEuMyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfMV8zID0gIjEuMyI7CisgICAgLyoqIE51bWJlciBWZXJzaW9uIGNvbnN0YW50IGZvciBKYXZhIDEuMyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8zID0gMTM7CisKKyAgICAvKiogVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxLjQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBXzFfNCA9ICIxLjQiOworICAgIC8qKiBOdW1iZXIgVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxLjQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfNCA9IDE0OworCisgICAgLyoqIFZlcnNpb24gY29uc3RhbnQgZm9yIEphdmEgMS41ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xXzUgPSAiMS41IjsKKyAgICAvKiogTnVtYmVyIFZlcnNpb24gY29uc3RhbnQgZm9yIEphdmEgMS41ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzUgPSAxNTsKKworICAgIC8qKiBWZXJzaW9uIGNvbnN0YW50IGZvciBKYXZhIDEuNiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfMV82ID0gIjEuNiI7CisgICAgLyoqIE51bWJlciBWZXJzaW9uIGNvbnN0YW50IGZvciBKYXZhIDEuNiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV82ID0gMTY7CisKKyAgICAvKiogV2hldGhlciB0aGlzIGlzIHRoZSBLYWZmZSBWTSAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4ga2FmZmVEZXRlY3RlZDsKKworICAgIC8qKiBhcnJheSBvZiBwYWNrYWdlcyBpbiB0aGUgcnVudGltZSAqLworICAgIHByaXZhdGUgc3RhdGljIFZlY3RvciBqcmVQYWNrYWdlczsKKworCisgICAgc3RhdGljIHsKKworICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIEphdmEgdmVyc2lvbiBieSBsb29raW5nIGF0IGF2YWlsYWJsZSBjbGFzc2VzCisgICAgICAgIC8vIGphdmEubmV0LlByb3h5IHdhcyBpbnRyb2R1Y2VkIGluIEpESyAxLjUKKyAgICAgICAgLy8gamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSB3YXMgaW50cm9kdWNlZCBpbiBKREsgMS40CisgICAgICAgIC8vIGphdmEubGFuZy5TdHJpY3RNYXRoIHdhcyBpbnRyb2R1Y2VkIGluIEpESyAxLjMKKyAgICAgICAgLy8gamF2YS5sYW5nLlRocmVhZExvY2FsIHdhcyBpbnRyb2R1Y2VkIGluIEpESyAxLjIKKyAgICAgICAgLy8gamF2YS5sYW5nLlZvaWQgd2FzIGludHJvZHVjZWQgaW4gSkRLIDEuMQorICAgICAgICAvLyBDb3VudCB1cCB2ZXJzaW9uIHVudGlsIGEgTm9DbGFzc0RlZkZvdW5kRXJyb3IgZW5kcyB0aGUgdHJ5CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphdmFWZXJzaW9uID0gSkFWQV8xXzA7CisgICAgICAgICAgICBqYXZhVmVyc2lvbk51bWJlciA9IFZFUlNJT05fMV8wOworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlZvaWQiKTsKKyAgICAgICAgICAgIGphdmFWZXJzaW9uID0gSkFWQV8xXzE7CisgICAgICAgICAgICBqYXZhVmVyc2lvbk51bWJlcisrOworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLlRocmVhZExvY2FsIik7CisgICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV8yOworICAgICAgICAgICAgamF2YVZlcnNpb25OdW1iZXIrKzsKKyAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubGFuZy5TdHJpY3RNYXRoIik7CisgICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV8zOworICAgICAgICAgICAgamF2YVZlcnNpb25OdW1iZXIrKzsKKyAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubGFuZy5DaGFyU2VxdWVuY2UiKTsKKyAgICAgICAgICAgIGphdmFWZXJzaW9uID0gSkFWQV8xXzQ7CisgICAgICAgICAgICBqYXZhVmVyc2lvbk51bWJlcisrOworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5uZXQuUHJveHkiKTsKKyAgICAgICAgICAgIGphdmFWZXJzaW9uID0gSkFWQV8xXzU7CisgICAgICAgICAgICBqYXZhVmVyc2lvbk51bWJlcisrOworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlNlcnZpY2VMb2FkZXIiKTsKKyAgICAgICAgICAgIGphdmFWZXJzaW9uID0gSkFWQV8xXzY7CisgICAgICAgICAgICBqYXZhVmVyc2lvbk51bWJlcisrOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gc3dhbGxvdyBhcyB3ZSd2ZSBoaXQgdGhlIG1heCBjbGFzcyB2ZXJzaW9uIHRoYXQKKyAgICAgICAgICAgIC8vIHdlIGhhdmUKKyAgICAgICAgfQorICAgICAgICBrYWZmZURldGVjdGVkID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJrYWZmZS51dGlsLk5vdEltcGxlbWVudGVkIik7CisgICAgICAgICAgICBrYWZmZURldGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vIHN3YWxsb3cgYXMgdGhpcyBzaW1wbHkgZG9lc24ndCBzZWVtIHRvIGJlIEthZmZlCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIEphdmEgdGhpcyBjbGFzcyBpcyBydW5uaW5nIHVuZGVyLgorICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgSmF2YSBhcyBhIFN0cmluZywgZS5nLiAiMS4xIgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gamF2YVZlcnNpb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIEphdmEgdGhpcyBjbGFzcyBpcyBydW5uaW5nIHVuZGVyLgorICAgICAqIFRoaXMgbnVtYmVyIGNhbiBiZSB1c2VkIGZvciBjb21wYXJpc2lvbnM7IGl0IHdpbGwgYWx3YXlzIGJlCisgICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiBKYXZhIGFzIGEgbnVtYmVyIDEweCB0aGUgbWFqb3IvbWlub3IsCisgICAgICogZS5nIEphdmExLjUgaGFzIGEgdmFsdWUgb2YgMTUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRKYXZhVmVyc2lvbk51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIGphdmFWZXJzaW9uTnVtYmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSBjdXJyZW50IEphdmEgdmVyc2lvbiB0byB0aGUgcGFzc2VkIGluIFN0cmluZyAtCisgICAgICogYXNzdW1lcyB0aGUgYXJndW1lbnQgaXMgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzCisgICAgICogY2xhc3MuCisgICAgICogTm90ZSB0aGF0IEFudCBub3cgcmVxdWlyZXMgSkRLIDEuMisgc28ge0BsaW5rICNKQVZBXzFfMH0gYW5kCisgICAgICoge0BsaW5rICNKQVZBXzFfMX0gbmVlZCBubyBsb25nZXIgYmUgdGVzdGVkIGZvci4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiB0byBjaGVjayBhZ2FpbnN0IHRoZSBjdXJyZW50IHZlcnNpb24uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2ZXJzaW9uIG9mIEphdmEgaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIHZlcnNpb24uCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworICAgICAgICByZXR1cm4gamF2YVZlcnNpb24uZXF1YWxzKHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSBjdXJyZW50IEphdmEgdmVyc2lvbiB0byB0aGUgcGFzc2VkIGluIFN0cmluZyAtCisgICAgICogYXNzdW1lcyB0aGUgYXJndW1lbnQgaXMgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzCisgICAgICogY2xhc3MuCisgICAgICogTm90ZSB0aGF0IEFudCBub3cgcmVxdWlyZXMgSkRLIDEuMisgc28ge0BsaW5rICNKQVZBXzFfMH0gYW5kCisgICAgICoge0BsaW5rICNKQVZBXzFfMX0gbmVlZCBubyBsb25nZXIgYmUgdGVzdGVkIGZvci4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiB0byBjaGVjayBhZ2FpbnN0IHRoZSBjdXJyZW50IHZlcnNpb24uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2ZXJzaW9uIG9mIEphdmEgaXMgdGhlIHNhbWUgb3IgaGlnaGVyIHRoYW4gdGhlCisgICAgICogZ2l2ZW4gdmVyc2lvbi4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F0TGVhc3RKYXZhVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworICAgICAgICByZXR1cm4gamF2YVZlcnNpb24uY29tcGFyZVRvKHZlcnNpb24pID49IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgSmF2YSBWTSBpcyBLYWZmZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgSmF2YSBWTSBpcyBLYWZmZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LmthZmZlLm9yZy8iPmh0dHA6Ly93d3cua2FmZmUub3JnLzwvYT4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNLYWZmZSgpIHsKKyAgICAgICAgcmV0dXJuIGthZmZlRGV0ZWN0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIHBhcnQgb2YgYSBKUkUgaW5zdGFsbGF0aW9uIGJhc2VkIG9uCisgICAgICogdGhlIGphdmEuaG9tZSBzeXN0ZW0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD48Y29kZT5qYXZhPC9jb2RlPiwgPGNvZGU+a2V5dG9vbDwvY29kZT4sCisgICAgICogPGNvZGU+cG9saWN5dG9vbDwvY29kZT4sIDxjb2RlPm9yYmQ8L2NvZGU+LCA8Y29kZT5ybWlkPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5ybWlyZWdpc3RyeTwvY29kZT4sIDxjb2RlPnNlcnZlcnRvb2w8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnRuYW1lc2VydjwvY29kZT4gYXJlIEpSRSBleGVjdXRhYmxlcyBvbiBTdW4gYmFzZWQKKyAgICAgKiBKUkUncy48L3A+CisgICAgICoKKyAgICAgKiA8cD5Zb3UgdHlwaWNhbGx5IGZpbmQgdGhlbSBpbiA8Y29kZT5KQVZBX0hPTUUvanJlL2JpbjwvY29kZT4gaWYKKyAgICAgKiA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+IHBvaW50cyB0byB5b3VyIEpESyBpbnN0YWxsYXRpb24uICBKREsKKyAgICAgKiAmbHQ7IDEuMiBoYXMgdGhlbSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIEpESworICAgICAqIGV4ZWN1dGFibGVzLjwvcD4KKyAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgamF2YSBleGVjdXRhYmxlIHRvIGZpbmQuCisgICAgICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgY29tbWFuZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpyZUV4ZWN1dGFibGUoU3RyaW5nIGNvbW1hbmQpIHsKKyAgICAgICAgaWYgKElTX05FVFdBUkUpIHsKKyAgICAgICAgICAgIC8vIEV4dHJhcG9sYXRpbmcgZnJvbToKKyAgICAgICAgICAgIC8vICJOZXRXYXJlIG1heSBoYXZlIGEgImphdmEiIGluIHRoYXQgZGlyZWN0b3J5LCBidXQgOTklIG9mCisgICAgICAgICAgICAvLyB0aGUgdGltZSwgeW91IGRvbid0IHdhbnQgdG8gZXhlY3V0ZSBpdCIgLS0gSmVmZiBUdWxsZXkKKyAgICAgICAgICAgIC8vIDxKVFVMTEVZQG5vdmVsbC5jb20+CisgICAgICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgakV4ZWN1dGFibGUgPSBudWxsOworCisgICAgICAgIGlmIChJU19BSVgpIHsKKyAgICAgICAgICAgIC8vIE9uIElCTSdzIEpESyAxLjIgdGhlIGRpcmVjdG9yeSBsYXlvdXQgaXMgZGlmZmVyZW50LCAxLjMgZm9sbG93cworICAgICAgICAgICAgLy8gU3VuJ3MgbGF5b3V0LgorICAgICAgICAgICAgakV4ZWN1dGFibGUgPSBmaW5kSW5EaXIoSkFWQV9IT01FICsgIi9zaCIsIGNvbW1hbmQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGpFeGVjdXRhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgIGpFeGVjdXRhYmxlID0gZmluZEluRGlyKEpBVkFfSE9NRSArICIvYmluIiwgY29tbWFuZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoakV4ZWN1dGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGpFeGVjdXRhYmxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSBvbiBXaW5kb3dzIGphdmEuaG9tZSBkb2Vzbid0IGFsd2F5cyByZWZlcgorICAgICAgICAgICAgLy8gdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24sIHNvIHdlIG5lZWQgdG8gZmFsbCBiYWNrIHRvCisgICAgICAgICAgICAvLyBhc3N1bWluZyBqYXZhIGlzIHNvbWV3aGVyZSBvbiB0aGUgUEFUSC4KKyAgICAgICAgICAgIHJldHVybiBhZGRFeHRlbnNpb24oY29tbWFuZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgcGFydCBvZiBhIEpESyBpbnN0YWxsYXRpb24gYmFzZWQgb24KKyAgICAgKiB0aGUgamF2YS5ob21lIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPllvdSB0eXBpY2FsbHkgZmluZCB0aGVtIGluIDxjb2RlPkpBVkFfSE9NRS9iaW48L2NvZGU+IGlmCisgICAgICogPGNvZGU+SkFWQV9IT01FPC9jb2RlPiBwb2ludHMgdG8geW91ciBKREsgaW5zdGFsbGF0aW9uLjwvcD4KKyAgICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgamF2YSBleGVjdXRhYmxlIHRvIGZpbmQuCisgICAgICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgY29tbWFuZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpka0V4ZWN1dGFibGUoU3RyaW5nIGNvbW1hbmQpIHsKKyAgICAgICAgaWYgKElTX05FVFdBUkUpIHsKKyAgICAgICAgICAgIC8vIEV4dHJhcG9sYXRpbmcgZnJvbToKKyAgICAgICAgICAgIC8vICJOZXRXYXJlIG1heSBoYXZlIGEgImphdmEiIGluIHRoYXQgZGlyZWN0b3J5LCBidXQgOTklIG9mCisgICAgICAgICAgICAvLyB0aGUgdGltZSwgeW91IGRvbid0IHdhbnQgdG8gZXhlY3V0ZSBpdCIgLS0gSmVmZiBUdWxsZXkKKyAgICAgICAgICAgIC8vIDxKVFVMTEVZQG5vdmVsbC5jb20+CisgICAgICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgakV4ZWN1dGFibGUgPSBudWxsOworCisgICAgICAgIGlmIChJU19BSVgpIHsKKyAgICAgICAgICAgIC8vIE9uIElCTSdzIEpESyAxLjIgdGhlIGRpcmVjdG9yeSBsYXlvdXQgaXMgZGlmZmVyZW50LCAxLjMgZm9sbG93cworICAgICAgICAgICAgLy8gU3VuJ3MgbGF5b3V0LgorICAgICAgICAgICAgakV4ZWN1dGFibGUgPSBmaW5kSW5EaXIoSkFWQV9IT01FICsgIi8uLi9zaCIsIGNvbW1hbmQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGpFeGVjdXRhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgIGpFeGVjdXRhYmxlID0gZmluZEluRGlyKEpBVkFfSE9NRSArICIvLi4vYmluIiwgY29tbWFuZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoakV4ZWN1dGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGpFeGVjdXRhYmxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIEpSRSBiaW4gZGlyZWN0b3J5LCBhbHNvIGNhdGNoZXMgSkRLIDEuMCBhbmQgMS4xCisgICAgICAgICAgICAvLyB3aGVyZSBqYXZhLmhvbWUgcG9pbnRzIHRvIHRoZSByb290IG9mIHRoZSBKREsgYW5kIE1hYyBPUyBYIHdoZXJlCisgICAgICAgICAgICAvLyB0aGUgd2hvbGUgZGlyZWN0b3J5IGxheW91dCBpcyBkaWZmZXJlbnQgZnJvbSBTdW4ncworICAgICAgICAgICAgcmV0dXJuIGdldEpyZUV4ZWN1dGFibGUoY29tbWFuZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc3lzdGVtIHNwZWNpZmljIGV4dGVuc2lvbiB0byB0aGUgbmFtZSBvZiBhbiBleGVjdXRhYmxlLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYWRkRXh0ZW5zaW9uKFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIC8vIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGV4dGVuc2lvbiBjYXNlIC0gZXhlIGZvciB3aW5kb3dzIGFuZCBPUy8yLAorICAgICAgICAvLyBub3RoaW5nIGZvciAqbml4LgorICAgICAgICByZXR1cm4gY29tbWFuZCArIChJU19ET1MgPyAiLmV4ZSIgOiAiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9vayBmb3IgYW4gZXhlY3V0YWJsZSBpbiBhIGdpdmVuIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZXhlY3V0YWJsZSBjYW5ub3QgYmUgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBmaW5kSW5EaXIoU3RyaW5nIGRpck5hbWUsIFN0cmluZyBjb21tYW5kTmFtZSkgeworICAgICAgICBGaWxlIGRpciA9IEZJTEVfVVRJTFMubm9ybWFsaXplKGRpck5hbWUpOworICAgICAgICBGaWxlIGV4ZWN1dGFibGUgPSBudWxsOworICAgICAgICBpZiAoZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBleGVjdXRhYmxlID0gbmV3IEZpbGUoZGlyLCBhZGRFeHRlbnNpb24oY29tbWFuZE5hbWUpKTsKKyAgICAgICAgICAgIGlmICghZXhlY3V0YWJsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRlbWFuZCBjcmVhdGlvbiBvZiB0aGUgcGFja2FnZSBsaXN0LgorICAgICAqIFdoZW4geW91IGFkZCBhIG5ldyBwYWNrYWdlLCBhZGQgYSBuZXcgdGVzdCBiZWxvdy4KKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYnVpbGRKcmVQYWNrYWdlcygpIHsKKyAgICAgICAganJlUGFja2FnZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHN3aXRjaChqYXZhVmVyc2lvbk51bWJlcikgeworICAgICAgICAgICAgY2FzZSBWRVJTSU9OXzFfNjoKKyAgICAgICAgICAgIGNhc2UgVkVSU0lPTl8xXzU6CisgICAgICAgICAgICAgICAgLy9JbiBKYXZhMS41LCB0aGUgYXBhY2hlIHN0dWZmIG1vdmVkLgorICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4ub3JnLmFwYWNoZSIpOworICAgICAgICAgICAgICAgIC8vZmFsbCB0aHJvdWdoLgorICAgICAgICAgICAgY2FzZSBWRVJTSU9OXzFfNDoKKyAgICAgICAgICAgICAgICBpZiAoamF2YVZlcnNpb25OdW1iZXIgPT0gVkVSU0lPTl8xXzQpIHsKKyAgICAgICAgICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgib3JnLmFwYWNoZS5jcmltc29uIik7CisgICAgICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoIm9yZy5hcGFjaGUueGFsYW4iKTsKKyAgICAgICAgICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgib3JnLmFwYWNoZS54bWwiKTsKKyAgICAgICAgICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgib3JnLmFwYWNoZS54cGF0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJvcmcuaWV0Zi5qZ3NzIik7CisgICAgICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgib3JnLnczYy5kb20iKTsKKyAgICAgICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJvcmcueG1sLnNheCIpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgY2FzZSBWRVJTSU9OXzFfMzoKKyAgICAgICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJvcmcub21nIik7CisgICAgICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgiY29tLnN1bi5jb3JiYSIpOworICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4uam5kaSIpOworICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4ubWVkaWEiKTsKKyAgICAgICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJjb20uc3VuLm5hbWluZyIpOworICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4ub3JnLm9tZyIpOworICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4ucm1pIik7CisgICAgICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgic3Vudy5pbyIpOworICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoInN1bncudXRpbCIpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgY2FzZSBWRVJTSU9OXzFfMjoKKyAgICAgICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJjb20uc3VuLmphdmEiKTsKKyAgICAgICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJjb20uc3VuLmltYWdlIik7CisgICAgICAgICAgICAgICAgLy8gYXJlIHRoZXJlIGFueSBoZXJlIHRoYXQgd2UgZm9yZ290PworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgY2FzZSBWRVJTSU9OXzFfMToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy90aGluZ3MgbGlrZSBzdW4ucmVmbGVjdGlvbiwgc3VuLm1pc2MsIHN1bi5uZXQKKyAgICAgICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJzdW4iKTsKKyAgICAgICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJqYXZhIik7CisgICAgICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgiamF2YXgiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RpbmcgaGVscGVyIG1ldGhvZDsga2VwdCBoZXJlIGZvciB1bmlmaWNhdGlvbiBvZiBjaGFuZ2VzLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHRlc3QgY2xhc3NlcyBkZXBlbmRpbmcgb24gdGhlIGphdmEgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRKcmVQYWNrYWdlVGVzdENhc2VzKCkgeworICAgICAgICBWZWN0b3IgdGVzdHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoImphdmEubGFuZy5PYmplY3QiKTsKKyAgICAgICAgc3dpdGNoKGphdmFWZXJzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBjYXNlIFZFUlNJT05fMV82OgorICAgICAgICAgICAgY2FzZSBWRVJTSU9OXzFfNToKKyAgICAgICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAiY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5qYXhwLmRhdGF0eXBlLkRhdGF0eXBlRmFjdG9yeUltcGwgIik7CisgICAgICAgICAgICAgICAgLy8gRmFsbCB0cnUKKyAgICAgICAgICAgIGNhc2UgVkVSU0lPTl8xXzQ6CisgICAgICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgic3VuLmF1ZGlvLkF1ZGlvUGxheWVyIik7CisgICAgICAgICAgICAgICAgaWYgKGphdmFWZXJzaW9uTnVtYmVyID09IFZFUlNJT05fMV80KSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoIm9yZy5hcGFjaGUuY3JpbXNvbi5wYXJzZXIuQ29udGVudE1vZGVsIik7CisgICAgICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlByb2Nlc3NvckltcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJvcmcuYXBhY2hlLnhtbC51dGlscy5VUkkiKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgib3JnLmFwYWNoZS54cGF0aC5YUGF0aEZhY3RvcnkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgib3JnLmlldGYuamdzcy5PaWQiKTsKKyAgICAgICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJvcmcudzNjLmRvbS5BdHRyIik7CisgICAgICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgib3JnLnhtbC5zYXguWE1MUmVhZGVyIik7CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBjYXNlIFZFUlNJT05fMV8zOgorICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoIm9yZy5vbWcuQ09SQkEuQW55Iik7CisgICAgICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgiY29tLnN1bi5jb3JiYS5zZS5pbnRlcm5hbC5jb3JiYS5BbnlJbXBsIik7CisgICAgICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgiY29tLnN1bi5qbmRpLmxkYXAuTGRhcFVSTCIpOworICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoImNvbS5zdW4ubWVkaWEuc291bmQuUHJpbnRlciIpOworICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoImNvbS5zdW4ubmFtaW5nLmludGVybmFsLlZlcnNpb25IZWxwZXIiKTsKKyAgICAgICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJjb20uc3VuLm9yZy5vbWcuQ09SQkEuSW5pdGlhbGl6ZXIiKTsKKyAgICAgICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJzdW53LmlvLlNlcmlhbGl6YWJsZSIpOworICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoInN1bncudXRpbC5FdmVudExpc3RlbmVyIik7CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBjYXNlIFZFUlNJT05fMV8yOgorICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoImphdmF4LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZSIpOworICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoInN1bi5taXNjLkJBU0U2NEVuY29kZXIiKTsKKyAgICAgICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJjb20uc3VuLmltYWdlLmNvZGVjLmpwZWcuSlBFR0NvZGVjIik7CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBjYXNlIFZFUlNJT05fMV8xOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvL3RoaW5ncyBsaWtlIHN1bi5yZWZsZWN0aW9uLCBzdW4ubWlzYywgc3VuLm5ldAorICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoInN1bi5yZWZsZWN0LlNlcmlhbGl6YXRpb25Db25zdHJ1Y3RvckFjY2Vzc29ySW1wbCIpOworICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoInN1bi5uZXQud3d3Lmh0dHAuSHR0cENsaWVudCIpOworICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoInN1bi5hdWRpby5BdWRpb1BsYXllciIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0czsKKyAgICB9CisgICAgLyoqCisgICAgICogZ2V0IGEgdmVjdG9yIG9mIHN0cmluZ3Mgb2YgcGFja2FnZXMgYnVpbHQgaW50bworICAgICAqIHRoYXQgcGxhdGZvcm1zIHJ1bnRpbWUgamFyKHMpCisgICAgICogQHJldHVybiBsaXN0IG9mIHBhY2thZ2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yIGdldEpyZVBhY2thZ2VzKCkgeworICAgICAgICBpZiAoanJlUGFja2FnZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgYnVpbGRKcmVQYWNrYWdlcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBqcmVQYWNrYWdlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFdyaXRlcyB0aGUgY29tbWFuZCBpbnRvIGEgdGVtcG9yYXJ5IERDTCBzY3JpcHQgYW5kIHJldHVybnMgdGhlCisgICAgICogY29ycmVzcG9uZGluZyBGaWxlIG9iamVjdC4KKyAgICAgKiBJdCBpcyB0aGUgam9iIG9mIHRoZSBjYWxsZXIgdG8gZGVsZXRlIHRoZSBmaWxlIG9uIGV4aXQuCisgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVWbXNKYXZhT3B0aW9uRmlsZShTdHJpbmdbXSBjbWQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIHNjcmlwdCA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoIkFOVCIsICIuSkFWQV9PUFRTIiwgbnVsbCwgZmFsc2UsIHRydWUpOworICAgICAgICBQcmludFdyaXRlciBvdXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihzY3JpcHQpKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNtZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGNtZFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3V0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2NyaXB0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgJHtqYXZhLmhvbWV9CisgICAgICogQHJldHVybiB0aGUgamF2YSBob21lIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFIb21lKCkgeworICAgICAgICByZXR1cm4gSkFWQV9IT01FOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvS2VlcEFsaXZlSW5wdXRTdHJlYW0uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvS2VlcEFsaXZlSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzc5ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9LZWVwQWxpdmVJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIENsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JhcCA8dHQ+U3lzdGVtLmluPC90dD4KKyAqIHdpdGhvdXQgZ2V0dGluZyBhbnhpb3VzIGFib3V0IGFueSBjbGllbnQgY2xvc2luZyB0aGUgc3RyZWFtLgorICoKKyAqIDxwPgorICogSW4gY29kZS1sYW5ndWFnZSBpdCBtZWFucyB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZG86CisgKiA8cHJlPgorICogaWYgKG91dCAhPSBTeXN0ZW0uaW4pIHsKKyAqICAgaW4uY2xvc2UoKTsKKyAqIH0KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBLZWVwQWxpdmVJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIG9mIEtlZXBBbGl2ZUlucHV0U3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGluIGFuIElucHV0U3RyZWFtIHZhbHVlLCBpdCBzaG91bGQgYmUgc3RhbmRhcmQgaW5wdXQuCisgICAgICovCisgICAgcHVibGljIEtlZXBBbGl2ZUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7CisgICAgICAgIHN1cGVyKGluKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBhcyB3ZSBhcmUgb3ZlcnJpZGRpbmcgRmlsdGVySW5wdXRTdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBkbyBub3QgY2xvc2UgdGhlIHN0cmVhbQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvS2VlcEFsaXZlT3V0cHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0tlZXBBbGl2ZU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzdhMWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0tlZXBBbGl2ZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogQ2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byB3cmFwIDx0dD5TeXN0ZW0ub3V0PC90dD4gYW5kIDx0dD5TeXN0ZW0uZXJyPC90dD4KKyAqIHdpdGhvdXQgZ2V0dGluZyBhbnhpb3VzIGFib3V0IGFueSBjbGllbnQgY2xvc2luZyB0aGUgc3RyZWFtLgorICoKKyAqIDxwPgorICogSW4gY29kZS1sYW5ndWFnZSBpdCBtZWFucyB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZG86CisgKiA8cHJlPgorICogaWYgKG91dCAhPSBTeXN0ZW0ub3V0ICYmIG91dCE9IFN5c3RlbS5lcnIpIHsKKyAqICAgb3V0LmNsb3NlKCk7CisgKiB9CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBLZWVwQWxpdmVPdXRwdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igb2YgS2VlcEFsaXZlT3V0cHV0U3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIG91dCBhbiBPdXRwdXRTdHJlYW0gdmFsdWUsIGl0IHNob3VkbCBiZSBzdGFuZGFyZCBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIEtlZXBBbGl2ZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHN1cGVyKG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gYXMgd2UgYXJlIG92ZXJyaWRkaW5nIEZpbHRlck91dHB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvIG5vdCBjbG9zZSB0aGUgc3RyZWFtCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5RmlsZU91dHB1dFN0cmVhbS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5RmlsZU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjg5YjkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xhenlGaWxlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBDbGFzcyB0aGF0IGRlbGF5cyBvcGVuaW5nIHRoZSBvdXRwdXQgZmlsZSB1bnRpbCB0aGUgZmlyc3QgYnl0ZXMKKyAqIHNoYWxsIGJlIHdyaXR0ZW4gb3IgdGhlIG1ldGhvZCB7QGxpbmsgI29wZW4gb3Blbn0gaGFzIGJlZW4gaW52b2tlZAorICogZXhwbGljaXRseS4KKyAqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgTGF6eUZpbGVPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSBGaWxlT3V0cHV0U3RyZWFtIGZvczsKKyAgICBwcml2YXRlIEZpbGUgZmlsZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gYXBwZW5kOworICAgIHByaXZhdGUgYm9vbGVhbiBhbHdheXNDcmVhdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG9wZW5lZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCB3aWxsIGV2ZW50dWFsbHkgd3JpdGUgdG8gdGhlIGZpbGUgd2l0aAorICAgICAqIHRoZSBnaXZlbiBuYW1lIGFuZCByZXBsYWNlIGl0LgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmaWxlbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGF6eUZpbGVPdXRwdXRTdHJlYW0oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcyhuYW1lLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IHdpbGwgZXZlbnR1YWxseSB3cml0ZSB0byB0aGUgZmlsZSB3aXRoCisgICAgICogdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsbHkgYXBwZW5kIHRvIGluc3RlYWQgb2YgcmVwbGFjaW5nCisgICAgICogaXQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZpbGVuYW1lLgorICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSBhcHBlbmQgcmF0aGVyIHRoYW4gcmVwbGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGF6eUZpbGVPdXRwdXRTdHJlYW0oU3RyaW5nIG5hbWUsIGJvb2xlYW4gYXBwZW5kKSB7CisgICAgICAgIHRoaXMobmV3IEZpbGUobmFtZSksIGFwcGVuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IHdpbGwgZXZlbnR1YWxseSB3cml0ZSB0byB0aGUgZmlsZSB3aXRoCisgICAgICogdGhlIGdpdmVuIG5hbWUgYW5kIHJlcGxhY2UgaXQuCisgICAgICogQHBhcmFtIGYgdGhlIGZpbGUgdG8gY3JlYXRlLgorICAgICAqLworICAgIHB1YmxpYyBMYXp5RmlsZU91dHB1dFN0cmVhbShGaWxlIGYpIHsKKyAgICAgICAgdGhpcyhmLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IHdpbGwgZXZlbnR1YWxseSB3cml0ZSB0byB0aGUgZmlsZSB3aXRoCisgICAgICogdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsbHkgYXBwZW5kIHRvIGluc3RlYWQgb2YgcmVwbGFjaW5nCisgICAgICogaXQuCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gY3JlYXRlLgorICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSBhcHBlbmQgcmF0aGVyIHRoYW4gcmVwbGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGF6eUZpbGVPdXRwdXRTdHJlYW0oRmlsZSBmaWxlLCBib29sZWFuIGFwcGVuZCkgeworICAgICAgICB0aGlzKGZpbGUsIGFwcGVuZCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCB3aWxsIGV2ZW50dWFsbHkgd3JpdGUgdG8gdGhlIGZpbGUgd2l0aAorICAgICAqIHRoZSBnaXZlbiBuYW1lLCBvcHRpb25hbGx5IGFwcGVuZCB0byBpbnN0ZWFkIG9mIHJlcGxhY2luZworICAgICAqIGl0LCBhbmQgb3B0aW9uYWxseSBhbHdheXMgY3JlYXRlIGEgZmlsZSAoZXZlbiBpZiB6ZXJvIGxlbmd0aCkuCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gY3JlYXRlLgorICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSBhcHBlbmQgcmF0aGVyIHRoYW4gcmVwbGFjZS4KKyAgICAgKiBAcGFyYW0gYWx3YXlzQ3JlYXRlIGlmIHRydWUgY3JlYXRlIHRoZSBmaWxlIGV2ZW4gaWYgbm90aGluZyB0byB3cml0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGF6eUZpbGVPdXRwdXRTdHJlYW0oRmlsZSBmaWxlLCBib29sZWFuIGFwcGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbHdheXNDcmVhdGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgdGhpcy5hcHBlbmQgPSBhcHBlbmQ7CisgICAgICAgIHRoaXMuYWx3YXlzQ3JlYXRlID0gYWx3YXlzQ3JlYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGxpY2l0bHkgb3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZy4KKyAgICAgKgorICAgICAqIDxwPlJldHVybnMgc2lsZW50bHkgaWYgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBvcGVuZWQuPC9wPgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuc3VyZU9wZW5lZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBmaWxlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFsd2F5c0NyZWF0ZSAmJiAhY2xvc2VkKSB7CisgICAgICAgICAgICBlbnN1cmVPcGVuZWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3BlbmVkKSB7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBjbG9zZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlcyB0byB0aGUgdGhyZWUtYXJnIHZlcnNpb24uCisgICAgICogQHBhcmFtIGIgdGhlIGJ5dGVhcnJheSB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGUoYiwgMCwgYi5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHBhcnQgb2YgYSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBiIHRoZSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmZzZXQgd3JpdGUgZnJvbSB0aGlzIGluZGV4LgorICAgICAqIEBwYXJhbSBsZW4gICAgdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmVtLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZW5zdXJlT3BlbmVkKCk7CisgICAgICAgIGZvcy53cml0ZShiLCBvZmZzZXQsIGxlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBieXRlLgorICAgICAqIEBwYXJhbSBiIHRoZSBieXRlIHRvIHdyaXRlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZW5zdXJlT3BlbmVkKCk7CisgICAgICAgIGZvcy53cml0ZShiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGVuc3VyZU9wZW5lZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihmaWxlICsgIiBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghb3BlbmVkKSB7CisgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBhcHBlbmQpOworICAgICAgICAgICAgb3BlbmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF6eUhhc2h0YWJsZS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5SGFzaHRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmYWY5MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF6eUhhc2h0YWJsZS5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqIEhhc2h0YWJsZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyBkZWxheWVkIGNvbnN0cnVjdGlvbgorICogb2YgZXhwZW5zaXZlIG9iamVjdHMKKyAqCisgKiBBbGwgb3BlcmF0aW9ucyB0aGF0IG5lZWQgYWNjZXNzIHRvIHRoZSBmdWxsIGxpc3Qgb2Ygb2JqZWN0cworICogd2lsbCBjYWxsIGluaXRBbGwoKSBmaXJzdC4gR2V0IGFuZCBwdXQgYXJlIGNoZWFwLgorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBMYXp5SGFzaHRhYmxlIGV4dGVuZHMgSGFzaHRhYmxlIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBib29sZWFuIGluaXRBbGxEb25lID0gZmFsc2U7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKworICAgIC8qKiBObyBhcmcgY29uc3RydWN0b3IuICovCisgICAgcHVibGljIExhenlIYXNodGFibGUoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqIFVzZWQgdG8gYmUgcGFydCBvZiBpbml0LiBJdCBtdXN0IGJlIGRvbmUgb25jZSAtIGJ1dAorICAgICAqIHdlIGRlbGF5IGl0IHVudGlsIHdlIGRvIG5lZWQgX2FsbF8gdGFza3MuIE90aGVyd2lzZSB3ZQorICAgICAqIGp1c3QgZ2V0IHRoZSB0YXNrcyB0aGF0IHdlIG5lZWQsIGFuZCBhdm9pZCBjb3N0bHkgaW5pdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0QWxsKCkgeworICAgICAgICBpZiAoaW5pdEFsbERvbmUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbml0QWxsRG9uZSA9IHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBlbnVtZXJhdGlvbiBvdmVyIHRoZSBlbGVtZW50cy4KKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKKyAgICAgICAgaW5pdEFsbCgpOworICAgICAgICByZXR1cm4gc3VwZXIuZWxlbWVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgdGFibGUgaXMgZW1wdHkuCisgICAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIGluaXRBbGwoKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIHRhYmxlLgorICAgICAqIEByZXR1cm4gdGhlIHNpemUuCisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBpbml0QWxsKCk7CisgICAgICAgIHJldHVybiBzdXBlci5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGEgcGFydGljdWxhciB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgY29udGFpbnMgdGhlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpbml0QWxsKCk7CisgICAgICAgIHJldHVybiBzdXBlci5jb250YWlucyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGEgcGFydGljdWxhciBrZXkuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBrZXkgdG8gbG9vayBmb3IuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YWJsZSBjb250YWlucyBrZXkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGluaXRBbGwoKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmNvbnRhaW5zS2V5KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rICNjb250YWlucyBjb250YWluc30uCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhYmxlIGNvbnRhaW5zIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gY29udGFpbnModmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBlbnVtZXJhdGlvbiBvdmVyIHRoZSBrZXlzLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGtleXMoKSB7CisgICAgICAgIGluaXRBbGwoKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmtleXMoKTsKKyAgICB9CisKKyAgICAvLyBYWFggVW5mb3J0dW5hdGVseSBKREsxLjIgYWRkcyBlbnRyeVNldCgpLCBrZXlTZXQoKSwgdmFsdWVzKCkgLQorICAgIC8vIGltcGxlbWVudGluZyB0aGlzIHJlcXVpcmVzIGEgc21hbGwgaGFjaywgd2UgY2FuIGFkZCBpdCBsYXRlci4KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGVhZFBpcGVJbnB1dFN0cmVhbS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MZWFkUGlwZUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzY4OGUxYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGVhZFBpcGVJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBTcGVjaWFsIDxjb2RlPlBpcGVkSW5wdXRTdHJlYW08L2NvZGU+IHRoYXQgd2lsbCBub3QgZGllCisgKiB3aGVuIHRoZSB3cml0aW5nIDxjb2RlPlRocmVhZDwvY29kZT4gaXMgbm8gbG9uZ2VyIGFsaXZlLgorICogQHNpbmNlIEFudCAxLjYuMgorICovCitwdWJsaWMgY2xhc3MgTGVhZFBpcGVJbnB1dFN0cmVhbSBleHRlbmRzIFBpcGVkSW5wdXRTdHJlYW0geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFX01BU0sgPSAweEZGOworICAgIHByaXZhdGUgUHJvamVjdENvbXBvbmVudCBtYW5hZ2luZ1BjOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IDxjb2RlPkxlYWRQaXBlSW5wdXRTdHJlYW08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBMZWFkUGlwZUlucHV0U3RyZWFtKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyA8Y29kZT5MZWFkUGlwZUlucHV0U3RyZWFtPC9jb2RlPgorICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZS4KKyAgICAgKiBAcGFyYW0gc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBjaXJjdWxhciBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIExlYWRQaXBlSW5wdXRTdHJlYW0oaW50IHNpemUpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0QnVmZmVyU2l6ZShzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+TGVhZFBpcGVJbnB1dFN0cmVhbTwvY29kZT4gdG8gcHVsbAorICAgICAqIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5QaXBlZE91dHB1dFN0cmVhbTwvY29kZT4uCisgICAgICogQHBhcmFtIHNyYyAgIHRoZSA8Y29kZT5QaXBlZE91dHB1dFN0cmVhbTwvY29kZT4gc291cmNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNvbnN0cnVjdCB0aGUgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBMZWFkUGlwZUlucHV0U3RyZWFtKFBpcGVkT3V0cHV0U3RyZWFtIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoc3JjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgPGNvZGU+TGVhZFBpcGVJbnB1dFN0cmVhbTwvY29kZT4gdG8gcHVsbAorICAgICAqIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5QaXBlZE91dHB1dFN0cmVhbTwvY29kZT4sIHVzaW5nIGEKKyAgICAgKiBjaXJjdWxhciBidWZmZXIgb2YgdGhlIHNwZWNpZmllZCBzaXplLgorICAgICAqIEBwYXJhbSBzcmMgICAgdGhlIDxjb2RlPlBpcGVkT3V0cHV0U3RyZWFtPC9jb2RlPiBzb3VyY2UuCisgICAgICogQHBhcmFtIHNpemUgICB0aGUgc2l6ZSBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIExlYWRQaXBlSW5wdXRTdHJlYW0oUGlwZWRPdXRwdXRTdHJlYW0gc3JjLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoc3JjKTsKKyAgICAgICAgc2V0QnVmZmVyU2l6ZShzaXplKTsKKyAgICB9CisKKyAgICAvL2luaGVyaXQgZG9jCisgICAgLyoqCisgICAgICogUmVhZCBhIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgKDAgdG8gMjU1KSBvciAtMSBpZiB0aGVyZSBhcmUgbm8gbW9yZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgcmVzdWx0ID0gLTE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXN1bHQgPSBzdXBlci5yZWFkKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV5ZU9oRXgpIHsKKyAgICAgICAgICAgIGlmICgid3JpdGUgZW5kIGRlYWQiLmVxdWFsc0lnbm9yZUNhc2UoZXllT2hFeC5nZXRNZXNzYWdlKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN1cGVyLmluID4gMCAmJiBzdXBlci5vdXQgPCBzdXBlci5idWZmZXIubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICYmIHN1cGVyLm91dCA+IHN1cGVyLmluKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN1cGVyLmJ1ZmZlcltzdXBlci5vdXQrK10gJiBCWVRFX01BU0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2coImVycm9yIGF0IExlYWRQaXBlSW5wdXRTdHJlYW0ucmVhZCgpOiAgIgorICAgICAgICAgICAgICAgICAgICArIGV5ZU9oRXguZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBzaXplICAgdGhlIG5ldyBidWZmZXIgc2l6ZS4gIElnbm9yZWQgaWYgPD0gY3VycmVudCBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzaXplKSB7CisgICAgICAgIGlmIChzaXplID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgYnl0ZVtdIG5ld0J1ZmZlciA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgaWYgKGluID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaW4gPiBvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIG91dCwgbmV3QnVmZmVyLCBvdXQsIGluIC0gb3V0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgb3V0bGVuID0gYnVmZmVyLmxlbmd0aCAtIG91dDsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIG91dCwgbmV3QnVmZmVyLCAwLCBvdXRsZW4pOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgbmV3QnVmZmVyLCBvdXRsZW4sIGluKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gKz0gb3V0bGVuOworICAgICAgICAgICAgICAgICAgICBvdXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIG1hbmFnaW5nIDxjb2RlPlRhc2s8L2NvZGU+IGZvcgorICAgICAqIHRoaXMgPGNvZGU+TGVhZFBpcGVJbnB1dFN0cmVhbTwvY29kZT4uCisgICAgICogQHBhcmFtIHRhc2sgICB0aGUgbWFuYWdpbmcgPGNvZGU+VGFzazwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdpbmdUYXNrKFRhc2sgdGFzaykgeworICAgICAgICBzZXRNYW5hZ2luZ0NvbXBvbmVudCh0YXNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBtYW5hZ2luZyA8Y29kZT5Qcm9qZWN0Q29tcG9uZW50PC9jb2RlPiBmb3IKKyAgICAgKiB0aGlzIDxjb2RlPkxlYWRQaXBlSW5wdXRTdHJlYW08L2NvZGU+LgorICAgICAqIEBwYXJhbSBwYyAgIHRoZSBtYW5hZ2luZyA8Y29kZT5Qcm9qZWN0Q29tcG9uZW50PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2luZ0NvbXBvbmVudChQcm9qZWN0Q29tcG9uZW50IHBjKSB7CisgICAgICAgIHRoaXMubWFuYWdpbmdQYyA9IHBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGxvZ2dpbmcgbGV2ZWwuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgICAgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gbG9nbGV2ZWwgICB0aGUgPGNvZGU+aW50PC9jb2RlPiBsb2dnaW5nIGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxvZ2xldmVsKSB7CisgICAgICAgIGlmIChtYW5hZ2luZ1BjICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1hbmFnaW5nUGMubG9nKG1lc3NhZ2UsIGxvZ2xldmVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsb2dsZXZlbCA+IFByb2plY3QuTVNHX1dBUk4pIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW0uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlNWQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBJbnZva2VzIHtAbGluayAjcHJvY2Vzc0xpbmUgcHJvY2Vzc0xpbmV9IHdoZW5ldmVyIGEgZnVsbCBsaW5lIGhhcworICogYmVlbiB3cml0dGVuIHRvIHRoaXMgc3RyZWFtLgorICoKKyAqIDxwPlRyaWVzIHRvIGJlIHNtYXJ0IGFib3V0IGxpbmUgc2VwYXJhdG9ycy48L3A+CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisgICAgLyoqIEluaXRpYWwgYnVmZmVyIHNpemUuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVElBTF9TSVpFID0gMTMyOworCisgICAgLyoqIENhcnJpYWdlIHJldHVybiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUiA9IDB4MGQ7CisKKyAgICAvKiogTGluZWZlZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEYgPSAweDBhOworCisgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyCisgICAgICAgID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShJTlRJQUxfU0laRSk7CisgICAgcHJpdmF0ZSBib29sZWFuIHNraXAgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBidWZmZXIgYW5kIGZsdXNoIHRoZSBidWZmZXIsIGlmIGEgbGluZQorICAgICAqIHNlcGFyYXRvciBpcyBkZXRlY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYyBkYXRhIHRvIGxvZyAoYnl0ZSkuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShpbnQgY2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJ5dGUgYyA9IChieXRlKSBjYzsKKyAgICAgICAgaWYgKChjID09IExGKSB8fCAoYyA9PSBDUikpIHsKKyAgICAgICAgICAgIGlmICghc2tpcCkgeworICAgICAgICAgICAgICBwcm9jZXNzQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXIud3JpdGUoY2MpOworICAgICAgICB9CisgICAgICAgIHNraXAgPSAoYyA9PSBDUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdGhpcyBsb2cgc3RyZWFtCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChidWZmZXIuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcHJvY2Vzc0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGJ1ZmZlciB0byBhIHN0cmluZyBhbmQgc2VuZHMgaXQgdG8KKyAgICAgKiA8Y29kZT5wcm9jZXNzTGluZTwvY29kZT4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvY2Vzc0xpbmUoYnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgYSBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gbG9nLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc0xpbmUoU3RyaW5nIGxpbmUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbGwgcmVtYWluaW5nCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChidWZmZXIuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcHJvY2Vzc0J1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBibG9jayBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheSB3aGVyZSBkYXRhIHN0YXJ0cworICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiBibG9jaworICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZGF0YSBjYW5ub3QgYmUgd3JpdHRlbiBpbnRvIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGZpbmQgdGhlIGxpbmUgYnJlYWtzIGFuZCBwYXNzIG90aGVyIGNoYXJzIHRocm91Z2ggaW4gYmxvY2tzCisgICAgICAgIGludCBvZmZzZXQgPSBvZmY7CisgICAgICAgIGludCBibG9ja1N0YXJ0T2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBpbnQgcmVtYWluaW5nID0gbGVuOworICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDAgJiYgYltvZmZzZXRdICE9IExGICYmIGJbb2Zmc2V0XSAhPSBDUikgeworICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgICAgIHJlbWFpbmluZy0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZWl0aGVyIGVuZCBvZiBidWZmZXIgb3IgYSBsaW5lIHNlcGFyYXRvciBjaGFyCisgICAgICAgICAgICBpbnQgYmxvY2tMZW5ndGggPSBvZmZzZXQgLSBibG9ja1N0YXJ0T2Zmc2V0OworICAgICAgICAgICAgaWYgKGJsb2NrTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci53cml0ZShiLCBibG9ja1N0YXJ0T2Zmc2V0LCBibG9ja0xlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCAmJiAoYltvZmZzZXRdID09IExGIHx8IGJbb2Zmc2V0XSA9PSBDUikpIHsKKyAgICAgICAgICAgICAgICB3cml0ZShiW29mZnNldF0pOworICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgICAgIHJlbWFpbmluZy0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxvY2tTdGFydE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lVG9rZW5pemVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xpbmVUb2tlbml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJmYjAyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lVG9rZW5pemVyLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworCisvKioKKyAqIGNsYXNzIHRvIHRva2VuaXplIHRoZSBpbnB1dCBhcyBsaW5lcyBzZXBlcmF0ZWQKKyAqIGJ5IFxyIChtYWMgc3R5bGUpLCBcclxuIChkb3Mvd2luZG93cyBzdHlsZSkgb3IgXG4gKHVuaXggc3R5bGUpCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgTGluZVRva2VuaXplciBleHRlbmRzIFByb2plY3RDb21wb25lbnQKKyAgICBpbXBsZW1lbnRzIFRva2VuaXplciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9BX0NIQVIgPSAtMjsKKyAgICBwcml2YXRlIFN0cmluZyAgbGluZUVuZCA9ICIiOworICAgIHByaXZhdGUgaW50ICAgICBwdXNoZWQgPSBOT1RfQV9DSEFSOworICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlRGVsaW1zID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBhdHRyaWJ1dGUgaW5jbHVkZWRlbGltcyAtIHdoZXRoZXIgdG8gaW5jbHVkZQorICAgICAqIHRoZSBsaW5lIGVuZGluZyB3aXRoIHRoZSBsaW5lLCBvciB0byByZXR1cm4KKyAgICAgKiBpdCBpbiB0aGUgcG9zdHRva2VuCisgICAgICogZGVmYXVsdCBmYWxzZQorICAgICAqIEBwYXJhbSBpbmNsdWRlRGVsaW1zIGlmIHRydWUgaW5jbHVkZSAvciBhbmQgL24gaW4gdGhlIGxpbmUKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVEZWxpbXMoYm9vbGVhbiBpbmNsdWRlRGVsaW1zKSB7CisgICAgICAgIHRoaXMuaW5jbHVkZURlbGltcyA9IGluY2x1ZGVEZWxpbXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IHRoZSBuZXh0IGxpbmUgZnJvbSB0aGUgaW5wdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgcmVhZGVyCisgICAgICogQHJldHVybiB0aGUgbGluZSBleGNsdWRpbmcgL3Igb3IgL24sIHVubGVzcyBpbmNsdWRlZGVsaW1zIGlzIHNldAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHJlYWRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKFJlYWRlciBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGNoID0gLTE7CisgICAgICAgIGlmIChwdXNoZWQgIT0gTk9UX0FfQ0hBUikgeworICAgICAgICAgICAgY2ggPSBwdXNoZWQ7CisgICAgICAgICAgICBwdXNoZWQgPSBOT1RfQV9DSEFSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2ggPSBpbi5yZWFkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmVFbmQgPSAiIjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGxpbmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgaW50IHN0YXRlID0gMDsKKyAgICAgICAgd2hpbGUgKGNoICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZUVuZCA9ICJcbiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZUVuZCA9ICJcclxuIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXNoZWQgPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgbGluZUVuZCA9ICJcciI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2ggPSBpbi5yZWFkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoID09IC0xICYmIHN0YXRlID09IDEpIHsKKyAgICAgICAgICAgIGxpbmVFbmQgPSAiXHIiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluY2x1ZGVEZWxpbXMpIHsKKyAgICAgICAgICAgIGxpbmUuYXBwZW5kKGxpbmVFbmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaW5lLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbGluZSBlbmRpbmcgY2hhcmFjdGVyKHMpIGZvciB0aGUgY3VycmVudCBsaW5lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQb3N0VG9rZW4oKSB7CisgICAgICAgIGlmIChpbmNsdWRlRGVsaW1zKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpbmVFbmQ7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTG9hZGVyVXRpbHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTG9hZGVyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ0Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Mb2FkZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxvY2F0b3I7CisKKy8vIENoZWNrU3R5bGU6SGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yQ2hlY2sgT0ZGIC0gYmMKKworLyoqCisgKiBDbGFzc0xvYWRlciB1dGlsaXR5IG1ldGhvZHMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkZXJVdGlscyB7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZXh0IGNsYXNzbG9hZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBDbGFzc0xvYWRlciB0byBiZSB1c2VkIGFzIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlcgorICAgICAqICAgICAgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb250ZXh0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIFRocmVhZCBjdXJyZW50VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgY3VycmVudFRocmVhZC5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobG9hZGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEpESzEuMSBjb21wYXRpYmxlIGFjY2VzcyB0byBzZXQgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgQ2xhc3NMb2FkZXIgaW5zdGFuY2UgYmVpbmcgdXNlZCBhcyB0aGUgY29udGV4dAorICAgICAqICAgICAgY2xhc3Nsb2FkZXIgb24gdGhlIGN1cnJlbnQgdGhyZWFkLiBSZXR1cm5zIG51bGwgb24gSkRLIDEuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgeworICAgICAgICBUaHJlYWQgY3VycmVudFRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIHJldHVybiBjdXJyZW50VGhyZWFkLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgbWV0aG9kcyBhcmUgYXZhaWxhYmxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgZGVhbGluZyB3aXRoIHRoZSBjb250ZXh0CisgICAgICogICAgICBjbGFzc2xvYWRlciBhcmUgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRleHRMb2FkZXJBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZSBhIHNvdXJjZSBsb2NhdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIGxvY2F0aW9uIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBub3JtYWxpemVkIHNvdXJjZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIG5vcm1hbGl6ZVNvdXJjZShGaWxlIHNvdXJjZSkgeworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc291cmNlID0gRklMRV9VVElMUy5ub3JtYWxpemUoc291cmNlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSBwYXRoCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGRpcmVjdG9yeSBvciBqYXIgZmlsZSB0aGUgY2xhc3MgaGFzIGJlZW4gbG9hZGVkIGZyb20uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2xhc3Mgd2hvc2UgbG9jYXRpb24gaXMgcmVxdWlyZWQuCisgICAgICogQHJldHVybiB0aGUgZmlsZSBvciBqYXIgd2l0aCB0aGUgY2xhc3Mgb3IgbnVsbCBpZiB3ZSBjYW5ub3QKKyAgICAgKiAgICAgICAgIGRldGVybWluZSB0aGUgbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRDbGFzc1NvdXJjZShDbGFzcyBjKSB7CisgICAgICAgIHJldHVybiBub3JtYWxpemVTb3VyY2UoTG9jYXRvci5nZXRDbGFzc1NvdXJjZShjKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgZGlyZWN0b3J5IG9yIGEgZ2l2ZSByZXNvdXJjZSBoYXMgYmVlbiBsb2FkZWQgZnJvbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjbGFzc2xvYWRlciB0byBiZSBjb25zdWx0ZWQgZm9yIHRoZSBzb3VyY2UKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHdob3NlIGxvY2F0aW9uIGlzIHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlsZSB3aXRoIHRoZSByZXNvdXJjZSBzb3VyY2Ugb3IgbnVsbCBpZgorICAgICAqICAgICAgICAgd2UgY2Fubm90IGRldGVybWluZSB0aGUgbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRSZXNvdXJjZVNvdXJjZShDbGFzc0xvYWRlciBjLCBTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgYyA9IExvYWRlclV0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVNvdXJjZShMb2NhdG9yLmdldFJlc291cmNlU291cmNlKGMsIHJlc291cmNlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSBuYW1lIG9mIGEgY2xhc3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgbmFtZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNy4wLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZVRvUmVzb3VyY2UoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSBjbGFzc2xvYWRlciBoYXMgYSBjbGFzc25hbWUgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3Nsb2FkZXIgdG8gbG9vayBpdC4KKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsYXNzZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAc2luY2UgQW50IDEuNy4wLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0V4aXN0cyhDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRlci5nZXRSZXNvdXJjZShjbGFzc05hbWVUb1Jlc291cmNlKGNsYXNzTmFtZSkpICE9IG51bGw7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL01lcmdpbmdNYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTWVyZ2luZ01hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTY1MjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL01lcmdpbmdNYXBwZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBGaWxlTmFtZU1hcHBlciB0aGF0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lCisgKiB0YXJnZXQgZmlsZSBuYW1lLgorICoKKyAqIDxwPlRoaXMgaXMgdGhlIGRlZmF1bHQgRmlsZU5hbWVNYXBwZXIgZm9yIHRoZSBhcmNoaXZpbmcgdGFza3MgYW5kCisgKiB1cHRvZGF0ZS48L3A+CisgKgorICovCitwdWJsaWMgY2xhc3MgTWVyZ2luZ01hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtZXJnZWRGaWxlID0gbnVsbDsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogSWdub3JlZC4KKyAgICAgKiBAcGFyYW0gZnJvbSBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtZXJnZWQgZmlsZS4KKyAgICAgKiBAcGFyYW0gdG8gdGhlIG5hbWUgb2YgdGhlIG1lcmdlZCBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgeworICAgICAgICBtZXJnZWRGaWxlID0gbmV3IFN0cmluZ1tdIHt0b307CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBvbmUtZWxlbWVudCBhcnJheSBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUgc2V0IHZpYSBzZXRUby4KKyAgICAgKiBAcGFyYW0gc291cmNlRmlsZU5hbWUgaWdub3JlZC4KKyAgICAgKiBAcmV0dXJuIGEgb25lLWVsZW1lbnQgYXJyYXkgY29udGFpbmluZyB0aGUgbWVyZ2VkIGZpbGVuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgc291cmNlRmlsZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG1lcmdlZEZpbGU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL091dHB1dFN0cmVhbUZ1bm5lbGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL091dHB1dFN0cmVhbUZ1bm5lbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjY5NGMzZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvT3V0cHV0U3RyZWFtRnVubmVsZXIuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqIE1hbmFnZXMgYSBzZXQgb2YgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPnMgdG8KKyAqIHdyaXRlIHRvIGEgc2luZ2xlIHVuZGVybHlpbmcgc3RyZWFtLCB3aGljaCBpcworICogY2xvc2VkIG9ubHkgd2hlbiB0aGUgbGFzdCAmcXVvdDtmdW5uZWwmcXVvdDsKKyAqIGhhcyBiZWVuIGNsb3NlZC4KKyAqLworcHVibGljIGNsYXNzIE91dHB1dFN0cmVhbUZ1bm5lbGVyIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdGltZW91dC4KKyAgICAgKiBAc2VlICNzZXRUaW1lb3V0KGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfVElNRU9VVF9NSUxMSVMgPSAxMDAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBGdW5uZWwgZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSBGdW5uZWwoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKE91dHB1dFN0cmVhbUZ1bm5lbGVyLnRoaXMpIHsKKyAgICAgICAgICAgICAgICArK2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3luY2hyb25pemVkIChPdXRwdXRTdHJlYW1GdW5uZWxlci50aGlzKSB7CisgICAgICAgICAgICAgICAgZGllSWZDbG9zZWQoKTsKKyAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3luY2hyb25pemVkIChPdXRwdXRTdHJlYW1GdW5uZWxlci50aGlzKSB7CisgICAgICAgICAgICAgICAgZGllSWZDbG9zZWQoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoT3V0cHV0U3RyZWFtRnVubmVsZXIudGhpcykgeworICAgICAgICAgICAgICAgIGRpZUlmQ2xvc2VkKCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKE91dHB1dFN0cmVhbUZ1bm5lbGVyLnRoaXMpIHsKKyAgICAgICAgICAgICAgICBkaWVJZkNsb3NlZCgpOworICAgICAgICAgICAgICAgIG91dC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZWxlYXNlKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0OworICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2xvc2VkOworICAgIHByaXZhdGUgbG9uZyB0aW1lb3V0TWlsbGlzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPk91dHB1dFN0cmVhbUZ1bm5lbGVyPC9jb2RlPiBmb3IKKyAgICAgKiB0aGUgc3BlY2lmaWVkIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4uCisgICAgICogQHBhcmFtIG91dCAgIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE91dHB1dFN0cmVhbUZ1bm5lbGVyKE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgdGhpcyhvdXQsIERFRkFVTFRfVElNRU9VVF9NSUxMSVMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyA8Y29kZT5PdXRwdXRTdHJlYW1GdW5uZWxlcjwvY29kZT4gZm9yCisgICAgICogdGhlIHNwZWNpZmllZCA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCB0aW1lb3V0IHZhbHVlLgorICAgICAqIEBwYXJhbSBvdXQgICAgICAgICAgICAgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdGltZW91dE1pbGxpcyAgIDxjb2RlPmxvbmc8L2NvZGU+LgorICAgICAqIEBzZWUgI3NldFRpbWVvdXQobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtRnVubmVsZXIoT3V0cHV0U3RyZWFtIG91dCwgbG9uZyB0aW1lb3V0TWlsbGlzKSB7CisgICAgICAgIGlmIChvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiT3V0cHV0U3RyZWFtRnVubmVsZXIuPGluaXQ+OiAgb3V0ID09IG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsgLy9hcyBmYXIgYXMgd2Uga25vdworICAgICAgICBzZXRUaW1lb3V0KHRpbWVvdXRNaWxsaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGltZW91dCBmb3IgdGhpcyA8Y29kZT5PdXRwdXRTdHJlYW1GdW5uZWxlcjwvY29kZT4uCisgICAgICogVGhpcyBpcyB0aGUgbWF4aW11bSB0aW1lIHRoYXQgbWF5IGVsYXBzZSBiZXR3ZWVuIHRoZSBjbG9zdXJlCisgICAgICogb2YgdGhlIGxhc3QgJnF1b3Q7ZnVubmVsJnF1b3Q7IGFuZCB0aGUgbmV4dCBjYWxsIHRvCisgICAgICogPGNvZGU+Z2V0T3V0cHV0U3RyZWFtKCk8L2NvZGU+IHdpdGhvdXQgY2xvc2luZyB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gdGltZW91dE1pbGxpcyAgIDxjb2RlPmxvbmc8L2NvZGU+IHRpbWVvdXQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRpbWVvdXQobG9uZyB0aW1lb3V0TWlsbGlzKSB7CisgICAgICAgIHRoaXMudGltZW91dE1pbGxpcyA9IHRpbWVvdXRNaWxsaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgJnF1b3Q7ZnVubmVsJnF1b3Q7IDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gaW5zdGFuY2UgdG8KKyAgICAgKiB3cml0ZSB0byB0aGlzIDxjb2RlPk91dHB1dFN0cmVhbUZ1bm5lbGVyPC9jb2RlPidzIHVuZGVybHlpbmcKKyAgICAgKiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgorICAgICAqIEByZXR1cm4gPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlIGZ1bm5lbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE91dHB1dFN0cmVhbSBnZXRGdW5uZWxJbnN0YW5jZSgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRpZUlmQ2xvc2VkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bm5lbCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoRnVubmVsIGZ1bm5lbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9pZ25vcmUgcmVsZWFzZSBvZiBhbiBhbHJlYWR5LWNsb3NlZCBmdW5uZWwKKyAgICAgICAgaWYgKCFmdW5uZWwuY2xvc2VkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0TWlsbGlzID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCh0aW1lb3V0TWlsbGlzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXllRXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKC0tY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZnVubmVsLmNsb3NlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGllSWZDbG9zZWQoKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZGllSWZDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY2xvc2VkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoZSBmdW5uZWxlZCBPdXRwdXRTdHJlYW0gaGFzIGJlZW4gY2xvc2VkLiIpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1BhY2thZ2VOYW1lTWFwcGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1BhY2thZ2VOYW1lTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMzQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUGFja2FnZU5hbWVNYXBwZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogTWFwcyBkaXJlY3RvcnkgbmFtZSBtYXRjaGVzIGludG8gYSBkb3R0ZWQgcGFja2FnZSBuYW1lLiBUaGlzIGlzCisgKiB1c2VmdWwgZm9yIG1hdGNoaW5nIEpVbml0IHRlc3QgY2FzZXMgYWdhaW50IHRoZWlyIFhNTCBmb3JtYXR0ZXIKKyAqIHJlc3VsdHMuCisgKiA8cHJlPgorICogJmx0O21hcHBlciBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUGFja2FnZU5hbWVNYXBwZXIiCisgKiAgICAgICAgIGZyb209IipUZXN0LmphdmEiIHRvPSIke3Rlc3QuZGF0YS5kaXJ9L1RFU1QtKlRlc3QueG1sIi8mZ3Q7CisgKiA8L3ByZT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrYWdlTmFtZU1hcHBlciBleHRlbmRzIEdsb2JQYXR0ZXJuTWFwcGVyIHsKKyAgICAvKioKKyAgICAgKiAgUmV0dXJucyB0aGUgcGFydCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgKiBpbiB0aGUKKyAgICAgKiAgJnF1b3Q7ZnJvbSZxdW90OyBwYXR0ZXJuIHJlcGxhY2luZyBmaWxlIHNlcGFyYXRvcnMgd2l0aCBkb3RzCisgICAgICoKKyAgICAgKkBwYXJhbSAgbmFtZSAgU291cmNlIGZpbGVuYW1lCisgICAgICpAcmV0dXJuICAgICAgIFJlcGxhY2VkIHZhcmlhYmxlIHBhcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RWYXJpYWJsZVBhcnQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIHZhciA9IG5hbWUuc3Vic3RyaW5nKHByZWZpeExlbmd0aCwKKyAgICAgICAgICAgICAgICBuYW1lLmxlbmd0aCgpIC0gcG9zdGZpeExlbmd0aCk7CisgICAgICAgIHJldHVybiB2YXIucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Byb3BlcnR5T3V0cHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Byb3BlcnR5T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTlhMWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUHJvcGVydHlPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGdldCBhbiBPdXRwdXRTdHJlYW0KKyAqIGZyb20gYW4gaW1tdXRhYmxlIFJlc291cmNlLgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5T3V0cHV0U3RyZWFtIGV4dGVuZHMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdHJpbTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9wZXJ0eU91dHB1dFN0cmVhbSBmb3IgdGhlIHNwZWNpZmllZCBQcm9qZWN0CisgICAgICogYW5kIHByb3BlcnR5IG5hbWUsIHRyaW1taW5nIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcCB0aGUgYXNzb2NpYXRlZCBBbnQgUHJvamVjdC4KKyAgICAgKiBAcGFyYW0gcyB0aGUgU3RyaW5nIHByb3BlcnR5IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5T3V0cHV0U3RyZWFtKFByb2plY3QgcCwgU3RyaW5nIHMpIHsKKyAgICAgICAgdGhpcyhwLCBzLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvcGVydHlPdXRwdXRTdHJlYW0gZm9yCisgICAgICogdGhlIHNwZWNpZmllZCBQcm9qZWN0LCBwcm9wZXJ0eSBuYW1lLCBhbmQgdHJpbSBtb2RlLgorICAgICAqIEBwYXJhbSBwIHRoZSBhc3NvY2lhdGVkIEFudCBQcm9qZWN0LgorICAgICAqIEBwYXJhbSBzIHRoZSBTdHJpbmcgcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcGFyYW0gYiB0aGUgYm9vbGVhbiB0cmltIG1vZGUuCisgICAgICovCisgICAgcHVibGljIFByb3BlcnR5T3V0cHV0U3RyZWFtKFByb2plY3QgcCwgU3RyaW5nIHMsIGJvb2xlYW4gYikgeworICAgICAgICBwcm9qZWN0ID0gcDsKKyAgICAgICAgcHJvcGVydHkgPSBzOworICAgICAgICB0cmltID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgUHJvcGVydHlPdXRwdXRTdHJlYW0sIHN0b3JpbmcgdGhlIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyh0b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHRyaW0gPyBzLnRyaW0oKSA6IHMpOworICAgICAgICB9CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUHJveHlTZXR1cC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Qcm94eVNldHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlMWUyNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUHJveHlTZXR1cC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIENvZGUgdG8gZG8gcHJveHkgc2V0dXAuIFRoaXMgaXMganVzdCBmYWN0b3JlZCBvdXQgb2YgdGhlIG1haW4gc3lzdGVtIGp1c3QgdG8KKyAqIGtlZXAgZXZlcnl0aGluZyBlbHNlIGxlc3MgY29udm9sdXRlZC4KKyAqIEBzaW5jZSBBbnQxLjcKKyAqLworCitwdWJsaWMgY2xhc3MgUHJveHlTZXR1cCB7CisKKyAgICAvKioKKyAgICAgKiBvd25lciBwcm9qZWN0OyB1c2VkIGZvciBsb2dnaW5nIGFuZCBleHRyYWN0aW5nIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFByb2plY3Qgb3duZXI7CisKKyAgICAvKioKKyAgICAgKiBKYXZhMS41IHByb3BlcnR5IHRoYXQgZW5hYmxlcyB1c2Ugb2Ygc3lzdGVtIHByb3hpZXMuCisgICAgICogQHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX1NZU1RFTV9QUk9YSUVTID0gImphdmEubmV0LnVzZVN5c3RlbVByb3hpZXMiOworICAgIC8qKiB0aGUgaHR0cCBwcm94eWhvc3QgcHJvcGVydHkgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZX0hPU1QgPSAiaHR0cC5wcm94eUhvc3QiOworICAgIC8qKiB0aGUgaHR0cCBwcm94eXBvcnQgcHJvcGVydHkgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZX1BPUlQgPSAiaHR0cC5wcm94eVBvcnQiOworICAgIC8qKiB0aGUgaHR0cHMgcHJveHlob3N0IHByb3BlcnR5ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfUFJPWFlfSE9TVCA9ICJodHRwcy5wcm94eUhvc3QiOworICAgIC8qKiB0aGUgaHR0cHMgcHJveHlwb3J0IHByb3BlcnR5ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfUFJPWFlfUE9SVCA9ICJodHRwcy5wcm94eVBvcnQiOworICAgIC8qKiB0aGUgZnRwIHByb3h5aG9zdCBwcm9wZXJ0eSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZUUF9QUk9YWV9IT1NUID0gImZ0cC5wcm94eUhvc3QiOworICAgIC8qKiB0aGUgZnRwIHByb3h5cG9ydCBwcm9wZXJ0eSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZUUF9QUk9YWV9QT1JUID0gImZ0cC5wcm94eVBvcnQiOworICAgIC8qKiB0aGUgZnRwIHByb3h5cG9ydCBwcm9wZXJ0eSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTk9OX1BST1hZX0hPU1RTID0gImh0dHAubm9uUHJveHlIb3N0cyI7CisgICAgLyoqIHRoZSBodHRwIGhvc3RzIG5vdCB0byBiZSBwcm94aWVkIHByb3BlcnR5ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfTk9OX1BST1hZX0hPU1RTID0gImh0dHBzLm5vblByb3h5SG9zdHMiOworICAgIC8qKiB0aGUgZnRwIGhvc3RzIG5vdCB0byBiZSBwcm94aWVkIHByb3BlcnR5ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlRQX05PTl9QUk9YWV9IT1NUUyA9ICJmdHAubm9uUHJveHlIb3N0cyI7CisgICAgLyoqIHRoZSBodHRwIHByb3h5IHVzZXJuYW1lIHByb3BlcnR5ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9YWV9VU0VSTkFNRSA9ICJodHRwLnByb3h5VXNlciI7CisgICAgLyoqIHRoZSBodHRwIHByb3h5IHBhc3N3b3JkIHByb3BlcnR5ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9YWV9QQVNTV09SRCA9ICJodHRwLnByb3h5UGFzc3dvcmQiOworICAgIC8qKiB0aGUgc29ja3MgcHJveHkgaG9zdCBwcm9wZXJ0eSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQ0tTX1BST1hZX0hPU1QgPSAic29ja3NQcm94eUhvc3QiOworICAgIC8qKiB0aGUgc29ja3MgcHJveHkgcG9ydCBwcm9wZXJ0eSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQ0tTX1BST1hZX1BPUlQgPSAic29ja3NQcm94eVBvcnQiOworICAgIC8qKiB0aGUgc29ja3MgcHJveHkgdXNlcm5hbWUgcHJvcGVydHkgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0NLU19QUk9YWV9VU0VSTkFNRSA9ICJqYXZhLm5ldC5zb2Nrcy51c2VybmFtZSI7CisgICAgLyoqIHRoZSBzb2NrcyBwcm94eSBwYXNzd29yZCBwcm9wZXJ0eSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQ0tTX1BST1hZX1BBU1NXT1JEID0gImphdmEubmV0LnNvY2tzLnBhc3N3b3JkIjsKKworICAgIC8qKgorICAgICAqIGNyZWF0ZSBhIHByb3h5IHNldHVwIGNsYXNzIGJvdW5kIHRvIHRoaXMgcHJvamVjdAorICAgICAqIEBwYXJhbSBvd25lciB0aGUgcHJvamVjdCB0aGF0IG93bnMgdGhpcyBzZXR1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJveHlTZXR1cChQcm9qZWN0IG93bmVyKSB7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgc3lzdGVtIHByb3BlcnR5IHNldHRpbmdzCisgICAgICogQHJldHVybiBjdXJyZW50IHZhbHVlOyBudWxsIGZvciBub25lIG9yIG5vIGFjY2VzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3h5U2V0dGluZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoVVNFX1NZU1RFTV9QUk9YSUVTKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9pZiB5b3UgY2Fubm90IHJlYWQgaXQsIHlvdSB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIGl0IGVpdGhlcgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0dXJuIHByb3hpZXMgb247CisgICAgICogaWYgdGhlIHByb3h5IGtleSBpcyBhbHJlYWR5IHNldCB0byBzb21lIHZhbHVlOiBsZWF2ZSBhbG9uZS4KKyAgICAgKiBpZiBhbiBhbnQgcHJvcGVydHkgb2YgdGhlIHZhbHVlIHtAbGluayAjVVNFX1NZU1RFTV9QUk9YSUVTfQorICAgICAqIGlzIHNldCwgdXNlIHRoYXQgaW5zdGVhZC4gRWxzZSBzZXQgdG8gInRydWUiLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuYWJsZVByb3hpZXMoKSB7CisgICAgICAgIGlmICghKGdldFN5c3RlbVByb3h5U2V0dGluZygpICE9IG51bGwpKSB7CisgICAgICAgICAgICBTdHJpbmcgcHJveGllcyA9IG93bmVyLmdldFByb3BlcnR5KFVTRV9TWVNURU1fUFJPWElFUyk7CisgICAgICAgICAgICBpZiAocHJveGllcyA9PSBudWxsIHx8IFByb2plY3QudG9Cb29sZWFuKHByb3hpZXMpKSB7CisgICAgICAgICAgICAgICAgcHJveGllcyA9ICJ0cnVlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gInNldHRpbmcgIiArIFVTRV9TWVNURU1fUFJPWElFUyArICIgdG8gIiArIHByb3hpZXM7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG93bmVyLmxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFVTRV9TWVNURU1fUFJPWElFUywgcHJveGllcyk7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy9sb2cgc2VjdXJpdHkgZXhjZXB0aW9ucyBhbmQgY29udGludWU7IGl0IGFpbnQgdGhhdAorICAgICAgICAgICAgICAgIC8vaW1wb3J0YW50IGFuZCBtYXkgYmUgcXVpdGUgY29tbW9uIHJ1bm5pbmcgQW50IGVtYmVkZGVkLgorICAgICAgICAgICAgICAgIG93bmVyLmxvZygiU2VjdXJpdHkgRXhjZXB0aW9uIHdoZW4gIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlYWRlcklucHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlYWRlcklucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjIwYWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVhZGVySW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCisvKioKKyAqIEFkYXB0cyBhIDxjb2RlPlJlYWRlcjwvY29kZT4gYXMgYW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+LgorICogQWRhcHRlZCBmcm9tIDxjb2RlPlN0cmluZ0lucHV0U3RyZWFtPC9jb2RlPi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZWFkZXJJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQllURV9NQVNLID0gMHhGRjsKKworICAgIC8qKiBTb3VyY2UgUmVhZGVyICovCisgICAgcHJpdmF0ZSBSZWFkZXIgaW47CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOworCisgICAgcHJpdmF0ZSBieXRlW10gc2xhY2s7CisKKyAgICBwcml2YXRlIGludCBiZWdpbjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPlJlYWRlcklucHV0U3RyZWFtPC9jb2RlPgorICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPlJlYWRlcjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyICAgPGNvZGU+UmVhZGVyPC9jb2RlPi4gIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBSZWFkZXJJbnB1dFN0cmVhbShSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGluID0gcmVhZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPlJlYWRlcklucHV0U3RyZWFtPC9jb2RlPgorICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPlJlYWRlcjwvY29kZT4sCisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciAgICAgbm9uLW51bGwgPGNvZGU+UmVhZGVyPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgICBub24tbnVsbCA8Y29kZT5TdHJpbmc8L2NvZGU+IGVuY29kaW5nLgorICAgICAqLworICAgIHB1YmxpYyBSZWFkZXJJbnB1dFN0cmVhbShSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcyhyZWFkZXIpOworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgZnJvbSB0aGUgPGNvZGU+UmVhZGVyPC9jb2RlPiwgcmV0dXJuaW5nIHRoZSBzYW1lIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSA8Y29kZT5SZWFkZXI8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgb3JpZ2luYWwgPGNvZGU+UmVhZGVyPC9jb2RlPiBmYWlscyB0byBiZSByZWFkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBDbG9zZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGUgcmVzdWx0OworICAgICAgICBpZiAoc2xhY2sgIT0gbnVsbCAmJiBiZWdpbiA8IHNsYWNrLmxlbmd0aCkgeworICAgICAgICAgICAgcmVzdWx0ID0gc2xhY2tbYmVnaW5dOworICAgICAgICAgICAgaWYgKCsrYmVnaW4gPT0gc2xhY2subGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgc2xhY2sgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgaWYgKHJlYWQoYnVmLCAwLCAxKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBidWZbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdCAmIEJZVEVfTUFTSzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBmcm9tIHRoZSA8Y29kZT5SZWFkZXI8L2NvZGU+IGludG8gYSBieXRlIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYiAgdGhlIGJ5dGUgYXJyYXkgdG8gcmVhZCBpbnRvCisgICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IGluIHRoZSBieXRlIGFycmF5CisgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIGluIHRoZSBieXRlIGFycmF5IHRvIGZpbGwKKyAgICAgKiBAcmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIHJlYWQgaW50byB0aGUgYnl0ZSBhcnJheSwgLTEgYXQKKyAgICAgKiAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIENsb3NlZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHNsYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltsZW5dOyAvLyBtaWdodCByZWFkIHRvbyBtdWNoCisgICAgICAgICAgICBpbnQgbiA9IGluLnJlYWQoYnVmKTsKKyAgICAgICAgICAgIGlmIChuID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgc2xhY2sgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbikuZ2V0Qnl0ZXMoZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIGJlZ2luID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPiBzbGFjay5sZW5ndGggLSBiZWdpbikgeworICAgICAgICAgICAgbGVuID0gc2xhY2subGVuZ3RoIC0gYmVnaW47CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNsYWNrLCBiZWdpbiwgYiwgb2ZmLCBsZW4pOworCisgICAgICAgIGJlZ2luICs9IGxlbjsKKyAgICAgICAgaWYgKGJlZ2luID49IHNsYWNrLmxlbmd0aCkgeworICAgICAgICAgICAgc2xhY2sgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgcmVhZCBsaW1pdCBvZiB0aGUgUmVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBtYXhpbXVtIGxpbWl0IG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgYmVmb3JlIHRoZQorICAgICAqICAgICAgICAgICAgICBtYXJrIHBvc2l0aW9uIGJlY29tZXMgaW52YWxpZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGZpbmFsIGludCBsaW1pdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4ubWFyayhsaW1pdCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gICB0aGUgY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgcmVhZHkgZm9yIHJlYWRpbmcKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBDbG9zZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2xhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHNsYWNrLmxlbmd0aCAtIGJlZ2luOworICAgICAgICB9CisgICAgICAgIGlmIChpbi5yZWFkeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGZhbHNlIC0gbWFyayBpcyBub3Qgc3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCAoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyB3b3VsZCBiZSBpbXByZWNpc2UKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIFJlYWRlci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIFJlYWRlciBmYWlscyB0byBiZSByZXNldAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBDbG9zZWQiKTsKKyAgICAgICAgfQorICAgICAgICBzbGFjayA9IG51bGw7CisgICAgICAgIGluLnJlc2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBSZWFkZXIuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBvcmlnaW5hbCBSZWFkZXIgZmFpbHMgdG8gYmUgY2xvc2VkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICBzbGFjayA9IG51bGw7CisgICAgICAgICAgICBpbiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZmxlY3RVdGlsLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZmxlY3RVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkM2U2NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVmbGVjdFV0aWwuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgcmVmbGVjdGlvbiBvbiBqYXZhIG9iamVjdHMuCisgKiBUaGUgY2xhc3MgY29udGFpbnMgc3RhdGljIG1ldGhvZHMgdG8gY2FsbCByZWZsZWN0aW9uCisgKiBtZXRob2RzLCBjYXRjaCBhbnkgZXhjZXB0aW9ucywgY29udmVydGluZyB0aGVtCisgKiB0byBCdWlsZEV4Y2VwdGlvbnMuCisgKi8KKy8vIENoZWNrU3R5bGU6RmluYWxDbGFzc0NoZWNrIE9GRiAtIGJhY2t3YXJkIGNvbXBhdGlibGUKK3B1YmxpYyBjbGFzcyBSZWZsZWN0VXRpbCB7CisKKyAgICAvKiogIHByaXZhdGUgY29uc3RydWN0b3IgKi8KKyAgICBwcml2YXRlIFJlZmxlY3RVdGlsKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYSBtZXRob2Qgb24gdGhlIG9iamVjdCB3aXRoIG5vIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZShPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDsKKyAgICAgICAgICAgIG1ldGhvZCA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKG9iaiwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKKyAgICAgICAgICAgIHRocm93QnVpbGRFeGNlcHRpb24odCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm90UmVhY2hlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhIG1ldGhvZCBvbiB0aGUgb2JqZWN0IHdpdGggbm8gcGFyYW1ldGVycy4KKyAgICAgKiBOb3RlOiBVbmxpa2UgdGhlIGludm9rZSBtZXRob2QgYWJvdmUsIHRoaXMKKyAgICAgKiBjYWxscyBjbGFzcyBvciBzdGF0aWMgbWV0aG9kcywgbm90IGluc3RhbmNlIG1ldGhvZHMuCisgICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZVN0YXRpYyhPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDsKKyAgICAgICAgICAgIG1ldGhvZCA9ICgoQ2xhc3MpIG9iaikuZ2V0TWV0aG9kKAorICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZShvYmosIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgIH0gIGNhdGNoIChFeGNlcHRpb24gdCkgeworICAgICAgICAgICAgdGhyb3dCdWlsZEV4Y2VwdGlvbih0KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBOb3RSZWFjaGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGEgbWV0aG9kIG9uIHRoZSBvYmplY3Qgd2l0aCBvbmUgYXJndW1lbnQuCisgICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwKKyAgICAgKiBAcGFyYW0gYXJnVHlwZSAgICB0aGUgdHlwZSBvZiBhcmd1bWVudC4KKyAgICAgKiBAcGFyYW0gYXJnICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlKAorICAgICAgICBPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3MgYXJnVHlwZSwgT2JqZWN0IGFyZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDsKKyAgICAgICAgICAgIG1ldGhvZCA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZCgKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7YXJnVHlwZX0pOworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2Uob2JqLCBuZXcgT2JqZWN0W10ge2FyZ30pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gdCkgeworICAgICAgICAgICAgdGhyb3dCdWlsZEV4Y2VwdGlvbih0KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBOb3RSZWFjaGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGEgbWV0aG9kIG9uIHRoZSBvYmplY3Qgd2l0aCB0d28gYXJndW1lbnQuCisgICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwKKyAgICAgKiBAcGFyYW0gYXJnVHlwZTEgICB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQuCisgICAgICogQHBhcmFtIGFyZzEgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4KKyAgICAgKiBAcGFyYW0gYXJnVHlwZTIgICB0aGUgdHlwZSBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIEBwYXJhbSBhcmcyICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlKAorICAgICAgICBPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3MgYXJnVHlwZTEsIE9iamVjdCBhcmcxLAorICAgICAgICBDbGFzcyBhcmdUeXBlMiwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2Q7CisgICAgICAgICAgICBtZXRob2QgPSBvYmouZ2V0Q2xhc3MoKS5nZXRNZXRob2QoCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge2FyZ1R5cGUxLCBhcmdUeXBlMn0pOworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2Uob2JqLCBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzJ9KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKKyAgICAgICAgICAgIHRocm93QnVpbGRFeGNlcHRpb24odCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm90UmVhY2hlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGluIGFuIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gbG9vayBhdC4KKyAgICAgKiBAcGFyYW0gZmllbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEZpZWxkKE9iamVjdCBvYmosIFN0cmluZyBmaWVsZE5hbWUpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IG9iai5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKKyAgICAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0KG9iaik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7CisgICAgICAgICAgICB0aHJvd0J1aWxkRXhjZXB0aW9uKHQpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE5vdFJlYWNoZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWV0aG9kIHRvIGNvbnZlcnQgYW4gaW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0bworICAgICAqIGEgYnVpbGRleGNlcHRpb24gYW5kIHRocm93IGl0LgorICAgICAqIEBwYXJhbSB0IHRoZSBpbnZvY2F0aW9uIHRhcmdldCBleGNlcHRpb24uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiB0aGUgY29udmVydGVkIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dCdWlsZEV4Y2VwdGlvbihFeGNlcHRpb24gdCkKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgdG9CdWlsZEV4Y2VwdGlvbih0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCB0byBjb252ZXJ0IGFuIGludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gdG8KKyAgICAgKiBhIGJ1aWxkZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSB0IHRoZSBpbnZvY2F0aW9uIHRhcmdldCBleGNlcHRpb24uCisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIGV4Y2VwdGlvbi4KKyAgICAgKiBAc2luY2UgYW50IDEuNy4xCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWlsZEV4Y2VwdGlvbiB0b0J1aWxkRXhjZXB0aW9uKEV4Y2VwdGlvbiB0KSB7CisgICAgICAgIGlmICh0IGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgeworICAgICAgICAgICAgVGhyb3dhYmxlIHQyID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB0KQorICAgICAgICAgICAgICAgIC5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICh0MiBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChCdWlsZEV4Y2VwdGlvbikgdDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKHQyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24odCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCB0byB0ZXN0IGlmIGFuIG9iamVjdCByZXNwb25kcyB0byBhIGdpdmVuCisgICAgICogbWVzc2FnZSAobWV0aG9kIGNhbGwpCisgICAgICogQHBhcmFtIG8gdGhlIG9iamVjdAorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBtZXRob2QgdG8gY2hlY2sgZm9yCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaGFzIHRoZSBtZXRob2QuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlc3BvbmRzVG8oT2JqZWN0IG8sIFN0cmluZyBtZXRob2ROYW1lKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IG8uZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKKyAgICAgICAgICAgIHRocm93IHRvQnVpbGRFeGNlcHRpb24odCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWZsZWN0V3JhcHBlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWZsZWN0V3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDM2M2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZmxlY3RXcmFwcGVyLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgcmVmbGVjdGlvbiBvbiBqYXZhIG9iamVjdHMuCisgKiBUaGUgY2xhc3MgaXMgYSBob2xkZXIgY2xhc3MgZm9yIGFuIG9iamVjdCBhbmQKKyAqIHVzZXMgamF2YSByZWZsZWN0aW9uIHRvIGNhbGwgbWV0aG9kcyBvbiB0aGUgb2JqZWN0cy4KKyAqIElmIHRoaW5ncyBnbyB3cm9uZywgQnVpbGRFeGNlcHRpb25zIGFyZSB0aHJvd24uCisgKi8KKworcHVibGljIGNsYXNzIFJlZmxlY3RXcmFwcGVyIHsKKyAgICBwcml2YXRlIE9iamVjdCBvYmo7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgd3JhcHBlZCBvYmplY3QgdXNpbmcgdGhlIG5vIGFyZyBjb25zdHJ1Y3Rvci4KKyAgICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBjbGFzc2xvYWRlciB0byB1c2UgdG8gY29uc3RydWN0IHRoZSBjbGFzcy4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgY2xhc3NuYW1lIG9mIHRoZSBvYmplY3QgdG8gY29uc3RydWN0LgorICAgICAqLworICAgIHB1YmxpYyBSZWZsZWN0V3JhcHBlcihDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjbGF6ejsKKyAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShuYW1lLCB0cnVlLCBsb2FkZXIpOworICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3I7CisgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IGNsYXp6LmdldENvbnN0cnVjdG9yKChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgIG9iaiA9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7CisgICAgICAgICAgICBSZWZsZWN0VXRpbC50aHJvd0J1aWxkRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNpbmcgYSBwYXNzZWQgaW4gb2JqZWN0LgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byB3cmFwLgorICAgICAqLworICAgIHB1YmxpYyBSZWZsZWN0V3JhcHBlcihPYmplY3Qgb2JqKSB7CisgICAgICAgIHRoaXMub2JqID0gb2JqOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgeworICAgICAgICByZXR1cm4gb2JqOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgYSBtZXRob2Qgb24gdGhlIG9iamVjdCB3aXRoIG5vIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZShTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gUmVmbGVjdFV0aWwuaW52b2tlKG9iaiwgbWV0aG9kTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhIG1ldGhvZCBvbiB0aGUgb2JqZWN0IHdpdGggb25lIGFyZ3VtZW50LgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbAorICAgICAqIEBwYXJhbSBhcmdUeXBlICAgIHRoZSB0eXBlIG9mIGFyZ3VtZW50LgorICAgICAqIEBwYXJhbSBhcmcgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZSgKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzIGFyZ1R5cGUsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIFJlZmxlY3RVdGlsLmludm9rZShvYmosIG1ldGhvZE5hbWUsIGFyZ1R5cGUsIGFyZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBhIG1ldGhvZCBvbiB0aGUgb2JqZWN0IHdpdGggb25lIGFyZ3VtZW50LgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbAorICAgICAqIEBwYXJhbSBhcmdUeXBlMSAgIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4KKyAgICAgKiBAcGFyYW0gYXJnMSAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LgorICAgICAqIEBwYXJhbSBhcmdUeXBlMiAgIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQuCisgICAgICogQHBhcmFtIGFyZzIgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQuCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZSgKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzIGFyZ1R5cGUxLCBPYmplY3QgYXJnMSwKKyAgICAgICAgQ2xhc3MgYXJnVHlwZTIsIE9iamVjdCBhcmcyKSB7CisgICAgICAgIHJldHVybiBSZWZsZWN0VXRpbC5pbnZva2UoCisgICAgICAgICAgICBvYmosIG1ldGhvZE5hbWUsIGFyZ1R5cGUxLCBhcmcxLCBhcmdUeXBlMiwgYXJnMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWdleHBQYXR0ZXJuTWFwcGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZ2V4cFBhdHRlcm5NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWFkNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWdleHBQYXR0ZXJuTWFwcGVyLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cE1hdGNoZXJGYWN0b3J5OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIEZpbGVOYW1lTWFwcGVyIHRoYXQgZG9lcyByZWd1bGFyIGV4cHJlc3Npb24KKyAqIHJlcGxhY2VtZW50cy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZWdleHBQYXR0ZXJuTWFwcGVyIGltcGxlbWVudHMgRmlsZU5hbWVNYXBwZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFQ0lNQUwgPSAxMDsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIFJlZ2V4cE1hdGNoZXIgcmVnID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgY2hhcltdIHRvID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFJlZ2V4cFBhdHRlcm5NYXBwZXIuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVnZXhwUGF0dGVybk1hcHBlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJlZyA9IChuZXcgUmVnZXhwTWF0Y2hlckZhY3RvcnkoKSkubmV3UmVnZXhwTWF0Y2hlcigpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVEaXJTZXAgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCAgICAgcmVnZXhwT3B0aW9ucyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgc3BlY2lmaW5nIHdoZXRoZXIgdG8gaWdub3JlIHRoZSBkaWZmZXJlbmNlCisgICAgICogYmV0d2VlbiAvIGFuZCBcICh0aGUgdHdvIGNvbW1vbiBkaXJlY3RvcnkgY2hhcmFjdGVycykuCisgICAgICogQHBhcmFtIGhhbmRsZURpclNlcCBhIGJvb2xlYW4sIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZURpclNlcChib29sZWFuIGhhbmRsZURpclNlcCkgeworICAgICAgICB0aGlzLmhhbmRsZURpclNlcCA9IGhhbmRsZURpclNlcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgc3BlY2lmaW5nIHdoZXRoZXIgdG8gaWdub3JlIHRoZSBjYXNlIGRpZmZlcmVuY2UKKyAgICAgKiBpbiB0aGUgbmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZSBhIGJvb2xlYW4sIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkgeworICAgICAgICAgICAgcmVnZXhwT3B0aW9ucyA9IFJlZ2V4cE1hdGNoZXIuTUFUQ0hfQ0FTRV9JTlNFTlNJVElWRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlZ2V4cE9wdGlvbnMgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgJnF1b3Q7ZnJvbSZxdW90OyBwYXR0ZXJuLiBSZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gZnJvbSB0aGUgZnJvbSBwYXR0ZXJuLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKGZyb20pOworICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIHRoZSBhY3R1YWwgUkUgd29uJ3QKKyAgICAgICAgICAgIC8vIGdldCBpbnN0YW50aWF0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSAmcXVvdDt0byZxdW90OyBwYXR0ZXJuLiBSZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0gdG8gdGhlIHRvIHBhdHRlcm4uCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKKyAgICAgICAgdGhpcy50byA9IHRvLnRvQ2hhckFycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBzb3VyY2UgZmlsZSBuYW1lIGRvZXNuJ3QgbWF0Y2ggdGhlCisgICAgICogJnF1b3Q7ZnJvbSZxdW90OyBwYXR0ZXJuLCBhbiBvbmUtZWxlbWVudCBhcnJheSBjb250YWluaW5nIHRoZQorICAgICAqIHRyYW5zbGF0ZWQgZmlsZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIHRoZSBzb3VyY2UgZmlsZSBuYW1lCisgICAgICogQHJldHVybiBhIG9uZS1lbGVtZW50IGFycmF5IGNvbnRhaW5pbmcgdGhlIHRyYW5zbGF0ZWQgZmlsZSBvcgorICAgICAqICAgICAgICAgbnVsbCBpZiB0aGUgdG8gcGF0dGVybiBkaWQgbm90IG1hdGNoCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgeworICAgICAgICBpZiAoaGFuZGxlRGlyU2VwKSB7CisgICAgICAgICAgICBpZiAoc291cmNlRmlsZU5hbWUuaW5kZXhPZigiXFwiKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVOYW1lID0gc291cmNlRmlsZU5hbWUucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZWcgPT0gbnVsbCAgfHwgdG8gPT0gbnVsbAorICAgICAgICAgICAgfHwgIXJlZy5tYXRjaGVzKHNvdXJjZUZpbGVOYW1lLCByZWdleHBPcHRpb25zKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7cmVwbGFjZVJlZmVyZW5jZXMoc291cmNlRmlsZU5hbWUpfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIGFsbCBiYWNrcmVmZXJlbmNlcyBpbiB0aGUgdG8gcGF0dGVybiB3aXRoIHRoZSBtYXRjaGVkCisgICAgICogZ3JvdXBzIG9mIHRoZSBzb3VyY2UuCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIGZpbGUgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2xhdGVkIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlcGxhY2VSZWZlcmVuY2VzKFN0cmluZyBzb3VyY2UpIHsKKyAgICAgICAgVmVjdG9yIHYgPSByZWcuZ2V0R3JvdXBzKHNvdXJjZSwgcmVnZXhwT3B0aW9ucyk7CisKKyAgICAgICAgcmVzdWx0LnNldExlbmd0aCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0by5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHRvW2ldID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICBpZiAoKytpIDwgdG8ubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IENoYXJhY3Rlci5kaWdpdCh0b1tpXSwgREVDSU1BTCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChTdHJpbmcpIHYuZWxlbWVudEF0KHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRvW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCAtIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaW5zdGVhZD8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZXNvdXJjZVV0aWxzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Jlc291cmNlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTk2ZGEyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZXNvdXJjZVV0aWxzLmphdmEKQEAgLTAsMCArMSw1NzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy51dGlsLkNoYWluUmVhZGVySGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlRpbWVDb21wYXJpc29uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyU2V0Q29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuVW5pb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlJlc3RyaWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlRvdWNoYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLk5vdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5FeGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5SZXNvdXJjZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TZWxlY3RvclV0aWxzOworCisvLyBDaGVja1N0eWxlOkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvckNoZWNrIE9GRiAtIGJjCisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyB1dGlsaXR5IG1ldGhvZHMgdG8gcHJvY2VzcyBSZXNvdXJjZXMuCisgKgorICogQHNpbmNlIEFudCAxLjUuMgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VVdGlscyB7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VTZWxlY3RvciBOT1RfRVhJU1RTID0gbmV3IE5vdChuZXcgRXhpc3RzKCkpOworCisgICAgLyoqCisgICAgICogVGVsbHMgd2hpY2ggc291cmNlIGZpbGVzIHNob3VsZCBiZSByZXByb2Nlc3NlZCBiYXNlZCBvbiB0aGUKKyAgICAgKiBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRhcmdldCBmaWxlcy4KKyAgICAgKiBAcGFyYW0gbG9nVG8gd2hlcmUgdG8gc2VuZCAobW9yZSBvciBsZXNzKSBpbnRlcmVzdGluZyBvdXRwdXQuCisgICAgICogQHBhcmFtIHNvdXJjZSBhcnJheSBvZiByZXNvdXJjZXMgYmVhcmluZyByZWxhdGl2ZSBwYXRoIGFuZCBsYXN0CisgICAgICogbW9kaWZpY2F0aW9uIGRhdGUuCisgICAgICogQHBhcmFtIG1hcHBlciBmaWxlbmFtZSBtYXBwZXIgaW5kaWNhdGluZyBob3cgdG8gZmluZCB0aGUgdGFyZ2V0CisgICAgICogZmlsZXMuCisgICAgICogQHBhcmFtIHRhcmdldHMgb2JqZWN0IGFibGUgdG8gbWFwIGFzIGEgcmVzb3VyY2UgYSByZWxhdGl2ZSBwYXRoCisgICAgICogYXQgPGI+ZGVzdGluYXRpb248L2I+LgorICAgICAqIEByZXR1cm4gYXJyYXkgY29udGFpbmluZyB0aGUgc291cmNlIGZpbGVzIHdoaWNoIG5lZWQgdG8gYmUKKyAgICAgKiBjb3BpZWQgb3IgcHJvY2Vzc2VkLCBiZWNhdXNlIHRoZSB0YXJnZXRzIGFyZSBvdXQgb2YgZGF0ZSBvciBkbworICAgICAqIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlW10gc2VsZWN0T3V0T2ZEYXRlU291cmNlcyhQcm9qZWN0Q29tcG9uZW50IGxvZ1RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlW10gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUZhY3RvcnkgdGFyZ2V0cykgeworICAgICAgICByZXR1cm4gc2VsZWN0T3V0T2ZEYXRlU291cmNlcyhsb2dUbywgc291cmNlLCBtYXBwZXIsIHRhcmdldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlbGxzIHdoaWNoIHNvdXJjZSBmaWxlcyBzaG91bGQgYmUgcmVwcm9jZXNzZWQgYmFzZWQgb24gdGhlCisgICAgICogbGFzdCBtb2RpZmljYXRpb24gZGF0ZSBvZiB0YXJnZXQgZmlsZXMuCisgICAgICogQHBhcmFtIGxvZ1RvIHdoZXJlIHRvIHNlbmQgKG1vcmUgb3IgbGVzcykgaW50ZXJlc3Rpbmcgb3V0cHV0LgorICAgICAqIEBwYXJhbSBzb3VyY2UgYXJyYXkgb2YgcmVzb3VyY2VzIGJlYXJpbmcgcmVsYXRpdmUgcGF0aCBhbmQgbGFzdAorICAgICAqIG1vZGlmaWNhdGlvbiBkYXRlLgorICAgICAqIEBwYXJhbSBtYXBwZXIgZmlsZW5hbWUgbWFwcGVyIGluZGljYXRpbmcgaG93IHRvIGZpbmQgdGhlIHRhcmdldAorICAgICAqIGZpbGVzLgorICAgICAqIEBwYXJhbSB0YXJnZXRzIG9iamVjdCBhYmxlIHRvIG1hcCBhcyBhIHJlc291cmNlIGEgcmVsYXRpdmUgcGF0aAorICAgICAqIGF0IDxiPmRlc3RpbmF0aW9uPC9iPi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgbGVld2F5IHRvIGdpdmUKKyAgICAgKiBiZWZvcmUgZGVjaWRpbmcgYSB0YXJnZXQgaXMgb3V0IG9mIGRhdGUuCisgICAgICogQHJldHVybiBhcnJheSBjb250YWluaW5nIHRoZSBzb3VyY2UgZmlsZXMgd2hpY2ggbmVlZCB0byBiZQorICAgICAqIGNvcGllZCBvciBwcm9jZXNzZWQsIGJlY2F1c2UgdGhlIHRhcmdldHMgYXJlIG91dCBvZiBkYXRlIG9yIGRvCisgICAgICogbm90IGV4aXN0LgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlW10gc2VsZWN0T3V0T2ZEYXRlU291cmNlcyhQcm9qZWN0Q29tcG9uZW50IGxvZ1RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlW10gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUZhY3RvcnkgdGFyZ2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGdyYW51bGFyaXR5KSB7CisgICAgICAgIFVuaW9uIHUgPSBuZXcgVW5pb24oKTsKKyAgICAgICAgdS5hZGRBbGwoQXJyYXlzLmFzTGlzdChzb3VyY2UpKTsKKyAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIHJjCisgICAgICAgICAgICA9IHNlbGVjdE91dE9mRGF0ZVNvdXJjZXMobG9nVG8sIHUsIG1hcHBlciwgdGFyZ2V0cywgZ3JhbnVsYXJpdHkpOworICAgICAgICByZXR1cm4gcmMuc2l6ZSgpID09IDAgPyBuZXcgUmVzb3VyY2VbMF0gOiAoKFVuaW9uKSByYykubGlzdFJlc291cmNlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlbGxzIHdoaWNoIHNvdXJjZXMgc2hvdWxkIGJlIHJlcHJvY2Vzc2VkIGJhc2VkIG9uIHRoZQorICAgICAqIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGFyZ2V0cy4KKyAgICAgKiBAcGFyYW0gbG9nVG8gd2hlcmUgdG8gc2VuZCAobW9yZSBvciBsZXNzKSBpbnRlcmVzdGluZyBvdXRwdXQuCisgICAgICogQHBhcmFtIHNvdXJjZSBSZXNvdXJjZUNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIG1hcHBlciBmaWxlbmFtZSBtYXBwZXIgaW5kaWNhdGluZyBob3cgdG8gZmluZCB0aGUgdGFyZ2V0IFJlc291cmNlcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0cyBvYmplY3QgYWJsZSB0byBtYXAgYSByZWxhdGl2ZSBwYXRoIGFzIGEgUmVzb3VyY2UuCisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byBnaXZlCisgICAgICogYmVmb3JlIGRlY2lkaW5nIGEgdGFyZ2V0IGlzIG91dCBvZiBkYXRlLgorICAgICAqIEByZXR1cm4gUmVzb3VyY2VDb2xsZWN0aW9uLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUNvbGxlY3Rpb24gc2VsZWN0T3V0T2ZEYXRlU291cmNlcyhQcm9qZWN0Q29tcG9uZW50IGxvZ1RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlRmFjdG9yeSB0YXJnZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBncmFudWxhcml0eSkgeworICAgICAgICBpZiAoc291cmNlLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBsb2dUby5sb2coIk5vIHNvdXJjZXMgZm91bmQuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VzLk5PTkU7CisgICAgICAgIH0KKyAgICAgICAgc291cmNlID0gVW5pb24uZ2V0SW5zdGFuY2Uoc291cmNlKTsKKyAgICAgICAgbG9nRnV0dXJlKGxvZ1RvLCBzb3VyY2UsIGdyYW51bGFyaXR5KTsKKworICAgICAgICBVbmlvbiByZXN1bHQgPSBuZXcgVW5pb24oKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc291cmNlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2Ugc3IgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHNyTmFtZSA9IHNyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHNyTmFtZSA9IHNyTmFtZSA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBzck5hbWUgOiBzck5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisKKyAgICAgICAgICAgIFN0cmluZ1tdIHRhcmdldG5hbWVzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0bmFtZXMgPSBtYXBwZXIubWFwRmlsZU5hbWUoc3JOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nVG8ubG9nKCJDYXVnaHQgIiArIGUgKyAiIG1hcHBpbmcgcmVzb3VyY2UgIiArIHNyLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0YXJnZXRuYW1lcyA9PSBudWxsIHx8IHRhcmdldG5hbWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbG9nVG8ubG9nKHNyICsgIiBza2lwcGVkIC0gZG9uXCd0IGtub3cgaG93IHRvIGhhbmRsZSBpdCIsCisgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVbmlvbiB0YXJnZXRDb2xsID0gbmV3IFVuaW9uKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldG5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0Q29sbC5hZGQodGFyZ2V0cy5nZXRSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0bmFtZXNbaV0ucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZmluZCB0aGUgb3V0LW9mLWRhdGUgdGFyZ2V0czoKKyAgICAgICAgICAgIFJlc3RyaWN0IHIgPSBuZXcgUmVzdHJpY3QoKTsKKyAgICAgICAgICAgIHIuYWRkKG5ldyBSZXNvdXJjZVNlbGVjdG9yKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoUmVzb3VyY2UgdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhIEkvTywgcHJvYmFibHkgd2FzdGVkOgorICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlbGVjdG9yVXRpbHMuaXNPdXRPZkRhdGUoc3IsIHRhcmdldCwgZ3JhbnVsYXJpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgci5hZGQodGFyZ2V0Q29sbCk7CisgICAgICAgICAgICBpZiAoci5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzcik7CisgICAgICAgICAgICAgICAgUmVzb3VyY2UgdCA9IChSZXNvdXJjZSkgKHIuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgICAgICAgICAgICAgIGxvZ1RvLmxvZyhzci5nZXROYW1lKCkgKyAiIGFkZGVkIGFzICIgKyB0LmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICh0LmlzRXhpc3RzKCkgPyAiIGlzIG91dGRhdGVkLiIgOiAiIGRvZXNuXCd0IGV4aXN0LiIpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vbG9nIHVwdG9kYXRlbmVzcyBvZiBhbGwgdGFyZ2V0czoKKyAgICAgICAgICAgIGxvZ1RvLmxvZyhzci5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICsgIiBvbWl0dGVkIGFzICIgKyB0YXJnZXRDb2xsLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICsgKHRhcmdldENvbGwuc2l6ZSgpID09IDEgPyAiIGlzIiA6ICIgYXJlICIpCisgICAgICAgICAgICAgICAgICArICIgdXAgdG8gZGF0ZS4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb3B5IGNvbnRlbnQgZnJvbSBvbmUgUmVzb3VyY2UgdG8gYW5vdGhlci4KKyAgICAgKiBObyBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgUmVzb3VyY2UgdG8gY29weSBmcm9tLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBkZXN0ICAgdGhlIFJlc291cmNlIHRvIGNvcHkgdG8uCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29weWluZyBmYWlscy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlSZXNvdXJjZShSZXNvdXJjZSBzb3VyY2UsIFJlc291cmNlIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvcHlSZXNvdXJjZShzb3VyY2UsIGRlc3QsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb3B5IGNvbnRlbnQgZnJvbSBvbmUgUmVzb3VyY2UgdG8gYW5vdGhlci4KKyAgICAgKiBObyBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgUmVzb3VyY2UgdG8gY29weSBmcm9tLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBkZXN0ICAgdGhlIFJlc291cmNlIHRvIGNvcHkgdG8uCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29weWluZyBmYWlscy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlSZXNvdXJjZShSZXNvdXJjZSBzb3VyY2UsIFJlc291cmNlIGRlc3QsIFByb2plY3QgcHJvamVjdCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29weVJlc291cmNlKHNvdXJjZSwgZGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCwgbnVsbCwgcHJvamVjdCk7CisgICAgfQorCisgICAgLy8gQ2hlY2tTdHlsZTpQYXJhbWV0ZXJOdW1iZXJDaGVjayBPRkYgLSBiYworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb3B5IGNvbnRlbnQgZnJvbSBvbmUgUmVzb3VyY2UgdG8gYW5vdGhlcgorICAgICAqIHNwZWNpZnlpbmcgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgbXVzdCBiZSB1c2VkLCB3aGV0aGVyIGZpbHRlciBjaGFpbnMKKyAgICAgKiBtdXN0IGJlIHVzZWQsIHdoZXRoZXIgbmV3ZXIgZGVzdGluYXRpb24gZmlsZXMgbWF5IGJlIG92ZXJ3cml0dGVuIGFuZAorICAgICAqIHdoZXRoZXIgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiA8Y29kZT5kZXN0PC9jb2RlPiBmaWxlIHNob3VsZCBiZSBtYWRlCisgICAgICogZXF1YWwgdG8gdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiA8Y29kZT5zb3VyY2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgUmVzb3VyY2UgdG8gY29weSBmcm9tLgorICAgICAqICAgICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBkZXN0ICAgdGhlIFJlc291cmNlIHRvIGNvcHkgdG8uCisgICAgICogICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBmaWx0ZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhpcyBjb3B5LgorICAgICAqIEBwYXJhbSBmaWx0ZXJDaGFpbnMgZmlsdGVyQ2hhaW5zIHRvIGFwcGx5IGR1cmluZyB0aGUgY29weS4KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIFdoZXRoZXIgb3Igbm90IHRoZSBkZXN0aW5hdGlvbiBSZXNvdXJjZSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICAgICAqIEBwYXJhbSBwcmVzZXJ2ZUxhc3RNb2RpZmllZCBXaGV0aGVyIG9yIG5vdCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBSZXNvdXJjZSBzaG91bGQgYmUgc2V0IHRvIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNvdXJjZS4KKyAgICAgKiBAcGFyYW0gaW5wdXRFbmNvZGluZyB0aGUgZW5jb2RpbmcgdXNlZCB0byByZWFkIHRoZSBmaWxlcy4KKyAgICAgKiBAcGFyYW0gb3V0cHV0RW5jb2RpbmcgdGhlIGVuY29kaW5nIHVzZWQgdG8gd3JpdGUgdGhlIGZpbGVzLgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29weWluZyBmYWlscy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlSZXNvdXJjZShSZXNvdXJjZSBzb3VyY2UsIFJlc291cmNlIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywgVmVjdG9yIGZpbHRlckNoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvdmVyd3JpdGUsIGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnB1dEVuY29kaW5nLCBTdHJpbmcgb3V0cHV0RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgcHJvamVjdCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFvdmVyd3JpdGUpIHsKKyAgICAgICAgICAgIGxvbmcgc2xtID0gc291cmNlLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgaWYgKGRlc3QuaXNFeGlzdHMoKSAmJiBzbG0gIT0gMAorICAgICAgICAgICAgICAgICYmIGRlc3QuZ2V0TGFzdE1vZGlmaWVkKCkgPiBzbG0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBmaWx0ZXJTZXRzQXZhaWxhYmxlID0gKGZpbHRlcnMgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsdGVycy5oYXNGaWx0ZXJzKCkpOworICAgICAgICBmaW5hbCBib29sZWFuIGZpbHRlckNoYWluc0F2YWlsYWJsZSA9IChmaWx0ZXJDaGFpbnMgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWx0ZXJDaGFpbnMuc2l6ZSgpID4gMCk7CisgICAgICAgIGlmIChmaWx0ZXJTZXRzQXZhaWxhYmxlKSB7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7CisgICAgICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChpbnB1dEVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc291cmNlLmdldElucHV0U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGRlc3QuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZGVzdC5nZXRPdXRwdXRTdHJlYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRFbmNvZGluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihvc3cpOworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJDaGFpbnNBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hhaW5SZWFkZXJIZWxwZXIgY3JoID0gbmV3IENoYWluUmVhZGVySGVscGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGNyaC5zZXRCdWZmZXJTaXplKEZpbGVVdGlscy5CVUZfU0laRSk7CisgICAgICAgICAgICAgICAgICAgIGNyaC5zZXRQcmltYXJ5UmVhZGVyKGluKTsKKyAgICAgICAgICAgICAgICAgICAgY3JoLnNldEZpbHRlckNoYWlucyhmaWx0ZXJDaGFpbnMpOworICAgICAgICAgICAgICAgICAgICBjcmguc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgUmVhZGVyIHJkciA9IGNyaC5nZXRBc3NlbWJsZWRSZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIocmRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTGluZVRva2VuaXplciBsaW5lVG9rZW5pemVyID0gbmV3IExpbmVUb2tlbml6ZXIoKTsKKyAgICAgICAgICAgICAgICBsaW5lVG9rZW5pemVyLnNldEluY2x1ZGVEZWxpbXModHJ1ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5ld2xpbmUgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbGluZVRva2VuaXplci5nZXRUb2tlbihpbik7CisgICAgICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBiZWNhdXNlIHRoZSBsaW5lcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIHdpdGggdGhlIGVuZCBvZiBsaW5lIGRlbGltaXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmUgPSBmaWx0ZXJzLnJlcGxhY2VUb2tlbnMobGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVUb2tlbml6ZXIuZ2V0VG9rZW4oaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJDaGFpbnNBdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICB8fCAoaW5wdXRFbmNvZGluZyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICYmICFpbnB1dEVuY29kaW5nLmVxdWFscyhvdXRwdXRFbmNvZGluZykpCisgICAgICAgICAgICAgICAgICAgfHwgKGlucHV0RW5jb2RpbmcgPT0gbnVsbCAmJiBvdXRwdXRFbmNvZGluZyAhPSBudWxsKSkgeworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOworICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgb3V0ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbmNvZGluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihkZXN0LmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGRlc3QuZ2V0T3V0cHV0U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RW5jb2RpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIob3N3KTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyQ2hhaW5zQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIENoYWluUmVhZGVySGVscGVyIGNyaCA9IG5ldyBDaGFpblJlYWRlckhlbHBlcigpOworICAgICAgICAgICAgICAgICAgICBjcmguc2V0QnVmZmVyU2l6ZShGaWxlVXRpbHMuQlVGX1NJWkUpOworICAgICAgICAgICAgICAgICAgICBjcmguc2V0UHJpbWFyeVJlYWRlcihpbik7CisgICAgICAgICAgICAgICAgICAgIGNyaC5zZXRGaWx0ZXJDaGFpbnMoZmlsdGVyQ2hhaW5zKTsKKyAgICAgICAgICAgICAgICAgICAgY3JoLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgICAgICAgICAgICAgIFJlYWRlciByZHIgPSBjcmguZ2V0QXNzZW1ibGVkUmVhZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltGaWxlVXRpbHMuQlVGX1NJWkVdOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuUmVhZCA9IGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5SZWFkID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBuUmVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3V0KTsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluID0gc291cmNlLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgb3V0ID0gZGVzdC5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtGaWxlVXRpbHMuQlVGX1NJWkVdOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gaW4ucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IC0xKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocHJlc2VydmVMYXN0TW9kaWZpZWQgJiYgZGVzdCBpbnN0YW5jZW9mIFRvdWNoYWJsZSkgeworICAgICAgICAgICAgc2V0TGFzdE1vZGlmaWVkKChUb3VjaGFibGUpIGRlc3QsIHNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQ2hlY2tTdHlsZTpQYXJhbWV0ZXJOdW1iZXJDaGVjayBPTgorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgYW4gb2JqZWN0IGltcGxlbWVudGluZworICAgICAqIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5Ub3VjaGFibGUgLgorICAgICAqCisgICAgICogQHBhcmFtIHQgdGhlIFRvdWNoYWJsZSB3aG9zZSBtb2RpZmllZCB0aW1lIGlzIHRvIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gdGltZSB0aGUgdGltZSB0byB3aGljaCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIGlzIHRvIGJlIHNldC4KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGlzIC0xLCB0aGUgY3VycmVudCB0aW1lIGlzIHVzZWQuCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKFRvdWNoYWJsZSB0LCBsb25nIHRpbWUpIHsKKyAgICAgICAgdC50b3VjaCgodGltZSA8IDApID8gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgOiB0aW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgY29udGVudHMgb2YgdHdvIFJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByMSB0aGUgUmVzb3VyY2Ugd2hvc2UgY29udGVudCBpcyB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcGFyYW0gcjIgdGhlIG90aGVyIFJlc291cmNlIHdob3NlIGNvbnRlbnQgaXMgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHBhcmFtIHRleHQgdHJ1ZSBpZiB0aGUgY29udGVudCBpcyB0byBiZSB0cmVhdGVkIGFzIHRleHQgYW5kCisgICAgICogICAgICAgIGRpZmZlcmVuY2VzIGluIGtpbmQgb2YgbGluZSBicmVhayBhcmUgdG8gYmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29udGVudCBvZiB0aGUgUmVzb3VyY2VzIGlzIHRoZSBzYW1lLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgUmVzb3VyY2VzIGNhbm5vdCBiZSByZWFkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRlbnRFcXVhbHMoUmVzb3VyY2UgcjEsIFJlc291cmNlIHIyLCBib29sZWFuIHRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyMS5pc0V4aXN0cygpICE9IHIyLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXIxLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgIC8vIHR3byBub3QgZXhpc3RpbmcgZmlsZXMgYXJlIGVxdWFsCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGQgdGhlIGZvbGxvd2luZyB0d28gYmUgc3dpdGNoZWQ/ICBJZiByMSBhbmQgcjIgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZSwKKyAgICAgICAgLy8gaXNuJ3QgdGhlaXIgY29udGVudCBlcXVhbCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhhdCBmaWxlIGlzIGEgZGlyZWN0b3J5PworICAgICAgICBpZiAocjEuaXNEaXJlY3RvcnkoKSB8fCByMi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAvLyBkb24ndCB3YW50IHRvIGNvbXBhcmUgZGlyZWN0b3J5IGNvbnRlbnRzIGZvciBub3cKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocjEuZXF1YWxzKHIyKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0ZXh0KSB7CisgICAgICAgICAgICBsb25nIHMxID0gcjEuZ2V0U2l6ZSgpOworICAgICAgICAgICAgbG9uZyBzMiA9IHIyLmdldFNpemUoKTsKKyAgICAgICAgICAgIGlmIChzMSAhPSBSZXNvdXJjZS5VTktOT1dOX1NJWkUgJiYgczIgIT0gUmVzb3VyY2UuVU5LTk9XTl9TSVpFCisgICAgICAgICAgICAgICAgICAgICYmIHMxICE9IHMyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21wYXJlQ29udGVudChyMSwgcjIsIHRleHQpID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0aGUgY29udGVudCBvZiB0d28gUmVzb3VyY2VzLiBBIG5vbmV4aXN0ZW50IFJlc291cmNlJ3MKKyAgICAgKiBjb250ZW50IGlzICJsZXNzIHRoYW4iIHRoYXQgb2YgYW4gZXhpc3RpbmcgUmVzb3VyY2U7IGEgZGlyZWN0b3J5LXR5cGUKKyAgICAgKiBSZXNvdXJjZSdzIGNvbnRlbnQgaXMgImxlc3MgdGhhbiIgdGhhdCBvZiBhIGZpbGUtdHlwZSBSZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gcjEgdGhlIFJlc291cmNlIHdob3NlIGNvbnRlbnQgaXMgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHBhcmFtIHIyIHRoZSBvdGhlciBSZXNvdXJjZSB3aG9zZSBjb250ZW50IGlzIHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEBwYXJhbSB0ZXh0IHRydWUgaWYgdGhlIGNvbnRlbnQgaXMgdG8gYmUgdHJlYXRlZCBhcyB0ZXh0IGFuZAorICAgICAqICAgICAgICBkaWZmZXJlbmNlcyBpbiBraW5kIG9mIGxpbmUgYnJlYWsgYXJlIHRvIGJlIGlnbm9yZWQuCisgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QKKyAgICAgKiAgICAgICAgIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIFJlc291cmNlcyBjYW5ub3QgYmUgcmVhZC4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVDb250ZW50KFJlc291cmNlIHIxLCBSZXNvdXJjZSByMiwgYm9vbGVhbiB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocjEuZXF1YWxzKHIyKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBlMSA9IHIxLmlzRXhpc3RzKCk7CisgICAgICAgIGJvb2xlYW4gZTIgPSByMi5pc0V4aXN0cygpOworICAgICAgICBpZiAoIShlMSB8fCBlMikpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChlMSAhPSBlMikgeworICAgICAgICAgICAgcmV0dXJuIGUxID8gMSA6IC0xOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gZDEgPSByMS5pc0RpcmVjdG9yeSgpOworICAgICAgICBib29sZWFuIGQyID0gcjIuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgaWYgKGQxICYmIGQyKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZDEgfHwgZDIpIHsKKyAgICAgICAgICAgIHJldHVybiBkMSA/IC0xIDogMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGV4dCA/IHRleHRDb21wYXJlKHIxLCByMikgOiBiaW5hcnlDb21wYXJlKHIxLCByMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluYXJ5IGNvbXBhcmVzIHRoZSBjb250ZW50cyBvZiB0d28gUmVzb3VyY2VzLgorICAgICAqIDxwPgorICAgICAqIHNpbXBsZSBidXQgc3ViLW9wdGltYWwgY29tcGFyaXNpb24gYWxnb3JpdGhtLiB3cml0dGVuIGZvciB3b3JraW5nCisgICAgICogcmF0aGVyIHRoYW4gZmFzdC4gQmV0dGVyIHdvdWxkIGJlIGEgYmxvY2sgcmVhZCBpbnRvIGJ1ZmZlcnMgZm9sbG93ZWQKKyAgICAgKiBieSBsb25nIGNvbXBhcmlzaW9ucyBhcGFydCBmcm9tIHRoZSBmaW5hbCAxLTcgYnl0ZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHIxIHRoZSBSZXNvdXJjZSB3aG9zZSBjb250ZW50IGlzIHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEBwYXJhbSByMiB0aGUgb3RoZXIgUmVzb3VyY2Ugd2hvc2UgY29udGVudCBpcyB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdAorICAgICAqICAgICAgICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgUmVzb3VyY2VzIGNhbm5vdCBiZSByZWFkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGJpbmFyeUNvbXBhcmUoUmVzb3VyY2UgcjEsIFJlc291cmNlIHIyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbjEgPSBudWxsOworICAgICAgICBJbnB1dFN0cmVhbSBpbjIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4xID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ocjEuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBpbjIgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyMi5nZXRJbnB1dFN0cmVhbSgpKTsKKworICAgICAgICAgICAgZm9yIChpbnQgYjEgPSBpbjEucmVhZCgpOyBiMSAhPSAtMTsgYjEgPSBpbjEucmVhZCgpKSB7CisgICAgICAgICAgICAgICAgaW50IGIyID0gaW4yLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYjEgIT0gYjIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIxID4gYjIgPyAxIDogLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGluMi5yZWFkKCkgPT0gLTEgPyAwIDogLTE7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4xKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbjIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGV4dCBjb21wYXJlcyB0aGUgY29udGVudHMgb2YgdHdvIFJlc291cmNlcy4KKyAgICAgKiBJZ25vcmVzIGRpZmZlcmVudCBraW5kcyBvZiBsaW5lIGVuZGluZ3MuCisgICAgICogQHBhcmFtIHIxIHRoZSBSZXNvdXJjZSB3aG9zZSBjb250ZW50IGlzIHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEBwYXJhbSByMiB0aGUgb3RoZXIgUmVzb3VyY2Ugd2hvc2UgY29udGVudCBpcyB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdAorICAgICAqICAgICAgICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgUmVzb3VyY2VzIGNhbm5vdCBiZSByZWFkLgorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRleHRDb21wYXJlKFJlc291cmNlIHIxLCBSZXNvdXJjZSByMikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4xID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4yID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluMSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocjEuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICAgICAgaW4yID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyMi5nZXRJbnB1dFN0cmVhbSgpKSk7CisKKyAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGluMS5yZWFkTGluZSgpOworICAgICAgICAgICAgd2hpbGUgKGV4cGVjdGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsID0gaW4yLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQuY29tcGFyZVRvKGFjdHVhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gaW4xLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW4yLnJlYWRMaW5lKCkgPT0gbnVsbCA/IDAgOiAtMTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbjEpOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgd2hpY2ggUmVzb3VyY2VzIChpZiBhbnkpIGhhdmUgYmVlbiBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgorICAgICAqIEBwYXJhbSBsb2dUbyB0aGUgUHJvamVjdENvbXBvbmVudCB0byBkbyB0aGUgbG9nZ2luZy4KKyAgICAgKiBAcGFyYW0gcmMgdGhlIGNvbGxlY3Rpb24gb2YgUmVzb3VyY2VzIHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSBncmFudWxhcml0eSB0aGUgdGltZXN0YW1wIGdyYW51bGFyaXR5IHRvIHVzZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nRnV0dXJlKFByb2plY3RDb21wb25lbnQgbG9nVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIHJjLCBsb25nIGdyYW51bGFyaXR5KSB7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBncmFudWxhcml0eTsKKyAgICAgICAgRGF0ZSBzZWwgPSBuZXcgRGF0ZSgpOworICAgICAgICBzZWwuc2V0TWlsbGlzKG5vdyk7CisgICAgICAgIHNlbC5zZXRXaGVuKFRpbWVDb21wYXJpc29uLkFGVEVSKTsKKyAgICAgICAgUmVzdHJpY3QgZnV0dXJlID0gbmV3IFJlc3RyaWN0KCk7CisgICAgICAgIGZ1dHVyZS5hZGQoc2VsKTsKKyAgICAgICAgZnV0dXJlLmFkZChyYyk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGZ1dHVyZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGxvZ1RvLmxvZygiV2FybmluZzogIiArICgoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICsgIiBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JldHJ5SGFuZGxlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZXRyeUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDYyYmMyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZXRyeUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisvKioKKyAqIEEgc2ltcGxlIHV0aWxpdHkgY2xhc3MgdG8gdGFrZSBhIHBpZWNlIG9mIGNvZGUgKHRoYXQgaW1wbGVtZW50cworICogPGNvZGU+UmV0cnlhYmxlPC9jb2RlPiBpbnRlcmZhY2UpIGFuZCBleGVjdXRlcyB0aGF0IHdpdGggcG9zc2liaWxpdHkgdG8KKyAqIHJldHJ5IHRoZSBleGVjdXRpb24gaW4gY2FzZSBvZiBJT0V4Y2VwdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFJldHJ5SGFuZGxlciB7CisKKyAgICBwcml2YXRlIGludCByZXRyaWVzQWxsb3dlZCA9IDA7CisgICAgcHJpdmF0ZSBUYXNrIHRhc2s7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgUmV0cnlpbmdIYW5kbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJldHJpZXNBbGxvd2VkIGhvdyBtYW55IHRpbWVzIHRvIHJldHJ5CisgICAgICogQHBhcmFtIHRhc2sgdGhlIEFudCB0YXNrIHRoYXQgaXMgaXMgZXhlY3V0ZWQgZnJvbSwgdXNlZCBmb3IgbG9nZ2luZyBvbmx5CisgICAgICovCisgICAgcHVibGljIFJldHJ5SGFuZGxlcihpbnQgcmV0cmllc0FsbG93ZWQsIFRhc2sgdGFzaykgeworICAgICAgICB0aGlzLnJldHJpZXNBbGxvd2VkID0gcmV0cmllc0FsbG93ZWQ7CisgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgPGNvZGU+UmV0cnlhYmxlPC9jb2RlPiBjb2RlIHdpdGggc3BlY2lmaWVkIG51bWJlciBvZiByZXRyaWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGV4ZSB0aGUgY29kZSB0byBleGVjdXRlCisgICAgICogQHBhcmFtIGRlc2Mgc29tZSBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGlzIHBpZWNlIG9mIGNvZGUsIHVzZWQgZm9yIGxvZ2dpbmcKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBudW1iZXIgb2YgcmV0cmllcyBoYXMgZXhjZWVkZWQgdGhlIGFsbG93ZWQgbGltaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFJldHJ5YWJsZSBleGUsIFN0cmluZyBkZXNjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgcmV0cmllcyA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGV4ZS5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0cmllcysrOworICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzID4gdGhpcy5yZXRyaWVzQWxsb3dlZCAmJiB0aGlzLnJldHJpZXNBbGxvd2VkID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFzay5sb2coInRyeSAjIiArIHJldHJpZXMgKyAiOiBJTyBlcnJvciAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVzYyArICIpLCBudW1iZXIgb2YgbWF4aW11bSByZXRyaWVzIHJlYWNoZWQgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMucmV0cmllc0FsbG93ZWQgKyAiKSwgZ2l2aW5nIHVwIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGFzay5sb2coInRyeSAjIiArIHJldHJpZXMgKyAiOiBJTyBlcnJvciAoIiArIGRlc2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSwgcmV0cnlpbmciLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmV0cnlhYmxlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JldHJ5YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzI0NGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JldHJ5YWJsZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKworLyoqCisgKiBTaW1wbGUgaW50ZXJmYWNlIGZvciBleGVjdXRpbmcgYSBwaWVjZSBvZiBjb2RlLiBVc2VkIGZvciB3cml0aW5nIGFub255bW91cyBpbm5lcgorICogY2xhc3NlcyBpbiBGVFAgdGFzayBmb3IgcmV0cnktb24tSU9FeGNlcHRpb24gYmVoYXZpb3VyLgorICoKKyAqIEBzZWUgUmV0cnlIYW5kbGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmV0cnlhYmxlIHsKKyAgICAvKiogVGhlIHZhbHVlIHRvIHVzZSB0byBuZXZlciBnaXZlIHVwLiAqLworICAgIGludCBSRVRSWV9GT1JFVkVSID0gLTE7CisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGV4ZWN1dGUgdGhlIGNvZGUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdEZpeEJTRlBhdGguamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0Rml4QlNGUGF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjlhNjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdEZpeEJTRlBhdGguamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKworLyoqCisgKiBBIGNsYXNzIHRvIG1vZGlmeSBhIGNsYXNzbG9hZGVyIHRvCisgKiBzdXBwb3J0IEJTRiBsYW5ndWFnZSBzdXBwb3J0LgorICovCitwdWJsaWMgY2xhc3MgU2NyaXB0Rml4QlNGUGF0aCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVUSUxfT1BUSU9OQUxfUEFDS0FHRQorICAgICAgICA9ICJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLm9wdGlvbmFsIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCU0ZfUEFDS0FHRSA9ICJvcmcuYXBhY2hlLmJzZiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJTRl9NQU5BR0VSID0gQlNGX1BBQ0tBR0UgKyAiLkJTRk1hbmFnZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCU0ZfU0NSSVBUX1JVTk5FUgorICAgICAgICA9IFVUSUxfT1BUSU9OQUxfUEFDS0FHRSArICIuU2NyaXB0UnVubmVyIjsKKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgYXJlIGxhbmd1YWdlcyB0aGF0IGhhdmUKKyAgICAgKiBzY3JpcHRpbmcgZW5naW5lcyBlbWJlZGRlZCBpbiBic2YuamFyLgorICAgICAqIFRoZSBhcnJheSBpcyBjb252ZXJ0ZWQgdG8gYSBtYXAgb2YKKyAgICAgKiBsYW5ndWFnZW5hbWUtPmNsYXNzbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCU0ZfTEFOR1VBR0VTID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJqcyIsICAgICAgICAgIm9yZy5tb3ppbGxhLmphdmFzY3JpcHQuU2NyaXB0YWJsZSIsCisgICAgICAgICAgICAiamF2YXNjcmlwdCIsICJvcmcubW96aWxsYS5qYXZhc2NyaXB0LlNjcmlwdGFibGUiLAorICAgICAgICAgICAgImphY2wiLCAgICAgICAidGNsLmxhbmcuSW50ZXJwIiwKKyAgICAgICAgICAgICJuZXRyZXh4IiwgICAgIm5ldHJleHgubGFuZy5SZXh4IiwKKyAgICAgICAgICAgICJucngiLCAgICAgICAgIm5ldHJleHgubGFuZy5SZXh4IiwKKyAgICAgICAgICAgICJqeXRob24iLCAgICAgIm9yZy5weXRob24uY29yZS5QeSIsCisgICAgICAgICAgICAicHkiLCAgICAgICAgICJvcmcucHl0aG9uLmNvcmUuUHkiLAorICAgICAgICAgICAgInhzbHQiLCAgICAgICAib3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3QifTsKKworICAgIC8qKiBBIG1hcCBvZiBsYW5ndWFnZXMgZm9yIHdoaWNoIHRoZSBlbmdpbmUgaW4gbG9jYXRlZCBpbiBic2YgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgQlNGX0xBTkdVQUdFX01BUCA9IG5ldyBIYXNoTWFwKCk7CisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCU0ZfTEFOR1VBR0VTLmxlbmd0aDsgaSA9IGkgKyAyKSB7CisgICAgICAgICAgICBCU0ZfTEFOR1VBR0VfTUFQLnB1dChCU0ZfTEFOR1VBR0VTW2ldLCBCU0ZfTEFOR1VBR0VTW2kgKyAxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGUgZ2V0Q2xhc3NTb3VyY2UoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHJldHVybiBMb2FkZXJVdGlscy5nZXRSZXNvdXJjZVNvdXJjZSgKKyAgICAgICAgICAgIGxvYWRlciwKKyAgICAgICAgICAgIExvYWRlclV0aWxzLmNsYXNzTmFtZVRvUmVzb3VyY2UoY2xhc3NOYW1lKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlIGdldENsYXNzU291cmNlKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzU291cmNlKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgY2xhc3NOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBuZWVkIHRvIG1lc3MgYWJvdXQgd2l0aCB0aGUgY2xhc3Nsb2FkZXIuCisgICAgICogVGhlIGNsYXNzIGxvYWRlciB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQgZm9yIHR3bworICAgICAqIHJlYXNvbnM6CisgICAgICogPG9sPgorICAgICAqICA8bGk+bGFuZ3VhZ2UgaXMgYXQgYSBoaWdoZXIgbGV2ZWwgdGhhbiBic2YgZm9yIGVuZ2luZXMgaW4gYnNmLAorICAgICAqICAgICAgbW92ZSBic2YuCisgICAgICogIDwvbGk+CisgICAgICogIDxsaT5ic2YgaXMgYXQgYSBoaWdoZXIgbGV2ZWwgdGhhbiBvYXRhLnV0aWwub3B0aW9uYWwuU2NyaXB0UnVubmVyCisgICAgICogIDwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEFzc3VtZSBhIHNpbXBsZSBtb2RlbCBmb3IgdGhlIGxvYWRlcjoKKyAgICAgKiAgdGhpc2xvYWRlcjwtY3VzdG9tbG9hZGVyCisgICAgICogIG9yCisgICAgICogIHRoaXNsb2FkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGNsYXNzbG9hZGVyIHRvIGZpeC4KKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgdGhlIGxhbmd1YWdlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXhDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICBpZiAobG9hZGVyID09IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgfHwgIShsb2FkZXIgaW5zdGFuY2VvZiBBbnRDbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDbGFzc0xvYWRlciBteUxvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgQW50Q2xhc3NMb2FkZXIgZml4TG9hZGVyID0gKEFudENsYXNzTG9hZGVyKSBsb2FkZXI7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGxvY2F0aW9uIG9mIGJzZiBpbiB0aGlzIGNsYXNzbG9hZGVyCisgICAgICAgIEZpbGUgYnNmU291cmNlID0gZ2V0Q2xhc3NTb3VyY2UoQlNGX01BTkFHRVIpOworCisgICAgICAgIC8vIElmIGJzZiBpcyBub3QgaW4gdGhlIGNsYXNzbG9hZGVyIGZvciB0aGlzLCBuZWVkIHRvIG1vdmUKKyAgICAgICAgLy8gcnVubmVyLgorICAgICAgICBib29sZWFuIG5lZWRNb3ZlUnVubmVyID0gKGJzZlNvdXJjZSA9PSBudWxsKTsKKworICAgICAgICAvLyBDaGVjayBmb3IgbG9jYXRpb24gb2YgbGFuZ3VhZ2UKKyAgICAgICAgU3RyaW5nIGxhbmd1YWdlQ2xhc3NOYW1lID0gKFN0cmluZykgQlNGX0xBTkdVQUdFX01BUC5nZXQobGFuZ3VhZ2UpOworCisgICAgICAgIC8vIENoZWNrIGlmIG5lZWQgdG8gbmVlZCB0byBtb3ZlIGJzZgorICAgICAgICBib29sZWFuIG5lZWRNb3ZlQnNmID0KKyAgICAgICAgICAgIGJzZlNvdXJjZSAhPSBudWxsCisgICAgICAgICAgICAmJiBsYW5ndWFnZUNsYXNzTmFtZSAhPSBudWxsCisgICAgICAgICAgICAmJiAhTG9hZGVyVXRpbHMuY2xhc3NFeGlzdHMobXlMb2FkZXIsIGxhbmd1YWdlQ2xhc3NOYW1lKQorICAgICAgICAgICAgJiYgTG9hZGVyVXRpbHMuY2xhc3NFeGlzdHMobG9hZGVyLCBsYW5ndWFnZUNsYXNzTmFtZSk7CisKKyAgICAgICAgLy8gVXBkYXRlIG5lZWQgdG8gbW92ZSBydW5uZXIKKyAgICAgICAgbmVlZE1vdmVSdW5uZXIgPSBuZWVkTW92ZVJ1bm5lciB8fCBuZWVkTW92ZUJzZjsKKworICAgICAgICAvLyBDaGVjayBpZiBic2YgaW4gcGxhY2UKKyAgICAgICAgaWYgKGJzZlNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICBic2ZTb3VyY2UgPSBnZXRDbGFzc1NvdXJjZShsb2FkZXIsIEJTRl9NQU5BR0VSKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChic2ZTb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBCU0YgY2xhc3NlcyBmb3Igc2NyaXB0aW5nIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZE1vdmVCc2YpIHsKKyAgICAgICAgICAgIGZpeExvYWRlci5hZGRQYXRoQ29tcG9uZW50KGJzZlNvdXJjZSk7CisgICAgICAgICAgICBmaXhMb2FkZXIuYWRkTG9hZGVyUGFja2FnZVJvb3QoQlNGX1BBQ0tBR0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRNb3ZlUnVubmVyKSB7CisgICAgICAgICAgICBmaXhMb2FkZXIuYWRkUGF0aENvbXBvbmVudCgKKyAgICAgICAgICAgICAgICBMb2FkZXJVdGlscy5nZXRSZXNvdXJjZVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgZml4TG9hZGVyLAorICAgICAgICAgICAgICAgICAgICBMb2FkZXJVdGlscy5jbGFzc05hbWVUb1Jlc291cmNlKEJTRl9TQ1JJUFRfUlVOTkVSKSkpOworICAgICAgICAgICAgZml4TG9hZGVyLmFkZExvYWRlclBhY2thZ2VSb290KFVUSUxfT1BUSU9OQUxfUEFDS0FHRSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmMyYWRjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJsaXR5LgorICogQGRlcHJlY2F0ZWQgSW1wbGVtZW50YXRpb24gbW92ZWQgdG8gYW5vdGhlciBsb2NhdGlvbi4gVXNlCisgKiAgICAgICAgICAgICB0aGF0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLlNjcmlwdFJ1bm5lciBpbnN0ZWFkLgorICovCitwdWJsaWMgY2xhc3MgU2NyaXB0UnVubmVyCisgICAgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLm9wdGlvbmFsLlNjcmlwdFJ1bm5lciB7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckJhc2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0UnVubmVyQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYmE1NDUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckJhc2UuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFRoaXMgaXMgYSBjb21tb24gYWJzdHJhY3QgYmFzZSBjYXNlIGZvciBzY3JpcHQgcnVubmVycy4KKyAqIFRoZXNlIGNsYXNzZXMgbmVlZCB0byBpbXBsZW1lbnQgZXhlY3V0ZVNjcmlwdCwgZXZhbHVhdGVTY3JpcHQKKyAqIGFuZCBzdXBwb3J0c0xhbmd1YWdlLgorICogQHNpbmNlIEFudCAxLjcuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NyaXB0UnVubmVyQmFzZSB7CisgICAgLyoqIFdoZXRoZXIgdG8ga2VlcCB0aGUgZW5naW5lIGJldHdlZW4gY2FsbHMgdG8gZXhlY3V0ZS9ldmFsICovCisgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBFbmdpbmUgPSBmYWxzZTsKKworICAgIC8qKiBTY3JpcHQgbGFuZ3VhZ2UgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsYW5ndWFnZTsKKworICAgIC8qKiBTY3JpcHQgY29udGVudCAqLworICAgIHByaXZhdGUgU3RyaW5nIHNjcmlwdCA9ICIiOworCisgICAgLyoqIFByb2plY3QgdGhpcyBydW5uZXIgaXMgdXNlZCBpbiAqLworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgLyoqIENsYXNzbG9hZGVyIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBzY3JpcHQuICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBzY3JpcHRMb2FkZXI7CisKKyAgICAvKiogQmVhbnMgdG8gYmUgcHJvdmlkZWQgdG8gdGhlIHNjcmlwdCAqLworICAgIHByaXZhdGUgTWFwIGJlYW5zID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpc3Qgb2YgbmFtZWQgb2JqZWN0cyB0byB0aGUgbGlzdCB0byBiZSBleHBvcnRlZCB0byB0aGUgc2NyaXB0CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGljdGlvbmFyeSBhIG1hcCBvZiBvYmplY3RzIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBzY3JpcHQgY29udGV4dAorICAgICAqICAgICAgICBpbmRleGVkIGJ5IFN0cmluZyBuYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRCZWFucyhNYXAgZGljdGlvbmFyeSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkaWN0aW9uYXJ5LmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsID0gZGljdGlvbmFyeS5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICBhZGRCZWFuKGtleSwgdmFsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGtleSBpcyBpbiB0aGUgZGljdGlvbmFyeSBidXQgY2Fubm90IGJlIHJldHJpZXZlZAorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSBkdWUgcmVmZXJlbmNlcyB0aGF0IHJlZmVyIHRvIHRhc2tzCisgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXZlIG5vdCBiZWVuIHRhc2tkZWZlZCBpbiB0aGUgY3VycmVudCBydW4uCisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzaW5nbGUgb2JqZWN0IGludG8gdGhlIHNjcmlwdCBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB0aGUgbmFtZSBpbiB0aGUgY29udGV4dCB0aGlzIG9iamVjdCBpcyB0byBzdG9yZWQgdW5kZXIuCisgICAgICogQHBhcmFtIGJlYW4gdGhlIG9iamVjdCB0byBiZSBzdG9yZWQgaW4gdGhlIHNjcmlwdCBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEJlYW4oU3RyaW5nIGtleSwgT2JqZWN0IGJlYW4pIHsKKyAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0ga2V5Lmxlbmd0aCgpID4gMAorICAgICAgICAgICAgJiYgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChrZXkuY2hhckF0KDApKTsKKworICAgICAgICBmb3IgKGludCBpID0gMTsgaXNWYWxpZCAmJiBpIDwga2V5Lmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlzVmFsaWQgPSBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoa2V5LmNoYXJBdChpKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNWYWxpZCkgeworICAgICAgICAgICAgYmVhbnMucHV0KGtleSwgYmVhbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGJlYW5zIHVzZWQgZm9yIHRoZSBzY3JpcHQuCisgICAgICogQHJldHVybiB0aGUgbWFwIG9mIGJlYW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgZ2V0QmVhbnMoKSB7CisgICAgICAgIHJldHVybiBiZWFuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgd29yay4KKyAgICAgKiBAcGFyYW0gZXhlY05hbWUgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBCU0YgZm9yIHRoaXMgc2NyaXB0CisgICAgICogICAgICAgIGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlU2NyaXB0KFN0cmluZyBleGVjTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSB0aGUgc2NyaXB0LgorICAgICAqIEBwYXJhbSBleGVjTmFtZSB0aGUgbmFtZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBzY3JpcHRpbmcgZW5naW5lIGZvciB0aGlzIHNjcmlwdCBleGVjdXRpb24uCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIHNjcmlwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGV2YWx1YXRlU2NyaXB0KFN0cmluZyBleGVjTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBhIHNjcmlwdCBlbmdpbmUgY2FuIGJlIGNyZWF0ZWQgZm9yCisgICAgICogdGhpcyBsYW5ndWFnZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzY3JpcHQgZW5naW5lIGNhbiBiZSBjcmVhdGVkLCBmYWxzZQorICAgICAqICAgICAgICAgICAgICBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNMYW5ndWFnZSgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBtYW5hZ2VyIHByZWZpeCB1c2VkIGZvciB0aGlzCisgICAgICogc2NyaXB0cnVubmVyLgorICAgICAqIEByZXR1cm4gdGhlIHByZWZpeCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRNYW5hZ2VyTmFtZSgpOworCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgbGFuZ3VhZ2UgKHJlcXVpcmVkKS4KKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBuYW1lIGZvciB0aGUgc2NyaXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzY3JpcHQgbGFuZ3VhZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSBzY3JpcHQgbGFuZ3VhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgeworICAgICAgICByZXR1cm4gbGFuZ3VhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzY3JpcHQgY2xhc3Nsb2FkZXIuCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIHRoZSBjbGFzc2xvYWRlciB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NyaXB0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgdGhpcy5zY3JpcHRMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsYXNzbG9hZGVyIHVzZWQgdG8gbG9hZCB0aGUgc2NyaXB0IGVuZ2luZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc2xvYWRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZ2V0U2NyaXB0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBzY3JpcHRMb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBrZWVwIHRoZSBzY3JpcHQgZW5naW5lIGJldHdlZW4gY2FsbHMuCisgICAgICogQHBhcmFtIGtlZXBFbmdpbmUgaWYgdHJ1ZSwga2VlcCB0aGUgZW5naW5lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtlZXBFbmdpbmUoYm9vbGVhbiBrZWVwRW5naW5lKSB7CisgICAgICAgIHRoaXMua2VlcEVuZ2luZSA9IGtlZXBFbmdpbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBrZWVwIGVuZ2luZSBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEtlZXBFbmdpbmUoKSB7CisgICAgICAgIHJldHVybiBrZWVwRW5naW5lOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIHNjcmlwdCBmcm9tIGFuIGV4dGVybmFsIGZpbGU7IG9wdGlvbmFsLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHNjcmlwdCBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjKEZpbGUgZmlsZSkgeworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldFBhdGgoKTsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgIiArIGZpbGVuYW1lICsgIiBub3QgZm91bmQuIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRTb3VyY2UobmV3IEZpbGVSZWFkZXIoZmlsZSksIGZpbGVuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vdGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIGZpbGUgZ290IGRlbGV0ZWQgYSBzaG9ydCBtb21lbnQgYWdvCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgIiArIGZpbGVuYW1lICsgIiBub3QgZm91bmQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHNvbWUgc291cmNlIGluIGZyb20gdGhlIGdpdmVuIHJlYWRlcgorICAgICAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlcjsgdGhpcyBpcyBjbG9zZWQgYWZ0ZXJ3YXJkcy4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byB1c2UgaW4gZXJyb3IgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVhZFNvdXJjZShSZWFkZXIgcmVhZGVyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOworICAgICAgICAgICAgc2NyaXB0ICs9IEZpbGVVdGlscy5zYWZlUmVhZEZ1bGx5KGluKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgIiArIG5hbWUsIGV4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIHJlc291cmNlIHRvIHRoZSBzb3VyY2UgbGlzdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNy4xCisgICAgICogQHBhcmFtIHNvdXJjZVJlc291cmNlIHRoZSByZXNvdXJjZSB0byBsb2FkCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcmVzb3VyY2UgY2Fubm90IGJlIHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkUmVzb3VyY2UoUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBzb3VyY2VSZXNvdXJjZS50b0xvbmdTdHJpbmcoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4gPSBzb3VyY2VSZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBvcGVuICIgKyBuYW1lLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiAiICsgbmFtZSArICIgLWl0IGlzIG5vdCByZWFkYWJsZSIsIGUpOworICAgICAgICB9CisgICAgICAgIHJlYWRTb3VyY2UobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSwgbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFsbCByZXNvdXJjZXMgaW4gYSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIHRoZSBzb3VyY2UgbGlzdC4KKyAgICAgKiBAc2luY2UgQW50IDEuNy4xCisgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gdGhlIHJlc291cmNlIHRvIGxvYWQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGEgcmVzb3VyY2UgY2Fubm90IGJlIHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkUmVzb3VyY2VzKFJlc291cmNlQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7CisgICAgICAgIEl0ZXJhdG9yIHJlc291cmNlcyA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSByZXNvdXJjZXMubmV4dCgpOworICAgICAgICAgICAgbG9hZFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2NyaXB0IHRleHQuIFByb3BlcnRpZXMgaW4gdGhlIHRleHQgYXJlIG5vdCBleHBhbmRlZCEKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IGEgY29tcG9uZW50IG9mIHRoZSBzY3JpcHQgdGV4dCB0byBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHNjcmlwdCArPSB0ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBzY3JpcHQgdGV4dCBjb250ZW50LgorICAgICAqIEByZXR1cm4gdGhlIHNjcmlwdCB0ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0KCkgeworICAgICAgICByZXR1cm4gc2NyaXB0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBjdXJyZW50IHNjcmlwdCB0ZXh0IGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJTY3JpcHQoKSB7CisgICAgICAgIHRoaXMuc2NyaXB0ID0gIiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9qZWN0IGZvciB0aGlzIHJ1bm5lci4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJvamVjdCBmb3IgdGhpcyBydW5uZXIuCisgICAgICogQHJldHVybiB0aGUgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgeworICAgICAgICByZXR1cm4gcHJvamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kIHRoZSBydW5uZXIgdG8gYSBwcm9qZWN0IGNvbXBvbmVudC4KKyAgICAgKiBQcm9wZXJ0aWVzLCB0YXJnZXRzIGFuZCByZWZlcmVuY2VzIGFyZSBhbGwgYWRkZWQgYXMgYmVhbnM7CisgICAgICogcHJvamVjdCBpcyBib3VuZCB0byBwcm9qZWN0LCBhbmQgc2VsZiB0byB0aGUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgdG8gYmVjb21lIDxjb2RlPnNlbGY8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZFRvQ29tcG9uZW50KFByb2plY3RDb21wb25lbnQgY29tcG9uZW50KSB7CisgICAgICAgIHByb2plY3QgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOworICAgICAgICBhZGRCZWFucyhwcm9qZWN0LmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgIGFkZEJlYW5zKHByb2plY3QuZ2V0VXNlclByb3BlcnRpZXMoKSk7CisgICAgICAgIGFkZEJlYW5zKHByb2plY3QuZ2V0VGFyZ2V0cygpKTsKKyAgICAgICAgYWRkQmVhbnMocHJvamVjdC5nZXRSZWZlcmVuY2VzKCkpOworICAgICAgICBhZGRCZWFuKCJwcm9qZWN0IiwgcHJvamVjdCk7CisgICAgICAgIGFkZEJlYW4oInNlbGYiLCBjb21wb25lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmQgdGhlIHJ1bm5lciB0byBhIHByb2plY3QgY29tcG9uZW50LgorICAgICAqIFRoZSBwcm9qZWN0IGFuZCBzZWxmIGFyZSB0aGUgb25seSBiZWFucyBzZXQuCisgICAgICogQHBhcmFtIGNvbXBvbmVudCB0byBiZWNvbWUgPGNvZGU+c2VsZjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kVG9Db21wb25lbnRNaW5pbXVtKFByb2plY3RDb21wb25lbnQgY29tcG9uZW50KSB7CisgICAgICAgIHByb2plY3QgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOworICAgICAgICBhZGRCZWFuKCJwcm9qZWN0IiwgcHJvamVjdCk7CisgICAgICAgIGFkZEJlYW4oInNlbGYiLCBjb21wb25lbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBsYW5ndWFnZSBhdHRyaWJ1dGUgaXMgc2V0LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgaXQgaXMgbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTGFuZ3VhZ2UoKSB7CisgICAgICAgIGlmIChsYW5ndWFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInNjcmlwdCBsYW5ndWFnZSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSB0aGUgY3VycmVudCBjb250ZXh0IGNsYXNzbG9hZGVyIHdpdGggdGhlCisgICAgICogc2NyaXB0IGNvbnRleHQgY2xhc3Nsb2FkZXIuCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBjb250ZXh0IGNsYXNzbG9hZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciByZXBsYWNlQ29udGV4dExvYWRlcigpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgb3JpZ0NvbnRleHRDbGFzc0xvYWRlciA9CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAoZ2V0U2NyaXB0Q2xhc3NMb2FkZXIoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRTY3JpcHRDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICB9CisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGdldFNjcmlwdENsYXNzTG9hZGVyKCkpOworICAgICAgICByZXR1cm4gb3JpZ0NvbnRleHRDbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlIHRoZSBjb250ZXh0IGxvYWRlciB3aXRoIHRoZSBvcmlnaW5hbCBjb250ZXh0IGNsYXNzbG9hZGVyLgorICAgICAqCisgICAgICogc2NyaXB0IGNvbnRleHQgbG9hZGVyLgorICAgICAqIEBwYXJhbSBvcmlnTG9hZGVyIHRoZSBvcmlnaW5hbCBjb250ZXh0IGNsYXNzbG9hZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlc3RvcmVDb250ZXh0TG9hZGVyKENsYXNzTG9hZGVyIG9yaWdMb2FkZXIpIHsKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoCisgICAgICAgICAgICAgICAgIG9yaWdMb2FkZXIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXJDcmVhdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckNyZWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U5ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXJDcmVhdG9yLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB1c2VkIGJ5IFNjcmlwdFJ1bm5lckhlbHBlciB0bworICogY3JlYXRlIGEgU2NyaXB0UnVubmVyIGJhc2VkIG9uIGEgY2xhc3Nsb2FkZXIgYW5kIG9uIGEgbGFuZ3VhZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRSdW5uZXJDcmVhdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUTyA9ICJhdXRvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FUQVUgPSAib3JnLmFwYWNoZS50b29scy5hbnQudXRpbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVUSUxfT1BUID0gT0FUQVUgKyAiLm9wdGlvbmFsIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCU0YgPSAiYnNmIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlNGX1BBQ0sgPSAib3JnLmFwYWNoZS5ic2YiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCU0ZfTUFOQUdFUiA9IEJTRl9QQUNLICsgIi5CU0ZNYW5hZ2VyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlNGX1JVTk5FUiA9IFVUSUxfT1BUICsgIi5TY3JpcHRSdW5uZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYID0gImphdmF4IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfTUFOQUdFUiA9ICJqYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lTWFuYWdlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFYX1JVTk5FUiA9IFVUSUxfT1BUICsgIi5KYXZheFNjcmlwdFJ1bm5lciI7CisKKyAgICBwcml2YXRlIFByb2plY3QgICAgIHByb2plY3Q7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICBtYW5hZ2VyOworICAgIHByaXZhdGUgU3RyaW5nICAgICAgbGFuZ3VhZ2U7CisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBzY3JpcHRMb2FkZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIGNyZWF0b3IuCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NyaXB0UnVubmVyQ3JlYXRvcihQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBTY3JpcHRSdW5uZXIuCisgICAgICogQHBhcmFtIG1hbmFnZXIgICAgICB0aGUgc2NyaXB0IG1hbmFnZXIgKCJhdXRvIiB8ICJic2YiIHwgImphdmF4IikKKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgICAgIHRoZSBsYW5ndWFnZS4KKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgIHRoZSBjbGFzc2xvYWRlciB0byB1c2UKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHNjcmlwdCBydW5uZXIuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gY3JlYXRlIHRoZSBTY3JpcHRSdW5uZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTY3JpcHRSdW5uZXJCYXNlIGNyZWF0ZVJ1bm5lcigKKyAgICAgICAgU3RyaW5nIG1hbmFnZXIsIFN0cmluZyBsYW5ndWFnZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgdGhpcy5tYW5hZ2VyICAgICAgPSBtYW5hZ2VyOworICAgICAgICB0aGlzLmxhbmd1YWdlICAgICA9IGxhbmd1YWdlOworICAgICAgICB0aGlzLnNjcmlwdExvYWRlciA9IGNsYXNzTG9hZGVyOworCisgICAgICAgIGlmIChsYW5ndWFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNjcmlwdCBsYW5ndWFnZSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIGlmICghbWFuYWdlci5lcXVhbHMoQVVUTykgJiYgIW1hbmFnZXIuZXF1YWxzKEpBVkFYKSAmJiAhbWFuYWdlci5lcXVhbHMoQlNGKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBsYW5ndWFnZSBwcmVmaXggIiArIG1hbmFnZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGJzZiBmaXJzdCB0aGVuIGphdmF4CisgICAgICAgIC8vIFRoaXMgdmVyc2lvbiBkb2VzIG5vdCBjaGVjayBpZiB0aGUgc2NyaXB0TWFuYWdlcgorICAgICAgICAvLyBzdXBwb3J0cyB0aGUgbGFuZ3VhZ2UuCisKKyAgICAgICAgU2NyaXB0UnVubmVyQmFzZSByZXQgPSBudWxsOworICAgICAgICByZXQgPSBjcmVhdGVSdW5uZXIoQlNGLCBCU0ZfTUFOQUdFUiwgQlNGX1JVTk5FUik7CisgICAgICAgIGlmIChyZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0ID0gY3JlYXRlUnVubmVyKEpBVkFYLCBKQVZBWF9NQU5BR0VSLCBKQVZBWF9SVU5ORVIpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoSkFWQVguZXF1YWxzKG1hbmFnZXIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbG9hZCB0aGUgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyICIgKyAiKCIgKyBKQVZBWF9NQU5BR0VSICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQlNGLmVxdWFscyhtYW5hZ2VyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGxvYWQgdGhlIEJTRiBzY3JpcHQgZW5naW5lIG1hbmFnZXIgIiArICIoIiArIEJTRl9NQU5BR0VSICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIGEgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyICIKKyAgICAgICAgICAgICAgICArICIoIiArIEJTRl9NQU5BR0VSICsgIiBvciAiICsgSkFWQVhfTUFOQUdFUiArICIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc2NyaXB0IHJ1bm5lciBpZiB0aGUgc2NyaXB0TWFuYWdlciBtYXRjaGVzIHRoZSBwYXNzZWQKKyAgICAgKiBpbiBtYW5hZ2VyLgorICAgICAqIFRoaXMgY2hlY2tzIGlmIHRoZSBzY3JpcHQgbWFuYWdlciBleGlzdHMgaW4gdGhlIHNjcmlwdExvYWRlcgorICAgICAqIGNsYXNzbG9hZGVyIGFuZCBpZiBzbyBpdCBjcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBzY3JpcHQgcnVubmVyLgorICAgICAqIEBwYXJhbSBjaGVja01hbmFnZXIgY2hlY2sgaWYgdGhlIG1hbmFnZXIgbWF0Y2hzIHRoaXMgdmFsdWUuCisgICAgICogQHBhcmFtIG1hbmFnZXJDbGFzcyB0aGUgbmFtZSBvZiB0aGUgc2NyaXB0IG1hbmFnZXIgY2xhc3MuCisgICAgICogQHBhcmFtIHJ1bm5lckNsYXNzICAgdGhlIG5hbWUgb2YgYW50J3Mgc2NyaXB0IHJ1bm5lciBmb3IgdGhpcyBtYW5hZ2VyLgorICAgICAqIEByZXR1cm4gdGhlIHNjcmlwdCBydW5uZXIgY2xhc3MuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gY3JlYXRpbmcgdGhlIHJ1bm5lciBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNjcmlwdFJ1bm5lckJhc2UgY3JlYXRlUnVubmVyKAorICAgICAgICBTdHJpbmcgY2hlY2tNYW5hZ2VyLCBTdHJpbmcgbWFuYWdlckNsYXNzLCBTdHJpbmcgcnVubmVyQ2xhc3MpIHsKKyAgICAgICAgU2NyaXB0UnVubmVyQmFzZSBydW5uZXIgPSBudWxsOworICAgICAgICBpZiAoIW1hbmFnZXIuZXF1YWxzKEFVVE8pICYmICFtYW5hZ2VyLmVxdWFscyhjaGVja01hbmFnZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NyaXB0TG9hZGVyLmdldFJlc291cmNlKExvYWRlclV0aWxzLmNsYXNzTmFtZVRvUmVzb3VyY2UobWFuYWdlckNsYXNzKSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hbmFnZXJDbGFzcy5lcXVhbHMoQlNGX01BTkFHRVIpKSB7CisgICAgICAgICAgICBuZXcgU2NyaXB0Rml4QlNGUGF0aCgpLmZpeENsYXNzTG9hZGVyKHNjcmlwdExvYWRlciwgbGFuZ3VhZ2UpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBydW5uZXIgPSAoU2NyaXB0UnVubmVyQmFzZSkgQ2xhc3MuZm9yTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgcnVubmVyQ2xhc3MsIHRydWUsIHNjcmlwdExvYWRlcikubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHJ1bm5lci5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IFJlZmxlY3RVdGlsLnRvQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgICAgIHJ1bm5lci5zZXRMYW5ndWFnZShsYW5ndWFnZSk7CisgICAgICAgIHJ1bm5lci5zZXRTY3JpcHRDbGFzc0xvYWRlcihzY3JpcHRMb2FkZXIpOworICAgICAgICByZXR1cm4gcnVubmVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0UnVubmVySGVscGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGFkNmIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuVW5pb247CisKKy8qKgorICogQSBjbGFzcyB0byBoZWxwIGluIGNyZWF0aW5nLCBzZXR0aW5nIGFuZCBnZXR0aW5nIHNjcmlwdCBydW5uZXJzLgorICovCitwdWJsaWMgY2xhc3MgU2NyaXB0UnVubmVySGVscGVyIHsKKyAgICBwcml2YXRlIENsYXNzcGF0aFV0aWxzLkRlbGVnYXRlIGNwRGVsZWdhdGUgPSBudWxsOworICAgIHByaXZhdGUgRmlsZSAgICBzcmNGaWxlOworICAgIHByaXZhdGUgU3RyaW5nICBtYW5hZ2VyID0gImF1dG8iOworICAgIHByaXZhdGUgU3RyaW5nICBsYW5ndWFnZTsKKyAgICBwcml2YXRlIFN0cmluZyAgdGV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2V0QmVhbnMgPSB0cnVlOworICAgIHByaXZhdGUgUHJvamVjdENvbXBvbmVudCBwcm9qZWN0Q29tcG9uZW50OworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgc2NyaXB0TG9hZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIFVuaW9uIHJlc291cmNlcyA9IG5ldyBVbmlvbigpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9qZWN0IGNvbXBvbmVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBoZWxwZXIuCisgICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgcHJvamVjdCBjb21wb25lbnQgdGhhdCBvd25zIHRoaXMgaGVscGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RDb21wb25lbnQoUHJvamVjdENvbXBvbmVudCBjb21wb25lbnQpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0Q29tcG9uZW50ID0gY29tcG9uZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgc2V0IHRleHQgb24gYSBzY3JpcHQuCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBvciByZXVzZWQgc2NyaXB0IHJ1bm5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NyaXB0UnVubmVyQmFzZSBnZXRTY3JpcHRSdW5uZXIoKSB7CisgICAgICAgIFNjcmlwdFJ1bm5lckJhc2UgcnVubmVyID0gZ2V0UnVubmVyKCk7CisgICAgICAgIGlmIChzcmNGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJ1bm5lci5zZXRTcmMoc3JjRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcnVubmVyLmFkZFRleHQodGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBydW5uZXIubG9hZFJlc291cmNlcyhyZXNvdXJjZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRCZWFucykgeworICAgICAgICAgICAgcnVubmVyLmJpbmRUb0NvbXBvbmVudChwcm9qZWN0Q29tcG9uZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bm5lci5iaW5kVG9Db21wb25lbnRNaW5pbXVtKHByb2plY3RDb21wb25lbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydW5uZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gZW1wdHkgUGF0aCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkIGJ5IEFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzc1BhdGhEZWxlZ2F0ZSgpLmNyZWF0ZUNsYXNzcGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggYW4gQW50IFBhdGggb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNlYXJjaCBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBnZXRDbGFzc1BhdGhEZWxlZ2F0ZSgpLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3NwYXRoIGJ5IHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIGEgUmVmZXJlbmNlIHRvIGEgUGF0aCBpbnN0YW5jZSB0byBiZSB1c2VkIGFzIHRoZSBjbGFzc3BhdGgKKyAgICAgKiAgICAgICAgICB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgZ2V0Q2xhc3NQYXRoRGVsZWdhdGUoKS5zZXRDbGFzc3BhdGhyZWYocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgc2NyaXB0IGZyb20gYW4gZXh0ZXJuYWwgZmlsZSA7IG9wdGlvbmFsLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0IHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBmaWxlKSB7CisgICAgICAgIHRoaXMuc3JjRmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHNjcmlwdCB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgYSBjb21wb25lbnQgb2YgdGhlIHNjcmlwdCB0ZXh0IHRvIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBzY3JpcHQgbWFuYWdlciAtIGRlZmF1bHRzIHRvICJhdXRvIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSBzY3JpcHRpbmcgbWFuYWdlciAtICJic2YiIG9yICJqYXZheCIgb3IgImF1dG8iCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihTdHJpbmcgbWFuYWdlcikgeworICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIGxhbmd1YWdlIChyZXF1aXJlZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBuYW1lIGZvciB0aGUgc2NyaXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsYW5ndWFnZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIGxhbmd1YWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2V0YmVhbnMgYXR0cmlidXRlLgorICAgICAqIElmIHRoaXMgaXMgdHJ1ZSwgJmx0O3NjcmlwdCZndDsgd2lsbCBjcmVhdGUgdmFyaWFibGVzIGluIHRoZQorICAgICAqIHNjcmlwdCBpbnN0YW5jZSBmb3IgYWxsCisgICAgICogcHJvcGVydGllcywgdGFyZ2V0cyBhbmQgcmVmZXJlbmNlcyBvZiB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAqIEl0IHRoaXMgaXMgZmFsc2UsIG9ubHkgdGhlIHByb2plY3QgYW5kIHNlbGYgdmFyaWFibGVzIHdpbGwKKyAgICAgKiBiZSBzZXQuCisgICAgICogVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gc2V0QmVhbnMgdGhlIHZhbHVlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXRCZWFucyhib29sZWFuIHNldEJlYW5zKSB7CisgICAgICAgIHRoaXMuc2V0QmVhbnMgPSBzZXRCZWFuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHdoZW4gY2FsbGVkIGJ5IHNjcmlwdGRlZi4KKyAgICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIgdXNlZCBieSBzY3JpcHRkZWYuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHNjcmlwdExvYWRlciA9IGxvYWRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBDbGFzc0xvYWRlciBnZW5lcmF0ZUNsYXNzTG9hZGVyKCkgeworICAgICAgICBpZiAoc2NyaXB0TG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzY3JpcHRMb2FkZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNwRGVsZWdhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgc2NyaXB0TG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgcmV0dXJuIHNjcmlwdExvYWRlcjsKKyAgICAgICAgfQorICAgICAgICBzY3JpcHRMb2FkZXIgPSBjcERlbGVnYXRlLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIHJldHVybiBzY3JpcHRMb2FkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGFzc3BhdGhVdGlscy5EZWxlZ2F0ZSBnZXRDbGFzc1BhdGhEZWxlZ2F0ZSgpIHsKKyAgICAgICAgaWYgKGNwRGVsZWdhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgY3BEZWxlZ2F0ZSA9IENsYXNzcGF0aFV0aWxzLmdldERlbGVnYXRlKHByb2plY3RDb21wb25lbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjcERlbGVnYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHNjcmlwdCBydW5uZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTY3JpcHRSdW5uZXJCYXNlIGdldFJ1bm5lcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRSdW5uZXJDcmVhdG9yKHByb2plY3RDb21wb25lbnQuZ2V0UHJvamVjdCgpKS5jcmVhdGVSdW5uZXIoCisgICAgICAgICAgICAgICAgbWFuYWdlciwgbGFuZ3VhZ2UsIGdlbmVyYXRlQ2xhc3NMb2FkZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFueSBzb3VyY2UgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2Ugc291cmNlIG9mIHNjcmlwdAorICAgICAqIEBzaW5jZSBBbnQgMS43LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIHJlc291cmNlKSB7CisgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU291cmNlRmlsZVNjYW5uZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU291cmNlRmlsZVNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTg2OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Tb3VyY2VGaWxlU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGNvbGxlY3RzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSB2YXJpb3VzCisgKiBzY2FuRGlyIG1ldGhvZHMgdGhhdCBoYXZlIGJlZW4gc2NhdHRlcmVkIGluIHNldmVyYWwgdGFza3MgYmVmb3JlLgorICoKKyAqIDxwPlRoZSBvbmx5IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIHNvdXJjZSBmaWxlcy4gVGhlIGFycmF5IGlzIGEKKyAqIHN1YnNldCBvZiB0aGUgZmlsZXMgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIgYW5kIGhvbGRzIG9ubHkgdGhvc2UgdGhhdAorICogYXJlIG5ld2VyIHRoYW4gdGhlaXIgY29ycmVzcG9uZGluZyB0YXJnZXQgZmlsZXMuPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIFNvdXJjZUZpbGVTY2FubmVyIGltcGxlbWVudHMgUmVzb3VyY2VGYWN0b3J5IHsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIFRhc2sgdGFzazsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgcHJpdmF0ZSBGaWxlIGRlc3REaXI7ICAgICAvLyBiYXNlIGRpcmVjdG9yeSBvZiB0aGUgZmlsZXNldAorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFNvdXJjZUZpbGVTY2FubmVyLgorICAgICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHdlIHNob3VsZCBsb2cgbWVzc2FnZXMgdGhyb3VnaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU291cmNlRmlsZVNjYW5uZXIoVGFzayB0YXNrKSB7CisgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgdGhlIGdpdmVuIHNldCBvZiBmaWxlcyB0byB0aG9zZSB0aGF0IGFyZSBuZXdlciB0aGFuCisgICAgICogdGhlaXIgY29ycmVzcG9uZGluZyB0YXJnZXQgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZXMgICB0aGUgb3JpZ2luYWwgc2V0IG9mIGZpbGVzLgorICAgICAqIEBwYXJhbSBzcmNEaXIgIGFsbCBmaWxlcyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGRlc3REaXIgdGFyZ2V0IGZpbGVzIGxpdmUgaGVyZS4gaWYgbnVsbCBmaWxlIG5hbWVzCisgICAgICogICAgICAgICAgICAgICAgcmV0dXJuZWQgYnkgdGhlIG1hcHBlciBhcmUgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS4KKyAgICAgKiBAcGFyYW0gbWFwcGVyICBrbm93cyBob3cgdG8gY29uc3RydWN0IGEgdGFyZ2V0IGZpbGUgbmFtZXMgZnJvbQorICAgICAqICAgICAgICAgICAgICAgIHNvdXJjZSBmaWxlIG5hbWVzLgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZW5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSByZXN0cmljdChTdHJpbmdbXSBmaWxlcywgRmlsZSBzcmNEaXIsIEZpbGUgZGVzdERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU5hbWVNYXBwZXIgbWFwcGVyKSB7CisgICAgICAgIHJldHVybiByZXN0cmljdChmaWxlcywgc3JjRGlyLCBkZXN0RGlyLCBtYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCB0aGUgZ2l2ZW4gc2V0IG9mIGZpbGVzIHRvIHRob3NlIHRoYXQgYXJlIG5ld2VyIHRoYW4KKyAgICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIHRhcmdldCBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlcyAgIHRoZSBvcmlnaW5hbCBzZXQgb2YgZmlsZXMuCisgICAgICogQHBhcmFtIHNyY0RpciAgYWxsIGZpbGVzIGFyZSByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gZGVzdERpciB0YXJnZXQgZmlsZXMgbGl2ZSBoZXJlLiBJZiBudWxsIGZpbGUgbmFtZXMKKyAgICAgKiAgICAgICAgICAgICAgICByZXR1cm5lZCBieSB0aGUgbWFwcGVyIGFyZSBhc3N1bWVkIHRvIGJlIGFic29sdXRlLgorICAgICAqIEBwYXJhbSBtYXBwZXIgIGtub3dzIGhvdyB0byBjb25zdHJ1Y3QgYSB0YXJnZXQgZmlsZSBuYW1lcyBmcm9tCisgICAgICogICAgICAgICAgICAgICAgc291cmNlIGZpbGUgbmFtZXMuCisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byBnaXZlCisgICAgICogICAgICAgICAgICAgICAgICAgIGJlZm9yZSBkZWNpZGluZyBhIHRhcmdldCBpcyBvdXQgb2YgZGF0ZS4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZpbGVuYW1lcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS42LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gcmVzdHJpY3QoU3RyaW5nW10gZmlsZXMsIEZpbGUgc3JjRGlyLCBGaWxlIGRlc3REaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciwgbG9uZyBncmFudWxhcml0eSkgeworICAgICAgICAvLyByZWNvcmQgZGVzdGRpciBmb3IgbGF0ZXIgdXNlIGluIGdldFJlc291cmNlCisgICAgICAgIHRoaXMuZGVzdERpciA9IGRlc3REaXI7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGZpbGVzW2ldOworICAgICAgICAgICAgdi5hZGRFbGVtZW50KG5ldyBGaWxlUmVzb3VyY2Uoc3JjRGlyLCBuYW1lKSB7CisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBSZXNvdXJjZVtdIHNvdXJjZXJlc291cmNlcyA9IG5ldyBSZXNvdXJjZVt2LnNpemUoKV07CisgICAgICAgIHYuY29weUludG8oc291cmNlcmVzb3VyY2VzKTsKKworICAgICAgICAvLyBidWlsZCB0aGUgbGlzdCBvZiBzb3VyY2VzIHdoaWNoIGFyZSBvdXQgb2YgZGF0ZSB3aXRoCisgICAgICAgIC8vIHJlc3BlY3QgdG8gdGhlIHRhcmdldAorICAgICAgICBSZXNvdXJjZVtdIG91dG9mZGF0ZSA9CisgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLnNlbGVjdE91dE9mRGF0ZVNvdXJjZXModGFzaywgc291cmNlcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlciwgdGhpcywgZ3JhbnVsYXJpdHkpOworICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW291dG9mZGF0ZS5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IG91dG9mZGF0ZS5sZW5ndGg7IGNvdW50ZXIrKykgeworICAgICAgICAgICAgcmVzdWx0W2NvdW50ZXJdID0gb3V0b2ZkYXRlW2NvdW50ZXJdLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGxheWVyIG9uIHRvcCBvZiByZXN0cmljdCB0aGF0IHJldHVybnMgdGhlIHNvdXJjZQorICAgICAqIGZpbGVzIGFzIEZpbGUgb2JqZWN0cyAoY29udGFpbmluZyBhYnNvbHV0ZSBwYXRocyBpZiBzcmNEaXIgaXMKKyAgICAgKiBhYnNvbHV0ZSkuCisgICAgICogQHBhcmFtIGZpbGVzICAgdGhlIG9yaWdpbmFsIHNldCBvZiBmaWxlcy4KKyAgICAgKiBAcGFyYW0gc3JjRGlyICBhbGwgZmlsZXMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBkZXN0RGlyIHRhcmdldCBmaWxlcyBsaXZlIGhlcmUuIElmIG51bGwgZmlsZSBuYW1lcworICAgICAqICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBtYXBwZXIgYXJlIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUuCisgICAgICogQHBhcmFtIG1hcHBlciAga25vd3MgaG93IHRvIGNvbnN0cnVjdCBhIHRhcmdldCBmaWxlIG5hbWVzIGZyb20KKyAgICAgKiAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZSBuYW1lcy4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlW10gcmVzdHJpY3RBc0ZpbGVzKFN0cmluZ1tdIGZpbGVzLCBGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlcikgeworICAgICAgICByZXR1cm4gcmVzdHJpY3RBc0ZpbGVzKGZpbGVzLCBzcmNEaXIsIGRlc3REaXIsIG1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBsYXllciBvbiB0b3Agb2YgcmVzdHJpY3QgdGhhdCByZXR1cm5zIHRoZSBzb3VyY2UKKyAgICAgKiBmaWxlcyBhcyBGaWxlIG9iamVjdHMgKGNvbnRhaW5pbmcgYWJzb2x1dGUgcGF0aHMgaWYgc3JjRGlyIGlzCisgICAgICogYWJzb2x1dGUpLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVzICAgdGhlIG9yaWdpbmFsIHNldCBvZiBmaWxlcy4KKyAgICAgKiBAcGFyYW0gc3JjRGlyICBhbGwgZmlsZXMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBkZXN0RGlyIHRhcmdldCBmaWxlcyBsaXZlIGhlcmUuIElmIG51bGwgZmlsZSBuYW1lcworICAgICAqICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBtYXBwZXIgYXJlIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUuCisgICAgICogQHBhcmFtIG1hcHBlciAga25vd3MgaG93IHRvIGNvbnN0cnVjdCBhIHRhcmdldCBmaWxlIG5hbWVzIGZyb20KKyAgICAgKiAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZSBuYW1lcy4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgbGVld2F5IHRvIGdpdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGRlY2lkaW5nIGEgdGFyZ2V0IGlzIG91dCBvZiBkYXRlLgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMuCisgICAgICogQHNpbmNlIEFudCAxLjYuMgorICAgICAqLworICAgIHB1YmxpYyBGaWxlW10gcmVzdHJpY3RBc0ZpbGVzKFN0cmluZ1tdIGZpbGVzLCBGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciwgbG9uZyBncmFudWxhcml0eSkgeworICAgICAgICBTdHJpbmdbXSByZXMgPSByZXN0cmljdChmaWxlcywgc3JjRGlyLCBkZXN0RGlyLCBtYXBwZXIsIGdyYW51bGFyaXR5KTsKKyAgICAgICAgRmlsZVtdIHJlc3VsdCA9IG5ldyBGaWxlW3Jlcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV3IEZpbGUoc3JjRGlyLCByZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyByZXNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgYSBmaWxlIGF0IGRlc3RpbmF0aW9uLgorICAgICAqIEBwYXJhbSBuYW1lIHJlbGF0aXZlIHBhdGggb2YgZmlsZSBhdCBkZXN0aW5hdGlvbi4KKyAgICAgKiBAcmV0dXJuIGRhdGEgY29uY2VybmluZyBhIGZpbGUgd2hvc2UgcmVsYXRpdmUgcGF0aCB0byBkZXN0RGlyIGlzIG5hbWUuCisgICAgICoKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZVJlc291cmNlKGRlc3REaXIsIG5hbWUpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1N0cmluZ1Rva2VuaXplci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdUb2tlbml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjkxZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdUb2tlbml6ZXIuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworCisvKioKKyAqIENsYXNzIHRvIHRva2VuaXplIHRoZSBpbnB1dCBhcyBhcmVhcyBzZXBhcmF0ZWQKKyAqIGJ5IHdoaXRlIHNwYWNlLCBvciBieSBhIHNwZWNpZmllZCBsaXN0IG9mCisgKiBkZWxpbSBjaGFyYWN0ZXJzLiBCZWhhdmVzIGxpa2UgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplci4KKyAqIElmIHRoZSBzdHJlYW0gc3RhcnRzIHdpdGggZGVsaW0gY2hhcmFjdGVycywgdGhlIGZpcnN0CisgKiB0b2tlbiB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZyAodW5sZXNzIHRoZSB0cmVhdCBkZWxpbXMKKyAqIGFzIHRva2VucyBmbGFnIGlzIHNldCkuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgU3RyaW5nVG9rZW5pemVyIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCBpbXBsZW1lbnRzIFRva2VuaXplciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9BX0NIQVIgPSAtMjsKKyAgICBwcml2YXRlIFN0cmluZyBpbnRyYVN0cmluZyA9ICIiOworICAgIHByaXZhdGUgaW50ICAgIHB1c2hlZCA9IE5PVF9BX0NIQVI7CisgICAgcHJpdmF0ZSBjaGFyW10gZGVsaW1zID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsaW1zQXJlVG9rZW5zID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzRGVsaW1zID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVEZWxpbXMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIGF0dHJpYnV0ZSBkZWxpbXMgLSB0aGUgZGVsaW1pdGVyIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gZGVsaW1zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRlbGltaXRlciBjaGFyYWN0ZXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVsaW1zKFN0cmluZyBkZWxpbXMpIHsKKyAgICAgICAgdGhpcy5kZWxpbXMgPSBTdHJpbmdVdGlscy5yZXNvbHZlQmFja1NsYXNoKGRlbGltcykudG9DaGFyQXJyYXkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhdHRyaWJ1dGUgZGVsaW1zYXJldG9rZW5zIC0gdHJlYXQgZGVsaW1pdGVycyBhcworICAgICAqIHNlcGFyYXRlIHRva2Vucy4KKyAgICAgKiBAcGFyYW0gZGVsaW1zQXJlVG9rZW5zIHRydWUgaWYgZGVsaW1pdGVycyBhcmUgdG8gYmUgc2VwYXJhdGUKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldERlbGltc0FyZVRva2Vucyhib29sZWFuIGRlbGltc0FyZVRva2VucykgeworICAgICAgICB0aGlzLmRlbGltc0FyZVRva2VucyA9IGRlbGltc0FyZVRva2VuczsKKyAgICB9CisgICAgLyoqCisgICAgICogYXR0cmlidXRlIHN1cHByZXNzZGVsaW1zIC0gc3VwcHJlc3MgZGVsaW1pdGVycy4KKyAgICAgKiBkZWZhdWx0IC0gZmFsc2UKKyAgICAgKiBAcGFyYW0gc3VwcHJlc3NEZWxpbXMgaWYgdHJ1ZSBkbyBub3QgcmVwb3J0IGRlbGltaXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc0RlbGltcyhib29sZWFuIHN1cHByZXNzRGVsaW1zKSB7CisgICAgICAgIHRoaXMuc3VwcHJlc3NEZWxpbXMgPSBzdXBwcmVzc0RlbGltczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhdHRyaWJ1dGUgaW5jbHVkZWRlbGltcyAtIHRyZWF0IGRlbGltaXRlcnMgYXMgcGFydAorICAgICAqIG9mIHRoZSB0b2tlbi4KKyAgICAgKiBkZWZhdWx0IC0gZmFsc2UKKyAgICAgKiBAcGFyYW0gaW5jbHVkZURlbGltcyBpZiB0cnVlIGFkZCBkZWxpbWl0ZXJzIHRvIHRoZSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVEZWxpbXMoYm9vbGVhbiBpbmNsdWRlRGVsaW1zKSB7CisgICAgICAgIHRoaXMuaW5jbHVkZURlbGltcyA9IGluY2x1ZGVEZWxpbXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmluZCBhbmQgcmV0dXJuIHRoZSBuZXh0IHRva2VuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gdGhlIGlucHV0IHN0cmVhbQorICAgICAqIEByZXR1cm4gdGhlIHRva2VuCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgcmVhZGluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oUmVhZGVyIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgY2ggPSAtMTsKKyAgICAgICAgaWYgKHB1c2hlZCAhPSBOT1RfQV9DSEFSKSB7CisgICAgICAgICAgICBjaCA9IHB1c2hlZDsKKyAgICAgICAgICAgIHB1c2hlZCA9IE5PVF9BX0NIQVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gaW5Ub2tlbiA9IHRydWU7CisgICAgICAgIGludHJhU3RyaW5nID0gIiI7CisgICAgICAgIFN0cmluZ0J1ZmZlciB3b3JkID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWZmZXIgcGFkZGluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKGNoICE9IC0xKSB7CisgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgY2g7CisgICAgICAgICAgICBib29sZWFuIGlzRGVsaW0gPSBpc0RlbGltKGMpOworICAgICAgICAgICAgaWYgKGluVG9rZW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNEZWxpbSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsaW1zQXJlVG9rZW5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod29yZC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hlZCA9IGNoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZy5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgIGluVG9rZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3b3JkLmFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc0RlbGltKSB7CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hlZCA9IGNoOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaCA9IGluLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICBpbnRyYVN0cmluZyA9IHBhZGRpbmcudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKGluY2x1ZGVEZWxpbXMpIHsKKyAgICAgICAgICAgIHdvcmQuYXBwZW5kKGludHJhU3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd29yZC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGludHJhdG9rZW4gc3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQb3N0VG9rZW4oKSB7CisgICAgICAgIHJldHVybiBzdXBwcmVzc0RlbGltcyB8fCBpbmNsdWRlRGVsaW1zID8gIiIgOiBpbnRyYVN0cmluZzsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWxpbShjaGFyIGNoKSB7CisgICAgICAgIGlmIChkZWxpbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsaW1zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoZGVsaW1zW2ldID09IGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3RyaW5nVXRpbHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3RyaW5nVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQ4NGIyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQSBzZXQgb2YgaGVscGVyIG1ldGhvZHMgcmVsYXRlZCB0byBzdHJpbmcgbWFuaXB1bGF0aW9uLgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1V0aWxzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEtJTE9CWVRFID0gMTAyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1FR0FCWVRFID0gS0lMT0JZVEUgKiAxMDI0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgR0lHQUJZVEUgPSBNRUdBQllURSAqIDEwMjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVJBQllURSA9IEdJR0FCWVRFICogMTAyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBFVEFCWVRFID0gVEVSQUJZVEUgKiAxMDI0OworCisgICAgLyoqCisgICAgICogY29uc3RydWN0b3IgdG8gc3RvcCBhbnlvbmUgaW5zdGFudGlhdGluZyB0aGUgY2xhc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1V0aWxzKCkgeworICAgIH0KKworICAgIC8qKiB0aGUgbGluZSBzZXBhcmF0b3IgZm9yIHRoaXMgT1MgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIC8qKgorICAgICAqIFNwbGl0cyB1cCBhIHN0cmluZyBpbnRvIGEgbGlzdCBvZiBsaW5lcy4gSXQgaXMgZXF1aXZhbGVudAorICAgICAqIHRvIDx0dD5zcGxpdChkYXRhLCAnXG4nKTwvdHQ+LgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBzdHJpbmcgdG8gc3BsaXQgdXAgaW50byBsaW5lcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGxpbmVzIGF2YWlsYWJsZSBpbiB0aGUgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yIGxpbmVTcGxpdChTdHJpbmcgZGF0YSkgeworICAgICAgICByZXR1cm4gc3BsaXQoZGF0YSwgJ1xuJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BsaXRzIHVwIGEgc3RyaW5nIHdoZXJlIGVsZW1lbnRzIGFyZSBzZXBhcmF0ZWQgYnkgYSBzcGVjaWZpYworICAgICAqIGNoYXJhY3RlciBhbmQgcmV0dXJuIGFsbCBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gZGF0YSB0aGUgc3RyaW5nIHRvIHNwbGl0IHVwLgorICAgICAqIEBwYXJhbSBjaCB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGVsZW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yIHNwbGl0KFN0cmluZyBkYXRhLCBpbnQgY2gpIHsKKyAgICAgICAgVmVjdG9yIGVsZW1zID0gbmV3IFZlY3RvcigpOworICAgICAgICBpbnQgcG9zID0gLTE7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKChwb3MgPSBkYXRhLmluZGV4T2YoY2gsIGkpKSAhPSAtMSkgeworICAgICAgICAgICAgU3RyaW5nIGVsZW0gPSBkYXRhLnN1YnN0cmluZyhpLCBwb3MpOworICAgICAgICAgICAgZWxlbXMuYWRkRWxlbWVudChlbGVtKTsKKyAgICAgICAgICAgIGkgPSBwb3MgKyAxOworICAgICAgICB9CisgICAgICAgIGVsZW1zLmFkZEVsZW1lbnQoZGF0YS5zdWJzdHJpbmcoaSkpOworICAgICAgICByZXR1cm4gZWxlbXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSBvY2N1cnJlbmNlcyBpbnRvIGEgc3RyaW5nLgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBzdHJpbmcgdG8gcmVwbGFjZSBvY2N1cnJlbmNlcyBpbnRvCisgICAgICogQHBhcmFtIGZyb20gdGhlIG9jY3VycmVuY2UgdG8gcmVwbGFjZS4KKyAgICAgKiBAcGFyYW0gdG8gdGhlIG9jY3VycmVuY2UgdG8gYmUgdXNlZCBhcyBhIHJlcGxhY2VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBzdHJpbmcgd2l0aCByZXBsYWNlZCBvY2N1cnJlbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyBkYXRhLCBTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGRhdGEubGVuZ3RoKCkpOworICAgICAgICBpbnQgcG9zID0gLTE7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKChwb3MgPSBkYXRhLmluZGV4T2YoZnJvbSwgaSkpICE9IC0xKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGRhdGEuc3Vic3RyaW5nKGksIHBvcykpLmFwcGVuZCh0byk7CisgICAgICAgICAgICBpID0gcG9zICsgZnJvbS5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKGRhdGEuc3Vic3RyaW5nKGkpKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbnQgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBmdWxsIHN0YWNrdHJhY2UgZnJvbSBhIGdpdmVuIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gdCB0aGUgZXhjZXB0aW9uIHRvIGdldCB0aGUgc3RhY2t0cmFjZSBmcm9tLgorICAgICAqIEByZXR1cm4gdGhlIHN0YWNrdHJhY2UgZnJvbSB0aGUgZ2l2ZW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0YWNrVHJhY2UoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdywgdHJ1ZSk7CisgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgcHcuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgYSBzdHJpbmcgYnVmZmVyIGVuZHMgdXAgd2l0aCBhIGdpdmVuIHN0cmluZy4gSXQgbWF5IHNvdW5kCisgICAgICogdHJpdmlhbCB3aXRoIHRoZSBleGlzdGluZworICAgICAqIEpESyBBUEkgYnV0IHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9uIGFtb25nIEpES3MgY2FuIG1ha2UgdGhvc2UKKyAgICAgKiBtZXRob2RzIGV4dHJlbWVseSByZXNvdXJjZSBpbnRlbnNpdmUKKyAgICAgKiBhbmQgcGVyZm9ybSBwb29ybHkgZHVlIHRvIG1hc3NpdmUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGNvcHlpbmcuIFNlZQorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byBwZXJmb3JtIHRoZSBjaGVjayBvbgorICAgICAqIEBwYXJhbSBzdWZmaXggdGhlIHN1ZmZpeAorICAgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgICogICAgICAgICAgYXJndW1lbnQgaXMgYSBzdWZmaXggb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSByZXByZXNlbnRlZCBieQorICAgICAqICAgICAgICAgIHRoZSBTdHJpbmdCdWZmZXIgb2JqZWN0OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiBOb3RlIHRoYXQgdGhlCisgICAgICogICAgICAgICAgcmVzdWx0IHdpbGwgYmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFyZ3VtZW50IGlzIHRoZQorICAgICAqICAgICAgICAgIGVtcHR5IHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHN1ZmZpeCkgeworICAgICAgICBpZiAoc3VmZml4Lmxlbmd0aCgpID4gYnVmZmVyLmxlbmd0aCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhpcyBsb29wIGlzIGRvbmUgb24gcHVycG9zZSB0byBhdm9pZCBtZW1vcnkgYWxsb2NhdGlvbiBwZXJmb3JtYW5jZQorICAgICAgICAvLyBwcm9ibGVtcyBvbiB2YXJpb3VzIEpES3MKKyAgICAgICAgLy8gU3RyaW5nQnVmZmVyLmxhc3RJbmRleE9mKCkgd2FzIGludHJvZHVjZWQgaW4gamRrIDEuNCBhbmQKKyAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gaXMgb2sgdGhvdWdoIGRvZXMgYWxsb2NhdGlvbi9jb3B5aW5nCisgICAgICAgIC8vIFN0cmluZ0J1ZmZlci50b1N0cmluZygpLmVuZHNXaXRoKCkgZG9lcyBtYXNzaXZlIG1lbW9yeQorICAgICAgICAvLyBhbGxvY2F0aW9uL2NvcHlpbmcgb24gSkRLIDEuNQorICAgICAgICAvLyBTZWUgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNzE2OQorICAgICAgICBpbnQgZW5kSW5kZXggPSBzdWZmaXgubGVuZ3RoKCkgLSAxOworICAgICAgICBpbnQgYnVmZmVySW5kZXggPSBidWZmZXIubGVuZ3RoKCkgLSAxOworICAgICAgICB3aGlsZSAoZW5kSW5kZXggPj0gMCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci5jaGFyQXQoYnVmZmVySW5kZXgpICE9IHN1ZmZpeC5jaGFyQXQoZW5kSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVySW5kZXgtLTsKKyAgICAgICAgICAgIGVuZEluZGV4LS07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogeG1sIGRvZXMgbm90IGRvICJjIiBsaWtlIGludGVycHJldGF0aW9uIG9mIHN0cmluZ3MuCisgICAgICogaS5lLiBcblxyXHQgZXRjLgorICAgICAqIHRoaXMgbWV0aG9kIHByb2Nlc3NlcyBcbiwgXHIsIFx0LCBcZiwgXFwKKyAgICAgKiBhbHNvIHN1YnMgXHMgLT4gIiBcblxyXHRcZiIKKyAgICAgKiBhIHRyYWlsaW5nICdcJyB3aWxsIGJlIGlnbm9yZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCByYXcgc3RyaW5nIHdpdGggcG9zc2libGUgZW1iZWRkZWQgJ1wncworICAgICAqIEByZXR1cm4gY29udmVydGVkIHN0cmluZworICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZUJhY2tTbGFzaChTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJvb2xlYW4gYmFja1NsYXNoU2VlbiA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IGlucHV0LmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICghYmFja1NsYXNoU2VlbikgeworICAgICAgICAgICAgICAgIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja1NsYXNoU2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoKGNoYXIpICdcXCcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoKGNoYXIpICdcbicpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoKGNoYXIpICdccicpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoKGNoYXIpICdcdCcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoKGNoYXIpICdcZicpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoIiBcdFxuXHJcZiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmFja1NsYXNoU2VlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZXMgYSBodW1hbiByZWFkYWJsZSBzaXplIHJlcHJlc2VudGF0aW9uIGVnIDEwSworICAgICAqIGEgbG9uZyB2YWx1ZS4gRG9lc24ndCBzdXBwb3J0IDEuMUsgb3Igb3RoZXIgcmF0aW9uYWwgdmFsdWVzLgorICAgICAqIEBwYXJhbSBodW1hblNpemUgdGhlIGFtb3VudCBhcyBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZy4KKyAgICAgKiBAcmV0dXJuIGEgbG9uZyB2YWx1ZSByZXByZXNlbnRhdGlvbgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBwYXJzZUh1bWFuU2l6ZXMoU3RyaW5nIGh1bWFuU2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgZmFjdG9yID0gMUw7CisgICAgICAgIGNoYXIgcyA9IGh1bWFuU2l6ZS5jaGFyQXQoMCk7CisgICAgICAgIHN3aXRjaCAocykgeworICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICAgICAgaHVtYW5TaXplID0gaHVtYW5TaXplLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgIGZhY3RvciA9IC0xTDsKKyAgICAgICAgICAgICAgICBodW1hblNpemUgPSBodW1hblNpemUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvL2xhc3QgY2hhcmFjdGVyIGlzbid0IGEgZGlnaXQKKyAgICAgICAgY2hhciBjID0gaHVtYW5TaXplLmNoYXJBdChodW1hblNpemUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdChjKSkgeworICAgICAgICAgICAgaW50IHRyaW0gPSAxOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnSyc6CisgICAgICAgICAgICAgICAgICAgIGZhY3RvciAqPSBLSUxPQllURTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICAgICAgICAgIGZhY3RvciAqPSBNRUdBQllURTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgICAgICAgICAgIGZhY3RvciAqPSBHSUdBQllURTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICAgICAgICAgIGZhY3RvciAqPSBURVJBQllURTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgIGZhY3RvciAqPSBQRVRBQllURTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdHJpbSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodW1hblNpemUgPSBodW1hblNpemUuc3Vic3RyaW5nKDAsIGh1bWFuU2l6ZS5sZW5ndGgoKSAtIHRyaW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWN0b3IgKiBMb25nLnBhcnNlTG9uZyhodW1hblNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHN1ZmZpeCBmcm9tIGEgZ2l2ZW4gc3RyaW5nLCBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zCisgICAgICogdGhhdCBzdWZmaXguCisgICAgICogQHBhcmFtIHN0cmluZyBTdHJpbmcgZm9yIGNoZWNrCisgICAgICogQHBhcmFtIHN1ZmZpeCBTdWZmaXggdG8gcmVtb3ZlCisgICAgICogQHJldHVybiB0aGUgPGk+c3RyaW5nPC9pPiB3aXRoIHRoZSA8aT5zdWZmaXg8L2k+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlU3VmZml4KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdWZmaXgpIHsKKyAgICAgICAgaWYgKHN0cmluZy5lbmRzV2l0aChzdWZmaXgpKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBzdHJpbmcubGVuZ3RoKCkgLSBzdWZmaXgubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHByZWZpeCBmcm9tIGEgZ2l2ZW4gc3RyaW5nLCBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zCisgICAgICogdGhhdCBwcmVmaXguCisgICAgICogQHBhcmFtIHN0cmluZyBTdHJpbmcgZm9yIGNoZWNrCisgICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggdG8gcmVtb3ZlCisgICAgICogQHJldHVybiB0aGUgPGk+c3RyaW5nPC9pPiB3aXRoIHRoZSA8aT5wcmVmaXg8L2k+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlUHJlZml4KFN0cmluZyBzdHJpbmcsIFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgaWYgKHN0cmluZy5zdGFydHNXaXRoKHByZWZpeCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9UYXNrTG9nZ2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Rhc2tMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2U1YzUxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9UYXNrTG9nZ2VyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisvKioKKyAqIEEgZmFjYWRlIHRoYXQgbWFrZXMgbG9nZ2luZyBuaWNlciB0byB1c2UuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUYXNrTG9nZ2VyIHsKKyAgICAvKioKKyAgICAgKiBUYXNrIHRvIHVzZSB0byBkbyBsb2dnaW5nLgorICAgICAqLworICAgIHByaXZhdGUgVGFzayB0YXNrOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBUYXNrTG9nZ2VyCisgICAgICogQHBhcmFtIHRhc2sgdGhlIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFza0xvZ2dlcihmaW5hbCBUYXNrIHRhc2spIHsKKyAgICAgICAgdGhpcy50YXNrID0gdGFzazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgYSBtZXNzYWdlIHdpdGggPGNvZGU+TVNHX0lORk88L2NvZGU+IHByaW9yaXR5CisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gbG9nCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5mbyhmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0YXNrLmxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgYSBtZXNzYWdlIHdpdGggPGNvZGU+TVNHX0VSUjwvY29kZT4gcHJpb3JpdHkKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBsb2cKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0YXNrLmxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2Ugd2l0aCA8Y29kZT5NU0dfV0FSTjwvY29kZT4gcHJpb3JpdHkKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBsb2cKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHRhc2subG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1dBUk4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2Ugd2l0aCA8Y29kZT5NU0dfVkVSQk9TRTwvY29kZT4gcHJpb3JpdHkKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBsb2cKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJib3NlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHRhc2subG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2Ugd2l0aCA8Y29kZT5NU0dfREVCVUc8L2NvZGU+IHByaW9yaXR5CisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gbG9nCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVidWcoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGFzay5sb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVGVlT3V0cHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1RlZU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYWYxMWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1RlZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIHNpbXBsZSBULXBpZWNlIHRvIHJlcGxpY2F0ZSBhbiBvdXRwdXQgc3RyZWFtIGludG8gdHdvIHNlcGFyYXRlIHN0cmVhbXMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUZWVPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIGxlZnQ7CisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gcmlnaHQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGVlT3V0cHV0U3RyZWFtLgorICAgICAqIEBwYXJhbSBsZWZ0IG9uZSBvZiB0aGUgb3V0cHV0IHN0cmVhbXMuCisgICAgICogQHBhcmFtIHJpZ2h0IHRoZSBvdGhlciBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBUZWVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIGxlZnQsIE91dHB1dFN0cmVhbSByaWdodCkgeworICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0OworICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYm90aCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxlZnQuY2xvc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJpZ2h0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBib3RoIG91dHB1dCBzdHJlYW1zLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxlZnQuZmx1c2goKTsKKyAgICAgICAgcmlnaHQuZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXkgdG8gYm90aCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgKiBAcGFyYW0gYiBhbiBhcnJheSBvZiBieXRlcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsZWZ0LndyaXRlKGIpOworICAgICAgICByaWdodC53cml0ZShiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXkgdG8gYm90aCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgKiBAcGFyYW0gYiAgICAgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIG9mZiAgIHRoZSBzdGFydCBvZmZzZXQgaW4gdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGxlbiAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbGVmdC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgIHJpZ2h0LndyaXRlKGIsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGJ5dGUgdG8gYm90aCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZSB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsZWZ0LndyaXRlKGIpOworICAgICAgICByaWdodC53cml0ZShiKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVGltZW91dE9ic2VydmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1RpbWVvdXRPYnNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMmUwYzcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1RpbWVvdXRPYnNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IHdhbnQgdG8gYmUgbm90aWZpZWQgYnkgV2F0Y2hkb2cuCisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuV2F0Y2hkb2cKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGltZW91dE9ic2VydmVyIHsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSB3YXRjaGRvdyB0aW1lcyBvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdyB0aGUgd2F0Y2hkb2cgdGhhdCB0aW1lZCBvdXQuCisgICAgICovCisgICAgdm9pZCB0aW1lb3V0T2NjdXJlZChXYXRjaGRvZyB3KTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVG9rZW5pemVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Rva2VuaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOTQwN2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Rva2VuaXplci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogaW5wdXQgc3RyZWFtIHRva2VuaXplcnMgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlCisgKgorICogQHZlcnNpb24gQW50IDEuNgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRva2VuaXplciB7CisgICAgLyoqCisgICAgICogZ2V0IHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogQHJldHVybiB0aGUgbmV4dCB0b2tlbiwgb3IgbnVsbCBmb3IgdGhlIGVuZAorICAgICAqICAgICAgICAgb2YgdGhlIHN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgU3RyaW5nIGdldFRva2VuKFJlYWRlciBpbikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogcmV0dXJuIHRoZSBzdHJpbmcgYmV0d2VlbiB0b2tlbnMsIGFmdGVyIHRoZQorICAgICAqIHByZXZpb3VzIHRva2VuLgorICAgICAqIEByZXR1cm4gdGhlIGludHJhLXRva2VuIHN0cmluZworICAgICAqLworICAgIFN0cmluZyBnZXRQb3N0VG9rZW4oKTsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVVVFbmNvZGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VVRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NmI0MjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VVRW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworLyoqCisgKiBVVUVuY29kaW5nIG9mIGFuIGlucHV0IHN0cmVhbSBwbGFjZWQgaW50byBhbiBvdXRwdXRzdHJlYW0uCisgKiBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIGJlIGEgZHJvcCBpbiByZXBsYWNlbWVudCBmb3IKKyAqIHN1bi5taXNjLlVVRW5jb2Rlciwgd2hpY2ggd2FzIHByZXZpb3VzbHkgdXNlZCBieSBBbnQuCisgKiBUaGUgdXVlbmNvZGUgYWxnb3JpdGhtIGNvZGUgaGFzIGJlZW4gY29waWVkIGZyb20gdGhlCisgKiBnZXJvbmltbyBwcm9qZWN0LgorICoqLworCitwdWJsaWMgY2xhc3MgVVVFbmNvZGVyIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01PREUgPSA2NDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9DSEFSU19QRVJfTElORSA9IDQ1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlBVVF9CVUZGRVJfU0laRSA9IE1BWF9DSEFSU19QRVJfTElORSAqIDEwMDsKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHNwZWNpZmluZyBhIG5hbWUgZm9yIHRoZSBlbmNvZGVkIGJ1ZmZlciwgYmVnaW4KKyAgICAgKiBsaW5lIHdpbGwgYmU6CisgICAgICogPHByZT4KKyAgICAgKiAgIGJlZ2luIDY0NCBbTkFNRV0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZW5jb2RlZCBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIFVVRW5jb2RlcihTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVVRW5jb2RlIGJ5dGVzIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgYW5kIHdyaXRlIHRoZW0gYXMgdGV4dCBjaGFyYWN0ZXJzCisgICAgICogdG8gdGhlIG91dHB1dCBzdHJlYW0uIFRoaXMgbWV0aG9kIHdpbGwgcnVuIHVudGlsIGl0IGV4aGF1c3RzIHRoZQorICAgICAqIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gaXMgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5jb2RlKElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgZW5jb2RlQmVnaW4oKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0lOUFVUX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgaW50IGNvdW50OworICAgICAgICB3aGlsZSAoKGNvdW50ID0gaXMucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKSAhPSAtMSkgeworICAgICAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IG51bSA9IGNvdW50ID4gTUFYX0NIQVJTX1BFUl9MSU5FCisgICAgICAgICAgICAgICAgICAgID8gTUFYX0NIQVJTX1BFUl9MSU5FCisgICAgICAgICAgICAgICAgICAgIDogY291bnQ7CisgICAgICAgICAgICAgICAgZW5jb2RlTGluZShidWZmZXIsIHBvcywgbnVtLCBvdXQpOworICAgICAgICAgICAgICAgIHBvcyArPSBudW07CisgICAgICAgICAgICAgICAgY291bnQgLT0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICBlbmNvZGVFbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgYSBzdHJpbmcgdG8gdGhlIG91dHB1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlU3RyaW5nKFN0cmluZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQcmludFN0cmVhbSB3cml0ZXIgPSBuZXcgUHJpbnRTdHJlYW0ob3V0KTsKKyAgICAgICAgd3JpdGVyLnByaW50KG4pOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlQmVnaW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBlbmNvZGVTdHJpbmcoImJlZ2luICIgKyBERUZBVUxUX01PREUgKyAiICIgKyBuYW1lICsgIlxuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuY29kZUVuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuY29kZVN0cmluZygiIFxuZW5kXG4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgYSBzaW5nbGUgbGluZSBvZiBkYXRhIChsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNDUgY2hhcmFjdGVycykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSAgIFRoZSBhcnJheSBvZiBieXRlIGRhdGEuCisgICAgICogQHBhcmFtIG9mZiAgICBUaGUgc3RhcnRpbmcgb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgZGF0YSB0byBlbmNvZGUuCisgICAgICogQHBhcmFtIG91dCAgICBUaGUgb3V0cHV0IHN0cmVhbSB0aGUgZW5jb2RlZCBkYXRhIGlzIHdyaXR0ZW4gdG8uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuY29kZUxpbmUoCisgICAgICAgIGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyB3cml0ZSBvdXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGVuY29kZWQgaW4gdGhpcyBsaW5lLgorICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICBvdXQud3JpdGUoKGJ5dGUpICgobGVuZ3RoICYgMHgzRikgKyAnICcpKTsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorICAgICAgICBieXRlIGE7CisgICAgICAgIGJ5dGUgYjsKKyAgICAgICAgYnl0ZSBjOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOykgeworICAgICAgICAgICAgLy8gc2V0IHRoZSBwYWRkaW5nIGRlZmF1bHRzCisgICAgICAgICAgICBiID0gMTsKKyAgICAgICAgICAgIGMgPSAxOworICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IDMgYnl0ZXMgKGlmIHdlIGhhdmUgdGhlbSkKKyAgICAgICAgICAgIGEgPSBkYXRhW29mZnNldCArIGkrK107CisgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGIgPSBkYXRhW29mZnNldCArIGkrK107CisgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IGRhdGFbb2Zmc2V0ICsgaSsrXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgICAgICBieXRlIGQxID0gKGJ5dGUpICgoKGEgPj4+IDIpICYgMHgzRikgKyAnICcpOworICAgICAgICAgICAgYnl0ZSBkMiA9IChieXRlKSAoKCgoYSA8PCA0KSAmIDB4MzApIHwgKChiID4+PiA0KSAmIDB4MEYpKSArICcgJyk7CisgICAgICAgICAgICBieXRlIGQzID0gKGJ5dGUpICgoKChiIDw8IDIpICYgMHgzQykgfCAoKGMgPj4+IDYpICYgMHgzKSkgKyAnICcpOworICAgICAgICAgICAgYnl0ZSBkNCA9IChieXRlKSAoKGMgJiAweDNGKSArICcgJyk7CisgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisKKyAgICAgICAgICAgIG91dC53cml0ZShkMSk7CisgICAgICAgICAgICBvdXQud3JpdGUoZDIpOworICAgICAgICAgICAgb3V0LndyaXRlKGQzKTsKKyAgICAgICAgICAgIG91dC53cml0ZShkNCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0ZXJtaW5hdGUgd2l0aCBhIGxpbmVmZWVkIGFsb25lCisgICAgICAgIG91dC53cml0ZSgnXG4nKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VuUGFja2FnZU5hbWVNYXBwZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5QYWNrYWdlTmFtZU1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzcyNzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VuUGFja2FnZU5hbWVNYXBwZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogTWFwcyBkb3R0ZWQgcGFja2FnZSBuYW1lIG1hdGNoZXMgdG8gYSBkaXJlY3RvcnkgbmFtZS4KKyAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgdGhlIHBhY2thZ2UgbWFwcGVyLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIG1hdGNoaW5nIFhNTCBmb3JtYXR0ZXIgcmVzdWx0cyBhZ2FpbnN0IHRoZWlyIEpVbml0IHRlc3QKKyAqIGNhc2VzLgorICogPHByZT4KKyAqICZsdDttYXBwZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlVuUGFja2FnZU5hbWVNYXBwZXIiCisgKiAgICAgICAgIGZyb209IiR7dGVzdC5kYXRhLmRpcn0vVEVTVC0qVGVzdC54bWwiIHRvPSIqVGVzdC5qYXZhIiZndDsKKyAqIDwvcHJlPgorICoKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBVblBhY2thZ2VOYW1lTWFwcGVyIGV4dGVuZHMgR2xvYlBhdHRlcm5NYXBwZXIgeworICAgIC8qKgorICAgICAqICBSZXR1cm5zIHRoZSBwYXJ0IG9mIHRoZSBnaXZlbiBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSAqIGluIHRoZQorICAgICAqICAmcXVvdDtmcm9tJnF1b3Q7IHBhdHRlcm4gcmVwbGFjaW5nIGRvdHMgd2l0aCBmaWxlIHNlcGFyYXRvcnMKKyAgICAgKgorICAgICAqQHBhcmFtICBuYW1lICBTb3VyY2UgZmlsZW5hbWUKKyAgICAgKkByZXR1cm4gICAgICAgUmVwbGFjZWQgdmFyaWFibGUgcGFydAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFZhcmlhYmxlUGFydChTdHJpbmcgbmFtZSkgeworICAgICAgICBTdHJpbmcgdmFyID0gbmFtZS5zdWJzdHJpbmcocHJlZml4TGVuZ3RoLAorICAgICAgICAgICAgICAgIG5hbWUubGVuZ3RoKCkgLSBwb3N0Zml4TGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHZhci5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvV2F0Y2hkb2cuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvV2F0Y2hkb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTNiYzdiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9XYXRjaGRvZy5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEdlbmVyYWxpemF0aW9uIG9mIDxjb2RlPkV4ZWN1dGVXYXRjaGRvZzwvY29kZT4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVdhdGNoZG9nCisgKgorICovCitwdWJsaWMgY2xhc3MgV2F0Y2hkb2cgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICBwcml2YXRlIFZlY3RvciBvYnNlcnZlcnMgPSBuZXcgVmVjdG9yKDEpOworICAgIHByaXZhdGUgbG9uZyB0aW1lb3V0ID0gLTE7CisgICAgLyoqCisgICAgICogbWFya2VkIGFzIHZvbGF0aWxlIHRvIHN0b3AgdGhlIGNvbXBpbGVyIGNhY2hpbmcgdmFsdWVzIG9yIChpbiBqYXZhMS41KywKKyAgICAgKiByZW9yZGVyaW5nIGFjY2VzcykKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZCA9IGZhbHNlOworICAgIC8qKgorICAgICAqIEVycm9yIHN0cmluZy4KKyAgICAgKiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0lOVkFMSURfVElNRU9VVCA9ICJ0aW1lb3V0IGxlc3MgdGhhbiAxLiI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgV2F0Y2hkb2cuCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdG8gdXNlIGluIG1pbGxpc2Vjb25kcyAobXVzdCBiZSA+PSAxKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2F0Y2hkb2cobG9uZyB0aW1lb3V0KSB7CisgICAgICAgIGlmICh0aW1lb3V0IDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihFUlJPUl9JTlZBTElEX1RJTUVPVVQpOworICAgICAgICB9CisgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgdGltZW91dCBvYnNlcnZlci4KKyAgICAgKiBAcGFyYW0gdG8gdGhlIHRpbWVvdXQgb2JzZXJ2ZXIgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRpbWVvdXRPYnNlcnZlcihUaW1lb3V0T2JzZXJ2ZXIgdG8pIHsKKyAgICAgICAgLy9ubyBuZWVkIHRvIHN5bmNocm9uaXplLCBhcyBWZWN0b3IgaXMgYWx3YXlzIHN5bmNocm9uaXplZAorICAgICAgICBvYnNlcnZlcnMuYWRkRWxlbWVudCh0byk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgdGltZW91dCBvYnNlcnZlci4KKyAgICAgKiBAcGFyYW0gdG8gdGhlIHRpbWVvdXQgb2JzZXJ2ZXIgdG8gcmVtb3ZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRpbWVvdXRPYnNlcnZlcihUaW1lb3V0T2JzZXJ2ZXIgdG8pIHsKKyAgICAgICAgLy9ubyBuZWVkIHRvIHN5bmNocm9uaXplLCBhcyBWZWN0b3IgaXMgYWx3YXlzIHN5bmNocm9uaXplZAorICAgICAgICBvYnNlcnZlcnMucmVtb3ZlRWxlbWVudCh0byk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtIHRoZSBvYnNlcnZlcnMgdGhhdCBhIHRpbWVvdXQgaGFzIG9jY3VycmVkLgorICAgICAqIFRoaXMgaGFwcGVucyBpbiB0aGUgd2F0Y2hkb2cgdGhyZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUaW1lb3V0T2NjdXJlZCgpIHsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IG9ic2VydmVycy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgKChUaW1lb3V0T2JzZXJ2ZXIpIGUubmV4dEVsZW1lbnQoKSkudGltZW91dE9jY3VyZWQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgd2F0Y2ggZG9nLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQodGhpcywgIldBVENIRE9HIik7CisgICAgICAgIHQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgd2F0Y2ggZG9nLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworICAgICAgICBzdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5QWxsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJ1biBtZXRob2Qgb2YgdGhlIHdhdGNoIGRvZyB0aHJlYWQuCisgICAgICogVGhpcyBzaW1wbHkgZG9lcyBhIHdhaXQgZm9yIHRoZSB0aW1lb3V0IHRpbWUsIGFuZAorICAgICAqIGlmIHRoZSBzdG9wIGZsYWcgaGFzIG5vdCBiZWVuIHNldCB3aGVuIHRoZSB3YWl0IGhhcyByZXR1cm5lZCBvcgorICAgICAqIGhhcyBiZWVuIGludGVycnVwdGVkLCB0aGUgd2F0Y2ggZG9nIGxpc3RlbmVycyBhcmUgaW5mb3JtZWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJ1bigpIHsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmluYWwgbG9uZyB1bnRpbCA9IG5vdyArIHRpbWVvdXQ7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlICghc3RvcHBlZCAmJiB1bnRpbCA+IG5vdykgeworICAgICAgICAgICAgICAgIHdhaXQodW50aWwgLSBub3cpOworICAgICAgICAgICAgICAgIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9uCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdG9wcGVkKSB7CisgICAgICAgICAgICBmaXJlVGltZW91dE9jY3VyZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9XZWFraXNoUmVmZXJlbmNlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1dlYWtpc2hSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmYzMjJmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9XZWFraXNoUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKworLyoqCisgKiBUaGVzZSBjbGFzc2VzIGFyZSBwYXJ0IG9mIHNvbWUgY29kZSB0byByZWR1Y2UgbWVtb3J5IGxlYWtzIGJ5IG9ubHkKKyAqIHJldGFpbmluZyB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhpbmdzCisgKiBvbiBKYXZhMS4yKywgYW5kIHlldCBzdGlsbCB3b3JrICh3aXRoIGxlYWt5IGhhcmQgcmVmZXJlbmNlcykgb24gSmF2YTEuMS4KKyAqIE5vdyB0aGF0IEFudCBpcyAxLjIrIG9ubHksCisgKiBsaWZlIGlzIHNpbXBsZXIgYW5kIG5vbmUgb2YgdGhlIGNsYXNzZXMgYXJlIG5lZWRlZCBhbnkgbW9yZS4KKyAqCisgKiBUaGV5IGFyZSBvbmx5IHJldGFpbmVkIGluIGNhc2UgYSB0aGlyZC1wYXJ0eSB0YXNrIHVzZXMgdGhlbQorICogQHNpbmNlIGFudDEuNgorICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLm9wdGlvbmFsLldlYWtpc2hSZWZlcmVuY2UxMgorICogQGRlcHJlY2F0ZWQgZGVwcmVjYXRlZCAxLjc7IHdpbGwgYmUgcmVtb3ZlZCBpbiBBbnQxLjgKKyAqICAgICAgICAgICAgIEp1c3QgdXNlIHtAbGluayBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2V9IGRpcmVjdGx5LgorICovCitwdWJsaWMgY2xhc3MgV2Vha2lzaFJlZmVyZW5jZSAgeworCisKKyAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2Ugd2Vha3JlZjsKKworICAgIC8qKgorICAgICAqIGNyZWF0ZSBhIG5ldyBzb2Z0IHJlZmVyZW5jZSwgd2hpY2ggaXMgYm91bmQgdG8gYQorICAgICAqIFdlYWsgcmVmZXJlbmNlIGluc2lkZQorICAgICAqCisgICAgICogQHBhcmFtIHJlZmVyZW5jZQorICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlCisgICAgICovCisgICAgV2Vha2lzaFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNlKSB7CisgICAgICAgIHRoaXMud2Vha3JlZiA9IG5ldyBXZWFrUmVmZXJlbmNlKHJlZmVyZW5jZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHJlZmVyZW5jZSBvYmplY3QncyByZWZlcmVudC4gIElmIHRoaXMgcmVmZXJlbmNlIG9iamVjdCBoYXMKKyAgICAgKiBiZWVuIGNsZWFyZWQsIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCB0byB3aGljaCB0aGlzIHJlZmVyZW5jZSByZWZlcnMsIG9yCisgICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHJlZmVyZW5jZSBvYmplY3QgaGFzIGJlZW4gY2xlYXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgcmV0dXJuIHdlYWtyZWYuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIHJlZmVyZW5jZSBmb3IgdGhlIGphdmEgdmVyc2lvbgorICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0aGF0IHRoZSByZWZlcmVuY2Ugd2lsbCByZWZlciB0by4KKyAgICAgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgT2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgV2Vha2lzaFJlZmVyZW5jZSBjcmVhdGVSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWFraXNoUmVmZXJlbmNlKG9iamVjdCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIHdhcyBhIGhhcmQgcmVmZXJlbmNlIGZvciBKYXZhIDEuMS4gU2luY2UgQW50MS43LAorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNy4KKyAgICAgKiAgICAgICAgICAgICBIb3BlZnVsbHkgbm9ib2R5IGlzIHVzaW5nIHRoaXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIYXJkUmVmZXJlbmNlIGV4dGVuZHMgV2Vha2lzaFJlZmVyZW5jZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNvbnN0cnVjdG9yLgorICAgICAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdGhhdCB0aGUgcmVmZXJlbmNlIHdpbGwgcmVmZXIgdG8uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSGFyZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgICAgICBzdXBlcihvYmplY3QpOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvV29ya2VyQW50LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1dvcmtlckFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmI0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1dvcmtlckFudC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogQSB3b3JrZXIgYW50IGV4ZWN1dGVzIGEgc2luZ2xlIHRhc2sgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZC4KKyAqIEFmdGVyIHRoZSBydW4sIGFueSBleGNlcHRpb24gdGhyb3duIGlzIHR1cm5lZCBpbnRvIGEgYnVpbGRleGNlcHRpb24sIHdoaWNoIGNhbiBiZQorICogcmV0aHJvd24sIHRoZSBmaW5pc2hlZCBhdHRyaWJ1dGUgaXMgc2V0LCB0aGVuIG5vdGlmeUFsbCgpIGlzIGNhbGxlZCwKKyAqIHNvIHRoYXQgYW55b25lIHdhaXRpbmcgb24gdGhlIHNhbWUgbm90aWZ5IG9iamVjdCBnZXRzIHdva2VuIHVwLgorICogPC9wPgorICogVGhpcyBjbGFzcyBpcyBlZmZlY3RpdmVseSBhIHN1cGVyc2V0IG9mCisgKiB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUGFyYWxsZWwuVGFza1J1bm5hYmxlfQorICoKKyAqIEBzaW5jZSBBbnQgMS44CisgKi8KKworcHVibGljIGNsYXNzIFdvcmtlckFudCBleHRlbmRzIFRocmVhZCB7CisKKyAgICBwcml2YXRlIFRhc2sgdGFzazsKKyAgICBwcml2YXRlIE9iamVjdCBub3RpZnk7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGZpbmlzaGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBCdWlsZEV4Y2VwdGlvbiBidWlsZEV4Y2VwdGlvbjsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFRocm93YWJsZSBleGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBFcnJvciBtZXNzYWdlIGlmIGludm9rZWQgd2l0aCBubyB0YXNrCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fVEFTSyA9ICJObyB0YXNrIGRlZmluZWQiOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIHdvcmtlci4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBkb2VzIG5vdCBzdGFydCB0aGUgdGhyZWFkLCBtZXJlbHkgY29uZmlndXJlcyBpdC4KKyAgICAgKiBAcGFyYW0gdGFzayB0aGUgdGFzaworICAgICAqIEBwYXJhbSBub3RpZnkgd2hhdCB0byBub3RpZnkKKyAgICAgKi8KKyAgICBwdWJsaWMgV29ya2VyQW50KFRhc2sgdGFzaywgT2JqZWN0IG5vdGlmeSkgeworICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgICAgICB0aGlzLm5vdGlmeSA9IG5vdGlmeSAhPSBudWxsID8gbm90aWZ5IDogdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIHdvcmtlciwgdXNpbmcgdGhlIHdvcmtlciBhcyB0aGUgbm90aWZpY2F0aW9uIHBvaW50LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIGRvZXMgbm90IHN0YXJ0IHRoZSB0aHJlYWQsIG1lcmVseSBjb25maWd1cmVzIGl0LgorICAgICAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrCisgICAgICovCisgICAgcHVibGljIFdvcmtlckFudChUYXNrIHRhc2spIHsKKyAgICAgICAgdGhpcyh0YXNrLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW55IGJ1aWxkIGV4Y2VwdGlvbi4KKyAgICAgKiBUaGlzIHdvdWxkIHNlZW0gdG8gYmUgb3ZlcnN5bmNocm9uaXNlZCwgYnV0IGtub3cgdGhhdCBKYXZhIHByZS0xLjUgY2FuCisgICAgICogcmVvcmRlciB2b2xhdGlsZSBhY2Nlc3MuCisgICAgICogVGhlIHN5bmNocm9uaXplZCBhdHRyaWJ1dGUgaXMgdG8gZm9yY2UgYW4gb3JkZXJpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24gb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQnVpbGRFeGNlcHRpb24gZ2V0QnVpbGRFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBidWlsZEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgd2hhdGV2ZXIgd2FzIHRocm93biwgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgYSBidWlsZEV4Y2VwdGlvbi4KKyAgICAgKiBBc3NlcnRpb246IGdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24gPD0+IGdldEJ1aWxkRXhjZXB0aW9uKCk9PWdldEV4Y2VwdGlvbigpCisgICAgICogQHJldHVybiB0aGUgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGFzaworICAgICAqIEByZXR1cm4gdGhlIHRhc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFzayBnZXRUYXNrKCkgeworICAgICAgICByZXR1cm4gdGFzazsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB0YXNrL3RocmVhZCBmb3IgYmVpbmcgZmluaXNoZWQuCisgICAgICogVGhpcyB3b3VsZCBzZWVtIHRvIGJlIG92ZXJzeW5jaHJvbmlzZWQsIGJ1dCBrbm93IHRoYXQgSmF2YSBwcmUtMS41IGNhbgorICAgICAqIHJlb3JkZXIgdm9sYXRpbGUgYWNjZXNzLgorICAgICAqIFRoZSBzeW5jaHJvbml6ZWQgYXR0cmlidXRlIGlzIHRvIGZvcmNlIGFuIG9yZGVyaW5nLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFzayBpcyBmaW5pc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZpbmlzaGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJsb2NrIG9uIHRoZSBub3RpZnkgb2JqZWN0IGFuZCBzbyB3YWl0IHVudGlsIHRoZSB0aHJlYWQgaXMgZmluaXNoZWQuCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBleGVjdXRpb24gd2FzIGludGVycnVwdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRmluaXNoZWQobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBzeW5jaHJvbml6ZWQgKG5vdGlmeSkgeworICAgICAgICAgICAgaWYgKCFmaW5pc2hlZCkgeworICAgICAgICAgICAgICAgIG5vdGlmeS53YWl0KHRpbWVvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmFpc2UgYW4gZXhjZXB0aW9uIGlmIG9uZSB3YXMgY2F1Z2h0CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG9uZSBoYXMgYmVlbiBwaWNrZWQgdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXRocm93QW55QnVpbGRFeGNlcHRpb24oKSB7CisgICAgICAgIEJ1aWxkRXhjZXB0aW9uIGV4ID0gZ2V0QnVpbGRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGV4ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgYSBjYXVnaHQgZXhjZXB0aW9uLCBieSByZWNvcmRpbmcgaXQgYW5kIHBvc3NpYmx5IHdyYXBwaW5nIGl0CisgICAgICogaW4gYSBCdWlsZEV4Y2VwdGlvbiBmb3IgbGF0ZXIgcmV0aHJvd2luZy4KKyAgICAgKiBAcGFyYW0gdGhyb3duIHdoYXQgd2FzIGNhdWdodCBlYXJsaWVyCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjYXVnaHQoVGhyb3dhYmxlIHRocm93bikgeworICAgICAgICBleGNlcHRpb24gPSB0aHJvd247CisgICAgICAgIGJ1aWxkRXhjZXB0aW9uID0gKHRocm93biBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKQorICAgICAgICAgICAgPyAoQnVpbGRFeGNlcHRpb24pIHRocm93bgorICAgICAgICAgICAgOiBuZXcgQnVpbGRFeGNlcHRpb24odGhyb3duKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRhc2ssIHdoaWNoIGlzIHNraXBwZWQgaWYgbnVsbC4KKyAgICAgKiBXaGVuIGludm9rZWQgYWdhaW4sIHRoZSB0YXNrIGlzIHJlLXJ1bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGFzay5leGVjdXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0aHJvd24pIHsKKyAgICAgICAgICAgIGNhdWdodCh0aHJvd24pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChub3RpZnkpIHsKKyAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgLy9yZXNldCB0aGUgdGFzay4KKyAgICAgICAgICAgICAgICAvL3dha2UgdXAgb3VyIG93bmVyLCBpZiBpdCBpcyB3YWl0aW5nCisgICAgICAgICAgICAgICAgbm90aWZ5Lm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9YTUxGcmFnbWVudC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9YTUxGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjFhM2EKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1hNTEZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkR5bmFtaWNFbGVtZW50TlM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EeW5hbWljQ29uZmlndXJhdG9yTlM7CisKKy8qKgorICogVXNlIHRoaXMgY2xhc3MgYXMgYSBuZXN0ZWQgZWxlbWVudCBpZiB5b3Ugd2FudCB0byBnZXQgYSBsaXRlcmFsIERPTQorICogZnJhZ21lbnQgb2Ygc29tZXRoaW5nIG5lc3RlZCBpbnRvIHlvdXIgdGFzay90eXBlLgorICoKKyAqIDxwPlRoaXMgaXMgdXNlZnVsIGZvciB0YXNrcyB0aGF0IHdhbnQgdG8gZGVhbCB3aXRoIHRoZSAicmVhbCIgWE1MCisgKiBmcm9tIHRoZSBidWlsZCBmaWxlIGluc3RlYWQgb2Ygb2JqZWN0cy48L3A+CisgKgorICogPHA+Q29kZSBoZWF2aWx5IGluZmx1ZW5jZWQgYnkgY29kZSB3cml0dGVuIGJ5IERvbWluaXF1ZSBEZXZpZW5uZS48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjcKKyAqLworcHVibGljIGNsYXNzIFhNTEZyYWdtZW50IGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCBpbXBsZW1lbnRzIER5bmFtaWNFbGVtZW50TlMgeworCisgICAgcHJpdmF0ZSBEb2N1bWVudCBkb2M7CisgICAgcHJpdmF0ZSBEb2N1bWVudEZyYWdtZW50IGZyYWdtZW50OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFhNTEZyYWdtZW50IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MRnJhZ21lbnQoKSB7CisgICAgICAgIGRvYyA9IEpBWFBVdGlscy5nZXREb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworICAgICAgICBmcmFnbWVudCA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgRG9jdW1lbnRGcmFnbWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBuZXN0ZWQKKyAgICAgKiAgICAgICAgICBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgZ2V0RnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiBmcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbmVzdGVkIHRleHQsIGV4cGFuZGluZyBwcm9wZXJ0aWVzIGFzIHdlIGdvCisgICAgICogQHBhcmFtIHMgdGhlIHRleHQgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgcykgeworICAgICAgICBhZGRUZXh0KGZyYWdtZW50LCBzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmVzdGVkIGVsZW1lbnQuCisgICAgICogQHBhcmFtIHVyaSB0aGUgdXJpIG9mIHRoZSBuZXN0ZWQgZWxlbWVudAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBsb2NhbG5hbWUgb2YgdGhlIG5lc3RlZCBlbGVtZW50CisgICAgICogQHBhcmFtIHFOYW1lIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmVzdGVkIGVsZW1lbnQKKyAgICAgKiBAcmV0dXJuIGFuIG9iamVjdCB0aGF0IHRoZSBlbGVtZW50IGlzIGFwcGxpZWQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUR5bmFtaWNFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBTdHJpbmcgcU5hbWUpIHsKKyAgICAgICAgRWxlbWVudCBlID0gbnVsbDsKKyAgICAgICAgaWYgKHVyaS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBlID0gZG9jLmNyZWF0ZUVsZW1lbnQobmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyh1cmksIHFOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGlsZChlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgdGV4dCB0byBhIG5vZGUuCisgICAgICogQHBhcmFtIG4gbm9kZQorICAgICAqIEBwYXJhbSBzIHZhbHVlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRleHQoTm9kZSBuLCBTdHJpbmcgcykgeworICAgICAgICBzID0gZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKHMpOworICAgICAgICAvL29ubHkgdGV4dCBub2RlcyB0aGF0IGFyZSBub24gbnVsbCBhZnRlciBwcm9wZXJ0eSBleHBhbnNpb24gYXJlIGFkZGVkCisgICAgICAgIGlmIChzICE9IG51bGwgJiYgIXMudHJpbSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIFRleHQgdCA9IGRvYy5jcmVhdGVUZXh0Tm9kZShzLnRyaW0oKSk7CisgICAgICAgICAgICBuLmFwcGVuZENoaWxkKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IHRvIGhhbmRsZSAocmVjdXJzaXZlbHkpIG5lc3RlZCBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgQ2hpbGQgaW1wbGVtZW50cyBEeW5hbWljQ29uZmlndXJhdG9yTlMgeworICAgICAgICBwcml2YXRlIEVsZW1lbnQgZTsKKworICAgICAgICBDaGlsZChFbGVtZW50IGUpIHsKKyAgICAgICAgICAgIHRoaXMuZSA9IGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIG5lc3RlZCB0ZXh0LgorICAgICAgICAgKiBAcGFyYW0gcyB0aGUgdGV4dCB0byBhZGQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIFhNTEZyYWdtZW50LnRoaXMuYWRkVGV4dChlLCBzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICogQHBhcmFtIHVyaSB0aGUgdXJpIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIGxvY2FsbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICAgICAqIEBwYXJhbSBxTmFtZSB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldER5bmFtaWNBdHRyaWJ1dGUoCisgICAgICAgICAgICBTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHFOYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGVOUyh1cmksIHFOYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5lc3RlZCBlbGVtZW50LgorICAgICAgICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgb2YgdGhlIG5lc3RlZCBlbGVtZW50CisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBsb2NhbG5hbWUgb2YgdGhlIG5lc3RlZCBlbGVtZW50CisgICAgICAgICAqIEBwYXJhbSBxTmFtZSB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5lc3RlZCBlbGVtZW50CisgICAgICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IHRoYXQgdGhlIGVsZW1lbnQgaXMgYXBwbGllZCB0bworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVEeW5hbWljRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHFOYW1lKSB7CisgICAgICAgICAgICBFbGVtZW50IGUyID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIGUyID0gZG9jLmNyZWF0ZUVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGUyID0gZG9jLmNyZWF0ZUVsZW1lbnROUyh1cmksIHFOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGUuYXBwZW5kQ2hpbGQoZTIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGlsZChlMik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvWG1sQ29uc3RhbnRzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1htbENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjAzNDMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1htbENvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworLyoqCisgKiBYTUwgUGFyc2VyIGNvbnN0YW50cywgYWxsIGtlcHQgaW4gb25lIHBsYWNlIGZvciBlYXNlIG9mIHJldXNlCisgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtai9mZWF0dXJlcy5odG1sIj5YZXJjZXMgZmVhdHVyZXM8L2E+CisgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtai9wcm9wZXJ0aWVzLmh0bWwiPlhlcmNlcyBwcm9wZXJ0aWVzPC9hPgorICogQHNlZSA8YSBocmVmPQorICogImh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L3BhY2thZ2Utc3VtbWFyeS5odG1sI3BhY2thZ2VfZGVzY3JpcHRpb24iCisgKiA+U0FYLjwvYT4KKyAqLworCitwdWJsaWMgY2xhc3MgWG1sQ29uc3RhbnRzIHsKKyAgICAvKiogcHJvcGVydHkgZm9yIGxvY2F0aW9uIG9mIHhtbCBzY2hlbWEgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TQ0hFTUFfTE9DQVRJT04gPQorICAgICAgICAgICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9wcm9wZXJ0aWVzL3NjaGVtYS9leHRlcm5hbC1zY2hlbWFMb2NhdGlvbiI7CisgICAgLyoqIHByb3BlcnR5IGZvciBsb2NhdGlvbiBvZiBuby1uYW1lIHNjaGVtYSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05PX05BTUVTUEFDRV9TQ0hFTUFfTE9DQVRJT04gPQorICAgICAgICAgICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9wcm9wZXJ0aWVzL3NjaGVtYS9leHRlcm5hbC1ub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIjsKKyAgICAvKiogcHJvcGVydHkgZm9yIGZ1bGwgdmFsaWRhdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfWFNEX0ZVTExfVkFMSURBVElPTiA9CisgICAgICAgICAgICAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hLWZ1bGwtY2hlY2tpbmciOworICAgIC8qKiBwcm9wZXJ0eSBmb3IgeHNkICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9YU0QgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIjsKKworICAgIC8qKiBwcm9wZXJ0eSBmb3IgdmFsaWRhdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfVkFMSURBVElPTiA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiI7CisgICAgLyoqIHByb3BlcnR5IGZvciBuYW1lc3BhY2Ugc3VwcG9ydCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfTkFNRVNQQUNFUyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7CisgICAgLyoqIHByb3BlcnR5IGZvciBzY2hlbWEgbGFuZ3VhZ2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0pBWFAxMl9TQ0hFTUFfTEFOR1VBR0UgPQorICAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheHAvcHJvcGVydGllcy9zY2hlbWFMYW5ndWFnZSI7CisgICAgLyoqIHByb3BlcnR5IGZvciBzY2hlbWEgc291cmNlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9KQVhQMTJfU0NIRU1BX1NPVVJDRSA9CisgICAgICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4cC9wcm9wZXJ0aWVzL3NjaGVtYVNvdXJjZSI7CisgICAgLyoqIHRoZSBuYW1lc3BhY2UgZm9yIFhNTCBzY2hlbWEgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfWFNEID0KKyAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7CisgICAgLyoqIHRoZSBzYXggZXh0ZXJuYWwgZW50aXRpZXMgZmVhdHVyZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfRVhURVJOQUxfRU5USVRJRVMgPQorICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1nZW5lcmFsLWVudGl0aWVzIjsKKyAgICAvKiogdGhlIGFwYWNoZS5vcmcveG1sIGRpc2FsbGxvdyBkb2N0eXBlIGRlY2wgZmVhdHVyZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfRElTQUxMT1dfRFREID0KKyAgICAgICAgICAgICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvZGlzYWxsb3ctZG9jdHlwZS1kZWNsIjsKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL0Fic3RyYWN0QW5hbHl6ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL0Fic3RyYWN0QW5hbHl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTJhM2VhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvQWJzdHJhY3RBbmFseXplci5qYXZhCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBhbmFseXplciBpbnRlcmZhY2UgcHJvdmlkaW5nIHN1cHBvcnQKKyAqIGZvciB0aGUgYnVsayBvZiBpbnRlcmZhY2UgbWV0aG9kcy4KKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFuYWx5emVyIGltcGxlbWVudHMgRGVwZW5kZW5jeUFuYWx5emVyIHsKKyAgICAvKiogTWF4aW11bSBudW1iZXIgb2YgbG9vcHMgZm9yIGxvb2tpbmcgZm9yIGluZGlyZWN0IGRlcGVuZGVuY2llcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfTE9PUFMgPSAxMDAwOworCisgICAgLyoqIFRoZSBzb3VyY2UgcGF0aCBmb3IgdGhlIHNvdXJjZSBmaWxlcyAqLworICAgIHByaXZhdGUgUGF0aCBzb3VyY2VQYXRoID0gbmV3IFBhdGgobnVsbCk7CisKKyAgICAvKiogVGhlIGNsYXNzcGF0aCBjb250YWluZyBkaXJzIGFuZCBqYXJzIG9mIGNsYXNzIGZpbGVzICovCisgICAgcHJpdmF0ZSBQYXRoIGNsYXNzUGF0aCA9IG5ldyBQYXRoKG51bGwpOworCisgICAgLyoqIFRoZSBsaXN0IG9mIHJvb3QgY2xhc3NlcyAqLworICAgIHByaXZhdGUgVmVjdG9yIHJvb3RDbGFzc2VzID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIHRydWUgaWYgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBkZXRlcm1pbmVkICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRldGVybWluZWQgPSBmYWxzZTsKKworICAgIC8qKiB0aGUgbGlzdCBvZiBGaWxlIG9iamVjdHMgdGhhdCB0aGUgcm9vdCBjbGFzc2VzIGRlcGVuZCB1cG9uICovCisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsZURlcGVuZGVuY2llczsKKyAgICAvKiogdGhlIGxpc3Qgb2YgamF2YSBjbGFzc2VzIHRoZSByb290IGNsYXNzZXMgZGVwZW5kIHVwb24gKi8KKyAgICBwcml2YXRlIFZlY3RvciBjbGFzc0RlcGVuZGVuY2llczsKKworICAgIC8qKiB0cnVlIGlmIGluZGlyZWN0IGRlcGVuZGVuY2llcyBzaG91bGQgYmUgZ2F0aGVyZWQgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2xvc3VyZSA9IHRydWU7CisKKyAgICAvKiogU2V0dXAgdGhlIGFuYWx5emVyICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0QW5hbHl6ZXIoKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbG9zdXJlIGZsYWcuIElmIHRoaXMgZmxhZyBpcyB0cnVlIHRoZSBhbmFseXplciB3aWxsIHRyYXZlcnNlCisgICAgICogYWxsIGNsYXNzIHJlbGF0aW9uc2hpcHMgdW50aWwgaXQgaGFzIGNvbGxlY3RlZCB0aGUgZW50aXJlIHNldCBvZgorICAgICAqIGRpcmVjdCBhbmQgaW5kaXJlY3QgZGVwZW5kZW5jaWVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0cnVlIGlmIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgdHJhdmVyc2VkIHRvIGRldGVybWluZQorICAgICAqICAgICAgaW5kaXJlY3QgZGVwZW5kZW5jaWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsb3N1cmUoYm9vbGVhbiBjbG9zdXJlKSB7CisgICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIGluIHRoZSBmaWxlIHN5c3RlbSB1cG9uIHdoaWNoIHRoZSByb290IGNsYXNzZXMKKyAgICAgKiBkZXBlbmQuIFRoZSBmaWxlcyB3aWxsIGJlIGVpdGhlciB0aGUgY2xhc3NmaWxlcyBvciBqYXIgZmlsZXMgdXBvbgorICAgICAqIHdoaWNoIHRoZSByb290IGNsYXNzZXMgZGVwZW5kLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBGaWxlIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RmlsZURlcGVuZGVuY2llcygpIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c0ZpbGVEZXBlbmRlbmNpZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZpbGUgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICArICJieSB0aGlzIGFuYWx5emVyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkZXRlcm1pbmVkKSB7CisgICAgICAgICAgICBkZXRlcm1pbmVEZXBlbmRlbmNpZXMoZmlsZURlcGVuZGVuY2llcywgY2xhc3NEZXBlbmRlbmNpZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlRGVwZW5kZW5jaWVzLmVsZW1lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGNsYXNzZXMgdXBvbiB3aGljaCByb290IGNsYXNzZXMgZGVwZW5kLiBUaGlzIGlzIGEKKyAgICAgKiBsaXN0IG9mIEphdmEgY2xhc3NuYW1lcyBpbiBkb3Qgbm90YXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIFN0cmluZ3MsIGVhY2ggYmVpbmcgdGhlIG5hbWUgb2YgYSBKYXZhCisgICAgICogICAgICBjbGFzcyBpbiBkb3Qgbm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldENsYXNzRGVwZW5kZW5jaWVzKCkgeworICAgICAgICBpZiAoIWRldGVybWluZWQpIHsKKyAgICAgICAgICAgIGRldGVybWluZURlcGVuZGVuY2llcyhmaWxlRGVwZW5kZW5jaWVzLCBjbGFzc0RlcGVuZGVuY2llcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzRGVwZW5kZW5jaWVzLmVsZW1lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGRlZmluaXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgdGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVkIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgZmlsZSBpbnN0YW5jZSwgemlwIG9yIGNsYXNzLCBjb250YWluaW5nIHRoZQorICAgICAqICAgICAgICAgY2xhc3Mgb3IgbnVsbCBpZiB0aGUgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGZpbGVzIGluIHRoZSBjbGFzc3BhdGggY2Fubm90IGJlIHJlYWQuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0Q2xhc3NDb250YWluZXIoU3RyaW5nIGNsYXNzbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb24gPSBjbGFzc25hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKKyAgICAgICAgLy8gd2UgbG9vayB0aHJvdWdoIHRoZSBjbGFzc3BhdGggZWxlbWVudHMuIElmIHRoZSBlbGVtZW50IGlzIGEgZGlyCisgICAgICAgIC8vIHdlIGxvb2sgZm9yIHRoZSBmaWxlLiBJRiBpdCBpcyBhIHppcCwgd2UgbG9vayBmb3IgdGhlIHppcCBlbnRyeQorICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VDb250YWluZXIoY2xhc3NMb2NhdGlvbiwgY2xhc3NQYXRoLmxpc3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIHNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgdGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVkIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgZmlsZSBpbnN0YW5jZSwgemlwIG9yIGphdmEsIGNvbnRhaW5pbmcgdGhlCisgICAgICogICAgICAgICBzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgc291cmNlIGZvciB0aGUgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGZpbGVzIGluIHRoZSBzb3VyY2VwYXRoIGNhbm5vdCBiZSByZWFkLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFNvdXJjZUNvbnRhaW5lcihTdHJpbmcgY2xhc3NuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgc291cmNlTG9jYXRpb24gPSBjbGFzc25hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmphdmEiOworCisgICAgICAgIC8vIHdlIGxvb2sgdGhyb3VnaCB0aGUgc291cmNlIHBhdGggZWxlbWVudHMuIElmIHRoZSBlbGVtZW50IGlzIGEgZGlyCisgICAgICAgIC8vIHdlIGxvb2sgZm9yIHRoZSBmaWxlLiBJZiBpdCBpcyBhIHppcCwgd2UgbG9vayBmb3IgdGhlIHppcCBlbnRyeS4KKyAgICAgICAgLy8gVGhpcyBpc24ndCBub3JtYWwgZm9yIHNvdXJjZSBwYXRocyBidXQgd2UgZ2V0IGl0IGZvciBmcmVlCisgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZUNvbnRhaW5lcihzb3VyY2VMb2NhdGlvbiwgc291cmNlUGF0aC5saXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNvdXJjZSBwYXRoIHRvIHRoZSBzb3VyY2UgcGF0aCB1c2VkIGJ5IHRoaXMgYW5hbHl6ZXIuIFRoZQorICAgICAqIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBwYXRoIGNvbnRhaW4gdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIGNsYXNzZXMKKyAgICAgKiBiZWluZyBhbmFseXplZC4gTm90IGFsbCBhbmFseXplcnMgd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VQYXRoIFRoZSBQYXRoIGluc3RhbmNlIHNwZWNpZnlpbmcgdGhlIHNvdXJjZSBwYXRoCisgICAgICogICAgICBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTb3VyY2VQYXRoKFBhdGggc291cmNlUGF0aCkgeworICAgICAgICBpZiAoc291cmNlUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zb3VyY2VQYXRoLmFwcGVuZChzb3VyY2VQYXRoKTsKKyAgICAgICAgdGhpcy5zb3VyY2VQYXRoLnNldFByb2plY3Qoc291cmNlUGF0aC5nZXRQcm9qZWN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGNsYXNzcGF0aCB0byB0aGUgY2xhc3NwYXRoIGJlaW5nIHVzZWQgYnkgdGhlIGFuYWx5emVyLiBUaGUKKyAgICAgKiBjbGFzc3BhdGggY29udGFpbnMgdGhlIGJpbmFyeSBjbGFzc2ZpbGVzIGZvciB0aGUgY2xhc3NlcyBiZWluZworICAgICAqIGFuYWx5emVkIFRoZSBlbGVtZW50cyBtYXkgZWl0aGVyIGJlIHRoZSBkaXJlY3RvcmllcyBvciBqYXIgZmlsZXMuTm90CisgICAgICogYWxsIGFuYWx5emVycyB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzUGF0aCB0aGUgUGF0aCBpbnN0YW5jZSBzcGVjaWZ5aW5nIHRoZSBjbGFzc3BhdGggZWxlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc1BhdGgoUGF0aCBjbGFzc1BhdGgpIHsKKyAgICAgICAgaWYgKGNsYXNzUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNsYXNzUGF0aC5hcHBlbmQoY2xhc3NQYXRoKTsKKyAgICAgICAgdGhpcy5jbGFzc1BhdGguc2V0UHJvamVjdChjbGFzc1BhdGguZ2V0UHJvamVjdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByb290IGNsYXNzLiBUaGUgcm9vdCBjbGFzc2VzIGFyZSB1c2VkIHRvIGRyaXZlIHRoZQorICAgICAqIGRldGVybWluYXRpb24gb2YgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4gVGhlIGFuYWx5emVyIHdpbGwgc3RhcnQgYXQKKyAgICAgKiB0aGUgcm9vdCBjbGFzc2VzIGFuZCBhZGQgZGVwZW5kZW5jaWVzIGZyb20gdGhlcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpbiBKYXZhIGRvdCBub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSb290Q2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJvb3RDbGFzc2VzLmNvbnRhaW5zKGNsYXNzTmFtZSkpIHsKKyAgICAgICAgICAgIHJvb3RDbGFzc2VzLmFkZEVsZW1lbnQoY2xhc3NOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSBhbiBhc3BlY3Qgb2YgdGhlIGFuYWx5emVyLiBUaGUgc2V0IG9mIGFzcGVjdHMgdGhhdCBhcmUKKyAgICAgKiBzdXBwb3J0ZWQgaXMgc3BlY2lmaWMgdG8gZWFjaCBhbmFseXplciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhc3BlY3QgYmVpbmcgY29uZmlndXJlZAorICAgICAqIEBwYXJhbSBpbmZvIHRoZSBjb25maWd1cmF0aW9uIGluZm8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmlnKFN0cmluZyBuYW1lLCBPYmplY3QgaW5mbykgeworICAgICAgICAvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgZGVwZW5kZW5jeSBsaXN0LiBUaGlzIHdpbGwgcmVzZXQgdGhlIGRldGVybWluZWQKKyAgICAgKiBkZXBlbmRlbmNpZXMgYW5kIHRoZSBhbHNvIGxpc3Qgb2Ygcm9vdCBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICByb290Q2xhc3Nlcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICBkZXRlcm1pbmVkID0gZmFsc2U7CisgICAgICAgIGZpbGVEZXBlbmRlbmNpZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGNsYXNzRGVwZW5kZW5jaWVzID0gbmV3IFZlY3RvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgcm9vdCBjbGFzc2VzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIFN0cmluZ3MsIGVhY2ggb2Ygd2hpY2ggaXMgYSBjbGFzcyBuYW1lCisgICAgICogICAgICAgICBmb3IgYSByb290IGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBFbnVtZXJhdGlvbiBnZXRSb290Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIHJvb3RDbGFzc2VzLmVsZW1lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGUgaWYgdGhlIGFuYWx5emVyIGlzIHJlcXVpcmVkIHRvIGZvbGxvdworICAgICAqIGluZGlyZWN0IGNsYXNzIHJlbGF0aW9uc2hpcHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW5kaXJlY3QgcmVsYXRpb25zaGlwcyBzaG91bGQgYmUgZm9sbG93ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zdXJlUmVxdWlyZWQoKSB7CisgICAgICAgIHJldHVybiBjbG9zdXJlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBjdXJyZW50IHNldCBvZiByb290IGNsYXNzZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlcyBhIHZlY3RvciBpbnRvIHdoaWNoIEZpbGVzIHVwb24gd2hpY2ggdGhlIHJvb3QgY2xhc3NlcworICAgICAqICAgICAgZGVwZW5kIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGNsYXNzZXMgYSB2ZWN0b3Igb2YgU3RyaW5ncyBpbnRvIHdoaWNoIHRoZSBuYW1lcyBvZiBjbGFzc2VzCisgICAgICogICAgICB1cG9uIHdoaWNoIHRoZSByb290IGNsYXNzZXMgZGVwZW5kIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGV0ZXJtaW5lRGVwZW5kZW5jaWVzKFZlY3RvciBmaWxlcywgVmVjdG9yIGNsYXNzZXMpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGUgaWYgdGhlIHBhcnRpY3VsYXIgc3ViY2xhc3Mgc3VwcG9ydHMgZmlsZSBkZXBlbmRlbmN5CisgICAgICogaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZmlsZSBkZXBlbmRlbmNpZXMgYXJlIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0ZpbGVEZXBlbmRlbmNpZXMoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSByZXNvdXJjZQorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTG9jYXRpb24gdGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVkIHJlc291cmNlLgorICAgICAqIEBwYXJhbSBwYXRocyB0aGUgcGF0aHMgd2hpY2ggd2lsbCBiZSBzZWFyY2hlZCBmb3IgdGhlIHJlc291cmNlLgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgaW5zdGFuY2UsIHppcCBvciBjbGFzcywgY29udGFpbmluZyB0aGUKKyAgICAgKiAgICAgICAgIGNsYXNzIG9yIG51bGwgaWYgdGhlIGNsYXNzIGNvdWxkIG5vdCBiZSBmb3VuZC4KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gcGF0aHMgY2Fubm90IGJlIHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGdldFJlc291cmNlQ29udGFpbmVyKFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmdbXSBwYXRocykKKyAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIEZpbGUgZWxlbWVudCA9IG5ldyBGaWxlKHBhdGhzW2ldKTsKKyAgICAgICAgICAgIGlmICghZWxlbWVudC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIEZpbGUgcmVzb3VyY2UgPSBuZXcgRmlsZShlbGVtZW50LCByZXNvdXJjZUxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBhIHppcCBvZiBzb21lIHNvcnQKKyAgICAgICAgICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHppcEZpbGUgPSBuZXcgWmlwRmlsZShlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHppcEZpbGUuZ2V0RW50cnkocmVzb3VyY2VMb2NhdGlvbikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoemlwRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB6aXBGaWxlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9EZXBlbmRlbmN5QW5hbHl6ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL0RlcGVuZGVuY3lBbmFseXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZDE5MzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9EZXBlbmRlbmN5QW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworLyoqCisgKiBBIGRlcGVuZGVuY3kgYW5hbHl6ZXIgYW5hbHl6ZXMgZGVwZW5kZW5jaWVzIGJldHdlZW4gSmF2YSBjbGFzc2VzIHRvCisgKiBkZXRlcm1pbmUgdGhlIG1pbmltYWwgc2V0IG9mIGNsYXNzZXMgd2hpY2ggYXJlIHJlcXVpcmVkIGJ5IGEgc2V0IG9mCisgKiAmcXVvdDtyb290JnF1b3Q7IGNsYXNzZXMuIERpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgY2FuCisgKiB1c2UgZGlmZmVyZW50IHN0cmF0ZWdpZXMgYW5kIGxpYnJhcmllcyB0byBkZXRlcm1pbmUgdGhlIHJlcXVpcmVkIHNldC4gRm9yCisgKiBleGFtcGxlLCBzb21lIGFuYWx5emVycyB3aWxsIHVzZSBjbGFzcyBmaWxlcyB3aGlsZSBvdGhlcnMgbWlnaHQgdXNlCisgKiBzb3VyY2UgZmlsZXMuIEFuYWx5emVyIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaXMgY2F0ZXJlZCBmb3IgdGhyb3VnaCBhCisgKiBnZW5lcmljIGNvbmZpZ3VyZSBtZXRob2QKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGVwZW5kZW5jeUFuYWx5emVyIHsKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzb3VyY2UgcGF0aCB0byB0aGUgc291cmNlIHBhdGggdXNlZCBieSB0aGlzIGFuYWx5emVyLiBUaGUKKyAgICAgKiBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gcGF0aCBjb250YWluIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSBjbGFzc2VzCisgICAgICogYmVpbmcgYW5hbHl6ZWQuIE5vdCBhbGwgYW5hbHl6ZXJzIHdpbGwgdXNlIHRoaXMgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlUGF0aCBUaGUgUGF0aCBpbnN0YW5jZSBzcGVjaWZ5aW5nIHRoZSBzb3VyY2UgcGF0aAorICAgICAqICAgICAgZWxlbWVudHMuCisgICAgICovCisgICAgdm9pZCBhZGRTb3VyY2VQYXRoKFBhdGggc291cmNlUGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjbGFzc3BhdGggdG8gdGhlIGNsYXNzcGF0aCBiZWluZyB1c2VkIGJ5IHRoZSBhbmFseXplci4gVGhlCisgICAgICogY2xhc3NwYXRoIGNvbnRhaW5zIHRoZSBiaW5hcnkgY2xhc3NmaWxlcyBmb3IgdGhlIGNsYXNzZXMgYmVpbmcKKyAgICAgKiBhbmFseXplZCBUaGUgZWxlbWVudHMgbWF5IGVpdGhlciBiZSB0aGUgZGlyZWN0b3JpZXMgb3IgamFyIGZpbGVzLk5vdAorICAgICAqIGFsbCBhbmFseXplcnMgd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggdGhlIFBhdGggaW5zdGFuY2Ugc3BlY2lmeWluZyB0aGUgY2xhc3NwYXRoIGVsZW1lbnRzCisgICAgICovCisgICAgdm9pZCBhZGRDbGFzc1BhdGgoUGF0aCBjbGFzc3BhdGgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgcm9vdCBjbGFzcy4gVGhlIHJvb3QgY2xhc3NlcyBhcmUgdXNlZCB0byBkcml2ZSB0aGUKKyAgICAgKiBkZXRlcm1pbmF0aW9uIG9mIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uIFRoZSBhbmFseXplciB3aWxsIHN0YXJ0IGF0CisgICAgICogdGhlIHJvb3QgY2xhc3NlcyBhbmQgYWRkIGRlcGVuZGVuY2llcyBmcm9tIHRoZXJlLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaW4gSmF2YSBkb3Qgbm90YXRpb24uCisgICAgICovCisgICAgdm9pZCBhZGRSb290Q2xhc3MoU3RyaW5nIGNsYXNzbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIGZpbGUgc3lzdGVtIHVwb24gd2hpY2ggdGhlIHJvb3QgY2xhc3NlcworICAgICAqIGRlcGVuZC4gVGhlIGZpbGVzIHdpbGwgYmUgZWl0aGVyIHRoZSBjbGFzc2ZpbGVzIG9yIGphciBmaWxlcyB1cG9uCisgICAgICogd2hpY2ggdGhlIHJvb3QgY2xhc3NlcyBkZXBlbmQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIEZpbGUgaW5zdGFuY2VzLgorICAgICAqLworICAgIEVudW1lcmF0aW9uIGdldEZpbGVEZXBlbmRlbmNpZXMoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBjbGFzc2VzIHVwb24gd2hpY2ggcm9vdCBjbGFzc2VzIGRlcGVuZC4gVGhpcyBpcyBhCisgICAgICogbGlzdCBvZiBKYXZhIGNsYXNzbmFtZXMgaW4gZG90IG5vdGF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBTdHJpbmdzLCBlYWNoIGJlaW5nIHRoZSBuYW1lIG9mIGEgSmF2YQorICAgICAqICAgICAgY2xhc3MgaW4gZG90IG5vdGF0aW9uLgorICAgICAqLworICAgIEVudW1lcmF0aW9uIGdldENsYXNzRGVwZW5kZW5jaWVzKCk7CisKKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBkZXBlbmRlbmN5IGxpc3QuIFRoaXMgd2lsbCByZXNldCB0aGUgZGV0ZXJtaW5lZAorICAgICAqIGRlcGVuZGVuY2llcyBhbmQgdGhlIGFsc28gbGlzdCBvZiByb290IGNsYXNzZXMuCisgICAgICovCisgICAgdm9pZCByZXNldCgpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGFuIGFzcGVjdCBvZiB0aGUgYW5hbHl6ZXIuIFRoZSBzZXQgb2YgYXNwZWN0cyB0aGF0IGFyZQorICAgICAqIHN1cHBvcnRlZCBpcyBzcGVjaWZpYyB0byBlYWNoIGFuYWx5emVyIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFzcGVjdCBiZWluZyBjb25maWd1cmVkCisgICAgICogQHBhcmFtIGluZm8gdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICAgICovCisgICAgdm9pZCBjb25maWcoU3RyaW5nIG5hbWUsIE9iamVjdCBpbmZvKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xvc3VyZSBmbGFnLiBJZiB0aGlzIGZsYWcgaXMgdHJ1ZSB0aGUgYW5hbHl6ZXIgd2lsbCB0cmF2ZXJzZQorICAgICAqIGFsbCBjbGFzcyByZWxhdGlvbnNoaXBzIHVudGlsIGl0IGhhcyBjb2xsZWN0ZWQgdGhlIGVudGlyZSBzZXQgb2YKKyAgICAgKiBkaXJlY3QgYW5kIGluZGlyZWN0IGRlcGVuZGVuY2llcworICAgICAqCisgICAgICogQHBhcmFtIGNsb3N1cmUgdHJ1ZSBpZiBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHRyYXZlcnNlZCB0byBkZXRlcm1pbmUKKyAgICAgKiAgICAgIGluZGlyZWN0IGRlcGVuZGVuY2llcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldENsb3N1cmUoYm9vbGVhbiBjbG9zdXJlKTsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGRlZmluaXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgdGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVkIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgZmlsZSBpbnN0YW5jZSwgemlwIG9yIGNsYXNzLCBjb250YWluaW5nIHRoZQorICAgICAqICAgICAgICAgY2xhc3Mgb3IgbnVsbCBpZiB0aGUgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kLgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGZpbGVzIGluIHRoZSBjbGFzc3BhdGggY2Fubm90IGJlIHJlYWQuCisgICAgICovCisgICAgRmlsZSBnZXRDbGFzc0NvbnRhaW5lcihTdHJpbmcgY2xhc3NuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3Mgc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVxdWlyZWQgY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGluc3RhbmNlLCB6aXAgb3IgamF2YSwgY29udGFpbmluZyB0aGUKKyAgICAgKiAgICAgICAgIHNvdXJjZSBvciBudWxsIGlmIHRoZSBzb3VyY2UgZm9yIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQuCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZXMgaW4gdGhlIHNvdXJjZXBhdGggY2Fubm90IGJlIHJlYWQuCisgICAgICovCisgICAgRmlsZSBnZXRTb3VyY2VDb250YWluZXIoU3RyaW5nIGNsYXNzbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsL0FuY2VzdG9yQW5hbHl6ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL2JjZWwvQW5jZXN0b3JBbmFseXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGRlNmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsL0FuY2VzdG9yQW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZC5iY2VsOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5DbGFzc1BhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLkphdmFDbGFzczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZC5BYnN0cmFjdEFuYWx5emVyOworCisvKioKKyAqIEEgZGVwZW5kZW5jeSBhbmFseXplciB3aGljaCByZXR1cm5zIHN1cGVyY2xhc3MgYW5kIHN1cGVyaW50ZXJmYWNlCisgKiBkZXBlbmRlbmNpZXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgQW5jZXN0b3JBbmFseXplciBleHRlbmRzIEFic3RyYWN0QW5hbHl6ZXIgeworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQ2F1c2VzIHRoZSBCQ0VMIGNsYXNzZXMgdG8gbG9hZCB0byBlbnN1cmUgQkNFTCBkZXBlbmRlbmNpZXMgY2FuCisgICAgICogYmUgc2F0aXNmaWVkCisgICAgICovCisgICAgcHVibGljIEFuY2VzdG9yQW5hbHl6ZXIoKSB7CisgICAgICAgIC8vIGZvcmNlIEJDRUwgY2xhc3NlcyB0byBsb2FkIG5vdworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IENsYXNzUGFyc2VyKCJmb3JjZSIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBjb25maWd1cmVkIHJvb3QgY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlcyBhIHZlY3RvciB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgZmlsZXMgd2hpY2ggY29udGFpbgorICAgICAqICAgICAgdGhlIGRlcGVuZGVuY3kgY2xhc3NlcworICAgICAqIEBwYXJhbSBjbGFzc2VzIGEgdmVjdG9yIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBuYW1lcyBvZiB0aGUKKyAgICAgKiAgICAgIGRlcGVuY2VuY3kgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXRlcm1pbmVEZXBlbmRlbmNpZXMoVmVjdG9yIGZpbGVzLCBWZWN0b3IgY2xhc3NlcykgeworICAgICAgICAvLyB3ZSBnZXQgdGhlIHJvb3QgY2xhc3NlcyBhbmQgYnVpbGQgdXAgYSBzZXQgb2YKKyAgICAgICAgLy8gY2xhc3NlcyB1cG9uIHdoaWNoIHRoZXkgZGVwZW5kCisgICAgICAgIEhhc2h0YWJsZSBkZXBlbmRlbmNpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIEhhc2h0YWJsZSBjb250YWluZXJzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBIYXNodGFibGUgdG9BbmFseXplID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBIYXNodGFibGUgbmV4dEFuYWx5emUgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGdldFJvb3RDbGFzc2VzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgdG9BbmFseXplLnB1dChjbGFzc25hbWUsIGNsYXNzbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBpbnQgbWF4Q291bnQgPSBpc0Nsb3N1cmVSZXF1aXJlZCgpID8gTUFYX0xPT1BTIDogMjsKKyAgICAgICAgd2hpbGUgKHRvQW5hbHl6ZS5zaXplKCkgIT0gMCAmJiBjb3VudCsrIDwgbWF4Q291bnQpIHsKKyAgICAgICAgICAgIG5leHRBbmFseXplLmNsZWFyKCk7CisgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSB0b0FuYWx5emUua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1dChjbGFzc25hbWUsIGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBjb250YWluZXIgPSBnZXRDbGFzc0NvbnRhaW5lcihjbGFzc25hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMucHV0KGNvbnRhaW5lciwgY29udGFpbmVyKTsKKworICAgICAgICAgICAgICAgICAgICBDbGFzc1BhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ldyBDbGFzc1BhcnNlcihjb250YWluZXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ldyBDbGFzc1BhcnNlcihjb250YWluZXIuZ2V0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSBwYXJzZXIucGFyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gaW50ZXJmYWNlcyA9IGphdmFDbGFzcy5nZXRJbnRlcmZhY2VOYW1lcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVwZW5kZW5jaWVzLmNvbnRhaW5zS2V5KGludGVyZmFjZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEFuYWx5emUucHV0KGludGVyZmFjZU5hbWUsIGludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGphdmFDbGFzcy5pc0NsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdXBlckNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3NOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY2llcy5jb250YWluc0tleShzdXBlckNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBbmFseXplLnB1dChzdXBlckNsYXNzLCBzdXBlckNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEhhc2h0YWJsZSB0ZW1wID0gdG9BbmFseXplOworICAgICAgICAgICAgdG9BbmFseXplID0gbmV4dEFuYWx5emU7CisgICAgICAgICAgICBuZXh0QW5hbHl6ZSA9IHRlbXA7CisgICAgICAgIH0KKworICAgICAgICBmaWxlcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBjb250YWluZXJzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIGZpbGVzLmFkZEVsZW1lbnQoKEZpbGUpIGUubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBjbGFzc2VzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGRlcGVuZGVuY2llcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBjbGFzc2VzLmFkZEVsZW1lbnQoKFN0cmluZykgZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIGlmIHRoaXMgYW5hbHl6ZXIgY2FuIGRldGVybWluZSBkZXBlbmRlbnQgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFuYWx5emVyIHByb3ZpZGVzIGRlcGVuZGVuY3kgZmlsZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0ZpbGVEZXBlbmRlbmNpZXMoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsL0RlcGVuZGVuY3lWaXNpdG9yLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsL0RlcGVuZGVuY3lWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiZDM4OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL2JjZWwvRGVwZW5kZW5jeVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZC5iY2VsOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLkNvbnN0YW50Q2xhc3M7CitpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5Db25zdGFudFBvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5FbXB0eVZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLkphdmFDbGFzczsKK2ltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLk1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLkNvbnN0YW50TmFtZUFuZFR5cGU7CisKKy8qKgorICogQSBCQ0VMIHZpc2l0b3IgaW1wbGVtZW50YXRpb24gdG8gY29sbGVjdCBjbGFzcyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uCisgKgorICovCitwdWJsaWMgY2xhc3MgRGVwZW5kZW5jeVZpc2l0b3IgZXh0ZW5kcyBFbXB0eVZpc2l0b3IgeworICAgIC8qKiBUaGUgY29sbGVjdGQgZGVwZW5kZW5jaWVzICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgZGVwZW5kZW5jaWVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGNsYXNzJ3MgY29uc3RhbnQgcG9vbCAtIHVzZWQgdG8gZGV0ZXJtaW5lIGNsYXNzIG5hbWVzCisgICAgICogZnJvbSBjbGFzcyByZWZlcmVuY2VzLgorICAgICAqLworICAgIHByaXZhdGUgQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVwZW5kZW5jaWVzIGNvbGxlY3RlZCBieSB0aGlzIHZpc2l0b3IKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBFbnVtZXJhdGlvbiBvZiBjbGFzc25hbWVzLCBiZWluZyB0aGUgY2xhc3NlcyB1cG9uIHdoaWNoIHRoZQorICAgICAqICAgICAgdmlzaXRlZCBjbGFzc2VzIGRlcGVuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RGVwZW5kZW5jaWVzKCkgeworICAgICAgICByZXR1cm4gZGVwZW5kZW5jaWVzLmtleXMoKTsKKyAgICB9CisKKyAgICAvKiogQ2xlYXIgdGhlIGN1cnJldG4gc2V0IG9mIGNvbGxlY3RlZCBkZXBlbmRlbmNpZXMuICovCisgICAgcHVibGljIHZvaWQgY2xlYXJEZXBlbmRlbmNpZXMoKSB7CisgICAgICAgIGRlcGVuZGVuY2llcy5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0IHRoZSBjb25zdGFudCBwb29sIG9mIGEgY2xhc3MKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdGFudFBvb2wgdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIHZpc2l0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRDb25zdGFudFBvb2woQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCkgeworICAgICAgICB0aGlzLmNvbnN0YW50UG9vbCA9IGNvbnN0YW50UG9vbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdCBhIGNsYXNzIHJlZmVyZW5jZQorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN0YW50Q2xhc3MgdGhlIGNvbnN0YW50Q2xhc3MgZW50cnkgZm9yIHRoZSBjbGFzcyByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbnN0YW50Q2xhc3MoQ29uc3RhbnRDbGFzcyBjb25zdGFudENsYXNzKSB7CisgICAgICAgIFN0cmluZyBjbGFzc25hbWUKKyAgICAgICAgICAgICA9IGNvbnN0YW50Q2xhc3MuZ2V0Q29uc3RhbnRWYWx1ZShjb25zdGFudFBvb2wpLnRvU3RyaW5nKCk7CisgICAgICAgIGFkZFNsYXNoQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdCBhIG5hbWUgYW5kIHR5cGUgcmVmCisgICAgICoKKyAgICAgKiBMb29rIGZvciBjbGFzcyByZWZlcmVuY2VzIGluIHRoaXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogdGhlIG5hbWUgYW5kIHR5cGUgcmVmZXJlbmNlIGJlaW5nIHZpc2l0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRDb25zdGFudE5hbWVBbmRUeXBlKENvbnN0YW50TmFtZUFuZFR5cGUgb2JqKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gb2JqLmdldE5hbWUoY29uc3RhbnRQb29sKTsKKyAgICAgICAgaWYgKG9iai5nZXRTaWduYXR1cmUoY29uc3RhbnRQb29sKS5lcXVhbHMoIkxqYXZhL2xhbmcvQ2xhc3M7IikKKyAgICAgICAgICAgICAgICAmJiBuYW1lLnN0YXJ0c1dpdGgoImNsYXNzJCIpKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgPSBuYW1lLnN1YnN0cmluZygiY2xhc3MkIi5sZW5ndGgoKSkucmVwbGFjZSgnJCcsICcuJyk7CisgICAgICAgICAgICAvLyBkb2VzIHRoZSBjbGFzcyBoYXZlIGEgcGFja2FnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGludCBpbmRleCA9IGNsYXNzbmFtZS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgc3RhcnQ7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBhY2thZ2Ugc3RydWN0dXJlIGlzIG1vcmUgdGhhbiAxIGxldmVsIGRlZXAKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXgyID0gY2xhc3NuYW1lLmxhc3RJbmRleE9mKCIuIiwgaW5kZXggLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXgyICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIG5hbWUgaGFzIG1vcmUgdGhhbiAxIHBhY2thZ2UgbGV2ZWwgJ2NvbS5jb21wYW55LkNsYXNzJworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGNsYXNzbmFtZS5jaGFyQXQoaW5kZXgyICsgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3MgbmFtZSBoYXMgb25seSAxIHBhY2thZ2UgbGV2ZWwgJ3BhY2thZ2UuQ2xhc3MnCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gY2xhc3NuYW1lLmNoYXJBdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgYW4gaW5uZXIgY2xhc3MgJ2NvbS5jb21wYW55LkNsYXNzJElubmVyJworICAgICAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgICAgICAgICAgaWYgKChzdGFydCA+IDB4NDApICYmIChzdGFydCA8IDB4NUIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGxldHRlciBvZiB0aGUgcHJldmlvdXMgc2VnbWVudCBvZiB0aGUgY2xhc3MgbmFtZSAnQ2xhc3MnCisgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVwcGVyIGNhc2UgYXNjaWkuIHNvIGFjY29yZGluZyB0byB0aGUgc3BlYyBpdCdzIGFuIGlubmVyIGNsYXNzCisgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIiQiCisgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNsYXNzIGluIGRvdHRlZCBub3RhdGlvbiAnY29tLmNvbXBhbnkuQ2xhc3MnCisgICAgICAgICAgICAgICAgICAgIGFkZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQWRkIGEgY2xhc3Mgd2l0aCBubyBwYWNrYWdlICdDbGFzcycKKyAgICAgICAgICAgICAgICBhZGRDbGFzcyhjbGFzc25hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXQgYSBmaWVsZCBvZiB0aGUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIGJlaW5nIHZpc2l0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkKEZpZWxkIGZpZWxkKSB7CisgICAgICAgIGFkZENsYXNzZXMoZmllbGQuZ2V0U2lnbmF0dXJlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0IGEgSmF2YSBjbGFzcworICAgICAqCisgICAgICogQHBhcmFtIGphdmFDbGFzcyB0aGUgY2xhc3MgYmVpbmcgdmlzaXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEphdmFDbGFzcyhKYXZhQ2xhc3MgamF2YUNsYXNzKSB7CisgICAgICAgIGFkZENsYXNzKGphdmFDbGFzcy5nZXRDbGFzc05hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXQgYSBtZXRob2Qgb2YgdGhlIGN1cnJlbnQgY2xhc3MKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZCBiZWluZyB2aXNpdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IG1ldGhvZC5nZXRTaWduYXR1cmUoKTsKKyAgICAgICAgaW50IHBvcyA9IHNpZ25hdHVyZS5pbmRleE9mKCIpIik7CisgICAgICAgIGFkZENsYXNzZXMoc2lnbmF0dXJlLnN1YnN0cmluZygxLCBwb3MpKTsKKyAgICAgICAgYWRkQ2xhc3NlcyhzaWduYXR1cmUuc3Vic3RyaW5nKHBvcyArIDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjbGFzc25hbWUgdG8gdGhlIGxpc3Qgb2YgZGVwZW5kZW5jeSBjbGFzc2VzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBjbGFzcyB0byBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMuCisgICAgICovCisgICAgdm9pZCBhZGRDbGFzcyhTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIGRlcGVuZGVuY2llcy5wdXQoY2xhc3NuYW1lLCBjbGFzc25hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbGwgdGhlIGNsYXNzZXMgZnJvbSBhIGRlc2NyaXB0b3Igc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyB0aGUgZGVzY3JpcHRvciBzdHJpbmcsIGJlaW5nIGRlc2NyaXB0b3JzIHNlcGFyYXRlZCBieQorICAgICAqICAgICAgJzsnIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZENsYXNzZXMoU3RyaW5nIHN0cmluZykgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsICI7Iik7CisgICAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRvciA9IHRva2Vucy5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGludCBwb3MgPSBkZXNjcmlwdG9yLmluZGV4T2YoJ0wnKTsKKyAgICAgICAgICAgIGlmIChwb3MgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhZGRTbGFzaENsYXNzKGRlc2NyaXB0b3Iuc3Vic3RyaW5nKHBvcyArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjbGFzcyBuYW1lIGluIHNsYXNoIGZvcm1hdAorICAgICAqIChmb3IgZXhhbXBsZSBvcmcvYXBhY2hlL3Rvb2xzL2FudC9NYWluKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgdGhlIGNsYXNzIG5hbWUgaW4gc2xhc2ggZm9ybWF0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFNsYXNoQ2xhc3MoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgICAgICBhZGRDbGFzcyhjbGFzc25hbWUucmVwbGFjZSgnLycsICcuJykpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvYmNlbC9GdWxsQW5hbHl6ZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL2JjZWwvRnVsbEFuYWx5emVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0YTg1YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL2JjZWwvRnVsbEFuYWx5emVyLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5kZXBlbmQuYmNlbDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuYmNlbC5jbGFzc2ZpbGUuQ2xhc3NQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5EZXNjZW5kaW5nVmlzaXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLkphdmFDbGFzczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZC5BYnN0cmFjdEFuYWx5emVyOworCisvKioKKyAqIEFuIGFuYWx5emVyIGNhcGFibGUgZm8gdHJhdmVyc2luZyBhbGwgY2xhc3MgLSBjbGFzcyByZWxhdGlvbnNoaXBzLgorICoKKyAqLworcHVibGljIGNsYXNzIEZ1bGxBbmFseXplciBleHRlbmRzIEFic3RyYWN0QW5hbHl6ZXIgeworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIENhdXNlcyB0aGUgQkNFTCBjbGFzc2VzIHRvIGxvYWQgdG8gZW5zdXJlIEJDRUwgZGVwZW5kZW5jaWVzIGNhbgorICAgICAqIGJlIHNhdGlzZmllZAorICAgICAqLworICAgIHB1YmxpYyBGdWxsQW5hbHl6ZXIoKSB7CisgICAgICAgIC8vIGZvcmNlIEJDRUwgY2xhc3NlcyB0byBsb2FkIG5vdworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IENsYXNzUGFyc2VyKCJmb3JjZSIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBjb25maWd1cmVkIHJvb3QgY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlcyBhIHZlY3RvciB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgZmlsZXMgd2hpY2ggY29udGFpbgorICAgICAqICAgICAgdGhlIGRlcGVuZGVuY3kgY2xhc3NlcworICAgICAqIEBwYXJhbSBjbGFzc2VzIGEgdmVjdG9yIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBuYW1lcyBvZiB0aGUKKyAgICAgKiAgICAgIGRlcGVuY2VuY3kgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXRlcm1pbmVEZXBlbmRlbmNpZXMoVmVjdG9yIGZpbGVzLCBWZWN0b3IgY2xhc3NlcykgeworICAgICAgICAvLyB3ZSBnZXQgdGhlIHJvb3QgY2xhc3NlcyBhbmQgYnVpbGQgdXAgYSBzZXQgb2YKKyAgICAgICAgLy8gY2xhc3NlcyB1cG9uIHdoaWNoIHRoZXkgZGVwZW5kCisgICAgICAgIEhhc2h0YWJsZSBkZXBlbmRlbmNpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIEhhc2h0YWJsZSBjb250YWluZXJzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBIYXNodGFibGUgdG9BbmFseXplID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBnZXRSb290Q2xhc3NlcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIHRvQW5hbHl6ZS5wdXQoY2xhc3NuYW1lLCBjbGFzc25hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgaW50IG1heENvdW50ID0gaXNDbG9zdXJlUmVxdWlyZWQoKSA/IE1BWF9MT09QUyA6IDI7CisgICAgICAgIHdoaWxlICh0b0FuYWx5emUuc2l6ZSgpICE9IDAgJiYgY291bnQrKyA8IG1heENvdW50KSB7CisgICAgICAgICAgICBEZXBlbmRlbmN5VmlzaXRvciBkZXBlbmRlbmN5VmlzaXRvciA9IG5ldyBEZXBlbmRlbmN5VmlzaXRvcigpOworICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gdG9BbmFseXplLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXQoY2xhc3NuYW1lLCBjbGFzc25hbWUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgY29udGFpbmVyID0gZ2V0Q2xhc3NDb250YWluZXIoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250YWluZXJzLnB1dChjb250YWluZXIsIGNvbnRhaW5lcik7CisKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIgPSBuZXcgQ2xhc3NQYXJzZXIoY29udGFpbmVyLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIgPSBuZXcgQ2xhc3NQYXJzZXIoY29udGFpbmVyLmdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gcGFyc2VyLnBhcnNlKCk7CisgICAgICAgICAgICAgICAgICAgIERlc2NlbmRpbmdWaXNpdG9yIHRyYXZlcnNlcgorICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IERlc2NlbmRpbmdWaXNpdG9yKGphdmFDbGFzcywgZGVwZW5kZW5jeVZpc2l0b3IpOworICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZXIudmlzaXQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b0FuYWx5emUuY2xlYXIoKTsKKworICAgICAgICAgICAgLy8gbm93IHJlY292ZXIgYWxsIHRoZSBkZXBlbmRlbmNpZXMgY29sbGVjdGVkIGFuZCBhZGQgdG8gdGhlIGxpc3QuCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBkZXBzRW51bSA9IGRlcGVuZGVuY3lWaXNpdG9yLmdldERlcGVuZGVuY2llcygpOworICAgICAgICAgICAgd2hpbGUgKGRlcHNFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGRlcHNFbnVtLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKCFkZXBlbmRlbmNpZXMuY29udGFpbnNLZXkoY2xhc3NOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0b0FuYWx5emUucHV0KGNsYXNzTmFtZSwgY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaWxlcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBjb250YWluZXJzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgIGZpbGVzLmFkZEVsZW1lbnQoKEZpbGUpIGUubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBjbGFzc2VzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGRlcGVuZGVuY2llcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBjbGFzc2VzLmFkZEVsZW1lbnQoKFN0cmluZykgZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIGlmIHRoaXMgYW5hbHl6ZXIgY2FuIGRldGVybWluZSBkZXBlbmRlbnQgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFuYWx5emVyIHByb3ZpZGVzIGRlcGVuZGVuY3kgZmlsZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0ZpbGVEZXBlbmRlbmNpZXMoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvRmFjYWRlVGFza0hlbHBlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvRmFjYWRlVGFza0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDM1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2ZhY2FkZS9GYWNhZGVUYXNrSGVscGVyLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3IgZmFjYWRlIGltcGxlbWVudGF0aW9ucyAtIGVuY2Fwc3VsYXRlcyB0cmVhdG1lbnQgb2YKKyAqIGV4cGxpY2l0IGltcGxlbWVudGF0aW9uIGNob2ljZXMsIG1hZ2ljIHByb3BlcnRpZXMgYW5kCisgKiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICoKKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgY2xhc3MgRmFjYWRlVGFza0hlbHBlciB7CisKKyAgICAvKioKKyAgICAgKiBDb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIGFyZ3MgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXhwbGljaXRseSBjaG9zZW4gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckNob2ljZTsKKworICAgIC8qKgorICAgICAqIFRoZSBtYWdpYyBwcm9wZXJ0eSB0byBjb25zdWx0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1hZ2ljVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW1wbGVtZW50YXRpb24uCisgICAgICogTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmFjYWRlVGFza0hlbHBlcihTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHRoaXMoZGVmYXVsdFZhbHVlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW1wbGVtZW50YXRpb24uCisgICAgICogTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gbWFnaWNWYWx1ZSB0aGUgdmFsdWUgb2YgYSBtYWdpYyBwcm9wZXJ0eSB0aGF0IG1heSBob2xkIGEgdXNlci4KKyAgICAgKiBjaG9pY2UuICBNYXkgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmFjYWRlVGFza0hlbHBlcihTdHJpbmcgZGVmYXVsdFZhbHVlLCBTdHJpbmcgbWFnaWNWYWx1ZSkgeworICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgdGhpcy5tYWdpY1ZhbHVlID0gbWFnaWNWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIG1hZ2ljIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBtYWdpY1ZhbHVlIHRoZSB2YWx1ZSBvZiBhIG1hZ2ljIHByb3BlcnR5IHRoYXQgbWF5IGhvbGQgYSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hZ2ljVmFsdWUoU3RyaW5nIG1hZ2ljVmFsdWUpIHsKKyAgICAgICAgdGhpcy5tYWdpY1ZhbHVlID0gbWFnaWNWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGZvciBleHBsaWNpdCB1c2VyIGNob2ljZXMuCisgICAgICogQHBhcmFtIHVzZXJDaG9pY2UgdGhlIGV4cGxpY2l0bHkgY2hvc2VuIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uKFN0cmluZyB1c2VyQ2hvaWNlKSB7CisgICAgICAgIHRoaXMudXNlckNob2ljZSA9IHVzZXJDaG9pY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uKCkgeworICAgICAgICByZXR1cm4gdXNlckNob2ljZSAhPSBudWxsID8gdXNlckNob2ljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKG1hZ2ljVmFsdWUgIT0gbnVsbCA/IG1hZ2ljVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0VmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZXhwbGljaXQgdXNlciBjaG9pY2UuCisgICAgICogQHJldHVybiB0aGUgZXhwbGljaXQgdXNlciBjaG9pY2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBsaWNpdENob2ljZSgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJDaG9pY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbWFuZCBsaW5lIGFyZ3VtZW50LgorICAgICAqIEBwYXJhbSBhcmcgYW4gYXJndW1lbnQgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEltcGxlbWVudGF0aW9uQXJndW1lbnQoSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IGFyZykgeworICAgICAgICBhcmdzLmFkZEVsZW1lbnQoYXJnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQKKyAgICAgKiBmYWNhZGUgaW1wbGVtZW50YXRpb24uCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjb21tYW5kIGxpbmUgYXJndWVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXJncygpIHsKKyAgICAgICAgVmVjdG9yIHRtcCA9IG5ldyBWZWN0b3IoYXJncy5zaXplKCkpOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBhcmdzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgYXJnID0KKyAgICAgICAgICAgICAgICAoKEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCkgZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGN1cnIgPSBhcmcuZ2V0UGFydHMoZ2V0SW1wbGVtZW50YXRpb24oKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0bXAuYWRkRWxlbWVudChjdXJyW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSByZXMgPSBuZXcgU3RyaW5nW3RtcC5zaXplKCldOworICAgICAgICB0bXAuY29weUludG8ocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBjaG9zZW4gYnkgdGhlIHVzZXIKKyAgICAgKiAoZWl0aGVyIHZpYSBhIG1hZ2ljIHByb3BlcnR5IG9yIGV4cGxpY2l0bHkuCisgICAgICogQHJldHVybiB0cnVlIGlmIG1hZ2ljIG9yIHVzZXIgY2hvaWNlIGhhcyBiZSBzZXQuCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0JlZW5TZXQoKSB7CisgICAgICAgIHJldHVybiB1c2VyQ2hvaWNlICE9IG51bGwgfHwgbWFnaWNWYWx1ZSAhPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyYjgzOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworCisvKioKKyAqIEV4dGVuc2lvbiBvZiBDb21tYW5kbGluZS5Bcmd1bWVudCB3aXRoIGEgbmV3IGF0dHJpYnV0ZSB0aGF0IGNob3NlcworICogYSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmFjYWRlLgorICoKKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgY2xhc3MgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IGV4dGVuZHMgQ29tbWFuZGxpbmUuQXJndW1lbnQgeworICAgIHByaXZhdGUgU3RyaW5nIGltcGw7CisKKyAgICAvKiogQ29uc3RydWN0b3IgZm9yIEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudC4gKi8KKyAgICBwdWJsaWMgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50KCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW1wbGVtZW50YXRpb24gdGhpcyBhcmd1bWVudCBpcyBmb3IuCisgICAgICogQHBhcmFtIGltcGwgdGhlIGltcGxlbWVudGF0aW9uIHRoaXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGlzIGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvbihTdHJpbmcgaW1wbCkgeworICAgICAgICB0aGlzLmltcGwgPSBpbXBsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFydHMgdGhpcyBBcmd1bWVudCBjb25zaXN0cyBvZiwgaWYgdGhlCisgICAgICogaW1wbGVtZW50YXRpb24gbWF0Y2hlcyB0aGUgY2hvc2VuIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQjZ2V0UGFydHMoKQorICAgICAqIEBwYXJhbSBjaG9zZW5JbXBsIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBjaGVjayBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdGhlIHBhcnRzIGlmIHRoZSBpbXBsZW1lbnRpb24gbWF0Y2hlcyBvciBhbiB6ZXJvIGxlbmd0aAorICAgICAqICAgICAgICAgYXJyYXkgaWYgbm90LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmdbXSBnZXRQYXJ0cyhTdHJpbmcgY2hvc2VuSW1wbCkgeworICAgICAgICBpZiAoaW1wbCA9PSBudWxsIHx8IGltcGwuZXF1YWxzKGNob3NlbkltcGwpKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFydHMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9qYXZhMTUvUHJveHlEaWFnbm9zdGljcy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9qYXZhMTUvUHJveHlEaWFnbm9zdGljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZTY1N2QKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2phdmExNS9Qcm94eURpYWdub3N0aWNzLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmphdmExNTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5uZXQuUHJveHlTZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlByb3h5OworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgZXhpc3RzIHRvIGNyZWF0ZSBhIHN0cmluZyB0aGF0IHRlbGxzIGRpYWdub3N0aWNzIGFib3V0IHRoZSBjdXJyZW50CisgKiBzdGF0ZSBvZiBwcm94eSBkaWFnbm9zdGljcy4KKyAqIEl0IGRvZXMgdGhpcyBpbiBpdHMgdG9TdHJpbmcgb3BlcmF0b3IuCisgKiBKYXZhMS41KyBpcyBuZWVkZWQgdG8gY29tcGlsZSB0aGlzIGNsYXNzOyBpdHMgaW50ZXJmYWNlIGlzIGNsYXNzaWMgdHlwZWxlc3MKKyAqIEphdmEuCisgKiBAc2luY2UgQW50IDEuNworICovCitwdWJsaWMgY2xhc3MgUHJveHlEaWFnbm9zdGljcyB7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZXN0aW5hdGlvbjsKKworICAgIHByaXZhdGUgVVJJIGRlc3RVUkk7CisKKyAgICAvKioge0B2YWx1ZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RFU1RJTkFUSU9OID0gImh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iOworCisgICAgLyoqCisgICAgICogY3JlYXRlIGEgZGlhZ25vc3RpY3MgYmluZGluZyBmb3IgYSBzcGVjaWZpYyBVUkkKKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gZGVzdCB0byBiaW5kIHRvCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgVVJJIGlzIG1hbGZvcm1lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJveHlEaWFnbm9zdGljcyhTdHJpbmcgZGVzdGluYXRpb24pIHsKKyAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5kZXN0VVJJID0gbmV3IFVSSShkZXN0aW5hdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGUgYSBwcm94eSBkaWFnbm9zdGljcyB0b29sIGJvdW5kIHRvCisgICAgICoge0BsaW5rICNERUZBVUxUX0RFU1RJTkFUSU9OfQorICAgICAqLworICAgIHB1YmxpYyBQcm94eURpYWdub3N0aWNzKCkgeworICAgICAgICB0aGlzKERFRkFVTFRfREVTVElOQVRJT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGlhZ25vc3RpY3MgZm9yIHByb3h5IGluZm9ybWF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFByb3h5U2VsZWN0b3Igc2VsZWN0b3IgPSBQcm94eVNlbGVjdG9yLmdldERlZmF1bHQoKTsKKyAgICAgICAgTGlzdCBsaXN0ID0gc2VsZWN0b3Iuc2VsZWN0KGRlc3RVUkkpOworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBJdGVyYXRvciBwcm94aWVzID0gbGlzdC5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHByb3hpZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBQcm94eSBwcm94eSA9IChQcm94eSkgcHJveGllcy5uZXh0KCk7CisgICAgICAgICAgICBTb2NrZXRBZGRyZXNzIGFkZHJlc3MgPSBwcm94eS5hZGRyZXNzKCk7CisgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiRGlyZWN0IGNvbm5lY3Rpb25cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByb3h5LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzIGluc3RhbmNlb2YgSW5ldFNvY2tldEFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgaW5hID0gKEluZXRTb2NrZXRBZGRyZXNzKSBhZGRyZXNzOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW5hLmdldEhvc3ROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW5hLmdldFBvcnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmEuaXNVbnJlc29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBbdW5yZXNvbHZlZF0iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBpbmEuZ2V0QWRkcmVzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIFsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYWRkci5nZXRIb3N0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ10nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9KYXZheFNjcmlwdFJ1bm5lci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9KYXZheFNjcmlwdFJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTk1MzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL0phdmF4U2NyaXB0UnVubmVyLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlNjcmlwdFJ1bm5lckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZWZsZWN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlZmxlY3RXcmFwcGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBydW4gc2NyaXB0cyB1c2luZyBKU1IgMjIzLgorICogQHNpbmNlIEFudCAxLjcuMAorICovCitwdWJsaWMgY2xhc3MgSmF2YXhTY3JpcHRSdW5uZXIgZXh0ZW5kcyBTY3JpcHRSdW5uZXJCYXNlIHsKKyAgICBwcml2YXRlIFJlZmxlY3RXcmFwcGVyIGVuZ2luZTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgbWFuYWdlciBwcmVmaXguCisgICAgICogQHJldHVybiAiamF2YXgiCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNYW5hZ2VyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJqYXZheCI7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMYW5ndWFnZSgpIHsKKyAgICAgICAgaWYgKGVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0xhbmd1YWdlKCk7CisgICAgICAgIENsYXNzTG9hZGVyIG9yaWdMb2FkZXIgPSByZXBsYWNlQ29udGV4dExvYWRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVuZ2luZSgpICE9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVzdG9yZUNvbnRleHRMb2FkZXIob3JpZ0xvYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgd29yayB0byBydW4gdGhlIHNjcmlwdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGVjTmFtZSB0aGUgbmFtZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBzY3JpcHRpbmcgZW5naW5lIGZvciB0aGlzIHNjcmlwdCBleGVjdXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aW5nIGdvZXMgd3JvbmcgZXhlY3R1aW5nIHRoZSBzY3JpcHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZVNjcmlwdChTdHJpbmcgZXhlY05hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGV2YWx1YXRlU2NyaXB0KGV4ZWNOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgd29yayB0byBldmFsIHRoZSBzY3JpcHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhlY05hbWUgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgc2NyaXB0aW5nIGVuZ2luZSBmb3IgdGhpcyBzY3JpcHQgZXhlY3V0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZXhlY3V0aW5nIHRoZSBzY3JpcHQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZVNjcmlwdChTdHJpbmcgZXhlY05hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTGFuZ3VhZ2UoKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgb3JpZ0xvYWRlciA9IHJlcGxhY2VDb250ZXh0TG9hZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZWZsZWN0V3JhcHBlciBlbmdpbmUgPSBjcmVhdGVFbmdpbmUoKTsKKyAgICAgICAgICAgIGlmIChlbmdpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgamF2YXggc2NyaXB0IGVuZ2luZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIGdldExhbmd1YWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0QmVhbnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0QmVhbnMoKS5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoIkZYIi5lcXVhbHNJZ25vcmVDYXNlKGdldExhbmd1YWdlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGVuZ2luZS5pbnZva2UoCisgICAgICAgICAgICAgICAgICAgICAgICAicHV0IiwgU3RyaW5nLmNsYXNzLCBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjoiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW52b2tlKAorICAgICAgICAgICAgICAgICAgICAgICAgInB1dCIsIFN0cmluZy5jbGFzcywga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmNsYXNzLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgc2NyaXB0CisgICAgICAgICAgICByZXR1cm4gZW5naW5lLmludm9rZSgiZXZhbCIsIFN0cmluZy5jbGFzcywgZ2V0U2NyaXB0KCkpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgLy9jYXRjaCBhbmQgcmV0aHJvdyBidWlsZCBleGNlcHRpb25zCisgICAgICAgICAgICB0aHJvdyBiZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAvL2FueSBvdGhlciBleGNlcHRpb24/IEdldCBpdHMgY2F1c2UKKyAgICAgICAgICAgIFRocm93YWJsZSB0ID0gYmU7CisgICAgICAgICAgICBUaHJvd2FibGUgdGUgPSAoVGhyb3dhYmxlKSBSZWZsZWN0VXRpbC5pbnZva2UoYmUsICJnZXRDYXVzZSIpOworICAgICAgICAgICAgaWYgKHRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAgKHRlIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSB0ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ID0gdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVzdG9yZUNvbnRleHRMb2FkZXIob3JpZ0xvYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFJlZmxlY3RXcmFwcGVyIGNyZWF0ZUVuZ2luZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZW5naW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CisgICAgICAgIH0KKyAgICAgICAgUmVmbGVjdFdyYXBwZXIgbWFuYWdlciA9IG5ldyBSZWZsZWN0V3JhcHBlcigKKyAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgImphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVNYW5hZ2VyIik7CisgICAgICAgIE9iamVjdCBlID0gbWFuYWdlci5pbnZva2UoCisgICAgICAgICAgICAiZ2V0RW5naW5lQnlOYW1lIiwgU3RyaW5nLmNsYXNzLCBnZXRMYW5ndWFnZSgpKTsKKyAgICAgICAgaWYgKGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgUmVmbGVjdFdyYXBwZXIgcmV0ID0gbmV3IFJlZmxlY3RXcmFwcGVyKGUpOworICAgICAgICBpZiAoZ2V0S2VlcEVuZ2luZSgpKSB7CisgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IHJldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvTm9FeGl0U2VjdXJpdHlNYW5hZ2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL05vRXhpdFNlY3VyaXR5TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDNhZDEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL05vRXhpdFNlY3VyaXR5TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGl0RXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgaXMgaW50ZW5kZWQgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIGRlZmF1bHQgc3lzdGVtIG1hbmFnZXIuCisgKiBUaGUgZ29hbCBpcyB0byBpbnRlcmNlcHQgU3lzdGVtLmV4aXQgY2FsbHMgYW5kIG1ha2UgaXQgdGhyb3cgYW4KKyAqIGV4Y2VwdGlvbiBpbnN0ZWFkIHNvIHRoYXQgYSBTeXN0ZW0uZXhpdCBpbiBhIHRhc2sgZG9lcyBub3QKKyAqIGZ1bGx5IHRlcm1pbmF0ZSBBbnQuCisgKgorICogQHNlZSBFeGl0RXhjZXB0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBOb0V4aXRTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgeworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrRXhpdC4KKyAgICAgKiBUaGlzIHRocm93cyBhbiBFeGl0RXhjZXB0aW9uKHN0YXR1cykgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGV4aXQgc3RhdHVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hlY2tFeGl0KGludCBzdGF0dXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4aXRFeGNlcHRpb24oc3RhdHVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSBTZWN1cml0eU1hbmFnZXIjY2hlY2tQZXJtaXNzaW9uLgorICAgICAqIFRoaXMgZG9lcyBub3RoaW5nLgorICAgICAqIEBwYXJhbSBwZXJtIHRoZSByZXF1ZXN0ZWQgcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtKSB7CisgICAgICAgIC8vIG5vIHBlcm1pc3Npb24gaGVyZQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvU2NyaXB0UnVubmVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL1NjcmlwdFJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjZlNmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL1NjcmlwdFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZFbmdpbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlZmxlY3RVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU2NyaXB0UnVubmVyQmFzZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcnVuIEJTRiBzY3JpcHRzCisgKgorICovCitwdWJsaWMgY2xhc3MgU2NyaXB0UnVubmVyIGV4dGVuZHMgU2NyaXB0UnVubmVyQmFzZSB7CisgICAgLy8gUmVnaXN0ZXIgR3Jvb3Z5IG91cnNlbHZlcywgc2luY2UgQlNGIGRpZCBub3QKKyAgICAvLyBuYXRpdmVseSBzdXBwb3J0IGl0IGluIHZlcnNpb25zIHByZXZpb3VzIHRvIDEuMi40LgorICAgIHN0YXRpYyB7CisgICAgICAgIEJTRk1hbmFnZXIucmVnaXN0ZXJTY3JpcHRpbmdFbmdpbmUoCisgICAgICAgICAgICAiZ3Jvb3Z5IiwKKyAgICAgICAgICAgICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJzZi5Hcm9vdnlFbmdpbmUiLAorICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiZ3Jvb3Z5IiwgImd5In0pOworICAgIH0KKworICAgIHByaXZhdGUgQlNGRW5naW5lICBlbmdpbmU7CisgICAgcHJpdmF0ZSBCU0ZNYW5hZ2VyIG1hbmFnZXI7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG1hbmFnZXIgcHJlZml4LgorICAgICAqIEByZXR1cm4gImJzZiIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hbmFnZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gImJzZiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYnNmIHN1cHBvcnRzIHRoZSBsYW5ndWFnZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYnNmIGNhbiBjcmVhdGUgYW4gZW5naW5lIGZvciB0aGlzIGxhbmd1YWdlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTGFuZ3VhZ2UoKSB7CisgICAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IChIYXNodGFibGUpIFJlZmxlY3RVdGlsLmdldEZpZWxkKAorICAgICAgICAgICAgbmV3IEJTRk1hbmFnZXIoKSwgInJlZ2lzdGVyZWRFbmdpbmVzIik7CisgICAgICAgIFN0cmluZyBlbmdpbmVDbGFzc05hbWUgPSAoU3RyaW5nKSB0YWJsZS5nZXQoZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgIGlmIChlbmdpbmVDbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygKKyAgICAgICAgICAgICAgICAiVGhpcyBpcyBubyBCU0YgZW5naW5lIGNsYXNzIGZvciBsYW5ndWFnZSAnIgorICAgICAgICAgICAgICAgICsgZ2V0TGFuZ3VhZ2UoKSArICInIiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0U2NyaXB0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZW5naW5lQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coCisgICAgICAgICAgICAgICAgInVuYWJsZSB0byBjcmVhdGUgQlNGIGVuZ2luZSBjbGFzcyBmb3IgbGFuZ3VhZ2UgJyIKKyAgICAgICAgICAgICAgICArIGdldExhbmd1YWdlKCkgKyAiJyIsCisgICAgICAgICAgICAgICAgZXgsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEbyB0aGUgd29yay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGVjTmFtZSB0aGUgbmFtZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIEJTRiBmb3IgdGhpcyBzY3JpcHQgZXhlY3V0aW9uLgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZXhlY3V0aW5nIHRoZSBzY3JpcHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZVNjcmlwdChTdHJpbmcgZXhlY05hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTGFuZ3VhZ2UoKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgb3JpZ0xvYWRlciA9IHJlcGxhY2VDb250ZXh0TG9hZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCU0ZNYW5hZ2VyIG0gPSBjcmVhdGVNYW5hZ2VyKCk7CisgICAgICAgICAgICBkZWNsYXJlQmVhbnMobSk7CisgICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBzY3JpcHQKKyAgICAgICAgICAgIGlmIChlbmdpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG0uZXhlYyhnZXRMYW5ndWFnZSgpLCBleGVjTmFtZSwgMCwgMCwgZ2V0U2NyaXB0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbmdpbmUuZXhlYyhleGVjTmFtZSwgMCwgMCwgZ2V0U2NyaXB0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChCU0ZFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIHRocm93IGdldEJ1aWxkRXhjZXB0aW9uKGJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlc3RvcmVDb250ZXh0TG9hZGVyKG9yaWdMb2FkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZhbHVhdGUgdGhlIHNjcmlwdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGVjTmFtZSB0aGUgbmFtZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIEJTRiBmb3IgdGhpcyBzY3JpcHQgZXhlY3V0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXZhbHVhdGlvbgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZXhlY3V0aW5nIHRoZSBzY3JpcHQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZVNjcmlwdChTdHJpbmcgZXhlY05hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTGFuZ3VhZ2UoKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgb3JpZ0xvYWRlciA9IHJlcGxhY2VDb250ZXh0TG9hZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCU0ZNYW5hZ2VyIG0gPSBjcmVhdGVNYW5hZ2VyKCk7CisgICAgICAgICAgICBkZWNsYXJlQmVhbnMobSk7CisgICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBzY3JpcHQKKyAgICAgICAgICAgIGlmIChlbmdpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtLmV2YWwoZ2V0TGFuZ3VhZ2UoKSwgZXhlY05hbWUsIDAsIDAsIGdldFNjcmlwdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlbmdpbmUuZXZhbChleGVjTmFtZSwgMCwgMCwgZ2V0U2NyaXB0KCkpOworICAgICAgICB9IGNhdGNoIChCU0ZFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIHRocm93IGdldEJ1aWxkRXhjZXB0aW9uKGJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlc3RvcmVDb250ZXh0TG9hZGVyKG9yaWdMb2FkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0L2NyZWF0ZSBhIEJ1aWxkRXhjZXB0aW9uIGZyb20gYSBCU0ZFeGNlcHRpb24uCisgICAgICogQHBhcmFtIGJlIEJTRkV4Y2VwdGlvbiB0byBjb252ZXJ0LgorICAgICAqIEByZXR1cm4gQnVpbGRFeGNlcHRpb24gdGhlIGNvbnZlcnRlZCBleGNlcHRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBCdWlsZEV4Y2VwdGlvbiBnZXRCdWlsZEV4Y2VwdGlvbihCU0ZFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgVGhyb3dhYmxlIHQgPSBiZTsKKyAgICAgICAgVGhyb3dhYmxlIHRlID0gYmUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgIGlmICh0ZSBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKEJ1aWxkRXhjZXB0aW9uKSB0ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKHRlID09IG51bGwgPyB0IDogdGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWNsYXJlQmVhbnMoQlNGTWFuYWdlciBtKSB0aHJvd3MgQlNGRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0QmVhbnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldEJlYW5zKCkuZ2V0KGtleSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG0uZGVjbGFyZUJlYW4oa2V5LCB2YWx1ZSwgdmFsdWUuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJTRiB1c2VzIGEgaGFzaHRhYmxlIHRvIHN0b3JlIHZhbHVlcworICAgICAgICAgICAgICAgIC8vIHNvIGNhbm5vdCBkZWNsYXJlQmVhbiB3aXRoIGEgbnVsbCB2YWx1ZQorICAgICAgICAgICAgICAgIC8vIFNvIG5lZWQgdG8gcmVtb3ZlIGFueSBiZWFuIG9mIHRoaXMgbmFtZSBhcworICAgICAgICAgICAgICAgIC8vIHRoYXQgYmVhbiBzaG91bGQgbm90IGJlIHZpc2libGUKKyAgICAgICAgICAgICAgICBtLnVuZGVjbGFyZUJlYW4oa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQlNGTWFuYWdlciBjcmVhdGVNYW5hZ2VyKCkgdGhyb3dzIEJTRkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyOworICAgICAgICB9CisgICAgICAgIEJTRk1hbmFnZXIgbSA9IG5ldyBCU0ZNYW5hZ2VyKCk7CisgICAgICAgIG0uc2V0Q2xhc3NMb2FkZXIoZ2V0U2NyaXB0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIGlmIChnZXRLZWVwRW5naW5lKCkpIHsKKyAgICAgICAgICAgIEJTRkVuZ2luZSBlID0gbWFuYWdlci5sb2FkU2NyaXB0aW5nRW5naW5lKGdldExhbmd1YWdlKCkpOworICAgICAgICAgICAgdGhpcy5tYW5hZ2VyID0gbTsKKyAgICAgICAgICAgIHRoaXMuZW5naW5lICA9IGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9XZWFraXNoUmVmZXJlbmNlMTIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvV2Vha2lzaFJlZmVyZW5jZTEyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkMTI3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvV2Vha2lzaFJlZmVyZW5jZTEyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLldlYWtpc2hSZWZlcmVuY2U7CisKKy8qKgorICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0aGF0IHJlYWxseSBpcyBpcyBXZWFrLCBhcyBpdCB1c2VzIHRoZQorICogYXBwcm9wcmlhdGUgamF2YS5sYW5nLnJlZiBjbGFzcy4KKyAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNy4KKyAqICAgICAgICAgICAgIEp1c3QgdXNlIHtAbGluayBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2V9IGRpcmVjdGx5LgorICogTm90ZSB0aGF0IGluIGFudDEuNyBpcyBwYXJlbnQgd2FzIGNoYW5nZWQgdG8gZXh0ZW5kIEhhcmRSZWZlcmVuY2UuCisgKiBUaGlzIGlzIGJlY2F1c2UgdGhlIGxhdHRlciBoYXMgYWNjZXNzIHRvIHRoZSAocGFja2FnZSBzY29wZWQpCisgKiBXZWFraXNoUmVmZXJlbmNlKE9iamVjdCkgY29uc3RydWN0b3IsIGFuZCBib3RoIHRoYXQgYW5kIHRoaXMgYXJlIHRoaW4KKyAqIGZhY2FkZXMgb24gdGhlIHVuZGVybHlpbmcgbm8tbG9uZ2VyLWFic3RyYWN0IGJhc2UgY2xhc3MuCisgKi8KK3B1YmxpYyBjbGFzcyBXZWFraXNoUmVmZXJlbmNlMTIgZXh0ZW5kcyBXZWFraXNoUmVmZXJlbmNlLkhhcmRSZWZlcmVuY2UgIHsKKworCisgICAgLyoqCisgICAgICogY3JlYXRlIGEgbmV3IHNvZnQgcmVmZXJlbmNlLCB3aGljaCBpcyBib3VuZCB0byBhCisgICAgICogV2VhayByZWZlcmVuY2UgaW5zaWRlCisgICAgICogQHBhcmFtIHJlZmVyZW5jZSB0aGUgb2JqZWN0IHRvIHJlZmVyZW5jZS4KKyAgICAgKiBAc2VlIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyBXZWFraXNoUmVmZXJlbmNlMTIoT2JqZWN0IHJlZmVyZW5jZSkgeworICAgICAgICBzdXBlcihyZWZlcmVuY2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9NYXRjaGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvTWF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDllOTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvTWF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguTWF0Y2hSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5vcm8udGV4dC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGVybDVDb21waWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4LlBlcmw1TWF0Y2hlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBSZWdleHBNYXRjaGVyIGZvciBKYWthcnRhLU9STy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKYWthcnRhT3JvTWF0Y2hlciBpbXBsZW1lbnRzIFJlZ2V4cE1hdGNoZXIgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBmaW5hbCBQZXJsNUNvbXBpbGVyIGNvbXBpbGVyID0gbmV3IFBlcmw1Q29tcGlsZXIoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUGVybDVNYXRjaGVyIG1hdGNoZXIgPSBuZXcgUGVybDVNYXRjaGVyKCk7CisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBKYWthcnRhT3JvTWF0Y2hlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmFrYXJ0YU9yb01hdGNoZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWdleHAgcGF0dGVybiBmcm9tIHRoZSBTdHJpbmcgZGVzY3JpcHRpb24uCisgICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gbWF0Y2gKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWdleHAgcGF0dGVybgorICAgICAqIEByZXR1cm4gdGhlIHBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4cCBwYXR0ZXJuCisgICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21waWxlZCBwYXR0ZXJuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHByb3RlY3RlZCBQYXR0ZXJuIGdldENvbXBpbGVkUGF0dGVybihpbnQgb3B0aW9ucykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGNvbXBpbGVyIG9wdGlvbnMgYmFzZWQgb24gdGhlIGlucHV0IG9wdGlvbnMgZmlyc3QKKyAgICAgICAgICAgIFBhdHRlcm4gcCA9IGNvbXBpbGVyLmNvbXBpbGUocGF0dGVybiwgZ2V0Q29tcGlsZXJPcHRpb25zKG9wdGlvbnMpKTsKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgZ2l2ZW4gYXJndW1lbnQgbWF0Y2ggdGhlIHBhdHRlcm4gdXNpbmcgZGVmYXVsdCBvcHRpb25zPworICAgICAqIEBwYXJhbSBhcmd1bWVudCB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoZXMoYXJndW1lbnQsIE1BVENIX0RFRkFVTFQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvZXMgdGhlIGdpdmVuIGFyZ3VtZW50IG1hdGNoIHRoZSBwYXR0ZXJuPworICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyB0aGUgcmVnZXggb3B0aW9ucyB0byB1c2UKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBpbnB1dCwgaW50IG9wdGlvbnMpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdHRlcm4gcCA9IGdldENvbXBpbGVkUGF0dGVybihvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIG1hdGNoZXIuY29udGFpbnMoaW5wdXQsIHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBWZWN0b3Igb2YgbWF0Y2hlZCBncm91cHMgZm91bmQgaW4gdGhlIGFyZ3VtZW50CisgICAgICogdXNpbmcgZGVmYXVsdCBvcHRpb25zLgorICAgICAqCisgICAgICogPHA+R3JvdXAgMCB3aWxsIGJlIHRoZSBmdWxsIG1hdGNoLCB0aGUgcmVzdCBhcmUgdGhlCisgICAgICogcGFyZW50aGVzaXplZCBzdWJleHByZXNzaW9uczwvcD4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJndW1lbnQgdGhlIHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0CisgICAgICogQHJldHVybiB0aGUgdmVjdG9yIG9mIGdyb3VwcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgVmVjdG9yIGdldEdyb3VwcyhTdHJpbmcgYXJndW1lbnQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRHcm91cHMoYXJndW1lbnQsIE1BVENIX0RFRkFVTFQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBWZWN0b3Igb2YgbWF0Y2hlZCBncm91cHMgZm91bmQgaW4gdGhlIGFyZ3VtZW50LgorICAgICAqCisgICAgICogPHA+R3JvdXAgMCB3aWxsIGJlIHRoZSBmdWxsIG1hdGNoLCB0aGUgcmVzdCBhcmUgdGhlCisgICAgICogcGFyZW50aGVzaXplZCBzdWJleHByZXNzaW9uczwvcD4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0CisgICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIHJlZ2V4IG9wdGlvbnMgdG8gdXNlCisgICAgICogQHJldHVybiB0aGUgdmVjdG9yIG9mIGdyb3VwcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgVmVjdG9yIGdldEdyb3VwcyhTdHJpbmcgaW5wdXQsIGludCBvcHRpb25zKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoIW1hdGNoZXMoaW5wdXQsIG9wdGlvbnMpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgTWF0Y2hSZXN1bHQgbXIgPSBtYXRjaGVyLmdldE1hdGNoKCk7CisgICAgICAgIGludCBjbnQgPSBtci5ncm91cHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG1hdGNoID0gbXIuZ3JvdXAoaSk7CisgICAgICAgICAgICAvLyB0cmVhdCBub24tbWF0Y2hpbmcgZ3JvdXBzIGFzIGVtcHR5IG1hdGNoZXMKKyAgICAgICAgICAgIGlmIChtYXRjaCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHYuYWRkRWxlbWVudChtYXRjaCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgZ2VuZXJpYyBvcHRpb25zIHRvIHRoZSByZWdleCBjb21waWxlciBzcGVjaWZpYyBvcHRpb25zLgorICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBnZW5lcmljIG9wdGlvbnMKKyAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWZpYyBvcHRpb25zCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRDb21waWxlck9wdGlvbnMoaW50IG9wdGlvbnMpIHsKKyAgICAgICAgaW50IGNPcHRpb25zID0gUGVybDVDb21waWxlci5ERUZBVUxUX01BU0s7CisKKyAgICAgICAgaWYgKFJlZ2V4cFV0aWwuaGFzRmxhZyhvcHRpb25zLCBNQVRDSF9DQVNFX0lOU0VOU0lUSVZFKSkgeworICAgICAgICAgICAgY09wdGlvbnMgfD0gUGVybDVDb21waWxlci5DQVNFX0lOU0VOU0lUSVZFX01BU0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFJlZ2V4cFV0aWwuaGFzRmxhZyhvcHRpb25zLCBNQVRDSF9NVUxUSUxJTkUpKSB7CisgICAgICAgICAgICBjT3B0aW9ucyB8PSBQZXJsNUNvbXBpbGVyLk1VTFRJTElORV9NQVNLOworICAgICAgICB9CisgICAgICAgIGlmIChSZWdleHBVdGlsLmhhc0ZsYWcob3B0aW9ucywgTUFUQ0hfU0lOR0xFTElORSkpIHsKKyAgICAgICAgICAgIGNPcHRpb25zIHw9IFBlcmw1Q29tcGlsZXIuU0lOR0xFTElORV9NQVNLOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNPcHRpb25zOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb1JlZ2V4cC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb1JlZ2V4cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDAwZTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvUmVnZXhwLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKKworaW1wb3J0IG9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGVybDVTdWJzdGl0dXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcm8udGV4dC5yZWdleC5TdWJzdGl0dXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5vcm8udGV4dC5yZWdleC5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioqCisgKiBSZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIEpha2FydGEgT3JvIHBhY2thZ2UKKyAqLworcHVibGljIGNsYXNzIEpha2FydGFPcm9SZWdleHAgZXh0ZW5kcyBKYWthcnRhT3JvTWF0Y2hlciBpbXBsZW1lbnRzIFJlZ2V4cCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVDSU1BTCA9IDEwOworCisgICAgLyoqIENvbnN0cnVjdG9yIGZvciBKYWthcnRhT3JvUmVnZXhwICovCisgICAgcHVibGljIEpha2FydGFPcm9SZWdleHAoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIHN1YnN0aXR1dGlvbiBvbiB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyaW5nIHRvIHN1YnN0aXR1dGUgb24KKyAgICAgKiBAcGFyYW0gYXJndW1lbnQgVGhlIHN0cmluZyB3aGljaCBkZWZpbmVzIHRoZSBzdWJzdGl0dXRpb24KKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgbGlzdCBvZiBvcHRpb25zIGZvciB0aGUgbWF0Y2ggYW5kIHJlcGxhY2UuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzdWJzdGl0dXRlKFN0cmluZyBpbnB1dCwgU3RyaW5nIGFyZ3VtZW50LCBpbnQgb3B0aW9ucykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdHJhbnNsYXRlIFwxIHRvICQxIHNvIHRoYXQgdGhlIFBlcmw1U3Vic3RpdHV0aW9uIHdpbGwgd29yaworICAgICAgICBTdHJpbmdCdWZmZXIgc3Vic3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gYXJndW1lbnQuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIHN1YnN0LmFwcGVuZCgnJCcpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICBpZiAoKytpIDwgYXJndW1lbnQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IGFyZ3VtZW50LmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gQ2hhcmFjdGVyLmRpZ2l0KGMsIERFQ0lNQUwpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKCIkIikuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0LmFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCAtIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaW5zdGVhZD8KKyAgICAgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gdGhlIHN1YnN0aXR1dGlvbgorICAgICAgICBTdWJzdGl0dXRpb24gcyA9CisgICAgICAgICAgICBuZXcgUGVybDVTdWJzdGl0dXRpb24oc3Vic3QudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJsNVN1YnN0aXR1dGlvbi5JTlRFUlBPTEFURV9BTEwpOworICAgICAgICByZXR1cm4gVXRpbC5zdWJzdGl0dXRlKG1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcGlsZWRQYXR0ZXJuKG9wdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3Vic09wdGlvbnMob3B0aW9ucykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYW50IHJlZ2V4cCBzdWJzdGl0dXRpb24gb3B0aW9uIHRvIG9ybyBvcHRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIGFudCByZWdleHAgb3B0aW9ucworICAgICAqIEByZXR1cm4gdGhlIG9ybyBzdWJzdGl0aW9uIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldFN1YnNPcHRpb25zKGludCBvcHRpb25zKSB7CisgICAgICAgIGJvb2xlYW4gcmVwbGFjZUFsbCA9IFJlZ2V4cFV0aWwuaGFzRmxhZyhvcHRpb25zLCBSRVBMQUNFX0FMTCk7CisgICAgICAgIGludCBzdWJzT3B0aW9ucyA9IDE7CisgICAgICAgIGlmIChyZXBsYWNlQWxsKSB7CisgICAgICAgICAgICBzdWJzT3B0aW9ucyA9IFV0aWwuU1VCU1RJVFVURV9BTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1YnNPcHRpb25zOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YVJlZ2V4cE1hdGNoZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxNDQxNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5yZWdleHAuUkU7CitpbXBvcnQgb3JnLmFwYWNoZS5yZWdleHAuUkVTeW50YXhFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgUmVnZXhwTWF0Y2hlciBmb3IgSmFrYXJ0YS1SZWdleHAuCisgKgorICovCitwdWJsaWMgY2xhc3MgSmFrYXJ0YVJlZ2V4cE1hdGNoZXIgaW1wbGVtZW50cyBSZWdleHBNYXRjaGVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm47CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlZ2V4cCBwYXR0ZXJuIGZyb20gdGhlIFN0cmluZyBkZXNjcmlwdGlvbi4KKyAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiB0byBtYXRjaAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4cCBwYXR0ZXJuCisgICAgICogQHJldHVybiB0aGUgcGF0dGVybgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKKyAgICAgICAgcmV0dXJuIHBhdHRlcm47CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGlsZSB0aGUgcGF0dGVybi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBhbnQgcmVnZXhwIG9wdGlvbnMKKyAgICAgKiBAcmV0dXJuIGEgY29tcGlsZWQgcGF0dGVybgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIFJFIGdldENvbXBpbGVkUGF0dGVybihpbnQgb3B0aW9ucykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGNPcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKG9wdGlvbnMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUkUgcmVnID0gbmV3IFJFKHBhdHRlcm4pOworICAgICAgICAgICAgcmVnLnNldE1hdGNoRmxhZ3MoY09wdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIHJlZzsKKyAgICAgICAgfSBjYXRjaCAoUkVTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgZ2l2ZW4gYXJndW1lbnQgbWF0Y2ggdGhlIHBhdHRlcm4/CisgICAgICogQHBhcmFtIGFyZ3VtZW50IHRoZSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGFyZ3VtZW50KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbWF0Y2hlcyhhcmd1bWVudCwgTUFUQ0hfREVGQVVMVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgZ2l2ZW4gYXJndW1lbnQgbWF0Y2ggdGhlIHBhdHRlcm4/CisgICAgICogQHBhcmFtIGlucHV0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSByZWdleCBvcHRpb25zIHRvIHVzZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGlucHV0LCBpbnQgb3B0aW9ucykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoZXMoaW5wdXQsIGdldENvbXBpbGVkUGF0dGVybihvcHRpb25zKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGlucHV0LCBSRSByZWcpIHsKKyAgICAgICAgcmV0dXJuIHJlZy5tYXRjaChpbnB1dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFZlY3RvciBvZiBtYXRjaGVkIGdyb3VwcyBmb3VuZCBpbiB0aGUgYXJndW1lbnQKKyAgICAgKiB1c2luZyBkZWZhdWx0IG9wdGlvbnMuCisgICAgICoKKyAgICAgKiA8cD5Hcm91cCAwIHdpbGwgYmUgdGhlIGZ1bGwgbWF0Y2gsIHRoZSByZXN0IGFyZSB0aGUKKyAgICAgKiBwYXJlbnRoZXNpemVkIHN1YmV4cHJlc3Npb25zPC9wPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmd1bWVudCB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZWN0b3Igb2YgZ3JvdXBzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBWZWN0b3IgZ2V0R3JvdXBzKFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEdyb3Vwcyhhcmd1bWVudCwgTUFUQ0hfREVGQVVMVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFZlY3RvciBvZiBtYXRjaGVkIGdyb3VwcyBmb3VuZCBpbiB0aGUgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiA8cD5Hcm91cCAwIHdpbGwgYmUgdGhlIGZ1bGwgbWF0Y2gsIHRoZSByZXN0IGFyZSB0aGUKKyAgICAgKiBwYXJlbnRoZXNpemVkIHN1YmV4cHJlc3Npb25zPC9wPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyB0aGUgcmVnZXggb3B0aW9ucyB0byB1c2UKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZWN0b3Igb2YgZ3JvdXBzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBWZWN0b3IgZ2V0R3JvdXBzKFN0cmluZyBpbnB1dCwgaW50IG9wdGlvbnMpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFJFIHJlZyA9IGdldENvbXBpbGVkUGF0dGVybihvcHRpb25zKTsKKyAgICAgICAgaWYgKCFtYXRjaGVzKGlucHV0LCByZWcpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaW50IGNudCA9IHJlZy5nZXRQYXJlbkNvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBtYXRjaCA9IHJlZy5nZXRQYXJlbihpKTsKKyAgICAgICAgICAgIC8vIHRyZWF0IG5vbi1tYXRjaGluZyBncm91cHMgYXMgZW1wdHkgbWF0Y2hlcworICAgICAgICAgICAgaWYgKG1hdGNoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtYXRjaCA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdi5hZGRFbGVtZW50KG1hdGNoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnZW5lcmljIG9wdGlvbnMgdG8gdGhlIHJlZ2V4IGNvbXBpbGVyIHNwZWNpZmljIG9wdGlvbnMuCisgICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIGdlbmVyaWMgb3B0aW9ucworICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmljIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldENvbXBpbGVyT3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBpbnQgY09wdGlvbnMgPSBSRS5NQVRDSF9OT1JNQUw7CisKKyAgICAgICAgaWYgKFJlZ2V4cFV0aWwuaGFzRmxhZyhvcHRpb25zLCBNQVRDSF9DQVNFX0lOU0VOU0lUSVZFKSkgeworICAgICAgICAgICAgY09wdGlvbnMgfD0gUkUuTUFUQ0hfQ0FTRUlOREVQRU5ERU5UOworICAgICAgICB9CisgICAgICAgIGlmIChSZWdleHBVdGlsLmhhc0ZsYWcob3B0aW9ucywgTUFUQ0hfTVVMVElMSU5FKSkgeworICAgICAgICAgICAgY09wdGlvbnMgfD0gUkUuTUFUQ0hfTVVMVElMSU5FOworICAgICAgICB9CisgICAgICAgIGlmIChSZWdleHBVdGlsLmhhc0ZsYWcob3B0aW9ucywgTUFUQ0hfU0lOR0xFTElORSkpIHsKKyAgICAgICAgICAgIGNPcHRpb25zIHw9IFJFLk1BVENIX1NJTkdMRUxJTkU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY09wdGlvbnM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwUmVnZXhwLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwUmVnZXhwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2OGZlZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBSZWdleHAuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnJlZ2V4cC5SRTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqKgorICogUmVndWxhciBleHByZXNzaW9uIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBKYWthcnRhIFJlZ2V4cCBwYWNrYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBKYWthcnRhUmVnZXhwUmVnZXhwIGV4dGVuZHMgSmFrYXJ0YVJlZ2V4cE1hdGNoZXIKKyAgICBpbXBsZW1lbnRzIFJlZ2V4cCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVDSU1BTCA9IDEwOworCisgICAgLyoqIENvbnN0cnVjdG9yIGZvciBKYWthcnRhUmVnZXhwUmVnZXhwICovCisgICAgcHVibGljIEpha2FydGFSZWdleHBSZWdleHAoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhbnQgcmVnZXhwIHN1YnN0aXR1dGlvbiBvcHRpb24gdG8gYXBhY2hlIHJlZ2V4IG9wdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyB0aGUgYW50IHJlZ2V4cCBvcHRpb25zCisgICAgICogQHJldHVybiB0aGUgYXBhY2hlIHJlZ2V4IHN1YnN0aXRpb24gb3B0aW9ucworICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZ2V0U3Vic09wdGlvbnMoaW50IG9wdGlvbnMpIHsKKyAgICAgICAgaW50IHN1YnNPcHRpb25zID0gUkUuUkVQTEFDRV9GSVJTVE9OTFk7CisgICAgICAgIGlmIChSZWdleHBVdGlsLmhhc0ZsYWcob3B0aW9ucywgUkVQTEFDRV9BTEwpKSB7CisgICAgICAgICAgICBzdWJzT3B0aW9ucyA9IFJFLlJFUExBQ0VfQUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdWJzT3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEgc3Vic3RpdHV0aW9uIG9uIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICogQHBhcmFtIGlucHV0IFRoZSBzdHJpbmcgdG8gc3Vic3RpdHV0ZSBvbgorICAgICAqIEBwYXJhbSBhcmd1bWVudCBUaGUgc3RyaW5nIHdoaWNoIGRlZmluZXMgdGhlIHN1YnN0aXR1dGlvbgorICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBsaXN0IG9mIG9wdGlvbnMgZm9yIHRoZSBtYXRjaCBhbmQgcmVwbGFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN1YnN0aXR1dGUoU3RyaW5nIGlucHV0LCBTdHJpbmcgYXJndW1lbnQsIGludCBvcHRpb25zKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgdiA9IGdldEdyb3VwcyhpbnB1dCwgb3B0aW9ucyk7CisKKyAgICAgICAgLy8gcmVwbGFjZSBcMSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGdyb3VwCisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gYXJndW1lbnQuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGlmICgrK2kgPCBhcmd1bWVudC5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICBjID0gYXJndW1lbnQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBDaGFyYWN0ZXIuZGlnaXQoYywgREVDSU1BTCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChTdHJpbmcpIHYuZWxlbWVudEF0KHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIC0gc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpbnN0ZWFkPworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhcmd1bWVudCA9IHJlc3VsdC50b1N0cmluZygpOworCisgICAgICAgIFJFIHJlZyA9IGdldENvbXBpbGVkUGF0dGVybihvcHRpb25zKTsKKyAgICAgICAgaW50IHNPcHRpb25zID0gZ2V0U3Vic09wdGlvbnMob3B0aW9ucyk7CisgICAgICAgIHJldHVybiByZWcuc3Vic3QoaW5wdXQsIGFyZ3VtZW50LCBzT3B0aW9ucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBNYXRjaGVyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2IyYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBNYXRjaGVyLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgUmVnZXhwTWF0Y2hlciBmb3IgdGhlIGJ1aWx0LWluIHJlZ2V4cCBtYXRjaGVyIG9mCisgKiBKREsgMS40LiBVTklYX0xJTkVTIG9wdGlvbiBpcyBlbmFibGVkIGFzIGEgZGVmYXVsdC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKZGsxNFJlZ2V4cE1hdGNoZXIgaW1wbGVtZW50cyBSZWdleHBNYXRjaGVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm47CisKKyAgICAvKiogQ29uc3RydWN0b3IgZm9yIEpha2FydGFPcm9SZWdleHAgKi8KKyAgICBwdWJsaWMgSmRrMTRSZWdleHBNYXRjaGVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVnZXhwIHBhdHRlcm4gZnJvbSB0aGUgU3RyaW5nIGRlc2NyaXB0aW9uLgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRvIG1hdGNoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVnZXhwIHBhdHRlcm4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXR0ZXJuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKKyAgICAgICAgcmV0dXJuIHBhdHRlcm47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4cCBwYXR0ZXJuCisgICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21waWxlZCBwYXR0ZXJuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHByb3RlY3RlZCBQYXR0ZXJuIGdldENvbXBpbGVkUGF0dGVybihpbnQgb3B0aW9ucykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGNPcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKG9wdGlvbnMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKHRoaXMucGF0dGVybiwgY09wdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0gY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRG9lcyB0aGUgZ2l2ZW4gYXJndW1lbnQgbWF0Y2ggdGhlIHBhdHRlcm4gdXNpbmcgZGVmYXVsdCBvcHRpb25zPworICAgICAqIEBwYXJhbSBhcmd1bWVudCB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoZXMoYXJndW1lbnQsIE1BVENIX0RFRkFVTFQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvZXMgdGhlIGdpdmVuIGFyZ3VtZW50IG1hdGNoIHRoZSBwYXR0ZXJuPworICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyB0aGUgcmVnZXggb3B0aW9ucyB0byB1c2UKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcworICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBpbnB1dCwgaW50IG9wdGlvbnMpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYXR0ZXJuIHAgPSBnZXRDb21waWxlZFBhdHRlcm4ob3B0aW9ucyk7CisgICAgICAgICAgICByZXR1cm4gcC5tYXRjaGVyKGlucHV0KS5maW5kKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgVmVjdG9yIG9mIG1hdGNoZWQgZ3JvdXBzIGZvdW5kIGluIHRoZSBhcmd1bWVudAorICAgICAqIHVzaW5nIGRlZmF1bHQgb3B0aW9ucy4KKyAgICAgKgorICAgICAqIDxwPkdyb3VwIDAgd2lsbCBiZSB0aGUgZnVsbCBtYXRjaCwgdGhlIHJlc3QgYXJlIHRoZQorICAgICAqIHBhcmVudGhlc2l6ZWQgc3ViZXhwcmVzc2lvbnM8L3A+LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3VtZW50IHRoZSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAqIEByZXR1cm4gdGhlIHZlY3RvciBvZiBncm91cHMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIFZlY3RvciBnZXRHcm91cHMoU3RyaW5nIGFyZ3VtZW50KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0R3JvdXBzKGFyZ3VtZW50LCBNQVRDSF9ERUZBVUxUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgVmVjdG9yIG9mIG1hdGNoZWQgZ3JvdXBzIGZvdW5kIGluIHRoZSBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIDxwPkdyb3VwIDAgd2lsbCBiZSB0aGUgZnVsbCBtYXRjaCwgdGhlIHJlc3QgYXJlIHRoZQorICAgICAqIHBhcmVudGhlc2l6ZWQgc3ViZXhwcmVzc2lvbnM8L3A+LgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdAorICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSByZWdleCBvcHRpb25zIHRvIHVzZQorICAgICAqIEByZXR1cm4gdGhlIHZlY3RvciBvZiBncm91cHMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIFZlY3RvciBnZXRHcm91cHMoU3RyaW5nIGlucHV0LCBpbnQgb3B0aW9ucykKKyAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0dGVybiBwID0gZ2V0Q29tcGlsZWRQYXR0ZXJuKG9wdGlvbnMpOworICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwLm1hdGNoZXIoaW5wdXQpOworICAgICAgICBpZiAoIW1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaW50IGNudCA9IG1hdGNoZXIuZ3JvdXBDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBjbnQ7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG1hdGNoID0gbWF0Y2hlci5ncm91cChpKTsKKyAgICAgICAgICAgIC8vIHRyZWF0IG5vbi1tYXRjaGluZyBncm91cHMgYXMgZW1wdHkgbWF0Y2hlcworICAgICAgICAgICAgaWYgKG1hdGNoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtYXRjaCA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdi5hZGRFbGVtZW50KG1hdGNoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBnZW5lcmljIG9wdGlvbnMgdG8gdGhlIHJlZ2V4IGNvbXBpbGVyIHNwZWNpZmljIG9wdGlvbnMuCisgICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIGdlbmVyaWMgb3B0aW9ucworICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmljIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldENvbXBpbGVyT3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICAvLyBiZSBzdHJpY3QgYWJvdXQgbGluZSBzZXBhcmF0b3IKKyAgICAgICAgaW50IGNPcHRpb25zID0gUGF0dGVybi5VTklYX0xJTkVTOworCisgICAgICAgIGlmIChSZWdleHBVdGlsLmhhc0ZsYWcob3B0aW9ucywgTUFUQ0hfQ0FTRV9JTlNFTlNJVElWRSkpIHsKKyAgICAgICAgICAgIGNPcHRpb25zIHw9IFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUmVnZXhwVXRpbC5oYXNGbGFnKG9wdGlvbnMsIE1BVENIX01VTFRJTElORSkpIHsKKyAgICAgICAgICAgIGNPcHRpb25zIHw9IFBhdHRlcm4uTVVMVElMSU5FOworICAgICAgICB9CisgICAgICAgIGlmIChSZWdleHBVdGlsLmhhc0ZsYWcob3B0aW9ucywgTUFUQ0hfU0lOR0xFTElORSkpIHsKKyAgICAgICAgICAgIGNPcHRpb25zIHw9IFBhdHRlcm4uRE9UQUxMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNPcHRpb25zOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBSZWdleHAuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwUmVnZXhwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwZmFhOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwUmVnZXhwLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CisKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqKgorICogUmVndWxhciBleHByZXNzaW9uIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBKREsgMS40IHJlZ3VsYXIgZXhwcmVzc2lvbiBwYWNrYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBKZGsxNFJlZ2V4cFJlZ2V4cCBleHRlbmRzIEpkazE0UmVnZXhwTWF0Y2hlciBpbXBsZW1lbnRzIFJlZ2V4cCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVDSU1BTCA9IDEwOworCisgICAgLyoqIENvbnN0cnVjdG9yIGZvciBKZGsxNFJlZ2V4cFJlZ2V4cCAqLworICAgIHB1YmxpYyBKZGsxNFJlZ2V4cFJlZ2V4cCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGFudCByZWdleHAgc3Vic3RpdHV0aW9uIG9wdGlvbiB0byBqZGsxLjQgb3B0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBhbnQgcmVnZXhwIG9wdGlvbnMKKyAgICAgKiBAcmV0dXJuIHRoZSBqZGsxNCBzdWJzdGl0aW9uIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldFN1YnNPcHRpb25zKGludCBvcHRpb25zKSB7CisgICAgICAgIGludCBzdWJzT3B0aW9ucyA9IFJFUExBQ0VfRklSU1Q7CisgICAgICAgIGlmIChSZWdleHBVdGlsLmhhc0ZsYWcob3B0aW9ucywgUkVQTEFDRV9BTEwpKSB7CisgICAgICAgICAgICBzdWJzT3B0aW9ucyA9IFJFUExBQ0VfQUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdWJzT3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEgc3Vic3RpdHV0aW9uIG9uIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICogQHBhcmFtIGlucHV0IFRoZSBzdHJpbmcgdG8gc3Vic3RpdHV0ZSBvbgorICAgICAqIEBwYXJhbSBhcmd1bWVudCBUaGUgc3RyaW5nIHdoaWNoIGRlZmluZXMgdGhlIHN1YnN0aXR1dGlvbgorICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBsaXN0IG9mIG9wdGlvbnMgZm9yIHRoZSBtYXRjaCBhbmQgcmVwbGFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN1YnN0aXR1dGUoU3RyaW5nIGlucHV0LCBTdHJpbmcgYXJndW1lbnQsIGludCBvcHRpb25zKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAvLyB0cmFuc2xhdGUgXDEgdG8gJCgxKSBzbyB0aGF0IHRoZSBNYXRjaGVyIHdpbGwgd29yaworICAgICAgICBTdHJpbmdCdWZmZXIgc3Vic3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gYXJndW1lbnQuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIHN1YnN0LmFwcGVuZCgnJCcpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICBpZiAoKytpIDwgYXJndW1lbnQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IGFyZ3VtZW50LmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gQ2hhcmFjdGVyLmRpZ2l0KGMsIERFQ0lNQUwpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKCIkIikuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0LmFwcGVuZChjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCAtIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gaW5zdGVhZD8KKyAgICAgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFyZ3VtZW50ID0gc3Vic3QudG9TdHJpbmcoKTsKKworICAgICAgICBpbnQgc09wdGlvbnMgPSBnZXRTdWJzT3B0aW9ucyhvcHRpb25zKTsKKyAgICAgICAgUGF0dGVybiBwID0gZ2V0Q29tcGlsZWRQYXR0ZXJuKG9wdGlvbnMpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKGlucHV0KTsKKyAgICAgICAgaWYgKFJlZ2V4cFV0aWwuaGFzRmxhZyhzT3B0aW9ucywgUkVQTEFDRV9BTEwpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQobS5yZXBsYWNlQWxsKGFyZ3VtZW50KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sZWFuIHJlcyA9IG0uZmluZCgpOworICAgICAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgICAgIG0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIGFyZ3VtZW50KTsKKyAgICAgICAgICAgICAgICBtLmFwcGVuZFRhaWwoc2IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5wdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3ODE2YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqKgorICogSW50ZXJmYWNlIHdoaWNoIHJlcHJlc2VudHMgYSByZWd1bGFyIGV4cHJlc3Npb24sIGFuZCB0aGUgb3BlcmF0aW9ucworICogdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGl0LgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBSZWdleHAgZXh0ZW5kcyBSZWdleHBNYXRjaGVyIHsKKworICAgIC8qKgorICAgICAqIFJlcGxhY2Ugb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICovCisgICAgaW50IFJFUExBQ0VfRklSU1QgICAgICAgICAgPSAweDAwMDAwMDAxOworCisgICAgLyoqCisgICAgICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAqLworICAgIGludCBSRVBMQUNFX0FMTCAgICAgICAgICAgID0gMHgwMDAwMDAxMDsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYSBzdWJzdGl0dXRpb24gb24gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgKiBAcGFyYW0gaW5wdXQgVGhlIHN0cmluZyB0byBzdWJzdGl0dXRlIG9uCisgICAgICogQHBhcmFtIGFyZ3VtZW50IFRoZSBzdHJpbmcgd2hpY2ggZGVmaW5lcyB0aGUgc3Vic3RpdHV0aW9uCisgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGxpc3Qgb2Ygb3B0aW9ucyBmb3IgdGhlIG1hdGNoIGFuZCByZXBsYWNlLiBTZWUgdGhlCisgICAgICogICAgICAgICAgICAgICAgTUFUQ0hfIGFuZCBSRVBMQUNFXyBjb25zdGFudHMgYWJvdmUuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgU3RyaW5nIHN1YnN0aXR1dGUoU3RyaW5nIGlucHV0LCBTdHJpbmcgYXJndW1lbnQsIGludCBvcHRpb25zKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBGYWN0b3J5LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0NjIxZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNsYXNzcGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworCisvKioqCisgKiBSZWd1bGFyIGV4cHJlc3Npb24gZmFjdG9yeSwgd2hpY2ggd2lsbCBjcmVhdGUgUmVnZXhwIG9iamVjdHMuICBUaGUKKyAqIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBkZXBlbmRzIG9uIHRoZSBTeXN0ZW0gb3IgQW50IFByb3BlcnR5OgorICogPGNvZGU+YW50LnJlZ2V4cC5yZWdleHBpbXBsPC9jb2RlPi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZWdleHBGYWN0b3J5IGV4dGVuZHMgUmVnZXhwTWF0Y2hlckZhY3RvcnkgeworCisgICAgLyoqIENvbnN0cnVjdG9yIGZvciBSZWdleHBGYWN0b3J5ICovCisgICAgcHVibGljIFJlZ2V4cEZhY3RvcnkoKSB7CisgICAgfQorCisgICAgLyoqKgorICAgICAqIENyZWF0ZSBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlciBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXRjaGVyIGluc3RhbmNlCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBSZWdleHAgbmV3UmVnZXhwKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChSZWdleHApIG5ld1JlZ2V4cChudWxsKTsKKyAgICB9CisKKyAgICAvKioqCisgICAgICogQ3JlYXRlIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVyIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHAgUHJvamVjdCB3aG9zZSBhbnQucmVnZXhwLnJlZ2V4cGltcGwgcHJvcGVydHkgd2lsbCBiZSB1c2VkLgorICAgICAqIEByZXR1cm4gdGhlIG1hdGNoZXIgaW5zdGFuY2UKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIFJlZ2V4cCBuZXdSZWdleHAoUHJvamVjdCBwKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgc3lzdGVtRGVmYXVsdCA9IG51bGw7CisgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgIHN5c3RlbURlZmF1bHQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5SRUdFWFBfSU1QTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzeXN0ZW1EZWZhdWx0ID0gcC5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLlJFR0VYUF9JTVBMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzeXN0ZW1EZWZhdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZWdleHBJbnN0YW5jZShzeXN0ZW1EZWZhdWx0KTsKKyAgICAgICAgICAgIC8vIFhYWCAgICAgc2hvdWxkIHdlIHNpbGVudGx5IGNhdGNoIHBvc3NpYmxlIGV4Y2VwdGlvbnMgYW5kIHRyeSB0bworICAgICAgICAgICAgLy8gICAgICAgICBsb2FkIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uPworICAgICAgICB9CisKKyAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdEF2YWlsYWJpbGl0eSgiamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZWdleHBJbnN0YW5jZSgib3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmRrMTRSZWdleHBSZWdleHAiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGNhdXNlID0gb3JDYXVzZSgKKyAgICAgICAgICAgICAgICBjYXVzZSwgYmUsCisgICAgICAgICAgICAgICAgSmF2YUVudlV0aWxzLmdldEphdmFWZXJzaW9uTnVtYmVyKCkgPCBKYXZhRW52VXRpbHMuVkVSU0lPTl8xXzQpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RBdmFpbGFiaWxpdHkoIm9yZy5hcGFjaGUub3JvLnRleHQucmVnZXguUGF0dGVybiIpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlZ2V4cEluc3RhbmNlKCJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhT3JvUmVnZXhwIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBjYXVzZSA9IG9yQ2F1c2UoY2F1c2UsIGJlLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0QXZhaWxhYmlsaXR5KCJvcmcuYXBhY2hlLnJlZ2V4cC5SRSIpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlZ2V4cEluc3RhbmNlKCJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhUmVnZXhwUmVnZXhwIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBjYXVzZSA9IG9yQ2F1c2UoY2F1c2UsIGJlLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHN1cHBvcnRlZCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlciBmb3VuZCIKKyAgICAgICAgICAgICAgICArIChjYXVzZSAhPSBudWxsID8gIjogIiArIGNhdXNlIDogIiIpLCBjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JhcHBlciBvdmVyIFJlZ2V4cE1hdGNoZXJGYWN0b3J5LmNyZWF0ZUluc3RhbmNlIHRoYXQgZW5zdXJlcyB0aGF0CisgICAgICogd2UgYXJlIGRlYWxpbmcgd2l0aCBhIFJlZ2V4cCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICogQHNpbmNlIDEuMworICAgICAqCisgICAgICogQHNlZSBSZWdleHBNYXRjaGVyRmFjdG9yeSNjcmVhdGVJbnN0YW5jZShTdHJpbmcpCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlZ2V4cCBjcmVhdGVSZWdleHBJbnN0YW5jZShTdHJpbmcgY2xhc3NuYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKFJlZ2V4cCkgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NuYW1lLCBSZWdleHBGYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgUmVnZXhwLmNsYXNzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM2ZDliCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIEludGVyZmFjZSBkZXNjcmliaW5nIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXIuCisgKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlZ2V4cE1hdGNoZXIgeworCisgICAgLyoqKgorICAgICAqIERlZmF1bHQgTWFzayAoY2FzZSBpbnNlbnNpdGl2ZSwgbmVpdGhlciBtdWx0aWxpbmUgbm9yCisgICAgICogc2luZ2xlbGluZSBzcGVjaWZpZWQpLgorICAgICAqLworICAgIGludCBNQVRDSF9ERUZBVUxUICAgICAgICAgID0gMHgwMDAwMDAwMDsKKworICAgIC8qKioKKyAgICAgKiBQZXJmb3JtIGEgY2FzZSBpbnNlbnN0aXZlIG1hdGNoCisgICAgICovCisgICAgaW50IE1BVENIX0NBU0VfSU5TRU5TSVRJVkUgPSAweDAwMDAwMTAwOworCisgICAgLyoqKgorICAgICAqIFRyZWF0IHRoZSBpbnB1dCBhcyBhIG11bHRpbGluZSBpbnB1dAorICAgICAqLworICAgIGludCBNQVRDSF9NVUxUSUxJTkUgICAgICAgID0gMHgwMDAwMTAwMDsKKworICAgIC8qKioKKyAgICAgKiBUcmVhdCB0aGUgaW5wdXQgYXMgc2luZ2xlbGluZSBpbnB1dCAoJy4nIG1hdGNoZXMgbmV3bGluZSkKKyAgICAgKi8KKyAgICBpbnQgTUFUQ0hfU0lOR0xFTElORSAgICAgICA9IDB4MDAwMTAwMDA7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVnZXhwIHBhdHRlcm4gZnJvbSB0aGUgU3RyaW5nIGRlc2NyaXB0aW9uLgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRvIG1hdGNoCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogR2V0IGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWdleHAgcGF0dGVybgorICAgICAqIEByZXR1cm4gdGhlIHBhdHRlcm4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgU3RyaW5nIGdldFBhdHRlcm4oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSBnaXZlbiBhcmd1bWVudCBtYXRjaCB0aGUgcGF0dGVybj8KKyAgICAgKiBAcGFyYW0gYXJndW1lbnQgdGhlIHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFZlY3RvciBvZiBtYXRjaGVkIGdyb3VwcyBmb3VuZCBpbiB0aGUgYXJndW1lbnQKKyAgICAgKiB1c2luZyBkZWZhdWx0IG9wdGlvbnMuCisgICAgICoKKyAgICAgKiA8cD5Hcm91cCAwIHdpbGwgYmUgdGhlIGZ1bGwgbWF0Y2gsIHRoZSByZXN0IGFyZSB0aGUKKyAgICAgKiBwYXJlbnRoZXNpemVkIHN1YmV4cHJlc3Npb25zPC9wPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmd1bWVudCB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZWN0b3Igb2YgZ3JvdXBzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIFZlY3RvciBnZXRHcm91cHMoU3RyaW5nIGFyZ3VtZW50KSB0aHJvd3MgQnVpbGRFeGNlcHRpb247CisKKyAgICAvKioqCisgICAgICogRG9lcyB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCB0aGUgaW5wdXQsIGdpdmVuCisgICAgICogY2VydGFpbiBvcHRpb25zCisgICAgICogQHBhcmFtIGlucHV0IFRoZSBzdHJpbmcgdG8gY2hlY2sgZm9yIGEgbWF0Y2gKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgbGlzdCBvZiBvcHRpb25zIGZvciB0aGUgbWF0Y2guIFNlZSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBNQVRDSF8gY29uc3RhbnRzIGFib3ZlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgaW5wdXQsIGludCBvcHRpb25zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247CisKKyAgICAvKioqCisgICAgICogR2V0IHRoZSBtYXRjaCBncm91cHMgZnJvbSB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIFRoZSByZXR1cm4KKyAgICAgKiB0eXBlIG9mIHRoZSBlbGVtZW50cyBpcyBhbHdheXMgU3RyaW5nLgorICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyaW5nIHRvIGNoZWNrIGZvciBhIG1hdGNoCisgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGxpc3Qgb2Ygb3B0aW9ucyBmb3IgdGhlIG1hdGNoLiBTZWUgdGhlCisgICAgICogICAgICAgICAgICAgICAgTUFUQ0hfIGNvbnN0YW50cyBhYm92ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2ZWN0b3Igb2YgZ3JvdXBzCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIFZlY3RvciBnZXRHcm91cHMoU3RyaW5nIGlucHV0LCBpbnQgb3B0aW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhhMjdiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNsYXNzcGF0aFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworCisvKioKKyAqIFNpbXBsZSBGYWN0b3J5IENsYXNzIHRoYXQgcHJvZHVjZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgUmVnZXhwTWF0Y2hlciBiYXNlZCBvbiB0aGUgc3lzdGVtCisgKiBwcm9wZXJ0eSA8Y29kZT5hbnQucmVnZXhwLnJlZ2V4cGltcGw8L2NvZGU+IGFuZCB0aGUgY2xhc3NlcyBhdmFpbGFibGUuCisgKgorICogPHA+CisgKiBJbiBhIG1vcmUgZ2VuZXJhbCBmcmFtZXdvcmsgdGhpcyBjbGFzcyB3b3VsZCBiZSBhYnN0cmFjdCBhbmQgaGF2ZSBhIHN0YXRpYyBuZXdJbnN0YW5jZSBtZXRob2QuCisgKiA8L3A+CisgKgorICovCitwdWJsaWMgY2xhc3MgUmVnZXhwTWF0Y2hlckZhY3RvcnkgeworCisgICAgLyoqIENvbnN0cnVjdG9yIGZvciBSZWdleHBNYXRjaGVyRmFjdG9yeS4gKi8KKyAgICBwdWJsaWMgUmVnZXhwTWF0Y2hlckZhY3RvcnkoKSB7CisgICAgfQorCisgICAgLyoqKgorICAgICAqIENyZWF0ZSBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gaW5zdGFuY2UuCisgICAgICogQHJldHVybiB0aGUgbWF0Y2hlcgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVnZXhwTWF0Y2hlciBuZXdSZWdleHBNYXRjaGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ld1JlZ2V4cE1hdGNoZXIobnVsbCk7CisgICAgfQorCisgICAgLyoqKgorICAgICAqIENyZWF0ZSBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcCBQcm9qZWN0IHdob3NlIGFudC5yZWdleHAucmVnZXhwaW1wbCBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQuCisgICAgICogQHJldHVybiB0aGUgbWF0Y2hlcgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVnZXhwTWF0Y2hlciBuZXdSZWdleHBNYXRjaGVyKFByb2plY3QgcCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHN5c3RlbURlZmF1bHQgPSBudWxsOworICAgICAgICBpZiAocCA9PSBudWxsKSB7CisgICAgICAgICAgICBzeXN0ZW1EZWZhdWx0ID0gU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuUkVHRVhQX0lNUEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3lzdGVtRGVmYXVsdCA9IHAuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5SRUdFWFBfSU1QTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3lzdGVtRGVmYXVsdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2Uoc3lzdGVtRGVmYXVsdCk7CisgICAgICAgICAgICAvLyBYWFggICAgIHNob3VsZCB3ZSBzaWxlbnRseSBjYXRjaCBwb3NzaWJsZSBleGNlcHRpb25zIGFuZCB0cnkgdG8KKyAgICAgICAgICAgIC8vICAgICAgICAgbG9hZCBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbj8KKyAgICAgICAgfQorCisgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RBdmFpbGFiaWxpdHkoImphdmEudXRpbC5yZWdleC5NYXRjaGVyIik7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UoIm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLkpkazE0UmVnZXhwTWF0Y2hlciIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgY2F1c2UgPSBvckNhdXNlKAorICAgICAgICAgICAgICAgIGNhdXNlLCBiZSwKKyAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuZ2V0SmF2YVZlcnNpb25OdW1iZXIoKSA8IEphdmFFbnZVdGlscy5WRVJTSU9OXzFfNCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdEF2YWlsYWJpbGl0eSgib3JnLmFwYWNoZS5vcm8udGV4dC5yZWdleC5QYXR0ZXJuIik7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UoIm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLkpha2FydGFPcm9NYXRjaGVyIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBjYXVzZSA9IG9yQ2F1c2UoY2F1c2UsIGJlLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0QXZhaWxhYmlsaXR5KCJvcmcuYXBhY2hlLnJlZ2V4cC5SRSIpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKCJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhUmVnZXhwTWF0Y2hlciIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgY2F1c2UgPSBvckNhdXNlKGNhdXNlLCBiZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBzdXBwb3J0ZWQgcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXIgZm91bmQiCisgICAgICAgICAgICAgICAgKyAoY2F1c2UgIT0gbnVsbCA/ICI6ICIgKyBjYXVzZSA6ICIiKSwgY2F1c2UpOworICAgIH0KKworICAgIHN0YXRpYyBUaHJvd2FibGUgb3JDYXVzZShUaHJvd2FibGUgZGVmbHQsIEJ1aWxkRXhjZXB0aW9uIGJlLCBib29sZWFuIGlnbm9yZUNuZmUpIHsKKyAgICAgICAgaWYgKGRlZmx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZsdDsKKyAgICAgICAgfQorICAgICAgICBUaHJvd2FibGUgdCA9IGJlLmdldEV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gaWdub3JlQ25mZSAmJiB0IGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiA/IG51bGwgOiB0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIG1hdGNoZXIgZnJvbSBhIGNsYXNzbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICogQHJldHVybiBhIDxjb2RlPlJlZ2V4cE1hdGNoZXI8L2NvZGU+IHZhbHVlCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVnZXhwTWF0Y2hlciBjcmVhdGVJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKFJlZ2V4cE1hdGNoZXIpIENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKGNsYXNzTmFtZSwgUmVnZXhwTWF0Y2hlckZhY3RvcnkuY2xhc3MKKyAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKSwgUmVnZXhwTWF0Y2hlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBpZiBhIHBhcnRpY3VsYXIgY2xhc3MgaXMgYXZhaWxhYmxlIHRvIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVzdEF2YWlsYWJpbGl0eShTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEgUmVnRXhwLU1hdGNoZXIgaXMgYXZhaWxhYmxlLgorICAgICAqIEBwYXJhbSBwcm9qZWN0ICBUaGUgcHJvamVjdCB0byBjaGVjayBmb3IgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF2YWlsYWJsZSBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlZ2V4cE1hdGNoZXJQcmVzZW50KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVGhlIGZhY3RvcnkgdGhyb3dzIGEgQnVpbGRFeGNlcHRpb24gaWYgbm8gdXNhYmxlIG1hdGNoZXIKKyAgICAgICAgICAgIC8vIGNhbnQgYmUgaW5zdGFudGlhdGVkLiBXZSBkb250IG5lZWQgdGhlIG1hdGNoZXIgaXRzZWxmIGhlcmUuCisgICAgICAgICAgICBuZXcgUmVnZXhwTWF0Y2hlckZhY3RvcnkoKS5uZXdSZWdleHBNYXRjaGVyKHByb2plY3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwVXRpbC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGVhYzEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBVdGlsLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKKworLy8gQ2hlY2tTdHlsZTpIaWRlVXRpbGl0eUNsYXNzQ29uc3RydWN0b3JDaGVjayBPRkYgLSBiYworCisvKioqCisgKiBSZWd1bGFyIGV4cHJlc3Npb24gdXRpbGl0aWVzIGNsYXNzIHdoaWNoIGhhbmRsZXMgZmxhZyBvcGVyYXRpb25zLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlZ2V4cFV0aWwgeworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIG9wdGlvbnMgaGFzIGEgcGFydGljdWxhciBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKKyAgICAgKiBAcGFyYW0gZmxhZyBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmbGFnIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNGbGFnKGludCBvcHRpb25zLCBpbnQgZmxhZykgeworICAgICAgICByZXR1cm4gKChvcHRpb25zICYgZmxhZykgPiAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwYXJ0aWN1bGFyIGZsYWcgZnJvbSBhbiBpbnQgdmFsdWUgY29udGFpbnMgdGhlIG9wdGlvbiBmbGFncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKKyAgICAgKiBAcGFyYW0gZmxhZyBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCisgICAgICogQHJldHVybiB0aGUgb3B0aW9ucyB3aXRoIHRoZSBmbGFnIHVuc2V0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgcmVtb3ZlRmxhZyhpbnQgb3B0aW9ucywgaW50IGZsYWcpIHsKKyAgICAgICAgcmV0dXJuIChvcHRpb25zICYgKDB4RkZGRkZGRkYgLSBmbGFnKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdmVyc2lvbi50eHQgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC92ZXJzaW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk2ZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdmVyc2lvbi50eHQKQEAgLTAsMCArMSwyIEBACitWRVJTSU9OPSR7cHJvamVjdC52ZXJzaW9ufQorREFURT0ke1RPREFZfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9iemlwMi9CWmlwMkNvbnN0YW50cy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9iemlwMi9CWmlwMkNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTExYTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0JaaXAyQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgcGFja2FnZSBpcyBiYXNlZCBvbiB0aGUgd29yayBkb25lIGJ5IEtlaXJvbiBMaWRkbGUsIEFmdGV4IFNvZnR3YXJlCisgKiA8a2Vpcm9uQGFmdGV4c3cuY29tPiB0byB3aG9tIHRoZSBBbnQgcHJvamVjdCBpcyB2ZXJ5IGdyYXRlZnVsIGZvciBoaXMKKyAqIGdyZWF0IGNvZGUuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmJ6aXAyOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGJvdGggdGhlIGNvbXByZXNzIGFuZCBkZWNvbXByZXNzIGNsYXNzZXMuCisgKiBIb2xkcyBjb21tb24gYXJyYXlzLCBhbmQgc3RhdGljIGRhdGEuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHB1YmxpYyBmb3IgaGlzdG9yaWNhbCBwdXJwb3Nlcy4KKyAqIFlvdSBzaG91bGQgaGF2ZSBubyBuZWVkIHRvIHVzZSBpdC4KKyAqIDwvcD4KKyAqLworcHVibGljIGludGVyZmFjZSBCWmlwMkNvbnN0YW50cyB7CisKKyAgICBpbnQgYmFzZUJsb2NrU2l6ZSA9IDEwMDAwMDsKKyAgICBpbnQgTUFYX0FMUEhBX1NJWkUgPSAyNTg7CisgICAgaW50IE1BWF9DT0RFX0xFTiA9IDIzOworICAgIGludCBSVU5BID0gMDsKKyAgICBpbnQgUlVOQiA9IDE7CisgICAgaW50IE5fR1JPVVBTID0gNjsKKyAgICBpbnQgR19TSVpFID0gNTA7CisgICAgaW50IE5fSVRFUlMgPSA0OworICAgIGludCBNQVhfU0VMRUNUT1JTID0gKDIgKyAoOTAwMDAwIC8gR19TSVpFKSk7CisgICAgaW50IE5VTV9PVkVSU0hPT1RfQllURVMgPSAyMDsKKworICAgIC8qKgorICAgICAqIFRoaXMgYXJyYXkgcmVhbGx5IHNob3VsZG4ndCBiZSBoZXJlLgorICAgICAqIEFnYWluLCBmb3IgaGlzdG9yaWNhbCBwdXJwb3NlcyBpdCBpcy4KKyAgICAgKgorICAgICAqIDxwPkZJWE1FOiBUaGlzIGFycmF5IHNob3VsZCBiZSBpbiBhIHByaXZhdGUgb3IgcGFja2FnZSBwcml2YXRlCisgICAgICogbG9jYXRpb24sIHNpbmNlIGl0IGNvdWxkIGJlIG1vZGlmaWVkIGJ5IG1hbGljaW91cyBjb2RlLjwvcD4KKyAgICAgKi8KKyAgICBpbnRbXSByTnVtcyA9IHsKKyAgICAgICAgNjE5LCA3MjAsIDEyNywgNDgxLCA5MzEsIDgxNiwgODEzLCAyMzMsIDU2NiwgMjQ3LAorICAgICAgICA5ODUsIDcyNCwgMjA1LCA0NTQsIDg2MywgNDkxLCA3NDEsIDI0MiwgOTQ5LCAyMTQsCisgICAgICAgIDczMywgODU5LCAzMzUsIDcwOCwgNjIxLCA1NzQsIDczLCA2NTQsIDczMCwgNDcyLAorICAgICAgICA0MTksIDQzNiwgMjc4LCA0OTYsIDg2NywgMjEwLCAzOTksIDY4MCwgNDgwLCA1MSwKKyAgICAgICAgODc4LCA0NjUsIDgxMSwgMTY5LCA4NjksIDY3NSwgNjExLCA2OTcsIDg2NywgNTYxLAorICAgICAgICA4NjIsIDY4NywgNTA3LCAyODMsIDQ4MiwgMTI5LCA4MDcsIDU5MSwgNzMzLCA2MjMsCisgICAgICAgIDE1MCwgMjM4LCA1OSwgMzc5LCA2ODQsIDg3NywgNjI1LCAxNjksIDY0MywgMTA1LAorICAgICAgICAxNzAsIDYwNywgNTIwLCA5MzIsIDcyNywgNDc2LCA2OTMsIDQyNSwgMTc0LCA2NDcsCisgICAgICAgIDczLCAxMjIsIDMzNSwgNTMwLCA0NDIsIDg1MywgNjk1LCAyNDksIDQ0NSwgNTE1LAorICAgICAgICA5MDksIDU0NSwgNzAzLCA5MTksIDg3NCwgNDc0LCA4ODIsIDUwMCwgNTk0LCA2MTIsCisgICAgICAgIDY0MSwgODAxLCAyMjAsIDE2MiwgODE5LCA5ODQsIDU4OSwgNTEzLCA0OTUsIDc5OSwKKyAgICAgICAgMTYxLCA2MDQsIDk1OCwgNTMzLCAyMjEsIDQwMCwgMzg2LCA4NjcsIDYwMCwgNzgyLAorICAgICAgICAzODIsIDU5NiwgNDE0LCAxNzEsIDUxNiwgMzc1LCA2ODIsIDQ4NSwgOTExLCAyNzYsCisgICAgICAgIDk4LCA1NTMsIDE2MywgMzU0LCA2NjYsIDkzMywgNDI0LCAzNDEsIDUzMywgODcwLAorICAgICAgICAyMjcsIDczMCwgNDc1LCAxODYsIDI2MywgNjQ3LCA1MzcsIDY4NiwgNjAwLCAyMjQsCisgICAgICAgIDQ2OSwgNjgsIDc3MCwgOTE5LCAxOTAsIDM3MywgMjk0LCA4MjIsIDgwOCwgMjA2LAorICAgICAgICAxODQsIDk0MywgNzk1LCAzODQsIDM4MywgNDYxLCA0MDQsIDc1OCwgODM5LCA4ODcsCisgICAgICAgIDcxNSwgNjcsIDYxOCwgMjc2LCAyMDQsIDkxOCwgODczLCA3NzcsIDYwNCwgNTYwLAorICAgICAgICA5NTEsIDE2MCwgNTc4LCA3MjIsIDc5LCA4MDQsIDk2LCA0MDksIDcxMywgOTQwLAorICAgICAgICA2NTIsIDkzNCwgOTcwLCA0NDcsIDMxOCwgMzUzLCA4NTksIDY3MiwgMTEyLCA3ODUsCisgICAgICAgIDY0NSwgODYzLCA4MDMsIDM1MCwgMTM5LCA5MywgMzU0LCA5OSwgODIwLCA5MDgsCisgICAgICAgIDYwOSwgNzcyLCAxNTQsIDI3NCwgNTgwLCAxODQsIDc5LCA2MjYsIDYzMCwgNzQyLAorICAgICAgICA2NTMsIDI4MiwgNzYyLCA2MjMsIDY4MCwgODEsIDkyNywgNjI2LCA3ODksIDEyNSwKKyAgICAgICAgNDExLCA1MjEsIDkzOCwgMzAwLCA4MjEsIDc4LCAzNDMsIDE3NSwgMTI4LCAyNTAsCisgICAgICAgIDE3MCwgNzc0LCA5NzIsIDI3NSwgOTk5LCA2MzksIDQ5NSwgNzgsIDM1MiwgMTI2LAorICAgICAgICA4NTcsIDk1NiwgMzU4LCA2MTksIDU4MCwgMTI0LCA3MzcsIDU5NCwgNzAxLCA2MTIsCisgICAgICAgIDY2OSwgMTEyLCAxMzQsIDY5NCwgMzYzLCA5OTIsIDgwOSwgNzQzLCAxNjgsIDk3NCwKKyAgICAgICAgOTQ0LCAzNzUsIDc0OCwgNTIsIDYwMCwgNzQ3LCA2NDIsIDE4MiwgODYyLCA4MSwKKyAgICAgICAgMzQ0LCA4MDUsIDk4OCwgNzM5LCA1MTEsIDY1NSwgODE0LCAzMzQsIDI0OSwgNTE1LAorICAgICAgICA4OTcsIDk1NSwgNjY0LCA5ODEsIDY0OSwgMTEzLCA5NzQsIDQ1OSwgODkzLCAyMjgsCisgICAgICAgIDQzMywgODM3LCA1NTMsIDI2OCwgOTI2LCAyNDAsIDEwMiwgNjU0LCA0NTksIDUxLAorICAgICAgICA2ODYsIDc1NCwgODA2LCA3NjAsIDQ5MywgNDAzLCA0MTUsIDM5NCwgNjg3LCA3MDAsCisgICAgICAgIDk0NiwgNjcwLCA2NTYsIDYxMCwgNzM4LCAzOTIsIDc2MCwgNzk5LCA4ODcsIDY1MywKKyAgICAgICAgOTc4LCAzMjEsIDU3NiwgNjE3LCA2MjYsIDUwMiwgODk0LCA2NzksIDI0MywgNDQwLAorICAgICAgICA2ODAsIDg3OSwgMTk0LCA1NzIsIDY0MCwgNzI0LCA5MjYsIDU2LCAyMDQsIDcwMCwKKyAgICAgICAgNzA3LCAxNTEsIDQ1NywgNDQ5LCA3OTcsIDE5NSwgNzkxLCA1NTgsIDk0NSwgNjc5LAorICAgICAgICAyOTcsIDU5LCA4NywgODI0LCA3MTMsIDY2MywgNDEyLCA2OTMsIDM0MiwgNjA2LAorICAgICAgICAxMzQsIDEwOCwgNTcxLCAzNjQsIDYzMSwgMjEyLCAxNzQsIDY0MywgMzA0LCAzMjksCisgICAgICAgIDM0MywgOTcsIDQzMCwgNzUxLCA0OTcsIDMxNCwgOTgzLCAzNzQsIDgyMiwgOTI4LAorICAgICAgICAxNDAsIDIwNiwgNzMsIDI2MywgOTgwLCA3MzYsIDg3NiwgNDc4LCA0MzAsIDMwNSwKKyAgICAgICAgMTcwLCA1MTQsIDM2NCwgNjkyLCA4MjksIDgyLCA4NTUsIDk1MywgNjc2LCAyNDYsCisgICAgICAgIDM2OSwgOTcwLCAyOTQsIDc1MCwgODA3LCA4MjcsIDE1MCwgNzkwLCAyODgsIDkyMywKKyAgICAgICAgODA0LCAzNzgsIDIxNSwgODI4LCA1OTIsIDI4MSwgNTY1LCA1NTUsIDcxMCwgODIsCisgICAgICAgIDg5NiwgODMxLCA1NDcsIDI2MSwgNTI0LCA0NjIsIDI5MywgNDY1LCA1MDIsIDU2LAorICAgICAgICA2NjEsIDgyMSwgOTc2LCA5OTEsIDY1OCwgODY5LCA5MDUsIDc1OCwgNzQ1LCAxOTMsCisgICAgICAgIDc2OCwgNTUwLCA2MDgsIDkzMywgMzc4LCAyODYsIDIxNSwgOTc5LCA3OTIsIDk2MSwKKyAgICAgICAgNjEsIDY4OCwgNzkzLCA2NDQsIDk4NiwgNDAzLCAxMDYsIDM2NiwgOTA1LCA2NDQsCisgICAgICAgIDM3MiwgNTY3LCA0NjYsIDQzNCwgNjQ1LCAyMTAsIDM4OSwgNTUwLCA5MTksIDEzNSwKKyAgICAgICAgNzgwLCA3NzMsIDYzNSwgMzg5LCA3MDcsIDEwMCwgNjI2LCA5NTgsIDE2NSwgNTA0LAorICAgICAgICA5MjAsIDE3NiwgMTkzLCA3MTMsIDg1NywgMjY1LCAyMDMsIDUwLCA2NjgsIDEwOCwKKyAgICAgICAgNjQ1LCA5OTAsIDYyNiwgMTk3LCA1MTAsIDM1NywgMzU4LCA4NTAsIDg1OCwgMzY0LAorICAgICAgICA5MzYsIDYzOAorICAgIH07Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0NCWmlwMklucHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0NCWmlwMklucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiNWY2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ0JaaXAySW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDk3NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogVGhpcyBwYWNrYWdlIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgS2Vpcm9uIExpZGRsZSwgQWZ0ZXggU29mdHdhcmUKKyAqIDxrZWlyb25AYWZ0ZXhzdy5jb20+IHRvIHdob20gdGhlIEFudCBwcm9qZWN0IGlzIHZlcnkgZ3JhdGVmdWwgZm9yIGhpcworICogZ3JlYXQgY29kZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmJ6aXAyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEFuIGlucHV0IHN0cmVhbSB0aGF0IGRlY29tcHJlc3NlcyBmcm9tIHRoZSBCWmlwMiBmb3JtYXQgKHdpdGhvdXQgdGhlIGZpbGUKKyAqIGhlYWRlciBjaGFycykgdG8gYmUgcmVhZCBhcyBhbnkgb3RoZXIgc3RyZWFtLgorICoKKyAqIDxwPlRoZSBkZWNvbXByZXNzaW9uIHJlcXVpcmVzIGxhcmdlIGFtb3VudHMgb2YgbWVtb3J5LiBUaHVzIHlvdQorICogc2hvdWxkIGNhbGwgdGhlIHtAbGluayAjY2xvc2UoKSBjbG9zZSgpfSBtZXRob2QgYXMgc29vbiBhcworICogcG9zc2libGUsIHRvIGZvcmNlIDx0dD5DQlppcDJJbnB1dFN0cmVhbTwvdHQ+IHRvIHJlbGVhc2UgdGhlCisgKiBhbGxvY2F0ZWQgbWVtb3J5LiAgU2VlIHtAbGluayBDQlppcDJPdXRwdXRTdHJlYW0KKyAqIENCWmlwMk91dHB1dFN0cmVhbX0gZm9yIGluZm9ybWF0aW9uIGFib3V0IG1lbW9yeSB1c2FnZS48L3A+CisgKgorICogPHA+PHR0PkNCWmlwMklucHV0U3RyZWFtPC90dD4gcmVhZHMgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZAorICogc291cmNlIHN0cmVhbSB2aWEgdGhlIHNpbmdsZSBieXRlIHtAbGluayBqYXZhLmlvLklucHV0U3RyZWFtI3JlYWQoKQorICogcmVhZCgpfSBtZXRob2QgZXhjbHVzaXZlbHkuIFRodXMgeW91IHNob3VsZCBjb25zaWRlciB0byB1c2UgYQorICogYnVmZmVyZWQgc291cmNlIHN0cmVhbS48L3A+CisgKiAKKyAqIDxwPkluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBub3QgdGhyZWFkc2FmZS48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBDQlppcDJJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIGltcGxlbWVudHMgQlppcDJDb25zdGFudHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXBvcnRDUkNFcnJvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRoZSBjbGVhbiB3YXkgd291bGQgYmUgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgICAvL3Rocm93IG5ldyBJT0V4Y2VwdGlvbigiY3JjIGVycm9yIik7CisKKyAgICAgICAgLy8gSnVzdCBwcmludCBhIG1lc3NhZ2UsIGxpa2UgdGhlIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY2xhc3MgZGlkCisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQlppcDIgQ1JDIGVycm9yIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1ha2VNYXBzKCkgeworICAgICAgICBmaW5hbCBib29sZWFuW10gaW5Vc2UgICA9IHRoaXMuZGF0YS5pblVzZTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIHNlcVRvVW5zZXEgPSB0aGlzLmRhdGEuc2VxVG9VbnNlcTsKKworICAgICAgICBpbnQgbkluVXNlU2hhZG93ID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5Vc2VbaV0pCisgICAgICAgICAgICAgICAgc2VxVG9VbnNlcVtuSW5Vc2VTaGFkb3crK10gPSAoYnl0ZSkgaTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMubkluVXNlID0gbkluVXNlU2hhZG93OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGV4IG9mIHRoZSBsYXN0IGNoYXIgaW4gdGhlIGJsb2NrLCBzbyB0aGUgYmxvY2sgc2l6ZSA9PSBsYXN0ICsgMS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCAgbGFzdDsKKworICAgIC8qKgorICAgICAqIEluZGV4IGluIHpwdHJbXSBvZiBvcmlnaW5hbCBzdHJpbmcgYWZ0ZXIgc29ydGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCAgb3JpZ1B0cjsKKworICAgIC8qKgorICAgICAqIGFsd2F5czogaW4gdGhlIHJhbmdlIDAgLi4gOS4KKyAgICAgKiBUaGUgY3VycmVudCBibG9jayBzaXplIGlzIDEwMDAwMCAqIHRoaXMgbnVtYmVyLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGJsb2NrU2l6ZTEwMGs7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gYmxvY2tSYW5kb21pc2VkOworCisgICAgcHJpdmF0ZSBpbnQgYnNCdWZmOworICAgIHByaXZhdGUgaW50IGJzTGl2ZTsKKyAgICBwcml2YXRlIGZpbmFsIENSQyBjcmMgPSBuZXcgQ1JDKCk7CisKKyAgICBwcml2YXRlIGludCBuSW5Vc2U7CisKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGluOworCisgICAgcHJpdmF0ZSBpbnQgY3VycmVudENoYXIgPSAtMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFT0YgICAgICAgICAgICAgICAgICA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0JMT0NLX1NUQVRFID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkFORF9QQVJUX0FfU1RBVEUgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQU5EX1BBUlRfQl9TVEFURSA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJBTkRfUEFSVF9DX1NUQVRFID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fUkFORF9QQVJUX0FfU1RBVEUgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19SQU5EX1BBUlRfQl9TVEFURSA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX1JBTkRfUEFSVF9DX1NUQVRFID0gNzsKKworICAgIHByaXZhdGUgaW50IGN1cnJlbnRTdGF0ZSA9IFNUQVJUX0JMT0NLX1NUQVRFOworCisgICAgcHJpdmF0ZSBpbnQgc3RvcmVkQmxvY2tDUkMsIHN0b3JlZENvbWJpbmVkQ1JDOworICAgIHByaXZhdGUgaW50IGNvbXB1dGVkQmxvY2tDUkMsIGNvbXB1dGVkQ29tYmluZWRDUkM7CisKKyAgICAvLyBWYXJpYWJsZXMgdXNlZCBieSBzZXR1cCogbWV0aG9kcyBleGNsdXNpdmVseQorCisgICAgcHJpdmF0ZSBpbnQgc3VfY291bnQ7CisgICAgcHJpdmF0ZSBpbnQgc3VfY2gyOworICAgIHByaXZhdGUgaW50IHN1X2NoUHJldjsKKyAgICBwcml2YXRlIGludCBzdV9pMjsKKyAgICBwcml2YXRlIGludCBzdV9qMjsKKyAgICBwcml2YXRlIGludCBzdV9yTlRvR287CisgICAgcHJpdmF0ZSBpbnQgc3VfclRQb3M7CisgICAgcHJpdmF0ZSBpbnQgc3VfdFBvczsKKyAgICBwcml2YXRlIGNoYXIgc3VfejsKKworICAgIC8qKgorICAgICAqIEFsbCBtZW1vcnkgaW50ZW5zaXZlIHN0dWZmLgorICAgICAqIFRoaXMgZmllbGQgaXMgaW5pdGlhbGl6ZWQgYnkgaW5pdEJsb2NrKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBDQlppcDJJbnB1dFN0cmVhbS5EYXRhIGRhdGE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IENCWmlwMklucHV0U3RyZWFtIHdoaWNoIGRlY29tcHJlc3NlcyBieXRlcyByZWFkIGZyb20KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KKyAgICAgKgorICAgICAqIDxwPkFsdGhvdWdoIEJaaXAyIGhlYWRlcnMgYXJlIG1hcmtlZCB3aXRoIHRoZSBtYWdpYworICAgICAqIDx0dD4iQnoiPC90dD4gdGhpcyBjb25zdHJ1Y3RvciBleHBlY3RzIHRoZSBuZXh0IGJ5dGUgaW4gdGhlCisgICAgICogc3RyZWFtIHRvIGJlIHRoZSBmaXJzdCBvbmUgYWZ0ZXIgdGhlIG1hZ2ljLiAgVGh1cyBjYWxsZXJzIGhhdmUKKyAgICAgKiB0byBza2lwIHRoZSBmaXJzdCB0d28gYnl0ZXMuIE90aGVyd2lzZSB0aGlzIGNvbnN0cnVjdG9yIHdpbGwKKyAgICAgKiB0aHJvdyBhbiBleGNlcHRpb24uIDwvcD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgaWYgdGhlIHN0cmVhbSBjb250ZW50IGlzIG1hbGZvcm1lZCBvciBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgaWYgPHR0PmluID09IG51bGw8L3R0PgorICAgICAqLworICAgIHB1YmxpYyBDQlppcDJJbnB1dFN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoKTsKKworICAgICAgICB0aGlzLmluID0gaW47CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy5pbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcmVhZDAoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic3RyZWFtIGNsb3NlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBkZXN0LCBmaW5hbCBpbnQgb2ZmcywgZmluYWwgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9mZnMgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigib2ZmcygiICsgb2ZmcyArICIpIDwgMC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oImxlbigiICsgbGVuICsgIikgPCAwLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzICsgbGVuID4gZGVzdC5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJvZmZzKCIgKyBvZmZzICsgIikgKyBsZW4oIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsZW4gKyAiKSA+IGRlc3QubGVuZ3RoKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVzdC5sZW5ndGggKyAiKS4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5pbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInN0cmVhbSBjbG9zZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBoaSA9IG9mZnMgKyBsZW47CisgICAgICAgIGludCBkZXN0T2ZmcyA9IG9mZnM7CisgICAgICAgIGZvciAoaW50IGI7IChkZXN0T2ZmcyA8IGhpKSAmJiAoKGIgPSByZWFkMCgpKSA+PSAwKTspIHsKKyAgICAgICAgICAgIGRlc3RbZGVzdE9mZnMrK10gPSAoYnl0ZSkgYjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZGVzdE9mZnMgPT0gb2ZmcykgPyAtMSA6IChkZXN0T2ZmcyAtIG9mZnMpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHJlYWQwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHJldENoYXIgPSB0aGlzLmN1cnJlbnRDaGFyOworCisgICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50U3RhdGUpIHsKKyAgICAgICAgY2FzZSBFT0Y6CisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgY2FzZSBTVEFSVF9CTE9DS19TVEFURToKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKworICAgICAgICBjYXNlIFJBTkRfUEFSVF9BX1NUQVRFOgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIGNhc2UgUkFORF9QQVJUX0JfU1RBVEU6CisgICAgICAgICAgICBzZXR1cFJhbmRQYXJ0QigpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSQU5EX1BBUlRfQ19TVEFURToKKyAgICAgICAgICAgIHNldHVwUmFuZFBhcnRDKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE5PX1JBTkRfUEFSVF9BX1NUQVRFOgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIGNhc2UgTk9fUkFORF9QQVJUX0JfU1RBVEU6CisgICAgICAgICAgICBzZXR1cE5vUmFuZFBhcnRCKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE5PX1JBTkRfUEFSVF9DX1NUQVRFOgorICAgICAgICAgICAgc2V0dXBOb1JhbmRQYXJ0QygpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXRDaGFyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IG1hZ2ljMiA9IHRoaXMuaW4ucmVhZCgpOworICAgICAgICBpZiAobWFnaWMyICE9ICdoJykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gaXMgbm90IEJaaXAyIGZvcm1hdHRlZDogZXhwZWN0ZWQgJ2gnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcyBmaXJzdCBieXRlIGJ1dCBnb3QgJyIgKyAoY2hhcikgbWFnaWMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGJsb2NrU2l6ZSA9IHRoaXMuaW4ucmVhZCgpOworICAgICAgICBpZiAoKGJsb2NrU2l6ZSA8ICcxJykgfHwgKGJsb2NrU2l6ZSA+ICc5JykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGlzIG5vdCBCWmlwMiBmb3JtYXR0ZWQ6IGlsbGVnYWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJsb2Nrc2l6ZSAiICsgKGNoYXIpIGJsb2NrU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmJsb2NrU2l6ZTEwMGsgPSBibG9ja1NpemUgLSAnMCc7CisKKyAgICAgICAgaW5pdEJsb2NrKCk7CisgICAgICAgIHNldHVwQmxvY2soKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhciBtYWdpYzAgPSBic0dldFVCeXRlKCk7CisgICAgICAgIGNoYXIgbWFnaWMxID0gYnNHZXRVQnl0ZSgpOworICAgICAgICBjaGFyIG1hZ2ljMiA9IGJzR2V0VUJ5dGUoKTsKKyAgICAgICAgY2hhciBtYWdpYzMgPSBic0dldFVCeXRlKCk7CisgICAgICAgIGNoYXIgbWFnaWM0ID0gYnNHZXRVQnl0ZSgpOworICAgICAgICBjaGFyIG1hZ2ljNSA9IGJzR2V0VUJ5dGUoKTsKKworICAgICAgICBpZiAobWFnaWMwID09IDB4MTcgJiYKKyAgICAgICAgICAgIG1hZ2ljMSA9PSAweDcyICYmCisgICAgICAgICAgICBtYWdpYzIgPT0gMHg0NSAmJgorICAgICAgICAgICAgbWFnaWMzID09IDB4MzggJiYKKyAgICAgICAgICAgIG1hZ2ljNCA9PSAweDUwICYmCisgICAgICAgICAgICBtYWdpYzUgPT0gMHg5MCkgeworICAgICAgICAgICAgY29tcGxldGUoKTsgLy8gZW5kIG9mIGZpbGUKKyAgICAgICAgfSBlbHNlIGlmIChtYWdpYzAgIT0gMHgzMSB8fCAvLyAnMScKKyAgICAgICAgICAgICAgICAgICBtYWdpYzEgIT0gMHg0MSB8fCAvLyAnKScKKyAgICAgICAgICAgICAgICAgICBtYWdpYzIgIT0gMHg1OSB8fCAvLyAnWScKKyAgICAgICAgICAgICAgICAgICBtYWdpYzMgIT0gMHgyNiB8fCAvLyAnJicKKyAgICAgICAgICAgICAgICAgICBtYWdpYzQgIT0gMHg1MyB8fCAvLyAnUycKKyAgICAgICAgICAgICAgICAgICBtYWdpYzUgIT0gMHg1OSAgIC8vICdZJworICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSBFT0Y7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImJhZCBibG9jayBoZWFkZXIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuc3RvcmVkQmxvY2tDUkMgPSBic0dldEludCgpOworICAgICAgICAgICAgdGhpcy5ibG9ja1JhbmRvbWlzZWQgPSBic1IoMSkgPT0gMTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBbGxvY2F0ZSBkYXRhIGhlcmUgaW5zdGVhZCBpbiBjb25zdHJ1Y3Rvciwgc28gd2UgZG8gbm90CisgICAgICAgICAgICAgKiBhbGxvY2F0ZSBpdCBpZiB0aGUgaW5wdXQgZmlsZSBpcyBlbXB0eS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IERhdGEodGhpcy5ibG9ja1NpemUxMDBrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY3VyckJsb2NrTm8rKzsKKyAgICAgICAgICAgIGdldEFuZE1vdmVUb0Zyb250RGVjb2RlKCk7CisKKyAgICAgICAgICAgIHRoaXMuY3JjLmluaXRpYWxpc2VDUkMoKTsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gU1RBUlRfQkxPQ0tfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kQmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLmNvbXB1dGVkQmxvY2tDUkMgPSB0aGlzLmNyYy5nZXRGaW5hbENSQygpOworCisgICAgICAgIC8vIEEgYmFkIENSQyBpcyBjb25zaWRlcmVkIGEgZmF0YWwgZXJyb3IuCisgICAgICAgIGlmICh0aGlzLnN0b3JlZEJsb2NrQ1JDICE9IHRoaXMuY29tcHV0ZWRCbG9ja0NSQykgeworICAgICAgICAgICAgLy8gbWFrZSBuZXh0IGJsb2NrcyByZWFkYWJsZSB3aXRob3V0IGVycm9yCisgICAgICAgICAgICAvLyAocmVwYWlyIGZlYXR1cmUsIG5vdCB5ZXQgZG9jdW1lbnRlZCwgbm90IHRlc3RlZCkKKyAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRDb21iaW5lZENSQworICAgICAgICAgICAgICAgID0gKHRoaXMuc3RvcmVkQ29tYmluZWRDUkMgPDwgMSkKKyAgICAgICAgICAgICAgICB8ICh0aGlzLnN0b3JlZENvbWJpbmVkQ1JDID4+PiAzMSk7CisgICAgICAgICAgICB0aGlzLmNvbXB1dGVkQ29tYmluZWRDUkMgXj0gdGhpcy5zdG9yZWRCbG9ja0NSQzsKKworICAgICAgICAgICAgcmVwb3J0Q1JDRXJyb3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY29tcHV0ZWRDb21iaW5lZENSQworICAgICAgICAgICAgPSAodGhpcy5jb21wdXRlZENvbWJpbmVkQ1JDIDw8IDEpCisgICAgICAgICAgICB8ICh0aGlzLmNvbXB1dGVkQ29tYmluZWRDUkMgPj4+IDMxKTsKKyAgICAgICAgdGhpcy5jb21wdXRlZENvbWJpbmVkQ1JDIF49IHRoaXMuY29tcHV0ZWRCbG9ja0NSQzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29tcGxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLnN0b3JlZENvbWJpbmVkQ1JDID0gYnNHZXRJbnQoKTsKKyAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSBFT0Y7CisgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7CisKKyAgICAgICAgaWYgKHRoaXMuc3RvcmVkQ29tYmluZWRDUkMgIT0gdGhpcy5jb21wdXRlZENvbWJpbmVkQ1JDKSB7CisgICAgICAgICAgICByZXBvcnRDUkNFcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpblNoYWRvdyA9IHRoaXMuaW47CisgICAgICAgIGlmIChpblNoYWRvdyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChpblNoYWRvdyAhPSBTeXN0ZW0uaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaW5TaGFkb3cuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhpcy5pbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBic1IoZmluYWwgaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBic0xpdmVTaGFkb3cgPSB0aGlzLmJzTGl2ZTsKKyAgICAgICAgaW50IGJzQnVmZlNoYWRvdyA9IHRoaXMuYnNCdWZmOworCisgICAgICAgIGlmIChic0xpdmVTaGFkb3cgPCBuKSB7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpblNoYWRvdyA9IHRoaXMuaW47CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IHRoZWNoID0gaW5TaGFkb3cucmVhZCgpOworCisgICAgICAgICAgICAgICAgaWYgKHRoZWNoIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJzQnVmZlNoYWRvdyA9IChic0J1ZmZTaGFkb3cgPDwgOCkgfCB0aGVjaDsKKyAgICAgICAgICAgICAgICBic0xpdmVTaGFkb3cgKz0gODsKKyAgICAgICAgICAgIH0gd2hpbGUgKGJzTGl2ZVNoYWRvdyA8IG4pOworCisgICAgICAgICAgICB0aGlzLmJzQnVmZiA9IGJzQnVmZlNoYWRvdzsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuYnNMaXZlID0gYnNMaXZlU2hhZG93IC0gbjsKKyAgICAgICAgcmV0dXJuIChic0J1ZmZTaGFkb3cgPj4gKGJzTGl2ZVNoYWRvdyAtIG4pKSAmICgoMSA8PCBuKSAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBic0dldEJpdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBic0xpdmVTaGFkb3cgPSB0aGlzLmJzTGl2ZTsKKyAgICAgICAgaW50IGJzQnVmZlNoYWRvdyA9IHRoaXMuYnNCdWZmOworCisgICAgICAgIGlmIChic0xpdmVTaGFkb3cgPCAxKSB7CisgICAgICAgICAgICBpbnQgdGhlY2ggPSB0aGlzLmluLnJlYWQoKTsKKworICAgICAgICAgICAgaWYgKHRoZWNoIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJzQnVmZlNoYWRvdyA9IChic0J1ZmZTaGFkb3cgPDwgOCkgfCB0aGVjaDsKKyAgICAgICAgICAgIGJzTGl2ZVNoYWRvdyArPSA4OworICAgICAgICAgICAgdGhpcy5ic0J1ZmYgPSBic0J1ZmZTaGFkb3c7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmJzTGl2ZSA9IGJzTGl2ZVNoYWRvdyAtIDE7CisgICAgICAgIHJldHVybiAoKGJzQnVmZlNoYWRvdyA+PiAoYnNMaXZlU2hhZG93IC0gMSkpICYgMSkgIT0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGNoYXIgYnNHZXRVQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoY2hhcikgYnNSKDgpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGJzR2V0SW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuICgoKCgoYnNSKDgpIDw8IDgpIHwgYnNSKDgpKSA8PCA4KSB8IGJzUig4KSkgPDwgOCkgfCBic1IoOCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGNyZWF0ZUh1ZmZtYW5EZWNvZGluZ1RhYmxlcygpIGV4Y2x1c2l2ZWx5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaGJDcmVhdGVEZWNvZGVUYWJsZXMoZmluYWwgaW50W10gbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnRbXSBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gcGVybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWluTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1heExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBhbHBoYVNpemUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1pbkxlbiwgcHAgPSAwOyBpIDw9IG1heExlbjsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGFscGhhU2l6ZTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aFtqXSA9PSBpKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcm1bcHArK10gPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSBNQVhfQ09ERV9MRU47IC0taSA+IDA7KSB7CisgICAgICAgICAgICBiYXNlW2ldID0gMDsKKyAgICAgICAgICAgIGxpbWl0W2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFTaXplOyBpKyspIHsKKyAgICAgICAgICAgIGJhc2VbbGVuZ3RoW2ldICsgMV0rKzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAxLCBiID0gYmFzZVswXTsgaSA8IE1BWF9DT0RFX0xFTjsgaSsrKSB7CisgICAgICAgICAgICBiICs9IGJhc2VbaV07CisgICAgICAgICAgICBiYXNlW2ldID0gYjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSBtaW5MZW4sIHZlYyA9IDAsIGIgPSBiYXNlW2ldOyBpIDw9IG1heExlbjsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbmIgPSBiYXNlW2kgKyAxXTsKKyAgICAgICAgICAgIHZlYyArPSBuYiAtIGI7CisgICAgICAgICAgICBiID0gbmI7CisgICAgICAgICAgICBsaW1pdFtpXSA9IHZlYyAtIDE7CisgICAgICAgICAgICB2ZWMgPDw9IDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gbWluTGVuICsgMTsgaSA8PSBtYXhMZW47IGkrKykgeworICAgICAgICAgICAgYmFzZVtpXSA9ICgobGltaXRbaSAtIDFdICsgMSkgPDwgMSkgLSBiYXNlW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlY3ZEZWNvZGluZ1RhYmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIERhdGEgZGF0YVNoYWRvdyAgICAgPSB0aGlzLmRhdGE7CisgICAgICAgIGZpbmFsIGJvb2xlYW5bXSBpblVzZSAgICAgPSBkYXRhU2hhZG93LmluVXNlOworICAgICAgICBmaW5hbCBieXRlW10gcG9zICAgICAgICAgID0gZGF0YVNoYWRvdy5yZWN2RGVjb2RpbmdUYWJsZXNfcG9zOworICAgICAgICBmaW5hbCBieXRlW10gc2VsZWN0b3IgICAgID0gZGF0YVNoYWRvdy5zZWxlY3RvcjsKKyAgICAgICAgZmluYWwgYnl0ZVtdIHNlbGVjdG9yTXRmICA9IGRhdGFTaGFkb3cuc2VsZWN0b3JNdGY7CisKKyAgICAgICAgaW50IGluVXNlMTYgPSAwOworCisgICAgICAgIC8qIFJlY2VpdmUgdGhlIG1hcHBpbmcgdGFibGUgKi8KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYnNHZXRCaXQoKSkgeworICAgICAgICAgICAgICAgIGluVXNlMTYgfD0gMSA8PCBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDI1NjsgLS1pID49IDA7KSB7CisgICAgICAgICAgICBpblVzZVtpXSA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKGluVXNlMTYgJiAoMSA8PCBpKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpMTYgPSBpIDw8IDQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChic0dldEJpdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpblVzZVtpMTYgKyBqXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYWtlTWFwcygpOworICAgICAgICBmaW5hbCBpbnQgYWxwaGFTaXplID0gdGhpcy5uSW5Vc2UgKyAyOworCisgICAgICAgIC8qIE5vdyB0aGUgc2VsZWN0b3JzICovCisgICAgICAgIGZpbmFsIGludCBuR3JvdXBzID0gYnNSKDMpOworICAgICAgICBmaW5hbCBpbnQgblNlbGVjdG9ycyA9IGJzUigxNSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChic0dldEJpdCgpKSB7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZWN0b3JNdGZbaV0gPSAoYnl0ZSkgajsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVuZG8gdGhlIE1URiB2YWx1ZXMgZm9yIHRoZSBzZWxlY3RvcnMuICovCisgICAgICAgIGZvciAoaW50IHYgPSBuR3JvdXBzOyAtLXYgPj0gMDspIHsKKyAgICAgICAgICAgIHBvc1t2XSA9IChieXRlKSB2OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2ID0gc2VsZWN0b3JNdGZbaV0gJiAweGZmOworICAgICAgICAgICAgZmluYWwgYnl0ZSB0bXAgPSBwb3Nbdl07CisgICAgICAgICAgICB3aGlsZSAodiA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBuZWFybHkgYWxsIHRpbWVzIHYgaXMgemVybywgNCBpbiBtb3N0IG90aGVyIGNhc2VzCisgICAgICAgICAgICAgICAgcG9zW3ZdID0gcG9zW3YgLSAxXTsKKyAgICAgICAgICAgICAgICB2LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NbMF0gPSB0bXA7CisgICAgICAgICAgICBzZWxlY3RvcltpXSA9IHRtcDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGNoYXJbXVtdIGxlbiAgPSBkYXRhU2hhZG93LnRlbXBfY2hhckFycmF5MmQ7CisKKyAgICAgICAgLyogTm93IHRoZSBjb2RpbmcgdGFibGVzICovCisgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKSB7CisgICAgICAgICAgICBpbnQgY3VyciA9IGJzUig1KTsKKyAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBsZW5fdCA9IGxlblt0XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYnNHZXRCaXQoKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyICs9IGJzR2V0Qml0KCkgPyAtMSA6IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbl90W2ldID0gKGNoYXIpIGN1cnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5hbGx5IGNyZWF0ZSB0aGUgSHVmZm1hbiB0YWJsZXMKKyAgICAgICAgY3JlYXRlSHVmZm1hbkRlY29kaW5nVGFibGVzKGFscGhhU2l6ZSwgbkdyb3Vwcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHJlY3ZEZWNvZGluZ1RhYmxlcygpIGV4Y2x1c2l2ZWx5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVIdWZmbWFuRGVjb2RpbmdUYWJsZXMoZmluYWwgaW50IGFscGhhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuR3JvdXBzKSB7CisgICAgICAgIGZpbmFsIERhdGEgZGF0YVNoYWRvdyA9IHRoaXMuZGF0YTsKKyAgICAgICAgZmluYWwgY2hhcltdW10gbGVuICA9IGRhdGFTaGFkb3cudGVtcF9jaGFyQXJyYXkyZDsKKyAgICAgICAgZmluYWwgaW50W10gbWluTGVucyA9IGRhdGFTaGFkb3cubWluTGVuczsKKyAgICAgICAgZmluYWwgaW50W11bXSBsaW1pdCA9IGRhdGFTaGFkb3cubGltaXQ7CisgICAgICAgIGZpbmFsIGludFtdW10gYmFzZSAgPSBkYXRhU2hhZG93LmJhc2U7CisgICAgICAgIGZpbmFsIGludFtdW10gcGVybSAgPSBkYXRhU2hhZG93LnBlcm07CisKKyAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKyAgICAgICAgICAgIGludCBtaW5MZW4gPSAzMjsKKyAgICAgICAgICAgIGludCBtYXhMZW4gPSAwOworICAgICAgICAgICAgZmluYWwgY2hhcltdIGxlbl90ID0gbGVuW3RdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFscGhhU2l6ZTsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgZmluYWwgY2hhciBsZW50ID0gbGVuX3RbaV07CisgICAgICAgICAgICAgICAgaWYgKGxlbnQgPiBtYXhMZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4TGVuID0gbGVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxlbnQgPCBtaW5MZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbWluTGVuID0gbGVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYkNyZWF0ZURlY29kZVRhYmxlcyhsaW1pdFt0XSwgYmFzZVt0XSwgcGVybVt0XSwgbGVuW3RdLCBtaW5MZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW4sIGFscGhhU2l6ZSk7CisgICAgICAgICAgICBtaW5MZW5zW3RdID0gbWluTGVuOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldEFuZE1vdmVUb0Zyb250RGVjb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5vcmlnUHRyID0gYnNSKDI0KTsKKyAgICAgICAgcmVjdkRlY29kaW5nVGFibGVzKCk7CisKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5TaGFkb3cgPSB0aGlzLmluOworICAgICAgICBmaW5hbCBEYXRhIGRhdGFTaGFkb3cgICA9IHRoaXMuZGF0YTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGxsOCAgICAgICAgPSBkYXRhU2hhZG93LmxsODsKKyAgICAgICAgZmluYWwgaW50W10gdW56ZnRhYiAgICAgPSBkYXRhU2hhZG93LnVuemZ0YWI7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBzZWxlY3RvciAgID0gZGF0YVNoYWRvdy5zZWxlY3RvcjsKKyAgICAgICAgZmluYWwgYnl0ZVtdIHNlcVRvVW5zZXEgPSBkYXRhU2hhZG93LnNlcVRvVW5zZXE7CisgICAgICAgIGZpbmFsIGNoYXJbXSB5eSAgICAgICAgID0gZGF0YVNoYWRvdy5nZXRBbmRNb3ZlVG9Gcm9udERlY29kZV95eTsKKyAgICAgICAgZmluYWwgaW50W10gbWluTGVucyAgICAgPSBkYXRhU2hhZG93Lm1pbkxlbnM7CisgICAgICAgIGZpbmFsIGludFtdW10gbGltaXQgICAgID0gZGF0YVNoYWRvdy5saW1pdDsKKyAgICAgICAgZmluYWwgaW50W11bXSBiYXNlICAgICAgPSBkYXRhU2hhZG93LmJhc2U7CisgICAgICAgIGZpbmFsIGludFtdW10gcGVybSAgICAgID0gZGF0YVNoYWRvdy5wZXJtOworICAgICAgICBmaW5hbCBpbnQgbGltaXRMYXN0ICAgICA9IHRoaXMuYmxvY2tTaXplMTAwayAqIDEwMDAwMDsKKworICAgICAgICAvKgorICAgICAgICAgIFNldHRpbmcgdXAgdGhlIHVuemZ0YWIgZW50cmllcyBoZXJlIGlzIG5vdCBzdHJpY3RseQorICAgICAgICAgIG5lY2Vzc2FyeSwgYnV0IGl0IGRvZXMgc2F2ZSBoYXZpbmcgdG8gZG8gaXQgbGF0ZXIKKyAgICAgICAgICBpbiBhIHNlcGFyYXRlIHBhc3MsIGFuZCBzbyBzYXZlcyBhIGJsb2NrJ3Mgd29ydGggb2YKKyAgICAgICAgICBjYWNoZSBtaXNzZXMuCisgICAgICAgICovCisgICAgICAgIGZvciAoaW50IGkgPSAyNTY7IC0taSA+PSAwOykgeworICAgICAgICAgICAgeXlbaV0gPSAoY2hhcikgaTsKKyAgICAgICAgICAgIHVuemZ0YWJbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdyb3VwTm8gICAgID0gMDsKKyAgICAgICAgaW50IGdyb3VwUG9zICAgID0gR19TSVpFIC0gMTsKKyAgICAgICAgZmluYWwgaW50IGVvYiAgID0gdGhpcy5uSW5Vc2UgKyAxOworICAgICAgICBpbnQgbmV4dFN5bSAgICAgPSBnZXRBbmRNb3ZlVG9Gcm9udERlY29kZTAoMCk7CisgICAgICAgIGludCBic0J1ZmZTaGFkb3cgICAgICA9IHRoaXMuYnNCdWZmOworICAgICAgICBpbnQgYnNMaXZlU2hhZG93ICAgICAgPSB0aGlzLmJzTGl2ZTsKKyAgICAgICAgaW50IGxhc3RTaGFkb3cgICAgICAgID0gLTE7CisgICAgICAgIGludCB6dCAgICAgICAgICA9IHNlbGVjdG9yW2dyb3VwTm9dICYgMHhmZjsKKyAgICAgICAgaW50W10gYmFzZV96dCAgID0gYmFzZVt6dF07CisgICAgICAgIGludFtdIGxpbWl0X3p0ICA9IGxpbWl0W3p0XTsKKyAgICAgICAgaW50W10gcGVybV96dCAgID0gcGVybVt6dF07CisgICAgICAgIGludCBtaW5MZW5zX3p0ICA9IG1pbkxlbnNbenRdOworCisgICAgICAgIHdoaWxlIChuZXh0U3ltICE9IGVvYikgeworICAgICAgICAgICAgaWYgKChuZXh0U3ltID09IFJVTkEpIHx8IChuZXh0U3ltID09IFJVTkIpKSB7CisgICAgICAgICAgICAgICAgaW50IHMgPSAtMTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAxOyB0cnVlOyBuIDw8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U3ltID09IFJVTkEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gbjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0U3ltID09IFJVTkIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gbiA8PCAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBQb3MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBQb3MgICAgPSBHX1NJWkUgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgenQgICAgICAgICAgPSBzZWxlY3RvclsrK2dyb3VwTm9dICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfenQgICAgID0gYmFzZVt6dF07CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdF96dCAgICA9IGxpbWl0W3p0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1fenQgICAgID0gcGVybVt6dF07CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5MZW5zX3p0ICA9IG1pbkxlbnNbenRdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBQb3MtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCB6biA9IG1pbkxlbnNfenQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lZDoKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50IHp2ZWMgPSBic1Ioem4pOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYnNMaXZlU2hhZG93IDwgem4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0aGVjaCA9IGluU2hhZG93LnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVjaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNCdWZmU2hhZG93ID0gKGJzQnVmZlNoYWRvdyA8PCA4KSB8IHRoZWNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzTGl2ZVNoYWRvdyArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCB6dmVjID0gKGJzQnVmZlNoYWRvdyA+PiAoYnNMaXZlU2hhZG93IC0gem4pKSAmICgoMSA8PCB6bikgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnNMaXZlU2hhZG93IC09IHpuOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh6dmVjID4gbGltaXRfenRbem5dKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bisrOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJzTGl2ZVNoYWRvdyA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGhlY2ggPSBpblNoYWRvdy5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZWNoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNCdWZmU2hhZG93ID0gKGJzQnVmZlNoYWRvdyA8PCA4KSB8IHRoZWNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0xpdmVTaGFkb3cgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBic0xpdmVTaGFkb3ctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHp2ZWMgPSAoenZlYyA8PCAxKSB8ICgoYnNCdWZmU2hhZG93ID4+IGJzTGl2ZVNoYWRvdykgJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXh0U3ltID0gcGVybV96dFt6dmVjIC0gYmFzZV96dFt6bl1dOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGUgY2ggPSBzZXFUb1Vuc2VxW3l5WzBdXTsKKyAgICAgICAgICAgICAgICB1bnpmdGFiW2NoICYgMHhmZl0gKz0gcyArIDE7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAocy0tID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGw4WysrbGFzdFNoYWRvd10gPSBjaDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGFzdFNoYWRvdyA+PSBsaW1pdExhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJibG9jayBvdmVycnVuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKytsYXN0U2hhZG93ID49IGxpbWl0TGFzdCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImJsb2NrIG92ZXJydW4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIHRtcCA9IHl5W25leHRTeW0gLSAxXTsKKyAgICAgICAgICAgICAgICB1bnpmdGFiW3NlcVRvVW5zZXFbdG1wXSAmIDB4ZmZdKys7CisgICAgICAgICAgICAgICAgbGw4W2xhc3RTaGFkb3ddID0gc2VxVG9VbnNlcVt0bXBdOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgIFRoaXMgbG9vcCBpcyBoYW1tZXJlZCBkdXJpbmcgZGVjb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgIGhlbmNlIGF2b2lkIG5hdGl2ZSBtZXRob2QgY2FsbCBvdmVyaGVhZCBvZgorICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSBmb3IgdmVyeSBzbWFsbCByYW5nZXMgdG8gY29weS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChuZXh0U3ltIDw9IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBuZXh0U3ltIC0gMTsgaiA+IDA7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5eVtqXSA9IHl5Wy0tal07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5LCAwLCB5eSwgMSwgbmV4dFN5bSAtIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHl5WzBdID0gdG1wOworCisgICAgICAgICAgICAgICAgaWYgKGdyb3VwUG9zID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBQb3MgICAgPSBHX1NJWkUgLSAxOworICAgICAgICAgICAgICAgICAgICB6dCAgICAgICAgICA9IHNlbGVjdG9yWysrZ3JvdXBOb10gJiAweGZmOworICAgICAgICAgICAgICAgICAgICBiYXNlX3p0ICAgICA9IGJhc2VbenRdOworICAgICAgICAgICAgICAgICAgICBsaW1pdF96dCAgICA9IGxpbWl0W3p0XTsKKyAgICAgICAgICAgICAgICAgICAgcGVybV96dCAgICAgPSBwZXJtW3p0XTsKKyAgICAgICAgICAgICAgICAgICAgbWluTGVuc196dCAgPSBtaW5MZW5zW3p0XTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBncm91cFBvcy0tOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCB6biA9IG1pbkxlbnNfenQ7CisKKyAgICAgICAgICAgICAgICAvLyBJbmxpbmVkOgorICAgICAgICAgICAgICAgIC8vIGludCB6dmVjID0gYnNSKHpuKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYnNMaXZlU2hhZG93IDwgem4pIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRoZWNoID0gaW5TaGFkb3cucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhlY2ggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnNCdWZmU2hhZG93ID0gKGJzQnVmZlNoYWRvdyA8PCA4KSB8IHRoZWNoOworICAgICAgICAgICAgICAgICAgICAgICAgYnNMaXZlU2hhZG93ICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHp2ZWMgPSAoYnNCdWZmU2hhZG93ID4+IChic0xpdmVTaGFkb3cgLSB6bikpICYgKCgxIDw8IHpuKSAtIDEpOworICAgICAgICAgICAgICAgIGJzTGl2ZVNoYWRvdyAtPSB6bjsKKworICAgICAgICAgICAgICAgIHdoaWxlICh6dmVjID4gbGltaXRfenRbem5dKSB7CisgICAgICAgICAgICAgICAgICAgIHpuKys7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChic0xpdmVTaGFkb3cgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGhlY2ggPSBpblNoYWRvdy5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlY2ggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzQnVmZlNoYWRvdyA9IChic0J1ZmZTaGFkb3cgPDwgOCkgfCB0aGVjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0xpdmVTaGFkb3cgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBic0xpdmVTaGFkb3ctLTsKKyAgICAgICAgICAgICAgICAgICAgenZlYyA9ICh6dmVjIDw8IDEpIHwgKChic0J1ZmZTaGFkb3cgPj4gYnNMaXZlU2hhZG93KSAmIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXh0U3ltID0gcGVybV96dFt6dmVjIC0gYmFzZV96dFt6bl1dOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhpcy5sYXN0ID0gbGFzdFNoYWRvdzsKKyAgICAgICAgdGhpcy5ic0xpdmUgPSBic0xpdmVTaGFkb3c7CisgICAgICAgIHRoaXMuYnNCdWZmID0gYnNCdWZmU2hhZG93OworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEFuZE1vdmVUb0Zyb250RGVjb2RlMChmaW5hbCBpbnQgZ3JvdXBObykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5TaGFkb3cgID0gdGhpcy5pbjsKKyAgICAgICAgZmluYWwgRGF0YSBkYXRhU2hhZG93ICA9IHRoaXMuZGF0YTsKKyAgICAgICAgZmluYWwgaW50IHp0ICAgICAgICAgID0gZGF0YVNoYWRvdy5zZWxlY3Rvcltncm91cE5vXSAmIDB4ZmY7CisgICAgICAgIGZpbmFsIGludFtdIGxpbWl0X3p0ICA9IGRhdGFTaGFkb3cubGltaXRbenRdOworICAgICAgICBpbnQgem4gPSBkYXRhU2hhZG93Lm1pbkxlbnNbenRdOworICAgICAgICBpbnQgenZlYyA9IGJzUih6bik7CisgICAgICAgIGludCBic0xpdmVTaGFkb3cgPSB0aGlzLmJzTGl2ZTsKKyAgICAgICAgaW50IGJzQnVmZlNoYWRvdyA9IHRoaXMuYnNCdWZmOworCisgICAgICAgIHdoaWxlICh6dmVjID4gbGltaXRfenRbem5dKSB7CisgICAgICAgICAgICB6bisrOworICAgICAgICAgICAgd2hpbGUgKGJzTGl2ZVNoYWRvdyA8IDEpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGhlY2ggPSBpblNoYWRvdy5yZWFkKCk7CisKKyAgICAgICAgICAgICAgICBpZiAodGhlY2ggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBic0J1ZmZTaGFkb3cgPSAoYnNCdWZmU2hhZG93IDw8IDgpIHwgdGhlY2g7CisgICAgICAgICAgICAgICAgICAgIGJzTGl2ZVNoYWRvdyArPSA4OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzTGl2ZVNoYWRvdy0tOworICAgICAgICAgICAgenZlYyA9ICh6dmVjIDw8IDEpIHwgKChic0J1ZmZTaGFkb3cgPj4gYnNMaXZlU2hhZG93KSAmIDEpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5ic0xpdmUgPSBic0xpdmVTaGFkb3c7CisgICAgICAgIHRoaXMuYnNCdWZmID0gYnNCdWZmU2hhZG93OworCisgICAgICAgIHJldHVybiBkYXRhU2hhZG93LnBlcm1benRdW3p2ZWMgLSBkYXRhU2hhZG93LmJhc2VbenRdW3puXV07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwQmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy5kYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludFtdIGNmdGFiID0gdGhpcy5kYXRhLmNmdGFiOworICAgICAgICBmaW5hbCBpbnRbXSB0dCAgICA9IHRoaXMuZGF0YS5pbml0VFQodGhpcy5sYXN0ICsgMSk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBsbDggID0gdGhpcy5kYXRhLmxsODsKKyAgICAgICAgY2Z0YWJbMF0gPSAwOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZGF0YS51bnpmdGFiLCAwLCBjZnRhYiwgMSwgMjU2KTsKKworICAgICAgICBmb3IgKGludCBpID0gMSwgYyA9IGNmdGFiWzBdOyBpIDw9IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBjICs9IGNmdGFiW2ldOworICAgICAgICAgICAgY2Z0YWJbaV0gPSBjOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxhc3RTaGFkb3cgPSB0aGlzLmxhc3Q7IGkgPD0gbGFzdFNoYWRvdzsgaSsrKSB7CisgICAgICAgICAgICB0dFtjZnRhYltsbDhbaV0gJiAweGZmXSsrXSA9IGk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHRoaXMub3JpZ1B0ciA8IDApIHx8ICh0aGlzLm9yaWdQdHIgPj0gdHQubGVuZ3RoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzdHJlYW0gY29ycnVwdGVkIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnN1X3RQb3MgPSB0dFt0aGlzLm9yaWdQdHJdOworICAgICAgICB0aGlzLnN1X2NvdW50ID0gMDsKKyAgICAgICAgdGhpcy5zdV9pMiA9IDA7CisgICAgICAgIHRoaXMuc3VfY2gyID0gMjU2OyAgIC8qIG5vdCBhIGNoYXIgYW5kIG5vdCBFT0YgKi8KKworICAgICAgICBpZiAodGhpcy5ibG9ja1JhbmRvbWlzZWQpIHsKKyAgICAgICAgICAgIHRoaXMuc3Vfck5Ub0dvID0gMDsKKyAgICAgICAgICAgIHRoaXMuc3VfclRQb3MgPSAwOworICAgICAgICAgICAgc2V0dXBSYW5kUGFydEEoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldHVwTm9SYW5kUGFydEEoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cFJhbmRQYXJ0QSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLnN1X2kyIDw9IHRoaXMubGFzdCkgeworICAgICAgICAgICAgdGhpcy5zdV9jaFByZXYgPSB0aGlzLnN1X2NoMjsKKyAgICAgICAgICAgIGludCBzdV9jaDJTaGFkb3cgPSB0aGlzLmRhdGEubGw4W3RoaXMuc3VfdFBvc10gJiAweGZmOworICAgICAgICAgICAgdGhpcy5zdV90UG9zID0gdGhpcy5kYXRhLnR0W3RoaXMuc3VfdFBvc107CisgICAgICAgICAgICBpZiAodGhpcy5zdV9yTlRvR28gPT0gMCkgeworICAgICAgICAgICAgICAgIHRoaXMuc3Vfck5Ub0dvID0gQlppcDJDb25zdGFudHMuck51bXNbdGhpcy5zdV9yVFBvc10gLSAxOworICAgICAgICAgICAgICAgIGlmICgrK3RoaXMuc3VfclRQb3MgPT0gNTEyKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VfclRQb3MgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdV9yTlRvR28tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuc3VfY2gyID0gc3VfY2gyU2hhZG93IF49ICh0aGlzLnN1X3JOVG9HbyA9PSAxKSA/IDEgOiAwOworICAgICAgICAgICAgdGhpcy5zdV9pMisrOworICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2hhciA9IHN1X2NoMlNoYWRvdzsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gUkFORF9QQVJUX0JfU1RBVEU7CisgICAgICAgICAgICB0aGlzLmNyYy51cGRhdGVDUkMoc3VfY2gyU2hhZG93KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuZEJsb2NrKCk7CisgICAgICAgICAgICBpbml0QmxvY2soKTsKKyAgICAgICAgICAgIHNldHVwQmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cE5vUmFuZFBhcnRBKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMuc3VfaTIgPD0gdGhpcy5sYXN0KSB7CisgICAgICAgICAgICB0aGlzLnN1X2NoUHJldiA9IHRoaXMuc3VfY2gyOworICAgICAgICAgICAgaW50IHN1X2NoMlNoYWRvdyA9IHRoaXMuZGF0YS5sbDhbdGhpcy5zdV90UG9zXSAmIDB4ZmY7CisgICAgICAgICAgICB0aGlzLnN1X2NoMiA9IHN1X2NoMlNoYWRvdzsKKyAgICAgICAgICAgIHRoaXMuc3VfdFBvcyA9IHRoaXMuZGF0YS50dFt0aGlzLnN1X3RQb3NdOworICAgICAgICAgICAgdGhpcy5zdV9pMisrOworICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2hhciA9IHN1X2NoMlNoYWRvdzsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gTk9fUkFORF9QQVJUX0JfU1RBVEU7CisgICAgICAgICAgICB0aGlzLmNyYy51cGRhdGVDUkMoc3VfY2gyU2hhZG93KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gTk9fUkFORF9QQVJUX0FfU1RBVEU7CisgICAgICAgICAgICBlbmRCbG9jaygpOworICAgICAgICAgICAgaW5pdEJsb2NrKCk7CisgICAgICAgICAgICBzZXR1cEJsb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBSYW5kUGFydEIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy5zdV9jaDIgIT0gdGhpcy5zdV9jaFByZXYpIHsKKyAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gUkFORF9QQVJUX0FfU1RBVEU7CisgICAgICAgICAgICB0aGlzLnN1X2NvdW50ID0gMTsKKyAgICAgICAgICAgIHNldHVwUmFuZFBhcnRBKCk7CisgICAgICAgIH0gZWxzZSBpZiAoKyt0aGlzLnN1X2NvdW50ID49IDQpIHsKKyAgICAgICAgICAgIHRoaXMuc3VfeiA9IChjaGFyKSAodGhpcy5kYXRhLmxsOFt0aGlzLnN1X3RQb3NdICYgMHhmZik7CisgICAgICAgICAgICB0aGlzLnN1X3RQb3MgPSB0aGlzLmRhdGEudHRbdGhpcy5zdV90UG9zXTsKKyAgICAgICAgICAgIGlmICh0aGlzLnN1X3JOVG9HbyA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdV9yTlRvR28gPSBCWmlwMkNvbnN0YW50cy5yTnVtc1t0aGlzLnN1X3JUUG9zXSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKCsrdGhpcy5zdV9yVFBvcyA9PSA1MTIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zdV9yVFBvcyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN1X3JOVG9Hby0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5zdV9qMiA9IDA7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IFJBTkRfUEFSVF9DX1NUQVRFOworICAgICAgICAgICAgaWYgKHRoaXMuc3Vfck5Ub0dvID09IDEpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN1X3ogXj0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldHVwUmFuZFBhcnRDKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IFJBTkRfUEFSVF9BX1NUQVRFOworICAgICAgICAgICAgc2V0dXBSYW5kUGFydEEoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cFJhbmRQYXJ0QygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLnN1X2oyIDwgdGhpcy5zdV96KSB7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdV9jaDI7CisgICAgICAgICAgICB0aGlzLmNyYy51cGRhdGVDUkModGhpcy5zdV9jaDIpOworICAgICAgICAgICAgdGhpcy5zdV9qMisrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSBSQU5EX1BBUlRfQV9TVEFURTsKKyAgICAgICAgICAgIHRoaXMuc3VfaTIrKzsKKyAgICAgICAgICAgIHRoaXMuc3VfY291bnQgPSAwOworICAgICAgICAgICAgc2V0dXBSYW5kUGFydEEoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cE5vUmFuZFBhcnRCKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMuc3VfY2gyICE9IHRoaXMuc3VfY2hQcmV2KSB7CisgICAgICAgICAgICB0aGlzLnN1X2NvdW50ID0gMTsKKyAgICAgICAgICAgIHNldHVwTm9SYW5kUGFydEEoKTsKKyAgICAgICAgfSBlbHNlIGlmICgrK3RoaXMuc3VfY291bnQgPj0gNCkgeworICAgICAgICAgICAgdGhpcy5zdV96ID0gKGNoYXIpICh0aGlzLmRhdGEubGw4W3RoaXMuc3VfdFBvc10gJiAweGZmKTsKKyAgICAgICAgICAgIHRoaXMuc3VfdFBvcyA9IHRoaXMuZGF0YS50dFt0aGlzLnN1X3RQb3NdOworICAgICAgICAgICAgdGhpcy5zdV9qMiA9IDA7CisgICAgICAgICAgICBzZXR1cE5vUmFuZFBhcnRDKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXR1cE5vUmFuZFBhcnRBKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBOb1JhbmRQYXJ0QygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLnN1X2oyIDwgdGhpcy5zdV96KSB7CisgICAgICAgICAgICBpbnQgc3VfY2gyU2hhZG93ID0gdGhpcy5zdV9jaDI7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRDaGFyID0gc3VfY2gyU2hhZG93OworICAgICAgICAgICAgdGhpcy5jcmMudXBkYXRlQ1JDKHN1X2NoMlNoYWRvdyk7CisgICAgICAgICAgICB0aGlzLnN1X2oyKys7CisgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IE5PX1JBTkRfUEFSVF9DX1NUQVRFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5zdV9pMisrOworICAgICAgICAgICAgdGhpcy5zdV9jb3VudCA9IDA7CisgICAgICAgICAgICBzZXR1cE5vUmFuZFBhcnRBKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEYXRhIGV4dGVuZHMgT2JqZWN0IHsKKworICAgICAgICAvLyAod2l0aCBibG9ja1NpemUgOTAwaykKKyAgICAgICAgZmluYWwgYm9vbGVhbltdIGluVXNlICAgPSBuZXcgYm9vbGVhblsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAyNTYgYnl0ZQorCisgICAgICAgIGZpbmFsIGJ5dGVbXSBzZXFUb1Vuc2VxICAgPSBuZXcgYnl0ZVsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMjU2IGJ5dGUKKyAgICAgICAgZmluYWwgYnl0ZVtdIHNlbGVjdG9yICAgICA9IG5ldyBieXRlW01BWF9TRUxFQ1RPUlNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgMTgwMDIgYnl0ZQorICAgICAgICBmaW5hbCBieXRlW10gc2VsZWN0b3JNdGYgID0gbmV3IGJ5dGVbTUFYX1NFTEVDVE9SU107ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAxODAwMiBieXRlCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZyZXEgdGFibGUgY29sbGVjdGVkIHRvIHNhdmUgYSBwYXNzIG92ZXIgdGhlIGRhdGEgZHVyaW5nCisgICAgICAgICAqIGRlY29tcHJlc3Npb24uCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBpbnRbXSB1bnpmdGFiID0gbmV3IGludFsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgMTAyNCBieXRlCisKKyAgICAgICAgZmluYWwgaW50W11bXSBsaW1pdCA9IG5ldyBpbnRbTl9HUk9VUFNdW01BWF9BTFBIQV9TSVpFXTsgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIDYxOTIgYnl0ZQorICAgICAgICBmaW5hbCBpbnRbXVtdIGJhc2UgID0gbmV3IGludFtOX0dST1VQU11bTUFYX0FMUEhBX1NJWkVdOyAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgNjE5MiBieXRlCisgICAgICAgIGZpbmFsIGludFtdW10gcGVybSAgPSBuZXcgaW50W05fR1JPVVBTXVtNQVhfQUxQSEFfU0laRV07ICAgICAgICAgICAgICAgICAgICAgIC8vICAgICA2MTkyIGJ5dGUKKyAgICAgICAgZmluYWwgaW50W10gbWluTGVucyA9IG5ldyBpbnRbTl9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgMjQgYnl0ZQorCisgICAgICAgIGZpbmFsIGludFtdICAgICBjZnRhYiAgICAgPSBuZXcgaW50WzI1N107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAxMDI4IGJ5dGUKKyAgICAgICAgZmluYWwgY2hhcltdICAgIGdldEFuZE1vdmVUb0Zyb250RGVjb2RlX3l5ID0gbmV3IGNoYXJbMjU2XTsgICAgICAgICAgICAgICAgICAgLy8gICAgICA1MTIgYnl0ZQorICAgICAgICBmaW5hbCBjaGFyW11bXSAgdGVtcF9jaGFyQXJyYXkyZCAgPSBuZXcgY2hhcltOX0dST1VQU11bTUFYX0FMUEhBX1NJWkVdOyAgICAgICAvLyAgICAgMzA5NiBieXRlCisgICAgICAgIGZpbmFsIGJ5dGVbXSByZWN2RGVjb2RpbmdUYWJsZXNfcG9zID0gbmV3IGJ5dGVbTl9HUk9VUFNdOyAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICA2IGJ5dGUKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gICAgNjA3OTggYnl0ZQorCisgICAgICAgIGludFtdIHR0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAzNjAwMDAwIGJ5dGUKKyAgICAgICAgYnl0ZVtdIGxsODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICA5MDAwMDAgYnl0ZQorICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyAgNDU2MDc4MiBieXRlCisgICAgICAgIC8vPT09PT09PT09PT09PT09CisKKyAgICAgICAgRGF0YShpbnQgYmxvY2tTaXplMTAwaykgeworICAgICAgICAgICAgc3VwZXIoKTsKKworICAgICAgICAgICAgdGhpcy5sbDggPSBuZXcgYnl0ZVtibG9ja1NpemUxMDBrICogQlppcDJDb25zdGFudHMuYmFzZUJsb2NrU2l6ZV07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGl6ZXMgdGhlIHtAbGluayAjdHR9IGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcmVxdWlyZWQgbGVuZ3RoIG9mIHRoZSBhcnJheQorICAgICAgICAgKiBpcyBrbm93bi4gIEkgZG9uJ3QgaW5pdGlhbGl6ZSBpdCBhdCBjb25zdHJ1Y3Rpb24gdGltZSB0bworICAgICAgICAgKiBhdm9pZCB1bm5lY2Nlc3NhcnkgbWVtb3J5IGFsbG9jYXRpb24gd2hlbiBjb21wcmVzc2luZyBzbWFsbAorICAgICAgICAgKiBmaWxlcy4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGludFtdIGluaXRUVChpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICBpbnRbXSB0dFNoYWRvdyA9IHRoaXMudHQ7CisKKyAgICAgICAgICAgIC8vIHR0Lmxlbmd0aCBzaG91bGQgYWx3YXlzIGJlID49IGxlbmd0aCwgYnV0IHRoZW9yZXRpY2FsbHkKKyAgICAgICAgICAgIC8vIGl0IGNhbiBoYXBwZW4sIGlmIHRoZSBjb21wcmVzc29yIG1peGVkIHNtYWxsIGFuZCBsYXJnZQorICAgICAgICAgICAgLy8gYmxvY2tzLiAgTm9ybWFsbHkgb25seSB0aGUgbGFzdCBibG9jayB3aWxsIGJlIHNtYWxsZXIKKyAgICAgICAgICAgIC8vIHRoYW4gb3RoZXJzLgorICAgICAgICAgICAgaWYgKCh0dFNoYWRvdyA9PSBudWxsKSB8fCAodHRTaGFkb3cubGVuZ3RoIDwgbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIHRoaXMudHQgPSB0dFNoYWRvdyA9IG5ldyBpbnRbbGVuZ3RoXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHR0U2hhZG93OworICAgICAgICB9CisKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ0JaaXAyT3V0cHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0NCWmlwMk91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWM5MTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0NCWmlwMk91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTYzMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogVGhpcyBwYWNrYWdlIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgS2Vpcm9uIExpZGRsZSwgQWZ0ZXggU29mdHdhcmUKKyAqIDxrZWlyb25AYWZ0ZXhzdy5jb20+IHRvIHdob20gdGhlIEFudCBwcm9qZWN0IGlzIHZlcnkgZ3JhdGVmdWwgZm9yIGhpcworICogZ3JlYXQgY29kZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYnppcDI7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEFuIG91dHB1dCBzdHJlYW0gdGhhdCBjb21wcmVzc2VzIGludG8gdGhlIEJaaXAyIGZvcm1hdCAod2l0aG91dCB0aGUgZmlsZQorICogaGVhZGVyIGNoYXJzKSBpbnRvIGFub3RoZXIgc3RyZWFtLgorICoKKyAqIFRPRE86ICAgIFVwZGF0ZSB0byBCWmlwMiAxLjAuMQorICovCitwdWJsaWMgY2xhc3MgQ0JaaXAyT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgQlppcDJDb25zdGFudHMgeworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNFVE1BU0sgPSAoMSA8PCAyMSk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJNQVNLID0gKH5TRVRNQVNLKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBHUkVBVEVSX0lDT1NUID0gMTU7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTEVTU0VSX0lDT1NUID0gMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTTUFMTF9USFJFU0ggPSAyMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERVBUSF9USFJFU0ggPSAxMDsKKworICAgIC8qCisgICAgICBJZiB5b3UgYXJlIGV2ZXIgdW5sdWNreS9pbXByb2JhYmxlIGVub3VnaAorICAgICAgdG8gZ2V0IGEgc3RhY2sgb3ZlcmZsb3cgd2hpbHN0IHNvcnRpbmcsCisgICAgICBpbmNyZWFzZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50IGFuZCB0cnkKKyAgICAgIGFnYWluLiAgSW4gcHJhY3RpY2UgSSBoYXZlIG5ldmVyIHNlZW4gdGhlCisgICAgICBzdGFjayBnbyBhYm92ZSAyNyBlbGVtcywgc28gdGhlIGZvbGxvd2luZworICAgICAgbGltaXQgc2VlbXMgdmVyeSBnZW5lcm91cy4KKyAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFFTT1JUX1NUQUNLX1NJWkUgPSAxMDAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYW5pYygpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwYW5pYyIpOworICAgICAgICAvL3Rocm93IG5ldyBDRXJyb3IoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZU1hcHMoKSB7CisgICAgICAgIGludCBpOworICAgICAgICBuSW5Vc2UgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpblVzZVtpXSkgeworICAgICAgICAgICAgICAgIHNlcVRvVW5zZXFbbkluVXNlXSA9IChjaGFyKSBpOworICAgICAgICAgICAgICAgIHVuc2VxVG9TZXFbaV0gPSAoY2hhcikgbkluVXNlOworICAgICAgICAgICAgICAgIG5JblVzZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhiTWFrZUNvZGVMZW5ndGhzKGNoYXJbXSBsZW4sIGludFtdIGZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYVNpemUsIGludCBtYXhMZW4pIHsKKyAgICAgICAgLyoKKyAgICAgICAgICBOb2RlcyBhbmQgaGVhcCBlbnRyaWVzIHJ1biBmcm9tIDEuICBFbnRyeSAwCisgICAgICAgICAgZm9yIGJvdGggdGhlIGhlYXAgYW5kIG5vZGVzIGlzIGEgc2VudGluZWwuCisgICAgICAgICovCisgICAgICAgIGludCBuTm9kZXMsIG5IZWFwLCBuMSwgbjIsIGksIGosIGs7CisgICAgICAgIGJvb2xlYW4gIHRvb0xvbmc7CisKKyAgICAgICAgaW50W10gaGVhcCA9IG5ldyBpbnRbTUFYX0FMUEhBX1NJWkUgKyAyXTsKKyAgICAgICAgaW50W10gd2VpZ2h0ID0gbmV3IGludFtNQVhfQUxQSEFfU0laRSAqIDJdOworICAgICAgICBpbnRbXSBwYXJlbnQgPSBuZXcgaW50W01BWF9BTFBIQV9TSVpFICogMl07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICB3ZWlnaHRbaSArIDFdID0gKGZyZXFbaV0gPT0gMCA/IDEgOiBmcmVxW2ldKSA8PCA4OworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIG5Ob2RlcyA9IGFscGhhU2l6ZTsKKyAgICAgICAgICAgIG5IZWFwID0gMDsKKworICAgICAgICAgICAgaGVhcFswXSA9IDA7CisgICAgICAgICAgICB3ZWlnaHRbMF0gPSAwOworICAgICAgICAgICAgcGFyZW50WzBdID0gLTI7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gYWxwaGFTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICBuSGVhcCsrOworICAgICAgICAgICAgICAgIGhlYXBbbkhlYXBdID0gaTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB6eiwgdG1wOworICAgICAgICAgICAgICAgICAgICB6eiA9IG5IZWFwOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoZWFwW3p6XTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbenogPj4gMV1dKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFwW3p6XSA9IGhlYXBbenogPj4gMV07CisgICAgICAgICAgICAgICAgICAgICAgICB6eiA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoZWFwW3p6XSA9IHRtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShuSGVhcCA8IChNQVhfQUxQSEFfU0laRSArIDIpKSkgeworICAgICAgICAgICAgICAgIHBhbmljKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChuSGVhcCA+IDEpIHsKKyAgICAgICAgICAgICAgICBuMSA9IGhlYXBbMV07CisgICAgICAgICAgICAgICAgaGVhcFsxXSA9IGhlYXBbbkhlYXBdOworICAgICAgICAgICAgICAgIG5IZWFwLS07CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgenogPSAwLCB5eSA9IDAsIHRtcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHp6ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaGVhcFt6el07CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5eSA9IHp6IDw8IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeXkgPiBuSGVhcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHl5IDwgbkhlYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB3ZWlnaHRbaGVhcFt5eSArIDFdXSA8IHdlaWdodFtoZWFwW3l5XV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbeXldXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFt6el0gPSBoZWFwW3l5XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHp6ID0geXk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGVhcFt6el0gPSB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG4yID0gaGVhcFsxXTsKKyAgICAgICAgICAgICAgICBoZWFwWzFdID0gaGVhcFtuSGVhcF07CisgICAgICAgICAgICAgICAgbkhlYXAtLTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB6eiA9IDAsIHl5ID0gMCwgdG1wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgenogPSAxOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoZWFwW3p6XTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHl5ID0genogPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5eSA+IG5IZWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeXkgPCBuSGVhcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHdlaWdodFtoZWFwW3l5ICsgMV1dIDwgd2VpZ2h0W2hlYXBbeXldXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2VpZ2h0W3RtcF0gPCB3ZWlnaHRbaGVhcFt5eV1dKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFwW3p6XSA9IGhlYXBbeXldOworICAgICAgICAgICAgICAgICAgICAgICAgenogPSB5eTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoZWFwW3p6XSA9IHRtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbk5vZGVzKys7CisgICAgICAgICAgICAgICAgcGFyZW50W24xXSA9IHBhcmVudFtuMl0gPSBuTm9kZXM7CisKKyAgICAgICAgICAgICAgICB3ZWlnaHRbbk5vZGVzXSA9ICgod2VpZ2h0W24xXSAmIDB4ZmZmZmZmMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAod2VpZ2h0W24yXSAmIDB4ZmZmZmZmMDApKQorICAgICAgICAgICAgICAgICAgICB8ICgxICsgKCgod2VpZ2h0W24xXSAmIDB4MDAwMDAwZmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAod2VpZ2h0W24yXSAmIDB4MDAwMDAwZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHdlaWdodFtuMV0gJiAweDAwMDAwMGZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHdlaWdodFtuMl0gJiAweDAwMDAwMGZmKSkpOworCisgICAgICAgICAgICAgICAgcGFyZW50W25Ob2Rlc10gPSAtMTsKKyAgICAgICAgICAgICAgICBuSGVhcCsrOworICAgICAgICAgICAgICAgIGhlYXBbbkhlYXBdID0gbk5vZGVzOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHp6ID0gMCwgdG1wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgenogPSBuSGVhcDsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaGVhcFt6el07CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh3ZWlnaHRbdG1wXSA8IHdlaWdodFtoZWFwW3p6ID4+IDFdXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFt6el0gPSBoZWFwW3p6ID4+IDFdOworICAgICAgICAgICAgICAgICAgICAgICAgenogPj49IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGVhcFt6el0gPSB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEobk5vZGVzIDwgKE1BWF9BTFBIQV9TSVpFICogMikpKSB7CisgICAgICAgICAgICAgICAgcGFuaWMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG9vTG9uZyA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBhbHBoYVNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgIGsgPSBpOworICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRba10gPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBrID0gcGFyZW50W2tdOworICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbltpIC0gMV0gPSAoY2hhcikgajsKKyAgICAgICAgICAgICAgICBpZiAoaiA+IG1heExlbikgeworICAgICAgICAgICAgICAgICAgICB0b29Mb25nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghdG9vTG9uZykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYWxwaGFTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBqID0gd2VpZ2h0W2ldID4+IDg7CisgICAgICAgICAgICAgICAgaiA9IDEgKyAoaiAvIDIpOworICAgICAgICAgICAgICAgIHdlaWdodFtpXSA9IGogPDwgODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICBpbmRleCBvZiB0aGUgbGFzdCBjaGFyIGluIHRoZSBibG9jaywgc28KKyAgICAgIHRoZSBibG9jayBzaXplID09IGxhc3QgKyAxLgorICAgICovCisgICAgaW50IGxhc3Q7CisKKyAgICAvKgorICAgICAgaW5kZXggaW4genB0cltdIG9mIG9yaWdpbmFsIHN0cmluZyBhZnRlciBzb3J0aW5nLgorICAgICovCisgICAgaW50IG9yaWdQdHI7CisKKyAgICAvKgorICAgICAgYWx3YXlzOiBpbiB0aGUgcmFuZ2UgMCAuLiA5LgorICAgICAgVGhlIGN1cnJlbnQgYmxvY2sgc2l6ZSBpcyAxMDAwMDAgKiB0aGlzIG51bWJlci4KKyAgICAqLworICAgIGludCBibG9ja1NpemUxMDBrOworCisgICAgYm9vbGVhbiBibG9ja1JhbmRvbWlzZWQ7CisKKyAgICBpbnQgYnl0ZXNPdXQ7CisgICAgaW50IGJzQnVmZjsKKyAgICBpbnQgYnNMaXZlOworICAgIENSQyBtQ3JjID0gbmV3IENSQygpOworCisgICAgcHJpdmF0ZSBib29sZWFuW10gaW5Vc2UgPSBuZXcgYm9vbGVhblsyNTZdOworICAgIHByaXZhdGUgaW50IG5JblVzZTsKKworICAgIHByaXZhdGUgY2hhcltdIHNlcVRvVW5zZXEgPSBuZXcgY2hhclsyNTZdOworICAgIHByaXZhdGUgY2hhcltdIHVuc2VxVG9TZXEgPSBuZXcgY2hhclsyNTZdOworCisgICAgcHJpdmF0ZSBjaGFyW10gc2VsZWN0b3IgPSBuZXcgY2hhcltNQVhfU0VMRUNUT1JTXTsKKyAgICBwcml2YXRlIGNoYXJbXSBzZWxlY3Rvck10ZiA9IG5ldyBjaGFyW01BWF9TRUxFQ1RPUlNdOworCisgICAgcHJpdmF0ZSBjaGFyW10gYmxvY2s7CisgICAgcHJpdmF0ZSBpbnRbXSBxdWFkcmFudDsKKyAgICBwcml2YXRlIGludFtdIHpwdHI7CisgICAgcHJpdmF0ZSBzaG9ydFtdIHN6cHRyOworICAgIHByaXZhdGUgaW50W10gZnRhYjsKKworICAgIHByaXZhdGUgaW50IG5NVEY7CisKKyAgICBwcml2YXRlIGludFtdIG10ZkZyZXEgPSBuZXcgaW50W01BWF9BTFBIQV9TSVpFXTsKKworICAgIC8qCisgICAgICogVXNlZCB3aGVuIHNvcnRpbmcuICBJZiB0b28gbWFueSBsb25nIGNvbXBhcmlzb25zCisgICAgICogaGFwcGVuLCB3ZSBzdG9wIHNvcnRpbmcsIHJhbmRvbWlzZSB0aGUgYmxvY2sKKyAgICAgKiBzbGlnaHRseSwgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB3b3JrRmFjdG9yOworICAgIHByaXZhdGUgaW50IHdvcmtEb25lOworICAgIHByaXZhdGUgaW50IHdvcmtMaW1pdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RBdHRlbXB0OworICAgIHByaXZhdGUgaW50IG5CbG9ja3NSYW5kb21pc2VkOworCisgICAgcHJpdmF0ZSBpbnQgY3VycmVudENoYXIgPSAtMTsKKyAgICBwcml2YXRlIGludCBydW5MZW5ndGggPSAwOworCisgICAgcHVibGljIENCWmlwMk91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoaW5TdHJlYW0sIDkpOworICAgIH0KKworICAgIHB1YmxpYyBDQlppcDJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIGluU3RyZWFtLCBpbnQgaW5CbG9ja1NpemUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJsb2NrID0gbnVsbDsKKyAgICAgICAgcXVhZHJhbnQgPSBudWxsOworICAgICAgICB6cHRyID0gbnVsbDsKKyAgICAgICAgZnRhYiA9IG51bGw7CisKKyAgICAgICAgYnNTZXRTdHJlYW0oaW5TdHJlYW0pOworCisgICAgICAgIHdvcmtGYWN0b3IgPSA1MDsKKyAgICAgICAgaWYgKGluQmxvY2tTaXplID4gOSkgeworICAgICAgICAgICAgaW5CbG9ja1NpemUgPSA5OworICAgICAgICB9CisgICAgICAgIGlmIChpbkJsb2NrU2l6ZSA8IDEpIHsKKyAgICAgICAgICAgIGluQmxvY2tTaXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBibG9ja1NpemUxMDBrID0gaW5CbG9ja1NpemU7CisgICAgICAgIGFsbG9jYXRlQ29tcHJlc3NTdHJ1Y3R1cmVzKCk7CisgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICAgICAgaW5pdEJsb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBtb2RpZmllZCBieSBPbGl2ZXIgTWVya2VsLCAwMTAxMjgKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBidikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGIgPSAoMjU2ICsgYnYpICUgMjU2OworICAgICAgICBpZiAoY3VycmVudENoYXIgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PSBiKSB7CisgICAgICAgICAgICAgICAgcnVuTGVuZ3RoKys7CisgICAgICAgICAgICAgICAgaWYgKHJ1bkxlbmd0aCA+IDI1NCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZVJ1bigpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhciA9IC0xOworICAgICAgICAgICAgICAgICAgICBydW5MZW5ndGggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd3JpdGVSdW4oKTsKKyAgICAgICAgICAgICAgICBydW5MZW5ndGggPSAxOworICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFyID0gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN1cnJlbnRDaGFyID0gYjsKKyAgICAgICAgICAgIHJ1bkxlbmd0aCsrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxhc3QgPCBhbGxvd2FibGVCbG9ja1NpemUpIHsKKyAgICAgICAgICAgIGluVXNlW2N1cnJlbnRDaGFyXSA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bkxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUNyYy51cGRhdGVDUkMoKGNoYXIpIGN1cnJlbnRDaGFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAocnVuTGVuZ3RoKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgbGFzdCsrOworICAgICAgICAgICAgICAgIGJsb2NrW2xhc3QgKyAxXSA9IChjaGFyKSBjdXJyZW50Q2hhcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBsYXN0Kys7CisgICAgICAgICAgICAgICAgYmxvY2tbbGFzdCArIDFdID0gKGNoYXIpIGN1cnJlbnRDaGFyOworICAgICAgICAgICAgICAgIGxhc3QrKzsKKyAgICAgICAgICAgICAgICBibG9ja1tsYXN0ICsgMV0gPSAoY2hhcikgY3VycmVudENoYXI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgbGFzdCsrOworICAgICAgICAgICAgICAgIGJsb2NrW2xhc3QgKyAxXSA9IChjaGFyKSBjdXJyZW50Q2hhcjsKKyAgICAgICAgICAgICAgICBsYXN0Kys7CisgICAgICAgICAgICAgICAgYmxvY2tbbGFzdCArIDFdID0gKGNoYXIpIGN1cnJlbnRDaGFyOworICAgICAgICAgICAgICAgIGxhc3QrKzsKKyAgICAgICAgICAgICAgICBibG9ja1tsYXN0ICsgMV0gPSAoY2hhcikgY3VycmVudENoYXI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGluVXNlW3J1bkxlbmd0aCAtIDRdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsYXN0Kys7CisgICAgICAgICAgICAgICAgYmxvY2tbbGFzdCArIDFdID0gKGNoYXIpIGN1cnJlbnRDaGFyOworICAgICAgICAgICAgICAgIGxhc3QrKzsKKyAgICAgICAgICAgICAgICBibG9ja1tsYXN0ICsgMV0gPSAoY2hhcikgY3VycmVudENoYXI7CisgICAgICAgICAgICAgICAgbGFzdCsrOworICAgICAgICAgICAgICAgIGJsb2NrW2xhc3QgKyAxXSA9IChjaGFyKSBjdXJyZW50Q2hhcjsKKyAgICAgICAgICAgICAgICBsYXN0Kys7CisgICAgICAgICAgICAgICAgYmxvY2tbbGFzdCArIDFdID0gKGNoYXIpIGN1cnJlbnRDaGFyOworICAgICAgICAgICAgICAgIGxhc3QrKzsKKyAgICAgICAgICAgICAgICBibG9ja1tsYXN0ICsgMV0gPSAoY2hhcikgKHJ1bkxlbmd0aCAtIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5kQmxvY2soKTsKKyAgICAgICAgICAgIGluaXRCbG9jaygpOworICAgICAgICAgICAgd3JpdGVSdW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNsb3NlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJ1bkxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlUnVuKCk7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudENoYXIgPSAtMTsKKyAgICAgICAgZW5kQmxvY2soKTsKKyAgICAgICAgZW5kQ29tcHJlc3Npb24oKTsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgYnNTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmZsdXNoKCk7CisgICAgICAgIGJzU3RyZWFtLmZsdXNoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgYmxvY2tDUkMsIGNvbWJpbmVkQ1JDOworCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlc091dCA9IDA7CisgICAgICAgIG5CbG9ja3NSYW5kb21pc2VkID0gMDsKKworICAgICAgICAvKiBXcml0ZSBgbWFnaWMnIGJ5dGVzIGggaW5kaWNhdGluZyBmaWxlLWZvcm1hdCA9PSBodWZmbWFuaXNlZCwKKyAgICAgICAgICAgZm9sbG93ZWQgYnkgYSBkaWdpdCBpbmRpY2F0aW5nIGJsb2NrU2l6ZTEwMGsuCisgICAgICAgICovCisgICAgICAgIGJzUHV0VUNoYXIoJ2gnKTsKKyAgICAgICAgYnNQdXRVQ2hhcignMCcgKyBibG9ja1NpemUxMDBrKTsKKworICAgICAgICBjb21iaW5lZENSQyA9IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgYWxsb3dhYmxlQmxvY2tTaXplOworCisgICAgcHJpdmF0ZSB2b2lkIGluaXRCbG9jaygpIHsKKyAgICAgICAgLy8gICAgICAgIGJsb2NrTm8rKzsKKyAgICAgICAgbUNyYy5pbml0aWFsaXNlQ1JDKCk7CisgICAgICAgIGxhc3QgPSAtMTsKKyAgICAgICAgLy8gICAgICAgIGNoID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBpblVzZVtpXSA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyogMjAgaXMganVzdCBhIHBhcmFub2lhIGNvbnN0YW50ICovCisgICAgICAgIGFsbG93YWJsZUJsb2NrU2l6ZSA9IGJhc2VCbG9ja1NpemUgKiBibG9ja1NpemUxMDBrIC0gMjA7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYmxvY2tDUkMgPSBtQ3JjLmdldEZpbmFsQ1JDKCk7CisgICAgICAgIGNvbWJpbmVkQ1JDID0gKGNvbWJpbmVkQ1JDIDw8IDEpIHwgKGNvbWJpbmVkQ1JDID4+PiAzMSk7CisgICAgICAgIGNvbWJpbmVkQ1JDIF49IGJsb2NrQ1JDOworCisgICAgICAgIC8qIHNvcnQgdGhlIGJsb2NrIGFuZCBlc3RhYmxpc2ggcG9zbiBvZiBvcmlnaW5hbCBzdHJpbmcgKi8KKyAgICAgICAgZG9SZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24oKTsKKworICAgICAgICAvKgorICAgICAgICAgIEEgNi1ieXRlIGJsb2NrIGhlYWRlciwgdGhlIHZhbHVlIGNob3NlbiBhcmJpdHJhcmlseQorICAgICAgICAgIGFzIDB4MzE0MTU5MjY1MzU5IDotKS4gIEEgMzIgYml0IHZhbHVlIGRvZXMgbm90IHJlYWxseQorICAgICAgICAgIGdpdmUgYSBzdHJvbmcgZW5vdWdoIGd1YXJhbnRlZSB0aGF0IHRoZSB2YWx1ZSB3aWxsIG5vdAorICAgICAgICAgIGFwcGVhciBieSBjaGFuY2UgaW4gdGhlIGNvbXByZXNzZWQgZGF0YXN0cmVhbS4gIFdvcnN0LWNhc2UKKyAgICAgICAgICBwcm9iYWJpbGl0eSBvZiB0aGlzIGV2ZW50LCBmb3IgYSA5MDBrIGJsb2NrLCBpcyBhYm91dAorICAgICAgICAgIDIuMGUtMyBmb3IgMzIgYml0cywgMS4wZS01IGZvciA0MCBiaXRzIGFuZCA0LjBlLTggZm9yIDQ4IGJpdHMuCisgICAgICAgICAgRm9yIGEgY29tcHJlc3NlZCBmaWxlIG9mIHNpemUgMTAwR2IgLS0gYWJvdXQgMTAwMDAwIGJsb2NrcyAtLQorICAgICAgICAgIG9ubHkgYSA0OC1iaXQgbWFya2VyIHdpbGwgZG8uICBOQjogbm9ybWFsIGNvbXByZXNzaW9uLworICAgICAgICAgIGRlY29tcHJlc3Npb24gZG8gKm5vdCogcmVseSBvbiB0aGVzZSBzdGF0aXN0aWNhbCBwcm9wZXJ0aWVzLgorICAgICAgICAgIFRoZXkgYXJlIG9ubHkgaW1wb3J0YW50IHdoZW4gdHJ5aW5nIHRvIHJlY292ZXIgYmxvY2tzIGZyb20KKyAgICAgICAgICBkYW1hZ2VkIGZpbGVzLgorICAgICAgICAqLworICAgICAgICBic1B1dFVDaGFyKDB4MzEpOworICAgICAgICBic1B1dFVDaGFyKDB4NDEpOworICAgICAgICBic1B1dFVDaGFyKDB4NTkpOworICAgICAgICBic1B1dFVDaGFyKDB4MjYpOworICAgICAgICBic1B1dFVDaGFyKDB4NTMpOworICAgICAgICBic1B1dFVDaGFyKDB4NTkpOworCisgICAgICAgIC8qIE5vdyB0aGUgYmxvY2sncyBDUkMsIHNvIGl0IGlzIGluIGEga25vd24gcGxhY2UuICovCisgICAgICAgIGJzUHV0aW50KGJsb2NrQ1JDKTsKKworICAgICAgICAvKiBOb3cgYSBzaW5nbGUgYml0IGluZGljYXRpbmcgcmFuZG9taXNhdGlvbi4gKi8KKyAgICAgICAgaWYgKGJsb2NrUmFuZG9taXNlZCkgeworICAgICAgICAgICAgYnNXKDEsIDEpOworICAgICAgICAgICAgbkJsb2Nrc1JhbmRvbWlzZWQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJzVygxLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmFsbHksIGJsb2NrJ3MgY29udGVudHMgcHJvcGVyLiAqLworICAgICAgICBtb3ZlVG9Gcm9udENvZGVBbmRTZW5kKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZENvbXByZXNzaW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICBOb3cgYW5vdGhlciBtYWdpYyA0OC1iaXQgbnVtYmVyLCAweDE3NzI0NTM4NTA5MCwgdG8KKyAgICAgICAgICBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBsYXN0IGJsb2NrLiAgKHNxcnQocGkpLCBpZgorICAgICAgICAgIHlvdSB3YW50IHRvIGtub3cuICBJIGRpZCB3YW50IHRvIHVzZSBlLCBidXQgaXQgY29udGFpbnMKKyAgICAgICAgICB0b28gbXVjaCByZXBldGl0aW9uIC0tIDI3IDE4IDI4IDE4IDI4IDQ2IC0tIGZvciBtZQorICAgICAgICAgIHRvIGZlZWwgc3RhdGlzdGljYWxseSBjb21mb3J0YWJsZS4gIENhbGwgbWUgcGFyYW5vaWQuKQorICAgICAgICAqLworICAgICAgICBic1B1dFVDaGFyKDB4MTcpOworICAgICAgICBic1B1dFVDaGFyKDB4NzIpOworICAgICAgICBic1B1dFVDaGFyKDB4NDUpOworICAgICAgICBic1B1dFVDaGFyKDB4MzgpOworICAgICAgICBic1B1dFVDaGFyKDB4NTApOworICAgICAgICBic1B1dFVDaGFyKDB4OTApOworCisgICAgICAgIGJzUHV0aW50KGNvbWJpbmVkQ1JDKTsKKworICAgICAgICBic0ZpbmlzaGVkV2l0aFN0cmVhbSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYkFzc2lnbkNvZGVzIChpbnRbXSBjb2RlLCBjaGFyW10gbGVuZ3RoLCBpbnQgbWluTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4TGVuLCBpbnQgYWxwaGFTaXplKSB7CisgICAgICAgIGludCBuLCB2ZWMsIGk7CisKKyAgICAgICAgdmVjID0gMDsKKyAgICAgICAgZm9yIChuID0gbWluTGVuOyBuIDw9IG1heExlbjsgbisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoW2ldID09IG4pIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZVtpXSA9IHZlYzsKKyAgICAgICAgICAgICAgICAgICAgdmVjKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZlYyA8PD0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBic1NldFN0cmVhbShPdXRwdXRTdHJlYW0gZikgeworICAgICAgICBic1N0cmVhbSA9IGY7CisgICAgICAgIGJzTGl2ZSA9IDA7CisgICAgICAgIGJzQnVmZiA9IDA7CisgICAgICAgIGJ5dGVzT3V0ID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYnNGaW5pc2hlZFdpdGhTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aGlsZSAoYnNMaXZlID4gMCkgeworICAgICAgICAgICAgaW50IGNoID0gKGJzQnVmZiA+PiAyNCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJzU3RyZWFtLndyaXRlKGNoKTsgLy8gd3JpdGUgOC1iaXQKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzQnVmZiA8PD0gODsKKyAgICAgICAgICAgIGJzTGl2ZSAtPSA4OworICAgICAgICAgICAgYnl0ZXNPdXQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBic1coaW50IG4sIGludCB2KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aGlsZSAoYnNMaXZlID49IDgpIHsKKyAgICAgICAgICAgIGludCBjaCA9IChic0J1ZmYgPj4gMjQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBic1N0cmVhbS53cml0ZShjaCk7IC8vIHdyaXRlIDgtYml0CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzQnVmZiA8PD0gODsKKyAgICAgICAgICAgIGJzTGl2ZSAtPSA4OworICAgICAgICAgICAgYnl0ZXNPdXQrKzsKKyAgICAgICAgfQorICAgICAgICBic0J1ZmYgfD0gKHYgPDwgKDMyIC0gYnNMaXZlIC0gbikpOworICAgICAgICBic0xpdmUgKz0gbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYnNQdXRVQ2hhcihpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnNXKDgsIGMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBic1B1dGludChpbnQgdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnNXKDgsICh1ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICBic1coOCwgKHUgPj4gMTYpICYgMHhmZik7CisgICAgICAgIGJzVyg4LCAodSA+PiAgOCkgJiAweGZmKTsKKyAgICAgICAgYnNXKDgsICB1ICAgICAgICAmIDB4ZmYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBic1B1dEludFZTKGludCBudW1CaXRzLCBpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnNXKG51bUJpdHMsIGMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kTVRGVmFsdWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhciBsZW5bXVtdID0gbmV3IGNoYXJbTl9HUk9VUFNdW01BWF9BTFBIQV9TSVpFXTsKKworICAgICAgICBpbnQgdiwgdCwgaSwgaiwgZ3MsIGdlLCB0b3RjLCBidCwgYmMsIGl0ZXI7CisgICAgICAgIGludCBuU2VsZWN0b3JzID0gMCwgYWxwaGFTaXplLCBtaW5MZW4sIG1heExlbiwgc2VsQ3RyOworICAgICAgICBpbnQgbkdyb3VwcywgbkJ5dGVzOworCisgICAgICAgIGFscGhhU2l6ZSA9IG5JblVzZSArIDI7CisgICAgICAgIGZvciAodCA9IDA7IHQgPCBOX0dST1VQUzsgdCsrKSB7CisgICAgICAgICAgICBmb3IgKHYgPSAwOyB2IDwgYWxwaGFTaXplOyB2KyspIHsKKyAgICAgICAgICAgICAgICBsZW5bdF1bdl0gPSAoY2hhcikgR1JFQVRFUl9JQ09TVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIERlY2lkZSBob3cgbWFueSBjb2RpbmcgdGFibGVzIHRvIHVzZSAqLworICAgICAgICBpZiAobk1URiA8PSAwKSB7CisgICAgICAgICAgICBwYW5pYygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5NVEYgPCAyMDApIHsKKyAgICAgICAgICAgIG5Hcm91cHMgPSAyOworICAgICAgICB9IGVsc2UgaWYgKG5NVEYgPCA2MDApIHsKKyAgICAgICAgICAgIG5Hcm91cHMgPSAzOworICAgICAgICB9IGVsc2UgaWYgKG5NVEYgPCAxMjAwKSB7CisgICAgICAgICAgICBuR3JvdXBzID0gNDsKKyAgICAgICAgfSBlbHNlIGlmIChuTVRGIDwgMjQwMCkgeworICAgICAgICAgICAgbkdyb3VwcyA9IDU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuR3JvdXBzID0gNjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdlbmVyYXRlIGFuIGluaXRpYWwgc2V0IG9mIGNvZGluZyB0YWJsZXMgKi8geworICAgICAgICAgICAgaW50IG5QYXJ0LCByZW1GLCB0RnJlcSwgYUZyZXE7CisKKyAgICAgICAgICAgIG5QYXJ0ID0gbkdyb3VwczsKKyAgICAgICAgICAgIHJlbUYgID0gbk1URjsKKyAgICAgICAgICAgIGdzID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChuUGFydCA+IDApIHsKKyAgICAgICAgICAgICAgICB0RnJlcSA9IHJlbUYgLyBuUGFydDsKKyAgICAgICAgICAgICAgICBnZSA9IGdzIC0gMTsKKyAgICAgICAgICAgICAgICBhRnJlcSA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKGFGcmVxIDwgdEZyZXEgJiYgZ2UgPCBhbHBoYVNpemUgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGdlKys7CisgICAgICAgICAgICAgICAgICAgIGFGcmVxICs9IG10ZkZyZXFbZ2VdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChnZSA+IGdzICYmIG5QYXJ0ICE9IG5Hcm91cHMgJiYgblBhcnQgIT0gMQorICAgICAgICAgICAgICAgICAgICAmJiAoKG5Hcm91cHMgLSBuUGFydCkgJSAyID09IDEpKSB7CisgICAgICAgICAgICAgICAgICAgIGFGcmVxIC09IG10ZkZyZXFbZ2VdOworICAgICAgICAgICAgICAgICAgICBnZS0tOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAodiA9IDA7IHYgPCBhbHBoYVNpemU7IHYrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodiA+PSBncyAmJiB2IDw9IGdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5bblBhcnQgLSAxXVt2XSA9IChjaGFyKSBMRVNTRVJfSUNPU1Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5bblBhcnQgLSAxXVt2XSA9IChjaGFyKSBHUkVBVEVSX0lDT1NUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgblBhcnQtLTsKKyAgICAgICAgICAgICAgICBncyA9IGdlICsgMTsKKyAgICAgICAgICAgICAgICByZW1GIC09IGFGcmVxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50W11bXSByZnJlcSA9IG5ldyBpbnRbTl9HUk9VUFNdW01BWF9BTFBIQV9TSVpFXTsKKyAgICAgICAgaW50W10gZmF2ZSA9IG5ldyBpbnRbTl9HUk9VUFNdOworICAgICAgICBzaG9ydFtdIGNvc3QgPSBuZXcgc2hvcnRbTl9HUk9VUFNdOworICAgICAgICAvKgorICAgICAgICAgIEl0ZXJhdGUgdXAgdG8gTl9JVEVSUyB0aW1lcyB0byBpbXByb3ZlIHRoZSB0YWJsZXMuCisgICAgICAgICovCisgICAgICAgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBOX0lURVJTOyBpdGVyKyspIHsKKyAgICAgICAgICAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKyAgICAgICAgICAgICAgICBmYXZlW3RdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgeworICAgICAgICAgICAgICAgIGZvciAodiA9IDA7IHYgPCBhbHBoYVNpemU7IHYrKykgeworICAgICAgICAgICAgICAgICAgICByZnJlcVt0XVt2XSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuU2VsZWN0b3JzID0gMDsKKyAgICAgICAgICAgIHRvdGMgPSAwOworICAgICAgICAgICAgZ3MgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKworICAgICAgICAgICAgICAgIC8qIFNldCBncm91cCBzdGFydCAmIGVuZCBtYXJrcy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZ3MgPj0gbk1URikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2UgPSBncyArIEdfU0laRSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKGdlID49IG5NVEYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2UgPSBuTVRGIC0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlIHRoZSBjb3N0IG9mIHRoaXMgZ3JvdXAgYXMgY29kZWQKKyAgICAgICAgICAgICAgICAgIGJ5IGVhY2ggb2YgdGhlIGNvZGluZyB0YWJsZXMuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvc3RbdF0gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChuR3JvdXBzID09IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgY29zdDAsIGNvc3QxLCBjb3N0MiwgY29zdDMsIGNvc3Q0LCBjb3N0NTsKKyAgICAgICAgICAgICAgICAgICAgY29zdDAgPSBjb3N0MSA9IGNvc3QyID0gY29zdDMgPSBjb3N0NCA9IGNvc3Q1ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gZ3M7IGkgPD0gZ2U7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgaWN2ID0gc3pwdHJbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBjb3N0MCArPSBsZW5bMF1baWN2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvc3QxICs9IGxlblsxXVtpY3ZdOworICAgICAgICAgICAgICAgICAgICAgICAgY29zdDIgKz0gbGVuWzJdW2ljdl07CisgICAgICAgICAgICAgICAgICAgICAgICBjb3N0MyArPSBsZW5bM11baWN2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvc3Q0ICs9IGxlbls0XVtpY3ZdOworICAgICAgICAgICAgICAgICAgICAgICAgY29zdDUgKz0gbGVuWzVdW2ljdl07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29zdFswXSA9IGNvc3QwOworICAgICAgICAgICAgICAgICAgICBjb3N0WzFdID0gY29zdDE7CisgICAgICAgICAgICAgICAgICAgIGNvc3RbMl0gPSBjb3N0MjsKKyAgICAgICAgICAgICAgICAgICAgY29zdFszXSA9IGNvc3QzOworICAgICAgICAgICAgICAgICAgICBjb3N0WzRdID0gY29zdDQ7CisgICAgICAgICAgICAgICAgICAgIGNvc3RbNV0gPSBjb3N0NTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBnczsgaSA8PSBnZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBpY3YgPSBzenB0cltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0W3RdICs9IGxlblt0XVtpY3ZdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgIEZpbmQgdGhlIGNvZGluZyB0YWJsZSB3aGljaCBpcyBiZXN0IGZvciB0aGlzIGdyb3VwLAorICAgICAgICAgICAgICAgICAgYW5kIHJlY29yZCBpdHMgaWRlbnRpdHkgaW4gdGhlIHNlbGVjdG9yIHRhYmxlLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYmMgPSA5OTk5OTk5OTk7CisgICAgICAgICAgICAgICAgYnQgPSAtMTsKKyAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3N0W3RdIDwgYmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjID0gY29zdFt0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0ID0gdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdG90YyArPSBiYzsKKyAgICAgICAgICAgICAgICBmYXZlW2J0XSsrOworICAgICAgICAgICAgICAgIHNlbGVjdG9yW25TZWxlY3RvcnNdID0gKGNoYXIpIGJ0OworICAgICAgICAgICAgICAgIG5TZWxlY3RvcnMrKzsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICBJbmNyZW1lbnQgdGhlIHN5bWJvbCBmcmVxdWVuY2llcyBmb3IgdGhlIHNlbGVjdGVkIHRhYmxlLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZm9yIChpID0gZ3M7IGkgPD0gZ2U7IGkrKykgeworICAgICAgICAgICAgICAgICAgICByZnJlcVtidF1bc3pwdHJbaV1dKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ3MgPSBnZSArIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgIFJlY29tcHV0ZSB0aGUgdGFibGVzIGJhc2VkIG9uIHRoZSBhY2N1bXVsYXRlZCBmcmVxdWVuY2llcy4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKSB7CisgICAgICAgICAgICAgICAgaGJNYWtlQ29kZUxlbmd0aHMobGVuW3RdLCByZnJlcVt0XSwgYWxwaGFTaXplLCAyMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZnJlcSA9IG51bGw7CisgICAgICAgIGZhdmUgPSBudWxsOworICAgICAgICBjb3N0ID0gbnVsbDsKKworICAgICAgICBpZiAoIShuR3JvdXBzIDwgOCkpIHsKKyAgICAgICAgICAgIHBhbmljKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoblNlbGVjdG9ycyA8IDMyNzY4ICYmIG5TZWxlY3RvcnMgPD0gKDIgKyAoOTAwMDAwIC8gR19TSVpFKSkpKSB7CisgICAgICAgICAgICBwYW5pYygpOworICAgICAgICB9CisKKworICAgICAgICAvKiBDb21wdXRlIE1URiB2YWx1ZXMgZm9yIHRoZSBzZWxlY3RvcnMuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXJbXSBwb3MgPSBuZXcgY2hhcltOX0dST1VQU107CisgICAgICAgICAgICBjaGFyIGxsX2ksIHRtcDIsIHRtcDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuR3JvdXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwb3NbaV0gPSAoY2hhcikgaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsbF9pID0gc2VsZWN0b3JbaV07CisgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgdG1wID0gcG9zW2pdOworICAgICAgICAgICAgICAgIHdoaWxlIChsbF9pICE9IHRtcCkgeworICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHBvc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgcG9zW2pdID0gdG1wMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9zWzBdID0gdG1wOworICAgICAgICAgICAgICAgIHNlbGVjdG9yTXRmW2ldID0gKGNoYXIpIGo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRbXVtdIGNvZGUgPSBuZXcgaW50W05fR1JPVVBTXVtNQVhfQUxQSEFfU0laRV07CisKKyAgICAgICAgLyogQXNzaWduIGFjdHVhbCBjb2RlcyBmb3IgdGhlIHRhYmxlcy4gKi8KKyAgICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgeworICAgICAgICAgICAgbWluTGVuID0gMzI7CisgICAgICAgICAgICBtYXhMZW4gPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxlblt0XVtpXSA+IG1heExlbikgeworICAgICAgICAgICAgICAgICAgICBtYXhMZW4gPSBsZW5bdF1baV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsZW5bdF1baV0gPCBtaW5MZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbWluTGVuID0gbGVuW3RdW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXhMZW4gPiAyMCkgeworICAgICAgICAgICAgICAgIHBhbmljKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWluTGVuIDwgMSkgeworICAgICAgICAgICAgICAgIHBhbmljKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYkFzc2lnbkNvZGVzKGNvZGVbdF0sIGxlblt0XSwgbWluTGVuLCBtYXhMZW4sIGFscGhhU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBUcmFuc21pdCB0aGUgbWFwcGluZyB0YWJsZS4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbltdIGluVXNlMTYgPSBuZXcgYm9vbGVhblsxNl07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgICAgIGluVXNlMTZbaV0gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5Vc2VbaSAqIDE2ICsgal0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluVXNlMTZbaV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuQnl0ZXMgPSBieXRlc091dDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluVXNlMTZbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgYnNXKDEsIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJzVygxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluVXNlMTZbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpblVzZVtpICogMTYgKyBqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzVygxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNXKDEsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBOb3cgdGhlIHNlbGVjdG9ycy4gKi8KKyAgICAgICAgbkJ5dGVzID0gYnl0ZXNPdXQ7CisgICAgICAgIGJzVyAoMywgbkdyb3Vwcyk7CisgICAgICAgIGJzVyAoMTUsIG5TZWxlY3RvcnMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2VsZWN0b3JNdGZbaV07IGorKykgeworICAgICAgICAgICAgICAgIGJzVygxLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzVygxLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyB0aGUgY29kaW5nIHRhYmxlcy4gKi8KKyAgICAgICAgbkJ5dGVzID0gYnl0ZXNPdXQ7CisKKyAgICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgeworICAgICAgICAgICAgaW50IGN1cnIgPSBsZW5bdF1bMF07CisgICAgICAgICAgICBic1coNSwgY3Vycik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY3VyciA8IGxlblt0XVtpXSkgeworICAgICAgICAgICAgICAgICAgICBic1coMiwgMik7CisgICAgICAgICAgICAgICAgICAgIGN1cnIrKzsgLyogMTAgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnIgPiBsZW5bdF1baV0pIHsKKyAgICAgICAgICAgICAgICAgICAgYnNXKDIsIDMpOworICAgICAgICAgICAgICAgICAgICBjdXJyLS07IC8qIDExICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJzVyAoMSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBbmQgZmluYWxseSwgdGhlIGJsb2NrIGRhdGEgcHJvcGVyICovCisgICAgICAgIG5CeXRlcyA9IGJ5dGVzT3V0OworICAgICAgICBzZWxDdHIgPSAwOworICAgICAgICBncyA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoZ3MgPj0gbk1URikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2UgPSBncyArIEdfU0laRSAtIDE7CisgICAgICAgICAgICBpZiAoZ2UgPj0gbk1URikgeworICAgICAgICAgICAgICAgIGdlID0gbk1URiAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSBnczsgaSA8PSBnZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnNXKGxlbltzZWxlY3RvcltzZWxDdHJdXVtzenB0cltpXV0sCisgICAgICAgICAgICAgICAgICAgIGNvZGVbc2VsZWN0b3Jbc2VsQ3RyXV1bc3pwdHJbaV1dKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3MgPSBnZSArIDE7CisgICAgICAgICAgICBzZWxDdHIrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShzZWxDdHIgPT0gblNlbGVjdG9ycykpIHsKKyAgICAgICAgICAgIHBhbmljKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbW92ZVRvRnJvbnRDb2RlQW5kU2VuZCAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBic1B1dEludFZTKDI0LCBvcmlnUHRyKTsKKyAgICAgICAgZ2VuZXJhdGVNVEZWYWx1ZXMoKTsKKyAgICAgICAgc2VuZE1URlZhbHVlcygpOworICAgIH0KKworICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIGJzU3RyZWFtOworCisgICAgcHJpdmF0ZSB2b2lkIHNpbXBsZVNvcnQoaW50IGxvLCBpbnQgaGksIGludCBkKSB7CisgICAgICAgIGludCBpLCBqLCBoLCBiaWdOLCBocDsKKyAgICAgICAgaW50IHY7CisKKyAgICAgICAgYmlnTiA9IGhpIC0gbG8gKyAxOworICAgICAgICBpZiAoYmlnTiA8IDIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGhwID0gMDsKKyAgICAgICAgd2hpbGUgKGluY3NbaHBdIDwgYmlnTikgeworICAgICAgICAgICAgaHArKzsKKyAgICAgICAgfQorICAgICAgICBocC0tOworCisgICAgICAgIGZvciAoOyBocCA+PSAwOyBocC0tKSB7CisgICAgICAgICAgICBoID0gaW5jc1tocF07CisKKyAgICAgICAgICAgIGkgPSBsbyArIGg7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIC8qIGNvcHkgMSAqLworICAgICAgICAgICAgICAgIGlmIChpID4gaGkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYgPSB6cHRyW2ldOworICAgICAgICAgICAgICAgIGogPSBpOworICAgICAgICAgICAgICAgIHdoaWxlIChmdWxsR3RVKHpwdHJbaiAtIGhdICsgZCwgdiArIGQpKSB7CisgICAgICAgICAgICAgICAgICAgIHpwdHJbal0gPSB6cHRyW2ogLSBoXTsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGogLSBoOworICAgICAgICAgICAgICAgICAgICBpZiAoaiA8PSAobG8gKyBoIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpwdHJbal0gPSB2OworICAgICAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgICAgIC8qIGNvcHkgMiAqLworICAgICAgICAgICAgICAgIGlmIChpID4gaGkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYgPSB6cHRyW2ldOworICAgICAgICAgICAgICAgIGogPSBpOworICAgICAgICAgICAgICAgIHdoaWxlIChmdWxsR3RVKHpwdHJbaiAtIGhdICsgZCwgdiArIGQpKSB7CisgICAgICAgICAgICAgICAgICAgIHpwdHJbal0gPSB6cHRyW2ogLSBoXTsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGogLSBoOworICAgICAgICAgICAgICAgICAgICBpZiAoaiA8PSAobG8gKyBoIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpwdHJbal0gPSB2OworICAgICAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgICAgIC8qIGNvcHkgMyAqLworICAgICAgICAgICAgICAgIGlmIChpID4gaGkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYgPSB6cHRyW2ldOworICAgICAgICAgICAgICAgIGogPSBpOworICAgICAgICAgICAgICAgIHdoaWxlIChmdWxsR3RVKHpwdHJbaiAtIGhdICsgZCwgdiArIGQpKSB7CisgICAgICAgICAgICAgICAgICAgIHpwdHJbal0gPSB6cHRyW2ogLSBoXTsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGogLSBoOworICAgICAgICAgICAgICAgICAgICBpZiAoaiA8PSAobG8gKyBoIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpwdHJbal0gPSB2OworICAgICAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgICAgIGlmICh3b3JrRG9uZSA+IHdvcmtMaW1pdCAmJiBmaXJzdEF0dGVtcHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2c3dhcChpbnQgcDEsIGludCBwMiwgaW50IG4pIHsKKyAgICAgICAgaW50IHRlbXAgPSAwOworICAgICAgICB3aGlsZSAobiA+IDApIHsKKyAgICAgICAgICAgIHRlbXAgPSB6cHRyW3AxXTsKKyAgICAgICAgICAgIHpwdHJbcDFdID0genB0cltwMl07CisgICAgICAgICAgICB6cHRyW3AyXSA9IHRlbXA7CisgICAgICAgICAgICBwMSsrOworICAgICAgICAgICAgcDIrKzsKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2hhciBtZWQzKGNoYXIgYSwgY2hhciBiLCBjaGFyIGMpIHsKKyAgICAgICAgY2hhciB0OworICAgICAgICBpZiAoYSA+IGIpIHsKKyAgICAgICAgICAgIHQgPSBhOworICAgICAgICAgICAgYSA9IGI7CisgICAgICAgICAgICBiID0gdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYiA+IGMpIHsKKyAgICAgICAgICAgIHQgPSBiOworICAgICAgICAgICAgYiA9IGM7CisgICAgICAgICAgICBjID0gdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYSA+IGIpIHsKKyAgICAgICAgICAgIGIgPSBhOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YWNrRWxlbSB7CisgICAgICAgIGludCBsbDsKKyAgICAgICAgaW50IGhoOworICAgICAgICBpbnQgZGQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHFTb3J0MyhpbnQgbG9TdCwgaW50IGhpU3QsIGludCBkU3QpIHsKKyAgICAgICAgaW50IHVuTG8sIHVuSGksIGx0TG8sIGd0SGksIG1lZCwgbiwgbTsKKyAgICAgICAgaW50IHNwLCBsbywgaGksIGQ7CisgICAgICAgIFN0YWNrRWxlbVtdIHN0YWNrID0gbmV3IFN0YWNrRWxlbVtRU09SVF9TVEFDS19TSVpFXTsKKyAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IFFTT1JUX1NUQUNLX1NJWkU7IGNvdW50KyspIHsKKyAgICAgICAgICAgIHN0YWNrW2NvdW50XSA9IG5ldyBTdGFja0VsZW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwID0gMDsKKworICAgICAgICBzdGFja1tzcF0ubGwgPSBsb1N0OworICAgICAgICBzdGFja1tzcF0uaGggPSBoaVN0OworICAgICAgICBzdGFja1tzcF0uZGQgPSBkU3Q7CisgICAgICAgIHNwKys7CisKKyAgICAgICAgd2hpbGUgKHNwID4gMCkgeworICAgICAgICAgICAgaWYgKHNwID49IFFTT1JUX1NUQUNLX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBwYW5pYygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcC0tOworICAgICAgICAgICAgbG8gPSBzdGFja1tzcF0ubGw7CisgICAgICAgICAgICBoaSA9IHN0YWNrW3NwXS5oaDsKKyAgICAgICAgICAgIGQgPSBzdGFja1tzcF0uZGQ7CisKKyAgICAgICAgICAgIGlmIChoaSAtIGxvIDwgU01BTExfVEhSRVNIIHx8IGQgPiBERVBUSF9USFJFU0gpIHsKKyAgICAgICAgICAgICAgICBzaW1wbGVTb3J0KGxvLCBoaSwgZCk7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtEb25lID4gd29ya0xpbWl0ICYmIGZpcnN0QXR0ZW1wdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZWQgPSBtZWQzKGJsb2NrW3pwdHJbbG9dICsgZCArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICBibG9ja1t6cHRyW2hpICAgICAgICAgICAgXSArIGQgICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW3pwdHJbKGxvICsgaGkpID4+IDFdICsgZCArIDFdKTsKKworICAgICAgICAgICAgdW5MbyA9IGx0TG8gPSBsbzsKKyAgICAgICAgICAgIHVuSGkgPSBndEhpID0gaGk7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVuTG8gPiB1bkhpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuID0gKChpbnQpIGJsb2NrW3pwdHJbdW5Mb10gKyBkICsgMV0pIC0gbWVkOworICAgICAgICAgICAgICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVtcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0genB0clt1bkxvXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpwdHJbdW5Mb10gPSB6cHRyW2x0TG9dOworICAgICAgICAgICAgICAgICAgICAgICAgenB0cltsdExvXSA9IHRlbXA7CisgICAgICAgICAgICAgICAgICAgICAgICBsdExvKys7CisgICAgICAgICAgICAgICAgICAgICAgICB1bkxvKys7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPiAgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdW5MbysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodW5MbyA+IHVuSGkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG4gPSAoKGludCkgYmxvY2tbenB0clt1bkhpXSArIGQgKyAxXSkgLSBtZWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZW1wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB6cHRyW3VuSGldOworICAgICAgICAgICAgICAgICAgICAgICAgenB0clt1bkhpXSA9IHpwdHJbZ3RIaV07CisgICAgICAgICAgICAgICAgICAgICAgICB6cHRyW2d0SGldID0gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0SGktLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuSGktLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBpZiAobiA8ICAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1bkhpLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh1bkxvID4gdW5IaSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHRlbXAgPSAwOworICAgICAgICAgICAgICAgIHRlbXAgPSB6cHRyW3VuTG9dOworICAgICAgICAgICAgICAgIHpwdHJbdW5Mb10gPSB6cHRyW3VuSGldOworICAgICAgICAgICAgICAgIHpwdHJbdW5IaV0gPSB0ZW1wOworICAgICAgICAgICAgICAgIHVuTG8rKzsKKyAgICAgICAgICAgICAgICB1bkhpLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChndEhpIDwgbHRMbykgeworICAgICAgICAgICAgICAgIHN0YWNrW3NwXS5sbCA9IGxvOworICAgICAgICAgICAgICAgIHN0YWNrW3NwXS5oaCA9IGhpOworICAgICAgICAgICAgICAgIHN0YWNrW3NwXS5kZCA9IGQgKyAxOworICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4gPSAoKGx0TG8gLSBsbykgPCAodW5MbyAtIGx0TG8pKSA/IChsdExvIC0gbG8pIDogKHVuTG8gLSBsdExvKTsKKyAgICAgICAgICAgIHZzd2FwKGxvLCB1bkxvIC0gbiwgbik7CisgICAgICAgICAgICBtID0gKChoaSAtIGd0SGkpIDwgKGd0SGkgLSB1bkhpKSkgPyAoaGkgLSBndEhpKSA6IChndEhpIC0gdW5IaSk7CisgICAgICAgICAgICB2c3dhcCh1bkxvLCBoaSAtIG0gKyAxLCBtKTsKKworICAgICAgICAgICAgbiA9IGxvICsgdW5MbyAtIGx0TG8gLSAxOworICAgICAgICAgICAgbSA9IGhpIC0gKGd0SGkgLSB1bkhpKSArIDE7CisKKyAgICAgICAgICAgIHN0YWNrW3NwXS5sbCA9IGxvOworICAgICAgICAgICAgc3RhY2tbc3BdLmhoID0gbjsKKyAgICAgICAgICAgIHN0YWNrW3NwXS5kZCA9IGQ7CisgICAgICAgICAgICBzcCsrOworCisgICAgICAgICAgICBzdGFja1tzcF0ubGwgPSBuICsgMTsKKyAgICAgICAgICAgIHN0YWNrW3NwXS5oaCA9IG0gLSAxOworICAgICAgICAgICAgc3RhY2tbc3BdLmRkID0gZCArIDE7CisgICAgICAgICAgICBzcCsrOworCisgICAgICAgICAgICBzdGFja1tzcF0ubGwgPSBtOworICAgICAgICAgICAgc3RhY2tbc3BdLmhoID0gaGk7CisgICAgICAgICAgICBzdGFja1tzcF0uZGQgPSBkOworICAgICAgICAgICAgc3ArKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYWluU29ydCgpIHsKKyAgICAgICAgaW50IGksIGosIHNzLCBzYjsKKyAgICAgICAgaW50W10gcnVubmluZ09yZGVyID0gbmV3IGludFsyNTZdOworICAgICAgICBpbnRbXSBjb3B5ID0gbmV3IGludFsyNTZdOworICAgICAgICBib29sZWFuW10gYmlnRG9uZSA9IG5ldyBib29sZWFuWzI1Nl07CisgICAgICAgIGludCBjMSwgYzI7CisgICAgICAgIGludCBudW1RU29ydGVkOworCisgICAgICAgIC8qCisgICAgICAgICAgSW4gdGhlIHZhcmlvdXMgYmxvY2stc2l6ZWQgc3RydWN0dXJlcywgbGl2ZSBkYXRhIHJ1bnMKKyAgICAgICAgICBmcm9tIDAgdG8gbGFzdCtOVU1fT1ZFUlNIT09UX0JZVEVTIGluY2x1c2l2ZS4gIEZpcnN0LAorICAgICAgICAgIHNldCB1cCB0aGUgb3ZlcnNob290IGFyZWEgZm9yIGJsb2NrLgorICAgICAgICAqLworCisgICAgICAgIC8vICAgaWYgKHZlcmJvc2l0eSA+PSA0KSBmcHJpbnRmICggc3RkZXJyLCAiICAgc29ydCBpbml0aWFsaXNlIC4uLlxuIiApOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX09WRVJTSE9PVF9CWVRFUzsgaSsrKSB7CisgICAgICAgICAgICBibG9ja1tsYXN0ICsgaSArIDJdID0gYmxvY2tbKGkgJSAobGFzdCArIDEpKSArIDFdOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGFzdCArIE5VTV9PVkVSU0hPT1RfQllURVM7IGkrKykgeworICAgICAgICAgICAgcXVhZHJhbnRbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgYmxvY2tbMF0gPSAoY2hhcikgKGJsb2NrW2xhc3QgKyAxXSk7CisKKyAgICAgICAgaWYgKGxhc3QgPCA0MDAwKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICBVc2Ugc2ltcGxlU29ydCgpLCBzaW5jZSB0aGUgZnVsbCBzb3J0aW5nIG1lY2hhbmlzbQorICAgICAgICAgICAgICBoYXMgcXVpdGUgYSBsYXJnZSBjb25zdGFudCBvdmVyaGVhZC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgeworICAgICAgICAgICAgICAgIHpwdHJbaV0gPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlyc3RBdHRlbXB0ID0gZmFsc2U7CisgICAgICAgICAgICB3b3JrRG9uZSA9IHdvcmtMaW1pdCA9IDA7CisgICAgICAgICAgICBzaW1wbGVTb3J0KDAsIGxhc3QsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtUVNvcnRlZCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYmlnRG9uZVtpXSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IDY1NTM2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmdGFiW2ldID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYzEgPSBibG9ja1swXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYzIgPSBibG9ja1tpICsgMV07CisgICAgICAgICAgICAgICAgZnRhYlsoYzEgPDwgOCkgKyBjMl0rKzsKKyAgICAgICAgICAgICAgICBjMSA9IGMyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IDY1NTM2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmdGFiW2ldICs9IGZ0YWJbaSAtIDFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjMSA9IGJsb2NrWzFdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxhc3Q7IGkrKykgeworICAgICAgICAgICAgICAgIGMyID0gYmxvY2tbaSArIDJdOworICAgICAgICAgICAgICAgIGogPSAoYzEgPDwgOCkgKyBjMjsKKyAgICAgICAgICAgICAgICBjMSA9IGMyOworICAgICAgICAgICAgICAgIGZ0YWJbal0tLTsKKyAgICAgICAgICAgICAgICB6cHRyW2Z0YWJbal1dID0gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaiA9ICgoYmxvY2tbbGFzdCArIDFdKSA8PCA4KSArIChibG9ja1sxXSk7CisgICAgICAgICAgICBmdGFiW2pdLS07CisgICAgICAgICAgICB6cHRyW2Z0YWJbal1dID0gbGFzdDsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgTm93IGZ0YWIgY29udGFpbnMgdGhlIGZpcnN0IGxvYyBvZiBldmVyeSBzbWFsbCBidWNrZXQuCisgICAgICAgICAgICAgIENhbGN1bGF0ZSB0aGUgcnVubmluZyBvcmRlciwgZnJvbSBzbWFsbGVzdCB0byBsYXJnZXN0CisgICAgICAgICAgICAgIGJpZyBidWNrZXQuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcnVubmluZ09yZGVyW2ldID0gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB2djsKKyAgICAgICAgICAgICAgICBpbnQgaCA9IDE7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBoID0gMyAqIGggKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoaCA8PSAyNTYpOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaCA9IGggLyAzOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBoOyBpIDw9IDI1NTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2diA9IHJ1bm5pbmdPcmRlcltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChmdGFiWygocnVubmluZ09yZGVyW2ogLSBoXSkgKyAxKSA8PCA4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGZ0YWJbKHJ1bm5pbmdPcmRlcltqIC0gaF0pIDw8IDhdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IChmdGFiWygodnYpICsgMSkgPDwgOF0gLSBmdGFiWyh2dikgPDwgOF0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ09yZGVyW2pdID0gcnVubmluZ09yZGVyW2ogLSBoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gaiAtIGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPD0gKGggLSAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nT3JkZXJbal0gPSB2djsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKGggIT0gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgIFRoZSBtYWluIHNvcnRpbmcgbG9vcC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgUHJvY2VzcyBiaWcgYnVja2V0cywgc3RhcnRpbmcgd2l0aCB0aGUgbGVhc3QgZnVsbC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHNzID0gcnVubmluZ09yZGVyW2ldOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgIENvbXBsZXRlIHRoZSBiaWcgYnVja2V0IFtzc10gYnkgcXVpY2tzb3J0aW5nCisgICAgICAgICAgICAgICAgICBhbnkgdW5zb3J0ZWQgc21hbGwgYnVja2V0cyBbc3MsIGpdLiAgSG9wZWZ1bGx5CisgICAgICAgICAgICAgICAgICBwcmV2aW91cyBwb2ludGVyLXNjYW5uaW5nIHBoYXNlcyBoYXZlIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCBtYW55IG9mIHRoZSBzbWFsbCBidWNrZXRzIFtzcywgal0sIHNvCisgICAgICAgICAgICAgICAgICB3ZSBkb24ndCBoYXZlIHRvIHNvcnQgdGhlbSBhdCBhbGwuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHNiID0gKHNzIDw8IDgpICsgajsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoKGZ0YWJbc2JdICYgU0VUTUFTSykgPT0gU0VUTUFTSykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsbyA9IGZ0YWJbc2JdICYgQ0xFQVJNQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpID0gKGZ0YWJbc2IgKyAxXSAmIENMRUFSTUFTSykgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpID4gbG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxU29ydDMobG8sIGhpLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1RU29ydGVkICs9IChoaSAtIGxvICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtEb25lID4gd29ya0xpbWl0ICYmIGZpcnN0QXR0ZW1wdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnRhYltzYl0gfD0gU0VUTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICBUaGUgc3MgYmlnIGJ1Y2tldCBpcyBub3cgZG9uZS4gIFJlY29yZCB0aGlzIGZhY3QsCisgICAgICAgICAgICAgICAgICBhbmQgdXBkYXRlIHRoZSBxdWFkcmFudCBkZXNjcmlwdG9ycy4gIFJlbWVtYmVyIHRvCisgICAgICAgICAgICAgICAgICB1cGRhdGUgcXVhZHJhbnRzIGluIHRoZSBvdmVyc2hvb3QgYXJlYSB0b28sIGlmCisgICAgICAgICAgICAgICAgICBuZWNlc3NhcnkuICBUaGUgImlmIChpIDwgMjU1KSIgdGVzdCBtZXJlbHkgc2tpcHMKKyAgICAgICAgICAgICAgICAgIHRoaXMgdXBkYXRpbmcgZm9yIHRoZSBsYXN0IGJ1Y2tldCBwcm9jZXNzZWQsIHNpbmNlCisgICAgICAgICAgICAgICAgICB1cGRhdGluZyBmb3IgdGhlIGxhc3QgYnVja2V0IGlzIHBvaW50bGVzcy4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGJpZ0RvbmVbc3NdID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGlmIChpIDwgMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIGludCBiYlN0YXJ0ICA9IGZ0YWJbc3MgPDwgOF0gJiBDTEVBUk1BU0s7CisgICAgICAgICAgICAgICAgICAgIGludCBiYlNpemUgICA9IChmdGFiWyhzcyArIDEpIDw8IDhdICYgQ0xFQVJNQVNLKSAtIGJiU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGludCBzaGlmdHMgICA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChiYlNpemUgPj4gc2hpZnRzKSA+IDY1NTM0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdHMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBiYlNpemU7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEydXBkYXRlID0genB0cltiYlN0YXJ0ICsgal07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcVZhbCA9IChqID4+IHNoaWZ0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBxdWFkcmFudFthMnVwZGF0ZV0gPSBxVmFsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEydXBkYXRlIDwgTlVNX09WRVJTSE9PVF9CWVRFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWRyYW50W2EydXBkYXRlICsgbGFzdCArIDFdID0gcVZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghKCgoYmJTaXplIC0gMSkgPj4gc2hpZnRzKSA8PSA2NTUzNSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgTm93IHNjYW4gdGhpcyBiaWcgYnVja2V0IHNvIGFzIHRvIHN5bnRoZXNpc2UgdGhlCisgICAgICAgICAgICAgICAgICBzb3J0ZWQgb3JkZXIgZm9yIHNtYWxsIGJ1Y2tldHMgW3QsIHNzXSBmb3IgYWxsIHQgIT0gc3MuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHlbal0gPSBmdGFiWyhqIDw8IDgpICsgc3NdICYgQ0xFQVJNQVNLOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaiA9IGZ0YWJbc3MgPDwgOF0gJiBDTEVBUk1BU0s7CisgICAgICAgICAgICAgICAgICAgICBqIDwgKGZ0YWJbKHNzICsgMSkgPDwgOF0gJiBDTEVBUk1BU0spOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYzEgPSBibG9ja1t6cHRyW2pdXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiaWdEb25lW2MxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgenB0cltjb3B5W2MxXV0gPSB6cHRyW2pdID09IDAgPyBsYXN0IDogenB0cltqXSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5W2MxXSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykgeworICAgICAgICAgICAgICAgICAgICBmdGFiWyhqIDw8IDgpICsgc3NdIHw9IFNFVE1BU0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJhbmRvbWlzZUJsb2NrKCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHJOVG9HbyA9IDA7CisgICAgICAgIGludCByVFBvcyAgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgIGluVXNlW2ldID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgeworICAgICAgICAgICAgaWYgKHJOVG9HbyA9PSAwKSB7CisgICAgICAgICAgICAgICAgck5Ub0dvID0gKGNoYXIpIHJOdW1zW3JUUG9zXTsKKyAgICAgICAgICAgICAgICByVFBvcysrOworICAgICAgICAgICAgICAgIGlmIChyVFBvcyA9PSA1MTIpIHsKKyAgICAgICAgICAgICAgICAgICAgclRQb3MgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJOVG9Hby0tOworICAgICAgICAgICAgYmxvY2tbaSArIDFdIF49ICgock5Ub0dvID09IDEpID8gMSA6IDApOworICAgICAgICAgICAgLy8gaGFuZGxlIDE2IGJpdCBzaWduZWQgbnVtYmVycworICAgICAgICAgICAgYmxvY2tbaSArIDFdICY9IDB4RkY7CisKKyAgICAgICAgICAgIGluVXNlW2Jsb2NrW2kgKyAxXV0gPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvUmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uKCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICB3b3JrTGltaXQgPSB3b3JrRmFjdG9yICogbGFzdDsKKyAgICAgICAgd29ya0RvbmUgPSAwOworICAgICAgICBibG9ja1JhbmRvbWlzZWQgPSBmYWxzZTsKKyAgICAgICAgZmlyc3RBdHRlbXB0ID0gdHJ1ZTsKKworICAgICAgICBtYWluU29ydCgpOworCisgICAgICAgIGlmICh3b3JrRG9uZSA+IHdvcmtMaW1pdCAmJiBmaXJzdEF0dGVtcHQpIHsKKyAgICAgICAgICAgIHJhbmRvbWlzZUJsb2NrKCk7CisgICAgICAgICAgICB3b3JrTGltaXQgPSB3b3JrRG9uZSA9IDA7CisgICAgICAgICAgICBibG9ja1JhbmRvbWlzZWQgPSB0cnVlOworICAgICAgICAgICAgZmlyc3RBdHRlbXB0ID0gZmFsc2U7CisgICAgICAgICAgICBtYWluU29ydCgpOworICAgICAgICB9CisKKyAgICAgICAgb3JpZ1B0ciA9IC0xOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgeworICAgICAgICAgICAgaWYgKHpwdHJbaV0gPT0gMCkgeworICAgICAgICAgICAgICAgIG9yaWdQdHIgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGlmIChvcmlnUHRyID09IC0xKSB7CisgICAgICAgICAgICBwYW5pYygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGZ1bGxHdFUoaW50IGkxLCBpbnQgaTIpIHsKKyAgICAgICAgaW50IGs7CisgICAgICAgIGNoYXIgYzEsIGMyOworICAgICAgICBpbnQgczEsIHMyOworCisgICAgICAgIGMxID0gYmxvY2tbaTEgKyAxXTsKKyAgICAgICAgYzIgPSBibG9ja1tpMiArIDFdOworICAgICAgICBpZiAoYzEgIT0gYzIpIHsKKyAgICAgICAgICAgIHJldHVybiAoYzEgPiBjMik7CisgICAgICAgIH0KKyAgICAgICAgaTErKzsKKyAgICAgICAgaTIrKzsKKworICAgICAgICBjMSA9IGJsb2NrW2kxICsgMV07CisgICAgICAgIGMyID0gYmxvY2tbaTIgKyAxXTsKKyAgICAgICAgaWYgKGMxICE9IGMyKSB7CisgICAgICAgICAgICByZXR1cm4gKGMxID4gYzIpOworICAgICAgICB9CisgICAgICAgIGkxKys7CisgICAgICAgIGkyKys7CisKKyAgICAgICAgYzEgPSBibG9ja1tpMSArIDFdOworICAgICAgICBjMiA9IGJsb2NrW2kyICsgMV07CisgICAgICAgIGlmIChjMSAhPSBjMikgeworICAgICAgICAgICAgcmV0dXJuIChjMSA+IGMyKTsKKyAgICAgICAgfQorICAgICAgICBpMSsrOworICAgICAgICBpMisrOworCisgICAgICAgIGMxID0gYmxvY2tbaTEgKyAxXTsKKyAgICAgICAgYzIgPSBibG9ja1tpMiArIDFdOworICAgICAgICBpZiAoYzEgIT0gYzIpIHsKKyAgICAgICAgICAgIHJldHVybiAoYzEgPiBjMik7CisgICAgICAgIH0KKyAgICAgICAgaTErKzsKKyAgICAgICAgaTIrKzsKKworICAgICAgICBjMSA9IGJsb2NrW2kxICsgMV07CisgICAgICAgIGMyID0gYmxvY2tbaTIgKyAxXTsKKyAgICAgICAgaWYgKGMxICE9IGMyKSB7CisgICAgICAgICAgICByZXR1cm4gKGMxID4gYzIpOworICAgICAgICB9CisgICAgICAgIGkxKys7CisgICAgICAgIGkyKys7CisKKyAgICAgICAgYzEgPSBibG9ja1tpMSArIDFdOworICAgICAgICBjMiA9IGJsb2NrW2kyICsgMV07CisgICAgICAgIGlmIChjMSAhPSBjMikgeworICAgICAgICAgICAgcmV0dXJuIChjMSA+IGMyKTsKKyAgICAgICAgfQorICAgICAgICBpMSsrOworICAgICAgICBpMisrOworCisgICAgICAgIGsgPSBsYXN0ICsgMTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBjMSA9IGJsb2NrW2kxICsgMV07CisgICAgICAgICAgICBjMiA9IGJsb2NrW2kyICsgMV07CisgICAgICAgICAgICBpZiAoYzEgIT0gYzIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGMxID4gYzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgczEgPSBxdWFkcmFudFtpMV07CisgICAgICAgICAgICBzMiA9IHF1YWRyYW50W2kyXTsKKyAgICAgICAgICAgIGlmIChzMSAhPSBzMikgeworICAgICAgICAgICAgICAgIHJldHVybiAoczEgPiBzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpMSsrOworICAgICAgICAgICAgaTIrKzsKKworICAgICAgICAgICAgYzEgPSBibG9ja1tpMSArIDFdOworICAgICAgICAgICAgYzIgPSBibG9ja1tpMiArIDFdOworICAgICAgICAgICAgaWYgKGMxICE9IGMyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjMSA+IGMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMxID0gcXVhZHJhbnRbaTFdOworICAgICAgICAgICAgczIgPSBxdWFkcmFudFtpMl07CisgICAgICAgICAgICBpZiAoczEgIT0gczIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHMxID4gczIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaTErKzsKKyAgICAgICAgICAgIGkyKys7CisKKyAgICAgICAgICAgIGMxID0gYmxvY2tbaTEgKyAxXTsKKyAgICAgICAgICAgIGMyID0gYmxvY2tbaTIgKyAxXTsKKyAgICAgICAgICAgIGlmIChjMSAhPSBjMikgeworICAgICAgICAgICAgICAgIHJldHVybiAoYzEgPiBjMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzMSA9IHF1YWRyYW50W2kxXTsKKyAgICAgICAgICAgIHMyID0gcXVhZHJhbnRbaTJdOworICAgICAgICAgICAgaWYgKHMxICE9IHMyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzMSA+IHMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkxKys7CisgICAgICAgICAgICBpMisrOworCisgICAgICAgICAgICBjMSA9IGJsb2NrW2kxICsgMV07CisgICAgICAgICAgICBjMiA9IGJsb2NrW2kyICsgMV07CisgICAgICAgICAgICBpZiAoYzEgIT0gYzIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGMxID4gYzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgczEgPSBxdWFkcmFudFtpMV07CisgICAgICAgICAgICBzMiA9IHF1YWRyYW50W2kyXTsKKyAgICAgICAgICAgIGlmIChzMSAhPSBzMikgeworICAgICAgICAgICAgICAgIHJldHVybiAoczEgPiBzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpMSsrOworICAgICAgICAgICAgaTIrKzsKKworICAgICAgICAgICAgaWYgKGkxID4gbGFzdCkgeworICAgICAgICAgICAgICAgIGkxIC09IGxhc3Q7CisgICAgICAgICAgICAgICAgaTEtLTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoaTIgPiBsYXN0KSB7CisgICAgICAgICAgICAgICAgaTIgLT0gbGFzdDsKKyAgICAgICAgICAgICAgICBpMi0tOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgayAtPSA0OworICAgICAgICAgICAgd29ya0RvbmUrKzsKKyAgICAgICAgfSB3aGlsZSAoayA+PSAwKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoKKyAgICAgIEtudXRoJ3MgaW5jcmVtZW50cyBzZWVtIHRvIHdvcmsgYmV0dGVyCisgICAgICB0aGFuIEluY2VycGktU2VkZ2V3aWNrIGhlcmUuICBQb3NzaWJseQorICAgICAgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGVsZW1zIHRvIHNvcnQgaXMKKyAgICAgIHVzdWFsbHkgc21hbGwsIHR5cGljYWxseSA8PSAyMC4KKyAgICAqLworICAgIHByaXZhdGUgaW50W10gaW5jcyA9IHsxLCA0LCAxMywgNDAsIDEyMSwgMzY0LCAxMDkzLCAzMjgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOTg0MSwgMjk1MjQsIDg4NTczLCAyNjU3MjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA3OTcxNjEsIDIzOTE0ODR9OworCisgICAgcHJpdmF0ZSB2b2lkIGFsbG9jYXRlQ29tcHJlc3NTdHJ1Y3R1cmVzICgpIHsKKyAgICAgICAgaW50IG4gPSBiYXNlQmxvY2tTaXplICogYmxvY2tTaXplMTAwazsKKyAgICAgICAgYmxvY2sgPSBuZXcgY2hhclsobiArIDEgKyBOVU1fT1ZFUlNIT09UX0JZVEVTKV07CisgICAgICAgIHF1YWRyYW50ID0gbmV3IGludFsobiArIE5VTV9PVkVSU0hPT1RfQllURVMpXTsKKyAgICAgICAgenB0ciA9IG5ldyBpbnRbbl07CisgICAgICAgIGZ0YWIgPSBuZXcgaW50WzY1NTM3XTsKKworICAgICAgICBpZiAoYmxvY2sgPT0gbnVsbCB8fCBxdWFkcmFudCA9PSBudWxsIHx8IHpwdHIgPT0gbnVsbAorICAgICAgICAgICAgfHwgZnRhYiA9PSBudWxsKSB7CisgICAgICAgICAgICAvL2ludCB0b3RhbERyYXcgPSAobiArIDEgKyBOVU1fT1ZFUlNIT09UX0JZVEVTKSArIChuICsgTlVNX09WRVJTSE9PVF9CWVRFUykgKyBuICsgNjU1Mzc7CisgICAgICAgICAgICAvL2NvbXByZXNzT3V0T2ZNZW1vcnkgKCB0b3RhbERyYXcsIG4gKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAgVGhlIGJhY2sgZW5kIG5lZWRzIGEgcGxhY2UgdG8gc3RvcmUgdGhlIE1URiB2YWx1ZXMKKyAgICAgICAgICB3aGlsc3QgaXQgY2FsY3VsYXRlcyB0aGUgY29kaW5nIHRhYmxlcy4gIFdlIGNvdWxkCisgICAgICAgICAgcHV0IHRoZW0gaW4gdGhlIHpwdHIgYXJyYXkuICBIb3dldmVyLCB0aGVzZSB2YWx1ZXMKKyAgICAgICAgICB3aWxsIGZpdCBpbiBhIHNob3J0LCBzbyB3ZSBvdmVybGF5IHN6cHRyIGF0IHRoZQorICAgICAgICAgIHN0YXJ0IG9mIHpwdHIsIGluIHRoZSBob3BlIG9mIHJlZHVjaW5nIHRoZSBudW1iZXIKKyAgICAgICAgICBvZiBjYWNoZSBtaXNzZXMgaW5kdWNlZCBieSB0aGUgbXVsdGlwbGUgdHJhdmVyc2FscworICAgICAgICAgIG9mIHRoZSBNVEYgdmFsdWVzIHdoZW4gY2FsY3VsYXRpbmcgY29kaW5nIHRhYmxlcy4KKyAgICAgICAgICBTZWVtcyB0byBpbXByb3ZlIGNvbXByZXNzaW9uIHNwZWVkIGJ5IGFib3V0IDElLgorICAgICAgICAqLworICAgICAgICAvLyAgICBzenB0ciA9IHpwdHI7CisKKworICAgICAgICBzenB0ciA9IG5ldyBzaG9ydFsyICogbl07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTVRGVmFsdWVzKCkgeworICAgICAgICBjaGFyW10geXkgPSBuZXcgY2hhclsyNTZdOworICAgICAgICBpbnQgIGksIGo7CisgICAgICAgIGNoYXIgdG1wOworICAgICAgICBjaGFyIHRtcDI7CisgICAgICAgIGludCB6UGVuZDsKKyAgICAgICAgaW50IHdyOworICAgICAgICBpbnQgRU9COworCisgICAgICAgIG1ha2VNYXBzKCk7CisgICAgICAgIEVPQiA9IG5JblVzZSArIDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBFT0I7IGkrKykgeworICAgICAgICAgICAgbXRmRnJlcVtpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3ciA9IDA7CisgICAgICAgIHpQZW5kID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5JblVzZTsgaSsrKSB7CisgICAgICAgICAgICB5eVtpXSA9IChjaGFyKSBpOworICAgICAgICB9CisKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgeworICAgICAgICAgICAgY2hhciBsbF9pOworCisgICAgICAgICAgICBsbF9pID0gdW5zZXFUb1NlcVtibG9ja1t6cHRyW2ldXV07CisKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgdG1wID0geXlbal07CisgICAgICAgICAgICB3aGlsZSAobGxfaSAhPSB0bXApIHsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgdG1wMiA9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSB5eVtqXTsKKyAgICAgICAgICAgICAgICB5eVtqXSA9IHRtcDI7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgeXlbMF0gPSB0bXA7CisKKyAgICAgICAgICAgIGlmIChqID09IDApIHsKKyAgICAgICAgICAgICAgICB6UGVuZCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoelBlbmQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHpQZW5kLS07CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHpQZW5kICUgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6cHRyW3dyXSA9IChzaG9ydCkgUlVOQTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10ZkZyZXFbUlVOQV0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzenB0clt3cl0gPSAoc2hvcnQpIFJVTkI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3IrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGZGcmVxW1JVTkJdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHpQZW5kIDwgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgelBlbmQgPSAoelBlbmQgLSAyKSAvIDI7CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHpQZW5kID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3pwdHJbd3JdID0gKHNob3J0KSAoaiArIDEpOworICAgICAgICAgICAgICAgIHdyKys7CisgICAgICAgICAgICAgICAgbXRmRnJlcVtqICsgMV0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh6UGVuZCA+IDApIHsKKyAgICAgICAgICAgIHpQZW5kLS07CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoelBlbmQgJSAyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICBzenB0clt3cl0gPSAoc2hvcnQpIFJVTkE7CisgICAgICAgICAgICAgICAgICAgIHdyKys7CisgICAgICAgICAgICAgICAgICAgIG10ZkZyZXFbUlVOQV0rKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBzenB0clt3cl0gPSAoc2hvcnQpIFJVTkI7CisgICAgICAgICAgICAgICAgICAgIHdyKys7CisgICAgICAgICAgICAgICAgICAgIG10ZkZyZXFbUlVOQl0rKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh6UGVuZCA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpQZW5kID0gKHpQZW5kIC0gMikgLyAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3pwdHJbd3JdID0gKHNob3J0KSBFT0I7CisgICAgICAgIHdyKys7CisgICAgICAgIG10ZkZyZXFbRU9CXSsrOworCisgICAgICAgIG5NVEYgPSB3cjsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9iemlwMi9DUkMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ1JDLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwMmM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ1JDLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgcGFja2FnZSBpcyBiYXNlZCBvbiB0aGUgd29yayBkb25lIGJ5IEtlaXJvbiBMaWRkbGUsIEFmdGV4IFNvZnR3YXJlCisgKiA8a2Vpcm9uQGFmdGV4c3cuY29tPiB0byB3aG9tIHRoZSBBbnQgcHJvamVjdCBpcyB2ZXJ5IGdyYXRlZnVsIGZvciBoaXMKKyAqIGdyZWF0IGNvZGUuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmJ6aXAyOworCisvKioKKyAqIEEgc2ltcGxlIGNsYXNzIHRoZSBob2xkIGFuZCBjYWxjdWxhdGUgdGhlIENSQyBmb3Igc2FuaXR5IGNoZWNraW5nCisgKiBvZiB0aGUgZGF0YS4KKyAqCisgKi8KK2ZpbmFsIGNsYXNzIENSQyB7CisgICAgc3RhdGljIGZpbmFsIGludCBjcmMzMlRhYmxlW10gPSB7CisgICAgICAgIDB4MDAwMDAwMDAsIDB4MDRjMTFkYjcsIDB4MDk4MjNiNmUsIDB4MGQ0MzI2ZDksCisgICAgICAgIDB4MTMwNDc2ZGMsIDB4MTdjNTZiNmIsIDB4MWE4NjRkYjIsIDB4MWU0NzUwMDUsCisgICAgICAgIDB4MjYwOGVkYjgsIDB4MjJjOWYwMGYsIDB4MmY4YWQ2ZDYsIDB4MmI0YmNiNjEsCisgICAgICAgIDB4MzUwYzliNjQsIDB4MzFjZDg2ZDMsIDB4M2M4ZWEwMGEsIDB4Mzg0ZmJkYmQsCisgICAgICAgIDB4NGMxMWRiNzAsIDB4NDhkMGM2YzcsIDB4NDU5M2UwMWUsIDB4NDE1MmZkYTksCisgICAgICAgIDB4NWYxNWFkYWMsIDB4NWJkNGIwMWIsIDB4NTY5Nzk2YzIsIDB4NTI1NjhiNzUsCisgICAgICAgIDB4NmExOTM2YzgsIDB4NmVkODJiN2YsIDB4NjM5YjBkYTYsIDB4Njc1YTEwMTEsCisgICAgICAgIDB4NzkxZDQwMTQsIDB4N2RkYzVkYTMsIDB4NzA5ZjdiN2EsIDB4NzQ1ZTY2Y2QsCisgICAgICAgIDB4OTgyM2I2ZTAsIDB4OWNlMmFiNTcsIDB4OTFhMThkOGUsIDB4OTU2MDkwMzksCisgICAgICAgIDB4OGIyN2MwM2MsIDB4OGZlNmRkOGIsIDB4ODJhNWZiNTIsIDB4ODY2NGU2ZTUsCisgICAgICAgIDB4YmUyYjViNTgsIDB4YmFlYTQ2ZWYsIDB4YjdhOTYwMzYsIDB4YjM2ODdkODEsCisgICAgICAgIDB4YWQyZjJkODQsIDB4YTllZTMwMzMsIDB4YTRhZDE2ZWEsIDB4YTA2YzBiNWQsCisgICAgICAgIDB4ZDQzMjZkOTAsIDB4ZDBmMzcwMjcsIDB4ZGRiMDU2ZmUsIDB4ZDk3MTRiNDksCisgICAgICAgIDB4YzczNjFiNGMsIDB4YzNmNzA2ZmIsIDB4Y2ViNDIwMjIsIDB4Y2E3NTNkOTUsCisgICAgICAgIDB4ZjIzYTgwMjgsIDB4ZjZmYjlkOWYsIDB4ZmJiOGJiNDYsIDB4ZmY3OWE2ZjEsCisgICAgICAgIDB4ZTEzZWY2ZjQsIDB4ZTVmZmViNDMsIDB4ZThiY2NkOWEsIDB4ZWM3ZGQwMmQsCisgICAgICAgIDB4MzQ4NjcwNzcsIDB4MzA0NzZkYzAsIDB4M2QwNDRiMTksIDB4MzljNTU2YWUsCisgICAgICAgIDB4Mjc4MjA2YWIsIDB4MjM0MzFiMWMsIDB4MmUwMDNkYzUsIDB4MmFjMTIwNzIsCisgICAgICAgIDB4MTI4ZTlkY2YsIDB4MTY0ZjgwNzgsIDB4MWIwY2E2YTEsIDB4MWZjZGJiMTYsCisgICAgICAgIDB4MDE4YWViMTMsIDB4MDU0YmY2YTQsIDB4MDgwOGQwN2QsIDB4MGNjOWNkY2EsCisgICAgICAgIDB4Nzg5N2FiMDcsIDB4N2M1NmI2YjAsIDB4NzExNTkwNjksIDB4NzVkNDhkZGUsCisgICAgICAgIDB4NmI5M2RkZGIsIDB4NmY1MmMwNmMsIDB4NjIxMWU2YjUsIDB4NjZkMGZiMDIsCisgICAgICAgIDB4NWU5ZjQ2YmYsIDB4NWE1ZTViMDgsIDB4NTcxZDdkZDEsIDB4NTNkYzYwNjYsCisgICAgICAgIDB4NGQ5YjMwNjMsIDB4NDk1YTJkZDQsIDB4NDQxOTBiMGQsIDB4NDBkODE2YmEsCisgICAgICAgIDB4YWNhNWM2OTcsIDB4YTg2NGRiMjAsIDB4YTUyN2ZkZjksIDB4YTFlNmUwNGUsCisgICAgICAgIDB4YmZhMWIwNGIsIDB4YmI2MGFkZmMsIDB4YjYyMzhiMjUsIDB4YjJlMjk2OTIsCisgICAgICAgIDB4OGFhZDJiMmYsIDB4OGU2YzM2OTgsIDB4ODMyZjEwNDEsIDB4ODdlZTBkZjYsCisgICAgICAgIDB4OTlhOTVkZjMsIDB4OWQ2ODQwNDQsIDB4OTAyYjY2OWQsIDB4OTRlYTdiMmEsCisgICAgICAgIDB4ZTBiNDFkZTcsIDB4ZTQ3NTAwNTAsIDB4ZTkzNjI2ODksIDB4ZWRmNzNiM2UsCisgICAgICAgIDB4ZjNiMDZiM2IsIDB4Zjc3MTc2OGMsIDB4ZmEzMjUwNTUsIDB4ZmVmMzRkZTIsCisgICAgICAgIDB4YzZiY2YwNWYsIDB4YzI3ZGVkZTgsIDB4Y2YzZWNiMzEsIDB4Y2JmZmQ2ODYsCisgICAgICAgIDB4ZDViODg2ODMsIDB4ZDE3OTliMzQsIDB4ZGMzYWJkZWQsIDB4ZDhmYmEwNWEsCisgICAgICAgIDB4NjkwY2UwZWUsIDB4NmRjZGZkNTksIDB4NjA4ZWRiODAsIDB4NjQ0ZmM2MzcsCisgICAgICAgIDB4N2EwODk2MzIsIDB4N2VjOThiODUsIDB4NzM4YWFkNWMsIDB4Nzc0YmIwZWIsCisgICAgICAgIDB4NGYwNDBkNTYsIDB4NGJjNTEwZTEsIDB4NDY4NjM2MzgsIDB4NDI0NzJiOGYsCisgICAgICAgIDB4NWMwMDdiOGEsIDB4NThjMTY2M2QsIDB4NTU4MjQwZTQsIDB4NTE0MzVkNTMsCisgICAgICAgIDB4MjUxZDNiOWUsIDB4MjFkYzI2MjksIDB4MmM5ZjAwZjAsIDB4Mjg1ZTFkNDcsCisgICAgICAgIDB4MzYxOTRkNDIsIDB4MzJkODUwZjUsIDB4M2Y5Yjc2MmMsIDB4M2I1YTZiOWIsCisgICAgICAgIDB4MDMxNWQ2MjYsIDB4MDdkNGNiOTEsIDB4MGE5N2VkNDgsIDB4MGU1NmYwZmYsCisgICAgICAgIDB4MTAxMWEwZmEsIDB4MTRkMGJkNGQsIDB4MTk5MzliOTQsIDB4MWQ1Mjg2MjMsCisgICAgICAgIDB4ZjEyZjU2MGUsIDB4ZjVlZTRiYjksIDB4ZjhhZDZkNjAsIDB4ZmM2YzcwZDcsCisgICAgICAgIDB4ZTIyYjIwZDIsIDB4ZTZlYTNkNjUsIDB4ZWJhOTFiYmMsIDB4ZWY2ODA2MGIsCisgICAgICAgIDB4ZDcyN2JiYjYsIDB4ZDNlNmE2MDEsIDB4ZGVhNTgwZDgsIDB4ZGE2NDlkNmYsCisgICAgICAgIDB4YzQyM2NkNmEsIDB4YzBlMmQwZGQsIDB4Y2RhMWY2MDQsIDB4Yzk2MGViYjMsCisgICAgICAgIDB4YmQzZThkN2UsIDB4YjlmZjkwYzksIDB4YjRiY2I2MTAsIDB4YjA3ZGFiYTcsCisgICAgICAgIDB4YWUzYWZiYTIsIDB4YWFmYmU2MTUsIDB4YTdiOGMwY2MsIDB4YTM3OWRkN2IsCisgICAgICAgIDB4OWIzNjYwYzYsIDB4OWZmNzdkNzEsIDB4OTJiNDViYTgsIDB4OTY3NTQ2MWYsCisgICAgICAgIDB4ODgzMjE2MWEsIDB4OGNmMzBiYWQsIDB4ODFiMDJkNzQsIDB4ODU3MTMwYzMsCisgICAgICAgIDB4NWQ4YTkwOTksIDB4NTk0YjhkMmUsIDB4NTQwOGFiZjcsIDB4NTBjOWI2NDAsCisgICAgICAgIDB4NGU4ZWU2NDUsIDB4NGE0ZmZiZjIsIDB4NDcwY2RkMmIsIDB4NDNjZGMwOWMsCisgICAgICAgIDB4N2I4MjdkMjEsIDB4N2Y0MzYwOTYsIDB4NzIwMDQ2NGYsIDB4NzZjMTViZjgsCisgICAgICAgIDB4Njg4NjBiZmQsIDB4NmM0NzE2NGEsIDB4NjEwNDMwOTMsIDB4NjVjNTJkMjQsCisgICAgICAgIDB4MTE5YjRiZTksIDB4MTU1YTU2NWUsIDB4MTgxOTcwODcsIDB4MWNkODZkMzAsCisgICAgICAgIDB4MDI5ZjNkMzUsIDB4MDY1ZTIwODIsIDB4MGIxZDA2NWIsIDB4MGZkYzFiZWMsCisgICAgICAgIDB4Mzc5M2E2NTEsIDB4MzM1MmJiZTYsIDB4M2UxMTlkM2YsIDB4M2FkMDgwODgsCisgICAgICAgIDB4MjQ5N2QwOGQsIDB4MjA1NmNkM2EsIDB4MmQxNWViZTMsIDB4MjlkNGY2NTQsCisgICAgICAgIDB4YzVhOTI2NzksIDB4YzE2ODNiY2UsIDB4Y2MyYjFkMTcsIDB4YzhlYTAwYTAsCisgICAgICAgIDB4ZDZhZDUwYTUsIDB4ZDI2YzRkMTIsIDB4ZGYyZjZiY2IsIDB4ZGJlZTc2N2MsCisgICAgICAgIDB4ZTNhMWNiYzEsIDB4ZTc2MGQ2NzYsIDB4ZWEyM2YwYWYsIDB4ZWVlMmVkMTgsCisgICAgICAgIDB4ZjBhNWJkMWQsIDB4ZjQ2NGEwYWEsIDB4ZjkyNzg2NzMsIDB4ZmRlNjliYzQsCisgICAgICAgIDB4ODliOGZkMDksIDB4OGQ3OWUwYmUsIDB4ODAzYWM2NjcsIDB4ODRmYmRiZDAsCisgICAgICAgIDB4OWFiYzhiZDUsIDB4OWU3ZDk2NjIsIDB4OTMzZWIwYmIsIDB4OTdmZmFkMGMsCisgICAgICAgIDB4YWZiMDEwYjEsIDB4YWI3MTBkMDYsIDB4YTYzMjJiZGYsIDB4YTJmMzM2NjgsCisgICAgICAgIDB4YmNiNDY2NmQsIDB4Yjg3NTdiZGEsIDB4YjUzNjVkMDMsIDB4YjFmNzQwYjQKKyAgICB9OworCisgICAgQ1JDKCkgeworICAgICAgICBpbml0aWFsaXNlQ1JDKCk7CisgICAgfQorCisgICAgdm9pZCBpbml0aWFsaXNlQ1JDKCkgeworICAgICAgICBnbG9iYWxDcmMgPSAweGZmZmZmZmZmOworICAgIH0KKworICAgIGludCBnZXRGaW5hbENSQygpIHsKKyAgICAgICAgcmV0dXJuIH5nbG9iYWxDcmM7CisgICAgfQorCisgICAgaW50IGdldEdsb2JhbENSQygpIHsKKyAgICAgICAgcmV0dXJuIGdsb2JhbENyYzsKKyAgICB9CisKKyAgICB2b2lkIHNldEdsb2JhbENSQyhpbnQgbmV3Q3JjKSB7CisgICAgICAgIGdsb2JhbENyYyA9IG5ld0NyYzsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUNSQyhpbnQgaW5DaCkgeworICAgICAgICBpbnQgdGVtcCA9IChnbG9iYWxDcmMgPj4gMjQpIF4gaW5DaDsKKyAgICAgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICAgICAgICB0ZW1wID0gMjU2ICsgdGVtcDsKKyAgICAgICAgfQorICAgICAgICBnbG9iYWxDcmMgPSAoZ2xvYmFsQ3JjIDw8IDgpIF4gQ1JDLmNyYzMyVGFibGVbdGVtcF07CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVDUkMoaW50IGluQ2gsIGludCByZXBlYXQpIHsKKyAgICAgICAgaW50IGdsb2JhbENyY1NoYWRvdyA9IHRoaXMuZ2xvYmFsQ3JjOworICAgICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKSB7CisgICAgICAgICAgICBpbnQgdGVtcCA9IChnbG9iYWxDcmNTaGFkb3cgPj4gMjQpIF4gaW5DaDsKKyAgICAgICAgICAgIGdsb2JhbENyY1NoYWRvdyA9IChnbG9iYWxDcmNTaGFkb3cgPDwgOCkgXiBjcmMzMlRhYmxlWyh0ZW1wID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRlbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHRlbXAgKyAyNTYpXTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmdsb2JhbENyYyA9IGdsb2JhbENyY1NoYWRvdzsKKyAgICB9CisKKyAgICBpbnQgZ2xvYmFsQ3JjOworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL21haWwvRXJyb3JJblF1aXRFeGNlcHRpb24uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvbWFpbC9FcnJvckluUXVpdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOWI4NWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL21haWwvRXJyb3JJblF1aXRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5tYWlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBTcGVjaWFsaXplZCBJT0V4Y2VwdGlvbiB0aGF0IGdldCB0aHJvd24gaWYgU01QVCdzIFFVSVQgY29tbWFuZCBmYWlscy4KKyAqCisgKiA8cD5UaGlzIHNlZW1zIHRvIGhhcHBlbiB3aXRoIHNvbWUgdmVyc2lvbiBvZiBNUyBFeGNoYW5nZSB0aGF0CisgKiBkb2Vzbid0IHJlc3BvbmQgd2l0aCBhIDIyMSBjb2RlIGltbWVkaWF0ZWx5LiAgU2VlIDxhCisgKiBocmVmPSJodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUyNzMiPkJ1ZworICogcmVwb3J0IDUyNzM8L2E+LjwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFcnJvckluUXVpdEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpc2UgZnJvbSBhbiBJT0V4Y2VwdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIGUgdGhlIElPIEV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXJyb3JJblF1aXRFeGNlcHRpb24oSU9FeGNlcHRpb24gZSkgeworICAgICAgICBzdXBlcihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL21haWwvTWFpbE1lc3NhZ2UuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvbWFpbC9NYWlsTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNjRmMzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL21haWwvTWFpbE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDUyNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBjbGFzcyB3YXMgZG9uYXRlZCBieSBKYXNvbiBIdW50ZXIsCisgKiB3aG8gd3JvdGUgdGhlIGNsYXNzIGFzIHBhcnQgb2YgdGhlIGNvbS5vcmVpbGx5LnNlcnZsZXQKKyAqIHBhY2thZ2UgZm9yIGhpcyBib29rICJKYXZhIFNlcnZsZXQgUHJvZ3JhbW1pbmciIChPJ1JlaWxseSkuCisgKiBTZWUgaHR0cDovL3d3dy5zZXJ2bGV0cy5jb20uCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5tYWlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCisvKioKKyAqIEEgY2xhc3MgdG8gaGVscCBzZW5kIFNNVFAgZW1haWwuCisgKiBUaGlzIGNsYXNzIGlzIGFuIGltcHJvdmVtZW50IG9uIHRoZSBzdW4ubmV0LnNtdHAuU210cENsaWVudCBjbGFzcworICogZm91bmQgaW4gdGhlIEpESy4gIFRoaXMgdmVyc2lvbiBoYXMgZXh0cmEgZnVuY3Rpb25hbGl0eSwgYW5kIGNhbiBiZSB1c2VkCisgKiB3aXRoIEpWTXMgdGhhdCBkaWQgbm90IGV4dGVuZCBmcm9tIHRoZSBKREsuICBJdCdzIG5vdCBhcyByb2J1c3QgYXMKKyAqIHRoZSBKYXZhTWFpbCBTdGFuZGFyZCBFeHRlbnNpb24gY2xhc3NlcywgYnV0IGl0J3MgZWFzaWVyIHRvIHVzZSBhbmQKKyAqIGVhc2llciB0byBpbnN0YWxsLCBhbmQgaGFzIGFuIE9wZW4gU291cmNlIGxpY2Vuc2UuCisgKiA8cD4KKyAqIEl0IGNhbiBiZSB1c2VkIGxpa2UgdGhpczoKKyAqIDxibG9ja3F1b3RlPjxwcmU+CisgKiBTdHJpbmcgbWFpbGhvc3QgPSAibG9jYWxob3N0IjsgIC8vIG9yIGFub3RoZXIgbWFpbCBob3N0CisgKiBTdHJpbmcgZnJvbSA9ICJNYWlsIE1lc3NhZ2UgU2VydmxldCAmbHQ7TWFpbE1lc3NhZ2VAc2VydmVyLmNvbSZndDsiOworICogU3RyaW5nIHRvID0gInRvQHlvdS5jb20iOworICogU3RyaW5nIGNjMSA9ICJjYzFAeW91LmNvbSI7CisgKiBTdHJpbmcgY2MyID0gImNjMkB5b3UuY29tIjsKKyAqIFN0cmluZyBiY2MgPSAiYmNjQHlvdS5jb20iOworICogJm5ic3A7CisgKiBNYWlsTWVzc2FnZSBtc2cgPSBuZXcgTWFpbE1lc3NhZ2UobWFpbGhvc3QpOworICogbXNnLnNldFBvcnQoMjUpOworICogbXNnLmZyb20oZnJvbSk7CisgKiBtc2cudG8odG8pOworICogbXNnLmNjKGNjMSk7CisgKiBtc2cuY2MoY2MyKTsKKyAqIG1zZy5iY2MoYmNjKTsKKyAqIG1zZy5zZXRTdWJqZWN0KCJUZXN0IHN1YmplY3QiKTsKKyAqIFByaW50U3RyZWFtIG91dCA9IG1zZy5nZXRQcmludFN0cmVhbSgpOworICogJm5ic3A7CisgKiBFbnVtZXJhdGlvbiBlbnVtID0gcmVxLmdldFBhcmFtZXRlck5hbWVzKCk7CisgKiB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICogICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpZW51bS5uZXh0RWxlbWVudCgpOworICogICBTdHJpbmcgdmFsdWUgPSByZXEuZ2V0UGFyYW1ldGVyKG5hbWUpOworICogICBvdXQucHJpbnRsbihuYW1lICsgIiA9ICIgKyB2YWx1ZSk7CisgKiB9CisgKiAmbmJzcDsKKyAqIG1zZy5zZW5kQW5kQ2xvc2UoKTsKKyAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogQmUgc3VyZSB0byBzZXQgdGhlIGZyb20gYWRkcmVzcywgdGhlbiBzZXQgdGhlIHJlY2VwaWVudAorICogYWRkcmVzc2VzLCB0aGVuIHNldCB0aGUgc3ViamVjdCBhbmQgb3RoZXIgaGVhZGVycywgdGhlbiBnZXQgdGhlCisgKiBQcmludFN0cmVhbSwgdGhlbiB3cml0ZSB0aGUgbWVzc2FnZSwgYW5kIGZpbmFsbHkgc2VuZCBhbmQgY2xvc2UuCisgKiBUaGUgY2xhc3MgZG9lcyBtaW5pbWFsIGVycm9yIGNoZWNraW5nIGludGVybmFsbHk7IGl0IGNvdW50cyBvbiB0aGUgbWFpbAorICogaG9zdCB0byBjb21wbGFpbiBpZiB0aGVyZSdzIGFueSBtYWxmb3JtYXR0ZWQgaW5wdXQgb3Igb3V0IG9mIG9yZGVyCisgKiBleGVjdXRpb24uCisgKiA8cD4KKyAqIEFuIGF0dGFjaG1lbnQgbWVjaGFuaXNtIGJhc2VkIG9uIFJGQyAxNTIxIGNvdWxkIGJlIGltcGxlbWVudGVkIG9uIHRvcCBvZgorICogdGhpcyBjbGFzcy4gIEluIHRoZSBtZWFud2hpbGUsIEphdmFNYWlsIGlzIHRoZSBiZXN0IHNvbHV0aW9uIGZvciBzZW5kaW5nCisgKiBlbWFpbCB3aXRoIGF0dGFjaG1lbnRzLgorICogPHA+CisgKiBTdGlsbCB0byBkbzoKKyAqIDx1bD4KKyAqIDxsaT5GaWd1cmUgb3V0IGhvdyB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbiBjYXNlIG9mIGVycm9yCisgKiA8L3VsPgorICoKKyAqIEB2ZXJzaW9uIDEuMSwgMjAwMC8wMy8xOSwgYWRkZWQgYW5nbGUgYnJhY2tldHMgdG8gYWRkcmVzcywgaGVscHMgc29tZSBzZXJ2ZXJzCisgKiB2ZXJzaW9uIDEuMCwgMTk5OS8xMi8yOQorICovCitwdWJsaWMgY2xhc3MgTWFpbE1lc3NhZ2UgeworCisgICAgLyoqIGRlZmF1bHQgbWFpbGhvc3QgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0hPU1QgPSAibG9jYWxob3N0IjsKKworICAgIC8qKiBkZWZhdWx0IHBvcnQgZm9yIFNNVFA6IDI1ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT1JUID0gMjU7CisKKyAgICAvKiogaG9zdCBuYW1lIGZvciB0aGUgbWFpbCBzZXJ2ZXIgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob3N0OworCisgICAgLyoqIGhvc3QgcG9ydCBmb3IgdGhlIG1haWwgc2VydmVyICovCisgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IERFRkFVTFRfUE9SVDsKKworICAgIC8qKiBzZW5kZXIgZW1haWwgYWRkcmVzcyAqLworICAgIHByaXZhdGUgU3RyaW5nIGZyb207CisKKyAgICAvKiogbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgdG8gcmVwbHkgdG8gKi8KKyAgICBwcml2YXRlIFZlY3RvciByZXBseXRvOworCisgICAgLyoqIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIHRvIHNlbmQgdG8gKi8KKyAgICBwcml2YXRlIFZlY3RvciB0bzsKKworICAgIC8qKiBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyB0byBjYyB0byAqLworICAgIHByaXZhdGUgVmVjdG9yIGNjOworCisgICAgLyoqIGhlYWRlcnMgdG8gc2VuZCBpbiB0aGUgbWFpbCAqLworICAgIHByaXZhdGUgVmVjdG9yIGhlYWRlcnNLZXlzOworICAgIHByaXZhdGUgVmVjdG9yIGhlYWRlcnNWYWx1ZXM7CisKKyAgICBwcml2YXRlIE1haWxQcmludFN0cmVhbSBvdXQ7CisKKyAgICBwcml2YXRlIFNtdHBSZXNwb25zZVJlYWRlciBpbjsKKworICAgIHByaXZhdGUgU29ja2V0IHNvY2tldDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0tfUkVBRFkgPSAyMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9LX0hFTE8gPSAyNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9LX0ZST00gPSAyNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9LX1JDUFRfMSA9IDI1MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0tfUkNQVF8yID0gMjUxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPS19EQVRBID0gMzU0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPS19ET1QgPSAyNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9LX1FVSVQgPSAyMjE7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgTWFpbE1lc3NhZ2UgdG8gc2VuZCBhbiBlbWFpbC4KKyAgICogVXNlIGxvY2FsaG9zdCBhcyB0aGUgbWFpbCBzZXJ2ZXIgd2l0aCBwb3J0IDI1LgorICAgKgorICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gY29udGFjdGluZyB0aGUgbWFpbCBzZXJ2ZXIKKyAgICovCisgIHB1YmxpYyBNYWlsTWVzc2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcyhERUZBVUxUX0hPU1QsIERFRkFVTFRfUE9SVCk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBNYWlsTWVzc2FnZSB0byBzZW5kIGFuIGVtYWlsLgorICAgKiBVc2UgdGhlIGdpdmVuIGhvc3QgYXMgdGhlIG1haWwgc2VydmVyIHdpdGggcG9ydCAyNS4KKyAgICoKKyAgICogQHBhcmFtIGhvc3QgdGhlIG1haWwgc2VydmVyIHRvIHVzZQorICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gY29udGFjdGluZyB0aGUgbWFpbCBzZXJ2ZXIKKyAgICovCisgIHB1YmxpYyBNYWlsTWVzc2FnZShTdHJpbmcgaG9zdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB0aGlzKGhvc3QsIERFRkFVTFRfUE9SVCk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBNYWlsTWVzc2FnZSB0byBzZW5kIGFuIGVtYWlsLgorICAgKiBVc2UgdGhlIGdpdmVuIGhvc3QgYW5kIHBvcnQgYXMgdGhlIG1haWwgc2VydmVyLgorICAgKgorICAgKiBAcGFyYW0gaG9zdCB0aGUgbWFpbCBzZXJ2ZXIgdG8gdXNlCisgICAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8KKyAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSdzIGFueSBwcm9ibGVtIGNvbnRhY3RpbmcgdGhlIG1haWwgc2VydmVyCisgICAqLworICBwdWJsaWMgTWFpbE1lc3NhZ2UoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICByZXBseXRvID0gbmV3IFZlY3RvcigpOworICAgIHRvID0gbmV3IFZlY3RvcigpOworICAgIGNjID0gbmV3IFZlY3RvcigpOworICAgIGhlYWRlcnNLZXlzID0gbmV3IFZlY3RvcigpOworICAgIGhlYWRlcnNWYWx1ZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgY29ubmVjdCgpOworICAgIHNlbmRIZWxvKCk7CisgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9ydCB0byBjb25uZWN0IHRvIHRoZSBTTVRQIGhvc3QuCisgICAgICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gdXNlIGZvciBjb25uZWN0aW9uLgorICAgICAqIEBzZWUgI0RFRkFVTFRfUE9SVAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmcm9tIGFkZHJlc3MuICBBbHNvIHNldHMgdGhlICJGcm9tIiBoZWFkZXIuICBUaGlzIG1ldGhvZCBzaG91bGQKKyAgICAgKiBiZSBjYWxsZWQgb25seSBvbmNlLgorICAgICAqIEBwYXJhbSBmcm9tIHRoZSBmcm9tIGFkZHJlc3MKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVwb3J0ZWQgYnkgdGhlIG1haWwgc2VydmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgZnJvbShTdHJpbmcgZnJvbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc2VuZEZyb20oZnJvbSk7CisgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcmVwbHl0byBhZGRyZXNzCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlCisgICAgICogY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorICAgICAqIEBwYXJhbSBydG8gdGhlIHJlcGx5dG8gYWRkcmVzcworICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVwbHl0byhTdHJpbmcgcnRvKSB7CisgICAgICB0aGlzLnJlcGx5dG8uYWRkRWxlbWVudChydG8pOworICAgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgdG8gYWRkcmVzcy4gIEFsc28gc2V0cyB0aGUgIlRvIiBoZWFkZXIuICBUaGlzIG1ldGhvZCBtYXkgYmUKKyAgICogY2FsbGVkIG11bHRpcGxlIHRpbWVzLgorICAgKgorICAgKiBAcGFyYW0gdG8gdGhlIHRvIGFkZHJlc3MKKyAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSdzIGFueSBwcm9ibGVtIHJlcG9ydGVkIGJ5IHRoZSBtYWlsIHNlcnZlcgorICAgKi8KKyAgcHVibGljIHZvaWQgdG8oU3RyaW5nIHRvKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHNlbmRSY3B0KHRvKTsKKyAgICB0aGlzLnRvLmFkZEVsZW1lbnQodG8pOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGNjIGFkZHJlc3MuICBBbHNvIHNldHMgdGhlICJDYyIgaGVhZGVyLiAgVGhpcyBtZXRob2QgbWF5IGJlCisgICAqIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKyAgICoKKyAgICogQHBhcmFtIGNjIHRoZSBjYyBhZGRyZXNzCisgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUncyBhbnkgcHJvYmxlbSByZXBvcnRlZCBieSB0aGUgbWFpbCBzZXJ2ZXIKKyAgICovCisgIHB1YmxpYyB2b2lkIGNjKFN0cmluZyBjYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzZW5kUmNwdChjYyk7CisgICAgdGhpcy5jYy5hZGRFbGVtZW50KGNjKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSBiY2MgYWRkcmVzcy4gIERvZXMgTk9UIHNldCBhbnkgaGVhZGVyIHNpbmNlIGl0J3MgYSAqYmxpbmQqIGNvcHkuCisgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisgICAqCisgICAqIEBwYXJhbSBiY2MgdGhlIGJjYyBhZGRyZXNzCisgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUncyBhbnkgcHJvYmxlbSByZXBvcnRlZCBieSB0aGUgbWFpbCBzZXJ2ZXIKKyAgICovCisgIHB1YmxpYyB2b2lkIGJjYyhTdHJpbmcgYmNjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHNlbmRSY3B0KGJjYyk7CisgICAgLy8gTm8gbmVlZCB0byBrZWVwIHRyYWNrIG9mIEJjYydkIGFkZHJlc3NlcworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHN1YmplY3Qgb2YgdGhlIG1haWwgbWVzc2FnZS4gIEFjdHVhbGx5IHNldHMgdGhlICJTdWJqZWN0IgorICAgKiBoZWFkZXIuCisgICAqIEBwYXJhbSBzdWJqIHRoZSBzdWJqZWN0IG9mIHRoZSBtYWlsIG1lc3NhZ2UKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFN1YmplY3QoU3RyaW5nIHN1YmopIHsKKyAgICBzZXRIZWFkZXIoIlN1YmplY3QiLCBzdWJqKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSBuYW1lZCBoZWFkZXIgdG8gdGhlIGdpdmVuIHZhbHVlLiAgUkZDIDgyMiBwcm92aWRlcyB0aGUgcnVsZXMgZm9yCisgICAqIHdoYXQgdGV4dCBtYXkgY29uc3RpdHV0ZSBhIGhlYWRlciBuYW1lIGFuZCB2YWx1ZS4KKyAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgaGVhZGVyCisgICAqIEBwYXJhbSB2YWx1ZSBjb250ZW50cyBvZiB0aGUgaGVhZGVyCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgIC8vIEJsaW5kbHkgdHJ1c3QgdGhlIHVzZXIgZG9lc24ndCBzZXQgYW55IGludmFsaWQgaGVhZGVycworICAgIGhlYWRlcnNLZXlzLmFkZChuYW1lKTsKKyAgICBoZWFkZXJzVmFsdWVzLmFkZCh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIFByaW50U3RyZWFtIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCisgICAqIEEgc3RyZWFtIGlzIHVzZWQgc2luY2UgZW1haWwgYm9kaWVzIGFyZSBieXRlLW9yaWVudGVkLiAgQSB3cml0ZXIgY2FuCisgICAqIGJlIHdyYXBwZWQgb24gdG9wIGlmIG5lY2Vzc2FyeSBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCisgICAqIFRoaXMgaXMgYWN0dWFsbHkgZG9uZSBpbiBNZXNzYWdlLmphdmEKKyAgICoKKyAgICogQHJldHVybiBhIHByaW50c3RyZWFtIGNvbnRhaW5pbmcgdGhlIGRhdGEgYW5kIHRoZSBoZWFkZXJzIG9mIHRoZSBlbWFpbAorICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVwb3J0ZWQgYnkgdGhlIG1haWwgc2VydmVyCisgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuTWVzc2FnZQorICAgKi8KKyAgcHVibGljIFByaW50U3RyZWFtIGdldFByaW50U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzZXRGcm9tSGVhZGVyKCk7CisgICAgc2V0UmVwbHlUb0hlYWRlcigpOworICAgIHNldFRvSGVhZGVyKCk7CisgICAgc2V0Q2NIZWFkZXIoKTsKKyAgICBzZXRIZWFkZXIoIlgtTWFpbGVyIiwgIm9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZSAoYW50LmFwYWNoZS5vcmcpIik7CisgICAgc2VuZERhdGEoKTsKKyAgICBmbHVzaEhlYWRlcnMoKTsKKyAgICByZXR1cm4gb3V0OworICB9CisKKworICAvLyBSRkMgODIyIHM0LjE6ICJGcm9tOiIgaGVhZGVyIG11c3QgYmUgc2VudAorICAvLyBXZSByZWx5IG9uIGVycm9yIGNoZWNraW5nIGJ5IHRoZSBNVEEKKyAgdm9pZCBzZXRGcm9tSGVhZGVyKCkgeworICAgIHNldEhlYWRlcigiRnJvbSIsIGZyb20pOworICB9CisKKyAgLy8gUkZDIDgyMiBzNC4xOiAiUmVwbHktVG86IiBoZWFkZXIgaXMgb3B0aW9uYWwKKyAgdm9pZCBzZXRSZXBseVRvSGVhZGVyKCkgeworICAgIGlmICghcmVwbHl0by5pc0VtcHR5KCkpIHsKKyAgICAgIHNldEhlYWRlcigiUmVwbHktVG8iLCB2ZWN0b3JUb0xpc3QocmVwbHl0bykpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0VG9IZWFkZXIoKSB7CisgICAgaWYgKCF0by5pc0VtcHR5KCkpIHsKKyAgICAgIHNldEhlYWRlcigiVG8iLCB2ZWN0b3JUb0xpc3QodG8pKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldENjSGVhZGVyKCkgeworICAgIGlmICghY2MuaXNFbXB0eSgpKSB7CisgICAgICBzZXRIZWFkZXIoIkNjIiwgdmVjdG9yVG9MaXN0KGNjKSk7CisgICAgfQorICB9CisKKyAgU3RyaW5nIHZlY3RvclRvTGlzdChWZWN0b3IgdikgeworICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgRW51bWVyYXRpb24gZSA9IHYuZWxlbWVudHMoKTsKKyAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgYnVmLmFwcGVuZChlLm5leHRFbGVtZW50KCkpOworICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICB9CisKKyAgdm9pZCBmbHVzaEhlYWRlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIFJGQyA4MjIgczQuMToKKyAgICAvLyAgICJIZWFkZXIgZmllbGRzIGFyZSBOT1QgcmVxdWlyZWQgdG8gb2NjdXIgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXIsCisgICAgLy8gICAgZXhjZXB0IHRoYXQgdGhlIG1lc3NhZ2UgYm9keSBNVVNUIG9jY3VyIEFGVEVSIHRoZSBoZWFkZXJzIgorICAgIC8vICh0aGUgc2FtZSBzZWN0aW9uIHNwZWNpZmllcyBhIHJlY2NvbW1lbmRlZCBvcmRlciwgd2hpY2ggd2UgaWdub3JlKQorICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJzS2V5cy5zaXplKCk7IGkrKykgeworICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBoZWFkZXJzS2V5cy5lbGVtZW50QXQoaSk7CisgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBoZWFkZXJzVmFsdWVzLmVsZW1lbnRBdChpKTsKKyAgICAgIG91dC5wcmludGxuKG5hbWUgKyAiOiAiICsgdmFsdWUpOworICAgIH0KKyAgICBvdXQucHJpbnRsbigpOworICAgIG91dC5mbHVzaCgpOworICB9CisKKyAgLyoqCisgICAqIFNlbmRzIHRoZSBtZXNzYWdlIGFuZCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4KKyAgICogVGhlIE1haWxNZXNzYWdlIG9iamVjdCBjYW5ub3QgYmUgcmV1c2VkLgorICAgKgorICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVwb3J0ZWQgYnkgdGhlIG1haWwgc2VydmVyCisgICAqLworICBwdWJsaWMgdm9pZCBzZW5kQW5kQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgICBzZW5kRG90KCk7CisgICAgICAgICAgc2VuZFF1aXQoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgZGlzY29ubmVjdCgpOworICAgICAgfQorICB9CisKKyAgLy8gTWFrZSBhIGxpbWl0ZWQgYXR0ZW1wdCB0byBleHRyYWN0IGEgc2FuaXRpemVkIGVtYWlsIGFkZHJlc3MKKyAgLy8gUHJlZmVyIHRleHQgaW4gPGJyYWNrZXRzPiwgaWdub3JlIGFueXRoaW5nIGluIChwYXJlbnRoZXNlcykKKyAgc3RhdGljIFN0cmluZyBzYW5pdGl6ZUFkZHJlc3MoU3RyaW5nIHMpIHsKKyAgICBpbnQgcGFyYW1EZXB0aCA9IDA7CisgICAgaW50IHN0YXJ0ID0gMDsKKyAgICBpbnQgZW5kID0gMDsKKyAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgaWYgKGMgPT0gJygnKSB7CisgICAgICAgIHBhcmFtRGVwdGgrKzsKKyAgICAgICAgaWYgKHN0YXJ0ID09IDApIHsKKyAgICAgICAgICBlbmQgPSBpOyAgLy8gc3VwcG9ydCAiYWRkcmVzcyAobmFtZSkiCisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKScpIHsKKyAgICAgICAgcGFyYW1EZXB0aC0tOworICAgICAgICBpZiAoZW5kID09IDApIHsKKyAgICAgICAgICBzdGFydCA9IGkgKyAxOyAgLy8gc3VwcG9ydCAiKG5hbWUpIGFkZHJlc3MiCisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocGFyYW1EZXB0aCA9PSAwICYmIGMgPT0gJzwnKSB7CisgICAgICAgIHN0YXJ0ID0gaSArIDE7CisgICAgICB9IGVsc2UgaWYgKHBhcmFtRGVwdGggPT0gMCAmJiBjID09ICc+JykgeworICAgICAgICBlbmQgPSBpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChlbmQgPT0gMCkgeworICAgICAgZW5kID0gbGVuOworICAgIH0KKworICAgIHJldHVybiBzLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKKyAgfQorCisgIC8vICogKiAqICogKiBSYXcgcHJvdG9jb2wgbWV0aG9kcyBiZWxvdyBoZXJlICogKiAqICogKgorCisgIHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc29ja2V0ID0gbmV3IFNvY2tldChob3N0LCBwb3J0KTsKKyAgICBvdXQgPSBuZXcgTWFpbFByaW50U3RyZWFtKAorICAgICAgICAgIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKKyAgICAgICAgICBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpKTsKKyAgICBpbiA9IG5ldyBTbXRwUmVzcG9uc2VSZWFkZXIoc29ja2V0LmdldElucHV0U3RyZWFtKCkpOworICAgIGdldFJlYWR5KCk7CisgIH0KKworICB2b2lkIGdldFJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgcmVzcG9uc2UgPSBpbi5nZXRSZXNwb25zZSgpOworICAgIGludFtdIG9rID0ge09LX1JFQURZfTsKKyAgICBpZiAoIWlzUmVzcG9uc2VPSyhyZXNwb25zZSwgb2spKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICJEaWRuJ3QgZ2V0IGludHJvZHVjdGlvbiBmcm9tIHNlcnZlcjogIiArIHJlc3BvbnNlKTsKKyAgICB9CisgIH0KKyAgdm9pZCBzZW5kSGVsbygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGxvY2FsID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKTsKKyAgICBpbnRbXSBvayA9IHtPS19IRUxPfTsKKyAgICBzZW5kKCJIRUxPICIgKyBsb2NhbCwgb2spOworICB9CisgIHZvaWQgc2VuZEZyb20oU3RyaW5nIGZyb20pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50W10gb2sgPSB7T0tfRlJPTX07CisgICAgc2VuZCgiTUFJTCBGUk9NOiAiICsgIjwiICsgc2FuaXRpemVBZGRyZXNzKGZyb20pICsgIj4iLCBvayk7CisgIH0KKyAgdm9pZCBzZW5kUmNwdChTdHJpbmcgcmNwdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnRbXSBvayA9IHtPS19SQ1BUXzEsIE9LX1JDUFRfMn07CisgICAgc2VuZCgiUkNQVCBUTzogIiArICI8IiArIHNhbml0aXplQWRkcmVzcyhyY3B0KSArICI+Iiwgb2spOworICB9CisKKyAgdm9pZCBzZW5kRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50W10gb2sgPSB7T0tfREFUQX07CisgICAgc2VuZCgiREFUQSIsIG9rKTsKKyAgfQorCisgIHZvaWQgc2VuZERvdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaW50W10gb2sgPSB7T0tfRE9UfTsKKyAgICBzZW5kKCJcclxuLiIsIG9rKTsgIC8vIG1ha2Ugc3VyZSBkb3QgaXMgb24gbmV3IGxpbmUKKyAgfQorCisgICAgdm9pZCBzZW5kUXVpdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludFtdIG9rID0ge09LX1FVSVR9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VuZCgiUVVJVCIsIG9rKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9ySW5RdWl0RXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZW5kKFN0cmluZyBtc2csIGludFtdIG9rKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQucmF3UHJpbnQobXNnICsgIlxyXG4iKTsgIC8vIHJhdyBzdXBwb3J0cyA8Q1JMRj4uPENSTEY+CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGluLmdldFJlc3BvbnNlKCk7CisgICAgICAgIGlmICghaXNSZXNwb25zZU9LKHJlc3BvbnNlLCBvaykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCByZXBseSB0byBjb21tYW5kOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cgKyAiOiAiICsgcmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgIGJvb2xlYW4gaXNSZXNwb25zZU9LKFN0cmluZyByZXNwb25zZSwgaW50W10gb2spIHsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSByZXNwb25zZSBpcyBvbmUgb2YgdGhlIHZhbGlkIGNvZGVzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvay5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKHJlc3BvbnNlLnN0YXJ0c1dpdGgoIiIgKyBva1tpXSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBUaGlzIFByaW50U3RyZWFtIHN1YmNsYXNzIG1ha2VzIHN1cmUgdGhhdCA8Q1JMRj4uIGJlY29tZXMgPENSTEY+Li4KKyAqICBwZXIgUkZDIDgyMS4gIEl0IGFsc28gZW5zdXJlcyB0aGF0IG5ldyBsaW5lcyBhcmUgYWx3YXlzIFxyXG4uCisqLworY2xhc3MgTWFpbFByaW50U3RyZWFtIGV4dGVuZHMgUHJpbnRTdHJlYW0geworCisgIHByaXZhdGUgaW50IGxhc3RDaGFyOworCisgIHB1YmxpYyBNYWlsUHJpbnRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgeworICAgIHN1cGVyKG91dCwgdHJ1ZSk7ICAvLyBkZXByZWNhdGVkLCBidXQgZW1haWwgaXMgYnl0ZS1vcmllbnRlZAorICB9CisKKyAgLy8gTWFjIGRvZXMgXG5cciwgYnV0IHRoYXQncyB0b3VnaCB0byBkaXN0aW5ndWlzaCBmcm9tIFdpbmRvd3MgXHJcblxyXG4uCisgIC8vIERvbid0IHRhY2tsZSB0aGF0IHByb2JsZW0gcmlnaHQgbm93LgorICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgeworICAgIGlmIChiID09ICdcbicgJiYgbGFzdENoYXIgIT0gJ1xyJykgeworICAgICAgcmF3V3JpdGUoJ1xyJyk7ICAvLyBlbnN1cmUgYWx3YXlzIFxyXG4KKyAgICAgIHJhd1dyaXRlKGIpOworICAgIH0gZWxzZSBpZiAoYiA9PSAnLicgJiYgbGFzdENoYXIgPT0gJ1xuJykgeworICAgICAgcmF3V3JpdGUoJy4nKTsgIC8vIGFkZCBleHRyYSBkb3QKKyAgICAgIHJhd1dyaXRlKGIpOworICAgIH0gZWxzZSB7CisgICAgICByYXdXcml0ZShiKTsKKyAgICB9CisgICAgbGFzdENoYXIgPSBiOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIHdyaXRlKGJ1ZltvZmYgKyBpXSk7CisgICAgfQorICB9CisKKyAgdm9pZCByYXdXcml0ZShpbnQgYikgeworICAgIHN1cGVyLndyaXRlKGIpOworICB9CisKKyAgdm9pZCByYXdQcmludChTdHJpbmcgcykgeworICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIHJhd1dyaXRlKHMuY2hhckF0KGkpKTsKKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL1NtdHBSZXNwb25zZVJlYWRlci5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL1NtdHBSZXNwb25zZVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNTJlYzgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL21haWwvU210cFJlc3BvbnNlUmVhZGVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLm1haWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworCisvKioKKyAqIEEgd3JhcHBlciBhcm91bmQgdGhlIHJhdyBpbnB1dCBmcm9tIHRoZSBTTVRQIHNlcnZlciB0aGF0IGFzc2VtYmxlcworICogbXVsdGkgbGluZSByZXNwb25zZXMgaW50byBhIHNpbmdsZSBTdHJpbmcuCisgKgorICogPHA+VGhlIHNhbWUgcnVsZXMgdXNlZCBoZXJlIHdvdWxkIGFwcGx5IHRvIEZUUCBhbmQgb3RoZXIgVGVsbmV0CisgKiBiYXNlZCBwcm90b2NvbHMgYXMgd2VsbC48L3A+CisgKgorICovCitwdWJsaWMgY2xhc3MgU210cFJlc3BvbnNlUmVhZGVyIHsKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgLyoqCisgICAgICogV3JhcCB0aGlzIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gaW4gdGhlIHN0cmVhbSB0byB3cmFwLgorICAgICAqLworICAgIHB1YmxpYyBTbXRwUmVzcG9uc2VSZWFkZXIoSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdW50aWwgdGhlIHNlcnZlciBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzcG9uc2UgaXMgY29tcGxldGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlc3BvbnNlY29kZSAoMyBkaWdpdHMpICsgQmxhbmsgKyBUZXh0IGZyb20gYWxsCisgICAgICogICAgICAgICByZXNwb25zZSBsaW5lIGNvbmNhdGVuYXRlZCAod2l0aCBibGFua3MgcmVwbGFjaW5nIHRoZSBcclxuCisgICAgICogICAgICAgICBzZXF1ZW5jZXMpLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlc3VsdC5zZXRMZW5ndGgoMCk7CisgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgIGlmIChsaW5lICE9IG51bGwgJiYgbGluZS5sZW5ndGgoKSA+PSAzKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDAsIDMpKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisKKyAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgaWYgKCFoYXNNb3JlTGluZXMobGluZSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCkudHJpbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSBleHBlY3QgbW9yZSBpbnB1dD8KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgbGluZXMgdG8gY2hlY2suCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTW9yZUxpbmVzKFN0cmluZyBsaW5lKSB7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCgpID4gMyAmJiBsaW5lLmNoYXJBdCgzKSA9PSAnLSc7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGhlIHRleHQgZnJvbSB0aGlzIGxpbmUgb2YgdGhlIHJlc29uc2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgbGluZSkgeworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDQpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZS5zdWJzdHJpbmcoNCkpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJCdWZmZXIuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGJjMzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJCdWZmZXIuamF2YQpAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogVGhpcyBwYWNrYWdlIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgVGltb3RoeSBHZXJhcmQgRW5kcmVzCisgKiAodGltZUBpY2UuY29tKSB0byB3aG9tIHRoZSBBbnQgcHJvamVjdCBpcyB2ZXJ5IGdyYXRlZnVsIGZvciBoaXMgZ3JlYXQgY29kZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMudGFyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVGhlIFRhckJ1ZmZlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSB0YXIgYXJjaGl2ZSBjb25jZXB0CisgKiBvZiBhIGJ1ZmZlcmVkIGlucHV0IHN0cmVhbS4gVGhpcyBjb25jZXB0IGdvZXMgYmFjayB0byB0aGUKKyAqIGRheXMgb2YgYmxvY2tlZCB0YXBlIGRyaXZlcyBhbmQgc3BlY2lhbCBpbyBkZXZpY2VzLiBJbiB0aGUKKyAqIEphdmEgdW5pdmVyc2UsIHRoZSBvbmx5IHJlYWwgZnVuY3Rpb24gdGhhdCB0aGlzIGNsYXNzCisgKiBwZXJmb3JtcyBpcyB0byBlbnN1cmUgdGhhdCBmaWxlcyBoYXZlIHRoZSBjb3JyZWN0ICJibG9jayIKKyAqIHNpemUsIG9yIG90aGVyIHRhcnMgd2lsbCBjb21wbGFpbi4KKyAqIDxwPgorICogWW91IHNob3VsZCBuZXZlciBoYXZlIGEgbmVlZCB0byBhY2Nlc3MgdGhpcyBjbGFzcyBkaXJlY3RseS4KKyAqIFRhckJ1ZmZlcnMgYXJlIGNyZWF0ZWQgYnkgVGFyIElPIFN0cmVhbXMuCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBUYXJCdWZmZXIgeworCisgICAgLyoqIERlZmF1bHQgcmVjb3JkIHNpemUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JDRFNJWkUgPSAoNTEyKTsKKworICAgIC8qKiBEZWZhdWx0IGJsb2NrIHNpemUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JMS1NJWkUgPSAoREVGQVVMVF9SQ0RTSVpFICogMjApOworCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSAgICAgaW5TdHJlYW07CisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gICAgb3V0U3RyZWFtOworICAgIHByaXZhdGUgYnl0ZVtdICAgICAgICAgIGJsb2NrQnVmZmVyOworICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgIGN1cnJCbGtJZHg7CisgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgY3VyclJlY0lkeDsKKyAgICBwcml2YXRlIGludCAgICAgICAgICAgICBibG9ja1NpemU7CisgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgcmVjb3JkU2l6ZTsKKyAgICBwcml2YXRlIGludCAgICAgICAgICAgICByZWNzUGVyQmxvY2s7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgZGVidWc7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBUYXJCdWZmZXIgb24gYW4gaW5wdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBpblN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBUYXJCdWZmZXIoSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHsKKyAgICAgICAgdGhpcyhpblN0cmVhbSwgVGFyQnVmZmVyLkRFRkFVTFRfQkxLU0laRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIGEgVGFyQnVmZmVyIG9uIGFuIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gaW5TdHJlYW0gdGhlIGlucHV0IHN0cmVhbSB0byB1c2UKKyAgICAgKiBAcGFyYW0gYmxvY2tTaXplIHRoZSBibG9jayBzaXplIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBUYXJCdWZmZXIoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIGludCBibG9ja1NpemUpIHsKKyAgICAgICAgdGhpcyhpblN0cmVhbSwgYmxvY2tTaXplLCBUYXJCdWZmZXIuREVGQVVMVF9SQ0RTSVpFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBUYXJCdWZmZXIgb24gYW4gaW5wdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBpblN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtIHRvIHVzZQorICAgICAqIEBwYXJhbSBibG9ja1NpemUgdGhlIGJsb2NrIHNpemUgdG8gdXNlCisgICAgICogQHBhcmFtIHJlY29yZFNpemUgdGhlIHJlY29yZCBzaXplIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBUYXJCdWZmZXIoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIGludCBibG9ja1NpemUsIGludCByZWNvcmRTaXplKSB7CisgICAgICAgIHRoaXMuaW5TdHJlYW0gPSBpblN0cmVhbTsKKyAgICAgICAgdGhpcy5vdXRTdHJlYW0gPSBudWxsOworCisgICAgICAgIHRoaXMuaW5pdGlhbGl6ZShibG9ja1NpemUsIHJlY29yZFNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBhIFRhckJ1ZmZlciBvbiBhbiBvdXRwdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBvdXRTdHJlYW0gdGhlIG91dHB1dCBzdHJlYW0gdG8gdXNlCisgICAgICovCisgICAgcHVibGljIFRhckJ1ZmZlcihPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKSB7CisgICAgICAgIHRoaXMob3V0U3RyZWFtLCBUYXJCdWZmZXIuREVGQVVMVF9CTEtTSVpFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBUYXJCdWZmZXIgb24gYW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gb3V0U3RyZWFtIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHVzZQorICAgICAqIEBwYXJhbSBibG9ja1NpemUgdGhlIGJsb2NrIHNpemUgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIFRhckJ1ZmZlcihPdXRwdXRTdHJlYW0gb3V0U3RyZWFtLCBpbnQgYmxvY2tTaXplKSB7CisgICAgICAgIHRoaXMob3V0U3RyZWFtLCBibG9ja1NpemUsIFRhckJ1ZmZlci5ERUZBVUxUX1JDRFNJWkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBhIFRhckJ1ZmZlciBvbiBhbiBvdXRwdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBvdXRTdHJlYW0gdGhlIG91dHB1dCBzdHJlYW0gdG8gdXNlCisgICAgICogQHBhcmFtIGJsb2NrU2l6ZSB0aGUgYmxvY2sgc2l6ZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gcmVjb3JkU2l6ZSB0aGUgcmVjb3JkIHNpemUgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIFRhckJ1ZmZlcihPdXRwdXRTdHJlYW0gb3V0U3RyZWFtLCBpbnQgYmxvY2tTaXplLCBpbnQgcmVjb3JkU2l6ZSkgeworICAgICAgICB0aGlzLmluU3RyZWFtID0gbnVsbDsKKyAgICAgICAgdGhpcy5vdXRTdHJlYW0gPSBvdXRTdHJlYW07CisKKyAgICAgICAgdGhpcy5pbml0aWFsaXplKGJsb2NrU2l6ZSwgcmVjb3JkU2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6YXRpb24gY29tbW9uIHRvIGFsbCBjb25zdHJ1Y3RvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoaW50IGJsb2NrU2l6ZSwgaW50IHJlY29yZFNpemUpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGZhbHNlOworICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKKyAgICAgICAgdGhpcy5yZWNvcmRTaXplID0gcmVjb3JkU2l6ZTsKKyAgICAgICAgdGhpcy5yZWNzUGVyQmxvY2sgPSAodGhpcy5ibG9ja1NpemUgLyB0aGlzLnJlY29yZFNpemUpOworICAgICAgICB0aGlzLmJsb2NrQnVmZmVyID0gbmV3IGJ5dGVbdGhpcy5ibG9ja1NpemVdOworCisgICAgICAgIGlmICh0aGlzLmluU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY3VyckJsa0lkeCA9IC0xOworICAgICAgICAgICAgdGhpcy5jdXJyUmVjSWR4ID0gdGhpcy5yZWNzUGVyQmxvY2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmN1cnJCbGtJZHggPSAwOworICAgICAgICAgICAgdGhpcy5jdXJyUmVjSWR4ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgVEFSIEJ1ZmZlcidzIGJsb2NrIHNpemUuIEJsb2NrcyBjb25zaXN0IG9mIG11bHRpcGxlIHJlY29yZHMuCisgICAgICogQHJldHVybiB0aGUgYmxvY2sgc2l6ZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QmxvY2tTaXplKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ibG9ja1NpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBUQVIgQnVmZmVyJ3MgcmVjb3JkIHNpemUuCisgICAgICogQHJldHVybiB0aGUgcmVjb3JkIHNpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlY29yZFNpemUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlY29yZFNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWJ1Z2dpbmcgZmxhZyBmb3IgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWJ1ZyBJZiB0cnVlLCBwcmludCBkZWJ1Z2dpbmcgb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSBpZiBhbiBhcmNoaXZlIHJlY29yZCBpbmRpY2F0ZSBFbmQgb2YgQXJjaGl2ZS4gRW5kIG9mCisgICAgICogYXJjaGl2ZSBpcyBpbmRpY2F0ZWQgYnkgYSByZWNvcmQgdGhhdCBjb25zaXN0cyBlbnRpcmVseSBvZiBudWxsIGJ5dGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY29yZCBUaGUgcmVjb3JkIGRhdGEgdG8gY2hlY2suCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNvcmQgZGF0YSBpcyBhbiBFbmQgb2YgQXJjaGl2ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRU9GUmVjb3JkKGJ5dGVbXSByZWNvcmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gZ2V0UmVjb3JkU2l6ZSgpOyBpIDwgc3o7ICsraSkgeworICAgICAgICAgICAgaWYgKHJlY29yZFtpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2tpcCBvdmVyIGEgcmVjb3JkIG9uIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNraXBSZWNvcmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2tpcFJlY29yZDogcmVjSWR4ID0gIiArIGN1cnJSZWNJZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmxrSWR4ID0gIiArIGN1cnJCbGtJZHgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluU3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigicmVhZGluZyAodmlhIHNraXApIGZyb20gYW4gb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJSZWNJZHggPj0gcmVjc1BlckJsb2NrKSB7CisgICAgICAgICAgICBpZiAoIXJlYWRCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAvLyBVTkRPTkUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN1cnJSZWNJZHgrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgcmVjb3JkIGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIHRoZSBkYXRhLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcmVjb3JkIGRhdGEuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gcmVhZFJlY29yZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJSZWFkUmVjb3JkOiByZWNJZHggPSAiICsgY3VyclJlY0lkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBibGtJZHggPSAiICsgY3VyckJsa0lkeCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5TdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJyZWFkaW5nIGZyb20gYW4gb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJSZWNJZHggPj0gcmVjc1BlckJsb2NrKSB7CisgICAgICAgICAgICBpZiAoIXJlYWRCbG9jaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbcmVjb3JkU2l6ZV07CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShibG9ja0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY3VyclJlY0lkeCAqIHJlY29yZFNpemUpLCByZXN1bHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkU2l6ZSk7CisKKyAgICAgICAgY3VyclJlY0lkeCsrOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBmYWxzZSBpZiBFbmQtT2YtRmlsZSwgZWxzZSB0cnVlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlYWRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJSZWFkQmxvY2s6IGJsa0lkeCA9ICIgKyBjdXJyQmxrSWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpblN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlYWRpbmcgZnJvbSBhbiBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIH0KKworICAgICAgICBjdXJyUmVjSWR4ID0gMDsKKworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IGJ5dGVzTmVlZGVkID0gYmxvY2tTaXplOworCisgICAgICAgIHdoaWxlIChieXRlc05lZWRlZCA+IDApIHsKKyAgICAgICAgICAgIGxvbmcgbnVtQnl0ZXMgPSBpblN0cmVhbS5yZWFkKGJsb2NrQnVmZmVyLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTmVlZGVkKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5PVEUKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgZml0IEVPRiwgYW5kIHRoZSBibG9jayBpcyBub3QgZnVsbCEKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgYnJva2VuIGFyY2hpdmUuIEl0IGRvZXMgbm90IGZvbGxvdyB0aGUgc3RhbmRhcmQKKyAgICAgICAgICAgIC8vIGJsb2NraW5nIGFsZ29yaXRobS4gSG93ZXZlciwgYmVjYXVzZSB3ZSBhcmUgZ2VuZXJvdXMsIGFuZAorICAgICAgICAgICAgLy8gaXQgcmVxdWlyZXMgbGl0dGxlIGVmZm9ydCwgd2Ugd2lsbCBzaW1wbHkgaWdub3JlIHRoZSBlcnJvcgorICAgICAgICAgICAgLy8gYW5kIGNvbnRpbnVlIGFzIGlmIHRoZSBlbnRpcmUgYmxvY2sgd2VyZSByZWFkLiBUaGlzIGRvZXMKKyAgICAgICAgICAgIC8vIG5vdCBhcHBlYXIgdG8gYnJlYWsgYW55dGhpbmcgdXBzdHJlYW0uIFdlIHVzZWQgdG8gcmV0dXJuCisgICAgICAgICAgICAvLyBmYWxzZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhhbmtzIHRvICdZb2hhbm4uUm91c3NlbEBhbGNhdGVsLmZyJyBmb3IgdGhpcyBmaXguCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKG51bUJ5dGVzID09IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGRvIG5vdCByZWFkIGdpZ2FieXRlcyBvZiB6ZXJvcworICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYSBjb3JydXB0IHRhciBmaWxlLgorICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zOTkyNAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGp1c3QgbGVhdmluZyB0aGUgdW5yZWFkIHBvcnRpb24gb2YgdGhlIGJ1ZmZlciBkaXJ0eSBkb2VzCisgICAgICAgICAgICAgICAgLy8gY2F1c2UgcHJvYmxlbXMgaW4gc29tZSBjYXNlcy4gIFRoaXMgcHJvYmxlbSBpcyBkZXNjcmliZWQgaW4KKyAgICAgICAgICAgICAgICAvLyBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI5ODc3CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGUgc29sdXRpb24gaXMgdG8gZmlsbCB0aGUgdW51c2VkIHBvcnRpb24gb2YgdGhlIGJ1ZmZlciB3aXRoIHplcm9zLgorCisgICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwoYmxvY2tCdWZmZXIsIG9mZnNldCwgb2Zmc2V0ICsgYnl0ZXNOZWVkZWQsIChieXRlKSAwKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgKz0gbnVtQnl0ZXM7CisgICAgICAgICAgICBieXRlc05lZWRlZCAtPSBudW1CeXRlczsKKworICAgICAgICAgICAgaWYgKG51bUJ5dGVzICE9IGJsb2NrU2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlJlYWRCbG9jazogSU5DT01QTEVURSBSRUFEICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbnVtQnl0ZXMgKyAiIG9mICIgKyBibG9ja1NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBieXRlcyByZWFkLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN1cnJCbGtJZHgrKzsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYmxvY2sgbnVtYmVyLCB6ZXJvIGJhc2VkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCB6ZXJvIGJhc2VkIGJsb2NrIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRCbG9ja051bSgpIHsKKyAgICAgICAgcmV0dXJuIGN1cnJCbGtJZHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHJlY29yZCBudW1iZXIsIHdpdGhpbiB0aGUgY3VycmVudCBibG9jaywgemVybyBiYXNlZC4KKyAgICAgKiBUaHVzLCBjdXJyZW50IG9mZnNldCA9IChjdXJyZW50QmxvY2tOdW0gKiByZWNzUGVyQmxrKSArIGN1cnJlbnRSZWNOdW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHplcm8gYmFzZWQgcmVjb3JkIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRSZWNvcmROdW0oKSB7CisgICAgICAgIHJldHVybiBjdXJyUmVjSWR4IC0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBhcmNoaXZlIHJlY29yZCB0byB0aGUgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNvcmQgVGhlIHJlY29yZCBkYXRhIHRvIHdyaXRlIHRvIHRoZSBhcmNoaXZlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVJlY29yZChieXRlW10gcmVjb3JkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV3JpdGVSZWNvcmQ6IHJlY0lkeCA9ICIgKyBjdXJyUmVjSWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJsa0lkeCA9ICIgKyBjdXJyQmxrSWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ3cml0aW5nIHRvIGFuIGlucHV0IGJ1ZmZlciIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlY29yZC5sZW5ndGggIT0gcmVjb3JkU2l6ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJyZWNvcmQgdG8gd3JpdGUgaGFzIGxlbmd0aCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVjb3JkLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgd2hpY2ggaXMgbm90IHRoZSByZWNvcmQgc2l6ZSBvZiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVjb3JkU2l6ZSArICInIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyclJlY0lkeCA+PSByZWNzUGVyQmxvY2spIHsKKyAgICAgICAgICAgIHdyaXRlQmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVjb3JkLCAwLCBibG9ja0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY3VyclJlY0lkeCAqIHJlY29yZFNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFNpemUpOworCisgICAgICAgIGN1cnJSZWNJZHgrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBhcmNoaXZlIHJlY29yZCB0byB0aGUgYXJjaGl2ZSwgd2hlcmUgdGhlIHJlY29yZCBtYXkgYmUKKyAgICAgKiBpbnNpZGUgb2YgYSBsYXJnZXIgYXJyYXkgYnVmZmVyLiBUaGUgYnVmZmVyIG11c3QgYmUgIm9mZnNldCBwbHVzCisgICAgICogcmVjb3JkIHNpemUiIGxvbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgcmVjb3JkIGRhdGEgdG8gd3JpdGUuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSByZWNvcmQgZGF0YSB3aXRoaW4gYnVmLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVJlY29yZChieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV3JpdGVSZWNvcmQ6IHJlY0lkeCA9ICIgKyBjdXJyUmVjSWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJsa0lkeCA9ICIgKyBjdXJyQmxrSWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ3cml0aW5nIHRvIGFuIGlucHV0IGJ1ZmZlciIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChvZmZzZXQgKyByZWNvcmRTaXplKSA+IGJ1Zi5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigicmVjb3JkIGhhcyBsZW5ndGggJyIgKyBidWYubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyB3aXRoIG9mZnNldCAnIiArIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgd2hpY2ggaXMgbGVzcyB0aGFuIHRoZSByZWNvcmQgc2l6ZSBvZiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVjb3JkU2l6ZSArICInIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyclJlY0lkeCA+PSByZWNzUGVyQmxvY2spIHsKKyAgICAgICAgICAgIHdyaXRlQmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCBvZmZzZXQsIGJsb2NrQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyUmVjSWR4ICogcmVjb3JkU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkU2l6ZSk7CisKKyAgICAgICAgY3VyclJlY0lkeCsrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgVGFyQnVmZmVyIGJsb2NrIHRvIHRoZSBhcmNoaXZlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZUJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldyaXRlQmxvY2s6IGJsa0lkeCA9ICIgKyBjdXJyQmxrSWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ3cml0aW5nIHRvIGFuIGlucHV0IGJ1ZmZlciIpOworICAgICAgICB9CisKKyAgICAgICAgb3V0U3RyZWFtLndyaXRlKGJsb2NrQnVmZmVyLCAwLCBibG9ja1NpemUpOworICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKKworICAgICAgICBjdXJyUmVjSWR4ID0gMDsKKyAgICAgICAgY3VyckJsa0lkeCsrOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBjdXJyZW50IGRhdGEgYmxvY2sgaWYgaXQgaGFzIGFueSBkYXRhIGluIGl0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmbHVzaEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRhckJ1ZmZlci5mbHVzaEJsb2NrKCkgY2FsbGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIndyaXRpbmcgdG8gYW4gaW5wdXQgYnVmZmVyIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyclJlY0lkeCA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlQmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBUYXJCdWZmZXIuIElmIHRoaXMgaXMgYW4gb3V0cHV0IGJ1ZmZlciwgYWxzbyBmbHVzaCB0aGUKKyAgICAgKiBjdXJyZW50IGJsb2NrIGJlZm9yZSBjbG9zaW5nLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUYXJCdWZmZXIuY2xvc2VCdWZmZXIoKS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgZmx1c2hCbG9jaygpOworCisgICAgICAgICAgICBpZiAob3V0U3RyZWFtICE9IFN5c3RlbS5vdXQKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0U3RyZWFtICE9IFN5c3RlbS5lcnIpIHsKKyAgICAgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIG91dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaW5TdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGluU3RyZWFtICE9IFN5c3RlbS5pbikgeworICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICBpblN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJDb25zdGFudHMuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTVkNjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogVGhpcyBwYWNrYWdlIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgVGltb3RoeSBHZXJhcmQgRW5kcmVzCisgKiAodGltZUBpY2UuY29tKSB0byB3aG9tIHRoZSBBbnQgcHJvamVjdCBpcyB2ZXJ5IGdyYXRlZnVsIGZvciBoaXMgZ3JlYXQgY29kZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMudGFyOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGFsbCB0aGUgZGVmaW5pdGlvbnMgdXNlZCBpbiB0aGUgcGFja2FnZS4KKyAqCisgKi8KKy8vIENoZWNrU3R5bGU6SW50ZXJmYWNlSXNUeXBlQ2hlY2sgT0ZGIChiYykKK3B1YmxpYyBpbnRlcmZhY2UgVGFyQ29uc3RhbnRzIHsKKworICAgIC8qKgorICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIG5hbWUgZmllbGQgaW4gYSBoZWFkZXIgYnVmZmVyLgorICAgICAqLworICAgIGludCAgICBOQU1FTEVOID0gMTAwOworCisgICAgLyoqCisgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgbW9kZSBmaWVsZCBpbiBhIGhlYWRlciBidWZmZXIuCisgICAgICovCisgICAgaW50ICAgIE1PREVMRU4gPSA4OworCisgICAgLyoqCisgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgdXNlciBpZCBmaWVsZCBpbiBhIGhlYWRlciBidWZmZXIuCisgICAgICovCisgICAgaW50ICAgIFVJRExFTiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBncm91cCBpZCBmaWVsZCBpbiBhIGhlYWRlciBidWZmZXIuCisgICAgICovCisgICAgaW50ICAgIEdJRExFTiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBjaGVja3N1bSBmaWVsZCBpbiBhIGhlYWRlciBidWZmZXIuCisgICAgICovCisgICAgaW50ICAgIENIS1NVTUxFTiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzaXplIGZpZWxkIGluIGEgaGVhZGVyIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBpbnQgICAgU0laRUxFTiA9IDEyOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gc2l6ZSBvZiBhIGZpbGUgaW4gYSB0YXIgYXJjaGl2ZSAoVGhhdCdzIDExIHNldmVucywgb2N0YWwpLgorICAgICAqLworICAgIGxvbmcgICBNQVhTSVpFID0gMDc3Nzc3Nzc3Nzc3TDsKKworICAgIC8qKgorICAgICAqIFRoZSBsZW5ndGggb2YgdGhlIG1hZ2ljIGZpZWxkIGluIGEgaGVhZGVyIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBpbnQgICAgTUFHSUNMRU4gPSA4OworCisgICAgLyoqCisgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgZmllbGQgaW4gYSBoZWFkZXIgYnVmZmVyLgorICAgICAqLworICAgIGludCAgICBNT0RUSU1FTEVOID0gMTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSB1c2VyIG5hbWUgZmllbGQgaW4gYSBoZWFkZXIgYnVmZmVyLgorICAgICAqLworICAgIGludCAgICBVTkFNRUxFTiA9IDMyOworCisgICAgLyoqCisgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgZ3JvdXAgbmFtZSBmaWVsZCBpbiBhIGhlYWRlciBidWZmZXIuCisgICAgICovCisgICAgaW50ICAgIEdOQU1FTEVOID0gMzI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBkZXZpY2VzIGZpZWxkIGluIGEgaGVhZGVyIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBpbnQgICAgREVWTEVOID0gODsKKworICAgIC8qKgorICAgICAqIExGXyBjb25zdGFudHMgcmVwcmVzZW50IHRoZSAibGluayBmbGFnIiBvZiBhbiBlbnRyeSwgb3IgbW9yZSBjb21tb25seSwKKyAgICAgKiB0aGUgImVudHJ5IHR5cGUiLiBUaGlzIGlzIHRoZSAib2xkIHdheSIgb2YgaW5kaWNhdGluZyBhIG5vcm1hbCBmaWxlLgorICAgICAqLworICAgIGJ5dGUgICBMRl9PTEROT1JNID0gMDsKKworICAgIC8qKgorICAgICAqIE5vcm1hbCBmaWxlIHR5cGUuCisgICAgICovCisgICAgYnl0ZSAgIExGX05PUk1BTCA9IChieXRlKSAnMCc7CisKKyAgICAvKioKKyAgICAgKiBMaW5rIGZpbGUgdHlwZS4KKyAgICAgKi8KKyAgICBieXRlICAgTEZfTElOSyA9IChieXRlKSAnMSc7CisKKyAgICAvKioKKyAgICAgKiBTeW1ib2xpYyBsaW5rIGZpbGUgdHlwZS4KKyAgICAgKi8KKyAgICBieXRlICAgTEZfU1lNTElOSyA9IChieXRlKSAnMic7CisKKyAgICAvKioKKyAgICAgKiBDaGFyYWN0ZXIgZGV2aWNlIGZpbGUgdHlwZS4KKyAgICAgKi8KKyAgICBieXRlICAgTEZfQ0hSID0gKGJ5dGUpICczJzsKKworICAgIC8qKgorICAgICAqIEJsb2NrIGRldmljZSBmaWxlIHR5cGUuCisgICAgICovCisgICAgYnl0ZSAgIExGX0JMSyA9IChieXRlKSAnNCc7CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3RvcnkgZmlsZSB0eXBlLgorICAgICAqLworICAgIGJ5dGUgICBMRl9ESVIgPSAoYnl0ZSkgJzUnOworCisgICAgLyoqCisgICAgICogRklGTyAocGlwZSkgZmlsZSB0eXBlLgorICAgICAqLworICAgIGJ5dGUgICBMRl9GSUZPID0gKGJ5dGUpICc2JzsKKworICAgIC8qKgorICAgICAqIENvbnRpZ3VvdXMgZmlsZSB0eXBlLgorICAgICAqLworICAgIGJ5dGUgICBMRl9DT05USUcgPSAoYnl0ZSkgJzcnOworCisgICAgLyoqCisgICAgICogVGhlIG1hZ2ljIHRhZyByZXByZXNlbnRpbmcgYSBQT1NJWCB0YXIgYXJjaGl2ZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgVE1BR0lDID0gInVzdGFyIjsKKworICAgIC8qKgorICAgICAqIFRoZSBtYWdpYyB0YWcgcmVwcmVzZW50aW5nIGEgR05VIHRhciBhcmNoaXZlLgorICAgICAqLworICAgIFN0cmluZyBHTlVfVE1BR0lDID0gInVzdGFyICAiOworCisgICAgLyoqCisgICAgICogVGhlIG5hbXIgb2YgdGhlIEdOVSB0YXIgZW50cnkgd2hpY2ggY29udGFpbnMgYSBsb25nIG5hbWUuCisgICAgICovCisgICAgU3RyaW5nIEdOVV9MT05HTElOSyA9ICIuLy4vQExvbmdMaW5rIjsKKworICAgIC8qKgorICAgICAqIElkZW50aWZpZXMgdGhlICpuZXh0KiBmaWxlIG9uIHRoZSB0YXBlIGFzIGhhdmluZyBhIGxvbmcgbmFtZS4KKyAgICAgKi8KKyAgICBieXRlIExGX0dOVVRZUEVfTE9OR05BTUUgPSAoYnl0ZSkgJ0wnOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyRW50cnkuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiNWI2NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckVudHJ5LmphdmEKQEAgLTAsMCArMSw2MzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgcGFja2FnZSBpcyBiYXNlZCBvbiB0aGUgd29yayBkb25lIGJ5IFRpbW90aHkgR2VyYXJkIEVuZHJlcworICogKHRpbWVAaWNlLmNvbSkgdG8gd2hvbSB0aGUgQW50IHByb2plY3QgaXMgdmVyeSBncmF0ZWZ1bCBmb3IgaGlzIGdyZWF0IGNvZGUuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnRhcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBlbnRyeSBpbiBhIFRhciBhcmNoaXZlLiBJdCBjb25zaXN0cworICogb2YgdGhlIGVudHJ5J3MgaGVhZGVyLCBhcyB3ZWxsIGFzIHRoZSBlbnRyeSdzIEZpbGUuIEVudHJpZXMKKyAqIGNhbiBiZSBpbnN0YW50aWF0ZWQgaW4gb25lIG9mIHRocmVlIHdheXMsIGRlcGVuZGluZyBvbiBob3cKKyAqIHRoZXkgYXJlIHRvIGJlIHVzZWQuCisgKiA8cD4KKyAqIFRhckVudHJpZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHRoZSBoZWFkZXIgYnl0ZXMgcmVhZCBmcm9tCisgKiBhbiBhcmNoaXZlIGFyZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgVGFyRW50cnkoIGJ5dGVbXSApCisgKiBjb25zdHJ1Y3Rvci4gVGhlc2UgZW50cmllcyB3aWxsIGJlIHVzZWQgd2hlbiBleHRyYWN0aW5nIGZyb20KKyAqIG9yIGxpc3RpbmcgdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUuIFRoZXNlIGVudHJpZXMgaGF2ZSB0aGVpcgorICogaGVhZGVyIGZpbGxlZCBpbiB1c2luZyB0aGUgaGVhZGVyIGJ5dGVzLiBUaGV5IGFsc28gc2V0IHRoZSBGaWxlCisgKiB0byBudWxsLCBzaW5jZSB0aGV5IHJlZmVyZW5jZSBhbiBhcmNoaXZlIGVudHJ5IG5vdCBhIGZpbGUuCisgKiA8cD4KKyAqIFRhckVudHJpZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIEZpbGVzIHRoYXQgYXJlIHRvIGJlIHdyaXR0ZW4KKyAqIGludG8gYW4gYXJjaGl2ZSBhcmUgaW5zdGFudGlhdGVkIHdpdGggdGhlIFRhckVudHJ5KCBGaWxlICkKKyAqIGNvbnN0cnVjdG9yLiBUaGVzZSBlbnRyaWVzIGhhdmUgdGhlaXIgaGVhZGVyIGZpbGxlZCBpbiB1c2luZworICogdGhlIEZpbGUncyBpbmZvcm1hdGlvbi4gVGhleSBhbHNvIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIEZpbGUKKyAqIGZvciBjb252ZW5pZW5jZSB3aGVuIHdyaXRpbmcgZW50cmllcy4KKyAqIDxwPgorICogRmluYWxseSwgVGFyRW50cmllcyBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBub3RoaW5nIGJ1dCBhIG5hbWUuCisgKiBUaGlzIGFsbG93cyB0aGUgcHJvZ3JhbW1lciB0byBjb25zdHJ1Y3QgdGhlIGVudHJ5IGJ5IGhhbmQsIGZvcgorICogaW5zdGFuY2Ugd2hlbiBvbmx5IGFuIElucHV0U3RyZWFtIGlzIGF2YWlsYWJsZSBmb3Igd3JpdGluZyB0bworICogdGhlIGFyY2hpdmUsIGFuZCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIGNvbnN0cnVjdGVkIGZyb20KKyAqIG90aGVyIGluZm9ybWF0aW9uLiBJbiB0aGlzIGNhc2UgdGhlIGhlYWRlciBmaWVsZHMgYXJlIHNldCB0bworICogZGVmYXVsdHMgYW5kIHRoZSBGaWxlIGlzIHNldCB0byBudWxsLgorICoKKyAqIDxwPgorICogVGhlIEMgc3RydWN0dXJlIGZvciBhIFRhciBFbnRyeSdzIGhlYWRlciBpczoKKyAqIDxwcmU+CisgKiBzdHJ1Y3QgaGVhZGVyIHsKKyAqIGNoYXIgbmFtZVtOQU1TSVpdOworICogY2hhciBtb2RlWzhdOworICogY2hhciB1aWRbOF07CisgKiBjaGFyIGdpZFs4XTsKKyAqIGNoYXIgc2l6ZVsxMl07CisgKiBjaGFyIG10aW1lWzEyXTsKKyAqIGNoYXIgY2hrc3VtWzhdOworICogY2hhciBsaW5rZmxhZzsKKyAqIGNoYXIgbGlua25hbWVbTkFNU0laXTsKKyAqIGNoYXIgbWFnaWNbOF07CisgKiBjaGFyIHVuYW1lW1RVTk1MRU5dOworICogY2hhciBnbmFtZVtUR05NTEVOXTsKKyAqIGNoYXIgZGV2bWFqb3JbOF07CisgKiBjaGFyIGRldm1pbm9yWzhdOworICogfSBoZWFkZXI7CisgKiA8L3ByZT4KKyAqCisgKi8KKworcHVibGljIGNsYXNzIFRhckVudHJ5IGltcGxlbWVudHMgVGFyQ29uc3RhbnRzIHsKKyAgICAvKiogVGhlIGVudHJ5J3MgbmFtZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBuYW1lOworCisgICAgLyoqIFRoZSBlbnRyeSdzIHBlcm1pc3Npb24gbW9kZS4gKi8KKyAgICBwcml2YXRlIGludCBtb2RlOworCisgICAgLyoqIFRoZSBlbnRyeSdzIHVzZXIgaWQuICovCisgICAgcHJpdmF0ZSBpbnQgdXNlcklkOworCisgICAgLyoqIFRoZSBlbnRyeSdzIGdyb3VwIGlkLiAqLworICAgIHByaXZhdGUgaW50IGdyb3VwSWQ7CisKKyAgICAvKiogVGhlIGVudHJ5J3Mgc2l6ZS4gKi8KKyAgICBwcml2YXRlIGxvbmcgc2l6ZTsKKworICAgIC8qKiBUaGUgZW50cnkncyBtb2RpZmljYXRpb24gdGltZS4gKi8KKyAgICBwcml2YXRlIGxvbmcgbW9kVGltZTsKKworICAgIC8qKiBUaGUgZW50cnkncyBsaW5rIGZsYWcuICovCisgICAgcHJpdmF0ZSBieXRlIGxpbmtGbGFnOworCisgICAgLyoqIFRoZSBlbnRyeSdzIGxpbmsgbmFtZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBsaW5rTmFtZTsKKworICAgIC8qKiBUaGUgZW50cnkncyBtYWdpYyB0YWcuICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbWFnaWM7CisKKyAgICAvKiogVGhlIGVudHJ5J3MgdXNlciBuYW1lLiAqLworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHVzZXJOYW1lOworCisgICAgLyoqIFRoZSBlbnRyeSdzIGdyb3VwIG5hbWUuICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZ3JvdXBOYW1lOworCisgICAgLyoqIFRoZSBlbnRyeSdzIG1ham9yIGRldmljZSBudW1iZXIuICovCisgICAgcHJpdmF0ZSBpbnQgZGV2TWFqb3I7CisKKyAgICAvKiogVGhlIGVudHJ5J3MgbWlub3IgZGV2aWNlIG51bWJlci4gKi8KKyAgICBwcml2YXRlIGludCBkZXZNaW5vcjsKKworICAgIC8qKiBUaGUgZW50cnkncyBmaWxlIHJlZmVyZW5jZSAqLworICAgIHByaXZhdGUgRmlsZSBmaWxlOworCisgICAgLyoqIE1heGltdW0gbGVuZ3RoIG9mIGEgdXNlcidzIG5hbWUgaW4gdGhlIHRhciBmaWxlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05BTUVMRU4gPSAzMTsKKworICAgIC8qKiBEZWZhdWx0IHBlcm1pc3Npb25zIGJpdHMgZm9yIGRpcmVjdG9yaWVzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ESVJfTU9ERSA9IDA0MDc1NTsKKworICAgIC8qKiBEZWZhdWx0IHBlcm1pc3Npb25zIGJpdHMgZm9yIGZpbGVzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9GSUxFX01PREUgPSAwMTAwNjQ0OworCisgICAgLyoqIENvbnZlcnQgbWlsbGlzIHRvIHNlY29uZHMgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSUxMSVNfUEVSX1NFQ09ORCA9IDEwMDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgZW50cnkgYW5kIHByZXBhcmVzIHRoZSBoZWFkZXIgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgVGFyRW50cnkgKCkgeworICAgICAgICB0aGlzLm1hZ2ljID0gbmV3IFN0cmluZ0J1ZmZlcihUTUFHSUMpOworICAgICAgICB0aGlzLm5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHRoaXMubGlua05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgU3RyaW5nIHVzZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIsICIiKTsKKworICAgICAgICBpZiAodXNlci5sZW5ndGgoKSA+IE1BWF9OQU1FTEVOKSB7CisgICAgICAgICAgICB1c2VyID0gdXNlci5zdWJzdHJpbmcoMCwgTUFYX05BTUVMRU4pOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy51c2VySWQgPSAwOworICAgICAgICB0aGlzLmdyb3VwSWQgPSAwOworICAgICAgICB0aGlzLnVzZXJOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcih1c2VyKTsKKyAgICAgICAgdGhpcy5ncm91cE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgdGhpcy5maWxlID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gZW50cnkgd2l0aCBvbmx5IGEgbmFtZS4gVGhpcyBhbGxvd3MgdGhlIHByb2dyYW1tZXIKKyAgICAgKiB0byBjb25zdHJ1Y3QgdGhlIGVudHJ5J3MgaGVhZGVyICJieSBoYW5kIi4gRmlsZSBpcyBzZXQgdG8gbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBlbnRyeSBuYW1lCisgICAgICovCisgICAgcHVibGljIFRhckVudHJ5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMoKTsKKworICAgICAgICBib29sZWFuIGlzRGlyID0gbmFtZS5lbmRzV2l0aCgiLyIpOworCisgICAgICAgIHRoaXMuZGV2TWFqb3IgPSAwOworICAgICAgICB0aGlzLmRldk1pbm9yID0gMDsKKyAgICAgICAgdGhpcy5uYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsKKyAgICAgICAgdGhpcy5tb2RlID0gaXNEaXIgPyBERUZBVUxUX0RJUl9NT0RFIDogREVGQVVMVF9GSUxFX01PREU7CisgICAgICAgIHRoaXMubGlua0ZsYWcgPSBpc0RpciA/IExGX0RJUiA6IExGX05PUk1BTDsKKyAgICAgICAgdGhpcy51c2VySWQgPSAwOworICAgICAgICB0aGlzLmdyb3VwSWQgPSAwOworICAgICAgICB0aGlzLnNpemUgPSAwOworICAgICAgICB0aGlzLm1vZFRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gTUlMTElTX1BFUl9TRUNPTkQ7CisgICAgICAgIHRoaXMubGlua05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgdGhpcy51c2VyTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICB0aGlzLmdyb3VwTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICB0aGlzLmRldk1ham9yID0gMDsKKyAgICAgICAgdGhpcy5kZXZNaW5vciA9IDA7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gZW50cnkgd2l0aCBhIG5hbWUgYW5kIGEgbGluayBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGVudHJ5IG5hbWUKKyAgICAgKiBAcGFyYW0gbGlua0ZsYWcgdGhlIGVudHJ5IGxpbmsgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFyRW50cnkoU3RyaW5nIG5hbWUsIGJ5dGUgbGlua0ZsYWcpIHsKKyAgICAgICAgdGhpcyhuYW1lKTsKKyAgICAgICAgdGhpcy5saW5rRmxhZyA9IGxpbmtGbGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBlbnRyeSBmb3IgYSBmaWxlLiBGaWxlIGlzIHNldCB0byBmaWxlLCBhbmQgdGhlCisgICAgICogaGVhZGVyIGlzIGNvbnN0cnVjdGVkIGZyb20gaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRoYXQgdGhlIGVudHJ5IHJlcHJlc2VudHMuCisgICAgICovCisgICAgcHVibGljIFRhckVudHJ5KEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzKCk7CisKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIG9zbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisKKyAgICAgICAgaWYgKG9zbmFtZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFN0cmlwIG9mZiBkcml2ZSBsZXR0ZXJzIQorICAgICAgICAgICAgLy8gUkVWSUVXIFdvdWxkIGEgYmV0dGVyIGNoZWNrIGJlICIoRmlsZS5zZXBhcmF0b3IgPT0gJ1wnKSI/CisKKyAgICAgICAgICAgIGlmIChvc25hbWUuc3RhcnRzV2l0aCgid2luZG93cyIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmxlbmd0aCgpID4gMikgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IGZpbGVOYW1lLmNoYXJBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjaDIgPSBmaWxlTmFtZS5jaGFyQXQoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoMiA9PSAnOicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKGNoMSA+PSAnYScgJiYgY2gxIDw9ICd6JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoMSA+PSAnQScgJiYgY2gxIDw9ICdaJykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3NuYW1lLmluZGV4T2YoIm5ldHdhcmUiKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbG9uID0gZmlsZU5hbWUuaW5kZXhPZignOicpOworICAgICAgICAgICAgICAgIGlmIChjb2xvbiAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZyhjb2xvbiArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisKKyAgICAgICAgLy8gTm8gYWJzb2x1dGUgcGF0aG5hbWVzCisgICAgICAgIC8vIFdpbmRvd3MgKGFuZCBQb3NpeD8pIHBhdGhzIGNhbiBzdGFydCB3aXRoICJcXE5ldHdvcmtEcml2ZVwiLAorICAgICAgICAvLyBzbyB3ZSBsb29wIG9uIHN0YXJ0aW5nIC8ncy4KKyAgICAgICAgd2hpbGUgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmxpbmtOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7CisgICAgICAgIHRoaXMubmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZU5hbWUpOworCisgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRoaXMubW9kZSA9IERFRkFVTFRfRElSX01PREU7CisgICAgICAgICAgICB0aGlzLmxpbmtGbGFnID0gTEZfRElSOworCisgICAgICAgICAgICBpZiAodGhpcy5uYW1lLmNoYXJBdCh0aGlzLm5hbWUubGVuZ3RoKCkgLSAxKSAhPSAnLycpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLm1vZGUgPSBERUZBVUxUX0ZJTEVfTU9ERTsKKyAgICAgICAgICAgIHRoaXMubGlua0ZsYWcgPSBMRl9OT1JNQUw7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnNpemUgPSBmaWxlLmxlbmd0aCgpOworICAgICAgICB0aGlzLm1vZFRpbWUgPSBmaWxlLmxhc3RNb2RpZmllZCgpIC8gTUlMTElTX1BFUl9TRUNPTkQ7CisgICAgICAgIHRoaXMuZGV2TWFqb3IgPSAwOworICAgICAgICB0aGlzLmRldk1pbm9yID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gZW50cnkgZnJvbSBhbiBhcmNoaXZlJ3MgaGVhZGVyIGJ5dGVzLiBGaWxlIGlzIHNldAorICAgICAqIHRvIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGVhZGVyQnVmIFRoZSBoZWFkZXIgYnl0ZXMgZnJvbSBhIHRhciBhcmNoaXZlIGVudHJ5LgorICAgICAqLworICAgIHB1YmxpYyBUYXJFbnRyeShieXRlW10gaGVhZGVyQnVmKSB7CisgICAgICAgIHRoaXMoKTsKKyAgICAgICAgcGFyc2VUYXJIZWFkZXIoaGVhZGVyQnVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIHR3byBlbnRyaWVzIGFyZSBlcXVhbC4gRXF1YWxpdHkgaXMgZGV0ZXJtaW5lZAorICAgICAqIGJ5IHRoZSBoZWFkZXIgbmFtZXMgYmVpbmcgZXF1YWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXQgRW50cnkgdG8gYmUgY2hlY2tlZCBmb3IgZXF1YWxpdHkuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBlbnRyaWVzIGFyZSBlcXVhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVGFyRW50cnkgaXQpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMoaXQuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIHR3byBlbnRyaWVzIGFyZSBlcXVhbC4gRXF1YWxpdHkgaXMgZGV0ZXJtaW5lZAorICAgICAqIGJ5IHRoZSBoZWFkZXIgbmFtZXMgYmVpbmcgZXF1YWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXQgRW50cnkgdG8gYmUgY2hlY2tlZCBmb3IgZXF1YWxpdHkuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBlbnRyaWVzIGFyZSBlcXVhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGl0KSB7CisgICAgICAgIGlmIChpdCA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gaXQuZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcXVhbHMoKFRhckVudHJ5KSBpdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFzaGNvZGVzIGFyZSBiYXNlZCBvbiBlbnRyeSBuYW1lcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGVudHJ5IGhhc2hjb2RlCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gZW50cnkgaXMgYSBkZXNjZW5kYW50IG9mIHRoaXMgZW50cnkuCisgICAgICogRGVzY2VuZGFuY3kgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbmFtZSBvZiB0aGUgZGVzY2VuZGFudAorICAgICAqIHN0YXJ0aW5nIHdpdGggdGhpcyBlbnRyeSdzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzYyBFbnRyeSB0byBiZSBjaGVja2VkIGFzIGEgZGVzY2VuZGVudCBvZiB0aGlzLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBlbnRyeSBpcyBhIGRlc2NlbmRhbnQgb2YgdGhpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc2NlbmRlbnQoVGFyRW50cnkgZGVzYykgeworICAgICAgICByZXR1cm4gZGVzYy5nZXROYW1lKCkuc3RhcnRzV2l0aChnZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGlzIGVudHJ5J3MgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGVudHJ5J3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoaXMgZW50cnkncyBuZXcgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtb2RlIGZvciB0aGlzIGVudHJ5CisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSB0aGUgbW9kZSBmb3IgdGhpcyBlbnRyeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhpcyBlbnRyeSdzIGxpbmsgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIGxpbmsgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExpbmtOYW1lKCkgeworICAgICAgICByZXR1cm4gbGlua05hbWUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhpcyBlbnRyeSdzIHVzZXIgaWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoaXMgZW50cnkncyB1c2VyIGlkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VXNlcklkKCkgeworICAgICAgICByZXR1cm4gdXNlcklkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGVudHJ5J3MgdXNlciBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VySWQgVGhpcyBlbnRyeSdzIG5ldyB1c2VyIGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJJZChpbnQgdXNlcklkKSB7CisgICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGlzIGVudHJ5J3MgZ3JvdXAgaWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoaXMgZW50cnkncyBncm91cCBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEdyb3VwSWQoKSB7CisgICAgICAgIHJldHVybiBncm91cElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGVudHJ5J3MgZ3JvdXAgaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXBJZCBUaGlzIGVudHJ5J3MgbmV3IGdyb3VwIGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwSWQoaW50IGdyb3VwSWQpIHsKKyAgICAgICAgdGhpcy5ncm91cElkID0gZ3JvdXBJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhpcyBlbnRyeSdzIHVzZXIgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gdXNlck5hbWUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhpcyBlbnRyeSdzIHVzZXIgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyTmFtZSBUaGlzIGVudHJ5J3MgbmV3IHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyTmFtZShTdHJpbmcgdXNlck5hbWUpIHsKKyAgICAgICAgdGhpcy51c2VyTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIodXNlck5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGlzIGVudHJ5J3MgZ3JvdXAgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIGdyb3VwIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRHcm91cE5hbWUoKSB7CisgICAgICAgIHJldHVybiBncm91cE5hbWUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhpcyBlbnRyeSdzIGdyb3VwIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIFRoaXMgZW50cnkncyBuZXcgZ3JvdXAgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHcm91cE5hbWUoU3RyaW5nIGdyb3VwTmFtZSkgeworICAgICAgICB0aGlzLmdyb3VwTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZ3JvdXBOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IHRoaXMgZW50cnkncyBncm91cCBhbmQgdXNlciBpZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcklkIFRoaXMgZW50cnkncyBuZXcgdXNlciBpZC4KKyAgICAgKiBAcGFyYW0gZ3JvdXBJZCBUaGlzIGVudHJ5J3MgbmV3IGdyb3VwIGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkcyhpbnQgdXNlcklkLCBpbnQgZ3JvdXBJZCkgeworICAgICAgICBzZXRVc2VySWQodXNlcklkKTsKKyAgICAgICAgc2V0R3JvdXBJZChncm91cElkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IHRoaXMgZW50cnkncyBncm91cCBhbmQgdXNlciBuYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyTmFtZSBUaGlzIGVudHJ5J3MgbmV3IHVzZXIgbmFtZS4KKyAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIFRoaXMgZW50cnkncyBuZXcgZ3JvdXAgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lcyhTdHJpbmcgdXNlck5hbWUsIFN0cmluZyBncm91cE5hbWUpIHsKKyAgICAgICAgc2V0VXNlck5hbWUodXNlck5hbWUpOworICAgICAgICBzZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhpcyBlbnRyeSdzIG1vZGlmaWNhdGlvbiB0aW1lLiBUaGUgcGFyYW1ldGVyIHBhc3NlZAorICAgICAqIHRvIHRoaXMgbWV0aG9kIGlzIGluICJKYXZhIHRpbWUiLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWUgVGhpcyBlbnRyeSdzIG5ldyBtb2RpZmljYXRpb24gdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RUaW1lKGxvbmcgdGltZSkgeworICAgICAgICBtb2RUaW1lID0gdGltZSAvIE1JTExJU19QRVJfU0VDT05EOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGVudHJ5J3MgbW9kaWZpY2F0aW9uIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZSBUaGlzIGVudHJ5J3MgbmV3IG1vZGlmaWNhdGlvbiB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vZFRpbWUoRGF0ZSB0aW1lKSB7CisgICAgICAgIG1vZFRpbWUgPSB0aW1lLmdldFRpbWUoKSAvIE1JTExJU19QRVJfU0VDT05EOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGVudHJ5J3MgbW9kaWZpY2F0aW9uIHRpbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRpbWUgVGhpcyBlbnRyeSdzIG5ldyBtb2RpZmljYXRpb24gdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXRNb2RUaW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IERhdGUobW9kVGltZSAqIE1JTExJU19QRVJfU0VDT05EKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhpcyBlbnRyeSdzIGZpbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoaXMgZW50cnkncyBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGlzIGVudHJ5J3MgbW9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIG1vZGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNb2RlKCkgeworICAgICAgICByZXR1cm4gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhpcyBlbnRyeSdzIGZpbGUgc2l6ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIGZpbGUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhpcyBlbnRyeSdzIGZpbGUgc2l6ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIFRoaXMgZW50cnkncyBuZXcgZmlsZSBzaXplLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNpemUobG9uZyBzaXplKSB7CisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSBpZiB0aGlzIGVudHJ5IGlzIGEgR05VIGxvbmcgbmFtZSBibG9jaworICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBsb25nIG5hbWUgZXh0ZW5zaW9uIHByb3ZpZGVkIGJ5IEdOVSB0YXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0dOVUxvbmdOYW1lRW50cnkoKSB7CisgICAgICAgIHJldHVybiBsaW5rRmxhZyA9PSBMRl9HTlVUWVBFX0xPTkdOQU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuYW1lLnRvU3RyaW5nKCkuZXF1YWxzKEdOVV9MT05HTElOSyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoaXMgZW50cnkgcmVwcmVzZW50cyBhIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGVudHJ5IGlzIGEgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgeworICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpbmtGbGFnID09IExGX0RJUikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0TmFtZSgpLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgZW50cnkgcmVwcmVzZW50cyBhIGZpbGUsIGFuZCB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSwgcmV0dXJuCisgICAgICogYW4gYXJyYXkgb2YgVGFyRW50cmllcyBmb3IgdGhpcyBlbnRyeSdzIGNoaWxkcmVuLgorICAgICAqCisgICAgICogQHJldHVybiBBbiBhcnJheSBvZiBUYXJFbnRyeSdzIGZvciB0aGlzIGVudHJ5J3MgY2hpbGRyZW4uCisgICAgICovCisgICAgcHVibGljIFRhckVudHJ5W10gZ2V0RGlyZWN0b3J5RW50cmllcygpIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRhckVudHJ5WzBdOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gICBsaXN0ID0gZmlsZS5saXN0KCk7CisgICAgICAgIFRhckVudHJ5W10gcmVzdWx0ID0gbmV3IFRhckVudHJ5W2xpc3QubGVuZ3RoXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ldyBUYXJFbnRyeShuZXcgRmlsZShmaWxlLCBsaXN0W2ldKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGVudHJ5J3MgaGVhZGVyIGluZm9ybWF0aW9uIHRvIGEgaGVhZGVyIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRidWYgVGhlIHRhciBlbnRyeSBoZWFkZXIgYnVmZmVyIHRvIGZpbGwgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVFbnRyeUhlYWRlcihieXRlW10gb3V0YnVmKSB7CisgICAgICAgIGludCBvZmZzZXQgPSAwOworCisgICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldE5hbWVCeXRlcyhuYW1lLCBvdXRidWYsIG9mZnNldCwgTkFNRUxFTik7CisgICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldE9jdGFsQnl0ZXMobW9kZSwgb3V0YnVmLCBvZmZzZXQsIE1PREVMRU4pOworICAgICAgICBvZmZzZXQgPSBUYXJVdGlscy5nZXRPY3RhbEJ5dGVzKHVzZXJJZCwgb3V0YnVmLCBvZmZzZXQsIFVJRExFTik7CisgICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldE9jdGFsQnl0ZXMoZ3JvdXBJZCwgb3V0YnVmLCBvZmZzZXQsIEdJRExFTik7CisgICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldExvbmdPY3RhbEJ5dGVzKHNpemUsIG91dGJ1Ziwgb2Zmc2V0LCBTSVpFTEVOKTsKKyAgICAgICAgb2Zmc2V0ID0gVGFyVXRpbHMuZ2V0TG9uZ09jdGFsQnl0ZXMobW9kVGltZSwgb3V0YnVmLCBvZmZzZXQsIE1PRFRJTUVMRU4pOworCisgICAgICAgIGludCBjc09mZnNldCA9IG9mZnNldDsKKworICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IENIS1NVTUxFTjsgKytjKSB7CisgICAgICAgICAgICBvdXRidWZbb2Zmc2V0KytdID0gKGJ5dGUpICcgJzsKKyAgICAgICAgfQorCisgICAgICAgIG91dGJ1ZltvZmZzZXQrK10gPSBsaW5rRmxhZzsKKyAgICAgICAgb2Zmc2V0ID0gVGFyVXRpbHMuZ2V0TmFtZUJ5dGVzKGxpbmtOYW1lLCBvdXRidWYsIG9mZnNldCwgTkFNRUxFTik7CisgICAgICAgIG9mZnNldCA9IFRhclV0aWxzLmdldE5hbWVCeXRlcyhtYWdpYywgb3V0YnVmLCBvZmZzZXQsIE1BR0lDTEVOKTsKKyAgICAgICAgb2Zmc2V0ID0gVGFyVXRpbHMuZ2V0TmFtZUJ5dGVzKHVzZXJOYW1lLCBvdXRidWYsIG9mZnNldCwgVU5BTUVMRU4pOworICAgICAgICBvZmZzZXQgPSBUYXJVdGlscy5nZXROYW1lQnl0ZXMoZ3JvdXBOYW1lLCBvdXRidWYsIG9mZnNldCwgR05BTUVMRU4pOworICAgICAgICBvZmZzZXQgPSBUYXJVdGlscy5nZXRPY3RhbEJ5dGVzKGRldk1ham9yLCBvdXRidWYsIG9mZnNldCwgREVWTEVOKTsKKyAgICAgICAgb2Zmc2V0ID0gVGFyVXRpbHMuZ2V0T2N0YWxCeXRlcyhkZXZNaW5vciwgb3V0YnVmLCBvZmZzZXQsIERFVkxFTik7CisKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IG91dGJ1Zi5sZW5ndGgpIHsKKyAgICAgICAgICAgIG91dGJ1ZltvZmZzZXQrK10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBjaGsgPSBUYXJVdGlscy5jb21wdXRlQ2hlY2tTdW0ob3V0YnVmKTsKKworICAgICAgICBUYXJVdGlscy5nZXRDaGVja1N1bU9jdGFsQnl0ZXMoY2hrLCBvdXRidWYsIGNzT2Zmc2V0LCBDSEtTVU1MRU4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGFuIGVudHJ5J3MgaGVhZGVyIGluZm9ybWF0aW9uIGZyb20gYSBoZWFkZXIgYnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgdGFyIGVudHJ5IGhlYWRlciBidWZmZXIgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFyc2VUYXJIZWFkZXIoYnl0ZVtdIGhlYWRlcikgeworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKworICAgICAgICBuYW1lID0gVGFyVXRpbHMucGFyc2VOYW1lKGhlYWRlciwgb2Zmc2V0LCBOQU1FTEVOKTsKKyAgICAgICAgb2Zmc2V0ICs9IE5BTUVMRU47CisgICAgICAgIG1vZGUgPSAoaW50KSBUYXJVdGlscy5wYXJzZU9jdGFsKGhlYWRlciwgb2Zmc2V0LCBNT0RFTEVOKTsKKyAgICAgICAgb2Zmc2V0ICs9IE1PREVMRU47CisgICAgICAgIHVzZXJJZCA9IChpbnQpIFRhclV0aWxzLnBhcnNlT2N0YWwoaGVhZGVyLCBvZmZzZXQsIFVJRExFTik7CisgICAgICAgIG9mZnNldCArPSBVSURMRU47CisgICAgICAgIGdyb3VwSWQgPSAoaW50KSBUYXJVdGlscy5wYXJzZU9jdGFsKGhlYWRlciwgb2Zmc2V0LCBHSURMRU4pOworICAgICAgICBvZmZzZXQgKz0gR0lETEVOOworICAgICAgICBzaXplID0gVGFyVXRpbHMucGFyc2VPY3RhbChoZWFkZXIsIG9mZnNldCwgU0laRUxFTik7CisgICAgICAgIG9mZnNldCArPSBTSVpFTEVOOworICAgICAgICBtb2RUaW1lID0gVGFyVXRpbHMucGFyc2VPY3RhbChoZWFkZXIsIG9mZnNldCwgTU9EVElNRUxFTik7CisgICAgICAgIG9mZnNldCArPSBNT0RUSU1FTEVOOworICAgICAgICBvZmZzZXQgKz0gQ0hLU1VNTEVOOworICAgICAgICBsaW5rRmxhZyA9IGhlYWRlcltvZmZzZXQrK107CisgICAgICAgIGxpbmtOYW1lID0gVGFyVXRpbHMucGFyc2VOYW1lKGhlYWRlciwgb2Zmc2V0LCBOQU1FTEVOKTsKKyAgICAgICAgb2Zmc2V0ICs9IE5BTUVMRU47CisgICAgICAgIG1hZ2ljID0gVGFyVXRpbHMucGFyc2VOYW1lKGhlYWRlciwgb2Zmc2V0LCBNQUdJQ0xFTik7CisgICAgICAgIG9mZnNldCArPSBNQUdJQ0xFTjsKKyAgICAgICAgdXNlck5hbWUgPSBUYXJVdGlscy5wYXJzZU5hbWUoaGVhZGVyLCBvZmZzZXQsIFVOQU1FTEVOKTsKKyAgICAgICAgb2Zmc2V0ICs9IFVOQU1FTEVOOworICAgICAgICBncm91cE5hbWUgPSBUYXJVdGlscy5wYXJzZU5hbWUoaGVhZGVyLCBvZmZzZXQsIEdOQU1FTEVOKTsKKyAgICAgICAgb2Zmc2V0ICs9IEdOQU1FTEVOOworICAgICAgICBkZXZNYWpvciA9IChpbnQpIFRhclV0aWxzLnBhcnNlT2N0YWwoaGVhZGVyLCBvZmZzZXQsIERFVkxFTik7CisgICAgICAgIG9mZnNldCArPSBERVZMRU47CisgICAgICAgIGRldk1pbm9yID0gKGludCkgVGFyVXRpbHMucGFyc2VPY3RhbChoZWFkZXIsIG9mZnNldCwgREVWTEVOKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJJbnB1dFN0cmVhbS5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFySW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTdkNmQwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFySW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogVGhpcyBwYWNrYWdlIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgVGltb3RoeSBHZXJhcmQgRW5kcmVzCisgKiAodGltZUBpY2UuY29tKSB0byB3aG9tIHRoZSBBbnQgcHJvamVjdCBpcyB2ZXJ5IGdyYXRlZnVsIGZvciBoaXMgZ3JlYXQgY29kZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMudGFyOworCitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogVGhlIFRhcklucHV0U3RyZWFtIHJlYWRzIGEgVU5JWCB0YXIgYXJjaGl2ZSBhcyBhbiBJbnB1dFN0cmVhbS4KKyAqIG1ldGhvZHMgYXJlIHByb3ZpZGVkIHRvIHBvc2l0aW9uIGF0IGVhY2ggc3VjY2Vzc2l2ZSBlbnRyeSBpbgorICogdGhlIGFyY2hpdmUsIGFuZCB0aGUgcmVhZCBlYWNoIGVudHJ5IGFzIGEgbm9ybWFsIGlucHV0IHN0cmVhbQorICogdXNpbmcgcmVhZCgpLgorICoKKyAqLworcHVibGljIGNsYXNzIFRhcklucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTUFMTF9CVUZGRVJfU0laRSA9IDI1NjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA4ICogMTAyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfQlVGRkVSX1NJWkUgPSAzMiAqIDEwMjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfTUFTSyA9IDB4RkY7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBib29sZWFuIGRlYnVnOworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0hpdEVPRjsKKyAgICBwcm90ZWN0ZWQgbG9uZyBlbnRyeVNpemU7CisgICAgcHJvdGVjdGVkIGxvbmcgZW50cnlPZmZzZXQ7CisgICAgcHJvdGVjdGVkIGJ5dGVbXSByZWFkQnVmOworICAgIHByb3RlY3RlZCBUYXJCdWZmZXIgYnVmZmVyOworICAgIHByb3RlY3RlZCBUYXJFbnRyeSBjdXJyRW50cnk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgaXMgbm90IHVzZWQgYXQgYWxsIGluIHRoaXMgY2xhc3MsCisgICAgICogaXQgaXMgb25seSBoZXJlIHRvIGF2b2lkIHJlcHJlYXRlZCBvYmplY3QgY3JlYXRpb24gZHVyaW5nIGNhbGxzCisgICAgICogdG8gdGhlIG5vLWFyZyByZWFkIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIG9uZUJ1ZjsKKworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFySW5wdXRTdHJlYW0uCisgICAgICogQHBhcmFtIGlzIHRoZSBpbnB1dCBzdHJlYW0gdG8gdXNlCisgICAgICovCisgICAgcHVibGljIFRhcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB7CisgICAgICAgIHRoaXMoaXMsIFRhckJ1ZmZlci5ERUZBVUxUX0JMS1NJWkUsIFRhckJ1ZmZlci5ERUZBVUxUX1JDRFNJWkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBUYXJJbnB1dFN0cmVhbS4KKyAgICAgKiBAcGFyYW0gaXMgdGhlIGlucHV0IHN0cmVhbSB0byB1c2UKKyAgICAgKiBAcGFyYW0gYmxvY2tTaXplIHRoZSBibG9jayBzaXplIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBUYXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcywgaW50IGJsb2NrU2l6ZSkgeworICAgICAgICB0aGlzKGlzLCBibG9ja1NpemUsIFRhckJ1ZmZlci5ERUZBVUxUX1JDRFNJWkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBUYXJJbnB1dFN0cmVhbS4KKyAgICAgKiBAcGFyYW0gaXMgdGhlIGlucHV0IHN0cmVhbSB0byB1c2UKKyAgICAgKiBAcGFyYW0gYmxvY2tTaXplIHRoZSBibG9jayBzaXplIHRvIHVzZQorICAgICAqIEBwYXJhbSByZWNvcmRTaXplIHRoZSByZWNvcmQgc2l6ZSB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMsIGludCBibG9ja1NpemUsIGludCByZWNvcmRTaXplKSB7CisgICAgICAgIHN1cGVyKGlzKTsKKworICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBUYXJCdWZmZXIoaXMsIGJsb2NrU2l6ZSwgcmVjb3JkU2l6ZSk7CisgICAgICAgIHRoaXMucmVhZEJ1ZiA9IG51bGw7CisgICAgICAgIHRoaXMub25lQnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgIHRoaXMuZGVidWcgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5oYXNIaXRFT0YgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWJ1Z2dpbmcgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWJ1ZyBUcnVlIHRvIHR1cm4gb24gZGVidWdnaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgICAgICBidWZmZXIuc2V0RGVidWcoZGVidWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGlzIHN0cmVhbS4gQ2FsbHMgdGhlIFRhckJ1ZmZlcidzIGNsb3NlKCkgbWV0aG9kLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1ZmZlci5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVjb3JkIHNpemUgYmVpbmcgdXNlZCBieSB0aGlzIHN0cmVhbSdzIFRhckJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFRhckJ1ZmZlciByZWNvcmQgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlY29yZFNpemUoKSB7CisgICAgICAgIHJldHVybiBidWZmZXIuZ2V0UmVjb3JkU2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXZhaWxhYmxlIGRhdGEgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoZSBjdXJyZW50CisgICAgICogZW50cnkgaW4gdGhlIGFyY2hpdmUuIFRoaXMgZG9lcyBub3QgaW5kaWNhdGUgaG93IG11Y2ggZGF0YQorICAgICAqIGlzIGxlZnQgaW4gdGhlIGVudGlyZSBhcmNoaXZlLCBvbmx5IGluIHRoZSBjdXJyZW50IGVudHJ5LgorICAgICAqIFRoaXMgdmFsdWUgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlbnRyeSdzIHNpemUgaGVhZGVyIGZpZWxkCisgICAgICogYW5kIHRoZSBhbW91bnQgb2YgZGF0YSBhbHJlYWR5IHJlYWQgZnJvbSB0aGUgY3VycmVudCBlbnRyeS4KKyAgICAgKiBJbnRlZ2VyLk1BWF9WQUxVRSBpcyByZXR1cmVuIGluIGNhc2UgbW9yZSB0aGFuIEludGVnZXIuTUFYX1ZBTFVFCisgICAgICogYnl0ZXMgYXJlIGxlZnQgaW4gdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJ5dGVzIGZvciB0aGUgY3VycmVudCBlbnRyeS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGZvciBzaWduYXR1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlbnRyeVNpemUgLSBlbnRyeU9mZnNldCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChpbnQpIChlbnRyeVNpemUgLSBlbnRyeU9mZnNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2tpcCBieXRlcyBpbiB0aGUgaW5wdXQgYnVmZmVyLiBUaGlzIHNraXBzIGJ5dGVzIGluIHRoZQorICAgICAqIGN1cnJlbnQgZW50cnkncyBkYXRhLCBub3QgdGhlIGVudGlyZSBhcmNoaXZlLCBhbmQgd2lsbAorICAgICAqIHN0b3AgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBlbnRyeSdzIGRhdGEgaWYgdGhlIG51bWJlcgorICAgICAqIHRvIHNraXAgZXh0ZW5kcyBiZXlvbmQgdGhhdCBwb2ludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1Ub1NraXAgVGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBhY3R1YWxseSBza2lwcGVkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBudW1Ub1NraXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJFVklFVworICAgICAgICAvLyBUaGlzIGlzIGhvcnJpYmx5IGluZWZmaWNpZW50LCBidXQgaXQgZW5zdXJlcyB0aGF0IHdlCisgICAgICAgIC8vIHByb3Blcmx5IHNraXAgb3ZlciBieXRlcyB2aWEgdGhlIFRhckJ1ZmZlci4uLgorICAgICAgICAvLworICAgICAgICBieXRlW10gc2tpcEJ1ZiA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgbG9uZyBza2lwID0gbnVtVG9Ta2lwOworICAgICAgICB3aGlsZSAoc2tpcCA+IDApIHsKKyAgICAgICAgICAgIGludCByZWFsU2tpcCA9IChpbnQpIChza2lwID4gc2tpcEJ1Zi5sZW5ndGggPyBza2lwQnVmLmxlbmd0aCA6IHNraXApOworICAgICAgICAgICAgaW50IG51bVJlYWQgPSByZWFkKHNraXBCdWYsIDAsIHJlYWxTa2lwKTsKKyAgICAgICAgICAgIGlmIChudW1SZWFkID09IC0xKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwIC09IG51bVJlYWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChudW1Ub1NraXAgLSBza2lwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCBtYXJraW5nIGp1c3QgeWV0LCB3ZSByZXR1cm4gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCBtYXJraW5nIGp1c3QgeWV0LCB3ZSBkbyBub3RoaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcmtMaW1pdCBUaGUgbGltaXQgdG8gbWFyay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtYXJrKGludCBtYXJrTGltaXQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCBtYXJraW5nIGp1c3QgeWV0LCB3ZSBkbyBub3RoaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIHRhciBhcmNoaXZlLiBUaGlzIHdpbGwgc2tpcAorICAgICAqIG92ZXIgYW55IHJlbWFpbmluZyBkYXRhIGluIHRoZSBjdXJyZW50IGVudHJ5LCBpZiB0aGVyZQorICAgICAqIGlzIG9uZSwgYW5kIHBsYWNlIHRoZSBpbnB1dCBzdHJlYW0gYXQgdGhlIGhlYWRlciBvZiB0aGUKKyAgICAgKiBuZXh0IGVudHJ5LCBhbmQgcmVhZCB0aGUgaGVhZGVyIGFuZCBpbnN0YW50aWF0ZSBhIG5ldworICAgICAqIFRhckVudHJ5IGZyb20gdGhlIGhlYWRlciBieXRlcyBhbmQgcmV0dXJuIHRoYXQgZW50cnkuCisgICAgICogSWYgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcyBpbiB0aGUgYXJjaGl2ZSwgbnVsbCB3aWxsCisgICAgICogYmUgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlIGhhcworICAgICAqIGJlZW4gcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5leHQgVGFyRW50cnkgaW4gdGhlIGFyY2hpdmUsIG9yIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBUYXJFbnRyeSBnZXROZXh0RW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaGFzSGl0RU9GKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9uZyBudW1Ub1NraXAgPSBlbnRyeVNpemUgLSBlbnRyeU9mZnNldDsKKworICAgICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUYXJJbnB1dFN0cmVhbTogU0tJUCBjdXJyRU5UUlkgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY3VyckVudHJ5LmdldE5hbWUoKSArICInIFNaICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZW50cnlTaXplICsgIiBPRkYgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeU9mZnNldCArICIgIHNraXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbnVtVG9Ta2lwICsgIiBieXRlcyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobnVtVG9Ta2lwID4gMCkgeworICAgICAgICAgICAgICAgIHNraXAobnVtVG9Ta2lwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVhZEJ1ZiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gaGVhZGVyQnVmID0gYnVmZmVyLnJlYWRSZWNvcmQoKTsKKworICAgICAgICBpZiAoaGVhZGVyQnVmID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUkVBRCBOVUxMIFJFQ09SRCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFzSGl0RU9GID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXIuaXNFT0ZSZWNvcmQoaGVhZGVyQnVmKSkgeworICAgICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJSRUFEIEVPRiBSRUNPUkQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc0hpdEVPRiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFzSGl0RU9GKSB7CisgICAgICAgICAgICBjdXJyRW50cnkgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VyckVudHJ5ID0gbmV3IFRhckVudHJ5KGhlYWRlckJ1Zik7CisKKyAgICAgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGFySW5wdXRTdHJlYW06IFNFVCBDVVJSRU5UUlkgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY3VyckVudHJ5LmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBzaXplID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyRW50cnkuZ2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW50cnlPZmZzZXQgPSAwOworCisgICAgICAgICAgICBlbnRyeVNpemUgPSBjdXJyRW50cnkuZ2V0U2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJFbnRyeSAhPSBudWxsICYmIGN1cnJFbnRyeS5pc0dOVUxvbmdOYW1lRW50cnkoKSkgeworICAgICAgICAgICAgLy8gcmVhZCBpbiB0aGUgbmFtZQorICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGxvbmdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW1NNQUxMX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICAgICAgd2hpbGUgKChsZW5ndGggPSByZWFkKGJ1ZikpID49IDApIHsKKyAgICAgICAgICAgICAgICBsb25nTmFtZS5hcHBlbmQobmV3IFN0cmluZyhidWYsIDAsIGxlbmd0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0TmV4dEVudHJ5KCk7CisgICAgICAgICAgICBpZiAoY3VyckVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBCdWd6aWxsYTogNDAzMzQKKyAgICAgICAgICAgICAgICAvLyBNYWxmb3JtZWQgdGFyIGZpbGUgLSBsb25nIGVudHJ5IG5hbWUgbm90IGZvbGxvd2VkIGJ5IGVudHJ5CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgbnVsbCB0ZXJtaW5hdG9yCisgICAgICAgICAgICBpZiAobG9uZ05hbWUubGVuZ3RoKCkgPiAwCisgICAgICAgICAgICAgICAgJiYgbG9uZ05hbWUuY2hhckF0KGxvbmdOYW1lLmxlbmd0aCgpIC0gMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxvbmdOYW1lLmRlbGV0ZUNoYXJBdChsb25nTmFtZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyckVudHJ5LnNldE5hbWUobG9uZ05hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3VyckVudHJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBjdXJyZW50IHRhciBhcmNoaXZlIGVudHJ5LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgc2ltcGx5IGNhbGxzIHJlYWQoIGJ5dGVbXSwgaW50LCBpbnQgKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGJ5dGUgcmVhZCwgb3IgLTEgYXQgRU9GLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbnVtID0gcmVhZChvbmVCdWYsIDAsIDEpOworICAgICAgICByZXR1cm4gbnVtID09IC0xID8gLTEgOiAoKGludCkgb25lQnVmWzBdKSAmIEJZVEVfTUFTSzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBieXRlcyBmcm9tIHRoZSBjdXJyZW50IHRhciBhcmNoaXZlIGVudHJ5LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgYXdhcmUgb2YgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiBlbnRyeSBpbiB0aGUgYXJjaGl2ZSBhbmQgd2lsbCBkZWFsIHdpdGggdGhlbSBhcyBpZiB0aGV5CisgICAgICogd2VyZSB0aGlzIHN0cmVhbSdzIHN0YXJ0IGFuZCBFT0YuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBidWZmZXIgaW50byB3aGljaCB0byBwbGFjZSBieXRlcyByZWFkLgorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0byBwbGFjZSBieXRlcyByZWFkLgorICAgICAqIEBwYXJhbSBudW1Ub1JlYWQgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBhdCBFT0YuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbnVtVG9SZWFkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgdG90YWxSZWFkID0gMDsKKworICAgICAgICBpZiAoZW50cnlPZmZzZXQgPj0gZW50cnlTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG51bVRvUmVhZCArIGVudHJ5T2Zmc2V0KSA+IGVudHJ5U2l6ZSkgeworICAgICAgICAgICAgbnVtVG9SZWFkID0gKGludCkgKGVudHJ5U2l6ZSAtIGVudHJ5T2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWFkQnVmICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBzeiA9IChudW1Ub1JlYWQgPiByZWFkQnVmLmxlbmd0aCkgPyByZWFkQnVmLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICA6IG51bVRvUmVhZDsKKworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZWFkQnVmLCAwLCBidWYsIG9mZnNldCwgc3opOworCisgICAgICAgICAgICBpZiAoc3ogPj0gcmVhZEJ1Zi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZWFkQnVmID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IG5ld0xlbiA9IHJlYWRCdWYubGVuZ3RoIC0gc3o7CisgICAgICAgICAgICAgICAgYnl0ZVtdIG5ld0J1ZiA9IG5ldyBieXRlW25ld0xlbl07CisKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlYWRCdWYsIHN6LCBuZXdCdWYsIDAsIG5ld0xlbik7CisKKyAgICAgICAgICAgICAgICByZWFkQnVmID0gbmV3QnVmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b3RhbFJlYWQgKz0gc3o7CisgICAgICAgICAgICBudW1Ub1JlYWQgLT0gc3o7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3o7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAobnVtVG9SZWFkID4gMCkgeworICAgICAgICAgICAgYnl0ZVtdIHJlYyA9IGJ1ZmZlci5yZWFkUmVjb3JkKCk7CisKKyAgICAgICAgICAgIGlmIChyZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgRU9GIQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidW5leHBlY3RlZCBFT0Ygd2l0aCAiICsgbnVtVG9SZWFkCisgICAgICAgICAgICAgICAgICAgICAgICArICIgYnl0ZXMgdW5yZWFkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBzeiA9IG51bVRvUmVhZDsKKyAgICAgICAgICAgIGludCByZWNMZW4gPSByZWMubGVuZ3RoOworCisgICAgICAgICAgICBpZiAocmVjTGVuID4gc3opIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlYywgMCwgYnVmLCBvZmZzZXQsIHN6KTsKKworICAgICAgICAgICAgICAgIHJlYWRCdWYgPSBuZXcgYnl0ZVtyZWNMZW4gLSBzel07CisKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlYywgc3osIHJlYWRCdWYsIDAsIHJlY0xlbiAtIHN6KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3ogPSByZWNMZW47CisKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlYywgMCwgYnVmLCBvZmZzZXQsIHJlY0xlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRvdGFsUmVhZCArPSBzejsKKyAgICAgICAgICAgIG51bVRvUmVhZCAtPSBzejsKKyAgICAgICAgICAgIG9mZnNldCArPSBzejsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5T2Zmc2V0ICs9IHRvdGFsUmVhZDsKKworICAgICAgICByZXR1cm4gdG90YWxSZWFkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgdGFyIGFyY2hpdmUgZW50cnkgZGlyZWN0bHkgaW50bworICAgICAqIGFuIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0IFRoZSBPdXRwdXRTdHJlYW0gaW50byB3aGljaCB0byB3cml0ZSB0aGUgZW50cnkncyBkYXRhLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5RW50cnlDb250ZW50cyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbTEFSR0VfQlVGRkVSX1NJWkVdOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgbnVtUmVhZCA9IHJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKG51bVJlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbnVtUmVhZCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJPdXRwdXRTdHJlYW0uamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1Rhck91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZmEyYzEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDM1NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogVGhpcyBwYWNrYWdlIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgVGltb3RoeSBHZXJhcmQgRW5kcmVzCisgKiAodGltZUBpY2UuY29tKSB0byB3aG9tIHRoZSBBbnQgcHJvamVjdCBpcyB2ZXJ5IGdyYXRlZnVsIGZvciBoaXMgZ3JlYXQgY29kZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMudGFyOworCitpbXBvcnQgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUaGUgVGFyT3V0cHV0U3RyZWFtIHdyaXRlcyBhIFVOSVggdGFyIGFyY2hpdmUgYXMgYW4gT3V0cHV0U3RyZWFtLgorICogTWV0aG9kcyBhcmUgcHJvdmlkZWQgdG8gcHV0IGVudHJpZXMsIGFuZCB0aGVuIHdyaXRlIHRoZWlyIGNvbnRlbnRzCisgKiBieSB3cml0aW5nIHRvIHRoaXMgc3RyZWFtIHVzaW5nIHdyaXRlKCkuCisgKgorICovCitwdWJsaWMgY2xhc3MgVGFyT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKKyAgICAvKiogRmFpbCBpZiBhIGxvbmcgZmlsZSBuYW1lIGlzIHJlcXVpcmVkIGluIHRoZSBhcmNoaXZlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPTkdGSUxFX0VSUk9SID0gMDsKKworICAgIC8qKiBMb25nIHBhdGhzIHdpbGwgYmUgdHJ1bmNhdGVkIGluIHRoZSBhcmNoaXZlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPTkdGSUxFX1RSVU5DQVRFID0gMTsKKworICAgIC8qKiBHTlUgdGFyIGV4dGVuc2lvbnMgYXJlIHVzZWQgdG8gc3RvcmUgbG9uZyBmaWxlIG5hbWVzIGluIHRoZSBhcmNoaXZlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPTkdGSUxFX0dOVSA9IDI7CisKKyAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBib29sZWFuICAgZGVidWc7CisgICAgcHJvdGVjdGVkIGxvbmcgICAgICBjdXJyU2l6ZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nICAgIGN1cnJOYW1lOworICAgIHByb3RlY3RlZCBsb25nICAgICAgY3VyckJ5dGVzOworICAgIHByb3RlY3RlZCBieXRlW10gICAgb25lQnVmOworICAgIHByb3RlY3RlZCBieXRlW10gICAgcmVjb3JkQnVmOworICAgIHByb3RlY3RlZCBpbnQgICAgICAgYXNzZW1MZW47CisgICAgcHJvdGVjdGVkIGJ5dGVbXSAgICBhc3NlbUJ1ZjsKKyAgICBwcm90ZWN0ZWQgVGFyQnVmZmVyIGJ1ZmZlcjsKKyAgICBwcm90ZWN0ZWQgaW50ICAgICAgIGxvbmdGaWxlTW9kZSA9IExPTkdGSUxFX0VSUk9SOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFySW5wdXRTdHJlYW0uCisgICAgICogQHBhcmFtIG9zIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBUYXJPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zKSB7CisgICAgICAgIHRoaXMob3MsIFRhckJ1ZmZlci5ERUZBVUxUX0JMS1NJWkUsIFRhckJ1ZmZlci5ERUZBVUxUX1JDRFNJWkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBUYXJJbnB1dFN0cmVhbS4KKyAgICAgKiBAcGFyYW0gb3MgdGhlIG91dHB1dCBzdHJlYW0gdG8gdXNlCisgICAgICogQHBhcmFtIGJsb2NrU2l6ZSB0aGUgYmxvY2sgc2l6ZSB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFyT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcywgaW50IGJsb2NrU2l6ZSkgeworICAgICAgICB0aGlzKG9zLCBibG9ja1NpemUsIFRhckJ1ZmZlci5ERUZBVUxUX1JDRFNJWkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBUYXJJbnB1dFN0cmVhbS4KKyAgICAgKiBAcGFyYW0gb3MgdGhlIG91dHB1dCBzdHJlYW0gdG8gdXNlCisgICAgICogQHBhcmFtIGJsb2NrU2l6ZSB0aGUgYmxvY2sgc2l6ZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gcmVjb3JkU2l6ZSB0aGUgcmVjb3JkIHNpemUgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIFRhck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MsIGludCBibG9ja1NpemUsIGludCByZWNvcmRTaXplKSB7CisgICAgICAgIHN1cGVyKG9zKTsKKworICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBUYXJCdWZmZXIob3MsIGJsb2NrU2l6ZSwgcmVjb3JkU2l6ZSk7CisgICAgICAgIHRoaXMuZGVidWcgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5hc3NlbUxlbiA9IDA7CisgICAgICAgIHRoaXMuYXNzZW1CdWYgPSBuZXcgYnl0ZVtyZWNvcmRTaXplXTsKKyAgICAgICAgdGhpcy5yZWNvcmRCdWYgPSBuZXcgYnl0ZVtyZWNvcmRTaXplXTsKKyAgICAgICAgdGhpcy5vbmVCdWYgPSBuZXcgYnl0ZVsxXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvbmcgZmlsZSBtb2RlLgorICAgICAqIFRoaXMgY2FuIGJlIExPTkdGSUxFX0VSUk9SKDApLCBMT05HRklMRV9UUlVOQ0FURSgxKSBvciBMT05HRklMRV9HTlUoMikuCisgICAgICogVGhpcyBzcGVjaWZpZXMgdGhlIHRyZWF0bWVudCBvZiBsb25nIGZpbGUgbmFtZXMgKG5hbWVzID49IFRhckNvbnN0YW50cy5OQU1FTEVOKS4KKyAgICAgKiBEZWZhdWx0IGlzIExPTkdGSUxFX0VSUk9SLgorICAgICAqIEBwYXJhbSBsb25nRmlsZU1vZGUgdGhlIG1vZGUgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9uZ0ZpbGVNb2RlKGludCBsb25nRmlsZU1vZGUpIHsKKyAgICAgICAgdGhpcy5sb25nRmlsZU1vZGUgPSBsb25nRmlsZU1vZGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWJ1Z2dpbmcgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWJ1Z0YgVHJ1ZSB0byB0dXJuIG9uIGRlYnVnZ2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGRlYnVnRikgeworICAgICAgICB0aGlzLmRlYnVnID0gZGVidWdGOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlYnVnZ2luZyBmbGFnIGluIHRoaXMgc3RyZWFtJ3MgVGFyQnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGRlYnVnIFRydWUgdG8gdHVybiBvbiBkZWJ1Z2dpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVmZmVyRGVidWcoYm9vbGVhbiBkZWJ1ZykgeworICAgICAgICBidWZmZXIuc2V0RGVidWcoZGVidWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgdGhlIFRBUiBhcmNoaXZlIHdpdGhvdXQgY2xvc2luZyB0aGUgdW5kZXJseWluZyBPdXRwdXRTdHJlYW0uCisgICAgICogVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSB0d28gRU9GIHJlY29yZHMgb2YgbnVsbHMgYXJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNlZSBCdWd6aWxsYSAyODc3NiBmb3IgYSBkaXNjdXNzaW9uIG9uIHRoaXMKKyAgICAgICAgLy8gaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yODc3NgorICAgICAgICB3cml0ZUVPRlJlY29yZCgpOworICAgICAgICB3cml0ZUVPRlJlY29yZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgdGhlIFRBUiBhcmNoaXZlIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgT3V0cHV0U3RyZWFtLgorICAgICAqIFRoaXMgbWVhbnMgdGhhdCBmaW5pc2goKSBpcyBjYWxsZWQgZm9sbG93ZWQgYnkgY2FsbGluZyB0aGUKKyAgICAgKiBUYXJCdWZmZXIncyBjbG9zZSgpLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghY2xvc2VkKSB7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgIGJ1ZmZlci5jbG9zZSgpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICBjbG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZWNvcmQgc2l6ZSBiZWluZyB1c2VkIGJ5IHRoaXMgc3RyZWFtJ3MgVGFyQnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVGFyQnVmZmVyIHJlY29yZCBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVjb3JkU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5nZXRSZWNvcmRTaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0IGFuIGVudHJ5IG9uIHRoZSBvdXRwdXQgc3RyZWFtLiBUaGlzIHdyaXRlcyB0aGUgZW50cnkncworICAgICAqIGhlYWRlciByZWNvcmQgYW5kIHBvc2l0aW9ucyB0aGUgb3V0cHV0IHN0cmVhbSBmb3Igd3JpdGluZworICAgICAqIHRoZSBjb250ZW50cyBvZiB0aGUgZW50cnkuIE9uY2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUKKyAgICAgKiBzdHJlYW0gaXMgcmVhZHkgZm9yIGNhbGxzIHRvIHdyaXRlKCkgdG8gd3JpdGUgdGhlIGVudHJ5J3MKKyAgICAgKiBjb250ZW50cy4gT25jZSB0aGUgY29udGVudHMgYXJlIHdyaXR0ZW4sIGNsb3NlRW50cnkoKQorICAgICAqIDxCPk1VU1Q8L0I+IGJlIGNhbGxlZCB0byBlbnN1cmUgdGhhdCBhbGwgYnVmZmVyZWQgZGF0YQorICAgICAqIGlzIGNvbXBsZXRlbHkgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyeSBUaGUgVGFyRW50cnkgdG8gYmUgd3JpdHRlbiB0byB0aGUgYXJjaGl2ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0TmV4dEVudHJ5KFRhckVudHJ5IGVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZW50cnkuZ2V0TmFtZSgpLmxlbmd0aCgpID49IFRhckNvbnN0YW50cy5OQU1FTEVOKSB7CisKKyAgICAgICAgICAgIGlmIChsb25nRmlsZU1vZGUgPT0gTE9OR0ZJTEVfR05VKSB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgVGFyRW50cnkgZm9yIHRoZSBMb25nTGluaywgdGhlIGNvbnRlbnRzCisgICAgICAgICAgICAgICAgLy8gb2Ygd2hpY2ggYXJlIHRoZSBlbnRyeSdzIG5hbWUKKyAgICAgICAgICAgICAgICBUYXJFbnRyeSBsb25nTGlua0VudHJ5ID0gbmV3IFRhckVudHJ5KFRhckNvbnN0YW50cy5HTlVfTE9OR0xJTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJDb25zdGFudHMuTEZfR05VVFlQRV9MT05HTkFNRSk7CisKKyAgICAgICAgICAgICAgICBsb25nTGlua0VudHJ5LnNldFNpemUoZW50cnkuZ2V0TmFtZSgpLmxlbmd0aCgpICsgMSk7CisgICAgICAgICAgICAgICAgcHV0TmV4dEVudHJ5KGxvbmdMaW5rRW50cnkpOworICAgICAgICAgICAgICAgIHdyaXRlKGVudHJ5LmdldE5hbWUoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICB3cml0ZSgwKTsKKyAgICAgICAgICAgICAgICBjbG9zZUVudHJ5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxvbmdGaWxlTW9kZSAhPSBMT05HRklMRV9UUlVOQ0FURSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJmaWxlIG5hbWUgJyIgKyBlbnRyeS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgaXMgdG9vIGxvbmcgKCA+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVGFyQ29uc3RhbnRzLk5BTUVMRU4gKyAiIGJ5dGVzKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZW50cnkud3JpdGVFbnRyeUhlYWRlcihyZWNvcmRCdWYpOworICAgICAgICBidWZmZXIud3JpdGVSZWNvcmQocmVjb3JkQnVmKTsKKworICAgICAgICBjdXJyQnl0ZXMgPSAwOworCisgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBjdXJyU2l6ZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXJyU2l6ZSA9IGVudHJ5LmdldFNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyTmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhbiBlbnRyeS4gVGhpcyBtZXRob2QgTVVTVCBiZSBjYWxsZWQgZm9yIGFsbCBmaWxlCisgICAgICogZW50cmllcyB0aGF0IGNvbnRhaW4gZGF0YS4gVGhlIHJlYXNvbiBpcyB0aGF0IHdlIG11c3QKKyAgICAgKiBidWZmZXIgZGF0YSB3cml0dGVuIHRvIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8gc2F0aXNmeQorICAgICAqIHRoZSBidWZmZXIncyByZWNvcmQgYmFzZWQgd3JpdGVzLiBUaHVzLCB0aGVyZSBtYXkgYmUKKyAgICAgKiBkYXRhIGZyYWdtZW50cyBzdGlsbCBiZWluZyBhc3NlbWJsZWQgdGhhdCBtdXN0IGJlIHdyaXR0ZW4KKyAgICAgKiB0byB0aGUgb3V0cHV0IHN0cmVhbSBiZWZvcmUgdGhpcyBlbnRyeSBpcyBjbG9zZWQgYW5kIHRoZQorICAgICAqIG5leHQgZW50cnkgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VFbnRyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhc3NlbUxlbiA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBhc3NlbUxlbjsgaSA8IGFzc2VtQnVmLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgYXNzZW1CdWZbaV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWZmZXIud3JpdGVSZWNvcmQoYXNzZW1CdWYpOworCisgICAgICAgICAgICBjdXJyQnl0ZXMgKz0gYXNzZW1MZW47CisgICAgICAgICAgICBhc3NlbUxlbiA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyckJ5dGVzIDwgY3VyclNpemUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZW50cnkgJyIgKyBjdXJyTmFtZSArICInIGNsb3NlZCBhdCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VyckJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBiZWZvcmUgdGhlICciICsgY3VyclNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGJ5dGVzIHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyIHdlcmUgd3JpdHRlbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgYnl0ZSB0byB0aGUgY3VycmVudCB0YXIgYXJjaGl2ZSBlbnRyeS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHNpbXBseSBjYWxscyByZWFkKCBieXRlW10sIGludCwgaW50ICkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBUaGUgYnl0ZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb25lQnVmWzBdID0gKGJ5dGUpIGI7CisKKyAgICAgICAgd3JpdGUob25lQnVmLCAwLCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYnl0ZXMgdG8gdGhlIGN1cnJlbnQgdGFyIGFyY2hpdmUgZW50cnkuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBzaW1wbHkgY2FsbHMgd3JpdGUoIGJ5dGVbXSwgaW50LCBpbnQgKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3QnVmIFRoZSBidWZmZXIgdG8gd3JpdGUgdG8gdGhlIGFyY2hpdmUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSB3QnVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZSh3QnVmLCAwLCB3QnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGJ5dGVzIHRvIHRoZSBjdXJyZW50IHRhciBhcmNoaXZlIGVudHJ5LiBUaGlzIG1ldGhvZAorICAgICAqIGlzIGF3YXJlIG9mIHRoZSBjdXJyZW50IGVudHJ5IGFuZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZgorICAgICAqIHlvdSBhdHRlbXB0IHRvIHdyaXRlIGJ5dGVzIHBhc3QgdGhlIGxlbmd0aCBzcGVjaWZpZWQgZm9yIHRoZQorICAgICAqIGN1cnJlbnQgZW50cnkuIFRoZSBtZXRob2QgaXMgYWxzbyAocGFpbmZ1bGx5KSBhd2FyZSBvZiB0aGUKKyAgICAgKiByZWNvcmQgYnVmZmVyaW5nIHJlcXVpcmVkIGJ5IFRhckJ1ZmZlciwgYW5kIG1hbmFnZXMgYnVmZmVycworICAgICAqIHRoYXQgYXJlIG5vdCBhIG11bHRpcGxlIG9mIHJlY29yZHNpemUgaW4gbGVuZ3RoLCBpbmNsdWRpbmcKKyAgICAgKiBhc3NlbWJsaW5nIHJlY29yZHMgZnJvbSBzbWFsbCBidWZmZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHdCdWYgVGhlIGJ1ZmZlciB0byB3cml0ZSB0byB0aGUgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gd09mZnNldCBUaGUgb2Zmc2V0IGluIHRoZSBidWZmZXIgZnJvbSB3aGljaCB0byBnZXQgYnl0ZXMuCisgICAgICogQHBhcmFtIG51bVRvV3JpdGUgVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIHdCdWYsIGludCB3T2Zmc2V0LCBpbnQgbnVtVG9Xcml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKChjdXJyQnl0ZXMgKyBudW1Ub1dyaXRlKSA+IGN1cnJTaXplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlcXVlc3QgdG8gd3JpdGUgJyIgKyBudW1Ub1dyaXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBieXRlcyBleGNlZWRzIHNpemUgaW4gaGVhZGVyIG9mICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyU2l6ZSArICInIGJ5dGVzIGZvciBlbnRyeSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3Vyck5hbWUgKyAiJyIpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBkZWFsIHdpdGggYXNzZW1ibHkhISEKKyAgICAgICAgICAgIC8vIFRoZSBwcm9ncmFtbWVyIGNhbiBiZSB3cml0aW5nIGxpdHRsZSAzMiBieXRlIGNodW5rcyBmb3IgYWxsCisgICAgICAgICAgICAvLyB3ZSBrbm93LCBhbmQgd2UgbXVzdCBhc3NlbWJsZSBjb21wbGV0ZSByZWNvcmRzIGZvciB3cml0aW5nLgorICAgICAgICAgICAgLy8gUkVWSUVXIE1heWJlIHRoaXMgc2hvdWxkIGJlIGluIFRhckJ1ZmZlcj8gQ291bGQgdGhhdCBoZWxwIHRvCisgICAgICAgICAgICAvLyBlbGltaW5hdGUgc29tZSBvZiB0aGUgYnVmZmVyIGNvcHlpbmcuCisgICAgICAgICAgICAvLworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFzc2VtTGVuID4gMCkgeworICAgICAgICAgICAgaWYgKChhc3NlbUxlbiArIG51bVRvV3JpdGUpID49IHJlY29yZEJ1Zi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpbnQgYUxlbiA9IHJlY29yZEJ1Zi5sZW5ndGggLSBhc3NlbUxlbjsKKworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXNzZW1CdWYsIDAsIHJlY29yZEJ1ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtTGVuKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdCdWYsIHdPZmZzZXQsIHJlY29yZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtTGVuLCBhTGVuKTsKKyAgICAgICAgICAgICAgICBidWZmZXIud3JpdGVSZWNvcmQocmVjb3JkQnVmKTsKKworICAgICAgICAgICAgICAgIGN1cnJCeXRlcyArPSByZWNvcmRCdWYubGVuZ3RoOworICAgICAgICAgICAgICAgIHdPZmZzZXQgKz0gYUxlbjsKKyAgICAgICAgICAgICAgICBudW1Ub1dyaXRlIC09IGFMZW47CisgICAgICAgICAgICAgICAgYXNzZW1MZW4gPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdCdWYsIHdPZmZzZXQsIGFzc2VtQnVmLCBhc3NlbUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRvV3JpdGUpOworCisgICAgICAgICAgICAgICAgd09mZnNldCArPSBudW1Ub1dyaXRlOworICAgICAgICAgICAgICAgIGFzc2VtTGVuICs9IG51bVRvV3JpdGU7CisgICAgICAgICAgICAgICAgbnVtVG9Xcml0ZSAtPSBudW1Ub1dyaXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hlbiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIEVJVEhFUjoKKyAgICAgICAgLy8gbyBBbiBlbXB0eSAiYXNzZW1ibGUiIGJ1ZmZlci4KKyAgICAgICAgLy8gbyBObyBieXRlcyB0byB3cml0ZSAobnVtVG9Xcml0ZSA9PSAwKQorICAgICAgICAvLworICAgICAgICB3aGlsZSAobnVtVG9Xcml0ZSA+IDApIHsKKyAgICAgICAgICAgIGlmIChudW1Ub1dyaXRlIDwgcmVjb3JkQnVmLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod0J1Ziwgd09mZnNldCwgYXNzZW1CdWYsIGFzc2VtTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVG9Xcml0ZSk7CisKKyAgICAgICAgICAgICAgICBhc3NlbUxlbiArPSBudW1Ub1dyaXRlOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZVJlY29yZCh3QnVmLCB3T2Zmc2V0KTsKKworICAgICAgICAgICAgaW50IG51bSA9IHJlY29yZEJ1Zi5sZW5ndGg7CisKKyAgICAgICAgICAgIGN1cnJCeXRlcyArPSBudW07CisgICAgICAgICAgICBudW1Ub1dyaXRlIC09IG51bTsKKyAgICAgICAgICAgIHdPZmZzZXQgKz0gbnVtOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gRU9GIChlbmQgb2YgYXJjaGl2ZSkgcmVjb3JkIHRvIHRoZSB0YXIgYXJjaGl2ZS4KKyAgICAgKiBBbiBFT0YgcmVjb3JkIGNvbnNpc3RzIG9mIGEgcmVjb3JkIG9mIGFsbCB6ZXJvcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVFT0ZSZWNvcmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZEJ1Zi5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgcmVjb3JkQnVmW2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlci53cml0ZVJlY29yZChyZWNvcmRCdWYpOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJVdGlscy5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzRkOTYwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyVXRpbHMuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKgorICogVGhpcyBwYWNrYWdlIGlzIGJhc2VkIG9uIHRoZSB3b3JrIGRvbmUgYnkgVGltb3RoeSBHZXJhcmQgRW5kcmVzCisgKiAodGltZUBpY2UuY29tKSB0byB3aG9tIHRoZSBBbnQgcHJvamVjdCBpcyB2ZXJ5IGdyYXRlZnVsIGZvciBoaXMgZ3JlYXQgY29kZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMudGFyOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIHV0aWxpdHkgbWV0aG9kcyB0byB3b3JrIHdpdGggYnl0ZSBzdHJlYW1zLgorICoKKyAqLworLy8gQ2hlY2tTdHlsZTpIaWRlVXRpbGl0eUNsYXNzQ29uc3RydWN0b3JDaGVjayBPRkYgKGJjKQorcHVibGljIGNsYXNzIFRhclV0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFX01BU0sgPSAyNTU7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbiBvY3RhbCBzdHJpbmcgZnJvbSBhIGhlYWRlciBidWZmZXIuIFRoaXMgaXMgdXNlZCBmb3IgdGhlCisgICAgICogZmlsZSBwZXJtaXNzaW9uIG1vZGUgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGVhZGVyIFRoZSBoZWFkZXIgYnVmZmVyIGZyb20gd2hpY2ggdG8gcGFyc2UuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHBhcnNlLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBoZWFkZXIgYnl0ZXMgdG8gcGFyc2UuCisgICAgICogQHJldHVybiBUaGUgbG9uZyB2YWx1ZSBvZiB0aGUgb2N0YWwgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBwYXJzZU9jdGFsKGJ5dGVbXSBoZWFkZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgbG9uZyAgICByZXN1bHQgPSAwOworICAgICAgICBib29sZWFuIHN0aWxsUGFkZGluZyA9IHRydWU7CisgICAgICAgIGludCAgICAgZW5kID0gb2Zmc2V0ICsgbGVuZ3RoOworCisgICAgICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7ICsraSkgeworICAgICAgICAgICAgaWYgKGhlYWRlcltpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoZWFkZXJbaV0gPT0gKGJ5dGUpICcgJyB8fCBoZWFkZXJbaV0gPT0gJzAnKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0aWxsUGFkZGluZykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaGVhZGVyW2ldID09IChieXRlKSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGlsbFBhZGRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDMpICsgKGhlYWRlcltpXSAtICcwJyk7CisgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGFuIGVudHJ5IG5hbWUgZnJvbSBhIGhlYWRlciBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGVhZGVyIFRoZSBoZWFkZXIgYnVmZmVyIGZyb20gd2hpY2ggdG8gcGFyc2UuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHBhcnNlLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBoZWFkZXIgYnl0ZXMgdG8gcGFyc2UuCisgICAgICogQHJldHVybiBUaGUgaGVhZGVyJ3MgZW50cnkgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBwYXJzZU5hbWUoYnl0ZVtdIGhlYWRlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOworICAgICAgICBpbnQgICAgICAgICAgZW5kID0gb2Zmc2V0ICsgbGVuZ3RoOworCisgICAgICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7ICsraSkgeworICAgICAgICAgICAgaWYgKGhlYWRlcltpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGNoYXIpIGhlYWRlcltpXSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGFuIGVudHJ5IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgaGVhZGVyIG5hbWUgZnJvbSB3aGljaCB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBidWZmZXIgZnJvbSB3aGljaCB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGZyb20gd2hpY2ggdG8gcGFyc2UuCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGhlYWRlciBieXRlcyB0byBwYXJzZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBoZWFkZXIncyBlbnRyeSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE5hbWVCeXRlcyhTdHJpbmdCdWZmZXIgbmFtZSwgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoICYmIGkgPCBuYW1lLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IChieXRlKSBuYW1lLmNoYXJBdChpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb2Zmc2V0ICsgbGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGFuIG9jdGFsIGludGVnZXIgZnJvbSBhIGhlYWRlciBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGhlYWRlciB2YWx1ZQorICAgICAqIEBwYXJhbSBidWYgVGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHBhcnNlLgorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZnJvbSB3aGljaCB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgaGVhZGVyIGJ5dGVzIHRvIHBhcnNlLgorICAgICAqIEByZXR1cm4gVGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIG9jdGFsIGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE9jdGFsQnl0ZXMobG9uZyB2YWx1ZSwgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBpbnQgICAgaWR4ID0gbGVuZ3RoIC0gMTsKKworICAgICAgICBidWZbb2Zmc2V0ICsgaWR4XSA9IDA7CisgICAgICAgIC0taWR4OworICAgICAgICBidWZbb2Zmc2V0ICsgaWR4XSA9IChieXRlKSAnICc7CisgICAgICAgIC0taWR4OworCisgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICBidWZbb2Zmc2V0ICsgaWR4XSA9IChieXRlKSAnMCc7CisgICAgICAgICAgICAtLWlkeDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAobG9uZyB2YWwgPSB2YWx1ZTsgaWR4ID49IDAgJiYgdmFsID4gMDsgLS1pZHgpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyBpZHhdID0gKGJ5dGUpICgoYnl0ZSkgJzAnICsgKGJ5dGUpICh2YWwgJiA3KSk7CisgICAgICAgICAgICAgICAgdmFsID0gdmFsID4+IDM7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICg7IGlkeCA+PSAwOyAtLWlkeCkgeworICAgICAgICAgICAgYnVmW29mZnNldCArIGlkeF0gPSAoYnl0ZSkgJyAnOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9mZnNldCArIGxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbiBvY3RhbCBsb25nIGludGVnZXIgZnJvbSBhIGhlYWRlciBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGhlYWRlciB2YWx1ZQorICAgICAqIEBwYXJhbSBidWYgVGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIHBhcnNlLgorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZnJvbSB3aGljaCB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgaGVhZGVyIGJ5dGVzIHRvIHBhcnNlLgorICAgICAqIEByZXR1cm4gVGhlIGxvbmcgdmFsdWUgb2YgdGhlIG9jdGFsIGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldExvbmdPY3RhbEJ5dGVzKGxvbmcgdmFsdWUsIGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVtsZW5ndGggKyAxXTsKKworICAgICAgICBnZXRPY3RhbEJ5dGVzKHZhbHVlLCB0ZW1wLCAwLCBsZW5ndGggKyAxKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBidWYsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICByZXR1cm4gb2Zmc2V0ICsgbGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBjaGVja3N1bSBvY3RhbCBpbnRlZ2VyIGZyb20gYSBoZWFkZXIgYnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBoZWFkZXIgdmFsdWUKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBidWZmZXIgZnJvbSB3aGljaCB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGZyb20gd2hpY2ggdG8gcGFyc2UuCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGhlYWRlciBieXRlcyB0byBwYXJzZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBlbnRyeSdzIGNoZWNrc3VtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENoZWNrU3VtT2N0YWxCeXRlcyhsb25nIHZhbHVlLCBieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGdldE9jdGFsQnl0ZXModmFsdWUsIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgIGJ1ZltvZmZzZXQgKyBsZW5ndGggLSAxXSA9IChieXRlKSAnICc7CisgICAgICAgIGJ1ZltvZmZzZXQgKyBsZW5ndGggLSAyXSA9IDA7CisKKyAgICAgICAgcmV0dXJuIG9mZnNldCArIGxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlIHRoZSBjaGVja3N1bSBvZiBhIHRhciBlbnRyeSBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSB0YXIgZW50cnkncyBoZWFkZXIgYnVmZmVyLgorICAgICAqIEByZXR1cm4gVGhlIGNvbXB1dGVkIGNoZWNrc3VtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBjb21wdXRlQ2hlY2tTdW0oYnl0ZVtdIGJ1ZikgeworICAgICAgICBsb25nIHN1bSA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHN1bSArPSBCWVRFX01BU0sgJiBidWZbaV07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0FzaUV4dHJhRmllbGQuamF2YSBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0FzaUV4dHJhRmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWNlMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQXNpRXh0cmFGaWVsZC5qYXZhCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOworCisvKioKKyAqIEFkZHMgVW5peCBmaWxlIHBlcm1pc3Npb24gYW5kIFVJRC9HSUQgZmllbGRzIGFzIHdlbGwgYXMgc3ltYm9saWMKKyAqIGxpbmsgaGFuZGxpbmcuCisgKgorICogPHA+VGhpcyBjbGFzcyB1c2VzIHRoZSBBU2kgZXh0cmEgZmllbGQgaW4gdGhlIGZvcm1hdDoKKyAqIDxwcmU+CisgKiAgICAgICAgIFZhbHVlICAgICAgICAgU2l6ZSAgICAgICAgICAgIERlc2NyaXB0aW9uCisgKiAgICAgICAgIC0tLS0tICAgICAgICAgLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0tCisgKiAoVW5peDMpIDB4NzU2ZSAgICAgICAgU2hvcnQgICAgICAgICAgIHRhZyBmb3IgdGhpcyBleHRyYSBibG9jayB0eXBlCisgKiAgICAgICAgIFRTaXplICAgICAgICAgU2hvcnQgICAgICAgICAgIHRvdGFsIGRhdGEgc2l6ZSBmb3IgdGhpcyBibG9jaworICogICAgICAgICBDUkMgICAgICAgICAgIExvbmcgICAgICAgICAgICBDUkMtMzIgb2YgdGhlIHJlbWFpbmluZyBkYXRhCisgKiAgICAgICAgIE1vZGUgICAgICAgICAgU2hvcnQgICAgICAgICAgIGZpbGUgcGVybWlzc2lvbnMKKyAqICAgICAgICAgU2l6RGV2ICAgICAgICBMb25nICAgICAgICAgICAgc3ltbGluaydkIHNpemUgT1IgbWFqb3IvbWlub3IgZGV2IG51bQorICogICAgICAgICBVSUQgICAgICAgICAgIFNob3J0ICAgICAgICAgICB1c2VyIElECisgKiAgICAgICAgIEdJRCAgICAgICAgICAgU2hvcnQgICAgICAgICAgIGdyb3VwIElECisgKiAgICAgICAgICh2YXIuKSAgICAgICAgdmFyaWFibGUgICAgICAgIHN5bWJvbGljIGxpbmsgZmlsZW5hbWUKKyAqIDwvcHJlPgorICogdGFrZW4gZnJvbSBhcHBub3RlLml6IChJbmZvLVpJUCBub3RlLCA5ODExMTkpIGZvdW5kIGF0IDxhCisgKiBocmVmPSJmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy8iPmZ0cDovL2Z0cC51dS5uZXQvcHViL2FyY2hpdmluZy96aXAvZG9jLzwvYT48L3A+CisKKyAqCisgKiA8cD5TaG9ydCBpcyB0d28gYnl0ZXMgYW5kIExvbmcgaXMgZm91ciBieXRlcyBpbiBiaWcgZW5kaWFuIGJ5dGUgYW5kCisgKiB3b3JkIG9yZGVyLCBkZXZpY2UgbnVtYmVycyBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIEFzaUV4dHJhRmllbGQgaW1wbGVtZW50cyBaaXBFeHRyYUZpZWxkLCBVbml4U3RhdCwgQ2xvbmVhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFppcFNob3J0IEhFQURFUl9JRCA9IG5ldyBaaXBTaG9ydCgweDc1NkUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCAgICAgIFdPUkQgPSA0OworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIFVuaXggc3RhdCgyKSBmaWxlIG1vZGUuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbW9kZSA9IDA7CisgICAgLyoqCisgICAgICogVXNlciBJRC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB1aWQgPSAwOworICAgIC8qKgorICAgICAqIEdyb3VwIElELgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgaW50IGdpZCA9IDA7CisgICAgLyoqCisgICAgICogRmlsZSB0aGlzIGVudHJ5IHBvaW50cyB0bywgaWYgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLgorICAgICAqCisgICAgICogPHA+ZW1wdHkgc3RyaW5nIC0gaWYgZW50cnkgaXMgbm90IGEgc3ltYm9saWMgbGluay48L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbGluayA9ICIiOworICAgIC8qKgorICAgICAqIElzIHRoaXMgYW4gZW50cnkgZm9yIGEgZGlyZWN0b3J5PworICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkaXJGbGFnID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSB1c2VkIHRvIGNhbGN1bGF0ZSBjaGVja3N1bXMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJpdmF0ZSBDUkMzMiBjcmMgPSBuZXcgQ1JDMzIoKTsKKworICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgQXNpRXh0cmFGaWVsZC4gKi8KKyAgICBwdWJsaWMgQXNpRXh0cmFGaWVsZCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSGVhZGVyLUlELgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgaGVhZGVyIGlkIGZvciB0aGlzIGV4dHJhZmllbGQKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIFppcFNob3J0IGdldEhlYWRlcklkKCkgeworICAgICAgICByZXR1cm4gSEVBREVSX0lEOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlbmd0aCBvZiB0aGUgZXh0cmEgZmllbGQgaW4gdGhlIGxvY2FsIGZpbGUgZGF0YSAtIHdpdGhvdXQKKyAgICAgKiBIZWFkZXItSUQgb3IgbGVuZ3RoIHNwZWNpZmllci4KKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+WmlwU2hvcnQ8L2NvZGU+IGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIG9mIHRoaXMgZXh0cmEgZmllbGQKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIFppcFNob3J0IGdldExvY2FsRmlsZURhdGFMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBuZXcgWmlwU2hvcnQoV09SRCAgICAgICAgIC8vIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICArIDIgICAgICAgICAvLyBNb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgV09SRCAgICAgICAgIC8vIFNpekRldgorICAgICAgICAgICAgICAgICAgICAgICAgICArIDIgICAgICAgICAvLyBVSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAyICAgICAgICAgLy8gR0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0TGlua2VkRmlsZSgpLmdldEJ5dGVzKCkubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZSB0byBsb2NhbCBmaWxlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgY2VudHJhbERpcmVjdG9yeSBsZW5ndGgKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIFppcFNob3J0IGdldENlbnRyYWxEaXJlY3RvcnlMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBnZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFjdHVhbCBkYXRhIHRvIHB1dCBpbnRvIGxvY2FsIGZpbGUgZGF0YSAtIHdpdGhvdXQgSGVhZGVyLUlECisgICAgICogb3IgbGVuZ3RoIHNwZWNpZmllci4KKyAgICAgKiBAcmV0dXJuIGdldCB0aGUgZGF0YQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldExvY2FsRmlsZURhdGFEYXRhKCkgeworICAgICAgICAvLyBDUkMgd2lsbCBiZSBhZGRlZCBsYXRlcgorICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW2dldExvY2FsRmlsZURhdGFMZW5ndGgoKS5nZXRWYWx1ZSgpIC0gV09SRF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoWmlwU2hvcnQuZ2V0Qnl0ZXMoZ2V0TW9kZSgpKSwgMCwgZGF0YSwgMCwgMik7CisKKyAgICAgICAgYnl0ZVtdIGxpbmtBcnJheSA9IGdldExpbmtlZEZpbGUoKS5nZXRCeXRlcygpOworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KFppcExvbmcuZ2V0Qnl0ZXMobGlua0FycmF5Lmxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZGF0YSwgMiwgV09SRCk7CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShaaXBTaG9ydC5nZXRCeXRlcyhnZXRVc2VySWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZGF0YSwgNiwgMik7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoWmlwU2hvcnQuZ2V0Qnl0ZXMoZ2V0R3JvdXBJZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCBkYXRhLCA4LCAyKTsKKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxpbmtBcnJheSwgMCwgZGF0YSwgMTAsIGxpbmtBcnJheS5sZW5ndGgpOworICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisKKyAgICAgICAgY3JjLnJlc2V0KCk7CisgICAgICAgIGNyYy51cGRhdGUoZGF0YSk7CisgICAgICAgIGxvbmcgY2hlY2tzdW0gPSBjcmMuZ2V0VmFsdWUoKTsKKworICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGggKyBXT1JEXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShaaXBMb25nLmdldEJ5dGVzKGNoZWNrc3VtKSwgMCwgcmVzdWx0LCAwLCBXT1JEKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCByZXN1bHQsIFdPUkQsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZSB0byBsb2NhbCBmaWxlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgbG9jYWwgZmlsZSBkYXRhCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0Q2VudHJhbERpcmVjdG9yeURhdGEoKSB7CisgICAgICAgIHJldHVybiBnZXRMb2NhbEZpbGVEYXRhRGF0YSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciBpZC4KKyAgICAgKiBAcGFyYW0gdWlkIHRoZSB1c2VyIGlkCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJJZChpbnQgdWlkKSB7CisgICAgICAgIHRoaXMudWlkID0gdWlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdXNlciBpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VyIGlkCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VXNlcklkKCkgeworICAgICAgICByZXR1cm4gdWlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ3JvdXAgaWQuCisgICAgICogQHBhcmFtIGdpZCB0aGUgZ3JvdXAgaWQKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBJZChpbnQgZ2lkKSB7CisgICAgICAgIHRoaXMuZ2lkID0gZ2lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZ3JvdXAgaWQuCisgICAgICogQHJldHVybiB0aGUgZ3JvdXAgaWQKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIGludCBnZXRHcm91cElkKCkgeworICAgICAgICByZXR1cm4gZ2lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBlbnRyeSBpcyBhIHN5bWJvbGljIGxpbmsgdG8gdGhlIGdpdmVuIGZpbGVuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZmlsZSB0aGlzIGVudHJ5IGxpbmtzIHRvLCBlbXB0eSBTdHJpbmcKKyAgICAgKiAgICAgICAgICAgICBpZiBpdCBpcyBub3QgYSBzeW1ib2xpYyBsaW5rLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpbmtlZEZpbGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbGluayA9IG5hbWU7CisgICAgICAgIG1vZGUgPSBnZXRNb2RlKG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgbGlua2VkIGZpbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gbmFtZSBvZiB0aGUgZmlsZSB0aGlzIGVudHJ5IGxpbmtzIHRvIGlmIGl0IGlzIGEKKyAgICAgKiAgICAgICAgIHN5bWJvbGljIGxpbmssIHRoZSBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlua2VkRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGxpbms7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhpcyBlbnRyeSBhIHN5bWJvbGljIGxpbms/CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBzeW1ib2xpYyBsaW5rCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTGluaygpIHsKKyAgICAgICAgcmV0dXJuIGdldExpbmtlZEZpbGUoKS5sZW5ndGgoKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbGUgbW9kZSBvZiB0aGlzIGZpbGUuCisgICAgICogQHBhcmFtIG1vZGUgdGhlIGZpbGUgbW9kZQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBtb2RlKSB7CisgICAgICAgIHRoaXMubW9kZSA9IGdldE1vZGUobW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsZSBtb2RlIG9mIHRoaXMgZmlsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIG1vZGUKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNb2RlKCkgeworICAgICAgICByZXR1cm4gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgZW50cnkgaXMgYSBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGRpckZsYWcgaWYgdHJ1ZSwgdGhpcyBlbnRyeSBpcyBhIGRpcmVjdG9yeQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoYm9vbGVhbiBkaXJGbGFnKSB7CisgICAgICAgIHRoaXMuZGlyRmxhZyA9IGRpckZsYWc7CisgICAgICAgIG1vZGUgPSBnZXRNb2RlKG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgZW50cnkgYSBkaXJlY3Rvcnk/CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgZW50cnkgaXMgYSBkaXJlY3RvcnkKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBkaXJGbGFnICYmICFpc0xpbmsoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSBkYXRhIGZyb20gdGhpcyBhcnJheSBhcyBpZiBpdCB3YXMgaW4gbG9jYWwgZmlsZSBkYXRhLgorICAgICAqIEBwYXJhbSBkYXRhIGFuIGFycmF5IG9mIGJ5dGVzCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgc3RhcnQgb2Zmc2V0CisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBhcnJheSBmcm9tIG9mZnNldAorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKiBAdGhyb3dzIFppcEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlRnJvbUxvY2FsRmlsZURhdGEoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBaaXBFeGNlcHRpb24geworCisgICAgICAgIGxvbmcgZ2l2ZW5DaGVja3N1bSA9IFppcExvbmcuZ2V0VmFsdWUoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlW2xlbmd0aCAtIFdPUkRdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9mZnNldCArIFdPUkQsIHRtcCwgMCwgbGVuZ3RoIC0gV09SRCk7CisgICAgICAgIGNyYy5yZXNldCgpOworICAgICAgICBjcmMudXBkYXRlKHRtcCk7CisgICAgICAgIGxvbmcgcmVhbENoZWNrc3VtID0gY3JjLmdldFZhbHVlKCk7CisgICAgICAgIGlmIChnaXZlbkNoZWNrc3VtICE9IHJlYWxDaGVja3N1bSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiYmFkIENSQyBjaGVja3N1bSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTG9uZy50b0hleFN0cmluZyhnaXZlbkNoZWNrc3VtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW5zdGVhZCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTG9uZy50b0hleFN0cmluZyhyZWFsQ2hlY2tzdW0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBuZXdNb2RlID0gWmlwU2hvcnQuZ2V0VmFsdWUodG1wLCAwKTsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgYnl0ZVtdIGxpbmtBcnJheSA9IG5ldyBieXRlWyhpbnQpIFppcExvbmcuZ2V0VmFsdWUodG1wLCAyKV07CisgICAgICAgIHVpZCA9IFppcFNob3J0LmdldFZhbHVlKHRtcCwgNik7CisgICAgICAgIGdpZCA9IFppcFNob3J0LmdldFZhbHVlKHRtcCwgOCk7CisKKyAgICAgICAgaWYgKGxpbmtBcnJheS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgbGluayA9ICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0bXAsIDEwLCBsaW5rQXJyYXksIDAsIGxpbmtBcnJheS5sZW5ndGgpOworICAgICAgICAgICAgbGluayA9IG5ldyBTdHJpbmcobGlua0FycmF5KTsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCisgICAgICAgIHNldERpcmVjdG9yeSgobmV3TW9kZSAmIERJUl9GTEFHKSAhPSAwKTsKKyAgICAgICAgc2V0TW9kZShuZXdNb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpbGUgbW9kZSBmb3IgZ2l2ZW4gcGVybWlzc2lvbnMgd2l0aCB0aGUgY29ycmVjdCBmaWxlIHR5cGUuCisgICAgICogQHBhcmFtIG1vZGUgdGhlIG1vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIHdpdGggdGhlIG1vZGUKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRNb2RlKGludCBtb2RlKSB7CisgICAgICAgIGludCB0eXBlID0gRklMRV9GTEFHOworICAgICAgICBpZiAoaXNMaW5rKCkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBMSU5LX0ZMQUc7CisgICAgICAgIH0gZWxzZSBpZiAoaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdHlwZSA9IERJUl9GTEFHOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlIHwgKG1vZGUgJiBQRVJNX01BU0spOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvRXh0cmFGaWVsZFV0aWxzLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9FeHRyYUZpZWxkVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzdmNWJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvRXh0cmFGaWVsZFV0aWxzLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKKworLyoqCisgKiBaaXBFeHRyYUZpZWxkIHJlbGF0ZWQgbWV0aG9kcworICoKKyAqLworLy8gQ2hlY2tTdHlsZTpIaWRlVXRpbGl0eUNsYXNzQ29uc3RydWN0b3JDaGVjayBPRkYgKGJjKQorcHVibGljIGNsYXNzIEV4dHJhRmllbGRVdGlscyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV09SRCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBTdGF0aWMgcmVnaXN0cnkgb2Yga25vd24gZXh0cmEgZmllbGRzLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBpbXBsZW1lbnRhdGlvbnM7CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbXBsZW1lbnRhdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIHJlZ2lzdGVyKEFzaUV4dHJhRmllbGQuY2xhc3MpOworICAgICAgICByZWdpc3RlcihKYXJNYXJrZXIuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgWmlwRXh0cmFGaWVsZCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPlRoZSBnaXZlbiBjbGFzcyBtdXN0IGhhdmUgYSBuby1hcmcgY29uc3RydWN0b3IgYW5kIGltcGxlbWVudAorICAgICAqIHRoZSB7QGxpbmsgWmlwRXh0cmFGaWVsZCBaaXBFeHRyYUZpZWxkIGludGVyZmFjZX0uPC9wPgorICAgICAqIEBwYXJhbSBjIHRoZSBjbGFzcyB0byByZWdpc3RlcgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihDbGFzcyBjKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBaaXBFeHRyYUZpZWxkIHplID0gKFppcEV4dHJhRmllbGQpIGMubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy5wdXQoemUuZ2V0SGVhZGVySWQoKSwgYyk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjYykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYyArICIgZG9lc25cJ3QgaW1wbGVtZW50IFppcEV4dHJhRmllbGQiKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYyArICIgaXMgbm90IGEgY29uY3JldGUgY2xhc3MiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYyArICJcJ3Mgbm8tYXJnIGNvbnN0cnVjdG9yIGlzIG5vdCBwdWJsaWMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9yaWF0ZSBFeHRyYUZpZWxkLCBmYWxscyBiYWNrIHRvCisgICAgICoge0BsaW5rIFVucmVjb2duaXplZEV4dHJhRmllbGQgVW5yZWNvZ25pemVkRXh0cmFGaWVsZH0uCisgICAgICogQHBhcmFtIGhlYWRlcklkIHRoZSBoZWFkZXIgaWRlbnRpZmllcgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcHJvcGlhdGUgRXh0cmFGaWVsZAorICAgICAqIEBleGNlcHRpb24gSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gaW5zdGFudGlhdGUgdGhlIGNsYXNzCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlmIG5vdCBhbGxvd2VkIHRvIGluc3RhdGlhdGUgdGhlIGNsYXNzCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgWmlwRXh0cmFGaWVsZCBjcmVhdGVFeHRyYUZpZWxkKFppcFNob3J0IGhlYWRlcklkKQorICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzIGMgPSAoQ2xhc3MpIGltcGxlbWVudGF0aW9ucy5nZXQoaGVhZGVySWQpOworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKFppcEV4dHJhRmllbGQpIGMubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgICAgICBVbnJlY29nbml6ZWRFeHRyYUZpZWxkIHUgPSBuZXcgVW5yZWNvZ25pemVkRXh0cmFGaWVsZCgpOworICAgICAgICB1LnNldEhlYWRlcklkKGhlYWRlcklkKTsKKyAgICAgICAgcmV0dXJuIHU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BsaXQgdGhlIGFycmF5IGludG8gRXh0cmFGaWVsZHMgYW5kIHBvcHVsYXRlIHRoZW0gd2l0aCB0aGUKKyAgICAgKiBnaXZlIGRhdGEuCisgICAgICogQHBhcmFtIGRhdGEgYW4gYXJyYXkgb2YgYnl0ZXMKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIEV4dHJhRmllbGRzCisgICAgICogQHNpbmNlIDEuMQorICAgICAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBaaXBFeHRyYUZpZWxkW10gcGFyc2UoYnl0ZVtdIGRhdGEpIHRocm93cyBaaXBFeGNlcHRpb24geworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgd2hpbGUgKHN0YXJ0IDw9IGRhdGEubGVuZ3RoIC0gV09SRCkgeworICAgICAgICAgICAgWmlwU2hvcnQgaGVhZGVySWQgPSBuZXcgWmlwU2hvcnQoZGF0YSwgc3RhcnQpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IChuZXcgWmlwU2hvcnQoZGF0YSwgc3RhcnQgKyAyKSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChzdGFydCArIFdPUkQgKyBsZW5ndGggPiBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oImRhdGEgc3RhcnRpbmcgYXQgIiArIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICsgIiBpcyBpbiB1bmtub3duIGZvcm1hdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBaaXBFeHRyYUZpZWxkIHplID0gY3JlYXRlRXh0cmFGaWVsZChoZWFkZXJJZCk7CisgICAgICAgICAgICAgICAgemUucGFyc2VGcm9tTG9jYWxGaWxlRGF0YShkYXRhLCBzdGFydCArIFdPUkQsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KHplKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKGllLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oaWFlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCArPSAobGVuZ3RoICsgV09SRCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXJ0ICE9IGRhdGEubGVuZ3RoKSB7IC8vIGFycmF5IG5vdCBleGhhdXN0ZWQKKyAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oImRhdGEgc3RhcnRpbmcgYXQgIiArIHN0YXJ0CisgICAgICAgICAgICAgICAgKyAiIGlzIGluIHVua25vd24gZm9ybWF0Iik7CisgICAgICAgIH0KKworICAgICAgICBaaXBFeHRyYUZpZWxkW10gcmVzdWx0ID0gbmV3IFppcEV4dHJhRmllbGRbdi5zaXplKCldOworICAgICAgICB2LmNvcHlJbnRvKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVyZ2VzIHRoZSBsb2NhbCBmaWxlIGRhdGEgZmllbGRzIG9mIHRoZSBnaXZlbiBaaXBFeHRyYUZpZWxkcy4KKyAgICAgKiBAcGFyYW0gZGF0YSBhbiBhcnJheSBvZiBFeHRyYUZpbGVzCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBieXRlcworICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBtZXJnZUxvY2FsRmlsZURhdGFEYXRhKFppcEV4dHJhRmllbGRbXSBkYXRhKSB7CisgICAgICAgIGludCBzdW0gPSBXT1JEICogZGF0YS5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3VtICs9IGRhdGFbaV0uZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3N1bV07CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhW2ldLmdldEhlYWRlcklkKCkuZ2V0Qnl0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcmVzdWx0LCBzdGFydCwgMik7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGFbaV0uZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldEJ5dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHJlc3VsdCwgc3RhcnQgKyAyLCAyKTsKKyAgICAgICAgICAgIGJ5dGVbXSBsb2NhbCA9IGRhdGFbaV0uZ2V0TG9jYWxGaWxlRGF0YURhdGEoKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobG9jYWwsIDAsIHJlc3VsdCwgc3RhcnQgKyBXT1JELCBsb2NhbC5sZW5ndGgpOworICAgICAgICAgICAgc3RhcnQgKz0gKGxvY2FsLmxlbmd0aCArIFdPUkQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVyZ2VzIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBmaWVsZHMgb2YgdGhlIGdpdmVuIFppcEV4dHJhRmllbGRzLgorICAgICAqIEBwYXJhbSBkYXRhIGFuIGFycmF5IG9mIEV4dHJhRmllbGRzCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBieXRlcworICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBtZXJnZUNlbnRyYWxEaXJlY3RvcnlEYXRhKFppcEV4dHJhRmllbGRbXSBkYXRhKSB7CisgICAgICAgIGludCBzdW0gPSBXT1JEICogZGF0YS5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3VtICs9IGRhdGFbaV0uZ2V0Q2VudHJhbERpcmVjdG9yeUxlbmd0aCgpLmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3N1bV07CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhW2ldLmdldEhlYWRlcklkKCkuZ2V0Qnl0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcmVzdWx0LCBzdGFydCwgMik7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGFbaV0uZ2V0Q2VudHJhbERpcmVjdG9yeUxlbmd0aCgpLmdldEJ5dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHJlc3VsdCwgc3RhcnQgKyAyLCAyKTsKKyAgICAgICAgICAgIGJ5dGVbXSBsb2NhbCA9IGRhdGFbaV0uZ2V0Q2VudHJhbERpcmVjdG9yeURhdGEoKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobG9jYWwsIDAsIHJlc3VsdCwgc3RhcnQgKyBXT1JELCBsb2NhbC5sZW5ndGgpOworICAgICAgICAgICAgc3RhcnQgKz0gKGxvY2FsLmxlbmd0aCArIFdPUkQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvSmFyTWFya2VyLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9KYXJNYXJrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDYzMzUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvSmFyTWFya2VyLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKKworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOworCisvKioKKyAqIElmIHRoaXMgZXh0cmEgZmllbGQgaXMgYWRkZWQgYXMgdGhlIHZlcnkgZmlyc3QgZXh0cmEgZmllbGQgb2YgdGhlCisgKiBhcmNoaXZlLCBTb2xhcmlzIHdpbGwgY29uc2lkZXIgaXQgYW4gZXhlY3V0YWJsZSBqYXIgZmlsZS4KKyAqCisgKiBAc2luY2UgQW50IDEuNi4zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKYXJNYXJrZXIgaW1wbGVtZW50cyBaaXBFeHRyYUZpZWxkIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFppcFNob3J0IElEID0gbmV3IFppcFNob3J0KDB4Q0FGRSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWmlwU2hvcnQgTlVMTCA9IG5ldyBaaXBTaG9ydCgwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTk9fQllURVMgPSBuZXcgYnl0ZVswXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXJNYXJrZXIgREVGQVVMVCA9IG5ldyBKYXJNYXJrZXIoKTsKKworICAgIC8qKiBOby1hcmcgY29uc3RydWN0b3IgKi8KKyAgICBwdWJsaWMgSmFyTWFya2VyKCkgeworICAgICAgICAvLyBlbXB0eQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbmNlIEphck1hcmtlciBpcyBzdGF0ZWxlc3Mgd2UgY2FuIGFsd2F5cyB1c2UgdGhlIHNhbWUgaW5zdGFuY2UuCisgICAgICogQHJldHVybiB0aGUgREVGQVVMVCBqYXJtYWtlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEphck1hcmtlciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEhlYWRlci1JRC4KKyAgICAgKiBAcmV0dXJuIHRoZSBoZWFkZXIgaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwU2hvcnQgZ2V0SGVhZGVySWQoKSB7CisgICAgICAgIHJldHVybiBJRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZW5ndGggb2YgdGhlIGV4dHJhIGZpZWxkIGluIHRoZSBsb2NhbCBmaWxlIGRhdGEgLSB3aXRob3V0CisgICAgICogSGVhZGVyLUlEIG9yIGxlbmd0aCBzcGVjaWZpZXIuCisgICAgICogQHJldHVybiAwCisgICAgICovCisgICAgcHVibGljIFppcFNob3J0IGdldExvY2FsRmlsZURhdGFMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlbmd0aCBvZiB0aGUgZXh0cmEgZmllbGQgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IC0gd2l0aG91dAorICAgICAqIEhlYWRlci1JRCBvciBsZW5ndGggc3BlY2lmaWVyLgorICAgICAqIEByZXR1cm4gMAorICAgICAqLworICAgIHB1YmxpYyBaaXBTaG9ydCBnZXRDZW50cmFsRGlyZWN0b3J5TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWN0dWFsIGRhdGEgdG8gcHV0IGludG8gbG9jYWwgZmlsZSBkYXRhIC0gd2l0aG91dCBIZWFkZXItSUQKKyAgICAgKiBvciBsZW5ndGggc3BlY2lmaWVyLgorICAgICAqIEByZXR1cm4gdGhlIGRhdGEKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRMb2NhbEZpbGVEYXRhRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIE5PX0JZVEVTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhY3R1YWwgZGF0YSB0byBwdXQgY2VudHJhbCBkaXJlY3RvcnkgLSB3aXRob3V0IEhlYWRlci1JRCBvcgorICAgICAqIGxlbmd0aCBzcGVjaWZpZXIuCisgICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0Q2VudHJhbERpcmVjdG9yeURhdGEoKSB7CisgICAgICAgIHJldHVybiBOT19CWVRFUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSBkYXRhIGZyb20gdGhpcyBhcnJheSBhcyBpZiBpdCB3YXMgaW4gbG9jYWwgZmlsZSBkYXRhLgorICAgICAqIEBwYXJhbSBkYXRhIGFuIGFycmF5IG9mIGJ5dGVzCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgc3RhcnQgb2Zmc2V0CisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBhcnJheSBmcm9tIG9mZnNldAorICAgICAqCisgICAgICogQHRocm93cyBaaXBFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZUZyb21Mb2NhbEZpbGVEYXRhKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgWmlwRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJKYXJNYXJrZXIgZG9lc24ndCBleHBlY3QgYW55IGRhdGEiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1VuaXhTdGF0LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbml4U3RhdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYTA2NzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbml4U3RhdC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKKworLyoqCisgKiBDb25zdGFudHMgZnJvbSBzdGF0Lmggb24gVW5peCBzeXN0ZW1zLgorICoKKyAqLworLy8gQ2hlY2tTdHlsZTpJbnRlcmZhY2VJc1R5cGVDaGVjayBPRkYgLSBiYWNrd2FyZCBjb21wYXRpYmxlCitwdWJsaWMgaW50ZXJmYWNlIFVuaXhTdGF0IHsKKworICAgIC8qKgorICAgICAqIEJpdHMgdXNlZCBmb3IgcGVybWlzc2lvbnMgKGFuZCBzdGlja3kgYml0KQorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIGludCBQRVJNX01BU0sgPSAgICAgICAgICAgMDc3Nzc7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHN5bWJvbGljIGxpbmtzLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIGludCBMSU5LX0ZMQUcgPSAgICAgICAgIDAxMjAwMDA7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHBsYWluIGZpbGVzLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIGludCBGSUxFX0ZMQUcgPSAgICAgICAgIDAxMDAwMDA7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGRpcmVjdG9yaWVzLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIGludCBESVJfRkxBRyA9ICAgICAgICAgICAwNDAwMDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gc29tZXdoYXQgYXJiaXRyYXJ5IGNob2ljZXMgdGhhdCBhcmUgcXVpdGUgY29tbW9uIGZvciBzaGFyZWQKKyAgICAvLyBpbnN0YWxsYXRpb25zCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcGVybWlzc2lvbnMgZm9yIHN5bWJvbGljIGxpbmtzLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIGludCBERUZBVUxUX0xJTktfUEVSTSA9ICAgIDA3Nzc7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBwZXJtaXNzaW9ucyBmb3IgZGlyZWN0b3JpZXMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgaW50IERFRkFVTFRfRElSX1BFUk0gPSAgICAgMDc1NTsKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHBlcm1pc3Npb25zIGZvciBwbGFpbiBmaWxlcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBpbnQgREVGQVVMVF9GSUxFX1BFUk0gPSAgICAwNjQ0OworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5yZWNvZ25pemVkRXh0cmFGaWVsZC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5yZWNvZ25pemVkRXh0cmFGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZjJlNmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VbnJlY29nbml6ZWRFeHRyYUZpZWxkLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKKworLyoqCisgKiBTaW1wbGUgcGxhY2Vob2xkZXIgZm9yIGFsbCB0aG9zZSBleHRyYSBmaWVsZHMgd2UgZG9uJ3Qgd2FudCB0byBkZWFsCisgKiB3aXRoLgorICoKKyAqIDxwPkFzc3VtZXMgbG9jYWwgZmlsZSBkYXRhIGFuZCBjZW50cmFsIGRpcmVjdG9yeSBlbnRyaWVzIGFyZQorICogaWRlbnRpY2FsIC0gdW5sZXNzIHRvbGQgdGhlIG9wcG9zaXRlLjwvcD4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBVbnJlY29nbml6ZWRFeHRyYUZpZWxkIGltcGxlbWVudHMgWmlwRXh0cmFGaWVsZCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSGVhZGVyLUlELgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgWmlwU2hvcnQgaGVhZGVySWQ7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGhlYWRlciBpZC4KKyAgICAgKiBAcGFyYW0gaGVhZGVySWQgdGhlIGhlYWRlciBpZCB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJJZChaaXBTaG9ydCBoZWFkZXJJZCkgeworICAgICAgICB0aGlzLmhlYWRlcklkID0gaGVhZGVySWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBoZWFkZXIgaWQuCisgICAgICogQHJldHVybiB0aGUgaGVhZGVyIGlkCisgICAgICovCisgICAgcHVibGljIFppcFNob3J0IGdldEhlYWRlcklkKCkgeworICAgICAgICByZXR1cm4gaGVhZGVySWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmEgZmllbGQgZGF0YSBpbiBsb2NhbCBmaWxlIGRhdGEgLSB3aXRob3V0CisgICAgICogSGVhZGVyLUlEIG9yIGxlbmd0aCBzcGVjaWZpZXIuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlW10gbG9jYWxEYXRhOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBleHRyYSBmaWVsZCBkYXRhIGluIHRoZSBsb2NhbCBmaWxlIGRhdGEgLQorICAgICAqIHdpdGhvdXQgSGVhZGVyLUlEIG9yIGxlbmd0aCBzcGVjaWZpZXIuCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGZpZWxkIGRhdGEgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxGaWxlRGF0YURhdGEoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgbG9jYWxEYXRhID0gZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgbG9jYWwgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGxvY2FsIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwU2hvcnQgZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBaaXBTaG9ydChsb2NhbERhdGEubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxvY2FsIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgbG9jYWwgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0TG9jYWxGaWxlRGF0YURhdGEoKSB7CisgICAgICAgIHJldHVybiBsb2NhbERhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmEgZmllbGQgZGF0YSBpbiBjZW50cmFsIGRpcmVjdG9yeSAtIHdpdGhvdXQKKyAgICAgKiBIZWFkZXItSUQgb3IgbGVuZ3RoIHNwZWNpZmllci4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGVbXSBjZW50cmFsRGF0YTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXh0cmEgZmllbGQgZGF0YSBpbiBjZW50cmFsIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDZW50cmFsRGlyZWN0b3J5RGF0YShieXRlW10gZGF0YSkgeworICAgICAgICBjZW50cmFsRGF0YSA9IGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjZW50cmFsIGRhdGEgbGVuZ3RoLgorICAgICAqIElmIHRoZXJlIGlzIG5vIGNlbnRyYWwgZGF0YSwgZ2V0IHRoZSBsb2NhbCBmaWxlIGRhdGEgbGVuZ3RoLgorICAgICAqIEByZXR1cm4gdGhlIGNlbnRyYWwgZGF0YSBsZW5ndGgKKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwU2hvcnQgZ2V0Q2VudHJhbERpcmVjdG9yeUxlbmd0aCgpIHsKKyAgICAgICAgaWYgKGNlbnRyYWxEYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWmlwU2hvcnQoY2VudHJhbERhdGEubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2VudHJhbCBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIGNlbnRyYWwgZGF0YSBpZiBwcmVzZW50LCBlbHNlIHJldHVybiB0aGUgbG9jYWwgZmlsZSBkYXRhCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRDZW50cmFsRGlyZWN0b3J5RGF0YSgpIHsKKyAgICAgICAgaWYgKGNlbnRyYWxEYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjZW50cmFsRGF0YTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0TG9jYWxGaWxlRGF0YURhdGEoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYXJyYXkgb2YgYnl0ZXMuCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgc291cmNlIGxvY2F0aW9uIGluIHRoZSBkYXRhIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBieXRlcyB0byB1c2UgaW4gdGhlIGRhdGEgYXJyYXkuCisgICAgICogQHNlZSBaaXBFeHRyYUZpZWxkI3BhcnNlRnJvbUxvY2FsRmlsZURhdGEoYnl0ZVtdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZUZyb21Mb2NhbEZpbGVEYXRhKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9mZnNldCwgdG1wLCAwLCBsZW5ndGgpOworICAgICAgICBzZXRMb2NhbEZpbGVEYXRhRGF0YSh0bXApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVudHJ5LmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViY2VlZTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOworCisvKioKKyAqIEV4dGVuc2lvbiB0aGF0IGFkZHMgYmV0dGVyIGhhbmRsaW5nIG9mIGV4dHJhIGZpZWxkcyBhbmQgcHJvdmlkZXMKKyAqIGFjY2VzcyB0byB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBaaXBFbnRyeSBleHRlbmRzIGphdmEudXRpbC56aXAuWmlwRW50cnkgaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBMQVRGT1JNX1VOSVggPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQTEFURk9STV9GQVQgID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlRfTUFTSyA9IDB4RkZGRjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlRfU0hJRlQgPSAxNjsKKworICAgIHByaXZhdGUgaW50IGludGVybmFsQXR0cmlidXRlcyA9IDA7CisgICAgcHJpdmF0ZSBpbnQgcGxhdGZvcm0gPSBQTEFURk9STV9GQVQ7CisgICAgcHJpdmF0ZSBsb25nIGV4dGVybmFsQXR0cmlidXRlcyA9IDA7CisgICAgcHJpdmF0ZSBWZWN0b3IvKjxaaXBFeHRyYUZpZWxkPiovIGV4dHJhRmllbGRzID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgemlwIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBlbnRyeQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwRW50cnkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB6aXAgZW50cnkgd2l0aCBmaWVsZHMgdGFrZW4gZnJvbSB0aGUgc3BlY2lmaWVkIHppcCBlbnRyeS4KKyAgICAgKiBAcGFyYW0gZW50cnkgdGhlIGVudHJ5IHRvIGdldCBmaWVsZHMgZnJvbQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKiBAdGhyb3dzIFppcEV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBaaXBFbnRyeShqYXZhLnV0aWwuemlwLlppcEVudHJ5IGVudHJ5KSB0aHJvd3MgWmlwRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoZW50cnkpOworICAgICAgICBieXRlW10gZXh0cmEgPSBlbnRyeS5nZXRFeHRyYSgpOworICAgICAgICBpZiAoZXh0cmEgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RXh0cmFGaWVsZHMoRXh0cmFGaWVsZFV0aWxzLnBhcnNlKGV4dHJhKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplcyBleHRyYSBkYXRhIHRvIGFuIGVtcHR5IGJ5dGUgYXJyYXkKKyAgICAgICAgICAgIHNldEV4dHJhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHppcCBlbnRyeSB3aXRoIGZpZWxkcyB0YWtlbiBmcm9tIHRoZSBzcGVjaWZpZWQgemlwIGVudHJ5LgorICAgICAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkgdG8gZ2V0IGZpZWxkcyBmcm9tCisgICAgICogQHRocm93cyBaaXBFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIFppcEVudHJ5KFppcEVudHJ5IGVudHJ5KSB0aHJvd3MgWmlwRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcygoamF2YS51dGlsLnppcC5aaXBFbnRyeSkgZW50cnkpOworICAgICAgICBzZXRJbnRlcm5hbEF0dHJpYnV0ZXMoZW50cnkuZ2V0SW50ZXJuYWxBdHRyaWJ1dGVzKCkpOworICAgICAgICBzZXRFeHRlcm5hbEF0dHJpYnV0ZXMoZW50cnkuZ2V0RXh0ZXJuYWxBdHRyaWJ1dGVzKCkpOworICAgICAgICBzZXRFeHRyYUZpZWxkcyhlbnRyeS5nZXRFeHRyYUZpZWxkcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMS45CisgICAgICovCisgICAgcHJvdGVjdGVkIFppcEVudHJ5KCkgeworICAgICAgICBzdXBlcigiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcndyaXRlIGNsb25lLgorICAgICAqIEByZXR1cm4gYSBjbG9uZWQgY29weSBvZiB0aGlzIFppcEVudHJ5CisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIFppcEVudHJ5IGUgPSAoWmlwRW50cnkpIHN1cGVyLmNsb25lKCk7CisKKyAgICAgICAgZS5leHRyYUZpZWxkcyA9IGV4dHJhRmllbGRzICE9IG51bGwgPyAoVmVjdG9yKSBleHRyYUZpZWxkcy5jbG9uZSgpIDogbnVsbDsKKyAgICAgICAgZS5zZXRJbnRlcm5hbEF0dHJpYnV0ZXMoZ2V0SW50ZXJuYWxBdHRyaWJ1dGVzKCkpOworICAgICAgICBlLnNldEV4dGVybmFsQXR0cmlidXRlcyhnZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSk7CisgICAgICAgIGUuc2V0RXh0cmFGaWVsZHMoZ2V0RXh0cmFGaWVsZHMoKSk7CisgICAgICAgIHJldHVybiBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50ZXJuYWxBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gaW50ZXJuYWxBdHRyaWJ1dGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gdmFsdWUgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcm5hbEF0dHJpYnV0ZXMoaW50IHZhbHVlKSB7CisgICAgICAgIGludGVybmFsQXR0cmlidXRlcyA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzLgorICAgICAqIEByZXR1cm4gdGhlIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcworICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBleHRlcm5hbEF0dHJpYnV0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSB2YWx1ZSBhbiA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEF0dHJpYnV0ZXMobG9uZyB2YWx1ZSkgeworICAgICAgICBleHRlcm5hbEF0dHJpYnV0ZXMgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIFVuaXggcGVybWlzc2lvbnMgaW4gYSB3YXkgdGhhdCBpcyB1bmRlcnN0b29kIGJ5IEluZm8tWmlwJ3MKKyAgICAgKiB1bnppcCBjb21tYW5kLgorICAgICAqIEBwYXJhbSBtb2RlIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKKyAgICAgKiBAc2luY2UgQW50IDEuNS4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5peE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlckNoZWNrIE9GRiAtIG5vIHBvaW50CisgICAgICAgIHNldEV4dGVybmFsQXR0cmlidXRlcygobW9kZSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1TLURPUyByZWFkLW9ubHkgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobW9kZSAmIDAyMDApID09IDAgPyAxIDogMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1TLURPUyBkaXJlY3RvcnkgZmxhZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoaXNEaXJlY3RvcnkoKSA/IDB4MTAgOiAwKSk7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXJDaGVjayBPTgorICAgICAgICBwbGF0Zm9ybSA9IFBMQVRGT1JNX1VOSVg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5peCBwZXJtaXNzaW9uLgorICAgICAqIEByZXR1cm4gdGhlIHVuaXggcGVybWlzc2lvbnMKKyAgICAgKiBAc2luY2UgQW50IDEuNgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0VW5peE1vZGUoKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoKGdldEV4dGVybmFsQXR0cmlidXRlcygpID4+IFNIT1JUX1NISUZUKSAmIFNIT1JUX01BU0spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBsYXRmb3JtIHNwZWNpZmljYXRpb24gdG8gcHV0IGludG8gdGhlICZxdW90O3ZlcnNpb24gbWFkZQorICAgICAqIGJ5JnF1b3Q7IHBhcnQgb2YgdGhlIGNlbnRyYWwgZmlsZSBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDAgKE1TLURPUyBGQVQpIHVubGVzcyB7QGxpbmsgI3NldFVuaXhNb2RlIHNldFVuaXhNb2RlfQorICAgICAqIGhhcyBiZWVuIGNhbGxlZCwgaW4gd2hpY2ggY2FzZSAzIChVbml4KSB3aWxsIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjUuMgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGxhdGZvcm0oKSB7CisgICAgICAgIHJldHVybiBwbGF0Zm9ybTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBsYXRmb3JtIChVTklYIG9yIEZBVCkuCisgICAgICogQHBhcmFtIHBsYXRmb3JtIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUgLSAwIGlzIEZBVCwgMyBpcyBVTklYCisgICAgICogQHNpbmNlIDEuOQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFBsYXRmb3JtKGludCBwbGF0Zm9ybSkgeworICAgICAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgYWxsIGN1cnJlbnRseSBhdHRhY2hlZCBleHRyYSBmaWVsZHMgd2l0aCB0aGUgbmV3IGFycmF5LgorICAgICAqIEBwYXJhbSBmaWVsZHMgYW4gYXJyYXkgb2YgZXh0cmEgZmllbGRzCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhRmllbGRzKFppcEV4dHJhRmllbGRbXSBmaWVsZHMpIHsKKyAgICAgICAgZXh0cmFGaWVsZHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBleHRyYUZpZWxkcy5hZGRFbGVtZW50KGZpZWxkc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0RXh0cmEoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgZXh0cmEgZmllbGRzLgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGV4dHJhIGZpZWxkcworICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwRXh0cmFGaWVsZFtdIGdldEV4dHJhRmllbGRzKCkgeworICAgICAgICBpZiAoZXh0cmFGaWVsZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBaaXBFeHRyYUZpZWxkWzBdOworICAgICAgICB9CisgICAgICAgIFppcEV4dHJhRmllbGRbXSByZXN1bHQgPSBuZXcgWmlwRXh0cmFGaWVsZFtleHRyYUZpZWxkcy5zaXplKCldOworICAgICAgICBleHRyYUZpZWxkcy5jb3B5SW50byhyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gZXh0cmEgZmllbGRzIC0gcmVwbGFjaW5nIGFuIGFscmVhZHkgcHJlc2VudCBleHRyYSBmaWVsZAorICAgICAqIG9mIHRoZSBzYW1lIHR5cGUuCisgICAgICogQHBhcmFtIHplIGFuIGV4dHJhIGZpZWxkCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEV4dHJhRmllbGQoWmlwRXh0cmFGaWVsZCB6ZSkgeworICAgICAgICBpZiAoZXh0cmFGaWVsZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgZXh0cmFGaWVsZHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgWmlwU2hvcnQgdHlwZSA9IHplLmdldEhlYWRlcklkKCk7CisgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMCwgZmllbGRzU2l6ZSA9IGV4dHJhRmllbGRzLnNpemUoKTsgIWRvbmUgJiYgaSA8IGZpZWxkc1NpemU7IGkrKykgeworICAgICAgICAgICAgaWYgKCgoWmlwRXh0cmFGaWVsZCkgZXh0cmFGaWVsZHMuZWxlbWVudEF0KGkpKS5nZXRIZWFkZXJJZCgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIGV4dHJhRmllbGRzLnNldEVsZW1lbnRBdCh6ZSwgaSk7CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkb25lKSB7CisgICAgICAgICAgICBleHRyYUZpZWxkcy5hZGRFbGVtZW50KHplKTsKKyAgICAgICAgfQorICAgICAgICBzZXRFeHRyYSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleHRyYSBmaWVsZHMuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgZXh0cmEgZmllbGQgdG8gcmVtb3ZlCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUV4dHJhRmllbGQoWmlwU2hvcnQgdHlwZSkgeworICAgICAgICBpZiAoZXh0cmFGaWVsZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgZXh0cmFGaWVsZHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBmaWVsZHNTaXplID0gZXh0cmFGaWVsZHMuc2l6ZSgpOyAhZG9uZSAmJiBpIDwgZmllbGRzU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKChaaXBFeHRyYUZpZWxkKSBleHRyYUZpZWxkcy5lbGVtZW50QXQoaSkpLmdldEhlYWRlcklkKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgZXh0cmFGaWVsZHMucmVtb3ZlRWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZG9uZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0RXh0cmEoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvd3MgYW4gRXhjZXB0aW9uIGlmIGV4dHJhIGRhdGEgY2Fubm90IGJlIHBhcnNlZCBpbnRvIGV4dHJhIGZpZWxkcy4KKyAgICAgKiBAcGFyYW0gZXh0cmEgYW4gYXJyYXkgb2YgYnl0ZXMgdG8gYmUgcGFyc2VkIGludG8gZXh0cmEgZmllbGRzCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBieXRlcyBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogQHNpbmNlIDEuMQorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhKGJ5dGVbXSBleHRyYSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0RXh0cmFGaWVsZHMoRXh0cmFGaWVsZFV0aWxzLnBhcnNlKGV4dHJhKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmZvcnR1bmF0ZWx5IHtAbGluayBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbQorICAgICAqIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtfSBzZWVtcyB0byBhY2Nlc3MgdGhlIGV4dHJhIGRhdGEKKyAgICAgKiBkaXJlY3RseSwgc28gb3ZlcnJpZGluZyBnZXRFeHRyYSBkb2Vzbid0IGhlbHAgLSB3ZSBuZWVkIHRvCisgICAgICogbW9kaWZ5IHN1cGVyJ3MgZGF0YSBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFeHRyYSgpIHsKKyAgICAgICAgc3VwZXIuc2V0RXh0cmEoRXh0cmFGaWVsZFV0aWxzLm1lcmdlTG9jYWxGaWxlRGF0YURhdGEoZ2V0RXh0cmFGaWVsZHMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZXh0cmEgZGF0YSBmb3IgdGhlIGxvY2FsIGZpbGUgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBleHRyYSBkYXRhIGZvciBsb2NhbCBmaWxlCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0TG9jYWxGaWxlRGF0YUV4dHJhKCkgeworICAgICAgICBieXRlW10gZXh0cmEgPSBnZXRFeHRyYSgpOworICAgICAgICByZXR1cm4gZXh0cmEgIT0gbnVsbCA/IGV4dHJhIDogbmV3IGJ5dGVbMF07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBleHRyYSBkYXRhIGZvciB0aGUgY2VudHJhbCBkaXJlY3RvcnkuCisgICAgICogQHJldHVybiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgZXh0cmEgZGF0YQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldENlbnRyYWxEaXJlY3RvcnlFeHRyYSgpIHsKKyAgICAgICAgcmV0dXJuIEV4dHJhRmllbGRVdGlscy5tZXJnZUNlbnRyYWxEaXJlY3RvcnlEYXRhKGdldEV4dHJhRmllbGRzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2UgdGhpcyBjbGFzcyB3b3JrIGluIEpESyAxLjEgbGlrZSBhIDEuMiBjbGFzcy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZWl0aGVyIHN0b3JlcyB0aGUgc2l6ZSBmb3IgbGF0ZXIgdXNhZ2Ugb3IgaW52b2tlcworICAgICAqIHNldENvbXByZXNzZWRTaXplIHZpYSByZWZsZWN0aW9uLjwvcD4KKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSB0byB1c2UKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjcuCisgICAgICogICAgICAgICAgICAgVXNlIHNldENvbXByZXNzZWRTaXplIGRpcmVjdGx5LgorICAgICAqIEBzaW5jZSAxLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wclNpemUobG9uZyBzaXplKSB7CisgICAgICAgIHNldENvbXByZXNzZWRTaXplKHNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZW50cnkuCisgICAgICogQHJldHVybiB0aGUgZW50cnkgbmFtZQorICAgICAqIEBzaW5jZSAxLjkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lID09IG51bGwgPyBzdXBlci5nZXROYW1lKCkgOiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgZW50cnkgYSBkaXJlY3Rvcnk/CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbnRyeSBpcyBhIGRpcmVjdG9yeQorICAgICAqIEBzaW5jZSAxLjEwCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCkuZW5kc1dpdGgoIi8iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGVudHJ5LgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIHVzZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhhc2hDb2RlIG9mIHRoZSBlbnRyeS4KKyAgICAgKiBUaGlzIHVzZXMgdGhlIG5hbWUgYXMgdGhlIGhhc2hjb2RlLgorICAgICAqIEByZXR1cm4gYSBoYXNoY29kZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGhhcyBzZXZlcmUgY29uc2VxdWVuY2VzIG9uIHBlcmZvcm1hbmNlLiBXZSBjYW5ub3QgcmVseQorICAgICAgICAvLyBvbiB0aGUgc3VwZXIuaGFzaENvZGUoKSBtZXRob2Qgc2luY2Ugc3VwZXIuZ2V0TmFtZSgpIGFsd2F5cyByZXR1cm4KKyAgICAgICAgLy8gdGhlIGVtcHR5IHN0cmluZyBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRpb24gKHRoZXJlJ3Mgbm8gc2V0dGVyKQorICAgICAgICAvLyBzbyBpdCBpcyBiYXNpY2FsbHkgZHJhaW5pbmcgdGhlIHBlcmZvcm1hbmNlIG9mIGEgaGFzaG1hcCBsb29rdXAKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlcXVhbGl0eSBtZXRob2QuIEluIHRoaXMgY2FzZSwgdGhlIGltcGxlbWVudGF0aW9uIHJldHVybnMgJ3RoaXMgPT0gbycKKyAgICAgKiB3aGljaCBpcyBiYXNpY2FsbHkgdGhlIGVxdWFscyBtZXRob2Qgb2YgdGhlIE9iamVjdCBjbGFzcy4KKyAgICAgKiBAcGFyYW0gbyB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgdG8KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgaXMgdGhlIHNhbWUgYXMgPGNvZGU+bzwvY29kZT4KKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICByZXR1cm4gKHRoaXMgPT0gbyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFeHRyYUZpZWxkLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFeHRyYUZpZWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyZmYxNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEV4dHJhRmllbGQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKKworLyoqCisgKiBHZW5lcmFsIGZvcm1hdCBvZiBleHRyYSBmaWVsZCBkYXRhLgorICoKKyAqIDxwPkV4dHJhIGZpZWxkcyB1c3VhbGx5IGFwcGVhciB0d2ljZSBwZXIgZmlsZSwgb25jZSBpbiB0aGUgbG9jYWwKKyAqIGZpbGUgZGF0YSBhbmQgb25jZSBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkuICBVc3VhbGx5IHRoZXkgYXJlIHRoZQorICogc2FtZSwgYnV0IHRoZXkgZG9uJ3QgaGF2ZSB0byBiZS4gIHtAbGluaworICogamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0gamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW19IHdpbGwKKyAqIG9ubHkgdXNlIHRoZSBsb2NhbCBmaWxlIGRhdGEgaW4gYm90aCBwbGFjZXMuPC9wPgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBaaXBFeHRyYUZpZWxkIHsKKworICAgIC8qKgorICAgICAqIFRoZSBIZWFkZXItSUQuCisgICAgICogQHJldHVybiB0aGUgaGVhZGVyIGlkCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIFppcFNob3J0IGdldEhlYWRlcklkKCk7CisKKyAgICAvKioKKyAgICAgKiBMZW5ndGggb2YgdGhlIGV4dHJhIGZpZWxkIGluIHRoZSBsb2NhbCBmaWxlIGRhdGEgLSB3aXRob3V0CisgICAgICogSGVhZGVyLUlEIG9yIGxlbmd0aCBzcGVjaWZpZXIuCisgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZCBpbiB0aGUgbG9jYWwgZmlsZSBkYXRhCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIFppcFNob3J0IGdldExvY2FsRmlsZURhdGFMZW5ndGgoKTsKKworICAgIC8qKgorICAgICAqIExlbmd0aCBvZiB0aGUgZXh0cmEgZmllbGQgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IC0gd2l0aG91dAorICAgICAqIEhlYWRlci1JRCBvciBsZW5ndGggc3BlY2lmaWVyLgorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5CisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIFppcFNob3J0IGdldENlbnRyYWxEaXJlY3RvcnlMZW5ndGgoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhY3R1YWwgZGF0YSB0byBwdXQgaW50byBsb2NhbCBmaWxlIGRhdGEgLSB3aXRob3V0IEhlYWRlci1JRAorICAgICAqIG9yIGxlbmd0aCBzcGVjaWZpZXIuCisgICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBieXRlW10gZ2V0TG9jYWxGaWxlRGF0YURhdGEoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhY3R1YWwgZGF0YSB0byBwdXQgY2VudHJhbCBkaXJlY3RvcnkgLSB3aXRob3V0IEhlYWRlci1JRCBvcgorICAgICAqIGxlbmd0aCBzcGVjaWZpZXIuCisgICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBieXRlW10gZ2V0Q2VudHJhbERpcmVjdG9yeURhdGEoKTsKKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIGRhdGEgZnJvbSB0aGlzIGFycmF5IGFzIGlmIGl0IHdhcyBpbiBsb2NhbCBmaWxlIGRhdGEuCisgICAgICogQHBhcmFtIGRhdGEgYW4gYXJyYXkgb2YgYnl0ZXMKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBzdGFydCBvZmZzZXQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5IGZyb20gb2Zmc2V0CisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICogQHRocm93cyBaaXBFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICB2b2lkIHBhcnNlRnJvbUxvY2FsRmlsZURhdGEoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHRocm93cyBaaXBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBGaWxlLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3ZWRjZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEZpbGUuamF2YQpAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVyOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXBsYWNlbWVudCBmb3IgPGNvZGU+amF2YS51dGlsLlppcEZpbGU8L2NvZGU+LgorICoKKyAqIDxwPlRoaXMgY2xhc3MgYWRkcyBzdXBwb3J0IGZvciBmaWxlIG5hbWUgZW5jb2RpbmdzIG90aGVyIHRoYW4gVVRGLTgKKyAqICh3aGljaCBpcyByZXF1aXJlZCB0byB3b3JrIG9uIFpJUCBmaWxlcyBjcmVhdGVkIGJ5IG5hdGl2ZSB6aXAgdG9vbHMKKyAqIGFuZCBpcyBhYmxlIHRvIHNraXAgYSBwcmVhbWJsZSBsaWtlIHRoZSBvbmUgZm91bmQgaW4gc2VsZgorICogZXh0cmFjdGluZyBhcmNoaXZlcy4gIEZ1cnRoZXJtb3JlIGl0IHJldHVybnMgaW5zdGFuY2VzIG9mCisgKiA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBFbnRyeTwvY29kZT4gaW5zdGVhZCBvZgorICogPGNvZGU+amF2YS51dGlsLnppcC5aaXBFbnRyeTwvY29kZT4uPC9wPgorICoKKyAqIDxwPkl0IGRvZXNuJ3QgZXh0ZW5kIDxjb2RlPmphdmEudXRpbC56aXAuWmlwRmlsZTwvY29kZT4gYXMgaXQgd291bGQKKyAqIGhhdmUgdG8gcmVpbXBsZW1lbnQgYWxsIG1ldGhvZHMgYW55d2F5LiAgTGlrZQorICogPGNvZGU+amF2YS51dGlsLlppcEZpbGU8L2NvZGU+LCBpdCB1c2VzIFJhbmRvbUFjY2Vzc0ZpbGUgdW5kZXIgdGhlCisgKiBjb3ZlcnMgYW5kIHN1cHBvcnRzIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBlbnRyaWVzLjwvcD4KKyAqCisgKiA8cD5UaGUgbWV0aG9kIHNpZ25hdHVyZXMgbWltaWMgdGhlIG9uZXMgb2YKKyAqIDxjb2RlPmphdmEudXRpbC56aXAuWmlwRmlsZTwvY29kZT4sIHdpdGggYSBjb3VwbGUgb2YgZXhjZXB0aW9uczoKKyAqCisgKiA8dWw+CisgKiAgIDxsaT5UaGVyZSBpcyBubyBnZXROYW1lIG1ldGhvZC48L2xpPgorICogICA8bGk+ZW50cmllcyBoYXMgYmVlbiByZW5hbWVkIHRvIGdldEVudHJpZXMuPC9saT4KKyAqICAgPGxpPmdldEVudHJpZXMgYW5kIGdldEVudHJ5IHJldHVybgorICogICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBFbnRyeTwvY29kZT4gaW5zdGFuY2VzLjwvbGk+CisgKiAgIDxsaT5jbG9zZSBpcyBhbGxvd2VkIHRvIHRocm93IElPRXhjZXB0aW9uLjwvbGk+CisgKiA8L3VsPgorICoKKyAqLworcHVibGljIGNsYXNzIFppcEZpbGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIX1NJWkUgPSA1MDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIT1JUICAgICA9ICAgMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV09SRCAgICAgID0gICA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOSUJMRVRfTUFTSyA9IDB4MGY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfU0hJRlQgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NfMCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPU18xID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TXzIgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NfMyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBNYXBzIFppcEVudHJ5cyB0byBMb25ncywgcmVjb3JkaW5nIHRoZSBvZmZzZXRzIG9mIHRoZSBsb2NhbAorICAgICAqIGZpbGUgaGVhZGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBlbnRyaWVzID0gbmV3IEhhc2h0YWJsZShIQVNIX1NJWkUpOworCisgICAgLyoqCisgICAgICogTWFwcyBTdHJpbmcgdG8gWmlwRW50cnlzLCBuYW1lIC0+IGFjdHVhbCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBuYW1lTWFwID0gbmV3IEhhc2h0YWJsZShIQVNIX1NJWkUpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgT2Zmc2V0RW50cnkgeworICAgICAgICBwcml2YXRlIGxvbmcgaGVhZGVyT2Zmc2V0ID0gLTE7CisgICAgICAgIHByaXZhdGUgbG9uZyBkYXRhT2Zmc2V0ID0gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzIGFuZCB0aGUgZmlsZSBjb21tZW50LgorICAgICAqCisgICAgICogPHA+Rm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlIDxhCisgICAgICogaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uCisgICAgICogRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBhY3R1YWwgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIGFyY2hpdmU7CisKKyAgICAvKioKKyAgICAgKiBPcGVucyB0aGUgZ2l2ZW4gZmlsZSBmb3IgcmVhZGluZywgYXNzdW1pbmcgdGhlIHBsYXRmb3JtJ3MKKyAgICAgKiBuYXRpdmUgZW5jb2RpbmcgZm9yIGZpbGUgbmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZiB0aGUgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIFppcEZpbGUoRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKGYsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIHRoZSBnaXZlbiBmaWxlIGZvciByZWFkaW5nLCBhc3N1bWluZyB0aGUgcGxhdGZvcm0ncworICAgICAqIG5hdGl2ZSBlbmNvZGluZyBmb3IgZmlsZSBuYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBaaXBGaWxlKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKG5ldyBGaWxlKG5hbWUpLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyB0aGUgZ2l2ZW4gZmlsZSBmb3IgcmVhZGluZywgYXNzdW1pbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGVuY29kaW5nIGZvciBmaWxlIG5hbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgYXJjaGl2ZS4KKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZSBuYW1lcworICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWmlwRmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKG5ldyBGaWxlKG5hbWUpLCBlbmNvZGluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIGdpdmVuIGZpbGUgZm9yIHJlYWRpbmcsIGFzc3VtaW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBlbmNvZGluZyBmb3IgZmlsZSBuYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIHRoZSBhcmNoaXZlLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlIG5hbWVzCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBaaXBGaWxlKEZpbGUgZiwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgIGFyY2hpdmUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmLCAiciIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcG9wdWxhdGVGcm9tQ2VudHJhbERpcmVjdG9yeSgpOworICAgICAgICAgICAgcmVzb2x2ZUxvY2FsRmlsZUhlYWRlckRhdGEoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIC8vIHN3YWxsb3csIHRocm93IHRoZSBvcmlnaW5hbCBleGNlcHRpb24gaW5zdGVhZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBhbmQgdGhlIGZpbGUgY29tbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbCBpZiB1c2luZyB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBhcmNoaXZlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGNsb3NpbmcgdGhlIGFyY2hpdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhcmNoaXZlLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xvc2UgYSB6aXBmaWxlIHF1aWV0bHk7IHRocm93IG5vIGlvIGZhdWx0LCBkbyBub3RoaW5nCisgICAgICogb24gYSBudWxsIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSB6aXBmaWxlIGZpbGUgdG8gY2xvc2UsIGNhbiBiZSBudWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUXVpZXRseShaaXBGaWxlIHppcGZpbGUpIHsKKyAgICAgICAgaWYgKHppcGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIGVudHJpZXMuCisgICAgICogQHJldHVybiBhbGwgZW50cmllcyBhcyB7QGxpbmsgWmlwRW50cnl9IGluc3RhbmNlcworICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gZW50cmllcy5rZXlzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5hbWVkIGVudHJ5IC0gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZW50cnkgYnkKKyAgICAgKiB0aGF0IG5hbWUgZXhpc3RzLgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGVudHJ5LgorICAgICAqIEByZXR1cm4gdGhlIFppcEVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG5hbWUgLSBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBaaXBFbnRyeSBnZXRFbnRyeShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKFppcEVudHJ5KSBuYW1lTWFwLmdldChuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIElucHV0U3RyZWFtIGZvciByZWFkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZW50cnkuCisgICAgICogQHBhcmFtIHplIHRoZSBlbnRyeSB0byBnZXQgdGhlIHN0cmVhbSBmb3IuCisgICAgICogQHJldHVybiBhIHN0cmVhbSB0byByZWFkIHRoZSBlbnRyeSBmcm9tLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gZnJvbSB0aGUgemlwZW50eQorICAgICAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uIGlmIHRoZSB6aXBlbnRyeSBoYXMgYW4gdW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFppcEVudHJ5IHplKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFppcEV4Y2VwdGlvbiB7CisgICAgICAgIE9mZnNldEVudHJ5IG9mZnNldEVudHJ5ID0gKE9mZnNldEVudHJ5KSBlbnRyaWVzLmdldCh6ZSk7CisgICAgICAgIGlmIChvZmZzZXRFbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBsb25nIHN0YXJ0ID0gb2Zmc2V0RW50cnkuZGF0YU9mZnNldDsKKyAgICAgICAgQm91bmRlZElucHV0U3RyZWFtIGJpcyA9CisgICAgICAgICAgICBuZXcgQm91bmRlZElucHV0U3RyZWFtKHN0YXJ0LCB6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpKTsKKyAgICAgICAgc3dpdGNoICh6ZS5nZXRNZXRob2QoKSkgeworICAgICAgICAgICAgY2FzZSBaaXBFbnRyeS5TVE9SRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpczsKKyAgICAgICAgICAgIGNhc2UgWmlwRW50cnkuREVGTEFURUQ6CisgICAgICAgICAgICAgICAgYmlzLmFkZER1bW15KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKGJpcywgbmV3IEluZmxhdGVyKHRydWUpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiRm91bmQgdW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgemUuZ2V0TWV0aG9kKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENGSF9MRU4gPQorICAgICAgICAvKiB2ZXJzaW9uIG1hZGUgYnkgICAgICAgICAgICAgICAgICovIFNIT1JUCisgICAgICAgIC8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgKi8gKyBTSE9SVAorICAgICAgICAvKiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgICAgICAgICovICsgU0hPUlQKKyAgICAgICAgLyogY29tcHJlc3Npb24gbWV0aG9kICAgICAgICAgICAgICAqLyArIFNIT1JUCisgICAgICAgIC8qIGxhc3QgbW9kIGZpbGUgdGltZSAgICAgICAgICAgICAgKi8gKyBTSE9SVAorICAgICAgICAvKiBsYXN0IG1vZCBmaWxlIGRhdGUgICAgICAgICAgICAgICovICsgU0hPUlQKKyAgICAgICAgLyogY3JjLTMyICAgICAgICAgICAgICAgICAgICAgICAgICAqLyArIFdPUkQKKyAgICAgICAgLyogY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgICAqLyArIFdPUkQKKyAgICAgICAgLyogdW5jb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICAqLyArIFdPUkQKKyAgICAgICAgLyogZmlsZW5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAqLyArIFNIT1JUCisgICAgICAgIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAgICAgICAgICAgICAgKi8gKyBTSE9SVAorICAgICAgICAvKiBmaWxlIGNvbW1lbnQgbGVuZ3RoICAgICAgICAgICAgICovICsgU0hPUlQKKyAgICAgICAgLyogZGlzayBudW1iZXIgc3RhcnQgICAgICAgICAgICAgICAqLyArIFNIT1JUCisgICAgICAgIC8qIGludGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgKi8gKyBTSE9SVAorICAgICAgICAvKiBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgICovICsgV09SRAorICAgICAgICAvKiByZWxhdGl2ZSBvZmZzZXQgb2YgbG9jYWwgaGVhZGVyICovICsgV09SRDsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBvZiB0aGUgZ2l2ZW4gYXJjaGl2ZSBhbmQgcG9wdWxhdGVzCisgICAgICogdGhlIGludGVybmFsIHRhYmxlcyB3aXRoIFppcEVudHJ5IGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIDxwPlRoZSBaaXBFbnRyeXMgd2lsbCBrbm93IGFsbCBkYXRhIHRoYXQgY2FuIGJlIG9idGFpbmVkIGZyb20KKyAgICAgKiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgYWxvbmUsIGJ1dCBub3QgdGhlIGRhdGEgdGhhdCByZXF1aXJlcyB0aGUKKyAgICAgKiBsb2NhbCBmaWxlIGhlYWRlciBvciBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgcmVhZC48L3A+CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRnJvbUNlbnRyYWxEaXJlY3RvcnkoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwb3NpdGlvbkF0Q2VudHJhbERpcmVjdG9yeSgpOworCisgICAgICAgIGJ5dGVbXSBjZmggPSBuZXcgYnl0ZVtDRkhfTEVOXTsKKworICAgICAgICBieXRlW10gc2lnbmF0dXJlQnl0ZXMgPSBuZXcgYnl0ZVtXT1JEXTsKKyAgICAgICAgYXJjaGl2ZS5yZWFkRnVsbHkoc2lnbmF0dXJlQnl0ZXMpOworICAgICAgICBsb25nIHNpZyA9IFppcExvbmcuZ2V0VmFsdWUoc2lnbmF0dXJlQnl0ZXMpOworICAgICAgICBmaW5hbCBsb25nIGNmaFNpZyA9IFppcExvbmcuZ2V0VmFsdWUoWmlwT3V0cHV0U3RyZWFtLkNGSF9TSUcpOworICAgICAgICB3aGlsZSAoc2lnID09IGNmaFNpZykgeworICAgICAgICAgICAgYXJjaGl2ZS5yZWFkRnVsbHkoY2ZoKTsKKyAgICAgICAgICAgIGludCBvZmYgPSAwOworICAgICAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoKTsKKworICAgICAgICAgICAgaW50IHZlcnNpb25NYWRlQnkgPSBaaXBTaG9ydC5nZXRWYWx1ZShjZmgsIG9mZik7CisgICAgICAgICAgICBvZmYgKz0gU0hPUlQ7CisgICAgICAgICAgICB6ZS5zZXRQbGF0Zm9ybSgodmVyc2lvbk1hZGVCeSA+PiBCWVRFX1NISUZUKSAmIE5JQkxFVF9NQVNLKTsKKworICAgICAgICAgICAgb2ZmICs9IFdPUkQ7IC8vIHNraXAgdmVyc2lvbiBpbmZvIGFuZCBnZW5lcmFsIHB1cnBvc2UgYnl0ZQorCisgICAgICAgICAgICB6ZS5zZXRNZXRob2QoWmlwU2hvcnQuZ2V0VmFsdWUoY2ZoLCBvZmYpKTsKKyAgICAgICAgICAgIG9mZiArPSBTSE9SVDsKKworICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBpcyBhY3R1YWxseSBub3QgdmVyeSBjcHUgY3ljbGVzIGZyaWVuZGx5IGFzIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20KKyAgICAgICAgICAgIC8vIGRvcyB0byBqYXZhIHdoaWxlIHRoZSB1bmRlcmx5aW5nIFN1biBpbXBsZW1lbnRhdGlvbiB3aWxsIGNvbnZlcnQKKyAgICAgICAgICAgIC8vIGZyb20gamF2YSB0byBkb3MgdGltZSBmb3IgaW50ZXJuYWwgc3RvcmFnZS4uLgorICAgICAgICAgICAgbG9uZyB0aW1lID0gZG9zVG9KYXZhVGltZShaaXBMb25nLmdldFZhbHVlKGNmaCwgb2ZmKSk7CisgICAgICAgICAgICB6ZS5zZXRUaW1lKHRpbWUpOworICAgICAgICAgICAgb2ZmICs9IFdPUkQ7CisKKyAgICAgICAgICAgIHplLnNldENyYyhaaXBMb25nLmdldFZhbHVlKGNmaCwgb2ZmKSk7CisgICAgICAgICAgICBvZmYgKz0gV09SRDsKKworICAgICAgICAgICAgemUuc2V0Q29tcHJlc3NlZFNpemUoWmlwTG9uZy5nZXRWYWx1ZShjZmgsIG9mZikpOworICAgICAgICAgICAgb2ZmICs9IFdPUkQ7CisKKyAgICAgICAgICAgIHplLnNldFNpemUoWmlwTG9uZy5nZXRWYWx1ZShjZmgsIG9mZikpOworICAgICAgICAgICAgb2ZmICs9IFdPUkQ7CisKKyAgICAgICAgICAgIGludCBmaWxlTmFtZUxlbiA9IFppcFNob3J0LmdldFZhbHVlKGNmaCwgb2ZmKTsKKyAgICAgICAgICAgIG9mZiArPSBTSE9SVDsKKworICAgICAgICAgICAgaW50IGV4dHJhTGVuID0gWmlwU2hvcnQuZ2V0VmFsdWUoY2ZoLCBvZmYpOworICAgICAgICAgICAgb2ZmICs9IFNIT1JUOworCisgICAgICAgICAgICBpbnQgY29tbWVudExlbiA9IFppcFNob3J0LmdldFZhbHVlKGNmaCwgb2ZmKTsKKyAgICAgICAgICAgIG9mZiArPSBTSE9SVDsKKworICAgICAgICAgICAgb2ZmICs9IFNIT1JUOyAvLyBkaXNrIG51bWJlcgorCisgICAgICAgICAgICB6ZS5zZXRJbnRlcm5hbEF0dHJpYnV0ZXMoWmlwU2hvcnQuZ2V0VmFsdWUoY2ZoLCBvZmYpKTsKKyAgICAgICAgICAgIG9mZiArPSBTSE9SVDsKKworICAgICAgICAgICAgemUuc2V0RXh0ZXJuYWxBdHRyaWJ1dGVzKFppcExvbmcuZ2V0VmFsdWUoY2ZoLCBvZmYpKTsKKyAgICAgICAgICAgIG9mZiArPSBXT1JEOworCisgICAgICAgICAgICBieXRlW10gZmlsZU5hbWUgPSBuZXcgYnl0ZVtmaWxlTmFtZUxlbl07CisgICAgICAgICAgICBhcmNoaXZlLnJlYWRGdWxseShmaWxlTmFtZSk7CisgICAgICAgICAgICB6ZS5zZXROYW1lKGdldFN0cmluZyhmaWxlTmFtZSkpOworCisKKyAgICAgICAgICAgIC8vIExGSCBvZmZzZXQsCisgICAgICAgICAgICBPZmZzZXRFbnRyeSBvZmZzZXQgPSBuZXcgT2Zmc2V0RW50cnkoKTsKKyAgICAgICAgICAgIG9mZnNldC5oZWFkZXJPZmZzZXQgPSBaaXBMb25nLmdldFZhbHVlKGNmaCwgb2ZmKTsKKyAgICAgICAgICAgIC8vIGRhdGEgb2Zmc2V0IHdpbGwgYmUgZmlsbGVkIGxhdGVyCisgICAgICAgICAgICBlbnRyaWVzLnB1dCh6ZSwgb2Zmc2V0KTsKKworICAgICAgICAgICAgbmFtZU1hcC5wdXQoemUuZ2V0TmFtZSgpLCB6ZSk7CisKKyAgICAgICAgICAgIGFyY2hpdmUuc2tpcEJ5dGVzKGV4dHJhTGVuKTsKKworICAgICAgICAgICAgYnl0ZVtdIGNvbW1lbnQgPSBuZXcgYnl0ZVtjb21tZW50TGVuXTsKKyAgICAgICAgICAgIGFyY2hpdmUucmVhZEZ1bGx5KGNvbW1lbnQpOworICAgICAgICAgICAgemUuc2V0Q29tbWVudChnZXRTdHJpbmcoY29tbWVudCkpOworCisgICAgICAgICAgICBhcmNoaXZlLnJlYWRGdWxseShzaWduYXR1cmVCeXRlcyk7CisgICAgICAgICAgICBzaWcgPSBaaXBMb25nLmdldFZhbHVlKHNpZ25hdHVyZUJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fRU9DRF9TSVpFID0KKyAgICAgICAgLyogZW5kIG9mIGNlbnRyYWwgZGlyIHNpZ25hdHVyZSAgICAqLyBXT1JECisgICAgICAgIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgICAgICAgICAgICAgKi8gKyBTSE9SVAorICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgICAgICovCisgICAgICAgIC8qIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgKi8gKyBTSE9SVAorICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiAgICAgICovCisgICAgICAgIC8qIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgICAgKi8gKyBTSE9SVAorICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiAgICAgICovCisgICAgICAgIC8qIHRoZSBjZW50cmFsIGRpciAgICAgICAgICAgICAgICAgKi8gKyBTSE9SVAorICAgICAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgICovICsgV09SRAorICAgICAgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCAgICAgICovCisgICAgICAgIC8qIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gICAgICAgKi8KKyAgICAgICAgLyogdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICAgICAgICAqLyArIFdPUkQKKyAgICAgICAgLyogemlwZmlsZSBjb21tZW50IGxlbmd0aCAgICAgICAgICAqLyArIFNIT1JUOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENGRF9MT0NBVE9SX09GRlNFVCA9CisgICAgICAgIC8qIGVuZCBvZiBjZW50cmFsIGRpciBzaWduYXR1cmUgICAgKi8gV09SRAorICAgICAgICAvKiBudW1iZXIgb2YgdGhpcyBkaXNrICAgICAgICAgICAgICovICsgU0hPUlQKKyAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlICAgICAqLworICAgICAgICAvKiBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICovICsgU0hPUlQKKyAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gICAgICAqLworICAgICAgICAvKiB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICAgICovICsgU0hPUlQKKyAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gICAgICAqLworICAgICAgICAvKiB0aGUgY2VudHJhbCBkaXIgICAgICAgICAgICAgICAgICovICsgU0hPUlQKKyAgICAgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICAqLyArIFdPUkQ7CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBmb3IgdGhlICZxdW90O0VuZCBvZiBjZW50cmFsIGRpciByZWNvcmQmcXVvdDssIHBhcnNlcworICAgICAqIGl0IGFuZCBwb3NpdGlvbnMgdGhlIHN0cmVhbSBhdCB0aGUgZmlyc3QgY2VudHJhbCBkaXJlY3RvcnkKKyAgICAgKiByZWNvcmQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvc2l0aW9uQXRDZW50cmFsRGlyZWN0b3J5KCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBsb25nIG9mZiA9IGFyY2hpdmUubGVuZ3RoKCkgLSBNSU5fRU9DRF9TSVpFOworICAgICAgICBpZiAob2ZmID49IDApIHsKKyAgICAgICAgICAgIGFyY2hpdmUuc2VlayhvZmYpOworICAgICAgICAgICAgYnl0ZVtdIHNpZyA9IFppcE91dHB1dFN0cmVhbS5FT0NEX1NJRzsKKyAgICAgICAgICAgIGludCBjdXJyID0gYXJjaGl2ZS5yZWFkKCk7CisgICAgICAgICAgICB3aGlsZSAoY3VyciAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyID09IHNpZ1tQT1NfMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyciA9IGFyY2hpdmUucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PSBzaWdbUE9TXzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gYXJjaGl2ZS5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PSBzaWdbUE9TXzJdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGFyY2hpdmUucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09IHNpZ1tQT1NfM10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXJjaGl2ZS5zZWVrKC0tb2ZmKTsKKyAgICAgICAgICAgICAgICBjdXJyID0gYXJjaGl2ZS5yZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiYXJjaGl2ZSBpcyBub3QgYSBaSVAgYXJjaGl2ZSIpOworICAgICAgICB9CisgICAgICAgIGFyY2hpdmUuc2VlayhvZmYgKyBDRkRfTE9DQVRPUl9PRkZTRVQpOworICAgICAgICBieXRlW10gY2ZkT2Zmc2V0ID0gbmV3IGJ5dGVbV09SRF07CisgICAgICAgIGFyY2hpdmUucmVhZEZ1bGx5KGNmZE9mZnNldCk7CisgICAgICAgIGFyY2hpdmUuc2VlayhaaXBMb25nLmdldFZhbHVlKGNmZE9mZnNldCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBieXRlcyBpbiBsb2NhbCBmaWxlIGhlYWRlciB1cCB0byB0aGUgJnF1b3Q7bGVuZ3RoIG9mCisgICAgICogZmlsZW5hbWUmcXVvdDsgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBMRkhfT0ZGU0VUX0ZPUl9GSUxFTkFNRV9MRU5HVEggPQorICAgICAgICAvKiBsb2NhbCBmaWxlIGhlYWRlciBzaWduYXR1cmUgICAgICovIFdPUkQKKyAgICAgICAgLyogdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAgICAgICAqLyArIFNIT1JUCisgICAgICAgIC8qIGdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZyAgICAgICAgKi8gKyBTSE9SVAorICAgICAgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgICAgICAgICAgICAgICovICsgU0hPUlQKKyAgICAgICAgLyogbGFzdCBtb2QgZmlsZSB0aW1lICAgICAgICAgICAgICAqLyArIFNIT1JUCisgICAgICAgIC8qIGxhc3QgbW9kIGZpbGUgZGF0ZSAgICAgICAgICAgICAgKi8gKyBTSE9SVAorICAgICAgICAvKiBjcmMtMzIgICAgICAgICAgICAgICAgICAgICAgICAgICovICsgV09SRAorICAgICAgICAvKiBjb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICAgICovICsgV09SRAorICAgICAgICAvKiB1bmNvbXByZXNzZWQgc2l6ZSAgICAgICAgICAgICAgICovICsgV09SRDsKKworICAgIC8qKgorICAgICAqIFdhbGtzIHRocm91Z2ggYWxsIHJlY29yZGVkIGVudHJpZXMgYW5kIGFkZHMgdGhlIGRhdGEgYXZhaWxhYmxlCisgICAgICogZnJvbSB0aGUgbG9jYWwgZmlsZSBoZWFkZXIuCisgICAgICoKKyAgICAgKiA8cD5BbHNvIHJlY29yZHMgdGhlIG9mZnNldHMgZm9yIHRoZSBkYXRhIHRvIHJlYWQgZnJvbSB0aGUKKyAgICAgKiBlbnRyaWVzLjwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUxvY2FsRmlsZUhlYWRlckRhdGEoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RW50cmllcygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgWmlwRW50cnkgemUgPSAoWmlwRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIE9mZnNldEVudHJ5IG9mZnNldEVudHJ5ID0gKE9mZnNldEVudHJ5KSBlbnRyaWVzLmdldCh6ZSk7CisgICAgICAgICAgICBsb25nIG9mZnNldCA9IG9mZnNldEVudHJ5LmhlYWRlck9mZnNldDsKKyAgICAgICAgICAgIGFyY2hpdmUuc2VlayhvZmZzZXQgKyBMRkhfT0ZGU0VUX0ZPUl9GSUxFTkFNRV9MRU5HVEgpOworICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVtTSE9SVF07CisgICAgICAgICAgICBhcmNoaXZlLnJlYWRGdWxseShiKTsKKyAgICAgICAgICAgIGludCBmaWxlTmFtZUxlbiA9IFppcFNob3J0LmdldFZhbHVlKGIpOworICAgICAgICAgICAgYXJjaGl2ZS5yZWFkRnVsbHkoYik7CisgICAgICAgICAgICBpbnQgZXh0cmFGaWVsZExlbiA9IFppcFNob3J0LmdldFZhbHVlKGIpOworICAgICAgICAgICAgYXJjaGl2ZS5za2lwQnl0ZXMoZmlsZU5hbWVMZW4pOworICAgICAgICAgICAgYnl0ZVtdIGxvY2FsRXh0cmFEYXRhID0gbmV3IGJ5dGVbZXh0cmFGaWVsZExlbl07CisgICAgICAgICAgICBhcmNoaXZlLnJlYWRGdWxseShsb2NhbEV4dHJhRGF0YSk7CisgICAgICAgICAgICB6ZS5zZXRFeHRyYShsb2NhbEV4dHJhRGF0YSk7CisgICAgICAgICAgICAvKmRhdGFPZmZzZXRzLnB1dCh6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhvZmZzZXQgKyBMRkhfT0ZGU0VUX0ZPUl9GSUxFTkFNRV9MRU5HVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNIT1JUICsgU0hPUlQgKyBmaWxlTmFtZUxlbiArIGV4dHJhRmllbGRMZW4pKTsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBvZmZzZXRFbnRyeS5kYXRhT2Zmc2V0ID0gb2Zmc2V0ICsgTEZIX09GRlNFVF9GT1JfRklMRU5BTUVfTEVOR1RICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTSE9SVCArIFNIT1JUICsgZmlsZU5hbWVMZW4gKyBleHRyYUZpZWxkTGVuOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIERPUyBkYXRlL3RpbWUgZmllbGQgdG8gYSBEYXRlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB6aXBEb3NUaW1lIGNvbnRhaW5zIHRoZSBzdG9yZWQgRE9TIHRpbWUuCisgICAgICogQHJldHVybiBhIERhdGUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdGltZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIERhdGUgZnJvbURvc1RpbWUoWmlwTG9uZyB6aXBEb3NUaW1lKSB7CisgICAgICAgIGxvbmcgZG9zVGltZSA9IHppcERvc1RpbWUuZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRvc1RvSmF2YVRpbWUoZG9zVGltZSkpOworICAgIH0KKworICAgIC8qCisgICAgICogQ29udmVydHMgRE9TIHRpbWUgdG8gSmF2YSB0aW1lIChudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGRvc1RvSmF2YVRpbWUobG9uZyBkb3NUaW1lKSB7CisgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXJDaGVjayBPRkYgLSBubyBwb2ludAorICAgICAgICBjYWwuc2V0KENhbGVuZGFyLllFQVIsIChpbnQpICgoZG9zVGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODApOworICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1PTlRILCAoaW50KSAoKGRvc1RpbWUgPj4gMjEpICYgMHgwZikgLSAxKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5EQVRFLCAoaW50KSAoZG9zVGltZSA+PiAxNikgJiAweDFmKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5IT1VSX09GX0RBWSwgKGludCkgKGRvc1RpbWUgPj4gMTEpICYgMHgxZik7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCAoaW50KSAoZG9zVGltZSA+PiA1KSAmIDB4M2YpOworICAgICAgICBjYWwuc2V0KENhbGVuZGFyLlNFQ09ORCwgKGludCkgKGRvc1RpbWUgPDwgMSkgJiAweDNlKTsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlckNoZWNrIE9OCisgICAgICAgIHJldHVybiBjYWwuZ2V0VGltZSgpLmdldFRpbWUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGEgU3RyaW5nIGZyb20gdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHRoZSBlbmNvZGluZyBzZXQKKyAgICAgKiBmb3IgdGhpcyBaaXBGaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlIGFycmF5IHRvIHRyYW5zZm9ybQorICAgICAqIEByZXR1cm4gU3RyaW5nIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZworICAgICAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uIGlmIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgcmVjb2duaXplZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZyhieXRlW10gYnl0ZXMpIHRocm93cyBaaXBFeGNlcHRpb24geworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgZW5jb2RpbmcpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKHVlZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5wdXRTdHJlYW0gdGhhdCBkZWxlZ2F0ZXMgcmVxdWVzdHMgdG8gdGhlIHVuZGVybHlpbmcKKyAgICAgKiBSYW5kb21BY2Nlc3NGaWxlLCBtYWtpbmcgc3VyZSB0aGF0IG9ubHkgYnl0ZXMgZnJvbSBhIGNlcnRhaW4KKyAgICAgKiByYW5nZSBjYW4gYmUgcmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEJvdW5kZWRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHJlbWFpbmluZzsKKyAgICAgICAgcHJpdmF0ZSBsb25nIGxvYzsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZER1bW15Qnl0ZSA9IGZhbHNlOworCisgICAgICAgIEJvdW5kZWRJbnB1dFN0cmVhbShsb25nIHN0YXJ0LCBsb25nIHJlbWFpbmluZykgeworICAgICAgICAgICAgdGhpcy5yZW1haW5pbmcgPSByZW1haW5pbmc7CisgICAgICAgICAgICBsb2MgPSBzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVtYWluaW5nLS0gPD0gMCkgeworICAgICAgICAgICAgICAgIGlmIChhZGREdW1teUJ5dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkRHVtbXlCeXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGFyY2hpdmUpIHsKKyAgICAgICAgICAgICAgICBhcmNoaXZlLnNlZWsobG9jKyspOworICAgICAgICAgICAgICAgIHJldHVybiBhcmNoaXZlLnJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgeworICAgICAgICAgICAgICAgIGlmIChhZGREdW1teUJ5dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkRHVtbXlCeXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJbb2ZmXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW4gPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGVuID4gcmVtYWluaW5nKSB7CisgICAgICAgICAgICAgICAgbGVuID0gKGludCkgcmVtYWluaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHJldCA9IC0xOworICAgICAgICAgICAgc3luY2hyb25pemVkIChhcmNoaXZlKSB7CisgICAgICAgICAgICAgICAgYXJjaGl2ZS5zZWVrKGxvYyk7CisgICAgICAgICAgICAgICAgcmV0ID0gYXJjaGl2ZS5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgbG9jICs9IHJldDsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmZsYXRlciBuZWVkcyBhbiBleHRyYSBkdW1teSBieXRlIGZvciBub3dyYXAgLSBzZWUKKyAgICAgICAgICogSW5mbGF0ZXIncyBqYXZhZG9jcy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkRHVtbXkoKSB7CisgICAgICAgICAgICBhZGREdW1teUJ5dGUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBMb25nLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBMb25nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3Zjk1NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcExvbmcuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgZm91ciBieXRlIGludGVnZXIgd2l0aCBjb252ZXJzaW9uCisgKiBydWxlcyBmb3IgdGhlIGJpZyBlbmRpYW4gYnl0ZSBvcmRlciBvZiBaSVAgZmlsZXMuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgWmlwTG9uZyBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV09SRCA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfQklUX1NJWkUgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFX01BU0sgPSAweEZGOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfMSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfMV9NQVNLID0gMHhGRjAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFXzFfU0hJRlQgPSA4OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfMiA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfMl9NQVNLID0gMHhGRjAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfMl9TSElGVCA9IDE2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfMyA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCWVRFXzNfTUFTSyA9IDB4RkYwMDAwMDBMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFXzNfU0hJRlQgPSAyNDsKKworICAgIHByaXZhdGUgbG9uZyB2YWx1ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBpbnN0YW5jZSBmcm9tIGEgbnVtYmVyLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbG9uZyB0byBzdG9yZSBhcyBhIFppcExvbmcKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIFppcExvbmcobG9uZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gYnl0ZXMuCisgICAgICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlcyB0byBzdG9yZSBhcyBhIFppcExvbmcKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIFppcExvbmcgKGJ5dGVbXSBieXRlcykgeworICAgICAgICB0aGlzKGJ5dGVzLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgaW5zdGFuY2UgZnJvbSB0aGUgZm91ciBieXRlcyBzdGFydGluZyBhdCBvZmZzZXQuCisgICAgICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlcyB0byBzdG9yZSBhcyBhIFppcExvbmcKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gc3RhcnQKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIFppcExvbmcgKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCkgeworICAgICAgICB2YWx1ZSA9IFppcExvbmcuZ2V0VmFsdWUoYnl0ZXMsIG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHZhbHVlIGFzIGZvdXIgYnl0ZXMgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyLgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKiBAcmV0dXJuIHZhbHVlIGFzIGZvdXIgYnl0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlcgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7CisgICAgICAgIHJldHVybiBaaXBMb25nLmdldEJ5dGVzKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdmFsdWUgYXMgSmF2YSBsb25nLgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKiBAcmV0dXJuIHZhbHVlIGFzIGEgbG9uZworICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHZhbHVlIGFzIGZvdXIgYnl0ZXMgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY29udmVydAorICAgICAqIEByZXR1cm4gdmFsdWUgYXMgZm91ciBieXRlcyBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRCeXRlcyhsb25nIHZhbHVlKSB7CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtXT1JEXTsKKyAgICAgICAgcmVzdWx0WzBdID0gKGJ5dGUpICgodmFsdWUgJiBCWVRFX01BU0spKTsKKyAgICAgICAgcmVzdWx0W0JZVEVfMV0gPSAoYnl0ZSkgKCh2YWx1ZSAmIEJZVEVfMV9NQVNLKSA+PiBCWVRFXzFfU0hJRlQpOworICAgICAgICByZXN1bHRbQllURV8yXSA9IChieXRlKSAoKHZhbHVlICYgQllURV8yX01BU0spID4+IEJZVEVfMl9TSElGVCk7CisgICAgICAgIHJlc3VsdFtCWVRFXzNdID0gKGJ5dGUpICgodmFsdWUgJiBCWVRFXzNfTUFTSykgPj4gQllURV8zX1NISUZUKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgdmFsdWUgYXMgYSBKYXZhIGxvbmcgZnJvbSBmb3VyIGJ5dGVzIHN0YXJ0aW5nIGF0IGdpdmVuIGFycmF5IG9mZnNldAorICAgICAqIEBwYXJhbSBieXRlcyB0aGUgYXJyYXkgb2YgYnl0ZXMKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gc3RhcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kYW5kaW5nIEphdmEgbG9uZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRWYWx1ZShieXRlW10gYnl0ZXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgbG9uZyB2YWx1ZSA9IChieXRlc1tvZmZzZXQgKyBCWVRFXzNdIDw8IEJZVEVfM19TSElGVCkgJiBCWVRFXzNfTUFTSzsKKyAgICAgICAgdmFsdWUgKz0gKGJ5dGVzW29mZnNldCArIEJZVEVfMl0gPDwgQllURV8yX1NISUZUKSAmIEJZVEVfMl9NQVNLOworICAgICAgICB2YWx1ZSArPSAoYnl0ZXNbb2Zmc2V0ICsgQllURV8xXSA8PCBCWVRFXzFfU0hJRlQpICYgQllURV8xX01BU0s7CisgICAgICAgIHZhbHVlICs9IChieXRlc1tvZmZzZXRdICYgQllURV9NQVNLKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSB2YWx1ZSBhcyBhIEphdmEgbG9uZyBmcm9tIGEgZm91ci1ieXRlIGFycmF5CisgICAgICogQHBhcmFtIGJ5dGVzIHRoZSBhcnJheSBvZiBieXRlcworICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRhbmRpbmcgSmF2YSBsb25nIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldFZhbHVlKGJ5dGVbXSBieXRlcykgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUoYnl0ZXMsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRvIG1ha2UgdHdvIGluc3RhbmNlcyB3aXRoIHNhbWUgdmFsdWUgZXF1YWwuCisgICAgICogQHBhcmFtIG8gYW4gb2JqZWN0IHRvIGNvbXBhcmUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWFsCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxsIHx8ICEobyBpbnN0YW5jZW9mIFppcExvbmcpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlID09ICgoWmlwTG9uZykgbykuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0byBtYWtlIHR3byBpbnN0YW5jZXMgd2l0aCBzYW1lIHZhbHVlIGVxdWFsLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgWmlwTG9uZworICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gKGludCkgdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwT3V0cHV0U3RyZWFtLmphdmEgYi90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjU3Mjg1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw5MTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOworaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CisKKy8qKgorICogUmVpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0KKyAqIGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtfSB0aGF0IGRvZXMgaGFuZGxlIHRoZSBleHRlbmRlZAorICogZnVuY3Rpb25hbGl0eSBvZiB0aGlzIHBhY2thZ2UsIGVzcGVjaWFsbHkgaW50ZXJuYWwvZXh0ZXJuYWwgZmlsZQorICogYXR0cmlidXRlcyBhbmQgZXh0cmEgZmllbGRzIHdpdGggZGlmZmVyZW50IGxheW91dHMgZm9yIGxvY2FsIGZpbGUKKyAqIGRhdGEgYW5kIGNlbnRyYWwgZGlyZWN0b3J5IGVudHJpZXMuCisgKgorICogPHA+VGhpcyBjbGFzcyB3aWxsIHRyeSB0byB1c2Uge0BsaW5rIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZQorICogUmFuZG9tQWNjZXNzRmlsZX0gd2hlbiB5b3Uga25vdyB0aGF0IHRoZSBvdXRwdXQgaXMgZ29pbmcgdG8gZ28gdG8gYQorICogZmlsZS48L3A+CisgKgorICogPHA+SWYgUmFuZG9tQWNjZXNzRmlsZSBjYW5ub3QgYmUgdXNlZCwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIHVzZQorICogYSBEYXRhIERlc2NyaXB0b3IgdG8gc3RvcmUgc2l6ZSBhbmQgQ1JDIGluZm9ybWF0aW9uIGZvciB7QGxpbmsKKyAqICNERUZMQVRFRCBERUZMQVRFRH0gZW50cmllcywgdGhpcyBtZWFucywgeW91IGRvbid0IG5lZWQgdG8KKyAqIGNhbGN1bGF0ZSB0aGVtIHlvdXJzZWxmLiAgVW5mb3J0dW5hdGVseSB0aGlzIGlzIG5vdCBwb3NzaWJsZSBmb3IKKyAqIHRoZSB7QGxpbmsgI1NUT1JFRCBTVE9SRUR9IG1ldGhvZCwgaGVyZSBzZXR0aW5nIHRoZSBDUkMgYW5kCisgKiB1bmNvbXByZXNzZWQgc2l6ZSBpbmZvcm1hdGlvbiBpcyByZXF1aXJlZCBiZWZvcmUge0BsaW5rCisgKiAjcHV0TmV4dEVudHJ5IHB1dE5leHRFbnRyeX0gY2FuIGJlIGNhbGxlZC48L3A+CisgKgorICovCitwdWJsaWMgY2xhc3MgWmlwT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFX01BU0sgPSAweEZGOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9SVCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdPUkQgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDUxMjsKKworICAgIC8qKgorICAgICAqIENvbXByZXNzaW9uIG1ldGhvZCBmb3IgZGVmbGF0ZWQgZW50cmllcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZMQVRFRCA9IGphdmEudXRpbC56aXAuWmlwRW50cnkuREVGTEFURUQ7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIGZvciBkZWZsYXRlZCBlbnRyaWVzLgorICAgICAqCisgICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTVBSRVNTSU9OID0gRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTjsKKworICAgIC8qKgorICAgICAqIENvbXByZXNzaW9uIG1ldGhvZCBmb3Igc3RvcmVkIGVudHJpZXMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkVEID0gamF2YS51dGlsLnppcC5aaXBFbnRyeS5TVE9SRUQ7CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGVudHJ5LgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgWmlwRW50cnkgZW50cnk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSBjb21tZW50LgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSAiIjsKKworICAgIC8qKgorICAgICAqIENvbXByZXNzaW9uIGxldmVsIGZvciBuZXh0IGVudHJ5LgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgaW50IGxldmVsID0gREVGQVVMVF9DT01QUkVTU0lPTjsKKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgY2hhbmdlZCB3aGVuIGNvbXBhcmVkIHRvIHRoZSBsYXN0CisgICAgICogZW50cnk/CisgICAgICoKKyAgICAgKiBAc2luY2UgMS41CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0NvbXByZXNzaW9uTGV2ZWxDaGFuZ2VkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbXByZXNzaW9uIG1ldGhvZCBmb3IgbmV4dCBlbnRyeS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtZXRob2QgPSBqYXZhLnV0aWwuemlwLlppcEVudHJ5LkRFRkxBVEVEOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBaaXBFbnRyaWVzIHdyaXR0ZW4gc28gZmFyLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgVmVjdG9yIGVudHJpZXMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBDUkMgaW5zdGFuY2UgdG8gYXZvaWQgcGFyc2luZyBERUZMQVRFRCBkYXRhIHR3aWNlLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgQ1JDMzIgY3JjID0gbmV3IENSQzMyKCk7CisKKyAgICAvKioKKyAgICAgKiBDb3VudCB0aGUgYnl0ZXMgd3JpdHRlbiB0byBvdXQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHdyaXR0ZW4gPSAwOworCisgICAgLyoqCisgICAgICogRGF0YSBmb3IgbG9jYWwgaGVhZGVyIGRhdGEKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgZGF0YVN0YXJ0ID0gMDsKKworICAgIC8qKgorICAgICAqIE9mZnNldCBmb3IgQ1JDIGVudHJ5IGluIHRoZSBsb2NhbCBmaWxlIGhlYWRlciBkYXRhIGZvciB0aGUKKyAgICAgKiBjdXJyZW50IGVudHJ5IHN0YXJ0cyBoZXJlLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMTUKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbG9jYWxEYXRhU3RhcnQgPSAwOworCisgICAgLyoqCisgICAgICogU3RhcnQgb2YgY2VudHJhbCBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGNkT2Zmc2V0ID0gMDsKKworICAgIC8qKgorICAgICAqIExlbmd0aCBvZiBjZW50cmFsIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgY2RMZW5ndGggPSAwOworCisgICAgLyoqCisgICAgICogSGVscGVyLCBhIDAgYXMgWmlwU2hvcnQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFpFUk8gPSB7MCwgMH07CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIsIGEgMCBhcyBaaXBMb25nLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBMWkVSTyA9IHswLCAwLCAwLCAwfTsKKworICAgIC8qKgorICAgICAqIEhvbGRzIHRoZSBvZmZzZXRzIG9mIHRoZSBMRkggc3RhcnRzIGZvciBlYWNoIGVudHJ5LgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIG9mZnNldHMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMgYW5kIHRoZSBmaWxlIGNvbW1lbnQuCisgICAgICoKKyAgICAgKiA8cD5Gb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgPGEKKyAgICAgKiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sPC9hPi4KKyAgICAgKiBEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy48L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMS4zCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKKworICAgIC8qKgorICAgICAqIFRoaXMgRGVmbGF0ZXIgb2JqZWN0IGlzIHVzZWQgZm9yIG91dHB1dC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgYXR0cmlidXRlIGlzIG9ubHkgcHJvdGVjdGVkIHRvIHByb3ZpZGUgYSBsZXZlbCBvZiBBUEkKKyAgICAgKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIFRoaXMgY2xhc3MgdXNlZCB0byBleHRlbmQge0BsaW5rCisgICAgICogamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbSBEZWZsYXRlck91dHB1dFN0cmVhbX0gdXAgdG8KKyAgICAgKiBSZXZpc2lvbiAxLjEzLjwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjE0CisgICAgICovCisgICAgcHJvdGVjdGVkIERlZmxhdGVyIGRlZiA9IG5ldyBEZWZsYXRlcihsZXZlbCwgdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGJ1ZmZlciBzZXJ2ZXJzIGFzIGEgRGVmbGF0ZXIuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGF0dHJpYnV0ZSBpcyBvbmx5IHByb3RlY3RlZCB0byBwcm92aWRlIGEgbGV2ZWwgb2YgQVBJCisgICAgICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBUaGlzIGNsYXNzIHVzZWQgdG8gZXh0ZW5kIHtAbGluaworICAgICAqIGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW0gRGVmbGF0ZXJPdXRwdXRTdHJlYW19IHVwIHRvCisgICAgICogUmV2aXNpb24gMS4xMy48L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xNAorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gYnVmID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworCisgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsIHJhbmRvbSBhY2Nlc3Mgb3V0cHV0LgorICAgICAqCisgICAgICogQHNpbmNlIDEuMTQKKyAgICAgKi8KKyAgICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgWklQIE91dHB1dFN0cmVhbSBmaWx0ZXJpbmcgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dHN0cmVhbSB0byB6aXAKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIFppcE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHN1cGVyKG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBaSVAgT3V0cHV0U3RyZWFtIHdyaXRpbmcgdG8gYSBGaWxlLiAgV2lsbCB1c2UKKyAgICAgKiByYW5kb20gYWNjZXNzIGlmIHBvc3NpYmxlLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIHRvIHppcCB0bworICAgICAqIEBzaW5jZSAxLjE0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBaaXBPdXRwdXRTdHJlYW0oRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlcihudWxsKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZSwgInJ3Iik7CisgICAgICAgICAgICByYWYuc2V0TGVuZ3RoKDApOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAocmFmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByYWYuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpbm5lcikgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmFmID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBhcmNoaXZlIGlzIHdyaXRpbmcgdG8gYSBzZWVrYWJsZSBzdHJlYW0gKGkuZS4sIHRvIGEgcmFuZG9tCisgICAgICogYWNjZXNzIGZpbGUpLgorICAgICAqCisgICAgICogPHA+Rm9yIHNlZWthYmxlIHN0cmVhbXMsIHlvdSBkb24ndCBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgQ1JDIG9yCisgICAgICogdW5jb21wcmVzc2VkIHNpemUgZm9yIHtAbGluayAjU1RPUkVEfSBlbnRyaWVzIGJlZm9yZQorICAgICAqIGludm9raW5nIHtAbGluayAjcHV0TmV4dEVudHJ5fS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2Vla2FibGUKKyAgICAgKiBAc2luY2UgMS4xNworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2Vla2FibGUoKSB7CisgICAgICAgIHJldHVybiByYWYgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMgYW5kIHRoZSBmaWxlIGNvbW1lbnQuCisgICAgICoKKyAgICAgKiA8cD5Gb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgPGEKKyAgICAgKiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sPC9hPi4KKyAgICAgKiBEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy48L3A+CisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyB2YWx1ZQorICAgICAqIEBzaW5jZSAxLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBhbmQgdGhlIGZpbGUgY29tbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbCBpZiB1c2luZyB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluaXNocyB3cml0aW5nIHRoZSBjb250ZW50cyBhbmQgY2xvc2VzIHRoaXMgYXMgd2VsbCBhcyB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xvc2VFbnRyeSgpOworICAgICAgICBjZE9mZnNldCA9IHdyaXR0ZW47CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBlbnRyaWVzU2l6ZSA9IGVudHJpZXMuc2l6ZSgpOyBpIDwgZW50cmllc1NpemU7IGkrKykgeworICAgICAgICAgICAgd3JpdGVDZW50cmFsRmlsZUhlYWRlcigoWmlwRW50cnkpIGVudHJpZXMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgfQorICAgICAgICBjZExlbmd0aCA9IHdyaXR0ZW4gLSBjZE9mZnNldDsKKyAgICAgICAgd3JpdGVDZW50cmFsRGlyZWN0b3J5RW5kKCk7CisgICAgICAgIG9mZnNldHMuY2xlYXIoKTsKKyAgICAgICAgZW50cmllcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbGwgbmVjZXNzYXJ5IGRhdGEgZm9yIHRoaXMgZW50cnkuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyByZWFsQ3JjID0gY3JjLmdldFZhbHVlKCk7CisgICAgICAgIGNyYy5yZXNldCgpOworCisgICAgICAgIGlmIChlbnRyeS5nZXRNZXRob2QoKSA9PSBERUZMQVRFRCkgeworICAgICAgICAgICAgZGVmLmZpbmlzaCgpOworICAgICAgICAgICAgd2hpbGUgKCFkZWYuZmluaXNoZWQoKSkgeworICAgICAgICAgICAgICAgIGRlZmxhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW50cnkuc2V0U2l6ZShhZGp1c3RUb0xvbmcoZGVmLmdldFRvdGFsSW4oKSkpOworICAgICAgICAgICAgZW50cnkuc2V0Q29tcHJlc3NlZFNpemUoYWRqdXN0VG9Mb25nKGRlZi5nZXRUb3RhbE91dCgpKSk7CisgICAgICAgICAgICBlbnRyeS5zZXRDcmMocmVhbENyYyk7CisKKyAgICAgICAgICAgIGRlZi5yZXNldCgpOworCisgICAgICAgICAgICB3cml0dGVuICs9IGVudHJ5LmdldENvbXByZXNzZWRTaXplKCk7CisgICAgICAgIH0gZWxzZSBpZiAocmFmID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRDcmMoKSAhPSByZWFsQ3JjKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigiYmFkIENSQyBjaGVja3N1bSBmb3IgZW50cnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXROYW1lKCkgKyAiOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExvbmcudG9IZXhTdHJpbmcoZW50cnkuZ2V0Q3JjKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW5zdGVhZCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExvbmcudG9IZXhTdHJpbmcocmVhbENyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZW50cnkuZ2V0U2l6ZSgpICE9IHdyaXR0ZW4gLSBkYXRhU3RhcnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJiYWQgc2l6ZSBmb3IgZW50cnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXROYW1lKCkgKyAiOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVudHJ5LmdldFNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluc3RlYWQgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAod3JpdHRlbiAtIGRhdGFTdGFydCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvKiBtZXRob2QgaXMgU1RPUkVEIGFuZCB3ZSB1c2VkIFJhbmRvbUFjY2Vzc0ZpbGUgKi8KKyAgICAgICAgICAgIGxvbmcgc2l6ZSA9IHdyaXR0ZW4gLSBkYXRhU3RhcnQ7CisKKyAgICAgICAgICAgIGVudHJ5LnNldFNpemUoc2l6ZSk7CisgICAgICAgICAgICBlbnRyeS5zZXRDb21wcmVzc2VkU2l6ZShzaXplKTsKKyAgICAgICAgICAgIGVudHJ5LnNldENyYyhyZWFsQ3JjKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHJhbmRvbSBhY2Nlc3Mgb3V0cHV0LCB3cml0ZSB0aGUgbG9jYWwgZmlsZSBoZWFkZXIgY29udGFpbmluZworICAgICAgICAvLyB0aGUgY29ycmVjdCBDUkMgYW5kIGNvbXByZXNzZWQvdW5jb21wcmVzc2VkIHNpemVzCisgICAgICAgIGlmIChyYWYgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9uZyBzYXZlID0gcmFmLmdldEZpbGVQb2ludGVyKCk7CisKKyAgICAgICAgICAgIHJhZi5zZWVrKGxvY2FsRGF0YVN0YXJ0KTsKKyAgICAgICAgICAgIHdyaXRlT3V0KFppcExvbmcuZ2V0Qnl0ZXMoZW50cnkuZ2V0Q3JjKCkpKTsKKyAgICAgICAgICAgIHdyaXRlT3V0KFppcExvbmcuZ2V0Qnl0ZXMoZW50cnkuZ2V0Q29tcHJlc3NlZFNpemUoKSkpOworICAgICAgICAgICAgd3JpdGVPdXQoWmlwTG9uZy5nZXRCeXRlcyhlbnRyeS5nZXRTaXplKCkpKTsKKyAgICAgICAgICAgIHJhZi5zZWVrKHNhdmUpOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVEYXRhRGVzY3JpcHRvcihlbnRyeSk7CisgICAgICAgIGVudHJ5ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbiB3cml0aW5nIG5leHQgZW50cnkuCisgICAgICogQHBhcmFtIHplIHRoZSBlbnRyeSB0byB3cml0ZQorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0TmV4dEVudHJ5KFppcEVudHJ5IHplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbG9zZUVudHJ5KCk7CisKKyAgICAgICAgZW50cnkgPSB6ZTsKKyAgICAgICAgZW50cmllcy5hZGRFbGVtZW50KGVudHJ5KTsKKworICAgICAgICBpZiAoZW50cnkuZ2V0TWV0aG9kKCkgPT0gLTEpIHsgLy8gbm90IHNwZWNpZmllZAorICAgICAgICAgICAgZW50cnkuc2V0TWV0aG9kKG1ldGhvZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW50cnkuZ2V0VGltZSgpID09IC0xKSB7IC8vIG5vdCBzcGVjaWZpZWQKKyAgICAgICAgICAgIGVudHJ5LnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2l6ZS9DUkMgbm90IHJlcXVpcmVkIGlmIFJhbmRvbUFjY2Vzc0ZpbGUgaXMgdXNlZAorICAgICAgICBpZiAoZW50cnkuZ2V0TWV0aG9kKCkgPT0gU1RPUkVEICYmIHJhZiA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZ2V0U2l6ZSgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigidW5jb21wcmVzc2VkIHNpemUgaXMgcmVxdWlyZWQgZm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFNUT1JFRCBtZXRob2Qgd2hlbiBub3Qgd3JpdGluZyB0byBhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRDcmMoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oImNyYyBjaGVja3N1bSBpcyByZXF1aXJlZCBmb3IgU1RPUkVEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1ldGhvZCB3aGVuIG5vdCB3cml0aW5nIHRvIGEgZmlsZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50cnkuc2V0Q29tcHJlc3NlZFNpemUoZW50cnkuZ2V0U2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnRyeS5nZXRNZXRob2QoKSA9PSBERUZMQVRFRCAmJiBoYXNDb21wcmVzc2lvbkxldmVsQ2hhbmdlZCkgeworICAgICAgICAgICAgZGVmLnNldExldmVsKGxldmVsKTsKKyAgICAgICAgICAgIGhhc0NvbXByZXNzaW9uTGV2ZWxDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVMb2NhbEZpbGVIZWFkZXIoZW50cnkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmlsZSBjb21tZW50LgorICAgICAqIEBwYXJhbSBjb21tZW50IHRoZSBjb21tZW50CisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBmb3Igc3Vic2VxdWVudCBlbnRyaWVzLgorICAgICAqCisgICAgICogPHA+RGVmYXVsdCBpcyBEZWZsYXRlci5ERUZBVUxUX0NPTVBSRVNTSU9OLjwvcD4KKyAgICAgKiBAcGFyYW0gbGV2ZWwgdGhlIGNvbXByZXNzaW9uIGxldmVsLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGludmFsaWQgY29tcHJlc3Npb24gbGV2ZWwgaXMgc3BlY2lmaWVkLgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZXZlbChpbnQgbGV2ZWwpIHsKKyAgICAgICAgaWYgKGxldmVsIDwgRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTgorICAgICAgICAgICAgfHwgbGV2ZWwgPiBEZWZsYXRlci5CRVNUX0NPTVBSRVNTSU9OKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsOiAiICsgbGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGhhc0NvbXByZXNzaW9uTGV2ZWxDaGFuZ2VkID0gKHRoaXMubGV2ZWwgIT0gbGV2ZWwpOworICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBtZXRob2QgZm9yIHN1YnNlcXVlbnQgZW50cmllcy4KKyAgICAgKgorICAgICAqIDxwPkRlZmF1bHQgaXMgREVGTEFURUQuPC9wPgorICAgICAqIEBwYXJhbSBtZXRob2QgYW4gPGNvZGU+aW50PC9jb2RlPiBmcm9tIGphdmEudXRpbC56aXAuWmlwRW50cnkKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKGludCBtZXRob2QpIHsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGJ5dGVzIHRvIFpJUCBlbnRyeS4KKyAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZSBhcnJheSB0byB3cml0ZQorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIHdyaXRlIGZyb20KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlbnRyeS5nZXRNZXRob2QoKSA9PSBERUZMQVRFRCkgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRlZi5maW5pc2hlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZi5zZXRJbnB1dChiLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghZGVmLm5lZWRzSW5wdXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmbGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVPdXQoYiwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgd3JpdHRlbiArPSBsZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgY3JjLnVwZGF0ZShiLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc2luZ2xlIGJ5dGUgdG8gWklQIGVudHJ5LgorICAgICAqCisgICAgICogPHA+RGVsZWdhdGVzIHRvIHRoZSB0aHJlZSBhcmcgbWV0aG9kLjwvcD4KKyAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZSB0byB3cml0ZQorICAgICAqIEBzaW5jZSAxLjE0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnVmZiA9IG5ldyBieXRlWzFdOworICAgICAgICBidWZmWzBdID0gKGJ5dGUpIChiICYgQllURV9NQVNLKTsKKyAgICAgICAgd3JpdGUoYnVmZiwgMCwgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgb3V0cHV0IHN0cmVhbSBhbmQgcmVsZWFzZXMgYW55IHN5c3RlbSByZXNvdXJjZXMKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEBzaW5jZSAxLjE0CisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5pc2goKTsKKworICAgICAgICBpZiAocmFmICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJhZi5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaGVzIHRoaXMgb3V0cHV0IHN0cmVhbSBhbmQgZm9yY2VzIGFueSBidWZmZXJlZCBvdXRwdXQgYnl0ZXMKKyAgICAgKiB0byBiZSB3cml0dGVuIG91dCB0byB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIDEuMTQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFZhcmlvdXMgWklQIGNvbnN0YW50cworICAgICAqLworICAgIC8qKgorICAgICAqIGxvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZQorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZVtdIExGSF9TSUcgPSBaaXBMb25nLmdldEJ5dGVzKDBYMDQwMzRCNTBMKTsKKyAgICAvKioKKyAgICAgKiBkYXRhIGRlc2NyaXB0b3Igc2lnbmF0dXJlCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gRERfU0lHID0gWmlwTG9uZy5nZXRCeXRlcygwWDA4MDc0QjUwTCk7CisgICAgLyoqCisgICAgICogY2VudHJhbCBmaWxlIGhlYWRlciBzaWduYXR1cmUKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBDRkhfU0lHID0gWmlwTG9uZy5nZXRCeXRlcygwWDAyMDE0QjUwTCk7CisgICAgLyoqCisgICAgICogZW5kIG9mIGNlbnRyYWwgZGlyIHNpZ25hdHVyZQorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZVtdIEVPQ0RfU0lHID0gWmlwTG9uZy5nZXRCeXRlcygwWDA2MDU0QjUwTCk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgbmV4dCBibG9jayBvZiBjb21wcmVzc2VkIGRhdGEgdG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqCisgICAgICogQHNpbmNlIDEuMTQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBkZWZsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGxlbiA9IGRlZi5kZWZsYXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICB3cml0ZU91dChidWYsIDAsIGxlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGxvY2FsIGZpbGUgaGVhZGVyIGVudHJ5CisgICAgICogQHBhcmFtIHplIHRoZSBlbnRyeSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUxvY2FsRmlsZUhlYWRlcihaaXBFbnRyeSB6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb2Zmc2V0cy5wdXQoemUsIFppcExvbmcuZ2V0Qnl0ZXMod3JpdHRlbikpOworCisgICAgICAgIHdyaXRlT3V0KExGSF9TSUcpOworICAgICAgICB3cml0dGVuICs9IFdPUkQ7CisKKyAgICAgICAgLy9zdG9yZSBtZXRob2QgaW4gbG9jYWwgdmFyaWFibGUgdG8gcHJldmVudCBtdWx0aXBsZSBtZXRob2QgY2FsbHMKKyAgICAgICAgZmluYWwgaW50IHppcE1ldGhvZCA9IHplLmdldE1ldGhvZCgpOworCisgICAgICAgIC8vIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QKKyAgICAgICAgLy8gZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnCisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgIGlmICh6aXBNZXRob2QgPT0gREVGTEFURUQgJiYgcmFmID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHJlcXVpcmVzIHZlcnNpb24gMiBhcyB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgbGVuZ3RoIGluZm8KKyAgICAgICAgICAgIC8vIGluIHRoZSBkYXRhIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIHdyaXRlT3V0KFppcFNob3J0LmdldEJ5dGVzKDIwKSk7CisKKyAgICAgICAgICAgIC8vIGJpdDMgc2V0IHRvIHNpZ25hbCwgd2UgdXNlIGEgZGF0YSBkZXNjcmlwdG9yCisgICAgICAgICAgICB3cml0ZU91dChaaXBTaG9ydC5nZXRCeXRlcyg4KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZU91dChaaXBTaG9ydC5nZXRCeXRlcygxMCkpOworICAgICAgICAgICAgd3JpdGVPdXQoWkVSTyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorICAgICAgICB3cml0dGVuICs9IFdPUkQ7CisKKyAgICAgICAgLy8gY29tcHJlc3Npb24gbWV0aG9kCisgICAgICAgIHdyaXRlT3V0KFppcFNob3J0LmdldEJ5dGVzKHppcE1ldGhvZCkpOworICAgICAgICB3cml0dGVuICs9IFNIT1JUOworCisgICAgICAgIC8vIGxhc3QgbW9kLiB0aW1lIGFuZCBkYXRlCisgICAgICAgIHdyaXRlT3V0KHRvRG9zVGltZSh6ZS5nZXRUaW1lKCkpKTsKKyAgICAgICAgd3JpdHRlbiArPSBXT1JEOworCisgICAgICAgIC8vIENSQworICAgICAgICAvLyBjb21wcmVzc2VkIGxlbmd0aAorICAgICAgICAvLyB1bmNvbXByZXNzZWQgbGVuZ3RoCisgICAgICAgIGxvY2FsRGF0YVN0YXJ0ID0gd3JpdHRlbjsKKyAgICAgICAgaWYgKHppcE1ldGhvZCA9PSBERUZMQVRFRCB8fCByYWYgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVPdXQoTFpFUk8pOworICAgICAgICAgICAgd3JpdGVPdXQoTFpFUk8pOworICAgICAgICAgICAgd3JpdGVPdXQoTFpFUk8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVPdXQoWmlwTG9uZy5nZXRCeXRlcyh6ZS5nZXRDcmMoKSkpOworICAgICAgICAgICAgd3JpdGVPdXQoWmlwTG9uZy5nZXRCeXRlcyh6ZS5nZXRTaXplKCkpKTsKKyAgICAgICAgICAgIHdyaXRlT3V0KFppcExvbmcuZ2V0Qnl0ZXMoemUuZ2V0U2l6ZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKKyAgICAgICAgd3JpdHRlbiArPSAxMjsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgorCisgICAgICAgIC8vIGZpbGUgbmFtZSBsZW5ndGgKKyAgICAgICAgYnl0ZVtdIG5hbWUgPSBnZXRCeXRlcyh6ZS5nZXROYW1lKCkpOworICAgICAgICB3cml0ZU91dChaaXBTaG9ydC5nZXRCeXRlcyhuYW1lLmxlbmd0aCkpOworICAgICAgICB3cml0dGVuICs9IFNIT1JUOworCisgICAgICAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aAorICAgICAgICBieXRlW10gZXh0cmEgPSB6ZS5nZXRMb2NhbEZpbGVEYXRhRXh0cmEoKTsKKyAgICAgICAgd3JpdGVPdXQoWmlwU2hvcnQuZ2V0Qnl0ZXMoZXh0cmEubGVuZ3RoKSk7CisgICAgICAgIHdyaXR0ZW4gKz0gU0hPUlQ7CisKKyAgICAgICAgLy8gZmlsZSBuYW1lCisgICAgICAgIHdyaXRlT3V0KG5hbWUpOworICAgICAgICB3cml0dGVuICs9IG5hbWUubGVuZ3RoOworCisgICAgICAgIC8vIGV4dHJhIGZpZWxkCisgICAgICAgIHdyaXRlT3V0KGV4dHJhKTsKKyAgICAgICAgd3JpdHRlbiArPSBleHRyYS5sZW5ndGg7CisKKyAgICAgICAgZGF0YVN0YXJ0ID0gd3JpdHRlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGRhdGEgZGVzY3JpcHRvciBlbnRyeS4KKyAgICAgKiBAcGFyYW0gemUgdGhlIGVudHJ5IHRvIHdyaXRlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRGF0YURlc2NyaXB0b3IoWmlwRW50cnkgemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh6ZS5nZXRNZXRob2QoKSAhPSBERUZMQVRFRCB8fCByYWYgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdyaXRlT3V0KEREX1NJRyk7CisgICAgICAgIHdyaXRlT3V0KFppcExvbmcuZ2V0Qnl0ZXMoZW50cnkuZ2V0Q3JjKCkpKTsKKyAgICAgICAgd3JpdGVPdXQoWmlwTG9uZy5nZXRCeXRlcyhlbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpKSk7CisgICAgICAgIHdyaXRlT3V0KFppcExvbmcuZ2V0Qnl0ZXMoZW50cnkuZ2V0U2l6ZSgpKSk7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgIHdyaXR0ZW4gKz0gMTY7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGNlbnRyYWwgZmlsZSBoZWFkZXIgZW50cnkuCisgICAgICogQHBhcmFtIHplIHRoZSBlbnRyeSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNlbnRyYWxGaWxlSGVhZGVyKFppcEVudHJ5IHplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZU91dChDRkhfU0lHKTsKKyAgICAgICAgd3JpdHRlbiArPSBXT1JEOworCisgICAgICAgIC8vIHZlcnNpb24gbWFkZSBieQorICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgorICAgICAgICB3cml0ZU91dChaaXBTaG9ydC5nZXRCeXRlcygoemUuZ2V0UGxhdGZvcm0oKSA8PCA4KSB8IDIwKSk7CisgICAgICAgIHdyaXR0ZW4gKz0gU0hPUlQ7CisKKyAgICAgICAgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdAorICAgICAgICAvLyBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcKKyAgICAgICAgaWYgKHplLmdldE1ldGhvZCgpID09IERFRkxBVEVEICYmIHJhZiA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyByZXF1aXJlcyB2ZXJzaW9uIDIgYXMgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGxlbmd0aCBpbmZvCisgICAgICAgICAgICAvLyBpbiB0aGUgZGF0YSBkZXNjcmlwdG9yCisgICAgICAgICAgICB3cml0ZU91dChaaXBTaG9ydC5nZXRCeXRlcygyMCkpOworCisgICAgICAgICAgICAvLyBiaXQzIHNldCB0byBzaWduYWwsIHdlIHVzZSBhIGRhdGEgZGVzY3JpcHRvcgorICAgICAgICAgICAgd3JpdGVPdXQoWmlwU2hvcnQuZ2V0Qnl0ZXMoOCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVPdXQoWmlwU2hvcnQuZ2V0Qnl0ZXMoMTApKTsKKyAgICAgICAgICAgIHdyaXRlT3V0KFpFUk8pOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKyAgICAgICAgd3JpdHRlbiArPSBXT1JEOworCisgICAgICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZAorICAgICAgICB3cml0ZU91dChaaXBTaG9ydC5nZXRCeXRlcyh6ZS5nZXRNZXRob2QoKSkpOworICAgICAgICB3cml0dGVuICs9IFNIT1JUOworCisgICAgICAgIC8vIGxhc3QgbW9kLiB0aW1lIGFuZCBkYXRlCisgICAgICAgIHdyaXRlT3V0KHRvRG9zVGltZSh6ZS5nZXRUaW1lKCkpKTsKKyAgICAgICAgd3JpdHRlbiArPSBXT1JEOworCisgICAgICAgIC8vIENSQworICAgICAgICAvLyBjb21wcmVzc2VkIGxlbmd0aAorICAgICAgICAvLyB1bmNvbXByZXNzZWQgbGVuZ3RoCisgICAgICAgIHdyaXRlT3V0KFppcExvbmcuZ2V0Qnl0ZXMoemUuZ2V0Q3JjKCkpKTsKKyAgICAgICAgd3JpdGVPdXQoWmlwTG9uZy5nZXRCeXRlcyh6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSk7CisgICAgICAgIHdyaXRlT3V0KFppcExvbmcuZ2V0Qnl0ZXMoemUuZ2V0U2l6ZSgpKSk7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCisgICAgICAgIHdyaXR0ZW4gKz0gMTI7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KKworICAgICAgICAvLyBmaWxlIG5hbWUgbGVuZ3RoCisgICAgICAgIGJ5dGVbXSBuYW1lID0gZ2V0Qnl0ZXMoemUuZ2V0TmFtZSgpKTsKKyAgICAgICAgd3JpdGVPdXQoWmlwU2hvcnQuZ2V0Qnl0ZXMobmFtZS5sZW5ndGgpKTsKKyAgICAgICAgd3JpdHRlbiArPSBTSE9SVDsKKworICAgICAgICAvLyBleHRyYSBmaWVsZCBsZW5ndGgKKyAgICAgICAgYnl0ZVtdIGV4dHJhID0gemUuZ2V0Q2VudHJhbERpcmVjdG9yeUV4dHJhKCk7CisgICAgICAgIHdyaXRlT3V0KFppcFNob3J0LmdldEJ5dGVzKGV4dHJhLmxlbmd0aCkpOworICAgICAgICB3cml0dGVuICs9IFNIT1JUOworCisgICAgICAgIC8vIGZpbGUgY29tbWVudCBsZW5ndGgKKyAgICAgICAgU3RyaW5nIGNvbW0gPSB6ZS5nZXRDb21tZW50KCk7CisgICAgICAgIGlmIChjb21tID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW0gPSAiIjsKKyAgICAgICAgfQorICAgICAgICBieXRlW10gY29tbWVudEIgPSBnZXRCeXRlcyhjb21tKTsKKyAgICAgICAgd3JpdGVPdXQoWmlwU2hvcnQuZ2V0Qnl0ZXMoY29tbWVudEIubGVuZ3RoKSk7CisgICAgICAgIHdyaXR0ZW4gKz0gU0hPUlQ7CisKKyAgICAgICAgLy8gZGlzayBudW1iZXIgc3RhcnQKKyAgICAgICAgd3JpdGVPdXQoWkVSTyk7CisgICAgICAgIHdyaXR0ZW4gKz0gU0hPUlQ7CisKKyAgICAgICAgLy8gaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzCisgICAgICAgIHdyaXRlT3V0KFppcFNob3J0LmdldEJ5dGVzKHplLmdldEludGVybmFsQXR0cmlidXRlcygpKSk7CisgICAgICAgIHdyaXR0ZW4gKz0gU0hPUlQ7CisKKyAgICAgICAgLy8gZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzCisgICAgICAgIHdyaXRlT3V0KFppcExvbmcuZ2V0Qnl0ZXMoemUuZ2V0RXh0ZXJuYWxBdHRyaWJ1dGVzKCkpKTsKKyAgICAgICAgd3JpdHRlbiArPSBXT1JEOworCisgICAgICAgIC8vIHJlbGF0aXZlIG9mZnNldCBvZiBMRkgKKyAgICAgICAgd3JpdGVPdXQoKGJ5dGVbXSkgb2Zmc2V0cy5nZXQoemUpKTsKKyAgICAgICAgd3JpdHRlbiArPSBXT1JEOworCisgICAgICAgIC8vIGZpbGUgbmFtZQorICAgICAgICB3cml0ZU91dChuYW1lKTsKKyAgICAgICAgd3JpdHRlbiArPSBuYW1lLmxlbmd0aDsKKworICAgICAgICAvLyBleHRyYSBmaWVsZAorICAgICAgICB3cml0ZU91dChleHRyYSk7CisgICAgICAgIHdyaXR0ZW4gKz0gZXh0cmEubGVuZ3RoOworCisgICAgICAgIC8vIGZpbGUgY29tbWVudAorICAgICAgICB3cml0ZU91dChjb21tZW50Qik7CisgICAgICAgIHdyaXR0ZW4gKz0gY29tbWVudEIubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgJnF1b3Q7RW5kIG9mIGNlbnRyYWwgZGlyIHJlY29yZCZxdW90Oy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDZW50cmFsRGlyZWN0b3J5RW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVPdXQoRU9DRF9TSUcpOworCisgICAgICAgIC8vIGRpc2sgbnVtYmVycworICAgICAgICB3cml0ZU91dChaRVJPKTsKKyAgICAgICAgd3JpdGVPdXQoWkVSTyk7CisKKyAgICAgICAgLy8gbnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgYnl0ZVtdIG51bSA9IFppcFNob3J0LmdldEJ5dGVzKGVudHJpZXMuc2l6ZSgpKTsKKyAgICAgICAgd3JpdGVPdXQobnVtKTsKKyAgICAgICAgd3JpdGVPdXQobnVtKTsKKworICAgICAgICAvLyBsZW5ndGggYW5kIGxvY2F0aW9uIG9mIENECisgICAgICAgIHdyaXRlT3V0KFppcExvbmcuZ2V0Qnl0ZXMoY2RMZW5ndGgpKTsKKyAgICAgICAgd3JpdGVPdXQoWmlwTG9uZy5nZXRCeXRlcyhjZE9mZnNldCkpOworCisgICAgICAgIC8vIFpJUCBmaWxlIGNvbW1lbnQKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBnZXRCeXRlcyhjb21tZW50KTsKKyAgICAgICAgd3JpdGVPdXQoWmlwU2hvcnQuZ2V0Qnl0ZXMoZGF0YS5sZW5ndGgpKTsKKyAgICAgICAgd3JpdGVPdXQoZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU21hbGxlc3QgZGF0ZS90aW1lIFpJUCBjYW4gaGFuZGxlLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBET1NfVElNRV9NSU4gPSBaaXBMb25nLmdldEJ5dGVzKDB4MDAwMDIxMDBMKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBEYXRlIG9iamVjdCB0byBhIERPUyBkYXRlL3RpbWUgZmllbGQuCisgICAgICogQHBhcmFtIHRpbWUgdGhlIDxjb2RlPkRhdGU8L2NvZGU+IHRvIGNvbnZlcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRlIGFzIGEgPGNvZGU+WmlwTG9uZzwvY29kZT4KKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBaaXBMb25nIHRvRG9zVGltZShEYXRlIHRpbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBaaXBMb25nKHRvRG9zVGltZSh0aW1lLmdldFRpbWUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBEYXRlIG9iamVjdCB0byBhIERPUyBkYXRlL3RpbWUgZmllbGQuCisgICAgICoKKyAgICAgKiA8cD5TdG9sZW4gZnJvbSBJbmZvWmlwJ3MgPGNvZGU+ZmlsZWlvLmM8L2NvZGU+PC9wPgorICAgICAqIEBwYXJhbSB0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoCisgICAgICogQHJldHVybiB0aGUgZGF0ZSBhcyBhIGJ5dGUgYXJyYXkKKyAgICAgKiBAc2luY2UgMS4yNgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIHRvRG9zVGltZShsb25nIHQpIHsKKyAgICAgICAgRGF0ZSB0aW1lID0gbmV3IERhdGUodCk7CisgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXJDaGVjayBPRkYgLSBJIGRvIG5vdCB0aGluayB0aGF0IHVzaW5nIGNvbnN0YW50cworICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSB3aWxsIGltcHJvdmUgdGhlIHJlYWRhYmxpdHkKKyAgICAgICAgaW50IHllYXIgPSB0aW1lLmdldFllYXIoKSArIDE5MDA7CisgICAgICAgIGlmICh5ZWFyIDwgMTk4MCkgeworICAgICAgICAgICAgcmV0dXJuIERPU19USU1FX01JTjsKKyAgICAgICAgfQorICAgICAgICBpbnQgbW9udGggPSB0aW1lLmdldE1vbnRoKCkgKyAxOworICAgICAgICBsb25nIHZhbHVlID0gICgoeWVhciAtIDE5ODApIDw8IDI1KQorICAgICAgICAgICAgfCAgICAgICAgIChtb250aCA8PCAyMSkKKyAgICAgICAgICAgIHwgICAgICAgICAodGltZS5nZXREYXRlKCkgPDwgMTYpCisgICAgICAgICAgICB8ICAgICAgICAgKHRpbWUuZ2V0SG91cnMoKSA8PCAxMSkKKyAgICAgICAgICAgIHwgICAgICAgICAodGltZS5nZXRNaW51dGVzKCkgPDwgNSkKKyAgICAgICAgICAgIHwgICAgICAgICAodGltZS5nZXRTZWNvbmRzKCkgPj4gMSk7CisgICAgICAgIHJldHVybiBaaXBMb25nLmdldEJ5dGVzKHZhbHVlKTsKKyAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlckNoZWNrIE9OCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGJ5dGVzIGZvciB0aGUgZ2l2ZW4gU3RyaW5nIGluIHRoZSBlbmNvZGluZyBzZXQgZm9yCisgICAgICogdGhpcyBTdHJlYW0uCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHN0cmluZyB0byBnZXQgYnl0ZXMgZnJvbQorICAgICAqIEByZXR1cm4gdGhlIGJ5dGVzIGFzIGEgYnl0ZSBhcnJheQorICAgICAqIEB0aHJvd3MgWmlwRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4zCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBnZXRCeXRlcyhTdHJpbmcgbmFtZSkgdGhyb3dzIFppcEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRCeXRlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRCeXRlcyhlbmNvZGluZyk7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24odWVlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBieXRlcyB0byBvdXRwdXQgb3IgcmFuZG9tIGFjY2VzcyBmaWxlLgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBieXRlIGFycmF5IHRvIHdyaXRlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqCisgICAgICogQHNpbmNlIDEuMTQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCB3cml0ZU91dChieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVPdXQoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGJ5dGVzIHRvIG91dHB1dCBvciByYW5kb20gYWNjZXNzIGZpbGUuCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGJ5dGUgYXJyYXkgdG8gd3JpdGUKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBzdGFydCBwb3NpdGlvbiB0byB3cml0ZSBmcm9tCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgorICAgICAqCisgICAgICogQHNpbmNlIDEuMTQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCB3cml0ZU91dChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJhZiAhPSBudWxsKSB7CisgICAgICAgICAgICByYWYud3JpdGUoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LndyaXRlKGRhdGEsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc3VtZXMgYSBuZWdhdGl2ZSBpbnRlZ2VyIHJlYWxseSBpcyBhIHBvc2l0aXZlIGludGVnZXIgdGhhdAorICAgICAqIGhhcyB3cmFwcGVkIGFyb3VuZCBhbmQgcmUtY3JlYXRlcyB0aGUgb3JpZ2luYWwgdmFsdWUuCisgICAgICogQHBhcmFtIGkgdGhlIHZhbHVlIHRvIHRyZWF0IGFzIHVuc2lnbmVkIGludC4KKyAgICAgKiBAcmV0dXJuIHRoZSB1bnNpZ25lZCBpbnQgYXMgYSBsb25nLgorICAgICAqIEBzaW5jZSAxLjM0CisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGFkanVzdFRvTG9uZyhpbnQgaSkgeworICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAyICogKChsb25nKSBJbnRlZ2VyLk1BWF9WQUxVRSkgKyAyICsgaTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBTaG9ydC5qYXZhIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU2MzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnQuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgdHdvIGJ5dGUgaW50ZWdlciB3aXRoIGNvbnZlcnNpb24KKyAqIHJ1bGVzIGZvciB0aGUgYmlnIGVuZGlhbiBieXRlIG9yZGVyIG9mIFpJUCBmaWxlcy4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBaaXBTaG9ydCBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfTUFTSyA9IDB4RkY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfMV9NQVNLID0gMHhGRjAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFXzFfU0hJRlQgPSA4OworCisgICAgcHJpdmF0ZSBpbnQgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgaW5zdGFuY2UgZnJvbSBhIG51bWJlci4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludCB0byBzdG9yZSBhcyBhIFppcFNob3J0CisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBaaXBTaG9ydCAoaW50IHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgaW5zdGFuY2UgZnJvbSBieXRlcy4KKyAgICAgKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGVzIHRvIHN0b3JlIGFzIGEgWmlwU2hvcnQKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIFppcFNob3J0IChieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgdGhpcyhieXRlcywgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gdGhlIHR3byBieXRlcyBzdGFydGluZyBhdCBvZmZzZXQuCisgICAgICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlcyB0byBzdG9yZSBhcyBhIFppcFNob3J0CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHN0YXJ0CisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBaaXBTaG9ydCAoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHZhbHVlID0gWmlwU2hvcnQuZ2V0VmFsdWUoYnl0ZXMsIG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHZhbHVlIGFzIHR3byBieXRlcyBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgYXMgYSBhIHR3byBieXRlIGFycmF5IGluIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkgeworICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbMl07CisgICAgICAgIHJlc3VsdFswXSA9IChieXRlKSAodmFsdWUgJiBCWVRFX01BU0spOworICAgICAgICByZXN1bHRbMV0gPSAoYnl0ZSkgKCh2YWx1ZSAmIEJZVEVfMV9NQVNLKSA+PiBCWVRFXzFfU0hJRlQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB2YWx1ZSBhcyBKYXZhIGludC4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIGFzIGEgSmF2YSBpbnQKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB2YWx1ZSBhcyB0d28gYnl0ZXMgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgSmF2YSBpbnQgdG8gY29udmVydCB0byBieXRlcworICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBpbnQgYXMgYSBieXRlIGFycmF5IGluIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldEJ5dGVzKGludCB2YWx1ZSkgeworICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbMl07CisgICAgICAgIHJlc3VsdFswXSA9IChieXRlKSAodmFsdWUgJiBCWVRFX01BU0spOworICAgICAgICByZXN1bHRbMV0gPSAoYnl0ZSkgKCh2YWx1ZSAmIEJZVEVfMV9NQVNLKSA+PiBCWVRFXzFfU0hJRlQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSB2YWx1ZSBhcyBhIGphdmEgaW50IGZyb20gdHdvIGJ5dGVzIHN0YXJ0aW5nIGF0IGdpdmVuIGFycmF5IG9mZnNldAorICAgICAqIEBwYXJhbSBieXRlcyB0aGUgYXJyYXkgb2YgYnl0ZXMKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gc3RhcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kYW5kaW5nIGphdmEgaW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VmFsdWUoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGludCB2YWx1ZSA9IChieXRlc1tvZmZzZXQgKyAxXSA8PCBCWVRFXzFfU0hJRlQpICYgQllURV8xX01BU0s7CisgICAgICAgIHZhbHVlICs9IChieXRlc1tvZmZzZXRdICYgQllURV9NQVNLKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSB2YWx1ZSBhcyBhIGphdmEgaW50IGZyb20gYSB0d28tYnl0ZSBhcnJheQorICAgICAqIEBwYXJhbSBieXRlcyB0aGUgYXJyYXkgb2YgYnl0ZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kYW5kaW5nIGphdmEgaW50IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VmFsdWUoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShieXRlcywgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdG8gbWFrZSB0d28gaW5zdGFuY2VzIHdpdGggc2FtZSB2YWx1ZSBlcXVhbC4KKyAgICAgKiBAcGFyYW0gbyBhbiBvYmplY3QgdG8gY29tcGFyZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1YWwKKyAgICAgKiBAc2luY2UgMS4xCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgIShvIGluc3RhbmNlb2YgWmlwU2hvcnQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlID09ICgoWmlwU2hvcnQpIG8pLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdG8gbWFrZSB0d28gaW5zdGFuY2VzIHdpdGggc2FtZSB2YWx1ZSBlcXVhbC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIFppcFNob3J0CisgICAgICogQHNpbmNlIDEuMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvcmVzb3VyY2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9hbnRsaWIueG1sIGIvdHJ1bmsvc3JjL3Jlc291cmNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvYW50bGliLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZTYxYjlkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Jlc291cmNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvYW50bGliLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhbnRsaWI+CisgIDx0eXBlZGVmIG5hbWU9Im5hbWUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuTmFtZSIgLz4KKyAgPHR5cGVkZWYgbmFtZT0ic2l6ZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycy5TaXplIiAvPgorICA8dHlwZWRlZiBuYW1lPSJkYXRlIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzLkRhdGUiIC8+CisgIDx0eXBlZGVmIG5hbWU9ImV4aXN0cyIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycy5FeGlzdHMiIC8+CisgIDx0eXBlZGVmIG5hbWU9InR5cGUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuVHlwZSIgLz4KKyAgPHR5cGVkZWYgbmFtZT0iY29udGVudCIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycy5Db250ZW50IiAvPgorICA8dHlwZWRlZiBuYW1lPSJyZXZlcnNlIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzLlJldmVyc2UiIC8+Cis8L2FudGxpYj4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9yZXNvdXJjZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9hbnRsaWIueG1sIGIvdHJ1bmsvc3JjL3Jlc291cmNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL2FudGxpYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTE1ZTJmYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9yZXNvdXJjZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9hbnRsaWIueG1sCkBAIC0wLDAgKzEsNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFudGxpYj4KKyAgPHR5cGVkZWYgbmFtZT0iYW5kIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5BbmQiIC8+CisgIDx0eXBlZGVmIG5hbWU9ImNvbXBhcmUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkNvbXBhcmUiIC8+CisgIDx0eXBlZGVmIG5hbWU9ImNvbnRhaW5zIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkNvbnRhaW5zU2VsZWN0b3IiIC8+CisgIDx0eXBlZGVmIG5hbWU9ImNvbnRhaW5zcmVnZXhwIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkNvbnRhaW5zUmVnZXhwU2VsZWN0b3IiIC8+CisgIDx0eXBlZGVmIG5hbWU9ImRhdGUiCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkRhdGUiIC8+CisgIDx0eXBlZGVmIG5hbWU9ImV4aXN0cyIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuRXhpc3RzIiAvPgorICA8dHlwZWRlZiBuYW1lPSJpbnN0YW5jZW9mIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5JbnN0YW5jZU9mIiAvPgorICA8dHlwZWRlZiBuYW1lPSJtYWpvcml0eSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuTWFqb3JpdHkiIC8+CisgIDx0eXBlZGVmIG5hbWU9Im1vZGlmaWVkIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3IuTW9kaWZpZWRTZWxlY3RvciIgLz4KKyAgPHR5cGVkZWYgbmFtZT0ibmFtZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuTmFtZSIgLz4KKyAgPHR5cGVkZWYgbmFtZT0ibm9uZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuTm9uZSIgLz4KKyAgPHR5cGVkZWYgbmFtZT0ibm90IgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5Ob3QiIC8+CisgIDx0eXBlZGVmIG5hbWU9Im9yIgorICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5PciIgLz4KKyAgPHR5cGVkZWYgbmFtZT0ic2l6ZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuU2l6ZSIgLz4KKyAgPHR5cGVkZWYgbmFtZT0idHlwZSIKKyAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuVHlwZSIgLz4KKzwvYW50bGliPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3NjcmlwdC9hbnQgYi90cnVuay9zcmMvc2NyaXB0L2FudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTYwODM5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3NjcmlwdC9hbnQKQEAgLTAsMCArMSwzMjYgQEAKKyMhIC9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEV4dHJhY3QgbGF1bmNoIGFuZCBhbnQgYXJndW1lbnRzLCAoc2VlIGRldGFpbHMgYmVsb3cpLgorYW50X2V4ZWNfYXJncz0KK25vX2NvbmZpZz1mYWxzZQordXNlX2ppa2VzX2RlZmF1bHQ9ZmFsc2UKK2FudF9leGVjX2RlYnVnPWZhbHNlCitzaG93X2hlbHA9ZmFsc2UKK2ZvciBhcmcgaW4gIiRAIiA7IGRvCisgIGlmIFsgIiRhcmciID0gIi0tbm9jb25maWciIF0gOyB0aGVuCisgICAgbm9fY29uZmlnPXRydWUKKyAgZWxpZiBbICIkYXJnIiA9ICItLXVzZWppa2VzIiBdIDsgdGhlbgorICAgIHVzZV9qaWtlc19kZWZhdWx0PXRydWUKKyAgZWxpZiBbICIkYXJnIiA9ICItLWV4ZWNkZWJ1ZyIgXSA7IHRoZW4KKyAgICBhbnRfZXhlY19kZWJ1Zz10cnVlCisgIGVsaWYgWyBteSIkYXJnIiA9IG15Ii0taCIgIC1vIG15IiRhcmciID0gbXkiLS1oZWxwIiAgXSA7IHRoZW4KKyAgICBzaG93X2hlbHA9dHJ1ZQorICAgIGFudF9leGVjX2FyZ3M9IiRhbnRfZXhlY19hcmdzIC1oIgorICBlbHNlCisgICAgaWYgWyAgbXkiJGFyZyIgPSBteSItaCIgIC1vICBteSIkYXJnIiA9IG15Ii1oZWxwIiBdIDsgdGhlbgorICAgICAgc2hvd19oZWxwPXRydWUKKyAgICBmaQorICAgIGFudF9leGVjX2FyZ3M9IiRhbnRfZXhlY19hcmdzIFwiJGFyZ1wiIgorICBmaQorZG9uZQorCisjIFNvdXJjZS9kZWZhdWx0IGFudCBjb25maWd1cmF0aW9uCitpZiAkbm9fY29uZmlnIDsgdGhlbgorICBycG1fbW9kZT1mYWxzZQorICB1c2VqaWtlcz0kdXNlX2ppa2VzX2RlZmF1bHQKK2Vsc2UKKyAgIyBsb2FkIHN5c3RlbS13aWRlIGFudCBjb25maWd1cmF0aW9uIChPTkxZIGlmIEFOVF9IT01FIGhhcyBOT1QgYmVlbiBzZXQpCisgIGlmIFsgLXogIiRBTlRfSE9NRSIgLW8gIiRBTlRfSE9NRSIgPSAiL3Vzci9zaGFyZS9hbnQiIF07IHRoZW4KKyAgICAgIGlmIFsgLWYgIi9ldGMvYW50LmNvbmYiIF0gOyB0aGVuCisgICAgICAgICAgLiAvZXRjL2FudC5jb25mCisgICAgICBmaQorICBmaQorCisgICMgbG9hZCB1c2VyIGFudCBjb25maWd1cmF0aW9uCisgIGlmIFsgLWYgIiRIT01FLy5hbnQvYW50LmNvbmYiIF0gOyB0aGVuCisgICAgLiAkSE9NRS8uYW50L2FudC5jb25mCisgIGZpCisgIGlmIFsgLWYgIiRIT01FLy5hbnRyYyIgXSA7IHRoZW4KKyAgICAuICIkSE9NRS8uYW50cmMiCisgIGZpCisKKyAgIyBwcm92aWRlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB2YWx1ZXMKKyAgaWYgWyAteiAiJHJwbV9tb2RlIiBdIDsgdGhlbgorICAgIHJwbV9tb2RlPWZhbHNlCisgIGZpCisgIGlmIFsgLXogIiR1c2VqaWtlcyIgXSA7IHRoZW4KKyAgICB1c2VqaWtlcz0kdXNlX2ppa2VzX2RlZmF1bHQKKyAgZmkKK2ZpCisKKyMgU2V0dXAgSmF2YSBlbnZpcm9ubWVudCBpbiBycG0gbW9kZQoraWYgJHJwbV9tb2RlIDsgdGhlbgorICBpZiBbIC1mIC91c3Ivc2hhcmUvamF2YS11dGlscy9qYXZhLWZ1bmN0aW9ucyBdIDsgdGhlbgorICAgIC4gL3Vzci9zaGFyZS9qYXZhLXV0aWxzL2phdmEtZnVuY3Rpb25zCisgICAgc2V0X2p2bQorICAgIHNldF9qYXZhY21kCisgIGZpCitmaQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQuICAkdmFyIF9tdXN0XyBiZSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuCitjeWd3aW49ZmFsc2U7CitkYXJ3aW49ZmFsc2U7CitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qKSBjeWd3aW49dHJ1ZSA7OworICBEYXJ3aW4qKSBkYXJ3aW49dHJ1ZQorICAgICAgICAgICBpZiBbIC16ICIkSkFWQV9IT01FIiBdIDsgdGhlbgorICAgICAgICAgICAgIEpBVkFfSE9NRT0vU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL0hvbWUKKyAgICAgICAgICAgZmkKKyAgICAgICAgICAgOzsKK2VzYWMKKworaWYgWyAteiAiJEFOVF9IT01FIiAtbyAhIC1kICIkQU5UX0hPTUUiIF0gOyB0aGVuCisgICMjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBsaW5rIHRvIGFudCdzIGhvbWUKKyAgUFJHPSIkMCIKKyAgcHJvZ25hbWU9YGJhc2VuYW1lICIkMCJgCisKKyAgIyBuZWVkIHRoaXMgZm9yIHJlbGF0aXZlIHN5bWxpbmtzCisgIHdoaWxlIFsgLWggIiRQUkciIF0gOyBkbworICAgIGxzPWBscyAtbGQgIiRQUkciYAorICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgICAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorICBkb25lCisKKyAgQU5UX0hPTUU9YGRpcm5hbWUgIiRQUkciYC8uLgorCisgICMgbWFrZSBpdCBmdWxseSBxdWFsaWZpZWQKKyAgQU5UX0hPTUU9YGNkICIkQU5UX0hPTUUiID4gL2Rldi9udWxsICYmIHB3ZGAKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgWyAtbiAiJEFOVF9IT01FIiBdICYmCisgICAgQU5UX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkQU5UX0hPTUUiYAorICBbIC1uICIkSkFWQV9IT01FIiBdICYmCisgICAgSkFWQV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFfSE9NRSJgCitmaQorCisjIHNldCBBTlRfTElCIGxvY2F0aW9uCitBTlRfTElCPSIke0FOVF9IT01FfS9saWIiCisKK2lmIFsgLXogIiRKQVZBQ01EIiBdIDsgdGhlbgorICBpZiBbIC1uICIkSkFWQV9IT01FIiAgXSA7IHRoZW4KKyAgICAjIElCTSdzIEpESyBvbiBBSVggdXNlcyBzdHJhbmdlIGxvY2F0aW9ucyBmb3IgdGhlIGV4ZWN1dGFibGVzCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCisgICAgZWxpZiBbIC14ICIkSkFWQV9IT01FL2pyZS9iaW4vamF2YSIgXSA7IHRoZW4KKyAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL2Jpbi9qYXZhIgorICAgIGVsc2UKKyAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvYmluL2phdmEiCisgICAgZmkKKyAgZWxzZQorICAgIEpBVkFDTUQ9YHdoaWNoIGphdmEgMj4gL2Rldi9udWxsIGAKKyAgICBpZiBbIC16ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgICAgICAgSkFWQUNNRD1qYXZhCisgICAgZmkKKyAgZmkKK2ZpCisKK2lmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgIGVjaG8gIkVycm9yOiBKQVZBX0hPTUUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LiIKKyAgZWNobyAiICBXZSBjYW5ub3QgZXhlY3V0ZSAkSkFWQUNNRCIKKyAgZXhpdCAxCitmaQorCisjIEJ1aWxkIGxvY2FsIGNsYXNzcGF0aCB1c2luZyBqdXN0IHRoZSBsYXVuY2hlciBpbiBub24tcnBtIG1vZGUgb3IKKyMgdXNlIHRoZSBKcGFja2FnZSBoZWxwZXIgaW4gcnBtIG1vZGUgd2l0aCBiYXNpYyBhbmQgZGVmYXVsdCBqYXJzCisjIHNwZWNpZmllZCBpbiB0aGUgYW50LmNvbmYgY29uZmlndXJhdGlvbi4gQmVjYXVzZSB0aGUgbGF1bmNoZXIgaXMKKyMgdXNlZCwgbGlicmFyaWVzIGxpbmtlZCBpbiBBTlRfSE9NRS9saWIgd2lsbCBhbHNvIGJlIGluY2x1ZGVkLCBidXQgdGhpcworIyBpcyBkaXNjb3VyYWdlZCBhcyBpdCBpcyBub3QgamF2YS12ZXJzaW9uIHNhZmUuIEEgdXNlciBzaG91bGQKKyMgcmVxdWVzdCBvcHRpb25hbCBqYXJzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgdmlhIHRoZSBPUFRfSkFSX0xJU1QKKyMgdmFyaWFibGUKK2lmICRycG1fbW9kZSAmJiBbIC14IC91c3IvYmluL2J1aWxkLWNsYXNzcGF0aCBdIDsgdGhlbgorICBMT0NBTENMQVNTUEFUSD0iJCgvdXNyL2Jpbi9idWlsZC1jbGFzc3BhdGggYW50IGFudC1sYXVuY2hlciBqYXhwX3BhcnNlcl9pbXBsIHhtbC1jb21tb25zLWFwaXMpIgorCisgICMgSWYgbm8gb3B0aW9uYWwgamFycyBoYXZlIGJlZW4gc3BlY2lmaWVkIHRoZW4gYnVpbGQgdGhlIGRlZmF1bHQgbGlzdAorICBpZiBbIC16ICIkT1BUX0pBUl9MSVNUIiBdIDsgdGhlbgorICAgIGZvciBmaWxlIGluIC9ldGMvYW50LmQvKjsgZG8KKyAgICAgIGlmIFsgLWYgIiRmaWxlIiBdOyB0aGVuCisgICAgICAgIGNhc2UgIiRmaWxlIiBpbgorICAgICAgICAqfikgOzsKKyAgICAgICAgKiMqKSA7OworICAgICAgICAqLnJwbXNhdmUpIDs7CisgICAgICAgICoucnBtbmV3KSA7OworICAgICAgICAqKQorICAgICAgICAgIGZvciBkZXAgaW4gYGNhdCAiJGZpbGUiYDsgZG8KKyAgICAgICAgICAgIGNhc2UgIiRPUFRfSkFSX0xJU1QiIGluCisgICAgICAgICAgICAqIiRkZXAiKikgOzsKKyAgICAgICAgICAgICopIE9QVF9KQVJfTElTVD0iJE9QVF9KQVJfTElTVCR7T1BUX0pBUl9MSVNUOisgfSRkZXAiCisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgZG9uZQorICAgICAgICBlc2FjCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKworICAjIElmIHRoZSB1c2VyIHJlcXVlc3RlZCB0byB0cnkgdG8gYWRkIHNvbWUgb3RoZXIgamFycyB0byB0aGUgY2xhc3NwYXRoCisgIGlmIFsgLW4gIiRPUFRfSkFSX0xJU1QiIF0gOyB0aGVuCisgICAgX09QVENMQVNTUEFUSD0iJCgvdXNyL2Jpbi9idWlsZC1jbGFzc3BhdGggJE9QVF9KQVJfTElTVCAyPiAvZGV2L251bGwpIgorICAgIGlmIFsgLW4gIiRfT1BUQ0xBU1NQQVRIIiBdIDsgdGhlbiAKKyAgICAgIExPQ0FMQ0xBU1NQQVRIPSIkTE9DQUxDTEFTU1BBVEg6JF9PUFRDTEFTU1BBVEgiCisgICAgZmkKKyAgZmkKKworICAjIEV4cGxpY2l0bHkgYWRkIGphdmFjIHBhdGggdG8gY2xhc3NwYXRoLCBhc3N1bWUgSkFWQV9IT01FIHNldAorICAjIHByb3Blcmx5IGluIHJwbSBtb2RlCisgIGlmIFsgLWYgIiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphciIgXSA7IHRoZW4KKyAgICBMT0NBTENMQVNTUEFUSD0iJExPQ0FMQ0xBU1NQQVRIOiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphciIKKyAgZmkKKyAgaWYgWyAtZiAiJEpBVkFfSE9NRS9saWIvY2xhc3Nlcy56aXAiIF0gOyB0aGVuCisgICAgTE9DQUxDTEFTU1BBVEg9IiRMT0NBTENMQVNTUEFUSDokSkFWQV9IT01FL2xpYi9jbGFzc2VzLnppcCIKKyAgZmkKKworICAjIGlmIENMQVNTUEFUSF9PVkVSUklERSBlbnYgdmFyIGlzIHNldCwgTE9DQUxDTEFTU1BBVEggd2lsbCBiZQorICAjIHVzZXIgQ0xBU1NQQVRIIGZpcnN0IGFuZCBhbnQtZm91bmQgamFycyBhZnRlci4KKyAgIyBJbiB0aGF0IGNhc2UsIHRoZSB1c2VyIENMQVNTUEFUSCB3aWxsIG92ZXJyaWRlIGFudC1mb3VuZCBqYXJzCisgICMKKyAgIyBpZiBDTEFTU1BBVEhfT1ZFUlJJREUgaXMgbm90IHNldCwgd2UnbGwgaGF2ZSB0aGUgbm9ybWFsIGJlaGF2aW91cgorICAjIHdpdGggYW50LWZvdW5kIGphcnMgZmlyc3QgYW5kIHVzZXIgQ0xBU1NQQVRIIGFmdGVyCisgIGlmIFsgLW4gIiRDTEFTU1BBVEgiIF0gOyB0aGVuCisgICAgIyBtZXJnZSBsb2NhbCBhbmQgc3BlY2lmaWVkIGNsYXNzcGF0aCAKKyAgICBpZiBbIC16ICIkTE9DQUxDTEFTU1BBVEgiIF0gOyB0aGVuIAorICAgICAgTE9DQUxDTEFTU1BBVEg9IiRDTEFTU1BBVEgiCisgICAgZWxpZiBbIC1uICIkQ0xBU1NQQVRIX09WRVJSSURFIiBdIDsgdGhlbgorICAgICAgTE9DQUxDTEFTU1BBVEg9IiRDTEFTU1BBVEg6JExPQ0FMQ0xBU1NQQVRIIgorICAgIGVsc2UKKyAgICAgIExPQ0FMQ0xBU1NQQVRIPSIkTE9DQUxDTEFTU1BBVEg6JENMQVNTUEFUSCIKKyAgICBmaQorCisgICAgIyByZW1vdmUgY2xhc3MgcGF0aCBmcm9tIGxhdW5jaGVyIC1jcCBvcHRpb24KKyAgICBDTEFTU1BBVEg9IiIKKyAgZmkKK2Vsc2UKKyAgIyBub3QgdXNpbmcgcnBtX21vZGU7IHVzZSBsYXVuY2hlciB0byBkZXRlcm1pbmUgY2xhc3NwYXRocworICBpZiBbIC16ICIkTE9DQUxDTEFTU1BBVEgiIF0gOyB0aGVuCisgICAgICBMT0NBTENMQVNTUEFUSD0kQU5UX0xJQi9hbnQtbGF1bmNoZXIuamFyCisgIGVsc2UKKyAgICAgIExPQ0FMQ0xBU1NQQVRIPSRBTlRfTElCL2FudC1sYXVuY2hlci5qYXI6JExPQ0FMQ0xBU1NQQVRICisgIGZpCitmaQorCitpZiBbIC1uICIkSkFWQV9IT01FIiBdIDsgdGhlbgorICAjIE9TWCBoYWNrIHRvIG1ha2UgQW50IHdvcmsgd2l0aCBqaWtlcworICBpZiAkZGFyd2luIDsgdGhlbgorICAgIE9TWEhBQ0s9IiR7SkFWQV9IT01FfS8uLi9DbGFzc2VzIgorICAgIGlmIFsgLWQgIiR7T1NYSEFDS30iIF0gOyB0aGVuCisgICAgICBmb3IgaSBpbiAiJHtPU1hIQUNLfSIvKi5qYXIKKyAgICAgIGRvCisgICAgICAgIEpJS0VTUEFUSD0iJEpJS0VTUEFUSDokaSIKKyAgICAgIGRvbmUKKyAgICBmaQorICBmaQorZmkKKworIyBBbGxvdyBKaWtlcyBzdXBwb3J0IChvZmYgYnkgZGVmYXVsdCkKK2lmICR1c2VqaWtlczsgdGhlbgorICBBTlRfT1BUUz0iJEFOVF9PUFRTIC1EYnVpbGQuY29tcGlsZXI9amlrZXMiCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBhcHByb3ByaWF0ZSBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQorIyBGb3IgUEFUSHMgY29udmVydCB0byB1bml4IGZvcm1hdCBmaXJzdCwgdGhlbiB0byB3aW5kb3dzIGZvcm1hdCB0byBlbnN1cmUKKyMgYm90aCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuIFByb2JhYmx5IHRoaXMgd2lsbCBmYWlsIG9uIGRpcmVjdG9yaWVzIHdpdGggOworIyBpbiB0aGUgbmFtZSBpbiB0aGUgcGF0aC4gTGV0J3MgYXNzdW1lIHRoYXQgcGF0aHMgY29udGFpbmluZyA7IGFyZSBtb3JlCisjIHJhcmUgdGhhbiB3aW5kb3dzIHN0eWxlIHBhdGhzIG9uIGN5Z3dpbi4KK2lmICRjeWd3aW47IHRoZW4KKyAgaWYgWyAiJE9TIiA9ICJXaW5kb3dzX05UIiBdICYmIGN5Z3BhdGggLW0gLj4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCisgICAgZm9ybWF0PW1peGVkCisgIGVsc2UKKyAgICBmb3JtYXQ9d2luZG93cworICBmaQorICBBTlRfSE9NRT1gY3lncGF0aCAtLSRmb3JtYXQgIiRBTlRfSE9NRSJgCisgIEFOVF9MSUI9YGN5Z3BhdGggLS0kZm9ybWF0ICIkQU5UX0xJQiJgCisgIEpBVkFfSE9NRT1gY3lncGF0aCAtLSRmb3JtYXQgIiRKQVZBX0hPTUUiYAorICBMQ1BfVEVNUD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkTE9DQUxDTEFTU1BBVEgiYAorICBMT0NBTENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS0kZm9ybWF0ICIkTENQX1RFTVAiYAorICBpZiBbIC1uICIkQ0xBU1NQQVRIIiBdIDsgdGhlbgorICAgIENQX1RFTVA9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCisgICAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLSRmb3JtYXQgIiRDUF9URU1QImAKKyAgZmkKKyAgQ1lHSE9NRT1gY3lncGF0aCAtLSRmb3JtYXQgIiRIT01FImAKK2ZpCisKKyMgU2hvdyBzY3JpcHQgaGVscCBpZiByZXF1ZXN0ZWQKK2lmICRzaG93X2hlbHAgOyB0aGVuCisgIGVjaG8gJDAgJ1tzY3JpcHQgb3B0aW9uc10gW29wdGlvbnNdIFt0YXJnZXQgW3RhcmdldDIgW3RhcmdldDNdIC4uXV0nCisgIGVjaG8gJ1NjcmlwdCBPcHRpb25zOicKKyAgZWNobyAnICAtLWhlbHAsIC0taCAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSBhbmQgYW50IGhlbHAnCisgIGVjaG8gJyAgLS1ub2NvbmZpZyAgICAgICAgICAgICBzdXBwcmVzcyBzb3VyY2luZyBvZiAvZXRjL2FudC5jb25mLCcKKyAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgICAgICRIT01FLy5hbnQvYW50LmNvbmYsIGFuZCAkSE9NRS8uYW50cmMnCisgIGVjaG8gJyAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzJworICBlY2hvICcgIC0tdXNlamlrZXMgICAgICAgICAgICAgZW5hYmxlIHVzZSBvZiBqaWtlcyBieSBkZWZhdWx0LCB1bmxlc3MnCisgIGVjaG8gJyAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXhwbGljaXRseSBpbiBjb25maWd1cmF0aW9uIGZpbGVzJworICBlY2hvICcgIC0tZXhlY2RlYnVnICAgICAgICAgICAgcHJpbnQgYW50IGV4ZWMgbGluZSBnZW5lcmF0ZWQgYnkgdGhpcycKKyAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaCBzY3JpcHQnCisgIGVjaG8gJyAgJworZmkKKyMgYWRkIGEgc2Vjb25kIGJhY2tzbGFzaCB0byB2YXJpYWJsZXMgdGVybWluYXRlZCBieSBhIGJhY2tzbGFzaCB1bmRlciBjeWd3aW4KK2lmICRjeWd3aW47IHRoZW4KKyAgY2FzZSAiJEFOVF9IT01FIiBpbgorICAgICpcXCApCisgICAgQU5UX0hPTUU9IiRBTlRfSE9NRVxcIgorICAgIDs7CisgIGVzYWMKKyAgY2FzZSAiJENZR0hPTUUiIGluCisgICAgKlxcICkKKyAgICBDWUdIT01FPSIkQ1lHSE9NRVxcIgorICAgIDs7CisgIGVzYWMKKyAgY2FzZSAiJEpJS0VTUEFUSCIgaW4KKyAgICAqXFwgKQorICAgIEpJS0VTUEFUSD0iJEpJS0VTUEFUSFxcIgorICAgIDs7CisgIGVzYWMKKyAgY2FzZSAiJExPQ0FMQ0xBU1NQQVRIIiBpbgorICAgICpcXCApCisgICAgTE9DQUxDTEFTU1BBVEg9IiRMT0NBTENMQVNTUEFUSFxcIgorICAgIDs7CisgIGVzYWMKKyAgY2FzZSAiJENMQVNTUEFUSCIgaW4KKyAgICAqXFwgKQorICAgIENMQVNTUEFUSD0iJENMQVNTUEFUSFxcIgorICAgIDs7CisgIGVzYWMKK2ZpCisjIEV4ZWN1dGUgYW50IHVzaW5nIGV2YWwvZXhlYyB0byBwcmVzZXJ2ZSBzcGFjZXMgaW4gcGF0aHMsCisjIGphdmEgb3B0aW9ucywgYW5kIGFudCBhcmdzCithbnRfc3lzX29wdHM9CitpZiBbIC1uICIkQ1lHSE9NRSIgXTsgdGhlbgorICBpZiBbIC1uICIkSklLRVNQQVRIIiBdOyB0aGVuCisgICAgYW50X3N5c19vcHRzPSItRGppa2VzLmNsYXNzLnBhdGg9XCIkSklLRVNQQVRIXCIgLURjeWd3aW4udXNlci5ob21lPVwiJENZR0hPTUVcIiIKKyAgZWxzZQorICAgIGFudF9zeXNfb3B0cz0iLURjeWd3aW4udXNlci5ob21lPVwiJENZR0hPTUVcIiIKKyAgZmkKK2Vsc2UKKyAgaWYgWyAtbiAiJEpJS0VTUEFUSCIgXTsgdGhlbgorICAgIGFudF9zeXNfb3B0cz0iLURqaWtlcy5jbGFzcy5wYXRoPVwiJEpJS0VTUEFUSFwiIgorICBmaQorZmkKK2FudF9leGVjX2NvbW1hbmQ9ImV4ZWMgXCIkSkFWQUNNRFwiICRBTlRfT1BUUyAtY2xhc3NwYXRoIFwiJExPQ0FMQ0xBU1NQQVRIXCIgLURhbnQuaG9tZT1cIiRBTlRfSE9NRVwiIC1EYW50LmxpYnJhcnkuZGlyPVwiJEFOVF9MSUJcIiAkYW50X3N5c19vcHRzIG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciAkQU5UX0FSR1MgLWNwIFwiJENMQVNTUEFUSFwiICRhbnRfZXhlY19hcmdzIgoraWYgJGFudF9leGVjX2RlYnVnIDsgdGhlbgorICAgIGVjaG8gJGFudF9leGVjX2NvbW1hbmQKK2ZpCitldmFsICRhbnRfZXhlY19jb21tYW5kCmRpZmYgLS1naXQgYS90cnVuay9zcmMvc2NyaXB0L2FudC5iYXQgYi90cnVuay9zcmMvc2NyaXB0L2FudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmQ1N2M4MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9zY3JpcHQvYW50LmJhdApAQCAtMCwwICsxLDIyNiBAQAorQGVjaG8gb2ZmCisKK1JFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitSRU0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorUkVNICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitSRU0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCitSRU0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCitSRU0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitSRU0gCitSRU0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1JFTSAKK1JFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorUkVNICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorUkVNICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1JFTSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorUkVNICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworUkVNIFRoaXMgaXMgYW4gaW5vcmRpbmF0ZWx5IHRyb3VibGVzb21lIHBpZWNlIG9mIGNvZGUsIHBhcnRpY3VsYXJseSBiZWNhdXNlIGl0CitSRU0gdHJpZXMgdG8gd29yayBvbiBib3RoIFdpbjl4IGFuZCBXaW5OVC1iYXNlZCBzeXN0ZW1zLiBJZiB3ZSBjb3VsZCBhYmFuZG9uICc5eAorUkVNIHN1cHBvcnQsIHRoaW5ncyB3b3VsZCBiZSBtdWNoIGVhc2llciwgYnV0IHNhZGx5LCBpdCBpcyBub3QgeWV0IHRpbWUuCitSRU0gQmUgY2F1dGlvdXMgYWJvdXQgZWRpdGluZyB0aGlzLCBhbmQgb25seSBhZGQgV2luTlQgc3BlY2lmaWMgc3R1ZmYgaW4gY29kZSB0aGF0CitSRU0gb25seSBydW5zIG9uIFdpbk5ULgorCitpZiAiJUhPTUUlIj09IiIgZ290byBob21lRHJpdmVQYXRoUHJlCitpZiBleGlzdCAiJUhPTUUlXGFudHJjX3ByZS5iYXQiIGNhbGwgIiVIT01FJVxhbnRyY19wcmUuYmF0IgorCis6aG9tZURyaXZlUGF0aFByZQoraWYgIiVIT01FRFJJVkUlJUhPTUVQQVRIJSI9PSIiIGdvdG8gdXNlclByb2ZpbGVQcmUKK2lmICIlSE9NRURSSVZFJSVIT01FUEFUSCUiPT0iJUhPTUUlIiBnb3RvIHVzZXJQcm9maWxlUHJlCitpZiBleGlzdCAiJUhPTUVEUklWRSUlSE9NRVBBVEglXGFudHJjX3ByZS5iYXQiIGNhbGwgIiVIT01FRFJJVkUlJUhPTUVQQVRIJVxhbnRyY19wcmUuYmF0IgorCis6dXNlclByb2ZpbGVQcmUKK2lmICIlVVNFUlBST0ZJTEUlIj09IiIgZ290byBhbHBoYQoraWYgIiVVU0VSUFJPRklMRSUiPT0iJUhPTUUlIiBnb3RvIGFscGhhCitpZiAiJVVTRVJQUk9GSUxFJSI9PSIlSE9NRURSSVZFJSVIT01FUEFUSCUiIGdvdG8gYWxwaGEKK2lmIGV4aXN0ICIlVVNFUlBST0ZJTEUlXGFudHJjX3ByZS5iYXQiIGNhbGwgIiVVU0VSUFJPRklMRSVcYW50cmNfcHJlLmJhdCIKKworOmFscGhhCisKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIEBzZXRsb2NhbAoraWYgIiVPUyUiPT0iV0lOTlQiIEBzZXRsb2NhbAorCitpZiAiJUFOVF9IT01FJSI9PSIiIGdvdG8gc2V0RGVmYXVsdEFudEhvbWUKKworOnN0cmlwQW50SG9tZQoraWYgbm90IF8lQU5UX0hPTUU6fi0xJT09X1wgZ290byBjaGVja0NsYXNzcGF0aAorc2V0IEFOVF9IT01FPSVBTlRfSE9NRTp+MCwtMSUKK2dvdG8gc3RyaXBBbnRIb21lCisKKzpzZXREZWZhdWx0QW50SG9tZQorcmVtICV+ZHAwIGlzIGV4cGFuZGVkIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHNjcmlwdCB1bmRlciBOVAorc2V0IEFOVF9IT01FPSV+ZHAwLi4KKworOmNoZWNrQ2xhc3NwYXRoCitzZXQgX1VTRV9DTEFTU1BBVEg9eWVzCityZW0gQ0xBU1NQQVRIIG11c3Qgbm90IGJlIHVzZWQgaWYgaXQgaXMgZXF1YWwgdG8gIiIKK2lmICIlQ0xBU1NQQVRIJSI9PSIiIiIgc2V0IF9VU0VfQ0xBU1NQQVRIPW5vCitpZiAiJUNMQVNTUEFUSCUiPT0iIiBzZXQgX1VTRV9DTEFTU1BBVEg9bm8KKworcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBUaGlzIGxvb3AgYWxsb3dzIGZvciBhbiB1bmxpbWl0ZWQgbnVtYmVyCityZW0gb2YgYXJndW1lbnRzICh1cCB0byB0aGUgY29tbWFuZCBsaW5lIGxpbWl0LCBhbnl3YXkpLgorc2V0IEFOVF9DTURfTElORV9BUkdTPSUxCitpZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU3RhcnQKK3NoaWZ0Cis6c2V0dXBBcmdzCitpZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU3RhcnQKK2lmICIiJTEiIj09IiItbm9jbGFzc3BhdGgiIiBnb3RvIGNsZWFyY2xhc3NwYXRoCitzZXQgQU5UX0NNRF9MSU5FX0FSR1M9JUFOVF9DTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0dXBBcmdzCisKK3JlbSBoZXJlIGlzIHRoZXJlIGlzIGEgLW5vY2xhc3NwYXRoIGluIHRoZSBvcHRpb25zCis6Y2xlYXJjbGFzc3BhdGgKK3NldCBfVVNFX0NMQVNTUEFUSD1ubworc2hpZnQKK2dvdG8gc2V0dXBBcmdzCisKK3JlbSBUaGlzIGxhYmVsIHByb3ZpZGVzIGEgcGxhY2UgZm9yIHRoZSBhcmd1bWVudCBsaXN0IGxvb3AgdG8gYnJlYWsgb3V0CityZW0gYW5kIGZvciBOVCBoYW5kbGluZyB0byBza2lwIHRvLgorCis6ZG9uZVN0YXJ0CisKK2lmIF9VU0VfQ0xBU1NQQVRIPT1ubyBnb3RvIGZpbmRBbnRIb21lCisKKzpzdHJpcENsYXNzcGF0aAoraWYgbm90IF8lQ0xBU1NQQVRIOn4tMSU9PV9cIGdvdG8gZmluZEFudEhvbWUKK3NldCBDTEFTU1BBVEg9JUNMQVNTUEFUSDp+MCwtMSUKK2dvdG8gc3RyaXBDbGFzc3BhdGgKKworOmZpbmRBbnRIb21lCityZW0gZmluZCBBTlRfSE9NRSBpZiBpdCBkb2VzIG5vdCBleGlzdCBkdWUgdG8gZWl0aGVyIGFuIGludmFsaWQgdmFsdWUgcGFzc2VkCityZW0gYnkgdGhlIHVzZXIgb3IgdGhlICUwIHByb2JsZW0gb24gV2luZG93cyA5eAoraWYgZXhpc3QgIiVBTlRfSE9NRSVcbGliXGFudC5qYXIiIGdvdG8gY2hlY2tKYXZhCisKK3JlbSBjaGVjayBmb3IgYW50IGluIFByb2dyYW0gRmlsZXMKK2lmIG5vdCBleGlzdCAiJVByb2dyYW1GaWxlcyVcYW50IiBnb3RvIGNoZWNrU3lzdGVtRHJpdmUKK3NldCBBTlRfSE9NRT0lUHJvZ3JhbUZpbGVzJVxhbnQKK2dvdG8gY2hlY2tKYXZhCisKKzpjaGVja1N5c3RlbURyaXZlCityZW0gY2hlY2sgZm9yIGFudCBpbiByb290IGRpcmVjdG9yeSBvZiBzeXN0ZW0gZHJpdmUKK2lmIG5vdCBleGlzdCAlU3lzdGVtRHJpdmUlXGFudFxsaWJcYW50LmphciBnb3RvIGNoZWNrQ0RyaXZlCitzZXQgQU5UX0hPTUU9JVN5c3RlbURyaXZlJVxhbnQKK2dvdG8gY2hlY2tKYXZhCisKKzpjaGVja0NEcml2ZQorcmVtIGNoZWNrIGZvciBhbnQgaW4gQzpcYW50IGZvciBXaW45WCB1c2VycworaWYgbm90IGV4aXN0IEM6XGFudFxsaWJcYW50LmphciBnb3RvIG5vQW50SG9tZQorc2V0IEFOVF9IT01FPUM6XGFudAorZ290byBjaGVja0phdmEKKworOm5vQW50SG9tZQorZWNobyBBTlRfSE9NRSBpcyBzZXQgaW5jb3JyZWN0bHkgb3IgYW50IGNvdWxkIG5vdCBiZSBsb2NhdGVkLiBQbGVhc2Ugc2V0IEFOVF9IT01FLgorZ290byBlbmQKKworOmNoZWNrSmF2YQorc2V0IF9KQVZBQ01EPSVKQVZBQ01EJQorCitpZiAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gbm9KYXZhSG9tZQoraWYgbm90IGV4aXN0ICIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIGdvdG8gbm9KYXZhSG9tZQoraWYgIiVfSkFWQUNNRCUiID09ICIiIHNldCBfSkFWQUNNRD0lSkFWQV9IT01FJVxiaW5camF2YS5leGUKK2dvdG8gY2hlY2tKaWtlcworCis6bm9KYXZhSG9tZQoraWYgIiVfSkFWQUNNRCUiID09ICIiIHNldCBfSkFWQUNNRD1qYXZhLmV4ZQorCis6Y2hlY2tKaWtlcworaWYgbm90ICIlSklLRVNQQVRIJSI9PSIiIGdvdG8gcnVuQW50V2l0aEppa2VzCisKKzpydW5BbnQKK2lmICIlX1VTRV9DTEFTU1BBVEglIj09Im5vIiBnb3RvIHJ1bkFudE5vQ2xhc3NwYXRoCis6cnVuQW50V2l0aENsYXNzcGF0aAorIiVfSkFWQUNNRCUiICVBTlRfT1BUUyUgLWNsYXNzcGF0aCAiJUFOVF9IT01FJVxsaWJcYW50LWxhdW5jaGVyLmphciIgIi1EYW50LmhvbWU9JUFOVF9IT01FJSIgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyICVBTlRfQVJHUyUgLWNwICIlQ0xBU1NQQVRIJSIgJUFOVF9DTURfTElORV9BUkdTJQorcmVtIENoZWNrIHRoZSBlcnJvciBjb2RlIG9mIHRoZSBBbnQgYnVpbGQKK2lmIG5vdCAiJU9TJSI9PSJXaW5kb3dzX05UIiBnb3RvIG9uRXJyb3IKK3NldCBBTlRfRVJST1I9JUVSUk9STEVWRUwlCitnb3RvIGVuZAorCis6cnVuQW50Tm9DbGFzc3BhdGgKKyIlX0pBVkFDTUQlIiAlQU5UX09QVFMlIC1jbGFzc3BhdGggIiVBTlRfSE9NRSVcbGliXGFudC1sYXVuY2hlci5qYXIiICItRGFudC5ob21lPSVBTlRfSE9NRSUiIG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciAlQU5UX0FSR1MlICVBTlRfQ01EX0xJTkVfQVJHUyUKK3JlbSBDaGVjayB0aGUgZXJyb3IgY29kZSBvZiB0aGUgQW50IGJ1aWxkCitpZiBub3QgIiVPUyUiPT0iV2luZG93c19OVCIgZ290byBvbkVycm9yCitzZXQgQU5UX0VSUk9SPSVFUlJPUkxFVkVMJQorZ290byBlbmQKKworOnJ1bkFudFdpdGhKaWtlcworCitpZiBub3QgXyVKSUtFU1BBVEg6fi0xJT09X1wgZ290byBjaGVja0ppa2VzQW5kQ2xhc3NwYXRoCitzZXQgSklLRVNQQVRIPSVKSUtFU1BBVEg6fjAsLTElCitnb3RvIHJ1bkFudFdpdGhKaWtlcworCis6Y2hlY2tKaWtlc0FuZENsYXNzcGF0aAorCitpZiAiJV9VU0VfQ0xBU1NQQVRIJSI9PSJubyIgZ290byBydW5BbnRXaXRoSmlrZXNOb0NsYXNzcGF0aAorCis6cnVuQW50V2l0aEppa2VzQW5kQ2xhc3NwYXRoCisiJV9KQVZBQ01EJSIgJUFOVF9PUFRTJSAtY2xhc3NwYXRoICIlQU5UX0hPTUUlXGxpYlxhbnQtbGF1bmNoZXIuamFyIiAiLURhbnQuaG9tZT0lQU5UX0hPTUUlIiAiLURqaWtlcy5jbGFzcy5wYXRoPSVKSUtFU1BBVEglIiBvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIgJUFOVF9BUkdTJSAgLWNwICIlQ0xBU1NQQVRIJSIgJUFOVF9DTURfTElORV9BUkdTJQorcmVtIENoZWNrIHRoZSBlcnJvciBjb2RlIG9mIHRoZSBBbnQgYnVpbGQKK2lmIG5vdCAiJU9TJSI9PSJXaW5kb3dzX05UIiBnb3RvIG9uRXJyb3IKK3NldCBBTlRfRVJST1I9JUVSUk9STEVWRUwlCitnb3RvIGVuZAorCis6cnVuQW50V2l0aEppa2VzTm9DbGFzc3BhdGgKKyIlX0pBVkFDTUQlIiAlQU5UX09QVFMlIC1jbGFzc3BhdGggIiVBTlRfSE9NRSVcbGliXGFudC1sYXVuY2hlci5qYXIiICItRGFudC5ob21lPSVBTlRfSE9NRSUiICItRGppa2VzLmNsYXNzLnBhdGg9JUpJS0VTUEFUSCUiIG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciAlQU5UX0FSR1MlICVBTlRfQ01EX0xJTkVfQVJHUyUKK3JlbSBDaGVjayB0aGUgZXJyb3IgY29kZSBvZiB0aGUgQW50IGJ1aWxkCitpZiBub3QgIiVPUyUiPT0iV2luZG93c19OVCIgZ290byBvbkVycm9yCitzZXQgQU5UX0VSUk9SPSVFUlJPUkxFVkVMJQorZ290byBlbmQKKworOm9uRXJyb3IKK3JlbSBXaW5kb3dzIDl4IHdheSBvZiBjaGVja2luZyB0aGUgZXJyb3IgY29kZS4gIEl0IG1hdGNoZXMgdmlhIGJydXRlIGZvcmNlLgorZm9yICUlaSBpbiAoMSAxMCAxMDApIGRvIHNldCBlcnIlJWk9Citmb3IgJSVpIGluICgwIDEgMikgZG8gaWYgZXJyb3JsZXZlbCAlJWkwMCBzZXQgZXJyMTAwPSUlaQoraWYgJWVycjEwMCU9PTIgZ290byBvbkVycm9yMjAwCitpZiAlZXJyMTAwJT09MCBzZXQgZXJyMTAwPQorZm9yICUlaSBpbiAoMCAxIDIgMyA0IDUgNiA3IDggOSkgZG8gaWYgZXJyb3JsZXZlbCAlZXJyMTAwJSUlaTAgc2V0IGVycjEwPSUlaQoraWYgIiVlcnIxMDAlIj09IiIgaWYgJWVycjEwJT09MCBzZXQgZXJyMTA9Cis6b25FcnJvcjEKK2ZvciAlJWkgaW4gKDAgMSAyIDMgNCA1IDYgNyA4IDkpIGRvIGlmIGVycm9ybGV2ZWwgJWVycjEwMCUlZXJyMTAlJSVpIHNldCBlcnIxPSUlaQorZ290byBvbkVycm9yRW5kCis6b25FcnJvcjIwMAorZm9yICUlaSBpbiAoMCAxIDIgMyA0IDUpIGRvIGlmIGVycm9ybGV2ZWwgMiUlaTAgc2V0IGVycjEwPSUlaQoraWYgZXJyMTA9PTUgZm9yICUlaSBpbiAoMCAxIDIgMyA0IDUpIGRvIGlmIGVycm9ybGV2ZWwgMjUlJWkgc2V0IGVycjE9JSVpCitpZiBub3QgZXJyMTA9PTUgZ290byBvbkVycm9yMQorOm9uRXJyb3JFbmQKK3NldCBBTlRfRVJST1I9JWVycjEwMCUlZXJyMTAlJWVycjElCitmb3IgJSVpIGluICgxIDEwIDEwMCkgZG8gc2V0IGVyciUlaT0KKworOmVuZAorcmVtIGJ1ZyBJRCAzMjA2OTogcmVzZXR0aW5nIGFuIHVuZGVmaW5lZCBlbnYgdmFyaWFibGUgY2hhbmdlcyB0aGUgZXJyb3JsZXZlbC4KK2lmIG5vdCAiJV9KQVZBQ01EJSI9PSIiIHNldCBfSkFWQUNNRD0KK2lmIG5vdCAiJV9BTlRfQ01EX0xJTkVfQVJHUyUiPT0iIiBzZXQgQU5UX0NNRF9MSU5FX0FSR1M9CisKK2lmICIlQU5UX0VSUk9SJSI9PSIwIiBnb3RvIG1haW5FbmQKKworcmVtIFNldCB0aGUgcmV0dXJuIGNvZGUgaWYgd2UgYXJlIG5vdCBpbiBOVC4gIFdlIGNhbiBvbmx5IHNldAorcmVtIGEgdmFsdWUgb2YgMSwgYnV0IGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZy4KK2lmIG5vdCAiJU9TJSI9PSJXaW5kb3dzX05UIiBlY2hvIDEgPiBudWwgfCBjaG9pY2UgL24gL2M6MQorCityZW0gU2V0IHRoZSBFUlJPUkxFVkVMIGlmIHdlIGFyZSBydW5uaW5nIE5ULgoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgY29sb3IgMDAKKworZ290byBvbWVnYQorCis6bWFpbkVuZAorCityZW0gSWYgdGhlcmUgd2VyZSBubyBlcnJvcnMsIHdlIHJ1biB0aGUgcG9zdCBzY3JpcHQuCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBAZW5kbG9jYWwKK2lmICIlT1MlIj09IldJTk5UIiBAZW5kbG9jYWwKKworaWYgIiVIT01FJSI9PSIiIGdvdG8gaG9tZURyaXZlUGF0aFBvc3QKK2lmIGV4aXN0ICIlSE9NRSVcYW50cmNfcG9zdC5iYXQiIGNhbGwgIiVIT01FJVxhbnRyY19wb3N0LmJhdCIKKworOmhvbWVEcml2ZVBhdGhQb3N0CitpZiAiJUhPTUVEUklWRSUlSE9NRVBBVEglIj09IiIgZ290byB1c2VyUHJvZmlsZVBvc3QKK2lmICIlSE9NRURSSVZFJSVIT01FUEFUSCUiPT0iJUhPTUUlIiBnb3RvIHVzZXJQcm9maWxlUG9zdAoraWYgZXhpc3QgIiVIT01FRFJJVkUlJUhPTUVQQVRIJVxhbnRyY19wb3N0LmJhdCIgY2FsbCAiJUhPTUVEUklWRSUlSE9NRVBBVEglXGFudHJjX3Bvc3QuYmF0IgorCis6dXNlclByb2ZpbGVQb3N0CitpZiAiJVVTRVJQUk9GSUxFJSI9PSIiIGdvdG8gb21lZ2EKK2lmICIlVVNFUlBST0ZJTEUlIj09IiVIT01FJSIgZ290byBvbWVnYQoraWYgIiVVU0VSUFJPRklMRSUiPT0iJUhPTUVEUklWRSUlSE9NRVBBVEglIiBnb3RvIG9tZWdhCitpZiBleGlzdCAiJVVTRVJQUk9GSUxFJVxhbnRyY19wb3N0LmJhdCIgY2FsbCAiJVVTRVJQUk9GSUxFJVxhbnRyY19wb3N0LmJhdCIKKworOm9tZWdhCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9zY3JpcHQvYW50LmNtZCBiL3RydW5rL3NyYy9zY3JpcHQvYW50LmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjIxYTQwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3NjcmlwdC9hbnQuY21kCkBAIC0wLDAgKzEsOTMgQEAKKy8qIAorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAKKyAgICBSdW4gYW50CisqLworCisnQGVjaG8gb2ZmJworcGFyc2UgYXJnIG1vZGUgZW52YXJnICc6OicgYW50YXJnCisKK2lmIG1vZGVcPScuJyAmIG1vZGVcPScuLicgJiBtb2RlXD0nLycgdGhlbiBkbworICBlbnZhcmcgPSBtb2RlIGVudmFyZworICBtb2RlID0gJycKK2VuZAorCitpZiBhbnRhcmcgPSAnJyB0aGVuIGRvCisgIGFudGFyZyA9IGVudmFyZworICBlbnZhcmcgPSAnJworZW5kCisKK3ggPSBzZXRsb2NhbCgpCisKK2Vudj0iT1MyRU5WSVJPTk1FTlQiCithbnRlbnYgPSBfZ2V0ZW52XygnYW50ZW52JykKK2lmIF90ZXN0ZW52XygpID0gMCB0aGVuIGludGVycHJldCAnY2FsbCAiJyB8fCBhbnRlbnYgfHwgJyInICciJyB8fCBlbnZhcmcgfHwgJyInCisKK2lmIG1vZGUgPSAnJyB0aGVuIG1vZGUgPSBfZ2V0ZW52XygnQU5UX01PREUnICcuLicpCitpZiBtb2RlIFw9ICcvJyB0aGVuIGRvCisgIHJ1bnJjID0gX2dldGVudl8oJ3J1bnJjJykKKyAgYW50cmMgPSBfZ2V0ZW52XygnYW50cmMnICdhbnRyYy5jbWQnKQorICBpZiBtb2RlID0gJy4uJyB0aGVuIG1vZGUgPSAnLXInCisgIGVsc2UgbW9kZSA9ICcnCisgIGludGVycHJldCAnY2FsbCAiJyB8fCBydW5yYyB8fCAnIicgYW50cmMgJyInIHx8IG1vZGUgfHwgJyInCitlbmQKKworaWYgX3Rlc3RlbnZfKCkgPSAwIHRoZW4gZG8KKyAgc2F5ICdBbnQgZW52aXJvbm1lbnQgaXMgbm90IHNldCBwcm9wZXJseScKKyAgeCA9IGVuZGxvY2FsKCkKKyAgZXhpdCAxNgorZW5kCisKK3NldHRpbmdzID0gJy1EYW50LmhvbWU9JyB8fCBBTlRfSE9NRSAnLURqYXZhLmhvbWU9JyB8fCBKQVZBX0hPTUUKKworamF2YSA9IF9nZXRlbnZfKCdqYXZhY21kJyAnamF2YScpCitvcHRzID0gdmFsdWUoJ0FOVF9PUFRTJywsZW52KQorYXJncyA9IHZhbHVlKCdBTlRfQVJHUycsLGVudikKK2xjcCA9IHZhbHVlKCdMT0NBTENMQVNTUEFUSCcsLGVudikKK2NwID0gdmFsdWUoJ0NMQVNTUEFUSCcsLGVudikKK2lmIHZhbHVlKCdBTlRfVVNFX0NQJywsZW52KSBcPSAnJyB0aGVuIGRvCisgIGlmIGxjcCBcPSAnJyAmIHJpZ2h0KGxjcCwgMSkgXD0gJzsnIHRoZW4gbGNwID0gbGNwIHx8ICc7JworICBsY3AgPSBsY3AgfHwgY3AKKyAgJ1NFVCBDTEFTU1BBVEg9JworZW5kCitpZiBsY3BcPScnIHRoZW4gbGNwID0gJy1jbGFzc3BhdGgnIGxjcAorCitjbWQgPSBqYXZhIG9wdHMgbGNwICctamFyJyBBTlRfSE9NRSB8fCdcbGliXGFudC1sYXVuY2hlci5qYXInIHNldHRpbmdzIGFyZ3MgYW50YXJnCitsYXVuY2hlciA9IHN0cmVhbShBTlRfSE9NRSB8fCdcbGliXGFudC1sYXVuY2hlci5qYXInLCAnQycsICdxdWVyeSBleGlzdHMnKQoraWYgbGF1bmNoZXIgPSAnJyB0aGVuIGVudHJ5ID0gJ29yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4nCitlbHNlIGVudHJ5ID0gJ29yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlcicKK2phdmEgb3B0cyBsY3AgZW50cnkgc2V0dGluZ3MgYXJncyBhbnRhcmcKKworeCA9IGVuZGxvY2FsKCkKKworcmV0dXJuIHJjCisKK190ZXN0ZW52XzogcHJvY2VkdXJlIGV4cG9zZSBlbnYgQU5UX0hPTUUgSkFWQV9IT01FCitBTlRfSE9NRSA9IHZhbHVlKCdBTlRfSE9NRScsLGVudikKK2lmIEFOVF9IT01FID0gJycgdGhlbiByZXR1cm4gMAorSkFWQV9IT01FID0gdmFsdWUoJ0pBVkFfSE9NRScsLGVudikKK2lmIEpBVkFfSE9NRSA9ICcnIHRoZW4gcmV0dXJuIDAKK2NwID0gdHJhbnNsYXRlKHZhbHVlKCdDTEFTU1BBVEgnLCxlbnYpKQoraWYgcG9zKHRyYW5zbGF0ZShBTlRfSE9NRSksIGNwKSA9IDAgdGhlbiByZXR1cm4gMAoraWYgcG9zKHRyYW5zbGF0ZShKQVZBX0hPTUUpLCBjcCkgPSAwIHRoZW4gcmV0dXJuIDAKK3JldHVybiAxCisKK19nZXRlbnZfOiBwcm9jZWR1cmUgZXhwb3NlIGVudgorcGFyc2UgYXJnIGVudmFyIGRlZmF1bHQKK2lmIGRlZmF1bHQgPSAnJyB0aGVuIGRlZmF1bHQgPSBlbnZhcgordmFyID0gdmFsdWUodHJhbnNsYXRlKGVudmFyKSwsZW52KQoraWYgdmFyID0gJycgdGhlbiB2YXIgPSBkZWZhdWx0CityZXR1cm4gdmFyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvc2NyaXB0L2FudFJ1biBiL3RydW5rL3NyYy9zY3JpcHQvYW50UnVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTBmODYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvc2NyaXB0L2FudFJ1bgpAQCAtMCwwICsxLDI0IEBACisjISAvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBcmdzOiBESVIgY29tbWFuZAorY2QgIiQxIgorQ01EPSIkMiIKK3NoaWZ0CitzaGlmdAorCitleGVjICIkQ01EIiAiJEAiCmRpZmYgLS1naXQgYS90cnVuay9zcmMvc2NyaXB0L2FudFJ1bi5iYXQgYi90cnVuay9zcmMvc2NyaXB0L2FudFJ1bi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTBkMmJiYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9zY3JpcHQvYW50UnVuLmJhdApAQCAtMCwwICsxLDUwIEBACitAZWNobyBvZmYKKworUkVNICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK1JFTSAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCitSRU0gIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1JFTSAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKK1JFTSAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK1JFTSAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK1JFTSAKK1JFTSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorUkVNIAorUkVNICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitSRU0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitSRU0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorUkVNICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitSRU0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBAc2V0bG9jYWwKK2lmICIlT1MlIj09IldJTk5UIiBAc2V0bG9jYWwKKworaWYgIiIlMSIiPT0iIiIiIGdvdG8gcnVuQ29tbWFuZAorCityZW0gQ2hhbmdlIGRyaXZlIGFuZCBkaXJlY3RvcnkgdG8gJTEKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIGdvdG8gbnRfY2QKK2lmICIlT1MlIj09IldJTk5UIiBnb3RvIG50X2NkCitjZCAiIiUxIiIKK2dvdG8gZW5kX2NkCis6bnRfY2QKK2NkIC9kICIiJTEiIgorOmVuZF9jZAorc2hpZnQKKworcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBUaGlzIGxvb3AgYWxsb3dzIGZvciBhbiB1bmxpbWl0ZWQgbnVtYmVyCityZW0gb2YgYXJndW1lbnRzICh1cCB0byB0aGUgY29tbWFuZCBsaW5lIGxpbWl0LCBhbnl3YXkpLgorc2V0IEFOVF9SVU5fQ01EPSUxCitpZiAiIiUxIiI9PSIiIiIgZ290byBydW5Db21tYW5kCitzaGlmdAorOmxvb3AKK2lmICIiJTEiIj09IiIiIiBnb3RvIHJ1bkNvbW1hbmQKK3NldCBBTlRfUlVOX0NNRD0lQU5UX1JVTl9DTUQlICUxCitzaGlmdAorZ290byBsb29wCisKKzpydW5Db21tYW5kCityZW0gZWNobyAlQU5UX1JVTl9DTUQlCislQU5UX1JVTl9DTUQlCisKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIEBlbmRsb2NhbAoraWYgIiVPUyUiPT0iV0lOTlQiIEBlbmRsb2NhbAorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvc2NyaXB0L2FudFJ1bi5wbCBiL3RydW5rL3NyYy9zY3JpcHQvYW50UnVuLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZWExMGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvc2NyaXB0L2FudFJ1bi5wbApAQCAtMCwwICsxLDY2IEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgYW50UnVuLnBsCisjCisjIHdyYXBwZXIgc2NyaXB0IGZvciBpbnZva2luZyBjb21tYW5kcyBvbiBhIHBsYXRmb3JtIHdpdGggUGVybCBpbnN0YWxsZWQKKyMgdGhpcyBpcyBha2luIHRvIGFudFJ1bi5iYXQsIGFuZCBhbnRSdW4gdGhlIFNIIHNjcmlwdCAKKyMKKyMgY3JlYXRlZDogICAgICAgICAyMDAxLTEwLTE4CisjIGF1dGhvcjogICAgICAgICAgSmVmZiBUdWxsZXkganR1bGxleUBub3ZlbGwuY29tIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNiZSBmdXNzeSBhYm91dCB2YXJpYWJsZXMKK3VzZSBzdHJpY3Q7CisKKyN0dXJuIHdhcm5pbmdzIG9uIGR1cmluZyBkZXY7IGdlbmVyYXRlcyBhIGZldyBzcHVyaW91cyB1bmluaXRpYWxpc2VkIHZhciBhY2Nlc3Mgd2FybmluZ3MKKyN1c2Ugd2FybmluZ3M7CisKKyNhbmQgc2V0ICRkZWJ1ZyB0byAxIHRvIHR1cm4gb24gdHJhY2UgaW5mbyAoY3VycmVudGx5IHVudXNlZCkKK215ICRkZWJ1Zz0xOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjaGFuZ2UgZHJpdmUgYW5kIGRpcmVjdG9yeSB0byAiJTEiCitteSAkQU5UX1JVTl9DTUQgPSBAQVJHVlswXTsKKworIyBhc3NpZ24gY3VycmVudCBydW4gY29tbWFuZCB0byAiJTIiCitjaGRpciAoQEFSR1ZbMF0pIHx8IGRpZSAiQ2FuJ3QgY2QgdG8gJEFSR1ZbMF06ICQhXG4iOworaWYgKCReTyBlcSAiTmV0V2FyZSIpIHsKKyAgICAjIFRoZXJlIGlzIGEgYnVnIGluIFBlcmwgNSBvbiBOZXRXYXJlLCB3aGVyZSBjaGRpciBkb2VzIG5vdAorICAgICMgZG8gYW55dGhpbmcuICBPbiBOZXRXYXJlLCB0aGUgZm9sbG93aW5nIHBhdGgtcHJlZml4ZWQgZm9ybSBzaG91bGQgCisgICAgIyBhbHdheXMgd29yay4gKGFmYWljdCkKKyAgICAkQU5UX1JVTl9DTUQgLj0gIi8iLkBBUkdWWzFdOworfQorZWxzZSB7CisgICAgJEFOVF9SVU5fQ01EID0gQEFSR1ZbMV07Cit9CisKKyMgZGlzcG9zZSBvZiB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cywgbGVhdmluZyBvbmx5IHRoZSBjb21tYW5kJ3MgYXJncy4KK3NoaWZ0Oworc2hpZnQ7CisKKyMgcnVuIHRoZSBjb21tYW5kCitteSAkcmV0dXJuVmFsdWUgPSBzeXN0ZW0gJEFOVF9SVU5fQ01ELCBAQVJHVjsKK2lmICgkcmV0dXJuVmFsdWUgZXEgMCkgeworICAgIGV4aXQgMDsKK30KK2Vsc2UgeworICAgICMgb25seSAwIGFuZCAxIGFyZSB3aWRlbHkgcmVjb2duaXplZCBhcyBleGl0IHZhbHVlcworICAgICMgc28gY2hhbmdlIHRoZSBleGl0IHZhbHVlIHRvIDEKKyAgICBleGl0IDE7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvc2NyaXB0L2FudGVudi5jbWQgYi90cnVuay9zcmMvc2NyaXB0L2FudGVudi5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwZDg5ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9zY3JpcHQvYW50ZW52LmNtZApAQCAtMCwwICsxLDk4IEBACisvKiAKKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisnQGVjaG8gb2ZmJworY2FsbCBSeEZ1bmNBZGQgIlN5c0xvYWRGdW5jcyIsICJSZXh4VXRpbCIsICJTeXNMb2FkRnVuY3MiCitjYWxsIFN5c0xvYWRGdW5jcworCisvKiBQcmVwYXJlIHRoZSBwYXJhbWV0ZXJzIGZvciBsYXRlciB1c2UgKi8KK3BhcnNlIGFyZyBhcmd2Cittb2RlID0gJycKK2FyZ3MgPSAnJworb3B0cyA9ICcnCitjcCA9ICcnCitsY3AgPSAnJworCitkbyBpID0gMSB0byB3b3Jkcyhhcmd2KQorICBwYXJhbSA9IHdvcmQoYXJndiwgaSkKKyAgc2VsZWN0CisgICAgd2hlbiBwYXJhbT0nLWxjcCcgdGhlbiBtb2RlID0gJ2wnCisgICAgd2hlbiBwYXJhbT0nLWNwJyB8IHBhcmFtPSctY2xhc3NwYXRoJyB0aGVuIG1vZGUgPSAnYycKKyAgICB3aGVuIGFiYnJldignLW9wdHMnLCBwYXJhbSwgNCkgdGhlbiBtb2RlID0gJ28nCisgICAgd2hlbiBhYmJyZXYoJy1hcmdzJywgcGFyYW0sIDQpIHRoZW4gbW9kZSA9ICdhJworICBvdGhlcndpc2UKKyAgICBzZWxlY3QKKyAgICAgIHdoZW4gbW9kZSA9ICdhJyB0aGVuIGFyZ3MgPSBzcGFjZShhcmdzIHBhcmFtLCAxKQorICAgICAgd2hlbiBtb2RlID0gJ2MnIHRoZW4gY3AgPSBzcGFjZShjcCBwYXJhbSwgMSkKKyAgICAgIHdoZW4gbW9kZSA9ICdsJyB0aGVuIGxjcCA9IHNwYWNlKGxjcCBwYXJhbSwgMSkKKyAgICAgIHdoZW4gbW9kZSA9ICdvJyB0aGVuIG9wdHMgPSBzcGFjZShvcHRzIHBhcmFtLCAxKQorICAgIG90aGVyd2lzZQorICAgICAgc2F5ICdPcHRpb24nIHBhcmFtICdpZ25vcmVkJworICAgIGVuZAorICBlbmQKK2VuZAorCitlbnY9Ik9TMkVOVklST05NRU5UIgorYW50Y29uZiA9IF9nZXRlbnZfKCdhbnRjb25mJyAnYW50Y29uZi5jbWQnKQorcnVucmMgPSBfZ2V0ZW52XygncnVucmMnKQoraW50ZXJwcmV0ICdjYWxsICInIHx8IHJ1bnJjIHx8ICciJyAnIicgfHwgYW50Y29uZiB8fCAnIicgJ0VUQycKK0FOVF9IT01FID0gdmFsdWUoJ0FOVF9IT01FJywsZW52KQorSkFWQV9IT01FID0gdmFsdWUoJ0pBVkFfSE9NRScsLGVudikKK2NsYXNzcGF0aCA9IHZhbHVlKCdDTEFTU1BBVEgnLCxlbnYpCitjbGFzc2VzID0gc3RyZWFtKEpBVkFfSE9NRSB8fCAiXGxpYlxjbGFzc2VzLnppcCIsICJDIiwgIlFVRVJZIEVYSVNUUyIpCitpZiBjbGFzc2VzIFw9ICcnIHRoZW4gY2xhc3NwYXRoID0gcHJlcGVuZChjbGFzc3BhdGggY2xhc3NlcykKK2NsYXNzZXMgPSBzdHJlYW0oSkFWQV9IT01FIHx8ICJcbGliXHRvb2xzLmphciIsICJDIiwgIlFVRVJZIEVYSVNUUyIpCitpZiBjbGFzc2VzIFw9ICcnIHRoZW4gY2xhc3NwYXRoID0gcHJlcGVuZChjbGFzc3BhdGggY2xhc3NlcykKKworY2xhc3NwYXRoID0gcHJlcGVuZChjbGFzc3BhdGggQU5UX0hPTUUgfHwgJ1xsaWJcYW50LWxhdW5jaGVyLmphcicpCisnU0VUIENMQVNTUEFUSD0nIHx8IGNsYXNzcGF0aAorCisvKiBTZXR0aW5nIGNsYXNzcGF0aGVzLCBvcHRpb25zIGFuZCBhcmd1bWVudHMgKi8KK2VudnNldCA9IF9nZXRlbnZfKCdlbnZzZXQnKQoraWYgY3BcPScnICAgdGhlbiBpbnRlcnByZXQgJ2NhbGwgIicgfHwgZW52c2V0IHx8ICciJyAnIjsgQ0xBU1NQQVRIIicgJyInIHx8IGNwIHx8ICciJworaWYgbGNwXD0nJyAgdGhlbiBpbnRlcnByZXQgJ2NhbGwgIicgfHwgZW52c2V0IHx8ICciJyAnIjsgTE9DQUxDTEFTU1BBVEgiJyAnIicgfHwgbGNwIHx8ICciJworaWYgb3B0c1w9JycgdGhlbiBpbnRlcnByZXQgJ2NhbGwgIicgfHwgZW52c2V0IHx8ICciJyAnIi1EIEFOVF9PUFRTIicgJyInIHx8IG9wdHMgfHwgJyInCitpZiBhcmdzXD0nJyB0aGVuIGludGVycHJldCAnY2FsbCAiJyB8fCBlbnZzZXQgfHwgJyInICciQU5UX0FSR1MiJyAnIicgfHwgYXJncyB8fCAnIicKKworZXhpdCAwCisKK2FkZHBhdGg6IHByb2NlZHVyZQorcGFyc2UgYXJnIHBhdGggZWxlbQoraWYgZWxlbSA9ICcnIHRoZW4gZG8KKyAgaWYgcGF0aFw9JycgJiByaWdodChwYXRoLCAxKVw9JzsnIHRoZW4gcGF0aCA9IHBhdGggfHwgJzsnCisgIHJldHVybiBwYXRoCitlbmQKK2lmIHN1YnN0cihwYXRoLCBsZW5ndGgocGF0aCkpID0gJzsnIHRoZW4gZ2x1ZSA9ICcnCitlbHNlIGdsdWUgPSAnOycKK2lmIHBvcyh0cmFuc2xhdGUoZWxlbSksIHRyYW5zbGF0ZShwYXRoKSkgPSAwIHRoZW4gcGF0aCA9IHBhdGggfHwgZ2x1ZSB8fCBlbGVtIHx8ICc7JworcmV0dXJuIHBhdGgKKworcHJlcGVuZDogcHJvY2VkdXJlCitwYXJzZSBhcmcgcGF0aCBlbGVtCitpZiBlbGVtID0gJycgdGhlbiBkbworICBpZiBwYXRoXD0nJyAmIHJpZ2h0KHBhdGgsIDEpXD0nOycgdGhlbiBwYXRoID0gcGF0aCB8fCAnOycKKyAgcmV0dXJuIHBhdGgKK2VuZAoraWYgcG9zKHRyYW5zbGF0ZShlbGVtKSwgdHJhbnNsYXRlKHBhdGgpKSA9IDAgdGhlbiBwYXRoID0gZWxlbSB8fCAnOycgfHwgcGF0aAorcmV0dXJuIHBhdGgKKworX2dldGVudl86IHByb2NlZHVyZSBleHBvc2UgZW52CitwYXJzZSBhcmcgZW52YXIgZGVmYXVsdAoraWYgZGVmYXVsdCA9ICcnIHRoZW4gZGVmYXVsdCA9IGVudmFyCit2YXIgPSB2YWx1ZSh0cmFuc2xhdGUoZW52YXIpLCxlbnYpCitpZiB2YXIgPSAnJyB0aGVuIHZhciA9IGRlZmF1bHQKK3JldHVybiB2YXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9zY3JpcHQvY29tcGxldGUtYW50LWNtZC5wbCBiL3RydW5rL3NyYy9zY3JpcHQvY29tcGxldGUtYW50LWNtZC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThjMjZlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3NjcmlwdC9jb21wbGV0ZS1hbnQtY21kLnBsCkBAIC0wLDAgKzEsMTE0IEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgQSBzY3JpcHQgdG8gYWxsb3cgQmFzaCBvciBaLVNoZWxsIHRvIGNvbXBsZXRlIGFuIEFudCBjb21tYW5kLWxpbmUuICAKKyMKKyMgVG8gaW5zdGFsbCBmb3IgQmFzaCAyLjAgb3IgYmV0dGVyLCBhZGQgdGhlIGZvbGxvd2luZyB0byB+Ly5iYXNocmM6CisjIAorIyAgICAgJCBjb21wbGV0ZSAtQyBjb21wbGV0ZS1hbnQtY21kIGFudCBidWlsZC5zaAorIworIyBUbyBpbnN0YWxsIGZvciBaLVNoZWxsIDIuNSBvciBiZXR0ZXIsIGFkZCB0aGUgZm9sbG93aW5nIHRvIH4vLnpzaHJjOgorIworIyAgICAgZnVuY3Rpb24gYW50X2NvbXBsZXRlICgpIHsKKyMgICAgICAgICBsb2NhbCBhcmdzX2xpbmUgYXJncworIyAgICAgICAgIHJlYWQgLWwgYXJnc19saW5lCisjICAgICAgICAgc2V0IC1BIGFyZ3MgJGFyZ3NfbGluZQorIyAgICAgICAgIHNldCAtQSByZXBseSAkKENPTVBfTElORT0kYXJnc19saW5lIGNvbXBsZXRlLWFudC1jbWQgJHthcmdzWzFdfSAkMSkKKyMgICAgIH0KKyMgICAgIGNvbXBjdGwgLUsgYW50X2NvbXBsZXRlIGFudCBidWlsZC5zaAorIyAgICAgCisjIEBhdXRob3IgTWlrZSBXaWxsaWFtcyA8bWlrZXdAY29ydGV4ZWJ1c2luZXNzLmNvbS5hdT4KKworbXkgJGNtZExpbmUgPSAkRU5WeydDT01QX0xJTkUnfTsKK215ICRhbnRDbWQgPSAkQVJHVlswXTsKK215ICR3b3JkID0gJEFSR1ZbMV07CisKK215IEBjb21wbGV0aW9uczsKK2lmICgkd29yZCA9fiAvXi0vKSB7CisgICAgbGlzdCggcmVzdHJpY3QoICR3b3JkLCBnZXRBcmd1bWVudHMoKSApKTsKK30gZWxzaWYgKCRjbWRMaW5lID1+IC8tKGZ8YnVpbGRmaWxlKVxzK1xTKiQvKSB7CisgICAgbGlzdCggZ2V0QnVpbGRGaWxlcygkd29yZCkgKTsKK30gZWxzZSB7CisgICAgbGlzdCggcmVzdHJpY3QoICR3b3JkLCBnZXRUYXJnZXRzKCkgKSk7Cit9CisKK2V4aXQoMCk7CisKK3N1YiBsaXN0IHsKKyAgICBmb3IgKEBfKSB7CisgICAgICAgIHByaW50ICIkX1xuIjsKKyAgICB9Cit9CisKK3N1YiByZXN0cmljdCB7CisgICAgbXkgKCR3b3JkLCBAY29tcGxldGlvbnMpID0gQF87CisgICAgZ3JlcCggL15cUSR3b3JkXEUvLCBAY29tcGxldGlvbnMgKTsKK30KKworc3ViIGdldEFyZ3VtZW50cyB7CisgICAgcXcoLWJ1aWxkZmlsZSAtZGVidWcgLWVtYWNzIC1mIC1maW5kIC1oZWxwIC1saXN0ZW5lciAtbG9nZmlsZSAKKyAgICAgICAtbG9nZ2VyIC1wcm9qZWN0aGVscCAtcXVpZXQgLXZlcmJvc2UgLXZlcnNpb24pOyAKK30KKworCitzdWIgZ2V0QnVpbGRGaWxlcyB7CisgICAgbXkgKCR3b3JkKSA9IEBfOworICAgIGdyZXAoIC9cLnhtbCQvLCBnbG9iKCAiJHdvcmQqIiApKTsKK30KKworc3ViIGdldFRhcmdldHMgeworCisgICAgIyBMb29rIGZvciBidWlsZC1maWxlCisgICAgbXkgJGJ1aWxkRmlsZSA9ICdidWlsZC54bWwnOworICAgIGlmICgkY21kTGluZSA9fiAvLShmfGJ1aWxkZmlsZSlccysoXFMrKS8pIHsKKyAgICAgICAgJGJ1aWxkRmlsZSA9ICQyOworICAgIH0KKyAgICByZXR1cm4gKCkgdW5sZXNzICgtZiAkYnVpbGRGaWxlKTsKKworICAgICMgUnVuICJhbnQgLXByb2plY3RoZWxwIiB0byBsaXN0IHRhcmdldHMuICBLZWVwIGEgY2FjaGUgb2YgcmVzdWx0cyBpbiBhCisgICAgIyBjYWNoZS1maWxlLgorICAgIG15ICRjYWNoZUZpbGUgPSAkYnVpbGRGaWxlOworICAgICRjYWNoZUZpbGUgPX4gc3woLiovKT8oLiopfCR7MX0uYW50LXRhcmdldHMtJHsyfXw7CisgICAgaWYgKCghLWUgJGNhY2hlRmlsZSkgfHwgKC1NICRidWlsZEZpbGUpIDwgKC1NICRjYWNoZUZpbGUpKSB7CisgICAgICAgIG9wZW4oIENBQ0hFLCAnPicuJGNhY2hlRmlsZSApIHx8IGRpZSAiY2FuXCd0IHdyaXRlICRjYWNoZUZpbGU6ICQhXG4iOworICAgICAgICBvcGVuKCBIRUxQLCAiJGFudENtZCAtcHJvamVjdGhlbHAgLWYgJyRidWlsZEZpbGUnfCIgKSB8fCByZXR1cm4oKTsgCisgICAgICAgIG15ICV0YXJnZXRzOworICAgICAgICB3aGlsZSggPEhFTFA+ICkgeworICAgICAgICAgICAgaWYgKC9eXHMrKFxTKykvKSB7CisgICAgICAgICAgICAgICAgJHRhcmdldHN7JDF9Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXkgQHRhcmdldHMgPSBzb3J0IGtleXMgJXRhcmdldHM7CisgICAgICAgIGZvciAoQHRhcmdldHMpIHsgcHJpbnQgQ0FDSEUgIiRfXG4iOyB9CisgICAgICAgIHJldHVybiBAdGFyZ2V0czsKKyAgICB9CisgICAgCisgICAgIyBSZWFkIHRoZSB0YXJnZXQtY2FjaGUKKyAgICBvcGVuKCBDQUNIRSwgJGNhY2hlRmlsZSApIHx8IGRpZSAiY2FuXCd0IHJlYWQgJGNhY2hlRmlsZTogJCFcbiI7CisgICAgbXkgQHRhcmdldHM7CisgICAgd2hpbGUgKDxDQUNIRT4pIHsKKyAgICAgICAgY2hvcDsKKyAgICAgICAgcy9cciQvLzsgICMgZm9yIEN5Z3dpbgorICAgICAgICBwdXNoKCBAdGFyZ2V0cywgJF8gKTsKKyAgICB9CisgICAgY2xvc2UoIENBQ0hFICk7CisgICAgQHRhcmdldHM7CisKK30KKworCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9zY3JpcHQvZW52c2V0LmNtZCBiL3RydW5rL3NyYy9zY3JpcHQvZW52c2V0LmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjA3NDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3NjcmlwdC9lbnZzZXQuY21kCkBAIC0wLDAgKzEsMTMxIEBACisvKgorCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitTRVQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitGaXJzdCBvcHRpb25hbCBwYXJhbWV0ZXI6CisgICA7ICAgICBwYXJhbWV0ZXJzIGFyZSBjb25zaWRlcmVkIHBhcnRzIG9mIGEgcGF0aCB2YXJpYWJsZSwgc2VtaWNvbG9ucyBhcmUKKyAgICAgICAgIGFwcGVuZGVkIHRvIGVhY2ggZWxlbWVudCBpZiBub3QgYWxyZWFkeSBwcmVzZW50CisgICAtRCAgICBwYXJhbWV0ZXJzIGFyZSBwcm9wZXJ0aWVzIGZvciBKYXZhIG9yIE1ha2VmaWxlIGV0Yy4sIC1EIHdpbGwgYmUKKyAgICAgICAgIHByZXBlbmRlZCBhbmQgdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBzZXBhcmF0ZWQgYnkgYSBzcGFjZQorICAgPUQgICAgdGhlIHNhbWUgYXMgYWJvdmUgYnV0IGVxdWFsIHNpZ24gaXMgbm90IHJlcXVpcmVkCisgICAsICAgICBwYXJhbWV0ZXJzIHNob3VsZCBiZSBjb21tYSBzZXBhcmF0ZWQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAtICAgICBwYXJhbWV0ZXJzIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgdGhlIG5leHQgcGFyYW1ldGVyCisgICBPdGhlciB2YWx1ZXMgbWVhbiB0aGF0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgbWlzc2luZyBhbmQgdGhlIGVudmlyb25tZW50CisgICB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byB0aGUgc3BhY2Ugc2VwYXJhdGVkIHBhcmFtZXRlcnMKKworU2Vjb25kIHBhcmFtZXRlcjogbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKworTmV4dCBwYXJhbWV0ZXJzOiB2YWx1ZXMKKzsgaW1wbGllcyB0aGF0IHRoZSBlcXVhbCBzaWduIGlzIGNvbnNpZGVyZWQgYSBwYXJ0IG9mIHRoZSBwYXJhbWV0ZXIgYW5kIGlzCitub3QgaW50ZXJwcmV0ZWQKKworLUQgcmVxdWlyZXMgcGFyYW1ldGVycyBpbiB0aGUgZm9ybSBuYW1lPXZhbHVlLiBJZiB0aGUgZXF1YWwgc2lnbiBpcyBub3QgZm91bmQsCit0aGUgcGFyYW1ldGVycyBhcmUgY2hhbmdlZCB0byBuYW1lPWV4cGFuZGVkX25hbWUKKworT3RoZXIgb3B0aW9ucyBoYXZlIG9wdGlvbmFsIGVxdWFsIHNpZ24uIElmIGl0IGlzIGZvdW5kLCBvbmx5IHRoZSBwYXJ0IGFmdGVyCit0aGUgZXF1YWwgc2lnbiB3aWxsIGJlIG9wcmlvbmFsbHkgZXhwYW5kZWQuCisKK0lmIHRoZSBwYXJhbWV0ZXIgaXMgdGhlIG1pbnVzIHNpZ24sIHRoZSBuZXh0IHBhcmFtZXRlciB3aWxsIG5vdCBiZSBleHBhbmRlZC4KK0lmIHRoZSBwYXJhbWV0ZXIgaXMgYSBzaW5nbGUgZG90LCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIG9mIHRoZQorZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgaXQgZXhpc3RlZCBiZWZvcmUgZW52c2V0IHdhcyBpbnZva2VkLgorCitGb3Igb3RoZXIgcGFyYW1ldGVycyB0aGUgYmF0Y2ggbG9va3MgZm9yIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIHRoZQorc2FtZSBuYW1lIChpbiB1cHBlcmNhc2UpLiBJZiBpdCBpcyBmb3VuZCwgaXQgZm9ybXMgdGhlIGV4cGFuZGVkX25hbWUuIElmCit0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCBzdWNoIGEgbmFtZSBkb2VzIG5vdCBleGlzdCwgdGhlIGV4cGFuZGVkX25hbWUKK3dpbGwgaG9sZCB0aGUgcGFyYW1ldGVyIG5hbWUgd2l0aG91dCBjYXNlIGNvbnZlcnNpb24uCisqLworCitwYXJzZSBhcmcgbW9kZSBlbnZhciBhcmdzCisKK2VxdWFsID0gMAorc2VwID0gJyAnCisKKy8qIFBhcnNlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzICovCitzZWxlY3QKKyAgd2hlbiBtb2RlPSctJyB0aGVuIGRvCisgICAgc2VwID0gZW52YXIKKyAgICBwYXJzZSB2YXIgYXJncyBlbnZhciBhcmdzCisgIGVuZAorICB3aGVuIG1vZGU9JzsnIHRoZW4gZG8KKyAgICBzZXAgPSAnJworICAgIGVxdWFsID0gLTEKKyAgZW5kCisgIHdoZW4gbW9kZT0nLUQnIHRoZW4gZXF1YWwgPSAxCisgIHdoZW4gbW9kZT0nPUQnIHRoZW4gbW9kZSA9ICctRCcKKyAgd2hlbiBtb2RlPScsJyB0aGVuIHNlcCA9ICcsJworb3RoZXJ3aXNlCisgIGFyZ3MgPSBlbnZhciBhcmdzCisgIGVudmFyID0gbW9kZQorICBtb2RlID0gJycKK2VuZAorCitlbnYgPSAnT1MyRU5WSVJPTk1FTlQnCitlbnZhciA9IHRyYW5zbGF0ZShlbnZhcikKK29yaWcgPSB2YWx1ZShlbnZhciwsZW52KQorbmV3dmFsID0gJycKK2V4cGFuZCA9IDEKKworLyogZm9yIGVhY2ggcGFyYW1ldGVyLi4uICovCitkbyBpID0gMSB0byB3b3JkcyhhcmdzKQorICBpZiBleHBhbmQgPiAwICYgd29yZChhcmdzLCBpKSA9ICctJyB0aGVuIGV4cGFuZCA9IDAKKyAgZWxzZSBjYWxsIGFkZHZhbCB3b3JkKGFyZ3MsIGkpCitlbmQKKworLyogT3B0aW9uYWxseSBlbmNsb3NlIHBhdGggdmFyaWFibGUgYnkgcXVvdGVzICovCitpZiBtb2RlID0gJzsnICYgcG9zKCcgJywgbmV3dmFsKSA+IDAgdGhlbiBuZXd2YWwgPSAnIicgfHwgbmV3dmFsIHx8ICciJworCisvKiBTZXQgdGhlIG5ldyB2YWx1ZSwgJ1NFVCcgY2Fubm90IGJlIHVzZWQgc2luY2UgaXQgZG9lcyBub3QgYWxsb3cgJz0nICovCit4ID0gdmFsdWUoZW52YXIsIG5ld3ZhbCwgZW52KQorZXhpdCAwCisKK2FkZHZhbDogcHJvY2VkdXJlIGV4cG9zZSBzZXAgZXF1YWwgb3JpZyBleHBhbmQgbmV3dmFsIG1vZGUgZW52CitwYXJzZSBhcmcgdmFyCisKK2lmIHZhciA9ICcuJyB0aGVuIGV4cHZhciA9IG9yaWcKK2Vsc2UgZG8KKyAgaWYgZXF1YWwgPj0gMCB0aGVuIGRvCisgICAgcGFyc2UgdmFyIHZhciBuYW1lICc9JyB2YWwKKyAgICBpZiB2YWwgPSAnJyB0aGVuIHZhciA9IG5hbWUKKyAgICBlbHNlIHZhciA9IHZhbAorICBlbmQKKyAgaWYgZXhwYW5kID0gMCB0aGVuIGV4cHZhciA9IHZhcgorICBlbHNlIGV4cHZhciA9IHZhbHVlKHRyYW5zbGF0ZSh2YXIpLCxlbnYpCisgIGlmIGV4cHZhciA9ICcnIHRoZW4gZXhwdmFyID0gdmFyCisgIGlmIGVxdWFsID49IDAgdGhlbiBkbworICAgIGlmIHZhbCA9ICcnIHRoZW4gZG8KKyAgICAgIHBhcnNlIHZhciBleHB2YXIga2V5ICc9JyB2YWwKKyAgICAgIGlmIHZhbCA8PiAnJyB0aGVuIG5hbWUgPSBrZXkKKyAgICAgIGVsc2UgZG8KKyAgICAgICAgaWYgZXF1YWwgPiAwIHRoZW4gdmFsID0ga2V5CisgICAgICAgIGVsc2UgbmFtZSA9IGtleQorICAgICAgZW5kCisgICAgZW5kCisgICAgZWxzZSB2YWwgPSBleHB2YXIKKyAgICBpZiBwb3MoJyAnLCB2YWwpID4gMCB8IHBvcygnPScsIHZhbCkgPiAwIHRoZW4gdmFsID0gJyInIHx8IHZhbCB8fCAnIicKKyAgICBpZiB2YWwgPSAnJyB0aGVuIGV4cHZhciA9IG5hbWUKKyAgICBlbHNlIGV4cHZhciA9IG5hbWUgfHwgJz0nIHx8IHZhbAorICBlbmQKKyAgaWYgbW9kZSA9ICctRCcgdGhlbiBleHB2YXIgPSAnLUQnIHx8IGV4cHZhcgorICBpZiBtb2RlID0gJzsnIHRoZW4gZG8KKyAgICBpZiByaWdodChleHB2YXIsIDEpIDw+ICc7JyB0aGVuIGV4cHZhciA9IGV4cHZhciB8fCAnOycKKyAgZW5kCitlbmQKKworaWYgbmV3dmFsID0gJycgdGhlbiBuZXd2YWwgPSBleHB2YXIKK2Vsc2UgbmV3dmFsID0gbmV3dmFsIHx8IHNlcCB8fCBleHB2YXIKK2V4cGFuZCA9IDEKK3JldHVybgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3NjcmlwdC9sY3AuYmF0IGIvdHJ1bmsvc3JjL3NjcmlwdC9sY3AuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiZjJlN2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvc2NyaXB0L2xjcC5iYXQKQEAgLTAsMCArMSwzMSBAQAorUkVNCitSRU0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorUkVNICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK1JFTSAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorUkVNICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorUkVNICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorUkVNICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorUkVNIAorUkVNICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitSRU0gCitSRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK1JFTSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1JFTSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitSRU0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK1JFTSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitSRU0KK1JFTQorCitzZXQgX0NMQVNTUEFUSENPTVBPTkVOVD0lMQoraWYgIiIlMSIiPT0iIiIiIGdvdG8gZ290QWxsQXJncworc2hpZnQKKworOmFyZ0NoZWNrCitpZiAiIiUxIiI9PSIiIiIgZ290byBnb3RBbGxBcmdzCitzZXQgX0NMQVNTUEFUSENPTVBPTkVOVD0lX0NMQVNTUEFUSENPTVBPTkVOVCUgJTEKK3NoaWZ0Citnb3RvIGFyZ0NoZWNrCisKKzpnb3RBbGxBcmdzCitzZXQgTE9DQUxDTEFTU1BBVEg9JUxPQ0FMQ0xBU1NQQVRIJTslX0NMQVNTUEFUSENPTVBPTkVOVCUKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3NjcmlwdC9ydW5hbnQucGwgYi90cnVuay9zcmMvc2NyaXB0L3J1bmFudC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjgzMDdhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3NjcmlwdC9ydW5hbnQucGwKQEAgLTAsMCArMSwxNTMgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBydW5hbnQucGwKKyMKKyMgd3JhcHBlciBzY3JpcHQgZm9yIGludm9raW5nIGFudCBpbiBhIHBsYXRmb3JtIHdpdGggUGVybCBpbnN0YWxsZWQKKyMgdGhpcyBtYXkgaW5jbHVkZSBjZ2ktYmluIGludm9jYXRpb24sIHdoaWNoIGlzIGNvbnNpZGVyZWQgc29tZXdoYXQgZGFmdC4KKyMgKHNsbzogdGhhdCBzaG91bGQgYmUgYSBzZXBhcmF0ZSBmaWxlIHdoaWNoIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhpcworIyBhbmQgcmV0dXJucyB0aGUgWE1MIGZvcm1hdHRlZCBvdXRwdXQpCisjCisjIHRoZSBjb2RlIGlzIG5vdCB0b3RhbGx5IHBvcnRhYmxlIGR1ZSB0byBjbGFzc3BhdGggYW5kIGRpcmVjdG9yeSBzcGxpdHRpbmcKKyMgaXNzdWVzLiBvb3BzLiAoTkIsIHVzZSBGaWxlOjpTcGVjOjpGdW5jdGlvbnMgIHdpbGwgaGVscCBhbmQgdGhlIGNvZGUgaXMKKyMgc3RydWN0dXJlZCBmb3IgdGhlIGNhdGZpbGUoKSBjYWxsLCBidXQgYmVjYXVzZSBvZiBwZXJsIHZlcnNpb24gZnVubmllcworIyB0aGUgY29kZSBpcyBub3QgaW5jbHVkZWQuIAorIworIyBjcmVhdGVkOiAgICAgICAgIDIwMDAtOC0yNAorIyBhdXRob3I6ICAgICAgICAgIFN0ZXZlIExvdWdocmFuIHN0ZXZlX2xAc291cmNlZm9yZ2UubmV0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBBc3N1bXB0aW9uczoKKyMKKyMgLSB0aGUgImphdmEiIGV4ZWN1dGFibGUvc2NyaXB0IGlzIG9uIHRoZSBjb21tYW5kIHBhdGgKKyMgLSBBTlRfSE9NRSBoYXMgYmVlbiBzZXQKKyMgLSB0YXJnZXQgcGxhdGZvcm0gdXNlcyAiOiIgYXMgY2xhc3NwYXRoIHNlcGFyYXRvciBvciBwZXJsIGluZGljYXRlcyBpdCBpcyBkb3Mvd2luMzIKKyMgLSB0YXJnZXQgcGxhdGZvcm0gdXNlcyAiLyIgYXMgZGlyZWN0b3J5IHNlcGFyYXRvci4KKworI2JlIGZ1c3N5IGFib3V0IHZhcmlhYmxlcwordXNlIHN0cmljdDsKKworI3BsYXRmb3JtIHNwZWNpZmljcyAoZGlzYWJsZWQpCisjdXNlIEZpbGU6OlNwZWM6OkZ1bmN0aW9uczsKKworI3R1cm4gd2FybmluZ3Mgb24gZHVyaW5nIGRldjsgZ2VuZXJhdGVzIGEgZmV3IHNwdXJpb3VzIHVuaW5pdGlhbGlzZWQgdmFyIGFjY2VzcyB3YXJuaW5ncworI3VzZSB3YXJuaW5nczsKKworI2FuZCBzZXQgJGRlYnVnIHRvIDEgdG8gdHVybiBvbiB0cmFjZSBpbmZvCitteSAkZGVidWc9MTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgY2hlY2sgdG8gbWFrZSBzdXJlIGVudmlyb25tZW50IGlzIHNldHVwCisjCisKK215ICRIT01FID0gJEVOVntBTlRfSE9NRX07CitpZiAoJEhPTUUgZXEgIiIpCisgICAgICAgIHsKKyAgICBkaWUgIlxuXG5BTlRfSE9NRSAqTVVTVCogYmUgc2V0IVxuXG4iOworICAgICAgICB9CisKK215ICRKQVZBQ01EID0gJEVOVntKQVZBQ01EfTsKKyRKQVZBQ01EID0gImphdmEiIGlmICRKQVZBQ01EIGVxICIiOworCitteSAkb25uZXR3YXJlID0gMDsKK2lmICgkXk8gZXEgIk5ldFdhcmUiKQoreworICAkb25uZXR3YXJlID0gMTsKK30KKworbXkgJG9uY3lnd2luID0gKCReTyBlcSAiY3lnd2luIik7CisKKyNJU1NVRTogd2hhdCBqYXZhIHdhbnRzIHRvIHNwbGl0IHVwIGNsYXNzcGF0aCB2YXJpZXMgZnJvbSBwbGF0Zm9ybSB0byBwbGF0Zm9ybSAKKyNhbmQgcGVybCBpcyBub3QgdG9vIGhvdCBhdCBoaW50aW5nIHdoaWNoIGJveCBpdCBpcyBvbi4KKyNoZXJlIEkgYXNzdW1lICI6IiAnY2VwdCBvbiB3aW4zMiwgZG9zLCBhbmQgbmV0d2FyZS4gQWRkIGV4dHJhIHRlc3RzIGhlcmUgYXMgbmVlZGVkLgorbXkgJHM9IjoiOworaWYoKCReTyBlcSAiTVNXaW4zMiIpIHx8ICgkXk8gZXEgImRvcyIpIHx8ICgkXk8gZXEgImN5Z3dpbiIpIHx8CisgICAoJG9ubmV0d2FyZSA9PSAxKSkKKyAgICAgICAgeworICAgICAgICAkcz0iOyI7CisgICAgICAgIH0KKworI2J1aWxkIHVwIHN0YW5kYXJkIGNsYXNzcGF0aAorbXkgJGxvY2FscGF0aCA9ICIkSE9NRS9saWIvYW50LWxhdW5jaGVyLmphciI7Cisjc2V0IEpWTSBvcHRpb25zIGFuZCBBbnQgYXJndW1lbnRzLCBpZiBhbnkKK215IEBBTlRfT1BUUz1zcGxpdCgiICIsICRFTlZ7QU5UX09QVFN9KTsKK215IEBBTlRfQVJHUz1zcGxpdCgiICIsICRFTlZ7QU5UX0FSR1N9KTsKKworI2ppa2VzCitpZigkRU5We0pJS0VTUEFUSH0gbmUgIiIpCisgICAgICAgIHsKKyAgICAgICAgcHVzaCBAQU5UX09QVFMsICItRGppa2VzLmNsYXNzLnBhdGg9JEVOVntKSUtFU1BBVEh9IjsKKyAgICAgICAgfQorCisjY29uc3RydWN0IGFyZ3VtZW50cyB0byBqYXZhCitteSBAQVJHUzsKK3B1c2ggQEFSR1MsIEBBTlRfT1BUUzsKKworbXkgJENZR0hPTUUgPSAiIjsKKworbXkgJGNsYXNzcGF0aD0kRU5We0NMQVNTUEFUSH07CitpZiAoJG9uY3lnd2luID09IDEpIHsKKyAgJGxvY2FscGF0aCA9IGBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgJGxvY2FscGF0aGA7CisgIGNob21wICgkbG9jYWxwYXRoKTsKKyAgaWYgKCEgJGNsYXNzcGF0aCBlcSAiIikKKyAgeworICAgICRjbGFzc3BhdGggPSBgY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkY2xhc3NwYXRoImA7CisgICAgY2hvbXAgKCRjbGFzc3BhdGgpOworICB9CisgICRIT01FID0gYGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAkSE9NRWA7CisgIGNob21wICgkSE9NRSk7CisgICRDWUdIT01FID0gYGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAkRU5We0hPTUV9YDsKKyAgY2hvbXAgKCRDWUdIT01FKTsKK30KK3B1c2ggQEFSR1MsICItY2xhc3NwYXRoIiwgIiRsb2NhbHBhdGgiOworcHVzaCBAQVJHUywgIi1EYW50LmhvbWU9JEhPTUUiOworaWYgKCAhICRDWUdIT01FIGVxICIiICkKK3sKKyAgcHVzaCBAQVJHUywgIi1EY3lnd2luLnVzZXIuaG9tZT1cIiRDWUdIT01FXCIiCit9CitwdXNoIEBBUkdTLCAib3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyIiwgQEFOVF9BUkdTOworcHVzaCBAQVJHUywgQEFSR1Y7CitpZiAoISAkY2xhc3NwYXRoIGVxICIiKQoreworICBpZiAoJG9ubmV0d2FyZSA9PSAxKQorICB7CisgICAgIyBtYWtlIGNsYXNzcGF0aCBsaXRlcmFsbHkgJENMQVNTUEFUSAorICAgICMgdGhpcyBpcyB0byBhdm9pZCBwdXNoaW5nIHVzIG92ZXIgdGhlIDUxMiBjaGFyYWN0ZXIgbGltaXQKKyAgICAjIGV2ZW4gc2tpcCB0aGUgOyAtIHRoYXQgaXMgYWxyZWFkeSBpbiAkbG9jYWxwYXRoCisgICAgcHVzaCBAQVJHUywgIi1saWIiLCAiXCRDTEFTU1BBVEgiOworICB9CisgIGVsc2UKKyAgeworICAgIHB1c2ggQEFSR1MsICItbGliIiwgIiRjbGFzc3BhdGgiOworICB9Cit9CitwcmludCAiXG4gJEpBVkFDTUQgQEFSR1NcblxuIiBpZiAoJGRlYnVnKTsKKworbXkgJHJldHVyblZhbHVlID0gc3lzdGVtICRKQVZBQ01ELCBAQVJHUzsKK2lmICgkcmV0dXJuVmFsdWUgZXEgMCkKKyAgICAgICAgeworICAgICAgICBleGl0IDA7CisgICAgICAgIH0KK2Vsc2UKKyAgICAgICAgeworICAgICAgICAjIG9ubHkgMCBhbmQgMSBhcmUgd2lkZWx5IHJlY29nbml6ZWQgYXMgZXhpdCB2YWx1ZXMKKyAgICAgICAgIyBzbyBjaGFuZ2UgdGhlIGV4aXQgdmFsdWUgdG8gMQorICAgICAgICBleGl0IDE7CisgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9zY3JpcHQvcnVuYW50LnB5IGIvdHJ1bmsvc3JjL3NjcmlwdC9ydW5hbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjNTQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy9zY3JpcHQvcnVuYW50LnB5CkBAIC0wLDAgKzEsMTAyIEBACisjIS91c3IvYmluL3B5dGhvbgorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyIiIgorCisgcnVuYW50LnB5CisKKyAgICBUaGlzIHNjcmlwdCBpcyBhIHRyYW5zbGF0aW9uIG9mIHRoZSBydW5hbnQucGwgd3JpdHRlbiBieSBTdGV2ZSBMb3VnaHJhbi4KKyAgICBJdCBydW5zIGFudCB3aXRoL291dCBhcmd1bWVudHMsIGl0IHNob3VsZCBiZSBxdWl0ZSBwb3J0YWJsZSAodGhhbmtzIHRvCisgICAgdGhlIHB5dGhvbiBvcyBsaWJyYXJ5KQorICAgIFRoaXMgc2NyaXB0IGhhcyBiZWVuIHRlc3RlZCB3aXRoIFB5dGhvbjIuMC9XaW4ySworCisgY3JlYXRlZDogICAgICAgICAyMDAxLTA0LTExCisgYXV0aG9yOiAgICAgICAgICBQaWVycmUgRGl0dGdlbiBwaWVycmUuZGl0dGdlbkBjcmlsdGVsZWNvbS5jb20KKworIEFzc3VtcHRpb25zOgorCisgLSB0aGUgImphdmEiIGV4ZWN1dGFibGUvc2NyaXB0IGlzIG9uIHRoZSBjb21tYW5kIHBhdGgKKyIiIgoraW1wb3J0IG9zLCBvcy5wYXRoLCBzdHJpbmcsIHN5cworCisjIENoYW5nZSBpdCB0byAxIHRvIGdldCBleHRyYSBkZWJ1ZyBpbmZvcm1hdGlvbgorZGVidWcgPSAwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSWYgQU5UX0hPTUUgaXMgbm90IHNldCBkZWZhdWx0IHRvIHNjcmlwdCdzIHBhcmVudCBkaXJlY3RvcnkKK2lmIG9zLmVudmlyb24uaGFzX2tleSgnQU5UX0hPTUUnKToKKyAgICBBTlRfSE9NRSA9IG9zLmVudmlyb25bJ0FOVF9IT01FJ10KK2Vsc2U6CisgICAgQU5UX0hPTUUgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChzeXMuYXJndlswXSkpKQorCisjIHNldCBBTlRfTElCIGxvY2F0aW9uCitBTlRfTElCID0gb3MucGF0aC5qb2luKEFOVF9IT01FLCAnbGliJykKKworIyBzZXQgSkFWQUNNRCAoY2hlY2sgdmFyaWFibGVzIEpBVkFDTUQgYW5kIEpBVkFfSE9NRSkKK0pBVkFDTUQgPSBOb25lCitpZiBub3Qgb3MuZW52aXJvbi5oYXNfa2V5KCdKQVZBQ01EJyk6CisgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdKQVZBX0hPTUUnKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLmVudmlyb25bJ0pBVkFfSE9NRSddKToKKyAgICAgICAgICAgIHByaW50ICJXYXJuaW5nOiBKQVZBX0hPTUUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEpBVkFDTUQgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsnSkFWQV9IT01FJ10sICdiaW4nLCAnamF2YScpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgIldhcm5pbmc6IEpBVkFfSE9NRSBub3Qgc2V0LiIKK2Vsc2U6CisgICAgSkFWQUNNRCA9IG9zLmVudmlyb25bJ0pBVkFDTUQnXQoraWYgbm90IEpBVkFDTUQ6CisgICAgSkFWQUNNRCA9ICdqYXZhJworCitsYXVuY2hlcl9qYXIgPSBvcy5wYXRoLmpvaW4oQU5UX0xJQiwgJ2FudC1sYXVuY2hlci5qYXInKQoraWYgbm90IG9zLnBhdGguZXhpc3RzKGxhdW5jaGVyX2phcik6CisgICAgcHJpbnQgJ1VuYWJsZSB0byBsb2NhdGUgYW50LWxhdW5jaGVyLmphci4gRXhwZWN0ZWQgdG8gZmluZCBpdCBpbiAlcycgJSBcCisgICAgICAgIEFOVF9MSUIKKworIyBCdWlsZCB1cCBzdGFuZGFyZCBjbGFzc3BhdGggKExPQ0FMQ0xBU1NQQVRIKQorTE9DQUxDTEFTU1BBVEggPSBsYXVuY2hlcl9qYXIKK2lmIG9zLmVudmlyb24uaGFzX2tleSgnTE9DQUxDTEFTU1BBVEgnKToKKyAgICBMT0NBTENMQVNTUEFUSCArPSBvcy5wYXRoc2VwICsgb3MuZW52aXJvblsnTE9DQUxDTEFTU1BBVEgnXQorCitBTlRfT1BUUyA9ICIiCitpZiBvcy5lbnZpcm9uLmhhc19rZXkoJ0FOVF9PUFRTJyk6CisgICAgQU5UX09QVFMgPSBvcy5lbnZpcm9uWydBTlRfT1BUUyddCisKK09QVFMgPSAiIgoraWYgb3MuZW52aXJvbi5oYXNfa2V5KCdKSUtFU1BBVEgnKToKKyAgICBPUFRTID0gJy1EamlrZXMuY2xhc3MucGF0aD1cIiVzXCInICUgb3MuZW52aXJvblsnSklLRVNQQVRIJ10KKworQU5UX0FSR1MgPSAiIgoraWYgb3MuZW52aXJvbi5oYXNfa2V5KCdBTlRfQVJHUycpOgorICAgIEFOVF9BUkdTID0gb3MuZW52aXJvblsnQU5UX0FSR1MnXQorCitDTEFTU1BBVEggPSAiIgoraWYgb3MuZW52aXJvbi5oYXNfa2V5KCdDTEFTU1BBVEgnKToKKyAgICBDTEFTU1BBVEggPSBvcy5lbnZpcm9uWydDTEFTU1BBVEgnXQorCisjIEJ1aWxkcyB0aGUgY29tbWFuZGxpbmUKK2NtZGxpbmUgPSAoJyVzICVzIC1jbGFzc3BhdGggJXMgLURhbnQuaG9tZT0lcyAlcyAnICsgXAorICAgICdvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIgJXMgLWxpYiAlcyAlcycpIFwKKyAgICAgJSAoSkFWQUNNRCwgQU5UX09QVFMsIExPQ0FMQ0xBU1NQQVRILCBBTlRfSE9NRSwgT1BUUywgQU5UX0FSR1MsIFwKKyAgICAgICAgQ0xBU1NQQVRILCBzdHJpbmcuam9pbihzeXMuYXJndlsxOl0sICcgJykpCisKK2lmIGRlYnVnOgorICAgIHByaW50ICdcbiVzXG5cbicgJSAoY21kbGluZSkKK3N5cy5zdGRvdXQuZmx1c2goKQorCisjIFJ1biB0aGUgYmluaW91IQorb3Muc3lzdGVtKGNtZGxpbmUpCmRpZmYgLS1naXQgYS90cnVuay9zcmMvc2NyaXB0L3J1bnJjLmNtZCBiL3RydW5rL3NyYy9zY3JpcHQvcnVucmMuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OGYwNGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvc2NyaXB0L3J1bnJjLmNtZApAQCAtMCwwICsxLDYwIEBACisvKiAKKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyAgIFJ1biBSQyBmaWxlLCBuYW1lIGlzIGluIHRoZSBmaXJzdCBhcmcsIHNlY29uZCBhcmcgaXMgZWl0aGVyIFBBVEgKKyAgIEVOViAgb3IgLXIgb3Igbm90aGluZyAKKyovCisKK3BhcnNlIGFyZyBuYW1lIHBhdGggcmVzdAorCitpZiBuYW1lID0gJycgdGhlbiBkbworICBzYXkgJ1JDIGZpbGUgbmFtZSBpcyBtaXNzaW5nJworICBleGl0IDEKK2VuZAorCitpZiByZXN0IFw9ICcnIHRoZW4gZG8KKyAgc2F5ICdUb28gbWFueSBwYXJhbWV0ZXJzJworICBleGl0IDEKK2VuZAorCitjYWxsIHJ1bml0IG5hbWUgcGF0aAorZXhpdCAwCisKK3J1bml0OiBwcm9jZWR1cmUKK3BhcnNlIGFyZyBuYW1lIHBhdGggZGlyCisKK2lmIHBhdGggXD0gJycgJiBwYXRoIFw9ICctcicgdGhlbiBkbworICBkaXIgPSB2YWx1ZSh0cmFuc2xhdGUocGF0aCksLCdPUzJFTlZJUk9OTUVOVCcpCisgIGlmIGRpciA9ICcnIHRoZW4gcmV0dXJuCisgIGRpciA9IHRyYW5zbGF0ZShkaXIsICdcJywgJy8nKSAvKiBjaGFuZ2UgVU5JWC1saWtlIHBhdGggdG8gT1MvMiAqLworZW5kCisKK2lmIGRpciA9ICcnIHRoZW4gZGlyID0gZGlyZWN0b3J5KCkKKworaWYgcGF0aCA9ICctcicgdGhlbiBkbyAvKiByZWN1cnNpdmUgY2FsbCAqLworICBzdWJkaXIgPSBmaWxlc3BlYygncGF0aCcsIGRpcikKKyAgaWYgc3ViZGlyIFw9ICdcJyB0aGVuIGRvCisgICAgc3ViZGlyID0gbGVmdChzdWJkaXIsIGxlbmd0aChzdWJkaXIpLTEpCisgICAgY2FsbCBydW5pdCBuYW1lIHBhdGggZmlsZXNwZWMoJ2RyaXZlJywgZGlyKSB8fCBzdWJkaXIKKyAgZW5kCitlbmQKKworLyogTG9vayBmb3IgdGhlIGZpbGUgYW5kIHJ1biBpdCAqLworaWYgcmlnaHQoZGlyLCAxKSBcPSAnXCcgdGhlbiBkaXIgPSBkaXIgfHwgJ1wnCityY2ZpbGUgPSBzdHJlYW0oZGlyIHx8IG5hbWUsICdjJywgJ3F1ZXJ5IGV4aXN0cycpCitpZiByY2ZpbGUgXD0gJycgdGhlbiBpbnRlcnByZXQgJ2NhbGwgIicgfHwgcmNmaWxlIHx8ICciJworCityZXR1cm4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2FudHVuaXQtYmFzZS54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC9hbnR1bml0LWJhc2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDA4OTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC9hbnR1bml0LWJhc2UueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iYW50dW5pdC1iYXNlIj4KKworICA8dGFyZ2V0IG5hbWU9ImFudHVuaXQiPgorICAgIDxhbnR1bml0IHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgICAgICA8cGxhaW5saXN0ZW5lciAvPgorICAgICAgPGZpbGUgZmlsZT0iJHthbnQuZmlsZX0iIHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQiIC8+CisgICAgPC9hbnR1bml0PgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvYnVnZml4ZXMvUkVBRE1FLnR4dCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2J1Z2ZpeGVzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiNWU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2J1Z2ZpeGVzL1JFQURNRS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0ZXN0cyBmb3IgdGhlIGJ1Z3MKK3RoYXQgaGF2ZSBiZWVuIGZpeGVkLgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvYnVnZml4ZXMvYnVnemlsbGEtNDMzMjQtc3RhY2tvdmVyZmxvdy10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2J1Z2ZpeGVzL2J1Z3ppbGxhLTQzMzI0LXN0YWNrb3ZlcmZsb3ctdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwNmI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2J1Z2ZpeGVzL2J1Z3ppbGxhLTQzMzI0LXN0YWNrb3ZlcmZsb3ctdGVzdC54bWwKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJsZW5ndGgtdGVzdCIgZGVmYXVsdD0iYW50dW5pdCIKKyAgICAgICAgIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisKKyAgPGltcG9ydCBmaWxlPSIuLi9hbnR1bml0LWJhc2UueG1sIiAvPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdG5lc3RlZCI+CisgICAgPG1hY3JvZGVmIG5hbWU9InJvb3QtbWFjcm8iPgorICAgICAgPGVsZW1lbnQgbmFtZT0ic3ViLXRhc2tzIiBvcHRpb25hbD0iZmFsc2UiIC8+CisKKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8IS0tIGRvIHN0dWZmIC0tPgorICAgICAgICA8c3ViLXRhc2tzIC8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJ1c2VkLW1hY3JvLWEiPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYS1zdWItdGFza3MiIG9wdGlvbmFsPSJmYWxzZSIgaW1wbGljaXQ9InRydWUiIC8+CisKKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8cm9vdC1tYWNybz4KKyAgICAgICAgICA8c3ViLXRhc2tzPgorICAgICAgICAgICAgPCEtLSBkbyBzdHVmZiAtLT4KKyAgICAgICAgICAgIDxhLXN1Yi10YXNrcyAvPgorICAgICAgICAgIDwvc3ViLXRhc2tzPgorICAgICAgICA8L3Jvb3QtbWFjcm8+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJ1c2VkLW1hY3JvLWIiPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYi1zdWItdGFza3MiIG9wdGlvbmFsPSJmYWxzZSIgaW1wbGljaXQ9InRydWUiIC8+CisKKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8dXNlZC1tYWNyby1hPgorICAgICAgICAgIDxyb290LW1hY3JvPgorICAgICAgICAgICAgPHN1Yi10YXNrcz4KKyAgICAgICAgICAgICAgPCEtLSBkbyBzdHVmZiAtLT4KKyAgICAgICAgICAgICAgPGItc3ViLXRhc2tzIC8+CisgICAgICAgICAgICA8L3N1Yi10YXNrcz4KKyAgICAgICAgICA8L3Jvb3QtbWFjcm8+CisgICAgICAgIDwvdXNlZC1tYWNyby1hPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8dXNlZC1tYWNyby1iPgorICAgICAgPGVjaG8gbWVzc2FnZT0iVGVzdCBCIiAvPgorICAgIDwvdXNlZC1tYWNyby1iPgorCisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IlRlc3QgQiIvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9sb2NhdGlvbi9sb2NhdGlvbi54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2xvY2F0aW9uL2xvY2F0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGM5ZmYwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9sb2NhdGlvbi9sb2NhdGlvbi54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+DQorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0ibG9jYXRpb24tdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iYWxsIg0KKyAgICAgICB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPg0KKyAgICAgICANCisgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuYnVpbGQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vLi4vYnVpbGQiLz4NCisgIDxwcm9wZXJ0eSBuYW1lPSJ3b3JraW5nLmRpciINCisgICAgICAgICAgICBsb2NhdGlvbj0iJHthbnQuYnVpbGQuZGlyfS9hbnQtdW5pdC9sb2NhdGlvbi1kaXIiLz4NCisgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzLmRpciIgbG9jYXRpb249IiR7d29ya2luZy5kaXJ9L2NsYXNzZXMiLz4NCisgIA0KKyAgPHRhcmdldCBuYW1lPSJhbGwiPg0KKyAgICA8YXU6YW50dW5pdD4NCisgICAgICA8ZmlsZXNldCBmaWxlPSIke2FudC5maWxlfSIvPg0KKyAgICAgIDxhdTpwbGFpbmxpc3RlbmVyLz4NCisgICAgPC9hdTphbnR1bml0Pg0KKyAgPC90YXJnZXQ+DQorICANCisgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPg0KKyAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIvPg0KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBkZWJ1Zz0ieWVzIi8+DQorICAgIDx0YXNrZGVmIG5hbWU9ImVjaG8tbG9jYXRpb24iIGNsYXNzbmFtZT0idGFzay5FY2hvTG9jYXRpb24iDQorICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtjbGFzc2VzLmRpcn0iLz4NCisgIDwvdGFyZ2V0Pg0KKyAgDQorICA8dGFyZ2V0IG5hbWU9ImRlZmluZSI+DQorICAgIDx0YXNrZGVmIG5hbWU9ImVjaG9sb2MiDQorICAgICAgY2xhc3NuYW1lPSJ0YXNrLkVjaG9Mb2NhdGlvbiI+DQorICAgICAgPGNsYXNzcGF0aD4NCisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjbGFzc2VzLmRpcn0iIC8+DQorICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+DQorICAgICAgPC9jbGFzc3BhdGg+DQorICAgIDwvdGFza2RlZj4NCisgIDwvdGFyZ2V0Pg0KKyAgDQorICA8dGFyZ2V0IG5hbWU9Im1hY3JvZGVmIiBkZXBlbmRzPSJkZWZpbmUiPg0KKyAgICA8bWFjcm9kZWYgbmFtZT0iZWNob2xvYzIiIGJhY2t0cmFjZT0iZmFsc2UiPg0KKyAgICAgIDxzZXF1ZW50aWFsPg0KKyAgICAgICAgPGVjaG9sb2MvPg0KKyAgICAgIDwvc2VxdWVudGlhbD4NCisgICAgPC9tYWNyb2RlZj4NCisgIDwvdGFyZ2V0Pg0KKyAgDQorICA8dGFyZ2V0IG5hbWU9InByZXNldGRlZiIgZGVwZW5kcz0iZGVmaW5lIj4NCisgICAgPHByZXNldGRlZiBuYW1lPSJlY2hvbG9jMyI+DQorICAgICAgPGVjaG9sb2MvPg0KKyAgICA8L3ByZXNldGRlZj4NCisgIDwvdGFyZ2V0Pg0KKyAgDQorICA8dGFyZ2V0IG5hbWU9InRlYXJEb3duIj4NCisgICAgPGRlbGV0ZSBkaXI9IiR7d29ya2luZy5kaXJ9Ii8+DQorICA8L3RhcmdldD4NCisgIA0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXBsYWluLXRhc2siPg0KKyAgICA8ZWNobyBpZD0iZWNobyI+SGVsbG88L2VjaG8+DQorICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSJIZWxsbyIvPg0KKyAgPC90YXJnZXQ+DQorICANCisgIDx0YXJnZXQgbmFtZT0idGVzdC1zdGFuZGFsb25lLXR5cGUiPg0KKyAgICA8IS0tIFRPRE8gLS0+DQorICA8L3RhcmdldD4NCisgIA0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNvbmRpdGlvbi10YXNrIj4NCisgICAgPCEtLSBUT0RPIC0tPg0KKyAgPC90YXJnZXQ+DQorICANCisgIDx0YXJnZXQgbmFtZT0idGVzdC1tYWNyb2RlZi13cmFwcGVkLXRhc2siIGRlcGVuZHM9Im1hY3JvZGVmIj4NCisgICAgPGVjaG8gaWQ9ImVjaG8zIj5IZWxsbzwvZWNobz4NCisgICAgPGVjaG9sb2MyLz4NCisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IkxpbmU6ICIvPg0KKyAgPC90YXJnZXQ+DQorICANCisgIDx0YXJnZXQgbmFtZT0idGVzdC1wcmVzZXRkZWYtd3JhcHBlZC10YXNrIiBkZXBlbmRzPSJwcmVzZXRkZWYiPg0KKyAgICA8ZWNobyBpZD0iZWNobzQiPkhlbGxvPC9lY2hvPg0KKyAgICA8ZWNob2xvYzMvPg0KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iTGluZTogIi8+DQorICA8L3RhcmdldD4NCisgIA0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2xvY2F0aW9uL3NyYy90YXNrL0VjaG9Mb2NhdGlvbi5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9sb2NhdGlvbi9zcmMvdGFzay9FY2hvTG9jYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQzYzUyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9sb2NhdGlvbi9zcmMvdGFzay9FY2hvTG9jYXRpb24uamF2YQpAQCAtMCwwICsxLDI2IEBACisvKg0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorDQorVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyovDQorcGFja2FnZSB0YXNrOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOw0KKw0KK3B1YmxpYyBjbGFzcyBFY2hvTG9jYXRpb24gZXh0ZW5kcyBUYXNrIHsNCisJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsNCisgICAgICAgIGxvZygiTGluZTogIiArIGdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpLCBQcm9qZWN0Lk1TR19JTkZPKTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL25lc3RlZC10ZXh0LXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9uZXN0ZWQtdGV4dC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTkzYjViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9uZXN0ZWQtdGV4dC10ZXN0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QWNjZXB0TmVzdGVkIj4KKyAgICA8ZWNobz5mb288L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlamVjdE5lc3RlZCI+CisgICAgPHR5cGVkZWYgbmFtZT0ib2JqZWN0IiBjbGFzc25hbWU9ImphdmEubGFuZy5PYmplY3QiIC8+CisgICAgPGF1OmV4cGVjdGZhaWx1cmUgZXhwZWN0ZWRNZXNzYWdlPSJUaGUgJmx0O29iamVjdCZndDsgdHlwZSBkb2Vzbid0IHN1cHBvcnQgbmVzdGVkIHRleHQgZGF0YSAoJnF1b3Q7Zm9vJnF1b3Q7KS4iPgorICAgICAgPG9iamVjdD5mb288L29iamVjdD4KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9yZWYtcHN5bnRheC1oaW50LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcmVmLXBzeW50YXgtaGludC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1MjE3YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcmVmLXBzeW50YXgtaGludC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorICA8dGFyZ2V0IG5hbWU9InRlc3RJdCI+CisgICAgPGF1OmV4cGVjdGZhaWx1cmU+CisgICAgICA8cGF0aGNvbnZlcnQgcmVmaWQ9IiR7Zm9vfSIgLz4KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIGxldmVsPSJ3YXJuaW5nIgorICAgICAgdGV4dD0iVW5yZXNvbHZhYmxlIHJlZmVyZW5jZSAkJHtmb299IG1pZ2h0IGJlIGEgbWlzdXNlIG9mIHByb3BlcnR5IGV4cGFuc2lvbiBzeW50YXguIiAvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvc3JjL3Rhc2svQmFzZVRhc2suamF2YSBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvc3JjL3Rhc2svQmFzZVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmZiNzBlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS9zcmMvdGFzay9CYXNlVGFzay5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2UgdGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgdGhlIHV1ZW5jb2RlL2RlY29kZSB0ZXN0IHRhc2tzLgorICovCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQmFzZVRhc2sgZXh0ZW5kcyBUYXNrIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKyAgICBwcml2YXRlIEZpbGUgaW5GaWxlOworICAgIHByaXZhdGUgRmlsZSBvdXRGaWxlOworCisgICAgcHVibGljIHZvaWQgc2V0SW5GaWxlKEZpbGUgaW5GaWxlKSB7CisgICAgICAgIHRoaXMuaW5GaWxlID0gaW5GaWxlOworICAgIH0KKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRJbkZpbGUoKSB7CisgICAgICAgIHJldHVybiBpbkZpbGU7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE91dEZpbGUoRmlsZSBvdXRGaWxlKSB7CisgICAgICAgIHRoaXMub3V0RmlsZSA9IG91dEZpbGU7CisgICAgfQorICAgIHByb3RlY3RlZCBGaWxlIGdldE91dEZpbGUoKSB7CisgICAgICAgIHJldHVybiBvdXRGaWxlOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBhc3NlcnRBdHRyaWJ1dGUoaW5GaWxlLCAiaW5GaWxlIik7CisgICAgICAgIGFzc2VydEF0dHJpYnV0ZShvdXRGaWxlLCAib3V0RmlsZSIpOworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKGdldEluRmlsZSgpKSk7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShnZXRPdXRGaWxlKCkpOworICAgICAgICAgICAgZG9pdChpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRklMRV9VVElMUy5jbG9zZShpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBGSUxFX1VUSUxTLmNsb3NlKG91dHB1dFN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZG9pdCgKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICAKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QXR0cmlidXRlKEZpbGUgZmlsZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXF1aXJlZCBhdHRyaWJ1dGUgIiArIGF0dHJpYnV0ZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IHNldCIpOworICAgICAgICB9CisgICAgfQorfQorCisgICAgCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3V1ZW5jb2RlL3NyYy90YXNrL1VVRGVjb2RlVGFzay5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS9zcmMvdGFzay9VVURlY29kZVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDIzZjhjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS9zcmMvdGFzay9VVURlY29kZVRhc2suamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIHRhc2s7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBzdW4ubWlzYy5VVURlY29kZXI7CisKKy8qKgorICogRGVjb2RlcyBhIHV1ZW5jb2RlZCBmaWxlIHVzaW5nIHN1bi5taXNjLlVVRGVjb2Rlci4KKyAqLworcHVibGljIGNsYXNzIFVVRGVjb2RlVGFzayBleHRlbmRzIEJhc2VUYXNrIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb2l0KElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgVVVEZWNvZGVyKCkuZGVjb2RlQnVmZmVyKGlzLCBvcyk7CisgICAgfQorfQorICAgIApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS9zcmMvdGFzay9VVUVuY29kZVRhc2suamF2YSBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvc3JjL3Rhc2svVVVFbmNvZGVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4NzhmOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvc3JjL3Rhc2svVVVFbmNvZGVUYXNrLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSB0YXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuVVVFbmNvZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogVVVFbmNvZGVzIGEgZmlsZSB1c2luZyBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlVVRW5jb2Rlci4KKyAqLworcHVibGljIGNsYXNzIFVVRW5jb2RlVGFzayBleHRlbmRzIEJhc2VUYXNrIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb2l0KElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgVVVFbmNvZGVyKGdldEluRmlsZSgpLmdldE5hbWUoKSkuZW5jb2RlKGlzLCBvcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS91dWVuY29kZS10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvdXVlbmNvZGUtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyZTIyNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvdXVlbmNvZGUtdGVzdC54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbGwiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuYnVpbGQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im15LmJ1aWxkLmRpciIKKyAgICAgICAgICAgIGxvY2F0aW9uPSIke2FudC5idWlsZC5kaXJ9L2FudC11bml0L3V1ZW5jb2RlLWRpciIvPgorICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIGxvY2F0aW9uPSIke215LmJ1aWxkLmRpcn0vY2xhc3NlcyIvPgorCisgIDxhdmFpbGFibGUgcHJvcGVydHk9InN1bi51dWRlY29kZS5hdmFpbCIgY2xhc3NuYW1lPSJzdW4ubWlzYy5VVURlY29kZXIiLz4KKworICA8dGFyZ2V0IG5hbWU9ImRlZmluZSIgaWY9InN1bi51dWRlY29kZS5hdmFpbCI+CisgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBkZWJ1Zz0ieWVzIi8+CisgICAgPHRhc2tkZWYgbmFtZT0idXVlbmNvZGUiIGNsYXNzbmFtZT0idGFzay5VVUVuY29kZVRhc2siCisgICAgICAgICAgICAgY2xhc3NwYXRoPSIke2NsYXNzZXMuZGlyfSIvPgorICAgIDx0YXNrZGVmIG5hbWU9InV1ZGVjb2RlIiBjbGFzc25hbWU9InRhc2suVVVEZWNvZGVUYXNrIgorICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXNpbXBsZSIgZGVwZW5kcz0iZGVmaW5lIiBpZj0ic3VuLnV1ZGVjb2RlLmF2YWlsIj4KKyAgICA8dXVlbmNvZGUgaW5maWxlPSIke2FudC5maWxlfSIKKyAgICAgICAgICAgICAgb3V0ZmlsZT0iJHtteS5idWlsZC5kaXJ9L3V1ZW5jb2RlZCIvPgorICAgIDx1dWRlY29kZSBpbmZpbGU9IiR7bXkuYnVpbGQuZGlyfS91dWVuY29kZWQiCisgICAgICAgICAgICAgIG91dGZpbGU9IiR7bXkuYnVpbGQuZGlyfS9kZWNvZGVkIi8+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8ZmlsZXNtYXRjaCBmaWxlMT0iJHthbnQuZmlsZX0iIGZpbGUyPSIke215LmJ1aWxkLmRpcn0vZGVjb2RlZCIvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbGwiPgorICAgIDxhdTphbnR1bml0PgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHthbnQuZmlsZX0iLz4KKyAgICAgIDxhdTpwbGFpbmxpc3RlbmVyLz4KKyAgICA8L2F1OmFudHVuaXQ+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvZmlsdGVycy9zdHJpcGxpbmVjb21tZW50cy10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvc3RyaXBsaW5lY29tbWVudHMtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmMGYwMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvc3RyaXBsaW5lY29tbWVudHMtdGVzdC54bWwKQEAgLTAsMCArMSw4NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbnR1bml0IiB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJyIiB2YWx1ZT0iJHtsaW5lLnNlcGFyYXRvcn0iIC8+CisKKyAgPHN0cmluZyBpZD0iaW5wdXQiPmZvbworI3BvdW5kCitiYXIKKy8vamF2YSBzbAorYmF6CitSRU1hcmsKKzwvc3RyaW5nPgorCisgIDxtYWNyb2RlZiBuYW1lPSJ0ZXN0Ij4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImxpbmVzIiAvPgorICAgIDxlbGVtZW50IG5hbWU9ImNvbW1lbnRzIiBpbXBsaWNpdD0idHJ1ZSIgLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iQHtsaW5lc30iPgorICAgICAgICAgIDx0b2tlbnM+CisgICAgICAgICAgICA8Y29uY2F0PgorICAgICAgICAgICAgICA8cmVzb3VyY2UgcmVmaWQ9ImlucHV0IiAvPgorICAgICAgICAgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgICAgICAgICAgPHN0cmlwbGluZWNvbW1lbnRzPgorICAgICAgICAgICAgICAgICAgPGNvbW1lbnRzIC8+CisgICAgICAgICAgICAgICAgPC9zdHJpcGxpbmVjb21tZW50cz4KKyAgICAgICAgICAgICAgICA8aWdub3JlYmxhbmsgLz4KKyAgICAgICAgICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICAgICAgICAgIDwvY29uY2F0PgorICAgICAgICAgIDwvdG9rZW5zPgorICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICA8L2F1OmFzc2VydFRydWU+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEJhc2ljIj4KKyAgICA8dGVzdCBsaW5lcz0iNSI+CisgICAgICA8Y29tbWVudCB2YWx1ZT0iIyIgLz4KKyAgICA8L3Rlc3Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE11bHRpcGxlIj4KKyAgICA8dGVzdCBsaW5lcz0iMyI+CisgICAgICA8Y29tbWVudCB2YWx1ZT0iIyIgLz4KKyAgICAgIDxjb21tZW50IHZhbHVlPSIvLyIgLz4KKyAgICAgIDxjb21tZW50IHZhbHVlPSJSRU0iIC8+CisgICAgPC90ZXN0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROZXN0ZWRUZXh0Ij4KKyAgICA8dGVzdCBsaW5lcz0iMyI+CisgICAgICA8Y29tbWVudD4jPC9jb21tZW50PgorICAgICAgPGNvbW1lbnQ+Ly88L2NvbW1lbnQ+CisgICAgICA8Y29tbWVudD5SRU08L2NvbW1lbnQ+CisgICAgPC90ZXN0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFeGNsdXNpdml0eSI+CisgICAgPGF1OmV4cGVjdGZhaWx1cmU+CisgICAgICA8ZmlsdGVyY2hhaW4+CisgICAgICAgIDxzdHJpcGxpbmVjb21tZW50cz4KKyAgICAgICAgICA8Y29tbWVudCB2YWx1ZT0iIyI+IyI8L2NvbW1lbnQ+CisgICAgICAgIDwvc3RyaXBsaW5lY29tbWVudHM+CisgICAgICA8L2ZpbHRlcmNoYWluPgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L2p1bml0LWZyYW1lcy54c2wgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC9qdW5pdC1mcmFtZXMueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYWIyODUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC9qdW5pdC1mcmFtZXMueHNsCkBAIC0wLDAgKzEsODg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKyAgICB4bWxuczpyZWRpcmVjdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL3JlZGlyZWN0IgorICAgIHhtbG5zOnN0cmluZ3V0aWxzPSJ4YWxhbjovL29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHMiCisgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KKzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPgorPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIi8+Cis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKworIFNhbXBsZSBzdHlsZXNoZWV0IHRvIGJlIHVzZWQgd2l0aCBBbnQgSlVuaXRSZXBvcnQgb3V0cHV0LgorCisgSXQgY3JlYXRlcyBhIHNldCBvZiBIVE1MIGZpbGVzIGEgbGEgamF2YWRvYyB3aGVyZSB5b3UgY2FuIGJyb3dzZSBlYXNpbHkKKyB0aHJvdWdoIGFsbCBkaXJlY3RvcmllcyBhbmQgcHJvamVjdHMuCisKKy0tPgorPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXQuZGlyIiBzZWxlY3Q9IicuJyIvPgorCisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiPgorICAgIDwhLS0gY3JlYXRlIHRoZSBpbmRleC5odG1sIC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2luZGV4Lmh0bWwiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgc3R5bGVzaGVldC5jc3MgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LWRpcmVjdG9yaWVzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctc3VtbWFyeS5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJvdmVydmlldy5kaXJlY3RvcmllcyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLWRpcmVjdG9yaWVzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctZnJhbWUuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLmRpcmVjdG9yaWVzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBhbGwtcHJvamVjdHMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGxwcm9qZWN0cy1mcmFtZS5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwucHJvamVjdHMiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIGFsbC10ZXN0cy5odG1sIGF0IHRoZSByb290IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbC10ZXN0cy5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwudGVzdHMiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIGFsbHRlc3RzLWZhaWxzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vYWxsdGVzdHMtZmFpbHMuaHRtbCI+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC50ZXN0cyI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidmYWlscyciLz4KKyAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgIDwhLS0gY3JlYXRlIHRoZSBhbGx0ZXN0cy1lcnJvcnMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGx0ZXN0cy1lcnJvcnMuaHRtbCI+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC50ZXN0cyI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidlcnJvcnMnIi8+CisgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICA8IS0tIHByb2Nlc3MgYWxsIGRpcmVjdG9yaWVzIC0tPgorICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuL3Rlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXJlY3RvcnkiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3hzbDpmb3ItZWFjaD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlyZWN0b3J5Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRpcmVjdG9yeS5kaXIiPgorICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkbmFtZSA9ICcnKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkbmFtZSwnLicsJy8nKSIvPjwveHNsOmlmPgorICAgICAgICA8eHNsOmlmIHRlc3Q9IiRuYW1lID0gJyciPi48L3hzbDppZj4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8IS0tUHJvY2Vzc2luZyBkaXJlY3RvcnkgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0LmRpciIvPiAtLT4KKyAgICA8IS0tIGNyZWF0ZSBhIHByb2plY3RzLWxpc3QuaHRtbCBpbiB0aGUgZGlyZWN0b3J5IGRpcmVjdG9yeSAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JGRpcmVjdG9yeS5kaXJ9L2RpcmVjdG9yeS1mcmFtZS5odG1sIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2plY3RzLmxpc3QiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgYSBkaXJlY3Rvcnktc3VtbWFyeS5odG1sIGluIHRoZSBkaXJlY3RvcnkgZGlyZWN0b3J5IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skZGlyZWN0b3J5LmRpcn0vZGlyZWN0b3J5LXN1bW1hcnkuaHRtbCI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXJlY3Rvcnkuc3VtbWFyeSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGZvciBlYWNoIHByb2plY3QsIGNyZWF0ZXMgYSBAbmFtZS5odG1sIC0tPgorICAgIDwhLS0gQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSB3aXRoIGlubmVyIHByb2plY3RzIGhhdmluZyB0aGUgc2FtZSBuYW1lLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIC0tPgorICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlW0BwYWNrYWdlID0gJG5hbWVdIj4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JGRpcmVjdG9yeS5kaXJ9L3tAaWR9X3tAbmFtZX0uaHRtbCI+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByb2plY3QuZGV0YWlscyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLW91dCkhPTAiPgorICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0veyRkaXJlY3RvcnkuZGlyfS97QGlkfV97QG5hbWV9LW91dC50eHQiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iLi9zeXN0ZW0tb3V0Ii8+CisgICAgICA8L3JlZGlyZWN0OndyaXRlPgorICAgIDwveHNsOmlmPgorICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1lcnIpIT0wIj4KKyAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skZGlyZWN0b3J5LmRpcn0ve0BpZH1fe0BuYW1lfS1lcnIudHh0Ij4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9Ii4vc3lzdGVtLWVyciIvPgorICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgICA8L3hzbDppZj4KKyAgICA8eHNsOmlmIHRlc3Q9ImZhaWx1cmVzL3RleHQoKSAhPSAwIj4KKyAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skZGlyZWN0b3J5LmRpcn0ve0BpZH1fe0BuYW1lfS1mYWlscy5odG1sIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcm9qZWN0LmRldGFpbHMiPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidmYWlscyciLz4KKyAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgICA8L3hzbDppZj4KKyAgICA8eHNsOmlmIHRlc3Q9ImVycm9ycy90ZXh0KCkgIT0gMCI+CisgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JGRpcmVjdG9yeS5kaXJ9L3tAaWR9X3tAbmFtZX0tZXJyb3JzLmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByb2plY3QuZGV0YWlscyI+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InR5cGUiIHNlbGVjdD0iJ2Vycm9ycyciLz4KKyAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgPC9yZWRpcmVjdDp3cml0ZT4KKyAgICA8L3hzbDppZj4KKyAgPC94c2w6Zm9yLWVhY2g+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIj4KKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+QW50VW5pdCBUZXN0IFJlc3VsdHMuPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgorICAgICAgICA8ZnJhbWVzZXQgcm93cz0iMzAlLDcwJSI+CisgICAgICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJkaXJlY3RvcnlMaXN0RnJhbWUiLz4KKyAgICAgICAgICAgIDxmcmFtZSBzcmM9ImFsbHByb2plY3RzLWZyYW1lLmh0bWwiIG5hbWU9InByb2plY3RMaXN0RnJhbWUiLz4KKyAgICAgICAgPC9mcmFtZXNldD4KKyAgICAgICAgPGZyYW1lIHNyYz0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiBuYW1lPSJwcm9qZWN0RnJhbWUiLz4KKyAgICAgICAgPG5vZnJhbWVzPgorICAgICAgICAgICAgPGgyPkZyYW1lIEFsZXJ0PC9oMj4KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgorICAgICAgICAgICAgPC9wPgorICAgICAgICA8L25vZnJhbWVzPgorICAgIDwvZnJhbWVzZXQ+Cis8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSB0aGlzIGlzIHRoZSBzdHlsZXNoZWV0IGNzcyB0byB1c2UgZm9yIG5lYXJseSBldmVyeXRoaW5nIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+Citib2R5IHsKKyAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7CisgICAgY29sb3I6IzAwMDAwMDsKK30KK3RhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7CisgICAgZm9udC1zaXplOiA2OCU7Cit9Cit0YWJsZS5kZXRhaWxzIHRyIHRoeworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICBiYWNrZ3JvdW5kOiNhNmNhZjA7Cit9Cit0YWJsZS5kZXRhaWxzIHRyIHRkeworICAgIGJhY2tncm91bmQ6I2VlZWVlMDsKK30KKworcCB7CisgICAgbGluZS1oZWlnaHQ6MS41ZW07CisgICAgbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKK30KK2gxIHsKKyAgICBtYXJnaW46IDBweCAwcHggNXB4OyBmb250OiAxNjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoMiB7CisgICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoMyB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorfQoraDQgeworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKK30KK2g1IHsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoNiB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorfQorLkVycm9yIHsKKyAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpyZWQ7Cit9CisuRmFpbHVyZSB7CisgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOworfQorLlByb3BlcnRpZXMgeworICB0ZXh0LWFsaWduOnJpZ2h0OworfQorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gQ3JlYXRlIGxpc3Qgb2YgYWxsL2ZhaWxlZC9lcnJvcmVkIHRlc3RzIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0iYWxsLnRlc3RzIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InR5cGUiIHNlbGVjdD0iJ2FsbCciLz4KKyAgICA8aHRtbD4KKwk8eHNsOnZhcmlhYmxlIG5hbWU9InRpdGxlIj4KKwkgICAgPHhzbDpjaG9vc2U+CisJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdmYWlscyciPgorCQkgICAgPHhzbDp0ZXh0PkFsbCBGYWlsdXJlczwveHNsOnRleHQ+CisJCTwveHNsOndoZW4+CisJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdlcnJvcnMnIj4KKwkJICAgIDx4c2w6dGV4dD5BbGwgRXJyb3JzPC94c2w6dGV4dD4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDpvdGhlcndpc2U+CisJCSAgICA8eHNsOnRleHQ+QWxsIFRlc3RzPC94c2w6dGV4dD4KKwkJPC94c2w6b3RoZXJ3aXNlPgorCSAgICA8L3hzbDpjaG9vc2U+CisJPC94c2w6dmFyaWFibGU+CisJPGhlYWQ+CisJICAgIDx0aXRsZT5BbnRVbml0IFRlc3QgUmVzdWx0czogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+CisJICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlyZWN0b3J5Lm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisJPC9oZWFkPgorCTxib2R5PgorCSAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ2FsbHByb2plY3RzLWZyYW1lLmh0bWwnLCdwcm9qZWN0TGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgPGgyPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L2gyPgorCisgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKwkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIj4KKwkJICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93LnByb2plY3QiIHNlbGVjdD0iJ3llcyciLz4KKwkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKwkJPCEtLQorICAgICAgICAgICAgICAgIHRlc3QgY2FuIGV2ZW4gbm90IGJlIHN0YXJ0ZWQgYXQgYWxsIChmYWlsdXJlIHRvIGxvYWQgdGhlIHByb2plY3QpCisJCXNvIHJlcG9ydCB0aGUgZXJyb3IgZGlyZWN0bHkKKwkJLS0+CisgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iLi9lcnJvciI+CisgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJFcnJvciI+CisgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPgorICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2ZhaWxzJyI+CisgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL3Rlc3RjYXNlW2ZhaWx1cmVdIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cucHJvamVjdCIgc2VsZWN0PSIneWVzJyIvPgorICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2Vycm9ycyciPgorICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLy90ZXN0Y2FzZVtlcnJvcl0iIG1vZGU9InByaW50LnRlc3QiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvdy5wcm9qZWN0IiBzZWxlY3Q9Iid5ZXMnIi8+CisgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vdGVzdGNhc2UiIG1vZGU9InByaW50LnRlc3QiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvdy5wcm9qZWN0IiBzZWxlY3Q9Iid5ZXMnIi8+CisgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgVGhpcyBwYWdlIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IHRlc3RzdWl0ZSBwcm9qZWN0LgorICAgIEl0IHByaW50cyBhIHN1bW1hcnkgb2YgdGhlIHRlc3RzdWl0ZSBhbmQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQKKyAgICB0ZXN0Y2FzZSBtZXRob2RzLgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJwcm9qZWN0LmRldGFpbHMiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInYWxsJyIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZGlyZWN0b3J5Lm5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb2plY3QubmFtZSI+PHhzbDppZiB0ZXN0PSJub3QoJGRpcmVjdG9yeS5uYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpcmVjdG9yeS5uYW1lIi8+LjwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICA8dGl0bGU+QW50VW5pdCBUZXN0IFJlc3VsdHM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvamVjdC5uYW1lIi8+PC90aXRsZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlyZWN0b3J5Lm5hbWUiIHNlbGVjdD0iJGRpcmVjdG9yeS5uYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisgICAgICAgIHZhciBUZXN0Q2FzZXMgPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgdmFyIGN1cjsKKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9wZXJ0aWVzIi8+CisgICAgICAgPC9zY3JpcHQ+CisgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IVtDREFUQVsKKyAgICAgICAgZnVuY3Rpb24gZGlzcGxheVByb3BlcnRpZXMgKG5hbWUpIHsKKyAgICAgICAgICB2YXIgd2luID0gd2luZG93Lm9wZW4oJycsJ0pVbml0U3lzdGVtUHJvcGVydGllcycsJ3Njcm9sbGJhcnM9MSxyZXNpemFibGU9MScpOworICAgICAgICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7CisgICAgICAgICAgZG9jLm9wZW4oKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxodG1sPjxoZWFkPjx0aXRsZT5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvdGl0bGU+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7IGNvbG9yOiMwMDAwMDA7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7IGZvbnQtc2l6ZTogNjglOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyBib3JkZXItbGVmdDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci10b3A6c29saWQgMSAjY2NjY2NjOyBwYWRkaW5nOjVweDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0ZCB7IGZvbnQ6bm9ybWFsOyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmZmOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJoMyB7IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvaGVhZD48Ym9keT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxoMz5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvaDM+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0YWJsZSBjbGFzcz0ncHJvcGVydGllcyc+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iKTsKKyAgICAgICAgICBmb3IgKHByb3AgaW4gVGVzdENhc2VzW25hbWVdKSB7CisgICAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+IiArIHByb3AgKyAiPC90aD48dGQ+IiArIFRlc3RDYXNlc1tuYW1lXVtwcm9wXSArICI8L3RkPjwvdHI+Iik7CisgICAgICAgICAgfQorICAgICAgICAgIGRvYy53cml0ZSgiPC90YWJsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7CisgICAgICAgICAgZG9jLmNsb3NlKCk7CisgICAgICAgICAgd2luLmZvY3VzKCk7CisgICAgICAgIH0KKyAgICAgIF1dPgorICAgICAgPC9zY3JpcHQ+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgPGgzPlByb2plY3QgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9qZWN0Lm5hbWUiLz48L2gzPgorCisKKyAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50LnRlc3QiLz4KKyAgICAgICAgICAgIDwvdGFibGU+CisKKwkgICAgPHhzbDpjaG9vc2U+CisJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdmYWlscyciPgorCQkgICAgPGgyPkZhaWx1cmVzPC9oMj4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2Vycm9ycyciPgorCQkgICAgPGgyPkVycm9yczwvaDI+CisJCTwveHNsOndoZW4+CisJCTx4c2w6b3RoZXJ3aXNlPgorCQkgICAgPGgyPlRlc3RzPC9oMj4KKwkJPC94c2w6b3RoZXJ3aXNlPgorCSAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKwkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIi8+CisJCTwhLS0KKyAgICAgICAgICAgICAgICB0ZXN0IGNhbiBldmVuIG5vdCBiZSBzdGFydGVkIGF0IGFsbCAoZmFpbHVyZSB0byBsb2FkIHRoZSBwcm9qZWN0KQorCQlzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5CisJCS0tPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iLi9lcnJvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRXJyb3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisJCTx4c2w6Y2hvb3NlPgorCQkgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2ZhaWxzJyI+CisJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2VbZmFpbHVyZV0iIG1vZGU9InByaW50LnRlc3QiLz4KKwkJICAgIDwveHNsOndoZW4+CisJCSAgICA8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnZXJyb3JzJyI+CisJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2VbZXJyb3JdIiBtb2RlPSJwcmludC50ZXN0Ii8+CisJCSAgICA8L3hzbDp3aGVuPgorCQkgICAgPHhzbDpvdGhlcndpc2U+CisJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2UiIG1vZGU9InByaW50LnRlc3QiLz4KKwkJICAgIDwveHNsOm90aGVyd2lzZT4KKwkJPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwhLS1kaXYgY2xhc3M9IlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5qYXZhc2NyaXB0OmRpc3BsYXlQcm9wZXJ0aWVzKCc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Jyk7PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzICYjMTg3OworICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLW91dCkhPTAiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4tb3V0LnR4dDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQgJiMxODc7CisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKC4vc3lzdGVtLWVycikhPTAiPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPi4vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4tZXJyLnR4dDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIgJiMxODc7CisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwveHNsOmlmLS0+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tCisgICBXcml0ZSBwcm9wZXJ0aWVzIGludG8gYSBKYXZhU2NyaXB0IGRhdGEgc3RydWN0dXJlLgorICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaWRlYSBieSBFcmlrIEhhdGNoZXIgKGVoYXRjaGVyQGFwYWNoZS5vcmcpCisgICAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvcGVydGllcyI+CisgICAgY3VyID0gVGVzdENhc2VzWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+J10gPSBuZXcgQXJyYXkoKTsKKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgorICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgIGN1clsnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+J10gPSAnPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJAdmFsdWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPic7CisgICAgPC94c2w6Zm9yLWVhY2g+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGZvciBldmVyeSBkaXJlY3RvcnkuCisgICAgSXQgcHJpbnRzIHRoZSBuYW1lIG9mIGFsbCBwcm9qZWN0cyB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBkaXJlY3RvcnkuCisgICAgQHBhcmFtIG5hbWUgdGhlIGRpcmVjdG9yeSBuYW1lIHRvIHByaW50IHByb2plY3RzLgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSBsaXN0IG9mIHByb2plY3RzIGluIGEgZGlyZWN0b3J5IC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9qZWN0cy5saXN0Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+QW50VW5pdCBUZXN0IFByb2plY3RzOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L3RpdGxlPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkaXJlY3RvcnkubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjxhIGhyZWY9ImRpcmVjdG9yeS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0icHJvamVjdEZyYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRuYW1lID0gJyciPiZsdDtub25lJmd0OzwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9hPjwvaDI+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGFibGU+CisKKyAgICAgICAgICAgIDxoMj5Qcm9qZWN0czwvaDI+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbLi9AcGFja2FnZSA9ICRuYW1lXSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0BpZH1fe0BuYW1lfS5odG1sIiB0YXJnZXQ9InByb2plY3RGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgQ3JlYXRlcyBhbiBhbGwtcHJvamVjdHMuaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBkaXJlY3Rvcnktc3VtbWFyeS5odG1sCisgICAgb24gZWFjaCBwcm9qZWN0LgorLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwucHJvamVjdHMiPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgIDx0aXRsZT5BbGwgQW50VW5pdCBUZXN0IFByb2plY3RzPC90aXRsZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlyZWN0b3J5Lm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8aDI+UHJvamVjdHM8L2gyPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLnByb2plY3RzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLnByb2plY3RzIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRpcmVjdG9yeS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+CisgICAgPHRyPgorICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgPGEgdGFyZ2V0PSJwcm9qZWN0RnJhbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkZGlyZWN0b3J5Lm5hbWU9JycpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJGRpcmVjdG9yeS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgQ3JlYXRlcyBhbiBodG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIGRpcmVjdG9yeS1zdW1tYXJ5Lmh0bWwgZmlsZXMgb24KKyAgICBlYWNoIGRpcmVjdG9yeSBleGlzdGluZyBvbiB0ZXN0c3VpdGVzLgorICAgIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgZGlyZWN0b3J5IDooCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9ImFsbC5kaXJlY3RvcmllcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPkFsbCBBbnRVbml0IFRlc3QgRGlyZWN0b3JpZXM8L3RpdGxlPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkaXJlY3RvcnkubmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxoMj48YSBocmVmPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0icHJvamVjdEZyYW1lIj5Ib21lPC9hPjwvaDI+CisgICAgICAgICAgICA8aDI+RGlyZWN0b3JpZXM8L2gyPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSIgbW9kZT0iYWxsLmRpcmVjdG9yaWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLmRpcmVjdG9yaWVzIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICA8YSBocmVmPSIuL3t0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L2RpcmVjdG9yeS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0icHJvamVjdEZyYW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwYWNrYWdlID0gJyciPiZsdDtub25lJmd0OzwveHNsOmlmPgorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJvdmVydmlldy5kaXJlY3RvcmllcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPkFudFVuaXQgVGVzdCBSZXN1bHRzOiBTdW1tYXJ5PC90aXRsZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlyZWN0b3J5Lm5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbignYWxscHJvamVjdHMtZnJhbWUuaHRtbCcsJ3Byb2plY3RMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKyAgICAgICAgPGgyPlN1bW1hcnk8L2gyPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL3Rlc3RzL3RleHQoKSkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvZXJyb3JzL3RleHQoKSkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9mYWlsdXJlcy90ZXh0KCkpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvdGltZS90ZXh0KCkpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2Vzc1JhdGUiIHNlbGVjdD0iKCR0ZXN0Q291bnQgLSAkZmFpbHVyZUNvdW50IC0gJGVycm9yQ291bnQpIGRpdiAkdGVzdENvdW50Ii8+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHRoPlRlc3RzPC90aD4KKyAgICAgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+CisgICAgICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgICAgIDx0aD5TdWNjZXNzIHJhdGU8L3RoPgorICAgICAgICAgICAgPHRoPlRpbWU8L3RoPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJEaXNwbGF5IGFsbCB0ZXN0cyIgaHJlZj0iYWxsLXRlc3RzLmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC9hPjwvdGQ+CisgICAgICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIGZhaWx1cmVzIiBocmVmPSJhbGx0ZXN0cy1mYWlscy5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvYT48L3RkPgorICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJEaXNwbGF5IGFsbCBlcnJvcnMiIGhyZWY9ImFsbHRlc3RzLWVycm9ycy5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L2E+PC90ZD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRpbWVDb3VudCIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgPHRyPgorICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KKyAgICAgICAgTm90ZTogPGVtPmZhaWx1cmVzPC9lbT4gYXJlIGFudGljaXBhdGVkIGFuZCBjaGVja2VkIGZvciB3aXRoIGFzc2VydGlvbnMgd2hpbGUgPGVtPmVycm9yczwvZW0+IGFyZSB1bmFudGljaXBhdGVkLgorICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorCisgICAgICAgIDxoMj5EaXJlY3RvcmllczwvaDI+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InRlc3RzdWl0ZVtub3QoLi9AcGFja2FnZSA9IHByZWNlZGluZy1zaWJsaW5nOjp0ZXN0c3VpdGUvQHBhY2thZ2UpXSI+CisgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiIG9yZGVyPSJhc2NlbmRpbmciLz4KKyAgICAgICAgICAgICAgICA8IS0tIGdldCB0aGUgbm9kZSBzZXQgY29udGFpbmluZyBhbGwgdGVzdHN1aXRlcyB0aGF0IGhhdmUgdGhlIHNhbWUgZGlyZWN0b3J5IC0tPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5zYW1lZGlyZWN0b3J5IiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gY3VycmVudCgpL0BwYWNrYWdlXSIvPgorICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheSBhIGZhaWx1cmUgaWYgdGhlcmUgaXMgYW55IGZhaWx1cmUvZXJyb3IgaW4gdGhlIGRpcmVjdG9yeSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN1bSgkaW5zYW1lZGlyZWN0b3J5L2Vycm9ycy90ZXh0KCkpICZndDsgMCI+RXJyb3I8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdW0oJGluc2FtZWRpcmVjdG9yeS9mYWlsdXJlcy90ZXh0KCkpICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iLi97dHJhbnNsYXRlKEBwYWNrYWdlLCcuJywnLycpfS9kaXJlY3Rvcnktc3VtbWFyeS5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcGFja2FnZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVkaXJlY3RvcnkvdGVzdHMvdGV4dCgpKSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVkaXJlY3RvcnkvZXJyb3JzL3RleHQoKSkiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lZGlyZWN0b3J5L2ZhaWx1cmVzL3RleHQoKSkiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9InN1bSgkaW5zYW1lZGlyZWN0b3J5L3RpbWUvdGV4dCgpKSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnNhbWVkaXJlY3RvcnkvQHRpbWVzdGFtcCIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluc2FtZWRpcmVjdG9yeS9AaG9zdG5hbWUiLz48L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8eHNsOnRlbXBsYXRlIG5hbWU9ImRpcmVjdG9yeS5zdW1tYXJ5Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRpcmVjdG9yeS5uYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L2hlYWQ+CisgICAgICAgIDxib2R5PgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ib25sb2FkIj5vcGVuKCdkaXJlY3RvcnktZnJhbWUuaHRtbCcsJ3Byb2plY3RMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisgICAgICAgICAgICA8aDM+RGlyZWN0b3J5IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvaDM+CisKKyAgICAgICAgICAgIDwhLS10YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb2plY3QubWV0cmljcy5oZWFkZXIiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50Lm1ldHJpY3MiLz4KKyAgICAgICAgICAgIDwvdGFibGUtLT4KKworICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnNhbWVkaXJlY3RvcnkiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iLz4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoJGluc2FtZWRpcmVjdG9yeSkgJmd0OyAwIj4KKyAgICAgICAgICAgICAgICA8aDI+UHJvamVjdHM8L2gyPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGluc2FtZWRpcmVjdG9yeSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0KKyAgICB0cmFuc2Zvcm0gc3RyaW5nIGxpa2UgYS5iLmMgdG8gLi4vLi4vLi4vCisgICAgQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdHJhbnNmb3JtIGludG8gYSBkZXNjZW5kaW5nIGRpcmVjdG9yeSBwYXRoCistLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0icGF0aCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJwYXRoIi8+CisgICAgPHhzbDppZiB0ZXN0PSJjb250YWlucygkcGF0aCwnLicpIj4KKyAgICAgICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRwYXRoLCcuJykiLz48L3hzbDp3aXRoLXBhcmFtPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwveHNsOmlmPgorICAgIDx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKCRwYXRoLCcuJykpIGFuZCBub3QoJHBhdGggPSAnJykiPgorICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KKyAgICA8L3hzbDppZj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gY3JlYXRlIHRoZSBsaW5rIHRvIHRoZSBzdHlsZXNoZWV0IGJhc2VkIG9uIHRoZSBkaXJlY3RvcnkgbmFtZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJkaXJlY3RvcnkubmFtZSIvPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJGRpcmVjdG9yeS5uYW1lID0gJ3VubmFtZWQgZGlyZWN0b3J5JykiPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj48eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSIkZGlyZWN0b3J5Lm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvbGluaz4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gUGFnZSBIRUFERVIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgorICAgIDxoMT5BbnRVbml0IFRlc3QgUmVzdWx0czwvaDE+CisgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2FudHVuaXQvIj5BbnRVbml0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3RkPgorICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8aHIgc2l6ZT0iMSIvPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gcHJvamVjdCBoZWFkZXIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgorICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lIFN0YW1wPC90aD4KKyAgICAgICAgPHRoPkhvc3Q8L3RoPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBtZXRob2QgaGVhZGVyIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJzaG93LnByb2plY3QiIHNlbGVjdD0iJyciLz4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorCTx4c2w6aWYgdGVzdD0iYm9vbGVhbigkc2hvdy5wcm9qZWN0KSI+CisJICAgIDx0aD5Qcm9qZWN0PC90aD4KKwk8L3hzbDppZj4KKyAgICAgICAgPHRoPk5hbWU8L3RoPgorICAgICAgICA8dGg+U3RhdHVzPC90aD4KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPlR5cGU8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tIHByb2plY3QgaW5mb3JtYXRpb24gLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9InByaW50LnRlc3QiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJlcnJvcnMvdGV4dCgpWy4mZ3Q7IDBdIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmVzL3RleHQoKVsuJmd0OyAwXSI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIHRlc3RzIiBocmVmPSJ7QGlkfV97QG5hbWV9Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgorICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIHRlc3RzIiBocmVmPSJ7QGlkfV97QG5hbWV9Lmh0bWwiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGVzdHMvdGV4dCgpIi8+PC9hPjwvdGQ+CisgICAgICAgIDx0ZD4KKwkgICAgPHhzbDpjaG9vc2U+CisJCTx4c2w6d2hlbiB0ZXN0PSJlcnJvcnMvdGV4dCgpICE9IDAiPgorCQkgICAgPGEgdGl0bGU9IkRpc3BsYXkgb25seSBlcnJvcnMiIGhyZWY9IntAaWR9X3tAbmFtZX0tZXJyb3JzLmh0bWwiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZXJyb3JzL3RleHQoKSIvPjwvYT4KKwkJPC94c2w6d2hlbj4KKwkJPHhzbDpvdGhlcndpc2U+CisJCSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImVycm9ycy90ZXh0KCkiLz4KKwkJPC94c2w6b3RoZXJ3aXNlPgorCSAgICA8L3hzbDpjaG9vc2U+CisJPC90ZD4KKyAgICAgICAgPHRkPgorCSAgICA8eHNsOmNob29zZT4KKwkJPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmVzL3RleHQoKSAhPSAwIj4KKwkJICAgIDxhIHRpdGxlPSJEaXNwbGF5IG9ubHkgZmFpbHVyZXMiIGhyZWY9IntAaWR9X3tAbmFtZX0tZmFpbHMuaHRtbCI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlcy90ZXh0KCkiLz48L2E+CisJCTwveHNsOndoZW4+CisJCTx4c2w6b3RoZXJ3aXNlPgorCQkgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlcy90ZXh0KCkiLz4KKwkJPC94c2w6b3RoZXJ3aXNlPgorCSAgICA8L3hzbDpjaG9vc2U+CisJPC90ZD4KKyAgICAgICAgPHRkPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJ0aW1lL3RleHQoKSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRpbWVzdGFtcCIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBob3N0bmFtZSIvPjwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJzaG93LnByb2plY3QiIHNlbGVjdD0iJyciLz4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+VGFibGVSb3dDb2xvcjwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorCTx4c2w6dmFyaWFibGUgbmFtZT0icHJvamVjdC5ocmVmIj4KKwkgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCh0cmFuc2xhdGUoLi4vQHBhY2thZ2UsJy4nLCcvJyksICcvJywgLi4vQGlkLCAnXycsIC4uL0BuYW1lLCAnLmh0bWwnKSIvPgorCTwveHNsOnZhcmlhYmxlPgorCTx4c2w6aWYgdGVzdD0iYm9vbGVhbigkc2hvdy5wcm9qZWN0KSI+CisJICAgIDx0ZD48YSBocmVmPSJ7JHByb2plY3QuaHJlZn0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIvPjwvYT48L3RkPgorCTwveHNsOmlmPgorICAgICAgICA8dGQ+CisJICAgIDxhIG5hbWU9IntAbmFtZX0iLz4KKwkgICAgPHhzbDpjaG9vc2U+CisJCTx4c2w6d2hlbiB0ZXN0PSJib29sZWFuKCRzaG93LnByb2plY3QpIj4KKwkJICAgIDxhIGhyZWY9Intjb25jYXQoJHByb2plY3QuaHJlZiwgJyMnLCBAbmFtZSl9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+CisJCTwveHNsOndoZW4+CisJCTx4c2w6b3RoZXJ3aXNlPgorCQkgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisJCTwveHNsOm90aGVyd2lzZT4KKwkgICAgPC94c2w6Y2hvb3NlPgorCTwvdGQ+CisgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPgorICAgICAgICAgICAgICAgIDx0ZD5GYWlsdXJlPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlIi8+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPgorICAgICAgICAgICAgICAgIDx0ZD5FcnJvcjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZXJyb3IiLz48L3RkPgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgIDx0ZD5TdWNjZXNzPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0idGltZS90ZXh0KCkiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gTm90ZSA6IHRoZSBiZWxvdyB0ZW1wbGF0ZSBlcnJvciBhbmQgZmFpbHVyZSBhcmUgdGhlIHNhbWUgc3R5bGUKKyAgICAgICAgICAgIHNvIGp1c3QgY2FsbCB0aGUgc2FtZSBzdHlsZSBzdG9yZSBpbiB0aGUgdG9vbGtpdCB0ZW1wbGF0ZSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZhaWx1cmUiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3IiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+CisgICAgPCEtLSBkaXNwbGF5IHRoZSBzdGFja3RyYWNlIC0tPgorICAgIDxici8+PGJyLz4KKyAgICA8Y29kZT4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0iLiIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvY29kZT4KKyAgICA8IS0tIHRoZSBsYXR0ZXIgaXMgYmV0dGVyIGJ1dCBtaWdodCBiZSBwcm9ibGVtYXRpYyBmb3Igbm9uLTIxIiBtb25pdG9ycy4uLiAtLT4KKyAgICA8IS0tcHJlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9wcmUtLT4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIFN0eWxlIGZvciB0aGUgZXJyb3IgYW5kIGZhaWx1cmUgaW4gdGhlIHRlc3RjYXNlIHRlbXBsYXRlIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIj4KKyAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAbWVzc2FnZSkiPk4vQTwveHNsOndoZW4+CisgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXNzYWdlIi8+CisgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICA8L3hzbDpjaG9vc2U+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbGluZW51bWJlciI+CisgICAgICAgICAgICA8YnI+PC9icj4KKyAgICAgICAgICAgIGF0IGxpbmUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsaW5lbnVtYmVyIi8+CisgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGNvbHVtbm51bWJlciI+CisgICAgICAgICAgICAgICAgICAgICwgY29sdW1uIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29sdW1ubnVtYmVyIi8+CisgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6d2hlbj4KKyAgICA8L3hzbDpjaG9vc2U+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAxIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCRzdHJpbmcpLCdcJywnXFwnKSIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idG1wMiIgc2VsZWN0PSJzdHJpbmd1dGlsczpyZXBsYWNlKHN0cmluZygkdG1wMSksJnF1b3Q7JyZxdW90OywmcXVvdDtcJmFwb3M7JnF1b3Q7KSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG1wMiIvPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIHRlbXBsYXRlIHRoYXQgd2lsbCBjb252ZXJ0IGEgY2FycmlhZ2UgcmV0dXJuIGludG8gYSBiciB0YWcKKyAgICBAcGFyYW0gd29yZCB0aGUgdGV4dCBmcm9tIHdoaWNoIHRvIGNvbnZlcnQgQ1IgdG8gQlIgdGFnCistLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9J3N0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCR3b3JkKSwiJiN4QTsiLCImbHQ7YnIvPiIpJy8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAwJykiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktcGVyY2VudCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCR2YWx1ZSwnMC4wMCUnKSIvPgorPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvanVuaXQtbm9mcmFtZXMueHNsIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvanVuaXQtbm9mcmFtZXMueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTA0NmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC9qdW5pdC1ub2ZyYW1lcy54c2wKQEAgLTAsMCArMSw0ODUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCisgICAgICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKyAgICAgICAgeG1sbnM6c3RyaW5ndXRpbHM9InhhbGFuOi8vb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlscyI+Cis8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIGluZGVudD0ieWVzIiBlbmNvZGluZz0iVVMtQVNDSUkiCisgIGRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgLz4KKzx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKworIFNhbXBsZSBzdHlsZXNoZWV0IHRvIGJlIHVzZWQgd2l0aCBBbnQgSlVuaXRSZXBvcnQgb3V0cHV0LgorCisgSXQgY3JlYXRlcyBhIG5vbi1mcmFtZWQgcmVwb3J0IHRoYXQgY2FuIGJlIHVzZWZ1bCB0byBzZW5kIHZpYQorIGUtbWFpbCBvciBzdWNoLgorCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgIDx0aXRsZT5BbnRVbml0IFRlc3QgUmVzdWx0czwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgIGJvZHkgeworICAgICAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7CisgICAgICAgIGNvbG9yOiMwMDAwMDA7CisgICAgICB9CisgICAgICB0YWJsZSB0ciB0ZCwgdGFibGUgdHIgdGggeworICAgICAgICAgIGZvbnQtc2l6ZTogNjglOworICAgICAgfQorICAgICAgdGFibGUuZGV0YWlscyB0ciB0aHsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICAgICAgYmFja2dyb3VuZDojYTZjYWYwOworICAgICAgfQorICAgICAgdGFibGUuZGV0YWlscyB0ciB0ZHsKKyAgICAgICAgYmFja2dyb3VuZDojZWVlZWUwOworICAgICAgfQorCisgICAgICBwIHsKKyAgICAgICAgbGluZS1oZWlnaHQ6MS41ZW07CisgICAgICAgIG1hcmdpbi10b3A6MC41ZW07IG1hcmdpbi1ib3R0b206MS4wZW07CisgICAgICB9CisgICAgICBoMSB7CisgICAgICAgIG1hcmdpbjogMHB4IDBweCA1cHg7IGZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIGgyIHsKKyAgICAgICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCisgICAgICB9CisgICAgICBoMyB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIGg0IHsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgICAgfQorICAgICAgaDUgeworICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCisgICAgICB9CisgICAgICBoNiB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIC5FcnJvciB7CisgICAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnJlZDsKKyAgICAgIH0KKyAgICAgIC5GYWlsdXJlIHsKKyAgICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOworICAgICAgfQorICAgICAgLlByb3BlcnRpZXMgeworICAgICAgICB0ZXh0LWFsaWduOnJpZ2h0OworICAgICAgfQorICAgICAgPC9zdHlsZT4KKyAgICAgICA8IS0tCisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorICAgICAgICB2YXIgUHJvamVjdHMgPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgdmFyIGN1cjsKKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlIj4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvcGVydGllcyIvPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKworICAgICAgIDwvc2NyaXB0PgorICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCFbQ0RBVEFbCisgICAgICAgIGZ1bmN0aW9uIGRpc3BsYXlQcm9wZXJ0aWVzIChuYW1lKSB7CisgICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdy5vcGVuKCcnLCdKVW5pdFN5c3RlbVByb3BlcnRpZXMnLCdzY3JvbGxiYXJzPTEscmVzaXphYmxlPTEnKTsKKyAgICAgICAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50OworICAgICAgICAgIGRvYy5vcGVuKCk7CisgICAgICAgICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48dGl0bGU+UHJvcGVydGllcyBvZiAiICsgbmFtZSArICI8L3RpdGxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPHN0eWxlPiIpCisgICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7IGNvbG9yOiMwMDAwMDA7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7IGZvbnQtc2l6ZTogNjglOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyBib3JkZXItbGVmdDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci10b3A6c29saWQgMSAjY2NjY2NjOyBwYWRkaW5nOjVweDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0ZCB7IGZvbnQ6bm9ybWFsOyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmZmOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJoMyB7IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvaGVhZD48Ym9keT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxoMz5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvaDM+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0YWJsZSBjbGFzcz0ncHJvcGVydGllcyc+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iKTsKKyAgICAgICAgICBmb3IgKHByb3AgaW4gUHJvamVjdHNbbmFtZV0pIHsKKyAgICAgICAgICAgIGRvYy53cml0ZSgiPHRyPjx0aD4iICsgcHJvcCArICI8L3RoPjx0ZD4iICsgUHJvamVjdHNbbmFtZV1bcHJvcF0gKyAiPC90ZD48L3RyPiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBkb2Mud3JpdGUoIjwvdGFibGU+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8L2JvZHk+PC9odG1sPiIpOworICAgICAgICAgIGRvYy5jbG9zZSgpOworICAgICAgICAgIHdpbi5mb2N1cygpOworICAgICAgICB9CisgICAgICBdXT4KKyAgICAgIDwvc2NyaXB0PgorICAgICAgLS0+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8YSBuYW1lPSJ0b3AiPjwvYT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisKKyAgICAgICAgICAgIDwhLS0gU3VtbWFyeSBwYXJ0IC0tPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN1bW1hcnkiLz4KKyAgICAgICAgICAgIDxociBzaXplPSIxIiB3aWR0aD0iOTUlIiBhbGlnbj0ibGVmdCIvPgorCisgICAgICAgICAgICA8IS0tIERpcmVjdG9yeSBMaXN0IHBhcnQgLS0+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlyZWN0b3J5bGlzdCIvPgorICAgICAgICAgICAgPGhyIHNpemU9IjEiIHdpZHRoPSI5NSUiIGFsaWduPSJsZWZ0Ii8+CisKKyAgICAgICAgICAgIDwhLS0gRm9yIGVhY2ggZGlyZWN0b3J5IGNyZWF0ZSBpdHMgcGFydCAtLT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXJlY3RvcmllcyIvPgorICAgICAgICAgICAgPGhyIHNpemU9IjEiIHdpZHRoPSI5NSUiIGFsaWduPSJsZWZ0Ii8+CisKKyAgICAgICAgICAgIDwhLS0gRm9yIGVhY2ggY2xhc3MgY3JlYXRlIHRoZSAgcGFydCAtLT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzIi8+CisKKyAgICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gV3JpdGUgYSBsaXN0IG9mIGFsbCBkaXJlY3RvcmllcyB3aXRoIGFuIGh5cGVybGluayB0byB0aGUgYW5jaG9yIG9mICAgIC0tPgorICAgIDwhLS0gb2YgdGhlIGRpcmVjdG9yeSBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXJlY3RvcnlsaXN0Ij4KKyAgICAgICAgPGgyPkRpcmVjdG9yaWVzPC9oMj4KKyAgICAgICAgTm90ZTogZGlyZWN0b3J5IHN0YXRpc3RpY3MgYXJlIG5vdCBjb21wdXRlZCByZWN1cnNpdmVseSwgdGhleSBvbmx5IHN1bSB1cCBhbGwgb2YgaXRzIHRlc3RzdWl0ZXMgbnVtYmVycy4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICA8IS0tIGxpc3QgYWxsIGRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5IC0tPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KKyAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdHN1aXRlcy1pbi1kaXJlY3RvcnkiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIi8+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Q291bnQiIHNlbGVjdD0ic3VtKCR0ZXN0c3VpdGVzLWluLWRpcmVjdG9yeS90ZXN0cy90ZXh0KCkpIi8+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSgkdGVzdHN1aXRlcy1pbi1kaXJlY3RvcnkvZXJyb3JzL3RleHQoKSkiLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZhaWx1cmVDb3VudCIgc2VsZWN0PSJzdW0oJHRlc3RzdWl0ZXMtaW4tZGlyZWN0b3J5L2ZhaWx1cmVzL3RleHQoKSkiLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRpbWVDb3VudCIgc2VsZWN0PSJzdW0oJHRlc3RzdWl0ZXMtaW4tZGlyZWN0b3J5L3RpbWUvdGV4dCgpKSIvPgorCisgICAgICAgICAgICAgICAgPCEtLSB3cml0ZSBhIHN1bW1hcnkgZm9yIHRoZSBkaXJlY3RvcnkgLS0+CisgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBzZXQgYSBuaWNlIGNvbG9yIGRlcGVuZGluZyBpZiB0aGVyZSBpcyBhbiBlcnJvci9mYWlsdXJlIC0tPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGZhaWx1cmVDb3VudCAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXJyb3JDb3VudCAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iI3tAcGFja2FnZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0Q291bnQiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmFpbHVyZUNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkdGltZUNvdW50Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlc3RzdWl0ZXMtaW4tZGlyZWN0b3J5L0B0aW1lc3RhbXAiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0c3VpdGVzLWluLWRpcmVjdG9yeS9AaG9zdG5hbWUiLz48L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBXcml0ZSBhIGRpcmVjdG9yeSBsZXZlbCByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tIEl0IGNyZWF0ZXMgYSB0YWJsZSB3aXRoIHZhbHVlcyBmcm9tIHRoZSBkb2N1bWVudDogICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tIE5hbWUgfCBUZXN0cyB8IEVycm9ycyB8IEZhaWx1cmVzIHwgVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImRpcmVjdG9yaWVzIj4KKyAgICAgICAgPCEtLSBjcmVhdGUgYW4gYW5jaG9yIHRvIHRoaXMgZGlyZWN0b3J5IG5hbWUgLS0+CisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6dGVzdHN1aXRlL0BwYWNrYWdlKV0iPgorICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICA8YSBuYW1lPSJ7QHBhY2thZ2V9Ij48L2E+CisgICAgICAgICAgICAgICAgPGgzPkRpcmVjdG9yeSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L2gzPgorCisgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiLz4KKworICAgICAgICAgICAgICAgICAgICA8IS0tIG1hdGNoIHRoZSB0ZXN0c3VpdGVzIG9mIHRoaXMgZGlyZWN0b3J5IC0tPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gY3VycmVudCgpL0BwYWNrYWdlXSIgbW9kZT0icHJpbnQudGVzdCIvPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+CisgICAgICAgICAgICAgICAgPHAvPgorICAgICAgICAgICAgICAgIDxwLz4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzZXMiPgorICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idGVzdHN1aXRlIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICA8IS0tIGNyZWF0ZSBhbiBhbmNob3IgdG8gdGhpcyBjbGFzcyBuYW1lIC0tPgorICAgICAgICAgICAgPGEgbmFtZT0ie0BuYW1lfSI+PC9hPgorICAgICAgICAgICAgPGgzPlByb2plY3QgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMz4KKworICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgIHRlc3QgY2FuIGV2ZW4gbm90IGJlIHN0YXJ0ZWQgYXQgYWxsIChmYWlsdXJlIHRvIGxvYWQgdGhlIGNsYXNzKQorICAgICAgICAgICAgICBzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5CisgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iLi9lcnJvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRXJyb3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3Rlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ii8+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6ZGlzcGxheVByb3BlcnRpZXMoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4nKTs8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgJiMxODc7CisgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgIDxwLz4KKworICAgICAgICAgICAgPGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+CisgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdW1tYXJ5Ij4KKyAgICAgICAgPGgyPlN1bW1hcnk8L2gyPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL3Rlc3RzL3RleHQoKSkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlcnJvckNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvZXJyb3JzL3RleHQoKSkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9mYWlsdXJlcy90ZXh0KCkpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvdGltZS90ZXh0KCkpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3VjY2Vzc1JhdGUiIHNlbGVjdD0iKCR0ZXN0Q291bnQgLSAkZmFpbHVyZUNvdW50IC0gJGVycm9yQ291bnQpIGRpdiAkdGVzdENvdW50Ii8+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHRoPlRlc3RzPC90aD4KKyAgICAgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+CisgICAgICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgICAgIDx0aD5TdWNjZXNzIHJhdGU8L3RoPgorICAgICAgICAgICAgPHRoPlRpbWU8L3RoPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGZhaWx1cmVDb3VudCAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvdGQ+CisgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcnJvckNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiRzdWNjZXNzUmF0ZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHRpbWVDb3VudCIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3RkPgorCisgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI5NSUiPgorICAgICAgICA8dHI+CisgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPgorICAgICAgICBOb3RlOiA8aT5mYWlsdXJlczwvaT4gYXJlIGFudGljaXBhdGVkIGFuZCBjaGVja2VkIGZvciB3aXRoIGFzc2VydGlvbnMgd2hpbGUgPGk+ZXJyb3JzPC9pPiBhcmUgdW5hbnRpY2lwYXRlZC4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tCisgICBXcml0ZSBwcm9wZXJ0aWVzIGludG8gYSBKYXZhU2NyaXB0IGRhdGEgc3RydWN0dXJlLgorICAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaWRlYSBieSBFcmlrIEhhdGNoZXIgKGVoYXRjaGVyQGFwYWNoZS5vcmcpCisgICAtLT4KKyAgPCEtLQorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9wZXJ0aWVzIj4KKyAgICBjdXIgPSBQcm9qZWN0c1snPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIvPiddID0gbmV3IEFycmF5KCk7CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KKyAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICBjdXJbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiddID0gJzx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iQHZhbHVlIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4nOworICAgIDwveHNsOmZvci1lYWNoPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgLS0+CisKKzwhLS0gUGFnZSBIRUFERVIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgorICAgIDxoMT5Vbml0IFRlc3QgUmVzdWx0czwvaDE+CisgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9J2h0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2FudHVuaXQvJz5BbnRVbml0PC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2FudC5hcGFjaGUub3JnLyc+QW50PC9hPi48L3RkPgorICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8aHIgc2l6ZT0iMSIvPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iaGVhZGVyIj4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICA8dGggd2lkdGg9IjgwJSI+TmFtZTwvdGg+CisgICAgICAgIDx0aD5UZXN0czwvdGg+CisgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICA8dGg+RmFpbHVyZXM8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBjbGFzcyBoZWFkZXIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgorICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lIFN0YW1wPC90aD4KKyAgICAgICAgPHRoPkhvc3Q8L3RoPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBtZXRob2QgaGVhZGVyIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRoPk5hbWU8L3RoPgorICAgICAgICA8dGg+U3RhdHVzPC90aD4KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPlR5cGU8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tIGNsYXNzIGluZm9ybWF0aW9uIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICA8IS0tIHNldCBhIG5pY2UgY29sb3IgZGVwZW5kaW5nIGlmIHRoZXJlIGlzIGFuIGVycm9yL2ZhaWx1cmUgLS0+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlcy90ZXh0KClbLiZndDsgMF0iPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJlcnJvcnMvdGV4dCgpWy4mZ3Q7IDBdIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKworICAgICAgICA8IS0tIHByaW50IHRlc3RzdWl0ZSBpbmZvcm1hdGlvbiAtLT4KKyAgICAgICAgPHRkPjxhIGhyZWY9IiN7QG5hbWV9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXN0cy90ZXh0KCkiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImVycm9ycy90ZXh0KCkiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZhaWx1cmVzL3RleHQoKSIvPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJ0aW1lL3RleHQoKSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQHRpbWVzdGFtcCIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBob3N0bmFtZSIvPjwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImVycm9yIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlRhYmxlUm93Q29sb3I8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+CisgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPgorICAgICAgICAgICAgICAgIDx0ZD5GYWlsdXJlPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJmYWlsdXJlIi8+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPgorICAgICAgICAgICAgICAgIDx0ZD5FcnJvcjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZXJyb3IiLz48L3RkPgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgIDx0ZD5TdWNjZXNzPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0idGltZS90ZXh0KCkiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZhaWx1cmUiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3IiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+CisgICAgPCEtLSBkaXNwbGF5IHRoZSBzdGFja3RyYWNlIC0tPgorICAgIDxici8+PGJyLz4KKyAgICA8Y29kZT4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0iLiIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvY29kZT4KKyAgICA8IS0tIHRoZSBsYXR0ZXIgaXMgYmV0dGVyIGJ1dCBtaWdodCBiZSBwcm9ibGVtYXRpYyBmb3Igbm9uLTIxIiBtb25pdG9ycy4uLiAtLT4KKyAgICA8IS0tcHJlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9wcmUtLT4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIFN0eWxlIGZvciB0aGUgZXJyb3IgYW5kIGZhaWx1cmUgaW4gdGhlIHRlc2Nhc2UgdGVtcGxhdGUgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiPgorICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEBtZXNzYWdlKSI+Ti9BPC94c2w6d2hlbj4KKyAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4KKyAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgIDwveHNsOmNob29zZT4KKyAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBsaW5lbnVtYmVyIj4KKyAgICAgICAgICAgIDxicj48L2JyPgorICAgICAgICAgICAgYXQgbGluZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxpbmVudW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAY29sdW1ubnVtYmVyIj4KKyAgICAgICAgICAgICAgICAgICAgLCBjb2x1bW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb2x1bW5udW1iZXIiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8L3hzbDp3aGVuPgorICAgIDwveHNsOmNob29zZT4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJzdHJpbmciLz4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InRtcDEiIHNlbGVjdD0ic3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHN0cmluZyksJ1wnLCdcXCcpIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAyIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCR0bXAxKSwmcXVvdDsnJnF1b3Q7LCZxdW90O1wmYXBvczsmcXVvdDspIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0bXAyIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgdGVtcGxhdGUgdGhhdCB3aWxsIGNvbnZlcnQgYSBjYXJyaWFnZSByZXR1cm4gaW50byBhIGJyIHRhZworICAgIEBwYXJhbSB3b3JkIHRoZSB0ZXh0IGZyb20gd2hpY2ggdG8gY29udmVydCBDUiB0byBCUiB0YWcKKy0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9IndvcmQiLz4KKyAgICA8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0nc3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHdvcmQpLCImI3hBOyIsIiZsdDtici8+IiknLz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCR2YWx1ZSwnMC4wMDAnKSIvPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwJScpIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmNhdC10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmNhdC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzliYzJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uY2F0LXRlc3QueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0iYW50dW5pdCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKyAgPGltcG9ydCBmaWxlPSIuLi9hbnR1bml0LWJhc2UueG1sIiAvPgorCisgIDx0YXJnZXQgbmFtZT0idGVhckRvd24iPgorICAgIDxkZWxldGUgZmlsZT0iYmluYXJ5QXBwZW5kRGVzdCIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9ImVuY29kZVN0cmluZ0Rlc3QiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEJpbmFyeUFwcGVuZCI+CisgICAgPGF1OmFzc2VydFRydWUgbWVzc2FnZT0icHJlcmVxdWlzaXRlIGNvbmRpdGlvbnMgdW5tZXQiPgorICAgICAgPGxlbmd0aCBsZW5ndGg9IjAiPgorICAgICAgICA8IS0tIGFsbG93IGZvciBub25leGlzdGVudCBPUiB6ZXJvLWxlbmd0aDogLS0+CisgICAgICAgIDxmaWxlc2V0IGZpbGU9ImJpbmFyeUFwcGVuZERlc3QiIC8+CisgICAgICA8L2xlbmd0aD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgICAgPGVjaG8gZmlsZT0iYmluYXJ5QXBwZW5kRGVzdCI+eDwvZWNobz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZSBtZXNzYWdlPSJkZXN0ZmlsZSBzZXR1cCBmYWlsZWQiPgorICAgICAgPGxlbmd0aCBsZW5ndGg9IjEiIGZpbGU9ImJpbmFyeUFwcGVuZERlc3QiIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDxjb25jYXQgYXBwZW5kPSJ0cnVlIiBkZXN0ZmlsZT0iYmluYXJ5QXBwZW5kRGVzdCIgYmluYXJ5PSJ0cnVlIj4KKyAgICAgIDxzdHJpbmcgdmFsdWU9IngiIC8+CisgICAgPC9jb25jYXQ+CisgICAgPGF1OmFzc2VydFRydWUgbWVzc2FnZT0iZXhwZWN0ZWQgbGVuZ3RoIDIiPgorICAgICAgPGxlbmd0aCBmaWxlPSJiaW5hcnlBcHBlbmREZXN0IiBsZW5ndGg9IjIiIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RTdHJpbmdFbmNvZGluZyIgaWY9Im9zLnVuaXgiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJiciIgdmFsdWU9IiR7bGluZS5zZXBhcmF0b3J9IiAvPgorICAgIDxjb25jYXQgZGVzdGZpbGU9ImVuY29kZVN0cmluZ0Rlc3QiCisgICAgICAgICAgICBvdXRwdXRFbmNvZGluZz0idXRmLTE2Ij5mb28ke2JyfWJhciR7YnJ9YmF6JHticn08L2NvbmNhdD4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZXNtYXRjaCBhc3RleHQ9InRydWUiPgorICAgICAgICA8ZmlsZSBmaWxlPSJ1dGYtMTYuZXhwZWN0ZWQiIC8+CisgICAgICAgIDxmaWxlIGZpbGU9ImVuY29kZVN0cmluZ0Rlc3QiIC8+CisgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisJCisgIDx0YXJnZXQgbmFtZT0idGVzdFN0cmluZ0VuY29kaW5nV2luZG93cyIgaWY9Im9zLndpbmRvd3MiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJiciIgdmFsdWU9IiR7bGluZS5zZXBhcmF0b3J9IiAvPgorCTxjb25jYXQgZGVzdGZpbGU9ImVuY29kZVN0cmluZ0Rlc3QiCisJICAgICAgICBvdXRwdXRFbmNvZGluZz0idXRmLTE2Ij5mb28ke2JyfWJhciR7YnJ9YmF6JHticn08L2NvbmNhdD4KKwk8YXU6YXNzZXJ0VHJ1ZT4KKwkgIDxyZXNvdXJjZXNtYXRjaCBhc3RleHQ9InRydWUiPgorCSAgICA8ZmlsZSBmaWxlPSJ1dGYtMTYuZXhwZWN0ZWQud2luZG93cyIgLz4KKwkgICAgPGZpbGUgZmlsZT0iZW5jb2RlU3RyaW5nRGVzdCIgLz4KKwkgIDwvcmVzb3VyY2VzbWF0Y2g+CisJPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REb05vdEZpeE5lc3RlZFRleHQiIGRlc2NyaXB0aW9uPSJCdWd6aWxsYSA0MjM2OSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2VzbWF0Y2g+CisgICAgICAgIDxzdHJpbmc+Zm9vPC9zdHJpbmc+CisgICAgICAgIDxjb25jYXQgZml4bGFzdGxpbmU9InRydWUiPmZvbzwvY29uY2F0PgorICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vYW50dmVyc2lvbi10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9hbnR2ZXJzaW9uLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZWJlMWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vYW50dmVyc2lvbi10ZXN0LnhtbApAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJhbnR2ZXJzaW9uLXRlc3QiIGRlZmF1bHQ9ImFsbCIgYmFzZWRpcj0iLiIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdC1hdGxlYXN0Ij4NCisgICAgPGF1OmFzc2VydFRydWUgbWVzc2FnZT0iRXhwZWN0ZWQgYW50dmVyc2lvbiBvZiAke2FudC52ZXJzaW9ufSB0byBiZSBhdCBsZWFzdCAxLjcuMCI+DQorICAgICAgICA8IS0tIEFudFZlcnNpb24gd2FzIGludHJvZHVjZWQgbGlrZSBBbnRVbml0IGluIDEuNyAtIHNvIHRoaXMgbXVzdCBiZSB0cnVlIC0tPg0KKyAgICAJPGFudHZlcnNpb24gYXRsZWFzdD0iMS43LjAiLz4NCisgICAgPC9hdTphc3NlcnRUcnVlPgkNCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWV4YWN0bHkiPg0KKyAgICA8YW50dmVyc2lvbiBwcm9wZXJ0eT0iYW50LmFjdHVhbC52ZXJzaW9uIi8+DQorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9IkV4cGVjdGVkIGFudHZlcnNpb24gb2YgJHthbnQuYWN0dWFsLnZlcnNpb259Ij4NCisgICAgCTxhbnR2ZXJzaW9uIGV4YWN0bHk9IiR7YW50LmFjdHVhbC52ZXJzaW9ufSIvPg0KKyAgICA8L2F1OmFzc2VydFRydWU+CQ0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3QtYXRsZWFzdC1mYWlsIj4NCisgIAk8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjEuOC45Ii8+DQorICAgIDxhdTphc3NlcnRGYWxzZT4NCisgICAJICA8YW50dmVyc2lvbiBhdGxlYXN0PSIxLjkuMCIvPg0KKyAgICA8L2F1OmFzc2VydEZhbHNlPg0KKyAgPC90YXJnZXQ+DQorICAgIA0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXRhc2siPg0KKyAgICA8YW50dmVyc2lvbiBwcm9wZXJ0eT0iYW50dmVyc2lvbiIvPg0KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlTZXQgbmFtZT0iYW50dmVyc2lvbiIgbWVzc2FnZT0iUHJvcGVydHkgJ2FudHZlcnNpb24nIHNob3VsZCBiZSBzZXQuIi8+DQorICAgIDxlY2hvPkFudFZlcnNpb249JHthbnR2ZXJzaW9ufTwvZWNobz4gIA0KKyAgPC90YXJnZXQ+ICAgIA0KKyAgICANCisgIDx0YXJnZXQgbmFtZT0idGVzdC1wcm9wZXJ0eS1jb25kaXRpb25hbDEiPg0KKyAgICA8YW50dmVyc2lvbiBwcm9wZXJ0eT0iYW50dmVyc2lvbiIgYXRsZWFzdD0iMi4wLjAiLz4NCisgICAgPGF1OmFzc2VydFRydWUgbWVzc2FnZT0iUHJvcGVydHkgJ2FudHZlcnNpb24nIHNob3VsZCBub3QgYmUgc2V0IGJlY2F1c2UgdGhpcyBpcyBub3QgQW50IDIuMC4wKy4iPg0KKyAgICAgIDxub3Q+DQorICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImFudHZlcnNpb24iLz4gIA0KKyAgICAgIDwvbm90PiAgDQorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4gIA0KKyAgPC90YXJnZXQ+DQorICAgIA0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXByb3BlcnR5LWNvbmRpdGlvbmFsMiI+DQorICAgIDxhbnR2ZXJzaW9uIHByb3BlcnR5PSJhbnR2ZXJzaW9uIiBhdGxlYXN0PSIxLjcuMCIvPg0KKyAgICA8YXU6YXNzZXJ0VHJ1ZSBtZXNzYWdlPSJQcm9wZXJ0eSAnYW50dmVyc2lvbicgc2hvdWxkIGJlIHNldCBiZWNhdXNlIHdlIHNob3VsZCBoYXZlIEFudCAxLjcuMCsgKCR7YW50LnZlcnNpb259KS4iPg0KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYW50dmVyc2lvbiIvPiAgDQorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4gIA0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9ImFsbCI+DQorICAgIDxhdTphbnR1bml0Pg0KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7YW50LmZpbGV9Ii8+DQorICAgICAgPGF1OnBsYWlubGlzdGVuZXIvPg0KKyAgICA8L2F1OmFudHVuaXQ+DQorICA8L3RhcmdldD4NCisNCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL2hhc2ZyZWVzcGFjZS10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9oYXNmcmVlc3BhY2UtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiMTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9oYXNmcmVlc3BhY2UtdGVzdC54bWwKQEAgLTAsMCArMSw1NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+DQorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iaGFzZnJlZXNwYWNlLXRlc3QiIGRlZmF1bHQ9ImFsbCIgYmFzZWRpcj0iLiIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4NCisNCisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkazYuYXZhaWxhYmxlIiBjbGFzc25hbWU9ImphdmEudXRpbC5TZXJ2aWNlTG9hZGVyIi8+DQorDQorICA8cHJvcGVydHkgbmFtZT0icGFydGl0aW9uIiB2YWx1ZT0iJHt1c2VyLmhvbWV9IiAvPg0KKw0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LW5vdC1lbm91Z2gtc3BhY2UtaHVtYW4iIGlmPSJqZGs2LmF2YWlsYWJsZSI+DQorICAgIDxhdTphc3NlcnRGYWxzZT4NCisgICAgICA8aGFzZnJlZXNwYWNlIHBhcnRpdGlvbj0iJHtwYXJ0aXRpb259IiBuZWVkZWQ9IjFQIi8+DQorICAgIDwvYXU6YXNzZXJ0RmFsc2U+CQ0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3QtZW5vdWdoLXNwYWNlLWh1bWFuIiBpZj0iamRrNi5hdmFpbGFibGUiPg0KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4NCisgICAgICA8aGFzZnJlZXNwYWNlIHBhcnRpdGlvbj0iJHtwYXJ0aXRpb259IiBuZWVkZWQ9IjFLIi8+DQorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4JDQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdC1ub3QtZW5vdWdoLXNwYWNlIiBpZj0iamRrNi5hdmFpbGFibGUiPg0KKyAgCTxwcm9wZXJ0eSBuYW1lPSJsb25nLm1heC12YWx1ZSIgdmFsdWU9IjkyMjMzNzIwMzY4NTQ3NzU4MDciLz4NCisgICAgPGF1OmFzc2VydEZhbHNlPg0KKyAgIAkgIDxoYXNmcmVlc3BhY2UgcGFydGl0aW9uPSIke3BhcnRpdGlvbn0iIG5lZWRlZD0iJHtsb25nLm1heC12YWx1ZX0iLz4NCisgICAgPC9hdTphc3NlcnRGYWxzZT4NCisgIDwvdGFyZ2V0Pg0KKwkJDQorICA8dGFyZ2V0IG5hbWU9InRlc3QtZW5vdWdoLXNwYWNlIiBpZj0iamRrNi5hdmFpbGFibGUiPg0KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4NCisgICAgICA8aGFzZnJlZXNwYWNlIHBhcnRpdGlvbj0iJHtwYXJ0aXRpb259IiBuZWVkZWQ9IjEiLz4JCQkNCisgICAgPC9hdTphc3NlcnRUcnVlPgkNCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJhbGwiPg0KKyAgICA8YXU6YW50dW5pdD4NCisgICAgICA8ZmlsZXNldCBmaWxlPSIke2FudC5maWxlfSIvPg0KKyAgICAgIDxhdTpwbGFpbmxpc3RlbmVyLz4NCisgICAgPC9hdTphbnR1bml0Pg0KKyAgPC90YXJnZXQ+DQorDQorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9yZXNvdXJjZWNvbnRhaW5zLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL3Jlc291cmNlY29udGFpbnMtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5MjIwMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9yZXNvdXJjZWNvbnRhaW5zLXRlc3QueG1sCkBAIC0wLDAgKzEsMTQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InJlc291cmNlY29udGFpbnMtdGVzdCIgZGVmYXVsdD0iYW50dW5pdCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4NCisNCisgIDxpbXBvcnQgZmlsZT0iLi4vLi4vYW50dW5pdC1iYXNlLnhtbCIvPg0KKw0KKyAgPHRhcmdldCBuYW1lPSJzZXRVcCI+DQorICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlIiBsb2NhdGlvbj0iJHtqYXZhLmlvLnRtcGRpcn0vdGVzdC1yZXNvdXJjZS50eHQiLz4NCisgICAgPGVjaG8gZmlsZT0iJHtmaWxlfSIgbWVzc2FnZT0ibG9hZHMgb2YgdGV4dCEiLz4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+DQorICAgIDxkZWxldGUgZmlsZT0iJHtmaWxlfSIvPg0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3Rjb250YWlucyI+DQorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9IlNob3VsZCBoYXZlIGZvdW5kIHRoZSB0ZXh0IGluIHRoZSByZXNvdXJjZSI+DQorICAgICAgPHJlc291cmNlY29udGFpbnMgcmVzb3VyY2U9IiR7ZmlsZX0iIHN1YnN0cmluZz0idGV4dCIvPg0KKyAgICA8L2F1OmFzc2VydFRydWU+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdENvbnRhaW5zTG93ZXJOb25DUyI+DQorICAgIDxlY2hvIGZpbGU9IiR7ZmlsZX0iIG1lc3NhZ2U9IkxPQURTIE9GIFRFWFQhIi8+DQorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9IlNob3VsZCBoYXZlIGZvdW5kIHRoZSB0ZXh0IGluIHRoZSByZXNvdXJjZSI+DQorICAgICAgPHJlc291cmNlY29udGFpbnMgcmVzb3VyY2U9IiR7ZmlsZX0iIHN1YnN0cmluZz0idGV4dCINCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlc2Vuc2l0aXZlPSJmYWxzZSIvPg0KKyAgICA8L2F1OmFzc2VydFRydWU+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdENvbnRhaW5zVXBwZXJOb25DUyI+DQorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9IlNob3VsZCBoYXZlIGZvdW5kIHRoZSB0ZXh0IGluIHRoZSByZXNvdXJjZSI+DQorICAgICAgPHJlc291cmNlY29udGFpbnMgcmVzb3VyY2U9IiR7ZmlsZX0iIHN1YnN0cmluZz0iVEVYVCINCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlc2Vuc2l0aXZlPSJmYWxzZSIvPg0KKyAgICA8L2F1OmFzc2VydFRydWU+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdENvbnRhaW5zRW1wdHlTdHJpbmciPg0KKyAgICA8YXU6YXNzZXJ0VHJ1ZSBtZXNzYWdlPSJTaG91bGQgaGF2ZSBmb3VuZCB0aGUgdGV4dCBpbiB0aGUgcmVzb3VyY2UiPg0KKyAgICAgIDxyZXNvdXJjZWNvbnRhaW5zIHJlc291cmNlPSIke2ZpbGV9IiBzdWJzdHJpbmc9IiIgLz4NCisgICAgPC9hdTphc3NlcnRUcnVlPg0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3RDb250YWluc0VtcHR5UHJvcGVydHkiPg0KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdENvbnRhaW5zRW1wdHlQcm9wZXJ0eSIgdmFsdWU9IiIgLz4NCisgICAgPGF1OmFzc2VydFRydWUgbWVzc2FnZT0iU2hvdWxkIGhhdmUgZm91bmQgdGhlIHRleHQgaW4gdGhlIHJlc291cmNlIj4NCisgICAgICA8cmVzb3VyY2Vjb250YWlucyByZXNvdXJjZT0iJHtmaWxlfSINCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHJpbmc9IiR7dGVzdENvbnRhaW5zRW1wdHlQcm9wZXJ0eX0iIC8+DQorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0d2l0aGVtcHR5ZmlsZSI+DQorICAgIDx0cnVuY2F0ZSBmaWxlPSIke2ZpbGV9Ii8+DQorICAgIDxhdTphc3NlcnRGYWxzZSBtZXNzYWdlPSJTaG91bGQgaGF2ZSBmb3VuZCBub3RoaW5nIGFzIGZpbGUgaXMgZW1wdHkiPg0KKyAgICAgIDxyZXNvdXJjZWNvbnRhaW5zIHJlc291cmNlPSIke2ZpbGV9IiBzdWJzdHJpbmc9InRleHQiLz4NCisgICAgPC9hdTphc3NlcnRGYWxzZT4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0V2l0aEVtcHR5RmlsZUFuZFN1YnN0cmluZyI+DQorICAgIDx0cnVuY2F0ZSBmaWxlPSIke2ZpbGV9Ii8+DQorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9IkVtcHR5IHJlc291cmNlIHNob3VsZCBjb250YWluIGVtcHR5IHN0cmluZyI+DQorICAgICAgPHJlc291cmNlY29udGFpbnMgcmVzb3VyY2U9IiR7ZmlsZX0iIHN1YnN0cmluZz0iIi8+DQorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZG9lc250Y29udGFpbiI+DQorICAgIDxhdTphc3NlcnRGYWxzZSBtZXNzYWdlPSJTaG91bGQgaGF2ZSBmb3VuZCBub3RoaW5nIGFzIGZpbGUgaXMgZW1wdHkiPg0KKyAgICAgIDxyZXNvdXJjZWNvbnRhaW5zIHJlc291cmNlPSIke2ZpbGV9IiBzdWJzdHJpbmc9ImZ1dHVyYW1hIi8+DQorICAgIDwvYXU6YXNzZXJ0RmFsc2U+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVSZWZDb250YWlucyI+DQorICAgIDxmaWxlIGlkPSJmaWxlIiBmaWxlPSIke2ZpbGV9IiAvPg0KKyAgICA8YXU6YXNzZXJ0VHJ1ZSBtZXNzYWdlPSJTaG91bGQgaGF2ZSBmb3VuZCB0aGUgdGV4dCBpbiB0aGUgcmVzb3VyY2UiPg0KKyAgICAgIDxyZXNvdXJjZWNvbnRhaW5zIHJlZmlkPSJmaWxlIiBzdWJzdHJpbmc9InRleHQiLz4NCisgICAgPC9hdTphc3NlcnRUcnVlPg0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3RTdHJpbmdSZWZDb250YWlucyI+DQorICAgIDxzdHJpbmcgaWQ9InN0cmluZyI+bG9hZHMgb2YgdGV4dCE8L3N0cmluZz4NCisgICAgPGF1OmFzc2VydFRydWUgbWVzc2FnZT0iU2hvdWxkIGhhdmUgZm91bmQgdGhlIHRleHQgaW4gdGhlIHJlc291cmNlIj4NCisgICAgICA8cmVzb3VyY2Vjb250YWlucyByZWZpZD0ic3RyaW5nIiBzdWJzdHJpbmc9InRleHQiLz4NCisgICAgPC9hdTphc3NlcnRUcnVlPg0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3RUZXh0Q29uY2F0UmVmQ29udGFpbnMiPg0KKyAgICA8cmVzb3VyY2VzIGlkPSJjb25jYXQiPg0KKyAgICAgIDxjb25jYXQ+bG9hZHMgb2YgdGV4dCE8L2NvbmNhdD4NCisgICAgPC9yZXNvdXJjZXM+DQorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9IlNob3VsZCBoYXZlIGZvdW5kIHRoZSB0ZXh0IGluIHRoZSByZXNvdXJjZSI+DQorICAgICAgPHJlc291cmNlY29udGFpbnMgcmVmaWQ9ImNvbmNhdCIgc3Vic3RyaW5nPSJ0ZXh0Ii8+DQorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZUNvbmNhdFJlZkNvbnRhaW5zIj4NCisgICAgPHJlc291cmNlcyBpZD0iY29uY2F0Ij4NCisgICAgICA8Y29uY2F0PjxmaWxlIGZpbGU9IiR7ZmlsZX0iIC8+PC9jb25jYXQ+DQorICAgIDwvcmVzb3VyY2VzPg0KKyAgICA8YXU6YXNzZXJ0VHJ1ZSBtZXNzYWdlPSJTaG91bGQgaGF2ZSBmb3VuZCB0aGUgdGV4dCBpbiB0aGUgcmVzb3VyY2UiPg0KKyAgICAgIDxyZXNvdXJjZWNvbnRhaW5zIHJlZmlkPSJjb25jYXQiIHN1YnN0cmluZz0idGV4dCIvPg0KKyAgICA8L2F1OmFzc2VydFRydWU+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdE11bHRpQ29uY2F0UmVmQ29udGFpbnMiPg0KKyAgICA8cmVzb3VyY2VzIGlkPSJjb25jYXQiPg0KKyAgICAgIDxjb25jYXQ+DQorICAgICAgICA8aGVhZGVyPkhFQURFUjwvaGVhZGVyPg0KKyAgICAgICAgPGZvb3Rlcj5GT09URVI8L2Zvb3Rlcj4NCisgICAgICAgIDxzdHJpbmc+Zm9vPC9zdHJpbmc+DQorICAgICAgICA8ZmlsZSBmaWxlPSIke2ZpbGV9IiAvPg0KKyAgICAgICAgPHN0cmluZz5iYXI8L3N0cmluZz4NCisgICAgICA8L2NvbmNhdD4NCisgICAgPC9yZXNvdXJjZXM+DQorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9IlNob3VsZCBoYXZlIGZvdW5kIHRoZSB0ZXh0IGluIHRoZSByZXNvdXJjZSI+DQorICAgICAgPHJlc291cmNlY29udGFpbnMgcmVmaWQ9ImNvbmNhdCIgc3Vic3RyaW5nPSJ0ZXh0Ii8+DQorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Rmlyc3RSZWZDb250YWlucyI+DQorICAgIDxmaXJzdCBpZD0iZmlyc3QiPg0KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IiotdGVzdC54bWwiIC8+DQorICAgIDwvZmlyc3Q+DQorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9IlNob3VsZCBoYXZlIGZvdW5kIHRoZSB0ZXh0IGluIHRoZSByZXNvdXJjZSI+DQorICAgICAgPHJlc291cmNlY29udGFpbnMgcmVmaWQ9ImZpcnN0IiBzdWJzdHJpbmc9InByb2plY3QiLz4NCisgICAgPC9hdTphc3NlcnRUcnVlPg0KKyAgPC90YXJnZXQ+DQorDQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2RlbGV0ZS10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2RlbGV0ZS10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQ2YjJkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGVsZXRlLXRlc3QueG1sCkBAIC0wLDAgKzEsNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJkZWxldGUtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iYW50dW5pdCIKKyAgICAgICAgIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3b3JraW5nLmRpciIgdmFsdWU9IndvcmtpbmciLz4KKyAgPHByb3BlcnR5IG5hbWU9ImV4aXN0aW5nLmRpciIgdmFsdWU9IndvcmtpbmcvZXhpc3RzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJub25leGlzdGVudC5kaXIiIHZhbHVlPSJ3b3JraW5nL25vbmV4aXN0cyIvPgorICAKKyAgPGltcG9ydCBmaWxlPSIuLi9hbnR1bml0LWJhc2UueG1sIiAvPgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d29ya2luZy5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3b3JraW5nLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2V4aXN0aW5nLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d29ya2luZy5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS10ZXN0IHRoYXQgeW91IGNhbiBkZWxldGUgYSBmaWxlc2V0IHdpdGggYSBub25leGlzdGVudCBkaXIgd2l0aG91dCBmYWlsdXJlLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdGRlbGZpbGVzZXQiIGRlcGVuZHM9ImluaXQiPgorICAgIDxkZWxldGUgcXVpZXQ9InRydWUiIGluY2x1ZGVFbXB0eURpcnM9InRydWUiPgorICAgICAgIDxmaWxlc2V0IGRpcj0iJHtub25leGlzdGVudC5kaXJ9Ii8+CisgICAgPC9kZWxldGU+CisKKyAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIke2V4aXN0aW5nLmRpcn0iIC8+CisgICAgICAKKyAgICA8ZGVsZXRlIHF1aWV0PSJ0cnVlIiBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIj4KKyAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZXhpc3RpbmcuZGlyfSIvPgorICAgIDwvZGVsZXRlPgorCisgICAgPGF1OmFzc2VydEZpbGVEb2VzbnRFeGlzdCBmaWxlPSIke2V4aXN0aW5nLmRpcn0iIC8+CisKKworICAgIDxta2RpciBkaXI9IiR7ZXhpc3RpbmcuZGlyfSIvPgorCisgICAgPGRlbGV0ZSBxdWlldD0idHJ1ZSIgaW5jbHVkZUVtcHR5RGlycz0idHJ1ZSI+CisgICAgICAgPGZpbGVzZXQgZGlyPSIke25vbmV4aXN0ZW50LmRpcn0iLz4KKyAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZXhpc3RpbmcuZGlyfSIvPgorICAgIDwvZGVsZXRlPgorCisKKyAgICA8YXU6YXNzZXJ0RmlsZURvZXNudEV4aXN0IGZpbGU9IiR7ZXhpc3RpbmcuZGlyfSIgLz4KKworICAgIDxta2RpciBkaXI9IiR7ZXhpc3RpbmcuZGlyfSIvPgorCisgICAgPGRlbGV0ZSBxdWlldD0idHJ1ZSIgaW5jbHVkZUVtcHR5RGlycz0idHJ1ZSI+CisgICAgICAgPGZpbGVzZXQgZGlyPSIke2V4aXN0aW5nLmRpcn0iLz4KKyAgICAgICA8ZmlsZXNldCBkaXI9IiR7bm9uZXhpc3RlbnQuZGlyfSIvPgorICAgIDwvZGVsZXRlPgorCisKKyAgICA8YXU6YXNzZXJ0RmlsZURvZXNudEV4aXN0IGZpbGU9IiR7ZXhpc3RpbmcuZGlyfSIgLz4KKworICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGVwZW5kc2V0L3Rlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGVwZW5kc2V0L3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzQwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9kZXBlbmRzZXQvdGVzdC54bWwKQEAgLTAsMCArMSwxNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJkZXBlbmRzZXQtdGVzdCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QxIj4KKyAgICA8YXU6ZXhwZWN0ZmFpbHVyZSBleHBlY3RlZE1lc3NhZ2U9IkF0IGxlYXN0IG9uZSBzZXQgb2Ygc291cmNlIHJlc291cmNlcyBtdXN0IGJlIHNwZWNpZmllZCI+CisgICAgICA8ZGVwZW5kc2V0IC8+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QyIj4KKyAgICA8YXU6ZXhwZWN0ZmFpbHVyZSBleHBlY3RlZE1lc3NhZ2U9IkF0IGxlYXN0IG9uZSBzZXQgb2YgdGFyZ2V0IGZpbGVzIG11c3QgYmUgc3BlY2lmaWVkIj4KKyAgICAgIDxkZXBlbmRzZXQ+CisgICAgICAgIDxzcmNmaWxlbGlzdCBkaXI9Ii4iIGZpbGVzPSJ0ZXN0Mi50bXAiIC8+CisgICAgICA8L2RlcGVuZHNldD4KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDMiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkTWVzc2FnZT0iQXQgbGVhc3Qgb25lIHNldCBvZiBzb3VyY2UgcmVzb3VyY2VzIG11c3QgYmUgc3BlY2lmaWVkIj4KKyAgICAgIDxkZXBlbmRzZXQ+CisgICAgICAgIDx0YXJnZXRmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9InRlc3QzLnRtcCIgLz4KKyAgICAgIDwvZGVwZW5kc2V0PgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NCI+CisgICAgPHRvdWNoIGZpbGU9InRlc3Q0LnRtcCIgLz4KKyAgICA8ZGVwZW5kc2V0PgorICAgICAgPHNyY2ZpbGVsaXN0IGRpcj0iLiIgZmlsZXM9InRlc3Q0LnRtcCIgLz4KKyAgICAgIDx0YXJnZXRmaWxlc2V0IGlkPSJ0YXJnZXRmcyIgZGlyPSIuIiBpbmNsdWRlcz0iaS1kby1ub3QtZXhpc3QiIC8+CisgICAgPC9kZXBlbmRzZXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgorICAgIDx0b3VjaCBmaWxlPSJvbGRlci50bXAiIC8+CisgICAgPHNsZWVwIHNlY29uZHM9IjMiIC8+CisgICAgPHRvdWNoIGZpbGU9Im5ld2VyLnRtcCIgLz4KKyAgICA8ZGVwZW5kc2V0PgorICAgICAgPHNyY2ZpbGVsaXN0IGRpcj0iLiIgZmlsZXM9Im5ld2VyLnRtcCIgLz4KKyAgICAgIDx0YXJnZXRmaWxlbGlzdCBkaXI9Ii4iIGZpbGVzPSJvbGRlci50bXAiIC8+CisgICAgPC9kZXBlbmRzZXQ+CisgICAgPGF1OmFzc2VydEZhbHNlPgorICAgICAgPGF2YWlsYWJsZSBmaWxlPSJvbGRlci50bXAiIC8+CisgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NiI+CisgICAgPHRvdWNoIGZpbGU9InNvdXJjZXNldF8xLnRtcCIgLz4KKyAgCTx0b3VjaCBmaWxlPSJ0YXJnZXRzZXRfMS50bXAiIC8+CisgICAgPHNsZWVwIHNlY29uZHM9IjMiIC8+CisgIAk8dG91Y2ggZmlsZT0ic291cmNlc2V0XzIudG1wIiAvPgorICAJPHRvdWNoIGZpbGU9InRhcmdldHNldF8yLnRtcCIgLz4KKyAgCTxzbGVlcCBzZWNvbmRzPSIyIiAvPgkKKyAgICA8ZGVwZW5kc2V0PgorICAgICAgPHNvdXJjZXM+CisgICAgICAgIDxmaWxlbGlzdCBkaXI9Ii4iIGZpbGVzPSJzb3VyY2VzZXRfMS50bXAsc291cmNlc2V0XzIudG1wIiAvPgorICAgICAgPC9zb3VyY2VzPgorICAgICAgPHRhcmdldHM+CisgICAgICAgIDxmaWxlbGlzdCBkaXI9Ii4iIGZpbGVzPSJ0YXJnZXRzZXRfMS50bXAsdGFyZ2V0c2V0XzIudG1wIiAvPgorICAgICAgPC90YXJnZXRzPgorICAgIDwvZGVwZW5kc2V0PgorICAgIDxhdTphc3NlcnRGYWxzZT4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0idGFyZ2V0c2V0XzEudG1wIiAvPgorICAgIDwvYXU6YXNzZXJ0RmFsc2U+CisgICAgPGF1OmFzc2VydEZhbHNlPgorICAgICAgPGF2YWlsYWJsZSBmaWxlPSJ0YXJnZXRzZXRfMi50bXAiIC8+CisgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NyI+CisgICAgPHRvdWNoIGZpbGU9Im9sZGVyLnRtcCIgLz4KKyAgICA8ZGVwZW5kc2V0PgorICAgICAgPHNvdXJjZXM+CisgICAgICAgIDxwcm9wZXJ0eXJlc291cmNlIG5hbWU9InRoZXJlaXNub3N1Y2hwcm9wZXJ0eSIgLz4KKyAgICAgIDwvc291cmNlcz4KKyAgICAgIDx0YXJnZXRzPgorICAgICAgICA8ZmlsZWxpc3QgZGlyPSIuIiBmaWxlcz0ib2xkZXIudG1wIiAvPgorICAgICAgPC90YXJnZXRzPgorICAgIDwvZGVwZW5kc2V0PgorICAgIDxhdTphc3NlcnRGYWxzZT4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0ib2xkZXIudG1wIiAvPgorICAgIDwvYXU6YXNzZXJ0RmFsc2U+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdDgiPgorICAgIDx0b3VjaCBmaWxlPSJvbGRlci50bXAiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZvbyIgdmFsdWU9ImJhciIgLz4KKyAgICA8ZGVwZW5kc2V0PgorICAgICAgPHNvdXJjZXM+CisgICAgICAgIDxwcm9wZXJ0eXJlc291cmNlIG5hbWU9ImZvbyIgLz4KKyAgICAgIDwvc291cmNlcz4KKyAgICAgIDx0YXJnZXRzPgorICAgICAgICA8ZmlsZWxpc3QgZGlyPSIuIiBmaWxlcz0ib2xkZXIudG1wIiAvPgorICAgICAgPC90YXJnZXRzPgorICAgIDwvZGVwZW5kc2V0PgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGF2YWlsYWJsZSBmaWxlPSJvbGRlci50bXAiIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Q5Ij4KKyAgICA8YXU6YXNzZXJ0RmFsc2U+CisgICAgICA8YXZhaWxhYmxlIGZpbGU9InRlc3Q5ZGlyIiB0eXBlPSJkaXIiIC8+CisgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgICA8dG91Y2ggZmlsZT0idGVzdDkudG1wIiAvPgorICAgIDxkZXBlbmRzZXQ+CisgICAgICA8c3JjZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJ0ZXN0OS50bXAiIC8+CisgICAgICA8dGFyZ2V0ZmlsZXNldCBkaXI9InRlc3Q5ZGlyIiAvPgorICAgIDwvZGVwZW5kc2V0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlYXJEb3duIj4gCisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0NC50bXAiIC8+CisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0OS50bXAiIC8+CisgICAgPGRlbGV0ZSBmaWxlPSJvbGRlci50bXAiIC8+CisgICAgPGRlbGV0ZSBmaWxlPSJuZXdlci50bXAiIC8+CisgIAk8ZGVsZXRlIGZpbGU9InNvdXJjZXNldF8xLnRtcCIgLz4KKyAgIAk8ZGVsZXRlIGZpbGU9InNvdXJjZXNldF8yLnRtcCIgLz4KKyAgCTxkZWxldGUgZmlsZT0idGFyZ2V0c2V0XzEudG1wIiAvPgorICAJPGRlbGV0ZSBmaWxlPSJ0YXJnZXRzZXRfMi50bXAiIC8+CisgIAkKKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9kaXJuYW1lLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGlybmFtZS10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTM4ODUwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGlybmFtZS10ZXN0LnhtbApAQCAtMCwwICsxLDU5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJkaXJuYW1lLXRlc3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+DQorDQorICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiLz4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdDEiPg0KKyAgICA8YXU6ZXhwZWN0ZmFpbHVyZSBleHBlY3RlZG1lc3NhZ2U9InByb3BlcnR5IGF0dHJpYnV0ZSByZXF1aXJlZCI+DQorICAgICAgPGRpcm5hbWUvPg0KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdDIiPg0KKyAgICA8YXU6ZXhwZWN0ZmFpbHVyZSBleHBlY3RlZG1lc3NhZ2U9ImZpbGUgYXR0cmlidXRlIHJlcXVpcmVkIj4NCisgICAgICA8ZGlybmFtZSBwcm9wZXJ0eT0icHJvcG5hbWUiLz4NCisgICAgPC9hdTpleHBlY3RmYWlsdXJlPg0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3QzIj4NCisgICAgPGF1OmV4cGVjdGZhaWx1cmUgZXhwZWN0ZWRtZXNzYWdlPSJwcm9wZXJ0eSBhdHRyaWJ1dGUgcmVxdWlyZWQiPg0KKyAgICAgIDxkaXJuYW1lIGZpbGU9ImZpbGVuYW1lIi8+DQorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJpbml0LXRlc3Q0Ij4NCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmFsaWQub3MiPg0KKyAgICAgIDxhbmQ+DQorICAgICAgICA8bm90PjxvcyBmYW1pbHk9ImRvcyIvPjwvbm90Pjxub3Q+PG9zIGZhbWlseT0ibmV0d2FyZSIvPjwvbm90Pg0KKyAgICAgIDwvYW5kPg0KKyAgICA8L2NvbmRpdGlvbj4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0NCIgZGVwZW5kcz0iaW5pdC10ZXN0NCIgaWY9InZhbGlkLm9zIj4NCisgICAgPGRpcm5hbWUgcHJvcGVydHk9ImxvY2FsLmRpciIgZmlsZT0iL3Vzci9sb2NhbC9mb28udHh0Ii8+DQorICAgIDxhdTphc3NlcnRQcm9wZXJ0eUVxdWFscyBuYW1lPSJsb2NhbC5kaXIiIA0KKyAgICAgIHZhbHVlPSIke2ZpbGUuc2VwYXJhdG9yfXVzciR7ZmlsZS5zZXBhcmF0b3J9bG9jYWwiLz4NCisgIDwvdGFyZ2V0Pg0KKyAgDQorICA8dGFyZ2V0IG5hbWU9InRlc3Q1Ij4NCisgICAgPGRpcm5hbWUgcHJvcGVydHk9ImJhc2UuZGlyIiBmaWxlPSJmb28udHh0Ii8+DQorICAgIDxhdTphc3NlcnRQcm9wZXJ0eUVxdWFscyBuYW1lPSJiYXNlLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0iLz4NCisgIDwvdGFyZ2V0Pg0KKw0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9lY2hveG1sLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZWNob3htbC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjJmNGNiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZWNob3htbC10ZXN0LnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+DQorDQorICA8IS0tIG5vdGUgcmVsaWVzIG9uIGFudHVuaXQgYnVpbHQgZnJvbSBzdm4gdHJ1bmsgKDEuMS1hbHBoYSkgLS0+DQorICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiLz4NCisNCisgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPg0KKyAgPHByb3BlcnR5IG5hbWU9ImZpbGUiIGxvY2F0aW9uPSIke2phdmEuaW8udG1wZGlyfS9lY2hvZWQueG1sIi8+DQorICAgIDxlY2hveG1sIGZpbGU9IiR7ZmlsZX0iPg0KKyAgICAgIDxwcm9qZWN0Pg0KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvbyIgdmFsdWU9ImJhciIgLz4NCisgICAgICAgIDxmYWlsIG1lc3NhZ2U9IiQkJCR7Zm9vfT0kJHtmb299Ij4NCisgICAgICAgICAgPGNvbmRpdGlvbj4NCisgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIke211c3RmYWlsfSIgLz4NCisgICAgICAgICAgPC9jb25kaXRpb24+DQorICAgICAgICA8L2ZhaWw+DQorICAgICAgPC9wcm9qZWN0Pg0KKyAgICA8L2VjaG94bWw+DQorICA8L3RhcmdldD4NCisgIA0KKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+DQorICAgIDxkZWxldGUgZmlsZT0iJHtmaWxlfSIvPg0KKyAgPC90YXJnZXQ+ICANCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdFBhc3MiPg0KKyAgPGFudCBhbnRmaWxlPSIke2ZpbGV9Ii8+DQorICA8L3RhcmdldD4NCisgIA0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmFpbCI+DQorICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0iJHtmb299PWJhciIgbWVzc2FnZT0iU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiI+DQorICAgICAgPGFudCBhbnRmaWxlPSIke2ZpbGV9Ij4NCisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtdXN0ZmFpbCIgdmFsdWU9InRydWUiIC8+DQorICAgICAgPC9hbnQ+DQorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4NCisgIDwvdGFyZ2V0Pg0KKyAgDQorICA8dGFyZ2V0IG5hbWU9InRlc3RFbXB0eSI+DQorICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0iTm8gbmVzdGVkIFhNTCBzcGVjaWZpZWQiIG1lc3NhZ2U9IlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iPg0KKyAgICAgIDxlY2hveG1sIC8+DQorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4NCisgIDwvdGFyZ2V0Pg0KKyAgDQorICA8dGFyZ2V0IG5hbWU9InRlc3QtbnMiPiA8IS0tIGNvbW1lbnQgdGhpcyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgc3ZuIHRydW5rIG9mIGFudHVuaXQgLS0+DQorICAgIDxlY2hveG1sIGZpbGU9IiR7ZmlsZX0iIHhtbG5zOmE9ImFudGxpYjphIj4NCisgICAgICA8YTpzb21ldGhpbmcgLz4NCisgICAgPC9lY2hveG1sPg0KKyAgICA8YXU6YXNzZXJ0UmVzb3VyY2VDb250YWlucyByZXNvdXJjZT0iJHtmaWxlfSIgdmFsdWU9ImE6c29tZXRoaW5nIi8+DQorICA8L3RhcmdldD4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZXhlYy9hcHBseS10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvYXBwbHktdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTUyMTZiYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvYXBwbHktdGVzdC54bWwKQEAgLTAsMCArMSw3NDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iYXBwbHktdGVzdCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKyAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+CisgIDwhLS0gVU5JWCAtLT4KKyAgPGF2YWlsYWJsZSBmaWxlPSJzaCIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiBwcm9wZXJ0eT0ic2guZXhlY3V0YWJsZSIgLz4KKyAgPCEtLSBDWUdXSU4gLS0+CisgIDxhdmFpbGFibGUgZmlsZT0ic2guZXhlIiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIHByb3BlcnR5PSJzaC5leGUuZXhlY3V0YWJsZSIgLz4KKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGVzdC5jYW4ucnVuIj4KKyAgICA8b3I+CisgICAgICA8aXNzZXQgcHJvcGVydHk9InNoLmV4ZWN1dGFibGUiIC8+CisgICAgICA8aXNzZXQgcHJvcGVydHk9InNoLmV4ZS5leGVjdXRhYmxlIiAvPgorICAgIDwvb3I+CisgIDwvY29uZGl0aW9uPgorICA8IS0tIFVOSVggLS0+CisgIDxhdmFpbGFibGUgZmlsZT0ic2VkIiBmaWxlcGF0aD0iJHtlbnYuUEFUSH0iIHByb3BlcnR5PSJzZWQuZXhlY3V0YWJsZSIgLz4KKyAgPCEtLSBDWUdXSU4gLS0+CisgIDxhdmFpbGFibGUgZmlsZT0ic2VkLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiBwcm9wZXJ0eT0ic2VkLmV4ZS5leGVjdXRhYmxlIiAvPgorICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzZWQuY2FuLnJ1biI+CisgICAgPG9yPgorICAgICAgPGlzc2V0IHByb3BlcnR5PSJzZWQuZXhlY3V0YWJsZSIgLz4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0ic2VkLmV4ZS5leGVjdXRhYmxlIiAvPgorICAgIDwvb3I+CisgIDwvY29uZGl0aW9uPgorICA8IS0tIFVOSVggLS0+CisgIDxhdmFpbGFibGUgZmlsZT0iZWNobyIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiBwcm9wZXJ0eT0iZWNoby5leGVjdXRhYmxlIiAvPgorICA8IS0tIENZR1dJTiAtLT4KKyAgPGF2YWlsYWJsZSBmaWxlPSJlY2hvLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiBwcm9wZXJ0eT0iZWNoby5leGUuZXhlY3V0YWJsZSIgLz4KKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZWNoby5jYW4ucnVuIj4KKyAgICA8b3I+CisgICAgICA8aXNzZXQgcHJvcGVydHk9ImVjaG8uZXhlY3V0YWJsZSIgLz4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0iZWNoby5leGUuZXhlY3V0YWJsZSIgLz4KKyAgICA8L29yPgorICA8L2NvbmRpdGlvbj4KKworICA8IS0tIFVOSVggLS0+CisgIDxhdmFpbGFibGUgZmlsZT0ibHMiIGZpbGVwYXRoPSIke2Vudi5QQVRIfSIgcHJvcGVydHk9ImxzLmV4ZWN1dGFibGUiIC8+CisgIDwhLS0gQ1lHV0lOIC0tPgorICA8YXZhaWxhYmxlIGZpbGU9ImxzLmV4ZSIgZmlsZXBhdGg9IiR7ZW52LlBBVEh9IiBwcm9wZXJ0eT0ibHMuZXhlLmV4ZWN1dGFibGUiIC8+CisgIDwhLS0gcGlnZ3liYWNrIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGhlcmUgLS0+CisgIDxjb25kaXRpb24gcHJvcGVydHk9ImxzLmNhbi5ydW4iIHZhbHVlPSJscyI+CisgICAgPGlzc2V0IHByb3BlcnR5PSJscy5leGVjdXRhYmxlIiAvPgorICA8L2NvbmRpdGlvbj4KKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibHMuY2FuLnJ1biIgdmFsdWU9ImxzLmV4ZSI+CisgICAgPGlzc2V0IHByb3BlcnR5PSJscy5leGUuZXhlY3V0YWJsZSIgLz4KKyAgPC9jb25kaXRpb24+CisKKyAgPHByb3BlcnR5IG5hbWU9ImVvbCIgdmFsdWU9IiR7bGluZS5zZXBhcmF0b3J9IiAvPgorCisgIDxtYWNyb2RlZiBuYW1lPSJyY2F0Ij4KKyAgICA8YXR0cmlidXRlIG5hbWU9InJlZmlkIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGVjaG8+QEB7cmVmaWR9PUB7cmVmaWR9PC9lY2hvPgorICAgICAgPGNvbmNhdD48cmVzb3VyY2VzIHJlZmlkPSJAe3JlZmlkfSIgLz48L2NvbmNhdD4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPG1hY3JvZGVmIG5hbWU9ImFzc2VydEVtcHR5RmlsZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGF1OmFzc2VydFRydWU+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJAe2ZpbGV9IiB0eXBlPSJmaWxlIiAvPgorICAgICAgICAgIDxsZW5ndGggbGVuZ3RoPSIwIiBmaWxlPSJAe2ZpbGV9IiAvPgorICAgICAgICA8L2FuZD4KKyAgICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHRhcmdldCBuYW1lPSJ4eXoiPgorICAgIDxlY2hvIGZpbGU9IngiPnMveC9ibGFoL2cke2VvbH08L2VjaG8+CisgICAgPGVjaG8gZmlsZT0ieSI+cy95L2JsYWgvZyR7ZW9sfTwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSJ6Ij5zL3ovYmxhaC9nJHtlb2x9PC9lY2hvPgorICAgIDxmaWxlc2V0IGlkPSJ4eXoiIGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9IngseSx6IiAvPgorICAgIDxmaWxlbGlzdCBpZD0ieHl6bGlzdCIgZGlyPSIke2Jhc2VkaXJ9IiBmaWxlcz0ieCx5LHoiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9IngiIGxvY2F0aW9uPSJ4IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ5IiBsb2NhdGlvbj0ieSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ieiIgbG9jYXRpb249InoiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vUmVkaXJlY3QiIGRlcGVuZHM9Inh5eiIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgPGFwcGx5IGV4ZWN1dGFibGU9InNoIj4KKyAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIgLz4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJ4eXoiIC8+CisgICAgPC9hcHBseT4KKworICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSIke3h9IG91dCIgLz4KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iJHt5fSBvdXQiIC8+CisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IiR7en0gb3V0IiAvPgorICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSIke3h9IGVyciIgLz4KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iJHt5fSBlcnIiIC8+CisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IiR7en0gZXJyIiAvPgorCisgICAgPCEtLQorCisgICAgVGhlIG9yaWdpbmFsIGp1bml0IHRlc3QgYWxzbyB2ZXJpZmllZCB0aGF0IHggb3V0IGhhcHBlbmVkIGJlZm9yZQorICAgIHkgb3V0LCBhbmQgeSBvdXQgaGFwcGVuZWQgYmVmb3JlIHogb3V0OyBsaWtld2lzZSB3aXRoIGVyciBvdXRwdXQuCisgICAgSSBhZGRlZCB0aGUgYW50dW5pdDpsb2djb250ZW50IHJlc291cmNlIGhvcGluZyB0aGF0IHdvdWxkIGhlbHAsCisgICAgYnV0IEkgdGhpbmsgd2UgbmVlZCBhIHdheSB0byBmaWx0ZXIgKGNvcHkpIHJlc291cmNlcyBmaXJzdC4KKyAgICBUSEFUIG5lY2Vzc2l0YXRlcyB0aGUgc3RyaW5nLXRvLXJlc291cmNlIGNvZGluZyB3ZSBhcmUgY3VycmVudGx5CisgICAgZGlzY3Vzc2luZyBvbiB0aGUgZGV2IGxpc3QgSU1PLiAgTUpCLCA5LzIyLzIwMDYKKworICAgIC0tPgorCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0MSIgZGVwZW5kcz0ieHl6IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2giIG91dHB1dD0icmVkaXJlY3Qub3V0IiBhcHBlbmQ9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0icGFycm90LnNoIiAvPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9Inh5eiIgLz4KKyAgICA8L2FwcGx5PgorCisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMSI+CisgICAgICAgIDxyZXN0cmljdCBpZD0icmVzdWx0cyI+CisgICAgICAgICAgPGZpbGUgZmlsZT0icmVkaXJlY3Qub3V0IiAvPgorICAgICAgICAgIDxhbmQgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIj4KKyAgICAgICAgICAgIDxjb250YWlucyB0ZXh0PSIke3h9IG91dCIgLz4KKyAgICAgICAgICAgIDxjb250YWlucyB0ZXh0PSIke3l9IG91dCIgLz4KKyAgICAgICAgICAgIDxjb250YWlucyB0ZXh0PSIke3p9IG91dCIgLz4KKyAgICAgICAgICAgIDxjb250YWlucyB0ZXh0PSIke3h9IGVyciIgLz4KKyAgICAgICAgICAgIDxjb250YWlucyB0ZXh0PSIke3l9IGVyciIgLz4KKyAgICAgICAgICAgIDxjb250YWlucyB0ZXh0PSIke3p9IGVyciIgLz4KKyAgICAgICAgICA8L2FuZD4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVkaXJlY3QyIiBkZXBlbmRzPSJ4eXoiIGlmPSJ0ZXN0LmNhbi5ydW4iPgorICAgIDxhcHBseSBleGVjdXRhYmxlPSJzaCIgb3V0cHV0PSJyZWRpcmVjdC5vdXQiCisgICAgICAgICAgIGVycm9yPSJyZWRpcmVjdC5lcnIiIGFwcGVuZD0idHJ1ZSI+CisgICAgICA8YXJnIHZhbHVlPSJwYXJyb3Quc2giIC8+CisgICAgICA8ZmlsZXNldCByZWZpZD0ieHl6IiAvPgorICAgIDwvYXBwbHk+CisKKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxyZXNvdXJjZXNtYXRjaCBhc3RleHQ9InRydWUiPgorICAgICAgICAgIDxzdHJpbmcgdmFsdWU9IiR7eH0gb3V0JHtlb2x9JHt5fSBvdXQke2VvbH0ke3p9IG91dCIgLz4KKyAgICAgICAgICA8ZmlsZSBmaWxlPSJyZWRpcmVjdC5vdXQiIC8+CisgICAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgICAgIDxyZXNvdXJjZXNtYXRjaCBhc3RleHQ9InRydWUiPgorICAgICAgICAgIDxzdHJpbmcgdmFsdWU9IiR7eH0gZXJyJHtlb2x9JHt5fSBlcnIke2VvbH0ke3p9IGVyciIgLz4KKyAgICAgICAgICA8ZmlsZSBmaWxlPSJyZWRpcmVjdC5lcnIiIC8+CisgICAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0MyIgZGVwZW5kcz0ieHl6IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2giIGxvZ2Vycm9yPSJ0cnVlIiBhcHBlbmQ9InRydWUiCisgICAgICAgICAgIG91dHB1dD0icmVkaXJlY3Qub3V0IiBvdXRwdXRwcm9wZXJ0eT0icmVkaXJlY3QzLm91dCI+CisgICAgICA8YXJnIHZhbHVlPSJwYXJyb3Quc2giIC8+CisgICAgICA8ZmlsZXNldCByZWZpZD0ieHl6IiAvPgorICAgIDwvYXBwbHk+CisKKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZXNtYXRjaCBhc3RleHQ9InRydWUiPgorICAgICAgICA8c3RyaW5nIHZhbHVlPSIke3h9IG91dCR7ZW9sfSR7eX0gb3V0JHtlb2x9JHt6fSBvdXQiIC8+CisgICAgICAgIDxmaWxlIGZpbGU9InJlZGlyZWN0Lm91dCIgLz4KKyAgICAgICAgPHByb3BlcnR5cmVzb3VyY2UgbmFtZT0icmVkaXJlY3QzLm91dCIgLz4KKyAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgPC9hdTphc3NlcnRUcnVlPgorCisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IiR7eH0gZXJyIiAvPgorICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSIke3l9IGVyciIgLz4KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iJHt6fSBlcnIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0NCIgZGVwZW5kcz0ieHl6IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2giIGFwcGVuZD0idHJ1ZSIKKyAgICAgICAgICAgZXJyb3I9InJlZGlyZWN0LmVyciIgZXJyb3Jwcm9wZXJ0eT0icmVkaXJlY3Q0LmVyciIKKyAgICAgICAgICAgb3V0cHV0PSJyZWRpcmVjdC5vdXQiIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdDQub3V0Ij4KKyAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIgLz4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJ4eXoiIC8+CisgICAgPC9hcHBseT4KKworICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGFuZD4KKyAgICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iJHt4fSBvdXQke2VvbH0ke3l9IG91dCR7ZW9sfSR7en0gb3V0IiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9InJlZGlyZWN0Lm91dCIgLz4KKyAgICAgICAgICA8cHJvcGVydHlyZXNvdXJjZSBuYW1lPSJyZWRpcmVjdDQub3V0IiAvPgorICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSIke3h9IGVyciR7ZW9sfSR7eX0gZXJyJHtlb2x9JHt6fSBlcnIiIC8+CisgICAgICAgICAgPGZpbGUgZmlsZT0icmVkaXJlY3QuZXJyIiAvPgorICAgICAgICAgIDxwcm9wZXJ0eXJlc291cmNlIG5hbWU9InJlZGlyZWN0NC5lcnIiIC8+CisgICAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0NSIgZGVwZW5kcz0ieHl6IiBpZj0ic2VkLmNhbi5ydW4iPgorICAgIDxhcHBseSBleGVjdXRhYmxlPSJzZWQiIGlucHV0c3RyaW5nPSJ4IHkgeiR7ZW9sfSIgYXBwZW5kPSJ0cnVlIgorICAgICAgICAgICBlcnJvcj0icmVkaXJlY3QuZXJyIiBlcnJvcnByb3BlcnR5PSJyZWRpcmVjdDUuZXJyIgorICAgICAgICAgICBvdXRwdXQ9InJlZGlyZWN0Lm91dCIgb3V0cHV0cHJvcGVydHk9InJlZGlyZWN0NS5vdXQiPgorICAgICAgPGFyZyB2YWx1ZT0iLWYiIC8+CisgICAgICA8ZmlsZXNldCByZWZpZD0ieHl6IiAvPgorICAgIDwvYXBwbHk+CisKKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxyZXNvdXJjZXNtYXRjaCBhc3RleHQ9InRydWUiPgorICAgICAgICAgIDxwcm9wZXJ0eXJlc291cmNlIG5hbWU9InJlZGlyZWN0NS5vdXQiIC8+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmxhaCB5IHoke2VvbH14IGJsYWggeiR7ZW9sfXggeSBibGFoIiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9InJlZGlyZWN0Lm91dCIgLz4KKyAgICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3JlZGlyZWN0NS5lcnJ9IiBhcmcyPSIiIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgICAgPGFzc2VydEVtcHR5RmlsZSBmaWxlPSJyZWRpcmVjdC5lcnIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0NiIgZGVwZW5kcz0ieHl6IiBpZj0ic2VkLmNhbi5ydW4iPgorICAgIDxlY2hvIGZpbGU9InJlZGlyZWN0LmluIj54IHkgeiR7ZW9sfTwvZWNobz4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2VkIiBpbnB1dD0icmVkaXJlY3QuaW4iIGFwcGVuZD0idHJ1ZSIKKyAgICAgICAgICAgZXJyb3I9InJlZGlyZWN0LmVyciIgZXJyb3Jwcm9wZXJ0eT0icmVkaXJlY3Q2LmVyciIKKyAgICAgICAgICAgb3V0cHV0PSJyZWRpcmVjdC5vdXQiIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdDYub3V0Ij4KKyAgICAgIDxhcmcgdmFsdWU9Ii1mIiAvPgorICAgICAgPGZpbGVsaXN0IHJlZmlkPSJ4eXpsaXN0IiAvPgorICAgIDwvYXBwbHk+CisKKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxyZXNvdXJjZXNtYXRjaCBhc3RleHQ9InRydWUiPgorICAgICAgICAgIDxwcm9wZXJ0eXJlc291cmNlIG5hbWU9InJlZGlyZWN0Ni5vdXQiIC8+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmxhaCB5IHoke2VvbH14IGJsYWggeiR7ZW9sfXggeSBibGFoIiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9InJlZGlyZWN0Lm91dCIgLz4KKyAgICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3JlZGlyZWN0Ni5lcnJ9IiBhcmcyPSIiIC8+CisgICAgICAgIDxsZW5ndGggbGVuZ3RoPSIwIj48ZmlsZSBmaWxlPSJyZWRpcmVjdC5lcnIiIC8+PC9sZW5ndGg+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0NyIgZGVwZW5kcz0ieHl6IiBpZj0ic2VkLmNhbi5ydW4iPgorICAgIDxhcHBseSBleGVjdXRhYmxlPSJzZWQiIGlucHV0c3RyaW5nPSJ4IHkgeiR7ZW9sfSIKKyAgICAgICAgICAgZXJyb3I9InJlZGlyZWN0LmVyciIgb3V0cHV0PSJyZWRpcmVjdC5vdXQiCisgICAgICAgICAgIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdDcub3V0Ij4KKyAgICAgIDxhcmcgdmFsdWU9Ii1mIiAvPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9Inh5eiIgLz4KKyAgICA8L2FwcGx5PgorCisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YW5kPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7cmVkaXJlY3Q3Lm91dH0iIGFyZzI9ImJsYWggeSB6IiAvPgorICAgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgICA8ZmlsZSBmaWxlPSJyZWRpcmVjdC5vdXQiIC8+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0ieCB5IGJsYWgiIC8+CisgICAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgICAgPGFzc2VydEVtcHR5RmlsZSBmaWxlPSJyZWRpcmVjdC5lcnIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0b3IxIiBkZXNjcmlwdGlvbj0iZmFpbCIKKyAgICAgICAgICBkZXBlbmRzPSJ4eXoiIGlmPSJ0ZXN0LmNhbi5ydW4iPgorICAgIDxhdTpleHBlY3RmYWlsdXJlCisgICAgICAgICAgICBleHBlY3RlZG1lc3NhZ2U9ImNhbm5vdCBoYXZlICZndDsgMSBuZXN0ZWQgJmx0O3JlZGlyZWN0b3ImZ3Q7cyI+CisgICAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2giPgorICAgICAgICA8YXJnIHZhbHVlPSJwYXJyb3Quc2giIC8+CisgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJ4eXoiIC8+CisgICAgICAgIDxyZWRpcmVjdG9yIG91dHB1dD0icmVkaXJlY3Rvci5vdXQiIC8+CisgICAgICAgIDxyZWRpcmVjdG9yIG91dHB1dD0id2hvY2FyZXMiIC8+CisgICAgICA8L2FwcGx5PgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVkaXJlY3RvcjIiIGRlcGVuZHM9Inh5eiIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgPGFwcGx5IGV4ZWN1dGFibGU9InNoIj4KKyAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIgLz4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJ4eXoiIC8+CisgICAgICA8cmVkaXJlY3RvciBvdXRwdXQ9InJlZGlyZWN0b3Iub3V0IiBhcHBlbmQ9InRydWUiIC8+CisgICAgPC9hcHBseT4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KKyAgICAgICAgPHJlc3RyaWN0IGlkPSJyZXN1bHRzIj4KKyAgICAgICAgICA8ZmlsZSBmaWxlPSJyZWRpcmVjdG9yLm91dCIgLz4KKyAgICAgICAgICA8YW5kIHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyI+CisgICAgICAgICAgICA8Y29udGFpbnMgdGV4dD0iJHt4fSBvdXQiIC8+CisgICAgICAgICAgICA8Y29udGFpbnMgdGV4dD0iJHt5fSBvdXQiIC8+CisgICAgICAgICAgICA8Y29udGFpbnMgdGV4dD0iJHt6fSBvdXQiIC8+CisgICAgICAgICAgICA8Y29udGFpbnMgdGV4dD0iJHt4fSBlcnIiIC8+CisgICAgICAgICAgICA8Y29udGFpbnMgdGV4dD0iJHt5fSBlcnIiIC8+CisgICAgICAgICAgICA8Y29udGFpbnMgdGV4dD0iJHt6fSBlcnIiIC8+CisgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZWRpcmVjdG9yMyIgZGVwZW5kcz0ieHl6IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2giPgorICAgICAgPGFyZyB2YWx1ZT0icGFycm90LnNoIiAvPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9Inh5eiIgLz4KKyAgICAgIDxyZWRpcmVjdG9yIGFwcGVuZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIG91dHB1dD0icmVkaXJlY3Rvci5vdXQiIGVycm9yPSJyZWRpcmVjdG9yLmVyciIgLz4KKyAgICA8L2FwcGx5PgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGFuZD4KKyAgICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iJHt4fSBvdXQke2VvbH0ke3l9IG91dCR7ZW9sfSR7en0gb3V0IiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSIke3h9IGVyciR7ZW9sfSR7eX0gZXJyJHtlb2x9JHt6fSBlcnIiIC8+CisgICAgICAgICAgPGZpbGUgZmlsZT0icmVkaXJlY3Rvci5lcnIiIC8+CisgICAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0b3I0IiBkZXBlbmRzPSJ4eXoiIGlmPSJ0ZXN0LmNhbi5ydW4iPgorICAgIDxhcHBseSBleGVjdXRhYmxlPSJzaCI+CisgICAgICA8YXJnIHZhbHVlPSJwYXJyb3Quc2giIC8+CisgICAgICA8ZmlsZXNldCByZWZpZD0ieHl6IiAvPgorICAgICAgPHJlZGlyZWN0b3Igb3V0cHV0PSJyZWRpcmVjdG9yLm91dCIgbG9nZXJyb3I9InRydWUiCisgICAgICAgICAgICAgICAgICBhcHBlbmQ9InRydWUiIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdG9yNC5vdXQiIC8+CisgICAgPC9hcHBseT4KKworICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgIDxzdHJpbmcgdmFsdWU9IiR7eH0gb3V0JHtlb2x9JHt5fSBvdXQke2VvbH0ke3p9IG91dCIgLz4KKyAgICAgICAgPGZpbGUgZmlsZT0icmVkaXJlY3Rvci5vdXQiIC8+CisgICAgICAgIDxwcm9wZXJ0eXJlc291cmNlIG5hbWU9InJlZGlyZWN0b3I0Lm91dCIgLz4KKyAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgPC9hdTphc3NlcnRUcnVlPgorCisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IiR7eH0gZXJyIiAvPgorICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSIke3l9IGVyciIgLz4KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iJHt6fSBlcnIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0b3I1IiBkZXBlbmRzPSJ4eXoiIGlmPSJ0ZXN0LmNhbi5ydW4iPgorICAgIDxhcHBseSBleGVjdXRhYmxlPSJzaCI+CisgICAgICA8cmVkaXJlY3RvciBlcnJvcj0icmVkaXJlY3Rvci5lcnIiIGVycm9ycHJvcGVydHk9InJlZGlyZWN0b3I1LmVyciIKKyAgICAgICAgICAgICAgICAgIG91dHB1dD0icmVkaXJlY3Rvci5vdXQiIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdG9yNS5vdXQiCisgICAgICAgICAgICAgICAgICBhcHBlbmQ9InRydWUiIC8+CisgICAgICA8YXJnIHZhbHVlPSJwYXJyb3Quc2giIC8+CisgICAgICA8ZmlsZXNldCByZWZpZD0ieHl6IiAvPgorICAgIDwvYXBwbHk+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YW5kPgorICAgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSIke3h9IG91dCR7ZW9sfSR7eX0gb3V0JHtlb2x9JHt6fSBvdXQiIC8+CisgICAgICAgICAgPGZpbGUgZmlsZT0icmVkaXJlY3Rvci5vdXQiIC8+CisgICAgICAgICAgPHByb3BlcnR5cmVzb3VyY2UgbmFtZT0icmVkaXJlY3RvcjUub3V0IiAvPgorICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSIke3h9IGVyciR7ZW9sfSR7eX0gZXJyJHtlb2x9JHt6fSBlcnIiIC8+CisgICAgICAgICAgPGZpbGUgZmlsZT0icmVkaXJlY3Rvci5lcnIiIC8+CisgICAgICAgICAgPHByb3BlcnR5cmVzb3VyY2UgbmFtZT0icmVkaXJlY3RvcjUuZXJyIiAvPgorICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgPC9hbmQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZWRpcmVjdG9yNiIgZGVwZW5kcz0ieHl6IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2giPgorICAgICAgPHJlZGlyZWN0b3IgYXBwZW5kPSJ0cnVlIiBvdXRwdXRwcm9wZXJ0eT0icmVkaXJlY3RvcjYub3V0IgorICAgICAgICAgICAgICAgICAgZXJyb3Jwcm9wZXJ0eT0icmVkaXJlY3RvcjYuZXJyIj4KKyAgICAgICAgPG91dHB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICA8ZXJyb3JtYXBwZXIgdHlwZT0ibWVyZ2UiIHRvPSJyZWRpcmVjdG9yLmVyciIgLz4KKyAgICAgIDwvcmVkaXJlY3Rvcj4KKyAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIgLz4KKyAgICAgIDxmaWxlbGlzdCByZWZpZD0ieHl6bGlzdCIgLz4KKyAgICA8L2FwcGx5PgorCisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YW5kPgorICAgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSIke3h9IG91dCR7ZW9sfSR7eX0gb3V0JHtlb2x9JHt6fSBvdXQiIC8+CisgICAgICAgICAgPGZpbGUgZmlsZT0icmVkaXJlY3Rvci5vdXQiIC8+CisgICAgICAgICAgPHByb3BlcnR5cmVzb3VyY2UgbmFtZT0icmVkaXJlY3RvcjYub3V0IiAvPgorICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSIke3h9IGVyciR7ZW9sfSR7eX0gZXJyJHtlb2x9JHt6fSBlcnIiIC8+CisgICAgICAgICAgPGZpbGUgZmlsZT0icmVkaXJlY3Rvci5lcnIiIC8+CisgICAgICAgICAgPHByb3BlcnR5cmVzb3VyY2UgbmFtZT0icmVkaXJlY3RvcjYuZXJyIiAvPgorICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgPC9hbmQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZWRpcmVjdG9yNyIgZGVwZW5kcz0ieHl6IiBpZj0idGVzdC5jYW4ucnVuIj4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2giPgorICAgICAgPHJlZGlyZWN0b3IgYXBwZW5kPSJ0cnVlIiBvdXRwdXRwcm9wZXJ0eT0icmVkaXJlY3Rvcjcub3V0IgorICAgICAgICAgICAgICAgICAgZXJyb3Jwcm9wZXJ0eT0icmVkaXJlY3RvcjcuZXJyIj4KKyAgICAgICAgPG91dHB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICA8ZXJyb3JtYXBwZXIgdHlwZT0ibWVyZ2UiIHRvPSJyZWRpcmVjdG9yLmVyciIgLz4KKyAgICAgICAgPGVycm9yZmlsdGVyY2hhaW4+CisgICAgICAgICAgPHJlcGxhY2VzdHJpbmcgZnJvbT0iZXJyIiB0bz0iRVJST1IhISEiIC8+CisgICAgICAgIDwvZXJyb3JmaWx0ZXJjaGFpbj4KKyAgICAgIDwvcmVkaXJlY3Rvcj4KKyAgICAgIDxhcmcgdmFsdWU9InBhcnJvdC5zaCIgLz4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJ4eXoiIC8+CisgICAgPC9hcHBseT4KKworICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGFuZD4KKyAgICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iJHt4fSBvdXQke2VvbH0ke3l9IG91dCR7ZW9sfSR7en0gb3V0IiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICAgIDxwcm9wZXJ0eXJlc291cmNlIG5hbWU9InJlZGlyZWN0b3I3Lm91dCIgLz4KKyAgICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iJHt4fSBFUlJPUiEhISR7ZW9sfSR7eX0gRVJST1IhISEke2VvbH0ke3p9IEVSUk9SISEhIiAvPgorICAgICAgICAgIDxmaWxlIGZpbGU9InJlZGlyZWN0b3IuZXJyIiAvPgorICAgICAgICAgIDxwcm9wZXJ0eXJlc291cmNlIG5hbWU9InJlZGlyZWN0b3I3LmVyciIgLz4KKyAgICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICAgIDwvYW5kPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVkaXJlY3RvcjgiIGRlcGVuZHM9Inh5eiIgaWY9InNlZC5jYW4ucnVuIj4KKyAgICA8ZWNobyBmaWxlPSJyZWRpcmVjdG9yLmluIj54IHkgeiR7ZW9sfTwvZWNobz4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2VkIj4KKyAgICAgIDxyZWRpcmVjdG9yIGFwcGVuZD0idHJ1ZSIgb3V0cHV0cHJvcGVydHk9InJlZGlyZWN0b3I4Lm91dCIKKyAgICAgICAgICAgICAgICAgIGVycm9ycHJvcGVydHk9InJlZGlyZWN0b3I4LmVyciI+CisgICAgICAgIDxpbnB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuaW4iIC8+CisgICAgICAgIDxvdXRwdXRtYXBwZXIgdHlwZT0ibWVyZ2UiIHRvPSJyZWRpcmVjdG9yLm91dCIgLz4KKyAgICAgICAgPGVycm9ybWFwcGVyIHR5cGU9Im1lcmdlIiB0bz0icmVkaXJlY3Rvci5lcnIiIC8+CisgICAgICA8L3JlZGlyZWN0b3I+CisgICAgICA8YXJnIHZhbHVlPSItZiIgLz4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJ4eXoiIC8+CisgICAgPC9hcHBseT4KKworICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGFuZD4KKyAgICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgICAgPHByb3BlcnR5cmVzb3VyY2UgbmFtZT0icmVkaXJlY3Rvcjgub3V0IiAvPgorICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJsYWggeSB6JHtlb2x9eCBibGFoIHoke2VvbH14IHkgYmxhaCIgLz4KKyAgICAgICAgICA8ZmlsZSBmaWxlPSJyZWRpcmVjdG9yLm91dCIgLz4KKyAgICAgICAgPC9yZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3JlZGlyZWN0b3I4LmVycn0iIGFyZzI9IiIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8YXNzZXJ0RW1wdHlGaWxlIGZpbGU9InJlZGlyZWN0b3IuZXJyIiAvPgorICA8L3RhcmdldD4KKworICA8bWFjcm9kZWYgbmFtZT0idmFsUm9yOS0xMiI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGF1OmFzc2VydFRydWU+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIiIGFyZzI9IiR7cmVkaXJlY3RvckB7bn0uZXJyfSIgLz4KKyAgICAgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmxhaCBhZnRlciB5IGFmdGVyIHoke2VvbH14IGFmdGVyIGJsYWggYWZ0ZXIgeiR7ZW9sfXggYWZ0ZXIgeSBhZnRlciBibGFoIiAvPgorICAgICAgICAgICA8cHJvcGVydHlyZXNvdXJjZSBuYW1lPSJyZWRpcmVjdG9yQHtufS5vdXQiIC8+CisgICAgICAgICAgIDxmaWxlIGZpbGU9InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgICAgIDwvYW5kPgorICAgICAgPC9hdTphc3NlcnRUcnVlPgorICAgICAgPGFzc2VydEVtcHR5RmlsZSBmaWxlPSJyZWRpcmVjdG9yLmVyciIgLz4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVkaXJlY3RvcjkiIGRlcGVuZHM9Inh5eiIgaWY9InNlZC5jYW4ucnVuIj4KKyAgICA8ZWNobyBmaWxlPSJyZWRpcmVjdG9yLmluIj54IGJlZm9yZSB5IGJlZm9yZSB6JHtlb2x9PC9lY2hvPgorICAgIDxhcHBseSBleGVjdXRhYmxlPSJzZWQiPgorICAgICAgPHJlZGlyZWN0b3Igb3V0cHV0cHJvcGVydHk9InJlZGlyZWN0b3I5Lm91dCIKKyAgICAgICAgICAgICAgICAgIGVycm9ycHJvcGVydHk9InJlZGlyZWN0b3I5LmVyciIgYXBwZW5kPSJ0cnVlIj4KKyAgICAgICAgPGlucHV0ZmlsdGVyY2hhaW4+CisgICAgICAgICAgPHJlcGxhY2VzdHJpbmcgZnJvbT0iYmVmb3JlIiB0bz0iYWZ0ZXIiIC8+CisgICAgICAgIDwvaW5wdXRmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGlucHV0bWFwcGVyIHR5cGU9Im1lcmdlIiB0bz0icmVkaXJlY3Rvci5pbiIgLz4KKyAgICAgICAgPG91dHB1dG1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3Iub3V0IiAvPgorICAgICAgICA8ZXJyb3JtYXBwZXIgdHlwZT0ibWVyZ2UiIHRvPSJyZWRpcmVjdG9yLmVyciIgLz4KKyAgICAgIDwvcmVkaXJlY3Rvcj4KKyAgICAgIDxhcmcgdmFsdWU9Ii1mIiAvPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9Inh5eiIgLz4KKyAgICA8L2FwcGx5PgorCisgICAgPHZhbFJvcjktMTIgbj0iOSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVkaXJlY3RvcjEwIiBkZXBlbmRzPSJ4eXoiIGlmPSJzZWQuY2FuLnJ1biI+CisgICAgPGVjaG8gZmlsZT0icmVkaXJlY3Rvci5pbiI+eCBiZWZvcmUgeSBiZWZvcmUgeiR7ZW9sfTwvZWNobz4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2VkIj4KKyAgICAgIDxyZWRpcmVjdG9yIG91dHB1dHByb3BlcnR5PSJyZWRpcmVjdG9yMTAub3V0IgorICAgICAgICAgICAgICAgICAgZXJyb3Jwcm9wZXJ0eT0icmVkaXJlY3RvcjEwLmVyciIgYXBwZW5kPSJ0cnVlIj4KKyAgICAgICAgPG91dHB1dGZpbHRlcmNoYWluPgorICAgICAgICAgIDxyZXBsYWNlc3RyaW5nIGZyb209ImJlZm9yZSIgdG89ImFmdGVyIiAvPgorICAgICAgICA8L291dHB1dGZpbHRlcmNoYWluPgorICAgICAgICA8b3V0cHV0bWFwcGVyIHR5cGU9Im1lcmdlIiB0bz0icmVkaXJlY3Rvci5vdXQiIC8+CisgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuZXJyIiAvPgorICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgPGFyZyB2YWx1ZT0iLWYiIC8+CisgICAgICA8c3JjZmlsZSAvPgorICAgICAgPGFyZyB2YWx1ZT0icmVkaXJlY3Rvci5pbiIgLz4KKyAgICAgIDxmaWxlbGlzdCByZWZpZD0ieHl6bGlzdCIgLz4KKyAgICA8L2FwcGx5PgorCisgICAgPHZhbFJvcjktMTIgbj0iMTAiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0b3IxMSIgZGVwZW5kcz0ieHl6IiBpZj0ic2VkLmNhbi5ydW4iPgorICAgIDxhcHBseSBleGVjdXRhYmxlPSJzZWQiPgorICAgICAgPHJlZGlyZWN0b3Igb3V0cHV0cHJvcGVydHk9InJlZGlyZWN0b3IxMS5vdXQiCisgICAgICAgICAgICAgICAgICBlcnJvcnByb3BlcnR5PSJyZWRpcmVjdG9yMTEuZXJyIgorICAgICAgICAgICAgICAgICAgaW5wdXRzdHJpbmc9InggYmVmb3JlIHkgYmVmb3JlIHoke2VvbH0iCisgICAgICAgICAgICAgICAgICBhcHBlbmQ9InRydWUiPgorICAgICAgICA8aW5wdXRmaWx0ZXJjaGFpbj4KKyAgICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJiZWZvcmUiIHRvPSJhZnRlciIgLz4KKyAgICAgICAgPC9pbnB1dGZpbHRlcmNoYWluPgorICAgICAgICA8b3V0cHV0bWFwcGVyIHR5cGU9Im1lcmdlIiB0bz0icmVkaXJlY3Rvci5vdXQiIC8+CisgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJtZXJnZSIgdG89InJlZGlyZWN0b3IuZXJyIiAvPgorICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgPGFyZyB2YWx1ZT0iLWYiIC8+CisgICAgICA8ZmlsZXNldCByZWZpZD0ieHl6IiAvPgorICAgIDwvYXBwbHk+CisKKyAgICA8dmFsUm9yOS0xMiBuPSIxMSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVkaXJlY3RvcjEyIiBkZXBlbmRzPSJ4eXoiIGlmPSJzZWQuY2FuLnJ1biI+CisgICAgPGVjaG8gZmlsZT0icmVkaXJlY3Rvci5pbiI+eCBiZWZvcmUgeSBiZWZvcmUgeiR7ZW9sfTwvZWNobz4KKyAgICA8YXBwbHkgZXhlY3V0YWJsZT0ic2VkIiBvdXRwdXQ9InJlZGlyZWN0b3Iub3V0IiBlcnJvcj0icmVkaXJlY3Rvci5lcnIiPgorICAgICAgPHJlZGlyZWN0b3Igb3V0cHV0cHJvcGVydHk9InJlZGlyZWN0b3IxMi5vdXQiCisgICAgICAgICAgICAgICAgICBlcnJvcnByb3BlcnR5PSJyZWRpcmVjdG9yMTIuZXJyIiBhcHBlbmQ9InRydWUiPgorICAgICAgICA8b3V0cHV0ZmlsdGVyY2hhaW4+CisgICAgICAgICAgPHJlcGxhY2VzdHJpbmcgZnJvbT0iYmVmb3JlIiB0bz0iYWZ0ZXIiIC8+CisgICAgICAgIDwvb3V0cHV0ZmlsdGVyY2hhaW4+CisgICAgICAgIDxvdXRwdXRtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0ibm9tYXRjaCIgdG89Im5vbWF0Y2hvdXQiIC8+CisgICAgICAgIDxlcnJvcm1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSJub21hdGNoIiB0bz0ibm9tYXRjaGVyciIgLz4KKyAgICAgIDwvcmVkaXJlY3Rvcj4KKyAgICAgIDxhcmcgdmFsdWU9Ii1mIiAvPgorICAgICAgPHNyY2ZpbGUgLz4KKyAgICAgIDxhcmcgdmFsdWU9InJlZGlyZWN0b3IuaW4iIC8+CisgICAgICA8ZmlsZWxpc3QgcmVmaWQ9Inh5emxpc3QiIC8+CisgICAgPC9hcHBseT4KKworICAgIDx2YWxSb3I5LTEyIG49IjEyIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZWRpcmVjdG9yMTMiIGRlcGVuZHM9Inh5eiIgaWY9InRlc3QuY2FuLnJ1biI+CisgICAgPGFwcGx5IGV4ZWN1dGFibGU9InNoIj4KKyAgICAgIDxyZWRpcmVjdG9yPgorICAgICAgICA8b3V0cHV0ZmlsdGVyY2hhaW4+CisgICAgICAgICAgPHJlcGxhY2VzdHJpbmcgZnJvbT0ib3V0IiB0bz0iT1VUUFVUPz8/IiAvPgorICAgICAgICA8L291dHB1dGZpbHRlcmNoYWluPgorICAgICAgICA8ZXJyb3JmaWx0ZXJjaGFpbj4KKyAgICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJlcnIiIHRvPSJFUlJPUiEhISIgLz4KKyAgICAgICAgPC9lcnJvcmZpbHRlcmNoYWluPgorICAgICAgPC9yZWRpcmVjdG9yPgorICAgICAgPGFyZyB2YWx1ZT0icGFycm90LnNoIiAvPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9Inh5eiIgLz4KKyAgICA8L2FwcGx5PgorCisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IiR7eH0gT1VUUFVUPz8/IiAvPgorICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSIke3l9IE9VVFBVVD8/PyIgLz4KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iJHt6fSBPVVRQVVQ/Pz8iIC8+CisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IiR7eH0gRVJST1IhISEiIC8+CisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IiR7eX0gRVJST1IhISEiIC8+CisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IiR7en0gRVJST1IhISEiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlZGlyZWN0b3IxNCIgZGVwZW5kcz0ieHl6IiBpZj0ic2VkLmNhbi5ydW4iPgorICAgIDxlY2hvIGZpbGU9InJlZGlyZWN0b3IuaW4iPnogYmVmb3JlIHkgYmVmb3JlIHgke2VvbH08L2VjaG8+CisgICAgPGFwcGx5IGV4ZWN1dGFibGU9InNlZCI+CisgICAgICA8cmVkaXJlY3RvciBhcHBlbmQ9InRydWUiCisgICAgICAgICAgICAgICAgICBpbnB1dHN0cmluZz0ieCBiZWZvcmUgeSBiZWZvcmUgeiR7ZW9sfSI+CisgICAgICAgIDxvdXRwdXRmaWx0ZXJjaGFpbj4KKyAgICAgICAgICA8cmVwbGFjZXN0cmluZyBmcm9tPSJiZWZvcmUiIHRvPSJhZnRlciIgLz4KKyAgICAgICAgPC9vdXRwdXRmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGlucHV0bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IngiIHRvPSJyZWRpcmVjdG9yLmluIiAvPgorICAgICAgICA8b3V0cHV0bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209InkiIHRvPSJyZWRpcmVjdG9yLm91dCIgLz4KKyAgICAgICAgPGVycm9ybWFwcGVyIHR5cGU9Imdsb2IiIGZyb209InoiIHRvPSJyZWRpcmVjdG9yLmVyciIgLz4KKyAgICAgIDwvcmVkaXJlY3Rvcj4KKyAgICAgIDxhcmcgdmFsdWU9Ii1mIiAvPgorICAgICAgPGZpbGVzZXQgcmVmaWQ9Inh5eiIgLz4KKyAgICA8L2FwcGx5PgorCisgICAgPGFzc2VydEVtcHR5RmlsZSBmaWxlPSJyZWRpcmVjdG9yLmVyciIgLz4KKworICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGFuZD4KKyAgICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0ieiBhZnRlciB5IGFmdGVyIGJsYWh4IGFmdGVyIHkgYWZ0ZXIgYmxhaCIgLz4KKyAgICAgICAgICA8YXU6bG9nY29udGVudCAvPgorICAgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgICAgPC9hbmQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9IiR7bG9nY29udGVudH0iPgorICAgICAgPGFuZD4KKyAgICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0ieCBhZnRlciBibGFoIGFmdGVyIHoiIC8+CisgICAgICAgICAgPGZpbGUgZmlsZT0icmVkaXJlY3Rvci5vdXQiIC8+CisgICAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icGFkIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJwYWQiIHZhbHVlPSIiPgorICAgICAgPG9yPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxvcyBmYW1pbHk9ImRvcyIgLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPG9yPgorICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxLjEiIC8+CisgICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuMiIgLz4KKyAgICAgICAgICA8L29yPgorICAgICAgICA8L25vdD4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJwYWQiIHZhbHVlPSIgIj4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxvcyBmYW1pbHk9ImRvcyIgLz4KKyAgICAgICAgPG9yPgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHthbnQuamF2YS52ZXJzaW9ufSIgYXJnMj0iMS4yIiAvPgorICAgICAgICA8L29yPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SWdub3JlTWlzc2luZyIgZGVwZW5kcz0ieHl6LHBhZCIgaWY9ImVjaG8uY2FuLnJ1biI+CisgICAgPGZpbGVsaXN0IGlkPSJ4eWxpc3QiIGRpcj0iJHtiYXNlZGlyfSIgZmlsZXM9IngseSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9InoiIC8+CisKKyAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9Inh5IiBwYXRoc2VwPSIke3BhZH0ke2VvbH0iIHJlZmlkPSJ4eWxpc3QiIC8+CisKKyAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9Inh5eiIgcGF0aHNlcD0iJHtwYWR9JHtlb2x9IiByZWZpZD0ieHl6bGlzdCIgLz4KKworICAgIDxhcHBseSBleGVjdXRhYmxlPSJlY2hvIiBpZ25vcmVtaXNzaW5nPSJ0cnVlIgorICAgICAgICAgICBvdXRwdXRwcm9wZXJ0eT0iaWdub3JldHJ1ZSIgYXBwZW5kPSJ0cnVlIj4KKyAgICAgIDxmaWxlbGlzdCByZWZpZD0ieHl6bGlzdCIgLz4KKyAgICA8L2FwcGx5PgorCisgICAgPGFwcGx5IGV4ZWN1dGFibGU9ImVjaG8iIGlnbm9yZW1pc3Npbmc9ImZhbHNlIgorICAgICAgICAgICBvdXRwdXRwcm9wZXJ0eT0iaWdub3JlZmFsc2UiIGFwcGVuZD0idHJ1ZSI+CisgICAgICA8ZmlsZWxpc3QgcmVmaWQ9Inh5emxpc3QiIC8+CisgICAgPC9hcHBseT4KKworICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGFuZD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3h5fSR7cGFkfSIgYXJnMj0iJHtpZ25vcmV0cnVlfSIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3h5en0ke3BhZH0iIGFyZzI9IiR7aWdub3JlZmFsc2V9IiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGb3JjZSIgZGVwZW5kcz0ieHl6LHBhZCIgaWY9ImVjaG8uY2FuLnJ1biI+CisgICAgPHByZXNldGRlZiBuYW1lPSJla2tvIj4KKyAgICAgIDxhcHBseSBleGVjdXRhYmxlPSJlY2hvIiBhcHBlbmQ9InRydWUiIGRlc3Q9IiR7YmFzZWRpcn0iPgorICAgICAgICA8ZmlsZWxpc3QgcmVmaWQ9Inh5emxpc3QiIC8+CisgICAgICAgIDxtYXBwZXIgdHlwZT0iaWRlbnRpdHkiIC8+CisgICAgICA8L2FwcGx5PgorICAgIDwvcHJlc2V0ZGVmPgorCisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJ4eXoiIHBhdGhzZXA9IiR7cGFkfSR7ZW9sfSIgcmVmaWQ9Inh5emxpc3QiIC8+CisKKyAgICA8ZWtrbyBvdXRwdXRwcm9wZXJ0eT0iZm9vIiAvPgorICAgIDxla2tvIG91dHB1dHByb3BlcnR5PSJiYXIiIGZvcmNlPSJ0cnVlIiAvPgorCisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YW5kPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7Zm9vfSIgYXJnMj0iIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YmFyfSIgYXJnMj0iJHt4eXp9IiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROb0Rlc3QiIGRlcGVuZHM9Inh5eiIgaWY9ImVjaG8uY2FuLnJ1biI+CisgICAgPHByZXNldGRlZiBuYW1lPSJla2tvIj4KKyAgICAgIDxhcHBseSBleGVjdXRhYmxlPSJlY2hvIiBhZGRzb3VyY2VmaWxlPSJmYWxzZSIgZm9yY2U9InRydWUiPgorICAgICAgICA8ZmlsZWxpc3QgZGlyPSIke2Jhc2VkaXJ9IiBmaWxlcz0ieCIgLz4KKyAgICAgICAgPGdsb2JtYXBwZXIgZnJvbT0iKiIgdG89IiR7YmFzZWRpcn0vKiIgLz4KKyAgICAgICAgPHRhcmdldGZpbGUgLz4KKyAgICAgIDwvYXBwbHk+CisgICAgPC9wcmVzZXRkZWY+CisgICAgPGVra28gb3V0cHV0cHJvcGVydHk9ImRlc3QiIGRlc3Q9IiR7YmFzZWRpcn0iIC8+CisgICAgPGVra28gb3V0cHV0cHJvcGVydHk9Im5vZGVzdCIgLz4KKworICAgIDxhdTphc3NlcnRGaWxlRG9lc250RXhpc3QgZmlsZT0iJHtkZXN0fSIgLz4KKyAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIke25vZGVzdH0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdExzUGF0aCIgaWY9ImxzLmNhbi5ydW4iPgorICAgIDxhcHBseSBleGVjdXRhYmxlPSJscyIgcGFyYWxsZWw9ImZhbHNlIiBvdXRwdXRwcm9wZXJ0eT0ibHNQYXRoT3V0IgorICAgICAgICAgICBmb3JjZT0idHJ1ZSIgZGVzdD0iJHtiYXNlZGlyfSIgYXBwZW5kPSJ0cnVlIiB0eXBlPSJib3RoIj4KKyAgICAgIDxwYXRoIHBhdGg9IiR7ZW52LlBBVEh9IiAvPgorICAgICAgPGlkZW50aXR5bWFwcGVyLz4KKyAgICA8L2FwcGx5PgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHByb3BlcnR5cmVzb3VyY2UgbmFtZT0ibHNQYXRoT3V0IiAvPgorICAgICAgICAgIDxjb250YWluc3JlZ2V4cCBleHByZXNzaW9uPSJeJHtscy5jYW4ucnVufSQiCisgICAgICAgICAgICAgIHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyIgLz4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdExzUGF0aFBhcmFsbGVsIiBpZj0ibHMuY2FuLnJ1biI+CisgICAgPGFwcGx5IGV4ZWN1dGFibGU9ImxzIiBwYXJhbGxlbD0idHJ1ZSIgb3V0cHV0cHJvcGVydHk9ImxzUGF0aFBhcmFsbGVsT3V0IgorICAgICAgICAgICBmb3JjZT0idHJ1ZSIgZGVzdD0iJHtiYXNlZGlyfSIgYXBwZW5kPSJ0cnVlIiB0eXBlPSJib3RoIj4KKyAgICAgIDxwYXRoIHBhdGg9IiR7ZW52LlBBVEh9IiAvPgorICAgICAgPGlkZW50aXR5bWFwcGVyLz4KKyAgICA8L2FwcGx5PgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHByb3BlcnR5cmVzb3VyY2UgbmFtZT0ibHNQYXRoUGFyYWxsZWxPdXQiIC8+CisgICAgICAgICAgPGNvbnRhaW5zcmVnZXhwIGV4cHJlc3Npb249Il4ke2xzLmNhbi5ydW59JCIKKyAgICAgICAgICAgICAgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIiAvPgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZT4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJ4eXoiIC8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJyZWRpcmVjdC4qIiAvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0icmVkaXJlY3Rvci4qIiAvPgorICAgIDwvZGVsZXRlPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvcGFycm90LnNoIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZXhlYy9wYXJyb3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjQ2N2YyMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvcGFycm90LnNoCkBAIC0wLDAgKzEsMTkgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK2ZvciBhcmcgaW4gIiRAIiA7IGRvCisJZWNobyAkYXJnIG91dAorCXNsZWVwIDEKKwllY2hvICRhcmcgZXJyPiYyCitkb25lCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9nemlwLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZ3ppcC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQ0ZWZkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZ3ppcC10ZXN0LnhtbApAQCAtMCwwICsxLDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8cHJvamVjdCBkZWZhdWx0PSJhbnR1bml0IiB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPg0KKw0KKyAgICA8IS0tIG5vdGUgcmVsaWVzIG9uIGFudHVuaXQgYnVpbHQgZnJvbSBzdm4gdHJ1bmsgKDEuMS1hbHBoYSkgLS0+DQorICAgIDxpbXBvcnQgZmlsZT0iLi4vYW50dW5pdC1iYXNlLnhtbCIgLz4NCisNCisgICAgPHRhcmdldCBuYW1lPSJzZXRVcCI+DQorICAgICAgICA8bWtkaXIgZGlyPSIke2phdmEuaW8udG1wZGlyfS9nemlwLXRlc3QiIC8+DQorICAgICAgICA8bWtkaXIgZGlyPSIke2phdmEuaW8udG1wZGlyfS9nemlwLXRlc3QvZW1wdHkiIC8+DQorICAgICAgICA8dG91Y2ggZmlsZT0iJHtqYXZhLmlvLnRtcGRpcn0vZ3ppcC10ZXN0L2ZpbGVvbmUiIC8+DQorICAgICAgICA8dG91Y2ggZmlsZT0iJHtqYXZhLmlvLnRtcGRpcn0vZ3ppcC10ZXN0L2ZpbGV0d28iIC8+DQorICAgIDwvdGFyZ2V0Pg0KKw0KKyAgICA8dGFyZ2V0IG5hbWU9InRlYXJEb3duIj4NCisgICAgICAgIDxkZWxldGUgaW5jbHVkZWVtcHR5ZGlycz0idHJ1ZSI+DQorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEuaW8udG1wZGlyfS9nemlwLXRlc3QiIC8+DQorICAgICAgICA8L2RlbGV0ZT4NCisgICAgPC90YXJnZXQ+DQorDQorICAgIDx0YXJnZXQgbmFtZT0idGVzdEZhaWxOb25lIj4NCisgICAgICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0iTm8gcmVzb3VyY2Ugc2VsZWN0ZWQsIGd6aXAgbmVlZHMgZXhhY3RseSBvbmUgcmVzb3VyY2UuIiBtZXNzYWdlPSJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8Z3ppcCBkZXN0ZmlsZT0iJHtqYXZhLmlvLnRtcGRpcn0vZ3ppcC10ZXN0L2ZpbGUuZ3oiPg0KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YS5pby50bXBkaXJ9L2d6aXAtdGVzdC9lbXB0eSIgLz4NCisgICAgICAgICAgICA8L2d6aXA+DQorICAgICAgICA8L2F1OmV4cGVjdGZhaWx1cmU+DQorICAgIDwvdGFyZ2V0Pg0KKw0KKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RGYWlsVHdvIj4NCisgICAgICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0iZ3ppcCBjYW5ub3QgaGFuZGxlIG11bHRpcGxlIHJlc291cmNlcyBhdCBvbmNlLiAoMiByZXNvdXJjZXMgd2VyZSBzZWxlY3RlZC4pIiBtZXNzYWdlPSJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIj4NCisgICAgICAgICAgICA8Z3ppcCBkZXN0ZmlsZT0iJHtqYXZhLmlvLnRtcGRpcn0vZ3ppcC10ZXN0L2ZpbGUuZ3oiPg0KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YS5pby50bXBkaXJ9L2d6aXAtdGVzdCIgLz4NCisgICAgICAgICAgICA8L2d6aXA+DQorICAgICAgICA8L2F1OmV4cGVjdGZhaWx1cmU+DQorICAgIDwvdGFyZ2V0Pg0KKw0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9pbnB1dC10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2lucHV0LXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNTg2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9pbnB1dC10ZXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0LWlucHV0IiBkZWZhdWx0PSJhbnR1bml0IiB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPg0KKwkNCisJPGltcG9ydCBmaWxlPSIuLi9hbnR1bml0LWJhc2UueG1sIi8+DQorCQ0KKwk8dGFyZ2V0IG5hbWU9InNldFVwIj4NCisJCTxhdmFpbGFibGUgcHJvcGVydHk9ImpkazEuNisiIGNsYXNzbmFtZT0iamF2YS51dGlsLlNlcnZpY2VMb2FkZXIiLz4NCisJPC90YXJnZXQ+DQorCQkNCisJPHRhcmdldCBuYW1lPSJ0ZXN0LXNlY3VyZS1pbnB1dCIgaWY9ImpkazEuNisiPg0KKwkJPGlucHV0IG1lc3NhZ2U9InNlY3VyZS1pbnB1dDo+IiBhZGRwcm9wZXJ0eT0idGhlLnBhc3N3b3JkIj4NCisJCQk8aGFuZGxlciBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LlNlY3VyZUlucHV0SGFuZGxlciIvPg0KKwkJPC9pbnB1dD4NCisJCTxhdTphc3NlcnRQcm9wZXJ0eVNldCBuYW1lPSJ0aGUucGFzc3dvcmQiLz4NCisJPC90YXJnZXQ+DQorCQ0KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXItc3BpLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamFyLXNwaS10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDUzMTFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamFyLXNwaS10ZXN0LnhtbApAQCAtMCwwICsxLDE0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZGlyIiBsb2NhdGlvbj0iamFyX3NwaV9kaXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9Imphci5zcmMuZGlyIiBsb2NhdGlvbj0iamFyX3NwaV9kaXIvc3JjIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuc3JjLmZpbGUiIGxvY2F0aW9uPSJqYXJfc3BpX2Rpci9zcmMvYV9maWxlIi8+CisgICAgCisgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkazEuNCsiIGNsYXNzbmFtZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIvPiAgCisgIDxjb25kaXRpb24gcHJvcGVydHk9InNvbWUucmVnZXhwLnN1cHBvcnQiPgorICAgIDxvcj4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamRrMS40KyIvPgorICAgICAgPGlzc2V0IHByb3BlcnR5PSJhcGFjaGUucmVnZXhwLnByZXNlbnQiLz4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYXBhY2hlLm9yby5wcmVzZW50Ii8+CisgICAgPC9vcj4KKyAgPC9jb25kaXRpb24+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8bWtkaXIgZGlyPSIke2phci5zcmMuZGlyfSIvPgorICAgIDxkZWxldGUgcXVpZXQ9InllcyIgZmlsZT0iJHtqYXIuc3JjLmZpbGV9Ii8+CisgICAgPHRvdWNoIGZpbGU9IiR7amFyLnNyYy5maWxlfSIvPgorICAgIDxkZWxldGUgcXVpZXQ9InllcyIgZmlsZT0iJHtqYXIuZGlyfS9maWxlLmphciIvPgorICAgIDxkZWxldGUgcXVpZXQ9InllcyIgZGlyPSIke2phci5kaXJ9L291dHB1dCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Qtc2ltcGxlIiBkZXBlbmRzPSJpbml0IiBpZj0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisKKyAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vZmlsZS5qYXIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2phci5zcmMuZGlyfSIvPgorICAgICAgPHNlcnZpY2UgdHlwZT0iYS5iLmMiIHByb3ZpZGVyPSJhLmIuYy5kIi8+CisgICAgPC9qYXI+CisKKyAgICA8dW5qYXIgc3JjPSIke2phci5kaXJ9L2ZpbGUuamFyIgorICAgICAgICAgICBkZXN0PSIke2phci5kaXJ9L291dHB1dCIvPgorCisgICAgPGxvYWRmaWxlIHByb3BlcnR5PSJzaW1wbGUiCisgICAgICAgICAgICAgIHNyY2ZpbGU9IiR7amFyLmRpcn0vb3V0cHV0L01FVEEtSU5GL3NlcnZpY2VzL2EuYi5jIgorICAgICAgICAgICAgICBlbmNvZGluZz0iVVRGLTgiLz4KKworICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPG1hdGNoZXMgc3RyaW5nPSIke3NpbXBsZX0iIHBhdHRlcm49Il5hXC5iXC5jXC5kJCIvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKworICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtcHJvdmlkZXJzIiBkZXBlbmRzPSJpbml0IiBpZj0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisKKyAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vZmlsZS5qYXIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2phci5zcmMuZGlyfSIvPgorICAgICAgPHNlcnZpY2UgdHlwZT0iYS5iLmMiPgorICAgICAgICA8cHJvdmlkZXIgY2xhc3NuYW1lPSJhLlgiLz4KKyAgICAgICAgPHByb3ZpZGVyIGNsYXNzbmFtZT0iYS5EIi8+CisgICAgICA8L3NlcnZpY2U+CisgICAgPC9qYXI+CisKKyAgICA8dW5qYXIgc3JjPSIke2phci5kaXJ9L2ZpbGUuamFyIgorICAgICAgICAgICBkZXN0PSIke2phci5kaXJ9L291dHB1dCIvPgorCisgICAgPGxvYWRmaWxlIHByb3BlcnR5PSJwcm92aWRlcnMiCisgICAgICAgICAgICAgIHNyY2ZpbGU9IiR7amFyLmRpcn0vb3V0cHV0L01FVEEtSU5GL3NlcnZpY2VzL2EuYi5jIgorICAgICAgICAgICAgICBlbmNvZGluZz0iVVRGLTgiLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxtYXRjaGVzIHN0cmluZz0iJHtwcm92aWRlcnN9IiBwYXR0ZXJuPSJeYVwuWFxuYVwuRCQiLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LW11bHRpIiBkZXBlbmRzPSJpbml0IiBpZj0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisKKyAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vZmlsZS5qYXIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2phci5zcmMuZGlyfSIvPgorICAgICAgPHNlcnZpY2UgdHlwZT0iYS5iLmMiPgorICAgICAgICA8cHJvdmlkZXIgY2xhc3NuYW1lPSJhLlgiLz4KKyAgICAgICAgPHByb3ZpZGVyIGNsYXNzbmFtZT0iYS5EIi8+CisgICAgICA8L3NlcnZpY2U+CisgICAgICA8c2VydmljZSB0eXBlPSJqYXZheC5hLnNlcnZpY2UiPgorICAgICAgICA8cHJvdmlkZXIgY2xhc3NuYW1lPSJhLk8uVCIvPgorICAgICAgICA8cHJvdmlkZXIgY2xhc3NuYW1lPSJhLkIiLz4KKyAgICAgIDwvc2VydmljZT4KKyAgICA8L2phcj4KKworICAgIDx1bmphciBzcmM9IiR7amFyLmRpcn0vZmlsZS5qYXIiCisgICAgICAgICAgIGRlc3Q9IiR7amFyLmRpcn0vb3V0cHV0Ii8+CisKKyAgICA8bG9hZGZpbGUgcHJvcGVydHk9Im11bHRpLWEiCisgICAgICAgICAgICAgIHNyY2ZpbGU9IiR7amFyLmRpcn0vb3V0cHV0L01FVEEtSU5GL3NlcnZpY2VzL2EuYi5jIgorICAgICAgICAgICAgICBlbmNvZGluZz0iVVRGLTgiLz4KKworICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPG1hdGNoZXMgc3RyaW5nPSIke211bHRpLWF9IiBwYXR0ZXJuPSJeYVwuWFxuYVwuRCQiLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisKKyAgICA8bG9hZGZpbGUgcHJvcGVydHk9Im11bHRpLWIiCisgICAgICAgICAgICAgIHNyY2ZpbGU9IiR7amFyLmRpcn0vb3V0cHV0L01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmEuc2VydmljZSIKKyAgICAgICAgICAgICAgZW5jb2Rpbmc9IlVURi04Ii8+CisKKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxtYXRjaGVzIHN0cmluZz0iJHttdWx0aS1ifSIgcGF0dGVybj0iXmFcLk9cLlRcbmFcLkIkIi8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorCisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1yZWplY3Qtbm8tdHlwZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGF1OmV4cGVjdGZhaWx1cmU+CisgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vZmlsZS5qYXIiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7amFyLnNyYy5kaXJ9Ii8+CisgICAgICAgIDxzZXJ2aWNlIHByb3ZpZGVyPSJhLlgiLz4KKyAgICAgIDwvamFyPgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXJlamVjdC1uby1wcm92aWRlciIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGF1OmV4cGVjdGZhaWx1cmU+CisgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vZmlsZS5qYXIiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7amFyLnNyYy5kaXJ9Ii8+CisgICAgICAgIDxzZXJ2aWNlIHR5cGU9ImEuWCIvPgorICAgICAgPC9qYXI+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtcmVqZWN0LW5vLWNsYXNzbmFtZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPGF1OmV4cGVjdGZhaWx1cmU+CisgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vZmlsZS5qYXIiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7amFyLnNyYy5kaXJ9Ii8+CisgICAgICAgIDxzZXJ2aWNlIHR5cGU9ImEuWCI+CisgICAgICAgICAgPHByb3ZpZGVyLz4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgICAgPC9qYXI+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlYXJEb3duIj4KKyAgICA8ZGVsZXRlIHF1aWV0PSJ5ZXMiIGRpcj0iJHtqYXIuZGlyfSIvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLWRpci9iYWQtc3JjL0JhZC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamF2YWMtZGlyL2JhZC1zcmMvQmFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3NDlmOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLWRpci9iYWQtc3JjL0JhZC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKy8qKiBhIHNpbXBsZSBjbGFzcyB3aXRoIGEgYnVnICovCitwdWJsaWMgY2xhc3MgU2ltcGxlIHsKKyAgICAvLyBzaG91bGQgZ2V0IGEgbm90LXRlcm1pbmF0ZWQgZXJyb3IKKyAgICBTdHJpbmcgcyA9ICI7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXZhYy1kaXIvZ29vZC1zcmMvU2ltcGxlLmphdmEgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXZhYy1kaXIvZ29vZC1zcmMvU2ltcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwOGY1NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLWRpci9nb29kLXNyYy9TaW1wbGUuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisvKiogYSBzaW1wbGUgZG8gbm90aGluZyBjbGFzcyAqLworcHVibGljIGNsYXNzIFNpbXBsZSB7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXZhYy10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNGFhZmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXZhYy10ZXN0LnhtbApAQCAtMCwwICsxLDkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDxpbXBvcnQgZmlsZT0iLi4vYW50dW5pdC1iYXNlLnhtbCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0iYW50LWJ1aWxkIiBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFjLWRpciIgbG9jYXRpb249IiR7YW50LWJ1aWxkfS9hbnQtdW5pdC9qYXZhYy1kaXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLWRpciIgbG9jYXRpb249IiR7amF2YWMtZGlyfS9idWlsZCIvPgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWluY2x1ZGVEZXN0Q2xhc3NlcyI+CisgICAgPHByb3BlcnR5IG5hbWU9IkRBVEUiIHZhbHVlPSIwOS8xMC8xOTk5IDQ6MzAgcG0iLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtqYXZhYy1kaXJ9L3NyYyIvPgorICAgIDxta2RpciBkaXI9IiR7amF2YWMtZGlyfS9zcmMiLz4KKyAgICA8ZWNobyBmaWxlPSIke2phdmFjLWRpcn0vc3JjL0EuamF2YSI+CisgICAgICBwdWJsaWMgY2xhc3MgQSB7IEIgYjt9CisgICAgPC9lY2hvPgorICAgIDxlY2hvIGZpbGU9IiR7amF2YWMtZGlyfS9zcmMvQi5qYXZhIj4KKyAgICAgIHB1YmxpYyBjbGFzcyBCIHsgfQorICAgIDwvZWNobz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtqYXZhYy1kaXJ9L2NsYXNzZXMiIHF1aWV0PSJ5ZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke2phdmFjLWRpcn0vY2xhc3NlcyIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7amF2YWMtZGlyfS9zcmMiIGRlc3RkaXI9IiR7amF2YWMtZGlyfS9jbGFzc2VzIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7amF2YWMtZGlyfS9zcmMvQi5qYXZhIiBkYXRldGltZT0iJHtEQVRFfSIvPgorICAgIDx0b3VjaCBmaWxlPSIke2phdmFjLWRpcn0vY2xhc3Nlcy9CLmNsYXNzIiBkYXRldGltZT0iJHtEQVRFfSIvPgorICAgIDwhLS0gZm9sbG93aW5nIHNob3VsZCBub3QgdXBkYXRlIEIuY2xhc3MgLS0+CisgICAgPGRlbGV0ZSBxdWlldD0ieWVzIiBmaWxlPSIke2phdmFjLWRpcn0vY2xhc3Nlcy9BLmNsYXNzIi8+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtqYXZhYy1kaXJ9L3NyYyIgZGVzdGRpcj0iJHtqYXZhYy1kaXJ9L2NsYXNzZXMiLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxpc2ZpbGVzZWxlY3RlZCBmaWxlPSIke2phdmFjLWRpcn0vY2xhc3Nlcy9CLmNsYXNzIj4KKyAgICAgICAgPGRhdGUgZGF0ZXRpbWU9IiR7REFURX0iIHdoZW49ImVxdWFsIi8+CisgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8IS0tIGZvbGxvd2luZyBzaG91bGQgdXBkYXRlIEIuY2xhc3MgLS0+CisgICAgPGRlbGV0ZSBxdWlldD0ieWVzIiBmaWxlPSIke2phdmFjLWRpcn0vY2xhc3Nlcy9BLmNsYXNzIi8+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtqYXZhYy1kaXJ9L3NyYyIKKyAgICAgICAgICAgZGVzdGRpcj0iJHtqYXZhYy1kaXJ9L2NsYXNzZXMiIGluY2x1ZGVEZXN0Q2xhc3Nlcz0ibm8iLz4KKyAgICA8YXU6YXNzZXJ0RmFsc2U+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iJHtqYXZhYy1kaXJ9L2NsYXNzZXMvQi5jbGFzcyI+CisgICAgICAgIDxkYXRlIGRhdGV0aW1lPSIke0RBVEV9IiB3aGVuPSJlcXVhbCIvPgorICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICA8L2F1OmFzc2VydEZhbHNlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtdXBkYXRlZC1wcm9wZXJ0eSI+CisgICAgPGRlbGV0ZSBxdWlldD0ieWVzIiBkaXI9IiR7YnVpbGQtZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQtZGlyfSIvPgorICAgIDxqYXZhYyBzcmNkaXI9ImphdmFjLWRpci9nb29kLXNyYyIgZGVzdGRpcj0iJHtidWlsZC1kaXJ9IgorICAgICAgICAgICB1cGRhdGVkUHJvcGVydHk9ImNsYXNzZXMtdXBkYXRlZCIvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGVxdWFscyBhcmcxPSIke2NsYXNzZXMtdXBkYXRlZH0iIGFyZzI9InRydWUiLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgICAgPGphdmFjIHNyY2Rpcj0iamF2YWMtZGlyL2dvb2Qtc3JjIiBkZXN0ZGlyPSIke2J1aWxkLWRpcn0iCisgICAgICAgICAgIHVwZGF0ZWRQcm9wZXJ0eT0iY2xhc3Nlcy11cGRhdGVkLTIiLz4KKyAgICA8YXU6YXNzZXJ0RmFsc2U+CisgICAgICA8aXNzZXQgcHJvcGVydHk9ImNsYXNzZXMtdXBkYXRlZC0yIi8+CisgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWVycm9yLXByb3BlcnR5Ij4KKyAgICA8ZGVsZXRlIHF1aWV0PSJ5ZXMiIGRpcj0iJHtidWlsZC1kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC1kaXJ9Ii8+CisgICAgPGphdmFjIHNyY2Rpcj0iamF2YWMtZGlyL2dvb2Qtc3JjIiBkZXN0ZGlyPSIke2J1aWxkLWRpcn0iCisgICAgICAgICAgIGZhaWxPbkVycm9yPSJmYWxzZSIKKyAgICAgICAgICAgZXJyb3JQcm9wZXJ0eT0iY29tcGlsZS1mYWlsZWQiLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0iJHtjb21waWxlLWZhaWxlZH0iIGFyZzI9IiR7Y29tcGlsZS1mYWlsZWR9Ii8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDxqYXZhYyBzcmNkaXI9ImphdmFjLWRpci9iYWQtc3JjIiBkZXN0ZGlyPSIke2J1aWxkLWRpcn0iCisgICAgICAgICAgIGZhaWxPbkVycm9yPSJmYWxzZSIKKyAgICAgICAgICAgZXJyb3JQcm9wZXJ0eT0iY29tcGlsZS1mYWlsZWQiLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0iJHtjb21waWxlLWZhaWxlZH0iIGFyZzI9InRydWUiLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbGVuZ3RoLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbGVuZ3RoLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNWZkNmIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9sZW5ndGgtdGVzdC54bWwKQEAgLTAsMCArMSwyMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0ibGVuZ3RoLXRlc3QiIGRlZmF1bHQ9ImFudHVuaXQiCisgICAgICAgICB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorCisgIDxpbXBvcnQgZmlsZT0iLi4vYW50dW5pdC1iYXNlLnhtbCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0iZGlyIiBsb2NhdGlvbj0ibGVuZ3RodGVzdGRpciIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRpci5hIiBsb2NhdGlvbj0iJHtkaXJ9L2EiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXIuYiIgbG9jYXRpb249IiR7ZGlyfS9iIiAvPgorICA8cHJvcGVydHkgbmFtZT0iemlwZmlsZSIgbG9jYXRpb249Imxlbmd0aHRlc3QuemlwIiAvPgorCisgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPgorICAgIDxta2RpciBkaXI9IiR7ZGlyLmF9IiAvPgorICAgIDxta2RpciBkaXI9IiR7ZGlyLmJ9IiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmb28iIGxvY2F0aW9uPSIke2Rpci5hfS9mb28iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJhciIgbG9jYXRpb249IiR7ZGlyLmJ9L2JhciIgLz4KKyAgICA8ZWNobyBmaWxlPSIke2Zvb30iIG1lc3NhZ2U9ImZvbyIgLz4KKyAgICA8ZWNobyBmaWxlPSIke2Jhcn0iIG1lc3NhZ2U9ImJhciIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7ZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7emlwZmlsZX0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEVhY2giIGRlcGVuZHM9InNldFVwIj4KKyAgICA8bGVuZ3RoIG1vZGU9ImVhY2giIHByb3BlcnR5PSJsZW5ndGguZWFjaCI+CisgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHtkaXJ9IiAvPgorICAgIDwvbGVuZ3RoPgorICAgIDxsZW5ndGggc3RyaW5nPSIke2xlbmd0aC5lYWNofSIgcHJvcGVydHk9Imxlbmd0aC5sZW5ndGguZWFjaCIgLz4KKyAgICA8bGVuZ3RoIHN0cmluZz0iJHtmb299JHtiYXJ9Li4uLi4uLi4ke2xpbmUuc2VwYXJhdG9yfSIKKyAgICAgICAgICAgIHByb3BlcnR5PSJsZW5ndGguZXhwZWN0ZWQiIC8+CisKKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDwhLS0gdGVzdCB0aGF0IGJvdGggZmlsZXMgYXJlIHJlcHJlc2VudGVkLCBhbmQgdGhhdCB0aGUKKyAgICAgICAgICAgb3V0cHV0IGlzIHRoZSBleHBlY3RlZCBsZW5ndGg7IGRvIG5vdCBhc3N1bWUgb3JkZXIuIC0tPgorICAgICAgPGFuZD4KKyAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHtsZW5ndGguZWFjaH0iIHN1YnN0cmluZz0iJHtmb299IDogMyIgLz4KKyAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHtsZW5ndGguZWFjaH0iIHN1YnN0cmluZz0iJHtiYXJ9IDogMyIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2xlbmd0aC5sZW5ndGguZWFjaH0iIGFyZzI9IiR7bGVuZ3RoLmV4cGVjdGVkfSIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RWFjaENvbmRpdGlvbiIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDxsZW5ndGggbW9kZT0iZWFjaCIgcHJvcGVydHk9Imxlbmd0aC5lYWNoIj4KKyAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIke2Rpcn0iIC8+CisgICAgPC9sZW5ndGg+CisgICAgPGxlbmd0aCBzdHJpbmc9IiR7Zm9vfSR7YmFyfS4uLi4uLi4uJHtsaW5lLnNlcGFyYXRvcn0iCisgICAgICAgICAgICBwcm9wZXJ0eT0ibGVuZ3RoLmV4cGVjdGVkIiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPCEtLSB0ZXN0IHRoYXQgYm90aCBmaWxlcyBhcmUgcmVwcmVzZW50ZWQsIGFuZCB0aGF0IHRoZQorICAgICAgICAgICBvdXRwdXQgaXMgdGhlIGV4cGVjdGVkIGxlbmd0aDsgZG8gbm90IGFzc3VtZSBvcmRlci4gLS0+CisgICAgICA8YW5kPgorICAgICAgICA8Y29udGFpbnMgc3RyaW5nPSIke2xlbmd0aC5lYWNofSIgc3Vic3RyaW5nPSIke2Zvb30gOiAzIiAvPgorICAgICAgICA8Y29udGFpbnMgc3RyaW5nPSIke2xlbmd0aC5lYWNofSIgc3Vic3RyaW5nPSIke2Jhcn0gOiAzIiAvPgorICAgICAgICA8bGVuZ3RoIHN0cmluZz0iJHtsZW5ndGguZWFjaH0iIGxlbmd0aD0iJHtsZW5ndGguZXhwZWN0ZWR9IiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RBbGwiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8bGVuZ3RoIHByb3BlcnR5PSJsZW5ndGguYWxsIj4KKyAgICAgIDxmaWxlc2V0IGlkPSJmb28iIGZpbGU9IiR7ZGlyLmF9L2ZvbyIgLz4KKyAgICAgIDxmaWxlc2V0IGlkPSJiYXIiIGZpbGU9IiR7ZGlyLmJ9L2JhciIgLz4KKyAgICA8L2xlbmd0aD4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0iNiIgYXJnMj0iJHtsZW5ndGguYWxsfSIgLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEFsbENvbmRpdGlvbiIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGxlbmd0aCBsZW5ndGg9IjYiPgorICAgICAgICA8ZmlsZXNldCBpZD0iZm9vIiBmaWxlPSIke2Rpci5hfS9mb28iIC8+CisgICAgICAgIDxmaWxlc2V0IGlkPSJiYXIiIGZpbGU9IiR7ZGlyLmJ9L2JhciIgLz4KKyAgICAgIDwvbGVuZ3RoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZSIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDxsZW5ndGggcHJvcGVydHk9Imxlbmd0aC5mb28iIGZpbGU9IiR7ZGlyLmF9L2ZvbyIgLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0iMyIgYXJnMj0iJHtsZW5ndGguZm9vfSIgLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVDb25kaXRpb24iIGRlcGVuZHM9InNldFVwIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxsZW5ndGggbGVuZ3RoPSIzIiBmaWxlPSIke2Rpci5hfS9mb28iIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RCb3RoIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGxlbmd0aCBwcm9wZXJ0eT0ibGVuZ3RoLmZvbyIgZmlsZT0iJHtkaXIuYX0vZm9vIj4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7ZGlyLmJ9L2JhciIgLz4KKyAgICA8L2xlbmd0aD4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0iNiIgYXJnMj0iJHtsZW5ndGguZm9vfSIgLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEJvdGhDb25kaXRpb24iIGRlcGVuZHM9InNldFVwIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxsZW5ndGggbGVuZ3RoPSI2IiBmaWxlPSIke2Rpci5hfS9mb28iPgorICAgICAgICA8ZmlsZXNldCBmaWxlPSIke2Rpci5ifS9iYXIiIC8+CisgICAgICA8L2xlbmd0aD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdER1cGVzIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGxlbmd0aCBwcm9wZXJ0eT0ibGVuZ3RoLmZvbyIgZmlsZT0iJHtkaXIuYX0vZm9vIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXJ9IiAvPgorICAgIDwvbGVuZ3RoPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGVxdWFscyBhcmcxPSI5IiBhcmcyPSIke2xlbmd0aC5mb299IiAvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RHVwZXNDb25kaXRpb24iIGRlcGVuZHM9InNldFVwIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxsZW5ndGggbGVuZ3RoPSI5IiBmaWxlPSIke2Rpci5hfS9mb28iPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlyfSIgLz4KKyAgICAgIDwvbGVuZ3RoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U3RyaW5nIj4KKyAgICA8bGVuZ3RoIHN0cmluZz0iZm9vIiBwcm9wZXJ0eT0ibGVuZ3RoLnN0cmluZyIgLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0iMyIgYXJnMj0iJHtsZW5ndGguc3RyaW5nfSIgLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFN0cmluZ0NvbmRpdGlvbiI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIHN0cmluZz0iZm9vIiBsZW5ndGg9IjMiIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RUcmltU3RyaW5nIj4KKyAgICA8bGVuZ3RoIHN0cmluZz0iIGZvbyAiIHRyaW09InRydWUiIHByb3BlcnR5PSJsZW5ndGguc3RyaW5nIiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGVxdWFscyBhcmcxPSIzIiBhcmcyPSIke2xlbmd0aC5zdHJpbmd9IiAvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VHJpbVN0cmluZ0NvbmRpdGlvbiI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIHN0cmluZz0iIGZvbyAiIHRyaW09InRydWUiIGxlbmd0aD0iMyIgLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vVHJpbVN0cmluZyI+CisgICAgPGxlbmd0aCBzdHJpbmc9IiBmb28gIiBwcm9wZXJ0eT0ibGVuZ3RoLnN0cmluZyIgLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0iNSIgYXJnMj0iJHtsZW5ndGguc3RyaW5nfSIgLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE5vVHJpbVN0cmluZ0NvbmRpdGlvbiI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIHN0cmluZz0iIGZvbyAiIGxlbmd0aD0iNSIgLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFRyaW1GaWxlIiBkZXNjcmlwdGlvbj0ic2hvdWxkIGZhaWwiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlPgorICAgICAgPGxlbmd0aCBmaWxlPSIke2FudC5maWxlfSIgdHJpbT0iZmFsc2UiIC8+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RTdHJpbmdGaWxlIiBkZXNjcmlwdGlvbj0ic2hvdWxkIGZhaWwiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlPgorICAgICAgPGxlbmd0aCBzdHJpbmc9ImZvbyIgZmlsZT0iJHthbnQuZmlsZX0iIC8+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJbW11dGFibGUiPgorICAgIDxsZW5ndGggc3RyaW5nPSJmb28iIHByb3BlcnR5PSJsZW5ndGguc3RyaW5nIiAvPgorICAgIDxsZW5ndGggc3RyaW5nPSJmb29iYXIiIHByb3BlcnR5PSJsZW5ndGguc3RyaW5nIiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGVxdWFscyBhcmcxPSIzIiBhcmcyPSIke2xlbmd0aC5zdHJpbmd9IiAvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ6aXAiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8emlwIGRlc3RmaWxlPSIke3ppcGZpbGV9Ij4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7Zm9vfSIgLz4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7YmFyfSIgLz4KKyAgICA8L3ppcD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0WmlwRmlsZVNldCIgZGVwZW5kcz0iemlwIj4KKyAgICA8bGVuZ3RoIHByb3BlcnR5PSJsZW5ndGguemlwZmlsZTEiPgorICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3ppcGZpbGV9IiAvPgorICAgIDwvbGVuZ3RoPgorICAgIDxsZW5ndGggcHJvcGVydHk9Imxlbmd0aC56aXBmaWxlMiI+CisgICAgICA8emlwZmlsZXNldCBzcmM9IiR7emlwZmlsZX0iIGluY2x1ZGVzPSJiYXIiIC8+CisgICAgPC9sZW5ndGg+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YW5kPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IjYiIGFyZzI9IiR7bGVuZ3RoLnppcGZpbGUxfSIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIzIiBhcmcyPSIke2xlbmd0aC56aXBmaWxlMn0iIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFppcEZpbGVTZXRDb25kaXRpb24iIGRlcGVuZHM9InppcCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YW5kPgorICAgICAgICA8bGVuZ3RoIGxlbmd0aD0iNiI+CisgICAgICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3ppcGZpbGV9IiAvPgorICAgICAgICA8L2xlbmd0aD4KKyAgICAgICAgPGxlbmd0aCBsZW5ndGg9IjMiPgorICAgICAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHt6aXBmaWxlfSIgaW5jbHVkZXM9ImJhciIgLz4KKyAgICAgICAgPC9sZW5ndGg+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9sb2FkcmVzb3VyY2UtdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9sb2FkcmVzb3VyY2UtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzNmU2MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2xvYWRyZXNvdXJjZS10ZXN0LnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+DQorDQorICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiIC8+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3QtcmVzb3VyY2VTdHJpbmciPg0KKyAgICA8bG9hZHJlc291cmNlIHByb3BlcnR5PSJwIj4NCisgICAgICA8c3RyaW5nIHZhbHVlPSJvbmUiLz4NCisgICAgPC9sb2FkcmVzb3VyY2UgPg0KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlFcXVhbHMgbmFtZT0icCIgdmFsdWU9Im9uZSIvPg0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlc3QtcmVzb3VyY2VTaXplWmVybyIgZGVzY3JpcHRpb249IkJ1ZyA0MjMxOSI+DQorICAgIDxsb2FkcmVzb3VyY2UgcHJvcGVydHk9InAiPg0KKyAgICAgIDxzdHJpbmcgdmFsdWU9IiIvPg0KKyAgICA8L2xvYWRyZXNvdXJjZSA+DQorICAgIDxhdTphc3NlcnRUcnVlPg0KKyAgICAgIDxub3Q+DQorICAgICAgICA8aXNzZXQgcHJvcGVydHk9InAiLz4NCisgICAgICA8L25vdD4NCisgICAgPC9hdTphc3NlcnRUcnVlPg0KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iRG8gbm90IHNldCBwcm9wZXJ0eSBwIGFzIGl0cyBsZW5ndGggaXMgMC4iLz4NCisgIDwvdGFyZ2V0Pg0KKw0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9tYWNyb2RlZi10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hY3JvZGVmLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MGJkZjkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9tYWNyb2RlZi10ZXN0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9Imxlbmd0aC10ZXN0IiBkZWZhdWx0PSJhbnR1bml0IgorICAgICAgICAgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKworICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RGVmYXVsdFRlc3QiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJ0ZXN0LWxvZyI+CisgICAgICA8dGV4dCBuYW1lPSJsb2ciIGRlZmF1bHQ9IkRFRkFVTFQtTE9HLVZBTFVFIi8+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGNvbmNhdD5Ae2xvZ308L2NvbmNhdD4KKyAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIDx0ZXN0LWxvZy8+CisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IkRFRkFVTFQtTE9HLVZBTFVFIi8+CisgICAgPHRlc3QtbG9nPlRISVMgSVMgTk9UIERFRkFVTFQgTE9HPC90ZXN0LWxvZz4KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iVEhJUyBJUyBOT1QgREVGQVVMVCBMT0ciLz4KKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbW92ZS10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21vdmUtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5NTBhMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21vdmUtdGVzdC54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbnR1bml0IiB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPg0KKyAgPGltcG9ydCBmaWxlPSIuLi9hbnR1bml0LWJhc2UueG1sIiAvPg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LW1vdmUtY2FzZW9ubHkiPg0KKyAgICA8IS0tIHRoaXMgdGVzdCBpcyBpbnNwaXJlZCBieSBidWd6aWxsYSA0MTk0OCAtLT4NCisgICAgPCEtLSBFc3BlY2lhbGx5IGludGVyZXN0aW5nIGlmIGV4ZWN1dGVkIG9uIGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW1zIC0tPg0KKyAgICA8dG91Y2ggZmlsZT0iJHtqYXZhLmlvLnRtcGRpcn0vYWJjIi8+DQorICAgIDxtb3ZlIGZpbGU9IiR7amF2YS5pby50bXBkaXJ9L2FiYyIgdG9maWxlPSIke2phdmEuaW8udG1wZGlyfS9hQmMiLz4NCisgICAgPGZpbGVzZXQgZGlyPSIke2phdmEuaW8udG1wZGlyfSIgaWQ9Im15ZnMiPg0KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImFCYyIvPg0KKyAgICA8L2ZpbGVzZXQ+DQorICAgIDxwYXRoY29udmVydCByZWZpZD0ibXlmcyIgcHJvcGVydHk9Im15cHJvcGVydHkiIHNldG9uZW1wdHk9ImZhbHNlIi8+DQorICAgIDxhdTphc3NlcnRQcm9wZXJ0eVNldCBuYW1lPSJteXByb3BlcnR5IiBtZXNzYWdlPSJhYmMgd2FzIG5vdCByZW5hbWVkIGFCYyIvPg0KKyAgPC90YXJnZXQ+DQorDQorICA8dGFyZ2V0IG5hbWU9InRlYXJEb3duIj4NCisgICAgPGRlbGV0ZSBmaWxlPSIke2phdmEuaW8udG1wZGlyfS9hQmMiLz4NCisgIDwvdGFyZ2V0Pg0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9qdW5pdC1vdXRwdXR0b2Zvcm1hdHRlcnMtdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9qdW5pdC1vdXRwdXR0b2Zvcm1hdHRlcnMtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExYWI3NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L2p1bml0LW91dHB1dHRvZm9ybWF0dGVycy10ZXN0LnhtbApAQCAtMCwwICsxLDEzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbGwiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDxwcm9wZXJ0eSBuYW1lPSJhbnQtYnVpbGQiIGxvY2F0aW9uPSIuLi8uLi8uLi8uLi8uLi8uLi9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQtanVuaXQtZGlyIiBsb2NhdGlvbj0iJHthbnQtYnVpbGR9L2FudC11bml0L2p1bml0LWRpciIvPgorICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLWp1bml0LWRpcn0vY2xhc3NlcyIvPgorICA8cHJvcGVydHkgbmFtZT0icmVwb3J0cy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLWp1bml0LWRpcn0vcmVwb3J0Ii8+CisKKyAgPG1hY3JvZGVmIG5hbWU9ImFzc2VydC1maWxlLW5vdC1jb250YWlucyIgYmFja3RyYWNlPSJubyI+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8YXU6YXNzZXJ0RmFsc2U+CisgICAgICAgIDxpc2ZpbGVzZWxlY3RlZCBmaWxlPSIke3JlcG9ydHMuZGlyfS9URVNULUV4YW1wbGVUZXN0LnR4dCI+CisgICAgICAgICAgPGNvbnRhaW5zIHRleHQ9IkhlbGxvIEZyb20gVGVzdCIvPgorICAgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPG1hY3JvZGVmIG5hbWU9ImFzc2VydC1maWxlLWNvbnRhaW5zIiBiYWNrdHJhY2U9Im5vIj4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iJHtyZXBvcnRzLmRpcn0vVEVTVC1FeGFtcGxlVGVzdC50eHQiPgorICAgICAgICAgIDxjb250YWlucyB0ZXh0PSJIZWxsbyBGcm9tIFRlc3QiLz4KKyAgICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPG1hY3JvZGVmIG5hbWU9ImFzc2VydC1sb2ctbm90LWNvbnRhaW5zIiBiYWNrdHJhY2U9Im5vIj4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxhdTphc3NlcnRMb2dEb2VzbnRDb250YWluIHRleHQ9IkhlbGxvIEZyb20gVGVzdCIgLz4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPG1hY3JvZGVmIG5hbWU9ImFzc2VydC1sb2ctY29udGFpbnMiIGJhY2t0cmFjZT0ibm8iPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IkhlbGxvIEZyb20gVGVzdCIgLz4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPG1hY3JvZGVmIG5hbWU9InJ1bi1qdW5pdCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmb3JrIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaG93b3V0cHV0Ii8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXR0b2Zvcm1hdHRlcnMiLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxqdW5pdCBmb3JrPSJAe2Zvcmt9IiBoYWx0b25mYWlsdXJlPSJubyIgc2hvd291dHB1dD0iQHtzaG93b3V0cHV0fSIKKyAgICAgICAgICAgb3V0cHV0dG9mb3JtYXR0ZXJzPSJAe291dHB1dHRvZm9ybWF0dGVyc30iPgorICAgICAgICA8dGVzdCBuYW1lPSJFeGFtcGxlVGVzdCIgdG9kaXI9IiR7cmVwb3J0cy5kaXJ9Ii8+IAorICAgICAgICA8Y2xhc3NwYXRoIHBhdGg9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9InllcyIvPgorICAgICAgPC9qdW5pdD4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8ZGVsZXRlIHF1aWV0PSJ5ZXMiIGRpcj0iJHtidWlsZC1qdW5pdC1kaXJ9Ii8+CisgICAgPG1rZGlyICBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgPG1rZGlyICBkaXI9IiR7cmVwb3J0cy5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorICAgIAorICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGRlYnVnPSJ5ZXMiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXNob3cteWVzLWZvcm1hdHRlcnMteWVzIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICA8cnVuLWp1bml0IGZvcms9InllcyIgc2hvd291dHB1dD0ieWVzIgorICAgICAgICAgICAgICAgb3V0cHV0dG9mb3JtYXR0ZXJzPSJ5ZXMiLz4KKyAgICA8YXNzZXJ0LWxvZy1jb250YWlucy8+CisgICAgPGFzc2VydC1maWxlLWNvbnRhaW5zLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXNob3cteWVzLWZvcm1hdHRlcnMtbm8iIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDxydW4tanVuaXQgZm9yaz0ieWVzIiBzaG93b3V0cHV0PSJ5ZXMiCisgICAgICAgICAgICAgICBvdXRwdXR0b2Zvcm1hdHRlcnM9Im5vIi8+CisgICAgPGFzc2VydC1sb2ctY29udGFpbnMvPgorICAgIDxhc3NlcnQtZmlsZS1ub3QtY29udGFpbnMvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Qtc2hvdy15ZXMtZm9ybWF0dGVycy1uby1mb3Jrbm8iIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDxydW4tanVuaXQgZm9yaz0ibm8iIHNob3dvdXRwdXQ9InllcyIKKyAgICAgICAgICAgICAgIG91dHB1dHRvZm9ybWF0dGVycz0ibm8iLz4KKyAgICA8YXNzZXJ0LWxvZy1jb250YWlucy8+CisgICAgPGFzc2VydC1maWxlLW5vdC1jb250YWlucy8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1zaG93LW5vLWZvcm1hdHRlcnMtbm8iIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDxydW4tanVuaXQgZm9yaz0ieWVzIiBzaG93b3V0cHV0PSJubyIKKyAgICAgICAgICAgICAgIG91dHB1dHRvZm9ybWF0dGVycz0ibm8iLz4KKyAgICA8YXNzZXJ0LWxvZy1ub3QtY29udGFpbnMvPgorICAgIDxhc3NlcnQtZmlsZS1ub3QtY29udGFpbnMvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Qtc2hvdy1uby1mb3JtYXR0ZXJzLW5vLWZvcmstbm8iIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgIDxydW4tanVuaXQgZm9yaz0ibm8iIHNob3dvdXRwdXQ9Im5vIgorICAgICAgICAgICAgICAgb3V0cHV0dG9mb3JtYXR0ZXJzPSJubyIvPgorICAgIDxhc3NlcnQtbG9nLW5vdC1jb250YWlucy8+CisgICAgPGFzc2VydC1maWxlLW5vdC1jb250YWlucy8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1zaG93LW5vLWZvcm1hdHRlcnMteWVzIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICA8cnVuLWp1bml0IGZvcms9InllcyIgc2hvd291dHB1dD0ibm8iCisgICAgICAgICAgICAgICBvdXRwdXR0b2Zvcm1hdHRlcnM9InllcyIvPgorICAgIDxhc3NlcnQtbG9nLW5vdC1jb250YWlucy8+CisgICAgPGFzc2VydC1maWxlLWNvbnRhaW5zLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXNob3ctbm8tZm9ybWF0dGVycy15ZXMtZm9yay1ubyIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgPHJ1bi1qdW5pdCBmb3JrPSJubyIgc2hvd291dHB1dD0ibm8iCisgICAgICAgICAgICAgICBvdXRwdXR0b2Zvcm1hdHRlcnM9InllcyIvPgorICAgIDxhc3NlcnQtbG9nLW5vdC1jb250YWlucy8+CisgICAgPGFzc2VydC1maWxlLWNvbnRhaW5zLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbGwiPgorICAgIDxhdTphbnR1bml0PgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHthbnQuZmlsZX0iLz4KKyAgICAgIDxhdTpwbGFpbmxpc3RlbmVyLz4KKyAgICA8L2F1OmFudHVuaXQ+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L3NyYy9FeGFtcGxlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvc3JjL0V4YW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlNWNhMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L3NyYy9FeGFtcGxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBFeGFtcGxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG8oKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gRnJvbSBUZXN0Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L3NjcmlwdGRlZi10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9zY3JpcHRkZWYtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiMGMwNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9zY3JpcHRkZWYtdGVzdC54bWwKQEAgLTAsMCArMSwxMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0iYW50dW5pdCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKworICA8aW1wb3J0IGZpbGU9Ii4uLy4uLy4uL2FudHVuaXQtYmFzZS54bWwiLz4JCisJCisgIDxkZXNjcmlwdGlvbj4KKyAgICBJbiB3aGljaCB3ZSB0ZXN0IGludGVyZXN0aW5nIGFzcGVjdHMgb2Ygc2NyaXB0aW5nLgorICAgIFRoZSB0YXJnZXRlZCBsYW5ndWFnZSBpcyBqYXZhc2NyaXB0OyB0aGlzIGxldHMgdXMgcnVuIHdpdGhvdXQKKyAgICBhZGRpdGlvbnMgb24gSmF2YTYrLgorICA8L2Rlc2NyaXB0aW9uPgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgIDwvdGFyZ2V0PgorCisgIDxjb25kaXRpb24gcHJvcGVydHk9InByZXJlcXMtb2siPgorICAgIDxvcj4KKyAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyIi8+CisgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZU1hbmFnZXIiLz4KKyAgICA8L29yPgorICA8L2NvbmRpdGlvbj4KKworICA8cHJvcGVydHkgbmFtZT0ic2NyaXB0Lm1hbmFnZXIiIHZhbHVlPSJhdXRvIiAvPgorCisgIDxzdHJpbmcgaWQ9InNjcmlwdC5jb2RlIj4KKyAgICBzZWxmLmxvZygiQW50IHZlcnNpb24gPSR7YW50LnZlcnNpb259Iik7CisgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgicHJvcGVydHkiLCJsaXZlIik7CisgIDwvc3RyaW5nPgorCisgIDxwcmVzZXRkZWYgbmFtZT0ianMiPgorICAgIDxzY3JpcHRkZWYgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIG5hbWU9InNjcmlwdHRlc3QiCisgICAgICAgIG1hbmFnZXI9IiR7c2NyaXB0Lm1hbmFnZXJ9Ij4KKyAgICAgIDwhLS0gb3B0aW9uYWwgcHJvcGVydHkgYXR0cmlidXRlLS0+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiAvPgorICAgIDwvc2NyaXB0ZGVmPgorICA8L3ByZXNldGRlZj4KKworICA8cHJvcGVydHkgbmFtZT0icHJvcCIKKyAgICAgIHZhbHVlPSdzZWxmLmxvZygiQW50IHZlcnNpb24gPSR7YW50LnZlcnNpb259Iik7cHJvamVjdC5zZXROZXdQcm9wZXJ0eSgicHJvcGVydHkiLCJsaXZlIik7JyAvPgorCisgIDxwcmVzZXRkZWYgbmFtZT0iYXNzZXJ0UHJvcFNldCI+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9InByb3BlcnR5IiB2YWx1ZT0ibGl2ZSIgLz4KKyAgPC9wcmVzZXRkZWY+CisKKworICA8IS0tcHVyZWx5IHRvIHRlc3QgdGhhdCBldmVyeXRoaW5nIHdvcmtzIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RJbmxpbmUiIGlmPSJwcmVyZXFzLW9rIj4KKyAgICA8anM+c2VsZi5sb2coIkhlbGxvIik7PC9qcz4KKyAgICA8c2NyaXB0dGVzdC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFN0cmluZ1Jlc291cmNlIiBpZj0icHJlcmVxcy1vayI+CisgICAgPGpzPgorICAgICAgPHN0cmluZyB2YWx1ZT0nc2VsZi5sb2coIkFudCB2ZXJzaW9uID0ke2FudC52ZXJzaW9ufSIpOycgLz4KKyAgICA8L2pzPgorICAgIDxzY3JpcHR0ZXN0Lz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U3RyaW5nUmVzb3VyY2VSZWYiIGlmPSJwcmVyZXFzLW9rIj4KKyAgICA8anM+CisgICAgICA8c3RyaW5nIHJlZmlkPSJzY3JpcHQuY29kZSIgLz4KKyAgICA8L2pzPgorICAgIDxzY3JpcHR0ZXN0Lz4KKyAgICA8YXNzZXJ0UHJvcFNldCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RTdHJpbmdSZXNvdXJjZUlubGluZSIgaWY9InByZXJlcXMtb2siPgorICAgIDxqcz4KKyAgICAgIDxzdHJpbmc+CisgICAgICAgIHNlbGYubG9nKCJBbnQgdmVyc2lvbiA9JHthbnQudmVyc2lvbn0iKTsKKyAgICAgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgicHJvcGVydHkiLCJsaXZlIik7CisgICAgICA8L3N0cmluZz4KKyAgICA8L2pzPgorICAgIDxzY3JpcHR0ZXN0Lz4KKyAgICA8YXNzZXJ0UHJvcFNldC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFByb3BlcnR5UmVzb3VyY2UiIGlmPSJwcmVyZXFzLW9rIj4KKyAgICA8anM+CisgICAgICA8cHJvcGVydHlyZXNvdXJjZSBuYW1lPSJwcm9wIiAvPgorICAgIDwvanM+CisgICAgPHNjcmlwdHRlc3QvPgorICAgIDxhc3NlcnRQcm9wU2V0Lz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TWl4ZWRSZXNvdXJjZXMiIGlmPSJwcmVyZXFzLW9rIj4KKyAgICA8anM+CisgICAgICA8c3RyaW5nIHJlZmlkPSJzY3JpcHQuY29kZSIgLz4KKyAgICAgIDxwcm9wZXJ0eXJlc291cmNlIG5hbWU9InByb3AiIC8+CisgICAgICA8c3RyaW5nID4KKyAgICAgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgicHJvcGVydHkyIiwibGl2ZSIpOworICAgICAgPC9zdHJpbmc+CisgICAgPC9qcz4KKyAgICA8c2NyaXB0dGVzdC8+CisgICAgPGFzc2VydFByb3BTZXQgbmFtZT0icHJvcGVydHkyIiAvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvc3ltbGluay10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvc3ltbGluay10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTViYTMzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9zeW1saW5rLXRlc3QueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJzeW1saW5rLXRlc3QiCisgICAgZGVmYXVsdD0iYW50dW5pdCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKyAgPGltcG9ydCBmaWxlPSIuLi8uLi8uLi9hbnR1bml0LWJhc2UueG1sIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249ImJ1aWxkIiAvPgorCisgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImlzVW5peCI+CisgICAgICA8b3MgZmFtaWx5PSJ1bml4IiAvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im9zIj4KKworICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ1bml4Ij4KKyAgICAgIDxvcyBmYW1pbHk9InVuaXgiIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPHByb3BlcnR5IG5hbWU9ImZpbGVfcmVmIgorICAgICAgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9maWxlIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhhbmdpbmdfcmVmIgorICAgICAgICBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2hhbmdpbmdfcmVmIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0ib3MiIGlmPSJ1bml4Ij4KKyAgICA8dG91Y2ggZmlsZT0iJHtmaWxlX3JlZn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVhckRvd24iPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENyZWF0ZURvdWJsZSIgZGVwZW5kcz0iaW5pdCIgaWY9InVuaXgiPgorICAgIDxzeW1saW5rIG92ZXJ3cml0ZT0idHJ1ZSIgbGluaz0iJHtidWlsZC5kaXJ9L2xpbmsiCisgICAgICAgIHJlc291cmNlPSIke2ZpbGVfcmVmfSIvPgorICAgIDxzeW1saW5rIG92ZXJ3cml0ZT0idHJ1ZSIgbGluaz0iJHtidWlsZC5kaXJ9L2xpbmsiCisgICAgICAgIHJlc291cmNlPSIke2ZpbGVfcmVmfSIvPgorICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0idGVzdENyZWF0ZURvdWJsZUhhbmdpbmciIGRlcGVuZHM9ImluaXQiIGlmPSJ1bml4Ij4KKyAgICA8c3ltbGluayBvdmVyd3JpdGU9InRydWUiIGxpbms9IiR7YnVpbGQuZGlyfS9saW5rMiIKKyAgICAgICAgcmVzb3VyY2U9IiR7aGFuZ2luZ19yZWZ9Ii8+CisgICAgPHN5bWxpbmsgb3ZlcndyaXRlPSJ0cnVlIiBsaW5rPSIke2J1aWxkLmRpcn0vbGluazIiCisgICAgICAgIHJlc291cmNlPSIke2hhbmdpbmdfcmVmfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDcmVhdGVPdmVyRmlsZSIgZGVwZW5kcz0iaW5pdCIgaWY9InVuaXgiPgorICAgIDx0b3VjaCBmaWxlPSIke2J1aWxkLmRpcn0vbGluazMiIC8+CisgICAgPHN5bWxpbmsgb3ZlcndyaXRlPSJ0cnVlIiBsaW5rPSIke2J1aWxkLmRpcn0vbGluazMiCisgICAgICAgIHJlc291cmNlPSIke2ZpbGVfcmVmfSIvPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcGF0aGNvbnZlcnQtdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wYXRoY29udmVydC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjgzYWZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcGF0aGNvbnZlcnQtdGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbnR1bml0IiB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWRpci1jaGFyIj4KKyAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9ImRlZnxnaGkiIGRpcnNlcD0ifCI+CisgICAgICA8bWFwIGZyb209IiR7YmFzZWRpcn0vYWJjLyIgdG89JycvPgorICAgICAgPHBhdGggbG9jYXRpb249ImFiYy9kZWYvZ2hpIi8+CisgICAgPC9wYXRoY29udmVydD4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0iJHtkZWZ8Z2hpfSIgYXJnMj0iZGVmfGdoaSIvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Byb3BlcnR5aGVscGVyLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcHJvcGVydHloZWxwZXItdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiYTY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Byb3BlcnR5aGVscGVyLXRlc3QueG1sCkBAIC0wLDAgKzEsMTI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDwhLS0gZWFjaCB0ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIFByb3BlcnR5RXZhbHVhdG9yIGRlbGVnYXRlIHdvcmtzIC0tPgorICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiIC8+CisKKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0icHJlcmVxcy1vayIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyIi8+CisKKyAgPHRhcmdldCBuYW1lPSJzZXRVcCIgdW5sZXNzPSJzZXR1cC5jb21wbGV0ZSIgaWY9InByZXJlcXMtb2siPgorICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImJlYW5zaGVsbCIgbWFuYWdlcj0iYnNmIj4KKyAgICAgIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlcjsKKyAgICAgIHB1YmxpYyBjbGFzcyBNYXBFdmFsdWF0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eUhlbHBlci5Qcm9wZXJ0eUV2YWx1YXRvciB7CisgICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcHVibGljIE1hcEV2YWx1YXRvcigpIHsKKyAgICAgICAgICBtYXAucHV0KCJzdHJpbmciLCAic3RyaW5nIik7CisgICAgICAgICAgbWFwLnB1dCgib2JqZWN0IiwgbmV3IE9iamVjdCgpKTsKKyAgICAgICAgICBtYXAucHV0KCJpbnQiLCBuZXcgSW50ZWdlcigxKSk7CisgICAgICAgICAgbWFwLnB1dCgibnVsbCIsIG51bGwpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoU3RyaW5nIHByb3BlcnR5LCBQcm9wZXJ0eUhlbHBlciBwcm9wZXJ0eUhlbHBlcikgeworICAgICAgICAgIHJldHVybiBtYXAuZ2V0KHByb3BlcnR5LnRvTG93ZXJDYXNlKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgibWFwRXZhbHVhdG9yIiwgbmV3IE1hcEV2YWx1YXRvcigpKTsKKyAgICA8L3NjcmlwdD4KKyAgICA8cHJvcGVydHloZWxwZXI+CisgICAgICA8ZGVsZWdhdGUgcmVmaWQ9Im1hcEV2YWx1YXRvciIgLz4KKyAgICA8L3Byb3BlcnR5aGVscGVyPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXR1cC5jb21wbGV0ZSIgdmFsdWU9InRydWUiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFZhbHVlVHlwZXMiIGRlcGVuZHM9InNldFVwIiBpZj0icHJlcmVxcy1vayI+CisgICAgPCEtLSB2ZXJpZnkgQkMsIHN0cmluZ3MgLS0+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9InN0cmluZyIgdmFsdWU9IiR7U1RSSU5HfSIgLz4KKworICAgIDwhLS0gdmVyaWZ5IG5vbi1zdHJpbmcgcHJvcGVydGllcyAtLT4KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlFcXVhbHMgbmFtZT0ib2JqZWN0IiB2YWx1ZT0iJHtPQkpFQ1R9IiAvPgorICAgIDxhdTphc3NlcnRQcm9wZXJ0eUVxdWFscyBuYW1lPSJpbnQiIHZhbHVlPSIke0lOVH0iIC8+CisKKyAgICA8IS0tIHZlcmlmeSB0aGF0IGEgc3RyaW5nIGNvbnRhaW5pbmcgbm90aGluZyBidXQgYSBwcm9wZXJ0eSByZWZlcmVuY2UgaXMgYSB2YWxpZCB2YWx1ZSAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0ic3RyaW5nMiIgdmFsdWU9IiR7c3RyaW5nfSIgLz4KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlFcXVhbHMgbmFtZT0ic3RyaW5nMiIgdmFsdWU9IiR7c3RyaW5nfSIgLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJvYmplY3QyIiB2YWx1ZT0iJHtvYmplY3R9IiAvPgorICAgIDwhLS0gZGVtb25zdHJhdGUgdGhhdCBlcXVhbHMgYXJncyBjYW4gYmUgbm9uLXN0cmluZyAtLT4KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlFcXVhbHMgbmFtZT0ib2JqZWN0MiIgdmFsdWU9IiR7b2JqZWN0fSIgLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJpbnQyIiB2YWx1ZT0iJHtpbnR9IiAvPgorICAgIDxhdTphc3NlcnRQcm9wZXJ0eUVxdWFscyBuYW1lPSJpbnQyIiB2YWx1ZT0iJHtpbnR9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3ROdWxsIiBkZXBlbmRzPSJzZXRVcCIgaWY9InByZXJlcXMtb2siPgorICAgIDwhLS0gZGVtb25zdHJhdGUgdGhhdCBhIG51bGwgdmFsdWUgYWx3YXlzIGltcGxpZXMgYSBub25leGlzdGVudCBwcm9wZXJ0eSAtLT4KKyAgICA8YXU6YXNzZXJ0RmFsc2U+CisgICAgICA8aXNzZXQgcHJvcGVydHk9Im51bGwiIC8+CisgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QXZhaWxhYmxlIiBkZXBlbmRzPSJzZXRVcCIgaWY9InByZXJlcXMtb2siPgorICAgIDwhLS0gdmVyaWZ5IHRoZSBhdmFpbGFibGUgdGFzayBjYW4gc2V0IGEgbm9uLXN0cmluZyBwcm9wZXJ0eSAtLT4KKyAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YW50LmZpbGV9IiB0eXBlPSJmaWxlIiBwcm9wZXJ0eT0iYXZhaWxhYmxlLnN0cmluZyIgdmFsdWU9ImJjIiAvPgorICAgIDxhdTphc3NlcnRQcm9wZXJ0eUVxdWFscyBuYW1lPSJhdmFpbGFibGUuc3RyaW5nIiB2YWx1ZT0iYmMiIC8+CisgICAgPGF2YWlsYWJsZSBmaWxlPSIke2FudC5maWxlfSIgdHlwZT0iZmlsZSIgcHJvcGVydHk9ImF2YWlsYWJsZS5vYmplY3QiIHZhbHVlPSIke29iamVjdH0iIC8+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9ImF2YWlsYWJsZS5vYmplY3QiIHZhbHVlPSIke09CSkVDVH0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENvbmRpdGlvbiIgZGVwZW5kcz0ic2V0VXAiIGlmPSJwcmVyZXFzLW9rIj4KKyAgICA8IS0tIHZlcmlmeSB0aGUgY29uZGl0aW9uIHRhc2sgY2FuIHNldCBhIG5vbi1zdHJpbmcgcHJvcGVydHkgLS0+CisgICAgPGVjaG8+JCR7YW50LmZpbGV9PSR7YW50LmZpbGV9PC9lY2hvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbmRpdGlvbi50cnVlLnN0cmluZyI+CisgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YW50LmZpbGV9IiB0eXBlPSJmaWxlIiAvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxhdTphc3NlcnRQcm9wZXJ0eUVxdWFscyBuYW1lPSJjb25kaXRpb24udHJ1ZS5zdHJpbmciIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbmRpdGlvbi5lbHNlLnN0cmluZyIgdmFsdWU9InRydWUiIGVsc2U9ImZhbHNlIj4KKyAgICAgIDxub3Q+PGF2YWlsYWJsZSBmaWxlPSIke2FudC5maWxlfSIgdHlwZT0iZmlsZSIgLz48L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlFcXVhbHMgbmFtZT0iY29uZGl0aW9uLmVsc2Uuc3RyaW5nIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29uZGl0aW9uLnRydWUub2JqZWN0IiB2YWx1ZT0iJHtvYmplY3R9Ij4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHthbnQuZmlsZX0iIHR5cGU9ImZpbGUiIC8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9ImNvbmRpdGlvbi50cnVlLm9iamVjdCIgdmFsdWU9IiR7T0JKRUNUfSIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb25kaXRpb24uZWxzZS5pbnQiIHZhbHVlPSIke29iamVjdH0iIGVsc2U9IiR7aW50fSI+CisgICAgICA8bm90PjxhdmFpbGFibGUgZmlsZT0iJHthbnQuZmlsZX0iIHR5cGU9ImZpbGUiIC8+PC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9ImNvbmRpdGlvbi5lbHNlLmludCIgdmFsdWU9IiR7SU5UfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RW1iZWRkZWROb25TdHJpbmciIGlmPSJwcmVyZXFzLW9rIj4KKyAgICA8IS0tIHZlcmlmeSB0aGF0IGEgcHJvcGVydHkgZW1iZWRkZWQgaW4gYSBzdHJpbmcgaXMgYSBzdWJzdHJpbmcgLS0+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8ZXF1YWxzIGFyZzE9IkAke2ludH1AIiBhcmcyPSJAMUAiIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RMb2FkUHJvcGVydGllcyIgaWY9InByZXJlcXMtb2siPgorICAgIDxhdTphc3NlcnRGYWxzZT4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0ib2JqZWN0MiIgLz4KKyAgICA8L2F1OmFzc2VydEZhbHNlPgorICAgIDxzdHJpbmcgaWQ9InByb3BzIiB2YWx1ZT0ib2JqZWN0Mj0kJHtvYmplY3R9IiAvPgorICAgIDwhLS0gdmVyaWZ5IHRoZSBwcm9wZXJ0eSBpcyBub3QgeWV0IGV4cGFuZGVkIC0tPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGxlbmd0aCBsZW5ndGg9IjE3Ij4KKyAgICAgICAgPHJlc291cmNlIHJlZmlkPSJwcm9wcyIgLz4KKyAgICAgIDwvbGVuZ3RoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8bG9hZHByb3BlcnRpZXM+CisgICAgICA8cmVzb3VyY2UgcmVmaWQ9InByb3BzIiAvPgorICAgIDwvbG9hZHByb3BlcnRpZXM+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9Im9iamVjdDIiIHZhbHVlPSIke29iamVjdH0iIC8+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9Im9iamVjdDIiIHZhbHVlPSIke09CSkVDVH0iIC8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9yZXRyeS10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3JldHJ5LXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YWUwNjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9yZXRyeS10ZXN0LnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InJldHJ5LXRlc3QiIGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+DQorICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiLz4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdC1mYWlsLWFuZC1yZXRyeSI+DQorICAgIDxwcm9wZXJ0eSBuYW1lPSJpIiB2YWx1ZT0iMyIvPg0KKyAgICA8cHJvcGVydHkgbmFtZT0iZGVzdCIgdmFsdWU9IiR7amF2YS5pby50bXBkaXJ9L2Rlc3QiLz4NCisgICAgPCEtLSBqdXN0IGluIGNhc2UgdGhpcyBldmVyIGJlY29tZXMgYSBsZWdpdCB1cmwuLi4gLS0+DQorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSJodHRwOi8vaW9qYXNvZGpvamFvc2RqIi8+DQorICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0iVGFzayBbZ2V0XSBmYWlsZWQgYWZ0ZXIgWyR7aX1dIGF0dGVtcHRzOyBnaXZpbmcgdXAiPg0KKyAgICAgIDxyZXRyeSByZXRyeWNvdW50PSIke2l9Ij4NCisgICAgICAgIDxnZXQgc3JjPSIke3NyY30iIGRlc3Q9IiR7ZGVzdH0iLz4NCisgICAgICA8L3JldHJ5Pg0KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+DQorICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSJBdHRlbXB0IFsxXTogZXJyb3Igb2NjdXJyZWQ7IHJldHJ5aW5nLi4uIi8+DQorICA8L3RhcmdldD4NCisNCisgIDx0YXJnZXQgbmFtZT0idGVzdC1zdWNjZXNzIj4NCisgICAgPHByb3BlcnR5IG5hbWU9ImkiIHZhbHVlPSIzIi8+DQorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXN0IiB2YWx1ZT0iJHtqYXZhLmlvLnRtcGRpcn0vZGVzdCIvPg0KKyAgICA8cmV0cnkgcmV0cnljb3VudD0iJHtpfSI+DQorICAgICAgPHRvdWNoIGZpbGU9IiR7ZGVzdH0iLz4NCisgICAgPC9yZXRyeT4NCisgICAgPGF1OmFzc2VydExvZ0RvZXNudENvbnRhaW4gdGV4dD0iQXR0ZW1wdCBbMV06IGVycm9yIG9jY3VycmVkOyByZXRyeWluZy4uLiIvPg0KKyAgPC90YXJnZXQ+DQorDQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3N1YmFudC10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3N1YmFudC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmM5MjViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvc3ViYW50LXRlc3QueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0iYW50dW5pdCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKworICA8ZGVzY3JpcHRpb24+CisgICAgVGVzdCB0aGF0IHN1YmFudCBwcm9wZXJseSBzZXRzIHZhcmlvdXMgcHJvcGVydGllcworICA8L2Rlc2NyaXB0aW9uPgorICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBmaWxlPSJiaW5hcnlBcHBlbmREZXN0IiAvPgorICAgIDxkZWxldGUgZmlsZT0iZW5jb2RlU3RyaW5nRGVzdCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhc3NlcnRQcm9wZXJ0aWVzIj4KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlTZXQgbmFtZT0iYW50LnZlcnNpb24iIC8+CisgICAgPGF1OmFzc2VydFByb3BlcnR5U2V0IG5hbWU9ImphdmEuaG9tZSIgLz4KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlTZXQgbmFtZT0iamF2YS5jbGFzcy5wYXRoIiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RBbnRWZXJzaW9uIj4KKyAgICA8c3ViYW50IGluaGVyaXRhbGw9ImZhbHNlIiB0YXJnZXQ9ImFzc2VydFByb3BlcnRpZXMiPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHthbnQuZmlsZX0iIC8+CisgICAgPC9zdWJhbnQ+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdG91Y2gtdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy90b3VjaC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTMyN2VkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdG91Y2gtdGVzdC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRvdWNoLXRlc3QiIGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDxpbXBvcnQgZmlsZT0iLi4vYW50dW5pdC1iYXNlLnhtbCIvPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1uby1jaGlsZCI+CisgICAgPGF1OmV4cGVjdGZhaWx1cmU+CisgICAgICA8dG91Y2ggLz4KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1uby1tYXRjaCI+CisgICAgPHRvdWNoPgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHthbnQuZmlsZX0iPgorICAgICAgICA8ZmlsZW5hbWUgbmFtZT0iSURPTk9UTUFUQ0giIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC90b3VjaD4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3RydW5jYXRlL3RydW5jYXRlLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdHJ1bmNhdGUvdHJ1bmNhdGUtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmODk2YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3RydW5jYXRlL3RydW5jYXRlLXRlc3QueG1sCkBAIC0wLDAgKzEsMTQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRydW5jYXRlLXRlc3QiIGRlZmF1bHQ9ImRlZmF1bHQiCisgICAgICAgICB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorCisgIDx0YXJnZXQgbmFtZT0iZGVmYXVsdCI+CisgICAgPGF1OmFudHVuaXQ+CisgICAgICA8ZmlsZSBmaWxlPSIke2FudC5maWxlfSIgLz4KKyAgICA8L2F1OmFudHVuaXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVhckRvd24iPgorICAgIDxkZWxldGUgZmlsZT0iZm9vIiAvPgorICAgIDxkZWxldGUgZmlsZT0iYmFyIiAvPgorICAgIDxkZWxldGUgZGlyPSJiYXoiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1iYXNpYyI+CisgICAgPHRydW5jYXRlIGZpbGU9ImZvbyIgLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxsZW5ndGggZmlsZT0iZm9vIiBsZW5ndGg9IjAiIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtZXhwbGljaXQiPgorICAgIDx0cnVuY2F0ZSBmaWxlPSJmb28iIGxlbmd0aD0iMTAzNCIgLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxsZW5ndGggZmlsZT0iZm9vIiBsZW5ndGg9IjEwMzQiIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtZXh0ZW5kIj4KKyAgICA8dHJ1bmNhdGUgZmlsZT0iZm9vIiBsZW5ndGg9IjUiIC8+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIGZpbGU9ImZvbyIgbGVuZ3RoPSI1IiAvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8dHJ1bmNhdGUgZmlsZT0iZm9vIiBhZGp1c3Q9IjUiIC8+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIGZpbGU9ImZvbyIgbGVuZ3RoPSIxMCIgLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC10cnVuY2F0ZSI+CisgICAgPHRydW5jYXRlIGZpbGU9ImZvbyIgbGVuZ3RoPSI1IiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGxlbmd0aCBmaWxlPSJmb28iIGxlbmd0aD0iNSIgLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgICAgPHRydW5jYXRlIGZpbGU9ImZvbyIgYWRqdXN0PSItNSIgLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxsZW5ndGggZmlsZT0iZm9vIiBsZW5ndGg9IjAiIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtYmlnZ2VyIj4KKyAgICA8dHJ1bmNhdGUgZmlsZT0iZm9vIiBsZW5ndGg9IjFLIiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGFuZD4KKyAgICAgICAgPGxlbmd0aCBmaWxlPSJmb28iIGxlbmd0aD0iMUsiIC8+CisgICAgICAgIDxsZW5ndGggZmlsZT0iZm9vIiBsZW5ndGg9IjEwMjQiIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idHJ1bmNhdGUtYmlnZ2VyIj4KKyAgICA8dHJ1bmNhdGUgZmlsZT0iZm9vIiBsZW5ndGg9IjNLIiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGxlbmd0aCBmaWxlPSJmb28iIGxlbmd0aD0iM0siIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDx0cnVuY2F0ZSBmaWxlPSJmb28iIGFkanVzdD0iLTJLIiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGxlbmd0aCBmaWxlPSJmb28iIGxlbmd0aD0iMUsiIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Qtbm8tY3JlYXRlIj4KKyAgICA8YXU6YXNzZXJ0RmlsZURvZXNudEV4aXN0IGZpbGU9ImZvbyIgLz4KKyAgICA8dHJ1bmNhdGUgZmlsZT0iZm9vIiBjcmVhdGU9ImZhbHNlIiBsZW5ndGg9IjAiIC8+CisgICAgPGF1OmFzc2VydEZpbGVEb2VzbnRFeGlzdCBmaWxlPSJmb28iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1ta2RpcnMiPgorICAgIDxhdTphc3NlcnRGaWxlRG9lc250RXhpc3QgZmlsZT0iYmF6IiAvPgorICAgIDx0cnVuY2F0ZSBmaWxlPSJiYXovZm9vIiBta2RpcnM9InRydWUiIGxlbmd0aD0iMCIgLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxsZW5ndGggZmlsZT0iYmF6L2ZvbyIgbGVuZ3RoPSIwIiAvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXJjIj4KKyAgICA8dHJ1bmNhdGUgbGVuZ3RoPSIxMCI+CisgICAgICA8cmVzb3VyY2VzPgorICAgICAgICA8ZmlsZSBmaWxlPSJmb28iIC8+CisgICAgICAgIDxmaWxlIGZpbGU9ImJhciIgLz4KKyAgICAgIDwvcmVzb3VyY2VzPgorICAgIDwvdHJ1bmNhdGU+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YW5kPgorICAgICAgICA8bGVuZ3RoIGZpbGU9ImZvbyIgbGVuZ3RoPSIxMCIgLz4KKyAgICAgICAgPGxlbmd0aCBmaWxlPSJiYXIiIGxlbmd0aD0iMTAiIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1iYWQtcmVzb3VyY2UiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlPgorICAgICAgPHRydW5jYXRlIGxlbmd0aD0iMVAiPgorICAgICAgICA8c3RyaW5nIHZhbHVlPSJibGFoIiAvPgorICAgICAgPC90cnVuY2F0ZT4KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1pbnZhbGlkLWF0dHJzIj4KKyAgICA8YXU6ZXhwZWN0ZmFpbHVyZT4KKyAgICAgIDx0cnVuY2F0ZSBmaWxlPSJmb28iIGxlbmd0aD0iMCIgYWRqdXN0PSIwIiAvPgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWJhZC1sZW5ndGgiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlPgorICAgICAgPHRydW5jYXRlIGZpbGU9ImZvbyIgbGVuZ3RoPSItMVAiIC8+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Qtbm8tZmlsZXMiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlPgorICAgICAgPHRydW5jYXRlIGxlbmd0aD0iMCIgLz4KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91dGYtMTYuZXhwZWN0ZWQgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91dGYtMTYuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M3YzJhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3V0Zi0xNi5leHBlY3RlZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91dGYtMTYuZXhwZWN0ZWQud2luZG93cyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3V0Zi0xNi5leHBlY3RlZC53aW5kb3dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTM4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91dGYtMTYuZXhwZWN0ZWQud2luZG93cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy93YXItdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy93YXItdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwNzMxNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3dhci10ZXN0LnhtbApAQCAtMCwwICsxLDE3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Indhci10ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJhbnR1bml0IgorICAgICAgIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3b3JraW5nLmRpciIgdmFsdWU9IndvcmtpbmciLz4KKworICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3b3JraW5nLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dvcmtpbmcuZGlyfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ3YXJmaWxlIiBsb2NhdGlvbj0iJHt3b3JraW5nLmRpcn0vdGVzdC53YXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0id2ViLnhtbCIgbG9jYXRpb249IndlYi54bWwiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0id2VieG1sLmdlbmVyYXRlZCIgbG9jYXRpb249IiR7d29ya2luZy5kaXJ9L1dFQi1JTkYvd2ViLnhtbCIvPgorCisgICAgPCEtLWZhaWxpbmcgb24gZHVwbGljYXRlcyBpcyBoYWxmIG91ciB0ZXN0aW5nLS0+CisgICAgPHByZXNldGRlZiBuYW1lPSJta3dhciI+CisgICAgICA8d2FyIGRlc3RmaWxlPSIke3dhcmZpbGV9IiBkdXBsaWNhdGU9ImZhaWwiLz4KKyAgICA8L3ByZXNldGRlZj4KKyAgICA8cHJlc2V0ZGVmIG5hbWU9ImV4cGFuZHdhciI+CisgICAgICA8dW56aXAgc3JjPSIke3dvcmtpbmcuZGlyfS90ZXN0LndhciIgZGVzdD0iJHt3b3JraW5nLmRpcn0iLz4KKyAgICA8L3ByZXNldGRlZj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d29ya2luZy5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS10ZXN0IHRoYXQgeW91IGNhbiBwYXRjaCBhIGZpbGVzZXQgcmVmZXJlbmNlIGludG8gYSBsaWIgZWxlbWVudC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RsaWJyZWZzIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8bWt3YXIgd2VieG1sPSIke3dlYi54bWx9Ij4KKyAgICAgIDxmaWxlc2V0IGlkPSJ0ZXN0IiBkaXI9Ii4iIGluY2x1ZGVzPSJ3ZWIueG1sIi8+CisgICAgICA8bGliIHJlZmlkPSJ0ZXN0Ii8+CisgICAgPC9ta3dhcj4KKyAgICA8ZXhwYW5kd2FyLz4KKyAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIke3dlYnhtbC5nZW5lcmF0ZWR9IiAvPgorICA8L3RhcmdldD4KKworICA8IS0tIAorICBUaGlzIGNoZWNrcyB0aGF0IGFzIG9mIEphdmEgRUUgNSwgdGhlIHdlYi54bWwgYXR0ciBpcyBvcHRpb25hbC4KKyAgSGVyZSB0aGVyZSBpcyBhIHdlYi54bWwsIGluIHRoZSB3ZWJpbmYgZmlsZXNldCwgcmF0aGVyIHRoYW4gYSBmaWxlc2V0CisgIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RXZWJYbWxJbldlYmluZiIgZGVwZW5kcz0iaW5pdCI+CisgICAgPG1rd2FyPgorICAgICAgPHdlYmluZiBkaXI9Ii4iIGluY2x1ZGVzPSJ3ZWIueG1sIi8+CisgICAgPC9ta3dhcj4KKyAgICA8ZXhwYW5kd2FyLz4KKyAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIke3dlYnhtbC5nZW5lcmF0ZWR9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RXZWJYbWxNaXNzaW5nRnJvbVVwZGF0ZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPG1rd2FyIHdlYnhtbD0iJHt3ZWIueG1sfSIgLz4KKyAgICA8IS0tIHRoZXJlIGlzIG5vIHdlYi54bWwgZmlsZSwgYnV0IHRoYXQgaXMgb2ssIGFzCisgICAgICB3ZSBhcmUgdXBkYXRpbmcgLS0+CisgICAgPG1rd2FyIHVwZGF0ZT0idHJ1ZSI+CisgICAgICA8Y2xhc3NlcyBkaXI9Ii4iIGluY2x1ZGVzPSJ3ZWIueG1sIi8+CisgICAgPC9ta3dhcj4KKyAgICA8ZXhwYW5kd2FyLz4KKyAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIke3dlYnhtbC5nZW5lcmF0ZWR9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RXZWJYbWxJbkltcGxpY2l0VXBkYXRlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8bWt3YXIgd2VieG1sPSIke3dlYi54bWx9IiAvPgorICAgIDwhLS0gd2hlbiB3ZSBhcmUgaW1wbGljaXRseSB1cGRhdGluZywgdGhlIHdlYi54bWwgZmlsZSBkb2VzIG5vdCBnZXQKKyAgICAgcHVsbGVkIGluLCBidXQgdGhlIGNvbW1hbmQgc3RpbGwgc3VjY2VlZHMuLS0+CisgICAgPG1rd2FyIHdlYnhtbD0iJHt3ZWIueG1sfSIgPgorICAgICAgPGNsYXNzZXMgZGlyPSIuIiBpbmNsdWRlcz0id2ViLnhtbCIvPgorICAgIDwvbWt3YXI+CisgICAgPGV4cGFuZHdhci8+CisgICAgPGF1OmFzc2VydEZpbGVFeGlzdHMgZmlsZT0iJHt3ZWJ4bWwuZ2VuZXJhdGVkfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJOb3Rlc3RXZWJYbWxGaWxlc2V0SW5JbXBsaWNpdFVwZGF0ZSIgZGVwZW5kcz0iaW5pdCI+CisgICAgPG1rd2FyIHdlYnhtbD0iJHt3ZWIueG1sfSIgLz4KKyAgICA8IS0tIHdoZW4gd2UgYXJlIGltcGxpY2l0bHkgdXBkYXRpbmcsIHRoZSB3ZWIueG1sIGZpbGUgZG9lcyBub3QgZ2V0CisgICAgIHB1bGxlZCBpbiwgYnV0IHRoZSBjb21tYW5kIHN0aWxsIHN1Y2NlZWRzLi0tPgorICAgIDxta3dhciA+CisgICAgICA8d2ViaW5mIGRpcj0iLiIgaW5jbHVkZXM9IndlYi54bWwiLz4KKyAgICA8L21rd2FyPgorICAgIDxleHBhbmR3YXIvPgorICAgIDxhdTphc3NlcnRGaWxlRXhpc3RzIGZpbGU9IiR7d2VieG1sLmdlbmVyYXRlZH0iIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RHVwbGljYXRlV2ViWG1sIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8bWt3YXIgd2VieG1sPSIke3dlYi54bWx9IiA+CisgICAgICA8d2ViaW5mIGRpcj0iLiIgaW5jbHVkZXM9IndlYi54bWwiLz4KKyAgICAgIDx3ZWJpbmYgZmlsZT0iJHt3ZWIueG1sfSIvPgorICAgICAgPHppcGZpbGVzZXQgZmlsZT0iJHt3ZWIueG1sfSIgcHJlZml4PSJXRUItSU5GIi8+CisgICAgPC9ta3dhcj4KKyAgICA8ZXhwYW5kd2FyLz4KKyAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIke3dlYnhtbC5nZW5lcmF0ZWR9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3REaWZmZXJlbnREdXBsaWNhdGVXZWJYbWwiIGRlcGVuZHM9ImluaXQiPgorICAgIDxjb3B5IGZpbGU9IiR7d2ViLnhtbH0iIHRvZGlyPSIke3dvcmtpbmcuZGlyfSIgLz4KKyAgICA8bWt3YXIgd2VieG1sPSIke3dlYi54bWx9IiA+CisgICAgICA8d2ViaW5mIGRpcj0iJHt3b3JraW5nLmRpcn0iIGluY2x1ZGVzPSJ3ZWIueG1sIi8+CisgICAgICA8d2ViaW5mIGZpbGU9IiR7d2ViLnhtbH0iLz4KKyAgICAgIDx6aXBmaWxlc2V0IGZpbGU9IiR7d2ViLnhtbH0iIHByZWZpeD0iV0VCLUlORiIvPgorICAgIDwvbWt3YXI+CisgICAgPGV4cGFuZHdhci8+CisgICAgPGF1OmFzc2VydEZpbGVFeGlzdHMgZmlsZT0iJHt3ZWJ4bWwuZ2VuZXJhdGVkfSIgLz4KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iVGhlIGR1cGxpY2F0ZSBlbnRyeSBpcyIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0KKyAgICB0aGlzIHRhcmdldCBkb2VzIG5vdCBoYXZlIGEgd2ViLnhtbCBmaWxlLgorICAgIEluc3RlYWQgaXQgcHVsbHMgaW4KKyAgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdFdlYlhtbE9wdGlvbmFsIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8bWt3YXIgbmVlZHhtbGZpbGU9ImZhbHNlIj4KKyAgICAgIDxjbGFzc2VzIGRpcj0iLiIgaW5jbHVkZXM9IndlYi54bWwiLz4KKyAgICA8L21rd2FyPgorICAgIDxleHBhbmR3YXIvPgorICAgIDxhdTphc3NlcnRGaWxlRXhpc3RzIGZpbGU9IiR7d29ya2luZy5kaXJ9L1dFQi1JTkYvY2xhc3Nlcy93ZWIueG1sIiAvPgorICAgIDxhdTphc3NlcnRGYWxzZT4KKyAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHt3ZWJ4bWwuZ2VuZXJhdGVkfSIgLz4KKyAgICA8L2F1OmFzc2VydEZhbHNlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RXZWJYbWxPcHRpb25hbEZhaWx1cmUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlPgorICAgICAgPG1rd2FyID4KKyAgICAgICAgPGNsYXNzZXMgZGlyPSIuIiBpbmNsdWRlcz0id2ViLnhtbCIvPgorICAgICAgPC9ta3dhcj4KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFdlYlhtbE9wdGlvbmFsRmFpbHVyZTIiIGRlcGVuZHM9ImluaXQiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlPgorICAgICAgPG1rd2FyICBuZWVkeG1sZmlsZT0idHJ1ZSI+CisgICAgICAgIDxjbGFzc2VzIGRpcj0iLiIgaW5jbHVkZXM9IndlYi54bWwiLz4KKyAgICAgIDwvbWt3YXI+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RDbGFzc2VzRWxlbWVudCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPG1rd2FyIG5lZWR4bWxmaWxlPSJmYWxzZSI+CisgICAgICA8Y2xhc3NlcyBkaXI9Ii4iIGluY2x1ZGVzPSJ3ZWIueG1sIi8+CisgICAgPC9ta3dhcj4KKyAgICA8ZXhwYW5kd2FyLz4KKyAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIke3dvcmtpbmcuZGlyfS9XRUItSU5GL2NsYXNzZXMvd2ViLnhtbCIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TGliRWxlbWVudCIgZGVwZW5kcz0iaW5pdCI+CisgICAgPG1rd2FyIG5lZWR4bWxmaWxlPSJmYWxzZSI+CisgICAgICA8bGliIGRpcj0iLiIgaW5jbHVkZXM9IndlYi54bWwiLz4KKyAgICA8L21rd2FyPgorICAgIDxleHBhbmR3YXIvPgorICAgIDxhdTphc3NlcnRGaWxlRXhpc3RzIGZpbGU9IiR7d29ya2luZy5kaXJ9L1dFQi1JTkYvbGliL3dlYi54bWwiIC8+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy93ZWIueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ2MjVhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvd2ViLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAgICAgICAgIHZlcnNpb249IjIuNSIgbWV0YWRhdGEtY29tcGxldGU9InRydWUiPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy93aGljaHJlc291cmNlLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvd2hpY2hyZXNvdXJjZS10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjlmYmZlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvd2hpY2hyZXNvdXJjZS10ZXN0LnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDxpbXBvcnQgZmlsZT0iLi4vYW50dW5pdC1iYXNlLnhtbCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0iYW50LWJ1aWxkIiBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLWRpciIgCisgICAgICAgICAgICBsb2NhdGlvbj0iJHthbnQtYnVpbGR9L2FudC11bml0L3doaWNocmVzb3VyY2UvYnVpbGQiLz4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgIDxkZWxldGUgcXVpZXQ9InllcyIgZGlyPSIke2J1aWxkLWRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLWRpcn0iLz4KKyAgICA8amF2YWMgc3JjZGlyPSJqYXZhYy1kaXIvZ29vZC1zcmMiIGRlc3RkaXI9IiR7YnVpbGQtZGlyfSIvPgorICAgIDxwYXRoIGlkPSJ3aGljaHJlc291cmNlLWJ1aWxkIiBwYXRoPSIke2J1aWxkLWRpcn0iLz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9InRlc3QtcmVmZXJlbmNlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8d2hpY2hyZXNvdXJjZQorICAgICAgcHJvcGVydHk9IndoaWNocmVzb3VyY2UucHJvcCIKKyAgICAgIGNsYXNzPSJTaW1wbGUiCisgICAgICBjbGFzc3BhdGhyZWY9IndoaWNocmVzb3VyY2UtYnVpbGQiLz4KKworICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHt3aGljaHJlc291cmNlLnByb3B9IgorICAgICAgICAgICAgICAgIHN1YnN0cmluZz0iU2ltcGxlLmNsYXNzIi8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Qtbm90LXByZXNlbnQiIGRlcGVuZHM9ImluaXQiPgorICAgIDx3aGljaHJlc291cmNlCisgICAgICBwcm9wZXJ0eT0id2hpY2hyZXNvdXJjZTIucHJvcCIKKyAgICAgIGNsYXNzPSJDbGFzc05vdFByZXNlbnQiCisgICAgICBjbGFzc3BhdGhyZWY9IndoaWNocmVzb3VyY2UtYnVpbGQiLz4KKworICAgIDxhdTphc3NlcnRGYWxzZT4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0id2hpY2hyZXNvdXJjZS5wcm9wMiIvPgorICAgIDwvYXU6YXNzZXJ0RmFsc2U+CisgIDwvdGFyZ2V0PgorICAgIAorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMveG1scHJvcGVydHktdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy94bWxwcm9wZXJ0eS10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNjOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMveG1scHJvcGVydHktdGVzdC54bWwKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorICA8ZGVzY3JpcHRpb24vPgorICA8dGFyZ2V0IG5hbWU9InRlc3QtZW1wdHkiPgorICAgIDx4bWxwcm9wZXJ0eSBmaWxlPSJ4bWxwcm9wZXJ0eS10ZXN0LnhtbCIvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGVxdWFscyBhcmcxPSIiIGFyZzI9IiR7cHJvamVjdC5kZXNjcmlwdGlvbn0iLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1tdWx0aSI+CisgICAgPHByb3BlcnR5IG5hbWU9InJvb3QuZWxlbWVudC52YWx1ZSIgdmFsdWU9Im9yaWdpbmFsIi8+CisgICAgPHhtbHByb3BlcnR5IGZpbGU9InhtbHByb3BlcnR5Lm11bHRpLnhtbCIgY29sbGFwc2VBdHRyaWJ1dGVzPSJ5ZXMiLz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0ib3JpZ2luYWwiIGFyZzI9IiR7cm9vdC5lbGVtZW50LnZhbHVlfSIvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJsb2FkIj4KKyAgICA8eG1scHJvcGVydHkKKyAgICAgICAgZmlsZT0ieG1scHJvcGVydHkuaW5saW5lLWV4cGFuc2lvbi54bWwiCisgICAgICAgIGNvbGxhcHNlQXR0cmlidXRlcz0idHJ1ZSIKKyAgICAgICAga2VlcFJvb3Q9ImZhbHNlIgorICAgICAgICBzZW1hbnRpY0F0dHJpYnV0ZXM9InRydWUiLz4KKyAgICA8ZWNobz4KKyBlbGVtZW50ICAgICAgZXhwZWN0ZWQgICAgYWN0dWFsCisgICAgcCAgICAgICAgICQke2FwcC5ufSAgICAke2FwcC5wfQorICAgIG4gICAgICAgICAgICBuICAgICAgICAke2FwcC5ufQorICAgIG8gICAgICAgICAgICBuICAgICAgICAke2FwcC5vfQorICAgIG0gICAgICAgICAgICBuICAgICAgICAke2FwcC5tfQorICAgIDwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJOb3Rlc3RJbmxpbmVFeHBhbnNpb24iIGRlcGVuZHM9ImxvYWQiPgorICAgIDxhdTphc3NlcnRQcm9wZXJ0eUVxdWFscyBuYW1lPSJhcHAubSIgdmFsdWU9Im4iLz4KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlFcXVhbHMgbmFtZT0iYXBwLm4iIHZhbHVlPSJuIi8+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9ImFwcC5vIiB2YWx1ZT0ibiIvPgorICAgIDxhdTphc3NlcnRQcm9wZXJ0eUVxdWFscyBuYW1lPSJhcHAucCIgdmFsdWU9IiQke2FwcC5ufSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXF1ZW5jZSIgdmFsdWU9IiR7YXBwLm19JHthcHAubn0ke2FwcC5vfSR7YXBwLnB9Ii8+CisgICAgPGZhaWw+CisgICAgICB4bWwgYXR0cmlidXRlcyBhcmUgbm90IGV4cGFuZGluZyBjb3JyZWN0bHkKKyAgICAgIGV4cGVjdGVkOiBtbm9wPW5ubiQke2FwcC5ufQorICAgICAgYWN0dWFsICAgIG1ub3A9JHtzZXF1ZW5jZX0KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3NlcXVlbmNlfSIgYXJnMj0ibm5uJHthcHAubn0iLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy94bWxwcm9wZXJ0eS5pbmxpbmUtZXhwYW5zaW9uLnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5LmlubGluZS1leHBhbnNpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTUxNzkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy94bWxwcm9wZXJ0eS5pbmxpbmUtZXhwYW5zaW9uLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxyb290LXRhZz4KKyAgPCEtLXVzZWQgdG8gY2hlY2sgdGhhdCB0aGUgb3JkZXJpbmcgb2YgYXR0cmlidXRlIGV4cGFuc2lvbi9ldmFsIGlzIHRoZSBvcmRlciBvZgorICBkZWNsYXJhdGlvbiBpbiB0aGUgYnVpbGQgZmlsZSwgbm90IGFscGhhYmV0aWNhbAorCisgICAgZXhwZWN0YXRpb25zIGFyZQorICAgICAgcCA6ICR7YXBwLm59CisgICAgICBuIDogbgorICAgICAgbyA6IG4KKyAgICAgIG0gOiBuCisgIC0tPgorICA8YXBwCisgICAgICBwPSIke2FwcC5ufSIKKyAgICAgIG49Im4iCisgICAgICBvPSIke2FwcC5ufSIKKyAgICAgIG09IiR7YXBwLm59Ii8+Cis8L3Jvb3QtdGFnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5Lm11bHRpLnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5Lm11bHRpLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODk5YzU4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMveG1scHJvcGVydHkubXVsdGkueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJvb3Q+CisgICA8ZWxlbWVudCB2YWx1ZT0iYSIgLz4KKyAgIDxlbGVtZW50IHZhbHVlPSJiIiAvPgorPC9yb290PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvYnVpbGQtZW1iZWRkZWQtcmVmLnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2J1aWxkLWVtYmVkZGVkLXJlZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjYmQyYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2J1aWxkLWVtYmVkZGVkLXJlZi54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbGwiPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIvPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvY29uZGl0aW9ucy9pc3JlZmVyZW5jZS10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2NvbmRpdGlvbnMvaXNyZWZlcmVuY2UtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyOWU5MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2NvbmRpdGlvbnMvaXNyZWZlcmVuY2UtdGVzdC54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9ImlzcmVmZXJlbmNlLXRlc3QiIGRlZmF1bHQ9ImFudHVuaXQiCisgICAgICAgICB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorCisgIDxpbXBvcnQgZmlsZT0iLi4vLi4vYW50dW5pdC1iYXNlLnhtbCIgLz4KKworICA8dGFyZ2V0IG5hbWU9Im91dC1vZi1iYW5kIj4KKyAgICA8cGF0aCBpZD0ib3V0LW9mLWJhbmQiIHBhdGg9Ii4iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0T3V0T2ZCYW5kIj4KKyAgICA8YXU6YXNzZXJ0RmFsc2U+CisgICAgICA8aXNyZWZlcmVuY2UgcmVmaWQ9Im91dC1vZi1iYW5kIi8+CisgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0SW5CYW5kIj4KKyAgICA8cGF0aCBpZD0iaW4tYmFuZCIgcGF0aD0iLiIvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGlzcmVmZXJlbmNlIHJlZmlkPSJpbi1iYW5kIi8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvY29uZGl0aW9ucy9tYXRjaGVzLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvY29uZGl0aW9ucy9tYXRjaGVzLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTc0NjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9jb25kaXRpb25zL21hdGNoZXMtdGVzdC54bWwKQEAgLTAsMCArMSwxMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKyAgPCEtLSBOQjogYW50J3MgaW50ZXJmYWNlIHRvIEpESzE0IHJlZ2V4IGVuYWJsZXMgVU5JWF9MSU5FUyAtLT4KKyAgPHByb3BlcnR5IG5hbWU9Ik5MIiB2YWx1ZT0iJiMxMDsiLz4KKyAgPHJlZ2V4cCBpZD0ibXlpZCIgcGF0dGVybj0iXlthLXpdezMsNH0kIi8+CisKKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrMS40KyIgY2xhc3NuYW1lPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIi8+ICAKKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisgICAgPG9yPgorICAgICAgPGlzc2V0IHByb3BlcnR5PSJqZGsxLjQrIi8+CisgICAgICA8aXNzZXQgcHJvcGVydHk9ImFwYWNoZS5yZWdleHAucHJlc2VudCIvPgorICAgICAgPGlzc2V0IHByb3BlcnR5PSJhcGFjaGUub3JvLnByZXNlbnQiLz4KKyAgICA8L29yPgorICA8L2NvbmRpdGlvbj4KKyAgICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXJlZmlkIiBpZj0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bWF0Y2hlcyBzdHJpbmc9ImFiYyI+CisgICAgICAgIDxyZWdleHAgcmVmaWQ9Im15aWQiLz4KKyAgICAgIDwvbWF0Y2hlcz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1zaW1wbGUiIGlmPSJzb21lLnJlZ2V4cC5zdXBwb3J0Ij4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxtYXRjaGVzIHN0cmluZz0iYWJjIiBwYXR0ZXJuPSJeW2Etel17Myw0fSQiLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1ub21hdGNoIiBpZj0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisgICAgPGF1OmFzc2VydEZhbHNlPgorICAgICAgPG1hdGNoZXMgc3RyaW5nPSJhYmMiIHBhdHRlcm49Il5iLioiIC8+CisgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWRhdGUiIGlmPSJzb21lLnJlZ2V4cC5zdXBwb3J0Ij4KKyAgICA8dHN0YW1wPgorICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0idG9kYXkiIHBhdHRlcm49ImRkLU1NLXl5eXkiIGxvY2FsZT0iZW4iLz4KKyAgICA8L3RzdGFtcD4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxtYXRjaGVzIHN0cmluZz0iJHt0b2RheX0iPgorICAgICAgICA8cmVnZXhwIHBhdHRlcm49Il5bMDEyM11cZC1bMDFdXGQtWzEyXVxkXGRcZCQiIC8+CisgICAgICA8L21hdGNoZXM+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtYWJjIiBpZj0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bWF0Y2hlcyBzdHJpbmc9ImFiYyIgcGF0dGVybj0iYWI/Ii8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPG1hdGNoZXMgc3RyaW5nPSJhYmMiIHBhdHRlcm49ImFiLiIvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxtYXRjaGVzIHN0cmluZz0iYWIiIHBhdHRlcm49ImFiPyIvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxtYXRjaGVzIHN0cmluZz0iYWIiIHBhdHRlcm49ImFiIi8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPG1hdGNoZXMgc3RyaW5nPSJhY2IiIHBhdHRlcm49ImFiPyIvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8YXU6YXNzZXJ0RmFsc2U+CisgICAgICA8bWF0Y2hlcyBzdHJpbmc9ImFjYiIgcGF0dGVybj0iYWIuIi8+CisgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWNhc2VpbnNlbnNpdGl2ZSIgaWY9InNvbWUucmVnZXhwLnN1cHBvcnQiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPG1hdGNoZXMgc3RyaW5nPSJBQkMiIHBhdHRlcm49ImFiPyIgY2FzZXNlbnNpdGl2ZT0iZmFsc2UiLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1zaW5nbGVsaW5lIiBpZj0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bWF0Y2hlcyBzdHJpbmc9IkFCJHtsaW5lLnNlcGFyYXRvcn1DIiBwYXR0ZXJuPSJeYWIuKkMkIgorICAgICAgICAgICAgICAgY2FzZXNlbnNpdGl2ZT0iZmFsc2UiCisgICAgICAgICAgICAgICBzaW5nbGVsaW5lPSJ0cnVlIi8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDxhdTphc3NlcnRGYWxzZT4KKyAgICAgIDxtYXRjaGVzIHN0cmluZz0iQUIke2xpbmUuc2VwYXJhdG9yfUMiIHBhdHRlcm49Il5hYi4qQyQiCisgICAgICAgICAgICAgICBjYXNlc2Vuc2l0aXZlPSJmYWxzZSIKKyAgICAgICAgICAgICAgIHNpbmdsZWxpbmU9ImZhbHNlIi8+CisgICAgPC9hdTphc3NlcnRGYWxzZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LW11bHRpbGluZSIgaWY9InNvbWUucmVnZXhwLnN1cHBvcnQiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPG1hdGNoZXMgc3RyaW5nPSJBQiR7Tkx9QyIgcGF0dGVybj0iXkMkIgorICAgICAgICAgICAgICAgbXVsdGlsaW5lPSJ0cnVlIi8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPG1hdGNoZXMgc3RyaW5nPSJBQiR7Tkx9QyIgcGF0dGVybj0iXkFCJCIKKyAgICAgICAgICAgICAgIG11bHRpbGluZT0idHJ1ZSIvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2RlZmVyLXJlZmVyZW5jZS10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2RlZmVyLXJlZmVyZW5jZS10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjdhZDNiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvZGVmZXItcmVmZXJlbmNlLXRlc3QueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgZGVmYXVsdD0iYWxsIiB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorICA8dGFyZ2V0IG5hbWU9Im5vdGNhbGxlZCI+CisgICAgPGZpbGVsaXN0IGlkPSJyZWYxIiBkaXI9IiR7YmFzZWRpcn0iIGZpbGVzPSJ4eHgiIC8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LW1hY3JvZGVmLWVtYmVkZGVkLXJlZiI+CisgICAgPCEtLSBidWcgMzQ0NTggLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9ImZvbyI+CisgICAgICA8ZWxlbWVudCBuYW1lPSJuZXN0ZWQiIGltcGxpY2l0PSJ5ZXMiIG9wdGlvbmFsPSJ5ZXMiLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8ZmlsZXNldCBpZD0iYWJjIiBkaXI9Ii4iPgorICAgICAgICAgIDxuZXN0ZWQvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQtZW1iZWRkZWQtcmVmLnhtbCIgaW5oZXJpdFJlZnM9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYWxsb3cuc2NyaXB0Ij4KKyAgICA8YW5kPgorICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYnNmLkJTRk1hbmFnZXIiIC8+CisgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iYnNoLlN0cmluZ1V0aWwiIC8+CisgICAgPC9hbmQ+CisgIDwvY29uZGl0aW9uPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1zY3JpcHQiIGlmPSJhbGxvdy5zY3JpcHQiPgorICAgIDwhLS0gYnVnemlsbGE6IDM3Njg4IC0tPgorICAgIDxtYWNyb2RlZiBuYW1lPSJjb21waWxlTWFwcGVyIiA+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im9iakRpciIgLz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIGRlZmF1bHQ9ImNvbXBpbGVNYXBwZXJJRCIgLz4KKyAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICA8bWtkaXIgZGlyPSJAe29iakRpcn0iLz4KKyAgICAgICAgPG1hcHBlciBpZD0iQHtpZH0iPgorICAgICAgICAgIDxjaGFpbmVkbWFwcGVyICA+CisgICAgICAgICAgICA8ZmxhdHRlbm1hcHBlci8+CisgICAgICAgICAgICA8Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0iQHtvYmpEaXJ9LyoubyIvPgorICAgICAgICAgIDwvY2hhaW5lZG1hcHBlcj4KKyAgICAgICAgPC9tYXBwZXI+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKyAgICA8c2NyaXB0IGxhbmd1YWdlPSJiZWFuc2hlbGwiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbGwiPgorICAgIDxhdTphbnR1bml0PgorICAgICAgPGZpbGVzZXQgZmlsZT0iJHthbnQuZmlsZX0iLz4KKyAgICAgIDxhdTpwbGFpbmxpc3RlbmVyLz4KKyAgICA8L2F1OmFudHVuaXQ+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9maWxlc2V0LXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvZmlsZXNldC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2FlMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvZmlsZXNldC10ZXN0LnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCIgZGVmYXVsdD0iYWxsIj4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtZmlsZXNldC1taXNzaW5nLWRpciI+CisgICAgPHBhdGggaWQ9Im1pc3NpbmcucGF0aC5pZCI+CisgICAgICA8ZmlsZXNldCBpZD0ibWlzc2luZy5kaXIuZnMiIGRpcj0ibm90IHByZXNlbnQiCisgICAgICAgICAgICAgICBlcnJvcm9ubWlzc2luZ2Rpcj0iZmFsc2UiLz4KKyAgICA8L3BhdGg+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YW5kPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiIgYXJnMj0iJHt0b1N0cmluZzptaXNzaW5nLnBhdGguaWR9Ii8+CisgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIwIiByZWZpZD0ibWlzc2luZy5kaXIuZnMiIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1maWxlc2V0LXdpdGgtaWYiPgorICAgIDxmaWxlc2V0IGlkPSJ0aGlzLnhtbCIgZGlyPSIuIj4KKyAgICAgIDxpbmNsdWRlIGlmPSJ0cmlnZ2VyLmluY2x1ZGUiIG5hbWU9ImZpbGVzZXQtdGVzdC54bWwiLz4KKyAgICA8L2ZpbGVzZXQ+CisgICAgPHBhdGhjb252ZXJ0IHJlZmlkPSJ0aGlzLnhtbCIgcHJvcGVydHk9InRoaXMueG1sLnByb3AiIHBhdGhzZXA9IiR7bGluZS5zZXBhcmF0b3J9IiBzZXRvbmVtcHR5PSJmYWxzZSIvPgorICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9ImZpbGVzZXQgdGhpcy54bWwgc2hvdWxkIG5vdCBjb250YWluIGFueXRoaW5nIGJ1dCBjb250YWlucyAke3RoaXMueG1sLnByb3B9Ij4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InRoaXMueG1sLnByb3AiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtZmlsZXNldC13aXRoLWlmLXByb3BlcnR5LXNldCI+CisgICAgPHByb3BlcnR5IG5hbWU9InRyaWdnZXIuaW5jbHVkZSIgdmFsdWU9InRydWUiLz4KKyAgICA8ZmlsZXNldCBpZD0idGhpcy54bWwiIGRpcj0iLiI+CisgICAgICA8aW5jbHVkZSBpZj0idHJpZ2dlci5pbmNsdWRlIiBuYW1lPSJmaWxlc2V0LXRlc3QueG1sIi8+CisgICAgPC9maWxlc2V0PgorICAgIDxwYXRoY29udmVydCByZWZpZD0idGhpcy54bWwiIHByb3BlcnR5PSJ0aGlzLnhtbC5wcm9wIiBwYXRoc2VwPSIke2xpbmUuc2VwYXJhdG9yfSIgc2V0b25lbXB0eT0iZmFsc2UiLz4KKyAgICA8YXU6YXNzZXJ0UHJvcGVydHlTZXQgbmFtZT0idGhpcy54bWwucHJvcCIgbWVzc2FnZT0iZmlsZXNldCBzaG91bGQgY29udGFpbiBvbmUgZmlsZSIvPgorICAgIDxlY2hvPiR7dGhpcy54bWwucHJvcH08L2VjaG8+CisgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9ImZpbGVzZXQtdGVzdC54bWwiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbGwiPgorICAgIDxhdTphbnR1bml0PgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iZmlsZXNldC10ZXN0LnhtbCIvPgorICAgICAgPGF1OnBsYWlubGlzdGVuZXIvPgorICAgIDwvYXU6YW50dW5pdD4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9maWx0ZXJzZXQtdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9maWx0ZXJzZXQtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4N2FhYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2ZpbHRlcnNldC10ZXN0LnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJyIiB2YWx1ZT0iJHtsaW5lLnNlcGFyYXRvcn0iIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVjdXJzaW9uUmVncmVzc2lvbiI+CisgICAgPGNvcHkgdG9kaXI9IiR7YmFzZWRpcn0iPgorICAgICAgPHN0cmluZyB2YWx1ZT0iQGFAJHticn1AYkAke2JyfUBjQCR7YnJ9IiAvPgorICAgICAgPG1lcmdlbWFwcGVyIHRvPSJmaWx0ZXJzZXQtb3V0cHV0LnR4dCIgLz4KKyAgICAgIDxmaWx0ZXJzZXQ+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49ImEiIHZhbHVlPSJhYWEiIC8+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49ImIiIHZhbHVlPSJiYmIiIC8+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49ImMiIHZhbHVlPSJAYUA6QGJAIiAvPgorICAgICAgPC9maWx0ZXJzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgPGZpbGUgZmlsZT0iZmlsdGVyc2V0LW91dHB1dC50eHQiIC8+CisgICAgICAgIDxzdHJpbmcgdmFsdWU9ImFhYSR7YnJ9YmJiJHticn1hYWE6YmJiJHticn0iIC8+CisgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBmaWxlPSJmaWx0ZXJzZXQtb3V0cHV0LnR4dCIgLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL21hcHBlci1yZWYueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvbWFwcGVyLXJlZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkYTdmMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL21hcHBlci1yZWYueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBkb2VzIG5vdCBhZGRyZXNzL3JlcGxhY2UgdGhlIGNpcmN1bGFyIHJlZmVyZW5jZSBjaGVja3MsIGV0Yy4KKyAgICAgaW4gTWFwcGVyVGVzdC5qYXZhICh5ZXQpLgorIC0tPgorCis8cHJvamVjdCB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorICA8bWFjcm9kZWYgbmFtZT0idGVzdCI+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8cGF0aGNvbnZlcnQgcHJvcGVydHk9ImRlc3QiPgorICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28iIC8+CisgICAgICAgIDxtYXBwZXIgcmVmaWQ9Im1hcHBlciIgLz4KKyAgICAgIDwvcGF0aGNvbnZlcnQ+CisgICAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Rlc3R9IiBhcmcyPSJiYXIiIC8+CisgICAgICA8L2F1OmFzc2VydFRydWU+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEJhc2ljIiBkZXNjcmlwdGlvbj0ic3VjY2VzcyI+CisgICAgPG1hcHBlciBpZD0ibWFwcGVyIiB0eXBlPSJtZXJnZSIgdG89ImJhciIgLz4KKyAgICA8dGVzdCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlTmFtZU1hcHBlciIgZGVzY3JpcHRpb249InN1Y2Nlc3MiPgorICAgIDxtZXJnZW1hcHBlciBpZD0ibWFwcGVyIiB0bz0iYmFyIiAvPgorICAgIDx0ZXN0IC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFdyb25nVHlwZSIgZGVzY3JpcHRpb249ImZhaWx1cmUiPgorICAgIDxwYXRoIGlkPSJtYXBwZXIiIHBhdGg9Indob2NhcmVzIiAvPgorICAgIDxhdTpleHBlY3RmYWlsdXJlIAorICAgICAgZXhwZWN0ZWRNZXNzYWdlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIGF0IHJlZmVyZW5jZSAnbWFwcGVyJyBpcyBub3QgYSB2YWxpZCBtYXBwZXIgcmVmZXJlbmNlLiI+CisgICAgICA8dGVzdCAvPgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9InRlc3RCYXNpYyx0ZXN0RmlsZU5hbWVNYXBwZXIsdGVzdFdyb25nVHlwZSIgLz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvbW9kaWZpZWQtc2VsZWN0b3ItdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9tb2RpZmllZC1zZWxlY3Rvci10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzliNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvbW9kaWZpZWQtc2VsZWN0b3ItdGVzdC54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiIGRlZmF1bHQ9ImFudHVuaXQiPgorCisgIDxpbXBvcnQgZmlsZT0iLi4vYW50dW5pdC1iYXNlLnhtbCIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdC1idWlsZC1kaXIiCisgICAgICAgICAgICBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvYW50LXVuaXQvbW9kaWZpZWQtc2VsZWN0b3IiLz4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Qtb25lLWZpbGUiPgorICAgIDxkZWxldGUgZGlyPSIke3Rlc3QtYnVpbGQtZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdC1idWlsZC1kaXJ9Ii8+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVzdC1idWlsZC1kaXJ9IiBvdmVyd3JpdGU9InllcyI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJtb2RpZmllZC1zZWxlY3Rvci10ZXN0LnhtbCI+CisgICAgICAgIDxtb2RpZmllZCB1cGRhdGU9InRydWUiPgorICAgICAgICAgIDxwYXJhbSBuYW1lPSJjYWNoZS5jYWNoZWZpbGUiIHZhbHVlPSIke3Rlc3QtYnVpbGQtZGlyfS9jYy5wcm9wZXJ0aWVzIi8+CisgICAgICAgIDwvbW9kaWZpZWQ+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7dGVzdC1idWlsZC1kaXJ9L2NjLnByb3BlcnRpZXMiLz4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcGF0aC10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3BhdGgtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3OTZhNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3BhdGgtdGVzdC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiIGRlZmF1bHQ9ImFudHVuaXQiPg0KKw0KKyAgPGltcG9ydCBmaWxlPSIuLi9hbnR1bml0LWJhc2UueG1sIiAvPg0KKw0KKyAgPHByb3BlcnR5IG5hbWU9ImV4aXN0aW5nRmlsZSIgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQueG1sIiAvPg0KKw0KKyAgPGZpbGVzIGlkPSJmaWxlcyI+DQorICAgIDxpbmNsdWRlIG5hbWU9IiR7ZXhpc3RpbmdGaWxlfSIgLz4NCisgIDwvZmlsZXM+DQorICAgIA0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LWRpcmVjdFVzZSIgZGVzY3JpcHRpb249IkJ1ZyA0MjM5NyAtIHdvcmtzIGZpbmUiPg0KKyAgICA8cGF0aCBpZD0icGF0aCI+DQorICAgICAgPGZpbGVzPg0KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtleGlzdGluZ0ZpbGV9IiAvPg0KKyAgICAgIDwvZmlsZXM+DQorICAgIDwvcGF0aD4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXJlZmlkIiBkZXNjcmlwdGlvbj0iQnVnIDQyMzk3Ij4NCisgICAgPHBhdGggaWQ9InBhdGgiPg0KKyAgICAgIDxmaWxlcyByZWZpZD0iZmlsZXMiIC8+DQorICAgIDwvcGF0aD4NCisgIDwvdGFyZ2V0Pg0KKw0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9wYXR0ZXJuc2V0LWludmVydC10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3BhdHRlcm5zZXQtaW52ZXJ0LXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDkxMmUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9wYXR0ZXJuc2V0LWludmVydC10ZXN0LnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImFsbCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKworICA8bWFjcm9kZWYgbmFtZT0idGVzdCI+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjAiPgorICAgICAgICAgIDxpbnRlcnNlY3Q+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0icGx1cyIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+CisgICAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJtaW51cyIgLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICA8L2ludGVyc2VjdD4KKyAgICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJbnZlcnROZXN0ZWQiPgorICAgIDxiYXNlbmFtZSBwcm9wZXJ0eT0iYmFzZW5hbWUiIGZpbGU9IiR7YW50LmZpbGV9IiAvPgorICAgIDxlY2hvPiQke2Jhc2VuYW1lfT0ke2Jhc2VuYW1lfTwvZWNobz4KKyAgICA8cGF0dGVybnNldCBpZD0icGx1cyIgaW5jbHVkZXM9IiR7YmFzZW5hbWV9IiAvPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJtaW51cyI+CisgICAgICA8aW52ZXJ0PgorICAgICAgICA8cGF0dGVybnNldCByZWZpZD0icGx1cyIgLz4KKyAgICAgIDwvaW52ZXJ0PgorICAgIDwvcGF0dGVybnNldD4KKyAgICA8dGVzdCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RJbnZlcnRSZWZpZCI+CisgICAgPGJhc2VuYW1lIHByb3BlcnR5PSJiYXNlbmFtZSIgZmlsZT0iJHthbnQuZmlsZX0iIC8+CisgICAgPGVjaG8+JCR7YmFzZW5hbWV9PSR7YmFzZW5hbWV9PC9lY2hvPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJwbHVzIiBpbmNsdWRlcz0iJHtiYXNlbmFtZX0iIC8+CisgICAgPHBhdHRlcm5zZXQgaWQ9Im1pbnVzIj4KKyAgICAgIDxpbnZlcnQgcmVmaWQ9InBsdXMiIC8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDx0ZXN0IC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYWxsIj4KKyAgICA8YXU6YW50dW5pdD4KKyAgICAgIDxmaWxlc2V0IGZpbGU9IiR7YW50LmZpbGV9Ii8+CisgICAgICA8YXU6cGxhaW5saXN0ZW5lciAvPgorICAgIDwvYXU6YW50dW5pdD4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9jb25jYXQtcmVzb3VyY2UtdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvY29uY2F0LXJlc291cmNlLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyN2E3MzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvY29uY2F0LXJlc291cmNlLXRlc3QueG1sCkBAIC0wLDAgKzEsMTM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0idGVzdC1jb25jYXQiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImFudHVuaXQiCisgICAgICAgICB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorCisgIDxpbXBvcnQgZmlsZT0iLi4vLi4vYW50dW5pdC1iYXNlLnhtbCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0iYnIiIHZhbHVlPSIke2xpbmUuc2VwYXJhdG9yfSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9IndvcmxkIiB2YWx1ZT0iV29ybGQiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9Im91dC5kaXIiIGxvY2F0aW9uPSJ0ZW1wZGlyIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7b3V0LmRpcn0iIHF1aWV0PSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENvdW50RXF1YWxzMSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMSI+CisgICAgICAgIDxjb25jYXQ+SGVsbG8sICR7d29ybGR9ITwvY29uY2F0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVwbGFjZW1lbnQiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlc21hdGNoPgorICAgICAgICA8c3RyaW5nPkhlbGxvLCAke3dvcmxkfSE8L3N0cmluZz4KKyAgICAgICAgPGNvbmNhdD5IZWxsbywgJHt3b3JsZH0hPC9jb25jYXQ+CisgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVzb3VyY2VzIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgPHN0cmluZz5mb29iYXJiYXo8L3N0cmluZz4KKyAgICAgICAgPGNvbmNhdD4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28iIC8+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmFyIiAvPgorICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJheiIgLz4KKyAgICAgICAgPC9jb25jYXQ+CisgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Rml4TGFzdExpbmVSZXNvdXJjZXMiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlc21hdGNoPgorICAgICAgICA8c3RyaW5nPmZvbyR7bGluZS5zZXBhcmF0b3J9YmFyJHtsaW5lLnNlcGFyYXRvcn1iYXoke2xpbmUuc2VwYXJhdG9yfTwvc3RyaW5nPgorICAgICAgICA8Y29uY2F0IGZpeGxhc3RsaW5lPSJ0cnVlIj4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28iIC8+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmFyIiAvPgorICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJheiIgLz4KKyAgICAgICAgPC9jb25jYXQ+CisgICAgICA8L3Jlc291cmNlc21hdGNoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RW5jb2RpbmciPgorICAgIDxta2RpciBkaXI9IiR7b3V0LmRpcn0iLz4KKyAgICA8Y29weSBmaWxlPSJ1dGYtMTYuaW4iIHRvRGlyPSIke291dC5kaXJ9IiBlbmNvZGluZz0idXRmLTE2Ij4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGZpeGNybGYvPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2VzbWF0Y2ggYXN0ZXh0PSJ0cnVlIj4KKyAgICAgICAgPGZpbGUgZmlsZT0iJHtvdXQuZGlyfS91dGYtMTYuaW4iIC8+CisgICAgICAgIDxjb25jYXQgb3V0cHV0RW5jb2Rpbmc9InV0Zi0xNiI+Zm9vJHticn1iYXIke2JyfWJheiR7YnJ9PC9jb25jYXQ+CisgICAgICAgIDxjb25jYXQgb3V0cHV0RW5jb2Rpbmc9InV0Zi0xNiIgZml4bGFzdGxpbmU9InRydWUiPgorICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyIgLz4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJiYXIiIC8+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmF6IiAvPgorICAgICAgICA8L2NvbmNhdD4KKyAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RGaWx0ZXJpbmciPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlc21hdGNoIGFzdGV4dD0idHJ1ZSI+CisgICAgICAgIDxjb25jYXQ+Zm9vJHticn1iYXIke2JyfWJheiR7YnJ9PC9jb25jYXQ+CisgICAgICAgIDxjb25jYXQ+Citmb28KKyNjb21tZW50IDEKK2JhcgorI2NvbW1lbnQgMgorYmF6CisjY29tbWVudCAzCisgICAgICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICAgICAgPHN0cmlwbGluZWNvbW1lbnRzPgorICAgICAgICAgICAgICA8Y29tbWVudCB2YWx1ZT0iIyIgLz4KKyAgICAgICAgICAgIDwvc3RyaXBsaW5lY29tbWVudHM+CisgICAgICAgICAgICA8aWdub3JlYmxhbmsgLz4KKyAgICAgICAgICA8L2ZpbHRlcmNoYWluPgorICAgICAgICA8L2NvbmNhdD4KKyAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RSZWZlcmVuY2UiPgorICAgIDxyZXNvdXJjZXMgaWQ9ImNvbmNhdCI+CisgICAgICA8Y29uY2F0PmZvbzwvY29uY2F0PgorICAgIDwvcmVzb3VyY2VzPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGFuZD4KKyAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiIHJlZmlkPSJjb25jYXQiIC8+CisgICAgICAgIDxyZXNvdXJjZXNtYXRjaD4KKyAgICAgICAgICA8c3RyaW5nPmZvbzwvc3RyaW5nPgorICAgICAgICAgIDxyZXNvdXJjZXMgcmVmaWQ9ImNvbmNhdCIgLz4KKyAgICAgICAgICA8IS0tIHB1cnBvc2VseSBoaXQgaXQgdHdpY2UgdG8gc2VlIHdoYXQgaGFwcGVucyAtLT4KKyAgICAgICAgICA8cmVzb3VyY2VzIHJlZmlkPSJjb25jYXQiIC8+CisgICAgICAgIDwvcmVzb3VyY2VzbWF0Y2g+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2ZpbGVzLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2ZpbGVzLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzM2VkNmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvZmlsZXMtdGVzdC54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8IS0tDQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKw0KKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisNCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorLS0+DQorPHByb2plY3QgbmFtZT0iZmlsZXMtdGVzdCIgZGVmYXVsdD0iYW50dW5pdCINCisgICAgICAgICB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPg0KKw0KKyAgPHRhcmdldCBuYW1lPSJhbnR1bml0Ij4NCisgICAgPGF1OmFudHVuaXQ+DQorICAgICAgPGF1OnBsYWlubGlzdGVuZXIgLz4NCisgICAgICA8ZmlsZSBmaWxlPSIke2FudC5maWxlfSIgLz4NCisgICAgPC9hdTphbnR1bml0Pg0KKyAgPC90YXJnZXQ+DQorICANCisgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPg0KKyAgICA8cHJvcGVydHkgbmFtZT0ib3V0IiB2YWx1ZT0ib3V0Ii8+DQorICA8L3RhcmdldD4NCisgIA0KKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+DQorICAgIDxkZWxldGUgZGlyPSIke291dH0iLz4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RW1wdHlSZWZlcmVuY2UiIGRlc2NyaXB0aW9uPSJCdWc0MzA0OCI+DQorICAgIDxmaWxlcyBpZD0iZm9vIi8+DQorICAgIDxta2RpciBkaXI9IiR7b3V0fSIvPg0KKyAgICA8Y29weSB0b2Rpcj0iJHtvdXR9Ij4NCisgICAgICA8IS0tIHRocmV3IGEgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIC0tPg0KKwkgIDxmaWxlcyByZWZpZD0iZm9vIi8+DQorICAgIDwvY29weT4NCisgIDwvdGFyZ2V0Pg0KKw0KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RW1wdHlGaWxlcyIgZGVzY3JpcHRpb249IkJ1ZzQzMDQ4Ij4NCisgICAgPG1rZGlyIGRpcj0iJHtvdXR9Ii8+DQorICAgIDxjb3B5IHRvZGlyPSIke291dH0iPg0KKyAgICAgIDxmaWxlcy8+DQorICAgIDwvY29weT4NCisgIDwvdGFyZ2V0Pg0KKw0KKw0KKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvZmlyc3QtbGFzdC10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9maXJzdC1sYXN0LXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMzMwNGIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvZmlyc3QtbGFzdC10ZXN0LnhtbApAQCAtMCwwICsxLDE1NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorCisgIDx0b2tlbnMgaWQ9InRlc3RyYyI+CisgICAgPHN0cmluZyB2YWx1ZT0iMSwyLDMsNCw1IiAvPgorICAgIDxzdHJpbmd0b2tlbml6ZXIgZGVsaW1zPSIsIiAvPgorICA8L3Rva2Vucz4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RmaXJzdDAiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjAiPgorICAgICAgICA8Zmlyc3QgY291bnQ9IjAiPjxyZXNvdXJjZXMgcmVmaWQ9InRlc3RyYyIgLz48L2ZpcnN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Zmlyc3QxIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIwIj4KKyAgICAgICAgPGRpZmZlcmVuY2U+CisgICAgICAgICAgPGZpcnN0PjxyZXNvdXJjZXMgcmVmaWQ9InRlc3RyYyIgLz48L2ZpcnN0PgorICAgICAgICAgIDxzdHJpbmcgdmFsdWU9IjEiIC8+CisgICAgICAgIDwvZGlmZmVyZW5jZT4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGZpcnN0MiI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMCI+CisgICAgICAgIDxkaWZmZXJlbmNlPgorICAgICAgICAgIDxmaXJzdCBjb3VudD0iMiI+PHJlc291cmNlcyByZWZpZD0idGVzdHJjIiAvPjwvZmlyc3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9IjEiIC8+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSIyIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8L2RpZmZlcmVuY2U+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RmaXJzdDUiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjAiPgorICAgICAgICA8ZGlmZmVyZW5jZT4KKyAgICAgICAgICA8Zmlyc3QgY291bnQ9IjUiPjxyZXNvdXJjZXMgcmVmaWQ9InRlc3RyYyIgLz48L2ZpcnN0PgorICAgICAgICAgIDxyZXNvdXJjZXMgcmVmaWQ9InRlc3RyYyIgLz4KKyAgICAgICAgPC9kaWZmZXJlbmNlPgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Zmlyc3Q2Ij4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIwIj4KKyAgICAgICAgPGRpZmZlcmVuY2U+CisgICAgICAgICAgPGZpcnN0IGNvdW50PSI2Ij48cmVzb3VyY2VzIHJlZmlkPSJ0ZXN0cmMiIC8+PC9maXJzdD4KKyAgICAgICAgICA8cmVzb3VyY2VzIHJlZmlkPSJ0ZXN0cmMiIC8+CisgICAgICAgIDwvZGlmZmVyZW5jZT4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGZpcnN0LTEiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0ic2l6ZS1saW1pdGVkIGNvbGxlY3Rpb24gY291bnQgc2hvdWxkIGJlIHNldCB0byBhbiBpbnQgJmd0Oz0gMCI+CisgICAgICA8cmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPGZpcnN0IGNvdW50PSItMSI+PHJlc291cmNlcyByZWZpZD0idGVzdHJjIiAvPjwvZmlyc3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RsYXN0MCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMCI+CisgICAgICAgIDxsYXN0IGNvdW50PSIwIj48cmVzb3VyY2VzIHJlZmlkPSJ0ZXN0cmMiIC8+PC9sYXN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bGFzdDEiPgorICAgIDxwYXRoY29udmVydD4KKyAgICAgIDxsYXN0IGNvdW50PSIxIj48cmVzb3VyY2VzIHJlZmlkPSJ0ZXN0cmMiIC8+PC9sYXN0PgorICAgIDwvcGF0aGNvbnZlcnQ+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMCI+CisgICAgICAgIDxkaWZmZXJlbmNlPgorICAgICAgICAgIDxsYXN0PjxyZXNvdXJjZXMgcmVmaWQ9InRlc3RyYyIgLz48L2xhc3Q+CisgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iNSIgLz4KKyAgICAgICAgPC9kaWZmZXJlbmNlPgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bGFzdDIiPgorICAgIDxwYXRoY29udmVydD4KKyAgICAgIDxsYXN0IGNvdW50PSIyIj48cmVzb3VyY2VzIHJlZmlkPSJ0ZXN0cmMiIC8+PC9sYXN0PgorICAgIDwvcGF0aGNvbnZlcnQ+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMCI+CisgICAgICAgIDxkaWZmZXJlbmNlPgorICAgICAgICAgIDxsYXN0IGNvdW50PSIyIj48cmVzb3VyY2VzIHJlZmlkPSJ0ZXN0cmMiIC8+PC9sYXN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSI0IiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iNSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPC9kaWZmZXJlbmNlPgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bGFzdDUiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjAiPgorICAgICAgICA8ZGlmZmVyZW5jZT4KKyAgICAgICAgICA8bGFzdCBjb3VudD0iNSI+PHJlc291cmNlcyByZWZpZD0idGVzdHJjIiAvPjwvbGFzdD4KKyAgICAgICAgICA8cmVzb3VyY2VzIHJlZmlkPSJ0ZXN0cmMiIC8+CisgICAgICAgIDwvZGlmZmVyZW5jZT4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGxhc3Q2Ij4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIwIj4KKyAgICAgICAgPGRpZmZlcmVuY2U+CisgICAgICAgICAgPGxhc3QgY291bnQ9IjYiPjxyZXNvdXJjZXMgcmVmaWQ9InRlc3RyYyIgLz48L2xhc3Q+CisgICAgICAgICAgPHJlc291cmNlcyByZWZpZD0idGVzdHJjIiAvPgorICAgICAgICA8L2RpZmZlcmVuY2U+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RsYXN0LTEiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0ic2l6ZS1saW1pdGVkIGNvbGxlY3Rpb24gY291bnQgc2hvdWxkIGJlIHNldCB0byBhbiBpbnQgJmd0Oz0gMCI+CisgICAgICA8cmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPGxhc3QgY291bnQ9Ii0xIj48cmVzb3VyY2VzIHJlZmlkPSJ0ZXN0cmMiIC8+PC9sYXN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9sYXRlcGF0aC10ZXN0LnhtbCBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9sYXRlcGF0aC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2FmZmZkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2xhdGVwYXRoLXRlc3QueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RMYXRlUGF0aCIgZGVwZW5kcz0idGVhckRvd24iPgorICAgIDxwYXRoIGlkPSJwIj4KKyAgICAgIDxmaWxlc2V0IGZpbGU9InRlc3RMYXRlUGF0aCIgLz4KKyAgICA8L3BhdGg+CisgICAgPHBhdGhjb252ZXJ0IHJlZmlkPSJwIiAvPgorICAgIDx0b3VjaCBmaWxlPSJ0ZXN0TGF0ZVBhdGgiIC8+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcSIgY291bnQ9IjEiIHJlZmlkPSJwIiAvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBmaWxlPSJ0ZXN0TGF0ZVBhdGgiIC8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy90ZXN0LWNvbXBvbmVudGRlZi54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL3Rlc3QtY29tcG9uZW50ZGVmLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc0MTJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy90ZXN0LWNvbXBvbmVudGRlZi54bWwKQEAgLTAsMCArMSw0NTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbGwiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisKKyAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrMS40KyIgY2xhc3NuYW1lPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIi8+ICAKKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic29tZS5yZWdleHAuc3VwcG9ydCI+CisgICAgPG9yPgorICAgICAgPGlzc2V0IHByb3BlcnR5PSJqZGsxLjQrIi8+CisgICAgICA8aXNzZXQgcHJvcGVydHk9ImFwYWNoZS5yZWdleHAucHJlc2VudCIvPgorICAgICAgPGlzc2V0IHByb3BlcnR5PSJhcGFjaGUub3JvLnByZXNlbnQiLz4KKyAgICA8L29yPgorICA8L2NvbmRpdGlvbj4gICAgCisgICAgCisgIDx0YXJnZXQgbmFtZT0idGVzdG5hbWUxIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMiI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvbyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJiYXIiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iYmF6IiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImJvbyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJiYW5nIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxuYW1lIG5hbWU9ImJhPyIgLz4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdG5hbWUyIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMyI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPGZpbGUgZmlsZT0iZm9vIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvbyIgLz4KKyAgICAgICAgICAgIDxmaWxlIGZpbGU9ImZvbyIgYmFzZWRpcj0iJHtiYXNlZGlyfSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8bmFtZSBuYW1lPSJmb28iIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5hbWUiIGRlcGVuZHM9InRlc3RuYW1lMSx0ZXN0bmFtZTIiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZXhpc3RzIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMSI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPGZpbGUgZmlsZT0iaWRvbm90ZXhpc3QiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm9vIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvbyIgZXhpc3RzPSJmYWxzZSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8ZXhpc3RzIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RpbnN0YW5jZW9mdHlwZTEiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIyIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8ZmlsZSBmaWxlPSJmb28iIC8+CisgICAgICAgICAgICA8dXJsIHVybD0iaHR0cDovL2FudC5hcGFjaGUub3JnL2luZGV4Lmh0bWwiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm9vIiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZm9vIiAvPgorICAgICAgICAgICAgPGZpbGUgZmlsZT0iYmFyIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxpbnN0YW5jZW9mIHR5cGU9ImZpbGUiIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RpbnN0YW5jZW9mdHlwZTIiPgorICAgIDx0eXBlZGVmIG5hbWU9ImZpbGUiIHVyaT0idGVzdCIKKyAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2UiIC8+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjEiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDx1cmwgZmlsZT0iZm9vIiAvPgorICAgICAgICAgICAgPGZpbGUgZmlsZT0iYmFyIiB4bWxucz0idGVzdCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8aW5zdGFuY2VvZiB0eXBlPSJ0ZXN0OmZpbGUiIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RpbnN0YW5jZW9mdHlwZTMiPgorICAgIDx0eXBlZGVmIG5hbWU9ImZpbGUiIHVyaT0idGVzdCIKKyAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2UiIC8+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjEiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDx1cmwgZmlsZT0iZm9vIiAvPgorICAgICAgICAgICAgPGZpbGUgZmlsZT0iYmFyIiB4bWxucz0idGVzdCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8aW5zdGFuY2VvZiB0eXBlPSJmaWxlIiB1cmk9InRlc3QiIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imluc3RhbmNlb2Z0eXBlIgorICAgIGRlcGVuZHM9InRlc3RpbnN0YW5jZW9mdHlwZTEsdGVzdGluc3RhbmNlb2Z0eXBlMix0ZXN0aW5zdGFuY2VvZnR5cGUzIiAvPgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGluc3RhbmNlb2ZjbGFzcyI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjciPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxmaWxlbGlzdCBkaXI9IiR7YmFzZWRpcn0iIGZpbGVzPSJhLGIsYyxkLGUsZixnIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxpbnN0YW5jZW9mIGNsYXNzPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZSIgLz4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5zdGFuY2VvZiIgZGVwZW5kcz0iaW5zdGFuY2VvZnR5cGUsdGVzdGluc3RhbmNlb2ZjbGFzcyIgLz4KKworICA8dGFyZ2V0IG5hbWU9InRlc3R0eXBlIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMiI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgIDxmaWxlIGZpbGU9IiR7YmFzZWRpcn0iIC8+CisgICAgICAgICAgICAgPGZpbGUgZmlsZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIGRpcmVjdG9yeT0idHJ1ZSIgLz4KKyAgICAgICAgICAgICA8cmVzb3VyY2UgZGlyZWN0b3J5PSJmYWxzZSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8dHlwZSB0eXBlPSJkaXIiIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RkYXRlIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMyI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgIDxyZXNvdXJjZSBsYXN0bW9kaWZpZWQ9IjQiIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIGxhc3Rtb2RpZmllZD0iNSIgLz4KKyAgICAgICAgICAgICA8cmVzb3VyY2UgbGFzdG1vZGlmaWVkPSI2IiAvPgorICAgICAgICAgICAgIDxyZXNvdXJjZSBsYXN0bW9kaWZpZWQ9IjciIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIGxhc3Rtb2RpZmllZD0iOCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8ZGF0ZSB3aGVuPSJhZnRlciIgbWlsbGlzPSI1IiBncmFudWxhcml0eT0iMCIgLz4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHNpemUiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSI0Ij4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICAgPHJlc291cmNlIHNpemU9IjQiIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIHNpemU9IjUiIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIHNpemU9IjYiIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIHNpemU9IjciIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIHNpemU9IjgiIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPHNpemUgd2hlbj0ibGUiIHNpemU9IjciIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RhbmQiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIxIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmZWUiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZmkiIHNpemU9IjMiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm8iIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZnVtIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxhbmQgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIj4KKyAgICAgICAgICAgIDxuYW1lIG5hbWU9ImY/IiAvPgorICAgICAgICAgICAgPHNpemUgc2l6ZT0iMyIgLz4KKyAgICAgICAgICA8L2FuZD4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdG9yIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMyI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZmVlIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZpIiBzaXplPSIzIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZ1bSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8b3IgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIj4KKyAgICAgICAgICAgIDxuYW1lIG5hbWU9ImY/IiAvPgorICAgICAgICAgICAgPHNpemUgc2l6ZT0iMyIgLz4KKyAgICAgICAgICA8L29yPgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bm90Ij4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMiI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZmVlIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZpIiBzaXplPSIzIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZ1bSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8bm90IHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyI+CisgICAgICAgICAgICA8c2l6ZSBzaXplPSIzIiAvPgorICAgICAgICAgIDwvbm90PgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bm9uZSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjEiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZlZSIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmaSIgc2l6ZT0iMyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmbyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmdW0iIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPG5vbmUgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIj4KKyAgICAgICAgICAgIDxuYW1lIG5hbWU9ImY/IiAvPgorICAgICAgICAgICAgPHNpemUgc2l6ZT0iMyIgLz4KKyAgICAgICAgICA8L25vbmU+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RtYWpvcml0eTEiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIyIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmZWUiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZmkiIHNpemU9IjMiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm8iIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZnVtIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxtYWpvcml0eSB4bWxucz0iYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMiPgorICAgICAgICAgICAgPG5hbWUgbmFtZT0iZj8iIC8+CisgICAgICAgICAgICA8c2l6ZSBzaXplPSIzIiAvPgorICAgICAgICAgICAgPGluc3RhbmNlb2YgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgICAgIDwvbWFqb3JpdHk+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RtYWpvcml0eTIiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIzIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmZWUiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZmkiIHNpemU9IjMiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm8iIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZnVtIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxtYWpvcml0eT4KKyAgICAgICAgICAgIDxuYW1lIG5hbWU9ImY/IiAvPgorICAgICAgICAgICAgPHNpemUgc2l6ZT0iMyIgLz4KKyAgICAgICAgICAgIDxpbnN0YW5jZW9mIHR5cGU9InJlc291cmNlIiAvPgorICAgICAgICAgIDwvbWFqb3JpdHk+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RtYWpvcml0eTMiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIzIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmZWUiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZmkiIHNpemU9IjMiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm8iIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZnVtIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxtYWpvcml0eSBhbGxvd3RpZT0idHJ1ZSI+CisgICAgICAgICAgICA8bmFtZSBuYW1lPSJmPyIgLz4KKyAgICAgICAgICAgIDxzaXplIHNpemU9IjMiIC8+CisgICAgICAgICAgICA8aW5zdGFuY2VvZiB0eXBlPSJzdHJpbmciIC8+CisgICAgICAgICAgICA8ZXhpc3RzIC8+CisgICAgICAgICAgPC9tYWpvcml0eT4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdG1ham9yaXR5NCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjIiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZlZSIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmaSIgc2l6ZT0iMyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmbyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmdW0iIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPG1ham9yaXR5IGFsbG93dGllPSJmYWxzZSI+CisgICAgICAgICAgICA8bmFtZSBuYW1lPSJmPyIgLz4KKyAgICAgICAgICAgIDxzaXplIHNpemU9IjMiIC8+CisgICAgICAgICAgICA8aW5zdGFuY2VvZiB0eXBlPSJzdHJpbmciIC8+CisgICAgICAgICAgICA8ZXhpc3RzIC8+CisgICAgICAgICAgPC9tYWpvcml0eT4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGNvbnRhaW5zIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMiI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZm9vIiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmFyIiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmF6IiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxjb250YWlucyB0ZXh0PSJiIi8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rjb250YWluc3JlZ2V4cCIgaWY9InNvbWUucmVnZXhwLnN1cHBvcnQiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIyIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28iIC8+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJiYXIiIC8+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJiYXoiIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPGNvbnRhaW5zcmVnZXhwIGV4cHJlc3Npb249Il5iLi4kIi8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rjb21wYXJlIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxhbmQ+CisgICAgICAgIDwhLS0gYmFzaWMgdGVzdCwgbmF0dXJhbCBvcmRlcmluZyAtLT4KKyAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjMiPgorICAgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICAgIDxjb21wYXJlIHdoZW49ImdyZWF0ZXIiIGFnYWluc3Q9ImVhY2giPgorICAgICAgICAgICAgICA8Y29udHJvbD48c3RyaW5nIHZhbHVlPSJiIiAvPjwvY29udHJvbD4KKyAgICAgICAgICAgIDwvY29tcGFyZT4KKyAgICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImEiIC8+CisgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImIiIC8+CisgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImMiIC8+CisgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImQiIC8+CisgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImUiIC8+CisgICAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgIDwhLS0gb25lIGNvbXBhcmF0b3IsIGRlZmF1bHQgd2hlbi9hZ2FpbnN0IC0tPgorICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iNSI+CisgICAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgICAgPGNvbXBhcmU+CisgICAgICAgICAgICAgIDxjb250cm9sPjxzdHJpbmcgdmFsdWU9Ii4iIC8+PC9jb250cm9sPgorICAgICAgICAgICAgICA8c2l6ZSAvPgorICAgICAgICAgICAgPC9jb21wYXJlPgorICAgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYSIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYiIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYyIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZCIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZSIgLz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPCEtLSBtdWx0aXBsZSBjb250cm9scywgY29tcGFyYXRvcnMgLS0+CisgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIzIj4KKyAgICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgICA8Y29tcGFyZSB3aGVuPSJncmVhdGVyIiBhZ2FpbnN0PSJlYWNoIj4KKyAgICAgICAgICAgICAgPGNvbnRyb2w+CisgICAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYSIgLz4KKyAgICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJiIiAvPgorICAgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJiIiAvPgorICAgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImMiIC8+CisgICAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iY2NjIiAvPgorICAgICAgICAgICAgICA8L2NvbnRyb2w+CisgICAgICAgICAgICAgIDxuYW1lIC8+CisgICAgICAgICAgICAgIDxzaXplIC8+CisgICAgICAgICAgICA8L2NvbXBhcmU+CisgICAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJhIiAvPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJiYmJiIiAvPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJjY2MiIC8+CisgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImNjY2MiIC8+CisgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImQiIC8+CisgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImUiIC8+CisgICAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICA8L2FuZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWFqb3JpdHkiCisgICAgICAgICAgZGVwZW5kcz0idGVzdG1ham9yaXR5MSx0ZXN0bWFqb3JpdHkyLHRlc3RtYWpvcml0eTMsdGVzdG1ham9yaXR5NCIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImxvZ2ljYWwiCisgICAgICAgICAgZGVwZW5kcz0idGVzdGFuZCx0ZXN0b3IsdGVzdG5vbmUsdGVzdG5vdCxtYWpvcml0eSIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImFsbCIKKyAgICBkZXBlbmRzPSJuYW1lLHRlc3RleGlzdHMsaW5zdGFuY2VvZix0ZXN0dHlwZSx0ZXN0ZGF0ZSx0ZXN0c2l6ZSx0ZXN0Y29udGFpbnMsdGVzdGNvbnRhaW5zcmVnZXhwLGxvZ2ljYWwsdGVzdGNvbXBhcmUiIC8+CisKKyAgPCEtLSAKKyAgICBUaGUgdGVzdHMgZm9yIG9hdGEudHlwZXMuc2VsZWN0b3JzLk1vZGlmaWVkU2VsZWN0b3JUZXN0IGFzIAorICAgIFJlc291cmNlU2VsZWN0b3IgYXJlIGluIGl0cyB0ZXN0LWJ1aWxkZmlsZSBzcmNcZXRjXHRlc3RjYXNlc1x0eXBlc1xzZWxlY3RvcnMueG1sLiAKKyAgLS0+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1ODRlY2QKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL3Rlc3QueG1sCkBAIC0wLDAgKzEsNDY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImFsbCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0IgorICAgICAgICAgeG1sbnM6cnNlbD0iYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMiCisgICAgICAgICB4bWxuczpyY21wPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzIj4KKworICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjQrIiBjbGFzc25hbWU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiLz4gIAorICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzb21lLnJlZ2V4cC5zdXBwb3J0Ij4KKyAgICA8b3I+CisgICAgICA8aXNzZXQgcHJvcGVydHk9ImpkazEuNCsiLz4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYXBhY2hlLnJlZ2V4cC5wcmVzZW50Ii8+CisgICAgICA8aXNzZXQgcHJvcGVydHk9ImFwYWNoZS5vcm8ucHJlc2VudCIvPgorICAgIDwvb3I+CisgIDwvY29uZGl0aW9uPiAgICAKKyAgICAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bmFtZTEiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIyIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm9vIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImJhciIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJiYXoiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iYm9vIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImJhbmciIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPHJzZWw6bmFtZSBuYW1lPSJiYT8iIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RuYW1lMiI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjMiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxmaWxlIGZpbGU9ImZvbyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmb28iIC8+CisgICAgICAgICAgICA8ZmlsZSBmaWxlPSJmb28iIGJhc2VkaXI9IiR7YmFzZWRpcn0iIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPHJzZWw6bmFtZSBuYW1lPSJmb28iIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5hbWUiIGRlcGVuZHM9InRlc3RuYW1lMSx0ZXN0bmFtZTIiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZXhpc3RzIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMSI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPGZpbGUgZmlsZT0iaWRvbm90ZXhpc3QiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm9vIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvbyIgZXhpc3RzPSJmYWxzZSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8cnNlbDpleGlzdHMgLz4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGluc3RhbmNlb2Z0eXBlMSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjIiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxmaWxlIGZpbGU9ImZvbyIgLz4KKyAgICAgICAgICAgIDx1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaW5kZXguaHRtbCIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmb28iIC8+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28iIC8+CisgICAgICAgICAgICA8ZmlsZSBmaWxlPSJiYXIiIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPHJzZWw6aW5zdGFuY2VvZiB0eXBlPSJmaWxlIiAvPgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0aW5zdGFuY2VvZnR5cGUyIj4KKyAgICA8dHlwZWRlZiBuYW1lPSJmaWxlIiB1cmk9InRlc3QiCisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlIiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIxIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8dXJsIGZpbGU9ImZvbyIgLz4KKyAgICAgICAgICAgIDxmaWxlIGZpbGU9ImJhciIgeG1sbnM9InRlc3QiIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPHJzZWw6aW5zdGFuY2VvZiB0eXBlPSJ0ZXN0OmZpbGUiIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RpbnN0YW5jZW9mdHlwZTMiPgorICAgIDx0eXBlZGVmIG5hbWU9ImZpbGUiIHVyaT0idGVzdCIKKyAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2UiIC8+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjEiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDx1cmwgZmlsZT0iZm9vIiAvPgorICAgICAgICAgICAgPGZpbGUgZmlsZT0iYmFyIiB4bWxucz0idGVzdCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8cnNlbDppbnN0YW5jZW9mIHR5cGU9ImZpbGUiIHVyaT0idGVzdCIgLz4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5zdGFuY2VvZnR5cGUiCisgICAgZGVwZW5kcz0idGVzdGluc3RhbmNlb2Z0eXBlMSx0ZXN0aW5zdGFuY2VvZnR5cGUyLHRlc3RpbnN0YW5jZW9mdHlwZTMiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0aW5zdGFuY2VvZmNsYXNzIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iNyI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPGZpbGVsaXN0IGRpcj0iJHtiYXNlZGlyfSIgZmlsZXM9ImEsYixjLGQsZSxmLGciIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPHJzZWw6aW5zdGFuY2VvZiBjbGFzcz0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2UiIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imluc3RhbmNlb2YiIGRlcGVuZHM9Imluc3RhbmNlb2Z0eXBlLHRlc3RpbnN0YW5jZW9mY2xhc3MiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0dHlwZSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjIiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgICA8ZmlsZSBmaWxlPSIke2Jhc2VkaXJ9IiAvPgorICAgICAgICAgICAgIDxmaWxlIGZpbGU9IiR7YW50LmZpbGV9IiAvPgorICAgICAgICAgICAgIDxyZXNvdXJjZSBkaXJlY3Rvcnk9InRydWUiIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIGRpcmVjdG9yeT0iZmFsc2UiIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPHJzZWw6dHlwZSB0eXBlPSJkaXIiIC8+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RkYXRlIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMyI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgIDxyZXNvdXJjZSBsYXN0bW9kaWZpZWQ9IjQiIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIGxhc3Rtb2RpZmllZD0iNSIgLz4KKyAgICAgICAgICAgICA8cmVzb3VyY2UgbGFzdG1vZGlmaWVkPSI2IiAvPgorICAgICAgICAgICAgIDxyZXNvdXJjZSBsYXN0bW9kaWZpZWQ9IjciIC8+CisgICAgICAgICAgICAgPHJlc291cmNlIGxhc3Rtb2RpZmllZD0iOCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8cnNlbDpkYXRlIHdoZW49ImFmdGVyIiBtaWxsaXM9IjUiIGdyYW51bGFyaXR5PSIwIiAvPgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0c2l6ZSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjQiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgICA8cmVzb3VyY2Ugc2l6ZT0iNCIgLz4KKyAgICAgICAgICAgICA8cmVzb3VyY2Ugc2l6ZT0iNSIgLz4KKyAgICAgICAgICAgICA8cmVzb3VyY2Ugc2l6ZT0iNiIgLz4KKyAgICAgICAgICAgICA8cmVzb3VyY2Ugc2l6ZT0iNyIgLz4KKyAgICAgICAgICAgICA8cmVzb3VyY2Ugc2l6ZT0iOCIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8cnNlbDpzaXplIHdoZW49ImxlIiBzaXplPSI3IiAvPgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0YW5kIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMSI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZmVlIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZpIiBzaXplPSIzIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZ1bSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8YW5kIHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyI+CisgICAgICAgICAgICA8bmFtZSBuYW1lPSJmPyIgLz4KKyAgICAgICAgICAgIDxzaXplIHNpemU9IjMiIC8+CisgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RvciI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjMiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZlZSIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmaSIgc2l6ZT0iMyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmbyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmdW0iIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPG9yIHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyI+CisgICAgICAgICAgICA8bmFtZSBuYW1lPSJmPyIgLz4KKyAgICAgICAgICAgIDxzaXplIHNpemU9IjMiIC8+CisgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdG5vdCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjIiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZlZSIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmaSIgc2l6ZT0iMyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmbyIgLz4KKyAgICAgICAgICAgIDxyZXNvdXJjZSBuYW1lPSJmdW0iIC8+CisgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPG5vdCB4bWxucz0iYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMiPgorICAgICAgICAgICAgPHNpemUgc2l6ZT0iMyIgLz4KKyAgICAgICAgICA8L25vdD4KKyAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdG5vbmUiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIxIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmZWUiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZmkiIHNpemU9IjMiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm8iIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZnVtIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxub25lIHhtbG5zPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyI+CisgICAgICAgICAgICA8bmFtZSBuYW1lPSJmPyIgLz4KKyAgICAgICAgICAgIDxzaXplIHNpemU9IjMiIC8+CisgICAgICAgICAgPC9ub25lPgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bWFqb3JpdHkxIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMiI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZmVlIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZpIiBzaXplPSIzIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZ1bSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8bWFqb3JpdHkgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIj4KKyAgICAgICAgICAgIDxuYW1lIG5hbWU9ImY/IiAvPgorICAgICAgICAgICAgPHNpemUgc2l6ZT0iMyIgLz4KKyAgICAgICAgICAgIDxpbnN0YW5jZW9mIHR5cGU9InN0cmluZyIgLz4KKyAgICAgICAgICA8L21ham9yaXR5PgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bWFqb3JpdHkyIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMyI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZmVlIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZpIiBzaXplPSIzIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZ1bSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8bWFqb3JpdHkgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIj4KKyAgICAgICAgICAgIDxuYW1lIG5hbWU9ImY/IiAvPgorICAgICAgICAgICAgPHNpemUgc2l6ZT0iMyIgLz4KKyAgICAgICAgICAgIDxpbnN0YW5jZW9mIHR5cGU9InJlc291cmNlIiAvPgorICAgICAgICAgIDwvbWFqb3JpdHk+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RtYWpvcml0eTMiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIzIj4KKyAgICAgICAgPHJlc3RyaWN0PgorICAgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmZWUiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZmkiIHNpemU9IjMiIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm8iIC8+CisgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZnVtIiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxtYWpvcml0eSBhbGxvd3RpZT0idHJ1ZSIKKyAgICAgICAgICAgICAgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIj4KKyAgICAgICAgICAgIDxuYW1lIG5hbWU9ImY/IiAvPgorICAgICAgICAgICAgPHNpemUgc2l6ZT0iMyIgLz4KKyAgICAgICAgICAgIDxpbnN0YW5jZW9mIHR5cGU9InN0cmluZyIgLz4KKyAgICAgICAgICAgIDxleGlzdHMgLz4KKyAgICAgICAgICA8L21ham9yaXR5PgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bWFqb3JpdHk0Ij4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMiI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZmVlIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZpIiBzaXplPSIzIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvIiAvPgorICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZ1bSIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8bWFqb3JpdHkgYWxsb3d0aWU9ImZhbHNlIgorICAgICAgICAgICAgICB4bWxucz0iYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMiPgorICAgICAgICAgICAgPG5hbWUgbmFtZT0iZj8iIC8+CisgICAgICAgICAgICA8c2l6ZSBzaXplPSIzIiAvPgorICAgICAgICAgICAgPGluc3RhbmNlb2YgdHlwZT0ic3RyaW5nIiAvPgorICAgICAgICAgICAgPGV4aXN0cyAvPgorICAgICAgICAgIDwvbWFqb3JpdHk+CisgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rjb250YWlucyI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjIiPgorICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyIgLz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJhciIgLz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJheiIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICA8Y29udGFpbnMgdGV4dD0iYiIKKyAgICAgICAgICAgICAgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIiAvPgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Y29udGFpbnNyZWdleHAiIGlmPSJzb21lLnJlZ2V4cC5zdXBwb3J0Ij4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMiI+CisgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZm9vIiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmFyIiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmF6IiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxjb250YWluc3JlZ2V4cCBleHByZXNzaW9uPSJeYi4uJCIKKyAgICAgICAgICAgICAgeG1sbnM9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIiAvPgorICAgICAgICA8L3Jlc3RyaWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Y29tcGFyZSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YW5kPgorICAgICAgICA8IS0tIGJhc2ljIHRlc3QsIG5hdHVyYWwgb3JkZXJpbmcgLS0+CisgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIzIj4KKyAgICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgICA8cnNlbDpjb21wYXJlIHdoZW49ImdyZWF0ZXIiIGFnYWluc3Q9ImVhY2giPgorICAgICAgICAgICAgICA8Y29udHJvbD48c3RyaW5nIHZhbHVlPSJiIiAvPjwvY29udHJvbD4KKyAgICAgICAgICAgIDwvcnNlbDpjb21wYXJlPgorICAgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYSIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYiIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYyIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZCIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZSIgLz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDwvcmVzdHJpY3Q+CisgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICAgICAgPCEtLSBvbmUgY29tcGFyYXRvciwgZGVmYXVsdCB3aGVuL2FnYWluc3QgLS0+CisgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSI1Ij4KKyAgICAgICAgICA8cmVzdHJpY3Q+CisgICAgICAgICAgICA8cnNlbDpjb21wYXJlPgorICAgICAgICAgICAgICA8Y29udHJvbD48c3RyaW5nIHZhbHVlPSIuIiAvPjwvY29udHJvbD4KKyAgICAgICAgICAgICAgPHJjbXA6c2l6ZSAvPgorICAgICAgICAgICAgPC9yc2VsOmNvbXBhcmU+CisgICAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJhIiAvPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJiIiAvPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJjIiAvPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJkIiAvPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJlIiAvPgorICAgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgICAgICA8IS0tIG11bHRpcGxlIGNvbnRyb2xzLCBjb21wYXJhdG9ycyAtLT4KKyAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjMiPgorICAgICAgICAgIDxyZXN0cmljdD4KKyAgICAgICAgICAgIDxyc2VsOmNvbXBhcmUgd2hlbj0iZ3JlYXRlciIgYWdhaW5zdD0iZWFjaCI+CisgICAgICAgICAgICAgIDxjb250cm9sPgorICAgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImEiIC8+CisgICAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYiIgLz4KKyAgICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJiYiIgLz4KKyAgICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJjIiAvPgorICAgICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImNjYyIgLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sPgorICAgICAgICAgICAgICA8cmNtcDpuYW1lIC8+CisgICAgICAgICAgICAgIDxyY21wOnNpemUgLz4KKyAgICAgICAgICAgIDwvcnNlbDpjb21wYXJlPgorICAgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYSIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmJiYiIgLz4KKyAgICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iY2NjIiAvPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJjY2NjIiAvPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJkIiAvPgorICAgICAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJlIiAvPgorICAgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgPC9yZXN0cmljdD4KKyAgICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgICAgPC9hbmQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1ham9yaXR5IgorICAgICAgICAgIGRlcGVuZHM9InRlc3RtYWpvcml0eTEsdGVzdG1ham9yaXR5Mix0ZXN0bWFqb3JpdHkzLHRlc3RtYWpvcml0eTQiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJsb2dpY2FsIgorICAgICAgICAgIGRlcGVuZHM9InRlc3RhbmQsdGVzdG9yLHRlc3Rub25lLHRlc3Rub3QsbWFqb3JpdHkiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJhbGwiCisgICAgZGVwZW5kcz0ibmFtZSx0ZXN0ZXhpc3RzLGluc3RhbmNlb2YsdGVzdHR5cGUsdGVzdGRhdGUsdGVzdHNpemUsdGVzdGNvbnRhaW5zLHRlc3Rjb250YWluc3JlZ2V4cCxsb2dpY2FsLHRlc3Rjb21wYXJlIiAvPgorCisgIDwhLS0gCisgICAgVGhlIHRlc3RzIGZvciBvYXRhLnR5cGVzLnNlbGVjdG9ycy5Nb2RpZmllZFNlbGVjdG9yVGVzdCBhcyAKKyAgICBSZXNvdXJjZVNlbGVjdG9yIGFyZSBpbiBpdHMgdGVzdC1idWlsZGZpbGUgc3JjXGV0Y1x0ZXN0Y2FzZXNcdHlwZXNcc2VsZWN0b3JzLnhtbC4gCisgIC0tPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5ZDQzZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy90ZXN0LnhtbApAQCAtMCwwICsxLDM4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbGwiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCIKKyAgICAgICAgIHhtbG5zOnJzZWw9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIj4KKworICA8cHJvcGVydHkgbmFtZT0iZGlybmFtZSIgdmFsdWU9IndvcmsiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXIiIGxvY2F0aW9uPSIke2Rpcm5hbWV9IiAvPgorICA8cHJvcGVydHkgbmFtZT0iemlwIiBsb2NhdGlvbj0iJHtkaXJuYW1lfS56aXAiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXIiIGxvY2F0aW9uPSIke2Rpcm5hbWV9LmphciIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImZpbGUiIGxvY2F0aW9uPSIke2Rpcm5hbWV9L2ZpbGUudHh0IiAvPgorICAgIAorICA8Y29uZGl0aW9uIHByb3BlcnR5PSJvZmZsaW5lIj4KKyAgICA8bm90PgorICAgICAgPG9yPgorICAgICAgICA8aHR0cCB1cmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZyIvPgorICAgICAgICA8aHR0cCB1cmw9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbSIvPgorICAgICAgPC9vcj4KKyAgICA8L25vdD4KKyAgPC9jb25kaXRpb24+CisKKyAgPHRhcmdldCBuYW1lPSJzZXRVcCI+CisKKyAgICA8dG91Y2ggbWtkaXJzPSJ0cnVlIj4KKyAgICAgIDxmaWxlbGlzdCBkaXI9IiR7ZGlyfS9mb28vYSIgZmlsZXM9IngseSx6IiAvPgorICAgIDwvdG91Y2g+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtkaXJ9L2ZvbyIgZW5hYmxlbXVsdGlwbGVtYXBwaW5ncz0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlyfS9mb28iIC8+CisgICAgICA8bWFwcGVyPgorICAgICAgICA8Z2xvYm1hcHBlciBoYW5kbGVkaXJzZXA9InRydWUiIGZyb209ImEvKiIgdG89ImIvKiIgLz4KKyAgICAgICAgPGdsb2JtYXBwZXIgaGFuZGxlZGlyc2VwPSJ0cnVlIiBmcm9tPSJhLyoiIHRvPSJjLyoiIC8+CisgICAgICA8L21hcHBlcj4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtkaXJ9L2JhciI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlyfS9mb28iIC8+CisgICAgPC9jb3B5PgorCisgICAgPHByb3BlcnR5IG5hbWU9ImZvbyIgbG9jYXRpb249IiR7ZGlyfS9mb28iIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZvby5hIiBsb2NhdGlvbj0iJHtkaXJ9L2Zvby9hIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmb28uYiIgbG9jYXRpb249IiR7ZGlyfS9mb28vYiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZm9vLmMiIGxvY2F0aW9uPSIke2Rpcn0vZm9vL2MiIC8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iYmFyIiBsb2NhdGlvbj0iJHtkaXJ9L2JhciIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYmFyLmEiIGxvY2F0aW9uPSIke2Rpcn0vYmFyL2EiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJhci5iIiBsb2NhdGlvbj0iJHtkaXJ9L2Jhci9iIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJiYXIuYyIgbG9jYXRpb249IiR7ZGlyfS9iYXIvYyIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBkaXI9IiR7ZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7emlwfSIgLz4KKyAgICA8ZGVsZXRlIGZpbGU9IiR7amFyfSIgZGVsZXRlb25leGl0PSJ0cnVlIiAvPgorICAgIDxkZWxldGUgZmlsZT0iJHtmaWxlfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZmlsZXMxIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMjYiPgorICAgICAgICA8ZmlsZXM+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXJ9L2Zvby8iIC8+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXJ9L2Jhci8iIC8+CisgICAgICAgIDwvZmlsZXM+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RmaWxlczIiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSI4Ij4KKyAgICAgICAgPGZpbGVzPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlyfS9mb28vIiAvPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlyfS9iYXIvIiAvPgorICAgICAgICAgIDx0eXBlIHR5cGU9ImRpciIgLz4KKyAgICAgICAgPC9maWxlcz4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGZpbGVzMyIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjE4Ij4KKyAgICAgICAgPGZpbGVzPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlyfS9mb28vIiAvPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlyfS9iYXIvIiAvPgorICAgICAgICAgIDx0eXBlIHR5cGU9ImZpbGUiIC8+CisgICAgICAgIDwvZmlsZXM+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RuZXN0ZWRyZXNvdXJjZXMiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIyNyI+PCEtLSBpbmNsdWRlIGR1cGxpY2F0ZXMhIC0tPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgIDxmaWxlcz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlyfS9mb28vIiAvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXJ9L2Jhci8iIC8+CisgICAgICAgICAgICA8dHlwZSB0eXBlPSJmaWxlIiAvPgorICAgICAgICAgIDwvZmlsZXM+CisgICAgICAgICAgPGZpbGVzPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtkaXJ9L2Zvby8iIC8+CisgICAgICAgICAgICA8dHlwZSB0eXBlPSJmaWxlIiAvPgorICAgICAgICAgIDwvZmlsZXM+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0cmVzb3VyY2VzcmVmIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGZpbGVzIGlkPSJmaWxlcyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIke2Rpcn0vZm9vLyIgLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiR7ZGlyfS9iYXIvIiAvPgorICAgICAgPHR5cGUgdHlwZT0iZmlsZSIgLz4KKyAgICA8L2ZpbGVzPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjE4Ij4KKyAgICAgICAgPHJlc291cmNlcyByZWZpZD0iZmlsZXMiIC8+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RmaWxlc2V0IiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iOSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXJ9L2ZvbyIgLz4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGRpcnNldCIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjQiPgorICAgICAgICA8ZGlyc2V0IGRpcj0iJHtkaXJ9L2ZvbyIgLz4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGZpbGVsaXN0Ij4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSI1Ij4KKyAgICAgICAgPGZpbGVsaXN0IGRpcj0iJHtkaXJ9L2ZvbyIgZmlsZXM9IjEsMiwzLDQsNSIgLz4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHBhdGgiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIyNCI+CisgICAgICAgIDxwYXRoPgorICAgICAgICAgIDxwYXRoIGlkPSJwIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIke2Zvby5hfSIgLz4gPCEtLSAzIC0tPgorICAgICAgICAgICAgPGRpcnNldCBpZD0iZHMiIGRpcj0iJHtmb299IiAvPiA8IS0tIDQgLS0+CisgICAgICAgICAgPC9wYXRoPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBpZD0icGUiIGxvY2F0aW9uPSIke2Rpcn0iIC8+IDwhLS0gMSAtLT4KKyAgICAgICAgICA8ZmlsZWxpc3QgaWQ9ImZsIiBkaXI9IiR7YmFyfSIgZmlsZXM9IjEsMiwzLGEsYixjIiAvPiA8IS0tIDYgLS0+CisgICAgICAgICAgPGZpbGVzIGlkPSJmIiBpbmNsdWRlcz0iJHtiYXJ9LyIgLz4gPCEtLSAxMzsgMyBvdmVybGFwIGZsIC0tPgorICAgICAgICA8L3BhdGg+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZXppcCIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDx6aXAgZGVzdGZpbGU9IiR7emlwfSIgYmFzZWRpcj0iJHtkaXJ9IiAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3R6aXBmaWxlc2V0IiBkZXBlbmRzPSJjcmVhdGV6aXAiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjkiPgorICAgICAgICA8emlwZmlsZXNldCBzcmM9IiR7emlwfSIgaW5jbHVkZXM9ImZvby8iIC8+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rwcm9wZXJ0eXNldCI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3Rwcm9wZXJ0eXNldC5hIiB2YWx1ZT0iYSIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdHByb3BlcnR5c2V0LmFhIiB2YWx1ZT0iYWEiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3Rwcm9wZXJ0eXNldC5hYWEiIHZhbHVlPSJhYWEiIC8+CisgICAgPHByb3BlcnR5c2V0IGlkPSJ0ZXN0cHJvcGVydHlzZXQiPgorICAgICAgPHByb3BlcnR5cmVmIHByZWZpeD0idGVzdHByb3BlcnR5c2V0LiIgLz4KKyAgICA8L3Byb3BlcnR5c2V0PgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGFuZD4KKyAgICAgICAgPHJlc291cmNlY291bnQgcmVmaWQ9InRlc3Rwcm9wZXJ0eXNldCIgY291bnQ9IjMiIC8+CisgICAgICAgIDxsZW5ndGggbGVuZ3RoPSIxMiI+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZXMgcmVmaWQ9InRlc3Rwcm9wZXJ0eXNldCIgLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eXNldCByZWZpZD0idGVzdHByb3BlcnR5c2V0IiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8L2xlbmd0aD4KKyAgICAgIDwvYW5kPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0dW5pb24iIGRlcGVuZHM9InNldFVwIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSI0Ij4KKyAgICAgICAgPHVuaW9uPgorICAgICAgICAgIDxmaWxlcyBpbmNsdWRlcz0iJHtmb28uYX0vdywke2Zvby5hfS94IiAvPiA8IS0tIDEgLS0+CisgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Zvby5hfSIgaW5jbHVkZXM9IngseSIgLz4gPCEtLSAyOyBuZXQgMSAtLT4KKyAgICAgICAgICA8ZmlsZWxpc3QgZGlyPSIke2Zvby5hfSIgZmlsZXM9InYiIC8+IDwhLS0gMSAtLT4KKyAgICAgICAgICA8ZmlsZXMgaW5jbHVkZXM9IiR7Zm9vLmF9L3ksJHtmb28uYX0veiIgLz4gPCEtLSAyOyBuZXQgMSAtLT4KKyAgICAgICAgPC91bmlvbj4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGludGVyc2VjdCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMyI+CisgICAgICAgIDxpbnRlcnNlY3Q+CisgICAgICAgICAgPGZpbGVsaXN0IGRpcj0iJHtkaXJ9IiBmaWxlcz0iMSwyLDMsNCw1IiAvPgorICAgICAgICAgIDxmaWxlbGlzdCBkaXI9IiR7ZGlyfSIgZmlsZXM9IjIsMyw0LDUsNiIgLz4KKyAgICAgICAgICA8ZmlsZWxpc3QgZGlyPSIke2Rpcn0iIGZpbGVzPSIzLDQsNSw2LDciIC8+CisgICAgICAgIDwvaW50ZXJzZWN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZGlmZmVyZW5jZSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMiI+CisgICAgICAgIDxkaWZmZXJlbmNlIGlkPSJkaWZmIj4KKyAgICAgICAgICA8ZmlsZWxpc3QgZGlyPSIke2Rpcn0iIGZpbGVzPSIxLDIsMyw0LDUiIC8+CisgICAgICAgICAgPGZpbGVsaXN0IGRpcj0iJHtkaXJ9IiBmaWxlcz0iMiwzLDQsNSw2IiAvPgorICAgICAgICAgIDxmaWxlbGlzdCBkaXI9IiR7ZGlyfSIgZmlsZXM9IjMsNCw1LDYsNyIgLz4KKyAgICAgICAgPC9kaWZmZXJlbmNlPgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZmlsZXVybCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIHdoZW49ImdyZWF0ZXIiIGxlbmd0aD0iMCI+CisgICAgICAgIDx1cmwgZmlsZT0iJHthbnQuZmlsZX0iIC8+CisgICAgICA8L2xlbmd0aD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGZpbGV1cmxyZWYiPgorICAgIDx1cmwgaWQ9ImZpbGV1cmwiIGZpbGU9IiR7YW50LmZpbGV9IiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGxlbmd0aCB3aGVuPSJncmVhdGVyIiBsZW5ndGg9IjAiPgorICAgICAgICA8dXJsIHJlZmlkPSJmaWxldXJsIiAvPgorICAgICAgPC9sZW5ndGg+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RodHRwdXJsMSIgdW5sZXNzPSJvZmZsaW5lIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxsZW5ndGggd2hlbj0iZ3JlYXRlciIgbGVuZ3RoPSIwIj4KKyAgICAgICAgPHVybCB1cmw9Imh0dHA6Ly93d3cudzMub3JnL01hcmtVcCIgLz4KKyAgICAgIDwvbGVuZ3RoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0aHR0cHVybDIiIHVubGVzcz0ib2ZmbGluZSI+CisgICAgPGNvbmNhdCBkZXN0ZmlsZT0iJHtmaWxlfSIgZm9yY2U9InRydWUiIGFwcGVuZD0iZmFsc2UiPgorICAgICAgPHVybCBpZD0iaHR0cHVybCIgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaW5kZXguaHRtbCIgLz4KKyAgICAgIDx1cmwgcmVmaWQ9Imh0dHB1cmwiIC8+CisgICAgPC9jb25jYXQ+CisgICAgPGxlbmd0aCBwcm9wZXJ0eT0iaHR0cHVybC5sZW5ndGgiPgorICAgICAgPHVybCByZWZpZD0iaHR0cHVybCIgLz4KKyAgICA8L2xlbmd0aD4KKyAgICA8bGVuZ3RoIHByb3BlcnR5PSJmaWxlLmxlbmd0aCI+CisgICAgICA8ZmlsZSBmaWxlPSIke2ZpbGV9Ii8+CisgICAgPC9sZW5ndGg+CisgICAgPGF1OmFzc2VydFRydWUgbWVzc2FnZT0ibGVuZ3RoIG9mIHVybCAke2h0dHB1cmwubGVuZ3RofSBsZW5ndGggb2YgZmlsZSAke2ZpbGUubGVuZ3RofSBmaWxlIHNob3VsZCBiZSB0d2ljZSBhcyBiaWciPgorICAgICAgPGxlbmd0aCBmaWxlPSIke2ZpbGV9IiB3aGVuPSJncmVhdGVyIiBsZW5ndGg9IiR7aHR0cHVybC5sZW5ndGh9IiAvPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjcmVhdGVqYXIiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8amFyIGRlc3RmaWxlPSIke2phcn0iIGJhc2VkaXI9IiR7ZGlyfSIgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0amFydXJsIiBkZXBlbmRzPSJjcmVhdGVqYXIiPgorICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0iamFydXJsIj4KKyAgICAgIDx1cmwgZmlsZT0iJHtqYXJ9IiAvPgorICAgIDwvcGF0aGNvbnZlcnQ+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIHdoZW49ImdyZWF0ZXIiIGxlbmd0aD0iMCI+CisgICAgICAgIDx1cmwgdXJsPSJqYXI6JHtqYXJ1cmx9IS9NRVRBLUlORi9NQU5JRkVTVC5NRiIgLz4KKyAgICAgIDwvbGVuZ3RoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0ZmlsZSIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDxlY2hvIGZpbGU9IiR7ZmlsZX0iPlRoaXMgaXMgYSB0ZXN0LjwvZWNobz4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxsZW5ndGggbGVuZ3RoPSIxNSI+CisgICAgICAgIDxmaWxlIGZpbGU9IiR7ZmlsZX0iIC8+CisgICAgICA8L2xlbmd0aD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHppcGVudHJ5IiBkZXBlbmRzPSJjcmVhdGVqYXIiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGxlbmd0aCB3aGVuPSJncmVhdGVyIiBsZW5ndGg9IjAiPgorICAgICAgICA8emlwZW50cnkgemlwZmlsZT0iJHtqYXJ9IiBuYW1lPSJNRVRBLUlORi9NQU5JRkVTVC5NRiIgLz4KKyAgICAgIDwvbGVuZ3RoPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0c3RyaW5nMSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIGxlbmd0aD0iMTUiPgorICAgICAgICA8c3RyaW5nIHZhbHVlPSJUaGlzIGlzIGEgdGVzdC4iIC8+CisgICAgICA8L2xlbmd0aD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdHN0cmluZzIiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0IiB2YWx1ZT0iZm9vIiAvPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGxlbmd0aCBsZW5ndGg9IjE0Ij4KKyAgICAgICAgPHN0cmluZyB2YWx1ZT0iVGhpcyBpcyBhICR7dGVzdH0uIiAvPgorICAgICAgPC9sZW5ndGg+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RyZXNvdXJjZSI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIGxlbmd0aD0iNDA5NiI+CisgICAgICAgIDxyZXNvdXJjZSBzaXplPSI0MDk2IiAvPgorICAgICAgPC9sZW5ndGg+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3Rwcm9wZXJ0eSI+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3Rwcm9wZXJ0eSIgdmFsdWU9ImFiY2RlZmdoaWoiIC8+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8bGVuZ3RoIGxlbmd0aD0iMTAiPgorICAgICAgICA8cHJvcGVydHlyZXNvdXJjZSBuYW1lPSJ0ZXN0cHJvcGVydHkiIC8+CisgICAgICA8L2xlbmd0aD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGZpcnN0MCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMCI+CisgICAgICAgIDxmaXJzdCBjb3VudD0iMCI+CisgICAgICAgICAgPGZpbGVsaXN0IGRpcj0iJHtkaXJ9IiBmaWxlcz0iMSwyLDMsNCw1IiAvPgorICAgICAgICA8L2ZpcnN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Zmlyc3QxIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KKyAgICAgICAgPGZpcnN0PgorICAgICAgICAgIDxmaWxlbGlzdCBkaXI9IiR7ZGlyfSIgZmlsZXM9IjEsMiwzLDQsNSIgLz4KKyAgICAgICAgPC9maXJzdD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdGZpcnN0MiI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMiI+CisgICAgICAgIDxmaXJzdCBjb3VudD0iMiI+CisgICAgICAgICAgPGZpbGVsaXN0IGRpcj0iJHtkaXJ9IiBmaWxlcz0iMSwyLDMsNCw1IiAvPgorICAgICAgICA8L2ZpcnN0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy90b2tlbnMtdGVzdC54bWwgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvdG9rZW5zLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWQ2MDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvdG9rZW5zLXRlc3QueG1sCkBAIC0wLDAgKzEsMTI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9InRlc3QtdG9rZW5zIiBkZWZhdWx0PSJhbnR1bml0IgorICAgICAgICAgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKworICA8cHJvcGVydHkgbmFtZT0iZW9sIiB2YWx1ZT0iJHtsaW5lLnNlcGFyYXRvcn0iIC8+CisKKyAgPHRhcmdldCBuYW1lPSJhbnR1bml0Ij4KKyAgICA8YXU6YW50dW5pdD4KKyAgICAgIDxhdTpwbGFpbmxpc3RlbmVyIC8+CisgICAgICA8ZmlsZSBmaWxlPSIke2FudC5maWxlfSIgLz4KKyAgICA8L2F1OmFudHVuaXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdExpbmVzIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIwIj4KKyAgICAgICAgPGRpZmZlcmVuY2U+CisgICAgICAgICAgPHRva2Vucz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyR7ZW9sfWJhciR7ZW9sfWJheiIgLz4KKyAgICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZm9vIiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmFyIiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmF6IiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8L2RpZmZlcmVuY2U+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFeHBsaWNpdExpbmVzIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIwIj4KKyAgICAgICAgPGRpZmZlcmVuY2U+CisgICAgICAgICAgPHRva2Vucz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyR7ZW9sfWJhciR7ZW9sfWJheiIgLz4KKyAgICAgICAgICAgIDxsaW5ldG9rZW5pemVyIC8+CisgICAgICAgICAgPC90b2tlbnM+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyIgLz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJhciIgLz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJheiIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPC9kaWZmZXJlbmNlPgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZVRva2VuaXplciI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMSI+CisgICAgICAgIDx0b2tlbnM+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyR7ZW9sfWJhciR7ZW9sfWJheiIgLz4KKyAgICAgICAgICAgIDxmaWxlIGZpbGU9IiR7YW50LmZpbGV9IiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgIDxmaWxldG9rZW5pemVyIC8+CisgICAgICAgIDwvdG9rZW5zPgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U3RyaW5nVG9rZW5pemVyIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIwIj4KKyAgICAgICAgPGRpZmZlcmVuY2U+CisgICAgICAgICAgPHRva2Vucz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyBiYXIgYmF6ICIgLz4KKyAgICAgICAgICAgIDxzdHJpbmd0b2tlbml6ZXIgLz4KKyAgICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZm9vIiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmFyIiAvPgorICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iYmF6IiAvPgorICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8L2RpZmZlcmVuY2U+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RFbmNvZGluZyI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMCI+CisgICAgICAgIDxkaWZmZXJlbmNlPgorICAgICAgICAgIDx0b2tlbnMgZW5jb2Rpbmc9InV0Zi0xNiI+CisgICAgICAgICAgICA8ZmlsZSBmaWxlPSJ1dGYtMTYuaW4iIC8+CisgICAgICAgICAgPC90b2tlbnM+CisgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyIgLz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJhciIgLz4KKyAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImJheiIgLz4KKyAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPC9kaWZmZXJlbmNlPgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U29ydCI+CisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJzb3J0ZWQiIHBhdGhzZXA9IiR7ZW9sfSI+CisgICAgICA8c29ydD4KKyAgICAgICAgPHRva2Vucz4KKyAgICAgICAgICA8c3RyaW5nIHZhbHVlPSJmb28gYmFyIGV0YyBiYXoiIC8+CisgICAgICAgICAgPHN0cmluZ3Rva2VuaXplciAvPgorICAgICAgICA8L3Rva2Vucz4KKyAgICA8L3NvcnQ+CisgICAgPC9wYXRoY29udmVydD4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxlcXVhbHMgYXJnMT0iYmFyJHtlb2x9YmF6JHtlb2x9ZXRjJHtlb2x9Zm9vIiBhcmcyPSIke3NvcnRlZH0iIC8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3V0Zi0xNi5pbiBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy91dGYtMTYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3YzJhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy91dGYtMTYuaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2NyaXB0Y29uZGl0aW9uLXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2NyaXB0Y29uZGl0aW9uLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NTc4YjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zY3JpcHRjb25kaXRpb24tdGVzdC54bWwKQEAgLTAsMCArMSwxODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0ic2NyaXB0Y29uZGl0aW9uLXRlc3QiIGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+CisgIDxpbXBvcnQgZmlsZT0iLi4vYW50dW5pdC1iYXNlLnhtbCIgLz4KKworICA8bWFjcm9kZWYgbmFtZT0idCI+CisgICAgPGVsZW1lbnQgbmFtZT0idGVzdCIgaW1wbGljaXQ9InllcyIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxhdTphc3NlcnRUcnVlIG1lc3NhZ2U9InF1ZXJ5IEB7bWVzc2FnZX0gZmFpbGVkOyByZXN1bHQgd2FzIGZhbHNlIj4KKyAgICAgICAgPHRlc3QgLz4KKyAgICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPG1hY3JvZGVmIG5hbWU9ImYiPgorICAgIDxlbGVtZW50IG5hbWU9InRlc3QiIGltcGxpY2l0PSJ5ZXMiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIi8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8YXU6YXNzZXJ0RmFsc2UgbWVzc2FnZT0idGVzdCBAe21lc3NhZ2V9IGZhaWxlZDsgcmVzdWx0IHdhcyB0cnVlIj4KKyAgICAgICAgPHRlc3QgLz4KKyAgICAgIDwvYXU6YXNzZXJ0RmFsc2U+CisgICAgPC9zZXF1ZW50aWFsPgorICA8L21hY3JvZGVmPgorCisgIDxjb25kaXRpb24gcHJvcGVydHk9ImpzLmF2YWlsIj4KKyAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ib3JnLm1vemlsbGEuamF2YXNjcmlwdC5FdmFsdWF0b3JFeGNlcHRpb24iLz4KKyAgPC9jb25kaXRpb24+CisKKyAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYmVhbnNoZWxsLmF2YWlsIj4KKyAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iYnNoLkJzaE1ldGhvZCIvPgorICA8L2NvbmRpdGlvbj4KKworICA8IS0tIHRoaXMgaXMgaGVyZSB0byB0ZXN0IHRoZSBtYWNybyBpcyB3ZWxsIGNvZGVkIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RNYWNybyI+CisgICAgPHQgbWVzc2FnZT0idGVzdE1hY3JvIj4KKyAgICAgIDxpc3RydWUgdmFsdWU9InRydWUiLz4KKyAgICA8L3Q+CisgICAgPGYgbWVzc2FnZT0idGVzdE1hY3JvMiI+CisgICAgICA8aXN0cnVlIHZhbHVlPSJmYWxzZSIvPgorICAgIDwvZj4KKyAgPC90YXJnZXQ+CisKKyA8dGFyZ2V0IG5hbWU9InRlc3ROb2xhbmd1YWdlIj4KKyAgICA8YXU6ZXhwZWN0ZmFpbHVyZSBtZXNzYWdlPSJBYnNlbmNlIG9mIGxhbmd1YWdlIGF0dHJpYnV0ZSBub3QgZGV0ZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRNZXNzYWdlPSJzY3JpcHQgbGFuZ3VhZ2UgbXVzdCBiZSBzcGVjaWZpZWQiPgorICAgICAgPHQgbWVzc2FnZT0idGVzdE5vbGFuZ3VhZ2UiPgorICAgICAgICA8c2NyaXB0Y29uZGl0aW9uPgorICAgICAgICAgIHNlbGYuc2V0VmFsdWUodHJ1ZSk7CisgICAgICAgIDwvc2NyaXB0Y29uZGl0aW9uPgorICAgICAgPC90PgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Q2xlYXJCeURlZmF1bHQiIGlmPSJqcy5hdmFpbCI+CisgICAgPGYgbWVzc2FnZT0idGVzdENsZWFyQnlEZWZhdWx0Ij4KKyAgICAgIDxzY3JpcHRjb25kaXRpb24gbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgPC9zY3JpcHRjb25kaXRpb24+CisgICAgPC9mPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RWYWx1ZVdvcmtzIiBpZj0ianMuYXZhaWwiPgorICAgIDx0IG1lc3NhZ2U9InRlc3RWYWx1ZVdvcmtzIj4KKyAgICAgIDxzY3JpcHRjb25kaXRpb24gbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDwvdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U2V0V29ya3MiIGlmPSJqcy5hdmFpbCI+CisgICAgPHQgbWVzc2FnZT0idGVzdFNldFdvcmtzIj4KKyAgICAgIDxzY3JpcHRjb25kaXRpb24gbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHZhbHVlPSJmYWxzZSI+CisgICAgICAgIHNlbGYuc2V0VmFsdWUodHJ1ZSk7CisgICAgICA8L3NjcmlwdGNvbmRpdGlvbj4KKyAgICA8L3Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdENsZWFyV29ya3MiIGlmPSJqcy5hdmFpbCI+CisgICAgPGYgbWVzc2FnZT0idGVzdENsZWFyV29ya3MiPgorICAgICAgPHNjcmlwdGNvbmRpdGlvbiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdmFsdWU9InRydWUiPgorICAgICAgICBzZWxmLnNldFZhbHVlKGZhbHNlKTsKKyAgICAgIDwvc2NyaXB0Y29uZGl0aW9uPgorICAgIDwvZj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QmVhbnNoZWxsUmV0dXJuVHJ1ZSIgaWY9ImJlYW5zaGVsbC5hdmFpbCI+CisgICAgPHQgbWVzc2FnZT0idGVzdEJlYW5zaGVsbFJldHVyblRydWUiPgorICAgICAgPHNjcmlwdGNvbmRpdGlvbiBsYW5ndWFnZT0iYmVhbnNoZWxsIiB2YWx1ZT0iZmFsc2UiPgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIDwvc2NyaXB0Y29uZGl0aW9uPgorICAgIDwvdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QmVhbnNoZWxsUmV0dXJuRmFsc2UiIGlmPSJiZWFuc2hlbGwuYXZhaWwiPgorICAgIDxmIG1lc3NhZ2U9InRlc3RCZWFuc2hlbGxSZXR1cm5GYWxzZSI+CisgICAgICA8c2NyaXB0Y29uZGl0aW9uIGxhbmd1YWdlPSJiZWFuc2hlbGwiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgPC9zY3JpcHRjb25kaXRpb24+CisgICAgPC9mPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RCZWFuc2hlbGxSZXR1cm5PdmVycmlkZXNWYWx1ZSIgaWY9ImJlYW5zaGVsbC5hdmFpbCI+CisgICAgPGYgbWVzc2FnZT0idGVzdEJlYW5zaGVsbFJldHVybk92ZXJyaWRlc1ZhbHVlIj4KKyAgICAgIDxzY3JpcHRjb25kaXRpb24gbGFuZ3VhZ2U9ImJlYW5zaGVsbCIgdmFsdWU9ImZhbHNlIj4KKyAgICAgICAgc2VsZi5zZXRWYWx1ZSh0cnVlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgPC9zY3JpcHRjb25kaXRpb24+CisgICAgPC9mPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RCZWFuc2hlbGxSZXR1cm5OdWxsSWdub3JlZCIgaWY9ImJlYW5zaGVsbC5hdmFpbCI+CisgICAgPHQgbWVzc2FnZT0idGVzdEJlYW5zaGVsbFJldHVybk51bGxJZ25vcmVkIj4KKyAgICAgIDxzY3JpcHRjb25kaXRpb24gbGFuZ3VhZ2U9ImJlYW5zaGVsbCIgdmFsdWU9InRydWUiPgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIDwvc2NyaXB0Y29uZGl0aW9uPgorICAgIDwvdD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QmVhbnNoZWxsUmV0dXJuTm9uQm9vbGVhbklnbm9yZWQiIGlmPSJiZWFuc2hlbGwuYXZhaWwiPgorICAgIDx0IG1lc3NhZ2U9InRlc3RCZWFuc2hlbGxSZXR1cm5Ob25Cb29sZWFuSWdub3JlZCI+CisgICAgICA8c2NyaXB0Y29uZGl0aW9uIGxhbmd1YWdlPSJiZWFuc2hlbGwiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgcmV0dXJuIDIwOworICAgICAgPC9zY3JpcHRjb25kaXRpb24+CisgICAgPC90PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RKc1JldHVyblRydWUiIGlmPSJqcy5hdmFpbCI+CisgICAgPHQgbWVzc2FnZT0idGVzdEpzUmV0dXJuVHJ1ZSI+CisgICAgICA8c2NyaXB0Y29uZGl0aW9uIGxhbmd1YWdlPSJqYXZhc2NyaXB0IiB2YWx1ZT0iZmFsc2UiPgorICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFCisgICAgICA8L3NjcmlwdGNvbmRpdGlvbj4KKyAgICA8L3Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEpzUmV0dXJuRmFsc2UiIGlmPSJqcy5hdmFpbCI+CisgICAgPGYgbWVzc2FnZT0idGVzdEpzUmV0dXJuRmFsc2UiPgorICAgICAgPHNjcmlwdGNvbmRpdGlvbiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdmFsdWU9InRydWUiPgorICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbi5GQUxTRQorICAgICAgPC9zY3JpcHRjb25kaXRpb24+CisgICAgPC9mPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RKc1JldHVybk92ZXJyaWRlc1ZhbHVlIiBpZj0ianMuYXZhaWwiPgorICAgIDxmIG1lc3NhZ2U9InRlc3RKc1JldHVybk92ZXJyaWRlc1ZhbHVlIj4KKyAgICAgIDxzY3JpcHRjb25kaXRpb24gbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHZhbHVlPSJmYWxzZSI+CisgICAgICAgIHNlbGYuc2V0VmFsdWUodHJ1ZSk7CisgICAgICAgIGZhbHNlCisgICAgICA8L3NjcmlwdGNvbmRpdGlvbj4KKyAgICA8L2Y+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEpzUmV0dXJuTnVsbElnbm9yZWQiIGlmPSJqcy5hdmFpbCI+CisgICAgPHQgbWVzc2FnZT0idGVzdEpzUmV0dXJuTnVsbElnbm9yZWQiPgorICAgICAgPHNjcmlwdGNvbmRpdGlvbiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdmFsdWU9InRydWUiPgorICAgICAgICBudWxsCisgICAgICA8L3NjcmlwdGNvbmRpdGlvbj4KKyAgICA8L3Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEpzUmV0dXJuTm9uQm9vbGVhbklnbm9yZWQiIGlmPSJqcy5hdmFpbCI+CisgICAgPHQgbWVzc2FnZT0idGVzdEpzUmV0dXJuTm9uQm9vbGVhbklnbm9yZWQiPgorICAgICAgPHNjcmlwdGNvbmRpdGlvbiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdmFsdWU9InRydWUiPgorICAgICAgICBuZXcgamF2YS5sYW5nLkludGVnZXIoMjApCisgICAgICA8L3NjcmlwdGNvbmRpdGlvbj4KKyAgICA8L3Q+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy96aXBmaWxlc2V0LXRlc3QueG1sIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvemlwZmlsZXNldC10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhkOWQzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvemlwZmlsZXNldC10ZXN0LnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCIgZGVmYXVsdD0iYWxsIj4KKyAgPHByb3BlcnR5IG5hbWU9InRvcC5idWlsZC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIgorICAgICAgICAgICAgbG9jYXRpb249IiR7dG9wLmJ1aWxkLmRpcn0vYW50LXVuaXQvemlwZmlsZXNldC1kaXIiLz4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtcmVmaWQtbW9kaWZ5Ij4KKyAgICA8ZmlsZXNldCBpZD0ibW9kaWZ5LXJlZmlkLTEiCisgICAgICAgICAgICAgZGlyPSIke2Jhc2VkaXJ9IgorICAgICAgICAgICAgIGluY2x1ZGVzPSIqLnhtbCIKKyAgICAgICAgICAgICAvPgorICAgIDx6aXBmaWxlc2V0IGlkPSJtb2RpZnktcmVmaWQtMiIKKyAgICAgICAgICAgICAgICByZWZpZD0ibW9kaWZ5LXJlZmlkLTEiCisgICAgICAgICAgICAgICAgcHJlZml4PSJXRUItSU5GL2xpYi8iLz4KKyAgICA8ZGVsZXRlIHF1aWV0PSJ5ZXMiIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPGphciBqYXJmaWxlPSIke2J1aWxkLmRpcn0vamFyLmphciI+CisgICAgICA8emlwZmlsZXNldCByZWZpZD0ibW9kaWZ5LXJlZmlkLTIiLz4KKyAgICA8L2phcj4KKyAgICA8dW5qYXIgc3JjPSIke2J1aWxkLmRpcn0vamFyLmphciIKKyAgICAgICAgICAgZGVzdD0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YnVpbGQuZGlyfS9XRUItSU5GL2xpYi96aXBmaWxlc2V0LXRlc3QueG1sIi8+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QtcmVmaWQtY2hlY2stcHJlZml4Ij4KKyAgICA8emlwZmlsZXNldCBpZD0idGVzdC1yZWZpZCIKKyAgICAgICAgICAgICAgICBkaXI9IiR7YmFzZWRpcn0iLz4KKyAgICA8YXU6ZXhwZWN0ZmFpbHVyZT4KKyAgICAgIDx6aXBmaWxlc2V0IGlkPSJyZWYyIgorICAgICAgICAgICAgICAgICAgcmVmaWQ9InRlc3QtcmVmaWQiCisgICAgICAgICAgICAgICAgICBwcmVmaXg9IldFQi1JTkYvbGliLyIvPgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgICA8YXU6ZXhwZWN0ZmFpbHVyZT4KKyAgICAgIDx6aXBmaWxlc2V0IGlkPSJyZWYzIgorICAgICAgICAgICAgICAgICAgcHJlZml4PSJXRUItSU5GL2xpYi8iCisgICAgICAgICAgICAgICAgICBSZUZpRD0idGVzdC1yZWZpZCIvPgorICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXJlZmlkLWNoZWNrLWVuY29kaW5nIj4KKyAgICA8emlwZmlsZXNldCBpZD0idGVzdC1yZWZpZDIiCisgICAgICAgICAgICAgICAgZW5jb2Rpbmc9InV0Zi04IgorICAgICAgICAgICAgICAgIGRpcj0iJHtiYXNlZGlyfSIvPgorICAgIDxhdTpleHBlY3RmYWlsdXJlPgorICAgICAgPHppcGZpbGVzZXQgaWQ9InJlZjQiCisgICAgICAgICAgICAgICAgICBlbmNvZGluZz0idXRmLTgiCisgICAgICAgICAgICAgICAgICByZWZpZD0idGVzdC1yZWZpZDIiLz4KKyAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYWxsIj4KKyAgICA8YXU6YW50dW5pdD4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9InppcGZpbGVzZXQtdGVzdC54bWwiLz4KKyAgICAgIDxhdTpwbGFpbmxpc3RlbmVyLz4KKyAgICA8L2F1OmFudHVuaXQ+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyRGVsZWdhdGlvblRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlckRlbGVnYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlNjc5NAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlckRlbGVnYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFRlc3QgY2FzZSBmb3IgYW50IGNsYXNzIGxvYWRlcgorICoKKyAqLworcHVibGljIGNsYXNzIEFudENsYXNzTG9hZGVyRGVsZWdhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKiogSW5zdGFuY2Ugb2YgYSB1dGlsaXR5IGNsYXNzIHRvIHVzZSBmb3IgZmlsZSBvcGVyYXRpb25zLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJpdmF0ZSBQcm9qZWN0IHA7CisKKyAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXJEZWxlZ2F0aW9uVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIHAuaW5pdCgpOworICAgIH0KKworICAgIC8qKiBTYW1wbGUgcmVzb3VyY2UgcHJlc2VudCBpbiBidWlsZC90ZXN0Y2FzZXMvICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTT1VSQ0UKKyAgICAgICAgPSAiYXBhY2hlL3Rvb2xzL2FudC9JbmNsdWRlVGVzdC5jbGFzcyI7CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhpcyBwYXRoIHNob3VsZCBjb250YWluIHRoZSBjbGFzcyBmaWxlcyBmb3IgdGhlc2UgdGVzdGNhc2VzOgorICAgICAgICBTdHJpbmcgYnVpbGRUZXN0Y2FzZXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLnRlc3RzIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoImRlZmluZWQgJHtidWlsZC50ZXN0c30iLCBidWlsZFRlc3RjYXNlcyk7CisgICAgICAgIGFzc2VydFRydWUoImhhdmUgYSBkaXIgIiArIGJ1aWxkVGVzdGNhc2VzLAorICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGJ1aWxkVGVzdGNhc2VzKS5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgocCwgYnVpbGRUZXN0Y2FzZXMgKyAiL29yZyIpOworICAgICAgICAvLyBBIHNwZWNpYWwgcGFyZW50IGxvYWRlciB3aGljaCBpcyBub3QgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXI6CisgICAgICAgIENsYXNzTG9hZGVyIHBhcmVudCA9IG5ldyBQYXJlbnRMb2FkZXIoKTsKKyAgICAgICAgLy8gQW4gQW50Q2xhc3NMb2FkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZGVsZWdhdGUgdG8KKyAgICAgICAgLy8gdGhlIHBhcmVudCBhbmQgdGhlbiB0byB0aGUgZGlzayBwYXRoOgorICAgICAgICBDbGFzc0xvYWRlciBhY2wgPSBuZXcgQW50Q2xhc3NMb2FkZXIocGFyZW50LCBwLCBwYXRoLCB0cnVlKTsKKyAgICAgICAgLy8gVGhlIGludGVuZGVkIHJlc3VsdCBVUkxzOgorICAgICAgICBVUkwgdXJsRnJvbVBhdGggPSBuZXcgVVJMKAorICAgICAgICAgICAgRklMRV9VVElMUy50b1VSSShidWlsZFRlc3RjYXNlcykgKyAib3JnLyIgKyBURVNUX1JFU09VUkNFKTsKKyAgICAgICAgVVJMIHVybEZyb21QYXJlbnQgPSBuZXcgVVJMKCJodHRwOi8vYW50LmFwYWNoZS5vcmcvIiArIFRFU1RfUkVTT1VSQ0UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvcnJlY3QgcmVzb3VyY2VzIChyZWd1bGFyIGRlbGVnYXRpb24gb3JkZXIpIiwKKyAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IFVSTFtdIHt1cmxGcm9tUGFyZW50LCB1cmxGcm9tUGF0aH0pLAorICAgICAgICAgICAgZW51bTJMaXN0KGFjbC5nZXRSZXNvdXJjZXMoVEVTVF9SRVNPVVJDRSkpKTsKKyAgICAgICAgYWNsID0gbmV3IEFudENsYXNzTG9hZGVyKHBhcmVudCwgcCwgcGF0aCwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvcnJlY3QgcmVzb3VyY2VzIChyZXZlcnNlIGRlbGVnYXRpb24gb3JkZXIpIiwKKyAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IFVSTFtdIHt1cmxGcm9tUGF0aCwgdXJsRnJvbVBhcmVudH0pLAorICAgICAgICAgICAgZW51bTJMaXN0KGFjbC5nZXRSZXNvdXJjZXMoVEVTVF9SRVNPVVJDRSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZElzb2xhdGVSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGJ1aWxkVGVzdGNhc2VzID0gU3lzdGVtLmdldFByb3BlcnR5KCJidWlsZC50ZXN0cyIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJkZWZpbmVkICR7YnVpbGQudGVzdHN9IiwgYnVpbGRUZXN0Y2FzZXMpOworICAgICAgICBhc3NlcnRUcnVlKCJoYXZlIGEgZGlyICIgKyBidWlsZFRlc3RjYXNlcywKKyAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShidWlsZFRlc3RjYXNlcykuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKHAsIGJ1aWxkVGVzdGNhc2VzICsgIi9vcmciKTsKKyAgICAgICAgLy8gQSBzcGVjaWFsIHBhcmVudCBsb2FkZXIgd2hpY2ggaXMgbm90IHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyOgorICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQgPSBuZXcgUGFyZW50TG9hZGVyKCk7CisKKyAgICAgICAgVVJMIHVybEZyb21QYXRoID0gbmV3IFVSTCgKKyAgICAgICAgICAgIEZJTEVfVVRJTFMudG9VUkkoYnVpbGRUZXN0Y2FzZXMpICsgIm9yZy8iICsgVEVTVF9SRVNPVVJDRSk7CisgICAgICAgIEFudENsYXNzTG9hZGVyIGFjbCA9IG5ldyBBbnRDbGFzc0xvYWRlcihwYXJlbnQsIHAsIHBhdGgsIGZhbHNlKTsKKyAgICAgICAgYWNsLnNldElzb2xhdGVkKHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvcnJlY3QgcmVzb3VyY2VzIChyZXZlcnNlIGRlbGVnYXRpb24gb3JkZXIpIiwKKyAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IFVSTFtdIHt1cmxGcm9tUGF0aH0pLAorICAgICAgICAgICAgZW51bTJMaXN0KGFjbC5nZXRSZXNvdXJjZXMoVEVTVF9SRVNPVVJDRSkpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBlbnVtMkxpc3QoRW51bWVyYXRpb24gZSkgeworICAgICAgICAvLyBKREsgMS40OiByZXR1cm4gQ29sbGVjdGlvbnMubGlzdChlKTsKKyAgICAgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgbC5hZGQoZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbDsKKyAgICB9CisgICAgCisgICAgLyoqIFNwZWNpYWwgbG9hZGVyIHRoYXQganVzdCBrbm93cyBob3cgdG8gZmluZCBURVNUX1JFU09VUkNFLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFBhcmVudExvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBQYXJlbnRMb2FkZXIoKSB7fQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uIGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoVEVTVF9SRVNPVVJDRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oCisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoImh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iICsgbmFtZSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjQ5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQW50Q2xhc3NMb2FkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisvKioKKyAqIFRlc3QgY2FzZSBmb3IgYW50IGNsYXNzIGxvYWRlcgorICoKKyAqLworcHVibGljIGNsYXNzIEFudENsYXNzTG9hZGVyVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHJpdmF0ZSBQcm9qZWN0IHA7CisKKyAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBwID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgcC5pbml0KCk7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvYW50Y2xhc3Nsb2FkZXIueG1sIik7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJzZXR1cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKyAgICAvL3Rlc3QgaW5zcGlyZWQgYnkgYnVnIHJlcG9ydCAzNzA4NQorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXJXaXRoTWFuaWZlc3RJbkRpcldpdGhTcGFjZSgpIHsKKyAgICAgICAgU3RyaW5nIG1haW5qYXJzdHJpbmcgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm1haW4uamFyIik7CisgICAgICAgIFN0cmluZyBleHRqYXJzdHJpbmcgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImV4dC5qYXIiKTsKKyAgICAgICAgUGF0aCBteVBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICBteVBhdGguc2V0TG9jYXRpb24obmV3IEZpbGUobWFpbmphcnN0cmluZykpOworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KCJidWlsZC5zeXNjbGFzc3BhdGgiLCJpZ25vcmUiKTsKKyAgICAgICAgQW50Q2xhc3NMb2FkZXIgbXlMb2FkZXIgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIobXlQYXRoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBteUxvYWRlci5nZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1haW5qYXJzdHJpbmcgKyBGaWxlLnBhdGhTZXBhcmF0b3IgKyBleHRqYXJzdHJpbmcsIHBhdGgpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmFyV2l0aE1hbmlmZXN0SW5Ob25Bc2NpaURpcigpIHsKKyAgICAgICAgU3RyaW5nIG1haW5qYXJzdHJpbmcgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm1haW4uamFyLm5vbmFzY2lpIik7CisgICAgICAgIFN0cmluZyBleHRqYXJzdHJpbmcgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImV4dC5qYXIubm9uYXNjaWkiKTsKKyAgICAgICAgUGF0aCBteVBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICBteVBhdGguc2V0TG9jYXRpb24obmV3IEZpbGUobWFpbmphcnN0cmluZykpOworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KCJidWlsZC5zeXNjbGFzc3BhdGgiLCJpZ25vcmUiKTsKKyAgICAgICAgQW50Q2xhc3NMb2FkZXIgbXlMb2FkZXIgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIobXlQYXRoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBteUxvYWRlci5nZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1haW5qYXJzdHJpbmcgKyBGaWxlLnBhdGhTZXBhcmF0b3IgKyBleHRqYXJzdHJpbmcsIHBhdGgpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYW51cCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKHAsICIuIik7CisgICAgICAgIEFudENsYXNzTG9hZGVyIGxvYWRlciA9IHAuY3JlYXRlQ2xhc3NMb2FkZXIocGF0aCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBleHBlY3QgdG8gZmluZCB0aGlzCisgICAgICAgICAgICBsb2FkZXIuZmluZENsYXNzKCJmdWJhciIpOworICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBleHBlY3QgdG8gZmluZCBmdWJhciBjbGFzcyIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBleHBlY3RlZAorICAgICAgICB9CisKKyAgICAgICAgbG9hZGVyLmNsZWFudXAoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IGV4cGVjdCB0byBmaW5kIHRoaXMKKyAgICAgICAgICAgIGxvYWRlci5maW5kQ2xhc3MoImZ1YmFyIik7CisgICAgICAgICAgICBmYWlsKCJEaWQgbm90IGV4cGVjdCB0byBmaW5kIGZ1YmFyIGNsYXNzIik7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlIGV4cGVjdGVkCisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoImxvYWRlciBzaG91bGQgbm90IGZhaWwgZXZlbiBpZiBjbGVhbmVkIHVwIik7CisgICAgICAgIH0KKworICAgICAgICAvLyB0ZWxsIHRoZSBidWlsZCBpdCBpcyBmaW5pc2hlZAorICAgICAgICBwLmZpcmVCdWlsZEZpbmlzaGVkKG51bGwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gd2UgZG9uJ3QgZXhwZWN0IHRvIGZpbmQgdGhpcworICAgICAgICAgICAgbG9hZGVyLmZpbmRDbGFzcygiZnViYXIiKTsKKyAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZXhwZWN0IHRvIGZpbmQgZnViYXIgY2xhc3MiKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUgZXhwZWN0ZWQKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgibG9hZGVyIHNob3VsZCBub3QgZmFpbCBldmVuIGlmIHByb2plY3QgZmluaXNoZWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEZpbGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRGaWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWU5YmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRGaWxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQSBCdWlsZEZpbGVUZXN0IGlzIGEgVGVzdENhc2Ugd2hpY2ggZXhlY3V0ZXMgdGFyZ2V0cyBmcm9tIGFuIEFudCBidWlsZGZpbGUKKyAqIGZvciB0ZXN0aW5nLgorICoKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBudW1iZXIgb2YgdXRpbGl0eSBtZXRob2RzIGZvciBwYXJ0aWN1bGFyIGJ1aWxkIGZpbGUKKyAqIHRlc3RzIHdoaWNoIGV4dGVuZCB0aGlzIGNsYXNzLgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkRmlsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0OworCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbG9nQnVmZmVyOworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGZ1bGxMb2dCdWZmZXI7CisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgb3V0QnVmZmVyOworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGVyckJ1ZmZlcjsKKyAgICBwcml2YXRlIEJ1aWxkRXhjZXB0aW9uIGJ1aWxkRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlIEJ1aWxkRmlsZVRlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZEZpbGVUZXN0KCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgQnVpbGRGaWxlVGVzdCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIG5hbWUgc3RyaW5nIHRvIHBhc3MgdXAgdG8gVGVzdENhc2UgY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRGaWxlVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbGxzIHRoZSB0YXJnZXQgY2FsbGVkICJ0ZWFyRG93biIKKyAgICAgKiBmcm9tIHRoZSBidWlsZCBmaWxlIHRlc3RlZCBpZiBpdCBleGl0cy4KKyAgICAgKgorICAgICAqIFRoaXMgYWxsb3dzIHRvIHVzZSBBbnQgdGFza3MgZGlyZWN0bHkgaW4gdGhlIGJ1aWxkIGZpbGUKKyAgICAgKiB0byBjbGVhbiB1cCBhZnRlciBlYWNoIHRlc3QuIE5vdGUgdGhhdCBubyAic2V0VXAiIHRhcmdldAorICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkLCBzaW5jZSBpdCdzIHRyaXZpYWwgdG8gaGF2ZSBhCisgICAgICogdGVzdCB0YXJnZXQgZGVwZW5kIG9uIGl0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBNYXliZSB0aGUgQnVpbGRGaWxlVGVzdCB3YXMgc3ViY2xhc3NlZCBhbmQgdGhlcmUgaXMKKyAgICAgICAgICAgICAqIG5vIGluaXRpYWxpemVkIHByb2plY3QuIFNvIHdlIGNvdWxkIGF2b2lkIGdldHRpbmcgYQorICAgICAgICAgICAgICogTlBFLgorICAgICAgICAgICAgICogSWYgdGhlcmUgaXMgYW4gaW5pdGlhbGl6ZWQgcHJvamVjdCBnZXRUYXJnZXRzKCkgZG9lcworICAgICAgICAgICAgICogbm90IHJldHVybiBudWxsIGFzIGl0IGlzIGluaXRpYWxpemVkIGJ5IGFuIGVtcHR5CisgICAgICAgICAgICAgKiBIYXNoU2V0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHRlYXJEb3duID0gInRlYXJEb3duIjsKKyAgICAgICAgaWYgKHByb2plY3QuZ2V0VGFyZ2V0cygpLmNvbnRhaW5zS2V5KHRlYXJEb3duKSkgeworICAgICAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KHRlYXJEb3duKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJ1biBhIHRhcmdldCwgZXhwZWN0IGZvciBhbnkgYnVpbGQgZXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHRhcmdldCB0YXJnZXQgdG8gcnVuCisgICAgICogQHBhcmFtICBjYXVzZSAgaW5mb3JtYXRpb24gc3RyaW5nIHRvIHJlYWRlciBvZiByZXBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RCdWlsZEV4Y2VwdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgY2F1c2UpIHsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbih0YXJnZXQsIGNhdXNlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCBvbmx5IHRoZSBnaXZlbiBtZXNzYWdlIGhhcyBiZWVuIGxvZ2dlZCB3aXRoIGEKKyAgICAgKiBwcmlvcml0eSAmbHQ7PSBJTkZPIHdoZW4gcnVubmluZyB0aGUgZ2l2ZW4gdGFyZ2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGVjdExvZyhTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgbG9nKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgU3RyaW5nIHJlYWxMb2cgPSBnZXRMb2coKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvZywgcmVhbExvZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIHN1YnN0cmluZyBpcyBpbiB0aGUgbG9nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2VydExvZ0NvbnRhaW5pbmcoU3RyaW5nIHN1YnN0cmluZykgeworICAgICAgICBTdHJpbmcgcmVhbExvZyA9IGdldExvZygpOworICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RpbmcgbG9nIHRvIGNvbnRhaW4gXCIiICsgc3Vic3RyaW5nICsgIlwiIGxvZyB3YXMgXCIiCisgICAgICAgICAgICAgICAgICAgKyByZWFsTG9nICsgIlwiIiwKKyAgICAgICAgICAgICAgICAgICByZWFsTG9nLmluZGV4T2Yoc3Vic3RyaW5nKSA+PSAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gc3Vic3RyaW5nIGlzIGluIHRoZSBvdXRwdXQgbWVzc2FnZXMuCisgICAgICogQHNpbmNlIEFudDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2VydE91dHB1dENvbnRhaW5pbmcoU3RyaW5nIHN1YnN0cmluZykgeworICAgICAgICBhc3NlcnRPdXRwdXRDb250YWluaW5nKG51bGwsIHN1YnN0cmluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIHN1YnN0cmluZyBpcyBpbiB0aGUgb3V0cHV0IG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFByaW50IHRoaXMgbWVzc2FnZSBpZiB0aGUgdGVzdCBmYWlscy4gRGVmYXVsdHMgdG8gCisgICAgICogICAgICAgICAgICAgICAgYSBtZWFuaW5nZnVsIHRleHQgaWYgPHR0Pm51bGw8L3R0PiBpcyBwYXNzZWQuICAKKyAgICAgKiBAc2luY2UgQW50MS43CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0T3V0cHV0Q29udGFpbmluZyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHN1YnN0cmluZykgeworICAgICAgICBTdHJpbmcgcmVhbE91dHB1dCA9IGdldE91dHB1dCgpOworICAgICAgICBTdHJpbmcgcmVhbE1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSAKKyAgICAgICAgICAgID8gbWVzc2FnZSAKKyAgICAgICAgICAgIDogImV4cGVjdGluZyBvdXRwdXQgdG8gY29udGFpbiBcIiIgKyBzdWJzdHJpbmcgKyAiXCIgb3V0cHV0IHdhcyBcIiIgKyByZWFsT3V0cHV0ICsgIlwiIjsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWFsTWVzc2FnZSwgcmVhbE91dHB1dC5pbmRleE9mKHN1YnN0cmluZykgPj0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIHN1YnN0cmluZyBpcyBub3QgaW4gdGhlIG91dHB1dCBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBQcmludCB0aGlzIG1lc3NhZ2UgaWYgdGhlIHRlc3QgZmFpbHMuIERlZmF1bHRzIHRvIAorICAgICAqICAgICAgICAgICAgICAgIGEgbWVhbmluZ2Z1bCB0ZXh0IGlmIDx0dD5udWxsPC90dD4gaXMgcGFzc2VkLiAgCisgICAgICogQHNpbmNlIEFudDEuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2VydE91dHB1dE5vdENvbnRhaW5pbmcoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBzdWJzdHJpbmcpIHsKKyAgICAgICAgU3RyaW5nIHJlYWxPdXRwdXQgPSBnZXRPdXRwdXQoKTsKKyAgICAgICAgU3RyaW5nIHJlYWxNZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgCisgICAgICAgICAgICA/IG1lc3NhZ2UgCisgICAgICAgICAgICA6ICJleHBlY3Rpbmcgb3V0cHV0IHRvIG5vdCBjb250YWluIFwiIiArIHN1YnN0cmluZyArICJcIiBvdXRwdXQgd2FzIFwiIiArIHJlYWxPdXRwdXQgKyAiXCIiOworICAgICAgICBhc3NlcnRGYWxzZShyZWFsTWVzc2FnZSwgcmVhbE91dHB1dC5pbmRleE9mKHN1YnN0cmluZykgPj0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIG1lc3NhZ2UgaGFzIGJlZW4gbG9nZ2VkIHdpdGggYSBwcmlvcml0eSAmbHQ7PSBJTkZPIHdoZW4gcnVubmluZyB0aGUKKyAgICAgKiBnaXZlbiB0YXJnZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwZWN0TG9nQ29udGFpbmluZyhTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgbG9nKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgYXNzZXJ0TG9nQ29udGFpbmluZyhsb2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxvZyB0aGUgQnVpbGRGaWxlVGVzdCBvYmplY3QuCisgICAgICogT25seSB2YWxpZCBpZiBjb25maWd1cmVQcm9qZWN0KCkgaGFzIGJlZW4gY2FsbGVkLgorICAgICAqCisgICAgICogQHByZSBsb2dCdWZmZXIhPW51bGwKKyAgICAgKiBAcmV0dXJuICAgIFRoZSBsb2cgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvZygpIHsKKyAgICAgICAgcmV0dXJuIGxvZ0J1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBtZXNzYWdlIGhhcyBiZWVuIGxvZ2dlZCB3aXRoIGEgcHJpb3JpdHkKKyAgICAgKiAmZ3Q7PSBWRVJCT1NFIHdoZW4gcnVubmluZyB0aGUgZ2l2ZW4gdGFyZ2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGVjdERlYnVnbG9nKFN0cmluZyB0YXJnZXQsIFN0cmluZyBsb2cpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBTdHJpbmcgcmVhbExvZyA9IGdldEZ1bGxMb2coKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvZywgcmVhbExvZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0IHRoYXQgdGhlIGdpdmVuIHN1YnN0cmluZyBpcyBpbiB0aGUgbG9nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2VydERlYnVnbG9nQ29udGFpbmluZyhTdHJpbmcgc3Vic3RyaW5nKSB7CisgICAgICAgIFN0cmluZyByZWFsTG9nID0gZ2V0RnVsbExvZygpOworICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RpbmcgZGVidWcgbG9nIHRvIGNvbnRhaW4gXCIiICsgc3Vic3RyaW5nIAorICAgICAgICAgICAgICAgICAgICsgIlwiIGxvZyB3YXMgXCIiCisgICAgICAgICAgICAgICAgICAgKyByZWFsTG9nICsgIlwiIiwKKyAgICAgICAgICAgICAgICAgICByZWFsTG9nLmluZGV4T2Yoc3Vic3RyaW5nKSA+PSAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsb2cgdGhlIEJ1aWxkRmlsZVRlc3Qgb2JqZWN0LgorICAgICAqCisgICAgICogT25seSB2YWxpZCBpZiBjb25maWd1cmVQcm9qZWN0KCkgaGFzIGJlZW4gY2FsbGVkLgorICAgICAqCisgICAgICogQHByZSBmdWxsTG9nQnVmZmVyIT1udWxsCisgICAgICogQHJldHVybiAgICBUaGUgbG9nIHZhbHVlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTG9nKCkgeworICAgICAgICByZXR1cm4gZnVsbExvZ0J1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGV4ZWN1dGUgdGhlIHRhcmdldCwgdmVyaWZ5IG91dHB1dCBtYXRjaGVzIGV4cGVjdGF0aW9ucworICAgICAqCisgICAgICogQHBhcmFtICB0YXJnZXQgIHRhcmdldCB0byBleGVjdXRlCisgICAgICogQHBhcmFtICBvdXRwdXQgIG91dHB1dCB0byBsb29rIGZvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGVjdE91dHB1dChTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgU3RyaW5nIHJlYWxPdXRwdXQgPSBnZXRPdXRwdXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG91dHB1dCwgcmVhbE91dHB1dC50cmltKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSB0YXJnZXQsIHZlcmlmeSBvdXRwdXQgbWF0Y2hlcyBleHBlY3RhdGlvbnMKKyAgICAgKiBhbmQgdGhhdCB3ZSBnb3QgdGhlIG5hbWVkIGVycm9yIGF0IHRoZSBlbmQKKyAgICAgKgorICAgICAqIEBwYXJhbSAgdGFyZ2V0ICB0YXJnZXQgdG8gZXhlY3V0ZQorICAgICAqIEBwYXJhbSAgb3V0cHV0ICBvdXRwdXQgdG8gbG9vayBmb3IKKyAgICAgKiBAcGFyYW0gIGVycm9yICAgRGVzY3JpcHRpb24gb2YgUGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwZWN0T3V0cHV0QW5kRXJyb3IoU3RyaW5nIHRhcmdldCwgU3RyaW5nIG91dHB1dCwgU3RyaW5nIGVycm9yKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgU3RyaW5nIHJlYWxPdXRwdXQgPSBnZXRPdXRwdXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG91dHB1dCwgcmVhbE91dHB1dCk7CisgICAgICAgIFN0cmluZyByZWFsRXJyb3IgPSBnZXRFcnJvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXJyb3IsIHJlYWxFcnJvcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXQoKSB7CisgICAgICAgIHJldHVybiBjbGVhbkJ1ZmZlcihvdXRCdWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKSB7CisgICAgICAgIHJldHVybiBjbGVhbkJ1ZmZlcihlcnJCdWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbiBnZXRCdWlsZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkRXhjZXB0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNsZWFuQnVmZmVyKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNsZWFuZWRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJvb2xlYW4gY3IgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjaCA9IGJ1ZmZlci5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgICAgIGNyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjcikgeworICAgICAgICAgICAgICAgIGNsZWFuZWRCdWZmZXIuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2xlYW5lZEJ1ZmZlci5hcHBlbmQoY2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGVhbmVkQnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB1cCB0byBydW4gdGhlIG5hbWVkIHByb2plY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSAgZmlsZW5hbWUgbmFtZSBvZiBwcm9qZWN0IGZpbGUgdG8gcnVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlUHJvamVjdChTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoZmlsZW5hbWUsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRvIHJ1biB0aGUgbmFtZWQgcHJvamVjdAorICAgICAqCisgICAgICogQHBhcmFtICBmaWxlbmFtZSBuYW1lIG9mIHByb2plY3QgZmlsZSB0byBydW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVQcm9qZWN0KFN0cmluZyBmaWxlbmFtZSwgaW50IGxvZ0xldmVsKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBsb2dCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZ1bGxMb2dCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOworICAgICAgICBwcm9qZWN0LmluaXQoKTsKKyAgICAgICAgRmlsZSBhbnRGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIGZpbGVuYW1lKTsKKyAgICAgICAgcHJvamVjdC5zZXRVc2VyUHJvcGVydHkoImFudC5maWxlIiAsIGFudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIobmV3IEFudFRlc3RMaXN0ZW5lcihsb2dMZXZlbCkpOworICAgICAgICBQcm9qZWN0SGVscGVyLmNvbmZpZ3VyZVByb2plY3QocHJvamVjdCwgYW50RmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSB0YXJnZXQgd2UgaGF2ZSBzZXQgdXAKKyAgICAgKgorICAgICAqIEBwcmUgY29uZmlndXJlUHJvamVjdCBoYXMgYmVlbiBjYWxsZWQKKyAgICAgKiBAcGFyYW0gIHRhcmdldE5hbWUgIHRhcmdldCB0byBydW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0KFN0cmluZyB0YXJnZXROYW1lKSB7CisgICAgICAgIFByaW50U3RyZWFtIHN5c091dCA9IFN5c3RlbS5vdXQ7CisgICAgICAgIFByaW50U3RyZWFtIHN5c0VyciA9IFN5c3RlbS5lcnI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeXNPdXQuZmx1c2goKTsKKyAgICAgICAgICAgIHN5c0Vyci5mbHVzaCgpOworICAgICAgICAgICAgb3V0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBBbnRPdXRwdXRTdHJlYW0ob3V0QnVmZmVyKSk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KG91dCk7CisgICAgICAgICAgICBlcnJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBQcmludFN0cmVhbSBlcnIgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEFudE91dHB1dFN0cmVhbShlcnJCdWZmZXIpKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIoZXJyKTsKKyAgICAgICAgICAgIGxvZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGZ1bGxMb2dCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBidWlsZEV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgICAgICBwcm9qZWN0LmV4ZWN1dGVUYXJnZXQodGFyZ2V0TmFtZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KHN5c091dCk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKHN5c0Vycik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJvamVjdCB3aGljaCBoYXMgYmVlbiBjb25maWd1cmVkIGZvciBhIHRlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBQcm9qZWN0IGluc3RhbmNlIGZvciB0aGlzIHRlc3QuCisgICAgICovCisgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYmFzZSBkaXIgb2YgdGhlIHByb2plY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXRQcm9qZWN0RGlyKCkgeworICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRCYXNlRGlyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyBhIHRhcmdldCwgd2FpdCBmb3IgYSBidWlsZCBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHRhcmdldCB0YXJnZXQgdG8gcnVuCisgICAgICogQHBhcmFtICBjYXVzZSAgaW5mb3JtYXRpb24gc3RyaW5nIHRvIHJlYWRlciBvZiByZXBvcnQKKyAgICAgKiBAcGFyYW0gIG1zZyAgICB0aGUgbWVzc2FnZSB2YWx1ZSBvZiB0aGUgYnVpbGQgZXhjZXB0aW9uIHdlIGFyZSB3YWl0aW5nCisgICAgICogICAgICAgICBmb3Igc2V0IHRvIG51bGwgZm9yIGFueSBidWlsZCBleGNlcHRpb24gdG8gYmUgdmFsaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBjYXVzZSwgU3RyaW5nIG1zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYnVpbGRFeGNlcHRpb24gPSBleDsKKyAgICAgICAgICAgIGlmICgobnVsbCAhPSBtc2cpICYmICghZXguZ2V0TWVzc2FnZSgpLmVxdWFscyhtc2cpKSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBCdWlsZEV4Y2VwdGlvbiBiZWNhdXNlICciICsgY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicgd2l0aCBtZXNzYWdlICciICsgbXNnCisgICAgICAgICAgICAgICAgICAgICAgICArICInIChhY3R1YWwgbWVzc2FnZSAnIiArIGV4LmdldE1lc3NhZ2UoKSArICInIGluc3RlYWQpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IEJ1aWxkRXhjZXB0aW9uIGJlY2F1c2U6ICIgKyBjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcnVuIGEgdGFyZ2V0LCBleHBlY3QgYW4gZXhjZXB0aW9uIHN0cmluZworICAgICAqIGNvbnRhaW5pbmcgdGhlIHN1YnN0cmluZyB3ZSBsb29rIGZvciAoY2FzZSBzZW5zaXRpdmUgbWF0Y2gpCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHRhcmdldCB0YXJnZXQgdG8gcnVuCisgICAgICogQHBhcmFtICBjYXVzZSAgaW5mb3JtYXRpb24gc3RyaW5nIHRvIHJlYWRlciBvZiByZXBvcnQKKyAgICAgKiBAcGFyYW0gIGNvbnRhaW5zICBzdWJzdHJpbmcgb2YgdGhlIGJ1aWxkIGV4Y2VwdGlvbiB0byBsb29rIGZvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZyhTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgY2F1c2UsIFN0cmluZyBjb250YWlucykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYnVpbGRFeGNlcHRpb24gPSBleDsKKyAgICAgICAgICAgIGlmICgobnVsbCAhPSBjb250YWlucykgJiYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKGNvbnRhaW5zKSA9PSAtMSkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgQnVpbGRFeGNlcHRpb24gYmVjYXVzZSAnIiArIGNhdXNlICsgIicgd2l0aCBtZXNzYWdlIGNvbnRhaW5pbmcgJyIgKyBjb250YWlucyArICInIChhY3R1YWwgbWVzc2FnZSAnIiArIGV4LmdldE1lc3NhZ2UoKSArICInIGluc3RlYWQpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IEJ1aWxkRXhjZXB0aW9uIGJlY2F1c2U6ICIgKyBjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2FsbCBhIHRhcmdldCwgdmVyaWZ5IHByb3BlcnR5IGlzIGFzIGV4cGVjdGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IGJ1aWxkIGZpbGUgdGFyZ2V0CisgICAgICogQHBhcmFtIHByb3BlcnR5IHByb3BlcnR5IG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgZXhwZWN0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RQcm9wZXJ0eVNldChTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKHByb3BlcnR5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYXNzZXJ0IHRoYXQgYSBwcm9wZXJ0eSBlcXVhbHMgYSB2YWx1ZTsgY29tcGFyaXNvbiBpcyBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBwcm9wZXJ0eSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIGV4cGVjdGVkIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0UHJvcGVydHlFcXVhbHMoU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHByb2plY3QuZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByb3BlcnR5ICIgKyBwcm9wZXJ0eSx2YWx1ZSxyZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFzc2VydCB0aGF0IGEgcHJvcGVydHkgZXF1YWxzICJ0cnVlIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBwcm9wZXJ0eSBuYW1lCisgICAgICovCisgICAgcHVibGljICB2b2lkIGFzc2VydFByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscyhwcm9wZXJ0eSwgInRydWUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhc3NlcnQgdGhhdCBhIHByb3BlcnR5IGlzIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyAgdm9pZCBhc3NlcnRQcm9wZXJ0eVVuc2V0KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscyhwcm9wZXJ0eSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2FsbCBhIHRhcmdldCwgdmVyaWZ5IG5hbWVkIHByb3BlcnR5IGlzICJ0cnVlIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgYnVpbGQgZmlsZSB0YXJnZXQKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyAgdm9pZCBleHBlY3RQcm9wZXJ0eVNldChTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQodGFyZ2V0LCBwcm9wZXJ0eSwgInRydWUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGEgdGFyZ2V0LCB2ZXJpZnkgcHJvcGVydHkgaXMgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgYnVpbGQgZmlsZSB0YXJnZXQKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgcHJvcGVydHkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyAgdm9pZCBleHBlY3RQcm9wZXJ0eVVuc2V0KFN0cmluZyB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVNldCh0YXJnZXQsIHByb3BlcnR5LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHJlc291cmNlIGZyb20gdGhlIGNhbGxlciBjbGFzc2xvYWRlciB0byBhdm9pZAorICAgICAqIGFzc3VtaW5nIGEgdm0gd29ya2luZyBkaXJlY3RvcnkuIFRoZSByZXNvdXJjZSBwYXRoIG11c3QgYmUKKyAgICAgKiByZWxhdGl2ZSB0byB0aGUgcGFja2FnZSBuYW1lIG9yIGFic29sdXRlIGZyb20gdGhlIHJvb3QgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gcmV0cmlldmUgaXRzIHVybC4KKyAgICAgKiBAdGhyb3dzIGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvciBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyAgVVJMIGdldFJlc291cmNlKFN0cmluZyByZXNvdXJjZSl7CisgICAgICAgIFVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGZpbmQgcmVzb3VyY2UgOiIgKyByZXNvdXJjZSwgdXJsKTsKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhbiBvdXRwdXQgc3RyZWFtIHdoaWNoIHNhdmVzIHN0dWZmIHRvIG91ciBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW50T3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0geworICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXI7CisKKyAgICAgICAgcHVibGljIEFudE91dHB1dFN0cmVhbSggU3RyaW5nQnVmZmVyIGJ1ZmZlciApIHsKKyAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdXIgb3duIHBlcnNvbmFsIGJ1aWxkIGxpc3RlbmVyLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQW50VGVzdExpc3RlbmVyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgaW50IGxvZ0xldmVsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgdGVzdCBsaXN0ZW5lciB3aGljaCB3aWxsIGlnbm9yZSBsb2cgZXZlbnRzCisgICAgICAgICAqIGFib3ZlIHRoZSBnaXZlbiBsZXZlbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBbnRUZXN0TGlzdGVuZXIoaW50IGxvZ0xldmVsKSB7CisgICAgICAgICAgICB0aGlzLmxvZ0xldmVsID0gbG9nTGV2ZWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmlyZWQgYmVmb3JlIGFueSB0YXJnZXRzIGFyZSBzdGFydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaXJlZCBhZnRlciB0aGUgbGFzdCB0YXJnZXQgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50CisgICAgICAgICAqIHdpbGwgc3RpbGwgYmUgdGhyb3duIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgYnVpbGQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgQnVpbGRFdmVudCNnZXRFeGNlcHRpb24oKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmlyZWQgd2hlbiBhIHRhcmdldCBpcyBzdGFydGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFyZ2V0KCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldFN0YXJ0ZWQgIiArIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmlyZWQgd2hlbiBhIHRhcmdldCBoYXMgZmluaXNoZWQuIFRoaXMgZXZlbnQgd2lsbAorICAgICAgICAgKiBzdGlsbCBiZSB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBidWlsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBCdWlsZEV2ZW50I2dldEV4Y2VwdGlvbigpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigidGFyZ2V0RmluaXNoZWQgIiArIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmlyZWQgd2hlbiBhIHRhc2sgaXMgc3RhcnRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBCdWlsZEV2ZW50I2dldFRhc2soKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInRhc2tTdGFydGVkICIgKyBldmVudC5nZXRUYXNrKCkuZ2V0VGFza05hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmlyZWQgd2hlbiBhIHRhc2sgaGFzIGZpbmlzaGVkLiBUaGlzIGV2ZW50IHdpbGwgc3RpbGwKKyAgICAgICAgICogYmUgdGhyb3cgaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBidWlsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBCdWlsZEV2ZW50I2dldEV4Y2VwdGlvbigpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInRhc2tGaW5pc2hlZCAiICsgZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpcmVkIHdoZW5ldmVyIGEgbWVzc2FnZSBpcyBsb2dnZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgQnVpbGRFdmVudCNnZXRNZXNzYWdlKCkKKyAgICAgICAgICogQHNlZSBCdWlsZEV2ZW50I2dldFByaW9yaXR5KCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFByaW9yaXR5KCkgPiBsb2dMZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBldmVudAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFByaW9yaXR5KCkgPT0gUHJvamVjdC5NU0dfSU5GTyB8fAorICAgICAgICAgICAgICAgIGV2ZW50LmdldFByaW9yaXR5KCkgPT0gUHJvamVjdC5NU0dfV0FSTiB8fAorICAgICAgICAgICAgICAgIGV2ZW50LmdldFByaW9yaXR5KCkgPT0gUHJvamVjdC5NU0dfRVJSKSB7CisgICAgICAgICAgICAgICAgbG9nQnVmZmVyLmFwcGVuZChldmVudC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnVsbExvZ0J1ZmZlci5hcHBlbmQoZXZlbnQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0Nhc2VUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQ2FzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I1NmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0Nhc2VUZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBTaW1wbGUgdGVzdHMgb2YgYnVpbGQgZmlsZSBwcm9jZXNzaW5nCisgKi8KK3B1YmxpYyBjbGFzcyBDYXNlVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIENhc2VUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2Nhc2UueG1sIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aGV0aGVyIHRoZSBidWlsZCBmaWxlIHRyZWF0cyBuZXN0ZWQgZWxlbWVudHMgd2l0aG91dAorICAgICAqIHJlZ2FyZCB0byBjYXNlLiBUaGlzIHNob3VsZCBub3QgY2F1c2UgYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlU2Vuc2l0aXZpdHkoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNhc2Utc2Vuc2l0aXZpdHkiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdoZXRoZXIgdGhlIGJ1aWxkIGZpbGUgdXNlcyBjYXNlIHdoZW4gZGV0ZXJtaW5pbmcKKyAgICAgKiB0YXNrIG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrQ2FzZSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0YXNrY2FzZSIsCisgICAgICAgICAgICAiVGFzayBuYW1lcyBhcmUgY2FzZSBzZW5zaXRpdmUiLAorICAgICAgICAgICAgIlByb2JsZW06IGZhaWxlZCB0byBjcmVhdGUgdGFzayBvciB0eXBlIGVjSE8iKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0RpcmVjdG9yeVNjYW5uZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzNDM0YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTM0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyCisgKgorICovCitwdWJsaWMgY2xhc3MgRGlyZWN0b3J5U2Nhbm5lclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBEaXJlY3RvcnlTY2FubmVyVGVzdChTdHJpbmcgbmFtZSkge3N1cGVyKG5hbWUpO30KKworICAgIC8vIGtlZXAgdHJhY2sgb2Ygd2hhdCBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgc3VwcG9ydGVkIGhlcmUuCisgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzU3ltbGlua3MgPSBPcy5pc0ZhbWlseSgidW5peCIpOworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZGlyZWN0b3J5c2Nhbm5lci54bWwiKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInNldHVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhIn0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHt9ICxuZXcgU3RyaW5nW10geyJhbHBoYSJ9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvIn0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9iZXRhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwifSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImFscGhhIiwgImFscGhhL2JldGEiLCAiYWxwaGEvYmV0YS9nYW1tYSJ9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvYmV0YS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyIiLCAiYWxwaGEiLCAiYWxwaGEvYmV0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hIn0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxsUGF0aE1hdGNoZXNDYXNlU2Vuc2l0aXZlKCkgeworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hL0dBTU1BLlhNTCJ9KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHt9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbFBhdGhNYXRjaGVzQ2FzZUluc2Vuc2l0aXZlKCkgeworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZShmYWxzZSk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS9HQU1NQS5YTUwifSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9LAorICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHt9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MkJ1dENhc2VJbnNlbnNpdGl2ZSgpIHsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiQUxQSEEvIn0pOworICAgICAgICBkcy5zZXRDYXNlU2Vuc2l0aXZlKGZhbHNlKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvYmV0YS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJhbHBoYSIsICJhbHBoYS9iZXRhIiwgImFscGhhL2JldGEvZ2FtbWEifSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93U3ltbGlua3MoKSB7CisgICAgICAgIGlmICghc3VwcG9ydHNTeW1saW5rcykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInN5bWxpbmstc2V0dXAiKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS8ifSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYSJ9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvaGliaXRTeW1saW5rcygpIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c1N5bWxpbmtzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgic3ltbGluay1zZXR1cCIpOworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hLyJ9KTsKKyAgICAgICAgZHMuc2V0Rm9sbG93U3ltbGlua3MoZmFsc2UpOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10ge30pOworICAgIH0KKworICAgIC8vIGZhdGhlciBhbmQgY2hpbGQgcGF0dGVybiB0ZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyT2ZJbmNsdWRlUGF0dGVybnNJcnJlbGV2YW50KCkgeworICAgICAgICBTdHJpbmcgW10gZXhwZWN0ZWRGaWxlcyA9IHsiYWxwaGEvYmV0YS9iZXRhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9OworICAgICAgICBTdHJpbmcgW10gZXhwZWN0ZWREaXJlY3RvcmllcyA9IHsiYWxwaGEvYmV0YSIsICJhbHBoYS9iZXRhL2dhbW1hIiB9OworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS9iZT9hLyoqIiwgImFscGhhL2JldGEvZ2FtbWEvIn0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgZXhwZWN0ZWRGaWxlcywgZXhwZWN0ZWREaXJlY3Rvcmllcyk7CisgICAgICAgIC8vIHJlZG8gdGhlIHRlc3QsIGJ1dCB0aGUgMiBpbmNsdWRlIHBhdHRlcm5zIGFyZSBpbnZlcnRlZAorICAgICAgICBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS8iLCAiYWxwaGEvYmU/YS8qKiJ9KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIGV4cGVjdGVkRmlsZXMsIGV4cGVjdGVkRGlyZWN0b3JpZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuc0RpZmZlckluQ2FzZVNjYW5uaW5nU2Vuc2l0aXZlKCkgeworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8iLCAiQUxQSEEvIn0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9iZXRhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwifSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImFscGhhIiwgImFscGhhL2JldGEiLCAiYWxwaGEvYmV0YS9nYW1tYSJ9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybnNEaWZmZXJJbkNhc2VTY2FubmluZ0luc2Vuc2l0aXZlKCkgeworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8iLCAiQUxQSEEvIn0pOworICAgICAgICBkcy5zZXRDYXNlU2Vuc2l0aXZlKGZhbHNlKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvYmV0YS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJhbHBoYSIsICJhbHBoYS9iZXRhIiwgImFscGhhL2JldGEvZ2FtbWEifSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZ1bGxwYXRoRGlmZmVyc0luQ2FzZVNjYW5uaW5nU2Vuc2l0aXZlKCkgeworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIiwKKyAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hL0dBTU1BLlhNTCIKKyAgICAgICAgfSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHt9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbHBhdGhEaWZmZXJzSW5DYXNlU2Nhbm5pbmdJbnNlbnNpdGl2ZSgpIHsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCIsCisgICAgICAgICAgICAiYWxwaGEvYmV0YS9nYW1tYS9HQU1NQS5YTUwiCisgICAgICAgIH0pOworICAgICAgICBkcy5zZXRDYXNlU2Vuc2l0aXZlKGZhbHNlKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge30pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnREaWZmZXJzSW5DYXNlU2Nhbm5pbmdTZW5zaXRpdmUoKSB7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhLyIsICJBTFBIQS9iZXRhLyJ9KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvYmV0YS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJhbHBoYSIsICJhbHBoYS9iZXRhIiwgImFscGhhL2JldGEvZ2FtbWEifSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmVudERpZmZlcnNJbkNhc2VTY2FubmluZ0luc2Vuc2l0aXZlKCkgeworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8iLCAiQUxQSEEvYmV0YS8ifSk7CisgICAgICAgIGRzLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9iZXRhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwifSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImFscGhhIiwgImFscGhhL2JldGEiLCAiYWxwaGEvYmV0YS9nYW1tYSJ9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNhc2UgZm9yIHNldEZvbGxvd0xpbmtzKCkgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb25hbGl0eS4KKyAgICAgKiBPbmx5IHN1cHBvcnRzIHRlc3Qgb24gTGludXggYXQgdGhlIG1vbWVudCBiZWNhdXNlIEphdmEgaGFzCisgICAgICogbm8gcmVhbCBub3Rpb24gb2Ygc3ltbGlua3MgYnVpbHQgaW4sIHNvIGFuIG9zLXNwZWNmaWMgY2FsbAorICAgICAqIHRvIFJ1bnRpbWUuZXhlYygpIG11c3QgYmUgbWFkZSB0byBjcmVhdGUgYSBsaW5rIHRvIHRlc3QgYWdhaW5zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Rm9sbG93TGlua3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc3VwcG9ydHNTeW1saW5rcykgeworICAgICAgICAgICAgRmlsZSBsaW5rRmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL21haW4vb3JnL2FwYWNoZS90b29scy9UaGlzSXNBTGluayIpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJsaW5rIGV4aXN0cyBwcmUtdGVzdD8gIiArIGxpbmtGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgY29uZGl0aW9ucyBhbmQgbW9yZSBjb21tYW5kcyBhcyBzb29uIGFzIHRoZSBuZWVkIGFyaXNlcworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAibG4iLCAiLXMiLCAiYW50IiwgbGlua0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgb3Vyc2VsdmVzIHNvbWUgdGltZSBmb3IgdGhlIHN5c3RlbSBjYWxsCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGV4ZWN1dGUuLi4gdHdlYWsgaWYgeW91IGhhdmUgYSByZWFsbHkgb3ZlcgorICAgICAgICAgICAgICAgICAgICAvLyBsb2FkZWQgc3lzdGVtLgorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIG1ha2luZyBsaW5rICIraW9lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzIik7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJsaW5rIGV4aXN0cyBhZnRlciBleGVjPyAiICsgbGlua0ZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQW50IGtub3dzIGl0IGlzIGEgbGluaz8gIiArIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5pc1N5bWJvbGljTGluayhkaXIsICJUaGlzSXNBTGluayIpKTsKKworICAgICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworCisgICAgICAgICAgICAgICAgLy8gZm9sbG93TGlua3Mgc2hvdWxkIGJlIHRydWUgYnkgZGVmYXVsdCwgYnV0IGlmIHRoaXMgZXZlcgorICAgICAgICAgICAgICAgIC8vIGNoYW5nZXMgd2Ugd2lsbCBuZWVkIHRoaXMgbGluZS4KKyAgICAgICAgICAgICAgICBkcy5zZXRGb2xsb3dTeW1saW5rcyh0cnVlKTsKKworICAgICAgICAgICAgICAgIGRzLnNldEJhc2VkaXIoZGlyKTsKKyAgICAgICAgICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geyJhbnQvKioifSk7CisgICAgICAgICAgICAgICAgZHMuc2NhbigpOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXZlWmlwUGFja2FnZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaGF2ZVRhc2tkZWZzUGFja2FnZSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgU3RyaW5nW10gaW5jbHVkZWQgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlZFtpXS5lcXVhbHMoInppcCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlWmlwUGFja2FnZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZWRbaV0uZXF1YWxzKCJUaGlzSXNBTGluayIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0YXNrZGVmcyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlVGFza2RlZnNQYWNrYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZvbGxvd2VkIHRoZSBzeW1saW5rIHdlIGp1c3QgbWFkZSB3ZSBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyBieXBhc3MgdGhlIGV4Y2x1ZGVzLgorCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiKDEpIHppcCBwYWNrYWdlIGluY2x1ZGVkIiwgaGF2ZVppcFBhY2thZ2UpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIigxKSB0YXNrZGVmcyBwYWNrYWdlIGluY2x1ZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVUYXNrZGVmc1BhY2thZ2UpOworCisKKyAgICAgICAgICAgICAgICBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgICAgICAgICAgZHMuc2V0Rm9sbG93U3ltbGlua3MoZmFsc2UpOworCisgICAgICAgICAgICAgICAgZHMuc2V0QmFzZWRpcihkaXIpOworICAgICAgICAgICAgICAgIGRzLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFudC8qKiJ9KTsKKyAgICAgICAgICAgICAgICBkcy5zY2FuKCk7CisKKyAgICAgICAgICAgICAgICBoYXZlWmlwUGFja2FnZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhdmVUYXNrZGVmc1BhY2thZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbmNsdWRlZCA9IGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8aW5jbHVkZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkW2ldLmVxdWFscygiemlwIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVaaXBQYWNrYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmNsdWRlZFtpXS5lcXVhbHMoIlRoaXNJc0FMaW5rIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRhc2tkZWZzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVUYXNrZGVmc1BhY2thZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIigyKSB6aXAgcGFja2FnZSBpbmNsdWRlZCIsIGhhdmVaaXBQYWNrYWdlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCIoMikgdGFza2RlZnMgcGFja2FnZSBub3QgaW5jbHVkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhdmVUYXNrZGVmc1BhY2thZ2UpOworCisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigibGluayBleGlzdHMgcHJlLWRlbGV0ZT8gIiArIGxpbmtGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpbmtGaWxlLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGVsZXRlICIgKyBsaW5rRmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigibGluayBleGlzdHMgcG9zdC1kZWxldGU/ICIgKyBsaW5rRmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZU9uZUZpbGUoKSB7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiKiovKi54bWwiCisgICAgICAgIH0pOworICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhL2JldGEvYip4bWwiCisgICAgICAgIH0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwifSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7fSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVIYXNQcmVjZWRlbmNlKCkgeworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhLyoqIgorICAgICAgICB9KTsKKyAgICAgICAgZHMuc2V0RXhjbHVkZXMobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJhbHBoYS8qKiIKKyAgICAgICAgfSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10ge30sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge30pOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFsdGVybmF0ZUluY2x1ZGVFeGNsdWRlKCkgeworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhLyoqIiwKKyAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hLyoqIgorICAgICAgICB9KTsKKyAgICAgICAgZHMuc2V0RXhjbHVkZXMobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJhbHBoYS9iZXRhLyoqIgorICAgICAgICB9KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7fSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImFscGhhIn0pOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFsdGVybmF0ZUV4Y2x1ZGVJbmNsdWRlKCkgeworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhLyoqIiwKKyAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hLyoqIgorICAgICAgICB9KTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJhbHBoYS9iZXRhLyoqIgorICAgICAgICB9KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7fSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7fSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGluc3BpcmVkIGJ5IEJ1ZyMxNDE1LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbk9mRXhjbHVkZWREaXJlY3RvcnkoKSB7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJjaGlsZHJlbi1vZi1leGNsdWRlZC1kaXItc2V0dXAiKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0RXhjbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvKioifSk7CisgICAgICAgIGRzLnNldEZvbGxvd1N5bWxpbmtzKGZhbHNlKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImRlbHRhL2RlbHRhLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyIiLCAiZGVsdGEifSk7CisKKyAgICAgICAgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhIn0pOworICAgICAgICBkcy5zZXRGb2xsb3dTeW1saW5rcyhmYWxzZSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2JldGEueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlbHRhL2RlbHRhLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiIiwgImFscGhhL2JldGEiLCAiYWxwaGEvYmV0YS9nYW1tYSIsICJkZWx0YSJ9KTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0V4Y2x1ZGVkRGlyZWN0b3J5U2Nhbm5lZCgpIHsKKyAgICAgICAgU3RyaW5nIHNoYXJlY2xhc3Nsb2FkZXIgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiKTsKKyAgICAgICAgLy8gd2hlbiB0aGUgdGVzdCBpcyBzdGFydGVkIGJ5IHRoZSBidWlsZC54bWwgb2YgYW50CisgICAgICAgIC8vIGlmIHRoZSBwcm9wZXJ0eSB0ZXN0cy5hbmQuYW50LnNoYXJlLmNsYXNzbG9hZGVyIGlzIG5vdCBzZXQgaW4gdGhlIGJ1aWxkLnhtbAorICAgICAgICAvLyBhIHN5c3Byb3BlcnR5IHdpdGggbmFtZSB0ZXN0cy5hbmQuYW50LnNoYXJlLmNsYXNzbG9hZGVyIGFuZCB2YWx1ZQorICAgICAgICAvLyAke3Rlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXJ9IHdpbGwgYmUgc2V0CisgICAgICAgIC8vIHdlIGFyZSB0cnlpbmcgdG8gY2F0Y2ggdGhpcyBoZXJlLgorICAgICAgICBpZiAoc2hhcmVjbGFzc2xvYWRlciA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgKHNoYXJlY2xhc3Nsb2FkZXIgIT0gbnVsbCAmJiBzaGFyZWNsYXNzbG9hZGVyLmluZGV4T2YoIiR7IikgPT0gMCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2Fubm90IGV4ZWN1dGUgdGVzdElzRXhjbHVkZWREaXJlY3RvcnlTY2FubmVkIHdoZW4gdGVzdHMgYXJlIGZvcmtlZCwgIiArCisgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIHByaXZhdGUgbWV0aG9kIGNhbGxlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJjaGlsZHJlbi1vZi1leGNsdWRlZC1kaXItc2V0dXAiKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0RXhjbHVkZXMobmV3IFN0cmluZ1tdIHsiKiovZ2FtbWEvKioifSk7CisgICAgICAgIGRzLnNldEZvbGxvd1N5bWxpbmtzKGZhbHNlKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBTZXQgc2V0ID0gZHMuZ2V0U2Nhbm5lZERpcnMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImVtcHR5IHNldCIsIHNldC5pc0VtcHR5KCkpOworICAgICAgICBTdHJpbmcgcyA9ICJhbHBoYS9iZXRhL2dhbW1hLyIucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgIGFzc2VydEZhbHNlKCJzY2FubmVkICIgKyBzLCBzZXQuY29udGFpbnMocykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZTEoKSB7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJleHRlbmRlZC1zZXR1cCIpOworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgU3RyaW5nIHRtcGRpciA9IGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSArICIvdG1wIjsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHt0bXBkaXIgKyAiLyoqLyoifSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10ge3RtcGRpciArICIvYWxwaGEvYmV0YS9iZXRhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkaXIgKyAiL2FscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRpciArICIvZGVsdGEvZGVsdGEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge3RtcGRpciArICIvYWxwaGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkaXIgKyAiL2FscGhhL2JldGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkaXIgKyAiL2FscGhhL2JldGEvZ2FtbWEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkaXIgKyAiL2RlbHRhIn0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZTIoKSB7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJzZXR1cCIpOworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvKioiLCAiYWxwaGEvYmV0YS9nYW1tYS8qKiJ9KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBTdHJpbmdbXSBtdCA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbXQsIG10KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGUzKCkgeworICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZXh0ZW5kZWQtc2V0dXAiKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgICAgIFN0cmluZyB0bXBkaXIgPSBnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIsICcvJykgKyAiL3RtcCI7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7dG1wZGlyICsgIi8qKi8qIn0pOworICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geyIqKi9hbHBoYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL2RlbHRhLyoifSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10ge3RtcGRpciArICIvYWxwaGEvYmV0YS9iZXRhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkaXIgKyAiL2FscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge3RtcGRpciArICIvYWxwaGEvYmV0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRpciArICIvYWxwaGEvYmV0YS9nYW1tYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRpciArICIvZGVsdGEifSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFic29sdXRlNCgpIHsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoImV4dGVuZGVkLXNldHVwIik7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworICAgICAgICBTdHJpbmcgdG1wZGlyID0gZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKAorICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpICsgIi90bXAiOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10ge3RtcGRpciArICIvYWxwaGEvYmV0YS8qKi8qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkaXIgKyAiL2RlbHRhLyoifSk7CisgICAgICAgIGRzLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmdbXSB7IioqL2JldGEueG1sIn0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHt0bXBkaXIgKyAiL2FscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRpciArICIvZGVsdGEvZGVsdGEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge3RtcGRpciArICIvYWxwaGEvYmV0YS9nYW1tYSJ9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGU1KCkgeworICAgICAgICAvL3Rlc3RpbmcgZHJpdmUgbGV0dGVyIHNlYXJjaCBmcm9tIHJvb3Q6CisgICAgICAgIGlmICghKE9zLmlzRmFtaWx5KCJkb3MiKSB8fCBPcy5pc0ZhbWlseSgibmV0d2FyZSIpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworICAgICAgICBTdHJpbmcgcGF0dGVybiA9IG5ldyBGaWxlKEZpbGUuc2VwYXJhdG9yKS5nZXRBYnNvbHV0ZVBhdGgoKS50b1VwcGVyQ2FzZSgpICsgIioiOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10ge3BhdHRlcm59KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICAvL2lmIHRoaXMgaXMgb3VyIGNvbnRleHQgd2UgYXNzdW1lIHRoZXJlIG11c3QgYmUgc29tZXRoaW5nIGhlcmU6CisgICAgICAgIGFzc2VydFRydWUoInNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSByZXNpZGVudCBmaWxlIiwKKyAgICAgICAgICAgIGRzLmdldEluY2x1ZGVkRmlsZXNDb3VudCgpICsgZHMuZ2V0SW5jbHVkZWREaXJzQ291bnQoKSA+IDApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb21wYXJlRmlsZXMoRGlyZWN0b3J5U2Nhbm5lciBkcywgU3RyaW5nW10gZXhwZWN0ZWRGaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkRGlyZWN0b3JpZXMpIHsKKyAgICAgICAgU3RyaW5nIGluY2x1ZGVkRmlsZXNbXSA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgU3RyaW5nIGluY2x1ZGVkRGlyZWN0b3JpZXNbXSA9IGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlIHByZXNlbnQ6ICIsIGV4cGVjdGVkRmlsZXMubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRGaWxlcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRpcmVjdG9yaWVzIHByZXNlbnQ6ICIsIGV4cGVjdGVkRGlyZWN0b3JpZXMubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWREaXJlY3Rvcmllcy5sZW5ndGgpOworCisgICAgICAgIFRyZWVTZXQgZmlsZXMgPSBuZXcgVHJlZVNldCgpOworICAgICAgICBmb3IgKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IGluY2x1ZGVkRmlsZXMubGVuZ3RoOyBjb3VudGVyKyspIHsKKyAgICAgICAgICAgIGZpbGVzLmFkZChpbmNsdWRlZEZpbGVzW2NvdW50ZXJdLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsKKyAgICAgICAgfQorICAgICAgICBUcmVlU2V0IGRpcmVjdG9yaWVzID0gbmV3IFRyZWVTZXQoKTsKKyAgICAgICAgZm9yIChpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBpbmNsdWRlZERpcmVjdG9yaWVzLmxlbmd0aDsgY291bnRlcisrKSB7CisgICAgICAgICAgICBkaXJlY3Rvcmllcy5hZGQoaW5jbHVkZWREaXJlY3Rvcmllc1tjb3VudGVyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgY3VycmVudGZpbGU7CisgICAgICAgIEl0ZXJhdG9yIGkgPSBmaWxlcy5pdGVyYXRvcigpOworICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgY3VycmVudGZpbGUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZpbGVzW2NvdW50ZXJdLCBjdXJyZW50ZmlsZSk7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGN1cnJlbnRkaXJlY3Rvcnk7CisgICAgICAgIEl0ZXJhdG9yIGRpcml0ID0gZGlyZWN0b3JpZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgY291bnRlciA9IDA7CisgICAgICAgIHdoaWxlIChkaXJpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGN1cnJlbnRkaXJlY3RvcnkgPSAoU3RyaW5nKSBkaXJpdC5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWREaXJlY3Rvcmllc1tjb3VudGVyXSwgY3VycmVudGRpcmVjdG9yeSk7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXNwYXRjaFRhc2tUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRGlzcGF0Y2hUYXNrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODRhOTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRGlzcGF0Y2hUYXNrVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBEaXNwYXRjaFRhc2tUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgRGlzcGF0Y2hUYXNrVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kaXNwYXRjaC9kaXNwYXRjaC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oImRpc3AiLCAibGlzdCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tBYnN0cmFjdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza0Fic3RyYWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmZTA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tBYnN0cmFjdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEdW1teVRhc2tBYnN0cmFjdCBleHRlbmRzIFRhc2sgeworCisgICAgcHVibGljIER1bW15VGFza0Fic3RyYWN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWJzdHJhY3REdW1teSgpOworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza0ludGVyZmFjZS5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza0ludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTVmNWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrSW50ZXJmYWNlLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitwdWJsaWMgaW50ZXJmYWNlIER1bW15VGFza0ludGVyZmFjZSB7CisKKyAgICB2b2lkIGV4ZWN1dGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza09rLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrT2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhmZGFiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza09rLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworcHVibGljIGNsYXNzIER1bW15VGFza09rIGV4dGVuZHMgVGFzayB7CisKKyAgICBwdWJsaWMgRHVtbXlUYXNrT2soKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tPa05vblRhc2suamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tPa05vblRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzRhYmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza09rTm9uVGFzay5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworcHVibGljIGNsYXNzIER1bW15VGFza09rTm9uVGFzayB7CisKKyAgICBwdWJsaWMgRHVtbXlUYXNrT2tOb25UYXNrKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aE5vblB1YmxpY0V4ZWN1dGUuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tXaXRoTm9uUHVibGljRXhlY3V0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NjI4M2QKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aE5vblB1YmxpY0V4ZWN1dGUuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK3B1YmxpYyBjbGFzcyBEdW1teVRhc2tXaXRoTm9uUHVibGljRXhlY3V0ZSB7CisKKyAgICBwdWJsaWMgRHVtbXlUYXNrV2l0aE5vblB1YmxpY0V4ZWN1dGUoKSB7CisgICAgfQorCisgICAgdm9pZCBleGVjdXRlKCkgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhOb25Wb2lkRXhlY3V0ZS5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhOb25Wb2lkRXhlY3V0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NmI5YjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aE5vblZvaWRFeGVjdXRlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitwdWJsaWMgY2xhc3MgRHVtbXlUYXNrV2l0aE5vblZvaWRFeGVjdXRlIHsKKworICAgIHB1YmxpYyBEdW1teVRhc2tXaXRoTm9uVm9pZEV4ZWN1dGUoKSB7CisgICAgfQorCisgICAgcHVibGljIGludCBleGVjdXRlKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tXaXRob3V0RGVmYXVsdENvbnN0cnVjdG9yLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dERlZmF1bHRDb25zdHJ1Y3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjYxZjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dERlZmF1bHRDb25zdHJ1Y3Rvci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKK3B1YmxpYyBjbGFzcyBEdW1teVRhc2tXaXRob3V0RGVmYXVsdENvbnN0cnVjdG9yIGV4dGVuZHMgVGFzayB7CisKKyAgICBwdWJsaWMgRHVtbXlUYXNrV2l0aG91dERlZmF1bHRDb25zdHJ1Y3RvcihpbnQgZHVtbXkpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhvdXRFeGVjdXRlLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dEV4ZWN1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDVlYTAwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhvdXRFeGVjdXRlLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitwdWJsaWMgY2xhc3MgRHVtbXlUYXNrV2l0aG91dEV4ZWN1dGUgeworCisgICAgcHVibGljIER1bW15VGFza1dpdGhvdXRFeGVjdXRlKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoU3RyaW5nIGR1bW15KSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dFB1YmxpY0NvbnN0cnVjdG9yLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dFB1YmxpY0NvbnN0cnVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjNGZmOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tXaXRob3V0UHVibGljQ29uc3RydWN0b3IuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCitwdWJsaWMgY2xhc3MgRHVtbXlUYXNrV2l0aG91dFB1YmxpY0NvbnN0cnVjdG9yIGV4dGVuZHMgVGFzayB7CisKKyAgICBEdW1teVRhc2tXaXRob3V0UHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGVjdXRvclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGVjdXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjhjOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0V4ZWN1dG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEV4ZWN1dG9yIHRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBFeGVjdXRvclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9DSEVDSworICAgICAgICA9ICJvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuU2luZ2xlQ2hlY2tFeGVjdXRvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9ERVBTCisgICAgICAgID0gIm9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci5JZ25vcmVEZXBlbmRlbmNpZXNFeGVjdXRvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVjdG9yIFRBUkdFVF9OQU1FUzsKKyAgICBzdGF0aWMgeworICAgICAgICBUQVJHRVRfTkFNRVMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFRBUkdFVF9OQU1FUy5hZGQoImEiKTsKKyAgICAgICAgVEFSR0VUX05BTUVTLmFkZCgiYiIpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHRhcmdldENvdW50OworCisgICAgLyogQnVpbGRMaXN0ZW5lciBzdHVmZiAqLworICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICB0YXJnZXRDb3VudCsrOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9CisgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkge30KKworICAgIHB1YmxpYyBFeGVjdXRvclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZXhlY3V0b3IueG1sIik7CisgICAgICAgIHRhcmdldENvdW50ID0gMDsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmFkZEJ1aWxkTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2plY3QoZSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBlLCBib29sZWFuIGYpIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2plY3QoZSwgZiwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBlLCBib29sZWFuIGYsIGJvb2xlYW4gaykgeworICAgICAgICBQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIHAuc2V0TmV3UHJvcGVydHkoImFudC5leGVjdXRvci5jbGFzcyIsIGUpOworICAgICAgICBwLnNldEtlZXBHb2luZ01vZGUoayk7CisgICAgICAgIGlmIChmKSB7CisgICAgICAgICAgICBwLnNldE5ld1Byb3BlcnR5KCJmYWlsZm9vIiwgImZvbyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RXhlY3V0b3IoKSB7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0cyhUQVJHRVRfTkFNRVMpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgdGFyZ2V0Q291bnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVDaGVja0V4ZWN1dG9yKCkgeworICAgICAgICBnZXRQcm9qZWN0KFNJTkdMRV9DSEVDSykuZXhlY3V0ZVRhcmdldHMoVEFSR0VUX05BTUVTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHRhcmdldENvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlRGVwZW5kZW5jaWVzRXhlY3V0b3IoKSB7CisgICAgICAgIGdldFByb2plY3QoSUdOT1JFX0RFUFMpLmV4ZWN1dGVUYXJnZXRzKFRBUkdFVF9OQU1FUyk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB0YXJnZXRDb3VudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRGYWlsdXJlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0UHJvamVjdChudWxsLCB0cnVlKS5leGVjdXRlVGFyZ2V0cyhUQVJHRVRfTkFNRVMpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGZhaWwiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5lcXVhbHMoImZhaWxmb28iKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGFyZ2V0Q291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUNoZWNrRmFpbHVyZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldFByb2plY3QoU0lOR0xFX0NIRUNLLCB0cnVlKS5leGVjdXRlVGFyZ2V0cyhUQVJHRVRfTkFNRVMpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGZhaWwiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5lcXVhbHMoImZhaWxmb28iKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGFyZ2V0Q291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElnbm9yZURlcGVuZGVuY2llc0ZhaWx1cmUoKSB7CisgICAgICAgIC8vbm8gZm9vIGZhaWx1cmU7IGZvbyBpcyBuZXZlciBleGVjdXRlZCBhcyBkZXBlbmRlbmNpZXMgYXJlIGlnbm9yZWQhCisgICAgICAgIGdldFByb2plY3QoSUdOT1JFX0RFUFMsIHRydWUpLmV4ZWN1dGVUYXJnZXRzKFRBUkdFVF9OQU1FUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtlZXBHb2luZ0RlZmF1bHQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KG51bGwsIHRydWUsIHRydWUpLmV4ZWN1dGVUYXJnZXRzKFRBUkdFVF9OQU1FUyk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgZmFpbCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiZmFpbGZvbyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCB0YXJnZXRDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2VlcEdvaW5nU2luZ2xlQ2hlY2soKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KFNJTkdMRV9DSEVDSywgdHJ1ZSwgdHJ1ZSkuZXhlY3V0ZVRhcmdldHMoVEFSR0VUX05BTUVTKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBmYWlsIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJmYWlsZm9vIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRhcmdldENvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZWVwR29pbmdJZ25vcmVEZXBlbmRlbmNpZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL2V4cGxpY2l0bHkgYWRkIGZvbyBmb3IgZmFpbHVyZQorICAgICAgICAgICAgVmVjdG9yIHRhcmdldE5hbWVzID0gbmV3IFZlY3RvcihUQVJHRVRfTkFNRVMpOworICAgICAgICAgICAgdGFyZ2V0TmFtZXMuYWRkKDAsICJmb28iKTsKKyAgICAgICAgICAgIGdldFByb2plY3QoSUdOT1JFX0RFUFMsIHRydWUsIHRydWUpLmV4ZWN1dGVUYXJnZXRzKHRhcmdldE5hbWVzKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBmYWlsIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJmYWlsZm9vIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHRhcmdldENvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRXh0ZW5kZWRUYXNrZGVmVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0V4dGVuZGVkVGFza2RlZlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGE4MDI5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0V4dGVuZGVkVGFza2RlZlRlc3QuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCisvKioKKyAqIGNyZWF0ZWQgMTYtTWFyLTIwMDYgMTI6MjU6MTIKKyAqLworCitwdWJsaWMgY2xhc3MgRXh0ZW5kZWRUYXNrZGVmVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBCdWlsZEZpbGVUZXN0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHN0cmluZyB0byBwYXNzIHVwIHRvIFRlc3RDYXNlIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIEV4dGVuZGVkVGFza2RlZlRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZXh0ZW5kZWQtdGFza2RlZi54bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbGxzIHRoZSB0YXJnZXQgY2FsbGVkICJ0ZWFyRG93biIKKyAgICAgKiBmcm9tIHRoZSBidWlsZCBmaWxlIHRlc3RlZCBpZiBpdCBleGl0cy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBhbGxvd3MgdG8gdXNlIEFudCB0YXNrcyBkaXJlY3RseSBpbiB0aGUgYnVpbGQgZmlsZQorICAgICAqIHRvIGNsZWFuIHVwIGFmdGVyIGVhY2ggdGVzdC4gTm90ZSB0aGF0IG5vICJzZXRVcCIgdGFyZ2V0CisgICAgICogaXMgYXV0b21hdGljYWxseSBjYWxsZWQsIHNpbmNlIGl0J3MgdHJpdmlhbCB0byBoYXZlIGEKKyAgICAgKiB0ZXN0IHRhcmdldCBkZXBlbmQgb24gaXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVhcmRvd24iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdFJ1biIsCisgICAgICAgICAgICAgICAgImV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIHN1YmNsYXNzIiwKKyAgICAgICAgICAgICAgICAiZXhlY3V0aW5nIHRoZSBGb28gdGFzayIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSdW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdFJ1bjIiLAorICAgICAgICAgICAgICAgICJleGNlcHRpb24gdGhyb3duIGJ5IHRoZSBzdWJjbGFzcyIsCisgICAgICAgICAgICAgICAgImV4ZWN1dGluZyB0aGUgRm9vIHRhc2siKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbW11dGFibGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvSW1tdXRhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjU5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvSW1tdXRhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgSW1tdXRhYmxlVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIEltbXV0YWJsZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW1tdXRhYmxlLnhtbCIpOworICAgIH0KKworICAgIC8vIG92ZXJyaWRlIGFsbG93ZWQgb24gPGF2YWlsYWJsZT4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdmVycmlkZSIsIHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7CisgICAgfQorCisgICAgLy8gZW5zdXJlIDx0c3RhbXA+J3MgbmV3IHByZWZpeCBhdHRyaWJ1dGUgaXMgd29ya2luZworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHByb2plY3QuZ2V0UHJvcGVydHkoIkRTVEFNUCIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9qZWN0LmdldFByb3BlcnR5KCJzdGFydC5EU1RBTVAiKSk7CisgICAgfQorCisgICAgLy8gZW5zdXJlIDx0c3RhbXA+IGZvbGxvd3MgdGhlIGltbXV0YWJpbGl0eSBydWxlCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWwiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJEU1RBTVAiKSk7CisgICAgfQorCisgICAgLy8gZW5zdXJlIDxjb25kaXRpb24+IGZvbGxvd3MgdGhlIGltbXV0YWJpbGl0eSBydWxlCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWwiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KKyAgICAvLyBlbnN1cmUgPGNoZWNrc3VtPiBmb2xsb3dzIHRoZSBpbW11dGFiaWxpdHkgcnVsZQorICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWdpbmFsIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKKyAgICB9CisKKyAgICAvLyBlbnN1cmUgPGV4ZWM+IGZvbGxvd3MgdGhlIGltbXV0YWJpbGl0eSBydWxlCisgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7CisgICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWwiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbCIsIHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QyIikpOworICAgIH0KKworICAgIC8vIGVuc3VyZSA8cGF0aGNvbnZlcnQ+IGZvbGxvd3MgdGhlIGltbXV0YWJpbGl0eSBydWxlCisgICAgcHVibGljIHZvaWQgdGVzdDcoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q3Iik7CisgICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWwiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0luY2x1ZGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvSW5jbHVkZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNiNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0luY2x1ZGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogVGVzdCB0aGUgYnVpbGQgZmlsZSBpbmNsdXNpb24gdXNpbmcgWE1MIGVudGl0aWVzLgorICoKKyAqLworcHVibGljIGNsYXNzIEluY2x1ZGVUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgSW5jbHVkZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9pbmNsdWRlLnhtbCIpOworICAgICAgICBleHBlY3RMb2coInRlc3QxIiwgImZyb20gaW5jbHVkZWQgZW50aXR5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnI21lbnQvaW5jbHVkZS54bWwiKTsKKyAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0MSIsICJmcm9tIGluY2x1ZGVkIGVudGl0eSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZyNtZW50L3NpbXBsZS54bWwiKTsKKyAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0MSIsICJmcm9tIHNpbXBsZSBidWlsZGZpbGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL3JlbGF0aXZlLnhtbCIpOworICAgICAgICBleHBlY3RMb2coInRlc3QxIiwgImZyb20gaW5jbHVkZWQgZW50aXR5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnI21lbnQvcmVsYXRpdmUueG1sIik7CisgICAgICAgIGV4cGVjdExvZygidGVzdDEiLCAiZnJvbSBpbmNsdWRlZCBlbnRpdHkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFcnJvckluSW5jbHVkaW5nKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3BhcnNlX2Vycm9yL2J1aWxkLnhtbCIpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgY2F1c2VkIGEgcGFyc2VyIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgcmVmZXIgdG8gYnVpbGQueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuaW5kZXhPZigiYnVpbGQueG1sOiIpID4gLTEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRhc2tFcnJvckluSW5jbHVkaW5nKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfdGFza19lcnJvci9idWlsZC54bWwiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QiKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIGNhdXNlIGEgYnVpbGQgZmFpbHVyZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgc3RhcnQgd2l0aCBcJ1dhcm5pbmc6IENvdWxkIG5vdCBmaW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKCJXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBmaWxlICIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNob3VsZCBlbmQgd2l0aCBidWlsZC54bWw6MTQ6ICIsCisgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLmVuZHNXaXRoKCJidWlsZC54bWw6MTQ6ICIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUVycm9ySW5JbmNsdWRlZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRlZF9maWxlX3BhcnNlX2Vycm9yL2J1aWxkLnhtbCIpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgY2F1c2VkIGEgcGFyc2VyIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgcmVmZXIgdG8gaW5jbHVkZWRfZmlsZS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZigiaW5jbHVkZWRfZmlsZS54bWw6IikgPiAtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza0Vycm9ySW5JbmNsdWRlZCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfdGFza19lcnJvci9idWlsZC54bWwiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QiKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIGNhdXNlIGEgYnVpbGQgZmFpbHVyZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgc3RhcnQgd2l0aCBcJ1dhcm5pbmc6IENvdWxkIG5vdCBmaW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKCJXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBmaWxlICIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNob3VsZCBlbmQgd2l0aCBpbmNsdWRlZF9maWxlLnhtbDoyOiAiLAorICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiaW5jbHVkZWRfZmlsZS54bWw6MjogIikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhTcGFjZUluY2x1ZGUoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL2luY2x1ZGUueG1sIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleHBlY3RMb2coInRlc3QxIiwgImZyb20gaW5jbHVkZWQgZW50aXR5IGluICd3aXRoIHNwYWNlJyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKAorICAgICAgICAgICAgICAgIHQudG9TdHJpbmcoKSArICI7IGxvZz1cbiIgKyBnZXRGdWxsTG9nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhTcGFjZVNpbXBsZSgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2Uvc2ltcGxlLnhtbCIpOworICAgICAgICBleHBlY3RMb2coInRlc3QxIiwgImZyb20gc2ltcGxlIGJ1aWxkZmlsZSBpbiAnd2l0aCBzcGFjZSciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFNwYWNlUmVsYXRpdmUoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL3JlbGF0aXZlLnhtbCIpOworICAgICAgICBleHBlY3RMb2coInRlc3QxIiwgImZyb20gaW5jbHVkZWQgZW50aXR5IGluICd3aXRoIHNwYWNlJyIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvSW50cm9zcGVjdGlvbkhlbHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmEwMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2ODQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworCisvKioKKyAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC5JbnRyb3NwZWN0aW9uSGVscGVyLgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgSW50cm9zcGVjdGlvbkhlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFByb2plY3QgcDsKKyAgICBwcml2YXRlIEludHJvc3BlY3Rpb25IZWxwZXIgaWg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByb2plY3RCYXNlZGlyID0gRmlsZS5zZXBhcmF0b3I7CisKKyAgICBwdWJsaWMgSW50cm9zcGVjdGlvbkhlbHBlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHAgPSBuZXcgUHJvamVjdCgpOworICAgICAgICBwLnNldEJhc2VkaXIocHJvamVjdEJhc2VkaXIpOworICAgICAgICBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKGdldENsYXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0R5bmFtaWMoKSB7CisgICAgICAgIGFzc2VydFRydWUoIk5vdCBkeW5hbWljIiwgZmFsc2UgPT0gaWguaXNEeW5hbWljKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0NvbnRhaW5lcigpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm90IGEgY29udGFpbmVyIiwgZmFsc2UgPT0gaWguaXNDb250YWluZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFRleHQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpaC5hZGRUZXh0KHAsIHRoaXMsICJ0ZXN0Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5hZGRUZXh0KHAsIHRoaXMsICJ0ZXN0MiIpOworICAgICAgICAgICAgZmFpbCgidGVzdDIgc2hvdWxkblwndCBiZSBlcXVhbCB0byB0ZXN0Iik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgaWggPSBJbnRyb3NwZWN0aW9uSGVscGVyLmdldEhlbHBlcihTdHJpbmcuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguYWRkVGV4dChwLCAiIiwgInRlc3QiKTsKKyAgICAgICAgICAgIGZhaWwoIlN0cmluZyBkb2VzblwndCBzdXBwb3J0IGFkZFRleHQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBZGRUZXh0TWV0aG9kKCkgeworICAgICAgICBNZXRob2QgbSA9IGloLmdldEFkZFRleHRNZXRob2QoKTsKKyAgICAgICAgYXNzZXJ0TWV0aG9kKG0sICJhZGRUZXh0IiwgU3RyaW5nLmNsYXNzLCAidGVzdCIsICJiaW5nISIpOworCisgICAgICAgIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG0gPSBpaC5nZXRBZGRUZXh0TWV0aG9kKCk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN1cHBvcnRzQ2hhcmFjdGVycygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW50cm9zcGVjdGlvbkhlbHBlclRlc3Qgc3VwcG9ydHMgYWRkVGV4dCIsCisgICAgICAgICAgICAgICAgICAgaWguc3VwcG9ydHNDaGFyYWN0ZXJzKCkpOworCisgICAgICAgIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RyaW5nIGRvZXNuXCd0IHN1cHBvcnQgYWRkVGV4dCIsICFpaC5zdXBwb3J0c0NoYXJhY3RlcnMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCB0ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENyZWF0b3JzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJvbmUiKTsKKyAgICAgICAgICAgIGZhaWwoImRvbid0IGhhdmUgZWxlbWVudCB0eXBlIG9uZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgidHdvIik7CisgICAgICAgICAgICBmYWlsKCJjcmVhdGVUd28gdGFrZXMgYXJndW1lbnRzIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJ0aHJlZSIpOworICAgICAgICAgICAgZmFpbCgiY3JlYXRlVGhyZWUgcmV0dXJucyB2b2lkIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJmb3VyIik7CisgICAgICAgICAgICBmYWlsKCJjcmVhdGVGb3VyIHJldHVybnMgYXJyYXkiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoImZpdmUiKTsKKyAgICAgICAgICAgIGZhaWwoImNyZWF0ZUZpdmUgcmV0dXJucyBwcmltaXRpdmUgdHlwZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGloLmdldEVsZW1lbnRUeXBlKCJzaXgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIGloLmNyZWF0ZUVsZW1lbnQocCwgdGhpcywgInNpeCIpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInNldmVuIik7CisgICAgICAgICAgICBmYWlsKCJhZGRTZXZlbiB0YWtlcyB0d28gYXJndW1lbnRzIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJlaWdodCIpOworICAgICAgICAgICAgZmFpbCgiYWRkRWlnaHQgdGFrZXMgbm8gYXJndW1lbnRzIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJuaW5lIik7CisgICAgICAgICAgICBmYWlsKCJuaW5lIHJldHVybiBub24gdm9pZCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgidGVuIik7CisgICAgICAgICAgICBmYWlsKCJhZGRUZW4gdGFrZXMgYXJyYXkgYXJndW1lbnQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoImVsZXZlbiIpOworICAgICAgICAgICAgZmFpbCgiYWRkRWxldmVuIHRha2VzIHByaW1pdGl2ZSBhcmd1bWVudCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgidHdlbHZlIik7CisgICAgICAgICAgICBmYWlsKCJubyBwcmltaXRpdmUgY29uc3RydWN0b3IgZm9yIGphdmEubGFuZy5DbGFzcyIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmdCdWZmZXIuY2xhc3MsIGloLmdldEVsZW1lbnRUeXBlKCJ0aGlydGVlbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgaWguY3JlYXRlRWxlbWVudChwLCB0aGlzLCAidGhpcnRlZW4iKS50b1N0cmluZygpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguY3JlYXRlRWxlbWVudChwLCB0aGlzLCAiZm91cnRlZW4iKTsKKyAgICAgICAgICAgIGZhaWwoImZvdXJ0ZWVuIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5jcmVhdGVFbGVtZW50KHAsIHRoaXMsICJmb3VydGVlbiIpOworICAgICAgICAgICAgZmFpbCgiZmlmdGVlbiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBOdWxsUG9pbnRlckV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1hcCBnZXRFeHBlY3RlZE5lc3RlZEVsZW1lbnRzKCkgeworICAgICAgICBNYXAgZWxlbU1hcCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgZWxlbU1hcC5wdXQoInNpeCIsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGVsZW1NYXAucHV0KCJ0aGlydGVlbiIsIFN0cmluZ0J1ZmZlci5jbGFzcyk7CisgICAgICAgIGVsZW1NYXAucHV0KCJmb3VydGVlbiIsIFN0cmluZ0J1ZmZlci5jbGFzcyk7CisgICAgICAgIGVsZW1NYXAucHV0KCJmaWZ0ZWVuIiwgU3RyaW5nQnVmZmVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGVsZW1NYXA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE5lc3RlZEVsZW1lbnRzKCkgeworICAgICAgICBNYXAgZWxlbU1hcCA9IGdldEV4cGVjdGVkTmVzdGVkRWxlbWVudHMoKTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IGloLmdldE5lc3RlZEVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIENsYXNzIGV4cGVjdCA9IChDbGFzcykgZWxlbU1hcC5nZXQobmFtZSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTdXBwb3J0IGZvciAiK25hbWUrIiBpbiBJbnRyb3NwZWN0aW9OSGVscGVyVGVzdD8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm4gdHlwZSBvZiAiK25hbWUsIGV4cGVjdCwgaWguZ2V0RWxlbWVudFR5cGUobmFtZSkpOworICAgICAgICAgICAgZWxlbU1hcC5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRm91bmQgYWxsIiwgZWxlbU1hcC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROZXN0ZWRFbGVtZW50TWFwKCkgeworICAgICAgICBNYXAgZWxlbU1hcCA9IGdldEV4cGVjdGVkTmVzdGVkRWxlbWVudHMoKTsKKyAgICAgICAgTWFwIGFjdHVhbE1hcCA9IGloLmdldE5lc3RlZEVsZW1lbnRNYXAoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYWN0dWFsTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBlbGVtTmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgQ2xhc3MgZWxlbUNsYXNzID0gKENsYXNzKSBlbGVtTWFwLmdldChlbGVtTmFtZSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTdXBwb3J0IGZvciAiICsgZWxlbU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIEludHJvc3BlY3Rpb25IZWxwZXJUZXN0PyIsIGVsZW1DbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGUgb2YgIiArIGVsZW1OYW1lLCBlbGVtQ2xhc3MsIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgZWxlbU1hcC5yZW1vdmUoZWxlbU5hbWUpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkZvdW5kIGFsbCIsIGVsZW1NYXAuaXNFbXB0eSgpKTsKKworICAgICAgICAvLyBDaGVjayBpdCdzIGEgcmVhZC1vbmx5IG1hcC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdHVhbE1hcC5jbGVhcigpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50TWV0aG9kKCkgeworICAgICAgICBhc3NlcnRFbGVtTWV0aG9kKCJzaXgiLCAiY3JlYXRlU2l4IiwgU3RyaW5nLmNsYXNzLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RWxlbU1ldGhvZCgidGhpcnRlZW4iLCAiYWRkVGhpcnRlZW4iLCBudWxsLCBTdHJpbmdCdWZmZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRFbGVtTWV0aG9kKCJmb3VydGVlbiIsICJhZGRGb3VydGVlbiIsIG51bGwsIFN0cmluZ0J1ZmZlci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVsZW1NZXRob2QoImZpZnRlZW4iLCAiY3JlYXRlRmlmdGVlbiIsIFN0cmluZ0J1ZmZlci5jbGFzcywgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVsZW1NZXRob2QoU3RyaW5nIGVsZW1OYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlLCBDbGFzcyBtZXRob2RBcmcpIHsKKyAgICAgICAgTWV0aG9kIG0gPSBpaC5nZXRFbGVtZW50TWV0aG9kKGVsZW1OYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXRob2QgbmFtZSIsIG1ldGhvZE5hbWUsIG0uZ2V0TmFtZSgpKTsKKyAgICAgICAgQ2xhc3MgZXhwZWN0ZWRSZXR1cm5UeXBlID0gKHJldHVyblR5cGUgPT0gbnVsbCk/IFZvaWQuVFlQRTogcmV0dXJuVHlwZTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm4gdHlwZSIsIGV4cGVjdGVkUmV0dXJuVHlwZSwgbS5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICBDbGFzc1tdIGFyZ3MgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIGlmIChtZXRob2RBcmcgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcmcgQ291bnQiLCAxLCBhcmdzLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFyZyBUeXBlIiwgbWV0aG9kQXJnLCBhcmdzWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQXJnIENvdW50IiwgMCwgYXJncy5sZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjcmVhdGVUd28oU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3JlYXRlVGhyZWUoKSB7fQorCisgICAgcHVibGljIE9iamVjdFtdIGNyZWF0ZUZvdXIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY3JlYXRlRml2ZSgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVTaXgoKSB7CisgICAgICAgIHJldHVybiAidGVzdCI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ0J1ZmZlciBjcmVhdGVGaWZ0ZWVuKCkgeworICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTZXZlbihTdHJpbmcgcywgU3RyaW5nIHMyKSB7fQorCisgICAgcHVibGljIHZvaWQgYWRkRWlnaHQoKSB7fQorCisgICAgcHVibGljIFN0cmluZyBhZGROaW5lKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRlbihTdHJpbmdbXSBzKSB7fQorCisgICAgcHVibGljIHZvaWQgYWRkRWxldmVuKGludCBpKSB7fQorCisgICAgcHVibGljIHZvaWQgYWRkVHdlbHZlKENsYXNzIGMpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUaGlydGVlbihTdHJpbmdCdWZmZXIgc2IpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJ0ZXN0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRm91cnRlZW4oU3RyaW5nQnVmZmVyIHMpIHsKKyAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVNldHRlcnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJvbmUiLCAidGVzdCIpOworICAgICAgICAgICAgZmFpbCgic2V0T25lIGRvZXNuJ3QgZXhpc3QiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0d28iLCAidGVzdCIpOworICAgICAgICAgICAgZmFpbCgic2V0VHdvIHJldHVybnMgbm9uIHZvaWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0aHJlZSIsICJ0ZXN0Iik7CisgICAgICAgICAgICBmYWlsKCJzZXRUaHJlZSB0YWtlcyBubyBhcmdzIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZm91ciIsICJ0ZXN0Iik7CisgICAgICAgICAgICBmYWlsKCJzZXRGb3VyIHRha2VzIHR3byBhcmdzIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZml2ZSIsICJ0ZXN0Iik7CisgICAgICAgICAgICBmYWlsKCJzZXRGaXZlIHRha2VzIGFycmF5IGFyZyIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInNpeCIsICJ0ZXN0Iik7CisgICAgICAgICAgICBmYWlsKCJQcm9qZWN0IGRvZXNuJ3QgaGF2ZSBhIFN0cmluZyBjb25zdHJ1Y3RvciIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICB9CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2V2ZW4iLCAiMiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJzZXZlbiIsICIzIik7CisgICAgICAgICAgICBmYWlsKCIyIHNob3VsZG4ndCBiZSBlcXVhbHMgdG8gdGhyZWUiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25GYWlsZWRFcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlaWdodCIsICIyIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImVpZ2h0IiwgIjMiKTsKKyAgICAgICAgICAgIGZhaWwoIjIgc2hvdWxkbid0IGJlIGVxdWFscyB0byB0aHJlZSAtIGFzIGludCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgIm5pbmUiLCAiMiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJuaW5lIiwgIjMiKTsKKyAgICAgICAgICAgIGZhaWwoIjIgc2hvdWxkbid0IGJlIGVxdWFscyB0byB0aHJlZSAtIGFzIEludGVnZXIiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25GYWlsZWRFcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0ZW4iLCAiMiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0ZW4iLCAiMyIpOworICAgICAgICAgICAgZmFpbChwcm9qZWN0QmFzZWRpcisiMiBzaG91bGRuJ3QgYmUgZXF1YWxzIHRvICIrcHJvamVjdEJhc2VkaXIrIjMiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25GYWlsZWRFcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlbGV2ZW4iLCAiMiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlbGV2ZW4iLCAib24iKTsKKyAgICAgICAgICAgIGZhaWwoIm9uIHNob3VsZG4ndCBiZSBmYWxzZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInR3ZWx2ZSIsICIyIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInR3ZWx2ZSIsICJvbiIpOworICAgICAgICAgICAgZmFpbCgib24gc2hvdWxkbid0IGJlIGZhbHNlIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOworICAgICAgICB9CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidGhpcnRlZW4iLCAib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0aGlydGVlbiIsICJvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyIik7CisgICAgICAgICAgICBmYWlsKCJvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0IHNob3VsZG4ndCBiZSBlcXVhbCB0byBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInRoaXJ0ZWVuIiwgIm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QyIik7CisgICAgICAgICAgICBmYWlsKCJvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0MiBkb2Vzbid0IGV4aXN0Iik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJmb3VydGVlbiIsICIyIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImZvdXJ0ZWVuIiwgIm9uIik7CisgICAgICAgICAgICBmYWlsKCIyIHNob3VsZG4ndCBiZSBlcXVhbHMgdG8gdGhyZWUgLSBhcyBTdHJpbmdCdWZmZXIiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25GYWlsZWRFcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJmaWZ0ZWVuIiwgImFiY2QiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZmlmdGVlbiIsICJvbiIpOworICAgICAgICAgICAgZmFpbCgibyBzaG91bGRuJ3QgYmUgZXF1YWwgdG8gYSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInNpeHRlZW4iLCAiYWJjZCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJzaXh0ZWVuIiwgIm9uIik7CisgICAgICAgICAgICBmYWlsKCJvIHNob3VsZG4ndCBiZSBlcXVhbCB0byBhIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOworICAgICAgICB9CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2V2ZW50ZWVuIiwgIjE3Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInNldmVudGVlbiIsICIzIik7CisgICAgICAgICAgICBmYWlsKCIxNyBzaG91bGRuJ3QgYmUgZXF1YWxzIHRvIHRocmVlIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOworICAgICAgICB9CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZWlnaHR0ZWVuIiwgIjE4Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImVpZ2h0dGVlbiIsICIzIik7CisgICAgICAgICAgICBmYWlsKCIxOCBzaG91bGRuJ3QgYmUgZXF1YWxzIHRvIHRocmVlIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IpOworICAgICAgICB9CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAibmluZXRlZW4iLCAiMTkiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAibmluZXRlZW4iLCAiMyIpOworICAgICAgICAgICAgZmFpbCgiMTkgc2hvdWxkbid0IGJlIGVxdWFscyB0byB0aHJlZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWFwIGdldEV4cGVjdGVkQXR0cmlidXRlcygpIHsKKyAgICAgICAgTWFwIGF0dHJNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIGF0dHJNYXAucHV0KCJzZXZlbiIsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGF0dHJNYXAucHV0KCJlaWdodCIsIEludGVnZXIuVFlQRSk7CisgICAgICAgIGF0dHJNYXAucHV0KCJuaW5lIiwgSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGF0dHJNYXAucHV0KCJ0ZW4iLCBGaWxlLmNsYXNzKTsKKyAgICAgICAgYXR0ck1hcC5wdXQoImVsZXZlbiIsIEJvb2xlYW4uVFlQRSk7CisgICAgICAgIGF0dHJNYXAucHV0KCJ0d2VsdmUiLCBCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgYXR0ck1hcC5wdXQoInRoaXJ0ZWVuIiwgQ2xhc3MuY2xhc3MpOworICAgICAgICBhdHRyTWFwLnB1dCgiZm91cnRlZW4iLCBTdHJpbmdCdWZmZXIuY2xhc3MpOworICAgICAgICBhdHRyTWFwLnB1dCgiZmlmdGVlbiIsIENoYXJhY3Rlci5UWVBFKTsKKyAgICAgICAgYXR0ck1hcC5wdXQoInNpeHRlZW4iLCBDaGFyYWN0ZXIuY2xhc3MpOworICAgICAgICBhdHRyTWFwLnB1dCgic2V2ZW50ZWVuIiwgQnl0ZS5UWVBFKTsKKyAgICAgICAgYXR0ck1hcC5wdXQoImVpZ2h0dGVlbiIsIFNob3J0LlRZUEUpOworICAgICAgICBhdHRyTWFwLnB1dCgibmluZXRlZW4iLCBEb3VibGUuVFlQRSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSlVuaXQgMy43IGFkZHMgYSBnZXROYW1lIG1ldGhvZCB0byBUZXN0Q2FzZSAtIHNvIHdlIG5vdworICAgICAgICAgKiBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUgaW4gSW50cm9zcGVjdGlvbkhlbHBlclRlc3QgaWYgd2UgcnVuCisgICAgICAgICAqIHVuZGVyIEpVbml0IDMuNyBidXQgbm90IGluIGVhcmxpZXIgdmVyc2lvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIFNpbXBseSBhZGQgaXQgaGVyZSBhbmQgcmVtb3ZlIGl0IGFmdGVyIHRoZSB0ZXN0cy4KKyAgICAgICAgICovCisgICAgICAgIGF0dHJNYXAucHV0KCJuYW1lIiwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICByZXR1cm4gYXR0ck1hcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlcygpIHsKKyAgICAgICAgTWFwIGF0dHJNYXAgPSBnZXRFeHBlY3RlZEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IGloLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgQ2xhc3MgZXhwZWN0ID0gKENsYXNzKSBhdHRyTWFwLmdldChuYW1lKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlN1cHBvcnQgZm9yICIrbmFtZSsiIGluIEludHJvc3BlY3Rpb25IZWxwZXJUZXN0PyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGUgb2YgIituYW1lLCBleHBlY3QsIGloLmdldEF0dHJpYnV0ZVR5cGUobmFtZSkpOworICAgICAgICAgICAgYXR0ck1hcC5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgYXR0ck1hcC5yZW1vdmUoIm5hbWUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRm91bmQgYWxsIiwgYXR0ck1hcC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdHRyaWJ1dGVNYXAoKSB7CisgICAgICAgIE1hcCBhdHRyTWFwID0gZ2V0RXhwZWN0ZWRBdHRyaWJ1dGVzKCk7CisgICAgICAgIE1hcCBhY3R1YWxNYXAgPSBpaC5nZXRBdHRyaWJ1dGVNYXAoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gYWN0dWFsTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgQ2xhc3MgYXR0ckNsYXNzID0gKENsYXNzKSBhdHRyTWFwLmdldChhdHRyTmFtZSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTdXBwb3J0IGZvciAiICsgYXR0ck5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIEludHJvc3BlY3Rpb25IZWxwZXJUZXN0PyIsIGF0dHJDbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGUgb2YgIiArIGF0dHJOYW1lLCBhdHRyQ2xhc3MsIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgYXR0ck1hcC5yZW1vdmUoYXR0ck5hbWUpOworICAgICAgICB9CisgICAgICAgIGF0dHJNYXAucmVtb3ZlKCJuYW1lIik7CisgICAgICAgIGFzc2VydFRydWUoIkZvdW5kIGFsbCIsIGF0dHJNYXAuaXNFbXB0eSgpKTsKKworICAgICAgICAvLyBDaGVjayBpdCdzIGEgcmVhZC1vbmx5IG1hcC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdHVhbE1hcC5jbGVhcigpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdHRyaWJ1dGVNZXRob2QoKSB7CisgICAgICAgIGFzc2VydEF0dHJNZXRob2QoInNldmVuIiwgInNldFNldmVuIiwgU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICIyIiwgIjMiKTsKKyAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgiZWlnaHQiLCAic2V0RWlnaHQiLCBJbnRlZ2VyLlRZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDMpKTsKKyAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgibmluZSIsICJzZXROaW5lIiwgSW50ZWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcigyKSwgbmV3IEludGVnZXIoMykpOworICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJ0ZW4iLCAic2V0VGVuIiwgRmlsZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShwcm9qZWN0QmFzZWRpciArIDIpLCBuZXcgRmlsZSgidG90byIpKTsKKyAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgiZWxldmVuIiwgInNldEVsZXZlbiIsIEJvb2xlYW4uVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLkZBTFNFLCBCb29sZWFuLlRSVUUpOworICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJ0d2VsdmUiLCAic2V0VHdlbHZlIiwgQm9vbGVhbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLkZBTFNFLCBCb29sZWFuLlRSVUUpOworICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJ0aGlydGVlbiIsICJzZXRUaGlydGVlbiIsIENsYXNzLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuY2xhc3MsIE1hcC5jbGFzcyk7CisgICAgICAgIGFzc2VydEF0dHJNZXRob2QoImZvdXJ0ZWVuIiwgInNldEZvdXJ0ZWVuIiwgU3RyaW5nQnVmZmVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdCdWZmZXIoIjIiKSwgbmV3IFN0cmluZ0J1ZmZlcigiMyIpKTsKKyAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgiZmlmdGVlbiIsICJzZXRGaWZ0ZWVuIiwgQ2hhcmFjdGVyLlRZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJhY3RlcignYScpLCBuZXcgQ2hhcmFjdGVyKCdiJykpOworICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJzaXh0ZWVuIiwgInNldFNpeHRlZW4iLCBDaGFyYWN0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJhY3RlcignYScpLCBuZXcgQ2hhcmFjdGVyKCdiJykpOworICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJzZXZlbnRlZW4iLCAic2V0U2V2ZW50ZWVuIiwgQnl0ZS5UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlKChieXRlKTE3KSwgbmV3IEJ5dGUoKGJ5dGUpMTApKTsKKyAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgiZWlnaHR0ZWVuIiwgInNldEVpZ2h0dGVlbiIsIFNob3J0LlRZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNob3J0KChzaG9ydCkxOCksIG5ldyBTaG9ydCgoc2hvcnQpMTApKTsKKyAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgibmluZXRlZW4iLCAic2V0TmluZXRlZW4iLCBEb3VibGUuVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRG91YmxlKDE5KSwgbmV3IERvdWJsZSgoc2hvcnQpMTApKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgib25laHVuZHJlZCIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgQnVpbGRFeGNlcHRpb24hIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHt9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEF0dHJNZXRob2QoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtZXRob2RBcmcsIE9iamVjdCBhcmcsIE9iamVjdCBiYWRBcmcpIHsKKyAgICAgICAgTWV0aG9kIG0gPSBpaC5nZXRBdHRyaWJ1dGVNZXRob2QoYXR0ck5hbWUpOworICAgICAgICBhc3NlcnRNZXRob2QobSwgbWV0aG9kTmFtZSwgbWV0aG9kQXJnLCBhcmcsIGJhZEFyZyk7CisgICAgfQorCisgICAgcHVibGljIGludCBzZXRUd28oU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGhyZWUoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0Rm91cihTdHJpbmcgczEsIFN0cmluZyBzMikge30KKworICAgIHB1YmxpYyB2b2lkIHNldEZpdmUoU3RyaW5nW10gcykge30KKworICAgIHB1YmxpYyB2b2lkIHNldFNpeChQcm9qZWN0IHApIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXZlbihTdHJpbmcgcykgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFaWdodChpbnQgaSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmluZShJbnRlZ2VyIGkpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGkuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVuKEZpbGUgZikgeworICAgICAgICBTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIGlmIChPcy5pc0ZhbWlseSgidW5peCIpIHx8IE9zLmlzRmFtaWx5KCJvcGVudm1zIikpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcm9qZWN0QmFzZWRpcisiMiIsIHBhdGgpOworICAgICAgICB9IGVsc2UgaWYgKE9zLmlzRmFtaWx5KCJuZXR3YXJlIikpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcm9qZWN0QmFzZWRpcisiMiIsIHBhdGgudG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjoiK3Byb2plY3RCYXNlZGlyKyIyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVsZXZlbihib29sZWFuIGIpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHdlbHZlKEJvb2xlYW4gYikgeworICAgICAgICBhc3NlcnRUcnVlKCFiLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaGlydGVlbihDbGFzcyBjKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhQcm9qZWN0LmNsYXNzLCBjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3VydGVlbihTdHJpbmdCdWZmZXIgc2IpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmlmdGVlbihjaGFyIGMpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMsICdhJyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2l4dGVlbihDaGFyYWN0ZXIgYykgeworICAgICAgICBhc3NlcnRFcXVhbHMoYy5jaGFyVmFsdWUoKSwgJ2EnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXZlbnRlZW4oYnl0ZSBiKSB7CisgICAgICAgIGFzc2VydEVxdWFscygxNywgYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RWlnaHR0ZWVuKHNob3J0IHMpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE4LCBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROaW5ldGVlbihkb3VibGUgZCkgeworICAgICAgICBkb3VibGUgZGlmZiA9IGQgLSAxOTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgMTksIHJlY2VpdmVkICIgKyBkLCBkaWZmID4gLTFlLTYgJiYgZGlmZiA8IDFlLTYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeHRlbnNpb25Qb2ludHMoKSB7CisgICAgICAgIExpc3QgZXh0ZW5zaW9ucyA9IGloLmdldEV4dGVuc2lvblBvaW50cygpOworICAgICAgICBmaW5hbCBpbnQgYWRkZXJzID0gMjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJleHRlbnNpb24gY291bnQiLCBhZGRlcnMsIGV4dGVuc2lvbnMuc2l6ZSgpKTsKKworICAgICAgICAvLyB0aGlzIG9yaWdpbmFsIHRlc3QgYXNzdW1lZCBzb21ldGhpbmcgYWJvdXQgdGhlIG9yZGVyIG9mCisgICAgICAgIC8vIGFkZChOdW1iZXIpIGFuZCBhZGRDb25maWd1cmVkKE1hcCkgcmV0dXJuZWQgYnkgcmVmbGVjdGlvbi4KKyAgICAgICAgLy8gVW5mb3J0dW5hdGVseSB0aGUgYXNzdW1wdGlvbiBkb2Vzbid0IGhvbGQgZm9yIGFsbCBWTXMKKyAgICAgICAgLy8gKGZhaWxlZCBvbiBNYWNPUyBYIHVzaW5nIEpESyAxLjQuMl8wNSkgYW5kIHRoZSBwb3NzaWJsZQorICAgICAgICAvLyBjb21iaW5hdG9yaWNzIGFyZSB0b28gaGFyZCB0byBjaGVjay4gIFdlIHJlYWxseSBvbmx5IHdhbnQKKyAgICAgICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIG1vcmUgZGVyaXZlZCBIYXNodGFibGUgY2FuIGJlIGZvdW5kCisgICAgICAgIC8vIGJlZm9yZSBNYXAuCisvLyAgICAgICAgYXNzZXJ0RXh0TWV0aG9kKGV4dGVuc2lvbnMuZ2V0KDApLCAiYWRkIiwgTnVtYmVyLmNsYXNzLAorLy8gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcigyKSwgbmV3IEludGVnZXIoMykpOworCisgICAgICAgIC8vIGFkZENvbmZpZ3VyZWQoSGFzaHRhYmxlKSBzaG91bGQgY29tZSBiZWZvcmUgYWRkQ29uZmlndXJlZChNYXApCisgICAgICAgIGFzc2VydEV4dE1ldGhvZChleHRlbnNpb25zLmdldChhZGRlcnMgLSAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhZGRDb25maWd1cmVkIiwgSGFzaHRhYmxlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVRhYmxlKCJrZXkiLCAidmFsdWUiKSwgbWFrZVRhYmxlKCIxIiwgIjIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXh0TWV0aG9kKGV4dGVuc2lvbnMuZ2V0KGFkZGVycyAtIDEpLCAiYWRkQ29uZmlndXJlZCIsIE1hcC5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwKCksIG1ha2VUYWJsZSgiMSIsICIyIikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFeHRNZXRob2QoT2JqZWN0IG1vLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3MgbWV0aG9kQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZywgT2JqZWN0IGJhZEFyZykgeworICAgICAgICBhc3NlcnRNZXRob2QoKE1ldGhvZCkgbW8sIG1ldGhvZE5hbWUsIG1ldGhvZEFyZywgYXJnLCBiYWRBcmcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNZXRob2QoTWV0aG9kIG0sIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzcyBtZXRob2RBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnLCBPYmplY3QgYmFkQXJnKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiTWV0aG9kIG5hbWUiLCBtZXRob2ROYW1lLCBtLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuIHR5cGUiLCBWb2lkLlRZUEUsIG0uZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgQ2xhc3NbXSBhcmdzID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFyZyBDb3VudCIsIDEsIGFyZ3MubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcmcgVHlwZSIsIG1ldGhvZEFyZywgYXJnc1swXSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG0uaW52b2tlKHRoaXMsIG5ldyBPYmplY3RbXSB7IGFyZyB9KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG0uaW52b2tlKHRoaXMsIG5ldyBPYmplY3RbXSB7IGJhZEFyZyB9KTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhbiBhc3NlcnRpb24gZXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodCBpbnN0YW5jZW9mIGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBhZGQoTGlzdCBsKSB7CisgICAgICAgIC8vIElOVkFMSUQgZXh0ZW5zaW9uIHBvaW50CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8vIHNlZSBjb21tZW50cyBpbiB0ZXN0R2V0RXh0ZW5zaW9uUG9pbnRzCisvLyAgICBwdWJsaWMgdm9pZCBhZGQoTnVtYmVyIG4pIHsKKy8vICAgICAgICAvLyBWYWxpZCBleHRlbnNpb24gcG9pbnQKKy8vICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbi5pbnRWYWx1ZSgpKTsKKy8vICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChMaXN0IGwsIGludCBpKSB7CisgICAgICAgIC8vIElOVkFMSUQgZXh0ZW5zaW9uIHBvaW50CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChNYXAgbSkgeworICAgICAgICAvLyBWYWxpZCBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgYXNzZXJ0VHJ1ZShtLnNpemUoKSA9PSAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKEhhc2h0YWJsZSBoKSB7CisgICAgICAgIC8vIFZhbGlkIGV4dGVuc2lvbiBwb2ludCwgbW9yZSBkZXJpdmVkIHRoYW4gTWFwIGFib3ZlLCBidXQgKmFmdGVyKiBpdCEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ha2VUYWJsZSgia2V5IiwgInZhbHVlIiksIGgpOworICAgIH0KKworICAgIHByaXZhdGUgSGFzaHRhYmxlIG1ha2VUYWJsZShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICB0YWJsZS5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0YWJsZTsKKyAgICB9CisKK30gLy8gSW50cm9zcGVjdGlvbkhlbHBlclRlc3QKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0xvYWRlclJlZlRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2FkZXJSZWZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2YzU5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2FkZXJSZWZUZXN0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkZXJSZWZUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgTG9hZGVyUmVmVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9sb2FkZXJyZWYvbG9hZGVycmVmLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbiIpOworICAgIH0KKworICAgIC8vIG92ZXJyaWRlIGFsbG93ZWQgb24gPGF2YWlsYWJsZT4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUmVmKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RiYWRyZWYiLCAiU2hvdWxkIGZhaWwgZHVlIHRvIHJlZiAiCisgICAgICAgICAgICArICJub3QgYmVpbmcgYSBjbGFzcyBsb2FkZXIiLCAiZG9lcyBub3QgcmVmZXJlbmNlIGEgY2xhc3MgbG9hZGVyIik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvTG9jYXRpb25UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvTG9jYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjOWFmMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2NhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db25kaXRpb25UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKKworcHVibGljIGNsYXNzIExvY2F0aW9uVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvbG9jYXRpb24ueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsYWluVGFzaygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFBsYWluVGFzayIpOworICAgICAgICBFY2hvIGUgPSAoRWNobykgZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiZWNobyIpOworICAgICAgICBhc3NlcnRGYWxzZShlLmdldExvY2F0aW9uKCkgPT0gTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTik7CisgICAgICAgIGFzc2VydEZhbHNlKGUuZ2V0TG9jYXRpb24oKS5nZXRMaW5lTnVtYmVyKCkgPT0gMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYWxvbmVUeXBlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0U3RhbmRhbG9uZVR5cGUiKTsKKyAgICAgICAgRWNobyBlID0gKEVjaG8pIGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoImVjaG8yIik7CisgICAgICAgIEZpbGVTZXQgZiA9IChGaWxlU2V0KSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJmcyIpOworICAgICAgICBhc3NlcnRGYWxzZShmLmdldExvY2F0aW9uKCkgPT0gTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhlLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgIGYuZ2V0TG9jYXRpb24oKS5nZXRMaW5lTnVtYmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25UYXNrKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Q29uZGl0aW9uVGFzayIpOworICAgICAgICBUYXNrQWRhcHRlciB0YSA9IChUYXNrQWRhcHRlcikgZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiY29uZCIpOworICAgICAgICBDb25kaXRpb25UYXNrIGMgPSAoQ29uZGl0aW9uVGFzaykgdGEuZ2V0UHJveHkoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYy5nZXRMb2NhdGlvbigpID09IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT04pOworICAgICAgICBhc3NlcnRGYWxzZShjLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpID09IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYWNyb2RlZldyYXBwZWRUYXNrKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0TWFjcm9kZWZXcmFwcGVkVGFzayIpOworICAgICAgICBFY2hvIGUgPSAoRWNobykgZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiZWNobzMiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRMb2coKS5pbmRleE9mKCJMaW5lOiAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZS5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKSArIDEpKQorICAgICAgICAgICAgICAgICAgID4gLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVzZXRkZWZXcmFwcGVkVGFzaygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFByZXNldGRlZldyYXBwZWRUYXNrIik7CisgICAgICAgIEVjaG8gZSA9IChFY2hvKSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJlY2hvNCIpOworICAgICAgICBhc3NlcnRUcnVlKGdldExvZygpLmluZGV4T2YoIkxpbmU6ICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChlLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpICsgMSkpCisgICAgICAgICAgICAgICAgICAgPiAtMSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFY2hvTG9jYXRpb24gZXh0ZW5kcyBUYXNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIGxvZygiTGluZTogIiArIGdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L01vY2tCdWlsZExpc3RlbmVyLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvTW9ja0J1aWxkTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhhODI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L01vY2tCdWlsZExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK3B1YmxpYyBjbGFzcyBNb2NrQnVpbGRMaXN0ZW5lciBleHRlbmRzIEFzc2VydCBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3IgYnVmZmVyID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgZmluYWwgUHJvamVjdCBwcm9qZWN0OworCisgICAgcHVibGljIE1vY2tCdWlsZExpc3RlbmVyKGZpbmFsIFByb2plY3QgcHJvamVjdCkgeworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9CisgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorCisgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChmaW5hbCBCdWlsZEV2ZW50IGFjdHVhbCkgeworICAgICAgICBpZihhY3R1YWwuZ2V0UHJpb3JpdHkoKT09UHJvamVjdC5NU0dfREVCVUcpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGFzc2VydFRydWUoInVuZXhwZWN0ZWQgbWVzc2FnZUxvZ2dlZDogIithY3R1YWwuZ2V0TWVzc2FnZSgpLCAhYnVmZmVyLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBwcm9qZWN0ICIsIHByb2plY3QsIGFjdHVhbC5nZXRQcm9qZWN0KCkpOworCisgICAgICAgIEJ1aWxkRXZlbnQgZXhwZWN0ZWQgPSAoQnVpbGRFdmVudCkgYnVmZmVyLmVsZW1lbnRBdCgwKTsKKyAgICAgICAgYnVmZmVyLnJlbW92ZUVsZW1lbnRBdCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG1lc3NhZ2VMb2dnZWQgIiwgZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBhY3R1YWwuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIHByaW9yaXR5ICIsIGV4cGVjdGVkLmdldFByaW9yaXR5KCksIGFjdHVhbC5nZXRQcmlvcml0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRFbXB0eSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTW9ja0J1aWxkTGlzdGVuZXIgaXMgbm90IGVtcHR5IiwgYnVmZmVyLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQnVpbGRFdmVudChmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIGZpbmFsIEJ1aWxkRXZlbnQgYmUgPSBuZXcgQnVpbGRFdmVudChwcm9qZWN0KTsKKyAgICAgICAgYmUuc2V0TWVzc2FnZShtZXNzYWdlLCBwcmlvcml0eSk7CisgICAgICAgIGJ1ZmZlci5hZGRFbGVtZW50KGJlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9QaWNrT25lVGFzay5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1BpY2tPbmVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwMTk0YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9QaWNrT25lVGFzay5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmRpc3BhdGNoLkRpc3BhdGNoVGFzazsKKworcHVibGljIGNsYXNzIFBpY2tPbmVUYXNrIGV4dGVuZHMgRGlzcGF0Y2hUYXNrIHsKKyAgICBwdWJsaWMgdm9pZCBsaXN0KCkgeworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImxpc3QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNob3ciKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0Q29tcG9uZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTViNGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudFRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0Q29tcG9uZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBQcm9qZWN0Q29tcG9uZW50VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICBQcm9qZWN0IGV4cGVjdGVkUHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIExvY2F0aW9uIGV4cGVjdGVkTG9jYXRpb24gPSBuZXcgTG9jYXRpb24oImZvbyIpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWREZXNjcmlwdGlvbiA9ICJiYXIiOworCisgICAgICAgIC8vIHVzZSBhbiBhbm9ueW1vdXMgc3ViY2xhc3Mgc2luY2UgUHJvamVjdENvbXBvbmVudCBpcyBhYnN0cmFjdAorICAgICAgICBQcm9qZWN0Q29tcG9uZW50IHBjID0gbmV3IFByb2plY3RDb21wb25lbnQoKSB7CisgICAgICAgICAgICB9OworICAgICAgICBwYy5zZXRQcm9qZWN0KGV4cGVjdGVkUHJvamVjdCk7CisgICAgICAgIHBjLnNldExvY2F0aW9uKGV4cGVjdGVkTG9jYXRpb24pOworICAgICAgICBwYy5zZXREZXNjcmlwdGlvbihleHBlY3RlZERlc2NyaXB0aW9uKTsKKworICAgICAgICBQcm9qZWN0Q29tcG9uZW50IGNsb25lZCA9IChQcm9qZWN0Q29tcG9uZW50KSBwYy5jbG9uZSgpOworICAgICAgICBhc3NlcnROb3RTYW1lKHBjLCBjbG9uZWQpOworICAgICAgICBhc3NlcnRTYW1lKGNsb25lZC5nZXRQcm9qZWN0KCksIGV4cGVjdGVkUHJvamVjdCk7CisgICAgICAgIGFzc2VydFNhbWUoY2xvbmVkLmdldExvY2F0aW9uKCksIGV4cGVjdGVkTG9jYXRpb24pOworICAgICAgICBhc3NlcnRTYW1lKGNsb25lZC5nZXREZXNjcmlwdGlvbigpLCBleHBlY3RlZERlc2NyaXB0aW9uKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY4YzUwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RUZXN0LmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LkRlZmF1bHRJbnB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LlByb3BlcnR5RmlsZUlucHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuKjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKworLyoqCisgKiBWZXJ5IGxpbWl0ZWQgdGVzdCBjbGFzcyBmb3IgUHJvamVjdC4gV2FpdGluZyB0byBiZSBleHRlbmRlZC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9qZWN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgUHJvamVjdCBwOworICAgIHByaXZhdGUgU3RyaW5nIHJvb3Q7CisgICAgcHJpdmF0ZSBNb2NrQnVpbGRMaXN0ZW5lciBtYmw7CisKKyAgICBwdWJsaWMgUHJvamVjdFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHAgPSBuZXcgUHJvamVjdCgpOworICAgICAgICBwLmluaXQoKTsKKyAgICAgICAgcm9vdCA9IG5ldyBGaWxlKEZpbGUuc2VwYXJhdG9yKS5nZXRBYnNvbHV0ZVBhdGgoKS50b1VwcGVyQ2FzZSgpOworICAgICAgICBtYmwgPSBuZXcgTW9ja0J1aWxkTGlzdGVuZXIocCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERhdGFUeXBlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE51bGwoImR1bW15IGlzIG5vdCBhIGtub3duIGRhdGEgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgcC5jcmVhdGVEYXRhVHlwZSgiZHVtbXkiKSk7CisgICAgICAgIE9iamVjdCBvID0gcC5jcmVhdGVEYXRhVHlwZSgiZmlsZXNldCIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJmaWxlc2V0IGlzIGEga25vd24gdHlwZSIsIG8pOworICAgICAgICBhc3NlcnRUcnVlKCJmaWxlc2V0IGNyZWF0ZXMgRmlsZVNldCIsIG8gaW5zdGFuY2VvZiBGaWxlU2V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUGF0dGVyblNldCIsCisgICAgICAgICAgICAgICBwLmNyZWF0ZURhdGFUeXBlKCJwYXR0ZXJuc2V0IikgaW5zdGFuY2VvZiBQYXR0ZXJuU2V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUGF0aCIsIHAuY3JlYXRlRGF0YVR5cGUoInBhdGgiKSBpbnN0YW5jZW9mIFBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBoYXMgYmVlbiBhIHN0YXJ0aW5nIHBvaW50IGZvciBtb3ZpbmcgdGhlIGNvZGUgdG8gRmlsZVV0aWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRmlsZSgpIHsKKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJuZXR3YXJlIikgfHwgT3MuaXNGYW1pbHkoImRvcyIpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UobG9jYWxpemUoRmlsZS5zZXBhcmF0b3IpLAorICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIi8iLCBudWxsKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGxvY2FsaXplKEZpbGUuc2VwYXJhdG9yKSwKKyAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCJcXCIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGhyb3cgaW4gZHJpdmUgbGV0dGVycworICAgICAgICAgICAgICovCisgICAgICAgICAgICBTdHJpbmcgZHJpdmVTcGVjID0gIkM6IjsKKyAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWNMb3dlciA9ICJjOiI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWNMb3dlciArICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWMgKyAiLyIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UoZHJpdmVTcGVjTG93ZXIgKyAiXFwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjICsgIlxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWNMb3dlciArICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWNMb3dlciArICIvIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWNMb3dlciArICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWNMb3dlciArICJcXCIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogcHJvbWlzZWQgdG8gZWxpbWluYXRlIGNvbnNlY3V0aXZlIHNsYXNoZXMgYWZ0ZXIgZHJpdmUgbGV0dGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UoZHJpdmVTcGVjICsgIlxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKGRyaXZlU3BlYyArICIvLy8vLyIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UoZHJpdmVTcGVjICsgIlxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKGRyaXZlU3BlYyArICJcXFxcXFxcXFxcXFwiLCBudWxsKS5nZXRQYXRoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFN0YXJ0IHdpdGggc2ltcGxlIGFic29sdXRlIGZpbGUgbmFtZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIvIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCJcXCIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogZHJpdmUgbGV0dGVycyBhcmUgbm90IHVzZWQsIGp1c3QgdG8gYmUgY29uc2lkZXJlZCBhcyBub3JtYWwKKyAgICAgICAgICAgICAqIHBhcnQgb2YgYSBuYW1lCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOworICAgICAgICAgICAgU3RyaW5nIHVkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBGaWxlLnNlcGFyYXRvckNoYXI7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModWRpciArIGRyaXZlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKGRyaXZlU3BlYyArICIvIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1ZGlyICsgZHJpdmVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjICsgIlxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWNMb3dlciA9ICJjOiI7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModWRpciArIGRyaXZlU3BlY0xvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjTG93ZXIgKyAiLyIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModWRpciArIGRyaXZlU3BlY0xvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjTG93ZXIgKyAiXFwiLCBudWxsKS5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIE5vdyB0ZXN0IHNvbWUgcmVsYXRpdmUgZmlsZSBuYW1lIG1hZ2ljLgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAorICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZSgiNCIsIG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSkpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKKyAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIi4vNCIsIG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSkpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKKyAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIi5cXDQiLCBuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCisgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIuLy5cXDQiLCBuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCisgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIuLi8zLzQiLCBuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCisgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIuLlxcM1xcNCIsIG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSkpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKKyAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIi4uLy4uLzUvLi4vLi8yLy4vMy82Ly4uLzQiLCBuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCisgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIuLlxcLi4vNS8uLlxcLi8yLy4vMy82XFwuLi80IiwgbmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSkuZ2V0UGF0aCgpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkYXB0IGZpbGUgc2VwYXJhdG9ycyB0byBsb2NhbCBjb252ZW50aW9ucworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsaXplKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHBhdGggPSByb290ICsgcGF0aC5zdWJzdHJpbmcoMSk7CisgICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb252ZW5pZW5jZSBtZXRob2QKKyAgICAgKiB0aGUgZHJpdmUgbGV0dGVyIGlzIGluIGxvd2VyIGNhc2UgdW5kZXIgY3lnd2luCisgICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCBhbGxvd3MgdGVzdHMgd2hlcmUgRmlsZVV0aWxzLm5vcm1hbGl6ZQorICAgICAqIGlzIGNhbGxlZCB2aWEgcmVzb2x2ZUZpbGUgdG8gcGFzcyB1bmRlciBjeWd3aW4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7CisgICAgICAgIGlmICgoT3MuaXNGYW1pbHkoImRvcyIpIHx8IE9zLmlzRmFtaWx5KCJuZXR3YXJlIikpCisgICAgICAgICAgICAmJiBzMS5sZW5ndGgoKSA+PSAxICYmIHMyLmxlbmd0aCgpID49IDEpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYjEgPSBuZXcgU3RyaW5nQnVmZmVyKHMxKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYjIgPSBuZXcgU3RyaW5nQnVmZmVyKHMyKTsKKyAgICAgICAgICAgIHNiMS5zZXRDaGFyQXQoMCwgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHMxLmNoYXJBdCgwKSkpOworICAgICAgICAgICAgc2IyLnNldENoYXJBdCgwLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoczIuY2hhckF0KDApKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2IxLnRvU3RyaW5nKCksIHNiMi50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzMSwgczIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFRhc2tEZWZGYWlscyhmaW5hbCBDbGFzcyB0YXNrQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZHVtbXlOYW1lID0gInRlc3RUYXNrRGVmaW5pdGlvbkR1bW15IjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ibC5hZGRCdWlsZEV2ZW50KG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICBwLmFkZFRhc2tEZWZpbml0aW9uKGR1bW15TmFtZSwgdGFza0NsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIEJ1aWxkRXhjZXB0aW9uKFwiIittZXNzYWdlKyJcIiwgUHJvamVjdC5NU0dfRVJSKSB3aGVuIGFkZGluZyB0YXNrICIgKyB0YXNrQ2xhc3MpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBtYmwuYXNzZXJ0RW1wdHkoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIXAuZ2V0VGFza0RlZmluaXRpb25zKCkuY29udGFpbnNLZXkoZHVtbXlOYW1lKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVGFza0RlZmluaXRpb24oKSB7CisgICAgICAgIHAuYWRkQnVpbGRMaXN0ZW5lcihtYmwpOworCisgICAgICAgIHAuYWRkVGFza0RlZmluaXRpb24oIk9rIiwgRHVtbXlUYXNrT2suY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoRHVtbXlUYXNrT2suY2xhc3MsIHAuZ2V0VGFza0RlZmluaXRpb25zKCkuZ2V0KCJPayIpKTsKKyAgICAgICAgcC5hZGRUYXNrRGVmaW5pdGlvbigiT2tOb25UYXNrIiwgRHVtbXlUYXNrT2tOb25UYXNrLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKER1bW15VGFza09rTm9uVGFzay5jbGFzcywgcC5nZXRUYXNrRGVmaW5pdGlvbnMoKS5nZXQoIk9rTm9uVGFzayIpKTsKKyAgICAgICAgbWJsLmFzc2VydEVtcHR5KCk7CisKKyAgICAgICAgYXNzZXJ0VGFza0RlZkZhaWxzKER1bW15VGFza1ByaXZhdGUuY2xhc3MsICAgRHVtbXlUYXNrUHJpdmF0ZS5jbGFzcyAgICsgIiBpcyBub3QgcHVibGljIik7CisKKyAgICAgICAgYXNzZXJ0VGFza0RlZkZhaWxzKER1bW15VGFza1Byb3RlY3RlZC5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bW15VGFza1Byb3RlY3RlZC5jbGFzcyArICIgaXMgbm90IHB1YmxpYyIpOworCisgICAgICAgIGFzc2VydFRhc2tEZWZGYWlscyhEdW1teVRhc2tQYWNrYWdlLmNsYXNzLCAgIER1bW15VGFza1BhY2thZ2UuY2xhc3MgICArICIgaXMgbm90IHB1YmxpYyIpOworCisgICAgICAgIGFzc2VydFRhc2tEZWZGYWlscyhEdW1teVRhc2tBYnN0cmFjdC5jbGFzcywgIER1bW15VGFza0Fic3RyYWN0LmNsYXNzICArICIgaXMgYWJzdHJhY3QiKTsKKyAgICAgICAgYXNzZXJ0VGFza0RlZkZhaWxzKER1bW15VGFza0ludGVyZmFjZS5jbGFzcywgRHVtbXlUYXNrSW50ZXJmYWNlLmNsYXNzICsgIiBpcyBhYnN0cmFjdCIpOworCisgICAgICAgIGFzc2VydFRhc2tEZWZGYWlscyhEdW1teVRhc2tXaXRob3V0RGVmYXVsdENvbnN0cnVjdG9yLmNsYXNzLCAiTm8gcHVibGljIG5vLWFyZyBjb25zdHJ1Y3RvciBpbiAiICsgRHVtbXlUYXNrV2l0aG91dERlZmF1bHRDb25zdHJ1Y3Rvci5jbGFzcyk7CisgICAgICAgIGFzc2VydFRhc2tEZWZGYWlscyhEdW1teVRhc2tXaXRob3V0UHVibGljQ29uc3RydWN0b3IuY2xhc3MsICAiTm8gcHVibGljIG5vLWFyZyBjb25zdHJ1Y3RvciBpbiAiICsgRHVtbXlUYXNrV2l0aG91dFB1YmxpY0NvbnN0cnVjdG9yLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUYXNrRGVmRmFpbHMoRHVtbXlUYXNrV2l0aG91dEV4ZWN1dGUuY2xhc3MsICAgICAgICJObyBwdWJsaWMgZXhlY3V0ZSgpIGluICIgKyBEdW1teVRhc2tXaXRob3V0RXhlY3V0ZS5jbGFzcyk7CisgICAgICAgIGFzc2VydFRhc2tEZWZGYWlscyhEdW1teVRhc2tXaXRoTm9uUHVibGljRXhlY3V0ZS5jbGFzcywgIk5vIHB1YmxpYyBleGVjdXRlKCkgaW4gIiArIER1bW15VGFza1dpdGhOb25QdWJsaWNFeGVjdXRlLmNsYXNzKTsKKworICAgICAgICBtYmwuYWRkQnVpbGRFdmVudCgicmV0dXJuIHR5cGUgb2YgZXhlY3V0ZSgpIHNob3VsZCBiZSB2b2lkIGJ1dCB3YXMgXCJpbnRcIiBpbiAiICsgRHVtbXlUYXNrV2l0aE5vblZvaWRFeGVjdXRlLmNsYXNzLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgcC5hZGRUYXNrRGVmaW5pdGlvbigiTm9uVm9pZEV4ZWN1dGUiLCBEdW1teVRhc2tXaXRoTm9uVm9pZEV4ZWN1dGUuY2xhc3MpOworICAgICAgICBtYmwuYXNzZXJ0RW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKER1bW15VGFza1dpdGhOb25Wb2lkRXhlY3V0ZS5jbGFzcywgcC5nZXRUYXNrRGVmaW5pdGlvbnMoKS5nZXQoIk5vblZvaWRFeGVjdXRlIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dEhhbmRsZXIoKSB7CisgICAgICAgIElucHV0SGFuZGxlciBpaCA9IHAuZ2V0SW5wdXRIYW5kbGVyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaWgpOworICAgICAgICBhc3NlcnRUcnVlKGloIGluc3RhbmNlb2YgRGVmYXVsdElucHV0SGFuZGxlcik7CisgICAgICAgIElucHV0SGFuZGxlciBwZmloID0gbmV3IFByb3BlcnR5RmlsZUlucHV0SGFuZGxlcigpOworICAgICAgICBwLnNldElucHV0SGFuZGxlcihwZmloKTsKKyAgICAgICAgYXNzZXJ0U2FtZShwZmloLCBwLmdldElucHV0SGFuZGxlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza0RlZmluaXRpb25Db250YWluc0tleSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwLmdldFRhc2tEZWZpbml0aW9ucygpLmNvbnRhaW5zS2V5KCJlY2hvIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrRGVmaW5pdGlvbkNvbnRhaW5zKCkgeworICAgICAgICBhc3NlcnRUcnVlKHAuZ2V0VGFza0RlZmluaXRpb25zKCkuY29udGFpbnMob3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNoby5jbGFzcykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVUYXJnZXRzKCkgeworICAgICAgICAvLyBmYWlsLCBiZWNhdXNlIGJ1aWxkZmlsZSBjb250YWlucyB0d28gdGFyZ2V0cyB3aXRoIHRoZSBzYW1lIG5hbWUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJGVCBiZnQgPSBuZXcgQkZUKCIiLCAiY29yZS9kdXBsaWNhdGUtdGFyZ2V0LnhtbCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzcGVjaWZpYyBtZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRHVwbGljYXRlIHRhcmdldCAndHdpY2UnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBCdWlsZEV4Y2VwdGlvbiBhYm91dCBkdXBsaWNhdGUgdGFyZ2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZVRhcmdldHNJbXBvcnQoKSB7CisgICAgICAgIC8vIG92ZXJyaWRpbmcgdGFyZ2V0IGZyb20gaW1wb3J0ZWQgYnVpbGRmaWxlIGlzIGFsbG93ZWQKKyAgICAgICAgQkZUIGJmdCA9IG5ldyBCRlQoIiIsICJjb3JlL2R1cGxpY2F0ZS10YXJnZXQyLnhtbCIpOworICAgICAgICBiZnQuZXhwZWN0TG9nKCJvbmNlIiwgIm9uY2UgZnJvbSBidWlsZGZpbGUiKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgY2xhc3MgRHVtbXlUYXNrUHJpdmF0ZSBleHRlbmRzIFRhc2sgeworICAgICAgICBwdWJsaWMgRHVtbXlUYXNrUHJpdmF0ZSgpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7fQorICAgIH0KKworICAgIHByb3RlY3RlZCBjbGFzcyBEdW1teVRhc2tQcm90ZWN0ZWQgZXh0ZW5kcyBUYXNrIHsKKyAgICAgICAgcHVibGljIER1bW15VGFza1Byb3RlY3RlZCgpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7fQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQkZUIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdCB7CisgICAgICAgIEJGVChTdHJpbmcgbmFtZSwgU3RyaW5nIGJ1aWxkZmlsZSkgeworICAgICAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgICAgICB0aGlzLmJ1aWxkZmlsZSA9IGJ1aWxkZmlsZTsKKyAgICAgICAgICAgIHNldFVwKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhdm9pZCBtdWx0aXBsZSBjb25maWd1cmF0aW9ucworICAgICAgICBib29sZWFuIGlzQ29uZmlndXJlZCA9IGZhbHNlOworCisgICAgICAgIC8vIHRoZSBidWlsZGZpbGUgdG8gdXNlCisgICAgICAgIFN0cmluZyBidWlsZGZpbGUgPSAiIjsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKSB7CisgICAgICAgICAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvIitidWlsZGZpbGUpOworICAgICAgICAgICAgICAgIGlzQ29uZmlndXJlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsgfQorCisgICAgICAgIC8vIGNhbGwgYSB0YXJnZXQKKyAgICAgICAgcHVibGljIHZvaWQgZG9UYXJnZXQoU3RyaW5nIHRhcmdldCkgeworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQpIHNldFVwKCk7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCBnZXRQcm9qZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb2plY3QoKTsKKyAgICAgICAgfQorICAgIH0vL2NsYXNzLUJGVAorCit9CisKK2NsYXNzIER1bW15VGFza1BhY2thZ2UgZXh0ZW5kcyBUYXNrIHsKKyAgICBwdWJsaWMgRHVtbXlUYXNrUGFja2FnZSgpIHt9CisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHt9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvcGVydHlFeHBhbnNpb25UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvcGVydHlFeHBhbnNpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4ZDg0MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9wZXJ0eUV4cGFuc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKKworLyoqCisgKiBjbGFzcyB0byBsb29rIGF0IGhvdyB3ZSBleHBhbmQgcHJvcGVydGllcworICovCitwdWJsaWMgY2xhc3MgUHJvcGVydHlFeHBhbnNpb25UZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKworICAgIHB1YmxpYyBQcm9wZXJ0eUV4cGFuc2lvblRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogd2UgYmluZCB0byBhbiBleGlzdGluZyB0ZXN0IGZpbGUgYmVjYXVzZSB3ZSBhcmUgdG9vIGxhenkgdG8gd3JpdGUgb3VyCisgICAgICogb3duLCBhbmQgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgd2hhdCBpdCBpcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2ltbXV0YWJsZS54bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBydW4gdGhyb3VnaCB0aGUgdGVzdCBjYXNlcyBvZiBleHBhbnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlFeHBhbnNpb24oKSB7CisgICAgICAgIGFzc2VydEV4cGFuZHNUbygiIiwiIik7CisgICAgICAgIGFzc2VydEV4cGFuZHNUbygiJCIsIiQiKTsKKyAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIkJC0iLCIkLSIpOworICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIiQkIiwiJCIpOworICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJleHBhbmRlZCIsIkVYUEFOREVEIik7CisgICAgICAgIGFzc2VydEV4cGFuZHNUbygiYSR7ZXhwYW5kZWR9YiIsImFFWFBBTkRFRGIiKTsKKyAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIke2V4cGFuZGVkfSR7ZXhwYW5kZWR9IiwiRVhQQU5ERURFWFBBTkRFRCIpOworICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIiQkJCIsIiQkIik7CisgICAgICAgIGFzc2VydEV4cGFuZHNUbygiJCQkJC0iLCIkJC0iKTsKKyAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIiLCIiKTsKKyAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCJDbGFzcyQkc3ViY2xhc3MiLCJDbGFzcyRzdWJjbGFzcyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIG5ldyB0aGluZ3Mgd2Ugd2FudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REb2xsYXJQYXNzdGhydSgpIHsKKyAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIkLSIsIiQtIik7CisgICAgICAgIGFzc2VydEV4cGFuZHNUbygiQ2xhc3Mkc3ViY2xhc3MiLCJDbGFzcyRzdWJjbGFzcyIpOworICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIiQkJC0iLCIkJC0iKTsKKyAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIkJCQkJCIsIiQkJCIpOworICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIiR7dW5hc3NpZ25lZC5wcm9wZXJ0eX0iLCIke3VuYXNzaWduZWQucHJvcGVydHl9Iik7CisgICAgICAgIGFzc2VydEV4cGFuZHNUbygiYSRiIiwiYSRiIik7CisgICAgICAgIGFzc2VydEV4cGFuZHNUbygiJH19IiwiJH19Iik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBvbGQgdGhpbmdzIHdlIGRvbnQgd2FudDsgbm90IGEgdGVzdCBubyBtb3JlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb2xkdGVzdFF1aXJreUxlZ2FjeUJlaGF2aW9yKCkgeworICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIkNsYXNzJHN1YmNsYXNzIiwiQ2xhc3NzdWJjbGFzcyIpOworICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIiQkJC0iLCIkLSIpOworICAgICAgICBhc3NlcnRFeHBhbmRzVG8oImEkYiIsImFiIik7CisgICAgICAgIGFzc2VydEV4cGFuZHNUbygiJH19IiwifX0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsaXR0bGUgaGVscGVyIG1ldGhvZCB0byB2YWxpZGF0ZSBzdHVmZgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFeHBhbmRzVG8oU3RyaW5nIHNvdXJjZSxTdHJpbmcgZXhwZWN0ZWQpIHsKKyAgICAgICAgU3RyaW5nIGFjdHVhbD1wcm9qZWN0LnJlcGxhY2VQcm9wZXJ0aWVzKHNvdXJjZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UsZXhwZWN0ZWQsYWN0dWFsKTsKKyAgICB9CisKKy8vZW5kIGNsYXNzCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbnRhaW5lclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQ29udGFpbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODJmMTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbnRhaW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK3B1YmxpYyBjbGFzcyBUYXNrQ29udGFpbmVyVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFRhc2tDb250YWluZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3Rhc2tjb250YWluZXIueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlFeHBhbnNpb24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RQcm9wZXJ0eUV4cGFuc2lvbiIpOworICAgICAgICBhc3NlcnRUcnVlKCJhdHRyaWJ1dGUgd29ya2VkIiwKKyAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmRleE9mKCJBcyBhdHRyaWJ1dGU6IGl0IHdvcmtlZCIpID4gLTEpOworICAgICAgICBhc3NlcnRUcnVlKCJuZXN0ZWQgdGV4dCB3b3JrZWQiLAorICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZGV4T2YoIkFzIG5lc3RlZCB0ZXh0OiBpdCB3b3JrZWQiKSA+IC0xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza2RlZigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFRhc2tkZWYiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYXR0cmlidXRlIHdvcmtlZCIsCisgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5kZXhPZigiQXMgYXR0cmlidXRlOiBpdCB3b3JrZWQiKSA+IC0xKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibmVzdGVkIHRleHQgd29ya2VkIiwKKyAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmRleE9mKCJBcyBuZXN0ZWQgdGV4dDogaXQgd29ya2VkIikgPiAtMSk7CisgICAgICAgIGFzc2VydFRydWUoIm5lc3RlZCB0ZXh0IHdvcmtlZCIsCisgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5kZXhPZigiQXMgbmVzdGVkIHRhc2s6IGl0IHdvcmtlZCIpID4gLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlSW5zZW5zaXRpdmUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDYXNlSW5zZW5zaXRpdmUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgid29ya3Mgb3V0c2lkZSBvZiBjb250YWluZXIiLAorICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZGV4T2YoImhlbGxvICIpID4gLTEpOworICAgICAgICBhc3NlcnRUcnVlKCJ3b3JrcyBpbnNpZGUgb2YgY29udGFpbmVyIiwKKyAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmRleE9mKCJ3b3JsZCIpID4gLTEpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1RvcExldmVsVGFza1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Ub3BMZXZlbFRhc2tUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjZWFhMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Ub3BMZXZlbFRhc2tUZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCisvLyBUaGlzIHRlc3Qgd2lsbCBmYWlsIHdpdGggZW1iZWQsIG9yIGlmIHRvcC1sZXZlbCBpcyBtb3ZlZCBvdXQgb2YKKy8vIGRlcGVuZGVuY3kgLSBhcyAnZWNobycgaGFwcGVucyBhcyBwYXJ0IG9mIGNvbmZpZ3VyZVByb2plY3Qgc3RhZ2UuCisKKy8qKgorICogVGVzdHMgZm9yIGJ1aWxkcyB3aXRoIHRhc2tzIGF0IHRoZSB0b3AgbGV2ZWwKKyAqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgVG9wTGV2ZWxUYXNrVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFRvcExldmVsVGFza1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vVGFyZ2V0KCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3Mvbm90YXJnZXQueG1sIik7CisgICAgICAgIGV4cGVjdExvZygiIiwgIkNhbGxlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxsZWRGcm9tVG9wTGV2ZWxBbnQoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdG9wbGV2ZWx0YXNrcy90b3BsZXZlbGFudC54bWwiKTsKKyAgICAgICAgZXhwZWN0TG9nKCIiLCAiQ2FsbGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxlZEZyb21UYXJnZXRMZXZlbEFudCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS90b3BsZXZlbHRhc2tzL3RhcmdldGxldmVsYW50LnhtbCIpOworICAgICAgICBleHBlY3RMb2coImZvbyIsICJDYWxsZWQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvVW5rbm93bkVsZW1lbnRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvVW5rbm93bkVsZW1lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjYWVhMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Vbmtub3duRWxlbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworCitwdWJsaWMgY2xhc3MgVW5rbm93bkVsZW1lbnRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdW5rbm93bmVsZW1lbnQueG1sIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXliZUNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvIG5vdCBnZXQgYSBOUEUKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE1heWJlQ29uZmlndXJlIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZCBleHRlbmRzIFRhc2sgeworICAgICAgICBQYXJlbnQgcGFyZW50OworICAgICAgICBwdWJsaWMgdm9pZCBpbmplY3RQYXJlbnQoUGFyZW50IHBhcmVudCkgeworICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIHBhcmVudC5mcm9tQ2hpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyZW50IGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIFRhc2tDb250YWluZXIgeworICAgICAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgdCkgeworICAgICAgICAgICAgY2hpbGRyZW4uYWRkKHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZnJvbUNoaWxkKCkgeworICAgICAgICAgICAgbG9nKCJmcm9tY2hpbGQiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFVua25vd25FbGVtZW50IGVsID0gKFVua25vd25FbGVtZW50KSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBlbC5tYXliZUNvbmZpZ3VyZSgpOworICAgICAgICAgICAgICAgIENoaWxkIGNoaWxkID0gKENoaWxkKSBlbC5nZXRSZWFsVGhpbmcoKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5pbmplY3RQYXJlbnQodGhpcyk7CisgICAgICAgICAgICAgICAgY2hpbGQucGVyZm9ybSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NvbmNhdEZpbHRlclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NvbmNhdEZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA2MGJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ29uY2F0RmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworCisvKioKKyAqIEpVbml0IFRlc3RjYXNlcyBmb3IgQ29uY2F0UmVhZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBDb25jYXRGaWx0ZXJUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbFNlcCA9IFN0cmluZ1V0aWxzLkxJTkVfU0VQOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJFUEVORF9XSVRIID0KKyAgICAgICAgICAidGhpcy1zaG91bGQtYmUtdGhlLWZpcnN0LWxpbmUiICsgbFNlcAorICAgICAgICArICJMaW5lICAxIiArIGxTZXAKKyAgICAgICAgKyAiTGluZSAgMiIgKyBsU2VwCisgICAgICAgICsgIkxpbmUgIDMiICsgbFNlcAorICAgICAgICArICJMaW5lICA0IiArIGxTZXAKKyAgICA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUkVQRU5EID0KKyAgICAgICAgICAiTGluZSAgMSIgKyBsU2VwCisgICAgICAgICsgIkxpbmUgIDIiICsgbFNlcAorICAgICAgICArICJMaW5lICAzIiArIGxTZXAKKyAgICAgICAgKyAiTGluZSAgNCIgKyBsU2VwCisgICAgICAgICsgIkxpbmUgIDUiICsgbFNlcAorICAgIDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0FQUEVORF9XSVRIID0KKyAgICAgICAgICAiTGluZSA1NyIgKyBsU2VwCisgICAgICAgICsgIkxpbmUgNTgiICsgbFNlcAorICAgICAgICArICJMaW5lIDU5IiArIGxTZXAKKyAgICAgICAgKyAiTGluZSA2MCIgKyBsU2VwCisgICAgICAgICsgInRoaXMtc2hvdWxkLWJlLXRoZS1sYXN0LWxpbmUiICsgbFNlcAorICAgIDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0FQUEVORCA9CisgICAgICAgICAgIkxpbmUgNTYiICsgbFNlcAorICAgICAgICArICJMaW5lIDU3IiArIGxTZXAKKyAgICAgICAgKyAiTGluZSA1OCIgKyBsU2VwCisgICAgICAgICsgIkxpbmUgNTkiICsgbFNlcAorICAgICAgICArICJMaW5lIDYwIiArIGxTZXAKKyAgICA7CisKKworICAgIHB1YmxpYyBDb25jYXRGaWx0ZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2NvbmNhdC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJSZWFkZXJOb0FyZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyUmVhZGVyTm9BcmdzIik7CisgICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksImlucHV0L2NvbmNhdGZpbHRlci50ZXN0Iik7CisgICAgICAgIEZpbGUgcmVzdWx0ID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAicmVzdWx0L2NvbmNhdC5GaWx0ZXJSZWFkZXJOb0FyZ3MudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0RmlsdGVyUmVhZGVyTm9BcmdzOiBSZXN1bHQgbm90IGxpa2UgZXhwZWN0ZWQiLCBGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJSZWFkZXJCZWZvcmUoKSB7CisgICAgICAgIGRvVGVzdCgidGVzdEZpbHRlclJlYWRlclByZXBlbmQiLCBGSUxFX1BSRVBFTkRfV0lUSCwgRklMRV9BUFBFTkQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJSZWFkZXJBZnRlcigpIHsKKyAgICAgICAgZG9UZXN0KCJ0ZXN0RmlsdGVyUmVhZGVyQXBwZW5kIiwgRklMRV9QUkVQRU5ELCBGSUxFX0FQUEVORF9XSVRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyUmVhZGVyQmVmb3JlQWZ0ZXIoKSB7CisgICAgICAgIGRvVGVzdCgidGVzdEZpbHRlclJlYWRlclByZXBlbmRBcHBlbmQiLCBGSUxFX1BSRVBFTkRfV0lUSCwgRklMRV9BUFBFTkRfV0lUSCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbmNhdEZpbHRlcigpIHsKKyAgICAgICAgZG9UZXN0KCJ0ZXN0Q29uY2F0RmlsdGVyIiwgRklMRV9QUkVQRU5ELCBGSUxFX0FQUEVORCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbmNhdEZpbHRlckJlZm9yZSgpIHsKKyAgICAgICAgZG9UZXN0KCJ0ZXN0Q29uY2F0RmlsdGVyUHJlcGVuZCIsIEZJTEVfUFJFUEVORF9XSVRILCBGSUxFX0FQUEVORCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbmNhdEZpbHRlckFmdGVyKCkgeworICAgICAgICBkb1Rlc3QoInRlc3RDb25jYXRGaWx0ZXJBcHBlbmQiLCBGSUxFX1BSRVBFTkQsIEZJTEVfQVBQRU5EX1dJVEgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jYXRGaWx0ZXJCZWZvcmVBZnRlcigpIHsKKyAgICAgICAgZG9UZXN0KCJ0ZXN0Q29uY2F0RmlsdGVyUHJlcGVuZEFwcGVuZCIsIEZJTEVfUFJFUEVORF9XSVRILCBGSUxFX0FQUEVORF9XSVRIKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGEgdGFyZ2V0IGFuZCBjaGVja3MgdGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZGluZyBvZiBhIGZpbGUuCisgICAgICogVGhlIGZpbGVuYW1lIGRlcGVuZHMgb24gdGhlIHRhcmdldCBuYW1lOiB0YXJnZXQgbmFtZSA8aT50ZXN0SGVsbG9Xb3JsZDwvaT4KKyAgICAgKiB3aWxsIHNlYXJjaCBmb3IgYSBmaWxlIDxpPnJlc3VsdC9jb25jYXQuSGVsbG9Xb3JsZC50ZXN0PC9pPi4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gaW52b2tlCisgICAgICogQHBhcmFtIGV4cGVjdGVkU3RhcnQgVGhlIHN0cmluZyB3aGljaCBzaG91bGQgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZQorICAgICAqIEBwYXJhbSBleHBlY3RlZEVuZCBUaGUgc3RyaW5nIHdoaWNoIHNob3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9UZXN0KFN0cmluZyB0YXJnZXQsIFN0cmluZyBleHBlY3RlZFN0YXJ0LCBTdHJpbmcgZXhwZWN0ZWRFbmQpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBTdHJpbmcgcmVzdWx0Q29udGVudCA9IHJlYWQoInJlc3VsdC9jb25jYXQuIiArIHRhcmdldC5zdWJzdHJpbmcoNCkgKyAiLnRlc3QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlyc3QgNSBsaW5lcyBkaWZmZXJzLiIsIHJlc3VsdENvbnRlbnQuc3RhcnRzV2l0aChleHBlY3RlZFN0YXJ0KSk7CisgICAgICAgIGFzc2VydFRydWUoIkxhc3QgNSBsaW5lcyBkaWZmZXJzLiIsIHJlc3VsdENvbnRlbnQuZW5kc1dpdGgoZXhwZWN0ZWRFbmQpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyYXBwZXIgZm9yIEZpbGVVdGlscy5yZWFkRnVsbHkoKS4KKyAgICAgKiBBZGRpdGlvbmFsbHkgaXQgcmVzb2x2ZXMgdGhlIGZpbGVuYW1lIGFjY29yZGluZyB0aGUgdGhlIHByb2plY3RzIGJhc2VkaXIKKyAgICAgKiBhbmQgY2xvc2VzIHRoZSB1c2VkIHJlYWRlci4KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmVhZAorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgb3IgPGk+bnVsbDwvaT4gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgZmlsZW5hbWUpOworICAgICAgICAgICAgamF2YS5pby5GaWxlUmVhZGVyIHJkciA9IG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoZmlsZSk7CisgICAgICAgICAgICBjb250ZW50ID0gRmlsZVV0aWxzLnJlYWRGdWxseShyZHIpOworICAgICAgICAgICAgcmRyLmNsb3NlKCk7CisgICAgICAgICAgICByZHIgPSBudWxsOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0R5bmFtaWNGaWx0ZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9EeW5hbWljRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTgxYzYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9EeW5hbWljRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBEeW5hbWljRmlsdGVyVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgCisgICAgcHVibGljIER5bmFtaWNGaWx0ZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2R5bmFtaWNmaWx0ZXIueG1sIik7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImluaXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tRmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKCJkeW5hbWljZmlsdGVyIiwgInJlc3VsdC9keW5hbWljZmlsdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWxsTyB3T3JsZCIpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgSGVscGVyIG1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZVN0cmluZyhTdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUmVhZGVyIHIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgciA9IG5ldyBGaWxlUmVhZGVyKEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgZmlsZW5hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiAgRmlsZVV0aWxzLnJlYWRGdWxseShyKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShyKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdEZpbGVDb250YWlucyhTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRhaW5zKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gZ2V0RmlsZVN0cmluZyhuYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICJleHBlY3RpbmcgZmlsZSAiICsgbmFtZSArICIgdG8gY29udGFpbiAiICsgY29udGFpbnMgKworICAgICAgICAgICAgIiBidXQgZ290ICIgKyBjb250ZW50LCBjb250ZW50LmluZGV4T2YoY29udGFpbnMpID4gLTEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3RGaWxlQ29udGFpbnMoCisgICAgICAgIFN0cmluZyB0YXJnZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGFpbnMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBleHBlY3RGaWxlQ29udGFpbnMobmFtZSwgY29udGFpbnMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tRmlsdGVyIGltcGxlbWVudHMgQ2hhaW5hYmxlUmVhZGVyIHsKKyAgICAgICAgY2hhciByZXBsYWNlID0gJ3gnOworICAgICAgICBjaGFyIHdpdGggICAgPSAneSc7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVwbGFjZShjaGFyIHJlcGxhY2UpIHsKKyAgICAgICAgICAgIHRoaXMucmVwbGFjZSA9IHJlcGxhY2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRXaXRoKGNoYXIgd2l0aCkgeworICAgICAgICAgICAgdGhpcy53aXRoID0gd2l0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWFkZXIgY2hhaW4oZmluYWwgUmVhZGVyIHJkcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCYXNlRmlsdGVyUmVhZGVyKHJkcikgeworICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGMgPSBpbi5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IHJlcGxhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2l0aDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0VzY2FwZVVuaWNvZGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Fc2NhcGVVbmljb2RlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTQ2OTkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Fc2NhcGVVbmljb2RlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqLworcHVibGljIGNsYXNzIEVzY2FwZVVuaWNvZGVUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwdWJsaWMgRXNjYXBlVW5pY29kZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvYnVpbGQueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlVW5pY29kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RFc2NhcGVVbmljb2RlIik7CisgICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJleHBlY3RlZC9lc2NhcGV1bmljb2RlLnRlc3QiKTsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJyZXN1bHQvZXNjYXBldW5pY29kZS50ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0hlYWRUYWlsVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvSGVhZFRhaWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZjUxNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0hlYWRUYWlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqIEpVbml0IFRlc3RjYXNlcyBmb3IgVGFpbEZpbHRlciBhbmQgSGVhZEZpbHRlcgorICovCisvKiBJIHdyb3RlIHRoZSB0ZXN0Y2FzZXMgaW4gb25lIGphdmEgZmlsZSBiZWNhdXNlIEkgd2FudCBhbHNvIHRvIHRlc3QgdGhlCisgKiBjb21iaW5lZCBiZWhhdmlvdXIgKHNlZSBlbmQgb2YgdGhlIGNsYXNzKS4KKyovCitwdWJsaWMgY2xhc3MgSGVhZFRhaWxUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKyAgICAKKyAgICBwdWJsaWMgSGVhZFRhaWxUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2hlYWQtdGFpbC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEhlYWQiKTsKKyAgICAgICAgRmlsZSBleHBlY3RlZCA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgImV4cGVjdGVkL2hlYWQtdGFpbC5oZWFkLnRlc3QiKTsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJyZXN1bHQvaGVhZC10YWlsLmhlYWQudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0SGVhZDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwgRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZExpbmVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEhlYWRMaW5lcyIpOworICAgICAgICBGaWxlIGV4cGVjdGVkID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAiZXhwZWN0ZWQvaGVhZC10YWlsLmhlYWRMaW5lcy50ZXN0Iik7CisgICAgICAgIEZpbGUgcmVzdWx0ID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAicmVzdWx0L2hlYWQtdGFpbC5oZWFkTGluZXMudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0SGVhZExpbmVzOiBSZXN1bHQgbm90IGxpa2UgZXhwZWN0ZWQiLCBGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkU2tpcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RIZWFkU2tpcCIpOworICAgICAgICBGaWxlIGV4cGVjdGVkID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCJleHBlY3RlZC9oZWFkLXRhaWwuaGVhZFNraXAudGVzdCIpOworICAgICAgICBGaWxlIHJlc3VsdCA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwicmVzdWx0L2hlYWQtdGFpbC5oZWFkU2tpcC50ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoInRlc3RIZWFkU2tpcDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwgRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZExpbmVzU2tpcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RIZWFkTGluZXNTa2lwIik7CisgICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksImV4cGVjdGVkL2hlYWQtdGFpbC5oZWFkTGluZXNTa2lwLnRlc3QiKTsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksInJlc3VsdC9oZWFkLXRhaWwuaGVhZExpbmVzU2tpcC50ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoInRlc3RIZWFkTGluZXNTa2lwOiBSZXN1bHQgbm90IGxpa2UgZXhwZWN0ZWQiLCBGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJSZWFkZXJIZWFkTGluZXNTa2lwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbHRlclJlYWRlckhlYWRMaW5lc1NraXAiKTsKKyAgICAgICAgRmlsZSBleHBlY3RlZCA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKKyAgICAgICAgICAgICJleHBlY3RlZC9oZWFkLXRhaWwuaGVhZExpbmVzU2tpcC50ZXN0Iik7CisgICAgICAgIEZpbGUgcmVzdWx0ID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLAorICAgICAgICAgICAgInJlc3VsdC9oZWFkLXRhaWwuZmlsdGVyUmVhZGVySGVhZExpbmVzU2tpcC50ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoInRlc3RGaWx0ZXJSZWFkZXJIZWFkTGluZXNTa2lwOiBSZXN1bHQgbm90IGxpa2UgZXhwZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhleHBlY3RlZCwgcmVzdWx0KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRhaWwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0VGFpbCIpOworICAgICAgICBGaWxlIGV4cGVjdGVkID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCJleHBlY3RlZC9oZWFkLXRhaWwudGFpbC50ZXN0Iik7CisgICAgICAgIEZpbGUgcmVzdWx0ID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCJyZXN1bHQvaGVhZC10YWlsLnRhaWwudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0VGFpbDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwgRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFpbExpbmVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFRhaWxMaW5lcyIpOworICAgICAgICBGaWxlIGV4cGVjdGVkID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCJleHBlY3RlZC9oZWFkLXRhaWwudGFpbExpbmVzLnRlc3QiKTsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksInJlc3VsdC9oZWFkLXRhaWwudGFpbExpbmVzLnRlc3QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidGVzdFRhaWxMaW5lczogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwgRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFpbFNraXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0VGFpbFNraXAiKTsKKyAgICAgICAgRmlsZSBleHBlY3RlZCA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwiZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWxTa2lwLnRlc3QiKTsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksInJlc3VsdC9oZWFkLXRhaWwudGFpbFNraXAudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0VGFpbFNraXA6IFJlc3VsdCBub3QgbGlrZSBleHBlY3RlZCIsIEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhleHBlY3RlZCwgcmVzdWx0KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRhaWxMaW5lc1NraXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0VGFpbExpbmVzU2tpcCIpOworICAgICAgICBGaWxlIGV4cGVjdGVkID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCJleHBlY3RlZC9oZWFkLXRhaWwudGFpbExpbmVzU2tpcC50ZXN0Iik7CisgICAgICAgIEZpbGUgcmVzdWx0ID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCJyZXN1bHQvaGVhZC10YWlsLnRhaWxMaW5lc1NraXAudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0VGFpbExpbmVzU2tpcDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwgRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyUmVhZGVyVGFpbExpbmVzU2tpcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RGaWx0ZXJSZWFkZXJUYWlsTGluZXNTa2lwIik7CisgICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksCisgICAgICAgICAgICAiZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWxMaW5lc1NraXAudGVzdCIpOworICAgICAgICBGaWxlIHJlc3VsdCA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKKyAgICAgICAgICAgICJyZXN1bHQvaGVhZC10YWlsLmZpbHRlclJlYWRlclRhaWxMaW5lc1NraXAudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0RmlsdGVyUmVhZGVyVGFpbExpbmVzU2tpcDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkVGFpbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RIZWFkVGFpbCIpOworICAgICAgICBGaWxlIGV4cGVjdGVkID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCJleHBlY3RlZC9oZWFkLXRhaWwuaGVhZHRhaWwudGVzdCIpOworICAgICAgICBGaWxlIHJlc3VsdCA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwicmVzdWx0L2hlYWQtdGFpbC5oZWFkdGFpbC50ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoInRlc3RIZWFkVGFpbDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwgRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0xpbmVDb250YWluc1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0xpbmVDb250YWluc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjMzMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTGluZUNvbnRhaW5zVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqLworcHVibGljIGNsYXNzIExpbmVDb250YWluc1Rlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworICAgIAorICAgIHB1YmxpYyBMaW5lQ29udGFpbnNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2J1aWxkLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpbmVDb250YWlucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RMaW5lQ29udGFpbnMiKTsKKyAgICAgICAgRmlsZSBleHBlY3RlZCA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwiZXhwZWN0ZWQvbGluZWNvbnRhaW5zLnRlc3QiKTsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksInJlc3VsdC9saW5lY29udGFpbnMudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhleHBlY3RlZCwgcmVzdWx0KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0ZUxpbmVDb250YWlucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3ROZWdhdGVMaW5lQ29udGFpbnMiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL05vTmV3TGluZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL05vTmV3TGluZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGRmMzRlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTm9OZXdMaW5lVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKiBKVW5pdCBUZXN0Y2FzZXMgZm9yIE5vIG5ldyBsaW5lIHdoZW4gZmlsdGVyY2hhaW4gdXNlZAorICovCisKKworcHVibGljIGNsYXNzIE5vTmV3TGluZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBOb05ld0xpbmVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2J1aWxkLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQWRkTmV3TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3ROb0FkZE5ld0xpbmUiKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9SZXBsYWNlVG9rZW5zVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUmVwbGFjZVRva2Vuc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQyOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUmVwbGFjZVRva2Vuc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBsYWNlVG9rZW5zVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwdWJsaWMgUmVwbGFjZVRva2Vuc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvYnVpbGQueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVRva2VucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RSZXBsYWNlVG9rZW5zIik7CisgICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksImV4cGVjdGVkL3JlcGxhY2V0b2tlbnMudGVzdCIpOworICAgICAgICBGaWxlIHJlc3VsdCA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwicmVzdWx0L3JlcGxhY2V0b2tlbnMudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhleHBlY3RlZCwgcmVzdWx0KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VUb2tlbnNQcm9wZXJ0eUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UmVwbGFjZVRva2Vuc1Byb3BlcnR5RmlsZSIpOworICAgICAgICBGaWxlIGV4cGVjdGVkID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShnZXRQcm9qZWN0RGlyKCksICJleHBlY3RlZC9yZXBsYWNldG9rZW5zLnRlc3QiKTsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3REaXIoKSwgInJlc3VsdC9yZXBsYWNldG9rZW5zUHJvcGVydHlGaWxlLnRlc3QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaXBKYXZhQ29tbWVudHNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcEphdmFDb21tZW50c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzMxMWMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaXBKYXZhQ29tbWVudHNUZXN0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgU3RyaXBKYXZhQ29tbWVudHNUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwdWJsaWMgU3RyaXBKYXZhQ29tbWVudHNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2J1aWxkLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmlwSmF2YUNvbW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFN0cmlwSmF2YUNvbW1lbnRzIik7CisgICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksImV4cGVjdGVkL3N0cmlwamF2YWNvbW1lbnRzLnRlc3QiKTsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksInJlc3VsdC9zdHJpcGphdmFjb21tZW50cy50ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGV4cGVjdGVkLCByZXN1bHQpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1Rva2VuRmlsdGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVG9rZW5GaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkOTQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1Rva2VuRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBUb2tlbkZpbHRlclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworICAgIAorICAgIHB1YmxpYyBUb2tlbkZpbHRlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvdG9rZW5maWx0ZXIueG1sIik7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImluaXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIC8qKiBtYWtlIHN1cmUgdG9rZW5maWx0ZXIgZXhpc3RzICovCisgICAgcHVibGljIHZvaWQgdGVzdFRva2VuZmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidG9rZW5maWx0ZXIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbWlnbm9yZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRyaW1pZ25vcmUiLCAiSGVsbG8tV29ybGQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nVG9rZW5pemVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygKKyAgICAgICAgICAgICJzdHJpbmd0b2tlbml6ZXIiLCAiI1RoaXMjaXMjYSNudW1iZXIjb2Yjd29yZHMjIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVuaXhMaW5lT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKAorICAgICAgICAgICAgInVuaXhsaW5lb3V0cHV0IiwgInJlc3VsdC91bml4bGluZW91dHB1dCIsCisgICAgICAgICAgICAiXG5UaGlzXG5pc1xuYVxubnVtYmVyXG5vZlxud29yZHNcbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3NMaW5lT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKAorICAgICAgICAgICAgImRvc2xpbmVvdXRwdXQiLCAicmVzdWx0L2Rvc2xpbmVvdXRwdXQiLAorICAgICAgICAgICAgIlxyXG5UaGlzXHJcbmlzXHJcbmFcclxubnVtYmVyXHJcbm9mXHJcbndvcmRzXHJcbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlVG9rZW5pemVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gZ2V0RmlsZVN0cmluZygKKyAgICAgICAgICAgICJmaWxldG9rZW5pemVyIiwgInJlc3VsdC9maWxldG9rZW5pemVyIik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAiICAgb2Ygd29yZHMiKTsKKyAgICAgICAgYXNzZXJ0U3RyaW5nTm90Q29udGFpbnMoY29udGVudHMsICIgVGhpcyBpcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKAorICAgICAgICAgICAgInJlcGxhY2VzdHJpbmciLCAicmVzdWx0L3JlcGxhY2VzdHJpbmciLAorICAgICAgICAgICAgInRoaXMgaXMgdGhlIG1vb24iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVN0cmluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJyZXBsYWNlc3RyaW5ncyIsICJiYXIgYmFyIGJhciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoCisgICAgICAgICAgICAiY29udGFpbnNzdHJpbmciLCAicmVzdWx0L2NvbnRhaW5zc3RyaW5nIik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAidGhpcyBpcyBhIGxpbmUgY29udGFpbnMgZm9vIik7CisgICAgICAgIGFzc2VydFN0cmluZ05vdENvbnRhaW5zKGNvbnRlbnRzLCAidGhpcyBsaW5lIGRvZXMgbm90Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VSZWdleCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghIGhhc1JlZ2V4KCJ0ZXN0UmVwbGFjZVJlZ2V4IikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoCisgICAgICAgICAgICAicmVwbGFjZXJlZ2V4IiwgInJlc3VsdC9yZXBsYWNlcmVnZXgiKTsKKyAgICAgICAgYXNzZXJ0U3RyaW5nQ29udGFpbnMoY29udGVudHMsICJ3b3JsZCB3b3JsZCB3b3JsZCB3b3JsZCIpOworICAgICAgICBhc3NlcnRTdHJpbmdDb250YWlucyhjb250ZW50cywgImRvZyBDYXQgZG9nIik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAibW9vbiBTdW4gU3VuIik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAiZm91bmQgV2hpdGVTcGFjZSIpOworICAgICAgICBhc3NlcnRTdHJpbmdDb250YWlucyhjb250ZW50cywgIkZvdW5kIGRpZ2l0cyBbMTIzNF0iKTsKKyAgICAgICAgYXNzZXJ0U3RyaW5nTm90Q29udGFpbnMoY29udGVudHMsICJUaGlzIGlzIGEgbGluZSB3aXRoIGRpZ2l0cyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJSZXBsYWNlUmVnZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoISBoYXNSZWdleCgidGVzdEZpbHRlclJlcGxhY2VSZWdleCIpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTdHJpbmcgY29udGVudHMgPSBnZXRGaWxlU3RyaW5nKAorICAgICAgICAgICAgImZpbHRlcnJlcGxhY2VyZWdleCIsICJyZXN1bHQvZmlsdGVycmVwbGFjZXJlZ2V4Iik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAid29ybGQgd29ybGQgd29ybGQgd29ybGQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlRG9sbGVyTWF0Y2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoISBoYXNSZWdleCgidGVzdEZpbHRlclJlcGxhY2VSZWdleCIpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJkb2xsZXJtYXRjaCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUcmltRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoCisgICAgICAgICAgICAidHJpbWZpbGUiLCAicmVzdWx0L3RyaW1maWxlIik7CisgICAgICAgIGFzc2VydFRydWUoIm5vIHdzIGF0IHN0YXJ0IiwgY29udGVudHMuc3RhcnRzV2l0aCgiVGhpcyBpcyB0aCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibm8gd3MgYXQgZW5kIiwgY29udGVudHMuZW5kc1dpdGgoInNlY29uZCBsaW5lLiIpKTsKKyAgICAgICAgYXNzZXJ0U3RyaW5nQ29udGFpbnMoY29udGVudHMsICIgIFRoaXMgaXMgdGhlIHNlY29uZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUcmltRmlsZUJ5TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoCisgICAgICAgICAgICAidHJpbWZpbGVieWxpbmUiLCAicmVzdWx0L3RyaW1maWxlYnlsaW5lIik7CisgICAgICAgIGFzc2VydEZhbHNlKCJubyB3cyBhdCBzdGFydCIsIGNvbnRlbnRzLnN0YXJ0c1dpdGgoIlRoaXMgaXMgdGgiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJubyB3cyBhdCBlbmQiLCBjb250ZW50cy5lbmRzV2l0aCgic2Vjb25kIGxpbmUuIikpOworICAgICAgICBhc3NlcnRTdHJpbmdOb3RDb250YWlucyhjb250ZW50cywgIiAgVGhpcyBpcyB0aGUgc2Vjb25kIik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAiZmlsZS5cblRoaXMgaXMgdGhlIHNlY29uZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJSZXBsYWNlU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gZ2V0RmlsZVN0cmluZygKKyAgICAgICAgICAgICJmaWx0ZXJyZXBsYWNlc3RyaW5nIiwgInJlc3VsdC9maWx0ZXJyZXBsYWNlc3RyaW5nIik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAiVGhpcyBpcyB0aGUgbW9vbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJSZXBsYWNlU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoImZpbHRlcnJlcGxhY2VzdHJpbmdzIiwgImJhciBiYXIgYmFyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zUmVnZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoISBoYXNSZWdleCgidGVzdENvbnRhaW5zUmVnZXgiKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gZ2V0RmlsZVN0cmluZygKKyAgICAgICAgICAgICJjb250YWluc3JlZ2V4IiwgInJlc3VsdC9jb250YWluc3JlZ2V4Iik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAiaGVsbG8gd29ybGQiKTsKKyAgICAgICAgYXNzZXJ0U3RyaW5nTm90Q29udGFpbnMoY29udGVudHMsICJ0aGlzIGlzIHRoZSBtb29uIik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAiV29ybGQgaGVyZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJDb250YWluc1JlZ2V4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEgaGFzUmVnZXgoInRlc3RGaWx0ZXJDb250YWluc1JlZ2V4IikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoCisgICAgICAgICAgICAiZmlsdGVyY29udGFpbnNyZWdleCIsICJyZXN1bHQvZmlsdGVyY29udGFpbnNyZWdleCIpOworICAgICAgICBhc3NlcnRTdHJpbmdDb250YWlucyhjb250ZW50cywgImhlbGxvIHdvcmxkIik7CisgICAgICAgIGFzc2VydFN0cmluZ05vdENvbnRhaW5zKGNvbnRlbnRzLCAidGhpcyBpcyB0aGUgbW9vbiIpOworICAgICAgICBhc3NlcnRTdHJpbmdDb250YWlucyhjb250ZW50cywgIldvcmxkIGhlcmUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNSZWdleDIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoISBoYXNSZWdleCgidGVzdENvbnRhaW5zUmVnZXgyIikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoCisgICAgICAgICAgICAiY29udGFpbnNyZWdleDIiLCAicmVzdWx0L2NvbnRhaW5zcmVnZXgyIik7CisgICAgICAgIGFzc2VydFN0cmluZ0NvbnRhaW5zKGNvbnRlbnRzLCAidm9pZCByZWdpc3Rlcl9iaXRzKCk7Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZUNoYXJhY3RlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY29udGVudHMgPSBnZXRGaWxlU3RyaW5nKAorICAgICAgICAgICAgImRlbGV0ZWNoYXJhY3RlcnMiLCAicmVzdWx0L2RlbGV0ZWNoYXJzIik7CisgICAgICAgIGFzc2VydFN0cmluZ05vdENvbnRhaW5zKGNvbnRlbnRzLCAiIyIpOworICAgICAgICBhc3NlcnRTdHJpbmdOb3RDb250YWlucyhjb250ZW50cywgIioiKTsKKyAgICAgICAgYXNzZXJ0U3RyaW5nQ29udGFpbnMoY29udGVudHMsICJUaGlzIGlzIHNvbWUgIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNjcmlwdEZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghIGhhc1NjcmlwdCgidGVzdFNjcmlwdEZpbHRlciIpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGV4cGVjdEZpbGVDb250YWlucygic2NyaXB0ZmlsdGVyIiwgInJlc3VsdC9zY3JpcHRmaWx0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhFTExPIFdPUkxEIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyaXB0RmlsdGVyMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghIGhhc1NjcmlwdCgidGVzdFNjcmlwdEZpbHRlciIpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGV4cGVjdEZpbGVDb250YWlucygic2NyaXB0ZmlsdGVyMiIsICJyZXN1bHQvc2NyaXB0ZmlsdGVyMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSEVMTE8gTU9PTiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21Ub2tlbkZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEZpbGVDb250YWlucygiY3VzdG9tdG9rZW5maWx0ZXIiLCAicmVzdWx0L2N1c3RvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8gV29ybGQiKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgIEhlbHBlciBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzU2NyaXB0KFN0cmluZyB0ZXN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJoYXNzY3JpcHQiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgdGVzdCArICI6IHNraXBwZWQgLSBzY3JpcHQgbm90IHByZXNlbnQgIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1JlZ2V4KFN0cmluZyB0ZXN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJoYXNyZWdleCIpOworICAgICAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKCJyZXN1bHQvcmVwbGFjZXJlZ2V4cCIsICJieWUgd29ybGQiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGVzdCArICI6IHNraXBwZWQgLSByZWdleCBub3QgcHJlc2VudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFN0cmluZ0NvbnRhaW5zKFN0cmluZyBzdHJpbmcsIFN0cmluZyBjb250YWlucykgeworICAgICAgICBhc3NlcnRUcnVlKCJbIiArIHN0cmluZyArICJdIGRvZXMgbm90IGNvbnRhaW4gWyIgKyBjb250YWlucyArIl0iLAorICAgICAgICAgICAgICAgICAgIHN0cmluZy5pbmRleE9mKGNvbnRhaW5zKSA+IC0xKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U3RyaW5nTm90Q29udGFpbnMoU3RyaW5nIHN0cmluZywgU3RyaW5nIGNvbnRhaW5zKSB7CisgICAgICAgIGFzc2VydFRydWUoIlsiICsgc3RyaW5nICsgIl0gZG9lcyBjb250YWluIFsiICsgY29udGFpbnMgKyJdIiwKKyAgICAgICAgICAgICAgICAgICBzdHJpbmcuaW5kZXhPZihjb250YWlucykgPT0gLTEpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEZpbGVTdHJpbmcoU3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFJlYWRlciByID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIgPSBuZXcgRmlsZVJlYWRlcihGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksZmlsZW5hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiAgRmlsZVV0aWxzLnJlYWRGdWxseShyKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShyKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZVN0cmluZyhTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICByZXR1cm4gZ2V0RmlsZVN0cmluZyhmaWxlbmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdEZpbGVDb250YWlucyhTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRhaW5zKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gZ2V0RmlsZVN0cmluZyhuYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICJleHBlY3RpbmcgZmlsZSAiICsgbmFtZSArICIgdG8gY29udGFpbiAiICsgY29udGFpbnMgKworICAgICAgICAgICAgIiBidXQgZ290ICIgKyBjb250ZW50LCBjb250ZW50LmluZGV4T2YoY29udGFpbnMpID4gLTEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3RGaWxlQ29udGFpbnMoCisgICAgICAgIFN0cmluZyB0YXJnZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGFpbnMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBleHBlY3RGaWxlQ29udGFpbnMobmFtZSwgY29udGFpbnMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FwaXRhbGl6ZQorICAgICAgICBpbXBsZW1lbnRzIFRva2VuRmlsdGVyLkZpbHRlcgorICAgIHsKKyAgICAgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIHRva2VuKSB7CisgICAgICAgICAgICBpZiAodG9rZW4ubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgICAgICByZXR1cm4gdG9rZW4uc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKworICAgICAgICAgICAgICAgIHRva2VuLnN1YnN0cmluZygxKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9Mb2NhdG9yVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9Mb2NhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDkzYTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0xvY2F0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworCisvKiogVGVzdCB0aGUgbG9jYXRvciBpbiB0aGUgYW50LWxhdW5jaCBKQVIgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gd2luZG93czsKKyAgICBwcml2YXRlIGJvb2xlYW4gdW5peDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIRVJfSkFSID0gIi8vbW9yemluZS9zbG8vSmF2YS9BcGFjaGUvYW50L2xpYi9hbnQtbGF1bmNoZXIuamFyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0pBUl9VUkkgPSAiamFyOmZpbGU6IisgTEFVTkNIRVJfSkFSICsiIS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvTGF1bmNoZXIuY2xhc3MiOworCisgICAgLyoqCisgICAgICogTm8tYXJnIGNvbnN0cnVjdG9yIHRvIGVuYWJsZSBzZXJpYWxpemF0aW9uLiBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBtZXJlIG1vcnRhbHMgd2l0aG91dCBjYWxsaW5nCisgICAgICogc2V0TmFtZSgpLgorICAgICAqLworICAgIHB1YmxpYyBMb2NhdG9yVGVzdCgpIHsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIExvY2F0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHdpbmRvd3MgPSBPcy5pc0ZhbWlseShPcy5GQU1JTFlfRE9TKTsKKyAgICAgICAgdW5peCA9IE9zLmlzRmFtaWx5KE9zLkZBTUlMWV9VTklYKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlKFN0cmluZyB1cmkpIHsKKyAgICAgICAgU3RyaW5nIGoxNCA9IExvY2F0b3IuZnJvbVVSSSh1cmkpOworICAgICAgICBTdHJpbmcgajEzID0gTG9jYXRvci5mcm9tVVJJSmF2YTEzKHVyaSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGlmZmVyZW50IGZyb21VUkkgY29udmVyc2lvbi5cbkphdmExLjQ9IiArIGoxNCArICJcbkphdmExLjM9IiArIGoxMyArICJcbiIsCisgICAgICAgICAgICAgICAgajE0LCBqMTMpOworICAgICAgICByZXR1cm4gajE0OworICAgIH0KKworICAgIC8qKgorICAgICAqIGV4cGVjdCBhIHVyaSB0byByZXNvbHZlIHRvIHN0cmluZ3Mgb24gZGlmZmVyZW50IHBsYXRmb3JtcworICAgICAqIEBwYXJhbSB1cmkgdXJpIHRvIHBhcnNlCisgICAgICogQHBhcmFtIGV4cGVjdGVkVW5peCB1bml4IHN0cmluZyAob3IgbnVsbCB0byBza2lwIHRoYXQgdGVzdCkKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWREb3MgRE9TIHN0cmluZyAob3IgbnVsbCB0byBza2lwIHRoYXQgdGVzdCkKKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlVG8oU3RyaW5nIHVyaSwgU3RyaW5nIGV4cGVjdGVkVW5peCwgU3RyaW5nIGV4cGVjdGVkRG9zKSB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSByZXNvbHZlKHVyaSk7CisgICAgICAgIGFzc2VydFJlc29sdmVkKHVyaSwgZXhwZWN0ZWRVbml4LCByZXN1bHQsIHVuaXgpOworICAgICAgICBhc3NlcnRSZXNvbHZlZCh1cmksIGV4cGVjdGVkRG9zLCByZXN1bHQsIHdpbmRvd3MpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCBzb21ldGhpbmcgcmVzb2x2ZWQKKyAgICAgKiBAcGFyYW0gdXJpIG9yaWdpbmFsIFVSSQorICAgICAqIEBwYXJhbSBleHBlY3RlZFJlc3VsdCB3aGF0IHdlIGV4cGVjdGVkCisgICAgICogQHBhcmFtIHJlc3VsdCB3aGF0IHdlIGdvdAorICAgICAqIEBwYXJhbSBlbmFibGVkIGlzIHRoZSB0ZXN0IGVuYWJsZWQ/CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlc29sdmVkKFN0cmluZyB1cmksIFN0cmluZyBleHBlY3RlZFJlc3VsdCwgU3RyaW5nIHJlc3VsdCwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIGlmIChlbmFibGVkICYmIGV4cGVjdGVkUmVzdWx0ICE9IG51bGwgJiYgZXhwZWN0ZWRSZXN1bHQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkICIgKyB1cmkgKyAiIHRvIHJlc29sdmUgdG8gXG4iICsgZXhwZWN0ZWRSZXN1bHQgKyAiXG4gYnV0IGdvdFxuIgorICAgICAgICAgICAgICAgICAgICArIHJlc3VsdCArICJcbiIsIGV4cGVjdGVkUmVzdWx0LCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBhc3NlcnRzIHRoYXQgd2UgY2FuIHJvdW5kIHRyaXAgdGhlIHBhdGggdG8gYSBVUkkgYW5kIGJhY2sgYWdhaW4KKyAgICAgKiBAcGFyYW0gcGF0aCBmaWxlbmFtZSB3aXRoIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3JzCisgICAgICogQHJldHVybiB0aGUgdHJhaWxpbmcgZmlsZW5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhc3NlcnRSZXNvbHZlcyhTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgYXN1cmkgPSBuZXcgRmlsZShwYXRoKS50b1VSSSgpLnRvQVNDSUlTdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIGZ1bGxwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgRmlsZS5zZXBhcmF0b3IgKyBwYXRoOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVzb2x2ZVRvKGFzdXJpLCBmdWxscGF0aCwgZnVsbHBhdGgpOworICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZyhyZXN1bHQubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKSArIDEpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogdGhpcyBpc250IHJlYWxseSBhIHZhbGlkIFVSSSwgZXhjZXB0IG1heWJlIGluIElFCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV0d29ya1VSSSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXNvbHZlVG8oImZpbGU6XFxcXFBDMDNcXGpjbGFzc2VzXFxsaWJcXGFudC0xLjcuMC5qYXIiLCAiIgorICAgICAgICAgICAgICAgICsgIlxcXFxQQzAzXFxqY2xhc3Nlc1xcbGliXFxhbnQtMS43LjAuamFyIiwKKyAgICAgICAgICAgICAgICAiXFxcXFBDMDNcXGpjbGFzc2VzXFxsaWJcXGFudC0xLjcuMC5qYXIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIG5vdCBiZWluZyB0ZXN0ZWQgYXMgd2UgZG9uJ3QgYXBwZWFyIHRvIGdlbmVyYXRlIHBhdGhzIGxpa2UgdGhpcyBpbiB0aGUgbGF1bmNoZXIKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIE5vdGVzdFRyaXBsZUZvcndhcmRTbGFzaE5ldHdvcmtVUkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVzb2x2ZVRvKCJmaWxlOi8vL1BDMDMvamNsYXNzZXMvbGliL2FudC0xLjcuMC5qYXIiLAorICAgICAgICAgICAgICAgICIvLy9QQzAzL2pjbGFzc2VzL2xpYi9hbnQtMS43LjAuamFyIiwKKyAgICAgICAgICAgICAgICAiXFxcXFBDMDNcXGpjbGFzc2VzXFxsaWJcXGFudC0xLjcuMC5qYXIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5peE5ldHdvcmtQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlc29sdmVUbygiZmlsZTovL2NsdXN0ZXIvaG9tZS9hbnQvbGliIiwKKyAgICAgICAgICAgICAgICAiLy9jbHVzdGVyL2hvbWUvYW50L2xpYiIsCisgICAgICAgICAgICAgICAgIlxcXFxjbHVzdGVyXFxob21lXFxhbnRcXGxpYiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVbml4UGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXNvbHZlVG8oImZpbGU6L2hvbWUvYW50L2xpYiIsICIvaG9tZS9hbnQvbGliIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNwYWNlZFVSSSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXNvbHZlVG8oImZpbGU6QzpcXFByb2dyYW0gRmlsZXNcXEFudFxcbGliIiwKKyAgICAgICAgICAgICAgICAiQzpcXFByb2dyYW0gRmlsZXNcXEFudFxcbGliIiwKKyAgICAgICAgICAgICAgICAiQzpcXFByb2dyYW0gRmlsZXNcXEFudFxcbGliIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVnIDQyMjc1OyBBbnQgZmFpbGluZyB0byBydW4gb2ZmIGEgcmVtb3RlIHNoYXJlCisgICAgICogQHRocm93cyBUaHJvd2FibGUgaWYgZGVzaXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBbnRPblJlbW90ZVNoYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFN0cmluZyByZXNvbHZlZD1Mb2NhdG9yLmZyb21KYXJVUkkoU0hBUkVEX0pBUl9VUkkpOworICAgICAgICBhc3NlcnRSZXNvbHZlZChTSEFSRURfSkFSX1VSSSwgTEFVTkNIRVJfSkFSLHJlc29sdmVkLHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1ZyA0MjI3NTsgQW50IGZhaWxpbmcgdG8gcnVuIG9mZiBhIHJlbW90ZSBzaGFyZQorICAgICAqCisgICAgICogQHRocm93cyBUaHJvd2FibGUgaWYgZGVzaXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlRnJvbVJlbW90ZVNoYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFN0cmluZyByZXNvbHZlZCA9IExvY2F0b3IuZnJvbUphclVSSShTSEFSRURfSkFSX1VSSSk7CisgICAgICAgIGFzc2VydFJlc29sdmVkKFNIQVJFRF9KQVJfVVJJLCBMQVVOQ0hFUl9KQVIsIHJlc29sdmVkLCB0cnVlKTsKKyAgICAgICAgRmlsZSBmPW5ldyBGaWxlKHJlc29sdmVkKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBmLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBhc3NlcnRUcnVlKHBhdGguaW5kZXhPZigiXFxcXCIpPT0wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cFVSSSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly9hbnQuYXBhY2hlLm9yZyI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMb2NhdG9yLmZyb21VUkkodXJsKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UsIG1lc3NhZ2UuaW5kZXhPZihMb2NhdG9yLkVSUk9SX05PVF9GSUxFX1VSSSkgPj0gMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UsIG1lc3NhZ2UuaW5kZXhPZih1cmwpID49IDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludGVybmF0aW9uYWxVUkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGFzc2VydFJlc29sdmVzKCJMXHUwMGY2d2VuYnJhdS5hdXMuTVx1MDBmY25jaGVuIik7CisgICAgICAgIGNoYXIgdW1sYXV0ZWQgPSByZXN1bHQuY2hhckF0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImV4cGVjdGVkIDB4ZjYgKFx1MDBmNiksIGJ1dCBnb3QgIiArIEludGVnZXIudG9IZXhTdHJpbmcodW1sYXV0ZWQpICsgIiAnIgorICAgICAgICAgICAgICAgICsgdW1sYXV0ZWQgKyAiJyIsIDB4ZjYsIHVtbGF1dGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2RkTG93QXNjaWlVUkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0UmVzb2x2ZXMoImhhc2gjIGFuZCBwZXJjZW50JSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Fic3RyYWN0Q3ZzVGFza1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEN2c1Rhc2tUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlM2Y2MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEN2c1Rhc2tUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RDdnNUYXNrVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIEFic3RyYWN0Q3ZzVGFza1Rlc3QoKSB7CisgICAgICAgIHRoaXMoICJBYnN0cmFjdEN2c1Rhc2tUZXN0IiApOworICAgIH0KKworICAgIHB1YmxpYyBBYnN0cmFjdEN2c1Rhc2tUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hYnN0cmFjdGN2c3Rhc2sueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RDdnNUYXNrKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCAiYWxsIiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlQXR0cmlidXRlKCkgeworICAgICAgICBGaWxlIGYgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInRtcGRpci9hbnQvYnVpbGQueG1sIik7CisgICAgICAgIGFzc2VydFRydWUoInN0YXJ0aW5nIGVtcHR5IiwgIWYuZXhpc3RzKCkpOworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJwYWNrYWdlLWF0dHJpYnV0ZSIsICJVIGFudC9idWlsZC54bWwiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibm93IGl0IGlzIHRoZXJlIiwgZi5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRhZ0F0dHJpYnV0ZSgpIHsKKyAgICAgICAgRmlsZSBmID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJ0bXBkaXIvYW50L2J1aWxkLnhtbCIpOworICAgICAgICBhc3NlcnRUcnVlKCJzdGFydGluZyBlbXB0eSIsICFmLmV4aXN0cygpKTsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygidGFnLWF0dHJpYnV0ZSIsICJBTlRfMTQxIChyZXZpc2lvbjogMS4xNzUuMi4xMykiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibm93IGl0IGlzIHRoZXJlIiwgZi5leGlzdHMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudExpa2VUYXNrc0F0VG9wTGV2ZWxUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50TGlrZVRhc2tzQXRUb3BMZXZlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGMxMzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudExpa2VUYXNrc0F0VG9wTGV2ZWxUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgQW50TGlrZVRhc2tzQXRUb3BMZXZlbFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgQW50TGlrZVRhc2tzQXRUb3BMZXZlbFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFudCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsYW50LnhtbCIpOworICAgICAgICAgICAgZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImFudCB0YXNrIGF0IHRoZSB0b3AgbGV2ZWwgbXVzdCBub3QgaW52b2tlIGl0cyBvd24iCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1aWxkIGZpbGUuIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN1YmFudCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsc3ViYW50LnhtbCIpOworICAgICAgICAgICAgZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInN1YmFudCB0YXNrIGF0IHRoZSB0b3AgbGV2ZWwgbXVzdCBub3QgaW52b2tlIGl0cyBvd24iCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1aWxkIGZpbGUuIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFudGNhbGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbGFudGNhbGwueG1sIik7CisgICAgICAgICAgICBmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYW50Y2FsbCBtdXN0IG5vdCBiZSB1c2VkIGF0IHRoZSB0b3AgbGV2ZWwuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30vLyBBbnRMaWtlVGFza3NBdFRvcExldmVsVGVzdApkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFN0cnVjdHVyZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRTdHJ1Y3R1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwOWM5NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRTdHJ1Y3R1cmVUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIEFudFN0cnVjdHVyZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBBbnRTdHJ1Y3R1cmVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnRzdHJ1Y3R1cmUueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlYXJEb3duIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVByaW50ZXIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDdXN0b21QcmludGVyIik7CisgICAgICAgIC8vIGNhbid0IGFjY2VzcyB0aGUgYm9vbGVhbnMgaW4gTXlQcmludGVyIGhlcmUgKGV2ZW4gaWYgdGhleQorICAgICAgICAvLyB3ZXJlIHN0YXRpYykgc2luY2UgdGhlIE15UHJpbnRlciBpbnN0YW5jZSB0aGF0IHdhcyB1c2VkIGluCisgICAgICAgIC8vIHRoZSB0ZXN0IGhhcyBsaWtlbHkgYmVlbiBsb2FkZWQgdmlhIGEgZGlmZmVyZW50IGNsYXNzbG9hZGVyCisgICAgICAgIC8vIHRoYW4gdGhpcyBjbGFzcy4gIFRoZXJlZm9yZSB3ZSBtYWtlIHRoZSBwcmludGVyIGFzc2VydCBpdHMKKyAgICAgICAgLy8gc3RhdGUgYW5kIG9ubHkgY2hlY2sgZm9yIHRoZSB0YWlsIGludm9jYXRpb24uCisgICAgICAgIGFzc2VydExvZ0NvbnRhaW5pbmcoTXlQcmludGVyLlRBSUxfQ0FMTEVEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UHJpbnRlciBpbXBsZW1lbnRzIEFudFN0cnVjdHVyZS5TdHJ1Y3R1cmVQcmludGVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBSUxfQ0FMTEVEID0gInRhaWwgaGFzIGJlZW4gY2FsbGVkIjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhlYWRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRhcmdldENhbGxlZCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdGFpbENhbGxlZCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGludCBlbGVtZW50Q2FsbGVkID0gMDsKKyAgICAgICAgcHJpdmF0ZSBQcm9qZWN0IHA7CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJpbnRIZWFkKFByaW50V3JpdGVyIG91dCwgUHJvamVjdCBwLCBIYXNodGFibGUgdGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgdHlwZXMpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCFoZWFkQ2FsbGVkKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCF0YXJnZXRDYWxsZWQpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIXRhaWxDYWxsZWQpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBlbGVtZW50Q2FsbGVkKTsKKyAgICAgICAgICAgIGhlYWRDYWxsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50VGFyZ2V0RGVjbChQcmludFdyaXRlciBvdXQpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGhlYWRDYWxsZWQpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIXRhcmdldENhbGxlZCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSghdGFpbENhbGxlZCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGVsZW1lbnRDYWxsZWQpOworICAgICAgICAgICAgdGFyZ2V0Q2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBwcmludEVsZW1lbnREZWNsKFByaW50V3JpdGVyIG91dCwgUHJvamVjdCBwLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBlbGVtZW50KSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShoZWFkQ2FsbGVkKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRhcmdldENhbGxlZCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSghdGFpbENhbGxlZCk7CisgICAgICAgICAgICBlbGVtZW50Q2FsbGVkKys7CisgICAgICAgICAgICB0aGlzLnAgPSBwOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50VGFpbChQcmludFdyaXRlciBvdXQpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGhlYWRDYWxsZWQpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGFyZ2V0Q2FsbGVkKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCF0YWlsQ2FsbGVkKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGVsZW1lbnRDYWxsZWQgPiAwKTsKKyAgICAgICAgICAgIHRhaWxDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgcC5sb2coVEFJTF9DQUxMRUQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhNTViNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRUZXN0LmphdmEKQEAgLTAsMCArMSw1MTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5Qcm9wZXJ0eUZpbGVJbnB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgQW50VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50LnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZWN1cnNpdmUgY2FsbCIpOworICAgIH0KKworICAgIC8vIHRhcmdldCBtdXN0IGJlIHNwZWNpZmllZAorICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIC8vIFNob3VsZCBmYWlsIHNpbmNlIGEgcmVjdXJzaW9uIHdpbGwgb2NjdXIuLi4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlY3Vyc2l2ZSBjYWxsIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NCIsICJ0YXJnZXQgYXR0cmlidXRlIG11c3Qgbm90IGJlIGVtcHR5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDRiKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDRiIiwgInRhcmdldCBkb2Vzbid0IGV4aXN0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0QmFzZWRpcjEoKSB7CisgICAgICAgIEZpbGUgZGlyMSA9IGdldFByb2plY3REaXIoKTsKKyAgICAgICAgRmlsZSBkaXIyID0gcHJvamVjdC5yZXNvbHZlRmlsZSgiLi4iKTsKKyAgICAgICAgdGVzdEJhc2VEaXJzKCJleHBsaWNpdEJhc2VkaXIxIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ZGlyMS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyMi5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0QmFzZWRpcjIoKSB7CisgICAgICAgIEZpbGUgZGlyMSA9IGdldFByb2plY3REaXIoKTsKKyAgICAgICAgRmlsZSBkaXIyID0gcHJvamVjdC5yZXNvbHZlRmlsZSgiLi4iKTsKKyAgICAgICAgdGVzdEJhc2VEaXJzKCJleHBsaWNpdEJhc2VkaXIyIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ZGlyMS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyMi5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluaGVyaXRCYXNlZGlyKCkgeworICAgICAgICBTdHJpbmcgYmFzZWRpciA9IGdldFByb2plY3REaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgdGVzdEJhc2VEaXJzKCJpbmhlcml0QmFzZWRpciIsIG5ldyBTdHJpbmdbXSB7YmFzZWRpciwgYmFzZWRpcn0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb05vdEluaGVyaXRCYXNlZGlyKCkgeworICAgICAgICBGaWxlIGRpcjEgPSBnZXRQcm9qZWN0RGlyKCk7CisgICAgICAgIEZpbGUgZGlyMiA9IHByb2plY3QucmVzb2x2ZUZpbGUoImFudCIpOworICAgICAgICBTdHJpbmcgYmFzZWRpciA9IGdldFByb2plY3REaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgdGVzdEJhc2VEaXJzKCJkb05vdEluaGVyaXRCYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ZGlyMS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyMi5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhc2VkaXJUcmlwbGVDYWxsKCkgeworICAgICAgICBGaWxlIGRpcjEgPSBnZXRQcm9qZWN0RGlyKCk7CisgICAgICAgIEZpbGUgZGlyMiA9IHByb2plY3QucmVzb2x2ZUZpbGUoImFudCIpOworICAgICAgICB0ZXN0QmFzZURpcnMoInRyaXBsZUNhbGwiLAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtkaXIxLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIyLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIxLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0QmFzZURpcnMoU3RyaW5nIHRhcmdldCwgU3RyaW5nW10gZGlycykgeworICAgICAgICBCYXNlZGlyQ2hlY2tlciBiYyA9IG5ldyBCYXNlZGlyQ2hlY2tlcihkaXJzKTsKKyAgICAgICAgcHJvamVjdC5hZGRCdWlsZExpc3RlbmVyKGJjKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBhZSA9IGJjLmdldEVycm9yKCk7CisgICAgICAgIGlmIChhZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBhZTsKKyAgICAgICAgfQorICAgICAgICBwcm9qZWN0LnJlbW92ZUJ1aWxkTGlzdGVuZXIoYmMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZlcmVuY2VJbmhlcml0YW5jZSgpIHsKKyAgICAgICAgUGF0aCBwID0gUGF0aC5zeXN0ZW1DbGFzc3BhdGg7CisgICAgICAgIHAuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoInBhdGgiLCBwKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoIm5vLW92ZXJyaWRlIiwgcCk7CisgICAgICAgIHRlc3RSZWZlcmVuY2UoInRlc3RJbmhlcml0IiwgbmV3IFN0cmluZ1tdIHsicGF0aCIsICJwYXRoIn0sCisgICAgICAgICAgICAgICAgICAgICAgbmV3IGJvb2xlYW5bXSB7dHJ1ZSwgdHJ1ZX0sIHApOworICAgICAgICB0ZXN0UmVmZXJlbmNlKCJ0ZXN0SW5oZXJpdCIsCisgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsibm8tb3ZlcnJpZGUiLCAibm8tb3ZlcnJpZGUifSwKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZX0sIHApOworICAgICAgICB0ZXN0UmVmZXJlbmNlKCJ0ZXN0SW5oZXJpdCIsCisgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsibm8tb3ZlcnJpZGUiLCAibm8tb3ZlcnJpZGUifSwKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgYm9vbGVhbltdIHtmYWxzZSwgZmFsc2V9LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmZXJlbmNlTm9Jbmhlcml0YW5jZSgpIHsKKyAgICAgICAgUGF0aCBwID0gUGF0aC5zeXN0ZW1DbGFzc3BhdGg7CisgICAgICAgIHAuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoInBhdGgiLCBwKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoIm5vLW92ZXJyaWRlIiwgcCk7CisgICAgICAgIHRlc3RSZWZlcmVuY2UoInRlc3ROb0luaGVyaXQiLCBuZXcgU3RyaW5nW10geyJwYXRoIiwgInBhdGgifSwKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZX0sIHApOworICAgICAgICB0ZXN0UmVmZXJlbmNlKCJ0ZXN0Tm9Jbmhlcml0IiwgbmV3IFN0cmluZ1tdIHsicGF0aCIsICJwYXRoIn0sCisgICAgICAgICAgICAgICAgICAgICAgbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIHRydWV9LCBudWxsKTsKKyAgICAgICAgdGVzdFJlZmVyZW5jZSgidGVzdEluaGVyaXQiLAorICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Im5vLW92ZXJyaWRlIiwgIm5vLW92ZXJyaWRlIn0sCisgICAgICAgICAgICAgICAgICAgICAgbmV3IGJvb2xlYW5bXSB7dHJ1ZSwgZmFsc2V9LCBwKTsKKyAgICAgICAgdGVzdFJlZmVyZW5jZSgidGVzdEluaGVyaXQiLAorICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Im5vLW92ZXJyaWRlIiwgIm5vLW92ZXJyaWRlIn0sCisgICAgICAgICAgICAgICAgICAgICAgbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIGZhbHNlfSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jZVJlbmFtZSgpIHsKKyAgICAgICAgUGF0aCBwID0gUGF0aC5zeXN0ZW1DbGFzc3BhdGg7CisgICAgICAgIHAuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoInBhdGgiLCBwKTsKKyAgICAgICAgdGVzdFJlZmVyZW5jZSgidGVzdFJlbmFtZSIsIG5ldyBTdHJpbmdbXSB7InBhdGgiLCAicGF0aCJ9LAorICAgICAgICAgICAgICAgICAgICAgIG5ldyBib29sZWFuW10ge3RydWUsIGZhbHNlfSwgcCk7CisgICAgICAgIHRlc3RSZWZlcmVuY2UoInRlc3RSZW5hbWUiLCBuZXcgU3RyaW5nW10geyJwYXRoIiwgInBhdGgifSwKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgYm9vbGVhbltdIHtmYWxzZSwgdHJ1ZX0sIG51bGwpOworICAgICAgICB0ZXN0UmVmZXJlbmNlKCJ0ZXN0UmVuYW1lIiwgbmV3IFN0cmluZ1tdIHsibmV3cGF0aCIsICJuZXdwYXRoIn0sCisgICAgICAgICAgICAgICAgICAgICAgbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIHRydWV9LCBwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdFBhdGgoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RJbmhlcml0UGF0aCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlc3RSZWZlcmVuY2UoU3RyaW5nIHRhcmdldCwgU3RyaW5nW10ga2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5bXSBleHBlY3QsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBSZWZlcmVuY2VDaGVja2VyIHJjID0gbmV3IFJlZmVyZW5jZUNoZWNrZXIoa2V5cywgZXhwZWN0LCB2YWx1ZSk7CisgICAgICAgIHByb2plY3QuYWRkQnVpbGRMaXN0ZW5lcihyYyk7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgYWUgPSByYy5nZXRFcnJvcigpOworICAgICAgICBpZiAoYWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgYWU7CisgICAgICAgIH0KKyAgICAgICAgcHJvamVjdC5yZW1vdmVCdWlsZExpc3RlbmVyKHJjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nZmlsZVBsYWNlbWVudCgpIHsKKyAgICAgICAgRmlsZVtdIGxvZ0ZpbGVzID0gbmV3IEZpbGVbXSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInRlc3QxLmxvZyIpLAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJ0ZXN0Mi5sb2ciKSwKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiYW50L3Rlc3QzLmxvZyIpLAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJhbnQvdGVzdDQubG9nIikKKyAgICAgICAgfTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxvZ0ZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvZ0ZpbGVzW2ldLmdldE5hbWUoKSsiIGRvZXNuXCd0IGV4aXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIWxvZ0ZpbGVzW2ldLmV4aXN0cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RMb2dmaWxlUGxhY2VtZW50Iik7CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxvZ0ZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxvZ0ZpbGVzW2ldLmdldE5hbWUoKSsiIGV4aXN0cyIsCisgICAgICAgICAgICAgICAgICAgICAgIGxvZ0ZpbGVzW2ldLmV4aXN0cygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dEhhbmRsZXJJbmhlcml0YW5jZSgpIHsKKyAgICAgICAgSW5wdXRIYW5kbGVyIGloID0gbmV3IFByb3BlcnR5RmlsZUlucHV0SGFuZGxlcigpOworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0SW5wdXRIYW5kbGVyKGloKTsKKyAgICAgICAgSW5wdXRIYW5kbGVyQ2hlY2tlciBpYyA9IG5ldyBJbnB1dEhhbmRsZXJDaGVja2VyKGloKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmFkZEJ1aWxkTGlzdGVuZXIoaWMpOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0cmlwbGVDYWxsIik7CisgICAgICAgIEFzc2VydGlvbkZhaWxlZEVycm9yIGFlID0gaWMuZ2V0RXJyb3IoKTsKKyAgICAgICAgaWYgKGFlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGFlOworICAgICAgICB9CisgICAgICAgIGdldFByb2plY3QoKS5yZW1vdmVCdWlsZExpc3RlbmVyKGljKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmSWQoKSB7CisgICAgICAgIFBhdGggdGVzdFBhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgdGVzdFBhdGguY3JlYXRlUGF0aCgpLnNldFBhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7CisgICAgICAgIFByb3BlcnR5Q2hlY2tlciBwYyA9CisgICAgICAgICAgICBuZXcgUHJvcGVydHlDaGVja2VyKCJ0ZXN0cHJvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGF0aC50b1N0cmluZygpfSk7CisgICAgICAgIHByb2plY3QuYWRkQnVpbGRMaXN0ZW5lcihwYyk7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RSZWZpZCIpOworICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBhZSA9IHBjLmdldEVycm9yKCk7CisgICAgICAgIGlmIChhZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBhZTsKKyAgICAgICAgfQorICAgICAgICBwcm9qZWN0LnJlbW92ZUJ1aWxkTGlzdGVuZXIocGMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VyUHJvcGVydHlXaW5zSW5oZXJpdEFsbCgpIHsKKyAgICAgICAgZ2V0UHJvamVjdCgpLnNldFVzZXJQcm9wZXJ0eSgidGVzdCIsICI3Iik7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3QtcHJvcGVydHktb3ZlcnJpZGUtaW5oZXJpdGFsbC1zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB2YWx1ZSBvZiB0ZXN0IGlzIDciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlclByb3BlcnR5V2luc05vSW5oZXJpdEFsbCgpIHsKKyAgICAgICAgZ2V0UHJvamVjdCgpLnNldFVzZXJQcm9wZXJ0eSgidGVzdCIsICI3Iik7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3QtcHJvcGVydHktb3ZlcnJpZGUtbm8taW5oZXJpdGFsbC1zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB2YWx1ZSBvZiB0ZXN0IGlzIDciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVXaW5zSW5oZXJpdEFsbCgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygidGVzdC1wcm9wZXJ0eS1vdmVycmlkZS1pbmhlcml0YWxsLXN0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHZhbHVlIG9mIHRlc3QgaXMgNCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZVdpbnNOb0luaGVyaXRBbGwoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3QtcHJvcGVydHktb3ZlcnJpZGUtbm8taW5oZXJpdGFsbC1zdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB2YWx1ZSBvZiB0ZXN0IGlzIDQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlTZXQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QtcHJvcGVydHlzZXQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRMb2coKS5pbmRleE9mKCJ0ZXN0MSBpcyAke3Rlc3QxfSIpID4gLTEpOworICAgICAgICBhc3NlcnRUcnVlKGdldExvZygpLmluZGV4T2YoInRlc3QyIGlzICR7dGVzdDJ9IikgPiAtMSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0TG9nKCkuaW5kZXhPZigidGVzdDEueCBpcyAxIikgPiAtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluZmluaXRlTG9vcFZpYURlcGVuZHMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJpbmZpbml0ZS1sb29wLXZpYS1kZXBlbmRzIiwgInJlY3Vyc2l2ZSBjYWxsIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpU2FtZVByb3BlcnR5KCkgeworICAgICAgICBleHBlY3RMb2coIm11bHRpLXNhbWUtcHJvcGVydHkiLCAicHJvcCBpcyB0d28iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wTGV2ZWxUYXJnZXQoKSB7CisgICAgICAgIGV4cGVjdExvZygidG9wbGV2ZWx0YXJnZXQiLCAiSGVsbG8gd29ybGQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVQcm9wZXJ0eUZpbGVDaGlsZHJlbigpIHsKKyAgICAgICAgUHJvcGVydHlDaGVja2VyIHBjQmFyID0gbmV3IFByb3BlcnR5Q2hlY2tlcigiYmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge251bGwsICJCYXIifSk7CisgICAgICAgIFByb3BlcnR5Q2hlY2tlciBwY0ZvbyA9IG5ldyBQcm9wZXJ0eUNoZWNrZXIoImZvbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtudWxsLCAiRm9vIn0pOworICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIocGNCYXIpOworICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIocGNGb28pOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJtdWx0aXBsZS1wcm9wZXJ0eS1maWxlLWNoaWxkcmVuIik7CisgICAgICAgIEFzc2VydGlvbkZhaWxlZEVycm9yIGFlQmFyID0gcGNCYXIuZ2V0RXJyb3IoKTsKKyAgICAgICAgaWYgKGFlQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGFlQmFyOworICAgICAgICB9CisgICAgICAgIEFzc2VydGlvbkZhaWxlZEVycm9yIGFlRm9vID0gcGNGb28uZ2V0RXJyb3IoKTsKKyAgICAgICAgaWYgKGFlRm9vICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGFlRm9vOworICAgICAgICB9CisgICAgICAgIHByb2plY3QucmVtb3ZlQnVpbGRMaXN0ZW5lcihwY0Jhcik7CisgICAgICAgIHByb2plY3QucmVtb3ZlQnVpbGRMaXN0ZW5lcihwY0Zvbyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJsYW5rVGFyZ2V0KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigiYmxhbmstdGFyZ2V0IiwgInRhcmdldCBuYW1lIG11c3Qgbm90IGJlIGVtcHR5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVGFyZ2V0cygpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJtdWx0aXBsZS10YXJnZXRzIiwgInRhZGFkY3RiZGJ0YyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVRhcmdldHMyKCkgeworICAgICAgICBleHBlY3RMb2coIm11bHRpcGxlLXRhcmdldHMtMiIsICJkYWRjdGIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEJhc2VkaXJDaGVja2VyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gZXhwZWN0ZWRCYXNlZGlyczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY2FsbHMgPSAwOworICAgICAgICBwcml2YXRlIEFzc2VydGlvbkZhaWxlZEVycm9yIGVycm9yOworCisgICAgICAgIEJhc2VkaXJDaGVja2VyKFN0cmluZ1tdIGRpcnMpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkQmFzZWRpcnMgPSBkaXJzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCl7fQorICAgICAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorICAgICAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRCYXNlZGlyc1tjYWxscysrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydGlvbkZhaWxlZEVycm9yIGdldEVycm9yKCkgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJlZmVyZW5jZUNoZWNrZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBrZXlzOworICAgICAgICBwcml2YXRlIGJvb2xlYW5bXSBleHBlY3RTYW1lOworICAgICAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY2FsbHMgPSAwOworICAgICAgICBwcml2YXRlIEFzc2VydGlvbkZhaWxlZEVycm9yIGVycm9yOworCisgICAgICAgIFJlZmVyZW5jZUNoZWNrZXIoU3RyaW5nW10ga2V5cywgYm9vbGVhbltdIGV4cGVjdFNhbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5rZXlzID0ga2V5czsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0U2FtZSA9IGV4cGVjdFNhbWU7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICAgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KXt9CisgICAgICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPQorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGwgIiArIGNhbGxzICsgIiByZWZpZD1cJyIgKyBrZXlzW2NhbGxzXSArICJcJyI7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGV2ZW50LmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2Uoa2V5c1tjYWxsc10pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdFNhbWVbY2FsbHMrK10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKG1zZywgbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXNnLCBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmF0aGVyIGNvbnZvbHV0ZWQgZXF1YWxzKCkgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCBleHBlY3QgPSAoUGF0aCkgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXRoIHJlY2VpdmVkID0gKFBhdGgpIGV2ZW50LmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2Uoa2V5c1tjYWxsc10pOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRCZUVxdWFsID0gZXhwZWN0U2FtZVtjYWxscysrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtc2csICFzaG91bGRCZUVxdWFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbDEgPSBleHBlY3QubGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGwyID0gcmVjZWl2ZWQubGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsMS5sZW5ndGggPT0gbDIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsMS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsMVtpXS5lcXVhbHMobDJbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtc2csICFzaG91bGRCZUVxdWFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1zZywgc2hvdWxkQmVFcXVhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtc2csICFzaG91bGRCZUVxdWFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBnZXRFcnJvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBJbnB1dEhhbmRsZXJDaGVja2VyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgSW5wdXRIYW5kbGVyIGloOworICAgICAgICBwcml2YXRlIEFzc2VydGlvbkZhaWxlZEVycm9yIGVycm9yOworCisgICAgICAgIElucHV0SGFuZGxlckNoZWNrZXIoSW5wdXRIYW5kbGVyIHZhbHVlKSB7CisgICAgICAgICAgICBpaCA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGNoZWNrKGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGNoZWNrKGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBjaGVjayhldmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgY2hlY2soZXZlbnQpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBjaGVjayhldmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBjaGVjayhldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGNoZWNrKGV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVjayhCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQuZ2V0UHJvamVjdCgpLmdldElucHV0SGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShpaCwgZXZlbnQuZ2V0UHJvamVjdCgpLmdldElucHV0SGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBnZXRFcnJvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0eUNoZWNrZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBleHBlY3RlZFZhbHVlczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcga2V5OworICAgICAgICBwcml2YXRlIGludCBjYWxscyA9IDA7CisgICAgICAgIHByaXZhdGUgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZXJyb3I7CisKKyAgICAgICAgUHJvcGVydHlDaGVja2VyKFN0cmluZyBrZXksIFN0cmluZ1tdIHZhbHVlcykgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLmV4cGVjdGVkVmFsdWVzID0gdmFsdWVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCl7fQorICAgICAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorICAgICAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbGxzID49IGV4cGVjdGVkVmFsdWVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJVbmV4cGVjdGVkIGludm9jYXRpb24gb2YiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRhcmdldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlc1tjYWxscysrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShrZXkpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBnZXRFcnJvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRsaWJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50bGliVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOWRiNWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50bGliVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIEFudGxpYlRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgQW50bGliVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50bGliLnhtbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIG9ubHkgZG8gdGhlIGFudGxpYiB0ZXN0cyBpZiB3ZSBhcmUgaW4gdGhlIHNhbWUgSlZNIGFzIGFudC4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU2hhcmVkSlZNKCkgeworICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiKTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5IT1udWxsICYmIFByb2plY3QudG9Cb29sZWFuKHByb3BlcnR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW50bGliRmlsZSgpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJhbnRsaWIuZmlsZSIsICJNeVRhc2sgY2FsbGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlybXMgdGhhdCBhbGwgbWF0Y2hpbmcgcmVzb3VyY2VzIHdpbGwgYmUgdXNlZCwgc28gdGhhdCB5b3UKKyAgICAgKiBjYW4gY29sbGVjdCBzZXZlcmFsIGFudGxpYnMgaW4gb25lIERlZmluZXIgY2FsbC4KKyAgICAgKiBAc2VlICJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI0MDI0IgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBbnRsaWJSZXNvdXJjZSgpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJhbnRsaWIucmVzb3VyY2UiLCAiTXlUYXNrIGNhbGxlZC1hbmQtdGhlbi1NeVRhc2syIGNhbGxlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROc0N1cnJlbnQoKSB7CisgICAgICAgIGV4cGVjdExvZygibnMuY3VycmVudCIsICJFY2hvMiBpbnNpZGUgYSBtYWNyb0hlbGxvIGZyb20geDpwIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW50bGliX3VyaSgpIHsKKyAgICAgICAgaWYgKGlzU2hhcmVkSlZNKCkpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoImFudGxpYl91cmkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbnRsaWJfdXJpX2F1dG8oKSB7CisgICAgICAgIGlmIChpc1NoYXJlZEpWTSgpKSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJhbnRsaWJfdXJpX2F1dG8iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbnRsaWJfdXJpX2F1dG8yKCkgeworICAgICAgICBpZiAoaXNTaGFyZWRKVk0oKSkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgiYW50bGliX3VyaV9hdXRvMiIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUYXNrIGV4dGVuZHMgVGFzayB7CisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgICAgICBsb2coIk15VGFzayBjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUYXNrMiBleHRlbmRzIFRhc2sgeworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICAgICAgbG9nKCJNeVRhc2syIGNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BcHRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXB0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTY1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXB0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIEFwdFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgQXB0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYXB0LnhtbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFwdCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEFwdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHRGb3JrKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0QXB0Rm9yayIpOworICAgIH0KKyAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXB0Rm9ya0ZhbHNlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0QXB0Rm9ya0ZhbHNlIik7CisgICAgICAgIGFzc2VydExvZ0NvbnRhaW5pbmcoQXB0LldBUk5JTkdfSUdOT1JJTkdfRk9SSyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RBbm5vdGF0aW9uVHlwZXMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RMaXN0QW5ub3RhdGlvblR5cGVzIik7CisgICAgICAgIGFzc2VydExvZ0NvbnRhaW5pbmcoIlNldCBvZiBhbm5vdGF0aW9ucyBmb3VuZDoiKTsKKyAgICAgICAgYXNzZXJ0TG9nQ29udGFpbmluZygiRGlzdHJpYnV0ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXB0TmV3RmFjdG9yeSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEFwdE5ld0ZhY3RvcnkiKTsKKyAgICAgICAgYXNzZXJ0UHJvY2Vzc2VkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFwdE5ld0ZhY3RvcnlGb3JrKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0QXB0TmV3RmFjdG9yeUZvcmsiKTsKKyAgICAgICAgYXNzZXJ0UHJvY2Vzc2VkKCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQcm9jZXNzZWQoKSB7CisgICAgICAgIGFzc2VydExvZ0NvbnRhaW5pbmcoIkRpc3RyaWJ1dGVkQW5ub3RhdGlvblByb2Nlc3Nvci1pcy1nbyIpOworICAgICAgICBhc3NlcnRMb2dDb250YWluaW5nKCJbLUFidWlsZC5kaXI9Iik7CisgICAgICAgIGFzc2VydExvZ0NvbnRhaW5pbmcoInZpc2l0aW5nIERpc3RyaWJ1dGVkQW5ub3RhdGlvbkZhY3RvcnkiKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdmFpbGFibGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXZhaWxhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjlmZjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXZhaWxhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIEpVbml0IHRlc3QgZm9yIHRoZSBBdmFpbGFibGUgdGFzay9jb25kaXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBBdmFpbGFibGVUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgQXZhaWxhYmxlVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYXZhaWxhYmxlLnhtbCIpOworICAgIH0KKworICAgIC8vIE5vdGhpbmcgc3BlY2lmaWVkIC0+IEZhaWwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICAvLyBPbmx5IHByb3BlcnR5IHNwZWNpZmllZCAtPiBGYWlsCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgLy8gT25seSBmaWxlIHNwZWNpZmllZCAtPiBGYWlsCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgLy8gZmlsZSBkb2Vzbid0IGV4aXN0IC0+IHByb3BlcnR5ICd0ZXN0JyA9PSBudWxsCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7CisgICAgICAgIGFzc2VydFRydWUocHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpID09IG51bGwpOworICAgIH0KKworICAgIC8vIGZpbGUgZG9lcyBleGlzdCAtPiBwcm9wZXJ0eSAndGVzdCcgPT0gJ3RydWUnCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7CisgICAgfQorCisgICAgLy8gcmVzb3VyY2UgZG9lc24ndCBleGlzdCAtPiBwcm9wZXJ0eSAndGVzdCcgPT0gbnVsbAorICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOworICAgICAgICBhc3NlcnRUcnVlKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSA9PSBudWxsKTsKKyAgICB9CisKKyAgICAvLyByZXNvdXJjZSBkb2VzIGV4aXN0IC0+IHByb3BlcnR5ICd0ZXN0JyA9PSAndHJ1ZScKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKKyAgICB9CisKKyAgICAvLyBjbGFzcyBkb2Vzbid0IGV4aXN0IC0+IHByb3BlcnR5ICd0ZXN0JyA9PSBudWxsCisgICAgcHVibGljIHZvaWQgdGVzdDgoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q4Iik7CisgICAgICAgIGFzc2VydFRydWUocHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpID09IG51bGwpOworICAgIH0KKworICAgIC8vIGNsYXNzIGRvZXMgZXhpc3QgLT4gcHJvcGVydHkgJ3Rlc3QnID09ICd0cnVlJworICAgIHB1YmxpYyB2b2lkIHRlc3Q5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KKworICAgIC8vIEFsbCB0aHJlZSBzcGVjaWZpZWQgYW5kIGFsbCB0aHJlZSBleGlzdCAtPiB0cnVlCisgICAgcHVibGljIHZvaWQgdGVzdDEwKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKKyAgICB9CisKKyAgICAvLyBBbGwgdGhyZWUgc3BlY2lmaWVkIGJ1dCBjbGFzcyBtaXNzaW5nIC0+IG51bGwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTEoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxMSIpOworICAgICAgICBhc3NlcnROdWxsKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7CisgICAgfQorCisgICAgLy8gU3BlY2lmaWVkIHByb3BlcnR5LW5hbWUgaXMgIiIgLT4gdHJ1ZQorICAgIHB1YmxpYyB2b2lkIHRlc3QxMigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEyIik7CisgICAgICAgIGFzc2VydE51bGwocHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgiIikpOworICAgIH0KKworICAgIC8vIFNwZWNpZmllZCBmaWxlIGlzICIiIC0+IGludmFsaWQgZmlsZXMgZG8gbm90IGV4aXN0CisgICAgcHVibGljIHZvaWQgdGVzdDEzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTMiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KKworICAgIC8vIFNwZWNpZmllZCBmaWxlIGlzICIiIGFjdHVhbGx5IGEgZGlyZWN0b3J5LCBzbyBpdCBzaG91bGQgcGFzcworICAgIHB1YmxpYyB2b2lkIHRlc3QxM2IoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxM2IiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKKyAgICB9CisKKyAgICAvLyBTcGVjaWZpZWQgcmVzb3VyY2UgaXMgIiIgLT4gY2FuIHN1Y2ggYSB0aGluZyBleGlzdD8KKyAgICAvKgorICAgICAqIHJldHVybnMgbm9uIG51bGwgSUJNIEpESyAxLjMgTGludXgKKyAgICAgKi8KKy8vICAgIHB1YmxpYyB2b2lkIHRlc3QxNCgpIHsKKy8vICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTQiKTsKKy8vICAgICAgICBhc3NlcnRFcXVhbHMocHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpLCBudWxsKTsKKy8vICAgIH0KKworICAgIC8vIFNwZWNpZmllZCBjbGFzcyBpcyAiIiAtPiBjYW4gbm90IGV4aXN0CisgICAgcHVibGljIHZvaWQgdGVzdDE1KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTUiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KKworICAgIC8vIFNwZWNpZmllZCBkaXIgaXMgIiIgLT4gdGhpcyBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHNob3VsZAorICAgIC8vIGFsd2F5cyBleGlzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QxNigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDE2Iik7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7CisgICAgfQorCisgICAgLy8gU3BlY2lmaWVkIGRpciBpcyAiLi4vdGFza2RlZnMiIC0+IHNob3VsZCBleGlzdCBzaW5jZSBpdCdzIHRoZQorICAgIC8vIGxvY2F0aW9uIG9mIHRoZSBidWlsZGZpbGUgdXNlZC4uLgorICAgIHB1YmxpYyB2b2lkIHRlc3QxNygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDE3Iik7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7CisgICAgfQorCisgICAgLy8gU3BlY2lmaWVkIGRpciBpcyAiLi4vdGhpc19kaXJfc2hvdWxkX25ldmVyX2V4aXN0IiAtPiBudWxsCisgICAgcHVibGljIHZvaWQgdGVzdDE4KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTgiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KKworICAgIC8vIEludmFsaWQgdHlwZSBzcGVjaWZpZWQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTkoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MTkiLCAiSW52YWxpZCB2YWx1ZSBmb3IgdHlwZSBhdHRyaWJ1dGUuIik7CisgICAgfQorCisgICAgLy8gQ29yZSBjbGFzcyB0aGF0IGV4aXN0cyBpbiBzeXN0ZW0gY2xhc3NwYXRoIGlzIGlnbm9yZWQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjAoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyMCIpOworICAgICAgICBhc3NlcnROdWxsKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7CisgICAgfQorCisgICAgLy8gQ29yZSBjbGFzcyB0aGF0IGV4aXN0cyBpbiBzeXN0ZW0gY2xhc3NwYXRoIGlzIGlnbm9yZWQsIGJ1dCBmb3VuZCBpbiBzcGVjaWZpZWQgY2xhc3NwYXRoCisgICAgcHVibGljIHZvaWQgdGVzdDIxKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MjEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKKyAgICB9CisKKyAgICAvLyBDb3JlIGNsYXNzIHRoYXQgZXhpc3RzIGluIHN5c3RlbSBjbGFzc3BhdGggaXMgbm90IGlnbm9yZWQgd2l0aCBpZ25vcmVzeXN0ZW1jbGFzcz0iZmFsc2UiCisgICAgcHVibGljIHZvaWQgdGVzdDIyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MjIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKKyAgICB9CisKKyAgICAvLyBDb3JlIGNsYXNzIHRoYXQgZXhpc3RzIGluIHN5c3RlbSBjbGFzc3BhdGggaXMgbm90IGlnbm9yZWQgd2l0aCBkZWZhdWx0IGlnbm9yZXN5c3RlbWNsYXNzZXMgdmFsdWUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KKworICAgIC8vIENsYXNzIGlzIGZvdW5kIGluIHNwZWNpZmllZCBjbGFzc3BhdGgKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KKworICAgIC8vIEZpbGUgaXMgbm90IGZvdW5kIGluIHNwZWNpZmllZCBmaWxlcGF0aAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWFyY2hJblBhdGhOb3RUaGVyZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgic2VhcmNoSW5QYXRoTm90VGhlcmUiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KKworICAgIC8vIEZpbGUgaXMgbm90IGZvdW5kIGluIHNwZWNpZmllZCBmaWxlcGF0aAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWFyY2hJblBhdGhJc1RoZXJlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJzZWFyY2hJblBhdGhJc1RoZXJlIik7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3QiKSk7CisgICAgfQorCisgICAgLy8gdGVzdCB3aGVuIGZpbGUgYmVnaW5zIHdpdGggYmFzZWRpciB0d2ljZQorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVCYXNlZGlyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RG91YmxlQmFzZWRpciIpOworICAgIH0KKworICAgIC8vIHRlc3QgZm9yIHNlYXJjaGluZyBwYXJlbnRzCisgICAgcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhcmVudHMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInNlYXJjaC1wYXJlbnRzIik7CisgICAgfQorICAgIC8vIHRlc3QgZm9yIG5vdCBzZWFyY2hpbmcgcGFyZW50cworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWFyY2hQYXJlbnRzTm90KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJzZWFyY2gtcGFyZW50cy1ub3QiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlVuemlwMlRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CVW56aXAyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYmY3MWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlVuemlwMlRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgQlVuemlwMlRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwdWJsaWMgQlVuemlwMlRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2J1bnppcDIueG1sIik7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInByZXBhcmUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFsVGVzdCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlYWxUZXN0KCJyZWFsVGVzdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFsVGVzdFdpdGhSZXNvdXJjZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlYWxUZXN0KCJyZWFsVGVzdFdpdGhSZXNvdXJjZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVhbFRlc3QoU3RyaW5nIHRhcmdldCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgY29udGVudCBtaXNtYXRjaCBhZnRlciBidW56aXAyIiwKKyAgICAgICAgICAgIEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhwcm9qZWN0LnJlc29sdmVGaWxlKCJleHBlY3RlZC9hc2YtbG9nby1odWdlLnRhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5yZXNvbHZlRmlsZSgiYXNmLWxvZ28taHVnZS50YXIiKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb2N1bWVudGF0aW9uQ2xhaW1zT25Db3B5KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0UmVhbFRlc3QoInRlc3REb2N1bWVudGF0aW9uQ2xhaW1zT25Db3B5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JaaXAyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JaaXAyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjdkZTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlppcDJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5iemlwMi5DQlppcDJJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqLworcHVibGljIGNsYXNzIEJaaXAyVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgLyoqIFV0aWxpdGllcyB1c2VkIGZvciBmaWxlIG9wZXJhdGlvbnMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHB1YmxpYyBCWmlwMlRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2J6aXAyLnhtbCIpOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJwcmVwYXJlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhbFRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWFsVGVzdCIpOworCisgICAgICAgIC8vIGRvZXNuJ3Qgd29yazogRGVwZW5kaW5nIG9uIHRoZSBjb21wcmVzc2lvbiBlbmdpbmUgdXNlZCwKKyAgICAgICAgLy8gY29tcHJlc3NlZCBieXRlcyBtYXkgZGlmZmVyLiBGYWxzZSBlcnJvcnMgd291bGQgYmUKKyAgICAgICAgLy8gcmVwb3J0ZWQuCisgICAgICAgIC8vIGFzc2VydFRydWUoIkZpbGUgY29udGVudCBtaXNtYXRjaCIsCisgICAgICAgIC8vIEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhwcm9qZWN0LnJlc29sdmVGaWxlKCJleHBlY3RlZC9hc2YtbG9nby1odWdlLnRhci5iejIiKSwKKyAgICAgICAgLy8gcHJvamVjdC5yZXNvbHZlRmlsZSgiYXNmLWxvZ28taHVnZS50YXIuYnoyIikpKTsKKworICAgICAgICAvLyBXZSBoYXZlIHRvIGNvbXBhcmUgdGhlIGRlY29tcHJlc3NlZCBjb250ZW50IGluc3RlYWQ6CisKKyAgICAgICAgRmlsZSBvcmlnaW5hbEZpbGUgPQorICAgICAgICAgICAgcHJvamVjdC5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvYXNmLWxvZ28taHVnZS50YXIuYnoyIik7CisgICAgICAgIEZpbGUgYWN0dWFsRmlsZSAgID0gcHJvamVjdC5yZXNvbHZlRmlsZSgiYXNmLWxvZ28taHVnZS50YXIuYnoyIik7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gb3JpZ2luYWxJbiA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKG9yaWdpbmFsRmlsZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpICdCJywgb3JpZ2luYWxJbi5yZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpICdaJywgb3JpZ2luYWxJbi5yZWFkKCkpOworCisgICAgICAgIElucHV0U3RyZWFtIGFjdHVhbEluID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oYWN0dWFsRmlsZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpICdCJywgYWN0dWFsSW4ucmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChieXRlKSAnWicsIGFjdHVhbEluLnJlYWQoKSk7CisKKyAgICAgICAgb3JpZ2luYWxJbiA9IG5ldyBDQlppcDJJbnB1dFN0cmVhbShvcmlnaW5hbEluKTsKKyAgICAgICAgYWN0dWFsSW4gICA9IG5ldyBDQlppcDJJbnB1dFN0cmVhbShhY3R1YWxJbik7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBleHBlY3RlZCA9IG9yaWdpbmFsSW4ucmVhZCgpOworICAgICAgICAgICAgaW50IGFjdHVhbCAgID0gYWN0dWFsSW4ucmVhZCgpOworICAgICAgICAgICAgaWYgKGV4cGVjdGVkID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZpbGUgY29udGVudCBtaXNtYXRjaCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZpbGUgY29udGVudCBtaXNtYXRjaCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9yaWdpbmFsSW4uY2xvc2UoKTsKKyAgICAgICAgYWN0dWFsSW4uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2UoKXsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgicmVhbFRlc3RXaXRoUmVzb3VyY2UiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZUNoZWNrKCl7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3REYXRlQ2hlY2siKTsKKyAgICAgICAgU3RyaW5nIGxvZyA9IGdldExvZygpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgIkV4cGVjdGluZyBtZXNzYWdlIGVuZGluZyB3aXRoICdhc2YtbG9nby5naWYuYnoyIGlzIHVwIHRvIGRhdGUuJyBidXQgZ290ICciICsgbG9nICsgIiciLAorICAgICAgICAgICAgbG9nLmVuZHNXaXRoKCJhc2YtbG9nby5naWYuYnoyIGlzIHVwIHRvIGRhdGUuIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Jhc2VuYW1lVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Jhc2VuYW1lVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZDEyODEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQmFzZW5hbWVUZXN0LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlbmFtZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBCYXNlbmFtZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Jhc2VuYW1lLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXR0cmlidXRlIG1pc3NpbmciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QyIiwgInJlcXVpcmVkIGF0dHJpYnV0ZSBtaXNzaW5nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhdHRyaWJ1dGUgbWlzc2luZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOworICAgICAgICBTdHJpbmcgY2hlY2twcm9wID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiZmlsZS53LnN1ZiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvby50eHQiLCBjaGVja3Byb3ApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgICAgICBTdHJpbmcgY2hlY2twcm9wID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiZmlsZS53by5zdWYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBjaGVja3Byb3ApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZURvdHMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RNdWx0aXBsZURvdHMiKTsKKyAgICAgICAgU3RyaW5nIGNoZWNrcHJvcCA9IHByb2plY3QuZ2V0UHJvcGVydHkoImZpbGUud28uc3VmIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vLmJhciIsIGNoZWNrcHJvcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vRG90cygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE5vRG90cyIpOworICAgICAgICBTdHJpbmcgY2hlY2twcm9wID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiZmlsZS53by5zdWYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28uYmFyIiwgY2hlY2twcm9wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFcXVhbHNTdWZmaXhXaXRoRG90KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0VmFsdWVFcXVhbHNTdWZmaXhXaXRoRG90Iik7CisgICAgICAgIFN0cmluZyBjaGVja3Byb3AgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJmaWxlLndvLnN1ZiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrcHJvcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlRXF1YWxzU3VmZml4V2l0aG91dERvdCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFZhbHVlRXF1YWxzU3VmZml4V2l0aG91dERvdCIpOworICAgICAgICBTdHJpbmcgY2hlY2twcm9wID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiZmlsZS53by5zdWYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja3Byb3ApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NWU1Bhc3NUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ1ZTUGFzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzg4NGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NWU1Bhc3NUZXN0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogVGVzdHMgQ1ZTTG9naW4gdGFzay4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDVlNQYXNzVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFLQVJUQV9VUkwgPQorICAgICAgICAiOnBzZXJ2ZXI6YW5vbmN2c0BqYWthcnRhLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIEF5PTA9aDxaIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1VSTCA9CisgICAgICAgICI6cHNlcnZlcjphbm9uY3ZzQHhtbC5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyBBeT0wPWg8WiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJR1JJU19VUkwgPQorICAgICAgICAiOnBzZXJ2ZXI6Z3Vlc3RAY3ZzLnRpZ3Jpcy5vcmc6L2N2cyBBSWJkWiwiOworCisKKyAgICBwdWJsaWMgQ1ZTUGFzc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2N2c3Bhc3MueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQ1ZTUm9vdCgpIHsKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKKyAgICAgICAgfWNhdGNoKEJ1aWxkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjdnNyb290IGlzIHJlcXVpcmVkIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vUGFzc3dvcmQoKSB7CisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBub3QgdGhyb3duIik7CisgICAgICAgIH1jYXRjaChCdWlsZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicGFzc3dvcmQgaXMgcmVxdWlyZWQiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXNzRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJ0ZXN0cGFzc2ZpbGUudG1wIik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSggIlBhc3NmaWxlICIrZisiIG5vdCBjcmVhdGVkIiwgZi5leGlzdHMoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpBS0FSVEFfVVJMK0VPTCwgcmVhZEZpbGUoZikpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhc3NGaWxlRHVwbGljYXRlRW50cnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCAidGVzdHBhc3NmaWxlLnRtcCIpOworCisgICAgICAgIGFzc2VydFRydWUoICJQYXNzZmlsZSAiK2YrIiBub3QgY3JlYXRlZCIsIGYuZXhpc3RzKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIEpBS0FSVEFfVVJMKyBFT0wrCisgICAgICAgICAgICBUSUdSSVNfVVJMKyBFT0wsCisgICAgICAgICAgICByZWFkRmlsZShmKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhc3NGaWxlTXVsdGlwbGVFbnRyeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJ0ZXN0cGFzc2ZpbGUudG1wIik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSggIlBhc3NmaWxlICIrZisiIG5vdCBjcmVhdGVkIiwgZi5leGlzdHMoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgSkFLQVJUQV9VUkwrIEVPTCsKKyAgICAgICAgICAgIFhNTF9VUkwrIEVPTCsKKyAgICAgICAgICAgIFRJR1JJU19VUkwrIEVPTCwKKyAgICAgICAgICAgIHJlYWRGaWxlKGYpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyByZWFkRmlsZShGaWxlIGYpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZikpOworCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgU3RyaW5nIGxpbmU9bnVsbDsKKyAgICAgICAgICAgIHdoaWxlKChsaW5lPXJlYWRlci5yZWFkTGluZSgpKSE9bnVsbCl7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChsaW5lICsgRU9MKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NhbGxUYXJnZXRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2FsbFRhcmdldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWY5MTExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NhbGxUYXJnZXRUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgQ2FsbFRhcmdldFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBDYWxsVGFyZ2V0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2FsbHRhcmdldC54bWwiKTsKKyAgICB9CisKKyAgICAvLyBzZWUgYnVncmVwIDIxNzI0IChyZWZlcmVuY2VzIG5vdCBwYXNzaW5nIHRocm91Z2ggd2l0aCBhbnRjYWxsKQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmhlcml0UmVmRmlsZVNldCgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygidGVzdGluaGVyaXRyZWZmaWxlc2V0IiwgImNhbGx0YXJnZXQueG1sIik7CisgICAgfQorCisgICAgLy8gc2VlIGJ1Z3JlcCAyMTcyNCAocmVmZXJlbmNlcyBub3QgcGFzc2luZyB0aHJvdWdoIHdpdGggYW50Y2FsbCkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdEZpbHRlcnNldCgpIHsKKyAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KCJ0ZXN0aW5oZXJpdHJlZmZpbHRlcnNldCIpOworICAgIH0KKworICAgIC8vIHNlZSBidWdyZXAgMTE0MTggKEluIHJlcGVhdGVkIGNhbGxzIHRvIHRoZSBzYW1lIHRhcmdldCwKKyAgICAvLyBwYXJhbXMgd2lsbCBub3QgYmUgcGFzc2VkIGluKQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUNhbGwoKSB7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICB2LmFkZCgiY2FsbC1tdWx0aSIpOworICAgICAgICB2LmFkZCgiY2FsbC1tdWx0aSIpOworICAgICAgICBwcm9qZWN0LmV4ZWN1dGVUYXJnZXRzKHYpOworICAgICAgICBhc3NlcnRMb2dDb250YWluaW5nKCJtdWx0aSBpcyBTRVRtdWx0aSBpcyBTRVQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmxhbmtUYXJnZXQoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJibGFuay10YXJnZXQiLCAidGFyZ2V0IG5hbWUgbXVzdCBub3QgYmUgZW1wdHkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUYXJnZXRzKCkgeworICAgICAgICBleHBlY3RMb2coIm11bHRpcGxlLXRhcmdldHMiLCAidGFkYWRjdGJkYnRjIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVGFyZ2V0czIoKSB7CisgICAgICAgIGV4cGVjdExvZygibXVsdGlwbGUtdGFyZ2V0cy0yIiwgImRhZGN0YiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBwcm9qZWN0LmV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2hlY2tzdW1UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2hlY2tzdW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2NzUyYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaGVja3N1bVRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBDaGVja3N1bVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBDaGVja3N1bVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NoZWNrc3VtLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZU1kNSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNyZWF0ZU1kNSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNRDVTVU1mb3JtYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjcmVhdGVNRDVTVU1mb3JtYXQiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVNWRmZvcm1hdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNyZWF0ZVNWRmZvcm1hdCIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUGF0dGVybigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNyZWF0ZVBhdHRlcm4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydHkoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInNldFByb3BlcnR5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeVRvdGFsKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ2ZXJpZnlUb3RhbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlUb3RhbFJDKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ2ZXJpZnlUb3RhbFJDIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUNoZWNrc3VtZGlyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ2ZXJpZnlDaGVja3N1bWRpciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlBc1Rhc2soKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInZlcmlmeUFzVGFzayIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlNRDVTVU1Bc1Rhc2soKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInZlcmlmeU1ENVNVTUFzVGFzayIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlBc0NvbmRpdGlvbigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidmVyaWZ5QXNDb25kaXRpb24iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5RnJvbVByb3BlcnR5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ2ZXJpZnlGcm9tUHJvcGVydHkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q2hlY2tzdW1kaXJOb1RvdGFsKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ2ZXJpZnlDaGVja3N1bWRpck5vVG90YWwiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25jYXRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uY2F0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjkxNzMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uY2F0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCisvKioKKyAqIEEgdGVzdCBjbGFzcyBmb3IgdGhlICdjb25jYXQnIHRhc2ssIHVzZWQgdG8gY29uY2F0ZW5hdGUgYSBzZXJpZXMgb2YKKyAqIGZpbGVzIGludG8gYSBzaW5nbGUgc3RyZWFtLgorICoKKyAqLworcHVibGljIGNsYXNzIENvbmNhdFRlc3QKKyAgICBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZW1wRmlsZSA9ICJjb25jYXQudG1wIjsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVtcEZpbGUyID0gImNvbmNhdC50bXAuMiI7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgLyoqCisgICAgICogUmVxdWlyZWQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIENvbmNhdFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBzZXQgdXAsIGNhbGxlZCBieSB0aGUgdW5pdCB0ZXN0IGZyYW1ld29yayBwcmlvciB0byBlYWNoCisgICAgICogdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uY2F0LnhtbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGVhciBkb3duLCBjYWxsZWQgYnkgdGhlIHVuaXQgdGVzdCBmcmFtZXdvcmsgcHJpb3IgdG8gZWFjaAorICAgICAqIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHBlY3QgYW4gZXhjZXB0aW9uIHdoZW4gaW5zdWZmaWNpZW50IGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAiSW5zdWZmaWNpZW50IGluZm9ybWF0aW9uLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGVjdCBhbiBleGNlcHRpb24gd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBpcyBpbnZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAiSW52YWxpZCBkZXN0aW5hdGlvbiBmaWxlLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhdHMgdGhlIHN0cmluZyAnSGVsbG8sIFdvcmxkIScgdG8gYSB0ZW1wb3JhcnkgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIHRlbXBGaWxlKTsKKyAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworCisgICAgICAgIGFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2F0cyB0aGUgZmlsZSBjcmVhdGVkIGluIHRlc3QzIHRocmVlIHRpbWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgICAgICB0ZXN0MygpOworCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgdGVtcEZpbGUpOworICAgICAgICBmaW5hbCBsb25nIG9yaWdTaXplID0gZmlsZS5sZW5ndGgoKTsKKworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOworCisgICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIHRlbXBGaWxlMik7CisgICAgICAgIGZpbmFsIGxvbmcgbmV3U2l6ZSA9IGZpbGUyLmxlbmd0aCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnU2l6ZSAqIDMsIG5ld1NpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhdHMgdGhlIHN0cmluZyAnSGVsbG8sIFdvcmxkIScgdG8gdGhlIGNvbnNvbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CisgICAgICAgIGV4cGVjdExvZygidGVzdDUiLCAiSGVsbG8sIFdvcmxkISIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeworICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGhpc2ZpbGVkb2Vzbm90ZXhpc3QiCisgICAgICAgICAgICAucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3Q2IiwgZmlsZW5hbWUgKyIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbmNhdE5vTmV3bGluZSgpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0Q29uY2F0Tm9OZXdsaW5lIiwgImFiIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbmNhdE5vTmV3bGluZUVuY29kaW5nKCkgeworICAgICAgICBleHBlY3RMb2coInRlc3RDb25jYXROb05ld2xpbmVFbmNvZGluZyIsICJhYiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoKCkgeworICAgICAgICB0ZXN0MygpOworCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgdGVtcEZpbGUpOworICAgICAgICBmaW5hbCBsb25nIG9yaWdTaXplID0gZmlsZS5sZW5ndGgoKTsKKworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UGF0aCIpOworCisgICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIHRlbXBGaWxlMik7CisgICAgICAgIGZpbmFsIGxvbmcgbmV3U2l6ZSA9IGZpbGUyLmxlbmd0aCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnU2l6ZSwgbmV3U2l6ZSk7CisKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZCgpIHsKKyAgICAgICAgdGVzdDMoKTsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIHRlbXBGaWxlKTsKKyAgICAgICAgZmluYWwgbG9uZyBvcmlnU2l6ZSA9IGZpbGUubGVuZ3RoKCk7CisKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEFwcGVuZCIpOworCisgICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIHRlbXBGaWxlMik7CisgICAgICAgIGZpbmFsIGxvbmcgbmV3U2l6ZSA9IGZpbGUyLmxlbmd0aCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnU2l6ZSoyLCBuZXdTaXplKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RmaWx0ZXIiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRMb2coKS5pbmRleE9mKCJSRVBMQUNFRCIpID4gLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb092ZXJ3cml0ZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdG5vb3ZlcndyaXRlIik7CisgICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIHRlbXBGaWxlMik7CisgICAgICAgIGxvbmcgc2l6ZSA9IGZpbGUyLmxlbmd0aCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZSwgMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdGhlYWRlcmZvb3RlcigpIHsKKyAgICAgICAgdGVzdDMoKTsKKyAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0aGVhZGVyZm9vdGVyIiwgImhlYWRlckhlbGxvLCBXb3JsZCFmb290ZXIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0ZmlsZWhlYWRlcigpIHsKKyAgICAgICAgdGVzdDMoKTsKKyAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0ZmlsZWhlYWRlciIsICJIZWxsbywgV29ybGQhSGVsbG8sIFdvcmxkISIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGVjdCBhbiBleGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIGNhdCBhbiBmaWxlIHRvIGl0c2VsZgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RzYW1lKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigic2FtZWZpbGUiLCAib3V0cHV0IGZpbGUgc2FtZSBhcyBpbnB1dCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGZpbHRlciBpbmxpbmUgd29ya3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0ZmlsdGVyaW5saW5lKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0ZmlsdGVyaW5saW5lIik7CisgICAgICAgIGFzc2VydFRydWUoZ2V0TG9nKCkuaW5kZXhPZigiUkVQTEFDRUQiKSA+IC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBtdWx0aXJlYWRlciB3b3JrcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RtdWx0aXJlYWRlcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdG11bHRpcmVhZGVyIik7CisgICAgICAgIGFzc2VydFRydWUoZ2V0TG9nKCkuaW5kZXhPZigiQnllIikgPiAtMSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0TG9nKCkuaW5kZXhPZigiSGVsbG8iKSA9PSAtMSk7CisgICAgfQorICAgIC8qKgorICAgICAqIENoZWNrIGlmIGZpeGxhc3RsaW5lIHdvcmtzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdGZpeGxhc3RsaW5lKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBleHBlY3RGaWxlQ29udGFpbnMoCisgICAgICAgICAgICAidGVzdGZpeGxhc3RsaW5lIiwgImNvbmNhdC5saW5lNCIsCisgICAgICAgICAgICAiZW5kIG9mIGxpbmUiICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpCisgICAgICAgICAgICArICJUaGlzIGhhcyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGZpeGxhc3RsaW5lIHdvcmtzIHdpdGggZW9sCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdGZpeGxhc3RsaW5lZW9sKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBleHBlY3RGaWxlQ29udGFpbnMoCisgICAgICAgICAgICAidGVzdGZpeGxhc3RsaW5lZW9sIiwgImNvbmNhdC5saW5lY3IiLAorICAgICAgICAgICAgImVuZCBvZiBsaW5lXHJUaGlzIGhhcyIpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgSGVscGVyIG1ldGhvZHMgLSBzaG91bGQgYmUgaW4gQnVpbGRGaWxlVGVzdAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRGaWxlU3RyaW5nKFN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBSZWFkZXIgciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByID0gbmV3IEZpbGVSZWFkZXIoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGZpbGVuYW1lKSk7CisgICAgICAgICAgICByZXR1cm4gIEZpbGVVdGlscy5yZWFkRnVsbHkocik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uocik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEZpbGVTdHJpbmcoU3RyaW5nIHRhcmdldCwgU3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuIGdldEZpbGVTdHJpbmcoZmlsZW5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3RGaWxlQ29udGFpbnMoCisgICAgICAgIFN0cmluZyB0YXJnZXQsIFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRhaW5zKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gZ2V0RmlsZVN0cmluZyh0YXJnZXQsIGZpbGVuYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICJleHBlY3RpbmcgZmlsZSAiICsgZmlsZW5hbWUgKyAiIHRvIGNvbnRhaW4gIiArCisgICAgICAgICAgICBjb250YWlucyArCisgICAgICAgICAgICAiIGJ1dCBnb3QgIiArIGNvbnRlbnQsIGNvbnRlbnQuaW5kZXhPZihjb250YWlucykgPiAtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFRyYW5zY29kaW5nIik7CisgICAgICAgIEZpbGUgZjEgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImNvcHkvZXhwZWN0ZWQvdXRmLTgiKTsKKyAgICAgICAgRmlsZSBmMiA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiY29uY2F0LnV0ZjgiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmMS50b1N0cmluZygpICsgIiBkaWZmZXJzIGZyb20gIiArIGYyLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgRklMRV9VVElMUy5jb250ZW50RXF1YWxzKGYxLCBmMikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZXMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RSZXNvdXJjZXMiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25kaXRpb25UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uZGl0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjcxY2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uZGl0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBAY3JlYXRlZCAxMyBKYW51YXJ5IDIwMDIKKyAqLworcHVibGljIGNsYXNzIENvbmRpdGlvblRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgQ29uZGl0aW9uVGVzdCBvYmplY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHdlIGRvbnQga25vdworICAgICAqLworICAgIHB1YmxpYyBDb25kaXRpb25UZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb24ueG1sIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVhcmRvd24gbWV0aG9kIGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgeworICAgICAgIGV4cGVjdFByb3BlcnR5U2V0KCJiYXNpYyIsImJhc2ljIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbkluY29tcGxldGUoKSB7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oImNvbmRpdGlvbi1pbmNvbXBsZXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHkgYXR0cmlidXRlIGhhcyBiZWVuIG9taXR0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcHJvcGVydHkgYXR0cmlidXRlIGlzIHJlcXVpcmVkLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25FbXB0eSgpIHsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigiY29uZGl0aW9uLWVtcHR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gY29uZGl0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IG5lc3QgYSBjb25kaXRpb24gaW50byA8Y29uZGl0aW9uPiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaG9ydGN1dCgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoInNob3J0Y3V0Iiwic2hvcnRjdXQiLCJzZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5zZXQoKSB7CisgICAgICAgIGV4cGVjdFByb3BlcnR5VW5zZXQoImRvbnRzZXQiLCJkb250c2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVNldCgic2V0dmFsdWUiLCJzZXR2YWx1ZSIsIndvb3dvbyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGlvbigpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoIm5lZ2F0aW9uIiwibmVnYXRpb24iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpb25GYWxzZSgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgibmVnYXRpb25mYWxzZSIsIm5lZ2F0aW9uZmFsc2UiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpb25JbmNvbXBsZXRlKCkgeworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJuZWdhdGlvbmluY29tcGxldGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBjb25kaXRpb25zIGluIDxub3Q+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3QgbmVzdCBhIGNvbmRpdGlvbiBpbnRvIDxub3Q+Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFuZCgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoImFuZCIsImFuZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRGYWlscygpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgiYW5kZmFpbHMiLCJhbmRmYWlscyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRJbmNvbXBsZXRlKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVVuc2V0KCJhbmRpbmNvbXBsZXRlIiwiYW5kaW5jb21wbGV0ZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRlbXB0eSgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoImFuZGVtcHR5IiwiYW5kZW1wdHkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3IoKSB7CisgICAgICAgIGV4cGVjdFByb3BlcnR5U2V0KCJvciIsIm9yIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE9yaW5jb21wbGV0ZSgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoIm9yIiwib3IiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3JGYWlscygpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgib3JmYWlscyIsIm9yZmFpbHMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3Jib3RoKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVNldCgib3Jib3RoIiwib3Jib3RoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVzbWF0Y2hJZGVudGljYWwoKSB7CisgICAgICAgIGV4cGVjdFByb3BlcnR5U2V0KCJmaWxlc21hdGNoLWlkZW50aWNhbCIsImZpbGVzbWF0Y2gtaWRlbnRpY2FsIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZXNtYXRjaEluY29tcGxldGUoKSB7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oImZpbGVzbWF0Y2gtaW5jb21wbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgZmlsZTIgYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm90aCBmaWxlMSBhbmQgZmlsZTIgYXJlIHJlcXVpcmVkIGluIGZpbGVzbWF0Y2giKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZXNtYXRjaE9kZHNpemVzKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVVuc2V0KCJmaWxlc21hdGNoLW9kZHNpemVzIiwiZmlsZXNtYXRjaC1vZGRzaXplcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc21hdGNoRXhpc3RlbmNlKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVVuc2V0KCJmaWxlc21hdGNoLWV4aXN0ZW5jZSIsICJmaWxlc21hdGNoLWV4aXN0ZW5jZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc21hdGNoRGlmZmVyZW50KCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVVuc2V0KCJmaWxlc21hdGNoLWRpZmZlcmVudCIsImZpbGVzbWF0Y2gtZGlmZmVyZW50Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVzbWF0Y2hNYXRjaCgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoImZpbGVzbWF0Y2gtbWF0Y2giLCJmaWxlc21hdGNoLW1hdGNoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVzbWF0Y2hEaWZmZXJlbnRTaXplcygpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgiZmlsZXNtYXRjaC1kaWZmZXJlbnQtc2l6ZXMiLAorICAgICAgICAgICAgImZpbGVzbWF0Y2gtZGlmZmVyZW50LXNpemVzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVzbWF0Y2hEaWZmZXJlbnRPbmVtaXNzaW5nKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVVuc2V0KCJmaWxlc21hdGNoLWRpZmZlcmVudC1vbmVtaXNzaW5nIiwKKyAgICAgICAgICAgICJmaWxlc21hdGNoLWRpZmZlcmVudC1vbmVtaXNzaW5nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVzbWF0Y2hEaWZmZXJlbnRFb2woKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImZpbGVzbWF0Y2gtZGlmZmVyZW50LWVvbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc21hdGNoU2FtZUVvbCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZmlsZXNtYXRjaC1zYW1lLWVvbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc21hdGNoTmVpdGhlckV4aXN0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJmaWxlc21hdGNoLW5laXRoZXJleGlzdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoImNvbnRhaW5zIiwiY29udGFpbnMiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc0RvZXNudCgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgiY29udGFpbnMtZG9lc250IiwiY29udGFpbnMtZG9lc250Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQW55Y2FzZSgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoImNvbnRhaW5zLWFueWNhc2UiLCJjb250YWlucy1hbnljYXNlIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJbmNvbXBsZXRlMSgpIHsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigiY29udGFpbnMtaW5jb21wbGV0ZTEiLAorICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBjb250YWlucyBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAiYm90aCBzdHJpbmcgYW5kIHN1YnN0cmluZyBhcmUgcmVxdWlyZWQgaW4gY29udGFpbnMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJbmNvbXBsZXRlMigpIHsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigiY29udGFpbnMtaW5jb21wbGV0ZTIiLAorICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBjb250YWlucyBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAiYm90aCBzdHJpbmcgYW5kIHN1YnN0cmluZyBhcmUgcmVxdWlyZWQgaW4gY29udGFpbnMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXN0cnVlKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVNldCgiaXN0cnVlIiwiaXN0cnVlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzdHJ1ZU5vdCgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgiaXN0cnVlLW5vdCIsImlzdHJ1ZS1ub3QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXN0cnVlRmFsc2UoKSB7CisgICAgICAgIGV4cGVjdFByb3BlcnR5VW5zZXQoImlzdHJ1ZS1mYWxzZSIsImlzdHJ1ZS1mYWxzZSIpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdElzdHJ1ZUluY29tcGxldGUxKCkgeworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJpc3RydWUtaW5jb21wbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICJOb3RoaW5nIHRvIHRlc3QgZm9yIHRydXRoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzZmFsc2VUcnVlKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVVuc2V0KCJpc2ZhbHNlLXRydWUiLCJpc2ZhbHNlLXRydWUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNmYWxzZU5vdCgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoImlzZmFsc2Utbm90IiwiaXNmYWxzZS1ub3QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNmYWxzZUZhbHNlKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVNldCgiaXNmYWxzZS1mYWxzZSIsImlzZmFsc2UtZmFsc2UiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc2ZhbHNlSW5jb21wbGV0ZTEoKSB7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oImlzZmFsc2UtaW5jb21wbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICJOb3RoaW5nIHRvIHRlc3QgZm9yIGZhbHNlaG9vZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbHNlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RWxzZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZXNtYXRjaEVycm9yKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigicmVzb3VyY2VzbWF0Y2gtZXJyb3IiLAorICAgICAgICAgICAgInNob3VsZCBmYWlsIGJlY2F1c2Ugbm8gcmVzb3VyY2VzIHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZXNtYXRjaEVtcHR5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZXNvdXJjZXNtYXRjaC1tYXRjaC1lbXB0eSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZXNtYXRjaE9uZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgicmVzb3VyY2VzbWF0Y2gtbWF0Y2gtb25lIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlc21hdGNoQmluYXJ5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZXNvdXJjZXNtYXRjaC1tYXRjaC1iaW5hcnkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VzbWF0Y2hNdWx0aXBsZUJpbmFyeSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgicmVzb3VyY2VzbWF0Y2gtbWF0Y2gtbXVsdGlwbGUtYmluYXJ5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlc21hdGNoRGlmZmVyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZXNvdXJjZXNtYXRjaC1kaWZmZXIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VzbWF0Y2hUZXh0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZXNvdXJjZXNtYXRjaC1tYXRjaC10ZXh0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlc21hdGNoTm9uZUV4aXN0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZXNvdXJjZXNtYXRjaC1ub25lZXhpc3QiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDViMjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weVRlc3QuamF2YQpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgRmlsZVNldCB1c2luZyB0aGUgQ29weSB0YXNrLgorICoKKyAqLworcHVibGljIGNsYXNzIENvcHlUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHVibGljIENvcHlUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5LnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJjb3B5dGVzdDEudG1wIik7CisgICAgICAgIGlmICggIWYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGZhaWwoIkNvcHkgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJjb3B5dGVzdDFkaXIvY29weS54bWwiKTsKKyAgICAgICAgaWYgKCAhZi5leGlzdHMoKSkgeworICAgICAgICAgICAgZmFpbCgiQ29weSBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICBGaWxlIGZpbGUzICA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgImNvcHl0ZXN0My50bXAiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMy5leGlzdHMoKSk7CisgICAgICAgIEZpbGUgZmlsZTNhID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCAiY29weXRlc3QzYS50bXAiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlM2EuZXhpc3RzKCkpOworICAgICAgICBGaWxlIGZpbGUzYiA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgImNvcHl0ZXN0M2IudG1wIik7CisgICAgICAgIGFzc2VydFRydWUoZmlsZTNiLmV4aXN0cygpKTsKKyAgICAgICAgRmlsZSBmaWxlM2MgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJjb3B5dGVzdDNjLnRtcCIpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUzYy5leGlzdHMoKSk7CisKKyAgICAgICAgLy9maWxlIGxlbmd0aCBjaGVja3MgcmVseSBvbiB0b3VjaCBnZW5lcmF0aW5nIGEgemVybyBieXRlIGZpbGUKKyAgICAgICAgaWYoZmlsZTMubGVuZ3RoKCk9PTApIHsKKyAgICAgICAgICAgIGZhaWwoImNvdWxkIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcsIG9sZGVyIGZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZihmaWxlM2MubGVuZ3RoKCkhPTApIHsKKyAgICAgICAgICAgIGZhaWwoImNvdWxkIG5vdCBmb3JjZSBvdmVyd3JpdGUgYW4gZXhpc3RpbmcsIG5ld2VyIGZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZihmaWxlM2IubGVuZ3RoKCk9PTApIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWRseSBvdmVyd3JvdGUgYW4gZXhpc3RpbmcsIG5ld2VyIGZpbGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vZmlsZSB0aW1lIGNoZWNrcyBmb3IgamF2YTEuMisKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlM2EubGFzdE1vZGlmaWVkKCk9PWZpbGUzLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlM2MubGFzdE1vZGlmaWVkKCk8ZmlsZTNhLmxhc3RNb2RpZmllZCgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJUZXN0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJmaWx0ZXJ0ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoZ2V0T3V0cHV0KCkuaW5kZXhPZigibG9vcCBpbiB0b2tlbnMiKSA9PSAtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluZmluaXRlRmlsdGVyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJpbmZpbml0ZXRlc3QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRPdXRwdXQoKS5pbmRleE9mKCJsb29wIGluIHRva2VucyIpICE9IC0xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbHRlclNldCIpOworICAgICAgICBGaWxlIHRtcCAgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJjb3B5LmZpbHRlcnNldC50bXAiKTsKKyAgICAgICAgRmlsZSBjaGVjayAgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJleHBlY3RlZC9jb3B5LmZpbHRlcnNldC5maWx0ZXJlZCIpOworICAgICAgICBhc3NlcnRUcnVlKHRtcC5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5jb250ZW50RXF1YWxzKHRtcCwgY2hlY2spKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyQ2hhaW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyQ2hhaW4iKTsKKyAgICAgICAgRmlsZSB0bXAgID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCAiY29weS5maWx0ZXJjaGFpbi50bXAiKTsKKyAgICAgICAgRmlsZSBjaGVjayAgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJleHBlY3RlZC9jb3B5LmZpbHRlcnNldC5maWx0ZXJlZCIpOworICAgICAgICBhc3NlcnRUcnVlKHRtcC5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5jb250ZW50RXF1YWxzKHRtcCwgY2hlY2spKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRmlsZUZpbGVzZXQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Rfc2luZ2xlX2ZpbGVfZmlsZXNldCIpOworICAgICAgICBGaWxlIGZpbGUgID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3B5dGVzdF9zaW5nbGVfZmlsZV9maWxlc2V0LnRtcCIpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVGaWxlUGF0aCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdF9zaW5nbGVfZmlsZV9wYXRoIik7CisgICAgICAgIEZpbGUgZmlsZSAgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcHl0ZXN0X3NpbmdsZV9maWxlX3BhdGgudG1wIik7CisgICAgICAgIGFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFRyYW5zY29kaW5nIik7CisgICAgICAgIEZpbGUgZjEgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImNvcHkvZXhwZWN0ZWQvdXRmLTgiKTsKKyAgICAgICAgRmlsZSBmMiA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiY29weXRlc3QxLnRtcCIpOworICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhmMSwgZjIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0ZpbGVJZ25vcmUoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RNaXNzaW5nRmlsZUlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IENvdWxkIG5vdCBmaW5kIGZpbGUgIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdGaWxlQmFpbCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3RNaXNzaW5nRmlsZUJhaWwiLCAibm90LXRoZXJlIGRvZXNuJ3QgZXhpc3QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRCdWlsZEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKCJXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBmaWxlICIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0Rpcklnbm9yZSgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygidGVzdE1pc3NpbmdEaXJJZ25vcmUiLCAiV2FybmluZzogIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdEaXJCYWlsKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdE1pc3NpbmdEaXJCYWlsIiwgIm5vdC10aGVyZSBkb2Vzbid0IGV4aXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoZ2V0QnVpbGRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoIiBub3QgZm91bmQuIikpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVJlc291cmNlUGxhaW4oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlUmVzb3VyY2VQbGFpbiIpOworICAgICAgICBGaWxlIGZpbGUxID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpKyIvZmlsZTEudHh0Iik7CisgICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidG8uZGlyIikrIi9maWxlMi50eHQiKTsKKyAgICAgICAgRmlsZSBmaWxlMyA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSsiL2ZpbGUzLnR4dCIpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUxLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMi5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoZmlsZTMuZXhpc3RzKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEZpbGVSZXNvdXJjZVdpdGhNYXBwZXIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlUmVzb3VyY2VXaXRoTWFwcGVyIik7CisgICAgICAgIEZpbGUgZmlsZTEgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidG8uZGlyIikrIi9maWxlMS50eHQuYmFrIik7CisgICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidG8uZGlyIikrIi9maWxlMi50eHQuYmFrIik7CisgICAgICAgIEZpbGUgZmlsZTMgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidG8uZGlyIikrIi9maWxlMy50eHQuYmFrIik7CisgICAgICAgIGFzc2VydFRydWUoZmlsZTEuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUyLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMy5leGlzdHMoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlUmVzb3VyY2VXaXRoRmlsdGVyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsZVJlc291cmNlV2l0aEZpbHRlciIpOworICAgICAgICBGaWxlIGZpbGUxID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpKyIvZmlsZU5SLnR4dCIpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUxLmV4aXN0cygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlMUNvbnRlbnQgPSBGaWxlVXRpbHMucmVhZEZ1bGx5KG5ldyBGaWxlUmVhZGVyKGZpbGUxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgZmlsZSA0MiIsIGZpbGUxQ29udGVudCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG5vLW9wOiBub3QgYSByZWFsIGJ1c2luZXNzIGVycm9yCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhBc1Jlc291cmNlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UGF0aEFzUmVzb3VyY2UiKTsKKyAgICAgICAgRmlsZSBmaWxlMSA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSsiL2ZpbGUxLnR4dCIpOworICAgICAgICBGaWxlIGZpbGUyID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpKyIvZmlsZTIudHh0Iik7CisgICAgICAgIEZpbGUgZmlsZTMgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidG8uZGlyIikrIi9maWxlMy50eHQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoZmlsZTIuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUzLmV4aXN0cygpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFppcGZpbGVzZXQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RaaXBmaWxlc2V0Iik7CisgICAgICAgIEZpbGUgZmlsZTEgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidG8uZGlyIikrIi9maWxlMS50eHQiKTsKKyAgICAgICAgRmlsZSBmaWxlMiA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSsiL2ZpbGUyLnR4dCIpOworICAgICAgICBGaWxlIGZpbGUzID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpKyIvZmlsZTMudHh0Iik7CisgICAgICAgIGFzc2VydFRydWUoZmlsZTEuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGZpbGUyLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMy5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERpcnNldCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdERpcnNldCIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFJlc291cmNlUGxhaW4oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RSZXNvdXJjZVBsYWluIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIF90ZXN0UmVzb3VyY2VQbGFpbldpdGhNYXBwZXIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RSZXNvdXJjZVBsYWluV2l0aE1hcHBlciIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFJlc291cmNlUGxhaW5XaXRoRmlsdGVyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UmVzb3VyY2VQbGFpbldpdGhGaWx0ZXIiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgX3Rlc3RPbmxpbmVSZXNvdXJjZXMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RPbmxpbmVSZXNvdXJjZXMiKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZGlyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlY2FjNTkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpclRlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIENvcHlkaXJUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgQ29weWRpclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlkaXIueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QyIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QzIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0NCIsICJERVBSRUNBVEVEIC0gVGhlIGNvcHlkaXIgdGFzayBpcyBkZXByZWNhdGVkLiAgVXNlIGNvcHkgaW5zdGVhZC5XYXJuaW5nOiBzcmMgPT0gZGVzdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgICAgICBqYXZhLmlvLkZpbGUgZiA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0UHJvamVjdERpcigpLCAiLi4vdGFza2RlZnMudG1wIik7CisgICAgICAgIGlmICghZi5leGlzdHMoKSB8fCAhZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBmYWlsKCJDb3B5IGZhaWxlZCIpOworICAgICAgICB9CisgICAgICAgIC8vIFdlIGtlZXAgdGhpcywgc28gd2UgaGF2ZSBzb21ldGhpbmcgdG8gZGVsZXRlIGluIGxhdGVyIHRlc3RzIDotKQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDYiLCAidGFyZ2V0IGlzIGZpbGUiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZmlsZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZmlsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzJjNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlmaWxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgQ29weWZpbGVUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q2IiwgInRhcmdldCBpcyBkaXJlY3RvcnkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29weWZpbGVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZmlsZS54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDMiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgICAgICBleHBlY3RMb2coInRlc3Q0IiwgIkRFUFJFQ0FURUQgLSBUaGUgY29weWZpbGUgdGFzayBpcyBkZXByZWNhdGVkLiAgVXNlIGNvcHkgaW5zdGVhZC5XYXJuaW5nOiBzcmMgPT0gZGVzdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgICAgICBqYXZhLmlvLkZpbGUgZiA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0UHJvamVjdERpcigpLCAiY29weWZpbGUudG1wIik7CisgICAgICAgIGlmIChmLmV4aXN0cygpKSB7CisgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFpbCgiQ29weSBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZhdWx0RXhjbHVkZXNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmYXVsdEV4Y2x1ZGVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjU4NGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmYXVsdEV4Y2x1ZGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdEV4Y2x1ZGVzVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIERlZmF1bHRFeGNsdWRlc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlZmF1bHRleGNsdWRlcy54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgLy8gT3V0cHV0IHRoZSBkZWZhdWx0IGV4Y2x1ZGVzCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovKn4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovIyojIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy4jKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8lKiUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLl8qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL0NWUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi9DVlMvKioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmN2c2lnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi9TQ0NTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL1NDQ1MvKioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovdnNzdmVyLnNjYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uc3ZuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5zdm4vKioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLkRTX1N0b3JlIn07CisgICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjdXJyZW50IGRlZmF1bHQgZXhjbHVkZXMiLCBleHBlY3RlZCwgRGlyZWN0b3J5U2Nhbm5lci5nZXREZWZhdWx0RXhjbHVkZXMoKSk7CisgICAgfQorCisgICAgLy8gYWRkaW5nIHNvbWV0aGluZyB0byB0aGUgZXhjbHVkZXMnCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovKn4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovIyojIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy4jKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8lKiUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLl8qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL0NWUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi9DVlMvKioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmN2c2lnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi9TQ0NTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL1NDQ1MvKioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovdnNzdmVyLnNjYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uc3ZuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5zdm4vKioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLkRTX1N0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbyJ9OworICAgICAgICBwcm9qZWN0LmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgIGFzc2VydEVxdWFscygiY3VycmVudCBkZWZhdWx0IGV4Y2x1ZGVzIiwgZXhwZWN0ZWQsIERpcmVjdG9yeVNjYW5uZXIuZ2V0RGVmYXVsdEV4Y2x1ZGVzKCkpOworICAgIH0KKworICAgIC8vIHJlbW92aW5nIHNvbWV0aGluZyBmcm9tIHRoZSBkZWZhdWx0cworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBTdHJpbmdbXSBleHBlY3RlZCA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLyp+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLyMqIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uIyoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovJSolIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5fKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ1ZTIG1pc3NpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL0NWUy8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uY3ZzaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL1NDQ1MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovU0NDUy8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi92c3N2ZXIuc2NjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5zdm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLnN2bi8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uRFNfU3RvcmUifTsKKyAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImN1cnJlbnQgZGVmYXVsdCBleGNsdWRlcyIsIGV4cGVjdGVkLCBEaXJlY3RvcnlTY2FubmVyLmdldERlZmF1bHRFeGNsdWRlcygpKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gZXhwZWN0ZWQsIFN0cmluZ1tdIGFjdHVhbCkgeworICAgICAgICAvLyBjaGVjayB0aGF0IGJvdGggYXJyYXlzIGhhdmUgdGhlIHNhbWUgc2l6ZQorICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSArICIgOiBzdHJpbmcgYXJyYXkgbGVuZ3RoIG1hdGNoIiwgZXhwZWN0ZWQubGVuZ3RoLCBhY3R1YWwubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgY291bnRlcj0wOyBjb3VudGVyIDxleHBlY3RlZC5sZW5ndGg7IGNvdW50ZXIrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UgKyAiIDogIiArIGNvdW50ZXIgKyAidGggZWxlbWVudCBpbiBhcnJheSBtYXRjaCIsIGV4cGVjdGVkW2NvdW50ZXJdLCBhY3R1YWxbY291bnRlcl0pOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsZXRlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbGV0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRjNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbGV0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIERlbGV0ZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBEZWxldGVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kZWxldGUueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKKyAgICB9CisvL3doZXJlIG9oIHdoZXJlIGhhcyBteSB0ZXN0IGNhc2UgMyBnb25lPworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3Q3KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NyIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0OCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDgiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdDkoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q5Iik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEwIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3QxMSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDExIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3QxMigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEyIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3QxMygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEzIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3QxNCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDE0Iik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3QxNSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDE1Iik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3QxNigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDE2Iik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3QxNygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDE3Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsdHJlZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjA0MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWVUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBEZWx0cmVlVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIERlbHRyZWVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kZWx0cmVlLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICAvLyBXZSB0cnkgdG8gZGVsZXRlIHRoZSBkaXJlY3RvcnkgY3JlYXRlZCBpbiBDb3B5ZGlyVGVzdAorICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbXV4T3V0cHV0VGFzay5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbXV4T3V0cHV0VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTNiMmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVtdXhPdXRwdXRUYXNrLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisvKioKKyAqIEEgc2ltcGxlIHRhc2sgdGhhdCBwcmludHMgdG8gU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyciBhbmQgdGhlbiBjYXRjaGVzCisgKiB0aGUgb3V0cHV0IHdoaWNoIGl0IHRoZW4gY2hlY2tzLiBJZiB0aGUgb3V0cHV0IGRvZXMgbm90IG1hdGNoLCBhbgorICogZXhjZXB0aW9uIGlzIHRocm93bgorICoKKyAqIEBzaW5jZSAxLjUKKyAqIEBjcmVhdGVkIDIxIEZlYnJ1YXJ5IDIwMDIKKyAqLworcHVibGljIGNsYXNzIERlbXV4T3V0cHV0VGFzayBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgU3RyaW5nIHJhbmRvbU91dFZhbHVlOworICAgIHByaXZhdGUgU3RyaW5nIHJhbmRvbUVyclZhbHVlOworICAgIHByaXZhdGUgYm9vbGVhbiBvdXRwdXRSZWNlaXZlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBlcnJvclJlY2VpdmVkID0gZmFsc2U7CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBSYW5kb20gZ2VuZXJhdG9yID0gbmV3IFJhbmRvbSgpOworICAgICAgICByYW5kb21PdXRWYWx1ZSA9ICJPdXRwdXQgVmFsdWUgaXMgIiArIGdlbmVyYXRvci5uZXh0SW50KCk7CisgICAgICAgIHJhbmRvbUVyclZhbHVlID0gIkVycm9yIFZhbHVlIGlzICIgKyBnZW5lcmF0b3IubmV4dEludCgpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyYW5kb21PdXRWYWx1ZSk7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihyYW5kb21FcnJWYWx1ZSk7CisgICAgICAgIGlmICghb3V0cHV0UmVjZWl2ZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGlkIG5vdCByZWNlaXZlIG91dHB1dCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFlcnJvclJlY2VpdmVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRpZCBub3QgcmVjZWl2ZSBlcnJvciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBsaW5lKSB7CisgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKKyAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgIT0gMCAmJiAhbGluZS5lcXVhbHMocmFuZG9tT3V0VmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJSZWNlaXZlZCA9IFsiICsgbGluZSArICJdLCBleHBlY3RlZCA9IFsiCisgICAgICAgICAgICAgICAgKyByYW5kb21PdXRWYWx1ZSArICJdIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRSZWNlaXZlZCA9IHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXJyb3JPdXRwdXQoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOworICAgICAgICBpZiAobGluZS5sZW5ndGgoKSAhPSAwICYmICFsaW5lLmVxdWFscyhyYW5kb21FcnJWYWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlJlY2VpdmVkID0gWyIgKyBsaW5lICsgIl0sIGV4cGVjdGVkID0gWyIKKyAgICAgICAgICAgICAgICArIHJhbmRvbUVyclZhbHVlICsgIl0iOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIGVycm9yUmVjZWl2ZWQgPSB0cnVlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Rpcm5hbWVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlybmFtZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTViOTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Rpcm5hbWVUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgRGlybmFtZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBEaXJuYW1lVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGlybmFtZS54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInByb3BlcnR5IGF0dHJpYnV0ZSByZXF1aXJlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAiZmlsZSBhdHRyaWJ1dGUgcmVxdWlyZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QzIiwgInByb3BlcnR5IGF0dHJpYnV0ZSByZXF1aXJlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSB8fCBPcy5pc0ZhbWlseSgiZG9zIikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOworICAgICAgICBTdHJpbmcgZmlsZXNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gZmlsZXNlcCArICJ1c3IiICsgZmlsZXNlcCArICJsb2NhbCI7CisgICAgICAgIFN0cmluZyBjaGVja3Byb3AgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJsb2NhbC5kaXIiKTsKKyAgICAgICAgaWYgKCFjaGVja3Byb3AuZXF1YWxzKGV4cGVjdGVkKSkgeworICAgICAgICAgICAgZmFpbCgiZGlybmFtZSBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJiYXNlZGlyIik7CisgICAgICAgIFN0cmluZyBjaGVja3Byb3AgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJiYXNlLmRpciIpOworICAgICAgICBpZiAoIWNoZWNrcHJvcC5lcXVhbHMoZXhwZWN0ZWQpKSB7CisgICAgICAgICAgICBmYWlsKCJkaXJuYW1lIGZhaWxlZCIpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRHluYW1pY1Rhc2suamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EeW5hbWljVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNGI2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRHluYW1pY1Rhc2suamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EeW5hbWljQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKK3B1YmxpYyBjbGFzcyBEeW5hbWljVGFzayBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBEeW5hbWljQ29uZmlndXJhdG9yIHsKKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjcmVhdGVEeW5hbWljRWxlbWVudChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IFN1YigpOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBTdWIgaW1wbGVtZW50cyBEeW5hbWljQ29uZmlndXJhdG9yIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVEeW5hbWljRWxlbWVudChTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRHluYW1pY1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EeW5hbWljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDQyNjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRHluYW1pY1Rlc3QuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCitwdWJsaWMgY2xhc3MgRHluYW1pY1Rlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBEeW5hbWljVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZHluYW1pY3Rhc2sueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgic2ltcGxlIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHByb2plY3QuZ2V0UHJvcGVydHkoInByb3AxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJwcm9wMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgicHJvcDMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiNCIsIHByb2plY3QuZ2V0UHJvcGVydHkoInByb3A0IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0VjaG9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkOTI2MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EZWZhdWx0TG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgRWNob1Rlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBFY2hvVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZWNoby54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW4iKTsKKyAgICB9CisKKyAgICAvLyBPdXRwdXQgYW4gZW1wdHkgU3RyaW5nCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdExvZygidGVzdDEiLCAiIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dCbGFua0VjaG8oKSB7CisgICAgICAgIEVjaG9UZXN0TG9nZ2VyIGxvZ2dlciA9IG5ldyBFY2hvVGVzdExvZ2dlcigpOworICAgICAgICBnZXRQcm9qZWN0KCkuYWRkQnVpbGRMaXN0ZW5lcihsb2dnZXIpOworICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgICAgIFtlY2hvXSAiLCBsb2dnZXIubGFzdExvZ2dlZE1lc3NhZ2UgKTsKKyAgICB9CisgCisgICAgLy8gT3V0cHV0ICdPVVRQVVQgT0YgRUNITycKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0MiIsICJPVVRQVVQgT0YgRUNITyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleHBlY3RMb2coInRlc3QzIiwgIlxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgVGhpcyBcbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlzXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBhIFxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbXVsdGlsaW5lXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBtZXNzYWdlXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEFwcGVuZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RFbXB0eUVuY29kaW5nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVURjE2RW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFVURjE2RW5jb2RpbmciKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFVURjhFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0VVRGOEVuY29kaW5nIik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgY2xhc3MgRWNob1Rlc3RMb2dnZXIgZXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHsKKyAgICAgICAgU3RyaW5nIGxhc3RMb2dnZWRNZXNzYWdlOworICAgIAorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVjaG9UZXN0TG9nZ2VyKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuc2V0TWVzc2FnZU91dHB1dExldmVsKFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgIHRoaXMuc2V0T3V0cHV0UHJpbnRTdHJlYW0obmV3IFByaW50U3RyZWFtKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMjU2KSkpOworICAgICAgICAgICAgdGhpcy5zZXRFcnJvclByaW50U3RyZWFtKG5ldyBQcmludFN0cmVhbShuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDI1NikpKTsKKyAgICAgICAgfQorICAgICAgICAvKiAKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgdGhpcy5sYXN0TG9nZ2VkTWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0VjaG9YTUxUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNob1hNTFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yY2YyODE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0VjaG9YTUxUZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworcHVibGljIGNsYXNzIEVjaG9YTUxUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgRWNob1hNTFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VjaG94bWwueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlYXJEb3duIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhc3MoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RQYXNzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZhaWwoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEZhaWwiLCAibXVzdCBmYWlsIiwgIiR7Zm9vfT1iYXIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEVtcHR5IiwgIm11c3QgZmFpbCIsICJObyBuZXN0ZWQgWE1MIHNwZWNpZmllZCIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNUYXNrVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNUYXNrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTE0M2YKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY1Rhc2tUZXN0LmphdmEKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkNvbXBhcmlzb25GYWlsdXJlOworCisvKioKKyAqIFVuaXQgdGVzdCBmb3IgdGhlICZsdDtleGVjJmd0OyB0YXNrLgorICovCitwdWJsaWMgY2xhc3MgRXhlY1Rhc2tUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1BBVEggPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9GSUxFID0gQlVJTERfUEFUSCArICJleGVjLnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVfVE9fV0FJVCA9IDE7CisgICAgLyoqIG1heGltdW0gdGltZSBhbGxvd2VkIGZvciB0aGUgYnVpbGQgaW4gbWlsbGlzZWNvbmRzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUlMRF9USU1FID0gNDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VDVVJJVFlfTUFSR0lOID0gMjAwMDsgLy8gd2FpdCAyIHNlY29uZCBleHRyYXMKKyAgICAvLyB0aGUgdGVzdCBmYWlsZWQgd2l0aCAxMDAgbXMgb2YgbWFyZ2luIG9uIGN2cy5hcGFjaGUub3JnIG9uIEF1Z3VzdCAxc3QsIDIwMDMKKworICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwcml2YXRlIEZpbGUgbG9nRmlsZTsKKyAgICBwcml2YXRlIE1vbml0b3JlZEJ1aWxkIG15QnVpbGQgPSBudWxsOworICAgIHZvbGF0aWxlIHByaXZhdGUgYm9vbGVhbiBidWlsZEZpbmlzaGVkID0gZmFsc2U7CisgICAgcHVibGljIEV4ZWNUYXNrVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChCVUlMRF9GSUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgaWYgKGxvZ0ZpbGUgIT0gbnVsbCAmJiBsb2dGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoImxvZ0ZpbGUiLCBsb2dGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vUmVkaXJlY3QoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoIm5vLXJlZGlyZWN0Iik7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QuY2FuLnJ1biIpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbG9nIGNvbnRlbnQiLAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpICsgIiBvdXQiCisgICAgICAgICAgICArIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSArICIgZXJyIiwgZ2V0TG9nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdDEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWRpcmVjdDEiKTsKKyAgICAgICAgaWYgKGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdC5jYW4ucnVuIikgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBleHBlY3RlZE91dCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSArICIgb3V0XG4iCisgICAgICAgICAgICArIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSArICIgZXJyXG4iOworCisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBvdXRwdXQiLAorICAgICAgICAgICAgZXhwZWN0ZWRPdXQsIGdldEZpbGVTdHJpbmcoInJlZGlyZWN0Lm91dCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3QyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgicmVkaXJlY3QyIik7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QuY2FuLnJ1biIpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBvdXRwdXQiLAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpICsgIiBvdXRcbiIsCisgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdC5vdXQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvciBvdXRwdXQiLAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpICsgIiBlcnJcbiIsCisgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdC5lcnIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZGlyZWN0MygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlZGlyZWN0MyIpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0LmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGxvZyBjb250ZW50IiwKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSArICIgZXJyIiwgZ2V0TG9nKCkpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRPdXQgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5maWxlIikgKyAiIG91dFxuIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IiwKKyAgICAgICAgICAgIGV4cGVjdGVkT3V0LCBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdC5vdXQiKSk7CisgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKCJyZWRpcmVjdC5vdXQiLCBleHBlY3RlZE91dC50cmltKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdDQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWRpcmVjdDQiKTsKKyAgICAgICAgaWYgKGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdC5jYW4ucnVuIikgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBleHBlY3RlZE91dCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSArICIgb3V0XG4iOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRFcnIgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5maWxlIikgKyAiIGVyclxuIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IiwKKyAgICAgICAgICAgIGV4cGVjdGVkT3V0LCBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdC5vdXQiKSk7CisgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKCJyZWRpcmVjdC5vdXQiLCBleHBlY3RlZE91dC50cmltKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3Igb3V0cHV0IiwKKyAgICAgICAgICAgIGV4cGVjdGVkRXJyLCBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdC5lcnIiKSk7CisgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKCJyZWRpcmVjdC5lcnIiLCBleHBlY3RlZEVyci50cmltKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdDUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0UmVkaXJlY3Q1b3I2KCJyZWRpcmVjdDUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3Q2KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlZGlyZWN0NW9yNigicmVkaXJlY3Q2Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZGlyZWN0NW9yNihTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIndjLmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IiwgIjMiLCBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdC5vdXQiKS50cmltKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByb3BlcnR5IHJlZGlyZWN0Lm91dCIsICIzIiwKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgicmVkaXJlY3Qub3V0IikudHJpbSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgidW5leHBlY3RlZCBlcnJvciBvdXRwdXQiLCBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdC5lcnIiKSk7CisgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKCJyZWRpcmVjdC5lcnIiLCAiIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZGlyZWN0NygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlZGlyZWN0NyIpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ3Yy5jYW4ucnVuIikgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG91dHB1dCIsICIzIiwgZ2V0RmlsZVN0cmluZygicmVkaXJlY3Qub3V0IikudHJpbSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eSByZWRpcmVjdC5vdXQiLCAiMyIsCisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInJlZGlyZWN0Lm91dCIpLnRyaW0oKSk7CisgICAgICAgIGFzc2VydE51bGwoInVuZXhwZWN0ZWQgZXJyb3Igb3V0cHV0IiwgZ2V0RmlsZVN0cmluZygicmVkaXJlY3QuZXJyIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdG9yMSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiaW5pdCIpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0LmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInJlZGlyZWN0b3IxIiwgImNhbm5vdCBoYXZlID4gMSBuZXN0ZWQgPHJlZGlyZWN0b3I+cyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdG9yMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlZGlyZWN0b3IyIik7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QuY2FuLnJ1biIpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBvdXRwdXQiLAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpICsgIiBvdXRcbiIKKyAgICAgICAgICAgICsgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpICsgIiBlcnJcbiIsCisgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdG9yLm91dCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3RvcjMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWRpcmVjdG9yMyIpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0LmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IiwKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSArICIgb3V0XG4iLAorICAgICAgICAgICAgZ2V0RmlsZVN0cmluZygicmVkaXJlY3Rvci5vdXQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvciBvdXRwdXQiLAorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpICsgIiBlcnJcbiIsCisgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdG9yLmVyciIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3RvcjQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWRpcmVjdG9yNCIpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0LmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0ID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpICsgIiBvdXRcbiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGxvZyBjb250ZW50IiwKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSArICIgZXJyIiwgZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IiwgZXhwZWN0ZWRPdXQsCisgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdG9yLm91dCIpKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlFcXVhbHMoInJlZGlyZWN0b3Iub3V0IiwgZXhwZWN0ZWRPdXQudHJpbSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3RvcjUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0UmVkaXJlY3RvcjVvcjYoInJlZGlyZWN0b3I1Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZGlyZWN0b3I2KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlZGlyZWN0b3I1b3I2KCJyZWRpcmVjdG9yNiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVkaXJlY3RvcjVvcjYoU3RyaW5nIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0LmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0ID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpICsgIiBvdXRcbiI7CisgICAgICAgIFN0cmluZyBleHBlY3RlZEVyciA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSArICIgZXJyXG4iOworCisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBvdXRwdXQiLCBleHBlY3RlZE91dCwKKyAgICAgICAgICAgIGdldEZpbGVTdHJpbmcoInJlZGlyZWN0b3Iub3V0IikpOworICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscygicmVkaXJlY3Rvci5vdXQiLCBleHBlY3RlZE91dC50cmltKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3Igb3V0cHV0IiwgZXhwZWN0ZWRFcnIsCisgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdG9yLmVyciIpKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlFcXVhbHMoInJlZGlyZWN0b3IuZXJyIiwgZXhwZWN0ZWRFcnIudHJpbSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3RvcjcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWRpcmVjdG9yNyIpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0LmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0ID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpICsgIiBvdXRcbiI7CisgICAgICAgIFN0cmluZyBleHBlY3RlZEVyciA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKSArICIgRVJST1IhISFcbiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG91dHB1dCIsIGV4cGVjdGVkT3V0LAorICAgICAgICAgICAgZ2V0RmlsZVN0cmluZygicmVkaXJlY3Rvci5vdXQiKSk7CisgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKCJyZWRpcmVjdG9yLm91dCIsIGV4cGVjdGVkT3V0LnRyaW0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvciBvdXRwdXQiLCBleHBlY3RlZEVyciwKKyAgICAgICAgICAgIGdldEZpbGVTdHJpbmcoInJlZGlyZWN0b3IuZXJyIikpOworICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscygicmVkaXJlY3Rvci5lcnIiLCBleHBlY3RlZEVyci50cmltKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdG9yOCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlZGlyZWN0b3I4Iik7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIndjLmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IiwgIjMiLCBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdG9yLm91dCIpLnRyaW0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJvcGVydHkgcmVkaXJlY3Rvci5vdXQiLCAiMyIsCisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInJlZGlyZWN0b3Iub3V0IikudHJpbSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgidW5leHBlY3RlZCBlcnJvciBvdXRwdXQiLCBnZXRGaWxlU3RyaW5nKCJyZWRpcmVjdG9yLmVyciIpKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlFcXVhbHMoInJlZGlyZWN0b3IuZXJyIiwgIiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdG9yOSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RSZWRpcmVjdG9yOVRocnUxMigicmVkaXJlY3RvcjkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3RvcjEwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlZGlyZWN0b3I5VGhydTEyKCJyZWRpcmVjdG9yMTAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3RvcjExKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlZGlyZWN0b3I5VGhydTEyKCJyZWRpcmVjdG9yMTEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3RvcjEyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlZGlyZWN0b3I5VGhydTEyKCJyZWRpcmVjdG9yMTIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFJlZGlyZWN0b3I5VGhydTEyKFN0cmluZyB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgaWYgKGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiY2F0LmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0ID0gImJsYWggYWZ0ZXIgYmxhaCI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG91dHB1dCIsCisgICAgICAgICAgICBleHBlY3RlZE91dCwgZ2V0RmlsZVN0cmluZygicmVkaXJlY3Rvci5vdXQiKS50cmltKCkpOworICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscygicmVkaXJlY3Rvci5vdXQiLCBleHBlY3RlZE91dC50cmltKCkpOworICAgICAgICBhc3NlcnROdWxsKCJ1bmV4cGVjdGVkIGVycm9yIG91dHB1dCIsIGdldEZpbGVTdHJpbmcoInJlZGlyZWN0b3IuZXJyIikpOworICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscygicmVkaXJlY3Rvci5lcnIiLCAiIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZGlyZWN0b3IxMygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgicmVkaXJlY3RvcjEzIik7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QuY2FuLnJ1biIpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgYW50ZmlsZSA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vbm8gcG9pbnQgaW4gc2V0dGluZyBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhbnRmaWxlICsgIiBPVVRQVVQ/Pz8iICsgYW50ZmlsZSArICIgRVJST1IhISEiLCBnZXRMb2coKSk7CisgICAgICAgIH0gY2F0Y2ggKENvbXBhcmlzb25GYWlsdXJlIGNmKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbG9nIGNvbnRlbnQiLAorICAgICAgICAgICAgICAgIGFudGZpbGUgKyAiIEVSUk9SISEhIiArIGFudGZpbGUgKyAiIE9VVFBVVD8/PyIsIGdldExvZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdG9yMTQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlZGlyZWN0b3IxNCIpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJjYXQuY2FuLnJ1biIpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbG9nIG91dHB1dCIsICJibGFoIGFmdGVyIGJsYWgiLCBnZXRMb2coKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZGlyZWN0b3IxNSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlZGlyZWN0b3IxNSIpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJjYXQuY2FuLnJ1biIpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJlcnJvciB3aXRoIHRyYW5zY29kaW5nIiwKKyAgICAgICAgICAgIEZJTEVfVVRJTFMuY29udGVudEVxdWFscygKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvdXRmLTgiKSwKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgicmVkaXJlY3Rvci5vdXQiKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdG9yMTYoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlZGlyZWN0b3IxNiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdG9yMTcoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlZGlyZWN0b3IxNyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWRpcmVjdG9yMTgoKSB7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QuY2FuLnJ1biIpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBleHBlY3RMb2coInJlZGlyZWN0b3IxOCIsIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmZpbGUiKQorICAgICAgICAgICAgKyAiIG91dCIgKyBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5maWxlIikgKyAiIGVyciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RzcGF3bigpIHsKKyAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KCJpbml0Iik7CisgICAgICAgIGlmIChwcm9qZWN0LmdldFByb3BlcnR5KCJ0ZXN0LmNhbi5ydW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbXlCdWlsZCA9IG5ldyBNb25pdG9yZWRCdWlsZChuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgQlVJTERfRklMRSksICJzcGF3biIpOworICAgICAgICBsb2dGaWxlID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZSgic3Bhd24iLCJsb2ciLCBwcm9qZWN0LmdldEJhc2VEaXIoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgLy8gdGhpcyBpcyBndWFyYW50ZWVkIGJ5IEZpbGVVdGlscyNjcmVhdGVUZW1wRmlsZQorICAgICAgICBhc3NlcnRUcnVlKCJsb2cgZmlsZSBub3QgZXhpc3RpbmciLCAhbG9nRmlsZS5leGlzdHMoKSk7CisgICAgICAgIC8vIG1ha2UgdGhlIHNwYXduZWQgcHJvY2VzcyBydW4gNCBzZWNvbmRzCisgICAgICAgIG15QnVpbGQuc2V0VGltZVRvV2FpdChUSU1FX1RPX1dBSVQpOworICAgICAgICBteUJ1aWxkLnNldExvZ0ZpbGUobG9nRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIG15QnVpbGQuYWRkQnVpbGRMaXN0ZW5lcihuZXcgTW9uaXRvcmVkQnVpbGRMaXN0ZW5lcigpKTsKKyAgICAgICAgbXlCdWlsZC5zdGFydCgpOworICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBzdGFydHdhaXQgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKyAgICAgICAgLy8gdGhpcyBsb29wIHJ1bnMgcGFyYWxsZWwgdG8gdGhlIGJ1aWxkCisgICAgICAgIHdoaWxlICghYnVpbGRGaW5pc2hlZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibXkgc2xlZXAgd2FzIGludGVycnVwdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBub3cgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKyAgICAgICAgICAgIC8vIHNlY3VyaXR5CisgICAgICAgICAgICBpZiAobm93LmdldFRpbWUoKS5nZXRUaW1lKCkgLSBzdGFydHdhaXQuZ2V0VGltZSgpLmdldFRpbWUoKSA+IE1BWF9CVUlMRF9USU1FKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYm9ydGluZyB3YWl0LCB0b28gbG9uZyAiICsgKG5vdy5nZXRUaW1lKCkuZ2V0VGltZSgpIC0gc3RhcnR3YWl0LmdldFRpbWUoKS5nZXRUaW1lKCkpICsgIm1pbGxpc2Vjb25kcyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG5vdyB3YWl0IHVudGlsIHRoZSBzcGF3bmVkIHByb2Nlc3MgaXMgZmluaXNoZWQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgoVElNRV9UT19XQUlUKSAqIDEwMDAgKyBTRUNVUklUWV9NQVJHSU4pOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm15IHNsZWVwIHdhcyBpbnRlcnJ1cHRlZCIpOworICAgICAgICB9CisgICAgICAgIC8vIHRpbWUgb2YgdGhlIGJ1aWxkIGluIG1pbGxpIHNlY29uZHMKKyAgICAgICAgbG9uZyBlbGFwc2VkID0gbXlCdWlsZC5nZXRUaW1lRWxhcHNlZCgpOworICAgICAgICBhc3NlcnRUcnVlKCJ3ZSB3YWl0ZWQgbW9yZSB0aGFuIHRoZSBwcm9jZXNzIGxhc3RlZCIsIFRJTUVfVE9fV0FJVCAqIDEwMDAKKyAgICAgICAgICAgICAgICArIFNFQ1VSSVRZX01BUkdJTiA+IGVsYXBzZWQpOworICAgICAgICBsb2dGaWxlID0gbmV3IEZpbGUobG9nRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGFzc2VydFRydWUoImxvZyBmaWxlIGZvdW5kIGFmdGVyIHNwYXduIiwgbG9nRmlsZS5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4ZWNVbmtub3duT1MoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RFeGVjVW5rbm93bk9TIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4ZWNPU0ZhbWlseSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEV4ZWNPU0ZhbWlseSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjSW5jb25zaXN0ZW50U2V0dGluZ3MoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RFeGVjSW5jb25zaXN0ZW50U2V0dGluZ3MiKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9uaXRvcmVkQnVpbGQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHByaXZhdGUgVGhyZWFkIHdvcmtlcjsKKyAgICAgICAgcHJpdmF0ZSBGaWxlIG15QnVpbGRGaWxlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3QgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCB0aW1lVG9XYWl0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbG9nRmlsZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgR3JlZ29yaWFuQ2FsZW5kYXIgdGltZVN0YXJ0ZWQgPSBudWxsOworICAgICAgICBwcml2YXRlIEdyZWdvcmlhbkNhbGVuZGFyIHRpbWVGaW5pc2hlZCA9IG51bGw7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TG9nRmlsZShTdHJpbmcgbG9nRmlsZSkgeworICAgICAgICAgICAgdGhpcy5sb2dGaWxlID0gbG9nRmlsZTsKKyAgICAgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoImxvZ0ZpbGUiLCBsb2dGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpbWVUb1dhaXQoaW50IHRpbWVUb1dhaXQpIHsKKyAgICAgICAgICAgIHRoaXMudGltZVRvV2FpdCA9IHRpbWVUb1dhaXQ7CisgICAgICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJ0aW1lVG9XYWl0IiwgTG9uZy50b1N0cmluZyh0aW1lVG9XYWl0KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRCdWlsZExpc3RlbmVyKEJ1aWxkTGlzdGVuZXIgYmwpIHsKKyAgICAgICAgICAgIHByb2plY3QuYWRkQnVpbGRMaXN0ZW5lcihibCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIE1vbml0b3JlZEJ1aWxkKEZpbGUgYnVpbGRGaWxlLCBTdHJpbmcgdGFyZ2V0KSB7CisgICAgICAgICAgICBteUJ1aWxkRmlsZSA9IGJ1aWxkRmlsZTsKKyAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICAgICAgcHJvamVjdD1uZXcgUHJvamVjdCgpOworICAgICAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgICAgICBwcm9qZWN0LmluaXQoKTsKKyAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KCAiYW50LmZpbGUiICwgbXlCdWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKKyAgICAgICAgICAgIFByb2plY3RIZWxwZXIuY29uZmlndXJlUHJvamVjdChwcm9qZWN0LCBteUJ1aWxkRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGltZSBpbiBtaWxsaXMgb2YgdGhlIGJ1aWxkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgbG9uZyBnZXRUaW1lRWxhcHNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aW1lRmluaXNoZWQuZ2V0VGltZSgpLmdldFRpbWUoKSAtIHRpbWVTdGFydGVkLmdldFRpbWUoKS5nZXRUaW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICB3b3JrZXIgPSBuZXcgVGhyZWFkKHRoaXMsIG15QnVpbGRGaWxlLnRvU3RyaW5nKCkgKyAiLyIgKyB0YXJnZXQpOworICAgICAgICAgICAgd29ya2VyLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgc3RhcnRQcm9qZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UHJvamVjdCgpIHsKKyAgICAgICAgICAgIHRpbWVTdGFydGVkID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICBwcm9qZWN0LmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgICAgIHRpbWVGaW5pc2hlZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgY2xhc3MgTW9uaXRvcmVkQnVpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkuZXF1YWxzKCJzcGF3biIpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRGaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL2JvcnJvd2VkIGZyb20gVG9rZW5GaWx0ZXJUZXN0CisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZVN0cmluZyhTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICBGaWxlUmVhZGVyIHJlYWRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZmlsZW5hbWUpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZpbGVVdGlscy5yZWFkRnVsbHkocmVhZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXllT2hFeCkgeworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHJlYWRlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlSmF2YVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlSmF2YVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWUyM2JiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVKYXZhVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY05hbWVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogU2ltcGxlIHRlc3RjYXNlIGZvciB0aGUgRXhlY3V0ZUphdmEgY2xhc3MgLSBtb3N0bHkgc3RvbGVuIGZyb20KKyAqIEV4ZWN1dGVXYXRjaGRvZ1Rlc3QuCisgKgorICovCitwdWJsaWMgY2xhc3MgRXhlY3V0ZUphdmFUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRJTUVfT1VUID0gNTAwMDsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBDTE9DS19FUlJPUj0yMDA7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRJTUVfT1VUX1RFU1Q9VElNRV9PVVQtQ0xPQ0tfRVJST1I7CisKKyAgICBwcml2YXRlIEV4ZWN1dGVKYXZhIGVqOworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworICAgIHByaXZhdGUgUGF0aCBjcDsKKworICAgIHB1YmxpYyBFeGVjdXRlSmF2YVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKXsKKyAgICAgICAgZWogPSBuZXcgRXhlY3V0ZUphdmEoKTsKKyAgICAgICAgZWouc2V0VGltZW91dChuZXcgTG9uZyhUSU1FX09VVCkpOworICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKCIuIik7CisgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfSE9NRSwgU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0hPTUUpKTsKKyAgICAgICAgY3AgPSBuZXcgUGF0aChwcm9qZWN0LCBnZXRUZXN0Q2xhc3NQYXRoKCkpOworICAgICAgICBlai5zZXRDbGFzc3BhdGgoY3ApOworICAgIH0KKworICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgZ2V0Q29tbWFuZGxpbmUoaW50IHRpbWV0b3J1bikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZShUaW1lUHJvY2Vzcy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTdHJpbmcudmFsdWVPZih0aW1ldG9ydW4pKTsKKyAgICAgICAgcmV0dXJuIGNtZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UaW1lT3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IGdldENvbW1hbmRsaW5lKFRJTUVfT1VULzIpOworICAgICAgICBlai5zZXRKYXZhQ29tbWFuZChjbWQpOworICAgICAgICBlai5leGVjdXRlKHByb2plY3QpOworICAgICAgICBhc3NlcnRUcnVlKCJwcm9jZXNzIHNob3VsZCBub3QgaGF2ZSBiZWVuIGtpbGxlZCIsICFlai5raWxsZWRQcm9jZXNzKCkpOworICAgIH0KKworICAgIC8vIHRlc3QgdGhhdCB0aGUgd2F0Y2hkb2cgZW5kcyB0aGUgcHJvY2VzcworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lT3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IGdldENvbW1hbmRsaW5lKFRJTUVfT1VUKjIpOworICAgICAgICBlai5zZXRKYXZhQ29tbWFuZChjbWQpOworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBlai5leGVjdXRlKHByb2plY3QpOworICAgICAgICBsb25nIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG5vdzsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicHJvY2VzcyBzaG91bGQgaGF2ZSBiZWVuIGtpbGxlZCIsIGVqLmtpbGxlZFByb2Nlc3MoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZWxhcHNlIHRpbWUgb2YgIitlbGFwc2VkCisgICAgICAgICAgICAgICAgICAgKyIgbXMgaXMgbGVzcyB0aGFuIHRpbWVvdXQgdmFsdWUgb2YgIitUSU1FX09VVF9URVNUKyIgbXMiLAorICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgPj0gVElNRV9PVVRfVEVTVCk7CisgICAgICAgIGFzc2VydFRydWUoImVsYXBzZSB0aW1lIG9mICIrZWxhcHNlZAorICAgICAgICAgICAgICAgICAgICsiIG1zIGlzIGdyZWF0ZXIgdGhhbiBydW4gdmFsdWUgb2YgIisoVElNRV9PVVQqMikrIiBtcyIsCisgICAgICAgICAgICAgICAgICAgZWxhcHNlZCA8IFRJTUVfT1VUKjIpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdE5vVGltZU91dEZvcmtlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBnZXRDb21tYW5kbGluZShUSU1FX09VVC8yKTsKKyAgICAgICAgZWouc2V0SmF2YUNvbW1hbmQoY21kKTsKKyAgICAgICAgZWouZm9yayhjcCk7CisgICAgICAgIGFzc2VydFRydWUoInByb2Nlc3Mgc2hvdWxkIG5vdCBoYXZlIGJlZW4ga2lsbGVkIiwgIWVqLmtpbGxlZFByb2Nlc3MoKSk7CisgICAgfQorCisgICAgLy8gdGVzdCB0aGF0IHRoZSB3YXRjaGRvZyBlbmRzIHRoZSBwcm9jZXNzCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVPdXRGb3JrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy9wcm9jZXNzIGRvZXNuJ3QgZGllIHByb3Blcmx5IHVuZGVyIHRoaXMgY29tYmluYXRpb24sCisgICAgICAgIC8vdGh1cyB0ZXN0IGZhaWxzLiAgTm8gd29ya2Fyb3VuZD8KKyAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMikKKyAgICAgICAgICAgICYmIE9zLmlzRmFtaWx5KCJkb3MiKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IGdldENvbW1hbmRsaW5lKFRJTUVfT1VUKjIpOworICAgICAgICBlai5zZXRKYXZhQ29tbWFuZChjbWQpOworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBlai5mb3JrKGNwKTsKKyAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBub3c7CisgICAgICAgIGFzc2VydFRydWUoInByb2Nlc3Mgc2hvdWxkIGhhdmUgYmVlbiBraWxsZWQiLCBlai5raWxsZWRQcm9jZXNzKCkpOworCisgICAgICAgIGFzc2VydFRydWUoImVsYXBzZSB0aW1lIG9mICIrZWxhcHNlZAorICAgICAgICAgICAgICAgICAgICsiIG1zIGlzIGxlc3MgdGhhbiB0aW1lb3V0IHZhbHVlIG9mICIrVElNRV9PVVRfVEVTVCsiIG1zIiwKKyAgICAgICAgICAgICAgICAgICBlbGFwc2VkID49IFRJTUVfT1VUX1RFU1QpOworICAgICAgICBhc3NlcnRUcnVlKCJlbGFwc2UgdGltZSBvZiAiK2VsYXBzZWQKKyAgICAgICAgICAgICAgICAgICArIiBtcyBpcyBncmVhdGVyIHRoYW4gcnVuIHZhbHVlIG9mICIrKFRJTUVfT1VUKjIpKyIgbXMiLAorICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgPCBUSU1FX09VVCoyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEYW5nZXJvdXMgbWV0aG9kIHRvIG9idGFpbiB0aGUgY2xhc3NwYXRoIGZvciB0aGUgdGVzdC4gVGhpcyBpcworICAgICAqIHNldmVyZWx5IHRpZ2h0ZWQgdG8gdGhlIGJ1aWxkLnhtbCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZXN0Q2xhc3NQYXRoKCl7CisgICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLnRlc3RzIik7CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiAnYnVpbGQudGVzdHMnIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUgISIpOworICAgICAgICAgICAgY2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVdhdGNoZG9nVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVXYXRjaGRvZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmM0YTEwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVXYXRjaGRvZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgamF2YS5pby4qOworCisvKioKKyAqIFNpbXBsZSB0ZXN0Y2FzZSBmb3IgdGhlIEV4ZWN1dGVXYXRjaGRvZyBjbGFzcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFeGVjdXRlV2F0Y2hkb2dUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBUSU1FX09VVCA9IDUwMDA7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVTVF9DTEFTU1BBVEggPSBnZXRUZXN0Q2xhc3NQYXRoKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQ0xPQ0tfRVJST1I9MjAwOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgVElNRV9PVVRfVEVTVD1USU1FX09VVC1DTE9DS19FUlJPUjsKKworICAgIHByaXZhdGUgRXhlY3V0ZVdhdGNoZG9nIHdhdGNoZG9nOworCisgICAgcHVibGljIEV4ZWN1dGVXYXRjaGRvZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKXsKKyAgICAgICAgd2F0Y2hkb2cgPSBuZXcgRXhlY3V0ZVdhdGNoZG9nKFRJTUVfT1VUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEYW5nZXJvdXMgbWV0aG9kIHRvIG9idGFpbiB0aGUgY2xhc3NwYXRoIGZvciB0aGUgdGVzdC4gVGhpcyBpcworICAgICAqIHNldmVyZWx5IHRpZ2h0ZWQgdG8gdGhlIGJ1aWxkLnhtbCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZXN0Q2xhc3NQYXRoKCl7CisgICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLnRlc3RzIik7CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiAnYnVpbGQudGVzdHMnIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUgISIpOworICAgICAgICAgICAgY2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBQcm9jZXNzIGdldFByb2Nlc3MobG9uZyB0aW1ldG9ydW4pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBjbWRBcnJheSA9IHsKKyAgICAgICAgICAgIEphdmFFbnZVdGlscy5nZXRKcmVFeGVjdXRhYmxlKCJqYXZhIiksICItY2xhc3NwYXRoIiwgVEVTVF9DTEFTU1BBVEgsCisgICAgICAgICAgICBUaW1lUHJvY2Vzcy5jbGFzcy5nZXROYW1lKCksIFN0cmluZy52YWx1ZU9mKHRpbWV0b3J1bikKKyAgICAgICAgfTsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlRlc3Rpbmcgd2l0aCBjbGFzc3BhdGg6ICIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpKTsKKyAgICAgICAgcmV0dXJuIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY21kQXJyYXkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEVycm9yT3V0cHV0KFByb2Nlc3MgcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGVyciA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IElucHV0U3RyZWFtUmVhZGVyKHAuZ2V0RXJyb3JTdHJlYW0oKSkgKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlICggKGxpbmUgPSBlcnIucmVhZExpbmUoKSkgIT0gbnVsbCl7CisgICAgICAgICAgICBidWYuYXBwZW5kKGxpbmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCB3YWl0Rm9yRW5kKFByb2Nlc3MgcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCByZXRjb2RlID0gcC53YWl0Rm9yKCk7CisgICAgICAgIGlmIChyZXRjb2RlICE9IDApeworICAgICAgICAgICAgU3RyaW5nIGVyciA9IGdldEVycm9yT3V0cHV0KHApOworICAgICAgICAgICAgaWYgKGVyci5sZW5ndGgoKSA+IDApeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRVJST1I6Iik7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldGNvZGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vVGltZU91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBnZXRQcm9jZXNzKFRJTUVfT1VULzIpOworICAgICAgICB3YXRjaGRvZy5zdGFydChwcm9jZXNzKTsKKyAgICAgICAgaW50IHJldENvZGUgPSB3YWl0Rm9yRW5kKHByb2Nlc3MpOworICAgICAgICBhc3NlcnRUcnVlKCJwcm9jZXNzIHNob3VsZCBub3QgaGF2ZSBiZWVuIGtpbGxlZCIsICF3YXRjaGRvZy5raWxsZWRQcm9jZXNzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShFeGVjdXRlLmlzRmFpbHVyZShyZXRDb2RlKSk7CisgICAgfQorCisgICAgLy8gdGVzdCB0aGF0IHRoZSB3YXRjaGRvZyBlbmRzIHRoZSBwcm9jZXNzCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVPdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvY2VzcyBwcm9jZXNzID0gZ2V0UHJvY2VzcyhUSU1FX09VVCoyKTsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2F0Y2hkb2cuc3RhcnQocHJvY2Vzcyk7CisgICAgICAgIGludCByZXRDb2RlID0gcHJvY2Vzcy53YWl0Rm9yKCk7CisgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbm93OworICAgICAgICBhc3NlcnRUcnVlKCJwcm9jZXNzIHNob3VsZCBoYXZlIGJlZW4ga2lsbGVkIiwgd2F0Y2hkb2cua2lsbGVkUHJvY2VzcygpKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgIGFzc2VydFRydWUoInJldHVybiBjb2RlIGlzIGludmFsaWQ6ICIgKyByZXRDb2RlLCByZXRDb2RlIT0wKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZWxhcHNlIHRpbWUgb2YgIitlbGFwc2VkKyIgbXMgaXMgbGVzcyB0aGFuIHRpbWVvdXQgdmFsdWUgb2YgIitUSU1FX09VVF9URVNUKyIgbXMiLCBlbGFwc2VkID49IFRJTUVfT1VUX1RFU1QpOworICAgICAgICBhc3NlcnRUcnVlKCJlbGFwc2UgdGltZSBvZiAiK2VsYXBzZWQrIiBtcyBpcyBncmVhdGVyIHRoYW4gcnVuIHZhbHVlIG9mICIrKFRJTUVfT1VUKjIpKyIgbXMiLCBlbGFwc2VkIDwgVElNRV9PVVQqMik7CisgICAgfQorCisgICAgLy8gdGVzdCBhIHByb2Nlc3MgdGhhdCBydW5zIGFuZCBmYWlsZWQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IGdldFByb2Nlc3MoLTEpOyAvLyBwcm9jZXNzIHNob3VsZCBhYm9ydAorICAgICAgICB3YXRjaGRvZy5zdGFydChwcm9jZXNzKTsKKyAgICAgICAgaW50IHJldENvZGUgPSBwcm9jZXNzLndhaXRGb3IoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicHJvY2VzcyBzaG91bGQgbm90IGhhdmUgYmVlbiBraWxsZWQiLCAhd2F0Y2hkb2cua2lsbGVkUHJvY2VzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmV0dXJuIGNvZGUgaXMgaW52YWxpZDogIiArIHJldENvZGUsIHJldENvZGUhPTApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYW51YWxTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFByb2Nlc3MgcHJvY2VzcyA9IGdldFByb2Nlc3MoVElNRV9PVVQqMik7CisgICAgICAgIHdhdGNoZG9nLnN0YXJ0KHByb2Nlc3MpOworCisgICAgICAgIC8vIEkgYXNzdW1lIHRoYXQgc3RhcnRpbmcgdGhpcyB0YWtlcyBsZXNzIHRoYW4gVElNRV9PVVQvMiBtcy4uLgorICAgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy53YWl0Rm9yKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgdmVyeSBuaWNlIGJ1dCB3aWxsIGRvIHRoZSBqb2IKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoInByb2Nlc3MgaW50ZXJydXB0ZWQgaW4gdGhyZWFkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRocmVhZC5zdGFydCgpOworCisgICAgICAgIC8vIHdhaXQgZm9yIFRJTUVfT1VULzIsIHRoZXJlIHNob3VsZCBiZSBhYm91dCBUSU1FX09VVC8yIG1zIHJlbWFpbmluZyBiZWZvcmUgdGltZW91dAorICAgICAgICB0aHJlYWQuam9pbihUSU1FX09VVC8yKTsKKworICAgICAgICAgLy8gbm93IHN0b3AgdGhlIHdhdGNoZG9nLgorICAgICAgICB3YXRjaGRvZy5zdG9wKCk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBkaWUsIHNob3VsZCBiZSB0aGUgZW5kIG9mIHRoZSBwcm9jZXNzCisgICAgICAgIHRocmVhZC5qb2luKCk7CisKKyAgICAgICAgLy8gcHJvY2VzcyBzaG91bGQgYmUgZGVhZCBhbmQgd2VsbCBmaW5pc2hlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcHJvY2Vzcy5leGl0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoInByb2Nlc3Mgc2hvdWxkIG5vdCBoYXZlIGJlZW4ga2lsbGVkIiwgIXdhdGNoZG9nLmtpbGxlZFByb2Nlc3MoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZhaWxUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmFpbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI4ZmJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZhaWxUZXN0LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgRmFpbFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBGYWlsVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmFpbC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0MSIsCisgICAgICAgICAgICAgICAgIml0IGlzIHJlcXVpcmVkIHRvIGZhaWwgOi0pIiwKKyAgICAgICAgICAgICAgICAiTm8gbWVzc2FnZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsCisgICAgICAgICAgICAiaXQgaXMgcmVxdWlyZWQgdG8gZmFpbCA6LSkiLAorICAgICAgICAgICAgInRlc3QyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRleHQoKSB7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInRlc3RUZXh0IiwKKyAgICAgICAgICAgICJpdCBpcyByZXF1aXJlZCB0byBmYWlsIDotKSIsCisgICAgICAgICAgICAidGVzdFRleHQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWYoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0SWYiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGZhaWwoImZvbyBoYXMgbm90IGJlZW4gZGVmaW5lZCwgdGVzdElmIG11c3Qgbm90IGZhaWwiKTsKKyAgICAgICAgfQorICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJmb28iLCAiIik7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0SWYiLCAidGVzdElmIG11c3QgZmFpbCBpZiBmb28gaGFzIGJlZW4gc2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVubGVzcygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3RVbmxlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdFVubGVzcyBtdXN0IGZhaWwgdW5sZXNzIGZvbyBoYXMgYmVlbiBzZXQiKTsKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiZm9vIiwgIiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFVubGVzcyIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgZmFpbCgiZm9vIGhhcyBiZWVuIGRlZmluZWQsIHRlc3RVbmxlc3MgbXVzdCBub3QgZmFpbCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHRoYXQgdGhlIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgd29yaywgYW5kCisgICAgICogdGhhdCB0aGUgYXV0b2dlbmVyYXRlZCB0ZXh0IGNvbnRhaW5zIGluZm9ybWF0aW9uCisgICAgICogYWJvdXQgd2hpY2ggY29uZGl0aW9uIHdhcyBub3QgbWV0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElmQW5kVW5sZXNzKCkgeworICAgICAgICAvL25laXRoZXIKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdElmQW5kVW5sZXNzIik7CisgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoImlmIiwgIiIpOworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RJZkFuZFVubGVzcyIsCisgICAgICAgICAgICAgICAgImV4cGVjdCBmYWlsIG9uIGRlZmluZWQoaWYpIiwKKyAgICAgICAgICAgICAgICAiaWY9aWYgYW5kIHVubGVzcz11bmxlc3MiKTsKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgidW5sZXNzIiwgIiIpOworICAgICAgICAvL3RoaXMgY2FsbCBzaG91bGQgc3VjY2VlZCBhcyB1bmxlc3Mgb3ZlcnJpZGVzIGlmCisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RJZkFuZFVubGVzcyIpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBzZWUgdGhhdCB0aGUgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyB3b3JrLCBhbmQKKyAgICAgKiB0aGF0IHRoZSBhdXRvZ2VuZXJhdGVkIHRleHQgY29udGFpbnMgaW5mb3JtYXRpb24KKyAgICAgKiBhYm91dCB3aGljaCBjb25kaXRpb24gd2FzIG5vdCBtZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWZBbmRVbmxlc3MyKCkgeworICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJ1bmxlc3MiLCAiIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0SWZBbmRVbmxlc3MiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGZhaWwoImRlZmluZWQoaWYpICYmICFkZWZpbmVkKHVubGVzcyk7IHRlc3RJZkFuZFVubGVzcyBtdXN0IG5vdCBmYWlsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkMSgpIHsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidGVzdE5lc3RlZDEiLAorICAgICAgICAgICAgIml0IGlzIHJlcXVpcmVkIHRvIGZhaWwgOi0pIiwKKyAgICAgICAgICAgICJjb25kaXRpb24gc2F0aXNmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZDIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0TmVzdGVkMiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgZmFpbCgiY29uZGl0aW9uIG5vdCBzYXRpc2ZpZWQ7IHRlc3ROZXN0ZWQyIG11c3Qgbm90IGZhaWwiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWQzKCkgeworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ0ZXN0TmVzdGVkMyIsCisgICAgICAgICAgICAiaXQgaXMgcmVxdWlyZWQgdG8gZmFpbCA6LSkiLAorICAgICAgICAgICAgInRlc3ROZXN0ZWQzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZDQoKSB7CisgICAgICAgIFN0cmluZyBzcGVjaWZpY01lc3NhZ2UgPSAiTmVzdGVkIGNvbmRpdGlvbnMgIgorICAgICAgICAgICsgIm5vdCBwZXJtaXR0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCBpZi91bmxlc3MgYXR0cmlidXRlcyI7CisKKyAgICAgICAgY2hhcltdIGMgPSB7J2EnLCAnYicsICdjJ307CisgICAgICAgIFN0cmluZ0J1ZmZlciB0YXJnZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCJ0ZXN0TmVzdGVkNHgiKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRhcmdldC5zZXRDaGFyQXQodGFyZ2V0Lmxlbmd0aCgpIC0gMSwgY1tpXSk7CisgICAgICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKHRhcmdldC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICJpdCBpcyByZXF1aXJlZCB0byBmYWlsIDotKSIsIHNwZWNpZmljTWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkNSgpIHsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidGVzdE5lc3RlZDUiLAorICAgICAgICAgICAgIml0IGlzIHJlcXVpcmVkIHRvIGZhaWwgOi0pIiwKKyAgICAgICAgICAgICJPbmx5IG9uZSBuZXN0ZWQgY29uZGl0aW9uIGlzIGFsbG93ZWQuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZDYoKSB7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInRlc3ROZXN0ZWQ2IiwKKyAgICAgICAgICAgICJpdCBpcyByZXF1aXJlZCB0byBmYWlsIDotKSIsCisgICAgICAgICAgICAidGVzdE5lc3RlZDZcbnRlc3ROZXN0ZWQ2XG50ZXN0TmVzdGVkNiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWQ3KCkgeworICAgICAgICBTdHJpbmcgc3BlY2lmaWNNZXNzYWdlID0gIkEgc2luZ2xlIG5lc3RlZCBjb25kaXRpb24gaXMgcmVxdWlyZWQuIjsKKworICAgICAgICBjaGFyW10gYyA9IHsnYScsICdiJ307CisgICAgICAgIFN0cmluZ0J1ZmZlciB0YXJnZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCJ0ZXN0TmVzdGVkN3giKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRhcmdldC5zZXRDaGFyQXQodGFyZ2V0Lmxlbmd0aCgpIC0gMSwgY1tpXSk7CisgICAgICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKHRhcmdldC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICJpdCBpcyByZXF1aXJlZCB0byBmYWlsIDotKSIsIHNwZWNpZmljTWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaWx0ZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTllZmIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIEZpbHRlclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBGaWx0ZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXIueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QxIiwgInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QyIiwgInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QzIiwgInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMDAwIiwKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbHRlcmVkRmlsZSgiNSIsICJmaWx0ZXJlZC50bXAiKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMDAwIiwKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbHRlcmVkRmlsZSgiNiIsICJ0YXNrZGVmcy50bXAvZmlsdGVyMS50eHQiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDcoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q3Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiPCVAIGluY2x1ZGUgZmlsZT1cInJvb3Qvc29tZS9pbmNsdWRlLmpzcFwiJT4iLAorICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsdGVyZWRGaWxlKCI3IiwgImZpbHRlcmVkLnRtcCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0OCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI8JUAgaW5jbHVkZSBmaWxlPVwicm9vdC9zb21lL2luY2x1ZGUuanNwXCIlPiIsCisgICAgICAgICAgICAgICAgICAgICBnZXRGaWx0ZXJlZEZpbGUoIjgiLCAidGFza2RlZnMudG1wL2ZpbHRlcjIudHh0IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImluY2x1ZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0RmlsdGVyZWRGaWxlKCI5IiwgInRhc2tkZWZzLnRtcC9maWx0ZXIzLnR4dCIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRGaWx0ZXJlZEZpbGUoU3RyaW5nIHRlc3ROdW1iZXIsIFN0cmluZyBmaWx0ZXJlZEZpbGUpIHsKKworICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgZmlsdGVyZWRGaWxlKTsKKyAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7CisgICAgICAgICAgICBmYWlsKCJmaWx0ZXIgdGVzdCIrdGVzdE51bWJlcisiIGZhaWxlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmKSk7CisgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgeworICAgICAgICAgICAgICAgIGZhaWwoImZpbHRlciB0ZXN0Iit0ZXN0TnVtYmVyKyIgZmFpbGVkLCBmaWx0ZXJlZCBmaWxlOiAiICsgZi50b1N0cmluZygpICsgIiBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGluZSA9IGluLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIGZhaWwoImZpbHRlciB0ZXN0Iit0ZXN0TnVtYmVyKyIgZmFpbGVkLiAgSU9FeGNlcHRpb24gd2hpbGUgcmVhZGluZyBmaWx0ZXJlZCBmaWxlOiAiICsgaW9lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICByZXR1cm4gbGluZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRml4Q3JMZlRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaXhDckxmVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjJjYjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRml4Q3JMZlRlc3QuamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIEZpeENyTGZUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgRml4Q3JMZlRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvYnVpbGQueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDYiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q3Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0OCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjTGluZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0TWFjTGluZXMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9PdmVyd3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9PdmVyd3JpdGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RW5jb2RpbmciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0T3V0cHV0RW5jb2RpbmciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ0xpbmVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdExvbmdMaW5lcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDckNyTGZTZXF1ZW5jZVVuaXgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Q3JDckxmU2VxdWVuY2UtdW5peCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDckNyTGZTZXF1ZW5jZURvcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDckNyTGZTZXF1ZW5jZS1kb3MiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JDckxmU2VxdWVuY2VNYWMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Q3JDckxmU2VxdWVuY2UtbWFjIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpeGxhc3REb3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Rml4bGFzdERvcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhsYXN0RmFsc2VNYWMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Rml4bGFzdEZhbHNlTWFjIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpeEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpeEZpbGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4RmlsZUV4Y2x1c2l2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RGaXhGaWxlRXhjbHVzaXZlIiwKKyAgICAgICAgICAgICAgICBGaXhDUkxGLkVSUk9SX0ZJTEVfQU5EX1NSQ0RJUiwgRml4Q1JMRi5FUlJPUl9GSUxFX0FORF9TUkNESVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1Z3ppbGxhIFJlcG9ydCAyMDg0MAorICAgICAqCisgICAgICogV2lsbCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMgZG8gbm90CisgICAgICogZ2V0IGNyZWF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVBhcmVudERpcnMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNyZWF0ZVBhcmVudERpcnMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlc2VydmVMYXN0TW9kaWZpZWQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RQcmVzZXJ2ZUxhc3RNb2RpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIxKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyMSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyMiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyMyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXI0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyNCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXI1KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyNSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXI2KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyNiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXI3KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyNyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXI4KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyOCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXI5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyOSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3REb3VibGVFb2YoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDYW5ub3REb3VibGVFb2YiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFiSW5MaXRlcmFsSW5Db21tZW50KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0VGFiSW5MaXRlcmFsSW5Db21tZW50Iik7CisgICAgfQorCisgICAgLy8gbm90IHVzZWQsIGJ1dCBwdWJsaWMgc28gdGhlb3JldGljYWxseSBtdXN0IHJlbWFpbiBmb3IgQkM/CisgICAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxDb250ZW50KEZpbGUgZXhwZWN0LCBGaWxlIHJlc3VsdCkKKyAgICAgICAgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKSB7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBmaWxlICIrcmVzdWx0KyIgZG9lc25cJ3QgZXhpc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0U3RyZWFtIGluRXhwZWN0ID0gbnVsbDsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5SZXN1bHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5FeHBlY3QgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGV4cGVjdCkpOworICAgICAgICAgICAgaW5SZXN1bHQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHJlc3VsdCkpOworCisgICAgICAgICAgICBpbnQgZXhwZWN0ZWRCeXRlID0gaW5FeHBlY3QucmVhZCgpOworICAgICAgICAgICAgd2hpbGUgKGV4cGVjdGVkQnl0ZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEJ5dGUsIGluUmVzdWx0LnJlYWQoKSk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlID0gaW5FeHBlY3QucmVhZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFbmQgb2YgZmlsZSIsIC0xLCBpblJlc3VsdC5yZWFkKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGluUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpblJlc3VsdC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluRXhwZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbkV4cGVjdC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1VuemlwVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dVbnppcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E4MTk2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dVbnppcFRlc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBHVW56aXBUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHVibGljIEdVbnppcFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d1bnppcC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAiYXR0cmlidXRlIHNyYyBpbnZhbGlkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWxUZXN0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0UmVhbFRlc3QoInJlYWxUZXN0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWxUZXN0V2l0aFJlc291cmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0UmVhbFRlc3QoInJlYWxUZXN0V2l0aFJlc291cmNlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RSZWFsVGVzdChTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMocHJvamVjdC5yZXNvbHZlRmlsZSgiLi4vYXNmLWxvZ28uZ2lmIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5yZXNvbHZlRmlsZSgiYXNmLWxvZ28uZ2lmIikpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEd6aXBUYXNrKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0UmVhbFRlc3QoInRlc3RHemlwVGFzayIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb2N1bWVudGF0aW9uQ2xhaW1zT25Db3B5KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0UmVhbFRlc3QoInRlc3REb2N1bWVudGF0aW9uQ2xhaW1zT25Db3B5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dldFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwMWQwZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HZXRUZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBHZXRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgR2V0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ2V0LnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NCIsICJzcmMgaW52YWxpZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDUiLCAiZGVzdCBpbnZhbGlkIChvciBubyBodHRwLXNlcnZlciBvbiBsb2NhbCBtYWNoaW5lKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VUaW1lc3RhbXAoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RVc2VUaW1lc3RhbXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlVG9tb3Jyb3coKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RVc2VUb21vcnJvdyIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0d6aXBUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR3ppcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQyNmZhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0d6aXBUZXN0LmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBHemlwVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIEd6aXBUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9nemlwLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDMiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDQiLCAiemlwZmlsZSBtdXN0IG5vdCBwb2ludCB0byBhIGRpcmVjdG9yeSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHWmlwKCl7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlYWxUZXN0Iik7CisgICAgICAgIFN0cmluZyBsb2cgPSBnZXRMb2coKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIG1lc3NhZ2Ugc3RhcnRpbmcgd2l0aCAnQnVpbGRpbmc6JyBidXQgZ290ICciCisgICAgICAgICAgICArIGxvZyArICInIiwgbG9nLnN0YXJ0c1dpdGgoIkJ1aWxkaW5nOiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIG1lc3NhZ2UgZW5kaW5nIHdpdGggJ2FzZi1sb2dvLmdpZi5neicgYnV0IGdvdCAnIgorICAgICAgICAgICAgKyBsb2cgKyAiJyIsIGxvZy5lbmRzV2l0aCgiYXNmLWxvZ28uZ2lmLmd6IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZSgpeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWFsVGVzdFdpdGhSZXNvdXJjZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlQ2hlY2soKXsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdERhdGVDaGVjayIpOworICAgICAgICBTdHJpbmcgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAiRXhwZWN0aW5nIG1lc3NhZ2UgZW5kaW5nIHdpdGggJ2FzZi1sb2dvLmdpZi5neiBpcyB1cCB0byBkYXRlLicgYnV0IGdvdCAnIiArIGxvZyArICInIiwKKyAgICAgICAgICAgIGxvZy5lbmRzV2l0aCgiYXNmLWxvZ28uZ2lmLmd6IGlzIHVwIHRvIGRhdGUuIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCl7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9JbXBvcnRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW1wb3J0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGQwNWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW1wb3J0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTG9jYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBvcnRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgSW1wb3J0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlSW1wb3J0KCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0LnhtbCIpOworICAgICAgICBhc3NlcnRMb2dDb250YWluaW5nKCJCZWZvcmUgaW1wb3J0SW4gaW1wb3J0ZWQgdG9wQWZ0ZXIgaW1wb3J0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVubmFtZWROZXN0aW5nKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvdW5uYW1lZEltcG9ydC54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICBTdHJpbmcgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGFzc2VydFRydWUoIldhcm5pbmdzIGxvZ2dlZCB3aGVuIG5vdCBleHBlY3RlZDogIiArIGxvZywKKyAgICAgICAgICAgICAgICAgICAgbG9nLmxlbmd0aCgpID09IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWwoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvc2VyaWFsLnhtbCIpOworICAgICAgICBhc3NlcnRMb2dDb250YWluaW5nKCJVbm5hbWVkMi54bWxVbm5hbWVkMS54bWwiKTsKKyAgICAgICAgU3RyaW5nIGZ1bGxMb2cgPSBnZXRGdWxsTG9nKCk7CisgICAgICAgIFN0cmluZyBzdWJzdHJpbmcgPSAiU2tpcHBlZCBhbHJlYWR5IGltcG9ydGVkIGZpbGUiOworICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RpbmcgZnVsbCBsb2cgdG8gY29udGFpbiBcIiIgKyBzdWJzdHJpbmcKKyAgICAgICAgICAgICsgIlwiIGZ1bGwgbG9nIHdhcyBcIiIgKyBmdWxsTG9nICsgIlwiIiwKKyAgICAgICAgICAgIGZ1bGxMb2cuaW5kZXhPZihzdWJzdHJpbmcpID49IDApOworICAgIH0KKworICAgIC8vIGFsbG93IHRoaXMgYXMgaW1wb3J0ZWQgaW4gdGFyZ2V0cyBhcmUgb25seSB0ZXN0ZWQgd2hlbiBhIHRhcmdldCBpcyBydW4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0SW5UYXJnZXROb0VmZmVjdCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnRhcmdldC54bWwiKTsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgibm8taW1wb3J0IiwgImZvbyIpOworICAgICAgICBhc3NlcnRUcnVlKG51bGwgPT0gZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiYmF6IikpOworICAgIH0KKworICAgIC8vIGRlYWN0aXZhdGUgdGhpcyB0ZXN0IGFzIGltcG9ydHMgd2l0aGluIHRhcmdldHMgYXJlIG5vdCBhbGxvd2VkCisgICAgcHVibGljIHZvaWQgbm90VGVzdEltcG9ydEluVGFyZ2V0V2l0aEVmZmVjdCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnRhcmdldC54bWwiKTsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoImRvLWltcG9ydCIsICJmb28iLCAiYmFyIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiYmF6IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRJblRhcmdldE5vdEFsbG93ZWQoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoCisgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnRhcmdldC54bWwiKTsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKAorICAgICAgICAgICAgImRvLWltcG9ydCIsICJub3QgYSB0b3AgbGV2ZWwgdGFzayIsCisgICAgICAgICAgICAiaW1wb3J0IG9ubHkgYWxsb3dlZCBhcyBhIHRvcC1sZXZlbCB0YXNrIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydEluU2VxdWVudGlhbCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgKKyAgICAgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGluc2VxdWVudGlhbC54bWwiKTsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoIndpdGhpbi1pbXBvcnRlZCIsICJmb28iLCAiYmFyIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiYmF6IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRTYW1lVGFyZ2V0cygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoCisgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zYW1lX3RhcmdldC54bWwiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5kZXhPZigiRHVwbGljYXRlIHRhcmdldCIpID09IC0xKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBzZWUgJ0R1cGxpY2F0ZSB0YXJnZXQnIGluICciICsgbWVzc2FnZSArIiciLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICJEaWQgbm90IHNlZSBidWlsZCBleGNlcHRpb24iLAorICAgICAgICAgICAgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRFcnJvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoCisgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnRfYmFkX2ltcG9ydC54bWwiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvY2F0aW9uIGxvID0gZXguZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgImV4cGVjdGVkIGxvY2F0aW9uIG9mIGJ1aWxkIGV4Y2VwdGlvbiB0byBiZSBzZXQiLAorICAgICAgICAgICAgICAgIChsbyAhPSBudWxsKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJleHBlY3RlZCBsb2NhdGlvbiB0byBjb250YWluIGNhbGxpbmcgZmlsZSIsCisgICAgICAgICAgICAgICAgbG8uZ2V0RmlsZU5hbWUoKS5pbmRleE9mKCJpbXBvcnRfYmFkX2ltcG9ydC54bWwiKSAhPSAtMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJleHBlY3RlZCBtZXNzYWdlIG9mIGV4IHRvIGNvbnRhaW4gY2FsbGVkIGZpbGUiLAorICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCJiYWQueG1sIikgIT0gLTEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAiRGlkIG5vdCBzZWUgYnVpbGQgZXhjZXB0aW9uIiwKKyAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ltbGlua2VkSW1wb3J0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbG4gPSAiL3Vzci9iaW4vbG4iOworICAgICAgICBpZiAoIW5ldyBGaWxlKGxuKS5leGlzdHMoKSkgeworICAgICAgICAgICAgbG4gPSAiL2Jpbi9sbiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFuZXcgRmlsZShsbikuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIC8vIFJ1bm5pbmcgb24gV2luZG93cyBvciBzb21ldGhpbmcsIHNvIHNraXAgaXQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHN5bWxpbmsgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QzYiI7CisgICAgICAgIEZpbGUgc3ltbGlua0ZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgc3ltbGluayk7CisgICAgICAgIGlmIChSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKG5ldyBTdHJpbmdbXSB7bG4sICItcyIsICJkM2EiLCBzeW1saW5rRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0pLndhaXRGb3IoKSAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIiciICsgbG4gKyAiIC1zIGQzYSAiICsgc3ltbGluayArICInIGZhaWxlZCIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25maWd1cmVQcm9qZWN0KAorICAgICAgICAgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDEvcDEueG1sIik7CisgICAgICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscygKKyAgICAgICAgICAgICAgICAiYW50LmZpbGUucDIiLAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QyL3AyLnhtbCIpCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKAorICAgICAgICAgICAgICAgICJhbnQuZmlsZS5wMyIsCisgICAgICAgICAgICAgICAgbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDNiL3AzLnhtbCIpCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN5bWxpbmtGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRhcmdldEZpcnN0KCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0dGFyZ2V0Zmlyc3QueG1sIik7CisgICAgICAgIGFzc2VydExvZ0NvbnRhaW5pbmcoIkltcG9ydGluZyB0YXJnZXRmaXJzdEFmdGVyIHRhcmdldCBmaXJzdEFmdGVyIGltcG9ydGluZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJnZXROYW1lKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvYy54bWwiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Jbml0aWFsaXplQ2xhc3NUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW5pdGlhbGl6ZUNsYXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTRlMTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW5pdGlhbGl6ZUNsYXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICogVGVzdCB0byBzZWUgaWYgc3RhdGljIGluaXRpYWxpemVycyBhcmUgaW52b2tlZCB0aGUgc2FtZSB3YXkKKyAqIHdoZW4gPGphdmE+IGlzIGludm9rZWQgaW4gZm9ya2VkIGFuZCB1bmZvcmtlZCBtb2Rlcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJbml0aWFsaXplQ2xhc3NUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJpdmF0ZSBGaWxlIGYxID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mb3JrZWRvdXQiKTsKKyAgICBwcml2YXRlIEZpbGUgZjIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VuZm9ya2Vkb3V0Iik7CisKKyAgICBwdWJsaWMgSW5pdGlhbGl6ZUNsYXNzVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW5pdGlhbGl6ZWNsYXNzLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbGwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJmb3JrZWQiKTsKKyAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBTeXN0ZW0ub3V0OworICAgICAgICBQcmludFN0cmVhbSBuZXdwcyA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmMikpOworICAgICAgICBTeXN0ZW0uc2V0T3V0KG5ld3BzKTsKKyAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KCJ1bmZvcmtlZCIpOworICAgICAgICBTeXN0ZW0uc2V0T3V0KHBzKTsKKyAgICAgICAgbmV3cHMuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRm9ya2VkIC0gbm9uLWZvcmtlZCBtaXNtYXRjaCIsIEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhmMSwgZjIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZjEuZGVsZXRlKCk7CisgICAgICAgIGYyLmRlbGV0ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9JbnB1dFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9JbnB1dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJkYzBjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0lucHV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuUHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyOworCisKK3B1YmxpYyBjbGFzcyBJbnB1dFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBJbnB1dFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2lucHV0LnhtbCIpOworICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpCisgICAgICAgICAgICAucHV0KFByb3BlcnR5RmlsZUlucHV0SGFuZGxlci5GSUxFX05BTUVfS0VZLAorICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImlucHV0LnByb3BlcnRpZXMiKQorICAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0SW5wdXRIYW5kbGVyKG5ldyBQcm9wZXJ0eUZpbGVJbnB1dEhhbmRsZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInRlc3QzIiwgImludmFsaWQgaW5wdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBpbnZhbGlkIGlucHV0IHRlc3QgZm9yIFwnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0S2V5KCJBbGwgZGF0YSBpcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZ29pbmcgdG8gYmUgZGVsZXRlZCBmcm9tIERCIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb250aW51ZT8iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwnIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7CisgICAgICAgIGFzc2VydEVxdWFscygic2NvdHQiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJkYi51c2VyIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUZpbGVJbmxpbmVIYW5kbGVyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UHJvcGVydHlGaWxlSW5saW5lSGFuZGxlciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0SW5saW5lSGFuZGxlcigpIHsKKyAgICAgICAgc3RkaW4oKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdERlZmF1bHRJbmxpbmVIYW5kbGVyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdyZWVkeUlubGluZUhhbmRsZXIoKSB7CisgICAgICAgIHN0ZGluKCk7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RHcmVlZHlJbmxpbmVIYW5kbGVyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdyZWVkeUlubGluZUhhbmRsZXJDbGFzc25hbWUoKSB7CisgICAgICAgIHN0ZGluKCk7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RHcmVlZHlJbmxpbmVIYW5kbGVyQ2xhc3NuYW1lIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdyZWVkeUlubGluZUhhbmRsZXJSZWZpZCgpIHsKKyAgICAgICAgc3RkaW4oKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEdyZWVkeUlubGluZUhhbmRsZXJSZWZpZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGRpbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRJbihuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiaW5wdXQuc3RkaW4iKSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICA/IChSdW50aW1lRXhjZXB0aW9uKSBlIDogbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGtleTsgLy8gWFhYIHdoYXQgaXMgdGhpcyBmb3I/CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmFyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmIxZjViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phclRlc3QuamF2YQpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqLworcHVibGljIGNsYXNzIEphclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcEphciA9ICJ0bXAuamFyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcERpciA9ICJqYXJ0bXAvIjsKKyAgICBwcml2YXRlIFJlYWRlciByMSwgcjI7CisKKyAgICBwdWJsaWMgSmFyVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamFyLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBpZiAocjEgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByMS5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyMiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHIyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJtYW5pZmVzdCBmaWxlIGRvZXMgbm90IGV4aXN0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJVbnJlY29nbml6ZWQgd2hlbmVtcHR5IGF0dHJpYnV0ZTogZm9ybWF0IEM6IC95Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7CisgICAgICAgIEZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgdGVtcEphcik7CisgICAgICAgIGFzc2VydFRydWUoamFyRmlsZS5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vUmVjcmVhdGVXaXRob3V0VXBkYXRlKCkgeworICAgICAgICB0ZXN0Tm9SZWNyZWF0ZSgidGVzdDQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZWNyZWF0ZVdpdGhVcGRhdGUoKSB7CisgICAgICAgIHRlc3ROb1JlY3JlYXRlKCJ0ZXN0Tm9SZWNyZWF0ZVdpdGhVcGRhdGUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdE5vUmVjcmVhdGUoU3RyaW5nIHNlY29uZFRhcmdldCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOworICAgICAgICBGaWxlIGphckZpbGUgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIHRlbXBKYXIpOworICAgICAgICBsb25nIGphck1vZGlmaWVkRGF0ZSA9IGphckZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjUwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSAvLyBlbmQgb2YgdHJ5LWNhdGNoCisgICAgICAgIGV4ZWN1dGVUYXJnZXQoc2Vjb25kVGFyZ2V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXIgaGFzIG5vdCBiZWVuIHJlY3JlYXRlZCBpbiAiICsgc2Vjb25kVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgamFyTW9kaWZpZWREYXRlLCBqYXJGaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjcmVhdGVXaXRob3V0VXBkYXRlQWRkaXRpb25hbEZpbGVzKCkgeworICAgICAgICB0ZXN0UmVjcmVhdGUoInRlc3Q0IiwgInRlc3RSZWNyZWF0ZVdpdGhvdXRVcGRhdGVBZGRpdGlvbmFsRmlsZXMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjcmVhdGVXaXRoVXBkYXRlQWRkaXRpb25hbEZpbGVzKCkgeworICAgICAgICB0ZXN0UmVjcmVhdGUoInRlc3Q0IiwgInRlc3RSZWNyZWF0ZVdpdGhVcGRhdGVBZGRpdGlvbmFsRmlsZXMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjcmVhdGVXaXRob3V0VXBkYXRlTmV3ZXJGaWxlKCkgeworICAgICAgICB0ZXN0UmVjcmVhdGUoInRlc3RSZWNyZWF0ZU5ld2VyRmlsZVNldHVwIiwKKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0UmVjcmVhdGVXaXRob3V0VXBkYXRlTmV3ZXJGaWxlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY3JlYXRlV2l0aFVwZGF0ZU5ld2VyRmlsZSgpIHsKKyAgICAgICAgdGVzdFJlY3JlYXRlKCJ0ZXN0UmVjcmVhdGVOZXdlckZpbGVTZXR1cCIsCisgICAgICAgICAgICAgICAgICAgICAidGVzdFJlY3JlYXRlV2l0aFVwZGF0ZU5ld2VyRmlsZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVjcmVhdGUoU3RyaW5nIGZpcnN0VGFyZ2V0LCBTdHJpbmcgc2Vjb25kVGFyZ2V0KSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoZmlyc3RUYXJnZXQpOworICAgICAgICBsb25nIHNsZWVwdGltZSA9IDMwMDAKKyAgICAgICAgICAgICsgRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcHRpbWUpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gLy8gZW5kIG9mIHRyeS1jYXRjaAorICAgICAgICBGaWxlIGphckZpbGUgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksIHRlbXBKYXIpOworICAgICAgICBsb25nIGphck1vZGlmaWVkRGF0ZSA9IGphckZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoc2Vjb25kVGFyZ2V0KTsKKyAgICAgICAgamFyRmlsZSA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgdGVtcEphcik7CisgICAgICAgIGFzc2VydFRydWUoImphciBoYXMgYmVlbiByZWNyZWF0ZWQgaW4gIiArIHNlY29uZFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICBqYXJNb2RpZmllZERhdGUgPCBqYXJGaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFuaWZlc3RTdGF5c0ludGFjdCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTWFuaWZlc3RFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0TWFuaWZlc3RTdGF5c0ludGFjdCIpOworCisgICAgICAgIHIxID0gbmV3IEZpbGVSZWFkZXIoZ2V0UHJvamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVGaWxlKHRlbXBEaXIgKyAibWFuaWZlc3QiKSk7CisgICAgICAgIHIyID0gbmV3IEZpbGVSZWFkZXIoZ2V0UHJvamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVGaWxlKHRlbXBEaXIgKyAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSk7CisgICAgICAgIE1hbmlmZXN0IG1mMSA9IG5ldyBNYW5pZmVzdChyMSk7CisgICAgICAgIE1hbmlmZXN0IG1mMiA9IG5ldyBNYW5pZmVzdChyMik7CisgICAgICAgIGFzc2VydEVxdWFscyhtZjEsIG1mMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vUmVjcmVhdGVCYXNlZGlyRXhjbHVkZXNXaXRoVXBkYXRlKCkgeworICAgICAgICB0ZXN0Tm9SZWNyZWF0ZSgidGVzdE5vUmVjcmVhdGVCYXNlZGlyRXhjbHVkZXNXaXRoVXBkYXRlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vUmVjcmVhdGVCYXNlZGlyRXhjbHVkZXNXaXRob3V0VXBkYXRlKCkgeworICAgICAgICB0ZXN0Tm9SZWNyZWF0ZSgidGVzdE5vUmVjcmVhdGVCYXNlZGlyRXhjbHVkZXNXaXRob3V0VXBkYXRlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vUmVjcmVhdGVaaXBmaWxlc2V0RXhjbHVkZXNXaXRoVXBkYXRlKCkgeworICAgICAgICB0ZXN0Tm9SZWNyZWF0ZSgidGVzdE5vUmVjcmVhdGVaaXBmaWxlc2V0RXhjbHVkZXNXaXRoVXBkYXRlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vUmVjcmVhdGVaaXBmaWxlc2V0RXhjbHVkZXNXaXRob3V0VXBkYXRlKCkgeworICAgICAgICB0ZXN0Tm9SZWNyZWF0ZSgidGVzdE5vUmVjcmVhdGVaaXBmaWxlc2V0RXhjbHVkZXNXaXRob3V0VXBkYXRlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY3JlYXRlWmlwZmlsZXNldFdpdGhvdXRVcGRhdGVBZGRpdGlvbmFsRmlsZXMoKSB7CisgICAgICAgIHRlc3RSZWNyZWF0ZSgidGVzdDQiLAorICAgICAgICAgICAgICAgICAgICAgInRlc3RSZWNyZWF0ZVppcGZpbGVzZXRXaXRob3V0VXBkYXRlQWRkaXRpb25hbEZpbGVzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY3JlYXRlWmlwZmlsZXNldFdpdGhVcGRhdGVBZGRpdGlvbmFsRmlsZXMoKSB7CisgICAgICAgIHRlc3RSZWNyZWF0ZSgidGVzdDQiLAorICAgICAgICAgICAgICAgICAgICAgInRlc3RSZWNyZWF0ZVppcGZpbGVzZXRXaXRoVXBkYXRlQWRkaXRpb25hbEZpbGVzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY3JlYXRlWmlwZmlsZXNldFdpdGhvdXRVcGRhdGVOZXdlckZpbGUoKSB7CisgICAgICAgIHRlc3RSZWNyZWF0ZSgidGVzdFJlY3JlYXRlTmV3ZXJGaWxlU2V0dXAiLAorICAgICAgICAgICAgICAgICAgICAgInRlc3RSZWNyZWF0ZVppcGZpbGVzZXRXaXRob3V0VXBkYXRlTmV3ZXJGaWxlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY3JlYXRlWmlwZmlsZXNldFdpdGhVcGRhdGVOZXdlckZpbGUoKSB7CisgICAgICAgIHRlc3RSZWNyZWF0ZSgidGVzdFJlY3JlYXRlTmV3ZXJGaWxlU2V0dXAiLAorICAgICAgICAgICAgICAgICAgICAgInRlc3RSZWNyZWF0ZVppcGZpbGVzZXRXaXRoVXBkYXRlTmV3ZXJGaWxlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdpdGhFbXB0eUZpbGVzZXQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDcmVhdGVXaXRoRW1wdHlGaWxlc2V0U2V0VXAiKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENyZWF0ZVdpdGhFbXB0eUZpbGVzZXQiKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENyZWF0ZVdpdGhFbXB0eUZpbGVzZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSWZPbmx5TWFuaWZlc3RIYXNDaGFuZ2VkKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0VXBkYXRlSWZPbmx5TWFuaWZlc3RIYXNDaGFuZ2VkIik7CisgICAgICAgIEZpbGUgamFyWG1sID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKHRlbXBEaXIgKyAiamFyLnhtbCIpOworICAgICAgICBhc3NlcnRUcnVlKGphclhtbC5leGlzdHMoKSk7CisgICAgfQorCisgICAgLy8gYnVnemlsbGEgcmVwb3J0IDEwMjYyCisgICAgcHVibGljIHZvaWQgdGVzdE5vRHVwbGljYXRlSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBaaXBGaWxlIGFyY2hpdmUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEluZGV4VGVzdHMiKTsKKyAgICAgICAgICAgIGFyY2hpdmUgPSBuZXcgWmlwRmlsZShnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUodGVtcEphcikpOworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGFyY2hpdmUuZW50cmllcygpOworICAgICAgICAgICAgaW50IG51bWJlck9mSW5kZXhMaXN0cyA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFppcEVudHJ5IHplID0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHplLmdldE5hbWUoKS5lcXVhbHMoIk1FVEEtSU5GL0lOREVYLkxJU1QiKSkgeworICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkluZGV4TGlzdHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbnVtYmVyT2ZJbmRleExpc3RzKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChhcmNoaXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBidWd6aWxsYSByZXBvcnQgMTY5NzIKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um9vdEZpbGVzSW5JbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFppcEZpbGUgYXJjaGl2ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0SW5kZXhUZXN0cyIpOworICAgICAgICAgICAgYXJjaGl2ZSA9IG5ldyBaaXBGaWxlKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSh0ZW1wSmFyKSk7CisgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IGFyY2hpdmUuZ2V0RW50cnkoIk1FVEEtSU5GL0lOREVYLkxJU1QiKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gYXJjaGl2ZS5nZXRJbnB1dFN0cmVhbSh6ZSk7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEY4IikpOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZFN1YiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZFN1YkZvbyA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZEZvbyA9IGZhbHNlOworCisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZS5lcXVhbHMoImZvbyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kRm9vID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKCJzdWIiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZFN1YiA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmVxdWFscygic3ViL2ZvbyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kU3ViRm9vID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGluZSA9IHIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZFN1Yik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCFmb3VuZFN1YkZvbyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZvdW5kRm9vKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChhcmNoaXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdE1hbmlmZXN0T25seUphcigpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygidGVzdE1hbmlmZXN0T25seUphciIsICJCdWlsZGluZyBNQU5JRkVTVC1vbmx5IGphcjogIik7CisgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKHRlbXBEaXIgKyAiTUVUQS1JTkYiICsgRmlsZS5zZXBhcmF0b3IgKyAiTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYW5pZmVzdEZpbGUuZXhpc3RzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleEphcnNQbHVzSmFyTWFya2VyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0SW5kZXhKYXJzUGx1c0phck1hcmtlciIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WZXJzaW9uSW5mb0ZhaWwoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdE5vVmVyc2lvbkluZm9GYWlsIiwgIk1hbmlmZXN0IEltcGxlbWVudGlvbiBpbmZvcm1hdGlvbiBtaXNzaW5nLiIsICJObyBJbXBsZW1lbnRhdGlvbi1UaXRsZSBzZXQuIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1ZlcnNpb25JbmZvSWdub3JlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9WZXJzaW9uSW5mb0lnbm9yZSIpOworICAgICAgICBhc3NlcnRUcnVlKCBnZXRGdWxsTG9nKCkuaW5kZXhPZigiTm8gSW1wbGVtZW50YXRpb24tVGl0bGUgc2V0LiIpID4gLTEgKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSggZ2V0RnVsbExvZygpLmluZGV4T2YoIk5vIEltcGxlbWVudGF0aW9uLVZlcnNpb24gc2V0LiIpID4gLTEgKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSggZ2V0RnVsbExvZygpLmluZGV4T2YoIk5vIEltcGxlbWVudGF0aW9uLVZlbmRvciBzZXQuIikgPiAtMSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb1ZlcnNpb25JbmZvV2FybigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE5vVmVyc2lvbkluZm9XYXJuIik7CisgICAgICAgIGFzc2VydFRydWUoIGdldExvZygpLmluZGV4T2YoIk5vIEltcGxlbWVudGF0aW9uLVRpdGxlIHNldC4iKSA+IC0xICk7CisgICAgICAgIGFzc2VydFRydWUoIGdldExvZygpLmluZGV4T2YoIk5vIEltcGxlbWVudGF0aW9uLVZlcnNpb24gc2V0LiIpID4gLTEgKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSggZ2V0TG9nKCkuaW5kZXhPZigiTm8gSW1wbGVtZW50YXRpb24tVmVuZG9yIHNldC4iKSA+IC0xICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vVmVyc2lvbkluZm9Ob1N0cmljdCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE5vVmVyc2lvbkluZm9Ob1N0cmljdCIpOworICAgICAgICBhc3NlcnRGYWxzZSggZ2V0TG9nKCkuaW5kZXhPZigiTm8gSW1wbGVtZW50YXRpb24tVGl0bGUgc2V0LiIpID4gLTEgKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIGdldExvZygpLmluZGV4T2YoIk5vIEltcGxlbWVudGF0aW9uLVZlcnNpb24gc2V0LiIpID4gLTEgKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIGdldExvZygpLmluZGV4T2YoIk5vIEltcGxlbWVudGF0aW9uLVZlbmRvciBzZXQuIikgPiAtMSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzVmVyc2lvbkluZm8oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RIYXNWZXJzaW9uSW5mbyIpOworICAgICAgICBhc3NlcnRGYWxzZSggZ2V0TG9nKCkuaW5kZXhPZigiTm8gSW1wbGVtZW50YXRpb24tVGl0bGUgc2V0LiIpID4gLTEgKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIGdldExvZygpLmluZGV4T2YoIk5vIEltcGxlbWVudGF0aW9uLVZlcnNpb24gc2V0LiIpID4gLTEgKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIGdldExvZygpLmluZGV4T2YoIk5vIEltcGxlbWVudGF0aW9uLVZlbmRvciBzZXQuIikgPiAtMSApOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhZTY4NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuVGVlT3V0cHV0U3RyZWFtOworCisvKioKKyAqIHN0cmVzcyBvdXQgamF2YSB0YXNrCisgKiAqLworcHVibGljIGNsYXNzIEphdmFUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9UT19XQUlUID0gMTsKKyAgICAvLyB3YWl0IDEgc2Vjb25kIGV4dHJhIHRvIGFsbG93IGZvciBqYXZhIHRvIHN0YXJ0IC4uLgorICAgIC8vIHRoaXMgdGltZSB3YXMgT0sgb24gYSBXaW4gTlQgbWFjaGluZSBhbmQgb24gbmFnb3lhCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFQ1VSSVRZX01BUkdJTiA9IDIwMDA7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHJpdmF0ZSBib29sZWFuIHJ1bkZhdGFsVGVzdHM9ZmFsc2U7CisKKyAgICBwdWJsaWMgSmF2YVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29uZmlndXJlIHRoZSBwcm9qZWN0LgorICAgICAqIGlmIHRoZSBwcm9wZXJ0eSBqdW5pdC5ydW4uZmF0YWwudGVzdHMgaXMgc2V0IHdlIHJ1bgorICAgICAqIHRoZSBmYXRhbCB0ZXN0cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhLnhtbCIpOworCisgICAgICAgIC8vZmluYWwgU3RyaW5nIHByb3BuYW1lPSJ0ZXN0cy1jbGFzc3BhdGgudmFsdWUiOworICAgICAgICAvL1N0cmluZyB0ZXN0Q2xhc3NwYXRoPVN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wbmFtZSk7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IGNwPSIrdGVzdENsYXNzcGF0aCk7CisgICAgICAgIFN0cmluZyBwcm9wbmFtZT0idGVzdHMtY2xhc3NwYXRoLnZhbHVlIjsKKyAgICAgICAgU3RyaW5nIHJ1bkZhdGFsPVN5c3RlbS5nZXRQcm9wZXJ0eSgianVuaXQucnVuLmZhdGFsLnRlc3RzIik7CisgICAgICAgIGlmKHJ1bkZhdGFsIT1udWxsKQorICAgICAgICAgICAgcnVuRmF0YWxUZXN0cz10cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICAvLyByZW1vdmUgbG9nIGZpbGUgZnJvbSB0ZXN0U3Bhd24KKyAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vSmFyTm9DbGFzc25hbWUoKXsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0Tm9KYXJOb0NsYXNzbmFtZSIsCisgICAgICAgICAgICAicGFyYW1ldGVyIHZhbGlkYXRpb24iLAorICAgICAgICAgICAgIkNsYXNzbmFtZSBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RKYXJOb0ZvcmsoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEphck5vRm9yayIsCisgICAgICAgICAgICAicGFyYW1ldGVyIHZhbGlkYXRpb24iLAorICAgICAgICAgICAgIkNhbm5vdCBleGVjdXRlIGEgamFyIGluIG5vbi1mb3JrZWQgbW9kZS4gIgorICAgICAgICAgICAgICAgICsgIlBsZWFzZSBzZXQgZm9yaz0ndHJ1ZScuICIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RKYXJBbmRDbGFzc05hbWUoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0SmFyQW5kQ2xhc3NOYW1lIiwKKyAgICAgICAgICAgICJTaG91bGQgbm90IGJlIGFibGUgdG8gc2V0IGJvdGggY2xhc3NuYW1lIEFORCBqYXIiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc25hbWVBbmRKYXIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0Q2xhc3NuYW1lQW5kSmFyIiwKKyAgICAgICAgICAgICJTaG91bGQgbm90IGJlIGFibGUgdG8gc2V0IGJvdGggY2xhc3NuYW1lIEFORCBqYXIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UnVuIik7CisgICAgfQorCisKKworICAgIC8qKiB0aGlzIHRlc3QgZmFpbHMgYnV0IHdlIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlOworICAgICAqICB3ZSB2ZXJpZnkgdGhhdCBmYWlsdXJlIG9ubHkgbWF0dGVycyB3aGVuIGZhaWxvbmVycm9yIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5GYWlsKCkgeworICAgICAgICBpZihydW5GYXRhbFRlc3RzKSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UnVuRmFpbCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJ1bkZhaWxGb2UoKSB7CisgICAgICAgIGlmKHJ1bkZhdGFsVGVzdHMpIHsKKyAgICAgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdFJ1bkZhaWxGb2UiLAorICAgICAgICAgICAgICAgICJqYXZhIGZhaWx1cmVzIGJlaW5nIHByb3BhZ2F0ZWQiLAorICAgICAgICAgICAgICAgICJKYXZhIHJldHVybmVkOiIpOworICAgICAgICB9Cit9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRmFpbEZvZUZvcmsoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdFJ1bkZhaWxGb2VGb3JrIiwKKyAgICAgICAgICAgICJqYXZhIGZhaWx1cmVzIGJlaW5nIHByb3BhZ2F0ZWQiLAorICAgICAgICAgICAgIkphdmEgcmV0dXJuZWQ6Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGluZygpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygidGVzdEV4Y2VwdGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiByYWlzZWQgaW5zaWRlIGNhbGxlZCBwcm9ncmFtIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGluZ0ZvcmsoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RFeGNlcHRpbmdGb3JrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmF2YSBSZXN1bHQ6Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGluZ0ZvZSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0RXhjZXB0aW5nRm9lIiwKKyAgICAgICAgICAgICJwYXNzZXMgZXhjZXB0aW9uIHRocm91Z2giLAorICAgICAgICAgICAgIkV4Y2VwdGlvbiByYWlzZWQgaW5zaWRlIGNhbGxlZCBwcm9ncmFtIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGluZ0ZvZUZvcmsoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEV4Y2VwdGluZ0ZvZUZvcmsiLAorICAgICAgICAgICAgImV4Y2VwdGlvbnMgdHVybmVkIGludG8gZXJyb3IgY29kZXMiLAorICAgICAgICAgICAgIkphdmEgcmV0dXJuZWQ6Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc3VsdFByb3BlcnR5WmVybygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFJlc3VsdFByb3BlcnR5WmVybyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAiLHByb2plY3QuZ2V0UHJvcGVydHkoImV4aXRjb2RlIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN1bHRQcm9wZXJ0eU5vblplcm8oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RSZXN1bHRQcm9wZXJ0eU5vblplcm8iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIixwcm9qZWN0LmdldFByb3BlcnR5KCJleGl0Y29kZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdWx0UHJvcGVydHlaZXJvTm9Gb3JrKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UmVzdWx0UHJvcGVydHlaZXJvTm9Gb3JrIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMCIscHJvamVjdC5nZXRQcm9wZXJ0eSgiZXhpdGNvZGUiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc3VsdFByb3BlcnR5Tm9uWmVyb05vRm9yaygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFJlc3VsdFByb3BlcnR5Tm9uWmVyb05vRm9yayIpOworICAgICAgICAgYXNzZXJ0RXF1YWxzKCItMSIscHJvamVjdC5nZXRQcm9wZXJ0eSgiZXhpdGNvZGUiKSk7CisgICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5GYWlsV2l0aEZhaWxPbkVycm9yKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RSdW5GYWlsV2l0aEZhaWxPbkVycm9yIiwKKyAgICAgICAgICAgICJub24gemVybyByZXR1cm4gY29kZSIsCisgICAgICAgICAgICAiSmF2YSByZXR1cm5lZDoiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuU3VjY2Vzc1dpdGhGYWlsT25FcnJvcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFJ1blN1Y2Nlc3NXaXRoRmFpbE9uRXJyb3IiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3Bhd24oKSB7CisgICAgICAgIEZpbGUgbG9nRmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoInNwYXduIiwibG9nIiwgcHJvamVjdC5nZXRCYXNlRGlyKCksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIC8vIHRoaXMgaXMgZ3VhcmFudGVlZCBieSBGaWxlVXRpbHMjY3JlYXRlVGVtcEZpbGUKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibG9nIGZpbGUgbm90IGV4aXN0aW5nIiwgIWxvZ0ZpbGUuZXhpc3RzKCkpOworICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJsb2dGaWxlIiwgbG9nRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoInRpbWVUb1dhaXQiLCBMb25nLnRvU3RyaW5nKFRJTUVfVE9fV0FJVCkpOworICAgICAgICBwcm9qZWN0LmV4ZWN1dGVUYXJnZXQoInRlc3RTcGF3biIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVfVE9fV0FJVCAqIDEwMDAgKyBTRUNVUklUWV9NQVJHSU4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibXkgc2xlZXAgd2FzIGludGVycnVwdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gbGV0J3MgYmUgbmljZSB3aXRoIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgZGV2ZWxvcGVycworICAgICAgICBpZiAoIWxvZ0ZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3VnZ2VzdGlvbjogaW5jcmVhc2UgdGhlIGNvbnN0YW50IgorICAgICAgICAgICAgKyAiIFNFQ1VSSVRZX01BUkdJTiB0byBnaXZlIG1vcmUgdGltZSBmb3IgamF2YSB0byBzdGFydC4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJsb2cgZmlsZSBleGlzdHMiLCBsb2dGaWxlLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3QxKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWRpcmVjdDEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3QyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWRpcmVjdDIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3QzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWRpcmVjdDMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3RvcjEoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlZGlyZWN0b3IxIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZGlyZWN0b3IyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZWRpcmVjdG9yMiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVudHJ5IHBvaW50IGNsYXNzIHdpdGggbm8gZGVwZW5kZW5jaWVzIG90aGVyCisgICAgICogdGhhbiBub3JtYWwgSlJFIHJ1bnRpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVudHJ5UG9pbnQgeworCisgICAgLyoqCisgICAgICogdGhpcyBlbnRyeSBwb2ludCBpcyB1c2VkIGJ5IHRoZSBqYXZhLnhtbCB0ZXN0cyB0bworICAgICAqIGdlbmVyYXRlIGZhaWx1cmUgc3RyaW5ncyB0byBoYW5kbGUKKyAgICAgKiBhcmd2WzBdID0gZXhpdCBjb2RlIChvcHRpb25hbCkKKyAgICAgKiBhcmd2WzFdID0gc3RyaW5nIHRvIHByaW50IHRvIFN5c3RlbS5vdXQgKG9wdGlvbmFsKQorICAgICAqIGFyZ3ZbMV0gPSBzdHJpbmcgdG8gcHJpbnQgdG8gU3lzdGVtLmVyciAob3B0aW9uYWwpCisgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKKyAgICAgICAgICAgIGludCBleGl0Q29kZT0wOworICAgICAgICAgICAgaWYoYXJndi5sZW5ndGg+MCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlPUludGVnZXIucGFyc2VJbnQoYXJndlswXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlPS0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGFyZ3YubGVuZ3RoPjEpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYXJndlsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihhcmd2Lmxlbmd0aD4yKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGFyZ3ZbMl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoZXhpdENvZGUhPTApIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdChleGl0Q29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlbnRyeSBwb2ludCBjbGFzcyB3aXRoIG5vIGRlcGVuZGVuY2llcyBvdGhlcgorICAgICAqIHRoYW4gbm9ybWFsIEpSRSBydW50aW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpbmdFbnRyeVBvaW50IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogdGhyb3cgYSBydW4gdGltZSBleGNlcHRpb24gd2hpY2ggZG9lcyBub3QgbmVlZAorICAgICAgICAgKiB0byBiZSBpbiB0aGUgc2lnbmF0dXJlIG9mIHRoZSBlbnRyeSBwb2ludAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJFeGNlcHRpb24gcmFpc2VkIGluc2lkZSBjYWxsZWQgcHJvZ3JhbSIpOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIHRlc3QgY2xhc3MgZm9yIHNwYXduCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTcGF3bkVudHJ5UG9pbnQgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJndikgeworICAgICAgICAgICAgaW50IHNsZWVwVGltZSA9IDEwOworICAgICAgICAgICAgU3RyaW5nIGxvZ0ZpbGUgPSAic3Bhd24ubG9nIjsKKyAgICAgICAgICAgIGlmIChhcmd2Lmxlbmd0aCA+PSAxKSB7CisgICAgICAgICAgICAgICAgc2xlZXBUaW1lID0gSW50ZWdlci5wYXJzZUludChhcmd2WzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmd2Lmxlbmd0aCA+PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0ZpbGUgPSBhcmd2WzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG91dCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcFRpbWUgKiAxMDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJteSBzbGVlcCB3YXMgaW50ZXJydXB0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIGRlc3QgPSBuZXcgRmlsZShsb2dGaWxlKTsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3QpOworICAgICAgICAgICAgICAgIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoImJ5ZSBieWVcbiIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7fQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHtvdXQuY2xvc2UoKTt9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHt9fQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBlbnRyeSBwb2ludCBjbGFzcyB0byBwaXBlIFN5c3RlbS5pbiB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbToKKyAgICAgKiAib3V0IiwgImVyciIsIG9yICJib3RoIi4gIElmIG5vbmUgc3BlY2lmaWVkLCBzd2FsbG93IHRoZSBpbnB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBpcGVFbnRyeVBvaW50IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogcGlwZSBpbnB1dCB0byBzcGVjaWZpZWQgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBudWxsOworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGlmICgib3V0Ii5lcXVhbHNJZ25vcmVDYXNlKGFyZ3NbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgIG9zID0gU3lzdGVtLm91dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJlcnIiLmVxdWFsc0lnbm9yZUNhc2UoYXJnc1swXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3MgPSBTeXN0ZW0uZXJyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImJvdGgiLmVxdWFsc0lnbm9yZUNhc2UoYXJnc1swXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3MgPSBuZXcgVGVlT3V0cHV0U3RyZWFtKFN5c3RlbS5vdXQsIFN5c3RlbS5lcnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBTdHJlYW1QdW1wZXIoU3lzdGVtLmluLCBvcywgdHJ1ZSkpOworICAgICAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleWVFeCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhY1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjIzNGNmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFjVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbXBpbGVycy5Db21waWxlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkNvbXBpbGVyQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkphdmFjMTI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkphdmFjMTM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkphdmFjRXh0ZXJuYWw7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdGNhc2UgZm9yIDxqYXZhYz4uCisgKgorICovCitwdWJsaWMgY2xhc3MgSmF2YWNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisgICAgcHJpdmF0ZSBKYXZhYyBqYXZhYzsKKworICAgIHB1YmxpYyBKYXZhY1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOworICAgICAgICBwcm9qZWN0LmluaXQoKTsKKyAgICAgICAgamF2YWMgPSBuZXcgSmF2YWMoKTsKKyAgICAgICAgamF2YWMuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHNldHRpbmcgdGhlIG5hbWUgb2YgdGhlIGphdmFjIGV4ZWN1dGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmtlZEV4ZWN1dGFibGVOYW1lKCkgeworICAgICAgICBhc3NlcnROdWxsKCJubyBmb3JrIG1lYW5zIG5vIGV4ZWN1dGFibGUiLCBqYXZhYy5nZXRKYXZhY0V4ZWN1dGFibGUoKSk7CisKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIiLCAibW9kZXJuIik7CisgICAgICAgIGFzc2VydE51bGwoIm5vIGZvcmsgbWVhbnMgbm8gZXhlY3V0YWJsZSIsIGphdmFjLmdldEphdmFjRXhlY3V0YWJsZSgpKTsKKworICAgICAgICBqYXZhYy5zZXRGb3JrKHRydWUpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJub3JtYWwgZm9yayIsIGphdmFjLmdldEphdmFjRXhlY3V0YWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibmFtZSBzaG91bGQgY29udGFpbiBcImphdmFjXCIiLAorICAgICAgICAgICAgICAgICAgIGphdmFjLmdldEphdmFjRXhlY3V0YWJsZSgpLmluZGV4T2YoImphdmFjIikgPiAtMSk7CisKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIiLCAiZXh0SmF2YWMiKTsKKyAgICAgICAgamF2YWMuc2V0Rm9yayhmYWxzZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoImZvcmsgdmlhIHByb3BlcnR5IiwgamF2YWMuZ2V0SmF2YWNFeGVjdXRhYmxlKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJuYW1lIHNob3VsZCBjb250YWluIFwiamF2YWNcIiIsCisgICAgICAgICAgICAgICAgICAgamF2YWMuZ2V0SmF2YWNFeGVjdXRhYmxlKCkuaW5kZXhPZigiamF2YWMiKSA+IC0xKTsKKworICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJidWlsZC5jb21waWxlciIsICJ3aGF0ZXZlciIpOworICAgICAgICBhc3NlcnROdWxsKCJubyBmb3JrIGFuZCBub3QgZXh0SmF2YWMgbWVhbnMgbm8gZXhlY3V0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgamF2YWMuZ2V0SmF2YWNFeGVjdXRhYmxlKCkpOworCisgICAgICAgIFN0cmluZyBteUphdmFjID0gIlNsYXJ0aWJhcnRmYXN0IjsKKyAgICAgICAgamF2YWMuc2V0Rm9yayh0cnVlKTsKKyAgICAgICAgamF2YWMuc2V0RXhlY3V0YWJsZShteUphdmFjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG15SmF2YWMsIGphdmFjLmdldEphdmFjRXhlY3V0YWJsZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG5lc3RlZCBjb21waWxlciBhcmdzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21waWxlckFyZygpIHsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IGphdmFjLmdldEN1cnJlbnRDb21waWxlckFyZ3MoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhcmdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBhcmdzIiwgMCwgYXJncy5sZW5ndGgpOworCisgICAgICAgIEphdmFjLkltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCBhcmcgPSBqYXZhYy5jcmVhdGVDb21waWxlckFyZygpOworICAgICAgICBTdHJpbmcgZm9yZCA9ICJGb3JkIjsKKyAgICAgICAgU3RyaW5nIHByZWZlY3QgPSAiUHJlZmVjdCI7CisgICAgICAgIFN0cmluZyB0ZXN0QXJnID0gZm9yZCArICIgIiArIHByZWZlY3Q7CisgICAgICAgIGFyZy5zZXRWYWx1ZSh0ZXN0QXJnKTsKKyAgICAgICAgYXJncyA9IGphdmFjLmdldEN1cnJlbnRDb21waWxlckFyZ3MoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmNvbmRpdGlvbmFsIHNpbmdsZSBhcmciLCAxLCBhcmdzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0QXJnLCBhcmdzWzBdKTsKKworICAgICAgICBhcmcuc2V0Q29tcGlsZXIoImppa2VzIik7CisgICAgICAgIGFyZ3MgPSBqYXZhYy5nZXRDdXJyZW50Q29tcGlsZXJBcmdzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXJncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1wbGVtZW50YXRpb24gaXMgamlrZXMgYnV0IGJ1aWxkLmNvbXBpbGVyIGlzIG51bGwiLAorICAgICAgICAgICAgICAgICAgICAgMCwgYXJncy5sZW5ndGgpOworCisgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoImJ1aWxkLmNvbXBpbGVyIiwgImp2YyIpOworICAgICAgICBhcmdzID0gamF2YWMuZ2V0Q3VycmVudENvbXBpbGVyQXJncygpOworICAgICAgICBhc3NlcnROb3ROdWxsKGFyZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltcGxlbWVudGF0aW9uIGlzIGppa2VzIGJ1dCBidWlsZC5jb21waWxlciBpcyBqdmMiLAorICAgICAgICAgICAgICAgICAgICAgMCwgYXJncy5sZW5ndGgpOworCisgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoImJ1aWxkLmNvbXBpbGVyIiwgImppa2VzIik7CisgICAgICAgIGFyZ3MgPSBqYXZhYy5nZXRDdXJyZW50Q29tcGlsZXJBcmdzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm90aCBhcmUgamlrZXMiLCAxLCBhcmdzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0QXJnLCBhcmdzWzBdKTsKKworICAgICAgICBhcmcuc2V0TGluZSh0ZXN0QXJnKTsKKyAgICAgICAgYXJncyA9IGphdmFjLmdldEN1cnJlbnRDb21waWxlckFyZ3MoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzcGxpdCBhdCBzcGFjZSIsIDIsIGFyZ3MubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcmQsIGFyZ3NbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMocHJlZmVjdCwgYXJnc1sxXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBuZXN0ZWQgY29tcGlsZXIgYXJncyBpbiB0aGUgZm9yaz0idHJ1ZSIgYW5kCisgICAgICogaW1wbGVtZW50YXRpb249ImV4dEphdmFjIiBjYXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21waWxlckFyZ0ZvckZvcmtBbmRFeHRKYXZhYygpIHsKKyAgICAgICAgSmF2YWMuSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IGFyZyA9IGphdmFjLmNyZWF0ZUNvbXBpbGVyQXJnKCk7CisgICAgICAgIFN0cmluZyBmb3JkID0gIkZvcmQiOworICAgICAgICBTdHJpbmcgcHJlZmVjdCA9ICJQcmVmZWN0IjsKKyAgICAgICAgU3RyaW5nIHRlc3RBcmcgPSBmb3JkICsgIiAiICsgcHJlZmVjdDsKKyAgICAgICAgYXJnLnNldFZhbHVlKHRlc3RBcmcpOworICAgICAgICBhcmcuc2V0Q29tcGlsZXIoImV4dEphdmFjIik7CisgICAgICAgIGphdmFjLnNldEZvcmsodHJ1ZSk7CisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBqYXZhYy5nZXRDdXJyZW50Q29tcGlsZXJBcmdzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm90aCBhcmUgZm9ya2VkIGphdmFjIiwgMSwgYXJncy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHModGVzdEFyZywgYXJnc1swXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjb21waWxlciBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGVyQXR0cmlidXRlKCkgeworICAgICAgICAvLyBjaGVjayBkZWZhdWx0cworICAgICAgICBTdHJpbmcgY29tcGlsZXIgPSBqYXZhYy5nZXRDb21waWxlcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGVyKTsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIiKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJidWlsZC5jb21waWxlciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImRlZmF1bHQgdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAiamF2YWMxLjEiLmVxdWFscyhjb21waWxlcikKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgImphdmFjMS4yIi5lcXVhbHMoY29tcGlsZXIpCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICJqYXZhYzEuMyIuZXF1YWxzKGNvbXBpbGVyKQorICAgICAgICAgICAgICAgICAgICAgICB8fCAiamF2YWMxLjQiLmVxdWFscyhjb21waWxlcikKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgImphdmFjMS41Ii5lcXVhbHMoY29tcGlsZXIpCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICJjbGFzc2ljIi5lcXVhbHMoY29tcGlsZXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGphdmFjLnNldEZvcmsodHJ1ZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoamF2YWMuZ2V0Q29tcGlsZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXh0SmF2YWMiLCBqYXZhYy5nZXRDb21waWxlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbXBpbGVyLCBqYXZhYy5nZXRDb21waWxlclZlcnNpb24oKSk7CisKKyAgICAgICAgLy8gY2hlY2sgYnVpbGQuY29tcGlsZXIgcHJvdmlkZXMgZGVmYXVsdHMKKyAgICAgICAgamF2YWMgPSBuZXcgSmF2YWMoKTsKKyAgICAgICAgamF2YWMuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgLy8gc2V0VXNlclByb3BlcnR5IHRvIG92ZXJyaWRlIHN5c3RlbSBwcm9wZXJ0aWVzCisgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KCJidWlsZC5jb21waWxlciIsICJqaWtlcyIpOworICAgICAgICBjb21waWxlciA9IGphdmFjLmdldENvbXBpbGVyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImppa2VzIiwgY29tcGlsZXIpOworCisgICAgICAgIGphdmFjLnNldEZvcmsodHJ1ZSk7CisgICAgICAgIGNvbXBpbGVyID0gamF2YWMuZ2V0Q29tcGlsZXIoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21waWxlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiamlrZXMiLCBjb21waWxlcik7CisKKyAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlIG92ZXJyaWRlcyBidWlsZC5jb21waWxlcgorICAgICAgICBqYXZhYy5zZXRGb3JrKGZhbHNlKTsKKyAgICAgICAgamF2YWMuc2V0Q29tcGlsZXIoImp2YyIpOworICAgICAgICBjb21waWxlciA9IGphdmFjLmdldENvbXBpbGVyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImp2YyIsIGNvbXBpbGVyKTsKKworICAgICAgICBqYXZhYy5zZXRGb3JrKHRydWUpOworICAgICAgICBjb21waWxlciA9IGphdmFjLmdldENvbXBpbGVyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImp2YyIsIGNvbXBpbGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGlsZXJBZGFwdGVyKCkgeworICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV8yKQorICAgICAgICAgICAgfHwgSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV8zKSkgeworICAgICAgICAgICAgamF2YWMuc2V0Q29tcGlsZXIoImphdmFjMS4xIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqYXZhYy5zZXRDb21waWxlcigiamF2YWMxLjQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGphdmFjLnNldERlcGVuZCh0cnVlKTsKKyAgICAgICAgQ29tcGlsZXJBZGFwdGVyIGFkYXB0ZXIgPQorICAgICAgICAgICAgQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5nZXRDb21waWxlcihqYXZhYy5nZXRDb21waWxlcigpLCBqYXZhYyk7CisKKyAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMikKKyAgICAgICAgICAgIHx8IEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfMykpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlciBpbnN0YW5jZW9mIEphdmFjMTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyIGluc3RhbmNlb2YgSmF2YWMxMyk7CisgICAgICAgIH0KKworICAgICAgICBqYXZhYy5zZXRGb3JrKHRydWUpOworICAgICAgICBhZGFwdGVyID0KKyAgICAgICAgICAgIENvbXBpbGVyQWRhcHRlckZhY3RvcnkuZ2V0Q29tcGlsZXIoamF2YWMuZ2V0Q29tcGlsZXIoKSwgamF2YWMpOworICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBKYXZhY0V4dGVybmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlTm9EZWZhdWx0KCkgeworICAgICAgICBhc3NlcnROdWxsKGphdmFjLmdldFNvdXJjZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlV2l0aERlZmF1bHQoKSB7CisgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoImFudC5idWlsZC5qYXZhYy5zb3VyY2UiLCAiMS40Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiMS40IiwgamF2YWMuZ2V0U291cmNlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTb3VyY2VPdmVycmlkZXNEZWZhdWx0KCkgeworICAgICAgICBwcm9qZWN0LnNldE5ld1Byb3BlcnR5KCJhbnQuYnVpbGQuamF2YWMuc291cmNlIiwgIjEuNCIpOworICAgICAgICBqYXZhYy5zZXRTb3VyY2UoIjEuNSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEuNSIsIGphdmFjLmdldFNvdXJjZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0Tm9EZWZhdWx0KCkgeworICAgICAgICBhc3NlcnROdWxsKGphdmFjLmdldFRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0V2l0aERlZmF1bHQoKSB7CisgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoImFudC5idWlsZC5qYXZhYy50YXJnZXQiLCAiMS40Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiMS40IiwgamF2YWMuZ2V0VGFyZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJnZXRPdmVycmlkZXNEZWZhdWx0KCkgeworICAgICAgICBwcm9qZWN0LnNldE5ld1Byb3BlcnR5KCJhbnQuYnVpbGQuamF2YWMudGFyZ2V0IiwgIjEuNCIpOworICAgICAgICBqYXZhYy5zZXRUYXJnZXQoIjEuNSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEuNSIsIGphdmFjLmdldFRhcmdldCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWRvY1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhZG9jVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyMzM4NjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWRvY1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworcHVibGljIGNsYXNzIEphdmFkb2NUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgSmF2YWRvY1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1BBVEggPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamF2YWRvYy8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9GSUxFTkFNRSA9ICJqYXZhZG9jLnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX0ZJTEUgPSBCVUlMRF9QQVRIICsgQlVJTERfRklMRU5BTUU7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBjb25maWd1cmVQcm9qZWN0KEJVSUxEX0ZJTEUpOworICAgIH0KKworICAgIC8vIFBSIDM4MzcwCisgICAgcHVibGljIHZvaWQgdGVzdERpcnNldFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZGlyc2V0UGF0aCIpOworICAgIH0KKworICAgIC8vIFBSIDM4MzcwCisgICAgcHVibGljIHZvaWQgdGVzdERpcnNldFBhdGhXaXRob3V0UGFja2FnZW5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJkaXJzZXRQYXRoV2l0aG91dFBhY2thZ2VuYW1lcyIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJDb250ZW50cyBvZiBwYXRoIHNob3VsZCBiZSBwaWNrZWQgdXAgd2l0aG91dCBzcGVjaWZ5aW5nIHBhY2thZ2UgbmFtZXM6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBSIDM4MzcwCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZERpcnNldFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibmVzdGVkRGlyc2V0UGF0aCIpOworICAgIH0KKworICAgIC8vIFBSIDM4MzcwCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVzZXRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJmaWxlc2V0UGF0aCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJBIHBhdGggY2FuIGNvbnRhaW4gZmlsZXNldHM6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBSIDM4MzcwCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEZpbGVzZXRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJuZXN0ZWRGaWxlc2V0UGF0aCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJBIHBhdGggY2FuIGNvbnRhaW4gbmVzdGVkIGZpbGVzZXRzOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQUiAzODM3MAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlbGlzdFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoImZpbGVsaXN0UGF0aCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJBIHBhdGggY2FuIGNvbnRhaW4gZmlsZWxpc3RzOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQUiAzODM3MAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRGaWxlbGlzdFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoIm5lc3RlZEZpbGVsaXN0UGF0aCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJBIHBhdGggY2FuIGNvbnRhaW4gbmVzdGVkIGZpbGVsaXN0czogIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUFIgMzgzNzAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aGVsZW1lbnRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInBhdGhlbGVtZW50UGF0aCIpOworICAgIH0KKworICAgIC8vIFBSIDM4MzcwCisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhlbGVtZW50TG9jYXRpb25QYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJwYXRoZWxlbWVudExvY2F0aW9uUGF0aCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJBIHBhdGggY2FuIGNvbnRhaW4gcGF0aGVsZW1lbnRzIHBvaW50aW5nIHRvIGEgZmlsZTogIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUFIgMzgzNzAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoIm5lc3RlZFNvdXJjZSIpOworICAgIH0KKworICAgIC8vIFBSIDM4MzcwCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEZpbGVzZXRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibmVzdGVkRmlsZXNldFJlZiIpOworICAgIH0KKworICAgIC8vIFBSIDM4MzcwCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEZpbGVzZXRSZWZJblBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibmVzdGVkRmlsZXNldFJlZkluUGF0aCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRGaWxlc2V0Tm9QYXR0ZXJucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJuZXN0ZWRGaWxlc2V0Tm9QYXR0ZXJucyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibHlOZXN0ZWRGaWxlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImRvdWJseU5lc3RlZEZpbGVzZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91Ymx5TmVzdGVkRmlsZXNldE5vUGF0dGVybnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZG91Ymx5TmVzdGVkRmlsZXNldE5vUGF0dGVybnMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uSmF2YUluY2x1ZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vICM0MTI2NAorICAgICAgICBleGVjdXRlVGFyZ2V0KCJub25KYXZhSW5jbHVkZXMiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkRmlsZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkRmlsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzlhNmMzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRGaWxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBUZXN0IHRoZSBsb2FkIGZpbGUgdGFzaworICoKKyAqIEBjcmVhdGVkIDEwIERlY2VtYmVyIDIwMDEKKyAqLworcHVibGljIGNsYXNzIExvYWRGaWxlVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBMb2FkRmlsZVRlc3Qgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBEZXNjcmlwdGlvbiBvZiBQYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZEZpbGVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9sb2FkZmlsZS54bWwiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB0ZWFyZG93biBtZXRob2QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NvdXJjZWZpbGVEZWZpbmVkKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdE5vU291cmNlZmlsZURlZmluZWQiLAorICAgICAgICAgICAgICAgICJzb3VyY2UgZmlsZSBub3QgZGVmaW5lZCIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5vUHJvcGVydHlEZWZpbmVkKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdE5vUHJvcGVydHlEZWZpbmVkIiwKKyAgICAgICAgICAgICAgICAib3V0cHV0IHByb3BlcnR5IG5vdCBkZWZpbmVkIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Tb3VyY2VmaWxlZm91bmQoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdE5vU291cmNlZmlsZWZvdW5kIiwKKyAgICAgICAgICAgICAgICAiRmlsZSBub3QgZm91bmQiLCAiIGRvZXNuJ3QgZXhpc3QiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbE9uRXJyb3IoKQorICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgidGVzdEZhaWxPbkVycm9yIiwidGVzdEZhaWxPbkVycm9yIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEFGaWxlKCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RMb2FkQUZpbGUiKTsKKyAgICAgICAgaWYocHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdExvYWRBRmlsZSIpLmluZGV4T2YoImVoPyIpPDApIHsKKyAgICAgICAgICAgIGZhaWwoInByb3BlcnR5IGlzIG5vdCBhbGwgaW4gdGhlIGZpbGUiKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExvYWRBRmlsZUVuYygpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0TG9hZEFGaWxlRW5jIik7CisgICAgICAgIGlmKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3RMb2FkQUZpbGVFbmMiKT09bnVsbCkgeworICAgICAgICAgICAgZmFpbCgiZmlsZSBsb2FkIGZhaWxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEV2YWxQcm9wcygpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RXZhbFByb3BzIik7CisgICAgICAgIGlmKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3RFdmFsUHJvcHMiKS5pbmRleE9mKCJyYWluIik8MCkgeworICAgICAgICAgICAgZmFpbCgicHJvcGVydHkgZXZhbCBicm9rZW4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgRmlsdGVyQ2hhaW4gYW5kIEZpbHRlclJlYWRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyQ2hhaW4oKQorICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbHRlckNoYWluIik7CisgICAgICAgIGlmKHByb2plY3QuZ2V0UHJvcGVydHkoInRlc3RGaWx0ZXJDaGFpbiIpLmluZGV4T2YoIldvcmxkISIpPDApIHsKKyAgICAgICAgICAgIGZhaWwoIkZpbHRlciBDaGFpbiBicm9rZW4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgU3RyaXBKYXZhQ29tbWVudHMgZmlsdGVycmVhZGVyIGZ1bmN0aW9uYWxpdHkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFN0cmlwSmF2YUNvbW1lbnRzKCkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RTdHJpcEphdmFDb21tZW50cyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJleHBlY3RlZCIpOworICAgICAgICBmaW5hbCBTdHJpbmcgZ2VuZXJhdGVkID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgidGVzdFN0cmlwSmF2YUNvbW1lbnRzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZ2VuZXJhdGVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lTGluZSgpCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoInRlc3RPbmVMaW5lIiwidGVzdE9uZUxpbmUiLCIxLDIsMyw0Iik7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9hZFByb3BlcnRpZXNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9hZFByb3BlcnRpZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNzQxMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkUHJvcGVydGllc1Rlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIExvYWRQcm9wZXJ0aWVzVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIExvYWRQcm9wZXJ0aWVzVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSlVuaXQgc2V0dXAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2xvYWRwcm9wZXJ0aWVzLnhtbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0ZWFyZG93biBtZXRob2QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZml4ZWRQcm9wZXJ0aWVzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UHJlZml4ZWRQcm9wZXJ0aWVzIik7CisgICAgICAgIFN0cmluZyB1cmwgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJzZXJ2ZXIxLmh0dHAudXJsIik7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MCIsIHVybCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNGcm9tUmVzb3VyY2UoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RQcm9wZXJ0aWVzRnJvbVJlc291cmNlIik7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImxvYWRQcm9wZXJ0aWVzQ2hlY2siKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc0Zyb21GaWxlU2V0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UHJvcGVydGllc0Zyb21GaWxlU2V0Iik7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImxvYWRQcm9wZXJ0aWVzQ2hlY2siKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFjcm9EZWZUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFjcm9EZWZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0MDk2YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWNyb0RlZlRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBNYWNyb0RlZlRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgTWFjcm9EZWZUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYWNyb2RlZi54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgeworICAgICAgICBleHBlY3RMb2coInNpbXBsZSIsICJIZWxsbyBXb3JsZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0KCkgeworICAgICAgICBleHBlY3RMb2coInRleHQiLCAiSW5uZXIgVGV4dCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVBdHRyaWJ1dGUoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgImR1cGxpY2F0ZS5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgInRoZSBhdHRyaWJ1dGUgdGV4dCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVFbGVtZW50KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJkdXBsaWNhdGUuZWxlbWVudCIsCisgICAgICAgICAgICAidGhlIGVsZW1lbnQgdGV4dCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcmkoKSB7CisgICAgICAgIGV4cGVjdExvZygidXJpIiwgIkhlbGxvIFdvcmxkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZCgpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJuZXN0ZWQiLCAiQSBuZXN0ZWQgZWxlbWVudCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoKSB7CisgICAgICAgIGV4cGVjdExvZygKKyAgICAgICAgICAgICJkb3VibGUiLAorICAgICAgICAgICAgIkB7cHJvcH0gaXMgJ3Byb3BlcnR5JywgdmFsdWUgb2YgJHtwcm9wZXJ0eX0gaXMgJ0EgcHJvcGVydHkgdmFsdWUnIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElnbm9yZUNhc2UoKSB7CisgICAgICAgIGV4cGVjdExvZygKKyAgICAgICAgICAgICJpZ25vcmVjYXNlIiwKKyAgICAgICAgICAgICJhIGlzIGFiIGlzIGIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlRWxlbWVudENhc2UoKSB7CisgICAgICAgIGV4cGVjdExvZygKKyAgICAgICAgICAgICJpZ25vcmUtZWxlbWVudC1jYXNlIiwKKyAgICAgICAgICAgICJuZXN0ZWQgZWxlbWVudG5lc3RlZCBlbGVtZW50Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRleHRFbGVtZW50KCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKAorICAgICAgICAgICAgInRleHRlbGVtZW50IiwgIkhlbGxvIHdvcmxkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRleHRUcmltKCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKAorICAgICAgICAgICAgInRleHQudHJpbSIsICJbSGVsbG8gd29ybGRdIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZVRleHROYW1lKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJkdXBsaWNhdGV0ZXh0bmFtZSIsCisgICAgICAgICAgICAidGhlIG5hbWUgXCJ0ZXh0XCIgaXMgYWxyZWFkeSB1c2VkIGFzIGFuIGF0dHJpYnV0ZSIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlVGV4dE5hbWUyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJkdXBsaWNhdGV0ZXh0bmFtZTIiLAorICAgICAgICAgICAgInRoZSBhdHRyaWJ1dGUgbmFtZSBcInRleHRcIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYnkgdGhlIHRleHQgZWxlbWVudCIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlKCkgeworICAgICAgICBleHBlY3RMb2coCisgICAgICAgICAgICAiZXNjYXBlIiwKKyAgICAgICAgICAgICJhQGIgb3IgYUBiIGlzIGF2YWx1ZUBidmFsdWUiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZURlc2NyaXB0aW9uKCkgeworICAgICAgICBleHBlY3RMb2coCisgICAgICAgICAgICAiYXR0cmlidXRlLmRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJkZXNjcmlwdGlvbiBpcyBoZWxsbyB3b3JsZCIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVEZWZhdWx0KCkgeworICAgICAgICBleHBlY3RMb2coCisgICAgICAgICAgICAib3ZlcnJpZGUuZGVmYXVsdCIsCisgICAgICAgICAgICAidmFsdWUgaXMgbmV3Iik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdCgpIHsKKyAgICAgICAgZXhwZWN0TG9nKAorICAgICAgICAgICAgImltcGxpY2l0IiwgIkJlZm9yZSBpbXBsaWNpdEluIGltcGxpY2l0QWZ0ZXIgaW1wbGljaXQiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0Tm90T3B0aW9uYWwoKSB7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAiaW1wbGljaXQubm90b3B0aW9uYWwiLAorICAgICAgICAgICAgIk1pc3NpbmcgbmVzdGVkIGVsZW1lbnRzIGZvciBpbXBsaWNpdCBlbGVtZW50IGltcGxpY2l0IiwKKyAgICAgICAgICAgICJNaXNzaW5nIG5lc3RlZCBlbGVtZW50cyBmb3IgaW1wbGljaXQgZWxlbWVudCBpbXBsaWNpdCIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRPcHRpb25hbCgpIHsKKyAgICAgICAgZXhwZWN0TG9nKAorICAgICAgICAgICAgImltcGxpY2l0Lm9wdGlvbmFsIiwgIkJlZm9yZSBpbXBsaWNpdEFmdGVyIGltcGxpY2l0Iik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdEV4cGxpY2l0KCkgeworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgImltcGxpY2l0LmV4cGxpY2l0IiwKKyAgICAgICAgICAgICJPbmx5IG9uZSBlbGVtZW50IGFsbG93ZWQgd2hlbiB1c2luZyBpbXBsaWNpdCBlbGVtZW50cyIsCisgICAgICAgICAgICAiT25seSBvbmUgZWxlbWVudCBhbGxvd2VkIHdoZW4gdXNpbmcgaW1wbGljaXQgZWxlbWVudHMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja1RyYWNlT2ZmKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgiYmFja3RyYWNlb2ZmIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoImZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiZXJyb3IgbWVzc2FnZSBjb250YWluZWQgYmFja3RyYWNlIC0gIiArIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja1RyYWNlKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoCisgICAgICAgICAgICAiYmFja3RyYWNlb24iLAorICAgICAgICAgICAgIkNoZWNraW5nIGlmIGEgYmFjayB0cmFjZSBpcyBjcmVhdGVkIiwKKyAgICAgICAgICAgICJmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wTGV2ZWxUZXh0KCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJ0b3AtbGV2ZWwtdGV4dCIsICJIZWxsbyBXb3JsZCIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01ha2VVcmxUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFrZVVybFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjk4ODVmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01ha2VVcmxUZXN0LmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworCitwdWJsaWMgY2xhc3MgTWFrZVVybFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBNYWtlVXJsVGVzdChTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFrZXVybC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEVtcHR5IiwgIm1pc3NpbmcgcHJvcGVydHkiLCAicHJvcGVydHkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Qcm9wZXJ0eSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0Tm9Qcm9wZXJ0eSIsICJtaXNzaW5nIHByb3BlcnR5IiwgInByb3BlcnR5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vRmlsZSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0Tm9GaWxlIiwgIm1pc3NpbmcgZmlsZSIsICJmaWxlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb24oKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdFZhbGlkYXRpb24iLCBNYWtlVXJsLkVSUk9SX01JU1NJTkdfRklMRSwgImZpbGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V29ya3MoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RXb3JrcyIpOworICAgICAgICBhc3NlcnRQcm9wZXJ0eUNvbnRhaW5zKCJ0ZXN0V29ya3MiLCAiZmlsZToiKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdFdvcmtzIiwgIi9mb28iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbENoYXJzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0SWxsZWdhbENoYXJzIik7CisgICAgICAgIGFzc2VydFByb3BlcnR5Q29udGFpbnMoInRlc3RJbGxlZ2FsQ2hhcnMiLCAiZmlsZToiKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdElsbGVnYWxDaGFycyIsICJmbyUyMG8lMjUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgd2UgY2FuIHJvdW5kIHRyaXAgYnkgb3BlbmluZyBhIHVybCB0aGF0IGV4aXN0cworICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Um91bmRUcmlwIik7CisgICAgICAgIGFzc2VydFByb3BlcnR5Q29udGFpbnMoInRlc3RSb3VuZFRyaXAiLCAiZmlsZToiKTsKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZ2V0UHJvcGVydHkoInRlc3RSb3VuZFRyaXAiKTsKKyAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwocHJvcGVydHkpOworICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgIGluc3RyZWFtLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElsbGVnYWxDb21iaW5hdGlvbnMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RJbGxlZ2FsQ29tYmluYXRpb25zIik7CisgICAgICAgIGFzc2VydFByb3BlcnR5Q29udGFpbnMoInRlc3RJbGxlZ2FsQ29tYmluYXRpb25zIiwgIi9mb28iKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdElsbGVnYWxDb21iaW5hdGlvbnMiLCAiLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc2V0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsZXNldCIpOworICAgICAgICBhc3NlcnRQcm9wZXJ0eUNvbnRhaW5zKCJ0ZXN0RmlsZXNldCIsICIueG1sICIpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0UHJvcGVydHkoInRlc3RGaWxlc2V0Iik7CisgICAgICAgIGFzc2VydFByb3BlcnR5RW5kc1dpdGgoInRlc3RGaWxlc2V0IiwgIi54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZXNldFNlcGFyYXRvcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVzZXRTZXBhcmF0b3IiKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdEZpbGVzZXRTZXBhcmF0b3IiLCAiLnhtbFwiLFwiIik7CisgICAgICAgIGFzc2VydFByb3BlcnR5RW5kc1dpdGgoInRlc3RGaWxlc2V0U2VwYXJhdG9yIiwgIi54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFBhdGgiKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdFBhdGgiLCAibWFrZXVybC54bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhc3NlcnQgdGhhdCBhIHByb3BlcnR5IGVuZHMgd2l0aAorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5CisgICAgICogQHBhcmFtIGVuZGluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQcm9wZXJ0eUVuZHNXaXRoKFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIGVuZGluZykgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICBTdHJpbmcgc3Vic3RyaW5nID0gcmVzdWx0LnN1YnN0cmluZyhyZXN1bHQubGVuZ3RoKCkgLSBlbmRpbmcubGVuZ3RoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW5kaW5nLCBzdWJzdHJpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFzc2VydCB0aGF0IGEgcHJvcGVydHkgY29udGFpbnMgYSBzdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBuYW1lIG9mIHByb3BlcnR5IHRvIGxvb2sgZm9yCisgICAgICogQHBhcmFtIGNvbnRhaW5zIHdoYXQgdG8gc2VhcmNoIGZvciBpbiB0aGUgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UHJvcGVydHlDb250YWlucyhTdHJpbmcgcHJvcGVydHksIFN0cmluZyBjb250YWlucykgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0UHJvcGVydHkocHJvcGVydHkpOworCisgICAgICAgIGFzc2VydFRydWUoImV4cGVjdGVkICIgKyBjb250YWlucyArICIgaW4gIiArIHJlc3VsdCwKKyAgICAgICAgICAgICAgICByZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuaW5kZXhPZihjb250YWlucykgPj0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0IGEgcHJvcGVydHkgZnJvbSB0aGUgcHJvamVjdAorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5CisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnR5KHByb3BlcnR5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RDbGFzc1BhdGhUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RDbGFzc1BhdGhUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlY2IwOAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdENsYXNzUGF0aFRlc3QuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwTWF0Y2hlckZhY3Rvcnk7CisKKy8qKgorICogVGVzdHMgJmx0O2JtOm1hbmlmZXN0Y2xhc3NwYXRoJmd0Oy4KKyAqLworcHVibGljIGNsYXNzIE1hbmlmZXN0Q2xhc3NQYXRoVGVzdAorICAgICAgICAgICAgIGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZERpcmVjdG9yeSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0LWJhZC1kaXJlY3RvcnkiLCAiYmFkLWphci1kaXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphcidzIGRpcmVjdG9yeSBub3QgZm91bmQ6Iik7CisgICAgICAgIGFzc2VydFByb3BlcnR5VW5zZXQoImphci5jbGFzc3BhdGgiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTm9Qcm9wZXJ0eSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0LWJhZC1uby1wcm9wZXJ0eSIsICJuby1wcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyAncHJvcGVydHknIGF0dHJpYnV0ZSEiKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlVbnNldCgiamFyLmNsYXNzcGF0aCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRQcm9wZXJ0eUV4aXN0cygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0LWJhZC1wcm9wZXJ0eS1leGlzdHMiLAorICAgICAgICAgICAgInByb3BlcnR5LWV4aXRzIiwgIlByb3BlcnR5ICdqYXIuY2xhc3NwYXRoJyBhbHJlYWR5IHNldCEiKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlFcXVhbHMoImphci5jbGFzc3BhdGgiLCAiZXhpc3RzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZE5vSmFyZmlsZSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0LWJhZC1uby1qYXJmaWxlIiwgIm5vLWphcmZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgJ2phcmZpbGUnIGF0dHJpYnV0ZSEiKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlVbnNldCgiamFyLmNsYXNzcGF0aCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWROb0NsYXNzUGF0aCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0LWJhZC1uby1jbGFzc3BhdGgiLCAibm8tY2xhc3NwYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIG5lc3RlZCA8Y2xhc3NwYXRoPiEiKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlVbnNldCgiamFyLmNsYXNzcGF0aCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnRMZXZlbDEoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QtcGFyZW50LWxldmVsMSIpOworCisgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKCJqYXIuY2xhc3NwYXRoIiwgImRzcC1jb3JlLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHNwLXByZXMvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc3Atdm9pZC8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL2dlbmVyYXRlZC9kc3AtY29yZS8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL2dlbmVyYXRlZC9kc3AtcHJlcy8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL2dlbmVyYXRlZC9kc3Atdm9pZC8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL3Jlc291cmNlcy9kc3AtY29yZS8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL3Jlc291cmNlcy9kc3AtcHJlcy8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL3Jlc291cmNlcy9kc3Atdm9pZC8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyZW50TGV2ZWwyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0LXBhcmVudC1sZXZlbDIiKTsKKworICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscygiamFyLmNsYXNzcGF0aCIsICIuLi9kc3AtY29yZS8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL2RzcC1wcmVzLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vZHNwLXZvaWQvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi9nZW5lcmF0ZWQvZHNwLWNvcmUvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi9nZW5lcmF0ZWQvZHNwLXByZXMvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi9nZW5lcmF0ZWQvZHNwLXZvaWQvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi9yZXNvdXJjZXMvZHNwLWNvcmUvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi9yZXNvdXJjZXMvZHNwLXByZXMvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi9yZXNvdXJjZXMvZHNwLXZvaWQvIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmVudExldmVsMlRvb0RlZXAoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdC1wYXJlbnQtbGV2ZWwyLXRvby1kZWVwIiwgIm5vcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gc3VpdGFibGUgcmVsYXRpdmUgcGF0aCBmcm9tICIpOworICAgICAgICBhc3NlcnRQcm9wZXJ0eVVuc2V0KCJqYXIuY2xhc3NwYXRoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBzZXVkb1RhaG9lUmVmaWQoKSB7CisgICAgICAgIGlmICghUmVnZXhwTWF0Y2hlckZhY3RvcnkucmVnZXhwTWF0Y2hlclByZXNlbnQocHJvamVjdCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCAndGVzdFBzZXVkb1RhaG9lUmVmaWQnIHNraXBwZWQgYmVjYXVzZSBubyByZWdleHAgbWF0Y2hlciBpcyBwcmVzZW50LiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QtcHNldWRvLXRhaG9lLXJlZmlkIik7CisgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKCJqYXIuY2xhc3NwYXRoIiwgImNsYXNzZXMvZHNwLWNvcmUvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc2VzL2RzcC1wcmVzLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3Nlcy9kc3Atdm9pZC8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZC9kc3AtY29yZS8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlcy9kc3AtY29yZS8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlcy9kc3AtcHJlcy8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHNldWRvVGFob2VOZXN0ZWQoKSB7CisgICAgICAgIGlmICghUmVnZXhwTWF0Y2hlckZhY3RvcnkucmVnZXhwTWF0Y2hlclByZXNlbnQocHJvamVjdCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCAndGVzdFBzZXVkb1RhaG9lTmVzdGVkJyBza2lwcGVkIGJlY2F1c2Ugbm8gcmVnZXhwIG1hdGNoZXIgaXMgcHJlc2VudC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0LXBzZXVkby10YWhvZS1uZXN0ZWQiKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlFcXVhbHMoImphci5jbGFzc3BhdGgiLCAiY2xhc3Nlcy9kc3AtY29yZS8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzZXMvZHNwLXByZXMvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc2VzL2RzcC12b2lkLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkL2RzcC1jb3JlLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VzL2RzcC1jb3JlLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VzL2RzcC1wcmVzLyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnRMZXZlbDJXaXRoSmFycygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdC1wYXJlbnQtbGV2ZWwyLXdpdGgtamFycyIpOworCisgICAgICAgIGFzc2VydFByb3BlcnR5RXF1YWxzKCJqYXIuY2xhc3NwYXRoIiwgIi4uLy4uL2xpYi9hY21lLWNvcmUuamFyICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi9saWIvYWNtZS1wcmVzLmphciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vZHNwLWNvcmUvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi9kc3AtcHJlcy8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uL2RzcC12b2lkLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vLi4vZ2VuZXJhdGVkL2RzcC1jb3JlLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vLi4vZ2VuZXJhdGVkL2RzcC1wcmVzLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vLi4vZ2VuZXJhdGVkL2RzcC12b2lkLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vLi4vcmVzb3VyY2VzL2RzcC1jb3JlLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vLi4vcmVzb3VyY2VzL2RzcC1wcmVzLyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vLi4vcmVzb3VyY2VzL2RzcC12b2lkLyIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJuYXRpb25hbEdlcm1hbigpIHsKKyAgICAgICAgaWYgKCFKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV80KSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHdpdGggaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzIHNraXBwZWQgdW5kZXIgcHJlIDEuNCBqdm0uIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiaW50ZXJuYXRpb25hbC1nZXJtYW4iKTsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygicnVuLXR3by1qYXJzIiwgImJldGEgYWxwaGEiKTsKKyAgICAgICAgICAgIAorICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJuYXRpb25hbEhlYnJldygpIHsKKyAgICAgICAgaWYgKCFKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV80KSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHdpdGggaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzIHNraXBwZWQgdW5kZXIgcHJlIDEuNCBqdm0uIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFPcy5pc0ZhbWlseSgid2luZG93cyIpKSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJpbnRlcm5hdGlvbmFsLWhlYnJldyIpOworICAgICAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygicnVuLXR3by1qYXJzIiwgImJldGEgYWxwaGEiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCB3aXRoIGhlYnJldyBwYXRoIG5vdCBhdHRlbXB0ZWQgdW5kZXIgV2luZG93cyIpOworICAgICAgICB9CisKKyAgICB9CisKK30gLy8gRU5EIGNsYXNzIE1hbmlmZXN0Q2xhc3NQYXRoVGVzdAorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1NDczYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdFRlc3QuamF2YQpAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogVGVzdGNhc2UgZm9yIHRoZSBNYW5pZmVzdCBjbGFzcyB1c2VkIGluIHRoZSBqYXIgdGFzay4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNYW5pZmVzdFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEFOREVEX01BTklGRVNUCisgICAgICAgID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX0xJTkUKKyAgICAgICAgPSAiQVJlYWxseUxvbmdMaW5lVG9UZXN0TGluZUJyZWFraW5nSW5NYW5pZmVzdHMtQUNhcGFiaWxpdHlXaGljaCIgKworICAgICAgICAgICJJc1N1cmVUb0xlYWRUb0h1bmRyZWRzT2ZRdWVzdGlvbnNBYm91dFdoeUFudE11bmdlc01hbmlmZXN0cyIgKworICAgICAgICAgICJPZkNvdXJzZVRoZUFuc3dlcklzVGhhdElzV2hhdFRoZVNwZWNSZXF1aXJlc0FuZElmQW55dGhpbmdIYXMiICsKKyAgICAgICAgICAiQVByb2JsZW1XaXRoVGhhdEl0SXNOb3RBQnVnSW5BbnQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR183MF9OQU1FIAorICAgICAgICA9ICJUaGlzTmFtZUlzSnVzdFNldmVudHlDaGFyYWN0ZXJzV2hpY2hJc0FsbG93ZWRBY2NvcmRpbmdUb1RoZVNwZWNzRmlsbGVyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HXzY4X05BTUUgCisgICAgICAgID0gIlRoaXNOYW1lSXNKdXN0U2l4dHlFaWdodENoYXJhY3RlcnNXaGljaElzQWxsb3dlZEFjY29yZGluZ1RvVGhlU3BlY3NYIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfTE9OR19OQU1FIAorICAgICAgICA9ICJOYW1lSXNKdXN0VW5kZXJTZXZlbnR5Q2hhcmFjdGVyc1doaWNoSXNBbGxvd2VkQWNjb3JkaW5nVGhlU3BlYyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJOT1RfTE9ORyI7CisKKyAgICBwdWJsaWMgTWFuaWZlc3RUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBtYW5pZmVzdCAtIGlzIE9LCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdChFWFBBTkRFRF9NQU5JRkVTVCk7CisgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gbWFuaWZlc3QuZ2V0TWFuaWZlc3RWZXJzaW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWFuaWZlc3Qgd2FzIG5vdCBjcmVhdGVkIHdpdGggY29ycmVjdCB2ZXJzaW9uIC0gIiwgIjEuMCIsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBNYW5pZmVzdCB3aXRoIHZlcnNpb24gMi4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKKyAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdChFWFBBTkRFRF9NQU5JRkVTVCk7CisgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gbWFuaWZlc3QuZ2V0TWFuaWZlc3RWZXJzaW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWFuaWZlc3Qgd2FzIG5vdCBjcmVhdGVkIHdpdGggY29ycmVjdCB2ZXJzaW9uIC0gIiwgIjIuMCIsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbGZvcm1lZCBtYW5pZmVzdCAtIG5vIDogb24gdGhlIGxpbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0MyIsICJNYW5pZmVzdCBpcyBpbnZhbGlkIC0gbm8gY29sb24gb24gaGVhZGVyIGxpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgTWFuaWZlc3QiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWxmb3JtZWQgbWFuaWZlc3QgLSBzdGFydHMgd2l0aCBjb250aW51YXRpb24gbGluZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3Q0IiwgIk1hbmlmZXN0IGlzIGludmFsaWQgLSBzZWN0aW9uIHN0YXJ0cyB3aXRoIGNvbnRpbnVhdGlvbiBsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIE1hbmlmZXN0Iik7CisgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWxmb3JtZWQgbWFuaWZlc3QgLSBOYW1lIGF0dHJpYnV0ZSBpbiBtYWluIHNlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IGdldExvZygpOworICAgICAgICBib29sZWFuIGhhc1dhcm5pbmcgPSBvdXRwdXQuaW5kZXhPZigiTWFuaWZlc3Qgd2FybmluZzogXCJOYW1lXCIgYXR0cmlidXRlcyBzaG91bGQgbm90IG9jY3VyIGluIHRoZSBtYWluIHNlY3Rpb24iKSAhPSAtMTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgd2FybmluZyBhYm91dCBOYW1lIGluIG1haW4gc2VjdGlvbiIsIGhhc1dhcm5pbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5ldyBTZWN0aW9uIG5vdCBzdGFydGluZyB3aXRoIE5hbWUgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3Q2IiwgIk1hbmlmZXN0IGlzIGludmFsaWQgLSBzZWN0aW9uIHN0YXJ0cyB3aXRoIGluY29ycmVjdCBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgTWFuaWZlc3QiKTsKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IGdldExvZygpOworICAgICAgICBib29sZWFuIGhhc1dhcm5pbmcgPSBvdXRwdXQuaW5kZXhPZigiTWFuaWZlc3Qgc2VjdGlvbnMgc2hvdWxkIHN0YXJ0IHdpdGggYSBcIk5hbWVcIiBhdHRyaWJ1dGUiKSAhPSAtMTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgd2FybmluZyBhYm91dCBzZWN0aW9uIG5vdCBzdGFydGluZyB3aXRoIE5hbWU6IGF0dHJpYnV0ZSIsIGhhc1dhcm5pbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZyb20gYXR0cmlidXRlIGlzIGlsbGVnYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0NygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDciKTsKKworICAgICAgICBib29sZWFuIGhhc1dhcm5pbmcgPSBnZXRMb2coKS5pbmRleE9mKE1hbmlmZXN0LkVSUk9SX0ZST01fRk9SQklEREVOKSAhPSAtMTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgd2FybmluZyBhYm91dCBGcm9tOiBhdHRyaWJ1dGUiLCBoYXNXYXJuaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmxpbmUgbWFuaWZlc3QgLSBPSworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3Q4KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNYW5pZmVzdEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q4Iik7CisgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3QoRVhQQU5ERURfTUFOSUZFU1QpOworICAgICAgICBNYW5pZmVzdC5TZWN0aW9uIG1haW5TZWN0aW9uID0gbWFuaWZlc3QuZ2V0TWFpblNlY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzcGF0aCA9IG1haW5TZWN0aW9uLmdldEF0dHJpYnV0ZVZhbHVlKCJjbGFzcy1wYXRoIik7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2xhc3MtUGF0aCBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQgY29ycmVjdGx5IC0gIiwgImZ1YmFyIiwgY2xhc3NwYXRoKTsKKworICAgICAgICBNYW5pZmVzdC5TZWN0aW9uIHRlc3RTZWN0aW9uID0gbWFuaWZlc3QuZ2V0U2VjdGlvbigiVGVzdCIpOworICAgICAgICBTdHJpbmcgdGVzdEF0dHIgPSB0ZXN0U2VjdGlvbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiVGVzdEF0dHIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0QXR0ciBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQgY29ycmVjdGx5IC0gIiwgIlRlc3QiLCB0ZXN0QXR0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5saW5lIG1hbmlmZXN0IC0gSW52YWxpZCBzaW5jZSBoYXMgYSBOYW1lIGF0dHJpYnV0ZSBpbiB0aGUgc2VjdGlvbiBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdDkoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdDkiLCAiQ29uc3RydWN0aW9uIGlzIGludmFsaWQgLSBOYW1lIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpZnkgdGhlIHNlY3Rpb24gbmFtZSB1c2luZyB0aGUgXCJuYW1lXCIgYXR0cmlidXRlIG9mIHRoZSA8c2VjdGlvbj4gZWxlbWVudCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElubGluZSBtYW5pZmVzdCAtIEludmFsaWQgYXR0cmlidXRlIHdpdGhvdXQgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0MTAiLCAiQXR0cmlidXRlIGhhcyBubyBuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGVzIG11c3QgaGF2ZSBuYW1lIGFuZCB2YWx1ZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElubGluZSBtYW5pZmVzdCAtIEludmFsaWQgYXR0cmlidXRlIHdpdGhvdXQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTEoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdDExIiwgIkF0dHJpYnV0ZSBoYXMgbm8gdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZXMgbXVzdCBoYXZlIG5hbWUgYW5kIHZhbHVlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5saW5lIG1hbmlmZXN0IC0gSW52YWxpZCBhdHRyaWJ1dGUgd2l0aG91dCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxMigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0MTIiLCAiU2VjdGlvbiB3aXRoIG5vIG5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlY3Rpb25zIG11c3QgaGF2ZSBhIG5hbWUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmxpbmUgbWFuaWZlc3QgLSBEdXBsaWNhdGUgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdDEzKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3QxMyIsICJEdXBsaWNhdGUgQXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgYXR0cmlidXRlIFwiVGVzdFwiIG1heSBub3Qgb2NjdXIgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIHNhbWUgc2VjdGlvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElubGluZSBtYW5pZmVzdCAtIE9LIHNpbmNlIGNsYXNzcGF0aCBlbnRyaWVzIGNhbiBiZSBkdXBsaWNhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxNCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWFuaWZlc3RFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTQiKTsKKyAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdChFWFBBTkRFRF9NQU5JRkVTVCk7CisgICAgICAgIE1hbmlmZXN0LlNlY3Rpb24gbWFpblNlY3Rpb24gPSBtYW5pZmVzdC5nZXRNYWluU2VjdGlvbigpOworICAgICAgICBTdHJpbmcgY2xhc3NwYXRoID0gbWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoImNsYXNzLXBhdGgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGFzcy1QYXRoIGF0dHJpYnV0ZSB3YXMgbm90IHNldCBjb3JyZWN0bHkgLSAiLAorICAgICAgICAgICAgIlRlc3QxIFRlc3QyIFRlc3QzIFRlc3Q0IiwgY2xhc3NwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXRzIGxvbmcgbGluZSB3cmFwcGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMb25nTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWFuaWZlc3RFeGNlcHRpb24geworICAgICAgICBQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIHAuc2V0VXNlclByb3BlcnR5KCJ0ZXN0LmxvbmdsaW5lIiwgTE9OR19MSU5FKTsKKyAgICAgICAgcC5zZXRVc2VyUHJvcGVydHkoInRlc3QubG9uZzY4bmFtZSIgLCBMT05HXzY4X05BTUUpOworICAgICAgICBwLnNldFVzZXJQcm9wZXJ0eSgidGVzdC5sb25nNzBuYW1lIiAsIExPTkdfNzBfTkFNRSk7CisgICAgICAgIHAuc2V0VXNlclByb3BlcnR5KCJ0ZXN0Lm5vdGxvbmduYW1lIiAsIE5PVF9MT05HX05BTUUpOworICAgICAgICBwLnNldFVzZXJQcm9wZXJ0eSgidGVzdC52YWx1ZSIsIFZBTFVFKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdExvbmdMaW5lIik7CisKKyAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdChFWFBBTkRFRF9NQU5JRkVTVCk7CisgICAgICAgIE1hbmlmZXN0LlNlY3Rpb24gbWFpblNlY3Rpb24gPSBtYW5pZmVzdC5nZXRNYWluU2VjdGlvbigpOworICAgICAgICBTdHJpbmcgY2xhc3NwYXRoID0gbWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoImNsYXNzLXBhdGgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGFzcy1QYXRoIGF0dHJpYnV0ZSB3YXMgbm90IHNldCBjb3JyZWN0bHkgLSAiLAorICAgICAgICAgICAgTE9OR19MSU5FLCBjbGFzc3BhdGgpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gbWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoTE9OR182OF9OQU1FKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMT05HXzY4X05BTUVfVkFMVUVfTUlTTUFUQ0giLCBWQUxVRSwgdmFsdWUpOworICAgICAgICB2YWx1ZSA9IG1haW5TZWN0aW9uLmdldEF0dHJpYnV0ZVZhbHVlKExPTkdfNzBfTkFNRSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTE9OR183MF9OQU1FX1ZBTFVFX01JU01BVENIIiwgVkFMVUUsIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBtYWluU2VjdGlvbi5nZXRBdHRyaWJ1dGVWYWx1ZShOT1RfTE9OR19OQU1FKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOT1RfTE9OR19OQU1FX1ZBTFVFX01JU01BVENIIiwgVkFMVUUsIHZhbHVlKTsKKyAgICAgICAgCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKEVYUEFOREVEX01BTklGRVNUKSk7CisgICAgICAgIAorICAgICAgICBTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU3RyaW5nIHJlYWQgPSBpbi5yZWFkTGluZSgpOworICAgICAgICB3aGlsZSAocmVhZCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQuYWRkKHJlYWQpOworICAgICAgICAgICAgcmVhZCA9IGluLnJlYWRMaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFzc2VydFRydWUoIk1hbmlmZXN0IGZpbGUgc2hvdWxkIGhhdmUgY29udGFpbmVkIHN0cmluZyAiLCBzZXQKKyAgICAgICAgICAgICAgICAucmVtb3ZlKCIgTk9UX0xPTkciKSk7CisgICAgICAgIGFzc2VydFRydWUoIk1hbmlmZXN0IGZpbGUgc2hvdWxkIGhhdmUgY29udGFpbmVkIHN0cmluZyAiLCBzZXQKKyAgICAgICAgICAgICAgICAucmVtb3ZlKCIgTkciKSk7CisgICAgICAgIGFzc2VydFRydWUoIk1hbmlmZXN0IGZpbGUgc2hvdWxkIGhhdmUgY29udGFpbmVkIHN0cmluZyAiLCBzZXQKKyAgICAgICAgICAgICAgICAucmVtb3ZlKExPTkdfNzBfTkFNRSArICI6ICIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFuaWZlc3QgZmlsZSBzaG91bGQgaGF2ZSBjb250YWluZWQgc3RyaW5nICIsIHNldAorICAgICAgICAgICAgICAgIC5yZW1vdmUoTk9UX0xPTkdfTkFNRSArICI6IE5PVF9MTyIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBvcmRlcmluZyBvZiBzZWN0aW9ucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlcjEoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE9yZGVyMSIpOworCisgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3QoRVhQQU5ERURfTUFOSUZFU1QpOworICAgICAgICBFbnVtZXJhdGlvbiBlID0gbWFuaWZlc3QuZ2V0U2VjdGlvbk5hbWVzKCk7CisgICAgICAgIFN0cmluZyBzZWN0aW9uMSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOworICAgICAgICBTdHJpbmcgc2VjdGlvbjIgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaXJzdCBzZWN0aW9uIG5hbWUgdW5leHBlY3RlZCIsICJUZXN0MSIsIHNlY3Rpb24xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZWNvbmQgc2VjdGlvbiBuYW1lIHVuZXhwZWN0ZWQiLCAiVGVzdDIiLCBzZWN0aW9uMik7CisKKyAgICAgICAgTWFuaWZlc3QuU2VjdGlvbiBzZWN0aW9uID0gbWFuaWZlc3QuZ2V0U2VjdGlvbigiVGVzdDEiKTsKKyAgICAgICAgZSA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlS2V5cygpOworICAgICAgICBTdHJpbmcgYXR0cjFLZXkgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgU3RyaW5nIGF0dHIyS2V5ID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgIFN0cmluZyBhdHRyMSA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlKGF0dHIxS2V5KS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBhdHRyMiA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlKGF0dHIyS2V5KS5nZXROYW1lKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmlyc3QgYXR0cmlidXRlIG5hbWUgdW5leHBlY3RlZCIsICJUZXN0QXR0cjEiLCBhdHRyMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2Vjb25kIGF0dHJpYnV0ZSBuYW1lIHVuZXhwZWN0ZWQiLCAiVGVzdEF0dHIyIiwgYXR0cjIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG9yZGVyaW5nIG9mIHNlY3Rpb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyMigpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWFuaWZlc3RFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0T3JkZXIyIik7CisKKyAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdChFWFBBTkRFRF9NQU5JRkVTVCk7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBtYW5pZmVzdC5nZXRTZWN0aW9uTmFtZXMoKTsKKyAgICAgICAgU3RyaW5nIHNlY3Rpb24xID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgIFN0cmluZyBzZWN0aW9uMiA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZpcnN0IHNlY3Rpb24gbmFtZSB1bmV4cGVjdGVkIiwgIlRlc3QyIiwgc2VjdGlvbjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNlY29uZCBzZWN0aW9uIG5hbWUgdW5leHBlY3RlZCIsICJUZXN0MSIsIHNlY3Rpb24yKTsKKworICAgICAgICBNYW5pZmVzdC5TZWN0aW9uIHNlY3Rpb24gPSBtYW5pZmVzdC5nZXRTZWN0aW9uKCJUZXN0MSIpOworICAgICAgICBlID0gc2VjdGlvbi5nZXRBdHRyaWJ1dGVLZXlzKCk7CisgICAgICAgIFN0cmluZyBhdHRyMUtleSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOworICAgICAgICBTdHJpbmcgYXR0cjJLZXkgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgU3RyaW5nIGF0dHIxID0gc2VjdGlvbi5nZXRBdHRyaWJ1dGUoYXR0cjFLZXkpLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGF0dHIyID0gc2VjdGlvbi5nZXRBdHRyaWJ1dGUoYXR0cjJLZXkpLmdldE5hbWUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaXJzdCBhdHRyaWJ1dGUgbmFtZSB1bmV4cGVjdGVkIiwgIlRlc3RBdHRyMiIsIGF0dHIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZWNvbmQgYXR0cmlidXRlIG5hbWUgdW5leHBlY3RlZCIsICJUZXN0QXR0cjEiLCBhdHRyMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZmlsZSBhdHRyaWJ1dGUgZm9yIG1hbmlmZXN0IHRhc2sgaXMgcmVxdWlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5vRmlsZSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3ROb0ZpbGUiLCAiZmlsZSBpcyByZXF1aXJlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcGxhY2UgY2hhbmdlcyBNYW5pZmVzdC1WZXJzaW9uIGZyb20gMi4wIHRvIDEuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNYW5pZmVzdEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RSZXBsYWNlIik7CisgICAgICAgIE1hbmlmZXN0IG1mID0gZ2V0TWFuaWZlc3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21mdGVzdC5tZiIpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1mKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1hbmlmZXN0LmdldERlZmF1bHRNYW5pZmVzdCgpLCBtZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdXBkYXRlIGtlZXBzIHRoZSBNYW5pZmVzdC1WZXJzaW9uIGFuZCBhZGRzIGEgbmV3IGF0dHJpYnV0ZSBGb28KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNYW5pZmVzdEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RVcGRhdGUiKTsKKyAgICAgICAgTWFuaWZlc3QgbWYgPSBnZXRNYW5pZmVzdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWZ0ZXN0Lm1mIik7CisgICAgICAgIGFzc2VydE5vdE51bGwobWYpOworICAgICAgICBhc3NlcnRUcnVlKCFNYW5pZmVzdC5nZXREZWZhdWx0TWFuaWZlc3QoKS5lcXVhbHMobWYpKTsKKyAgICAgICAgU3RyaW5nIG1mQXNTdHJpbmcgPSBtZi50b1N0cmluZygpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1mQXNTdHJpbmcpOworICAgICAgICBhc3NlcnRUcnVlKG1mQXNTdHJpbmcuc3RhcnRzV2l0aCgiTWFuaWZlc3QtVmVyc2lvbjogMi4wIikpOworICAgICAgICBhc3NlcnRUcnVlKG1mQXNTdHJpbmcuaW5kZXhPZigiRm9vOiBCYXIiKSA+IC0xKTsKKworICAgICAgICBtZiA9IGdldE1hbmlmZXN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tZnRlc3QyLm1mIik7CisgICAgICAgIGFzc2VydE5vdE51bGwobWYpOworICAgICAgICBtZkFzU3RyaW5nID0gbWYudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZkFzU3RyaW5nKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBtZkFzU3RyaW5nLmluZGV4T2YoIkZvbzogQmFyIikpOworICAgICAgICBhc3NlcnRUcnVlKG1mQXNTdHJpbmcuaW5kZXhPZigiRm9vOiBCYXoiKSA+IC0xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbSgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygidGVzdEZyb20iLCBNYW5pZmVzdC5FUlJPUl9GUk9NX0ZPUkJJRERFTik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElsbGVnYWxOYW1lKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdElsbGVnYWxOYW1lIiwgIk1hbmlmZXN0IGF0dHJpYnV0ZSBuYW1lcyBtdXN0IG5vdCBjb250YWluICcgJyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsTmFtZUluU2VjdGlvbigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3RJbGxlZ2FsTmFtZUluU2VjdGlvbiIsICJNYW5pZmVzdCBhdHRyaWJ1dGUgbmFtZXMgbXVzdCBub3QgY29udGFpbiAnICciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbE5hbWVCZWdpbigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3RJbGxlZ2FsTmFtZUluU2VjdGlvbiIsICJNYW5pZmVzdCBhdHRyaWJ1dGUgbmFtZXMgbXVzdCBub3Qgc3RhcnQgd2l0aCAnLScgYXQgdGhlIGJlZ2luLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsTmFtZTIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0SWxsZWdhbE5hbWUiLCAiTWFuaWZlc3QgYXR0cmlidXRlIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gJy4nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElsbGVnYWxOYW1lMygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3RJbGxlZ2FsTmFtZSIsICJNYW5pZmVzdCBhdHRyaWJ1dGUgbmFtZXMgbXVzdCBub3QgY29udGFpbiAnKiciKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBtZnRlc3QubWYuCisgICAgICovCisgICAgcHJpdmF0ZSBNYW5pZmVzdCBnZXRNYW5pZmVzdChTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWFuaWZlc3RFeGNlcHRpb24geworICAgICAgICBGaWxlUmVhZGVyIHIgPSBuZXcgRmlsZVJlYWRlcihuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgZmlsZW5hbWUpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFuaWZlc3Qocik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWtkaXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWtkaXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhMTA3OAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Na2RpclRlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBNa2RpclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBNa2RpclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21rZGlyLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAiZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIGFzIGEgZmlsZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICBqYXZhLmlvLkZpbGUgZiA9IG5ldyBqYXZhLmlvLkZpbGUoZ2V0UHJvamVjdERpcigpLCAidGVzdGRpci50bXAiKTsKKyAgICAgICAgaWYgKCFmLmV4aXN0cygpIHx8ICFmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGZhaWwoIm1rZGlyIGZhaWxlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Nb3ZlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01vdmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1ZGM3MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Nb3ZlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFRlc3RzIHRoZSBNb3ZlIHRhc2suCisgKgorICovCitwdWJsaWMgY2xhc3MgTW92ZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwdWJsaWMgTW92ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21vdmUueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbHRlclNldCIpOworICAgICAgICBGaWxlIHRtcCAgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJtb3ZlLmZpbHRlcnNldC50bXAiKTsKKyAgICAgICAgRmlsZSBjaGVjayAgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJleHBlY3RlZC9jb3B5LmZpbHRlcnNldC5maWx0ZXJlZCIpOworICAgICAgICBhc3NlcnRUcnVlKHRtcC5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5jb250ZW50RXF1YWxzKHRtcCwgY2hlY2spKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyQ2hhaW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyQ2hhaW4iKTsKKyAgICAgICAgRmlsZSB0bXAgID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCAibW92ZS5maWx0ZXJjaGFpbi50bXAiKTsKKyAgICAgICAgRmlsZSBjaGVjayAgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJleHBlY3RlZC9jb3B5LmZpbHRlcnNldC5maWx0ZXJlZCIpOworICAgICAgICBhc3NlcnRUcnVlKHRtcC5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5jb250ZW50RXF1YWxzKHRtcCwgY2hlY2spKTsKKyAgICB9CisKKyAgICAvKiogQnVnemlsbGEgUmVwb3J0IDExNzMyICovCisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeVJlbW92YWwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RGlyZWN0b3J5UmVtb3ZhbCIpOworICAgICAgICBhc3NlcnRUcnVlKCFnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkUvQi8xIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiRS9DLzIiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJFL0QvMyIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkEvQi8xIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCFnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkEvQy8yIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCFnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkEvRC8zIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCFnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkEvQyIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJBL0QiKS5leGlzdHMoKSk7CisgICAgfQorCisgICAgLyoqIEJ1Z3ppbGxhIFJlcG9ydCAxODg4NiAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3RvcnlSZXRhaW5pbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RGlyZWN0b3J5UmV0YWluaW5nIik7CisgICAgICAgIGFzc2VydFRydWUoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJFIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiRS8xIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCFnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkEvMSIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkEiKS5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUoInRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVEaXJlY3RvcnlNb3ZlMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUoInRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUyIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUoU3RyaW5nIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBhc3NlcnRUcnVlKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiRSIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkUvMSIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJBLzEiKS5leGlzdHMoKSk7CisgICAgICAgIC8vIDxwYXRoPiBzd2FsbG93cyB0aGUgYmFzZWRpciwgaXQgc2VlbXMKKyAgICAgICAgLy9hc3NlcnRUcnVlKCFnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkEiKS5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhFbGVtZW50TW92ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RQYXRoRWxlbWVudE1vdmUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIkUiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJFLzEiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoIWdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiQS8xIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiQSIpLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZUZpbGVBbmRGaWxlc2V0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0TW92ZUZpbGVBbmRGaWxlc2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZVRvRXhpc3RpbmdEaXIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmVUb0V4aXN0aW5nRGlyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0ZpbGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmVGaWxlVG9GaWxlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0RpcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0RpciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmVGaWxlQW5kRmlsZXNldCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVBbmRGaWxlc2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0V4aXN0aW5nRmlsZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0V4aXN0aW5nRmlsZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmVGaWxlVG9FeGlzdGluZ0RpcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0V4aXN0aW5nRGlyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0RpcldpdGhFeGlzdGluZ0ZpbGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmVGaWxlVG9EaXJXaXRoRXhpc3RpbmdGaWxlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0RpcldpdGhFeGlzdGluZ0RpcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZUZpbGVUb0RpcldpdGhFeGlzdGluZ0RpciIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL011bHRpTWFwVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL011bHRpTWFwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGE4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTXVsdGlNYXBUZXN0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVOYW1lTWFwcGVyOworCisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlNYXBUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgTXVsdGlNYXBUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tdWx0aW1hcC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUNvcHkoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoIm11bHRpY29weSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aU1vdmUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoIm11bHRpbW92ZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVDb3B5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJzaW5nbGVjb3B5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZU1vdmUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInNpbmdsZW1vdmUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weVdpdGhFbXB0eSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY29weXdpdGhlbXB0eSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNb3ZlV2l0aEVtcHR5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJtb3Zld2l0aGVtcHR5Iik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TWFwcGVyIGltcGxlbWVudHMgRmlsZU5hbWVNYXBwZXIgeworICAgICAgICBwdWJsaWMgVGVzdE1hcHBlcigpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykge30KKyAgICAgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKGZpbmFsIFN0cmluZyBzb3VyY2VfZmlsZV9uYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICBzb3VyY2VfZmlsZV9uYW1lLCBzb3VyY2VfZmlsZV9uYW1lKyIuY29weTIiIH07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTmljZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9OaWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZDQ4M2EKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIHRlc3QgbmljZQorICovCitwdWJsaWMgY2xhc3MgTmljZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBOaWNlVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbmljZS54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9vcCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibm9vcCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJyZW50KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjdXJyZW50Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZhc3RlcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZmFzdGVyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNsb3dlcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgic2xvd2VyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRvb1Nsb3coKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygKKyAgICAgICAgICAgICAgICAidG9vX3Nsb3ciLCJvdXQgb2YgcmFuZ2UiLCJvdXQgb2YgdGhlIHJhbmdlIDEtMTAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9vRmFzdCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKAorICAgICAgICAgICAgICAgICJ0b29fZmFzdCIsICJvdXQgb2YgcmFuZ2UiLCAib3V0IG9mIHRoZSByYW5nZSAxLTEwIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGFyYWxsZWxUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGFyYWxsZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiM2NiNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXJhbGxlbFRlc3QuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EZW11eE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIFRlc3Qgb2YgdGhlIHBhcmFsbGVsIFRhc2tDb250YWluZXIKKyAqCisgKiBAY3JlYXRlZCAyMSBGZWJydWFyeSAyMDAyCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICAvKiogU3RhbmRhcmQgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBiYXNpYyB0ZXN0ICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElSRUNUX01FU1NBR0UgPSAiZGlyZWN0IjsKKyAgICAvKiogU3RhbmRhcmQgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBiYXNpYyBhbmQgZmFpbCB0ZXN0ICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVMQVlFRF9NRVNTQUdFID0gImRlbGF5ZWQiOworICAgIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGZhaWwgdGVzdCAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZBSUxVUkVfTUVTU0FHRSA9ICJmYWlsdXJlIjsKKworICAgIC8qKiB0aGUgYnVpbGQgZmllbCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0ICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVTVF9CVUlMRF9GSUxFCisgICAgICAgICA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wYXJhbGxlbC54bWwiOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBQYXJhbGxlbFRlc3Qgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSB0ZXN0CisgICAgICovCisgICAgcHVibGljIFBhcmFsbGVsVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKiogVGhlIEpVbml0IHNldHVwIG1ldGhvZCAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRFU1RfQlVJTERfRklMRSk7CisgICAgfQorCisgICAgLyoqIHRlc3RzIGJhc2ljIG9wZXJhdGlvbiBvZiB0aGUgcGFyYWxsZWwgdGFzayAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHsKKyAgICAgICAgLy8gc2hvdWxkIGdldCBubyBvdXRwdXQgYXQgYWxsCisgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgcC5zZXRVc2VyUHJvcGVydHkoInRlc3QuZGlyZWN0IiwgRElSRUNUX01FU1NBR0UpOworICAgICAgICBwLnNldFVzZXJQcm9wZXJ0eSgidGVzdC5kZWxheWVkIiwgREVMQVlFRF9NRVNTQUdFKTsKKyAgICAgICAgZXhwZWN0T3V0cHV0QW5kRXJyb3IoInRlc3RCYXNpYyIsICIiLCAiIik7CisgICAgICAgIFN0cmluZyBsb2cgPSBnZXRMb2coKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbGxlbCB0YXNrcyBkaWRuJ3Qgb3V0cHV0IGNvcnJlY3QgZGF0YSIsIGxvZywKKyAgICAgICAgICAgIERJUkVDVF9NRVNTQUdFICsgREVMQVlFRF9NRVNTQUdFKTsKKworICAgIH0KKworICAgIC8qKiB0ZXN0cyBiYXNpYyBvcGVyYXRpb24gb2YgdGhlIHBhcmFsbGVsIHRhc2sgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkQ291bnQoKSB7CisgICAgICAgIC8vIHNob3VsZCBnZXQgbm8gb3V0cHV0IGF0IGFsbAorICAgICAgICBQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIHAuc2V0VXNlclByb3BlcnR5KCJ0ZXN0LmRpcmVjdCIsIERJUkVDVF9NRVNTQUdFKTsKKyAgICAgICAgcC5zZXRVc2VyUHJvcGVydHkoInRlc3QuZGVsYXllZCIsIERFTEFZRURfTUVTU0FHRSk7CisgICAgICAgIGV4cGVjdE91dHB1dEFuZEVycm9yKCJ0ZXN0VGhyZWFkQ291bnQiLCAiIiwgIiIpOworICAgICAgICBTdHJpbmcgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICB3aGlsZSAocG9zID4gLTEpIHsKKyAgICAgICAgICAgIHBvcyA9IGNvdW50VGhyZWFkcyhsb2csIHBvcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGUgdGVzdCByZXN1bHQgc3RyaW5nIHNob3VsZCBtYXRjaCB0aGUgcmVnZXgKKyAgICAgKiA8Y29kZT5eKFx8XGQrXC8oKy0pKikrXHwkPC9jb2RlPiBmb3Igc29tZXRpbmcgbGlrZQorICAgICAqIDxjb2RlPnwzLysrLS0rLXw1LysrKysrLS0tLS18PC9jb2RlPgorICAgICAqCisgICAgICpAcmV0dXJucyAtMSBubyBtb3JlIHRlc3RzCisgICAgICogICAgICAgICAgIyBzdGFydCBwb3Mgb2YgbmV4dCB0ZXN0CisgICAgICpAdGhyb3dzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiB3aGVuIGEgY29uc3RyYWludCBpcyBpbnZhbGlkCisgICAgICovCisgICAgc3RhdGljIGludCBjb3VudFRocmVhZHMoU3RyaW5nIHMsIGludCBzdGFydCkgeworICAgICAgICBpbnQgZmlyc3RQaXBlID0gcy5pbmRleE9mKCd8Jywgc3RhcnQpOworICAgICAgICBpbnQgYmVnaW5TbGFzaCA9IHMuaW5kZXhPZignLycsIGZpcnN0UGlwZSk7CisgICAgICAgIGludCBsYXN0UGlwZSA9IHMuaW5kZXhPZignfCcsIGJlZ2luU2xhc2gpOworICAgICAgICBpZiAoKGZpcnN0UGlwZSA9PSAtMSkgfHwgKGJlZ2luU2xhc2ggPT0gLTEpIHx8IChsYXN0UGlwZSA9PSAtMSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtYXggPSBJbnRlZ2VyLnBhcnNlSW50KHMuc3Vic3RyaW5nKGZpcnN0UGlwZSArIDEsIGJlZ2luU2xhc2gpKTsKKyAgICAgICAgaW50IGN1cnJlbnQgPSAwOworICAgICAgICBpbnQgcG9zID0gYmVnaW5TbGFzaCArIDE7CisgICAgICAgIHdoaWxlIChwb3MgPCBsYXN0UGlwZSkgeworICAgICAgICAgICAgc3dpdGNoIChzLmNoYXJBdChwb3MrKykpIHsKKyAgICAgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC0tOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIk9ubHkgZXhwZWN0ICcrLScgaW4gcmVzdWx0IGNvdW50LCBmb3VuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHMuY2hhckF0KC0tcG9zKSArICIgYXQgcG9zaXRpb24gIiArIHBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3VycmVudCA+IG1heCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigiTnVtYmVyIG9mIGV4ZWN1dGluZyB0aHJlYWRzIGV4Y2VlZGVkIG51bWJlciBhbGxvd2VkOiAiCisgICAgICAgICAgICAgICAgICAgICsgY3VycmVudCArICIgPiAiICsgbWF4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFzdFBpcGU7CisgICAgfQorCisKKyAgICAvKiogdGVzdHMgdGhlIGZhaWx1cmUgb2YgYSB0YXNrIHdpdGhpbiBhIHBhcmFsbGVsIGNvbnN0cnVjdGlvbiAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsKCkgeworICAgICAgICAvLyBzaG91bGQgZ2V0IG5vIG91dHB1dCBhdCBhbGwKKyAgICAgICAgUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOworICAgICAgICBwLnNldFVzZXJQcm9wZXJ0eSgidGVzdC5mYWlsdXJlIiwgRkFJTFVSRV9NRVNTQUdFKTsKKyAgICAgICAgcC5zZXRVc2VyUHJvcGVydHkoInRlc3QuZGVsYXllZCIsIERFTEFZRURfTUVTU0FHRSk7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEZhaWwiLAorICAgICAgICAgICAgImZhaWwgdGFzayBpbiBvbmUgcGFyYWxsZWwgYnJhbmNoIiwgRkFJTFVSRV9NRVNTQUdFKTsKKyAgICB9CisKKyAgICAvKiogdGVzdHMgdGhlIGRlbXV4aW5nIG9mIG91dHB1dCBzdHJlYW1zIGluIGEgbXVsdGl0aHJlYWRlZCBzaXR1YXRpb24gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVtdXgoKSB7CisgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgcC5hZGRUYXNrRGVmaW5pdGlvbigiZGVtdXh0ZXN0IiwgRGVtdXhPdXRwdXRUYXNrLmNsYXNzKTsKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gU3lzdGVtLm91dDsKKyAgICAgICAgUHJpbnRTdHJlYW0gZXJyID0gU3lzdGVtLmVycjsKKyAgICAgICAgU3lzdGVtLnNldE91dChuZXcgUHJpbnRTdHJlYW0obmV3IERlbXV4T3V0cHV0U3RyZWFtKHAsIGZhbHNlKSkpOworICAgICAgICBTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShuZXcgRGVtdXhPdXRwdXRTdHJlYW0ocCwgdHJ1ZSkpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5leGVjdXRlVGFyZ2V0KCJ0ZXN0RGVtdXgiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQob3V0KTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIoZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGF0aENvbnZlcnRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGF0aENvbnZlcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmY4NDI4YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRoQ29udmVydFRlc3QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIFVuaXQgdGVzdCBmb3IgdGhlICZsdDtwYXRoY29udmVydCZndDsgdGFzay4KKyAqLworcHVibGljIGNsYXNzIFBhdGhDb252ZXJ0VGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9QQVRIID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX0ZJTEVOQU1FID0gInBhdGhjb252ZXJ0LnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX0ZJTEUgPSBCVUlMRF9QQVRIICsgQlVJTERfRklMRU5BTUU7CisgICAgCisgICAgcHVibGljIFBhdGhDb252ZXJ0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChCVUlMRF9GSUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwKCkgeworICAgICAgICB0ZXN0KCJ0ZXN0bWFwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hcHBlcigpIHsKKyAgICAgICAgdGVzdCgidGVzdG1hcHBlciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb1RhcmdldE9zKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0bm90YXJnZXRvcyIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KFN0cmluZyB0YXJnZXQpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscygicmVzdWx0IiwgInRlc3QjIiArIEJVSUxEX0ZJTEVOQU1FKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QcmVTZXREZWZUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJlU2V0RGVmVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYTI1YmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJlU2V0RGVmVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVTZXREZWZUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgcHVibGljIFByZVNldERlZlRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ByZXNldGRlZi54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgeworICAgICAgICBleHBlY3RMb2coInNpbXBsZSIsICJIZWxsbyB3b3JsZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0KCkgeworICAgICAgICBleHBlY3RMb2coInRleHQiLCAiSW5uZXIgVGV4dCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcmkoKSB7CisgICAgICAgIGV4cGVjdExvZygidXJpIiwgIkhlbGxvIHdvcmxkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRUZXN0KCkgeworICAgICAgICBleHBlY3RMb2coImRlZmF1bHR0ZXN0IiwgImF0dHJpYnV0ZSBpcyBmYWxzZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVEZWZhdWx0KCkgeworICAgICAgICBleHBlY3RMb2coImRvdWJsZWRlZmF1bHQiLCAiYXR0cmlidXRlIGlzIGZhbHNlYXR0cmlidXRlIGlzIHRydWUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dE9wdGlvbmFsKCkgeworICAgICAgICBleHBlY3RMb2coInRleHQub3B0aW9uYWwiLCAiTXlUZXh0b3ZlcnJpZGUgdGV4dCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50T3JkZXIoKSB7CisgICAgICAgIGV4cGVjdExvZygiZWxlbWVudC5vcmRlciIsICJMaW5lIDFMaW5lIDIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudE9yZGVyMigpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJlbGVtZW50Lm9yZGVyMiIsICJMaW5lIDFMaW5lIDJMaW5lIDMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW50VHlwZVRlc3QoKSB7CisgICAgICAgIGV4cGVjdExvZygiYW50VHlwZVRlc3QiLCAiIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3RUYXNrTmFtZUJhZEF0dHIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygKKyAgICAgICAgICAgICJjb3JyZWN0X3Rhc2tuYW1lX2JhZGF0dHIiLCAiYXR0cmlidXRlIG1lc3NhZ2UiLCAiamF2YWMgZG9lc24ndCBzdXBwb3J0IHRoZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0VGFza05hbWVCYWRFbCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKAorICAgICAgICAgICAgImNvcnJlY3RfdGFza25hbWVfYmFkZWwiLCAiZWxlbWVudCBtZXNzYWdlIiwgImphdmFjIGRvZXNuJ3Qgc3VwcG9ydCB0aGUiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFByZXNldGRlZldpdGhOZXN0ZWRFbGVtZW50VHdpY2UoKSB7IC8vICMzODA1NgorICAgICAgICBleGVjdXRlVGFyZ2V0KCJwcmVzZXRkZWYtd2l0aC1uZXN0ZWQtZWxlbWVudC10d2ljZSIpOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJwcmVzZXRkZWYtd2l0aC1uZXN0ZWQtZWxlbWVudC10d2ljZSIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBIHRlc3QgY2xhc3MgdG8gY2hlY2sgZGVmYXVsdCBwcm9wZXJ0aWVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0VGVzdCBleHRlbmRzIFRhc2sgeworICAgICAgICBib29sZWFuIGlzU2V0ID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gYXR0cmlidXRlID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShib29sZWFuIGIpIHsKKyAgICAgICAgICAgIGlmIChpc1NldCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXR0cmlidXRlIEFscmVhZHkgc2V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSBiOworICAgICAgICAgICAgaXNTZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coImF0dHJpYnV0ZSBpcyAiICsgYXR0cmlidXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdGVzdCBjbGFzcyB0byBjaGVjayBwcmVzZXRkZWYgd2l0aCBhZGQgYW5kIGFkZENvbmZpZ3VyZWQgYW5kIGFudC10eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbnRUeXBlVGVzdCBleHRlbmRzIFRhc2sgeworICAgICAgICBwdWJsaWMgdm9pZCBhZGRGaWxlU2V0KEZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRDb25maWd1cmVkKEZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvY2Vzc0Rlc3Ryb3llclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9jZXNzRGVzdHJveWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGUwNGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvY2Vzc0Rlc3Ryb3llclRlc3QuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qCisgKiBDcmVhdGVkIG9uIEZlYiAxOSwgMjAwMworICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqLworcHVibGljIGNsYXNzIFByb2Nlc3NEZXN0cm95ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFByb2Nlc3NEZXN0cm95ZXJUZXN0LgorICAgICAqIEBwYXJhbSBhcmcwCisgICAgICovCisgICAgcHVibGljIFByb2Nlc3NEZXN0cm95ZXJUZXN0KFN0cmluZyBhcmcwKSB7CisgICAgICAgIHN1cGVyKGFyZzApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzRGVzdHJveWVyKCl7CisgICAgICAgIGlmIChKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJvY2Vzc0Rlc3Ryb3llciBwcm9jZXNzRGVzdHJveWVyID0gbmV3IFByb2Nlc3NEZXN0cm95ZXIoKTsKKyAgICAgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9CisgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYygKKyAgICAgICAgICAgICAgICAgICAgImphdmEgLWNwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiTm90IHJlZ2lzdGVyZWQgYXMgc2h1dGRvd24gaG9vayIsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVzdHJveWVyLmlzQWRkZWRBc1NodXRkb3duSG9vaygpKTsKKworICAgICAgICAgICAgcHJvY2Vzc0Rlc3Ryb3llci5hZGQocHJvY2Vzcyk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJlZ2lzdGVyZWQgYXMgc2h1dGRvd24gaG9vayIsCisgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZXN0cm95ZXIuaXNBZGRlZEFzU2h1dGRvd25Ib29rKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0Rlc3Ryb3llci5yZW1vdmUocHJvY2Vzcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJOb3QgcmVnaXN0ZXJlZCBhcyBzaHV0ZG93biBob29rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZXN0cm95ZXIuaXNBZGRlZEFzU2h1dGRvd25Ib29rKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CisgICAgICAgIG5ldyBQcm9jZXNzRGVzdHJveWVyVGVzdCgidGVzdFByb2Nlc3NEZXN0cm95ZXIiKS50ZXN0UHJvY2Vzc0Rlc3Ryb3llcigpOworICAgICAgICB0cnl7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNjAwMDApOworICAgICAgICB9Y2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpeworICAgICAgICAgICAgaWUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHlUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzMGY1MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwdWJsaWMgUHJvcGVydHlUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eS54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgLy8gc2hvdWxkIGdldCBubyBvdXRwdXQgYXQgYWxsCisgICAgICAgIGV4cGVjdE91dHB1dEFuZEVycm9yKCJ0ZXN0MSIsICIiLCAiIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGV4cGVjdExvZygidGVzdDIiLCAidGVzdHByb3AxPWFhLCB0ZXN0cHJvcDM9eHh5eSwgdGVzdHByb3A0PWFhenoiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNpcmN1bGFyIGRlZmluaXRpb24gbm90IGRldGVjdGVkIC0gIiwKKyAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIndhcyBjaXJjdWxhcmx5IGRlZmluZWQiKSAhPSAtMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRGlkIG5vdCB0aHJvdyBleGNlcHRpb24gb24gY2lyY3VsYXIgZXhjZXB0aW9uIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGV4cGVjdExvZygidGVzdDQiLCAiaHR0cC51cmwgaXMgaHR0cDovL2xvY2FsaG9zdDo5OTkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKKyAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImJhc2VkaXIiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSBGSUxFX1VUSUxTLnRvVVJJKAorICAgICAgICAgICAgICAgIGJhc2VEaXIgKyAiL3Byb3BlcnR5My5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkoCisgICAgICAgICAgICAgICAgInRlc3Q1LnVybCIsIHVyaSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgICAgICBleHBlY3RMb2coInRlc3Q1IiwgImh0dHAudXJsIGlzIGh0dHA6Ly9sb2NhbGhvc3Q6OTk5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeFN1Y2Nlc3MoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInByZWZpeC5zdWNjZXNzIik7CisgICAgICAgIGFzc2VydEVxdWFscygiODAiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJzZXJ2ZXIxLmh0dHAucG9ydCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZml4RmFpbHVyZSgpIHsKKyAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgicHJlZml4LmZhaWwiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUHJlZml4IGFsbG93ZWQgb24gbm9uLXJlc291cmNlL2ZpbGUgbG9hZCAtICIsIAorICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiUHJlZml4IGlzIG9ubHkgdmFsaWQiKSAhPSAtMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRGlkIG5vdCB0aHJvdyBleGNlcHRpb24gb24gaW52YWxpZCB1c2Ugb2YgcHJlZml4Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENpcmN1bGFyUmVmZXJlbmNlIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNpcmN1bGFyIGRlZmluaXRpb24gbm90IGRldGVjdGVkIC0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJ3YXMgY2lyY3VsYXJseSBkZWZpbmVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAhPSAtMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiRGlkIG5vdCB0aHJvdyBleGNlcHRpb24gb24gY2lyY3VsYXIgZXhjZXB0aW9uIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRoaXNJc05vdEFDaXJjdWxhclJlZmVyZW5jZSgpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJ0aGlzSXNOb3RBQ2lyY3VsYXJSZWZlcmVuY2UiLCAiYiBpcyBBL0EvQSIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sUHJvcGVydHkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuSXRlcmFibGUiKTsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RYbWxQcm9wZXJ0eSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJPTkUiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ4bWwub25lIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUV08iLCBwcm9qZWN0LmdldFByb3BlcnR5KCJ4bWwudHdvIikpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFhtbC1Mb2FkaW5nIG9ubHkgb24gSmF2YTUrCisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm90ZWN0ZWRKYXJNZXRob2RzVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3RlY3RlZEphck1ldGhvZHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5ZGY5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm90ZWN0ZWRKYXJNZXRob2RzVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBQcm90ZWN0ZWRKYXJNZXRob2RzVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlbXBKYXIgPSAidG1wLmphciI7CisKKyAgICBwdWJsaWMgUHJvdGVjdGVkSmFyTWV0aG9kc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phci54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFiRmlsZXNBbmREaXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEluZGV4VGVzdHMiKTsKKyAgICAgICAgU3RyaW5nIGFyY2hpdmUgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUodGVtcEphcikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIEFycmF5TGlzdCBkaXJzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBBcnJheUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkRGlycyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAic3ViLyIsCisgICAgICAgIH07CisgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkRmlsZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImZvbyIsCisgICAgICAgIH07CisgICAgICAgIEphci5ncmFiRmlsZXNBbmREaXJzKGFyY2hpdmUsIGRpcnMsIGZpbGVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRGlycy5sZW5ndGgsIGRpcnMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZERpcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZvdW5kICIgKyBleHBlY3RlZERpcnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgIGRpcnMuY29udGFpbnMoZXhwZWN0ZWREaXJzW2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmlsZXMubGVuZ3RoLCBmaWxlcy5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZvdW5kICIgKyBleHBlY3RlZEZpbGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5jb250YWlucyhleHBlY3RlZEZpbGVzW2ldKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZEphck5hbWVOb0NsYXNzcGF0aCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBKYXIuZmluZEphck5hbWUoImZvbyIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBKYXIuZmluZEphck5hbWUoImxpYiIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kSmFyTmFtZU5vTWF0Y2goKSB7CisgICAgICAgIGFzc2VydE51bGwoSmFyLmZpbmRKYXJOYW1lKCJmb28iLCBuZXcgU3RyaW5nW10geyJiYXIifSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kSmFyTmFtZVNpbXBsZU1hdGNoZXMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgSmFyLmZpbmRKYXJOYW1lKCJmb28iLCBuZXcgU3RyaW5nW10geyJmb28ifSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxpYi9mb28iLCBKYXIuZmluZEphck5hbWUoImZvbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJsaWIvZm9vIn0pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBKYXIuZmluZEphck5hbWUoImJhciIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiZm9vIn0pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaWIvZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgIEphci5maW5kSmFyTmFtZSgiYmFyIiArIEZpbGUuc2VwYXJhdG9yQ2hhciArICJmb28iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImxpYi9mb28ifSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kSmFyTmFtZUxvbmdlc3RNYXRjaFdpbnMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygibGliL2ZvbyIsCisgICAgICAgICAgICAgICAgICAgICBKYXIuZmluZEphck5hbWUoImxpYi9mb28iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJmb28iLCAibGliL2ZvbyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYi9iYXIvZm9vIn0pKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1MDAwNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWNvcmRlclRlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBSZWNvcmRlclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNfSU4gPSAicmVjb3JkZXIvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDX0RJUiA9ICJyZWNvcmRlci1vdXQvIjsKKworICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwdWJsaWMgUmVjb3JkZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZWNvcmRlci54bWwiKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgicHJlcGFyZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQXBwZW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibm9hcHBlbmQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTCisgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRFcXVhbHMocHJvamVjdC5yZXNvbHZlRmlsZShSRUNfSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlY3Rlc3QxLnJlc3VsdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QucmVzb2x2ZUZpbGUoUkVDX0RJUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVjdGVzdDEubG9nIiksIHRydWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiYXBwZW5kIik7CisgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUworICAgICAgICAgICAgICAgICAgIC5jb250ZW50RXF1YWxzKHByb2plY3QucmVzb2x2ZUZpbGUoUkVDX0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZWN0ZXN0Mi5yZXN1bHQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnJlc29sdmVGaWxlKFJFQ19ESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlY3Rlc3QyLmxvZyIpLCB0cnVlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc3RhcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJyZXN0YXJ0Iik7CisgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUworICAgICAgICAgICAgICAgICAgIC5jb250ZW50RXF1YWxzKHByb2plY3QucmVzb2x2ZUZpbGUoUkVDX0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZWN0ZXN0My5yZXN1bHQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnJlc29sdmVGaWxlKFJFQ19ESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlY3Rlc3QzLmxvZyIpLCB0cnVlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVJlc3RhcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJkZWxldGVyZXN0YXJ0Iik7CisgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUworICAgICAgICAgICAgICAgICAgIC5jb250ZW50RXF1YWxzKHByb2plY3QucmVzb2x2ZUZpbGUoUkVDX0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZWN0ZXN0NC5yZXN1bHQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnJlc29sdmVGaWxlKFJFQ19ESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlY3Rlc3Q0LmxvZyIpLCB0cnVlKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVuYW1lVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYwZmMxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZVRlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBSZW5hbWVUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgUmVuYW1lVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVuYW1lLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3QyIiwgInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7CisgICAgfQorLyoKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q0IiwgInNvdXJjZSBhbmQgZGVzdGluYXRpb24gdGhlIHNhbWUiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7CisgICAgfQorICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVwbGFjZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXBsYWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWU5MmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVwbGFjZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworaW1wb3J0IGphdmEuaW8uKjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBsYWNlVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFJlcGxhY2VUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDMiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDQiLCAiZW1wdHkgdG9rZW4gbm90IGFsbG93ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q2IiwgInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q3IiwgImVtcHR5IHRva2VuIG5vdCBhbGxvd2VkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDgoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q4Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDkoKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q5Iik7CisgICAgICAgIFN0cmluZyB0bXBkaXIgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJ0bXAuZGlyIik7CisgICAgICAgIGFzc2VydEVxdWFsQ29udGVudChuZXcgRmlsZSh0bXBkaXIsICJyZXN1bHQudHh0IiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHRtcGRpciwgIm91dHB1dC50eHQiKSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFsQ29udGVudChGaWxlIGV4cGVjdCwgRmlsZSByZXN1bHQpCisgICAgICAgIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvciwgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIXJlc3VsdC5leGlzdHMoKSkgeworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZmlsZSAiK3Jlc3VsdCsiIGRvZXNuXCd0IGV4aXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dFN0cmVhbSBpbkV4cGVjdCA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIGluUmVzdWx0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluRXhwZWN0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShleHBlY3QpKTsKKyAgICAgICAgICAgIGluUmVzdWx0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShyZXN1bHQpKTsKKworICAgICAgICAgICAgaW50IGV4cGVjdGVkQnl0ZSA9IGluRXhwZWN0LnJlYWQoKTsKKyAgICAgICAgICAgIHdoaWxlIChleHBlY3RlZEJ5dGUgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRCeXRlLCBpblJlc3VsdC5yZWFkKCkpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkQnl0ZSA9IGluRXhwZWN0LnJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRW5kIG9mIGZpbGUiLCAtMSwgaW5SZXN1bHQucmVhZCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpblJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5SZXN1bHQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbkV4cGVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5FeHBlY3QuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SbWljQWR2YW5jZWRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUm1pY0FkdmFuY2VkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjMwYTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUm1pY0FkdmFuY2VkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucm1pYy5SbWljQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMucm1pYy5EZWZhdWx0Um1pY0FkYXB0ZXI7CisKKy8qKgorICogRGF0ZTogMDQtQXVnLTIwMDQKKyAqIFRpbWU6IDIyOjE1OjQ2CisgKi8KK3B1YmxpYyBjbGFzcyBSbWljQWR2YW5jZWRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgUm1pY0FkdmFuY2VkVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvIjsKKworICAgIC8qKgorICAgICAqIFRoZSBKVW5pdCBzZXR1cCBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJybWljLnhtbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0ZWFyZG93biBtZXRob2QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlYXJkb3duIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdmVyaWZ5IHRoYXQgImRlZmF1bHQiIGJpbmRzIHVzIHRvIHRoZSBkZWZhdWx0IGNvbXBpbGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdERlZmF1bHQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB2ZXJpZnkgdGhhdCAiIiBiaW5kcyB1cyB0byB0aGUgZGVmYXVsdCBjb21waWxlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RW1wdHkiKTsKKyAgICB9CisgICAgLyoqCisgICAgICogdGVzdCBzdW4ncyBybWljIGNvbXBpbGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJtaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFJtaWMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHN1bidzIHJtaWMgY29tcGlsZXIgc3RyaXBzCisgICAgICogb3V0IC1KIGFyZ3VtZW50cyB3aGVuIG5vdCBmb3JraW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJtaWNKQXJnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RSbWljSkFyZyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RLYWZmZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0S2FmZmUiKTsKKyAgICB9CisgICAgLy8gV0xybWljIHRlc3RzIGRvbid0IHdvcmsKKyAgICAvKioKKyAgICAgKiB0ZXN0IHdlYmxvZ2ljCisgICAgICovCisgICAgcHVibGljIHZvaWQgWHRlc3RXbHJtaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFdscm1pYyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqICB0ZXN0IHdlYmxvZ2ljJ3Mgc3RyaXBwaW5nIG9mIC1KIGFyZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBYdGVzdFdscm1pY0pBcmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFdscm1pY0pBcmciKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoZSBmb3JraW5nIGNvbXBpbGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgTm90ZXN0Rm9ya2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Rm9ya2luZyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIGZvcmtpbmcgY29tcGlsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ya2luZ0FudENsYXNzcGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Rm9ya2luZ0FudENsYXNzcGF0aCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIGZvcmtpbmcgY29tcGlsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW50Q2xhc3NwYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RBbnRDbGFzc3BhdGgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RCYWROYW1lIiwKKyAgICAgICAgICAgICAgICAiY29tcGlsZXIgbm90IGtub3duIiwKKyAgICAgICAgICAgICAgICBSbWljQWRhcHRlckZhY3RvcnkuRVJST1JfVU5LTk9XTl9DT01QSUxFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogbG9hZCBhbiBhZGFwdGVyIGJ5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RXhwbGljaXRDbGFzcyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdFdyb25nQ2xhc3MiLAorICAgICAgICAgICAgICAgICJjbGFzcyBub3QgYW4gUk1JQyBhZGFwdGVyIiwKKyAgICAgICAgICAgICAgICBSbWljQWRhcHRlckZhY3RvcnkuRVJST1JfTk9UX1JNSUNfQURBUFRFUik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJhZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdERlZmF1bHRCYWRDbGFzcyIsCisgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRoZSBjbGFzcyB0byBmYWlsIiwKKyAgICAgICAgICAgICAgICBSbWljLkVSUk9SX1JNSUNfRkFJTEVEKTsKKyAgICAgICAgLy9kb250IGxvb2sgZm9yIG11Y2ggdGV4dCBoZXJlIGFzIGl0IGlzIHZlbmRvciBhbmQgdmVyc2lvbiBkZXBlbmRlbnQKKyAgICAgICAgYXNzZXJ0TG9nQ29udGFpbmluZygidW5pbXBsZW1lbnRlZC5jbGFzcyIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE1hZ2ljUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0TWFnaWNQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgIm1hZ2ljIHByb3BlcnR5IG5vdCB3b3JraW5nIiwKKyAgICAgICAgICAgICAgICBSbWljQWRhcHRlckZhY3RvcnkuRVJST1JfVU5LTk9XTl9DT01QSUxFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE1hZ2ljUHJvcGVydHlPdmVycmlkZXNFbXB0eVN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RNYWdpY1Byb3BlcnR5T3ZlcnJpZGVzRW1wdHlTdHJpbmciLAorICAgICAgICAgICAgICAgICJtYWdpYyBwcm9wZXJ0eSBub3Qgd29ya2luZyIsCisgICAgICAgICAgICAgICAgUm1pY0FkYXB0ZXJGYWN0b3J5LkVSUk9SX1VOS05PV05fQ09NUElMRVIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFnaWNQcm9wZXJ0eUlzRW1wdHlTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE1hZ2ljUHJvcGVydHlJc0VtcHR5U3RyaW5nIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBOb3Rlc3RGYWlsaW5nQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RGYWlsaW5nQWRhcHRlciIsCisgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmVzIHRvIHByb3BhZ2F0ZSIsCisgICAgICAgICAgICAgICAgUm1pYy5FUlJPUl9STUlDX0ZBSUxFRCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgdmVyc2lvbiAxLjEgc3R1YnMgYXJlIGdvb2QKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFZlcnNpb24xMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhhdCB2ZXJzaW9uIDEuMiBzdHVicyBhcmUgZ29vZAorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RWZXJzaW9uMTIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgdmVyc2lvbiBjb21wYXQgc3R1YnMgYXJlIGdvb2QKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25Db21wYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFZlcnNpb25Db21wYXQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgcGFzc2VzIC1YbmV3IHRvIHN1bidzIHJtaWMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RYbmV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RYbmV3Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGF0IHBhc3NlcyAtWG5ldyB0byBzdW4ncyBybWljIHJ1bm5pbmcgaW4gYSBkaWZmZXJlbnQgVk0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RYbmV3Rm9ya2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RYbmV3Rm9ya2VkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGF0IHJ1bnMgdGhlIG5ldyB4bmV3IGNvbXBpbGVyIGFkYXB0ZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RYbmV3Q29tcGlsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFhuZXdDb21waWxlciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhhdCB2ZXJpZmllcyB0aGF0IElETCBjb21waWxlcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElETCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0SURMIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGF0IHZlcmlmaWVzIHRoYXQgSUlPUCBjb21waWxlcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElJT1AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdElJT1AiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIGxpdHRsZSBidW5ueSB2ZXJpZmllcyB0aGF0IHdlIGNhbiBsb2FkIHN0dWZmLCBhbmQgdGhhdAorICAgICAqIGEgZmFpbHVyZSB0byBleGVjdXRlIGlzIHR1cm5lZCBpbnRvIGEgZmF1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhaWxpbmdSbWljQWRhcHRlciBleHRlbmRzIERlZmF1bHRSbWljQWRhcHRlciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19NRVNTQUdFID0gImhlbGxvIGZyb20gRmFpbGluZ1JtaWNBZGFwdGVyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gZmFsc2UgLWFsd2F5cworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBnZXRSbWljKCkubG9nKExPR19NRVNTQUdFKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JtaWNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUm1pY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYwN2QxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JtaWNUZXN0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKKy8qKgorICogVGVzdGNhc2UgZm9yIDxybWljPi4KKyAqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgY2xhc3MgUm1pY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKyAgICBwcml2YXRlIFJtaWMgcm1pYzsKKworICAgIHB1YmxpYyBSbWljVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIHByb2plY3QuaW5pdCgpOworICAgICAgICBybWljID0gbmV3IFJtaWMoKTsKKyAgICAgICAgcm1pYy5zZXRQcm9qZWN0KHByb2plY3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbmVzdGVkIGNvbXBpbGVyIGFyZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGVyQXJnKCkgeworICAgICAgICBTdHJpbmdbXSBhcmdzID0gcm1pYy5nZXRDdXJyZW50Q29tcGlsZXJBcmdzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXJncyk7CisgICAgICAgIGFzc2VydEVxdWFscygibm8gYXJncyIsIDAsIGFyZ3MubGVuZ3RoKTsKKworICAgICAgICBSbWljLkltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCBhcmcgPSBybWljLmNyZWF0ZUNvbXBpbGVyQXJnKCk7CisgICAgICAgIFN0cmluZyBmb3JkID0gIkZvcmQiOworICAgICAgICBTdHJpbmcgcHJlZmVjdCA9ICJQcmVmZWN0IjsKKyAgICAgICAgU3RyaW5nIHRlc3RBcmcgPSBmb3JkICsgIiAiICsgcHJlZmVjdDsKKyAgICAgICAgYXJnLnNldFZhbHVlKHRlc3RBcmcpOworICAgICAgICBhcmdzID0gcm1pYy5nZXRDdXJyZW50Q29tcGlsZXJBcmdzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygidW5jb25kaXRpb25hbCBzaW5nbGUgYXJnIiwgMSwgYXJncy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHModGVzdEFyZywgYXJnc1swXSk7CisKKyAgICAgICAgYXJnLnNldENvbXBpbGVyKCJ3ZWJsb2dpYyIpOworICAgICAgICBhcmdzID0gcm1pYy5nZXRDdXJyZW50Q29tcGlsZXJBcmdzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXJncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1wbGVtZW50YXRpb24gaXMgd2VibG9naWMgYnV0IGJ1aWxkLnJtaWMgaXMgbnVsbCIsCisgICAgICAgICAgICAgICAgICAgICAwLCBhcmdzLmxlbmd0aCk7CisKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiYnVpbGQucm1pYyIsICJzdW4iKTsKKyAgICAgICAgYXJncyA9IHJtaWMuZ2V0Q3VycmVudENvbXBpbGVyQXJncygpOworICAgICAgICBhc3NlcnROb3ROdWxsKGFyZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltcGxlbWVudGF0aW9uIGlzIHdlYmxvZ2ljIGJ1dCBidWlsZC5ybWljIGlzIHN1biIsCisgICAgICAgICAgICAgICAgICAgICAwLCBhcmdzLmxlbmd0aCk7CisKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiYnVpbGQucm1pYyIsICJ3ZWJsb2dpYyIpOworICAgICAgICBhcmdzID0gcm1pYy5nZXRDdXJyZW50Q29tcGlsZXJBcmdzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm90aCBhcmUgd2VibG9naWMiLCAxLCBhcmdzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0QXJnLCBhcmdzWzBdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNvbXBpbGVyIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGlsZXJBdHRyaWJ1dGUoKSB7CisgICAgICAgIC8vIGNoZWNrIGRlZmF1bHRzCisgICAgICAgIFN0cmluZyBjb21waWxlciA9IHJtaWMuZ2V0Q29tcGlsZXIoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21waWxlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiZXhwZWN0ZWQgc3VuIG9yIGthZmZlLCBidXQgZm91bmQgIitjb21waWxlcixjb21waWxlciwiZGVmYXVsdCIpOworCisgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoImJ1aWxkLnJtaWMiLCAid2VibG9naWMiKTsKKyAgICAgICAgY29tcGlsZXIgPSBybWljLmdldENvbXBpbGVyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndlYmxvZ2ljIiwgY29tcGlsZXIpOworCisgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZSBvdmVycmlkZXMgYnVpbGQuY29tcGlsZXIKKyAgICAgICAgcm1pYy5zZXRDb21waWxlcigia2FmZmUiKTsKKyAgICAgICAgY29tcGlsZXIgPSBybWljLmdldENvbXBpbGVyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImthZmZlIiwgY29tcGlsZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NRTEV4ZWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1NGI4YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5zcWwuRHJpdmVyOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLkRyaXZlclByb3BlcnR5SW5mbzsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGUgdGVzdGNhc2UgdG8gdGVzdCBmb3IgZHJpdmVyIGNhY2hpbmcuCisgKiBUbyB0ZXN0IGZvciB5b3VyIG93biBkYXRhYmFzZSwgeW91IG1heSBuZWVkIHRvIHR3ZWFrIGdldFByb3BlcnRpZXMoaW50KQorICogYW5kIGFkZCBhIGNvdXBsZSBvZiBrZXlzLiBzZWUgdGVzdE9yYWNsZSBhbmQgdGVzdE15U1FMIGZvciBhbiBleGFtcGxlLgorICoKKyAqIEl0IHdvdWxkIGJlIG11Y2ggYmV0dGVyIHRvIGV4dGVuZCB0aGlzIHRlc3RjYXNlIGJ5IHVzaW5nIEhTUUwKKyAqIGFzIHRoZSB0ZXN0IGRiLCBzbyB0aGF0IGEgZGIgaXMgcmVhbGx5IHVzZWQuCisgKgorICovCitwdWJsaWMgY2xhc3MgU1FMRXhlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvLyBzb21lIGRhdGFiYXNlIGtleXMsIHNlZSAjZ2V0UHJvcGVydGllcyhpbnQpCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTlVMTCA9IDA7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgT1JBQ0xFID0gMTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNWVNRTCA9IDI7CisKKyAgICAvLyBrZXlzIHVzZWQgaW4gcHJvcGVydGllcy4KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBEUklWRVIgPSAiZHJpdmVyIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VSID0gInVzZXIiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBU1NXT1JEID0gInBhc3N3b3JkIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVUkwgPSAidXJsIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQVRIID0gInBhdGgiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNRTCA9ICJzcWwiOworCisgICAgcHVibGljIFNRTEV4ZWNUZXN0KFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY2xlYXJlZC4KKyAgICAgICAgSkRCQ1Rhc2suZ2V0TG9hZGVyTWFwKCkuY2xlYXIoKTsKKyAgICB9CisKKyAgIC8vIHNpbXBsZSB0ZXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBjYWNoaW5nIGRvZXMgd29yay4uLgorICAgIHB1YmxpYyB2b2lkIHRlc3REcml2ZXJDYWNoaW5nKCl7CisgICAgICAgIFNRTEV4ZWMgc3FsID0gY3JlYXRlVGFzayhnZXRQcm9wZXJ0aWVzKE5VTEwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghU1FMRXhlYy5nZXRMb2FkZXJNYXAoKS5jb250YWluc0tleShOVUxMX0RSSVZFUikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3FsLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSl7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIk5vIHN1aXRhYmxlIERyaXZlciIpICE9IC0xKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKFNRTEV4ZWMuZ2V0TG9hZGVyTWFwKCkuY29udGFpbnNLZXkoTlVMTF9EUklWRVIpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShzcWwuZ2V0TG9hZGVyKCksIEpEQkNUYXNrLmdldExvYWRlck1hcCgpLmdldChOVUxMX0RSSVZFUikpOworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIxID0gc3FsLmdldExvYWRlcigpOworCisgICAgICAgIC8vIDJuZCBydW4uLgorICAgICAgICBzcWwgPSBjcmVhdGVUYXNrKGdldFByb3BlcnRpZXMoTlVMTCkpOworICAgICAgICAvLyB0aGUgZHJpdmVyIG11c3Qgc3RpbGwgYmUgY2FjaGVkLgorICAgICAgICBhc3NlcnRUcnVlKEpEQkNUYXNrLmdldExvYWRlck1hcCgpLmNvbnRhaW5zS2V5KE5VTExfRFJJVkVSKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzcWwuZXhlY3V0ZSgpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiTm8gc3VpdGFibGUgRHJpdmVyIikgIT0gLTEpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoSkRCQ1Rhc2suZ2V0TG9hZGVyTWFwKCkuY29udGFpbnNLZXkoTlVMTF9EUklWRVIpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShzcWwuZ2V0TG9hZGVyKCksIEpEQkNUYXNrLmdldExvYWRlck1hcCgpLmdldChOVUxMX0RSSVZFUikpOworICAgICAgICBhc3NlcnRTYW1lKGxvYWRlcjEsIHNxbC5nZXRMb2FkZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZG9NdWx0aXBsZUNhbGxzKDEwMDAsIE5VTEwsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIC8qCisgICAgcHVibGljIHZvaWQgdGVzdE9yYWNsZSgpeworICAgICAgICBkb011bHRpcGxlQ2FsbHMoMTAwMCwgT1JBQ0xFLCB0cnVlLCBmYWxzZSk7CisgICAgfSovCisKKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHRlc3RNeVNRTCgpeworICAgICAgICBkb011bHRpcGxlQ2FsbHMoMTAwMCwgTVlTUUwsIHRydWUsIGZhbHNlKTsKKyAgICB9Ki8KKworCisgICAgLyoqCisgICAgICogcnVuIGEgc3FsIHRhc2tzIG11bHRpcGxlIHRpbWVzLgorICAgICAqIEBwYXJhbSBjYWxscyBudW1iZXIgb2YgdGltZXMgdG8gZXhlY3V0ZSB0aGUgdGFzaworICAgICAqIEBwYXJhbSBkYXRhYmFzZSB0aGUgZGF0YWJhc2UgdG8gZXhlY3V0ZSBvbi4KKyAgICAgKiBAcGFyYW0gY2FjaGluZyBzaG91bGQgY2FjaGluZyBiZSBlbmFibGVkID8KKyAgICAgKiBAcGFyYW0gY2F0Y2hleGNlcHRpb24gdHJ1ZSB0byBjYXRjaCBleGNlcHRpb24gZm9yIGVhY2ggY2FsbCwgZmFsc2UgaWYgbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvTXVsdGlwbGVDYWxscyhpbnQgY2FsbHMsIGludCBkYXRhYmFzZSwgYm9vbGVhbiBjYWNoaW5nLCBib29sZWFuIGNhdGNoZXhjZXB0aW9uKXsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGdldFByb3BlcnRpZXMoZGF0YWJhc2UpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxzOyBpKyspeworICAgICAgICAgICAgU1FMRXhlYyBzcWwgPSBjcmVhdGVUYXNrKHByb3BzKTsKKyAgICAgICAgICAgIHNxbC5zZXRDYWNoaW5nKGNhY2hpbmcpOworICAgICAgICAgICAgdHJ5ICB7CisgICAgICAgICAgICAgICAgc3FsLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIGlmICghY2F0Y2hleGNlcHRpb24peworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHRhc2sgZnJvbSBhIHNldCBvZiBwcm9wZXJ0aWVzCisgICAgICogQHNlZSAjZ2V0UHJvcGVydGllcyhpbnQpCisgICAgICovCisgICAgcHJvdGVjdGVkIFNRTEV4ZWMgY3JlYXRlVGFzayhQcm9wZXJ0aWVzIHByb3BzKXsKKyAgICAgICAgU1FMRXhlYyBzcWwgPSBuZXcgU1FMRXhlYygpOworICAgICAgICBzcWwuc2V0UHJvamVjdCggbmV3IFByb2plY3QoKSApOworICAgICAgICBzcWwuc2V0RHJpdmVyKCBwcm9wcy5nZXRQcm9wZXJ0eShEUklWRVIpICk7CisgICAgICAgIHNxbC5zZXRVc2VyaWQoIHByb3BzLmdldFByb3BlcnR5KFVTRVIpICk7CisgICAgICAgIHNxbC5zZXRQYXNzd29yZCggcHJvcHMuZ2V0UHJvcGVydHkoUEFTU1dPUkQpICk7CisgICAgICAgIHNxbC5zZXRVcmwoIHByb3BzLmdldFByb3BlcnR5KFVSTCkgKTsKKyAgICAgICAgc3FsLmNyZWF0ZUNsYXNzcGF0aCgpLnNldExvY2F0aW9uKCBuZXcgRmlsZShwcm9wcy5nZXRQcm9wZXJ0eShQQVRIKSkgKTsKKyAgICAgICAgc3FsLmFkZFRleHQoIHByb3BzLmdldFByb3BlcnR5KFNRTCkgKTsKKyAgICAgICAgcmV0dXJuIHNxbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0cnkgdG8gZmluZCB0aGUgcGF0aCBmcm9tIGEgcmVzb3VyY2UgKGphciBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lKQorICAgICAqIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYXMgYSBjbGFzc3BhdGggdG8gbG9hZCB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBmaW5kUmVzb3VyY2VQYXRoKFN0cmluZyByZXNvdXJjZSl7CisgICAgICAgIHJlc291cmNlID0gcmVzb3VyY2UucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKKyAgICAgICAgVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHUgPSB1cmwudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKHUuc3RhcnRzV2l0aCgiamFyOmZpbGU6IikpIHsKKyAgICAgICAgICAgIGludCBwbGluZyA9IHUuaW5kZXhPZigiISIpOworICAgICAgICAgICAgcmV0dXJuIHUuc3Vic3RyaW5nKCJqYXI6ZmlsZToiLmxlbmd0aCgpLCBwbGluZyk7CisgICAgICAgIH0gZWxzZSBpZiAodS5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CisgICAgICAgICAgICBpbnQgdGFpbCA9IHUuaW5kZXhPZihyZXNvdXJjZSk7CisgICAgICAgICAgICByZXR1cm4gdS5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSwgdGFpbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJucyBhIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB0byBhIHNwZWNpZmljIGRhdGFiYXNlLgorICAgICAqIElmIHlvdSB3YW50IHRvIHRlc3Qgb24geW91ciBzcGVjaWZpYyBiYXNlLCB5b3UnZCBiZXR0ZXIKKyAgICAgKiB0d2VhayB0aGlzIHRvIG1ha2UgaXQgcnVuIG9yIGFkZCB5b3VyIG93biBkYXRhYmFzZS4KKyAgICAgKiBUaGUgZHJpdmVyIGxpYiBzaG91bGQgYmUgZHJvcHBlZCBpbnRvIHRoZSBzeXN0ZW0gY2xhc3Nsb2FkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhpbnQgZGF0YWJhc2UpeworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbnVsbDsKKyAgICAgICAgc3dpdGNoIChkYXRhYmFzZSl7CisgICAgICAgICAgICBjYXNlIE9SQUNMRToKKyAgICAgICAgICAgICAgICBwcm9wcyA9IGdldFByb3BlcnRpZXMoIm9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIiLCAidGVzdCIsICJ0ZXN0IiwgImpkYmM6b3JhY2xlOnRoaW46QDEyNy4wLjAuMToxNTIxOm9yY2wiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVlTUUw6CisgICAgICAgICAgICAgICAgcHJvcHMgPSBnZXRQcm9wZXJ0aWVzKCJvcmcuZ2p0Lm1tLm15c3FsLkRyaXZlciIsICJ0ZXN0IiwgInRlc3QiLCAiamRiYzpteXNxbDovLzEyNy4wLjAuMTozMzA2L3Rlc3QiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTlVMTDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJvcHMgPSBnZXRQcm9wZXJ0aWVzKE5VTExfRFJJVkVSLCAidGVzdCIsICJ0ZXN0IiwgImpkYmM6ZGF0YWJhc2U6Ly9ob3N0bmFtZTpwb3J0L25hbWUiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBsb29rIGZvciB0aGUgZHJpdmVyIHBhdGguLi4KKyAgICAgICAgU3RyaW5nIHBhdGggPSBmaW5kUmVzb3VyY2VQYXRoKHByb3BzLmdldFByb3BlcnR5KERSSVZFUikpOworICAgICAgICBwcm9wcy5wdXQoUEFUSCwgcGF0aCk7CisgICAgICAgIHByb3BzLnB1dChTUUwsICJjcmVhdGUgdGFibGUgT09NRV9URVNUKFggSU5URUdFUiBOT1QgTlVMTCk7XG5kcm9wIHRhYmxlIGlmIGV4aXN0cyBPT01FX1RFU1Q7Iik7CisgICAgICAgIHJldHVybiBwcm9wczsKKyAgICB9CisKKyAgICAvKiogaGVscGVyIG1ldGhvZCB0byBidWlsZCBwcm9wZXJ0aWVzICovCisgICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhTdHJpbmcgZHJpdmVyLCBTdHJpbmcgdXNlciwgU3RyaW5nIHB3ZCwgU3RyaW5nIHVybCl7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5wdXQoRFJJVkVSLCBkcml2ZXIpOworICAgICAgICBwcm9wcy5wdXQoVVNFUiwgdXNlcik7CisgICAgICAgIHByb3BzLnB1dChQQVNTV09SRCwgcHdkKTsKKyAgICAgICAgcHJvcHMucHV0KFVSTCwgdXJsKTsKKyAgICAgICAgcmV0dXJuIHByb3BzOworICAgIH0KKworCisvLy0tLSBOVUxMIEpEQkMgZHJpdmVyIGp1c3QgZm9yIHNpbXBsZSB0ZXN0IHNpbmNlIHRoZXJlIGFyZSBubyBkYiBkcml2ZXIKKy8vIGF2YWlsYWJsZSBhcyBhIGRlZmF1bHQgaW4gQW50IDopCisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOVUxMX0RSSVZFUiA9IE51bGxEcml2ZXIuY2xhc3MuZ2V0TmFtZSgpOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsRHJpdmVyIGltcGxlbWVudHMgRHJpdmVyIHsKKyAgICAgICAgcHVibGljIENvbm5lY3Rpb24gY29ubmVjdChTdHJpbmcgdXJsLCBQcm9wZXJ0aWVzIGluZm8pCisgICAgICAgICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdHNVUkwoU3RyaW5nIHVybCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRHJpdmVyUHJvcGVydHlJbmZvW10gZ2V0UHJvcGVydHlJbmZvKFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaW5mbykKKyAgICAgICAgICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRHJpdmVyUHJvcGVydHlJbmZvWzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRNYWpvclZlcnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBqZGJjQ29tcGxpYW50KCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2lnbkphclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TaWduSmFyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzJkNmFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NpZ25KYXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CisKKy8qKgorICogVGVzdGNhc2UgZm9yIHRoZSBTaWduamFyIHRhc2sKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTaWduSmFyVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQQU5ERURfTUFOSUZFU1QKKyAgICAgICAgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIjsKKworCisgICAgcHVibGljIFNpZ25KYXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zaWduamFyLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNoZWNrIGZvciBiZWluZyBvZmZsaW5lCisgICAgICogQHJldHVybiB0cnVlIGlmZiB0aGUgc3lzdGVtIHByb3BlcnR5ICJvZmZsaW5lIiBpcyAidHJ1ZSIKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPZmZsaW5lKCkgeworICAgICAgICByZXR1cm4gQm9vbGVhbi5nZXRCb29sZWFuKCJvZmZsaW5lIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1NpZ25pbmcoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImJhc2ljIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpZ0ZpbGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInNpZ2ZpbGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4TWVtb3J5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJtYXhtZW1vcnkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VVJMS2V5c3RvcmVGaWxlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ1cmxLZXlzdG9yZUZpbGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VVJMS2V5c3RvcmVIVFRQKCkgeworICAgICAgICBpZighaXNPZmZsaW5lKCkpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInVybEtleXN0b3JlSFRUUCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZXNlcnZlTGFzdE1vZGlmaWVkKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJwcmVzZXJ2ZUxhc3RNb2RpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc2V0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsZXNldCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc2V0QW5kSmFyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsZXNldEFuZEphciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc2V0QW5kU2lnbmVkSmFyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RGaWxlc2V0QW5kU2lnbmVkSmFyIiwKKyAgICAgICAgICAgICAgICAiaW5jb21wYXRpYmxlIGF0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAgIFNpZ25KYXIuRVJST1JfU0lHTkVESkFSX0FORF9QQVRIUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhdGgoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RQYXRoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhBbmRKYXIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RQYXRoQW5kSmFyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhBbmRTaWduZWRKYXIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdFBhdGhBbmRTaWduZWRKYXIiLAorICAgICAgICAgICAgICAgICJpbmNvbXBhdGlibGUgYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgU2lnbkphci5FUlJPUl9TSUdORURKQVJfQU5EX1BBVEhTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbmVkSmFyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0U2lnbmVkSmFyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlc3REaXIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3REZXN0RGlyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlc3REaXJBbmRTaWduZWRKYXIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEZpbGVzZXRBbmRTaWduZWRKYXIiLAorICAgICAgICAgICAgICAgICJpbmNvbXBhdGlibGUgYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgU2lnbkphci5FUlJPUl9TSUdORURKQVJfQU5EX1BBVEhTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVzdERpckFuZFNpZ25lZEphcjIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdFBhdGhBbmRTaWduZWRKYXIiLAorICAgICAgICAgICAgICAgICJpbmNvbXBhdGlibGUgYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgU2lnbkphci5FUlJPUl9TSUdORURKQVJfQU5EX1BBVEhTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVzdERpckZpbGVzZXQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3REZXN0RGlyRmlsZXNldCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBwZXJGaWxlc2V0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0TWFwcGVyRmlsZXNldCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXN0RGlyUGF0aCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdERlc3REaXJQYXRoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hcHBlclBhdGgoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RNYXBwZXJQYXRoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hcHBlck5vRGVzdCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0TWFwcGVyTm9EZXN0IiwKKyAgICAgICAgICAgICAgICAidHdvIG1hcHBlcnMiLAorICAgICAgICAgICAgICAgIFNpZ25KYXIuRVJST1JfTUFQUEVSX1dJVEhPVVRfREVTVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFR3b01hcHBlcnMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdFR3b01hcHBlcnMiLAorICAgICAgICAgICAgICAgICJ0d28gbWFwcGVycyIsCisgICAgICAgICAgICAgICAgU2lnbkphci5FUlJPUl9UT09fTUFOWV9NQVBQRVJTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9BbGlhcygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0Tm9BbGlhcyIsCisgICAgICAgICAgICAgICAgIm5vIGFsaWFzIiwKKyAgICAgICAgICAgICAgICBTaWduSmFyLkVSUk9SX05PX0FMSUFTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9GaWxlcygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0Tm9GaWxlcyIsCisgICAgICAgICAgICAgICAgIm5vIGZpbGVzIiwKKyAgICAgICAgICAgICAgICBTaWduSmFyLkVSUk9SX05PX1NPVVJDRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vU3RvcmVQYXNzKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3ROb1N0b3JlUGFzcyIsCisgICAgICAgICAgICAgICAgIm5vIHBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICBTaWduSmFyLkVSUk9SX05PX1NUT1JFUEFTUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRzYUxvY2FsaG9zdCgpIHsKKyAgICAgICAgLy9vbmx5IHRlc3Qgb24gamF2YTEuNSsKKyAgICAgICAgaWYoSmF2YUVudlV0aWxzLmdldEphdmFWZXJzaW9uTnVtYmVyKCk+PTE1KSB7CisgICAgICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdFRzYUxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgIm5vIFRTQSBhdCBsb2NhbGhvc3Q6MCIpOworICAgICAgICAgICAgYXNzZXJ0TG9nQ29udGFpbmluZygiamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN5c1Byb3BlcnR5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0U3lzUHJvcGVydHkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5SmFyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0VmVyaWZ5SmFyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeU5vQXJncygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0VmVyaWZ5Tm9BcmdzIiwKKyAgICAgICAgICAgICAgICAibm8gYXJncyIsCisgICAgICAgICAgICAgICAgQWJzdHJhY3RKYXJTaWduZXJUYXNrLkVSUk9SX05PX1NPVVJDRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUphclVuc2lnbmVkKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RWZXJpZnlKYXJVbnNpZ25lZCIsCisgICAgICAgICAgICAgICAgInVuc2lnbmVkIEpBUiBmaWxlIiwKKyAgICAgICAgICAgICAgICBWZXJpZnlKYXIuRVJST1JfTk9fVkVSSUZZKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBOb3Rlc3RWZXJpZnlKYXJOb3RJbktleXN0b3JlKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RWZXJpZnlKYXJOb3RJbktleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAic2lnbmF0dXJlIG5vdCBpbiBrZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgVmVyaWZ5SmFyLkVSUk9SX05PX1ZFUklGWSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUZpbGVzZXQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RWZXJpZnlGaWxlc2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeVBhdGgoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RWZXJpZnlQYXRoIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2xlZXBUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2xlZXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiNjFhZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TbGVlcFRlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKy8qKgorICogQGNyZWF0ZWQgMDEgTWF5IDIwMDEKKyAqLworcHVibGljIGNsYXNzIFNsZWVwVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzLyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBUUkFDRT1mYWxzZTsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRVJST1JfUkFOR0U9MTAwMDsKKwkKKyAgICBwdWJsaWMgU2xlZXBUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJzbGVlcC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICBUaW1lciB0aW1lcj1uZXcgVGltZXIoKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgdGltZXIuc3RvcCgpOworICAgICAgICBpZihUUkFDRSkgU3lzdGVtLm91dC5wcmludGxuKCIgdGVzdDEgZWxhcHNlZCB0aW1lPSIrdGltZXIudGltZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aW1lci50aW1lKCk+PTApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBUaW1lciB0aW1lcj1uZXcgVGltZXIoKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKKyAgICAgICAgdGltZXIuc3RvcCgpOworICAgICAgICBpZihUUkFDRSkgU3lzdGVtLm91dC5wcmludGxuKCIgdGVzdDIgZWxhcHNlZCB0aW1lPSIrdGltZXIudGltZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aW1lci50aW1lKCk+PTApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBUaW1lciB0aW1lcj1uZXcgVGltZXIoKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKKyAgICAgICAgdGltZXIuc3RvcCgpOworICAgICAgICBpZihUUkFDRSkgU3lzdGVtLm91dC5wcmludGxuKCIgdGVzdDMgZWxhcHNlZCB0aW1lPSIrdGltZXIudGltZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aW1lci50aW1lKCk+PSgyMDAwLUVSUk9SX1JBTkdFKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIFRpbWVyIHRpbWVyPW5ldyBUaW1lcigpOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICB0aW1lci5zdG9wKCk7CisgICAgICAgIGlmKFRSQUNFKSBTeXN0ZW0ub3V0LnByaW50bG4oIiB0ZXN0NCBlbGFwc2VkIHRpbWU9Iit0aW1lci50aW1lKCkpOworICAgICAgICBhc3NlcnRUcnVlKHRpbWVyLnRpbWUoKT49KDIwMDAtRVJST1JfUkFOR0UpICYmIHRpbWVyLnRpbWUoKTw2MDAwMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NSIsCisgICAgICAgICAgICAiTmVnYXRpdmUgc2xlZXAgcGVyaW9kcyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeworICAgICAgICBUaW1lciB0aW1lcj1uZXcgVGltZXIoKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDYiKTsKKyAgICAgICAgdGltZXIuc3RvcCgpOworICAgICAgICBpZihUUkFDRSkgU3lzdGVtLm91dC5wcmludGxuKCIgdGVzdDYgZWxhcHNlZCB0aW1lPSIrdGltZXIudGltZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aW1lci50aW1lKCk8MjAwMCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAqIGlubmVyIHRpbWVyIGNsYXNzCisgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUaW1lciB7CisgICAgICAgIGxvbmcgc3RhcnQ9MDsKKyAgICAgICAgbG9uZyBzdG9wPTA7CisKKyAgICAgICAgcHVibGljIFRpbWVyKCkgeworICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgc3RhcnQ9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgc3RvcD1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHRpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RvcC1zdGFydDsKKyAgICAgICAgfQorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3R5bGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3R5bGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxNzc4ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdHlsZVRlc3QuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworCitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlhzbHRUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisKKy8qKgorICogVGVzdENhc2VzIGZvciB7QGxpbmsgWFNMVFByb2Nlc3N9IHRhc2suCisgKiBYWFggbWVyZ2Ugd2l0aCB7QGxpbmsgWHNsdFRlc3R9PworICogQHZlcnNpb24gMjAwMy0wOC0wNQorICovCitwdWJsaWMgY2xhc3MgU3R5bGVUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHB1YmxpYyBTdHlsZVRlc3QoU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvYnVpbGQueG1sIik7CisgICAgICAgIC8vZXhlY3V0ZVRhcmdldCgic2V0dXAiKTsKKyAgICAgICAgLy9jb21tZW50ZWQgb3V0IGZvciBwZXJmb3JtYW5jZSB3aGlsZSB0YXJnZXQgaXMgZW1wdHkKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZWFyZG93biIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHlsZUlzU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInRlc3RTdHlsZUlzU2V0IiwKKyAgICAgICAgICAgICAgICAibm8gc3R5bGVzaGVldCBzcGVjaWZpZWQiLCAic3BlY2lmeSB0aGUgIiArCisgICAgICAgICAgICAgICAgInN0eWxlc2hlZXQgZWl0aGVyIGFzIGEgZmlsZW5hbWUgaW4gc3R5bGUgIiArCisgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBvciBhcyBhIG5lc3RlZCByZXNvdXJjZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2ZlclBhcmFtZXRlclNldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RGaWxlQ29udGFpbnMoInRlc3RUcmFuc2ZlclBhcmFtZXRlclNldCIsICAvLyB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQvb3V0LnhtbCIsICAgICAgICAgICAgICAgLy8gZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldD0nbXl2YWx1ZSciKTsgICAgICAgICAgICAvLyBleHB0ZWN0ZWQgc3RyaW5nCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZmVyUGFyYW1ldGVyRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKCJ0ZXN0VHJhbnNmZXJQYXJhbWV0ZXJFbXB0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0L291dC54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImVtcHR5PScnIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZmVyUGFyYW1ldGVyVW5zZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKCJ0ZXN0VHJhbnNmZXJQYXJhbWV0ZXJVbnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0L291dC54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZD0nJHt2YWx1ZX0nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZmVyUGFyYW1ldGVyVW5zZXRXaXRoSWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKCJ0ZXN0VHJhbnNmZXJQYXJhbWV0ZXJVbnNldFdpdGhJZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0L291dC54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZD0ndW5kZWZpbmVkIGRlZmF1bHQgdmFsdWUnIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5ld2VyU3R5bGVzaGVldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RGaWxlQ29udGFpbnMoInRlc3ROZXdlclN0eWxlc2hlZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dC9vdXQueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXctdmFsdWUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcHBlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGVmYXVsdE1hcHBlcigidGVzdERlZmF1bHRNYXBwZXIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRGaWxlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REZWZhdWx0TWFwcGVyKCJ0ZXN0RXhwbGljaXRGaWxlc2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBwZXIoU3RyaW5nIHRhcmdldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoIShGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUoCisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwib3V0L2RhdGEuaHRtbCIpKS5leGlzdHMoKSk7CisgICAgICAgIGV4cGVjdEZpbGVDb250YWlucyh0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0L2RhdGEuaHRtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0PSdteXZhbHVlJyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21NYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghRklMRV9VVElMUy5yZXNvbHZlRmlsZSgKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAib3V0L291dC54bWwiKS5leGlzdHMoKSk7CisgICAgICAgIGV4cGVjdEZpbGVDb250YWlucygidGVzdEN1c3RvbU1hcHBlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0L291dC54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldD0nbXl2YWx1ZSciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWRNYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghRklMRV9VVElMUy5yZXNvbHZlRmlsZSgKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAib3V0L291dC54bWwiKS5leGlzdHMoKSk7CisgICAgICAgIGV4cGVjdEZpbGVDb250YWlucygidGVzdFR5cGVkTWFwcGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQvb3V0LnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0PSdteXZhbHVlJyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3RvcnlIaWVyYXJjaHlXaXRoRGlyTWF0Y2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdERpcmVjdG9yeUhpZXJhcmNoeVdpdGhEaXJNYXRjaGluZyIpOworICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoCisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgIm91dC9kZXN0L2xldmVsMS9kYXRhLmh0bWwiKQorICAgICAgICAgICAgICAgICAgIC5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERpcnNXaXRoU3BhY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3REaXJzV2l0aFNwYWNlcyIpOworICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoCisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgIm91dC9kIGVzdC9kYXRhLmh0bWwiKQorICAgICAgICAgICAgICAgICAgIC5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhTdHlsZUF0dHJBbmRSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ0ZXN0V2l0aFN0eWxlQXR0ckFuZFJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAiTXVzdCB0aHJvd3MgYSBCdWlsZEV4Y2VwdGlvbiIsICJzcGVjaWZ5IHRoZSAiICsKKyAgICAgICAgICAgICAgICAic3R5bGVzaGVldCBlaXRoZXIgYXMgYSBmaWxlbmFtZSBpbiBzdHlsZSAiICsKKyAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG9yIGFzIGEgbmVzdGVkIHJlc291cmNlIGJ1dCBub3QgIiArCisgICAgICAgICAgICAgICAgImFzIGJvdGgiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aEZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RGaWxlQ29udGFpbnMoInRlc3RXaXRoRmlsZVJlc291cmNlIiwgIm91dC9vdXQueG1sIiwgInNldD0ndmFsdWUnIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhVcmxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RGaWxlQ29udGFpbnMoInRlc3RXaXRoVXJsUmVzb3VyY2UiLCAib3V0L291dC54bWwiLCAic2V0PSd2YWx1ZSciKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZW5hbWVBc1BhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlbmFtZUFzUGFyYW0iKTsKKyAgICAgICAgYXNzZXJ0RmlsZUNvbnRhaW5zKCJvdXQvb3V0L29uZS50eHQiLCAgICAgICJmaWxlbmFtZT0nb25lLnhtbCciKTsKKyAgICAgICAgYXNzZXJ0RmlsZUNvbnRhaW5zKCJvdXQvb3V0L3R3by50eHQiLCAgICAgICJmaWxlbmFtZT0ndHdvLnhtbCciKTsKKyAgICAgICAgYXNzZXJ0RmlsZUNvbnRhaW5zKCJvdXQvb3V0L3RocmVlLnR4dCIsICAgICJmaWxlbmFtZT0ndGhyZWUueG1sJyIpOworICAgICAgICBhc3NlcnRGaWxlQ29udGFpbnMoIm91dC9vdXQvZGlyL2ZvdXIudHh0IiwgImZpbGVuYW1lPSdmb3VyLnhtbCciKTsKKyAgICAgICAgYXNzZXJ0RmlsZUNvbnRhaW5zKCJvdXQvb3V0L2Rpci9mb3VyLnR4dCIsICJmaWxlZGlyID0nLW5vdC1zZXQtJyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlbmFtZUFzUGFyYW1Ob1NldHRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVuYW1lQXNQYXJhbU5vU2V0dGluZyIpOworICAgICAgICBhc3NlcnRGaWxlQ29udGFpbnMoIm91dC9vdXQvb25lLnR4dCIsICAgICAgImZpbGVuYW1lPSctbm90LXNldC0nIik7CisgICAgICAgIGFzc2VydEZpbGVDb250YWlucygib3V0L291dC90d28udHh0IiwgICAgICAiZmlsZW5hbWU9Jy1ub3Qtc2V0LSciKTsKKyAgICAgICAgYXNzZXJ0RmlsZUNvbnRhaW5zKCJvdXQvb3V0L3RocmVlLnR4dCIsICAgICJmaWxlbmFtZT0nLW5vdC1zZXQtJyIpOworICAgICAgICBhc3NlcnRGaWxlQ29udGFpbnMoIm91dC9vdXQvZGlyL2ZvdXIudHh0IiwgImZpbGVuYW1lPSctbm90LXNldC0nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVuYW1lQW5kRmlsZWRpckFzUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVuYW1lQW5kRmlsZWRpckFzUGFyYW0iKTsKKyAgICAgICAgYXNzZXJ0RmlsZUNvbnRhaW5zKCJvdXQvb3V0L29uZS50eHQiLCAgICAgICJmaWxlbmFtZT0nb25lLnhtbCciKTsKKyAgICAgICAgYXNzZXJ0RmlsZUNvbnRhaW5zKCJvdXQvb3V0L29uZS50eHQiLCAgICAgICJmaWxlZGlyID0nLiciKTsKKyAgICAgICAgYXNzZXJ0RmlsZUNvbnRhaW5zKCJvdXQvb3V0L2Rpci9mb3VyLnR4dCIsICJmaWxlbmFtZT0nZm91ci54bWwnIik7CisgICAgICAgIGFzc2VydEZpbGVDb250YWlucygib3V0L291dC9kaXIvZm91ci50eHQiLCAiZmlsZWRpciA9J2RpciciKTsKKyAgICB9CisKKworICAgIC8vICoqKioqKioqKioqKiogIGNvcGllZCBmcm9tIENvbmNhdFRlc3QgICoqKioqKioqKioqKioKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgSGVscGVyIG1ldGhvZHMgLSBzaG91bGQgYmUgaW4gQnVpbGRGaWxlVGVzdAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRGaWxlU3RyaW5nKFN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBSZWFkZXIgciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByID0gbmV3IEZpbGVSZWFkZXIoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGZpbGVuYW1lKSk7CisgICAgICAgICAgICByZXR1cm4gIEZpbGVVdGlscy5yZWFkRnVsbHkocik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uocik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0RmlsZUNvbnRhaW5zKAorICAgICAgICBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBjb250YWlucykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIGFzc2VydEZpbGVDb250YWlucyhmaWxlbmFtZSwgY29udGFpbnMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGaWxlQ29udGFpbnMoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgY29udGFpbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gZ2V0RmlsZVN0cmluZyhmaWxlbmFtZSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICJleHBlY3RpbmcgZmlsZSAiICsgZmlsZW5hbWUKKyAgICAgICAgICAgICsgIiB0byBjb250YWluICIgKyBjb250YWlucworICAgICAgICAgICAgKyAiIGJ1dCBnb3QgIiArIGNvbnRlbnQsCisgICAgICAgICAgICBjb250ZW50LmluZGV4T2YoY29udGFpbnMpID4gLTEpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N1YkFudFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdWJBbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlOGIwZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdWJBbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyOworCisKK3B1YmxpYyBjbGFzcyBTdWJBbnRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgU3ViQW50VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50LnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Rub2RpcnMoKSB7CisgICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgidGVzdG5vZGlycyIpOworICAgICAgICBleHBlY3RMb2coInRlc3Rub2RpcnMiLCAiTm8gc3ViLWJ1aWxkcyB0byBpdGVyYXRlIG9uIik7CisgICAgfQorCisgICAgLy8gdGFyZ2V0IG11c3QgYmUgc3BlY2lmaWVkCisgICAgcHVibGljIHZvaWQgdGVzdGdlbmVyaWNhbnRmaWxlKCkgeworICAgICAgICBGaWxlIGRpcjEgPSBwcm9qZWN0LnJlc29sdmVGaWxlKCIuIik7CisgICAgICAgIEZpbGUgZGlyMiA9IHByb2plY3QucmVzb2x2ZUZpbGUoInN1YmFudC9zdWJhbnQtdGVzdDEiKTsKKyAgICAgICAgRmlsZSBkaXIzID0gcHJvamVjdC5yZXNvbHZlRmlsZSgic3ViYW50L3N1YmFudC10ZXN0MiIpOworCisgICAgICAgIHRlc3RCYXNlRGlycygidGVzdGdlbmVyaWNhbnRmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IGRpcjEuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyMi5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXIzLmdldEFic29sdXRlUGF0aCgpCisKKyAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RhbnRmaWxlKCkgeworICAgICAgICBGaWxlIGRpcjEgPSBwcm9qZWN0LnJlc29sdmVGaWxlKCIuIik7CisgICAgICAgIC8vIGJhc2VkaXIgb2Ygc3ViYW50L3N1YmFudC10ZXN0MS9zdWJhbnQueG1sIGlzIC4uCisgICAgICAgIC8vIHRoZXJlZm9yZSB3ZSBleHBlY3QgaGVyZSB0aGUgc3ViYW50L3N1YmFudC10ZXN0MSBzdWJkaXJlY3RvcnkKKyAgICAgICAgRmlsZSBkaXIyID0gcHJvamVjdC5yZXNvbHZlRmlsZSgic3ViYW50L3N1YmFudC10ZXN0MSIpOworICAgICAgICAvLyBiYXNlZGlyIG9mIHN1YmFudC9zdWJhbnQtdGVzdDIvc3ViYW50LnhtbCBpcyAuLgorICAgICAgICAvLyB0aGVyZWZvcmUgd2UgZXhwZWN0IGhlcmUgdGhlIHN1YmFudCBzdWJkaXJlY3RvcnkKKyAgICAgICAgRmlsZSBkaXIzID0gcHJvamVjdC5yZXNvbHZlRmlsZSgic3ViYW50Iik7CisKKyAgICAgICAgdGVzdEJhc2VEaXJzKCJ0ZXN0YW50ZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBkaXIxLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjIuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyMy5nZXRBYnNvbHV0ZVBhdGgoKQorCisgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUYXJnZXRzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJtdWx0aXBsZVRhcmdldHMiKTsKKyAgICAgICAgYXNzZXJ0TG9nQ29udGFpbmluZygidGVzdDEtb25lIik7CisgICAgICAgIGFzc2VydExvZ0NvbnRhaW5pbmcoInRlc3QxLXR3byIpOworICAgICAgICBhc3NlcnRMb2dDb250YWluaW5nKCJ0ZXN0Mi1vbmUiKTsKKyAgICAgICAgYXNzZXJ0TG9nQ29udGFpbmluZygidGVzdDItdHdvIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVRhcmdldHNPbmVEb2VzbnRFeGlzdF9GT0VmYWxzZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibXVsdGlwbGVUYXJnZXRzT25lRG9lc250RXhpc3RfRk9FZmFsc2UiKTsKKyAgICAgICAgYXNzZXJ0TG9nQ29udGFpbmluZygiVGFyZ2V0IFwidGhyZWVcIiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcHJvamVjdCBcInN1YmFudFwiIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVRhcmdldHNPbmVEb2VzbnRFeGlzdF9GT0V0cnVlKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoIm11bHRpcGxlVGFyZ2V0c09uZURvZXNudEV4aXN0X0ZPRXRydWUiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYWxsaW5nIG5vdCBleGlzdGVudCB0YXJnZXQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYXJnZXQgXCJ0aHJlZVwiIGRvZXMgbm90IGV4aXN0IGluIHRoZSBwcm9qZWN0IFwic3ViYW50XCIiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0QmFzZURpcnMoU3RyaW5nIHRhcmdldCwgU3RyaW5nW10gZGlycykgeworICAgICAgICBTdWJBbnRUZXN0LkJhc2VkaXJDaGVja2VyIGJjID0gbmV3IFN1YkFudFRlc3QuQmFzZWRpckNoZWNrZXIoZGlycyk7CisgICAgICAgIHByb2plY3QuYWRkQnVpbGRMaXN0ZW5lcihiYyk7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgYWUgPSBiYy5nZXRFcnJvcigpOworICAgICAgICBpZiAoYWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgYWU7CisgICAgICAgIH0KKyAgICAgICAgcHJvamVjdC5yZW1vdmVCdWlsZExpc3RlbmVyKGJjKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEJhc2VkaXJDaGVja2VyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gZXhwZWN0ZWRCYXNlZGlyczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY2FsbHMgPSAwOworICAgICAgICBwcml2YXRlIEFzc2VydGlvbkZhaWxlZEVycm9yIGVycm9yOworCisgICAgICAgIEJhc2VkaXJDaGVja2VyKFN0cmluZ1tdIGRpcnMpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkQmFzZWRpcnMgPSBkaXJzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCl7fQorICAgICAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorICAgICAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkge30KKyAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7fQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRCYXNlZGlyc1tjYWxscysrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBnZXRFcnJvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TeW5jVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N5bmNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzMDJkMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TeW5jVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCitwdWJsaWMgY2xhc3MgU3luY1Rlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBTeW5jVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3luYy54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDb3B5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJzaW1wbGVjb3B5Iik7CisgICAgICAgIFN0cmluZyBkID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2EvYi9jL2QiOworICAgICAgICBhc3NlcnRGaWxlSXNQcmVzZW50KGQpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZ1bGxMb2coKS5pbmRleE9mKCJkYW5nbGluZyIpID09IC0xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlDb3B5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJlbXB0eWNvcHkiKTsKKyAgICAgICAgU3RyaW5nIGQgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImRlc3QiKSArICIvYS9iL2MvZCI7CisgICAgICAgIGFzc2VydEZpbGVJc05vdFByZXNlbnQoZCk7CisgICAgICAgIFN0cmluZyBjID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2EvYi9jIjsKKyAgICAgICAgYXNzZXJ0RmlsZUlzTm90UHJlc2VudChjKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGdWxsTG9nKCkuaW5kZXhPZigiZGFuZ2xpbmciKSA9PSAtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RGlyQ29weSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZW1wdHlkaXJjb3B5Iik7CisgICAgICAgIFN0cmluZyBkID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2EvYi9jL2QiOworICAgICAgICBhc3NlcnRGaWxlSXNOb3RQcmVzZW50KGQpOworICAgICAgICBTdHJpbmcgYyA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZGVzdCIpICsgIi9hL2IvYyI7CisgICAgICAgIGFzc2VydEZpbGVJc1ByZXNlbnQoYyk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0RnVsbExvZygpLmluZGV4T2YoImRhbmdsaW5nIikgPT0gLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5QW5kUmVtb3ZlKCkgeworICAgICAgICB0ZXN0Q29weUFuZFJlbW92ZSgiY29weWFuZHJlbW92ZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5QW5kUmVtb3ZlV2l0aEZpbGVMaXN0KCkgeworICAgICAgICB0ZXN0Q29weUFuZFJlbW92ZSgiY29weWFuZHJlbW92ZS13aXRoLWZpbGVsaXN0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlBbmRSZW1vdmVXaXRoWmlwZmlsZXNldCgpIHsKKyAgICAgICAgdGVzdENvcHlBbmRSZW1vdmUoImNvcHlhbmRyZW1vdmUtd2l0aC16aXBmaWxlc2V0Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDb3B5QW5kUmVtb3ZlKFN0cmluZyB0YXJnZXQpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBTdHJpbmcgZCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZGVzdCIpICsgIi9hL2IvYy9kIjsKKyAgICAgICAgYXNzZXJ0RmlsZUlzUHJlc2VudChkKTsKKyAgICAgICAgU3RyaW5nIGYgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImRlc3QiKSArICIvZS9mIjsKKyAgICAgICAgYXNzZXJ0RmlsZUlzTm90UHJlc2VudChmKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGdWxsTG9nKCkuaW5kZXhPZigiUmVtb3Zpbmcgb3JwaGFuIGZpbGU6IikgPiAtMSk7CisgICAgICAgIGFzc2VydERlYnVnbG9nQ29udGFpbmluZygiUmVtb3ZlZCAxIGRhbmdsaW5nIGZpbGUgZnJvbSIpOworICAgICAgICBhc3NlcnREZWJ1Z2xvZ0NvbnRhaW5pbmcoIlJlbW92ZWQgMSBkYW5nbGluZyBkaXJlY3RvcnkgZnJvbSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5QW5kUmVtb3ZlRW1wdHlQcmVzZXJ2ZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY29weWFuZHJlbW92ZS1lbXB0eXByZXNlcnZlIik7CisgICAgICAgIFN0cmluZyBkID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2EvYi9jL2QiOworICAgICAgICBhc3NlcnRGaWxlSXNQcmVzZW50KGQpOworICAgICAgICBTdHJpbmcgZiA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZGVzdCIpICsgIi9lL2YiOworICAgICAgICBhc3NlcnRGaWxlSXNOb3RQcmVzZW50KGYpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZ1bGxMb2coKS5pbmRleE9mKCJSZW1vdmluZyBvcnBoYW4gZmlsZToiKSA+IC0xKTsKKyAgICAgICAgYXNzZXJ0RGVidWdsb2dDb250YWluaW5nKCJSZW1vdmVkIDEgZGFuZ2xpbmcgZmlsZSBmcm9tIik7CisgICAgICAgIGFzc2VydERlYnVnbG9nQ29udGFpbmluZygiUmVtb3ZlZCAxIGRhbmdsaW5nIGRpcmVjdG9yeSBmcm9tIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RGlyQ29weUFuZFJlbW92ZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZW1wdHlkaXJjb3B5YW5kcmVtb3ZlIik7CisgICAgICAgIFN0cmluZyBkID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2EvYi9jL2QiOworICAgICAgICBhc3NlcnRGaWxlSXNOb3RQcmVzZW50KGQpOworICAgICAgICBTdHJpbmcgYyA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZGVzdCIpICsgIi9hL2IvYyI7CisgICAgICAgIGFzc2VydEZpbGVJc1ByZXNlbnQoYyk7CisgICAgICAgIFN0cmluZyBmID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2UvZiI7CisgICAgICAgIGFzc2VydEZpbGVJc05vdFByZXNlbnQoZik7CisgICAgICAgIGFzc2VydFRydWUoZ2V0RnVsbExvZygpLmluZGV4T2YoIlJlbW92aW5nIG9ycGhhbiBkaXJlY3Rvcnk6IikgPiAtMSk7CisgICAgICAgIGFzc2VydERlYnVnbG9nQ29udGFpbmluZygiTk8gZGFuZ2xpbmcgZmlsZSB0byByZW1vdmUgZnJvbSIpOworICAgICAgICBhc3NlcnREZWJ1Z2xvZ0NvbnRhaW5pbmcoIlJlbW92ZWQgMiBkYW5nbGluZyBkaXJlY3RvcmllcyBmcm9tIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlOb1JlbW92ZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY29weW5vcmVtb3ZlIik7CisgICAgICAgIFN0cmluZyBkID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2EvYi9jL2QiOworICAgICAgICBhc3NlcnRGaWxlSXNQcmVzZW50KGQpOworICAgICAgICBTdHJpbmcgZiA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZGVzdCIpICsgIi9lL2YiOworICAgICAgICBhc3NlcnRGaWxlSXNQcmVzZW50KGYpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZ1bGxMb2coKS5pbmRleE9mKCJSZW1vdmluZyBvcnBoYW4gZmlsZToiKSA9PSAtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlOb1JlbW92ZVNlbGVjdG9ycygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY29weW5vcmVtb3ZlLXNlbGVjdG9ycyIpOworICAgICAgICBTdHJpbmcgZCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZGVzdCIpICsgIi9hL2IvYy9kIjsKKyAgICAgICAgYXNzZXJ0RmlsZUlzUHJlc2VudChkKTsKKyAgICAgICAgU3RyaW5nIGYgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImRlc3QiKSArICIvZS9mIjsKKyAgICAgICAgYXNzZXJ0RmlsZUlzUHJlc2VudChmKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGdWxsTG9nKCkuaW5kZXhPZigiUmVtb3Zpbmcgb3JwaGFuIGZpbGU6IikgPT0gLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydEZpbGVJc1ByZXNlbnQoU3RyaW5nIGYpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZmlsZSAiICsgZiwKKyAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZikuZXhpc3RzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydEZpbGVJc05vdFByZXNlbnQoU3RyaW5nIGYpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkbid0IGV4cGVjdCBmaWxlICIgKyBmLAorICAgICAgICAgICAgICAgICAgICFnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZikuZXhpc3RzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UU3RhbXBUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVFN0YW1wVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTE1NDYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVFN0YW1wVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkxvY2F0aW9uOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUU3RhbXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJvdGVjdGVkIFRzdGFtcCB0c3RhbXA7CisgICAgcHJvdGVjdGVkIFByb2plY3QgcHJvamVjdDsKKyAgICBwcm90ZWN0ZWQgTG9jYXRpb24gbG9jYXRpb247CisKKyAgICBwdWJsaWMgVFN0YW1wVGVzdChTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbigidGVzdC54bWwiKTsKKyAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIHRzdGFtcCA9IG5ldyBUc3RhbXAoKTsKKyAgICAgICAgdHN0YW1wLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKKyAgICAgICAgdHN0YW1wLnNldFByb2plY3QocHJvamVjdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVab25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRzdGFtcC5DdXN0b21Gb3JtYXQgZm9ybWF0ID0gdHN0YW1wLmNyZWF0ZUZvcm1hdCgpOworICAgICAgICBmb3JtYXQuc2V0UHJvcGVydHkoInRvZGF5Iik7CisgICAgICAgIGZvcm1hdC5zZXRQYXR0ZXJuKCJISDptbTpzcyB6Iik7CisgICAgICAgIGZvcm1hdC5zZXRUaW1lem9uZSgiR01UIik7CisgICAgICAgIERhdGUgZGF0ZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpOworICAgICAgICBmb3JtYXQuZXhlY3V0ZShwcm9qZWN0LCBkYXRlLCBsb2NhdGlvbik7CisgICAgICAgIFN0cmluZyB0b2RheSA9IHByb2plY3QuZ2V0UHJvcGVydHkoInRvZGF5Iik7CisKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiSEg6bW06c3MgeiIpOworICAgICAgICBzZGYuc2V0VGltZVpvbmUoIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSApOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBzZGYuZm9ybWF0KGRhdGUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgdG9kYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHZlcmlmaWVzIHRoYXQgY3VzdG9tIHByb3BzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGUKKyAgICAgKiBvcmlnaW5hbHMKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZU9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRzdGFtcC5DdXN0b21Gb3JtYXQgZm9ybWF0ID0gdHN0YW1wLmNyZWF0ZUZvcm1hdCgpOworICAgICAgICBmb3JtYXQuc2V0UHJvcGVydHkoIlRPREFZIik7CisgICAgICAgIGZvcm1hdC5zZXRQYXR0ZXJuKCJISDptbTpzcyB6Iik7CisgICAgICAgIGZvcm1hdC5zZXRUaW1lem9uZSgiR01UIik7CisgICAgICAgIERhdGUgZGF0ZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpOworICAgICAgICBmb3JtYXQuZXhlY3V0ZShwcm9qZWN0LCBkYXRlLCBsb2NhdGlvbik7CisgICAgICAgIFN0cmluZyB0b2RheSA9IHByb2plY3QuZ2V0UHJvcGVydHkoIlRPREFZIik7CisKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiSEg6bW06c3MgeiIpOworICAgICAgICBzZGYuc2V0VGltZVpvbmUoIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSApOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBzZGYuZm9ybWF0KGRhdGUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgdG9kYXkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogdmVyaWZpZXMgdGhhdCBjdXN0b20gcHJvcHMgaGF2ZSBwcmlvcml0eSBvdmVyIHRoZQorICAgICAqIG9yaWdpbmFscworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0c3RhbXAuc2V0UHJlZml4KCJwcmVmaXgiKTsKKyAgICAgICAgdHN0YW1wLmV4ZWN1dGUoKTsKKyAgICAgICAgU3RyaW5nIHByb3A9IHByb2plY3QuZ2V0UHJvcGVydHkoInByZWZpeC5EU1RBTVAiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0UHJlZml4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJVHN0YW1wLkN1c3RvbUZvcm1hdCBmb3JtYXQgPSB0c3RhbXAuY3JlYXRlRm9ybWF0KCk7CisgICAgICAgIGZvcm1hdC5zZXRQcm9wZXJ0eSgiZm9ybWF0Iik7CisgICAgICAgIGZvcm1hdC5zZXRQYXR0ZXJuKCJISDptbTpzcyB6Iik7CisgICAgICAgIGZvcm1hdC5zZXRUaW1lem9uZSgiR01UIik7CisKKyAgICAgICAgdHN0YW1wLnNldFByZWZpeCgicHJlZml4Iik7CisgICAgICAgIHRzdGFtcC5leGVjdXRlKCk7CisgICAgICAgIFN0cmluZyBwcm9wPSBwcm9qZWN0LmdldFByb3BlcnR5KCJwcmVmaXguZm9ybWF0Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJvcCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RhclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWJlZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RhclRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBUYXJUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgVGFyVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGFyLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDMiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDQiLCAidGFyIGNhbm5vdCBpbmNsdWRlIGl0c2VsZiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgICAgICBGaWxlIGYKKyAgICAgICAgICAgID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZXN0NS50YXIiKTsKKworICAgICAgICBpZiAoIWYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGZhaWwoIlRhcnJpbmcgYSBkaXJlY3RvcnkgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q2IiwgIkludmFsaWQgdmFsdWUgc3BlY2lmaWVkIGZvciBsb25nZmlsZSBhdHRyaWJ1dGUuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDcoKSB7CisgICAgICAgIHRlc3Q3KCJ0ZXN0NyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q3VXNpbmdQbGFpbkZpbGVTZXQoKSB7CisgICAgICAgIHRlc3Q3KCJ0ZXN0N1VzaW5nUGxhaW5GaWxlU2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDdVc2luZ0ZpbGVMaXN0KCkgeworICAgICAgICB0ZXN0NygidGVzdDdVc2luZ0ZpbGVMaXN0Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3Q3KFN0cmluZyB0YXJnZXQpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBGaWxlIGYxCisgICAgICAgICAgICA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVzdDctcHJlZml4Iik7CisKKyAgICAgICAgaWYgKCEoZjEuZXhpc3RzKCkgJiYgZjEuaXNEaXJlY3RvcnkoKSkpIHsKKyAgICAgICAgICAgIGZhaWwoIlRoZSBwcmVmaXggYXR0cmlidXRlIGlzIG5vdCB3b3JraW5nIHByb3Blcmx5LiIpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBmMgorICAgICAgICAgICAgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rlc3Q3ZGlyIik7CisKKyAgICAgICAgaWYgKCEoZjIuZXhpc3RzKCkgJiYgZjIuaXNEaXJlY3RvcnkoKSkpIHsKKyAgICAgICAgICAgIGZhaWwoIlRoZSBwcmVmaXggYXR0cmlidXRlIGlzIG5vdCB3b3JraW5nIHByb3Blcmx5LiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDgoKSB7CisgICAgICAgIHRlc3Q4KCJ0ZXN0OCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q4VXNpbmdaaXBGaWxlc2V0KCkgeworICAgICAgICB0ZXN0OCgidGVzdDhVc2luZ1ppcEZpbGVzZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0OFVzaW5nWmlwRmlsZXNldFNyYygpIHsKKyAgICAgICAgdGVzdDgoInRlc3Q4VXNpbmdaaXBGaWxlc2V0U3JjIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDhVc2luZ1RhckZpbGVzZXRTcmMoKSB7CisgICAgICAgIHRlc3Q4KCJ0ZXN0OFVzaW5nVGFyRmlsZXNldFNyYyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q4VXNpbmdaaXBFbnRyeSgpIHsKKyAgICAgICAgdGVzdDgoInRlc3Q4VXNpbmdaaXBFbnRyeSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0OChTdHJpbmcgdGFyZ2V0KSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgRmlsZSBmMQorICAgICAgICAgICAgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rlc3Q4LnhtbCIpOworICAgICAgICBpZiAoISBmMS5leGlzdHMoKSkgeworICAgICAgICAgICAgZmFpbCgiVGhlIGZ1bGxwYXRoIGF0dHJpYnV0ZSBvciB0aGUgcHJlc2VydmVMZWFkaW5nU2xhc2hlcyBhdHRyaWJ1dGUgZG9lcyBub3Qgd29yayBwcm9wZXJ0bHkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q5KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDkiLCAiSW52YWxpZCB2YWx1ZSBzcGVjaWZpZWQgZm9yIGNvbXByZXNzaW9uIGF0dHJpYnV0ZS4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTAoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxMCIpOworICAgICAgICBGaWxlIGYxCisgICAgICAgICAgICA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVzdDEwLnhtbCIpOworICAgICAgICBpZiAoISBmMS5leGlzdHMoKSkgeworICAgICAgICAgICAgZmFpbCgiVGhlIGZ1bGxwYXRoIGF0dHJpYnV0ZSBvciB0aGUgcHJlc2VydmVMZWFkaW5nU2xhc2hlcyBhdHRyaWJ1dGUgZG9lcyBub3Qgd29yayBwcm9wZXJ0bHkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxMSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDExIik7CisgICAgICAgIEZpbGUgZjEKKyAgICAgICAgICAgID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZXN0MTEueG1sIik7CisgICAgICAgIGlmICghIGYxLmV4aXN0cygpKSB7CisgICAgICAgICAgICBmYWlsKCJUaGUgZnVsbHBhdGggYXR0cmlidXRlIG9yIHRoZSBwcmVzZXJ2ZUxlYWRpbmdTbGFzaGVzIGF0dHJpYnV0ZSBkb2VzIG5vdCB3b3JrIHByb3BlcnRseSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdaaXBSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RHWmlwUmVzb3VyY2UiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkKKyAgICAgICAgICAgICAgICAgICAuY29udGVudEVxdWFscyhnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIi4uL2FzZi1sb2dvLmdpZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgidGVzdG91dC9hc2YtbG9nby5naWYuZ3oiKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTFhMzkzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZUZXN0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIFRhc2tkZWZUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgVGFza2RlZlRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rhc2tkZWYueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NCIsICJjbGFzc25hbWUgc3BlY2lmaWVkIGRvZXNuJ3QgZXhpc3QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q1IiwgIk5vIHB1YmxpYyBleGVjdXRlKCkgaW4gIiArIFByb2plY3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q1YSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDVhIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7CisgICAgICAgIGV4cGVjdExvZygidGVzdDYiLCAic2ltcGxldGFzazogd29ya2VkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDcoKSB7CisgICAgICAgIGV4cGVjdExvZygidGVzdDciLCAid29ya2VkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdsb2JhbCgpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0R2xvYmFsIiwgIndvcmtlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE92ZXJyaWRlIik7CisgICAgICAgIFN0cmluZyBsb2cgPSBnZXRMb2coKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgib3ZlcnJpZGUgd2FybmluZyBzZW50IiwKKyAgICAgICAgICAgICAgICAgICBsb2cuaW5kZXhPZigiVHJ5aW5nIHRvIG92ZXJyaWRlIG9sZCBkZWZpbml0aW9uIG9mIHRhc2sgY29weSIpID4gLTEpOworICAgICAgICBhc3NlcnRUcnVlKCJ0YXNrIGluc2lkZSB0YXJnZXQgd29ya2VkIiwKKyAgICAgICAgICAgICAgICAgICBsb2cuaW5kZXhPZigiSW4gdGFyZ2V0IikgPiAtMSk7CisgICAgICAgIGFzc2VydFRydWUoInRhc2sgaW5zaWRlIHRhcmdldCB3b3JrZWQiLAorICAgICAgICAgICAgICAgICAgIGxvZy5pbmRleE9mKCJJbiBUYXNrQ29udGFpbmVyIikgPiAtMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZzVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTVlZjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZnNUZXN0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBAZGVwcmVjYXRlZCB1c2UgQnVpbGRGaWxlVGVzdCBpbnN0ZWFkLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGFza2RlZnNUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgVGFza2RlZnNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UZXN0UHJvY2Vzcy5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rlc3RQcm9jZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlYmU0YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UZXN0UHJvY2Vzcy5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworLyoqCisgKiBJbnRlcmFjdGl2ZSBUZXN0Y2FzZSBmb3IgUHJvY2Vzc2Rlc3Ryb3llci4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0UHJvY2VzcworICAgIGltcGxlbWVudHMgUnVubmFibGUKK3sKKyAgICBwcml2YXRlIGJvb2xlYW4gcnVuID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworCisgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKQorICAgIHsKKyAgICAgICAgaWYgKCFkb25lKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNodXR0aW5nIGRvd24gVGVzdFByb2Nlc3MiKTsKKyAgICAgICAgICAgIHJ1biA9IGZhbHNlOworCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWRvbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkgeyB3YWl0KCk7IH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0UHJvY2VzcyBzaHV0IGRvd24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUgJiYgcnVuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIHRyeSB7IFRocmVhZC5zbGVlcCgyMDAwKTsgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHt9CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykKKyAgICAgICAgeworICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICBub3RpZnlBbGwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBUaHJlYWQgZ2V0U2h1dGRvd25Ib29rKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFByb2Nlc3NTaHV0ZG93bkhvb2soKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RQcm9jZXNzU2h1dGRvd25Ib29rCisgICAgICAgIGV4dGVuZHMgVGhyZWFkCisgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgICAgICB7CisgICAgICAgICAgICBzaHV0ZG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICB7CisgICAgICAgIFRlc3RQcm9jZXNzIHRwID0gbmV3IFRlc3RQcm9jZXNzKCk7CisgICAgICAgIG5ldyBUaHJlYWQodHAsICJUZXN0UHJvY2VzcyB0aHJlYWQiKS5zdGFydCgpOworICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sodHAuZ2V0U2h1dGRvd25Ib29rKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UaW1lUHJvY2Vzcy5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RpbWVQcm9jZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlMTVkMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UaW1lUHJvY2Vzcy5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKKy8qKgorICogSGVscGVyIGNsYXNzIGZvciBFeGVjdXRlV2F0Y2hkb2dUZXN0IGFuZCBFeGVjdXRlSmF2YVRlc3QuCisgKgorICogPHA+VXNlZCB0byBiZSBhbiBpbm5lciBjbGFzcyBvZiBFeGVjdXRlV2F0Y2hkb2dUZXN0LgorICoKKyAqLworcHVibGljIGNsYXNzIFRpbWVQcm9jZXNzIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHRpbWUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMF0pOworICAgICAgICBpZiAodGltZSA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdGltZTogIiArIHRpbWUpOworICAgICAgICB9CisgICAgICAgIFRocmVhZC5zbGVlcCh0aW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVG91Y2hUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVG91Y2hUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3ZDQ5OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Ub3VjaFRlc3QuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworcHVibGljIGNsYXNzIFRvdWNoVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRPVUNIX0ZJTEUgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG91Y2h0ZXN0IjsKKworICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwdWJsaWMgVG91Y2hUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3VjaC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFRhcmdldFRpbWUoKSB7CisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIFRPVUNIX0ZJTEUpOworICAgICAgICBpZighZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmYWlsZWQgdG8gdG91Y2ggZmlsZSAiICsgZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gcmVhbCB0ZXN0LCBzaW1wbHkgY2hlY2tzIHdoZXRoZXIgdGhlIGRhdGVmb3JtYXQgd2l0aG91dAorICAgICAqIHNlY29uZHMgaXMgYWNjZXB0ZWQgLSBieSBlcnJvcmluZyBvdXQgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NlY29uZHMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoIm5vU2Vjb25kcyIpOworICAgICAgICBsb25nIHRpbWUgPSBnZXRUYXJnZXRUaW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gcmVhbCB0ZXN0LCBzaW1wbHkgY2hlY2tzIHdoZXRoZXIgdGhlIGRhdGVmb3JtYXQgd2l0aAorICAgICAqIHNlY29uZHMgaXMgYWNjZXB0ZWQgLSBieSBlcnJvcmluZyBvdXQgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNvbmRzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJzZWNvbmRzIik7CisgICAgICAgIGxvbmcgdGltZT1nZXRUYXJnZXRUaW1lKCk7CisgICAgfQorICAgIC8qKgorICAgICAqIHZlcmlmeSB0aGF0IHRoZSBtaWxsaXMgdGVzdCBzZXRzIHRoaW5ncyB1cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RNaWxsaXMoKSB7CisgICAgICAgIHRvdWNoRmlsZSgidGVzdE1pbGxpcyIsIDY2MjI1NjAwMDAwMEwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHZlcmlmeSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGRlZmF1bHRzIHRvIG5vdworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3coKSB7CisgICAgICAgIGxvbmcgbm93PVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Tm93Iik7CisgICAgICAgIGxvbmcgdGltZSA9IGdldFRhcmdldFRpbWUoKTsKKyAgICAgICAgYXNzZXJ0VGltZXNOZWFybHlNYXRjaCh0aW1lLG5vdyw1MDAwKTsKKyAgICB9CisgICAgLyoqCisgICAgICogdmVyaWZ5IHRoYXQgdGhlIG1pbGxpcyB0ZXN0IHNldHMgdGhpbmdzIHVwCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdDIwMDAoKSB7CisgICAgICAgIHRvdWNoRmlsZSgidGVzdDIwMDAiLCA5NDYwODAwMDAwMDBMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoZSBmaWxlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZWxpc3QoKSB7CisgICAgICAgIHRvdWNoRmlsZSgidGVzdEZpbGVsaXN0IiwgNjYyMjU2MDAwMDAwTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGUgZmlsZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZXNldCgpIHsKKyAgICAgICAgdG91Y2hGaWxlKCJ0ZXN0RmlsZXNldCIsIDk0NjA4MDAwMDAwMEwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIHJlc291cmNlIGNvbGxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VDb2xsZWN0aW9uKCkgeworICAgICAgICB0b3VjaEZpbGUoInRlc3RSZXNvdXJjZUNvbGxlY3Rpb24iLCAxNjYyMjU2MDAwMDAwTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGUgbWFwcGVkIGZpbGUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE1hcHBlZEZpbGVzZXQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RNYXBwZWRGaWxlc2V0Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0aGUgZXhwbGljaXQgbWFwcGVkIGZpbGUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0TWFwcGVkRmlsZXNldCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEV4cGxpY2l0TWFwcGVkRmlsZXNldCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIG1hcHBlZCBmaWxlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkRmlsZWxpc3QoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RNYXBwZWRGaWxlbGlzdCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIHBhdHRlcm4gYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdvb2RQYXR0ZXJuKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0R29vZFBhdHRlcm4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoZSBwYXR0ZXJuIGF0dHJpYnV0ZSBhZ2FpbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRQYXR0ZXJuKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RCYWRQYXR0ZXJuIiwKKyAgICAgICAgICAgICJObyBwYXJzaW5nIGV4Y2VwdGlvbiB0aHJvd24iLCAiVW5wYXJzZWFibGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBydW4gYSB0YXJnZXQgdG8gdG91Y2ggdGhlIHRlc3QgZmlsZTsgdmVyaWZ5IHRoZSB0aW1lc3RhbXAgaXMgYXMgZXhwZWN0ZWQKKyAgICAgKiBAcGFyYW0gdGFyZ2V0TmFtZQorICAgICAqIEBwYXJhbSB0aW1lc3RhbXAKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdG91Y2hGaWxlKFN0cmluZyB0YXJnZXROYW1lLCBsb25nIHRpbWVzdGFtcCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworICAgICAgICBsb25nIHRpbWUgPSBnZXRUYXJnZXRUaW1lKCk7CisgICAgICAgIGFzc2VydFRpbWVzTmVhcmx5TWF0Y2godGltZXN0YW1wLCB0aW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhc3NlcnQgdGhhdCB0d28gdGltZXMgYXJlIHdpdGhpbiB0aGUgY3VycmVudCBGUyBncmFudWxhcml0eTsKKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wCisgICAgICogQHBhcmFtIHRpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRUaW1lc05lYXJseU1hdGNoKGxvbmcgdGltZXN0YW1wLGxvbmcgdGltZSkgeworICAgICAgICBsb25nIGdyYW51bGFyaXR5PSBGSUxFX1VUSUxTLmdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpOworICAgICAgICBhc3NlcnRUaW1lc05lYXJseU1hdGNoKHRpbWVzdGFtcCwgdGltZSwgZ3JhbnVsYXJpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFzc2VydCB0aGF0IHR3byB0aW1lcyBhcmUgd2l0aGluIGEgc3BlY2lmaWVkIHJhbmdlCisgICAgICogQHBhcmFtIHRpbWVzdGFtcAorICAgICAqIEBwYXJhbSB0aW1lCisgICAgICogQHBhcmFtIHJhbmdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFRpbWVzTmVhcmx5TWF0Y2gobG9uZyB0aW1lc3RhbXAsIGxvbmcgdGltZSwgbG9uZyByYW5nZSkgeworICAgICAgICBhc3NlcnRUcnVlKCJUaW1lICIgKyB0aW1lc3RhbXAgKyAiIGlzIG5vdCB3aXRoaW4gIiArIHJhbmdlICsgIiBtcyBvZiAiCisgICAgICAgICAgICArIHRpbWUsIChNYXRoLmFicyh0aW1lIC0gdGltZXN0YW1wKSA8PSByYW5nZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UeXBlQWRhcHRlclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UeXBlQWRhcHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVlMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1R5cGVBZGFwdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UeXBlQWRhcHRlcjsKKworCisvKioKKyAqLworcHVibGljIGNsYXNzIFR5cGVBZGFwdGVyVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFR5cGVBZGFwdGVyVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWFkYXB0ZXIueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRhc2tBZGFwdGVyKCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJ0YXNrYWRhcHRlciIsICJNeUV4ZWMgY2FsbGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJ1bkFkYXB0ZXIoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInJ1bmFkYXB0ZXIiLCAiTXlSdW5uYWJsZSBjYWxsZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuQWRhcHRlckVycm9yKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoCisgICAgICAgICAgICAicnVuYWRhcHRlcmVycm9yIiwgInh4IiwgIk5vIHB1YmxpYyBydW4oKSBtZXRob2QgaW4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsYXkoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoImRlbGF5IiwgIk15VGFzayBjYWxsZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25FcnJvclJlcG9ydCgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygib25lcnJvci5yZXBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeVRhc2tOb3RQcmVzZW50IGNhbm5vdCBiZSBmb3VuZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPbkVycm9ySWdub3JlKCkgeworICAgICAgICBleHBlY3RMb2coIm9uZXJyb3IuaWdub3JlIiwiIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVRhc2sgZXh0ZW5kcyBUYXNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIGxvZygiTXlUYXNrIGNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUV4ZWMgeworICAgICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICAgICAgcHJvamVjdC5sb2coIk15RXhlYyBjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSdW5uYWJsZSB7CisgICAgICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHByb2plY3QubG9nKCJNeVJ1bm5hYmxlIGNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSdW5uYWJsZUFkYXB0ZXIKKyAgICAgICAgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgVHlwZUFkYXB0ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGV4ZWNNZXRob2ROYW1lID0gInJ1biI7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IHByb3h5OworCisgICAgICAgIHB1YmxpYyBNZXRob2QgZ2V0RXhlY3V0ZU1ldGhvZChDbGFzcyBwcm94eUNsYXNzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1ldGhvZCBleGVjTWV0aG9kID0gcHJveHlDbGFzcy5nZXRNZXRob2QoCisgICAgICAgICAgICAgICAgICAgIGV4ZWNNZXRob2ROYW1lLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoIVZvaWQuVFlQRS5lcXVhbHMoZXhlY01ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZSBvZiAiICsgZXhlY01ldGhvZE5hbWUgKyAiKCkgc2hvdWxkIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInZvaWQgYnV0IHdhcyBcIiIgKyBleGVjTWV0aG9kLmdldFJldHVyblR5cGUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm94eUNsYXNzOworICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBleGVjTWV0aG9kOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJObyBwdWJsaWMgIisgZXhlY01ldGhvZE5hbWUgKworICAgICAgICAgICAgICAgICAgICAiKCkgbWV0aG9kIGluICIKKyAgICAgICAgICAgICAgICAgICAgKyBwcm94eUNsYXNzOworICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1Byb3h5Q2xhc3MoQ2xhc3MgcHJveHlDbGFzcykgeworICAgICAgICAgICAgZ2V0RXhlY3V0ZU1ldGhvZChwcm94eUNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3h5KE9iamVjdCBvKSB7CisgICAgICAgICAgICBnZXRFeGVjdXRlTWV0aG9kKG8uZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICB0aGlzLnByb3h5ID0gbzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJveHkoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJveHk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldFByb2plY3RSZWZlcmVuY2UocHJveHkpOworICAgICAgICAgICAgTWV0aG9kIGV4ZWN1dGVNZXRob2QgPSBnZXRFeGVjdXRlTWV0aG9kKHByb3h5LmdldENsYXNzKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBleGVjdXRlTWV0aG9kLmludm9rZShwcm94eSwgbnVsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgbG9nKCJFcnJvciBpbiAiICsgcHJveHkuZ2V0Q2xhc3MoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGllLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKChCdWlsZEV4Y2VwdGlvbikgdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGxvZygiRXJyb3IgaW4gIiArIHByb3h5LmdldENsYXNzKCksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UeXBlZGVmVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1R5cGVkZWZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyYzA0MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UeXBlZGVmVGVzdC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgVHlwZWRlZlRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBUeXBlZGVmVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWRlZi54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJlbXB0eSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vTmFtZSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oIm5vTmFtZSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQ2xhc3NuYW1lKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigibm9DbGFzc25hbWUiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc05vdEZvdW5kKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigiY2xhc3NOb3RGb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc25hbWUgc3BlY2lmaWVkIGRvZXNuJ3QgZXhpc3QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2xvYmFsKCkgeworICAgICAgICBleHBlY3RMb2coInRlc3RHbG9iYWwiLCAiIik7CisgICAgICAgIE9iamVjdCByZWYgPSBwcm9qZWN0LmdldFJlZmVyZW5jZXMoKS5nZXQoImdsb2JhbCIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJyZWYgaXMgbm90IG51bGwiLCByZWYpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5leGFtcGxlLnR5cGVzLlR5cGVkZWZUZXN0VHlwZSIsCisgICAgICAgICAgICAgICAgICAgICByZWYuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbCgpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJ0ZXN0TG9jYWwiLCAiIik7CisgICAgICAgIE9iamVjdCByZWYgPSBwcm9qZWN0LmdldFJlZmVyZW5jZXMoKS5nZXQoImxvY2FsIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoInJlZiBpcyBub3QgbnVsbCIsIHJlZik7CisgICAgICAgIGFzc2VydEVxdWFscygib3JnLmV4YW1wbGUudHlwZXMuVHlwZWRlZlRlc3RUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlZi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0byBtYWtlIHN1cmUgdGhhdCBvbmUgY2FuIGRlZmluZSBhIG5vdCBwcmVzZW50CisgICAgICogb3B0aW9uYWwgdHlwZSB0d2ljZSBhbmQgdGhlbiBoYXZlIGEgdmFsaWQgZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlTm90UHJlc2VudCgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygiZG91YmxlLW5vdHByZXNlbnQiLCAiaGkiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE5vUmVzb3VyY2VPbkVycm9yRmFpbEFsbCgpeworICAgIAkJdGhpcy5leHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoIm5vcmVzb3VyY2VmYWlsYWxsIiwidGhlIHJlcXVlc3RlZCByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCIsIkNvdWxkIG5vdCBsb2FkIGRlZmluaXRpb25zIGZyb20gcmVzb3VyY2UgIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1Jlc291cmNlT25FcnJvckZhaWwoKXsKKwkJZXhwZWN0TG9nQ29udGFpbmluZygibm9yZXNvdXJjZWZhaWwiLCJDb3VsZCBub3QgbG9hZCBkZWZpbml0aW9ucyBmcm9tIHJlc291cmNlICIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZXNvdXJjZU9uRXJyb3JOb3RGYWlsKCl7CisgICAgCQlleHBlY3RMb2dDb250YWluaW5nKCJub3Jlc291cmNlbm90ZmFpbCIsIkNvdWxkIG5vdCBsb2FkIGRlZmluaXRpb25zIGZyb20gcmVzb3VyY2UgIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VudGFyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VudGFyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzNiOWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW50YXJUZXN0LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgVW50YXJUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHVibGljIFVudGFyVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdW50YXIueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhbFRlc3QoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RMb2dvRXh0cmFjdGlvbigicmVhbFRlc3QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhbEd6aXBUZXN0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0TG9nb0V4dHJhY3Rpb24oInJlYWxHemlwVGVzdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFsQnppcDJUZXN0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0TG9nb0V4dHJhY3Rpb24oInJlYWxCemlwMlRlc3QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdFRhclRhc2soKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RMb2dvRXh0cmFjdGlvbigidGVzdFRhclRhc2siKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEd6aXBUYXJUYXNrKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0TG9nb0V4dHJhY3Rpb24oInRlc3RHemlwVGFyVGFzayIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0QnppcDJUYXJUYXNrKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0TG9nb0V4dHJhY3Rpb24oInRlc3RCemlwMlRhclRhc2siKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3JjRGlyVGVzdCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInNyY0RpclRlc3QiLCAiU3JjIGNhbm5vdCBiZSBhIGRpcmVjdG9yeS4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RpbmcoKSB7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oImVuY29kaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHVudGFyPiBvdmVycmlkZXMgc2V0RW5jb2RpbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHVudGFyIHRhc2sgZG9lc24ndCBzdXBwb3J0IHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZW5jb2RpbmcgYXR0cmlidXRlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQ29sbGVjdGlvbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdExvZ29FeHRyYWN0aW9uKCJyZXNvdXJjZUNvbGxlY3Rpb24iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdExvZ29FeHRyYWN0aW9uKFN0cmluZyB0YXJnZXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhwcm9qZWN0LnJlc29sdmVGaWxlKCIuLi9hc2YtbG9nby5naWYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnJlc29sdmVGaWxlKCJhc2YtbG9nby5naWYiKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb2N1bWVudGF0aW9uQ2xhaW1zT25Db3B5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RG9jdW1lbnRhdGlvbkNsYWltc09uQ29weSIpOworICAgICAgICBhc3NlcnRGYWxzZShnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInVudGFydGVzdG91dC8xL2ZvbyIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInVudGFydGVzdG91dC8yL2JhciIpLmV4aXN0cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW56aXBUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW56aXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhNzY5YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnppcFRlc3QuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqLworcHVibGljIGNsYXNzIFVuemlwVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgLyoqIFV0aWxpdGllcyB1c2VkIGZvciBmaWxlIG9wZXJhdGlvbnMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHB1YmxpYyBVbnppcFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VuemlwLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MiIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MyIsICJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhbFRlc3QoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInJlYWxUZXN0Iik7CisgICAgICAgIGFzc2VydExvZ29VbmNvcnJ1cHRlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhhdCB0aGUgbG9nbyBnaWYgZmlsZSBoYXMgbm90IGJlZW4gY29ycnVwdGVkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRMb2dvVW5jb3JydXB0ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuY29udGVudEVxdWFscyhwcm9qZWN0LnJlc29sdmVGaWxlKCIuLi9hc2YtbG9nby5naWYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnJlc29sdmVGaWxlKCJhc2YtbG9nby5naWYiKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0WmlwVGFzaygpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFppcFRhc2siKTsKKyAgICAgICAgYXNzZXJ0TG9nb1VuY29ycnVwdGVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRlc3RVbmNvbXByZXNzZWRaaXBUYXNrKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0VW5jb21wcmVzc2VkWmlwVGFzayIpOworICAgICAgICBhc3NlcnRMb2dvVW5jb3JydXB0ZWQoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBSIDExMTAwCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5TZXRFeGNsdWRlT25seSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFBhdHRlcm5TZXRFeGNsdWRlT25seSIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgZXhjbHVkZWQiLCAidW56aXB0ZXN0b3V0LzEvZm9vIik7CisgICAgICAgIGFzc2VydEZpbGVFeGlzdHMoIjIvYmFyIGlzIG5vdCBleGNsdWRlZCIsICJ1bnppcHRlc3RvdXQvMi9iYXIiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBSIDExMTAwCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5TZXRJbmNsdWRlT25seSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFBhdHRlcm5TZXRJbmNsdWRlT25seSIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwgInVuemlwdGVzdG91dC8xL2ZvbyIpOworICAgICAgICBhc3NlcnRGaWxlRXhpc3RzKCIyL2JhciBpcyBpbmNsdWRlZCIsICJ1bnppcHRlc3RvdXQvMi9iYXIiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBSIDExMTAwCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5TZXRJbmNsdWRlQW5kRXhjbHVkZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFBhdHRlcm5TZXRJbmNsdWRlQW5kRXhjbHVkZSIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwgInVuemlwdGVzdG91dC8xL2ZvbyIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMi9iYXIgaXMgZXhjbHVkZWQiLCAidW56aXB0ZXN0b3V0LzIvYmFyIik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQUiAzODk3MworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUd29QYXR0ZXJuU2V0cygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFR3b1BhdHRlcm5TZXRzIik7CisgICAgICAgIGFzc2VydEZpbGVNaXNzaW5nKCIxL2ZvbyBpcyBub3QgaW5jbHVkZWQiLCAidW56aXB0ZXN0b3V0LzEvZm9vIik7CisgICAgICAgIGFzc2VydEZpbGVFeGlzdHMoIjIvYmFyIGlzIGluY2x1ZGVkIiwgInVuemlwdGVzdG91dC8yL2JhciIpOworICAgIH0KKworICAgIC8qCisgICAgICogUFIgMzg5NzMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvUGF0dGVyblNldHNXaXRoRXhjbHVkZXMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RUd29QYXR0ZXJuU2V0c1dpdGhFeGNsdWRlcyIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwgInVuemlwdGVzdG91dC8xL2ZvbyIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMi9iYXIgaXMgZXhjbHVkZWQiLCAidW56aXB0ZXN0b3V0LzIvYmFyIik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQUiAxNjIxMworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxmRXh0cmFjdGluZ0FyY2hpdmUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInNlbGZFeHRyYWN0aW5nQXJjaGl2ZSIpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBQUiAyMDk2OQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuU2V0U2xhc2hPbmx5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UGF0dGVyblNldFNsYXNoT25seSIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwgInVuemlwdGVzdG91dC8xL2ZvbyIpOworICAgICAgICBhc3NlcnRGaWxlRXhpc3RzKCJcIjIvYmFyIGlzIGluY2x1ZGVkIiwgInVuemlwdGVzdG91dC8yL2JhciIpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBQUiAxMDUwNAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGluZygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZW5jb2RpbmdUZXN0Iik7CisgICAgICAgIGFzc2VydEZpbGVFeGlzdHMoImZvbyBoYXMgYmVlbiBwcm9wZXJseSBuYW1lZCIsICJ1bnppcHRlc3RvdXQvZm9vIik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQUiAyMTk5NgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGbGF0dGVuTWFwcGVyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmxhdHRlbk1hcHBlciIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGZsYXR0ZW5lZCIsICJ1bnppcHRlc3RvdXQvMS9mb28iKTsKKyAgICAgICAgYXNzZXJ0RmlsZUV4aXN0cygiZm9vIGlzIGZsYXR0ZW5lZCIsICJ1bnppcHRlc3RvdXQvZm9vIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYXNzZXJ0IHRoYXQgYSBmaWxlIGV4aXN0cywgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIGlmIHRoZXJlIGlzIG5vIG1wYXRjaAorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSB0byByZXNvbHZlIGFnYWluc3QgdGhlIHByb2plY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RmlsZUV4aXN0cyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhc3NlcnQgdGhhdCBhIGZpbGUgZG9lc250IGV4aXN0LCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdAorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgIG1lc3NhZ2UgaWYgdGhlcmUgaXMgbm8gbXBhdGNoCisgICAgICogQHBhcmFtIGZpbGVuYW1lIGZpbGVuYW1lIHRvIHJlc29sdmUgYWdhaW5zdCB0aGUgcHJvamVjdAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGaWxlTWlzc2luZyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAhZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGZpbGVuYW1lKS5leGlzdHMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUFIgMjE5OTYKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2xvYk1hcHBlcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEdsb2JNYXBwZXIiKTsKKyAgICAgICAgYXNzZXJ0RmlsZU1pc3NpbmcoIjEvZm9vIGlzIG5vdCBtYXBwZWQiLCAidW56aXB0ZXN0b3V0LzEvZm9vIik7CisgICAgICAgIGFzc2VydEZpbGVFeGlzdHMoIjEvZm9vIGlzIG1hcHBlZCIsICJ1bnppcHRlc3RvdXQvMS9mb28udHh0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFR3b01hcHBlcnMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0VHdvTWFwcGVycyIsRXhwYW5kLkVSUk9SX01VTFRJUExFX01BUFBFUlMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNvbGxlY3Rpb25zKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UmVzb3VyY2VDb2xsZWN0aW9uIik7CisgICAgICAgIGFzc2VydEZpbGVFeGlzdHMoImp1bml0LmphciBoYXMgYmVlbiBleHRyYWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnppcHRlc3RvdXQvanVuaXQvZnJhbWV3b3JrL0Fzc2VydC5jbGFzcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb2N1bWVudGF0aW9uQ2xhaW1zT25Db3B5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RG9jdW1lbnRhdGlvbkNsYWltc09uQ29weSIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgZXhjbHVkZWQiLCAidW56aXB0ZXN0b3V0LzEvZm9vIik7CisgICAgICAgIGFzc2VydEZpbGVFeGlzdHMoIjIvYmFyIGlzIG5vdCBleGNsdWRlZCIsICJ1bnppcHRlc3RvdXQvMi9iYXIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVXBUb0RhdGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVXBUb0RhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmU4ZmZhNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VcFRvRGF0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCitwdWJsaWMgY2xhc3MgVXBUb0RhdGVUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgVXBUb0RhdGVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91cHRvZGF0ZS54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVhckRvd24iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZXNldFVwVG9EYXRlKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVNldCgidGVzdEZpbGVzZXRVcFRvRGF0ZSIsICJmb28iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZXNldE91dE9mRGF0ZSgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgidGVzdEZpbGVzZXRPdXRPZkRhdGUiLCAiZm9vIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJDVXBUb0RhdGUoKSB7CisgICAgICAgIGV4cGVjdFByb3BlcnR5U2V0KCJ0ZXN0UkNVcFRvRGF0ZSIsICJmb28iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UkNPdXRPZkRhdGUoKSB7CisgICAgICAgIGV4cGVjdFByb3BlcnR5VW5zZXQoInRlc3RSQ091dE9mRGF0ZSIsICJmb28iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2FyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE5ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhclRlc3QuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIFRlc3RjYXNlIGZvciB0aGUgd2FyIHRhc2sKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBXYXJUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9CVUlMRF9GSUxFCisgICAgICAgID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3dhci54bWwiOworCisgICAgcHVibGljIFdhclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoVEVTVF9CVUlMRF9GSUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGRpcmVjdCBkZXBlbmRlbmN5IHJlbW92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGliUmVmcygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdGxpYnJlZnMiKTsKKyAgICAgICAgRmlsZSBmID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJ3b3JraW5nL1dFQi1JTkYvbGliL3dhci54bWwiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBoYXMgYmVlbiBwdXQgaW50byBsaWIiLCBmLmV4aXN0cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2hpY2hSZXNvdXJjZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XaGljaFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODU0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2hpY2hSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCitwdWJsaWMgY2xhc3MgV2hpY2hSZXNvdXJjZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JVSUxEX0ZJTEUKKyAgICAgICAgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvd2hpY2hyZXNvdXJjZS54bWwiOworCisgICAgcHVibGljIFdoaWNoUmVzb3VyY2VUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRFU1RfQlVJTERfRklMRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzbmFtZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENsYXNzbmFtZSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50bWFpbiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VuYW1lKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UmVzb3VyY2VuYW1lIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZWZhdWx0cyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VuYW1lV2l0aExlYWRpbmdTbGFzaCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFJlc291cmNlbmFtZVdpdGhMZWFkaW5nU2xhc2giKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImRlZmF1bHRzIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YbWxQcm9wZXJ0eVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YbWxQcm9wZXJ0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGE0NmVhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1htbFByb3BlcnR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqLworcHVibGljIGNsYXNzIFhtbFByb3BlcnR5VGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHVibGljIFhtbFByb3BlcnR5VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGUoKSB7CisgICAgICAgIHRlc3RQcm9wZXJ0aWVzKCJ0ZXN0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlKCkgeworICAgICAgICB0ZXN0UHJvcGVydGllcygidGVzdFJlc291cmNlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RQcm9wZXJ0aWVzKFN0cmluZyB0YXJnZXQpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInJvb3QtdGFnKG15YXR0cikiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGV4dCIsIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgicm9vdC10YWcuaW5uZXItdGFnIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbCIsCisgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInJvb3QtdGFnLmlubmVyLXRhZyhzb21lYXR0cikiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLCBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInJvb3QtdGFnLmEyLmEzLmE0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNEQVRBIGZhaWxlZCIsCisgICAgICAgICAgICAiPHRlc3Q+IiwgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJyb290LXRhZy5jZGF0YXRhZyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RFREKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0ZHRkIik7CisgICAgICAgIGFzc2VydEVxdWFscygiVGV4dCIsIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgicm9vdC10YWcuaW5uZXItdGFnIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25lICgpIHsKKyAgICAgICAgZG9UZXN0KCJ0ZXN0Tm9uZSIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtlZXByb290KCkgeworICAgICAgICBkb1Rlc3QoInRlc3RLZWVwcm9vdCIsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sbGFwc2UgKCkgeworICAgICAgICBkb1Rlc3QoInRlc3RDb2xsYXBzZSIsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VtYW50aWMgKCkgeworICAgICAgICBkb1Rlc3QoInRlc3RTZW1hbnRpYyIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2VlcHJvb3RDb2xsYXBzZSAoKSB7CisgICAgICAgIGRvVGVzdCgidGVzdEtlZXByb290Q29sbGFwc2UiLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2VlcHJvb3RTZW1hbnRpYyAoKSB7CisgICAgICAgIGRvVGVzdCgidGVzdEtlZXByb290U2VtYW50aWMiLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sbGFwc2VTZW1hbnRpYyAoKSB7CisgICAgICAgIGRvVGVzdCgidGVzdENvbGxhcHNlU2VtYW50aWMiLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2VlcHJvb3RDb2xsYXBzZVNlbWFudGljICgpIHsKKyAgICAgICAgZG9UZXN0KCJ0ZXN0S2VlcHJvb3RDb2xsYXBzZVNlbWFudGljIiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZSAoKSB7CisgICAgICAgIGRvVGVzdCgidGVzdEluY2x1ZGUiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNlbWFudGljSW5jbHVkZSAoKSB7CisgICAgICAgIGRvVGVzdCgidGVzdFNlbWFudGljSW5jbHVkZSIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZW1hbnRpY0xvY2FsICgpIHsKKyAgICAgICAgZG9UZXN0KCJ0ZXN0U2VtYW50aWNJbmNsdWRlIiwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lZWRzQ2F0YWxvZygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdG5lZWRzY2F0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgic2tpbmNvbmZpZy5mb28iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWN0dWFsbHkgcnVuIGEgdGVzdCwgZmluZGluZyBhbGwgaW5wdXQgZmlsZXMgKGFuZCBjb3JyZXNwb25kaW5nCisgICAgICogZ29sZGZpbGUpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdChTdHJpbmcgbXNnLCBib29sZWFuIGtlZXBSb290LCBib29sZWFuIGNvbGxhcHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZW1hbnRpYywgYm9vbGVhbiBpbmNsdWRlLCBib29sZWFuIGxvY2FsUm9vdCkgeworICAgICAgICBFbnVtZXJhdGlvbiBpdGVyID0KKyAgICAgICAgICAgIGdldEZpbGVzKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzIikpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSAoRmlsZSkgaXRlci5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgLy8gV2hhdCdzIHRoZSB3b3JraW5nIGRpcmVjdG9yeT8gIElmIGxvY2FsLCB0aGVuIGl0cyB0aGUKKyAgICAgICAgICAgIC8vIGZvbGRlciBvZiB0aGUgaW5wdXQgZmlsZS4gIE90aGVyd2lzZSwgaXRzIHRoZSAiY3VycmVudCIgZGlyLi4KKyAgICAgICAgICAgIEZpbGUgd29ya2luZ0RpcjsKKyAgICAgICAgICAgIGlmICggbG9jYWxSb290ICkgeworICAgICAgICAgICAgICAgIHdvcmtpbmdEaXIgPSBpbnB1dEZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3b3JraW5nRGlyID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZSgiLiIpLCAiLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgRmlsZSBwcm9wZXJ0eUZpbGUgPSBnZXRHb2xkZmlsZShpbnB1dEZpbGUsIGtlZXBSb290LCBjb2xsYXBzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljLCBpbmNsdWRlLCBsb2NhbFJvb3QpOworICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHlGaWxlLmV4aXN0cygpKSB7CisvLyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyBhcyAiCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcGVydHlGaWxlLmdldEFic29sdXRlUGF0aCgpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgZG9lc24ndCBleGlzdC4iKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZyArICIgKCIgKyBwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpICsgIikgaW4gKCIgKyB3b3JraW5nRGlyICsgIikiKTsKKworICAgICAgICAgICAgICAgIFByb2plY3QgcCA9IG5ldyBQcm9qZWN0KCk7CisKKyAgICAgICAgICAgICAgICBYbWxQcm9wZXJ0eSB4bWxwcm9wZXJ0eSA9IG5ldyBYbWxQcm9wZXJ0eSgpOworICAgICAgICAgICAgICAgIHhtbHByb3BlcnR5LnNldFByb2plY3QocCk7CisgICAgICAgICAgICAgICAgeG1scHJvcGVydHkuc2V0RmlsZShpbnB1dEZpbGUpOworCisgICAgICAgICAgICAgICAgeG1scHJvcGVydHkuc2V0S2VlcHJvb3Qoa2VlcFJvb3QpOworICAgICAgICAgICAgICAgIHhtbHByb3BlcnR5LnNldENvbGxhcHNlQXR0cmlidXRlcyhjb2xsYXBzZSk7CisgICAgICAgICAgICAgICAgeG1scHJvcGVydHkuc2V0U2VtYW50aWNBdHRyaWJ1dGVzKHNlbWFudGljKTsKKyAgICAgICAgICAgICAgICB4bWxwcm9wZXJ0eS5zZXRJbmNsdWRlU2VtYW50aWNBdHRyaWJ1dGUoaW5jbHVkZSk7CisgICAgICAgICAgICAgICAgeG1scHJvcGVydHkuc2V0Um9vdERpcmVjdG9yeSh3b3JraW5nRGlyKTsKKworICAgICAgICAgICAgICAgIC8vIFNldCBhIHByb3BlcnR5IG9uIHRoZSBwcm9qZWN0IHRvIG1ha2Ugc3VyZSB0aGF0IGxvYWRpbmcKKyAgICAgICAgICAgICAgICAvLyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUgbmFtZSBmcm9tIGFuIHhtbCBmaWxlIHdpbGwKKyAgICAgICAgICAgICAgICAvLyAqbm90KiBjaGFuZ2UgaXQuCisgICAgICAgICAgICAgICAgcC5zZXROZXdQcm9wZXJ0eSgib3ZlcnJpZGUucHJvcGVydHkudGVzdCIsICJmb28iKTsKKworICAgICAgICAgICAgICAgIHhtbHByb3BlcnR5LmV4ZWN1dGUoKTsKKworICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wZXJ0eUZpbGUpKTsKKworICAgICAgICAgICAgICAgIC8vcHJpbnRQcm9wZXJ0aWVzKHAuZ2V0UHJvcGVydGllcygpKTsKKworICAgICAgICAgICAgICAgIGVuc3VyZVByb3BlcnRpZXMobXNnLCBpbnB1dEZpbGUsIHdvcmtpbmdEaXIsIHAsIHByb3BzKTsKKyAgICAgICAgICAgICAgICBlbnN1cmVSZWZlcmVuY2VzKG1zZywgaW5wdXRGaWxlLCBwLmdldFJlZmVyZW5jZXMoKSk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgZmFpbChleC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2Ugc3VyZSBldmVyeSBwcm9wZXJ0eSBsb2FkZWQgZnJvbSB0aGUgZ29sZGZpbGUgd2FzIGFsc28KKyAgICAgKiByZWFkIGZyb20gdGhlIFhtbFByb3BlcnR5LiAgV2UgY291bGQgdHJ5IGFuZCB0ZXN0IHRoZSBvdGhlciB3YXksCisgICAgICogYnV0IHNvbWUgb3RoZXIgcHJvcGVydGllcyBtYXkgZ2V0IHNldCBpbiB0aGUgWG1sUHJvcGVydHkgZHVlCisgICAgICogdG8gZ2VuZXJpYyBQcm9qZWN0L1Rhc2sgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuc3VyZVByb3BlcnRpZXMgKFN0cmluZyBtc2csIEZpbGUgaW5wdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSB3b3JraW5nRGlyLCBQcm9qZWN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKyAgICAgICAgSGFzaHRhYmxlIHhtbHByb3BlcnRpZXMgPSBwLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgLy8gRXZlcnkga2V5IGlkZW50aWZpZWQgYnkgdGhlIFByb3BlcnRpZXMgbXVzdCBoYXZlIGJlZW4gbG9hZGVkLgorICAgICAgICBFbnVtZXJhdGlvbiBwcm9wZXJ0eUtleUVudW0gPSBwcm9wZXJ0aWVzLnByb3BlcnR5TmFtZXMoKTsKKyAgICAgICAgd2hpbGUocHJvcGVydHlLZXlFbnVtLmhhc01vcmVFbGVtZW50cygpKXsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50S2V5ID0gcHJvcGVydHlLZXlFbnVtLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBhc3NlcnRNc2cgPSBtc2cgKyAiLSIgKyBpbnB1dEZpbGUuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKyAiIEtleT0iICsgY3VycmVudEtleTsKKworICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KGN1cnJlbnRLZXkpOworCisgICAgICAgICAgICBTdHJpbmcgeG1sVmFsdWUgPSAoU3RyaW5nKXhtbHByb3BlcnRpZXMuZ2V0KGN1cnJlbnRLZXkpOworCisgICAgICAgICAgICBpZiAoIHByb3BlcnR5VmFsdWUuaW5kZXhPZigiSUQuIikgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgaXMgYW4gaWQncyB0aGluZyAtLSBlaXRoZXIgYSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgIC8vIG9yIGEgcGF0aC4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGlkLgorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgYW4gYWRlcXVhdGUgd2F5IG9mIHRlc3RpbmcgdGhlIGFjdHVhbAorICAgICAgICAgICAgICAgIC8vICp2YWx1ZSogb2YgdGhlIFBhdGggb2JqZWN0LCB0aG91Z2guLi4KKyAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBjdXJyZW50S2V5OworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBwLmdldFJlZmVyZW5jZXMoKS5nZXQoaWQpOworCisgICAgICAgICAgICAgICAgaWYgKCBvYmogPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbChhc3NlcnRNc2cgKyAiIE9iamVjdCBJRCBkb2VzIG5vdCBleGlzdC4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBXaGF0IGlzIHRoZSBwcm9wZXJ0eSBzdXBwb3NlZCB0byBiZT8KKyAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZS5zdWJzdHJpbmcoMywgcHJvcGVydHlWYWx1ZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUuZXF1YWxzKCJwYXRoIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoYXNzZXJ0TXNnICsgIiBQYXRoIElEIGlzIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYXNzZXJ0TXNnLCBwcm9wZXJ0eVZhbHVlLCBvYmoudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUuaW5kZXhPZigiRklMRS4iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSBpcyB0aGUgbmFtZSBvZiBhIGZpbGUuICBXZSBhcmUgdGVzdGluZworICAgICAgICAgICAgICAgICAgICAvLyBhIGxvY2F0aW9uIGF0dHJpYnV0ZSwgc28gd2UgbmVlZCB0byByZXNvbHZlIHRoZSBnaXZlbgorICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIG5hbWUgaW4gdGhlIHByb3ZpZGVkIGZvbGRlci4KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUuc3Vic3RyaW5nKDUsIHByb3BlcnR5VmFsdWUubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSh3b3JraW5nRGlyLCBmaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPSBmLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhhc3NlcnRNc2csIHByb3BlcnR5VmFsdWUsIHhtbFZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVidWdnaW5nIG1ldGhvZCB0byBwcmludCB0aGUgcHJvcGVydGllcyBpbiB0aGUgZ2l2ZW4gaGFzaHRhYmxlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFByb3BlcnRpZXMoSGFzaHRhYmxlIHhtbHByb3BlcnRpZXMpIHsKKyAgICAgICAgRW51bWVyYXRpb24ga2V5RW51bSA9IHhtbHByb3BlcnRpZXMua2V5cygpOworICAgICAgICB3aGlsZSAoa2V5RW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRLZXkgPSBrZXlFbnVtLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdXJyZW50S2V5ICsgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHhtbHByb3BlcnRpZXMuZ2V0KGN1cnJlbnRLZXkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZSBhbGwgcmVmZXJlbmNlcyBsb2FkZWQgYnkgdGhlIHByb2plY3QgYXJlIHZhbGlkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5zdXJlUmVmZXJlbmNlcyAoU3RyaW5nIG1zZywgRmlsZSBpbnB1dEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgcmVmZXJlbmNlcykgeworICAgICAgICBFbnVtZXJhdGlvbiByZWZlcmVuY2VLZXlFbnVtID0gcmVmZXJlbmNlcy5rZXlzKCk7CisgICAgICAgIHdoaWxlKHJlZmVyZW5jZUtleUVudW0uaGFzTW9yZUVsZW1lbnRzKCkpeworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRLZXkgPSByZWZlcmVuY2VLZXlFbnVtLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIE9iamVjdCBjdXJyZW50VmFsdWUgPSByZWZlcmVuY2VzLmdldChjdXJyZW50S2V5KTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFBhdGgpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCAhIGN1cnJlbnRLZXkuc3RhcnRzV2l0aCgiYW50LiIpICkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKG1zZyArICItIiArIGlucHV0RmlsZS5nZXROYW1lKCkgKyAiIEtleT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50S2V5ICsgIiBpcyBub3QgYSByZWNvZ25pemVkIHR5cGUuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVuZ2UgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgdG8gZmluZCBhbiBhcHByb3ByaWF0ZSBnb2xkZmlsZSwKKyAgICAgKiBiYXNlZCBvbiBoYXJkd2lyZWQgbmFtaW5nIGNvbnZlbnRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0R29sZGZpbGUgKEZpbGUgaW5wdXQsIGJvb2xlYW4ga2VlcFJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjb2xsYXBzZSwgYm9vbGVhbiBzZW1hbnRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGUsIGJvb2xlYW4gbG9jYWxSb290KSB7CisgICAgICAgIC8vIFN1YnN0aXR1dGUgLnhtbCB3aXRoIC5wcm9wZXJ0aWVzCisgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IGlucHV0LmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICBpZiAoYmFzZU5hbWUuZW5kc1dpdGgoIi54bWwiKSkgeworICAgICAgICAgICAgYmFzZU5hbWUgPSBiYXNlTmFtZS5zdWJzdHJpbmcoMCwgYmFzZU5hbWUubGVuZ3RoKCkgLSA0KQorICAgICAgICAgICAgICAgICsgIi5wcm9wZXJ0aWVzIjsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZGlyID0gaW5wdXQuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKKworICAgICAgICBTdHJpbmcgZ29sZEZpbGVGb2xkZXIgPSAiZ29sZGZpbGVzLyI7CisKKyAgICAgICAgaWYgKGtlZXBSb290KSB7CisgICAgICAgICAgICBnb2xkRmlsZUZvbGRlciArPSAia2VlcHJvb3QtIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdvbGRGaWxlRm9sZGVyICs9ICJub2tlZXByb290LSI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VtYW50aWMpIHsKKyAgICAgICAgICAgIGdvbGRGaWxlRm9sZGVyICs9ICJzZW1hbnRpYy0iOworICAgICAgICAgICAgaWYgKGluY2x1ZGUpIHsKKyAgICAgICAgICAgICAgICBnb2xkRmlsZUZvbGRlciArPSAiaW5jbHVkZS0iOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvbGxhcHNlKSB7CisgICAgICAgICAgICAgICAgZ29sZEZpbGVGb2xkZXIgKz0gImNvbGxhcHNlLSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdvbGRGaWxlRm9sZGVyICs9ICJub2NvbGxhcHNlLSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGlyLCBnb2xkRmlsZUZvbGRlciArIGJhc2VOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIGxpc3Qgb2YgeG1sIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyCisgICAgICogYW5kIGJlbG93LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEVudW1lcmF0aW9uIGdldEZpbGVzIChmaW5hbCBGaWxlIHN0YXJ0aW5nRGlyKSB7CisgICAgICAgIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGdldEZpbGVzKHN0YXJ0aW5nRGlyLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0LmVsZW1lbnRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdCBhIGxpc3Qgb2YgeG1sIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyCisgICAgICogYW5kIGJlbG93LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RmlsZXMgKGZpbmFsIEZpbGUgc3RhcnRpbmdEaXIsIFZlY3RvciBjb2xsZWN0KSB7CisgICAgICAgIEZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQgKEZpbGUgZmlsZSkgeworICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmaWxlLmdldFBhdGgoKS5pbmRleE9mKCJ0YXNrZGVmcyIpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGF0aCgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54bWwiKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBGaWxlW10gZmlsZXMgPSBzdGFydGluZ0Rpci5saXN0RmlsZXMoZmlsdGVyKTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8ZmlsZXMubGVuZ3RoO2krKykgeworICAgICAgICAgICAgRmlsZSBmID0gZmlsZXNbaV07CisgICAgICAgICAgICBpZiAoIWYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGNvbGxlY3QuYWRkRWxlbWVudChmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2V0RmlsZXMoZiwgY29sbGVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWG1sbnNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWG1sbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMTA1MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YbWxuc1Rlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgWG1sbnNUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgcHVibGljIFhtbG5zVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1sbnMueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFhtbG5zKCkgeworICAgICAgICBleHBlY3RMb2coInhtbG5zIiwgIk15VGFzayBjYWxsZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sbnNGaWxlKCkgeworICAgICAgICBleHBlY3RMb2coInhtbG5zLmZpbGUiLCAiTXlUYXNrIGNhbGxlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3JlKCkgeworICAgICAgICBleHBlY3RMb2coImNvcmUiLCAiTXlUYXNrIGNhbGxlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNsdWRlZCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKAorICAgICAgICAgICAgImV4Y2x1ZGVkIiwgImV4Y2x1ZGVkIHVyaSIsCisgICAgICAgICAgICAiQXR0ZW1wdCB0byB1c2UgYSByZXNlcnZlZCBVUkkgYW50Om5vdGFsbG93ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3RoZXIoKSB7CisgICAgICAgIGV4cGVjdExvZygib3RoZXIiLCAiYSBtZXNzYWdlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5zQXR0cmlidXRlcygpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJucy5hdHRyaWJ1dGVzIiwgImhlbGxvIHdvcmxkIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVRhc2sgZXh0ZW5kcyBUYXNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIGxvZygiTXlUYXNrIGNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9aaXBUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWmlwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NGNlOTAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWmlwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuVW5peFN0YXQ7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgWmlwVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworICAgIC8vaW5zdGFuY2UgdmFyaWFibGUgdG8gYWxsb3cgY2xlYW51cAorICAgIFppcEZpbGUgemZQcmVmaXhBZGRzRGlyID0gbnVsbDsKKyAgICBwdWJsaWMgWmlwVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvemlwLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDMiLCAiemlwIGNhbm5vdCBpbmNsdWRlIGl0c2VsZiIpOworICAgIH0KKworICAgIC8vICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgeworICAgIC8vICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDQiLCAiemlwIGNhbm5vdCBpbmNsdWRlIGl0c2VsZiIpOworICAgIC8vICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCB6ZlByZWZpeEFkZHNEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHpmUHJlZml4QWRkc0Rpci5jbG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vaWdub3JlZAorICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdDcoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q3Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDgoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q4Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFppcGdyb3VwZmlsZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RaaXBncm91cGZpbGVzZXQiKTsKKworICAgICAgICBaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJ6aXBncm91cGZpbGVzZXQuemlwIikpOworCisgICAgICAgIGFzc2VydFRydWUoemlwRmlsZS5nZXRFbnRyeSgiYW50LnhtbCIpICE9IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKHppcEZpbGUuZ2V0RW50cnkoIm9wdGlvbmFsL2pzcGMueG1sIikgIT0gbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoemlwRmlsZS5nZXRFbnRyeSgiemlwL3ppcGdyb3VwZmlsZXNldDMuemlwIikgIT0gbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSh6aXBGaWxlLmdldEVudHJ5KCJ0ZXN0Ni5tZiIpID09IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKHppcEZpbGUuZ2V0RW50cnkoInRlc3Q3Lm1mIikgPT0gbnVsbCk7CisKKyAgICAgICAgemlwRmlsZS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOb3ROZWNlc3NhcnkoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RVcGRhdGVOb3ROZWNlc3NhcnkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBnZXRMb2coKS5pbmRleE9mKCJVcGRhdGluZyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSXNOZWNlc3NhcnkoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RVcGRhdGVJc05lY2Vzc2FyeSIsICJVcGRhdGluZyIpOworICAgIH0KKworICAgIC8vIEJ1Z3ppbGxhIFJlcG9ydCAxODQwMworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVmaXhBZGRzRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFByZWZpeEFkZHNEaXIiKTsKKyAgICAgICAgRmlsZSBhcmNoaXZlID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJ0ZXN0My56aXAiKTsKKyAgICAgICAgemZQcmVmaXhBZGRzRGlyID0gbmV3IFppcEZpbGUoYXJjaGl2ZSk7CisgICAgICAgIFppcEVudHJ5IHplID0gemZQcmVmaXhBZGRzRGlyLmdldEVudHJ5KCJ0ZXN0LyIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJ0ZXN0LyBoYXMgYmVlbiBhZGRlZCIsIHplKTsKKworICAgIH0KKworICAgIC8vIEJ1Z3ppbGxhIFJlcG9ydCAxOTQ0OQorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc09ubHlEb2VzbnRDYXVzZVJlY3JlYXRlKCkKKyAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVzT25seURvZXNudENhdXNlUmVjcmVhdGVTZXR1cCIpOworICAgICAgICBsb25nIGwgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInRlc3QzLnppcCIpLmxhc3RNb2RpZmllZCgpOworICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlc09ubHlEb2VzbnRDYXVzZVJlY3JlYXRlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhsLCBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInRlc3QzLnppcCIpLmxhc3RNb2RpZmllZCgpKTsKKyAgICB9CisKKyAgICAvLyBCdWd6aWxsYSBSZXBvcnQgMjI4NjUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTa2lwKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RW1wdHlTa2lwIik7CisgICAgfQorICAgIC8vIEJ1Z3ppbGxhIFJlcG9ydCAzMDM2NQorICAgIHB1YmxpYyB2b2lkIHRlc3RaaXBFbXB0eURpcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiemlwRW1wdHlEaXIiKTsKKyAgICB9CisgICAgLy8gQnVnemlsbGEgUmVwb3J0IDQwMjU4CisgICAgcHVibGljIHZvaWQgdGVzdFppcEVtcHR5RGlyRmlsZXNPbmx5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ6aXBFbXB0eURpckZpbGVzT25seSIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0WmlwRW1wdHlDcmVhdGUoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInppcEVtcHR5Q3JlYXRlIiwgIk5vdGU6IGNyZWF0aW5nIGVtcHR5Iik7CisgICAgfQorICAgIC8vIEJ1Z3ppbGxhIFJlcG9ydCAyNTUxMworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wcmVzc2lvbkxldmVsKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Q29tcHJlc3Npb25MZXZlbCIpOworICAgIH0KKworICAgIC8vIEJ1Z3ppbGxhIFJlcG9ydCAzMzQxMgorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RXhjbHVkZXNBbmRVcGRhdGUoKSAKKyAgICAgICAgdGhyb3dzIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RGVmYXVsdEV4Y2x1ZGVzQW5kVXBkYXRlIik7CisgICAgICAgIFppcEZpbGUgZiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmID0gbmV3IFppcEZpbGUoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJ0ZXN0My56aXAiKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJ6aXB0ZXN0fiBzaG91bGQgYmUgaW5jbHVkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmLmdldEVudHJ5KCJ6aXB0ZXN0fiIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVJlc291cmNlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsZVJlc291cmNlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vbkZpbGVSZXNvdXJjZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE5vbkZpbGVSZXNvdXJjZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJGaWxlU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFRhckZpbGVTZXQiKTsKKyAgICAgICAgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZSB6ZiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB6ZiA9IG5ldyBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlKGdldFByb2plY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZUZpbGUoInRlc3QzLnppcCIpKTsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVudHJ5IHplID0gemYuZ2V0RW50cnkoImFzZi1sb2dvLmdpZiIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFVuaXhTdGF0LkZJTEVfRkxBRyB8IDA0NDYsIHplLmdldFVuaXhNb2RlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHpmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB6Zi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbnRWZXJzaW9uVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbnRWZXJzaW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzVlNDQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0FudFZlcnNpb25UZXN0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIFRlc3RjYXNlcyBmb3IgdGhlICZsdDthbnR2ZXJzaW9uJmd0OyBjb25kaXRpb24uCisgKgorICovCitwdWJsaWMgY2xhc3MgQW50VmVyc2lvblRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICAKKyAgICBwdWJsaWMgQW50VmVyc2lvblRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvYW50dmVyc2lvbi54bWwiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEF0TGVhc3QoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RhdGxlYXN0Iik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGFjdGx5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0ZXhhY3RseSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQ29udGFpbnNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbnRhaW5zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYmUxZmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbnRhaW5zVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdGNhc2UgZm9yIHRoZSAmbHQ7Y29udGFpbnMmZ3Q7IGNvbmRpdGlvbi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWluc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgQ29udGFpbnNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlU2Vuc2l0aXZlKCkgeworICAgICAgICBDb250YWlucyBjb24gPSBuZXcgQ29udGFpbnMoKTsKKyAgICAgICAgY29uLnNldFN0cmluZygiYWJjIik7CisgICAgICAgIGNvbi5zZXRTdWJzdHJpbmcoIkEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghY29uLmV2YWwoKSk7CisKKyAgICAgICAgY29uLnNldENhc2VzZW5zaXRpdmUoZmFsc2UpOworICAgICAgICBhc3NlcnRUcnVlKGNvbi5ldmFsKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9FcXVhbHNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0VxdWFsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTgwYTgwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9FcXVhbHNUZXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0Y2FzZSBmb3IgdGhlICZsdDtlcXVhbHMmZ3Q7IGNvbmRpdGlvbi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFcXVhbHNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIEVxdWFsc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRyaW0oKSB7CisgICAgICAgIEVxdWFscyBlcSA9IG5ldyBFcXVhbHMoKTsKKyAgICAgICAgZXEuc2V0QXJnMSgiYSIpOworICAgICAgICBlcS5zZXRBcmcyKCIgYSIpOworICAgICAgICBhc3NlcnRUcnVlKCFlcS5ldmFsKCkpOworCisgICAgICAgIGVxLnNldFRyaW0odHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoZXEuZXZhbCgpKTsKKworICAgICAgICBlcS5zZXRBcmcyKCJhXHQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlcS5ldmFsKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlU2Vuc2l0aXZlKCkgeworICAgICAgICBFcXVhbHMgZXEgPSBuZXcgRXF1YWxzKCk7CisgICAgICAgIGVxLnNldEFyZzEoImEiKTsKKyAgICAgICAgZXEuc2V0QXJnMigiQSIpOworICAgICAgICBhc3NlcnRUcnVlKCFlcS5ldmFsKCkpOworCisgICAgICAgIGVxLnNldENhc2VzZW5zaXRpdmUoZmFsc2UpOworICAgICAgICBhc3NlcnRUcnVlKGVxLmV2YWwoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFpbHVyZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGYWlsdXJlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkMGUyMjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFpbHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogVGVzdGNhc2VzIGZvciB0aGUgJmx0O2lzZmFpbHVyZSZndDsgY29uZGl0aW9uLgorICoKKyAqLworcHVibGljIGNsYXNzIElzRmFpbHVyZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBJc0ZhaWx1cmVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBKVW5pdCBzZXR1cCBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9pc2ZhaWx1cmUueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzRmFpbHVyZSgpIHsKKyAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0aXNmYWlsdXJlIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmlsZVNlbGVjdGVkVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0ZpbGVTZWxlY3RlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmFiYTgwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0ZpbGVTZWxlY3RlZFRlc3QuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBUZXN0Y2FzZSBmb3IgdGhlICZsdDtpc2ZpbGVzZWxlY3RlZCZndDsgY29uZGl0aW9uLgorICoKKyAqLworcHVibGljIGNsYXNzIElzRmlsZVNlbGVjdGVkVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIElzRmlsZVNlbGVjdGVkVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNmaWxlc2VsZWN0ZWQueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgic2ltcGxlIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJuYW1lIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNlRGlyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJiYXNlZGlyIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0eXBlIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RTZWxlY3RvcigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKAorICAgICAgICAgICAgIm5vdC5zZWxlY3RvciIsICJjaGVja2luZyBmb3IgdXNlIGFzIGEgc2VsZWN0b3IgKG5vdCBhbGxvd2VkKSIsCisgICAgICAgICAgICAiZmlsZXNldCBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCBcImlzZmlsZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNSZWFjaGFibGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVhY2hhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzhjMGUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVhY2hhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiB0ZXN0IGZvciByZWFjaGFibGUgdGhpbmdzCisgKi8KK3B1YmxpYyBjbGFzcyBJc1JlYWNoYWJsZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBJc1JlYWNoYWJsZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoCisgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWFjaGFibGUueG1sIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxob3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RMb2NhbGhvc3QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxob3N0VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RMb2NhbGhvc3RVUkwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXB2NGxvY2FsaG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0SXB2NGxvY2FsaG9zdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGVFBVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZUUFVSTCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEJvdGgiLAorICAgICAgICAgICAgICAgICJlcnJvciBvbiB0d28gdGFyZ2V0cyIsCisgICAgICAgICAgICAgICAgSXNSZWFjaGFibGUuRVJST1JfQk9USF9UQVJHRVRTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UYXJnZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdE5vVGFyZ2V0cyIsCisgICAgICAgICAgICAgICAgIm5vIHBhcmFtcyIsCisgICAgICAgICAgICAgICAgSXNSZWFjaGFibGUuRVJST1JfTk9fSE9TVE5BTUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEJhZFRpbWVvdXQiLAorICAgICAgICAgICAgICAgICJlcnJvciBvbiAtdmUgdGltZW91dCIsCisgICAgICAgICAgICAgICAgSXNSZWFjaGFibGUuRVJST1JfQkFEX1RJTUVPVVQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIE5vdGVzdEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0RmlsZSIsCisgICAgICAgICAgICAgICAgImVycm9yIG9uIGZpbGUgVVJMIiwKKyAgICAgICAgICAgICAgICBJc1JlYWNoYWJsZS5FUlJPUl9OT19IT1NUX0lOX1VSTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZFVSTCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RCYWRVUkwiLAorICAgICAgICAgICAgICAgICJlcnJvciBpbiBVUkwiLAorICAgICAgICAgICAgICAgIElzUmVhY2hhYmxlLkVSUk9SX0JBRF9VUkwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNSZWZlcmVuY2VUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVmZXJlbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzc1YzQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVmZXJlbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBUZXN0Y2FzZXMgZm9yIHRoZSAmbHQ7aXNyZWZlcmVuY2UmZ3Q7IGNvbmRpdGlvbi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJc1JlZmVyZW5jZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBJc1JlZmVyZW5jZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzcmVmZXJlbmNlLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHsKKyAgICAgICBleHBlY3RQcm9wZXJ0eVNldCgiYmFzaWMiLCAiZ2xvYmFsLXBhdGgiKTsKKyAgICAgICBhc3NlcnRQcm9wZXJ0eVNldCgidGFyZ2V0LXBhdGgiKTsKKyAgICAgICBhc3NlcnRQcm9wZXJ0eVVuc2V0KCJ1bmRlZmluZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90RW5vdWdoQXJncygpIHsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigiaXNyZWZlcmVuY2UtaW5jb21wbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZmlkIGF0dHJpYnV0ZSBoYXMgYmVlbiBvbWl0dGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcmVmZXJlbmNlIHNwZWNpZmllZCBmb3IgaXNyZWZlcmVuY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbmRpdGlvbiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlKCkgeworICAgICAgIGV4cGVjdFByb3BlcnR5U2V0KCJ0eXBlIiwgImdsb2JhbC1wYXRoIik7CisgICAgICAgYXNzZXJ0UHJvcGVydHlVbnNldCgiZ2xvYmFsLXBhdGgtYXMtZmlsZXNldCIpOworICAgICAgIGFzc2VydFByb3BlcnR5VW5zZXQoImdsb2JhbC1wYXRoLWFzLWZvbyIpOworICAgICAgIGFzc2VydFByb3BlcnR5U2V0KCJnbG9iYWwtZWNobyIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1NpZ25lZFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNTaWduZWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmOTQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNTaWduZWRUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogVGVzdGNhc2UgZm9yIHRoZSAmbHQ7aXNzaWduZWQmZ3Q7IGNvbmRpdGlvbi4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJc1NpZ25lZFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBJc1NpZ25lZFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzc2lnbmVkLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXNzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJwYXNzIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXNzd29yZCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgicGFzc3dvcmQiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEFQYXNzd29yZCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiYXBhc3N3b3JkIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxTaWduZWQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImFsbHNpZ25lZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUGFyc2VyU3VwcG9ydHNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1BhcnNlclN1cHBvcnRzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNGYxMzEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1BhcnNlclN1cHBvcnRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAKKyAqLworcHVibGljIGNsYXNzIFBhcnNlclN1cHBvcnRzVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFBhcnNlclN1cHBvcnRzVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSlVuaXQgc2V0dXAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvcGFyc2Vyc3VwcG9ydHMueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEVtcHR5IiwKKyAgICAgICAgICAgICAgICBQYXJzZXJTdXBwb3J0cy5FUlJPUl9OT19BVFRSSUJVVEVTLAorICAgICAgICAgICAgICAgIFBhcnNlclN1cHBvcnRzLkVSUk9SX05PX0FUVFJJQlVURVMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdEJvdGgiLAorICAgICAgICAgICAgICAgIFBhcnNlclN1cHBvcnRzLkVSUk9SX0JPVEhfQVRUUklCVVRFUywKKyAgICAgICAgICAgICAgICBQYXJzZXJTdXBwb3J0cy5FUlJPUl9CT1RIX0FUVFJJQlVURVMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lc3BhY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3ROYW1lc3BhY2VzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Tm9WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RQcm9wZXJ0eU5vVmFsdWUiLAorICAgICAgICAgICAgICAgIFBhcnNlclN1cHBvcnRzLkVSUk9SX05PX1ZBTFVFLAorICAgICAgICAgICAgICAgIFBhcnNlclN1cHBvcnRzLkVSUk9SX05PX1ZBTFVFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93blByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RVbmtub3duUHJvcGVydHkiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgTm90ZXN0UHJvcGVydHlJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RQcm9wZXJ0eUludmFsaWQiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgTm90ZXN0WGVyY2VzUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFhlcmNlc1Byb3BlcnR5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9UeXBlRm91bmRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1R5cGVGb3VuZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQ0OTcxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9UeXBlRm91bmRUZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIHRlc3QgdGhlIHR5cGVleGlzdHMgY29uZGl0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlRm91bmRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgVHlwZUZvdW5kVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSlVuaXQgc2V0dXAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvdHlwZWZvdW5kLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrKCkgeworICAgICAgICBleHBlY3RQcm9wZXJ0eVNldCgidGVzdFRhc2siLCAidGVzdFRhc2siKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5kZWZpbmVkKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RVbmRlZmluZWQiLCJsZWZ0IG91dCB0aGUgbmFtZSBhdHRyaWJ1dGUiLCAiTm8gdHlwZSBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza1RoYXRJc250RGVmaW5lZCgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgidGVzdFRhc2tUaGF0SXNudERlZmluZWQiLCAidGVzdFRhc2tUaGF0SXNudERlZmluZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza1RoYXREb2VzbnRSZWFsbHlFeGlzdCgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlVbnNldCgidGVzdFRhc2tUaGF0RG9lc250UmVhbGx5RXhpc3QiLCAidGVzdFRhc2tUaGF0RG9lc250UmVhbGx5RXhpc3QiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZSgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoInRlc3RUeXBlIiwgInRlc3RUeXBlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZXNldCgpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoInRlc3RQcmVzZXQiLCAidGVzdFByZXNldCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYWNybygpIHsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoInRlc3RNYWNybyIsICJ0ZXN0TWFjcm8iKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Yb3JUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1hvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDAzYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Yb3JUZXN0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIFRlc3QgdGhhdCBYb3IgZm9sbG93cyB0aGUgY29udmVudGlvbmFsIGJvb2xlYW4gbG9naWMgc2VtYW50aWNzCisgKiAoYSBeIGIpID09PSAoYXx8YikmIShhJiZiKQorICovCitwdWJsaWMgY2xhc3MgWG9yVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFhvclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgSlVuaXQgc2V0dXAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMveG9yLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEVtcHR5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDAoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QwIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDAwKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MDAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTAoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxMCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QwMSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDAxIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDExKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTEiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nUGFyc2VyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dQYXJzZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlhZGQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY3ZzbGliOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIE1pbmltYWwgdGVzdCBvZiB0aGUgcGFyc2VyIGltcGxlbWVudGF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFuZ2VMb2dQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJvdGVjdGVkIENoYW5nZUxvZ1BhcnNlciBwYXJzZXIgPSBuZXcgQ2hhbmdlTG9nUGFyc2VyKCk7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2xkQ3ZzRm9ybWF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlci5zdGRvdXQoIldvcmtpbmcgZmlsZTogYnVpbGQueG1sIik7CisgICAgICAgIHBhcnNlci5zdGRvdXQoInJldmlzaW9uIDEuNDc1Iik7CisgICAgICAgIHBhcnNlci5zdGRvdXQoImRhdGU6IDIwMDQvMDYvMDUgMTY6MTA6MzI7ICBhdXRob3I6IHNvbWVib2R5OyAgc3RhdGU6IEV4cDsgIGxpbmVzOiArMiAtMiIpOworICAgICAgICBwYXJzZXIuc3Rkb3V0KCJJIGhhdmUgZG9uZSBzb21ldGhpbmcuIEkgc3dlYXIuIik7CisgICAgICAgIHBhcnNlci5zdGRvdXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIENWU0VudHJ5W10gZW50cmllcyA9IHBhcnNlci5nZXRFbnRyeVNldEFzQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzb21lYm9keSIsIGVudHJpZXNbMF0uZ2V0QXV0aG9yKCkpOworICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIiksIExvY2FsZS5VUyk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDApOworICAgICAgICBjYWwuc2V0KDIwMDQsIENhbGVuZGFyLkpVTkUsIDUsIDE2LCAxMCwgMzIpOworICAgICAgICBEYXRlIGRhdGUgPSBjYWwuZ2V0VGltZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZSwgZW50cmllc1swXS5nZXREYXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDdnMxMTJGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2VyLnN0ZG91dCgiV29ya2luZyBmaWxlOiBidWlsZC54bWwiKTsKKyAgICAgICAgcGFyc2VyLnN0ZG91dCgicmV2aXNpb24gMS40NzUiKTsKKyAgICAgICAgcGFyc2VyLnN0ZG91dCgiZGF0ZTogMjAwNC0wNi0wNSAxNjoxMDozMiArMDAwMDsgYXV0aG9yOiBzb21lYm9keTsgc3RhdGU6IEV4cDsgIGxpbmVzOiArMiAtMiIpOworICAgICAgICBwYXJzZXIuc3Rkb3V0KCJJIGhhdmUgZG9uZSBzb21ldGhpbmcuIEkgc3dlYXIuIik7CisgICAgICAgIHBhcnNlci5zdGRvdXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIENWU0VudHJ5W10gZW50cmllcyA9IHBhcnNlci5nZXRFbnRyeVNldEFzQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzb21lYm9keSIsIGVudHJpZXNbMF0uZ2V0QXV0aG9yKCkpOworICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIiksIExvY2FsZS5VUyk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDApOworICAgICAgICBjYWwuc2V0KDIwMDQsIENhbGVuZGFyLkpVTkUsIDUsIDE2LCAxMCwgMzIpOworICAgICAgICBEYXRlIGRhdGUgPSBjYWwuZ2V0VGltZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZSwgZW50cmllc1swXS5nZXREYXRlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nV3JpdGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dXcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyZjVhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nV3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY3ZzbGliOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkpBWFBVdGlsczsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworLyoqCisgKiAgVGVzdCBmb3IgdGhlIGN2c2xpYiBDaGFuZ2VMb2dXcml0ZXIKKyAqLworcHVibGljIGNsYXNzIENoYW5nZUxvZ1dyaXRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIENoYW5nZUxvZ1dyaXRlciB3cml0ZXIgPSBuZXcgQ2hhbmdlTG9nV3JpdGVyKCk7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uVVRGOENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ1ZTRW50cnkgZW50cnkgPSBuZXcgQ1ZTRW50cnkobmV3IERhdGUoKSwgIlNlXHUwMGYxb3JpdGEiLCAiMjAwMyA8IDIwMDQgJiYgMyA+IDUiKTsKKyAgICAgICAgZW50cnkuYWRkRmlsZSgiTWVkaWNhcmUgJiByZXZpZXcuZG9jIiwgIjEuMSIpOworICAgICAgICBlbnRyeS5hZGRGaWxlKCJFbFx1MDBlOG1lbnRzIGRlIHN0eWxlIiwgIjEuMiIpOworICAgICAgICBDVlNFbnRyeVtdIGVudHJpZXMgPSB7IGVudHJ5IH07CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dCwgIlVURi04IikpOworICAgICAgICB3cml0ZXIucHJpbnRDaGFuZ2VMb2cocHdyaXRlciwgZW50cmllcyk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHBhcnNpbmcgZG9lcyBub3QgYnJlYWsKKyAgICAgICAgWE1MUmVhZGVyIHhtbFJlYWRlciA9IEpBWFBVdGlscy5nZXRYTUxSZWFkZXIoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICB4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IE51bGxDb250ZW50SGFuZGxlcigpKTsKKyAgICAgICAgeG1sUmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbENvbnRlbnRIYW5kbGVyIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgZGVidWcgPSBuZXcgU3RyaW5nKGNoLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNraXBwZWRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGlyMS9CLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGlyMS9CLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1N2ZhMAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kaXIxL0IuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZGlyMTsKKworcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5kaXIyLkEgeworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQiBDTEFTUyBJTklUSUFMSVpBVElPTiIpOworICAgICAgICBzZXRBKG5ldyBCKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSSBhbSBhIEIuIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGlyMi9BLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGlyMi9BLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4NmFjNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kaXIyL0EuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZGlyMjsKKworcHVibGljIGNsYXNzIEEgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTUFJTiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYSk7CisgICAgfQorCisgICAgc3RhdGljIEEgYT1uZXcgQSgpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBIENMQVNTIElOSVRJQUxJWkFUSU9OIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldEEoQSBvYSkgeworICAgICAgICBhPW9hOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSSBhbSBhIEEuIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxBZGRyZXNzVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsQWRkcmVzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmM4N2EzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsQWRkcmVzc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBFbWFpbEFkZHJlc3NUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIEVtYWlsQWRkcmVzc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdE5hbWVBZGRyZXNzKCBuZXcgRW1haWxBZGRyZXNzKCJhZGRyZXNzIChuYW1lKSIpICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGV4cGVjdE5hbWVBZGRyZXNzKCBuZXcgRW1haWxBZGRyZXNzKCIobmFtZSkgYWRkcmVzcyIpICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4cGVjdE5hbWVBZGRyZXNzKCBuZXcgRW1haWxBZGRyZXNzKCJuYW1lIDxhZGRyZXNzPiIpICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGV4cGVjdE5hbWVBZGRyZXNzKCBuZXcgRW1haWxBZGRyZXNzKCI8YWRkcmVzcz4gbmFtZSIpICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CisgICAgICAgIGV4cGVjdE5hbWVBZGRyZXNzKCBuZXcgRW1haWxBZGRyZXNzKCI8YWRkcmVzcz4gKG5hbWUpIikgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKKyAgICAgICAgZXhwZWN0TmFtZUFkZHJlc3MoIG5ldyBFbWFpbEFkZHJlc3MoIihuYW1lKSA8YWRkcmVzcz4iKSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q3KCkgeworICAgICAgICBleHBlY3ROYW1lQWRkcmVzczIoIG5ldyBFbWFpbEFkZHJlc3MoImFkZHJlc3MgKDxuYW1lPikiKSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q4KCkgeworICAgICAgICBleHBlY3ROYW1lQWRkcmVzczIoIG5ldyBFbWFpbEFkZHJlc3MoIig8bmFtZT4pIGFkZHJlc3MiKSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q5KCkgeworICAgICAgICBleHBlY3ROYW1lQWRkcmVzczMoIG5ldyBFbWFpbEFkZHJlc3MoImFkZHJlc3MiKSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBKCkgeworICAgICAgICBleHBlY3ROYW1lQWRkcmVzczMoIG5ldyBFbWFpbEFkZHJlc3MoIjxhZGRyZXNzPiIpICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEIoKSB7CisgICAgICAgIGV4cGVjdE5hbWVBZGRyZXNzMyggbmV3IEVtYWlsQWRkcmVzcygiIDxhZGRyZXNzPiAiKSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDKCkgeworICAgICAgICBleHBlY3ROYW1lQWRkcmVzczMoIG5ldyBFbWFpbEFkZHJlc3MoIjwgYWRkcmVzcyA+IikgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RCgpIHsKKyAgICAgICAgZXhwZWN0TmFtZUFkZHJlc3MzKCBuZXcgRW1haWxBZGRyZXNzKCIgPCBhZGRyZXNzID4gIikgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0TmFtZUFkZHJlc3MoRW1haWxBZGRyZXNzIGUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCAibmFtZSIsIGUuZ2V0TmFtZSgpICk7CisgICAgICAgIGFzc2VydEVxdWFscyggImFkZHJlc3MiLCBlLmdldEFkZHJlc3MoKSApOworICAgIH0KKworICAgIC8vIHdoZXJlIHRoZSBuYW1lIGNvbnRhaW5zIDw+CisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdE5hbWVBZGRyZXNzMihFbWFpbEFkZHJlc3MgZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoICI8bmFtZT4iLCBlLmdldE5hbWUoKSApOworICAgICAgICBhc3NlcnRFcXVhbHMoICJhZGRyZXNzIiwgZS5nZXRBZGRyZXNzKCkgKTsKKyAgICB9CisKKyAgICAvLyB3aGVyZSBvbmx5IGFuIGFkZHJlc3MgaXMgc3VwcGxpZWQKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0TmFtZUFkZHJlc3MzKEVtYWlsQWRkcmVzcyBlKSB7CisgICAgICAgIGFzc2VydFRydWUoICJFeHBlY3RlZCBudWxsLCBmb3VuZCA8IiArIGUuZ2V0TmFtZSgpICsgIj4iLAorICAgICAgICAgICAgZS5nZXROYW1lKCkgPT0gbnVsbCApOworICAgICAgICBhc3NlcnRFcXVhbHMoICJhZGRyZXNzIiwgZS5nZXRBZGRyZXNzKCkgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxUYXNrVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsVGFza1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI4OWNkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsVGFza1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIFRPRE8gOiBkZXZlbG9wIHRoZXNlIHRlc3RjYXNlcyAtIHRoZSBlbWFpbCB0YXNrIG5lZWRzIHRvIGhhdmUgYXR0cmlidXRlcyBhbGxvd2luZworICogdG8gc2ltdWxhdGUgc2VuZGluZyBtYWlsIGFuZCB0byBjYXRjaCB0aGUgb3V0cHV0IGluIHRleHQgZmlsZXMgb3Igc3RyZWFtcworICovCitwdWJsaWMgY2xhc3MgRW1haWxUYXNrVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIEVtYWlsVGFza1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VtYWlsL21haWwueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJTTVRQIGF1dGggb25seSBwb3NzaWJsZSB3aXRoIE1JTUUgbWFpbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAiU1NMIG9ubHkgcG9zc2libGUgd2l0aCBNSU1FIG1haWwiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BTlRMUlRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BTlRMUlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODg2ZDgyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBJZiB5b3Ugd2FudCB0byBydW4gdGVzdHMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZAorICogdG8gZG93bmxvYWQgQU5UTFIgKHd3dy5hbnRsci5vcmcpLCBidWlsZCB0aGUgJ2FudGxyYWxsLmphcicgamFyCisgKiB3aXRoICA8Y29kZT5tYWtlIGFudGxyLWFsbC5qYXI8L2NvZGU+IGFuZCBkcm9wIHRoZSBqYXIgKGFib3V0IDMwMEtCKSBpbnRvCisgKiBBbnQgbGliLgorICogLSBSdW5uaW5nIHcvIHRoZSBkZWZhdWx0IGFudGxyLmphciAoNzBLQikgZG9lcyBub3Qgd29yayAobWlzc2luZyBjbGFzcykKKyAqCisgKiBVbmxlc3Mgb2YgY291cnNlIHlvdSBzcGVjaWZ5IHRoZSBBTlRMUiBjbGFzc3BhdGggaW4geW91cgorICogc3lzdGVtIGNsYXNzcGF0aC4gKHNlZSBBTlRMUiBpbnN0YWxsLmh0bWwpCisgKgorICovCitwdWJsaWMgY2xhc3MgQU5UTFJUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyLyI7CisKKyAgICBwdWJsaWMgQU5UTFJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJhbnRsci54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDEiLCAicmVxdWlyZWQgYXJndW1lbnQsIHRhcmdldCwgbWlzc2luZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAiSW52YWxpZCBvdXRwdXQgZGlyZWN0b3J5Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CisgICAgICAgIC8vIHNob3VsZCBwcmludCAicGFuaWM6IENhbm5vdCBmaW5kIGltcG9ydFZvY2FiIGZpbGUgJ0phdmFUb2tlblR5cGVzLnR4dCciCisgICAgICAgIC8vIHNpbmNlIGl0IG5lZWRzIHRvIHJ1biBqYXZhLmcgZmlyc3QgYmVmb3JlIGphdmEudHJlZS5nCisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0NSIsICJBTlRMUiByZXR1cm5lZDogMSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q3KCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDciLCAiVW5hYmxlIHRvIGRldGVybWluZSBnZW5lcmF0ZWQgY2xhc3MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgbmVnYXRpdmUgdGVzdCBmb3IgdGhlIHN1cGVyIGdyYW1tYXIgKGdsaWIpIG9wdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0OCgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q4IiwgIkludmFsaWQgc3VwZXIgZ3JhbW1hciBmaWxlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHBvc2l0aXZlIHRlc3QgZm9yIHRoZSBzdXBlciBncmFtbWFyIChnbGliKSBvcHRpb24uICBBTlRMUgorICAgICAqIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgZXZlcnl0aGluZyBpcyBub3QgY29ycmVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0OSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDkiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgY3JlYXRlcyBhbiBodG1sLWl6ZWQgdmVyc2lvbiBvZiB0aGUgY2FsY3VsYXRvciBncmFtbWFyLgorICAgICAqIFRoZSBzYW5pdHkgY2hlY2sgaXMgc2ltcGx5IHdoZXRoZXIgb3Igbm90IGFuIGh0bWwgZmlsZSB3YXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEwIik7CisgICAgICAgIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIFRBU0tERUZTX0RJUiArICJhbnRsci50bXAiKTsKKyAgICAgICAgU3RyaW5nW10gY2FsY0ZpbGVzID0gb3V0cHV0RGlyZWN0b3J5Lmxpc3QobmV3IEhUTUxGaWx0ZXIoKSk7CisgICAgICAgIGFzc2VydFRydWUoY2FsY0ZpbGVzLmxlbmd0aCA+IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMganVzdCBhIHF1aWNrIHNhbml0eSBjaGVjayB0byBydW4gdGhlIGRpYWdub3N0aWMgb3B0aW9uIGFuZAorICAgICAqIG1ha2Ugc3VyZSB0aGF0IGl0IGRvZXNuJ3QgdGhyb3cgYW55IGZ1bm55IGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdDExKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGp1c3QgYSBxdWljayBzYW5pdHkgY2hlY2sgdG8gcnVuIHRoZSB0cmFjZSBvcHRpb24gYW5kCisgICAgICogbWFrZSBzdXJlIHRoYXQgaXQgZG9lc24ndCB0aHJvdyBhbnkgZnVubnkgZXhjZXB0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxMiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMganVzdCBhIHF1aWNrIHNhbml0eSBjaGVjayB0byBydW4gYWxsIHRoZSByZXN0IG9mIHRoZQorICAgICAqIHRyYWNlIG9wdGlvbnMgKHRyYWNlTGV4ZXIsIHRyYWNlUGFyc2VyLCBhbmQgdHJhY2VUcmVlV2Fsa2VyKSB0bworICAgICAqIG1ha2Ugc3VyZSB0aGF0IHRoZXkgZG9uJ3QgdGhyb3cgYW55IGZ1bm55IGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdDEzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MTMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZWNvbXBpbGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q5Iik7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgZ2V0RnVsbExvZygpLmluZGV4T2YoIlNraXBwZWQgZ3JhbW1hciBmaWxlLiIpKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibm9SZWNvbXBpbGUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgtMSAhPSBnZXRGdWxsTG9nKCkuaW5kZXhPZigiU2tpcHBlZCBncmFtbWFyIGZpbGUuIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxSZWNvbXBpbGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Q5Iik7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgZ2V0RnVsbExvZygpLmluZGV4T2YoIlNraXBwZWQgZ3JhbW1hciBmaWxlLiIpKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibm9ybWFsUmVjb21waWxlIik7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgZ2V0RnVsbExvZygpLmluZGV4T2YoIlNraXBwZWQgZ3JhbW1hciBmaWxlLiIpKTsKKyAgICB9CisKKyAgICAvLyBCdWd6aWxsYSBSZXBvcnQgMTI5NjEKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwZXJncmFtbWFyQ2hhbmdlUmVjb21waWxlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGdldEZ1bGxMb2coKS5pbmRleE9mKCJTa2lwcGVkIGdyYW1tYXIgZmlsZS4iKSk7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInN1cGVyZ3JhbW1hckNoYW5nZVJlY29tcGlsZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGdldEZ1bGxMb2coKS5pbmRleE9mKCJTa2lwcGVkIGdyYW1tYXIgZmlsZS4iKSk7CisgICAgfQorfQorCitjbGFzcyBDYWxjRmlsZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVuYW1lRmlsdGVyIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoIkNhbGMiKTsKKyAgICB9Cit9CisKK2NsYXNzIEhUTUxGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7CisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aCgiaHRtbCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0Fic3RyYWN0WFNMVExpYWlzb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxMzllMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUTGlhaXNvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKKworLyoqCisgKiBBYnRyYWN0IHRlc3RjYXNlIGZvciBYU0xUTGlhaXNvbi4KKyAqIE92ZXJyaWRlIGNyZWF0ZUxpYWlzb24gZm9yIGVhY2ggWFNMVExpYWlzb24uCisgKgorICogPGEgaHJlZj0ic2JhaWxsaWV6QGFwYWNoZS5vcmciPlN0ZXBoYW5lIEJhaWxsaWV6PC9hPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKyAgICAKKyAgICBwcm90ZWN0ZWQgWFNMVExpYWlzb24gbGlhaXNvbjsKKworICAgIHByb3RlY3RlZCAgQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QoU3RyaW5nIG5hbWUpeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsaWFpc29uID0gY3JlYXRlTGlhaXNvbigpOworICAgIH0KKworICAgIC8vIHRvIG92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTTFRMaWFpc29uIGNyZWF0ZUxpYWlzb24oKSB0aHJvd3MgRXhjZXB0aW9uIDsKKworICAgIC8qKiBsb2FkIHRoZSBmaWxlIGZyb20gdGhlIGNhbGxlciBjbGFzc2xvYWRlciB0aGF0IGxvYWRlZCB0aGlzIGNsYXNzICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKG5hbWUpOworICAgICAgICBpZiAodXJsID09IG51bGwpeworICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkICciICsgbmFtZSArICInIGZyb20gY2xhc3NwYXRoIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKEZJTEVfVVRJTFMuZnJvbVVSSSh1cmwudG9FeHRlcm5hbEZvcm0oKSkpOworICAgIH0KKworICAgIC8qKiBrZWVwIGl0IHNpbXBsZSBzdHVwaWQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgeHNsID0gZ2V0RmlsZSgiL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluLnhzbCIpOworICAgICAgICBsaWFpc29uLnNldFN0eWxlc2hlZXQoeHNsKTsKKyAgICAgICAgbGlhaXNvbi5hZGRQYXJhbSgicGFyYW0iLCAidmFsdWUiKTsKKyAgICAgICAgRmlsZSBpbiA9IGdldEZpbGUoIi90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54bWwiKTsKKyAgICAgICAgRmlsZSBvdXQgPSBuZXcgRmlsZSgieHNsdGxpYWlzb24udG1wIik7CisgICAgICAgIG91dC5kZWxldGVPbkV4aXQoKTsgLy8ganVzdCB0byBiZSBzdXJlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaWFpc29uLnRyYW5zZm9ybShpbiwgb3V0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG91dC5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIHhzbCA9IGdldEZpbGUoIi90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1lbmNvZGluZy1pbi54c2wiKTsKKyAgICAgICAgbGlhaXNvbi5zZXRTdHlsZXNoZWV0KHhzbCk7CisgICAgICAgIEZpbGUgaW4gPSBnZXRGaWxlKCIvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueG1sIik7CisgICAgICAgIEZpbGUgb3V0ID0gbmV3IEZpbGUoInhzbHRsaWFpc29uLWVuY29kaW5nLnRtcCIpOworICAgICAgICBvdXQuZGVsZXRlT25FeGl0KCk7IC8vIGp1c3QgdG8gYmUgc3VyZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbGlhaXNvbi50cmFuc2Zvcm0oaW4sIG91dCk7CisgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBwYXJzZVhNTChvdXQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290Iixkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UiLGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDBFOVx1MDBFMFx1MDBFOFx1MDBFRlx1MDBGOSIsZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEZpcnN0Q2hpbGQoKS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgb3V0LmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIERvY3VtZW50IHBhcnNlWE1MKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGJ1aWxkZXIgPSBkYmZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIHJldHVybiBkYnVpbGRlci5wYXJzZShmaWxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQmVhblNoZWxsU2NyaXB0VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0JlYW5TaGVsbFNjcmlwdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzM1OGNkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0JlYW5TaGVsbFNjcmlwdFRlc3QuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBUZXN0cyB0aGUgZXhhbXBsZXMgb2YgdGhlICZsdDtzY3JpcHQmZ3Q7IHRhc2sgZG9jcy4KKyAqCisgKiBAc2luY2UgQW50IDEuNS4yCisgKi8KK3B1YmxpYyBjbGFzcyBCZWFuU2hlbGxTY3JpcHRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgQmVhblNoZWxsU2NyaXB0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSlVuaXQgc2V0dXAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuTG9hZCgpIHsKKyAgICAgICAgZXhwZWN0TG9nKCJ1c2VCZWFuc2hlbGwiLCAiSSdtIGhlcmUiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Eb3RuZXRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvRG90bmV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Y2Q3MmYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvRG90bmV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBUZXN0cyB0aGUgRG90bmV0IHRhc2tzLCBiYXNlZCBvZmYgV3NkbFRvRG90bmV0VGVzdAorICoKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBEb3RuZXRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgRmllbGQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsLyI7CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0ZXN0bmFtZQorICAgICAqLworICAgIHB1YmxpYyBEb3RuZXRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJkb3RuZXQueG1sIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVhcmRvd24gbWV0aG9kIGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZWFyZG93biIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENTQygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Q1NDIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q1NDaW50cmluc2ljRmlsZXNldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Q1NDaW50cmluc2ljRmlsZXNldCIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENTQ2RsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Q1NDZGxsIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENzY1JlZmVyZW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENzY1JlZmVyZW5jZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3NjUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDU0NSZXNvdXJjZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHdlIGNhbiBhc3NlbWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJTEFTTSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0SUxBU00iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHdlIGNhbiBkaXNhc3NlbWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJTERBU00oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdElMREFTTSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3Qgd2UgY2FuIGRpc2Fzc2VtYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElMREFTTV9lbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RJTERBU01fZW1wdHkiLAorICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIgdmFsaWRhdGlvbiIsCisgICAgICAgICAgICAgICAgImludmFsaWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHdlIGNhbiBoYW5kbGUganNoYXJwIChpZiBmb3VuZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNoYXJwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImpzaGFycCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3Qgd2UgY2FuIGhhbmRsZSBqc2hhcnAgKGlmIGZvdW5kKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENTQ3Jlc3BvbnNlRmlsZSIpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvRWNob1Byb3BlcnRpZXNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvRWNob1Byb3BlcnRpZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1MWM2MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9FY2hvUHJvcGVydGllc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIFRlc3RzIHRoZSBFY2hvUHJvcGVydGllcyB0YXNrLgorICoKKyAqIEBjcmVhdGVkICAgMTctSmFuLTIwMDIKKyAqIEBzaW5jZSAgICAgQW50IDEuNQorICovCitwdWJsaWMgY2xhc3MgRWNob1Byb3BlcnRpZXNUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdPT0RfT1VURklMRSA9ICJ0ZXN0LnByb3BlcnRpZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT09EX09VVEZJTEVfWE1MID0gInRlc3QueG1sIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX09VVEZJTEUgPSAidGVzdC1wcmVmaXgucHJvcGVydGllcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVkFMVUUgPSAiaXNTZXQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQURfT1VURklMRSA9ICIuIjsKKworICAgIHB1YmxpYyBFY2hvUHJvcGVydGllc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAiZWNob3Byb3BlcnRpZXMueG1sIik7CisgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoICJ0ZXN0LnByb3BlcnR5IiwgVEVTVF9WQUxVRSApOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9Mb2coKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RFY2hvVG9Mb2ciLCAidGVzdC5wcm9wZXJ0eT0iK1RFU1RfVkFMVUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvV2l0aEVtcHR5UHJlZml4VG9Mb2coKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RFY2hvV2l0aEVtcHR5UHJlZml4VG9Mb2ciLCAidGVzdC5wcm9wZXJ0eT0iK1RFU1RfVkFMVUUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCYWRGaWxlKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoICJ0ZXN0UmVhZEJhZEZpbGUiLAorICAgICAgICAgICAgInNyY2ZpbGUgaXMgYSBkaXJlY3RvcnkiLCAic3JjZmlsZSBpcyBhIGRpcmVjdG9yeSEiICk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJhZEZpbGVGYWlsKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoICJ0ZXN0UmVhZEJhZEZpbGUiLAorICAgICAgICAgICAgInNyY2ZpbGUgaXMgYSBkaXJlY3RvcnkiLCAic3JjZmlsZSBpcyBhIGRpcmVjdG9yeSEiICk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJhZEZpbGVOb0ZhaWwoKSB7CisgICAgICAgIGV4cGVjdExvZyggInRlc3RSZWFkQmFkRmlsZU5vRmFpbCIsICJzcmNmaWxlIGlzIGEgZGlyZWN0b3J5ISIgKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9CYWRGaWxlKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoICJ0ZXN0RWNob1RvQmFkRmlsZSIsCisgICAgICAgICAgICAiZGVzdGZpbGUgaXMgYSBkaXJlY3RvcnkiLCAiZGVzdGZpbGUgaXMgYSBkaXJlY3RvcnkhIiApOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdEVjaG9Ub0JhZEZpbGVGYWlsKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoICJ0ZXN0RWNob1RvQmFkRmlsZUZhaWwiLAorICAgICAgICAgICAgImRlc3RmaWxlIGlzIGEgZGlyZWN0b3J5IiwgImRlc3RmaWxlIGlzIGEgZGlyZWN0b3J5ISIgKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9CYWRGaWxlTm9GYWlsKCkgeworICAgICAgICBleHBlY3RMb2coICJ0ZXN0RWNob1RvQmFkRmlsZU5vRmFpbCIsICJkZXN0ZmlsZSBpcyBhIGRpcmVjdG9yeSEiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9Hb29kRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCAidGVzdEVjaG9Ub0dvb2RGaWxlIiApOworICAgICAgICBhc3NlcnRHb29kRmlsZSgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdEVjaG9Ub0dvb2RGaWxlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoICJ0ZXN0RWNob1RvR29vZEZpbGVYbWwiICk7CisKKyAgICAgICAgLy8gcmVhZCBpbiB0aGUgZmlsZQorICAgICAgICBGaWxlIGYgPSBjcmVhdGVSZWxhdGl2ZUZpbGUoIEdPT0RfT1VURklMRV9YTUwgKTsKKyAgICAgICAgRmlsZVJlYWRlciBmciA9IG5ldyBGaWxlUmVhZGVyKCBmICk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlciggZnIgKTsKKyAgICAgICAgICAgIFN0cmluZyByZWFkID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlICggKHJlYWQgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWQuaW5kZXhPZigiPHByb3BlcnR5IG5hbWU9XCJ0ZXN0LnByb3BlcnR5XCIgdmFsdWU9XCIiK1RFU1RfVkFMVUUrIlwiIC8+IikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGUgcHJvcGVydHkgd2Ugc2V0IC0gaXQncyBnb29kLgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCggImRpZCBub3QgZW5jb3VudGVyIHNldCBwcm9wZXJ0eSBpbiBnZW5lcmF0ZWQgZmlsZS4iICk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9Hb29kRmlsZUZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCggInRlc3RFY2hvVG9Hb29kRmlsZUZhaWwiICk7CisgICAgICAgIGFzc2VydEdvb2RGaWxlKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1RvR29vZEZpbGVOb0ZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCggInRlc3RFY2hvVG9Hb29kRmlsZU5vRmFpbCIgKTsKKyAgICAgICAgYXNzZXJ0R29vZEZpbGUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvUHJlZml4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RFY2hvUHJlZml4VmFyaW91cygidGVzdEVjaG9QcmVmaXgiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1ByZWZpeEFzUHJvcGVydHlzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEVjaG9QcmVmaXhWYXJpb3VzKCJ0ZXN0RWNob1ByZWZpeEFzUHJvcGVydHlzZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1ByZWZpeEFzTmVnYXRlZFByb3BlcnR5c2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RFY2hvUHJlZml4VmFyaW91cygidGVzdEVjaG9QcmVmaXhBc05lZ2F0ZWRQcm9wZXJ0eXNldCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvUHJlZml4QXNEb3VibHlOZWdhdGVkUHJvcGVydHlzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEVjaG9QcmVmaXhWYXJpb3VzKCJ0ZXN0RWNob1ByZWZpeEFzRG91Ymx5TmVnYXRlZFByb3BlcnR5c2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhQcmVmaXhBbmRSZWdleCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ0ZXN0V2l0aFByZWZpeEFuZFJlZ2V4IiwKKyAgICAgICAgICAgICAgICAiVGhlIHRhcmdldCBtdXN0IGZhaWwgd2l0aCBwcmVmaXggYW5kIHJlZ2V4IGF0dHJpYnV0ZXMgc2V0IiwKKyAgICAgICAgICAgICAgICAiUGxlYXNlIHNwZWNpZnkgZWl0aGVyIHByZWZpeCBvciByZWdleCwgYnV0IG5vdCBib3RoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhFbXB0eVByZWZpeEFuZFJlZ2V4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RFY2hvV2l0aEVtcHR5UHJlZml4VG9Mb2ciLCAidGVzdC5wcm9wZXJ0eT0iK1RFU1RfVkFMVUUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoUmVnZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFSZWdleHBNYXRjaGVyRmFjdG9yeS5yZWdleHBNYXRjaGVyUHJlc2VudChwcm9qZWN0KSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0ICd0ZXN0V2l0aFJlZ2V4JyBza2lwcGVkIGJlY2F1c2Ugbm8gcmVnZXhwIG1hdGNoZXIgaXMgcHJlc2VudC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0V2l0aFJlZ2V4Iik7CisgICAgICAgIGFzc2VydERlYnVnbG9nQ29udGFpbmluZygiYW50LmhvbWU9Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFY2hvUHJlZml4VmFyaW91cyhTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbG9hZFByb3BGaWxlKFBSRUZJWF9PVVRGSUxFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmVmaXggZGlkbid0IGluY2x1ZGUgJ2Euc2V0JyBwcm9wZXJ0eSIsCisgICAgICAgICAgICAidHJ1ZSIsIHByb3BzLmdldFByb3BlcnR5KCJhLnNldCIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgicHJlZml4IGZhaWxlZCB0byBmaWx0ZXIgb3V0IHByb3BlcnR5ICdiLnNldCciLAorICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoImIuc2V0IikpOworICAgIH0KKworICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIGxvYWRQcm9wRmlsZShTdHJpbmcgcmVsYXRpdmVGaWxlbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZiA9IGNyZWF0ZVJlbGF0aXZlRmlsZSggcmVsYXRpdmVGaWxlbmFtZSApOworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzPW5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIElucHV0U3RyZWFtIGluPW51bGw7CisgICAgICAgIHRyeSAgeworICAgICAgICAgICAgaW49bmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmKSk7CisgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmKGluIT1udWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsgaW4uY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9wczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRHb29kRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIGYgPSBjcmVhdGVSZWxhdGl2ZUZpbGUoIEdPT0RfT1VURklMRSApOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgIkRpZCBub3QgY3JlYXRlICIrZi5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgIGYuZXhpc3RzKCkgKTsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcz1sb2FkUHJvcEZpbGUoR09PRF9PVVRGSUxFKTsKKyAgICAgICAgcHJvcHMubGlzdChTeXN0ZW0ub3V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IHByb3BlcnR5IG5vdCBmb3VuZCAiLAorICAgICAgICAgICAgICAgICAgICAgVEVTVF9WQUxVRSwgcHJvcHMuZ2V0UHJvcGVydHkoInRlc3QucHJvcGVydHkiKSk7CisvKgorICAgICAgICAvLyByZWFkIGluIHRoZSBmaWxlCisgICAgICAgIEZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlciggZiApOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIGZyICk7CisgICAgICAgICAgICBTdHJpbmcgcmVhZCA9IG51bGw7CisgICAgICAgICAgICB3aGlsZSAoIChyZWFkID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhZC5pbmRleE9mKCJ0ZXN0LnByb3BlcnR5IiArIFRFU1RfVkFMVUUpID49IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGUgcHJvcGVydHkgd2Ugc2V0IC0gaXQncyBnb29kLgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCggImRpZCBub3QgZW5jb3VudGVyIHNldCBwcm9wZXJ0eSBpbiBnZW5lcmF0ZWQgZmlsZS4iICk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeyBmci5jbG9zZSgpOyB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIH0KKyovCisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvQWJzb2x1dGUoIFN0cmluZyBmaWxlbmFtZSApIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVJlbGF0aXZlRmlsZSggZmlsZW5hbWUgKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBGaWxlIGNyZWF0ZVJlbGF0aXZlRmlsZSggU3RyaW5nIGZpbGVuYW1lICkgeworICAgICAgICBpZiAoZmlsZW5hbWUuZXF1YWxzKCAiLiIgKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFByb2plY3REaXIoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBlbHNlCisgICAgICAgIHJldHVybiBuZXcgRmlsZSggZ2V0UHJvamVjdERpcigpLCBmaWxlbmFtZSApOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0phdmFoVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0phdmFoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYWE0MmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSmF2YWhUZXN0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBKYXZhaFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBCVUlMRF9YTUwgPSAKKyAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL2J1aWxkLnhtbCI7CisKKyAgICBwdWJsaWMgSmF2YWhUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KEJVSUxEX1hNTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlYXJEb3duIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUNvbXBpbGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInNpbXBsZS1jb21waWxlIik7CisgICAgICAgIGFzc2VydFRydWUoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJvdXRwdXQvb3JnX2V4YW1wbGVfRm9vLmgiKQorICAgICAgICAgICAgICAgICAgIC5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGVGaWxlc2V0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0LWZpbGVzZXQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIm91dHB1dC9vcmdfZXhhbXBsZV9Gb28uaCIpCisgICAgICAgICAgICAgICAgICAgLmV4aXN0cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSnNwY1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Kc3BjVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODEwYjEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSnNwY1Rlc3QuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLkphc3BlcjQxTWFuZ2xlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuSnNwTWFuZ2xlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuSnNwTmFtZU1hbmdsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLmNvbXBpbGVycy5Kc3BDb21waWxlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLmNvbXBpbGVycy5Kc3BDb21waWxlckFkYXB0ZXJGYWN0b3J5OworCisvKioKKyAqIFRlc3RzIHRoZSBKc3BjIHRhc2suCisgKgorICogQGNyZWF0ZWQgMDcgTWFyY2ggMjAwMgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIEpzcGNUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgdGhlIEZpZWxkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGJhc2VEaXI7CisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgdGhlIEZpZWxkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dERpcjsKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBGaWVsZAorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLREVGU19ESVIgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvIjsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBKc3BjVGVzdCBvYmplY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIERlc2NyaXB0aW9uIG9mIFBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBKc3BjVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBKVW5pdCBzZXR1cCBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAianNwYy54bWwiKTsKKyAgICAgICAgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCBUQVNLREVGU19ESVIpOworICAgICAgICBvdXREaXIgPSBuZXcgRmlsZShiYXNlRGlyLCAianNwL2phdmEiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB0ZWFyZG93biBtZXRob2QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZUpzcENvbXBpbGUoInRlc3RTaW1wbGUiLCAic2ltcGxlX2pzcC5qYXZhIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpcm9vdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlSnNwQ29tcGlsZSgidGVzdFVyaXJvb3QiLCAidXJpcm9vdF9qc3AuamF2YSIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFhtbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlSnNwQ29tcGlsZSgidGVzdFhtbCIsICJ4bWxfanNwLmphdmEiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHRyeSBhIGtleXdvcmQgaW4gYSBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZUpzcENvbXBpbGUoInRlc3RLZXl3b3JkIiwgImRlZmF1bHRfanNwLmphdmEiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHdoYXQgaGFwcGVucyB0byAxbnZhbGlkLWNsYXNzbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2xhc3NuYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVKc3BDb21waWxlKCJ0ZXN0SW52YWxpZENsYXNzbmFtZSIsCisgICAgICAgICAgICAgICAgIl8xbnZhbGlkXzAwMDJkY2xhc3NuYW1lX2pzcC5qYXZhIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vICAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0Tm9UbGQiLAorLy8gICAgICAgICAgICAgICAgICJKYXNwZXIgZm91bmQgYW4gZXJyb3IgaW4gYSBmaWxlIiwKKy8vICAgICAgICAgICAgICAgICAiSmF2YSByZXR1cm5lZDogOSIpOworICAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0Tm9UbGQiLAorICAgICAgICAgICAgICAgICAibm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgIkphdmEgcmV0dXJuZWQ6IDkiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RBSnNwRmlsZSgpICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE5vdEFKc3BGaWxlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogd2ViYXBwIHRlc3QgaXMgY3VycmVudGx5IGJyb2tlbiwgYmVjYXVzZSBpdCBwaWNrcyB1cAorICAgICAqIG9uIHRoZSBtaXNzaW5nX3RsZCBmaWxlLCBhbmQgYmFpbHMuCisgICAgICovCisvKgorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJhcHAoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RXZWJhcHAiKTsKKyAgICB9CisqLworICAgIC8qKgorICAgICAqIHJ1biBhIHRhcmdldCB0aGVuIHZlcmlmeSB0aGUgbmFtZWQgZmlsZSBnZXRzIGNyZWF0ZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgRGVzY3JpcHRpb24gb2YgUGFyYW1ldGVyCisgICAgICogQHBhcmFtIGphdmFmaWxlIERlc2NyaXB0aW9uIG9mIFBhcmFtZXRlcgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIHRyb3VibGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlSnNwQ29tcGlsZShTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgamF2YWZpbGUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIGFzc2VydEphdmFGaWxlQ3JlYXRlZChqYXZhZmlsZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiB2ZXJpZnkgdGhhdCBhIG5hbWVkIGZpbGUgd2FzIGNyZWF0ZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBEZXNjcmlwdGlvbiBvZiBQYXJhbWV0ZXIKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiB0cm91YmxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SmF2YUZpbGVDcmVhdGVkKFN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZmlsZSA9IGdldE91dHB1dEZpbGUoZmlsZW5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKCJmaWxlICIgKyBmaWxlbmFtZSArICIgbm90IGZvdW5kIiwgZmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoImZpbGUgIiArIGZpbGVuYW1lICsgIiBpcyBlbXB0eSIsIGZpbGUubGVuZ3RoKCkgPiAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBPdXRwdXRGaWxlIGF0dHJpYnV0ZSBvZiB0aGUgSnNwY1Rlc3Qgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VicGF0aCBEZXNjcmlwdGlvbiBvZiBQYXJhbWV0ZXIKKyAgICAgKiBAcmV0dXJuIFRoZSBPdXRwdXRGaWxlIHZhbHVlCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0T3V0cHV0RmlsZShTdHJpbmcgc3VicGF0aCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUob3V0RGlyLCBzdWJwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB2ZXJpZnkgdGhhdCB3ZSBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIG1hbmdsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmFzcGVyTmFtZU1hbmdsZXJTZWxlY3Rpb24oKSB7CisgICAgICAgIEpzcENvbXBpbGVyQWRhcHRlciBhZGFwdGVyPQorICAgICAgICAgICAgICAgIEpzcENvbXBpbGVyQWRhcHRlckZhY3RvcnkuZ2V0Q29tcGlsZXIoImphc3BlciIsIG51bGwsbnVsbCk7CisgICAgICAgIEpzcE1hbmdsZXIgbWFuZ2xlcj1hZGFwdGVyLmNyZWF0ZU1hbmdsZXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYW5nbGVyIGluc3RhbmNlb2YgSnNwTmFtZU1hbmdsZXIpOworICAgICAgICBhZGFwdGVyPSBKc3BDb21waWxlckFkYXB0ZXJGYWN0b3J5LmdldENvbXBpbGVyKCJqYXNwZXI0MSIsIG51bGwsIG51bGwpOworICAgICAgICBtYW5nbGVyID0gYWRhcHRlci5jcmVhdGVNYW5nbGVyKCk7CisgICAgICAgIGFzc2VydFRydWUobWFuZ2xlciBpbnN0YW5jZW9mIEphc3BlcjQxTWFuZ2xlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEphc3BlcjQxKCkgeworICAgICAgICBKc3BNYW5nbGVyIG1hbmdsZXIgPSBuZXcgSmFzcGVyNDFNYW5nbGVyKCk7CisgICAgICAgIC8vamF2YSBrZXl3b3JkcyBhcmUgbm90IHNwZWNpYWwKKyAgICAgICAgYXNzZXJ0TWFwcGVkKG1hbmdsZXIsICJmb3IuanNwIiwgImZvcl9qc3AiKTsKKyAgICAgICAgLy91bmRlcnNjb3JlcyBnbyBpbiBmcm9udCBvZiBpbnZhbGlkIHN0YXJ0IGNoYXJzCisgICAgICAgIGFzc2VydE1hcHBlZChtYW5nbGVyLCAiMC5qc3AiLCAiXzBfanNwIik7CisgICAgICAgIC8vdW5kZXJzY29yZXMgYXQgdGhlIGZyb250IGdldCBhbiB1bmRlcnNjb3JlIHRvbworICAgICAgICBhc3NlcnRNYXBwZWQobWFuZ2xlciwgIl8uanNwIiwgIl9fX2pzcCIpOworICAgICAgICAvL25vbiBqYXZhIGNoYXIgYXQgc3RhcnQgPT4gdW5kZXJzY29yZSB0aGVuIHRoZSB0aGUgX2hleCB2YWx1ZQorICAgICAgICBhc3NlcnRNYXBwZWQobWFuZ2xlciwgIi0uanNwIiwgIl9fMDAwMmRfanNwIik7CisgICAgICAgIC8vYW5kIHBhdGhzIGFyZSBzdHJpcHBlZAorICAgICAgICBjaGFyIHMgPSBGaWxlLnNlcGFyYXRvckNoYXI7CisgICAgICAgIGFzc2VydE1hcHBlZChtYW5nbGVyLCAiIiArIHMgKyBzICsgInNvbWV3aGVyZSIgKyBzICsgImZpbGUiICsgcyArICJpbmRleC5qc3AiLCAiaW5kZXhfanNwIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogYXNzZXJ0IG91ciBtYXBwaW5nIHJ1bGVzCisgICAgICogQHBhcmFtIG1hbmdsZXIKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0TWFwcGVkKEpzcE1hbmdsZXIgbWFuZ2xlciwgU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIFN0cmluZyBtYXBwZWRuYW1lID0gbWFuZ2xlci5tYXBKc3BUb0phdmFOYW1lKG5ldyBGaWxlKGZpbGVuYW1lKSk7CisgICAgICAgIGFzc2VydFRydWUoZmlsZW5hbWUrIiBzaG91bGQgaGF2ZSBtYXBwZWQgdG8gIitjbGFzc25hbWUKKyAgICAgICAgICAgICAgICAgICAgKyIgYnV0IGluc3RlYWQgbWFwcGVkIHRvICIrbWFwcGVkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lLmVxdWFscyhtYXBwZWRuYW1lKSk7CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05hdGl2ZTJBc2NpaVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OYXRpdmUyQXNjaWlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4YzgyYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OYXRpdmUyQXNjaWlUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBOYXRpdmUyQXNjaWlUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlVJTERfWE1MID0gCisgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvYnVpbGQueG1sIjsKKworICAgIHB1YmxpYyBOYXRpdmUyQXNjaWlUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KEJVSUxEX1hNTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlYXJEb3duIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzbzg4NTlfMSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdElzbzg4NTktMSIpOworICAgICAgICBGaWxlIGluID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJleHBlY3RlZC9pc284ODU5LTEudGVzdCIpOworICAgICAgICBGaWxlIG91dCA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgib3V0cHV0L2lzbzg4NTktMS50ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLmNvbnRlbnRFcXVhbHMoaW4sIG91dCwgdHJ1ZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Qcm9wZXJ0eUZpbGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUHJvcGVydHlGaWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NWQ1MmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUHJvcGVydHlGaWxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogIEpVbml0IHRlc3RjYXNlIHRoYXQgZXhjZXJjaXNlcyB0aGUgb3B0aW9uYWwgUHJvcGVydHlGaWxlIHRhc2sgaW4gYW50LgorICogICh0aGlzIGlzIHJlYWxseSBtb3JlIG9mIGEgZnVuY3Rpb25hbCB0ZXN0IHNvIGZhci4uLCBidXQgaXQncyBlbm91Z2ggdG8gbGV0CisgKiAgIG1lIHN0YXJ0IHJlZmFjdG9yaW5nLi4uKQorICoKKyAqQGNyZWF0ZWQgICAgT2N0b2JlciAyLCAyMDAxCisgKi8KKworcHVibGljIGNsYXNzIFByb3BlcnR5RmlsZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBQcm9wZXJ0eUZpbGVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIFRoZSBKVW5pdCBzZXR1cCBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkZXN0cm95VGVtcEZpbGVzKCk7CisgICAgICAgIGluaXRUZXN0UHJvcEZpbGUoKTsKKyAgICAgICAgaW5pdEJ1aWxkUHJvcEZpbGUoKTsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChwcm9qZWN0RmlsZVBhdGgpOworICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KHZhbHVlRG9lc05vdEdldE92ZXJ3cml0dGVuUHJvcGVydHlGaWxlS2V5LHZhbHVlRG9lc05vdEdldE92ZXJ3cml0dGVuUHJvcGVydHlGaWxlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBUaGUgSlVuaXQgdGVhckRvd24gbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGRlc3Ryb3lUZW1wRmlsZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRXhpc3RpbmdGaWxlKCkgeworICAgICAgICBQcm9wZXJ0eUZpbGUgcHJvcHMgPSBuZXcgUHJvcGVydHlGaWxlKCk7CisgICAgICAgIHByb3BzLnNldFByb2plY3QoIGdldFByb2plY3QoKSApOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgidGhpcy1maWxlLWRvZXMtbm90LWV4aXN0LnByb3BlcnRpZXMiKTsKKyAgICAgICAgcHJvcHMuc2V0RmlsZShmaWxlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlByb3BlcnRpZXMgZmlsZSBleGlzdHMgYmVmb3JlIHRlc3QuIiwgZmlsZS5leGlzdHMoKSk7CisgICAgICAgIHByb3BzLmV4ZWN1dGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUHJvcGVydGllcyBmaWxlIGRvZXMgbm90IGV4aXN0IGFmdGVyIHRlc3QuIiwgZmlsZS5leGlzdHMoKSk7CisgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIEEgdW5pdCB0ZXN0IGZvciBKVW5pdC0gRXhjZXJjaXNlcyB0aGUgcHJvcGVydHlmaWxlIHRhc2tzIGFiaWxpdHkgdG8KKyAgICAgKiAgdXBkYXRlIHByb3BlcnRpZXMgdGhhdCBhcmUgYWxyZWFkeSBkZWZpbmVkLQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVzRXhpc3RpbmdQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByb3BlcnRpZXMgYmVmb3JlVXBkYXRlID0gZ2V0VGVzdFByb3BlcnRpZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZOQU1FLCBiZWZvcmVVcGRhdGUuZ2V0UHJvcGVydHkoRk5BTUVfS0VZKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMTkFNRSwgYmVmb3JlVXBkYXRlLmdldFByb3BlcnR5KExOQU1FX0tFWSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRU1BSUwsIGJlZm9yZVVwZGF0ZS5nZXRQcm9wZXJ0eShFTUFJTF9LRVkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGJlZm9yZVVwZGF0ZS5nZXRQcm9wZXJ0eShQSE9ORV9LRVkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGJlZm9yZVVwZGF0ZS5nZXRQcm9wZXJ0eShBR0VfS0VZKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBiZWZvcmVVcGRhdGUuZ2V0UHJvcGVydHkoREFURV9LRVkpKTsKKworICAgICAgICAvLyBhc2sgYW50IHRvIHVwZGF0ZSB0aGUgcHJvcGVydGllcy4uLgorICAgICAgICBleGVjdXRlVGFyZ2V0KCJ1cGRhdGUtZXhpc3RpbmctcHJvcGVydGllcyIpOworCisgICAgICAgIFByb3BlcnRpZXMgYWZ0ZXJVcGRhdGUgPSBnZXRUZXN0UHJvcGVydGllcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoTkVXX0ZOQU1FLCBhZnRlclVwZGF0ZS5nZXRQcm9wZXJ0eShGTkFNRV9LRVkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5FV19MTkFNRSwgYWZ0ZXJVcGRhdGUuZ2V0UHJvcGVydHkoTE5BTUVfS0VZKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhORVdfRU1BSUwsIGFmdGVyVXBkYXRlLmdldFByb3BlcnR5KEVNQUlMX0tFWSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTkVXX1BIT05FLCBhZnRlclVwZGF0ZS5nZXRQcm9wZXJ0eShQSE9ORV9LRVkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5FV19BR0UsIGFmdGVyVXBkYXRlLmdldFByb3BlcnR5KEFHRV9LRVkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5FV19EQVRFLCBhZnRlclVwZGF0ZS5nZXRQcm9wZXJ0eShEQVRFX0tFWSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVyY2lzZURlZmF1bHRBbmRJbmNyZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZXhlcmNpc2UiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIixwcm9qZWN0LmdldFByb3BlcnR5KCJpbnQud2l0aC5kZWZhdWx0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLHByb2plY3QuZ2V0UHJvcGVydHkoImludC53aXRob3V0LmRlZmF1bHQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLS0+Iixwcm9qZWN0LmdldFByb3BlcnR5KCJzdHJpbmcud2l0aC5kZWZhdWx0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi4iLHByb2plY3QuZ2V0UHJvcGVydHkoInN0cmluZy53aXRob3V0LmRlZmF1bHQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjAwMi8wMS8yMSAxMjoxOCIsIHByb2plY3QuZ2V0UHJvcGVydHkoImV0aGFucy5iaXJ0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMDAzLzAxLzIxIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgiZmlyc3QuYmlydGhkYXkiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDEyNCIsIHByb2plY3QuZ2V0UHJvcGVydHkoIm9sZGVyVGhhbkFXZWVrIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM3IiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgiZXhpc3RpbmcucHJvcCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI2Iixwcm9qZWN0LmdldFByb3BlcnR5KCJpbnQud2l0aG91dC52YWx1ZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVEb2VzTm90R2V0T3ZlcndyaXR0ZW4oKSB7CisgICAgICAgIC8vIHRoaXMgdGVzdCBzaG93cyB0aGF0IHRoZSBidWcgcmVwb3J0IDIxNTA1IGlzIGZpeGVkCisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImJ1Z0RlbW8xIik7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImJ1Z0RlbW8yIik7CisgICAgICAgIGFzc2VydEVxdWFscygiNSIsIHByb2plY3QuZ2V0UHJvcGVydHkoImZvbyIpKTsKKyAgICB9CisvKgorICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydHlGaWxlIHBmID0gbmV3IFByb3BlcnR5RmlsZSgpOworICAgICAgICBwZi5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBwZi5zZXRGaWxlKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCB0ZXN0UHJvcHNGaWxlUGF0aCkpOworICAgICAgICBQcm9wZXJ0eUZpbGUuRW50cnkgZW50cnkgPSBwZi5jcmVhdGVFbnRyeSgpOworCisgICAgICAgIGVudHJ5LnNldEtleSgiZGF0ZSIpOworICAgICAgICBlbnRyeS5zZXRWYWx1ZSgiMTIzIik7CisgICAgICAgIFByb3BlcnR5RmlsZS5FbnRyeS5UeXBlIHR5cGUgPSBuZXcgUHJvcGVydHlGaWxlLkVudHJ5LlR5cGUoKTsKKyAgICAgICAgdHlwZS5zZXRWYWx1ZSgiZGF0ZSIpOworICAgICAgICBlbnRyeS5zZXRUeXBlKHR5cGUpOworCisgICAgICAgIGVudHJ5LnNldFBhdHRlcm4oInl5eXkvTU0vZGQiKTsKKworICAgICAgICBQcm9wZXJ0eUZpbGUuRW50cnkuT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBQcm9wZXJ0eUZpbGUuRW50cnkuT3BlcmF0aW9uKCk7CisgICAgICAgIG9wZXJhdGlvbi5zZXRWYWx1ZSgiKyIpOworICAgICAgICBwZi5leGVjdXRlKCk7CisKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGdldFRlc3RQcm9wZXJ0aWVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygieWVlaGF3IiwgcHJvcHMuZ2V0UHJvcGVydHkoImRhdGUiKSk7CisgICAgfQorKi8KKworICAgIHByaXZhdGUgUHJvcGVydGllcyBnZXRUZXN0UHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0aWVzIHRlc3RQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBwcm9wc0ZpbGUgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCB0ZXN0UHJvcHNGaWxlUGF0aCkpOworICAgICAgICB0ZXN0UHJvcHMubG9hZChwcm9wc0ZpbGUpOworICAgICAgICBwcm9wc0ZpbGUuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHRlc3RQcm9wczsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBpbml0VGVzdFByb3BGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByb3BlcnRpZXMgdGVzdFByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgdGVzdFByb3BzLnB1dChGTkFNRV9LRVksIEZOQU1FKTsKKyAgICAgICAgdGVzdFByb3BzLnB1dChMTkFNRV9LRVksIExOQU1FKTsKKyAgICAgICAgdGVzdFByb3BzLnB1dChFTUFJTF9LRVksIEVNQUlMKTsKKyAgICAgICAgdGVzdFByb3BzLnB1dCgiZXhpc3RpbmcucHJvcCIsICIzNyIpOworCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIHRlc3RQcm9wc0ZpbGVQYXRoKSk7CisgICAgICAgIHRlc3RQcm9wcy5zdG9yZShmb3MsICJkZWZhdWx0cyIpOworICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBpbml0QnVpbGRQcm9wRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0aWVzIGJ1aWxkUHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBidWlsZFByb3BzLnB1dCh0ZXN0UHJvcGVydHlGaWxlS2V5LCB0ZXN0UHJvcGVydHlGaWxlKTsKKyAgICAgICAgYnVpbGRQcm9wcy5wdXQoRk5BTUVfS0VZLCBORVdfRk5BTUUpOworICAgICAgICBidWlsZFByb3BzLnB1dChMTkFNRV9LRVksIE5FV19MTkFNRSk7CisgICAgICAgIGJ1aWxkUHJvcHMucHV0KEVNQUlMX0tFWSwgTkVXX0VNQUlMKTsKKyAgICAgICAgYnVpbGRQcm9wcy5wdXQoUEhPTkVfS0VZLCBORVdfUEhPTkUpOworICAgICAgICBidWlsZFByb3BzLnB1dChBR0VfS0VZLCBORVdfQUdFKTsKKyAgICAgICAgYnVpbGRQcm9wcy5wdXQoREFURV9LRVksIE5FV19EQVRFKTsKKworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCBidWlsZFByb3BzRmlsZVBhdGgpKTsKKyAgICAgICAgYnVpbGRQcm9wcy5zdG9yZShmb3MsIG51bGwpOworICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBkZXN0cm95VGVtcEZpbGVzKCkgeworICAgICAgICBGaWxlIHRlbXBGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIHRlc3RQcm9wc0ZpbGVQYXRoKTsKKyAgICAgICAgdGVtcEZpbGUuZGVsZXRlKCk7CisgICAgICAgIHRlbXBGaWxlID0gbnVsbDsKKworICAgICAgICB0ZW1wRmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCBidWlsZFByb3BzRmlsZVBhdGgpOworICAgICAgICB0ZW1wRmlsZS5kZWxldGUoKTsKKyAgICAgICAgdGVtcEZpbGUgPSBudWxsOworCisgICAgICAgIHRlbXBGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIHZhbHVlRG9lc05vdEdldE92ZXJ3cml0dGVuUHJvcHNGaWxlUGF0aCk7CisgICAgICAgIHRlbXBGaWxlLmRlbGV0ZSgpOworICAgICAgICB0ZW1wRmlsZSA9IG51bGw7CisgICAgfQorCisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZworICAgICAgICBwcm9qZWN0RmlsZVBhdGggICAgID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Byb3BlcnR5ZmlsZS54bWwiLAorCisgICAgICAgIHRlc3RQcm9wZXJ0eUZpbGUgICAgPSAicHJvcGVydHlmaWxlLnRlc3QucHJvcGVydGllcyIsCisgICAgICAgIHRlc3RQcm9wZXJ0eUZpbGVLZXkgPSAidGVzdC5wcm9wZXJ0eWZpbGUiLAorICAgICAgICB0ZXN0UHJvcHNGaWxlUGF0aCAgID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsLyIgKyB0ZXN0UHJvcGVydHlGaWxlLAorCisgICAgICAgIHZhbHVlRG9lc05vdEdldE92ZXJ3cml0dGVuUHJvcGVydHlGaWxlICAgID0gIm92ZXJ3cml0ZS50ZXN0LnByb3BlcnRpZXMiLAorICAgICAgICB2YWx1ZURvZXNOb3RHZXRPdmVyd3JpdHRlblByb3BlcnR5RmlsZUtleSA9ICJvdmVyd3JpdGUudGVzdC5wcm9wZXJ0eWZpbGUiLAorICAgICAgICB2YWx1ZURvZXNOb3RHZXRPdmVyd3JpdHRlblByb3BzRmlsZVBhdGggICA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC8iICsgdmFsdWVEb2VzTm90R2V0T3ZlcndyaXR0ZW5Qcm9wZXJ0eUZpbGUsCisKKyAgICAgICAgYnVpbGRQcm9wc0ZpbGVQYXRoICA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wcm9wZXJ0eWZpbGUuYnVpbGQucHJvcGVydGllcyIsCisKKyAgICAgICAgRk5BTUUgICAgID0gIkJydWNlIiwKKyAgICAgICAgTkVXX0ZOQU1FID0gIkNsYXJrIiwKKyAgICAgICAgRk5BTUVfS0VZID0gImZpcnN0bmFtZSIsCisKKyAgICAgICAgTE5BTUUgICAgID0gIkJhbm5lciIsCisgICAgICAgIE5FV19MTkFNRSA9ICJLZW50IiwKKyAgICAgICAgTE5BTUVfS0VZID0gImxhc3RuYW1lIiwKKworICAgICAgICBFTUFJTCAgICAgPSAiaW5jcmVkaWJsZUBodWxrLmNvbSIsCisgICAgICAgIE5FV19FTUFJTCA9ICJrY0BzdXBlcm1hbi5jb20iLAorICAgICAgICBFTUFJTF9LRVkgPSAiZW1haWwiLAorCisgICAgICAgIE5FV19QSE9ORSA9ICIoNTIwKSA1NTUtMTIxMiIsCisgICAgICAgIFBIT05FX0tFWSA9ICJwaG9uZSIsCisKKyAgICAgICAgTkVXX0FHRSA9ICIzMCIsCisgICAgICAgIEFHRV9LRVkgPSAiYWdlIiwKKworICAgICAgICBORVdfREFURSA9ICIyMDAxLzAxLzAxIDEyOjQ1IiwKKyAgICAgICAgREFURV9LRVkgPSAiZGF0ZSI7Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUHZjc1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9QdmNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzFkNzAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUHZjc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIFB2Y3NUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgUHZjc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3B2Y3MueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0MSIsICJSZXF1aXJlZCBhcmd1bWVudCByZXBvc2l0b3J5IG5vdCBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb24oInRlc3Q2IiwgIkZhaWxlZCBleGVjdXRpbmc6IC9uZXZlci9oZWFyZC9vZi9hL2RpcmVjdG9yeS9zdHJ1Y3R1cmUvbGlrZS90aGlzL3BjbGkgbHZmIC16IC1hdyAtcHIvL2N0NHNlcnYyL3B2Y3MvbW9uaXRvciAvLiBFeGNlcHRpb246IC9uZXZlci9oZWFyZC9vZi9hL2RpcmVjdG9yeS9zdHJ1Y3R1cmUvbGlrZS90aGlzL3BjbGk6IG5vdCBmb3VuZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZXBsYWNlUmVnRXhwVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JlcGxhY2VSZWdFeHBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxOGQwNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZXBsYWNlUmVnRXhwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEpVbml0IFRlc3RjYXNlIGZvciB0aGUgb3B0aW9uYWwgcmVwbGFjZXJlZ2V4cCB0YXNrLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlcGxhY2VSZWdFeHBUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUEFUSCA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgCisgICAgcHVibGljIFJlcGxhY2VSZWdFeHBUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFBST0pFQ1RfUEFUSCArICIvcmVwbGFjZXJlZ2V4cC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydGllcyBvcmlnaW5hbCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBwcm9wc0ZpbGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvcHNGaWxlID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgUFJPSkVDVF9QQVRIICsgIi9yZXBsYWNlcmVnZXhwLnByb3BlcnRpZXMiKSk7CisgICAgICAgICAgICBvcmlnaW5hbC5sb2FkKHByb3BzRmlsZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocHJvcHNGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcm9wc0ZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBwcm9wc0ZpbGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZWYiLCBvcmlnaW5hbC5nZXQoIk9sZEFiYyIpKTsKKworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UmVwbGFjZSIpOworCisgICAgICAgIFByb3BlcnRpZXMgYWZ0ZXIgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvcHNGaWxlID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgUFJPSkVDVF9QQVRIICsgIi90ZXN0LnByb3BlcnRpZXMiKSk7CisgICAgICAgICAgICBhZnRlci5sb2FkKHByb3BzRmlsZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocHJvcHNGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcm9wc0ZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBwcm9wc0ZpbGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0TnVsbChhZnRlci5nZXQoIk9sZEFiYyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBYmNEZWYiLCBhZnRlci5nZXQoIk5ld1Byb3AiKSk7CisgICAgfQorICAgIC8vIGluc3BpcmVkIGJ5IGJ1ZyAyMjU0MQorICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3RvcnlEYXRlRG9lc05vdENoYW5nZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidG91Y2hEaXJlY3RvcnkiKTsKKyAgICAgICAgRmlsZSBteUZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgUFJPSkVDVF9QQVRIICsgIi8iICsgZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0bXByZWdleHAiKSk7CisgICAgICAgIGxvbmcgdGltZVN0YW1wQmVmb3JlID0gbXlGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RGlyZWN0b3J5RGF0ZURvZXNOb3RDaGFuZ2UiKTsKKyAgICAgICAgbG9uZyB0aW1lU3RhbXBBZnRlciA9IG15RmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXJlY3RvcnkgZGF0ZSBzaG91bGQgbm90IGNoYW5nZSIsCisgICAgICAgICAgICB0aW1lU3RhbXBCZWZvcmUsIHRpbWVTdGFtcEFmdGVyKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdERvbnRBZGROZXdsaW5lMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3REb250QWRkTmV3bGluZTEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZXMgbWF0Y2giLAorICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMKKyAgICAgICAgICAgICAgICAgICAuY29udGVudEVxdWFscyhuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgUFJPSkVDVF9QQVRIICsgIi90ZXN0LnByb3BlcnRpZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgUFJPSkVDVF9QQVRIICsgIi9yZXBsYWNlcmVnZXhwMi5yZXN1bHQucHJvcGVydGllcyIpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvbnRBZGROZXdsaW5lMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3REb250QWRkTmV3bGluZTIiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZXMgbWF0Y2giLAorICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMKKyAgICAgICAgICAgICAgICAgICAuY29udGVudEVxdWFscyhuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgUFJPSkVDVF9QQVRIICsgIi90ZXN0LnByb3BlcnRpZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgUFJPSkVDVF9QQVRIICsgIi9yZXBsYWNlcmVnZXhwMi5yZXN1bHQucHJvcGVydGllcyIpKSk7CisgICAgfQorCit9Ly8gUmVwbGFjZVJlZ0V4cFRlc3QKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SaGlub1JlZmVyZW5jZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SaGlub1JlZmVyZW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGFlNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JoaW5vUmVmZXJlbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIFRlc3RzIHVzaW5nIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UuCisgKgorICogQHNpbmNlIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIFJoaW5vUmVmZXJlbmNlVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFJoaW5vUmVmZXJlbmNlVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSlVuaXQgc2V0dXAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoCisgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0X3JlZmVyZW5jZS54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyaXB0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJzY3JpcHQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmhpbm9TY3JpcHRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmhpbm9TY3JpcHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmM2E0OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SaGlub1NjcmlwdFRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBUZXN0cyB0aGUgZXhhbXBsZXMgb2YgdGhlICZsdDtzY3JpcHQmZ3Q7IHRhc2sgZG9jcy4KKyAqCisgKiBAc2luY2UgQW50IDEuNS4yCisgKi8KK3B1YmxpYyBjbGFzcyBSaGlub1NjcmlwdFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBSaGlub1NjcmlwdFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4YW1wbGUxKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJleGFtcGxlMSIpOworICAgICAgICBpbnQgaW5kZXggPSBnZXRMb2coKS5pbmRleE9mKCIxIik7CisgICAgICAgIGFzc2VydFRydWUoaW5kZXggPiAtMSk7CisgICAgICAgIGluZGV4ID0gZ2V0TG9nKCkuaW5kZXhPZigiNCIsIGluZGV4KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbmRleCA+IC0xKTsKKyAgICAgICAgaW5kZXggPSBnZXRMb2coKS5pbmRleE9mKCI5IiwgaW5kZXgpOworICAgICAgICBhc3NlcnRUcnVlKGluZGV4ID4gLTEpOworICAgICAgICBpbmRleCA9IGdldExvZygpLmluZGV4T2YoIjE2IiwgaW5kZXgpOworICAgICAgICBhc3NlcnRUcnVlKGluZGV4ID4gLTEpOworICAgICAgICBpbmRleCA9IGdldExvZygpLmluZGV4T2YoIjI1IiwgaW5kZXgpOworICAgICAgICBhc3NlcnRUcnVlKGluZGV4ID4gLTEpOworICAgICAgICBpbmRleCA9IGdldExvZygpLmluZGV4T2YoIjM2IiwgaW5kZXgpOworICAgICAgICBhc3NlcnRUcnVlKGluZGV4ID4gLTEpOworICAgICAgICBpbmRleCA9IGdldExvZygpLmluZGV4T2YoIjQ5IiwgaW5kZXgpOworICAgICAgICBhc3NlcnRUcnVlKGluZGV4ID4gLTEpOworICAgICAgICBpbmRleCA9IGdldExvZygpLmluZGV4T2YoIjY0IiwgaW5kZXgpOworICAgICAgICBhc3NlcnRUcnVlKGluZGV4ID4gLTEpOworICAgICAgICBpbmRleCA9IGdldExvZygpLmluZGV4T2YoIjgxIiwgaW5kZXgpOworICAgICAgICBhc3NlcnRUcnVlKGluZGV4ID4gLTEpOworICAgICAgICBpbmRleCA9IGdldExvZygpLmluZGV4T2YoIjEwMCIsIGluZGV4KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbmRleCA+IC0xKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9ScG1UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUnBtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Y2Y5NTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUnBtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVTdHJlYW1IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFJwbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkVGhyb3dFeGNlcHRpb25XaGVuUnBtRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUnBtIHJwbSA9IG5ldyBNeVJwbSgpOworICAgICAgICBycG0uc2V0UHJvamVjdChuZXcgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCgpKTsKKyAgICAgICAgcnBtLnNldEZhaWxPbkVycm9yKHRydWUpOworICAgICAgICAvLyBleGVjdXRlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBycG0uZXhlY3V0ZSgpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGEgYnVpbGQgZXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZigiJyBmYWlsZWQgd2l0aCBleGl0IGNvZGUgMiIpICE9IC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGROb3RUaHJvd0V4Y2VwdGlvbldoZW5ScG1GYWlscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBScG0gcnBtID0gbmV3IE15UnBtKCk7CisgICAgICAgIHJwbS5leGVjdXRlKCk7CisgICAgfQorCisgICAgLy8gb3ZlcnJpZGUgc29tZSBvZiB0aGUgY29kZSBzbyB3ZSBjYW4gdGVzdCB0aGUgaGFuZGxpbmcgb2YgdGhlCisgICAgLy8gcmV0dXJuIGNvZGUgb25seS4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UnBtIGV4dGVuZHMgUnBtIHsKKyAgICAgICAgcHJvdGVjdGVkIEV4ZWN1dGUgZ2V0RXhlY3V0ZShDb21tYW5kbGluZSB0b0V4ZWN1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgc3RyZWFtaGFuZGxlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGVjdXRlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGV4ZWN1dGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIGlzICE9IDAgYW5kIGV2ZW4sIHNvIGl0IGlzIGNvbnNpZGVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgb24gYW55IHBsYXRmb3JtIGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IEV4ZWN1dGUjaXNGYWlsdXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2csIGludCBtc2dMZXZlbCkgeworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NoZW1hVmFsaWRhdGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NoZW1hVmFsaWRhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5M2UyZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY2hlbWFWYWxpZGF0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBUZXN0IHNjaGVtYSB2YWxpZGF0aW9uCisgKi8KKworcHVibGljIGNsYXNzIFNjaGVtYVZhbGlkYXRlVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgLyoqCisgICAgICogd2hlcmUgdGFza3MgcnVuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBU0tERUZTX0RJUiA9CisgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvIjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0ZXN0bmFtZQorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWFWYWxpZGF0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJzY2hlbWF2YWxpZGF0ZS54bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHdpdGggbm8gbmFtZXNwYWNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5vTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3ROb05hbWVzcGFjZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkZCBuYW1lc3BhY2UgYXdhcmVuZXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROU01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE5TTWFwcGluZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0VtcHR5U2NoZW1hTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdE5vRW1wdHlTY2hlbWFOYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICJlbXB0eSBuYW1lc3BhY2UgVVJJIixTY2hlbWFWYWxpZGF0ZS5TY2hlbWFMb2NhdGlvbi5FUlJPUl9OT19VUkkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0VtcHR5U2NoZW1hTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0Tm9FbXB0eVNjaGVtYUxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAiZW1wdHkgc2NoZW1hIGxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICBTY2hlbWFWYWxpZGF0ZS5TY2hlbWFMb2NhdGlvbi5FUlJPUl9OT19MT0NBVElPTik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3ROb0ZpbGUiLAorICAgICAgICAgICAgICAgICJubyBmaWxlIGF0IGZpbGUgYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICBTY2hlbWFWYWxpZGF0ZS5TY2hlbWFMb2NhdGlvbi5FUlJPUl9OT19GSUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Eb3VibGVTY2hlbWFMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3ROb0RvdWJsZVNjaGVtYUxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAidHdvIGxvY2F0aW9ucyBmb3Igc2NoZW1hcyIsCisgICAgICAgICAgICAgICAgU2NoZW1hVmFsaWRhdGUuU2NoZW1hTG9jYXRpb24uRVJST1JfVFdPX0xPQ0FUSU9OUyk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0R1cGxpY2F0ZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3ROb0R1cGxpY2F0ZVNjaGVtYSIsCisgICAgICAgICAgICAgICAgImR1cGxpY2F0ZSBzY2hlbWFzIHdpdGggZGlmZmVyZW50IHZhbHVlcyIsCisgICAgICAgICAgICAgICAgU2NoZW1hVmFsaWRhdGUuRVJST1JfRFVQTElDQVRFX1NDSEVNQSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc1NjaGVtYXNPSygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RXF1YWxzU2NoZW1hc09LIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVzZXQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVHJhWExpYWlzb25UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVHJhWExpYWlzb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0MjdhYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvblRlc3QuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRMaWFpc29uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRMb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KQVhQVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CisKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworLyoqCisgKiBUcmFYIFhTTFRMaWFpc29uIHRlc3RjYXNlCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFYTGlhaXNvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFhTTFRMaWFpc29uVGVzdAorICAgIGltcGxlbWVudHMgWFNMVExvZ2dlciB7CisKKyAgICBwdWJsaWMgVHJhWExpYWlzb25UZXN0KFN0cmluZyBuYW1lKXsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCJ4YWxhbjItcmVkaXJlY3Qtb3V0LnRtcCIpOworICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBYU0xUTGlhaXNvbiBjcmVhdGVMaWFpc29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRyYVhMaWFpc29uIGwgPSBuZXcgVHJhWExpYWlzb24oKTsKKyAgICAgICAgbC5zZXRMb2dnZXIodGhpcyk7CisgICAgICAgIHJldHVybiBsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RYYWxhbjJSZWRpcmVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIHhzbCA9IGdldEZpbGUoIi90YXNrZGVmcy9vcHRpb25hbC94YWxhbi1yZWRpcmVjdC1pbi54c2wiKTsKKyAgICAgICAgbGlhaXNvbi5zZXRTdHlsZXNoZWV0KHhzbCk7CisgICAgICAgIEZpbGUgb3V0ID0gbmV3IEZpbGUoInhhbGFuMi1yZWRpcmVjdC1vdXQtZHVtbXkudG1wIik7CisgICAgICAgIEZpbGUgaW4gPSBnZXRGaWxlKCIvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueHNsIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaWFpc29uLmFkZFBhcmFtKCJ4YWxhbi12ZXJzaW9uIiwgIjIiKTsKKyAgICAgICAgICAgIGxpYWlzb24udHJhbnNmb3JtKGluLCBvdXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgb3V0LmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgeHNsID0gZ2V0RmlsZSgiL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluLnhzbCIpOworICAgICAgICBsaWFpc29uLnNldFN0eWxlc2hlZXQoeHNsKTsKKyAgICAgICAgbGlhaXNvbi5hZGRQYXJhbSgicGFyYW0iLCAidmFsdWUiKTsKKyAgICAgICAgRmlsZSBpbiA9IGdldEZpbGUoIi90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54bWwiKTsKKyAgICAgICAgLy8gdGVzdCBmb3IgMTAgY29uc2VjdXRpdmVzIHRyYW5zZm9ybQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspeworICAgICAgICAgICAgRmlsZSBvdXQgPSBuZXcgRmlsZSgieHNsdGxpYWlzb24iICsgaSArICIudG1wIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxpYWlzb24udHJhbnNmb3JtKGluLCBvdXQpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmFpbGVkIGluIHRyYW5zZm9ybSAiICsgaSwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG91dC5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1JZCgpeworICAgICAgICBGaWxlIGZpbGUgPSBudWxsOworICAgICAgICBpZiAoIEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnXFwnICl7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoImQ6XFxqZGsiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZSgiL3VzZXIvbG9jYWwvYmluIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHN5c3RlbWlkID0gSkFYUFV0aWxzLmdldFN5c3RlbUlkKGZpbGUpOworICAgICAgICBhc3NlcnRUcnVlKCJTeXN0ZW1JRHMgc2hvdWxkIHN0YXJ0IGJ5IGZpbGU6LyIsIHN5c3RlbWlkLnN0YXJ0c1dpdGgoImZpbGU6LyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3lzdGVtSURzIHNob3VsZCBub3Qgc3RhcnQgd2l0aCBmaWxlOi8vLy8iLCAhc3lzdGVtaWQuc3RhcnRzV2l0aCgiZmlsZTovLy8vIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIkxpYWlzb24gc2VudCBtZXNzYWdlOiAiK21lc3NhZ2UpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1dzZGxUb0RvdG5ldFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Xc2RsVG9Eb3RuZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzZDRlYQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Xc2RsVG9Eb3RuZXRUZXN0LmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5Xc2RsVG9Eb3RuZXQ7CisKKy8qKgorICogVGVzdHMgdGhlIFdzZGxUb0RvdG5ldCB0YXNrLgorICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBXc2RsVG9Eb3RuZXRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBkaXIgZm9yIHRhc2tkZWZzCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBU0tERUZTX0RJUiA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC8iOworCisgICAgLyoqCisgICAgICogbWVzc2FnZSBmcm9tIGV4ZWMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GQUlMRUQgPSAiV1NETCByZXR1cm5lZDoiOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGVzdG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgV3NkbFRvRG90bmV0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBKVW5pdCBzZXR1cCBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAiV3NkbFRvRG90bmV0LnhtbCIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRlYXJkb3duIG1ldGhvZCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVhcmRvd24iKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5vUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdE5vUGFyYW1zIiwKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgV3NkbFRvRG90bmV0LkVSUk9SX05PX0RFU1RfRklMRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5vU3JjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdE5vU3JjIiwKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgV3NkbFRvRG90bmV0LlNjaGVtYS5FUlJPUl9OT05FX0RFQ0xBUkVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVzdElzRGlyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdERlc3RJc0RpciIsCisgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgIFdzZGxUb0RvdG5ldC5FUlJPUl9ERVNUX0ZJTEVfSVNfRElSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm90aFNyYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RCb3RoU3JjIiwKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgV3NkbFRvRG90bmV0LlNjaGVtYS5FUlJPUl9CT1RIX0RFQ0xBUkVEKTsKKyAgICB9CisgICAgIC8qKgorICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTcmNJc0RpcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RTcmNJc0RpciIsCisgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgIFdzZGxUb0RvdG5ldC5TY2hlbWEuRVJST1JfRklMRV9JU19ESVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTcmNJc01pc3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0U3JjSXNNaXNzaW5nIiwKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgV3NkbFRvRG90bmV0LlNjaGVtYS5FUlJPUl9GSUxFX05PVF9GT1VORCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsV3NkbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0TG9jYWxXc2RsIik7CisgICAgfQorICAgIC8qKgorICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbFdzZGxTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdExvY2FsV3NkbFNlcnZlciIpOworICAgIH0KKyAgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRFeHRyYU9wcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RJbnZhbGlkRXh0cmFPcHMiLAorICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICBXU0RMX0ZBSUxFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsV3NkbFZCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RMb2NhbFdzZGxWQiIpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxXc2RsU2VydmVyVkIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdExvY2FsV3NkbFNlcnZlclZCIik7CisgICAgfQorICAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEV4dHJhT3BzVkIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0SW52YWxpZEV4dHJhT3BzVkIiLAorICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICBXU0RMX0ZBSUxFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYXMgaWYgcGFyc2VhYmxlIGVycm9ycyB3ZXJlIG5vdCBpZ25vcmVkLCBtb25vIGFuZCBXU0UxLjAgd291bGQKKyAgICAgKiBjcmFzaCBhbmQgYnVybi4gU28gaGVyZSB3ZSB2ZXJpZnkgdGhlIHByb3BlcnR5IGV4aXN0cywKKyAgICAgKiBhbmQgdGhhdCBpdCBpcyBub3QgcGFzc2VkIHRvIHRoZSBhcHAgd2hlbiBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZWFibGVFcnJvcnNJZ25vcmVkV2hlbkZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RMb2NhbFdzZGwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hRmlsZU11c3RFeGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RTY2hlbWFGaWxlTXVzdEV4aXN0IiwKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgV3NkbFRvRG90bmV0LlNjaGVtYS5FUlJPUl9GSUxFX05PVF9GT1VORCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYUZpbGVNdXN0SGF2ZU9uZU9wdGlvbk9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0U2NoZW1hRmlsZU11c3RIYXZlT25lT3B0aW9uT25seSIsCisgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZhaWx1cmUiLAorICAgICAgICAgICAgICAgIFdzZGxUb0RvdG5ldC5TY2hlbWEuRVJST1JfQk9USF9ERUNMQVJFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYU11c3RCZVNldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RTY2hlbWFNdXN0QmVTZXQiLAorICAgICAgICAgICAgICAgICJleHBlY3RlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICBXc2RsVG9Eb3RuZXQuU2NoZW1hLkVSUk9SX05PTkVfREVDTEFSRUQpOworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YbWxWYWxpZGF0ZUNhdGFsb2dUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWG1sVmFsaWRhdGVDYXRhbG9nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZGI4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWG1sVmFsaWRhdGVDYXRhbG9nVGVzdC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIFRlc3RzIHRoZSBYTUxWYWxpZGF0ZSBvcHRpb25hbCB0YXNrIHdpdGggbmVzdGVkIGV4dGVybmFsIGNhdGFsb2dzLgorICoKKyAqIEBzZWUgWG1sVmFsaWRhdGVUZXN0CisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgWG1sVmFsaWRhdGVDYXRhbG9nVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgLyoqCisgICAgICogd2hlcmUgdGFza3MgcnVuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBU0tERUZTX0RJUiA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC8iOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGVzdG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sVmFsaWRhdGVDYXRhbG9nVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBKVW5pdCBzZXR1cCBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAieG1sdmFsaWRhdGUueG1sIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVhcmRvd24gbWV0aG9kIGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworCisgICAgfQorCisgICAgLyoqCisgICAgICogY2F0YWxvZ2ZpbGVzIGZpbGVzZXQgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgKiBpZiByZXNvbHZlci5qYXIgaXMgbm90IHByZXNlbnQsIGJ1dCB3aWxsCisgICAgICogYmUgdXNlZCBpZiBpdCBpcy4gIGVpdGhlciB3YXksIHRlc3Qgc2hvdWxkCisgICAgICogd29yayBiL2Mgd2UgaGF2ZSBhIG5lc3RlZCBkdGQgd2l0aCB0aGUgc2FtZQorICAgICAqIGVudGl0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxDYXRhbG9nRmlsZXMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInhtbGNhdGFsb2dmaWxlcyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbmVzdGVkIGNhdGFsb2dwYXRoLgorICAgICAqIEl0IHNob3VsZCBiZSBpZ25vcmVkIGlmIHJlc29sdmVyLmphciBpcyBub3QKKyAgICAgKiBwcmVzZW50LCBidXQgd2lsbCBiZSB1c2VkIGlmIGl0IGlzLiAgZWl0aGVyCisgICAgICogd2F5LCB0ZXN0IHNob3VsZCB3b3JrIGIvYyB3ZSBoYXZlIGEgbmVzdGVkCisgICAgICogZHRkIHdpdGggdGhlIHNhbWUgZW50aXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFhtbENhdGFsb2dQYXRoKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ4bWxjYXRhbG9ncGF0aCIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1htbFZhbGlkYXRlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1htbFZhbGlkYXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmU4YTQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWG1sVmFsaWRhdGVUZXN0LmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIFRlc3RzIHRoZSBYTUxWYWxpZGF0ZSBvcHRpb25hbCB0YXNrLCBieSBydW5uaW5nIHRhcmdldHMgaW4gdGhlIHRlc3Qgc2NyaXB0CisgKiA8Y29kZT5zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWx2YWxpZGF0ZS54bWw8L2NvZGU+CisgKiA8cD4KKyAqCisgKiBAc2VlIFhtbFZhbGlkYXRlQ2F0YWxvZ1Rlc3QKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBYbWxWYWxpZGF0ZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC8qKgorICAgICAqIHdoZXJlIHRhc2tzIHJ1bgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLREVGU19ESVIgPQorICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvIjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0ZXN0bmFtZQorICAgICAqLworICAgIHB1YmxpYyBYbWxWYWxpZGF0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJ4bWx2YWxpZGF0ZS54bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVhcmRvd24gbWV0aG9kIGZvciBKVW5pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkge30KKworICAgIC8qKgorICAgICAqIEJhc2ljIGlubGluZSAnZHRkJyBlbGVtZW50IHRlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RWYWxpZGF0ZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaW5kaXJlY3QgdmFsaWRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVlcFZhbGlkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3REZWVwVmFsaWRhdGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxDYXRhbG9nKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ4bWxjYXRhbG9nIik7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sQ2F0YWxvZ1ZpYVJlZmlkKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ4bWxjYXRhbG9nVmlhUmVmaWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgdGhlIG5lc3RlZCBkdGQgZWxlbWVudCBpcyB1c2VkIHdoZW4gcmVzb2x2ZXIuamFyIGlzIG5vdAorICAgICAqIHByZXNlbnQuICBUaGlzIHRlc3Qgc2hvdWxkIHBhc3MgZWl0aGVyIHdheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sQ2F0YWxvZ0ZpbGVzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ4bWxjYXRhbG9nZmlsZXMtb3ZlcnJpZGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG5lc3RlZCBjYXRhbG9ncGF0aC4KKyAgICAgKiBUZXN0IHRoYXQgdGhlIG5lc3RlZCBkdGQgZWxlbWVudCBpcyB1c2VkIHdoZW4gcmVzb2x2ZXIuamFyIGlzIG5vdAorICAgICAqIHByZXNlbnQuICBUaGlzIHRlc3Qgc2hvdWxkIHBhc3MgZWl0aGVyIHdheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sQ2F0YWxvZ1BhdGgoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInhtbGNhdGFsb2dwYXRoLW92ZXJyaWRlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBuZXN0ZWQgeG1sY2F0YWxvZyBkZWZpbml0aW9ucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxDYXRhbG9nTmVzdGVkKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ4bWxjYXRhbG9nbmVzdGVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB4bWwgc2NoZW1hIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sU2NoZW1hR29vZCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0U2NoZW1hR29vZCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoZQorICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAuZW5kc1dpdGgoIiBkb2Vzbid0IHJlY29nbml6ZSBmZWF0dXJlIGh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIpCisgICAgICAgICAgICAgICAgfHwgZS5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoCisgICAgICAgICAgICAgICAgICAgICIgZG9lc24ndCBzdXBwb3J0IGZlYXR1cmUgaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIikpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiBza2lwcGVkLCBwYXJzZXIgZG9lc24ndCBzdXBwb3J0IHNjaGVtYSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3QgeG1sIHNjaGVtYSB2YWxpZGF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFhtbFNjaGVtYUJhZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RTY2hlbWFCYWQiKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBCdWlsZEV4Y2VwdGlvbiBiZWNhdXNlICdCYWQgU2NoZW1hIFZhbGlkYXRpb24nIik7CisKKyAgICAgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygKKyAgICAgICAgICAgICAgICAidGVzdFNjaGVtYUJhZCIsCisgICAgICAgICAgICAgICAgIkJhZCBTY2hlbWEgVmFsaWRhdGlvbiIsCisgICAgICAgICAgICAgICAgIm5vdCBhIHZhbGlkIFhNTCBkb2N1bWVudCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoZQorICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAuZW5kc1dpdGgoIiBkb2Vzbid0IHJlY29nbml6ZSBmZWF0dXJlIGh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIpCisgICAgICAgICAgICAgICAgfHwgZS5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoCisgICAgICAgICAgICAgICAgICAgICIgZG9lc24ndCBzdXBwb3J0IGZlYXR1cmUgaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIikpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiBza2lwcGVkLCBwYXJzZXIgZG9lc24ndCBzdXBwb3J0IHNjaGVtYSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJub3QgYSB2YWxpZCBYTUwgZG9jdW1lbnQiKSA+IC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGlzby0yMDIyLWpwLnhtbCBpcyB2YWxpZCBidXQgd291bGRuJ3QgZ2V0IHJlY29nbml6ZWQgb24gc3lzdGVtcworICAgICAqIHdpdGggYSBkaWZmZXJlbnQgbmF0aXZlIGVuY29kaW5nLgorICAgICAqCisgICAgICogQnVnIDExMjc5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElzbzIwMjJKcCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdElzbzIwMjJKcCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHV0Zi04LnhtbCBpcyBpbnZhbGlkIGFzIGl0IGNvbnRhaW5zIG5vbi1VVEYtOCBjaGFyYWN0ZXJzLCBidXQKKyAgICAgKiB3b3VsZCBwYXNzIG9uIHN5c3RlbXMgd2l0aCBhIG5hdGl2ZSBpc28tODg1OS0xIChvciBzaW1pbGFyKQorICAgICAqIGVuY29kaW5nLgorICAgICAqCisgICAgICogQnVnIDExMjc5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFV0ZjgoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0VXRmOCIsICJpbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZSIpOworICAgIH0KKworICAgIC8vIFRlc3RzIHByb3BlcnR5IGVsZW1lbnQsIHVzaW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyBhcyBhbiBleGFtcGxlLgorCisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5U2NoZW1hRm9yVmFsaWRYTUwoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RQcm9wZXJ0eS52YWxpZFhNTCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVNjaGVtYUZvckludmFsaWRYTUwoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgInRlc3RQcm9wZXJ0eS5pbnZhbGlkWE1MIiwKKyAgICAgICAgICAgICJYTUwgZmlsZSBkb2VzIG5vdCBzYXRpc2Z5IHNjaGVtYS4iKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Yc2x0VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hzbHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4NTUxZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Yc2x0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIFhTTFRQcm9jZXNzfSB0YXNrLgorICogWFhYIG1lcmdlIHdpdGgge0BsaW5rIFN0eWxlVGVzdH0/CisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgY2xhc3MgWHNsdFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC8qKgorICAgICAqIHdoZXJlIHRhc2tzIHJ1bgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLREVGU19ESVIgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvIjsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRlc3RuYW1lCisgICAgICovCisgICAgcHVibGljIFhzbHRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJ4c2x0LnhtbCIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRlYXJkb3duIG1ldGhvZCBmb3IgSlVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVhcmRvd24iKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENhdGNoTm9EdGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJ0ZXN0Q2F0Y2hOb0R0ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZmFpbHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmF0YWwgZXJyb3IgZHVyaW5nIHRyYW5zZm9ybWF0aW9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RDYXRhbG9nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE91dHB1dFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0T3V0cHV0UHJvcGVydHkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmFjdG9yeSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEF0dHJpYnV0ZSIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0WE1MV2l0aEVudGl0aWVzSW5Ob25Bc2NpaVBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFhNTFdpdGhFbnRpdGllc0luTm9uQXNjaWlQYXRoIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hlY2sgdGhhdCB0aGUgc3lzdGVtIGlkIGdldHMgc2V0IHByb3Blcmx5IG9uIHN0eWxlc2hlZXRzLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHlsZVNoZWV0V2l0aEluY2x1ZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFN0eWxlU2hlZXRXaXRoSW5jbHVkZSIpOworICAgICAgICBpZiAoZ2V0TG9nKCkuaW5kZXhPZigiamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iKSAhPSAtMSkgeworICAgICAgICAgICAgZmFpbCgieHNsOmluY2x1ZGUgd2FzIG5vdCBmb3VuZCIpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0RlcGVuZFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvRGVwZW5kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjMwMWUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0RlcGVuZFRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKKworLyoqCisgKiBUZXN0Y2FzZSBmb3IgdGhlIERlcGVuZCBvcHRpb25hbCB0YXNrLgorICoKKyAqLworcHVibGljIGNsYXNzIERlcGVuZFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfRklMRVNFVCA9ICJyZXN1bHQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9CVUlMRF9GSUxFCisgICAgICAgID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9kZXBlbmQueG1sIjsKKworICAgIHB1YmxpYyBEZXBlbmRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRFU1RfQlVJTERfRklMRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBkaXJlY3QgZGVwZW5kZW5jeSByZW1vdmFsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdGRpcmVjdCIpOworICAgICAgICBIYXNodGFibGUgZmlsZXMgPSBnZXRSZXN1bHRGaWxlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRlcGVuZCBkaWQgbm90IGxlYXZlIGNvcnJlY3QgbnVtYmVyIG9mIGZpbGVzIiwgMywKKyAgICAgICAgICAgIGZpbGVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQS5jbGFzcyIsCisgICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgiQS5jbGFzcyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBELmNsYXNzIiwKKyAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJELmNsYXNzIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZGVwZW5kZW5jeSB0cmF2ZXJzYWwgKGNsb3N1cmUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENsb3N1cmUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RjbG9zdXJlIik7CisgICAgICAgIEhhc2h0YWJsZSBmaWxlcyA9IGdldFJlc3VsdEZpbGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIkRlcGVuZCBkaWQgbm90IGxlYXZlIGNvcnJlY3QgbnVtYmVyIG9mIGZpbGVzIiwgCisgICAgICAgICAgICBmaWxlcy5zaXplKCkgPD0gMik7CisgICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gRC5jbGFzcyIsCisgICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgiRC5jbGFzcyIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgaW5uZXIgY2xhc3MgZGVwZW5kZW5jaWVzIHRyaWdnZXIgZGVsZXRpb24gb2YgdGhlIG91dGVyIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdElubmVyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0aW5uZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXBlbmQgZGlkIG5vdCBsZWF2ZSBjb3JyZWN0IG51bWJlciBvZiBmaWxlcyIsIDAsCisgICAgICAgICAgICBnZXRSZXN1bHRGaWxlcygpLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IG11bHRpLWxldmUgaW5uZXIgY2xhc3MgZGVwZW5kZW5jaWVzIHRyaWdnZXIgZGVsZXRpb24gb2YKKyAgICAgKiB0aGUgb3V0ZXIgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJJbm5lcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdGlubmVyaW5uZXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXBlbmQgZGlkIG5vdCBsZWF2ZSBjb3JyZWN0IG51bWJlciBvZiBmaWxlcyIsIDAsCisgICAgICAgICAgICBnZXRSZXN1bHRGaWxlcygpLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiB0aGVyZSBpcyBubyBzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Tb3VyY2UoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdG5vc291cmNlIiwKKyAgICAgICAgICAgICJObyBzb3VyY2Ugc3BlY2lmaWVkIiwgInNyY2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYW4gZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHRoZSBzb3VyY2UgYXR0cmlidXRlIGlzIGVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5U291cmNlKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3RlbXB0eXNvdXJjZSIsCisgICAgICAgICAgICAiTm8gc291cmNlIHNwZWNpZmllZCIsICJzcmNkaXIgYXR0cmlidXRlIG11c3QgYmUgbm9uLWVtcHR5Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgcmVzdWx0IGZpbGVzZXQgaW50byBhIEhhc2h0YWJsZQorICAgICAqCisgICAgICogQHJldHVybiBhIEhhc2h0YWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgaW4gdGhlIHJlc3VsdAorICAgICAqIGZpbGVzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2h0YWJsZSBnZXRSZXN1bHRGaWxlcygpIHsKKyAgICAgICAgRmlsZVNldCByZXN1bHRGaWxlU2V0ID0gKEZpbGVTZXQpIHByb2plY3QuZ2V0UmVmZXJlbmNlKFJFU1VMVF9GSUxFU0VUKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gcmVzdWx0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOworICAgICAgICBTdHJpbmdbXSBzY2FubmVkRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgSGFzaHRhYmxlIGZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjYW5uZWRGaWxlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgZmlsZXMucHV0KHNjYW5uZWRGaWxlc1tpXSwgc2Nhbm5lZEZpbGVzW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IG11dHVhbCBkZXBlbmRlbmN5IGJldHdlZW4gaW5uZXIgYW5kIG91dGVyIGRvIG5vdCBjYXVzZSBib3RoIHRvIGJlCisgICAgICogZGVsZXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lckNsb3N1cmUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Rpbm5lcmNsb3N1cmUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXBlbmQgZGlkIG5vdCBsZWF2ZSBjb3JyZWN0IG51bWJlciBvZiBmaWxlcyIsIDQsCisgICAgICAgICAgICBnZXRSZXN1bHRGaWxlcygpLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBjYWNoZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDYWNoZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdGNhY2hlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZGV0ZWN0aW9uIGFuZCB3YXJuaW5nIG9mIG5vbiBwdWJsaWMgY2xhc3NlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25QdWJsaWMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Rub25wdWJsaWMiKTsKKyAgICAgICAgU3RyaW5nIGxvZyA9IGdldExvZygpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB3YXJuaW5nIGFib3V0IEFQcml2YXRlIiwKKyAgICAgICAgICAgIGxvZy5pbmRleE9mKCJUaGUgY2xhc3MgQVByaXZhdGUgaW4gZmlsZSIpICE9IC0xKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYnV0IGhhcyBub3QgYmVlbiBkZWxldGVkIGJlY2F1c2UgaXRzIHNvdXJjZSBmaWxlICIKKyAgICAgICAgICAgICsgImNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIiwKKyAgICAgICAgICAgIGxvZy5pbmRleE9mKCJUaGUgY2xhc3MgQVByaXZhdGUgaW4gZmlsZSIpICE9IC0xKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pMThuL1RyYW5zbGF0ZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pMThuL1RyYW5zbGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI1ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vVHJhbnNsYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pMThuOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFRlc3RzIHRoZSBUcmFuc2xhdGUgdGFzay4KKyAqCisgKiBAc2luY2UgICAgIEFudCAxLjYKKyAqLworcHVibGljIGNsYXNzIFRyYW5zbGF0ZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgQlVGX1NJWkUgPSAzMjc2ODsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLREVGU19ESVIgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi90cmFuc2xhdGUiOworCisgICAgcHVibGljIFRyYW5zbGF0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAiL3RyYW5zbGF0ZS54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOworICAgICAgICBhc3NlcnRUcnVlKCJ0cmFuc2xhdGlvbiBvZiAiKyBUQVNLREVGU19ESVIgKyAiL2lucHV0L3RlbXBsYXRlLnR4dCIsY29tcGFyZUZpbGVzKFRBU0tERUZTX0RJUisiL2V4cGVjdGVkL2RlL3RlbXBsYXRlLnR4dCIsVEFTS0RFRlNfRElSKyIvb3V0cHV0L2RlL3RlbXBsYXRlLnR4dCIpKTsKKyAgICB9CisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVGaWxlcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgeworICAgICAgICBGaWxlIGZpbGUxID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIG5hbWUxKTsKKyAgICAgICAgRmlsZSBmaWxlMiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCBuYW1lMik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghZmlsZTEuZXhpc3RzKCkgfHwgIWZpbGUyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPbmUgb3IgYm90aCBmaWxlcyBkbyBub3QgZXhpc3Q6IiArIG5hbWUxICsgIiwgIiArIG5hbWUyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWxlMS5sZW5ndGgoKSAhPSBmaWxlMi5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBzaXplIG1pc21hdGNoOiIgKyBuYW1lMSArICIoIiArIGZpbGUxLmxlbmd0aCgpICsgIiksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lMiAgKyAiKCIgKyBmaWxlMi5sZW5ndGgoKSArICIpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBieXRlIC0gYnl0ZSBjb21wYXJlCisgICAgICAgICAgICBieXRlW10gYnVmZmVyMSA9IG5ldyBieXRlW0JVRl9TSVpFXTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIyID0gbmV3IGJ5dGVbQlVGX1NJWkVdOworCisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzMSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTEpOworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpczIgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgcmVhZCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBmaXMxLnJlYWQoYnVmZmVyMSkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgZmlzMi5yZWFkKGJ1ZmZlcjIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVhZDsgKytpLCArK2luZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIxW2ldICE9IGJ1ZmZlcjJbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnl0ZXMgbWlzbWF0Y2g6IiArIG5hbWUxICsgIiwgIiArIG5hbWUyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGF0IGJ5dGUgIiArIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPRXhjZXB0aW9uIGNvbXBhcmluZyBmaWxlczogIiArIG5hbWUxICsgIiwgIiArIG5hbWUyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjQyNDUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKworLyoqCisgKiBUZXN0cyB0aGUgSW1hZ2UgdGFzay4KKyAqCisgKiBAc2luY2UgICAgIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIEltYWdlVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBU0tERUZTX0RJUiA9IAorICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTEFSR0VJTUFHRSA9ICJsYXJnZWltYWdlLmpwZyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHB1YmxpYyBJbWFnZVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAiaW1hZ2UueG1sIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9Mb2coKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RFY2hvVG9Mb2ciLCAiUHJvY2Vzc2luZyBGaWxlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVNjYWxlKCl7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RTaW1wbGVTY2FsZSIsICJQcm9jZXNzaW5nIEZpbGUiKTsKKyAgICAgICAgRmlsZSBmID0gY3JlYXRlUmVsYXRpdmVGaWxlKCIvZGVzdC8iICsgTEFSR0VJTUFHRSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgIkRpZCBub3QgY3JlYXRlICIrZi5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICBmLmV4aXN0cygpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVyd3JpdGVUcnVlKCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJ0ZXN0U2ltcGxlU2NhbGUiLCAiUHJvY2Vzc2luZyBGaWxlIik7CisgICAgICAgIEZpbGUgZiA9IGNyZWF0ZVJlbGF0aXZlRmlsZSgiL2Rlc3QvIiArIExBUkdFSU1BR0UpOworICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGYubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoRklMRV9VVElMUworICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RPdmVyd3JpdGVUcnVlIiwgIlByb2Nlc3NpbmcgRmlsZSIpOworICAgICAgICBmID0gY3JlYXRlUmVsYXRpdmVGaWxlKCIvZGVzdC8iICsgTEFSR0VJTUFHRSk7CisgICAgICAgIGxvbmcgb3ZlcndyaXR0ZW5MYXN0TW9kaWZpZWQgPSBmLmxhc3RNb2RpZmllZCgpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHdhcyBub3Qgb3ZlcndyaXR0ZW4uIiwKKyAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPCBvdmVyd3JpdHRlbkxhc3RNb2RpZmllZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJ3cml0ZUZhbHNlKCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJ0ZXN0U2ltcGxlU2NhbGUiLCAiUHJvY2Vzc2luZyBGaWxlIik7CisgICAgICAgIEZpbGUgZiA9IGNyZWF0ZVJlbGF0aXZlRmlsZSgiL2Rlc3QvIiArIExBUkdFSU1BR0UpOworICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGYubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RPdmVyd3JpdGVGYWxzZSIsICJQcm9jZXNzaW5nIEZpbGUiKTsKKyAgICAgICAgZiA9IGNyZWF0ZVJlbGF0aXZlRmlsZSgiL2Rlc3QvIiArIExBUkdFSU1BR0UpOworICAgICAgICBsb25nIG92ZXJ3cml0dGVuTGFzdE1vZGlmaWVkID0gZi5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSB3YXMgb3ZlcndyaXR0ZW4uIiwKKyAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPT0gb3ZlcndyaXR0ZW5MYXN0TW9kaWZpZWQpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgb2ZmX3Rlc3RGYWlsT25FcnJvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RGYWlsT25FcnJvciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHByb2Nlc3MgaW1hZ2Ugc3RyZWFtIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUnVuIHRpbWUgZXhjZXB0aW9uIHNob3VsZCBzYXkgIgorICAgICAgICAgICAgICAgICAgICAgICArICInVW5hYmxlIHRvIHByb2Nlc3MgaW1hZ2Ugc3RyZWFtJy4gOiIgCisgICAgICAgICAgICAgICAgICAgICAgICsgcmUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmUudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZigiVW5hYmxlIHRvIHByb2Nlc3MgaW1hZ2Ugc3RyZWFtIikgPiAtMSk7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgcHJvdGVjdGVkIEZpbGUgY3JlYXRlUmVsYXRpdmVGaWxlKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICBpZiAoZmlsZW5hbWUuZXF1YWxzKCIuIikpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQcm9qZWN0RGlyKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZWxzZQorICAgICAgICByZXR1cm4gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpLCBmaWxlbmFtZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC9KRGVwZW5kVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvSkRlcGVuZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTkxZDljCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvSkRlcGVuZFRlc3QuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamRlcGVuZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogVGVzdGNhc2UgZm9yIHRoZSBKRGVwZW5kIG9wdGlvbmFsIHRhc2suCisgKgorICovCitwdWJsaWMgY2xhc3MgSkRlcGVuZFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfRklMRVNFVCA9ICJyZXN1bHQiOworCisgICAgcHVibGljIEpEZXBlbmRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KAorICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvamRlcGVuZC54bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHNpbXBsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB7CisgICAgICAgIGV4cGVjdE91dHB1dENvbnRhaW5pbmcoCisgICAgICAgICAgICAic2ltcGxlIiwgIlBhY2thZ2U6IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZmFjYWRlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB4bWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sKCkgeworICAgICAgICBleHBlY3RPdXRwdXRDb250YWluaW5nKAorICAgICAgICAgICAgInhtbCIsICI8RGVwZW5kc1Vwb24+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3JrCisgICAgICogLSBmb3JrZWQgb3V0cHV0IGdvZXMgdG8gbG9nCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmsoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoCisgICAgICAgICAgICAiZm9yayIsICJQYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yayB4bWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ya1htbCgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygKKyAgICAgICAgICAgICJmb3JrLXhtbCIsICI8RGVwZW5kc1Vwb24+Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVvdXQoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoCisgICAgICAgICAgICAiZm9yay10aW1lb3V0IiwgIkpEZXBlbmQgRkFJTEVEIC0gVGltZWQgb3V0Iik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRpbWVvdXQgd2l0aG91dCB0aW1pbmcgb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVvdXROb3QoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoCisgICAgICAgICAgICAiZm9yay10aW1lb3V0LW5vdCIsICJQYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBtZXNzYWdlIGhhcyBiZWVuIG91dHB1dHRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV4cGVjdE91dHB1dENvbnRhaW5pbmcoU3RyaW5nIHRhcmdldCwgU3RyaW5nIHN1YnN0cmluZykgeworICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIGFzc2VydE91dHB1dENvbnRhaW5pbmcoc3Vic3RyaW5nKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9ET01VdGlsVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0RPTVV0aWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkZGU2YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9ET01VdGlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkpBWFBVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIERPTVV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hpbGROb2RlcygpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gSkFYUFV0aWxzLmdldERvY3VtZW50QnVpbGRlcigpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oInRhc2tkZWZzL29wdGlvbmFsL2p1bml0L21hdGNoZXMueG1sIik7CisgICAgICAgIERvY3VtZW50IGRvYyA9IGRiLnBhcnNlKGlzKTsKKyAgICAgICAgTm9kZUxpc3QgbmwgPSBET01VdGlsLmxpc3RDaGlsZE5vZGVzKGRvYy5nZXRGaXJzdENoaWxkKCksIG5ldyBGb29Ob2RlRmlsdGVyKCksIHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMobmwuZ2V0TGVuZ3RoKCksIDMpOworICAgIH0KKyAgICBwdWJsaWMgY2xhc3MgRm9vTm9kZUZpbHRlciBpbXBsZW1lbnRzIERPTVV0aWwuTm9kZUZpbHRlciB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChOb2RlIG5vZGUpIHsKKyAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJmb28iKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdENsYXNzTG9hZGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0Q2xhc3NMb2FkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmNWQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdENsYXNzTG9hZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgY2xhc3Nsb2FkZXIgbG9hZGluZyBKVW5pdCB0ZXN0Y2FzZQorICogaXMgYWxzbyB0aGUgY29udGV4dCBjbGFzc2xvYWRlci4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKVW5pdENsYXNzTG9hZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBKVW5pdENsYXNzTG9hZGVyVGVzdChTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dENsYXNzTG9hZGVyKCl7CisgICAgICAgIENsYXNzTG9hZGVyIGNvbnRleHQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBDbGFzc0xvYWRlciBjYWxsZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIGFzc2VydFNhbWUoY29udGV4dCwgY2FsbGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRSZXBvcnRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRSZXBvcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5NTI5MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFJlcG9ydFRlc3QuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFNtYWxsIHRlc3RjYXNlIGZvciB0aGUganVuaXRyZXBvcnR0YXNrLgorICogRmlyc3QgdGVzdCBhZGRlZCB0byByZXByb2R1Y2UgYW4gZmF1bHQsIHN0aWxsIGEgbG90IHRvIGltcHJvdmUKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKVW5pdFJlcG9ydFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBKVW5pdFJlcG9ydFRlc3QoU3RyaW5nIG5hbWUpeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQueG1sIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCBubyBlbXB0eSBqdW5pdC1ub2ZyYW1lcy5odG1sIGlzIGdlbmVyYXRlZCB3aGVuIGZyYW1lcworICAgICAqIG91dHB1dCBpcyBzZWxlY3RlZCB2aWEgdGhlIGRlZmF1bHQuCisgICAgICogTmVlZHMgcmVwb3J0czEgdGFzayBmcm9tIGp1bml0cmVwb3J0LnhtbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9GaWxlSlVuaXROb0ZyYW1lcygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgicmVwb3J0czEiKTsKKyAgICAgICAgaWYgKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvdGVzdC9odG1sL2p1bml0LW5vZnJhbWVzLmh0bWwiKS5leGlzdHMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmFpbCgiTm8gZmlsZSBqdW5pdC1ub2ZyYW1lcy5odG1sIGV4cGVjdGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRJbmRleENyZWF0ZWQoKSB7CisgICAgICAgIGlmICghbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksCisgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L3Rlc3QvaHRtbC9pbmRleC5odG1sIikuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGZhaWwoIk5vIGZpbGUgaW5kZXggZmlsZSBmb3VuZCIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBydW4gYSB0YXJnZXQsIGFzc2VydCB0aGUgaW5kZXggZmlsZSBpcyB0aGVyZSwgbG9vayBmb3IgdGV4dCBpbiB0aGUgbG9nCisgICAgICogQHBhcmFtIHRhcmdldE5hbWUgdGFyZ2V0CisgICAgICogQHBhcmFtIHRleHQgb3B0aW9uYWwgdGV4dCB0byBsb29rIGZvcgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBleHBlY3RSZXBvcnRXaXRoVGV4dChTdHJpbmcgdGFyZ2V0TmFtZSwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXROYW1lKTsKKyAgICAgICAgYXNzZXJ0SW5kZXhDcmVhdGVkKCk7CisgICAgICAgIGlmKHRleHQhPW51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydExvZ0NvbnRhaW5pbmcodGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0UmVwb3J0V2l0aFRleHQoInRlc3RFbXB0eUZpbGUiLAorICAgICAgICAgICAgICAgIFhNTFJlc3VsdEFnZ3JlZ2F0b3IuV0FSTklOR19FTVBUWV9GSUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jb21wbGV0ZUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0UmVwb3J0V2l0aFRleHQoInRlc3RJbmNvbXBsZXRlRmlsZSIsCisgICAgICAgICAgICAgICAgWE1MUmVzdWx0QWdncmVnYXRvci5XQVJOSU5HX0lTX1BPU1NJQkxZX0NPUlJVUFRFRCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0VsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0UmVwb3J0V2l0aFRleHQoInRlc3RXcm9uZ0VsZW1lbnQiLAorICAgICAgICAgICAgICAgIFhNTFJlc3VsdEFnZ3JlZ2F0b3IuV0FSTklOR19JTlZBTElEX1JPT1RfRUxFTUVOVCk7CisgICAgfQorCisgICAgLy8gQnVnemlsbGEgUmVwb3J0IDM0OTYzCisgICAgcHVibGljIHZvaWQgdGVzdFN0YWNrVHJhY2VMaW5lQnJlYWtzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdFJlcG9ydFdpdGhUZXh0KCJ0ZXN0U3RhY2tUcmFjZUxpbmVCcmVha3MiLCBudWxsKTsKKyAgICAgICAgRmlsZVJlYWRlciByID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIgPSBuZXcgRmlsZVJlYWRlcihuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvdGVzdC9odG1sL3NhbXBsZXByb2plY3QvY29pbnMvMF9Db2luVGVzdC5odG1sIikpOworICAgICAgICAgICAgU3RyaW5nIHJlcG9ydCA9IEZpbGVVdGlscy5yZWFkRnVsbHkocik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJvdXRwdXQgbXVzdCBjb250YWluIDxicj4iLAorICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuaW5kZXhPZigianVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOiBET0VHPGJyLz4iKQorICAgICAgICAgICAgICAgICAgID4gLTEpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBCdWd6aWxsYSBSZXBvcnQgMzg0NzcKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lhbFNpZ25zSW5TcmNQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RTcGVjaWFsU2lnbnNJblNyY1BhdGgiKTsKKyAgICAgICAgRmlsZSByZXBvcnRGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC90ZXN0L2h0bWwvaW5kZXguaHRtbCIpOworICAgICAgICAvLyB0ZXN0cyBvbmUgdGhlIGZpbGUgb2JqZWN0CisgICAgICAgIGFzc2VydFRydWUoIk5vIGluZGV4Lmh0bWwgcHJlc2VudC4gTm90IGdlbmVyYXRlZD8iLCByZXBvcnRGaWxlLmV4aXN0cygpICk7CisgICAgICAgIGFzc2VydFRydWUoIkNhbnQgcmVhZCB0aGUgcmVwb3J0IGZpbGUuIiwgcmVwb3J0RmlsZS5jYW5SZWFkKCkgKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBzaG91bGRudCBiZSBlbXB0eS4iLCByZXBvcnRGaWxlLmxlbmd0aCgpID4gMCApOworICAgICAgICAvLyBjb252ZXJzaW9uIHRvIFVSTCB2aWEgRmlsZVV0aWxzIGxpa2UgaW4gWE1MUmVzdWx0QWdncmVnYXRvciwgbm90IGFzIHN1Z2dlc3RlZCBpbiB0aGUgYnVnIHJlcG9ydAorICAgICAgICBVUkwgcmVwb3J0VXJsID0gbmV3IFVSTCggRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLnRvVVJJKHJlcG9ydEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpICk7CisgICAgICAgIElucHV0U3RyZWFtIHJlcG9ydFN0cmVhbSA9IHJlcG9ydFVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoaXMgc2hvdWxkbnQgYmUgYW4gZW1wdHkgc3RyZWFtLiIsIHJlcG9ydFN0cmVhbS5hdmFpbGFibGUoKSA+IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWFsU2lnbnNJbkh0bWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RTcGVjaWFsU2lnbnNJbkh0bWxQYXRoIik7CisgICAgICAgIEZpbGUgcmVwb3J0RmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvdGVzdC9odG1sIyAkJVx1MDBBNyYtIXJlcG9ydC9pbmRleC5odG1sIik7CisgICAgICAgIC8vIHRlc3RzIG9uZSB0aGUgZmlsZSBvYmplY3QKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gaW5kZXguaHRtbCBwcmVzZW50LiBOb3QgZ2VuZXJhdGVkPyIsIHJlcG9ydEZpbGUuZXhpc3RzKCkgKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FudCByZWFkIHRoZSByZXBvcnQgZmlsZS4iLCByZXBvcnRGaWxlLmNhblJlYWQoKSApOworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHNob3VsZG50IGJlIGVtcHR5LiIsIHJlcG9ydEZpbGUubGVuZ3RoKCkgPiAwICk7CisgICAgICAgIC8vIGNvbnZlcnNpb24gdG8gVVJMIHZpYSBGaWxlVXRpbHMgbGlrZSBpbiBYTUxSZXN1bHRBZ2dyZWdhdG9yLCBub3QgYXMgc3VnZ2VzdGVkIGluIHRoZSBidWcgcmVwb3J0CisgICAgICAgIFVSTCByZXBvcnRVcmwgPSBuZXcgVVJMKCBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkudG9VUkkocmVwb3J0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkgKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVwb3J0U3RyZWFtID0gcmVwb3J0VXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhpcyBzaG91bGRudCBiZSBhbiBlbXB0eSBzdHJlYW0uIiwgcmVwb3J0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCk7CisgICAgfQorCisgICAgLy9CdWd6aWxsYSBSZXBvcnQgMzk3MDgKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFN0eWxlRnJvbURpcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0V2l0aFN0eWxlRnJvbURpciIpOworICAgICAgICBGaWxlIHJlcG9ydEZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L3Rlc3QvaHRtbC9pbmRleC5odG1sIik7CisgICAgICAgIC8vIHRlc3RzIG9uZSB0aGUgZmlsZSBvYmplY3QKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gaW5kZXguaHRtbCBwcmVzZW50LiBOb3QgZ2VuZXJhdGVkPyIsIHJlcG9ydEZpbGUuZXhpc3RzKCkgKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FudCByZWFkIHRoZSByZXBvcnQgZmlsZS4iLCByZXBvcnRGaWxlLmNhblJlYWQoKSApOworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHNob3VsZG50IGJlIGVtcHR5LiIsIHJlcG9ydEZpbGUubGVuZ3RoKCkgPiAwICk7CisgICAgICAgIC8vIGNvbnZlcnNpb24gdG8gVVJMIHZpYSBGaWxlVXRpbHMgbGlrZSBpbiBYTUxSZXN1bHRBZ2dyZWdhdG9yLCBub3QgYXMgc3VnZ2VzdGVkIGluIHRoZSBidWcgcmVwb3J0CisgICAgICAgIFVSTCByZXBvcnRVcmwgPSBuZXcgVVJMKCBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkudG9VUkkocmVwb3J0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkgKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVwb3J0U3RyZWFtID0gcmVwb3J0VXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhpcyBzaG91bGRudCBiZSBhbiBlbXB0eSBzdHJlYW0uIiwgcmVwb3J0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCk7CisgICAgfQorCisgICAgLy9CdWd6aWxsYSBSZXBvcnQgNDAwMjEKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9GcmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdE5vRnJhbWVzIik7CisgICAgICAgIEZpbGUgcmVwb3J0RmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvdGVzdC9odG1sL2p1bml0LW5vZnJhbWVzLmh0bWwiKTsKKyAgICAgICAgLy8gdGVzdHMgb25lIHRoZSBmaWxlIG9iamVjdAorICAgICAgICBhc3NlcnRUcnVlKCJObyBqdW5pdC1ub2ZyYW1lcy5odG1sIHByZXNlbnQuIE5vdCBnZW5lcmF0ZWQ/IiwgcmVwb3J0RmlsZS5leGlzdHMoKSApOworICAgICAgICBhc3NlcnRUcnVlKCJDYW50IHJlYWQgdGhlIHJlcG9ydCBmaWxlLiIsIHJlcG9ydEZpbGUuY2FuUmVhZCgpICk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgc2hvdWxkbnQgYmUgZW1wdHkuIiwgcmVwb3J0RmlsZS5sZW5ndGgoKSA+IDAgKTsKKyAgICAgICAgLy8gY29udmVyc2lvbiB0byBVUkwgdmlhIEZpbGVVdGlscyBsaWtlIGluIFhNTFJlc3VsdEFnZ3JlZ2F0b3IsIG5vdCBhcyBzdWdnZXN0ZWQgaW4gdGhlIGJ1ZyByZXBvcnQKKyAgICAgICAgVVJMIHJlcG9ydFVybCA9IG5ldyBVUkwoIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS50b1VSSShyZXBvcnRGaWxlLmdldEFic29sdXRlUGF0aCgpKSApOworICAgICAgICBJbnB1dFN0cmVhbSByZXBvcnRTdHJlYW0gPSByZXBvcnRVcmwub3BlblN0cmVhbSgpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGlzIHNob3VsZG50IGJlIGFuIGVtcHR5IHN0cmVhbS4iLCByZXBvcnRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKTsKKyAgICB9CisgICAgLy9CdWd6aWxsYSBSZXBvcnQgMzk3MDgKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFN0eWxlRnJvbURpckFuZFhzbEltcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0V2l0aFN0eWxlRnJvbURpckFuZFhzbEltcG9ydCIpOworICAgICAgICBGaWxlIHJlcG9ydEZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L3Rlc3QvaHRtbC9pbmRleC5odG1sIik7CisgICAgICAgIC8vIHRlc3RzIG9uZSB0aGUgZmlsZSBvYmplY3QKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gaW5kZXguaHRtbCBwcmVzZW50LiBOb3QgZ2VuZXJhdGVkPyIsIHJlcG9ydEZpbGUuZXhpc3RzKCkgKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FudCByZWFkIHRoZSByZXBvcnQgZmlsZS4iLCByZXBvcnRGaWxlLmNhblJlYWQoKSApOworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHNob3VsZG50IGJlIGVtcHR5LiIsIHJlcG9ydEZpbGUubGVuZ3RoKCkgPiAwICk7CisgICAgICAgIC8vIGNvbnZlcnNpb24gdG8gVVJMIHZpYSBGaWxlVXRpbHMgbGlrZSBpbiBYTUxSZXN1bHRBZ2dyZWdhdG9yLCBub3QgYXMgc3VnZ2VzdGVkIGluIHRoZSBidWcgcmVwb3J0CisgICAgICAgIFVSTCByZXBvcnRVcmwgPSBuZXcgVVJMKCBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkudG9VUkkocmVwb3J0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkgKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVwb3J0U3RyZWFtID0gcmVwb3J0VXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhpcyBzaG91bGRudCBiZSBhbiBlbXB0eSBzdHJlYW0uIiwgcmVwb3J0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhTdHlsZUZyb21DbGFzc3BhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFdpdGhTdHlsZUZyb21DbGFzc3BhdGgiKTsKKyAgICAgICAgRmlsZSByZXBvcnRGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC90ZXN0L2h0bWwvaW5kZXguaHRtbCIpOworICAgICAgICAvLyB0ZXN0cyBvbmUgdGhlIGZpbGUgb2JqZWN0CisgICAgICAgIGFzc2VydFRydWUoIk5vIGluZGV4Lmh0bWwgcHJlc2VudC4gTm90IGdlbmVyYXRlZD8iLCByZXBvcnRGaWxlLmV4aXN0cygpICk7CisgICAgICAgIGFzc2VydFRydWUoIkNhbnQgcmVhZCB0aGUgcmVwb3J0IGZpbGUuIiwgcmVwb3J0RmlsZS5jYW5SZWFkKCkgKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBzaG91bGRudCBiZSBlbXB0eS4iLCByZXBvcnRGaWxlLmxlbmd0aCgpID4gMCApOworICAgICAgICAvLyBjb252ZXJzaW9uIHRvIFVSTCB2aWEgRmlsZVV0aWxzIGxpa2UgaW4gWE1MUmVzdWx0QWdncmVnYXRvciwgbm90IGFzIHN1Z2dlc3RlZCBpbiB0aGUgYnVnIHJlcG9ydAorICAgICAgICBVUkwgcmVwb3J0VXJsID0gbmV3IFVSTCggRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLnRvVVJJKHJlcG9ydEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpICk7CisgICAgICAgIElucHV0U3RyZWFtIHJlcG9ydFN0cmVhbSA9IHJlcG9ydFVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoaXMgc2hvdWxkbnQgYmUgYW4gZW1wdHkgc3RyZWFtLiIsIHJlcG9ydFN0cmVhbS5hdmFpbGFibGUoKSA+IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoInRlc3RXaXRoUGFyYW1zIiwgImtleTE9dmFsdWUxLGtleTI9dmFsdWUyIik7CisgICAgICAgIEZpbGUgcmVwb3J0RmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvdGVzdC9odG1sL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgLy8gdGVzdHMgb25lIHRoZSBmaWxlIG9iamVjdAorICAgICAgICBhc3NlcnRUcnVlKCJObyBpbmRleC5odG1sIHByZXNlbnQuIE5vdCBnZW5lcmF0ZWQ/IiwgcmVwb3J0RmlsZS5leGlzdHMoKSApOworICAgICAgICBhc3NlcnRUcnVlKCJDYW50IHJlYWQgdGhlIHJlcG9ydCBmaWxlLiIsIHJlcG9ydEZpbGUuY2FuUmVhZCgpICk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgc2hvdWxkbnQgYmUgZW1wdHkuIiwgcmVwb3J0RmlsZS5sZW5ndGgoKSA+IDAgKTsKKyAgICAgICAgLy8gY29udmVyc2lvbiB0byBVUkwgdmlhIEZpbGVVdGlscyBsaWtlIGluIFhNTFJlc3VsdEFnZ3JlZ2F0b3IsIG5vdCBhcyBzdWdnZXN0ZWQgaW4gdGhlIGJ1ZyByZXBvcnQKKyAgICAgICAgVVJMIHJlcG9ydFVybCA9IG5ldyBVUkwoIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS50b1VSSShyZXBvcnRGaWxlLmdldEFic29sdXRlUGF0aCgpKSApOworICAgICAgICBJbnB1dFN0cmVhbSByZXBvcnRTdHJlYW0gPSByZXBvcnRVcmwub3BlblN0cmVhbSgpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGlzIHNob3VsZG50IGJlIGFuIGVtcHR5IHN0cmVhbS4iLCByZXBvcnRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWMwZGJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza1Rlc3QuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworcHVibGljIGNsYXNzIEpVbml0VGFza1Rlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgSlVuaXRUYXNrVGVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIEpVbml0VGFza1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQueG1sIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHRlYXJkb3duIG1ldGhvZCBmb3IgSlVuaXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jhc2goKSB7CisgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoImNyYXNoIiwgImNyYXNoZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9DcmFzaCgpIHsKKyAgICAgICBleHBlY3RQcm9wZXJ0eVVuc2V0KCJub2NyYXNoIiwgImNyYXNoZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dCgpIHsKKyAgICAgICBleHBlY3RQcm9wZXJ0eVNldCgidGltZW91dCIsICJ0aW1lb3V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vVGltZW91dCgpIHsKKyAgICAgICBleHBlY3RQcm9wZXJ0eVVuc2V0KCJub3RpbWVvdXQiLCAidGltZW91dCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25Gb3JrZWRDYXB0dXJlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2FwdHVyZSIpOworICAgICAgICBhc3NlcnROb1ByaW50KGdldExvZygpLCAibG9nIik7CisgICAgICAgIGFzc2VydE5vUHJpbnQoZ2V0RnVsbExvZygpLCAiZGVidWcgbG9nIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmtlZENhcHR1cmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoImZvcmsiLCAidHJ1ZSIpOworICAgICAgICB0ZXN0Tm9uRm9ya2VkQ2FwdHVyZSgpOworICAgICAgICAvLyB0aG9zZSB3b3VsZCBmYWlsIGJlY2F1c2Ugb2YgdGhlIHdheSBCdWlsZEZpbGVUZXN0IGNhcHR1cmVzIG91dHB1dAorICAgICAgICBhc3NlcnROb1ByaW50KGdldE91dHB1dCgpLCAib3V0cHV0Iik7CisgICAgICAgIGFzc2VydE5vUHJpbnQoZ2V0RXJyb3IoKSwgImVycm9yIG91dHB1dCIpOworICAgICAgICBhc3NlcnRPdXRwdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0Y2hUZXN0Rm9ya09uY2VUb0RpcigpIHsKKyAgICAgICAgYXNzZXJ0UmVzdWx0RmlsZXNFeGlzdCgidGVzdEJhdGNoVGVzdEZvcmtPbmNlVG9EaXIiLCAiLnhtbCIpOworICAgIH0KKworICAgIC8qKiBCdWd6aWxsYSBSZXBvcnQgMzI5NzMgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmF0Y2hUZXN0Rm9ya09uY2VFeHRlbnNpb24oKSB7CisgICAgICAgIGFzc2VydFJlc3VsdEZpbGVzRXhpc3QoInRlc3RCYXRjaFRlc3RGb3JrT25jZUV4dGVuc2lvbiIsICIuZm9vIik7CisgICAgfQorCisKKyAgICAvKiBCdWd6aWxsYSBSZXBvcnQgNDI5ODQgKi8KKyAgICAvL1RPRE8gVGhpcyBzY2VuYXJpbyB3b3JrcyBmcm9tIGNvbW1hbmQgbGluZSwgYnV0IG5vdCBmcm9tIEpVbml0IC4uLgorICAgIC8vICAgICBSdW5uaW5nIHRoZXNlIHN0ZXBzIGZyb20gdGhlIGp1bml0LnhtbC1kaXJlY3Rvcnkgd29yaworICAgIC8vICAgICAkIGFudCAtZiBqdW5pdC54bWwgZmFpbHVyZVJlY29yZGVyLnByZXBhcmUKKyAgICAvLyAgICAgJCBhbnQgLWYganVuaXQueG1sIGZhaWx1cmVSZWNvcmRlci5ydW50ZXN0CisgICAgLy8gICAgICQgYW50IC1mIGp1bml0LnhtbCBmYWlsdXJlUmVjb3JkZXIucnVudGVzdAorICAgIC8vICAgICAkIGFudCAtZiBqdW5pdC54bWwgZmFpbHVyZVJlY29yZGVyLmZpeGluZworICAgIC8vICAgICAkIGFudCAtZiBqdW5pdC54bWwgZmFpbHVyZVJlY29yZGVyLnJ1bnRlc3QKKyAgICAvLyAgICAgJCBhbnQgLWYganVuaXQueG1sIGZhaWx1cmVSZWNvcmRlci5ydW50ZXN0CisgICAgLy8gICAgIEJ1dCBydW5uaW5nIHRoZSBKVW5pdCB0ZXN0Y2FzZSBmYWlscyBpbiA0dGggcnVuLgorICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlUmVjb3JkZXIoKSB7CisgICAgICAgIEZpbGUgdGVzdERpciA9IG5ldyBGaWxlKGdldFByb2plY3REaXIoKSwgIm91dCIpOworICAgICAgICBGaWxlIGNvbGxlY3RvckZpbGUgPSBuZXcgRmlsZShnZXRQcm9qZWN0RGlyKCksICJvdXQvRmFpbGVkVGVzdHMuamF2YSIpOworICAgICAgICAKKyAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlcmUgaXMgYSBjbGVhbiB0ZXN0IGVudmlyb25tZW50CisgICAgICAgIGFzc2VydEZhbHNlKCJUZXN0IGRpcmVjdG9yeSAnIiArIHRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiJyBtdXN0IG5vdCBleGlzdCBiZWZvcmUgdGhlIHRlc3QgcHJlcGFyYXRpb24uIiwgCisgICAgICAgICAgICAgICAgdGVzdERpci5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY29sbGVjdG9yIGZpbGUgJyIgKyBjb2xsZWN0b3JGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIidtdXN0IG5vdCBleGlzdCBiZWZvcmUgdGhlIHRlc3QgcHJlcGFyYXRpb24uIiwgCisgICAgICAgICAgICAgICAgY29sbGVjdG9yRmlsZS5leGlzdHMoKSk7CisKKyAgICAgICAgCisgICAgICAgIC8vIHByZXBhcmUgdGhlIHRlc3QgZW52aXJvbm1lbnQKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZmFpbHVyZVJlY29yZGVyLnByZXBhcmUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdCBkaXJlY3RvcnkgJyIgKyB0ZXN0RGlyLmdldEFic29sdXRlUGF0aCgpICsgIicgd2FzIG5vdCBjcmVhdGVkLiIsIHRlc3REaXIuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgb25lIGNsYXNzLiIsIChuZXcgRmlsZSh0ZXN0RGlyLCAiQS5jbGFzcyIpKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY29sbGVjdG9yIGZpbGUgJyIgKyBjb2xsZWN0b3JGaWxlLmdldEFic29sdXRlUGF0aCgpIAorICAgICAgICAgICAgICAgICsgIicgc2hvdWxkIG5vdCBleGlzdCBiZWZvcmUgdGhlIDFzdCBydW4uIiwgY29sbGVjdG9yRmlsZS5leGlzdHMoKSk7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gMXN0IGp1bml0IHJ1bjogc2hvdWxkIGRvIGFsbCB0ZXN0cyAtIGZhaWxpbmcgYW5kIG5vdCBmYWlsaW5nIHRlc3RzCisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImZhaWx1cmVSZWNvcmRlci5ydW50ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjb2xsZWN0b3IgZmlsZSAnIiArIGNvbGxlY3RvckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgCisgICAgICAgICAgICAgICAgKyAiJyBzaG91bGQgZXhpc3QgYWZ0ZXIgdGhlIDFzdCBydW4uIiwgY29sbGVjdG9yRmlsZS5leGlzdHMoKSk7CisgICAgICAgIC8vIHRoZSBwYXNzaW5nIHRlc3QgY2FzZXMKKyAgICAgICAgYXNzZXJ0T3V0cHV0Q29udGFpbmluZygiMXN0IHJ1bjogc2hvdWxkIHJ1biBBLnRlc3QwMSIsICJBLnRlc3QwMSIpOworICAgICAgICBhc3NlcnRPdXRwdXRDb250YWluaW5nKCIxc3QgcnVuOiBzaG91bGQgcnVuIEIudGVzdDA1IiwgIkIudGVzdDA1Iik7CisgICAgICAgIGFzc2VydE91dHB1dENvbnRhaW5pbmcoIjFzdCBydW46IHNob3VsZCBydW4gQi50ZXN0MDYiLCAiQi50ZXN0MDYiKTsKKyAgICAgICAgYXNzZXJ0T3V0cHV0Q29udGFpbmluZygiMXN0IHJ1bjogc2hvdWxkIHJ1biBDLnRlc3QwNyIsICJDLnRlc3QwNyIpOworICAgICAgICBhc3NlcnRPdXRwdXRDb250YWluaW5nKCIxc3QgcnVuOiBzaG91bGQgcnVuIEMudGVzdDA4IiwgIkMudGVzdDA4Iik7CisgICAgICAgIGFzc2VydE91dHB1dENvbnRhaW5pbmcoIjFzdCBydW46IHNob3VsZCBydW4gQy50ZXN0MDkiLCAiQy50ZXN0MDkiKTsKKyAgICAgICAgLy8gdGhlIGZhaWxpbmcgdGVzdCBjYXNlcworICAgICAgICBhc3NlcnRPdXRwdXRDb250YWluaW5nKCIxc3QgcnVuOiBzaG91bGQgcnVuIEEudGVzdDAyIiwgIkEudGVzdDAyIik7CisgICAgICAgIGFzc2VydE91dHB1dENvbnRhaW5pbmcoIjFzdCBydW46IHNob3VsZCBydW4gQS50ZXN0MDMiLCAiQS50ZXN0MDMiKTsKKyAgICAgICAgYXNzZXJ0T3V0cHV0Q29udGFpbmluZygiMXN0IHJ1bjogc2hvdWxkIHJ1biBCLnRlc3QwNCIsICJCLnRlc3QwNCIpOworICAgICAgICBhc3NlcnRPdXRwdXRDb250YWluaW5nKCIxc3QgcnVuOiBzaG91bGQgcnVuIEQudGVzdDEwIiwgIkQudGVzdDEwIik7CisKKyAgICAgICAgCisgICAgICAgIC8vIDJuZCBqdW5pdCBydW46IHNob3VsZCBkbyBvbmx5IGZhaWxpbmcgdGVzdHMKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiZmFpbHVyZVJlY29yZGVyLnJ1bnRlc3QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbGxlY3RvciBmaWxlICciICsgY29sbGVjdG9yRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSAKKyAgICAgICAgICAgICAgICArICInIHNob3VsZCBleGlzdCBhZnRlciB0aGUgMm5kIHJ1bi4iLCBjb2xsZWN0b3JGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgLy8gdGhlIHBhc3NpbmcgdGVzdCBjYXNlcworICAgICAgICBhc3NlcnRPdXRwdXROb3RDb250YWluaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBBLnRlc3QwMSIsICJBLnRlc3QwMSIpOworICAgICAgICBhc3NlcnRPdXRwdXROb3RDb250YWluaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBBLnRlc3QwNSIsICJCLnRlc3QwNSIpOworICAgICAgICBhc3NlcnRPdXRwdXROb3RDb250YWluaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBCLnRlc3QwNiIsICJCLnRlc3QwNiIpOworICAgICAgICBhc3NlcnRPdXRwdXROb3RDb250YWluaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBDLnRlc3QwNyIsICJDLnRlc3QwNyIpOworICAgICAgICBhc3NlcnRPdXRwdXROb3RDb250YWluaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBDLnRlc3QwOCIsICJDLnRlc3QwOCIpOworICAgICAgICBhc3NlcnRPdXRwdXROb3RDb250YWluaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBDLnRlc3QwOSIsICJDLnRlc3QwOSIpOworICAgICAgICAvLyB0aGUgZmFpbGluZyB0ZXN0IGNhc2VzCisgICAgICAgIGFzc2VydE91dHB1dENvbnRhaW5pbmcoIjJuZCBydW46IHNob3VsZCBydW4gQS50ZXN0MDIiLCAiQS50ZXN0MDIiKTsKKyAgICAgICAgYXNzZXJ0T3V0cHV0Q29udGFpbmluZygiMm5kIHJ1bjogc2hvdWxkIHJ1biBBLnRlc3QwMyIsICJBLnRlc3QwMyIpOworICAgICAgICBhc3NlcnRPdXRwdXRDb250YWluaW5nKCIybmQgcnVuOiBzaG91bGQgcnVuIEIudGVzdDA0IiwgIkIudGVzdDA0Iik7CisgICAgICAgIGFzc2VydE91dHB1dENvbnRhaW5pbmcoIjJuZCBydW46IHNob3VsZCBydW4gRC50ZXN0MTAiLCAiRC50ZXN0MTAiKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyAiZml4IiBlcnJvcnMgaW4gY2xhc3MgQQorICAgICAgICBleGVjdXRlVGFyZ2V0KCJmYWlsdXJlUmVjb3JkZXIuZml4aW5nIik7CisgICAgICAgIAorICAgICAgICAvLyAzcmQgcnVuOiBmb3VyIHJ1bm5pbmcgdGVzdHMgd2l0aCB0d28gZXJyb3JzCisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImZhaWx1cmVSZWNvcmRlci5ydW50ZXN0Iik7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjb2xsZWN0b3IgZmlsZSAnIiArIGNvbGxlY3RvckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgCisgICAgICAgICAgICAgICAgKyAiJyBzaG91bGQgZXhpc3QgYWZ0ZXIgdGhlIDNyZCBydW4uIiwgY29sbGVjdG9yRmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydE91dHB1dENvbnRhaW5pbmcoIjNyZCBydW46IHNob3VsZCBydW4gQS50ZXN0MDIiLCAiQS50ZXN0MDIiKTsKKyAgICAgICAgYXNzZXJ0T3V0cHV0Q29udGFpbmluZygiM3JkIHJ1bjogc2hvdWxkIHJ1biBBLnRlc3QwMyIsICJBLnRlc3QwMyIpOworICAgICAgICBhc3NlcnRPdXRwdXRDb250YWluaW5nKCIzcmQgcnVuOiBzaG91bGQgcnVuIEIudGVzdDA0IiwgIkIudGVzdDA0Iik7CisgICAgICAgIGFzc2VydE91dHB1dENvbnRhaW5pbmcoIjNyZCBydW46IHNob3VsZCBydW4gRC50ZXN0MTAiLCAiRC50ZXN0MTAiKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyA0cmQgcnVuOiB0d28gcnVubmluZyB0ZXN0cyB3aXRoIGVycm9ycworICAgICAgICBleGVjdXRlVGFyZ2V0KCJmYWlsdXJlUmVjb3JkZXIucnVudGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY29sbGVjdG9yIGZpbGUgJyIgKyBjb2xsZWN0b3JGaWxlLmdldEFic29sdXRlUGF0aCgpIAorICAgICAgICAgICAgICAgICsgIicgc2hvdWxkIGV4aXN0IGFmdGVyIHRoZSA0dGggcnVuLiIsIGNvbGxlY3RvckZpbGUuZXhpc3RzKCkpOworICAgICAgICAvL1RPRE86IHRoZXNlIHR3byBzdGF0ZW1lbnRzIGZhaWwKKyAgICAgICAgLy9hc3NlcnRPdXRwdXROb3RDb250YWluaW5nKCI0dGggcnVuOiBzaG91bGQgbm90IHJ1biBBLnRlc3QwMiIsICJBLnRlc3QwMiIpOworICAgICAgICAvL2Fzc2VydE91dHB1dE5vdENvbnRhaW5pbmcoIjR0aCBydW46IHNob3VsZCBub3QgcnVuIEEudGVzdDAzIiwgIkEudGVzdDAzIik7CisgICAgICAgIGFzc2VydE91dHB1dENvbnRhaW5pbmcoIjR0aCBydW46IHNob3VsZCBydW4gQi50ZXN0MDQiLCAiQi50ZXN0MDQiKTsKKyAgICAgICAgYXNzZXJ0T3V0cHV0Q29udGFpbmluZygiNHRoIHJ1bjogc2hvdWxkIHJ1biBELnRlc3QxMCIsICJELnRlc3QxMCIpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdEJhdGNoVGVzdEZvcmtPbmNlQ3VzdG9tRm9ybWF0dGVyKCkgeworICAgICAgICBhc3NlcnRSZXN1bHRGaWxlc0V4aXN0KCJ0ZXN0QmF0Y2hUZXN0Rm9ya09uY2VDdXN0b21Gb3JtYXR0ZXIiLCAiZm9vIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlc3VsdEZpbGVzRXhpc3QoU3RyaW5nIHRhcmdldCwgU3RyaW5nIGV4dGVuc2lvbikgeworICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIGFzc2VydFJlc3VsdEZpbGVFeGlzdHMoIkpVbml0Q2xhc3NMb2FkZXIiLCBleHRlbnNpb24pOworICAgICAgICBhc3NlcnRSZXN1bHRGaWxlRXhpc3RzKCJKVW5pdFRlc3RSdW5uZXIiLCBleHRlbnNpb24pOworICAgICAgICBhc3NlcnRSZXN1bHRGaWxlRXhpc3RzKCJKVW5pdFZlcnNpb25IZWxwZXIiLCBleHRlbnNpb24pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXN1bHRGaWxlRXhpc3RzKFN0cmluZyBjbGFzc05hbWVGcmFnbWVudCwgU3RyaW5nIGV4dCkgeworICAgICAgICBhc3NlcnRUcnVlKCJyZXN1bHQgZm9yICIgKyBjbGFzc05hbWVGcmFnbWVudCArICJUZXN0IiArIGV4dCArICIgZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIm91dC9URVNULW9yZy5hcGFjaGUudG9vbHMuYW50LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidGFza2RlZnMub3B0aW9uYWwuanVuaXQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzTmFtZUZyYWdtZW50ICsgIlRlc3QiICsgZXh0KQorICAgICAgICAgICAgICAgICAgIC5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vUHJpbnQoU3RyaW5nIHJlc3VsdCwgU3RyaW5nIHdoZXJlKSB7CisgICAgICAgIGFzc2VydFRydWUod2hlcmUgKyAiICciICsgcmVzdWx0ICsgIicgbXVzdCBub3QgY29udGFpbiBwcmludCBzdGF0ZW1lbnQiLAorICAgICAgICAgICAgICAgICAgIHJlc3VsdC5pbmRleE9mKCJwcmludCB0byBTeXN0ZW0uIikgPT0gLTEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRPdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlUmVhZGVyIGlubmVyID0gbmV3IEZpbGVSZWFkZXIoZ2V0UHJvamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZUZpbGUoInRlc3Rsb2cudHh0IikpOworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaW5uZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGVzdHN1aXRlOiBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5QcmludGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKKyAgICAgICAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobGluZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxpbmUuc3RhcnRzV2l0aCgiVGVzdHMgcnVuOiAxLCBGYWlsdXJlczogMCwgRXJyb3JzOiAwLCBUaW1lIGVsYXBzZWQ6IikpOworICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOworICAgICAgICAgICAgYXNzZXJ0UHJpbnQocmVhZGVyLnJlYWRMaW5lKCksICJzdGF0aWMiLCAib3V0Iik7CisgICAgICAgICAgICBhc3NlcnRQcmludChyZWFkZXIucmVhZExpbmUoKSwgImNvbnN0cnVjdG9yIiwgIm91dCIpOworICAgICAgICAgICAgYXNzZXJ0UHJpbnQocmVhZGVyLnJlYWRMaW5lKCksICJtZXRob2QiLCAib3V0Iik7CisgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOworICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIEVycm9yIC0tLS0tLS0tLS0tLS0tLS0tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKKyAgICAgICAgICAgIGFzc2VydFByaW50KHJlYWRlci5yZWFkTGluZSgpLCAic3RhdGljIiwgImVyciIpOworICAgICAgICAgICAgYXNzZXJ0UHJpbnQocmVhZGVyLnJlYWRMaW5lKCksICJjb25zdHJ1Y3RvciIsICJlcnIiKTsKKyAgICAgICAgICAgIGFzc2VydFByaW50KHJlYWRlci5yZWFkTGluZSgpLCAibWV0aG9kIiwgImVyciIpOworICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKKyAgICAgICAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiIiwgbGluZSk7CisgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGxpbmUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsaW5lLnN0YXJ0c1dpdGgoIlRlc3RjYXNlOiB0ZXN0Tm9DcmFzaCB0b29rICIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlubmVyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UHJpbnQoU3RyaW5nIGxpbmUsIFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKKyAgICAgICAgU3RyaW5nIHNlYXJjaCA9IGZyb20gKyAiIHByaW50IHRvIFN5c3RlbS4iICsgdG87CisgICAgICAgIGFzc2VydEVxdWFscyhzZWFyY2gsIGxpbmUpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RMaXN0ZW5lclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RMaXN0ZW5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM2YWYyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdExpc3RlbmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBKVW5pdFRlc3RMaXN0ZW5lclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIC8vIFRoZSBjYXB0dXJlVG9TdW1tYXJ5IHRlc3Qgd3JpdGVzIHRvIHN0ZG91dCBhbmQgc3RkZXJyLCBnb29kIGZvcgorICAgIC8vIHZlcmlmeWluZyB0aGF0IHRoZSBUZXN0TGlzdGVuZXIgc3VwcG9ydCBkb2Vzbid0IGJyZWFrIGFueXRoaW5nLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTX1RFU1RfVEFSR0VUID0gImNhcHR1cmVUb1N1bW1hcnkiOworCisgICAgLy8gdGVzdE5vQ3Jhc2ggaXMgdGhlIHRlc3QgaW52b2tlZCBieSB0aGUgY2FwdHVyZVRvU3VtbWFyeSdzIGp1bml0IHRhc2sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU19URVNUID0gInRlc3ROb0NyYXNoIjsKKworICAgIHB1YmxpYyBKVW5pdFRlc3RMaXN0ZW5lclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxsTG9nT3V0cHV0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KFBBU1NfVEVTVF9UQVJHRVQpOworICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RpbmcgZnVsbCBsb2cgdG8gaGF2ZSBCdWlsZExpc3RlbmVyIGV2ZW50cyIsIAorICAgICAgICAgICAgICAgICAgIGhhc0J1aWxkTGlzdGVuZXJFdmVudHMoZ2V0RnVsbExvZygpKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0xvZ091dHB1dCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldChQQVNTX1RFU1RfVEFSR0VUKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImV4cGVjdGluZyBsb2cgdG8gbm90IGhhdmUgQnVpbGRMaXN0ZW5lciBldmVudHMiLCAKKyAgICAgICAgICAgICAgICAgICAgaGFzQnVpbGRMaXN0ZW5lckV2ZW50cyhnZXRMb2coKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q291bnRGaXJlZCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldChQQVNTX1RFU1RfVEFSR0VUKTsKKwlhc3NlcnRUcnVlKCJleHBlY3RpbmcgdGVzdCBjb3VudCBtZXNzYWdlIiwKKwkJICAgaGFzRXZlbnRNZXNzYWdlKEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYICsgCisJCQkJICAgInRlc3RzIHRvIHJ1bjogIikpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRUZXN0RmlyZWQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoUEFTU19URVNUX1RBUkdFVCk7CisJYXNzZXJ0VHJ1ZSgiZXhwZWN0aW5nIHRlc3Qgc3RhcnRlZCBtZXNzYWdlIiwKKwkJICAgaGFzRXZlbnRNZXNzYWdlKEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYICsgCisJCQkJICAgInN0YXJ0VGVzdCgiICsgUEFTU19URVNUICsgIikiKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRUZXN0RmlyZWQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoUEFTU19URVNUX1RBUkdFVCk7CisJYXNzZXJ0VHJ1ZSgiZXhwZWN0aW5nIHRlc3QgZW5kZWQgbWVzc2FnZSIsCisJCSAgIGhhc0V2ZW50TWVzc2FnZShKVW5pdFRhc2suVEVTVExJU1RFTkVSX1BSRUZJWCArIAorCQkJCSAgICJlbmRUZXN0KCIgKyBQQVNTX1RFU1QgKyAiKSIpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0J1aWxkTGlzdGVuZXJFdmVudHMoU3RyaW5nIGxvZykgeworICAgICAgICByZXR1cm4gbG9nLmluZGV4T2YoSlVuaXRUYXNrLlRFU1RMSVNURU5FUl9QUkVGSVgpID49IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0V2ZW50TWVzc2FnZShTdHJpbmcgZXZlbnRQcmVmaXgpIHsKKwlyZXR1cm4gZ2V0RnVsbExvZygpLmluZGV4T2YoZXZlbnRQcmVmaXgpID49IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdFJ1bm5lclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RSdW5uZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0ZWJkZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RSdW5uZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogU21hbGwgdGVzdGNhc2UgZm9yIHRoZSBydW5uZXIsIHRlc3RzIGFyZSB2ZXJ5IHZlcnkgdmVyeSBiYXNpY3MuCisgKiBUaGV5IG11c3QgYmUgZW5oYW5jZWQgd2l0aCB0aW1lLgorICoKKyAqLworcHVibGljIGNsYXNzIEpVbml0VGVzdFJ1bm5lclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvLyBtYW5kYXRvcnkgY29uc3RydWN0b3IKKyAgICBwdWJsaWMgSlVuaXRUZXN0UnVubmVyVGVzdChTdHJpbmcgbmFtZSl7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8vIGNoZWNrIHRoYXQgaGF2aW5nIG5vIHN1aXRlIGdlbmVyYXRlcyBubyBlcnJvcnMKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWl0ZSgpeworICAgICAgICBUZXN0UnVubmVyIHJ1bm5lciA9IGNyZWF0ZVJ1bm5lcihOb1N1aXRlVGVzdENhc2UuY2xhc3MpOworICAgICAgICBydW5uZXIucnVuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhydW5uZXIuZ2V0Rm9ybWF0dGVyKCkuZ2V0RXJyb3IoKSwgSlVuaXRUZXN0UnVubmVyLlNVQ0NFU1MsIHJ1bm5lci5nZXRSZXRDb2RlKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIHRoYXQgYSBzdWl0ZSBnZW5lcmF0ZXMgbm8gZXJyb3JzCisgICAgcHVibGljIHZvaWQgdGVzdFN1aXRlKCl7CisgICAgICAgIFRlc3RSdW5uZXIgcnVubmVyID0gY3JlYXRlUnVubmVyKFN1aXRlVGVzdENhc2UuY2xhc3MpOworICAgICAgICBydW5uZXIucnVuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhydW5uZXIuZ2V0Rm9ybWF0dGVyKCkuZ2V0RXJyb3IoKSwgSlVuaXRUZXN0UnVubmVyLlNVQ0NFU1MsIHJ1bm5lci5nZXRSZXRDb2RlKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIHRoYXQgYW4gaW52YWxpZCBzdWl0ZSBnZW5lcmF0ZXMgYW4gZXJyb3IuCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRTdWl0ZSgpeworICAgICAgICBUZXN0UnVubmVyIHJ1bm5lciA9IGNyZWF0ZVJ1bm5lcihJbnZhbGlkU3VpdGVUZXN0Q2FzZS5jbGFzcyk7CisgICAgICAgIHJ1bm5lci5ydW4oKTsKKyAgICAgICAgU3RyaW5nIGVycm9yID0gcnVubmVyLmdldEZvcm1hdHRlcigpLmdldEVycm9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhlcnJvciwgSlVuaXRUZXN0UnVubmVyLkVSUk9SUywgcnVubmVyLmdldFJldENvZGUoKSk7CisgICAgICAgIGFzc2VydFRydWUoZXJyb3IsIGVycm9yLmluZGV4T2YoInRocm93biBvbiBwdXJwb3NlIikgIT0gLTEpOworICAgIH0KKworICAgIC8vIGNoZWNrIHRoYXQgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBhIHRlc3RjYXNlIGdlbmVyYXRlcyBubyBlcnJvcnMKKyAgICAvLyBhdCBmaXJzdCBldmVuIHRob3VnaCB0aGlzIGlzIGluY29ycmVjdC4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UZXN0Q2FzZSgpeworICAgICAgICBUZXN0UnVubmVyIHJ1bm5lciA9IGNyZWF0ZVJ1bm5lcihOb1Rlc3RDYXNlLmNsYXNzKTsKKyAgICAgICAgcnVubmVyLnJ1bigpOworICAgICAgICAvLyBPbiBqdW5pdDMgdGhpcyBpcyBhIEZBSUxVUkUsIG9uIGp1bml0NCB0aGlzIGlzIGFuIEVSUk9SCisgICAgICAgIGludCByZXQgPSBydW5uZXIuZ2V0UmV0Q29kZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKHJldCAhPSBKVW5pdFRlc3RSdW5uZXIuRkFJTFVSRVMgJiYgcmV0ICE9IEpVbml0VGVzdFJ1bm5lci5FUlJPUlMpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgcmVzdWx0ICIgKyByZXQgKyAiIGZyb20ganVuaXQgcnVubmVyIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gSlVuaXQzIHRlc3QKKyAgICAgICAgLy9hc3NlcnRFcXVhbHMocnVubmVyLmdldEZvcm1hdHRlcigpLmdldEVycm9yKCksIEpVbml0VGVzdFJ1bm5lci5GQUlMVVJFUywgcnVubmVyLmdldFJldENvZGUoKSk7CisgICAgfQorCisgICAgLy8gY2hlY2sgdGhhdCBhbiBleGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yIGlzIG5vdGljZWQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRlc3RDYXNlKCl7CisgICAgICAgIFRlc3RSdW5uZXIgcnVubmVyID0gY3JlYXRlUnVubmVyKEludmFsaWRUZXN0Q2FzZS5jbGFzcyk7CisgICAgICAgIHJ1bm5lci5ydW4oKTsKKyAgICAgICAgLy8gT24ganVuaXQzIHRoaXMgaXMgYSBGQUlMVVJFLCBvbiBqdW5pdDQgdGhpcyBpcyBhbiBFUlJPUgorICAgICAgICBpbnQgcmV0ID0gcnVubmVyLmdldFJldENvZGUoKTsKKyAgICAgICAgaWYgKHJldCAhPSBKVW5pdFRlc3RSdW5uZXIuRkFJTFVSRVMgJiYgcmV0ICE9IEpVbml0VGVzdFJ1bm5lci5FUlJPUlMpIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgcmVzdWx0ICIgKyByZXQgKyAiIGZyb20ganVuaXQgcnVubmVyIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gSlVOSVQzIHRlc3QKKyAgICAgICAgLy9hc3NlcnRFcXVhbHMoZXJyb3IsIEpVbml0VGVzdFJ1bm5lci5GQUlMVVJFUywgcnVubmVyLmdldFJldENvZGUoKSk7CisgICAgICAgIC8vQGZpeG1lIGFzIG9mIG5vdyBkb2VzIG5vdCByZXBvcnQgdGhlIG9yaWdpbmFsIHN0YWNrdHJhY2UuCisgICAgICAgIC8vYXNzZXJ0VHJ1ZShlcnJvciwgZXJyb3IuaW5kZXhPZigidGhyb3duIG9uIHB1cnBvc2UiKSAhPSAtMSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFRlc3RSdW5uZXIgY3JlYXRlUnVubmVyKENsYXNzIGNsYXp6KXsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0UnVubmVyKG5ldyBKVW5pdFRlc3QoY2xhenouZ2V0TmFtZSgpKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLy8gdGhlIHRlc3QgcnVubmVyIHRoYXQgd3JhcCB0aGUgZHVtbXkgZm9ybWF0dGVyIHRoYXQgaW50ZXJlc3RzIHVzCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgVGVzdFJ1bm5lciBleHRlbmRzIEpVbml0VGVzdFJ1bm5lciB7CisgICAgICAgIHByaXZhdGUgUmVzdWx0Rm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBSZXN1bHRGb3JtYXR0ZXIoKTsKKyAgICAgICAgVGVzdFJ1bm5lcihKVW5pdFRlc3QgdGVzdCwgYm9vbGVhbiBoYWx0b25lcnJvciwgYm9vbGVhbiBmaWx0ZXJ0cmFjZSwgYm9vbGVhbiBoYWx0b25mYWlsdXJlKXsKKyAgICAgICAgICAgIHN1cGVyKHRlc3QsIGhhbHRvbmVycm9yLCBmaWx0ZXJ0cmFjZSwgIGhhbHRvbmZhaWx1cmUsIFRlc3RSdW5uZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAvLyB1c2UgdGhlIGNsYXNzbG9hZGVyIHRoYXQgbG9hZGVkIHRoaXMgY2xhc3Mgb3RoZXJ3aXNlCisgICAgICAgICAgICAvLyBpdCB3aWxsIG5vdCBiZSBhYmxlIHRvIHJ1biBpbm5lciBjbGFzc2VzIGlmIHRoaXMgdGVzdAorICAgICAgICAgICAgLy8gaXMgcmFuIGluIG5vbi1mb3JrZWQgbW9kZS4KKyAgICAgICAgICAgIGFkZEZvcm1hdHRlcihmb3JtYXR0ZXIpOworICAgICAgICB9CisgICAgICAgIFJlc3VsdEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoKXsKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkdW1teSBmb3JtYXR0ZXIganVzdCB0byBjYXRjaCB0aGUgZXJyb3IKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBSZXN1bHRGb3JtYXR0ZXIgaW1wbGVtZW50cyBKVW5pdFJlc3VsdEZvcm1hdHRlciB7CisgICAgICAgIHByaXZhdGUgVGhyb3dhYmxlIGVycm9yOworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1PdXRwdXQoU3RyaW5nIG91dHB1dCl7fQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1FcnJvcihTdHJpbmcgb3V0cHV0KXt9CisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9ue30KKyAgICAgICAgcHVibGljIHZvaWQgZW5kVGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9ue30KKyAgICAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dCl7fQorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0KSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBlcnJvciA9IHQ7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGdldEVycm9yKCl7CisgICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCl7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgZXJyb3IucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOworICAgICAgICAgICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vVGVzdENhc2UgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW52YWxpZFRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgeworICAgICAgICBwdWJsaWMgSW52YWxpZFRlc3RDYXNlKFN0cmluZyBuYW1lKXsKKyAgICAgICAgICAgIHN1cGVyKG5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0aHJvd24gb24gcHVycG9zZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb1N1aXRlVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgICAgIHB1YmxpYyBOb1N1aXRlVGVzdENhc2UoU3RyaW5nIG5hbWUpeyBzdXBlcihuYW1lKTsgfQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QSgpe30KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1aXRlVGVzdENhc2UgZXh0ZW5kcyBOb1N1aXRlVGVzdENhc2UgeworICAgICAgICBwdWJsaWMgU3VpdGVUZXN0Q2FzZShTdHJpbmcgbmFtZSl7IHN1cGVyKG5hbWUpOyB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3VpdGVUZXN0Q2FzZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludmFsaWRTdWl0ZVRlc3RDYXNlIGV4dGVuZHMgTm9TdWl0ZVRlc3RDYXNlIHsKKyAgICAgICAgcHVibGljIEludmFsaWRTdWl0ZVRlc3RDYXNlKFN0cmluZyBuYW1lKXsgc3VwZXIobmFtZSk7IH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRocm93biBvbiBwdXJwb3NlIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CisgICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihKVW5pdFRlc3RSdW5uZXJUZXN0LmNsYXNzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFZlcnNpb25IZWxwZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRWZXJzaW9uSGVscGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2I4NDAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRWZXJzaW9uSGVscGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgSlVuaXRWZXJzaW9uSGVscGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBKVW5pdFZlcnNpb25IZWxwZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNeU93bk5hbWUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdE15T3duTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICBKVW5pdFZlcnNpb25IZWxwZXIuZ2V0VGVzdENhc2VOYW1lKHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uVGVzdENhc2VOYW1lKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkknbSBhIGZvbyIsCisgICAgICAgICAgICAgICAgICAgICBKVW5pdFZlcnNpb25IZWxwZXIuZ2V0VGVzdENhc2VOYW1lKG5ldyBGb28xKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdHJpbmdSZXR1cm4oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygidW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICBKVW5pdFZlcnNpb25IZWxwZXIuZ2V0VGVzdENhc2VOYW1lKG5ldyBGb28yKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9HZXROYW1lKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoInVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlTmFtZShuZXcgRm9vMygpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVOb3RHZXROYW1lKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkknbSBhIGZvbywgdG9vIiwKKyAgICAgICAgICAgICAgICAgICAgIEpVbml0VmVyc2lvbkhlbHBlci5nZXRUZXN0Q2FzZU5hbWUobmV3IEZvbzQoKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoInVua25vd24iLCBKVW5pdFZlcnNpb25IZWxwZXIuZ2V0VGVzdENhc2VOYW1lKG51bGwpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENhc2VTdWJDbGFzcygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdmVycmlkZGVuIGdldE5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlTmFtZShuZXcgRm9vNSgpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb28gaW1wbGVtZW50cyBUZXN0IHsKKyAgICAgICAgcHVibGljIGludCBjb3VudFRlc3RDYXNlcygpIHtyZXR1cm4gMDt9CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkge30KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvbzEgZXh0ZW5kcyBGb28geworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7cmV0dXJuICJJJ20gYSBmb28iO30KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvbzIgZXh0ZW5kcyBGb28geworICAgICAgICBwdWJsaWMgaW50IGdldE5hbWUoKSB7cmV0dXJuIDE7fQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vMyBleHRlbmRzIEZvbyB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb280IGV4dGVuZHMgRm9vIHsKKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkge3JldHVybiAiSSdtIGEgZm9vLCB0b28iO30KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvbzUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHtyZXR1cm4gIm92ZXJyaWRkZW4gZ2V0TmFtZSI7fQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L05vVm1DcmFzaC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L05vVm1DcmFzaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWVhYjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvTm9WbUNyYXNoLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBOb1ZtQ3Jhc2ggZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgTm9WbUNyYXNoKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NyYXNoKCkgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1ByaW50ZXIuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9QcmludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhY2MxYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9QcmludGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBQcmludGVyIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIFByaW50ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiY29uc3RydWN0b3IgcHJpbnQgdG8gU3lzdGVtLmVyciIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnN0cnVjdG9yIHByaW50IHRvIFN5c3RlbS5vdXQiKTsKKyAgICB9CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInN0YXRpYyBwcmludCB0byBTeXN0ZW0uZXJyIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RhdGljIHByaW50IHRvIFN5c3RlbS5vdXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9DcmFzaCgpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJtZXRob2QgcHJpbnQgdG8gU3lzdGVtLmVyciIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1ldGhvZCBwcmludCB0byBTeXN0ZW0ub3V0Iik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvU2xlZXBlci5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1NsZWVwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJjNzYzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1NsZWVwZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqLworcHVibGljIGNsYXNzIFNsZWVwZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgU2xlZXBlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xlZXAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNSAqIDEwMDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gLy8gZW5kIG9mIHRyeS1jYXRjaAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1N1aXRlTWV0aG9kVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1N1aXRlTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTA5NjYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvU3VpdGVNZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiB2YWxpZGF0ZXMgdGhhdCB0aGUgc3VpdGUoKSBtZXRob2Qgd29ya3MgaW4gY2xhc3NlcyB0aGF0IGRvbid0CisgKiBpbXBsZW1lbnQgVGVzdC4KKyAqLworcHVibGljIGNsYXNzIFN1aXRlTWV0aG9kVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTmVzdGVkKCJ0ZXN0TWV0aG9kIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOZXN0ZWQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgICAgIHB1YmxpYyBOZXN0ZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHN1cGVyKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZCgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvVGVzdEZvcm1hdHRlci5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1Rlc3RGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQyMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1Rlc3RGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgVGVzdEZvcm1hdHRlciBpbXBsZW1lbnRzIEpVbml0UmVzdWx0Rm9ybWF0dGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBncmFmaXR0byA9IG5ldyBieXRlW10geworICAgICAgICAoYnl0ZSkgJ1QnLCAoYnl0ZSkgJ2UnLCAoYnl0ZSkgJ3MnLCAoYnl0ZSkgJ3QnLCAoYnl0ZSkgJ0YnLCAoYnl0ZSkgJ28nLAorICAgICAgICAoYnl0ZSkgJ3InLCAoYnl0ZSkgJ20nLCAoYnl0ZSkgJ2EnLCAoYnl0ZSkgJ3QnLCAoYnl0ZSkgJ3QnLCAoYnl0ZSkgJ2UnLAorICAgICAgICAoYnl0ZSkgJ3InLCAoYnl0ZSkgJyAnLCAoYnl0ZSkgJ3cnLCAoYnl0ZSkgJ2EnLCAoYnl0ZSkgJ3MnLCAoYnl0ZSkgJyAnLAorICAgICAgICAoYnl0ZSkgJ2gnLCAoYnl0ZSkgJ2UnLCAoYnl0ZSkgJ3InLCAoYnl0ZSkgJ2UnLCAxMAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBXaGVyZSB0byB3cml0ZSB0aGUgbG9nIHRvLgorICAgICAqLworICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dDsKKworICAgIC8qKgorICAgICAqIEVtcHR5CisgICAgICovCisgICAgcHVibGljIFRlc3RGb3JtYXR0ZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHsKKyAgICB9CisgICAgLyoqCisgICAgICogRW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0KSB7CisgICAgfQorICAgIC8qKgorICAgICAqIEVtcHR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKKyAgICB9CisgICAgLyoqCisgICAgICogRW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKKyAgICB9CisgICAgLyoqCisgICAgICogRW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgeworICAgIH0KKyAgICAvKioKKyAgICAgKiBFbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKKyAgICB9CisgICAgLyoqCisgICAgICogRW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1PdXRwdXQoU3RyaW5nIG91dCkgeworICAgIH0KKyAgICAvKioKKyAgICAgKiBFbXB0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUVycm9yKFN0cmluZyBlcnIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGdyYWZpdHRvKTsKKyAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBvdXRwdXQiLCBpb2V4KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG91dCAhPSBTeXN0ZW0ub3V0ICYmIG91dCAhPSBTeXN0ZW0uZXJyKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvVm1DcmFzaC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1ZtQ3Jhc2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NmMTdhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1ZtQ3Jhc2guamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqLworcHVibGljIGNsYXNzIFZtQ3Jhc2ggZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgVm1DcmFzaChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Jhc2goKSB7CisgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTEZvcm1hdHRlcldpdGhDREFUQU9uU3lzdGVtT3V0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MRm9ybWF0dGVyV2l0aENEQVRBT25TeXN0ZW1PdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTNmYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTEZvcm1hdHRlcldpdGhDREFUQU9uU3lzdGVtT3V0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCitwdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGVyV2l0aENEQVRBT25TeXN0ZW1PdXQgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBESVIgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQiOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBSRVBPUlQgPQorICAgICAgICAiVEVTVC0iICsgWE1MRm9ybWF0dGVyV2l0aENEQVRBT25TeXN0ZW1PdXQuY2xhc3MuZ2V0TmFtZSgpICsgIi54bWwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRFU1REQVRBID0KKyAgICAgICAgIjxFUlJPUj4iICsKKyAgICAgICAgIjwhW0NEQVRBWzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKworICAgICAgICAiICA8UkVTUE9OU0U+IiArCisgICAgICAgICIgICAgPEdEUy8+IiArCisgICAgICAgICIgICAgPEVSUk9SPiIgKworICAgICAgICAiICAgICAgPElELz4iICsKKyAgICAgICAgIiAgICAgIDxNRVNTQUdFLz4iICsKKyAgICAgICAgIiAgICAgIDxSRVFVRVNUX1RZUEUvPiIgKworICAgICAgICAiICAgICAgPFJFU0VORC8+IiArCisgICAgICAgICIgICAgICA8UkFXX1JFU1BPTlNFLz4iICsKKyAgICAgICAgIiAgICA8L0VSUk9SPiIgKworICAgICAgICAiICA8L1JFU1BPTlNFPiIgKworICAgICAgICAiXV0+IiArCisgICAgICAgICI8L0VSUk9SPiI7CisKKyAgICBwdWJsaWMgWE1MRm9ybWF0dGVyV2l0aENEQVRBT25TeXN0ZW1PdXQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE91dHB1dCgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRFU1REQVRBKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRmaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdChESVIgKyAiL2NkYXRhb3V0cHV0LnhtbCIpOworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJjZGF0YS5pbm5lciIpID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGF2b2lkIGVuZGxlc3MgbG9vcAorICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgicnVuLWp1bml0Iik7CisgICAgICAgICAgICBGaWxlIGYgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoUkVQT1JUKTsKKyAgICAgICAgICAgIEZpbGVSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoZik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBGaWxlVXRpbHMucmVhZEZ1bGx5KHJlYWRlcik7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmluZGV4T2YoIjwvUkVTUE9OU0U+JiN4NWQ7JiN4NWQ7Jmd0OyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI8L0VSUk9SPiIpID4gMCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFBUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU3MjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFBUZXN0LmphdmEKQEAgLTAsMCArMSw4OTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGVmYXVsdExvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmV0cnlIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmV0cnlhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cE1hdGNoZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwTWF0Y2hlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBGVFBUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdHsKKyAgICAvLyBrZWVwIHRyYWNrIG9mIHdoYXQgb3BlcmF0aW5nIHN5c3RlbXMgYXJlIHN1cHBvcnRlZCBoZXJlLgorICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwb3J0c1N5bWxpbmtzID0gT3MuaXNGYW1pbHkoInVuaXgiKTsKKworICAgIHByaXZhdGUgRlRQQ2xpZW50IGZ0cDsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29ubmVjdGlvblN1Y2NlZWRlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGxvZ2luU3VjZWVkZWQgPSB0cnVlOworICAgIHByaXZhdGUgU3RyaW5nIHRtcERpciA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3RlVG1wRGlyID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBmdHBGaWxlU2VwID0gbnVsbDsKKyAgICBwcml2YXRlIG15RlRQIG15RlRQVGFzayA9IG5ldyBteUZUUCgpOworCisgICAgcHVibGljIEZUUFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uZXQvZnRwLnhtbCIpOworICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgic2V0dXAiKTsKKyAgICAgICAgdG1wRGlyID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0bXAuZGlyIik7CisgICAgICAgIGZ0cCA9IG5ldyBGVFBDbGllbnQoKTsKKyAgICAgICAgZnRwRmlsZVNlcCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZnRwLmZpbGVzZXAiKTsKKyAgICAgICAgbXlGVFBUYXNrLnNldFNlcGFyYXRvcihmdHBGaWxlU2VwKTsKKyAgICAgICAgbXlGVFBUYXNrLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgcmVtb3RlVG1wRGlyID0gbXlGVFBUYXNrLnJlc29sdmVGaWxlKHRtcERpcik7CisgICAgICAgIFN0cmluZyByZW1vdGVIb3N0ID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJmdHAuaG9zdCIpOworICAgICAgICBpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJmdHAucG9ydCIpKTsKKyAgICAgICAgU3RyaW5nIHJlbW90ZVVzZXIgPSBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImZ0cC51c2VyIik7CisgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZnRwLnBhc3N3b3JkIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmdHAuY29ubmVjdChyZW1vdGVIb3N0LCBwb3J0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBjb25uZWN0aW9uU3VjY2VlZGVkID0gZmFsc2U7CisgICAgICAgICAgICBsb2dpblN1Y2VlZGVkID0gZmFsc2U7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3QgIiArIHJlbW90ZUhvc3QgKyAiIG9uIHBvcnQgIiArIHBvcnQpOworICAgICAgICB9CisgICAgICAgIGlmIChjb25uZWN0aW9uU3VjY2VlZGVkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZ0cC5sb2dpbihyZW1vdGVVc2VyLCBwYXNzd29yZCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBsb2dpblN1Y2VlZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjb3VsZCBub3QgbG9nIG9uIHRvICIgKyByZW1vdGVIb3N0ICsgIiBhcyB1c2VyICIgKyByZW1vdGVVc2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZnRwLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKyAgICAgICAgZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisgICAgcHJpdmF0ZSBib29sZWFuIGNoYW5nZVJlbW90ZURpcihTdHJpbmcgcmVtb3RlRGlyKSB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZ0cC5jd2QocmVtb3RlRGlyKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNvdWxkIG5vdCBjaGFuZ2UgZGlyZWN0b3J5IHRvICIgKyByZW1vdGVUbXBEaXIpOworICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGlmIChsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICBpZiAoY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpICB7CisgICAgICAgICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYSJ9KTsKKyAgICAgICAgICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgICAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10ge30gLG5ldyBTdHJpbmdbXSB7ImFscGhhIn0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGlmIChsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICBpZiAoY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpIHsKKyAgICAgICAgICAgICAgICBGVFAuRlRQRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CisgICAgICAgICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhLyJ9KTsKKyAgICAgICAgICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgICAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2JldGEueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImFscGhhIiwgImFscGhhL2JldGEiLCAiYWxwaGEvYmV0YS9nYW1tYSJ9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBpZiAobG9naW5TdWNlZWRlZCkgeworICAgICAgICAgICAgaWYgKGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKSB7CisgICAgICAgICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgICAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2JldGEueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImFscGhhIiwgImFscGhhL2JldGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hIn0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZ1bGxQYXRoTWF0Y2hlc0Nhc2VTZW5zaXRpdmUoKSB7CisgICAgICAgIGlmIChsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICBpZiAoY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpIHsKKyAgICAgICAgICAgICAgICBGVFAuRlRQRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CisgICAgICAgICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvR0FNTUEuWE1MIn0pOworICAgICAgICAgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHt9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxsUGF0aE1hdGNoZXNDYXNlSW5zZW5zaXRpdmUoKSB7CisgICAgICAgIGlmIChsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICBpZiAoY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpIHsKKyAgICAgICAgICAgICAgICBGVFAuRlRQRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CisgICAgICAgICAgICAgICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvR0FNTUEuWE1MIn0pOworICAgICAgICAgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7fSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MkJ1dENhc2VJbnNlbnNpdGl2ZSgpIHsKKyAgICAgICAgaWYgKGxvZ2luU3VjZWVkZWQpIHsKKyAgICAgICAgICAgIGlmIChjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSkgeworICAgICAgICAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKKyAgICAgICAgICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiQUxQSEEvIn0pOworICAgICAgICAgICAgICAgIGRzLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOworICAgICAgICAgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvYmV0YS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwifSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiYWxwaGEiLCAiYWxwaGEvYmV0YSIsICJhbHBoYS9iZXRhL2dhbW1hIn0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3QyYmlzQnV0Q2FzZUluc2Vuc2l0aXZlKCkgeworICAgICAgICBpZiAobG9naW5TdWNlZWRlZCkgeworICAgICAgICAgICAgaWYgKGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKSB7CisgICAgICAgICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS9CRVRBL2dhbW1hLyJ9KTsKKyAgICAgICAgICAgICAgICBkcy5zZXRDYXNlU2Vuc2l0aXZlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgICAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hIn0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoU2VsZWN0b3IoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoImZ0cC1nZXQtd2l0aC1zZWxlY3RvciIsCisgICAgICAgICAgICAic2VsZWN0b3JzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHJlbW90ZSBmaWxlc2V0cyIpOworICAgICAgICBGaWxlU2V0IGZzRGVzdGluYXRpb24gPSAoRmlsZVNldCkgZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiZmlsZXNldC1kZXN0aW5hdGlvbi13aXRob3V0LXNlbGVjdG9yIik7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHNEZXN0aW5hdGlvbiA9IGZzRGVzdGluYXRpb24uZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICBkc0Rlc3RpbmF0aW9uLnNjYW4oKTsKKyAgICAgICAgU3RyaW5nIFtdIHNvcnRlZERlc3RpbmF0aW9uRGlyZWN0b3JpZXMgPSBkc0Rlc3RpbmF0aW9uLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgU3RyaW5nIFtdIHNvcnRlZERlc3RpbmF0aW9uRmlsZXMgPSBkc0Rlc3RpbmF0aW9uLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBzb3J0ZWREZXN0aW5hdGlvbkRpcmVjdG9yaWVzLmxlbmd0aDsgY291bnRlcisrKSB7CisgICAgICAgICAgICBzb3J0ZWREZXN0aW5hdGlvbkRpcmVjdG9yaWVzW2NvdW50ZXJdID0KKyAgICAgICAgICAgICAgICBzb3J0ZWREZXN0aW5hdGlvbkRpcmVjdG9yaWVzW2NvdW50ZXJdLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgc29ydGVkRGVzdGluYXRpb25GaWxlcy5sZW5ndGg7IGNvdW50ZXIrKykgeworICAgICAgICAgICAgc29ydGVkRGVzdGluYXRpb25GaWxlc1tjb3VudGVyXSA9CisgICAgICAgICAgICAgICAgc29ydGVkRGVzdGluYXRpb25GaWxlc1tjb3VudGVyXS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlU2V0IGZzU291cmNlID0gIChGaWxlU2V0KSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJmaWxlc2V0LXNvdXJjZS13aXRob3V0LXNlbGVjdG9yIik7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHNTb3VyY2UgPSBmc1NvdXJjZS5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgIGRzU291cmNlLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzU291cmNlLCBzb3J0ZWREZXN0aW5hdGlvbkZpbGVzLCBzb3J0ZWREZXN0aW5hdGlvbkRpcmVjdG9yaWVzKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZvbGxvd1N5bWxpbmtzVHJ1ZSgpIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c1N5bWxpbmtzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJmdHAtZ2V0LWRpcmVjdG9yeS1zeW1ib2xpYy1saW5rIik7CisgICAgICAgIEZpbGVTZXQgZnNEZXN0aW5hdGlvbiA9IChGaWxlU2V0KSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJmaWxlc2V0LWRlc3RpbmF0aW9uLXdpdGhvdXQtc2VsZWN0b3IiKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkc0Rlc3RpbmF0aW9uID0gZnNEZXN0aW5hdGlvbi5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgIGRzRGVzdGluYXRpb24uc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHNEZXN0aW5hdGlvbiwgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwifSwKKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImFscGhhIiwgImFscGhhL2JldGEiLCAiYWxwaGEvYmV0YS9nYW1tYSJ9KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZvbGxvd1N5bWxpbmtzRmFsc2UoKSB7CisgICAgICAgIGlmICghc3VwcG9ydHNTeW1saW5rcykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghbG9naW5TdWNlZWRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZnRwLWdldC1kaXJlY3Rvcnktbm8tc3ltYm9saWMtbGluayIpOworICAgICAgICBGaWxlU2V0IGZzRGVzdGluYXRpb24gPSAoRmlsZVNldCkgZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiZmlsZXNldC1kZXN0aW5hdGlvbi13aXRob3V0LXNlbGVjdG9yIik7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHNEZXN0aW5hdGlvbiA9IGZzRGVzdGluYXRpb24uZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICBkc0Rlc3RpbmF0aW9uLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzRGVzdGluYXRpb24sIG5ldyBTdHJpbmdbXSB7fSwKKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7fSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvd1N5bWxpbmtzKCkgeworICAgICAgICBpZiAoIXN1cHBvcnRzU3ltbGlua3MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWxvZ2luU3VjZWVkZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInN5bWxpbmstc2V0dXAiKTsKKyAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvIn0pOworICAgICAgICBkcy5zZXRGb2xsb3dTeW1saW5rcyh0cnVlKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hIn0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9oaWJpdFN5bWxpbmtzKCkgeworICAgICAgICBpZiAoIXN1cHBvcnRzU3ltbGlua3MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWxvZ2luU3VjZWVkZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInN5bWxpbmstc2V0dXAiKTsKKyAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvIn0pOworICAgICAgICBkcy5zZXRGb2xsb3dTeW1saW5rcyhmYWxzZSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10ge30sIG5ldyBTdHJpbmdbXSB7fSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU3ltbGluaygpIHsKKyAgICAgICAgaWYgKCFzdXBwb3J0c1N5bWxpbmtzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJzeW1saW5rLWZpbGUtc2V0dXAiKTsKKyAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvIn0pOworICAgICAgICBkcy5zZXRGb2xsb3dTeW1saW5rcyh0cnVlKTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn0sCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hIn0pOworICAgIH0KKyAgICAvLyBmYXRoZXIgYW5kIGNoaWxkIHBhdHRlcm4gdGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlck9mSW5jbHVkZVBhdHRlcm5zSXJyZWxldmFudCgpIHsKKyAgICAgICAgaWYgKCFsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBbXSBleHBlY3RlZEZpbGVzID0geyJhbHBoYS9iZXRhL2JldGEueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn07CisgICAgICAgIFN0cmluZyBbXSBleHBlY3RlZERpcmVjdG9yaWVzID0geyJhbHBoYS9iZXRhIiwgImFscGhhL2JldGEvZ2FtbWEiIH07CisgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS9iZT9hLyoqIiwgImFscGhhL2JldGEvZ2FtbWEvIn0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgZXhwZWN0ZWRGaWxlcywgZXhwZWN0ZWREaXJlY3Rvcmllcyk7CisgICAgICAgIC8vIHJlZG8gdGhlIHRlc3QsIGJ1dCB0aGUgMiBpbmNsdWRlIHBhdHRlcm5zIGFyZSBpbnZlcnRlZAorICAgICAgICBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS8iLCAiYWxwaGEvYmU/YS8qKiJ9KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIGV4cGVjdGVkRmlsZXMsIGV4cGVjdGVkRGlyZWN0b3JpZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuc0RpZmZlckluQ2FzZVNjYW5uaW5nU2Vuc2l0aXZlKCkgeworICAgICAgICBpZiAoIWxvZ2luU3VjZWVkZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhLyIsICJBTFBIQS8ifSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2JldGEueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiYWxwaGEiLCAiYWxwaGEvYmV0YSIsICJhbHBoYS9iZXRhL2dhbW1hIn0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuc0RpZmZlckluQ2FzZVNjYW5uaW5nSW5zZW5zaXRpdmUoKSB7CisgICAgICAgIGlmICghbG9naW5TdWNlZWRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGVFAuRlRQRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvIiwgIkFMUEhBLyJ9KTsKKyAgICAgICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZShmYWxzZSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2JldGEueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiYWxwaGEiLCAiYWxwaGEvYmV0YSIsICJhbHBoYS9iZXRhL2dhbW1hIn0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxscGF0aERpZmZlcnNJbkNhc2VTY2FubmluZ1NlbnNpdGl2ZSgpIHsKKyAgICAgICAgaWYgKCFsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIiwKKyAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hL0dBTU1BLlhNTCIKKyAgICAgICAgfSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHt9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbHBhdGhEaWZmZXJzSW5DYXNlU2Nhbm5pbmdJbnNlbnNpdGl2ZSgpIHsKKyAgICAgICAgaWYgKCFsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIiwKKyAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hL0dBTU1BLlhNTCIKKyAgICAgICAgfSk7CisgICAgICAgIGRzLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwifSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7fSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmVudERpZmZlcnNJbkNhc2VTY2FubmluZ1NlbnNpdGl2ZSgpIHsKKyAgICAgICAgaWYgKCFsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8iLCAiQUxQSEEvYmV0YS8ifSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2JldGEueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiYWxwaGEiLCAiYWxwaGEvYmV0YSIsICJhbHBoYS9iZXRhL2dhbW1hIn0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnREaWZmZXJzSW5DYXNlU2Nhbm5pbmdJbnNlbnNpdGl2ZSgpIHsKKyAgICAgICAgaWYgKCFsb2dpblN1Y2VlZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8iLCAiQUxQSEEvYmV0YS8ifSk7CisgICAgICAgIGRzLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9iZXRhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwifSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImFscGhhIiwgImFscGhhL2JldGEiLCAiYWxwaGEvYmV0YS9nYW1tYSJ9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZU9uZUZpbGUoKSB7CisgICAgICAgIGlmICghbG9naW5TdWNlZWRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGVFAuRlRQRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKKyAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICIqKi8qLnhtbCIKKyAgICAgICAgfSk7CisgICAgICAgIGRzLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiYWxwaGEvYmV0YS9iKnhtbCIKKyAgICAgICAgfSk7CisgICAgICAgIGRzLnNjYW4oKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKGRzLCBuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHt9KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVIYXNQcmVjZWRlbmNlKCkgeworICAgICAgICBpZiAoIWxvZ2luU3VjZWVkZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiYWxwaGEvKioiCisgICAgICAgIH0pOworICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhLyoqIgorICAgICAgICB9KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7fSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7fSk7CisKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEFsdGVybmF0ZUluY2x1ZGVFeGNsdWRlKCkgeworICAgICAgICBpZiAoIWxvZ2luU3VjZWVkZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiYWxwaGEvKioiLAorICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvKioiCisgICAgICAgIH0pOworICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhL2JldGEvKioiCisgICAgICAgIH0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHt9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiYWxwaGEifSk7CisKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEFsdGVybmF0ZUV4Y2x1ZGVJbmNsdWRlKCkgeworICAgICAgICBpZiAoIWxvZ2luU3VjZWVkZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOworICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiYWxwaGEvKioiLAorICAgICAgICAgICAgImFscGhhL2JldGEvZ2FtbWEvKioiCisgICAgICAgIH0pOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFscGhhL2JldGEvKioiCisgICAgICAgIH0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHt9LAorICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHt9KTsKKworICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IGluc3BpcmVkIGJ5IEJ1ZyMxNDE1LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbk9mRXhjbHVkZWREaXJlY3RvcnkoKSB7CisgICAgICAgIGlmICghbG9naW5TdWNlZWRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiY2hpbGRyZW4tb2YtZXhjbHVkZWQtZGlyLXNldHVwIik7CisgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOworICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8qKiJ9KTsKKyAgICAgICAgZHMuc2NhbigpOworICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImRlbHRhL2RlbHRhLnhtbCJ9LAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJkZWx0YSJ9KTsKKworICAgICAgICBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CisgICAgICAgIGlmICghY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CisgICAgICAgIGRzLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhIn0pOworICAgICAgICBkcy5zY2FuKCk7CisgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9iZXRhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWx0YS9kZWx0YS54bWwifSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEiLCAiYWxwaGEvYmV0YS9nYW1tYSIsICJkZWx0YSJ9KTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgbG9nIG1lc3NhZ2VzIGFzIGEgd2F5IG9mIHRlc3RpbmcgCisgICAgICogdGhlIG51bWJlciBvZiBmaWxlcyBhY3R1YWxseSB0cmFuc2ZlcnJlZC4KKyAgICAgKiBJdCB1c2VzIHRoZSBhbnQgcmVndWxhciBleHByZXNzaW9uIG1lY2hhbmlzbSB0byBnZXQgYSByZWdleCBwYXJzZXIKKyAgICAgKiB0byBwYXJzZSB0aGUgbG9nIG91dHB1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIENvdW50TG9nTGlzdGVuZXIgZXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHsKKyAgICAgICAgcHJpdmF0ZSBWZWN0b3IgbGFzdE1hdGNoR3JvdXBzID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBSZWdleHBNYXRjaGVyIG1hdGNoZXIgPSBuZXcgUmVnZXhwTWF0Y2hlckZhY3RvcnkoKS5uZXdSZWdleHBNYXRjaGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvbmx5IGNvbnN0cnVjdG9yIGZvciBhIENvdW50TG9nTGlzdGVuZXIKKyAgICAgICAgICogQHBhcmFtIHBhdHRlcm4gYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4gIEl0IHNob3VsZCBoYXZlIAorICAgICAgICAgKiBvbmUgcGFyZW50aGVzaXplZCBncm91cCBhbmQgdGhhdCBncm91cCBzaG91bGQgY29udGFpbiB0aGUKKyAgICAgICAgICogbnVtYmVyIGRlc2lyZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ291bnRMb2dMaXN0ZW5lcihTdHJpbmcgcGF0dGVybikgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMubWF0Y2hlci5zZXRQYXR0ZXJuKHBhdHRlcm4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLyogCisgICAgICAgICAqIEBwYXJhbSBldmVudCB0aGUgYnVpbGQgZXZlbnQgdGhhdCBpcyBiZWluZyBsb2dnZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXZlbnQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hlci5tYXRjaGVzKG1lc3NhZ2UpKSB7CisgICAgICAgICAgICAgICAgbGFzdE1hdGNoR3JvdXBzID0gdGhpcy5tYXRjaGVyLmdldEdyb3VwcyhtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLm1lc3NhZ2VMb2dnZWQoZXZlbnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogcmV0dXJucyB0aGUgZGVzaXJlZCBudW1iZXIgdGhhdCByZXN1bHRzIGZyb20gcGFyc2luZyB0aGUgbG9nCisgICAgICAgICAqIG1lc3NhZ2UKKyAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGVzIGluZGljYXRlZCBpbiB0aGUgZGVzaXJlZCBtZXNzYWdlIG9yIC0xCisgICAgICAgICAqIGlmIGEgbWF0Y2hpbmcgbG9nIG1lc3NhZ2Ugd2FzIG5ldmVyIGZvdW5kLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmxhc3RNYXRjaEdyb3VwcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgdGhpcy5sYXN0TWF0Y2hHcm91cHMuZ2V0KDEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgbG9nIHRvIGNvdW50IHRoZSBudW1iZXIKKyAgICAgKiBvZiB0aW1lcyBhIG1lc3NhZ2UgaGFzIGJlZW4gZW1pdHRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIExvZ0NvdW50ZXIgZXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHsKKyAgICAgICAgcHJpdmF0ZSBNYXAgc2VhcmNoTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbWF0Y2hDb3VudDsKKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRMb2dNZXNzYWdlVG9TZWFyY2goU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHNlYXJjaE1hcC5wdXQobWVzc2FnZSwgbmV3IEludGVnZXIoMCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiAKKyAgICAgICAgICogQHBhcmFtIGV2ZW50IHRoZSBidWlsZCBldmVudCB0aGF0IGlzIGJlaW5nIGxvZ2dlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBldmVudC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBJbnRlZ2VyIG1jbnQgPSAoSW50ZWdlcikgc2VhcmNoTWFwLmdldChtZXNzYWdlKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IG1jbnQpIHsKKyAgICAgICAgICAgICAgICBzZWFyY2hNYXAucHV0KG1lc3NhZ2UsIG5ldyBJbnRlZ2VyKG1jbnQuaW50VmFsdWUoKSArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLm1lc3NhZ2VMb2dnZWQoZXZlbnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIGxvb2tlZCBmb3IgbWVzc2FnZSB3YXMgc2VudCAKKyAgICAgICAgICogdG8gdGhlIGxvZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRNYXRjaENvdW50KFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBJbnRlZ2VyIG1jbnQgPSAoSW50ZWdlcikgc2VhcmNoTWFwLmdldChtZXNzYWdlKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IG1jbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWNudC5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBuZXdlciBwYXJhbWV0ZXIgYW5kIHRoZSAKKyAgICAgKiBzZXJ2ZXJUaW1lem9uZUNvbmZpZyAgcGFyYW1ldGVyIGluIHRoZSBQVVQgYWN0aW9uLiAgVGhlIGRlZmF1bHQgCisgICAgICogY29uZmlndXJhdGlvbiBpcyBhbiBmdHAgc2VydmVyIG9uIGxvY2FsaG9zdCB3aGljaCBmb3JtYXRzIAorICAgICAqIHRpbWVzdGFtcHMgYXMgR01ULgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lem9uZVB1dCgpIHsKKyAgICAgICAgQ291bnRMb2dMaXN0ZW5lciBsb2cgPSBuZXcgQ291bnRMb2dMaXN0ZW5lcigiKFxcZCspIGZpbGVzPyBzZW50Iik7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJ0aW1lZC50ZXN0LnNldHVwIik7CisgICAgICAgIGdldFByb2plY3QoKS5hZGRCdWlsZExpc3RlbmVyKGxvZyk7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJ0aW1lZC50ZXN0LnB1dC5vbGRlciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbG9nLmdldENvdW50KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgbmV3ZXIgcGFyYW1ldGVyIGFuZCB0aGUgCisgICAgICogc2VydmVyVGltZXpvbmVDb25maWcgIHBhcmFtZXRlciBpbiB0aGUgR0VUIGFjdGlvbi4gIFRoZSBkZWZhdWx0IAorICAgICAqIGNvbmZpZ3VyYXRpb24gaXMgYW4gZnRwIHNlcnZlciBvbiBsb2NhbGhvc3Qgd2hpY2ggZm9ybWF0cyAKKyAgICAgKiB0aW1lc3RhbXBzIGFzIEdNVC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZXpvbmVHZXQoKSB7CisgICAgICAgIENvdW50TG9nTGlzdGVuZXIgbG9nID0gbmV3IENvdW50TG9nTGlzdGVuZXIoIihcXGQrKSBmaWxlcz8gcmV0cmlldmVkIik7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJ0aW1lZC50ZXN0LnNldHVwIik7CisgICAgICAgIGdldFByb2plY3QoKS5hZGRCdWlsZExpc3RlbmVyKGxvZyk7CisgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJ0aW1lZC50ZXN0LmdldC5vbGRlciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbG9nLmdldENvdW50KCkpOworICAgIH0KKyAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIHByZXNlbmNlIG9mIG9uZSBvZiB0aGUgc2VydmVyIGNvbmZpZyBwYXJhbXMgZm9yY2VzCisgICAgICogdGhlIHN5c3RlbSB0eXBlIHRvIFVuaXggaWYgbm90IHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbjEoKSB7CisgICAgICAgIGludFtdIGV4cGVjdGVkQ291bnRzID0geworICAgICAgICAgICAgICAgIDEsMSwwLDEsMCwwLDAKKyAgICAgICAgfTsKKyAgICAgICAgcGVyZm9ybUNvbmZpZ1Rlc3QoImNvbmZpZ3VyYXRpb24uMSIsIGV4cGVjdGVkQ291bnRzKTsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIHN5c3RlbVR5cGVLZXkgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uMigpIHsKKyAgICAgICAgaW50W10gZXhwZWN0ZWRDb3VudHMgPSB7CisgICAgICAgICAgICAgICAgMSwwLDAsMSwxLDAsMAorICAgICAgICB9OworICAgICAgICBwZXJmb3JtQ29uZmlnVGVzdCgiY29uZmlndXJhdGlvbi4yIiwgZXhwZWN0ZWRDb3VudHMpOworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgc3lzdGVtVHlwZUtleSBhdHRyaWJ1dGUgd2l0aCBVTklYIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbjMoKSB7CisgICAgICAgIGludFtdIGV4cGVjdGVkQ291bnRzID0geworICAgICAgICAgICAgICAgIDEsMCwxLDAsMCwxLDAKKyAgICAgICAgfTsKKyAgICAgICAgcGVyZm9ybUNvbmZpZ1Rlc3QoImNvbmZpZ3VyYXRpb24uMyIsIGV4cGVjdGVkQ291bnRzKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uTGFuZygpIHsKKyAgICAgICAgaW50W10gZXhwZWN0ZWRDb3VudHMgPSB7CisgICAgICAgICAgICAgICAgMSwxLDAsMCwwLDAsMQorICAgICAgICB9OworICAgICAgICBwZXJmb3JtQ29uZmlnVGVzdCgiY29uZmlndXJhdGlvbi5sYW5nLmdvb2QiLCBleHBlY3RlZENvdW50cyk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcGVyZm9ybUNvbmZpZ1Rlc3QoImNvbmZpZ3VyYXRpb24ubGFuZy5iYWQiLCBleHBlY3RlZENvdW50cyk7CisgICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBFeHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gYngpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnggaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbik7IAorICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBzeXN0ZW1UeXBlS2V5IGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbk5vbmUoKSB7CisgICAgICAgIGludFtdIGV4cGVjdGVkQ291bnRzID0geworICAgICAgICAgICAgICAgIDAsMCwwLDAsMCwwLDAKKyAgICAgICAgfTsKKyAgICAgICAgcGVyZm9ybUNvbmZpZ1Rlc3QoImNvbmZpZ3VyYXRpb24ubm9uZSIsIGV4cGVjdGVkQ291bnRzKTsKKyAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1Db25maWdUZXN0KFN0cmluZyB0YXJnZXQsIGludFtdIGV4cGVjdGVkQ291bnRzKSB7CisgICAgICAgIFN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgICAgICJjdXN0b20gY29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgImN1c3RvbSBjb25maWc6IHN5c3RlbSBrZXkgPSBkZWZhdWx0IChVTklYKSIsCisgICAgICAgICAgICAgICAgImN1c3RvbSBjb25maWc6IHN5c3RlbSBrZXkgPSBVTklYIiwKKyAgICAgICAgICAgICAgICAiY3VzdG9tIGNvbmZpZzogc2VydmVyIHRpbWUgem9uZSBJRCA9ICIgKyBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImZ0cC5zZXJ2ZXIudGltZXpvbmUiKSwKKyAgICAgICAgICAgICAgICAiY3VzdG9tIGNvbmZpZzogc3lzdGVtIGtleSA9IFdJTkRPV1MiLAorICAgICAgICAgICAgICAgICJjdXN0b20gY29uZmlnOiBkZWZhdWx0IGRhdGUgZm9ybWF0ID0geXl5eS9NTS9kZCBISDptbSIsCisgICAgICAgICAgICAgICAgImN1c3RvbSBjb25maWc6IHNlcnZlciBsYW5ndWFnZSBjb2RlID0gZGUiIAorCisgICAgICAgIH07CisgICAgICAgIExvZ0NvdW50ZXIgY291bnRlciA9IG5ldyBMb2dDb3VudGVyKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb3VudGVyLmFkZExvZ01lc3NhZ2VUb1NlYXJjaChtZXNzYWdlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBnZXRQcm9qZWN0KCkuYWRkQnVpbGRMaXN0ZW5lcihjb3VudGVyKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGFyZ2V0ICIrdGFyZ2V0KyI6bWVzc2FnZSAiKyBpLCBleHBlY3RlZENvdW50c1tpXSwgY291bnRlci5nZXRNYXRjaENvdW50KG1lc3NhZ2VzW2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogIHRoaXMgdGVzdCBpcyBpbnNwaXJlZCBieSBhIHVzZXIgcmVwb3J0aW5nIHRoYXQgZGVsZXRpb25zIG9mIGRpcmVjdG9yaWVzIHdpdGggdGhlIGZ0cCB0YXNrIGRvIG5vdCB3b3JrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZUUERlbGV0ZSgpIHsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoImZ0cC1kZWxldGUiKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIGNvbXBhcmVGaWxlcyhEaXJlY3RvcnlTY2FubmVyIGRzLCBTdHJpbmdbXSBleHBlY3RlZEZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWREaXJlY3RvcmllcykgeworICAgICAgICBTdHJpbmcgaW5jbHVkZWRGaWxlc1tdID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICBTdHJpbmcgaW5jbHVkZWREaXJlY3Rvcmllc1tdID0gZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGUgcHJlc2VudDogIiwgZXhwZWN0ZWRGaWxlcy5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZEZpbGVzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGlyZWN0b3JpZXMgcHJlc2VudDogIiwgZXhwZWN0ZWREaXJlY3Rvcmllcy5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZERpcmVjdG9yaWVzLmxlbmd0aCk7CisKKyAgICAgICAgZm9yIChpbnQgY291bnRlcj0wOyBjb3VudGVyIDwgaW5jbHVkZWRGaWxlcy5sZW5ndGg7IGNvdW50ZXIrKykgeworICAgICAgICAgICAgaW5jbHVkZWRGaWxlc1tjb3VudGVyXSA9IGluY2x1ZGVkRmlsZXNbY291bnRlcl0ucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnNvcnQoaW5jbHVkZWRGaWxlcyk7CisgICAgICAgIGZvciAoaW50IGNvdW50ZXI9MDsgY291bnRlciA8IGluY2x1ZGVkRGlyZWN0b3JpZXMubGVuZ3RoOyBjb3VudGVyKyspIHsKKyAgICAgICAgICAgIGluY2x1ZGVkRGlyZWN0b3JpZXNbY291bnRlcl0gPSBpbmNsdWRlZERpcmVjdG9yaWVzW2NvdW50ZXJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworICAgICAgICB9CisgICAgICAgIEFycmF5cy5zb3J0KGluY2x1ZGVkRGlyZWN0b3JpZXMpOworICAgICAgICBmb3IgKGludCBjb3VudGVyPTA7IGNvdW50ZXIgPCBpbmNsdWRlZEZpbGVzLmxlbmd0aDsgY291bnRlcisrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGaWxlc1tjb3VudGVyXSwgaW5jbHVkZWRGaWxlc1tjb3VudGVyXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgY291bnRlcj0wOyBjb3VudGVyIDwgaW5jbHVkZWREaXJlY3Rvcmllcy5sZW5ndGg7IGNvdW50ZXIrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRGlyZWN0b3JpZXNbY291bnRlcl0sIGluY2x1ZGVkRGlyZWN0b3JpZXNbY291bnRlcl0pOworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIG15RlRQIGV4dGVuZHMgRlRQIHsKKyAgICAgICAgcHVibGljIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIG5ld1NjYW5uZXIoRlRQQ2xpZW50IGNsaWVudCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGVFAuRlRQRGlyZWN0b3J5U2Nhbm5lcihjbGllbnQpOworICAgICAgICB9CisgICAgICAgIC8vIHByb3ZpZGUgcHVibGljIHZpc2liaWxpdHkKKyAgICAgICAgcHVibGljIFN0cmluZyByZXNvbHZlRmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVGaWxlKGZpbGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIG15UmV0cnlhYmxlRlRQIGV4dGVuZHMgRlRQIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtYmVyT2ZGYWlsdXJlc1RvU2ltdWxhdGU7CisgICAgICAgIHByaXZhdGUgaW50IHNpbXVsYXRlZEZhaWx1cmVzTGVmdDsKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBteVJldHJ5YWJsZUZUUChpbnQgbnVtYmVyT2ZGYWlsdXJlc1RvU2ltdWxhdGUpIHsKKyAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZGYWlsdXJlc1RvU2ltdWxhdGUgPSBudW1iZXJPZkZhaWx1cmVzVG9TaW11bGF0ZTsKKyAgICAgICAgICAgIHRoaXMuc2ltdWxhdGVkRmFpbHVyZXNMZWZ0ID0gbnVtYmVyT2ZGYWlsdXJlc1RvU2ltdWxhdGU7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBnZXRGaWxlKEZUUENsaWVudCBmdHAsIFN0cmluZyBkaXIsIFN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIAorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcy5zaW11bGF0ZWRGYWlsdXJlc0xlZnQgPiAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zaW11bGF0ZWRGYWlsdXJlc0xlZnQtLTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlNpbXVsYXRlZCBmYWlsdXJlIGZvciB0ZXN0aW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgIHN1cGVyLmdldEZpbGUoZnRwLCBkaXIsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlUmV0cnlhYmxlKFJldHJ5SGFuZGxlciBoLCBSZXRyeWFibGUgciwKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiAKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zaW11bGF0ZWRGYWlsdXJlc0xlZnQgPSB0aGlzLm51bWJlck9mRmFpbHVyZXNUb1NpbXVsYXRlOyAgICAKKyAgICAgICAgICAgIHN1cGVyLmV4ZWN1dGVSZXRyeWFibGUoaCwgciwgZmlsZW5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3Mgb25lRmFpbHVyZUZUUCBleHRlbmRzIG15UmV0cnlhYmxlRlRQIHsKKyAgICAgICAgcHVibGljIG9uZUZhaWx1cmVGVFAoKSB7CisgICAgICAgICAgICBzdXBlcigxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIHR3b0ZhaWx1cmVGVFAgZXh0ZW5kcyBteVJldHJ5YWJsZUZUUCB7CisgICAgICAgIHB1YmxpYyB0d29GYWlsdXJlRlRQKCkgeworICAgICAgICAgICAgc3VwZXIoMik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyB0aHJlZUZhaWx1cmVGVFAgZXh0ZW5kcyBteVJldHJ5YWJsZUZUUCB7CisgICAgICAgIHB1YmxpYyB0aHJlZUZhaWx1cmVGVFAoKSB7CisgICAgICAgICAgICBzdXBlcigzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIHJhbmRvbUZhaWx1cmVGVFAgZXh0ZW5kcyBteVJldHJ5YWJsZUZUUCB7CisgICAgICAgIHB1YmxpYyByYW5kb21GYWlsdXJlRlRQKCkgeworICAgICAgICAgICAgc3VwZXIobmV3IFJhbmRvbSgpLm5leHRJbnQoU2hvcnQuTUFYX1ZBTFVFKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpdGhTZWxlY3RvclJldHJ5YWJsZTEoKSB7CisgICAgICAgIGdldFByb2plY3QoKS5hZGRUYXNrRGVmaW5pdGlvbigiZnRwIiwgb25lRmFpbHVyZUZUUC5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZnRwLWdldC13aXRoLXNlbGVjdG9yLXJldHJ5YWJsZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBieCkgeworICAgICAgICAgICAgZmFpbCgiVHdvIHJldHJpZXMgZXhwZWN0ZWQsIGZhaWxlZCBhZnRlciBvbmUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpdGhTZWxlY3RvclJldHJ5YWJsZTIoKSB7CisgICAgICAgIGdldFByb2plY3QoKS5hZGRUYXNrRGVmaW5pdGlvbigiZnRwIiwgdHdvRmFpbHVyZUZUUC5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZnRwLWdldC13aXRoLXNlbGVjdG9yLXJldHJ5YWJsZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBieCkgeworICAgICAgICAgICAgZmFpbCgiVHdvIHJldHJpZXMgZXhwZWN0ZWQsIGZhaWxlZCBhZnRlciB0d28uIik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpdGhTZWxlY3RvclJldHJ5YWJsZTMoKSB7CisgICAgICAgIGdldFByb2plY3QoKS5hZGRUYXNrRGVmaW5pdGlvbigiZnRwIiwgdGhyZWVGYWlsdXJlRlRQLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJmdHAtZ2V0LXdpdGgtc2VsZWN0b3ItcmV0cnlhYmxlIik7CisgICAgICAgICAgICBmYWlsKCJUd28gcmV0cmllcyBleHBlY3RlZCwgY29udGludWVkIGFmdGVyIHR3by4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYngpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aFNlbGVjdG9yUmV0cnlhYmxlUmFuZG9tKCkgeworICAgICAgICBnZXRQcm9qZWN0KCkuYWRkVGFza0RlZmluaXRpb24oImZ0cCIsIHJhbmRvbUZhaWx1cmVGVFAuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJmdHAucmV0cmllcyIsICJmb3JldmVyIik7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZnRwLWdldC13aXRoLXNlbGVjdG9yLXJldHJ5YWJsZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBieCkgeworICAgICAgICAgICAgZmFpbCgiUmV0cnkgZm9yZXZlciBzcGVjaWZpZWQsIGJ1dCBmYWlsZWQuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDb21tYW5kKCkgeworICAgICAgICBwZXJmb3JtQ29tbWFuZFRlc3QoInRlc3QtaW5pdGlhbC1jb21tYW5kIiwgbmV3IGludFtdIHsgMSwwIH0pOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l0ZUFjdGlvbigpIHsKKyAgICAgICAgcGVyZm9ybUNvbW1hbmRUZXN0KCJ0ZXN0LXNpdGUtYWN0aW9uIiwgbmV3IGludFtdIHsgMSwwIH0pOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUNvbW1hbmRUZXN0KFN0cmluZyB0YXJnZXQsIGludFtdIGV4cGVjdGVkQ291bnRzKSB7CisgICAgICAgIFN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgICAgICJEb2luZyBTaXRlIENvbW1hbmQ6IHVtYXNrIDIyMiIsCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpc3N1ZSBTaXRlIENvbW1hbmQ6IHVtYXNrIDIyMiIsCisKKyAgICAgICAgfTsKKyAgICAgICAgTG9nQ291bnRlciBjb3VudGVyID0gbmV3IExvZ0NvdW50ZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvdW50ZXIuYWRkTG9nTWVzc2FnZVRvU2VhcmNoKG1lc3NhZ2VzW2ldKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIGdldFByb2plY3QoKS5hZGRCdWlsZExpc3RlbmVyKGNvdW50ZXIpOworICAgICAgICBnZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0YXJnZXQgIit0YXJnZXQrIjptZXNzYWdlICIrIGksIGV4cGVjdGVkQ291bnRzW2ldLCBjb3VudGVyLmdldE1hdGNoQ291bnQobWVzc2FnZXNbaV0pKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0Q2hhbmdlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3BlcmZvcmNlL1A0Q2hhbmdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDRhZTgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvUDRDaGFuZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm9yby50ZXh0LnBlcmwuUGVybDVVdGlsOworCisvKioKKyAqIEJhc2ljIHRlc3RjYXNlIHRvIGVuc3VyZSB0aGF0IGJhY2tzbGFzaGluZyBpcyBPSy4KKyAqLworcHVibGljIGNsYXNzIFA0Q2hhbmdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCBQNENoYW5nZSBwNGNoYW5nZTsKKworICAgIHB1YmxpYyBQNENoYW5nZVRlc3QoU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcDRjaGFuZ2UgPSBuZXcgUDRDaGFuZ2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3NsYXNoKCl7CisgICAgICAgIFN0cmluZyBpbnB1dCA9ICJjb21tZW50IHdpdGggYSAvIGluc2lkZSI7CisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBQNENoYW5nZS5iYWNrc2xhc2goaW5wdXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbW1lbnQgd2l0aCBhIFxcLyBpbnNpZGUiLCBvdXRwdXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRlKCl7CisgICAgICAgIFBlcmw1VXRpbCB1dGlsID0gbmV3IFBlcmw1VXRpbCgpOworICAgICAgICBTdHJpbmcgdG9zdWJzdGl0dXRlID0gInh4PGhlcmU+eHgiOworICAgICAgICBTdHJpbmcgaW5wdXQgPSBQNENoYW5nZS5iYWNrc2xhc2goIi9hL2IvYy8iKTsKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHV0aWwuc3Vic3RpdHV0ZSgicy88aGVyZT4vIiArIGlucHV0ICsgIi8iLCB0b3N1YnN0aXR1dGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoInh4L2EvYi9jL3h4Iiwgb3V0cHV0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wZXJmb3JjZS9wNGludGVncmF0ZS54bWwgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvcDRpbnRlZ3JhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTBkOTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcGVyZm9yY2UvcDRpbnRlZ3JhdGUueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBhdXRob3IgQW50b2luZSBMZXZ5LUxhbWJlcnQgbGV2eWxhbWJlcnRAdGlzY2FsaS1kc2wuZGUgLS0+Cis8IS0tIHRoaXMgdGVzdCBkZW1vbnN0cmF0ZXMgcDRpbnRlZ3JhdGUgLS0+Cis8cHJvamVjdCBuYW1lPSJpbnRlZ3JhdGUiIGRlZmF1bHQ9ICJ0ZXN0aW50ZWdyYXRlIj4KKyAgPHByb3BlcnR5IG5hbWU9InNlY29uZF9jbGllbnQiIHZhbHVlPSJsZXZ5YW50X2N5Z3dpbl90ZXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZWNvbmRfY2xpZW50X3Jvb3QiIHZhbHVlPSJDOlxkZXZcdGVzdCIvPgorICA8cHJvcGVydHkgbmFtZT0iZGVwb3RfZmlsZV9zcGVjIiB2YWx1ZT0iLy9kZXBvdC9mb29iYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImRlcG90X2ZpbGVfc3BlY18yIiB2YWx1ZT0iLy9kZXBvdC9oZWxsbyIvPgorICA8dGFyZ2V0IG5hbWU9InRlc3RpbnRlZ3JhdGUiPgorICAgIDxwNGNoYW5nZSBjbGllbnQ9IiR7c2Vjb25kX2NsaWVudH0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2hhbmdlMSIgdmFsdWU9IiR7cDQuY2hhbmdlfSIgLz4KKyAgICA8cDRpbnRlZ3JhdGUgY2xpZW50PSIke3NlY29uZF9jbGllbnR9IiBjaGFuZ2U9IiR7cDQuY2hhbmdlfSIgZnJvbWZpbGU9IiR7ZGVwb3RfZmlsZV9zcGVjfSIgdG9maWxlPSIke2RlcG90X2ZpbGVfc3BlY18yfSIgZm9yY2VpbnRlZ3JhdGU9InRydWUiIC8+CisgICAgPHA0cmVzb2x2ZSAgY2xpZW50PSIke3NlY29uZF9jbGllbnR9IiB2aWV3PSIke2RlcG90X2ZpbGVfc3BlY18yfSIgcmVzb2x2ZW1vZGU9InRoZWlycyIvPgorICAgIDxwNHN1Ym1pdCBjbGllbnQ9IiR7c2Vjb25kX2NsaWVudH0iIGNoYW5nZT0iJHtwNC5jaGFuZ2V9Ii8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9TY3JpcHREZWZUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L1NjcmlwdERlZlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NiMWViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9TY3JpcHREZWZUZXN0LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2NyaXB0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIFRlc3RzIHRoZSBleGFtcGxlcyBvZiB0aGUgJmx0O3NjcmlwdGRlZiZndDsgdGFzay4KKyAqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgU2NyaXB0RGVmVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFNjcmlwdERlZlRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvc2NyaXB0ZGVmLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInNpbXBsZSIpOworICAgICAgICAvLyBnZXQgdGhlIGZpbGVzZXQgYW5kIGl0cyBiYXNlZGlyCisgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgRmlsZVNldCBmaWxlc2V0ID0gKEZpbGVTZXQpIHAuZ2V0UmVmZXJlbmNlKCJ0ZXN0ZmlsZXNldCIpOworICAgICAgICBGaWxlIGJhc2VEaXIgPSBmaWxlc2V0LmdldERpcihwKTsKKyAgICAgICAgU3RyaW5nIGxvZyA9IGdldExvZygpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RpbmcgYXR0cmlidXRlIHZhbHVlIHByaW50ZWQiLAorICAgICAgICAgICAgbG9nLmluZGV4T2YoIkF0dHJpYnV0ZSBhdHRyMSA9IHRlc3QiKSAhPSAtMSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIG5lc3RlZCBlbGVtZW50IHZhbHVlIHByaW50ZWQiLAorICAgICAgICAgICAgbG9nLmluZGV4T2YoIkZpbGVzZXQgYmFzZWRpciA9ICIgKyBiYXNlRGlyLmdldEFic29sdXRlUGF0aCgpKSAhPSAtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vTGFuZygpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJub2xhbmciLAorICAgICAgICAgICAgIkFic2VuY2Ugb2YgbGFuZ3VhZ2UgYXR0cmlidXRlIG5vdCBkZXRlY3RlZCIsCisgICAgICAgICAgICAicmVxdWlyZXMgYSBsYW5ndWFnZSBhdHRyaWJ1dGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9OYW1lKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoIm5vbmFtZSIsCisgICAgICAgICAgICAiQWJzZW5jZSBvZiBuYW1lIGF0dHJpYnV0ZSBub3QgZGV0ZWN0ZWQiLAorICAgICAgICAgICAgInNjcmlwdGRlZiByZXF1aXJlcyBhIG5hbWUgYXR0cmlidXRlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEJ5Q2xhc3NOYW1lKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJuZXN0ZWRieWNsYXNzbmFtZSIpOworICAgICAgICAvLyBnZXQgdGhlIGZpbGVzZXQgYW5kIGl0cyBiYXNlZGlyCisgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgRmlsZVNldCBmaWxlc2V0ID0gKEZpbGVTZXQpIHAuZ2V0UmVmZXJlbmNlKCJ0ZXN0ZmlsZXNldCIpOworICAgICAgICBGaWxlIGJhc2VEaXIgPSBmaWxlc2V0LmdldERpcihwKTsKKyAgICAgICAgU3RyaW5nIGxvZyA9IGdldExvZygpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RpbmcgYXR0cmlidXRlIHZhbHVlIHRvIGJlIHByaW50ZWQiLAorICAgICAgICAgICAgbG9nLmluZGV4T2YoIkF0dHJpYnV0ZSBhdHRyMSA9IHRlc3QiKSAhPSAtMSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIG5lc3RlZCBlbGVtZW50IHZhbHVlIHRvIGJlIHByaW50ZWQiLAorICAgICAgICAgICAgbG9nLmluZGV4T2YoIkZpbGVzZXQgYmFzZWRpciA9ICIgKyBiYXNlRGlyLmdldEFic29sdXRlUGF0aCgpKSAhPSAtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vRWxlbWVudCgpIHsKKyAgICAgICAgZXhwZWN0T3V0cHV0KCJub2VsZW1lbnQiLCAiQXR0cmlidXRlIGF0dHIxID0gdGVzdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygiZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIGluIHRoZSBzY3JpcHQiLAorICAgICAgICAgICAgIlR5cGVFcnJvciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVEZWYoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImRvdWJsZWRlZiIpOworICAgICAgICBTdHJpbmcgbG9nID0gZ2V0TG9nKCk7CisgICAgICAgIGFzc2VydFRydWUoIlRhc2sxIGRpZCBub3QgZXhlY3V0ZSIsCisgICAgICAgICAgICBsb2cuaW5kZXhPZigiVGFzazEiKSAhPSAtMSk7CisgICAgICAgIGFzc2VydFRydWUoIlRhc2syIGRpZCBub3QgZXhlY3V0ZSIsCisgICAgICAgICAgICBsb2cuaW5kZXhPZigiVGFzazIiKSAhPSAtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZUF0dHJpYnV0ZSgpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKCJkb3VibGVBdHRyaWJ1dGVEZWYiLAorICAgICAgICAgICAgIlNob3VsZCBoYXZlIGRldGVjdGVkIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiIsCisgICAgICAgICAgICAiYXR0cjEgYXR0cmlidXRlIG1vcmUgdGhhbiBvbmNlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJwcm9wZXJ0eSIpOworICAgICAgICAvLyBnZXQgdGhlIGZpbGVzZXQgYW5kIGl0cyBiYXNlZGlyCisgICAgICAgIFN0cmluZyBsb2cgPSBnZXRMb2coKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIHByb3BlcnR5IGluIGF0dHJpYnV0ZSB2YWx1ZSByZXBsYWNlZCIsCisgICAgICAgICAgICBsb2cuaW5kZXhPZigiQXR0cmlidXRlIHZhbHVlID0gdGVzdCIpICE9IC0xKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZkZTAwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NUZXN0LmphdmEKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKKy8qKgorICogIFRlc3RjYXNlIHRvIGVuc3VyZSB0aGF0IGNvbW1hbmQgbGluZSBnZW5lcmF0aW9uIGFuZCByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZQorICogIGNvcnJlY3QuCisgKgorICovCitwdWJsaWMgY2xhc3MgU09TVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHJpdmF0ZSBDb21tYW5kbGluZSBjb21tYW5kbGluZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWU1NfU0VSVkVSX1BBVEggPSAiXFxcXHNlcnZlclxcdnNzXFxzcmNzYWZlLmluaSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZTU19QUk9KRUNUX1BBVEggPSAiL1NvdXJjZVJvb3QvUHJvamVjdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERTX1ZTU19QUk9KRUNUX1BBVEggPSAiJC9Tb3VyY2VSb290L1Byb2plY3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT1NfU0VSVkVSX1BBVEggPSAiMTkyLjE2OC4wLjE6ODg4OCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPU19VU0VSTkFNRSA9ICJhbnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT1NfUEFTU1dPUkQgPSAicm9ja3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9QQVRIID0gInRlc3RkaXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkNfRklMRSA9ICJDbGFzczEuamF2YSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQ19MQUJFTCA9ICJsYWJlbDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkNfQ09NTUVOVCA9ICJJIGZpeGVkIGEgYnVnIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09TX0hPTUUgPSAiL2hvbWUvdXNlci8uc29zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIwMDciOworCisgICAgLyoqCisgICAgICogIENvbnN0cnVjdG9yIGZvciB0aGUgU09TVGVzdCBvYmplY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSAgcyAgVGVzdCBuYW1lCisgICAgICovCisgICAgcHVibGljIFNPU1Rlc3QoU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRoZSBKVW5pdCBzZXR1cCBtZXRob2QKKyAgICAgKgorICAgICAqIEB0aHJvd3MgIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOworICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoIi4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgVGhlIHRlYXJkb3duIG1ldGhvZCBmb3IgSlVuaXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZURpcigpLCBMT0NBTF9QQVRIKTsKKyAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogIFRlc3QgU09TR2V0RmlsZSBmbGFncyAmIGNvbW1hbmRsaW5lIGdlbmVyYXRpb24gICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpbGVGbGFncygpIHsKKyAgICAgICAgU3RyaW5nW10gc1Rlc3RDbWRMaW5lID0geyJzb3NjbWQiLCAiLWNvbW1hbmQiLCAiR2V0RmlsZSIsICItZmlsZSIsCisgICAgICAgICAgICAgICAgU1JDX0ZJTEUsICItcmV2aXNpb24iLCAiMDA3IiwgIi1zZXJ2ZXIiLCBTT1NfU0VSVkVSX1BBVEgsICItbmFtZSIsCisgICAgICAgICAgICAgICAgU09TX1VTRVJOQU1FLCAiLXBhc3N3b3JkIiwgU09TX1BBU1NXT1JELCAiLWRhdGFiYXNlIiwgVlNTX1NFUlZFUl9QQVRILAorICAgICAgICAgICAgICAgICItcHJvamVjdCIsIERTX1ZTU19QUk9KRUNUX1BBVEgsICItdmVyYm9zZSIsICItbm9jb21wcmVzcyIsCisgICAgICAgICAgICAgICAgIi1ub2NhY2hlIiwgIi13b3JrZGlyIiwgcHJvamVjdC5nZXRCYXNlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIExPQ0FMX1BBVEh9OworCisgICAgICAgIC8vIFNldCB1cCBhIFNPU0dldCB0YXNrCisgICAgICAgIFNPU0dldCBzb3NHZXQgPSBuZXcgU09TR2V0KCk7CisgICAgICAgIHNvc0dldC5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBzb3NHZXQuc2V0VnNzU2VydmVyUGF0aChWU1NfU0VSVkVSX1BBVEgpOworICAgICAgICBzb3NHZXQuc2V0U29zU2VydmVyUGF0aChTT1NfU0VSVkVSX1BBVEgpOworICAgICAgICBzb3NHZXQuc2V0UHJvamVjdFBhdGgoVlNTX1BST0pFQ1RfUEFUSCk7CisgICAgICAgIHNvc0dldC5zZXRGaWxlKFNSQ19GSUxFKTsKKyAgICAgICAgc29zR2V0LnNldFVzZXJuYW1lKFNPU19VU0VSTkFNRSk7CisgICAgICAgIHNvc0dldC5zZXRQYXNzd29yZChTT1NfUEFTU1dPUkQpOworICAgICAgICBzb3NHZXQuc2V0VmVyc2lvbihWRVJTSU9OKTsKKyAgICAgICAgc29zR2V0LnNldExvY2FsUGF0aChuZXcgUGF0aChwcm9qZWN0LCBMT0NBTF9QQVRIKSk7CisgICAgICAgIHNvc0dldC5zZXROb0NhY2hlKHRydWUpOworICAgICAgICBzb3NHZXQuc2V0Tm9Db21wcmVzcyh0cnVlKTsKKyAgICAgICAgc29zR2V0LnNldFZlcmJvc2UodHJ1ZSk7CisgICAgICAgIHNvc0dldC5zZXRSZWN1cnNpdmUodHJ1ZSk7CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSBzb3NHZXQuYnVpbGRDbWRMaW5lKCk7CisKKyAgICAgICAgY2hlY2tDb21tYW5kTGluZXMoc1Rlc3RDbWRMaW5lLCBjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpKTsKKyAgICB9CisKKyAgICAvKiogIFRlc3QgU09TR2V0UHJvamVjdCBmbGFncyAmIGNvbW1hbmRsaW5lIGdlbmVyYXRpb24gICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFByb2plY3RGbGFncygpIHsKKyAgICAgICAgU3RyaW5nW10gc1Rlc3RDbWRMaW5lID0geyJzb3NjbWQiLCAiLWNvbW1hbmQiLCAiR2V0UHJvamVjdCIsICItcmVjdXJzaXZlIiwKKyAgICAgICAgICAgICAgICAiLWxhYmVsIiwgU1JDX0xBQkVMLCAiLXNlcnZlciIsIFNPU19TRVJWRVJfUEFUSCwgIi1uYW1lIiwgU09TX1VTRVJOQU1FLAorICAgICAgICAgICAgICAgICItcGFzc3dvcmQiLCAiIiwgIi1kYXRhYmFzZSIsIFZTU19TRVJWRVJfUEFUSCwgIi1wcm9qZWN0IiwKKyAgICAgICAgICAgICAgICBEU19WU1NfUFJPSkVDVF9QQVRILCAiIiwgIiIsICItc29zaG9tZSIsIFNPU19IT01FLCAiLXdvcmtkaXIiLAorICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0QmFzZURpcigpLmdldEFic29sdXRlUGF0aCgpfTsKKworICAgICAgICAvLyBTZXQgdXAgYSBTT1NHZXQgdGFzaworICAgICAgICBTT1NHZXQgc29zR2V0ID0gbmV3IFNPU0dldCgpOworICAgICAgICBzb3NHZXQuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgc29zR2V0LnNldFZzc1NlcnZlclBhdGgoVlNTX1NFUlZFUl9QQVRIKTsKKyAgICAgICAgc29zR2V0LnNldFNvc1NlcnZlclBhdGgoU09TX1NFUlZFUl9QQVRIKTsKKyAgICAgICAgc29zR2V0LnNldFByb2plY3RQYXRoKERTX1ZTU19QUk9KRUNUX1BBVEgpOworICAgICAgICBzb3NHZXQuc2V0TGFiZWwoU1JDX0xBQkVMKTsKKyAgICAgICAgc29zR2V0LnNldFVzZXJuYW1lKFNPU19VU0VSTkFNRSk7CisgICAgICAgIHNvc0dldC5zZXRTb3NIb21lKFNPU19IT01FKTsKKyAgICAgICAgc29zR2V0LnNldE5vQ2FjaGUodHJ1ZSk7CisgICAgICAgIHNvc0dldC5zZXROb0NvbXByZXNzKGZhbHNlKTsKKyAgICAgICAgc29zR2V0LnNldFZlcmJvc2UoZmFsc2UpOworICAgICAgICBzb3NHZXQuc2V0UmVjdXJzaXZlKHRydWUpOworCisgICAgICAgIGNvbW1hbmRsaW5lID0gc29zR2V0LmJ1aWxkQ21kTGluZSgpOworCisgICAgICAgIGNoZWNrQ29tbWFuZExpbmVzKHNUZXN0Q21kTGluZSwgY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgfQorCisgICAgLyoqICBUZXN0cyBTT1NHZXQgcmVxdWlyZWQgYXR0cmlidXRlcy4gICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9zb3MueG1sIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2dldC4xIiwgInNvbWUgY2F1c2UiLCAic29zc2VydmVycGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2dldC4yIiwgInNvbWUgY2F1c2UiLCAidXNlcm5hbWUgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NnZXQuMyIsICJzb21lIGNhdXNlIiwgInZzc3NlcnZlcnBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NnZXQuNCIsICJzb21lIGNhdXNlIiwgInByb2plY3RwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICB9CisKKyAgICAvKiogIFRlc3QgQ2hlY2tJbkZpbGUgb3B0aW9uIGZsYWdzICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja2luRmlsZUZsYWdzKCkgeworICAgICAgICBTdHJpbmdbXSBzVGVzdENtZExpbmUgPSB7InNvc2NtZCIsICItY29tbWFuZCIsICJDaGVja0luRmlsZSIsICItZmlsZSIsCisgICAgICAgICAgICAgICAgU1JDX0ZJTEUsICItc2VydmVyIiwgU09TX1NFUlZFUl9QQVRILCAiLW5hbWUiLCBTT1NfVVNFUk5BTUUsCisgICAgICAgICAgICAgICAgIi1wYXNzd29yZCIsIFNPU19QQVNTV09SRCwgIi1kYXRhYmFzZSIsIFZTU19TRVJWRVJfUEFUSCwgIi1wcm9qZWN0IiwKKyAgICAgICAgICAgICAgICBEU19WU1NfUFJPSkVDVF9QQVRILCAiLXZlcmJvc2UiLCAiLW5vY29tcHJlc3MiLCAiLW5vY2FjaGUiLAorICAgICAgICAgICAgICAgICItd29ya2RpciIsIHByb2plY3QuZ2V0QmFzZURpcigpLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgKyBMT0NBTF9QQVRILCAiLWxvZyIsIFNSQ19DT01NRU5UfTsKKworICAgICAgICAvLyBTZXQgdXAgYSBTT1NDaGVja2luIHRhc2sKKyAgICAgICAgU09TQ2hlY2tpbiBzb3NDaGVja2luID0gbmV3IFNPU0NoZWNraW4oKTsKKyAgICAgICAgc29zQ2hlY2tpbi5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBzb3NDaGVja2luLnNldFZzc1NlcnZlclBhdGgoVlNTX1NFUlZFUl9QQVRIKTsKKyAgICAgICAgc29zQ2hlY2tpbi5zZXRTb3NTZXJ2ZXJQYXRoKFNPU19TRVJWRVJfUEFUSCk7CisgICAgICAgIHNvc0NoZWNraW4uc2V0UHJvamVjdFBhdGgoVlNTX1BST0pFQ1RfUEFUSCk7CisgICAgICAgIHNvc0NoZWNraW4uc2V0RmlsZShTUkNfRklMRSk7CisgICAgICAgIHNvc0NoZWNraW4uc2V0Q29tbWVudChTUkNfQ09NTUVOVCk7CisgICAgICAgIHNvc0NoZWNraW4uc2V0VXNlcm5hbWUoU09TX1VTRVJOQU1FKTsKKyAgICAgICAgc29zQ2hlY2tpbi5zZXRQYXNzd29yZChTT1NfUEFTU1dPUkQpOworICAgICAgICBzb3NDaGVja2luLnNldExvY2FsUGF0aChuZXcgUGF0aChwcm9qZWN0LCBMT0NBTF9QQVRIKSk7CisgICAgICAgIHNvc0NoZWNraW4uc2V0Tm9DYWNoZSh0cnVlKTsKKyAgICAgICAgc29zQ2hlY2tpbi5zZXROb0NvbXByZXNzKHRydWUpOworICAgICAgICBzb3NDaGVja2luLnNldFZlcmJvc2UodHJ1ZSk7CisgICAgICAgIHNvc0NoZWNraW4uc2V0UmVjdXJzaXZlKHRydWUpOworCisgICAgICAgIGNvbW1hbmRsaW5lID0gc29zQ2hlY2tpbi5idWlsZENtZExpbmUoKTsKKworICAgICAgICBjaGVja0NvbW1hbmRMaW5lcyhzVGVzdENtZExpbmUsIGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKiAgVGVzdCBDaGVja0luUHJvamVjdCBvcHRpb24gZmxhZ3MgICovCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNraW5Qcm9qZWN0RmxhZ3MoKSB7CisgICAgICAgIFN0cmluZ1tdIHNUZXN0Q21kTGluZSA9IHsic29zY21kIiwgIi1jb21tYW5kIiwgIkNoZWNrSW5Qcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAiLXJlY3Vyc2l2ZSIsICItc2VydmVyIiwgU09TX1NFUlZFUl9QQVRILCAiLW5hbWUiLCBTT1NfVVNFUk5BTUUsCisgICAgICAgICAgICAgICAgIi1wYXNzd29yZCIsICIiLCAiLWRhdGFiYXNlIiwgVlNTX1NFUlZFUl9QQVRILCAiLXByb2plY3QiLAorICAgICAgICAgICAgICAgIERTX1ZTU19QUk9KRUNUX1BBVEgsICIiLCAiIiwgIi1zb3Nob21lIiwgU09TX0hPTUUsICItd29ya2RpciIsCisgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRCYXNlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCksICItbG9nIiwgU1JDX0NPTU1FTlQsfTsKKworICAgICAgICAvLyBTZXQgdXAgYSBTT1NDaGVja2luIHRhc2sKKyAgICAgICAgU09TQ2hlY2tpbiBzb3NDaGVja2luID0gbmV3IFNPU0NoZWNraW4oKTsKKyAgICAgICAgc29zQ2hlY2tpbi5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBzb3NDaGVja2luLnNldFZzc1NlcnZlclBhdGgoVlNTX1NFUlZFUl9QQVRIKTsKKyAgICAgICAgc29zQ2hlY2tpbi5zZXRTb3NTZXJ2ZXJQYXRoKFNPU19TRVJWRVJfUEFUSCk7CisgICAgICAgIHNvc0NoZWNraW4uc2V0UHJvamVjdFBhdGgoRFNfVlNTX1BST0pFQ1RfUEFUSCk7CisgICAgICAgIHNvc0NoZWNraW4uc2V0Q29tbWVudChTUkNfQ09NTUVOVCk7CisgICAgICAgIHNvc0NoZWNraW4uc2V0VXNlcm5hbWUoU09TX1VTRVJOQU1FKTsKKyAgICAgICAgc29zQ2hlY2tpbi5zZXRTb3NIb21lKFNPU19IT01FKTsKKyAgICAgICAgc29zQ2hlY2tpbi5zZXROb0NhY2hlKHRydWUpOworICAgICAgICBzb3NDaGVja2luLnNldE5vQ29tcHJlc3MoZmFsc2UpOworICAgICAgICBzb3NDaGVja2luLnNldFZlcmJvc2UoZmFsc2UpOworICAgICAgICBzb3NDaGVja2luLnNldFJlY3Vyc2l2ZSh0cnVlKTsKKworICAgICAgICBjb21tYW5kbGluZSA9IHNvc0NoZWNraW4uYnVpbGRDbWRMaW5lKCk7CisKKyAgICAgICAgY2hlY2tDb21tYW5kTGluZXMoc1Rlc3RDbWRMaW5lLCBjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpKTsKKyAgICB9CisKKyAgICAvKiogIFRlc3QgU09TQ2hlY2tJbiByZXF1aXJlZCBhdHRyaWJ1dGVzLiAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tpbkV4Y2VwdGlvbnMoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9zb3MueG1sIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNraW4uMSIsICJzb21lIGNhdXNlIiwgInNvc3NlcnZlcnBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NjaGVja2luLjIiLCAic29tZSBjYXVzZSIsICJ1c2VybmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNraW4uMyIsICJzb21lIGNhdXNlIiwgInZzc3NlcnZlcnBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NjaGVja2luLjQiLCAic29tZSBjYXVzZSIsICJwcm9qZWN0cGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgfQorCisgICAgLyoqICBUZXN0IENoZWNrT3V0RmlsZSBvcHRpb24gZmxhZ3MgICovCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrb3V0RmlsZUZsYWdzKCkgeworICAgICAgICBTdHJpbmdbXSBzVGVzdENtZExpbmUgPSB7InNvc2NtZCIsICItY29tbWFuZCIsICJDaGVja091dEZpbGUiLCAiLWZpbGUiLAorICAgICAgICAgICAgICAgIFNSQ19GSUxFLCAiLXNlcnZlciIsIFNPU19TRVJWRVJfUEFUSCwgIi1uYW1lIiwgU09TX1VTRVJOQU1FLAorICAgICAgICAgICAgICAgICItcGFzc3dvcmQiLCBTT1NfUEFTU1dPUkQsICItZGF0YWJhc2UiLCBWU1NfU0VSVkVSX1BBVEgsICItcHJvamVjdCIsCisgICAgICAgICAgICAgICAgRFNfVlNTX1BST0pFQ1RfUEFUSCwgIi12ZXJib3NlIiwgIi1ub2NvbXByZXNzIiwgIi1ub2NhY2hlIiwKKyAgICAgICAgICAgICAgICAiLXdvcmtkaXIiLCBwcm9qZWN0LmdldEJhc2VEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgTE9DQUxfUEFUSH07CisKKyAgICAgICAgLy8gU2V0IHVwIGEgU09TQ2hlY2tvdXQgdGFzaworICAgICAgICBTT1NDaGVja291dCBzb3NDaGVja291dCA9IG5ldyBTT1NDaGVja291dCgpOworICAgICAgICBzb3NDaGVja291dC5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBzb3NDaGVja291dC5zZXRWc3NTZXJ2ZXJQYXRoKFZTU19TRVJWRVJfUEFUSCk7CisgICAgICAgIHNvc0NoZWNrb3V0LnNldFNvc1NlcnZlclBhdGgoU09TX1NFUlZFUl9QQVRIKTsKKyAgICAgICAgc29zQ2hlY2tvdXQuc2V0UHJvamVjdFBhdGgoRFNfVlNTX1BST0pFQ1RfUEFUSCk7CisgICAgICAgIHNvc0NoZWNrb3V0LnNldEZpbGUoU1JDX0ZJTEUpOworICAgICAgICBzb3NDaGVja291dC5zZXRVc2VybmFtZShTT1NfVVNFUk5BTUUpOworICAgICAgICBzb3NDaGVja291dC5zZXRQYXNzd29yZChTT1NfUEFTU1dPUkQpOworICAgICAgICBzb3NDaGVja291dC5zZXRMb2NhbFBhdGgobmV3IFBhdGgocHJvamVjdCwgTE9DQUxfUEFUSCkpOworICAgICAgICBzb3NDaGVja291dC5zZXROb0NhY2hlKHRydWUpOworICAgICAgICBzb3NDaGVja291dC5zZXROb0NvbXByZXNzKHRydWUpOworICAgICAgICBzb3NDaGVja291dC5zZXRWZXJib3NlKHRydWUpOworICAgICAgICBzb3NDaGVja291dC5zZXRSZWN1cnNpdmUodHJ1ZSk7CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSBzb3NDaGVja291dC5idWlsZENtZExpbmUoKTsKKworICAgICAgICBjaGVja0NvbW1hbmRMaW5lcyhzVGVzdENtZExpbmUsIGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKiAgVGVzdCBDaGVja091dFByb2plY3Qgb3B0aW9uIGZsYWdzICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja291dFByb2plY3RGbGFncygpIHsKKyAgICAgICAgU3RyaW5nW10gc1Rlc3RDbWRMaW5lID0geyJzb3NjbWQiLCAiLWNvbW1hbmQiLCAiQ2hlY2tPdXRQcm9qZWN0IiwKKyAgICAgICAgICAgICAgICAiLXJlY3Vyc2l2ZSIsICItc2VydmVyIiwgU09TX1NFUlZFUl9QQVRILCAiLW5hbWUiLCBTT1NfVVNFUk5BTUUsCisgICAgICAgICAgICAgICAgIi1wYXNzd29yZCIsICIiLCAiLWRhdGFiYXNlIiwgVlNTX1NFUlZFUl9QQVRILCAiLXByb2plY3QiLAorICAgICAgICAgICAgICAgIERTX1ZTU19QUk9KRUNUX1BBVEgsICIiLCAiIiwgIi1zb3Nob21lIiwgU09TX0hPTUUsICItd29ya2RpciIsCisgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRCYXNlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCl9OworCisgICAgICAgIC8vIFNldCB1cCBhIHNvc0NoZWNrb3V0IHRhc2sKKyAgICAgICAgU09TQ2hlY2tvdXQgc29zQ2hlY2tvdXQgPSBuZXcgU09TQ2hlY2tvdXQoKTsKKyAgICAgICAgc29zQ2hlY2tvdXQuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgc29zQ2hlY2tvdXQuc2V0VnNzU2VydmVyUGF0aChWU1NfU0VSVkVSX1BBVEgpOworICAgICAgICBzb3NDaGVja291dC5zZXRTb3NTZXJ2ZXJQYXRoKFNPU19TRVJWRVJfUEFUSCk7CisgICAgICAgIHNvc0NoZWNrb3V0LnNldFByb2plY3RQYXRoKFZTU19QUk9KRUNUX1BBVEgpOworICAgICAgICBzb3NDaGVja291dC5zZXRVc2VybmFtZShTT1NfVVNFUk5BTUUpOworICAgICAgICBzb3NDaGVja291dC5zZXRTb3NIb21lKFNPU19IT01FKTsKKyAgICAgICAgc29zQ2hlY2tvdXQuc2V0Tm9DYWNoZSh0cnVlKTsKKyAgICAgICAgc29zQ2hlY2tvdXQuc2V0Tm9Db21wcmVzcyhmYWxzZSk7CisgICAgICAgIHNvc0NoZWNrb3V0LnNldFZlcmJvc2UoZmFsc2UpOworICAgICAgICBzb3NDaGVja291dC5zZXRSZWN1cnNpdmUodHJ1ZSk7CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSBzb3NDaGVja291dC5idWlsZENtZExpbmUoKTsKKworICAgICAgICBjaGVja0NvbW1hbmRMaW5lcyhzVGVzdENtZExpbmUsIGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKiAgVGVzdCBTT1NDaGVja291dCByZXF1aXJlZCBhdHRyaWJ1dGVzLiAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRFeGNlcHRpb25zKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zb3Mvc29zLnhtbCIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NjaGVja291dC4xIiwgInNvbWUgY2F1c2UiLCAic29zc2VydmVycGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNrb3V0LjIiLCAic29tZSBjYXVzZSIsICJ1c2VybmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNrb3V0LjMiLCAic29tZSBjYXVzZSIsICJ2c3NzZXJ2ZXJwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zY2hlY2tvdXQuNCIsICJzb21lIGNhdXNlIiwgInByb2plY3RwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICB9CisKKyAgICAvKiogIFRlc3QgTGFiZWwgb3B0aW9uIGZsYWdzICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMYWJlbEZsYWdzKCkgeworICAgICAgICBTdHJpbmdbXSBzVGVzdENtZExpbmUgPSB7InNvc2NtZCIsICItY29tbWFuZCIsICJBZGRMYWJlbCIsICItc2VydmVyIiwKKyAgICAgICAgICAgICAgICBTT1NfU0VSVkVSX1BBVEgsICItbmFtZSIsIFNPU19VU0VSTkFNRSwgIi1wYXNzd29yZCIsICIiLCAiLWRhdGFiYXNlIiwKKyAgICAgICAgICAgICAgICBWU1NfU0VSVkVSX1BBVEgsICItcHJvamVjdCIsIERTX1ZTU19QUk9KRUNUX1BBVEgsICItbGFiZWwiLAorICAgICAgICAgICAgICAgIFNSQ19MQUJFTCwgIi12ZXJib3NlIiwgIi1sb2ciLCBTUkNfQ09NTUVOVH07CisKKyAgICAgICAgLy8gU2V0IHVwIGEgc29zQ2hlY2tvdXQgdGFzaworICAgICAgICBTT1NMYWJlbCBzb3NMYWJlbCA9IG5ldyBTT1NMYWJlbCgpOworICAgICAgICBzb3NMYWJlbC5zZXRWc3NTZXJ2ZXJQYXRoKFZTU19TRVJWRVJfUEFUSCk7CisgICAgICAgIHNvc0xhYmVsLnNldFNvc1NlcnZlclBhdGgoU09TX1NFUlZFUl9QQVRIKTsKKyAgICAgICAgc29zTGFiZWwuc2V0UHJvamVjdFBhdGgoRFNfVlNTX1BST0pFQ1RfUEFUSCk7CisgICAgICAgIHNvc0xhYmVsLnNldFVzZXJuYW1lKFNPU19VU0VSTkFNRSk7CisgICAgICAgIHNvc0xhYmVsLnNldFNvc0hvbWUoU09TX0hPTUUpOworICAgICAgICBzb3NMYWJlbC5zZXRDb21tZW50KFNSQ19DT01NRU5UKTsKKyAgICAgICAgc29zTGFiZWwuc2V0TGFiZWwoU1JDX0xBQkVMKTsKKyAgICAgICAgc29zTGFiZWwuc2V0Tm9DYWNoZSh0cnVlKTsKKyAgICAgICAgc29zTGFiZWwuc2V0Tm9Db21wcmVzcyhmYWxzZSk7CisgICAgICAgIHNvc0xhYmVsLnNldFZlcmJvc2UodHJ1ZSk7CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSBzb3NMYWJlbC5idWlsZENtZExpbmUoKTsKKworICAgICAgICBjaGVja0NvbW1hbmRMaW5lcyhzVGVzdENtZExpbmUsIGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKiAgVGVzdCBTT1NMYWJlbCByZXF1aXJlZCBhdHRyaWJ1dGVzLiAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxFeGNlcHRpb25zKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zb3Mvc29zLnhtbCIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NsYWJlbC4xIiwgInNvbWUgY2F1c2UiLCAic29zc2VydmVycGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2xhYmVsLjIiLCAic29tZSBjYXVzZSIsICJ1c2VybmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2xhYmVsLjMiLCAic29tZSBjYXVzZSIsICJ2c3NzZXJ2ZXJwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zbGFiZWwuNCIsICJzb21lIGNhdXNlIiwgInByb2plY3RwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zbGFiZWwuNSIsICJzb21lIGNhdXNlIiwgImxhYmVsIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgSXRlcmF0ZSB0aHJvdWdoIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCBsaW5lIGNvbXBhcmluZyBpdCB0byByZWZlcmVuY2UKKyAgICAgKiAgb25lLgorICAgICAqCisgICAgICogQHBhcmFtICBzVGVzdENtZExpbmUgICAgICAgVGhlIHJlZmVyZW5jZSBjb21tYW5kIGxpbmU7CisgICAgICogQHBhcmFtICBzR2VuZXJhdGVkQ21kTGluZSAgVGhlIGdlbmVyYXRlZCBjb21tYW5kIGxpbmU7CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29tbWFuZExpbmVzKFN0cmluZ1tdIHNUZXN0Q21kTGluZSwgU3RyaW5nW10gc0dlbmVyYXRlZENtZExpbmUpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHNUZXN0Q21kTGluZS5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcgIyAiICsgU3RyaW5nLnZhbHVlT2YoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBzVGVzdENtZExpbmVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBzR2VuZXJhdGVkQ21kTGluZVtpXSk7CisgICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2IpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJtaXNzaW5nIGFyZyAiICsgc1Rlc3RDbWRMaW5lW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc0dlbmVyYXRlZENtZExpbmUubGVuZ3RoID4gc1Rlc3RDbWRMaW5lLmxlbmd0aCkgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBleHRyYSBlbGVtZW50cworICAgICAgICAgICAgZmFpbCgiZXh0cmEgYXJncyIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hTY3JlZW5UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3BsYXNoL1NwbGFzaFNjcmVlblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRhODkzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hTY3JlZW5UZXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNwbGFzaDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogVGhpcyBpcyBhbiAiaW50ZXJhY3RpdmUiIHRlc3QsIGl0IHBhc3NlcyBpZiB0aGUgc3BsYXNoIHNjcmVlbgorICogZGlzYXBwZWFycyBhZnRlciB0aGUgImZpbmlzaGVkIiBidXQgYmVmb3JlIHRoZSAiZXhpdGluZyIgbWVzc2FnZS4KKyAqCisgKiBUaGlzIGV2ZW4gaXNuJ3QgYSBKVW5pdCB0ZXN0IGNhc2UuCisgKgorICogQHNpbmNlIEFudCAxLjUuMgorICovCitwdWJsaWMgY2xhc3MgU3BsYXNoU2NyZWVuVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFByb2plY3QgcCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIFNwbGFzaFRhc2sgdCA9IG5ldyBTcGxhc2hUYXNrKCk7CisgICAgICAgIHQuc2V0UHJvamVjdChwKTsKKyAgICAgICAgdC5leGVjdXRlKCk7CisKKyAgICAgICAgLy8gZ2l2ZSBpdCBzb21lIHRpbWUgdG8gZGlzcGxheQorICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCgyMDAwKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9IC8vIGVuZCBvZiB0cnktY2F0Y2gKKworICAgICAgICBwLmZpcmVCdWlsZEZpbmlzaGVkKG51bGwpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImZpbmlzaGVkIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMjAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSAvLyBlbmQgb2YgdHJ5LWNhdGNoCisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZXhpdGluZyIpOworICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMWM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uRmlsZXNNYXRjaDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlbmFtZVNlbGVjdG9yOworCisvKioKKyAqIFRoaXMgaXMgYSB1bml0IHRlc3QgZm9yIHRoZSBTY3AgdGFzayBpbiBBbnQuICBJdCBtdXN0IGJlCisgKiBjb25maWd1cmVkIHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbnMgaW4gb3JkZXIgZm9yIGl0IHRvIHdvcmsuCisgKiBIZXJlIGFyZSB0aGUgb3B0aW9uczoKKyAqCisgKiBzY3AudG1wICAgICAgICAgICAgICBUaGlzIGlzIGEgbG9jYWwgcGF0aCB0byBhIHRlbXBvcmFyeQorICogICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGZvciB0aGlzIHRhc2sgdG8gdXNlLgorICogc2NwLmhvc3QgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcmVtb3RlIGxvY2F0aW9uIG9mIHRoZSBmb3JtOgorICogICAgICAgICAgICAgICAgICAgICAgInVzZXI6cGFzc3dvcmRAaG9zdDovcGF0aC90by9kaXJlY3RvcnkiCisgKiBzY3AucG9ydCAgICAgICAgICAgICBUaGUgcG9ydCBvZiB0aGUgbGlzdGVuaW5nIFNTSCBzZXJ2aWNlLgorICogICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gMjIuICAob3B0aW9uYWwpCisgKiBzY3Aua25vd24uaG9zdHMgICAgICBUaGUgZmlsZSBjb250YWluaW5nIHRoZSBwdWJsaWMga2V5cyBvZiBrbm93bgorICogICAgICAgICAgICAgICAgICAgICAgaG9zdHMuICBNdXN0IGJlIGEgU1NIMiB2ZXJzaW9uIGZpbGUsIGJ1dAorICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgUlNBIGFuZCBEU0Ega2V5cy4gSWYgaXQgaXMgbm90IHByZXNlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGFzayBzZXRUcnVzdCgpIHRvIHRydWUuICAob3B0aW9uYWwpCisgKi8KK3B1YmxpYyBjbGFzcyBTY3BUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBGaWxlIHRlbXBEaXIgPSBuZXcgRmlsZSggU3lzdGVtLmdldFByb3BlcnR5KCJzY3AudG1wIikgKTsKKyAgICBwcml2YXRlIFN0cmluZyBzc2hIb3N0VXJpID0gU3lzdGVtLmdldFByb3BlcnR5KCJzY3AuaG9zdCIpOworICAgIHByaXZhdGUgaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KCBTeXN0ZW0uZ2V0UHJvcGVydHkoICJzY3AucG9ydCIsICIyMiIgKSApOworICAgIHByaXZhdGUgU3RyaW5nIGtub3duSG9zdHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNjcC5rbm93bi5ob3N0cyIpOworCisgICAgcHJpdmF0ZSBMaXN0IGNsZWFuVXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgcHVibGljIFNjcFRlc3QoU3RyaW5nIHRlc3RuYW1lKSB7CisgICAgICAgIHN1cGVyKHRlc3RuYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY2xlYW5VcExpc3QuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZm9yKCBJdGVyYXRvciBpID0gY2xlYW5VcExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gKEZpbGUpIGkubmV4dCgpOworICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVGaWxlVXBsb2FkQW5kRG93bmxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIHVwbG9hZEZpbGUgPSBjcmVhdGVUZW1wb3JhcnlGaWxlKCk7CisKKyAgICAgICAgU2NwIHNjcFRhc2sgPSBjcmVhdGVUYXNrKCk7CisgICAgICAgIHNjcFRhc2suc2V0RmlsZSggdXBsb2FkRmlsZS5nZXRQYXRoKCkgKTsKKyAgICAgICAgc2NwVGFzay5zZXRUb2Rpciggc3NoSG9zdFVyaSApOworICAgICAgICBzY3BUYXNrLmV4ZWN1dGUoKTsKKworICAgICAgICBGaWxlIHRlc3RGaWxlID0gbmV3IEZpbGUoIHRlbXBEaXIuZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICJkb3dubG9hZC10ZXN0U2luZ2xlRmlsZVVwbG9hZEFuZERvd25sb2FkLnRlc3QiICk7CisgICAgICAgIGFkZENsZWFudXAoIHRlc3RGaWxlICk7CisgICAgICAgIGFzc2VydFRydWUoICJBc3NlcnQgdGhhdCB0aGUgdGVzdEZpbGUgZG9lcyBub3QgZXhpc3QuIiwKKyAgICAgICAgICAgICAgICAhdGVzdEZpbGUuZXhpc3RzKCkgKTsKKworICAgICAgICBzY3BUYXNrLnNldEZpbGUoIHNzaEhvc3RVcmkgKyAiLyIgKyB1cGxvYWRGaWxlLmdldE5hbWUoKSApOworICAgICAgICBzY3BUYXNrLnNldFRvZGlyKCB0ZXN0RmlsZS5nZXRQYXRoKCkgKTsKKyAgICAgICAgc2NwVGFzay5leGVjdXRlKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSggIkFzc2VydCB0aGF0IHRoZSB0ZXN0RmlsZSBleGlzdHMuIiwgdGVzdEZpbGUuZXhpc3RzKCkgKTsKKyAgICAgICAgY29tcGFyZUZpbGVzKCB1cGxvYWRGaWxlLCB0ZXN0RmlsZSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVVwbG9hZEFuZERvd25sb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCB1cGxvYWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IDU7IGkrKyApIHsKKyAgICAgICAgICAgIHVwbG9hZExpc3QuYWRkKCBjcmVhdGVUZW1wb3JhcnlGaWxlKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFNjcCBzY3AgPSBjcmVhdGVUYXNrKCk7CisgICAgICAgIEZpbGVuYW1lU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgRmlsZW5hbWVTZWxlY3RvcigpOworICAgICAgICBzZWxlY3Rvci5zZXROYW1lKCAic2NwKiIgKTsKKyAgICAgICAgRmlsZVNldCBmaWxlc2V0ID0gbmV3IEZpbGVTZXQoKTsKKyAgICAgICAgZmlsZXNldC5zZXREaXIoIHRlbXBEaXIgKTsKKyAgICAgICAgZmlsZXNldC5hZGRGaWxlbmFtZSggc2VsZWN0b3IgKTsKKyAgICAgICAgc2NwLmFkZEZpbGVzZXQoIGZpbGVzZXQgKTsKKyAgICAgICAgc2NwLnNldFRvZGlyKCBzc2hIb3N0VXJpICk7CisgICAgICAgIHNjcC5leGVjdXRlKCk7CisKKyAgICAgICAgRmlsZSBtdWx0aSA9IG5ldyBGaWxlKCB0ZW1wRGlyLCAibXVsdGkiICk7CisgICAgICAgIG11bHRpLm1rZGlyKCk7CisgICAgICAgIGFkZENsZWFudXAoIG11bHRpICk7CisKKyAgICAgICAgU2NwIHNjcDIgPSBjcmVhdGVUYXNrKCk7CisgICAgICAgIHNjcDIuc2V0RmlsZSggc3NoSG9zdFVyaSArICIvc2NwKiIgKTsKKyAgICAgICAgc2NwMi5zZXRUb2RpciggbXVsdGkuZ2V0UGF0aCgpICk7CisgICAgICAgIHNjcDIuZXhlY3V0ZSgpOworCisgICAgICAgIEZpbGVzTWF0Y2ggbWF0Y2ggPSBuZXcgRmlsZXNNYXRjaCgpOworICAgICAgICBmb3IoIEl0ZXJhdG9yIGkgPSB1cGxvYWRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIEZpbGUgZiA9IChGaWxlKWkubmV4dCgpOworICAgICAgICAgICAgbWF0Y2guc2V0RmlsZTEoIGYgKTsKKyAgICAgICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZSggbXVsdGksIGYuZ2V0TmFtZSgpICk7CisgICAgICAgICAgICBtYXRjaC5zZXRGaWxlMiggZjIgKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkFzc2VydCBmaWxlICciICsgZi5nZXRQYXRoKCkgKyAiJyBhbmQgZmlsZSAnIiArCisgICAgICAgICAgICAgICAgICAgIGYyLmdldFBhdGgoKSArICInIiwgbWF0Y2guZXZhbCgpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDbGVhbnVwKCBGaWxlIGZpbGUgKSB7CisgICAgICAgIGNsZWFuVXBMaXN0LmFkZCggZmlsZSApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb21wYXJlRmlsZXMoRmlsZSBzcmMsIEZpbGUgZGVzdCkgeworICAgICAgICBGaWxlc01hdGNoIG1hdGNoID0gbmV3IEZpbGVzTWF0Y2goKTsKKyAgICAgICAgbWF0Y2guc2V0RmlsZTEoIHNyYyApOworICAgICAgICBtYXRjaC5zZXRGaWxlMiggZGVzdCApOworCisgICAgICAgIGFzc2VydFRydWUoICJBc3NlcnQgZmlsZXMgYXJlIGVxdWFsLiIsIG1hdGNoLmV2YWwoKSApOworICAgIH0KKworICAgIHByaXZhdGUgRmlsZSBjcmVhdGVUZW1wb3JhcnlGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSB1cGxvYWRGaWxlOworICAgICAgICB1cGxvYWRGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSggInNjcCIsICJ0ZXN0IiwgdGVtcERpciApOworICAgICAgICBGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKCB1cGxvYWRGaWxlICk7CisgICAgICAgIHdyaXRlci53cml0ZSgiQ2FuIHlvdSBoZWFyIG1lIG5vdz9cbiIpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgYWRkQ2xlYW51cCggdXBsb2FkRmlsZSApOworICAgICAgICByZXR1cm4gdXBsb2FkRmlsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNjcCBjcmVhdGVUYXNrKCkgeworICAgICAgICBTY3Agc2NwID0gbmV3IFNjcCgpOworICAgICAgICBQcm9qZWN0IHAgPSBuZXcgUHJvamVjdCgpOworICAgICAgICBwLmluaXQoKTsKKyAgICAgICAgc2NwLnNldFByb2plY3QoIHAgKTsKKyAgICAgICAgaWYoIGtub3duSG9zdHMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHNjcC5zZXRLbm93bmhvc3RzKCBrbm93bkhvc3RzICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzY3Auc2V0VHJ1c3QoIHRydWUgKTsKKyAgICAgICAgfQorICAgICAgICBzY3Auc2V0UG9ydCggcG9ydCApOworICAgICAgICByZXR1cm4gc2NwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L1N5bWxpbmtUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9TeW1saW5rVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjY1YTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9TeW1saW5rVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qCisgKiBTaW5jZSB0aGUgaW5pdGlhbCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB3YXMgZGV2ZW9scGVkIG9uIHRoZSBjbG9jayBvbgorICogYW4gTlNGIGdyYW50IEkgc2hvdWxkIHNheSB0aGUgZm9sbG93aW5nIGJvaWxlcnBsYXRlOgorICoKKyAqIFRoaXMgbWF0ZXJpYWwgaXMgYmFzZWQgdXBvbiB3b3JrIHN1cHBvcnRlZCBieSB0aGUgTmF0aW9uYWwgU2NpZW5jZQorICogRm91bmRhdG9uIHVuZGVyIEdyYW50IE5vLiBFSUEtMDE5NjQwNC4gQW55IG9waW5pb25zLCBmaW5kaW5ncywgYW5kCisgKiBjb25jbHVzaW9ucyBvciByZWNvbW1lbmRhdGlvbnMgZXhwcmVzc2VkIGluIHRoaXMgbWF0ZXJpYWwgYXJlIHRob3NlCisgKiBvZiB0aGUgYXV0aG9yIGFuZCBkbyBub3QgbmVjZXNzYXJpbHkgcmVmbGVjdCB0aGUgdmlld3Mgb2YgdGhlCisgKiBOYXRpb25hbCBTY2llbmNlIEZvdW5kYXRpb24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC51bml4OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIFRlc3QgY2FzZXMgZm9yIHRoZSBTeW1saW5rIHRhc2suIExpbmsgY3JlYXRpb24sIGxpbmsgZGVsZXRpb24sIHJlY29yZGluZworICogb2YgbGlua3MgaW4gbXVsdGlwbGUgZGlyZWN0b3JpZXMsIGFuZCByZXN0b3JhdGlvbiBvZiBsaW5rcyByZWNvcmRlZCBhcmUKKyAqIGFsbCB0ZXN0ZWQuIEEgc2VwYXJhdGUgdGVzdCBmb3IgdGhlIHV0aWxpdHkgbWV0aG9kIFN5bWxpbmsuZGVsZXRlU3ltbGluaworICogaXMgbm90IGluY2x1ZGVkIGJlY2F1c2UgYWN0aW9uPSJkZWxldGUiIG9ubHkgcHJpbnRzIGEgbWVzc2FnZSBhbmQgY2FsbHMKKyAqIFN5bWxpbmsuZGVsZXRlU3ltbGluaywgbWFraW5nIGEgc2VwYXJhdGUgdGVzdCByZWR1bmRhbnQuCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBTeW1saW5rVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHJpdmF0ZSBQcm9qZWN0IHA7CisgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzU3ltbGlua3MgPSBPcy5pc0ZhbWlseSgidW5peCIpOworCisgICAgcHVibGljIFN5bWxpbmtUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBpZiAoc3VwcG9ydHNTeW1saW5rcykgeworICAgICAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9zeW1saW5rLnhtbCIpOworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgic2V0dXAiKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZSgpIHsKKyAgICAgICAgaWYgKHN1cHBvcnRzU3ltbGlua3MpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Qtc2luZ2xlIik7CisgICAgICAgICAgICBwID0gZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5zaW5nbGUuZmlsZS5jcmVhdGVkIikpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGNyZWF0ZSBsaW5rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5zaW5nbGUubGluay5jcmVhdGVkIikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHsKKyAgICAgICAgaWYgKHN1cHBvcnRzU3ltbGlua3MpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QtZGVsZXRlIik7CisgICAgICAgICAgICBwID0gZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgU3RyaW5nIGxpbmtEZWxldGVkID0gcC5nZXRQcm9wZXJ0eSgidGVzdC5kZWxldGUubGluay5zdGlsbC50aGVyZSIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQWN0dWFsIGZpbGUgZGVsZXRlZCBieSBzeW1saW5rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5kZWxldGUuZmlsZS5zdGlsbC50aGVyZSIpKTsKKyAgICAgICAgICAgIGlmIChsaW5rRGVsZXRlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmFpbChsaW5rRGVsZXRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjb3JkKCkgeworICAgICAgICBpZiAoc3VwcG9ydHNTeW1saW5rcykgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdC1yZWNvcmQiKTsKKyAgICAgICAgICAgIHAgPSBnZXRQcm9qZWN0KCk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBjcmVhdGUgZGlyMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjb3JkLmRpcjEuY3JlYXRlZCIpKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGNyZWF0ZSBkaXIyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5yZWNvcmQuZGlyMi5jcmVhdGVkIikpOworCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gY3JlYXRlIGZpbGUxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5yZWNvcmQuZmlsZTEuY3JlYXRlZCIpKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjb3JkLmZpbGUyLmNyZWF0ZWQiKSk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBjcmVhdGUgZmlsZUEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJ0ZXN0LnJlY29yZC5maWxlQS5jcmVhdGVkIikpOworCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gY3JlYXRlIGZpbGVCIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5yZWNvcmQuZmlsZUIuY3JlYXRlZCIpKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlQyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjb3JkLmZpbGVDLmNyZWF0ZWQiKSk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBjcmVhdGUgbGluazEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJ0ZXN0LnJlY29yZC5saW5rMS5jcmVhdGVkIikpOworCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gY3JlYXRlIGxpbmsyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5yZWNvcmQubGluazIuY3JlYXRlZCIpKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGNyZWF0ZSBsaW5rMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjb3JkLmxpbmszLmNyZWF0ZWQiKSk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBjcmVhdGUgZGlybGluayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjb3JkLmRpcmxpbmsuY3JlYXRlZCIpKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIGNyZWF0ZSBkaXJsaW5rMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjb3JkLmRpcmxpbmsyLmNyZWF0ZWQiKSk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkNvdWxkbid0IHJlY29yZCBsaW5rcyBpbiBkaXIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5yZWNvcmQuZGlyMS5yZWNvcmRlZCIpKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ291bGRuJ3QgcmVjb3JkIGxpbmtzIGluIGRpcjIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJ0ZXN0LnJlY29yZC5kaXIyLnJlY29yZGVkIikpOworCisgICAgICAgICAgICBTdHJpbmcgZGlyM3JlYyA9IHAuZ2V0UHJvcGVydHkoInRlc3QucmVjb3JkLmRpcjMucmVjb3JkZWQiKTsKKworICAgICAgICAgICAgaWYgKGRpcjNyZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhaWwoZGlyM3JlYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNyZWF0ZSgpIHsKKyAgICAgICAgaWYgKHN1cHBvcnRzU3ltbGlua3MpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QtcmVjcmVhdGUiKTsKKyAgICAgICAgICAgIHAgPSBnZXRQcm9qZWN0KCk7CisgICAgICAgICAgICBTdHJpbmcgbGluazFSZW0gPSBwLmdldFByb3BlcnR5KCJ0ZXN0LnJlY3JlYXRlLmxpbmsxLm5vdC5yZW1vdmVkIik7CisgICAgICAgICAgICBTdHJpbmcgbGluazJSZW0gPSBwLmdldFByb3BlcnR5KCJ0ZXN0LnJlY3JlYXRlLmxpbmsyLm5vdC5yZW1vdmVkIik7CisgICAgICAgICAgICBTdHJpbmcgbGluazNSZW0gPSBwLmdldFByb3BlcnR5KCJ0ZXN0LnJlY3JlYXRlLmxpbmszLm5vdC5yZW1vdmVkIik7CisgICAgICAgICAgICBTdHJpbmcgZGlybGlua1JlbSA9IHAuZ2V0UHJvcGVydHkoInRlc3QucmVjcmVhdGUuZGlybGluay5ub3QucmVtb3ZlZCIpOworICAgICAgICAgICAgaWYgKGxpbmsxUmVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmYWlsKGxpbmsxUmVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5rMlJlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmFpbChsaW5rMlJlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluazNSZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhaWwobGluazNSZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRpcmxpbmtSZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhaWwoZGlybGlua1JlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVjcmVhdGUgbGluazEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJ0ZXN0LnJlY3JlYXRlLmxpbmsxLnJlY3JlYXRlZCIpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byByZWNyZWF0ZSBsaW5rMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjcmVhdGUubGluazIucmVjcmVhdGVkIikpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIHJlY3JlYXRlIGxpbmszIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5yZWNyZWF0ZS5saW5rMy5yZWNyZWF0ZWQiKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVjcmVhdGUgZGlybGluayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjcmVhdGUuZGlybGluay5yZWNyZWF0ZWQiKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBkb3VibGVSZWNyZWF0ZSA9IHAuZ2V0UHJvcGVydHkoInRlc3QucmVjcmVhdGUuZGlybGluazIucmVjcmVhdGVkLnR3aWNlIik7CisKKyAgICAgICAgICAgIGlmIChkb3VibGVSZWNyZWF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmFpbChkb3VibGVSZWNyZWF0ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBhbHRlciBkaXJsaW5rMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjcmVhdGUuZGlybGluazMud2FzLmFsdGVyZWQiKSk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBpZiAoc3VwcG9ydHNTeW1saW5rcykgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVhcmRvd24iKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5MWQwYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NUZXN0LmphdmEKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkxvY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHN0YW1wOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKKy8qKgorICogIFRlc3RjYXNlIHRvIGVuc3VyZSB0aGF0IGNvbW1hbmQgbGluZSBnZW5lcmF0aW9uIGFuZCByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZSBjb3JyZWN0LgorICoKKyAqLworcHVibGljIGNsYXNzIE1TVlNTVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgaW1wbGVtZW50cyBNU1ZTU0NvbnN0YW50cyB7CisKKyAgICBwcml2YXRlIENvbW1hbmRsaW5lIGNvbW1hbmRsaW5lOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZTU19TRVJWRVJfUEFUSCA9ICJcXFxcc2VydmVyXFx2c3NcXHNyY3NhZmUuaW5pIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVlNTX1BST0pFQ1RfUEFUSCA9ICIvU291cmNlUm9vdC9Qcm9qZWN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFNfVlNTX1BST0pFQ1RfUEFUSCA9ICIkL1NvdXJjZVJvb3QvUHJvamVjdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZTU19VU0VSTkFNRSA9ICJhbnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWU1NfUEFTU1dPUkQgPSAicm9ja3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9QQVRIID0gInRlc3RkaXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkNfRklMRSA9ICJDbGFzczEuamF2YSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQ19MQUJFTCA9ICJsYWJlbDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX0xBQkVMID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQ19DT01NRU5UID0gIkkgZml4ZWQgYSBidWciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gIjAwNyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiMDAtMDAtMDAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFMiA9ICIwMS0wMS0wMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVCA9ICJvdXRwdXQubG9nIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NfRElSID0gImM6L3dpbm50Ii5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKworICAgIC8qKgorICAgICAqICBDb25zdHJ1Y3RvciBmb3IgdGhlIE1TVlNTVGVzdCBvYmplY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSAgcyAgVGVzdCBuYW1lCisgICAgICovCisgICAgcHVibGljIE1TVlNTVGVzdChTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgVGhlIEpVbml0IHNldHVwIG1ldGhvZAorICAgICAqCisgICAgICogQHRocm93cyAgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcigiLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBUaGUgdGVhcmRvd24gbWV0aG9kIGZvciBKVW5pdAorICAgICAqCisgICAgICogQHRocm93cyAgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocHJvamVjdC5nZXRCYXNlRGlyKCksIExPQ0FMX1BBVEgpOworICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiAgVGVzdHMgVlNTR2V0IGNvbW1hbmRsaW5lIGdlbmVyYXRpb24uICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb21tYW5kTGluZSgpIHsKKyAgICAgICAgU3RyaW5nW10gc1Rlc3RDbWRMaW5lID0ge01TVlNTLlNTX0VYRSwgTVNWU1MuQ09NTUFORF9HRVQsIERTX1ZTU19QUk9KRUNUX1BBVEgsCisgICAgICAgICAgICAgICAgTVNWU1MuRkxBR19PVkVSUklERV9XT1JLSU5HX0RJUiArIHByb2plY3QuZ2V0QmFzZURpcigpLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBMT0NBTF9QQVRILCBNU1ZTUy5GTEFHX0FVVE9SRVNQT05TRV9ERUYsCisgICAgICAgICAgICAgICAgTVNWU1MuRkxBR19SRUNVUlNJT04sIE1TVlNTLkZMQUdfVkVSU0lPTiArIFZFUlNJT04sIE1TVlNTLkZMQUdfTE9HSU4KKyAgICAgICAgICAgICAgICAgKyBWU1NfVVNFUk5BTUUgKyAiLCIgKyBWU1NfUEFTU1dPUkQsIEZMQUdfRklMRVRJTUVfVVBEQVRFRCwgRkxBR19TS0lQX1dSSVRBQkxFfTsKKworICAgICAgICAvLyBTZXQgdXAgYSBWU1NHZXQgdGFzaworICAgICAgICBNU1ZTU0dFVCB2c3NHZXQgPSBuZXcgTVNWU1NHRVQoKTsKKyAgICAgICAgdnNzR2V0LnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIHZzc0dldC5zZXRSZWN1cnNpdmUodHJ1ZSk7CisgICAgICAgIHZzc0dldC5zZXRMb2NhbHBhdGgobmV3IFBhdGgocHJvamVjdCwgTE9DQUxfUEFUSCkpOworICAgICAgICB2c3NHZXQuc2V0TG9naW4oVlNTX1VTRVJOQU1FICsgIiwiICsgVlNTX1BBU1NXT1JEKTsKKyAgICAgICAgdnNzR2V0LnNldFZlcnNpb24oVkVSU0lPTik7CisgICAgICAgIHZzc0dldC5zZXRRdWlldChmYWxzZSk7CisgICAgICAgIHZzc0dldC5zZXREYXRlKERBVEUpOworICAgICAgICB2c3NHZXQuc2V0TGFiZWwoU1JDX0xBQkVMKTsKKyAgICAgICAgdnNzR2V0LnNldFZzc3BhdGgoVlNTX1BST0pFQ1RfUEFUSCk7CisgICAgICAgIE1TVlNTLkN1cnJlbnRNb2RVcGRhdGVkIGNtdSA9IG5ldyBNU1ZTUy5DdXJyZW50TW9kVXBkYXRlZCgpOworICAgICAgICBjbXUuc2V0VmFsdWUoVElNRV9VUERBVEVEKTsKKyAgICAgICAgdnNzR2V0LnNldEZpbGVUaW1lU3RhbXAoY211KTsKKyAgICAgICAgTVNWU1MuV3JpdGFibGVGaWxlcyB3ZiA9IG5ldyBNU1ZTUy5Xcml0YWJsZUZpbGVzKCk7CisgICAgICAgIHdmLnNldFZhbHVlKFdSSVRBQkxFX1NLSVApOworICAgICAgICB2c3NHZXQuc2V0V3JpdGFibGVGaWxlcyh3Zik7CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSB2c3NHZXQuYnVpbGRDbWRMaW5lKCk7CisKKyAgICAgICAgY2hlY2tDb21tYW5kTGluZXMoc1Rlc3RDbWRMaW5lLCBjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpKTsKKyAgICB9CisKKyAgICAvKiogIFRlc3RzIFZTU0dldCByZXF1aXJlZCBhdHRyaWJ1dGVzLiAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9ucygpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzZ2V0LjEiLCAic29tZSBjYXVzZSIsICJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICB9CisKKyAgICAvKiogIFRlc3RzIExhYmVsIGNvbW1hbmRsaW5lIGdlbmVyYXRpb24uICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMYWJlbENvbW1hbmRMaW5lMSgpIHsKKyAgICAgICAgU3RyaW5nW10gc1Rlc3RDbWRMaW5lID0ge01TVlNTLlNTX0VYRSwgTVNWU1MuQ09NTUFORF9MQUJFTCwgRFNfVlNTX1BST0pFQ1RfUEFUSCwKKyAgICAgICAgICAgICAgICBNU1ZTUy5GTEFHX0NPTU1FTlQgKyBTUkNfQ09NTUVOVCwgTVNWU1MuRkxBR19BVVRPUkVTUE9OU0VfWUVTLAorICAgICAgICAgICAgICAgIE1TVlNTLkZMQUdfTEFCRUwgKyBTUkNfTEFCRUwsIE1TVlNTLkZMQUdfVkVSU0lPTiArIFZFUlNJT04sIE1TVlNTLkZMQUdfTE9HSU4KKyAgICAgICAgICAgICAgICAgKyBWU1NfVVNFUk5BTUUgKyAiLCIgKyBWU1NfUEFTU1dPUkR9OworCisgICAgICAgIC8vIFNldCB1cCBhIFZTU0xhYmVsIHRhc2sKKyAgICAgICAgTVNWU1NMQUJFTCB2c3NMYWJlbCA9IG5ldyBNU1ZTU0xBQkVMKCk7CisgICAgICAgIHZzc0xhYmVsLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIHZzc0xhYmVsLnNldENvbW1lbnQoU1JDX0NPTU1FTlQpOworICAgICAgICB2c3NMYWJlbC5zZXRMb2dpbihWU1NfVVNFUk5BTUUgKyAiLCIgKyBWU1NfUEFTU1dPUkQpOworICAgICAgICB2c3NMYWJlbC5zZXRWZXJzaW9uKFZFUlNJT04pOworICAgICAgICB2c3NMYWJlbC5zZXRBdXRvcmVzcG9uc2UoIlkiKTsKKyAgICAgICAgdnNzTGFiZWwuc2V0TGFiZWwoU1JDX0xBQkVMKTsKKyAgICAgICAgdnNzTGFiZWwuc2V0VnNzcGF0aChWU1NfUFJPSkVDVF9QQVRIKTsKKworICAgICAgICBjb21tYW5kbGluZSA9IHZzc0xhYmVsLmJ1aWxkQ21kTGluZSgpOworCisgICAgICAgIGNoZWNrQ29tbWFuZExpbmVzKHNUZXN0Q21kTGluZSwgY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgfQorCisgICAgLyoqICBUZXN0cyBMYWJlbCBjb21tYW5kbGluZSBnZW5lcmF0aW9uIHdpdGggYSBsYWJlbCBvZiBtb3JlIHRoYW4gMzEgY2hhcnMuICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMYWJlbENvbW1hbmRMaW5lMigpIHsKKyAgICAgICAgU3RyaW5nW10gc1Rlc3RDbWRMaW5lID0ge01TVlNTLlNTX0VYRSwgTVNWU1MuQ09NTUFORF9MQUJFTCwgRFNfVlNTX1BST0pFQ1RfUEFUSCwKKyAgICAgICAgICAgICAgICBNU1ZTUy5GTEFHX0NPTU1FTlQgKyBTUkNfQ09NTUVOVCwgTVNWU1MuRkxBR19BVVRPUkVTUE9OU0VfREVGLAorICAgICAgICAgICAgICAgIE1TVlNTLkZMQUdfTEFCRUwgKyBMT05HX0xBQkVMLAorICAgICAgICAgICAgICAgIE1TVlNTLkZMQUdfTE9HSU4gKyBWU1NfVVNFUk5BTUUgKyAiLCIgKyBWU1NfUEFTU1dPUkR9OworCisgICAgICAgIC8vIFNldCB1cCBhIFZTU0xhYmVsIHRhc2sKKyAgICAgICAgTVNWU1NMQUJFTCB2c3NMYWJlbCA9IG5ldyBNU1ZTU0xBQkVMKCk7CisgICAgICAgIHZzc0xhYmVsLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIHZzc0xhYmVsLnNldENvbW1lbnQoU1JDX0NPTU1FTlQpOworICAgICAgICB2c3NMYWJlbC5zZXRMb2dpbihWU1NfVVNFUk5BTUUgKyAiLCIgKyBWU1NfUEFTU1dPUkQpOworICAgICAgICB2c3NMYWJlbC5zZXRMYWJlbChMT05HX0xBQkVMICsgImJsYWhibGFoIik7CisgICAgICAgIHZzc0xhYmVsLnNldFZzc3BhdGgoVlNTX1BST0pFQ1RfUEFUSCk7CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSB2c3NMYWJlbC5idWlsZENtZExpbmUoKTsKKworICAgICAgICBjaGVja0NvbW1hbmRMaW5lcyhzVGVzdENtZExpbmUsIGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgVlNTTGFiZWwgcmVxdWlyZWQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxFeGNlcHRpb25zKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC92c3MvdnNzLnhtbCIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ2c3NsYWJlbC4xIiwgInNvbWUgY2F1c2UiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2xhYmVsLjIiLCAic29tZSBjYXVzZSIsICJsYWJlbCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgfQorCisgICAgLyoqICBUZXN0cyBWU1NIaXN0b3J5IGNvbW1hbmRsaW5lIGdlbmVyYXRpb24gd2l0aCBmcm9tIGxhYmVsLiAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGlzdG9yeUNvbW1hbmRMaW5lMSgpIHsKKyAgICAgICAgU3RyaW5nW10gc1Rlc3RDbWRMaW5lID0ge01TVlNTLlNTX0VYRSwgTVNWU1MuQ09NTUFORF9ISVNUT1JZLCBEU19WU1NfUFJPSkVDVF9QQVRILAorICAgICAgICAgICAgICAgIE1TVlNTLkZMQUdfQVVUT1JFU1BPTlNFX0RFRiwgTVNWU1MuRkxBR19WRVJTSU9OX0xBQkVMICsgTE9OR19MQUJFTAorICAgICAgICAgICAgICAgICArIE1TVlNTLlZBTFVFX0ZST01MQUJFTCArIFNSQ19MQUJFTCwgTVNWU1MuRkxBR19MT0dJTiArIFZTU19VU0VSTkFNRQorICAgICAgICAgICAgICAgICArICIsIiArIFZTU19QQVNTV09SRCwgTVNWU1MuRkxBR19PVVRQVVQgKyBwcm9qZWN0LmdldEJhc2VEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgT1VUUFVUfTsKKworICAgICAgICAvLyBTZXQgdXAgYSBWU1NIaXN0b3J5IHRhc2sKKyAgICAgICAgTVNWU1NISVNUT1JZIHZzc0hpc3RvcnkgPSBuZXcgTVNWU1NISVNUT1JZKCk7CisgICAgICAgIHZzc0hpc3Rvcnkuc2V0UHJvamVjdChwcm9qZWN0KTsKKworICAgICAgICB2c3NIaXN0b3J5LnNldExvZ2luKFZTU19VU0VSTkFNRSArICIsIiArIFZTU19QQVNTV09SRCk7CisKKyAgICAgICAgdnNzSGlzdG9yeS5zZXRGcm9tTGFiZWwoU1JDX0xBQkVMKTsKKyAgICAgICAgdnNzSGlzdG9yeS5zZXRUb0xhYmVsKExPTkdfTEFCRUwgKyAiYmxhaGJsYWgiKTsKKyAgICAgICAgdnNzSGlzdG9yeS5zZXRWc3NwYXRoKFZTU19QUk9KRUNUX1BBVEgpOworICAgICAgICB2c3NIaXN0b3J5LnNldFJlY3Vyc2l2ZShmYWxzZSk7CisgICAgICAgIHZzc0hpc3Rvcnkuc2V0T3V0cHV0KG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZURpcigpLmdldEFic29sdXRlUGF0aCgpLCBPVVRQVVQpKTsKKworICAgICAgICBjb21tYW5kbGluZSA9IHZzc0hpc3RvcnkuYnVpbGRDbWRMaW5lKCk7CisKKyAgICAgICAgY2hlY2tDb21tYW5kTGluZXMoc1Rlc3RDbWRMaW5lLCBjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpKTsKKyAgICB9CisKKyAgICAvKiogIFRlc3RzIFZTU0hpc3RvcnkgY29tbWFuZGxpbmUgZ2VuZXJhdGlvbiB3aXRoIGZyb20gZGF0ZS4gICovCisgICAgcHVibGljIHZvaWQgdGVzdEhpc3RvcnlDb21tYW5kTGluZTIoKSB7CisgICAgICAgIFN0cmluZ1tdIHNUZXN0Q21kTGluZSA9IHtNU1ZTUy5TU19FWEUsIE1TVlNTLkNPTU1BTkRfSElTVE9SWSwgRFNfVlNTX1BST0pFQ1RfUEFUSCwKKyAgICAgICAgICAgICAgICBNU1ZTUy5GTEFHX0FVVE9SRVNQT05TRV9ERUYsIE1TVlNTLkZMQUdfVkVSU0lPTl9EQVRFICsgREFURSArIE1TVlNTLlZBTFVFX0ZST01EQVRFCisgICAgICAgICAgICAgICAgKyBEQVRFMiwgTVNWU1MuRkxBR19SRUNVUlNJT04sICBNU1ZTUy5GTEFHX0xPR0lOICsgVlNTX1VTRVJOQU1FICsgIiwiICsgVlNTX1BBU1NXT1JEfTsKKworICAgICAgICAvLyBTZXQgdXAgYSBWU1NIaXN0b3J5IHRhc2sKKyAgICAgICAgTVNWU1NISVNUT1JZIHZzc0hpc3RvcnkgPSBuZXcgTVNWU1NISVNUT1JZKCk7CisgICAgICAgIHZzc0hpc3Rvcnkuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgdnNzSGlzdG9yeS5zZXRMb2dpbihWU1NfVVNFUk5BTUUgKyAiLCIgKyBWU1NfUEFTU1dPUkQpOworICAgICAgICB2c3NIaXN0b3J5LnNldEZyb21EYXRlKERBVEUyKTsKKyAgICAgICAgdnNzSGlzdG9yeS5zZXRUb0RhdGUoREFURSk7CisgICAgICAgIHZzc0hpc3Rvcnkuc2V0VnNzcGF0aChWU1NfUFJPSkVDVF9QQVRIKTsKKyAgICAgICAgdnNzSGlzdG9yeS5zZXRSZWN1cnNpdmUodHJ1ZSk7CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSB2c3NIaXN0b3J5LmJ1aWxkQ21kTGluZSgpOworCisgICAgICAgIGNoZWNrQ29tbWFuZExpbmVzKHNUZXN0Q21kTGluZSwgY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgfQorCisgICAgLyoqICBUZXN0cyBWU1NIaXN0b3J5IGNvbW1hbmRsaW5lIGdlbmVyYXRpb24gd2l0aCBkYXRlIGNhbGN1bGF0aW9uLiAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGlzdG9yeUNvbW1hbmRMaW5lMygpIHsKKyAgICAgICAgLy8gU2V0IHVwIGEgVGltZXN0YW1wCisgICAgICAgIFRzdGFtcCB0c3RhbXAgPSBuZXcgVHN0YW1wKCk7CisgICAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC92c3MvdnNzLnhtbCIpOworICAgICAgICB0c3RhbXAuc2V0TG9jYXRpb24obG9jYXRpb24pOworICAgICAgICB0c3RhbXAuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgVHN0YW1wLkN1c3RvbUZvcm1hdCBmb3JtYXQgPSB0c3RhbXAuY3JlYXRlRm9ybWF0KCk7CisgICAgICAgIGZvcm1hdC5zZXRQcm9wZXJ0eSgidG9kYXkiKTsKKyAgICAgICAgZm9ybWF0LnNldFBhdHRlcm4oIkhIOm1tOnNzIHoiKTsKKyAgICAgICAgZm9ybWF0LnNldFRpbWV6b25lKCJHTVQiKTsKKyAgICAgICAgRGF0ZSBkYXRlID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCk7CisgICAgICAgIGZvcm1hdC5leGVjdXRlKHByb2plY3QsIGRhdGUsIGxvY2F0aW9uKTsKKyAgICAgICAgU3RyaW5nIHRvZGF5ID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgidG9kYXkiKTsKKworICAgICAgICAvLyBHZXQgdG9kYXkncyBkYXRlCisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkhIOm1tOnNzIHoiKTsKKyAgICAgICAgc2RmLnNldFRpbWVab25lKCBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikgKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gc2RmLmZvcm1hdChkYXRlKTsKKworICAgICAgICAvLyBTZXQgdXAgYSBWU1NIaXN0b3J5IHRhc2sKKyAgICAgICAgTVNWU1NISVNUT1JZIHZzc0hpc3RvcnkgPSBuZXcgTVNWU1NISVNUT1JZKCk7CisgICAgICAgIHZzc0hpc3Rvcnkuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgdnNzSGlzdG9yeS5zZXRMb2dpbihWU1NfVVNFUk5BTUUpOworICAgICAgICB2c3NIaXN0b3J5LnNldFRvRGF0ZSh0b2RheSk7CisgICAgICAgIHZzc0hpc3Rvcnkuc2V0VnNzcGF0aChWU1NfUFJPSkVDVF9QQVRIKTsKKworICAgICAgICBTdHJpbmdbXSBzVGVzdENtZExpbmUgPSB7TVNWU1MuU1NfRVhFLCBNU1ZTUy5DT01NQU5EX0hJU1RPUlksIERTX1ZTU19QUk9KRUNUX1BBVEgsCisgICAgICAgIE1TVlNTLkZMQUdfQVVUT1JFU1BPTlNFX0RFRiwgTVNWU1MuRkxBR19WRVJTSU9OX0RBVEUgKyBleHBlY3RlZCwgTVNWU1MuRkxBR19MT0dJTiArIFZTU19VU0VSTkFNRX07CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSB2c3NIaXN0b3J5LmJ1aWxkQ21kTGluZSgpOworCisgICAgICAgIGNoZWNrQ29tbWFuZExpbmVzKHNUZXN0Q21kTGluZSwgY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgVlNTSGlzdG9yeSByZXF1aXJlZCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIaXN0b3J5RXhjZXB0aW9ucygpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzaGlzdG9yeS4xIiwgInNvbWUgY2F1c2UiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgfQorCisgICAgLyoqICBUZXN0cyBDaGVja0luIGNvbW1hbmRsaW5lIGdlbmVyYXRpb24uICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja2luQ29tbWFuZExpbmUoKSB7CisgICAgICAgIFN0cmluZ1tdIHNUZXN0Q21kTGluZSA9IHtNU1ZTUy5TU19FWEUsIE1TVlNTLkNPTU1BTkRfQ0hFQ0tJTiwgRFNfVlNTX1BST0pFQ1RfUEFUSCwKKyAgICAgICAgICAgICAgICBNU1ZTUy5GTEFHX0FVVE9SRVNQT05TRV9OTywgTVNWU1MuRkxBR19XUklUQUJMRSwgTVNWU1MuRkxBR19MT0dJTiArIFZTU19VU0VSTkFNRSwKKyAgICAgICAgICAgICAgICBNU1ZTUy5GTEFHX0NPTU1FTlQgKyBTUkNfQ09NTUVOVH07CisKKyAgICAgICAgLy8gU2V0IHVwIGEgVlNTQ2hlY2tJbiB0YXNrCisgICAgICAgIE1TVlNTQ0hFQ0tJTiB2c3NDaGVja2luID0gbmV3IE1TVlNTQ0hFQ0tJTigpOworICAgICAgICB2c3NDaGVja2luLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIHZzc0NoZWNraW4uc2V0Q29tbWVudChTUkNfQ09NTUVOVCk7CisgICAgICAgIHZzc0NoZWNraW4uc2V0TG9naW4oVlNTX1VTRVJOQU1FKTsKKyAgICAgICAgdnNzQ2hlY2tpbi5zZXRBdXRvcmVzcG9uc2UoIk4iKTsKKyAgICAgICAgdnNzQ2hlY2tpbi5zZXRWc3NwYXRoKFZTU19QUk9KRUNUX1BBVEgpOworICAgICAgICB2c3NDaGVja2luLnNldFdyaXRhYmxlKHRydWUpOworCisgICAgICAgIGNvbW1hbmRsaW5lID0gdnNzQ2hlY2tpbi5idWlsZENtZExpbmUoKTsKKworICAgICAgICBjaGVja0NvbW1hbmRMaW5lcyhzVGVzdENtZExpbmUsIGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgVlNTQ2hlY2tJbiByZXF1aXJlZCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja2luRXhjZXB0aW9ucygpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzY2hlY2tpbi4xIiwgInNvbWUgY2F1c2UiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgfQorCisgICAgLyoqICBUZXN0cyBDaGVja091dCBjb21tYW5kbGluZSBnZW5lcmF0aW9uLiAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRDb21tYW5kTGluZSgpIHsKKyAgICAgICAgU3RyaW5nW10gc1Rlc3RDbWRMaW5lID0ge1NTX0RJUiArIEZpbGUuc2VwYXJhdG9yICsgTVNWU1MuU1NfRVhFLCBNU1ZTUy5DT01NQU5EX0NIRUNLT1VULAorICAgICAgICAgICAgICAgIERTX1ZTU19QUk9KRUNUX1BBVEgsIE1TVlNTLkZMQUdfQVVUT1JFU1BPTlNFX0RFRiwgTVNWU1MuRkxBR19SRUNVUlNJT04sCisgICAgICAgICAgICAgICAgTVNWU1MuRkxBR19WRVJTSU9OX0RBVEUgKyBEQVRFLCBNU1ZTUy5GTEFHX0xPR0lOICsgVlNTX1VTRVJOQU1FLAorICAgICAgICAgICAgICAgIEZMQUdfRklMRVRJTUVfTU9ESUZJRUQsIEZMQUdfTk9fR0VUfTsKKworICAgICAgICAvLyBTZXQgdXAgYSBWU1NDaGVja091dCB0YXNrCisgICAgICAgIE1TVlNTQ0hFQ0tPVVQgdnNzQ2hlY2tvdXQgPSBuZXcgTVNWU1NDSEVDS09VVCgpOworICAgICAgICB2c3NDaGVja291dC5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICB2c3NDaGVja291dC5zZXRMb2dpbihWU1NfVVNFUk5BTUUpOworICAgICAgICB2c3NDaGVja291dC5zZXRWc3NwYXRoKERTX1ZTU19QUk9KRUNUX1BBVEgpOworICAgICAgICB2c3NDaGVja291dC5zZXRSZWN1cnNpdmUodHJ1ZSk7CisgICAgICAgIHZzc0NoZWNrb3V0LnNldERhdGUoREFURSk7CisgICAgICAgIHZzc0NoZWNrb3V0LnNldExhYmVsKFNSQ19MQUJFTCk7CisgICAgICAgIHZzc0NoZWNrb3V0LnNldFNzZGlyKFNTX0RJUik7CisgICAgICAgIE1TVlNTLkN1cnJlbnRNb2RVcGRhdGVkIGNtdSA9IG5ldyBNU1ZTUy5DdXJyZW50TW9kVXBkYXRlZCgpOworICAgICAgICBjbXUuc2V0VmFsdWUoVElNRV9NT0RJRklFRCk7CisgICAgICAgIHZzc0NoZWNrb3V0LnNldEZpbGVUaW1lU3RhbXAoY211KTsKKyAgICAgICAgdnNzQ2hlY2tvdXQuc2V0R2V0TG9jYWxDb3B5KGZhbHNlKTsKKworICAgICAgICBjb21tYW5kbGluZSA9IHZzc0NoZWNrb3V0LmJ1aWxkQ21kTGluZSgpOworCisgICAgICAgIGNoZWNrQ29tbWFuZExpbmVzKHNUZXN0Q21kTGluZSwgY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBWU1NDaGVja291dCByZXF1aXJlZCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja291dEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy92c3MueG1sIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2NoZWNrb3V0LjEiLCAic29tZSBjYXVzZSIsICJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzY2hlY2tvdXQuMiIsICJzb21lIGNhdXNlIiwgImJsYWggaXMgbm90IGEgbGVnYWwgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIik7CisgICAgfQorCisgICAgLyoqICBUZXN0cyBBZGQgY29tbWFuZGxpbmUgZ2VuZXJhdGlvbi4gICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZENvbW1hbmRMaW5lKCkgeworICAgICAgICBTdHJpbmdbXSBzVGVzdENtZExpbmUgPSB7U1NfRElSICsgRmlsZS5zZXBhcmF0b3IgKyBNU1ZTUy5TU19FWEUsIE1TVlNTLkNPTU1BTkRfQURELAorICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0QmFzZURpcigpLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBMT0NBTF9QQVRILAorICAgICAgICAgICAgICAgIE1TVlNTLkZMQUdfQVVUT1JFU1BPTlNFX0RFRiwgTVNWU1MuRkxBR19SRUNVUlNJT04sCisgICAgICAgICAgICAgICAgTVNWU1MuRkxBR19MT0dJTiArIFZTU19VU0VSTkFNRSArICIsIiArIFZTU19QQVNTV09SRCwgTVNWU1MuRkxBR19DT01NRU5UICsgIi0ifTsKKworICAgICAgICAvLyBTZXQgdXAgYSBWU1NBZGQgdGFzaworICAgICAgICBNU1ZTU0FERCB2c3NBZGQgPSBuZXcgTVNWU1NBREQoKTsKKyAgICAgICAgdnNzQWRkLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIHZzc0FkZC5zZXRMb2dpbihWU1NfVVNFUk5BTUUgKyAiLCIgKyBWU1NfUEFTU1dPUkQpOworICAgICAgICB2c3NBZGQuc2V0VnNzcGF0aChEU19WU1NfUFJPSkVDVF9QQVRIKTsKKyAgICAgICAgdnNzQWRkLnNldFJlY3Vyc2l2ZSh0cnVlKTsKKyAgICAgICAgdnNzQWRkLnNldFNzZGlyKFNTX0RJUik7CisgICAgICAgIHZzc0FkZC5zZXRXcml0YWJsZShmYWxzZSk7CisgICAgICAgIHZzc0FkZC5zZXRMb2NhbHBhdGgobmV3IFBhdGgocHJvamVjdCwgTE9DQUxfUEFUSCkpOworCisgICAgICAgIGNvbW1hbmRsaW5lID0gdnNzQWRkLmJ1aWxkQ21kTGluZSgpOworCisgICAgICAgIGNoZWNrQ29tbWFuZExpbmVzKHNUZXN0Q21kTGluZSwgY29tbWFuZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBWU1NBZGQgcmVxdWlyZWQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRXhjZXB0aW9ucygpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzYWRkLjEiLCAic29tZSBjYXVzZSIsICJsb2NhbFBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgIH0KKworICAgIC8qKiAgVGVzdHMgQ1AgY29tbWFuZGxpbmUgZ2VuZXJhdGlvbi4gICovCisgICAgcHVibGljIHZvaWQgdGVzdENwQ29tbWFuZExpbmUoKSB7CisgICAgICAgIFN0cmluZ1tdIHNUZXN0Q21kTGluZSA9IHtNU1ZTUy5TU19FWEUsIE1TVlNTLkNPTU1BTkRfQ1AsCisgICAgICAgICAgICAgICAgRFNfVlNTX1BST0pFQ1RfUEFUSCwgTVNWU1MuRkxBR19BVVRPUkVTUE9OU0VfREVGLCBNU1ZTUy5GTEFHX0xPR0lOICsKKyAgICAgICAgICAgICAgICBWU1NfVVNFUk5BTUV9OworCisgICAgICAgIC8vIFNldCB1cCBhIFZTU0NwIHRhc2sKKyAgICAgICAgTVNWU1NDUCB2c3NDcCA9IG5ldyBNU1ZTU0NQKCk7CisgICAgICAgIHZzc0NwLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIHZzc0NwLnNldExvZ2luKFZTU19VU0VSTkFNRSk7CisgICAgICAgIHZzc0NwLnNldFZzc3BhdGgoRFNfVlNTX1BST0pFQ1RfUEFUSCk7CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSB2c3NDcC5idWlsZENtZExpbmUoKTsKKworICAgICAgICBjaGVja0NvbW1hbmRMaW5lcyhzVGVzdENtZExpbmUsIGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgVlNTQ1AgcmVxdWlyZWQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3BFeGNlcHRpb25zKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC92c3MvdnNzLnhtbCIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ2c3NjcC4xIiwgInNvbWUgY2F1c2UiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgfQorCisgICAgLyoqICBUZXN0cyBDcmVhdGUgY29tbWFuZGxpbmUgZ2VuZXJhdGlvbi4gICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbW1hbmRMaW5lKCkgeworICAgICAgICBTdHJpbmdbXSBzVGVzdENtZExpbmUgPSB7IE1TVlNTLlNTX0VYRSwgTVNWU1MuQ09NTUFORF9DUkVBVEUsCisgICAgICAgICAgICAgICAgRFNfVlNTX1BST0pFQ1RfUEFUSCwgTVNWU1MuRkxBR19DT01NRU5UICsgU1JDX0NPTU1FTlQsIE1TVlNTLkZMQUdfQVVUT1JFU1BPTlNFX05PLAorICAgICAgICAgICAgICAgIE1TVlNTLkZMQUdfUVVJRVQsIE1TVlNTLkZMQUdfTE9HSU4gKyBWU1NfVVNFUk5BTUV9OworCisgICAgICAgIC8vIFNldCB1cCBhIFZTU0NyZWF0ZSB0YXNrCisgICAgICAgIE1TVlNTQ1JFQVRFIHZzc0NyZWF0ZSA9IG5ldyBNU1ZTU0NSRUFURSgpOworICAgICAgICB2c3NDcmVhdGUuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgdnNzQ3JlYXRlLnNldENvbW1lbnQoU1JDX0NPTU1FTlQpOworICAgICAgICB2c3NDcmVhdGUuc2V0TG9naW4oVlNTX1VTRVJOQU1FKTsKKyAgICAgICAgdnNzQ3JlYXRlLnNldFZzc3BhdGgoRFNfVlNTX1BST0pFQ1RfUEFUSCk7CisgICAgICAgIHZzc0NyZWF0ZS5zZXRGYWlsT25FcnJvcih0cnVlKTsKKyAgICAgICAgdnNzQ3JlYXRlLnNldEF1dG9yZXNwb25zZSgiTiIpOworICAgICAgICB2c3NDcmVhdGUuc2V0UXVpZXQodHJ1ZSk7CisKKyAgICAgICAgY29tbWFuZGxpbmUgPSB2c3NDcmVhdGUuYnVpbGRDbWRMaW5lKCk7CisKKyAgICAgICAgY2hlY2tDb21tYW5kTGluZXMoc1Rlc3RDbWRMaW5lLCBjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IFZTU0NyZWF0ZSByZXF1aXJlZCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFeGNlcHRpb25zKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC92c3MvdnNzLnhtbCIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ2c3NjcmVhdGUuMSIsICJzb21lIGNhdXNlIiwgInZzc3BhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZ2VuZXJhdGVkIGNvbW1hbmQgbGluZSBjb21wYXJpbmcgaXQgdG8gcmVmZXJlbmNlIG9uZS4KKyAgICAgKiBAcGFyYW0gc1Rlc3RDbWRMaW5lICAgICAgICAgIFRoZSByZWZlcmVuY2UgY29tbWFuZCBsaW5lOworICAgICAqIEBwYXJhbSBzR2VuZXJhdGVkQ21kTGluZSAgICAgVGhlIGdlbmVyYXRlZCBjb21tYW5kIGxpbmU7CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29tbWFuZExpbmVzKFN0cmluZ1tdIHNUZXN0Q21kTGluZSwgU3RyaW5nW10gc0dlbmVyYXRlZENtZExpbmUpIHsKKyAgICAgICAgaW50IHRlc3RMZW5ndGggPSBzVGVzdENtZExpbmUubGVuZ3RoOworICAgICAgICBpbnQgZ2VuTGVuZ3RoID0gc0dlbmVyYXRlZENtZExpbmUubGVuZ3RoOworCisgICAgICAgIGludCBnZW5JbmRleCA9IDA7CisgICAgICAgIGludCB0ZXN0SW5kZXggPSAwOworCisgICAgICAgIHdoaWxlICh0ZXN0SW5kZXggPCB0ZXN0TGVuZ3RoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChzR2VuZXJhdGVkQ21kTGluZVtnZW5JbmRleF0gPT0gIiIpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiYXJnICMgIiArIHRlc3RJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNUZXN0Q21kTGluZVt0ZXN0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgc0dlbmVyYXRlZENtZExpbmVbZ2VuSW5kZXhdKTsKKyAgICAgICAgICAgICAgICB0ZXN0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBnZW5JbmRleCsrOworICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFpb29iKSB7CisgICAgICAgICAgICAgICAgZmFpbCgibWlzc2luZyBhcmcgIiArIHNUZXN0Q21kTGluZVt0ZXN0SW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgZW1wdHkgc3RyaW5ncworICAgICAgICBpbnQgY250ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZW5MZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNHZW5lcmF0ZWRDbWRMaW5lW2ldID09ICIiKSB7CisgICAgICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdlbkxlbmd0aCAtIGNudCA+IHNUZXN0Q21kTGluZS5sZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgZXh0cmEgZWxlbWVudHMKKyAgICAgICAgICAgIGZhaWwoImV4dHJhIGFyZ3MiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BYnN0cmFjdEZpbGVTZXRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQWJzdHJhY3RGaWxlU2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYWFlMTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQWJzdHJhY3RGaWxlU2V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIEZpbGVTZXRUZXN0IGFuZCBEaXJTZXRUZXN0LgorICoKKyAqIDxwPlRoaXMgZG9lc24ndCBhY3R1YWxseSB0ZXN0IG11Y2gsIG1haW5seSByZWZlcmVuY2UgaGFuZGxpbmcuCisgKgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZpbGVTZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICBwdWJsaWMgQWJzdHJhY3RGaWxlU2V0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcigiLiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdEZpbGVTZXQgZ2V0SW5zdGFuY2UoKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RFbXB0eUVsZW1lbnRJZklzUmVmZXJlbmNlKCkgeworICAgICAgICBBYnN0cmFjdEZpbGVTZXQgZiA9IGdldEluc3RhbmNlKCk7CisgICAgICAgIGYuc2V0SW5jbHVkZXMoIioqLyouamF2YSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gIgorICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgKyAiIHdpdGggZWxlbWVudHMgZnJvbSBzZXRJbmNsdWRlcyIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAid2hlbiB1c2luZyByZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBmID0gZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgZi5jcmVhdGVQYXR0ZXJuU2V0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byAiCisgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQorICAgICAgICAgICAgICAgICArICIgd2l0aCBuZXN0ZWQgcGF0dGVybnNldCBlbGVtZW50LiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAidXNpbmcgcmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgZiA9IGdldEluc3RhbmNlKCk7CisgICAgICAgIGYuY3JlYXRlSW5jbHVkZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gIgorICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgKyAiIHdpdGggbmVzdGVkIGluY2x1ZGUgZWxlbWVudC4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoZW4gdXNpbmcgcmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgZiA9IGdldEluc3RhbmNlKCk7CisgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuc2V0SW5jbHVkZXMoIioqLyouamF2YSIpOworICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBpbmNsdWRlcyBpbiAiCisgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQorICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoZW4gdXNpbmcgcmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLnNldEluY2x1ZGVzZmlsZShuZXcgRmlsZSgiL2EiKSk7CisgICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGluY2x1ZGVzZmlsZSBpbiAiCisgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQorICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoZW4gdXNpbmcgcmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLnNldEV4Y2x1ZGVzKCIqKi8qLmphdmEiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgZXhjbHVkZXMgaW4gIgorICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgKyAiIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJ3aGVuIHVzaW5nIHJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5zZXRFeGNsdWRlc2ZpbGUobmV3IEZpbGUoIi9hIikpOworICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBleGNsdWRlc2ZpbGUgaW4gIgorICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgKyAiIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJ3aGVuIHVzaW5nIHJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5zZXREaXIocHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgZGlyIGluICIKKyAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgICsgIiB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAid2hlbiB1c2luZyByZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuY3JlYXRlSW5jbHVkZSgpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgaW5jbHVkZSBpbiAiCisgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQorICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5jcmVhdGVFeGNsdWRlKCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBleGNsdWRlIGluICIKKyAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgICsgIiB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLmNyZWF0ZUluY2x1ZGVzRmlsZSgpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgaW5jbHVkZXNmaWxlIGluICIKKyAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgICsgIiB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLmNyZWF0ZUV4Y2x1ZGVzRmlsZSgpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgZXhjbHVkZXNmaWxlIGluICIKKyAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgICsgIiB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLmNyZWF0ZVBhdHRlcm5TZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIHBhdHRlcm5zZXQgaW4gIgorICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgKyAiIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArICJyZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKKyAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGYgPSBnZXRJbnN0YW5jZSgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBmKTsKKyAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15IikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5nZXREaXIocHJvamVjdCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSAiICsgZi5nZXREYXRhVHlwZU5hbWUoKQorICAgICAgICAgICAgICAgICArICIgYSBSZWZlcmVuY2UgdG8gaXRzZWxmLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlICIgKyBmLmdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgICsgIiBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMgLS0+IGR1bW15MQorICAgICAgICBBYnN0cmFjdEZpbGVTZXQgZjEgPSBnZXRJbnN0YW5jZSgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgZjEpOworICAgICAgICBmMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MiIpKTsKKyAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGYyID0gZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIGYyKTsKKyAgICAgICAgZjIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teTMiKSk7CisgICAgICAgIEFic3RyYWN0RmlsZVNldCBmMyA9IGdldEluc3RhbmNlKCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTMiLCBmMyk7CisgICAgICAgIGYzLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXkxIikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZjEuZ2V0RGlyKHByb2plY3QpOworICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYxLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBjaXJjdWxhciByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMKKyAgICAgICAgLy8gKHdoaWNoIGhhcyB0aGUgUHJvamVjdCdzIGJhc2VkaXIgYXMgcm9vdCkuCisgICAgICAgIGYxID0gZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIGYxKTsKKyAgICAgICAgZjEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teTIiKSk7CisgICAgICAgIGYyID0gZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIGYyKTsKKyAgICAgICAgZjIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teTMiKSk7CisgICAgICAgIGYzID0gZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIGYzKTsKKyAgICAgICAgZjMuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7CisgICAgICAgIEZpbGUgZGlyID0gZjEuZ2V0RGlyKHByb2plY3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRpciBpcyBiYXNlZGlyIiwgZGlyLCBwcm9qZWN0LmdldEJhc2VEaXIoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0FkZFR5cGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQWRkVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTVjYmMxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0FkZFR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Db25kaXRpb247CisKK3B1YmxpYyBjbGFzcyBBZGRUeXBlVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIEFkZFR5cGVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hZGR0eXBlLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQYXRoKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJhZGRwYXRoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZENvbmRpdGlvbigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiYWRkY29uZGl0aW9uIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEZpbHRlcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiYWRkZmlsdGVyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFNlbGVjdG9yKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJhZGRzZWxlY3RvciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRBKCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJuZXN0ZWQuYSIsICJhZGQgQSBjYWxsZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQigpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygibmVzdGVkLmIiLCAiYWRkIEIgY2FsbGVkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEMoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoIm5lc3RlZC5jIiwgImFkZCBDIGNhbGxlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRBQigpIHsKKyAgICAgICAgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKAorICAgICAgICAgICAgIm5lc3RlZC5hYiIsICJTaG91bGQgaGF2ZSBnb3QgYW1iaWd1b3VzIiwgImFtYmlndW91cyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25UeXBlKCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJjb25kaXRpb24udHlwZSIsICJiZWZvcmVhZnRlciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25UYXNrKCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJjb25kaXRpb24udGFzayIsICJNeSBDb25kaXRpb24gZXhlY3V0aW9uIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25Db25kaXRpb25UeXBlKCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJjb25kaXRpb24uY29uZGl0aW9uLnR5cGUiLCAiTXkgQ29uZGl0aW9uIGV2YWwiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbkNvbmRpdGlvblRhc2soKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygKKyAgICAgICAgICAgICJjb25kaXRpb24uY29uZGl0aW9uLnRhc2siLCAidGFzayBtYXNraW5nIGNvbmRpdGlvbiIsCisgICAgICAgICAgICAiZG9lc24ndCBzdXBwb3J0IHRoZSBuZXN0ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ29uZmlndXJlZCgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygKKyAgICAgICAgICAgICJteWFkZGNvbmZpZ3VyZWQiLCAidmFsdWUgaXMgVmFsdWUgU2V0ZXhlY3V0ZTogdmFsdWUgaXMgVmFsdWUgU2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZENvbmZpZ3VyZWRWYWx1ZSgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygKKyAgICAgICAgICAgICJteWFkZGNvbmZpZ3VyZWR2YWx1ZSIsCisgICAgICAgICAgICAidmFsdWUgaXMgVmFsdWUgU2V0ZXhlY3V0ZTogdmFsdWUgaXMgVmFsdWUgU2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVzcGFjZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibmFtZXNwYWNldGVzdCIpOworICAgIH0KKworICAgIC8vIFRoZSBmb2xsb3dpbmcgd2lsbCBiZSB1c2VkIGFzIHR5cGVzIGFuZCB0YXNrcworCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQSB7fQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEIge30KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDIGV4dGVuZHMgQSB7fQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEFCIGV4dGVuZHMgQSwgQiB7fQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBSW1wbCBpbXBsZW1lbnRzIEF7fQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQkltcGwgaW1wbGVtZW50cyBCe30KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENJbXBsIGltcGxlbWVudHMgQ3t9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBQkltcGwgaW1wbGVtZW50cyBBQnt9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5lc3RlZENvbnRhaW5lcgorICAgICAgICBleHRlbmRzIFRhc2sKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChBIGVsKSB7CisgICAgICAgICAgICBsb2coImFkZCBBIGNhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChCIGVsKSB7CisgICAgICAgICAgICBsb2coImFkZCBCIGNhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChDIGVsKSB7CisgICAgICAgICAgICBsb2coImFkZCBDIGNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNvbmRpdGlvbgorICAgICAgICBpbXBsZW1lbnRzIENvbmRpdGlvbgorICAgIHsKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0OworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgeworICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgeworICAgICAgICAgICAgcHJvamVjdC5sb2coIk15IENvbmRpdGlvbiBldmFsIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICAgICAgcHJvamVjdC5sb2coIk15IENvbmRpdGlvbiBleGVjdXRpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlWYWx1ZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dCA9ICJOT1QgU0VUIFlFVCI7CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUFkZENvbmZpZ3VyZWQKKyAgICAgICAgZXh0ZW5kcyBUYXNrCisgICAgeworICAgICAgICBNeVZhbHVlIHZhbHVlOworICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKE15VmFsdWUgdmFsdWUpIHsKKyAgICAgICAgICAgIGxvZygidmFsdWUgaXMgIiArIHZhbHVlKTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBhZGQoTXlWYWx1ZSB2YWx1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTaG91bGQgbm90IGJlIGNhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgICAgICBsb2coImV4ZWN1dGU6IHZhbHVlIGlzICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QWRkQ29uZmlndXJlZFZhbHVlCisgICAgICAgIGV4dGVuZHMgVGFzaworICAgIHsKKyAgICAgICAgTXlWYWx1ZSB2YWx1ZTsKKyAgICAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFZhbHVlKE15VmFsdWUgdmFsdWUpIHsKKyAgICAgICAgICAgIGxvZygidmFsdWUgaXMgIiArIHZhbHVlKTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShNeVZhbHVlIHZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNob3VsZCBub3QgYmUgY2FsbGVkIik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIGxvZygiZXhlY3V0ZTogdmFsdWUgaXMgIiArIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fzc2VydGlvbnNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXNzZXJ0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmUzZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fzc2VydGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIHRlc3QgYXNzZXJ0aW9uIGhhbmRsaW5nCisgKi8KK3B1YmxpYyBjbGFzcyBBc3NlcnRpb25zVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIEFzc2VydGlvbnNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Fzc2VydGlvbnMueG1sIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVhcmRvd24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBydW5zIGEgdGVzdCBhbmQgZXhwZWN0cyBhbiBhc3NlcnRpb24gdGhyb3duIGluIGZvcmtlZCBjb2RlCisgICAgICogQHBhcmFtIHRhcmdldAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV4cGVjdEFzc2VydGlvbihTdHJpbmcgdGFyZ2V0KSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZyh0YXJnZXQsCisgICAgICAgICAgICAgICAgImFzc2VydGlvbiBub3QgdGhyb3duIGluICIrdGFyZ2V0LAorICAgICAgICAgICAgICAgICJKYXZhIHJldHVybmVkOiAxIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzbmFtZSgpIHsKKyAgICAgICAgZXhwZWN0QXNzZXJ0aW9uKCJ0ZXN0LWNsYXNzbmFtZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlKCkgeworICAgICAgICBleHBlY3RBc3NlcnRpb24oInRlc3QtcGFja2FnZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUFzc2VydGlvbnMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QtZW1wdHktYXNzZXJ0aW9ucyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0LWRpc2FibGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGUoKSB7CisgICAgICAgIGV4cGVjdEFzc2VydGlvbigidGVzdC1vdmVycmlkZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZTIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Qtb3ZlcnJpZGUyIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZlcmVuY2VzKCkgeworICAgICAgICBleHBlY3RBc3NlcnRpb24oInRlc3QtcmVmZXJlbmNlcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFzc2VydGlvbnMoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdC1tdWx0aXBsZS1hc3NlcnRpb25zIiwKKyAgICAgICAgICAgICAgICAibXVsdGlwbGUgYXNzZXJ0aW9ucyByZWplY3RlZCIsCisgICAgICAgICAgICAgICAgIk9ubHkgb25lIGFzc2VydGlvbiBkZWNsYXJhdGlvbiBpcyBhbGxvd2VkIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jZUFidXNlKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbkNvbnRhaW5pbmcoInRlc3QtcmVmZXJlbmNlLWFidXNlIiwKKyAgICAgICAgICAgICAgICAicmVmZXJlbmNlIGFidXNlIHJlamVjdGVkIiwKKyAgICAgICAgICAgICAgICAiWW91IG11c3Qgbm90IHNwZWNpZnkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9mb3JrKCkgeworICAgICAgICBpZiAoQXNzZXJ0aW9uc1Rlc3QuY2xhc3MuZGVzaXJlZEFzc2VydGlvblN0YXR1cygpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHJhbiBBbnQgdGVzdHMgd2l0aCAtZWEgYW5kIHRoaXMgd291bGQgZmFpbCBzcHVyaW91c2x5CisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygidGVzdC1ub2ZvcmsiLAorICAgICAgICAgICAgICAgICJBc3NlcnRpb24gc3RhdGVtZW50cyBhcmUgY3VycmVudGx5IGlnbm9yZWQgaW4gbm9uLWZvcmtlZCBtb2RlIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnVuaXQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QtanVuaXQiKTsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lSmF2YVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZUphdmFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyZWJmYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZUphdmFUZXN0LmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKKworLyoqCisgKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQuQ29tbWFuZGxpbmVKYXZhCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29tbWFuZGxpbmVKYXZhVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNsb25lVm07CisKKyAgICBwdWJsaWMgQ29tbWFuZGxpbmVKYXZhVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpKTsKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiYnVpbGQuc3lzY2xhc3NwYXRoIiwgImlnbm9yZSIpOworICAgICAgICBjbG9uZVZtID0gU3lzdGVtLmdldFByb3BlcnR5KCJhbnQuYnVpbGQuY2xvbmV2bSIpOworICAgICAgICBpZiAoY2xvbmVWbSAhPSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImFudC5idWlsZC5jbG9uZXZtIiwgImZhbHNlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgaWYgKGNsb25lVm0gIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJhbnQuYnVpbGQuY2xvbmV2bSIsIGNsb25lVm0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbW1hbmRsaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lSmF2YSBjID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOworICAgICAgICBjLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LkNvbW1hbmRsaW5lSmF2YVRlc3QiKTsKKyAgICAgICAgYy5zZXRDbGFzc25hbWUoImp1bml0LnRleHR1aS5UZXN0UnVubmVyIik7CisgICAgICAgIGMuY3JlYXRlVm1Bcmd1bWVudCgpLnNldFZhbHVlKCItRGphdmEuY29tcGlsZXI9Tk9ORSIpOworICAgICAgICBTdHJpbmdbXSBzID0gYy5nZXRDb21tYW5kbGluZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGNsYXNzcGF0aCIsIDQsIHMubGVuZ3RoKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQWZ0ZXIgY2hhbmdpbmcgQ29tbWFuZGxpbmVKYXZhIHRvIHNlYXJjaCBmb3IgdGhlIGphdmEKKyAgICAgICAgICogZXhlY3V0YWJsZSwgSSBkb24ndCBrbm93LCBob3cgdG8gdGVzdHMgdGhlIHZhbHVlIHJldHVybmVkCisgICAgICAgICAqIGhlcmUgd2l0aG91dCB1c2luZyB0aGUgc2FtZSBsb2dpYyBhcyBhcHBsaWVkIGluIHRoZSBjbGFzcworICAgICAgICAgKiBpdHNlbGYuCisgICAgICAgICAqCisgICAgICAgICAqIGFzc2VydFRydWUoIm5vIGNsYXNzcGF0aCIsICJqYXZhIiwgc1swXSk7CisgICAgICAgICAqLworICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGNsYXNzcGF0aCIsICItRGphdmEuY29tcGlsZXI9Tk9ORSIsIHNbMV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGNsYXNzcGF0aCIsICJqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lciIsIHNbMl0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQuQ29tbWFuZGxpbmVKYXZhVGVzdCIsIHNbM10pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGMyID0gKENvbW1hbmRsaW5lSmF2YSkgYy5jbG9uZSgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmFpbCgiY2xvbmluZyBzaG91bGQgd29yayB3aXRob3V0IGNsYXNzcGF0aCBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGMuY3JlYXRlQ2xhc3NwYXRoKHByb2plY3QpLnNldExvY2F0aW9uKHByb2plY3QucmVzb2x2ZUZpbGUoImJ1aWxkLnhtbCIpKTsKKyAgICAgICAgYy5jcmVhdGVDbGFzc3BhdGgocHJvamVjdCkuc2V0TG9jYXRpb24ocHJvamVjdC5yZXNvbHZlRmlsZSgKKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9IT01FKSsiL2xpYi9hbnQuamFyIikpOworICAgICAgICBzID0gYy5nZXRDb21tYW5kbGluZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpdGggY2xhc3NwYXRoIiwgNiwgcy5sZW5ndGgpOworICAgICAgICAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aXRoIGNsYXNzcGF0aCIsICJqYXZhIiwgc1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygid2l0aCBjbGFzc3BhdGgiLCAiLURqYXZhLmNvbXBpbGVyPU5PTkUiLCBzWzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aXRoIGNsYXNzcGF0aCIsICItY2xhc3NwYXRoIiwgc1syXSk7CisgICAgICAgIGFzc2VydFRydWUoImJ1aWxkLnhtbCBjb250YWluZWQiLAorICAgICAgICAgICAgICAgc1szXS5pbmRleE9mKCJidWlsZC54bWwiK2phdmEuaW8uRmlsZS5wYXRoU2VwYXJhdG9yKSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYW50LmphciBjb250YWluZWQiLCBzWzNdLmVuZHNXaXRoKCJhbnQuamFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpdGggY2xhc3NwYXRoIiwgImp1bml0LnRleHR1aS5UZXN0UnVubmVyIiwgc1s0XSk7CisgICAgICAgIGFzc2VydEVxdWFscygid2l0aCBjbGFzc3BhdGgiLAorICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LkNvbW1hbmRsaW5lSmF2YVRlc3QiLCBzWzVdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmFyT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbW1hbmRsaW5lSmF2YSBjID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOworICAgICAgICBjLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoImFyZzEiKTsKKyAgICAgICAgYy5zZXRKYXIoIm15ZmlsZS5qYXIiKTsKKyAgICAgICAgYy5jcmVhdGVWbUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc2ljIik7CisgICAgICAgIGMuY3JlYXRlVm1Bcmd1bWVudCgpLnNldFZhbHVlKCItRHg9eSIpOworICAgICAgICBTdHJpbmdbXSBzID0gYy5nZXRDb21tYW5kbGluZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi1jbGFzc2ljIiwgc1sxXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLUR4PXkiLCBzWzJdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCItamFyIiwgc1szXSk7CisgICAgICAgIGFzc2VydEVxdWFscygibXlmaWxlLmphciIsIHNbNF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzEiLCBzWzVdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzcHJvcGVydGllcygpIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnRDbGFzc3BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGN1cnJlbnRDbGFzc3BhdGgpOworICAgICAgICBhc3NlcnROdWxsKFN5c3RlbS5nZXRQcm9wZXJ0eSgia2V5IikpOworICAgICAgICBDb21tYW5kbGluZUphdmEgYyA9IG5ldyBDb21tYW5kbGluZUphdmEoKTsKKyAgICAgICAgRW52aXJvbm1lbnQuVmFyaWFibGUgdiA9IG5ldyBFbnZpcm9ubWVudC5WYXJpYWJsZSgpOworICAgICAgICB2LnNldEtleSgia2V5Iik7CisgICAgICAgIHYuc2V0VmFsdWUoInZhbHVlIik7CisgICAgICAgIGMuYWRkU3lzcHJvcGVydHkodik7CisKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgia2V5MiIsICJ2YWx1ZTIiKTsKKyAgICAgICAgUHJvcGVydHlTZXQgcHMgPSBuZXcgUHJvcGVydHlTZXQoKTsKKyAgICAgICAgcHMuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgcHMuYXBwZW5kTmFtZSgia2V5MiIpOworICAgICAgICBjLmFkZFN5c3Byb3BlcnR5c2V0KHBzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYy5zZXRTeXN0ZW1Qcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBTdHJpbmcgbmV3Q2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmV3Q2xhc3NwYXRoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdXJyZW50Q2xhc3NwYXRoLCBuZXdDbGFzc3BhdGgpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChTeXN0ZW0uZ2V0UHJvcGVydHkoImtleSIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImtleSIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoU3lzdGVtLmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleSgiamF2YS5jbGFzcy5wYXRoIikpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChTeXN0ZW0uZ2V0UHJvcGVydHkoImtleTIiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMiIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgia2V5MiIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGMucmVzdG9yZVN5c3RlbVByb3BlcnRpZXMoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROdWxsKFN5c3RlbS5nZXRQcm9wZXJ0eSgia2V5IikpOworICAgICAgICBhc3NlcnROdWxsKFN5c3RlbS5nZXRQcm9wZXJ0eSgia2V5MiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzZXJ0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV8yKQorICAgICAgICAgICAgfHwgSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV8zKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGMgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CisgICAgICAgIGMuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgib3JnLmFwYWNoZS50b29scy5hbnQuQ29tbWFuZGxpbmVKYXZhVGVzdCIpOworICAgICAgICBjLnNldENsYXNzbmFtZSgianVuaXQudGV4dHVpLlRlc3RSdW5uZXIiKTsKKyAgICAgICAgYy5jcmVhdGVWbUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1EamF2YS5jb21waWxlcj1OT05FIik7CisgICAgICAgIEFzc2VydGlvbnMgYSA9IG5ldyBBc3NlcnRpb25zKCk7CisgICAgICAgIGEuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgQXNzZXJ0aW9ucy5FbmFibGVkQXNzZXJ0aW9uIGVhID0gbmV3IEFzc2VydGlvbnMuRW5hYmxlZEFzc2VydGlvbigpOworICAgICAgICBlYS5zZXRDbGFzcygianVuaXQudGV4dHVpLlRlc3RSdW5uZXIiKTsKKyAgICAgICAgYS5hZGRFbmFibGUoZWEpOworICAgICAgICBjLnNldEFzc2VydGlvbnMoYSk7CisKKyAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWQgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICItRGphdmEuY29tcGlsZXI9Tk9ORSIsCisgICAgICAgICAgICAiLWVhOmp1bml0LnRleHR1aS5UZXN0UnVubmVyIiwKKyAgICAgICAgICAgICJqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lciIsCisgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQuQ29tbWFuZGxpbmVKYXZhVGVzdCIsCisgICAgICAgIH07CisgICAgICAgICAgICAKKyAgICAgICAgLy8gb25seSB0aGUgc2Vjb25kIGl0ZXJhdGlvbiB3b3VsZCBwYXNzIGJlY2F1c2Ugb2YgUFIgMjcyMTgKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBjLmdldENvbW1hbmRsaW5lKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBzLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IGV4cGVjdGVkLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2pdLCBzW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDb21tYW5kbGluZUphdmEgYzIgPSAoQ29tbWFuZGxpbmVKYXZhKSBjLmNsb25lKCk7CisgICAgICAgIFN0cmluZ1tdIHMgPSBjMi5nZXRDb21tYW5kbGluZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgZXhwZWN0ZWQubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFtqXSwgc1tqXSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTljNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworLyoqCisgKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQuQ29tbWFuZExpbmUKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tYW5kbGluZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgQ29tbWFuZGxpbmVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUb2tlbml6ZXIoKSB7CisgICAgICAgIFN0cmluZ1tdIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiMSAyIDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaW1wbGUgY2FzZSIsIDMsIHMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiKyhpKzEpLCBzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZW1wdHkgc3RyaW5nIiwgMCwgcy5sZW5ndGgpOworCisgICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZShudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwgMCwgcy5sZW5ndGgpOworCisgICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiMSBcJzJcJyAzIik7CisgICAgICAgIGFzc2VydEVxdWFscygiU2ltcGxlIGNhc2Ugd2l0aCBzaW5nbGUgcXVvdGVzIiwgMywgcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZSBxdW90ZXMgaGF2ZSBiZWVuIHN0cmlwcGVkIiwgIjIiLCBzWzFdKTsKKworICAgICAgICBzID0gQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoIjEgXCIyXCIgMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbXBsZSBjYXNlIHdpdGggZG91YmxlIHF1b3RlcyIsIDMsIHMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEb3VibGUgcXVvdGVzIGhhdmUgYmVlbiBzdHJpcHBlZCIsICIyIiwgc1sxXSk7CisKKyAgICAgICAgcyA9IENvbW1hbmRsaW5lLnRyYW5zbGF0ZUNvbW1hbmRsaW5lKCIxIFwiMiAzXCIgNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNhc2Ugd2l0aCBkb3VibGUgcXVvdGVzIGFuZCB3aGl0ZXNwYWNlIiwgMywgcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRvdWJsZSBxdW90ZXMgc3RyaXBwZWQsIHNwYWNlIGluY2x1ZGVkIiwgIjIgMyIsIHNbMV0pOworCisgICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiMSBcIjJcJzNcIiA0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2FzZSB3aXRoIGRvdWJsZSBxdW90ZXMgYXJvdW5kIHNpbmdsZSBxdW90ZSIsIDMsIHMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEb3VibGUgcXVvdGVzIHN0cmlwcGVkLCBzaW5nbGUgcXVvdGUgaW5jbHVkZWQiLCAiMlwnMyIsCisgICAgICAgICAgICAgICAgICAgICBzWzFdKTsKKworICAgICAgICBzID0gQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoIjEgXCcyIDNcJyA0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2FzZSB3aXRoIHNpbmdsZSBxdW90ZXMgYW5kIHdoaXRlc3BhY2UiLCAzLCBzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2luZ2xlIHF1b3RlcyBzdHJpcHBlZCwgc3BhY2UgaW5jbHVkZWQiLCAiMiAzIiwgc1sxXSk7CisKKyAgICAgICAgcyA9IENvbW1hbmRsaW5lLnRyYW5zbGF0ZUNvbW1hbmRsaW5lKCIxIFwnMlwiM1wnIDQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYXNlIHdpdGggc2luZ2xlIHF1b3RlcyBhcm91bmQgZG91YmxlIHF1b3RlIiwgMywgcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZSBxdW90ZXMgc3RyaXBwZWQsIGRvdWJsZSBxdW90ZSBpbmNsdWRlZCIsICIyXCIzIiwKKyAgICAgICAgICAgICAgICAgICAgIHNbMV0pOworCisgICAgICAgIC8vIFwgZG9lc24ndCBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGFueW1vcmUgLSB0aGlzIGlzIGRpZmZlcmVudCBmcm9tCisgICAgICAgIC8vIHdoYXQgdGhlIFVuaXggc2ggZG9lcyBidXQgY2F1c2VzIGEgbG90IG9mIHByb2JsZW1zIG9uIERPUworICAgICAgICAvLyBiYXNlZCBwbGF0Zm9ybXMgb3RoZXJ3aXNlCisgICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiMSAyXFwgMyA0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiY2FzZSB3aXRoIHF1b3RlZCB3aGl0ZXNwYWNlIiwgNCwgcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhY2tzbGFzaCBpbmNsdWRlZCIsICIyXFwiLCBzWzFdKTsKKworICAgICAgICAvLyAiIiBzaG91bGQgYmVjb21lIGEgc2luZ2xlIGVtcHR5IGFyZ3VtZW50LCBzYW1lIGZvciAnJworICAgICAgICAvLyBQUiA1OTA2CisgICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiXCJcIiBhIik7CisgICAgICAgIGFzc2VydEVxdWFscygiRG91YmxlcXVvdGVkIG51bGwgYXJnIHByZXBlbmQiLCAyLCBzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRG91YmxlcXVvdGVkIG51bGwgYXJnIHByZXBlbmQiLCAiIiwgc1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRG91YmxlcXVvdGVkIG51bGwgYXJnIHByZXBlbmQiLCAiYSIsIHNbMV0pOworICAgICAgICBzID0gQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoImEgXCJcIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRvdWJsZXF1b3RlZCBudWxsIGFyZyBhcHBlbmQiLCAyLCBzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRG91YmxlcXVvdGVkIG51bGwgYXJnIGFwcGVuZCIsICJhIiwgc1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRG91YmxlcXVvdGVkIG51bGwgYXJnIGFwcGVuZCIsICIiLCBzWzFdKTsKKyAgICAgICAgcyA9IENvbW1hbmRsaW5lLnRyYW5zbGF0ZUNvbW1hbmRsaW5lKCJcIlwiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiRG91YmxlcXVvdGVkIG51bGwgYXJnIiwgMSwgcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRvdWJsZXF1b3RlZCBudWxsIGFyZyIsICIiLCBzWzBdKTsKKworICAgICAgICBzID0gQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoIlwnXCcgYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZXF1b3RlZCBudWxsIGFyZyBwcmVwZW5kIiwgMiwgcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZXF1b3RlZCBudWxsIGFyZyBwcmVwZW5kIiwgIiIsIHNbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZXF1b3RlZCBudWxsIGFyZyBwcmVwZW5kIiwgImEiLCBzWzFdKTsKKyAgICAgICAgcyA9IENvbW1hbmRsaW5lLnRyYW5zbGF0ZUNvbW1hbmRsaW5lKCJhIFwnXCciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaW5nbGVxdW90ZWQgbnVsbCBhcmcgYXBwZW5kIiwgMiwgcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZXF1b3RlZCBudWxsIGFyZyBhcHBlbmQiLCAiYSIsIHNbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZXF1b3RlZCBudWxsIGFyZyBhcHBlbmQiLCAiIiwgc1sxXSk7CisgICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiXCdcJyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZXF1b3RlZCBudWxsIGFyZyIsIDEsIHMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaW5nbGVxdW90ZWQgbnVsbCBhcmciLCAiIiwgc1swXSk7CisKKyAgICAgICAgLy8gbm93IHRvIHRoZSBleHBlY3RlZCBmYWlsdXJlcworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzID0gQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoImEgXCdiIGMiKTsKKyAgICAgICAgICAgIGZhaWwoInVuYmFsYW5jZWQgc2luZ2xlIHF1b3RlcyB1bmRldGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInVuYmFsYW5jZWQgcXVvdGVzIGluIGEgXCdiIGMiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiYSBcImIgYyIpOworICAgICAgICAgICAgZmFpbCgidW5iYWxhbmNlZCBkb3VibGUgcXVvdGVzIHVuZGV0ZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidW5iYWxhbmNlZCBxdW90ZXMgaW4gYSBcImIgYyIsIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgQ29tbWFuZGxpbmUudG9TdHJpbmcobmV3IFN0cmluZ1swXSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIENvbW1hbmRsaW5lLnRvU3RyaW5nKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIDIgMyIsIENvbW1hbmRsaW5lLnRvU3RyaW5nKG5ldyBTdHJpbmdbXSB7IjEiLCAiMiIsICIzIn0pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIFwiMiAzXCIiLCBDb21tYW5kbGluZS50b1N0cmluZyhuZXcgU3RyaW5nW10geyIxIiwgIjIgMyJ9KSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSBcIjJcJzNcIiIsIENvbW1hbmRsaW5lLnRvU3RyaW5nKG5ldyBTdHJpbmdbXSB7IjEiLCAiMlwnMyJ9KSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSBcJzJcIjNcJyIsIENvbW1hbmRsaW5lLnRvU3RyaW5nKG5ldyBTdHJpbmdbXSB7IjEiLCAiMlwiMyJ9KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEF3a0NvbW1hbmQoKXsKKyAgICAgICAgQ29tbWFuZGxpbmUgYyA9IG5ldyBDb21tYW5kbGluZSgpOworICAgICAgICBjLnNldEV4ZWN1dGFibGUoImF3ayIpOworICAgICAgICBjLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIidOUiA9PSAyIHsgcHJpbnQgJE5GIH0nIik7CisgICAgICAgIFN0cmluZ1tdIHMgPSBjLmdldENvbW1hbmRsaW5lKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocyk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXdrIiwgc1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiJ05SID09IDIgeyBwcmludCAkTkYgfSciLCBzWzFdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGVzY3JpcHRpb25UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGVzY3JpcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2NDY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EZXNjcmlwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIEZpbHRlclNldCB0ZXN0aW5nCisgKgorICovCitwdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25UZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgRGVzY3JpcHRpb25UZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjEueG1sIik7CisgICAgICAgIGFzc2VydEVxdWFscygiU2luZ2xlIGRlc2NyaXB0aW9uIGZhaWxlZCIsICJUZXN0IFByb2plY3QgRGVzY3JpcHRpb24iLCBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjIueG1sIik7CisgICAgICAgIGFzc2VydEVxdWFscygiTXVsdGkgbGluZSBkZXNjcmlwdGlvbiBmYWlsZWQiLCAiTXVsdGkgTGluZVxuUHJvamVjdCBEZXNjcmlwdGlvbiIsIHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMy54bWwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNdWx0aSBpbnN0YW5jZSBkZXNjcmlwdGlvbiBmYWlsZWQiLCAiTXVsdGkgSW5zdGFuY2UgUHJvamVjdCBEZXNjcmlwdGlvbiIsIHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uNC54bWwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNdWx0aSBpbnN0YW5jZSBuZXN0ZWQgZGVzY3JpcHRpb24gZmFpbGVkIiwgIk11bHRpIEluc3RhbmNlIE5lc3RlZCBQcm9qZWN0IERlc2NyaXB0aW9uIiwgcHJvamVjdC5nZXREZXNjcmlwdGlvbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGlyU2V0VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RpclNldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTdlZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RpclNldFRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EaXJTZXQuCisgKgorICovCitwdWJsaWMgY2xhc3MgRGlyU2V0VGVzdCBleHRlbmRzIEFic3RyYWN0RmlsZVNldFRlc3QgeworCisgICAgcHVibGljIERpclNldFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsZVNldCBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXJTZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVNldElzTm9EaXJTZXQoKSB7CisgICAgICAgIERpclNldCBkcyA9IChEaXJTZXQpIGdldEluc3RhbmNlKCk7CisgICAgICAgIGRzLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7CisgICAgICAgIGZzLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBmcyk7CisgICAgICAgIGRzLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXkiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcy5nZXREaXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGZhaWwoIkRpclNldCBjcmVhdGVkIGZyb20gRmlsZVNldCByZWZlcmVuY2UiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkdW1teSBkb2VzblwndCBkZW5vdGUgYSBEaXJTZXQiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBkcyA9IChEaXJTZXQpIGdldEluc3RhbmNlKCk7CisgICAgICAgIGRzLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgZHMpOworICAgICAgICBmcy5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MiIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZzLmdldERpcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgZmFpbCgiRmlsZVNldCBjcmVhdGVkIGZyb20gRGlyU2V0IHJlZmVyZW5jZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImR1bW15MiBkb2VzblwndCBkZW5vdGUgYSBGaWxlU2V0IiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgdG1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiRGlyU2V0VGVzdCIsICIiKTsKKyAgICAgICAgdG1wLmRlbGV0ZSgpOworICAgICAgICBGaWxlIGEgPSBuZXcgRmlsZSh0bXAsICJhIik7CisgICAgICAgIGEubWtkaXJzKCk7CisgICAgICAgIEZpbGUgYiA9IG5ldyBGaWxlKHRtcCwgImIiKTsKKyAgICAgICAgRmlsZSBiYyA9IG5ldyBGaWxlKGIsICJjIik7CisgICAgICAgIGJjLm1rZGlycygpOworICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShhLCAieCIpKS5jbG9zZSgpOworICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShiLCAieCIpKS5jbG9zZSgpOworICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShiYywgIngiKSkuY2xvc2UoKTsKKyAgICAgICAgRGlyU2V0IGRzID0gbmV3IERpclNldCgpOworICAgICAgICBkcy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIGRzLnNldERpcih0bXApOworICAgICAgICBkcy5zZXRJbmNsdWRlcygiYi8iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiO2IiICsgRmlsZS5zZXBhcmF0b3IgKyAiYyIsIGRzLnRvU3RyaW5nKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0VudW1lcmF0ZWRBdHRyaWJ1dGVUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW51bWVyYXRlZEF0dHJpYnV0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc1MWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0VudW1lcmF0ZWRBdHRyaWJ1dGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisvKioKKyAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC5FbnVtZXJhdGVkQXR0cmlidXRlLgorICovCitwdWJsaWMgY2xhc3MgRW51bWVyYXRlZEF0dHJpYnV0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBleHBlY3RlZCA9IHsiYSIsICJiIiwgImMifTsKKworICAgIHB1YmxpYyBFbnVtZXJhdGVkQXR0cmlidXRlVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7CisgICAgICAgIEVudW1lcmF0ZWRBdHRyaWJ1dGUgdDEgPSBuZXcgVGVzdE5vcm1hbCgpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWRbaV0rIiBpcyBpbiBUZXN0Tm9ybWFsIiwKKyAgICAgICAgICAgICAgICAgICB0MS5jb250YWluc1ZhbHVlKGV4cGVjdGVkW2ldKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkW2ldLnRvVXBwZXJDYXNlKCkrIiBpcyBpbiBUZXN0Tm9ybWFsIiwKKyAgICAgICAgICAgICAgICAgICAhdDEuY29udGFpbnNWYWx1ZShleHBlY3RlZFtpXS50b1VwcGVyQ2FzZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdE5vcm1hbCBkb2VzblwndCBoYXZlIFwiZFwiIGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAhdDEuY29udGFpbnNWYWx1ZSgiZCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGVzdE51bGwgZG9lc25cJ3QgaGF2ZSBcImRcIiBhdHRyaWJ1dGUgYW5kIGRvZXNuXCd0IGRpZSIsCisgICAgICAgICAgICAgICAhKG5ldyBUZXN0TnVsbCgpKS5jb250YWluc1ZhbHVlKCJkIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGYWN0b3J5KCkgeworCQlGYWN0b3J5IGVhID0gKEZhY3RvcnkpRW51bWVyYXRlZEF0dHJpYnV0ZS5nZXRJbnN0YW5jZShGYWN0b3J5LmNsYXNzLCAib25lIik7CisJCWFzc2VydEVxdWFscygiRmFjdG9yeSBkaWQgbm90IHNldCB0aGUgcmlnaHQgdmFsdWUuIiwgZWEuZ2V0VmFsdWUoKSwgIm9uZSIpOworCQl0cnkgeworCSAgICAJRW51bWVyYXRlZEF0dHJpYnV0ZS5nZXRJbnN0YW5jZShGYWN0b3J5LmNsYXNzLCAiaWxsZWdhbCIpOworCSAgICAJZmFpbCgiRmFjdG9yeSBzaG91bGQgZmFpbCB3aGVuIHRyeWluZyB0byBzZXQgYW4gaWxsZWdhbCB2YWx1ZS4iKTsKKwkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKwkJCS8vIHdhcyBleHBlY3RlZAorCQl9CisJfQorCisJcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbnMoKSB7CisgICAgICAgIEVudW1lcmF0ZWRBdHRyaWJ1dGUgdDEgPSBuZXcgVGVzdE5vcm1hbCgpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdDEuc2V0VmFsdWUoZXhwZWN0ZWRbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBmb3IgdmFsdWUgIitleHBlY3RlZFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQxLnNldFZhbHVlKCJkIik7CisgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBleGNlcHRpb24gZm9yIHZhbHVlIFwiZFwiIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIChuZXcgVGVzdE51bGwoKSkuc2V0VmFsdWUoImQiKTsKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiBmb3IgdmFsdWUgXCJkXCIgaW4gVGVzdE51bGwiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIG90aGVyKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIGRlYXRoIG9mIFRlc3ROdWxsOiAiK290aGVyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3ROb3JtYWwgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBleHBlY3RlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE51bGwgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIm9uZSIsICJ0d28iLCAidGhyZWUiIH07CisgICAgCX0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZUxpc3RUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZUxpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmNGYxMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlTGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBTb21lIHRlc3RzIGZvciBmaWxlbGlzdC4KKyAqLworCitwdWJsaWMgY2xhc3MgRmlsZUxpc3RUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgRmlsZUxpc3RUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWxlbGlzdC54bWwiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudElmSXNSZWZlcmVuY2UoKSB7CisgICAgICAgIEZpbGVMaXN0IGYgPSBuZXcgRmlsZUxpc3QoKTsKKyAgICAgICAgZi5zZXREaXIocHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIEZpbGVMaXN0IHdpdGggZGlyZWN0b3J5IGF0dHJpYnV0ZSBzZXQuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBmID0gbmV3IEZpbGVMaXN0KCk7CisgICAgICAgIGYuc2V0RmlsZXMoImZvby54bWwsYy9kL2Jhci54bWwiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIEZpbGVMaXN0IHdpdGggZmlsZSBhdHRyaWJ1dGUgc2V0LiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgZiA9IG5ldyBGaWxlTGlzdCgpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLnNldEZpbGVzKCJhL2IvZm9vLmphdmEiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgZmlsZXMgaW4gRmlsZUxpc3QgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5zZXREaXIocHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgZGlyIGluIEZpbGVMaXN0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKKyAgICAgICAgRmlsZUxpc3QgZiA9IG5ldyBGaWxlTGlzdCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBmKTsKKyAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15IikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5nZXREaXIocHJvamVjdCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBGaWxlTGlzdCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5nZXRGaWxlcyhwcm9qZWN0KTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIEZpbGVMaXN0IGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAtLT4gZHVtbXkxCisgICAgICAgIEZpbGVMaXN0IGYxID0gbmV3IEZpbGVMaXN0KCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBmMSk7CisgICAgICAgIGYxLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXkyIikpOworICAgICAgICBGaWxlTGlzdCBmMiA9IG5ldyBGaWxlTGlzdCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgZjIpOworICAgICAgICBmMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MyIpKTsKKyAgICAgICAgRmlsZUxpc3QgZjMgPSBuZXcgRmlsZUxpc3QoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIGYzKTsKKyAgICAgICAgZjMuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teTEiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmMS5nZXREaXIocHJvamVjdCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBjaXJjdWxhciByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZjEuZ2V0RmlsZXMocHJvamVjdCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBjaXJjdWxhciByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMKKyAgICAgICAgLy8gKHdoaWNoIGhhcyB0aGUgUHJvamVjdCdzIGJhc2VkaXIgYXMgcm9vdCkuCisgICAgICAgIGYxID0gbmV3IEZpbGVMaXN0KCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBmMSk7CisgICAgICAgIGYxLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXkyIikpOworICAgICAgICBmMiA9IG5ldyBGaWxlTGlzdCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgZjIpOworICAgICAgICBmMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MyIpKTsKKyAgICAgICAgZjMgPSBuZXcgRmlsZUxpc3QoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIGYzKTsKKyAgICAgICAgZjMuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7CisgICAgICAgIEZpbGUgZGlyID0gZjEuZ2V0RGlyKHByb2plY3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRpciBpcyBiYXNlZGlyIiwgZGlyLCBwcm9qZWN0LmdldEJhc2VEaXIoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB7CisgICAgICAgIGV4cGVjdExvZygic2ltcGxlIiwgIi9hYmMvYSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoKSB7CisgICAgICAgIGV4cGVjdExvZygiZG91YmxlIiwgIi9hYmMvYTovYWJjL2IiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkKCkgeworICAgICAgICBleHBlY3RMb2coIm5lc3RlZCIsICIvYWJjL2E6L2FiYy9iIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVTZXRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZVNldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTk1OTg2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVTZXRUZXN0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCisKKy8qKgorICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQuCisgKgorICogPHA+VGhpcyBkb2Vzbid0IGFjdHVhbGx5IHRlc3QgbXVjaCwgbWFpbmx5IHJlZmVyZW5jZSBoYW5kbGluZy4KKyAqCisgKi8KKworcHVibGljIGNsYXNzIEZpbGVTZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RGaWxlU2V0VGVzdCB7CisKKyAgICBwdWJsaWMgRmlsZVNldFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsZVNldCBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlU2V0KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyU2V0VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjAxNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldFRlc3QuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogRmlsdGVyU2V0IHRlc3RpbmcKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJTZXRUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgQlVGX1NJWkUgPSAzMjc2ODsKKworICAgIHB1YmxpYyBGaWx0ZXJTZXRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXQueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsdGVyc2V0IDEgZmFpbGVkIiwgY29tcGFyZUZpbGVzKCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9nb2xkL2ZpbHRlcnNldDEudHh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXN0MS50eHQiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgIGFzc2VydFRydWUoIkZpbHRlcnNldCAyIGZhaWxlZCIsIGNvbXBhcmVGaWxlcygic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQyLnR4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzdDIudHh0IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWx0ZXJzZXQgMyBmYWlsZWQiLCBjb21wYXJlRmlsZXMoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2dvbGQvZmlsdGVyc2V0My50eHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc3QzLnR4dCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHdpbGwgdGVzdCB0aGUgcmVjdXJzaXZlIEZpbHRlclNldC4gIFdoaWNoIG1lYW5zIHRoYXQgaWYKKyAgICAgKiB0aGUgZmlsdGVyIHZhbHVlIEB0ZXN0QCBjb250YWlucyBhbm90aGVyIGZpbHRlciB2YWx1ZSwgaXQgd2lsbAorICAgICAqIGFjdHVhbGx5IHJlc29sdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZSgpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICJpdCB3b3JrcyBsaW5lIjsKKyAgICAgICAgU3RyaW5nIGxpbmU9IkB0ZXN0QCBsaW5lIjsKKyAgICAgICAgRmlsdGVyU2V0IGZzID0gbmV3IEZpbHRlclNldCgpOworICAgICAgICBmcy5hZGRGaWx0ZXIoInRlc3QiLCAiQHRlc3QxQCIpOworICAgICAgICBmcy5hZGRGaWx0ZXIoInRlc3QxIiwiQHRlc3QyQCIpOworICAgICAgICBmcy5hZGRGaWx0ZXIoInRlc3QyIiwgIml0IHdvcmtzIik7CisgICAgICAgIGZzLnNldEJlZ2luVG9rZW4oIkAiKTsKKyAgICAgICAgZnMuc2V0RW5kVG9rZW4oIkAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZnMucmVwbGFjZVRva2VucyhsaW5lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBzZWUgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHJlc29sdmluZyBvY2N1cnMgaW4gYW4KKyAgICAgKiBpbmZpbml0ZSBsb29wLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZpbml0ZSgpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICJAdGVzdEAgbGluZSB0ZXN0dmFsdWUiOworICAgICAgICBTdHJpbmcgbGluZSA9ICJAdGVzdEAgbGluZSBAdGVzdDNAIjsKKyAgICAgICAgRmlsdGVyU2V0IGZzID0gbmV3IEZpbHRlclNldCgpOworICAgICAgICBmcy5hZGRGaWx0ZXIoInRlc3QiLCAiQHRlc3QxQCIpOworICAgICAgICBmcy5hZGRGaWx0ZXIoInRlc3QxIiwiQHRlc3QyQCIpOworICAgICAgICBmcy5hZGRGaWx0ZXIoInRlc3QyIiwgIkB0ZXN0QCIpOworICAgICAgICBmcy5hZGRGaWx0ZXIoInRlc3QzIiwgInRlc3R2YWx1ZSIpOworICAgICAgICBmcy5zZXRCZWdpblRva2VuKCJAIik7CisgICAgICAgIGZzLnNldEVuZFRva2VuKCJAIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGZzLnJlcGxhY2VUb2tlbnMobGluZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdG8gc2VlIHdoYXQgaGFwcGVucyB3aGVuIHRoZSByZXNvbHZpbmcgb2NjdXJzIGluCisgICAgICogd2hhdCB3b3VsZCBiZSBhbiBpbmZpbml0ZSBsb29wLCBidXQgd2l0aCByZWN1cnNpb24gZGlzYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlY3Vyc2lvbkRpc2FibGVkKCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIkB0ZXN0MUAgbGluZSB0ZXN0dmFsdWUiOworICAgICAgICBTdHJpbmcgbGluZSA9ICJAdGVzdEAgbGluZSBAdGVzdDJAIjsKKyAgICAgICAgRmlsdGVyU2V0IGZzID0gbmV3IEZpbHRlclNldCgpOworICAgICAgICBmcy5hZGRGaWx0ZXIoInRlc3QiLCAiQHRlc3QxQCIpOworICAgICAgICBmcy5hZGRGaWx0ZXIoInRlc3QxIiwiQHRlc3RAIik7CisgICAgICAgIGZzLmFkZEZpbHRlcigidGVzdDIiLCAidGVzdHZhbHVlIik7CisgICAgICAgIGZzLnNldEJlZ2luVG9rZW4oIkAiKTsKKyAgICAgICAgZnMuc2V0RW5kVG9rZW4oIkAiKTsKKyAgICAgICAgZnMuc2V0UmVjdXJzZShmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGZzLnJlcGxhY2VUb2tlbnMobGluZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25JbmZpbml0ZVJlY3Vyc2l2ZU11bHRpcGxlT25TaW5nbGVMaW5lKCkgeworICAgICAgICBGaWx0ZXJTZXQgZmlsdGVycyA9IG5ldyBGaWx0ZXJTZXQoKTsKKworICAgICAgICBmaWx0ZXJzLnNldEJlZ2luVG9rZW4oIjwiKTsKKyAgICAgICAgZmlsdGVycy5zZXRFbmRUb2tlbigiPiIpOworCisgICAgICAgIGZpbHRlcnMuYWRkRmlsdGVyKCJ1bCIsICI8aXRlbWl6ZWRsaXN0PiIpOworICAgICAgICBmaWx0ZXJzLmFkZEZpbHRlcigiL3VsIiwgIjwvaXRlbWl6ZWRMaXN0PiIpOworICAgICAgICBmaWx0ZXJzLmFkZEZpbHRlcigibGkiLCAiPGxpc3RpdGVtPiIpOworICAgICAgICBmaWx0ZXJzLmFkZEZpbHRlcigiL2xpIiwgIjwvbGlzdGl0ZW0+Iik7CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICI8aXRlbWl6ZWRsaXN0PjxsaXN0aXRlbT5JdGVtIDE8L2xpc3RpdGVtPiA8bGlzdGl0ZW0+SXRlbSAyPC9saXN0aXRlbT48L2l0ZW1pemVkTGlzdD4iOworICAgICAgICBTdHJpbmcgbGluZSA9ICI8dWw+PGxpPkl0ZW0gMTwvbGk+IDxsaT5JdGVtIDI8L2xpPjwvdWw+IjsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBmaWx0ZXJzLnJlcGxhY2VUb2tlbnMobGluZSkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkRmlsdGVyU2V0cygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdC1uZXN0ZWQtZmlsdGVyc2V0cyIpOworCisgICAgICAgIEZpbHRlclNldCBmcyA9IChGaWx0ZXJTZXQpIGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoIjEiKTsKKyAgICAgICAgSGFzaHRhYmxlIGZpbHRlcnMgPSBmcy5nZXRGaWx0ZXJIYXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBmaWx0ZXJzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgZmlsdGVycy5nZXQoInRva2VuMSIpKTsKKworICAgICAgICBmcyA9IChGaWx0ZXJTZXQpIGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoIjIiKTsKKyAgICAgICAgZmlsdGVycyA9IGZzLmdldEZpbHRlckhhc2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcnMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMTExIiwgZmlsdGVycy5nZXQoImFhYWEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjIyMiIsIGZpbHRlcnMuZ2V0KCJiYmJiIikpOworCisgICAgICAgIGZzID0gKEZpbHRlclNldCkgZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiMyIpOworICAgICAgICBmaWx0ZXJzID0gZnMuZ2V0RmlsdGVySGFzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZmlsdGVycy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlNCIsIGZpbHRlcnMuZ2V0KCJ0b2tlbjQiKSk7CisKKyAgICAgICAgZnMgPSAoRmlsdGVyU2V0KSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCI1Iik7CisgICAgICAgIGZpbHRlcnMgPSBmcy5nZXRGaWx0ZXJIYXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBmaWx0ZXJzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgZmlsdGVycy5nZXQoInRva2VuMSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyc0ZpbGVFbGVtZW50KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyc0ZpbGVFbGVtZW50Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbHRlcnNGaWxlQXR0cmlidXRlKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyc0ZpbGVBdHRyaWJ1dGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVGaWx0ZXJzRmlsZXMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RNdWx0aXBsZUZpbHRlcnNGaWxlcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRmlsdGVyc0ZpbGUoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0TWlzc2luZ0ZpbHRlcnNGaWxlIiwKKyAgICAgICAgICAgICJzaG91bGQgZmFpbCBkdWUgdG8gbWlzc2luZyBmaWx0ZXJzZmlsZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvd01pc3NpbmdGaWx0ZXJzRmlsZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEFsbG93TWlzc2luZ0ZpbHRlcnNGaWxlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVGaWxlcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgeworICAgICAgICBGaWxlIGZpbGUxID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIG5hbWUxKTsKKyAgICAgICAgRmlsZSBmaWxlMiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCBuYW1lMik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghZmlsZTEuZXhpc3RzKCkgfHwgIWZpbGUyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPbmUgb3IgYm90aCBmaWxlcyBkbyBub3QgZXhpc3Q6IiArIG5hbWUxICsgIiwgIiArIG5hbWUyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaWxlMS5sZW5ndGgoKSAhPSBmaWxlMi5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBzaXplIG1pc21hdGNoOiIgKyBuYW1lMSArICIoIiArIGZpbGUxLmxlbmd0aCgpICsgIiksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lMiAgKyAiKCIgKyBmaWxlMi5sZW5ndGgoKSArICIpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBieXRlIC0gYnl0ZSBjb21wYXJlCisgICAgICAgICAgICBieXRlW10gYnVmZmVyMSA9IG5ldyBieXRlW0JVRl9TSVpFXTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIyID0gbmV3IGJ5dGVbQlVGX1NJWkVdOworCisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzMSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTEpOworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpczIgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgcmVhZCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBmaXMxLnJlYWQoYnVmZmVyMSkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgZmlzMi5yZWFkKGJ1ZmZlcjIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVhZDsgKytpLCArK2luZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIxW2ldICE9IGJ1ZmZlcjJbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnl0ZXMgbWlzbWF0Y2g6IiArIG5hbWUxICsgIiwgIiArIG5hbWUyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGF0IGJ5dGUgIiArIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPRXhjZXB0aW9uIGNvbXBhcmluZyBmaWxlczogIiArIG5hbWUxICsgIiwgIiArIG5hbWUyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GbGV4SW50ZWdlclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GbGV4SW50ZWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjE4Yjc2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZsZXhJbnRlZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEZsZXhJbnRlZ2VyVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIEZsZXhJbnRlZ2VyVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmxleGludGVnZXIueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZsZXhJbnRlZ2VyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhwcm9qZWN0LmdldFByb3BlcnR5KCJmbGV4aW50LnZhbHVlMSIpLCAiMTAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByb2plY3QuZ2V0UHJvcGVydHkoImZsZXhpbnQudmFsdWUyIiksICI4Iik7CisgICAgfQorCisgICAgLy8gVGhpcyBjbGFzcyBhY3RzIGFzIGEgY3VzdG9tIEFudCB0YXNrIGFsc28KKyAgICAvLyBhbmQgdXNlcyB0aGVzZSB2YXJpYWJsZXMvbWV0aG9kcyBpbiB0aGF0IG1vZGUKKyAgICBwcml2YXRlIFByb2plY3QgdGFza1Byb2plY3Q7CisgICAgU3RyaW5nIHByb3BOYW1lOworICAgIHByaXZhdGUgRmxleEludGVnZXIgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBUbyBtYWtlIHRhc2tkZWYgaGFwcHkKKyAgICAgKi8KKyAgICBwdWJsaWMgRmxleEludGVnZXJUZXN0KCkgeworICAgICAgICBzdXBlcigiRmxleEludGVnZXJUZXN0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcE5hbWUoU3RyaW5nIHByb3BOYW1lKSB7CisgICAgICAgIHRoaXMucHJvcE5hbWUgPSBwcm9wTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShGbGV4SW50ZWdlciB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdGFza1Byb2plY3QgPSBwcm9qZWN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIGlmIChwcm9wTmFtZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibmFtZSBhbmQgdmFsdWUgcmVxdWlyZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRhc2tQcm9qZWN0LnNldE5ld1Byb3BlcnR5KHByb3BOYW1lLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvTWFwcGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01hcHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY2MDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01hcHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNoYWluZWRNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZsYXRGaWxlTmFtZU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkdsb2JQYXR0ZXJuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTWVyZ2luZ01hcHBlcjsKKworLyoqCisgKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyLgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgTWFwcGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgcHVibGljIE1hcHBlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOworICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoIi4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZSgpIHsKKyAgICAgICAgTWFwcGVyIG0gPSBuZXcgTWFwcGVyKHByb2plY3QpOworICAgICAgICBtLnNldEZyb20oIiouamF2YSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIE1hcHBlciB3aXRoIGZyb20gYXR0cmlidXRlIHNldCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgbSA9IG5ldyBNYXBwZXIocHJvamVjdCk7CisgICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtLnNldEZyb20oIiouamF2YSIpOworICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBmcm9tIGluIE1hcHBlciB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgbSA9IG5ldyBNYXBwZXIocHJvamVjdCk7CisgICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtLnNldFRvKCIqLmphdmEiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgdG8gaW4gTWFwcGVyIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIG10ID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CisgICAgICAgICAgICBtdC5zZXRWYWx1ZSgiZ2xvYiIpOworICAgICAgICAgICAgbS5zZXRUeXBlKG10KTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgdHlwZSBpbiBNYXBwZXIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaXJjdWxhclJlZmVyZW5jZUNoZWNrKCkgeworICAgICAgICBNYXBwZXIgbSA9IG5ldyBNYXBwZXIocHJvamVjdCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teSIsIG0pOworICAgICAgICBtLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15IikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbS5nZXRJbXBsZW1lbnRhdGlvbigpOworICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgTWFwcGVyIGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAtLT4gZHVtbXkxCisgICAgICAgIE1hcHBlciBtMSA9IG5ldyBNYXBwZXIocHJvamVjdCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBtMSk7CisgICAgICAgIG0xLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15MiIpKTsKKyAgICAgICAgTWFwcGVyIG0yID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIG0yKTsKKyAgICAgICAgbTIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkzIikpOworICAgICAgICBNYXBwZXIgbTMgPSBuZXcgTWFwcGVyKHByb2plY3QpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgbTMpOworICAgICAgICBtMy5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTEiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtMS5nZXRJbXBsZW1lbnRhdGlvbigpOworICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkdW1teTEgLS0+IGR1bW15MiAtLT4gZHVtbXkzCisgICAgICAgIC8vICh3aGljaCBob2xkcyBhIGdsb2IgbWFwcGVyIGZyb20gIiouamF2YSIgdG8gIiouY2xhc3MiCisgICAgICAgIG0xID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIG0xKTsKKyAgICAgICAgbTEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkyIikpOworICAgICAgICBtMiA9IG5ldyBNYXBwZXIocHJvamVjdCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTIiLCBtMik7CisgICAgICAgIG0yLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15MyIpKTsKKyAgICAgICAgbTMgPSBuZXcgTWFwcGVyKHByb2plY3QpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgbTMpOworICAgICAgICBNYXBwZXIuTWFwcGVyVHlwZSBtdCA9IG5ldyBNYXBwZXIuTWFwcGVyVHlwZSgpOworICAgICAgICBtdC5zZXRWYWx1ZSgiZ2xvYiIpOworICAgICAgICBtMy5zZXRUeXBlKG10KTsKKyAgICAgICAgbTMuc2V0RnJvbSgiKi5qYXZhIik7CisgICAgICAgIG0zLnNldFRvKCIqLmNsYXNzIik7CisgICAgICAgIEZpbGVOYW1lTWFwcGVyIGZtbSA9IG0xLmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgIGFzc2VydFRydWUoInNob3VsZCBiZSBnbG9iIiwgZm1tIGluc3RhbmNlb2YgR2xvYlBhdHRlcm5NYXBwZXIpOworICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBmbW0ubWFwRmlsZU5hbWUoImEuamF2YSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEuamF2YSBzaG91bGQgbWF0Y2giLCAxLCByZXN1bHQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLmNsYXNzIiwgcmVzdWx0WzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkKCkgeworICAgICAgICBNYXBwZXIgbWFwcGVyMSA9IG5ldyBNYXBwZXIocHJvamVjdCk7CisgICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIG10ID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CisgICAgICAgIG10LnNldFZhbHVlKCJnbG9iIik7CisgICAgICAgIG1hcHBlcjEuc2V0VHlwZShtdCk7CisgICAgICAgIG1hcHBlcjEuc2V0RnJvbSgiZnJvbSoiKTsKKyAgICAgICAgbWFwcGVyMS5zZXRUbygidG8qIik7CisKKyAgICAgICAgLy9taXggZWxlbWVudCB0eXBlcworICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIyID0gbmV3IEZsYXRGaWxlTmFtZU1hcHBlcigpOworICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIzID0gbmV3IE1lcmdpbmdNYXBwZXIoKTsKKyAgICAgICAgbWFwcGVyMy5zZXRUbygibWVyZ2VmaWxlIik7CisKKyAgICAgICAgTWFwcGVyIGNvbnRhaW5lciA9IG5ldyBNYXBwZXIocHJvamVjdCk7CisgICAgICAgIGNvbnRhaW5lci5hZGRDb25maWd1cmVkTWFwcGVyKG1hcHBlcjEpOworICAgICAgICBjb250YWluZXIuYWRkKG1hcHBlcjIpOworICAgICAgICBjb250YWluZXIuYWRkKG1hcHBlcjMpOworCisgICAgICAgIEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyID0gY29udGFpbmVyLmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgIFN0cmluZ1tdIHRhcmdldHMgPSBmaWxlTmFtZU1hcHBlci5tYXBGaWxlTmFtZSgiZnJvbWZpbGVuYW1lIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoIm5vIGZpbGVuYW1lcyBtYXBwZWQiLCB0YXJnZXRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgZmlsZW5hbWVzIG1hcHBlZCIsIDMsIHRhcmdldHMubGVuZ3RoKTsKKyAgICAgICAgTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdCh0YXJnZXRzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZXhwZWN0ZWQgdGFyZ2V0IFwidG9maWxlbmFtZVwiIiwKKyAgICAgICAgICAgIGxpc3QuY29udGFpbnMoInRvZmlsZW5hbWUiKSk7CisgICAgICAgIGFzc2VydFRydWUoImNhbm5vdCBmaW5kIGV4cGVjdGVkIHRhcmdldCBcImZyb21maWxlbmFtZVwiIiwKKyAgICAgICAgICAgIGxpc3QuY29udGFpbnMoImZyb21maWxlbmFtZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZXhwZWN0ZWQgdGFyZ2V0IFwibWVyZ2VmaWxlXCIiLAorICAgICAgICAgICAgbGlzdC5jb250YWlucygibWVyZ2VmaWxlIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFpbmVkKCkgeworCisgICAgICAgIC8vIGEgLS0+IGIgLS0+IGMgLS0tIGRlZgorICAgICAgICAvLyAgICAgICAgICAgICAgIFwtLSBnaGkKKworICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXJBQiA9IG5ldyBHbG9iUGF0dGVybk1hcHBlcigpOworICAgICAgICBtYXBwZXJBQi5zZXRGcm9tKCJhIik7CisgICAgICAgIG1hcHBlckFCLnNldFRvKCJiIik7CisKKyAgICAgICAgRmlsZU5hbWVNYXBwZXIgbWFwcGVyQkMgPSBuZXcgR2xvYlBhdHRlcm5NYXBwZXIoKTsKKyAgICAgICAgbWFwcGVyQkMuc2V0RnJvbSgiYiIpOworICAgICAgICBtYXBwZXJCQy5zZXRUbygiYyIpOworCisgICAgICAgIC8vaW1wbGljaXQgY29tcG9zaXRlCisgICAgICAgIE1hcHBlciBtYXBwZXJDWCA9IG5ldyBNYXBwZXIocHJvamVjdCk7CisKKyAgICAgICAgRmlsZU5hbWVNYXBwZXIgbWFwcGVyREVGID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7CisgICAgICAgIG1hcHBlckRFRi5zZXRGcm9tKCJjIik7CisgICAgICAgIG1hcHBlckRFRi5zZXRUbygiZGVmIik7CisKKyAgICAgICAgRmlsZU5hbWVNYXBwZXIgbWFwcGVyR0hJID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7CisgICAgICAgIG1hcHBlckdISS5zZXRGcm9tKCJjIik7CisgICAgICAgIG1hcHBlckdISS5zZXRUbygiZ2hpIik7CisKKyAgICAgICAgbWFwcGVyQ1guYWRkKG1hcHBlckRFRik7CisgICAgICAgIG1hcHBlckNYLmFkZChtYXBwZXJHSEkpOworCisgICAgICAgIE1hcHBlciBjaGFpbmVkID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKKyAgICAgICAgY2hhaW5lZC5zZXRDbGFzc25hbWUoQ2hhaW5lZE1hcHBlci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBjaGFpbmVkLmFkZChtYXBwZXJBQik7CisgICAgICAgIGNoYWluZWQuYWRkKG1hcHBlckJDKTsKKyAgICAgICAgY2hhaW5lZC5hZGRDb25maWd1cmVkTWFwcGVyKG1hcHBlckNYKTsKKworICAgICAgICBGaWxlTmFtZU1hcHBlciBmaWxlTmFtZU1hcHBlciA9IGNoYWluZWQuZ2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICAgICAgU3RyaW5nW10gdGFyZ2V0cyA9IGZpbGVOYW1lTWFwcGVyLm1hcEZpbGVOYW1lKCJhIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoIm5vIGZpbGVuYW1lcyBtYXBwZWQiLCB0YXJnZXRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgZmlsZW5hbWVzIG1hcHBlZCIsIDIsIHRhcmdldHMubGVuZ3RoKTsKKyAgICAgICAgTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdCh0YXJnZXRzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZXhwZWN0ZWQgdGFyZ2V0IFwiZGVmXCIiLCBsaXN0LmNvbnRhaW5zKCJkZWYiKSk7CisgICAgICAgIGFzc2VydFRydWUoImNhbm5vdCBmaW5kIGV4cGVjdGVkIHRhcmdldCBcImdoaVwiIiwgbGlzdC5jb250YWlucygiZ2hpIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5VGFza1dpdGhUd29GaWxlc2V0cygpIHsKKyAgICAgICAgVGFza2RlZkZvckNvcHlUZXN0IHQgPSBuZXcgVGFza2RlZkZvckNvcHlUZXN0KCJ0ZXN0MSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5zZXRVcCgpOworICAgICAgICAgICAgdC50ZXN0MSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdC50ZWFyRG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBUYXNrZGVmRm9yQ29weVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICAgICAgVGFza2RlZkZvckNvcHlUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBzdXBlcihuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVyLnhtbCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0aFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTQ0YTkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0aFRlc3QuamF2YQpAQCAtMCwwICsxLDU2MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKKworLyoqCisgKiBKVW5pdCAzIHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aAorICoKKyAqLworCitwdWJsaWMgY2xhc3MgUGF0aFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbml4U3R5bGUgPSBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyID09ICc6JzsKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOZXRXYXJlID0gT3MuaXNGYW1pbHkoIm5ldHdhcmUiKTsKKworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgcHVibGljIFBhdGhUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpKTsKKyAgICB9CisKKyAgICAvLyBhY3R1YWxseSB0ZXN0cyBjb25zdHJ1Y3RvciBhcyB3ZWxsIGFzIHNldFBhdGgKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JVbml4U3R5bGUoKSB7CisgICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QsICIvYTovYiIpOworICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygidHdvIGl0ZW1zLCBVbml4IHN0eWxlIiwgMiwgbC5sZW5ndGgpOworICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL2EiLCBsWzBdKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL2IiLCBsWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiXFxhIiwgbFswXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlxcYiIsIGxbMV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGJhc2UgPSBuZXcgRmlsZShGaWxlLnNlcGFyYXRvcikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmFzZSArICJhIiwgbFswXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmFzZSArICJiIiwgbFsxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVQYXRoVW5peFN0eWxlKCkgeworICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjIikuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiLi46dGVzdGNhc2VzIik7CisgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28gaXRlbXMsIFVuaXggc3R5bGUiLCAyLCBsLmxlbmd0aCk7CisgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgeworICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHNyYy9ldGMiLAorICAgICAgICAgICAgICAgICBsWzBdLmVuZHNXaXRoKCIvc3JjIikpOworICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHNyYy9ldGMiLAorICAgICAgICAgICAgICAgICBsWzFdLmVuZHNXaXRoKCIvc3JjL2V0Yy90ZXN0Y2FzZXMiKSk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNOZXRXYXJlKSB7CisgICAgICAgICAgIGFzc2VydFRydWUoInRlc3QgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gc3JjL2V0YyIsCisgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIlxcc3JjIikpOworICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHNyYy9ldGMiLAorICAgICAgICAgICAgICAgICBsWzFdLmVuZHNXaXRoKCJcXHNyY1xcZXRjXFx0ZXN0Y2FzZXMiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGFzc2VydFRydWUoInRlc3QgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gc3JjL2V0YyIsCisgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIlxcc3JjIikpOworICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHNyYy9ldGMiLAorICAgICAgICAgICAgICAgICBsWzFdLmVuZHNXaXRoKCJcXHNyY1xcZXRjXFx0ZXN0Y2FzZXMiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JXaW5kb3dzU3R5bGUoKSB7CisgICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QsICJcXGE7XFxiIik7CisgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28gaXRlbXMsIERPUyBzdHlsZSIsIDIsIGwubGVuZ3RoKTsKKyAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9hIiwgbFswXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9iIiwgbFsxXSk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNOZXRXYXJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlxcYSIsIGxbMF0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJcXGIiLCBsWzFdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBiYXNlID0gbmV3IEZpbGUoRmlsZS5zZXBhcmF0b3IpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJhc2UgKyAiYSIsIGxbMF0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJhc2UgKyAiYiIsIGxbMV0pOworICAgICAgICB9CisKKyAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QsICJjOlxcdGVzdCIpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBkcml2ZXMgb24gVW5peCIsIDIsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLmVuZHNXaXRoKCIvYyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Rlc3QiLCBsWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMSwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjOlxcdGVzdCIsIGxbMF0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImRyaXZlcyBvbiBET1MiLCAxLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiYzpcXHRlc3Q7ZDpcXHByb2dyYW1zIik7CisgICAgICAgIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGRyaXZlcyBvbiBVbml4IiwgNCwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiYyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIi9jIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGVzdCIsIGxbMV0pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZCByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMl0uZW5kc1dpdGgoIi9kIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcHJvZ3JhbXMiLCBsWzNdKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMiwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjOlxcdGVzdCIsIGxbMF0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImQ6XFxwcm9ncmFtcyIsIGxbMV0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImRyaXZlcyBvbiBET1MiLCAyLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZDpcXHByb2dyYW1zIiwgbFsxXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiYzovdGVzdCIpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBkcml2ZXMgb24gVW5peCIsIDIsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLmVuZHNXaXRoKCIvYyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Rlc3QiLCBsWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMSwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjOlxcdGVzdCIsIGxbMF0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImRyaXZlcyBvbiBET1MiLCAxLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiYzovdGVzdDtkOi9wcm9ncmFtcyIpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBkcml2ZXMgb24gVW5peCIsIDQsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLmVuZHNXaXRoKCIvYyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Rlc3QiLCBsWzFdKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImQgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzJdLmVuZHNXaXRoKCIvZCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Byb2dyYW1zIiwgbFszXSk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNOZXRXYXJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZvbHVtZXMgb24gTmV0V2FyZSIsIDIsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYzpcXHRlc3QiLCBsWzBdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkOlxccHJvZ3JhbXMiLCBsWzFdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkcml2ZXMgb24gRE9TIiwgMiwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjOlxcdGVzdCIsIGxbMF0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImQ6XFxwcm9ncmFtcyIsIGxbMV0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JOZXRXYXJlU3R5bGUoKSB7CisgICAgICAgIC8vIHRyeSBhIG5ldHdhcmUtdm9sdW1lIGxlbmd0aCBwYXRoLCBzZWUgaG93IGl0IGlzIGhhbmRsZWQKKyAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgInN5czpcXHRlc3QiKTsKKyAgICAgICAgU3RyaW5nW10gbCA9IHAubGlzdCgpOworICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gZHJpdmVzIG9uIFVuaXgiLCAyLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLmVuZHNXaXRoKCIvc3lzIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGVzdCIsIGxbMV0pOworICAgICAgICB9IGVsc2UgaWYgKGlzTmV0V2FyZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeXM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMSwgbC5sZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBtdWx0aXBsZSBjaGFyYWN0ZXItbGVuZ3RoIHZvbHVtZXMgb24gV2luZG93cyIsIDIsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIlxcc3lzIikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMV0uZW5kc1dpdGgoIlxcdGVzdCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyeSBhIG11bHRpLXBhcnQgbmV0d2FyZS12b2x1bWUgbGVuZ3RoIHBhdGgsIHNlZSBob3cgaXQgaXMgaGFuZGxlZAorICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgInN5czpcXHRlc3Q7ZGV2OlxcdGVtcCIpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBkcml2ZXMgb24gVW5peCIsIDQsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIi9zeXMiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi90ZXN0IiwgbFsxXSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJkZXYgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzJdLmVuZHNXaXRoKCIvZGV2IikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGVtcCIsIGxbM10pOworICAgICAgICB9IGVsc2UgaWYgKGlzTmV0V2FyZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2x1bWVzIG9uIE5ldFdhcmUiLCAyLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInN5czpcXHRlc3QiLCBsWzBdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZXY6XFx0ZW1wIiwgbFsxXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gbXVsdGlwbGUgY2hhcmFjdGVyLWxlbmd0aCB2b2x1bWVzIG9uIFdpbmRvd3MiLCA0LCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLmVuZHNXaXRoKCJcXHN5cyIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInRlc3QgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzFdLmVuZHNXaXRoKCJcXHRlc3QiKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJkZXYgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzJdLmVuZHNXaXRoKCJcXGRldiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInRlbXAgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzNdLmVuZHNXaXRoKCJcXHRlbXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0cnkgYSBuZXR3YXJlLXZvbHVtZSBsZW5ndGggcGF0aCB3L2ZvcndhcmQgc2xhc2gsIHNlZSBob3cgaXQgaXMgaGFuZGxlZAorICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgInN5czovdGVzdCIpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBkcml2ZXMgb24gVW5peCIsIDIsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIi9zeXMiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi90ZXN0IiwgbFsxXSk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNOZXRXYXJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZvbHVtZXMgb24gTmV0V2FyZSIsIDEsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygic3lzOlxcdGVzdCIsIGxbMF0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIG11bHRpcGxlIGNoYXJhY3Rlci1sZW5ndGggdm9sdW1lcyBvbiBXaW5kb3dzIiwgMiwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3lzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiXFxzeXMiKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsxXS5lbmRzV2l0aCgiXFx0ZXN0IikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJ5IGEgbXVsdGktcGFydCBuZXR3YXJlLXZvbHVtZSBsZW5ndGggcGF0aCB3L2ZvcndhcmQgc2xhc2gsIHNlZSBob3cgaXQgaXMgaGFuZGxlZAorICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgInN5czovdGVzdDtkZXY6L3RlbXAiKTsKKyAgICAgICAgbCA9IHAubGlzdCgpOworICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gZHJpdmVzIG9uIFVuaXgiLCA0LCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLmVuZHNXaXRoKCIvc3lzIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGVzdCIsIGxbMV0pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZGV2IHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsyXS5lbmRzV2l0aCgiL2RldiIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3RlbXAiLCBsWzNdKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMiwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeXM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZGV2OlxcdGVtcCIsIGxbMV0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIG11bHRpcGxlIGNoYXJhY3Rlci1sZW5ndGggdm9sdW1lcyBvbiBXaW5kb3dzIiwgNCwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3lzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiXFxzeXMiKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsxXS5lbmRzV2l0aCgiXFx0ZXN0IikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZGV2IHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsyXS5lbmRzV2l0aCgiXFxkZXYiKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZW1wIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFszXS5lbmRzV2l0aCgiXFx0ZW1wIikpOworICAgICAgICAgfQorCisgICAgICAgIC8vIHRyeSBhIG11bHRpLXBhcnQgbmV0d2FyZS12b2x1bWUgbGVuZ3RoIHBhdGggd2l0aCBVTklYCisgICAgICAgIC8vIHNlcGFyYXRvciAodGhpcyB0ZXN0Y2FzZSBpZiBmcm9tIGFuIGFjdHVhbCBidWcgdGhhdCB3YXMKKyAgICAgICAgLy8gZm91bmQsIGluIEF2YWlsYWJsZVRlc3QsIHdoaWNoIHVzZXMgUGF0aFRva2VuaXplcikKKyAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QsCisgICAgICAgICAgICAgICAgICAgICAiU1lTOlxcSkFWQS9saWIvcnQuamFyOlNZUzpcXEpBVkEvbGliL2NsYXNzZXMuemlwIik7CisgICAgICAgIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGRyaXZlcyBvbiBVbml4IiwgMywgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3lzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiL1NZUyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL0pBVkEvbGliL3J0LmphciIsIGxbMV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvSkFWQS9saWIvY2xhc3Nlcy56aXAiLCBsWzJdKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMiwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeXM6XFxqYXZhXFxsaWJcXHJ0LmphciIsIGxbMF0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInN5czpcXGphdmFcXGxpYlxcY2xhc3Nlcy56aXAiLCBsWzFdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBtdWx0aXBsZSBjaGFyYWN0ZXItbGVuZ3RoIHZvbHVtZXMgb24gV2luZG93cyIsIDMsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIlxcU1lTIikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiamF2YS9saWIvcnQuamFyIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsxXS5lbmRzV2l0aCgiXFxKQVZBXFxsaWJcXHJ0LmphciIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImphdmEvbGliL2NsYXNzZXMuemlwIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsyXS5lbmRzV2l0aCgiXFxKQVZBXFxsaWJcXGNsYXNzZXMuemlwIikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yTWl4ZWRTdHlsZSgpIHsKKyAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIlxcYTtcXGI6L2MiKTsKKyAgICAgICAgU3RyaW5nW10gbCA9IHAubGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRocmVlIGl0ZW1zLCBtaXhlZCBzdHlsZSIsIDMsIGwubGVuZ3RoKTsKKyAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9hIiwgbFswXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9iIiwgbFsxXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9jIiwgbFsyXSk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNOZXRXYXJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlxcYSIsIGxbMF0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJcXGIiLCBsWzFdKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiXFxjIiwgbFsyXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgYmFzZSA9IG5ldyBGaWxlKEZpbGUuc2VwYXJhdG9yKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiYXNlICsgImEiLCBsWzBdKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiYXNlICsgImIiLCBsWzFdKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiYXNlICsgImMiLCBsWzJdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMb2NhdGlvbigpIHsKKyAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIHAuc2V0TG9jYXRpb24obmV3IEZpbGUoRmlsZS5zZXBhcmF0b3JDaGFyKyJhIikpOworICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CisgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL2EiLCBsWzBdKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlxcYSIsIGxbMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiOlxcYSIsIGxbMF0uc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRpbmcoKSB7CisgICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QsICIvYTovYiIpOworICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiBhZnRlciBjb25zdHJ1Y3Rpb24iLCAyLCBsLmxlbmd0aCk7CisgICAgICAgIHAuc2V0TG9jYXRpb24obmV3IEZpbGUoIi9jIikpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMyBhZnRlciBzZXRMb2NhdGlvbiIsIDMsIGwubGVuZ3RoKTsKKyAgICAgICAgcC5zZXRQYXRoKCJcXGQ7XFxlIik7CisgICAgICAgIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI1IGFmdGVyIHNldFBhdGgiLCA1LCBsLmxlbmd0aCk7CisgICAgICAgIHAuYXBwZW5kKG5ldyBQYXRoKHByb2plY3QsICJcXGYiKSk7CisgICAgICAgIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI2IGFmdGVyIGFwcGVuZCIsIDYsIGwubGVuZ3RoKTsKKyAgICAgICAgcC5jcmVhdGVQYXRoKCkuc2V0TG9jYXRpb24obmV3IEZpbGUoIi9nIikpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiNyBhZnRlciBhcHBlbmQiLCA3LCBsLmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHlQYXRoKCkgeworICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiIik7CisgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIGFmdGVyIGNvbnN0cnVjdGlvbiIsIDAsIGwubGVuZ3RoKTsKKyAgICAgICAgcC5zZXRQYXRoKCIiKTsKKyAgICAgICAgbCA9IHAubGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAgYWZ0ZXIgc2V0UGF0aCIsIDAsIGwubGVuZ3RoKTsKKyAgICAgICAgcC5hcHBlbmQobmV3IFBhdGgocHJvamVjdCkpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMCBhZnRlciBhcHBlbmQiLCAwLCBsLmxlbmd0aCk7CisgICAgICAgIHAuY3JlYXRlUGF0aCgpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMCBhZnRlciBhcHBlbmQiLCAwLCBsLmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVuaXF1ZSgpIHsKKyAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIi9hOi9hIik7CisgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIGFmdGVyIGNvbnN0cnVjdGlvbiIsIDEsIGwubGVuZ3RoKTsKKyAgICAgICAgU3RyaW5nIGJhc2UgPSBuZXcgRmlsZShGaWxlLnNlcGFyYXRvcikuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHAuc2V0TG9jYXRpb24obmV3IEZpbGUoYmFzZSwgImEiKSk7CisgICAgICAgIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIGFmdGVyIHNldExvY2F0aW9uIiwgMSwgbC5sZW5ndGgpOworICAgICAgICBwLnNldFBhdGgoIlxcYTsvYSIpOworICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSBhZnRlciBzZXRQYXRoIiwgMSwgbC5sZW5ndGgpOworICAgICAgICBwLmFwcGVuZChuZXcgUGF0aChwcm9qZWN0LCAiL2E7XFxhOlxcYSIpKTsKKyAgICAgICAgbCA9IHAubGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEgYWZ0ZXIgYXBwZW5kIiwgMSwgbC5sZW5ndGgpOworICAgICAgICBwLmNyZWF0ZVBhdGgoKS5zZXRQYXRoKCJcXGE6L2EiKTsKKyAgICAgICAgbCA9IHAubGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEgYWZ0ZXIgYXBwZW5kIiwgMSwgbC5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRJZklzUmVmZXJlbmNlKCkgeworICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiL2E6L2EiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBQYXRoIHdpdGggZWxlbWVudHMgZnJvbSBjb25zdHJ1Y3RvciIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QpOworICAgICAgICBwLnNldExvY2F0aW9uKG5ldyBGaWxlKCIvYSIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBQYXRoIHdpdGggZWxlbWVudHMgZnJvbSBzZXRMb2NhdGlvbiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgUGF0aCBhbm90aGVyID0gbmV3IFBhdGgocHJvamVjdCwgIi9hOi9hIik7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teXJlZiIsIGFub3RoZXIpOworICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnNldExvY2F0aW9uKG5ldyBGaWxlKCIvYSIpKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgbG9jYXRpb24gaW4gUGF0aCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuc2V0UGF0aCgiL2E7XFxhIik7CisgICAgICAgICAgICBmYWlsKCJDYW4gc2V0IHBhdGggaW4gUGF0aCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuY3JlYXRlUGF0aCgpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGNyZWF0ZSBuZXN0ZWQgUGF0aCBpbiBQYXRoIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuY3JlYXRlUGF0aEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBjcmVhdGUgbmVzdGVkIFBhdGhFbGVtZW50IGluIFBhdGggdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5hZGRGaWxlc2V0KG5ldyBGaWxlU2V0KCkpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgRmlsZVNldCBpbiBQYXRoIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuYWRkRmlsZWxpc3QobmV3IEZpbGVMaXN0KCkpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgRmlsZUxpc3QgaW4gUGF0aCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmFkZERpcnNldChuZXcgRGlyU2V0KCkpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgRGlyc2V0IGluIFBhdGggdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKKyAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teSIsIHApOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15IikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5saXN0KCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBQYXRoIGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAtLT4gZHVtbXkxCisgICAgICAgIFBhdGggcDEgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIHAxKTsKKyAgICAgICAgUGF0aCBwMiA9IHAxLmNyZWF0ZVBhdGgoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIHAyKTsKKyAgICAgICAgUGF0aCBwMyA9IHAyLmNyZWF0ZVBhdGgoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIHAzKTsKKyAgICAgICAgcDMuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkxIikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcDEubGlzdCgpOworICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkdW1teTEgLS0+IGR1bW15MiAtLT4gZHVtbXkzICh3aXRoIFBhdGggIi9hIikKKyAgICAgICAgcDEgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIHAxKTsKKyAgICAgICAgcDIgPSBwMS5jcmVhdGVQYXRoKCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTIiLCBwMik7CisgICAgICAgIHAzID0gcDIuY3JlYXRlUGF0aCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgcDMpOworICAgICAgICBwMy5zZXRMb2NhdGlvbihuZXcgRmlsZSgiL2EiKSk7CisgICAgICAgIFN0cmluZ1tdIGwgPSBwMS5saXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiT25lIGVsZW1lbnQgYnVyaWVkIGRlZXAgaW5zaWRlIGEgbmVzdGVkIHBhdGggc3RydWN0dXJlIiwKKyAgICAgICAgICAgICAgICAgICAgIDEsIGwubGVuZ3RoKTsKKyAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9hIiwgbFswXSk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNOZXRXYXJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlxcYSIsIGxbMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI6XFxhIiwgbFswXS5zdWJzdHJpbmcoMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVMaXN0KCkgeworICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgRmlsZUxpc3QgZiA9IG5ldyBGaWxlTGlzdCgpOworICAgICAgICBmLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIGYuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7CisgICAgICAgIGYuc2V0RmlsZXMoImJ1aWxkLnhtbCIpOworICAgICAgICBwLmFkZEZpbGVsaXN0KGYpOworICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBsLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcm9qZWN0LnJlc29sdmVGaWxlKCJidWlsZC54bWwiKS5nZXRBYnNvbHV0ZVBhdGgoKSwgbFswXSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVTZXQoKSB7CisgICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QpOworICAgICAgICBGaWxlU2V0IGYgPSBuZXcgRmlsZVNldCgpOworICAgICAgICBmLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIGYuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7CisgICAgICAgIGYuc2V0SW5jbHVkZXMoImJ1aWxkLnhtbCIpOworICAgICAgICBwLmFkZEZpbGVzZXQoZik7CisgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGwubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByb2plY3QucmVzb2x2ZUZpbGUoImJ1aWxkLnhtbCIpLmdldEFic29sdXRlUGF0aCgpLCBsWzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyU2V0KCkgeworICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgRGlyU2V0IGQgPSBuZXcgRGlyU2V0KCk7CisgICAgICAgIGQuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgZC5zZXREaXIocHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpKTsKKyAgICAgICAgZC5zZXRJbmNsdWRlcygiYnVpbGQiKTsKKyAgICAgICAgcC5hZGREaXJzZXQoZCk7CisgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGwubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByb2plY3QucmVzb2x2ZUZpbGUoImJ1aWxkIikuZ2V0QWJzb2x1dGVQYXRoKCksIGxbMF0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpb24oKSB7CisgICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5hcHBlbmQocCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcC5saXN0KCkubGVuZ3RoKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24geCkgeworICAgICAgICAgICAgU3RyaW5nIG0gPSB4LnRvU3RyaW5nKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG0sIG0uaW5kZXhPZigiY2lyY3VsYXIiKSAhPSAtMSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdHRlcm5TZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMGVkNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0LgorICoKKyAqIDxwPlRoaXMgZG9lc24ndCBhY3R1YWxseSB0ZXN0IG11Y2gsIG1haW5seSByZWZlcmVuY2UgaGFuZGxpbmcuPC9wPgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgUGF0dGVyblNldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIHB1YmxpYyBQYXR0ZXJuU2V0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcigiLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRJZklzUmVmZXJlbmNlKCkgeworICAgICAgICBQYXR0ZXJuU2V0IHAgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBwLnNldEluY2x1ZGVzKCIqKi8qLmphdmEiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBQYXR0ZXJuU2V0IHdpdGggZWxlbWVudHMgZnJvbSBzZXRJbmNsdWRlcyIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcCA9IG5ldyBQYXR0ZXJuU2V0KCk7CisgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnNldEluY2x1ZGVzKCIqKi8qLmphdmEiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgaW5jbHVkZXMgaW4gUGF0dGVyblNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcCA9IG5ldyBQYXR0ZXJuU2V0KCk7CisgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLnNldEluY2x1ZGVzZmlsZShuZXcgRmlsZSgiL2EiKSk7CisgICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGluY2x1ZGVzZmlsZSBpbiBQYXR0ZXJuU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuc2V0RXhjbHVkZXMoIioqLyouamF2YSIpOworICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBleGNsdWRlcyBpbiBQYXR0ZXJuU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuc2V0RXhjbHVkZXNmaWxlKG5ldyBGaWxlKCIvYSIpKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgZXhjbHVkZXNmaWxlIGluIFBhdHRlcm5TZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5jcmVhdGVJbmNsdWRlKCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBpbmNsdWRlIGluIFBhdHRlcm5TZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuY3JlYXRlRXhjbHVkZSgpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgZXhjbHVkZSBpbiBQYXR0ZXJuU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwLmNyZWF0ZUluY2x1ZGVzRmlsZSgpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgaW5jbHVkZXNmaWxlIGluIFBhdHRlcm5TZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuY3JlYXRlRXhjbHVkZXNGaWxlKCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBleGNsdWRlc2ZpbGUgaW4gUGF0dGVyblNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaXJjdWxhclJlZmVyZW5jZUNoZWNrKCkgeworICAgICAgICBQYXR0ZXJuU2V0IHAgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBwKTsKKyAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teSIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHAuZ2V0SW5jbHVkZVBhdHRlcm5zKHByb2plY3QpOworICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgUGF0dGVyblNldCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcC5nZXRFeGNsdWRlUGF0dGVybnMocHJvamVjdCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBQYXR0ZXJuU2V0IGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAtLT4gZHVtbXkxCisgICAgICAgIFBhdHRlcm5TZXQgcDEgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgcDEpOworICAgICAgICBwMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTIiKSk7CisgICAgICAgIFBhdHRlcm5TZXQgcDIgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgcDIpOworICAgICAgICBwMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTMiKSk7CisgICAgICAgIFBhdHRlcm5TZXQgcDMgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgcDMpOworICAgICAgICBwMy5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTEiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwMS5nZXRJbmNsdWRlUGF0dGVybnMocHJvamVjdCk7CisgICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBjaXJjdWxhciByZWZlcmVuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcDEuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpOworICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkdW1teTEgLS0+IGR1bW15MiAtLT4gZHVtbXkzCisgICAgICAgIC8vICh3aGljaCBob2xkcyBwYXR0ZXJucyAiaW5jbHVkZSIgYW5kICJleGNsdWRlIikKKyAgICAgICAgcDEgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgcDEpOworICAgICAgICBwMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTIiKSk7CisgICAgICAgIHAyID0gbmV3IFBhdHRlcm5TZXQoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIHAyKTsKKyAgICAgICAgcDIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkzIikpOworICAgICAgICBwMyA9IG5ldyBQYXR0ZXJuU2V0KCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTMiLCBwMyk7CisgICAgICAgIHAzLnNldEluY2x1ZGVzKCJpbmNsdWRlIik7CisgICAgICAgIHAzLmNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKCJleGNsdWRlIik7CisgICAgICAgIFN0cmluZ1tdIGkgPSBwMS5nZXRJbmNsdWRlUGF0dGVybnMocHJvamVjdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiT25lIGluY2x1ZGUgcGF0dGVybiBidXJpZWQgZGVlcCBpbnNpZGUgYSBuZXN0ZWQgcGF0dGVybnNldCBzdHJ1Y3R1cmUiLAorICAgICAgICAgICAgICAgICAgICAgMSwgaS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImluY2x1ZGUiLCBpWzBdKTsKKyAgICAgICAgaSA9IHAzLmdldEV4Y2x1ZGVQYXR0ZXJucyhwcm9qZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPbmUgZXhjbHVkZSBwYXR0ZXJuIGJ1cmllZCBkZWVwIGluc2lkZSBhIG5lc3RlZCBwYXR0ZXJuc2V0IHN0cnVjdHVyZSIsCisgICAgICAgICAgICAgICAgICAgICAxLCBpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXhjbHVkZSIsIGlbMF0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRQYXR0ZXJuc2V0KCkgeworICAgICAgICBQYXR0ZXJuU2V0IHAgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBwLnNldEluY2x1ZGVzKCIqKi8qLmphdmEiKTsKKworICAgICAgICBQYXR0ZXJuU2V0IG5lc3RlZCA9IG5ldyBQYXR0ZXJuU2V0KCk7CisgICAgICAgIG5lc3RlZC5zZXRFeGNsdWRlcygiKiovKi5jbGFzcyIpOworCisgICAgICAgIHAuYWRkQ29uZmlndXJlZFBhdHRlcm5zZXQobmVzdGVkKTsKKworICAgICAgICBTdHJpbmdbXSBleGNsdWRlcyA9IHAuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpOworICAgICAgICBTdHJpbmdbXSBpbmNsdWRlcyA9IHAuZ2V0SW5jbHVkZVBhdHRlcm5zKHByb2plY3QpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSW5jbHVkZXMiLCIqKi8qLmphdmEiLCBpbmNsdWRlc1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhjbHVkZXMiLCIqKi8qLmNsYXNzIiwgZXhjbHVkZXNbMF0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QZXJtaXNzaW9uc1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QZXJtaXNzaW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzZlMDYyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Blcm1pc3Npb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGl0RXhjZXB0aW9uOworCisvKioKKyAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QZXJtaXNzaW9ucy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJtaXNzaW9uc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBQZXJtaXNzaW9ucyBwZXJtczsKKworICAgIHB1YmxpYyBQZXJtaXNzaW9uc1Rlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHBlcm1zID0gbmV3IFBlcm1pc3Npb25zKCk7CisgICAgICAgIFBlcm1pc3Npb25zLlBlcm1pc3Npb24gcGVybSA9IG5ldyBQZXJtaXNzaW9ucy5QZXJtaXNzaW9uKCk7CisgICAgICAgIC8vIEdyYW50IGV4dHJhIHBlcm1pc3Npb25zIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSB1c2VyLiogcHJvcGVydGllcyBhbmQgcmVhZCB0byB0aGUKKyAgICAgICAgLy8gamF2YS5ob21lIHByb3BlcnR5CisgICAgICAgIHBlcm0uc2V0QWN0aW9ucygicmVhZCwgd3JpdGUiKTsKKyAgICAgICAgcGVybS5zZXROYW1lKCJ1c2VyLioiKTsKKyAgICAgICAgcGVybS5zZXRDbGFzcygiamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiIpOworICAgICAgICBwZXJtcy5hZGRDb25maWd1cmVkR3JhbnQocGVybSk7CisKKyAgICAgICAgcGVybSA9IG5ldyBQZXJtaXNzaW9ucy5QZXJtaXNzaW9uKCk7CisgICAgICAgIHBlcm0uc2V0QWN0aW9ucygicmVhZCIpOworICAgICAgICBwZXJtLnNldE5hbWUoImphdmEuaG9tZSIpOworICAgICAgICBwZXJtLnNldENsYXNzKCJqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uIik7CisgICAgICAgIHBlcm1zLmFkZENvbmZpZ3VyZWRHcmFudChwZXJtKTsKKworICAgICAgICBwZXJtID0gbmV3IFBlcm1pc3Npb25zLlBlcm1pc3Npb24oKTsKKyAgICAgICAgcGVybS5zZXRBY3Rpb25zKCJyZWFkIik7CisgICAgICAgIHBlcm0uc2V0TmFtZSgiZmlsZS5lbmNvZGluZyIpOworICAgICAgICBwZXJtLnNldENsYXNzKCJqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uIik7CisgICAgICAgIHBlcm1zLmFkZENvbmZpZ3VyZWRHcmFudChwZXJtKTsKKworICAgICAgICAvLyBSZXZva2UgcGVybWlzc2lvbiB0byB3cml0ZSB1c2VyLmhvbWUgKGdyYW50ZWQgYWJvdmUgdmlhIHVzZXIuKiksIHN0aWxsIGFibGUgdG8gcmVhZCB0aG91Z2guCisgICAgICAgIC8vIGFuZCB0aGUgZGVmYXVsdCBncmFudGVkIHBlcm1pc3Npb24gdG8gcmVhZCBvcy5uYW1lLgorICAgICAgICBwZXJtID0gbmV3IFBlcm1pc3Npb25zLlBlcm1pc3Npb24oKTsKKyAgICAgICAgcGVybS5zZXRBY3Rpb25zKCJ3cml0ZSIpOworICAgICAgICBwZXJtLnNldE5hbWUoInVzZXIuaG9tZSIpOworICAgICAgICBwZXJtLnNldENsYXNzKCJqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uIik7CisgICAgICAgIHBlcm1zLmFkZENvbmZpZ3VyZWRSZXZva2UocGVybSk7CisKKyAgICAgICAgcGVybSA9IG5ldyBQZXJtaXNzaW9ucy5QZXJtaXNzaW9uKCk7CisgICAgICAgIHBlcm0uc2V0QWN0aW9ucygicmVhZCIpOworICAgICAgICBwZXJtLnNldE5hbWUoIm9zLioiKTsKKyAgICAgICAgcGVybS5zZXRDbGFzcygiamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiIpOworICAgICAgICBwZXJtcy5hZGRDb25maWd1cmVkUmV2b2tlKHBlcm0pOworICAgIH0KKworICAgIC8qKiBUZXN0cyBhIHBlcm1pc3Npb24gdGhhdCBpcyBncmFudGVkIHBlciBkZWZhdWx0LiAqLworICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0R3JhbnRlZCgpIHsKKyAgICAgICAgcGVybXMuc2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHBlcm1zLnJlc3RvcmVTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUZXN0cyBhIHBlcm1pc3Npb24gdGhhdCBoYXMgYmVlbiBncmFudGVkIGxhdGVyIHZpYSB3aWxkY2FyZC4gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhbnRlZCgpIHsKKyAgICAgICAgcGVybXMuc2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5uYW1lIik7CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInVzZXIubmFtZSIsIHMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcGVybXMucmVzdG9yZVNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRlc3RzIGEgcGVybWlzc2lvbiB0aGF0IGhhcyBiZWVuIGdyYW50ZWQgYW5kIHJldm9rZWQgbGF0ZXIuICovCisgICAgcHVibGljIHZvaWQgdGVzdEdyYW50ZWRBbmRSZXZva2VkKCkgeworICAgICAgICBwZXJtcy5zZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgidXNlci5ob21lIiwgcyk7CisgICAgICAgICAgICBmYWlsKCJDb3VsZCBwZXJmb3JtIGFuIGFjdGlvbiB0aGF0IHNob3VsZCBoYXZlIGJlZW4gZm9yYmlkZGVuLiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIC8vIFdhcyBleHBlY3RlZCwgdGVzdCBwYXNzZXMKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHBlcm1zLnJlc3RvcmVTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUZXN0cyBhIHBlcm1pc3Npb24gdGhhdCBpcyBncmFudGVkIGFzIHBlciBkZWZhdWx0IGJ1dCByZXZva2VkIGxhdGVyIHZpYSB3aWxkY2FyZC4gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFJldm9rZWQoKSB7CisgICAgICAgIHBlcm1zLnNldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7CisgICAgICAgICAgICBmYWlsKCJDb3VsZCBwZXJmb3JtIGFuIGFjdGlvbiB0aGF0IHNob3VsZCBoYXZlIGJlZW4gZm9yYmlkZGVuLiIpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgIC8vIFdhcyBleHBlY3RlZCwgdGVzdCBwYXNzZXMKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHBlcm1zLnJlc3RvcmVTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiogVGVzdHMgYSBwZXJtaXNzaW9uIHRoYXQgaGFzIG5vdCBiZWVuIGdyYW50ZWQgb3IgcmV2b2tlZC4gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3RoZXIoKSB7CisgICAgICAgIFN0cmluZyBscyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgcGVybXMuc2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IFN5c3RlbS5zZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLGxzKTsKKyAgICAgICAgICAgIGZhaWwoIkNvdWxkIHBlcmZvcm0gYW4gYWN0aW9uIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBmb3JiaWRkZW4uIik7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpeworICAgICAgICAgICAgLy8gV2FzIGV4cGVjdGVkLCB0ZXN0IHBhc3NlcworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcGVybXMucmVzdG9yZVNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRlc3RzIGFuIGV4aXQgY29uZGl0aW9uLiAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGl0KCkgeworICAgICAgICBwZXJtcy5zZXRTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSWYgdGhpcyBpcyB0aGUgbGFzdCBsaW5lIG9uIHN0YW5kYXJkIG91dCB0aGUgdGVzdEV4aXQgZi5hLmkubC5lLmQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDMpOworICAgICAgICAgICAgZmFpbCgiVG90YWx5IGltcG9zc2libGUgdGhhdCB0aGlzIGZhaWwgaXMgZXZlciBleGVjdXRlZC4gUGxlYXNlIGxldCBtZSBrbm93IGlmIGl0IGlzISIpOworICAgICAgICB9IGNhdGNoIChFeGl0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChlLmdldFN0YXR1cygpICE9IDMpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJSZWNlaXZlZCB3cm9uZyBleGl0IHN0YXR1cyBpbiBFeGl0IEV4Y2VwdGlvbi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdEV4aXQgc3VjY2Vzc2Z1bC4iKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHBlcm1zLnJlc3RvcmVTZWN1cml0eU1hbmFnZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUG9seVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Qb2x5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmQyODYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUG9seVRlc3QuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworcHVibGljIGNsYXNzIFBvbHlUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgUG9seVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3BvbHkueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVTZXQoKSB7CisgICAgICAgIGV4cGVjdExvZ0NvbnRhaW5pbmcoImZpbGVzZXQiLCAidHlwZXMuRmlsZVNldCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU2V0QW50VHlwZSgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygiZmlsZXNldC1hbnQtdHlwZSIsICJ0eXBlcy5Qb2x5VGVzdCRNeUZpbGVTZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aCgpIHsKKyAgICAgICAgZXhwZWN0TG9nQ29udGFpbmluZygicGF0aCIsICJ0eXBlcy5QYXRoIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhBbnRUeXBlKCkgeworICAgICAgICBleHBlY3RMb2dDb250YWluaW5nKCJwYXRoLWFudC10eXBlIiwgInR5cGVzLlBvbHlUZXN0JE15UGF0aCIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGaWxlU2V0IGV4dGVuZHMgRmlsZVNldCB7fQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVBhdGggZXh0ZW5kcyBQYXRoIHsKKyAgICAgICAgcHVibGljIE15UGF0aChQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgICAgIHN1cGVyKHByb2plY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVRhc2sgZXh0ZW5kcyBUYXNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgYWRkUGF0aChQYXRoIHBhdGgpIHsKKyAgICAgICAgICAgIGxvZygiY2xhc3Mgb2YgcGF0aCBpcyAiICsgcGF0aC5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgZmlsZXNldCkgeworICAgICAgICAgICAgbG9nKCJjbGFzcyBvZiBmaWxlc2V0IGlzICIgKyBmaWxlc2V0LmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Byb3BlcnR5U2V0VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Byb3BlcnR5U2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTdmOTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUHJvcGVydHlTZXRUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworcHVibGljIGNsYXNzIFByb3BlcnR5U2V0VGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFByb3BlcnR5U2V0VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcHJvcGVydHlzZXQueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jZVRvVHdvUmVmZXJlbmNlcygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgicmVmZXJlbmNlLXRvLXR3by1yZWZlcmVuY2VzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZE1hcHBlZCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibmVzdGVkLW1hcHBlZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRNYXBwZWRNYXBwZWQoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoIm5lc3RlZC1tYXBwZWQtbWFwcGVkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1JlZGlyZWN0b3JFbGVtZW50VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1JlZGlyZWN0b3JFbGVtZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3OGI3YjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVkaXJlY3RvckVsZW1lbnRUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworcHVibGljIGNsYXNzIFJlZGlyZWN0b3JFbGVtZW50VGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFJlZGlyZWN0b3JFbGVtZW50VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVkaXJlY3Rvci54bWwiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgidGVzdDEiKQorICAgICAgICAgICAgaW5zdGFuY2VvZiBSZWRpcmVjdG9yRWxlbWVudCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDIiLCAiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSAiCisgICAgICAgICAgICArICJhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleHBlY3RCdWlsZEV4Y2VwdGlvbigidGVzdDMiLCAiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzICIKKyAgICAgICAgICAgICsgIndoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nSW5wdXRTdHJpbmcoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RMb2dJbnB1dFN0cmluZyIpOworICAgICAgICBpZiAoc3VwZXIuZ2V0TG9nKCkuaW5kZXhPZigidGVzdExvZ0lucHV0U3RyaW5nIGNhbi1jYXQiKSA+PTAgKSB7CisgICAgICAgICAgICBhc3NlcnREZWJ1Z2xvZ0NvbnRhaW5pbmcoIlVzaW5nIGlucHV0IHN0cmluZyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZmlkKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0UmVmaWQiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUNvbXBhcmF0b3JzVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlQ29tcGFyYXRvcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGIzOWE2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUNvbXBhcmF0b3JzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VDb21wYXJhdG9yc1Rlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBSZXNvdXJjZUNvbXBhcmF0b3JzVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL2J1aWxkLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZWFyRG93biIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Rjb21wb3VuZHNvcnQxKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Y29tcG91bmRzb3J0MSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Rjb21wb3VuZHNvcnQyKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Y29tcG91bmRzb3J0MiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Rjb250ZW50KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0Y29udGVudCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RleGlzdHMoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RleGlzdHMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0ZGF0ZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdGRhdGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0bmFtZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdG5hbWUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0cnZjb250ZW50KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0cnZjb250ZW50Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdHJ2ZGVmYXVsdCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdHJ2ZGVmYXVsdCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RydmV4aXN0cygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdHJ2ZXhpc3RzIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdHJ2ZGF0ZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdHJ2ZGF0ZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Rydm5hbWUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3Rydm5hbWUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0cnZzaXplKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0cnZzaXplIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdHJ2dHlwZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdHJ2dHlwZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RzaXplKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0c2l6ZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Rzb3J0ZGVmYXVsdCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdHNvcnRkZWZhdWx0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdHR5cGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3R0eXBlIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2VPdXRwdXRUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2VPdXRwdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjBlYzVlNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZU91dHB1dFRlc3QuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93blNlcnZpY2VFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWmlwOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5JbW11dGFibGVSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuUHJvcGVydHlSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuU3RyaW5nUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlVSTFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5aaXBSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlc291cmNlVXRpbHM7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZU91dHB1dFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgYmFzZWRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLAorICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVzb3VyY2VzIik7CisKKyAgICBwdWJsaWMgUmVzb3VyY2VPdXRwdXRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5pbml0KCk7CisgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KCJiYXNlZGlyIiAsIGJhc2VkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RyZXNvdXJjZW91dHB1dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RvdXRwdXRiZShuZXcgUmVzb3VyY2UoImZvbyIpKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIGNhdWdodCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0c3RyaW5nb3V0cHV0MSgpIHsKKyAgICAgICAgU3RyaW5nUmVzb3VyY2UgciA9IG5ldyBTdHJpbmdSZXNvdXJjZSgpOworICAgICAgICB0ZXN0b3V0cHV0YmUocik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgci5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0c3RyaW5nb3V0cHV0MigpIHsKKyAgICAgICAgU3RyaW5nUmVzb3VyY2UgciA9IG5ldyBTdHJpbmdSZXNvdXJjZSgiYmFyIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0b3V0cHV0KHIpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgY2F1Z2h0IEltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiY2F1Z2h0IHNvbWUgb3RoZXIgSU9FeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIHIuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdHByb3BlcnR5b3V0cHV0MSgpIHsKKyAgICAgICAgUHJvcGVydHlSZXNvdXJjZSByID0gbmV3IFByb3BlcnR5UmVzb3VyY2UoZ2V0UHJvamVjdCgpLCAiYmFyIik7CisgICAgICAgIHRlc3RvdXRwdXRiZShyKTsKKyAgICAgICAgYXNzZXJ0UHJvcGVydHlFcXVhbHMoImJhciIsICJmb28iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0cHJvcGVydHlvdXRwdXQyKCkgeworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkoImJhciIsICJiYXIiKTsKKyAgICAgICAgUHJvcGVydHlSZXNvdXJjZSByID0gbmV3IFByb3BlcnR5UmVzb3VyY2UoZ2V0UHJvamVjdCgpLCAiYmFyIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0b3V0cHV0KHIpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgY2F1Z2h0IEltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiY2F1Z2h0IHNvbWUgb3RoZXIgSU9FeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRQcm9wZXJ0eUVxdWFscygiYmFyIiwgImJhciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3R1cmxvdXRwdXQoKSB7CisgICAgICAgIEZpbGUgZiA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgidGVzdHVybG91dHB1dCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRklMRV9VVElMUy5jcmVhdGVOZXdGaWxlKGYpOworICAgICAgICAgICAgdGVzdG91dHB1dChuZXcgVVJMUmVzb3VyY2UoZikpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgY2F1Z2h0IFVua25vd25TZXJ2aWNlRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25TZXJ2aWNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgICAgICBmYWlsKCJjYXVnaHQgc29tZSBvdGhlciBJT0V4Y2VwdGlvbjogIiArIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKCFmLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3R6aXBlbnRyeW91dHB1dCgpIHsKKyAgICAgICAgWmlwIHogPSBuZXcgWmlwKCk7CisgICAgICAgIHouc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICBaaXAuV2hlbkVtcHR5IGNyZWF0ZSA9IG5ldyBaaXAuV2hlbkVtcHR5KCk7CisgICAgICAgIGNyZWF0ZS5zZXRWYWx1ZSgiY3JlYXRlIik7CisgICAgICAgIHouc2V0V2hlbmVtcHR5KGNyZWF0ZSk7CisgICAgICAgIHouc2V0QmFzZWRpcihiYXNlZGlyKTsKKyAgICAgICAgei5zZXRFeGNsdWRlcygiKiovKiIpOworICAgICAgICBGaWxlIGYgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImZvbyIpOworICAgICAgICB6LnNldERlc3RGaWxlKGYpOworICAgICAgICB6LmV4ZWN1dGUoKTsKKyAgICAgICAgWmlwUmVzb3VyY2UgciA9IG5ldyBaaXBSZXNvdXJjZSgpOworICAgICAgICByLnNldFppcGZpbGUoZik7CisgICAgICAgIHIuc2V0TmFtZSgiZm9vIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0b3V0cHV0YmUocik7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSBjYXVnaHQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKCFmLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0b3V0cHV0YmUoUmVzb3VyY2UgZGVzdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdG91dHB1dChkZXN0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RvdXRwdXQoUmVzb3VyY2UgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VVdGlscy5jb3B5UmVzb3VyY2UobmV3IFN0cmluZ1Jlc291cmNlKCJmb28iKSwgZGVzdCwgbnVsbCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGFyRmlsZVNldFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UYXJGaWxlU2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwZDU3MGIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGFyRmlsZVNldFRlc3QuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlRhckZpbGVTZXQuCisgKgorICogPHA+VGhpcyBkb2Vzbid0IGFjdHVhbGx5IHRlc3QgbXVjaCwgbWFpbmx5IHJlZmVyZW5jZSBoYW5kbGluZy4KKyAqCisgKi8KKworcHVibGljIGNsYXNzIFRhckZpbGVTZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RGaWxlU2V0VGVzdCB7CisKKyAgICBwdWJsaWMgVGFyRmlsZVNldFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsZVNldCBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUYXJGaWxlU2V0KCk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBdHRyaWJ1dGVzKCkgeworICAgICAgICBUYXJGaWxlU2V0IGYgPSAoVGFyRmlsZVNldClnZXRJbnN0YW5jZSgpOworICAgICAgICAvL2NoZWNrIHRoYXQgZGlyIGFuZCBzcmMgYXJlIGluY29tcGF0aWJsZQorICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS50YXIiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLnNldERpcihuZXcgRmlsZSgiZXhhbXBsZXMiKSk7CisgICAgICAgICAgICBmYWlsKCJjYW4gYWRkIGRpciB0byAiCisgICAgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgd2hlbiBhIHNyYyBpcyBhbHJlYWR5IHByZXNlbnQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2Fubm90IHNldCBib3RoIGRpciBhbmQgc3JjIGF0dHJpYnV0ZXMiLGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgZiA9IChUYXJGaWxlU2V0KWdldEluc3RhbmNlKCk7CisgICAgICAgIC8vY2hlY2sgdGhhdCBkaXIgYW5kIHNyYyBhcmUgaW5jb21wYXRpYmxlCisgICAgICAgIGYuc2V0RGlyKG5ldyBGaWxlKCJleGFtcGxlcyIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnRhciIpKTsKKyAgICAgICAgICAgIGZhaWwoImNhbiBhZGQgc3JjIHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiB3aGVuIGEgZGlyIGlzIGFscmVhZHkgcHJlc2VudCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYW5ub3Qgc2V0IGJvdGggZGlyIGFuZCBzcmMgYXR0cmlidXRlcyIsYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvL2NoZWNrIHRoYXQgZnVsbHBhdGggYW5kIHByZWZpeCBhcmUgaW5jb21wYXRpYmxlCisgICAgICAgIGYgPSAoVGFyRmlsZVNldClnZXRJbnN0YW5jZSgpOworICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS50YXIiKSk7CisgICAgICAgIGYuc2V0UHJlZml4KCIvZXhhbXBsZXMiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuc2V0RnVsbHBhdGgoIi9kb2MvbWFudWFsL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgZnVsbHBhdGggdG8gIgorICAgICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdoZW4gYSBwcmVmaXggaXMgYWxyZWFkeSBwcmVzZW50Iik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCBzZXQgYm90aCBmdWxscGF0aCBhbmQgcHJlZml4IGF0dHJpYnV0ZXMiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGYgPSAoVGFyRmlsZVNldClnZXRJbnN0YW5jZSgpOworICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS50YXIiKSk7CisgICAgICAgIGYuc2V0RnVsbHBhdGgoIi9kb2MvbWFudWFsL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuc2V0UHJlZml4KCIvZXhhbXBsZXMiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcHJlZml4IHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiB3aGVuIGEgZnVsbHBhdGggaXMgYWxyZWFkeSBwcmVzZW50Iik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCBzZXQgYm90aCBmdWxscGF0aCBhbmQgcHJlZml4IGF0dHJpYnV0ZXMiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIHRoYXQgcmVmZXJlbmNlIHRhcmZpbGVzZXRzIGNhbm5vdCBoYXZlIHNwZWNpZmljIGF0dHJpYnV0ZXMKKyAgICAgICAgZiA9IChUYXJGaWxlU2V0KWdldEluc3RhbmNlKCk7CisgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJ0ZXN0IikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUudGFyIikpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBzcmMgdG8gIgorICAgICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdoZW4gYSByZWZpZCBpcyBhbHJlYWR5IHByZXNlbnQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSAiCisgICAgICAgICAgICArICJhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgdGhhdCBhIHJlZmVyZW5jZSB0YXJmaWxlc2V0IGdldHMgdGhlIHNhbWUgYXR0cmlidXRlcyBhcyB0aGUgb3JpZ2luYWwKKyAgICAgICAgZiA9IChUYXJGaWxlU2V0KWdldEluc3RhbmNlKCk7CisgICAgICAgIGYuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnRhciIpKTsKKyAgICAgICAgZi5zZXRQcmVmaXgoIi9leGFtcGxlcyIpOworICAgICAgICBmLnNldEZpbGVNb2RlKCI2MDAiKTsKKyAgICAgICAgZi5zZXREaXJNb2RlKCI1MzAiKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgidGVzdCIsZik7CisgICAgICAgIFRhckZpbGVTZXQgemlkPShUYXJGaWxlU2V0KWdldEluc3RhbmNlKCk7CisgICAgICAgIHppZC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgInRlc3QiKSk7CisgICAgICAgIGFzc2VydFRydWUoInNyYyBhdHRyaWJ1dGUgY29waWVkIGJ5IGNvcHkgY29uc3RydWN0b3IiLHppZC5nZXRTcmMoZ2V0UHJvamVjdCgpKS5lcXVhbHMoZi5nZXRTcmMoZ2V0UHJvamVjdCgpKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJwcmVmaXggYXR0cmlidXRlIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yIixmLmdldFByZWZpeChnZXRQcm9qZWN0KCkpLmVxdWFscyh6aWQuZ2V0UHJlZml4KGdldFByb2plY3QoKSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZmlsZSBtb2RlIGF0dHJpYnV0ZSBjb3BpZWQgYnkgY29weSBjb25zdHJ1Y3RvciIsZi5nZXRGaWxlTW9kZShnZXRQcm9qZWN0KCkpPT16aWQuZ2V0RmlsZU1vZGUoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgIGFzc2VydFRydWUoImRpciBtb2RlIGF0dHJpYnV0ZSBjb3BpZWQgYnkgY29weSBjb25zdHJ1Y3RvciIsZi5nZXREaXJNb2RlKGdldFByb2plY3QoKSk9PXppZC5nZXREaXJNb2RlKGdldFByb2plY3QoKSkpOworICAgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9YTUxDYXRhbG9nQnVpbGRGaWxlVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1hNTENhdGFsb2dCdWlsZEZpbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0ODdhZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9YTUxDYXRhbG9nQnVpbGRGaWxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogQnVpbGRGaWxlVGVzdCB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2cKKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2dUZXN0CisgKgorICovCitwdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0J1aWxkRmlsZVRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBYTUxDYXRhbG9nQnVpbGRGaWxlVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEVuc3VyZSB0aGF0IGFuIGV4dGVybmFsIGVudGl0eSByZXNvbHZlcyBhcyBleHBlY3RlZCB3aXRoIE5PCisgICAgLy8gWE1MQ2F0YWxvZyBpbnZvbHZlbWVudDoKKyAgICAvLworICAgIC8vIFRyYW5zZm9ybSBhbiBYTUwgZmlsZSB0aGF0IHJlZmVycyB0byB0aGUgZW50aXR5IGludG8gYSB0ZXh0CisgICAgLy8gZmlsZSwgc3R1ZmYgcmVzdWx0IGludG8gcHJvcGVydHk6IHZhbDEKKyAgICAvLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlOb0NhdGFsb2coKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sIik7CisgICAgICAgIGV4cGVjdFByb3BlcnR5U2V0KCJ0ZXN0ZW50aXR5bm9jYXRhbG9nIiwgInZhbDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBzdGl0Y2ggaW4gdGltZSBzYXZlcyBuaW5lIik7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBFbnN1cmUgdGhhdCBhbiBleHRlcm5hbCBlbnRpdHkgcmVzb2x2ZXMgYXMgZXhwZWN0ZWQgVXNpbmcgYW4KKyAgICAvLyBYTUxDYXRhbG9nOgorICAgIC8vCisgICAgLy8gVHJhbnNmb3JtIGFuIFhNTCBmaWxlIHRoYXQgcmVmZXJzIHRvIHRoZSBlbnRpdHkgaW50byBhIHRleHQKKyAgICAvLyBmaWxlLCBlbnRpdHkgaXMgbGlzdGVkIGluIHRoZSBYTUxDYXRhbG9nIHBvaW50aW5nIHRvIGEKKyAgICAvLyBkaWZmZXJlbnQgZmlsZS4gIFN0dWZmIHJlc3VsdCBpbnRvIHByb3BlcnR5OiB2YWwyCisgICAgLy8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5V2l0aENhdGFsb2coKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sIik7CisgICAgICAgIGV4cGVjdFByb3BlcnR5U2V0KCJ0ZXN0ZW50aXR5d2l0aGNhdGFsb2ciLCAidmFsMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBuZXdzIGlzIGdvb2QgbmV3cyIpOworICAgIH0KKworICAgIC8vCisgICAgLy8gRW5zdXJlIHRoYXQgYW4gZXh0ZXJuYWwgZW50aXR5IHJlc29sdmVzIGFzIGV4cGVjdGVkIHdpdGggTk8KKyAgICAvLyBYTUxDYXRhbG9nIGludm9sdmVtZW50OgorICAgIC8vCisgICAgLy8gVHJhbnNmb3JtIGFuIFhNTCBmaWxlIHRoYXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBfc2Vjb25kXyBYTUwgZmlsZQorICAgIC8vIHZpYSB0aGUgZG9jdW1lbnQoKSBmdW5jdGlvbi4gIFRoZSBfc2Vjb25kXyBYTUwgZmlsZSByZWZlcnMgdG8gYW4gZW50aXR5LgorICAgIC8vIFN0dWZmIHJlc3VsdCBpbnRvIHRoZSBwcm9wZXJ0eTogdmFsMworICAgIC8vCisgICAgcHVibGljIHZvaWQgdGVzdERvY3VtZW50Tm9DYXRhbG9nKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxjYXRhbG9nLnhtbCIpOworICAgICAgICBleHBlY3RQcm9wZXJ0eVNldCgidGVzdGRvY3VtZW50bm9jYXRhbG9nIiwgInZhbDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBzdGl0Y2ggaW4gdGltZSBzYXZlcyBuaW5lIik7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBFbnN1cmUgdGhhdCBhbiBleHRlcm5hbCBlbnRpdHkgcmVzb2x2ZXMgYXMgZXhwZWN0ZWQgVXNpbmcgYW4KKyAgICAvLyBYTUxDYXRhbG9nOgorICAgIC8vCisgICAgLy8gVHJhbnNmb3JtIGFuIFhNTCBmaWxlIHRoYXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBfc2Vjb25kXyBYTUwgZmlsZQorICAgIC8vIHZpYSB0aGUgZG9jdW1lbnQoKSBmdW5jdGlvbi4gIFRoZSBfc2Vjb25kXyBYTUwgZmlsZSByZWZlcnMgdG8gYW4gZW50aXR5LgorICAgIC8vIFRoZSBlbnRpdHkgaXMgbGlzdGVkIGluIHRoZSBYTUxDYXRhbG9nIHBvaW50aW5nIHRvIGEgZGlmZmVyZW50IGZpbGUuCisgICAgLy8gU3R1ZmYgcmVzdWx0IGludG8gdGhlIHByb3BlcnR5OiB2YWw0CisgICAgLy8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jdW1lbnRXaXRoQ2F0YWxvZygpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sY2F0YWxvZy54bWwiKTsKKyAgICAgICAgZXhwZWN0UHJvcGVydHlTZXQoInRlc3Rkb2N1bWVudHdpdGhjYXRhbG9nIiwgInZhbDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbmV3cyBpcyBnb29kIG5ld3MiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWE1MQ2F0YWxvZ1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9YTUxDYXRhbG9nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NzE2NDgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWE1MQ2F0YWxvZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSkFYUFV0aWxzOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCisvKioKKyAqIEpVbml0IHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZworICoKKyAqLworcHVibGljIGNsYXNzIFhNTENhdGFsb2dUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisgICAgcHJpdmF0ZSBYTUxDYXRhbG9nIGNhdGFsb2c7CisKKyAgICBwcml2YXRlIFhNTENhdGFsb2cgbmV3Q2F0YWxvZygpIHsKKyAgICAgICAgWE1MQ2F0YWxvZyBjYXQgPSBuZXcgWE1MQ2F0YWxvZygpOworICAgICAgICBjYXQuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgcmV0dXJuIGNhdDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB0b1VSTFN0cmluZyhGaWxlIGZpbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gSkFYUFV0aWxzLmdldFN5c3RlbUlkKGZpbGUpOworICAgIH0KKworICAgIHB1YmxpYyBYTUxDYXRhbG9nVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcihTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSk7CisKKyAgICAgICAgLy8gVGhpcyBjYXVzZXMgWE1MQ2F0YWxvZyB0byBwcmludCBvdXQgZGV0YWlsZWQgbG9nZ2luZworICAgICAgICAvLyBtZXNzYWdlcyBmb3IgZGVidWdnaW5nCisgICAgICAgIC8vCisgICAgICAgIC8vIERlZmF1bHRMb2dnZXIgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTsKKyAgICAgICAgLy8gbG9nZ2VyLnNldE1lc3NhZ2VPdXRwdXRMZXZlbChQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgIC8vIGxvZ2dlci5zZXRPdXRwdXRQcmludFN0cmVhbShTeXN0ZW0ub3V0KTsKKyAgICAgICAgLy8gbG9nZ2VyLnNldEVycm9yUHJpbnRTdHJlYW0oU3lzdGVtLmVycik7CisgICAgICAgIC8vIHByb2plY3QuYWRkQnVpbGRMaXN0ZW5lcihsb2dnZXIpOworCisgICAgICAgIGNhdGFsb2cgPSBuZXdDYXRhbG9nKCk7CisgICAgfQorCisgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgIHByb2plY3QgPSBudWxsOworICAgICAgY2F0YWxvZyA9IG51bGw7CisgICB9CisKKyAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUNhdGFsb2coKSB7CisgICAgICAgdHJ5IHsKKyAgICAgICAgICAgSW5wdXRTb3VyY2UgcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlRW50aXR5KCJQVUJMSUMgSUQgT05FIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpL2RvbnQvZXhpc3QuZHRkIik7CisgICAgICAgICAgIGFzc2VydE51bGwoIkVtcHR5IGNhdGFsb2cgc2hvdWxkIHJldHVybiBudWxsIiwgcmVzdWx0KTsKKyAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICBmYWlsKCJyZXNvbHZlRW50aXR5KCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgIH0KKworICAgICAgIHRyeSB7CisgICAgICAgICAgIFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmUoImkvZG9udC9leGlzdC5kdGQiLCBudWxsKTsKKyAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gdG9VUkxTdHJpbmcobmV3IEZpbGUocHJvamVjdC5nZXRCYXNlRGlyKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2kvZG9udC9leGlzdC5kdGQiKSk7CisgICAgICAgICAgIC8vCisgICAgICAgICAgIC8vIFRoZXNlIHNoZW5hbmlnYW5zIGFyZSBuZWNlc3NhcnkgYi9jIE5vcm0gV2Fsc2gncyByZXNvbHZlcgorICAgICAgICAgICAvLyBoYXMgYSBkaWZmZXJlbnQgaWRlYSBvZiBob3cgZmlsZSBVUkxzIGFyZSBjcmVhdGVkIG9uIHdpbmRvemUKKyAgICAgICAgICAgLy8gaWUgZmlsZTovL2M6L2ZvbyBpbnN0ZWFkIG9mIGZpbGU6Ly8vYzovZm9vCisgICAgICAgICAgIC8vCisgICAgICAgICAgIFN0cmluZyByZXN1bHRTdHIgPSBuZXcgVVJMKCgoU0FYU291cmNlKXJlc3VsdCkuZ2V0SW5wdXRTb3VyY2UoKS5nZXRTeXN0ZW1JZCgpKS5nZXRGaWxlKCk7CisgICAgICAgICAgIGFzc2VydFRydWUoIkVtcHR5IGNhdGFsb2cgc2hvdWxkIHJldHVybiBpbnB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQuZW5kc1dpdGgocmVzdWx0U3RyKSk7CisgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgZmFpbCgicmVzb2x2ZSgpIGZhaWxlZCEiICsgZS50b1N0cmluZygpKTsKKyAgICAgICB9CisgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRXhpc3RlbnRFbnRyeSgpIHsKKworICAgICAgICBSZXNvdXJjZUxvY2F0aW9uIGR0ZCA9IG5ldyBSZXNvdXJjZUxvY2F0aW9uKCk7CisgICAgICAgIGR0ZC5zZXRQdWJsaWNJZCgiUFVCTElDIElEIE9ORSIpOworICAgICAgICBkdGQuc2V0TG9jYXRpb24oImkvZG9udC9leGlzdC5kdGQiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTb3VyY2UgcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlRW50aXR5KCJQVUJMSUMgSUQgT05FIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaS9kb250L2V4aXN0LmR0ZCIpOworICAgICAgICAgICAgYXNzZXJ0TnVsbCgiTm9uZXhpc3RlbnQgQ2F0YWxvZyBlbnRyeSBzaG91bGQgbm90IGJlIHJldHVybmVkIiwgcmVzdWx0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInJlc29sdmVFbnRpdHkoKSBmYWlsZWQhIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU291cmNlIHJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZSgiaS9kb250L2V4aXN0LmR0ZCIsIG51bGwpOworICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gdG9VUkxTdHJpbmcobmV3IEZpbGUocHJvamVjdC5nZXRCYXNlRGlyKCkudG9VUkwoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2kvZG9udC9leGlzdC5kdGQiKSk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0U3RyID0gbmV3IFVSTCgoKFNBWFNvdXJjZSlyZXN1bHQpLmdldElucHV0U291cmNlKCkuZ2V0U3lzdGVtSWQoKSkuZ2V0RmlsZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm9uZXhpc3RlbnQgQ2F0YWxvZyBlbnRyeSByZXR1cm4gaW5wdXQiLAorICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5lbmRzV2l0aChyZXN1bHRTdHIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInJlc29sdmUoKSBmYWlsZWQhIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZSgpIHsKKyAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiBkdGQgPSBuZXcgUmVzb3VyY2VMb2NhdGlvbigpOworICAgICAgICBkdGQuc2V0UHVibGljSWQoIlBVQkxJQyBJRCBPTkUiKTsKKyAgICAgICAgZHRkLnNldExvY2F0aW9uKCJpL2RvbnQvZXhpc3QuZHRkIik7CisgICAgICAgIGNhdGFsb2cuYWRkRFREKGR0ZCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJjYXRhbG9nIiwgY2F0YWxvZyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhdGFsb2cuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBub25leGlzdGVudCBYTUxDYXRhbG9nIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFhNTENhdGFsb2cgY2F0YWxvZzIgPSBuZXdDYXRhbG9nKCk7CisgICAgICAgIGNhdGFsb2cyLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2ciKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhdGFsb2cyLmFkZENvbmZpZ3VyZWRYTUxDYXRhbG9nKGNhdGFsb2cpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgWE1MQ2F0YWxvZyB0byBYTUxDYXRhbG9nIHRoYXQgaXMgYSByZWZlcmVuY2UiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKKworICAgICAgICAvLyBjYXRhbG9nIDwtLT4gY2F0YWxvZworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiY2F0YWxvZyIsIGNhdGFsb2cpOworICAgICAgICBjYXRhbG9nLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2ciKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U291cmNlIHJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZUVudGl0eSgiUFVCTElDIElEIE9ORSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkvZG9udC9leGlzdC5kdGQiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIFhNTENhdGFsb2cgYSBSZWZlcmVuY2UgdG8gaXRzZWxmLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZXNvbHZlRW50aXR5KCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2F0YWxvZzEgLS0+IGNhdGFsb2cyIC0tPiBjYXRhbG9nMyAtLT4gY2F0YWxvZzEKKyAgICAgICAgWE1MQ2F0YWxvZyBjYXRhbG9nMSA9IG5ld0NhdGFsb2coKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImNhdGFsb2cxIiwgY2F0YWxvZzEpOworICAgICAgICBYTUxDYXRhbG9nIGNhdGFsb2cyID0gbmV3Q2F0YWxvZygpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiY2F0YWxvZzIiLCBjYXRhbG9nMik7CisgICAgICAgIFhNTENhdGFsb2cgY2F0YWxvZzMgPSBuZXdDYXRhbG9nKCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJjYXRhbG9nMyIsIGNhdGFsb2czKTsKKworICAgICAgICBjYXRhbG9nMy5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJjYXRhbG9nMSIpKTsKKyAgICAgICAgY2F0YWxvZzIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiY2F0YWxvZzMiKSk7CisgICAgICAgIGNhdGFsb2cxLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2cyIikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nMS5yZXNvbHZlRW50aXR5KCJQVUJMSUMgSUQgT05FIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkvZG9udC9leGlzdC5kdGQiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIGNpcmN1bGFyIHJlZmVyZW5jZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZXNvbHZlRW50aXR5KCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorICAgIC8vIGluc3BpcmVkIGJ5IEJ1Z3ppbGxhIFJlcG9ydCAyMzkxMworICAgIC8vIGEgcHJvYmxlbSB1c2VkIHRvIGhhcHBlbiB1bmRlciBXaW5kb3dzIHdoZW4gdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgd2FzIGdpdmVuIGFzIGFuIGFic29sdXRlIHBhdGgKKyAgICAvLyBwb3NzaWJseSB3aXRoIGEgbWl4dHVyZSBvZiBmaWxlIHNlcGFyYXRvcnMKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGVQYXRoKCkgeworICAgICAgICBSZXNvdXJjZUxvY2F0aW9uIGR0ZCA9IG5ldyBSZXNvdXJjZUxvY2F0aW9uKCk7CisgICAgICAgIGR0ZC5zZXRQdWJsaWNJZCgiLS8vc3Rldm8vL0RURCBkb2MgMS4wLy9FTiIpOworCisgICAgICAgIFN0cmluZyBzeXNpZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpICsgRmlsZS5zZXBhcmF0b3IgKyAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy5kdGQiOworICAgICAgICBkdGQuc2V0TG9jYXRpb24oc3lzaWQpOworICAgICAgICBjYXRhbG9nLmFkZERURChkdGQpOworICAgICAgICBGaWxlIGR0ZEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHN5c2lkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTb3VyY2UgcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlRW50aXR5KCItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFwOmNoZW1pY2FsK2Jyb3RoZXJzIik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModG9VUkxTdHJpbmcoZHRkRmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFN5c3RlbUlkKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgicmVzb2x2ZUVudGl0eSgpIGZhaWxlZCEiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUVudHJ5KCkgeworCisgICAgICAgIFJlc291cmNlTG9jYXRpb24gZHRkID0gbmV3IFJlc291cmNlTG9jYXRpb24oKTsKKyAgICAgICAgZHRkLnNldFB1YmxpY0lkKCItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIik7CisgICAgICAgIFN0cmluZyBzeXNpZCA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLmR0ZCI7CisgICAgICAgIGR0ZC5zZXRMb2NhdGlvbihzeXNpZCk7CisgICAgICAgIGNhdGFsb2cuYWRkRFREKGR0ZCk7CisgICAgICAgIEZpbGUgZHRkRmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUoc3lzaWQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVFbnRpdHkoIi0vL3N0ZXZvLy9EVEQgZG9jIDEuMC8vRU4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYXA6Y2hlbWljYWwrYnJvdGhlcnMiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0b1VSTFN0cmluZyhkdGRGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZXNvbHZlRW50aXR5KCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVudHJ5UmVmZXJlbmNlKCkgeworCisgICAgICAgIFN0cmluZyBwdWJsaWNJZCA9ICItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIjsKKyAgICAgICAgU3RyaW5nIHN5c2lkID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MuZHRkIjsKKworICAgICAgICAvLyBjYXRhbG9nMiAtLT4gY2F0YWxvZzEgLS0+IGNhdGFsb2cKKyAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiBkdGQgPSBuZXcgUmVzb3VyY2VMb2NhdGlvbigpOworICAgICAgICBkdGQuc2V0UHVibGljSWQocHVibGljSWQpOworICAgICAgICBkdGQuc2V0TG9jYXRpb24oc3lzaWQpOworICAgICAgICBjYXRhbG9nLmFkZERURChkdGQpOworICAgICAgICBGaWxlIGR0ZEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHN5c2lkKTsKKworICAgICAgICBTdHJpbmcgdXJpID0gImh0dHA6Ly9mb28uY29tL2Jhci9ibGFoLnhtbCI7CisgICAgICAgIFN0cmluZyB1cmlMb2MgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2Fib3V0LnhtbCI7CisKKyAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiBlbnRpdHkgPSBuZXcgUmVzb3VyY2VMb2NhdGlvbigpOworICAgICAgICBlbnRpdHkuc2V0UHVibGljSWQodXJpKTsKKyAgICAgICAgZW50aXR5LnNldExvY2F0aW9uKHVyaUxvYyk7CisgICAgICAgIGNhdGFsb2cuYWRkRW50aXR5KGVudGl0eSk7CisgICAgICAgIEZpbGUgeG1sRmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUodXJpTG9jKTsKKworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiY2F0YWxvZyIsIGNhdGFsb2cpOworCisgICAgICAgIFhNTENhdGFsb2cgY2F0YWxvZzEgPSBuZXdDYXRhbG9nKCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJjYXRhbG9nMSIsIGNhdGFsb2cxKTsKKyAgICAgICAgWE1MQ2F0YWxvZyBjYXRhbG9nMiA9IG5ld0NhdGFsb2coKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImNhdGFsb2cyIiwgY2F0YWxvZzEpOworCisgICAgICAgIGNhdGFsb2cxLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2ciKSk7CisgICAgICAgIGNhdGFsb2cyLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2cxIikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nMi5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFwOmNoZW1pY2FsK2Jyb3RoZXJzIik7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0b1VSTFN0cmluZyhkdGRGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZXNvbHZlRW50aXR5KCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmUodXJpLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0b1VSTFN0cmluZyh4bWxGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZXNvbHZlKCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZENhdGFsb2coKSB7CisKKyAgICAgICAgU3RyaW5nIHB1YmxpY0lkID0gIi0vL3N0ZXZvLy9EVEQgZG9jIDEuMC8vRU4iOworICAgICAgICBTdHJpbmcgZHRkTG9jID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MuZHRkIjsKKworICAgICAgICBSZXNvdXJjZUxvY2F0aW9uIGR0ZCA9IG5ldyBSZXNvdXJjZUxvY2F0aW9uKCk7CisgICAgICAgIGR0ZC5zZXRQdWJsaWNJZChwdWJsaWNJZCk7CisgICAgICAgIGR0ZC5zZXRMb2NhdGlvbihkdGRMb2MpOworICAgICAgICBjYXRhbG9nLmFkZERURChkdGQpOworICAgICAgICBGaWxlIGR0ZEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKGR0ZExvYyk7CisKKyAgICAgICAgU3RyaW5nIHVyaSA9ICJodHRwOi8vZm9vLmNvbS9iYXIvYmxhaC54bWwiOworICAgICAgICBTdHJpbmcgdXJpTG9jID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9hYm91dC54bWwiOworCisgICAgICAgIFJlc291cmNlTG9jYXRpb24gZW50aXR5ID0gbmV3IFJlc291cmNlTG9jYXRpb24oKTsKKyAgICAgICAgZW50aXR5LnNldFB1YmxpY0lkKHVyaSk7CisgICAgICAgIGVudGl0eS5zZXRMb2NhdGlvbih1cmlMb2MpOworICAgICAgICBjYXRhbG9nLmFkZEVudGl0eShlbnRpdHkpOworICAgICAgICBGaWxlIHhtbEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHVyaUxvYyk7CisKKyAgICAgICAgWE1MQ2F0YWxvZyBjYXRhbG9nMSA9IG5ld0NhdGFsb2coKTsKKyAgICAgICAgY2F0YWxvZzEuYWRkQ29uZmlndXJlZFhNTENhdGFsb2coY2F0YWxvZyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U291cmNlIHJlc3VsdCA9IGNhdGFsb2cxLnJlc29sdmVFbnRpdHkocHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYXA6Y2hlbWljYWwrYnJvdGhlcnMiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0b1VSTFN0cmluZyhkdGRGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZXNvbHZlRW50aXR5KCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmUodXJpLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0b1VSTFN0cmluZyh4bWxGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZXNvbHZlKCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZXJCYXNlKCkgeworCisgICAgICAgIFN0cmluZyB1cmkgPSAiaHR0cDovL2Zvby5jb20vYmFyL2JsYWgueG1sIjsKKyAgICAgICAgU3RyaW5nIHVyaUxvYyA9ICJldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9hYm91dC54bWwiOworICAgICAgICBTdHJpbmcgYmFzZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiYXNlID0gdG9VUkxTdHJpbmcocHJvamVjdC5nZXRCYXNlRGlyKCkpICsgIi9zcmMvIjsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmYWlsIChleC50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlc291cmNlTG9jYXRpb24gZW50aXR5ID0gbmV3IFJlc291cmNlTG9jYXRpb24oKTsKKyAgICAgICAgZW50aXR5LnNldFB1YmxpY0lkKHVyaSk7CisgICAgICAgIGVudGl0eS5zZXRMb2NhdGlvbih1cmlMb2MpOworICAgICAgICBjYXRhbG9nLmFkZEVudGl0eShlbnRpdHkpOworICAgICAgICBGaWxlIHhtbEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKCJzcmMvIiArIHVyaUxvYyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmUodXJpLCBiYXNlKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0b1VSTFN0cmluZyh4bWxGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0U3lzdGVtSWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJyZXNvbHZlKCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aCgpIHsKKworCisgICAgICAgIFN0cmluZyBwdWJsaWNJZCA9ICItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIjsKKyAgICAgICAgU3RyaW5nIGR0ZExvYyA9ICJ0ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy5kdGQiOworICAgICAgICBTdHJpbmcgcGF0aDEgPSBwcm9qZWN0LmdldEJhc2VEaXIoKS50b1N0cmluZygpICsgIi9zcmMvZXRjIjsKKworICAgICAgICBSZXNvdXJjZUxvY2F0aW9uIGR0ZCA9IG5ldyBSZXNvdXJjZUxvY2F0aW9uKCk7CisgICAgICAgIGR0ZC5zZXRQdWJsaWNJZChwdWJsaWNJZCk7CisgICAgICAgIGR0ZC5zZXRMb2NhdGlvbihkdGRMb2MpOworICAgICAgICBjYXRhbG9nLmFkZERURChkdGQpOworICAgICAgICBGaWxlIGR0ZEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKCJzcmMvZXRjLyIgKyBkdGRMb2MpOworCisgICAgICAgIFN0cmluZyB1cmkgPSAiaHR0cDovL2Zvby5jb20vYmFyL2JsYWgueG1sIjsKKyAgICAgICAgU3RyaW5nIHVyaUxvYyA9ICJldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9hYm91dC54bWwiOworICAgICAgICBTdHJpbmcgcGF0aDIgPSBwcm9qZWN0LmdldEJhc2VEaXIoKS50b1N0cmluZygpICsgIi9zcmMiOworCisgICAgICAgIFJlc291cmNlTG9jYXRpb24gZW50aXR5ID0gbmV3IFJlc291cmNlTG9jYXRpb24oKTsKKyAgICAgICAgZW50aXR5LnNldFB1YmxpY0lkKHVyaSk7CisgICAgICAgIGVudGl0eS5zZXRMb2NhdGlvbih1cmlMb2MpOworICAgICAgICBjYXRhbG9nLmFkZEVudGl0eShlbnRpdHkpOworICAgICAgICBGaWxlIHhtbEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKCJzcmMvIiArIHVyaUxvYyk7CisKKyAgICAgICAgUGF0aCBhUGF0aCA9IG5ldyBQYXRoKHByb2plY3QsIHBhdGgxKTsKKyAgICAgICAgYVBhdGguYXBwZW5kKG5ldyBQYXRoKHByb2plY3QsIHBhdGgyKSk7CisgICAgICAgIGNhdGFsb2cuc2V0Q2xhc3NwYXRoKGFQYXRoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTb3VyY2UgcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYXA6Y2hlbWljYWwrYnJvdGhlcnMiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRTdHIgPSBuZXcgVVJMKHJlc3VsdC5nZXRTeXN0ZW1JZCgpKS5nZXRGaWxlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRvVVJMU3RyaW5nKGR0ZEZpbGUpLmVuZHNXaXRoKHJlc3VsdFN0cikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgicmVzb2x2ZUVudGl0eSgpIGZhaWxlZCEiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTb3VyY2UgcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlKHVyaSwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0U3RyID0gbmV3IFVSTChyZXN1bHQuZ2V0U3lzdGVtSWQoKSkuZ2V0RmlsZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0b1VSTFN0cmluZyh4bWxGaWxlKS5lbmRzV2l0aChyZXN1bHRTdHIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInJlc29sdmUoKSBmYWlsZWQhIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWmlwRmlsZVNldFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBGaWxlU2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjI1ODIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWmlwRmlsZVNldFRlc3QuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQuCisgKgorICogPHA+VGhpcyBkb2Vzbid0IGFjdHVhbGx5IHRlc3QgbXVjaCwgbWFpbmx5IHJlZmVyZW5jZSBoYW5kbGluZy4KKyAqCisgKi8KKworcHVibGljIGNsYXNzIFppcEZpbGVTZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RGaWxlU2V0VGVzdCB7CisKKyAgICBwdWJsaWMgWmlwRmlsZVNldFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsZVNldCBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBaaXBGaWxlU2V0KCk7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBdHRyaWJ1dGVzKCkgeworICAgICAgICBaaXBGaWxlU2V0IGYgPSAoWmlwRmlsZVNldClnZXRJbnN0YW5jZSgpOworICAgICAgICAvL2NoZWNrIHRoYXQgZGlyIGFuZCBzcmMgYXJlIGluY29tcGF0aWJsZQorICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS56aXAiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLnNldERpcihuZXcgRmlsZSgiZXhhbXBsZXMiKSk7CisgICAgICAgICAgICBmYWlsKCJjYW4gYWRkIGRpciB0byAiCisgICAgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgd2hlbiBhIHNyYyBpcyBhbHJlYWR5IHByZXNlbnQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2Fubm90IHNldCBib3RoIGRpciBhbmQgc3JjIGF0dHJpYnV0ZXMiLGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgZiA9IChaaXBGaWxlU2V0KWdldEluc3RhbmNlKCk7CisgICAgICAgIC8vY2hlY2sgdGhhdCBkaXIgYW5kIHNyYyBhcmUgaW5jb21wYXRpYmxlCisgICAgICAgIGYuc2V0RGlyKG5ldyBGaWxlKCJleGFtcGxlcyIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnppcCIpKTsKKyAgICAgICAgICAgIGZhaWwoImNhbiBhZGQgc3JjIHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiB3aGVuIGEgZGlyIGlzIGFscmVhZHkgcHJlc2VudCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYW5ub3Qgc2V0IGJvdGggZGlyIGFuZCBzcmMgYXR0cmlidXRlcyIsYmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvL2NoZWNrIHRoYXQgZnVsbHBhdGggYW5kIHByZWZpeCBhcmUgaW5jb21wYXRpYmxlCisgICAgICAgIGYgPSAoWmlwRmlsZVNldClnZXRJbnN0YW5jZSgpOworICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS56aXAiKSk7CisgICAgICAgIGYuc2V0UHJlZml4KCIvZXhhbXBsZXMiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuc2V0RnVsbHBhdGgoIi9kb2MvbWFudWFsL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgZnVsbHBhdGggdG8gIgorICAgICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdoZW4gYSBwcmVmaXggaXMgYWxyZWFkeSBwcmVzZW50Iik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCBzZXQgYm90aCBmdWxscGF0aCBhbmQgcHJlZml4IGF0dHJpYnV0ZXMiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGYgPSAoWmlwRmlsZVNldClnZXRJbnN0YW5jZSgpOworICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS56aXAiKSk7CisgICAgICAgIGYuc2V0RnVsbHBhdGgoIi9kb2MvbWFudWFsL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYuc2V0UHJlZml4KCIvZXhhbXBsZXMiKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcHJlZml4IHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiB3aGVuIGEgZnVsbHBhdGggaXMgYWxyZWFkeSBwcmVzZW50Iik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCBzZXQgYm90aCBmdWxscGF0aCBhbmQgcHJlZml4IGF0dHJpYnV0ZXMiLCBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIHRoYXQgcmVmZXJlbmNlIHppcGZpbGVzZXRzIGNhbm5vdCBoYXZlIHNwZWNpZmljIGF0dHJpYnV0ZXMKKyAgICAgICAgZiA9IChaaXBGaWxlU2V0KWdldEluc3RhbmNlKCk7CisgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJ0ZXN0IikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZi5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUuemlwIikpOworICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBzcmMgdG8gIgorICAgICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdoZW4gYSByZWZpZCBpcyBhbHJlYWR5IHByZXNlbnQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSAiCisgICAgICAgICAgICArICJhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgdGhhdCBhIHJlZmVyZW5jZSB6aXBmaWxlc2V0IGdldHMgdGhlIHNhbWUgYXR0cmlidXRlcyBhcyB0aGUgb3JpZ2luYWwKKyAgICAgICAgZiA9IChaaXBGaWxlU2V0KWdldEluc3RhbmNlKCk7CisgICAgICAgIGYuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnppcCIpKTsKKyAgICAgICAgZi5zZXRQcmVmaXgoIi9leGFtcGxlcyIpOworICAgICAgICBmLnNldEZpbGVNb2RlKCI2MDAiKTsKKyAgICAgICAgZi5zZXREaXJNb2RlKCI1MzAiKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgidGVzdCIsZik7CisgICAgICAgIFppcEZpbGVTZXQgemlkPShaaXBGaWxlU2V0KWdldEluc3RhbmNlKCk7CisgICAgICAgIHppZC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgInRlc3QiKSk7CisgICAgICAgIGFzc2VydFRydWUoInNyYyBhdHRyaWJ1dGUgY29waWVkIGJ5IGNvcHkgY29uc3RydWN0b3IiLHppZC5nZXRTcmMoZ2V0UHJvamVjdCgpKS5lcXVhbHMoZi5nZXRTcmMoZ2V0UHJvamVjdCgpKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJwcmVmaXggYXR0cmlidXRlIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yIixmLmdldFByZWZpeChnZXRQcm9qZWN0KCkpLmVxdWFscyh6aWQuZ2V0UHJlZml4KGdldFByb2plY3QoKSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZmlsZSBtb2RlIGF0dHJpYnV0ZSBjb3BpZWQgYnkgY29weSBjb25zdHJ1Y3RvciIsZi5nZXRGaWxlTW9kZShnZXRQcm9qZWN0KCkpPT16aWQuZ2V0RmlsZU1vZGUoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgIGFzc2VydFRydWUoImRpciBtb2RlIGF0dHJpYnV0ZSBjb3BpZWQgYnkgY29weSBjb25zdHJ1Y3RvciIsZi5nZXREaXJNb2RlKGdldFByb2plY3QoKSk9PXppZC5nZXREaXJNb2RlKGdldFByb2plY3QoKSkpOworICAgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9tYXBwZXJzL0dsb2JNYXBwZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9HbG9iTWFwcGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTc5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9HbG9iTWFwcGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5tYXBwZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKKworLyoqCisgKiBUZXN0Y2FzZSBmb3IgdGhlICZsdDtnbG9ibWFwcGVyJmd0OyBtYXBwZXIuCisgKgorICovCitwdWJsaWMgY2xhc3MgR2xvYk1hcHBlclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgR2xvYk1hcHBlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL2dsb2JtYXBwZXIueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElnbm9yZUNhc2UoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImlnbm9yZS5jYXNlIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVEaXJTZXAoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoImhhbmRsZS5kaXJzZXAiKTsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvTWFwcGVyUmVzdWx0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9NYXBwZXJSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2E3YjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvTWFwcGVyUmVzdWx0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5tYXBwZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKKworLyoqCisgKiBUaGlzIGlzIGEgdGVzdCB0YXNrIHRvIHNob3cgdGhlIHJlc3VsdCBvZiBhIG1hcHBlcgorICogb24gYSBzcGVjaWZpYyBpbnB1dC4KKyAqIChUZXN0IGlzIG5vdCBpbiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MsIHRvIG1ha2Ugc3VyZSB0aGF0CisgKiBpdCBpcyBub3QgdHJlYXRlZCBhcyBhIHVuaXQgdGVzdC4KKyAqLworCitwdWJsaWMgY2xhc3MgTWFwcGVyUmVzdWx0IGV4dGVuZHMgVGFzayB7CisKKyAgICBwcml2YXRlIFN0cmluZyBmYWlsTWVzc2FnZSA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIGlucHV0OworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dDsKKyAgICBwcml2YXRlIEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyOworCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dCBvbiBhbiBlbXB0eSBzdHJpbmcgYXJyYXkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9NQVBQRVJfUkVTVUxUID0gIjxOVUxMPiI7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsTWVzc2FnZShTdHJpbmcgZmFpbE1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5mYWlsTWVzc2FnZSA9IGZhaWxNZXNzYWdlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRNYXBwZXIoTWFwcGVyIG1hcHBlcikgeworICAgICAgICBhZGQobWFwcGVyLmdldEltcGxlbWVudGF0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChGaWxlTmFtZU1hcHBlciBmaWxlTmFtZU1hcHBlcikgeworICAgICAgICBpZiAodGhpcy5maWxlTmFtZU1hcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG1hcHBlciB0eXBlIG5lc3RlZCBlbGVtZW50IGFsbG93ZWQiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmZpbGVOYW1lTWFwcGVyID0gZmlsZU5hbWVNYXBwZXI7CisgICAgfQorICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNaXNzaW5nIGF0dHJpYnV0ZSAnaW5wdXQnIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgYXR0cmlidXRlICdvdXRwdXQnIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGVOYW1lTWFwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWlzc2luZyBhIG5lc3RlZCBmaWxlIG5hbWUgbWFwcGVyIHR5cGUgZWxlbWVudCIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IGZpbGVOYW1lTWFwcGVyLm1hcEZpbGVOYW1lKGlucHV0KTsKKyAgICAgICAgU3RyaW5nIGZsYXR0ZW5lZDsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBmbGF0dGVuZWQgPSBOVUxMX01BUFBFUl9SRVNVTFQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgifCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiLmFwcGVuZChyZXN1bHRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxhdHRlbmVkID0gYi50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGlmICghZmxhdHRlbmVkLmVxdWFscyhvdXRwdXQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgZmFpbE1lc3NhZ2UKKyAgICAgICAgICAgICAgICArICIgIgorICAgICAgICAgICAgICAgICsgImdvdCAiCisgICAgICAgICAgICAgICAgKyBmbGF0dGVuZWQKKyAgICAgICAgICAgICAgICArICIgIgorICAgICAgICAgICAgICAgICsgImV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICArIG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9SZWdleHBQYXR0ZXJuTWFwcGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvUmVnZXhwUGF0dGVybk1hcHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2MxYzNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvUmVnZXhwUGF0dGVybk1hcHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMubWFwcGVyczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogVGVzdGNhc2UgZm9yIHRoZSAmbHQ7cmVnZXhwbWFwcGVyJmd0OyBtYXBwZXIuCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVnZXhwUGF0dGVybk1hcHBlclRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgUmVnZXhwUGF0dGVybk1hcHBlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL3JlZ2V4cG1hcHBlci54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlQ2FzZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiaWdub3JlLmNhc2UiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZURpclNlcCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiaGFuZGxlLmRpcnNlcCIpOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0TWFwcGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdE1hcHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDhlN2ExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdE1hcHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworCisvKioKKyAqIFRlc3Qgb3VyIHNjcmlwdCBtYXBwaW5nCisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRNYXBwZXJUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisgICAgcHVibGljIFNjcmlwdE1hcHBlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvc2NyaXB0bWFwcGVyLnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdENsZWFyIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNdWx0aXBsZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFNldE11bHRpcGxlIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXNzdGhyb3VnaCgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFBhc3N0aHJvdWdoIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdFNlbGVjdG9yVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdFNlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTI2NjkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0U2VsZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogVGVzdCB0aGF0IHNjcmlwdGluZyBzZWxlY3Rpb24gd29ya3MuIE5lZWRzIHNjcmlwdGluZyBzdXBwb3J0IHRvIHdvcmsKKyAqLworcHVibGljIGNsYXNzIFNjcmlwdFNlbGVjdG9yVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisKKyAgICBwdWJsaWMgU2NyaXB0U2VsZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3RvcnMvc2NyaXB0c2VsZWN0b3IueG1sIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vbGFuZ3VhZ2UoKSB7CisgICAgICAgIGV4cGVjdEJ1aWxkRXhjZXB0aW9uQ29udGFpbmluZygidGVzdE5vbGFuZ3VhZ2UiLAorICAgICAgICAgICAgICAgICJBYnNlbmNlIG9mIGxhbmd1YWdlIGF0dHJpYnV0ZSBub3QgZGV0ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJzY3JpcHQgbGFuZ3VhZ2UgbXVzdCBiZSBzcGVjaWZpZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uU2V0QnlEZWZhdWx0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0U2VsZWN0aW9uU2V0QnlEZWZhdWx0Iik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25TZXRXb3JrcygpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdFNlbGVjdGlvblNldFdvcmtzIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25DbGVhcldvcmtzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0U2VsZWN0aW9uQ2xlYXJXb3JrcyIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZW5hbWVBdHRyaWJ1dGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlbmFtZUF0dHJpYnV0ZSIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUF0dHJpYnV0ZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVBdHRyaWJ1dGUiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2VkaXJBdHRyaWJ1dGUoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RCYXNlZGlyQXR0cmlidXRlIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZVNldFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlU2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTdiODgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZVNldFRlc3QuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmRlcGVuZDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKKworLyoqCisgKiBUZXN0Y2FzZSBmb3IgdGhlIENsYXNzZmlsZXNldCBvcHRpb25hbCB0eXBlLgorICoKKyAqLworcHVibGljIGNsYXNzIENsYXNzRmlsZVNldFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfRklMRVNFVCA9ICJyZXN1bHQiOworCisgICAgcHVibGljIENsYXNzRmlsZVNldFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIC8vIHNoYXJlIHRoZSBzZXR1cCBmb3IgdGVzdGluZyB0aGUgZGVwZW5kIHRhc2sKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2RlcGVuZC54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGJhc2ljIGNsYXNzZmlsZXNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1NldCgpIHsKKyAgICAgICAgUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0YmFzaWNzZXQiKTsKKyAgICAgICAgRmlsZVNldCByZXN1bHRGaWxlU2V0ID0gKEZpbGVTZXQpcC5nZXRSZWZlcmVuY2UoUkVTVUxUX0ZJTEVTRVQpOworICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSByZXN1bHRGaWxlU2V0LmdldERpcmVjdG9yeVNjYW5uZXIocCk7CisgICAgICAgIFN0cmluZ1tdIHNjYW5uZWRGaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICBIYXNodGFibGUgZmlsZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Nhbm5lZEZpbGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBmaWxlcy5wdXQoc2Nhbm5lZEZpbGVzW2ldLCBzY2FubmVkRmlsZXNbaV0pOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiQ2xhc3NmaWxlc2V0IGRpZCBub3QgcGljayB1cCBleHBlY3RlZCBudW1iZXIgb2YgIgorICAgICAgICAgICAgKyAiY2xhc3MgZmlsZXMiLCA0LCBmaWxlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEEuY2xhc3MiLAorICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoIkEuY2xhc3MiKSk7CisgICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQi5jbGFzcyIsCisgICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgiQi5jbGFzcyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBDLmNsYXNzIiwKKyAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJDLmNsYXNzIikpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEQuY2xhc3MiLAorICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoIkQuY2xhc3MiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBzbWFsbCBjbGFzc2ZpbGVzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U21hbGxTZXQoKSB7CisgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdHNtYWxsc2V0Iik7CisgICAgICAgIEZpbGVTZXQgcmVzdWx0RmlsZVNldCA9IChGaWxlU2V0KXAuZ2V0UmVmZXJlbmNlKFJFU1VMVF9GSUxFU0VUKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gcmVzdWx0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKHApOworICAgICAgICBTdHJpbmdbXSBzY2FubmVkRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgSGFzaHRhYmxlIGZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjYW5uZWRGaWxlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgZmlsZXMucHV0KHNjYW5uZWRGaWxlc1tpXSwgc2Nhbm5lZEZpbGVzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzZmlsZXNldCBkaWQgbm90IHBpY2sgdXAgZXhwZWN0ZWQgbnVtYmVyIG9mICIKKyAgICAgICAgICAgICsgImNsYXNzIGZpbGVzIiwgMiwgZmlsZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBCLmNsYXNzIiwKKyAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJCLmNsYXNzIikpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEMuY2xhc3MiLAorICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoIkMuY2xhc3MiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjb21ibyBjbGFzc2ZpbGVzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tYm9TZXQoKSB7CisgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdGNvbWJvc2V0Iik7CisgICAgICAgIEZpbGVTZXQgcmVzdWx0RmlsZVNldCA9IChGaWxlU2V0KXAuZ2V0UmVmZXJlbmNlKFJFU1VMVF9GSUxFU0VUKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gcmVzdWx0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKHApOworICAgICAgICBTdHJpbmdbXSBzY2FubmVkRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgSGFzaHRhYmxlIGZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjYW5uZWRGaWxlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgZmlsZXMucHV0KHNjYW5uZWRGaWxlc1tpXSwgc2Nhbm5lZEZpbGVzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzZmlsZXNldCBkaWQgbm90IHBpY2sgdXAgZXhwZWN0ZWQgbnVtYmVyIG9mICIKKyAgICAgICAgICAgICsgImNsYXNzIGZpbGVzIiwgMSwgZmlsZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBDLmNsYXNzIiwKKyAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJDLmNsYXNzIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB5b3UgY2FuIHBhc3MgYSBjbGFzc2ZpbGVzZXQgYnkgcmVmZXJlbmNlIHRvIGEgZmlsZXNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnlSZWZlcmVuY2UoKSB7CisgICAgICAgIGV4ZWN1dGVUYXJnZXQoInRlc3RieXJlZmVyZW5jZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBjbGFzc2VzIGluY2x1ZGVkIGluIGEgbWV0aG9kICJTeXN0ZW0ub3V0LnByaW50bG4oTXlDbGFzcy5jbGFzcykiIGFyZSBpbmNsdWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kUGFyYW0oKSB7CisgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgidGVzdG1ldGhvZHBhcmFtIik7CisgICAgICAgIEZpbGVTZXQgcmVzdWx0RmlsZVNldCA9IChGaWxlU2V0KXAuZ2V0UmVmZXJlbmNlKFJFU1VMVF9GSUxFU0VUKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gcmVzdWx0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKHApOworICAgICAgICBTdHJpbmdbXSBzY2FubmVkRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgSGFzaHRhYmxlIGZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjYW5uZWRGaWxlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgZmlsZXMucHV0KHNjYW5uZWRGaWxlc1tpXSwgc2Nhbm5lZEZpbGVzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzZmlsZXNldCBkaWQgbm90IHBpY2sgdXAgZXhwZWN0ZWQgbnVtYmVyIG9mICIKKyAgICAgICAgICAgICsgImNsYXNzIGZpbGVzIiwgNSwgZmlsZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBBLmNsYXNzIiwKKyAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJBLmNsYXNzIikpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEIuY2xhc3MiLAorICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoIkIuY2xhc3MiKSk7CisgICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQy5jbGFzcyIsCisgICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgiQy5jbGFzcyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBELmNsYXNzIiwKKyAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJELmNsYXNzIikpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEUuY2xhc3MiLAorICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoIkUuY2xhc3MiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGNsYXNzZXMgaW5jbHVkZWQgaW4gYSBtZXRob2QgIlN5c3RlbS5vdXQucHJpbnRsbihPdXRlci5Jbm5lci5jbGFzcykiIGFyZSBpbmNsdWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kUGFyYW1Jbm5lcigpIHsKKyAgICAgICAgUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0bWV0aG9kcGFyYW1pbm5lciIpOworICAgICAgICBGaWxlU2V0IHJlc3VsdEZpbGVTZXQgPSAoRmlsZVNldClwLmdldFJlZmVyZW5jZShSRVNVTFRfRklMRVNFVCk7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lciA9IHJlc3VsdEZpbGVTZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwKTsKKyAgICAgICAgU3RyaW5nW10gc2Nhbm5lZEZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgIEhhc2h0YWJsZSBmaWxlcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2FubmVkRmlsZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGZpbGVzLnB1dChzY2FubmVkRmlsZXNbaV0sIHNjYW5uZWRGaWxlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGFzc2ZpbGVzZXQgZGlkIG5vdCBwaWNrIHVwIGV4cGVjdGVkIG51bWJlciBvZiAiCisgICAgICAgICAgICArICJjbGFzcyBmaWxlcyIsIDQsIGZpbGVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gdGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJPdXRlciRJbm5lci5jbGFzcyIsCisgICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgidGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJPdXRlciRJbm5lci5jbGFzcyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiB0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgIk91dGVyLmNsYXNzIiwKKyAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgIk91dGVyLmNsYXNzIikpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIHRlc3QiICsgRmlsZS5zZXBhcmF0b3IgKyAiQ29udGFpbnNPbmx5SW5uZXIuY2xhc3MiLAorICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoInRlc3QiICsgRmlsZS5zZXBhcmF0b3IgKyAiQ29udGFpbnNPbmx5SW5uZXIuY2xhc3MiKSk7CisgICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gdGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJDb250YWluc09ubHlJbm5lci5jbGFzcyIsCisgICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgidGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJNZXRob2RQYXJhbS5jbGFzcyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VDb2xsZWN0aW9uKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0cmVzb3VyY2Vjb2xsZWN0aW9uIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0phdmFSZXNvdXJjZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSmF2YVJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5N2ZlZTYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0phdmFSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwdWJsaWMgSmF2YVJlc291cmNlVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVzb3VyY2VzL2phdmFyZXNvdXJjZS54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZE1hbmlmZXN0KCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJsb2FkTWFuaWZlc3QiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm1hbmlmZXN0IikpOworCisgICAgICAgIC8vIHRoaXMgYWN0dWFsbHkgcmVsaWVzIG9uIHRoZSBmaXJzdCBtYW5pZmVzdCBiZWluZyBmb3VuZCBvbgorICAgICAgICAvLyB0aGUgY2xhc3NwYXRoIChwcm9iYWJseSBydC5qYXIncykgYmVpbmcgdmFsaWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm1hbmlmZXN0IikKKyAgICAgICAgICAgICAgICAgICAuc3RhcnRzV2l0aCgiTWFuaWZlc3QtVmVyc2lvbjoiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9UYXJSZXNvdXJjZVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVGFyUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzIxNTdkYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVGFyUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworCitwdWJsaWMgY2xhc3MgVGFyUmVzb3VyY2VUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRlUgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICBwdWJsaWMgVGFyUmVzb3VyY2VUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3Jlc291cmNlcy90YXJlbnRyeS54bWwiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZWFyRG93biIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVbmNvbXByZXNzU291cmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ1bmNvbXByZXNzU291cmNlIik7CisgICAgICAgIGFzc2VydFRydWUoRlUuY29udGVudEVxdWFscyhwcm9qZWN0LnJlc29sdmVGaWxlKCIuLi8uLi9hc2YtbG9nby5naWYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QucmVzb2x2ZUZpbGUoInRlc3RvdXQvYXNmLWxvZ28uZ2lmIikpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3RvclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZVNlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGFlNTEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBCYXNlIHRlc3QgY2FzZSBmb3IgU2VsZWN0b3JzLiBQcm92aWRlcyBhIHNoYXJlZCB0ZXN0IGFzIHdlbGwgYXMKKyAqIGEgdGVzdCBiZWQgZm9yIHNlbGVjdGluZyBvbiwgYW5kIGEgaGVscGVyIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcKKyAqIHdoZXRoZXIgc2VsZWN0aW9ucyBhcmUgY29ycmVjdC4KKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2VsZWN0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisgICAgcHJpdmF0ZSBUYXNrZGVmRm9yTWFraW5nQmVkIHRiZWQgPSBudWxsOworICAgIHByb3RlY3RlZCBTdHJpbmcgYmFzZWRpcm5hbWUgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMiOworICAgIHByb3RlY3RlZCBTdHJpbmcgYmVkZGlybmFtZSA9IGJhc2VkaXJuYW1lICsgIi9zZWxlY3RvcnRlc3QiOworICAgIHByb3RlY3RlZCBTdHJpbmcgbWlycm9yZGlybmFtZSA9IGJhc2VkaXJuYW1lICsgIi9zZWxlY3RvcnRlc3QyIjsKKyAgICBwcm90ZWN0ZWQgRmlsZSBiYXNlZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIGJhc2VkaXJuYW1lKTsKKyAgICBwcm90ZWN0ZWQgRmlsZSBiZWRkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgYmVkZGlybmFtZSk7CisgICAgcHJvdGVjdGVkIEZpbGUgbWlycm9yZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIG1pcnJvcmRpcm5hbWUpOworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBmaWxlbmFtZXMgPSB7Ii4iLCJhc2YtbG9nby5naWYubWQ1IiwiYXNmLWxvZ28uZ2lmLmJ6MiIsCisgICAgICAgICAgICAiYXNmLWxvZ28uZ2lmLmd6IiwiY29weS5maWx0ZXJzZXQuZmlsdGVyZWQiLCJ6aXAvYXNmLWxvZ28uZ2lmLnppcCIsCisgICAgICAgICAgICAidGFyL2FzZi1sb2dvLmdpZi50YXIiLCJ0YXIvYXNmLWxvZ28taHVnZS50YXIuZ3oiLAorICAgICAgICAgICAgInRhci9nei9hc2YtbG9nby5naWYudGFyLmd6IiwidGFyL2J6Mi9hc2YtbG9nby5naWYudGFyLmJ6MiIsCisgICAgICAgICAgICAidGFyL2J6Mi9hc2YtbG9nby1odWdlLnRhci5iejIiLCJ0YXIvYnoyIn07CisgICAgcHJvdGVjdGVkIEZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlW2ZpbGVuYW1lcy5sZW5ndGhdOworICAgIHByb3RlY3RlZCBGaWxlW10gbWlycm9yZmlsZXMgPSBuZXcgRmlsZVtmaWxlbmFtZXMubGVuZ3RoXTsKKworICAgIHB1YmxpYyBCYXNlU2VsZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5pbml0KCk7CisgICAgICAgIHByb2plY3Quc2V0QmFzZURpcihiYXNlZGlyKTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBmaWxlcy5sZW5ndGg7IHgrKykgeworICAgICAgICAgICAgZmlsZXNbeF0gPSBuZXcgRmlsZShiZWRkaXIsZmlsZW5hbWVzW3hdKTsKKyAgICAgICAgICAgIG1pcnJvcmZpbGVzW3hdID0gbmV3IEZpbGUobWlycm9yZGlyLGZpbGVuYW1lc1t4XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGlzIGluIGNoaWxkIGNsYXNzZXMgdG8gcmV0dXJuIGEgc3BlY2lmaWMgU2VsZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQmFzZVNlbGVjdG9yIGdldEluc3RhbmNlKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHByZWNvbmZpZ3VyZWQgc2VsZWN0b3IgKHdpdGggYSBzZXQgcmVmZXJlbmNlIHRvCisgICAgICogcHJvamVjdCBpbnN0YW5jZSkuCisgICAgICogQHJldHVybiB0aGUgc2VsZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzZVNlbGVjdG9yIGdldFNlbGVjdG9yKCkgeworICAgICAgICBCYXNlU2VsZWN0b3Igc2VsZWN0b3IgPSBnZXRJbnN0YW5jZSgpOworICAgICAgICBzZWxlY3Rvci5zZXRQcm9qZWN0KCBnZXRQcm9qZWN0KCkgKTsKKyAgICAgICAgcmV0dXJuIHNlbGVjdG9yOworICAgIH0KKworCisgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHRlc3QgdGhhdCBhbGwgU2VsZWN0b3JzIGRlcml2ZWQgZnJvbSBCYXNlU2VsZWN0b3IgY2FuCisgICAgICogdXNlLiBJdCBjYWxscyB0aGUgc2V0RXJyb3IoKSBtZXRob2QgYW5kIGNoZWNrcyB0byBlbnN1cmUgdGhhdCBhCisgICAgICogQnVpbGRFeGNlcHRpb24gaXMgdGhyb3duIGFzIGEgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25kc1RvRXJyb3IoKSB7CisgICAgICAgIEJhc2VTZWxlY3RvciBzID0gZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHMuc2V0RXJyb3IoInRlc3QgZXJyb3IiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiZWRkaXIsZmlsZW5hbWVzWzBdLGZpbGVzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbm5vdCBjYXVzZSBCdWlsZEV4Y2VwdGlvbiB3aGVuIHNldEVycm9yKCkgaXMgY2FsbGVkIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QgZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRoYXQgdGFrZXMgYSBzZWxlY3RvciBhbmQgY2FsbHMgaXRzCisgICAgICogaXNTZWxlY3RlZCgpIG1ldGhvZCBvbiBlYWNoIGZpbGUgaW4gdGhlIHRlc3RiZWQuIEl0IHJldHVybnMKKyAgICAgKiBhIHN0cmluZyBvZiAiVCJzIGFtZCAiRiJzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzZWxlY3Rpb25TdHJpbmcoRmlsZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIHJldHVybiBzZWxlY3Rpb25TdHJpbmcoYmVkZGlyLGZpbGVzLHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0aGF0IHRha2VzIGEgc2VsZWN0b3IgYW5kIGNhbGxzIGl0cworICAgICAqIGlzU2VsZWN0ZWQoKSBtZXRob2Qgb24gZWFjaCBmaWxlIGluIHRoZSBtaXJyb3IgdGVzdGJlZC4gVGhpcworICAgICAqIHZhcmlhdGlvbiBpcyB1c2VkIGZvciBkZXBlbmRlbmN5IGNoZWNrcyBhbmQgdG8gZ2V0IGFyb3VuZCB0aGUKKyAgICAgKiBsaW1pdGF0aW9ucyBpbiB0aGUgdG91Y2ggdGFzayB3aGVuIHJ1bm5pbmcgSkRLIDEuMS4gSXQgcmV0dXJucworICAgICAqIGEgc3RyaW5nIG9mICJUInMgYW1kICJGInMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBtaXJyb3JTZWxlY3Rpb25TdHJpbmcoRmlsZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIHJldHVybiBzZWxlY3Rpb25TdHJpbmcobWlycm9yZGlyLG1pcnJvcmZpbGVzLHNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXb3JrZXIgbWV0aG9kIGZvciB0aGUgdHdvIGNvbnZlbmllbmNlIG1ldGhvZHMgYWJvdmUuIEFwcGxpZXMgYQorICAgICAqIHNlbGVjdG9yIG9uIGEgc2V0IG9mIGZpbGVzIHBhc3NlZCBpbiBhbmQgcmV0dXJucyBhIHN0cmluZyBvZgorICAgICAqICJUInMgYW1kICJGInMgZnJvbSBhcHBseWluZyB0aGUgc2VsZWN0b3IgdG8gZWFjaCBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc2VsZWN0aW9uU3RyaW5nKEZpbGUgYmFzZWRpciwgRmlsZVtdIGZpbGVzLCBGaWxlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBmaWxlcy5sZW5ndGg7IHgrKykgeworICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmlzU2VsZWN0ZWQoYmFzZWRpcixmaWxlbmFtZXNbeF0sZmlsZXNbeF0pKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnVCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnRicpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSBzZWxlY3Rpb24gdGVzdCBmb3IgYSBnaXZlbiBzZWxlY3RvciBhbmQgcHJpbnRzIHRoZQorICAgICAqIGZpbGVuYW1lcyBvZiB0aGUgZGlmZmVyaW5nIGZpbGVzIChzZWxlY3RlZCBidXQgc2hvdWxkbid0LAorICAgICAqIG5vdCBzZWxlY3RlZCBidXQgc2hvdWxkKS4KKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgIFRoZSBzZWxlY3RvciB0byB0ZXN0CisgICAgICogQHBhcmFtIGV4cGVjdGVkICBUaGUgZXhwZWN0ZWQgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGVyZm9ybVRlc3RzKEZpbGVTZWxlY3RvciBzZWxlY3RvciwgU3RyaW5nIGV4cGVjdGVkKSB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBzZWxlY3Rpb25TdHJpbmcoc2VsZWN0b3IpOworICAgICAgICBTdHJpbmcgZGlmZiA9IGRpZmYoZXhwZWN0ZWQsIHJlc3VsdCk7CisgICAgICAgIFN0cmluZyByZXNvbHZlZCA9IHJlc29sdmUoZGlmZik7CisgICAgICAgIGFzc2VydEVxdWFscygiRGlmZmVyaW5nIGZpbGVzOiAiICsgcmVzb2x2ZWQsIHJlc3VsdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBDaGVja3Mgd2hpY2ggZmlsZXMgYXJlIHNlbGVjdGVkIGFuZCBzaG91bGRuJ3QgYmUgb3Igd2hpY2gKKyAgICAgKiAgYXJlIG5vdCBzZWxlY3RlZCBidXQgc2hvdWxkLgorICAgICAqICBAcGFyYW0gZXhwZWN0ZWQgICAgU3RyaW5nIGNvbnRhaW5pbmcgJ0YncyBhbmQgJ1QncworICAgICAqICBAcGFyYW0gcmVzdWx0ICAgICAgU3RyaW5nIGNvbnRhaW5pbmcgJ0YncyBhbmQgJ1QncworICAgICAqICBAcmV0dXJuIERpZmZlcmVuY2UgYXMgU3RyaW5nIGNvbnRhaW5pbmcgJy0nIChlcXVhbCkgYW5kCisgICAgICogICAgICAgICAgJ1gnIChkaWZmZXJlbmNlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRpZmYoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgcmVzdWx0KSB7CisgICAgICAgIGludCBsZW5ndGgxID0gZXhwZWN0ZWQubGVuZ3RoKCk7CisgICAgICAgIGludCBsZW5ndGgyID0gcmVzdWx0Lmxlbmd0aCgpOworICAgICAgICBpbnQgbWluID0gKGxlbmd0aDEgPiBsZW5ndGgyKSA/IGxlbmd0aDIgOiBsZW5ndGgxOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtaW47IGkrKykgeworICAgICAgICAgICAgc2IuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgKGV4cGVjdGVkLmNoYXJBdChpKSA9PSByZXN1bHQuY2hhckF0KGkpKQorICAgICAgICAgICAgICAgID8gIi0iCisgICAgICAgICAgICAgICAgOiAiWCIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlcyBhIGRpZmYtU3RyaW5nIChAc2VlIGRpZmYoKSkgYWdhaW5zdCB0aGUgKGluaGVyaXRlZCkgZmlsZW5hbWVzLQorICAgICAqIGFuZCBmaWxlcyBhcnJheXMuCisgICAgICogQHBhcmFtIGZpbGVsaXN0ICAgIERpZmYtU3RyaW5nCisgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZW5hbWVzIGZvciBhbGwgZGlmZmVyaW5nIGZpbGVzLAorICAgICAqICAgICAgICAgc2VwYXJhdGVkIHdpdGggc2VtaWNvbG9ucyAnOycKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGZpbGVsaXN0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaW50IG1pbiA9IChmaWxlbmFtZXMubGVuZ3RoID4gZmlsZWxpc3QubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgPyBmaWxlbGlzdC5sZW5ndGgoKQorICAgICAgICAgICAgICAgIDogZmlsZW5hbWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1pbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoJ1gnPT1maWxlbGlzdC5jaGFyQXQoaSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZmlsZW5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIDxwPkNyZWF0ZXMgYSB0ZXN0YmVkLiBXZSBhdm9pZCB0aGUgZHJlYWRlZCAidGVzdCIgd29yZCBzbyB0aGF0IHdlCisgICAgICogZG9uJ3QgZmFsc2VseSBpZGVudGlmeSB0aGlzIGFzIGEgdGVzdCB0byBiZSBydW4uIFRoZSBhY3R1YWwKKyAgICAgKiBzZXR0aW5nIHVwIG9mIHRoZSB0ZXN0YmVkIGlzIGRvbmUgaW4gdGhlCisgICAgICogPGNvZGU+c3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvc2VsZWN0b3JzLnhtbDwvY29kZT4gYnVpbGQgZmlsZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHJpZ2h0IHdheSB0byBjYWxsIHRoaXMgaXMgd2l0aGluIGEgdHJ5IGJsb2NrLAorICAgICAqIHdpdGggYSBmaW5hbGx5IGNsYXVzZSB0aGF0IGNhbGxzIGNsZWFudXBCZWQoKS4gWW91IHBsYWNlIHRlc3RzIG9mCisgICAgICogdGhlIGlzU2VsZWN0ZWQoKSBtZXRob2Qgd2l0aGluIHRoZSB0cnkgYmxvY2suPC9wPgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG1ha2VCZWQoKSB7CisgICAgICAgIHRiZWQgPSBuZXcgVGFza2RlZkZvck1ha2luZ0JlZCgic2V0dXBmaWxlcyIpOworICAgICAgICB0YmVkLnNldFVwKCk7CisgICAgICAgIHRiZWQubWFrZVRlc3RiZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhbnMgdXAgdGhlIHRlc3RiZWQgYnkgY2FsbGluZyBhIHRhcmdldCBpbiB0aGUKKyAgICAgKiA8Y29kZT5zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3RvcnMueG1sPC9jb2RlPiBmaWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsZWFudXBCZWQoKSB7CisgICAgICAgIGlmICh0YmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRiZWQudGVhckRvd24oKTsKKyAgICAgICAgICAgIHRiZWQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiA8cD5DcmVhdGVzIGEgbWlycm9yIG9mIHRoZSB0ZXN0YmVkIGZvciB1c2UgaW4gZGVwZW5kZW5jeSBjaGVja3MuPC9wPgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSByaWdodCB3YXkgdG8gY2FsbCB0aGlzIGlzIHdpdGhpbiBhIHRyeSBibG9jaywKKyAgICAgKiB3aXRoIGEgZmluYWxseSBjbGF1c2UgdGhhdCBjYWxscyBjbGVhbnVwTWlycm9yKCkuIFlvdSBwbGFjZSB0ZXN0cyBvZgorICAgICAqIHRoZSBpc1NlbGVjdGVkKCkgbWV0aG9kIHdpdGhpbiB0aGUgdHJ5IGJsb2NrLjwvcD4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlTWlycm9yKCkgeworICAgICAgICB0YmVkID0gbmV3IFRhc2tkZWZGb3JNYWtpbmdCZWQoIm1pcnJvcmZpbGVzIik7CisgICAgICAgIHRiZWQuc2V0VXAoKTsKKyAgICAgICAgdGJlZC5tYWtlTWlycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYW5zIHVwIHRoZSBtaXJyb3IgdGVzdGJlZCBieSBjYWxsaW5nIGEgdGFyZ2V0IGluIHRoZQorICAgICAqIDxjb2RlPnNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy54bWw8L2NvZGU+IGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYW51cE1pcnJvcigpIHsKKyAgICAgICAgaWYgKHRiZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGJlZC5kZWxldGVNaXJyb3IoKTsKKyAgICAgICAgICAgIHRiZWQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBUYXNrZGVmRm9yTWFraW5nQmVkIGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICAgICAgVGFza2RlZkZvck1ha2luZ0JlZChTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy54bWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbWFrZVRlc3RiZWQoKSB7CisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJzZXR1cGZpbGVzIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBtYWtlTWlycm9yKCkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgibWlycm9yZmlsZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU1pcnJvcigpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVUYXJnZXQoImNsZWFudXAubWlycm9yZmlsZXMiKTsKKyAgICAgICAgfQorICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNSZWdleHBUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zUmVnZXhwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmE0N2MKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zUmVnZXhwVGVzdC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKworcHVibGljIGNsYXNzIENvbnRhaW5zUmVnZXhwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgcHVibGljIENvbnRhaW5zUmVnZXhwVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcigiLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc1JlZ2V4cCgpIHsKKyAgICAgICAgVGFza2RlZkZvclJlZ2V4cFRlc3QgTXlUYXNrID0KKyAgICAgICAgICAgIG5ldyBUYXNrZGVmRm9yUmVnZXhwVGVzdCgiY29udGFpbnNyZWdleHAiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE15VGFzay5zZXRVcCgpOworICAgICAgICAgICAgTXlUYXNrLnRlc3QoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE15VGFzay50ZWFyRG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBUYXNrZGVmRm9yUmVnZXhwVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworICAgICAgICBUYXNrZGVmRm9yUmVnZXhwVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy54bWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cHJlZ2V4cCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gbnVsbDsKKyAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IG51bGw7CisgICAgICAgICAgICBpbnQgZmlsZWNvdW50OworCisgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KCJjb250YWluc3JlZ2V4cCIpOworCQorICAgICAgICAgICAgZGlyID0gbmV3IEZpbGUoZ2V0UHJvamVjdERpcigpICsgIi9yZWdleHBzZWx0ZXN0ZGVzdC8iKTsKKyAgICAgICAgICAgIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOworICAgICAgICAgICAgZmlsZWNvdW50ID0gZmlsZXMubGVuZ3RoOworCQorICAgICAgICAgICAgaWYgKGZpbGVjb3VudCAhPSAxKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29udGFpbnNSZWdleHAgdGVzdCBzaG91bGQgaGF2ZSBjb3BpZWQgMSBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgZmlsZXMubGVuZ3RoKTsKKwkKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Db250YWluc1NlbGVjdG9yVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Db250YWluc1NlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTVlY2UKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zU2VsZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKKworLyoqCisgKiBUZXN0cyBDb250YWlucyBTZWxlY3RvcnMuCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29udGFpbnNTZWxlY3RvclRlc3QgZXh0ZW5kcyBCYXNlU2VsZWN0b3JUZXN0IHsKKworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgcHVibGljIENvbnRhaW5zU2VsZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIGZyb20gYmFzZSBjbGFzcy4gVGhpcyBpcyBvdmVycmlkZW4gaW4gY2hpbGQKKyAgICAgKiBjbGFzc2VzIHRvIHJldHVybiBhIHNwZWNpZmljIFNlbGVjdG9yIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBCYXNlU2VsZWN0b3IgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29udGFpbnNTZWxlY3RvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGNvZGUgdGhhdCB2YWxpZGF0ZXMgdGhlIHNlbGVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZSgpIHsKKyAgICAgICAgQ29udGFpbnNTZWxlY3RvciBzID0gKENvbnRhaW5zU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJDb250YWluc1NlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkICd0ZXh0JyIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHRleHQgYXR0cmlidXRlIGlzIHJlcXVpcmVkIiwgYmUxLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBzID0gKENvbnRhaW5zU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOworICAgICAgICBwYXJhbS5zZXROYW1lKCJnYXJiYWdlIGluIik7CisgICAgICAgIHBhcmFtLnNldFZhbHVlKCJnYXJiYWdlIG91dCIpOworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSB7cGFyYW19OworICAgICAgICBzLnNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJDb250YWluc1NlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIHZhbGlkIHBhcmFtZXRlciBlbGVtZW50Iik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIHBhcmFtZXRlciBnYXJiYWdlIGluIiwgYmUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWxlY3RvciBpcyBzZWxlY3RpbmcgZmlsZXMgY29ycmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXIoKSB7CisgICAgICAgIENvbnRhaW5zU2VsZWN0b3IgczsKKyAgICAgICAgU3RyaW5nIHJlc3VsdHM7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ha2VCZWQoKTsKKworICAgICAgICAgICAgcyA9IChDb250YWluc1NlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldFRleHQoIm5vIHN1Y2ggc3RyaW5nIGluIHRlc3QgZmlsZXMiKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGRkZGRkZGVCIsIHJlc3VsdHMpOworCisgICAgICAgICAgICBzID0gKENvbnRhaW5zU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0VGV4dCgiQXBhY2hlIEFudCIpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVEZGRlRGRkZGRkZUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoQ29udGFpbnNTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXRUZXh0KCJhcGFjaGUgYW50Iik7CisgICAgICAgICAgICBzLnNldENhc2VzZW5zaXRpdmUodHJ1ZSk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGRkZGRlQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChDb250YWluc1NlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldFRleHQoImFwYWNoZSBhbnQiKTsKKyAgICAgICAgICAgIHMuc2V0Q2FzZXNlbnNpdGl2ZShmYWxzZSk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGVEZGRkZGRlQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChDb250YWluc1NlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldFRleHQoIkFwYWNoZUFudCIpOworICAgICAgICAgICAgcy5zZXRJZ25vcmV3aGl0ZXNwYWNlKHRydWUpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVEZGRlRGRkZGRkZUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoQ29udGFpbnNTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXRUZXh0KCJBIHAgYSBjIGggZSAgICBBIG4gdCIpOworICAgICAgICAgICAgcy5zZXRJZ25vcmV3aGl0ZXNwYWNlKHRydWUpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVEZGRlRGRkZGRkZUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsZWFudXBCZWQoKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RhdGVTZWxlY3RvclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGF0ZVNlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjZkNDMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RhdGVTZWxlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworCitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKworLyoqCisgKiBUZXN0cyBEYXRlIFNlbGVjdG9ycy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlU2VsZWN0b3JUZXN0IGV4dGVuZHMgQmFzZVNlbGVjdG9yVGVzdCB7CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIHB1YmxpYyBEYXRlU2VsZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIGZyb20gYmFzZSBjbGFzcy4gVGhpcyBpcyBvdmVycmlkZW4gaW4gY2hpbGQKKyAgICAgKiBjbGFzc2VzIHRvIHJldHVybiBhIHNwZWNpZmljIFNlbGVjdG9yIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBCYXNlU2VsZWN0b3IgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0ZVNlbGVjdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgY29kZSB0aGF0IHZhbGlkYXRlcyB0aGUgc2VsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgeworICAgICAgICBEYXRlU2VsZWN0b3IgcyA9IChEYXRlU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJEYXRlU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBwcm92aWRlIGEgZGF0ZXRpbWUgb3IgdGhlIG51bWJlciBvZiAiCisgICAgICAgICAgICAgICAgICAgICsgIm1pbGxpc2Vjb25kcy4iLCBiZTEuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSAoRGF0ZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIHMuc2V0RGF0ZXRpbWUoIjAxLzAxLzE5NjkgMDE6MDEgQU0iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJEYXRlU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgRGF0ZXRpbWUgYmVpbmcgaW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYWxsb3dhYmxlIHJhbmdlIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJEYXRlIG9mIDAxLzAxLzE5NjkgMDE6MDEgQU0gcmVzdWx0cyBpbiBuZWdhdGl2ZSAiCisgICAgICAgICAgICAgICAgICAgICsgIm1pbGxpc2Vjb25kcyB2YWx1ZSByZWxhdGl2ZSB0byBlcG9jaCAoSmFudWFyeSAxLCAiCisgICAgICAgICAgICAgICAgICAgICsgIjE5NzAsIDAwOjAwOjAwIEdNVCkuIiwgYmUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBzID0gKERhdGVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICBzLnNldERhdGV0aW1lKCJ0aGlzIGlzIG5vdCBhIGRhdGUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJEYXRlU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgRGF0ZXRpbWUgYmVpbmcgaW4gYSAiCisgICAgICAgICAgICAgICAgICAgICsgInZhbGlkIGZvcm1hdCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRGF0ZSBvZiB0aGlzIGlzIG5vdCBhIGRhdGUiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgQ2Fubm90IGJlIHBhcnNlZCBjb3JyZWN0bHkuIEl0IHNob3VsZCBiZSBpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBNTS9ERC9ZWVlZIEhIOk1NIEFNX1BNIGZvcm1hdC4iLCBiZTMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSAoRGF0ZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgcGFyYW0uc2V0TmFtZSgiZ2FyYmFnZSBpbiIpOworICAgICAgICBwYXJhbS5zZXRWYWx1ZSgiZ2FyYmFnZSBvdXQiKTsKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0gbmV3IFBhcmFtZXRlclsxXTsKKyAgICAgICAgcGFyYW1zWzBdID0gcGFyYW07CisgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcy5pc1NlbGVjdGVkKGJhc2VkaXIsZmlsZW5hbWVzWzBdLGZpbGVzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIkRhdGVTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciB2YWxpZCBwYXJhbWV0ZXIgZWxlbWVudCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTQpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBwYXJhbWV0ZXIgZ2FyYmFnZSBpbiIsIGJlNC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcyA9IChEYXRlU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7CisgICAgICAgIHBhcmFtLnNldE5hbWUoIm1pbGxpcyIpOworICAgICAgICBwYXJhbS5zZXRWYWx1ZSgiZ2FyYmFnZSBvdXQiKTsKKyAgICAgICAgcGFyYW1zWzBdID0gcGFyYW07CisgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcy5pc1NlbGVjdGVkKGJhc2VkaXIsZmlsZW5hbWVzWzBdLGZpbGVzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIkRhdGVTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciB2YWxpZCBtaWxsaXMgcGFyYW1ldGVyIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlNSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIG1pbGxpc2Vjb25kIHNldHRpbmcgZ2FyYmFnZSBvdXQiLAorICAgICAgICAgICAgICAgICAgICBiZTUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSAoRGF0ZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOworICAgICAgICBwYXJhbS5zZXROYW1lKCJncmFudWxhcml0eSIpOworICAgICAgICBwYXJhbS5zZXRWYWx1ZSgiZ2FyYmFnZSBvdXQiKTsKKyAgICAgICAgcGFyYW1zWzBdID0gcGFyYW07CisgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcy5pc1NlbGVjdGVkKGJhc2VkaXIsZmlsZW5hbWVzWzBdLGZpbGVzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIkRhdGVTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciB2YWxpZCBncmFudWxhcml0eSBwYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmU2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgZ3JhbnVsYXJpdHkgc2V0dGluZyBnYXJiYWdlIG91dCIsCisgICAgICAgICAgICAgICAgICAgIGJlNi5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VsZWN0b3IgaXMgc2VsZWN0aW5nIGZpbGVzIGNvcnJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyKCkgeworICAgICAgICBEYXRlU2VsZWN0b3IgczsKKyAgICAgICAgU3RyaW5nIHJlc3VsdHM7CisKKyAgICAgICAgRGF0ZVNlbGVjdG9yLlRpbWVDb21wYXJpc29ucyBiZWZvcmUgPSBuZXcKKyAgICAgICAgICAgICAgICBEYXRlU2VsZWN0b3IuVGltZUNvbXBhcmlzb25zKCk7CisgICAgICAgIGJlZm9yZS5zZXRWYWx1ZSgiYmVmb3JlIik7CisgICAgICAgIERhdGVTZWxlY3Rvci5UaW1lQ29tcGFyaXNvbnMgZXF1YWwgPSBuZXcKKyAgICAgICAgICAgICAgICBEYXRlU2VsZWN0b3IuVGltZUNvbXBhcmlzb25zKCk7CisgICAgICAgIGVxdWFsLnNldFZhbHVlKCJlcXVhbCIpOworICAgICAgICBEYXRlU2VsZWN0b3IuVGltZUNvbXBhcmlzb25zIGFmdGVyID0gbmV3CisgICAgICAgICAgICAgICAgRGF0ZVNlbGVjdG9yLlRpbWVDb21wYXJpc29ucygpOworICAgICAgICBhZnRlci5zZXRWYWx1ZSgiYWZ0ZXIiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFrZUJlZCgpOworCisgICAgICAgICAgICBzID0gKERhdGVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXREYXRldGltZSgiMTAvMTAvMTk5OSAxOjQ1IFBNIik7CisgICAgICAgICAgICBzLnNldFdoZW4oYmVmb3JlKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGRkZGRkZGVCIsIHJlc3VsdHMpOworCisgICAgICAgICAgICBzID0gKERhdGVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXREYXRldGltZSgiMTAvMTAvMTk5OSAxOjQ1IFBNIik7CisgICAgICAgICAgICBzLnNldFdoZW4oYmVmb3JlKTsKKyAgICAgICAgICAgIHMuc2V0Q2hlY2tkaXJzKHRydWUpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZGRkZGRkZGIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoRGF0ZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldERhdGV0aW1lKCIxMC8xMC8xOTk5IDE6NDUgUE0iKTsKKyAgICAgICAgICAgIHMuc2V0V2hlbihhZnRlcik7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChEYXRlU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0RGF0ZXRpbWUoIjExLzIxLzIwMDEgNDo1NCBBTSIpOworICAgICAgICAgICAgcy5zZXRXaGVuKGJlZm9yZSk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURlRGRkZGRkZGRlQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChEYXRlU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0RGF0ZXRpbWUoIjExLzIxLzIwMDEgNDo1NSBBTSIpOworICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpOworICAgICAgICAgICAgRGF0ZSBkID0gZm9ybWF0dGVyLnBhcnNlKCIxMS8yMS8yMDAxIDQ6NTUgQU0iLG5ldyBQYXJzZVBvc2l0aW9uKDApKTsKKworICAgICAgICAgICAgbG9uZyBtaWxsaXNlY29uZHMgPSBzLmdldE1pbGxpcygpOworICAgICAgICAgICAgcy5zZXRXaGVuKGVxdWFsKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRURkZURkZGVFRUVCIsIHJlc3VsdHMpOworCisgICAgICAgICAgICBzID0gKERhdGVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXRNaWxsaXMobWlsbGlzZWNvbmRzKTsKKyAgICAgICAgICAgIHMuc2V0V2hlbihlcXVhbCk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVEZGVEZGRlRUVFQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChEYXRlU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0RGF0ZXRpbWUoIjExLzIxLzIwMDEgNDo1NiBBTSIpOworICAgICAgICAgICAgcy5zZXRXaGVuKGFmdGVyKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRlRGVFRURkZGVCIsIHJlc3VsdHMpOworCisgICAgICAgICAgICBzID0gKERhdGVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtMSA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbTIgPSBuZXcgUGFyYW1ldGVyKCk7CisgICAgICAgICAgICBwYXJhbTEuc2V0TmFtZSgiZGF0ZXRpbWUiKTsKKyAgICAgICAgICAgIHBhcmFtMS5zZXRWYWx1ZSgiMTEvMjEvMjAwMSA0OjU2IEFNIik7CisgICAgICAgICAgICBwYXJhbTIuc2V0TmFtZSgid2hlbiIpOworICAgICAgICAgICAgcGFyYW0yLnNldFZhbHVlKCJhZnRlciIpOworICAgICAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0ge3BhcmFtMSxwYXJhbTJ9OworICAgICAgICAgICAgcy5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZURlRUVEZGRlQiLCByZXN1bHRzKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFrZU1pcnJvcigpOworCisgICAgICAgICAgICAgICAgcyA9IChEYXRlU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBsb25nIHRlc3R0aW1lID0gbWlycm9yZmlsZXNbNV0ubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgcy5zZXRNaWxsaXModGVzdHRpbWUpOworICAgICAgICAgICAgICAgIHMuc2V0V2hlbihhZnRlcik7CisgICAgICAgICAgICAgICAgcy5zZXRHcmFudWxhcml0eSgyKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzID0gbWlycm9yU2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVEZGRkZUVFRUVFRUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgICAgICBzID0gKERhdGVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIHRlc3R0aW1lID0gbWlycm9yZmlsZXNbNl0ubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgcy5zZXRNaWxsaXModGVzdHRpbWUpOworICAgICAgICAgICAgICAgIHMuc2V0V2hlbihiZWZvcmUpOworICAgICAgICAgICAgICAgIHMuc2V0R3JhbnVsYXJpdHkoMik7CisgICAgICAgICAgICAgICAgcmVzdWx0cyA9IG1pcnJvclNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVFRUVFRGRkZGVCIsIHJlc3VsdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xlYW51cE1pcnJvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBjbGVhbnVwQmVkKCk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXBlbmRTZWxlY3RvclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwZW5kU2VsZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjOWU4OQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwZW5kU2VsZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworCisvKioKKyAqIFRlc3RzIERlcGVuZCBTZWxlY3RvcnMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEZXBlbmRTZWxlY3RvclRlc3QgZXh0ZW5kcyBCYXNlU2VsZWN0b3JUZXN0IHsKKworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgcHVibGljIERlcGVuZFNlbGVjdG9yVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmcm9tIGJhc2UgY2xhc3MuIFRoaXMgaXMgb3ZlcnJpZGVuIGluIGNoaWxkCisgICAgICogY2xhc3NlcyB0byByZXR1cm4gYSBzcGVjaWZpYyBTZWxlY3RvciBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzZVNlbGVjdG9yIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IERlcGVuZFNlbGVjdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgY29kZSB0aGF0IHZhbGlkYXRlcyB0aGUgc2VsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgeworICAgICAgICBEZXBlbmRTZWxlY3RvciBzID0gKERlcGVuZFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLmNyZWF0ZU1hcHBlcigpOworICAgICAgICAgICAgcy5jcmVhdGVNYXBwZXIoKTsKKyAgICAgICAgICAgIGZhaWwoIkRlcGVuZFNlbGVjdG9yIGFsbG93ZWQgbW9yZSB0aGFuIG9uZSBuZXN0ZWQgbWFwcGVyLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciIsCisgICAgICAgICAgICAgICAgICAgIGJlMS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcyA9IChEZXBlbmRTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcy5pc1NlbGVjdGVkKGJhc2VkaXIsZmlsZW5hbWVzWzBdLGZpbGVzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIkRlcGVuZFNlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHRhcmdldGRpciBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgYmUyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWxlY3RvciBpcyBzZWxlY3RpbmcgZmlsZXMgY29ycmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXIoKSB7CisgICAgICAgIERlcGVuZFNlbGVjdG9yIHM7CisgICAgICAgIFN0cmluZyByZXN1bHRzOworICAgICAgICBGaWxlIHN1YmRpcjsKKyAgICAgICAgTWFwcGVyIG07CisgICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIGlkZW50aXR5ID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CisgICAgICAgIGlkZW50aXR5LnNldFZhbHVlKCJpZGVudGl0eSIpOworICAgICAgICBNYXBwZXIuTWFwcGVyVHlwZSBnbG9iID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CisgICAgICAgIGdsb2Iuc2V0VmFsdWUoImdsb2IiKTsKKyAgICAgICAgTWFwcGVyLk1hcHBlclR5cGUgbWVyZ2UgPSBuZXcgTWFwcGVyLk1hcHBlclR5cGUoKTsKKyAgICAgICAgbWVyZ2Uuc2V0VmFsdWUoIm1lcmdlIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ha2VCZWQoKTsKKworICAgICAgICAgICAgcyA9IChEZXBlbmRTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXRUYXJnZXRkaXIoYmVkZGlyKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZGRkZGRkZGRkZGRiIsIHJlc3VsdHMpOworCisgICAgICAgICAgICBzID0gKERlcGVuZFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldFRhcmdldGRpcihiZWRkaXIpOworICAgICAgICAgICAgbSA9IHMuY3JlYXRlTWFwcGVyKCk7CisgICAgICAgICAgICBtLnNldFR5cGUoaWRlbnRpdHkpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZGRkZGRkZGIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoRGVwZW5kU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKGJlZGRpcik7CisgICAgICAgICAgICBtID0gcy5jcmVhdGVNYXBwZXIoKTsKKyAgICAgICAgICAgIG0uc2V0VHlwZShtZXJnZSk7CisgICAgICAgICAgICBtLnNldFRvKCJhc2YtbG9nby5naWYuZ3oiKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGVFRURkZGIiwgcmVzdWx0cy5zdWJzdHJpbmcoMCwxMSkpOworCisgICAgICAgICAgICBzID0gKERlcGVuZFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldFRhcmdldGRpcihiZWRkaXIpOworICAgICAgICAgICAgbSA9IHMuY3JlYXRlTWFwcGVyKCk7CisgICAgICAgICAgICBtLnNldFR5cGUobWVyZ2UpOworICAgICAgICAgICAgbS5zZXRUbygiYXNmLWxvZ28uZ2lmLmJ6MiIpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVFRGVFRUVFRUVFRUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIC8vIFRlc3QgZm9yIHBhdGggcmVsYXRpdmUgdG8gcHJvamVjdCBiYXNlIGRpcmVjdG9yeQorICAgICAgICAgICAgcyA9IChEZXBlbmRTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgc3ViZGlyID0gbmV3IEZpbGUoInNlbGVjdG9ydGVzdC90YXIvYnoyIik7CisgICAgICAgICAgICBzLnNldFRhcmdldGRpcihzdWJkaXIpOworICAgICAgICAgICAgbSA9IHMuY3JlYXRlTWFwcGVyKCk7CisgICAgICAgICAgICBtLnNldFR5cGUoZ2xvYik7CisgICAgICAgICAgICBtLnNldEZyb20oIiouYnoyIik7CisgICAgICAgICAgICBtLnNldFRvKCIqLnRhci5iejIiKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZGVEZGRkZGRlRURiIsIHJlc3VsdHMpOworCisgICAgICAgICAgICBzID0gKERlcGVuZFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzdWJkaXIgPSBuZXcgRmlsZShiZWRkaXIsInRhci9iejIiKTsKKyAgICAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKHN1YmRpcik7CisgICAgICAgICAgICBtID0gcy5jcmVhdGVNYXBwZXIoKTsKKyAgICAgICAgICAgIG0uc2V0VHlwZShnbG9iKTsKKyAgICAgICAgICAgIG0uc2V0RnJvbSgiKi5iejIiKTsKKyAgICAgICAgICAgIG0uc2V0VG8oIioudGFyLmJ6MiIpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZGRkZGVFRGIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFrZU1pcnJvcigpOworCisgICAgICAgICAgICAgICAgcyA9IChEZXBlbmRTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIEZpbGUgdGVzdGRpciA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgic2VsZWN0b3J0ZXN0MiIpOworICAgICAgICAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKHRlc3RkaXIpOworICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZUVEZGRkZGRkYiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgICAgIHMgPSAoRGVwZW5kU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICB0ZXN0ZGlyID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJzZWxlY3RvcnRlc3QyL3Rhci9iejIiKTsKKyAgICAgICAgICAgICAgICBzLnNldFRhcmdldGRpcih0ZXN0ZGlyKTsKKyAgICAgICAgICAgICAgICBtID0gcy5jcmVhdGVNYXBwZXIoKTsKKyAgICAgICAgICAgICAgICBtLnNldFR5cGUoZ2xvYik7CisgICAgICAgICAgICAgICAgbS5zZXRGcm9tKCIqLmJ6MiIpOworICAgICAgICAgICAgICAgIG0uc2V0VG8oIioudGFyLmJ6MiIpOworICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBtaXJyb3JTZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZUVEYiLCByZXN1bHRzKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZGRkZGVFRGIiwgcmVzdWx0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbGVhbnVwTWlycm9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsZWFudXBCZWQoKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RlcHRoU2VsZWN0b3JUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RlcHRoU2VsZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMjYwZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwdGhTZWxlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworCisvKioKKyAqIFRlc3RzIERlcHRoIFNlbGVjdG9ycworICoKKyAqLworcHVibGljIGNsYXNzIERlcHRoU2VsZWN0b3JUZXN0IGV4dGVuZHMgQmFzZVNlbGVjdG9yVGVzdCB7CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIHB1YmxpYyBEZXB0aFNlbGVjdG9yVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmcm9tIGJhc2UgY2xhc3MuIFRoaXMgaXMgb3ZlcnJpZGVuIGluIGNoaWxkCisgICAgICogY2xhc3NlcyB0byByZXR1cm4gYSBzcGVjaWZpYyBTZWxlY3RvciBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzZVNlbGVjdG9yIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IERlcHRoU2VsZWN0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBjb2RlIHRoYXQgdmFsaWRhdGVzIHRoZSBzZWxlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUoKSB7CisgICAgICAgIERlcHRoU2VsZWN0b3IgcyA9IChEZXB0aFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLmlzU2VsZWN0ZWQoYmFzZWRpcixmaWxlbmFtZXNbMF0sZmlsZXNbMF0pOworICAgICAgICAgICAgZmFpbCgiRGVwdGhTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IHNldCBhdCBsZWFzdCBvbmUgb2YgdGhlIG1pbiBvciB0aGUgIiArCisgICAgICAgICAgICAgICAgICAgICJtYXggbGV2ZWxzLiIsIGJlMS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcyA9IChEZXB0aFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIHMuc2V0TWluKDUpOworICAgICAgICBzLnNldE1heCgyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJEZXB0aFNlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIG1heGltdW0gYmVpbmcgaGlnaGVyICIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhhbiBtaW5pbXVtIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgbWF4aW11bSBkZXB0aCBpcyBsb3dlciB0aGFuIHRoZSBtaW5pbXVtLiIsCisgICAgICAgICAgICAgICAgICAgIGJlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcyA9IChEZXB0aFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgcGFyYW0uc2V0TmFtZSgiZ2FyYmFnZSBpbiIpOworICAgICAgICBwYXJhbS5zZXRWYWx1ZSgiZ2FyYmFnZSBvdXQiKTsKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0gbmV3IFBhcmFtZXRlclsxXTsKKyAgICAgICAgcGFyYW1zWzBdID0gcGFyYW07CisgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcy5pc1NlbGVjdGVkKGJhc2VkaXIsZmlsZW5hbWVzWzBdLGZpbGVzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIkRlcHRoU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgdmFsaWQgcGFyYW1ldGVyIGVsZW1lbnQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgcGFyYW1ldGVyIGdhcmJhZ2UgaW4iLCBiZTMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSAoRGVwdGhTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgcGFyYW0uc2V0TmFtZSgibWluIik7CisgICAgICAgIHBhcmFtLnNldFZhbHVlKCJnYXJiYWdlIG91dCIpOworICAgICAgICBwYXJhbXNbMF0gPSBwYXJhbTsKKyAgICAgICAgcy5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLmlzU2VsZWN0ZWQoYmFzZWRpcixmaWxlbmFtZXNbMF0sZmlsZXNbMF0pOworICAgICAgICAgICAgZmFpbCgiRGVwdGhTZWxlY3RvciBhY2NlcHRlZCBiYWQgbWluaW11bSBhcyBwYXJhbWV0ZXIiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmU0KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgbWluaW11bSB2YWx1ZSBnYXJiYWdlIG91dCIsCisgICAgICAgICAgICAgICAgICAgIGJlNC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcyA9IChEZXB0aFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOworICAgICAgICBwYXJhbS5zZXROYW1lKCJtYXgiKTsKKyAgICAgICAgcGFyYW0uc2V0VmFsdWUoImdhcmJhZ2Ugb3V0Iik7CisgICAgICAgIHBhcmFtc1swXSA9IHBhcmFtOworICAgICAgICBzLnNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJEZXB0aFNlbGVjdG9yIGFjY2VwdGVkIGJhZCBtYXhpbXVtIGFzIHBhcmFtZXRlciIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBtYXhpbXVtIHZhbHVlIGdhcmJhZ2Ugb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgYmU1LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWxlY3RvciBpcyBzZWxlY3RpbmcgZmlsZXMgY29ycmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXIoKSB7CisgICAgICAgIERlcHRoU2VsZWN0b3IgczsKKyAgICAgICAgU3RyaW5nIHJlc3VsdHM7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ha2VCZWQoKTsKKworICAgICAgICAgICAgcyA9IChEZXB0aFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldE1pbigyMCk7CisgICAgICAgICAgICBzLnNldE1heCgyNSk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZGRkYiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChEZXB0aFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldE1pbigwKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVFRUVFRUVFRUVCIsIHJlc3VsdHMpOworCisgICAgICAgICAgICBzID0gKERlcHRoU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0TWluKDEpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZUVFRUVFRUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoRGVwdGhTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXRNYXgoMCk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVEZGRkZGRkYiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChEZXB0aFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldE1pbigxKTsKKyAgICAgICAgICAgIHMuc2V0TWF4KDEpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZUVFRGRkZUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsZWFudXBCZWQoKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0ZpbGVuYW1lU2VsZWN0b3JUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0ZpbGVuYW1lU2VsZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4M2Q2MwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRmlsZW5hbWVTZWxlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOworCisvKioKKyAqIFRlc3RzIEZpbGVuYW1lIFNlbGVjdG9ycworICoKKyAqLworcHVibGljIGNsYXNzIEZpbGVuYW1lU2VsZWN0b3JUZXN0IGV4dGVuZHMgQmFzZVNlbGVjdG9yVGVzdCB7CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIHB1YmxpYyBGaWxlbmFtZVNlbGVjdG9yVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmcm9tIGJhc2UgY2xhc3MuIFRoaXMgaXMgb3ZlcnJpZGVuIGluIGNoaWxkCisgICAgICogY2xhc3NlcyB0byByZXR1cm4gYSBzcGVjaWZpYyBTZWxlY3RvciBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzZVNlbGVjdG9yIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGVuYW1lU2VsZWN0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBjb2RlIHRoYXQgdmFsaWRhdGVzIHRoZSBzZWxlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUoKSB7CisgICAgICAgIEZpbGVuYW1lU2VsZWN0b3IgcyA9IChGaWxlbmFtZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLmlzU2VsZWN0ZWQoYmFzZWRpcixmaWxlbmFtZXNbMF0sZmlsZXNbMF0pOworICAgICAgICAgICAgZmFpbCgiRmlsZW5hbWVTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGJlMS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcyA9IChGaWxlbmFtZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgcGFyYW0uc2V0TmFtZSgiZ2FyYmFnZSBpbiIpOworICAgICAgICBwYXJhbS5zZXRWYWx1ZSgiZ2FyYmFnZSBvdXQiKTsKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0ge3BhcmFtfTsKKyAgICAgICAgcy5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLmlzU2VsZWN0ZWQoYmFzZWRpcixmaWxlbmFtZXNbMF0sZmlsZXNbMF0pOworICAgICAgICAgICAgZmFpbCgiRmlsZW5hbWVTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciB2YWxpZCBwYXJhbWV0ZXIgZWxlbWVudCIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBwYXJhbWV0ZXIgZ2FyYmFnZSBpbiIsIGJlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VsZWN0b3IgaXMgc2VsZWN0aW5nIGZpbGVzIGNvcnJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyKCkgeworICAgICAgICBGaWxlbmFtZVNlbGVjdG9yIHM7CisgICAgICAgIFN0cmluZyByZXN1bHRzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYWtlQmVkKCk7CisKKyAgICAgICAgICAgIHMgPSAoRmlsZW5hbWVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXROYW1lKCJubyBtYXRjaCBwb3NzaWJsZSIpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZGRkZGRkZGIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoRmlsZW5hbWVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXROYW1lKCIqLmd6Iik7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgLy8gVGhpcyBpcyB0dXJuZWQgb2ZmIHRlbXBvcmFyaWx5LiBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnCisgICAgICAgICAgICAvLyBpbiBTZWxlY3RvclV0aWxzLm1hdGNoUGF0dGVybigpIHdoZXJlIGl0IGlzIHJlY3Vyc2l2ZSBvbgorICAgICAgICAgICAgLy8gV2luZG93cyBldmVuIGlmIG5vICoqIGlzIGluIHBhdHRlcm4uCisgICAgICAgICAgICAvL2Fzc2VydEVxdWFscygiRkZGVEZGRkZGRkZGIiwgcmVzdWx0cyk7IC8vIFVuaXgKKyAgICAgICAgICAgIC8vIHZzCisgICAgICAgICAgICAvL2Fzc2VydEVxdWFscygiRkZGVEZGRkZURkZGIiwgcmVzdWx0cyk7IC8vIFdpbmRvd3MKKworICAgICAgICAgICAgcyA9IChGaWxlbmFtZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldE5hbWUoIioqLyouZ3oiKTsKKyAgICAgICAgICAgIHMuc2V0TmVnYXRlKHRydWUpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVFRURlRUVEZGVFRUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoRmlsZW5hbWVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXROYW1lKCIqKi8qLkdaIik7CisgICAgICAgICAgICBzLnNldENhc2VzZW5zaXRpdmUoZmFsc2UpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZGVEZGRlRURkZGIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoRmlsZW5hbWVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtMSA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgIHBhcmFtMS5zZXROYW1lKCJuYW1lIik7CisgICAgICAgICAgICBwYXJhbTEuc2V0VmFsdWUoIioqLyouYnoyIik7CisgICAgICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSB7cGFyYW0xfTsKKyAgICAgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZURkZGRkZGVFRGIiwgcmVzdWx0cyk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsZWFudXBCZWQoKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01vY2tBbGdvcml0aG0uamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9ja0FsZ29yaXRobS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGM4M2YKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01vY2tBbGdvcml0aG0uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3IuQWxnb3JpdGhtOworCitwdWJsaWMgY2xhc3MgTW9ja0FsZ29yaXRobSBpbXBsZW1lbnRzIEFsZ29yaXRobSB7CisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShGaWxlIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuICJURVNUIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk1vY2tBbGdvcml0aG1AIiArIGhhc2hDb2RlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Nb2NrQ2FjaGUuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9ja0NhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlYTY5ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9ja0NhY2hlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLkNhY2hlOworCitwdWJsaWMgY2xhc3MgTW9ja0NhY2hlIGltcGxlbWVudHMgQ2FjaGUgeworCisgICAgcHVibGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzYXZlZCA9IGZhbHNlOworCisKKyAgICBwdWJsaWMgTW9ja0NhY2hlKCkgeworICAgICAgICBsb2coIigpIik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgbG9nKCIuaXNWYWxpZCgpIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7CisgICAgICAgIGxvZygiLmRlbGV0ZSgpIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7CisgICAgICAgIGxvZygiLmxvYWQoKSIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzYXZlKCkgeworICAgICAgICBsb2coIi5zYXZlKCkiKTsKKyAgICAgICAgc2F2ZWQgPSB0cnVlOworICAgIH0KKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgIGxvZygiLmdldCgiK2tleSsiKSIpOworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGxvZygiLnB1dCgiK2tleSsiLCAiK3ZhbHVlKyIpIik7CisgICAgICAgIHNhdmVkID0gZmFsc2U7CisgICAgfQorICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgbG9nKCJpdGVyYXRvcigpIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk1vY2tDYWNoZUAiICsgaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4odGhpcyttc2cpOworICAgIH0KK30vL2NsYXNzLU1vY2tDYWNoZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Nb2NrQ29tcGFyYXRvci5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Nb2NrQ29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzE1NTMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01vY2tDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitwdWJsaWMgY2xhc3MgTW9ja0NvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKKworICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk1vY2tDb21wYXJhdG9yIjsKKyAgICB9Cit9Ly9jbGFzcy1Nb2NrQ2FjaGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9kaWZpZWRTZWxlY3RvclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9kaWZpZWRTZWxlY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI2NWVjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Nb2RpZmllZFNlbGVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAxNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworCisvLyBKYXZhCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudGV4dC5SdWxlQmFzZWRDb2xsYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLkFsZ29yaXRobTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5DYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5DaGVja3N1bUFsZ29yaXRobTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5EaWdlc3RBbGdvcml0aG07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3IuRXF1YWxDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLkhhc2h2YWx1ZUFsZ29yaXRobTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLlByb3BlcnRpZXNmaWxlQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CisKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciBNb2RpZmllZFNlbGVjdG9yLgorICoKKyAqIEBzaW5jZSAgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgTW9kaWZpZWRTZWxlY3RvclRlc3QgZXh0ZW5kcyBCYXNlU2VsZWN0b3JUZXN0IHsKKworICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKKyAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09ICBhdHRyaWJ1dGVzICA9PT09PT09PT09PT09PT09PT09PT0KKworCisgICAgLyoqIFBhY2thZ2Ugb2YgdGhlIENhY2hlU2VsZWN0b3IgY2xhc3Nlcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGtnID0gIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yIjsKKworICAgIC8qKiBQYXRoIHdoZXJlIHRoZSB0ZXN0Y2xhc3NlcyBhcmUuICovCisgICAgcHJpdmF0ZSBQYXRoIHRlc3RjbGFzc2VzID0gbnVsbDsKKworCisgICAgLy8gID09PT09PT09PT09PT09PT09PT09PSAgY29uc3RydWN0b3JzLCBmYWN0b3JpZXMgID09PT09PT09PT09PT09PT09PT09PQorCisKKyAgICBwdWJsaWMgTW9kaWZpZWRTZWxlY3RvclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCBmcm9tIGJhc2UgY2xhc3MuIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRlbiBpbiBjaGlsZAorICAgICAqIGNsYXNzZXMgdG8gcmV0dXJuIGEgc3BlY2lmaWMgU2VsZWN0b3IgY2xhc3MgKGxpa2UgaGVyZSkuCisgICAgICovCisgICAgcHVibGljIEJhc2VTZWxlY3RvciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNb2RpZmllZFNlbGVjdG9yKCk7CisgICAgfQorCisKKyAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09ICBKVW5pdCBzdHVmZiAgPT09PT09PT09PT09PT09PT09PT09CisKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAvLyBwcm9qZWN0IHJlZmVyZW5jZSBpcyBzZXQgaW4gc3VwZXIuc2V0VXAoKQorICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICAvLyBpbml0IHRoZSB0ZXN0Y2xhc3NlcyBwYXRoIG9iamVjdAorICAgICAgICBQcm9qZWN0IHByaiA9IGdldFByb2plY3QoKTsKKyAgICAgICAgaWYgKHByaiAhPSBudWxsKSB7CisgICAgICAgICAgICB0ZXN0Y2xhc3NlcyA9IG5ldyBQYXRoKHByaiwgcHJqLmdldFByb3BlcnR5KCJidWlsZC50ZXN0cy52YWx1ZSIpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogKiAvCisgICAgLy8gZm9yIHRlc3Qgb25seSAtIGlnbm9yZSB0ZXN0cyB3aGVyZSB3ZSBhcmVudCB3b3JrIGF0IHRoZSBtb21lbnQKKyAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgeworICAgICAgICBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlIHN1aXRlPSBuZXcganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZSgpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBNb2RpZmllZFNlbGVjdG9yVGVzdCgidGVzdFZhbGlkYXRlV3JvbmdDYWNoZSIpKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KKyAgICAvKiAqLworCisKKyAgICAvLyA9PT09PT09ICB0ZXN0Y2FzZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgb2YgdGhlIHNlbGVjdG9yICA9PT09PQorCisKKyAgICAvKiogVGVzdCByaWdodCB1c2Ugb2YgY2FjaGUgbmFtZXMuICovCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlV3JvbmdDYWNoZSgpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAidGhpcy1pcy1ub3QtYS12YWxpZC1jYWNoZS1uYW1lIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1vZGlmaWVkU2VsZWN0b3IuQ2FjaGVOYW1lIGNhY2hlTmFtZSA9IG5ldyBNb2RpZmllZFNlbGVjdG9yLkNhY2hlTmFtZSgpOworICAgICAgICAgICAgY2FjaGVOYW1lLnNldFZhbHVlKG5hbWUpOworICAgICAgICAgICAgZmFpbCgiQ2FjaGVTZWxlY3Rvci5DYWNoZU5hbWUgYWNjZXB0ZWQgaW52YWxpZCB2YWx1ZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKiBUZXN0IHJpZ2h0IHVzZSBvZiBjYWNoZSBuYW1lcy4gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVXcm9uZ0FsZ29yaXRobSgpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAidGhpcy1pcy1ub3QtYS12YWxpZC1hbGdvcml0aG0tbmFtZSI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNb2RpZmllZFNlbGVjdG9yLkFsZ29yaXRobU5hbWUgYWxnb05hbWUKKyAgICAgICAgICAgICAgICA9IG5ldyBNb2RpZmllZFNlbGVjdG9yLkFsZ29yaXRobU5hbWUoKTsKKyAgICAgICAgICAgIGFsZ29OYW1lLnNldFZhbHVlKG5hbWUpOworICAgICAgICAgICAgZmFpbCgiQ2FjaGVTZWxlY3Rvci5BbGdvcml0aG1OYW1lIGFjY2VwdGVkIGludmFsaWQgdmFsdWUuIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSArICIgaXMgbm90IGEgbGVnYWwgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiogVGVzdCByaWdodCB1c2Ugb2YgY29tcGFyYXRvciBuYW1lcy4gKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVXcm9uZ0NvbXBhcmF0b3IoKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gInRoaXMtaXMtbm90LWEtdmFsaWQtY29tcGFyYXRvci1uYW1lIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1vZGlmaWVkU2VsZWN0b3IuQ29tcGFyYXRvck5hbWUgY29tcE5hbWUKKyAgICAgICAgICAgICAgICA9IG5ldyBNb2RpZmllZFNlbGVjdG9yLkNvbXBhcmF0b3JOYW1lKCk7CisgICAgICAgICAgICBjb21wTmFtZS5zZXRWYWx1ZShuYW1lKTsKKyAgICAgICAgICAgIGZhaWwoIk1vZGlmaWVkU2VsZWN0b3IuQ29tcGFyYXRvck5hbWUgYWNjZXB0ZWQgaW52YWxpZCB2YWx1ZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQ3VzdG9tQWxnb3JpdGhtKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0QWxnb05hbWUoImphdmEubGFuZy5PYmplY3QiKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWwgY2xhc3NuYW1lIHVzZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBleGNlcHRpb24gdHlwZTogIiArIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGUgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGV4Y2VwdGlvbiBtZXNzYWdlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlNwZWNpZmllZCBjbGFzcyAoamF2YS5sYW5nLk9iamVjdCkgaXMgbm90IGFuIEFsZ29yaXRobS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRXhpc3RlbnRDdXN0b21BbGdvcml0aG0oKSB7CisgICAgICAgIGJvb2xlYW4gbm9FeGNUaHJvd24gPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldEFsZ29OYW1lKCJub24uZXhpc3RlbnQuY3VzdG9tLkFsZ29yaXRobSIpOworICAgICAgICAgICAgbm9FeGNUaHJvd24gPSB0cnVlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG5vRXhjVGhyb3duKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiZG9lcyAnbm9uLmV4aXN0ZW50LmN1c3RvbS5BbGdvcml0aG0nIHJlYWxseSBleGlzdD8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIGV4Y2VwdGlvbiB0eXBlOiAiICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSwgZSBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZXhjZXB0aW9uIG1lc3NhZ2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWVkIGNsYXNzIChub24uZXhpc3RlbnQuY3VzdG9tLkFsZ29yaXRobSkgbm90IGZvdW5kLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21BbGdvcml0aG0oKSB7CisgICAgICAgIFN0cmluZyBhbGdvID0gZ2V0QWxnb05hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLkhhc2h2YWx1ZUFsZ29yaXRobSIpOworICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBhbGdvcml0aG0gdXNlZDogIithbGdvLCBhbGdvLnN0YXJ0c1dpdGgoIkhhc2h2YWx1ZUFsZ29yaXRobSIpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21BbGdvcml0aG0yKCkgeworICAgICAgICBTdHJpbmcgYWxnbyA9IGdldEFsZ29OYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuTW9ja0FsZ29yaXRobSIpOworICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBhbGdvcml0aG0gdXNlZDogIithbGdvLCBhbGdvLnN0YXJ0c1dpdGgoIk1vY2tBbGdvcml0aG0iKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ2xhc3NlcygpIHsKKyAgICAgICAgQkZUIGJmdCA9IG5ldyBCRlQoKTsKKyAgICAgICAgYmZ0LnNldFVwKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBkbyB0aGUgYWN0aW9ucworICAgICAgICAgICAgYmZ0LmRvVGFyZ2V0KCJtb2RpZmllZHNlbGVjdG9ydGVzdC1jdXN0b21DbGFzc2VzIik7CisgICAgICAgICAgICAvLyBkbyB0aGUgY2hlY2tzIC0gdGhlIGJ1aWxkZmlsZSBzdG9yZXMgdGhlIGZpbGVzZXQgYXMgcHJvcGVydHkKKyAgICAgICAgICAgIFN0cmluZyBmc0Z1bGxWYWx1ZSA9IGJmdC5nZXRQcm9wZXJ0eSgiZnMuZnVsbC52YWx1ZSIpOworICAgICAgICAgICAgU3RyaW5nIGZzTW9kVmFsdWUgID0gYmZ0LmdldFByb3BlcnR5KCJmcy5tb2QudmFsdWUiKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiJ2ZzLmZ1bGwudmFsdWUnIG11c3QgYmUgc2V0LiIsIGZzRnVsbFZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIidmcy5mdWxsLnZhbHVlJyBtdXN0IG5vdCBiZSBudWxsLiIsICEiIi5lcXVhbHMoZnNGdWxsVmFsdWUpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIidmcy5mdWxsLnZhbHVlJyBtdXN0IGNvbnRhaW4gYW50LmJhdC4iLCBmc0Z1bGxWYWx1ZS5pbmRleE9mKCJhbnQuYmF0Iik+LTEpOworCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCInZnMubW9kLnZhbHVlJyBtdXN0IGJlIHNldC4iLCBmc01vZFZhbHVlKTsKKyAgICAgICAgICAgIC8vIG11c3QgYmUgZW1wdHkgYWNjb3JkaW5nIHRvIHRoZSBNb2NrKiBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICAgICAgIGFzc2VydFRydWUoIidmcy5tb2QudmFsdWUnIG11c3QgYmUgZW1wdHkuIiwgIiIuZXF1YWxzKGZzTW9kVmFsdWUpKTsKKyAgICAgICAgLy8gZG9uJ3QgY2F0Y2ggdGhlIEpVbml0IGV4Y2VwdGlvbnMKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGJmdC5kb1RhcmdldCgibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tY2xlYW4iKTsKKyAgICAgICAgICAgIGJmdC5kZWxldGVQcm9wZXJ0aWVzZmlsZSgpOworICAgICAgICAgICAgYmZ0LnRlYXJEb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3REZWxheVVwZGF0ZVRhc2tGaW5pc2hlZCgpIHsKKyAgICAgICAgZG9EZWxheVVwZGF0ZVRlc3QoMSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsYXlVcGRhdGVUYXJnZXRGaW5pc2hlZCgpIHsKKyAgICAgICAgZG9EZWxheVVwZGF0ZVRlc3QoMik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsYXlVcGRhdGVCdWlsZEZpbmlzaGVkKCkgeworICAgICAgICBkb0RlbGF5VXBkYXRlVGVzdCgzKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGRvRGVsYXlVcGRhdGVUZXN0KGludCBraW5kKSB7CisgICAgICAgIC8vIG5vIGNoZWNrIGZvciAxPD1raW5kPD0zIC0gb25seSBpbnRlcm5hbCB1c2UgdGhlcmVmb3JlIGNoZWNrIGl0CisgICAgICAgIC8vIHdoaWxlIGRldmVsb3BtZW50CisKKyAgICAgICAgLy8gcmVhZGFibGUgZm9ybSBvZiBwYXJhbWV0ZXIga2luZAorICAgICAgICBTdHJpbmdbXSBraW5kcyA9IHsidGFzayIsICJ0YXJnZXQiLCAiYnVpbGQifTsKKworICAgICAgICAvLyBzZXR1cCB0aGUgIkFudCBwcm9qZWN0IgorICAgICAgICBNb2NrUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1vY2tQcm9qZWN0KCk7CisgICAgICAgIEZpbGUgYmFzZSAgPSBuZXcgRmlsZSgiYmFzZSIpOworICAgICAgICBGaWxlIGZpbGUxID0gbmV3IEZpbGUoImZpbGUxIik7CisgICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZSgiZmlsZTIiKTsKKworICAgICAgICAvLyBzZXR1cCB0aGUgc2VsZWN0b3IKKyAgICAgICAgTW9kaWZpZWRTZWxlY3RvciBzZWwgPSBuZXcgTW9kaWZpZWRTZWxlY3RvcigpOworICAgICAgICBzZWwuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgc2VsLnNldFVwZGF0ZSh0cnVlKTsKKyAgICAgICAgc2VsLnNldERlbGF5VXBkYXRlKHRydWUpOworICAgICAgICAvLyBzb3JyeSAtIG90aGVyd2lzZSB3ZSB3aWxsIGdldCBhIENsYXNzQ2FzdEV4Y2VwdGlvbiBiZWNhdXNlIHRoZSBNb2NrQ2FjaGUKKyAgICAgICAgLy8gaXMgbG9hZGVkIGJ5IHR3byBkaWZmZXJlbnQgY2xhc3Nsb2FkZXIgLi4uCisgICAgICAgIHNlbC5zZXRDbGFzc0xvYWRlcih0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIHNlbC5hZGRDbGFzc3BhdGgodGVzdGNsYXNzZXMpOworCisgICAgICAgIHNlbC5zZXRBbGdvcml0aG1DbGFzcygib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLk1vY2tBbGdvcml0aG0iKTsKKyAgICAgICAgc2VsLnNldENhY2hlQ2xhc3MoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5Nb2NrQ2FjaGUiKTsKKyAgICAgICAgc2VsLmNvbmZpZ3VyZSgpOworCisgICAgICAgIC8vIGdldCB0aGUgY2FjaGUsIHNvIHdlIGNhbiBjaGVjayBvdXIgdGhpbmdzCisgICAgICAgIE1vY2tDYWNoZSBjYWNoZSA9IChNb2NrQ2FjaGUpc2VsLmdldENhY2hlKCk7CisKKyAgICAgICAgLy8gdGhlIHRlc3QKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkNhY2hlIG11c3Qgbm90IGJlIHNhdmVkIGJlZm9yZSAxc3Qgc2VsZWN0aW9uLiIsIGNhY2hlLnNhdmVkKTsKKyAgICAgICAgc2VsLmlzU2VsZWN0ZWQoYmFzZSwgImZpbGUxIiwgZmlsZTEpOworICAgICAgICBhc3NlcnRGYWxzZSgiQ2FjaGUgbXVzdCBub3QgYmUgc2F2ZWQgYWZ0ZXIgMXN0IHNlbGVjdGlvbi4iLCBjYWNoZS5zYXZlZCk7CisgICAgICAgIHNlbC5pc1NlbGVjdGVkKGJhc2UsICJmaWxlMiIsIGZpbGUyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkNhY2hlIG11c3Qgbm90IGJlIHNhdmVkIGFmdGVyIDJuZCBzZWxlY3Rpb24uIiwgY2FjaGUuc2F2ZWQpOworICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IHByb2plY3QuZmlyZVRhc2tGaW5pc2hlZCgpOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogcHJvamVjdC5maXJlVGFyZ2V0RmluaXNoZWQoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOiBwcm9qZWN0LmZpcmVCdWlsZEZpbmlzaGVkKCk7ICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJDYWNoZSBtdXN0IGJlIHNhdmVkIGFmdGVyICIgKyBraW5kc1traW5kLTFdICsgIkZpbmlzaGVkLUV2ZW50LiIsIGNhY2hlLnNhdmVkKTsKKworICAgICAgICAvLyBNb2NrQ2FjaGUgZG9lc250IGNyZWF0ZSBhIGZpbGUgLSB0aGVyZWZvcmUgbm8gY2xlYW51cCBuZWVkZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIHRoZSByZWFsIHVzZWQgYWxnb3JpdGhtIG5hbWUgZnJvbSB0aGUgTW9kaWZpZWRTZWxlY3RvciB1c2luZworICAgICAqIGl0cyB0b1N0cmluZygpIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gY2xhc3NuYW1lICB0aGUgY2xhc3NuYW1lIGZyb20gdGhlIGFsZ29yaXRobSB0byB1c2UKKyAgICAgKiBAcmV0dXJuICB0aGUgYWxnb3JpdGhtIHBhcnQgZnJvbSB0aGUgdG9TdHJpbmcoKSAod2l0aG91dCBicmFja2V0cykKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRBbGdvTmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7CisgICAgICAgIE1vZGlmaWVkU2VsZWN0b3Igc2VsID0gbmV3IE1vZGlmaWVkU2VsZWN0b3IoKTsKKyAgICAgICAgLy8gYWRkIHRoZSB0ZXN0IGNsYXNzZXMgdG8gaXRzIGNsYXNzcGF0aAorICAgICAgICBzZWwuYWRkQ2xhc3NwYXRoKHRlc3RjbGFzc2VzKTsKKyAgICAgICAgc2VsLnNldEFsZ29yaXRobUNsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgIC8vIGxldCB0aGUgc2VsZWN0b3IgZG8gaXRzIGNoZWNrcworICAgICAgICBzZWwudmFsaWRhdGUoKTsKKyAgICAgICAgLy8gZXh0cmFjdCB0aGUgYWxnb3JpdGhtIG5hbWUgKGFuZCBjb25maWcpIGZyb20gdGhlIHNlbGVjdG9ycyBvdXRwdXQKKyAgICAgICAgU3RyaW5nIHMxID0gc2VsLnRvU3RyaW5nKCk7CisgICAgICAgIGludCBwb3NTdGFydCA9IHMxLmluZGV4T2YoImFsZ29yaXRobT0iKSArIDEwOworICAgICAgICBpbnQgcG9zRW5kICAgPSBzMS5pbmRleE9mKCIgY29tcGFyYXRvcj0iKTsKKyAgICAgICAgU3RyaW5nIGFsZ28gID0gczEuc3Vic3RyaW5nKHBvc1N0YXJ0LCBwb3NFbmQpOworICAgICAgICAvLyAnPCcgYW5kICc+JyBhcmUgb25seSB1c2VkIGlmIHRoZSBhbGdvcml0aG0gaGFzIHByb3BlcnRpZXMKKyAgICAgICAgaWYgKGFsZ28uc3RhcnRzV2l0aCgiPCIpKSBhbGdvID0gYWxnby5zdWJzdHJpbmcoMSk7CisgICAgICAgIGlmIChhbGdvLmVuZHNXaXRoKCI+IikpICAgYWxnbyA9IGFsZ28uc3Vic3RyaW5nKDAsIGFsZ28ubGVuZ3RoKCktMSk7CisgICAgICAgIC8vIHJldHVybiB0aGUgY2xlYW4gdmFsdWUKKyAgICAgICAgcmV0dXJuIGFsZ287CisgICAgfQorCisKKyAgICAvLyA9PT09PT09PT09PT09PT09ICB0ZXN0Y2FzZXMgZm9yIHRoZSBjYWNoZSBpbXBsZW1lbnRhdGlvbnMgID09PT09PT09PT09PT09PT0KKworCisgICAgLyoqCisgICAgICogUHJvcGVydHljYWNoZSBtdXN0IGhhdmUgYSBzZXQgJ2NhY2hlZmlsZScgYXR0cmlidXRlLgorICAgICAqIFRoZSBkZWZhdWx0IGluIE1vZGlmaWVkU2VsZWN0b3IgImNhY2hlLnByb3BlcnRpZXMiIGlzIHNldCBieSB0aGUgc2VsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFByb3BjYWNoZUludmFsaWQoKSB7CisgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IFByb3BlcnRpZXNmaWxlQ2FjaGUoKTsKKyAgICAgICAgaWYgKGNhY2hlLmlzVmFsaWQoKSkKKyAgICAgICAgICAgIGZhaWwoIlByb3BlcnR5ZmlsZXNDYWNoZSBkb2VzIG5vdCBjaGVjayBpdHMgY29uZmlndXJhdGlvbi4iKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eWZpbGVDYWNoZSgpIHsKKyAgICAgICAgUHJvcGVydGllc2ZpbGVDYWNoZSBjYWNoZSA9IG5ldyBQcm9wZXJ0aWVzZmlsZUNhY2hlKCk7CisgICAgICAgIEZpbGUgY2FjaGVmaWxlID0gbmV3IEZpbGUoImNhY2hlLnByb3BlcnRpZXMiKTsKKyAgICAgICAgY2FjaGUuc2V0Q2FjaGVmaWxlKGNhY2hlZmlsZSk7CisgICAgICAgIGRvVGVzdChjYWNoZSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJDYWNoZSBmaWxlIG5vdCBkZWxldGVkLiIsIGNhY2hlZmlsZS5leGlzdHMoKSk7CisgICAgfQorCisKKyAgICAvKiogQ2hlY2tzIHdoZXRoZXIgYSBjYWNoZSBmaWxlIGlzIGNyZWF0ZWQuICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb3BlcnRpZXNDYWNoZURpcmVjdCgpIHsKKyAgICAgICAgRmlsZSBjYWNoZWZpbGUgPSBuZXcgRmlsZShiYXNlZGlyLCAiY2FjaGVmaWxlLnByb3BlcnRpZXMiKTsKKworICAgICAgICBQcm9wZXJ0aWVzZmlsZUNhY2hlIGNhY2hlID0gbmV3IFByb3BlcnRpZXNmaWxlQ2FjaGUoKTsKKyAgICAgICAgY2FjaGUuc2V0Q2FjaGVmaWxlKGNhY2hlZmlsZSk7CisKKyAgICAgICAgY2FjaGUucHV0KCJrZXkiLCAidmFsdWUiKTsKKyAgICAgICAgY2FjaGUuc2F2ZSgpOworCisgICAgICAgIGFzc2VydFRydWUoIkNhY2hlZmlsZSBub3QgY3JlYXRlZC4iLCBjYWNoZWZpbGUuZXhpc3RzKCkpOworCisgICAgICAgIGNhY2hlLmRlbGV0ZSgpOworICAgICAgICBhc3NlcnRGYWxzZSgiQ2FjaGVmaWxlIG5vdCBkZWxldGVkLiIsIGNhY2hlZmlsZS5leGlzdHMoKSk7CisgICAgfQorCisKKyAgICAvKiogQ2hlY2tzIHdoZXRoZXIgYSBjYWNoZSBmaWxlIGlzIGNyZWF0ZWQuICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb3BlcnRpZXNDYWNoZVZpYU1vZGlmaWVkU2VsZWN0b3IoKSB7CisgICAgICAgIEZpbGUgY2FjaGVmaWxlID0gbmV3IEZpbGUoYmFzZWRpciwgImNhY2hlZmlsZS5wcm9wZXJ0aWVzIik7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGVzdCBlbnZpcm9ubWVudCAoY2FsbGVkICJiZWQiKQorICAgICAgICAgICAgbWFrZUJlZCgpOworCisgICAgICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlbGVjdG9yCisgICAgICAgICAgICBNb2RpZmllZFNlbGVjdG9yIHMgPSAoTW9kaWZpZWRTZWxlY3RvcilnZXRTZWxlY3RvcigpOworICAgICAgICAgICAgcy5zZXREZWxheVVwZGF0ZShmYWxzZSk7CisgICAgICAgICAgICBzLmFkZFBhcmFtKCJjYWNoZS5jYWNoZWZpbGUiLCBjYWNoZWZpbGUpOworCisgICAgICAgICAgICBNb2RpZmllZFNlbGVjdG9yLkNhY2hlTmFtZSBjYWNoZU5hbWUgPSBuZXcgTW9kaWZpZWRTZWxlY3Rvci5DYWNoZU5hbWUoKTsKKyAgICAgICAgICAgIGNhY2hlTmFtZS5zZXRWYWx1ZSgicHJvcGVydHlmaWxlIik7CisgICAgICAgICAgICBzLnNldENhY2hlKGNhY2hlTmFtZSk7CisKKyAgICAgICAgICAgIHMuc2V0VXBkYXRlKHRydWUpOworCisgICAgICAgICAgICBzZWxlY3Rpb25TdHJpbmcocyk7CisKKyAgICAgICAgICAgIC8vIGV2YWx1YXRlIGNvcnJlY3RuZXNzCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJDYWNoZSBmaWxlIGlzIG5vdCBjcmVhdGVkLiIsIGNhY2hlZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbGVhbnVwQmVkKCk7CisgICAgICAgICAgICBpZiAoY2FjaGVmaWxlIT1udWxsKSBjYWNoZWZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluIGVhcmxpZXIgaW1wbGVtZW50YXRpb25zIHRoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCB0aGUgPGk+b3JkZXI8L2k+CisgICAgICogb2YgdGhlIDxwYXJhbT5zLiBUaGUgc2NlbmFyaW8gd2FzIDxwcmU+CisgICAgICogICA8Y3VzdG9tIGNsYXNzPSJNb2RpZmllZFNlbGVjdG9yIj4KKyAgICAgKiAgICAgICA8cGFyYW0gbmFtZT0iY2FjaGUuY2FjaGVmaWxlIiB2YWx1ZT0ibXljYWNoZS5wcm9wZXJ0aWVzIiAvPgorICAgICAqICAgICAgIDxwYXJhbSBuYW1lPSJjYWNoZSIgdmFsdWU9InByb3BlcnR5ZmlsZXMiIC8+CisgICAgICogICA8L2N1c3RvbT4KKyAgICAgKiA8L3ByZT4gSXQgd2FzIGltcG9ydGFudCBmaXJzdCB0byBzZXQgdGhlIGNhY2hlIGFuZCB0aGVuIHRvIHNldAorICAgICAqIHRoZSBjYWNoZSdzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gVGhhdCByZXN1bHRzIGluIHRoZSByZW9yZ2FuaXplZAorICAgICAqIGNvbmZpZ3VyZSgpIG1ldGhvZCBvZiBNb2RpZmllZFNlbGVjdG9yLiBUaGlzIHRlc3RjYXNlIHRlc3RzIHRoYXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb3BlcnRpZXNDYWNoZVZpYUN1c3RvbVNlbGVjdG9yKCkgeworICAgICAgICBGaWxlIGNhY2hlZmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoInRtcC1jYWNoZS0iLCAiLnByb3BlcnRpZXMiLCBudWxsLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0ZXN0IGVudmlyb25tZW50IChjYWxsZWQgImJlZCIpCisgICAgICAgICAgICBtYWtlQmVkKCk7CisKKyAgICAgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VsZWN0b3IKKworICAgICAgICAgICAgRXh0ZW5kU2VsZWN0b3IgcyA9IG5ldyBFeHRlbmRTZWxlY3RvcigpOworICAgICAgICAgICAgcy5zZXRDbGFzc25hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLk1vZGlmaWVkU2VsZWN0b3IiKTsKKyAgICAgICAgICAgIHMuYWRkUGFyYW0oY3JlYXRlUGFyYW0oInVwZGF0ZSIsICJ0cnVlIikpOworICAgICAgICAgICAgcy5hZGRQYXJhbShjcmVhdGVQYXJhbSgiY2FjaGUuY2FjaGVmaWxlIiwgY2FjaGVmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgICAgICBzLmFkZFBhcmFtKGNyZWF0ZVBhcmFtKCJjYWNoZSIsICJwcm9wZXJ0eWZpbGUiKSk7CisKKyAgICAgICAgICAgIHNlbGVjdGlvblN0cmluZyhzKTsKKworICAgICAgICAgICAgLy8gZXZhbHVhdGUgY29ycmVjdG5lc3MKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkNhY2hlIGZpbGUgaXMgbm90IGNyZWF0ZWQuIiwgY2FjaGVmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsZWFudXBCZWQoKTsKKyAgICAgICAgICAgIGlmIChjYWNoZWZpbGUhPW51bGwpIGNhY2hlZmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgX3Rlc3RDdXN0b21DYWNoZSgpIHsKKyAgICAgICAgLy8gc2FtZSBsb2dpYyBhcyBvbiBhbGdvcml0aG0sIG5vIHRlc3RjYXNlcyBjcmVhdGVkCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBpbnRlcmZhY2Ugc2VtYW50aWMgb2YgQ2FjaGVzLgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgc29tZSBjb21tb24gdGVzdCBmb3IgY2FjaGUgaW1wbGVtZW50YXRpb25zLgorICAgICAqIEEgY2FjaGUgbXVzdCByZXR1cm4gYSBzdG9yZWQgdmFsdWUgYW5kIGEgdmFsaWQgaXRlcmF0b3IuCisgICAgICogQWZ0ZXIgY2FsbGluZyB0aGUgZGVsZXRlKCkgdGhlIGNhY2hlIG11c3QgYmUgZW1wdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxnbyAgIGNvbmZpZ3VyZWQgdGVzdCBvYmplY3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1Rlc3QoQ2FjaGUgY2FjaGUpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FjaGUgbm90IHByb3BlciBjb25maWd1cmVkLiIsIGNhY2hlLmlzVmFsaWQoKSk7CisKKyAgICAgICAgU3RyaW5nIGtleTEgICA9ICJrZXkxIjsKKyAgICAgICAgU3RyaW5nIHZhbHVlMSA9ICJ2YWx1ZTEiOworICAgICAgICBTdHJpbmcga2V5MiAgID0gImtleTIiOworICAgICAgICBTdHJpbmcgdmFsdWUyID0gInZhbHVlMiI7CisKKyAgICAgICAgLy8gZ2l2ZW4gY2FjaGUgbXVzdCBiZSBlbXB0eQorICAgICAgICBJdGVyYXRvciBpdDEgPSBjYWNoZS5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRGYWxzZSgiQ2FjaGUgaXMgbm90IGVtcHR5IiwgaXQxLmhhc05leHQoKSk7CisKKyAgICAgICAgLy8gY2FjaGUgbXVzdCByZXR1cm4gYSBzdG9yZWQgdmFsdWUKKyAgICAgICAgY2FjaGUucHV0KGtleTEsIHZhbHVlMSk7CisgICAgICAgIGNhY2hlLnB1dChrZXkyLCB2YWx1ZTIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNhY2hlIHJldHVybmVkIHdyb25nIHZhbHVlIiwgdmFsdWUxLCBjYWNoZS5nZXQoa2V5MSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNhY2hlIHJldHVybmVkIHdyb25nIHZhbHVlIiwgdmFsdWUyLCBjYWNoZS5nZXQoa2V5MikpOworCisgICAgICAgIC8vIHRlc3QgdGhlIGl0ZXJhdG9yCisgICAgICAgIEl0ZXJhdG9yIGl0MiA9IGNhY2hlLml0ZXJhdG9yKCk7CisgICAgICAgIE9iamVjdCAgIHJldHVybmVkID0gaXQyLm5leHQoKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IChrZXkxLmVxdWFscyhyZXR1cm5lZCkgfHwga2V5Mi5lcXVhbHMocmV0dXJuZWQpKTsKKyAgICAgICAgU3RyaW5nIG1zZyA9ICJJdGVyYXRvciByZXR1cm5lZCB1bmV4cGVjdGVkIHZhbHVlLiIKKyAgICAgICAgICAgICAgICAgICArICIgIGtleTEuZXF1YWxzKHJldHVybmVkKT0iK2tleTEuZXF1YWxzKHJldHVybmVkKQorICAgICAgICAgICAgICAgICAgICsgIiAga2V5Mi5lcXVhbHMocmV0dXJuZWQpPSIra2V5Mi5lcXVhbHMocmV0dXJuZWQpCisgICAgICAgICAgICAgICAgICAgKyAiICByZXR1cm5lZD0iK3JldHVybmVkCisgICAgICAgICAgICAgICAgICAgKyAiICBvaz0iK29rOworICAgICAgICBhc3NlcnRUcnVlKG1zZywgb2spOworCisgICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZQorICAgICAgICBjYWNoZS5kZWxldGUoKTsKKyAgICAgICAgSXRlcmF0b3IgaXQzID0gY2FjaGUuaXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkNhY2hlIGlzIG5vdCBlbXB0eSIsIGl0MS5oYXNOZXh0KCkpOworICAgIH0KKworCisgICAgLy8gPT09PT09PT09PT09PT0gIHRlc3RjYXNlcyBmb3IgdGhlIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMgID09PT09PT09PT09PT09CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNodmFsdWVBbGdvcml0aG0oKSB7CisgICAgICAgIEhhc2h2YWx1ZUFsZ29yaXRobSBhbGdvID0gbmV3IEhhc2h2YWx1ZUFsZ29yaXRobSgpOworICAgICAgICBkb1Rlc3QoYWxnbyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0QWxnb3JpdGhtTUQ1KCkgeworICAgICAgICBEaWdlc3RBbGdvcml0aG0gYWxnbyA9IG5ldyBEaWdlc3RBbGdvcml0aG0oKTsKKyAgICAgICAgYWxnby5zZXRBbGdvcml0aG0oIk1ENSIpOworICAgICAgICBkb1Rlc3QoYWxnbyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0QWxnb3JpdGhtU0hBKCkgeworICAgICAgICBEaWdlc3RBbGdvcml0aG0gYWxnbyA9IG5ldyBEaWdlc3RBbGdvcml0aG0oKTsKKyAgICAgICAgYWxnby5zZXRBbGdvcml0aG0oIlNIQSIpOworICAgICAgICBkb1Rlc3QoYWxnbyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tzdW1BbGdvcml0aG0oKSB7CisgICAgICAgIENoZWNrc3VtQWxnb3JpdGhtIGFsZ28gPSBuZXcgQ2hlY2tzdW1BbGdvcml0aG0oKTsKKyAgICAgICAgZG9UZXN0KGFsZ28pOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrc3VtQWxnb3JpdGhtQ1JDKCkgeworICAgICAgICBDaGVja3N1bUFsZ29yaXRobSBhbGdvID0gbmV3IENoZWNrc3VtQWxnb3JpdGhtKCk7CisgICAgICAgIGFsZ28uc2V0QWxnb3JpdGhtKCJDUkMiKTsKKyAgICAgICAgZG9UZXN0KGFsZ28pOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrc3VtQWxnb3JpdGhtQWRsZXIoKSB7CisgICAgICAgIENoZWNrc3VtQWxnb3JpdGhtIGFsZ28gPSBuZXcgQ2hlY2tzdW1BbGdvcml0aG0oKTsKKyAgICAgICAgYWxnby5zZXRBbGdvcml0aG0oIkFkbGVyIik7CisgICAgICAgIGRvVGVzdChhbGdvKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGludGVyZmFjZSBzZW1hbnRpYyBvZiBBbGdvcml0aG1zLgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgc29tZSBjb21tb24gdGVzdCBmb3IgYWxnb3JpdGhtIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBBbiBhbGdvcml0aG0gbXVzdCByZXR1cm4gYWx3YXlzIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgc2FtZSBmaWxlIGFuZAorICAgICAqIGl0IG11c3Qgbm90IHJldHVybiA8aT5udWxsPC9pPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGdvICAgY29uZmlndXJlZCB0ZXN0IG9iamVjdAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvVGVzdChBbGdvcml0aG0gYWxnbykgeworICAgICAgICBhc3NlcnRUcnVlKCJBbGdvcml0aG0gbm90IHByb3BlciBjb25maWd1cmVkLiIsIGFsZ28uaXNWYWxpZCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ha2VCZWQoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZXNbaV07ICAvLyBtdXN0IG5vdCBiZSBhIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgSGFzaHZhbHVlcworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGFzaDEgPSBhbGdvLmdldFZhbHVlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGFzaDIgPSBhbGdvLmdldFZhbHVlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGFzaDMgPSBhbGdvLmdldFZhbHVlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGFzaDQgPSBhbGdvLmdldFZhbHVlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGFzaDUgPSBhbGdvLmdldFZhbHVlKG5ldyBGaWxlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBc3NlcnQgIT1udWxsIGFuZCBlcXVhbGl0eQorICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaGFzaDEpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaGFzaDIpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaGFzaDMpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaGFzaDQpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaGFzaDUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEhhc2h2YWx1ZSgpIHJldHVybmVkIGRpZmZlcmVudCB2YWx1ZSBmb3IgIitmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoMSwgaGFzaDIpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEhhc2h2YWx1ZSgpIHJldHVybmVkIGRpZmZlcmVudCB2YWx1ZSBmb3IgIitmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoMSwgaGFzaDMpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEhhc2h2YWx1ZSgpIHJldHVybmVkIGRpZmZlcmVudCB2YWx1ZSBmb3IgIitmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoMSwgaGFzaDQpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEhhc2h2YWx1ZSgpIHJldHVybmVkIGRpZmZlcmVudCB2YWx1ZSBmb3IgIitmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoMSwgaGFzaDUpOworICAgICAgICAgICAgICAgIH0vL2lmLWlzRmlsZQorICAgICAgICAgICAgfS8vZm9yCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbGVhbnVwQmVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgLy8gPT09PT09PT09PT09PT0gIHRlc3RjYXNlcyBmb3IgdGhlIGNvbXBhcmF0b3IgaW1wbGVtZW50YXRpb25zICA9PT09PT09PT09PT09PQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxDb21wYXJhdG9yKCkgeworICAgICAgICBFcXVhbENvbXBhcmF0b3IgY29tcCA9IG5ldyBFcXVhbENvbXBhcmF0b3IoKTsKKyAgICAgICAgZG9UZXN0KGNvbXApOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdFJ1bGVDb21wYXJhdG9yKCkgeworICAgICAgICBSdWxlQmFzZWRDb2xsYXRvciBjb21wID0gKFJ1bGVCYXNlZENvbGxhdG9yKVJ1bGVCYXNlZENvbGxhdG9yLmdldEluc3RhbmNlKCk7CisgICAgICAgIGRvVGVzdChjb21wKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbENvbXBhcmF0b3JWaWFTZWxlY3RvcigpIHsKKyAgICAgICAgTW9kaWZpZWRTZWxlY3RvciBzID0gKE1vZGlmaWVkU2VsZWN0b3IpZ2V0U2VsZWN0b3IoKTsKKyAgICAgICAgTW9kaWZpZWRTZWxlY3Rvci5Db21wYXJhdG9yTmFtZSBjb21wTmFtZSA9IG5ldyBNb2RpZmllZFNlbGVjdG9yLkNvbXBhcmF0b3JOYW1lKCk7CisgICAgICAgIGNvbXBOYW1lLnNldFZhbHVlKCJlcXVhbCIpOworICAgICAgICBzLnNldENvbXBhcmF0b3IoY29tcE5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGVyZm9ybVRlc3RzKHMsICJUVFRUVFRUVFRUVFQiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHMuZ2V0Q2FjaGUoKS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgX3Rlc3RSdWxlQ29tcGFyYXRvclZpYVNlbGVjdG9yKCkgeyAvL25vdCB5ZXQgc3VwcG9ydGVkIHNlZSBub3RlIGluIHNlbGVjdG9yCisgICAgICAgIE1vZGlmaWVkU2VsZWN0b3IgcyA9IChNb2RpZmllZFNlbGVjdG9yKWdldFNlbGVjdG9yKCk7CisgICAgICAgIE1vZGlmaWVkU2VsZWN0b3IuQ29tcGFyYXRvck5hbWUgY29tcE5hbWUgPSBuZXcgTW9kaWZpZWRTZWxlY3Rvci5Db21wYXJhdG9yTmFtZSgpOworICAgICAgICBjb21wTmFtZS5zZXRWYWx1ZSgicnVsZSIpOworICAgICAgICBzLnNldENvbXBhcmF0b3IoY29tcE5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGVyZm9ybVRlc3RzKHMsICJUVFRUVFRUVFRUVFQiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHMuZ2V0Q2FjaGUoKS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgX3Rlc3RDdXN0b21Db21wYXJhdG9yKCkgeworICAgICAgICAvLyBzYW1lIGxvZ2ljIGFzIG9uIGFsZ29yaXRobSwgbm8gdGVzdGNhc2VzIGNyZWF0ZWQKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVNlbGVjdG9yU2ltcGxlKCkgeworICAgICAgICBCRlQgYmZ0ID0gbmV3IEJGVCgibW9kaWZpZWRzZWxlY3RvciIpOworICAgICAgICBiZnQuZG9UYXJnZXQoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LVJlc291cmNlU2ltcGxlIik7CisgICAgICAgIGJmdC5kZWxldGVDYWNoZWZpbGUoKTsKKyAgICAgICAgLy9uZXcgRmlsZSgic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9jYWNoZS5wcm9wZXJ0aWVzIikuZGVsZXRlKCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVNlbGVjdG9yU2VscmVzVHJ1ZSgpIHsKKyAgICAgICAgQkZUIGJmdCA9IG5ldyBCRlQoIm1vZGlmaWVkc2VsZWN0b3IiKTsKKyAgICAgICAgYmZ0LmRvVGFyZ2V0KCJtb2RpZmllZHNlbGVjdG9ydGVzdC1SZXNvdXJjZVNlbHJlc1RydWUiKTsKKyAgICAgICAgYmZ0LmFzc2VydExvZ0NvbnRhaW5pbmcoImRvZXMgbm90IHByb3ZpZGUgYW4gSW5wdXRTdHJlYW0iKTsKKyAgICAgICAgYmZ0LmRlbGV0ZUNhY2hlZmlsZSgpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTZWxlY3RvclNlbHJlc0ZhbHNlKCkgeworICAgICAgICBCRlQgYmZ0ID0gbmV3IEJGVCgibW9kaWZpZWRzZWxlY3RvciIpOworICAgICAgICBiZnQuZG9UYXJnZXQoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LVJlc291cmNlU2VscmVzRmFsc2UiKTsKKyAgICAgICAgYmZ0LmRlbGV0ZUNhY2hlZmlsZSgpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTZWxlY3RvclNjZW5hcmlvU2ltcGxlKCkgeworICAgICAgICBCRlQgYmZ0ID0gbmV3IEJGVCgibW9kaWZpZWRzZWxlY3RvciIpOworICAgICAgICBiZnQuZG9UYXJnZXQoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLXJlc291cmNlU2ltcGxlIik7CisgICAgICAgIGJmdC5kb1RhcmdldCgibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tY2xlYW4iKTsKKyAgICAgICAgYmZ0LmRlbGV0ZUNhY2hlZmlsZSgpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBpbnRlcmZhY2Ugc2VtYW50aWMgb2YgQ29tcGFyYXRvcnMuCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBzb21lIGNvbW1vbiB0ZXN0IGZvciBjb21wYXJhdG9yIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGdvICAgY29uZmlndXJlZCB0ZXN0IG9iamVjdAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvVGVzdChDb21wYXJhdG9yIGNvbXApIHsKKyAgICAgICAgT2JqZWN0IG8xID0gbmV3IFN0cmluZygic3RyaW5nMSIpOworICAgICAgICBPYmplY3QgbzIgPSBuZXcgU3RyaW5nKCJzdHJpbmcyIik7CisgICAgICAgIE9iamVjdCBvMyA9IG5ldyBTdHJpbmcoInN0cmluZzIiKTsgLy8gcmVhbGx5ICIyIgorCisgICAgICAgIGFzc2VydFRydWUoIkNvbXBhcmF0b3IgZ2F2ZSB3cm9uZyB2YWx1ZS4iLCBjb21wLmNvbXBhcmUobzEsIG8yKSAhPSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29tcGFyYXRvciBnYXZlIHdyb25nIHZhbHVlLiIsIGNvbXAuY29tcGFyZShvMSwgbzMpICE9IDApOworICAgICAgICBhc3NlcnRUcnVlKCJDb21wYXJhdG9yIGdhdmUgd3JvbmcgdmFsdWUuIiwgY29tcC5jb21wYXJlKG8yLCBvMykgPT0gMCk7CisgICAgfQorCisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gIHNjZW5hcmlvIHRlc3RzICA9PT09PT09PT09PT09PT09PT09PT0KKworCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciB0aGUgc2VsZGlycyBhdHRyaWJ1dGUgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZGlycygpIHsKKyAgICAgICAgTW9kaWZpZWRTZWxlY3RvciBzID0gKE1vZGlmaWVkU2VsZWN0b3IpZ2V0U2VsZWN0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ha2VCZWQoKTsKKworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiVHJ1ZSAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2JGYWxzZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmaWxlbmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBzYlRydWUuYXBwZW5kKCJUIik7CisgICAgICAgICAgICAgICAgICAgIHNiRmFsc2UuYXBwZW5kKCJGIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2JUcnVlLmFwcGVuZCgiVCIpOworICAgICAgICAgICAgICAgICAgICBzYkZhbHNlLmFwcGVuZCgiVCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy5zZXRTZWxkaXJzKHRydWUpOworICAgICAgICAgICAgcGVyZm9ybVRlc3RzKHMsIHNiVHJ1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHMuZ2V0Q2FjaGUoKS5kZWxldGUoKTsKKworICAgICAgICAgICAgcy5zZXRTZWxkaXJzKGZhbHNlKTsKKyAgICAgICAgICAgIHBlcmZvcm1UZXN0cyhzLCBzYkZhbHNlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcy5nZXRDYWNoZSgpLmRlbGV0ZSgpOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbGVhbnVwQmVkKCk7CisgICAgICAgICAgICBpZiAocyE9bnVsbCkgcy5nZXRDYWNoZSgpLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21wbGV4IHRlc3Qgc2NlbmFyaW8gdXNpbmcgZGVmYXVsdCB2YWx1ZXMgKERpZ2VzdEFsZ29yaXRobSB3aXRoIE1ENSwKKyAgICAgKiBQcm9wZXJ0aWVzZmlsZUNhY2hlIHdpdGggZmlsZT1jYWNoZS5wcm9wZXJ0aWVzLCBFcXVhbENvbXBhcmF0b3IKKyAgICAgKiBhbmQgdXBkYXRlPXRydWUpLiA8b2w+CisgICAgICogPGxpPiB0cnkgZmlzdCB0aW1lIC0tPiBzaG91bGQgc2VsZWN0IGFsbCA8L2xpPgorICAgICAqIDxsaT4gdHJ5IHNlY29uZCB0aW1lIC0tPiBzaG91bGQgc2VsZWN0IG5vIGZpbGVzIChvbmx5IGRpcmVjdG9yaWVzKSA8L2xpPgorICAgICAqIDxsaT4gbW9kaWZ5IHRpbWVzdGFtcCBvZiBvbmUgZmlsZSBhbmQgY29udGVudCBvZiBhIG5vdGhlciBvbmUgPC9saT4KKyAgICAgKiA8bGk+IHRyeSB0aGlyZCB0aW1lIC0tPiBzaG91bGQgc2VsZWN0IG9ubHkgdGhlIGZpbGUgd2l0aCBtb2RpZmllZAorICAgICAqICAgICAgY29udGVudCA8L2xpPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpbzEoKSB7CisgICAgICAgIEJGVCBiZnQgPSBudWxsOworICAgICAgICBNb2RpZmllZFNlbGVjdG9yIHMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICoqKioqICBpbml0aWFsaXplIHRlc3QgZW52aXJvbm1lbnQgKGNhbGxlZCAiYmVkIikgICoqKioqCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbWFrZUJlZCgpOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBudWxsOworCisgICAgICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlbGVjdG9yIC0gb25seSBkZWZhdWx0cyBhcmUgdXNlZAorICAgICAgICAgICAgcyA9IChNb2RpZmllZFNlbGVjdG9yKWdldFNlbGVjdG9yKCk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAqKioqKiAgRmlyc3QgUnVuICAqKioqKgorICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGNhbGwgc2hvdWxkIGdldCBhbGwgZmlsZXMsIGJlY2F1c2Ugbm90aGluZyBpcyBpbgorICAgICAgICAgICAgLy8gdGhlIGNhY2hlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcGVyZm9ybVRlc3RzKHMsICJUVFRUVFRUVFRUVFQiKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICoqKioqICBTZWNvbmQgUnVuICAqKioqKgorICAgICAgICAgICAgLy8gdGhlIHNlY29uZCBjYWxsIHNob3VsZCBnZXQgbm8gZmlsZXMsIGJlY2F1c2Ugbm8gY29udGVudAorICAgICAgICAgICAgLy8gaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBwZXJmb3JtVGVzdHMocywgIlRGRkZGRkZGRkZGVCIpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gKioqKiogIG1ha2Ugc29tZSBmaWxlcyBkaXJ0eSAgKioqKioKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIC8vIHRoZXNlIGZpbGVzIGFyZSBtYWRlIGRpcnR5IC0tPiAzKzQgd2l0aCBkaWZmZXJlbnQgY29udGVudAorICAgICAgICAgICAgU3RyaW5nIGYybmFtZSA9ICJ0YXIvYnoyL2FzZi1sb2dvLWh1Z2UudGFyLmJ6MiI7CisgICAgICAgICAgICBTdHJpbmcgZjNuYW1lID0gImFzZi1sb2dvLmdpZi5tZDUiOworICAgICAgICAgICAgU3RyaW5nIGY0bmFtZSA9ICJjb3B5LmZpbHRlcnNldC5maWx0ZXJlZCI7CisKKyAgICAgICAgICAgIC8vIEFjY2Vzc09iamVjdCB0byB0aGUgdGVzdC1BbnQtZW52aXJvbm1lbnQKKyAgICAgICAgICAgIGJmdCA9IG5ldyBCRlQoKTsKKyAgICAgICAgICAgIC8vIGdpdmUgc29tZSB2YWx1ZXMgKHZpYSBwcm9wZXJ0eSBmaWxlKSB0byB0aGF0IGVudmlyb25tZW50CisgICAgICAgICAgICBiZnQud3JpdGVQcm9wZXJ0aWVzKCJmMm5hbWU9IitmMm5hbWUpOworICAgICAgICAgICAgYmZ0LndyaXRlUHJvcGVydGllcygiZjNuYW1lPSIrZjNuYW1lKTsKKyAgICAgICAgICAgIGJmdC53cml0ZVByb3BlcnRpZXMoImY0bmFtZT0iK2Y0bmFtZSk7CisgICAgICAgICAgICAvLyBjYWxsIHRoZSB0YXJnZXQgZm9yIG1ha2luZyB0aGUgZmlsZXMgZGlydHkKKyAgICAgICAgICAgIGJmdC5kb1RhcmdldCgibW9kaWZpZWRzZWxlY3RvcnRlc3QtbWFrZURpcnR5Iik7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAqKioqKiAgVGhpcmQgUnVuICAqKioqKgorICAgICAgICAgICAgLy8gdGhpcmQgY2FsbCBzaG91bGQgZ2V0IG9ubHkgdGhvc2UgZmlsZXMsIHdoaWNoIENPTlRFTlQgY2hhbmdlZAorICAgICAgICAgICAgLy8gKG5vIHRpbWVzdGFtcCBjaGFuZ2VzIHJlcXVpcmVkISkKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAqKioqKiAgQ2hlY2sgdGhlIHJlc3VsdCAgKioqKioKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIC8vIE1hcmsgYWxsIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAoVClydWUgYW5kIGFsbCBvdGhlcnMKKyAgICAgICAgICAgIC8vIGFzIChGKWFsc2UuIERpcmVjdG9yaWVzIGFyZSBhbHdheXMgc2VsZWN0ZWQgc28gdGhleSBhbHdheXMgYXJlCisgICAgICAgICAgICAvLyAoVClydWUuCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXhwZWN0ZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNoID0gIkYiOworICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSBjaCA9ICJUIjsKKyAgICAgICAgICAgICAgICAvLyBmMm5hbWUgc2hvdWxkbid0IGJlIHNlbGVjdGVkOiBvbmx5IHRpbWVzdGFtcCBoYXMgY2hhbmdlZCEKKyAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWVzW2ldLmVxdWFsc0lnbm9yZUNhc2UoZjNuYW1lKSkgY2ggPSAiVCI7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lc1tpXS5lcXVhbHNJZ25vcmVDYXNlKGY0bmFtZSkpIGNoID0gIlQiOworICAgICAgICAgICAgICAgIGV4cGVjdGVkLmFwcGVuZChjaCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiV3JvbmcgZmlsZXMgc2VsZWN0ZWQuIERpZmZlcmluZyBmaWxlczogIiAgICAgICAvLyBpbmZvIHRleHQKKyAgICAgICAgICAgICAgICArIHJlc29sdmUoZGlmZihleHBlY3RlZC50b1N0cmluZygpLCByZXN1bHRzKSksICAvLyBsaXN0IG9mIGZpbGVzCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQudG9TdHJpbmcoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgICAgICAgICAgcmVzdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0CisgICAgICAgICAgICApOworCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBjbGVhbnVwIHRoZSBlbnZpcm9ubWVudAorICAgICAgICAgICAgY2xlYW51cEJlZCgpOworICAgICAgICAgICAgaWYgKHMhPW51bGwpIHMuZ2V0Q2FjaGUoKS5kZWxldGUoKTsKKyAgICAgICAgICAgIGlmIChiZnQhPW51bGwpIGJmdC5kZWxldGVQcm9wZXJ0aWVzZmlsZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNjZW5hcmlvIGlzIGJhc2VkIG9uIHNjZW5hcmlvIDEsIGJ1dCBkb2VzIG5vdCB1c2UgYW55CisgICAgICogZGVmYXVsdCB2YWx1ZSBhbmQgaXRzIGJhc2VkIG9uIDxjdXN0b20+IHNlbGVjdG9yLiBVc2VkIHZhbHVlcyBhcmU6PHVsPgorICAgICAqIDxsaT48Yj5DYWNoZTogPC9iPiBQcm9wZXJ0eWZpbGUsCisgICAgICogICAgICAgICAgICAgICAgICAgIGNhY2hlZmlsZT17amF2YS5pby50bXBkaXJ9L215Y2FjaGUudHh0IDwvbGk+CisgICAgICogPGxpPjxiPkFsZ29yaXRobTogPC9iPiBEaWdlc3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtPVNIQSwgUHJvdmlkZXI9bnVsbCA8L2xpPgorICAgICAqIDxsaT48Yj5Db21wYXJhdG9yOiA8L2I+IGphdmEudGV4dC5SdWxlQmFzZWRDb2xsYXRvcgorICAgICAqIDxsaT48Yj5VcGRhdGU6IDwvYj4gdHJ1ZSA8L2xpPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIF90ZXN0U2NlbmFyaW8yKCkgeyAvLyBSdWxlQmFzZWRDb2xsYXRvciBub3QgeWV0IHN1cHBvcnRlZCAtIHNlZSBTZWxlY3RvcjozNzUgbm90ZQorICAgICAgICBFeHRlbmRTZWxlY3RvciBzID0gbmV3IEV4dGVuZFNlbGVjdG9yKCk7CisgICAgICAgIEJGVCBiZnQgPSBuZXcgQkZUKCk7CisgICAgICAgIFN0cmluZyBjYWNoZWZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikrIi9teWNhY2hlLnR4dCI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYWtlQmVkKCk7CisKKyAgICAgICAgICAgIHMuc2V0Q2xhc3NuYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yIik7CisKKyAgICAgICAgICAgIHMuYWRkUGFyYW0oY3JlYXRlUGFyYW0oImNhY2hlLmNhY2hlZmlsZSIsIGNhY2hlZmlsZSkpOworICAgICAgICAgICAgLy9zLmFkZFBhcmFtKGNyZWF0ZVBhcmFtKCJhbGdvcml0aG0ucHJvdmlkZXIiLCItLS0iKSk7IC8vIGkgZG9uJ3Qga25vdyBhbnkgdmFsaWQKKyAgICAgICAgICAgIHMuYWRkUGFyYW0oY3JlYXRlUGFyYW0oImNhY2hlIiwicHJvcGVydHlmaWxlIikpOworICAgICAgICAgICAgcy5hZGRQYXJhbShjcmVhdGVQYXJhbSgidXBkYXRlIiwidHJ1ZSIpKTsKKyAgICAgICAgICAgIHMuYWRkUGFyYW0oY3JlYXRlUGFyYW0oImNvbXBhcmF0b3IiLCJydWxlIikpOworICAgICAgICAgICAgcy5hZGRQYXJhbShjcmVhdGVQYXJhbSgiYWxnb3JpdGhtLm5hbWUiLCJzaGEiKSk7CisgICAgICAgICAgICBzLmFkZFBhcmFtKGNyZWF0ZVBhcmFtKCJhbGdvcml0aG0iLCJkaWdlc3QiKSk7CisKKyAgICAgICAgICAgIC8vIGZpcnN0IGFuZCBzZWNvbmQgcnVuCisgICAgICAgICAgICBwZXJmb3JtVGVzdHMocywgIlRUVFRUVFRUVFRUVCIpOworICAgICAgICAgICAgcGVyZm9ybVRlc3RzKHMsICJURkZGRkZGRkZGRlQiKTsKKyAgICAgICAgICAgIC8vIG1ha2UgZGlydHkKKyAgICAgICAgICAgIFN0cmluZyBmMm5hbWUgPSAidGFyL2J6Mi9hc2YtbG9nby1odWdlLnRhci5iejIiOworICAgICAgICAgICAgU3RyaW5nIGYzbmFtZSA9ICJhc2YtbG9nby5naWYubWQ1IjsKKyAgICAgICAgICAgIFN0cmluZyBmNG5hbWUgPSAiY29weS5maWx0ZXJzZXQuZmlsdGVyZWQiOworICAgICAgICAgICAgYmZ0LndyaXRlUHJvcGVydGllcygiZjJuYW1lPSIrZjJuYW1lKTsKKyAgICAgICAgICAgIGJmdC53cml0ZVByb3BlcnRpZXMoImYzbmFtZT0iK2YzbmFtZSk7CisgICAgICAgICAgICBiZnQud3JpdGVQcm9wZXJ0aWVzKCJmNG5hbWU9IitmNG5hbWUpOworICAgICAgICAgICAgYmZ0LmRvVGFyZ2V0KCJtb2RpZmllZHNlbGVjdG9ydGVzdC1tYWtlRGlydHkiKTsKKyAgICAgICAgICAgIC8vIHRoaXJkIHJ1bgorICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXhwZWN0ZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNoID0gIkYiOworICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSBjaCA9ICJUIjsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWVzW2ldLmVxdWFsc0lnbm9yZUNhc2UoZjNuYW1lKSkgY2ggPSAiVCI7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lc1tpXS5lcXVhbHNJZ25vcmVDYXNlKGY0bmFtZSkpIGNoID0gIlQiOworICAgICAgICAgICAgICAgIGV4cGVjdGVkLmFwcGVuZChjaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIldyb25nIGZpbGVzIHNlbGVjdGVkLiBEaWZmZXJpbmcgZmlsZXM6ICIgICAgICAgLy8gaW5mbyB0ZXh0CisgICAgICAgICAgICAgICAgKyByZXNvbHZlKGRpZmYoZXhwZWN0ZWQudG9TdHJpbmcoKSwgcmVzdWx0cykpLCAgLy8gbGlzdCBvZiBmaWxlcworICAgICAgICAgICAgICAgIGV4cGVjdGVkLnRvU3RyaW5nKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICAgICAgICAgIHJlc3VsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdAorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIGNsZWFudXAgdGhlIGVudmlyb25tZW50CisgICAgICAgICAgICBjbGVhbnVwQmVkKCk7CisgICAgICAgICAgICAobmV3IGphdmEuaW8uRmlsZShjYWNoZWZpbGUpKS5kZWxldGUoKTsKKyAgICAgICAgICAgIGlmIChiZnQhPW51bGwpIGJmdC5kZWxldGVQcm9wZXJ0aWVzZmlsZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW9Db3JlU2VsZWN0b3JEZWZhdWx0cygpIHsKKyAgICAgICAgZG9TY2VuYXJpb1Rlc3QoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLWNvcmVzZWxlY3Rvci1kZWZhdWx0cyIsICJjYWNoZS5wcm9wZXJ0aWVzIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW9Db3JlU2VsZWN0b3JTZXR0aW5ncygpIHsKKyAgICAgICAgZG9TY2VuYXJpb1Rlc3QoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLWNvcmVzZWxlY3Rvci1zZXR0aW5ncyIsICJjb3JlLmNhY2hlLnByb3BlcnRpZXMiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpb0N1c3RvbVNlbGVjdG9yU2V0dGluZ3MoKSB7CisgICAgICAgIGRvU2NlbmFyaW9UZXN0KCJtb2RpZmllZHNlbGVjdG9ydGVzdC1zY2VuYXJpby1jdXN0b21zZWxlY3Rvci1zZXR0aW5ncyIsICJjb3JlLmNhY2hlLnByb3BlcnRpZXMiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGRvU2NlbmFyaW9UZXN0KFN0cmluZyB0YXJnZXQsIFN0cmluZyBjYWNoZWZpbGVuYW1lKSB7CisgICAgICAgIEJGVCBiZnQgPSBuZXcgQkZUKCk7CisgICAgICAgIGJmdC5zZXRVcCgpOworICAgICAgICBGaWxlIGNhY2hlZmlsZSA9IG5ldyBGaWxlKGJhc2VkaXIsIGNhY2hlZmlsZW5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gZG8gdGhlIGFjdGlvbnMKKyAgICAgICAgICAgIGJmdC5kb1RhcmdldCgibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tY2xlYW4iKTsKKyAgICAgICAgICAgIGJmdC5kb1RhcmdldCh0YXJnZXQpOworCisgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3JpZXMgdG8gY2hlY2sKKyAgICAgICAgICAgIEZpbGUgdG8xID0gbmV3IEZpbGUoYmFzZWRpciwgInNlbGVjdG9ydGVzdC90by0xIik7CisgICAgICAgICAgICBGaWxlIHRvMiA9IG5ldyBGaWxlKGJhc2VkaXIsICJzZWxlY3RvcnRlc3QvdG8tMiIpOworICAgICAgICAgICAgRmlsZSB0bzMgPSBuZXcgRmlsZShiYXNlZGlyLCAic2VsZWN0b3J0ZXN0L3RvLTMiKTsKKworICAgICAgICAgICAgLy8gZG8gdGhlIGNoZWNrcworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2FjaGUgZmlsZSBub3QgY3JlYXRlZC4iLCBjYWNoZWZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm90IGVub3VnaCBmaWxlcyBjb3BpZWQgb24gZmlyc3QgdGltZS4iLCB0bzEubGlzdCgpLmxlbmd0aD41KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRvbyBtdWNoIGZpbGVzIGNvcGllZCBvbiBzZWNvbmQgdGltZS4iLCB0bzIubGlzdCgpLmxlbmd0aD09MCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUb28gbXVjaCBmaWxlcyBjb3BpZWQgb24gdGhpcmQgdGltZS4iLCB0bzMubGlzdCgpLmxlbmd0aD09Mik7CisgICAgICAgIC8vIGRvbid0IGNhdGNoIHRoZSBKVW5pdCBleGNlcHRpb25zCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBiZnQuZG9UYXJnZXQoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLWNsZWFuIik7CisgICAgICAgICAgICBiZnQuZGVsZXRlUHJvcGVydGllc2ZpbGUoKTsKKyAgICAgICAgICAgIGJmdC50ZWFyRG93bigpOworICAgICAgICAgICAgY2FjaGVmaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09ICBoZWxwZXIgbWV0aG9kcyBhbmQgY2xhc3NlcyAgPT09PT09PT09PT09PT09PT09PT0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbmZpZ3VyZWQgcGFyYW1ldGVyIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gbmFtZSAgIG5hbWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSB2YWx1ZSAgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBvYmplY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIFBhcmFtZXRlciBjcmVhdGVQYXJhbShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFBhcmFtZXRlciBwID0gbmV3IFBhcmFtZXRlcigpOworICAgICAgICBwLnNldE5hbWUobmFtZSk7CisgICAgICAgIHAuc2V0VmFsdWUodmFsdWUpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBCRlQgY2xhc3Mgd3JhcHBzIHRoZSBzZWxlY3RvciB0ZXN0LWJ1aWxmaWxlIGluc2lkZSBhbgorICAgICAqIGFudCBwcm9qZWN0IChCdWlsZEZpbGVUZXN0KS4gSXQgc3VwcG9ydHMgdGFyZ2V0IGV4ZWN1dGlvbgorICAgICAqIGFuZCBwcm9wZXJ0eSB0cmFuc2ZlciB0byB0aGF0IHByb2plY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBCRlQgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVUZXN0IHsKKyAgICAgICAgU3RyaW5nIGJ1aWxkZmlsZSA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3RvcnMueG1sIjsKKworICAgICAgICBCRlQoKSB7IHN1cGVyKCJub3RoaW5nIik7IH0KKyAgICAgICAgQkZUKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBzdXBlcihuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwcm9wZmlsZSA9ICJNb2RpZmllZFNlbGVjdG9yVGVzdC5wcm9wZXJ0aWVzIjsKKworICAgICAgICBib29sZWFuIGlzQ29uZmlndXJlZCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgY29uZmlndXJlUHJvamVjdChidWlsZGZpbGUpOworICAgICAgICAgICAgaXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgc3R1YiB0ZWFyZG93biBpcyBoZXJlIGJlY2F1c2UgdGhlIG91dGVyIGNsYXNzIG5lZWRzIHRvIGNhbGwgdGhlCisgICAgICAgICAqIHRlYXJEb3duIG1ldGhvZCwgYW5kIGluIHRoZSBzdXBlcmNsYXNzIGl0IGlzIHByb3RlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRvVGFyZ2V0KFN0cmluZyB0YXJnZXQpIHsKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKSBzZXRVcCgpOworICAgICAgICAgICAgZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnR5KHByb3BlcnR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydGllcyhTdHJpbmcgbGluZSkgeworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQpIHNldFVwKCk7CisgICAgICAgICAgICBGaWxlIGRpciA9IGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCk7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIHByb3BmaWxlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgamF2YS5pby5GaWxlV3JpdGVyIG91dCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmlvLkZpbGVXcml0ZXIoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGxpbmUpOworICAgICAgICAgICAgICAgIG91dC53cml0ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOworICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlUHJvcGVydGllc2ZpbGUoKSB7CisgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCkgc2V0VXAoKTsKKyAgICAgICAgICAgIG5ldyBGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHByb3BmaWxlKS5kZWxldGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNhY2hlZmlsZSgpIHsKKyAgICAgICAgICAgIEZpbGUgYmFzZWRpciA9IG5ldyBGaWxlKGJ1aWxkZmlsZSkuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgRmlsZSBjYWNoZUZpbGUgPSBuZXcgRmlsZShiYXNlZGlyLCAiY2FjaGUucHJvcGVydGllcyIpOworICAgICAgICAgICAgY2FjaGVGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCdWlsZGZpbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRmaWxlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEJ1aWxkZmlsZShTdHJpbmcgYnVpbGRmaWxlKSB7CisgICAgICAgICAgICB0aGlzLmJ1aWxkZmlsZSA9IGJ1aWxkZmlsZTsKKyAgICAgICAgfQorICAgIH0vL2NsYXNzLUJGVAorCisKKyAgICAvKioKKyAgICAgKiBNb2NrUHJvamVjdCB3cmFwcGVzIGEgdmVyeSBzbWFsbCBhbnQgcHJvamVjdCAob25lIHRhcmdldCwgb25lIHRhc2spCisgICAgICogYnV0IHByb3ZpZGVzIHB1YmxpYyBtZXRob2RzIHRvIGZpcmUgdGhlIGJ1aWxkIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE1vY2tQcm9qZWN0IGV4dGVuZHMgUHJvamVjdCB7CisgICAgICAgIHByaXZhdGUgVGFzayAgIHRhc2s7CisgICAgICAgIHByaXZhdGUgVGFyZ2V0IHRhcmdldDsKKworICAgICAgICBwdWJsaWMgTW9ja1Byb2plY3QoKSB7CisgICAgICAgICAgICB0YXNrID0gbmV3IFRhc2soKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0YXNrLnNldFRhc2tOYW1lKCJ0ZXN0VGFzayIpOworICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IFRhcmdldCgpOworICAgICAgICAgICAgdGFyZ2V0LnNldE5hbWUoInRlc3RUYXJnZXQiKTsKKyAgICAgICAgICAgIHRhcmdldC5zZXRQcm9qZWN0KHRoaXMpOworICAgICAgICAgICAgdGFyZ2V0LmFkZFRhc2sodGFzayk7CisgICAgICAgICAgICB0YXNrLnNldE93bmluZ1RhcmdldCh0YXJnZXQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmlyZUJ1aWxkRmluaXNoZWQoKSB7CisgICAgICAgICAgICBzdXBlci5maXJlQnVpbGRGaW5pc2hlZChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBmaXJlU3ViQnVpbGRGaW5pc2hlZCgpIHsKKyAgICAgICAgICAgIHN1cGVyLmZpcmVTdWJCdWlsZEZpbmlzaGVkKG51bGwpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGZpcmVUYXJnZXRTdGFydGVkKCkgeworICAgICAgICAgICAgc3VwZXIuZmlyZVRhcmdldFN0YXJ0ZWQodGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBmaXJlVGFyZ2V0RmluaXNoZWQoKSB7CisgICAgICAgICAgICBzdXBlci5maXJlVGFyZ2V0RmluaXNoZWQodGFyZ2V0LCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBmaXJlVGFza1N0YXJ0ZWQoKSB7CisgICAgICAgICAgICBzdXBlci5maXJlVGFza1N0YXJ0ZWQodGFzayk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgZmlyZVRhc2tGaW5pc2hlZCgpIHsKKyAgICAgICAgICAgIHN1cGVyLmZpcmVUYXNrRmluaXNoZWQodGFzaywgbnVsbCk7CisgICAgICAgIH0KKyAgICB9Ly9jbGFzcy1Nb2NrUHJvamVjdAorCisKK30vL2NsYXNzLU1vZGlmaWVkU2VsZWN0b3JUZXN0CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1ByZXNlbnRTZWxlY3RvclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUHJlc2VudFNlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MGZhZjMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1ByZXNlbnRTZWxlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisKKy8qKgorICogVGVzdHMgUHJlc2VudCBTZWxlY3RvcnMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVzZW50U2VsZWN0b3JUZXN0IGV4dGVuZHMgQmFzZVNlbGVjdG9yVGVzdCB7CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIHB1YmxpYyBQcmVzZW50U2VsZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIGZyb20gYmFzZSBjbGFzcy4gVGhpcyBpcyBvdmVycmlkZW4gaW4gY2hpbGQKKyAgICAgKiBjbGFzc2VzIHRvIHJldHVybiBhIHNwZWNpZmljIFNlbGVjdG9yIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBCYXNlU2VsZWN0b3IgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJlc2VudFNlbGVjdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgY29kZSB0aGF0IHZhbGlkYXRlcyB0aGUgc2VsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgeworICAgICAgICBQcmVzZW50U2VsZWN0b3IgcyA9IChQcmVzZW50U2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuY3JlYXRlTWFwcGVyKCk7CisgICAgICAgICAgICBzLmNyZWF0ZU1hcHBlcigpOworICAgICAgICAgICAgZmFpbCgiUHJlc2VudFNlbGVjdG9yIGFsbG93ZWQgbW9yZSB0aGFuIG9uZSBuZXN0ZWQgbWFwcGVyLiIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciIsCisgICAgICAgICAgICAgICAgICAgIGJlMS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcyA9IChQcmVzZW50U2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJQcmVzZW50U2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdGFyZ2V0ZGlyIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4iLAorICAgICAgICAgICAgICAgICAgICBiZTIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlbGVjdG9yIGlzIHNlbGVjdGluZyBmaWxlcyBjb3JyZWN0bHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91cigpIHsKKyAgICAgICAgUHJlc2VudFNlbGVjdG9yIHM7CisgICAgICAgIFN0cmluZyByZXN1bHRzOworICAgICAgICBNYXBwZXIgbTsKKyAgICAgICAgTWFwcGVyLk1hcHBlclR5cGUgaWRlbnRpdHkgPSBuZXcgTWFwcGVyLk1hcHBlclR5cGUoKTsKKyAgICAgICAgaWRlbnRpdHkuc2V0VmFsdWUoImlkZW50aXR5Iik7CisgICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIGdsb2IgPSBuZXcgTWFwcGVyLk1hcHBlclR5cGUoKTsKKyAgICAgICAgZ2xvYi5zZXRWYWx1ZSgiZ2xvYiIpOworICAgICAgICBNYXBwZXIuTWFwcGVyVHlwZSBtZXJnZSA9IG5ldyBNYXBwZXIuTWFwcGVyVHlwZSgpOworICAgICAgICBtZXJnZS5zZXRWYWx1ZSgibWVyZ2UiKTsKKyAgICAgICAgTWFwcGVyLk1hcHBlclR5cGUgZmxhdHRlbiA9IG5ldyBNYXBwZXIuTWFwcGVyVHlwZSgpOworICAgICAgICBmbGF0dGVuLnNldFZhbHVlKCJmbGF0dGVuIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ha2VCZWQoKTsKKworICAgICAgICAgICAgcyA9IChQcmVzZW50U2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKGJlZGRpcik7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChQcmVzZW50U2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKGJlZGRpcik7CisgICAgICAgICAgICBtID0gcy5jcmVhdGVNYXBwZXIoKTsKKyAgICAgICAgICAgIG0uc2V0VHlwZShpZGVudGl0eSk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChQcmVzZW50U2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIEZpbGUgc3ViZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZCIpOworICAgICAgICAgICAgcy5zZXRUYXJnZXRkaXIoc3ViZGlyKTsKKyAgICAgICAgICAgIG0gPSBzLmNyZWF0ZU1hcHBlcigpOworICAgICAgICAgICAgbS5zZXRUeXBlKGZsYXR0ZW4pOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVFRUVFRUVFRUVFRGIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoUHJlc2VudFNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldFRhcmdldGRpcihiZWRkaXIpOworICAgICAgICAgICAgbSA9IHMuY3JlYXRlTWFwcGVyKCk7CisgICAgICAgICAgICBtLnNldFR5cGUobWVyZ2UpOworICAgICAgICAgICAgbS5zZXRUbygiYXNmLWxvZ28uZ2lmLmd6Iik7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChQcmVzZW50U2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHN1YmRpciA9IG5ldyBGaWxlKGJlZGRpciwgInRhci9iejIiKTsKKyAgICAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKHN1YmRpcik7CisgICAgICAgICAgICBtID0gcy5jcmVhdGVNYXBwZXIoKTsKKyAgICAgICAgICAgIG0uc2V0VHlwZShnbG9iKTsKKyAgICAgICAgICAgIG0uc2V0RnJvbSgiKi5iejIiKTsKKyAgICAgICAgICAgIG0uc2V0VG8oIioudGFyLmJ6MiIpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZURkZGRkZGRkZGIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFrZU1pcnJvcigpOworCisgICAgICAgICAgICAgICAgcyA9IChQcmVzZW50U2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBzdWJkaXIgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInNlbGVjdG9ydGVzdDIiKTsKKyAgICAgICAgICAgICAgICBzLnNldFRhcmdldGRpcihzdWJkaXIpOworICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBtaXJyb3JTZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRGRlRUVFRUVFQiLCByZXN1bHRzKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVFRURkZUVFRUVFRUIiwgcmVzdWx0cyk7CisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xlYW51cE1pcnJvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBjbGVhbnVwQmVkKCk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9SRUFETUUgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjQ4ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9SRUFETUUKQEAgLTAsMCArMSw5NiBAQAorQSBERVNDUklQVElPTiBPRiBUSEUgU0VMRUNUT1IgVEVTVCBGUkFNRVdPUksKKworV2hlbiB3cml0aW5nIHRlc3RzIGZvciBzZWxlY3RvcnMsIEkgZm91bmQgdGhhdCBJIHdhbnRlZCB0byBoYXZlIHNvbWUKK3N0YW5kYXJkIHdheSBvZiB3b3JraW5nIHdpdGggYSBzZXQgb2YgZmlsZXMgYW5kIHRlc3Rpbmcgd2hldGhlciBvbmUgb3IKK2Fub3RoZXIgb2YgdGhlbSB3YXMgc2VsZWN0ZWQuIFRvIHRoYXQgZW5kLCBJIGNyZWF0ZWQgYSBiYXNlIGNsYXNzIGNhbGxlZAorQmFzZVNlbGVjdG9yVGVzdCB0aGF0IGRvZXMgbW9zdCBvZiB0aGUgaGVhdnkgbGlmdGluZy4gT2YgY291cnNlLCB5b3UgY2FuCit0ZXN0IHlvdXIgc2VsZWN0b3JzIGFueSB3YXkgeW91IHdhbnQsIGJ1dCBpZiB5b3Ugd2FudCB0byByZXVzZSB0aGlzIGNvZGUsCityZWFkIG9uLgorCitXaGF0IEJhc2VTZWxlY3RvclRlc3QgZG9lcyBpcyB1c2UgYW4gYW50IGJ1aWxkIGZpbGUKKyJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3Rvci54bWwiIHRvIGNvcHkgYSB0cmVlIG9mIGZpbGVzIG91dCBvZgorInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkIiBpbnRvIGEgInNlbGVjdG9ydGVzdCIgZGlyZWN0b3JpZXMuCitUaGVuIGl0IHRha2VzIGEgbGlzdCBvZiAxMiBvZiB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIHRoaXMgdHJlZSwgYW5kCithcHBsaWVzIHdoYXRldmVyIHNlbGVjdG9yIHlvdSBwYXNzIGluIHRvIGVhY2ggb25lLiBJdCBwYXNzZXMgYmFjayB0byB5b3VyCit0ZXN0IGEgMTIgY2hhcmFjdGVyIGxvbmcgc3RyaW5nIGluZGljYXRpbmcgd2hpY2ggb2YgdGhlIDEyIGZpbGVzIGFuZAorZGlyZWN0b3JpZXMgd2FzIHNlbGVjdGVkLCB1c2luZyAnVCcgZm9yIHNlbGVjdGVkIGFuZCAnRicgZm9yIG5vdCBzZWxlY3RlZC4KK0luIHRoZSBUZXN0IGNsYXNzIGZvciB5b3VyIHNlbGVjdG9yLCB5b3Ugb3ZlcnJpZGUgdGhlIGdldEluc3RhbmNlKCkgbWV0aG9kCit0byBjcmVhdGUgeW91ciBvd24gdHlwZSBvZiBzZWxlY3RvciwgYW5kIHNldCB0aGUgZWxlbWVudHMgb2YgeW91ciBzZWxlY3RvcgorYSB2YXJpZXR5IG9mIHdheXMgdG8gZW5zdXJlIHRoYXQgdGhlIHN0cmluZyBvZiBUJ3MgYW5kIEYncyByZXR1cm5lZCB3aGVuCit0aGUgc2VsZWN0b3IgaXMgYXBwbGllZCB0byB0aG9zZSAxMiBmaWxlcyBpcyBjb3JyZWN0LgorCitTbywgZm9yIGV4YW1wbGUsIERlcHRoU2VsZWN0b3JUZXN0LmphdmEgZXh0ZW5kcyBCYXNlU2VsZWN0b3JUZXN0IGFuZCBoYXMKK3RoZSBmb2xsb3dpbmcgY29kZToKKworCisgICAgcHVibGljIEJhc2VTZWxlY3RvciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEZXB0aFNlbGVjdG9yKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyKCkgeworICAgICAgICBEZXB0aFNlbGVjdG9yIHM7CisgICAgICAgIFN0cmluZyByZXN1bHRzOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ha2VCZWQoKTsKKworCisgICAgICAgICAgICBzID0gKERlcHRoU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0TWluKDIwKTsKKyAgICAgICAgICAgIHMuc2V0TWF4KDI1KTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZGRkZGRkZGRkZGRiIsIHJlc3VsdHMpOworCisKKyAgICAgICAgICAgIHMgPSAoRGVwdGhTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXRNaW4oMCk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCByZXN1bHRzKTsKKworCisgICAgICAgICAgICBzID0gKERlcHRoU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0TWluKDEpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZUVFRUVFRUIiwgcmVzdWx0cyk7CisKKworVGhlIGZpcnN0IHRlc3Qgc2F5cyB0aGF0IG5vbmUgb2YgdGhlIDEyIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHdpbGwgbWF0Y2ggaWYKK3RoZSBkZXB0aCByYW5nZSBmb3IgdGhlIHNlbGVjdG9yIGlzIGJldHdlZW4gMjAgYW5kIDI1ICh0aGF0IHdvdWxkIGJlIG9uZQorZGVlcCBkaXJlY3RvcnkgdHJlZSEpLiBUaGUgc2Vjb25kIHNheXMgdGhhdCBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCittYXRjaCBpZiB0aGUgbWluaW11bSBkZXB0aCBpcyBzZXQgdG8gMCBhbmQgdGhlIG1heGltdW0gaXNuJ3Qgc3BlY2lmaWVkLiBUaGUKK3RoaXJkIHRlc3Qgc2F5cyB0aGF0IGlmIHRoZSBtaW51bXVtIGRlcHRoIGlzIDEsIHRoZSBmaXJzdCA1IGVudHJpZXMgaW4gdGhlCitsaXN0IG9mIDEyIHdpbGwgbm90IGJlIHNlbGVjdGVkIGFuZCB0aGUgcmVzdCB3aWxsLgorCisKK1lvdSBjYW4gZmluZCB0aGUgMTIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHRlc3RlZCBmb3Igc2VsZWN0aW9uIGluCit0aGUgQmFzZVNlbGVjdG9yVGVzdCBjbGFzcy4gSSB1c2VkIGEgZml4ZWQgbGlzdCBzbyB0aGF0IGlmIHNvbWVvbmUgYWRkZWQKK25ldyBmaWxlcyB0byB0aGUgc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMgZGlyZWN0b3J5IGl0IHdvdWxkbid0IGJyZWFrIG15Cit0ZXN0czoKKworCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGZpbGVuYW1lcyA9IHsiLiIsImFzZi1sb2dvLmdpZi5tZDUiLCJhc2YtCisgICAgbG9nby5naWYuYnoyIiwKKyAgICAgICAgICAgICJhc2YtbG9nby5naWYuZ3oiLCJjb3B5LmZpbHRlcnNldC5maWx0ZXJlZCIsInppcC9hc2YtCisgICAgICAgICAgICBsb2dvLmdpZi56aXAiLAorICAgICAgICAgICAgInRhci9hc2YtbG9nby5naWYudGFyIiwidGFyL2FzZi1sb2dvLWh1Z2UudGFyLmd6IiwKKyAgICAgICAgICAgICJ0YXIvZ3ovYXNmLWxvZ28uZ2lmLnRhci5neiIsInRhci9iejIvYXNmLWxvZ28uZ2lmLnRhci5iejIiLAorICAgICAgICAgICAgInRhci9iejIvYXNmLWxvZ28taHVnZS50YXIuYnoyIiwidGFyL2J6MiJ9OworCisKK0lmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIHNldCBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdG8gdGVzdCB5b3VyIHNlbGVjdG9yLAoreW91IGNhbiByZXVzZSB0aGUgQmFzZVNlbGVjdG9yVGVzdCB3aXRoIG5vIGNoYW5nZSB0byBpdC4KKworWW91IG1heSBmaW5kIHlvdSBuZWVkIHRvIGFsdGVyIHRoZSBidWlsZCBmaWxlIHNvIHRoYXQgeW91IGdldCBzb21lCit2YXJpYXRpb24gaW4gdGhlIGZpbGVzIHRoYXQgeW91ciBzZWxlY3RvciBjYW4gd29yayB3aXRoLiBNb3N0IG9mIHRoZSBjb3JlCitzZWxlY3RvcnMgaGF2ZSByZXF1aXJlZCB0aGF0IGtpbmQgb2YgbW9kaWZpY2F0aW9uLiBJZiB5b3UgZG8gdGhhdCwgbWFrZQorc3VyZSB0aGF0IGl0IGRvZXNuJ3QgYWx0ZXIgdGhlIG91dHB1dCBzdHJpbmdzIG9uIHRoZSBvdGhlciBzZWxlY3RvciB0ZXN0LAorb3IgaWYgaXQgZG9lcyB0aGF0IHlvdSB1cGRhdGUgdGhlaXIgZXhwZWN0ZWQgcmV0dXJuIHJlc3VsdHMuCisKK1lvdSBtYXkgYWxzbyB3YW50IHRvIGFsdGVyIHRoZSBzZXQgb2YgZmlsZXMgeW91IGxvb2sgYXQgaW4gYSBwYXJ0aWN1bGFyCitzZWxlY3RvciB0ZXN0LiBTaW5jZSB0aGUgZmlsZWxpc3QgaW4gQmFzZVNlbGVjdG9yVGVzdCBpcyBwcm90ZWN0ZWQsIHlvdQorc2hvdWxkIGJlIGFibGUgdG8gb3ZlcnJpZGUgaXQgYXMgeW91IG5lZWQgdG8uIE9yIHlvdSBjYW4gYWx0ZXIgdGhlIGZpbGVzZXQKK2luIEJhc2VTZWxlY3RvclRlc3QgaXRzZWxmLCBwcm92aWRlZCB5b3UgdXBkYXRlIHRoZSB0ZXN0IHN0cmluZ3MgaW4gYWxsIHRoZQorb3RoZXIgdW5pdCB0ZXN0cy4KKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TaWduZWRTZWxlY3RvclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2lnbmVkU2VsZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5MzhiOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2lnbmVkU2VsZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVRlc3Q7CisKKy8qKgorICogVGVzdGNhc2UgZm9yIHRoZSAmbHQ7c2lnbmVkc2VsZWN0b3ImZ3Q7IHNlbGVjdG9yLgorICoKKyAqLworcHVibGljIGNsYXNzIFNpZ25lZFNlbGVjdG9yVGVzdCBleHRlbmRzIEJ1aWxkRmlsZVRlc3QgeworCisgICAgcHVibGljIFNpZ25lZFNlbGVjdG9yVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy9zaWduZWRzZWxlY3Rvci54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0U2lnbmVkKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJzZWxlY3RzaWduZWQiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdE5vdFNlbGVjdGVkKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJub3RzZWxlY3RlZCIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgibmFtZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2l6ZVNlbGVjdG9yVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TaXplU2VsZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmY2Y0YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2l6ZVNlbGVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CisKKy8qKgorICogVGVzdHMgU2l6ZSBTZWxlY3RvcnMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTaXplU2VsZWN0b3JUZXN0IGV4dGVuZHMgQmFzZVNlbGVjdG9yVGVzdCB7CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIHB1YmxpYyBTaXplU2VsZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIGZyb20gYmFzZSBjbGFzcy4gVGhpcyBpcyBvdmVycmlkZW4gaW4gY2hpbGQKKyAgICAgKiBjbGFzc2VzIHRvIHJldHVybiBhIHNwZWNpZmljIFNlbGVjdG9yIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBCYXNlU2VsZWN0b3IgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgU2l6ZVNlbGVjdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgY29kZSB0aGF0IHZhbGlkYXRlcyB0aGUgc2VsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgeworICAgICAgICBTaXplU2VsZWN0b3IgcyA9IChTaXplU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJTaXplU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdmFsdWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkLCBhbmQgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICsgImJlIHBvc2l0aXZlIiwgYmUxLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBzID0gKFNpemVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICBzLnNldFZhbHVlKC0xMCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzLmlzU2VsZWN0ZWQoYmFzZWRpcixmaWxlbmFtZXNbMF0sZmlsZXNbMF0pOworICAgICAgICAgICAgZmFpbCgiU2l6ZVNlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIHZhbHVlIGJlaW5nIGluIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICsgImFsbG93YWJsZSByYW5nZSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCwgYW5kIG11c3QgIgorICAgICAgICAgICAgICAgICAgICArICJiZSBwb3NpdGl2ZSIsIGJlMi5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcyA9IChTaXplU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOworICAgICAgICBwYXJhbS5zZXROYW1lKCJnYXJiYWdlIGluIik7CisgICAgICAgIHBhcmFtLnNldFZhbHVlKCJnYXJiYWdlIG91dCIpOworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSB7cGFyYW19OworICAgICAgICBzLnNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuaXNTZWxlY3RlZChiYXNlZGlyLGZpbGVuYW1lc1swXSxmaWxlc1swXSk7CisgICAgICAgICAgICBmYWlsKCJTaXplU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgdmFsaWQgcGFyYW1ldGVyIGVsZW1lbnQiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgcGFyYW1ldGVyIGdhcmJhZ2UgaW4iLCBiZTMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSAoU2l6ZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOworICAgICAgICBwYXJhbS5zZXROYW1lKCJ2YWx1ZSIpOworICAgICAgICBwYXJhbS5zZXRWYWx1ZSgiZ2FyYmFnZSBvdXQiKTsKKyAgICAgICAgcGFyYW1zWzBdID0gcGFyYW07CisgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcy5pc1NlbGVjdGVkKGJhc2VkaXIsZmlsZW5hbWVzWzBdLGZpbGVzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIlNpemVTZWxlY3RvciBhY2NlcHRlZCBiYWQgdmFsdWUgYXMgcGFyYW1ldGVyIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlNCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIHNpemUgc2V0dGluZyBnYXJiYWdlIG91dCIsCisgICAgICAgICAgICAgICAgICAgIGJlNC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcyA9IChTaXplU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtMSA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtMiA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgcGFyYW0xLnNldE5hbWUoInZhbHVlIik7CisgICAgICAgIHBhcmFtMS5zZXRWYWx1ZSgiNSIpOworICAgICAgICBwYXJhbTIuc2V0TmFtZSgidW5pdHMiKTsKKyAgICAgICAgcGFyYW0yLnNldFZhbHVlKCJnYXJiYWdlIG91dCIpOworICAgICAgICBwYXJhbXMgPSBuZXcgUGFyYW1ldGVyWzJdOworICAgICAgICBwYXJhbXNbMF0gPSBwYXJhbTE7CisgICAgICAgIHBhcmFtc1sxXSA9IHBhcmFtMjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICAgICAgcy5pc1NlbGVjdGVkKGJhc2VkaXIsZmlsZW5hbWVzWzBdLGZpbGVzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIlNpemVTZWxlY3RvciBhY2NlcHRlZCBiYWQgdW5pdHMgYXMgcGFyYW1ldGVyIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlNSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnYXJiYWdlIG91dCBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICBiZTUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlbGVjdG9yIGlzIHNlbGVjdGluZyBmaWxlcyBjb3JyZWN0bHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91cigpIHsKKyAgICAgICAgU2l6ZVNlbGVjdG9yIHM7CisgICAgICAgIFN0cmluZyByZXN1bHRzOworCisgICAgICAgIFNpemVTZWxlY3Rvci5CeXRlVW5pdHMga2lsbyA9IG5ldyBTaXplU2VsZWN0b3IuQnl0ZVVuaXRzKCk7CisgICAgICAgIGtpbG8uc2V0VmFsdWUoIksiKTsKKyAgICAgICAgU2l6ZVNlbGVjdG9yLkJ5dGVVbml0cyBraWJpID0gbmV3IFNpemVTZWxlY3Rvci5CeXRlVW5pdHMoKTsKKyAgICAgICAga2liaS5zZXRWYWx1ZSgiS2kiKTsKKyAgICAgICAgU2l6ZVNlbGVjdG9yLkJ5dGVVbml0cyB0aWJpID0gbmV3IFNpemVTZWxlY3Rvci5CeXRlVW5pdHMoKTsKKyAgICAgICAgdGliaS5zZXRWYWx1ZSgiVGkiKTsKKyAgICAgICAgU2l6ZVNlbGVjdG9yLlNpemVDb21wYXJpc29ucyBsZXNzID0gbmV3IFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMoKTsKKyAgICAgICAgbGVzcy5zZXRWYWx1ZSgibGVzcyIpOworICAgICAgICBTaXplU2VsZWN0b3IuU2l6ZUNvbXBhcmlzb25zIGVxdWFsID0gbmV3IFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMoKTsKKyAgICAgICAgZXF1YWwuc2V0VmFsdWUoImVxdWFsIik7CisgICAgICAgIFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMgbW9yZSA9IG5ldyBTaXplU2VsZWN0b3IuU2l6ZUNvbXBhcmlzb25zKCk7CisgICAgICAgIG1vcmUuc2V0VmFsdWUoIm1vcmUiKTsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYWtlQmVkKCk7CisKKyAgICAgICAgICAgIHMgPSAoU2l6ZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldFZhbHVlKDEwKTsKKyAgICAgICAgICAgIHMuc2V0V2hlbihsZXNzKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGRkZGRkZGVCIsIHJlc3VsdHMpOworCisgICAgICAgICAgICBzID0gKFNpemVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXRWYWx1ZSgxMCk7CisgICAgICAgICAgICBzLnNldFdoZW4obW9yZSk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChTaXplU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0VmFsdWUoMzIpOworICAgICAgICAgICAgcy5zZXRXaGVuKGVxdWFsKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZURkZGRkZGVCIsIHJlc3VsdHMpOworCisgICAgICAgICAgICBzID0gKFNpemVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXRWYWx1ZSg3KTsKKyAgICAgICAgICAgIHMuc2V0V2hlbihtb3JlKTsKKyAgICAgICAgICAgIHMuc2V0VW5pdHMoa2lsbyk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURlRGRlRUVFRUVFQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChTaXplU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0VmFsdWUoNyk7CisgICAgICAgICAgICBzLnNldFdoZW4obW9yZSk7CisgICAgICAgICAgICBzLnNldFVuaXRzKGtpYmkpOworICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGVjdGlvblN0cmluZyhzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVEZURkZGVFRGVFRUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgICAgIHMgPSAoU2l6ZVNlbGVjdG9yKWdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzLnNldFZhbHVlKDk5OTk5KTsKKyAgICAgICAgICAgIHMuc2V0V2hlbihtb3JlKTsKKyAgICAgICAgICAgIHMuc2V0VW5pdHModGliaSk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGRkZGRlQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChTaXplU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbTEgPSBuZXcgUGFyYW1ldGVyKCk7CisgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0yID0gbmV3IFBhcmFtZXRlcigpOworICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtMyA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgIHBhcmFtMS5zZXROYW1lKCJ2YWx1ZSIpOworICAgICAgICAgICAgcGFyYW0xLnNldFZhbHVlKCIyMCIpOworICAgICAgICAgICAgcGFyYW0yLnNldE5hbWUoInVuaXRzIik7CisgICAgICAgICAgICBwYXJhbTIuc2V0VmFsdWUoIktpIik7CisgICAgICAgICAgICBwYXJhbTMuc2V0TmFtZSgid2hlbiIpOworICAgICAgICAgICAgcGFyYW0zLnNldFZhbHVlKCJtb3JlIik7CisgICAgICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSB7cGFyYW0xLHBhcmFtMixwYXJhbTN9OworICAgICAgICAgICAgcy5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGVEZGVFQiLCByZXN1bHRzKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsZWFudXBCZWQoKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1R5cGVTZWxlY3RvclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVHlwZVNlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNTgxNzcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1R5cGVTZWxlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgVHlwZSBTZWxlY3RvcnMuCisgKgorICovCitwdWJsaWMgY2xhc3MgVHlwZVNlbGVjdG9yVGVzdCBleHRlbmRzIEJhc2VTZWxlY3RvclRlc3QgeworCisgICAgcHVibGljIFR5cGVTZWxlY3RvclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgZnJvbSBiYXNlIGNsYXNzLiBUaGlzIGlzIG92ZXJyaWRlbiBpbiBjaGlsZAorICAgICAqIGNsYXNzZXMgdG8gcmV0dXJuIGEgc3BlY2lmaWMgU2VsZWN0b3IgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIEJhc2VTZWxlY3RvciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2VsZWN0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBjb2RlIHRoYXQgdmFsaWRhdGVzIHRoZSBzZWxlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUoKSB7CisgICAgICAgIFR5cGVTZWxlY3RvciBzID0gKFR5cGVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcy5pc1NlbGVjdGVkKGJhc2VkaXIsZmlsZW5hbWVzWzBdLGZpbGVzWzBdKTsKKyAgICAgICAgICAgIGZhaWwoIlR5cGVTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIKKyAgICAgICAgICAgICAgICAgICAgLCBiZTEuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWxlY3RvciBpcyBzZWxlY3RpbmcgZmlsZXMgY29ycmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXIoKSB7CisgICAgICAgIFR5cGVTZWxlY3RvciBzOworICAgICAgICBTdHJpbmcgcmVzdWx0czsKKworICAgICAgICBUeXBlU2VsZWN0b3IuRmlsZVR5cGUgZGlyZWN0b3J5ID0gbmV3CisgICAgICAgICAgICAgICAgVHlwZVNlbGVjdG9yLkZpbGVUeXBlKCk7CisgICAgICAgIGRpcmVjdG9yeS5zZXRWYWx1ZSgiZGlyIik7CisgICAgICAgIFR5cGVTZWxlY3Rvci5GaWxlVHlwZSBmaWxlID0gbmV3CisgICAgICAgICAgICAgICAgVHlwZVNlbGVjdG9yLkZpbGVUeXBlKCk7CisgICAgICAgIGZpbGUuc2V0VmFsdWUoImZpbGUiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFrZUJlZCgpOworCisgICAgICAgICAgICBzID0gKFR5cGVTZWxlY3RvcilnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgcy5zZXRUeXBlKGRpcmVjdG9yeSk7CisgICAgICAgICAgICByZXN1bHRzID0gc2VsZWN0aW9uU3RyaW5nKHMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGRkZGRlQiLCByZXN1bHRzKTsKKworICAgICAgICAgICAgcyA9IChUeXBlU2VsZWN0b3IpZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIHMuc2V0VHlwZShmaWxlKTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxlY3Rpb25TdHJpbmcocyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZUVFRUVFRUVFRURiIsIHJlc3VsdHMpOworCisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsZWFudXBCZWQoKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DbGFzc3BhdGhVdGlsc1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NsYXNzcGF0aFV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NzVmNjUKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DbGFzc3BhdGhVdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCisKKy8qKgorICogVGVzdCBjYXNlIGZvciBDbGFzc3BhdGhVdGlscworICoKKyAqLworcHVibGljIGNsYXNzIENsYXNzcGF0aFV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgUHJvamVjdCBwOworCisgICAgcHVibGljIENsYXNzcGF0aFV0aWxzVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIHAuaW5pdCgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdE9ubHlPbmVJbnN0YW5jZSgpIHsKKyAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb247CisgICAgICAgIFN0cmluZyBsaXN0ID0gIiI7CisgICAgICAgIENsYXNzTG9hZGVyIGMgPSBDbGFzc3BhdGhVdGlscy5nZXRVbmlxdWVDbGFzc0xvYWRlckZvclBhdGgocCwgKFBhdGgpIG51bGwsIGZhbHNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudW1lcmF0aW9uID0gYy5nZXRSZXNvdXJjZXMoCisgICAgICAgICAgICAgICAgIm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IHRoZSBkZWZhdWx0cy5wcm9wZXJ0aWVzIHJlc291cmNlIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBsaXN0ID0gbGlzdCArICIgIiArIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBiZSBvbmx5IG9uZSBhbmQgbm90ICIgKyBjb3VudCArICIgIiArIGxpc3QsIGNvdW50ID09IDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbGxlY3Rpb25VdGlsc1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbGxlY3Rpb25VdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBjMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29sbGVjdGlvblV0aWxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ29sbGVjdGlvblV0aWxzLgorICoKKyAqLworcHVibGljIGNsYXNzIENvbGxlY3Rpb25VdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvblV0aWxzVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVjdG9yRXF1YWxzKCkgeworICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKG51bGwsIG5ldyBWZWN0b3IoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKG5ldyBWZWN0b3IoKSwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKENvbGxlY3Rpb25VdGlscy5lcXVhbHMobmV3IFZlY3RvcigpLCBuZXcgVmVjdG9yKCkpKTsKKyAgICAgICAgVmVjdG9yIHYxID0gbmV3IFZlY3RvcigpOworICAgICAgICBTdGFjayBzMiA9IG5ldyBTdGFjaygpOworICAgICAgICB2MS5hZGRFbGVtZW50KCJmb28iKTsKKyAgICAgICAgczIucHVzaCgiZm9vIik7CisgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyh2MSwgczIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHMyLCB2MSkpOworICAgICAgICB2MS5hZGRFbGVtZW50KCJiYXIiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyh2MSwgczIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhzMiwgdjEpKTsKKyAgICAgICAgczIucHVzaCgiYmFyIik7CisgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyh2MSwgczIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHMyLCB2MSkpOworICAgICAgICBzMi5wdXNoKCJiYXoiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyh2MSwgczIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhzMiwgdjEpKTsKKyAgICAgICAgdjEuYWRkRWxlbWVudCgiYmF6Iik7CisgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyh2MSwgczIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHMyLCB2MSkpOworICAgICAgICB2MS5hZGRFbGVtZW50KCJ6eXp6eSIpOworICAgICAgICBzMi5wdXNoKCJ6eXp6eTIiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyh2MSwgczIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhzMiwgdjEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGljdGlvbmFyeUVxdWFscygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhudWxsLCBuZXcgSGFzaHRhYmxlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhuZXcgSGFzaHRhYmxlKCksIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKG5ldyBIYXNodGFibGUoKSwgbmV3IFByb3BlcnRpZXMoKSkpOworICAgICAgICBIYXNodGFibGUgaDEgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIFByb3BlcnRpZXMgcDIgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBoMS5wdXQoImZvbyIsICIiKTsKKyAgICAgICAgcDIucHV0KCJmb28iLCAiIik7CisgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOworICAgICAgICBoMS5wdXQoImJhciIsICIiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhwMiwgaDEpKTsKKyAgICAgICAgcDIucHV0KCJiYXIiLCAiIik7CisgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOworICAgICAgICBwMi5wdXQoImJheiIsICIiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhwMiwgaDEpKTsKKyAgICAgICAgaDEucHV0KCJiYXoiLCAiIik7CisgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOworICAgICAgICBoMS5wdXQoInp5enp5IiwgIiIpOworICAgICAgICBwMi5wdXQoInp5enp5MiIsICIiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhwMiwgaDEpKTsKKyAgICAgICAgcDIucHV0KCJ6eXp6eSIsICIiKTsKKyAgICAgICAgaDEucHV0KCJ6eXp6eTIiLCAiIik7CisgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOworICAgICAgICBoMS5wdXQoImRhZGEiLCAiMSIpOworICAgICAgICBwMi5wdXQoImRhZGEiLCAiMiIpOworICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKGgxLCBwMikpOworICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RPTUVsZW1lbnRXcml0ZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9ET01FbGVtZW50V3JpdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmQ2MjkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9ET01FbGVtZW50V3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIFRlc3RzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRPTUVsZW1lbnRXcml0ZXIuCisgKgorICovCitwdWJsaWMgY2xhc3MgRE9NRWxlbWVudFdyaXRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIERPTUVsZW1lbnRXcml0ZXIgdyA9IG5ldyBET01FbGVtZW50V3JpdGVyKCk7CisKKyAgICBwdWJsaWMgRE9NRWxlbWVudFdyaXRlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzUmVmZXJlbmNlKCkgeworICAgICAgICBhc3NlcnRUcnVlKCImIzIwOyIsIHcuaXNSZWZlcmVuY2UoIiYjMjA7IikpOworICAgICAgICBhc3NlcnRUcnVlKCImI3gyMDsiLCB3LmlzUmVmZXJlbmNlKCImI3gyMDsiKSk7CisgICAgICAgIGFzc2VydFRydWUoIiYjeEEwOyIsIHcuaXNSZWZlcmVuY2UoIiYjeEEwOyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiJiNBMDsiLCAhdy5pc1JlZmVyZW5jZSgiJiNBMDsiKSk7CisgICAgICAgIGFzc2VydFRydWUoIjIwOyIsICF3LmlzUmVmZXJlbmNlKCIyMDsiKSk7CisgICAgICAgIGFzc2VydFRydWUoIiYjMjAiLCAhdy5pc1JlZmVyZW5jZSgiJiMyMCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiJnF1b3Q7Iiwgdy5pc1JlZmVyZW5jZSgiJnF1b3Q7IikpOworICAgICAgICBhc3NlcnRUcnVlKCImYXBvczsiLCB3LmlzUmVmZXJlbmNlKCImYXBvczsiKSk7CisgICAgICAgIGFzc2VydFRydWUoIiZndDsiLCB3LmlzUmVmZXJlbmNlKCImZ3Q7IikpOworICAgICAgICBhc3NlcnRUcnVlKCImbHQ7Iiwgdy5pc1JlZmVyZW5jZSgiJmx0OyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiJmFtcDsiLCB3LmlzUmVmZXJlbmNlKCImYW1wOyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIiYjMjA7Iiwgdy5lbmNvZGUoIiYjMjA7IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiYjeDIwOyIsIHcuZW5jb2RlKCImI3gyMDsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiJiN4QTA7Iiwgdy5lbmNvZGUoIiYjeEEwOyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCImYW1wOyNBMDsiLCB3LmVuY29kZSgiJiNBMDsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjA7Iiwgdy5lbmNvZGUoIjIwOyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCImYW1wOyMyMCIsIHcuZW5jb2RlKCImIzIwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiZxdW90OyIsIHcuZW5jb2RlKCImcXVvdDsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiJmFwb3M7Iiwgdy5lbmNvZGUoIiZhcG9zOyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCImZ3Q7Iiwgdy5lbmNvZGUoIiZndDsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiJmx0OyIsIHcuZW5jb2RlKCImbHQ7IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiZhbXA7Iiwgdy5lbmNvZGUoIiZhbXA7IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiZxdW90OyIsIHcuZW5jb2RlKCJcIiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCImbHQ7Iiwgdy5lbmNvZGUoIjwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiJmFtcDsiLCB3LmVuY29kZSgiJiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3LmVuY29kZSgiXHUwMDE3IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiYjMjA7XCIyMDsmIiwgdy5lbmNvZGVkYXRhKCImIzIwO1wiMjA7JiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3LmVuY29kZWRhdGEoIlx1MDAxNyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNMZWdhbENoYXJhY3RlcigpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiMHgwMCIsICF3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1MDAwMCcpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiMHgwOSIsIHcuaXNMZWdhbENoYXJhY3RlcignXHQnKSk7CisgICAgICAgIGFzc2VydFRydWUoIjB4MEEiLCB3LmlzTGVnYWxDaGFyYWN0ZXIoJ1xuJykpOworICAgICAgICBhc3NlcnRUcnVlKCIweDBDIiwgdy5pc0xlZ2FsQ2hhcmFjdGVyKCdccicpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiMHgxRiIsICF3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1MDAxRicpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiMHgyMCIsIHcuaXNMZWdhbENoYXJhY3RlcignXHUwMDIwJykpOworICAgICAgICBhc3NlcnRUcnVlKCIweEQ3RkYiLCB3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1RDdGRicpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiMHhEODAwIiwgIXcuaXNMZWdhbENoYXJhY3RlcignXHVEODAwJykpOworICAgICAgICBhc3NlcnRUcnVlKCIweERGRkYiLCAhdy5pc0xlZ2FsQ2hhcmFjdGVyKCdcdURGRkYnKSk7CisgICAgICAgIGFzc2VydFRydWUoIjB4RTAwMCIsIHcuaXNMZWdhbENoYXJhY3RlcignXHVFMDAwJykpOworICAgICAgICBhc3NlcnRUcnVlKCIweEZGRkQiLCB3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1RkZGRCcpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiMHhGRkZFIiwgIXcuaXNMZWdhbENoYXJhY3RlcignXHVGRkZFJykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDREFUQUVuZEVuY29kaW5nKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIl0+Iiwgdy5lbmNvZGVkYXRhKCJdPiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJdXSIsIHcuZW5jb2RlZGF0YSgiXV0iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiJiN4NWQ7JiN4NWQ7Jmd0OyIsIHcuZW5jb2RlZGF0YSgiXV0+IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiYjeDVkOyYjeDVkOyZndDtBIiwgdy5lbmNvZGVkYXRhKCJdXT5BIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEmI3g1ZDsmI3g1ZDsmZ3Q7Iiwgdy5lbmNvZGVkYXRhKCJBXV0+IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEmI3g1ZDsmI3g1ZDsmZ3Q7QSIsIHcuZW5jb2RlZGF0YSgiQV1dPkEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQSYjeDVkOyYjeDVkOyZndDtCJiN4NWQ7JiN4NWQ7Jmd0O0MiLAorICAgICAgICAgICAgICAgICAgICAgdy5lbmNvZGVkYXRhKCJBXV0+Ql1dPkMiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQWRkaXRpb25hbFdoaXRlU3BhY2VGb3JUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRG9jdW1lbnQgZCA9IERPTVV0aWxzLm5ld0RvY3VtZW50KCk7CisgICAgICAgIEVsZW1lbnQgcm9vdCA9IGQuY3JlYXRlRWxlbWVudCgicm9vdCIpOworICAgICAgICBET01VdGlscy5hcHBlbmRUZXh0RWxlbWVudChyb290LCAidGV4dEVsZW1lbnQiLCAiY29udGVudCIpOworCisgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0gbmV3IERPTUVsZW1lbnRXcml0ZXIoKTsKKyAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiPHJvb3Q+IiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCisgICAgICAgICAgICAgICAgICAgICArICIgIDx0ZXh0RWxlbWVudD5jb250ZW50PC90ZXh0RWxlbWVudD4iCisgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCisgICAgICAgICAgICAgICAgICAgICArICI8L3Jvb3Q+IiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLAorICAgICAgICAgICAgICAgICAgICAgc3cudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQWRkaXRpb25hbFdoaXRlU3BhY2VGb3JDREFUQSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50IGQgPSBET01VdGlscy5uZXdEb2N1bWVudCgpOworICAgICAgICBFbGVtZW50IHJvb3QgPSBkLmNyZWF0ZUVsZW1lbnQoInJvb3QiKTsKKyAgICAgICAgRE9NVXRpbHMuYXBwZW5kQ0RBVEFFbGVtZW50KHJvb3QsICJjZGF0YUVsZW1lbnQiLCAiY29udGVudCIpOworCisgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0gbmV3IERPTUVsZW1lbnRXcml0ZXIoKTsKKyAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiPHJvb3Q+IiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCisgICAgICAgICAgICAgICAgICAgICArICIgIDxjZGF0YUVsZW1lbnQ+PCFbQ0RBVEFbY29udGVudF1dPjwvY2RhdGFFbGVtZW50PiIKKyAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKKyAgICAgICAgICAgICAgICAgICAgICsgIjwvcm9vdD4iICsgU3RyaW5nVXRpbHMuTElORV9TRVAsCisgICAgICAgICAgICAgICAgICAgICBzdy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9BZGRpdGlvbmFsV2hpdGVTcGFjZUZvckVtcHR5RWxlbWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50IGQgPSBET01VdGlscy5uZXdEb2N1bWVudCgpOworICAgICAgICBFbGVtZW50IHJvb3QgPSBkLmNyZWF0ZUVsZW1lbnQoInJvb3QiKTsKKyAgICAgICAgRE9NVXRpbHMuY3JlYXRlQ2hpbGRFbGVtZW50KHJvb3QsICJlbXB0eUVsZW1lbnQiKTsKKworICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIERPTUVsZW1lbnRXcml0ZXIgdyA9IG5ldyBET01FbGVtZW50V3JpdGVyKCk7CisgICAgICAgIHcud3JpdGUocm9vdCwgc3csIDAsICIgICIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjxyb290PiIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUAorICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICArICIgIDxlbXB0eUVsZW1lbnQ+PC9lbXB0eUVsZW1lbnQ+IgorICAgICAgICAgICAgICAgICAgICAgKyAiICA8ZW1wdHlFbGVtZW50IC8+IgorICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUAorICAgICAgICAgICAgICAgICAgICAgKyAiPC9yb290PiIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwKKyAgICAgICAgICAgICAgICAgICAgIHN3LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb05TUHJlZml4QnlEZWZhdWx0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRG9jdW1lbnQgZCA9IERPTVV0aWxzLm5ld0RvY3VtZW50KCk7CisgICAgICAgIEVsZW1lbnQgcm9vdCA9IGQuY3JlYXRlRWxlbWVudE5TKCJ1cm46Zm9vIiwgInJvb3QiKTsKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGVOUygidXJuOmZvbzIiLCAiYmFyIiwgImJheiIpOworCisgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0gbmV3IERPTUVsZW1lbnRXcml0ZXIoKTsKKyAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiPHJvb3QgYmFyPVwiYmF6XCIgLz4iCisgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLCBzdy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TlNPbkVsZW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBEb2N1bWVudCBkID0gRE9NVXRpbHMubmV3RG9jdW1lbnQoKTsKKyAgICAgICAgRWxlbWVudCByb290ID0gZC5jcmVhdGVFbGVtZW50TlMoInVybjpmb28iLCAicm9vdCIpOworICAgICAgICByb290LnNldEF0dHJpYnV0ZU5TKCJ1cm46Zm9vMiIsICJiYXIiLCAiYmF6Iik7CisKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBET01FbGVtZW50V3JpdGVyIHcgPQorICAgICAgICAgICAgbmV3IERPTUVsZW1lbnRXcml0ZXIoZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBET01FbGVtZW50V3JpdGVyLlhtbE5hbWVzcGFjZVBvbGljeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk9OTFlfUVVBTElGWV9FTEVNRU5UUyk7CisgICAgICAgIHcud3JpdGUocm9vdCwgc3csIDAsICIgICIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjxyb290IGJhcj1cImJhelwiIHhtbG5zPVwidXJuOmZvb1wiIC8+IgorICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwgc3cudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5TUHJlZml4T25BdHRyaWJ1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBEb2N1bWVudCBkID0gRE9NVXRpbHMubmV3RG9jdW1lbnQoKTsKKyAgICAgICAgRWxlbWVudCByb290ID0gZC5jcmVhdGVFbGVtZW50TlMoInVybjpmb28iLCAicm9vdCIpOworICAgICAgICByb290LnNldEF0dHJpYnV0ZU5TKCJ1cm46Zm9vMiIsICJiYXIiLCAiYmF6Iik7CisKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBET01FbGVtZW50V3JpdGVyIHcgPQorICAgICAgICAgICAgbmV3IERPTUVsZW1lbnRXcml0ZXIoZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBET01FbGVtZW50V3JpdGVyLlhtbE5hbWVzcGFjZVBvbGljeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlFVQUxJRllfQUxMKTsKKyAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiPHJvb3QgbnMwOmJhcj1cImJhelwiIHhtbG5zPVwidXJuOmZvb1wiIgorICAgICAgICAgICAgICAgICAgICAgKyAiIHhtbG5zOm5zMD1cInVybjpmb28yXCIgLz4iCisgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLCBzdy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TlNQcmVmaXhPbkF0dHJpYnV0ZUV2ZW5XaXRob3V0RWxlbWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50IGQgPSBET01VdGlscy5uZXdEb2N1bWVudCgpOworICAgICAgICBFbGVtZW50IHJvb3QgPSBkLmNyZWF0ZUVsZW1lbnROUygidXJuOmZvbyIsICJyb290Iik7CisgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlTlMoInVybjpmb28yIiwgImJhciIsICJiYXoiKTsKKworICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIERPTUVsZW1lbnRXcml0ZXIgdyA9CisgICAgICAgICAgICBuZXcgRE9NRWxlbWVudFdyaXRlcihmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBET01FbGVtZW50V3JpdGVyLlhtbE5hbWVzcGFjZVBvbGljeShmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiPHJvb3QgbnMwOmJhcj1cImJhelwiIHhtbG5zOm5zMD1cInVybjpmb28yXCIgLz4iCisgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLCBzdy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TlNHZXRzUmV1c2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRG9jdW1lbnQgZCA9IERPTVV0aWxzLm5ld0RvY3VtZW50KCk7CisgICAgICAgIEVsZW1lbnQgcm9vdCA9IGQuY3JlYXRlRWxlbWVudE5TKCJ1cm46Zm9vIiwgInJvb3QiKTsKKyAgICAgICAgRWxlbWVudCBjaGlsZCA9IGQuY3JlYXRlRWxlbWVudE5TKCJ1cm46Zm9vIiwgImNoaWxkIik7CisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoY2hpbGQpOworICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIERPTUVsZW1lbnRXcml0ZXIgdyA9CisgICAgICAgICAgICBuZXcgRE9NRWxlbWVudFdyaXRlcihmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTUVsZW1lbnRXcml0ZXIuWG1sTmFtZXNwYWNlUG9saWN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuT05MWV9RVUFMSUZZX0VMRU1FTlRTKTsKKyAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiPHJvb3QgeG1sbnM9XCJ1cm46Zm9vXCI+IgorICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUAorICAgICAgICAgICAgICAgICAgICAgKyAiICA8Y2hpbGQgLz4iCisgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCisgICAgICAgICAgICAgICAgICAgICArICI8L3Jvb3Q+IgorICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwgc3cudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5TR29lc091dE9mU2NvcGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBEb2N1bWVudCBkID0gRE9NVXRpbHMubmV3RG9jdW1lbnQoKTsKKyAgICAgICAgRWxlbWVudCByb290ID0gZC5jcmVhdGVFbGVtZW50TlMoInVybjpmb28iLCAicm9vdCIpOworICAgICAgICBFbGVtZW50IGNoaWxkID0gZC5jcmVhdGVFbGVtZW50TlMoInVybjpmb28yIiwgImNoaWxkIik7CisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoY2hpbGQpOworICAgICAgICBFbGVtZW50IGNoaWxkMiA9IGQuY3JlYXRlRWxlbWVudE5TKCJ1cm46Zm9vMiIsICJjaGlsZCIpOworICAgICAgICByb290LmFwcGVuZENoaWxkKGNoaWxkMik7CisgICAgICAgIEVsZW1lbnQgZ3JhbmRDaGlsZCA9IGQuY3JlYXRlRWxlbWVudE5TKCJ1cm46Zm9vMiIsICJncmFuZGNoaWxkIik7CisgICAgICAgIGNoaWxkMi5hcHBlbmRDaGlsZChncmFuZENoaWxkKTsKKyAgICAgICAgRWxlbWVudCBjaGlsZDMgPSBkLmNyZWF0ZUVsZW1lbnROUygidXJuOmZvbzIiLCAiY2hpbGQiKTsKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChjaGlsZDMpOworICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIERPTUVsZW1lbnRXcml0ZXIgdyA9CisgICAgICAgICAgICBuZXcgRE9NRWxlbWVudFdyaXRlcihmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTUVsZW1lbnRXcml0ZXIuWG1sTmFtZXNwYWNlUG9saWN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuT05MWV9RVUFMSUZZX0VMRU1FTlRTKTsKKyAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiPHJvb3QgeG1sbnM9XCJ1cm46Zm9vXCI+IgorICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUAorICAgICAgICAgICAgICAgICAgICAgKyAiICA8bnMwOmNoaWxkIHhtbG5zOm5zMD1cInVybjpmb28yXCIgLz4iCisgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCisgICAgICAgICAgICAgICAgICAgICArICIgIDxuczE6Y2hpbGQgeG1sbnM6bnMxPVwidXJuOmZvbzJcIj4iCisgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCisgICAgICAgICAgICAgICAgICAgICArICIgICAgPG5zMTpncmFuZGNoaWxkIC8+IgorICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUAorICAgICAgICAgICAgICAgICAgICAgKyAiICA8L25zMTpjaGlsZD4iCisgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCisgICAgICAgICAgICAgICAgICAgICArICIgIDxuczI6Y2hpbGQgeG1sbnM6bnMyPVwidXJuOmZvbzJcIiAvPiIKKyAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKKyAgICAgICAgICAgICAgICAgICAgICArICI8L3Jvb3Q+IgorICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwgc3cudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGF0ZVV0aWxzVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGF0ZVV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTBiNDMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9EYXRlVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0Q2FzZSBmb3IgRGF0ZVV0aWxzLgorICoKKyAqLworcHVibGljIGNsYXNzIERhdGVVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIERhdGVVdGlsc1Rlc3QoU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVsYXBzZWRUaW1lKCl7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gRGF0ZVV0aWxzLmZvcm1hdEVsYXBzZWRUaW1lKDUwKjEwMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIjUwIHNlY29uZHMiLCB0ZXh0KTsKKyAgICAgICAgdGV4dCA9IERhdGVVdGlscy5mb3JtYXRFbGFwc2VkVGltZSg2NSoxMDAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIG1pbnV0ZSA1IHNlY29uZHMiLCB0ZXh0KTsKKyAgICAgICAgdGV4dCA9IERhdGVVdGlscy5mb3JtYXRFbGFwc2VkVGltZSgxMjAqMTAwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiBtaW51dGVzIDAgc2Vjb25kcyIsIHRleHQpOworICAgICAgICB0ZXh0ID0gRGF0ZVV0aWxzLmZvcm1hdEVsYXBzZWRUaW1lKDEyMSoxMDAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIG1pbnV0ZXMgMSBzZWNvbmQiLCB0ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZVRpbWVJU08oKXsKKyAgICAgICAgVGltZVpvbmUgdGltZVpvbmUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzEiKTsKKyAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UodGltZVpvbmUpOworICAgICAgICBjYWwuc2V0KDIwMDIsMSwyMywxMCwxMSwxMik7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gRGF0ZVV0aWxzLmZvcm1hdChjYWwuZ2V0VGltZSgpLAorICAgICAgICAgICAgICAgIERhdGVVdGlscy5JU084NjAxX0RBVEVUSU1FX1BBVFRFUk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMDItMDItMjNUMDk6MTE6MTIiLCB0ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZUlTTygpeworICAgICAgICBUaW1lWm9uZSB0aW1lWm9uZSA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKKyAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UodGltZVpvbmUpOworICAgICAgICBjYWwuc2V0KDIwMDIsMSwyMyk7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gRGF0ZVV0aWxzLmZvcm1hdChjYWwuZ2V0VGltZSgpLAorICAgICAgICAgICAgICAgIERhdGVVdGlscy5JU084NjAxX0RBVEVfUEFUVEVSTik7CisgICAgICAgIGFzc2VydEVxdWFscygiMjAwMi0wMi0yMyIsIHRleHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lSVNPRGF0ZSgpeworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBlbGFwc2VkIHRpbWUgaW4gc2V0IHZpYSBkYXRlIHdvcmtzCisgICAgICAgIFRpbWVab25lIHRpbWVab25lID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCsxIik7CisgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKHRpbWVab25lKTsKKyAgICAgICAgY2FsLnNldCgyMDAyLDEsMjMsIDIxLCAxMSwgMTIpOworICAgICAgICBTdHJpbmcgdGV4dCA9IERhdGVVdGlscy5mb3JtYXQoY2FsLmdldFRpbWUoKSwKKyAgICAgICAgICAgICAgICBEYXRlVXRpbHMuSVNPODYwMV9USU1FX1BBVFRFUk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIwOjExOjEyIiwgdGV4dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVJU08oKXsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgZWxhcHNlZCB0aW1lIGluIG1zIHdvcmtzCisgICAgICAgIGxvbmcgbXMgPSAoMjAqMzYwMCArIDExKjYwICsgMTIpKjEwMDA7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gRGF0ZVV0aWxzLmZvcm1hdChtcywKKyAgICAgICAgICAgICAgICBEYXRlVXRpbHMuSVNPODYwMV9USU1FX1BBVFRFUk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIwOjExOjEyIiwgdGV4dCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBoYXNlT2ZNb29uKCkgeworICAgICAgICBUaW1lWm9uZSB0aW1lWm9uZSA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKKyAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UodGltZVpvbmUpOworICAgICAgICAvLyBzaG91bGQgYmUgZnVsbCBtb29uCisgICAgICAgIGNhbC5zZXQoMjAwMiwgMiwgMjcpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgRGF0ZVV0aWxzLmdldFBoYXNlT2ZNb29uKGNhbCkpOworICAgICAgICAvLyBzaG91bGQgYmUgbmV3IG1vb24KKyAgICAgICAgY2FsLnNldCgyMDAyLCAyLCAxMik7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBEYXRlVXRpbHMuZ2V0UGhhc2VPZk1vb24oY2FsKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNWQ2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw2MjIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworCisvKioKKyAqIFRlc3RzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlscy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVXRpbHNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgcHJpdmF0ZSBGaWxlIHJlbW92ZVRoaXM7CisgICAgcHJpdmF0ZSBTdHJpbmcgcm9vdDsKKworICAgIHB1YmxpYyBGaWxlVXRpbHNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAvLyBXaW5kb3dzIGFkZHMgdGhlIGRyaXZlIGxldHRlciBpbiB1cHBlcmNhc2UsIHVubGVzcyB5b3UgcnVuIEN5Z3dpbgorICAgICAgICByb290ID0gbmV3IEZpbGUoRmlsZS5zZXBhcmF0b3IpLmdldEFic29sdXRlUGF0aCgpLnRvVXBwZXJDYXNlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIGlmIChyZW1vdmVUaGlzICE9IG51bGwgJiYgcmVtb3ZlVGhpcy5leGlzdHMoKSkgeworICAgICAgICAgICAgaWYgKCFyZW1vdmVUaGlzLmRlbGV0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbW92ZVRoaXMuZGVsZXRlT25FeGl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IG1vZGlmaWNhdGlvbi4KKyAgICAgKiBTaW5jZSBBbnQxLjcsIHRoZSBtZXRob2QgYmVpbmcgdGVzdGVkIG5vIGxvbmdlciB1c2VzCisgICAgICogcmVmbGVjdGlvbiB0byBwcm92aWRlIGJhY2t3YXJkcyBzdXBwb3J0IHRvIEphdmExLjEsIHNvIHRoaXMKKyAgICAgKiB0ZXN0IGlzIG5vdCBzbyBjcml0aWNhbC4gQnV0IGl0IGRvZXMgZXhwbG9yZSBmaWxlIHN5c3RlbQorICAgICAqIGJlaGF2aW91ciBhbmQgd2lsbCBoZWxwIGNhdGNoIGFueSByZWdyZXNzaW9uIGluIEphdmEgaXRzZWxmLAorICAgICAqIHNvIGlzIHdvcnRoIHJldGFpbmluZy4KKyAgICAgKiBAc2VlIEZpbGVVdGlscyNzZXRGaWxlTGFzdE1vZGlmaWVkKGphdmEuaW8uRmlsZSwgbG9uZykKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldExhc3RNb2RpZmllZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlbW92ZVRoaXMgPSBuZXcgRmlsZSgiZHVtbXkiKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShyZW1vdmVUaGlzKTsKKyAgICAgICAgZm9zLndyaXRlKG5ldyBieXRlWzBdKTsKKyAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgIGxvbmcgbW9kVGltZSA9IHJlbW92ZVRoaXMubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIGFzc2VydFRydWUobW9kVGltZSAhPSAwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTbGVlcCBmb3Igc29tZSB0aW1lIHRvIG1ha2Ugc3VyZSBhIHRvdWNoZWQgZmlsZSB3b3VsZCBnZXQgYQorICAgICAgICAgKiBtb3JlIHJlY2VudCB0aW1lc3RhbXAgYWNjb3JkaW5nIHRvIHRoZSBmaWxlIHN5c3RlbSdzCisgICAgICAgICAqIGdyYW51bGFyaXR5IChzaG91bGQgYmUgPiAycyB0byBhY2NvdW50IGZvciBXaW5kb3dzIEZBVCkuCisgICAgICAgICAqLworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgZmFpbChpZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgRklMRV9VVElMUy5zZXRGaWxlTGFzdE1vZGlmaWVkKHJlbW92ZVRoaXMsIC0xKTsKKyAgICAgICAgbG9uZyBzZWNvbmRNb2RUaW1lID0gcmVtb3ZlVGhpcy5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZWNvbmRNb2RUaW1lID4gbW9kVGltZSk7CisKKyAgICAgICAgLy8gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIGRheQorICAgICAgICBmaW5hbCBpbnQgbWlsbGlzcGVyZGF5PTI0ICogMzYwMCAqIDEwMDA7CisgICAgICAgIC8vIGluIGEgcHJldmlvdXMgdmVyc2lvbiwgdGhlIGRhdGUgb2YgdGhlIGZpbGUgd2FzIHNldCB0byAxMjM0NTYKKyAgICAgICAgLy8gbWlsbGlzZWNvbmRzIHNpbmNlIDAxLjAxLjE5NzAKKyAgICAgICAgLy8gaXQgZGlkIG5vdCB3b3JrIG9uIGEgY29tcHV0ZXIgcnVubmluZyBKREsgMS40LjFfMDIgKyBXaW5kb3dzIDIwMDAKKyAgICAgICAgRklMRV9VVElMUy5zZXRGaWxlTGFzdE1vZGlmaWVkKHJlbW92ZVRoaXMsIHNlY29uZE1vZFRpbWUgKyBtaWxsaXNwZXJkYXkpOworICAgICAgICBsb25nIHRoaXJkTW9kVGltZSA9IHJlbW92ZVRoaXMubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIC8qCisgICAgICAgICAqIEkgd291bGQgbG92ZSB0byBjb21wYXJlIHRoaXMgd2l0aCAxMjM0NTYsIGJ1dCBkZXBlbmRpbmcgb24KKyAgICAgICAgICogdGhlIGZpbGVzeXN0ZW1zIGdyYW51bGFyaXR5IGl0IGNhbiB0YWtlIGFuIGFyYml0cmFyeSB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSnVzdCBhc3NlcnQgdGhlIHRpbWUgaGFzIGNoYW5nZWQuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnRUcnVlKHRoaXJkTW9kVGltZSAhPSBzZWNvbmRNb2RUaW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUZpbGUoKSB7CisgICAgICAgIGlmICghKE9zLmlzRmFtaWx5KCJkb3MiKSB8fCBPcy5pc0ZhbWlseSgibmV0d2FyZSIpKSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFN0YXJ0IHdpdGggc2ltcGxlIGFic29sdXRlIGZpbGUgbmFtZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsICIvIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsICJcXCIpLmdldFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UobG9jYWxpemUoRmlsZS5zZXBhcmF0b3IpLAorICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGxvY2FsaXplKEZpbGUuc2VwYXJhdG9yKSwKKyAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsICJcXCIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGhyb3cgaW4gZHJpdmUgbGV0dGVycworICAgICAgICAgICAgICovCisgICAgICAgICAgICBTdHJpbmcgZHJpdmVTcGVjID0gIkM6IjsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjICsgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiXFwiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gImM6IjsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWNMb3dlciArICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWNMb3dlciArICIvIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWNMb3dlciArICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWNMb3dlciArICJcXCIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogcHJvbWlzZWQgdG8gZWxpbWluYXRlIGNvbnNlY3V0aXZlIHNsYXNoZXMgYWZ0ZXIgZHJpdmUgbGV0dGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICIvLy8vLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICJcXFxcXFxcXFxcXFwiKS5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChPcy5pc0ZhbWlseSgibmV0d2FyZSIpKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGhyb3cgaW4gTmV0V2FyZSB2b2x1bWUgbmFtZXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlYyA9ICJTWVM6IjsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjICsgIlxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWNMb3dlciA9ICJzeXM6IjsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWNMb3dlciArICIvIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWNMb3dlciArICJcXCIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogcHJvbWlzZWQgdG8gZWxpbWluYXRlIGNvbnNlY3V0aXZlIHNsYXNoZXMgYWZ0ZXIgZHJpdmUgbGV0dGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjICsgIi8vLy8vIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiXFxcXFxcXFxcXFxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgfSBlbHNlIGlmICghKE9zLmlzRmFtaWx5KCJkb3MiKSkpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBkcml2ZSBsZXR0ZXJzIG11c3QgYmUgY29uc2lkZXJlZCBqdXN0IG5vcm1hbCBmaWxlbmFtZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOworICAgICAgICAgICAgU3RyaW5nIHVkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModWRpciArIEZpbGUuc2VwYXJhdG9yICsgZHJpdmVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjICsgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVkaXIgKyBGaWxlLnNlcGFyYXRvciArIGRyaXZlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICJcXCIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICBTdHJpbmcgZHJpdmVTcGVjTG93ZXIgPSAiYzoiOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVkaXIgKyBGaWxlLnNlcGFyYXRvciArIGRyaXZlU3BlY0xvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjTG93ZXIgKyAiLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModWRpciArIEZpbGUuc2VwYXJhdG9yICsgZHJpdmVTcGVjTG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWNMb3dlciArICJcXCIpLmdldFBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBOb3cgdGVzdCBzb21lIHJlbGF0aXZlIGZpbGUgbmFtZSBtYWdpYy4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSwgIjQiKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCisgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLzQiKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCisgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuXFw0IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpLCAiLi8uXFw0IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpLCAiLi4vMy80IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpLCAiLi5cXDNcXDQiKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCisgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLi8uLi81Ly4uLy4vMi8uLzMvNi8uLi80IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpLCAiLi5cXC4uLzUvLi5cXC4vMi8uLzMvNlxcLi4vNCIpLmdldFBhdGgoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZWFuaW5nbGVzcyByZXN1bHQgYnV0IG5vIGV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgbmV3IEZpbGUobG9jYWxpemUoIi8xLy4uLy4uL2IiKSksCisgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEiKSksICIuLi8uLi9iIikpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZSgpIHsKKyAgICAgICAgaWYgKCEoT3MuaXNGYW1pbHkoImRvcyIpIHx8IE9zLmlzRmFtaWx5KCJuZXR3YXJlIikpKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU3RhcnQgd2l0aCBzaW1wbGUgYWJzb2x1dGUgZmlsZSBuYW1lcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKCIvIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZSgiXFwiKS5nZXRQYXRoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoIi8iKS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgIGZhaWwoIm5vcm1hbGl6ZWQgXCIvXCIgb24gZG9zIG9yIG5ldHdhcmUiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZSgiXFwiKS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgIGZhaWwoIm5vcm1hbGl6ZWQgXCJcXFwiIG9uIGRvcyBvciBuZXR3YXJlIik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJkb3MiKSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHRocm93IGluIGRyaXZlIGxldHRlcnMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlYyA9ICJDOiI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWMpLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgZmFpbChkcml2ZVNwZWMgKyAiIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoIik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjICsgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjICsgIlxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWNMb3dlciA9ICJjOiI7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjTG93ZXIgKyAiXFwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlY0xvd2VyICsgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlY0xvd2VyICsgIlxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWNMb3dlciArICJcXCIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogcHJvbWlzZWQgdG8gZWxpbWluYXRlIGNvbnNlY3V0aXZlIHNsYXNoZXMgYWZ0ZXIgZHJpdmUgbGV0dGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiLy8vLy8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjICsgIlxcXFxcXFxcXFxcXCIpLmdldFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHRocm93IGluIE5ldFdhcmUgdm9sdW1lIG5hbWVzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiU1lTOiI7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlYykuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjICsgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiXFwiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gInN5czoiOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWNMb3dlcikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjTG93ZXIgKyAiLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlY0xvd2VyICsgIlxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFxqdW5rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWNMb3dlciArICJcXGp1bmsiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHByb21pc2VkIHRvIGVsaW1pbmF0ZSBjb25zZWN1dGl2ZSBzbGFzaGVzIGFmdGVyIGRyaXZlIGxldHRlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiLy8vLy8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiXFxcXFxcXFxcXFxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlYyA9ICJDOiI7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGZhaWx1cmUsIEM6IGlzbid0IGFuIGFic29sdXRlIHBhdGggb24gb3RoZXIgb3MncyIpOworICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFBhc3NlZCB0ZXN0IAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTm93IHRlc3Qgc29tZSByZWxhdGl2ZSBmaWxlIG5hbWUgbWFnaWMuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCisgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLzQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUobG9jYWxpemUoIi8xLzIvMy8uLzQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUobG9jYWxpemUoIi8xLzIvMy8uXFw0IikpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi8uXFw0IikpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi4vMy80IikpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi5cXDNcXDQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUobG9jYWxpemUoIi8xLzIvMy8uLi8uLi81Ly4uLy4vMi8uLzMvNi8uLi80IikpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKKyAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi5cXC4uLzUvLi5cXC4vMi8uLzMvNlxcLi4vNCIpKS5nZXRQYXRoKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZSgiZm9vIik7CisgICAgICAgICAgICBmYWlsKCJmb28gaXMgbm90IGFuIGFic29sdXRlIHBhdGgiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZXhjZXB0aW9uIGNhdWdodAorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWxsIG5vdCBnbyBvdXRzaWRlIEZTIHJvb3QgKGJ1dCB3aWxsIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gZWl0aGVyKSIsCisgICAgICAgICAgICAgICAgbmV3IEZpbGUobG9jYWxpemUoIi8xLy4uLy4uL2IiKSksCisgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUobG9jYWxpemUoIi8xLy4uLy4uL2IiKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaGFuZGxpbmcgb2YgbnVsbCBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxBcmdzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJzdWNjZXNzZnVsbHkgbm9ybWFsaXplZCBhIG51bGwtZmlsZSIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZiA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgImEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGYsIG5ldyBGaWxlKCJhIikuZ2V0QWJzb2x1dGVGaWxlKCkpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFRlc3QgY3JlYXRlVGVtcEZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVGVtcEZpbGUoKQorICAgIHsKKyAgICAgICAgLy8gbnVsbCBwYXJlbnQgZGlyCisgICAgICAgIEZpbGUgdG1wMSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoInByZSIsICIuc3VmIiwgbnVsbCwgZmFsc2UsIHRydWUpOworICAgICAgICBTdHJpbmcgdG1wbG9jID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworICAgICAgICBTdHJpbmcgbmFtZSA9IHRtcDEuZ2V0TmFtZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJzdGFydHMgd2l0aCBwcmUiLCBuYW1lLnN0YXJ0c1dpdGgoInByZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5kcyB3aXRoIC5zdWYiLCBuYW1lLmVuZHNXaXRoKCIuc3VmIikpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHdhcyBjcmVhdGVkIiwgdG1wMS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygobmV3IEZpbGUodG1wbG9jLCB0bXAxLmdldE5hbWUoKSkpLmdldEFic29sdXRlUGF0aCgpLCB0bXAxCisgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgdG1wMS5kZWxldGUoKTsKKworICAgICAgICBGaWxlIGRpcjIgPSBuZXcgRmlsZSh0bXBsb2MgKyAiL2FudC10ZXN0Iik7CisgICAgICAgIGRpcjIubWtkaXIoKTsKKyAgICAgICAgcmVtb3ZlVGhpcyA9IGRpcjI7CisKKyAgICAgICAgRmlsZSB0bXAyID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZSgicHJlIiwgIi5zdWYiLCBkaXIyLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgU3RyaW5nIG5hbWUyID0gdG1wMi5nZXROYW1lKCk7CisgICAgICAgIGFzc2VydFRydWUoInN0YXJ0cyB3aXRoIHByZSIsIG5hbWUyLnN0YXJ0c1dpdGgoInByZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5kcyB3aXRoIC5zdWYiLCBuYW1lMi5lbmRzV2l0aCgiLnN1ZiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSB3YXMgY3JlYXRlZCIsIHRtcDIuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKG5ldyBGaWxlKGRpcjIsIHRtcDIuZ2V0TmFtZSgpKSkuZ2V0QWJzb2x1dGVQYXRoKCksIHRtcDIKKyAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB0bXAyLmRlbGV0ZSgpOworICAgICAgICBkaXIyLmRlbGV0ZSgpOworCisgICAgICAgIEZpbGUgcGFyZW50ID0gbmV3IEZpbGUoKG5ldyBGaWxlKCIvdG1wIikpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgdG1wMSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoInByZSIsICIuc3VmIiwgcGFyZW50LCBmYWxzZSk7CisgICAgICAgIGFzc2VydFRydWUoIm5ldyBmaWxlIiwgIXRtcDEuZXhpc3RzKCkpOworCisgICAgICAgIG5hbWUgPSB0bXAxLmdldE5hbWUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic3RhcnRzIHdpdGggcHJlIiwgbmFtZS5zdGFydHNXaXRoKCJwcmUiKSk7CisgICAgICAgIGFzc2VydFRydWUoImVuZHMgd2l0aCAuc3VmIiwgbmFtZS5lbmRzV2l0aCgiLnN1ZiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpcyBpbnNpZGUgcGFyZW50IGRpciIsIHBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKSwgdG1wMQorICAgICAgICAgICAgICAgIC5nZXRQYXJlbnQoKSk7CisKKyAgICAgICAgdG1wMiA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoInByZSIsICIuc3VmIiwgcGFyZW50LCBmYWxzZSk7CisgICAgICAgIGFzc2VydFRydWUoImZpbGVzIGFyZSBkaWZmZXJlbnQiLCAhdG1wMS5nZXRBYnNvbHV0ZVBhdGgoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgdG1wMi5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCisgICAgICAgIC8vIG51bGwgcGFyZW50IGRpcgorICAgICAgICBGaWxlIHRtcDMgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKCJwcmUiLCAiLnN1ZiIsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgdG1wbG9jID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoKG5ldyBGaWxlKHRtcGxvYywgdG1wMy5nZXROYW1lKCkpKS5nZXRBYnNvbHV0ZVBhdGgoKSwgdG1wMworICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjb250ZW50RXF1YWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRFcXVhbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKCJOb24gZXhpc3RpbmcgZmlsZXMiLCBGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJmb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgImJhciIpKSk7CisgICAgICAgIGFzc2VydFRydWUoIk9uZSBleGlzdHMsIHRoZSBvdGhlciBvbmUgZG9lc25cJ3QiLAorICAgICAgICAgICAgICAgICAgICFGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJmb28iKSwgbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJidWlsZC54bWwiKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJEb25cJ3QgY29tcGFyZSBkaXJlY3RvcmllcyIsCisgICAgICAgICAgICAgICAgICAgIUZJTEVfVVRJTFMuY29udGVudEVxdWFscyhuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYyIpLCBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYyIpKSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgZXF1YWxzIGl0c2VsZiIsCisgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5jb250ZW50RXF1YWxzKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAiYnVpbGQueG1sIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgImJ1aWxkLnhtbCIpKSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGVzIGFyZSBkaWZmZXJlbnQiLAorICAgICAgICAgICAgICAgICAgICFGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJidWlsZC54bWwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgImRvY3MueG1sIikpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNyZWF0ZU5ld0ZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTmV3RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlbW92ZVRoaXMgPSBuZXcgRmlsZSgiZHVtbXkiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghcmVtb3ZlVGhpcy5leGlzdHMoKSk7CisgICAgICAgIEZJTEVfVVRJTFMuY3JlYXRlTmV3RmlsZShyZW1vdmVUaGlzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZW1vdmVUaGlzLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlbW92ZUxlYWRpbmdQYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMZWFkaW5nUGF0aCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoIi9mb28vYmFyIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCIvZm9vL2JhciIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiXFxmb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiXFxmb29cXGJhciIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiXFxmb29cXCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJcXGZvb1xcYmFyIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOi9mb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiYzovZm9vL2JhciIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzovZm9vLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJjOi9mb28vYmFyIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcZm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoImM6XFxmb29cXGJhciIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXGZvb1xcIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoImM6XFxmb29cXGJhciIpKSk7CisgICAgICAgIGlmICghKE9zLmlzRmFtaWx5KCJkb3MiKSB8fCBPcy5pc0ZhbWlseSgibmV0d2FyZSIpKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZJTEVfVVRJTFMubm9ybWFsaXplKCIvYmFyIikuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2ZvbyIpLCBuZXcgRmlsZSgiL2JhciIpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRklMRV9VVElMUy5ub3JtYWxpemUoIi9mb29iYXIiKS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksIG5ldyBGaWxlKCIvZm9vYmFyIikpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBidWd6aWxsYSByZXBvcnQgMTk5NzkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vL2JhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCIvZm9vL2JhciIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2Zvby9iYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiL2Zvby9iYXIvIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiL2Zvby9iYXIvIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vL2Jhci8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiL2Zvby9iYXIiKSkpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJmb28vYmFyIi5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcikKKyAgICAgICAgICAgIC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoIi9mb28vYmFyIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOi8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiYzovZm9vL2JhciIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJjOlxcZm9vXFxiYXIiKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdG9VcmkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9VUkkoKSB7CisgICAgICAgIFN0cmluZyBkb3NSb290ID0gbnVsbDsKKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJkb3MiKSB8fCBPcy5pc0ZhbWlseSgibmV0d2FyZSIpKSB7CisgICAgICAgICAgICBkb3NSb290ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpCisgICAgICAgICAgICAgICAgLnN1YnN0cmluZygwLCAzKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKworICAgICAgICAgICAgLy9wcmVzZXJ2ZSBjYXNlIG9uIEN5Z3dpbiB3aGVuIHVzaW5nIDEuNCB0b1VSSToKKyAgICAgICAgICAgIENsYXNzIHVyaUNsYXp6ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXJpQ2xhenogPSBDbGFzcy5mb3JOYW1lKCJqYXZhLm5ldC5VUkkiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIE9LLCBKYXZhIDEuMy4KKyAgICAgICAgICAgICAgICBkb3NSb290ID0gZG9zUm9vdC50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZG9zUm9vdCA9ICIiOworICAgICAgICB9CisgICAgICAgIGlmIChPcy5pc0ZhbWlseSgiZG9zIikpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovYzovZm9vIiwgcmVtb3ZlRXh0cmFuZW91c0F1dGhvcml0eShGSUxFX1VUSUxTLnRvVVJJKCJjOlxcZm9vIikpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi9TWVM6L2ZvbyIsIHJlbW92ZUV4dHJhbmVvdXNBdXRob3JpdHkoRklMRV9VVElMUy50b1VSSSgic3lzOlxcZm9vIikpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciA9PSAnLycpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovZm9vIiwgcmVtb3ZlRXh0cmFuZW91c0F1dGhvcml0eShGSUxFX1VUSUxTLnRvVVJJKCIvZm9vIikpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImZpbGU6IFVSSXMgbXVzdCBuYW1lIGFic29sdXRlIHBhdGhzIiwgRklMRV9VVElMUy50b1VSSSgiLi9mb28iKS5zdGFydHNXaXRoKCJmaWxlOi8iKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMudG9VUkkoIi4vZm9vIikuZW5kc1dpdGgoIi9mb28iKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6LyIgKyBkb3NSb290ICsgImZvbyUyMGJhciIsIHJlbW92ZUV4dHJhbmVvdXNBdXRob3JpdHkoRklMRV9VVElMUy50b1VSSSgiL2ZvbyBiYXIiKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi8iICsgZG9zUm9vdCArICJmb28lMjNiYXIiLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KEZJTEVfVVRJTFMudG9VUkkoIi9mb28jYmFyIikpKTsKKyAgICAgICAgfSBlbHNlIGlmIChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyID09ICdcXCcpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovIiArIGRvc1Jvb3QgKyAiZm9vIiwgcmVtb3ZlRXh0cmFuZW91c0F1dGhvcml0eShGSUxFX1VUSUxTLnRvVVJJKCJcXGZvbyIpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJmaWxlOiBVUklzIG11c3QgbmFtZSBhYnNvbHV0ZSBwYXRocyIsIEZJTEVfVVRJTFMudG9VUkkoIi5cXGZvbyIpLnN0YXJ0c1dpdGgoImZpbGU6LyIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy50b1VSSSgiLlxcZm9vIikuZW5kc1dpdGgoIi9mb28iKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6LyIgKyBkb3NSb290ICsgImZvbyUyMGJhciIsIHJlbW92ZUV4dHJhbmVvdXNBdXRob3JpdHkoRklMRV9VVElMUy50b1VSSSgiXFxmb28gYmFyIikpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovIiArIGRvc1Jvb3QgKyAiZm9vJTIzYmFyIiwgcmVtb3ZlRXh0cmFuZW91c0F1dGhvcml0eShGSUxFX1VUSUxTLnRvVVJJKCJcXGZvbyNiYXIiKSkpOworICAgICAgICB9CisgICAgICAgIC8vIGEgdGVzdCB3aXRoIGFudCBmb3IgZ2VybWFucworICAgICAgICAvLyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIgdXNlZCBmb3IgdGhlIHRlc3QgaXMgdGhlICJhIHVtbGF1dCIKKyAgICAgICAgLy8gdGhpcyBpcyB0aGUgZml4IGZvciB0aGUgYnVnIDM3MzQ4CisgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovIiArIGRvc1Jvb3QgKyAiJUMzJUE0bnQiLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KEZJTEVfVVRJTFMudG9VUkkoIi9cdTAwRTRudCIpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXV0aG9yaXR5IGZpZWxkIGlzIHVubmVjZXNzYXJ5LCBidXQgaGFybWxlc3MsIGluIGZpbGU6IFVSSXMuCisgICAgICogSmF2YSAxLjQgZG9lcyBub3QgcHJvZHVjZSBpdCB3aGVuIHVzaW5nIEZpbGUudG9VUkkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZUV4dHJhbmVvdXNBdXRob3JpdHkoU3RyaW5nIHVyaSkgeworICAgICAgICBTdHJpbmcgcHJlZml4ID0gImZpbGU6Ly8vIjsKKyAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKHByZWZpeCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiZmlsZTovIiArIHVyaS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB1cmk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDb250ZXh0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICBpZiAoT3MuaXNGYW1pbHkoImRvcyIpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKEZpbGVVdGlscy5pc0NvbnRleHRSZWxhdGl2ZVBhdGgoIi9cdTAwRTRudCIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoRmlsZVV0aWxzLmlzQ29udGV4dFJlbGF0aXZlUGF0aCgiXFxmb28iKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogdGVzdCBmcm9tVXJpCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZyb21VUkkoKSB7CisgICAgICAgIFN0cmluZyBkb3NSb290ID0gbnVsbDsKKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJkb3MiKSB8fCBPcy5pc0ZhbWlseSgibmV0d2FyZSIpKSB7CisgICAgICAgICAgICBkb3NSb290ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpLnN1YnN0cmluZygwLCAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvc1Jvb3QgPSAiIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKCJTWVM6XFxmb28iLCBGSUxFX1VUSUxTLmZyb21VUkkoImZpbGU6Ly8vc3lzOi9mb28iKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJkb3MiKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKCJDOlxcZm9vIiwgRklMRV9VVElMUy5mcm9tVVJJKCJmaWxlOi8vL2M6L2ZvbyIpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UoZG9zUm9vdCArIEZpbGUuc2VwYXJhdG9yICsgImZvbyIsIEZJTEVfVVRJTFMuZnJvbVVSSSgiZmlsZTovLy9mb28iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLiIgKyBGaWxlLnNlcGFyYXRvciArICJmb28iLAorICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5mcm9tVVJJKCJmaWxlOi4vZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZG9zUm9vdCArIEZpbGUuc2VwYXJhdG9yICsgImZvbyBiYXIiLCBGSUxFX1VUSUxTLmZyb21VUkkoImZpbGU6Ly8vZm9vJTIwYmFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZG9zUm9vdCArIEZpbGUuc2VwYXJhdG9yICsgImZvbyNiYXIiLCBGSUxFX1VUSUxTLmZyb21VUkkoImZpbGU6Ly8vZm9vJTIzYmFyIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RpZmljYXRpb25UZXN0cygpIHsKKworICAgICAgICAvL2dldCBhIHRpbWUKKyAgICAgICAgbG9uZyBmaXJzdFRpbWU9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIC8vYWRkIHNvbWUgdGltZS4gV2UgYXNzdW1lIG5vIE9TIGhhcyBhIGdyYW51bGFyaXR5IHRoaXMgYmFkCisgICAgICAgIGxvbmcgc2Vjb25kVGltZT1maXJzdFRpbWUrNjAwMDA7CisvKgorICAgICAgICBhc3NlcnRUcnVlKCJzYW1lIHRpbWVzdGFtcCBpcyB1cCB0byBkYXRlIiwKKyAgICAgICAgICAgICAgICBmdS5pc1VwVG9EYXRlKGZpcnN0VGltZSwgZmlyc3RUaW1lKSk7CisgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAvL2NoZWNrIHRoYXQgb2xkZXIgaXMgdXAgdG8gZGF0ZSB3aXRoIGEgbmV3ZXIgZGVzdAorICAgICAgICBhc3NlcnRUcnVlKCJvbGRlciBzb3VyY2UgZmlsZXMgYXJlIHVwIHRvIGRhdGUiLAorICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMuaXNVcFRvRGF0ZShmaXJzdFRpbWUsc2Vjb25kVGltZSkpOworICAgICAgICAvL2NoZWNrIHRoYXQgb2xkZXIgaXMgdXAgdG8gZGF0ZSB3aXRoIGEgbmV3ZXIgZGVzdAorICAgICAgICBhc3NlcnRGYWxzZSgibmV3ZXIgc291cmNlIGZpbGVzIGFyZSBubyB1cCB0byBkYXRlIiwKKyAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmlzVXBUb0RhdGUoc2Vjb25kVGltZSwgZmlyc3RUaW1lKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiLTEgZGVzdCB0aW1lc3RhbXAgaW1wbGllcyBub25leGlzdGVuY2UiLAorICAgICAgICAgICAgICAgICFGSUxFX1VUSUxTLmlzVXBUb0RhdGUoZmlyc3RUaW1lLC0xTCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNFcnJvckluQ2FzZSgpIHsKKyAgICAgICAgRmlsZSB0ZW1wRm9sZGVyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKKyAgICAgICAgRmlsZSB3ZWxsY2FzZWQgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKCJhbHBoYSIsICJiZXRhIiwgdGVtcEZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUpOworICAgICAgICBTdHJpbmcgcyA9IHdlbGxjYXNlZC5nZXROYW1lKCkudG9VcHBlckNhc2UoKTsKKyAgICAgICAgRmlsZSB3cm9uZ2Nhc2VkID0gbmV3IEZpbGUodGVtcEZvbGRlciwgcyk7CisgICAgICAgIGlmIChPcy5pc0ZhbWlseSgiZG9zIikpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5oYXNFcnJvckluQ2FzZSh3cm9uZ2Nhc2VkKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShGSUxFX1VUSUxTLmhhc0Vycm9ySW5DYXNlKHdlbGxjYXNlZCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoRklMRV9VVElMUy5oYXNFcnJvckluQ2FzZSh3cm9uZ2Nhc2VkKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShGSUxFX1VUSUxTLmhhc0Vycm9ySW5DYXNlKHdlbGxjYXNlZCkpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEVuY29kaW5nKCkgeworICAgICAgICAvLyBUaGlzIGp1c3QgdGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gZG9lcyBub3QgYmxvdyB1cAorICAgICAgICBGSUxFX1VUSUxTLmdldERlZmF1bHRFbmNvZGluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFkYXB0IGZpbGUgc2VwYXJhdG9ycyB0byBsb2NhbCBjb252ZW50aW9ucworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsaXplKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHBhdGggPSByb290ICsgcGF0aC5zdWJzdHJpbmcoMSk7CisgICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb252ZW5pZW5jZSBtZXRob2QKKyAgICAgKiBub3JtYWxpemUgYnJpbmdzIHRoZSBkcml2ZSBpbiB1cHBlcmNhc2UKKyAgICAgKiB0aGUgZHJpdmUgbGV0dGVyIGlzIGluIGxvd2VyIGNhc2UgdW5kZXIgY3lnd2luCisgICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCBhbGxvd3MgdGVzdHMgd2hlcmUgbm9ybWFsaXplIGlzIGNhbGxlZCB0byBwYXNzIHVuZGVyIGN5Z3dpbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKKyAgICAgICAgaWYgKChPcy5pc0ZhbWlseSgiZG9zIikgfHwgT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSkKKyAgICAgICAgICAgICYmIHMxLmxlbmd0aCgpID4gMCAmJiBzMi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYjEgPSBuZXcgU3RyaW5nQnVmZmVyKHMxKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYjIgPSBuZXcgU3RyaW5nQnVmZmVyKHMyKTsKKyAgICAgICAgICAgIHNiMS5zZXRDaGFyQXQoMCwgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHMxLmNoYXJBdCgwKSkpOworICAgICAgICAgICAgc2IyLnNldENoYXJBdCgwLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoczIuY2hhckF0KDApKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2IxLnRvU3RyaW5nKCksIHNiMi50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzMSwgczIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvR2xvYlBhdHRlcm5NYXBwZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9HbG9iUGF0dGVybk1hcHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2EwNWIyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvR2xvYlBhdHRlcm5NYXBwZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7R2xvYlBhdHRlcm5NYXBwZXIuCisgKgorICovCitwdWJsaWMgY2xhc3MgR2xvYlBhdHRlcm5NYXBwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIEdsb2JQYXR0ZXJuTWFwcGVyVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9QYXR0ZXJuQXRBbGwoKSB7CisgICAgICAgIEdsb2JQYXR0ZXJuTWFwcGVyIG0gPSBuZXcgR2xvYlBhdHRlcm5NYXBwZXIoKTsKKyAgICAgICAgbS5zZXRGcm9tKCJmb29iYXIiKTsKKyAgICAgICAgbS5zZXRUbygiYmF6Iik7CisgICAgICAgIGFzc2VydE51bGwoIlNob3VsZG5cJ3QgbWF0Y2ggZm9vYmFyIiwgbS5tYXBGaWxlTmFtZSgicGxvbmsiKSk7CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG0ubWFwRmlsZU5hbWUoImZvb2JhciIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgbWF0Y2ggZm9vYmFyIiwgcmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmx5IG9uZSByZXN1bHQgZm9yIGZvb2JhciIsIDEsIHJlc3VsdC5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJheiIsIHJlc3VsdFswXSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RmaXhPbmx5KCkgeworICAgICAgICBHbG9iUGF0dGVybk1hcHBlciBtID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7CisgICAgICAgIG0uc2V0RnJvbSgiKmZvbyIpOworICAgICAgICBtLnNldFRvKCIqcGxvbmsiKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkblwndCBtYXRjaCAqZm9vIiwgbS5tYXBGaWxlTmFtZSgiYmFyLmJheiIpKTsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbS5tYXBGaWxlTmFtZSgiYmFyLmZvbyIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgbWF0Y2ggKi5mb28iLCByZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9ubHkgb25lIHJlc3VsdCBmb3IgYmFyLmZvbyIsIDEsIHJlc3VsdC5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhci5wbG9uayIsIHJlc3VsdFswXSk7CisKKyAgICAgICAgLy8gVHJ5IGEgc2lsbHkgY2FzZQorICAgICAgICBtLnNldFRvKCJmb28qIik7CisgICAgICAgIHJlc3VsdCA9IG0ubWFwRmlsZU5hbWUoImJhci5mb28iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXIuIiwgcmVzdWx0WzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZml4T25seSgpIHsKKyAgICAgICAgR2xvYlBhdHRlcm5NYXBwZXIgbSA9IG5ldyBHbG9iUGF0dGVybk1hcHBlcigpOworICAgICAgICBtLnNldEZyb20oImZvbyoiKTsKKyAgICAgICAgbS5zZXRUbygicGxvbmsqIik7CisgICAgICAgIGFzc2VydE51bGwoIlNob3VsZG5cJ3QgbWF0Y2ggZm9vKiIsIG0ubWFwRmlsZU5hbWUoImJhci5iYXoiKSk7CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG0ubWFwRmlsZU5hbWUoImZvby5iYXIiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIG1hdGNoIGZvbyoiLCByZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9ubHkgb25lIHJlc3VsdCBmb3IgZm9vLmJhciIsIDEsIHJlc3VsdC5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsb25rLmJhciIsIHJlc3VsdFswXSk7CisKKyAgICAgICAgLy8gVHJ5IGEgc2lsbHkgY2FzZQorICAgICAgICBtLnNldFRvKCIqZm9vIik7CisgICAgICAgIHJlc3VsdCA9IG0ubWFwRmlsZU5hbWUoImZvby5iYXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIuYmFyZm9vIiwgcmVzdWx0WzBdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlQW5kUG9zdGZpeCgpIHsKKyAgICAgICAgR2xvYlBhdHRlcm5NYXBwZXIgbSA9IG5ldyBHbG9iUGF0dGVybk1hcHBlcigpOworICAgICAgICBtLnNldEZyb20oImZvbypiYXIiKTsKKyAgICAgICAgbS5zZXRUbygicGxvbmsqcGxpbmciKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkblwndCBtYXRjaCBmb28qYmFyIiwgbS5tYXBGaWxlTmFtZSgiYmFyLmJheiIpKTsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbS5tYXBGaWxlTmFtZSgiZm9vLmJhciIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgbWF0Y2ggZm9vKmJhciIsIHJlc3VsdCk7CisgICAgICAgIGFzc2VydEVxdWFscygib25seSBvbmUgcmVzdWx0IGZvciBmb28uYmFyIiwgMSwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxvbmsucGxpbmciLCByZXN1bHRbMF0pOworCisgICAgICAgIC8vIGFuZCBhIGxpdHRsZSBsb25nZXIKKyAgICAgICAgcmVzdWx0ID0gbS5tYXBGaWxlTmFtZSgiZm9vLmJhei5iYXIiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIG1hdGNoIGZvbypiYXIiLCByZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9ubHkgb25lIHJlc3VsdCBmb3IgZm9vLmJhei5iYXIiLCAxLCByZXN1bHQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbG9uay5iYXoucGxpbmciLCByZXN1bHRbMF0pOworCisgICAgICAgIC8vIGFuZCBhIGxpdHRsZSBzaG9ydGVyCisgICAgICAgIHJlc3VsdCA9IG0ubWFwRmlsZU5hbWUoImZvb2JhciIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgbWF0Y2ggZm9vKmJhciIsIHJlc3VsdCk7CisgICAgICAgIGFzc2VydEVxdWFscygib25seSBvbmUgcmVzdWx0IGZvciBmb29iYXIiLCAxLCByZXN1bHQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbG9ua3BsaW5nIiwgcmVzdWx0WzBdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9KQVhQVXRpbHNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9KQVhQVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhM2I3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0pBWFBVdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogSkFYUFV0aWxzIHRlc3QgY2FzZQorICovCitwdWJsaWMgY2xhc3MgSkFYUFV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgSkFYUFV0aWxzVGVzdChTdHJpbmcgbmFtZSl7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTeXN0ZW1JZCgpeworICAgICAgICBGaWxlIGZpbGUgPSBudWxsOworICAgICAgICBpZiAoIEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnXFwnICl7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoImQ6XFxqZGsiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZSgiL3VzZXIvbG9jYWwvYmluIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHN5c3RlbWlkID0gSkFYUFV0aWxzLmdldFN5c3RlbUlkKGZpbGUpOworICAgICAgICBhc3NlcnRUcnVlKCJTeXN0ZW1JRHMgc2hvdWxkIHN0YXJ0IGJ5IGZpbGU6LyIsIHN5c3RlbWlkLnN0YXJ0c1dpdGgoImZpbGU6LyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3lzdGVtSURzIHNob3VsZCBub3Qgc3RhcnQgd2l0aCBmaWxlOi8vLy8iLCAhc3lzdGVtaWQuc3RhcnRzV2l0aCgiZmlsZTovLy8vIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0phdmFFbnZVdGlsc1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0phdmFFbnZVdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzI1ZmMyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSmF2YUVudlV0aWxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworCisvKioKKyAqIFRlc3RDYXNlIGZvciBKYXZhRW52VXRpbHMuCisgKgorICovCitwdWJsaWMgY2xhc3MgSmF2YUVudlV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCisgICAgcHVibGljIEphdmFFbnZVdGlsc1Rlc3QoU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldEV4ZWN1dGFibGVOZXR3YXJlKCkgeworICAgICAgICBpZiAoT3MuaXNOYW1lKCJuZXR3YXJlIikpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiamF2YSIsIEphdmFFbnZVdGlscy5nZXRKcmVFeGVjdXRhYmxlKCJqYXZhIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhYyIsIEphdmFFbnZVdGlscy5nZXRKZGtFeGVjdXRhYmxlKCJqYXZhYyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgSmF2YUVudlV0aWxzLmdldEpyZUV4ZWN1dGFibGUoImZvbyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgSmF2YUVudlV0aWxzLmdldEpka0V4ZWN1dGFibGUoImZvbyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGVjdXRhYmxlV2luZG93cygpIHsKKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJ3aW5kb3dzIikpIHsKKyAgICAgICAgICAgIFN0cmluZyBqYXZhSG9tZSA9CisgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSkKKyAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCk7CisKKyAgICAgICAgICAgIFN0cmluZyBqID0gSmF2YUVudlV0aWxzLmdldEpyZUV4ZWN1dGFibGUoImphdmEiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoai5lbmRzV2l0aCgiLmV4ZSIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaisiIGlzIGFic29sdXRlIiwgKG5ldyBGaWxlKGopKS5pc0Fic29sdXRlKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGorIiBpcyBub3JtYWxpemVkIGFuZCBpbiB0aGUgSlJFIGRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBqLnN0YXJ0c1dpdGgoamF2YUhvbWUpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBqYXZhLmhvbWUgaXMgYm9ndXMKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEuZXhlIiwgaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGogPSBKYXZhRW52VXRpbHMuZ2V0SmRrRXhlY3V0YWJsZSgiamF2YWMiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoai5lbmRzV2l0aCgiLmV4ZSIpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqKyIgaXMgYWJzb2x1dGUiLCAobmV3IEZpbGUoaikpLmlzQWJzb2x1dGUoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFIb21lUGFyZW50ID0KKyAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoamF2YUhvbWUrIi8uLiIpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaisiIGlzIG5vcm1hbGl6ZWQgYW5kIGluIHRoZSBKREsgZGlyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGouc3RhcnRzV2l0aChqYXZhSG9tZVBhcmVudCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaisiIGlzIG5vcm1hbGl6ZWQgYW5kIG5vdCBpbiB0aGUgSlJFIGRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhai5zdGFydHNXaXRoKGphdmFIb21lKSk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBqYXZhLmhvbWUgaXMgYm9ndXMKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImphdmFjLmV4ZSIsIGopOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvby5leGUiLCBKYXZhRW52VXRpbHMuZ2V0SnJlRXhlY3V0YWJsZSgiZm9vIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28uZXhlIiwgSmF2YUVudlV0aWxzLmdldEpka0V4ZWN1dGFibGUoImZvbyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGVjdXRhYmxlTW9zdFBsYXRmb3JtcygpIHsKKyAgICAgICAgaWYgKCFPcy5pc05hbWUoIm5ldHdhcmUiKSAmJiAhT3MuaXNGYW1pbHkoIndpbmRvd3MiKSkgeworICAgICAgICAgICAgU3RyaW5nIGphdmFIb21lID0KKyAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpKQorICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKTsKKworICAgICAgICAgICAgLy8gY291bGQgc3RpbGwgYmUgT1MvMgorICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IE9zLmlzRmFtaWx5KCJkb3MiKSA/ICIuZXhlIiA6ICIiOworCisgICAgICAgICAgICBTdHJpbmcgaiA9IEphdmFFbnZVdGlscy5nZXRKcmVFeGVjdXRhYmxlKCJqYXZhIik7CisgICAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqLmVuZHNXaXRoKGV4dGVuc2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqKyIgaXMgYWJzb2x1dGUiLCAobmV3IEZpbGUoaikpLmlzQWJzb2x1dGUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGorIiBpcyBub3JtYWxpemVkIGFuZCBpbiB0aGUgSlJFIGRpciIsCisgICAgICAgICAgICAgICAgICAgICAgIGouc3RhcnRzV2l0aChqYXZhSG9tZSkpOworCisgICAgICAgICAgICBqID0gSmF2YUVudlV0aWxzLmdldEpka0V4ZWN1dGFibGUoImphdmFjIik7CisgICAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqLmVuZHNXaXRoKGV4dGVuc2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqKyIgaXMgYWJzb2x1dGUiLCAobmV3IEZpbGUoaikpLmlzQWJzb2x1dGUoKSk7CisKKyAgICAgICAgICAgIFN0cmluZyBqYXZhSG9tZVBhcmVudCA9CisgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoamF2YUhvbWUrIi8uLiIpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqKyIgaXMgbm9ybWFsaXplZCBhbmQgaW4gdGhlIEpESyBkaXIiLAorICAgICAgICAgICAgICAgICAgICAgICBqLnN0YXJ0c1dpdGgoamF2YUhvbWVQYXJlbnQpKTsKKworICAgICAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJtYWMiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaisiIGlzIG5vcm1hbGl6ZWQgYW5kIGluIHRoZSBKUkUgZGlyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGouc3RhcnRzV2l0aChqYXZhSG9tZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGorIiBpcyBub3JtYWxpemVkIGFuZCBub3QgaW4gdGhlIEpSRSBkaXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIWouc3RhcnRzV2l0aChqYXZhSG9tZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIrZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFFbnZVdGlscy5nZXRKcmVFeGVjdXRhYmxlKCJmb28iKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIrZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFFbnZVdGlscy5nZXRKZGtFeGVjdXRhYmxlKCJmb28iKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0F0TGVhc3RKYXZhVmVyc2lvbigpCisgICAgeworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJDdXJyZW50IGphdmEgdmVyc2lvbiBpcyBub3QgYXQgbGVhc3QgdGhlIGN1cnJlbnQgamF2YSB2ZXJzaW9uLi4uIiwKKyAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLmdldEphdmFWZXJzaW9uKCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoCisgICAgICAgICAgICAgICAgIkluIGNhc2UgdGhlIGN1cnJlbnQgamF2YSB2ZXJzaW9uIGlzIGhpZ2hlciB0aGFuIDkuMCBkZWZpbml0ZWx5IGEgbmV3IGFsZ29yaXRoZW0gd2lsbCBiZSBuZWVkZWQiLAorICAgICAgICAgICAgICAgIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbigiOS4wIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF6eUZpbGVPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5RmlsZU91dHB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ2NjllCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF6eUZpbGVPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBMYXp5RmlsZU91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBMYXp5RmlsZU91dHB1dFN0cmVhbSBsb3M7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRmlsZSBmID0gbmV3IEZpbGUoInRlc3QudHh0Iik7CisKKyAgICBwdWJsaWMgTGF6eUZpbGVPdXRwdXRTdHJlYW1UZXN0KFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBsb3MgPSBuZXcgTGF6eUZpbGVPdXRwdXRTdHJlYW0oZik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9zLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vRmlsZVdpdGhvdXRXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvcy5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKGYgKyAiIGhhcyBub3QgYmVlbiB3cml0dGVuLiIsICFmLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvcy5vcGVuKCk7CisgICAgICAgIGxvcy5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKGYgKyAiIGhhcyBiZWVuIHdyaXR0ZW4uIiwgZi5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb3Mud3JpdGUoMCk7CisgICAgICAgIGxvcy5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKGYgKyAiIGhhcyBiZWVuIHdyaXR0ZW4uIiwgZi5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvcy53cml0ZShuZXcgYnl0ZVtdIHswfSk7CisgICAgICAgIGxvcy5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKGYgKyAiIGhhcyBiZWVuIHdyaXR0ZW4uIiwgZi5leGlzdHMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiY2I0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICovCisKK3B1YmxpYyBjbGFzcyBMaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExJTkUgPSAiVGhpcyBpcyBhIGxpbmUiOworICAgIHByaXZhdGUgRHVtbXlTdHJlYW0gc3RyZWFtOworCisgICAgcHVibGljIExpbmVPcmllbnRlZE91dHB1dFN0cmVhbVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzdHJlYW0gPSBuZXcgRHVtbXlTdHJlYW0oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVdpdGhMaW5lZmVlZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVCeXRlQXJyYXkoKTsKKyAgICAgICAgd3JpdGVBc0FycmF5KCdcbicpOworICAgICAgICBzdHJlYW0uYXNzZXJ0SW52b2tlZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5lV2l0aExpbmVmZWVkU2luZ2xlQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZVNpbmdsZUJ5dGVzKCk7CisgICAgICAgIHN0cmVhbS53cml0ZSgnXG4nKTsKKyAgICAgICAgc3RyZWFtLmFzc2VydEludm9rZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVdpdGhDYXJpYWdlcmV0dXJuQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZUJ5dGVBcnJheSgpOworICAgICAgICB3cml0ZUFzQXJyYXkoJ1xyJyk7CisgICAgICAgIHN0cmVhbS5hc3NlcnRJbnZva2VkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpbmVXaXRoQ2FyaWFnZXJldHVyblNpbmdsZUJ5dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVTaW5nbGVCeXRlcygpOworICAgICAgICBzdHJlYW0ud3JpdGUoJ1xyJyk7CisgICAgICAgIHN0cmVhbS5hc3NlcnRJbnZva2VkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpbmVXaXRoQ2FyaWFnZXJldHVybkxpbmVmZWVkQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZUJ5dGVBcnJheSgpOworICAgICAgICB3cml0ZUFzQXJyYXkoJ1xyJyk7CisgICAgICAgIHdyaXRlQXNBcnJheSgnXG4nKTsKKyAgICAgICAgc3RyZWFtLmFzc2VydEludm9rZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVdpdGhDYXJpYWdlcmV0dXJuTGluZWZlZWRTaW5nbGVCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlU2luZ2xlQnl0ZXMoKTsKKyAgICAgICAgc3RyZWFtLndyaXRlKCdccicpOworICAgICAgICBzdHJlYW0ud3JpdGUoJ1xuJyk7CisgICAgICAgIHN0cmVhbS5hc3NlcnRJbnZva2VkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZsdXNoQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZUJ5dGVBcnJheSgpOworICAgICAgICBzdHJlYW0uZmx1c2goKTsKKyAgICAgICAgc3RyZWFtLmFzc2VydEludm9rZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rmx1c2hTaW5nbGVCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlU2luZ2xlQnl0ZXMoKTsKKyAgICAgICAgc3RyZWFtLmZsdXNoKCk7CisgICAgICAgIHN0cmVhbS5hc3NlcnRJbnZva2VkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZUJ5dGVBcnJheSgpOworICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgc3RyZWFtLmFzc2VydEludm9rZWQoKTsKKyAgICAgICAgc3RyZWFtID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VTaW5nbGVCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlU2luZ2xlQnl0ZXMoKTsKKyAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIHN0cmVhbS5hc3NlcnRJbnZva2VkKCk7CisgICAgICAgIHN0cmVhbSA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQnl0ZUFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLndyaXRlKExJTkUuZ2V0Qnl0ZXMoKSwgMCwgTElORS5sZW5ndGgoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlU2luZ2xlQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYiA9IExJTkUuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoYltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVBc0FycmF5KGNoYXIgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLndyaXRlKG5ldyBieXRlW10geyhieXRlKSBjfSwgMCwgMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBEdW1teVN0cmVhbSBleHRlbmRzIExpbmVPcmllbnRlZE91dHB1dFN0cmVhbSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpbnZva2VkOworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGluZShTdHJpbmcgbGluZSkgeworICAgICAgICAgICAgTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtVGVzdC50aGlzLmFzc2VydEZhbHNlKCJPbmx5IG9uZSBsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VkKTsKKyAgICAgICAgICAgIExpbmVPcmllbnRlZE91dHB1dFN0cmVhbVRlc3QudGhpcy5hc3NlcnRFcXVhbHMoTElORSwgbGluZSk7CisgICAgICAgICAgICBpbnZva2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBhc3NlcnRJbnZva2VkKCkgeworICAgICAgICAgICAgTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtVGVzdC50aGlzLmFzc2VydFRydWUoIkF0IGxlYXN0IG9uZSBsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VkKTsKKyAgICAgICAgfQorICAgIH0KK30vLyBMaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW1UZXN0CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Mb2FkZXJVdGlsc1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xvYWRlclV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTE4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Mb2FkZXJVdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEBzaW5jZSBBbnQgMS42CisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkZXJVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgTG9hZGVyVXRpbHNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRYeXpTb3VyY2UoKSB7CisgICAgICAgIEZpbGUgZjEgPSBMb2FkZXJVdGlscy5nZXRDbGFzc1NvdXJjZShMb2FkZXJVdGlscy5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZjEpOworCisgICAgICAgIEZpbGUgZjIgPSBMb2FkZXJVdGlscy5nZXRSZXNvdXJjZVNvdXJjZShudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmMik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGYxLmdldEFic29sdXRlUGF0aCgpLCBmMi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QYWNrYWdlTmFtZU1hcHBlclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1BhY2thZ2VOYW1lTWFwcGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2Yzg1OWYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QYWNrYWdlTmFtZU1hcHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisgcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFBhY2thZ2VOYW1lTWFwcGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgUGFja2FnZU5hbWVNYXBwZXJUZXN0KFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZygpIHsKKyAgICAgICAgUGFja2FnZU5hbWVNYXBwZXIgbWFwcGVyID0gbmV3IFBhY2thZ2VOYW1lTWFwcGVyKCk7CisgICAgICAgIG1hcHBlci5zZXRGcm9tKCIqLmphdmEiKTsKKyAgICAgICAgbWFwcGVyLnNldFRvKCJURVNULSoueG1sIik7CisgICAgICAgIFN0cmluZyBmaWxlID0gZml4dXBQYXRoKCJvcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1BhY2thZ2VOYW1lTWFwcGVyVGVzdC5qYXZhIik7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBtYXBwZXIubWFwRmlsZU5hbWUoZmlsZSlbMF07CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURVNULW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUGFja2FnZU5hbWVNYXBwZXJUZXN0LnhtbCIsCisgICAgICAgICAgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBmaXh1cFBhdGgoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIGZpbGUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVhZGVySW5wdXRTdHJlYW1UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWFkZXJJbnB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQyMWNlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVhZGVySW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby4qOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgZm9yIFJlYWRlcklucHV0U3RyZWFtCisgKi8KK3B1YmxpYyBjbGFzcyBSZWFkZXJJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIFJlYWRlcklucHV0U3RyZWFtVGVzdChTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbXBhcmVCeXRlcygiYWJjIiwgInV0Zi04Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZTE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbXBhcmVCeXRlcygiYSIsICJ1dGYtMTYiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQWJjMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVEhJUyBXSUxMIEZBSUwuCisgICAgICAgIC8vY29tcGFyZUJ5dGVzKCJhYmMiLCAidXRmLTE2Iik7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzQwXTsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIFJlYWRlcklucHV0U3RyZWFtIHIgPSBuZXcgUmVhZGVySW5wdXRTdHJlYW0oCisgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKCJhYmMiKSwgInV0Zi0xNiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgdHJ1ZTsgKytpKSB7CisgICAgICAgICAgICBpbnQgcmVzID0gci5yZWFkKCk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlc1twb3MrK10gPSAoYnl0ZSkgcmVzOworICAgICAgICB9CisgICAgICAgIGJ5dGVzID0gImFiYyIuZ2V0Qnl0ZXMoInV0Zi0xNiIpOworICAgICAgICAvLyAgICAgICAgU3RyaW5nIG4gPSBuZXcgU3RyaW5nKGJ5dGVzLCAwLCBwb3MsICJ1dGYtMTYiKTsKKyAgICAgICAgU3RyaW5nIG4gPSBuZXcgU3RyaW5nKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgsICJ1dGYtMTYiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkWmVybygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZWFkZXJJbnB1dFN0cmVhbSByID0gbmV3IFJlYWRlcklucHV0U3RyZWFtKAorICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcigiYWJjIikpOworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVszMF07CisgICAgICAgIC8vIEZpcnN0IHJlYWQgaW4gemVybyBieXRlcworICAgICAgICByLnJlYWQoYnl0ZXMsIDAsIDApOworICAgICAgICAvLyBOb3cgcmVhZCBpbiB0aGUgc3RyaW5nCisgICAgICAgIGludCByZWFkaW4gPSByLnJlYWQoYnl0ZXMsIDAsIDEwKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGNvdW50cyBhcmUgdGhlIHNhbWUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLmdldEJ5dGVzKCkubGVuZ3RoLCByZWFkaW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVhbXBsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSAiIi5nZXRCeXRlcygidXRmLTE2Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJlYW1wbGUgbGVuIGlzICIgKyBieXRlcy5sZW5ndGgpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY29tcGFyZUJ5dGVzKFN0cmluZyBzLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZXhwZWN0ZWQgPSBzLmdldEJ5dGVzKGVuY29kaW5nKTsKKyAgICAgICAgCisgICAgICAgIFJlYWRlcklucHV0U3RyZWFtIHIgPSBuZXcgUmVhZGVySW5wdXRTdHJlYW0oCisgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKHMpLCBlbmNvZGluZyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGludCBleHBlY3QgPSBleHBlY3RlZFtpXSAmIDB4RkY7CisgICAgICAgICAgICBpbnQgcmVhZCA9IHIucmVhZCgpOworICAgICAgICAgICAgaWYgKGV4cGVjdCAhPSByZWFkKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiTWlzbWF0Y2ggaW4gUmVhZGVySW5wdXRTdHJlYW0gYXQgaW5kZXggIiArIGkKKyAgICAgICAgICAgICAgICAgICAgICsgIiBleHBlY3RpbmcgIiArIGV4cGVjdCArICIgZ290ICIgKyByZWFkICsgIiBmb3Igc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICsgcyArICIgd2l0aCBlbmNvZGluZyAiICsgZW5jb2RpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyLnJlYWQoKSAhPSAtMSkgeworICAgICAgICAgICAgZmFpbCgiTWlzbWF0Y2ggaW4gUmVhZGVySW5wdXRTdHJlYW0gLSBFT0Ygbm90IHNlZW4gZm9yIHN0cmluZyAiCisgICAgICAgICAgICAgICAgICsgcyArICIgd2l0aCBlbmNvZGluZyAiICsgZW5jb2RpbmcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVzb3VyY2VVdGlsc1Rlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Jlc291cmNlVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyNzE4YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Jlc291cmNlVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VGYWN0b3J5OworCisvKioKKyAqIFRlc3RzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlc291cmNlVXRpbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlCisgICAgaW1wbGVtZW50cyBSZXNvdXJjZUZhY3RvcnksIEZpbGVOYW1lTWFwcGVyIHsKKworICAgIHByaXZhdGUgRWNobyB0YXNrSU5lZWRGb3JMb2dnaW5nID0gbmV3IEVjaG8oKTsKKworICAgIHB1YmxpYyBSZXNvdXJjZVV0aWxzVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICAgICAgdGFza0lOZWVkRm9yTG9nZ2luZy5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0R1cGxpY2F0ZXMoKSB7CisgICAgICAgIFJlc291cmNlIHIgPSBuZXcgUmVzb3VyY2UoInNhbXVhbCB2aW1lcyIsIHRydWUsIDEsIGZhbHNlKTsKKyAgICAgICAgUmVzb3VyY2VbXSB0b05ldyA9CisgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLnNlbGVjdE91dE9mRGF0ZVNvdXJjZXModGFza0lOZWVkRm9yTG9nZ2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VbXSB7cn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgdGhpcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0b05ldy5sZW5ndGgpOworICAgIH0KKworICAgIC8qID09PT09PT09PT09PSBSZXNvdXJjZUZhY3RvcnkgaW50ZXJmYWNlID09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZShuYW1lKTsgLy8gaW1wbGllcyBsYXN0TW9kaWZpZWQgPT0gMAorICAgIH0KKworICAgIC8qID09PT09PT09PT09PSBGaWxlTmFtZU1hcHBlciBpbnRlcmZhY2UgPT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBzKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyBzKSB7fQorICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiZnJlZCBjb2xvbiIsICJjYXJyb3QgaXJvbmZvdW5kZXJzc29uIn07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3RyaW5nVXRpbHNUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdVdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmUwODk4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3RyaW5nVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdCBmb3IgU3RyaW5nVXRpbHMKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ1V0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgU3RyaW5nVXRpbHNUZXN0KFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTcGxpdCgpeworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSA9ICJhLGIsLCI7CisgICAgICAgIFZlY3RvciByZXMgPSBTdHJpbmdVdGlscy5zcGxpdChkYXRhLCAnLCcpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcmVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlcy5lbGVtZW50QXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZXMuZWxlbWVudEF0KDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCByZXMuZWxlbWVudEF0KDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCByZXMuZWxlbWVudEF0KDMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsaXRMaW5lcygpeworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSA9ICJhXHJcbmJcbmNcbmRcbmUiOworICAgICAgICBWZWN0b3IgcmVzID0gU3RyaW5nVXRpbHMubGluZVNwbGl0KGRhdGEpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcmVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYVxyIiwgcmVzLmVsZW1lbnRBdCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHJlcy5lbGVtZW50QXQoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCByZXMuZWxlbWVudEF0KDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkIiwgcmVzLmVsZW1lbnRBdCgzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZSIsIHJlcy5lbGVtZW50QXQoNCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSA9ICJhYmNhYmNhYmNhIjsKKyAgICAgICAgU3RyaW5nIHJlcyA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoZGF0YSwgImEiLCAiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYmNiY2JjIiwgcmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kc1dpdGhCb3RoRW1wdHkoKSB7CisgICAgICAgIGFzc2VydFRydWUoIFN0cmluZ1V0aWxzLmVuZHNXaXRoKCBuZXcgU3RyaW5nQnVmZmVyKCksICIiKSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRzV2l0aEVtcHR5U3RyaW5nKCkgeworICAgICAgICBhc3NlcnRUcnVlKCBTdHJpbmdVdGlscy5lbmRzV2l0aCggbmV3IFN0cmluZ0J1ZmZlcigiMTIyMzQ1NDUiKSwgIiIpICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVuZHNXaXRoU2hvcnRlclN0cmluZygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSggU3RyaW5nVXRpbHMuZW5kc1dpdGgoIG5ldyBTdHJpbmdCdWZmZXIoIjEyMzQ1Njc4IiksICI3OCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kc1dpdGhTYW1lU3RyaW5nKCkgeworICAgICAgICBhc3NlcnRUcnVlKCBTdHJpbmdVdGlscy5lbmRzV2l0aCggbmV3IFN0cmluZ0J1ZmZlcigiMTIzIiksICIxMjMiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVuZHNXaXRoTG9uZ2VyU3RyaW5nKCkgeworICAgICAgICBhc3NlcnRGYWxzZSggU3RyaW5nVXRpbHMuZW5kc1dpdGgoIG5ldyBTdHJpbmdCdWZmZXIoIjEyIiksICIxMjQ1IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRzV2l0aE5vTWF0Y2goKSB7CisgICAgICAgIGFzc2VydEZhbHNlKCBTdHJpbmdVdGlscy5lbmRzV2l0aCggbmV3IFN0cmluZ0J1ZmZlcigiMTIzNDU2NzgiKSwgIjc4OSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kc1dpdGhFbXB0eUJ1ZmZlcigpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIFN0cmluZ1V0aWxzLmVuZHNXaXRoKCBuZXcgU3RyaW5nQnVmZmVyKCIiKSwgIjEyMzQ1NjY3IikgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kc1dpdGhKREtQZXJmKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gZ2V0RmlsbGVkQnVmZmVyKDEwMjQqMzAwLCAnYScpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidWYudG9TdHJpbmcoKS5lbmRzV2l0aCgiYWEiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kc1dpdGhQZXJmKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gZ2V0RmlsbGVkQnVmZmVyKDEwMjQqMzAwLCAnYScpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmdVdGlscy5lbmRzV2l0aChidWYsICJhYSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGdldEZpbGxlZEJ1ZmZlcihpbnQgc2l6ZSwgY2hhciBjaCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsgYnVmLmFwcGVuZChjaCk7IH07CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUh1bWFuU2l6ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAJZmluYWwgbG9uZyBLSUxPQllURSA9IDEwMjQ7CisgICAgCWZpbmFsIGxvbmcgTUVHQUJZVEUgPSBLSUxPQllURSAqIDEwMjQ7CisgICAgCWZpbmFsIGxvbmcgR0lHQUJZVEUgPSBNRUdBQllURSAqIDEwMjQ7CisgICAgCWZpbmFsIGxvbmcgVEVSQUJZVEUgPSBHSUdBQllURSAqIDEwMjQ7CisgICAgCWZpbmFsIGxvbmcgUEVUQUJZVEUgPSBURVJBQllURSAqIDEwMjQ7CisgICAgCWFzc2VydEVxdWFscyhTdHJpbmdVdGlscy5wYXJzZUh1bWFuU2l6ZXMoIjFLIiksIEtJTE9CWVRFKTsKKyAgICAJYXNzZXJ0RXF1YWxzKFN0cmluZ1V0aWxzLnBhcnNlSHVtYW5TaXplcygiMU0iKSwgTUVHQUJZVEUpOworICAgIAlhc3NlcnRFcXVhbHMoU3RyaW5nVXRpbHMucGFyc2VIdW1hblNpemVzKCIxRyIpLCBHSUdBQllURSk7CisgICAgCWFzc2VydEVxdWFscyhTdHJpbmdVdGlscy5wYXJzZUh1bWFuU2l6ZXMoIjFUIiksIFRFUkFCWVRFKTsKKyAgICAJYXNzZXJ0RXF1YWxzKFN0cmluZ1V0aWxzLnBhcnNlSHVtYW5TaXplcygiMVAiKSwgUEVUQUJZVEUpOworICAgIAlhc3NlcnRFcXVhbHMoU3RyaW5nVXRpbHMucGFyc2VIdW1hblNpemVzKCIxIiksIDFMKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVN1ZmZpeCgpIHsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJQcmVmaXgiOworICAgICAgICBTdHJpbmcgbmFtZSA9ICJOYW1lIjsKKyAgICAgICAgU3RyaW5nIHN1ZmZpeCA9ICJTdWZmaXgiOworICAgICAgICBTdHJpbmcgaW5wdXQgPSBwcmVmaXggKyBuYW1lICsgc3VmZml4OworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiRG9lcyBub3QgcmVtb3ZlIHRoZSBzdWZmaXggcmlnaHQuIiwgICAgCisgICAgICAgICAgICBwcmVmaXggKyBuYW1lLCAKKyAgICAgICAgICAgIFN0cmluZ1V0aWxzLnJlbW92ZVN1ZmZpeChpbnB1dCwgc3VmZml4KQorICAgICAgICApOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiU2hvdWxkIGxlYXZlIHRoZSBzdHJpbmcgdW5hdHRlbmRlZC4iLCAgICAKKyAgICAgICAgICAgIHByZWZpeCArIG5hbWUgKyBzdWZmaXgsIAorICAgICAgICAgICAgU3RyaW5nVXRpbHMucmVtb3ZlU3VmZml4KGlucHV0LCAiYmxhIikKKyAgICAgICAgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVByZWZpeCgpIHsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJQcmVmaXgiOworICAgICAgICBTdHJpbmcgbmFtZSA9ICJOYW1lIjsKKyAgICAgICAgU3RyaW5nIHN1ZmZpeCA9ICJTdWZmaXgiOworICAgICAgICBTdHJpbmcgaW5wdXQgPSBwcmVmaXggKyBuYW1lICsgc3VmZml4OworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiRG9lcyBub3QgcmVtb3ZlIHRoZSBwcmVmaXggcmlnaHQuIiwgICAgCisgICAgICAgICAgICBuYW1lICsgc3VmZml4LCAKKyAgICAgICAgICAgIFN0cmluZ1V0aWxzLnJlbW92ZVByZWZpeChpbnB1dCwgcHJlZml4KQorICAgICAgICApOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiU2hvdWxkIGxlYXZlIHRoZSBzdHJpbmcgdW5hdHRlbmRlZC4iLCAgICAKKyAgICAgICAgICAgIHByZWZpeCArIG5hbWUgKyBzdWZmaXgsIAorICAgICAgICAgICAgU3RyaW5nVXRpbHMucmVtb3ZlUHJlZml4KGlucHV0LCAiYmxhIikKKyAgICAgICAgKTsKKyAgICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5QYWNrYWdlTmFtZU1hcHBlclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VuUGFja2FnZU5hbWVNYXBwZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4ZTFkMwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VuUGFja2FnZU5hbWVNYXBwZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFVuUGFja2FnZU5hbWVNYXBwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHB1YmxpYyBVblBhY2thZ2VOYW1lTWFwcGVyVGVzdChTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hcHBpbmcoKSB7CisgICAgICAgIFVuUGFja2FnZU5hbWVNYXBwZXIgbWFwcGVyID0gbmV3IFVuUGFja2FnZU5hbWVNYXBwZXIoKTsKKyAgICAgICAgbWFwcGVyLnNldEZyb20oIlRFU1QtKi54bWwiKTsKKyAgICAgICAgbWFwcGVyLnNldFRvKCIqLmphdmEiKTsKKyAgICAgICAgU3RyaW5nIGZpbGUgPSJURVNULW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuVW5QYWNrYWdlTmFtZU1hcHBlclRlc3QueG1sIjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG1hcHBlci5tYXBGaWxlTmFtZShmaWxlKVswXTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gZml4dXBQYXRoKCJvcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VuUGFja2FnZU5hbWVNYXBwZXJUZXN0LmphdmEiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZml4dXBQYXRoKFN0cmluZyBmaWxlKSB7CisgICAgICAgIHJldHVybiBmaWxlLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1hNTEZyYWdtZW50VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvWE1MRnJhZ21lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzOWQ2MAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1hNTEZyYWdtZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlVGVzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBYTUxGcmFnbWVudFRlc3QgZXh0ZW5kcyBCdWlsZEZpbGVUZXN0IHsKKworICAgIHB1YmxpYyBYTUxGcmFnbWVudFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGZyYWdtZW50LnhtbCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRUZXh0KCkgeworICAgICAgICBYTUxGcmFnbWVudCB4ID0gKFhNTEZyYWdtZW50KSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJuZXN0ZWQtdGV4dCIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHgpOworICAgICAgICBOb2RlIG4gPSB4LmdldEZyYWdtZW50KCk7CisgICAgICAgIGFzc2VydFRydWUoIk5vIGF0dHJpYnV0ZXMiLCAhbi5oYXNBdHRyaWJ1dGVzKCkpOworICAgICAgICBOb2RlTGlzdCBubCA9IG4uZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmwuZ2V0TGVuZ3RoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTm9kZS5URVhUX05PREUsIG5sLml0ZW0oMCkuZ2V0Tm9kZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgbmwuaXRlbSgwKS5nZXROb2RlVmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZENoaWxkcmVuKCkgeworICAgICAgICBYTUxGcmFnbWVudCB4ID0KKyAgICAgICAgICAgIChYTUxGcmFnbWVudCkgZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgid2l0aC1jaGlsZHJlbiIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHgpOworICAgICAgICBOb2RlIG4gPSB4LmdldEZyYWdtZW50KCk7CisgICAgICAgIGFzc2VydFRydWUoIk5vIGF0dHJpYnV0ZXMiLCAhbi5oYXNBdHRyaWJ1dGVzKCkpOworICAgICAgICBOb2RlTGlzdCBubCA9IG4uZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbmwuZ2V0TGVuZ3RoKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhOb2RlLkVMRU1FTlRfTk9ERSwgbmwuaXRlbSgwKS5nZXROb2RlVHlwZSgpKTsKKyAgICAgICAgRWxlbWVudCBjaGlsZDEgPSAoRWxlbWVudCkgbmwuaXRlbSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZDEiLCBjaGlsZDEuZ2V0VGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghY2hpbGQxLmhhc0F0dHJpYnV0ZXMoKSk7CisgICAgICAgIE5vZGVMaXN0IG5sMiA9IGNoaWxkMS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBubDIuZ2V0TGVuZ3RoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTm9kZS5URVhUX05PREUsIG5sMi5pdGVtKDApLmdldE5vZGVUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG5sMi5pdGVtKDApLmdldE5vZGVWYWx1ZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoTm9kZS5FTEVNRU5UX05PREUsIG5sLml0ZW0oMSkuZ2V0Tm9kZVR5cGUoKSk7CisgICAgICAgIEVsZW1lbnQgY2hpbGQyID0gKEVsZW1lbnQpIG5sLml0ZW0oMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGQyIiwgY2hpbGQyLmdldFRhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoY2hpbGQyLmhhc0F0dHJpYnV0ZXMoKSk7CisgICAgICAgIG5sMiA9IGNoaWxkMi5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBubDIuZ2V0TGVuZ3RoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGNoaWxkMi5nZXRBdHRyaWJ1dGUoImZvbyIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoTm9kZS5FTEVNRU5UX05PREUsIG5sLml0ZW0oMikuZ2V0Tm9kZVR5cGUoKSk7CisgICAgICAgIEVsZW1lbnQgY2hpbGQzID0gKEVsZW1lbnQpIG5sLml0ZW0oMik7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGQzIiwgY2hpbGQzLmdldFRhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoIWNoaWxkMy5oYXNBdHRyaWJ1dGVzKCkpOworICAgICAgICBubDIgPSBjaGlsZDMuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmwyLmdldExlbmd0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5vZGUuRUxFTUVOVF9OT0RFLCBubDIuaXRlbSgwKS5nZXROb2RlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZDQiLCAoKEVsZW1lbnQpIG5sMi5pdGVtKDApKS5nZXRUYWdOYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2ZhY2FkZS9GYWNhZGVUYXNrSGVscGVyVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ZhY2FkZVRhc2tIZWxwZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwYjRkOQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2ZhY2FkZS9GYWNhZGVUYXNrSGVscGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAc2luY2UgQW50IDEuNQorICovCitwdWJsaWMgY2xhc3MgRmFjYWRlVGFza0hlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgRmFjYWRlVGFza0hlbHBlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZWNlZGVuY2VSdWxlcygpIHsKKyAgICAgICAgRmFjYWRlVGFza0hlbHBlciBmdGggPSBuZXcgRmFjYWRlVGFza0hlbHBlcigiZm9vIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgZnRoLmdldEltcGxlbWVudGF0aW9uKCkpOworCisgICAgICAgIGZ0aC5zZXRNYWdpY1ZhbHVlKCJiYXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBmdGguZ2V0SW1wbGVtZW50YXRpb24oKSk7CisKKyAgICAgICAgZnRoID0gbmV3IEZhY2FkZVRhc2tIZWxwZXIoImZvbyIsICJiYXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBmdGguZ2V0SW1wbGVtZW50YXRpb24oKSk7CisKKyAgICAgICAgZnRoID0gbmV3IEZhY2FkZVRhc2tIZWxwZXIoImZvbyIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIGZ0aC5nZXRJbXBsZW1lbnRhdGlvbigpKTsKKworICAgICAgICBmdGggPSBuZXcgRmFjYWRlVGFza0hlbHBlcigiZm9vIik7CisgICAgICAgIGZ0aC5zZXRNYWdpY1ZhbHVlKCJiYXIiKTsKKyAgICAgICAgZnRoLnNldEltcGxlbWVudGF0aW9uKCJiYXoiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXoiLCBmdGguZ2V0SW1wbGVtZW50YXRpb24oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEhhc0JlZW5TZXQoKSB7CisgICAgICAgIEZhY2FkZVRhc2tIZWxwZXIgZnRoID0gbmV3IEZhY2FkZVRhc2tIZWxwZXIoImZvbyIpOworICAgICAgICBhc3NlcnRUcnVlKCJub3RoaW5nIHNldCIsICFmdGguaGFzQmVlblNldCgpKTsKKyAgICAgICAgZnRoLnNldE1hZ2ljVmFsdWUobnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIm1hZ2ljIGhhcyBub3QgYmVlbiBzZXQiLCAhZnRoLmhhc0JlZW5TZXQoKSk7CisgICAgICAgIGZ0aC5zZXRNYWdpY1ZhbHVlKCJmb28iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWFnaWMgaGFzIGJlZW4gc2V0IiwgZnRoLmhhc0JlZW5TZXQoKSk7CisgICAgICAgIGZ0aC5zZXRNYWdpY1ZhbHVlKG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCFmdGguaGFzQmVlblNldCgpKTsKKyAgICAgICAgZnRoLnNldEltcGxlbWVudGF0aW9uKCJiYXoiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic2V0IGV4cGxpY2l0bHkiLCBmdGguaGFzQmVlblNldCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU3YTJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVwZW5kc09uSW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCBpYSA9CisgICAgICAgICAgICBuZXcgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50KCk7CisgICAgICAgIGlhLnNldExpbmUoIkEgQiIpOworICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGlhLmdldFBhcnRzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFydHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGFydHMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIiwgcGFydHNbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkIiLCBwYXJ0c1sxXSk7CisKKyAgICAgICAgcGFydHMgPSBpYS5nZXRQYXJ0cyhudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJ0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwYXJ0cy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCBwYXJ0c1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQiIsIHBhcnRzWzFdKTsKKworICAgICAgICBpYS5zZXRJbXBsZW1lbnRhdGlvbigiZm9vIik7CisgICAgICAgIHBhcnRzID0gaWEuZ2V0UGFydHMobnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGFydHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcGFydHMubGVuZ3RoKTsKKworICAgICAgICBwYXJ0cyA9IGlhLmdldFBhcnRzKCJmb28iKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJ0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwYXJ0cy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCBwYXJ0c1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQiIsIHBhcnRzWzFdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb01hdGNoZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb01hdGNoZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0MDVmNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvTWF0Y2hlclRlc3QuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBqYWthcnRhLW9ybyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmVnZXhwTWF0Y2hlciBpbnRlcmZhY2UuCisgKgorICovCitwdWJsaWMgY2xhc3MgSmFrYXJ0YU9yb01hdGNoZXJUZXN0IGV4dGVuZHMgUmVnZXhwTWF0Y2hlclRlc3QgeworCisgICAgcHVibGljIFJlZ2V4cE1hdGNoZXIgZ2V0SW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgSmFrYXJ0YU9yb01hdGNoZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmFrYXJ0YU9yb01hdGNoZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9SZWdleHBUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb1JlZ2V4cFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODY5YzYyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9SZWdleHBUZXN0LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwOworCisvKioKKyAqIFRlc3RzIGZvciB0aGUgamFrYXJ0YS1vcm8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFJlZ2V4cCBpbnRlcmZhY2UuCisgKgorICovCitwdWJsaWMgY2xhc3MgSmFrYXJ0YU9yb1JlZ2V4cFRlc3QgZXh0ZW5kcyBSZWdleHBUZXN0IHsKKworICAgIHB1YmxpYyBSZWdleHAgZ2V0UmVnZXhwSW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgSmFrYXJ0YU9yb1JlZ2V4cCgpOworICAgIH0KKworICAgIHB1YmxpYyBKYWthcnRhT3JvUmVnZXhwVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwTWF0Y2hlclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwTWF0Y2hlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzQwYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBqYWthcnRhLXJlZ2V4cCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmVnZXhwTWF0Y2hlciBpbnRlcmZhY2UuCisgKgorICovCitwdWJsaWMgY2xhc3MgSmFrYXJ0YVJlZ2V4cE1hdGNoZXJUZXN0IGV4dGVuZHMgUmVnZXhwTWF0Y2hlclRlc3QgeworCisgICAgcHVibGljIFJlZ2V4cE1hdGNoZXIgZ2V0SW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgSmFrYXJ0YVJlZ2V4cE1hdGNoZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmFrYXJ0YVJlZ2V4cE1hdGNoZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dzTGluZVNlcGFyYXRvcjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIudGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yMigpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRyaWdnZXIgd2hlbiB0aGlzIGJ1ZyBpcyBmaXhlZC4ge0BzaW5jZSAxLjJ9Iik7CisgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWxzIGZvciB0aGUgc2FtZSByZWFzb24gYXMgImRlZmF1bHQiIG1vZGUgaW4gZG9FbmRUZXN0Mi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5peExpbmVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIudGVzdFVuaXhMaW5lU2VwYXJhdG9yKCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgdHJpZ2dlciBvbmNlIHRoaXMgYnVnIGlzIGZpeGVkLiB7QHNpbmNlIDEuMn0iKTsKKyAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgeworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGYWlscyBmb3IgImRlZmF1bHQiIG1vZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9FbmRUZXN0MihTdHJpbmcgdGV4dCkge30KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwUmVnZXhwVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBSZWdleHBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4ZmJiMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwUmVnZXhwVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBqYWthcnRhLXJlZ2V4cCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmVnZXhwIGludGVyZmFjZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKYWthcnRhUmVnZXhwUmVnZXhwVGVzdCBleHRlbmRzIFJlZ2V4cFRlc3QgeworCisgICAgcHVibGljIFJlZ2V4cCBnZXRSZWdleHBJbXBsZW1lbnRhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYWthcnRhUmVnZXhwUmVnZXhwKCk7CisgICAgfQorCisgICAgcHVibGljIEpha2FydGFSZWdleHBSZWdleHBUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dzTGluZVNlcGFyYXRvcjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIudGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yMigpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRyaWdnZXIgd2hlbiB0aGlzIGJ1ZyBpcyBmaXhlZC4ge0BzaW5jZSAxLjJ9Iik7CisgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbHMgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyAiZGVmYXVsdCIgbW9kZSBpbiBkb0VuZFRlc3QyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVbml4TGluZVNlcGFyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci50ZXN0VW5peExpbmVTZXBhcmF0b3IoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0cmlnZ2VyIG9uY2UgdGhpcyBidWcgaXMgZml4ZWQuIHtAc2luY2UgMS4yfSIpOworICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWxzIGZvciAiZGVmYXVsdCIgbW9kZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0VuZFRlc3QyKFN0cmluZyB0ZXh0KSB7fQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwTWF0Y2hlclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0MmU3MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIEpESyAxLjQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJlZ2V4cE1hdGNoZXIgaW50ZXJmYWNlLgorICoKKyAqLworcHVibGljIGNsYXNzIEpkazE0UmVnZXhwTWF0Y2hlclRlc3QgZXh0ZW5kcyBSZWdleHBNYXRjaGVyVGVzdCB7CisKKyAgICBwdWJsaWMgUmVnZXhwTWF0Y2hlciBnZXRJbXBsZW1lbnRhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZGsxNFJlZ2V4cE1hdGNoZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmRrMTRSZWdleHBNYXRjaGVyVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYWdyYXBoQ2hhcmFjdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RQYXJhZ3JhcGhDaGFyYWN0ZXIoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0cmlnZ2VyIG9uY2UgZml4ZWQuIHtAc2luY2UgSkRLIDEuNFJDMX0iKTsKKyAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVNlcGFyYXRvckNoYXJhY3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci50ZXN0TGluZVNlcGFyYXRvckNoYXJhY3RlcigpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSBKREsgMS40UkMxfSIpOworICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFsb25lQ1IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIudGVzdFN0YW5kYWxvbmVDUigpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSBKREsgMS40UkMxfSIpOworICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dzTGluZVNlcGFyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci50ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0cmlnZ2VyIG9uY2UgZml4ZWQuIHtAc2luY2UgSkRLIDEuNFJDMX0iKTsKKyAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBSZWdleHBUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBSZWdleHBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2MDQwNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cFJlZ2V4cFRlc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworCisvKioKKyAqIFRlc3RzIGZvciB0aGUgSkRLIDEuNCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmVnZXhwIGludGVyZmFjZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKZGsxNFJlZ2V4cFJlZ2V4cFRlc3QgZXh0ZW5kcyBSZWdleHBUZXN0IHsKKworICAgIHB1YmxpYyBSZWdleHAgZ2V0UmVnZXhwSW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgSmRrMTRSZWdleHBSZWdleHAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmRrMTRSZWdleHBSZWdleHBUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhZ3JhcGhDaGFyYWN0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIudGVzdFBhcmFncmFwaENoYXJhY3RlcigpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSBKREsgMS40UkMxfSIpOworICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5lU2VwYXJhdG9yQ2hhcmFjdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RMaW5lU2VwYXJhdG9yQ2hhcmFjdGVyKCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgdHJpZ2dlciBvbmNlIGZpeGVkLiB7QHNpbmNlIEpESyAxLjRSQzF9Iik7CisgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYWxvbmVDUigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci50ZXN0U3RhbmRhbG9uZUNSKCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgdHJpZ2dlciBvbmNlIGZpeGVkLiB7QHNpbmNlIEpESyAxLjRSQzF9Iik7CisgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLnRlc3RXaW5kb3dzTGluZVNlcGFyYXRvcigpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSBKREsgMS40UkMxfSIpOworICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXJUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTUwODI3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0cyBmb3IgYWxsIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgUmVnZXhwTWF0Y2hlciBpbnRlcmZhY2UuCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVnZXhwTWF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVTklYX0xJTkUgPSAiXG4iOworCisgICAgcHJpdmF0ZSBSZWdleHBNYXRjaGVyIHJlZzsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBSZWdleHBNYXRjaGVyIGdldEltcGxlbWVudGF0aW9uKCk7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmVnZXhwTWF0Y2hlciBnZXRSZWcoKSB7cmV0dXJuIHJlZzt9CisKKyAgICBwdWJsaWMgUmVnZXhwTWF0Y2hlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHJlZyA9IGdldEltcGxlbWVudGF0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hdGNoZXMoKSB7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJhYWFhIik7CisgICAgICAgIGFzc2VydFRydWUoImFhYWEgc2hvdWxkIG1hdGNoIGl0c2VsZiIsIHJlZy5tYXRjaGVzKCJhYWFhIikpOworICAgICAgICBhc3NlcnRUcnVlKCJhYWFhIHNob3VsZCBtYXRjaCB4YWFhYSIsIHJlZy5tYXRjaGVzKCJ4YWFhYSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYWFhYSBzaG91bGRuXCd0IG1hdGNoIHhhYWEiLCAhcmVnLm1hdGNoZXMoInhhYWEiKSk7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJeYWFhYSIpOworICAgICAgICBhc3NlcnRUcnVlKCJeYWFhYSBzaG91bGRuXCd0IG1hdGNoIHhhYWFhIiwgIXJlZy5tYXRjaGVzKCJ4YWFhYSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiXmFhYWEgc2hvdWxkIG1hdGNoIGFhYWF4IiwgcmVnLm1hdGNoZXMoImFhYWF4IikpOworICAgICAgICByZWcuc2V0UGF0dGVybigiYWFhYSQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYWFhYSQgc2hvdWxkblwndCBtYXRjaCBhYWFheCIsICFyZWcubWF0Y2hlcygiYWFhYXgiKSk7CisgICAgICAgIGFzc2VydFRydWUoImFhYWEkIHNob3VsZCBtYXRjaCB4YWFhYSIsIHJlZy5tYXRjaGVzKCJ4YWFhYSIpKTsKKyAgICAgICAgcmVnLnNldFBhdHRlcm4oIlswLTldKyIpOworICAgICAgICBhc3NlcnRUcnVlKCJbMC05XSsgc2hvdWxkIG1hdGNoIDEyMyIsIHJlZy5tYXRjaGVzKCIxMjMiKSk7CisgICAgICAgIGFzc2VydFRydWUoIlswLTldKyBzaG91bGQgbWF0Y2ggMSIsIHJlZy5tYXRjaGVzKCIxIikpOworICAgICAgICBhc3NlcnRUcnVlKCJbMC05XSsgc2hvdWxkblwndCBtYXRjaCBcJ1wnIiwgIXJlZy5tYXRjaGVzKCIiKSk7CisgICAgICAgIGFzc2VydFRydWUoIlswLTldKyBzaG91bGRuXCd0IG1hdGNoIGEiLCAhcmVnLm1hdGNoZXMoImEiKSk7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJbMC05XSoiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiWzAtOV0qIHNob3VsZCBtYXRjaCAxMjMiLCByZWcubWF0Y2hlcygiMTIzIikpOworICAgICAgICBhc3NlcnRUcnVlKCJbMC05XSogc2hvdWxkIG1hdGNoIDEiLCByZWcubWF0Y2hlcygiMSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiWzAtOV0qIHNob3VsZCBtYXRjaCBcJ1wnIiwgcmVnLm1hdGNoZXMoIiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiWzAtOV0qIHNob3VsZCBtYXRjaCBhIiwgcmVnLm1hdGNoZXMoImEiKSk7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCIoWzAtOV0rKT1cXDEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiKFswLTldKyk9XFwxIHNob3VsZCBtYXRjaCAxPTEiLCByZWcubWF0Y2hlcygiMT0xIikpOworICAgICAgICBhc3NlcnRUcnVlKCIoWzAtOV0rKT1cXDEgc2hvdWxkblwndCBtYXRjaCAxPTIiLCAhcmVnLm1hdGNoZXMoIjE9MiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBzKCkgeworICAgICAgICByZWcuc2V0UGF0dGVybigiYWFhYSIpOworICAgICAgICBWZWN0b3IgdiA9IHJlZy5nZXRHcm91cHMoInhhYWFhIik7CisgICAgICAgIGFzc2VydEVxdWFscygiTm8gcGFyZW5zIC0+IG5vIGV4dHJhIGdyb3VwcyIsIDEsIHYuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUcml2aWFsIG1hdGNoIHdpdGggbm8gcGFyZW5zIiwgImFhYWEiLAorICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgdi5lbGVtZW50QXQoMCkpOworCisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCIoYWFhYSkiKTsKKyAgICAgICAgdiA9IHJlZy5nZXRHcm91cHMoInhhYWFhIik7CisgICAgICAgIGFzc2VydEVxdWFscygiVHJpdmlhbCBtYXRjaCB3aXRoIHNpbmdsZSBwYXJlbiIsIDIsIHYuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUcml2aWFsIG1hdGNoIHdpdGggc2luZ2xlIHBhcmVuLCBmdWxsIG1hdGNoIiwgImFhYWEiLAorICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgdi5lbGVtZW50QXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRyaXZpYWwgbWF0Y2ggd2l0aCBzaW5nbGUgcGFyZW4sIG1hdGNoZWQgcGFyZW4iLCAiYWFhYSIsCisgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSB2LmVsZW1lbnRBdCgwKSk7CisKKyAgICAgICAgcmVnLnNldFBhdHRlcm4oIihhKyliKGIrKSIpOworICAgICAgICB2ID0gcmVnLmdldEdyb3VwcygieGFhYmIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHYuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYWJiIiwgKFN0cmluZykgdi5lbGVtZW50QXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFhIiwgKFN0cmluZykgdi5lbGVtZW50QXQoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCAoU3RyaW5nKSB2LmVsZW1lbnRBdCgyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ1Z3ppbGxhUmVwb3J0MTQ2MTkoKSB7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJeKC4qKS9zcmMvKCguKi8pKikoW2EtekEtWjAtOV9cXC5dKylcXC5qYXZhJCIpOworICAgICAgICBWZWN0b3IgdiA9IHJlZy5nZXRHcm91cHMoImRlL3RvbS9zcmMvR29vZ2xlLmphdmEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHYuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZS90b20iLCB2LmVsZW1lbnRBdCgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgdi5lbGVtZW50QXQoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHYuZWxlbWVudEF0KDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHb29nbGUiLCB2LmVsZW1lbnRBdCg0KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhc2VJbnNlbnNpdGl2ZU1hdGNoKCkgeworICAgICAgICByZWcuc2V0UGF0dGVybigiYWFhYSIpOworICAgICAgICBhc3NlcnRUcnVlKCJhYWFhIGRvZXNuJ3QgbWF0Y2ggQUFhYSIsICFyZWcubWF0Y2hlcygiQUFhYSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYWFhYSBtYXRjaGVzIEFBYWEgaWdub3JpbmcgY2FzZSIsCisgICAgICAgICAgICAgICAgICAgcmVnLm1hdGNoZXMoIkFBYWEiLCBSZWdleHBNYXRjaGVyLk1BVENIX0NBU0VfSU5TRU5TSVRJVkUpKTsKKyAgICB9CisKKworLy8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBpc3N1ZXMgY29uY2VybmluZyBsaW5lIHNlcGFyYXRvciBpbnRlcnByZXRhdGlvbgorLy8gYSBsaW5lIHNlcGFyYXRvciBmb3IgcmVnZXggKHBlcmwpIGlzIGFsd2F5cyBhIHVuaXggbGluZSAoaWUgXG4pCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYWdyYXBoQ2hhcmFjdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmVnLnNldFBhdHRlcm4oImVuZCBvZiB0ZXh0JCIpOworICAgICAgICBhc3NlcnRUcnVlKCJwYXJhZ3JhcGggY2hhcmFjdGVyIiwgIXJlZy5tYXRjaGVzKCJlbmQgb2YgdGV4dFx1MjAyOSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVNlcGFyYXRvckNoYXJhY3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJlbmQgb2YgdGV4dCQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibGluZS1zZXBhcmF0b3IgY2hhcmFjdGVyIiwgIXJlZy5tYXRjaGVzKCJlbmQgb2YgdGV4dFx1MjAyOCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dExpbmVDaGFyYWN0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZWcuc2V0UGF0dGVybigiZW5kIG9mIHRleHQkIik7CisgICAgICAgIGFzc2VydFRydWUoIm5leHQtbGluZSBjaGFyYWN0ZXIiLCAhcmVnLm1hdGNoZXMoImVuZCBvZiB0ZXh0XHUwMDg1IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFsb25lQ1IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZWcuc2V0UGF0dGVybigiZW5kIG9mIHRleHQkIik7CisgICAgICAgIGFzc2VydFRydWUoInN0YW5kYWxvbmUgQ1IiLCAhcmVnLm1hdGNoZXMoImVuZCBvZiB0ZXh0XHIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmVnLnNldFBhdHRlcm4oImVuZCBvZiB0ZXh0JCIpOworICAgICAgICBhc3NlcnRUcnVlKCJXaW5kb3dzIGxpbmUgc2VwYXJhdG9yIiwgIXJlZy5tYXRjaGVzKCJlbmQgb2YgdGV4dFxyXG4iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJlbmQgb2YgdGV4dFxyJCIpOworICAgICAgICBhc3NlcnRUcnVlKCJXaW5kb3dzIGxpbmUgc2VwYXJhdG9yIiwgcmVnLm1hdGNoZXMoImVuZCBvZiB0ZXh0XHJcbiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5peExpbmVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZWcuc2V0UGF0dGVybigiZW5kIG9mIHRleHQkIik7CisgICAgICAgIGFzc2VydFRydWUoIlVuaXggbGluZSBzZXBhcmF0b3IiLCByZWcubWF0Y2hlcygiZW5kIG9mIHRleHRcbiIpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVZlcnN1c1NpbmdsZUxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCJMaW5lMSIpLmFwcGVuZChVTklYX0xJTkUpOworICAgICAgICBidWYuYXBwZW5kKCJzdGFydHRlc3QgTGluZTIiKS5hcHBlbmQoVU5JWF9MSU5FKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiTGluZTMgZW5kdGVzdCIpLmFwcGVuZChVTklYX0xJTkUpOworICAgICAgICBidWYuYXBwZW5kKCJMaW5lNCIpLmFwcGVuZChVTklYX0xJTkUpOworICAgICAgICBTdHJpbmcgdGV4dCA9IGJ1Zi50b1N0cmluZygpOworCisgICAgICAgIGRvU3RhcnRUZXN0MSh0ZXh0KTsKKyAgICAgICAgZG9TdGFydFRlc3QyKHRleHQpOworICAgICAgICBkb0VuZFRlc3QxKHRleHQpOworICAgICAgICBkb0VuZFRlc3QyKHRleHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRvU3RhcnRUZXN0MShTdHJpbmcgdGV4dCkgeworICAgICAgICByZWcuc2V0UGF0dGVybigiXnN0YXJ0dGVzdCIpOworICAgICAgICBhc3NlcnRUcnVlKCJec3RhcnR0ZXN0IGluIGRlZmF1bHQgbW9kZSIsICFyZWcubWF0Y2hlcyh0ZXh0KSk7CisgICAgICAgIGFzc2VydFRydWUoIl5zdGFydHRlc3QgaW4gc2luZ2xlIGxpbmUgbW9kZSIsCisgICAgICAgICAgICAgICAhcmVnLm1hdGNoZXModGV4dCwgUmVnZXhwTWF0Y2hlci5NQVRDSF9TSU5HTEVMSU5FKSk7CisgICAgICAgIGFzc2VydFRydWUoIl5zdGFydHRlc3QgaW4gbXVsdGkgbGluZSBtb2RlIiwKKyAgICAgICAgICAgICAgIHJlZy5tYXRjaGVzKHRleHQsIFJlZ2V4cE1hdGNoZXIuTUFUQ0hfTVVMVElMSU5FKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZG9TdGFydFRlc3QyKFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJeTGluZTEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiXkxpbmUxIGluIGRlZmF1bHQgbW9kZSIsIHJlZy5tYXRjaGVzKHRleHQpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiXkxpbmUxIGluIHNpbmdsZSBsaW5lIG1vZGUiLAorICAgICAgICAgICAgICAgcmVnLm1hdGNoZXModGV4dCwgUmVnZXhwTWF0Y2hlci5NQVRDSF9TSU5HTEVMSU5FKSk7CisgICAgICAgIGFzc2VydFRydWUoIl5MaW5lMSBpbiBtdWx0aSBsaW5lIG1vZGUiLAorICAgICAgICAgICAgICAgcmVnLm1hdGNoZXModGV4dCwgUmVnZXhwTWF0Y2hlci5NQVRDSF9NVUxUSUxJTkUpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0VuZFRlc3QxKFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJlbmR0ZXN0JCIpOworICAgICAgICBhc3NlcnRUcnVlKCJlbmR0ZXN0JCBpbiBkZWZhdWx0IG1vZGUiLCAhcmVnLm1hdGNoZXModGV4dCkpOworICAgICAgICBhc3NlcnRUcnVlKCJlbmR0ZXN0JCBpbiBzaW5nbGUgbGluZSBtb2RlIiwKKyAgICAgICAgICAgICAgICFyZWcubWF0Y2hlcyh0ZXh0LCBSZWdleHBNYXRjaGVyLk1BVENIX1NJTkdMRUxJTkUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5kdGVzdCQgaW4gbXVsdGkgbGluZSBtb2RlIiwKKyAgICAgICAgICAgICAgIHJlZy5tYXRjaGVzKHRleHQsIFJlZ2V4cE1hdGNoZXIuTUFUQ0hfTVVMVElMSU5FKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZG9FbmRUZXN0MihTdHJpbmcgdGV4dCkgeworICAgICAgICByZWcuc2V0UGF0dGVybigiTGluZTQkIik7CisgICAgICAgIGFzc2VydFRydWUoIkxpbmU0JCBpbiBkZWZhdWx0IG1vZGUiLCByZWcubWF0Y2hlcyh0ZXh0KSk7CisgICAgICAgIGFzc2VydFRydWUoIkxpbmU0JCBpbiBzaW5nbGUgbGluZSBtb2RlIiwKKyAgICAgICAgICAgICAgIHJlZy5tYXRjaGVzKHRleHQsIFJlZ2V4cE1hdGNoZXIuTUFUQ0hfU0lOR0xFTElORSkpOworICAgICAgICBhc3NlcnRUcnVlKCJMaW5lNCQgaW4gbXVsdGkgbGluZSBtb2RlIiwKKyAgICAgICAgICAgICAgIHJlZy5tYXRjaGVzKHRleHQsIFJlZ2V4cE1hdGNoZXIuTUFUQ0hfTVVMVElMSU5FKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2ZlOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cFRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CisKKy8qKgorICogVGVzdHMgZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFJlZ2V4cCBpbnRlcmZhY2UuCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVnZXhwVGVzdCBleHRlbmRzIFJlZ2V4cE1hdGNoZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0ID0gImFiY2RlZmctYWJjZGVmZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBhdHRlcm4gPSAiYWIoW15kXSopZChbXmZdKilmIjsKKworICAgIHB1YmxpYyBSZWdleHBUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBSZWdleHBNYXRjaGVyIGdldEltcGxlbWVudGF0aW9uKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVnZXhwSW1wbGVtZW50YXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgUmVnZXhwIGdldFJlZ2V4cEltcGxlbWVudGF0aW9uKCk7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0aW9uKCkgeworICAgICAgICBSZWdleHAgcmVnID0gKFJlZ2V4cCkgZ2V0UmVnKCk7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKHBhdHRlcm4pOworICAgICAgICBhc3NlcnRUcnVlKHJlZy5tYXRjaGVzKHRlc3QpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmVkY2ZnLWFiY2RlZmciLCByZWcuc3Vic3RpdHV0ZSh0ZXN0LCAiYWJcXDJkXFwxZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnZXhwLk1BVENIX0RFRkFVTFQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUZpcnN0U3Vic3RpdHV0aW9uKCkgeworICAgICAgICBSZWdleHAgcmVnID0gKFJlZ2V4cCkgZ2V0UmVnKCk7CisgICAgICAgIHJlZy5zZXRQYXR0ZXJuKHBhdHRlcm4pOworICAgICAgICBhc3NlcnRUcnVlKHJlZy5tYXRjaGVzKHRlc3QpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmVkY2ZnLWFiY2RlZmciLCByZWcuc3Vic3RpdHV0ZSh0ZXN0LCAiYWJcXDJkXFwxZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnZXhwLlJFUExBQ0VfRklSU1QpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbFN1YnN0aXR1dGlvbigpIHsKKyAgICAgICAgUmVnZXhwIHJlZyA9IChSZWdleHApIGdldFJlZygpOworICAgICAgICByZWcuc2V0UGF0dGVybihwYXR0ZXJuKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWcubWF0Y2hlcyh0ZXN0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJlZGNmZy1hYmVkY2ZnIiwgcmVnLnN1YnN0aXR1dGUodGVzdCwgImFiXFwyZFxcMWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4cC5SRVBMQUNFX0FMTCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL21haWwvTWFpbE1lc3NhZ2VUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9tYWlsL01haWxNZXNzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTc1MzAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9tYWlsL01haWxNZXNzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzM0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5tYWlsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLm1haWwuTWFpbE1lc3NhZ2U7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZS4KKyAqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgTWFpbE1lc3NhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLy8gMjcyMjQgPSBtYWdpYyAoYSByYW5kb20gcG9ydCB3aGljaCBpcyB1bmxpa2VseSB0byBiZSBpbiB1c2UpCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFRFU1RfUE9SVCA9IDI3MjI0OworCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWwgPSBudWxsOworCisgICAgcHVibGljIE1haWxNZXNzYWdlVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2FsID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24gdWhlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICBUZXN0IGFuIGV4YW1wbGUgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSBvbmUgZ2l2ZW4gaW4gdGhlIEFQSQorICAgICAqICBJZiB0aGlzIHRlc3RjYXNlIHRha2VzID45MHMgdG8gY29tcGxldGUsIGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQKKyAgICAgKiAgdGhlIHR3byB0aHJlYWRzIGFyZSBibG9ja2VkIHdhaXRpbmcgZm9yIGVhY2ggb3RoZXIgYW5kIFRocmVhZC5qb2luKCkKKyAgICAgKiAgdGltZWQgb3V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBUElFeGFtcGxlKCkgeworCisgICAgICAgIFNlcnZlclRocmVhZCB0ZXN0TWFpbFNlcnZlciA9IG5ldyBTZXJ2ZXJUaHJlYWQoKTsKKyAgICAgICAgVGhyZWFkIHNlcnZlciA9IG5ldyBUaHJlYWQodGVzdE1haWxTZXJ2ZXIpOworICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICBDbGllbnRUaHJlYWQgdGVzdE1haWxDbGllbnQgPSBuZXcgQ2xpZW50VGhyZWFkKCk7CisKKyAgICAgICAgdGVzdE1haWxDbGllbnQuZnJvbSgiTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPiIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC50bygidG9AeW91LmNvbSIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC5jYygiY2MxQHlvdS5jb20iKTsKKyAgICAgICAgdGVzdE1haWxDbGllbnQuY2MoImNjMkB5b3UuY29tIik7CisgICAgICAgIHRlc3RNYWlsQ2xpZW50LmJjYygiYmNjQHlvdS5jb20iKTsKKyAgICAgICAgdGVzdE1haWxDbGllbnQuc2V0U3ViamVjdCgiVGVzdCBzdWJqZWN0Iik7CisgICAgICAgIHRlc3RNYWlsQ2xpZW50LnNldE1lc3NhZ2UoICJ0ZXN0IGxpbmUgMVxuIiArCisgICAgICAgICAgICAidGVzdCBsaW5lIDIiICk7CisKKyAgICAgICAgVGhyZWFkIGNsaWVudCA9IG5ldyBUaHJlYWQodGVzdE1haWxDbGllbnQpOworICAgICAgICBjbGllbnQuc3RhcnQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLmpvaW4oNjAgKiAxMDAwKTsgLy8gNjBzCisgICAgICAgICAgICBjbGllbnQuam9pbigzMCAqIDEwMDApOyAvLyBhIGZ1cnRoZXIgMzBzCisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllICkgeworICAgICAgICAgICAgZmFpbCggIkludGVycnVwdGVkRXhjZXB0aW9uOiAiICsgaWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHQgPSB0ZXN0TWFpbFNlcnZlci5nZXRSZXN1bHQoKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gIjIyMCB0ZXN0IFNNVFAgRW1haWxUYXNrVGVzdFxyXG4iICsKKyAgICAgICAgIkhFTE8gIiArIGxvY2FsICsgIlxyXG4iICsKKyAgICAgICAgIjI1MCAiICsgbG9jYWwgKyAiIEhlbGxvICIgKyBsb2NhbCArICIgWzEyNy4wLjAuMV0sIHBsZWFzZWQgdG8gbWVldCB5b3VcclxuIiArCisgICAgICAgICJNQUlMIEZST006IDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPlxyXG4iICsKKyAgICAgICAgIjI1MFxyXG4iICsKKyAgICAgICAgIlJDUFQgVE86IDx0b0B5b3UuY29tPlxyXG4iICsKKyAgICAgICAgIjI1MFxyXG4iICsKKyAgICAgICAgIlJDUFQgVE86IDxjYzFAeW91LmNvbT5cclxuIiArCisgICAgICAgICIyNTBcclxuIiArCisgICAgICAgICJSQ1BUIFRPOiA8Y2MyQHlvdS5jb20+XHJcbiIgKworICAgICAgICAiMjUwXHJcbiIgKworICAgICAgICAiUkNQVCBUTzogPGJjY0B5b3UuY29tPlxyXG4iICsKKyAgICAgICAgIjI1MFxyXG4iICsKKyAgICAgICAgIkRBVEFcclxuIiArCisgICAgICAgICIzNTRcclxuIiArCisgICAgICAgICJTdWJqZWN0OiBUZXN0IHN1YmplY3RcclxuIiArCisgICAgICAgICJGcm9tOiBNYWlsIE1lc3NhZ2UgPEVtYWlsVGFza1Rlc3RAYW50LmFwYWNoZS5vcmc+XHJcbiIgKworICAgICAgICAiVG86IHRvQHlvdS5jb21cclxuIiArCisgICAgICAgICJDYzogY2MxQHlvdS5jb20sIGNjMkB5b3UuY29tXHJcbiIgKworICAgICAgICAiWC1NYWlsZXI6IG9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZSAoYW50LmFwYWNoZS5vcmcpXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAidGVzdCBsaW5lIDFcclxuIiArCisgICAgICAgICJ0ZXN0IGxpbmUgMlxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIi5cclxuIiArCisgICAgICAgICIyNTBcclxuIiArCisgICAgICAgICJRVUlUXHJcbiIgKworICAgICAgICAiMjIxXHJcbiI7CisgICAgICAgIGZvciAoaW50IGljb3VudGVyID0gMDsgaWNvdW50ZXI8ZXhwZWN0ZWRSZXN1bHQubGVuZ3RoKCk7IGljb3VudGVyKyspIHsKKyAgICAgICAgICAgIGlmIChpY291bnRlciA8IHJlc3VsdC5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZFJlc3VsdC5jaGFyQXQoaWNvdW50ZXIpICE9IHJlc3VsdC5jaGFyQXQoaWNvdW50ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicG9zaXQgIiArIGljb3VudGVyICsgIiBleHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkUmVzdWx0LmNoYXJBdChpY291bnRlcikKKyAgICAgICAgICAgICAgICAgICAgKyAiIHJlc3VsdCAiICsgcmVzdWx0LmNoYXJBdChpY291bnRlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwZWN0ZWRSZXN1bHQubGVuZ3RoKCk+cmVzdWx0Lmxlbmd0aCgpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV4Y2VkZW50IG9mIGV4cGVjdGVkIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgKyBleHBlY3RlZFJlc3VsdC5zdWJzdHJpbmcocmVzdWx0Lmxlbmd0aCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cGVjdGVkUmVzdWx0Lmxlbmd0aCgpPHJlc3VsdC5sZW5ndGgoKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleGNlZGVudCBvZiByZXN1bHQgIgorICAgICAgICAgICAgICAgICsgcmVzdWx0LnN1YnN0cmluZyhleHBlY3RlZFJlc3VsdC5sZW5ndGgoKSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdC5sZW5ndGgoKSwgcmVzdWx0Lmxlbmd0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQpOyAvLyBvcmRlciBvZiBoZWFkZXJzIGNhbm5vdCBiZSBndWFyYW50ZWVkCisgICAgICAgIGlmICh0ZXN0TWFpbENsaWVudC5pc0ZhaWxlZCgpKSB7CisgICAgICAgICAgICBmYWlsKHRlc3RNYWlsQ2xpZW50LmdldEZhaWxNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIFRlc3QgYSBNYWlsTWVzc2FnZSB3aXRoIG5vIGNjIG9yIGJjYyBsaW5lcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb09ubHkoKSB7CisgICAgICAgIFNlcnZlclRocmVhZCB0ZXN0TWFpbFNlcnZlciA9IG5ldyBTZXJ2ZXJUaHJlYWQoKTsKKyAgICAgICAgVGhyZWFkIHNlcnZlciA9IG5ldyBUaHJlYWQodGVzdE1haWxTZXJ2ZXIpOworICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICBDbGllbnRUaHJlYWQgdGVzdE1haWxDbGllbnQgPSBuZXcgQ2xpZW50VGhyZWFkKCk7CisKKyAgICAgICAgdGVzdE1haWxDbGllbnQuZnJvbSgiTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPiIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC50bygidG9AeW91LmNvbSIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC5zZXRTdWJqZWN0KCJUZXN0IHN1YmplY3QiKTsKKyAgICAgICAgdGVzdE1haWxDbGllbnQuc2V0TWVzc2FnZSggInRlc3QgbGluZSAxXG4iICsKKyAgICAgICAgICAgICJ0ZXN0IGxpbmUgMiIgKTsKKworICAgICAgICBUaHJlYWQgY2xpZW50ID0gbmV3IFRocmVhZCh0ZXN0TWFpbENsaWVudCk7CisgICAgICAgIGNsaWVudC5zdGFydCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2ZXIuam9pbig2MCAqIDEwMDApOyAvLyA2MHMKKyAgICAgICAgICAgIGNsaWVudC5qb2luKDMwICogMTAwMCk7IC8vIGEgZnVydGhlciAzMHMKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUgKSB7CisgICAgICAgICAgICBmYWlsKCJJbnRlcnJ1cHRlZEV4Y2VwdGlvbjogIiArIGllKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHQgPSB0ZXN0TWFpbFNlcnZlci5nZXRSZXN1bHQoKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gIjIyMCB0ZXN0IFNNVFAgRW1haWxUYXNrVGVzdFxyXG4iICsKKyAgICAgICAgIkhFTE8gIiArIGxvY2FsICsgIlxyXG4iICsKKyAgICAgICAgIjI1MCAiICsgbG9jYWwgKyAiIEhlbGxvICIgKyBsb2NhbCArICIgWzEyNy4wLjAuMV0sIHBsZWFzZWQgdG8gbWVldCB5b3VcclxuIiArCisgICAgICAgICJNQUlMIEZST006IDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPlxyXG4iICsKKyAgICAgICAgIjI1MFxyXG4iICsKKyAgICAgICAgIlJDUFQgVE86IDx0b0B5b3UuY29tPlxyXG4iICsKKyAgICAgICAgIjI1MFxyXG4iICsKKyAgICAgICAgIkRBVEFcclxuIiArCisgICAgICAgICIzNTRcclxuIiArCisgICAgICAgICJTdWJqZWN0OiBUZXN0IHN1YmplY3RcclxuIiArCisgICAgICAgICAgICAiRnJvbTogTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPlxyXG4iICsKKyAgICAgICAgICAgICJUbzogdG9AeW91LmNvbVxyXG4iICsKKyAgICAgICAgIlgtTWFpbGVyOiBvcmcuYXBhY2hlLnRvb2xzLm1haWwuTWFpbE1lc3NhZ2UgKGFudC5hcGFjaGUub3JnKVxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgInRlc3QgbGluZSAxXHJcbiIgKworICAgICAgICAidGVzdCBsaW5lIDJcclxuIiArCisgICAgICAgICJcclxuIiArCisgICAgICAgICIuXHJcbiIgKworICAgICAgICAiMjUwXHJcbiIgKworICAgICAgICAiUVVJVFxyXG4iICsKKyAgICAgICAgIjIyMVxyXG4iOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXN1bHQubGVuZ3RoKCksIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdCwgcmVzdWx0KTsgLy8gb3JkZXIgb2YgaGVhZGVycyBjYW5ub3QgYmUgZ3VhcmFudGVlZAorICAgICAgICBpZiAodGVzdE1haWxDbGllbnQuaXNGYWlsZWQoKSkgeworICAgICAgICAgICAgZmFpbCh0ZXN0TWFpbENsaWVudC5nZXRGYWlsTWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogIFRlc3QgYSBNYWlsTWVzc2FnZSB3aXRoIG5vIHRvIG9yIGJjYyBsaW5lcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDY09ubHkoKSB7CisgICAgICAgIFNlcnZlclRocmVhZCB0ZXN0TWFpbFNlcnZlciA9IG5ldyBTZXJ2ZXJUaHJlYWQoKTsKKyAgICAgICAgVGhyZWFkIHNlcnZlciA9IG5ldyBUaHJlYWQodGVzdE1haWxTZXJ2ZXIpOworICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICBDbGllbnRUaHJlYWQgdGVzdE1haWxDbGllbnQgPSBuZXcgQ2xpZW50VGhyZWFkKCk7CisKKyAgICAgICAgdGVzdE1haWxDbGllbnQuZnJvbSgiTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPiIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC5jYygiY2NAeW91LmNvbSIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC5zZXRTdWJqZWN0KCJUZXN0IHN1YmplY3QiKTsKKyAgICAgICAgdGVzdE1haWxDbGllbnQuc2V0TWVzc2FnZSggInRlc3QgbGluZSAxXG4iICsKKyAgICAgICAgICAgICJ0ZXN0IGxpbmUgMiIgKTsKKworICAgICAgICBUaHJlYWQgY2xpZW50ID0gbmV3IFRocmVhZCh0ZXN0TWFpbENsaWVudCk7CisgICAgICAgIGNsaWVudC5zdGFydCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2ZXIuam9pbig2MCAqIDEwMDApOyAvLyA2MHMKKyAgICAgICAgICAgIGNsaWVudC5qb2luKDMwICogMTAwMCk7IC8vIGEgZnVydGhlciAzMHMKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUgKSB7CisgICAgICAgICAgICBmYWlsKCAiSW50ZXJydXB0ZWRFeGNlcHRpb246ICIgKyBpZSApOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRlc3RNYWlsU2VydmVyLmdldFJlc3VsdCgpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSAiMjIwIHRlc3QgU01UUCBFbWFpbFRhc2tUZXN0XHJcbiIgKworICAgICAgICAiSEVMTyAiICsgbG9jYWwgKyAiXHJcbiIgKworICAgICAgICAiMjUwICIgKyBsb2NhbCArICIgSGVsbG8gIiArIGxvY2FsICsgIiBbMTI3LjAuMC4xXSwgcGxlYXNlZCB0byBtZWV0IHlvdVxyXG4iICsKKyAgICAgICAgIk1BSUwgRlJPTTogPEVtYWlsVGFza1Rlc3RAYW50LmFwYWNoZS5vcmc+XHJcbiIgKworICAgICAgICAiMjUwXHJcbiIgKworICAgICAgICAiUkNQVCBUTzogPGNjQHlvdS5jb20+XHJcbiIgKworICAgICAgICAiMjUwXHJcbiIgKworICAgICAgICAiREFUQVxyXG4iICsKKyAgICAgICAgIjM1NFxyXG4iICsKKyAgICAgICAgIlN1YmplY3Q6IFRlc3Qgc3ViamVjdFxyXG4iICsKKyAgICAgICAgICAgICJGcm9tOiBNYWlsIE1lc3NhZ2UgPEVtYWlsVGFza1Rlc3RAYW50LmFwYWNoZS5vcmc+XHJcbiIgKworICAgICAgICAgICAgIkNjOiBjY0B5b3UuY29tXHJcbiIgKworICAgICAgICAiWC1NYWlsZXI6IG9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZSAoYW50LmFwYWNoZS5vcmcpXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAidGVzdCBsaW5lIDFcclxuIiArCisgICAgICAgICJ0ZXN0IGxpbmUgMlxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIi5cclxuIiArCisgICAgICAgICIyNTBcclxuIiArCisgICAgICAgICJRVUlUXHJcbiIgKworICAgICAgICAiMjIxXHJcbiI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdC5sZW5ndGgoKSwgcmVzdWx0Lmxlbmd0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQpOworICAgICAgICBpZiAodGVzdE1haWxDbGllbnQuaXNGYWlsZWQoKSkgeworICAgICAgICAgICAgZmFpbCh0ZXN0TWFpbENsaWVudC5nZXRGYWlsTWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogIFRlc3QgYSBNYWlsTWVzc2FnZSB3aXRoIG5vIHRvIG9yIGNjIGxpbmVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEJjY09ubHkoKSB7CisgICAgICAgIFNlcnZlclRocmVhZCB0ZXN0TWFpbFNlcnZlciA9IG5ldyBTZXJ2ZXJUaHJlYWQoKTsKKyAgICAgICAgVGhyZWFkIHNlcnZlciA9IG5ldyBUaHJlYWQodGVzdE1haWxTZXJ2ZXIpOworICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICBDbGllbnRUaHJlYWQgdGVzdE1haWxDbGllbnQgPSBuZXcgQ2xpZW50VGhyZWFkKCk7CisKKyAgICAgICAgdGVzdE1haWxDbGllbnQuZnJvbSgiTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPiIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC5iY2MoImJjY0B5b3UuY29tIik7CisgICAgICAgIHRlc3RNYWlsQ2xpZW50LnNldFN1YmplY3QoIlRlc3Qgc3ViamVjdCIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC5zZXRNZXNzYWdlKCAidGVzdCBsaW5lIDFcbiIgKworICAgICAgICAgICAgInRlc3QgbGluZSAyIiApOworCisgICAgICAgIFRocmVhZCBjbGllbnQgPSBuZXcgVGhyZWFkKHRlc3RNYWlsQ2xpZW50KTsKKyAgICAgICAgY2xpZW50LnN0YXJ0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlci5qb2luKDYwICogMTAwMCk7IC8vIDYwcworICAgICAgICAgICAgY2xpZW50LmpvaW4oMzAgKiAxMDAwKTsgLy8gYSBmdXJ0aGVyIDMwcworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSApIHsKKyAgICAgICAgICAgIGZhaWwoICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbjogIiArIGllICk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGVzdE1haWxTZXJ2ZXIuZ2V0UmVzdWx0KCk7CisgICAgICAgIFN0cmluZyBleHBlY3RlZFJlc3VsdCA9ICIyMjAgdGVzdCBTTVRQIEVtYWlsVGFza1Rlc3RcclxuIiArCisgICAgICAgICJIRUxPICIgKyBsb2NhbCArICJcclxuIiArCisgICAgICAgICIyNTAgIiArIGxvY2FsICsgIiBIZWxsbyAiICsgbG9jYWwgKyAiIFsxMjcuMC4wLjFdLCBwbGVhc2VkIHRvIG1lZXQgeW91XHJcbiIgKworICAgICAgICAiTUFJTCBGUk9NOiA8RW1haWxUYXNrVGVzdEBhbnQuYXBhY2hlLm9yZz5cclxuIiArCisgICAgICAgICIyNTBcclxuIiArCisgICAgICAgICJSQ1BUIFRPOiA8YmNjQHlvdS5jb20+XHJcbiIgKworICAgICAgICAiMjUwXHJcbiIgKworICAgICAgICAiREFUQVxyXG4iICsKKyAgICAgICAgIjM1NFxyXG4iICsKKyAgICAgICAgIlN1YmplY3Q6IFRlc3Qgc3ViamVjdFxyXG4iICsKKyAgICAgICAgIkZyb206IE1haWwgTWVzc2FnZSA8RW1haWxUYXNrVGVzdEBhbnQuYXBhY2hlLm9yZz5cclxuIiArCisgICAgICAgICJYLU1haWxlcjogb3JnLmFwYWNoZS50b29scy5tYWlsLk1haWxNZXNzYWdlIChhbnQuYXBhY2hlLm9yZylcclxuIiArCisgICAgICAgICJcclxuIiArCisgICAgICAgICJ0ZXN0IGxpbmUgMVxyXG4iICsKKyAgICAgICAgInRlc3QgbGluZSAyXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiLlxyXG4iICsKKyAgICAgICAgIjI1MFxyXG4iICsKKyAgICAgICAgIlFVSVRcclxuIiArCisgICAgICAgICIyMjFcclxuIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCBleHBlY3RlZFJlc3VsdC5sZW5ndGgoKSwgcmVzdWx0Lmxlbmd0aCgpICk7CisgICAgICAgIGFzc2VydEVxdWFscyggZXhwZWN0ZWRSZXN1bHQsIHJlc3VsdCApOworICAgICAgICBpZiAoIHRlc3RNYWlsQ2xpZW50LmlzRmFpbGVkKCkgKSB7CisgICAgICAgICAgICBmYWlsKCB0ZXN0TWFpbENsaWVudC5nZXRGYWlsTWVzc2FnZSgpICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBUZXN0IGEgTWFpbE1lc3NhZ2Ugd2l0aCBubyBzdWJqZWN0IGxpbmUKKyAgICAgKiAgU3ViamVjdCBpcyBhbiBvcHRpb25hbCBmaWVsZCAoUkZDIDgyMiBzNC4xKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N1YmplY3QoKSB7CisgICAgICAgIFNlcnZlclRocmVhZCB0ZXN0TWFpbFNlcnZlciA9IG5ldyBTZXJ2ZXJUaHJlYWQoKTsKKyAgICAgICAgVGhyZWFkIHNlcnZlciA9IG5ldyBUaHJlYWQodGVzdE1haWxTZXJ2ZXIpOworICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICBDbGllbnRUaHJlYWQgdGVzdE1haWxDbGllbnQgPSBuZXcgQ2xpZW50VGhyZWFkKCk7CisKKyAgICAgICAgdGVzdE1haWxDbGllbnQuZnJvbSgiTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPiIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC50bygidG9AeW91LmNvbSIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC5zZXRNZXNzYWdlKCAidGVzdCBsaW5lIDFcbiIgKworICAgICAgICAgICAgInRlc3QgbGluZSAyIiApOworCisgICAgICAgIFRocmVhZCBjbGllbnQgPSBuZXcgVGhyZWFkKHRlc3RNYWlsQ2xpZW50KTsKKyAgICAgICAgY2xpZW50LnN0YXJ0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlci5qb2luKDYwICogMTAwMCk7IC8vIDYwcworICAgICAgICAgICAgY2xpZW50LmpvaW4oMzAgKiAxMDAwKTsgLy8gYSBmdXJ0aGVyIDMwcworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSApIHsKKyAgICAgICAgICAgIGZhaWwoICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbjogIiArIGllICk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGVzdE1haWxTZXJ2ZXIuZ2V0UmVzdWx0KCk7CisgICAgICAgIFN0cmluZyBleHBlY3RlZFJlc3VsdCA9ICIyMjAgdGVzdCBTTVRQIEVtYWlsVGFza1Rlc3RcclxuIiArCisgICAgICAgICJIRUxPICIgKyBsb2NhbCArICJcclxuIiArCisgICAgICAgICIyNTAgIiArIGxvY2FsICsgIiBIZWxsbyAiICsgbG9jYWwgKyAiIFsxMjcuMC4wLjFdLCBwbGVhc2VkIHRvIG1lZXQgeW91XHJcbiIgKworICAgICAgICAiTUFJTCBGUk9NOiA8RW1haWxUYXNrVGVzdEBhbnQuYXBhY2hlLm9yZz5cclxuIiArCisgICAgICAgICIyNTBcclxuIiArCisgICAgICAgICJSQ1BUIFRPOiA8dG9AeW91LmNvbT5cclxuIiArCisgICAgICAgICIyNTBcclxuIiArCisgICAgICAgICJEQVRBXHJcbiIgKworICAgICAgICAiMzU0XHJcbiIgKworICAgICAgICAiRnJvbTogTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPlxyXG4iICsKKyAgICAgICAgICAgICJUbzogdG9AeW91LmNvbVxyXG4iICsKKyAgICAgICAgIlgtTWFpbGVyOiBvcmcuYXBhY2hlLnRvb2xzLm1haWwuTWFpbE1lc3NhZ2UgKGFudC5hcGFjaGUub3JnKVxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgInRlc3QgbGluZSAxXHJcbiIgKworICAgICAgICAidGVzdCBsaW5lIDJcclxuIiArCisgICAgICAgICJcclxuIiArCisgICAgICAgICIuXHJcbiIgKworICAgICAgICAiMjUwXHJcbiIgKworICAgICAgICAiUVVJVFxyXG4iICsKKyAgICAgICAgIjIyMVxyXG4iOworICAgICAgICBhc3NlcnRFcXVhbHMoIGV4cGVjdGVkUmVzdWx0Lmxlbmd0aCgpLCByZXN1bHQubGVuZ3RoKCkgKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCBleHBlY3RlZFJlc3VsdCwgcmVzdWx0ICk7CisgICAgICAgIGlmICggdGVzdE1haWxDbGllbnQuaXNGYWlsZWQoKSApIHsKKyAgICAgICAgICAgIGZhaWwoIHRlc3RNYWlsQ2xpZW50LmdldEZhaWxNZXNzYWdlKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogIFRlc3QgYSBNYWlsTWVzc2FnZSB3aXRoIGVtcHR5IGJvZHkgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUJvZHkoKSB7CisgICAgICAgIFNlcnZlclRocmVhZCB0ZXN0TWFpbFNlcnZlciA9IG5ldyBTZXJ2ZXJUaHJlYWQoKTsKKyAgICAgICAgVGhyZWFkIHNlcnZlciA9IG5ldyBUaHJlYWQodGVzdE1haWxTZXJ2ZXIpOworICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICBDbGllbnRUaHJlYWQgdGVzdE1haWxDbGllbnQgPSBuZXcgQ2xpZW50VGhyZWFkKCk7CisKKyAgICAgICAgdGVzdE1haWxDbGllbnQuZnJvbSgiTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPiIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC50bygidG9AeW91LmNvbSIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC5zZXRTdWJqZWN0KCJUZXN0IHN1YmplY3QiKTsKKyAgICAgICAgdGVzdE1haWxDbGllbnQuc2V0TWVzc2FnZSgiIik7CisKKyAgICAgICAgVGhyZWFkIGNsaWVudCA9IG5ldyBUaHJlYWQodGVzdE1haWxDbGllbnQpOworICAgICAgICBjbGllbnQuc3RhcnQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLmpvaW4oNjAgKiAxMDAwKTsgLy8gNjBzCisgICAgICAgICAgICBjbGllbnQuam9pbigzMCAqIDEwMDApOyAvLyBhIGZ1cnRoZXIgMzBzCisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllICkgeworICAgICAgICAgICAgZmFpbCggIkludGVycnVwdGVkRXhjZXB0aW9uOiAiICsgaWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHQgPSB0ZXN0TWFpbFNlcnZlci5nZXRSZXN1bHQoKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gIjIyMCB0ZXN0IFNNVFAgRW1haWxUYXNrVGVzdFxyXG4iICsKKyAgICAgICAgIkhFTE8gIiArIGxvY2FsICsgIlxyXG4iICsKKyAgICAgICAgIjI1MCAiICsgbG9jYWwgKyAiIEhlbGxvICIgKyBsb2NhbCArICIgWzEyNy4wLjAuMV0sIHBsZWFzZWQgdG8gbWVldCB5b3VcclxuIiArCisgICAgICAgICJNQUlMIEZST006IDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPlxyXG4iICsKKyAgICAgICAgIjI1MFxyXG4iICsKKyAgICAgICAgIlJDUFQgVE86IDx0b0B5b3UuY29tPlxyXG4iICsKKyAgICAgICAgIjI1MFxyXG4iICsKKyAgICAgICAgIkRBVEFcclxuIiArCisgICAgICAgICIzNTRcclxuIiArCisgICAgICAgICJTdWJqZWN0OiBUZXN0IHN1YmplY3RcclxuIiArCisgICAgICAgICAgICAiRnJvbTogTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPlxyXG4iICsKKyAgICAgICAgICAgICJUbzogdG9AeW91LmNvbVxyXG4iICsKKyAgICAgICAgIlgtTWFpbGVyOiBvcmcuYXBhY2hlLnRvb2xzLm1haWwuTWFpbE1lc3NhZ2UgKGFudC5hcGFjaGUub3JnKVxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIi5cclxuIiArCisgICAgICAgICIyNTBcclxuIiArCisgICAgICAgICJRVUlUXHJcbiIgKworICAgICAgICAiMjIxXHJcbiI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdC5sZW5ndGgoKSwgcmVzdWx0Lmxlbmd0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzdWx0LCByZXN1bHQpOworICAgICAgICBpZiAodGVzdE1haWxDbGllbnQuaXNGYWlsZWQoKSkgeworICAgICAgICAgICAgZmFpbCh0ZXN0TWFpbENsaWVudC5nZXRGYWlsTWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogIFRlc3QgYSBNYWlsTWVzc2FnZSB3aXRoIFVTLUFTQ0lJIGNoYXJhY3RlciBzZXQKKyAgICAgKiAgVGhlIG5leHQgZm91ciB0ZXN0Y2FzZSBjYW4gYmUga2luZGEgaGFyZCB0byBkZWJ1ZyBhcyBBbnQgd2lsbCBvZnRlbgorICAgICAqICBwcmludCB0aGUganVuaXQgZmFpbHVyZSBpbiBVUy1BU0NJSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNjaWlDaGFyc2V0KCkgeworCisgICAgICAgIFNlcnZlclRocmVhZCB0ZXN0TWFpbFNlcnZlciA9IG5ldyBTZXJ2ZXJUaHJlYWQoKTsKKyAgICAgICAgVGhyZWFkIHNlcnZlciA9IG5ldyBUaHJlYWQodGVzdE1haWxTZXJ2ZXIpOworICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICBDbGllbnRUaHJlYWQgdGVzdE1haWxDbGllbnQgPSBuZXcgQ2xpZW50VGhyZWFkKCk7CisKKyAgICAgICAgdGVzdE1haWxDbGllbnQuZnJvbSgiTWFpbCBNZXNzYWdlIDxFbWFpbFRhc2tUZXN0QGFudC5hcGFjaGUub3JnPiIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC50bygiQ2VraSBHXHUwMGZjbGNcdTAwZmMgPGFidXNlQG1haWwtYWJ1c2Uub3JnPiIpOworICAgICAgICB0ZXN0TWFpbENsaWVudC5zZXRTdWJqZWN0KCJUZXN0IHN1YmplY3QiKTsKKyAgICAgICAgdGVzdE1haWxDbGllbnQuc2V0TWVzc2FnZSgiIik7CisKKyAgICAgICAgVGhyZWFkIGNsaWVudCA9IG5ldyBUaHJlYWQodGVzdE1haWxDbGllbnQpOworICAgICAgICBjbGllbnQuc3RhcnQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLmpvaW4oNjAgKiAxMDAwKTsgLy8gNjBzCisgICAgICAgICAgICBjbGllbnQuam9pbigzMCAqIDEwMDApOyAvLyBhIGZ1cnRoZXIgMzBzCisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllICkgeworICAgICAgICAgICAgZmFpbCgiSW50ZXJydXB0ZWRFeGNlcHRpb246ICIgKyBpZSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGVzdE1haWxTZXJ2ZXIuZ2V0UmVzdWx0KCk7CisgICAgICAgIFN0cmluZyBleHBlY3RlZFJlc3VsdCA9ICIyMjAgdGVzdCBTTVRQIEVtYWlsVGFza1Rlc3RcclxuIiArCisgICAgICAgICJIRUxPICIgKyBsb2NhbCArICJcclxuIiArCisgICAgICAgICIyNTAgIiArIGxvY2FsICsgIiBIZWxsbyAiICsgbG9jYWwgKyAiIFsxMjcuMC4wLjFdLCBwbGVhc2VkIHRvIG1lZXQgeW91XHJcbiIgKworICAgICAgICAiTUFJTCBGUk9NOiA8RW1haWxUYXNrVGVzdEBhbnQuYXBhY2hlLm9yZz5cclxuIiArCisgICAgICAgICIyNTBcclxuIiArCisgICAgICAgICJSQ1BUIFRPOiA8YWJ1c2VAbWFpbC1hYnVzZS5vcmc+XHJcbiIgKworICAgICAgICAiMjUwXHJcbiIgKworICAgICAgICAiREFUQVxyXG4iICsKKyAgICAgICAgIjM1NFxyXG4iICsKKyAgICAgICAgIlN1YmplY3Q6IFRlc3Qgc3ViamVjdFxyXG4iICsKKyAgICAgICAgICAgICJGcm9tOiBNYWlsIE1lc3NhZ2UgPEVtYWlsVGFza1Rlc3RAYW50LmFwYWNoZS5vcmc+XHJcbiIgKworICAgICAgICAgICAgIlRvOiBDZWtpIEdcdTAwZmNsY1x1MDBmYyA8YWJ1c2VAbWFpbC1hYnVzZS5vcmc+XHJcbiIgKworICAgICAgICAiWC1NYWlsZXI6IG9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZSAoYW50LmFwYWNoZS5vcmcpXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiLlxyXG4iICsKKyAgICAgICAgIjI1MFxyXG4iICsKKyAgICAgICAgIlFVSVRcclxuIiArCisgICAgICAgICIyMjFcclxuIjsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MxID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvczIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFByaW50U3RyZWFtIGJvczEgPSBuZXcgUHJpbnRTdHJlYW0oYmFvczEsIHRydWUpOworICAgICAgICBQcmludFN0cmVhbSBib3MyID0gbmV3IFByaW50U3RyZWFtKGJhb3MyLCB0cnVlKTsKKworICAgICAgICBib3MxLnByaW50KGV4cGVjdGVkUmVzdWx0KTsKKyAgICAgICAgYm9zMi5wcmludChyZXN1bHQpOworCisgICAgICAgIGFzc2VydEVxdWFscyggImV4cGVjdGVkIG1lc3NhZ2UgbGVuZ3RoICE9IGFjdHVhbCBtZXNzYWdlIGxlbmd0aCAiCisgICAgICAgICAgICArICJpbiB0ZXN0QXNjaWlDaGFyc2V0KCkiLCBleHBlY3RlZFJlc3VsdC5sZW5ndGgoKSwgcmVzdWx0Lmxlbmd0aCgpICk7CisgICAgICAgIGFzc2VydEVxdWFscyggImJhb3MxIGFuZCBiYW9zMiBzaG91bGQgYmUgdGhlIHNhbWUgaW4gdGVzdEFzY2lpQ2hhcnNldCgpIiwKKyAgICAgICAgICAgIGJhb3MxLnRvU3RyaW5nKCksIGJhb3MyLnRvU3RyaW5nKCkgKTsgLy8gb3JkZXIgb2YgaGVhZGVycyBjYW5ub3QgYmUgZ3VhcmFudGVlZAorICAgICAgICBpZiAodGVzdE1haWxDbGllbnQuaXNGYWlsZWQoKSkgeworICAgICAgICAgICAgZmFpbCh0ZXN0TWFpbENsaWVudC5nZXRGYWlsTWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIEEgcHJpdmF0ZSB0ZXN0IGNsYXNzIHRoYXQgcHJldGVuZHMgdG8gYmUgYSBtYWlsIHRyYW5zZmVyIGFnZW50CisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2ZXJUaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgc2IgPSBudWxsOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbG9vcCA9IGZhbHNlOworICAgICAgICBTZXJ2ZXJTb2NrZXQgc3NvY2sgPSBudWxsOworICAgICAgICBTb2NrZXQgc29jayA9IG51bGw7CisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRhdGEgPSBmYWxzZTsgIC8vIHN0YXRlIGVuZ2luZTogZmFsc2U9ZW52ZWxvcGUsIHRydWU9bWVzc2FnZQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzc29jayA9IG5ldyBTZXJ2ZXJTb2NrZXQoVEVTVF9QT1JUKTsKKyAgICAgICAgICAgICAgICBzb2NrID0gc3NvY2suYWNjZXB0KCk7IC8vIHdhaXQgZm9yIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IElucHV0U3RyZWFtUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICBzb2NrLmdldElucHV0U3RyZWFtKCkpICk7CisgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKCBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAorICAgICAgICAgICAgICAgICAgICBzb2NrLmdldE91dHB1dFN0cmVhbSgpICkgKTsKKyAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBzZW5kKCAiMjIwIHRlc3QgU01UUCBFbWFpbFRhc2tUZXN0XHJcbiIgKTsKKyAgICAgICAgICAgICAgICBsb29wID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIGxvb3AgKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGluLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggcmVzcG9uc2UgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggcmVzcG9uc2UgKyAiXHJcbiIgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICFkYXRhICYmIHJlc3BvbnNlLnN0YXJ0c1dpdGgoICJIRUxPIiApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZCggIjI1MCAiICsgbG9jYWwgKyAiIEhlbGxvICIgKyBsb2NhbCArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiWzEyNy4wLjAuMV0sIHBsZWFzZWQgdG8gbWVldCB5b3VcclxuIiApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCAhZGF0YSAmJiByZXNwb25zZS5zdGFydHNXaXRoKCJNQUlMIikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kKCAiMjUwXHJcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIWRhdGEgJiYgcmVzcG9uc2Uuc3RhcnRzV2l0aCgiUkNQVCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kKCAiMjUwXHJcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGF0YSAmJiByZXNwb25zZS5zdGFydHNXaXRoKCJEQVRBIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQoICIzNTRcclxuIiApOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YSAmJiByZXNwb25zZS5lcXVhbHMoIi4iKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQoICIyNTBcclxuIiApOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkYXRhICYmIHJlc3BvbnNlLnN0YXJ0c1dpdGgoIlFVSVQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZCggIjIyMVxyXG4iICk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb29wID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29tbWFuZCB1bnJlY29nbml6ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICsgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZCggIjUwMCA1LjUuMSBDb21tYW5kIHVucmVjb2duaXplZDogXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSArICJcIlxyXG4iICk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb29wID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYi5hcHBlbmQoIHJlc3BvbnNlICsgIlxyXG4iICk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZGlzY29ubmVjdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmQoU3RyaW5nIHJldG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG91dC53cml0ZSggcmV0bXNnICk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCggcmV0bXNnICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBudWxsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNvY2suY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc29jayA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3NvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNzb2NrLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHNzb2NrID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFJlc3VsdCgpIHsKKyAgICAgICAgICAgIGxvb3AgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQSBwcml2YXRlIHRlc3QgY2xhc3MgdGhhdCB3cmFwcyBNYWlsTWVzc2FnZQorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQ2xpZW50VGhyZWFkIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgICAgIHByaXZhdGUgTWFpbE1lc3NhZ2UgbXNnOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZmFpbCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIFN0cmluZyBmYWlsTWVzc2FnZSA9IG51bGw7CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBmcm9tID0gbnVsbDsKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBzdWJqZWN0ID0gbnVsbDsKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKKworICAgICAgICBwcm90ZWN0ZWQgVmVjdG9yIHJlcGx5VG9MaXN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICBwcm90ZWN0ZWQgVmVjdG9yIHRvTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgcHJvdGVjdGVkIFZlY3RvciBjY0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHByb3RlY3RlZCBWZWN0b3IgYmNjTGlzdCA9IG5ldyBWZWN0b3IoKTsKKworCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSA5OyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gbmV3IE1haWxNZXNzYWdlKCJsb2NhbGhvc3QiLCBURVNUX1BPUlQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCAqIDEwMDApOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGZhaWxNZXNzYWdlID0gIklPRXhjZXB0aW9uOiAiICsgaW9lOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtc2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtc2cgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlOworICAgICAgICAgICAgICAgIGZhaWxNZXNzYWdlID0gImphdmEubmV0LkNvbm5lY3RFeGNlcHRpb246IENvbm5lY3Rpb24gcmVmdXNlZCI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1zZy5mcm9tKGZyb20pOworCisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZTsKKworICAgICAgICAgICAgICAgIGUgPSByZXBseVRvTGlzdC5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy5yZXBseXRvKGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlID0gdG9MaXN0LmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLnRvKGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlID0gY2NMaXN0LmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmNjKGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlID0gYmNjTGlzdC5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy5iY2MoZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLnNldFN1YmplY3Qoc3ViamVjdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbXNnLmdldFByaW50U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCBtZXNzYWdlICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbXNnLnNlbmRBbmRDbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7CisgICAgICAgICAgICAgICAgZmFpbE1lc3NhZ2UgPSAiSU9FeGNlcHRpb246ICIgKyBpb2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFpbE1lc3NhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFpbE1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXBseVRvKFN0cmluZyByZXBseVRvKSB7CisgICAgICAgICAgICByZXBseVRvTGlzdC5hZGQocmVwbHlUbyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0byhTdHJpbmcgdG8pIHsKKyAgICAgICAgICAgIHRvTGlzdC5hZGQodG8pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2MoU3RyaW5nIGNjKSB7CisgICAgICAgICAgICBjY0xpc3QuYWRkKGNjKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGJjYyhTdHJpbmcgYmNjKSB7CisgICAgICAgICAgICBiY2NMaXN0LmFkZChiY2MpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgc3ViamVjdCkgeworICAgICAgICAgICAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZyb20oU3RyaW5nIGZyb20pIHsKKyAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJFbnRyeVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJFbnRyeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Y0MTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckVudHJ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnRhcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBAc2luY2UgQW50IDEuNgorICovCitwdWJsaWMgY2xhc3MgVGFyRW50cnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIFRhckVudHJ5VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkZW1vbnN0cmF0ZXMgYnVnIDE4MTA1IG9uIE9TZXMgd2l0aCBvcy5uYW1lIHNob3J0ZXIgdGhhbiA3LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlQ29uc3RydWN0b3IoKSB7CisgICAgICAgIG5ldyBUYXJFbnRyeShuZXcgamF2YS5pby5GaWxlKCIvZm9vIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy90YXIvVGFyT3V0cHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNTMxMWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy90YXIvVGFyT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnRhcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUYXJPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFRhck91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgVGFyT3V0cHV0U3RyZWFtKGJ5dGVTdHJlYW0pOworICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhclJvdW5kVHJpcFRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJSb3VuZFRyaXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2ZmQyNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJSb3VuZFRyaXBUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnRhcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUYXJSb3VuZFRyaXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPTkdfTkFNRQorICAgICAgICA9ICJ0aGlzL3BhdGgvbmFtZS9jb250YWlucy9tb3JlL3RoYW4vb25lL2h1bmRyZWQvY2hhcmFjdGVycy9pbi9vcmRlci8iCisgICAgICAgICAgICArICJ0by90ZXN0L3RoZS9HTlUvbG9uZy9maWxlL25hbWUvY2FwYWJpbGl0eS9yb3VuZC90cmlwcGVkIjsKKworICAgIHB1YmxpYyBUYXJSb3VuZFRyaXBUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3Qgcm91bmQtdHJpcHBpbmcgbG9uZyAoR05VKSBlbnRyaWVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdSb3VuZFRyaXBwaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVGFyRW50cnkgb3JpZ2luYWwgPSBuZXcgVGFyRW50cnkoTE9OR19OQU1FKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgib3ZlciAxMDAgY2hhcnMiLCBMT05HX05BTUUubGVuZ3RoKCkgPiAxMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWdpbmFsIG5hbWUiLCBMT05HX05BTUUsIG9yaWdpbmFsLmdldE5hbWUoKSk7CisKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgVGFyT3V0cHV0U3RyZWFtIHRvcyA9IG5ldyBUYXJPdXRwdXRTdHJlYW0oYnVmZik7CisgICAgICAgIHRvcy5zZXRMb25nRmlsZU1vZGUoVGFyT3V0cHV0U3RyZWFtLkxPTkdGSUxFX0dOVSk7CisgICAgICAgIHRvcy5wdXROZXh0RW50cnkob3JpZ2luYWwpOworICAgICAgICB0b3MuY2xvc2VFbnRyeSgpOworICAgICAgICB0b3MuY2xvc2UoKTsKKworICAgICAgICBUYXJJbnB1dFN0cmVhbSB0aXMKKyAgICAgICAgICAgID0gbmV3IFRhcklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmLnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgVGFyRW50cnkgdHJpcHBlZCA9IHRpcy5nZXROZXh0RW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb3VuZC10cmlwcGVkIG5hbWUiLCBMT05HX05BTUUsIHRyaXBwZWQuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgibm8gbW9yZSBlbnRyaWVzIiwgdGlzLmdldE5leHRFbnRyeSgpKTsKKyAgICAgICAgdGlzLmNsb3NlKCk7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Bc2lFeHRyYUZpZWxkVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL0FzaUV4dHJhRmllbGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlNGZlNAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Bc2lFeHRyYUZpZWxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuemlwLkFzaUV4dHJhRmllbGQuCisgKgorICovCitwdWJsaWMgY2xhc3MgQXNpRXh0cmFGaWVsZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIFVuaXhTdGF0IHsKKyAgICBwdWJsaWMgQXNpRXh0cmFGaWVsZFRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmaWxlIG1vZGUgbWFnaWMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE1vZGVzKCkgeworICAgICAgICBBc2lFeHRyYUZpZWxkIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOworICAgICAgICBhLnNldE1vZGUoMDEyMyk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4gZmlsZSIsIDAxMDAxMjMsIGEuZ2V0TW9kZSgpKTsKKyAgICAgICAgYS5zZXREaXJlY3RvcnkodHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGlyZWN0b3J5IiwgMDQwMTIzLCBhLmdldE1vZGUoKSk7CisgICAgICAgIGEuc2V0TGlua2VkRmlsZSgidGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN5bWJvbGljIGxpbmsiLCAwMTIwMTIzLCBhLmdldE1vZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50KCkgeworICAgICAgICBBc2lFeHRyYUZpZWxkIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOworICAgICAgICBhLnNldE1vZGUoMDEyMyk7CisgICAgICAgIGEuc2V0VXNlcklkKDUpOworICAgICAgICBhLnNldEdyb3VwSWQoNik7CisgICAgICAgIGJ5dGVbXSBiID0gYS5nZXRMb2NhbEZpbGVEYXRhRGF0YSgpOworCisgICAgICAgIC8vIENSQyBtYW51YWxseSBjYWxjdWxhdGVkLCBzb3JyeQorICAgICAgICBieXRlW10gZXhwZWN0ID0geyhieXRlKTB4QzYsIDB4MDIsIDB4NzgsIChieXRlKTB4QjYsIC8vIENSQworICAgICAgICAgICAgICAgICAgICAgICAgIDAxMjMsIChieXRlKTB4ODAsICAgICAgICAgICAgICAgICAgIC8vIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsIDYsIDB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpZCwgZ2lkCisgICAgICAgIGFzc2VydEVxdWFscygibm8gbGluayIsIGV4cGVjdC5sZW5ndGgsIGIubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGV4cGVjdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBsaW5rLCBieXRlICIraSwgZXhwZWN0W2ldLCBiW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGEuc2V0TGlua2VkRmlsZSgidGVzdCIpOworICAgICAgICBleHBlY3QgPSBuZXcgYnl0ZVtdIHsweDc1LCAoYnl0ZSkweDhFLCAweDQxLCAoYnl0ZSkweEZELCAvLyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEyMywgKGJ5dGUpMHhBMCwgICAgICAgICAgICAgICAgICAgLy8gbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1aWQsIGdpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkndCcsIChieXRlKSdlJywgKGJ5dGUpJ3MnLCAoYnl0ZSkndCd9OworICAgICAgICBiID0gYS5nZXRMb2NhbEZpbGVEYXRhRGF0YSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGxpbmsiLCBleHBlY3QubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxleHBlY3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gbGluaywgYnl0ZSAiK2ksIGV4cGVjdFtpXSwgYltpXSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmVwYXJzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIENSQyBtYW51YWxseSBjYWxjdWxhdGVkLCBzb3JyeQorICAgICAgICBieXRlW10gZGF0YSA9IHsoYnl0ZSkweEM2LCAweDAyLCAweDc4LCAoYnl0ZSkweEI2LCAvLyBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgMDEyMywgKGJ5dGUpMHg4MCwgICAgICAgICAgICAgICAgICAgLy8gbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyB1aWQsIGdpZAorICAgICAgICBBc2lFeHRyYUZpZWxkIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOworICAgICAgICBhLnBhcnNlRnJvbUxvY2FsRmlsZURhdGEoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxlbmd0aCBwbGFpbiBmaWxlIiwgZGF0YS5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICBhLmdldExvY2FsRmlsZURhdGFMZW5ndGgoKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicGxhaW4gZmlsZSwgbm8gbGluayIsICFhLmlzTGluaygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicGxhaW4gZmlsZSwgbm8gZGlyIiwgIWEuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibW9kZSBwbGFpbiBmaWxlIiwgRklMRV9GTEFHIHwgMDEyMywgYS5nZXRNb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVpZCBwbGFpbiBmaWxlIiwgNSwgYS5nZXRVc2VySWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2lkIHBsYWluIGZpbGUiLCA2LCBhLmdldEdyb3VwSWQoKSk7CisKKyAgICAgICAgZGF0YSA9IG5ldyBieXRlW10gezB4NzUsIChieXRlKTB4OEUsIDB4NDEsIChieXRlKTB4RkQsIC8vIENSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEyMywgKGJ5dGUpMHhBMCwgICAgICAgICAgICAgICAgICAgLy8gbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsIDYsIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpZCwgZ2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkndCcsIChieXRlKSdlJywgKGJ5dGUpJ3MnLCAoYnl0ZSkndCd9OworICAgICAgICBhID0gbmV3IEFzaUV4dHJhRmllbGQoKTsKKyAgICAgICAgYS5wYXJzZUZyb21Mb2NhbEZpbGVEYXRhKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZW5ndGggbGluayIsIGRhdGEubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgYS5nZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCkuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRydWUoImxpbmssIGlzIGxpbmsiLCBhLmlzTGluaygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibGluaywgbm8gZGlyIiwgIWEuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibW9kZSBsaW5rIiwgTElOS19GTEFHIHwgMDEyMywgYS5nZXRNb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVpZCBsaW5rIiwgNSwgYS5nZXRVc2VySWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2lkIGxpbmsiLCA2LCBhLmdldEdyb3VwSWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIGEuZ2V0TGlua2VkRmlsZSgpKTsKKworICAgICAgICBkYXRhID0gbmV3IGJ5dGVbXSB7KGJ5dGUpMHg4RSwgMHgwMSwgKGJ5dGUpMHhCRiwgKGJ5dGUpMHgwRSwgLy8gQ1JDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwMTIzLCAoYnl0ZSkweDQwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwfTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpZCwgZ2lkCisgICAgICAgIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOworICAgICAgICBhLnBhcnNlRnJvbUxvY2FsRmlsZURhdGEoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxlbmd0aCBkaXIiLCBkYXRhLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGEuZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJkaXIsIG5vIGxpbmsiLCAhYS5pc0xpbmsoKSk7CisgICAgICAgIGFzc2VydFRydWUoImRpciwgaXMgZGlyIiwgYS5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2RlIGRpciIsIERJUl9GTEFHIHwgMDEyMywgYS5nZXRNb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVpZCBkaXIiLCA1LCBhLmdldFVzZXJJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnaWQgZGlyIiwgNiwgYS5nZXRHcm91cElkKCkpOworCisgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtdIHswLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhZCBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxMjMsIChieXRlKTB4NDAsICAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwfTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpZCwgZ2lkCisgICAgICAgIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYS5wYXJzZUZyb21Mb2NhbEZpbGVEYXRhKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCByYWlzZSBiYWQgQ1JDIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYWQgQ1JDIGNoZWNrc3VtIDAgaW5zdGVhZCBvZiBlYmYwMThlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvRXh0cmFGaWVsZFV0aWxzVGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL0V4dHJhRmllbGRVdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDA1MTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL0V4dHJhRmllbGRVdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLnppcC5FeHRyYUZpZWxkVXRpbHMuCisgKgorICovCitwdWJsaWMgY2xhc3MgRXh0cmFGaWVsZFV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgVW5peFN0YXQgeworICAgIHB1YmxpYyBFeHRyYUZpZWxkVXRpbHNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgQXNpRXh0cmFGaWVsZCBhOworICAgIHByaXZhdGUgVW5yZWNvZ25pemVkRXh0cmFGaWVsZCBkdW1teTsKKyAgICBwcml2YXRlIGJ5dGVbXSBkYXRhOworICAgIHByaXZhdGUgYnl0ZVtdIGFMb2NhbDsKKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBhID0gbmV3IEFzaUV4dHJhRmllbGQoKTsKKyAgICAgICAgYS5zZXRNb2RlKDA3NTUpOworICAgICAgICBhLnNldERpcmVjdG9yeSh0cnVlKTsKKyAgICAgICAgZHVtbXkgPSBuZXcgVW5yZWNvZ25pemVkRXh0cmFGaWVsZCgpOworICAgICAgICBkdW1teS5zZXRIZWFkZXJJZChuZXcgWmlwU2hvcnQoMSkpOworICAgICAgICBkdW1teS5zZXRMb2NhbEZpbGVEYXRhRGF0YShuZXcgYnl0ZVswXSk7CisgICAgICAgIGR1bW15LnNldENlbnRyYWxEaXJlY3RvcnlEYXRhKG5ldyBieXRlW10gezB9KTsKKworICAgICAgICBhTG9jYWwgPSBhLmdldExvY2FsRmlsZURhdGFEYXRhKCk7CisgICAgICAgIGJ5dGVbXSBkdW1teUxvY2FsID0gZHVtbXkuZ2V0TG9jYWxGaWxlRGF0YURhdGEoKTsKKyAgICAgICAgZGF0YSA9IG5ldyBieXRlWzQgKyBhTG9jYWwubGVuZ3RoICsgNCArIGR1bW15TG9jYWwubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShhLmdldEhlYWRlcklkKCkuZ2V0Qnl0ZXMoKSwgMCwgZGF0YSwgMCwgMik7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYS5nZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCkuZ2V0Qnl0ZXMoKSwgMCwgZGF0YSwgMiwgMik7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYUxvY2FsLCAwLCBkYXRhLCA0LCBhTG9jYWwubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkdW1teS5nZXRIZWFkZXJJZCgpLmdldEJ5dGVzKCksIDAsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgNCthTG9jYWwubGVuZ3RoLCAyKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkdW1teS5nZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCkuZ2V0Qnl0ZXMoKSwgMCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA0K2FMb2NhbC5sZW5ndGgrMiwgMik7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZHVtbXlMb2NhbCwgMCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA0K2FMb2NhbC5sZW5ndGgrNCwgZHVtbXlMb2NhbC5sZW5ndGgpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBwYXJzZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFppcEV4dHJhRmllbGRbXSB6ZSA9IEV4dHJhRmllbGRVdGlscy5wYXJzZShkYXRhKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJudW1iZXIgb2YgZmllbGRzIiwgMiwgemUubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidHlwZSBmaWVsZCAxIiwgemVbMF0gaW5zdGFuY2VvZiBBc2lFeHRyYUZpZWxkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2RlIGZpZWxkIDEiLCAwNDA3NTUsCisgICAgICAgICAgICAgICAgICAgICAoKEFzaUV4dHJhRmllbGQpIHplWzBdKS5nZXRNb2RlKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJ0eXBlIGZpZWxkIDIiLCB6ZVsxXSBpbnN0YW5jZW9mIFVucmVjb2duaXplZEV4dHJhRmllbGQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRhdGEgbGVuZ3RoIGZpZWxkIDIiLCAwLAorICAgICAgICAgICAgICAgICAgICAgemVbMV0uZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOworCisgICAgICAgIGJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoLTFdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIGRhdGEyLCAwLCBkYXRhMi5sZW5ndGgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRXh0cmFGaWVsZFV0aWxzLnBhcnNlKGRhdGEyKTsKKyAgICAgICAgICAgIGZhaWwoImRhdGEgc2hvdWxkIGJlIGludmFsaWQiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEgc3RhcnRpbmcgYXQgIisoNCthTG9jYWwubGVuZ3RoKSsiIGlzIGluIHVua25vd24gZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1lcmdlIG1ldGhvZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2UoKSB7CisgICAgICAgIGJ5dGVbXSBsb2NhbCA9CisgICAgICAgICAgICBFeHRyYUZpZWxkVXRpbHMubWVyZ2VMb2NhbEZpbGVEYXRhRGF0YShuZXcgWmlwRXh0cmFGaWVsZFtdIHthLCBkdW1teX0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImxvY2FsIGxlbmd0aCIsIGRhdGEubGVuZ3RoLCBsb2NhbC5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bG9jYWwubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibG9jYWwgYnl0ZSAiK2ksIGRhdGFbaV0sIGxvY2FsW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBkdW1teUNlbnRyYWwgPSBkdW1teS5nZXRDZW50cmFsRGlyZWN0b3J5RGF0YSgpOworICAgICAgICBieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVs0ICsgYUxvY2FsLmxlbmd0aCArIDQgKyBkdW1teUNlbnRyYWwubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBkYXRhMiwgMCwgNCArIGFMb2NhbC5sZW5ndGggKyAyKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkdW1teS5nZXRDZW50cmFsRGlyZWN0b3J5TGVuZ3RoKCkuZ2V0Qnl0ZXMoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiwgNCthTG9jYWwubGVuZ3RoKzIsIDIpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGR1bW15Q2VudHJhbCwgMCwgZGF0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgNCthTG9jYWwubGVuZ3RoKzQsIGR1bW15Q2VudHJhbC5sZW5ndGgpOworCisKKyAgICAgICAgYnl0ZVtdIGNlbnRyYWwgPQorICAgICAgICAgICAgRXh0cmFGaWVsZFV0aWxzLm1lcmdlQ2VudHJhbERpcmVjdG9yeURhdGEobmV3IFppcEV4dHJhRmllbGRbXSB7YSwgZHVtbXl9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjZW50cmFsIGxlbmd0aCIsIGRhdGEyLmxlbmd0aCwgY2VudHJhbC5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2VudHJhbC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjZW50cmFsIGJ5dGUgIitpLCBkYXRhMltpXSwgY2VudHJhbFtpXSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbnRyeVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbnRyeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGUyZjZjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVudHJ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogSlVuaXQgMyB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVudHJ5LgorICoKKyAqLworcHVibGljIGNsYXNzIFppcEVudHJ5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBaaXBFbnRyeVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBoYW5kbGluZyBvZiBleHRyYSBmaWVsZHMKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFGaWVsZHMoKSB7CisgICAgICAgIEFzaUV4dHJhRmllbGQgYSA9IG5ldyBBc2lFeHRyYUZpZWxkKCk7CisgICAgICAgIGEuc2V0RGlyZWN0b3J5KHRydWUpOworICAgICAgICBhLnNldE1vZGUoMDc1NSk7CisgICAgICAgIFVucmVjb2duaXplZEV4dHJhRmllbGQgdSA9IG5ldyBVbnJlY29nbml6ZWRFeHRyYUZpZWxkKCk7CisgICAgICAgIHUuc2V0SGVhZGVySWQobmV3IFppcFNob3J0KDEpKTsKKyAgICAgICAgdS5zZXRMb2NhbEZpbGVEYXRhRGF0YShuZXcgYnl0ZVswXSk7CisKKyAgICAgICAgWmlwRW50cnkgemUgPSBuZXcgWmlwRW50cnkoInRlc3QvIik7CisgICAgICAgIHplLnNldEV4dHJhRmllbGRzKG5ldyBaaXBFeHRyYUZpZWxkW10ge2EsIHV9KTsKKyAgICAgICAgYnl0ZVtdIGRhdGExID0gemUuZ2V0RXh0cmEoKTsKKyAgICAgICAgWmlwRXh0cmFGaWVsZFtdIHJlc3VsdCA9IHplLmdldEV4dHJhRmllbGRzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmlyc3QgcGFzcyIsIDIsIHJlc3VsdC5sZW5ndGgpOworICAgICAgICBhc3NlcnRTYW1lKGEsIHJlc3VsdFswXSk7CisgICAgICAgIGFzc2VydFNhbWUodSwgcmVzdWx0WzFdKTsKKworICAgICAgICBVbnJlY29nbml6ZWRFeHRyYUZpZWxkIHUyID0gbmV3IFVucmVjb2duaXplZEV4dHJhRmllbGQoKTsKKyAgICAgICAgdTIuc2V0SGVhZGVySWQobmV3IFppcFNob3J0KDEpKTsKKyAgICAgICAgdTIuc2V0TG9jYWxGaWxlRGF0YURhdGEobmV3IGJ5dGVbXSB7MX0pOworCisgICAgICAgIHplLmFkZEV4dHJhRmllbGQodTIpOworICAgICAgICBieXRlW10gZGF0YTIgPSB6ZS5nZXRFeHRyYSgpOworICAgICAgICByZXN1bHQgPSB6ZS5nZXRFeHRyYUZpZWxkcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNlY29uZCBwYXNzIiwgMiwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIGFzc2VydFNhbWUoYSwgcmVzdWx0WzBdKTsKKyAgICAgICAgYXNzZXJ0U2FtZSh1MiwgcmVzdWx0WzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZW5ndGggc2Vjb25kIHBhc3MiLCBkYXRhMS5sZW5ndGgrMSwgZGF0YTIubGVuZ3RoKTsKKworICAgICAgICBVbnJlY29nbml6ZWRFeHRyYUZpZWxkIHUzID0gbmV3IFVucmVjb2duaXplZEV4dHJhRmllbGQoKTsKKyAgICAgICAgdTMuc2V0SGVhZGVySWQobmV3IFppcFNob3J0KDIpKTsKKyAgICAgICAgdTMuc2V0TG9jYWxGaWxlRGF0YURhdGEobmV3IGJ5dGVbXSB7MX0pOworICAgICAgICB6ZS5hZGRFeHRyYUZpZWxkKHUzKTsKKyAgICAgICAgcmVzdWx0ID0gemUuZ2V0RXh0cmFGaWVsZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlyZCBwYXNzIiwgMywgcmVzdWx0Lmxlbmd0aCk7CisKKyAgICAgICAgemUucmVtb3ZlRXh0cmFGaWVsZChuZXcgWmlwU2hvcnQoMSkpOworICAgICAgICBieXRlW10gZGF0YTMgPSB6ZS5nZXRFeHRyYSgpOworICAgICAgICByZXN1bHQgPSB6ZS5nZXRFeHRyYUZpZWxkcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvdXJ0aCBwYXNzIiwgMiwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIGFzc2VydFNhbWUoYSwgcmVzdWx0WzBdKTsKKyAgICAgICAgYXNzZXJ0U2FtZSh1MywgcmVzdWx0WzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZW5ndGggZm91cnRoIHBhc3MiLCBkYXRhMi5sZW5ndGgsIGRhdGEzLmxlbmd0aCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHplLnJlbW92ZUV4dHJhRmllbGQobmV3IFppcFNob3J0KDEpKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBiZSBubyBzdWNoIGVsZW1lbnQiKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbnNlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5peE1vZGUoKSB7CisgICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KCJmb28iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHplLmdldFBsYXRmb3JtKCkpOworICAgICAgICB6ZS5zZXRVbml4TW9kZSgwNzU1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHplLmdldFBsYXRmb3JtKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMDc1NSwKKyAgICAgICAgICAgICAgICAgICAgICh6ZS5nZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSA+PiAxNikgJiAweEZGRkYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgemUuZ2V0RXh0ZXJuYWxBdHRyaWJ1dGVzKCkgICYgMHhGRkZGKTsKKworICAgICAgICB6ZS5zZXRVbml4TW9kZSgwNDQ0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHplLmdldFBsYXRmb3JtKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMDQ0NCwKKyAgICAgICAgICAgICAgICAgICAgICh6ZS5nZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSA+PiAxNikgJiAweEZGRkYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgemUuZ2V0RXh0ZXJuYWxBdHRyaWJ1dGVzKCkgICYgMHhGRkZGKTsKKworICAgICAgICB6ZSA9IG5ldyBaaXBFbnRyeSgiZm9vLyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgemUuZ2V0UGxhdGZvcm0oKSk7CisgICAgICAgIHplLnNldFVuaXhNb2RlKDA3NzcpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgemUuZ2V0UGxhdGZvcm0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwNzc3LAorICAgICAgICAgICAgICAgICAgICAgKHplLmdldEV4dGVybmFsQXR0cmlidXRlcygpID4+IDE2KSAmIDB4RkZGRik7CisgICAgICAgIGFzc2VydEVxdWFscygweDEwLCB6ZS5nZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSAgJiAweEZGRkYpOworCisgICAgICAgIHplLnNldFVuaXhNb2RlKDA1NzcpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgemUuZ2V0UGxhdGZvcm0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwNTc3LAorICAgICAgICAgICAgICAgICAgICAgKHplLmdldEV4dGVybmFsQXR0cmlidXRlcygpID4+IDE2KSAmIDB4RkZGRik7CisgICAgICAgIGFzc2VydEVxdWFscygweDExLCB6ZS5nZXRFeHRlcm5hbEF0dHJpYnV0ZXMoKSAgJiAweEZGRkYpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcExvbmdUZXN0LmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvWmlwTG9uZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzJhYWFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcExvbmdUZXN0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBMb25nLgorICoKKyAqLworcHVibGljIGNsYXNzIFppcExvbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIFppcExvbmdUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY29udmVyc2lvbiB0byBieXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9CeXRlcygpIHsKKyAgICAgICAgWmlwTG9uZyB6bCA9IG5ldyBaaXBMb25nKDB4MTIzNDU2NzgpOworICAgICAgICBieXRlW10gcmVzdWx0ID0gemwuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZW5ndGggZ2V0Qnl0ZXMiLCA0LCByZXN1bHQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXJzdCBieXRlIGdldEJ5dGVzIiwgMHg3OCwgcmVzdWx0WzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZWNvbmQgYnl0ZSBnZXRCeXRlcyIsIDB4NTYsIHJlc3VsdFsxXSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhpcmQgYnl0ZSBnZXRCeXRlcyIsIDB4MzQsIHJlc3VsdFsyXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm91cnRoIGJ5dGUgZ2V0Qnl0ZXMiLCAweDEyLCByZXN1bHRbM10pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY29udmVyc2lvbiBmcm9tIGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tQnl0ZXMoKSB7CisgICAgICAgIGJ5dGVbXSB2YWwgPSBuZXcgYnl0ZVtdIHsweDc4LCAweDU2LCAweDM0LCAweDEyfTsKKyAgICAgICAgWmlwTG9uZyB6bCA9IG5ldyBaaXBMb25nKHZhbCk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUgZnJvbSBieXRlcyIsIDB4MTIzNDU2NzgsIHpsLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGNvbnRyYWN0IG9mIHRoZSBlcXVhbHMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisgICAgICAgIFppcExvbmcgemwgPSBuZXcgWmlwTG9uZygweDEyMzQ1Njc4KTsKKyAgICAgICAgWmlwTG9uZyB6bDIgPSBuZXcgWmlwTG9uZygweDEyMzQ1Njc4KTsKKyAgICAgICAgWmlwTG9uZyB6bDMgPSBuZXcgWmlwTG9uZygweDg3NjU0MzIxKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJyZWZsZXhpdmUiLCB6bC5lcXVhbHMoemwpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJ3b3JrcyIsIHpsLmVxdWFscyh6bDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgid29ya3MsIHBhcnQgdHdvIiwgIXpsLmVxdWFscyh6bDMpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJzeW1tZXRyaWMiLCB6bDIuZXF1YWxzKHpsKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibnVsbCBoYW5kbGluZyIsICF6bC5lcXVhbHMobnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKCJub24gWmlwTG9uZyBoYW5kbGluZyIsICF6bC5lcXVhbHMobmV3IEludGVnZXIoMHgxMjM0KSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgc2lnbiBoYW5kbGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbigpIHsKKyAgICAgICAgWmlwTG9uZyB6bCA9IG5ldyBaaXBMb25nKG5ldyBieXRlW10geyhieXRlKTB4RkYsIChieXRlKTB4RkYsIChieXRlKTB4RkYsIChieXRlKTB4RkZ9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4MDAwMDAwMDBGRkZGRkZGRmwsIHpsLmdldFZhbHVlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcE91dHB1dFN0cmVhbVRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBPdXRwdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliN2MwNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgWmlwT3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAKKyAgICBwcml2YXRlIERhdGUgdGltZTsKKyAgICBwcml2YXRlIFppcExvbmcgemw7CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8JCisgICAgcHVibGljIFppcE91dHB1dFN0cmVhbVRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRpbWUgPSBuZXcgRGF0ZSgpOworICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBjYWwuc2V0VGltZSh0aW1lKTsKKyAgICAgICAgaW50IHllYXIgPSBjYWwuZ2V0KENhbGVuZGFyLllFQVIpOworICAgICAgICBpbnQgbW9udGggPSBjYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSArIDE7CisgICAgICAgIGxvbmcgdmFsdWUgPSAgKCh5ZWFyIC0gMTk4MCkgPDwgMjUpCisgICAgICAgICAgICB8ICAgICAgICAgKG1vbnRoIDw8IDIxKQorICAgICAgICAgICAgfAkgICAgICAoY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpIDw8IDE2KQorICAgICAgICAgICAgfCAgICAgICAgIChjYWwuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKSA8PCAxMSkKKyAgICAgICAgICAgIHwgICAgICAgICAoY2FsLmdldChDYWxlbmRhci5NSU5VVEUpIDw8IDUpCisgICAgICAgICAgICB8ICAgICAgICAgKGNhbC5nZXQoQ2FsZW5kYXIuU0VDT05EKSA+PiAxKTsKKworICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbNF07CisgICAgICAgIHJlc3VsdFswXSA9IChieXRlKSAoKHZhbHVlICYgMHhGRikpOworICAgICAgICByZXN1bHRbMV0gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4RkYwMCkgPj4gOCk7CisgICAgICAgIHJlc3VsdFsyXSA9IChieXRlKSAoKHZhbHVlICYgMHhGRjAwMDApID4+IDE2KTsKKyAgICAgICAgcmVzdWx0WzNdID0gKGJ5dGUpICgodmFsdWUgJiAweEZGMDAwMDAwTCkgPj4gMjQpOworICAgICAgICB6bCA9IG5ldyBaaXBMb25nKHJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFppcExvbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWmlwTG9uZyB0ZXN0ID0gWmlwT3V0cHV0U3RyZWFtLnRvRG9zVGltZSh0aW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3QuZ2V0VmFsdWUoKSwgemwuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkanVzdFRvTG9uZygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChsb25nKSBJbnRlZ2VyLk1BWF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgIFppcE91dHB1dFN0cmVhbS5hZGp1c3RUb0xvbmcoSW50ZWdlci5NQVhfVkFMVUUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCgobG9uZykgSW50ZWdlci5NQVhfVkFMVUUpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgIFppcE91dHB1dFN0cmVhbS5hZGp1c3RUb0xvbmcoSW50ZWdlci5NQVhfVkFMVUUgKyAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyICogKChsb25nKSBJbnRlZ2VyLk1BWF9WQUxVRSksCisgICAgICAgICAgICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0uYWRqdXN0VG9Mb25nKDIgKiBJbnRlZ2VyLk1BWF9WQUxVRSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcFNob3J0VGVzdC5qYXZhIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcFNob3J0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjYwNGYKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnRUZXN0LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEpVbml0IDMgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBTaG9ydC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBaaXBTaG9ydFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgWmlwU2hvcnRUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY29udmVyc2lvbiB0byBieXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9CeXRlcygpIHsKKyAgICAgICAgWmlwU2hvcnQgenMgPSBuZXcgWmlwU2hvcnQoMHgxMjM0KTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHpzLmdldEJ5dGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygibGVuZ3RoIGdldEJ5dGVzIiwgMiwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmlyc3QgYnl0ZSBnZXRCeXRlcyIsIDB4MzQsIHJlc3VsdFswXSk7CisgICAgICAgIGFzc2VydEVxdWFscygic2Vjb25kIGJ5dGUgZ2V0Qnl0ZXMiLCAweDEyLCByZXN1bHRbMV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY29udmVyc2lvbiBmcm9tIGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tQnl0ZXMoKSB7CisgICAgICAgIGJ5dGVbXSB2YWwgPSBuZXcgYnl0ZVtdIHsweDM0LCAweDEyfTsKKyAgICAgICAgWmlwU2hvcnQgenMgPSBuZXcgWmlwU2hvcnQodmFsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSBmcm9tIGJ5dGVzIiwgMHgxMjM0LCB6cy5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBjb250cmFjdCBvZiB0aGUgZXF1YWxzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgeworICAgICAgICBaaXBTaG9ydCB6cyA9IG5ldyBaaXBTaG9ydCgweDEyMzQpOworICAgICAgICBaaXBTaG9ydCB6czIgPSBuZXcgWmlwU2hvcnQoMHgxMjM0KTsKKyAgICAgICAgWmlwU2hvcnQgenMzID0gbmV3IFppcFNob3J0KDB4NTY3OCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmVmbGV4aXZlIiwgenMuZXF1YWxzKHpzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgid29ya3MiLCB6cy5lcXVhbHMoenMyKSk7CisgICAgICAgIGFzc2VydFRydWUoIndvcmtzLCBwYXJ0IHR3byIsICF6cy5lcXVhbHMoenMzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic3ltbWV0cmljIiwgenMyLmVxdWFscyh6cykpOworCisgICAgICAgIGFzc2VydFRydWUoIm51bGwgaGFuZGxpbmciLCAhenMuZXF1YWxzKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibm9uIFppcFNob3J0IGhhbmRsaW5nIiwgIXpzLmVxdWFscyhuZXcgSW50ZWdlcigweDEyMzQpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBzaWduIGhhbmRsaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTaWduKCkgeworICAgICAgICBaaXBTaG9ydCB6cyA9IG5ldyBaaXBTaG9ydChuZXcgYnl0ZVtdIHsoYnl0ZSkweEZGLCAoYnl0ZSkweEZGfSk7CisgICAgICAgIGFzc2VydEVxdWFscygweDAwMDBGRkZGLCB6cy5nZXRWYWx1ZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9PdXRwdXQuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9PdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzEzNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L091dHB1dC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmV4YW1wbGUuanVuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogTm90IHJlYWxseSBhIHRlc3Qgb2YgQW50IGJ1dCBhIHRlc3QgdGhhdCBpcyBydW4gYnkgdGhlIHRlc3Qgb2YgdGhlCisgKiBqdW5pdCB0YXNrLiAgQ29uZnVzZWQ/CisgKgorICogQHNpbmNlIEFudCAxLjUKKyAqLworcHVibGljIGNsYXNzIE91dHB1dCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBPdXRwdXQoU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE91dHB1dCgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmb28iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvVGhyZWFkZWRPdXRwdXQuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9UaHJlYWRlZE91dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjQ2MmEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvVGhyZWFkZWRPdXRwdXQuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5leGFtcGxlLmp1bml0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIE5vdCByZWFsbHkgYSB0ZXN0IG9mIEFudCBidXQgYSB0ZXN0IHRoYXQgaXMgcnVuIGJ5IHRoZSB0ZXN0IG9mIHRoZQorICoganVuaXQgdGFzay4gIENvbmZ1c2VkPworICoKKyAqIEBzaW5jZSBBbnQgMS41CisgKi8KK3B1YmxpYyBjbGFzcyBUaHJlYWRlZE91dHB1dCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBUaHJlYWRlZE91dHB1dChTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZm9vIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdC5qb2luKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L1htbFBhcnNlclRlc3QuamF2YSBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9YbWxQYXJzZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjNzY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9YbWxQYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuZXhhbXBsZS5qdW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeTsKKworLyoqCisgKiBjcmVhdGVkIEF1ZyAxMiwgMjAwNCAxOjM5OjU5IFBNCisgKi8KKworcHVibGljIGNsYXNzIFhtbFBhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgWG1sUGFyc2VyVGVzdChTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WGVyY2VzSXNQcmVzZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFhNTFJlYWRlciB4ZXJjZXM7CisgICAgICAgIHhlcmNlcyA9IFhNTFJlYWRlckZhY3RvcnkuY3JlYXRlWE1MUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoeGVyY2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WGVyY2VzSGFuZGxlc1NjaGVtYSgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBYTUxSZWFkZXIgeGVyY2VzOworICAgICAgICB4ZXJjZXMgPSBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcigib3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIiKTsKKyAgICAgICAgeGVyY2VzLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlckhhbmRsZXNTY2hlbWEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgWE1MUmVhZGVyIHhlcmNlczsKKyAgICAgICAgeGVyY2VzID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKKyAgICAgICAgeGVyY2VzLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvVGFza2RlZlRlc3RDb250YWluZXJUYXNrLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvVGFza2RlZlRlc3RDb250YWluZXJUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2NmQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90YXNrcy9UYXNrZGVmVGVzdENvbnRhaW5lclRhc2suamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmV4YW1wbGUudGFza3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TZXF1ZW50aWFsOworCitwdWJsaWMgY2xhc3MgVGFza2RlZlRlc3RDb250YWluZXJUYXNrIGV4dGVuZHMgU2VxdWVudGlhbCB7CisgICAgcHVibGljIFRhc2tkZWZUZXN0Q29udGFpbmVyVGFzaygpIHt9Cit9CmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvVGFza2RlZlRlc3RTaW1wbGVUYXNrLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvVGFza2RlZlRlc3RTaW1wbGVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlOGNkNQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90YXNrcy9UYXNrZGVmVGVzdFNpbXBsZVRhc2suamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmV4YW1wbGUudGFza3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKK3B1YmxpYyBjbGFzcyBUYXNrZGVmVGVzdFNpbXBsZVRhc2sgZXh0ZW5kcyBUYXNrIHsKKworICAgIHB1YmxpYyBjbGFzcyBFY2hvIHsKKyAgICAgICAgRWNobygpIHt9CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBzKSB7bWVzc2FnZSA9IHM7fQorICAgIH0KKworICAgIHB1YmxpYyBUYXNrZGVmVGVzdFNpbXBsZVRhc2soKSB7fQorCisgICAgcHJpdmF0ZSBFY2hvIGVjaG87CisgICAgcHVibGljIEVjaG8gY3JlYXRlRWNobygpIHsKKyAgICAgICAgZWNobyA9IG5ldyBFY2hvKCk7CisgICAgICAgIHJldHVybiBlY2hvOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIGxvZygic2ltcGxldGFzazogIitlY2hvLm1lc3NhZ2UsIFByb2plY3QuTVNHX0lORk8pOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvYW50bGliLnhtbCBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90YXNrcy9hbnRsaWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MjBkYTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvYW50bGliLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhbnRsaWI+Cis8bWFjcm9kZWYgbmFtZT0ic2ltcGxlIj4KKyAgIDxlbGVtZW50IG5hbWU9InNvbWUtdGFza3MiIG9wdGlvbmFsPSJ5ZXMiIGltcGxpY2l0PSJ5ZXMiLz4KKyAgIDxzZXF1ZW50aWFsPgorICAgICAgPHNvbWUtdGFza3MvPgorICAgPC9zZXF1ZW50aWFsPgorPC9tYWNyb2RlZj4KKzwvYW50bGliPgorICAgICAgCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvYW50bGliMi54bWwgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvYW50bGliMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyMGRhNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90YXNrcy9hbnRsaWIyLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhbnRsaWI+Cis8bWFjcm9kZWYgbmFtZT0ic2ltcGxlIj4KKyAgIDxlbGVtZW50IG5hbWU9InNvbWUtdGFza3MiIG9wdGlvbmFsPSJ5ZXMiIGltcGxpY2l0PSJ5ZXMiLz4KKyAgIDxzZXF1ZW50aWFsPgorICAgICAgPHNvbWUtdGFza3MvPgorICAgPC9zZXF1ZW50aWFsPgorPC9tYWNyb2RlZj4KKzwvYW50bGliPgorICAgICAgCmRpZmYgLS1naXQgYS90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdHlwZXMvVHlwZWRlZlRlc3RUeXBlLmphdmEgYi90cnVuay9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdHlwZXMvVHlwZWRlZlRlc3RUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1Yjc2ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90eXBlcy9UeXBlZGVmVGVzdFR5cGUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmV4YW1wbGUudHlwZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OworCitwdWJsaWMgY2xhc3MgVHlwZWRlZlRlc3RUeXBlIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCB7Cit9CisKZGlmZiAtLWdpdCBhL3RydW5rL3hkb2NzL2FudGxpYnMvYW50dW5pdC9pbmRleC54bWwgYi90cnVuay94ZG9jcy9hbnRsaWJzL2FudHVuaXQvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0MmQxZjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9hbnRsaWJzL2FudHVuaXQvaW5kZXgueG1sCkBAIC0wLDAgKzEsMjM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8aW5kZXggdmFsdWU9IjEiLz4KKyAgICA8dGl0bGU+QW50VW5pdDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworICA8Ym9keT4KKworICAgIDxzZWN0aW9uIG5hbWU9IkFudFVuaXQgMS4wIj4KKyAgICAgIDxoMz5KYW51YXJ5IDgsIDIwMDcgLSBBcGFjaGUgQW50VW5pdCAxLjAgQXZhaWxhYmxlPC9oMz4KKworICAgICAgPHA+QXBhY2hlIEFudFVuaXQgMS4wIGlzIG5vdyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGFzIDxhCisgICAgICBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPmJpbmFyeTwvYT4KKyAgICAgIG9yIDxhCisgICAgICBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9zcmNkb3dubG9hZC5jZ2kiPnNvdXJjZTwvYT4KKyAgICAgIHJlbGVhc2UuPC9wPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IklkZWEiPgorICAgICAgPHA+SW5pdGlhbGx5IGFsbCB0ZXN0cyBmb3IgQW50IHRhc2tzIHdlcmUgd3JpdHRlbiBhcyBpbmRpdmlkdWFsCisgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZy8iPkpVbml0PC9hPiB0ZXN0IGNhc2VzLiAgUHJldHR5CisgICAgICBzb29uIGl0IHdhcyBjbGVhciB0aGF0IG1vc3QgdGVzdHMgbmVlZGVkIHRvIHBlcmZvcm0gY29tbW9uIHRhc2tzCisgICAgICBsaWtlIHJlYWRpbmcgYSBidWlsZCBmaWxlLCBpbml0aWFsaXppbmcgYSBwcm9qZWN0IGluc3RhbmNlIHdpdGgKKyAgICAgIGl0IGFuZCBleGVjdXRpbmcgYSB0YXJnZXQuICBBdCB0aGlzIHBvaW50IDxhCisgICAgICBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L2NvcmUvdHJ1bmsvc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEZpbGVUZXN0LmphdmEiPkJ1aWxkRmlsZVRlc3Q8L2E+CisgICAgICB3YXMgaW52ZW50ZWQsIGEgYmFzZSBjbGFzcyBmb3IgYWxtb3N0IGFsbCB0YXNrIHRlc3QgY2FzZXMuPC9wPgorCisgICAgICA8cD5CdWlsZEZpbGVUZXN0IHdvcmtzIGZpbmUgYW5kIGluIGZhY3QgaGFzIGJlZW4gcGlja2VkIHVwIGJ5IDxhCisgICAgICBocmVmPSJodHRwOi8vYW50LWNvbnRyaWIuc2YubmV0LyI+dGhlIEFudC1Db250cmliIFByb2plY3Q8L2E+CisgICAgICBhbmQgb3RoZXJzIGFzIHdlbGwuPC9wPgorCisgICAgICA8cD5PdmVyIHRpbWUgYSBuZXcgcGF0dGVybiBldm9sdmVkLCBtb3JlIGFuZCBtb3JlIHRlc3RzIG9ubHkKKyAgICAgIGV4ZWN1dGVkIGEgdGFyZ2V0IGFuZCBkaWRuJ3QgY2hlY2sgYW55IGVmZmVjdHMuICBJbnN0ZWFkIHRoYXQKKyAgICAgIHRhcmdldCBjb250YWluZWQgdGhlIGFzc2VydGlvbnMgYXMgYSA8Y29kZT4mbHQ7ZmFpbCZndDs8L2NvZGU+CisgICAgICB0YXNrLiAgVGhpcyBpcyBhbiBleGFtcGxlIHRha2VuIGZyb20gdGhlIGJ1aWxkIGZpbGUgZm9yIHRoZQorICAgICAgQU5UTFIgdGFzayAodXNpbmcgQW50IDEuNyBmZWF0dXJlcyk6PC9wPgorCisgICAgICA8c291cmNlPjwhW0NEQVRBWworICA8dGFyZ2V0IG5hbWU9InRlc3QzIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPGFudGxyIHRhcmdldD0iYW50bHIuZyIgb3V0cHV0ZGlyZWN0b3J5PSIke3RtcC5kaXJ9Ii8+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8IS0tIHRvIHByb3ZlIGVhY2ggb2YgdGhlc2UgZmlsZXMgZXhpc3RzOworICAgICAgICAgICAgIEFOVExSID49IDIuNy42IGxlYXZlcyBiZWhpbmQgbmV3ICguc21hcCkgZmlsZXMgYXMgd2VsbC4gLS0+CisgICAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49Im5lIiBjb3VudD0iNSI+CisgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RtcC5kaXJ9Ij4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGNQYXJzZXJUb2tlblR5cGVzLnR4dCIgLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGNQYXJzZXJUb2tlblR5cGVzLmphdmEiIC8+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJDYWxjTGV4ZXIuamF2YSIgLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGNQYXJzZXIuamF2YSIgLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGNUcmVlV2Fsa2VyLmphdmEiIC8+CisgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICA8L2NvbmRpdGlvbj4KKyAgICA8L2ZhaWw+CisgIDwvdGFyZ2V0PgorXV0+PC9zb3VyY2U+CisKKyAgICAgIDxwPndoZXJlIHRoZSBjb3JyZXNwb25kaW5nIEpVbml0IHRlc3RjYXNlIGhhcyBiZWVuIHJlZHVjZWQKKyAgICAgIHRvPC9wPgorCisgICAgICA8c291cmNlPjwhW0NEQVRBWworLi4uCitwdWJsaWMgY2xhc3MgQU5UTFJUZXN0IGV4dGVuZHMgQnVpbGRGaWxlVGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyLyI7CisKKyAgICBwdWJsaWMgQU5UTFJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBjb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJhbnRsci54bWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgIH0KKy4uLgorfQorXV0+PC9zb3VyY2U+CisKKyAgICAgIDxwPlRoaXMgYXBwcm9hY2ggaGFzIGEgY291cGxlIG9mIGFkdmFudGFnZXMsIG9uZSBvZiB0aGVtIGlzIHRoYXQKKyAgICAgIGl0IGlzIHZlcnkgZWFzeSB0byB0cmFuc2xhdGUgYW4gZXhhbXBsZSBidWlsZCBmaWxlIGZyb20gYSBidWcKKyAgICAgIHJlcG9ydCBpbnRvIGEgdGVzdCBjYXNlLiAgSWYgeW91IGFzayBhIHVzZXIgZm9yIGEgdGVzdGNhc2UgZm9yIGEKKyAgICAgIGdpdmVuIGJ1ZyBpbiBBbnQsIGhlIG5vdyBkb2Vzbid0IG5lZWQgdG8gdW5kZXJzdGFuZCBKVW5pdCBvciBob3cKKyAgICAgIHRvIGZpdCBhIHRlc3QgaW50byBBbnQncyBleGlzdGluZyB0ZXN0cyBhbnkgbW9yZS48L3A+CisKKyAgICAgIDxwPkFudFVuaXQgdGFrZXMgdGhpcyBhcHByb2FjaCB0byB0ZXN0aW5nIGV2ZW4gZnVydGhlciwgaXQKKyAgICAgIHJlbW92ZXMgSlVuaXQgY29tcGxldGVseSBhbmQgaXQgY29tZXMgd2l0aCBhIHNldCBvZiBwcmVkZWZpbmVkCisgICAgICA8Y29kZT4mbHQ7YXNzZXJ0Jmd0OzwvY29kZT4gdGFza3MgaW4gb3JkZXIgdG8gcmV1c2UgY29tbW9uIGtpbmQKKyAgICAgIG9mIGNoZWNrcy48L3A+CisKKyAgICAgIDxwPkl0IHR1cm5zIG91dCB0aGF0IEFudFVuaXQgbGVuZHMgaXRzZWxmIGFzIGEgc29sdXRpb24gdG8gb3RoZXIKKyAgICAgIHByb2JsZW1zIGFzIHdlbGwuICBUaGUgYXNzZXJ0aW9ucyBhcmUgYW4gZWFzeSB3YXkgdG8gdmFsaWRhdGUgYQorICAgICAgc2V0dXAgYmVmb3JlIGV2ZW4gc3RhcnRpbmcgdGhlIGJ1aWxkIHByb2Nlc3MsIGZvciBleGFtcGxlLgorICAgICAgQW50VW5pdCBjb3VsZCBhbHNvIGJlIHVzZWQgZm9yIGZ1bmN0aW9uYWwgYW5kIGludGVncmF0aW9uIHRlc3RzCisgICAgICBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZiBBbnQgdGFza3MgKGFzc2VydCBjb250ZW50cyBvZiBkYXRhYmFzZXMKKyAgICAgIGFmdGVyIHJ1bm5pbmcgYW4gYXBwbGljYXRpb24sIGFzc2VydCBjb250ZW50cyBvZiBIVFRQIHJlc3BvbnNlcworICAgICAgLi4uKS4gIFRoaXMgaXMgYW4gYXJlYSB0aGF0IHdpbGwgbmVlZCBtb3JlIHJlc2VhcmNoLjwvcD4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJDb25jZXB0cyI+CisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJhbnR1bml0IFRhc2siPgorICAgICAgICA8cD5UaGUgJmx0O2FudHVuaXQmZ3Q7IHRhc2sgZHJpdmVzIHRoZSB0ZXN0cyBtdWNoIGxpa2UKKyAgICAgICAgJmx0O2p1bml0Jmd0OyBkb2VzIGZvciBKVW5pdCB0ZXN0cy48L3A+CisKKyAgICAgICAgPHA+V2hlbiBjYWxsZWQgb24gYSBidWlsZCBmaWxlLCB0aGUgdGFzayB3aWxsIHN0YXJ0IGEgbmV3IEFudAorICAgICAgICBwcm9qZWN0IGZvciB0aGF0IGJ1aWxkIGZpbGUgYW5kIHNjYW4gZm9yIHRhcmdldHMgd2l0aCBuYW1lcworICAgICAgICB0aGF0IHN0YXJ0IHdpdGggInRlc3QiLiAgRm9yIGVhY2ggc3VjaCB0YXJnZXQgaXQgdGhlbiB3aWxsPC9wPgorICAgICAgICA8b2w+CisgICAgICAgICAgPGxpPkV4ZWN1dGUgdGhlIHRhcmdldCBuYW1lZCBzZXRVcCwgaWYgdGhlcmUgaXMgb25lLjwvbGk+CisgICAgICAgICAgPGxpPkV4ZWN1dGUgdGhlIHRhcmdldCBpdHNlbGYgLSBpZiB0aGlzIHRhcmdldCBkZXBlbmRzIG9uCisgICAgICAgICAgb3RoZXIgdGFyZ2V0cyB0aGUgbm9ybWFsIEFudCBydWxlcyBhcHBseSBhbmQgdGhlIGRlcGVuZGVudAorICAgICAgICAgIHRhcmdldHMgYXJlIGV4ZWN1dGVkIGZpcnN0LjwvbGk+CisgICAgICAgICAgPGxpPkV4ZWN1dGUgdGhlIHRhcmdldCBuYW1lcyB0ZWFyRG93biwgaWYgdGhlcmUgaXMgb25lLjwvbGk+CisgICAgICAgIDwvb2w+CisKKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFzc2VydGlvbnMiPgorCisgICAgICAgIDxwPlRoZSBiYXNlIHRhc2sgaXMgPGNvZGU+Jmx0O2Fzc2VydFRydWUmZ3Q7PC9jb2RlPi4gIEl0CisgICAgICAgIGFjY2VwdHMgYSBzaW5nbGUgbmVzdGVkIGNvbmRpdGlvbiBhbmQgdGhyb3dzIGEgc3ViY2xhc3Mgb2YKKyAgICAgICAgQnVpbGRFeGNlcHRpb24gbmFtZWQgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGlmIHRoYXQKKyAgICAgICAgY29uZGl0aW9uIGV2YWx1YXRlcyB0byBmYWxzZS48L3A+CisKKyAgICAgICAgPHA+VGhpcyB0YXNrIGNvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCB1c2luZworICAgICAgICA8Y29kZT4mbHQ7bWFjcm9kZWYmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2ZhaWwmZ3Q7PC9jb2RlPiwKKyAgICAgICAgYnV0IGluIGZhY3QgaXQgaXMgYSAicmVhbCIgdGFzayBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCisgICAgICAgIHRocm93IGEgc3ViY2xhc3Mgb2YgQnVpbGRFeGNlcHRpb24uICBUaGUKKyAgICAgICAgPGNvZGU+Jmx0O2FudHVuaXQmZ3Q7PC9jb2RlPiB0YXNrIGNhdGNoZXMgdGhpcyBleGNlcHRpb24gYW5kCisgICAgICAgIG1hcmtzIHRoZSB0YXJnZXQgYXMgZmFpbGVkLCBhbnkgb3RoZXIgdHlwZSBvZiBFeGNlcHRpb24KKyAgICAgICAgKGluY2x1ZGluZyBvdGhlciBCdWlsZEV4Y2VwdGlvbikgYXJlIHRlc3QgZXJyb3JzLjwvcD4KKworICAgICAgICA8cD5Ub2dldGhlciB3aXRoIDxjb2RlPiZsdDthc3NlcnRUcnVlJmd0OzwvY29kZT4gdGhlcmUgYXJlCisgICAgICAgIG1hbnkgcHJlZGVmaW5lZCBhc3NlcnRpb25zIGZvciBjb21tb24gY29uZGl0aW9ucywgbW9zdCBvZgorICAgICAgICB0aGVzZSBhcmUgb25seSBtYWNyb3MuPC9wPgorCisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik90aGVyIFRhc2tzIj4KKworICAgICAgICA8cD5UaGUgPGNvZGU+Jmx0O2xvZ2NhcHR1cmVyJmd0OzwvY29kZT4gY2FwdHVyZXMgYWxsIG1lc3NhZ2VzCisgICAgICAgIHRoYXQgcGFzcyBBbnQncyBsb2dnaW5nIHN5c3RlbSBhbmQgcHJvdmlkZXMgdGhlbSB2aWEgYQorICAgICAgICByZWZlcmVuY2UgaW5zaWRlIG9mIHRoZSBwcm9qZWN0LiAgSWYgeW91IHdhbnQgdG8gYXNzZXJ0CisgICAgICAgIGNlcnRhaW4gbG9nIG1lc3NhZ2VzLCB5b3UgbmVlZCB0byBzdGFydCB0aGlzIHRhc2sgKHByaW9yIHRvCisgICAgICAgIHlvdXIgdGFyZ2V0IHVuZGVyIHRlc3QpIGFuZCB1c2UgdGhlCisgICAgICAgIDxjb2RlPiZsdDthc3NlcnRMb2dDb250YWlucyZndDs8L2NvZGU+IGFzc2VydGlvbi48L3A+CisKKyAgICAgICAgPHA+PGNvZGU+Jmx0O2V4cGVjdEZhaWx1cmUmZ3Q7PC9jb2RlPiBpcyBhIHRhc2sgY29udGFpbmVyIHRoYXQKKyAgICAgICAgY2F0Y2hlcyBhbnkgQnVpbGRFeGNlcHRpb24gdGhyb3duIGJ5IHRhc2tzIG5lc3RlZCBpbnRvIGl0LiAgSWYKKyAgICAgICAgbm8gZXhjZXB0aW9uIGhhcyBiZWVuIHRocm93biBpdCB3aWxsIGNhdXNlIGEgdGVzdCBmYWlsdXJlIChieQorICAgICAgICB0aHJvd2luZyBhbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24pLjwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50VW5pdExpc3RlbmVyIj4KKyAgICAgICAgPHA+UGFydCBvZiB0aGUgbGlicmFyeSBpcyB0aGUgPGNvZGU+QW50VW5pdExpc3RlbmVyPC9jb2RlPgorICAgICAgICBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byByZWNvcmQgdGVzdCByZXN1bHRzLiAgVGhlCisgICAgICAgICZsdDthbnR1bml0Jmd0OyB0YXNrIGFjY2VwdHMgYXJiaXRyYXJ5IG1hbnkgbGlzdGVuZXJzIGFuZAorICAgICAgICByZWxheXMgdGVzdCByZXN1bHRzIHRvIHRoZW0uPC9wPgorCisgICAgICAgIDxwPkN1cnJlbnRseSB0d28gaW1wbGVtZW50YXRpb25zIC0KKyAgICAgICAgPGNvZGU+Jmx0O3BsYWlubGlzdGVuZXImZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+eG1sbGlzdGVuZXI8L2NvZGU+IAorICAgICAgICBtb2RlbGxlZCBhZnRlciB0aGUgInBsYWluIiBhbmQgInhtbCIKKyAgICAgICAgSlVuaXQgbGlzdGVuZXJzIC0gYXJlIGJ1bmRsZWQgd2l0aCB0aGUgbGlicmFyeS48L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gbmFtZT0iRXhhbXBsZXMiPgorCisgICAgICA8cD5UaGlzIGlzIGEgd2F5IHRvIHRlc3QgdGhhdCA8Y29kZT4mbHQ7dG91Y2gmZ3Q7PC9jb2RlPgorICAgICAgYWN0dWFsbHkgY3JlYXRlcyBhIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdDo8L3A+CisKKyAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8cHJvamVjdCB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorICA8IS0tIGlzIGNhbGxlZCBwcmlvciB0byB0aGUgdGVzdCAtLT4KKyAgPHRhcmdldCBuYW1lPSJzZXRVcCI+CisgICAgPHByb3BlcnR5IG5hbWU9ImZvbyIgdmFsdWU9ImZvbyIvPgorICA8L3RhcmdldD4KKworICA8IS0tIGlzIGNhbGxlZCBhZnRlciB0aGUgdGVzdCwgZXZlbiBpZiB0aGF0IGNhdXNlZCBhbiBlcnJvciAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZWFyRG93biI+CisgICAgPGRlbGV0ZSBmaWxlPSIke2Zvb30iIHF1aWV0PSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gdGhlIGFjdHVhbCB0ZXN0IGNhc2UgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdFRvdWNoQ3JlYXRlc0ZpbGUiPgorICAgIDxhdTphc3NlcnRGaWxlRG9lc250RXhpc3QgZmlsZT0iJHtmb299Ii8+CisgICAgPHRvdWNoIGZpbGU9IiR7Zm9vfSIvPgorICAgIDxhdTphc3NlcnRGaWxlRXhpc3RzIGZpbGU9IiR7Zm9vfSIvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KK11dPjwvc291cmNlPgorCisgICAgICA8cD5XaGVuIHJ1bm5pbmcgYSB0YXNrIGxpa2U8L3A+CisKKyAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgPGF1OmFudHVuaXQ+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJ0b3VjaC54bWwiLz4KKyAgICAgIDxhdTpwbGFpbmxpc3RlbmVyLz4KKyAgICA8L2F1OmFudHVuaXQ+CitdXT48L3NvdXJjZT4KKworICAgICAgPHA+ZnJvbSBhIGJ1aWxkZmlsZSBvZiBpdHMgb3duIHlvdSdsbCBnZXQgYSByZXN1bHQgdGhhdCBsb29rcyBsaWtlPC9wPgorCisgICAgICA8c291cmNlPjwhW0NEQVRBWworW2F1OmFudHVuaXRdIEJ1aWxkIEZpbGU6IC90bXAvdG91Y2gueG1sCitbYXU6YW50dW5pdF0gVGVzdHMgcnVuOiAxLCBGYWlsdXJlczogMCwgRXJyb3JzOiAwLCBUaW1lIGVsYXBzZWQ6IDAuMjQ5IHNlYworW2F1OmFudHVuaXRdIFRhcmdldDogdGVzdFRvdWNoQ3JlYXRlc0ZpbGUgdG9vayAwLjE4MyBzZWMKKworQlVJTEQgU1VDQ0VTU0ZVTAorVG90YWwgdGltZTogMSBzZWNvbmQKK11dPjwvc291cmNlPgorCisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3MvYW50bGlicy9iaW5kb3dubG9hZC54bWwgYi90cnVuay94ZG9jcy9hbnRsaWJzL2JpbmRvd25sb2FkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODViZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsveGRvY3MvYW50bGlicy9iaW5kb3dubG9hZC54bWwKQEAgLTAsMCArMSwyMDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5CaW5hcnkgRGlzdHJpYnV0aW9uczwvdGl0bGU+CisgICAgPGluZGV4IHZhbHVlPSIxIi8+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKzxzZWN0aW9uIG5hbWU9IkRvd25sb2FkaW5nIEFudGxpYnMiPgorCis8cD5Vc2UgdGhlIGxpbmtzIGJlbG93IHRvIGRvd25sb2FkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBBbnRsaWJzIGZyb20KK29uZSBvZiBvdXIgbWlycm9ycy4gIEl0IGlzIGdvb2QgcHJhY3RpY2UgdG8KKzxhIGhyZWY9Iltsb2NhdGlvbl0jVmVyaWZ5IFJlbGVhc2VzIj52ZXJpZnkgdGhlIGludGVncml0eTwvYT4KK29mIHRoZSBkaXN0cmlidXRpb24gZmlsZXMsIGVzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBvbmUgb2Ygb3VyCittaXJyb3Igc2l0ZXMuICBJbiBvcmRlciB0byBkbyB0aGlzIHlvdSBtdXN0IHVzZSB0aGUgc2lnbmF0dXJlcyBmcm9tCitvdXIgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvIj5tYWluIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPi48L3A+CisKKzxwPkFudGxpYnMgYXJlIGRpc3RyaWJ1dGVkIGFzIDxjb2RlPnppcDwvY29kZT4sIDxjb2RlPnRhci5nejwvY29kZT4gYW5kCis8Y29kZT50YXIuYnoyPC9jb2RlPiBhcmNoaXZlcyAtIHRoZSBjb250ZW50cyBhcmUgdGhlIHNhbWUuICBQbGVhc2UKK25vdGUgdGhhdCB0aGUgPGNvZGU+dGFyLio8L2NvZGU+IGFyY2hpdmVzIGNvbnRhaW4gZmlsZSBuYW1lcyBsb25nZXIKK3RoYW4gMTAwIGNoYXJhY3RlcnMgYW5kIGhhdmUgYmVlbiBjcmVhdGVkIHVzaW5nIEdOVSB0YXIgZXh0ZW5zaW9ucy4KK1RodXMgdGhleSBtdXN0IGJlIHVudGFycmVkIHdpdGggYSBHTlUgY29tcGF0aWJsZSB2ZXJzaW9uIG9mCis8Y29kZT50YXI8L2NvZGU+LjwvcD4KKworPHA+SWYgeW91IGRvIG5vdCBzZWUgdGhlIGZpbGUgeW91IG5lZWQgaW4gdGhlIGxpbmtzIGJlbG93LCBwbGVhc2Ugc2VlCit0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvIj5tYXN0ZXIgZGlzdHJpYnV0aW9uCitkaXJlY3Rvcnk8L2E+IG9yLCBwcmVmZXJhYmx5LCBpdHMgPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L2FudGxpYnMvIj5taXJyb3I8L2E+LjwvcD4KKworPC9zZWN0aW9uPgorCis8IS0tc2VjdGlvbiBuYW1lPSJEb3dubG9hZGluZyBCZXRhcyI+CisKKzxwPkJldGEgcmVsZWFzZXMgYXJlIG5vdCBtaXJyb3JlZCwgeW91IGNhbiBmaW5kIG91ciBsYXRlc3QgYmV0YQorcmVsZWFzZXMgYXQgPGEKK2hyZWY9Imh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzLyI+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvPC9hPi48L3A+CisKKzxwPkN1cnJlbnRseSBhdmFpbGFibGU6PC9wPgorCis8dWw+CisKKyAgPGxpPjxhCisgIGhyZWY9Imh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2FudHVuaXQvYmluYXJpZXMvIj5BbnRVbml0CisgIDEuMEJldGEyPC9hPjwvbGk+CisKKzwvdWw+CisKKzwvc2VjdGlvbi0tPgorCis8c2VjdGlvbiBuYW1lPSJNaXJyb3IiPgorCis8cD5Zb3UgYXJlIGN1cnJlbnRseSB1c2luZyA8Yj5bcHJlZmVycmVkXTwvYj4uICBJZiB5b3UgZW5jb3VudGVyIGEKK3Byb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmIGFsbAorbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlIDxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZgordGhlIG1pcnJvcnMgbGlzdCkgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLjwvcD4KKworPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciI+CitPdGhlciBtaXJyb3JzOiA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+CitbaWYtYW55IGh0dHBdCisgIFtmb3IgaHR0cF08b3B0aW9uIHZhbHVlPSJbaHR0cF0iPltodHRwXTwvb3B0aW9uPltlbmRdCitbZW5kXQorW2lmLWFueSBmdHBdCisgIFtmb3IgZnRwXTxvcHRpb24gdmFsdWU9IltmdHBdIj5bZnRwXTwvb3B0aW9uPltlbmRdCitbZW5kXQorW2lmLWFueSBiYWNrdXBdCisgIFtmb3IgYmFja3VwXTxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPltlbmRdCitbZW5kXQorPC9zZWxlY3Q+Cis8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2hhbmdlIiAvPgorPC9mb3JtPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJDdXJyZW50IEFudGxpYiBSZWxlYXNlcyI+CisKKzxkaXYgY2xhc3M9Indhcm5pbmciPgorPGRpdiBjbGFzcz0ibGFiZWwiPk5vdGU8L2Rpdj4KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPlZlcnkgcmVjZW50IHJlbGVhc2VzIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbAorbWlycm9ycyBmb3IgYSBmZXcgZGF5cy48L2Rpdj4KKzwvZGl2PgorPGJyPjwvYnI+Cis8ZGl2IGNsYXNzPSJ3YXJuaW5nIj4KKzxkaXYgY2xhc3M9ImxhYmVsIj5UYXIgZmlsZXMgbWF5IHJlcXVpcmUgZ251IHRhciB0byBleHRyYWN0PC9kaXY+Cis8ZGl2IGNsYXNzPSJjb250ZW50Ij5UYXIgZmlsZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiBjb250YWluIGxvbmcgZmlsZSBuYW1lcywgYW5kIG1heQorIHJlcXVpcmUgZ251IHRhciB0byBkbyB0aGUgZXh0cmFjdGlvbi48L2Rpdj4KKzwvZGl2PgorCis8dWw+Cis8bGk+QXBhY2hlIC5ORVQgQW50IExpYnJhcnkgMS4wCis8dWw+Cis8bGk+PGNvZGU+LnppcDwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzL2RvdG5ldC9iaW5hcmllcy9hcGFjaGUtYW50LWRvdG5ldC0xLjAtYmluLnppcCI+YXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi56aXA8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4uemlwLmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvYmluYXJpZXMvYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi56aXAuc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4uemlwLm1kNSI+TUQ1PC9hPl08L2xpPgorCis8bGk+PGNvZGU+LnRhci5nejwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzL2RvdG5ldC9iaW5hcmllcy9hcGFjaGUtYW50LWRvdG5ldC0xLjAtYmluLnRhci5neiI+YXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3o8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmd6LmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvYmluYXJpZXMvYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3ouc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmd6Lm1kNSI+TUQ1PC9hPl08L2xpPgorCis8bGk+PGNvZGU+LnRhci5iejI8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYW50bGlicy9kb3RuZXQvYmluYXJpZXMvYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuYnoyIj5hcGFjaGUtYW50LWRvdG5ldC0xLjAtYmluLnRhci5iejI8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmJ6Mi5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L2JpbmFyaWVzL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1iaW4udGFyLmJ6Mi5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvYmluYXJpZXMvYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuYnoyLm1kNSI+TUQ1PC9hPl08L2xpPgorPC91bD4KKzwvbGk+CisKKzxsaT5BcGFjaGUgQW50VW5pdCAxLjAKKzx1bD4KKzxsaT48Y29kZT4uemlwPC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi56aXAiPmFwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnppcDwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L2JpbmFyaWVzL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnppcC5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi56aXAuc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi56aXAubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmd6PC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi50YXIuZ3oiPmFwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnRhci5nejwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L2JpbmFyaWVzL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnRhci5nei5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi50YXIuZ3ouc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9iaW5hcmllcy9hcGFjaGUtYW50LWFudHVuaXQtMS4wLWJpbi50YXIuZ3oubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmJ6MjwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzL2FudHVuaXQvYmluYXJpZXMvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1iaW4udGFyLmJ6MiI+YXBhY2hlLWFudC1hbnR1bml0LTEuMC1iaW4udGFyLmJ6MjwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L2JpbmFyaWVzL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnRhci5iejIuYXNjIj5QR1A8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2FudHVuaXQvYmluYXJpZXMvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1iaW4udGFyLmJ6Mi5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L2JpbmFyaWVzL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtYmluLnRhci5iejIubWQ1Ij5NRDU8L2E+XTwvbGk+Cis8L3VsPgorPC9saT4KKzwvdWw+Cis8L3NlY3Rpb24+CisKKzwhLS1zZWN0aW9uIG5hbWU9Ik9sZCBBbnQgUmVsZWFzZXMiPgorCis8cD5PbGRlciByZWxlYXNlcyBvZiBBbnQgY2FuIGJlIGZvdW5kIDxhCitocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50L2JpbmFyaWVzLyI+aGVyZTwvYT4uICBUaG9zZQorcmVsZWFzZXMgYXJlIG9ubHkgcHJvdmlkZWQgYXMgPGNvZGU+emlwPC9jb2RlPiBhcmNoaXZlcyB0aGF0IGNhbiBiZQorZXh0cmFjdGVkIGJ5IDxjb2RlPmphciB4ZiA8L2NvZGU+PGVtPmFyY2hpdmUuemlwPC9lbT4gLSB3ZSBoaWdobHkKK3JlY29tbWVuZCB0byBub3QgdXNlIHRob3NlIHJlbGVhc2VzIGJ1dCB1cGdyYWRlIHRvIEFudCdzIDxhCitocmVmPSJbbG9jYXRpb25dI0N1cnJlbnQgUmVsZWFzZSBvZiBBbnQiPmxhdGVzdDwvYT4gcmVsZWFzZS48L3A+CisKKzwvc2VjdGlvbi0tPgorCis8c2VjdGlvbiBuYW1lPSJWZXJpZnkgUmVsZWFzZXMiPgorCis8cD5JdCBpcyBlc3NlbnRpYWwgdGhhdCB5b3UgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQKK2ZpbGVzIHVzaW5nIHRoZSBQR1Agc2lnbmF0dXJlIG9yIHRoZSBTSEExIG9yIE1ENSBjaGVja3N1bXMuICBUaGUKK2NoZWNrc3VtcyBhcmUgbm90IGFzIHN0cm9uZyBpbmRpY2F0b3JzIGFzIHRoZSBQR1Agc2lnbmF0dXJlLjwvcD4KKworPHA+VGhlIFBHUCBzaWduYXR1cmVzIGNhbiBiZSB2ZXJpZmllZCB1c2luZyBQR1Agb3IgR1BHLiAgRmlyc3QKK2Rvd25sb2FkIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvS0VZUyI+S0VZUzwvYT4KK2FzIHdlbGwgYXMgdGhlIDxjb2RlPmFzYzwvY29kZT4gc2lnbmF0dXJlIGZpbGUgZm9yIHRoZSBwYXJ0aWN1bGFyCitkaXN0cmlidXRpb24uICBNYWtlIHN1cmUgeW91IGdldCB0aGVzZSBmaWxlcyBmcm9tIHRoZSA8YQoraHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvIj5tYWluIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPiwgcmF0aGVyIHRoYW4gZnJvbSBhIG1pcnJvci4gVGhlbiB2ZXJpZnkgdGhlIHNpZ25hdHVyZXMKK3VzaW5nPC9wPgorCis8cD48Y29kZT4KKyUgcGdwayAtYSBLRVlTPGJyIC8+CislIHBncHYgYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3ouYXNjPGJyIC8+Cis8L2NvZGU+Cis8ZW0+b3I8L2VtPjxiciAvPgorPGNvZGU+CislIHBncCAta2EgS0VZUzxiciAvPgorJSBwZ3AgYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3ouYXNjPGJyIC8+Cis8L2NvZGU+Cis8ZW0+b3I8L2VtPjxiciAvPgorPGNvZGU+CislIGdwZyAtLWltcG9ydCBLRVlTPGJyIC8+CislIGdwZyAtLXZlcmlmeSBhcGFjaGUtYW50LWRvdG5ldC0xLjAtYmluLnRhci5nei5hc2MKKzwvY29kZT48L3A+CisKKzxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdmVyaWZ5IHRoZSBjaGVja3N1bXMgb24gdGhlIGZpbGVzLiAgVW5peAorcHJvZ3JhbXMgY2FsbGVkIDxjb2RlPm1kNTwvY29kZT4vPGNvZGU+c2hhMTwvY29kZT4gb3IKKzxjb2RlPm1kNXN1bTwvY29kZT4vPGNvZGU+c2hhMXN1bTwvY29kZT4gYXJlIGluY2x1ZGVkIGluIG1hbnkgdW5peAorZGlzdHJpYnV0aW9ucy4gIDxjb2RlPipzdW08L2NvZGU+IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YgPGEKK2hyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXh0dXRpbHMvdGV4dHV0aWxzLmh0bWwiPkdOVQorVGV4dHV0aWxzPC9hPi4gIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20gPGEKK2hyZWY9Imh0dHA6Ly93d3cuZm91cm1pbGFiLmNoL21kNS8iPmhlcmU8L2E+LCA8YQoraHJlZj0iaHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS8iPmhlcmU8L2E+LiAgPGEKK2hyZWY9Imh0dHA6Ly93d3cuc2xhdmFzb2Z0LmNvbS9mc3VtLyI+ZnN1bTwvYT4gc3VwcG9ydHMgTUQ1IGFuZAorU0hBMS48L3A+CisKKzxwPldlIGhpZ2hseSByZWNvbW1lbmQgdG8gdmVyaWZ5IHRoZSBQR1Agc2lnbmF0dXJlLCB0aG91Z2guPC9wPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9hbnRsaWJzL2NoYXJ0ZXIueG1sIGIvdHJ1bmsveGRvY3MvYW50bGlicy9jaGFydGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2ZhNjkxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsveGRvY3MvYW50bGlicy9jaGFydGVyLnhtbApAQCAtMCwwICsxLDIwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8aW5kZXggdmFsdWU9IjEiLz4KKyAgICA8dGl0bGU+QW50IExpYnJhcmllcyAtIENoYXJ0ZXI8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iQ2hhcnRlciI+CisgICAgCisgICAgICA8cD5CZWxvdyBpcyB0aGUgdGV4dCBvZiB0aGUgcHJvcG9zYWwgdGhhdCBoYXMgYmVlbiBhY2NlcHRlZCBieQorICAgICAgdGhlIEFudCBQTUMuICBGdXJ0aGVyIGFtZW5kbWVudHMgYXJlIGV4cGVjdGVkLjwvcD4KKworICAgICAgPHNvdXJjZT4KK1Byb3Bvc2FsIHRvIENyZWF0ZSBhIEFudC1MaWJyYXJpZXMgU3ViLVByb2plY3QgaW4gQXBhY2hlIEFudAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKygwKSByYXRpb25hbGUKKworQW50IGl0c2VsZiBoYXMgYWNjdW11bGF0ZWQgbG90cyBhbmQgbG90cyBvZiB0YXNrcyBvdmVyIHRpbWUuIFNvIG1hbnksCit0aGF0IEFudCBkZXZlbG9wZXJzIGhhdmUgYmVjb21lIHJlbHVjdGFudCB0byBhZGRpbmcgbmV3Cit0YXNrLiBGdXJ0aGVybW9yZSBhbnkgbmV3IHRhc2sgaW4gQW50IHdvdWxkIGJlIHRpZWQgdG8gQW50J3MgcmVsZWFzZQorc2NoZWR1bGUgd2hpY2ggaXMgdG9vIHNsb3cgZm9yIGEgdGhyaXZpbmcsIGZyZXNoIHBpZWNlIG9mIGNvZGUuCisKK1RoZSBwcm9wb3NhbCBhbGxvd3MgQW50IHRhc2tzIGFuZCB0eXBlcyB0byBiZSBkZXZlbG9wZWQgdW5kZXIgdGhlIEFudAordW1icmVsbGEgYnkgQW50IGRldmVsb3BlcnMgYnV0IGhhdmUgbXVjaCBzaG9ydGVyIHJlbGVhc2UgY3ljbGVzIHRoYW4KK0FudCBpdHNlbGYuIEluIGFkZGl0aW9uIGl0IHdvdWxkIG5ldyBjb21taXR0ZXJzIHdobyB3b3VsZCBoYXZlIGNvbW1pdAorYWNjZXNzIHRvIGEgc2luZ2xlIEFudCBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIHdob2xlIG9mIEFudC4KKworKDEpIHNjb3BlIG9mIHRoZSBzdWJwcm9qZWN0CisKK1RoZSBzdWJwcm9qZWN0IHNoYWxsIGNyZWF0ZSBhbmQgbWFpbnRhaW4gbGlicmFyaWVzIG9mIEFudCB0YXNrcyBhbmQKK3R5cGVzLiBFYWNoIGxpYnJhcnkgd2lsbCBiZSBtYW5hZ2VkIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgQW50Citwcm9qZWN0IGl0c2VsZiwgdGhlIFBNQyBpcyB1bHRpbWF0ZWx5IHJlc3BvbnNpYmxlIGZvciBpdC4KKworQ29tbW9uIEphdmEgbGlicmFyaWVzIHRoYXQgb25seSBoYXBwZW4gdG8gcHJvdmlkZSBBbnQgdGFza3MgYXMgd2VsbAorYXJlIG91dCBvZiBzY29wZSBvZiB0aGUgc3VicHJvamVjdC4gUHJvdmlkaW5nIHRoZSB0YXNrcyBvciB0eXBlcyBoYXMKK3RvIGJlIHRoZSBwcmltYXJ5IGdvYWwgb2YgdGhlIGxpYnJhcnkuCisKK1RvIGZ1cnRoZXIgdGhpcyBnb2FsLCB0aGUgc3VicHJvamVjdCBzaGFsbCBhbHNvIGhvc3QgYSB3b3JrcGxhY2UgZm9yCitBbnQgY29tbWl0dGVycy4KKworKDEuNSkgaW50ZXJhY3Rpb24gd2l0aCBvdGhlciBzdWJwcm9qZWN0cworCisoMS41LjEpIHRoZSBzYW5kYm94CisKK1RoZSBzdWJwcm9qZWN0IHdpbGwgaG9zdCBhIFNWTiByZXBvc2l0b3J5IGF2YWlsYWJsZSB0byBhbGwgQW50Citjb21taXR0ZXJzIGFzIGEgd29ya3BsYWNlIGZvciBuZXcgQW50IGxpYnJhcmllcy4KKworQmVmb3JlIGEgbGlicmFyeSBjYW4gaGF2ZSBhIHB1YmxpYyByZWxlYXNlIGl0IGhhcyB0byBnZXQgcHJvbW90ZWQgdG8KK3RoZSAicHJvcGVyIiBBbnQgbGlicmFyaWVzIHN1YnByb2plY3QuIFRoaXMgYWxzbyBtZWFucyBpdCBoYXMgdG8gbWF0Y2gKK3RoZSByZXF1aXJlbWVudHMgb2YgYW4gQW50IGxpYnJhcnkgYXMgZGVmaW5lZCBpbiBzZWN0aW9uICg0KSB1bmRlcgorR3VpZGVsaW5lcyBiZWxvdy4KKworVGhlIHN0YXR1cyBvZiBhbnkgbGlicmFyeSBkZXZlbG9wZWQgaW4gdGhlIHNhbmRib3ggc2hhbGwgYmUgcmV2aWV3ZWQKK2FmdGVyIHNpeCBtb250aHMgYW5kIHRoZSBsaWJyYXJ5IGdldHMgZWl0aGVyIHByb21vdGVkIG9yIHJlbW92ZWQgLSBvcgoraXQgaGFzIHRvIGJlIHJlLWV2YWx1YXRlZCBhZnRlciBhbm90aGVyIHNpeCBtb250aHMuCisKKygyKSBpZGVudGlmeSB0aGUgaW5pdGlhbCBzb3VyY2UgZnJvbSB3aGljaCB0aGUgc3VicHJvamVjdCBpcyB0byBiZSBwb3B1bGF0ZWQKKworU29tZSBBbnQgY29tbWl0dGVycyBoYXZlIGRldmVsb3BlZCB0YXNrcyBvciBsaWJyYXJpZXMgaW5zaWRlIG9mIHRoZQorQW50IENWUyBtb2R1bGUgdW5kZXIgdGhlIHByb3Bvc2FsL3NhbmRib3ggZGlyZWN0b3J5LiBDb21taXR0ZXJzIGFyZQorZnJlZSB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGUgbmV3IHNhbmRib3ggc3VicHJvamVjdCBvciByZW1vdmUgdGhlbQorY29tcGxldGVseS4KKworTGlicmFyaWVzIGV4cGVjdGVkIHRvIG1vdmUgdG8gdGhlIHNhbmRib3ggc3VicHJvamVjdCBpbml0aWFsbHkgYXJlCisKKyogdGhlIC5ORVQgdGFza3MgdW5kZXIgcHJvcG9zYWwvc2FuZGJveC9kb3RuZXQKKworKiB0aGUgU3VidmVyc2lvbiBzdXBwb3J0IHRhc2tzIHVuZGVyIHByb3Bvc2FsL3NhbmRib3gvc3ZuCisKKygzKSBpZGVudGlmeSB0aGUgaW5pdGlhbCBBcGFjaGUgcmVzb3VyY2VzIHRvIGJlIGNyZWF0ZWQKKworKDMuMSkgbWFpbGluZyBsaXN0KHMpCisKK05vbmUuIEF0IGxlYXN0IGF0IHRoZSBiZWdpbm5pbmcgd2UgZG9uJ3QgZXhwZWN0IHRvbyBtdWNoIHRyYWZmaWMgYW5kCit0aGUgZXhpc3RpbmcgbWFpbGluZyBsaXN0cyBvZiB0aGUgQW50IHByb2plY3RzIHdpbGwgYmUgdXNlZC4KKworKDMuMikgU1ZOIHJlcG9zaXRvcmllcworCitDcmVhdGUgJmx0O2h0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50Lz4KKworRXhwZWN0ZWQgYXJlIHN1Yi1kaXJlY3RvcmllcworCithbnRsaWJzLworICAgfAorICAgLS0tLS0+IHByb3Blci8KKyAgIHwgICAgICAgIHwKKyAgIHwgICAgICAgIC0tLS0tPiBsaWJyYXJ5MQorICAgfCAgICAgICAgfCAgICAgICAgfAorICAgfCAgICAgICAgfCAgICAgICAgLS0tLS0tLS0tLS0+IHRydW5rCisgICB8ICAgICAgICB8ICAgICAgICAtLS0tLS0tLS0tLT4gdGFncworICAgfCAgICAgICAgfCAgICAgICAgLS0tLS0tLS0tLS0+IGJyYW5jaGVzCisgICB8ICAgICAgICAtLS0tLT4gbGlicmFyeTIKKyAgIHwgICAgICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tPiB0cnVuaworICAgfCAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0+IHRhZ3MKKyAgIHwgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tPiBicmFuY2hlcworICAgfAorICAgLS0tLS0+IHNhbmRib3gvCisgICAgICAgICAgICB8CisgICAgICAgICAgICAtLS0tLT4gbGlicmFyeTEKKyAgICAgICAgICAgIHwgICAgICAgIHwKKyAgICAgICAgICAgIHwgICAgICAgIC0tLS0tLS0tLS0tPiB0cnVuaworICAgICAgICAgICAgfCAgICAgICAgLS0tLS0tLS0tLS0+IHRhZ3MKKyAgICAgICAgICAgIHwgICAgICAgIC0tLS0tLS0tLS0tPiBicmFuY2hlcworICAgICAgICAgICAgLS0tLS0+IGxpYnJhcnkyCisgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLT4gdHJ1bmsKKyAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tPiB0YWdzCisgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLT4gYnJhbmNoZXMKKworQW5kIHBvdGVudGlhbGx5IGNvbGxlY3Rpb25zIG9mIGFsbC10cnVua3MgdXNpbmcgc3ZuOmV4dGVybmFsIGFzIHNob3duCitieSB0aGUgY3VycmVudCBKYWthcnRhIENvbW1vbnMgc3RydWN0dXJlLgorCisoMy4zKSBCdWd6aWxsYQorCitOZXcgY29tcG9uZW50cyB1bmRlciBwcm9kdWN0ICJBbnQiIGZvciBlYWNoIG5ldyBsaWJyYXJ5LgorCisoNCkgaWRlbnRpZnkgdGhlIGluaXRpYWwgc2V0IG9mIGNvbW1pdHRlcnMKKworQWxsIGN1cnJlbnQgQW50IFBNQyBtZW1iZXJzIHBsdXMgdGhlIGFjdGl2ZSBBbnQgY29tbWl0dGVycyB3aG8gYXJlIG5vdAorUE1DIG1lbWJlcnMgeWV0LgorCitHdWlkZWxpbmVzCistLS0tLS0tLS0tCisKK05vdGU6CisKKyogaXMsIGhhcywgd2lsbCwgc2hhbGwsIG11c3QgLSByZXF1aXJlZC4KKworKiBtYXksIHNob3VsZCwgYXJlIGVuY291cmFnZWQgLSBvcHRpb25hbCBidXQgcmVjb21tZW5kZWQuCisKKygxKSBUaGUgcHJpbWFyeSB1bml0IG9mIHJldXNlIGFuZCByZWxlYXNlIGlzIHRoZSBBbnQgbGlicmFyeS4KKworKDIpIFRoZSBsaWJyYXJ5IGlzIG5vdCBhIGZyYW1ld29yayBvciBhIGdlbmVyYWwgbGlicmFyeSBidXQgYQorICAgIGNvbGxlY3Rpb24gb2YgQW50IHRhc2tzIGFuZCB0eXBlcy4KKworKDMpIEVhY2ggbGlicmFyeSBtdXN0IGhhdmUgYSBjbGVhcmx5IGRlZmluZWQgcHVycG9zZSwgc2NvcGUsIGFuZCBBUEkuCisKKyg0KSBFYWNoIGxpYnJhcnkgaXMgdHJlYXRlZCBhcyBhIHByb2R1Y3QgaW4gaXRzIG93biByaWdodC4KKworKDQuMSkgRWFjaCBsaWJyYXJ5IGhhcyBpdHMgb3duIHN0YXR1cyBmaWxlLCByZWxlYXNlIHNjaGVkdWxlLCB2ZXJzaW9uCisgICAgICBudW1iZXIsIFFBIHRlc3RzLCBkb2N1bWVudGF0aW9uLCBidWcgY2F0ZWdvcnksIGFuZCBpbmRpdmlkdWFsCisgICAgICBKQVIuCisKKyg0LjIpIEVhY2ggbGlicmFyeSBtdXN0IGNsZWFybHkgc3BlY2lmeSBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLAorICAgICAgaW5jbHVkaW5nIGFueSBvdGhlciBsaWJyYXJpZXMsIGFuZCB0aGUgZWFybGllc3QgSkRLIHZlcnNpb24KKyAgICAgIHJlcXVpcmVkLgorCisoNC4zKSBFYWNoIGxpYnJhcnkgbXVzdCBtYWludGFpbiBhIGxpc3Qgb2YgaXRzIGFjdGl2ZSBjb21taXR0ZXJzIGluCisgICAgICBpdHMgc3RhdHVzIGZpbGUuCisKKyg0LjQpIFRoZSBsaWJyYXJpZXMgc2hvdWxkIHVzZSBhIHN0YW5kYXJkIHNjaGVtZSBmb3IgdmVyc2lvbmluZywgUUEKKyAgICAgIHRlc3RzLCBhbmQgZGlyZWN0b3J5IGxheW91dHMsIGFuZCBhIGNvbW1vbiBmb3JtYXQgZm9yCisgICAgICBkb2N1bWVudGF0aW9uIGFuZCBBbnQgYnVpbGQgZmlsZXMuCisKKyg0LjQpIEVhY2ggbGlicmFyeSB3aWxsIGJlIGhvc3RlZCBvbiBpdHMgb3duIHBhZ2Ugb24gdGhlIHN1YnByb2plY3QKKyAgICAgIFdlYiBzaXRlLCBhbmQgd2lsbCBhbHNvIGJlIGluZGV4ZWQgaW4gYSBtYXN0ZXIgZGlyZWN0b3J5LgorCisoNC41KSBWb2x1bnRlZXJzIGJlY29tZSBjb21taXR0ZXJzIHRvIHRoaXMgc3VicHJvamVjdCBpbiB0aGUgc2FtZSB3YXkKKyAgICAgIHRoZXkgYXJlIGVudGVyZWQgdG8gYW55IEFwYWNoZSBzdWJwcm9qZWN0LgorCisgICAgICBPbmNlIHRoZSByZXF1aXJlZCBpbmZyYXN0cnVjdHVyZSBpcyBpbiBwbGFjZSwgdm9sdW50ZWVycyBtYXkKKyAgICAgIGJlY29tZSBjb21taXR0ZXJzIGZvciBhIHNpbmdsZSBBbnQgbGlicmFyeSBvbmx5LgorCisoNC42KSBOZXcgbGlicmFyaWVzIG1heSBiZSBwcm9wb3NlZCB0byB0aGUgQW50IGRldiBtYWlsaW5nIGxpc3QuIFRvIGJlCisgICAgICBhY2NlcHRlZCwgYSBsaWJyYXJ5IHByb3Bvc2FsIG11c3QgcmVjZWl2ZSBtYWpvcml0eSBhcHByb3ZhbCBvZgorICAgICAgdGhlIEFudCBQTUMuIFByb3Bvc2FscyBhcmUgdG8gaWRlbnRpZnkgdGhlIHJhdGlvbmFsZSBmb3IgdGhlCisgICAgICBsaWJyYXJ5LCBpdHMgc2NvcGUsIHRoZSBpbml0aWFsIHNvdXJjZSBmcm9tIHdoaWNoIHRoZSBsaWJyYXJ5IGlzCisgICAgICB0byBiZSBjcmVhdGVkLCBhbmQgdGhlIGluaXRpYWwgc2V0IG9mIGNvbW1pdHRlcnMuCisKKyg0LjcpIEFzIHN0YXRlZCBpbiB0aGUgQW50IGd1aWRlbGluZXMsIGFuIGFjdGlvbiByZXF1aXJpbmcgbWFqb3JpdHkKKyAgICAgIGFwcHJvdmFsIG11c3QgcmVjZWl2ZSBhdCBsZWFzdCAzIGJpbmRpbmcgKzEgdm90ZXMgYW5kIG1vcmUgKzEKKyAgICAgIHZvdGVzIHRoYW4gLTEgdm90ZXMuCisKKyg0LjgpIEVhY2ggQW50IGxpYnJhcnkgbmVlZHMgYXQgbGVhc3QgdGhyZWUgY29tbWl0dGVycywgYXQgbGVhc3Qgb25lCisgICAgICBvZiB0aGVtIGhhcyB0byBiZSBhbiBBbnQgUE1DIG1lbWJlci4KKyAgICAgIDwvc291cmNlPgorCisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3MvYW50bGlicy9kb3RuZXQvaW5kZXgueG1sIGIvdHJ1bmsveGRvY3MvYW50bGlicy9kb3RuZXQvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjZTc5NGIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9hbnRsaWJzL2RvdG5ldC9pbmRleC54bWwKQEAgLTAsMCArMSwxNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxpbmRleCB2YWx1ZT0iMSIvPgorICAgIDx0aXRsZT4uTkVUIEFudCBMaWJyYXJ5PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxib2R5PgorCisgICAgPHNlY3Rpb24gbmFtZT0iLk5FVCBBbnQgTGlicmFyeSAxLjAiPgorICAgICAgPGgzPk5vdmVtYmVyIDYsIDIwMDYgLSBBcGFjaGUgLk5FVCBBbnQgTGlicmFyeSAxLjAKKyAgICAgIEF2YWlsYWJsZTwvaDM+CisKKyAgICAgIDxwPkFwYWNoZSAuTkVUIEFudCBMaWJyYXJ5IDEuMCBpcyBub3cgYXZhaWxhYmxlIGZvcgorICAgICAgZG93bmxvYWQgYXMgPGEKKyAgICAgIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaSI+YmluYXJ5PC9hPgorICAgICAgb3IgPGEKKyAgICAgIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3NyY2Rvd25sb2FkLmNnaSI+c291cmNlPC9hPgorICAgICAgcmVsZWFzZS48L3A+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gbmFtZT0iSWRlYSI+CisKKyAgICAgIDxwPlRoaXMgbGlicmFyeSBkb2Vzbid0IHN0cml2ZSB0byByZXBsYWNlIE5BbnQgb3IgTVNCdWlsZCwgaXRzCisgICAgICBtYWluIHB1cnBvc2UgaXMgdG8gaGVscCB0aG9zZSBvZiB1cyB3aG8gd29yayBvbiBwcm9qZWN0cworICAgICAgY3Jvc3NpbmcgcGxhdGZvcm0gYm91bmRhcmllcy4gIFdpdGggdGhpcyBsaWJyYXJ5IHlvdSBjYW4gdXNlIEFudAorICAgICAgdG8gYnVpbGQgYW5kIHRlc3QgdGhlIEphdmEgYXMgd2VsbCBhcyB0aGUgLk5FVCBwYXJ0cyBvZiB5b3VyCisgICAgICBwcm9qZWN0LjwvcD4KKworICAgICAgPHA+VGhpcyBsaWJyYXJ5IHByb3ZpZGVzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZQorICAgICAgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrIHRhaWxvcmVkIHRvIHJ1biAuTkVUIGV4ZWN1dGFibGVzLgorICAgICAgT24gV2luZG93cyBpdCB3aWxsIGFzc3VtZSB0aGUgTWljcm9zb2Z0IGZyYW1ld29yayBpcyBhcm91bmQgYW5kCisgICAgICBydW4gdGhlIGV4ZWN1dGFibGUgZGlyZWN0bHksIHdoaWxlIGl0IHdpbGwgaW52b2tlIE1vbm8gb24gYW55CisgICAgICBvdGhlciBwbGF0Zm9ybS4gIE9mIGNvdXJzZSB5b3UgY2FuIG92ZXJyaWRlIHRoZXNlCisgICAgICBhc3N1bXB0aW9ucy48L3A+CisKKyAgICAgIDxwPkJhc2VkIG9uIHRoaXMgYSBmZXcgdGFza3MgdG8gcnVuIHdlbGwga25vd24gLk5FVCB1dGlsaXRpZXMKKyAgICAgIGZyb20gd2l0aGluIEFudCBhcmUgcHJvdmlkZWQsIG5hbWVseSB0YXNrcyB0byBydW4gPGEKKyAgICAgIGhyZWY9Imh0dHA6Ly93d3cubnVuaXQub3JnLyI+TlVuaXQ8L2E+LCA8YQorICAgICAgaHJlZj0iaHR0cDovL25hbnQuc2YubmV0LyI+TkFudDwvYT4sIDxhCisgICAgICBocmVmPSJodHRwOi8vZm9ydW1zLm1pY3Jvc29mdC5jb20vTVNETi9TaG93Rm9ydW0uYXNweD9Gb3J1bUlEPTI3JmFtcDtTaXRlSUQ9MSI+TVNCdWlsZDwvYT4KKyAgICAgIGFuZCB0aGUgPGEgaHJlZj0iaHR0cDovL3dpeC5zZi5uZXQvIj5XaXg8L2E+IHRvb2xraXQuPC9wPgorCisgICAgICA8cD5UaGUgaW5pdGlhbCAuTkVUIHRhc2tzIG9mIEFudCAoY29tcGlsZXIgdGFza3MgZm9yIEMjLCBKIyBhbmQgVkIuTkVUCisgICAgICBmb3IgZXhhbXBsZSkgaGF2ZSBhbHNvIGJlZW4gbW92ZWQgdG8gdGhpcyBBbnRsaWIgYW5kIHdpbGwgc2VlIGZ1cnRoZXIKKyAgICAgIGRldmVsb3BtZW50IGhlcmUuPC9wPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IlRhc2tzIj4KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9ImRvdG5ldGV4ZWMiPgorICAgICAgICA8cD5SdW5zIGEgLk5FVCBleGVjdXRhYmxlLjwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0ibnVuaXQiPgorICAgICAgICA8cD5SdW5zIE5Vbml0IHRlc3RzLjwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0ibmFudCI+CisgICAgICAgIDxwPkludm9rZXMgTkFudCwgZWl0aGVyIG9uIGFuIGV4dGVybmFsIGZpbGUgb3IgYSBidWlsZCBmaWxlCisgICAgICAgIHNuaXBwZXQgY29udGFpbmVkIGluc2lkZSB5b3VyIEFudCBidWlsZCBmaWxlLjwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0ibXNidWlsZCI+CisgICAgICAgIDxwPkludm9rZXMgTVNCdWlsZCwgZWl0aGVyIG9uIGFuIGV4dGVybmFsIGZpbGUgb3IgYSBidWlsZCBmaWxlCisgICAgICAgIHNuaXBwZXQgY29udGFpbmVkIGluc2lkZSB5b3VyIEFudCBidWlsZCBmaWxlLjwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0id2l4Ij4KKyAgICAgICAgPHA+SW52b2tlcyB0aGUgY2FuZGxlIGFuZCBsaWdodCBleGVjdXRhYmxlcyBvZiB0aGUgV2lYIHRvb2xraXQKKyAgICAgICAgICBpbiBvcmRlciB0byBjcmVhdGUgTVNJIGluc3RhbGxlcnMgZnJvbSB3aXRoaW4gQW50LjwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJFeGFtcGxlcyI+CisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJuYW50Ij4KKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKzxwcm9qZWN0IHhtbG5zOmRuPSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuZG90bmV0Ij4KKyAgPGRuOm5hbnQ+CisgICAgPGJ1aWxkPgorICAgICAgPGVjaG8gbWVzc2FnZT0iSGVsbG8gd29ybGQiLz4KKyAgICA8L2J1aWxkPgorICA8L2RuOm5hbnQ+Cis8L3Byb2plY3Q+CitdXT48L3NvdXJjZT4KKworICAgICAgICA8cD5ydW5zIE5BbnQgb24gdGhlIGVtYmVkZGVkIDxjb2RlPiZsdDtlY2hvJmd0OzwvY29kZT4KKyAgICAgICAgdGFzaywgb3V0cHV0IGxvb2tzIGxpa2U8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKK0J1aWxkZmlsZTogdGVzdC54bWwKK1tkbjpuYW50XSBOQW50IDAuODUgKEJ1aWxkIDAuODUuMTkzMi4wOyByYzM7IDE2LjA0LjIwMDUpCitbZG46bmFudF0gQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgR2VycnkgU2hhdworW2RuOm5hbnRdIGh0dHA6Ly9uYW50LnNvdXJjZWZvcmdlLm5ldAorW2RuOm5hbnRdIAorW2RuOm5hbnRdIEJ1aWxkZmlsZTogZmlsZTovLy9jOi9ET0tVTUV+MS9TVEVGQU5+MS5CT0QvTE9LQUxFfjEvVGVtcC9idWlsZDEwNTg0NTE1NTUueG1sCitbZG46bmFudF0gVGFyZ2V0IGZyYW1ld29yazogTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDEuMQorW2RuOm5hbnRdIAorW2RuOm5hbnRdICAgICAgW2VjaG9dIEhlbGxvIHdvcmxkCitbZG46bmFudF0gCitbZG46bmFudF0gQlVJTEQgU1VDQ0VFREVECitbZG46bmFudF0gCitbZG46bmFudF0gVG90YWwgdGltZTogMC4yIHNlY29uZHMuCisKK0JVSUxEIFNVQ0NFU1NGVUwKK1RvdGFsIHRpbWU6IDIgc2Vjb25kc11dPjwvc291cmNlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJtc2J1aWxkIj4KKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKzxwcm9qZWN0IHhtbG5zOmRuPSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuZG90bmV0Ij4KKyAgPGRuOm1zYnVpbGQ+CisgICAgPGJ1aWxkPgorICAgICAgPE1lc3NhZ2UgVGV4dD0iSGVsbG8gd29ybGQiCisgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiLz4KKyAgICA8L2J1aWxkPgorICA8L2RuOm1zYnVpbGQ+Cis8L3Byb2plY3Q+XV0+PC9zb3VyY2U+CisKKyAgICAgICAgPHA+cnVucyBNU0J1aWxkIG9uIHRoZSBlbWJlZGRlZCA8Y29kZT4mbHQ7TWVzc2FnZSZndDs8L2NvZGU+CisgICAgICAgIHRhc2ssIG91dHB1dCBsb29rcyBsaWtlPC9wPgorCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCitCdWlsZGZpbGU6IHRlc3QueG1sCitbZG46bXNidWlsZF0gTWljcm9zb2Z0IChSKSBCdWlsZCBFbmdpbmUgVmVyc2lvbiAyLjAuNTA3MjcuNDIKK1tkbjptc2J1aWxkXSBbTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrLCBWZXJzaW9uIDIuMC41MDcyNy40Ml0KK1tkbjptc2J1aWxkXSBDb3B5cmlnaHQgKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiAyMDA1LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitbZG46bXNidWlsZF0gQnVpbGQgc3RhcnRlZCAxNS4xMi4yMDA1IDIwOjIxOjU2LgorW2RuOm1zYnVpbGRdIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitbZG46bXNidWlsZF0gUHJvamVjdCAiYzpcRG9rdW1lbnRlIHVuZCBFaW5zdGVsbHVuZ2VuXHN0ZWZhbi5ib2Rld2lnXExva2FsZSBFaW5zdGVsbHVuZ2VuXFRlbXBcYnVpbGQxNTQzMzEwMTg1LnhtbCIgKGRlZmF1bHQgdGFyZ2V0cyk6CisKK1tkbjptc2J1aWxkXSBUYXJnZXQgZ2VuZXJhdGVkLWJ5LWFudDoKK1tkbjptc2J1aWxkXSAgICAgSGVsbG8gd29ybGQKKworW2RuOm1zYnVpbGRdIEJ1aWxkIHN1Y2NlZWRlZC4KK1tkbjptc2J1aWxkXSAgICAgMCBXYXJuaW5nKHMpCitbZG46bXNidWlsZF0gICAgIDAgRXJyb3IocykKKworW2RuOm1zYnVpbGRdIFRpbWUgRWxhcHNlZCAwMDowMDowMC4xMAorCitCVUlMRCBTVUNDRVNTRlVMCitUb3RhbCB0aW1lOiAwIHNlY29uZHMKK11dPjwvc291cmNlPgorCisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3MvYW50bGlicy9pbmRleC54bWwgYi90cnVuay94ZG9jcy9hbnRsaWJzL2luZGV4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2ViOWZlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsveGRvY3MvYW50bGlicy9pbmRleC54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGluZGV4IHZhbHVlPSIxIi8+CisgICAgPHRpdGxlPlRoZSBBbnQgTGlicmFyaWVzIFN1YnByb2plY3Q8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJUaGUgQW50IExpYnJhcmllcyBTdWJwcm9qZWN0Ij4KKyAgICAgIDxoMz5BbnQgTGlicmFyaWVzIC0gb3IgQW50bGlicyBmb3Igc2hvcnQ8L2gzPgorCisgICAgICA8cD5XaXRoIEFudCAxLjYuMCBhbmQgdGhlIGFudCBsaWJyYXJpZXMgY29uY2VwdCBjcmVhdGluZworICAgICAgbGlicmFyaWVzIG9mIEFudCB0YXNrcyB0aGF0IGFyZSBlYXN5IHRvIGdldCBkcm9wcGVkIGludG8gYW4KKyAgICAgIGV4aXN0aW5nIEFudCBpbnN0YWxsYXRpb24gaGFzIGJlY29tZSBmYXIgZWFzaWVyLjwvcD4KKworICAgICAgPHA+VGhlIEFudCBMaWJyYXJpZXMgc3VicHJvamVjdCB3YXMgc3RhcnRlZCBhcyBhIHBsYWNlIHRvCisgICAgICBkZXZlbG9wIHNtYWxsIGxpYnJhcmllcyBvZiB0YXNrcyB0aGF0IGNhbiBnZXQgcmVsZWFzZWQKKyAgICAgIGluZGVwZW5kZW50IG9mIEFudCdzIHJlbGVhc2Ugc2NoZWR1bGUgLSB3aGljaCBpcyBuZWNlc3NhcnkgZm9yCisgICAgICBuYXNjZW50IEFudCB0YXNrcyBzaW5jZSBBbnQncyBvd24gcmVsZWFzZSBzY2hlZHVsZSBoYXMgYmVjb21lCisgICAgICByYXRoZXIgc2xvdyBvdmVyIHRpbWUuPC9wPgorCisgICAgICA8cD5UaGUgc3VicHJvamVjdCBhbHNvIG9mZmVycyBhIHNhbmRib3ggYXMgcGxheWdyb3VuZCBmb3IgQW50CisgICAgICBjb21taXR0ZXJzIHRvIHRyeSBuZXcgaWRlYXMgZm9yIHRhc2tzLjwvcD4KKworICAgIDwvc2VjdGlvbj4KKworICA8L2JvZHk+Cis8L2RvY3VtZW50PgorCmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9hbnRsaWJzL3Byb3Blci54bWwgYi90cnVuay94ZG9jcy9hbnRsaWJzL3Byb3Blci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjZWFjNwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL2FudGxpYnMvcHJvcGVyLnhtbApAQCAtMCwwICsxLDE1NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGluZGV4IHZhbHVlPSIxIi8+CisgICAgPHRpdGxlPkFudCBMaWJyYXJpZXM8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJBbnQgTGlicmFyaWVzIj4KKworICAgICAgPGEgbmFtZT0iYW50dW5pdCIvPgorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50VW5pdCAtIFVuaXQgVGVzdCBGcmFtZXdvcmsgZm9yIEFudCBUYXNrcyI+CisKKyAgICAgICAgPHA+QW50VW5pdCBib3Jyb3dzIGlkZWFzIGZyb20gSlVuaXQgMy54IGFuZCB0aGUgJmx0O2p1bml0Jmd0OworICAgICAgICB0YXNrLiAgSXQgcHJvdmlkZXMgYSB0YXNrIHRoYXQgcnVucyBidWlsZCBmaWxlcyBhcyB1bml0IHRlc3RzCisgICAgICAgIGFzIHdlbGwgYXMgYSBudW1iZXIgb2YgYXNzZXJ0aW9uIHRhc2tzIHRvIHN1cHBvcnQgdGhlCisgICAgICAgIGlkZWEuPC9wPgorCisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+SG9tZXBhZ2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSIuL2FudHVuaXQvaW5kZXguaHRtbCI+aHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYW50dW5pdC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TVk4gVVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2FudGxpYnMvYW50dW5pdC90cnVuay8iPmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9hbnRsaWJzL2FudHVuaXQvdHJ1bmsvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Vmlld1NWTjo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvYW50bGlicy9hbnR1bml0L3RydW5rLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9hbnRsaWJzL2FudHVuaXQvdHJ1bmsvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QW50IGNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS43Lng8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkFkZGVkIHRvIHNhbmRib3g6PC90aD4KKyAgICAgICAgICAgIDx0ZD4yMDA1LTA0LTE1PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Qcm9tb3RlZCBmcm9tIHNhbmRib3g6PC90aD4KKyAgICAgICAgICAgIDx0ZD4yMDA1LTExLTIyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MYXRlc3QgUmVsZWFzZTo8L3RoPgorICAgICAgICAgICAgPHRkPjEuMCByZWxlYXNlZCBvbiBKYW51YXJ5IDgsIDIwMDc8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxhIG5hbWU9ImRvdG5ldCIvPgorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iRG90TmV0IC0gSW1wcm92ZWQgU3VwcG9ydCBmb3IgLk5FVCBwcm9qZWN0cyI+CisKKyAgICAgICAgPHA+UHJvdmlkZXMgYSBzaW1wbGUgaW5mcmFzdHJ1Y3R1cmUgdG8gZXhlY3V0ZSAuTkVUCisgICAgICAgIGFwcGxpY2F0aW9ucyBmcm9tIHdpdGhpbiBBbnQgZm9yIGRpZmZlcmVudCBWTXMgc28gdGhhdCB0aGUKKyAgICAgICAgdXNlciBkb2Vzbid0IGhhdmUgdG8gY2hhbmdlIHRoZSBidWlsZCBmaWxlIHdoZW4gc2hlIHdhbnRzIHRvCisgICAgICAgIHJ1biBNb25vIG9uIExpbnV4IGFuZCBNaWNyb3NvZnQncyBWTSBvbiBXaW5kb3dzLjwvcD4KKworICAgICAgICA8cD5BbHNvIGNvbnRhaW5zICZsdDtuYW50Jmd0OywgJmx0O251bml0Jmd0OyBhbmQKKyAgICAgICAgJmx0O21zYnVpbGQmZ3Q7IHRhc2tzIGFuZCBhbiB1bnRlc3RlZCAmbHQ7d2l4Jmd0OyB0YXNrcy48L3A+CisKKyAgICAgICAgPHRhYmxlPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Ib21lcGFnZTo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Ii4vZG90bmV0L2luZGV4Lmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2RvdG5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TVk4gVVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2FudGxpYnMvZG90bmV0L3RydW5rLyI+aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2FudGxpYnMvZG90bmV0L3RydW5rLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlZpZXdTVk46PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L2FudGxpYnMvZG90bmV0L3RydW5rLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9hbnRsaWJzL2RvdG5ldC90cnVuay88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BbnQgY29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjcueDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QWRkZWQgdG8gc2FuZGJveDo8L3RoPgorICAgICAgICAgICAgPHRkPjIwMDUtMDQtMTU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlByb21vdGVkIGZyb20gc2FuZGJveDo8L3RoPgorICAgICAgICAgICAgPHRkPjIwMDUtMTEtMjI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxhdGVzdCBSZWxlYXNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+MS4wIHJlbGVhc2VkIG9uIE5vdmVtYmVyIDYsIDIwMDY8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxhIG5hbWU9InN2biIvPgorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iU1ZOIC0gU3VidmVyc2lvbiBTdXBwb3J0Ij4KKworICAgICAgICA8cD5Db250YWlucyB0YXNrcyB0aGF0IGNvcnJlc3BvbmQgdG8gQW50J3MgJmx0O2N2cyZndDssCisgICAgICAgICZsdDtjdnNjaGFuZ2Vsb2cmZ3Q7IGFuZCAmbHQ7Y3ZzdGFnZGlmZiZndDsgdGFza3MuICBSZXF1aXJlcworICAgICAgICBTdWJ2ZXJzaW9uJ3MgY29tbWFuZCBsaW5lIGNsaWVudC48L3A+CisKKyAgICAgICAgPHRhYmxlPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Ib21lcGFnZTo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Ii4vc3ZuL2luZGV4Lmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3N2bi88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TVk4gVVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2FudGxpYnMvc3ZuL3RydW5rLyI+aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2FudGxpYnMvc3ZuL3RydW5rLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlZpZXdTVk46PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L2FudGxpYnMvc3ZuL3RydW5rLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9hbnRsaWJzL3N2bi90cnVuay88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BbnQgY29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjcueDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QWRkZWQgdG8gc2FuZGJveDo8L3RoPgorICAgICAgICAgICAgPHRkPjIwMDUtMDQtMTU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlByb21vdGVkIGZyb20gc2FuZGJveDo8L3RoPgorICAgICAgICAgICAgPHRkPjIwMDUtMTEtMjI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxhdGVzdCBSZWxlYXNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+Tm9uZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgIDwvc2VjdGlvbj4KKworICA8L2JvZHk+Cis8L2RvY3VtZW50PgorCmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9hbnRsaWJzL3NhbmRib3gueG1sIGIvdHJ1bmsveGRvY3MvYW50bGlicy9zYW5kYm94LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQyNGJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsveGRvY3MvYW50bGlicy9zYW5kYm94LnhtbApAQCAtMCwwICsxLDI1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8aW5kZXggdmFsdWU9IjEiLz4KKyAgICA8dGl0bGU+QW50IExpYnJhcmllcyAtIFRoZSBTYW5kYm94PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxib2R5PgorCisgICAgPHNlY3Rpb24gbmFtZT0iQW50IExpYnJhcmllcyAtIFRoZSBTYW5kYm94Ij4KKworICAgICAgPHA+VGhlIHNhbmRib3ggaXMgdGhlIHBsYWNlIHdoZXJlIG5ldyBBbnQgTGlicmFyaWVzIHN0YXJ0IHRoZWlyCisgICAgICBsaWZlLCBpdCBpcyBhIHBsYXlncm91bmQgZm9yIEFudCBjb21taXR0ZXJzIGFuZCBvdGhlcgorICAgICAgY29udHJpYnV0b3JzIHdobyBmaW5kIGNvbW1pdHRlcnMgdG8gc3BvbnNvciB0aGVpciBpZGVhcy48L3A+CisKKyAgICAgIDxwPlRoZSBzYW5kYm94IGlzIG5vIGR1bXBpbmcgZ3JvdW5kLiAgSWYgYSBTYW5kYm94IEFudCBMaWJyYXJ5CisgICAgICBmYWlscyB0byBhdHRyYWN0IGludGVyZXN0IHdpdGhpbiBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUsIGl0CisgICAgICBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgc2FuZGJveC48L3A+CisKKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJDdXJyZW50IFNhbmRib3ggQW50IExpYnJhcmllcyI+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkRlYmlhbiAtIERlYmlhbiByZWxhdGVkIHRhc2tzIj4KKworICAgICAgICA8cD5EZWJpYW4gcHJvdmlkZXMgdGFza3MgZm9yIGdlbmVyYXRpbmcgRGViaWFuIHBhY2thZ2VzLjwvcD4KKworICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlNWTiBVUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC9hbnRsaWJzL2RlYmlhbi90cnVuay8iPmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvZGViaWFuL3RydW5rLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlZpZXdTVk46PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L3NhbmRib3gvYW50bGlicy9kZWJpYW4vdHJ1bmsvIj5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L3NhbmRib3gvYW50bGlicy9kZWJpYW4vdHJ1bmsvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QW50IGNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS43Lng8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkFkZGVkIHRvIHNhbmRib3g6PC90aD4KKyAgICAgICAgICAgIDx0ZD4yMDA3LTA1LTE4PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TcG9uc29yaW5nIENvbW1pdHRlcnM8L3RoPgorICAgICAgICAgICAgPHRkPktldmluIEphY2tzb248L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuRG9jIC0gR2VuZXJhdGUgdGhlIG1hbnVhbCBmb3IgQW50IFRhc2tzIGZyb20gdGhlaXIgc291cmNlcyI+CisKKyAgICAgICAgPHA+TW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGZvciB3cml0aW5nIHRoZSBtYW51YWwgaXMgaW5zaWRlIHRoZSBzb3VyY2VzOiBhdHRyaWJ1dGVzLCBuZXN0ZWQgZWxlbWVudHMgKGVzcGVjaWFsbHkKKyAgICAgICAgaW5oZXJpdGVkIG9uZSkuIEdlbkRvYyBjb2xsZWN0cyB0aGVzZSBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhdGVzIHRoZSBtYW51YWwgYXMgeG1sIHBhZ2UuIEZvbGxvd2luZyBzdGVwcyB0cmFuc2Zvcm0gdGhpcworICAgICAgICB4bWwgaW50byB0aGUgZmluYWwgZm9ybWF0IChIVE1MIGluIHRoZSBmaXJzdCBzdGVwLCBQREYgbWF5IGZvbGxvdykuPC9wPgorCisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U1ZOIFVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L3NhbmRib3gvYW50bGlicy9nZW5kb2MvIj5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvZ2VuZG9jLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlZpZXdTVk46PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2FudC9zYW5kYm94L2FudGxpYnMvZ2VuZG9jLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9hbnQvc2FuZGJveC9hbnRsaWJzL2dlbmRvYy88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BbnQgY29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjcueDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QWRkZWQgdG8gc2FuZGJveDo8L3RoPgorICAgICAgICAgICAgPHRkPjIwMDUtMDQtMTU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlNwb25zb3JpbmcgQ29tbWl0dGVyczwvdGg+CisgICAgICAgICAgICA8dGQ+IDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJIVFRQIC0gdGFza3MgZm9yIGhhbmRsaW5nIEhUVFAgcmVxdWVzdHMiPgorCisgICAgICAgIDxwPlRoaXMgYW50bGliIGNvbnRhaW5zIHRhc2tzIHRvIG1ha2UgdGhlIGJhc2ljIEhUVFAgcmVxdWVzdHM6IGdldCwgcG9zdCwgaGVhZCwgcHV0LCB3aXRoIEJhc2ljYXV0aGVudGljYXRpb24uPC9wPgorCisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U1ZOIFVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L3NhbmRib3gvYW50bGlicy9odHRwLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC9hbnRsaWJzL2h0dHAvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Vmlld1NWTjo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYW50L3NhbmRib3gvYW50bGlicy9odHRwLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9hbnQvc2FuZGJveC9hbnRsaWJzL2h0dHAvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QW50IGNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS43Lng8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkFkZGVkIHRvIHNhbmRib3g6PC90aD4KKyAgICAgICAgICAgIDx0ZD4yMDA2LTA2LTI3PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TcG9uc29yaW5nIENvbW1pdHRlcnM8L3RoPgorICAgICAgICAgICAgPHRkPiAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgCisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik1hbnVhbDRFY2xpcHNlIC0gR2VuZXJhdGUgYW4gRWNsaXBzZSBIZWxwIFBsdWdJbiBmcm9tIEFudCdzIG1hbnVhbCI+CisgICAgICAgIDxwPlRoaXMgQW50TGliIHByb3ZpZGVzIHRhc2tzIGZvciBnZW5lcmF0aW5nIGFuIEVjbGlwc2UgSGVscCBQbHVnSW4gZnJvbSBBbnQncyBtYW51YWwuPC9wPgorICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlNWTiBVUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvbWFudWFsNGVjbGlwc2UvIj5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvbWFudWFsNGVjbGlwc2UvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Vmlld1NWTjo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvc2FuZGJveC9hbnRsaWJzL21hbnVhbDRlY2xpcHNlL3RydW5rLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9zYW5kYm94L2FudGxpYnMvbWFudWFsNGVjbGlwc2UvdHJ1bmsvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QW50IGNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS43Lng8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkphdmEgY29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkphdmEgMS41KzwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QWRkZWQgdG8gc2FuZGJveDo8L3RoPgorICAgICAgICAgICAgPHRkPjIwMDctMDMtMDE8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlNwb25zb3JpbmcgQ29tbWl0dGVyczwvdGg+CisgICAgICAgICAgICA8dGQ+IDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIAorICAgICAgCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJQcm9wcyAtIGFkZGl0aW9uYWwgUHJvcGVydHkgUmVzb2x2ZXIiPgorCisgICAgICAgIDxwPlRoaXMgaXMgYSBsaWJyYXJ5IG9mIHN1cHBsZW1lbnRhcnkgaGFuZGxlcnMgZm9yIEFudCBwcm9wZXJ0aWVzIHJlc29sdXRpb24uPC9wPgorCisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U1ZOIFVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvcHJvcHMvdHJ1bmsvIj5odHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC9hbnRsaWJzL3Byb3BzL3RydW5rLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlZpZXdTVk46PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L3NhbmRib3gvYW50bGlicy9wcm9wcy90cnVuay8iPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvc2FuZGJveC9hbnRsaWJzL3Byb3BzL3RydW5rLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkFudCBjb21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuOC54PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BZGRlZCB0byBzYW5kYm94OjwvdGg+CisgICAgICAgICAgICA8dGQ+MjAwNy0wNy0yNTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U3BvbnNvcmluZyBDb21taXR0ZXJzPC90aD4KKyAgICAgICAgICAgIDx0ZD5NYXR0IEJlbnNvbjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4gICAgICAKKyAgICAgIAorICAgICAgCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJWU1MgLSBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUgVGFza3MiPgorCisgICAgICAgIDxwPlRoaXMgYW50bGliIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlIFNDTS4gVGhlIG9yaWdpbmFsIHRhc2tzIAorICAgICAgICAob3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzKSBoYXZlIGJlZW4gZXhwYW5kZWQgdXBvbiBpbiB0aGlzIGFudGxpYi4gCisgICAgICAgIFNvbWUgZml4ZXMgdG8gaXNzdWVzIGluIHRoZSBvcmlnaW5hbCB0YXNrcyBoYXZlIGFsc28gYmVlbiBpbmNvcnBvcmF0ZWQuPC9wPgorCisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U1ZOIFVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L3NhbmRib3gvYW50bGlicy92c3MvIj5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvdnNzLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlZpZXdTVk46PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2FudC9zYW5kYm94L2FudGxpYnMvdnNzLyI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9hbnQvc2FuZGJveC9hbnRsaWJzL3Zzcy88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BbnQgY29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjcueDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QWRkZWQgdG8gc2FuZGJveDo8L3RoPgorICAgICAgICAgICAgPHRkPjIwMDYtMDQtMjYgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U3BvbnNvcmluZyBDb21taXR0ZXJzPC90aD4KKyAgICAgICAgICAgIDx0ZD4gIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworCisKKworICAgICAgPCEtLSBleGFtcGxlIGZvciBjb3B5L3Bhc3RlIHJldXNlIDstKQorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50VW5pdCAtIFVuaXQgVGVzdCBGcmFtZXdvcmsgZm9yIEFudCBUYXNrcyI+CisKKyAgICAgICAgPHA+QW50VW5pdCBib3Jyb3dzIGlkZWFzIGZyb20gSlVuaXQgMy54IGFuZCB0aGUgJmx0O2p1bml0Jmd0OworICAgICAgICB0YXNrLiAgSXQgcHJvdmlkZXMgYSB0YXNrIHRoYXQgcnVucyBidWlsZCBmaWxlcyBhcyB1bml0IHRlc3RzCisgICAgICAgIGFzIHdlbGwgYXMgYSBudW1iZXIgb2YgYXNzZXJ0aW9uIHRhc2tzIHRvIHN1cHBvcnQgdGhlCisgICAgICAgIGlkZWEuPC9wPgorCisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+U1ZOIFVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvYW50dW5pdC90cnVuay8iPmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zYW5kYm94L2FudGxpYnMvYW50dW5pdC90cnVuay88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5WaWV3U1ZOOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9zYW5kYm94L2FudGxpYnMvYW50dW5pdC90cnVuay8iPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvc2FuZGJveC9hbnRsaWJzL2FudHVuaXQvdHJ1bmsvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QW50IGNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS43Lng8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkFkZGVkIHRvIHNhbmRib3g6PC90aD4KKyAgICAgICAgICAgIDx0ZD4yMDA1LTA0LTE1PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TcG9uc29yaW5nIENvbW1pdHRlcnM8L3RoPgorICAgICAgICAgICAgPHRkPlN0ZWZhbiBCb2Rld2lnPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgLS0+CisgICAgPC9zZWN0aW9uPgorCisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9hbnRsaWJzL3NyY2Rvd25sb2FkLnhtbCBiL3RydW5rL3hkb2NzL2FudGxpYnMvc3JjZG93bmxvYWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjRhNDgKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9hbnRsaWJzL3NyY2Rvd25sb2FkLnhtbApAQCAtMCwwICsxLDIwOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8dGl0bGU+U291cmNlIERpc3RyaWJ1dGlvbnM8L3RpdGxlPgorICAgIDxpbmRleCB2YWx1ZT0iMSIvPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJEb3dubG9hZGluZyBBbnRsaWJzIj4KKworPHA+VXNlIHRoZSBsaW5rcyBiZWxvdyB0byBkb3dubG9hZCBhIHNvdXJjZSBkaXN0cmlidXRpb24gb2YgQW50bGlicyBmcm9tCitvbmUgb2Ygb3VyIG1pcnJvcnMuICBJdCBpcyBnb29kIHByYWN0aWNlIHRvCis8YSBocmVmPSJbbG9jYXRpb25dI1ZlcmlmeSBSZWxlYXNlcyI+dmVyaWZ5IHRoZSBpbnRlZ3JpdHk8L2E+CitvZiB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzLCBlc3BlY2lhbGx5IGlmIHlvdSBhcmUgdXNpbmcgb25lIG9mIG91cgorbWlycm9yIHNpdGVzLiAgSW4gb3JkZXIgdG8gZG8gdGhpcyB5b3UgbXVzdCB1c2UgdGhlIHNpZ25hdHVyZXMgZnJvbQorb3VyIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzLyI+bWFpbiBkaXN0cmlidXRpb24KK2RpcmVjdG9yeTwvYT4uPC9wPgorCis8cD5BbnRsaWJzIGFyZSBkaXN0cmlidXRlZCBhcyA8Y29kZT56aXA8L2NvZGU+LCA8Y29kZT50YXIuZ3o8L2NvZGU+IGFuZAorPGNvZGU+dGFyLmJ6MjwvY29kZT4gYXJjaGl2ZXMgLSB0aGUgY29udGVudHMgYXJlIHRoZSBzYW1lLiAgUGxlYXNlCitub3RlIHRoYXQgdGhlIDxjb2RlPnRhci4qPC9jb2RlPiBhcmNoaXZlcyBjb250YWluIGZpbGUgbmFtZXMgbG9uZ2VyCit0aGFuIDEwMCBjaGFyYWN0ZXJzIGFuZCBoYXZlIGJlZW4gY3JlYXRlZCB1c2luZyBHTlUgdGFyIGV4dGVuc2lvbnMuCitUaHVzIHRoZXkgbXVzdCBiZSB1bnRhcnJlZCB3aXRoIGEgR05VIGNvbXBhdGlibGUgdmVyc2lvbiBvZgorPGNvZGU+dGFyPC9jb2RlPi48L3A+CisKKzxwPklmIHlvdSBkbyBub3Qgc2VlIHRoZSBmaWxlIHlvdSBuZWVkIGluIHRoZSBsaW5rcyBiZWxvdywgcGxlYXNlIHNlZQordGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzLyI+bWFzdGVyIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPiBvciwgcHJlZmVyYWJseSwgaXRzIDxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzLyI+bWlycm9yPC9hPi48L3A+CisKKzwvc2VjdGlvbj4KKworPCEtLXNlY3Rpb24gbmFtZT0iRG93bmxvYWRpbmcgQmV0YXMiPgorCis8cD5CZXRhIHJlbGVhc2VzIGFyZSBub3QgbWlycm9yZWQsIHlvdSBjYW4gZmluZCBvdXIgbGF0ZXN0IGJldGEKK3JlbGVhc2VzIGF0IDxhCitocmVmPSJodHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy8iPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzLzwvYT4uPC9wPgorCis8cD5DdXJyZW50bHkgYXZhaWxhYmxlOjwvcD4KKworPHVsPgorCisgIDxsaT48YQorICBocmVmPSJodHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS8iPkFudFVuaXQKKyAgMS4wQmV0YTI8L2E+PC9saT4KKworPC91bD4KKworPC9zZWN0aW9uLS0+CisKKzxzZWN0aW9uIG5hbWU9Ik1pcnJvciI+CisKKzxwPllvdSBhcmUgY3VycmVudGx5IHVzaW5nIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmIHlvdSBlbmNvdW50ZXIgYQorcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiAgSWYgYWxsCittaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUgPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mCit0aGUgbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPgorCis8Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIj4KK090aGVyIG1pcnJvcnM6IDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj4KK1tpZi1hbnkgaHR0cF0KKyAgW2ZvciBodHRwXTxvcHRpb24gdmFsdWU9IltodHRwXSI+W2h0dHBdPC9vcHRpb24+W2VuZF0KK1tlbmRdCitbaWYtYW55IGZ0cF0KKyAgW2ZvciBmdHBdPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF0KK1tlbmRdCitbaWYtYW55IGJhY2t1cF0KKyAgW2ZvciBiYWNrdXBdPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+W2VuZF0KK1tlbmRdCis8L3NlbGVjdD4KKzxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiIC8+Cis8L2Zvcm0+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkN1cnJlbnQgQW50bGliIFJlbGVhc2VzIj4KKworPGRpdiBjbGFzcz0id2FybmluZyI+Cis8ZGl2IGNsYXNzPSJsYWJlbCI+Tm90ZTwvZGl2PgorPGRpdiBjbGFzcz0iY29udGVudCI+VmVyeSByZWNlbnQgcmVsZWFzZXMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsCittaXJyb3JzIGZvciBhIGZldyBkYXlzLjwvZGl2PgorPC9kaXY+Cis8YnI+PC9icj4KKzxkaXYgY2xhc3M9Indhcm5pbmciPgorPGRpdiBjbGFzcz0ibGFiZWwiPlRhciBmaWxlcyBtYXkgcmVxdWlyZSBnbnUgdGFyIHRvIGV4dHJhY3Q8L2Rpdj4KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPlRhciBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGNvbnRhaW4gbG9uZyBmaWxlIG5hbWVzLCBhbmQgbWF5CisgcmVxdWlyZSBnbnUgdGFyIHRvIGRvIHRoZSBleHRyYWN0aW9uLjwvZGl2PgorPC9kaXY+CisKKzx1bD4KKzxsaT5BcGFjaGUgLk5FVCBBbnQgTGlicmFyeSAxLjAKKzx1bD4KKzxsaT48Y29kZT4uemlwPC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnppcCI+YXBhY2hlLWFudC1kb3RuZXQtMS4wLXNyYy56aXA8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnppcC5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnppcC5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvc291cmNlL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMuemlwLm1kNSI+TUQ1PC9hPl08L2xpPgorCis8bGk+PGNvZGU+LnRhci5nejwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9hbnRsaWJzL2RvdG5ldC9zb3VyY2UvYXBhY2hlLWFudC1kb3RuZXQtMS4wLXNyYy50YXIuZ3oiPmFwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMudGFyLmd6PC9hPgorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2RvdG5ldC9zb3VyY2UvYXBhY2hlLWFudC1kb3RuZXQtMS4wLXNyYy50YXIuZ3ouYXNjIj5QR1A8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2RvdG5ldC9zb3VyY2UvYXBhY2hlLWFudC1kb3RuZXQtMS4wLXNyYy50YXIuZ3ouc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnRhci5nei5tZDUiPk1ENTwvYT5dPC9saT4KKworPGxpPjxjb2RlPi50YXIuYnoyPC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnRhci5iejIiPmFwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMudGFyLmJ6MjwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9kb3RuZXQvc291cmNlL2FwYWNoZS1hbnQtZG90bmV0LTEuMC1zcmMudGFyLmJ6Mi5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnRhci5iejIuc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvZG90bmV0L3NvdXJjZS9hcGFjaGUtYW50LWRvdG5ldC0xLjAtc3JjLnRhci5iejIubWQ1Ij5NRDU8L2E+XTwvbGk+Cis8L3VsPgorPC9saT4KKworPGxpPkFwYWNoZSBBbnRVbml0IDEuMAorPHVsPgorPGxpPjxjb2RlPi56aXA8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS9hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy56aXAiPmFwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnppcDwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS9hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy56aXAuYXNjIj5QR1A8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2FudHVuaXQvc291cmNlL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnppcC5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS9hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy56aXAubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmd6PC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L2FudGxpYnMvYW50dW5pdC9zb3VyY2UvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1zcmMudGFyLmd6Ij5hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy50YXIuZ3o8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9zb3VyY2UvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1zcmMudGFyLmd6LmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS9hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy50YXIuZ3ouc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9zb3VyY2UvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1zcmMudGFyLmd6Lm1kNSI+TUQ1PC9hPl08L2xpPgorCis8bGk+PGNvZGU+LnRhci5iejI8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYW50bGlicy9hbnR1bml0L3NvdXJjZS9hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy50YXIuYnoyIj5hcGFjaGUtYW50LWFudHVuaXQtMS4wLXNyYy50YXIuYnoyPC9hPgorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2FudHVuaXQvc291cmNlL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnRhci5iejIuYXNjIj5QR1A8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9hbnRsaWJzL2FudHVuaXQvc291cmNlL2FwYWNoZS1hbnQtYW50dW5pdC0xLjAtc3JjLnRhci5iejIuc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvYW50dW5pdC9zb3VyY2UvYXBhY2hlLWFudC1hbnR1bml0LTEuMC1zcmMudGFyLmJ6Mi5tZDUiPk1ENTwvYT5dPC9saT4KKzwvdWw+Cis8L2xpPgorPC91bD4KKzwvc2VjdGlvbj4KKworPCEtLXNlY3Rpb24gbmFtZT0iT2xkIEFudCBSZWxlYXNlcyI+CisKKzxwPk9sZGVyIHJlbGVhc2VzIG9mIEFudCBjYW4gYmUgZm91bmQgPGEKK2hyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlLyI+aGVyZTwvYT4uICBUaG9zZQorcmVsZWFzZXMgYXJlIG9ubHkgcHJvdmlkZWQgYXMgPGNvZGU+emlwPC9jb2RlPiBhcmNoaXZlcyB0aGF0IGNhbiBiZQorZXh0cmFjdGVkIGJ5IDxjb2RlPmphciB4ZiA8L2NvZGU+PGVtPmFyY2hpdmUuemlwPC9lbT4gLSB3ZSBoaWdobHkKK3JlY29tbWVuZCB0byBub3QgdXNlIHRob3NlIHJlbGVhc2VzIGJ1dCB1cGdyYWRlIHRvIEFudCdzIDxhCitocmVmPSJbbG9jYXRpb25dI0N1cnJlbnQgUmVsZWFzZSBvZiBBbnQiPmxhdGVzdDwvYT4gcmVsZWFzZS48L3A+CisKKzwvc2VjdGlvbi0tPgorCis8c2VjdGlvbiBuYW1lPSJWZXJpZnkgUmVsZWFzZXMiPgorCis8cD5JdCBpcyBlc3NlbnRpYWwgdGhhdCB5b3UgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQKK2ZpbGVzIHVzaW5nIHRoZSBQR1Agc2lnbmF0dXJlIG9yIHRoZSBTSEExIG9yIE1ENSBjaGVja3N1bXMuICBUaGUKK2NoZWNrc3VtcyBhcmUgbm90IGFzIHN0cm9uZyBpbmRpY2F0b3JzIGFzIHRoZSBQR1Agc2lnbmF0dXJlLjwvcD4KKworPHA+VGhlIFBHUCBzaWduYXR1cmVzIGNhbiBiZSB2ZXJpZmllZCB1c2luZyBQR1Agb3IgR1BHLiAgRmlyc3QKK2Rvd25sb2FkIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvS0VZUyI+S0VZUzwvYT4KK2FzIHdlbGwgYXMgdGhlIDxjb2RlPmFzYzwvY29kZT4gc2lnbmF0dXJlIGZpbGUgZm9yIHRoZSBwYXJ0aWN1bGFyCitkaXN0cmlidXRpb24uICBNYWtlIHN1cmUgeW91IGdldCB0aGVzZSBmaWxlcyBmcm9tIHRoZSA8YQoraHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2FudGxpYnMvIj5tYWluIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPiwgcmF0aGVyIHRoYW4gZnJvbSBhIG1pcnJvci4gVGhlbiB2ZXJpZnkgdGhlIHNpZ25hdHVyZXMKK3VzaW5nPC9wPgorCis8cD48Y29kZT4KKyUgcGdwayAtYSBLRVlTPGJyIC8+CislIHBncHYgYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3ouYXNjPGJyIC8+Cis8L2NvZGU+Cis8ZW0+b3I8L2VtPjxiciAvPgorPGNvZGU+CislIHBncCAta2EgS0VZUzxiciAvPgorJSBwZ3AgYXBhY2hlLWFudC1kb3RuZXQtMS4wLWJpbi50YXIuZ3ouYXNjPGJyIC8+Cis8L2NvZGU+Cis8ZW0+b3I8L2VtPjxiciAvPgorPGNvZGU+CislIGdwZyAtLWltcG9ydCBLRVlTPGJyIC8+CislIGdwZyAtLXZlcmlmeSBhcGFjaGUtYW50LWRvdG5ldC0xLjAtYmluLnRhci5nei5hc2MKKzwvY29kZT48L3A+CisKKzxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdmVyaWZ5IHRoZSBjaGVja3N1bXMgb24gdGhlIGZpbGVzLiAgVW5peAorcHJvZ3JhbXMgY2FsbGVkIDxjb2RlPm1kNTwvY29kZT4vPGNvZGU+c2hhMTwvY29kZT4gb3IKKzxjb2RlPm1kNXN1bTwvY29kZT4vPGNvZGU+c2hhMXN1bTwvY29kZT4gYXJlIGluY2x1ZGVkIGluIG1hbnkgdW5peAorZGlzdHJpYnV0aW9ucy4gIDxjb2RlPipzdW08L2NvZGU+IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YgPGEKK2hyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXh0dXRpbHMvdGV4dHV0aWxzLmh0bWwiPkdOVQorVGV4dHV0aWxzPC9hPi4gIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20gPGEKK2hyZWY9Imh0dHA6Ly93d3cuZm91cm1pbGFiLmNoL21kNS8iPmhlcmU8L2E+LCA8YQoraHJlZj0iaHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS8iPmhlcmU8L2E+LiAgPGEKK2hyZWY9Imh0dHA6Ly93d3cuc2xhdmFzb2Z0LmNvbS9mc3VtLyI+ZnN1bTwvYT4gc3VwcG9ydHMgTUQ1IGFuZAorU0hBMS48L3A+CisKKzxwPldlIGhpZ2hseSByZWNvbW1lbmQgdG8gdmVyaWZ5IHRoZSBQR1Agc2lnbmF0dXJlLCB0aG91Z2guPC9wPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9hbnRsaWJzL3N2bi9pbmRleC54bWwgYi90cnVuay94ZG9jcy9hbnRsaWJzL3N2bi9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODZkZGE2YQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL2FudGxpYnMvc3ZuL2luZGV4LnhtbApAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxpbmRleCB2YWx1ZT0iMSIvPgorICAgIDx0aXRsZT5TdWJ2ZXJzaW9uIEFudCBMaWJyYXJ5PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxib2R5PgorCisgICAgPHNlY3Rpb24gbmFtZT0iSWRlYSI+CisgICAgICA8cD5UaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgQW50IGxpYnJhcnkgaXMgdG8gcHJvdmlkZSB0aGUgc2FtZQorICAgICAgbGV2ZWwgb2Ygc3VwcG9ydCB0aGF0IEFudCBwcm92aWRlcyBmb3IgQ1ZTLiAgVGhpcyBtZWFucyB0aGUKKyAgICAgIHRhc2tzIGFyZSB3cmFwcGVycyBvbiB0b3Agb2YgdGhlIGNvbW1hbmQgbGluZSBjbGllbnQgKHJlYWQ6IHlvdQorICAgICAgc3RpbGwgbmVlZCB0byBpbnN0YWxsIGFuIHN2biBjbGllbnQpIGFuZCB0aGVyZSBpcyBub3QgbXVjaCBtb3JlCisgICAgICB0aGFuIHJ1bm5pbmcgdGhlIGV4ZWN1dGFibGUgYW5kIGNyZWF0aW5nIHNvbWUgcmVwb3J0cy48L3A+CisKKyAgICAgIDxwPklmIHlvdSBhcmUgbG9va2luZyBmb3IgcHJvamVjdHMgdGhhdCBhaW0gYXQgbW9yZSwgdGhlcmUgYXJlCisgICAgICBiZXR0ZXIgYWx0ZXJuYXRpdmVzLCBmb3IgZXhhbXBsZSA8YQorICAgICAgaHJlZj0iaHR0cDovL3N1YmNsaXBzZS50aWdyaXMub3JnL3N2bmFudC5odG1sIj5TdWJjbGlwc2UncyBBbnQKKyAgICAgIHRhc2s8L2E+IG9yIDxhCisgICAgICBocmVmPSJodHRwOi8vdG1hdGUub3JnL3N2bi9hbnQuaHRtbCI+SmF2YVNWTjwvYT4uPC9wPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IlRhc2tzIj4KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InN2biI+CisgICAgICAgIDxwPkEgdmVyeSB0aGluIGxheWVyIG9uIHRvcCBvZiB0aGUgY29tbWFuZCBsaW5lIGV4ZWN1dGFibGUsCisgICAgICAgIGNvbXBhcmFibGUgdG8gPGEKKyAgICAgICAgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvY3ZzLmh0bWwiPnRoZSBDVlMKKyAgICAgICAgdGFzazwvYT4uPC9wPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJjaGFuZ2Vsb2ciPgorICAgICAgICA8cD5DcmVhdGVzIGEgbG9nIG9mIGNoYW5nZSBjb21tZW50cyBiZXR3ZWVuIHR3byByZXZpc2lvbnMsCisgICAgICAgIGNvbXBhcmFibGUgdG8gPGEKKyAgICAgICAgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9Db3JlVGFza3MvY2hhbmdlbG9nLmh0bWwiPkN2c0NoYW5nZUxvZzwvYT4uPC9wPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSIqZGlmZiI+CisgICAgICAgIDxwPjxjb2RlPiZsdDt0YWdkaWZmJmd0OzwvY29kZT4gY3JlYXRlcyBhIGRpZmZlcmVuY2VzIHJlcG9ydAorICAgICAgICBmb3IgdGhlIGNoYW5nZXMgYmV0d2VlbiB0d28gdGFncyBvciBicmFuY2hlcy48L3A+CisKKyAgICAgICAgPHA+PGNvZGU+Jmx0O3JldmlzaW9uZGlmZiZndDs8L2NvZGU+IGNyZWF0ZXMgYSBkaWZmZXJlbmNlcyByZXBvcnQKKyAgICAgICAgZm9yIHRoZSBjaGFuZ2VzIGJldHdlZW4gdHdvIHJldmlzaW9ucy48L3A+CisKKyAgICAgICAgPHA+VG9nZXRoZXIgY29tcGFyYWJsZSB0byA8YQorICAgICAgICBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL0NvcmVUYXNrcy9jdnN0YWdkaWZmLmh0bWwiPkN2c1RhZ0RpZmY8L2E+LjwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJFeGFtcGxlcyI+CisgICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3MvYW50bmV3cy54bWwgYi90cnVuay94ZG9jcy9hbnRuZXdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzRmZWVjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsveGRvY3MvYW50bmV3cy54bWwKQEAgLTAsMCArMSw0MDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iIj5Db25vciBNYWNOZWlsbDwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9IiI+U3RlZmFuIEJvZGV3aWc8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSIiPk1hZ2VzaCBVbWFzYW5rYXI8L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSIiPkFudG9pbmUgTGV2eS1MYW1iZXJ0PC9hdXRob3I+CisgICAgPHRpdGxlPk5ld3M8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorICA8c2VjdGlvbiBuYW1lPSJBcGFjaGUgSXZ5IGlzIGFuIEFudCBTdWItUHJvamVjdCBOb3chIj4KKyAgICA8aDM+T2N0b2JlciAxMSwgMjAwNyAtIEFwYWNoZSBJdnkgaXMgYW4gQW50IFN1Yi1Qcm9qZWN0IE5vdyE8L2gzPgorCisgICAgPHA+QXBhY2hlIEl2eSwgIkEgSmF2YSBiYXNlZCB0b29sIGZvciB0cmFja2luZywgcmVzb2x2aW5nIGFuZAorICAgIG1hbmFnaW5nIHByb2plY3QgZGVwZW5kZW5jaWVzLiIsIGp1c3QgZmluaXNoZWQgPGEKKyAgICBocmVmPSJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvIj5JbmN1YmF0aW9uPC9hPiBhbmQgaGFzIGpvaW5lZAorICAgIHRoZSBBbnQgcHJvamVjdC4gIE1vcmUgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgQW50CisgICAgc2l0ZSBzb29uLjwvcD4KKworICAgIDxwPlVudGlsIHdlJ3ZlIGZpbmlzaGVkIHRoZSBtaWdyYXRpb24sIHlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dAorICAgIEl2eSBmcm9tIGl0cyA8YSBocmVmPSJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvaXZ5LyI+SW5jdWJhdG9yCisgICAgd2Vic2l0ZTwvYT4uPC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iQW50VW5pdCAxLjAiPgorICAgIDxoMz5KYW51YXJ5IDgsIDIwMDcgLSBBcGFjaGUgQW50VW5pdCAxLjAgQXZhaWxhYmxlPC9oMz4KKyAgICA8cD5BcGFjaGUgQW50VW5pdCAxLjAgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEKKyAgICBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPmRvd25sb2FkPC9hPi48L3A+CisKKyAgICA8cD5UaGlzIEFudCBMaWJyYXJ5IGNvbnRhaW5zIHRhc2tzIHRvIHRlc3QgQW50IHRhc2tzIHVzaW5nIEFudAorICAgIGluc3RlYWQgb2YgSlVuaXQuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIDxhCisgICAgaHJlZj0iYW50bGlicy9hbnR1bml0LyI+QW50VW5pdCBob21lIHBhZ2U8L2E+LjwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkFudCAxLjcuMCI+CisgICAgPGgzPkRlY2VtYmVyIDE5LCAyMDA2IC0gQW50IDEuNy4wIEF2YWlsYWJsZTwvaDM+CisgICAgPHA+QXBhY2hlIEFudCAxLjcuMCBpcyBub3cgYXZhaWxhYmxlIGZvciA8YQorICAgIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPmRvd25sb2FkPC9hPi48L3A+CisKKyAgICA8cD4gQW50IDEuNyBpbnRyb2R1Y2VzIGEgcmVzb3VyY2UgZnJhbWV3b3JrLiBTb21lIG9mIHRoZSBjb3JlIGFudCAKKyAgICB0YXNrcyBzdWNoIGFzICZsdDtjb3B5LyZndDsgYXJlIG5vdyBhYmxlIHRvIHByb2Nlc3Mgbm90IG9ubHkgZmlsZSAKKyAgICBzeXN0ZW0gcmVzb3VyY2VzIGJ1dCBhbHNvIHppcCBlbnRyaWVzLCB0YXIgZW50cmllcywgcGF0aHMsIC4uLiAKKyAgICBSZXNvdXJjZSBjb2xsZWN0aW9ucyBncm91cCByZXNvdXJjZXMsIGFuZCBjYW4gYmUgZnVydGhlciAKKyAgICBjb21iaW5lZCB3aXRoIG9wZXJhdG9ycyBzdWNoIGFzIHVuaW9uIGFuZCBpbnRlcnNlY3Rpb24uIFRoaXMgCisgICAgY2FuIGJlIGV4dGVuZGVkIGJ5IGN1c3RvbSByZXNvdXJjZXMgYW5kIGN1c3RvbSB0YXNrcyB1c2luZyByZXNvdXJjZXMuPC9wPgorCisgICAgPHA+CisgICAgQW50IDEuNyBzdGFydHMgb3V0c291cmNpbmcgb2Ygb3B0aW9uYWwgdGFza3MgdG8gQW50bGlicy4gCisgICAgVGhlIC5ORVQgYW50bGliIGluIHByZXBhcmF0aW9uIHdpbGwgcmVwbGFjZSB0aGUgLk5FVCBvcHRpb25hbCB0YXNrcyB3aGljaCBzaGlwIGluIEFudC4KKyAgICBTdXBwb3J0IGZvciB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBTdWJ2ZXJzaW9uIHdpbGwgYmUgb25seSBwcm92aWRlZCBhcyBhbiBhbnRsaWIgdG8KKyAgICBiZSByZWxlYXNlZCBzaG9ydGx5LiAKKyAgICA8L3A+CisKKyAgICA8cD5BbnQgMS43IGZpeGVzIGFsc28gYSBsYXJnZSBudW1iZXIgb2YgYnVncy48L3A+CisKKyAgICA8cD5BbnQgMS43IGhhcyBzb21lIGluaXRpYWwgc3VwcG9ydCBmb3IgSmF2YTYgZmVhdHVyZXMuPC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iLk5FVCBBbnQgTGlicmFyeSAxLjBCZXRhMSI+CisgICAgPGgzPk5vdmVtYmVyIDYsIDIwMDYgLSBBcGFjaGUgLk5FVCBBbnQgTGlicmFyeSAxLjAgQXZhaWxhYmxlPC9oMz4KKyAgICA8cD5BcGFjaGUgLk5FVCBBbnQgTGlicmFyeSAxLjAgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEKKyAgICBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPmRvd25sb2FkPC9hPi48L3A+CisKKyAgICA8cD5UaGlzIEFudCBMaWJyYXJ5IGNvbnRhaW5zIHN1cHBvcnQgZm9yIHRvb2xzIGxpa2UgTlVuaXQgYXMgd2VsbAorICAgIGFzIHRoZSAib2xkIC5ORVQgdGFza3Mgb2YgQW50J3MgY29yZS4gIEl0IGhhcyBiZWVuIHRlc3RlZAorICAgIE1pY3Jvc29mdCdzIGZyYW1ld29ya3MgYXMgd2VsbCBhcyBNb25vLjwvcD4KKworICAgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgPGEgaHJlZj0iYW50bGlicy9kb3RuZXQvIj5BbnRsaWIncworICAgIGhvbWUgcGFnZTwvYT48L3A+CisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJBbnRVbml0IDEuMEJldGEyIj4KKyAgICA8aDM+T2N0b2JlciAyOSwgMjAwNiAtIEFwYWNoZSBBbnRVbml0IDEuMEJldGEyIEF2YWlsYWJsZTwvaDM+CisgICAgPHA+QXBhY2hlIEFudFVuaXQgMS4wQmV0YTEgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEKKyAgICBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiPmRvd25sb2FkPC9hPi48L3A+CisKKyAgICA8cD5UaGlzIEFudCBMaWJyYXJ5IGNvbnRhaW5zIHRhc2tzIHRvIHRlc3QgQW50IHRhc2tzIHVzaW5nIEFudAorICAgIGluc3RlYWQgb2YgSlVuaXQuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIDxhCisgICAgaHJlZj0iYW50bGlicy9hbnR1bml0LyI+QW50VW5pdCBob21lIHBhZ2U8L2E+LjwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkFudFVuaXQgMS4wQmV0YTEiPgorICAgIDxoMz5TZXB0ZW1iZXIgMjIsIDIwMDYgLSBBcGFjaGUgQW50VW5pdCAxLjBCZXRhMSBBdmFpbGFibGU8L2gzPgorICAgIDxwPkFwYWNoZSBBbnRVbml0IDEuMEJldGExIGlzIG5vdyBhdmFpbGFibGUgZm9yIDxhCisgICAgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYmluZG93bmxvYWQuY2dpIj5kb3dubG9hZDwvYT4uPC9wPgorCisgICAgPHA+VGhpcyBBbnQgTGlicmFyeSBjb250YWlucyB0YXNrcyB0byB0ZXN0IEFudCB0YXNrcyB1c2luZyBBbnQKKyAgICBpbnN0ZWFkIG9mIEpVbml0LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSA8YQorICAgIGhyZWY9ImFudGxpYnMvYW50dW5pdC8iPkFudFVuaXQgaG9tZSBwYWdlPC9hPi48L3A+CisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSIuTkVUIEFudCBMaWJyYXJ5IDEuMEJldGExIj4KKyAgICA8aDM+U2VwdGVtYmVyIDEzLCAyMDA2IC0gQXBhY2hlIC5ORVQgQW50IExpYnJhcnkgMS4wQmV0YTEgQXZhaWxhYmxlPC9oMz4KKyAgICA8cD5BcGFjaGUgLk5FVCBBbnQgTGlicmFyeSAxLjBCZXRhMSBpcyBub3cgYXZhaWxhYmxlIGZvciA8YQorICAgIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaSI+ZG93bmxvYWQ8L2E+LjwvcD4KKworICAgIDxwPlRoaXMgQW50IExpYnJhcnkgY29udGFpbnMgc3VwcG9ydCBmb3IgdG9vbHMgbGlrZSBOVW5pdCBhcyB3ZWxsCisgICAgYXMgdGhlICJvbGQgLk5FVCB0YXNrcyBvZiBBbnQncyBjb3JlLiAgSXQgaGFzIGJlZW4gdGVzdGVkCisgICAgTWljcm9zb2Z0J3MgZnJhbWV3b3JrcyBhcyB3ZWxsIGFzIE1vbm8uPC9wPgorCisgICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSA8YSBocmVmPSJhbnRsaWJzL2RvdG5ldC8iPkFudGxpYidzCisgICAgaG9tZSBwYWdlPC9hPjwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkFudCAxLjYuNSI+CisgICAgPGgzPkp1bmUgMiwgMjAwNSAtIEFudCAxLjYuNSBBdmFpbGFibGU8L2gzPgorICAgIDxwPkFwYWNoZSBBbnQgMS42LjUgaXMgbm93IGF2YWlsYWJsZSBmb3IgPGEKKyAgICBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYmluZG93bmxvYWQuY2dpIj5kb3dubG9hZDwvYT4uPC9wPgorICAgIDxwPlRoaXMgaXMgYSBidWcgZml4IHJlbGVhc2UuPC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iQW50IDEuNi40Ij4KKyAgICA8aDM+TWF5IDE5LCAyMDA1IC0gQW50IDEuNi40IEF2YWlsYWJsZTwvaDM+CisgICAgPHA+QXBhY2hlIEFudCAxLjYuNCBpcyBub3cgYXZhaWxhYmxlIGZvciA8YQorICAgIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5kb3dubG9hZDwvYT4uPC9wPgorICAgIDxwPlRoaXMgaXMgYSBidWcgZml4IHJlbGVhc2UuPC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iQW50IDEuNi4zIj4KKyAgICA8aDM+QXByaWwgMjgsIDIwMDUgLSBBbnQgMS42LjMgQXZhaWxhYmxlPC9oMz4KKyAgICA8cD5BcGFjaGUgQW50IDEuNi4zIGlzIG5vdyBhdmFpbGFibGUgZm9yIDxhCisgICAgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2FudC8iPmRvd25sb2FkPC9hPi48L3A+CisgICAgPHA+VGhlcmUgaXMgYSBsYXJnZSBsaXN0IG9mIGZpeGVkIGJ1Z3MgYW5kIGVuaGFuY2VtZW50cy48L3A+CisgICAgPHA+U29tZSBvZiB0aGUgYnVncyBhZmZlY3RpbmcgdGhlIGVtYmVkZGVkIHVzZSBvZiBBbnQgYXJlIGZpeGVkLjwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkFudGlkb3RlIFJldGlyZWQiPgorICAgIDxoMz5BcHJpbCA0dGgsIDIwMDUgLSBUaGUgQXBhY2hlIEFudCBQcm9qZWN0IFJldGlyZXMgQW50aWRvdGUsIHRoZQorICAgIEFudCBHVUk8L2gzPgorCisgICAgPHA+VGhlIEFudGlkb3RlIHN1YnByb2plY3Qgd2FzIG9uY2Ugc3RhcnRlZCB0byBwcm92aWRlIGEgR1VJIGZvcgorICAgIEFudCBhdCBhIHRpbWUgd2hlcmUgSURFIHN1cHBvcnQgZm9yIEFudCB3YXMgZmFyIGZyb20gdXNhYmxlLgorICAgIFVuZm9ydHVuYXRlbHkgaXQgbmV2ZXIgYXR0cmFjdGVkIGEgZGV2ZWxvcGVyIGNvbW11bml0eSBvZiBpdHMKKyAgICBvd24uPC9wPgorCisgICAgPHA+QXQgdGhlIHNhbWUgdGltZSBJREUgc3VwcG9ydCBmb3IgQW50IGhhcyBiZWNvbWUgdWJpcXVpdG91cyBieQorICAgIG5vdyBhbmQgdGhlcmUgaXMgbGl0dGxlIHJlYXNvbiB0byBoYXZlIGEgR1VJIGp1c3QgZm9yIEFudC4gIFRoaXMKKyAgICBtYWtlcyBpdCBldmVuIGxlc3MgbGlrZWx5IHRoYXQgdm9sdW50ZWVycyB3aWxsIHN0YXJ0IHRvIHNwZW5kIHRpbWUKKyAgICB3b3JraW5nIG9uIGl0LjwvcD4KKworICAgIDxwPkFudGlkb3RlJ3MgZGV2ZWxvcG1lbnQgaGFzIGJlZW4gc3RhbGxlZCBmb3IgeWVhcnMgbm93LCBkZXNwaXRlCisgICAgc29tZSBlZmZvcnRzIHRvIHJlanV2ZW5hdGUgaXQgYnkgc2luZ2xlIGRldmVsb3BlcnMuICBUaGVyZWZvcmUgdGhlCisgICAgQW50IGRldmVsb3BlcnMgaGF2ZSBjaG9zZW4gdG8gcmV0aXJlIEFudGlkb3RlLjwvcD4KKworICAgIDxwPkFudGlkb3RlIHdpbGwgbm8gbG9uZ2VyIGJlIGRldmVsb3BlZCBieSB0aGUgQW50IHByb2plY3Q7IGl0cworICAgIENWUyBtb2R1bGUgd2lsbCBiZSBzaHV0IGRvd24uPC9wPgorCisgICAgPHA+SWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIEFudGlkb3RlJ3Mgc291cmNlcyB0byBsZWFybiBmcm9tIG9yCisgICAgYnVpbGQgb24gaXQsIHlvdSBjYW4gZmluZCBzbmFwc2hvdHMgYXQgPGEKKyAgICBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2FudC9hbnRpZG90ZS8iPmh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvYW50L2FudGlkb3RlLzwvYT4uPC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iQW50IDEuNi4yIj4KKyAgICA8aDM+SnVseSAxNiwgMjAwNCAtIEFudCAxLjYuMiBBdmFpbGFibGU8L2gzPgorICAgIDxwPkFwYWNoZSBBbnQgMS42LjIgYXZhaWxhYmxlIGZvciA8YQorICAgIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5kb3dubG9hZDwvYT4uPC9wPgorICAgIDxwPk5lc3RlZCBlbGVtZW50cyBmb3IgbmFtZXNwYWNlZCB0YXNrcyBhbmQgdHlwZXMgbWF5IGJlbG9uZyB0byB0aGUKK0FudCBkZWZhdWx0IG5hbWVzcGFjZSBhcyB3ZWxsIGFzIHRoZSB0YXNrJ3Mgb3IgdHlwZSdzIG5hbWVzcGFjZS48L3A+CisgICAgPHA+QWxsIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRhc2tzIGFyZSBub3cgd3JhcHBlZCBpbiBhCitidWlsZGV4Y2VwdGlvbiBnaXZpbmcgdGhlIGxvY2F0aW9uIGluIHRoZSBidWlsZGZpbGUgb2YgdGhlIHRhc2suPC9wPgorICAgIDxwPkFudCAxLjYuMiBmaXhlcyBhIGxhcmdlIG51bWJlciBvZiBidWdzIGFuZCBhZGRzIGEgbnVtYmVyIG9mCitmZWF0dXJlcyB3aGljaCB3ZXJlIGFza2VkIGZvciBieSB1c2VycyBvbiBCdWd6aWxsYS48L3A+CisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJXaWtpIE1pZ3JhdGlvbiI+CisgICAgPGgzPkZlYnJ1YXJ5IDI5LCAyMDA0PC9oMz4KKyAgICA8cD5UaGUgQW50IFdpa2kgcGFnZXMgaGF2ZSBiZWVuIG1pZ3JhdGVkIHRvIHRoZWlyIAorICAgICAgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvIj5uZXcgaG9tZTwvYT4gb24gdGhlIEFwYWNoZQorICAgICAgV2lraSBmYXJtLgorICAgIDwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkFudCAxLjYuMSI+CisgICAgPGgzPkZlYnJ1YXJ5IDEyLCAyMDA0IC0gQW50IDEuNi4xIEF2YWlsYWJsZTwvaDM+CisgICAgIDxwPkFwYWNoZSBBbnQgMS42LjEgaXMgc3RpbGwgYXZhaWxhYmxlIGZvcgorICAgICAgPGEgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2FudC8iPmRvd25sb2FkPC9hPi4KKyAgICAgPC9wPgorICAgIDxwPlRoZSBBU0YgQm9hcmQgaGFzIGFwcHJvdmVkIHRoZSBuZXcgQXBhY2hlIExpY2Vuc2UgMi4wLgorICAgIEZvciBhIGNvcHkgb2YgdGhhdCBsaWNlbnNlLCBwbGVhc2Ugc2VlCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyI+CisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLzwvYT4uPC9wPgorICAgIDxwPlRoZSBBbnQgMS42LjEgcmVsZWFzZSBpcyBkZWxpdmVyZWQgd2l0aCB0aGUKKyAgICBBcGFjaGUgTGljZW5zZSAyLjAuPC9wPgorICAgIDxwPkFudCAxLjYuMSBmaXhlcyBzZXZlcmFsIGJ1Z3MsIG1vc3Qgbm90YWJseSB0aGUgaGFuZGxpbmcKKyAgICBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yIG5lc3RlZCBlbGVtZW50cy48L3A+CisgICAgPHA+QW50IDEuNi4xIGFsc28gaW50cm9kdWNlcyBpbml0aWFsIHN1cHBvcnQgZm9yIGNvbXBpbGluZyB3aXRoCisgICAgSmF2YSAxLjUuPC9wPgorICA8L3NlY3Rpb24+CisgICA8c2VjdGlvbiBuYW1lPSJBbnQgMS42LjAiPgorICAgIDxoMz5EZWNlbWJlciAxOCwgMjAwMyAtIEFudCAxLjYuMCBBdmFpbGFibGU8L2gzPgorICAgICA8cD5BcGFjaGUgQW50IDEuNi4wIGlzIHN0aWxsIGF2YWlsYWJsZSBmb3IKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5kb3dubG9hZDwvYT4uCisgICAgIDwvcD4KKyAgICAgPHA+QXMKKyAgICB3ZSd2ZSBhbHJlYWR5IHNhaWQgaW4gdGhlIGFubm91bmNlbWVudHMgb2YgQW50IDEuNS40LCB0aGlzIHJlbGVhc2UKKyAgICByZXF1aXJlcyBKREsgMS4yIG9yIGxhdGVyIHRvIHJ1bi48L3A+CisKKyAgICA8cD5BbnQgMS42LjAgYWRkcyBhIGxvdCBvZiBuZXcgZmVhdHVyZXMsIG1vc3QgcHJvbWluZW50bHkgc3VwcG9ydAorICAgIGZvciBYTUwgbmFtZXNwYWNlcyBhcyB3ZWxsIGFzIGEgbmV3IGNvbmNlcHQgb2YgQW50IGxpYnJhcmllcyB0aGF0CisgICAgbWFrZXMgdXNlIG9mIG5hbWVzcGFjZXMgdG8gYXZvaWQgbmFtZSBjbGFzaGVzIG9mIGN1c3RvbSB0YXNrcy4KKyAgICBGb3IgYSBsb25nZXIgbGlzdCBvZiBmaXhlZCBidWdzIGFuZCBuZXcgZmVhdHVyZXMgc2VlIHRoZSByZWxlYXNlCisgICAgbm90ZXMuPC9wPgorICAgIAorICAgIDxwPklmIHlvdSBmaW5kIGFueXRoaW5nIHRoYXQgaGFzbid0IGJlZW4gY292ZXJlZCBpbiB0aGUgbWFudWFsIChJIGJldCB5b3UKK2RpZCkgb3IgY291bGQgYmUgZXhwbGFpbmVkIGJldHRlciwgZmVlbCBmcmVlIHRvIGhlbHAgdXMgb3V0IGluIHRoZQorPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvTmV3QW50RmVhdHVyZXNJbkRldGFpbCI+V2lraTwvYT4uPC9wPgorCisgICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iQW50IDEuNS40Ij4KKyAgICA8aDM+QXVndXN0IDEyLCAyMDAzIC0gQW50IDEuNS40IEF2YWlsYWJsZTwvaDM+CisgICAgPHA+QXBhY2hlIEFudCAxLjUuNCBpcyBzdGlsbCBhdmFpbGFibGUgZm9yCisgICAgIDxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5kb3dubG9hZDwvYT4uCisgICAgPC9wPgorICAgIAorICAgIDxwPlRoaXMgaXMgYSBtaW5vciBidWdmaXggcmVsZWFzZSB0aGF0IGZpeGVzIGEgcHJvYmxlbSB3aXRoIHRoZQorICAgIDxjb2RlPmphdmFoPC9jb2RlPiB0YXNrIG9uIEpESyAxLjQuMiBhbmQgYSBjb3VwbGUgb2YgYnVncyBpbiB0aGUKKyAgICBWaXN1YWwgQWdlIGZvciBKYXZhIGludGVyZ3JhdGlvbiB0YXNrcy4gIElmIHlvdSBkb24ndCB1c2UgamF2YWggb3IKKyAgICBWQUosIHRoZXJlIGlzIG5vIHJlYXNvbiB0byB1cGdyYWRlLjwvcD4KKworICAgIDxkaXYgY2xhc3M9Indhcm5pbmciPgorICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5Ob3RlPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iY29udGVudCI+QW50IDEuNS40IGlzIHRoZSBsYXN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cworICAgICAgSkRLIDEuMS4gQW50IDEuNi4wIHJlcXVpcmVzIEpESyAxLjIgb3IKKyAgICAgIGxhdGVyLgorICAgIDwvZGl2PgorICAgIDwvZGl2PgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iSmF2YSBQcm8gMjAwMyBSZWFkZXJzIENob2ljZSBBd2FyZCI+CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5mdHBvbmxpbmUuY29tL2phdmFwcm8vIj4KKyAgICAgIDxpbWcgc3R5bGU9InBhZGRpbmc6IDVweCIgc3JjPSJpbWFnZXMvanBfcmN3aW5uZXJfMjAwMy5naWYiIGFsdD0iIiBib3JkZXI9IjAiIGhlaWdodD0iODAiIHdpZHRoPSIxMzkiIGFsaWduPSJyaWdodCIvPjwvYT4KKyAgICA8aDM+SnVuZSAxMXRoLCAyMDAzOiBBbnQgd2lucyBhIEphdmEgUHJvIHJlYWRlcnMnIGNob2ljZSBhd2FyZDwvaDM+CisgICAgPHA+CisgICAgICBBbnQgaGFzIHdvbiB0aGUgSmF2YSBQcm8gMjAwMyBSZWFkZXJzJyBDaG9pY2UgQXdhcmQgZm9yIAorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIDxzdHJvbmc+TW9zdCBWYWx1YWJsZSBKYXZhIERlcGxveW1lbnQgVGVjaG5vbG9neTwvc3Ryb25nPi4KKyAgICA8L3A+CisgICAgCisgICAgPHA+CisgICAgICBUaGFua3MgdG8gSmF2YSBQcm8gYW5kIGFsbCBpdHMgcmVhZGVycy4gWW91IGNhbiByZWFkIGFib3V0CisgICAgICB0aGVzZSAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZnRwb25saW5lLmNvbS9yZXBvcnRzL2phdmFvbmUvMjAwMy9hd2FyZHMvIj5hd2FyZHM8L2E+CisgICAgICBhdCB0aGUgSmF2YSBQcm8gd2Vic2l0ZS4KKyAgICA8L3A+CisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJKREogRWRpdG9ycyBDaG9pY2UgQXdhcmQiPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9zeXMtY29uLmNvbS9qYXZhL2FydGljbGUyYS5jZm0/aWQ9MjA1OSZhbXA7Y291bnQ9MTczNCZhbXA7dG90PTYmYW1wO3BhZ2U9MiI+PGltZyBzcmM9ImltYWdlcy9KREpFZGl0b3JzQ2hvaWNlQXdhcmQuanBnIiBhbHQ9IiIgYm9yZGVyPSIwIiBhbGlnbj0icmlnaHQiLz48L2E+CisgICAgPGgzPkp1bmUgMjAwMzogQW50IHdpbnMgSkRKIEVkaXRvcnMmYXBvczsgQ2hvaWNlIEF3YXJkPC9oMz4KKworICAgIDxwPgorJnF1b3Q7QW50IGlzIHRoZSBoYW1tZXIgb2YgdGhlIEphdmEgd29ybGQ6IHdpdGhvdXQgaXQsIGNpdmlsaXphdGlvbiBtaWdodCBoYXZlIHByb2dyZXNzZWQsIGJ1dCBtdWNoIG1vcmUgc2xvd2x5IHRoYW4gaXQgaGFzLiBBbnQgaXMgb25lIG9mIHRoZSBtb3N0IHVzZWZ1bCBidWlsZCB0b29scyBJIGhhdmUgZXZlciBoYWQgdGhlIHBsZWFzdXJlIHRvIHVzZS4mcXVvdDsgLSBKb2UgT3R0aW5nZXIKKyAgICA8L3A+CisgICAgCisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJBbnQga2VlcHMgb24gd2lubmluZyEiPgorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamF2YXdvcmxkLmNvbS8iPjxpbWcgc3JjPSJpbWFnZXMvandfZWNfbG9nb193aW5uZXIyMDAzLmdpZiIgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMDgiIHdpZHRoPSIyNTIiIGFsaWduPSJyaWdodCIvPjwvYT4KKyAgICA8aDM+SnVuZSA5dGgsIDIwMDM6IEFudCB3aW5zIHRoZSBKYXZhV29ybGQgRWRpdG9ycyZhcG9zOyBDaG9pY2UgQXdhcmQ8L2gzPgorCisgICAgPHA+CisgICAgQW50IGhhcyB3b24gdGhlIEphdmFXb3JsZCBFZGl0b3JzJmFwb3M7IENob2ljZSBBd2FyZCBmb3IKKyAgICA8L3A+CisgICAgPHA+CisgICAgPHN0cm9uZz5Nb3N0IFVzZWZ1bCBKYXZhIENvbW11bml0eS1EZXZlbG9wZWQgVGVjaG5vbG9neTwvc3Ryb25nPgorICAgIDwvcD4KKyAgICAKKyAgICA8cD4KKyAgICBmb3IgdGhlIHNlY29uZCB0aW1lIGluIGEgcm93ISBSZWFkIHRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamF2YXdvcmxkLmNvbS9qYXZhd29ybGQvanctMDYtMjAwMy9qdy0wNjA5LWVjYS5odG1sIj4gZnVsbCBhcnRpY2xlPC9hPiAtLSBvciBqdW1wIGRpcmVjdGx5IHRvIHRoZSBiaXQgYWJvdXQKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTA2LTIwMDMvanctMDYwOS1lY2EtcDQuaHRtbCI+IG91ciBhd2FyZDwvYT4gPGNvZGU+Oik8L2NvZGU+PC9wPgorICA8L3NlY3Rpb24+CisgIAorICA8c2VjdGlvbiBuYW1lPSJBbnQgMS41LjMiPgorICAgIDxoMz5BcHJpbCA5LCAyMDAzIC0gQW50IDEuNS4zIEF2YWlsYWJsZTwvaDM+CisgICAgPHA+QXBhY2hlIEFudCAxLjUuMyBpcyBzdGlsbCBhdmFpbGFibGUgZm9yCisgICAgIDxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5kb3dubG9hZDwvYT4uCisgICAgPC9wPgorICA8L3NlY3Rpb24+CisKKworICA8c2VjdGlvbiBuYW1lPSJBbnQgMS41LjIiPgorICAgIDxoMz5NYXJjaCAzLCAyMDAzIC0gQW50IDEuNS4yIEF2YWlsYWJsZSE8L2gzPgorICAgIDxwPlRoZSBmaW5hbCB2ZXJzaW9uIG9mIEFudCAxLjUuMiBpcyBhdmFpbGFibGUgZm9yCisgICAgIDxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5kb3dubG9hZDwvYT4uCisgICAgIElmIHlvdSBoYXZlIGFueSBmZWVkYmFjayBvbiB0aGlzIHJlbGVhc2UsIGZlZWwgZnJlZSB0byBqb2luIHRoZSAKKyAgICAgZGlzY3Vzc2lvbiBvbiB0aGUgZGV2IGFuZCB1c2VyIG1haWxpbmcgbGlzdHMuCisgICAgIDwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkFudCBUb3AgTGV2ZWwgUHJvamVjdCI+CisgICAgPGgzPk5vdmVtYmVyIDE4LCAyMDAyPC9oMz4KKyAgICA8cD5UaGUgQXBhY2hlIGJvYXJkIDxhIGhyZWY9Im1pc3Npb24uaHRtbCI+Y3JlYXRlZDwvYT4KKyAgICAgICB0aGUgQXBhY2hlIEFudCB0b3AgbGV2ZWwgcHJvamVjdC4gQW50IGhhcyBub3cgbWlncmF0ZWQgZnJvbSB0aGUgSmFrYXJ0YQorICAgICAgIHByb2plY3QgaW50byBhbiBBcGFjaGUgcHJvamVjdCBvZiBpdHMgb3duLiBUaGlzIGlzIHByaW1hcmlseSBhbgorICAgICAgIG9yZ2FuaXphdGlvbmFsIGNoYW5nZSBhbmQgd2lsbCBub3QgYWZmZWN0IHRoZSB0ZWNobmljYWwgYXNwZWN0cyBvZgorICAgICAgIHRoZSBwcm9qZWN0LiBBbnQgcmV0YWlucyBhIHN0cm9uZyBhc3NvY2lhdGlvbiB3aXRoIHRoZSBBcGFjaGUKKyAgICAgICBKYWthcnRhIHByb2plY3QuIE9uZSBlZmZlY3Qgb2YgdGhpcyBjaGFuZ2UgaXMgdGhhdCB0aGUgQW50IHdlYnBhZ2UKKyAgICAgICBpcyBub3cgbG9jYXRlZCBhdCA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvPC9hPgorICAgICA8L3A+CisgIDwvc2VjdGlvbj4KKyAgICAKKyAgPHNlY3Rpb24gbmFtZT0iQW50IDEuNS4xIj4KKyAgICA8aDM+T2N0b2JlciAzLCAyMDAyIC0gQW50IDEuNS4xIEF2YWlsYWJsZSAhPC9oMz4KKyAgICA8cD5UaGUgZmluYWwgdmVyc2lvbiBvZiBBbnQgMS41LjEgaXMgc3RpbGwgYXZhaWxhYmxlIGZvcgorICAgICA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyI+CisgICAgIGRvd25sb2FkPC9hPi4gSWYgeW91IGhhdmUgYW55IGZlZWRiYWNrIG9uIHRoaXMgcmVsZWFzZSwgZmVlbCBmcmVlIHRvIGpvaW4gdGhlIAorICAgICBkaXNjdXNzaW9uIG9uIHRoZSBhbnQtZGV2IGFuZCBhbnQtdXNlciBtYWlsaW5nIGxpc3RzLgorICAgICA8L3A+CisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJBbnQgMS41Ij4KKyAgICA8aDM+SnVseSAxNSwgMjAwMiAtIEZpeCBmb3IgQ3lnd2luIHByb2JsZW0gaW4gd3JhcHBlciBzY3JpcHQgYXZhaWxhYmxlPC9oMz4KKyAgICAgIDxwPlRoZSB3cmFwcGVyIHNjcmlwdCBvZiBBbnQgMS41IG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBuZXcKKyAgICAgIHZlcnNpb24gZm9yIEN5Z3dpbiB1c2Vycy4gIFNlZSB0aGUgPGEKKyAgICAgIGhyZWY9ImZhcS5odG1sIzEuNS1jeWd3aW4tc2giPkZBUTwvYT4gZm9yIGRldGFpbHMuPC9wPgorCisgICAgPGgzPkp1bHkgMTAsIDIwMDIgLSBBbnQgMS41IFJlbGVhc2VkITwvaDM+CisgICAgPHA+VGhlIGZpbmFsIHZlcnNpb24gb2YgQW50IDEuNSBpcyBub3cgYXZhaWxhYmxlIGZvciAKKyAgICAgPGEgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2FudC8iPgorICAgICBkb3dubG9hZDwvYT4uIElmIHlvdSBoYXZlIGFueSBmZWVkYmFjayBvbiB0aGlzIHJlbGVhc2UsIGZlZWwgZnJlZSB0byBqb2luIHRoZSAKKyAgICAgZGlzY3Vzc2lvbiBvbiB0aGUgYW50LWRldiBhbmQgYW50LXVzZXIgbWFpbGluZyBsaXN0cy4KKyAgICAgPC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iQW50IHdpbnMgYWdhaW4hIj4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LnNkbWFnYXppbmUuY29tLyI+PGltZyBzcmM9ImltYWdlcy9zZG1fcHJvZHVjdGl2aXR5X2F3YXJkLmdpZiIgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMDgiIHdpZHRoPSIxODEiIGFsaWduPSJyaWdodCIvPjwvYT4KKyAgICA8aDM+QXByIDI5LCAyMDAyOiBBbnQgd2lucyA8ZW0+U29mdHdhcmUgRGV2ZWxvcG1lbnQ8L2VtPiBtYWdhemluZSZhcG9zO3MKKyAgICAyMDAyIFByb2R1Y3Rpdml0eSBBd2FyZC48L2gzPgorICAgIDxwPgorICAgIEFudCBoYXMgYmVlbiBhd2FyZGVkIGEgPHN0cm9uZz4yMDAyIFByb2R1Y3Rpdml0eSBBd2FyZDwvc3Ryb25nPiBieQorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2RtYWdhemluZS5jb20vIj48ZW0+U29mdHdhcmUgRGV2ZWxvcG1lbnQ8L2VtPjwvYT4KKyAgICBtYWdhemluZS4gIFJlYWQgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5zZG1hZ2F6aW5lLmNvbS9qb2x0cy9wcmVzc19yZWxlYXNlXzQtMjYtMDIuaHRtIj4KKyAgICBwcmVzcyByZWxlYXNlPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgdGhlIGZ1bGwgbGlzdCBvZiB3aW5uZXJzLgorICAgIDwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkFudCBoYXMgd29uISI+CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhd29ybGQuY29tLyI+PGltZyBzcmM9ImltYWdlcy9qd19lY19sb2dvX3dpbm5lcjIwMDIuZ2lmIiBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwOCIgd2lkdGg9IjI1MiIgYWxpZ249InJpZ2h0Ii8+PC9hPgorICAgIDxoMz5NYXIgMjYsIDIwMDI6IEFudCB3aW5zIHRoZSBKYXZhV29ybGQgRWRpdG9ycyZhcG9zOyBDaG9pY2UKKyAgICBBd2FyZDwvaDM+CisKKyAgICA8cD4KKyAgICBBbnQgaGFzIHdvbiB0aGUgSmF2YVdvcmxkIEVkaXRvcnMmYXBvczsgQ2hvaWNlIEF3YXJkIGZvcgorICAgIDxzdHJvbmc+TW9zdCBVc2VmdWwgSmF2YSBDb21tdW5pdHktRGV2ZWxvcGVkIFRlY2hub2xvZ3k8L3N0cm9uZz4uCisgICAgUmVhZCB0aGUKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTAzLTIwMDIvanctMDMyNi1hd2FyZHMuaHRtbAorIj4gZnVsbCBhcnRpY2xlPC9hPiAtLSBvciBqdW1wIGRpcmVjdGx5IHRvIHRoZSBiaXQgYWJvdXQKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTAzLTIwMDIvanctMDMyNi1hd2FyZHMtcDMuaHRtbCI+IG91ciBhd2FyZDwvYT4gPGNvZGU+Oik8L2NvZGU+PC9wPgorICA8L3NlY3Rpb24+CisgIAorICA8c2VjdGlvbiBuYW1lPSJKYXZhIDEuNCBTdXBwb3J0Ij4KKyAgICA8aDM+RmViIDE1LCAyMDAyOiBKYXZhIDEuNCBTdXBwb3J0PC9oMz4KKyAgICA8cD4KKyAgICAgIEphdmEgMS40IGhhcyBub3cgYmVlbiByZWxlYXNlZCBieSBTdW4uIFRoZSBsYXRlc3QgQW50IHNvdXJjZSBzdXBwb3J0cyAKKyAgICAgIHRoZSBuZXcgPHR0PmFzc2VydDwvdHQ+IHN0YXRlbWVudCBpbiB0aGUgY29tcGlsZXIgdGFzayB2aWEgdGhlIDx0dD5zb3VyY2U8L3R0PiAKKyAgICAgIGF0dHJpYnV0ZS4gSXQgYWxzbyBjb250YWlucyBhIGNvbXBhdGliaWxpdHkgZml4IG5lZWRlZCBmb3Igc29tZSBhbnQgdGFza3MKKyAgICAgIG9uIEphdmEgMS40IG92ZXIgV2luZG93cyBYUC4gSWYgeW91IGhhdmUgcHJvYmxlbXMgcnVubmluZyBBbnQgMS40LjEgb24gV2luWFAvSmF2YSAxLjQsCisgICAgICBwbGVhc2UgdXNlIGEgcmVjZW50IGJ1aWxkIG9yIGNvbXBpbGUgeW91ciBvd24gdmVyc2lvbiBmcm9tIHRoZSBzb3VyY2UgdHJlZS4gCisgICAgPC9wPgorICA8L3NlY3Rpb24+CisgIAorICA8c2VjdGlvbiBuYW1lPSJTZWUgb3VyIG5ldyBsb2dvISI+CisgICAgPGgzPkhhdmUgYSBsb29rIGF0IG91ciBuZXcgY29vbCBsb2dvITwvaDM+CisgIDwvc2VjdGlvbj4KKyAgCisgIDxzZWN0aW9uIG5hbWU9IkFudCAxLjQuMSI+CisgIDxoMz4xMSBPY3RvYmVyIDIwMDEgQW50IDEuNC4xIHJlbGVhc2VkICE8L2gzPgorICA8cD5QbGVhc2UgdmlzaXQgdGhlIAorICAgICA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyI+CisgICAgIGRvd25sb2FkIGFyZWE8L2E+LiAKKyAgICAgPC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iQmVzdC1QcmFjdGljZXMgUHJvZmlsZSBvZiBBbnQgYXQgU3VuJmFwb3M7cyBEb3QtQ29tIEJ1aWxkZXIiPgorICAgICAgPHA+U3VuIGhhcyByZWxlYXNlZCBhbiBpbnRyb2R1Y3RvcnkgYXJ0aWNsZSBvbiBBbnQgb24gdGhlaXIKKyAgICAgIERvdC1Db20gQnVpbGRlciBzaXRlIG9uIE1heSYjMTYwOzMwJiMxNjA7MjAwMS4gU2VlIDxhCisgICAgICBocmVmPSJodHRwOi8vZGNiLnN1bi5jb20vcHJhY3RpY2VzL3Byb2ZpbGVzL2FudC5qc3AiPmh0dHA6Ly9kY2Iuc3VuLmNvbS9wcmFjdGljZXMvcHJvZmlsZXMvYW50LmpzcDwvYT48L3A+CisgIDwvc2VjdGlvbj4KKworCis8L2JvZHk+Cis8L2RvY3VtZW50PgorCmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9iaW5kb3dubG9hZC54bWwgYi90cnVuay94ZG9jcy9iaW5kb3dubG9hZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhYTkyMQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL2JpbmRvd25sb2FkLnhtbApAQCAtMCwwICsxLDE3NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8dGl0bGU+QmluYXJ5IERpc3RyaWJ1dGlvbnM8L3RpdGxlPgorICAgIDxiYXNlLz4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iRG93bmxvYWRpbmcgQW50Ij4KKworPHA+VXNlIHRoZSBsaW5rcyBiZWxvdyB0byBkb3dubG9hZCBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQW50IGZyb20KK29uZSBvZiBvdXIgbWlycm9ycy4gIEl0IGlzIGdvb2QgcHJhY3RpY2UgdG8KKzxhIGhyZWY9Iltsb2NhdGlvbl0jVmVyaWZ5IFJlbGVhc2VzIj52ZXJpZnkgdGhlIGludGVncml0eTwvYT4KK29mIHRoZSBkaXN0cmlidXRpb24gZmlsZXMsIGVzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBvbmUgb2Ygb3VyCittaXJyb3Igc2l0ZXMuICBJbiBvcmRlciB0byBkbyB0aGlzIHlvdSBtdXN0IHVzZSB0aGUgc2lnbmF0dXJlcyBmcm9tCitvdXIgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50LyI+bWFpbiBkaXN0cmlidXRpb24KK2RpcmVjdG9yeTwvYT4uPC9wPgorCis8cD5BbnQgaXMgZGlzdHJpYnV0ZWQgYXMgPGNvZGU+emlwPC9jb2RlPiwgPGNvZGU+dGFyLmd6PC9jb2RlPiBhbmQKKzxjb2RlPnRhci5iejI8L2NvZGU+IGFyY2hpdmVzIC0gdGhlIGNvbnRlbnRzIGFyZSB0aGUgc2FtZS4gIFBsZWFzZQorbm90ZSB0aGF0IHRoZSA8Y29kZT50YXIuKjwvY29kZT4gYXJjaGl2ZXMgY29udGFpbiBmaWxlIG5hbWVzIGxvbmdlcgordGhhbiAxMDAgY2hhcmFjdGVycyBhbmQgaGF2ZSBiZWVuIGNyZWF0ZWQgdXNpbmcgR05VIHRhciBleHRlbnNpb25zLgorVGh1cyB0aGV5IG11c3QgYmUgdW50YXJyZWQgd2l0aCBhIEdOVSBjb21wYXRpYmxlIHZlcnNpb24gb2YKKzxjb2RlPnRhcjwvY29kZT4uPC9wPgorCis8cD5JbiBhZGRpdGlvbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5qcGFja2FnZS5vcmciPkpQYWNrYWdlCitwcm9qZWN0PC9hPiBwcm92aWRlcyBSUE1zIGF0IHRoZWlyIG93biBkaXN0cmlidXRpb24gc2l0ZS48L3A+CisKKzxwPklmIHlvdSBkbyBub3Qgc2VlIHRoZSBmaWxlIHlvdSBuZWVkIGluIHRoZSBsaW5rcyBiZWxvdywgcGxlYXNlIHNlZQordGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC8iPm1hc3RlciBkaXN0cmlidXRpb24KK2RpcmVjdG9yeTwvYT4gb3IsIHByZWZlcmFibHksIGl0cyA8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvIj5taXJyb3I8L2E+LjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJNaXJyb3IiPgorCis8cD5Zb3UgYXJlIGN1cnJlbnRseSB1c2luZyA8Yj5bcHJlZmVycmVkXTwvYj4uICBJZiB5b3UgZW5jb3VudGVyIGEKK3Byb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmIGFsbAorbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlIDxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZgordGhlIG1pcnJvcnMgbGlzdCkgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLjwvcD4KKworPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciI+CitPdGhlciBtaXJyb3JzOiA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+CitbaWYtYW55IGh0dHBdCisgIFtmb3IgaHR0cF08b3B0aW9uIHZhbHVlPSJbaHR0cF0iPltodHRwXTwvb3B0aW9uPltlbmRdCitbZW5kXQorW2lmLWFueSBmdHBdCisgIFtmb3IgZnRwXTxvcHRpb24gdmFsdWU9IltmdHBdIj5bZnRwXTwvb3B0aW9uPltlbmRdCitbZW5kXQorW2lmLWFueSBiYWNrdXBdCisgIFtmb3IgYmFja3VwXTxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPltlbmRdCitbZW5kXQorPC9zZWxlY3Q+Cis8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2hhbmdlIiAvPgorPC9mb3JtPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJDdXJyZW50IFJlbGVhc2Ugb2YgQW50Ij4KKworPHA+Q3VycmVudGx5LCBBcGFjaGUgQW50IDEuNy4wIGlzIHRoZSBiZXN0IGF2YWlsYWJsZSB2ZXJzaW9uLCBzZWUgdGhlCis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvUkVBRE1FLmh0bWwiPnJlbGVhc2Ugbm90ZXM8L2E+LjwvcD4KKworPGRpdiBjbGFzcz0id2FybmluZyI+Cis8ZGl2IGNsYXNzPSJsYWJlbCI+Tm90ZTwvZGl2PgorPGRpdiBjbGFzcz0iY29udGVudCI+QW50IDEuNy4wIGhhcyBiZWVuIHJlbGVhc2VkIG9uIDE5LURlYy0yMDA2IGFuZAorbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIG1pcnJvcnMgZm9yIGEgZmV3IGRheXMuPC9kaXY+Cis8L2Rpdj4KKzxicj48L2JyPgorPGRpdiBjbGFzcz0id2FybmluZyI+Cis8ZGl2IGNsYXNzPSJsYWJlbCI+VGFyIGZpbGVzIG1heSByZXF1aXJlIGdudSB0YXIgdG8gZXh0cmFjdDwvZGl2PgorPGRpdiBjbGFzcz0iY29udGVudCI+VGFyIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gY29udGFpbiBsb25nIGZpbGUgbmFtZXMsIGFuZCBtYXkKKyByZXF1aXJlIGdudSB0YXIgdG8gZG8gdGhlIGV4dHJhY3Rpb24uPC9kaXY+Cis8L2Rpdj4KKworPHVsPgorPGxpPjxjb2RlPi56aXA8L2NvZGU+IGFyY2hpdmU6Cis8YSBocmVmPSJbcHJlZmVycmVkXS9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4uemlwIj5hcGFjaGUtYW50LTEuNy4wLWJpbi56aXA8L2E+CitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2JpbmFyaWVzL2FwYWNoZS1hbnQtMS43LjAtYmluLnppcC5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L2JpbmFyaWVzL2FwYWNoZS1hbnQtMS43LjAtYmluLnppcC5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4uemlwLm1kNSI+TUQ1PC9hPl08L2xpPgorCis8bGk+PGNvZGU+LnRhci5nejwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9iaW5hcmllcy9hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuZ3oiPmFwYWNoZS1hbnQtMS43LjAtYmluLnRhci5nejwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmd6LmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmd6LnNoYTEiPlNIQTE8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9iaW5hcmllcy9hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuZ3oubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmJ6MjwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9iaW5hcmllcy9hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuYnoyIj5hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuYnoyPC9hPgorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9iaW5hcmllcy9hcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuYnoyLmFzYyI+UEdQPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmJ6Mi5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0xLjcuMC1iaW4udGFyLmJ6Mi5tZDUiPk1ENTwvYT5dPC9saT4KKzwvdWw+Cis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iT2xkIEFudCBSZWxlYXNlcyI+CisKKzxwPk9sZGVyIHJlbGVhc2VzIG9mIEFudCBjYW4gYmUgZm91bmQgPGEKK2hyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvIj5oZXJlPC9hPi4gIFRob3NlCityZWxlYXNlcyBhcmUgb25seSBwcm92aWRlZCBhcyA8Y29kZT56aXA8L2NvZGU+IGFyY2hpdmVzIHRoYXQgY2FuIGJlCitleHRyYWN0ZWQgYnkgPGNvZGU+amFyIHhmIDwvY29kZT48ZW0+YXJjaGl2ZS56aXA8L2VtPiAtIHdlIGhpZ2hseQorcmVjb21tZW5kIHRvIG5vdCB1c2UgdGhvc2UgcmVsZWFzZXMgYnV0IHVwZ3JhZGUgdG8gQW50J3MgPGEKK2hyZWY9Iltsb2NhdGlvbl0jQ3VycmVudCBSZWxlYXNlIG9mIEFudCI+bGF0ZXN0PC9hPiByZWxlYXNlLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJWZXJpZnkgUmVsZWFzZXMiPgorCis8cD5JdCBpcyBlc3NlbnRpYWwgdGhhdCB5b3UgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQKK2ZpbGVzIHVzaW5nIHRoZSBQR1Agc2lnbmF0dXJlIG9yIHRoZSBTSEExIG9yIE1ENSBjaGVja3N1bXMuICBUaGUKK2NoZWNrc3VtcyBhcmUgbm90IGFzIHN0cm9uZyBpbmRpY2F0b3JzIGFzIHRoZSBQR1Agc2lnbmF0dXJlLjwvcD4KKworPHA+VGhlIFBHUCBzaWduYXR1cmVzIGNhbiBiZSB2ZXJpZmllZCB1c2luZyBQR1Agb3IgR1BHLiAgRmlyc3QKK2Rvd25sb2FkIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvS0VZUyI+S0VZUzwvYT4KK2FzIHdlbGwgYXMgdGhlIDxjb2RlPmFzYzwvY29kZT4gc2lnbmF0dXJlIGZpbGUgZm9yIHRoZSBwYXJ0aWN1bGFyCitkaXN0cmlidXRpb24uICBNYWtlIHN1cmUgeW91IGdldCB0aGVzZSBmaWxlcyBmcm9tIHRoZSA8YQoraHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50LyI+bWFpbiBkaXN0cmlidXRpb24KK2RpcmVjdG9yeTwvYT4sIHJhdGhlciB0aGFuIGZyb20gYSBtaXJyb3IuIFRoZW4gdmVyaWZ5IHRoZSBzaWduYXR1cmVzCit1c2luZzwvcD4KKworPHA+PGNvZGU+CislIHBncGsgLWEgS0VZUzxiciAvPgorJSBwZ3B2IGFwYWNoZS1hbnQtMS43LjAtYmluLnRhci5nei5hc2M8YnIgLz4KKzwvY29kZT4KKzxlbT5vcjwvZW0+PGJyIC8+Cis8Y29kZT4KKyUgcGdwIC1rYSBLRVlTPGJyIC8+CislIHBncCBhcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuZ3ouYXNjPGJyIC8+Cis8L2NvZGU+Cis8ZW0+b3I8L2VtPjxiciAvPgorPGNvZGU+CislIGdwZyAtLWltcG9ydCBLRVlTPGJyIC8+CislIGdwZyAtLXZlcmlmeSBhcGFjaGUtYW50LTEuNy4wLWJpbi50YXIuZ3ouYXNjCis8L2NvZGU+PC9wPgorCis8cD5BIGNvbW1hbmQgbGluZSB2ZXJzaW9uIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251cGcub3JnL2Rvd25sb2FkLyI+R251UEc8L2E+IAoraXMgYWxzbyBhdmFpbGFibGUgZm9yIFdpbmRvd3MgdXNlcnMuICBGb2xsb3cgdGhlIAorPGEgaHJlZj0iaHR0cDovL3d3dy5nbnVwZy5vcmcvKGVuKS9kb2N1bWVudGF0aW9uL2ZhcXMuaHRtbCNxNC4xOSI+aW5zdHJ1Y3Rpb25zPC9hPiAKK3RvIHZlcmlmeSB0aGUgcGFja2FnZS48L3A+CisKKzxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdmVyaWZ5IHRoZSBjaGVja3N1bXMgb24gdGhlIGZpbGVzLiAgVW5peAorcHJvZ3JhbXMgY2FsbGVkIDxjb2RlPm1kNTwvY29kZT4vPGNvZGU+c2hhMTwvY29kZT4gb3IKKzxjb2RlPm1kNXN1bTwvY29kZT4vPGNvZGU+c2hhMXN1bTwvY29kZT4gYXJlIGluY2x1ZGVkIGluIG1hbnkgdW5peAorZGlzdHJpYnV0aW9ucy4gIDxjb2RlPipzdW08L2NvZGU+IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YgPGEKK2hyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXh0dXRpbHMvdGV4dHV0aWxzLmh0bWwiPkdOVQorVGV4dHV0aWxzPC9hPi4gIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20gPGEKK2hyZWY9Imh0dHA6Ly93d3cuZm91cm1pbGFiLmNoL21kNS8iPmhlcmU8L2E+LCA8YQoraHJlZj0iaHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS8iPmhlcmU8L2E+LiAgPGEKK2hyZWY9Imh0dHA6Ly93d3cuc2xhdmFzb2Z0LmNvbS9mc3VtLyI+ZnN1bTwvYT4gc3VwcG9ydHMgTUQ1IGFuZAorU0hBMS48L3A+CisKKzxwPldlIGhpZ2hseSByZWNvbW1lbmQgdG8gdmVyaWZ5IHRoZSBQR1Agc2lnbmF0dXJlLCB0aG91Z2guPC9wPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9idWdzLnhtbCBiL3RydW5rL3hkb2NzL2J1Z3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjcyYTcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9idWdzLnhtbApAQCAtMCwwICsxLDE3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iIj5BbnRvaW5lIExldnktTGFtYmVydDwvYXV0aG9yPgorICAgIDx0aXRsZT5CdWcgZGF0YWJhc2U8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iQnVnIERhdGFiYXNlIj4KKyAgICAgICAgIDxwPgorICAgICAgICAgICBUaGlzIHBhZ2UgZ2l2ZXMgeW91IHNvbWUgYm9va21hcmtzIHRvIHVzZSB0aGUgQnVnemlsbGEgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhLyI+CisgICAgICAgICAgICBBcGFjaGUgQnVnIERhdGFiYXNlPC9hPi4KKyAgICAgICAgIDwvcD4KKyAgICAgICAgIDxwPgorICAgICAgICAgICBUaGlzIGxpbmsgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnLyI+aXNzdWVzLmFwYWNoZS5vcmc8L2E+IGNvbm5lY3RzIHlvdQorICAgICAgICAgICB0byB0aGUgY29tcGxldGUgbGlzdCBvZiBBcGFjaGUgQnVnIERhdGFiYXNlIHN5c3RlbXMuCisgICAgICAgICA8L3A+CisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJIYXMgSXQgQmVlbiBSZXBvcnRlZD8iPgorICAgICAgICAgPHA+CisgICAgICAgICAgICBJZiB0aGUgY3VycmVudCBuaWdodGx5IGJ1aWxkIGRvZXNuJ3QgcmVzb2x2ZSB5b3VyIHByb2JsZW0sIGl0IGlzCisgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IHNvbWVvbmUgZWxzZSBoYXMgcmVwb3J0ZWQgdGhlIGlzc3VlLiBJdCBpcyB0aW1lIHRvCisgICAgICAgICAgICBsb29rIGF0IHRoZSBidWcgZGF0YWJhc2UuIFRoaXMgc3lzdGVtIGlzIGVhc3kgdG8gdXNlLCBhbmQgaXQgd2lsbAorICAgICAgICAgICAgbGV0IHlvdSBzZWFyY2ggdGhlIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9idWdsaXN0LmNnaT9idWdfc3RhdHVzPVVOQ09ORklSTUVEJmFtcDtidWdfc3RhdHVzPU5FVyZhbXA7YnVnX3N0YXR1cz1BU1NJR05FRCZhbXA7YnVnX3N0YXR1cz1SRU9QRU5FRCZhbXA7ZW1haWwxPSZhbXA7ZW1haWx0eXBlMT1zdWJzdHJpbmcmYW1wO2VtYWlsYXNzaWduZWRfdG8xPTEmYW1wO2VtYWlsMj0mYW1wO2VtYWlsdHlwZTI9c3Vic3RyaW5nJmFtcDtlbWFpbHJlcG9ydGVyMj0xJmFtcDtidWdpZHR5cGU9aW5jbHVkZSZhbXA7YnVnX2lkPSZhbXA7Y2hhbmdlZGluPSZhbXA7dm90ZXM9JmFtcDtjaGZpZWxkZnJvbT0mYW1wO2NoZmllbGR0bz1Ob3cmYW1wO2NoZmllbGR2YWx1ZT0mYW1wO3Byb2R1Y3Q9QW50JmFtcDtzaG9ydF9kZXNjPSZhbXA7c2hvcnRfZGVzY190eXBlPXN1YnN0cmluZyZhbXA7bG9uZ19kZXNjPSZhbXA7bG9uZ19kZXNjX3R5cGU9c3Vic3RyaW5nJmFtcDtidWdfZmlsZV9sb2M9JmFtcDtidWdfZmlsZV9sb2NfdHlwZT1zdWJzdHJpbmcmYW1wO2tleXdvcmRzPSZhbXA7a2V5d29yZHNfdHlwZT1hbnl3b3JkcyZhbXA7ZmllbGQwLTAtMD1ub29wJmFtcDt0eXBlMC0wLTA9bm9vcCZhbXA7dmFsdWUwLTAtMD0mYW1wO29yZGVyPWJ1Z3MuYnVnX2lkIj4KKyAgICAgICAgICAgIGN1cnJlbnRseSBvcGVuPC9hPiBhbmQgcmVzb2x2ZWQgYnVncyB0byBzZWUgaWYgeW91ciBwcm9ibGVtIGhhcworICAgICAgICAgICAgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLiBJZiB5b3VyIHByb2JsZW0gaGFzIGJlZW4gcmVwb3J0ZWQsIHlvdSBjYW4KKyAgICAgICAgICAgIHNlZSB3aGV0aGVyIGFueSBvZiB0aGUgZGV2ZWxvcGVycyBoYXZlIGNvbW1lbnRlZCwgc3VnZ2VzdGluZworICAgICAgICAgICAgd29ya2Fyb3VuZHMsIG9yIHRoZSByZWFzb24gZm9yIHRoZSBidWcsIGV0Yy4gT3IgeW91IG1heSBoYXZlCisgICAgICAgICAgICBpbmZvcm1hdGlvbiB0byBhZGQgKHNlZSBhYm91dCBjcmVhdGluZyBhbmQgbW9kaWZ5aW5nIGJ1ZyByZXBvcnRzCisgICAgICAgICAgICBiZWxvdyksIGluIHdoaWNoIGNhc2UsIGdvIHJpZ2h0IGFoZWFkIGFuZCBhZGQgdGhlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgSWYgeW91IGRvbid0IGhhdmUgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHlvdSBtYXkganVzdCB3YW50CisgICAgICAgICAgICB0byB2b3RlIGZvciB0aGlzIGJ1ZywgYW5kIHBlcmhhcHMKKyAgICAgICAgICAgIGFkZCB5b3Vyc2VsZiB0byB0aGUgPGNvZGU+Q0M8L2NvZGU+IGxpc3QgdG8gZm9sbG93IHRoZSBwcm9ncmVzcworICAgICAgICAgICAgb2YgdGhpcyBidWcuCisgICAgICAgICA8L3A+CisgICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvYnVnbGlzdC5jZ2k/cXVlcnlfZm9ybWF0PWFkdmFuY2VkJmFtcDtzaG9ydF9kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO3Nob3J0X2Rlc2M9JmFtcDtwcm9kdWN0PUFudCZhbXA7bG9uZ19kZXNjX3R5cGU9c3Vic3RyaW5nJmFtcDtsb25nX2Rlc2M9JmFtcDtidWdfZmlsZV9sb2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZhbXA7YnVnX2ZpbGVfbG9jPSZhbXA7a2V5d29yZHNfdHlwZT1hbGx3b3JkcyZhbXA7a2V5d29yZHM9JmFtcDtidWdfc3RhdHVzPU5FVyZhbXA7YnVnX3N0YXR1cz1BU1NJR05FRCZhbXA7YnVnX3N0YXR1cz1SRU9QRU5FRCZhbXA7ZW1haWxhc3NpZ25lZF90bzE9MSZhbXA7ZW1haWx0eXBlMT1zdWJzdHJpbmcmYW1wO2VtYWlsMT0mYW1wO2VtYWlsYXNzaWduZWRfdG8yPTEmYW1wO2VtYWlscmVwb3J0ZXIyPTEmYW1wO2VtYWlsY2MyPTEmYW1wO2VtYWlsdHlwZTI9c3Vic3RyaW5nJmFtcDtlbWFpbDI9JmFtcDtidWdpZHR5cGU9aW5jbHVkZSZhbXA7YnVnX2lkPSZhbXA7dm90ZXM9JmFtcDtjaGZpZWxkZnJvbT0mYW1wO2NoZmllbGR0bz1Ob3cmYW1wO2NoZmllbGR2YWx1ZT0mYW1wO2ZpZWxkMC0wLTA9bm9vcCZhbXA7dHlwZTAtMC0wPW5vb3AmYW1wO3ZhbHVlMC0wLTA9Ij5PcGVuIEFudCBidWdzIGJ5IG9yZGVyIG9mIHByaW9yaXR5PC9hPi48L3A+CisgICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvYnVnbGlzdC5jZ2k/cXVlcnlfZm9ybWF0PWFkdmFuY2VkJmFtcDtzaG9ydF9kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO3Nob3J0X2Rlc2M9JmFtcDtwcm9kdWN0PUFudCZhbXA7bG9uZ19kZXNjX3R5cGU9c3Vic3RyaW5nJmFtcDtsb25nX2Rlc2M9JmFtcDtidWdfZmlsZV9sb2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZhbXA7YnVnX2ZpbGVfbG9jPSZhbXA7a2V5d29yZHNfdHlwZT1hbGx3b3JkcyZhbXA7a2V5d29yZHM9JmFtcDtidWdfc3RhdHVzPU5FVyZhbXA7YnVnX3N0YXR1cz1BU1NJR05FRCZhbXA7YnVnX3N0YXR1cz1SRU9QRU5FRCZhbXA7ZW1haWxhc3NpZ25lZF90bzE9MSZhbXA7ZW1haWx0eXBlMT1zdWJzdHJpbmcmYW1wO2VtYWlsMT0mYW1wO2VtYWlsYXNzaWduZWRfdG8yPTEmYW1wO2VtYWlscmVwb3J0ZXIyPTEmYW1wO2VtYWlsY2MyPTEmYW1wO2VtYWlsdHlwZTI9c3Vic3RyaW5nJmFtcDtlbWFpbDI9JmFtcDtidWdpZHR5cGU9aW5jbHVkZSZhbXA7YnVnX2lkPSZhbXA7dm90ZXM9JmFtcDtjaGZpZWxkZnJvbT0mYW1wO2NoZmllbGR0bz1Ob3cmYW1wO2NoZmllbGR2YWx1ZT0mYW1wO2ZpZWxkMC0wLTA9bm9vcCZhbXA7dHlwZTAtMC0wPW5vb3AmYW1wO3ZhbHVlMC0wLTA9JmFtcDtvcmRlcj1idWdzLnZvdGVzLGJ1Z3MucHJpb3JpdHklMkNidWdzLmJ1Z19zZXZlcml0eSZhbXA7cXVlcnlfYmFzZWRfb249Ij5PcGVuIEFudCBidWdzIGJ5IG51bWJlciBvZiB2b3RlczwvYT4uPC9wPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJGaWxpbmcgYSBCdWcgUmVwb3J0Ij4KKyAgICAgICAgIDxwPgorICAgICAgICAgICAgUGxlYXNlIHJlYWQgb3VyIGRvY3VtZW50IGFib3V0IDxhIGhyZWY9InByb2JsZW1zLmh0bWwiPnByb2JsZW1zPC9hPgorICAgICAgICAgICAgYmVmb3JlIGRlY2lkaW5nIHRoYXQgdGhlcmUgaXMgYW4gdW5yZXBvcnRlZAorICAgICAgICAgICAgYnVnIGluIEFudC4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFlvdSBoYXZlIGEgZmV3IGNob2ljZXMgYXQgdGhpcyBwb2ludC4gWW91IGNhbiBzZW5kCisgICAgICAgICAgICBhbiBlbWFpbCB0byB0aGUgPGNvZGU+dXNlcjwvY29kZT4gbWFpbGluZyBsaXN0CisgICAgICAgICAgICB0byBzZWUgaWYKKyAgICAgICAgICAgIG90aGVycyBoYXZlIGVuY291bnRlcmVkIHlvdXIgaXNzdWUgYW5kIGZpbmQgb3V0IGhvdyB0aGV5IG1heQorICAgICAgICAgICAgaGF2ZSB3b3JrZWQgYXJvdW5kIGl0LiBJZiBhZnRlciBzb21lIGRpc2N1c3Npb24sIHlvdSBmZWVsIGl0CisgICAgICAgICAgICBpcyB0aW1lIHRvIGNyZWF0ZQorICAgICAgICAgICAgYSBidWcgcmVwb3J0LCB0aGlzIGlzIGEgc2ltcGxlIG9wZXJhdGlvbiBpbiB0aGUgYnVnIGRhdGFiYXNlLgorICAgICAgICAgICAgUGxlYXNlIHRyeSB0byBwcm92aWRlIGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgcG9zc2libGUgaW4gb3JkZXIKKyAgICAgICAgICAgIHRvIGFzc2lzdCB0aGUgZGV2ZWxvcGVycyBpbiByZXNvbHZpbmcgdGhlIGJ1Zy4gUGxlYXNlIHRyeSB0byBlbnRlcgorICAgICAgICAgICAgY29ycmVjdCB2YWx1ZXMgZm9yIHRoZSB2YXJpb3VzIGlucHV0cyB3aGVuIGNyZWF0aW5nIHRoZSBidWcsIHN1Y2gKKyAgICAgICAgICAgIGFzIHdoaWNoIHZlcnNpb24gb2YgQW50IHlvdSBhcmUgcnVubmluZywgYW5kIG9uIHdoaWNoIHBsYXRmb3JtLAorICAgICAgICAgICAgZXRjLiBPbmNlIHRoZSBidWcgaXMgY3JlYXRlZCwgeW91IGNhbiBhbHNvIGFkZCBhdHRhY2htZW50cyB0bworICAgICAgICAgICAgdGhlIGJ1ZyByZXBvcnQuCisgICAgICAgICA8L3A+CisgICAgICAgICA8cD4KKyAgICAgICAgICAgIFdoYXQgaW5mb3JtYXRpb24gc2hvdWxkIHlvdSBpbmNsdWRlIGluIHlvdXIgYnVnIHJlcG9ydD8gVGhlCisgICAgICAgICAgICBlYXNpZXN0IGJ1Z3MgdG8gZml4IGFyZSB0aG9zZSB0aGF0IGFyZSBtb3N0IGVhc2lseSByZXByb2R1Y2libGUsCisgICAgICAgICAgICBzbyBpdCBpcyByZWFsbHkgaGVscGZ1bCBpZiB5b3UgY2FuIHByb2R1Y2UgYSBzbWFsbCB0ZXN0IGNhc2UgdGhhdAorICAgICAgICAgICAgZXhoaWJpdHMgdGhlIHByb2JsZW0uIEluIHRoaXMgY2FzZSwgeW91IHdvdWxkIGF0dGFjaCB0aGUgYnVpbGQgZmlsZQorICAgICAgICAgICAgYW5kIGFueSBvdGhlciBmaWxlcyBuZWNlc3NhcnkgdG8gcmVwcm9kdWNlIHRoZSBwcm9ibGVtLCBwcm9iYWJseQorICAgICAgICAgICAgcGFja2VkIHRvZ2V0aGVyIGluIGFuIGFyY2hpdmUuIElmIHlvdSBjYW4ndCBwcm9kdWNlIGEgdGVzdCBjYXNlLAorICAgICAgICAgICAgeW91IHNob3VsZCB0cnkgdG8gaW5jbHVkZSBhIHNuaXBwZXQgZnJvbSB5b3VyIGJ1aWxkIGZpbGUgYW5kIHRoZQorICAgICAgICAgICAgcmVsZXZhbnQgc2VjdGlvbnMgZnJvbSB0aGUgdmVyYm9zZSBvciBkZWJ1ZyBvdXRwdXQgZnJvbSBBbnQuIFRyeQorICAgICAgICAgICAgdG8gaW5jbHVkZSB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIHdoZXJlIEFudCBzdGF0ZXMgdGhlIHZlcnNpb24sCisgICAgICAgICAgICB0aGUgT1MgYW5kIFZNIGluZm9ybWF0aW9uLCBldGMuIEFzIGRlYnVnIG91dHB1dCBpcyBsaWtlbHkgdG8gYmUKKyAgICAgICAgICAgIHZlcnkgbGFyZ2UsIGl0J3MgYmVzdCB0byByZW1vdmUgYW55IG91dHB1dCB0aGF0IGlzIG5vdAorICAgICAgICAgICAgcmVsZXZhbnQuIE9uY2UgdGhlIGJ1ZyBpcyBlbnRlcmVkIGludG8gdGhlIGJ1ZyBkYXRhYmFzZSwgeW91CisgICAgICAgICAgICB3aWxsIGJlIGtlcHQgaW5mb3JtZWQgYnkgZW1haWwgYWJvdXQgcHJvZ3Jlc3Mgb24gdGhlIGJ1Zy4gSWYKKyAgICAgICAgICAgIHlvdSByZWNlaXZlIGVtYWlsIGFza2luZyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgcGxlYXNlIHRyeSB0bworICAgICAgICAgICAgcmVzcG9uZCwgYXMgaXQgd2lsbCBhaWQgaW4gdGhlIHJlc29sdXRpb24gb2YgeW91ciBidWcuCisgICAgICAgICA8L3A+CisgICAgICAgICA8cD4KKyAgICAgICAgICAgIFRvIGNyZWF0ZSB0aGUgYnVnIHJlcG9ydCBoaXQgdGhpcworICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1BbnQiPgorICAgICAgICAgICAgbGluazwvYT4uCisgICAgICAgICA8L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFza2luZyBmb3IgYW4gRW5oYW5jZW1lbnQiPgorICAgICAgICAgPHA+CisgICAgICAgICAgICBTb21ldGltZXMsIHlvdSBtYXkgZmluZCB0aGF0IEFudCBqdXN0IGRvZXNuJ3QgZG8gd2hhdCB5b3UgbmVlZCBpdAorICAgICAgICAgICAgdG8uIEl0IGlzbid0IGEgYnVnLCBhcyBzdWNoLCBzaW5jZSBBbnQgaXMgd29ya2luZyB0aGUgd2F5IGl0IGlzCisgICAgICAgICAgICBzdXBwb3NlZCB0byB3b3JrLiBQZXJoYXBzIGl0IGlzIHNvbWUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGZvcgorICAgICAgICAgICAgYSB0YXNrIHRoYXQgaGFzbid0IGJlZW4gdGhvdWdodCBvZiB5ZXQsIG9yIG1heWJlIGEgY29tcGxldGVseSBuZXcKKyAgICAgICAgICAgIHRhc2suIEZvciB0aGVzZSBzaXR1YXRpb25zLCB5b3Ugd2lsbAorICAgICAgICAgICAgd2FudCB0byByYWlzZSBhbiA8aT5lbmhhbmNlbWVudCByZXF1ZXN0PC9pPi4gRW5oYW5jZW1lbnQgcmVxdWVzdHMKKyAgICAgICAgICAgIGFyZSBtYW5hZ2VkIHVzaW5nIHRoZSBzYW1lIEFwYWNoZSBCdWcgRGF0YWJhc2UgZGVzY3JpYmVkIGFib3ZlLgorICAgICAgICAgICAgVGhlc2UgYXJlIGp1c3QgYSBkaWZmZXJlbnQgdHlwZSBvZiBidWcgcmVwb3J0LiBJZiB5b3UgbG9vayBpbiB0aGUKKyAgICAgICAgICAgIGJ1ZyBkYXRhYmFzZSwgeW91IHdpbGwgc2VlIHRoYXQgb25lIG9mIHRoZSBzZXZlcml0eSBzZXR0aW5ncyBmb3IKKyAgICAgICAgICAgIGEgYnVnIGlzICZxdW90O0VuaGFuY2VtZW50JnF1b3Q7LiBKdXN0IGZpbGwgdGhlIGJ1ZyByZXBvcnQgaW4sCisgICAgICAgICAgICBzZXQgdGhlIHNldmVyaXR5IG9mIHRoZSBidWcgdG8gJnF1b3Q7RW5oYW5jZW1lbnQmcXVvdDssIGFuZAorICAgICAgICAgICAgc3RhdGUgaW4gdGhlIGRlc2NyaXB0aW9uIGhvdyB5b3Ugd291bGQgbGlrZSB0byBoYXZlIEFudCBlbmhhbmNlZC4KKyAgICAgICAgICAgIEFnYWluLCB5b3Ugc2hvdWxkIGZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBleGlzdGluZworICAgICAgICAgICAgZW5oYW5jbWVudCByZXF1ZXN0cyB0aGF0IGNvdmVyIHlvdXIgbmVlZHMuIElmIHNvLCBqdXN0IGFkZCB5b3VyCisgICAgICAgICAgICB2b3RlIHRvIHRoZXNlLgorICAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PUFudCZhbXA7YnVnX3NldmVyaXR5PWVuaGFuY2VtZW50Ij4KKyAgICAgICAgICBDcmVhdGUgYW4gZW5oYW5jZW1lbnQgcmVwb3J0PC9hPgorCisgICAgICAgIDwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iRml4aW5nIHRoZSBCdWciPgorICAgICAgICAgPHA+CisgICAgICAgICAgICBJZiB5b3UgYXJlbid0IHNhdGlzZmllZCB3aXRoIGp1c3QgZmlsaW5nIGEgYnVnIHJlcG9ydCwgeW91IGNhbgorICAgICAgICAgICAgdHJ5IHRvIGZpbmQgdGhlIGNhdXNlIG9mIHRoZSBwcm9ibGVtIGFuZCBwcm92aWRlIGEgZml4IHlvdXJzZWxmLgorICAgICAgICAgICAgVGhlIGJlc3Qgd2F5IHRvIGRvIHRoYXQgaXMgYnkgd29ya2luZyB3aXRoIHRoZSBsYXRlc3QgY29kZSBmcm9tIFN1YnZlcnNpb24uCisgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHdvcmsgd2l0aCB0aGUgc291cmNlIGNvZGUgYXZhaWxhYmxlIGZyb20gdGhlCisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIj4KKyAgICAgICAgICAgIHNvdXJjZSBkaXN0cmlidXRpb25zPC9hPi4gSWYgeW91CisgICAgICAgICAgICBhcmUgZ29pbmcgdG8gdGFja2xlIHRoZSBwcm9ibGVtIGF0IHRoaXMgbGV2ZWwsIHlvdSBtYXkgd2FudCB0bworICAgICAgICAgICAgZGlzY3VzcyBzb21lIGRldGFpbHMgZmlyc3Qgb24gdGhlIDxjb2RlPmRldjwvY29kZT4KKyAgICAgICAgICAgIG1haWxpbmcgbGlzdC4gT25jZSB5b3UgaGF2ZSBhIGZpeCBmb3IgdGhlIHByb2JsZW0sIHlvdSBtYXkgc3VibWl0CisgICAgICAgICAgICB0aGUgZml4IGFzIGEgPGk+cGF0Y2g8L2k+IHRvIGVpdGhlciB0aGUKKyAgICAgICAgICAgIDxjb2RlPmRldjwvY29kZT4gbWFpbGluZworICAgICAgICAgICAgbGlzdCwgb3IgZW50ZXIgdGhlIGJ1ZyBkYXRhYmFzZSBhcyBkZXNjcmliZWQgYWJvdmUgYW5kIGF0dGFjaCB0aGUKKyAgICAgICAgICAgIHBhdGNoIHRvIHRoZSBidWcgcmVwb3J0LiBVc2luZyB0aGUgYnVnIGRhdGFiYXNlIGhhcyB0aGUgYWR2YW50YWdlCisgICAgICAgICAgICBvZiBiZWluZyBhYmxlIHRvIHRyYWNrIHRoZSBwcm9ncmVzcyBvZiB5b3VyIHBhdGNoLgorICAgICAgICAgPC9wPgorICAgICAgICAgPHA+CisgICAgICAgICAgICBJZiB5b3UgaGF2ZSBhIHBhdGNoIHRvIHN1Ym1pdCBhbmQgYXJlIHNlbmRpbmcgaXQgdG8gdGhlCisgICAgICAgICAgICA8Y29kZT5kZXY8L2NvZGU+IG1haWxpbmcgbGlzdCwKKyAgICAgICAgICAgIHByZWZpeCAmcXVvdDtbUEFUQ0hdJnF1b3Q7CisgICAgICAgICAgICB0byB5b3VyIG1lc3NhZ2Ugc3ViamVjdCAodGhpcyBpcyBhbHNvIGEgZ29vZCBpZGVhIGZvcgorICAgICAgICAgICAgYSBzdWJqZWN0IGxpbmUgaW4gdGhlIGJ1ZyBkYXRhYmFzZSkuCisgICAgICAgICAgICBQbGVhc2UgaW5jbHVkZSBhbnkgcmVsZXZhbnQgYnVnIG51bWJlcnMuCisgICAgICAgICAgICBQYXRjaCBmaWxlcyBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIHRoZSA8Y29kZT4tdTwvY29kZT4KKyAgICAgICAgICAgIG9wdGlvbiBvZiB0aGUKKyAgICAgICAgICAgIDxjb2RlPmRpZmY8L2NvZGU+IG9yIDxjb2RlPnN2biBkaWZmPC9jb2RlPiBjb21tYW5kLiBGb3IKKyAgICAgICAgICAgIGV4YW1wbGU6PGJyPjwvYnI+PGJyPjwvYnI+CisgICAgICAgICAgICA8Zm9udCBmYWNlPSJ2ZXJkYW5hIiBzaXplPSItMSI+CisgICAgICAgICAgICBkaWZmIC11IEphdmFjLmphdmEub3JpZyBKYXZhYy5qYXZhICZndDsgamF2YWMuZGlmZnM8YnI+PC9icj48YnI+PC9icj4KKyAgICAgICAgICAgIDwvZm9udD4KKyAgICAgICAgICAgIG9yLCBpZiB5b3UgaGF2ZSBzb3VyY2UgZnJvbSBTdWJ2ZXJzaW9uOjxicj48L2JyPjxicj48L2JyPgorICAgICAgICAgICAgPGZvbnQgZmFjZT0idmVyZGFuYSIgc2l6ZT0iLTEiPgorICAgICAgICAgICAgc3ZuIGRpZmYgSmF2YWMuamF2YSAmZ3Q7IGphdmFjLmRpZmZzPGJyPjwvYnI+PGJyPjwvYnI+CisgICAgICAgICAgICA8L2ZvbnQ+CisKKyAgICAgICAgICAgTm90ZTogWW91IHNob3VsZCBnaXZlIHlvdXIgcGF0Y2ggZmlsZXMgbWVhbmluZ2Z1bCBuYW1lcy4KKyAgICAgICAgICAgVGhpcyBtYWtlcyBpdCBlYXNpZXIgZm9yIGRldmVsb3BlcnMgd2hvIG5lZWQgdG8gYXBwbHkgYSBudW1iZXIKKyAgICAgICAgICAgb2YgZGlmZmVyZW50IHBhdGNoIGZpbGVzLgorICAgICAgICA8L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKworICAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3MvYnlsYXdzLnhtbCBiL3RydW5rL3hkb2NzL2J5bGF3cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhODdhNgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL2J5bGF3cy54bWwKQEAgLTAsMCArMSw0NzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPlByb2plY3QgQnlsYXdzPC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSIiPkFwYWNoZSBBbnQgUE1DPC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisgIDxzZWN0aW9uIG5hbWU9IkFwYWNoZSBBbnQgUHJvamVjdCBCeWxhd3MiPgorICAgIDxwPgorICAgICAgVGhpcyBkb2N1bWVudCBkZWZpbmVzIHRoZSBieWxhd3MgdW5kZXIgd2hpY2ggdGhlIEFwYWNoZSBBbnQgcHJvamVjdAorICAgICAgb3BlcmF0ZXMuIEl0IGRlZmluZXMgdGhlIHJvbGVzIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIHRoZQorICAgICAgcHJvamVjdCwgd2hvIG1heSB2b3RlLCBob3cgdm90aW5nIHdvcmtzLCBob3cgY29uZmxpY3RzIGFyZSByZXNvbHZlZCwKKyAgICAgIGV0Yy4KKyAgICA8L3A+CisKKyAgICA8cD4KKyAgICAgIEFudCBpcyBhIHByb2plY3Qgb2YgdGhlCisgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi8iPkFwYWNoZSBTb2Z0d2FyZQorICAgICAgRm91bmRhdGlvbjwvYT4uICBUaGUgZm91bmRhdGlvbiBob2xkcyB0aGUgY29weXJpZ2h0IG9uIEFwYWNoZQorICAgICAgY29kZSBpbmNsdWRpbmcgdGhlIGNvZGUgaW4gdGhlICBBbnQgY29kZWJhc2UuIFRoZQorICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vZmFxLmh0bWwiPmZvdW5kYXRpb24gRkFRPC9hPgorICAgICAgZXhwbGFpbnMgdGhlIG9wZXJhdGlvbiBhbmQgYmFja2dyb3VuZCBvZiB0aGUgZm91bmRhdGlvbi4KKyAgICA8L3A+CisKKyAgICA8cD4KKyAgICAgIEFudCBpcyB0eXBpY2FsIG9mIEFwYWNoZSBwcm9qZWN0cyBpbiB0aGF0IGl0IG9wZXJhdGVzIHVuZGVyIGEgc2V0IG9mCisgICAgICBwcmluY2lwbGVzLCBrbm93biBjb2xsZWN0aXZlbHkgYXMgdGhlICZxdW90O0FwYWNoZSBXYXkmcXVvdDsuIElmIHlvdSBhcmUKKyAgICAgIG5ldyB0byBBcGFjaGUgZGV2ZWxvcG1lbnQsIHBsZWFzZSByZWZlciB0byB0aGUKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9pbmN1YmF0b3IuYXBhY2hlLm9yZyI+SW5jdWJhdG9yIHByb2plY3Q8L2E+CisgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgQXBhY2hlIHByb2plY3RzIG9wZXJhdGUuIDxiPk5vdGU6PC9iPiB0aGUKKyAgICAgIGluY3ViYXRvciBwcm9qZWN0IGhhcyBvbmx5IGJlZW4gcmVjZW50bHkgc2V0IHVwIGFuZCBkb2VzIG5vdCB5ZXQgZXhwbGFpbgorICAgICAgdGhlIEFwYWNoZSBXYXkgaW4gZ3JlYXQgZGV0YWlsLgorICAgIDwvcD4KKworICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNSb2xlcyBhbmQgUmVzcG9uc2liaWxpdGllcyI+Um9sZXMgYW5kIFJlc3BvbnNpYmlsaXRpZXM8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IiNEZWNpc2lvbiBNYWtpbmciPkhvdyBkZWNpc2lvbnMgYXJlIG1hZGU8L2E+PC9saT4KKyAgICA8L3VsPgorCisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJSb2xlcyBhbmQgUmVzcG9uc2liaWxpdGllcyI+CisgICAgPHA+CisgICAgICBBcGFjaGUgcHJvamVjdHMgZGVmaW5lIGEgc2V0IG9mIHJvbGVzIHdpdGggYXNzb2NpYXRlZCByaWdodHMgYW5kCisgICAgICByZXNwb25zaWJpbGl0aWVzLiBUaGVzZSByb2xlcyBnb3Zlcm4gd2hhdCB0YXNrcyBhbiBpbmRpdmlkdWFsIG1heSBwZXJmb3JtCisgICAgICB3aXRoaW4gdGhlIHByb2plY3QuIFRoZSByb2xlcyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zCisgICAgPC9wPgorCisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9IiNVc2VycyI+VXNlcnM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjRGV2ZWxvcGVycyI+RGV2ZWxvcGVyczwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNDb21taXR0ZXJzIj5Db21taXR0ZXJzPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1Byb2plY3QgTWFuYWdlbWVudCBDb21taXR0ZWUiPgorICAgICAgICBQcm9qZWN0IE1hbmFnZW1lbnQgQ29tbWl0dGVlIChQTUMpPC9hPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorCisgICAgPHN1YnNlY3Rpb24gbmFtZT0iVXNlcnMiPgorICAgICAgPHA+CisgICAgICAgIFRoZSBtb3N0IGltcG9ydGFudCBwYXJ0aWNpcGFudHMgaW4gdGhlIHByb2plY3QgYXJlIHBlb3BsZSB3aG8gdXNlIG91cgorICAgICAgICBzb2Z0d2FyZS4gVGhlIG1ham9yaXR5IG9mIG91ciBkZXZlbG9wZXJzIHN0YXJ0IG91dCBhcyB1c2VycyBhbmQgZ3VpZGUKKyAgICAgICAgdGhlaXIgZGV2ZWxvcG1lbnQgZWZmb3J0cyBmcm9tIHRoZSB1c2VyJ3MgcGVyc3BlY3RpdmUuCisgICAgICA8L3A+CisKKyAgICAgIDxwPgorICAgICAgICBVc2VycyBjb250cmlidXRlIHRvIHRoZSBBcGFjaGUgcHJvamVjdHMgYnkgcHJvdmlkaW5nIGZlZWRiYWNrIHRvCisgICAgICAgIGRldmVsb3BlcnMgaW4gdGhlIGZvcm0gb2YgYnVnIHJlcG9ydHMgYW5kIGZlYXR1cmUgc3VnZ2VzdGlvbnMuIEFzCisgICAgICAgIHdlbGwsIHVzZXJzIHBhcnRpY2lwYXRlIGluIHRoZSBBcGFjaGUgY29tbXVuaXR5IGJ5IGhlbHBpbmcgb3RoZXIgdXNlcnMKKyAgICAgICAgb24gbWFpbGluZyBsaXN0cyBhbmQgdXNlciBzdXBwb3J0IGZvcnVtcy4KKyAgICAgIDwvcD4KKworICAgIDwvc3Vic2VjdGlvbj4KKworICAgIDxzdWJzZWN0aW9uIG5hbWU9IkRldmVsb3BlcnMiPgorICAgICAgPHA+CisgICAgICAgIEFsbCBvZiB0aGUgdm9sdW50ZWVycyB3aG8gYXJlIGNvbnRyaWJ1dGluZyB0aW1lLCBjb2RlLCBkb2N1bWVudGF0aW9uLAorICAgICAgICBvciByZXNvdXJjZXMgdG8gdGhlIEFudCBQcm9qZWN0LiBBIGRldmVsb3BlciB0aGF0IG1ha2VzIHN1c3RhaW5lZCwKKyAgICAgICAgd2VsY29tZSBjb250cmlidXRpb25zIHRvIHRoZSBwcm9qZWN0IG1heSBiZSBpbnZpdGVkIHRvIGJlY29tZSBhCisgICAgICAgIENvbW1pdHRlciwgdGhvdWdoIHRoZSBleGFjdCB0aW1pbmcgb2Ygc3VjaCBpbnZpdGF0aW9ucyBkZXBlbmRzIG9uIG1hbnkKKyAgICAgICAgZmFjdG9ycy4KKyAgICAgIDwvcD4KKyAgICA8L3N1YnNlY3Rpb24+CisKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJDb21taXR0ZXJzIj4KKyAgICAgIDxwPgorICAgICAgICBUaGUgcHJvamVjdCdzIENvbW1pdHRlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciB0aGUgcHJvamVjdCdzIHRlY2huaWNhbAorICAgICAgICBtYW5hZ2VtZW50LiBBbGwgY29tbWl0dGVycyBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGUgcHJvamVjdCdzIHNvdXJjZQorICAgICAgICByZXBvc2l0b3JpZXMuIENvbW1pdHRlcnMgbWF5IGNhc3QgYmluZGluZyB2b3RlcyBvbiBhbnkgdGVjaG5pY2FsCisgICAgICAgIGRpc2N1c3Npb24gcmVnYXJkaW5nIHRoZSBwcm9qZWN0LgorICAgICAgPC9wPgorCisgICAgICA8cD4KKyAgICAgICAgQ29tbWl0dGVyIGFjY2VzcyBpcyBieSBpbnZpdGF0aW9uIG9ubHkgYW5kIG11c3QgYmUgYXBwcm92ZWQgYnkgbGF6eQorICAgICAgICBjb25zZW5zdXMgb2YgdGhlIGFjdGl2ZSBQTUMgbWVtYmVycy4gQSBDb21taXR0ZXIgaXMgY29uc2lkZXJlZCBlbWVyaXR1cworICAgICAgICBieSB0aGVpciBvd24gZGVjbGFyYXRpb24gb3IgYnkgbm90IGNvbnRyaWJ1dGluZyBpbiBhbnkgZm9ybSB0byB0aGUKKyAgICAgICAgcHJvamVjdCBmb3Igb3ZlciBzaXggbW9udGhzLiBBbiBlbWVyaXR1cyBjb21taXR0ZXIgbWF5IHJlcXVlc3QKKyAgICAgICAgcmVpbnN0YXRlbWVudCBvZiBjb21taXQgYWNjZXNzIGZyb20gdGhlIFBNQy4gU3VjaCByZWluc3RhdGVtZW50IGlzCisgICAgICAgIHN1YmplY3QgdG8gbGF6eSBjb25zZW5zdXMgb2YgYWN0aXZlIFBNQyBtZW1iZXJzLgorICAgICAgPC9wPgorCisgICAgICA8cD4KKyAgICAgICAgQ29tbWl0IGFjY2VzcyBjYW4gYmUgcmV2b2tlZCBieSBhIHVuYW5pbW91cyB2b3RlIG9mIGFsbCB0aGUgYWN0aXZlCisgICAgICAgIFBNQyBtZW1iZXJzIChleGNlcHQgdGhlIGNvbW1pdHRlciBpbiBxdWVzdGlvbiBpZiB0aGV5IGFyZSBhbHNvIGEgUE1DIG1lbWJlcikuCisgICAgICA8L3A+CisKKyAgICAgIDxwPgorICAgICAgICBBbGwgQXBhY2hlIGNvbW1pdHRlcnMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgYSBzaWduZWQgQ29udHJpYnV0b3IgTGljZW5zZQorICAgICAgICBBZ3JlZW1lbnQgKENMQSkgb24gZmlsZSB3aXRoIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gVGhlcmUgaXMgYQorICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L2NvbW1pdHRlcnMuaHRtbCI+Q29tbWl0dGVyIEZBUTwvYT4KKyAgICAgICAgd2hpY2ggcHJvdmlkZXMgbW9yZSBkZXRhaWxzIG9uIHRoZSByZXF1aXJlbWVudHMgZm9yIENvbW1pdHRlcnMKKyAgICAgIDwvcD4KKworICAgICAgPHA+CisgICAgICAgIEEgY29tbWl0dGVyIHdobyBtYWtlcyBhIHN1c3RhaW5lZCBjb250cmlidXRpb24gdG8gdGhlIHByb2plY3QgbWF5IGJlCisgICAgICAgIGludml0ZWQgdG8gYmVjb21lIGEgbWVtYmVyIG9mIHRoZSBQTUMuIFRoZSBmb3JtIG9mIGNvbnRyaWJ1dGlvbiBpcworICAgICAgICBub3QgbGltaXRlZCB0byBjb2RlLiBJdCBjYW4gYWxzbyBpbmNsdWRlIGNvZGUgcmV2aWV3LCBoZWxwaW5nIG91dAorICAgICAgICB1c2VycyBvbiB0aGUgbWFpbGluZyBsaXN0cywgZG9jdW1lbnRhdGlvbiwgZXRjLgorICAgICAgPC9wPgorICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJQcm9qZWN0IE1hbmFnZW1lbnQgQ29tbWl0dGVlIj4KKyAgICAgIDxwPgorICAgICAgICBUaGUgUHJvamVjdCBNYW5hZ2VtZW50IENvbW1pdHRlZSAoUE1DKSBmb3IgQXBhY2hlIEFudCB3YXMgY3JlYXRlZCBieSBhCisgICAgICAgIDxhIGhyZWY9Im1pc3Npb24uaHRtbCI+cmVzb2x1dGlvbjwvYT4gb2YgdGhlIGJvYXJkIG9mIHRoZSBBcGFjaGUKKyAgICAgICAgU29mdHdhcmUgRm91bmRhdGlvbiBvbiAxODxzdXA+dGg8L3N1cD4gTm92ZW1iZXIgMjAwMi4gVGhlIFBNQyBpcworICAgICAgICByZXNwb25zaWJsZSB0byB0aGUgYm9hcmQgYW5kIHRoZSBBU0YgZm9yIHRoZSBtYW5hZ2VtZW50IGFuZCBvdmVyc2lnaHQKKyAgICAgICAgb2YgdGhlIEFwYWNoZSBBbnQgY29kZWJhc2UuIFRoZSByZXNwb25zaWJpbGl0aWVzIG9mIHRoZSBQTUMgaW5jbHVkZQorICAgICAgPC9wPgorCisgICAgICA8dWw+CisgICAgICAgIDxsaT5EZWNpZGluZyB3aGF0IGlzIGRpc3RyaWJ1dGVkIGFzIHByb2R1Y3RzIG9mIHRoZSBBcGFjaGUgQW50IHByb2plY3QuCisgICAgICAgICAgICBJbiBwYXJ0aWN1bGFyIGFsbCByZWxlYXNlcyBtdXN0IGJlIGFwcHJvdmVkIGJ5IHRoZSBQTUMKKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPk1haW50YWluaW5nIHRoZSBwcm9qZWN0J3Mgc2hhcmVkIHJlc291cmNlcywgaW5jbHVkaW5nIHRoZSBjb2RlYmFzZQorICAgICAgICAgICAgcmVwb3NpdG9yeSwgbWFpbGluZyBsaXN0cywgd2Vic2l0ZXMuCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT5TcGVha2luZyBvbiBiZWhhbGYgb2YgdGhlIHByb2plY3QuCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT5SZXNvbHZpbmcgbGljZW5zZSBkaXNwdXRlcyByZWdhcmRpbmcgcHJvZHVjdHMgb2YgdGhlIHByb2plY3QKKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPk5vbWluYXRpbmcgbmV3IFBNQyBtZW1iZXJzIGFuZCBjb21taXR0ZXJzCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT5NYWludGFpbmluZyB0aGVzZSBieWxhd3MgYW5kIG90aGVyIGd1aWRlbGluZXMgb2YgdGhlIHByb2plY3QKKyAgICAgICAgPC9saT4KKyAgICAgIDwvdWw+CisKKyAgICAgIDxwPgorICAgICAgICBNZW1iZXJzaGlwIG9mIHRoZSBQTUMgaXMgYnkgaW52aXRhdGlvbiBvbmx5IGFuZCBtdXN0IGJlIGFwcHJvdmVkIGJ5IGEKKyAgICAgICAgbGF6eSBjb25zZW5zdXMgb2YgYWN0aXZlIFBNQyBtZW1iZXJzLiBBIFBNQyBtZW1iZXIgaXMgY29uc2lkZXJlZAorICAgICAgICAmcXVvdDtlbWVyaXR1cyZxdW90OyBieSB0aGVpciBvd24gZGVjbGFyYXRpb24gb3IgYnkgbm90IGNvbnRyaWJ1dGluZyBpbgorICAgICAgICBhbnkgZm9ybSB0byB0aGUgcHJvamVjdCBmb3Igb3ZlciBzaXggbW9udGhzLiBBbiBlbWVyaXR1cyBtZW1iZXIgbWF5CisgICAgICAgIHJlcXVlc3QgcmVpbnN0YXRlbWVudCB0byB0aGUgUE1DLiBTdWNoIHJlaW5zdGF0ZW1lbnQgaXMgc3ViamVjdCB0byBsYXp5CisgICAgICAgIGNvbnNlbnN1cyBvZiB0aGUgYWN0aXZlIFBNQyBtZW1iZXJzLiBNZW1iZXJzaGlwIG9mIHRoZSBQTUMgY2FuIGJlCisgICAgICAgIHJldm9rZWQgYnkgYW4gdW5hbmltb3VzIHZvdGUgb2YgYWxsIHRoZSBhY3RpdmUgUE1DIG1lbWJlcnMgb3RoZXIgdGhhbgorICAgICAgICB0aGUgbWVtYmVyIGluIHF1ZXN0aW9uLgorICAgICAgPC9wPgorCisgICAgICA8cD4KKyAgICAgICAgVGhlIGNoYWlyIG9mIHRoZSBQTUMgaXMgYXBwb2ludGVkIGJ5IHRoZSBBU0YgYm9hcmQuIFRoZSBjaGFpciBpcyBhbgorICAgICAgICBvZmZpY2UgaG9sZGVyIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoVmljZSBQcmVzaWRlbnQsCisgICAgICAgIEFwYWNoZSBBbnQpIGFuZCBoYXMgcHJpbWFyeSByZXNwb25zaWJpbGl0eSB0byB0aGUgYm9hcmQgZm9yIHRoZQorICAgICAgICBtYW5hZ2VtZW50IG9mIHRoZSBwcm9qZWN0cyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBBbnQgUE1DLiBUaGUgY2hhaXIKKyAgICAgICAgcmVwb3J0cyB0byB0aGUgYm9hcmQgcXVhcnRlcmx5IG9uIGRldmVsb3BtZW50cyB3aXRoaW4gdGhlIEFudCBwcm9qZWN0LgorICAgICAgICBUaGUgUE1DIG1heSBjb25zaWRlciB0aGUgcG9zaXRpb24gb2YgUE1DIGNoYWlyIGFubnVhbGx5IGFuZCBpZgorICAgICAgICBzdXBwb3J0ZWQgYnkgMi8zIE1ham9yaXR5IG1heSByZWNvbW1lbmQgYSBuZXcgY2hhaXIgdG8gdGhlIGJvYXJkLgorICAgICAgICBVbHRpbWF0ZWx5LCBob3dldmVyLCBpdCBpcyB0aGUgYm9hcmQncyByZXNwb25zaWJpbGl0eSB3aG8gaXQgY2hvb3NlcworICAgICAgICB0byBhcHBvaW50IGFzIHRoZSBQTUMgY2hhaXIuCisgICAgICA8L3A+CisgICAgPC9zdWJzZWN0aW9uPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iRGVjaXNpb24gTWFraW5nIj4KKyAgICA8cD4KKyAgICAgIFdpdGhpbiB0aGUgQW50IHByb2plY3QsIGRpZmZlcmVudCB0eXBlcyBvZiBkZWNpc2lvbnMgcmVxdWlyZSBkaWZmZXJlbnQKKyAgICAgIGZvcm1zIG9mIGFwcHJvdmFsLiBGb3IgZXhhbXBsZSwgdGhlCisgICAgICA8YSBocmVmPSIjUm9sZXMgYW5kIFJlc3BvbnNpYmlsaXRpZXMiPnByZXZpb3VzIHNlY3Rpb248L2E+IGRlc2NyaWJlcworICAgICAgc2V2ZXJhbCBkZWNpc2lvbnMgd2hpY2ggcmVxdWlyZSAmcXVvdDtsYXp5IGNvbnNlbnN1cyZxdW90OyBhcHByb3ZhbC4gVGhpcworICAgICAgc2VjdGlvbiBkZWZpbmVzIGhvdyB2b3RpbmcgaXMgcGVyZm9ybWVkLCB0aGUgdHlwZXMgb2YgYXBwcm92YWxzLCBhbmQgd2hpY2gKKyAgICAgIHR5cGVzIG9mIGRlY2lzaW9uIHJlcXVpcmUgd2hpY2ggdHlwZSBvZiBhcHByb3ZhbC4KKyAgICA8L3A+CisKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJWb3RpbmciPgorICAgICAgPHA+CisgICAgICAgIERlY2lzaW9ucyByZWdhcmRpbmcgdGhlIHByb2plY3QgYXJlIG1hZGUgYnkgdm90ZXMgb24gdGhlIHByaW1hcnkgcHJvamVjdAorICAgICAgICBkZXZlbG9wbWVudCBtYWlsaW5nIGxpc3QgKGRldkBhbnQuYXBhY2hlLm9yZykuIFdoZXJlIG5lY2Vzc2FyeSwKKyAgICAgICAgUE1DIHZvdGluZyBtYXkgdGFrZSBwbGFjZSBvbiB0aGUgcHJpdmF0ZSBBbnQgUE1DIG1haWxpbmcgbGlzdC4KKyAgICAgICAgVm90ZXMgYXJlIGNsZWFybHkgaW5kaWNhdGVkIGJ5IHN1YmplY3QgbGluZSBzdGFydGluZyB3aXRoIFtWT1RFXSBvcgorICAgICAgICBbUE1DLVZPVEVdLiBWb3RlcyBtYXkgY29udGFpbiBtdWx0aXBsZSBpdGVtcyBmb3IgYXBwcm92YWwgYW5kIHRoZXNlCisgICAgICAgIHNob3VsZCBiZSBjbGVhcmx5IHNlcGFyYXRlZC4gVm90aW5nIGlzIGNhcnJpZWQgb3V0IGJ5IHJlcGx5aW5nIHRvIHRoZQorICAgICAgICB2b3RlIG1haWwuIFZvdGluZyBtYXkgdGFrZSBmb3VyIGZsYXZvdXJzCisgICAgICA8L3A+CisKKyAgICAgIDx0YWJsZT4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48c3Ryb25nPisxPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAmcXVvdDtZZXMsJnF1b3Q7ICZxdW90O0FncmVlLCZxdW90OyBvciAmcXVvdDt0aGUgYWN0aW9uIHNob3VsZCBiZQorICAgICAgICAgICAgcGVyZm9ybWVkLiZxdW90OyBJbiBnZW5lcmFsLCB0aGlzIHZvdGUgYWxzbyBpbmRpY2F0ZXMgYSB3aWxsaW5nbmVzcworICAgICAgICAgICAgb24gdGhlIGJlaGFsZiBvZiB0aGUgdm90ZXIgaW4gJnF1b3Q7bWFraW5nIGl0IGhhcHBlbiZxdW90OworICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48c3Ryb25nPiswPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBUaGlzIHZvdGUgaW5kaWNhdGVzIGEgd2lsbGluZ25lc3MgZm9yIHRoZSBhY3Rpb24gdW5kZXIKKyAgICAgICAgICAgIGNvbnNpZGVyYXRpb24gdG8gZ28gYWhlYWQuIFRoZSB2b3RlciwgaG93ZXZlciB3aWxsIG5vdCBiZSBhYmxlCisgICAgICAgICAgICB0byBoZWxwLgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48c3Ryb25nPi0wPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBUaGlzIHZvdGUgaW5kaWNhdGVzIHRoYXQgdGhlIHZvdGVyIGRvZXMgbm90LCBpbiBnZW5lcmFsLCBhZ3JlZSB3aXRoCisgICAgICAgICAgICB0aGUgcHJvcG9zZWQgYWN0aW9uIGJ1dCBpcyBub3QgY29uY2VybmVkIGVub3VnaCB0byBwcmV2ZW50IHRoZQorICAgICAgICAgICAgYWN0aW9uIGdvaW5nIGFoZWFkLgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48c3Ryb25nPi0xPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBUaGlzIGlzIGEgbmVnYXRpdmUgdm90ZS4gT24gaXNzdWVzIHdoZXJlIGNvbnNlbnN1cyBpcyByZXF1aXJlZCwKKyAgICAgICAgICAgIHRoaXMgdm90ZSBjb3VudHMgYXMgYSA8c3Ryb25nPnZldG88L3N0cm9uZz4uIEFsbCB2ZXRvZXMgbXVzdAorICAgICAgICAgICAgY29udGFpbiBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhlIHZldG8gaXMgYXBwcm9wcmlhdGUuIFZldG9lcyB3aXRoCisgICAgICAgICAgICBubyBleHBsYW5hdGlvbiBhcmUgdm9pZC4gSXQgbWF5IGFsc28gYmUgYXBwcm9wcmlhdGUgZm9yIGEgLTEgdm90ZQorICAgICAgICAgICAgdG8gaW5jbHVkZSBhbiBhbHRlcm5hdGl2ZSBjb3Vyc2Ugb2YgYWN0aW9uLgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICA8L3RhYmxlPgorCisgICAgICA8cD4KKyAgICAgICAgQWxsIHBhcnRpY2lwYW50cyBpbiB0aGUgQW50IHByb2plY3QgYXJlIGVuY291cmFnZWQgdG8gc2hvdyB0aGVpcgorICAgICAgICBhZ3JlZW1lbnQgd2l0aCBvciBhZ2FpbnN0IGEgcGFydGljdWxhciBhY3Rpb24gYnkgdm90aW5nLiBGb3IgdGVjaG5pY2FsCisgICAgICAgIGRlY2lzaW9ucywgb25seSB0aGUgdm90ZXMgb2YgYWN0aXZlIGNvbW1pdHRlcnMgYXJlIGJpbmRpbmcuIE5vbiBiaW5kaW5nCisgICAgICAgIHZvdGVzIGFyZSBzdGlsbCB1c2VmdWwgZm9yIHRob3NlIHdpdGggYmluZGluZyB2b3RlcyB0byB1bmRlcnN0YW5kIHRoZQorICAgICAgICBwZXJjZXB0aW9uIG9mIGFuIGFjdGlvbiBpbiB0aGUgd2lkZXIgQW50IGNvbW11bml0eS4gRm9yIFBNQyBkZWNpc2lvbnMsCisgICAgICAgIG9ubHkgdGhlIHZvdGVzIG9mIFBNQyBtZW1iZXJzIGFyZSBiaW5kaW5nLgorICAgICAgPC9wPgorCisgICAgICA8cD4KKyAgICAgICAgVm90aW5nIGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gY2hhbmdlcyBtYWRlIHRvIHRoZSBBbnQgY29kZWJhc2UuIFRoZXNlCisgICAgICAgIHR5cGljYWxseSB0YWtlIHRoZSBmb3JtIG9mIGEgdmV0byAoLTEpIGluIHJlcGx5IHRvIHRoZSBjb21taXQgbWVzc2FnZQorICAgICAgICBzZW50IHdoZW4gdGhlIGNvbW1pdCBpcyBtYWRlLgorICAgICAgPC9wPgorICAgIDwvc3Vic2VjdGlvbj4KKworICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFwcHJvdmFscyI+CisgICAgICA8cD4KKyAgICAgICAgVGhlc2UgYXJlIHRoZSB0eXBlcyBvZiBhcHByb3ZhbHMgdGhhdCBjYW4gYmUgc291Z2h0LiBEaWZmZXJlbnQgYWN0aW9ucworICAgICAgICByZXF1aXJlIGRpZmZlcmVudCB0eXBlcyBvZiBhcHByb3ZhbHMKKyAgICAgIDwvcD4KKworICAgICAgPHRhYmxlPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPjxzdHJvbmc+Q29uc2Vuc3VzPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBGb3IgdGhpcyB0byBwYXNzLCBhbGwgdm90ZXJzIHdpdGggYmluZGluZyB2b3RlcyBtdXN0IHZvdGUgYW5kIHRoZXJlCisgICAgICAgICAgICBjYW4gYmUgbm8gYmluZGluZyB2ZXRvZXMgKC0xKS4gQ29uc2Vuc3VzIHZvdGVzIGFyZSByYXJlbHkgcmVxdWlyZWQKKyAgICAgICAgICAgIGR1ZSB0byB0aGUgaW1wcmFjdGljYWxpdHkgb2YgZ2V0dGluZyBhbGwgZWxpZ2libGUgdm90ZXJzIHRvIGNhc3QgYQorICAgICAgICAgICAgdm90ZS4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+PHN0cm9uZz5MYXp5IENvbnNlbnN1czwvc3Ryb25nPjwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgTGF6eSBjb25zZW5zdXMgcmVxdWlyZXMgMyBiaW5kaW5nICsxIHZvdGVzIGFuZCBubyBiaW5kaW5nIHZldG9lcy4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+PHN0cm9uZz5MYXp5IE1ham9yaXR5PC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBBIGxhenkgbWFqb3JpdHkgdm90ZSByZXF1aXJlcyAzIGJpbmRpbmcgKzEgdm90ZXMgYW5kIG1vcmUgYmluZGluZyArMQorICAgICAgICAgICAgdm90ZXMgdGhhdCAtMSB2b3Rlcy4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+PHN0cm9uZz5MYXp5IEFwcHJvdmFsPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBBbiBhY3Rpb24gd2l0aCBsYXp5IGFwcHJvdmFsIGlzIGltcGxpY2l0bHkgYWxsb3dlZCB1bmxlc3MgYSAtMSB2b3RlCisgICAgICAgICAgICBpcyByZWNlaXZlZCwgYXQgd2hpY2ggdGltZSwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGFjdGlvbiwgZWl0aGVyCisgICAgICAgICAgICBsYXp5IG1ham9yaXR5IG9yIGxhenkgY29uc2Vuc3VzIGFwcHJvdmFsIG11c3QgYmUgb2J0YWluZWQuCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPjxzdHJvbmc+Mi8zIE1ham9yaXR5PC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBTb21lIGFjdGlvbnMgcmVxdWlyZSBhIDIvMyBtYWpvcml0eSBvZiBhY3RpdmUgY29tbWl0dGVycyBvciBQTUMKKyAgICAgICAgICAgIG1lbWJlcnMgdG8gcGFzcy4gU3VjaCBhY3Rpb25zIHR5cGljYWxseSBhZmZlY3QgdGhlIGZvdW5kYXRpb24KKyAgICAgICAgICAgIG9mIHRoZSBwcm9qZWN0IChlLmcuIGFkb3B0aW5nIGEgbmV3IGNvZGViYXNlIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcKKyAgICAgICAgICAgIHByb2R1Y3QpLiBUaGUgaGlnaGVyIHRocmVzaG9sZCBpcyBkZXNpZ25lZCB0byBlbnN1cmUgc3VjaCBjaGFuZ2VzCisgICAgICAgICAgICBhcmUgc3Ryb25nbHkgc3VwcG9ydGVkLiBUbyBwYXNzIHRoaXMgdm90ZSByZXF1aXJlcyBhdCBsZWFzdCAyLzMgb2YKKyAgICAgICAgICAgIGJpbmRpbmcgdm90ZSBob2xkZXJzIHRvIHZvdGUgKzEKKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KKyAgICA8L3N1YnNlY3Rpb24+CisKKyAgICA8c3Vic2VjdGlvbiBuYW1lPSJWZXRvZXMiPgorICAgICAgPHA+CisgICAgICAgIEEgdmFsaWQsIGJpbmRpbmcgdmV0byBjYW5ub3QgYmUgb3ZlcnJ1bGVkLiBJZiBhIHZldG8gaXMgY2FzdCwgaXQgbXVzdCBiZQorICAgICAgICBhY2NvbXBhbmllZCBieSBhIHZhbGlkIHJlYXNvbiBleHBsYWluaW5nIHRoZSByZWFzb25zIGZvciB0aGUgdmV0by4gVGhlCisgICAgICAgIHZhbGlkaXR5IG9mIGEgdmV0bywgaWYgY2hhbGxlbmdlZCwgY2FuIGJlIGNvbmZpcm1lZCBieSBhbnlvbmUgd2hvIGhhcworICAgICAgICBhIGJpbmRpbmcgdm90ZS4gVGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSAgc2lnbmlmeSBhZ3JlZW1lbnQgd2l0aCB0aGUKKyAgICAgICAgdmV0byAtIG1lcmVseSB0aGF0IHRoZSB2ZXRvIGlzIHZhbGlkLgorICAgICAgPC9wPgorCisgICAgICA8cD4KKyAgICAgICAgSWYgeW91IGRpc2FncmVlIHdpdGggYSB2YWxpZCB2ZXRvLCB5b3UgbXVzdCBsb2JieSB0aGUgcGVyc29uIGNhc3RpbmcKKyAgICAgICAgdGhlIHZldG8gdG8gd2l0aGRyYXcgdGhlaXIgdmV0by4gSWYgYSB2ZXRvIGlzIG5vdCB3aXRoZHJhd24sIHRoZSBhY3Rpb24KKyAgICAgICAgdGhhdCBoYXMgYmVlbiB2ZXRvZWQgbXVzdCBiZSByZXZlcnNlZCBpbiBhIHRpbWVseSBtYW5uZXIuCisgICAgICA8L3A+CisgICAgPC9zdWJzZWN0aW9uPgorCisgICAgPHN1YnNlY3Rpb24gbmFtZT0iQWN0aW9ucyI+CisgICAgICA8cD4KKyAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgdmFyaW91cyBhY3Rpb25zIHdoaWNoIGFyZSB1bmRlcnRha2VuIHdpdGhpbgorICAgICAgICB0aGUgcHJvamVjdCwgdGhlIGNvcnJlc3BvbmRpbmcgYXBwcm92YWwgcmVxdWlyZWQgZm9yIHRoYXQgYWN0aW9uIGFuZAorICAgICAgICB0aG9zZSB3aG8gaGF2ZSBiaW5kaW5nIHZvdGVzIG92ZXIgdGhlIGFjdGlvbi4KKyAgICAgIDwvcD4KKworICAgICAgPHRhYmxlPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+CisgICAgICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgICA8dGg+QXBwcm92YWw8L3RoPgorICAgICAgICAgIDx0aD5CaW5kaW5nIFZvdGVzPC90aD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48c3Ryb25nPkNvZGUgQ2hhbmdlPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBBIGNoYW5nZSBtYWRlIHRvIGEgY29kZWJhc2Ugb2YgdGhlIHByb2plY3QgYW5kIGNvbW1pdHRlZAorICAgICAgICAgICAgYnkgYSBjb21taXR0ZXIuIFRoaXMgaW5jbHVkZXMgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24sIHdlYnNpdGUKKyAgICAgICAgICAgIGNvbnRlbnQsIGV0Yy4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIExhenkgYXBwcm92YWwgYW5kIHRoZW4gbGF6eSBjb25zZW5zdXMuCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBBY3RpdmUgY29tbWl0dGVycy4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPjxzdHJvbmc+UmVsZWFzZSBQbGFuPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBEZWZpbmVzIHRoZSB0aW1ldGFibGUgYW5kIGFjdGlvbnMgZm9yIGEgcmVsZWFzZS4gVGhlIHBsYW4gYWxzbworICAgICAgICAgICAgbm9taW5hdGVzIGEgUmVsZWFzZSBNYW5hZ2VyLgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgTGF6eSBtYWpvcml0eQorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgQWN0aXZlIGNvbW1pdHRlcnMKKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPjxzdHJvbmc+UHJvZHVjdCBSZWxlYXNlPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBXaGVuIGEgcmVsZWFzZSBvZiBvbmUgb2YgdGhlIHByb2plY3QncyBwcm9kdWN0cyBpcyByZWFkeSwgYSB2b3RlIGlzCisgICAgICAgICAgICByZXF1aXJlZCB0byBhY2NlcHQgdGhlIHJlbGVhc2UgYXMgYW4gb2ZmaWNpYWwgcmVsZWFzZSBvZiB0aGUKKyAgICAgICAgICAgIHByb2plY3QuCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBMYXp5IE1ham9yaXR5CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBBY3RpdmUgUE1DIG1lbWJlcnMKKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPjxzdHJvbmc+QWRvcHRpb24gb2YgTmV3IENvZGViYXNlPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgIFdoZW4gdGhlIGNvZGViYXNlIGZvciBhbiBleGlzdGluZywgcmVsZWFzZWQgcHJvZHVjdCBpcyB0byBiZQorICAgICAgICAgICAgcmVwbGFjZWQgd2l0aCBhbiBhbHRlcm5hdGl2ZSBjb2RlYmFzZS4gSWYgc3VjaCBhIHZvdGUgZmFpbHMgdG8KKyAgICAgICAgICAgIGdhaW4gYXBwcm92YWwsIHRoZSBleGlzdGluZyBjb2RlIGJhc2Ugd2lsbCBjb250aW51ZS4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICBUaGlzIGFsc28gY292ZXJzIHRoZSBjcmVhdGlvbiBvZiBuZXcgc3ViLXByb2plY3RzCisgICAgICAgICAgICB3aXRoaW4gdGhlIHByb2plY3QKKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDIvMyBtYWpvcml0eQorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgQWN0aXZlIGNvbW1pdHRlcnMKKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPjxzdHJvbmc+TmV3IENvbW1pdHRlcjwvc3Ryb25nPjwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgV2hlbiBhIG5ldyBjb21taXR0ZXIgaXMgcHJvcG9zZWQgZm9yIHRoZSBwcm9qZWN0CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBMYXp5IGNvbnNlbnN1cworICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgQWN0aXZlIFBNQyBtZW1iZXJzCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48c3Ryb25nPk5ldyBQTUMgTWVtYmVyPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBXaGVuIGEgY29tbWl0dGVyIGlzIHByb3Bvc2VkIGZvciB0aGUgUE1DCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBMYXp5IGNvbnNlbnN1cworICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgQWN0aXZlIFBNQyBtZW1iZXJzCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48c3Ryb25nPkNvbW1pdHRlciBSZW1vdmFsPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8cD5XaGVuIHJlbW92YWwgb2YgY29tbWl0IHByaXZpbGVnZXMgaXMgc291Z2h0LjwvcD4KKyAgICAgICAgICAgIDxwPjxiPk5vdGU6IDwvYj4gU3VjaCBhY3Rpb25zIHdpbGwgYWxzbyBiZSByZWZlcnJlZCB0byB0aGUgQVNGCisgICAgICAgICAgICBib2FyZCBieSB0aGUgUE1DIGNoYWlyPC9wPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgQ29uc2Vuc3VzCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBBY3RpdmUgUE1DIG1lbWJlcnMgKGV4Y2x1ZGluZyB0aGUgY29tbWl0dGVyIGluIHF1ZXN0aW9uIGlmIGEKKyAgICAgICAgICAgIG1lbWJlciBvZiB0aGUgUE1DKS4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPjxzdHJvbmc+UE1DIE1lbWJlciBSZW1vdmFsPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8cD5XaGVuIHJlbW92YWwgb2YgYSBQTUMgbWVtYmVyIGlzIHNvdWdodC48L3A+CisgICAgICAgICAgICA8cD48Yj5Ob3RlOiA8L2I+IFN1Y2ggYWN0aW9ucyB3aWxsIGFsc28gYmUgcmVmZXJyZWQgdG8gdGhlCisgICAgICAgICAgICBBU0YgYm9hcmQgYnkgdGhlIFBNQyBjaGFpcjwvcD4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIENvbnNlbnN1cworICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgQWN0aXZlIFBNQyBtZW1iZXJzIChleGNsdWRpbmcgdGhlIG1lbWJlciBpbiBxdWVzdGlvbikuCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgIDwvdGFibGU+CisgICAgPC9zdWJzZWN0aW9uPgorICAgIDxzdWJzZWN0aW9uIG5hbWU9IlZvdGluZyBUaW1lZnJhbWVzIj4KKyAgICAgIDxwPgorICAgICAgICBWb3RlcyBhcmUgb3BlbiBmb3IgYSBwZXJpb2Qgb2YgMSB3ZWVrIHRvIGFsbG93IGFsbCBhY3RpdmUgdm90ZXJzCisgICAgICAgIHRpbWUgdG8gY29uc2lkZXIgdGhlIHZvdGUuIFZvdGVzIHJlbGF0aW5nIHRvIGNvZGUgY2hhbmdlcyBhcmUgbm90CisgICAgICAgIHN1YmplY3QgdG8gYSBzdHJpY3QgdGltZXRhYmxlIGJ1dCBzaG91bGQgYmUgbWFkZSBhcyB0aW1lbHkgYXMgcG9zc2libGUuCisgICAgICA8L3A+CisgICAgPC9zdWJzZWN0aW9uPgorICA8L3NlY3Rpb24+Cis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3MvY29udHJpYnV0b3JzLnhtbCBiL3RydW5rL3hkb2NzL2NvbnRyaWJ1dG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhN2Y5MQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL2NvbnRyaWJ1dG9ycy54bWwKQEAgLTAsMCArMSwzODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICA8cHJvcGVydGllcz4KKyAgICA8dGl0bGU+Q29udHJpYnV0b3JzPC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSIiPkFwYWNoZSBBbnQgUE1DPC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKworICA8Ym9keT4KKyAgICA8c2VjdGlvbiBuYW1lPSJQcm9qZWN0IE1hbmFnZW1lbnQgQ29tbWl0dGVlIj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQWN0aXZlIE1lbWJlcnMiPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5CcnVjZSBBdGhlcnRvbjwvYj4gKGJydWNlIGF0IGNhbGxlbmlzaC5jb20gLSA8YSBocmVmPSJodHRwOi8vd3d3LmNhbGxlbmlzaC5jb20vfmJydWNlIj5odHRwOi8vd3d3LmNhbGxlbmlzaC5jb20vfmJydWNlPC9hPikKKzxici8+CitDdXJyZW50bHkgYSBTeXN0ZW1zIEFyY2hpdGVjdCB3aXRoIEF2dWUgVGVjaG5vbG9naWVzLCBCcnVjZSBoYXMgYmVlbgord29ya2luZyB3aXRoIEphdmEgc2luY2UgdmVyc2lvbiAxLjBhMi4gSGUgYWxzbyBjbGFpbXMgdG8gYmUgb25lIG9mIHRoZSBmaXJzdAorcGVvcGxlIHRvIG1hcmsgdXAgYSBGQVEgd2l0aCBIVE1MLCBmb3IgYSB3ZWIgYnJvd3NlciBvZiB0aGUgZGlzdGFudCBwYXN0CitjYWxsZWQgQ2VsbG8uCisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPlN0ZXBoYW5lIEJhaWxsaWV6PC9iPjxici8+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPk1hdHQgQmVuc29uPC9iPjxici8+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPlN0ZWZhbiBCb2Rld2lnPC9iPiAoc3RlZmFuLmJvZGV3aWcgYXQgZnJlZW5ldC5kZSAtCisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N0ZWZhbi5zYW1hZmxvc3QuZGUvIj5odHRwOi8vc3RlZmFuLnNhbWFmbG9zdC5kZS88L2E+KQorPGJyLz4KKzwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+RG9taW5pcXVlIERldmllbm5lPC9iPiAoZGRldmllbm5lIGF0IGFwYWNoZS5vcmcpCis8YnIvPgorRG9taW5pcXVlIGhhcyBiZWVuIGludm9sdmVkIG5vbi1zdG9wIHdpdGggdGhlIEFudCB1c2VyIGNvbW11bml0eSBzaW5jZQordGhlIDEuNCBkYXlzLCB0cnlpbmcgd2l0aG91dCBzdWNjZXNzIHRvIGFuc3dlciBwb3N0cyBhcyB3ZWxsIG9yIGFzIG9mdGVuCithcyBEaWFuZSBIb2x0IGFmdGVyIHNoZSBsZWZ0IHRoZSB1c2VyIGxpc3QuIEhlIGlzIG9waW5pb25hdGVkLCBhbHdheXMKK3N0cml2aW5nIGZvciB0aGUgYmVzdCBwb3NzaWJsZSBkZXNpZ24uIFdoaWxlIGF0IExhbmRtYXJrIEdyYXBoaWNzLCBoZQorZGVzaWduZWQgYW5kIGltcGxlbWVudGVkIGxhcmdlIEFudC9DcHBUYXNrcyBidWlsZHMgZm9yIG1peGVkIEphdmEvQysrIHByb2plY3RzLgorICAgICAgICAgICAgPC9wPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5FcmlrIEhhdGNoZXI8L2I+IChlaGF0Y2hlciBhdCBhcGFjaGUub3JnKQorPGJyLz4KK0VyaWsgaXMgdGhlIGNvLWF1dGhvciBvZiA8YSBocmVmPSJodHRwOi8vd3d3Lm1hbm5pbmcuY29tL2hhdGNoZXIiPgorSmF2YSBEZXZlbG9wbWVudCB3aXRoIEFudDwvYT4gYW5kIHNwZWFrcyBvbiBBbnQgYW5kIG90aGVyIHRvcGljcyBhdAorPGEgaHJlZj0iaHR0cDovL3d3dy5ub2ZsdWZmanVzdHN0dWZmLmNvbSI+Tm8gRmx1ZmYsIEp1c3QgU3R1ZmYKK3N5bXBvc2l1bXM8L2E+IGFzIHdlbGwgYXMgb3RoZXIgdmVudWVzLiAgRXJpayBpcyB0aGUgUHJlc2lkZW50IG9mCis8YSBocmVmPSJodHRwOi8vd3d3LmVoYXRjaGVyc29sdXRpb25zLmNvbSI+ZUhhdGNoZXIgU29sdXRpb25zLCBJbmM8L2E+LgorPC9wPgorICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+TWFydGlqbiAoSi5NLikgS3J1aXRob2Y8L2I+IChhbnQgYXQga3J1aXRob2YgeHM0YWxsIG5sKQorPGJyLz4KK01hcnRpam4gS3J1aXRob2YgaXMgYSBzeXN0ZW0gZW5naW5lZXIgd29ya2luZyB3aXRoIGFuZCBvbiBKYXZhIHByb2R1Y3RzCitpbiBhIHRlbGVjb21tdW5pY2F0aW9uIG5ldHdvcmsgc2V0dGluZy4KKzwvcD4KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkFudG9pbmUgTGV2eS1MYW1iZXJ0PC9iPiAoYW50b2luZSBhdCBhcGFjaGUub3JnKQorPGJyLz4KK0FudG9pbmUgaXMgd29ya2luZyBhcyBhIHNvZnR3YXJlIGVuZ2luZWVyIGZvciAKKzxhIGhyZWY9Imh0dHA6Ly93d3cuYXJpZWxwYXJ0bmVycy5jb20iPkFyaWVsIFBhcnRuZXJzPC9hPi4KK0hlIGlzIHNwZWNpYWxpemVkIGluIGJ1aWxkcyBhbmQgYXV0b21hdGlvbiBvZiBkZXBsb3ltZW50IHByb2Nlc3Nlcy4KKworICAgICAgICAgICAgPC9wPgorCisgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+U3RldmUgTG91Z2hyYW48L2I+PGJyLz4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+Q29ub3IgTWFjTmVpbGw8L2I+IChjb25vciBhdCBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1KQorPGJyLz4KK0Nvbm9yIGlzIGEgc2VuaW9yIGRldmVsb3BlciBhdCBDb3J0ZXggZUJ1c2luZXNzLCB3aGVyZSBoZSBkZXZlbG9wcworSjJFRSBiYXNlZCBzeXN0ZW1zLiBJbiBoaXMgc3BhcmUgdGltZSBoZSBoZWxwcyB3aXRoIHRoZSBkZXZlbG9wbWVudCBvZgordGhlIEFudCBidWlsZCB0b29sLiAgSGUgaXMgYWxzbyBzZXJ2aW5nIGFzIHRoZSBDaGFpcm1hbiBvZiB0aGlzIFBNQy4KKzwvcD4KKworICAgICAgICAgICAgPHA+CisJCQkJPGI+SmFuIE1hdOhybmU8L2I+IChqaG0gYXQgYXBhY2hlLm9yZykKKzxici8+CitKYW4gaXMgY29uc3VsdGFudCBmb3IgT09BL0QgaW4gdGhlIGNvbXB1dGVyIGNlbnRyZSBvZiB0aGUgZ292ZXJubWVudAorb2YgTm9ydGhyaGluZSBXZXN0ZmFsaWEgLyBHZXJtYW55LgorICAgICAgICAgICAgPC9wPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5QZXRlciBSZWlsbHk8L2I+PGJyLz4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW50ZXJ0d2luZ2x5Lm5ldC8iPlNhbSBSdWJ5PC9hPgorICAgICAgICAgICAgICAgIDwvYj4KKyAgICAgICAgICAgICAgICAocnVieXMgYXQgdXMuaWJtLmNvbSkKKzxici8+CitTYW0gdGFrZXMgYSBwZXJ2ZXJzZSBwbGVhc3VyZSBpbiBpbnRlZ3JhdGluZyBkaXNwYXJhdGUgdGhpbmdzLiAgSGUgaXMKK2EgbWVtYmVyIG9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnBocC5uZXQvY3JlZGl0cy5waHAiPlBIUCBncm91cDwvYT4sIEFwYWNoZQorPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3dob3dlYXJlLmh0bWwiPlhNTCBQTUM8L2E+LCBBcGFjaGUKK3Nwb25zb3IgZm9yIHRoZSA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvc29hcCI+eG1sLXNvYXA8L2E+IHN1YnByb2plY3QKK2FuZCBjb252ZW5lciBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmVjbWEuY2giPkVDTUE8L2E+IFRDMzkgVEczLgorPC9wPgorICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+TWFnZXNoIFVtYXNhbmthcjwvYj4gKHVtYWdlc2ggYXQgYXBhY2hlLm9yZykKKzxici8+CitNYWdlc2gsIFByZXNpZGVudCBvZiA8YSBocmVmPSdodHRwOi8vd3d3Lm1ldGFtYWNoc29sdXRpb25zLmNvbSc+TWV0YW1hY2ggU29sdXRpb25zPC9hPiwgCithbiBBdGxhbnRhLWJhc2VkIHRlY2hub2xvZ3ktbWFuYWdlbWVudCBjb25zdWx0YW5jeSwgaGFzIHJlY2VudGx5IGxhdW5jaGVkIAorPGEgaHJlZj0naHR0cDovL3d3dy53aW5lZGluLmNvbSc+V2luZWRJbi5jb208L2E+IGZvciB3aW5lLWxvdmVycyB0byBwYWlyIGZvb2QgYW5kIHdpbmUuIAorPC9wPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5DaHJpc3RvcGggV2lsaGVsbXM8L2I+IChjaHJpc3RvcGgud2lsaGVsbXMgYXQgdC1vbmxpbmUuZGUpCis8YnIvPgorQ2hyaXN0b3BoIHdvcmtzIGFzIHNvZnR3YXJlIGVuZ2luZWVyIGF0IHRoZSB3b3JsZCdzIGJpZ2dlc3QgdHJhdmVsIGNvbXBhbnkKKzxhIGhyZWY9Imh0dHA6Ly93d3cudHVpLmNvbSI+VFVJPC9hPi4gSGlzIHBhc3Npb24gYXJlIGFsbCBVSSByZWxhdGVkIHRoaW5ncyBzbworYXQgdGhlIEFudC1Qcm9qZWN0IGhlIHRha2VzIGNhcmUgb2YgQW50aWRvdGUgLSB0aGUgQW50IEdVSS4KKyAgICAgICAgICAgIDwvcD4KKzxwPgorICA8Yj5LZXZpbiBKYWNrc29uPC9iPiAoZm9hbWRpbm8gYXQgZ21haWwuY29tKTxici8+Cis8L3A+CisKKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkVtZXJpdHVzIE1lbWJlcnMiPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5KYW1lcyBEdW5jYW4gRGF2aWRzb248L2I+IChkdW5jYW4gYXQgeDE4MC5uZXQgLSA8YSBocmVmPSJodHRwOi8veDE4MC5uZXQvIj5odHRwOi8veDE4MC5uZXQvPC9hPikKKzxici8+CisKK0J5IGRheSwgRHVuY2FuIHdvcmtzIGluIHRoZSBPcGVuIFNvdXJjZSBQcm9ncmFtIE9mZmljZSBhdCBTdW4KK01pY3Jvc3lzdGVtcyB3aGVyZSBoZSBoZWxwcyB2YXJpb3VzIE9wZW4gU291cmNlIGVmZm9ydHMgd2l0aGluIFN1bgorJnF1b3Q7ZG8gdGhlIHJpZ2h0IHRoaW5nJnF1b3Q7LiBQcmV2aW91c2x5IGF0IFN1biBoZSB3YXMgcmVzcG9uc2libGUKK2ZvciB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbnMgMi4xIGFuZCAyLjIgYXMgd2VsbCBhcyB0aGUgSmF2YSBBUEkKK2ZvciBYTUwgUGFyc2luZyAxLjAgYW5kIHdhcyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9mIFRvbWNhdCBhbmQgQW50LiBIZQord2FzIG9uZSBvZiB0aGUgcmFiYmxlLXJvdXNlcnMgd2l0aGluIFN1biB0aGF0IGhlbHBlZCBtYWtlIHRoZSBKYWthcnRhCitQcm9qZWN0IGEgcmVhbGl0eSBhbmQgc2VydmVkIGFzIHRoZSBmaXJzdCBDaGFpcm1hbiBvZiB0aGUgSmFrYXJ0YSBQTUMuCis8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkRpYW5lIEhvbHQ8L2I+PGJyLz4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+RG9uYWxkIExlc2xpZTwvYj48YnIvPgorICAgICAgICAgICAgPC9wPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5Db3N0aW4gTW9ub2xhY2hlPC9iPjxici8+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkpvbiBTa2VldDwvYj48YnIvPgorICAgICAgICAgICAgPC9wPgorCisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gbmFtZT0iQ29tbWl0dGVycyI+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFjdGl2ZSBDb21taXR0ZXJzIj4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+U3RldmUgQ29oZW48L2I+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkpvc2UgQWxiZXJ0byBGZXJuYW5kZXo8L2I+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkplc3NlIEdsaWNrPC9iPiAoamVzc2UgZG90IGdsaWNrIGF0IHN1biBkb3QgY29tKQorPGJyLz4KK0plc3NlIGhhcyBiZWVuIHVzaW5nIEphdmEgc2luY2UgMTk5OCBhbmQgam9pbmVkIFN1biBNaWNyb3N5c3RlbXMgYXMKK3BhcnQgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm9kdWNlZCB0aGUgTmV0QmVhbnMgSURFLiBBZnRlciBkaXNjb3ZlcmluZworQW50IGluIHRoZSAxLjIgZGF5cywgaGUgd3JvdGUgbW9zdCBvZiBOZXRCZWFucycgQW50IGludGVncmF0aW9uLgorUmVjZW50bHkgaGUgaGFzIHdvcmtlZCBvbiB0aGUgTmV0QmVhbnMgNC4wIHByb2plY3Qgc3lzdGVtLCBiYXNlZCBoZWF2aWx5CitvbiBBbnQgYXMgYSBidWlsZCB0b29sLgorPC9wPgorPHA+CisgICA8Yj5BbGV4ZXkgU29sb2ZuZW5rbzwvYj4gKHRyZWxvbnkgYXQgZ21haWwuY29tKTxiciAvPgorPC9wPgorCisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJFbWVyaXR1cyBDb21taXR0ZXJzIj4KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPlByZXN0b24gQmFubmlzdGVyPC9iPjxici8+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPk5pY2sgRGF2aXM8L2I+PGJyLz4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+RGFycmVsbCBEZUJvZXI8L2I+PGJyLz4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+UGV0ZXIgRG9uYWxkPC9iPiAocGV0ZXIgYXQgYXBhY2hlLm9yZykKKzxici8+CisKK1BldGVyIGlzIGFuIGF2aWQgamF2YSBkZXZlbG9wZXIgd2hvIGlzIGFjdGl2ZSBpbiB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYXZhbG9uLyI+QXZhbG9uPC9hPiBhbmQKKzxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFudDwvYT4gcHJvamVjdHMuCitJbiBoaXMgc3BhcmUgdGltZSBoZSBkZXZlbG9wcyBhIGRpc3RyaWJ1dGVkIHZpcnR1YWwgZW52aXJvbm1lbnQKKyhpZSBtaWxpdGFyeSBzaW11bGF0b3Igb3IgM0QgZ2FtZSkgdXNpbmcgamF2YSB0ZWNobm9sb2dpZXMuCis8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkRhbm5vIEZlcnJpbjwvYj4gKHNoZW1ub24gYXQgeWFob28uY29tKQorPGJyLz4KK0Rhbm5vIGhhcyBiZWVuIHByb2dyYW1taW5nIGluIEphdmEgc2luY2UgU3VtbWVyIDk2LiBEYW5ubyB3cm90ZSBhIEpTUAorZW5naW5lIG9uIGhpcyBvd24gYW5kIHJlbGVhc2VkIGl0IHRoZSB2ZXJ5IHNhbWUgZGF5IEpha2FydGEgd2FzCithbm5vdW5jZWQgYXQgSmF2YU9uZS4gU2luY2UgdGhlbiwgaGUgZGVjaWRlZCB0byBqb2luIHRoZSBKYWthcnRhCitwcm9qZWN0IGluIGEgc3Bpcml0IG9mIGNvLW9wZXJhdGlvbiBvdmVyIGNvbXBldGl0aW9uLgorPC9wPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5TaW1lb24gSC5LLiBGaXRjaDwvYj4gKHNpbWVvbi5maXRjaCBhdCBtc2VlZHNvZnQuY29tKQorPGJyLz4KK1NpbWVvbiBpcyBvd25lciBvZiBNdXN0YXJkIFNlZWQgU29mdHdhcmUsIHdoaWNoIHNwZWNpYWxpemVzIGluIGRldmVsb3BpbmcKK2Rpc3RyaWJ1dGVkIGFwcGxpY2F0aW9ucyBhbmQgdXNlciBpbnRlcmZhY2VzIGZvciB0aGUgc2NpZW5jZSwgZW5naW5lZXJpbmcsCithbmQgcmVzZWFyY2ggb3JpZW50ZWQgY2xpZW50cy4gSGUgaXMgdGhlIGxlYWQgYXJjaGl0ZWN0IGFuZCBkZXZlbG9wZXIgZm9yCitBbnRpZG90ZSwgdGhlIEdVSSBmb3IgQW50LgorPC9wPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5UaG9tYXMgSGFhczwvYj4gKHRoYSBhdCB3aGl0ZXN0ZWluLmNvbSkKKzxici8+CitUb20gaXMgaW50ZXJlc3RlZCBpbiBkaXN0cmlidXRlZCBzeXN0ZW1zLCBKYXZhIG1pZGRsZXdhcmUgYW5kIHdvcmtlZCBvbiBhbgoraW1wbGVtZW50YXRpb24gb2YgdGhlIEpNUyBzcGVjaWZpY2F0aW9uLiBBdCBXaGl0ZXN0ZWluIFRlY2hub2xvZ2llcyBoZSBpcword29ya2luZyBvbiBicmluZ2luZyBzb2Z0d2FyZSBhZ2VudCB0ZWNobm9sb2d5IGFuZCBKMkVFIHRvZ2V0aGVyLgorPC9wPgorCisgICAgICA8cD4KKworICAgICAgICAgICAgICAgIDxiPkphc29uIEh1bnRlcjwvYj4gKGpoIGF0IHNlcnZsZXRzLmNvbSkKKzxici8+CitKYXNvbiBpcyBhdXRob3Igb2YgIkphdmEgU2VydmxldCBQcm9ncmFtbWluZyIgKE8nUmVpbGx5KSBhbmQgcHVibGlzaGVyCitvZiA8YSBocmVmPSJodHRwOi8vd3d3LnNlcnZsZXRzLmNvbS8iPmh0dHA6Ly93d3cuc2VydmxldHMuY29tLzwvYT4uCitIZSB3b3JrcyBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmNvbGxhYi5uZXQiPkNvbGxhYk5ldDwvYT4uCis8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkp1c3R5bmEgSG9yd2F0PC9iPiAoaG9yd2F0IGF0IGFwYWNoZS5vcmcpCis8YnIvPgorPC9wPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5BcnVuIEphbXdhbDwvYj4KKzxici8+Cis8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkFybm91dCBKLiBLdWlwZXI8L2I+IChhamt1aXBlciBhdCBwbGFuZXQubmwpCis8YnIvPgorCitBcm5vdXQgSi4gS3VpcGVyIGlzIGEgSmF2YSBBcmNoaXRlY3Qgd2l0aCB0aGUgU3VuIEphdmEgQ2VudGVyIGF0IFN1bgorTWljcm9zeXN0ZW1zLiBIaXMgbWFpbiBmb2N1cyBpcyB3ZWItcmVsYXRlZCB0ZWNobm9sb2dpZXMgb24gdGhlIEphdmEKK3BsYXRmb3JtIChKMkVFLCBYTUwsIC4uLikuCis8L3A+CisKKzxwPgorICAgICAgICAgICAgICAgIDxiPlN0ZWZhbm8gTWF6em9jY2hpPC9iPiAoc3RlZmFubyBhdCBhcGFjaGUub3JnKQorPGJyLz4KK1N0ZWZhbm8gaXMgYWRkaWN0ZWQgdG8gc29mdHdhcmUgZGVzaWduLCBKYXZhIHByb2dyYW1taW5nIGFuZAorb3BlbiBkZXZlbG9wbWVudC4gSW4gdGhlIGxhc3QgNCB5ZWFycywgaGUgaGFzIGNvbnRyaWJ1dGVkIHdheSB0b28gbXVjaAordGltZSB0byBBcGFjaGUsIGV4cGVjaWFsbHkgb24gSlNlcnYsIEpNZXRlciwgQXZhbG9uLCBKQU1FUywgQW50LCBDb2Nvb24KK2FuZCBoZWxwaW5nIHRvIGJyaW5nIG1vcmUgcHJvamVjdHMgaW50byBBcGFjaGUtbGFuZCwgc3VjaCBhcyBGT1AsIEJhdGlrLAorUE9JIGFuZCBYaW5kaWNlLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGhlJ3MgdG9vIHBpY2t5IHRvIGJlIHNhdGlzZmllZCA6LSkKKzwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+R2xlbm4gTWNBbGxpc3RlcjwvYj4gKGdsZW5uIGF0IHNvbWFuZXR3b3Jrcy5jb20pCis8YnIvPgorR2xlbm4gTWNBbGxpc3RlciBpcyBhIHNvZnR3YXJlIGRldmVsb3BlciBhdCBTT01BIE5ldHdvcmtzLCB3YXMgZm9ybWVybHkKK3RoZSBzYW1lIGF0IElCTSAocGx1cyB0ZWNoIHdyaXRlciBwbHVzIGJ1aWxkIGd1eSksIGFuZCBkb2VzIHNvbWUgd3JpdGluZworb24gdGhlIHNpZGUgZm9yIHRoZSBWQUREIFRlY2huaWNhbCBKb3VybmFsLgorPC9wPgorCisgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkNyYWlnIE1jQ2xhbmFoYW48L2I+IChDcmFpZy5NY0NsYW5haGFuIGF0IGVuZy5zdW4uY29tKQorPGJyLz4KK0NyYWlnIHdhcyBpbnZvbHZlZCBpbiB0aGUgQXBhY2hlIEpTZXJ2IHByb2plY3QsIGZvY3VzZWQgb24gaW1wbGVtZW50aW5nCithIG5leHQgZ2VuZXJhdGlvbiBhcmNoaXRlY3R1cmUgYW5kIGZlYXR1cmUgc2V0IGZvciB0aGUgY29yZSBzZXJ2bGV0CitlbmdpbmUuICBIZSBoYXMgcmVjZW50bHkgam9pbmVkIFN1biBhcyB0ZWNobmljYWwgbGVhZCBmb3IgdGhlIHNlcnZsZXQKK2FuZCBKU1AgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+QWRhbSBNdXJkb2NoPC9iPgorPGJyLz4KKzwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+SGFyaXNoIFByYWJoYW5kaGFtPC9iPiAoaGFyaXNocCBhdCBvbmVib3guY29tKQorPGJyLz4KK0hhcmlzaCBpcyBhbiBlbmdpbmVlciB3aXRoIHRoZSBKMkVFIHRlYW0gYXQgU3VuLCBwcmltYXJpbHkgcmVzcG9uc2libGUKK2ZvciBpbXBsZW1lbnRpbmcgc2VjdXJpdHkgaW4gdGhlIEoyRUUgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCisoUkkpLiBIZSBpbnRlZ3JhdGVkIHZhcmlvdXMgdGVjaG5vbG9naWVzIGluY2x1ZGluZyBzZXJ2bGV0L0pTUAoraW1wbGVtZW50YXRpb25zIGZyb20gVG9tY2F0IGludG8gdGhlIEoyRUUgUkkuIFRoZXNlIGRheXMsIGhlIGhhY2tzIFBIUAorY29kZSBkdXJpbmcgdGhlIGRheS4KKzwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+TmljbyBTZWVzc2xlPC9iPjxici8+CisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkdhbCBTaGFjaG9yPC9iPiAoc2hhY2hvciBhdCBpbC5pYm0uY29tKQorPGJyLz4KK0dhbCBTaGFjaG9yIGlzIGEgcmVzZWFyY2ggc3RhZmYgbWVtYmVyIGF0IElCTS4gSGUgd3JvdGUgaGlzIGZpcnN0CitTZXJ2bGV0IGNvbnRhaW5lciAoU2VydmxldEV4cHJlc3MpIGF0IHRoZSBiZWdpbm5pbmcgb2YgMTk5Ny4gTGF0ZXIgb24KK1NlcnZsZXRFeHByZXNzIChhbmQgR2FsKSBtZXJnZWQgaW50byBXZWJTcGhlcmUsIGFuZCBHYWwgcGFydGljaXBhdGVkCitpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgV2ViU3BoZXJlIDEsIDIgYW5kIDMuCis8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDxiPkpvbiBTLiBTdGV2ZW5zPC9iPiAoam9uIGF0IGNvbGxhYi5uZXQpCis8YnIvPgorCitKb24gaXMgYSBDby1Gb3VuZGVyIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xlYXJpbmsuY29tLyI+Q2xlYXIgSW5rCitDb3JwPC9hPiBhbmQgcmVjZW50bHkgbGVmdCB0byB3b3JrIG9uIDxhIGhyZWY9Imh0dHA6Ly9zY2FyYWIudGlncmlzLm9yZy8iPlNjYXJhYjwvYT4gYSBuZXh0IGdlbmVyYXRpb24gT3BlbgorU291cmNlIEphdmEgU2VydmxldCBiYXNlZCBJc3N1ZS9CdWcgdHJhY2tpbmcgc3lzdGVtIGZvciA8YSBocmVmPSJodHRwOi8vd3d3LmNvbGxhYi5uZXQvIj5Db2xsYWJOZXQ8L2E+LiBIZSBpcyBhbiBhY3RpdmUgZGV2ZWxvcGVyCitvZiB0aGUgPGEgaHJlZj0iaHR0cDovL2phdmEuYXBhY2hlLm9yZy9qc2Vydi8iPkFwYWNoZSBKU2VydiBTZXJ2bGV0CitFbmdpbmU8L2E+IGZvciB0aGUgQXBhY2hlIFdlYiBTZXJ2ZXIgYW5kIENvLUF1dGhvciBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL2phdmEuYXBhY2hlLm9yZy9lY3MvIj5FbGVtZW50IENvbnN0cnVjdGlvbiBTZXQ8L2E+IGFzCit3ZWxsIGFzIHRoZSB3ZWIgYXBwbGljYXRpb24gZnJhbWV3b3JrLCA8YSBocmVmPSJodHRwOi8vamF2YS5hcGFjaGUub3JnL3R1cmJpbmUvIj5UdXJiaW5lPC9hPi4KKzwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+SmVzc2UgU3RvY2thbGw8L2I+PGJyLz4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgPGI+SmFtZXMgVG9kZDwvYj4gKGp3dG9kZCBhdCBwYWNiZWxsLm5ldCkKKzxici8+CitKYW1lcyBoYXMgZGV2ZWxvcGVkIHJlYWwgdGltZSBjdXN0b21lciBvcmllbnRlZCBhcHBzIGZvciByb3VnaGx5IDEwCit5ZWFycyB0aGUgbGFzdCA1IG9mIHdoaWNoIGhhdmUgcHJlZG9taW5hdGVseSBiZWVuIGZ1bGx5IGludGVncmF0ZWQsCitmcm9udCBhbmQgYmFjaywgZXh0cmFOZXQgaW1wbGVtZW50YXRpb25zIHdoaWNoIGhhdmUgYmVlbiBiYXNlZCBvbgorQXBhY2hlLCBKYXZhIGFuZCBUY2wuCis8L3A+CisKKyAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5BbmlsIFZpamVuZHJhbjwvYj4gKGFrdiBhdCBlbmcuc3VuLmNvbSkKKzxici8+CitBbmlsIFZpamVuZHJhbiBpcyB0aGUgcHJpbmNpcGFsIGRldmVsb3BlciBvZiB0aGUgSlNQIGVuZ2luZSBpbgorVG9tY2F0LiBIZSdzIGRvbmUgc29tZSBwcmV0dHkgc2NhcnkgdGhpbmdzIGluIGhpcyBwYXN0IGxpZmUgLS0KK2ltcGxlbWVudGluZyB0aGUgQ09SQkEgSURMIHRvIEMrKyAyLjAgbWFwcGluZywgc2t5ZGl2aW5nLCBJREwgdG8gSmF2YQorY29tcGlsZXJzLCBPYmplY3QgRGF0YWJhc2VzIChTSUdTRVYsIHlvdSBkYSBtYW4hKSBmb3IgQysrLCBKYXZhIE9SQgorYW5kIEVKQiBydW50aW1lIGVudmlyb25tZW50cyAtLSBpbiB0aGF0IG9yZGVyLgorPC9wPgorCisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gbmFtZT0iTG9nbyI+CisgICAgICA8cD5BbnQncyBsb2dvIGlzIHRoZSByZXN1bHQgb2YgYSBsb2dvIGNvbnRlc3QsIGl0IGhhcyBiZWVuCisgICAgICAgIGRlc2lnbmVkIGJ5PC9wPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICA8Yj5OaWNrIEtpbmc8L2I+Cis8YnIvPgorPC9wPgorICAgIDwvc2VjdGlvbj4KKyAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3hkb2NzL2V4dGVybmFsLnhtbCBiL3RydW5rL3hkb2NzL2V4dGVybmFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQyOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsveGRvY3MvZXh0ZXJuYWwueG1sCkBAIC0wLDAgKzEsMzk1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJib2Rld2lnQGFwYWNoZS5vcmciPlN0ZWZhbiBCb2Rld2lnPC9hdXRob3I+CisgICAgPHRpdGxlPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworICA8Ym9keT4KKworICAgIDxzZWN0aW9uIG5hbWU9IkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrcyI+CisKKyAgICAgIDxwPlRoaXMgcGFnZSBsaXN0cyBleHRlcm5hbCByZXNvdXJjZXMgZm9yIEFwYWNoZSBBbnQ6IDxhCisgICAgICBocmVmPSIjVGFza3MiPlRhc2tzPC9hPiwgPGEKKyAgICAgIGhyZWY9IiNDb21waWxlciUyMEltcGxlbWVudGF0aW9ucyI+Q29tcGlsZXIgSW1wbGVtZW50YXRpb25zPC9hPiwKKyAgICAgIDxhIGhyZWY9IiNJREUlMjBhbmQlMjBFZGl0b3IlMjBJbnRlZ3JhdGlvbiI+SURFIGludGVncmF0aW9uCisgICAgICB0b29sczwvYT4sIDxhIGhyZWY9IiNTb3VyY2UlMjBDb250cm9sJTIweXN0ZW1zIj5Tb3VyY2UgQ29udHJvbAorICAgICAgU3lzdGVtczwvYT4sIGxvZ2dlcnMsIHlvdSBuYW1lIGl0LiBJZiB5b3UndmUgd3JpdHRlbgorICAgICAgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkLCBwbGVhc2UgcG9zdCBhbGwgcmVsZXZhbnQKKyAgICAgIGluZm9ybWF0aW9uIHRvIG9uZSBvZiB0aGUgbWFpbGluZyBsaXN0cy4gIEZvciBkZXRhaWxzLCBzZWUgdGhlCisgICAgICA8YSBocmVmPSJmYXEuaHRtbCNhZGRpbmctZXh0ZXJuYWwtdGFza3MiPkZBUTwvYT4uPC9wPgorCisgICAgICA8cD5Ob3RoaW5nIGxpc3RlZCBoZXJlIGlzIGRpcmVjdGx5IHN1cHBvcnRlZCBieSB0aGUgQW50CisgICAgICBkZXZlbG9wZXJzICh0aGVyZWZvcmUgJzxpPmV4dGVybmFsPC9pPiB0b29scyBhbmQgdGFza3MnKSwKKyAgICAgIGlmIHlvdSBlbmNvdW50ZXIgYW55IHByb2JsZW1zIHdpdGggdGhlbSwgcGxlYXNlIHVzZQorICAgICAgdGhlIGNvbnRhY3QgaW5mb3JtYXRpb24uPC9wPgorCisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gbmFtZT0iVGFza3MiPgorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQUpDIj4KKworICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FzcGVjdGovIj5Bc3BlY3RKPC9hPiBpcyBhbgorICAgICAgICAgIGFzcGVjdC1vcmllbnRlZCBleHRlbnNpb24gdG8gSmF2YS4gIFRoaXMgdGFzayBjb21waWxlcyBhCisgICAgICAgICAgc291cmNlIHRyZWUgdXNpbmcgdGhlIEFzcGVjdEogY29tcGlsZXIgLS0gQUpDLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS4zPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FzcGVjdGovIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FzcGVjdGovPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXNwZWN0ai8iPnByb2plY3QgbWFpbGluZyBsaXN0czwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW5ha2lhIj4KKworICAgICAgICA8cD5BY3R1YWxseSwgQW5ha2lhIGlzIG1vcmUgdGhhbiBqdXN0IGFuIEFudCB0YXNrLCBpdCBpcyBhIGFuCisgICAgICAgIFhNTCB0cmFuc2Zvcm1hdGlvbiB0b29sIGJhc2VkIG9uIEpET00sIFZlbG9jaXR5IGFuZCBBbnQuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjIgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5L2FuYWtpYS5odG1sIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5L2FuYWtpYS5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9tYWlsMi5odG1sIj5WZWxvY2l0eSBtYWlsaW5nIGxpc3RzPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbmRhcmllbCI+CisKKyAgICAgICAgPHA+QW5kYXJpZWwgaXMgYSBzZXQgb2YgdGFza3MgZGVzaWduZWQgdG8gaGVscCB0aGUgZ2VuZXJhdGlvbiBvZiBIVE1MCisgICAgICAgIChhbmQgb3RoZXIgbWFya3VwIGxhbmd1YWdlcykgcGFnZXMgZnJvbSBBbnQuIEluY2x1ZGVzIGEgWFBhdGggcHJvY2Vzc29yLAorICAgICAgICBhbiBpbWFnZSBpbmZvcm1hdGlvbiByZXRyaWV2ZXIsIGFuZCBvdGhlcnMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUuNCBhbmQgbmV3ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbmRhcmllbC51d29ya3MubmV0LyI+aHR0cDovL2FuZGFyaWVsLnV3b3Jrcy5uZXQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPmpvc2VwIERPVCByaW8gQVQgdXdvcmtzIERPVCBuZXQ8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjE8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudDJTdmciPgorCisgICAgICAgIDxwPkFudDJTdmcgY3JlYXRlcyBhIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBvZiBhbiBBbnQgYnVpbGQgZmlsZS4KKyAgICAgICAgVGhlIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBpcyBpbiB0aGUgZm9ybSBvZiBhIFNjYWxhYmxlIFZlY3RvcgorICAgICAgICBHcmFwaGljcyAoU1ZHKSBmaWxlIHRoYXQgY2FuIGJlIGRpc3BsYXllZCBpbiBhIHdlYiBicm93c2VyLiBUaGlzCisgICAgICAgIHNpbXBsaWZpZWQgU1ZHIGRlcGljdGlvbiBoZWxwcyB0aGUgZGV2ZWxvcGVyIHVuZGVyc3RhbmQgYnVpbGQgZmlsZQorICAgICAgICBzdHJ1Y3R1cmUgYW5kIGlkZW50aWZ5IGV4dHJhbmVvdXMgb3IgbWlzc2luZyBkZXBlbmRlbmNpZXMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjYuMSBhbmQgaGlnaGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnNwaXJpdGVkc3cuY29tL2FudDJzdmcvIj5odHRwOi8vd3d3LnNwaXJpdGVkc3cuY29tL2FudDJzdmcvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPmxvbmV5ICZsdDthdCZndDsgc3Bpcml0ZWRzdyAmbHQ7ZG90Jmd0OyBjb208L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJhbnQ0ZWNsaXBzZSI+CisKKyAgICAgICAgPHA+YW50NGVjbGlwc2UgcHJvdmlkZXMgYSBzZXQgb2YgQW50IHRhc2tzIHRvIG1ha2Ugc2V2ZXJhbAorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIEVjbGlwc2UgSURFIGF2YWlsYWJsZSBpbiBBbnQKKyAgICAgICAgICAgICAgICBidWlsZHNjcmlwdHMuIFRoZSB0YXNrcyBhcmUgYWltZWQgdG8gYXZvaWQgcmVkdW5kYW5jeSBiZXR3ZWVuCisgICAgICAgICAgICAgICAgRWNsaXBzZSBhbmQgQW50IGNvbmZpZ3VyYXRpb25zIGluIG9yZGVyIHRvIGJ1aWxkIHNtYWxsIGJ1dAorICAgICAgICAgICAgICAgIHBvd2VyZnVsIGJ1aWxkIHN5c3RlbXMgZm9yIHRoZSBjb250aW51b3VzIGludGVncmF0aW9uCisgICAgICAgICAgICAgICAgcHJvY2VzczwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS42LjEgYW5kIGhpZ2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2FudDRlY2xpcHNlLnNmLm5ldCI+aHR0cDovL2FudDRlY2xpcHNlLnNmLm5ldDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L21haWwvP2dyb3VwX2lkPTEzNzM3NyI+CisgICAgICAgICAgICAgIGFudDRlY2xpcHNlIHVzZXIgbWFpbGluZyBsaXN0PC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+U3VuIFB1YmxpYyBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnRjb3VudCI+CisgICAgICAgIDxwPkFudGNvdW50IGlzIGEgc2V0IG9mIGZpbHRlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBnYXRoZXIgc3RhdGlzdGljcworICAgICAgICAgICBmcm9tIGZpbGVzIG9yIHJlc291cmNlcy4gSXQgaXMgbWFpbmx5IHVzZWQgZm9yIGxvZyBmaWxlcyBhbmFseXNpcy4KKyAgICAgICAgICAgSXQgYWxsb3dzIHRvOjx1bD4KKyAgICAgICAgICAgICA8bGk+Y291bnQgaW5wdXRzIChsaW5lcywgc3RyaW5ncyk8L2xpPgorICAgICAgICAgICAgIDxsaT5jb3VudCBvY2N1cnJlbmNlcyBvZiBlYWNoIGlucHV0PC9saT4KKyAgICAgICAgICAgICA8bGk+Y2FsY3VsYXRlIGF2ZXJhZ2UsIG1heCBhbmQgbWluIHZhbHVlcyBvZiBmbG9hdHMgaW4gaW5wdXQ8L2xpPgorICAgICAgICAgICA8L3VsPgorICAgICAgICAgICBBbnRjb3VudCBhbHNvIGluY2x1ZGVzIHNvbWUgdXNlZnVsIGZpbHRlcnMgdG86PHVsPgorICAgICAgICAgICAgIDxsaT5zdG9wIGZpbHRlcmluZzogcmVhZCBldmVyeXRoaW5nIGJ1dCB3cml0ZSBub3RoaW5nPC9saT4KKyAgICAgICAgICAgICA8bGk+ZWNobyBpbnB1dCB0byB0aGUgY29uc29sZSBvciB0byBhIGZpbGUuIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGNyZWF0ZQorICAgICAgICAgICAgICAgICBzZXZlcmFsIGZpbGVzIGF0IG9uY2U8L2xpPgorICAgICAgICAgICAgIDxsaT5zcGxpdCB0aGUgc3RyZWFtIGluIHR3byBmb3IgcGFyYWxsZWwgcHJvY2Vzc2luZzwvbGk+CisgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvcD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICA8dGQ+QW50IDEuNi4yIGFuZCBoaWdoZXI8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vYW50Y291bnQuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2FudGNvdW50LnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnRjb3VudC5zb3VyY2Vmb3JnZS5uZXQvY29udGFjdHMuaHRtbCI+UGF0cmljayBNYXJ0aW48L2E+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgPHRkPkxHUEw8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KKyAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudERvYyI+CisKKyAgICAgICAgPHA+QW50RG9jIGlzIGEgdG9vbCB0aGF0IGdlbmVyYXRlcyBIVE1MIGRvY3VtZW50YXRpb24gZnJvbSBBbnQKKyAgICAgICAgYnVpbGRmaWxlczsgdGhlIGdlbmVyYXRlZCBIVE1MIGlzIGluc3BpcmVkIGZyb20gd2hhdCBqYXZhZG9jCisgICAgICAgIHlpZWxkcy4gIEFudERvY0dVSSBvZmZlcnMgYSBzaW1wbGUgQW50IHRhcmdldCBsYXVuY2hlciBuYW1lZAorICAgICAgICBBbnREb2MgR1VJLiBBbnQgdGFyZ2V0cyBtYXkgYmUgbGF1bmNoZWQgZnJvbSB0aGUgZ2VuZXJhdGVkCisgICAgICAgIEFudERvYyBIVE1MIHBhZ2VzLiBJbnRlZ3JhdGlvbiB0byB2YXJpb3VzIElERXMgaXMgaW4KKyAgICAgICAgcHJvZ3Jlc3MuPC9wPgorCisgICAgICAgIDxwPkFudERvYyBjYW4gYmUgcnVuIHZpYSBhbiBBbnQgdGFzaywgQW50RG9jIEdVSSBjYW4gYmUgcnVuCisgICAgICAgIHZpYSBhbiBBbnQgdGFzaywgb3IgdmlhIGEgSlZNIGxhdW5jaC48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNC4xIGFuZCBoaWdoZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnRkb2MuZnJlZS5mci8iPmh0dHA6Ly9hbnRkb2MuZnJlZS5mci88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+RWRvdWFyZCBNZXJjaWVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnREb2NsZXQiPgorCisgICAgICAgIDxwPkFudERvY2xldCBpcyBhIHRvb2wgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIG91dCBvZgorICAgICAgICB5b3VyIEFudCBUYXNrcycgc291cmNlIGNvZGUuPC9wPgorCisgICAgICAgIDxwPkl0IGlzIGltcGxlbWVudGVkIGFzIGEgSmF2YWRvYyBkb2NsZXQsIGFuZCBnZW5lcmF0ZXMgcmVmZXJlbmNlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGRlbGl2ZXJhYmxlcyBmcm9tIHRoZSBzb3VyY2UgY29kZSBvZiB5b3VyCisgICAgICAgIGN1c3RvbSBBbnQgVGFza3MvVHlwZXMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjYrIChub3QgdGVzdGVkIG9uIGVhcmxpZXIgdmVyc2lvbnMpPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vYW50ZG9jbGV0Lm5ldXJvbmluZy5jb20vIj5odHRwOi8vYW50ZG9jbGV0Lm5ldXJvbmluZy5jb20vPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9uZXVyb25pbmcuY29tLyI+RmVybmFuZG8gRG9ibGFkZXo8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R1BMPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnRlYXRlciI+CisKKyAgICAgICAgPHA+QW50ZWF0ZXIgaXMgYSBzZXQgb2YgQW50IHRhc2tzIGZvciB0aGUgZnVuY3Rpb25hbCB0ZXN0aW5nIG9mIHdlYnNpdGVzCisgICAgICAgICAgYW5kIHdlYiBzZXJ2aWNlcyAoZnVuY3Rpb25hbCB0ZXN0aW5nIGJlaW5nOyBoaXQgYSBVUkwgYW5kIGVuc3VyZSB0aGUKKyAgICAgICAgICByZXNwb25zZSBtZWV0cyBjZXJ0YWluIGNyaXRlcmlhKS4gQ2FuIHRlc3QgSFRUUCBwYXJhbXMsIHJlc3BvbnNlCisgICAgICAgICAgY29kZXMsIFhQYXRoLCByZWdleHAgYW5kIFJlbGF4IE5HIGV4cHJlc3Npb25zLiBJbmNsdWRlcyBIVE1MIHJlcG9ydGluZworICAgICAgICAgIChiYXNlZCBvbiBqdW5pdHJlcG9ydCkgYW5kIGEgaGllcmFyY2hpY2FsIGdyb3VwaW5nIHN5c3RlbSBmb3IgcXVpY2tseQorICAgICAgICAgIGNvbmZpZ3VyaW5nIGxhcmdlIHRlc3Qgc2NyaXB0cy4KKyAgICAgICAgPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41IGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2FmdC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vYWZ0LnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9hZnQtZGV2ZWwiPmRldmVsb3BlcgorICAgICAgICAgICAgICAgIG1haWxpbmcgbGlzdDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50Rm9ybSI+CisKKyAgICAgICAgPHA+UHJvdmlkZXMgYSBqYXZhL3N3aW5nIGZvcm0tYmFzZWQgaW5wdXQgc2NoZW1lIGZvcgorICAgICAgICBjb25maWd1cmluZyBhbnQgcHJvcGVydGllcyBhbmQgbGF1bmNoaW5nIGFudCB0YXJnZXRzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS42LjIuPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vYW50Zm9ybXMuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2FudGZvcm1zLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOnJlbmVfZ2hvc2hAeWFob28uY29tIj5SZW4mIzIzMzsgR2hvc2g8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudG1lcmdlIj4KKworICAgICAgICA8cD5Qcm92aWRlcyBzaW1wbGUgaW5oZXJpdGFuY2UgYmV0d2VlbiBhbnQgZmlsZXM8L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+VGVzdGVkIHdpdGggMS41LiBTaG91bGQgd29yayB3aXRoIGFsbCB2ZXJzaW9ucy48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cucnVzc2V0Lm9yZy51ay9hbnRtZXJnZS5odG1sIj5odHRwOi8vd3d3LnJ1c3NldC5vcmcudWsvYW50bWVyZ2UuaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86YW50bWVyZ2VAcnVzc2V0Lm9yZy51ayI+UGhpbGxpcCBMb3JkPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIAorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnRvbW9sb2d5Ij4KKyAgICAgICAgPHA+QW50b21vbG9neSBpcyBhbiBhbmFseXNpcyB0b29sIHN1aXRlIGZvciBBbnQuIEl0IGluY2x1ZGVzOjx1bD4KKyAgICAgICAgICA8bGk+PGI+U3RhdGlzdGljc0xpc3RlbmVyPC9iPiAtIGFuIEFudCBCdWlsZExpc3RlbmVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGdhdGhlcgorICAgICAgICAgICAgICBzdGF0aXN0aWNzIHdoaWxlIGFuIEFudCBidWlsZCBpcyBleGVjdXRlZC4gU3RhdGlzdGljcyBvbiB0aGUgdGFyZ2V0cworICAgICAgICAgICAgICBhbmQgdGFza3MgZXhlY3V0ZWQgYXJlIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUgYWZ0ZXIgdGhlIGJ1aWxkIGNvbXBsZXRlcy4gPC9saT4KKyAgICAgICAgPC91bD48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+IDxpPnVua25vd248L2k+IDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2FudG9tb2xvZ3kuY29kZWhhdXMub3JnIj5odHRwOi8vYW50b21vbG9neS5jb2RlaGF1cy5vcmc8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3hpcmNsZXMuY29kZWhhdXMub3JnL3Byb2plY3RzL2FudG9tb2xvZ3kvbGlzdHMiPmNvbnRhY3QgcGFnZTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgTGljZW5zZSBWMi4wPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgICAKKyAgICAgIAorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50UHJldHR5QnVpbGQiPgorICAgICAgICAgPHA+CisgICAgICAgICAgQW50IFByZXR0eSBCdWlsZCBpcyBhIHRvb2wgdG8gZWFzaWx5IHNob3cgYW5kIHJ1biBBbnQgYnVpbGRmaWxlcyBkaXJlY3RseSBmcm9tCisgICAgICAgIHdpdGhpbiBhIGJyb3dzZXIgd2luZG93LiBJdCBjb25zaXN0cyBvZiBhIHNpbmdsZSBYU0wgZmlsZSB0aGF0IHdpbGwgZ2VuZXJhdGUsCisgICAgICAgIG9uIHRoZSBmbHksIGluIHRoZSBicm93c2VyLCBmcm9tIHRoZSAueG1sIGJ1aWxkZmlsZSwgYSBwcmV0dHkgaW50ZXJmYWNlIHNob3dpbmcKKyAgICAgICAgcHJvamVjdCBuYW1lLCBkZXNjcmlwdGlvbiwgcHJvcGVydGllcyBhbmQgdGFyZ2V0cywgZXRjLiBzb3J0ZWQgb3IgdW5zb3J0ZWQsCisgICAgICAgICAgYWxsb3dpbmcgdG8gbG9hZC9tb2RpZnkvYWRkIHByb3BlcnRpZXMsIHJ1biB0aGUgd2hvbGUgcHJvamVjdCwgb3IgcnVuIHNlbGVjdGVkCisgICAgICAgIHNldCBvZiB0YXJnZXRzIGluIGEgc3BlY2lmaWMgb3JkZXIsIHdpdGggdGhlIGFiaWxpdHkgdG8gbW9kaWZ5IGxvZ2dlci9sb2dmaWxlLAorICAgICAgICBtb2RlIGFuZCBhZGQgbW9yZSBsaWJzIG9yIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgICAgIDwvcD4KKyAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICAgICAgICAgPHRkPkFsbCBBbnQgdmVyc2lvbnM8L3RkPgorICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vYW50cHJldHR5YnVpbGQuc291cmNlZm9yZ2UubmV0LyI+QW50IFByZXR0eSBCdWlsZCBIb21lcGFnZTwvYT48L3RkPgorICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2FudHByZXR0eWJ1aWxkLnNvdXJjZWZvcmdlLm5ldCI+Q2hhcmJlbCBCSVRBUjwvYT48L3RkPgorICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgICAgICAgICA8dGQ+QXBhY2hlIExpY2Vuc2UgVjIuMDwvdGQ+CisgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnRTcGFjZXMiPgorCisgICAgICAgIDxwPkFudFNwYWNlcyBwcm92aWRlcyBBbnQgaW50ZWdyYXRpb24gd2l0aCBKYXZhU3BhY2VzLiBUaGlzCisgICAgICAgIGFsbG93cyB5b3UgdG8gY29vcmRpbmF0ZSBBbnQgdGFza3MgdmlhIEphdmFTcGFjZXMsIHB1bGwgb3V0CisgICAgICAgIHdvcmsgdW5pdHMgZnJvbSBhIEphdmFTcGFjZSBmb3IgZGlzdHJpYnV0ZWQgQW50IHRhc2tzIHRvIHdvcmsKKyAgICAgICAgb24sIGFuZCBzbyBmb3J0aC48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNSBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9vcHNjb25zdWx0YW5jeS5jb20vc29mdHdhcmUvYW50c3BhY2VzLyI+aHR0cDovL3d3dy5vb3BzY29uc3VsdGFuY3kuY29tL3NvZnR3YXJlL2FudHNwYWNlcy88L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD5hbnRzcGFjZXMgYXQgb29wc2NvbnN1bHRhbmN5LmNvbTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnRUaW1lclRhc2siPgorICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vd3d3LmplY2tsZS5kZS9mcmVlU3R1ZmYvQW50VGltZXJUYXNrL2luZGV4Lmh0bWwiPlRpbWVyPC9hPgorICAgICAgICBpcyB0YXNrIGZvciBtZWFzdXJpbmcgdGhlIHRpbWUgZWxhcHNlZCB0byBjb21wbGV0ZSBvdGhlcgorICAgICAgICB0YXNrczwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS42PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qZWNrbGUuZGUvZnJlZVN0dWZmL0FudFRpbWVyVGFzay9pbmRleC5odG1sIj5odHRwOi8vd3d3LmplY2tsZS5kZS9mcmVlU3R1ZmYvQW50VGltZXJUYXNrL2luZGV4Lmh0bWw8L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86bWFyaW9AamVja2xlLmRlIj5tYXJpb0BqZWNrbGUuZGU8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+TGVzc2VyIEdOVSBQdWJsaWMgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50IFdlYiBTdGFydCBUYXNrIj4KKworICAgICAgICA8cD5BbnQgV2ViIFN0YXJ0IFRhc2sgaXMgYW4gQW50IHRhc2sgYWxsb3dpbmcgZGV2ZWxvcGVycyB0bworICAgICAgICBwYWNrYWdlIGEgZGVza3RvcCBhcHBsaWNhdGlvbiBhcyBhIFdBUiAoV2ViIEFwcGxpY2F0aW9uCisgICAgICAgIEFyY2hpdmUpIHRvIGJlIGRpc3RyaWJ1dGVkIG92ZXIgdGhlIG5ldCB2aWEgSmF2YSBXZWIgU3RhcnQ8L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNSBhbmQgYWJvdmU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnQtam5scC13YXIuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2FudC1qbmxwLXdhci5zb3VyY2Vmb3JnZS5uZXQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50WHRyYXMiPgorCisgICAgICAgIDxwPkEgY29sbGVjdGlvbiBvZiBwb3dlcmZ1bCBBbnQgZXh0ZW5zaW9ucyBjb21wb25lbnRzCisgICAgICAgIG9yZ2FuaXplZCBpbnRvIGZpdmUgY2F0ZWdvcmllczogZml4dHVyZS1jb250cm9sLAorICAgICAgICBleGVjdXRpb24tcnVsZXMsIGZsb3ctY29udHJvbCwgZmVlZGJhY2ssIGFuZCBoZWxwZXJzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS42LjU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnR4dHJhcy5zb3VyY2Vmb3JnZS5uZXQvIj5BbnRYdHJhcyBIb21lPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnR4dHJhcy5zb3VyY2Vmb3JnZS5uZXQiPlNTTUM8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMIDIuMSk8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQnVpbGQgTnVtYmVyIj4KKyAgICAgICAgPHA+IEJ1aWxkIE51bWJlciBpcyBhIHRvb2wgdG8gdHJhY2sgc29mdHdhcmUgYXJ0aWZhY3RzIHN1Y2ggYXMgZmlsZXMgYW5kIGF1dG9tYXRpY2FsbHkgYXNzaWduCisgICAgICAgIHByb3BlciB2ZXJzaW9uL2J1aWxkIG51bWJlcnMgdG8gdGhlbS4gSXQgZW5zdXJlcyB0aGF0IHR3byBkaWZmZXJlbnQgYXJ0aWZhY3RzIHdpbGwgaGF2ZSBkaWZmZXJlbnQKKyAgICAgICAgdmVyc2lvbi9idWlsZCBudW1iZXJzLCBidXQgaWRlbnRpY2FsIGFydGlmYWN0cy9idWlsZHMgd2lsbCBiZSBhc3NpZ25lZCB0aGUgc2FtZSBudW1iZXIuIEl0IGRvZXNuJ3QKKyAgICAgICAgdGFrZSB2ZXJzaW9uIG1hbmFnZW1lbnQgYXdheSBmcm9tIHlvdSBhbmQgZG9lc24ndCByZXBsYWNlIHlvdXIgYnVpbGQgcHJvY2VzcywgYnV0IHJhdGhlciBwbHVncworICAgICAgICBpbnRvIHRoZSBwcm9jZXNzIGFuZCBpbnRyb2R1Y2VzIHZlcnNpb24vYnVpbGQgbnVtYmVyIGdvdmVybmFuY2UgYnkgZGVmaW5pbmcgd2hvIGlzIGluIGNoYXJnZSBvZgorICAgICAgICB3aGljaCBwYXJ0IG9mIHZlcnNpb24gbnVtYmVyLiBXaXRoIEJ1aWxkIE51bWJlciB5b3UgYXJlIHN0aWxsIGluIGNoYXJnZSBvZiB0aGUgaGVhZCBvZiB0aGUgdmVyc2lvbgorICAgICAgICBudW1iZXIuIEUuZy4geW91IG1heSBkZWNpZGUgdG8gaGF2ZSA0IG51bWJlcnMgaW4geW91ciB2ZXJzaW9uIChtYWpvciwgbWlub3IsIGludGVyZmFjZSwgaW1wbGVtZW50YXRpb24pCisgICAgICAgIGFuZCB5b3Ugd2FudCB0byBtYW5hZ2UgdGhlIHR3byBmaXJzdCBudW1iZXJzIChtYWpvciBhbmQgbWlub3IpLiBCdWlsZCBOdW1iZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhlCisgICAgICAgIHRlZGl1bSBvZiBtYW5hZ2luZyB0aGUgbGFzdCB0d28gbnVtYmVycyAoaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbikuIDwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5UZXN0ZWQgd2l0aCBBbnQgMS41LjQgYW5kIDEuNi41PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmhhbW11cmFwaS5iaXovcHJvZHVjdHMvYnVpbGRudW1iZXIiPmh0dHA6Ly93d3cuaGFtbXVyYXBpLmJpei9wcm9kdWN0cy9idWlsZG51bWJlcjwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmhhbW11cmFwaS5iaXovaGFtbXVyYXBpLWJpei9lZi94bWVudS9jb250YWN0Lmh0bWwiPlByb2plY3QgQ29udGFjdCBQYWdlPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkNvbW1lcmNpYWw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNoZWNrc3R5bGUiPgorCisgICAgICAgIDxwPkNoZWNrc3R5bGUgaXMgYSBkZXZlbG9wbWVudCB0b29sIHRvIGhlbHAgcHJvZ3JhbW1lcnMgd3JpdGUKKyAgICAgICAgSmF2YSBjb2RlIHRoYXQgYWRoZXJlcyB0byBhIGNvZGluZyBzdGFuZGFyZC4gSXRzIHB1cnBvc2UgaXMgdG8KKyAgICAgICAgYXV0b21hdGUgdGhlIHByb2Nlc3Mgb2YgY2hlY2tpbmcgSmF2YSBjb2RlLCBhbmQgdG8gc3BhcmUKKyAgICAgICAgaHVtYW5zIG9mIHRoaXMgYm9yaW5nIChidXQgaW1wb3J0YW50KSB0YXNrLjwvcD4KKworICAgICAgICA8cD5DaGVja3N0eWxlIGNhbiBiZSBydW4gdmlhIGFuIEFudCB0YXNrIG9yIGEgY29tbWFuZCBsaW5lCisgICAgICAgIHV0aWxpdHkuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjQuMSBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9jaGVja3N0eWxlLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9jaGVja3N0eWxlLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmNoZWNrc3R5bGVAcHVwcHljcmF3bC5jb20iPk9saXZlciBCdXJuPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPlN0YXJ0aW5nIHdpdGggcmVsZWFzZSAyLjAgdGhlIGxpY2Vuc2UgaXMgdGhlIEdOVQorICAgICAgICAgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBQcmlvciByZWxlYXNlcyB3ZXJlIHVuZGVyCisgICAgICAgICAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDaG93blRhc2siPgorCisgICAgICAgIDxwPkNob3duVGFzayBpcyBhbiBBbnQgdGFzayB0byBjaGFuZ2Ugb3duZXJzaGlwIG9mIGZpbGVzIG9uCisgICAgICAgIFVuaXguPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjMgYW5kIHVwPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9jaG93bnRhc2svIj5odHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Nob3dudGFzay88L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86Y2hvd250YXNrLXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCI+V2lsZnJlZCBTcHJpbmdlcjwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDbGVhbkltcG9ydHMiPgorICAgICAgICA8cD5SZW1vdmVzIHVubmVlZGVkIGltcG9ydHMuIEZvcm1hdHMgeW91ciBpbXBvcnQKKyAgICAgICAgc2VjdGlvbnMuIEZsYWdzIGFtYmlndW91cyBpbXBvcnRzLjwvcD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuMyBhbmQgdXA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuY2xlYW5pbXBvcnRzLnRvbWJydXMubmwiPmh0dHA6Ly93d3cuY2xlYW5pbXBvcnRzLnRvbWJydXMubmw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmNsZWFuaW1wb3J0c0B0b21icnVzLm5sIj5Ub20gQnJ1czwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ2xvdmVyIj4KKworICAgICAgICA8cD5DbG92ZXIgaXMgYW4gQW50LWJhc2VkIENvZGUgQ292ZXJhZ2UgdG9vbC4gSXQgY2FuIGJlIHVzZWQKKyAgICAgICAgc2VhbWxlc3NseSB3aXRoIEFudC1iYXNlZCBwcm9qZWN0cy4gSXQgcHJvdmlkZXMgbWV0aG9kLAorICAgICAgICBzdGF0ZW1lbnQsIGFuZCBicmFuY2ggY292ZXJhZ2UgYW5hbHlzaXMsIGFuZCBoYXMgcmljaAorICAgICAgICByZXBvcnRpbmcgaW4gWE1MLCBIVE1MIG9yIHZpYSBhIFN3aW5nIEdVSS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNC4xIG9yIGdyZWF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuY2VucXVhLmNvbS9jbG92ZXIvIj5odHRwOi8vd3d3LmNlbnF1YS5jb20vY2xvdmVyLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86Y2xvdmVyLXN1cHBvcnRAY2VucXVhLmNvbSI+Y2xvdmVyLXN1cHBvcnRAY2VucXVhLmNvbTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5Db21tZXJjaWFsLCBmcmVlIGxpY2Vuc2VzIGF2YWlsYWJsZSBmb3Igb3BlbiBzb3VyY2UKKyAgICAgICAgICAgIHByb2plY3RzLjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ01TRGVwbG95Ij4KKworICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vY21zZGVwbG95LnNvdXJjZWZvcmdlLm5ldCI+Q01TRGVwbG95PC9hPiBpcworICAgICAgICBhbiBBcGFjaGUgQW50IFRhc2sgdG8gc3VibWl0IGZpbGVzIGFuZCB0ZW1wbGF0ZXMgdG8gVmlnbmV0dGUKKyAgICAgICAgQ01TLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41LjEgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vY21zZGVwbG95LnNvdXJjZWZvcmdlLm5ldCI+aHR0cDovL2Ntc2RlcGxveS5zb3VyY2Vmb3JnZS5uZXQ8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOm1hc29nYXRvQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCI+bWFzb2dhdG9AdXNlcnMuc291cmNlZm9yZ2UubmV0PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ29jb29uIFRhc2siPgorICAgICAgICA8cD5UaGlzIHRhc2sgYWxsb3dzIHRoZSBnZW5lcmF0aW9uIG9mIHN0YXRpYyB3ZWIgcGFnZXMgYW5kCisgICAgICAgIHNpdGVzIHVzaW5nIEFwYWNoZSBDb2Nvb24gaW4gb2ZmLWxpbmUgbW9kZS48L3A+CisgICAgICAgIDxwPkl0IGFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ29jb29uIHRvIGJlCisgICAgICAgIGluY2x1ZGVkIHdpdGhpbiB0aGUgQW50IGJ1aWxkIGZpbGUsIGFuZCBpcyB0aHVzCisgICAgICAgIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgQW50IHByb3BlcnRpZXMuPC9wPgorICAgICAgICA8cD5UaGUgdGFzayBzaGFyZXMgaXRzIGNvZGUgd2l0aCB0aGUgQ29jb29uIENvbW1hbmQgTGluZSwgd2hpY2gKKyAgICAgICAgbWVhbnMgdGhhdCB0aGlzIHRhc2sgd2lsbCBpbnN0YW50bHkgdGFrZQorICAgICAgICBhZHZhbnRhZ2Ugb2YgYW55IG5ldyBmdW5jdGlvbmFsaXR5IGFkZGVkIHRoZXJlLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41LjMgYW5kIGFib3ZlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vY29jb29uLmFwYWNoZS5vcmcvMi4xLyI+aHR0cDovL2NvY29vbi5hcGFjaGUub3JnLzIuMS88L2E+PC90ZD4KKyAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vY29jb29uLmFwYWNoZS5vcmcvMi4xL3VzZXJkb2NzL29mZmlsaW5lL2FudC5odG1sIj5odHRwOi8vY29jb29uLmFwYWNoZS5vcmcvMi4xL3VzZXJkb2NzL29mZmxpbmUvYW50Lmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOnVzZXJzLmF0LmNvY29vbi5hcGFjaGUub3JnIj51c2VycyBhdCBjb2Nvb24uYXBhY2hlLm9yZzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICA8L3RhYmxlPgorICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ29uZmlndXJlIj4KKworICAgICAgICA8cD5SZWN1cnNpdmUgYnVpbGQgc3VwcG9ydCAoY2FsbCBhbnQgb24gZXZlcnkgcGFja2FnZSBsZXZlbCwKKyAgICAgICAgYW5kIG9ubHkgYnVpbGQgZmlsZXMgaW4gdGhhdCBwYWNrYWdlIG9yIGluIHRoYXQgcGFja2FnZSBhbmQKKyAgICAgICAgZXZlcnl0aGluZyBiZWxvdykgd2l0aCBzZXBlcmF0aW9uIG9mIHNvdXJjZSBhbmQgb3V0cHV0LjwvcD4KKworICAgICAgICA8cD5UaGUgdGFzayBnZW5lcmF0ZXMgYnVpbGQgZmlsZXMgaW4gYW55IHN1YmRpcmVjdG9yeSAoZXhjZXB0CisgICAgICAgIGZvciBDVlMtZGlyZWN0b3JpZXMpIGZvciB5b3UuIE9ubHkgcGxhY2Ugb25lIGJ1aWxkLnhtbCBmaWxlIGluCisgICAgICAgIHRoZSB0b3AgYW5kIGNhbGwgdGFyZ2V0ICZhcG9zO3NldHVwJmFwb3M7IG9yCisgICAgICAgICZhcG9zO3Jlc2NhbiZhcG9zOy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuMiBhbmQgMS4zPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmRzZGVsZnQubmwvfmxlbXZhbC9hbnQvIj5odHRwOi8vd3d3LmRzZGVsZnQubmwvfmxlbXZhbC9hbnQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpsZW12YWxAZHNkZWxmdC5ubCI+TS5KLlAuIHZhbiBMZWV1d2VuPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkxpY2Vuc2UgZGVyaXZlZCBmcm9tIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDVlNHcmFiIj4KKworICAgICAgICA8cD5BIGxpdHRsZSBDVlMgY2xpZW50IHRoYXQgY2FuIGJlIHVzZWZ1bCB3aGVuIHBlb3BsZSBhcmUKKyAgICAgICAgYmVoaW5kIGNvcnBvcmF0ZSBmaXJld2FsbCB0aGF0IGJsb2NrcyBhbnkgY3ZzCisgICAgICAgIGNvbW11bmljYXRpb25zLiBJdCB1c2VzIHRoZSBWaWV3Q1ZTIHdlYiBpbnRlcmZhY2UgdG8gYWNjZXNzCisgICAgICAgIHRoZSBDVlMgcmVwb3NpdG9yeSB2aWEgc3RhbmRhcmQgaHR0cCwgYW5kIGRvd25sb2FkcyBhbGwgdGhlCisgICAgICAgIGZpbGVzIHByZXNlbnQgaW4gaXQuPC9wPgorCisgICAgICAgIDxwPkl0IHdvcmtzIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciBhcyBhbiBBbnQgdGFzay48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuMyBvciBoaWdoZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9jdnNncmFiLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9jdnNncmFiLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmN2c2dyYWItdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0Ij5DVlNHcmFiCisgICAgICAgICAgICB1c2VyIG1haWxpbmcgbGlzdDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5MR1BMPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJEZXBlbmRlbmNpZXMiPgorICAgICAgICAgIDxwPlRoZSBkZXBlbmRlbmNpZXMgdGFzayBtYW5hZ2VzIGEgc2V0IG9mIGV4dGVybmFsIGRlcGVuZGVuY2llcyB3aGljaAorICAgICAgICAgICAgbWF5IGJlIGRvd25sb2FkZWQgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LAorICAgICAgICAgICAgIHN1Y2ggYXMgaWJpYmxpby5vcmcuIFVzZXMgYSBsb2NhbCBjYWNoZSB0byBhdm9pZCByZXBlYXRlZAorICAgICAgICAgICAgZG93bmxvYWRzLjwvcD4KKworICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgICAgPHRkPlRlc3RlZCB3aXRoIDEuNS4xLCBzaG91bGQgd29yayB3aXRoIDEuNCsuPC90ZD4KKyAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5odHRwdW5pdC5vcmcvZG9jL2RlcGVuZGVuY2llcy5odG1sIj5odHRwOi8vd3d3Lmh0dHB1bml0Lm9yZy9kb2MvZGVwZW5kZW5jaWVzLmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86cnVzc2dvbGRAaHR0cHVuaXQub3JnIj5SdXNzZWxsIEdvbGQ8L2E+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICAgIDx0ZD5NSVQgTGljZW5zZTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJEZXBlbmRlbmN5IEZpbmRlciI+CisgICAgICAgIDxwPkRlcGVuZGVuY3kgRmluZGVyIGV4dHJhY3RzIGRlcGVuZGVuY2llcyBhbmQgT08gbWV0cmljcyBmcm9tCisgICAgICAgIEphdmEgY2xhc3MgZmlsZXMgcHJvZHVjZWQgYnkgbW9zdCBKYXZhIGNvbXBpbGVycy4gSXQgY2FuIGNvbXB1dGUKKyAgICAgICAgQVBJIGRpZmZlcmVuY2VzIGJldHdlZW4gdmVyc2lvbnM7ICBubyBzb3VyY2VzIG5lZWRlZC4gSXQgaW5jbHVkZXMKKyAgICAgICAgQW50IHRhc2tzLCB3ZWIsIFN3aW5nLCBhbmQgY29tbWFuZC1saW5lIGludGVyZmFjZXMsIHdpdGggWFNMCisgICAgICAgIHN0eWxlc2hlZXRzIGZvciBmb3JtYXR0aW5nIG91dHB1dC48L3A+CisKKyAgICAgICAgPHA+WW91IGNhbiB1c2UgaXQgdG8gZXh0cmFjdCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBwYWNrYWdlcywgY2xhc3NlcywKKyAgICAgICAgb3IgZXZlbiBtZXRob2RzLCBvciBhbnkgY29tYmluYXRpb24gdGhlcmVvZi4gIFlvdSBjYW4gdXNlIFBlcmwKKyAgICAgICAgcmVndWxhciBleHByZXNzaW9ucyB0byBmaWx0ZXIgdGhlIGluZm9ybWF0aW9uIGFuZCBwaW5wb2ludCBvbmx5CisgICAgICAgIHdoYXQgeW91IG5lZWQuICBUaGVyZSBpcyBldmVuIGEgV2ViIEFwcGxpY2F0aW9uIHZlcnNpb24gKFdBUiBmaWxlKQorICAgICAgICBzbyBhIHdob2xlIGdyb3VwIG9mIGRldmVsb3BlcnMgY2FuIHNoYXJlIGEgY29tbW9uIHZpZXcuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPlRlc3RlZCB3aXRoIDEuNS4zLCBzaG91bGQgd29yayB3aXRoIDEuNCsuPC90ZD4KKyAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9kZXBmaW5kLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9kZXBmaW5kLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmplYW50ZXNzaWVyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCI+SmVhbiBUZXNzaWVyPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkJTRC1saWtlIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkRveHlnZW4gdGFzayI+CisgICAgICAgIDxwPlRoZXJlIGFyZSB0d28gQW50IHRhc2tzIGZvciBydW5uaW5nIHRoZSBEb3h5Z2VuCisgICAgICAgIGRvY3VtZW50YXRpb24gc3lzdGVtLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS4xIGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5iZ3cub3JnL3Byb2plY3RzL2phdmEvYW50LyI+aHR0cDovL3d3dy5iZ3cub3JnL3Byb2plY3RzL2phdmEvYW50LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86bW9ydGlzQHZvaWNlbmV0LmNvbSI+S3lsZSBSLiBCdXJ0b248L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKworICAgICAgICA8cD5hbmQ8L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNSBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnQtZG94eWdlbi5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vYW50LWRveHlnZW4uc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86YWtrdW1hckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiPkthcnRoaWsgQSBLdW1hcjwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJEVEREb2MiPgorICAgICAgICA8cD5EVEREb2MgaXMgaGVyZSB0byBoZWxwIHlvdSB0byBkb2N1bWVudCB5b3VyIERURCdzIGVmZmljaWVudGx5LiBJdCBpcyBhCisgICAgICAgIHN0cmFpZ2h0Zm9yd2FyZCBleHRlbnNpb24gb2YgdGhlIGphdmFkb2MgY29uY2VwdCB0byB0aGUgRFREIGZpbGUgZm9ybWF0LjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40IGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2R0ZGRvYy5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vZHRkZG9jLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9tYWlsLz9ncm91cF9pZD01MzcwNCI+UHJvamVjdCBNYWlsaW5nIExpc3Q8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+WDExIChPcGVuIFNvdXJjZSk8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkVudkdlbiI+CisgICAgICAgIDxwPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYmFzaWx2LmNvbS9wc2Qvc29mdHdhcmUiPkVudkdlbjwvYT4gaXMgYW4gQW50IHRhc2sgZm9yIGdlbmVyYXRpbmcgCisgICAgICAgICAgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIGZpbGUgcGFyYW1ldGVyaXplZCBmb3IgZGlmZmVyZW50IGVudmlyb25tZW50cyAoaS5lLiAKKyAgICAgICAgICBkZXZlbG9wbWVudCwgdGVzdCwgYW5kIHByb2R1Y3Rpb24pLiBGaWxlIGdlbmVyYXRpb24gaXMgZG9uZSB1c2luZyAKKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZnJlZW1hcmtlci5vcmcvIj5GcmVlTWFya2VyPC9hPiwgYSB0ZW1wbGF0ZSBlbmdpbmUgd2l0aCBhIGZ1bGwtZmVhdHVyZWQgCisgICAgICAgICAgdGVtcGxhdGluZyBsYW5ndWFnZS4KKyAgICAgICAgPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS42LjUgb3IgaGlnaGVyIChub3QgdGVzdGVkIG9uIGVhcmxpZXIgdmVyc2lvbnMpPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmJhc2lsdi5jb20vcHNkL3NvZnR3YXJlIj5odHRwOi8vd3d3LmJhc2lsdi5jb20vc29mdHdhcmU8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5iYXNpbHYuY29tL3BzZC9zb2Z0d2FyZS9mZWVkYmFjayI+RW52R2VuIEZlZWRiYWNrIFBhZ2U8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R1BMPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJFTU1BIj4KKyAgICAgICAgPHA+RU1NQSBpcyBhbiBvcGVuLXNvdXJjZSB0b29sa2l0IGZvciBtZWFzdXJpbmcgYW5kIHJlcG9ydGluZworICAgICAgICBKYXZhIGNvZGUgY292ZXJhZ2UuIEVNTUEgZGlzdGluZ3Vpc2hlcyBpdHNlbGYgZnJvbSBvdGhlciB0b29scworICAgICAgICBieSBnb2luZyBhZnRlciBhIHVuaXF1ZSBmZWF0dXJlIGNvbWJpbmF0aW9uOiBzdXBwb3J0IGxhcmdlLXNjYWxlCisgICAgICAgIGVudGVycHJpc2Ugc29mdHdhcmUgZGV2ZWxvcG1lbnQgd2hpbGUga2VlcGluZyBpbmRpdmlkdWFsIGRldmVsb3BlcnMKKyAgICAgICAgd29yayBmYXN0IGFuZCBpdGVyYXRpdmUgYXQgdGhlIHNhbWUgdGltZS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNCBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9lbW1hLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9lbW1hLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmVtbWEtdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0Ij5NYWlsaW5nbGlzdDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5Db21tb24gUHVibGljIExpY2Vuc2UgMS4wPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJGTVBQIj4KKyAgICAgICAgPHA+Rk1QUCBpcyBhIGdlbmVyYWwtcHVycG9zZSB0ZXh0IGZpbGUgcHJlcHJvY2Vzc29yIHRvb2wgdGhhdAorICAgICAgICB1c2VzIEZyZWVNYXJrZXIgdGVtcGxhdGVzLiBJdCBpcyBwYXJ0aWN1bGFybHkgZGVzaWduZWQgZm9yCisgICAgICAgIEhUTUwgcHJlcHJvY2Vzc29yLCBmb3IgdGhlIGdlbmVyYXRpb24gb2YgY29tcGxldGUgKHN0YXRpYykKKyAgICAgICAgaG9tZXBhZ2VzOiBkaXJlY3Rvcnkgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgSFRNTC1zLCBpbWFnZQorICAgICAgICBmaWxlcywgZXRjLiBCdXQgb2YgY291cnNlIGl0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHNvdXJjZQorICAgICAgICBjb2RlIG9yIHdoYXRldmVyIHRleHQgZmlsZXMuIEZNUFAgaXMgZXh0ZW5kYWJsZSB3aXRoIEphdmEKKyAgICAgICAgY2xhc3NlcyB0byBwdWxsIGRhdGEgZnJvbSBhbnkgZGF0YSBzb3VyY2VzIChYTUwgZmlsZSwKKyAgICAgICAgZGF0YWJhc2UsIGV0Yy4pIGFuZCBlbWJlZCB0aGUgZGF0YSBpbnRvIHRoZSBnZW5lcmF0ZWQKKyAgICAgICAgZmlsZXMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUuMTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2ZtcHAuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2ZtcHAuc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5CU0QgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuSmFyIj4KKyAgICAgICAgPHA+QnVpbGRzIGEgSkFSIGZpbGUgYmFzZWQgb24gY2xhc3MgZGVwZW5kZW5jaWVzIHJhdGhlciB0aGFuIHNpbXBseSB0aGUgY29udGVudHMgb2YgYSBkaXJlY3Rvcnk8L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNCBhbHBoYSAoYnVpbHQgYWZ0ZXIgMjAwMS8wOC8wNCkgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vZ2VuamFyLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9nZW5qYXIuc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86amVzc2VfZGV2QHlhaG9vLmNvbSI+SmVzc2UgU3RvY2thbGw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iR3JhbmQiPgorICAgICAgICA8cD5HcmFuZCBpcyBhIHNldCBvZiB0b29scyB0byBjcmVhdGUgYSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgQW50IHRhcmdldAorICAgICAgICAgIGRlcGVuZGVuY2llcy4gSXQgd29ya3MgYnkgdGFraW5nIGFuIEFudCBidWlsZCBmaWxlIGFuZCBjcmVhdGluZyBhICJkb3QiIGZpbGUuIEl0CisgICAgICAgICAgZGlmZmVycyBmcm9tIHRoZSBleGlzdGluZyB0b29scyBieSByZWx5aW5nIG9uIHRoZSBBbnQgQVBJIHJhdGhlciB0aGFuIFhNTCBwYXJzaW5nIHRvCisgICAgICAgICAgZ2V0IHRoZSBkZXBlbmRlbmNpZXMuIEl0IGluY2x1ZGVzIG1hbnkgYWR2YW5jZWQgZmVhdHVyZXMgc3VjaCBhcyBmaWx0ZXJpbmcgb3IKKyAgICAgICAgICByZW5kZXJpbmcgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQncyBuYXR1cmUuIEFsc28gZmVhdHVyZXMgYSBTV1QgYmFzZWQgR1VJLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS42IGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5nZ3Rvb2xzLm5ldC9ncmFuZC8iPmh0dHA6Ly93d3cuZ2d0b29scy5uZXQvZ3JhbmQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPkNocmlzdG9waGUgTGFib3Vpc3NlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QlNEIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkdyZWVibyI+CisKKyAgICAgICAgPHA+R3JlZWJvIGlzIGFuIEFudC10YXNrIGZvciBkb3dubG9hZGluZyBkZXBlbmRlbmN5IGZpbGVzCisgICAgICAgIChjdXJyZW50bHkgb25seSBqYXJzKSBmcm9tIGEgbmV0d29yayB0byBhIHNwZWNpZmllZCBkaXJlY3RvcnksCisgICAgICAgIG11Y2ggbGlrZSBNYXZlbi4gSXQgc3VwcG9ydHMgbXVsdGlwbGUgbG9jYWwgYW5kIHJlbW90ZQorICAgICAgICByZXBvc2l0b3JpZXMgd2l0aCBlaXRoZXIgZmxhdCBvciBtYXZlbi1saWtlIHN0cnVjdHVyZXMuIEl0IGNhbgorICAgICAgICByZWFkIHRoZSBkZXBlbmRlbmN5IGxpc3QgZnJvbSBhIE1hdmVuIHByb2plY3QgZmlsZSwgYQorICAgICAgICBtYXZlbi1saWtlIGRlcGVuZGVuY3kgZmlsZSwgb3IgZGlyZWN0bHkgZnJvbSB0aGUgYnVpbGQueG1sCisgICAgICAgIGZpbGUuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9ncmVlYm8uc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2dyZWViby5zb3VyY2Vmb3JnZS5uZXQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvbWFpbC8/Z3JvdXBfaWQ9NzM3MzMiPnByb2plY3QgbWFpbGluZyBsaXN0czwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iR3JvYm9VdGlscyBDb2RlQ292ZXJhZ2UiPgorCisgICAgICAgIDxwPlRoZSBDb2RlQ292ZXJhZ2Ugc3ViLXByb2plY3Qgb2YgR3JvYm9VdGlscyBwcm92aWRlcyBhIDEwMCUKKyAgICAgICAgcHVyZSBKYXZhIGNvZGUgY292ZXJhZ2UgdG9vbC4gIEl0IHVzZXMgcHJlLWV4ZWN1dGlvbiBjbGFzcyBmaWxlCisgICAgICAgIHJlY29tcGlsYXRpb24sIGFuZCBnZW5lcmF0ZXMgWE1MIGZpbGVzIGNvbnRhaW5pbmcgdGhlIGNvdmVyYWdlCisgICAgICAgIHN0YXRpc3RpY3MuICBJdCBkb2VzIG5vdCByZXF1aXJlIGFueSBhZHZhbmNlZCBWTSBzZXR1cCB0byBnZW5lcmF0ZQorICAgICAgICBjb3ZlcmFnZSBudW1iZXJzLgorICAgICAgICA8L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNS4xPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vZ3JvYm91dGlscy5zb3VyY2Vmb3JnZS5uZXQvY29kZWNvdmVyYWdlLyI+aHR0cDovL2dyb2JvdXRpbHMuc291cmNlZm9yZ2UubmV0L2NvZGVjb3ZlcmFnZS88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9tYWlsLz9ncm91cF9pZD0yMjU5NCI+cHJvamVjdCBtYWlsaW5nIGxpc3RzPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPk1JVCBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJIYW1tdXJhcGkiPgorICAgICAgICA8cD5KYXZhIGNvZGUgcmV2aWV3IHRvb2wuIFBlcmZvcm1zIGF1dG9tYXRlZCBjb2RlCisgICAgICAgIHJldmlldy4gQ29udGFpbnMgMTExIGluc3BlY3RvcnMgd2hpY2ggY2hlY2sgZGlmZmVyZW50IGFzcGVjdHMKKyAgICAgICAgb2YgY29kZSBxdWFsaXR5IGluY2x1ZGluZyBjb2Rpbmcgc3RhbmRhcmRzLCBFSkIsIHRocmVhZGluZywKKyAgICAgICAgLi4uPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5UZXN0ZWQgd2l0aCBBbnQgMS41LnggYW5kIDEuNi41PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmhhbW11cmFwaS5iaXovcHJvZHVjdHMvaGFtbXVyYXBpIj5odHRwOi8vd3d3LmhhbW11cmFwaS5iaXovcHJvZHVjdHMvaGFtbXVyYXBpPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuaGFtbXVyYXBpLmJpei9oYW1tdXJhcGktYml6L2VmL3htZW51L2NvbnRhY3QuaHRtbCI+UHJvamVjdCBDb250YWN0IFBhZ2U8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCk8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkhlbHBTdHVkaW9BbnQiPgorICAgICAgICA8cD5UaGlzIHRhc2sgYWxsb3dzIGZvciBIZWxwU3R1ZGlvIHByb2plY3RzIHRvIGJlIGNyZWF0ZWQgdmlhIEFudC48L3A+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjYuMCBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9oZWxwc3R1ZGlvYW50LnNvdXJjZWZvcmdlLm5ldCI+aHR0cDovL2hlbHBzdHVkaW9hbnQuc291cmNlZm9yZ2UubmV0PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJRExEZXBlbmQiPgorICAgICAgICA8cD5pZGxkZXBlbmQgaXMgYSB0YXNrIHRoYXQgKHJlKWdlbmVyYXRlcyBKYXZhIHNvdXJjZXMgdG8gYmUKKyAgICAgICAgY3JlYXRlZCBmcm9tIENPUkJBL0lETCBmaWxlcy48L3A+CisKKyAgICAgICAgPHA+SXQgcGFyc2VzIHRoZSBJREwgZmlsZSBhbmQgZGV0ZXJtaW5lcyB0aGUgSmF2YSBmaWxlcyB0aGF0CisgICAgICAgIG11c3QgYmUgZ2VuZXJhdGVkLCB0YWtpbmcgaW4gYWNjb3VudCB0aGUgbW9kaWZpY2F0aW9ucyB0aGF0CisgICAgICAgIGNhbiBoYXBwZW4gZHVlIHRvIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLiAgSWYgYW55IG9mIHRoZSBKYXZhCisgICAgICAgIGZpbGVzIGFyZSBtaXNzaW5nIG9yIG9sZGVyIHRoYW4gdGhlIHNvdXJjZSBJREwgc3BlY2lmaWNhdGlvbiwKKyAgICAgICAgaXQgbGF1bmNoZXMgdGhlIHNwZWNpZmllZCBjb21waWxlci4gIFRoZSBjb21waWxlcnMgb2YgT3JiYWN1cywKKyAgICAgICAgSmFjb3JiLCBPcGVuT1JCLCBPcmJpeDJrIGFuZCBTdW4nSkRLIGRpc3RyaWJ1dGlvbnMgYXJlCisgICAgICAgIHN1cHBvcnRlZC48L3A+CisKKyAgICAgICAgPHA+VG8gc3BlZWQgdXAgdGhlIHByb2Nlc3MgYW5kIGF2b2lkIHVubmVjZXNhcnkgcmUtcGFyc2luZywgaXQKKyAgICAgICAga2VlcHMgdGhlIGRlcGVuZGVuY2llcyBpbiBpbnRlcm1lZGlhdGUgZmlsZXMuICBUaGlzIHRhc2sgZG9lcworICAgICAgICBub3QgbGF1bmNoIHRoZSBqYXZhYyBjb21waWxlciBhcyB3ZWxsLCB0aGF0IGlzLCBpdHMgb3V0cHV0IGFyZQorICAgICAgICBKYXZhIGZpbGVzIGFuZCBub3QgdGhlIGZpbmFsIGJ5dGVjb2RlLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40IG9yIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmJ5dGVzbG9vc2VyLmNvbS9pZGxkZXBlbmQvIj5odHRwOi8vd3d3LmJ5dGVzbG9vc2VyLmNvbS9pZGxkZXBlbmQ8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmJ5dGVzbG9vc2VyQGdtYWlsLmNvbSI+Ynl0ZXNsb29zZXJAZ21haWwuY29tPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPmZyZWUgc291cmNlLCBubyBsaWNlbnNlIHJlc3RyaWN0aW9uczwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSW1hZ2UiPgorICAgICAgICA8cD5JbWFnZSB0YXNrIGdlbmVyYXRlcyBhbmQgdHJhbnNmb3JtcyBpbWFnZXMuIEl0IGV4cG9zZXMgdGhlCisgICAgICAgIGltYWdpbmcgY2FwYWJpbGl0eSBhdmFpbGFibGUgaW4gSmF2YTJELCBKYXZhIEFkdmFuY2VkIEltYWdpbmcsCisgICAgICAgIEltYWdlSU8sIGV0Yy4sIGFzIHNldCBvZiBuZXN0ZWQgZWxlbWVudHMuPC9wPgorCisgICAgICAgIDxwPkltYWdlIHRyYW5zZm9ybWF0aW9ucyBzdWNoIGFzICZxdW90O3Jlc2l6ZSZxdW90OworICAgICAgICAoc2NhbGUpLCZxdW90O292ZXJsYXkmcXVvdDsgKG9uZSBpbWFnZSBvbiBhbm90aGVyKSwKKyAgICAgICAgJnF1b3Q7Ym9yZGVyJnF1b3Q7IChhZGQgYSBib3JkZXIpLCAmcXVvdDt0ZXh0JnF1b3Q7ICh0ZXh0IG9uCisgICAgICAgIGltYWdlKSwgJnF1b3Q7Y3JvcCZxdW90OyAoYSBzdWItaW1hZ2Ugb2YgYSBiaWdnZXIgaW1hZ2UpLAorICAgICAgICAmcXVvdDtyb3RhdGUmcXVvdDssICZxdW90O2dyYXlzY2FsZSZxdW90OyAoY2hhbmdlIGEgY29sb3IKKyAgICAgICAgaW1hZ2UgdG8gc2hhZGVzIG9mIGdyYXkpLjxici8+CisgICAgICAgIE5vdyBpdCBzdXBwb3J0cyB0cmFuc3BhcmVuY3kgKG1ha2luZyBpbWFnZXMgdHJhbnNsdWNlbnQpLCBhCisgICAgICAgIGJlc3RmaXQgb3B0aW9uIGZvciBSZXNpemUsIHNpbXBsZSBzdXBwb3J0IGZvciBpbWFnZXMgd2l0aGluCisgICAgICAgIGEgc2VjdXJpdHktY29uc3RyYWludCwgYSBwcmVsaW1pbmFyeSBzdXBwb3J0IChpZiBwamF0b29scy5qYXIKKyAgICAgICAgaXMgYXZhaWxhYmxlKSBmb3Igc2F2aW5nIGZpbGVzIGFzIEdJRiBhbmQgc29tZSBvdGhlciBmaXhlcy48L3A+CisKKyAgICAgICAgPHA+SU1QT1JUQU5UOiBZb3Ugd2lsbCBuZWVkIHRoZSBQTUlXIChQb29yIE1hbidzIEltYWdpbmcgV3JhcHBlcikgamFyCisgICAgICAgIGZvciBhbGwgdGhlIG9wZXJhdGlvbnMgYW5kIHRoZSBwamF0b29scyBqYXIgZm9yIEdJRiBlbmNvZGluZy8gc2F2aW5nCisgICAgICAgIHN1cHBvcnQuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjQ8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhCisgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5tdWxsYXNzZXJ5LmNvbS9zb2Z0d2FyZS9BTlQvIj5odHRwOi8vd3d3Lm11bGxhc3NlcnkuY29tL3NvZnR3YXJlL0FOVC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5wbWl3IGphcjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEKKyAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3Lm11bGxhc3NlcnkuY29tL3NvZnR3YXJlL1BNSVcvIj5odHRwOi8vd3d3Lm11bGxhc3NlcnkuY29tL3NvZnR3YXJlL1BNSVcvPC9hPgorICAgICAgICAgICAgICAgIChQb29yIE1hbidzIEltYWdpbmcgV3JhcHBlcik8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPnBqYXRvb2xzIGphcjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEKKyAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmV0ZWtzLmNvbS9wamEvZW4vIj5odHRwOi8vd3d3LmV0ZWtzLmNvbS9wamEvZW4vPC9hPgorICAgICAgICAgICAgICAgIChwamF0b29scyBmb3IgR0lGIGVuY29kaW5nIHN1cHBvcnQpPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5tdWxsYXNzZXJ5LmNvbSI+QWJleSBNdWxsYXNzZXJ5PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJbXBvcnRzY3J1YmJlciI+CisgICAgICAgIDxwPlJlbW92ZXMgdW5uZWNlc3NhcnkgaW1wb3J0IHN0YXRlbWVudHMgZnJvbSBhIEphdmEgc291cmNlIGNvZGUgZmlsZS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuMzwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2ltcG9ydHNjcnViYmVyLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9pbXBvcnRzY3J1YmJlci5zb3VyY2Vmb3JnZS5uZXQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzp0b21jb3BlbGFuZEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiPlRvbSBDb3BlbGFuZDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5MR1BMPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJbVRhc2siPgorCisgICAgICAgIDxwPkltVGFzayBpcyBhIHRhc2sgdG8gYWxsb3cgb25lIHRvIHNlbmQgYW4gSW5zdGFudAorICAgICAgICBNZXNzYWdlLiBDdXJyZW50bHkgc3VwcG9ydHMgeWFob28hLCBBSU0sIGFuZCBKYWJiZXI8L3A+CisKKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41IG9yIGhpZ2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2ltdGFzay5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vaW10YXNrLnNvdXJjZWZvcmdlLm5ldDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86ZGphbGxzdGFyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCI+Sm9uIE1hZGlzb248L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIExHUEw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkluY2FudG8iPgorCisgICAgICAgIDxwPkFudCB0YXNrcyB0byBwcm92aWRlIHN1cHBvcnQgZm9yIE9yYWNsZSBkYXRhYmFzZSB0b29scworICAgICAgICAoc3VjaCBhcyBTUUwqUGx1cywgSW1wb3J0LCBFeHBvcnQpPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjY8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9pbmNhbnRvLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9pbmNhbnRvLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmFsZXhya0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiPkFsZXhhbmRlciBLYXJuc3RlZHQ8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJc0RpclZhbGlkYXRvciI+CisKKyAgICAgICAgPHA+Q2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBkaXJlY3Rvcnkgc3RydWN0dXJlIGNvbmZvcm1zIHRvCisgICAgICAgIGNlcnRhaW4gcnVsZXMgdGhhdCBhcmUgZGVmaW5lZCB2aWEgbmVzdGVkIGVsZW1lbnRzIG9mIHRoZQorICAgICAgICB0YXNrLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vaXN2YWxpZGF0b3Iuc291cmNlZm9yZ2UubmV0L2VuL2lzRGlyVmFsaWRhdG9yLmh0bSI+aHR0cDovL2lzdmFsaWRhdG9yLnNvdXJjZWZvcmdlLm5ldC9lbi9pc0RpclZhbGlkYXRvci5odG08L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOm5ld3NAaW5pZ29zZXJyYW5vLmNvbSI+SSYjeEYxO2lnbyBTZXJyYW5vPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJdnkiPgorCisgICAgICAgIDxwPkl2eSBpcyBhIHNpbXBsZSB5ZXQgcG93ZXJmdWwgZGVwZW5kZW5jeSBtYW5hZ2VyIGZlYXR1cmluZworICAgICAgICBjb250aW51b3VzIGludGVncmF0aW9uLCBkZXBlbmRlbmNpZXMgb2YgZGVwZW5kZW5jaWVzCisgICAgICAgIG1hbmFnZW1lbnQsIG11bHRpcGxlIHJlcG9zaXRvcmllcyBpbmNsdWRpbmcgaWJpYmxpbyBhbmQgaGlnaAorICAgICAgICBwZXJmb3JtYW5jZSAodXNlIG9mIGEgbG9jYWwgY2FjaGUpLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD4xLjUuMSAoMS42LjUgb3IgMS43LjAgcmVjb21tZW5kZWQpPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvaXZ5LyI+aHR0cDovL2luY3ViYXRvci5hcGFjaGUub3JnL2l2eS88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+aXZ5LXVzZXIgKGF0KSBpbmN1YmF0b3IgKGRvdCkgYXBhY2hlIChkb3QpIG9yZyBbVXNlciBNYWlsaW5nbGlzdF08L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSjJNRSBBbnQgVGFza3MiPgorCisgICAgICAgIDxwPlRoZXJlIGFyZSBkaWZmZXJlbnQgc2V0cyBvZiB0YXNrcyB0byBoZWxwIGJ1aWxkIDxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJtZS8iPkphdmEgMiBQbGF0Zm9ybSwgTWljcm8KKyAgICAgICAgRWRpdGlvbjwvYT4gKEoyTUUpIGFwcGxpY2F0aW9ucy48L3A+CisKKyAgICAgICAgPHN1YnN1YnNlY3Rpb24gbmFtZT0iQW50ZW5uYSI+CisgICAgICAgICAgPHA+QW50ZW5uYSBwcm92aWRlcyBhIHNldCBvZiBBbnQgdGFza3Mgc3VpdGFibGUgZm9yIGRldmVsb3BpbmcKKyAgICAgICAgICB3aXJlbGVzcyBKYXZhIGFwcGxpY2F0aW9ucyB0YXJnZXRlZCBhdCB0aGUgTW9iaWxlIEluZm9ybWF0aW9uCisgICAgICAgICAgRGV2aWNlIFByb2ZpbGUgKE1JRFApLiBXaXRoIEFudGVubmEsIHlvdSBjYW4gY29tcGlsZSwKKyAgICAgICAgICBwcmV2ZXJpZnksIHBhY2thZ2UsIG9iZnVzY2F0ZSwgYW5kIHJ1biB5b3VyIE1JRFAgYXBwbGljYXRpb25zCisgICAgICAgICAgKGFrYSBNSURsZXRzKSwgbWFuaXB1bGF0ZSBKYXZhIEFwcGxpY2F0aW9uIERlc2NyaXB0b3IgKEpBRCkKKyAgICAgICAgICBmaWxlcywgYXMgd2VsbCBhcyBjb252ZXJ0IEpBUiBmaWxlcyB0byBQUkMgZmlsZXMgZGVzaWduZWQgdG8KKyAgICAgICAgICBydW4gb24gTUlEUCBmb3IgUGFsbSBPUy4gRGVwbG95bWVudCBpcyBzdXBwb3J0ZWQgdmlhIGEKKyAgICAgICAgICBkZXBsb3ltZW50IHRhc2sgYW5kIGEgY29ycmVzcG9uZGluZyBIVFRQIHNlcnZsZXQgZm9yCisgICAgICAgICAgT3Zlci10aGUtQWlyIChPVEEpIHByb3Zpc2lvbmluZy4gQSBzbWFsbCBwcmVwcm9jZXNzb3IgYWxsb3dzCisgICAgICAgICAgdG8gZ2VuZXJhdGUgZGlmZmVyZW50IHZhcmlhbnRzIG9mIGEgTUlEbGV0IGZyb20gYSBzaW5nbGUKKyAgICAgICAgICBzb3VyY2UuPC9wPgorCisgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgICA8dGQ+QW50IDEuNC4xIG9yIGxhdGVyPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnRlbm5hLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnRlbm5hLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86am9lcmdAcGxldW1hbm4uZGUiPkomI3hGNjtyZyBQbGV1bWFubjwvYT48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgICAgPHRkPkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvc3Vic3Vic2VjdGlvbj4KKworICAgICAgICA8c3Vic3Vic2VjdGlvbiBuYW1lPSJBbnRpYyI+CisgICAgICAgICAgPHA+QW50aWMgaXMgYSBmcmVlbHkgYXZhaWxhYmxlIHRhc2sgZm9yIHBhY2thZ2luZyBKMk1FCisgICAgICAgICAgYXBwbGljYXRpb25zLiBJdCBwcm9kdWNlcyBib3RoIHRoZSBKYXIgYW5kIEphZCBmaWxlcyBpbiBhCisgICAgICAgICAgc2luZ2xlIHN0ZXAuIFRoaXMgYWxsb3dzICphbGwqIGVudHJpZXMgdG8gYmUgY29ycmVjbHR5IHNldCBpbgorICAgICAgICAgIHRoZSBqYWQgZmlsZSwgaW5jbHVkaW5nIHRoZSBzaXplIG9mIHRoZSBqYXIgZmlsZSB0aGF0IGlzCisgICAgICAgICAgcHJvZHVjZWQuIFRoaXMgdGFzayBoYXMgYmVlbiB1c2VkIGFuZCB0ZXN0ZWQgZXh0ZW5zaXZlbHkgd2l0aAorICAgICAgICAgIFN1bidzIFdpcmVsZXNzIFRvb2xraXQgYW5kIGFsc28gdGhlIE5va2lhIFNESyBhbmQKKyAgICAgICAgICBlbXVsYXRvcnMuPC9wPgorCisgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgICA8dGQ+QW50IDEuNTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnNtYXJ0a2V5LmNvLnVrL3Rvb2xzL2FudGljL2FudGljLmh0bWwiPmh0dHA6Ly93d3cuc21hcnRrZXkuY28udWsvdG9vbHMvYW50aWMvYW50aWMuaHRtbDwvYT4KKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86c3VwcG9ydEBzbWFydGtleS5jby51ayI+c21hcnRrZXkuY28udWs8L2E+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICAgIDx0ZD5HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvc3Vic3Vic2VjdGlvbj4KKworICAgICAgICA8c3Vic3Vic2VjdGlvbiBuYW1lPSJEYXZlJ3MgSjJNRSBUYXNrcyI+CisgICAgICAgICAgPHA+VGhpcyBzZXQgc3VwcG9ydHMgQ0xEQyBhbmQgdGhlIEsgVmlydHVhbCBNYWNoaW5lIChLVk0pOjwvcD4KKworICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgICAgPHRkPkFudCAxLjM8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5kcmliaW4ub3JnL2RhdmUvajJtZV9hbnQvIj5odHRwOi8vd3d3LmRyaWJpbi5vcmcvZGF2ZS9qMm1lX2FudC88L2E+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86ZHJpYkBlbnRlcmFjdC5jb20iPkRhdmUgRHJpYmluPC9hPjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgICA8dGQ+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2U8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L3N1YnN1YnNlY3Rpb24+CisKKyAgICAgICAgPHN1YnN1YnNlY3Rpb24gbmFtZT0iSjJNRSBQb2xpc2giPgorICAgICAgICAgIDxwPkoyTUUgUG9saXNoIGlzIGFuIEFudC1iYXNlZCB0b29sIGZvciB0aGUgY3JlYXRpb24gb2YKKyAgICAgICAgICBNSURQIGFwcGxpY2F0aW9ucy4gSXQgY292ZXJzIHRoZSB3aG9sZSBjaXJjbGUgb2YgcHJlcHJvY2Vzc2luZywgY29tcGlsaW5nLAorICAgICAgICAgIG9iZnVzY2F0aW9uLCBwcmV2ZXJpZnlpbmcsIHBhY2thZ2luZyBhbmQgSkFELWNyZWF0aW9uLiBKMk1FIFBvbGlzaCBpcworICAgICAgICAgIGlkZWFsIGZvciBjcmVhdGluZyBkZXZpY2Ugb3B0aW1pemVkIGFwcGxpY2F0aW9ucyB3aXRoIGl0cyBwb3dlcmZ1bAorICAgICAgICAgIHByZXByb2Nlc3NpbmcgY2FwYWJpbGl0aWVzIGFuZCB0aGUgaW50ZWdyYXRlZCBkZXZpY2UgZGF0YWJhc2UuCisgICAgICAgICAgV2l0aCBKMk1FIFBvbGlzaCBubyBoYXJkY29kZWQgdmFsdWVzIGFyZSBuZWVkZWQgYW5kIHRoZSBwb3J0YWJpbGl0eSBvZiBhbgorICAgICAgICAgIGFwcGxpY2F0aW9uIGlzIG5vdCBzYWNyaWZpY2VkLCBldmVuIHRob3VnaCBoaWdobHkgb3B0aW1pemVkIGFwcGxpY2F0aW9ucyBhcmUKKyAgICAgICAgICBjcmVhdGVkIGZyb20gYSBzaW5nbGUgc291cmNlLgorICAgICAgICAgIDxici8+CisgICAgICAgICAgSXQgY29udGFpbnMgYSBsb2dnaW5nIGZyYW1ld29yayBhbmQgYW4gb3B0aW9uYWwgTUlEUC1jb21wYXRpYmxlIEdVSQorICAgICAgICAgIHdoaWNoIGNhbiBiZSBkZXNpZ25lZCB1c2luZyB0aGUgd2ViLXN0YW5kYXJkIENTUy4gV2l0aCB0aGUgSjJNRSBQb2xpc2ggR1VJCisgICAgICAgICAgeW91IGNhbiBldmVuIHVzZSBNSURQLzIuMCBmZWF0dXJlcyBvbiBNSURQLzEuMCBwaG9uZXMuCisgICAgICAgICAgPC9wPgorCisgICAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgICA8dGQ+QW50IDEuNC4xIG9yIGxhdGVyPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgICAgPHRkPjxhCisgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuajJtZXBvbGlzaC5vcmcvIj5odHRwOi8vd3d3LmoybWVwb2xpc2gub3JnLzwvYT48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpqMm1lcG9saXNoQGVub3VnaC5kZSI+RW5vdWdoIFNvZnR3YXJlPC9hPjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U7IGNvbW1lcmNpYWwgbGljZW5zZXMgYXZhaWxhYmxlPC90ZD4KKyAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L3N1YnN1YnNlY3Rpb24+CisKKyAgICAgICAgPHN1YnN1YnNlY3Rpb24gbmFtZT0iU3RhbXB5c29mdCdzIEoyTUUgVGFza3MiPgorICAgICAgICAgIDxwPkFuZCB0aGlzIHNldCB3b3JrcyB3aXRoIHRoZSBKMk1FIFdpcmVsZXNzIFRvb2xraXQgYW5kIE1JRFAKKyAgICAgICAgICBmb3IgUGFsbU9TOjwvcD4KKworICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgICAgPHRkPkFudCAxLjM8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5zdGFtcHlzb2Z0LmNvbS9hbnQvIj5odHRwOi8vd3d3LnN0YW1weXNvZnQuY29tL2FudC88L2E+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86amVja2Vsc0BzdGFtcHlzb2Z0LmNvbSI+Sm9zaCBFY2tlbHM8L2E+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICAgIDx0ZD5NSVQgTGljZW5zZTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvc3Vic3Vic2VjdGlvbj4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSmFjc29uIj4KKworICAgICAgICA8cD5KYWNzb24gaXMgYSBjb25maWd1cmFibGUgYW5kIHBsdWdhYmxlIHRvb2wgKG11Y2ggbGlrZSBBbnQKKyAgICAgICAgaXRzZWxmKSB0byBjcmVhdGUgZmlsdGVycyBmb3IgdGV4dCAobGluZSBiYXNlZCkgZmlsZXMgd2l0aG91dAorICAgICAgICBwcm9ncmFtbWluZy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+SmFjc29uIGhhcyBiZWVuIHVzZWQgYW5kIHRlc3RlZCB3aXRoIDEuNS4xLCBzaG91bGQKKyAgICAgICAgICAgIHdvcmsgd2l0aCAxLjQrPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFjc29uLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9qYWNzb24uc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86amFjc29uLXVzZXJAbGlzdHMuc291cmNlZm9yZ2UuZGUiPmphY3Nvbi11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLmRlPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBMaWJyYXJ5IG9yIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJKYWxvcHkiPgorCisgICAgICAgIDxwPkFuIEFudCBQbHVnLWluIGZvciB0aGUgSmF2YSBTb3VyY2UgQ29kZSBGb3JtYXR0ZXIKKyAgICAgICAgSmFsb3B5LjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40IChvciBoaWdoZXIpPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFsb3B5LnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9qYWxvcHkuc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamFsb3B5LnNmLm5ldC9jb250YWN0Lmh0bWwiPmh0dHA6Ly9qYWxvcHkuc2YubmV0L2NvbnRhY3QuaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5TdGFydGluZyB3aXRoIHJlbGVhc2UgMS4wIEJldGEgNiB0aGUgbGljZW5zZSBpcyB0aGUKKyAgICAgICAgICAgIEJTRCBMaWNlbnNlLiAgUHJpb3IgcmVsZWFzZXMgd2VyZSB1bmRlciB0aGUgR05VIEdlbmVyYWwKKyAgICAgICAgICAgIFB1YmxpYyBMaWNlbnNlLjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSmFyQnVuZGxlciI+CisKKyAgICAgICAgPHA+SmFyQnVuZGxlciBpcyBhIHRhc2sgdGhhdCBnZW5lcmF0ZXMgTWFjIE9TIFggbmF0aXZlIEphdmEKKyAgICAgICAgQXBwbGljYXRpb24gQnVuZGxlcy4gIEl0IGlzIGZ1bGx5IGNvbmZpZ3VyYWJsZSBhbmQgY2FuIGJlIHVzZWQKKyAgICAgICAgdG8gZ2VuZXJhdGUgTWFjIE9TIFggYXBwbGljYXRpb24gYnVuZGxlcyBmcm9tIGFueSBzdXBwb3J0ZWQKKyAgICAgICAgSmF2YSBwbGF0Zm9ybSwgbWFraW5nIGl0IGlkZWFsIGZvciB0YXJnZXRpbmcgbXVsdGlwbGUKKyAgICAgICAgcGxhdGZvcm1zIHdpdGggb25lIGJ1aWxkLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40IGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5sb29tY29tLmNvbS9qYXJidW5kbGVyLyI+aHR0cDovL3d3dy5sb29tY29tLmNvbS9qYXJidW5kbGVyLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86c2V0aG1AbG9vbWNvbS5jb20iPlNldGggTW9yYWJpdG88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkphclBhdGNoIj4KKworICAgICAgICA8cD5KYXJQYXRjaCBpcyBhIHRhc2sgdGhhdCBnZW5lcmF0ZXMgYSB6aXAgZmlsZSByZXN1bHRpbmcgb2YKKyAgICAgICAgdGhlIGRpZmYgYmV0d2VlbiB0aGUgY29udGVudCBvZiAyIGphciBmaWxlcy48L3A+CisKKyAgICAgICAgPHA+VGhlIHJlc3VsdGluZyBkaWZmIGZpbGUgY2FuIGJlIHVzZSBhcyBhIHBhdGNoIGZvciBhCisgICAgICAgIHByZXZpb3VzIGluc3RhbGxhdGlvbiAoanVzdCBlbnN1cmUgdGhhdCB0aGUgZ2VuZXJhdGVkCisgICAgICAgIHBhdGNoLnppcCBmaWxlIGlzIGxvY2F0ZWQgb24gdGhlIENMQVNTUEFUSCBiZWZvcmUgdGhlIHBhdGNoZWQKKyAgICAgICAgb2xkSmFyIGphciBmaWxlKTwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41IGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEKKyAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vcGVyc28uY2x1Yi1pbnRlcm5ldC5mci9zam9iaWMvYW50LyI+aHR0cDovL3BlcnNvLmNsdWItaW50ZXJuZXQuZnIvc2pvYmljL2FudC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOm5vcmJlcnQuYmFyYm9zYUBsYXBvc3RlLm5ldCI+Tm9yYmVydCBCYXJib3NhPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkxHUEwgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSmF2YSsgUHJlY29tcGlsZSBUYXNrIj4KKworICAgICAgICA8cD5KYXZhKyBpcyBhbiBvcGVuIHNvdXJjZSBKYXZhIHByZXByb2Nlc3NvciB0aGF0IGFkZHMgdGhlc2UKKyAgICAgICAgZmVhdHVyZXMgdG8gYW55IEphdmEgY29tcGlsZXI6PC9wPgorCisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+TXVsdGktbGluZSBzdHJpbmdzIHdpdGggZXhlY3V0YWJsZSBpbmNsdXNpb25zIGxpa2UgUGVybAorICAgICAgICAgIGFuZCBSdWJ5LiBJdCBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciBKU1Agb3IgQVNQIGFuZCB0aGVpcgorICAgICAgICAgIG5lZWQgZm9yIEphdmEgY29tcGlsZXJzIG9uIGRlcGxveW1lbnQgc2VydmVycyAoYSBzZWN1cml0eQorICAgICAgICAgIGNvbmNlcm4pIHdoaWxlIGFkZGluZyBubyBvdmVyaGVhZCBpbiBlaXRoZXIgc3BhY2Ugb3IKKyAgICAgICAgICB0aW1lLiA8L2xpPgorCisgICAgICAgICAgPGxpPk9wdGlvbmFsbHkgc3VwcG9ydHMgbG9jYWxpemF0aW9uIGJ5IHNlZ3JlZ2F0aW5nIEphdmErCisgICAgICAgICAgc3RyaW5ncyBpbnRvIFJlc291cmNlQnVuZGxlIGZpbGVzIHdpdGggaW52YXJpZW50IGtleXMgYmFzZWQKKyAgICAgICAgICBvbiB0aGUgaGFzaCBjb2RlIG9mIHRoZSBzdHJpbmdzJ3MgdmFsdWUuIFRoaXMgaXMgaGFuZGxlZAorICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYW5kIHRyYW5zcGFyZW50bHk7IG5vIGludGVydmVudGlvbiBpcworICAgICAgICAgIHJlcXVpcmVkLjwvbGk+CisKKyAgICAgICAgICA8bGk+RmFzdC4gTmVnbGlnaWJsZSBpbXBhY3Qgb24gYnVpbGQgdGltZXMuIEJ5IGRlZmF1bHQsCisgICAgICAgICAgc2tpcHMgaW5wdXRzIHdob3NlIG91dHB1dHMgYXJlIHVwIHRvIGRhdGUgdG8gYXZvaWQKKyAgICAgICAgICB0cmlnZ2VyaW5nIHJlY29tcGlsYXRpb25zLjwvbGk+CisKKyAgICAgICAgICA8bGk+UHVyZSBKYXZhIGNvZGUsIHBvcnRhYmxlIHRvIGFueSBwbGF0Zm9ybSwgd2l0aAorICAgICAgICAgIGdyYXBoaWNhbCwgc2hlbGwgYW5kIGFudCBpbnRlcmZhY2VzLjwvbGk+CisKKyAgICAgICAgICA8bGk+U2ltcGxlLCBnZW5lcmFsLCByZWN1cnNpdmUsIGRpZ3JhcGgtZHJpdmVuIHN0cmluZworICAgICAgICAgIHN5bnRheC4gRGlncmFwaCBjaGFyYWN0ZXJzIGFyZSB1c2VyLXNlbGVjdGFibGUuPC9saT4KKyAgICAgICAgPC91bD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41LjE8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly92aXJ0dWFsc2Nob29sLmVkdS9qYXZhKy8iPmh0dHA6Ly92aXJ0dWFsc2Nob29sLmVkdS9qYXZhKy88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmJjb3hAdmlydHVhbHNjaG9vbC5lZHUiPkJyYWQgQ294PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkJTRC1saWtlIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkphdmEySHRtbCI+CisKKyAgICAgICAgPHA+VGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdG9vbHMgYm90aCBuYW1lZCBKYXZhMkhUTUwgdGhhdAorICAgICAgICBwcm9jZXNzIEphdmEgc291cmNlIGNvZGUgYW5kIGdlbmVyYXRlIHN5bnRheCBoaWdobGlnaHRlZAorICAgICAgICBkb2N1bWVudGF0aW9uIGZyb20gaXQuICBCb3RoIGluY2x1ZGUgQW50IHRhc2tzIHRvIHJ1bgorICAgICAgICB0aGVtLjwvcD4KKworICAgICAgICA8cD5KYXZhMkh0bWwgbGlicmFyeSBmb3IgY29udmVydGluZyBqYXZhIHNvdXJjZSBmaWxlcworICAgICAgICBvciBzbmlwcGxldHMgdG8gc3ludGF4IGhpZ2hsaWdodGVkIGh0bWwsIHJ0ZiwgdGV4IGFuZAorICAgICAgICBvdGhlcnMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmphdmEyaHRtbC5kZS8iPmh0dHA6Ly93d3cuamF2YTJodG1sLmRlLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86amF2YTJodG1sQGphdmUuZGUiPmphdmEyaHRtbEBqYXZlLmRlPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorCisgICAgICAgIDxwPkphdmEySFRNTCBpcyBhIHNpbXBsZS10by11c2UgdG9vbCB3aGljaCBjb252ZXJ0cyBhIGJ1bmNoIG9mCisgICAgICAgIEphdmEgU291cmNlIENvZGUgaW50byBhIGNvbG91cml6ZWQgYW5kIGJyb3dzYWJsZSBIVE1MCisgICAgICAgIHJlcHJlc2VudGF0aW9uLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD4xLjUuMSBvbndhcmRzPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmphdmEyaHRtbC5jb20vamF2YTJodG1sX2FudF90YXNrLmh0bWwiPmh0dHA6Ly93d3cuamF2YTJodG1sLmNvbS9qYXZhMmh0bWxfYW50X3Rhc2suaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86c3VwcG9ydEBqYXZhMmh0bWwuY29tIj5zdXBwb3J0QGphdmEyaHRtbC5jb208L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+RnJlZVdhcmU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisKKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSmF2YW1ha2UiPgorCisgICAgICAgIDxwPkEgdGFzayB0byBjb21waWxlIEphdmEgc291cmNlcyBhbmQgbWFuYWdlIGNsYXNzIGZpbGUKKyAgICAgICAgZGVwZW5kZW5jaWVzLiBGdW5jdGlvbmFsaXR5IGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBvZiBzdGFuZGFyZAorICAgICAgICBKYXZhYyBhbmQgRGVwZW5kIHRhc2tzIGNvbWJpbmVkLCB3aXRoIGltcHJvdmVkIGRlcGVuZGVuY3kKKyAgICAgICAgY2hlY2tpbmcuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjQuMTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5leHBlcmltZW50YWxzdHVmZi5jb20vVGVjaG5vbG9naWVzL0phdmFNYWtlL2luZGV4Lmh0bWwiPmh0dHA6Ly93d3cuZXhwZXJpbWVudGFsc3R1ZmYuY29tL1RlY2hub2xvZ2llcy9KYXZhTWFrZS9pbmRleC5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpNaWtoYWlsLkRtaXRyaWV2QGVuZy5zdW4uY29tIj5NaWtoYWlsIERtaXRyaWV2PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkJTRC1saWtlIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9ImphdmFyZWMiPgorCisgICAgICAgIDxwPkFudCB0YXNrcyB0aGF0IGdlbmVyYXRlIHJlY29yZCBjbGFzc2VzIGZvciBWaXN1YWxBZ2UgZm9yCisgICAgICAgIEphdmEgZnJvbSBDb2JvbCBjb3B5IGJvb2tzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vZ2xlemVuLm9yZy9qYXZhcmVjLyI+aHR0cDovL2dsZXplbi5vcmcvamF2YXJlYy88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOnBnbGV6ZW5AdXMuaWJtLmNvbSI+UGF1bCBHbGV6ZW48L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkpDU0MiPgorCisgICAgICAgIDxwPkpDU0MgaXMgYSBKYXZhIENvZGluZyBTdGFuZGFyZCBDaGVja2VyIHdoaWNoIGFsc28gZmVhdHVyZXMKKyAgICAgICAgdGhlIGdlbmVyYXRpb24gb2Ygc29tZSBjb2RlIG1ldHJpY3MuIEl0IGlzIGEgY29tbWFuZCBsaW5lIHRvb2wKKyAgICAgICAgd2l0aCBhbiBBbnQgdGFzayB0byBzY2FuIHdob2xlIHBhY2thZ2UgdHJlZXMuIFRoZSByZXN1bHQgY2FuCisgICAgICAgIHZpZXdlZCBpbiBhbiBKYXZhRG9jIHN0eWxlIHdlYiBwYWdlLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgJmd0Oz0gMS41PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamNzYy5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vamNzYy5zb3VyY2Vmb3JnZS5uZXQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpyam9jaGFtNzJAbmV0c2NhcGUubmV0Ij5SYWxwaCBKb2NoYW08L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkpkaWZmIj4KKworICAgICAgICA8cD5BIHRhc2sgdGhhdCBnZW5lcmF0ZXMgYW4gSFRNTCByZXBvcnQgb2YgYWxsIHRoZSBwYWNrYWdlcywgY2xhc3NlcywKKyAgICAgICAgY29uc3RydWN0b3JzLCBtZXRob2RzLCBhbmQgZmllbGRzIHdoaWNoIGhhdmUgYmVlbiByZW1vdmVkLCBhZGRlZCBvcgorICAgICAgICBjaGFuZ2VkIGluIGFueSB3YXksIGluY2x1ZGluZyB0aGVpciBkb2N1bWVudGF0aW9uLCB3aGVuIHR3byBBUElzIGFyZQorICAgICAgICBjb21wYXJlZC4gPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjY8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmFkaWZmLnNvdXJjZWZvcmdlLm5ldC8iID4KKyAgICAgICAgICAgIGh0dHA6Ly9qYXZhZGlmZi5zb3VyY2Vmb3JnZS5uZXQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VGFzayBEb2N1bWVudGF0aW9uOjwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8YQorICAgICAgICAgICAgaHJlZj0iaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvdmlld2N2cy5weS8qY2hlY2tvdXQqL2phdmFkaWZmL2pkaWZmL2pkaWZmLmh0bWw/cmV2PUhFQUQmYW1wO2NvbnRlbnQtdHlwZT10ZXh0L2h0bWwjSkRpZmZBbnRUYXNrIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgKGluIENWUyk8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+TEdQTDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSkZsZXgiPgorCisgICAgICAgIDxwPkpGbGV4IGlzIGEgbGV4aWNhbCBhbmFseXplciBnZW5lcmF0b3IgKGFsc28ga25vd24gYXMKKyAgICAgICAgc2Nhbm5lciBnZW5lcmF0b3IpIGZvciBKYXZhLCB3cml0dGVuIGluIEphdmEuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qZmxleC5kZS8iPmh0dHA6Ly9qZmxleC5kZS88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS9tYWlsaW5nLmh0bWwiPmpmbGV4LXVzZXJzIG1haWxpbmcgbGlzdDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSmluZGVudFRhc2siPgorCisgICAgICAgIDxwPkppbmRlbnRUYXNrIGlzIGEgdmVyeSBzdHJhaWdodGZvcndhcmQgd3JhcHBpbmcgb2YgdGhlCisgICAgICAgIEppbmRlbnQgdG9vbCwgYSB2ZW5kb3IgY29kZSBiZWF1dGlmaWVyLiBJdCBlbmFibGVzIHRvIHVzZQorICAgICAgICBKaW5kZW50IG5hdGl2ZWx5IGZyb20gQW50LjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40LjEgYW5kIGhpZ2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3RoZS5lZG91YXJkLm1lcmNpZXIuZnJlZS5mci9KaW5kZW50X2NvbnRlbnQucGhwIj5odHRwOi8vdGhlLmVkb3VhcmQubWVyY2llci5mcmVlLmZyL0ppbmRlbnRfY29udGVudC5waHA8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+RWRvdWFyZCBNZXJjaWVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJKaW5nIFRhc2siPgorCisgICAgICAgIDxwPiBWYWxpZGF0ZXMgWE1MIGZpbGVzIGFnYWluc3QgdGhlIFJFTEFYIE5HIGFsdGVybmF0aXZlIHRvIFhNTCBTY2hlbWEuCisgICAgICAgIFRoZSBKaW5nIHRhc2sgZm9yIEFudCBhbGxvd3MgeW91IHRvIGVmZmljaWVudGx5IHZhbGlkYXRlCisgICAgICAgIG11bHRpcGxlIGZpbGVzIGFnYWluc3QgbXVsdGlwbGUgUkVMQVggTkcgcGF0dGVybnMgYW5kIGludGVncmF0ZQorICAgICAgICBSRUxBWCBORyB2YWxpZGF0aW9uIHdpdGggb3RoZXIgWE1MIHByb2Nlc3NpbmcuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjQgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnRoYWlvcGVuc291cmNlLmNvbS9yZWxheG5nL2ppbmctYW50Lmh0bWwiPgorICAgICAgICAgICAgaHR0cDovL3d3dy50aGFpb3BlbnNvdXJjZS5jb20vcmVsYXhuZy9qaW5nLWFudC5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkJTRC1saWtlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJqTWV0cmEiPgorCisgICAgICAgIDxwPmpNZXRyYSBpcyBhIHRvb2wgZm9yIGNvbGxlY3RpbmcgY29kZSBtZXRyaWNzIGFjcm9zcyBhCisgICAgICAgIHByb2plY3QgbGlmZWN5Y2xlIGFuZCBjb21waWxpbmcgdGhlIHJlc3VsdHMgaW50bworICAgICAgICBKYXZhRG9jLXN0eWxlZCBkb2N1bWVudGF0aW9uIHRvIGFuYWx5emUgcHJvamVjdCBtZXRyaWNzIG92ZXIKKyAgICAgICAgdGltZS4gIGpNZXRyYSBpcyBiZXN0IHV0aWxpemVkIGJ5IGludGVncmF0aW5nIGl0IHdpdGggeW91cgorICAgICAgICBwcm9qZWN0J3Mgc2NoZWR1bGVkIGJ1aWxkIHByb2Nlc3MuPC9wPgorCisgICAgICAgIDxwPkl0IHdvcmtzIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciB1c2luZyBzZXZlcmFsIHByb3ZpZGVkCisgICAgICAgIEFudCB0YXNrcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNCBhbmQgaGlnaGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qbWV0cmEuY29tLyI+aHR0cDovL3d3dy5qbWV0cmEuY29tLzwvYQorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJtYWlsdG86dG5ld3RvbkBoeXBlcmNpc2lvbmluYy5jb20iPlIgVG9kZCBOZXd0b24KKyAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+Q29tbWVyY2lhbCwgZnJlZSBsaWNlbnNlcyBmb3Igb3BlbiBzb3VyY2UgcHJvamVjdHMgYW5kCisgICAgICAgICAgICBldmFsdWF0aW9ucy48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkpNWDRBbnQiPgorCisgICAgICAgIDxwPkpNWDRBbnQgcHJvdmlkZXMgdGFza3MgZm9yIGludGVncmF0aW9uIHdpdGggSk1YIChKYXZhIE1hbmFnZW1lbnQKKyAgICAgICAgRXh0ZW5zaW9ucykuIEl0IHByb3ZpZGVzIHRhc2tzIGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIGF0dHJpYnV0ZXMKKyAgICAgICAgb2YgTUJlYW5zLCBpbnZva2luZyB0aGVpciBtZXRob2RzIGFuZCBtdWNoIG1vcmUuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjQgYW5kIGhpZ2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qbXg0YW50LnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9qbXg0YW50LnNvdXJjZWZvcmdlLm5ldC88L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmJkdWVja0B5YWhvby5jb20iPkJyaWFuIER1ZWNrPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJKTkkiPgorCisgICAgICAgIDxwPgorCisgICAgICAgICAgSk5JIGlzIGEgZnJlZSB0b29sa2l0IHRoYXQgbWFrZXMgZWFzeSB3b3JrIG9mCisgICAgICAgICAgaW50ZWdyYXRpbmcgSmF2YSBhbmQgQyB0aHJvdWdoIHRoZSBKYXZhIE5hdGl2ZQorICAgICAgICAgIEludGVyZmFjZSAoSk5JKS4gSXQgaW5jbHVkZXMgYSBjb2RlIGdlbmVyYXRvciB0aGF0CisgICAgICAgICAgZ2VuZXJhdGVzIGJvdGggSmF2YSAicHJveHkiIGNsYXNzZXMgdG8gYWNjZXNzIEMKKyAgICAgICAgICAicGVlciIgY2xhc3NlcywgYW5kIEMgInByb3h5IiBjbGFzc2VzIHRvIGFjY2VzcworICAgICAgICAgIEphdmEgInBlZXIiIGNsYXNzZXMgb3IgaW50ZXJmYWNlcy4gSXQgYWxzbworICAgICAgICAgIGluY2x1ZGVzIGEgY29yZSBsaWJyYXJ5IHdpdGggYSBzaW1wbGlmaWVkIEpWTQorICAgICAgICAgIGludGVyZmFjZSBhcyB3ZWxsIGFzICJoZWxwZXIiIGNsYXNzZXMgdG8gZWFzZQorICAgICAgICAgIHdvcmtpbmcgd2l0aCB0aGUgSk5JIGRhdGEgdHlwZXMuIFRoZSBjb2RlCisgICAgICAgICAgZ2VuZXJhdGlvbiBpcyBkcml2ZW4gYnkgYW4gWE1MIHByb2plY3QgZmlsZSB0aGF0CisgICAgICAgICAgY2FuIGJlIGNyZWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW5jZSBvZiB0aGUgR1VJCisgICAgICAgICAgUHJvamVjdCBNYW5hZ2VyLiBUaGUgY29kZSBnZW5lcmF0aW9uIGNhbiBiZQorICAgICAgICAgIGludm9rZWQgZWl0aGVyIGZyb20gQW50IG9yIGZyb20gdGhlCisgICAgICAgICAgR1VJLiBJbmNsdWRlcyBhIGNvbXByZWhlbnNpdmUgcHJpbnRhYmxlIFBERiBVc2VyCisgICAgICAgICAgR3VpZGUgYW5kIHBsZW50eSBvZiBleGFtcGxlcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2puaXBwLnNmLm5ldC8iPmh0dHA6Ly9qbmlwcC5zZi5uZXQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpwdHJld2hlbGxhQHVzZXJzLnNmLm5ldCI+UGhpbGxpcCBFLiBUcmV3aGVsbGE8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIExHUEw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkpQUCI+CisgICAgICAgIDxwPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuamF2YXByZXByb2Nlc3Nvci5jb20iPkpQUDwvYT4gaXMgYSBwcmVwcm9jZXNzb3IgZm9yIEFudCBzdXBwb3J0aW5nCisgICAgICAgICAgbWFueSBkaWZmZXJlbnQgZmlsZSB0eXBlcyB0aGF0IGFsbG93cyB5b3UgdG8gaW5jbHVkZSAvIGV4Y2x1ZGUgY29udGVudHMgYmFzZWQgb24gCisgICAgICAgICAgYnVpbGQtdGltZSBwYXJhbWV0ZXJzLiAgSXQgaXMgY29tcGxldGVseSBpbnZpc2libGUgdG8gb3RoZXIgdG9vbHMgYW5kIHRha2VzIHRoZSBoYXNzbGUgCisgICAgICAgICAgb3V0IG9mIG1haW50YWluaW5nIGN1c3RvbWlzZWQgY29kZSBvciBjb250ZW50LiAgSXQgaXMgZnJlZSwgaXMgcHJvdmlkZWQgYXMgYW4gQW50IHRhc2ssIAorICAgICAgICAgIGFuZCB2ZXJ5IHNpbXBsZSB0byB1c2UuCisgICAgICAgIDwvcD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNi41PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmphdmFwcmVwcm9jZXNzb3IuY29tIj5odHRwOi8vd3d3LmphdmFwcmVwcm9jZXNzb3IuY29tPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzovL2luZm9AamF2YXByZXByb2Nlc3Nvci5jb20iPmluZm9AamF2YXByZXByb2Nlc3Nvci5jb208L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+RnJlZXdhcmU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkpSZWxlYXNlSW5mbyI+CisgICAgICAgIDxwPlNvbWV0aW1lcyB5b3UgYXJlIGludGVyZXN0ZWQgYXQgcnVudGltZSB0byBoYXZlIGluZm9ybWF0aW9uCisgICAgICAgIGZyb20gYnVpbGQgdGltZS4gVGhpcyBtYXkgYmUgdGhlIGJ1aWxkIGRhdGUsIGEgYnVpbGQgbnVtYmVyIG9yCisgICAgICAgIHRoZSB2ZXJzaW9uLiAgVGhlIEpSZWxlYXNlSW5mbyBBbnQgVGFzayBnZW5lcmF0ZXMgYSBqYXZhCisgICAgICAgIHNvdXJjZSBmaWxlIHdpdGggZ2V0dGVyIG1ldGhvZHMgZm9yIGFueSBkZXNpcmVkIGFuZCBwcm92aWRlZAorICAgICAgICBwcm9wZXJ0aWVzLiAgRnVydGhlcm1vcmUsIGl0IGNhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEKKyAgICAgICAgdmlld2VyICh3aGljaCBjYW4gZS5nLiAgYmUgdXNlZCBhcyBtYWluLWNsYXNzIGluIGEgbGlicmFyeSBqYXIKKyAgICAgICAgZmlsZSkgdGhhdCBzaG93cyB0aGUgaW5jbHVkZWQgcmVsZWFzZSBpbmZvcm1hdGlvbi48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNiBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qcmVsZWFzZWluZm8uc291cmNlZm9yZ2UubmV0LyI+SG9tZVBhZ2Ugb24gU291cmNlRm9yZ2U8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEKKyAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2pyZWxlYXNlaW5mby8iPkZvcnVtcy9UcmFja2VyIG9uIFNvdXJjZUZvcmdlPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJKUnVuIEFudCBUYXNrcyI+CisKKyAgICAgICAgPHA+SlJ1biA0IFNQMSBzaGlwcyB3aXRoIGxpYi9qcnVuLWFudC10YXNrcy5qYXIsIHdoaWNoIGRlZmluZXMKKyAgICAgICAgdGhyZWUgQW50IHRhc2tzOiBqcnVuLCBqcnVuYXBwLCBhbmQganJ1bmpteC4gIERvY3VtZW50YXRpb24KKyAgICAgICAgZm9yIHRoZSB0YXNrcyBjYW4gYmUgZm91bmQgaW4gSlJ1biB1bmRlcgorICAgICAgICBkb2NzL2FudC9qcnVuLmh0bWwuPC9wPgorCisgICAgICAgIDxwPk5vdGUgdGhhdCB0aGUgc2VydmljZSBwYWNrIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRvcCBvZiBhbgorICAgICAgICBleGlzdGluZyBKUnVuIDQgaW5zdGFsbGF0aW9uLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40IG9yIGhpZ2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2R5bmFtaWMubWFjcm9tZWRpYS5jb20vYmluL01NL3NvZnR3YXJlL3RyaWFsL2h3c3dyZWMuanNwP3Byb2R1Y3Q9anJ1bl9zcCI+aHR0cDovL2R5bmFtaWMubWFjcm9tZWRpYS5jb20vYmluL01NL3NvZnR3YXJlL3RyaWFsL2h3c3dyZWMuanNwP3Byb2R1Y3Q9anJ1bl9zcDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86YmRlaXR0ZUBtYWNyb21lZGlhLmNvbSI+QnJpYW4gRGVpdHRlPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkNvbW1lcmNpYWw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkpTTWluIEFudCBUYXNrIj4KKworICAgICAgICA8cD5UaGUgSlNNaW4gQW50IHRhc2sgY2FuIGJlIHVzZWQgZm9yIHRoZSBhdXRvbWF0ZWQgbWluaWZpY2F0aW9uIG9mIGphdmFzY3JpcHQgZmlsZXMKKyAgICAgICAgICBpbiB5b3VyIGJ1aWxkIGFuZCBkZXBsb3kgcHJvY2Vzc2VzLjwvcD4KKyAgICAgICAgPHA+SlNNaW4gaXMgYSBmaWx0ZXIgd2hpY2ggcmVtb3ZlcyBjb21tZW50cyBhbmQgdW5uZWNlc3Nhcnkgd2hpdGVzcGFjZSBmcm9tIGphdmFzY3JpcHQKKyAgICAgICAgICBmaWxlcy4gSXQgdHlwaWNhbGx5IHJlZHVjZXMgZmlsZXNpemUgYnkgaGFsZiwgcmVzdWx0aW5nIGluIGZhc3RlciBkb3dubG9hZHMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjYuNSBvciBoaWdoZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc21pbi1hbnQtdGFzay8iPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc21pbi1hbnQtdGFzay88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOm1hdHRfYXRfbWF0dGhheW5lc19kb3RfbmV0Ij5NLiBIYXluZXM8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIExpY2Vuc2UgMi4wPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJKdWRvU2NyaXB0IEFudCBUYXNrIj4KKworICAgICAgICA8cD5UaGUgJmx0O2p1ZG9zY3JpcHQmZ3Q7IHRhc2sgaXMgYW4gZWFzeSB3YXkgdG8gZW1iZWQgSnVkb1NjcmlwdAorICAgICAgICAgICBjb2RlIGluIHRoZSBBbnQgYnVpbGQgc2NyaXB0LiBUaGUgdGFnIGZvcm1hdCBpcyBxdWl0ZSBzaW1wbGUuIFlvdSBjYW4KKyAgICAgICAgICAgZWl0aGVyIGVtYmVkIGNvZGUgZGlyZWN0bHksIG9yIGNhbiBzcGVjaWZ5IGFuIGV4dGVybmFsIEp1ZG9TY3JpcHQgcHJvZ3JhbQorICAgICAgICAgICBmaWxlIGFzIHRoZSA8Y29kZT5zcmM8L2NvZGU+IGF0dHJpYnV0ZSB2YWx1ZS4gUGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkCisgICAgICAgICAgIGFzIHRoZSA8Y29kZT5wYXJhbXM8L2NvZGU+IGF0dHJpYnV0ZTsgdGhpcyBpcyBhcHBsaWNhYmxlIHRvIGJvdGggZW1iZWRkZWQKKyAgICAgICAgICAgY29kZSBhbmQgZXh0ZXJuYWwgZmlsZXMuCisgICAgICAgIDwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41IG9yIGhpZ2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEKKyAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5qdWRvc2NyaXB0LmNvbS9hcnRpY2xlcy9hbnQuaHRtbCI+aHR0cDovL3d3dy5qdWRvc2NyaXB0LmNvbS9hcnRpY2xlcy9hbnQuaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86anVkb3NjcmlwdEBob3RtYWlsLmNvbSI+SmFtZXMgSmlhbmJvIEh1YW5nPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkxlc3NlciBHTlUgUHVibGljIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ikp1c3Q0bG9nIEFudCBUYXNrIj4KKworICAgICAgICA8cD5KdXN0NGxvZyBpcyBhIGFudCB0YXNrIHRvIG9wdGltaXplIEpWTSBieXRlY29kZSB3aXRoIHJlZ2FyZHMKKyAgICAgICAgZm9yIExvZ3MgKCBiZSBpdCwgTG9nNGosIEFwYWNoZSBDb21tb25zIG9yIEpESyAxLjQgKQorICAgICAgICBJdCBkZXBlbmRzIG9uIGFwYWNoZSBCQ0VMIGZvciBCeXRlY29kZSBlbmdpbmVlcmluZy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNS4yIG9yIGhpZ2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2p1c3Q0bG9nLnNvdXJjZWZvcmdlLm5ldCI+aHR0cDovL2p1c3Q0bG9nLnNvdXJjZWZvcmdlLm5ldDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86bGJydWFuZEB3YW5hZG9vLmZyIj5MdWNhcyBCcnVhbmQ8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIExpY2Vuc2UgMS4xLjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iS2FuYXB1dHMiPgorCisgICAgICAgIDxwPkthbmFwdXRzIGlzIGEgcGFyc2VyIGZvciBqYXZhIGJhc2VkIHNjcmlwdGluZy4gSXQgaXMgYW4KKyAgICAgICAgaW50ZXJwcmV0ZXIgZm9yIEphdmEuIFdpdGggS2FuYXB1dHMgeW91IGNhbiB1c2UgSmF2YSBhcyBhbgorICAgICAgICBpbnRlcnByZXRlZCBsYW5ndWFnZTogbm8gbW9yZSBjb21waWxhdGlvbiwgZWFjaCBpbnN0cnVjdGlvbiBpcworICAgICAgICBleGVjdXRlZCB3aGVuIHlvdSB3cml0ZSBpdC4gIEl0IGlzIGEgc21hbGwgcHJvZ3JhbW1hdGlvbgorICAgICAgICBsYW5ndWFnZSB0byBtYWtlIHNjcmlwdCBmaWxlcyBhYm92ZSBKYXZhLjwvcD4KKworICAgICAgICA8cD5LYW5hcHV0cyBBbnQgVGFzayBwcm92aWRlcyBhIHdheSB0byBhZGQgYW55IGtpbmQgb2YKKyAgICAgICAgcHJvZ3JhbW1hdGljIGZlYXR1cmVzIGluIHlvdXIgQW50IHNjcmlwdC4gVGhlIGNvZGUgeW91IGluc2VydAorICAgICAgICBzdGF5cyBPUyBpbmRlcGVuZGVudCAoYmVjYXVzZSBLYW5hcHV0cyB1c2VzIEphdmEpIGFuZCBpcworICAgICAgICBjb21wbGV0ZWx5IGludGVncmF0ZWQgd2l0aCBBbnQgYXMgeW91IGNhbiBnaXZlIEFudCBwcm9wZXJ0aWVzCisgICAgICAgIHRvIHRoZSBLYW5hcHV0cyBjb2RlIGFuZCBnZXQgYmFjayB0aGUgcmVzdWx0cyBpbiBvdGhlcgorICAgICAgICBwcm9wZXJ0aWVzLjwvcD4KKworICAgICAgICA8cD5Nb3Jlb3ZlciwgYXMgeW91IGNhbiBpbnZva2UgYW55IGtpbmQgb2YgSmF2YSBjb2RlIHdpdGgKKyAgICAgICAgS2FuYXB1dHMsIHlvdSBjYW4gcG9wdXAgd2luZG93cyBmcm9tIHlvdXIgQW50IGZpbGUgdG8gYXNrIHRoZQorICAgICAgICB1c2VyIHRvIGRvIGEgY2hvaWNlLjwvcD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuMiBhbmQgYWJvdmU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmthbmFwdXRzLm9yZy8iPmh0dHA6Ly93d3cua2FuYXB1dHMub3JnLzwvYT4gPGJyLz4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5rYW5hcHV0cy5vcmcvYW50Lmh0bWwiPmh0dHA6Ly93d3cua2FuYXB1dHMub3JnL2FudC5odG1sPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzprZnJhQGthbmFwdXRzLm9yZyI+a2ZyYUBrYW5hcHV0cy5vcmc8L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5GcmVld2FyZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iTGFUZVggVGFzayI+CisKKyAgICAgICAgPHA+U2ltcGxlIFRhc2sgdG8gdXNlIChQREYpTGFUZVgsIEJpYlRlWCwgTWFrZWluZGV4IGFuZCBHbG9zc1RlWCB0bworICAgICAgICBjcmVhdGUgeW91ciBkb2N1bWVudGF0aW9uLjwvcD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNi4yIGFuZCBhYm92ZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZG9rdXRyYW5zZGF0YS5kZS8iPmh0dHA6Ly93d3cuZG9rdXRyYW5zZGF0YS5kZS88L2E+PGJyLz4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5kb2t1dHJhbnNkYXRhLmRlL2FudF9sYXRleC8iPmh0dHA6Ly93d3cuZG9rdXRyYW5zZGF0YS5kZS9hbnRfbGF0ZXgvPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpqYWxvbWFAZG9rdXRyYW5zZGF0YS5kZSI+amFsb21hQGRva3V0cmFuc2RhdGEuZGU8L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5GcmVld2FyZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICA8c3Vic2VjdGlvbiBuYW1lPSJNYWNrZXIiPgorCisgICAgICAgIDxwPkEgYnVpbGQtdGltZSBhcmNoaXRlY3R1cmFsIHRlc3RpbmcgdG9vbCwgZGVzaWduZWQKKyAgICAgICAgdG8gbWFpbnRhaW4gY2xlYW4gbGF5ZXJpbmcgLyB0aWVyaW5nIC8gbW9kdWxhcml0eS4KKyAgICAgICAgTWFja2VyIHdvcmtzIGFnYWluc3QgY29tcGlsZWQgY2xhc3MgZmlsZXMsIGNoZWNraW5nCisgICAgICAgIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGNsYXNzZXMgYWdhaW5zdCBhIHNldCBvZgorICAgICAgICBwYXR0ZXJuLWJhc2VkIGFjY2VzcyBydWxlcyB5b3Ugc3BlY2lmeSBmb3IgeW91cgorICAgICAgICBwcm9qZWN0IGluIGFuIFhNTCBydWxlcyBmaWxlLiAgTWFja2VyIGRvZXNuJ3QgcHJlc3VtZQorICAgICAgICBhbnl0aGluZyBhYm91dCB5b3VyIGFyY2hpdGVjdHVyZSAtLSB5b3Ugd3JpdGUgdGhlCisgICAgICAgIHJ1bGVzLCBhbmQgTWFja2VyIGtlZXBzIHlvdSBob25lc3QgYWJvdXQgdGhlbS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNSBhbmQgaGlnaGVyICgxLjQgdW50ZXN0ZWQgYnV0IG1heSB3b3JrKTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2lubmlnLm5ldC9tYWNrZXIvIj5odHRwOi8vaW5uaWcubmV0L21hY2tlci88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2lubmlnLm5ldC9tYWNrZXIvY29udGFjdC5odG1sIj5QYXVsIENhbnRyZWxsPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBHUEwgMi4wPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgCisgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik1ha2VSdW5TY3JpcHQiPgorCisgICAgICAgIDxwPk1ha2VSdW5TY3JpcHQgY3JlYXRlcyBhIHJ1biBzY3JpcHQgZm9yIHlvdXIgYXBwbGljYXRpb24uICBFdmVuIGlmIHlvdSBhcmUgZGV2ZWxvcGluZyBvbiB3aW5kb3dzLAorICAgICAgICB5b3UgY2FuIG1ha2UgYSBydW4gc2NyaXB0IGZvciAqbml4IGFuZCB2aWNlIHZlcnNhLiAgSWYgeW91J3ZlIHVzZWQgdGhlIGJ1aWx0LWluIGphdmEgdGFzayBiZWZvcmUsIHlvdQorICAgICAgICBhbHJlYWR5IGtub3cgaG93IHRvIHVzZSA5MCUgb2YgTWFrZVJ1blNjcmlwdC48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNyBhbmQgaGlnaGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL21ha2VydW5zY3JpcHQvIj5odHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL21ha2VydW5zY3JpcHQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvZm9ydW0vP2dyb3VwX2lkPTIxMDIwNCI+TWFrZVJ1blNjcmlwdCBmb3J1bXM8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIDIuMDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4gICAgICAKKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0ibXR4c2x0Ij4KKworICAgICAgICA8cD5UaGUgbXR4c2x0IChNdWx0aS1YU0xUKSBleHRlbmRzIHRoZSBzdGFuZGFyZCBBbnQgInhzbHQvc3R5bGUiIHRhc2sKKyAgICAgICAgdG8gbWFrZSBpdCBlYXN5IHRvIHVzZSBtdWx0aXBsZSBYU0xUIGVuZ2luZXMgZHVyaW5nIHRoZSBzYW1lIGJ1aWxkLgorICAgICAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVncmVzc2lvbiB0ZXN0aW5nIG9mIFhTTFQgc2NyaXB0cyBhZ2FpbnN0IHNldmVyYWwKKyAgICAgICAgZW5naW5lcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL210eHNsdC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vbXR4c2x0LnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmFiY29hdGVzQHRoZU9mZmljZS5uZXQiPkFudGhvbnkgQi4gQ29hdGVzPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Im5zZDJMYVRlWCBUYXNrIj4KKworICAgICAgICA8cD5TaW1wbGUgVGFzayB0byB1c2UgbnNkMmx0eCB0byBidWlsZCB5b3VyIE5hc3NpLVNobmVpZGVybWFuIGRpYWdyYW1zLjwvcD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNi4yIGFuZCBhYm92ZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZG9rdXRyYW5zZGF0YS5kZS8iPmh0dHA6Ly93d3cuZG9rdXRyYW5zZGF0YS5kZS88L2E+PGJyLz4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5kb2t1dHJhbnNkYXRhLmRlL2FudF9uc2QybHR4LyI+aHR0cDovL3d3dy5kb2t1dHJhbnNkYXRhLmRlL2FudF9uc2QybHR4LzwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJtYWlsdG86amFsb21hQGRva3V0cmFuc2RhdGEuZGUiPmphbG9tYUBkb2t1dHJhbnNkYXRhLmRlPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+RnJlZXdhcmU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik51cmZsdWdlbCBBbnRTY3JpcHQgVmlzdWFsaXplciI+CisKKyAgICAgICAgPHA+VGhlIE51cmZsdWdlbCBBbnRTY3JpcHQgVmlzdWFsaXplciB0YWtlcyB5b3VyIGJ1aWxkIGZpbGUsCisgICAgICAgIGZpbmRzIGFueSBpbXBvcnRlZCBidWlsZCBmaWxlcywgYW5kIHNob3dzIGFsbCByZWxhdGlvbnNoaXBzCisgICAgICAgIGJldHdlZW4gdGFyZ2V0cywgdGFza2RlZnMsIG1hY3JvZGVmcywgQW50IGFuZCBBbnRjYWxsczsgb3V0cHV0CisgICAgICAgIG9wdGlvbnMgaW5jbHVkZSBQREYsIFNWRywgYW5kIFBORy4gIE1hbnkgb3B0aW9ucyBpbmNsdWRpbmcKKyAgICAgICAgZ3JvdXBpbmcgYnkgYnVpbGQgZmlsZSwgaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiB0YXJnZXRzLAorICAgICAgICB0YXNrZGVmcywgaW1wb3J0cywgZXRjLiAgSW5zdGFsbGF0aW9uIGlzIHZpYSBKYXZhIFdlYlN0YXJ0LCBzbworICAgICAgICB5b3UnbGwgYWx3YXlzIGhhdmUgdGhlIGZyZXNoZXN0IHZlcnNpb24gYXZhaWxhYmxlLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS4xIGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5udXJmbHVnZWwuY29tL3dlYnN0YXJ0L0FudFNjcmlwdFZpc3VhbGl6ZXIvIj5odHRwOi8vd3d3Lm51cmZsdWdlbC5jb20vd2Vic3RhcnQvQW50U2NyaXB0VmlzdWFsaXplci88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+ZGJ1bGxhcmQgJmx0O2F0Jmd0OyBudXJmbHVnZWwgJmx0O2RvdCZndDsgY29tIChlbWFpbAorICAgICAgICAgICAgd2lsbCByZWNlaXZlIGEgY2hhbGxlbmdlIHRvIHdlZWQgb3V0IHNwYW0pPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik9yYW5nZXZvbHQgQW50IFRhc2tzIj4KKworICAgICAgICA8cD5PcmFuZ2V2b2x0IEFOVCBUYXNrcyBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgZm9yIEFwYWNoZQorICAgICAgICBBbnQuPC9wPgorCisgICAgICAgIDxwPlRoZSBPcmFuZ2V2b2x0IEFudCBUYXNrcyBjb2xsZWN0aW9ucyBwcm92aWRlcyBhIGJ1bmNoIG9mCisgICAgICAgIEFwcHBsaWNhdGlvbiBEZXBsb3ltZW50IHJlbGF0ZWQgVGFza3MgZnJvbSB3aW5kb3dzIHNwZWNpZmljCisgICAgICAgIHRhc2tzIChyZWdpc3RyeSBhY2Nlc3MsIGV4ZWN1dGFibGUgZ2VuZXJhdGlvbiksICpuaXggc3BlY2lmaWMKKyAgICAgICAgdGFza3MgKGtkZS9nbm9tZSBzaG9ydGN1dCBnZW5lcmF0aW9uKSB0byBtYW55IHVzZWZ1bCB1dGlsaXR5CisgICAgICAgIHRhc2tzIGxpa2Ugam5scCBnZW5lcmF0aW9uLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41IG9yIGFib3ZlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL292YW50dGFza3MiPmh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvb3ZhbnR0YXNrczwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86aW5mb0Byb3hlcy5jb20iPmluZm9Acm94ZXMuY29tPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJwYWNrIj4KKworICAgICAgICA8cD5wYWNrIGlzIGEgdGFzayB0byBidWlsZCB0aGUgc21hbGxlc3QgcG9zc2libGUgSkFSIHRvIGxpbmsKKyAgICAgICAgYW5kIHJ1biBvbmUgb3IgbW9yZSBjbGFzc2VzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc2FkdW4tdXRpbC5zb3VyY2Vmb3JnZS5uZXQvcGFjay5odG1sIj5odHRwOi8vc2FkdW4tdXRpbC5zb3VyY2Vmb3JnZS5uZXQvcGFjay5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpjcmlzdGlhbm9AeHRyYWN0b3IuY29tIj5DcmlzdGlhbm8gU2FkdW48L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJQQ1QiPgorICAgICAgICA8cD5QQ1QgaXMgYSB0YXNrIHRvIGNvbXBpbGUgUHJvZ3Jlc3MgY29kZSwgYW5kIGluIGEgbW9yZSBnZW5lcmFsCisgICAgICAgIHdheSwgdG8gZGVhbCB3aXRoIFByb2dyZXNzIHByb2NlZHVyZXMgYW5kIGRhdGFiYXNlcy48L3A+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9wY3Quc291cmNlZm9yZ2UubmV0Ij5odHRwOi8vcGN0LnNvdXJjZWZvcmdlLm5ldDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86anVzdHVzX3BoZW5peEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiPkdpbGxlcyBRVUVSUkVUPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5jZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlBlc3RlckNhdCBBbnQgVG9vbGtpdCI+CisgICAgICAgICA8cD5QZXN0ZXJDYXQgaXMgYSB3ZWIgdGVzdGluZyB0b29sIHRoYXQgd2FzIGRlc2lnbmVkIHRvCisgICAgICAgICAgIHBlcmZvcm0gZnVuY3Rpb25hbCB0ZXN0aW5nIGZvciB3ZWIgYXBwbGljYXRpb25zLiBUaGUgUGVzdGVyQ2F0CisgICAgICAgICAgIEFudCBUb29sa2l0IGNvbnRhaW5zIHRhc2tzIHRvIHBsYXliYWNrIHRlc3Qgc2NyaXB0cyBhbmQgY3JlYXRlCisgICAgICAgICAgIEhUTUwgcmVwb3J0cy4KKyAgICAgICAgIDwvcD4KKyAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICAgPHRkPkFudCAxLjYgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5wZXN0ZXJjYXQuY29tLyI+aHR0cDovL3d3dy5wZXN0ZXJjYXQuY29tLzwvYT48L3RkPgorICAgICAgICAgICA8L3RyPgorICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgICA8dGQ+Q29tbWVyY2lhbDwvdGQ+CisgICAgICAgICAgIDwvdHI+CisgICAgICAgICA8L3RhYmxlPgorICAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUE1EIj4KKworICAgICAgICA8cD5QTUQgY2hlY2tzIEphdmEgc291cmNlIGNvZGUgZm9yIHVudXNlZCB2YXJpYWJsZXMsCisgICAgICAgIHVubmVjZXNzYXJ5IG9iamVjdCBjcmVhdGlvbiwgZXRjPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjQgYW5kIGhpZ2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3BtZC5zZi5uZXQvIj5odHRwOi8vcG1kLnNmLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOnRjb3BlbGFuZEBhcGFjaGUub3JnIj5Ub20gQ29wZWxhbmQ8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUFJlcyI+CisgICAgICAgIDxwPlBSZXMgaXMgc2hvcnQgZm9yIFByb3BlcnR5IFJlc291cmNlcyBhbmQgd2lsbCBnZW5lcmF0ZSBhIEphdmEgc291cmNlCisgICAgICAgICAgIGZpbGUgZnJvbSBuYW1lPXZhbHVlIHBhaXIgLnByb3BlcnR5IGZpbGVzIHdoaWNoIGNhbiBiZSBjb21waWxlZCBsaWtlIGFueQorICAgICAgICAgICBvdGhlciBjbGFzcy48L3A+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUgYW5kIGxhdGVyIChtYXkgd29yayB3aXRoIGVhcmxpZXIpPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vbXNlcmllcy5zb3VyY2Vmb3JnZS5uZXQiPmh0dHA6Ly9tc2VyaWVzLnNvdXJjZWZvcmdlLm5ldDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd2ViLnVrb25saW5lLmNvLnVrL21zZXJpZXMvY29udGFjdC5odG1sIj5NU2VyaWVzPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkxHUEw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlByb0d1YXJkIj4KKyAgICAgICAgPHA+PGEgaHJlZj0iaHR0cDovL3Byb2d1YXJkLnNvdXJjZWZvcmdlLm5ldC8iPlByb0d1YXJkPC9hPiBpcworICAgICAgICBhIGZyZWUgSmF2YSBjbGFzcyBmaWxlIHNocmlua2VyIGFuZCBvYmZ1c2NhdG9yLiAgSXQgY2FuIGRldGVjdAorICAgICAgICBhbmQgcmVtb3ZlIHVudXNlZCBjbGFzc2VzLCBmaWVsZHMsIG1ldGhvZHMsIGFuZCBhdHRyaWJ1dGVzLiBJdAorICAgICAgICBjYW4gdGhlbiByZW5hbWUgdGhlIHJlbWFpbmluZyBjbGFzc2VzLCBmaWVsZHMsIGFuZCBtZXRob2RzCisgICAgICAgIHVzaW5nIHNob3J0IG1lYW5pbmdsZXNzIG5hbWVzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5UZXN0ZWQgd2l0aCAxLjUuIFNob3VsZCB3b3JrIHdpdGggYWxsIHZlcnNpb25zLjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9wcm9ndWFyZC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vcHJvZ3VhcmQuc291cmNlZm9yZ2UubmV0LzwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vcHJvZ3VhcmQuc291cmNlZm9yZ2UubmV0L2ZlZWRiYWNrLmh0bWwiPkZlZWRiYWNrIFBhZ2U8L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0icHJvcGVydGllczJqYXZhIj4KKworICAgICAgICA8cD5Qcm9wZXJ0aWVzMkphdmEgaXMgYW4gQW50IHRhc2sgZm9yIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mCisgICAgICAgIGphdmEgIi5wcm9wZXJ0aWVzIiBmaWxlcyB0byAiLmphdmEiIGZpbGVzIGV4dGVuZGluZyB0aGUKKyAgICAgICAgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNiBvciBhYm92ZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3Byb3BlcnRpZXMyamF2YS5qYXllZmVtLmRlLyI+aHR0cDovL3Byb3BlcnRpZXMyamF2YS5qYXllZmVtLmRlLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86cHJvcGVydGllczJqYXZhQGpheWVmZW0uZGUiPkphbi1GcmllZHJpY2ggTXV0dGVyPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUHVyZ2UiPgorCisgICAgICAgIDxwPlB1cmdlIGRlbGV0ZXMgYWxsIGJ1dCB0aGUgbW9zdCByZWNlbnQgZmV3IGZpbGVzIGZyb20gYSBmaWxlc2V0LgorICAgICAgICBGb3IgZXhhbXBsZTogaWYgeW91IGhhdmUgZ2VuZXJhdGVkIGZpbGVzIChsb2dzLCAuZWFyLCAud2FyLCAuamFyCisgICAgICAgIGV0YykgYWNjdW11bGF0aW5nIGluIGEgZGlyZWN0b3J5LCB0aGUgcHVyZ2UgdGFzayB3aWxsIGFsbG93IHlvdQorICAgICAgICB0byBkZWxldGUgdGhlIG9sZGVyIGZpbGVzLCBrZWVwaW5nIGp1c3QgdGhlIG1vc3QgcmVjZW50IG9uZXMuPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40IG9yIGFib3ZlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmRhbGxhd2F5LmNvbS9hbnQvIj5odHRwOi8vd3d3LmRhbGxhd2F5LmNvbS9hbnQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpwdXJnZUBkYWxsYXdheS5jb20iPlJpY2hhcmQgRGFsbGF3YXk8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+TEdQTDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUmVmYWN0b3JJVCI+CisKKyAgICAgICAgPHA+UmVmYWN0b3JJVCBpbmNsdWRlcyBhbiBBbnQgdGFzayBmb3IgbWV0cmljcyBhbmQgYXVkaXRzLgorICAgICAgICBSZWZhY3RvcklUIGlzIGEgSmF2YSByZWZhY3RvcmluZywgYXVkaXQgYW5kIG1ldHJpY3MgdG9vbC4KKyAgICAgICAgSXQgcGx1Z3MgaW50byBtYWpvciBKYXZhIElERXMsIGFsc28gcnVucyBzdGFuZC1hbG9uZSB3aXRoCisgICAgICAgIGEgR1VJIGFuZCBhIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UuPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41IGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5yZWZhY3Rvcml0LmNvbS8iPmh0dHA6Ly93d3cucmVmYWN0b3JpdC5jb20vPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpzdXBwb3J0QHJlZmFjdG9yaXQuY29tIj5zdXBwb3J0QHJlZmFjdG9yaXQuY29tPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkNvbW1lcmNpYWwuIChGcmVlIGZvciBhY2NyZWRpdGVkIG9wZW4gc291cmNlIHByb2R1Y3RzLCBzZWUKKyAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cucmVmYWN0b3JpdC5jb20vb3NjIj5odHRwOi8vd3d3LnJlZmFjdG9yaXQuY29tL29zYzwvYT4uKTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUmVmbGVjdGFudCBUYXNrIj4KKworICAgICAgICA8cD5UaGlzIGlzIGEgdGFzayBmb3IgcmVmbGVjdGlvbiBpbnZvY2F0aW9uIGZyb20gd2l0aGluIGFudCBidWlsZCBmaWxlLjwvcD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNSBvciBhYm92ZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9yZWZsZWN0YW50LyI+aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9yZWZsZWN0YW50LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86c3ZfYW50QG1haWwuYmciPnN2X2FudEBtYWlsLmJnPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0icnVuZG9jIj4KKyAgICAgICAgPHA+QSB0YXNrIGRlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGUgc2luZ2xlLXNvdXJjaW5nIG9mIHByb2dyYW0KKyAgICAgICAgZG9jdW1lbnRhdGlvbi4gUnVuZG9jIHJlcGxhY2VzIHNwZWNpYWwgY29tbWFuZHMKKyAgICAgICAgKGluIHRoZSBmb3JtYXQgPGk+QEBydW5kb2M6Y29tbWFuZCBwYXJhbTEgcGFyYW0yLi4uQEA8L2k+KSBlbWJlZGRlZAorICAgICAgICB3aXRoaW4gdGV4dCBmaWxlcyB3aXRoIHRoZWlyIG91dHB1dCBpbiBhCisgICAgICAgIHNwZWNpZmllZCBmb3JtYXQuIEN1cnJlbnRseSwgb25seSBEb2Nib29rIGZvcm1hdCBpcyBzdXBwb3J0ZWQuPC9wPgorCisgICAgICAgIDxwPlJ1bmRvYyB3YXMgd3JpdHRlbiB0byBrZWVwIHNhbXBsZSBjb2RlIG91dHB1dCBpbiBwcm9ncmFtCisgICAgICAgIGRvY3VtZW50YXRpb24gc3luY2hyb25pemVkIHdpdGggdGhlIGFjdHVhbCBvdXRwdXQKKyAgICAgICAgb2YgdGhlIGN1cnJlbnQgY29kZSwgYnkgcnVubmluZyB0aGUgcmVmZXJlbmNlZCBjb2RlIHdoZW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gaXMgYnVpbHQuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPlRlc3RlZCB3aXRoIDEuNiAgU2hvdWxkIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMuPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm1hcnRpYW5zb2Z0d2FyZS5jb20vbGFiL2luZGV4Lmh0bWwjcnVuZG9jIj5odHRwOi8vd3d3Lm1hcnRpYW5zb2Z0d2FyZS5jb20vbGFiL2luZGV4Lmh0bWwjcnVuZG9jPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cubWFydGlhbnNvZnR3YXJlLmNvbS9jb250YWN0Lmh0bWwiPk1hcnR5IExhbWI8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+UmV2aXNlZCBCU0Q8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlNlcmlhbFZlciI+CisKKyAgICAgICAgPHA+U2VyaWFsVmVyIGFkZHMgdGhlIEphdmEgc2VyaWFsdmVyIGZ1bmN0aW9uYWxpdHkgdG8gQXBhY2hlCisgICAgICAgIEFudC4gIFRoaXMgcHJvamVjdCBhZGRzIFRhc2tzIGFuZCBGaWx0ZXJSZWFkZXJzIHRvIGdldCwgdG8KKyAgICAgICAgaW5zZXJ0IGFuZCB0byBtb2RpZnkgdGhlIHNlcmlhbFZlcnNpb25VSUQgaW4gdGhlIHNvdXJjZSBjb2RlCisgICAgICAgIG9mIGEgc2VyaWFsaXphYmxlIGNsYXNzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41LjEgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc2VyaWFsdmVyLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9zZXJpYWx2ZXIuc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zZXJpYWx2ZXItZGV2ZWxvcG1lbnQiPmRldmVsb3BlciBtYWlsaW5nIGxpc3Q8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlNpbWlhbiI+CisKKyAgICAgICAgPHA+U2ltaWFuIChTaW1pbGFyaXR5IEFuYWx5c2VyKSBpZGVudGlmaWVzIGR1cGxpY2F0aW9uIGluIEphdmEsCisgICAgICAgIEMjLCBDLCBDUFAsIENPQk9MLCBKU1AsIEhUTUwgc291cmNlIGNvZGUgYW5kIGV2ZW4gcGxhaW4gdGV4dCBmaWxlcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNS4xIGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5yZWRoaWxsY29uc3VsdGluZy5jb20uYXUvcHJvZHVjdHMvc2ltaWFuLyI+CisgICAgICAgICAgICBodHRwOi8vd3d3LnJlZGhpbGxjb25zdWx0aW5nLmNvbS5hdS9wcm9kdWN0cy9zaW1pYW4vPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpzaW1pYW4tdXNlci1zdWJzY3JpYmVAcmVkaGlsbGNvbnN1bHRpbmcuY29tLmF1Ij4KKyAgICAgICAgICAgIHNpbWlhbi11c2VyLXN1YnNjcmliZUByZWRoaWxsY29uc3VsdGluZy5jb20uYXUgKFVzZXIgTWFpbGluZ2xpc3QpCisgICAgICAgICAgICA8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+Q29tbWVyY2lhbCwgRnJlZSBMaWNlbnNlcyBhdmFpbGFibGUgZm9yIE5vbi1Db21tZXJjaWFsIFByb2plY3RzPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJTbWFydEFuYWx5emVyIj4KKworICAgICAgICA8cD5Qb3dlcmZ1bCBhbmFseXNpcyBvZiBkZXBlbmRlbmNpZXMgYmV0d2VlbiBKYXZhIGNsYXNzZXMuCisgICAgICAgIE9ubHkgYWZmZWN0ZWQgY2xhc3NlcyB3aWxsIGJlIHJlY29tcGlsZWQgYW5kIGl0IGNhbiBiZSB1c2VkCisgICAgICAgIHdpdGggYW55IGJ5dGVjb2RlIGNvbXBpbGVyLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgQW50IHZlcnNpb24gMS41LjE8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zbWFydGFuYWx5emVyLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9zbWFydGFuYWx5emVyLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9zbWFydGFuYWx5emVyIj5zdXBwb3J0IGF0IHNvdXJjZWZvcmdlIHByb2plY3QgcGFnZTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSAoR1BMKTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0ic25pcCI+CisgICAgICAgIDxwPkEgdGFzayBkZXNpZ25lZCB0byBoZWxwIHdpdGggdGhlIHNpbmdsZS1zb3VyY2luZyBvZiBwcm9ncmFtIGRvY3VtZW50YXRpb24uCisgICAgICAgIFNuaXAgZXh0cmFjdHMgc25pcHBldHMgb2YgdGV4dCBmcm9tIGZpbGVzLCBwbGFjaW5nIHRoZW0gaW50byBwcm9wZXJ0aWVzIGluIHRoZSBBbnQgcHJvamVjdC4KKyAgICAgICAgVGhlc2UgcHJvcGVydGllcyBjYW4gdGhlbiBiZSB1c2VkIGJ5IGFueSBvdGhlciBBbnQgdGFzaywgYW5kIGFyZSBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4KKyAgICAgICAgcmVmZXJlbmNlZCBieSAmbHQ7ZmlsdGVyJmd0O3Mgd2l0aGluIHRoZSAmbHQ7Y29weSZndDsgdGFzay48L3A+CisKKyAgICAgICAgPHA+U25pcCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIHRvIGtlZXAgc25pcHBldHMgb2Ygc2FtcGxlIGNvZGUgaW4gQVBJIGRvY3VtZW50YXRpb24gc3luY2hyb25pemVkCisgICAgICAgIHdpdGggdGhlIGFjdHVhbCBzYW1wbGUgY2xhc3Nlcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+VGVzdGVkIHdpdGggMS41LjEuICBTaG91bGQgd29yayB3aXRoIGFsbCB2ZXJzaW9ucy48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cubWFydGlhbnNvZnR3YXJlLmNvbS9sYWIvaW5kZXguaHRtbCNzbmlwIj5odHRwOi8vd3d3Lm1hcnRpYW5zb2Z0d2FyZS5jb20vbGFiL2luZGV4Lmh0bWwjc25pcDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm1hcnRpYW5zb2Z0d2FyZS5jb20vY29udGFjdC5odG1sIj5NYXJ0eSBMYW1iPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPlJldmlzZWQgQlNEPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJzcGVsbCI+CisgICAgICAgIDxwPlNwZWxsIENoZWNrIGNoZWNrcyB0aGUgc3BlbGxpbmcgb2YgYWxsIGZpbGVzIGluIGEgZGlyZWN0b3J5LiBDb2RlIGlzIGJyb2tlbiBpbnRvCisgICAgICAgIHNpbmdsZSB3b3JkcyBhbmQgY29tcGFyZWQgdG8gYSBkaWN0aW9uYXJ5LiBJZiB0aGUgd29yZHMgYXJlIG5vdCBpbiB0aGUgZGljdGlvbmFyeQorICAgICAgICB0aGV5IGFyZSB3cml0dGVuIHRvIGEgZmlsZS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+IDwhLS0gSkhNOiBhc2tlZCBSb2IgZm9yIHRoYXQ7IGhlJ2xsIHBpbmcgbWUgaWYgaGUgaXMgYmFjayBhdCBob21lIC0tPiA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9yb2JtYXloZXcuY29tL2FudHNwZWxsL2FudHNwZWxsdGFzay5odG1sIj5odHRwOi8vcm9ibWF5aGV3LmNvbS9hbnRzcGVsbC9hbnRzcGVsbHRhc2suaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnJvYm1heWhldy5jb20vIj5Sb2IgTWF5aGV3PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPiA8IS0tIHNhbWUgYXMgYWJvdmUgLS0+IDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIAorICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iU1FMIENvbXBpbGVyIChTUUxDKSI+CisgICAgICAgIDxwPlNRTCBDb21waWxlciAoU1FMQykgY29tcGlsZXMgZGF0YWJhc2UgbWV0YWRhdGEgYW5kIFNRTCBzdGF0ZW1lbnRzIGludG8gZGF0YSBhY2Nlc3MgYW5kIGRhdGEgdHJhbnNmZXIgY2xhc3Nlcy48L3A+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPlRlc3RlZCB3aXRoIEFudCAxLjUuNCBhbmQgMS42LjU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuaGFtbXVyYXBpLmJpei9wcm9kdWN0cy9zcWxjIj5odHRwOi8vd3d3LmhhbW11cmFwaS5iaXovcHJvZHVjdHMvc3FsYzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmhhbW11cmFwaS5iaXovaGFtbXVyYXBpLWJpei9lZi94bWVudS9jb250YWN0Lmh0bWwiPlByb2plY3QgQ29udGFjdCBQYWdlPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkxHUEw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlNRTFVuaXQiPgorICAgICAgICAgPHA+U1FMVW5pdCBpcyBhIHJlZ3Jlc3Npb24gYW5kIHVuaXQgdGVzdGluZyBoYXJuZXNzIGZvciB0ZXN0aW5nCisgICAgICAgICBkYXRhYmFzZSBzdG9yZWQgcHJvY2VkdXJlcy4gVGhlIHRlc3Qgc3VpdGUgaXMgd3JpdHRlbiBhcyBhbiBYTUwgZmlsZS4KKyAgICAgICAgIFRoZSBTUUxVbml0IGhhcm5lc3MgaXRzZWxmIGlzIHdyaXR0ZW4gaW4gSmF2YSBhbmQgdXNlcyB0aGUgSlVuaXQgdW5pdAorICAgICAgICAgdGVzdGluZyBmcmFtZXdvcmsgdG8gY29udmVydCB0aGUgWE1MIHRlc3Qgc3BlY2lmaWNhdGlvbnMgdG8gSkRCQyBjYWxscworICAgICAgICAgYW5kIGNvbXBhcmUgdGhlIHJlc3VsdHMgZ2VuZXJhdGVkIGZyb20gdGhlIGNhbGxzIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAgICAgcmVzdWx0cy4gSXQgYWxzbyBwcm92aWRlcyB0aGUgJmx0O3NxbHVuaXQmZ3Q7IHRhc2sgdG8gcnVuIHRoZSB0ZXN0cworICAgICAgICAgZnJvbSBhIGJ1aWxkIHNjcmlwdC48L3A+CisgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgIDx0ZD5UZXN0ZWQgd2l0aCBBbnQgMS42PC90ZD4KKyAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3NxbHVuaXQuc291cmNlZm9yZ2UubmV0Ij5odHRwOi8vc3FsdW5pdC5zb3VyY2Vmb3JnZS5uZXQ8L2E+PC90ZD4KKyAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvZm9ydW0vP2dyb3VwX2lkPTc3ODMyIj5Qcm9qZWN0IGZvcnVtczwvYT48L3RkPgorICAgICAgICAgICA8L3RyPgorICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCk8L3RkPgorICAgICAgICAgICA8L3RyPgorICAgICAgICAgPC90YWJsZT4KKyAgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlN0eWxlciI+CisKKyAgICAgICAgPHA+VGhlIHN0eWxlciB0YXNrIG1ha2VzIHVzZWZ1bCBjb21iaW5hdGlvbnMgb2YgWFNMVCB0cmFuc2Zvcm1hdGlvbnMKKyAgICAgICAgZWFzeSB0byBzcGVjaWZ5IGluIGFuIEFudCBidWlsZCBmaWxlLiBMaWtlIHRoZSBidWlsdC1pbiBBbnQgdGFzaworICAgICAgICBzdHlsZSwgc3R5bGVyIGNhbiBhcHBseSBhIHNpbmdsZSB0cmFuc2Zvcm1hdGlvbiB0byBhIHNldCBvZiBYTUwgZmlsZXMuCisgICAgICAgIEJ1dCBpdCBjYW4gYWxzbzo8L3A+CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+aGFuZGxlIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9ucywgaW4gcGFyYWxsZWwgb3IgcGlwZWxpbmVkLjwvbGk+CisgICAgICAgICAgPGxpPmVuYWJsZSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBzcGxpdCBvciBtZXJnZSBmaWxlczwvbGk+CisgICAgICAgICAgPGxpPnByb2Nlc3Mgbm9uLVhNTCBmaWxlcywgZXNwZWNpYWxseSBIVE1MIChiYXNlZCBvbiBKVGlkeSk8L2xpPgorICAgICAgICAgIDxsaT5hcHBseSBub24tWFNMVCB0cmFuc2Zvcm1hdGlvbiwgZXNwZWNpYWxseSAicmVndWxhcgorICAgICAgICAgIGZyYWdtZW50YXRpb25zIjwvbGk+CisgICAgICAgICAgPGxpPnVzZSBhbnkgY3VzdG9tIFhNTFJlYWRlciBvciBYTUxGaWx0ZXIgY2xhc3MgdG8gaGFuZGxlIG5ldyBmaWxlCisgICAgICAgICAgZm9ybWF0cyBhbmQgdHJhbnNmb3JtYXRpb24gdGVjaG5pcXVlcy48L2xpPgorICAgICAgICA8L3VsPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmxhbmdkYWxlLmNvbS5hdS9zdHlsZXIvIj5odHRwOi8vd3d3LmxhbmdkYWxlLmNvbS5hdS9zdHlsZXIvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzphZHZAbGFuZ2RhbGUuY29tLmF1Ij5Bcm5vbGQgZGVWb3M8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+TEdQTDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iU3ludGF4Ij4KKworICAgICAgICA8cD5UcmFuc2Zvcm1zIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwgZG9jdW1lbnRzIHdpdGggc3ludGF4CisgICAgICAgIGhpZ2hsaWdodGluZy4gSXQgY2FuIGhhbmRsZSBhIHZhcmlldHkgb2Ygc291cmNlIGZpbGVzCisgICAgICAgIGluY2x1ZGluZyBKYXZhLCBIVE1MLCBDL0MrKywgU1FMLCBhbmQgSmF2YSBwcm9wZXJ0aWVzLiAgQ29sb3JzCisgICAgICAgIGZvciBlbGVtZW50cyBhcmUgc3BlY2lmaWVkIHVzaW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHMuICBUaGUKKyAgICAgICAgb3V0cHV0IGNhbiBiZSB0ZW1wbGF0ZWQgZm9yIGVhc3kgaW50ZWdyYXRpb24gd2l0aCBhIHNpdGUncworICAgICAgICBsb29rIGFuZCBmZWVsLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vb3N0ZXJtaWxsZXIub3JnL3N5bnRheC9hbnQuaHRtbCI+aHR0cDovL29zdGVybWlsbGVyLm9yZy9zeW50YXgvYW50Lmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL29zdGVybWlsbGVyLm9yZy9jb250YWN0LnBsP3JlZ2FyZGluZz1TeW50YXgrSGlnaGxpZ2h0aW5nIj5TdGVwaGVuIE9zdGVybWlsbGVyPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJUZXN0U2V0R2VuZXJhdG9yIj4KKworICAgICAgICA8cD5UaGUgVGVzdFNldEdlbmVyYXRvciBpcyBhbiBhbnQgdGFzayBmb3IgZ2VuZXJhdGluZyBwcm9wZXJ0eSBmaWxlcyB3aXRoCisgICAgICAgIHRlc3RzZXRzIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIFNRTCBxdWVyaWVzIGFuZCB2YWxpZGF0aW9uIHBsdWctaW5zLiBWZXJ5CisgICAgICAgIHVzZWZ1bGwgd2hlbiBidWlsZGluZyB1bml0IHRlc3RzIHRoYXQgbWFrZSB1c2Ugb2YgY2hhbmdpbmcgZGF0YXNldHMuIFRoaXMKKyAgICAgICAgdGFzayBpcyBhbiBleHRlbnNpb24gb2YgdGhlIEFudCBTUUwgdGFzay4gSHNxbGRiIGlzIHVzZWQgZm9yIGJvdGggdGhlCisgICAgICAgIGV4YW1wbGVzIGFuZCB0aGUgdW5pdHRlc3RzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BTlQgMS40IChvciBsYXRlcik8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnR0ZXN0c2V0Z2VuLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnR0ZXN0c2V0Z2VuLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOm0uYy5qYW5zZW5AcGxhbmV0Lm5sIj5tLmMuamFuc2VuQHBsYW5ldC5ubDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5HUEw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlRpZHkgSW1wb3J0cyAoVGltKSI+CisKKyAgICAgICAgPHA+VGltIGlzIGEgaGFuZHkgdXRpbGl0eSB0aGF0IGNhbiBiZSBleGVjdXRlZCBvbiB0aGUgY29tbWFuZAorICAgICAgICBsaW5lIG9yIHZpYSBBbnQgdGhhdCBhdXRvbWF0aWNhbGx5IGZvcm1hdHMgeW91ciBpbXBvcnQKKyAgICAgICAgZGVjbGFyYXRpb25zLiBUaW0gaXMgY2FwYWJsZSBvZiByZW1vdmluZyB1bnVzZWQgaW1wb3J0cywKKyAgICAgICAgZXhwYW5kaW5nIG9yIGNvbGxhcHNpbmcgaW1wb3J0cyBhbmQgZXZlbiBvcmdhbmlzaW5nIHRoZW0gaW50bworICAgICAgICBwcmUtZGV0ZXJtaW5lZCBncm91cHMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjMgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmNoaXZlLmNvbS90aW0uaHRtIj5odHRwOi8vd3d3LmNoaXZlLmNvbS90aW0uaHRtPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpzdXBwb3J0QGNoaXZlLmNvbSI+c3VwcG9ydEBjaGl2ZS5jb208L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+Q29tbWVyY2lhbDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iVGluaUFudCI+CisKKyAgICAgICAgPHA+VGluaUFudCBpcyBhbiBBbnQgdGFzayB0byBzdXBwb3J0IGJ1aWxkaW5nIGFwcGxpY2F0aW9ucyBmb3IKKyAgICAgICAgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWJ1dHRvbi5jb20vVElOSS8iPlRJTkk8L2E+LjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS4yIHRvIDEuNC4xPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vdGluaWFudC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vdGluaWFudC5zb3VyY2Vmb3JnZS5uZXQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzprZWxseUBhZDE0NDAubmV0Ij5TZWFuIEtlbGx5PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkJTRC1saWtlIGxpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlRyYW5zZm9ybWljYSI+CisgICAgICAgIDxwPlRyYW5zZm9ybWljYSBpcyBhIHZlcnNhdGlsZSBhbmQgZXh0ZW5zaWJsZSBjb2RlIGdlbmVyYXRvci4KKyAgICAgICAgICAgU3VwcG9ydHMgbXVsdGlwbGUgc291cmNlIG1vZGVscyBpbmNsdWRpbmcgZGF0YWJhc2UgbWV0YWRhdGEsIEphdmEgc291cmNlIGZpbGVzLCBncmFtbWFyCisgICAgICAgICAgIGZpbGVzIGFuZCBjdXN0b20gbW9kZWxzLgorICAgICAgICA8L3A+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPlRlc3RlZCB3aXRoIEFudCAxLjUueCBhbmQgMS42LjU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuaGFtbXVyYXBpLmJpei9wcm9kdWN0cy90cmFuc2Zvcm1pY2EiPmh0dHA6Ly93d3cuaGFtbXVyYXBpLmJpei9wcm9kdWN0cy90cmFuc2Zvcm1pY2E8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5oYW1tdXJhcGkuYml6L2hhbW11cmFwaS1iaXovZWYveG1lbnUvY29udGFjdC5odG1sIj5Qcm9qZWN0IENvbnRhY3QgUGFnZTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5MR1BMPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJWZW51cyBBcHBsaWNhdGlvbiBQdWJsaXNoZXIncyAoVmFtcCkgQW50IFRhc2sgU3VpdGUiPgorCisgICAgICAgIDxwPlZlbnVzIEFwcGxpY2F0aW9uIFB1Ymxpc2hlcidzIChWYW1wKSBBbnQgVGFzayBTdWl0ZSBhbGxvd3MKKyAgICAgICAgeW91IHRvIHNpZ24gYW5kIHBhY2thZ2UgeW91ciBhcHBsaWNhdGlvbnMgaW50byByZWxvY2F0YWJsZSBXZWIKKyAgICAgICAgQXJjaGl2ZXMgdGhhdCB5b3UgY2FuIGRyb3AgaW50byB5b3VyIHdlYiBzZXJ2ZXIgZm9yCisgICAgICAgIHNpbmdsZS1jbGljayBsYXVuY2hpbmcgdXNpbmcgSmF2YSBXZWIgU3RhcnQgb3IgaW50byBzaW5nbGUKKyAgICAgICAgSmF2YSBBcmNoaXZlIGluc3RhbGxlcnMgdGhhdCBzZXJ2ZSB1cCB0aGVpciBjb250ZW50IHRocm91Z2ggYQorICAgICAgICBidWlsdC1pbiwgbXVsdGktdGhyZWFkZWQsIHVsdHJhIGxpZ2h0LXdlaWdodCB3ZWIgc2VydmVyLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS4yIGFuZCAxLjM8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS92YW1wMjAxL2FudC5odG1sIj5odHRwOi8vd3d3Lmdlb2NpdGllcy5jb20vdmFtcDIwMS9hbnQuaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86dmFtcDIwMUB5YWhvby5jb20iPkdlcmFsZCBCYXVlcjwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iVmVyc2lvbl9Ub29sIj4KKyAgICAgICAgPHA+QSB2ZXJzaW9uaW5nIHRvb2wgZm9yIEFudC48L3A+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUuMTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2FudC5yeWFuZ3JpZXIuY29tLyI+aHR0cDovL2FudC5yeWFuZ3JpZXIuY29tLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86dmVyc2lvbl90b29sQHJ5YW5ncmllci5jb20iPnZlcnNpb25fdG9vbEByeWFuZ3JpZXIuY29tPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkJTRCBsaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJWUFAiPgorCisgICAgICAgIDxwPlZQUCBwcm92aWRlcyBnZW5lcmFsIGZpbGUgcHJlcHJvY2Vzc2luZyBzdXBwb3J0IGJhc2VkIG9uCisgICAgICAgIHRoZSBWZWxvY2l0eSBUZW1wbGF0ZSBFbmdpbmUuICBUaGUgY29yZSBmdW5jdGlvbmFsaXR5IGlzCisgICAgICAgIHByb3ZpZGVkIGFzIGEgZmlsdGVyIGZvciB1c2Ugd2l0aCB0YXNrcyB0aGF0IHN1cHBvcnRzIGZpbHRlcgorICAgICAgICBjaGFpbnMuICBBbHNvIGluY2x1ZGVkIGFyZSByZXBsYWNlbWVudCB0YXNrcyBmb3IgJmx0O2NvcHkmZ3Q7IGFuZAorICAgICAgICAmbHQ7amF2YWMmZ3Q7IHRoYXQgaW50ZWdyYXRlIHN1cHBvcnQgZm9yIHByZXByb2Nlc3NpbmcuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPjEuNS4xIGFuZCBhYm92ZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3ZwcC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vdnBwLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOnZwcC11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCI+dnBwLXVzZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkJTRCBsaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJXT1Byb2plY3QiPgorCisgICAgICAgIDxwPldPUHJvamVjdCBwcm92aWRlcyBhIHNldCBvZiB0b29scyB0byB3b3JrIHdpdGgKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL3dlYm9iamVjdHMuY29tLyI+V2ViT2JqZWN0cyA1LjE8L2E+CisgICAgICAgIGluZGVwZW5kZW50IGZyb20gcGxhdGZvcm0gYW5kIElERS4gSXQgc2lnbmlmaWNhbnRseQorICAgICAgICBpbXByb3ZlcyBkZXZlbG9wZXIgcHJvZHVjdGl2aXR5CisgICAgICAgIGFuZCBtYWtlcyBjb21wbGV4IHByb2plY3Qgc3RydWN0dXJlcyBtb3JlIGZsZXhpYmxlIGNvbXBhcmVkIHRvCisgICAgICAgIHRyYWRpdGlvbmFsIE1ha2VmaWxlLWJhc2VkIGFwcHJvYWNoLgorICAgICAgICA8L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL29iamVjdHN0eWxlLm9yZy93b3Byb2plY3QvIj5odHRwOi8vb2JqZWN0c3R5bGUub3JnL3dvcHJvamVjdC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmFuZHJ1c0BvYmplY3RzdHlsZS5vcmciPkFuZHJ1cyBBZGFtY2hpazwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgbGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iV1NETFZhbGlkYXRlIj4KKyAgICAgICAgPHA+V1NETFZhbGlkYXRlIGlzLCBhcyBpdCBzb3VuZHMsIGEgdG9vbCB0byB2YWxpZGF0ZSBXU0RMIGZpbGVzLgorICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXh0ZWNoLmNnaS9+Y2hlY2tvdXR+L3dzdnQtaG9tZS9kb2NzL2FydGljbGVzL3dzZGwyMFZhbGlkYXRvci93c2RsdmFsaWRhdGVhbnQuaHRtbCI+V1NETFZhbGlkYXRlPC9hPgorICAgICAgICBpcyBzaW1pbGFyIGluIGNvbmZpZ3VyYXRpb24gdG8gdGhlIG9wdGlvbmFsIEFudCB0YXNrIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvT3B0aW9uYWxUYXNrcy94bWx2YWxpZGF0ZS5odG1sIj5YTUxWYWxpZGF0ZTwvYT4uCisgICAgICAgIFdTRExWYWxpZGF0ZSBjYW4gb3B0aW9uYWxseSB2YWxpZGF0ZSBhIFdTREwgZG9jdW1lbnQgYWdhaW5zdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53cy1pLm9yZyI+V1MtSSBCYXNpYyBQcm9maWxlPC9hPi4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD5XU0RMVmFsaWRhdGUgaXMgYXZhaWxhYmxlIGFzIGFuIEFudCB0YXNrLCBhbiBFY2xpcHNlIHBsdWctaW4gYW5kIGEKKyAgICAgICAgY29tbWFuZCBsaW5lIHV0aWxpdHkuPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41IG9yIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzdnQiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd3N2dDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzdnQiPlByb2plY3QgbmV3c2dyb3VwIGFuZAorICAgICAgICAgICAgbWFpbGluZyBsaXN0PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3ctMTI0LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3NzL0NQTHYxLjAuaHRtIj5Db21tb24gUHVibGljCisgICAgICAgICAgICBMaWNlbnNlIChDUEwpPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iWGNsdWRlciI+CisgICAgICAgIDxwPnhjbHVkZXIgaXMgYW4gWE1MIEluY2x1c2lvbnMgKFhJbmNsdWRlKSB0YXNrIGZvciBBcGFjaGUgQW50LgorICAgICAgICBPZmZlcnMgdGhlIGNob2ljZSBvZiB1c2luZyBYZXJjZXMgb3IgRWxsaW90dGUgUnVzdHkgSGFyb2xkJ3MgWE9NIEFQSS4KKyAgICAgICAgPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40IG9yIGxhdGVyLiBYSW5jbHVkZSBjb21wbGlhbmNlIGRlcGVuZHMgb24gdGhlCisgICAgICAgICAgICB1bmRlcmx5aW5nIFhlcmNlcyBvciBYT00gdXNlZC4gWGVyY2VzIDIuNS4wIGFuZCBhYm92ZSB3b3JrcyBmaW5lLAorICAgICAgICAgICAgYnV0IHBsZWFzZSBub3RlIHRoYXQgMi42LjEgYW5kIDIuNi4yIHByb2Nlc3NlZCB0aGUKKyAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDMvWEluY2x1ZGUsIG5vdyBvYnNvbGV0ZSBieQorICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSB1c2VkIGJ5IHRoZSBsYXRlc3QKKyAgICAgICAgICAgIENhbmRpZGF0ZSBSZWNvbW1lbmRhdGlvbiAoMTMgQXByaWwgMjAwNCkuCisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMveGNsdWRlciI+aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy94Y2x1ZGVyPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzptYmF0c2lzQHVzZXJzLnNmLm5ldCI+bWJhdHNpc0B1c2Vycy5zZi5uZXQ8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIEdOVSBMaWJyYXJ5IG9yIExlc3NlcgorICAgICAgICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoTEdQTCkKKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iWERvY2xldCI+CisKKyAgICAgICAgPHA+WERvY2xldCBpcyBhbiBleHRlbmRlZCBKYXZhZG9jIERvY2xldCBlbmdpbmUgZm9yIHVzZSBpbiBBbnQuCisgICAgICAgICAgIEl0IGxldHMgeW91IGNyZWF0ZSBjdXN0b20gSmF2YWRvYyBAdGFncyBhbmQgYmFzZWQgb24gdGhvc2UgdGFncworICAgICAgICAgICBnZW5lcmF0ZXMgc291cmNlIGNvZGUgb3Igb3RoZXIgZmlsZXMgKHN1Y2ggYXMgeG1sLWlzaCBkZXBsb3ltZW50CisgICAgICAgICAgIGRlc2NyaXB0b3JzKS4gVGVtcGxhdGVzIGFuZCBtYXRjaGluZyB0YXNrcyBhcmUgcHJvdmlkZWQgdG8gZ2VuZXJhdGUKKyAgICAgICAgICAgRUpCIGFuZCB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KKyAgICAgICAgICAgPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjQ8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMveGRvY2xldC8iPmh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMveGRvY2xldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QlNEIGxpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlhJbmNsdWRlIj4KKyAgICAgICAgPHA+PGEgaHJlZj0iaHR0cDovL3d3dy5qZWNrbGUuZGUvZnJlZVN0dWZmL3hpYS9pbmRleC5odG1sIj5YSW5jbHVkZTwvYT4gaXMKKyAgICAgICAgICBhIFczQyBzdGFuZGFyZGl6ZWQgdm9jYWJ1bGFyeSBmb3IgaW5jbHVkaW5nIGFyYml0cmFyeSB0ZXh0IG9yIFhNTAorICAgICAgICAgIGRvY3VtZW50cyBpbiBvdGhlciBYTUwgZG9jdW1lbnRzLiBUaGlzIHRhc2sgcGVyZm9ybWVzIHRoZSBpbmNsdXNpb24KKyAgICAgICAgICB1c2luZyBhbiBleGlzdGluZyBYSW5jbHVkZSBpbXBsZW1lbnRhdGlvbjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41LjI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmplY2tsZS5kZS9mcmVlU3R1ZmYveGlhL2luZGV4Lmh0bWwiPmh0dHA6Ly93d3cuamVja2xlLmRlL2ZyZWVTdHVmZi94aWEvaW5kZXguaHRtbDwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzptYXJpb0BqZWNrbGUuZGUiPm1hcmlvQGplY2tsZS5kZTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5MZXNzZXIgR05VIFB1YmxpYyBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJYTUwgRGlyZWN0b3J5IExpc3RpbmcgQW50IFRhc2siPgorCisgICAgICAgIDxwPlRoZSBYTUwgRGlyZWN0b3J5IExpc3RpbmcgdGFzayBjYW4gcmVjdXJzZSB0aHJvdWdoIGEgZGlyZWN0b3J5IHN0cnVjdHVyZSBhbmQgcHJvZHVjZSBhbiAKKyAgICAgICAgWE1MIHJlcHJlc2VudGF0aW9uLiBUaGUgcmVzdWx0aW5nIGZpbGUgY2FuIHRoZW4gYmUgdHJhbnNmb3JtZWQgZnVydGhlciB3aXRoIEFudC4gPC9wPgorICAgICAgICA8cD5UaGUgWE1MIG91dHB1dCBpcyBjb25maWd1cmFibGUgdGhyb3VnaCB2YXJpb3VzIG9wdGlvbnMuIFRoZSBTQVggcGFyc2luZyBpcyBmYXN0IGFuZCBoYXMgYSAKKyAgICAgICAgbG93IG1lbW9yeSBmb290cHJpbnQuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjYuNSBvciBoaWdoZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC94bWwtZGlyLWxpc3RpbmcvIj5odHRwOi8vY29kZS5nb29nbGUuY29tL3AveG1sLWRpci1saXN0aW5nLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86bWF0dF9hdF9tYXR0aGF5bmVzX2RvdF9uZXQiPk0uIEhheW5lczwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgTGljZW5zZSAyLjA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+ICAgICAgCisJICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlhNTFJlbGVhc2VOb3RlcyAoWFJOKSI+CisKKyAgICAgICAgPHA+VGhpcyBmcmFtZXdvcmsgaXMgYSByZWxlYXNlIG5vdGVzIGZyYW1ld29yayB0aGF0IGVuYWJsZXMgdG8KKyAgICAgICAgZ2VuZXJhdGUgdGV4dHVhbCByZWxlYXNlIG5vdGVzIGZyb20gYW4gWE1MIGZpbGUuIFRoaXMgaXMgYW4KKyAgICAgICAgb3BlbiBmcmFtZXdvcmsgdGhhdCBlbmFibGVzIHRvIGludGVncmF0ZSB0aGUgaW5mb3JtYXRpb24KKyAgICAgICAgY29taW5nIGZyb20gVlNDIGFuZCBidWcgdHJhY2tpbmcgc29sdXRpb25zLCBmb3IgaW5zdGFuY2UuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8veG1scmVsZWFzZW5vdGVzLmZyZWUuZnIvIj5odHRwOi8veG1scmVsZWFzZW5vdGVzLmZyZWUuZnIvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPkVkb3VhcmQgTWVyY2llcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJYbWxUYXNrIj4KKworICAgICAgICA8cD5YbWxUYXNrIHByb3ZpZGVzIGEgc2ltcGxlIG1lYW5zIHRvIG1vZGlmeSBYTUwgZG9jdW1lbnRzCisgICAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIGxlYXJuIFhTTFQuIEEgc2ltcGxlIHBhdGggcmVmZXJlbmNlIHRvIGFuCisgICAgICAgIFhNTCBub2RlIHNwZWNpZmllcyB0aGUgbm9kZSB5b3Ugd2FudCB0byBjaGFuZ2UsIGFuZCBob3cgeW91CisgICAgICAgIHdhbnQgdG8gYWxsb3cgWE1MIGluc2VydGlvbiBhbmQgcmVtb3ZhbCwgb3IgYXR0cmlidXRlCisgICAgICAgIGNoYW5nZXMuIFRoZSBlbXBoYXNpcyBpcyBvbiBwcm92aWRpbmcgdGhlIHNpbXBsZXN0IG1lYW5zIHRvCisgICAgICAgIHBlcmZvcm0gY29tbW9uIFhNTCByZXBsYWNlbWVudHM8L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNCBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub29wc2NvbnN1bHRhbmN5LmNvbS9zb2Z0d2FyZS94bWx0YXNrLyI+aHR0cDovL3d3dy5vb3BzY29uc3VsdGFuY3kuY29tL3NvZnR3YXJlL3htbHRhc2svPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzp4bWx0YXNrLXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCI+eG1sdGFzay11c2VycyBhdCBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ8L2E+IDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJ5R3VhcmQiPgorCisgICAgICAgIDxwPnlHdWFyZCBpcyBhIGZyZWUgSmF2YShUTSkgQnl0ZWNvZGUgT2JmdXNjYXRvciBUYXNrIHRoYXQKKyAgICAgICAgbmVlZHMgbm8gZXh0ZXJuYWwgc2NyaXB0IG9yIHByb2plY3QgZmlsZXMuIEl0IGNhbiBjb21wbGV0ZWx5CisgICAgICAgIGJlIGNvbmZpZ3VyZWQgYW5kIHJ1biB0aHJvdWdoIHRoZSBBbnQgYnVpbGQgc2NyaXB0LiBUaGUgdGFzaworICAgICAgICBzdXBwb3J0cyBtdWx0aXBsZSBKYXIgZmlsZXMgYXQgb25jZSBhbmQgbWFrZXMgdXNlIG9mCisgICAgICAgIHBhdHRlcm5zZXRzIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zIHRvIHNwZWNpZnkgZWxlbWVudHMsIHdoaWNoCisgICAgICAgIHNob3VsZCBiZSBsZWZ0IHVub2JmdXNjYXRlZC4gIEFkZGl0aW9uYWxseSBpdCBjYW4gYmUgdXNlZCB0bworICAgICAgICBwcm9kdWNlIHBhdGNoZXMgZm9yIG9iZnVzY2F0ZWQgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBhbHJlYWR5CisgICAgICAgIGJlZW4gZGVwbG95ZWQuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lnl3b3Jrcy5jb20vZW4vcHJvZHVjdHNfeWd1YXJkX2Fib3V0Lmh0bSI+aHR0cDovL3d3dy55d29ya3MuY29tL2VuL3Byb2R1Y3RzX3lndWFyZF9hYm91dC5odG08L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOnlndWFyZEB5d29ya3MuY29tIj55R3VhcmRAeVdvcmtzLmNvbTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5MaWJyYXJ5OiBMR1BMLCBUYXNrOiBDb21tZXJjaWFsPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJaZWxpeCBLbGFzc01hc3RlciI+CisKKyAgICAgICAgPHA+VGhlIHRhc2sgWktNVGFzayBhbGxvd3MgdGhlIFplbGl4IEtsYXNzTWFzdGVyIEphdmEgb2JmdXNjYXRvciB0byBiZSBpbnRlZ3JhdGVkIGludG8gYW4gQW50IGJ1aWxkLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40LjEgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnplbGl4LmNvbS9rbGFzc21hc3Rlci9kb2NzL2J1aWxkVG9vbEFwaS5odG1sIj5odHRwOi8vd3d3LnplbGl4LmNvbS9rbGFzc21hc3Rlci9kb2NzL2J1aWxkVG9vbEFwaS5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkNvbW1lcmNpYWw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICA8L3NlY3Rpb24+CisKKworCisgICAgPHNlY3Rpb24gbmFtZT0iQnVpbGQgTGlzdGVuZXJzIj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50VXRpbGl0eSI+CisKKyAgICAgICAgPHA+CisgICAgICAgICAgV29uZGVyaW5nIHdoeSB5b3VyIEFudCBidWlsZCBpcyBzbG93PyBJcyB5b3VyIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gc2VydmVyIHRha2luZyB0b28gCisgICAgICAgICAgbG9uZyB0byBwcm9kdWNlIHlvdXIgcHJvamVjdCBidWlsZHM/IFRoaXMgcHJvamVjdCBtYXkgaGVscC4gVGhpcyBwcm9qZWN0IGluY2x1ZGVzIGEgc21hbGwgCisgICAgICAgICAgbnVtYmVyIG9mIGNsYXNzZXMgZm9yIHVzZSB3aXRoIEFudCB0aGF0IGNhbiBoZWxwIHlvdSB0byBhbmFseXplIHlvdXIgYnVpbGQgaW4gYSAKKyAgICAgICAgICBub24taW50cnVzaXZlIG1hbm5lci4KKyAgICAgICAgPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjY8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vYW50dXRpbGl0eS5kZXYuamF2YS5uZXQvIj5odHRwczovL2FudHV0aWxpdHkuZGV2LmphdmEubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86ZGdyZWVuQGRldi5qYXZhLm5ldCI+RGF2aWQgR3JlZW48L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisKKworICAgIDxzZWN0aW9uIG5hbWU9IkNvbXBpbGVyIEltcGxlbWVudGF0aW9ucyI+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyaWNzIChKU1IxNCkgRWFybHktQWNjZXNzIENvbXBpbGVyIEFkYXB0ZXIiPgorCisgICAgICAgIDxwPlRoaXMgaXMgYW4gQW50IGNvbXBpbGVyLWFkYXB0ZXIgdGhhdCBhbGxvd3MgeW91IHRvIHVzZSB0aGUKKyAgICAgICAgbm9ybWFsIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IHRhc2sgcGx1cyBTdW4ncyBlYXJseS1hY2Nlc3MKKyAgICAgICAgY29tcGlsZXIgdG8gY29tcGlsZSBHZW5lcmljcy1lbmFibGVkIEphdmEgY29kZS4gIChUaGlzIGlzIG9ubHkKKyAgICAgICAgbmVjZXNzYXJ5IHVudGlsIEpESzEuNSBpcyByZWxlYXNlZC4pPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm1hZGJlYW4uY29tL2Jsb2cvMy8iPmh0dHA6Ly93d3cubWFkYmVhbi5jb20vYmxvZy8zLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD5NYXR0IFF1YWlsICZsdDtzcHVkW2F0XW1hZGJlYW5bZG90XWNvbSZndDs8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5QdWJsaWMgRG9tYWluPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJtaW5pUk1JICZsdDtjb2RlJmd0OyZhbXA7bHQ7cm1pYyZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBpbXBsZW1lbnRhdGlvbiI+CisKKyAgICAgICAgPHA+bWluaVJNSSBpcyBhIGZyZWV3YXJlIG9wZW5zb3VyY2UgbGlicmFyeSB0aGF0IHNlcnZlcyBhcyBhCisgICAgICAgIGxpZ2h0d2VpZ2h0IHJlcGxhY2VtZW50IGZvciB0aGUgb3JpZ2luYWwgamF2YS5ybWkgcGFja2FnZXMgYW5kCisgICAgICAgIGlzIHN1aXRhYmxlIGVzcGVjaWFsbHkgZm9yIGFwcGxldHMuIEFudCAxLjQrCisgICAgICAgIDxjb2RlPiZsdDtybWljJmd0OzwvY29kZT4gYWRhcHRlciBpbmNsdWRlZC48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNCBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS8iPmh0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOlBldHIuVG9tYW5AcGlua25ldC5jeiI+UGV0ciBUb21hbjwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5HbnUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorCisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gbmFtZT0iSURFIGFuZCBFZGl0b3IgSW50ZWdyYXRpb24iPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnRGYXJtIj4KKworICAgICAgICA8cD5BIHBsdWdpbiB0aGF0IGludGVncmF0ZXMgQW50IGludG8gdGhlIGpFZGl0IGVkaXRvci48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+YnVuZGxlcyBBbnQgMS41PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vcGx1Z2lucy5qZWRpdC5vcmcvcGx1Z2lucy8/QW50RmFybSI+aHR0cDovL3BsdWdpbnMuamVkaXQub3JnL3BsdWdpbnMvP0FudEZhcm08L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmplZGl0LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCI+akVkaXQgZGV2ZWxvcGVycyBtYWlsaW5nbGlzdDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgU29mdHdhcmUgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50UnVubmVyIj4KKworICAgICAgICA8cD5BbiBPcGVuVG9vbCB0aGF0IGludGVncmF0ZXMgQW50IGludG8gdGhlIEpCdWlsZGVyIElERQorICAgICAgICAodmVyc2lvbiA1IGFuZCBsYXRlcikuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjIgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vYW50cnVubmVyLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnRydW5uZXIuc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86ZGlyay5zY2huZWxsZUB3ZWIuZGUiPkRpcmsgU2NobmVsbGU8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkNBUGxleCI+CisgICAgICAgIDxwPkNBIFBsZXggaXMgYW4gYXJjaGl0ZWN0ZWQgUkFEIHRvb2wgdGhhdCBjb21iaW5lcyB0aGUgdGVjaG5pcXVlcyBvZgorICAgICAgICBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQsIGNvZGUgZ2VuZXJhdGlvbiBhbmQgcGF0dGVybnMgdG8gY3JlYXRlCisgICAgICAgIGJ1c2luZXNzIGFwcGxpY2F0aW9ucyBmb3IgbXVsdGlwbGUgcGxhdGZvcm1zLCBpbmNsdWRpbmcgSmF2YSwgLk5FVCBhbmQKKyAgICAgICAgSUJNIFN5c3RlbSBpLiBJbiBpdHMgNi4wIHJlbGVhc2UsIENBIFBsZXggaW5jbHVkZXMgaW50ZWdyYXRlZCBzdXBwb3J0CisgICAgICAgIGZvciBidWlsZGluZyBnZW5lcmF0ZWQgSmF2YSBjb2RlIHdpdGggQW50LjwvcD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNi41PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd2lraS5wbGV4aW5mby5uZXQvaW5kZXgucGhwP3RpdGxlPUN1c3RvbWl6aW5nX1BsZXhfNi4wX0FOVF9idWlsZHMiPmh0dHA6Ly93aWtpLnBsZXhpbmZvLm5ldC9pbmRleC5waHA/dGl0bGU9Q3VzdG9taXppbmdfUGxleF82LjBfQU5UX2J1aWxkczwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmNhLmNvbS91cy9wcm9kdWN0cy9wcm9kdWN0LmFzcHg/SUQ9MjU4Ij5odHRwOi8vd3d3LmNhLmNvbS91cy9wcm9kdWN0cy9wcm9kdWN0LmFzcHg/SUQ9MjU4PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkNvbW1lcmNpYWw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkVjbGlwc2UiPgorCisgICAgICAgIDxwPkVjbGlwc2UgaXMgYSB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSB3aXRoIEFudCBpbnRlZ3JhdGlvbi48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIEFudCAxLjMgYW5kIGhpZ2hlciA8YnIvPgorICAgICAgICAgICAgICBCdW5kbGVzIEFudCAxLjYuMiBhcyBvZiBFY2xpcHNlIDMuMC4xICh0ZXN0ZWQgd2l0aCBBbnQgMS41LjQgLSAxLjYuMikgPGJyLz4KKyAgICAgICAgICAgICAgRWNsaXBzZSAzLjIgYnVuZGxlcyBBbnQgMS42LjUgPGJyLz4KKyAgICAgICAgICAgICAgRWNsaXBzZSAzLjMgYnVuZGxlcyBBbnQgMS43LjAgCisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L2E+CisgICAgICAgICAgICAgIG9yCisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvfmNoZWNrb3V0fi9wbGF0Zm9ybS1hbnQtaG9tZS9pbmRleC5odG1sIj4KKyAgICAgICAgICAgICAgICBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpL35jaGVja291dH4vcGxhdGZvcm0tYW50LWhvbWUvaW5kZXguaHRtbAorICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJuZXdzOi8vbmV3cy5lY2xpcHNlLm9yZy9lY2xpcHNlLnBsYXRmb3JtIj5uZXdzOi8vbmV3cy5lY2xpcHNlLm9yZy9lY2xpcHNlLnBsYXRmb3JtPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iR2VsIj4KKworICAgICAgICA8cD5KYXZhIElERSB3aXRoIHN1cHBvcnQgZm9yIEFudC4gIEdlbCBpcyBhIG5hdGl2ZSBNaWNyb3NvZnQKKyAgICAgICAgV2luZG93cyBzb2Z0d2FyZS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNCBhbmQgYWJvdmU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuZ2V4cGVydHMuY29tL2dlbC5odG1sIj5odHRwOi8vd3d3LmdleHBlcnRzLmNvbS9nZWwuaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vZ3JvdXBzLnlhaG9vLmNvbS9ncm91cC9nZWxpZGUvIj5Qcm9qZWN0IE1haWxpbmcgTGlzdDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5GcmVld2FyZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJbnRlbGxpSiBJREVBIDUuMCI+CisgICAgICA8cD5KYXZhIElERSB3aXRoIHJlZmFjdG9yaW5nIHN1cHBvcnQgYW5kIEFudCBpbnRlZ3JhdGlvbi4KKyAgICAgIFRoZSBJREUgaGFzIHNwZWNpYWwgZWRpdGluZyBhbmQgbmF2aWdhdGlvbiBzdXBwb3J0IGZvciBBbnQuCisgICAgICA8L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+YnVuZGxlcyBBbnQgMS42LjU8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuaW50ZWxsaWouY29tL2lkZWEvIj5odHRwOi8vd3d3LmludGVsbGlqLmNvbS9pZGVhLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86c3VwcG9ydEBpbnRlbGxpai5jb20iPnN1cHBvcnRAaW50ZWxsaWouY29tPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkNvbW1lcmNpYWw7IEFjYWRlbWljIGFuZCBPcGVuU291cmNlIGxpY2Vuc2VzIGF2YWlsYWJsZS48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkpCdWlsZGVyIj4KKworICAgICAgICA8cD5Cb3JsYW5kIEpCdWlsZGVyCisgICAgICAgIGNvbWVzIHdpdGggYnVpbHQtaW4gQW50IHN1cHBvcnQsIGluY2x1ZGluZyBidWlsZCBmaWxlIGVkaXRpbmcuCisgICAgICAgIFNvbWUgdmVyc2lvbnMgY29tZSB3aXRoIEFudCBkZWJ1Z2dpbmcgc3VwcG9ydC48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QnVuZGxlcyBBbnQgMS42PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmNvZGVnZWFyLmNvbS9lbi9wcm9kdWN0cy9qYnVpbGRlciI+aHR0cDovL3d3dy5jb2RlZ2Vhci5jb20vZW4vcHJvZHVjdHMvamJ1aWxkZXI8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3N1cHBvcnQuY29kZWdlYXIuY29tL2VuIj5odHRwOi8vc3VwcG9ydC5jb2RlZ2Vhci5jb20vZW48L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+Q29tbWVyY2lhbDsgVHVyYm8gSkJ1aWxkZXIgMjAwNyBpcyBmcmVlLjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSkRFRSI+CisKKyAgICAgICAgPHA+VGhlIEphdmEgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgZm9yIEVtYWNzIChKREVFKSBzdXBwb3J0cworICAgICAgICBBcGFjaGUgQW50IGFzIG9uZSBvZiB0aHJlZSBidWlsdC1pbiB3YXlzIHRvIGJ1aWxkIHlvdXIKKyAgICAgICAgYXBwbGljYXRpb25zLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS4yIGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2pkZWUuc3Vuc2l0ZS5kay8iPmh0dHA6Ly9qZGVlLnN1bnNpdGUuZGsvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpqZGUtc3Vic2NyaWJlQHN1bnNpdGUuYXVjLmRrIj5KREVFIE1haWxpbmcgbGlzdC48L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik5ldEJlYW5zIj4KKworICAgICAgICA8cD5BIG1vZHVsZSB0aGF0IGludGVncmF0ZXMgQW50IGludG8gdGhlIE5ldEJlYW5zIElERSwgYXMgd2VsbCBhcyBkZXJpdmF0aXZlIHByb2R1Y3RzIHN1Y2ggYXMgU3VuIEphdmEKKyAgICAgICAgU3R1ZGlvIChmb3JtZXJseSBGb3J0ZSBmb3IgSmF2YSBhbmQgU3VuIE9ORSBTdHVkaW8pIGFuZCBTdW4gSmF2YSBTdHVkaW8gQ3JlYXRvci4KKyAgICAgICAgVGhpcyBJREUgdXNlcyBBbnQgYXMgaXRzIDxpPnNvbGU8L2k+IG1lYW5zIG9mIGJ1aWxkaW5nIGFwcGxpY2F0aW9ucywKKyAgICAgICAgd2l0aCBjdXN0b20gdGFza3MgYW5kIGFuIEFudC1hd2FyZSBlZGl0b3IuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPmJ1bmRsZXMgMS42LjUgZm9yIE5ldEJlYW5zIDUuMCBhbmQgNS41OyAxLjcuMCBmb3IgTmV0QmVhbnMgNi4wPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm5ldGJlYW5zLm9yZy8iPmh0dHA6Ly93d3cubmV0YmVhbnMub3JnLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86bmJkZXZAbmV0YmVhbnMub3JnIj5uYmRldkBuZXRiZWFucy5vcmc8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iT3B0aXN0aWMgSURYIEphdmEgSURFIj4KKyAgICAgICAgPHA+SmF2YSBJREUgd2l0aCBkZWVwIEFudCBpbnRlZ3JhdGlvbi4gSURYIGlzIGEgbmF0aXZlIE1pY3Jvc29mdCBXaW5kb3dzIHByb2dyYW0uPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5idW5kbGVzIEFudCAxLjY8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9wdGlzdGljLmNvbS9pZHgiPmh0dHA6Ly9vcHRpc3RpYy5jb20vaWR4PC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzpzdXBwb3J0QG9wdGlzdGljLmNvbSI+c3VwcG9ydEBvcHRpc3RpYy5jb208L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5Db21tZXJjaWFsOyBBY2FkZW1pYyBhbmQgT3BlblNvdXJjZSBsaWNlbnNlcyBhdmFpbGFibGUuPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJPcmFjbGUgSkRldmVsb3BlciAxMGkiPgorCisgICAgICAgIDxwPkphdmEgSURFIHdpdGggc3VwcG9ydCBmb3IgQW50LjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41LjE8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JhY2xlLmNvbS90ZWNobm9sb2d5L3Byb2R1Y3RzL2pkZXYvaW5kZXguaHRtbCI+aHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2hub2xvZ3kvcHJvZHVjdHMvamRldi9pbmRleC5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9mb3J1bXMub3JhY2xlLmNvbS9mb3J1bXMvZm9ydW0uanNwYT9mb3J1bUlEPTgzIj5KRGV2ZWxvcGVyIEZvcnVtPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkNvbW1lcmNpYWw8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlZpcnR1YWwgQW50Ij4KKyAgICAgICAgPHA+CisgICAgICAgICAgSW5zdGVhZCBvZiBtYW51YWxseSBjcmVhdGluZyBidWlsZCBzY3JpcHRzIGluIFhNTCwgVmlydHVhbCBBbnQgcHJvdmlkZXMgYSBmdWxseSB2aXJ0dWFsIGZpbGUgc3lzdGVtCisgICAgICAgICAgd2hlcmUgeW91IGNhbiBydW4geW91ciB0YXNrcyBpbiByZWFsIHRpbWUgYW5kIHNlZSB0aGUgcmVzdWx0cy4gRXZlcnl0aGluZyB0aGF0IHlvdSBkbyBpcyByZWNvcmRlZCBhbmQKKyAgICAgICAgICB0dXJuZWQgaW50byBhbiBBbnQgYnVpbGQgc2NyaXB0LgorICAgICAgICA8L3A+CisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICBBbnQgMS42LjUgb253YXJkcworICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5wbGFjaWRzeXN0ZW1zLmNvbS92aXJ0dWFsYW50LyI+aHR0cDovL3d3dy5wbGFjaWRzeXN0ZW1zLmNvbS92aXJ0dWFsYW50LzwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJtYWlsdG86c3VwcG9ydEBwbGFjaWRzeXN0ZW1zLmNvbSI+c3VwcG9ydEBwbGFjaWRzeXN0ZW1zLmNvbTwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkNvbW1lcmNpYWw7IE9wZW5Tb3VyY2UgbGljZW5zZXMgYXZhaWxhYmxlIHRvby48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IldlYlNwaGVyZSBTdHVkaW8gQXBwbGljYXRpb24gRGV2ZWxvcGVyIj4KKworICAgICAgICA8cD5XU0FEIGZlYXR1cmVzIEFudCBpbnRlZ3JhdGUgYnkgdmlydHVlIG9mIGJlaW5nIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIHRvb2xzIHBsYXRmb3JtLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5idW5kbGVzIEFudCAxLjQuMTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL3dlYnNwaGVyZS8iPmh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93ZWJzcGhlcmUvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXJ0aWNsZTo8L3RoPgorICAgICAgICAgICAgPHRkPlVzaW5nIEFudCB3aXRoIFdlYlNwaGVyZSBTdHVkaW8gQXBwbGljYXRpb24gRGV2ZWxvcGVyPHVsPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy0xMjguaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93ZWJzcGhlcmUvbGlicmFyeS90ZWNoYXJ0aWNsZXMvMDIwM19zZWFybGUvc2VhcmxlMS5odG1sIj5QYXJ0IDE8L2E+PC9saT4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvd2Vic3BoZXJlL2xpYnJhcnkvdGVjaGFydGljbGVzLzAyMDNfc2VhcmxlL3NlYXJsZTIuaHRtbCI+UGFydCAyPC9hPjwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL3dlYnNwaGVyZS9saWJyYXJ5L3RlY2hhcnRpY2xlcy8wMjAzX3NlYXJsZS9zZWFybGUzLmh0bWwiPlBhcnQgMzwvYT48L2xpPgorICAgICAgICAgICAgPC91bD48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5Db21tZXJjaWFsPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgPC9zZWN0aW9uPgorCisKKworICAgIDxzZWN0aW9uIG5hbWU9IlNvdXJjZSBDb250cm9sIFN5c3RlbXMiPgorICAgICAgPHA+VGhlcmUgYXJlIHNldmVyYWwgaW50ZWdyYXRpb24gd2l0aCBTQ00gc3lzdGVtcy4gU29tZSBhcmUKKyAgICAgIDxhIGhyZWY9Im1hbnVhbC90YXNrc292ZXJ2aWV3Lmh0bWwjc2NtIj5idWlsdCBpbjwvYT4uIEJ1dCBzb21lIGFyZSBhdmFpbGFibGUgYXMKKyAgICAgIGV4dGVybmFsIGxpYnJhcmllcy4gSGVyZSBhIGxpc3Qgb2YgdGFzayBsaWJyYXJpZXMgd2UgYXJlIGF3YXJlIG9mOjwvcD4KKworCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJjbGVhckFudExpYiI+CisKKyAgICAgICAgIDxwPlRoaXMgbGlicmFyeSBpcyBhIGNvbGxlY3Rpb24gb2YgInZhbHVlLWFkZCIgQW50IHRhc2tzIGZvciBpbnRlZ3JhdGluZyAKKyAgICAgICAgIElCTSBSYXRpb25hbCBDbGVhckNhc2Ugd2l0aCBBcGFjaGUgQW50LiBUaGUgaW50ZWdyYXRpb24gbWFrZXMgZnVsbCB1c2UgCisgICAgICAgICBvZiB0aGUgcG93ZXIgYW5kIGNhcGFiaWxpdGllcyBvZiBBbnQsIHdpdGggc3VwcG9ydCBmb3IgbmVzdGVkIGVsZW1lbnRzIAorICAgICAgICAgKHN1Y2ggYXMgZmlsZXNldHMpIGFuZCBhbHNvIHN1cHBvcnRzIGNvbmRpdGlvbnMuIFRoZXJlIGFyZSBhIG51bWJlciBvZiAKKyAgICAgICAgIHRhc2tzIGZvciBjcmVhdGluZyBYTUwgcmVwb3J0cyBvbiBib3RoIENsZWFyQ2FzZSBiYXNlbGluZXMgYW5kIGxhYmVscyBhcyAKKyAgICAgICAgIHdlbGwgYXMgYSB0YXNrIGZvciAic3RhZ2luZyIgQ2xlYXJDYXNlIG9iamVjdHMuPC9wPgorCisgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS42LjEgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vY2xlYXJhbnRsaWIuc291cmNlZm9yZ2UubmV0LyI+CisgICAgICAgICAgICBodHRwOi8vY2xlYXJhbnRsaWIuc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L2ZvcnVtLz9ncm91cF9pZD0xMjM3NjQiPkZvcnVtPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlN1cnJvdW5kIFNDTSI+CisKKyAgICAgICAgIDxwPlRoZXNlIGFyZSB0YXNrcyB0aGF0IGFsbG93IHVzZXJzIHRvIGFjY2VzcyBTdXJyb3VuZCBTQ00KKyAgICAgICAgIGZ1bmN0aW9uYWxpdHkgZnJvbSB3aXRoaW4gQW50IGJ1aWxkIHNjcmlwdHMuPC9wPgorCisgICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS41IGFuZCBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5zZWFwaW5lLmNvbS9zY21yZXNvdXJjZXMucGhwI2ludGVncmF0aW9uIj4KKyAgICAgICAgICAgIFN1cnJvdW5kIFNDTSBSZXNvdXJjZSBDZW50ZXI8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOnN1cHBvcnRAc2VhcGluZS5jb20iPlNlYXBpbmUgU3VwcG9ydDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5HTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICA8L3NlY3Rpb24+CisKKyAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3RydW5rL3hkb2NzL2ZhcS54bWwgYi90cnVuay94ZG9jcy9mYXEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTc0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9mYXEueG1sCkBAIC0wLDAgKzEsMTgzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iYm9kZXdpZ0BhcGFjaGUub3JnIj5TdGVmYW4gQm9kZXdpZzwvYXV0aG9yPgorICAgIDx0aXRsZT5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworICA8ZmFxc2VjdGlvbiB0aXRsZT0iQWJvdXQgdGhpcyBGQVEiPgorICAgIDxmYXEgaWQ9ImxhdGVzdC12ZXJzaW9uIj4KKyAgICAgIDxxdWVzdGlvbj5XaGVyZSBkbyBJIGZpbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgZG9jdW1lbnQ/PC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPlRoZSBsYXRlc3QgdmVyc2lvbiBjYW4gYWx3YXlzIGJlIGZvdW5kIGF0IEFudCZhcG9zO3MgaG9tZXBhZ2UKKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbDwvYT4uPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJhZGRpbmctZmFxcyI+CisgICAgICA8cXVlc3Rpb24+SG93IGNhbiBJIGNvbnRyaWJ1dGUgdG8gdGhpcyBGQVE/PC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPlRoZSBwYWdlIHlvdSBhcmUgbG9va2luZyBpdCBpcyBnZW5lcmF0ZWQgZnJvbQorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2NvcmUvdHJ1bmsveGRvY3MvZmFxLnhtbCI+dGhpczwvYT4KKyAgICAgICAgICBkb2N1bWVudC4gIElmIHlvdSB3YW50IHRvIGFkZCBhIG5ldyBxdWVzdGlvbiwgcGxlYXNlIHN1Ym1pdAorICAgICAgICAgIGEgcGF0Y2ggYWdhaW5zdCB0aGlzIGRvY3VtZW50IHRvIG9uZSBvZiBBbnQmYXBvcztzIG1haWxpbmcgbGlzdHM7CisgICAgICAgICAgaG9wZWZ1bGx5LCB0aGUgc3RydWN0dXJlIGlzIHNlbGYtZXhwbGFuYXRvcnkuPC9wPgorCisgICAgICAgIDxwPklmIHlvdSBkb24mYXBvczt0IGtub3cgaG93IHRvIGNyZWF0ZSBhIHBhdGNoLCBzZWUgdGhlIHBhdGNoZXMKKyAgICAgICAgICBzZWN0aW9uIG9mIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9zb3VyY2UuaHRtbCI+dGhpcworICAgICAgICAgIHBhZ2U8L2E+LjwvcD4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0iY3JlYXRpbmctZmFxIj4KKyAgICAgIDxxdWVzdGlvbj5Ib3cgZG8geW91IGNyZWF0ZSB0aGUgSFRNTCB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgRkFRPzwvcXVlc3Rpb24+CisKKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPldlIHVzZQorICAgICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3ZlbG9jaXR5L2FuYWtpYS5odG1sIj5BbmFraWE8L2E+CisgICAgICAgIHRvIHJlbmRlciB0aGUgSFRNTCB2ZXJzaW9uIGZyb20gdGhlIG9yaWdpbmFsIFhNTCBmaWxlLjwvcD4KKworICAgICAgICA8cD5UaGUgVmVsb2NpdHkgc3R5bGVzaGVldHMgdXNlZCB0byBwcm9jZXNzIHRoZSBYTUwgZmlsZXMgY2FuCisgICAgICAgIGJlIGZvdW5kIGluIHRoZSA8Y29kZT54ZG9jcy9zdHlsZXNoZWV0czwvY29kZT4gc3ViZGlyZWN0b3J5IG9mCisgICAgICAgIEFudCZhcG9zO3MgU1ZOIHJlcG9zaXRvcnkgLSB0aGUgYnVpbGQgZmlsZQorICAgICAgICA8Y29kZT5kb2NzLnhtbDwvY29kZT4gYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgYW50IFNWTgorICAgICAgICBtb2R1bGUgKHRydW5rKSBpcyB1c2VkIHRvIGRyaXZlIEFuYWtpYS48L3A+CisKKyAgICAgICAgPHA+VGhpcyBmaWxlIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSB0aGUKKyAgICAgICAgPGNvZGU+amFrYXJ0YS1zaXRlMjwvY29kZT4gQ1ZTIG1vZHVsZSBjaGVja2VkIG91dCBhcyB3ZWxsLCBidXQKKyAgICAgICAgaWYgeW91IGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb24gZnJvbSBBbmFraWEmYXBvcztzIGhvbWVwYWdlLCB5b3UKKyAgICAgICAgc2hvdWxkIGdldCBpdCB0byB3b3JrIHdpdGhvdXQgdGhhdC4gIEp1c3QgbWFrZSBzdXJlIGFsbAorICAgICAgICByZXF1aXJlZCBqYXJzIGFyZSBpbiB0aGUgdGFzayZhcG9zO3MgY2xhc3NwYXRoLjwvcD4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgIDwvZmFxc2VjdGlvbj4KKworICA8ZmFxc2VjdGlvbiB0aXRsZT0iR2VuZXJhbCI+CisgICAgPGZhcSBpZD0id2hhdC1pcy1hbnQiPgorICAgICAgPHF1ZXN0aW9uPldoYXQgaXMgQXBhY2hlIEFudD88L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHA+IEFudCBpcyBhIEphdmEtYmFzZWQgYnVpbGQgdG9vbC4gSW4gdGhlb3J5LCBpdCBpcyBraW5kIG9mCisgICAgICAgIGxpa2UgTWFrZSwgd2l0aG91dCBNYWtlJmFwb3M7cyB3cmlua2xlcyBhbmQgd2l0aCB0aGUgZnVsbAorICAgICAgICBwb3J0YWJpbGl0eSBvZiBwdXJlIEphdmEgY29kZS48L3A+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9ImFudC1uYW1lIj4KKyAgICAgIDxxdWVzdGlvbj5XaHkgZG8geW91IGNhbGwgaXQgQW50PzwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPkFjY29yZGluZyB0byBBbnQmYXBvcztzIG9yaWdpbmFsIGF1dGhvciwgSmFtZXMgRHVuY2FuCisgICAgICAgIERhdmlkc29uLCB0aGUgbmFtZSBpcyBhbiBhY3JvbnltIGZvciAmcXVvdDtBbm90aGVyIE5lYXQKKyAgICAgICAgVG9vbCZxdW90Oy48L3A+CisKKyAgICAgICAgPHA+TGF0ZXIgZXhwbGFuYXRpb25zIGdvIGFsb25nIHRoZSBsaW5lcyBvZiAmcXVvdDthbnRzCisgICAgICAgIGRvIGFuIGV4dHJlbWVseSBnb29kIGpvYiBhdCBidWlsZGluZyB0aGluZ3MmcXVvdDssIG9yCisgICAgICAgICZxdW90O2FudHMgYXJlIHZlcnkgc21hbGwgYW5kIGNhbiBjYXJyeSBhIHdlaWdodCBkb3plbnMgb2YgdGltZXMKKyAgICAgICAgdGhlaXIgb3duJnF1b3Q7IC0gZGVzY3JpYmluZyB3aGF0IEFudCBpcyBpbnRlbmRlZCB0bworICAgICAgICBiZS48L3A+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9Imhpc3RvcnkiPgorICAgICAgPHF1ZXN0aW9uPlRlbGwgdXMgYSBsaXR0bGUgYml0IGFib3V0IEFudCZhcG9zO3MgaGlzdG9yeS48L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKworICAgICAgICA8cD5Jbml0aWFsbHksIEFudCB3YXMgcGFydCBvZiB0aGUgVG9tY2F0IGNvZGUgYmFzZSwgd2hlbiBpdCB3YXMKKyAgICAgICAgZG9uYXRlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEl0IHdhcworICAgICAgICBjcmVhdGVkIGJ5IEphbWVzIER1bmNhbiBEYXZpZHNvbiwgd2hvIGlzIGFsc28gdGhlIG9yaWdpbmFsCisgICAgICAgIGF1dGhvciBvZiBUb21jYXQuIEFudCB3YXMgdGhlcmUgdG8gYnVpbGQgVG9tY2F0LCBub3RoaW5nCisgICAgICAgIGVsc2UuPC9wPgorCisgICAgICAgIDxwPlNvb24gdGhlcmVhZnRlciwgc2V2ZXJhbCBvcGVuIHNvdXJjZSBKYXZhIHByb2plY3RzIHJlYWxpemVkCisgICAgICAgIHRoYXQgQW50IGNvdWxkIHNvbHZlIHRoZSBwcm9ibGVtcyB0aGV5IGhhZCB3aXRoIE1ha2VmaWxlcy4KKyAgICAgICAgU3RhcnRpbmcgd2l0aCB0aGUgcHJvamVjdHMgaG9zdGVkIGF0IEpha2FydGEgYW5kIHRoZSBvbGQgSmF2YQorICAgICAgICBBcGFjaGUgcHJvamVjdCwgQW50IHNwcmVhZCBsaWtlIGEgdmlydXMgYW5kIGlzIG5vdyB0aGUgYnVpbGQKKyAgICAgICAgdG9vbCBvZiBjaG9pY2UgZm9yIGEgbG90IG9mIHByb2plY3RzLjwvcD4KKworICAgICAgICA8cD5JbiBKYW51YXJ5IDIwMDAsIEFudCB3YXMgbW92ZWQgdG8gYSBzZXBhcmF0ZSBDVlMgbW9kdWxlIGFuZAorICAgICAgICB3YXMgcHJvbW90ZWQgdG8gYSBwcm9qZWN0IG9mIGl0cyBvd24sIGluZGVwZW5kZW50IG9mCisgICAgICAgIFRvbWNhdCwgYW5kIGJlY2FtZSBBcGFjaGUgQW50LjwvcD4KKworICAgICAgICA8cD5UaGUgZmlyc3QgdmVyc2lvbiBvZiBBbnQgdGhhdCB3YXMgZXhwb3NlZCB0byBhIGxhcmdlciBhdWRpZW5jZQorICAgICAgICB3YXMgdGhlIG9uZSB0aGF0IHNoaXBwZWQgd2l0aCBUb21jYXQmYXBvcztzIDMuMSByZWxlYXNlIG9uIDE5IEFwcmlsCisgICAgICAgIDIwMDAuICBUaGlzIHZlcnNpb24gaGFzIGxhdGVyIGJlZW4gcmVmZXJyZWQgdG8gYXMgQW50CisgICAgICAgIDAuMy4xLjwvcD4KKworICAgICAgICA8cD5UaGUgZmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZSBvZiBBbnQgYXMgYSBzdGFuZC1hbG9uZSBwcm9kdWN0IHdhcworICAgICAgICBBbnQgMS4xLCByZWxlYXNlZCBvbiAxOSBKdWx5IDIwMDAuICBUaGUgY29tcGxldGUgcmVsZWFzZQorICAgICAgICBoaXN0b3J5OjwvcD4KKworICAgICAgICA8dGFibGU+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkFudCBWZXJzaW9uPC90aD4KKyAgICAgICAgICAgIDx0aD5SZWxlYXNlIERhdGU8L3RoPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS4xPC90ZD4KKyAgICAgICAgICAgIDx0ZD4xOSBKdWx5IDIwMDA8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS4yPC90ZD4KKyAgICAgICAgICAgIDx0ZD4yNCBPY3RvYmVyIDIwMDA8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS4zPC90ZD4KKyAgICAgICAgICAgIDx0ZD4zIE1hcmNoIDIwMDE8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS40PC90ZD4KKyAgICAgICAgICAgIDx0ZD4zIFNlcHRlbWJlciAyMDAxPC90ZD4KKyAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPjEuNC4xPC90ZD4KKyAgICAgICAgICAgIDx0ZD4xMSBPY3RvYmVyIDIwMDE8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS41PC90ZD4KKyAgICAgICAgICAgIDx0ZD4xMCBKdWx5IDIwMDI8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS41LjE8L3RkPgorICAgICAgICAgICAgPHRkPjMgT2N0b2JlciAyMDAyPC90ZD4KKyAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPjEuNS4yPC90ZD4KKyAgICAgICAgICAgIDx0ZD4zIE1hcmNoIDIwMDM8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS41LjM8L3RkPgorICAgICAgICAgICAgPHRkPjkgQXByaWwgMjAwMzwvdGQ+CisgICAgICAgICAgPC90cj4KKworICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4xLjUuNDwvdGQ+CisgICAgICAgICAgICA8dGQ+MTIgQXVndXN0IDIwMDM8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS42LjA8L3RkPgorICAgICAgICAgICAgPHRkPjE4IERlY2VtYmVyIDIwMDM8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS42LjE8L3RkPgorICAgICAgICAgICAgPHRkPjEyIEZlYnJ1YXJ5IDIwMDQ8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS42LjI8L3RkPgorICAgICAgICAgICAgPHRkPjE2IEp1bHkgMjAwNDwvdGQ+CisgICAgICAgICAgPC90cj4KKworICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4xLjYuMzwvdGQ+CisgICAgICAgICAgICA8dGQ+MjggQXByaWwgMjAwNTwvdGQ+CisgICAgICAgICAgPC90cj4KKworICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4xLjYuNDwvdGQ+CisgICAgICAgICAgICA8dGQ+MTkgTWF5IDIwMDU8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+MS42LjU8L3RkPgorICAgICAgICAgICAgPHRkPjIgSnVuZSAyMDA1PC90ZD4KKyAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPjEuNy4wPC90ZD4KKyAgICAgICAgICAgIDx0ZD4xOSBEZWNlbWJlciAyMDA2PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgPC9mYXFzZWN0aW9uPgorCisgIDxmYXFzZWN0aW9uIHRpdGxlPSJJbnN0YWxsYXRpb24iPgorICAgIDxmYXEgaWQ9Im5vLWdudS10YXIiPgorICAgICAgPHF1ZXN0aW9uPkkgZ2V0IGNoZWNrc3VtIGVycm9ycyB3aGVuIEkgdHJ5IHRvIGV4dHJhY3QgdGhlCisgICAgICA8Y29kZT50YXIuZ3o8L2NvZGU+IGRpc3RyaWJ1dGlvbiBmaWxlLiBXaHk/PC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPkFudCZhcG9zO3MgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIGZpbGUgbmFtZXMgdGhhdCBhcmUgbG9uZ2VyCisgICAgICAgIHRoYW4gMTAwIGNoYXJhY3RlcnMsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YW5kYXJkCisgICAgICAgIHRhciBmaWxlIGZvcm1hdC4gU2V2ZXJhbCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRhciB1c2UKKyAgICAgICAgZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgd2F5cyB0byB3b3JrIGFyb3VuZCB0aGlzCisgICAgICAgIHJlc3RyaWN0aW9uLjwvcD4KKworICAgICAgICA8cD5BbnQmYXBvcztzICZsdDt0YXImZ3Q7IHRhc2sgY2FuIGNyZWF0ZSB0YXIgYXJjaGl2ZXMgdGhhdCB1c2UKKyAgICAgICAgdGhlIEdOVSB0YXIgZXh0ZW5zaW9uLCBhbmQgdGhpcyBoYXMgYmVlbiB1c2VkIHdoZW4gcHV0dGluZworICAgICAgICB0b2dldGhlciB0aGUgZGlzdHJpYnV0aW9uLiBJZiB5b3UgYXJlIHVzaW5nIGEgZGlmZmVyZW50CisgICAgICAgIHZlcnNpb24gb2YgdGFyIChmb3IgZXhhbXBsZSwgdGhlIG9uZSBzaGlwcGluZyB3aXRoIFNvbGFyaXMpLAorICAgICAgICB5b3UgY2Fubm90IHVzZSBpdCB0byBleHRyYWN0IHRoZSBhcmNoaXZlLjwvcD4KKworICAgICAgICA8cD5UaGUgc29sdXRpb24gaXMgdG8gZWl0aGVyIGluc3RhbGwgR05VIHRhciwgd2hpY2ggY2FuIGJlCisgICAgICAgIGZvdW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90YXIvdGFyLmh0bWwiPmhlcmU8L2E+LAorICAgICAgICBvciB1c2UgdGhlIHppcCBhcmNoaXZlIGluc3RlYWQgKHlvdSBjYW4gZXh0cmFjdCBpdCB1c2luZworICAgICAgICA8Y29kZT5qYXIgeGY8L2NvZGU+KS48L3A+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9IlJlZEhhdF9FU18zIj4KKyAgICAgIDxxdWVzdGlvbj5Ib3cgZG8geW91IGdldCBhbnQtMS42LnggKG9yIGFueSB2ZXJzaW9uIGxhdGVyIHRoYW4KKyAgICAgIDEuNS4yKSB0byB3b3JrIG9uIG9uIFJlZEhhdCBFUyAzPzwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cD5SZWRoYXQgRVMgMy4wIGNvbWVzIGluc3RhbGxlZCB3aXRoIGFudCAxLjUuMi4gRXZlbiBpZiB5b3UKKyAgICAgICAgaGF2ZSB5b3VyIFBBVEggYW5kIEFOVF9IT01FIHZhcmlhYmxlcyBzZXQgY29ycmVjdGx5IHRvIGEgbGF0ZXIKKyAgICAgICAgdmVyc2lvbiBvZiBhbnQsIHlvdSB3aWxsIGFsd2F5cyBiZSBmb3JjZWQgdG8gdXNlIHRoZQorICAgICAgICBwcmVpbnN0YWxsZWQgdmVyc2lvbi48L3A+CisKKyAgICAgICAgPHA+VG8gdXNlIGEgbGF0ZXIgdmVyc2lvbiBvZiBhbnQgb24gdGhpcyBPUyB5b3UgY291bGQgZG8gdGhlCisgICAgICAgIGZvbGxvd2luZzo8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKyQgYW50IC12ZXJzaW9uCitBcGFjaGUgQW50IHZlcnNpb24gMS41LjItMjMgY29tcGlsZWQgb24gTm92ZW1iZXIgMTIgMjAwMworJCBzdSAtCisjIHJwbSAtZSBhbnQgYW50LWxpYnMKKyMgZXhpdAorJCBoYXNoIC1yCiskIGFudCAtdmVyc2lvbgorQXBhY2hlIEFudCB2ZXJzaW9uIDEuNi4yIGNvbXBpbGVkIG9uIEp1bHkgMTYgMjAwNAorXV0+PC9zb3VyY2U+PC9hbnN3ZXI+CisgICAgPC9mYXE+CisgIDwvZmFxc2VjdGlvbj4KKworICA8ZmFxc2VjdGlvbiB0aXRsZT0iSG93IGRvIEkgLi4uIj4KKyAgICA8ZmFxIGlkPSJpbXBsZW1lbnQtb3Mtc3BlY2lmaWMtY29uZmlndXJhdGlvbiI+CisgICAgICA8cXVlc3Rpb24+SG93IGRvIEkgcmVhbGl6ZSBvcy0tc3BlY2lmaWMgY29uZmlndXJhdGlvbnM/PC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPlRoZSBjb3JlIGlkZWEgaXMgdXNpbmcgcHJvcGVydHkgZmlsZXMgd2hpY2ggbmFtZSBhY2NvcmRzIHRvIHRoZQorICAgICAgICBvcy1uYW1lLiBUaGVuIHNpbXBseSB1c2UgdGhlIGJ1aWxkLWluIHByb3BlcnR5IDx0dD5vcy5uYW1lPC90dD4uPC9wPgorICAgICAgICA8cD5Gb3IgYmV0dGVyIHVzZSB5b3Ugc2hvdWxkIGFsc28gcHJvdmlkZSBhIGZpbGUgd2l0aCBkZWZhdWwgdmFsdWVzLgorICAgICAgICBCdXQgYmUgY2FyZWZ1bCB3aXRoIHRoZSBjb3JyZWN0IG9zLW5hbWVzLiBGb3IgdGVzdCBzaW1wbHkgJmx0O2VjaG8mZ3Q7CisgICAgICAgIHRoZSAke29zLm5hbWV9IG9uIGFsbCBtYWNoaW5lcyBhbmQgeW91IGNhbiBiZSBzdXJlIHRvIHVzZSB0aGUgcmlnaHQKKyAgICAgICAgZmlsZSBuYW1lcy48L3A+CisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgICAgICAgPHByb3BlcnR5IGZpbGU9IiR7b3MubmFtZX0ucHJvcGVydGllcyIvPgorICAgICAgICAgIDxwcm9wZXJ0eSBmaWxlPSJkZWZhdWx0LnByb3BlcnRpZXMiLz4KK11dPjwvc291cmNlPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKworICAgIDxmYXEgaWQ9ImFkZGluZy1leHRlcm5hbC10YXNrcyI+CisgICAgICA8cXVlc3Rpb24+SG93IGRvIEkgYWRkIGFuIGV4dGVybmFsIHRhc2sgdGhhdCBJJmFwb3M7dmUgd3JpdHRlbiB0byB0aGUKKyAgICAgIHBhZ2UgJnF1b3Q7RXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzJnF1b3Q7PzwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPkpvaW4gYW5kIHBvc3QgYSBtZXNzYWdlIHRvIHRoZSBkZXYgb3IgdXNlciBtYWlsaW5nCisgICAgICAgIGxpc3QgKG9uZSBsaXN0IGlzIGVub3VnaCksIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nCisgICAgICAgIGluZm9ybWF0aW9uOjwvcD4KKworICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPnRoZSBuYW1lIG9mIHRoZSB0YXNrL3Rvb2w8L2xpPgorICAgICAgICAgIDxsaT5hIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSB0YXNrL3Rvb2w8L2xpPgorICAgICAgICAgIDxsaT5hIENvbXBhdGliaWxpdHk6IGVudHJ5IHN0YXRpbmcgd2l0aCB3aGljaCB2ZXJzaW9uKHMpIG9mCisgICAgICAgICAgQW50IHRoZSB0b29sL3Rhc2sgaXMgY29tcGF0aWJsZSB0bzwvbGk+CisgICAgICAgICAgPGxpPmEgVVJMOiBlbnRyeSBsaW5raW5nIHRvIHRoZSBtYWluIHBhZ2Ugb2YgdGhlIHRvb2wvdGFzazwvbGk+CisgICAgICAgICAgPGxpPmEgQ29udGFjdDogZW50cnkgY29udGFpbmluZyB0aGUgZW1haWwgYWRkcmVzcyBvciB0aGUgVVJMCisgICAgICAgICAgb2YgYSB3ZWJwYWdlIGZvciB0aGUgcGVyc29uIG9yIGxpc3QgdG8gY29udGFjdCBmb3IgaXNzdWVzCisgICAgICAgICAgcmVsYXRlZCB0byB0aGUgdG9vbC90YXNrLiAgPHN0cm9uZz5Ob3RlIHRoYXQgd2UmYXBvcztsbCBhZGQgYQorICAgICAgICAgIGxpbmsgb24gdGhlIHBhZ2UsIHNvIGFueSBlbWFpbCBhZGRyZXNzIGFkZGVkIHRoZXJlIGlzIG5vdAorICAgICAgICAgIG9iZnVzY2F0ZWQgYW5kIGNhbiAoYW5kIHByb2JhYmx5IHdpbGwpIGJlIGFidXNlZCBieSByb2JvdHMKKyAgICAgICAgICBoYXJ2ZXN0aW5nIHdlYnNpdGVzIGZvciBhZGRyZXNzZXMgdG8gc3BhbS48L3N0cm9uZz48L2xpPgorICAgICAgICAgIDxsaT5hIExpY2Vuc2U6IGVudHJ5IGNvbnRhaW5pbmcgdGhlIHR5cGUgb2YgbGljZW5zZSBmb3IgdGhlCisgICAgICAgICAgdG9vbC90YXNrPC9saT4KKyAgICAgICAgPC91bD4KKworICAgICAgICA8cD5UaGUgcHJlZmVycmVkIGZvcm1hdCBmb3IgdGhpcyBpbmZvcm1hdGlvbiBpcyBhIHBhdGNoIHRvIDxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2NvcmUvdHJ1bmsveGRvY3MvZXh0ZXJuYWwueG1sIj50aGlzPC9hPgorICAgICAgICBkb2N1bWVudC48L3A+CisKKyAgICAgICAgPHA+SWYgeW91IGhhdmUgd3JpdHRlbiBzb21ldGhpbmcgYmlnZ2VyIHRoYW4gYSAnc2ltcGxlIHBsdWdpbicgdG8gQW50IGl0CisgICAgICAgIG1heSBiZSBiZXR0ZXIgdG8gYWRkIHRoZSBsaW5rIHRvIDxhIGhyZWY9InByb2plY3RzLmh0bWwiPnByb2plY3RzLmh0bWw8L2E+LgorICAgICAgICBUaGUgcHJvY2VkdXJlIHRvIGFkZCBpdCBpcyB0aGUgc2FtZS4gVGhlIGZpbGUgdG8gcGF0Y2ggaXMgPGEKKyAgICAgICAgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvY29yZS90cnVuay94ZG9jcy9wcm9qZWN0cy54bWwiPnRoaXM8L2E+CisgICAgICAgIGRvY3VtZW50LiBUaGUgc3ludGF4IG9mIHRoYXQgZmlsZSBpcyB0aGUgc2FtZS48L3A+CisKKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0iY3JlYXRlLWV4dGVuc2lvbnMiPgorICAgICAgPHF1ZXN0aW9uPkhvdyBkbyBJIGNyZWF0ZSBuZXcgdGFza3M/PC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPkFwYXJ0IGZyb20gYSBsb3Qgb2YgaW5mb3JtYXRpb24gb24gdXNpbmcgQW50LCB0aGUKKyAgICAgICAgPGEgaHJlZj0ibWFudWFsL2luZGV4Lmh0bWwiPk1hbnVhbDwvYT4gYWxzbyBjb250YWlucyBpbmZvcm1hdGlvbgorICAgICAgICBvbiBob3cgdG8gZXh0ZW5kIEFudCB3aXRoIG5ldyB0YXNrcy4gVGhpcyBpbmZvcm1hdGlvbgorICAgICAgICBjYW4gYmUgZm91bmQgdW5kZXIgJnF1b3Q7RGV2ZWxvcGluZyB3aXRoIEFudCZxdW90Oy48L3A+CisKKyAgICAgICAgPHA+Q2hhbmNlcyBhcmUgdGhhdCBzb21lb25lIGVsc2UgYWxyZWFkeSBjcmVhdGVkIHRoZSB0YXNrIHlvdQorICAgICAgICB3YW50IHRvIGNyZWF0ZSwgaXQgbWF5IGJlIHdpc2UgdG8gc2VlCisgICAgICAgIDxhIGhyZWY9ImV4dGVybmFsLmh0bWwiPkV4dGVybmFsIFRvb2xzIGFuZCBUYXNrczwvYT4gYW5kCisgICAgICAgIDxhIGhyZWY9InByb2plY3RzLmh0bWwiPlJlbGF0ZWQgUHJvamVjdHM8L2E+IGZpcnN0LjwvcD4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0icGFzc2luZy1jbGktYXJncyI+CisgICAgICA8cXVlc3Rpb24+SG93IGRvIEkgcGFzcyBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0byBteQorICAgICAgICBidWlsZCBmaWxlPzwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPlVzZSBwcm9wZXJ0aWVzLiBVc2luZyA8Y29kZT5hbnQKKyAgICAgICAgLUQ8ZW0+bmFtZTwvZW0+PTxlbT52YWx1ZTwvZW0+PC9jb2RlPiBsZXRzIHlvdSBkZWZpbmUgdmFsdWVzIGZvcgorICAgICAgICBwcm9wZXJ0aWVzIG9uIHRoZSBBbnQgY29tbWFuZCBsaW5lLiBUaGVzZSBwcm9wZXJ0aWVzIGNhbiB0aGVuIGJlCisgICAgICAgIHVzZWQgd2l0aGluIHlvdXIgYnVpbGQgZmlsZSBhcworICAgICAgICBhbnkgbm9ybWFsIHByb3BlcnR5OiA8Y29kZT4kezxlbT5uYW1lPC9lbT59PC9jb2RlPiB3aWxsIHB1dCBpbgorICAgICAgICA8Y29kZT48ZW0+dmFsdWU8L2VtPjwvY29kZT4uPC9wPgorCisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9Imppa2VzLXN3aXRjaGVzIj4KKyAgICAgIDxxdWVzdGlvbj5Ib3cgY2FuIEkgdXNlIEppa2VzLXNwZWNpZmljIGNvbW1hbmQtbGluZQorICAgICAgICBzd2l0Y2hlcz88L3F1ZXN0aW9uPgorCisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPkEgY291cGxlIG9mIHN3aXRjaGVzIGFyZSBzdXBwb3J0ZWQgdmlhICZxdW90O21hZ2ljJnF1b3Q7CisgICAgICAgICAgcHJvcGVydGllczo8L3A+CisKKyAgICAgICAgPHRhYmxlPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5zd2l0Y2g8L3RoPgorICAgICAgICAgICAgPHRoPnByb3BlcnR5PC90aD4KKyAgICAgICAgICAgIDx0aD5kZWZhdWx0PC90aD4KKyAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPitFPC90ZD4KKyAgICAgICAgICAgIDx0ZD5idWlsZC5jb21waWxlci5lbWFjczwvdGQ+CisgICAgICAgICAgICA8dGQ+ZmFsc2UgPT0gbm90IHNldDwvdGQ+CisgICAgICAgICAgPC90cj4KKworICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4rUDwvdGQ+CisgICAgICAgICAgICA8dGQ+YnVpbGQuY29tcGlsZXIucGVkYW50aWM8L3RkPgorICAgICAgICAgICAgPHRkPmZhbHNlID09IG5vdCBzZXQ8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+K0Y8L3RkPgorICAgICAgICAgICAgPHRkPmJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQ8L3RkPgorICAgICAgICAgICAgPHRkPmZhbHNlID09IG5vdCBzZXQ8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PHN0cm9uZz4oT25seSBmb3IgQW50ICZsdDsgMS40OyByZXBsYWNlZCBieSB0aGUKKyAgICAgICAgICAgICAgICA8Y29kZT48c3Ryb25nPm5vd2Fybjwvc3Ryb25nPjwvY29kZT4KKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPjxzdHJvbmc+Jmx0O2phdmFjJmd0Ozwvc3Ryb25nPjwvY29kZT4KKyAgICAgICAgICAgICAgICB0YXNrIGFmdGVyIHRoYXQuKTwvc3Ryb25nPjxicj48L2JyPi1ub3dhcm48L3RkPgorICAgICAgICAgICAgPHRkPmJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzPC90ZD4KKyAgICAgICAgICAgIDx0ZD50cnVlID09IG5vdCBzZXQ8L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgPC90YWJsZT4KKworICAgICAgICA8cD5XaXRoIEFudCAmZ3Q7PSAxLjUsIHlvdSBjYW4gYWxzbyB1c2UgbmVzdGVkCisgICAgICAgICAgPGNvZGU+Jmx0O2NvbXBpbGVyYXJnJmd0OzwvY29kZT4gZWxlbWVudHMgd2l0aCB0aGUKKyAgICAgICAgICA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrLjwvcD4KKworICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJzaGVsbC1yZWRpcmVjdC0xIj4KKyAgICAgIDxxdWVzdGlvbj5Ib3cgZG8gSSBpbmNsdWRlIGEgJmx0OyBjaGFyYWN0ZXIgaW4gbXkgY29tbWFuZC1saW5lIGFyZ3VtZW50cz88L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHA+VGhlIHNob3J0IGFuc3dlciBpcyAiVXNlOiA8Y29kZT4mYW1wO2x0OzwvY29kZT4iLjwvcD4KKworICAgICAgICA8cD5UaGUgbG9uZyBhbnN3ZXIgaXMgdGhhdCB0aGlzIHByb2JhYmx5IHdvbiZhcG9zO3QgZG8gd2hhdCB5b3UKKyAgICAgICAgd2FudCBhbnl3YXkgKHNlZSA8YSBocmVmPSIjc2hlbGwtcmVkaXJlY3QtMiI+dGhlIG5leHQKKyAgICAgICAgc2VjdGlvbjwvYT4pLjwvcD4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0ic2hlbGwtcmVkaXJlY3QtMiI+CisgICAgICA8cXVlc3Rpb24+SG93IGRvIEkgcmVkaXJlY3Qgc3RhbmRhcmQgaW5wdXQgb3Igc3RhbmRhcmQgb3V0cHV0CisgICAgICAgIGluIHRoZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRhc2s/PC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPlNheSB5b3Ugd2FudCB0byByZWRpcmVjdCB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSBvZiB0aGUKKyAgICAgICAgPGNvZGU+bTQ8L2NvZGU+IGNvbW1hbmQgdG8gd3JpdGUgdG8gYSBmaWxlLCBzb21ldGhpbmcKKyAgICAgICAgbGlrZTo8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKK3NoZWxsLXByb21wdD4gbTQgZm9vLm00ID4gZm9vCitdXT48L3NvdXJjZT4KKworICAgICAgICA8cD5hbmQgdHJ5IHRvIHRyYW5zbGF0ZSBpdCBpbnRvPC9wPgorCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8ZXhlYyBleGVjdXRhYmxlPSJtNCI+CisgIDxhcmcgdmFsdWU9ImZvby5tNCIvPgorICA8YXJnIHZhbHVlPSImZ3Q7Ii8+CisgIDxhcmcgdmFsdWU9ImZvbyIvPgorPC9leGVjPgorXV0+PC9zb3VyY2U+CisKKyAgICAgICAgPHA+VGhpcyB3aWxsIG5vdCBkbyB3aGF0IHlvdSBleHBlY3QuICBUaGUgb3V0cHV0IHJlZGlyZWN0aW9uIGlzCisgICAgICAgIHBlcmZvcm1lZCBieSB5b3VyIHNoZWxsLCBub3QgdGhlIGNvbW1hbmQgaXRzZWxmLCBzbyB0aGlzCisgICAgICAgIHNob3VsZCByZWFkOjwvcD4KKworICAgICAgICA8c291cmNlPjwhW0NEQVRBWworPGV4ZWMgZXhlY3V0YWJsZT0iL2Jpbi9zaCI+CisgIDxhcmcgdmFsdWU9Ii1jIiAvPgorICA8YXJnIHZhbHVlPSJtNCBmb28ubTQgJmd0OyBmb28iIC8+Cis8L2V4ZWM+CitdXT48L3NvdXJjZT4KKworICAgICAgICA8cD5Ob3RlIHRoYXQgeW91IG11c3QgdXNlIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gYXR0cmlidXRlIG9mCisgICAgICAgIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBpbiB0aGUgbGFzdCBlbGVtZW50LCBpbiBvcmRlciB0byBoYXZlCisgICAgICAgIHRoZSBjb21tYW5kIHBhc3NlZCBhcyBhIHNpbmdsZSwgcXVvdGVkIGFyZ3VtZW50LiBBbHRlcm5hdGl2ZWx5LAorICAgICAgICB5b3UgY2FuIHVzZTo8L3A+CisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8ZXhlYyBleGVjdXRhYmxlPSIvYmluL3NoIj4KKyAgPGFyZyBsaW5lPSctYyAibTQgZm9vLm00ICZndDsgZm9vIicvPgorPC9leGVjPgorXV0+PC9zb3VyY2U+CisKKyAgICAgICAgPHA+Tm90ZSB0aGUgZG91YmxlLXF1b3RlcyBuZXN0ZWQgaW5zaWRlIHRoZSBzaW5nbGUtcXVvdGVzLjwvcD4KKworICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJiYXRjaC1zaGVsbC1leGVjdXRlIj4KKyAgICAgIDxxdWVzdGlvbj5Ib3cgZG8gSSBleGVjdXRlIGEgYmF0Y2ggZmlsZSBvciBzaGVsbCBzY3JpcHQgZnJvbSBBbnQ/PC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisKKyAgICAgICAgPHA+T24gbmF0aXZlIFVuaXggc3lzdGVtcywgeW91IHNob3VsZCBiZSBhYmxlIHRvIHJ1biBzaGVsbCBzY3JpcHRzCisgICAgICAgICAgIGRpcmVjdGx5LiBPbiBzeXN0ZW1zIHJ1bm5pbmcgYSBVbml4LXR5cGUgc2hlbGwgKGZvciBleGFtcGxlLCBDeWd3aW4KKyAgICAgICAgICAgb24gV2luZG93cykgZXhlY3V0ZSB0aGUgKGNvbW1hbmQpIHNoZWxsIGluc3RlYWQgLSA8Y29kZT5jbWQ8L2NvZGU+CisgICAgICAgICAgIGZvciBiYXRjaCBmaWxlcywgPGNvZGU+c2g8L2NvZGU+IGZvciBzaGVsbCBzY3JpcHRzIC0gdGhlbiBwYXNzIHRoZQorICAgICAgICAgICBiYXRjaCBmaWxlIG9yIHNoZWxsIHNjcmlwdCAocGx1cyBhbnkgYXJndW1lbnRzIHRvIHRoZSBzY3JpcHQpCisgICAgICAgICAgIGFzIGEgc2luZ2xlIGNvbW1hbmQsIHVzaW5nIHRoZSA8Y29kZT4vYzwvY29kZT4gb3IKKyAgICAgICAgICAgPGNvZGU+LWM8L2NvZGU+IHN3aXRjaCwgcmVzcGVjdGl2ZWx5LiBTZWUKKyAgICAgICAgICAgPGEgaHJlZj0iI3NoZWxsLXJlZGlyZWN0LTIiPnRoZSBhYm92ZSBzZWN0aW9uPC9hPgorICAgICAgICAgICBmb3IgZXhhbXBsZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRhc2tzCisgICAgICAgICAgIGV4ZWN1dGluZyA8Y29kZT5zaDwvY29kZT4uIEZvciBiYXRjaCBmaWxlcywgdXNlIHNvbWV0aGluZyBsaWtlOjwvcD4KKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKzxleGVjIGRpcj0iLiIgZXhlY3V0YWJsZT0iY21kIiBvcz0iV2luZG93cyBOVCI+CisgIDxhcmcgbGluZT0iL2MgdGVzdC5iYXQiLz4KKzwvZXhlYz4KK11dPjwvc291cmNlPgorCisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9Im11bHRpLWNvbmRpdGlvbnMiPgorICAgICAgPHF1ZXN0aW9uPkkgd2FudCB0byBleGVjdXRlIGEgcGFydGljdWxhciB0YXJnZXQgb25seSBpZgorICAgICAgICBtdWx0aXBsZSBjb25kaXRpb25zIGFyZSB0cnVlLjwvcXVlc3Rpb24+CisKKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPlRoZXJlIGFyZSBhY3R1YWxseSBzZXZlcmFsIGFuc3dlcnMgdG8gdGhpcyBxdWVzdGlvbi48L3A+CisKKyAgICAgICAgPHA+SWYgeW91IGhhdmUgb25seSBvbmUgc2V0IGFuZCBvbmUgdW5zZXQgcHJvcGVydHkgdG8gdGVzdCwKKyAgICAgICAgeW91IGNhbiBzcGVjaWZ5IGJvdGggYW4gPGNvZGU+aWY8L2NvZGU+IGFuZCBhbiA8Y29kZT51bmxlc3M8L2NvZGU+CisgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIHRhcmdldCwgYW5kIHRoZXkgd2lsbCBhY3QgYXMgaWYgdGhleQorICAgICAgICBhcmUgJnF1b3Q7YW5kZWQmcXVvdDsgdG9nZXRoZXIuPC9wPgorCisgICAgICAgIDxwPklmIHlvdSBhcmUgdXNpbmcgYSB2ZXJzaW9uIG9mIEFudCAxLjMgb3IgZWFybGllciwgdGhlCisgICAgICAgIHdheSB0byB3b3JrIHdpdGggYWxsIG90aGVyIGNhc2VzIGlzIHRvIGNoYWluIHRhcmdldHMgdG9nZXRoZXIKKyAgICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBzdGF0ZSB5b3Ugd2FudCB0byB0ZXN0IGZvci48L3A+CisKKyAgICAgICAgPHA+VG8gc2VlIGhvdyB0aGlzIHdvcmtzLCBhc3N1bWUgeW91IGhhdmUgdGhyZWUgcHJvcGVydGllczoKKyAgICAgICAgPGNvZGU+cHJvcDE8L2NvZGU+LCA8Y29kZT5wcm9wMjwvY29kZT4sIGFuZCA8Y29kZT5wcm9wMzwvY29kZT4uCisgICAgICAgIFlvdSB3YW50IHRvIHRlc3QgdGhhdCA8Y29kZT5wcm9wMTwvY29kZT4gYW5kIDxjb2RlPnByb3AyPC9jb2RlPgorICAgICAgICBhcmUgc2V0LCBhbmQgdGhhdCA8Y29kZT5wcm9wMzwvY29kZT4gaXMgbm90LiBJZiB0aGUgY29uZGl0aW9uCisgICAgICAgIGhvbGRzIHRydWUgeW91IHdhbnQgdG8gZWNobyAmcXVvdDt5ZXMmcXVvdDsuPC9wPgorCisgICAgICAgIDxwPkhlcmUgaXMgdGhlIGltcGxlbWVudGF0aW9uIGluIEFudCAxLjMgYW5kIGVhcmxpZXI6PC9wPgorCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8dGFyZ2V0IG5hbWU9ImNvbmQiIGRlcGVuZHM9ImNvbmQtaWYiLz4KKworPHRhcmdldCBuYW1lPSJjb25kLWlmIiBpZj0icHJvcDEiPgorICA8YW50Y2FsbCB0YXJnZXQ9ImNvbmQtaWYtMiIvPgorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0iY29uZC1pZi0yIiBpZj0icHJvcDIiPgorICA8YW50Y2FsbCB0YXJnZXQ9ImNvbmQtaWYtMyIvPgorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0iY29uZC1pZi0zIiB1bmxlc3M9InByb3AzIj4KKyAgPGVjaG8gbWVzc2FnZT0ieWVzIi8+Cis8L3RhcmdldD4KK11dPjwvc291cmNlPgorCisgICAgICAgIDxwPk5vdGU6IDxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4gdGFza3MgZG8gPGVtPm5vdDwvZW0+IHBhc3MKKyAgICAgICAgcHJvcGVydHkgY2hhbmdlcyBiYWNrIHVwIHRvIHRoZSBlbnZpcm9ubWVudCB0aGV5IHdlcmUgY2FsbGVkCisgICAgICAgIGZyb20sIHNvIHlvdSB3b3VsZG4mYXBvczt0IGJlIGFibGUgdG8sIGZvciBleGFtcGxlLCBzZXQgYQorICAgICAgICA8Y29kZT5yZXN1bHQ8L2NvZGU+IHByb3BlcnR5IGluIHRoZSA8Y29kZT5jb25kLWlmLTM8L2NvZGU+IHRhcmdldCwKKyAgICAgICAgdGhlbiBkbworICAgICAgICA8Y29kZT4mbHQ7ZWNobyBtZXNzYWdlPSZxdW90O3Jlc3VsdCBpcyAke3Jlc3VsdH0mcXVvdDsvJmd0OzwvY29kZT4KKyAgICAgICAgaW4gdGhlIDxjb2RlPmNvbmQ8L2NvZGU+IHRhcmdldC48L3A+CisKKyAgICAgICAgPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS40LCB5b3UgY2FuIHVzZSB0aGUKKyAgICAgICAgPGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+IHRhc2suPC9wPgorCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8dGFyZ2V0IG5hbWU9ImNvbmQiIGRlcGVuZHM9ImNvbmQtaWYsY29uZC1lbHNlIi8+CisKKzx0YXJnZXQgbmFtZT0iY2hlY2stY29uZCI+CisgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbmQtaXMtdHJ1ZSI+CisgICAgPGFuZD4KKyAgICAgIDxub3Q+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtwcm9wMX0iIGFyZzI9IiQke3Byb3AxfSIgLz4KKyAgICAgIDwvbm90PgorICAgICAgPG5vdD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3Byb3AyfSIgYXJnMj0iJCR7cHJvcDJ9IiAvPgorICAgICAgPC9ub3Q+CisgICAgICA8ZXF1YWxzIGFyZzE9IiR7cHJvcDN9IiBhcmcyPSIkJHtwcm9wM30iIC8+CisgICAgPC9hbmQ+CisgIDwvY29uZGl0aW9uPgorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0iY29uZC1pZiIgZGVwZW5kcz0iY2hlY2stY29uZCIgaWY9ImNvbmQtaXMtdHJ1ZSI+CisgIDxlY2hvIG1lc3NhZ2U9InllcyIvPgorPC90YXJnZXQ+CisKKzx0YXJnZXQgbmFtZT0iY29uZC1lbHNlIiBkZXBlbmRzPSJjaGVjay1jb25kIiB1bmxlc3M9ImNvbmQtaXMtdHJ1ZSI+CisgIDxlY2hvIG1lc3NhZ2U9Im5vIi8+Cis8L3RhcmdldD4KK11dPjwvc291cmNlPgorCisgICAgICAgIDxwPlRoaXMgdmVyc2lvbiB0YWtlcyBhZHZhbnRhZ2Ugb2YgdHdvIHRoaW5nczo8L3A+CisKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5JZiBhIHByb3BlcnR5IDxjb2RlPmE8L2NvZGU+IGhhcyBub3QgYmVlbiBzZXQsCisgICAgICAgICAgPGNvZGU+JHthfTwvY29kZT4gd2lsbCBldmFsdWF0ZSB0byA8Y29kZT4ke2F9PC9jb2RlPi48L2xpPgorCisgICAgICAgICAgPGxpPlRvIGdldCBhIGxpdGVyYWwgPGNvZGU+JDwvY29kZT4gaW4gQW50LCB5b3UgaGF2ZSB0bworICAgICAgICAgIGVzY2FwZSBpdCB3aXRoIGFub3RoZXIgPGNvZGU+JDwvY29kZT4gLSB0aGlzIHdpbGwgYWxzbyBicmVhaworICAgICAgICAgIHRoZSBzcGVjaWFsIHRyZWF0bWVudCBvZiB0aGUgPGNvZGU+JHs8L2NvZGU+IHNlcXVlbmNlLjwvbGk+CisgICAgICAgIDwvdWw+CisKKyAgICAgICAgPHA+QmVjYXVzZSB0ZXN0aW5nIGZvciBhIGxpdGVyYWwgPGNvZGU+JHtwcm9wZXJ0eX08L2NvZGU+IHN0cmluZworICAgICAgICBpc24mYXBvczt0IGFsbCB0aGF0IHJlYWRhYmxlIG9yIGVhc3kgdG8gdW5kZXJzdGFuZCwKKyAgICAgICAgcG9zdC0xLjQuMSBBbnQgaW50cm9kdWNlcyB0aGUgPGNvZGU+Jmx0O2lzc2V0Jmd0OzwvY29kZT4gZWxlbWVudAorICAgICAgICB0byB0aGUgPGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+IHRhc2suPC9wPgorCisgICAgICAgIDxwPkhlcmUgaXMgdGhlIHByZXZpb3VzIGV4YW1wbGUgZG9uZSB1c2luZworICAgICAgICA8Y29kZT4mbHQ7aXNzZXQmZ3Q7PC9jb2RlPjo8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKzx0YXJnZXQgbmFtZT0iY2hlY2stY29uZCI+CisgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbmQtaXMtdHJ1ZSI+CisgICAgPGFuZD4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0icHJvcDEiLz4KKyAgICAgIDxpc3NldCBwcm9wZXJ0eT0icHJvcDIiLz4KKyAgICAgIDxub3Q+CisgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0icHJvcDMiLz4KKyAgICAgIDwvbm90PgorICAgIDwvYW5kPgorICA8L2NvbmRpdGlvbj4KKzwvdGFyZ2V0PgorXV0+PC9zb3VyY2U+CisKKyAgICAgICAgPHA+VGhlIGxhc3Qgb3B0aW9uIGlzIHRvIHVzZSBhIHNjcmlwdGluZyBsYW5ndWFnZSB0byBzZXQgdGhlCisgICAgICAgIHByb3BlcnRpZXMuIFRoaXMgY2FuIGJlIHBhcnRpY3VsYXJseSBoYW5keSB3aGVuIHlvdSBuZWVkIG11Y2gKKyAgICAgICAgZmluZXIgY29udHJvbCB0aGFuIHRoZSBzaW1wbGUgY29uZGl0aW9ucyBzaG93biBoZXJlIGJ1dCwgb2YKKyAgICAgICAgY291cnNlLCBjb21lcyB3aXRoIHRoZSBvdmVyaGVhZCBvZiBhZGRpbmcgSkFSIGZpbGVzIHRvIHN1cHBvcnQKKyAgICAgICAgdGhlIGxhbmd1YWdlLCB0byBzYXkgbm90aGluZyBvZiB0aGUgYWRkZWQgbWFpbnRlbmFuY2UgaW4gcmVxdWlyaW5nCisgICAgICAgIHR3byBsYW5ndWFnZXMgdG8gaW1wbGVtZW50IGEgc2luZ2xlIHN5c3RlbS4gU2VlIHRoZQorICAgICAgICA8YSBocmVmPSJtYW51YWwvT3B0aW9uYWxUYXNrcy9zY3JpcHQuaHRtbCI+CisgICAgICAgIDxjb2RlPiZsdDtzY3JpcHQmZ3Q7PC9jb2RlPiB0YXNrIGRvY3VtZW50YXRpb248L2E+IGZvciBtb3JlCisgICAgICAgIGRldGFpbHMuPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJlbmNvZGluZyI+CisgICAgICA8cXVlc3Rpb24+SG93IGNhbiBJIGluY2x1ZGUgbmF0aW9uYWwgY2hhcmFjdGVycyBsaWtlIEdlcm1hbgorICAgICAgICB1bWxhdXRzIGluIG15IGJ1aWxkIGZpbGU/PC9xdWVzdGlvbj4KKworICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHA+WW91IG5lZWQgdG8gdGVsbCB0aGUgWE1MIHBhcnNlciB3aGljaCBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgICAgeW91ciBidWlsZCBmaWxlIHVzZXMsIHRoaXMgaXMgZG9uZSBpbnNpZGUgdGhlIDxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLXhtbC0yMDAwMTAwNiNzZWMtcHJvbG9nLWR0ZCI+WE1MCisgICAgICAgIGRlY2xhcmF0aW9uPC9hPi48L3A+CisKKyAgICAgICAgPHA+QnkgZGVmYXVsdCB0aGUgcGFyc2VyIGFzc3VtZXMgeW91IGFyZSB1c2luZyB0aGUgVVRGLTgKKyAgICAgICAgZW5jb2RpbmcgaW5zdGVhZCBvZiB5b3VyIHBsYXRmb3JtJmFwb3M7cyBkZWZhdWx0LiAgRm9yIG1vc3QgV2VzdGVybgorICAgICAgICBFdXJvcGVhbiBjb3VudHJpZXMgeW91IHNob3VsZCBzZXQgdGhlIGVuY29kaW5nIHRvCisgICAgICAgIDxjb2RlPklTTy04ODU5LTE8L2NvZGU+LiAgVG8gZG8gc28sIG1ha2UgdGhlIHZlcnkgZmlyc3QgbGluZQorICAgICAgICBvZiB5b3UgYnVpbGQgZmlsZSByZWFkIGxpa2U8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CitdXT48L3NvdXJjZT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0idXNlLXppcC1pbnN0ZWFkLW9mLWphciI+CisgICAgICA8cXVlc3Rpb24+SG93IGRvIEkgdXNlIDxjb2RlPmphcjwvY29kZT4mYXBvcztzIDxjb2RlPk08L2NvZGU+IHN3aXRjaD8KKyAgICAgIEkgZG9uJmFwb3M7dCB3YW50IGEgTUFOSUZFU1QuPC9xdWVzdGlvbj4KKworICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHA+QSBKQVIgYXJjaGl2ZSBpcyBhIFpJUCBmaWxlLCBzbyBpZiB5b3UgZG9uJmFwb3M7dCB3YW50IGEKKyAgICAgICAgTUFOSUZFU1QgeW91IGNhbiBzaW1wbHkgdXNlIDxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPi48L3A+CisKKyAgICAgICAgPHA+SWYgeW91ciBmaWxlIG5hbWVzIGNvbnRhaW4gbmF0aW9uYWwgY2hhcmFjdGVycyB5b3Ugc2hvdWxkCisgICAgICAgIGtub3cgdGhhdCBTdW4mYXBvcztzIDxjb2RlPmphcjwvY29kZT4gdXRpbGl0eSBsaWtlIEFudCZhcG9zO3MKKyAgICAgICAgPGNvZGU+Jmx0O2phciZndDs8L2NvZGU+IHVzZXMgVVRGLTggdG8gZW5jb2RlIHRoZWlyIG5hbWVzIHdoaWxlCisgICAgICAgIDxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPiB1c2VzIHlvdXIgcGxhdGZvcm1zIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICAgIFVzZSB0aGUgZW5jb2RpbmcgYXR0cmlidXRlIG9mIDxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPiBpZgorICAgICAgICBuZWNlc3NhcnkuPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJwcm9wZXJ0eXZhbHVlLWFzLW5hbWUtZm9yLXByb3BlcnR5Ij4KKyAgICAgIDxxdWVzdGlvbj5Ib3cgY2FuIEkgZG8gc29tZXRoaW5nIGxpa2UgPGNvZGU+Jmx0O3Byb3BlcnR5IG5hbWU9InByb3AiCisgICAgICB2YWx1ZT0iJHske2Fub3RoZXJwcm9wfX0iLyZndDs8L2NvZGU+IChkb3VibGUgZXhwYW5kaW5nIHRoZSBwcm9wZXJ0eSk/PC9xdWVzdGlvbj4KKworICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHA+V2l0aG91dCBhbnkgZXh0ZXJuYWwgaGVscCB5b3UgY2FuIG5vdC48L3A+CisgICAgICAgIDxwPldpdGggJmx0O3NjcmlwdC8mZ3Q7LCB3aGljaCBuZWVkcyBleHRlcm5hbCBsaWJyYXJpZXMsIHlvdSBjYW4gZG88L3A+CisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICBwcm9wbmFtZSA9IHByb2plY3QuZ2V0UHJvcGVydHkoImFub3RoZXJwcm9wIik7CisgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgicHJvcCIsIHByb3BuYW1lKTsKKzwvc2NyaXB0PgorXV0+PC9zb3VyY2U+CisgICAgICAgICA8cD5XaXRoIEFudENvbnRyaWIgKGV4dGVybmFsIHRhc2sgbGlicmFyeSkgeW91IGNhbiBkbyA8Y29kZT4KKyAgICAgICAgICZsdDtwcm9wZXJ0eWNvcHkgbmFtZT0icHJvcCIgZnJvbT0iJHthbm90aGVycHJvcH0iLyZndDs8L2NvZGU+LjwvcD4KKyAgICAgICAgIDxwPldpdGggQW50IDEuNiB5b3UgY2FuIHNpbXVsYXRlIHRoZSBBbnRDb250cmlicyAmbHQ7cHJvcGVydHljb3B5Jmd0OworICAgICAgICAgYW5kIGF2b2lkIHRoZSBuZWVkIG9mIGFuIGV4dGVybmFsIGxpYnJhcnk6PC9wPgorICAgICAgICA8c291cmNlPjwhW0NEQVRBWworPG1hY3JvZGVmIG5hbWU9InByb3BlcnR5Y29weSI+CisgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICA8YXR0cmlidXRlIG5hbWU9ImZyb20iLz4KKyAgPHNlcXVlbnRpYWw+CisgICAgPHByb3BlcnR5IG5hbWU9IkB7bmFtZX0iIHZhbHVlPSIke0B7ZnJvbX19Ii8+CisgIDwvc2VxdWVudGlhbD4KKzwvbWFjcm9kZWY+CitdXT48L3NvdXJjZT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0iZGVsZXRlLWRpcmVjdG9yeS1jaGlsZHJlbi1vbmx5Ij4KKyAgICAgIDxxdWVzdGlvbj5Ib3cgY2FuIEkgZGVsZXRlIGV2ZXJ5dGhpbmcgYmVuZWF0aCBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5LAorICAgIHByZXNlcnZpbmcgdGhlIGRpcmVjdG9yeSBpdHNlbGY/PC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+Cis8cD5Nb3N0IHVzZXJzIHdobyBnbyBkb3duIHRoaXMgcGF0aCBoYXZlIG5vIHByb2JsZW0gZmlndXJpbmcgb3V0IHRoYXQKKyAgPGNvZGU+Jmx0O2RlbGV0ZSBpbmNsdWRlZW1wdHlkaXJzPSJ0cnVlIiAvJmd0OzwvY29kZT4gd2lsbCBoZWxwIHRoZW0uICBUaGUKKyAgc2VlbWluZ2x5IHRyaWNreSBwYXJ0IGlzIHByZXNlcnZpbmcgdGhlIGJhc2UgZGlyZWN0b3J5IGl0c2VsZiwKKyAgd2hpY2ggQW50IGluY2x1ZGVzIGluIHRoZSBkaXJlY3Rvcnkgc2Nhbi4gRm9ydHVuYXRlbHkgdGhlIGFuc3dlciBpcyBzaW1wbGU6Cis8L3A+CisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8ZGVsZXRlIGluY2x1ZGVlbXB0eWRpcnM9InRydWUiPgorICA8ZmlsZXNldCBkaXI9ImRpcnRva2VlcCIgaW5jbHVkZXM9IioqLyoiIC8+Cis8L2RlbGV0ZT4KK11dPjwvc291cmNlPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisgIDwvZmFxc2VjdGlvbj4KKworICA8ZmFxc2VjdGlvbiB0aXRsZT0iSXQgZG9lc24mYXBvczt0IHdvcmsgKGFzIGV4cGVjdGVkKSI+CisgICAgPGZhcSBpZD0iZ2VuZXJhbC1hZHZpY2UiPgorICAgICAgPHF1ZXN0aW9uPkdlbmVyYWwgQWR2aWNlPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisKKyAgICAgICAgPHA+VGhlcmUgYXJlIG1hbnkgcmVhc29ucyB3aHkgQW50IGRvZXNuJmFwb3M7dCBiZWhhdmUgYXMKKyAgICAgICAgZXhwZWN0ZWQsIG5vdCBhbGwgb2YgdGhlbSBhcmUgZHVlIHRvIEFudCBidWdzLiAgU2VlIG91ciA8YQorICAgICAgICBocmVmPSJwcm9ibGVtcy5odG1sIj5IYXZpbmcgUHJvYmxlbXM/PC9hPiBwYWdlIGZvciBoaW50cyB0aGF0CisgICAgICAgIG1heSBoZWxwIHBpbm5pbmcgZG93biB0aGUgcmVhc29ucyBmb3IgeW91ciBwcm9ibGVtLjwvcD4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0iYWx3YXlzLXJlY29tcGlsZXMiPgorICAgICAgPHF1ZXN0aW9uPldoeSBkb2VzIEFudCBhbHdheXMgcmVjb21waWxlIGFsbCBteSBKYXZhIGZpbGVzPzwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPkluIG9yZGVyIHRvIGZpbmQgb3V0IHdoaWNoIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZCwgQW50CisgICAgICAgIGNvbXBhcmVzIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSBzb3VyY2UgZmlsZXMgdG8gdGhvc2Ugb2YgdGhlCisgICAgICAgIHJlc3VsdGluZyA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzLiAgT3BlbmluZyBhbGwgc291cmNlIGZpbGVzCisgICAgICAgIHRvIGZpbmQgb3V0IHdoaWNoIHBhY2thZ2UgdGhleSBiZWxvbmcgdG8gd291bGQgYmUgdmVyeQorICAgICAgICBpbmVmZmljaWVudC4gSW5zdGVhZCwgQW50IGV4cGVjdHMgeW91IHRvIHBsYWNlIHlvdXIKKyAgICAgICAgc291cmNlIGZpbGVzIGluIGEgZGlyZWN0b3J5IGhpZXJhcmNoeSB0aGF0IG1pcnJvcnMgeW91cgorICAgICAgICBwYWNrYWdlIGhpZXJhcmNoeSBhbmQgdG8gcG9pbnQgQW50IHRvIHRoZSByb290IG9mIHRoaXMKKyAgICAgICAgZGlyZWN0b3J5IHRyZWUgd2l0aCB0aGUgPGNvZGU+c3JjZGlyPC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgorCisgICAgICAgIDxwPlNheSB5b3UgaGF2ZSA8Y29kZT4mbHQ7amF2YWMgc3JjZGlyPSZxdW90O3NyYyZxdW90OworICAgICAgICBkZXN0ZGlyPSZxdW90O2Rlc3QmcXVvdDsvJmd0OzwvY29kZT4uICBJZiBBbnQgZmluZHMgYSBmaWxlCisgICAgICAgIDxjb2RlPnNyYy9hL2IvQy5qYXZhPC9jb2RlPiwgaXQgZXhwZWN0cyBpdCB0byBiZSBpbiBwYWNrYWdlCisgICAgICAgIDxjb2RlPmEuYjwvY29kZT4gc28gdGhhdCB0aGUgcmVzdWx0aW5nIDxjb2RlPi5jbGFzczwvY29kZT4KKyAgICAgICAgZmlsZSBpcyBnb2luZyB0byBiZSA8Y29kZT5kZXN0L2EvYi9DLmNsYXNzPC9jb2RlPi48L3A+CisKKyAgICAgICAgPHA+SWYgeW91ciBzb3VyY2UtdHJlZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGRvZXMgbm90IG1hdGNoIHlvdXIKKyAgICAgICAgcGFja2FnZSBzdHJ1Y3R1cmUsIEFudCZhcG9zO3MgaGV1cmlzdGljIHdvbiZhcG9zO3Qgd29yaywgYW5kCisgICAgICAgIGl0IHdpbGwgcmVjb21waWxlIGNsYXNzZXMgdGhhdCBhcmUgdXAtdG8tZGF0ZS4gIEFudCBpcyBub3QgdGhlCisgICAgICAgIG9ubHkgdG9vbCB0aGF0IGV4cGVjdHMgYSBzb3VyY2UtdHJlZSBsYXlvdXQgbGlrZSB0aGlzLjwvcD4KKworICAgICAgICA8cD5JZiB5b3UgaGF2ZSBKYXZhIHNvdXJjZSBmaWxlcyB0aGF0IGFyZW4mYXBvczt0IGRlY2xhcmVkIHRvCisgICAgICAgIGJlIHBhcnQgb2YgYW55IHBhY2thZ2UsIHlvdSBjYW4gc3RpbGwgdXNlIHRoZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPgorICAgICAgICB0YXNrIHRvIGNvbXBpbGUgdGhlc2UgZmlsZXMgY29ycmVjdGx5IC0ganVzdCBzZXQgdGhlCisgICAgICAgIDxjb2RlPnNyY2RpcjwvY29kZT4gYW5kIDxjb2RlPmRlc3RkaXI8L2NvZGU+IGF0dHJpYnV0ZXMgdG8KKyAgICAgICAgdGhlIGFjdHVhbCBkaXJlY3RvcnkgdGhlIHNvdXJjZQorICAgICAgICBmaWxlcyBsaXZlIGluIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBjbGFzcyBmaWxlcyBzaG91bGQgZ28gaW50bywKKyAgICAgICAgcmVzcGVjdGl2ZWx5LjwvcD4KKworICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJkZWZhdWx0ZXhjbHVkZXMiPgorCisgICAgICA8cXVlc3Rpb24+SSZhcG9zO3ZlIHVzZWQgYSA8Y29kZT4mbHQ7ZGVsZXRlJmd0OzwvY29kZT4gdGFzayB0bworICAgICAgZGVsZXRlIHVud2FudGVkIFNvdXJjZVNhZmUgY29udHJvbCBmaWxlcyAoQ1ZTIGZpbGVzLCBlZGl0b3IKKyAgICAgIGJhY2t1cCBmaWxlcywgZXRjLiksIGJ1dCBpdCBkb2VzbiZhcG9zO3Qgc2VlbSB0byB3b3JrOyB0aGUgZmlsZXMKKyAgICAgIG5ldmVyIGdldCBkZWxldGVkLiBXaGF0JmFwb3M7cyB3cm9uZz88L3F1ZXN0aW9uPgorCisgICAgICA8YW5zd2VyPgorICAgICAgICA8cD5UaGlzIGlzIHByb2JhYmx5IGhhcHBlbmluZyBiZWNhdXNlLCBieSBkZWZhdWx0LCBBbnQgZXhjbHVkZXMKKyAgICAgICAgU291cmNlU2FmZSBjb250cm9sIGZpbGVzICg8Y29kZT52c3N2ZXIuc2NjPC9jb2RlPikgYW5kIGNlcnRhaW4gb3RoZXIKKyAgICAgICAgZmlsZXMgZnJvbSBGaWxlU2V0cy48L3A+CisKKyAgICAgICAgPHA+SGVyZSZhcG9zO3Mgd2hhdCB5b3UgcHJvYmFibHkgZGlkOjwvcD4KKworCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8ZGVsZXRlPgorICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuc3JjfSIgaW5jbHVkZXM9IioqL3Zzc3Zlci5zY2MiLz4KKzwvZGVsZXRlPgorXV0+PC9zb3VyY2U+CisKKyAgICAgICAgPHA+WW91IG5lZWQgdG8gc3dpdGNoIG9mZiB0aGUgZGVmYXVsdCBleGNsdXNpb25zLAorICAgICAgICAgICBhbmQgaXQgd2lsbCB3b3JrOjwvcD4KKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKzxkZWxldGU+CisgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5zcmN9IiBpbmNsdWRlcz0iKiovdnNzdmVyLnNjYyIKKyAgICAgICAgICAgZGVmYXVsdGV4Y2x1ZGVzPSJubyIvPgorPC9kZWxldGU+CitdXT48L3NvdXJjZT4KKworICAgICAgICA8cD5Gb3IgYSBjb21wbGV0ZSBsaXN0aW5nIG9mIHRoZSBwYXR0ZXJucyB0aGF0IGFyZSBleGNsdWRlZAorICAgICAgICBieSBkZWZhdWx0LCBzZWUgPGEgaHJlZj0ibWFudWFsL2RpcnRhc2tzLmh0bWwjZGVmYXVsdGV4Y2x1ZGVzIj50aGUgdXNlcgorICAgICAgICBtYW51YWw8L2E+LjwvcD4KKworICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJzdG9wLWRlcGVuZGVuY3kiPgorICAgICAgPHF1ZXN0aW9uPkkgaGF2ZSBhIHRhcmdldCBJIHdhbnQgdG8gc2tpcCBpZiBhIHByb3BlcnR5IGlzIHNldCwKKyAgICAgIHNvIEkgaGF2ZSA8Y29kZT51bmxlc3M9JnF1b3Q7cHJvcGVydHkmcXVvdDs8L2NvZGU+IGFzIGFuIGF0dHJpYnV0ZQorICAgICAgb2YgdGhlIHRhcmdldCwgYnV0IGFsbCB0aGUgdGFyZ2V0cyB0aGlzIHRhcmdldAorICAgICAgZGVwZW5kcyBvbiBhcmUgc3RpbGwgZXhlY3V0ZWQuIFdoeT88L3F1ZXN0aW9uPgorCisgICAgICA8YW5zd2VyPgorICAgICAgICA8cD5UaGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgaXMgZ2VuZXJhdGVkIGJ5IEFudCBiZWZvcmUgYW55IG9mIHRoZQorICAgICAgICB0YXJnZXRzIGFyZSBydW4uIFRoaXMgYWxsb3dzIGRlcGVuZGVudCB0YXJnZXRzLCBzdWNoIGFzIGFuCisgICAgICAgIDxjb2RlPmluaXQ8L2NvZGU+IHRhcmdldCwgdG8gc2V0IHByb3BlcnRpZXMgdGhhdCBjYW4gY29udHJvbCB0aGUKKyAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGUgdGFyZ2V0cyBoaWdoZXIgaW4gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIFRoaXMKKyAgICAgICAgICAgICAgaXMgYSBnb29kIHRoaW5nLjwvcD4KKworICAgICAgICA8cD5Ib3dldmVyLCB3aGVuIHlvdXIgZGVwZW5kZW5jaWVzIGJyZWFrIGRvd24gdGhlCisgICAgICAgIGhpZ2hlci1sZXZlbCB0YXNrCisgICAgICAgIGludG8gc2V2ZXJhbCBzbWFsbGVyIHN0ZXBzLCB0aGlzIGJlaGF2aW91ciBiZWNvbWVzCisgICAgICAgIGNvdW50ZXItaW50dWl0aXZlLiBUaGVyZSBhcmUgYSBjb3VwbGUgb2Ygc29sdXRpb25zIGF2YWlsYWJsZToKKyAgICAgICAgPC9wPgorCisgICAgICAgIDxvbD4KKyAgICAgICAgICA8bGk+UHV0IHRoZSBzYW1lIGNvbmRpdGlvbiBvbiBlYWNoIG9mIHRoZSBkZXBlbmRlbnQgdGFyZ2V0cy48L2xpPgorCisgICAgICAgICAgPGxpPkV4ZWN1dGUgdGhlIHN0ZXBzIHVzaW5nIDxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4sCisgICAgICAgICAgaW5zdGVhZCBvZiBzcGVjaWZ5aW5nIHRoZW0gaW5zaWRlIHRoZSA8Y29kZT5kZXBlbmRzPC9jb2RlPgorICAgICAgICAgIGF0dHJpYnV0ZS48L2xpPgorICAgICAgICA8L29sPgorCisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9ImluY2x1ZGUtb3JkZXIiPgorICAgICAgPHF1ZXN0aW9uPkluIG15IDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sIEkmYXBvczt2ZSBwdXQgaW4gYW4KKyAgICAgIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gb2YgYWxsIGZpbGVzIGZvbGxvd2VkIGJ5IGFuCisgICAgICA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+IG9mIGp1c3QgdGhlIGZpbGVzIEkgd2FudCwgYnV0IGl0CisgICAgICBpc24mYXBvczt0IGdpdmluZyBtZSBhbnkgZmlsZXMgYXQgYWxsLiBXaGF0JmFwb3M7cyB3cm9uZz8KKyAgICAgIDwvcXVlc3Rpb24+CisKKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPlRoZSBvcmRlciBvZiB0aGUgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKKyAgICAgICAgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiB0YWdzIHdpdGhpbiBhIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4KKyAgICAgICAgaXMgaWdub3JlZCB3aGVuIHRoZSBGaWxlU2V0IGlzIGNyZWF0ZWQuIEluc3RlYWQsIGFsbCBvZiB0aGUKKyAgICAgICAgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgcHJvY2Vzc2VkIHRvZ2V0aGVyLAorICAgICAgICBmb2xsb3dlZCBieSBhbGwgb2YgdGhlIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KKyAgICAgICAgZWxlbWVudHMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgorICAgICAgICBlbGVtZW50cyBvbmx5IGFwcGx5IHRvIHRoZSBmaWxlIGxpc3QgcHJvZHVjZWQgYnkgdGhlCisgICAgICAgIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorCisgICAgICAgIDxwPlRvIGdldCB0aGUgZmlsZXMgeW91IHdhbnQsIGZvY3VzIG9uIGp1c3QgdGhlCisgICAgICAgIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gcGF0dGVybnMgdGhhdCB3b3VsZCBiZSBuZWNlc3NhcnkKKyAgICAgICAgdG8gZ2V0IHRoZW0uIElmIHlvdSBmaW5kIHlvdSBuZWVkIHRvIHRyaW0gdGhlIGxpc3QgdGhhdCB0aGUKKyAgICAgICAgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBwcm9kdWNlLCB0aGVuIHVzZQorICAgICAgICA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0icHJvcGVydGllcy1ub3QtdHJpbW1lZCI+CisgICAgICA8cXVlc3Rpb24+PGNvZGU+YW50PC9jb2RlPiBmYWlsZWQgdG8gYnVpbGQgbXkgcHJvZ3JhbSB2aWEgamF2YWMKKyAgICAgIGV2ZW4gd2hlbiBJIHB1dCB0aGUgbmVlZGVkIGphcnMgaW4gYW4gZXh0ZXJuYWwKKyAgICAgIDxjb2RlPmJ1aWxkLnByb3BlcnRpZXM8L2NvZGU+IGZpbGUgYW5kIHJlZmVyZW5jZSB0aGVtIGJ5CisgICAgICA8Y29kZT5wYXRoZWxlbWVudDwvY29kZT4gb3IgPGNvZGU+Y2xhc3NwYXRoIHJlZmlkPC9jb2RlPi48L3F1ZXN0aW9uPgorCisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPldoZW4gPGNvZGU+YW50PC9jb2RlPiBsb2FkcyBwcm9wZXJ0aWVzIGZyb20gYW4gZXh0ZXJuYWwKKyAgICAgICAgZmlsZSBpdCBkb2VzbiZhcG9zO3QgdG91Y2ggdGhlIHZhbHVlIG9mIHByb3BlcnRpZXMsIHRyYWlsaW5nIGJsYW5rcworICAgICAgICB3aWxsIG5vdCBiZSB0cmltbWVkIGZvciBleGFtcGxlLjwvcD4KKworICAgICAgICA8cD5JZiB0aGUgdmFsdWUgcmVwcmVzZW50cyBhIGZpbGUgcGF0aCwgbGlrZSBhIGphciBuZWVkZWQgdG8KKyAgICAgICAgY29tcGlsZSwgdGhlIHRhc2sgd2hpY2ggcmVxdWlyZXMgdGhlIHZhbHVlLCBqYXZhYyBmb3IgZXhhbXBsZQorICAgICAgICB3b3VsZCBmYWlsIHRvIGNvbXBpbGUgc2luY2UgaXQgY2FuJmFwb3M7dCBmaW5kIHRoZSBmaWxlIGR1ZSB0bworICAgICAgICB0cmFpbGluZyBzcGFjZXMuPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJ3aW56aXAtbGllcyI+CisgICAgICA8cXVlc3Rpb24+QW50IGNyZWF0ZXMgV0FSIGZpbGVzIHdpdGggYSBsb3dlci1jYXNlCisgICAgICAgIDxjb2RlPndlYi1pbmY8L2NvZGU+IG9yIEpBUiBmaWxlcyB3aXRoIGEgbG93ZXItY2FzZQorICAgICAgICA8Y29kZT5tZXRhLWluZjwvY29kZT4gZGlyZWN0b3J5LjwvcXVlc3Rpb24+CisKKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPk5vIGl0IGRvZXNuJmFwb3M7dC48L3A+CisKKyAgICAgICAgPHA+WW91IG1heSBoYXZlIHNlZW4gdGhlc2UgbG93ZXItY2FzZSBkaXJlY3RvcnkgbmFtZXMgaW4KKyAgICAgICAgV2luWklQLCBidXQgV2luWklQIGlzIHRyeWluZyB0byBiZSBoZWxwZnVsIChhbmQgZmFpbHMpLiAgSWYKKyAgICAgICAgV2luWklQIGVuY291bnRlcnMgYSBmaWxlbmFtZSB0aGF0IGlzIGFsbCB1cHBlci1jYXNlLCBpdAorICAgICAgICBhc3N1bWVzIGl0IGhhcyBjb21lIGZyb20gYW4gb2xkIERPUyBib3ggYW5kIGNoYW5nZXMgdGhlIGNhc2UgdG8KKyAgICAgICAgYWxsIGxvd2VyLWNhc2UgZm9yIHlvdS48L3A+CisKKyAgICAgICAgPHA+SWYgeW91IGV4dHJhY3QgKG9yIGp1c3QgY2hlY2spIHRoZSBhcmNoaXZlIHdpdGggamFyLCB5b3UKKyAgICAgICAgd2lsbCBzZWUgdGhhdCB0aGUgbmFtZXMgaGF2ZSB0aGUgY29ycmVjdCBjYXNlLjwvcD4KKworICAgICAgICA8cD5XaXRoIFdpblpJUCAodmVyc2lvbiA4LjEgYXQgbGVhc3QpLCB0aGlzIGNhbiBiZSBjb3JyZWN0ZWQgaW4gdGhlCisgICAgICAgIGNvbmZpZ3VyYXRpb24uICBJbiB0aGUgT3B0aW9ucy9Db25maWd1cmF0aW9uIG1lbnUsIGluIHRoZSBWaWV3IHRhYiwgR2VuZXJhbAorICAgICAgICBzZWN0aW9uLCBjaGVjayB0aGUgIkFsbG93IGFsbCB1cHBlciBjYXNlIGZpbGVzIG5hbWVzIiBib3guICBUaGUgTUVUQS1JTkYgYW5kCisgICAgICAgIFdFQi1JTkYgd2lsbCBsb29rIGNvcnJlY3QuPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJOb0NsYXNzRGVmRm91bmRFcnJvciI+CisgICAgICA8cXVlc3Rpb24+SSBpbnN0YWxsZWQgQW50IDEuNi54IGFuZCBub3cgZ2V0CisgICAgICAgIDxjb2RlPkV4Y2VwdGlvbiBpbiB0aHJlYWQgIm1haW4iIGphdmEubGFuZy5Ob0NsYXNzRGVmRm91bmRFcnJvcjoKKyAgICAgICAgPC9jb2RlPgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisgICAgICAgIDxwPgorICAgICAgICAgIFRoZSBjYXVzZSBvZiB0aGlzIGlzIHRoYXQgdGhlcmUgaXMgYW4gb2xkIHZlcnNpb24gb2YgYW50IHNvbWV3aGVyZSBpbiB0aGUKKyAgICAgICAgICBjbGFzcyBwYXRoIG9yIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgQSB2ZXJzaW9uIG9mIHRoaXMgcHJvYmxlbSBoYXBwZW5zIHdpdGggamFycyB0aGF0IGFyZSBpbiB0aGUgY2xhc3NwYXRoCisgICAgICAgICAgdGhhdCBpbmNsdWRlIGFuIGVtYmVkZGVkIGNvcHkgb2YgYW50IGNsYXNzZXMuCisgICAgICAgICAgQW4gZXhhbXBsZSBvZiB0aGlzIGlzIHNvbWUgY29waWVzIG9mIHdlYmxvZ2ljLmphci4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgT25lIGNhbiBjaGVjayBpZiB0aGlzIGlzIHRoZSBjYXNlIGJ5IGRvaW5nIChvbiB1bml4L3NoKToKKyAgICAgICAgPGNvZGU+PHByZT4KKyAgICAgICAgdW5zZXQgQ0xBU1NQQVRICisgICAgICAgIGFudCAtdmVyc2lvbgorICAgICAgICA8L3ByZT4KKyAgICAgICAgPC9jb2RlPgorICAgICAgICA8L3A+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9Ikluc3RhbnRpYXRpb25FeGNlcHRpb24iPgorICAgICAgPHF1ZXN0aW9uPkkgaW5zdGFsbGVkIEFudCAxLjYueCBhbmQgbm93IGdldAorICAgICAgICA8Y29kZT5qYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjogb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbjwvY29kZT4KKyAgICAgIDwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cD4KKyAgICAgICAgICBUaGUgY2F1c2Ugb2YgdGhpcyBpcyB0aGF0IHRoZXJlIGlzIGFuIG9sZCB2ZXJzaW9uIG9mIGFudCBzb21ld2hlcmUgaW4gdGhlCisgICAgICAgICAgY2xhc3MgcGF0aCBvciBjb25maWd1cmF0aW9uLgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgIEEgdmVyc2lvbiBvZiB0aGlzIHByb2JsZW0gbWF5IGJlIHNlZW4gb24gc29tZSBsaW51eCBzeXN0ZW1zLgorICAgICAgICAgIFNvbWUgbGludXggc3lzdGVtcyAoRmVkb3JhIENvcmUgMiBmb3IgZXhhbXBsZSksIGNvbWVzIHdpdGggYSB2ZXJzaW9uCisgICAgICAgICAgb2YgYW50IHByZS1pbnN0YWxsZWQuIFRoZXJlIGlzIGEgY29uZmlndXJhdGlvbiBmaWxlIGNhbGxlZAorICAgICAgICAgIDxjb2RlPi9ldGMvYW50LmNvbmY8L2NvZGU+IHdoaWNoIGlmIHByZXNlbnQsIHRoZSBhbnQgc2hlbGwKKyAgICAgICAgICBzY3JpcHQgd2lsbCAnZG90JyBpbmNsdWRlLiBPbiBGZWRvcmEgQ29yZSAyLCB0aGUgL2V0Yy9hbnQuY29uZgorICAgICAgICAgIGZpbGUgcmVzZXRzIHRoZSA8Y29kZT5BTlRfSE9NRTwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8KKyAgICAgICAgICA8Y29kZT4vdXNyL3NoYXJlL2FudDwvY29kZT4uIFRoaXMgY2F1c2VzIHRoZSBwcm9ibGVtIHRoYXQKKyAgICAgICAgICBhbiBvbGQgdmVyc2lvbiBvZiBhbnQgKDEuNS54IGluIHRoaXMgY2F1c2UpIHdpbGwgYmUgdXNlZAorICAgICAgICAgIHdpdGggYSBuZXcgdmVyc2lvbiBvZiB0aGUgYW50IHNjcmlwdCBmaWxlLgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgIE9uZSBjYW4gY2hlY2sgaWYgdGhpcyBpcyB0aGUgY2FzZSBieSBkb2luZworICAgICAgICAgIDxjb2RlPmFudCAtLW5vY29uZmlnIC12ZXJzaW9uPC9jb2RlPi4KKyAgICAgICAgPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisgICAgPGZhcSBpZD0ibWFuZ2xlZC1tYW5pZmVzdCI+CisgICAgICA8cXVlc3Rpb24+CisgICAgICAgIFdoZW5ldmVyIEkgdXNlIHRoZSBBbnQgamFyIG9yIG1hbmlmZXN0IHJlbGF0ZWQgdGFza3MsIGxvbmcgbGluZXMgaW4KKyAgICAgICAgbXkgbWFuaWZlc3QgYXJlIHdyYXBwZWQgYXQgNzAgY2hhcmFjdGVycyBhbmQgdGhlIHJlc3VsdGluZyBqYXIgZG9lcworICAgICAgICBub3Qgd29yayBpbiBteSBhcHBsaWNhdGlvbiBzZXJ2ZXIuIFdoeSBkb2VzIEFudCBkbyB0aGlzPworICAgICAgPC9xdWVzdGlvbj4KKworICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHA+CisgICAgICAgICAgQW50IGltcGxlbWVudHMgdGhlIEphdmEKKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9ndWlkZS9qYXIvamFyLmh0bWwiPkphcgorICAgICAgICAgIGZpbGUgc3BlY2lmaWNhdGlvbjwvYT4uIFBsZWFzZSByZWZlciB0byB0aGUgbm90ZXMgc2VjdGlvbiB3aGVyZSBpdAorICAgICAgICAgIGRpc2N1c3NlcyB0aGUgbWF4aW11bSBhbGxvd2FibGUgbGVuZ3RoIG9mIGEgbGluZSBhbmQgdGhlIGNvbmNlcHQgb2YKKyAgICAgICAgICBjb250aW51YXRpb24gY2hhcmFjdGVycy4KKyAgICAgICAgPC9wPgorCisgICAgICAgIDxwPgorICAgICAgICAgIElmIGEgamFyIGZpbGUgcHJvZHVjZWQgYnkgQW50IGRvZXMgbm90IHdvcmsgaW4geW91ciBhcHBzZXJ2ZXIsIGFuZAorICAgICAgICAgIHRoYXQgZmFpbHVyZSBpcyBkdWUgdG8gdGhlIHdyYXBwZWQgbWFuaWZlc3QsIHRoZW4geW91IG5lZWQKKyAgICAgICAgICB0byBjb25zdWx0IHlvdXIgYXBwc2VydmVyIHByb3ZpZGVyLCBhcyBpdCBpcyBhIGJ1ZyBpbiB0aGVpcgorICAgICAgICAgIGFwcHNlcnZlci4gRmFyIG1vcmUgbGlrZWx5LCBob3dldmVyLCBpcyBhIHByb2JsZW0gaW4geW91cgorICAgICAgICAgIHNwZWNpZmljYXRpb24gb2YgeW91ciBjbGFzc3BhdGguIEl0IGlzIG5vdCBBbnQncyB3cmFwcGluZyBvZiB5b3VyCisgICAgICAgICAgY2xhc3NwYXRoIHRoYXQgaXMgdGhlIHByb2JsZW0uCisgICAgICAgIDwvcD4KKworICAgICAgICA8cD4KKyAgICAgICAgICBEbyBub3QgcmFpc2UgYSBidWcgYWJvdXQgdGhpcyBpc3N1ZSB1bnRpbCB5b3UgaGF2ZSBjaGVja2VkIHRvIGVuc3VyZQorICAgICAgICAgIHRoYXQgdGhlIHByb2JsZW0gaXMgbm90IGR1ZSB0byB5b3VyIGNsYXNzcGF0aCBzcGVjaWZpY2F0aW9uLgorICAgICAgICA8L3A+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICA8L2ZhcXNlY3Rpb24+CisKKyAgPGZhcXNlY3Rpb24gdGl0bGU9IkFudCBhbmQgSURFcy9FZGl0b3JzIj4KKyAgICA8ZmFxIGlkPSJpbnRlZ3JhdGlvbiI+CisgICAgICA8cXVlc3Rpb24+SXMgQW50IHN1cHBvcnRlZCBieSBteSBJREUvRWRpdG9yPzwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cD5TZWUgdGhlIDxhIGhyZWY9ImV4dGVybmFsLmh0bWwjSURFIGFuZCBFZGl0b3IgSW50ZWdyYXRpb24iPnNlY3Rpb24KKyAgICAgICAgb24gSURFIGludGVncmF0aW9uPC9hPiBvbiBvdXIgRXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzIHBhZ2UuPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJlbWFjcy1tb2RlIj4KKyAgICAgIDxxdWVzdGlvbj5XaHkgZG9lc24mYXBvczt0IChYKUVtYWNzL3ZpL01hY09TIFgmYXBvcztzIHByb2plY3QgYnVpbGRlcgorICAgICAgY29ycmVjdGx5IHBhcnNlIHRoZSBlcnJvciBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgQW50PzwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPkFudCBhZGRzIGEgJnF1b3Q7YmFubmVyJnF1b3Q7IHdpdGggdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgdGFzayBpbiBmcm9udCBvZiBhbGwgbG9nZ2luZyBtZXNzYWdlcyAtIGFuZCB0aGVyZSBhcmUgbm8gYnVpbHQtaW4KKyAgICAgICAgcmVndWxhciBleHByZXNzaW9ucyBpbiB5b3VyIGVkaXRvciB0aGF0IHdvdWxkIGFjY291bnQgZm9yCisgICAgICAgIHRoaXMuPC9wPgorCisgICAgICAgIDxwPllvdSBjYW4gZGlzYWJsZSB0aGlzIGJhbm5lciBieSBpbnZva2luZyBBbnQgd2l0aCB0aGUKKyAgICAgICAgPGNvZGU+LWVtYWNzPC9jb2RlPiBzd2l0Y2guICBUbyBtYWtlIEFudCBhdXRvZGV0ZWN0CisgICAgICAgIEVtYWNzJmFwb3M7IGNvbXBpbGUgbW9kZSwgcHV0IHRoaXMgaW50byB5b3VyCisgICAgICAgIDxjb2RlPi5hbnRyYzwvY29kZT4gKGNvbnRyaWJ1dGVkIGJ5IFZpbGxlIFNreXR0JiMyMjg7KS48L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKyMgRGV0ZWN0IChYKUVtYWNzIGNvbXBpbGUgbW9kZQoraWYgWyAiJEVNQUNTIiA9ICJ0IiBdIDsgdGhlbgorICBBTlRfQVJHUz0iJEFOVF9BUkdTIC1lbWFjcyIKKyAgQU5UX09QVFM9IiRBTlRfT1BUUyAtRGJ1aWxkLmNvbXBpbGVyLmVtYWNzPXRydWUiCitmaQorXV0+PC9zb3VyY2U+CisKKyAgICAgICAgPHA+QWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyBzbmlwcGV0IHRvIHlvdXIKKyAgICAgICAgPGNvZGU+LmVtYWNzPC9jb2RlPiB0byBtYWtlIEVtYWNzIHVuZGVyc3RhbmQgQW50JmFwb3M7cworICAgICAgICBvdXRwdXQuPC9wPgorCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisocmVxdWlyZSAnY29tcGlsZSkKKyhzZXRxIGNvbXBpbGF0aW9uLWVycm9yLXJlZ2V4cC1hbGlzdAorICAoYXBwZW5kIChsaXN0CisgICAgIDs7IHdvcmtzIGZvciBqaWtlcworICAgICAnKCJeXFxzLSpcXFtbXl1dKlxcXVxccy0qXFwoLitcXCk6XFwoWzAtOV0rXFwpOlxcKFswLTldK1xcKTpbMC05XSs6WzAtOV0rOiIgMSAyIDMpCisgICAgIDs7IHdvcmtzIGZvciBqYXZhYworICAgICAnKCJeXFxzLSpcXFtbXl1dKlxcXVxccy0qXFwoLitcXCk6XFwoWzAtOV0rXFwpOiIgMSAyKSkKKyAgY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwLWFsaXN0KSkKK11dPjwvc291cmNlPgorCisgICAgICAgIDxwPllldCBhbm90aGVyIGFsdGVybmF0aXZlIHRoYXQgcHJlc2VydmVzIG1vc3Qgb2YgQW50JmFwb3M7cworICAgICAgICBmb3JtYXR0aW5nIGlzIHRvIHBpcGUgQW50JmFwb3M7cyBvdXRwdXQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIFBlcmwKKyAgICAgICAgc2NyaXB0IGJ5IERpcmstV2lsbGVtIHZhbiBHdWxpazo8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKyMhL3Vzci9iaW4vcGVybAorIworIyBNYXkgMjAwMSBkaXJreEBhcGFjaGUub3JnIC0gcmVtb3ZlIGFueQorIyBbZm9vXSBsaW5lcyBmcm9tIHRoZSBvdXRwdXQ7IGtlZXBpbmcKKyMgc3BhY2luZyBtb3JlIG9yIGxlc3MgdGhlcmUuCisjCiskfD0xOword2hpbGUoPFNURElOPikgeworICAgICAgICBpZiAocy9eKFxzKylcWyhcdyspXF0vLykgeworICAgICAgICAgICAgICAgIGlmICgkMiBuZSAkbGFzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiQxXFskMlxdIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzID0gJyAnIHggbGVuZ3RoKCQyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiQxICRzICI7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAkbGFzdCA9ICQyOworICAgICAgICB9OworICAgICAgICBwcmludDsKK307CitdXT48L3NvdXJjZT4KKworICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisgIDwvZmFxc2VjdGlvbj4KKworICA8ZmFxc2VjdGlvbiB0aXRsZT0iQWR2YW5jZWQgSXNzdWVzIj4KKyAgICA8ZmFxIGlkPSJkdGQiPgorICAgICAgPHF1ZXN0aW9uPklzIHRoZXJlIGEgRFREIHRoYXQgSSBjYW4gdXNlIHRvIHZhbGlkYXRlIG15IGJ1aWxkCisgICAgICBmaWxlcz88L3F1ZXN0aW9uPgorCisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPkFuIGluY29tcGxldGUgRFREIGNhbiBiZSBjcmVhdGVkIGJ5IHRoZQorICAgICAgICAgIDxjb2RlPiZsdDthbnRzdHJ1Y3R1cmUmZ3Q7PC9jb2RlPiB0YXNrIC0gYnV0IHRoaXMgb25lCisgICAgICAgICAgaGFzIGEgZmV3IHByb2JsZW1zOjwvcD4KKworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT5JdCBkb2VzbiZhcG9zO3Qga25vdyBhYm91dCByZXF1aXJlZCBhdHRyaWJ1dGVzLiAgT25seQorICAgICAgICAgICAgbWFudWFsIHR3ZWFraW5nIG9mIHRoaXMgZmlsZSBjYW4gaGVscCBoZXJlLjwvbGk+CisKKyAgICAgICAgICAgIDxsaT5JdCBpcyBub3QgY29tcGxldGUgLSBpZiB5b3UgYWRkIG5ldyB0YXNrcyB2aWEKKyAgICAgICAgICAgIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gaXQgd29uJmFwb3M7dCBrbm93IGFib3V0IGl0LiAgU2VlCisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnNkdi5mci9wYWdlcy9jYXNhL2h0bWwvYW50LWR0ZC5lbi5odG1sIj50aGlzCisgICAgICAgICAgICBwYWdlPC9hPiBieSBNaWNoZWwgQ2FzYWJpYW5jYSBmb3IgYSBzb2x1dGlvbiB0byB0aGlzCisgICAgICAgICAgICBwcm9ibGVtLiAgTm90ZSB0aGF0IHRoZSBEVEQgeW91IGNhbiBkb3dubG9hZCBhdCB0aGlzIHBhZ2UKKyAgICAgICAgICAgIGlzIGJhc2VkIG9uIEFudCAwLjMuMS48L2xpPgorCisgICAgICAgICAgICA8bGk+SXQgbWF5IGV2ZW4gYmUgYW4gaW52YWxpZCBEVEQuICBBcyBBbnQgYWxsb3dzIHRhc2tzCisgICAgICAgICAgICB3cml0ZXJzIHRvIGRlZmluZSBhcmJpdHJhcnkgZWxlbWVudHMsIG5hbWUgY29sbGlzaW9ucyB3aWxsCisgICAgICAgICAgICBoYXBwZW4gcXVpdGUgZnJlcXVlbnRseSAtIGlmIHlvdXIgdmVyc2lvbiBvZiBBbnQgY29udGFpbnMKKyAgICAgICAgICAgIHRoZSBvcHRpb25hbCA8Y29kZT4mbHQ7dGVzdCZndDs8L2NvZGU+IGFuZAorICAgICAgICAgICAgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gdGFza3MsIHRoZXJlIGFyZSB0d28gWE1MCisgICAgICAgICAgICBlbGVtZW50cyBuYW1lZCA8Y29kZT50ZXN0PC9jb2RlPiAodGhlIHRhc2sgYW5kIHRoZSBuZXN0ZWQgY2hpbGQKKyAgICAgICAgICAgIGVsZW1lbnQgb2YgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4pIHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZQorICAgICAgICAgICAgbGlzdHMuICBUaGlzIHByb2JsZW0gY2Fubm90IGJlIHNvbHZlZDsgRFREcyBkb24mYXBvczt0IGdpdmUgYQorICAgICAgICAgICAgc3ludGF4IHJpY2ggZW5vdWdoIHRvIHN1cHBvcnQgdGhpcy48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9InhtbC1lbnRpdHktaW5jbHVkZSI+CisgICAgICA8cXVlc3Rpb24+SG93IGRvIEkgaW5jbHVkZSBhbiBYTUwgc25pcHBldCBpbiBteSBidWlsZCBmaWxlPzwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cD5Zb3UgY2FuIHVzZSBYTUwmYXBvcztzIHdheSBvZiBpbmNsdWRpbmcgZXh0ZXJuYWwgZmlsZXMgYW5kIGxldAorICAgICAgICB0aGUgcGFyc2VyIGRvIHRoZSBqb2IgZm9yIEFudDo8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IURPQ1RZUEUgcHJvamVjdCBbCisgICAgICAgPCFFTlRJVFkgY29tbW9uIFNZU1RFTSAiY29tbW9uLnhtbCI+CitdPgorCis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJ0ZXN0IiBiYXNlZGlyPSIuIj4KKworICA8dGFyZ2V0IG5hbWU9InNldHVwIj4KKyAgICAuLi4KKyAgPC90YXJnZXQ+CisKKyAgJmNvbW1vbjsKKworICAuLi4KKworPC9wcm9qZWN0PgorXV0+PC9zb3VyY2U+CisKKyAgICAgICAgPHA+d2lsbCBsaXRlcmFsbHkgaW5jbHVkZSB0aGUgY29udGVudHMgb2YgPGNvZGU+Y29tbW9uLnhtbDwvY29kZT4gd2hlcmUKKyAgICAgICAgeW91JmFwb3M7dmUgcGxhY2VkIHRoZSA8Y29kZT4mYW1wO2NvbW1vbjs8L2NvZGU+IGVudGl0eS48L3A+CisKKyAgICAgICAgPHA+KFRoZSBmaWxlbmFtZSA8Y29kZT5jb21tb24ueG1sPC9jb2RlPiBpbiB0aGlzIGV4YW1wbGUgaXMgcmVzb2x2ZWQKKyAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5pbmcgWE1MIGZpbGUgYnkgdGhlIFhNTCBwYXJzZXIuIFlvdSBtYXkgYWxzbyB1c2UKKyAgICAgICAgYW4gYWJzb2x1dGUgPGNvZGU+ZmlsZTo8L2NvZGU+IHByb3RvY29sIFVSSS4pPC9wPgorCisgICAgICAgIDxwPkluIGNvbWJpbmF0aW9uIHdpdGggYSBEVEQsIHRoaXMgd291bGQgbG9vayBsaWtlIHRoaXM6PC9wPgorCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8IURPQ1RZUEUgcHJvamVjdCBQVUJMSUMgIi0vL0FOVC8vRFREIHByb2plY3QvL0VOIiAiYW50LmR0ZCIgWworICAgPCFFTlRJVFkgaW5jbHVkZSBTWVNURU0gImhlYWRlci54bWwiPgorXT4KK11dPjwvc291cmNlPgorCisgICAgICAgIDxwPlN0YXJ0aW5nIHdpdGggQW50IDEuNiwgdGhlcmUgaXMgYSBuZXcKKyAgICAgICAgPGNvZGU+Jmx0O2ltcG9ydCZndDs8L2NvZGU+IHRhc2sgdGhhdCBjYW4gKGFsc28pIGJlIHVzZWQgdG8KKyAgICAgICAgaW5jbHVkZSBidWlsZCBmaWxlIGZyYWdtZW50cy4gIFVubGlrZSB0aGUgc25pcHBldHMgdXNlZCB3aXRoCisgICAgICAgIGVudGl0eSBpbmNsdWRlcywgdGhlIHJlZmVyZW5jZWQgZmlsZXMgaGF2ZSB0byBiZSBjb21wbGV0ZSBBbnQKKyAgICAgICAgYnVpbGQgZmlsZXMsIHRob3VnaC48L3A+CisKKyAgICAgICAgPHA+VGhlIGV4YW1wbGUgYWJvdmUgd291bGQgYmVjb21lOjwvcD4KKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0idGVzdCIgYmFzZWRpcj0iLiI+CisKKyAgPHRhcmdldCBuYW1lPSJzZXR1cCI+CisgICAgLi4uCisgIDwvdGFyZ2V0PgorCisgIDxpbXBvcnQgZmlsZT0iLi9jb21tb24ueG1sIi8+CisKKyAgLi4uCisKKzwvcHJvamVjdD4KK11dPjwvc291cmNlPgorCisgICAgICAgIDxwPlVubGlrZSBlbnRpdHkgaW5jbHVkZXMsIDxjb2RlPiZsdDtpbXBvcnQmZ3Q7PC9jb2RlPiB3aWxsCisgICAgICAgIGxldCB5b3UgdXNlIEFudCBwcm9wZXJ0aWVzIGluIHRoZSBmaWxlIG5hbWUuPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJtYWlsLWxvZ2dlciI+CisgICAgICA8cXVlc3Rpb24+SG93IGRvIEkgc2VuZCBhbiBlbWFpbCB3aXRoIHRoZSByZXN1bHQgb2YgbXkgYnVpbGQKKyAgICAgICAgcHJvY2Vzcz88L3F1ZXN0aW9uPgorCisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPklmIHlvdSBhcmUgdXNpbmcgYSBuaWdodGx5IGJ1aWxkIG9mIEFudCAxLjUgYWZ0ZXIKKyAgICAgICAgMjAwMS0xMi0xNCwgeW91IGNhbiB1c2UgdGhlIGJ1aWx0LWluIE1haWxMb2dnZXI6PC9wPgorCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgICAgICBhbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5NYWlsTG9nZ2VyCitdXT48L3NvdXJjZT4KKworICAgICAgICA8cD5TZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2NvcmUvdHJ1bmsvZG9jcy9tYW51YWwvbGlzdGVuZXJzLmh0bWwiPkxpc3RlbmVycworICAgICAgICAmYW1wOyBMb2dnZXJzPC9hPiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBwcm9wZXJ0aWVzCisgICAgICAgIHJlcXVpcmVkLjwvcD4KKworICAgICAgICA8cD5Gb3Igb2xkZXIgdmVyc2lvbnMgb2YgQW50LCB5b3UgY2FuIHVzZSBhIGN1c3RvbQorICAgICAgICBCdWlsZExpc3RlbmVyIHRoYXQgc2VuZHMgb3V0IGFuIGVtYWlsCisgICAgICAgIGluIHRoZSBidWlsZEZpbmlzaGVkKCkgbWV0aG9kLiAgV2lsbCBHbG96ZXIKKyAgICAgICAgJmx0O3dpbGwuZ2xvemVyQGpkYS5jb20mZ3Q7IGhhcyB3cml0dGVuIHN1Y2ggYSBsaXN0ZW5lciBiYXNlZAorICAgICAgICBvbiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFtYWlsLyI+SmF2YU1haWw8L2E+LgorICAgICAgICBUaGUgc291cmNlIGlzOjwvcD4KKworICAgICAgICA8c291cmNlPjwhW0NEQVRBWworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5tYWlsLio7CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CisKKy8qKgorICogQSBzaW1wbGUgbGlzdGVuZXIgdGhhdCB3YWl0cyBmb3IgYSBidWlsZCB0byBmaW5pc2ggYW5kIHNlbmRzIGFuIGVtYWlsCisgKiBvZiB0aGUgcmVzdWx0cy4gIFRoZSBzZXR0aW5ncyBhcmUgc3RvcmVkIGluICJtb25pdG9yLnByb3BlcnRpZXMiIGFuZAorICogYXJlIGZhaXJseSBzZWxmIGV4cGxhbmF0b3J5LgorICoKKyAqIEBhdXRob3IgICAgICBXaWxsIEdsb3plcgorICogQHZlcnNpb24gICAgIDEuMDVhIDA5LzA2LzIwMDAKKyAqLworcHVibGljIGNsYXNzIEJ1aWxkTW9uaXRvciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgeworICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIHByb3BzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEJ1aWxkTW9uaXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRNb25pdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIm1vbml0b3IucHJvcGVydGllcyIpOworICAgICAgICBwcm9wcy5sb2FkKGlzKTsKKyAgICAgICAgaXMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBlKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBzdGF0dXMgb2YgdGhlIGJ1aWxkIGFuZCB0aGUgYWN0aW9ucyB0byBmb2xsb3csIG5vdyB0aGF0CisgICAgICogdGhlIGJ1aWxkIGhhcyBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgZSAgICAgICBFdmVudCBkZXNjcmliaW5nIHRoZSBidWlsZCBzdGF0dXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGUpIHsKKyAgICAgICAgVGhyb3dhYmxlIHRoID0gZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgU3RyaW5nIHN0YXR1cyA9ICh0aCAhPSBudWxsKSA/ICJmYWlsZWQiIDogInN1Y2NlZWRlZCI7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAiYnVpbGQuIiArIHN0YXR1czsKKyAgICAgICAgICAgIGlmIChwcm9wcy5nZXRQcm9wZXJ0eShrZXkgKyAiLm5vdGlmeSIpLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBTZXNzaW9uLmdldERlZmF1bHRJbnN0YW5jZShwcm9wcywgbnVsbCk7CisKKyAgICAgICAgICAgIE1pbWVNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWltZU1lc3NhZ2Uoc2Vzc2lvbik7CisgICAgICAgICAgICBtZXNzYWdlLmFkZFJlY2lwaWVudHMoTWVzc2FnZS5SZWNpcGllbnRUeXBlLlRPLCBwYXJzZUFkZHJlc3NlcygKKyAgICAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eShrZXkgKyAiLmVtYWlsLnRvIikpKTsKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0U3ViamVjdChwcm9wcy5nZXRQcm9wZXJ0eShrZXkgKyAiLmVtYWlsLnN1YmplY3QiKSk7CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKAorICAgICAgICAgICAgICAgIHByb3BzLmdldFByb3BlcnR5KCJidWlsZC5sb2ciKSkpOworICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3cud3JpdGUobGluZSk7CisgICAgICAgICAgICAgICAgc3cud3JpdGUoIlxuIik7CisgICAgICAgICAgICAgICAgbGluZSA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBici5jbG9zZSgpOworCisgICAgICAgICAgICBtZXNzYWdlLnNldFRleHQoc3cudG9TdHJpbmcoKSwgIlVURi04Iik7CisgICAgICAgICAgICBzdy5jbG9zZSgpOworCisgICAgICAgICAgICBUcmFuc3BvcnQgdHJhbnNwb3J0ID0gc2Vzc2lvbi5nZXRUcmFuc3BvcnQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5jb25uZWN0KCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuc2VuZChtZXNzYWdlKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGRNb25pdG9yIGZhaWxlZCB0byBzZW5kIGVtYWlsISIpOworICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGludGVybmV0IGVtYWlsIGFkZHJlc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBzICAgICAgIFRoZSBsaXN0IG9mIGFkZHJlc3Nlcy4KKyAgICAgKiBAcmV0dXJuICAgICAgQXJyYXkgb2YgQWRkcmVzc2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBBZGRyZXNzW10gcGFyc2VBZGRyZXNzZXMoU3RyaW5nIHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICIsIik7CisgICAgICAgIEFkZHJlc3NbXSBhZGRycyA9IG5ldyBBZGRyZXNzW3N0LmNvdW50VG9rZW5zKCldOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZHJzW2ldID0gbmV3IEludGVybmV0QWRkcmVzcyhzdC5uZXh0VG9rZW4oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZHJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBlKSB7CisgICAgfQorfQorXV0+PC9zb3VyY2U+CisKKyAgICAgIDxwPldpdGggYSA8Y29kZT5tb25pdG9yLnByb3BlcnRpZXM8L2NvZGU+IGxpa2UgdGhpczo8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKKyMgY29uZmlndXJhdGlvbiBmb3IgYnVpbGQgbW9uaXRvcgorCittYWlsLnRyYW5zcG9ydC5wcm90b2NvbD1zbXRwCittYWlsLnNtdHAuaG9zdD08aG9zdD4KK21haWwuZnJvbT1XaWxsIEdsb3plciA8d2lsbC5nbG96ZXJAamRhLmNvbT4KKworYnVpbGQubG9nPWJ1aWxkLmxvZworCitidWlsZC5mYWlsZWQubm90aWZ5PXRydWUKK2J1aWxkLmZhaWxlZC5lbWFpbC50bz13aWxsLmdsb3plckBqZGEuY29tCitidWlsZC5mYWlsZWQuZW1haWwuc3ViamVjdD1OaWdodGx5IGJ1aWxkIGZhaWxlZCEKKworYnVpbGQuc3VjY2VlZGVkLm5vdGlmeT10cnVlCitidWlsZC5zdWNjZWVkZWQuZW1haWwudG89d2lsbC5nbG96ZXJAamRhLmNvbQorYnVpbGQuc3VjY2VlZGVkLmVtYWlsLnN1YmplY3Q9TmlnaHRseSBidWlsZCBzdWNjZWVkZWQhCitdXT48L3NvdXJjZT4KKworICAgICAgICA8cD48Y29kZT5tb25pdG9yLnByb3BlcnRpZXM8L2NvZGU+IHNob3VsZCBiZSBwbGFjZWQgcmlnaHQgbmV4dAorICAgICAgICB0byB5b3VyIGNvbXBpbGVkIDxjb2RlPkJ1aWxkTW9uaXRvci5jbGFzczwvY29kZT4uICBUbyB1c2UgaXQsCisgICAgICAgIGludm9rZSBBbnQgbGlrZTo8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKK2FudCAtbGlzdGVuZXIgQnVpbGRNb25pdG9yIC1sb2dmaWxlIGJ1aWxkLmxvZworXV0+PC9zb3VyY2U+CisKKyAgICAgICAgPHA+TWFrZSBzdXJlIHRoYXQgPGNvZGU+bWFpbC5qYXI8L2NvZGU+IGZyb20gSmF2YU1haWwgYW5kCisgICAgICAgIDxjb2RlPmFjdGl2YXRpb24uamFyPC9jb2RlPiBmcm9tIHRoZQorICAgICAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFiZWFucy9nbGFzZ293L2phZi5odG1sIj5KYXZhCisgICAgICAgIEJlYW5zIEFjdGl2YXRpb24gRnJhbWV3b3JrPC9hPiBhcmUgaW4geW91ciA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LjwvcD4KKworICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJsaXN0ZW5lci1wcm9wZXJ0aWVzIj4KKyAgICAgIDxxdWVzdGlvbj5Ib3cgZG8gSSBnZXQgYXQgdGhlIHByb3BlcnRpZXMgdGhhdCBBbnQgd2FzIHJ1bm5pbmcKKyAgICAgIHdpdGggZnJvbSBpbnNpZGUgQnVpbGRMaXN0ZW5lcj88L3F1ZXN0aW9uPgorCisgICAgICA8YW5zd2VyPgorICAgICAgICA8cD5Zb3UgY2FuIGdldCBhdCBhIGhhc2h0YWJsZSB3aXRoIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IEFudAorICAgICAgICBoYXMgYmVlbiB1c2luZyB0aHJvdWdoIHRoZSBCdWlsZEV2ZW50IHBhcmFtZXRlci4gRm9yCisgICAgICAgIGV4YW1wbGU6PC9wPgorCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCitwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZSkgeworICAgIEhhc2h0YWJsZSB0YWJsZSA9IGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnRpZXMoKTsKKyAgICBTdHJpbmcgYnVpbGRwYXRoID0gKFN0cmluZyl0YWJsZS5nZXQoImJ1aWxkLnBhdGgiKTsKKyAgICAuLi4KK30KK11dPjwvc291cmNlPgorCisgICAgICAgIDxwPlRoaXMgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIGp1c3QgcmVhZGluZyB0aGUgc2FtZSBwcm9wZXJ0eQorICAgICAgICBmaWxlcyB0aGF0IHlvdXIgcHJvamVjdCBkb2VzLCBzaW5jZSBpdCB3aWxsIGdpdmUgdGhlIGNvcnJlY3QKKyAgICAgICAgcmVzdWx0cyBmb3IgcHJvcGVydGllcyB0aGF0IHdlcmUgc3BlY2lmaWVkIG9uIHRoZSBBbnQgY29tbWFuZCBsaW5lLjwvcD4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgIDwvZmFxc2VjdGlvbj4KKworICA8ZmFxc2VjdGlvbiB0aXRsZT0iS25vd24gUHJvYmxlbXMiPgorICAgIDxmYXEgaWQ9IjE3MC1yZXF1aXJlcy1qdW5pdCI+CisgICAgICA8cXVlc3Rpb24+QW50IDEuNy4wIGRvZXNuJ3QgYnVpbGQgZnJvbSBzb3VyY2VzIHdpdGhvdXQKKyAgICAgICAgSlVuaXQ8L3F1ZXN0aW9uPgorCisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPldoZW4gYnVpbGRpbmcgQW50IDEuNy4wIGZyb20gdGhlIHNvdXJjZSByZWxlYXNlIHdpdGhvdXQKKyAgICAgICAganVuaXQuamFyIHRoZSBidWlsZCBmYWlscyB3aXRoIHRoZSBtZXNzYWdlICJXZSBjYW5ub3QgYnVpbGQKKyAgICAgICAgdGhlIHRlc3QgamFyIHVubGVzcyBKVW5pdCBpcyBwcmVzZW50Ii48L3A+CisKKyAgICAgICAgPHA+V2l0aCBBbnQgMS43LjAgd2UndmUgc3RhcnRlZCB0byBhZGQgYW50LXRlc3R1dGlsLmphciBhcworICAgICAgICBwYXJ0IG9mIHRoZSBkaXN0cmlidXRpb24gYW5kIHRoaXMgY2F1c2VzIGEgaGFyZCBkZXBlbmRlbmN5IG9uCisgICAgICAgIEpVbml0IC0gYXQgbGVhc3QgaW4gdmVyc2lvbiAxLjcuMC4gIFVuZm9ydHVuYXRlbHkgdGhlCisgICAgICAgIGluc3RhbGxhdGlvbiBkb2NzIGRvbid0IHNheSBzby48L3A+CisKKyAgICAgICAgPHA+VGhlcmUgYXJlIHR3byB3b3JrYXJvdW5kczo8L3A+CisKKyAgICAgICAgPG9sPgorCisgICAgICAgICAgPGxpPkFkZCBqdW5pdC5qYXIgdG8geW91ciBDTEFTU1BBVEggd2hlbiBidWlsZGluZyBBbnQuPC9saT4KKworICAgICAgICAgIDxsaT5DaGFuZ2UgQW50J3MgYnVpbGRmaWxlIGFuZCByZW1vdmUgdGVzdC1qYXIgZnJvbSB0aGUKKyAgICAgICAgICBkZXBlbmRzIGxpc3Qgb2YgdGhlIGRpc3QtbGl0ZSB0YXJnZXQuPC9saT4KKworICAgICAgICA8L29sPgorCisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9InJlbW92ZS1jciI+CisgICAgICA8cXVlc3Rpb24+Jmx0O2NobW9kJmd0OyBvciAmbHQ7ZXhlYyZndDsgZG9lc24mYXBvczt0IHdvcmsgaW4gQW50CisgICAgICAgIDEuMyBvbiBVbml4PC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisKKyAgICAgICAgPHA+VGhlIDxjb2RlPmFudFJ1bjwvY29kZT4gc2NyaXB0IGluIDxjb2RlPkFOVF9IT01FL2JpbjwvY29kZT4KKyAgICAgICAgaGFzIERPUyBpbnN0ZWFkIG9mIFVuaXggbGluZSBlbmRpbmdzOyB5b3UgbXVzdCByZW1vdmUgdGhlCisgICAgICAgIGNhcnJpYWdlLXJldHVybiBjaGFyYWN0ZXJzIGZyb20gdGhpcyBmaWxlLiAgVGhpcyBjYW4gYmUgZG9uZSBieQorICAgICAgICB1c2luZyBBbnQmYXBvcztzIDxjb2RlPiZsdDtmaXhjcmxmJmd0OzwvY29kZT4gdGFzaworICAgICAgICBvciBzb21ldGhpbmcgbGlrZTo8L3A+CisKKyAgICAgICAgPHNvdXJjZT48IVtDREFUQVsKK3RyIC1kICdccicgPCAkQU5UX0hPTUUvYmluL2FudFJ1biA+IC90bXAvZm9vCittdiAvdG1wL2ZvbyAkQU5UX0hPTUUvYmluL2FudFJ1bgorXV0+PC9zb3VyY2U+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9ImphdmFkb2MtY2Fubm90LWV4ZWN1dGUiPgorICAgICAgPHF1ZXN0aW9uPkphdmFEb2MgZmFpbGVkOiBqYXZhLmlvLklPRXhjZXB0aW9uOiBqYXZhZG9jOiBjYW5ub3QgZXhlY3V0ZTwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorICAgICAgICA8cD5UaGVyZSBpcyBhIGJ1ZyBpbiB0aGUgU29sYXJpcyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgdGhlIEpESyAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MjMwMzk5Lmh0bWwiPmh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MjMwMzk5Lmh0bWw8L2E+KS4KKyAgICAgICAgVGhpcyBhbHNvIGFwcGVhcnMgdG8gYmUgdHJ1ZSB1bmRlciBMaW51eC4gTW92aW5nIHRoZSBKREsgdG8KKyAgICAgICAgdGhlIGZyb250IG9mIHRoZSBQQVRIIGZpeGVzIHRoZSBwcm9ibGVtLjwvcD4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0iZGVsZWdhdGluZy1jbGFzc2xvYWRlciI+CisgICAgICA8cXVlc3Rpb24+Jmx0O3N0eWxlJmd0OyBvciAmbHQ7anVuaXQmZ3Q7IGlnbm9yZXMgbXkKKyAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7PC9xdWVzdGlvbj4KKworICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS43LjAsICZsdDtqdW5pdCZndDsgd2lsbCBob25vciB5b3VyCisgICAgICAgIG5lc3RlZCAmbHQ7Y2xhc3NwYXRoJmd0Oy48L3A+CisKKyAgICAgICAgPHA+VGhlc2UgdGFza3MgZG9uJmFwb3M7dCBpZ25vcmUgeW91ciBjbGFzc3BhdGggc2V0dGluZywgeW91CisgICAgICAgIGFyZSBmYWNpbmcgYSBjb21tb24gcHJvYmxlbSB3aXRoIGRlbGVnYXRpbmcgY2xhc3Nsb2FkZXJzLjwvcD4KKworICAgICAgICA8cD5UaGlzIHF1ZXN0aW9uIGNvbGxlY3RzIGEgY29tbW9uIHR5cGUgb2YgcHJvYmxlbTogQSB0YXNrCisgICAgICAgIG5lZWRzIGFuIGV4dGVybmFsIGxpYnJhcnkgYW5kIGl0IGhhcyBhIG5lc3RlZCBjbGFzc3BhdGgKKyAgICAgICAgZWxlbWVudCBzbyB0aGF0IHlvdSBjYW4gcG9pbnQgaXQgdG8gdGhpcyBleHRlcm5hbCBsaWJyYXJ5LCBidXQKKyAgICAgICAgdGhhdCBkb2VzbiZhcG9zO3Qgd29yayB1bmxlc3MgeW91IHB1dCB0aGUgZXh0ZXJuYWwgbGlicmFyeQorICAgICAgICBpbnRvIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IG9yIHBsYWNlIGl0IGluCisgICAgICAgIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4uPC9wPgorCisgICAgICAgIDxwPlNvbWUgYmFja2dyb3VuZCBpcyBuZWNlc3NhcnkgYmVmb3JlIHdlIGNhbiBkaXNjdXNzCisgICAgICAgIHNvbHV0aW9ucyBmb3IgPGEgaHJlZj0iI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS41Ij5BbnQKKyAgICAgICAgMS41Lng8L2E+IGFuZCA8YSBocmVmPSIjZGVsZWdhdGluZy1jbGFzc2xvYWRlci0xLjYiPkFudAorICAgICAgICAxLjYueDwvYT4uPC9wPgorCisgICAgICAgIDxwPldoZW4geW91IHNwZWNpZnkgYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGluCisgICAgICAgIEFudCwgQW50IGNyZWF0ZXMgYSBuZXcgY2xhc3MgbG9hZGVyIHRoYXQgdXNlcyB0aGUgcGF0aCB5b3UKKyAgICAgICAgaGF2ZSBzcGVjaWZpZWQuICBJdCB0aGVuIHRyaWVzIHRvIGxvYWQgYWRkaXRpb25hbCBjbGFzc2VzIGZyb20KKyAgICAgICAgdGhpcyBjbGFzc2xvYWRlci48L3A+CisKKyAgICAgICAgPHA+SW4gbW9zdCBjYXNlcyAtIGZvciBleGFtcGxlIHVzaW5nICZsdDtzdHlsZSZndDsgb3IKKyAgICAgICAgJmx0O2p1bml0Jmd0OyAtIEFudCBkb2VzbiZhcG9zO3QgbG9hZCB0aGUgZXh0ZXJuYWwgbGlicmFyeQorICAgICAgICBkaXJlY3RseSwgaXQgaXMgdGhlIGxvYWRlZCBjbGFzcyB0aGF0IGRvZXMgc28uPC9wPgorCisgICAgICAgIDxwPkluIHRoZSBjYXNlIG9mIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IGl0IGlzIHRoZSB0YXNrCisgICAgICAgIGltcGxlbWVudGF0aW9uIGl0c2VsZiBhbmQgaW4gdGhlIGNhc2Ugb2YKKyAgICAgICAgPGNvZGU+Jmx0O3N0eWxlJmd0OzwvY29kZT4gaXQgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUTGlhaXNvbjwvY29kZT4KKyAgICAgICAgY2xhc3MuPC9wPgorCisgICAgICAgIDxwPjxlbT5BcyBvZiBBbnQgMS43PC9lbT4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gbm8gbG9uZ2VyCisgICAgICAgIHJlcXVpcmVzIHlvdSB0byBoYXZlIDxjb2RlPmp1bml0LmphcjwvY29kZT4gaW4gQW50J3Mgc3RhcnR1cAorICAgICAgICBjbGFzc3BhdGggZXZlbiBpZiA8Y29kZT5hbnQtanVuaXQuamFyPC9jb2RlPiBpcyBwcmVzZW50IHRoZXJlLjwvcD4KKworICAgICAgICA8cD5BbnQmYXBvcztzIGNsYXNzIGxvYWRlciBpbXBsZW1lbnRhdGlvbiB1c2VzIEphdmEmYXBvcztzCisgICAgICAgIGRlbGVnYXRpb24gbW9kZWwsIHNlZSA8YQorICAgICAgICBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9hcGkvamF2YS9sYW5nL0NsYXNzTG9hZGVyLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2FwaS9qYXZhL2xhbmcvQ2xhc3NMb2FkZXIuaHRtbDwvYT4KKyAgICAgICAgdGhlIHBhcmFncmFwaDwvcD4KKworICAgICAgICA8YmxvY2txdW90ZT5UaGUgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+IGNsYXNzIHVzZXMgYQorICAgICAgICBkZWxlZ2F0aW9uIG1vZGVsIHRvIHNlYXJjaCBmb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLiBFYWNoCisgICAgICAgIGluc3RhbmNlIG9mIDxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPiBoYXMgYW4gYXNzb2NpYXRlZCBwYXJlbnQKKyAgICAgICAgY2xhc3MgbG9hZGVyLiAgV2hlbiBjYWxsZWQgdXBvbiB0byBmaW5kIGEgY2xhc3Mgb3IgcmVzb3VyY2UsIGEKKyAgICAgICAgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+IGluc3RhbmNlIHdpbGwgZGVsZWdhdGUgdGhlIHNlYXJjaCBmb3IKKyAgICAgICAgdGhlIGNsYXNzIG9yIHJlc291cmNlIHRvIGl0cyBwYXJlbnQgY2xhc3MgbG9hZGVyIGJlZm9yZQorICAgICAgICBhdHRlbXB0aW5nIHRvIGZpbmQgdGhlIGNsYXNzIG9yIHJlc291cmNlIGl0c2VsZi4gVGhlIHZpcnR1YWwKKyAgICAgICAgbWFjaGluZSZhcG9zO3MgYnVpbHQtaW4gY2xhc3MgbG9hZGVyLCBjYWxsZWQgdGhlIGJvb3RzdHJhcAorICAgICAgICBjbGFzcyBsb2FkZXIsIGRvZXMgbm90IGl0c2VsZiBoYXZlIGEgcGFyZW50IGJ1dCBtYXkgc2VydmUgYXMKKyAgICAgICAgdGhlIHBhcmVudCBvZiBhIDxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPgorICAgICAgICBpbnN0YW5jZS48L2Jsb2NrcXVvdGU+CisKKyAgICAgICAgPHA+VGhlIHBvc3NpYmxlIHNvbHV0aW9ucyBkZXBlbmQgb24gdGhlIHZlcnNpb24gb2YgQW50IHlvdQorICAgICAgICB1c2UsIHNlZSB0aGUgbmV4dCBzZWN0aW9ucy48L3A+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9ImRlbGVnYXRpbmctY2xhc3Nsb2FkZXItMS41Ij4KKyAgICAgIDxxdWVzdGlvbj4mbHQ7c3R5bGUmZ3Q7IG9yICZsdDtqdW5pdCZndDsgaWdub3JlcyBteQorICAgICAgJmx0O2NsYXNzcGF0aCZndDsgLSBBbnQgMS41LnggdmVyc2lvbjwvcXVlc3Rpb24+CisKKyAgICAgIDxhbnN3ZXI+CisKKyAgICAgICAgPHA+UGxlYXNlIHJlYWQgPGEgaHJlZj0iI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXIiPnRoZSBwcmV2aW91cworICAgICAgICBlbnRyeTwvYT4gYmVmb3JlIHlvdSBnbyBhaGVhZC48L3A+CisKKyAgICAgICAgPHA+Rmlyc3Qgb2YgYWxsIGxldCZhcG9zO3Mgc3RhdGUgdGhhdCBBbnQncyB3cmFwcGVyIHNjcmlwdAorICAgICAgICAoPGNvZGU+YW50PC9jb2RlPiBvciA8Y29kZT5hbnQuYmF0PC9jb2RlPikgYWRkcyBhbGwKKyAgICAgICAgPGNvZGU+LmphcjwvY29kZT4gZmlsZXMgZnJvbSA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+IHRvCisgICAgICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4sIHRoZXJlZm9yZSAmcXVvdDtpbgorICAgICAgICA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+JnF1b3Q7IHNoYWxsIG1lYW4gJnF1b3Q7ZWl0aGVyIGluIHlvdXIKKyAgICAgICAgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvcgorICAgICAgICA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+JnF1b3Q7IGZvciB0aGUgcmVzdCBvZiB0aGlzCisgICAgICAgIGFuc3dlci48L3A+CisKKyAgICAgICAgPHA+VGhlIHJvb3Qgb2YgdGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgY2xhc3MgdGhhdCBuZWVkcyB0aGUKKyAgICAgICAgZXh0ZXJuYWwgbGlicmFyeSBpcyBvbiB0aGUgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPi48L3A+CisKKyAgICAgICAgPHA+TGV0J3Mgc2VlIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBsb2FkIHRoZSAmbHQ7anVuaXQmZ3Q7CisgICAgICAgIHRhc2suICBBbnQmYXBvcztzIGNsYXNzIGxvYWRlciB3aWxsIGNvbnN1bHQgdGhlCisgICAgICAgIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIgZmlyc3QsIHdoaWNoIHRyaWVzIHRvIGxvYWQgY2xhc3NlcyBmcm9tCisgICAgICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4uICBUaGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlcgorICAgICAgICBkb2VzbiZhcG9zO3Qga25vdyBhbnl0aGluZyBhYm91dCBBbnQmYXBvcztzIGNsYXNzIGxvYWRlciBvcgorICAgICAgICBldmVuIHRoZSBwYXRoIHlvdSBoYXZlIHNwZWNpZmllZC48L3A+CisKKyAgICAgICAgPHA+SWYgdGhlIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIgY2FuIGxvYWQgdGhlIGNsYXNzIEFudCBoYXMKKyAgICAgICAgYXNrZWQgaXQgdG8gbG9hZCAod2hpY2ggaXQgY2FuIGlmIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4gaXMKKyAgICAgICAgcGFydCBvZiA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+KSwgdGhpcyBjbGFzcyB3aWxsIHRyeSB0byBsb2FkCisgICAgICAgIHRoZSBleHRlcm5hbCBsaWJyYXJ5IGZyb20gPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBhcyB3ZWxsIC0gaXQKKyAgICAgICAgZG9lc24mYXBvczt0IGtub3cgYW55dGhpbmcgZWxzZSAtIGFuZCB3aWxsIG5vdCBmaW5kIGl0IHVubGVzcworICAgICAgICB0aGUgbGlicmFyeSBpcyBpbiA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGFzIHdlbGwuPC9wPgorCisgICAgICAgIDxwPlRvIHNvbHZlIHRoaXMsIHlvdSBoYXZlIHR3byBtYWpvciBvcHRpb25zOjwvcD4KKworICAgICAgICA8b2w+CisgICAgICAgICAgPGxpPnB1dCBhbGwgZXh0ZXJuYWwgbGlicmFyaWVzIHlvdSBuZWVkIGluCisgICAgICAgICAgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBhcyB3ZWxsIHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQsCisgICAgICAgICAgb3RoZXJ3aXNlIHlvdSB3b3VsZG4mYXBvczt0IGhhdmUgZm91bmQgdGhpcyBGQVEgZW50cnkuPC9saT4KKworICAgICAgICAgIDxsaT5yZW1vdmUgdGhlIGNsYXNzIHRoYXQgbG9hZHMgdGhlIGV4dGVybmFsIGxpYnJhcnkgZnJvbQorICAgICAgICAgIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LjwvbGk+CisgICAgICAgIDwvb2w+CisKKyAgICAgICAgPHA+VGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gcmVtb3ZlCisgICAgICAgIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4gZnJvbSA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+LiAgSWYKKyAgICAgICAgeW91IGRvIHNvLCB5b3Ugd2lsbCBoYXZlIHRvIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gYWxsCisgICAgICAgIG9wdGlvbmFsIHRhc2tzIGFuZCB1c2UgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPgorICAgICAgICBlbGVtZW50cyBpbiB0aGUgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiB0YXNrcyB0aGF0IHBvaW50CisgICAgICAgIHRvIHRoZSBuZXcgbG9jYXRpb24gb2YgPGNvZGU+b3B0aW9uYWwuamFyPC9jb2RlPi4gIEFsc28sCisgICAgICAgIGRvbiZhcG9zO3QgZm9yZ2V0IHRvIGFkZCB0aGUgbmV3IGxvY2F0aW9uIG9mCisgICAgICAgIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4gdG8gdGhlCisgICAgICAgIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBvZiB5b3VyCisgICAgICAgIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IG9yIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+CisgICAgICAgIHRhc2suPC9wPgorCisgICAgICAgIDxwPklmIHlvdSB3YW50IHRvIGF2b2lkIHRvIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gYWxsCisgICAgICAgIG9wdGlvbmFsIHRhc2tzIHlvdSBuZWVkLCB0aGUgb25seSBvdGhlciBvcHRpb24gaXMgdG8gcmVtb3ZlCisgICAgICAgIHRoZSBjbGFzc2VzIHRoYXQgc2hvdWxkIG5vdCBiZSBsb2FkZWQgdmlhIHRoZSBib290c3RyYXAgY2xhc3MKKyAgICAgICAgbG9hZGVyIGZyb20gPGNvZGU+b3B0aW9uYWwuamFyPC9jb2RlPiBhbmQgcHV0IHRoZW0gaW50byBhCisgICAgICAgIHNlcGFyYXRlIGFyY2hpdmUuIEFkZCB0aGlzIHNlcGFyYXRlIGFyY2hpdmUgdG8gdGhlCisgICAgICAgIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBvZiB5b3VyCisgICAgICAgIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IG9yIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IHRhc2sKKyAgICAgICAgLSBhbmQgbWFrZSBzdXJlIHRoZSBzZXBhcmF0ZSBhcmNoaXZlIGlzIG5vdCBpbgorICAgICAgICA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LjwvcD4KKworICAgICAgICA8cD5JbiB0aGUgY2FzZSBvZiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB5b3UmYXBvcztkIGhhdmUKKyAgICAgICAgdG8gcmVtb3ZlIGFsbCBjbGFzc2VzIHRoYXQgYXJlIGluIHRoZQorICAgICAgICA8Y29kZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdDwvY29kZT4KKyAgICAgICAgZGlyZWN0b3J5LCBpbiB0aGUgPGNvZGU+Jmx0O3N0eWxlJmd0OzwvY29kZT4gY2FzZSBpdCBpcyBvbmUgb2YKKyAgICAgICAgdGhlIDxjb2RlPipMaWFpc29uPC9jb2RlPiBjbGFzc2VzIGluCisgICAgICAgIDxjb2RlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsPC9jb2RlPi48L3A+CisKKyAgICAgICAgPHA+SWYgeW91IHVzZSB0aGUgb3B0aW9uIHRvIGJyZWFrIHVwIDxjb2RlPm9wdGlvbmFsLmphcjwvY29kZT4KKyAgICAgICAgZm9yIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IG9yIHJlbW92ZQorICAgICAgICA8Y29kZT5hbnQtanVuaXQuamFyPC9jb2RlPiwgeW91IHN0aWxsIGhhdmUgdG8gdXNlIGEKKyAgICAgICAgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiB3aXRoIGEgbmVzdGVkCisgICAgICAgIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiB0byBkZWZpbmUgdGhlIGp1bml0IHRhc2suPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJkZWxlZ2F0aW5nLWNsYXNzbG9hZGVyLTEuNiI+CisgICAgICA8cXVlc3Rpb24+Jmx0O3N0eWxlJmd0OyBvciAmbHQ7anVuaXQmZ3Q7IGlnbm9yZXMgbXkKKyAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7IC0gQW50IDEuNi54IHZlcnNpb248L3F1ZXN0aW9uPgorCisgICAgICA8YW5zd2VyPgorICAgICAgICA8cD5QbGVhc2UgcmVhZCA8YSBocmVmPSIjZGVsZWdhdGluZy1jbGFzc2xvYWRlciI+dGhlIGdlbmVyYWwKKyAgICAgICAgZW50cnk8L2E+IGJlZm9yZSB5b3UgZ28gYWhlYWQuPC9wPgorCisgICAgICAgIDxwPlRoZSB3cmFwcGVyIHNjcmlwdCBvZiBBbnQgMS42Lnggbm8gbG9uZ2VyIGFkZHMgdGhlIGNvbnRlbnRzCisgICAgICAgIG9mIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4gdG8gPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiwKKyAgICAgICAgaW5zdGVhZCBBbnQgd2lsbCBjcmVhdGUgYSBjbGFzc2xvYWRlciBvbiB0b3Agb2YgdGhlIGJvb3RzdHJhcAorICAgICAgICBjbGFzc2xvYWRlciAtIGxldCdzIGNhbGwgaXQgdGhlIGNvcmVsb2FkZXIgZm9yIHRoZSByZXN0IG9mCisgICAgICAgIHRoaXMgYW5zd2VyIC0gd2hpY2ggaG9sZHMgdGhlIGNvbnRlbnRzIG9mCisgICAgICAgIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4uICBBbnQncyBjb3JlIGFuZCBpdHMgdGFza3Mgd2lsbCBiZQorICAgICAgICBsb2FkZWQgdGhyb3VnaCB0aGlzIGNsYXNzbG9hZGVyIGFuZCBub3QgdGhlIGJvb3RzdHJhcAorICAgICAgICBjbGFzc2xvYWRlci48L3A+CisKKyAgICAgICAgPHA+VGhpcyBjYXVzZXMgc29tZSBzbWFsbCBidXQgbm90YWJsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIEFudAorICAgICAgICAxLjUueCBhbmQgMS42LnguICBNb3N0IGltcG9ydGFudGx5LCBhIHRoaXJkLXBhcnR5IHRhc2sgdGhhdCBpcworICAgICAgICBwYXJ0IG9mIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gd2lsbCBubyBsb25nZXIgd29yayBpbiBBbnQKKyAgICAgICAgMS42Lnggc2luY2UgdGhlIHRhc2sgbm93IGNhbid0IGZpbmQgQW50J3MgY2xhc3Nlcy4gIEluIGEgc2Vuc2UKKyAgICAgICAgdGhpcyBpcyB0aGUgc2FtZSBwcm9ibGVtIHRoaXMgZW50cnkgaXMgYWJvdXQsIG9ubHkKKyAgICAgICAgPGNvZGU+YW50LmphcjwvY29kZT4gaGFzIGJlY29tZSB0aGUgZXh0ZXJuYWwgbGlicmFyeSBpbgorICAgICAgICBxdWVzdGlvbiBub3cuPC9wPgorCisgICAgICAgIDxwPlRoaXMgY29yZWxvYWRlciBhbHNvIGhvbGRzIHRoZSBjb250ZW50cyBvZgorICAgICAgICA8Y29kZT5+Ly5hbnQvbGliPC9jb2RlPiBhbmQgYW55IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgaGFzCisgICAgICAgIGJlZW4gc3BlY2lmaWVkIHVzaW5nIEFudCdzIDxjb2RlPi1saWI8L2NvZGU+IGNvbW1hbmQgbGluZQorICAgICAgICBhcmd1bWVudC48L3A+CisKKyAgICAgICAgPHA+TGV0J3Mgc2VlIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBsb2FkIHRoZSAmbHQ7anVuaXQmZ3Q7CisgICAgICAgIHRhc2suICBBbnQmYXBvcztzIGNsYXNzIGxvYWRlciB3aWxsIGNvbnN1bHQgdGhlIGJvb3RzdHJhcAorICAgICAgICBjbGFzcyBsb2FkZXIgZmlyc3QsIHdoaWNoIHRyaWVzIHRvIGxvYWQgY2xhc3NlcyBmcm9tCisgICAgICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4uICBUaGUgYm9vdHN0cmFwIGNsYXNzIGxvYWRlcgorICAgICAgICBkb2VzbiZhcG9zO3Qga25vdyBhbnl0aGluZyBhYm91dCBBbnQmYXBvcztzIGNsYXNzIGxvYWRlciBvcgorICAgICAgICBldmVuIHRoZSBwYXRoIHlvdSBoYXZlIHNwZWNpZmllZC4gIElmIGl0IGZhaWxzIHRvIGZpbmQgdGhlCisgICAgICAgIGNsYXNzIHVzaW5nIHRoZSBib290c3RyYXAgY2xhc3Nsb2FkZXIgaXQgd2lsbCB0cnkgdGhlCisgICAgICAgIGNvcmVsb2FkZXIgbmV4dC4gIEFnYWluLCB0aGUgY29yZWxvYWRlciBkb2Vzbid0IGtub3cgYW55dGhpbmcKKyAgICAgICAgYWJvdXQgeW91ciBwYXRoLjwvcD4KKworICAgICAgICA8cD5JZiB0aGUgY29yZWxvYWRlciBjYW4gbG9hZCB0aGUgY2xhc3MgQW50IGhhcyBhc2tlZCBpdCB0bworICAgICAgICBsb2FkICh3aGljaCBpdCBjYW4gaWYgPGNvZGU+YW50LWp1bml0LmphcjwvY29kZT4gaXMgaW4KKyAgICAgICAgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPiksIHRoaXMgY2xhc3Mgd2lsbCB0cnkgdG8gbG9hZCB0aGUKKyAgICAgICAgZXh0ZXJuYWwgbGlicmFyeSBmcm9tIGNvcmVsb2FkZXIgYXMgd2VsbCAtIGl0IGRvZXNuJmFwb3M7dAorICAgICAgICBrbm93IGFueXRoaW5nIGVsc2UgLSBhbmQgd2lsbCBub3QgZmluZCBpdCB1bmxlc3MgdGhlIGxpYnJhcnkKKyAgICAgICAgaXMgaW4gPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBvciB0aGUgY29yZWxvYWRlciBhcyB3ZWxsLjwvcD4KKworICAgICAgICA8cD5UbyBzb2x2ZSB0aGlzLCB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIG1ham9yIG9wdGlvbnM6PC9wPgorCisgICAgICAgIDxvbD4KKyAgICAgICAgICA8bGk+cHV0IGFsbCBleHRlcm5hbCBsaWJyYXJpZXMgeW91IG5lZWQgaW4KKyAgICAgICAgICA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGFzIHdlbGwgdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCwKKyAgICAgICAgICBvdGhlcndpc2UgeW91IHdvdWxkbiZhcG9zO3QgaGF2ZSBmb3VuZCB0aGlzIEZBUSBlbnRyeS48L2xpPgorCisgICAgICAgICAgPGxpPnB1dCBhbGwgZXh0ZXJuYWwgbGlicmFyaWVzIHlvdSBuZWVkIGluCisgICAgICAgICAgPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPiBvciA8Y29kZT4uYW50L2xpYjwvY29kZT4uICBUaGlzCisgICAgICAgICAgcHJvYmFibHkgc3RpbGwgaXNuJ3Qgd2hhdCB5b3Ugd2FudCwgYnV0IHlvdSBtaWdodCByZWNvbnNpZGVyCisgICAgICAgICAgdGhlIDxjb2RlPi5hbnQvbGliPC9jb2RlPiBvcHRpb24uPC9saT4KKworICAgICAgICAgIDxsaT5BbHdheXMgc3RhcnQgQW50IHdpdGggdGhlIDxjb2RlPi1saWI8L2NvZGU+IGNvbW1hbmQgbGluZQorICAgICAgICAgIHN3aXRjaCBhbmQgcG9pbnQgdG8geW91ciBleHRlcm5hbCBsaWJyYXJpZXMgKG9yIHRoZQorICAgICAgICAgIGRpcmVjdG9yaWVzIGhvbGRpbmcgdGhlbSkuPC9saT4KKworICAgICAgICAgIDxsaT5yZW1vdmUgdGhlIGNsYXNzIHRoYXQgbG9hZHMgdGhlIGV4dGVybmFsIGxpYnJhcnkgZnJvbQorICAgICAgICAgIHRoZSBjb3JlbG9hZGVyLjwvbGk+CisgICAgICAgIDwvb2w+CisKKyAgICAgICAgPHA+SW4gQW50IDEuNiA8Y29kZT5vcHRpb25hbC5qYXI8L2NvZGU+IGhhcyBiZWVuIHNwbGl0IGludG8KKyAgICAgICAgbXVsdGlwbGUgamFycywgZWFjaCBvbmUgY29udGFpbmluZyBjbGFzc2VzIHdpdGggdGhlIHNhbWUKKyAgICAgICAgZGVwZW5kZW5jaWVzIG9uIGV4dGVybmFsIGxpYnJhcmllcy4gIFlvdSBjYW4gbW92ZSB0aGUKKyAgICAgICAgIm9mZmVuZGluZyIgamFyIG91dCBvZiA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+LiAgRm9yIHRoZQorICAgICAgICA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB0YXNrIGl0IHdvdWxkIGJlCisgICAgICAgIDxjb2RlPmFudC1qdW5pdC5qYXI8L2NvZGU+IGFuZCBmb3IgPGNvZGU+Jmx0O3N0eWxlJmd0OzwvY29kZT4KKyAgICAgICAgaXQgd291bGQgYmUgPGNvZGU+YW50LXRyYXguamFyPC9jb2RlPgorICAgICAgICBvciA8Y29kZT5hbnQteHNscC5qYXI8L2NvZGU+IC0gCisgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgcHJvY2Vzc29yIHlvdSB1c2UuPC9wPgorCisgICAgICAgIDxwPklmIHlvdSBkbyBzbywgeW91IHdpbGwgaGF2ZSB0byA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+CisgICAgICAgIGFsbCBvcHRpb25hbCB0YXNrcyB0aGF0IG5lZWQgdGhlIGV4dGVybmFsIGxpYnJhcnkgYW5kIHVzZQorICAgICAgICBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnRzIGluIHRoZQorICAgICAgICA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IHRhc2tzIHRoYXQgcG9pbnQgdG8gdGhlIG5ldworICAgICAgICBsb2NhdGlvbiBvZiA8Y29kZT5hbnQtKi5qYXI8L2NvZGU+LiAgQWxzbywgZG9uJmFwb3M7dCBmb3JnZXQKKyAgICAgICAgdG8gYWRkIHRoZSBuZXcgbG9jYXRpb24gb2YgPGNvZGU+YW50LSouamFyPC9jb2RlPiB0byB0aGUKKyAgICAgICAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IG9mIHlvdXIKKyAgICAgICAgPGNvZGU+Jmx0O3N0eWxlJmd0OzwvY29kZT4gb3IgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4KKyAgICAgICAgdGFzay48L3A+CisKKyAgICAgICAgPHA+Rm9yIGV4YW1wbGU8L3A+CisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgPHRhc2tkZWYgbmFtZT0ianVuaXQiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUYXNrIj4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iSE9NRS1PRi9qdW5pdC5qYXIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJORVctSE9NRS1PRi9hbnQtanVuaXQuamFyIi8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L3Rhc2tkZWY+CitdXT48L3NvdXJjZT4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0id2lueHAtamRrMTQtYW50MTQiPgorICAgICAgPHF1ZXN0aW9uPldoZW4gcnVubmluZyBBbnQgMS40IG9uIFdpbmRvd3MgWFAgYW5kIEpESyAxLjQsIEkgZ2V0CisgICAgICB2YXJpb3VzIGVycm9ycyB3aGVuIHRyeWluZyB0byA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+LCBmb3JrCisgICAgICA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IG9yIGFjY2VzcyBlbnZpcm9ubWVudAorICAgICAgdmFyaWFibGVzLjwvcXVlc3Rpb24+CisKKyAgICAgIDxhbnN3ZXI+CisKKyAgICAgICAgPHA+QW50ICZsdDsgMS41IGRvZXNuJmFwb3M7dCByZWNvZ25pemUgV2luZG93cyBYUCBhcyBhIGZsYXZvcgorICAgICAgICBvZiBXaW5kb3dzIHRoYXQgcnVucyA8Y29kZT5DTUQuRVhFPC9jb2RlPiBpbnN0ZWFkIG9mCisgICAgICAgIDxjb2RlPkNPTU1BTkQuQ09NPC9jb2RlPi4gIEpESyAxLjMgd2lsbCB0ZWxsIEFudCB0aGF0IFdpbmRvd3MKKyAgICAgICAgWFAgaXMgV2luZG93cyAyMDAwIHNvIHRoZSBwcm9ibGVtIGRvZXNuJmFwb3M7dCBzaG93IHVwCisgICAgICAgIHRoZXJlLjwvcD4KKworICAgICAgICA8cD5BcGFydCBmcm9tIHVwZ3JhZGluZyB0byBBbnQgMS41IG9yIGJldHRlciwgc2V0dGluZyB0aGUKKyAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgPGNvZGU+QU5UX09QVFM8L2NvZGU+IHRvCisgICAgICAgIDxjb2RlPi1Eb3MubmFtZT1XaW5kb3dzX05UPC9jb2RlPiBwcmlvciB0byBpbnZva2luZyBBbnQgaGFzCisgICAgICAgIGJlZW4gY29uZmlybWVkIGFzIGEgd29ya2Fyb3VuZC48L3A+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9IjEuNS1jeWd3aW4tc2giPgorICAgICAgPHF1ZXN0aW9uPlRoZSA8Y29kZT5hbnQ8L2NvZGU+IHdyYXBwZXIgc2NyaXB0IG9mIEFudCAxLjUgZmFpbHMKKyAgICAgIGZvciBDeWd3aW4gaWYgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IGlzIHNldCB0byBhIFdpbmRvd3Mgc3R5bGUKKyAgICAgIHBhdGguPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisKKyAgICAgICAgPHA+VGhpcyBwcm9ibGVtIGhhcyBiZWVuIHJlcG9ydGVkIG9ubHkgaG91cnMgYWZ0ZXIgQW50IDEuNSBoYXMKKyAgICAgICAgYmVlbiByZWxlYXNlZCwgc2VlIDxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTA2NjQiPkJ1ZworICAgICAgICAxMDY2NDwvYT4gYW5kIGFsbCBpdHMgZHVwbGljYXRlcy48L3A+CisKKyAgICAgICAgPHA+QSBmaXhlZCB2ZXJzaW9uIG9mIHRoZSB3cmFwcGVyIHNjcmlwdCBjYW4gYmUgZm91bmQgPGEKKyAgICAgICAgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL29sZC1yZWxlYXNlcy92MS41L2VycmF0YS8iPmhlcmU8L2E+LgorICAgICAgICBTaW1wbHkgcmVwbGFjZSB5b3VyIHNjcmlwdCB3aXRoIHRoaXMgdmVyc2lvbi48L3A+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9IjEuNS4yLXppcC1icm9rZW4iPgorICAgICAgPHF1ZXN0aW9uPjxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPiBpcyBicm9rZW4gaW4gQW50IDEuNS4yLjwvcXVlc3Rpb24+CisgICAgICA8YW5zd2VyPgorCisgICAgICAgIDxwPlllcywgaXQgaXMuPC9wPgorCisgICAgICAgIDxwPlRoZSBwcm9ibGVtIHJlcG9ydGVkIGJ5IG1vc3QgcGVvcGxlIC0gc2VlIDxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTc2NDgiPkJ1ZworICAgICAgICAxNzY0ODwvYT4gYW5kIGFsbCBpdHMgZHVwbGljYXRlcyAtIGlzIHRoYXQgQW50IGNyZWF0ZXMKKyAgICAgICAgYXJjaGl2ZXMgdGhhdCBhIHBhcnRpYWxseSB1bnJlYWRhYmxlIGJ5IFdpblpJUC4gIEx1Y2tpbHkKKyAgICAgICAgPGNvZGU+amFyPC9jb2RlPiBkZWFscyB3aXRoIHRoZSBhcmNoaXZlcyBhbmQgc28gdGhlIGdlbmVyYXRlZAorICAgICAgICBqYXJzL3dhcnMvZWFycyB3aWxsIG1vc3QgbGlrZWx5IHdvcmsgZm9yIHlvdSBhbnl3YXkuPC9wPgorCisgICAgICAgIDxwPlRoZXJlIGFyZSBhZGRpdGlvbmFsIHByb2JsZW1zLCBzZWUgYnVncyA8YQorICAgICAgICBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3NzgwIj5CdWcKKyAgICAgICAgMTc3ODA8L2E+LCA8YQorICAgICAgICBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3ODcxIj5CdWcKKyAgICAgICAgMTc4NzE8L2E+IGFuZCA8YQorICAgICAgICBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE4NDAzIj5CdWcKKyAgICAgICAgMTg0MDM8L2E+LiAgQWxsIG9mIHRoZW0gYXJlIHN1cHBvc2VkIHRvIGJlIGZpeGVkIHdpdGggQW50CisgICAgICAgIDEuNS4zIChhbmQgb25seSAxODQwMyBzaG91bGQgZXhpc3QgaW4gMS41LjNiZXRhMSkuPC9wPgorICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJ1bmtub3duZWxlbWVudC50YXNrY29udGFpbmVyIj4KKyAgICAgIDxxdWVzdGlvbj4KKyAgICAgICAgV2h5IGRvIG15IGN1c3RvbSB0YXNrIGNvbnRhaW5lcnMgc2VlIFVua25vd24gRWxlbWVudHMgaW4gQW50IDEuNgorICAgICAgICAtIHRoZXkgd29ya2VkIGluIEFudCAxLjU/CisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHA+CisgICAgICAgICAgVGhlIG9iamVjdHMgYWRkZWQgaW4gVGFza0NvbnRhaW5lci5hZGRUYXNrKFRhc2sgdGFzaykKKyAgICAgICAgICBoYXZlIGNoYW5nZWQgZnJvbSAgVGFza3MgdG8gVW5rbm93bkVsZW1lbnRzLgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgIFRoZXJlIHdhcyBhIG51bWJlciBvZiB2YWxpZCByZWFzb25zIGZvciB0aGlzIGNoYW5nZS4gQnV0IHRoZSBiYWNrd2FyZAorICAgICAgICAgIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2VyZSBub3Qgbm90aWNlZCB1bnRpbCBhZnRlciBBbnQgMS42LjAgd2FzCisgICAgICAgICAgcmVsZWFzZWQuCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgWW91ciBjb250YWluZXIgY2xhc3Mgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIGNoZWNrIGlmIHRoZSBUYXNrCisgICAgICAgICAgaXMgYW4gVW5rbm93bkVsZW1lbnQgYW5kIGNhbGwgcGVyZm9ybSBvbiBpdCB0bworICAgICAgICAgIGNvbnZlcnQgaXQgdG8gYSBUYXNrIGFuZCB0byBleGVjdXRlIGl0LgorICAgICAgICAgIChzZWUgYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TZXF1ZW50aWFsKQorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgIElmIHlvdSB3YW50IHRvIGRvIG1vcmUgcHJvY2Vzc2luZyBvbiB0aGUgdGFzaywKKyAgICAgICAgICB5b3UgbmVlZCB0byB1c2UgdGhlIHRlY2huaXF1ZXMgaW4gYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnRsaWIjZXhlY3V0ZSgpCisgICAgICAgICAgVGhpcyBkb2VzIG1ha2UgdXNlIG9mIG9uZSAxLjYgbWV0aG9kIGNhbGwgKFVFI2dldFJlYWxPYmplY3QoKSksCisgICAgICAgICAgeW91IG5lZWQgdG8gdXNlIFVFI2dldFRhc2soKSBpbnN0ZWFkIC0gdGhpcyB3aWxsCisgICAgICAgICAgcmV0dXJuIG51bGwgZm9yIG5vbiB0YXNrcyAodHlwZXMgbGlrZSBmaWxlc2V0IGlkPXgpLgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgIFNvLi4gaXRlcmF0ZSBvdmVyIHRoZSB0YXNrcywgaWYgdGhleSBhcmUgVUVzLCBjb252ZXJ0IHRoZW0gdG8KKyAgICAgICAgICB0YXNrcywgdXNpbmcgVUUjbWF5YmVDb25maWd1cmUgYW5kIFVFI2dldFRhc2soKQorICAgICAgICA8L3A+CisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRhc2tzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICBUYXNrIHQgPSAoVGFzaykgaS5uZXh0KCk7CisgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgVW5rbm93bkVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgKChVbmtub3duRWxlbWVudCkgdCkubWF5YmVDb25maWd1cmUoKTsKKyAgICAgICAgICAgICAgdCA9ICgoVW5rbm93bkVsZW1lbnQpIHQpLmdldFRhc2soKTsKKyAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICAvLyAuLi4uIG9yaWdpbmFsIEN1c3RvbSBjb2RlCisgICAgICAgIH0KKyAgICAgICAgXV0+PC9zb3VyY2U+CisgICAgICAgIDxwPgorICAgICAgICAgIFRoaXMgYXBwcm9hY2ggc2hvdWxkIHdvcmsgZm9yIGFudDEuNSBhbmQgYW50MS42LgorICAgICAgICA8L3A+CisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKworICAgIDxmYXEgaWQ9ImphdmEuZXhjZXB0aW9uLnN0YWNrdHJhY2UiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICBUaGUgcHJvZ3JhbSBJIHJ1biB2aWEgJmx0O2phdmEmZ3Q7IHRocm93cyBhbiBleGNlcHRpb24gYnV0IEkKKyAgICAgICAgY2FuJ3Qgc2VlbSB0byBnZXQgdGhlIGZ1bGwgc3RhY2sgdHJhY2UuCisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKyAgICAgICAgPHA+VGhpcyBpcyBhIGtub3cgYnVnIHRoYXQgaGFzIGJlZW4gZml4ZWQgYWZ0ZXIgdGhlIHJlbGVhc2Ugb2YKKyAgICAgICAgQW50IDEuNi4xLjwvcD4KKworICAgICAgICA8cD5BcyBhIHdvcmthcm91bmQsIHJ1biB5b3VyICZsdDtqYXZhJmd0OyB0YXNrIHdpdGgKKyAgICAgICAgPGNvZGU+Zm9yaz0idHJ1ZSI8L2NvZGU+IGFuZCBBbnQgd2lsbCBkaXNwbGF5IHRoZSBmdWxsCisgICAgICAgIHRyYWNlLjwvcD4KKyAgICAgIDwvYW5zd2VyPgorICAgIDwvZmFxPgorCisgICAgPGZhcSBpZD0ianVuaXQtbm8tcnVudGltZS14bWwiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICBVc2luZyBmb3JtYXQ9JnF1b3Q7eG1sJnF1b3Q7LCAmbHQ7anVuaXQmZ3Q7IGZhaWxzIHdpdGggYQorICAgICAgICA8Y29kZT5Ob0NsYXNzRGVmRm91bmRFcnJvcjwvY29kZT4gaWYgZm9ya2VkLgorICAgICAgPC9xdWVzdGlvbj4KKyAgICAgIDxhbnN3ZXI+CisKKyAgICAgICAgPHA+VGhlIFhNTCBmb3JtYXR0ZXIgbmVlZHMgdGhlIDxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0RPTS8iPkRPTSBjbGFzc2VzPC9hPiB0byB3b3JrLiAgSWYgeW91CisgICAgICAgIGFyZSB1c2luZyBKREsgMS40IG9yIGxhdGVyIHRoZXkgYXJlIGluY2x1ZGVkIHdpdGggeW91ciBKYXZhCisgICAgICAgIFJ1bnRpbWUgYW5kIHRoaXMgcHJvYmxlbSB3b24ndCBvY2N1ci4gIElmIHlvdSBhcmUgcnVubmluZyBKREsKKyAgICAgICAgMS4zIG9yIGVhcmxpZXIsIHRoZSBET00gY2xhc3NlcyBoYXZlIHRvIGJlIG9uIHlvdXIKKyAgICAgICAgJmx0O2p1bml0Jmd0OyB0YXNrJ3MgJmx0O2NsYXNzcGF0aCZndDsuPC9wPgorCisgICAgICAgIDxwPlByaW9yIHRvIEFudCAxLjYuMCBBbnQgd291bGQgaW5jbHVkZSB0aGUgRE9NIGNsYXNzZXMgZnJvbQorICAgICAgICB0aGUgWE1MIHBhcnNlciB0aGF0IGlzIHVzZWQgYnkgQW50IGl0c2VsZiBpZiB5b3Ugc2V0IHRoZQorICAgICAgICBpbmNsdWRlQW50UnVudGltZSBhdHRyaWJ1dGUgdG8gdHJ1ZSAodGhlIGRlZmF1bHQpLiAgV2l0aCBBbnQKKyAgICAgICAgMS42LjAgdGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGFzIHRoaXMgYmVoYXZpb3IgbWFkZSBpdAorICAgICAgICBpbXBvc3NpYmxlIHRvIHVzZSBhIGRpZmZlcmVudCBYTUwgcGFyc2VyIGluIHlvdXIgdGVzdHMuPC9wPgorCisgICAgICAgIDxwPlRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgdGhlIERPTSBjbGFzc2VzCisgICAgICAgIGV4cGxpY2l0bHkgc3RhcnRpbmcgd2l0aCBBbnQgMS42LjAuICBJZiB5b3UgZG9uJ3QgbmVlZCB0byBzZXQKKyAgICAgICAgdXAgYSBkaWZmZXJlbnQgWE1MIHBhcnNlciBmb3IgeW91ciB0ZXN0cywgdGhlIGVhc2llc3Qgc29sdXRpb24KKyAgICAgICAgaXMgdG8gYWRkPC9wPgorCisgICAgICAgIDxzb3VyY2U+PCFbQ0RBVEFbCis8cGF0aGVsZW1lbnQgcGF0aD0iJHthbnQuaG9tZX0vbGliL3htbC1hcGlzLmphcjoke2FudC5ob21lfS9saWIveGVyY2VzSW1wbC5qYXIiLz4KK11dPjwvc291cmNlPgorCisgICAgICAgIDxwPnRvIHlvdXIgdGFzaydzICZsdDtjbGFzc3BhdGgmZ3Q7LjwvcD4KKworICAgICAgPC9hbnN3ZXI+CisgICAgPC9mYXE+CisKKyAgICA8ZmFxIGlkPSJ4YWxhbi1qZGsxLjUiPgorICAgICAgPHF1ZXN0aW9uPgorICAgICAgICA8Y29kZT4mbHQ7anVuaXRyZXBvcnQmZ3Q7PC9jb2RlPiBkb2Vzbid0IHdvcmsgd2l0aCBKREsgMS41IGJ1dAorICAgICAgICB3b3JrZWQgZmluZSB3aXRoIEpESyAxLjQuCisgICAgICA8L3F1ZXN0aW9uPgorICAgICAgPGFuc3dlcj4KKworICAgICAgICA8cD5XaGlsZSBKREsgMS40LnggY29udGFpbnMgYSB2ZXJzaW9uIG9mIFhhbGFuLUogMiwgSkRLIDEuNQorICAgICAgICAoYW5kIGxhdGVyPykgaGF2ZSA8YQorICAgICAgICBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvY29tcGF0aWJpbGl0eS5odG1sIzQ5NTk3ODMiPm1vdmVkCisgICAgICAgIHRvIFhTTFRDPC9hPi4gIFNpbmNlIHRoaXMgdGFzayB1c2VzIFhhbGFuJ3MgcmVkaXJlY3QKKyAgICAgICAgZXh0ZW5zaW9ucyBmb3IgaXRzIGludGVybmFsIHN0eWxlc2hlZXQsIEFudCBwcmlvciB0byAxLjYuMiBkaWRuJ3Qgc3VwcG9ydAorICAgICAgICBYU0xUQy4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSB0byBpbnN0YWxsIDxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi1qLyI+WGFsYW4tSiAyPC9hPiBpbiBvcmRlcgorICAgICAgICB0byB1c2UgdGhpcyB0YXNrIHdpdGggSkRLIDEuNSBpbiBvbGRlciB2ZXJzaW9ucyBvZiBBbnQuPC9wPgorCisgICAgICAgIDxwPlN0YXJ0aW5nIHdpdGggQW50IDEuNi4yIDxjb2RlPiZsdDtqdW5pdHJlcG9ydCZndDs8L2NvZGU+CisgICAgICAgIHN1cHBvcnRzIEpESyAxLjUuPC9wPgorCisgICAgICA8L2Fuc3dlcj4KKyAgICA8L2ZhcT4KKyAgPC9mYXFzZWN0aW9uPgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3MvaW5kZXgueG1sIGIvdHJ1bmsveGRvY3MvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGNkOTIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9pbmRleC54bWwKQEAgLTAsMCArMSwxNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iIj5Db25vciBNYWNOZWlsbDwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9InN0ZWZhbi5ib2Rld2lnQGZyZWVuZXQuZGUiPlN0ZWZhbiBCb2Rld2lnPC9hdXRob3I+CisgICAgPHRpdGxlPldlbGNvbWU8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorICA8c2VjdGlvbiBuYW1lPSJBcGFjaGUgSXZ5IGlzIGFuIEFudCBTdWItUHJvamVjdCBOb3chIj4KKyAgICA8aDM+T2N0b2JlciAxMSwgMjAwNyAtIEFwYWNoZSBJdnkgaXMgYW4gQW50IFN1Yi1Qcm9qZWN0IE5vdyE8L2gzPgorCisgICAgPHA+QXBhY2hlIEl2eSwgIkEgSmF2YSBiYXNlZCB0b29sIGZvciB0cmFja2luZywgcmVzb2x2aW5nIGFuZAorICAgIG1hbmFnaW5nIHByb2plY3QgZGVwZW5kZW5jaWVzLiIsIGp1c3QgZmluaXNoZWQgPGEKKyAgICBocmVmPSJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvIj5JbmN1YmF0aW9uPC9hPiBhbmQgaGFzIGpvaW5lZAorICAgIHRoZSBBbnQgcHJvamVjdC4gIE1vcmUgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgQW50CisgICAgc2l0ZSBzb29uLjwvcD4KKworICAgIDxwPlVudGlsIHdlJ3ZlIGZpbmlzaGVkIHRoZSBtaWdyYXRpb24sIHlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dAorICAgIEl2eSBmcm9tIGl0cyA8YSBocmVmPSJodHRwOi8vaW5jdWJhdG9yLmFwYWNoZS5vcmcvaXZ5LyI+SW5jdWJhdG9yCisgICAgd2Vic2l0ZTwvYT4uPC9wPgorICA8L3NlY3Rpb24+CisKKyAgIDxzZWN0aW9uIG5hbWU9IkFudCAxLjcuMCI+CisgICAgPGgzPkRlY2VtYmVyIDE5LCAyMDA2IC0gQW50IDEuNy4wIEF2YWlsYWJsZTwvaDM+CisgICAgPHA+QXBhY2hlIEFudCAxLjcuMCBpcyBub3cgYXZhaWxhYmxlIGZvciA8YQorICAgIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPmRvd25sb2FkPC9hPi48L3A+CisKKyAgICA8cD5BbnQgMS43IGludHJvZHVjZXMgYSByZXNvdXJjZSBmcmFtZXdvcmsuIFNvbWUgb2YgdGhlIGNvcmUgYW50IAorICAgIHRhc2tzIHN1Y2ggYXMgJmx0O2NvcHkvJmd0OyBhcmUgbm93IGFibGUgdG8gcHJvY2VzcyBub3Qgb25seSBmaWxlIAorICAgIHN5c3RlbSByZXNvdXJjZXMgYnV0IGFsc28gemlwIGVudHJpZXMsIHRhciBlbnRyaWVzLCBwYXRocywgLi4uIAorICAgIFJlc291cmNlIGNvbGxlY3Rpb25zIGdyb3VwIHJlc291cmNlcywgYW5kIGNhbiBiZSBmdXJ0aGVyIAorICAgIGNvbWJpbmVkIHdpdGggb3BlcmF0b3JzIHN1Y2ggYXMgdW5pb24gYW5kIGludGVyc2VjdGlvbi4gVGhpcyAKKyAgICBjYW4gYmUgZXh0ZW5kZWQgYnkgY3VzdG9tIHJlc291cmNlcyBhbmQgY3VzdG9tIHRhc2tzIHVzaW5nIHJlc291cmNlcy48L3A+CisKKyAgICA8cD4KKyAgICBBbnQgMS43IHN0YXJ0cyBvdXRzb3VyY2luZyBvZiBvcHRpb25hbCB0YXNrcyB0byBBbnRsaWJzLiAKKyAgICBUaGUgLk5FVCBhbnRsaWIgaW4gcHJlcGFyYXRpb24gd2lsbCByZXBsYWNlIHRoZSAuTkVUIG9wdGlvbmFsIHRhc2tzIHdoaWNoIHNoaXAgaW4gQW50LgorICAgIFN1cHBvcnQgZm9yIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIFN1YnZlcnNpb24gd2lsbCBiZSBvbmx5IHByb3ZpZGVkIGFzIGFuIGFudGxpYiB0bworICAgIGJlIHJlbGVhc2VkIHNob3J0bHkuIAorICAgIDwvcD4KKworICAgIDxwPkFudCAxLjcgZml4ZXMgYWxzbyBhIGxhcmdlIG51bWJlciBvZiBidWdzLjwvcD4KKworICAgIDxwPkFudCAxLjcgaGFzIHNvbWUgaW5pdGlhbCBzdXBwb3J0IGZvciBKYXZhNiBmZWF0dXJlcy48L3A+CisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJBbnRVbml0IDEuMCI+CisgICAgPGgzPkphbnVhcnkgOCwgMjAwNyAtIEFwYWNoZSBBbnRVbml0IDEuMCBBdmFpbGFibGU8L2gzPgorICAgIDxwPkFwYWNoZSBBbnRVbml0IDEuMCBpcyBub3cgYXZhaWxhYmxlIGZvciA8YQorICAgIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2JpbmRvd25sb2FkLmNnaSI+ZG93bmxvYWQ8L2E+LjwvcD4KKworICAgIDxwPlRoaXMgQW50IExpYnJhcnkgY29udGFpbnMgdGFza3MgdG8gdGVzdCBBbnQgdGFza3MgdXNpbmcgQW50CisgICAgaW5zdGVhZCBvZiBKVW5pdC4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgPGEKKyAgICBocmVmPSJhbnRsaWJzL2FudHVuaXQvIj5BbnRVbml0IGhvbWUgcGFnZTwvYT4uPC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iLk5FVCBBbnQgTGlicmFyeSAxLjAiPgorICAgIDxoMz5Ob3ZlbWJlciA2LCAyMDA2IC0gQXBhY2hlIC5ORVQgQW50IExpYnJhcnkgMS4wIEF2YWlsYWJsZTwvaDM+CisgICAgPHA+QXBhY2hlIC5ORVQgQW50IExpYnJhcnkgMS4wIGlzIG5vdyBhdmFpbGFibGUgZm9yIDxhCisgICAgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYmluZG93bmxvYWQuY2dpIj5kb3dubG9hZDwvYT4uPC9wPgorCisgICAgPHA+VGhpcyBBbnQgTGlicmFyeSBjb250YWlucyBzdXBwb3J0IGZvciB0b29scyBsaWtlIE5Vbml0IGFzIHdlbGwKKyAgICBhcyB0aGUgIm9sZCAuTkVUIHRhc2tzIG9mIEFudCdzIGNvcmUuICBJdCBoYXMgYmVlbiB0ZXN0ZWQKKyAgICBNaWNyb3NvZnQncyBmcmFtZXdvcmtzIGFzIHdlbGwgYXMgTW9uby48L3A+CisKKyAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIDxhIGhyZWY9ImFudGxpYnMvZG90bmV0LyI+QW50bGliJ3MKKyAgICBob21lIHBhZ2U8L2E+PC9wPgorICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iQXBhY2hlIEFudCI+CisKKzxwPgorQXBhY2hlIEFudCBpcyBhIEphdmEtYmFzZWQgYnVpbGQgdG9vbC4gSW4gdGhlb3J5LCBpdCBpcyBraW5kIG9mIGxpa2UKK01ha2UsIGJ1dCB3aXRob3V0IE1ha2UncyB3cmlua2xlcy4KKzwvcD4KKworPHA+CitXaHkgYW5vdGhlciBidWlsZCB0b29sIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSA8ZW0+bWFrZTwvZW0+LCA8ZW0+Z251bWFrZTwvZW0+LAorPGVtPm5tYWtlPC9lbT4sIDxlbT5qYW08L2VtPiwgYW5kCitvdGhlcnM/IEJlY2F1c2UgYWxsIHRob3NlIHRvb2xzIGhhdmUgbGltaXRhdGlvbnMgdGhhdCBBbnQncyBvcmlnaW5hbCBhdXRob3IKK2NvdWxkbid0IGxpdmUgd2l0aCB3aGVuIGRldmVsb3Bpbmcgc29mdHdhcmUgYWNyb3NzIG11bHRpcGxlIHBsYXRmb3Jtcy4gTWFrZS1saWtlCit0b29scyBhcmUgaW5oZXJlbnRseSBzaGVsbC1iYXNlZCAtLSB0aGV5IGV2YWx1YXRlIGEgc2V0IG9mIGRlcGVuZGVuY2llcywgdGhlbgorZXhlY3V0ZSBjb21tYW5kcyBub3QgdW5saWtlIHdoYXQgeW91IHdvdWxkIGlzc3VlIGluIGEgc2hlbGwuIFRoaXMgbWVhbnMgdGhhdCB5b3UKK2NhbiBlYXNpbHkgZXh0ZW5kIHRoZXNlIHRvb2xzIGJ5IHVzaW5nIG9yIHdyaXRpbmcgYW55IHByb2dyYW0gZm9yIHRoZSBPUyB0aGF0Cit5b3UgYXJlIHdvcmtpbmcgb24uIEhvd2V2ZXIsIHRoaXMgYWxzbyBtZWFucyB0aGF0IHlvdSBsaW1pdCB5b3Vyc2VsZiB0byB0aGUgT1MsCitvciBhdCBsZWFzdCB0aGUgT1MgdHlwZSBzdWNoIGFzIFVuaXgsIHRoYXQgeW91IGFyZSB3b3JraW5nIG9uLgorPC9wPgorCis8cD4KK01ha2VmaWxlcyBhcmUgaW5oZXJlbnRseSBldmlsIGFzIHdlbGwuIEFueWJvZHkgd2hvIGhhcyB3b3JrZWQgb24gdGhlbSBmb3IgYW55Cit0aW1lIGhhcyBydW4gaW50byB0aGUgZHJlYWRlZCB0YWIgcHJvYmxlbS4gJnF1b3Q7SXMgbXkgY29tbWFuZCBub3QgZXhlY3V0aW5nCitiZWNhdXNlIEkgaGF2ZSBhIHNwYWNlIGluIGZyb250IG9mIG15IHRhYiEhISZxdW90OyBzYWlkIHRoZSBvcmlnaW5hbCBhdXRob3Igb2YKK0FudCB3YXkgdG9vIG1hbnkgdGltZXMuIFRvb2xzIGxpa2UgSmFtIHRvb2sgY2FyZSBvZiB0aGlzIHRvIGEgZ3JlYXQgZGVncmVlLCBidXQKK3N0aWxsIGhhdmUgeWV0IGFub3RoZXIgZm9ybWF0IHRvIHVzZSBhbmQgcmVtZW1iZXIuCis8L3A+CisKKzxwPgorQW50IGlzIGRpZmZlcmVudC4gSW5zdGVhZCBvZiBhIG1vZGVsIHdoZXJlIGl0IGlzIGV4dGVuZGVkIHdpdGggc2hlbGwtYmFzZWQKK2NvbW1hbmRzLCBBbnQgaXMgZXh0ZW5kZWQgdXNpbmcgSmF2YSBjbGFzc2VzLiBJbnN0ZWFkIG9mIHdyaXRpbmcgc2hlbGwgY29tbWFuZHMsCit0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgWE1MLWJhc2VkLCBjYWxsaW5nIG91dCBhIHRhcmdldCB0cmVlIHdoZXJlIHZhcmlvdXMKK3Rhc2tzIGdldCBleGVjdXRlZC4gRWFjaCB0YXNrIGlzIHJ1biBieSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgcGFydGljdWxhcgorVGFzayBpbnRlcmZhY2UuCis8L3A+CisKKzxwPgorR3JhbnRlZCwgdGhpcyByZW1vdmVzIHNvbWUgb2YgdGhlIGV4cHJlc3NpdmUgcG93ZXIgdGhhdCBpcyBpbmhlcmVudCBieSBiZWluZworYWJsZSB0byBjb25zdHJ1Y3QgYSBzaGVsbCBjb21tYW5kIHN1Y2ggYXMKKzxjb2RlPmBmaW5kIC4gLW5hbWUgZm9vIC1leGVjIHJtIHt9YDwvY29kZT4sIGJ1dCBpdAorZ2l2ZXMgeW91IHRoZSBhYmlsaXR5IHRvIGJlIGNyb3NzIHBsYXRmb3JtIC0tIHRvIHdvcmsgYW55d2hlcmUgYW5kIGV2ZXJ5d2hlcmUuCitBbmQgaGV5LCBpZiB5b3UgcmVhbGx5IG5lZWQgdG8gZXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQsIEFudCBoYXMgYW4KKzxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gdGFzayB0aGF0CithbGxvd3MgZGlmZmVyZW50IGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIGJhc2VkIG9uIHRoZSBPUyB0aGF0IGl0IGlzIGV4ZWN1dGluZworb24uCis8L3A+CisKKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkRvY3VtZW50YXRpb24iPgorCis8cD4KK1lvdSBjYW4gdmlldyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgcmVsZWFzZSAoQXBhY2hlIEFudCAxLjcuMCkKKzxhIGhyZWY9Im1hbnVhbC9pbmRleC5odG1sIj5vbmxpbmU8L2E+Cis8L3A+CisKKzxwPgorQ29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uIGlzIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgYW5kIGJpbmFyeSBkaXN0cmlidXRpb25zLgorPC9wPgorCisgIDwvc2VjdGlvbj4KKworICA8IS0tc2VjdGlvbiBuYW1lPSJOaWdodGx5IEJ1aWxkcyI+CisgICAgPHA+CisgICAgSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBsYXRlc3QgQW50IGZlYXR1cmVzLCB5b3UgY2FuIHRyeSBkb3dubG9hZGluZyBhIG5pZ2h0bHkKKyAgICBidWlsZCBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9icnV0dXMuYXBhY2hlLm9yZy9+bmlnaHRseWJ1aWxkL2J1aWxkcy9hbnQvIj5oZXJlPC9hPgorICAgIDwvcD4KKworICA8L3NlY3Rpb24tLT4KKworICA8c2VjdGlvbiBuYW1lPSJHZXQgSW52b2x2ZWQiPgorPHVsPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvZ2V0aW52b2x2ZWQvZ2V0aW52b2x2ZWRpbmRleC5odG1sIj5HZXQgSW52b2x2ZWQ8L2E+PC9saT4KKzxsaT48YSBocmVmPSJtYWlsLmh0bWwiPkpvaW4gTWFpbGluZyBMaXN0czwvYT48L2xpPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YW50LWRldiZhbXA7cj0xJmFtcDt3PTIiPlNlYXJjaCB0aGUgRGV2IE1haWxpbmcgTGlzdDwvYT4KKzwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1hbnQtdXNlciZhbXA7cj0xJmFtcDt3PTIiPlNlYXJjaCB0aGUgVXNlciBNYWlsaW5nIExpc3Q8L2E+Cis8L2xpPgorPC91bD4KKworCisKKyAgPC9zZWN0aW9uPgorCis8L2JvZHk+Cis8L2RvY3VtZW50PgorCmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9sZWdhbC54bWwgYi90cnVuay94ZG9jcy9sZWdhbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzNDY3NwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL2xlZ2FsLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorICAKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iam9uQGxhdGNoa2V5LmNvbSI+Sm9uIFMuIFN0ZXZlbnM8L2F1dGhvcj4KKyAgICA8dGl0bGU+TGVnYWw8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisgIAorICA8Ym9keT4KKyAgICAKKyAgICA8c2VjdGlvbiBuYW1lPSJMZWdhbCBTdHVmZiBUaGV5IE1ha2UgVXMgU2F5Ij4KKworICAgICAgPHA+QWxsIG1hdGVyaWFsIG9uIHRoaXMgd2Vic2l0ZSBpcyBDb3B5cmlnaHQgJiMxNjk7IDE5OTktMjAwOCwKKyAgICAgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi48L3A+CisKKyAgICAgIDxwPlN1biwgU3VuIE1pY3Jvc3lzdGVtcywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBXZWIKKyAgICAgIERldmVsb3BtZW50IEtpdCwgYW5kIEphdmFTZXJ2ZXIgUGFnZXMgYXJlIHRyYWRlbWFya3Mgb3IKKyAgICAgIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIFVOSVggaXMgYQorICAgICAgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIG90aGVyIGNvdW50cmllcywKKyAgICAgIGV4Y2x1c2l2ZWx5IGxpY2Vuc2VkIHRocm91Z2ggWC9PcGVuIENvbXBhbnksIEx0ZC4gIFdpbmRvd3MsCisgICAgICBXaW5kb3dzTlQsIGFuZCBXaW4zMiBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIE1pY3Jvc29mdAorICAgICAgQ29ycC4gQWxsIG90aGVyIHByb2R1Y3QgbmFtZXMgbWVudGlvbmVkIGhlcmVpbiBhbmQgdGhyb3VnaG91dAorICAgICAgdGhlIGVudGlyZSB3ZWIgc2l0ZSBhcmUgdHJhZGVtYXJrcyBvZiB0aGVpciByZXNwZWN0aXZlCisgICAgICBvd25lcnMuPC9wPgorCisgICAgPC9zZWN0aW9uPgorCisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CisKZGlmZiAtLWdpdCBhL3RydW5rL3hkb2NzL2xpY2Vuc2UueG1sIGIvdHJ1bmsveGRvY3MvbGljZW5zZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliY2FmMgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL2xpY2Vuc2UueG1sCkBAIC0wLDAgKzEsMzE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5MaWNlbnNlPC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSIiPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvYXV0aG9yPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisgIDxzZWN0aW9uIG5hbWU9IlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSBWZXJzaW9uIDIuMCI+CisgICAgPHA+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIFZlcnNpb24gMi4wIGFwcGxpZXMgCisgICAgdG8gYWxsIHJlbGVhc2VzIG9mIEFudCBzdGFydGluZyB3aXRoIGFudCAxLjYuMTwvcD4KKworICAgIDxzb3VyY2U+LyoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICogICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisgKgorICogICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKyAqCisgKiAgIDEuIERlZmluaXRpb25zLgorICoKKyAqICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAqICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisgKgorICogICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICogICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisgKgorICogICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgKiAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAqICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAqICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgKiAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgKiAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICogICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorICoKKyAqICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICogICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorICoKKyAqICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgKiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAqICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAqCisgKiAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgKiAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAqICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICogICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisgKgorICogICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICogICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgKiAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICogICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorICoKKyAqICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICogICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgKiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAqICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAqICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgKiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAqICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKyAqCisgKiAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgKiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAqICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgKiAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAqICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgKiAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICogICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgKiAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgKiAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgKiAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgKiAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICogICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICogICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKyAqCisgKiAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgKiAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICogICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKyAqCisgKiAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgKiAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgKiAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICogICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAqICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKyAqCisgKiAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgKiAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgKiAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICogICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAqICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAqICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAqICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICogICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICogICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICogICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgKiAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgKiAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAqICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgKiAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAqCisgKiAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgKiAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICogICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICogICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgKiAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorICoKKyAqICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICogICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisgKgorICogICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAqICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAqICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgKiAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgKiAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisgKgorICogICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAqICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAqICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICogICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgKiAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAqICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgKiAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgKiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAqICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAqICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICogICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICogICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAqICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgKiAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAqICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICogICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorICoKKyAqICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgKiAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICogICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAqICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgKiAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisgKgorICogICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgKiAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICogICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICogICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAqICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICogICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICogICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisgKgorICogICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgKiAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAqICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgKiAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorICoKKyAqICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgKiAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAqICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICogICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICogICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgKiAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICogICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAqICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorICoKKyAqICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgKiAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICogICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICogICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICogICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgKiAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICogICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgKiAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAqICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAqICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICogICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgKiAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgKiAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgKiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgKiAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgKiAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgKiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAqICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgKiAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAqICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisgKgorICogICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKyAqCisgKiAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKyAqCisgKiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgKiAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAqICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAqICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAqICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgKiAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAqICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgKiAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKyAqCisgKiAgIENvcHlyaWdodCBbeXl5eV0gQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworICAgIDwvc291cmNlPgorICA8cD5Zb3UgY2FuIGRvd25sb2FkIHRoZSBvcmlnaW5hbCBsaWNlbnNlIGZpbGUgPGEgaHJlZj0iLi9MSUNFTlNFIiB0YXJnZXQ9Il9uZXciPmhlcmUuPC9hPjwvcD4KKzxwPlRoZSBMaWNlbnNlIGlzIGFjY29tcGFuaWVkIGJ5IGEgTk9USUNFPC9wPgorPHNvdXJjZT4KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgID09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgQW50IGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQorICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KKworICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGFsc28gc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IDoKKyAgICAgLSB0aGUgVzNDIGNvbnNvcnRpdW0gKGh0dHA6Ly93d3cudzNjLm9yZykgLAorICAgICAtIHRoZSBTQVggcHJvamVjdCAoaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZykKKworICAgUGxlYXNlIHJlYWQgdGhlIGRpZmZlcmVudCBMSUNFTlNFIGZpbGVzIHByZXNlbnQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mCisgICB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgVGhlIG5hbWVzICJBbnQiIGFuZCAgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiAgbXVzdCBub3QgYmUgdXNlZCB0bworICAgZW5kb3JzZSAgb3IgcHJvbW90ZSAgcHJvZHVjdHMgZGVyaXZlZCAgZnJvbSB0aGlzICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yCisgICB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgICBhcGFjaGVAYXBhY2hlLm9yZy4KKzwvc291cmNlPgorPC9zZWN0aW9uPgorICA8c2VjdGlvbiBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xIj4KKzxwPiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xLCBhcHBsaWVzIHRvIGFsbCB2ZXJzaW9ucyBvZiB1cCB0byBhbnQgMS42LjAgaW5jbHVkZWQuPC9wPgorICAgIDxzb3VyY2U+LyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgICAgIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAorICogICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwKKyAqICAgIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhLQorICogdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2YgIHNvdXJjZSBjb2RlIG11c3QgIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmIGFueSwgbXVzdAorICogICAgaW5jbHVkZSAgdGhlIGZvbGxvd2luZyAgYWNrbm93bGVkZ21lbnQ6ICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzICBzb2Z0d2FyZQorICogICAgZGV2ZWxvcGVkICBieSB0aGUgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgIGFja25vd2xlZGdtZW50IG1heSAgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsICBpZgorICogICAgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqIAorICogNC4gVGhlIG5hbWVzICJBbnQiIGFuZCAgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiAgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSAgb3IgcHJvbW90ZSAgcHJvZHVjdHMgZGVyaXZlZCAgZnJvbSB0aGlzICBzb2Z0d2FyZSB3aXRob3V0ICBwcmlvcgorICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCisgKiAKKyAqIDUuIFByb2R1Y3RzICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90ICBiZSBjYWxsZWQgIkFwYWNoZSIsIG5vciBtYXkKKyAqICAgICJBcGFjaGUiIGFwcGVhciAgaW4gdGhlaXIgbmFtZSwgIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uICBvZiB0aGUKKyAqICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgKiBGSVRORVNTICBGT1IgQSBQQVJUSUNVTEFSICBQVVJQT1NFIEFSRSAgRElTQ0xBSU1FRC4gIElOIE5PICBFVkVOVCBTSEFMTCAgVEhFCisgKiBBUEFDSEUgU09GVFdBUkUgIEZPVU5EQVRJT04gIE9SIElUUyBDT05UUklCVVRPUlMgIEJFIExJQUJMRSBGT1IgIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgREFNQUdFUyAoSU5DTFUtCisgKiBESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UICBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiBPRiBVU0UsIERBVEEsIE9SICBQUk9GSVRTOyBPUiBCVVNJTkVTUyAgSU5URVJSVVBUSU9OKSAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgIFRIRU9SWSBPRiBMSUFCSUxJVFksICBXSEVUSEVSICBJTiBDT05UUkFDVCwgIFNUUklDVCBMSUFCSUxJVFksICBPUiBUT1JUCisgKiAoSU5DTFVESU5HICBORUdMSUdFTkNFIE9SICBPVEhFUldJU0UpIEFSSVNJTkcgSU4gIEFOWSBXQVkgT1VUIE9GIFRIRSAgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGlzIHNvZnR3YXJlICBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlICBieSBtYW55IGluZGl2aWR1YWxzCisgKiBvbiBiZWhhbGYgb2YgdGhlICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlICBpbmZvcm1hdGlvbiAgb24gdGhlIAorICogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgJmx0O2h0dHA6Ly93d3cuYXBhY2hlLm9yZy8mZ3Q7LgorICoKKyAqLworPC9zb3VyY2U+CisgIDwvc2VjdGlvbj4KKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9tYWlsLnhtbCBiL3RydW5rL3hkb2NzL21haWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MmU2NmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9tYWlsLnhtbApAQCAtMCwwICsxLDEzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHRpdGxlPk1haWxpbmcgTGlzdHM8L3RpdGxlPgorICAgIDxhdXRob3IgZW1haWw9IiI+QXBhY2hlIEFudCBQTUM8L2F1dGhvcj4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworICAgIDxzZWN0aW9uIG5hbWU9Ik1haWxpbmcgTGlzdHMiPgorCisgICAgICA8cD5QbGVhc2UgcmVhZCB0aGUgPGEKKyAgICAgIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9tYWlsLmh0bWwiPmd1aWRlbGluZXMgb2YKKyAgICAgIHRoZSBKYWthcnRhIFByb2plY3Q8L2E+IGJlZm9yZSBzdWJzY3JpYmluZyBhbmQgcG9zdGluZyB0byBhbnkgb2YKKyAgICAgIHRoZSBsaXN0cyBiZWxvdy4gIFRoZXkgYXBwbHkgdG8gQW50J3MgbGlzdHMgYXMgd2VsbC48L3A+CisKKyAgICAgIDxwPlRoZSB1c2VyIGFuZCBkZXYgbGlzdCBhcmUgc3Vic2NyaWJlciBvbmx5IGxpc3RzLCB0aGlzIG1lYW5zCisgICAgICB5b3UgaGF2ZSB0byBzdWJzY3JpYmUgYmVmb3JlIHlvdSBjYW4gcG9zdCB0byB0aGUgbGlzdC4gIFBsZWFzZQorICAgICAgbm90ZSB0aGF0IGFueSBIVE1MIHBhcnRzIHNlbnQgdG8gdGhlIGxpc3RzIHdpbGwgYmUgcmVtb3ZlZCBieSBvdXIKKyAgICAgIG1haWxpbmcgbGlzdCBzb2Z0d2FyZSAtIHlvdSBzaG91bGRuJmFwb3M7dCBiZSBzZW5kaW5nIEhUTUwgbWFpbHMKKyAgICAgIGFueXdheS48L3A+CisKKyAgICAgIDxwPlRvIHN1YnNjcmliZSB0byBhIG1haWxpbmdsaXN0IHVzZSB0aGUgbGlua3MgYmVsb3cuIEluIHlvdXIgZmlyc3QgZW1haWwgeW91IHdpbGwgZ2V0IHNvbWUKKyAgICAgIGluZm9ybWF0aW9uIGFib3V0IHdvcmtpbmcgd2l0aCB0aGUgbGlzdCBtYW5hZ2VyIDxhIGhyZWY9Imh0dHA6Ly93d3cuZXptbG0ub3JnLyI+RVpNTE08L2E+LjwvcD4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iVXNlciBMaXN0OiB1c2VyQGFudC5hcGFjaGUub3JnIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgPGI+TWVkaXVtIFRyYWZmaWM8L2I+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnVzZXItc3Vic2NyaWJlQGFudC5hcGFjaGUub3JnIj5TdWJzY3JpYmU8L2E+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOnVzZXItdW5zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmciPlVuc3Vic2NyaWJlPC9hPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvYW50LXVzZXIvIj5BU0YgQXJjaGl2ZTwvYT4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWFudC11c2VyJmFtcDtyPTEmYW1wO3c9MiI+VGhpcmQgUGFydHkgQXJjaGl2ZTwvYT4KKyAgICAgICAgPC9wPgorCisgICAgICAgIDxwPlRoaXMgbGlzdCBpcyBmb3IgZGV2ZWxvcGVycyB0aGF0IGFyZSB1c2luZyBBbnQgaW4gdGhlaXIgb3duCisgICAgICAgIHByb2plY3RzIHRvIGFzayBxdWVzdGlvbnMsIHNoYXJlIGtub3dsZWRnZSwgYW5kIGRpc2N1c3MgaXNzdWVzCisgICAgICAgIHJlbGF0ZWQgdG8gdXNpbmcgQW50IGFzIGEgYnVpbGQgdG9vbC48L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ikl2eSBVc2VyIExpc3Q6IGl2eS11c2VyQGFudC5hcGFjaGUub3JnIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgPGI+TWVkaXVtIFRyYWZmaWM8L2I+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOml2eS11c2VyLXN1YnNjcmliZUBhbnQuYXBhY2hlLm9yZyI+U3Vic2NyaWJlPC9hPgorICAgICAgICAgIDxhIGhyZWY9Im1haWx0bzppdnktdXNlci11bnN1YnNjcmliZUBhbnQuYXBhY2hlLm9yZyI+VW5zdWJzY3JpYmU8L2E+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9hbnQtaXZ5LXVzZXIvIj5BU0YgQXJjaGl2ZTwvYT4KKyAgICAgICAgPC9wPgorCisgICAgICAgIDxwPlRoaXMgbGlzdCBpcyBmb3IgZGV2ZWxvcGVycyB0aGF0IGFyZSB1c2luZyBJdnkgb3IgSXZ5REUgaW4KKyAgICAgICAgdGhlaXIgb3duIHByb2plY3RzIHRvIGFzayBxdWVzdGlvbnMsIHNoYXJlIGtub3dsZWRnZSwgYW5kCisgICAgICAgIGRpc2N1c3MgaXNzdWVzIHJlbGF0ZWQgdG8gdXNpbmcgSXZ5IHdpdGggb3Igd2l0aG91dCBBbnQuPC9wPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJEZXZlbG9wZXIgTGlzdDogZGV2QGFudC5hcGFjaGUub3JnIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgPGI+TWVkaXVtIFRyYWZmaWM8L2I+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOmRldi1zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmciPlN1YnNjcmliZTwvYT4KKyAgICAgICAgICA8YSBocmVmPSJtYWlsdG86ZGV2LXVuc3Vic2NyaWJlQGFudC5hcGFjaGUub3JnIj5VbnN1YnNjcmliZTwvYT4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2FudC1kZXYvIj5BU0YgQXJjaGl2ZTwvYT4KKyAgICAgICAgICA8YSBocmVmPSJodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWFudC1kZXYmYW1wO3I9MSZhbXA7dz0yIj5UaGlyZCBQYXJ0eSBBcmNoaXZlPC9hPgorICAgICAgICA8L3A+CisKKyAgICAgICAgPHA+VGhpcyBpcyB0aGUgbGlzdCB3aGVyZSBwYXJ0aWNpcGF0aW5nIGRldmVsb3BlcnMgb2YgdGhlIEFudAorICAgICAgICBidWlsZCB0b29sLCBJdnkgb3IgdGhlIEFudCBsaWJyYXJpZXMgZGV2ZWxvcGVkIGJ5IHRoZSBBbnQgdGVhbQorICAgICAgICBtZWV0IGFuZCBkaXNjdXNzIGlzc3VlcywgY29kZSBjaGFuZ2VzL2FkZGl0aW9ucywgZXRjLjwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iTm90aWZpY2F0aW9ucyBMaXN0OiBub3RpZmljYXRpb25zQGFudC5hcGFjaGUub3JnIj4KKyAgICAgICAgPHA+CisgICAgICAgICAgPGI+TWVkaXVtIFRyYWZmaWM8L2I+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOm5vdGlmaWNhdGlvbnMtc3Vic2NyaWJlQGFudC5hcGFjaGUub3JnIj5TdWJzY3JpYmU8L2E+CisgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOm5vdGlmaWNhdGlvbnMtdW5zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmciPlVuc3Vic2NyaWJlPC9hPgorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvYW50LW5vdGlmaWNhdGlvbnMvIj5BU0YgQXJjaGl2ZTwvYT4KKyAgICAgICAgPC9wPgorCisgICAgICAgIDxwPlN1YnNjcmliZXJzIHRvIHRoaXMgbGlzdCBnZXQgbm90aWNlcyBvZiBlYWNoIGFuZCBldmVyeQorICAgICAgICBjb2RlIGNoYW5nZSwgYnVpbGQgcmVzdWx0cywgdGVzdGluZyBub3RpY2VzLCBldGMuPC9wPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJIb3cgdG8gdW5zdWJzY3JpYmUgeW91ciBvbGQgZW1haWwgYWRkcmVzcyI+CisgICAgICAgIDxwPgorICAgICAgICBGaXJzdCwgZmluZCBvdXQgdGhlIHBhcnRpY3VsYXIgZW1haWwgYWRyZXNzIHRvIHdoaWNoIGV6bWxtIGlzIHNlbmRpbmcuCisgICAgICAgIFRoZSBlbWFpbCBoZWFkZXJzIGFyZSB2aXNpYmxlIGluIE1pY3Jvc29mdCBPdXRsb29rIHZpYSB0aGUgbWVzc2FnZXMgbWVudQorICAgICAgICAiVmlldyB8IE9wdGlvbnMiLgorICAgICAgICA8cHJlPgorICAgICAgICBNaWNyb3NvZnQgTWFpbCBJbnRlcm5ldCBIZWFkZXJzIFZlcnNpb24gMi4wCisgICAgICAgIC4uLgorICAgICAgICBMaXN0LVVuc3Vic2NyaWJlOiAmbHQ7bWFpbHRvOnVzZXItdW5zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmcmZ3Q7CisgICAgICAgIExpc3QtSGVscDogJmx0O21haWx0bzp1c2VyLWhlbHBAYW50LmFwYWNoZS5vcmcmZ3Q7CisgICAgICAgIExpc3QtUG9zdDogJmx0O21haWx0bzp1c2VyQGFudC5hcGFjaGUub3JnJmd0OworICAgICAgICBMaXN0LUlkOiAiQW50IFVzZXJzIExpc3QiICZsdDt1c2VyLmFudC5hcGFjaGUub3JnJmd0OworICAgICAgICBSZXBseS1UbzogIkFudCBVc2VycyBMaXN0IiAmbHQ7dXNlckBhbnQuYXBhY2hlLm9yZyZndDsKKyAgICAgICAgRGVsaXZlcmVkLVRvOiBtYWlsaW5nIGxpc3QgdXNlckBhbnQuYXBhY2hlLm9yZworICAgICAgICAuLi4KKyAgICAgICAgUmV0dXJuLVBhdGg6IHVzZXItcmV0dXJuLTEyMzQ1LTxpPmpvaG49aG9zdC5kb21haW48L2k+QGFudC5hcGFjaGUub3JnCisgICAgICAgIC4uLgorICAgICAgICA8L3ByZT4KKyAgICAgICAgVGhlIDxpPlJldHVybi1QYXRoPC9pPiBoZWFkZXIgY29udGFpbnMgdGhlIGVtYWlsIGFkZHJlc3Mgd2hpY2ggaXMgc3Vic2NyaWJlZC4gCisgICAgICAgIDwvcD4gICAgICAKKyAgICAgICAgPHA+IFRvIHN0b3Agc3Vic2NyaXB0aW9uIGZvciB0aGUgYWRkcmVzcyBqb2huQGhvc3QuZG9tYWluICwgc2VuZCBhbiBlbWFpbCB0byA8cHJlPmRldi11bnN1YnNjcmliZS1qb2huPWhvc3QuZG9tYWluQGFudC5hcGFjaGUub3JnPC9wcmU+CisgICAgICAgICAgb3IgdG8gIDxwcmU+dXNlci11bnN1YnNjcmliZS1qb2huPWhvc3QuZG9tYWluQGFudC5hcGFjaGUub3JnPC9wcmU+LgorICAgICAgICA8L3A+ICAKKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gbmFtZT0iQXJjaGl2ZXMiPgorCisgICAgICA8cD5UaGVzZSBsaXN0cyBhcmUgYXJjaGl2ZWQgYXQ8L3A+CisKKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94LyI+TGlzdCBJbmRleCBvbiBtYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmc8L2E+PC9saT4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21haWwvIj5GdWxsIG1ib3ggYXJjaGl2ZXMgb2YgYWxsIGxpc3RzPC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vIj5NYWlsaW5nIGxpc3QgQXJjaGl2ZXM8L2E+PC9saT4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL25ld3MuZ21hbmUub3JnL2dtYW5lLmNvbXAuamFrYXJ0YS5hbnQuZGV2ZWwvIj5BbnQgRGV2ZWxvcGVyIExpc3Qgb24gZ21hbmU8L2E+PC9saT4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL25ld3MuZ21hbmUub3JnL2dtYW5lLmNvbXAuamFrYXJ0YS5hbnQudXNlci8iPkFudCBVc2VyIExpc3Qgb24gZ21hbmU8L2E+PC9saT4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5uYWJibGUuY29tL0FudC0tLURldi1mMTA4Lmh0bWwiPkFudCBEZXZlbG9wZXIgTGlzdCBvbiBuYWJibGU8L2E+PC9saT4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5uYWJibGUuY29tL0FudC0tLVVzZXJzLWYxMDcuaHRtbCI+QW50IFVzZXIgTGlzdCBvbiBuYWJibGU8L2E+PC9saT4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FudC5tYXJrbWFpbC5vcmcvIj5NYWlsaW5nIExpc3QgQXJjaGl2ZSBhdCBNYXJrTWFpbDwvYT48L2xpPgorICAgICAgICA8L3VsPgorCisKKyAgICA8L3NlY3Rpb24+CisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9taXNzaW9uLnhtbCBiL3RydW5rL3hkb2NzL21pc3Npb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzJhZWIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9taXNzaW9uLnhtbApAQCAtMCwwICsxLDEwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8dGl0bGU+QXBhY2hlIEFudCBNaXNzaW9uPC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSIiPkFwYWNoZSBBbnQgUE1DPC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisgIDxzZWN0aW9uIG5hbWU9IkJvYXJkIFJlc29sdXRpb24iPgorICAgIAorICAgIDxwPkFwYWNoZSBBbnQgaXMgYSBwcm9qZWN0IG9mIHRoZSA8YQorICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9hPi4gIEl0CisgICAgc3RhcnRlZCBhcyBhIHN1YnByb2plY3Qgb2YgdGhlIDxhCisgICAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8iPkFwYWNoZSBKYWthcnRhIFByb2plY3Q8L2E+LjwvcD4KKworICAgIDxwPlRoaXMgaXMgdGhlIGJvYXJkIHJlc29sdXRpb24gKGZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3JlY29yZHMvbWludXRlcy8yMDAyL2JvYXJkX21pbnV0ZXNfMjAwMl8xMV8xOC50eHQiPm1pbnV0ZXM8L2E+KQorICAgIHRoYXQgY3JlYXRlZCB0aGUgQXBhY2hlIEFudCBwcm9qZWN0OjwvcD4KKworICAgIDxzb3VyY2U+Cis3LkQuIFJlc29sdXRpb24gW1IzXSB0byBjcmVhdGUgdGhlIEFudCBQTUMKKworV0hFUkVBUywgdGhlIEJvYXJkIG9mIERpcmVjdG9ycyBkZWVtcyBpdCB0byBiZSBpbiB0aGUgYmVzdAoraW50ZXJlc3RzIG9mIHRoZSBGb3VuZGF0aW9uIGFuZCBjb25zaXN0ZW50IHdpdGggdGhlCitGb3VuZGF0aW9uJ3MgcHVycG9zZSB0byBlc3RhYmxpc2ggYSBQcm9qZWN0IE1hbmFnZW1lbnQKK0NvbW1pdHRlZSBjaGFyZ2VkIHdpdGggdGhlIGNyZWF0aW9uIGFuZCBtYWludGVuYW5jZSBvZgorb3Blbi1zb3VyY2Ugc29mdHdhcmUgcmVsYXRlZCB0byB0aGUgQXBhY2hlIEFudCBidWlsZCB0b29sLCBmb3IKK2Rpc3RyaWJ1dGlvbiBhdCBubyBjaGFyZ2UgdG8gdGhlIHB1YmxpYy4KKworTk9XLCBUSEVSRUZPUkUsIEJFIElUIFJFU09MVkVELCB0aGF0IGEgUHJvamVjdCBNYW5hZ2VtZW50CitDb21taXR0ZWUgKFBNQyksIHRvIGJlIGtub3duIGFzIHRoZSAiQXBhY2hlIEFudCBQTUMiLCBiZSBhbmQKK2hlcmVieSBpcyBlc3RhYmxpc2hlZCBwdXJzdWFudCB0byBCeWxhd3Mgb2YgdGhlIEZvdW5kYXRpb247IGFuZAorYmUgaXQgZnVydGhlcgorCitSRVNPTFZFRCwgdGhhdCB0aGUgQXBhY2hlIEFudCBQTUMgYmUgYW5kIGhlcmVieSBpcyByZXNwb25zaWJsZQorZm9yIHRoZSBjcmVhdGlvbiBhbmQgbWFpbnRlbmFuY2Ugb2YgdGhlIEFudCBidWlsZCBzeXN0ZW0gYW5kCityZWxhdGVkIHNvZnR3YXJlIGNvbXBvbmVudHMsIGJhc2VkIG9uIHNvZnR3YXJlIGxpY2Vuc2VkIHRvIHRoZQorRm91bmRhdGlvbjsgYW5kIGJlIGl0IGZ1cnRoZXIKKworUkVTT0xWRUQsIHRoYXQgdGhlIG9mZmljZSBvZiAiVmljZSBQcmVzaWRlbnQsIEFwYWNoZSBBbnQiIGJlCithbmQgaGVyZWJ5IGlzIGNyZWF0ZWQsIHRoZSBwZXJzb24gaG9sZGluZyBzdWNoIG9mZmljZSB0byBzZXJ2ZQorYXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgQm9hcmQgb2YgRGlyZWN0b3JzIGFzIHRoZSBjaGFpciBvZiB0aGUKK0FwYWNoZSBBbnQgUE1DLCBhbmQgdG8gaGF2ZSBwcmltYXJ5IHJlc3BvbnNpYmlsaXR5IGZvcgorbWFuYWdlbWVudCBvZiB0aGUgcHJvamVjdHMgd2l0aGluIHRoZSBzY29wZSBvZiByZXNwb25zaWJpbGl0eQorb2YgdGhlIEFwYWNoZSBBbnQgUE1DOyBhbmQgYmUgaXQgZnVydGhlcgorCitSRVNPTFZFRCwgdGhhdCB0aGUgcGVyc29ucyBsaXN0ZWQgaW1tZWRpYXRlbHkgYmVsb3cgYmUgYW5kCitoZXJlYnkgYXJlIGFwcG9pbnRlZCB0byBzZXJ2ZSBhcyB0aGUgaW5pdGlhbCBtZW1iZXJzIG9mIHRoZQorQXBhY2hlIEFudCBQTUM6CisKKyAgIEJydWNlIEF0aGVydG9uCisgICBTdGVwaGFuZSBCYWlsbGllegorICAgU3RlZmFuIEJvZGV3aWcKKyAgIEVyaWsgSGF0Y2hlcgorICAgRGlhbmUgSG9sdAorICAgRG9uYWxkIExlc2xpZQorICAgU3RldmUgTG91Z2hyYW4KKyAgIENvbm9yIE1hY05laWxsCisgICBDb3N0aW4gTWFub2xhY2hlCisgICBTYW0gUnVieQorICAgSm9uIFNrZWV0CisgICBNYWdlc2ggVW1hc2Fua2FyCisgICBDaHJpc3RvcGggV2lsaGVsbXMKKworTk9XLCBUSEVSRUZPUkUsIEJFIElUIEZVUlRIRVIgUkVTT0xWRUQsIHRoYXQgQ29ub3IgTWFjTmVpbGwgYmUKK2FuZCBoZXJlYnkgaXMgYXBwb2ludGVkIHRvIHRoZSBvZmZpY2Ugb2YgVmljZSBQcmVzaWRlbnQsIEFwYWNoZQorQW50LCB0byBzZXJ2ZSBpbiBhY2NvcmRhbmNlIHdpdGggYW5kIHN1YmplY3QgdG8gdGhlIGRpcmVjdGlvbgorb2YgdGhlIEJvYXJkIG9mIERpcmVjdG9ycyBhbmQgdGhlIEJ5bGF3cyBvZiB0aGUgRm91bmRhdGlvbgordW50aWwgZGVhdGgsIHJlc2lnbmF0aW9uLCByZXRpcmVtZW50LCByZW1vdmFsIG9yCitkaXNxdWFsaWZpY2F0aW9uLCBvciB1bnRpbCBhIHN1Y2Nlc3NvciBpcyBhcHBvaW50ZWQ7IGFuZCBiZSBpdAorZnVydGhlcgorCitSRVNPTFZFRCwgdGhhdCB0aGUgaW5pdGlhbCBBcGFjaGUgQW50IFBNQyBiZSBhbmQgaGVyZWJ5IGlzCit0YXNrZWQgd2l0aCB0aGUgY3JlYXRpb24gb2YgYSBzZXQgb2YgYnlsYXdzIGludGVuZGVkIHRvCitlbmNvdXJhZ2Ugb3BlbiBkZXZlbG9wbWVudCBhbmQgaW5jcmVhc2VkIHBhcnRpY2lwYXRpb24gaW4gdGhlCitBcGFjaGUgQW50IFByb2plY3QuCisKK0J5IFVuYW5pbW91cyBWb3RlLCBSZXNvbHV0aW9uIFIzIHdhcyBhcHByb3ZlZC4gVGhlIEFudCBQTUMgaXMKK2hlcmVieSBjcmVhdGVkLgorICAgIDwvc291cmNlPgorCisgIDwvc2VjdGlvbj4KKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9uaWdodGxpZXMueG1sIGIvdHJ1bmsveGRvY3MvbmlnaHRsaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWVkYzdkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsveGRvY3MvbmlnaHRsaWVzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5OaWdodGx5IEJ1aWxkczwvdGl0bGU+CisgICAgPGJhc2UvPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJOaWdodGx5IEJ1aWxkcyI+CisKKzxwPklmIHlvdSB3aXNoIHRvIHVzZSB0aGUgbGF0ZXN0IEFudCBmZWF0dXJlcywgeW91IGNhbiB0cnkgZG93bmxvYWRpbmcgYQorPGEgaHJlZj0iaHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL2J1aWxkcy9hbnQvbmlnaHRseS8iPm5pZ2h0bHkgYnVpbGQ8L2E+LgorPC9wPgorCis8cD5JZiB5b3Ugd2FudCB0byBidWlsZCBBbnQgZnJvbSBzb3VyY2VzLCB5b3UgY2FuIHVzZSBhIDxhCitocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvc25hcHNob3RzL2FudC8iPlN1YnZlcnNpb24gc25hcHNob3Q8L2E+LjwvcD4KKworPC9zZWN0aW9uPgorCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9wcm9ibGVtcy54bWwgYi90cnVuay94ZG9jcy9wcm9ibGVtcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2ZWZiYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL3Byb2JsZW1zLnhtbApAQCAtMCwwICsxLDE5NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSIiPkNvbm9yIE1hY05laWxsPC9hdXRob3I+CisgICAgPHRpdGxlPkhhdmluZyBQcm9ibGVtcz88L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iSGF2aW5nIFByb2JsZW1zPyI+CisgICAgICAgIDxwPgorICAgICAgICAgICBUaGlzIHBhZ2UgZGV0YWlscyBzb21lIHN0ZXBzIHlvdSBjYW4gdGFrZSB0byB0cnkgYW5kIHJlc29sdmUKKyAgICAgICAgICAgYW55IHByb2JsZW1zIHlvdSBtYXkgYmUgaGF2aW5nIHdpdGggQW50LiBJZiB5b3UgZmluZCB5b3UgY2FuJ3QKKyAgICAgICAgICAgcmVzb2x2ZSB0aGUgcHJvYmxlbSwgdGhlbiB0aGlzIHBhZ2Ugd2lsbCBoZWxwIHlvdSBjb2xsZWN0IHNvbWUgb2YKKyAgICAgICAgICAgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIHRvIHByb3ZpZGUgaW4gYSBidWcgcmVwb3J0LiBUaGlzIGluZm9ybWF0aW9uCisgICAgICAgICAgIHdpbGwgaGVscCB0aGUgQW50IGRldmVsb3BlcnMgdW5kZXJzdGFuZCBhbmQgcmVzb2x2ZSB0aGUgcHJvYmxlbS4KKyAgICAgICAgICAgT2YgY291cnNlLCBub3QgYWxsIHRoZSBzdGVwcyBoZXJlIHdpbGwgbWFrZSBzZW5zZSBmb3IgZXZlcnkgcHJvYmxlbQorICAgICAgICAgICB5b3UgbWF5IGVuY291bnRlciAtIHRoZXNlIGFyZSBqdXN0IHNvbWUgc3VnZ2VzdGlvbnMgdG8gcG9pbnQKKyAgICAgICAgICAgeW91IGluIHRoZSByaWdodCBkaXJlY3Rpb24uCisgICAgICAgIDwvcD4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iRW5zdXJlIHRoYXQgeW91IGFyZSBhY3R1YWxseSBydW5uaW5nIHRoZSB2ZXJzaW9uIG9mIEFudCB0aGF0IHlvdSB0aGluayB5b3UgZG8iPgorICAgICAgICA8cD5NYW55IHRvb2xzIGluY2x1ZGUgYSB2ZXJzaW9uIG9mIEFudCBhbmQgc29tZSBPcGVyYXRpbmcKKyAgICAgICAgU3lzdGVtcyBldmVuIGluc3RhbGwgaXQgYnkgZGVmYXVsdCBub3csIHNvIHlvdSBtYXkgaGF2ZSBhCisgICAgICAgIHZlcnNpb24gb2YgQW50IGluc3RhbGxlZCB0aGF0IHlvdSBoYXZlbid0IGJlZW4gYXdhcmUgb2YuPC9wPgorCisgICAgICAgIDxwPk9uZSBvZiB0aGUgZmlyc3QgdGhpbmdzIHRvIGRvIGlzIHRvIHJ1bgorICAgICAgICAgIDxicj48L2JyPjxicj48L2JyPgorICAgICAgICAgIDxmb250IGZhY2U9InZlcmRhbmEiIHNpemU9Ii0xIj5hbnQgLXZlcnNpb248L2ZvbnQ+CisgICAgICAgICAgPGJyPjwvYnI+PGJyPjwvYnI+CisgICAgICAgICAgYW5kCisgICAgICAgICAgPGJyPjwvYnI+PGJyPjwvYnI+CisgICAgICAgICAgPGZvbnQgZmFjZT0idmVyZGFuYSIgc2l6ZT0iLTEiPmFudCAtZGlhZ25vc3RpY3M8L2ZvbnQ+CisgICAgICAgICAgPGJyPjwvYnI+PGJyPjwvYnI+CisgICAgICAgICAgdG8gYmUgc3VyZS4gIEFsc28sIHdlIGhpZ2hseSByZWNvbW1lbmQgdGhhdCB5b3UgcnVuIEFudCB3aXRoCisgICAgICAgICAgYW4gZW1wdHkgQ0xBU1NQQVRILiAgSWYgYW55IG90aGVyIHZlcnNpb24gb2YgQW50IGNhbiBiZQorICAgICAgICAgIGxvYWRlZCBmcm9tIHRoZSBDTEFTU1BBVEgsIG1hbnkgdHlwZXMgb2YgZXJyb3JzIG1heSBoYXBwZW4KKyAgICAgICAgICBiZWNhdXNlIG9mIGluY29tcGF0aWJsZSBjbGFzc2VzIGJlaW5nIGxvYWRlZC48L3A+CisKKyAgICAgICAgPHA+U2VlIDxhIGhyZWY9ImZhcS5odG1sIj50aGUgRkFRPC9hPiBmb3IgPGEKKyAgICAgICAgaHJlZj0iZmFxLmh0bWwjTm9DbGFzc0RlZkZvdW5kRXJyb3IiPnNvbWU8L2E+IDxhCisgICAgICAgIGhyZWY9ImZhcS5odG1sI0luc3RhbnRpYXRpb25FeGNlcHRpb24iPmV4YW1wbGVzPC9hPiwgYnV0IG1hbnkKKyAgICAgICAgb3RoZXIgcHJvYmxlbXMgYXJlIGEgcmVzdWx0IG9mIGFuIG9sZCB2ZXJzaW9uIG9mIEFudCBvbiB5b3VyCisgICAgICAgIHN5c3RlbSBhcyB3ZWxsLjwvcD4KKworICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJSZWFkIHRoZSBNYW51YWwiPgorICAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgZmlyc3Qgc3RlcCB0byB0YWtlIHdoZW4geW91IGhhdmUgYSBwcm9ibGVtIHdpdGggQW50IGlzIHRvIHJlYWQKKyAgICAgICAgICAgIHRoZSA8YSBocmVmPSJtYW51YWwvaW5kZXguaHRtbCI+bWFudWFsPC9hPiBlbnRyeSBmb3IgdGhlIHRhc2sgb3IKKyAgICAgICAgICAgIGNvbmNlcHQgdGhhdCBpcyBnaXZpbmcgeW91IHRyb3VibGUuIEluIHBhcnRpY3VsYXIsIGNoZWNrIHRoZQorICAgICAgICAgICAgbWVhbmluZyBvZiBhIHRhc2sncyBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMuIFBlcmhhcHMgYW4KKyAgICAgICAgICAgIGF0dHJpYnV0ZSBpcyBhdmFpbGFibGUgdGhhdCB3b3VsZCBwcm92aWRlIHRoZSBiZWhhdmlvciB5b3UgcmVxdWlyZS4KKyAgICAgICAgICAgIElmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggdGhlIG1hbnVhbCBpdHNlbGYsIHlvdSBjYW4gc3VibWl0IGEKKyAgICAgICAgICAgIGRvY3VtZW50YXRpb24gYnVnIHJlcG9ydCAoc2VlIGJlbG93KSB0byBoZWxwIHVzIGltcHJvdmUgdGhlIEFudAorICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgIDwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkV4YW1pbmUgRGVidWcgT3V0cHV0Ij4KKyAgICAgICAgIDxwPgorICAgICAgICAgICAgSWYgeW91J3JlIHN0aWxsIGhhdmluZyBhIHByb2JsZW0sIHRoZSBuZXh0IHN0ZXAgaXMgdG8gdHJ5IGFuZAorICAgICAgICAgICAgZ2F0aGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBBbnQgaXMgZG9pbmcuCisgICAgICAgICAgICBUcnkgcnVubmluZyBBbnQgd2l0aCB0aGUgPGNvZGU+dmVyYm9zZTwvY29kZT4gZmxhZzoKKyAgICAgICAgICAgIDxicj48L2JyPjxicj48L2JyPgorICAgICAgICAgICAgPGZvbnQgZmFjZT0idmVyZGFuYSIgc2l6ZT0iLTEiPmFudCAtdmVyYm9zZTwvZm9udD4KKyAgICAgICAgICAgIDxicj48L2JyPjxicj48L2JyPgorICAgICAgICAgICAgb3IKKyAgICAgICAgICAgIDxicj48L2JyPjxicj48L2JyPgorICAgICAgICAgICAgPGZvbnQgZmFjZT0idmVyZGFuYSIgc2l6ZT0iLTEiPmFudCAtdjwvZm9udD4KKyAgICAgICAgICAgIDxicj48L2JyPjxicj48L2JyPgorCisgICAgICAgICAgICBUaGlzIHdpbGwgcHJvZHVjZSBvdXRwdXQgdGhhdCBzdGFydHMgbGlrZSB0aGUgZm9sbG93aW5nOjwvcD4KKzx0YWJsZT4KKzx0cj4KKzx0ZD4KK0FudCB2ZXJzaW9uIDEuNC4xIGNvbXBpbGVkIG9uIE9jdG9iZXIgMTEgMjAwMTxicj48L2JyPgorQnVpbGRmaWxlOiBidWlsZC54bWw8YnI+PC9icj4KK0RldGVjdGVkIEphdmEgdmVyc2lvbjogMS4zIGluOiBEOlx1c3JcbG9jYWxcamF2YVxqZGsxM1xqcmU8YnI+PC9icj4KK0RldGVjdGVkIE9TOiBXaW5kb3dzIE5UPGJyPjwvYnI+CitwYXJzaW5nIGJ1aWxkZmlsZSBEOlxhbnRcYnVpbGQueG1sCit3aXRoIFVSSSA9IGZpbGU6RDovYW50L2J1aWxkLnhtbDxicj48L2JyPgorUHJvamVjdCBiYXNlIGRpciBzZXQgdG86IEQ6XGFudDxicj48L2JyPgorJiMxNjA7JiMxNjA7W3Byb3BlcnR5XSBMb2FkaW5nIEVudmlyb25tZW50IGVudi48YnI+PC9icj4KKyYjMTYwOyYjMTYwO1twcm9wZXJ0eV0gTG9hZGluZyBEOlxhbnRcY29uZi5wcm9wZXJ0aWVzPGJyPjwvYnI+CitCdWlsZCBzZXF1ZW5jZSBmb3IgdGFyZ2V0ICYjMzk7ZGVidWcmIzM5OyBpcyBbZGVidWddPGJyPjwvYnI+CitDb21wbGV0ZSBidWlsZCBzZXF1ZW5jZSBpcyBbZGVidWcsIGdlbnNyYywgY29tcGlsZSwgamFyLCB0ZXN0XTxicj48L2JyPgorLiAuIC48YnI+PC9icj4KKzwvdGQ+Cis8L3RyPgorPC90YWJsZT4KKyAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgIFlvdSBzaG91bGQgYmUgYWJsZSB0byBzZWUgZnJvbSB0aGUgdHJhY2UgbW9yZSBhYm91dCB3aGF0IEFudAorICAgICAgICAgICAgICBpcyBkb2luZyBhbmQgd2h5IGl0J3MgdGFraW5nIGEgcGFydGljdWxhciBjb3Vyc2Ugb2YgYWN0aW9uLgorICAgICAgICAgICAgICBJZiB5b3UgbmVlZCBldmVuIG1vcmUgaW5mb3JtYXRpb24sIHlvdSBjYW4gdXNlIHRoZQorICAgICAgICAgICAgICA8Y29kZT4tZGVidWc8L2NvZGU+IGZsYWcgcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICAgPGNvZGU+LXZlcmJvc2U8L2NvZGU+LgorICAgICAgICAgICAgICBUaGlzIHdpbGwgZ2VuZXJhbGx5IHByb2R1Y2Ugc28gbXVjaAorICAgICAgICAgICAgICBvdXRwdXQgdGhhdCB5b3UgbWF5IHdhbnQgdG8gc2F2ZSB0aGUgb3V0cHV0IHRvIGEgZmlsZSBhbmQKKyAgICAgICAgICAgICAgYW5hbHl6ZSBpdCBpbiBhbiBlZGl0b3IuIFlvdSBjYW4gc2F2ZSB0aGUgb3V0cHV0IHVzaW5nIHRoZQorICAgICAgICAgICAgICA8Y29kZT4tbG9nZmlsZSAmbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPiBmbGFnLCBvcgorICAgICAgICAgICAgICB1c2luZyByZWRpcmVjdGlvbi4KKyAgICAgICAgICAgPC9wPgorICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgT25jZSB5b3UgaGF2ZSBhbGwgdGhpcyBkZWJ1ZyBpbmZvcm1hdGlvbiwgaG93IGNhbiB5b3UgdXNlIGl0CisgICAgICAgICAgICAgIHRvIHNvbHZlIHlvdXIgcHJvYmxlbT8gIFRoYXQgd2lsbCBkZXBlbmQgb24gdGhlIHRhc2sgaW4gcXVlc3Rpb24KKyAgICAgICAgICAgICAgYW5kIHRoZSBuYXR1cmUgb2YgeW91ciBwcm9ibGVtLiBFYWNoIHRhc2sgbG9ncyBkaWZmZXJlbnQgYXNwZWN0cworICAgICAgICAgICAgICBvZiBpdHMgb3BlcmF0aW9uLCBidXQgaXQgc2hvdWxkIGdpdmUgeW91IGFuIGlkZWEgb2Ygd2hhdCBpcyBnb2luZworICAgICAgICAgICAgICBvbi4gRm9yIGV4YW1wbGUsIHRoZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrIGxvZ3MgdGhlCisgICAgICAgICAgICAgIHJlYXNvbnMgd2h5IGl0CisgICAgICAgICAgICAgIGNob29zZXMgdG8gY29tcGlsZSBwYXJ0aWN1bGFyIGNsYXNzIGZpbGVzIGFuZCBub3Qgb3RoZXJzLCBhbG9uZworICAgICAgICAgICAgICB3aXRoIHdoaWNoIGNvbXBpbGVyIGl0IGlzIHVzaW5nIGFuZCB0aGUgYXJndW1lbnRzIGl0IHdpbGwgcGFzcworICAgICAgICAgICAgICB0byB0aGF0IGNvbXBpbGVyLiBUaGUgZm9sbG93aW5nIHBhcnRpYWwgdHJhY2Ugc2hvd3Mgd2h5CisgICAgICAgICAgICAgIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IGlzIGFkZGluZyBvbmUgY2xhc3MgZmlsZSBidXQKKyAgICAgICAgICAgICAgc2tpcHBpbmcgYW5vdGhlci4KKyAgICAgICAgICAgICAgVGhpcyBpcyBmb2xsb3dlZCBieSB3aGljaCBjb21waWxlciBpdCB3aWxsIGJlIHVzaW5nLCB0aGUKKyAgICAgICAgICAgICAgYXJndW1lbnRzIHRoYXQgd2lsbCBnZXQgcGFzc2VkIHRvIHRoZSBjb21waWxlciwKKyAgICAgICAgICAgICAgYW5kIGEgbGlzdCBvZiBhbGwgdGhlIGNsYXNzIGZpbGVzIHRvIGJlIGNvbXBpbGVkLgorICAgICAgICAgICA8L3A+Cis8dGFibGU+Cis8dHI+Cis8dGQ+CitbamF2YWNdIFRlc3QuamF2YSBvbWl0dGVkIGFzIEQ6XGNsYXNzZXNcVGVzdC5jbGFzcyBpcyB1cCB0byBkYXRlLjxicj48L2JyPgorW2phdmFjXSBVbnNldC5qYXZhIGFkZGVkIGFzIEQ6XGNsYXNzZXNcVW5zZXQuY2xhc3MgaXMgb3V0ZGF0ZWQuPGJyPjwvYnI+CitbamF2YWNdIENvbXBpbGluZyAxIHNvdXJjZSBmaWxlIHRvIEQ6XGNsYXNzZXM8YnI+PC9icj4KK1tqYXZhY10gVXNpbmcgY2xhc3NpYyBjb21waWxlcjxicj48L2JyPgorW2phdmFjXSBDb21waWxhdGlvbiBhcmdzOiAtZCBEOlxjbGFzc2VzIC1jbGFzc3BhdGggRDpcY2xhc3Nlczs8YnI+PC9icj4KK0Q6XGpkazExOFxjbGFzc2VzLnppcDsgLXNvdXJjZXBhdGggRDpcc3JjXGphdmEgLWc6bm9uZTxicj48L2JyPgorW2phdmFjXSBGaWxlIHRvIGJlIGNvbXBpbGVkOjxicj48L2JyPgorRDpcc3JjXGphdmFcVW5zZXQuamF2YTxicj48L2JyPgorPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCisgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICBJbiBtYW55IGNhc2VzLCBBbnQgdGFza3MgYXJlIHdyYXBwZXJzIGFyb3VuZCBPUyBjb21tYW5kcyBvcgorICAgICAgICAgICAgICBvdGhlciBKYXZhIGNsYXNzZXMuIEluIGRlYnVnIG1vZGUsIG1hbnkgb2YgdGhlc2UgdGFza3Mgd2lsbAorICAgICAgICAgICAgICBwcmludCBvdXQgdGhlIGVxdWl2YWxlbnQgY29tbWFuZCBsaW5lLCBhcyB0aGUKKyAgICAgICAgICAgICAgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzaworICAgICAgICAgICAgICBvdXRwdXQgZG9lcy4gSWYgeW91IGFyZSBoYXZpbmcgYSBwcm9ibGVtLCBpdCBpcyBvZnRlbiB1c2VmdWwgdG8KKyAgICAgICAgICAgICAgcnVuIHRoZSBjb21tYW5kIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaW4gdGhlIHNhbWUgd2F5CisgICAgICAgICAgICAgIEFudCBpcyBydW5uaW5nIGl0LCBhbmQgc2VlIGlmIHRoZSBwcm9ibGVtIG9jY3VycyBmcm9tIHRoZXJlCisgICAgICAgICAgICAgIGFzIHdlbGwuIFRoZSBwcm9ibGVtIG1heSBiZSBpbiB0aGUgY29tbWFuZCB0aGF0IGlzIGJlaW5nIHJ1biwKKyAgICAgICAgICAgICAgb3IgaXQgbWF5IGJlIGluIHRoZSB3YXkgdGhlIEFudCB0YXNrIGlzIHJ1bm5pbmcgdGhlIGNvbW1hbmQuCisgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBzZWUgdGhlIGVmZmVjdCBvZiBjaGFuZ2luZyBhdHRyaWJ1dGUgdmFsdWVzIG9uIHRoZQorICAgICAgICAgICAgICBnZW5lcmF0ZWQgY29tbWFuZCBsaW5lLiBUaGlzIGNhbiBoZWxwIHlvdSB0byB1bmRlcnN0YW5kIHdoZXRoZXIKKyAgICAgICAgICAgICAgeW91IGFyZSB1c2luZyB0aGUgY29ycmVjdCBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMuCisgICAgICAgICAgICA8L3A+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkhhcyBJdCBCZWVuIEZpeGVkPyI+CisgICAgICAgICA8cD4KKyAgICAgICAgICAgIEFmdGVyIGV4YW1pbmluZyB0aGUgZGVidWcgb3V0cHV0LCBpZiB5b3Ugc3RpbGwgYmVsaWV2ZSB0aGF0IHRoZQorICAgICAgICAgICAgcHJvYmxlbSB5b3UgYXJlIGhhdmluZyBpcyBjYXVzZWQgYnkgQW50LCBjaGFuY2VzIGFyZSB0aGF0IHNvbWVvbmUKKyAgICAgICAgICAgIGVsc2UgbWF5IGhhdmUgYWxyZWFkeSBlbmNvdW50ZXJlZCB0aGlzIHByb2JsZW0sIGFuZCBwZXJoYXBzIGl0IGhhcworICAgICAgICAgICAgYmVlbiBmaXhlZC4gVGhlIG5leHQgc3RlcCwgdGhlcmVmb3JlLCB3b3VsZCBiZSB0byBkb3dubG9hZCB0aGUKKyAgICAgICAgICAgIHNvdXJjZXMgb2YgYW50LCBzZWUgPGEgaHJlZj0ic3ZuLmh0bWwiPnN2bjwvYT4uCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3ZtZ3VtcC5hcGFjaGUub3JnL2d1bXAvcHVibGljL2luZGV4Lmh0bWwiPkd1bXA8L2E+CisgICAgICAgICAgaXMgYnVpbGRpbmcgYW50IGV2ZXJ5IG5pZ2h0IGFuZCB1c2luZyB0aGUgYW50IGJ1aWx0IGZyb20gdGhlCisgICAgICAgICAgbGF0ZXN0IHNvdXJjZSB0byBidWlsZCBhIGxvbmcgbGlzdCBvZiBvcGVuIHNvdXJjZSBwcm9qZWN0cy4gSG93ZXZlciwKKyAgICAgICAgICB0aGUgdmVyc2lvbiBvZiBhbnQgYnVpbHQgYnkgZ3VtcCBpcyBub3QgYXZhaWxhYmxlIGZvciBkb3dubG9hZC4gRXZlbgorICAgICAgICAgIGlmIGl0IHdlcmUsIGl0IHdvdWxkIG5vdCBpbmNsdWRlIG1vc3Qgb2YgdGhlIG9wdGlvbmFsIHRhc2tzLgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgV2UgY3VycmVudGx5IGRvIG5vdCBoYXZlIG5pZ2h0bHkgYnVpbGRzIGluY2x1ZGluZyB0aGUgb3B0aW9uYWwgdGFza3MuCisgICAgICAgIDwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICAgIAorCisgICAgICAgICAKKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24gbmFtZT0iYnVncyI+CisgICAgICA8cD5JZiB5b3UgYXJlIGNvbnZpbmNlZCB0aGF0IHlvdSBoYXZlIGlkZW50aWZpZWQgYW4gdW5maXhlZCBidWcsIHBsZWFzZSB0dXJuIHRvCisgICAgICBvdXIgZG9jdW1lbnQgY29uY2VybmluZyB0aGUgPGEgaHJlZj0iYnVncy5odG1sIj5idWcgZGF0YWJhc2U8L2E+LjwvcD4KKyAgICA8L3NlY3Rpb24+CisgICAgCisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9wcm9qZWN0cy54bWwgYi90cnVuay94ZG9jcy9wcm9qZWN0cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0MzBkYwotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL3Byb2plY3RzLnhtbApAQCAtMCwwICsxLDY3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJib2Rld2lnQGFwYWNoZS5vcmciPlN0ZWZhbiBCb2Rld2lnPC9hdXRob3I+CisgICAgPHRpdGxlPlJlbGF0ZWQgUHJvamVjdHM8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJSZWxhdGVkIFByb2plY3RzIj4KKworICAgICAgPHA+Tm90aGluZyBsaXN0ZWQgaGVyZSBpcyBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgdGhlIEFudAorICAgICAgZGV2ZWxvcGVycywgaWYgeW91IGVuY291bnRlciBhbnkgcHJvYmxlbXMgd2l0aCB0aGVtLCBwbGVhc2UgdXNlCisgICAgICB0aGUgY29udGFjdCBpbmZvcm1hdGlvbi48L3A+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFuZHJvTURBIj4KKworICAgICAgICA8cD5BbmRyb01EQSBpcyBhIGNvZGUgZ2VuZXJhdG9yIHRvb2wgdGhhdCBmb2xsb3dzIHRoZSBNb2RlbAorICAgICAgICBEcml2ZW4gQXJjaGl0ZWN0dXJlIChNREEpIHBhcmFkaWdtLiBJdCB0YWtlcyBhIFVNTCBtb2RlbCBmcm9tCisgICAgICAgIGEgQ0FTRS10b29sIGFuZCBnZW5lcmF0ZXMgY2xhc3NlcyBhbmQgZGVwbG95YWJsZSBjb21wb25lbnRzCisgICAgICAgIChKMkVFIG9yIG90aGVyKSBzcGVjaWZpYyBmb3IgeW91ciBhcHBsaWNhdGlvbgorICAgICAgICBhcmNoaXRlY3R1cmUuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPjEuNC4xIGFuZCBhYm92ZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb21kYS5vcmcvIj5odHRwOi8vd3d3LkFuZHJvTURBLm9yZy88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9tYWlsLz9ncm91cF9pZD03MzA0NyI+cHJvamVjdCBtYWlsaW5nIGxpc3RzPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkJTRCBsaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnRDb250cmliIj4KKworICAgICAgICA8cD5UaGUgQW50LUNvbnRyaWIgcHJvamVjdCBpcyBhIGNvbGxlY3Rpb24gb2YgdXNlciBzdXBwbGllZAorICAgICAgICB0YXNrIChsaWtlIGFuIDxjb2RlPiZsdDtpZiZndDs8L2NvZGU+IHRhc2spIGFuZCBhIGRldmVsb3BtZW50CisgICAgICAgIHBsYXlncm91bmQgZm9yIGV4cGVyaW1lbnRhbCB0YXNrcyBsaWtlIGEgQy9DKysgY29tcGlsYXRpb24KKyAgICAgICAgdGFzayBmb3IgZGlmZmVyZW50IGNvbXBpbGVycy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+MS40LjEgYW5kIGFib3ZlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vYW50LWNvbnRyaWIuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2FudC1jb250cmliLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9tYWlsLz9ncm91cF9pZD0zNjE3NyI+cHJvamVjdCBtYWlsaW5nIGxpc3Q8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50ZWxvcGUiPgorCisgICAgICAgIDxwPkEgR1VJIGZvciBydW5uaW5nIEFudCBhbmQgZWRpdGluZyBidWlsZCBmaWxlcywgY2FuIHJ1biBhcworICAgICAgICBzdGFuZC1hbG9uZSBvciBhcyBhIHBsdWdpbiB0byBqRWRpdC4gSW4gYWRkaXRpb24gdG8gcnVubmluZworICAgICAgICB0YXJnZXRzLCBBbnRlbG9wZSBjYW4gZ2VuZXJhdGUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBhbmQgY2FuCisgICAgICAgIHRyYWNlL2Rpc3BsYXkgYSB0YXJnZXQncyBleGVjdXRpb24gcGF0aCB3aXRob3V0IGFjdHVhbGx5CisgICAgICAgIGV4ZWN1dGluZyB0aGUgdGFyZ2V0LjwvcD4KKworICAgICAgICA8cD5JbmNsdWRlcyBzZXZlcmFsIGFkZGl0aW9uYWwgdGFza3M6IEFzc2VydCwgSWYvRWxzZSwKKyAgICAgICAgVHJ5L0NhdGNoL0ZpbmFsbHksIFN3aXRjaCwgVmFyaWFibGUsIFN0b3B3YXRjaCwgTGltaXQsIE1hdGgsCisgICAgICAgIFBvc3QsIFNTSCwgU0NQLCBBbnRGZXRjaCwgQW50Q2FsbEJhY2suPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUgYW5kIGhpZ2hlci48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnRlbG9wZS50aWdyaXMub3JnLyI+aHR0cDovL2FudGVsb3BlLnRpZ3Jpcy5vcmcvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpkYWxlYW5zb25AdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5EYWxlIEFuc29uPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudEhpbGwiPgorCisgICAgICAgIDxwPkFudGhpbGwgaXMgYSBidWlsZCB0b29sIHRoYXQgcHJvbW90ZXMgYSBjb250cm9sbGVkIGJ1aWxkCisgICAgICAgIHByb2Nlc3MgYnkgZW5zdXJpbmcgdGhhdCBldmVyeSBidWlsZCByZWZsZWN0cyB0aGUgc291cmNlCisgICAgICAgIHJlcG9zaXRvcnkgY29udGVudHMgYW5kIHRhZ2dpbmcgdGhlIHJlcG9zaXRvcnkgd2l0aCBhIHVuaXF1ZQorICAgICAgICBidWlsZCBudW1iZXIgYWZ0ZXIgZXZlcnkgYnVpbGQuIEFudGhpbGwgYWxzbyBlbmNvdXJhZ2VzIHRoZQorICAgICAgICBzaGFyaW5nIG9mIGtub3dsZWRnZSB3aXRoaW4gYW4gb3JnYW5pemF0aW9uIGJ5IGF1dG9tYXRpY2FsbHkKKyAgICAgICAgdXBkYXRpbmcgYSBwcm9qZWN0IGludHJhbmV0IHNpdGUgd2l0aCBhcnRpZmFjdHMgZnJvbSB0aGUKKyAgICAgICAgbGF0ZXN0IGJ1aWxkLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5idW5kbGVzIEFudCAxLjMsIGlzIGNvbXBhdGlibGUgd2l0aCBBbnQgMS4zIHRvIDEuNC4xPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnVyYmFuY29kZS5jb20vcHJvamVjdHMvYW50aGlsbC8iPmh0dHA6Ly93d3cudXJiYW5jb2RlLmNvbS9wcm9qZWN0cy9hbnRoaWxsLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmID0nbWFpbHRvOm1iekB1cmJhbmNvZGUuY29tJz5NYWNpZWogWmF3YWR6a2k8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+TW96aWxsYS1saWtlIGxpY2Vuc2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudGlnZW4iPgorCisgICAgICAgIDxwPkFudGlnZW4gKEFudCBJbnN0YWxsZXIgR2VuZXJhdG9yKSBpcyBhIHRvb2wgdG8gdGFrZSBhbiBBbnQgYnVpbGQgc2NyaXB0LCBjb21iaW5lIGl0IHdpdGggYSBHVUkKKyAgICAgICAgYW5kIHdyYXAgaXQgdXAgYXMgYW4gZXhlY3V0YWJsZSBqYXIgZmlsZS4gSXRzIG1haW4gdXNlIGlzIGZvciBjcmVhdGluZyBncmFwaGljYWwsIGFudC1iYXNlZCBpbnN0YWxsZXJzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5idW5kbGVzIEFudCAxLjYuMjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2FudGlnZW4uc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2FudGlnZW4uc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmID0nbWFpbHRvOmpvaG5kYXZpZHRheWxvckB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQnPkpvbiBUYXlsZXI8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QWNhZGVtaWMgRnJlZSBMaWNlbnNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnRJbnN0YWxsZXIiPgorICAgICAgICA8cD5CdWlsZHMgTVNJIHN0eWxlIGluc3RhbGxlcnMgKHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbikKKyAgICAgICAgdXNpbmcgQW50IGFzIEJhY2sgZW5kLiBVSSBkZXZlbG9wZWQgYnkgd3JpdGluZyBhbiBYTUwgaW5zdGFsbAorICAgICAgICBkZXNjcmlwdG9yLiAgUnVudGltZSBsYXVuY2hlZCBmcm9tIHNjcmlwdHMgb3IgYW4gYWxsIGluY2x1c2l2ZQorICAgICAgICBKYXIuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjYuMSBvdGhlcnMgbm90IHRlc3RlZDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2FudGluc3RhbGxlci5zZi5uZXQvIj5odHRwOi8vYW50aW5zdGFsbGVyLnNmLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0nbWFpbHRvOnRla25vcGF1bEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQnPnRla25vcGF1bEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+TEdQTCBidXQgaW4gdGhlIHByb2Nlc3Mgb2Ygb2YgbW92aW5nIHRvIEFwYWNoZTIuMCBvbiByZXF1ZXN0PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnRsaW9uIj4KKworICAgICAgICA8cD5UaGUgQW50bGlvbiBQcm9qZWN0IGFkZHMgdmFsdWUgdG8gQW50IGJ1aWxkIHNjcmlwdHMgYnkgcHJvdmlkaW5nCisgICAgICAgIHRhc2tzIHdoaWNoIGNlbnRyYWxpemVzIHRoZSBsaWJyYXJ5IGRlcGVuZGVuY2llcywgYW5kIGVuYWJsZXMKKyAgICAgICAgcHJvamVjdHMgdG8gZGVmaW5lIGRlcGVuZGVuY2llcyB1cG9uIG90aGVyIHByb2plY3RzLjwvcD4KKworICAgICAgICA8cD5FeHRlcm5hbCBkZXBlbmRlbmNpZXMgbWF5IGJlIGxvYWRlZCBmcm9tIGEgY3VzdG9tIGxvY2FsCisgICAgICAgIHJlcG9zaXRvcnkgb3IgTWF2ZW4tbGlrZSByZW1vdGUgcmVwb3NpdG9yaWVzLiBBbnRsaW9uIGhhbmRsZXMKKyAgICAgICAgdGhlIGdlbmVyYXRpb24gb2YgcHJvcGVydGllcywgZmlsZXNldHMsIGFuZCBwYXRocy48L3A+CisKKyAgICAgICAgPHA+SW50ZXItcHJvamVjdCBkZXBlbmRlbmNpZXMgYWxsb3cgZm9yIGJ1aWxkaW5nIHRoZSBvdGhlcgorICAgICAgICBwcm9qZWN0J3MgZmlsZXMgaWYgdGhleSBhcmVuJ3QgYWxyZWFkeSBidWlsdC48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNiBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9hbnRsaW9uLnNvdXJjZWZvcmdlLm5ldC8iPmh0dHA6Ly9hbnRsaW9uLnNvdXJjZWZvcmdlLm5ldC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZiA9J2h0dHBzOi8vc291cmNlZm9yZ2UubmV0L21haWwvP2dyb3VwX2lkPTkzNDEwJz5Qcm9qZWN0IG1haWxpbmcgbGlzdDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudFNoZWxsRXh0IChBbnQgU2hlbGwgRXh0ZW5zaW9uKSI+CisKKyAgICAgICAgPHA+QW50IFNoZWxsIEV4dGVuc2lvbiBpcyBhIFdpbmRvd3MgRXhwbG9yZXIgZW5oYW5jZW1lbnQgdGhhdCBhZGRzIGEgY29udGV4dHVhbCAKKyAgICAgICAgbWVudSB3aGVuIHlvdSByaWdodCBjbGljayBvdmVyIGFuIEFudCB4bWwgZmlsZSwgc28geW91IGNhbiBleGVjdXRlIGFsbCB0aGUgYWN0aW9ucyAKKyAgICAgICAgZGVmaW5lZCBpbiB0aGF0IGZpbGUgd2l0aG91dCBnb2luZyB0byBhIGNvbW1hbmQgY29uc29sZSBvciBzdGFydGluZyB5b3VyIGZhdm91cml0ZSAKKyAgICAgICAgSURFIHRvIG1ha2UgYSBzaW1wbGUgY2xlYW4uPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPlRlc3RlZCB3aXRoIEFudCAxLjYgYW5kIGxhdGVyLCBzaG91bGQgd29yayB3aXRoIGFsbCB2ZXJzaW9uczwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5lbHBhZ2VzdGlvbi5jb20vb3NfYW50X2VuLnNodG1sIj4KKyAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmVscGFnZXN0aW9uLmNvbS9vc19hbnRfZW4uc2h0bWw8L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmID0nbWFpbHRvOm9wZW5zb3VyY2VAZWxwYWdlc3Rpb24uY29tJz5Qcm9qZWN0IG1haWw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+TEdQTDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50d29ya3MiPgorCisgICAgICAgIDxwPlRoZSBhbnR3b3JrcyBwcm9qZWN0IGlzIGEgc2V0IG9mIHRvb2xzIGFuZCBzdGFuZGFyZGl6ZWQgdGFyZ2V0cyB0aGF0CisgICAgICAgIGdyZWF0bHkgc2ltcGxpZmllcyB1c2luZyBhbnQgaW4geW91ciBwcm9qZWN0LjwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgZHJpdmVyIGJlaGluZCBhbnR3b3JrcyBpcyBJbXBvcnRlci4gSW1wb3J0ZXIgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZQorICAgICAgICAgICAgYW50IGltcG9ydCB0YXNrIHRoYXQgd2lsbCBkb3dubG9hZCBhbmQKKyAgICAgICAgICAgIGNhY2hlIGFuIGFudCBidWlsZC54bWwgZmlsZSBhbmQgaXQncyBhc3NvY2lhdGVkIHJlc291cmNlcyBjYWxsZWQKKyAgICAgICAgICAgIGFudGxldHMuICBBbnRsZXRzIGFyZSBhdmFpbGFibGUgZm9yIEphdmEgY29tcGlsaW5nCisgICAgICAgICAgICBhbmQgcGFja2FnaW5nLCAgSlVuaXQsIEZvcnJlc3QsIEoyRUUgYW5kCisgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50d29ya3Muc291cmNlZm9yZ2UubmV0L2FudGxldHMvIj5tb3JlPC9hPi4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgU2VlIHRoZSA8YSBocmVmPSJodHRwOi8vYW50d29ya3Muc291cmNlZm9yZ2UubmV0L3N0YXJ0Lmh0bWwgIj5HZXR0aW5nIFN0YXJ0ZWQ8L2E+CisgICAgICAgICAgICBndWlkZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD4xLjYgYW5kIGxhdGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vYW50d29ya3Muc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2FudHdvcmtzLnNvdXJjZWZvcmdlLm5ldC9pbmRleC5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWYgPSJodHRwOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL2FudHdvcmtzLWRldmVsb3BlcnMiPkFudHdvcmtzIERldmVsb3BlcnMgbWFpbGluZyBsaXN0czwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5UaGUgQXBhY2hlIExpY2Vuc2UgMi4wPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJCdWlsZE1vbmtleSI+CisKKyAgICAgICAgPHA+QnVpbGRNb25rZXkgaXMgYSBXZWItYmFzZWQgYXV0b21hdGVkIGJ1aWxkIGRhc2hib2FyZCwgd2l0aCB1cGxvYWQKKyAgICAgICAgICAgY2FwYWJpbGl0eSBhbmQgZ29vZ2xlIHdlYiBzZWFyY2guIEl0IHNjaGVkdWxlcyB0aGUgcnVubmluZyBvZiBBbnQKKyAgICAgICAgICAgYnVpbGQgc2NyaXB0cyAtIGNoZWNraW5nIHNvdXJjZXMgb3V0IG9mIENNIC0gYW5kIG1ha2VzIHRoZSByZXN1bHRzCisgICAgICAgICAgIGF2YWlsYWJsZSBjZW50cmFsbHkuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjUuNCBvciBsYXRlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5idWlsZG1vbmtleS5jb20vIj5odHRwOi8vd3d3LmJ1aWxkbW9ua2V5LmNvbS88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmpiQGJ1aWxkbW9ua2V5LmNvbSI+amJAYnVpbGRtb25rZXkuY29tPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkZyZWV3YXJlLCBjb21tZXJjaWFsL3N1cHBvcnQgbGljZW5jZXMgYXZhaWxhYmxlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJDcnVpc2VDb250cm9sIj4KKworICAgICAgICA8cD5DcnVpc2VDb250cm9sIGlzIGEgdG9vbCBmb3Igc2V0dGluZyB1cCBhIGNvbnRpbnVvdXMgYnVpbGQKKyAgICAgICAgcHJvY2Vzcy4gIENydWlzZUNvbnRyb2wgcHJvdmlkZXMgYW4gQW50IHdyYXBwZXIgYW5kIGEgc2V0IG9mCisgICAgICAgIHRhc2tzIHRvIGF1dG9tYXRlIHRoZSBjaGVja291dC9idWlsZC90ZXN0IGN5Y2xlLiBDcnVpc2VDb250cm9sCisgICAgICAgIGFsc28gY29tZXMgYnVuZGxlZCB3aXRoIGEgc2VydmxldCBmb3Igdmlld2luZyB0aGUgc3RhdHVzIG9mCisgICAgICAgIHRoZSBjdXJyZW50IGJ1aWxkLCBhcyB3ZWxsIGFzIHByZXZpb3VzIGJ1aWxkIHJlc3VsdHMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLjIgYW5kIGhpZ2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2NydWlzZWNvbnRyb2wuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2NydWlzZWNvbnRyb2wuc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmID0naHR0cDovL2NydWlzZWNvbnRyb2wuc291cmNlZm9yZ2UubmV0L2NvbnRhY3QuaHRtbCc+UHJvamVjdCBNYWlsaW5nIExpc3RzIGFuZCBBZG1pbmlzdHJhdG9yczwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5SZWxlYXNlIDEuMCBoYXMgYmVlbiBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICAgICAgICAgICBMaWNlbnNlLiAgU3RhcnRpbmcgd2l0aCByZWxlYXNlIDEuMSB0aGUgbGljZW5zZSBoYXMgYmVlbgorICAgICAgICAgICAgY2hhbmdlZCB0byBhIEJTRC1saWtlIGxpY2Vuc2UuPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJJbnZpY3RhIj4KKworICAgICAgICA8cD5JbnZpY3RhIGlzIGEgYnVpbGQgbWFuYWdlbWVudCB0b29sLiBVc2luZyBzaW1wbGUgcHJvamVjdCBkZWZpbml0aW9uIGZpbGVzLAorICAgICAgICBpdCBnZW5lcmF0ZXMgcG93ZXJmdWwgYnVpbGQgc2NyaXB0cyAoc3VjaCBhcyBBTlQpIHdoaWxlIGhpZGluZyB0aGVpcgorICAgICAgICBjb21wbGV4aXR5LiBJbnZpY3RhIGlzIGEgbW9kdWxhciBmcmFtZXdvcmsgdGhhdCBhbGxvd3MgZGV2ZWxvcGluZyBhZGRpdGlvbmFsCisgICAgICAgIGNvbXBvbmVudHMgYW5kIG91dHB1dCB0eXBlcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNSBhbmQgaGlnaGVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vaW52aWN0YS5zZi5uZXQvIj5odHRwOi8vaW52aWN0YS5zZi5uZXQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWYgPSJodHRwOi8vaW52aWN0YS5zZi5uZXQvY29udGFjdC5odG1sIj5Qcm9qZWN0IE1haWxpbmcgTGlzdHMgYW5kIEFkbWluaXN0cmF0b3JzPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkxHUEwuPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJKQU0gLSBKYXZhR2VuIEFudCBNb2R1bGVzIj4KKworICAgICAgICA8cD5KQU0gaXMgYSBtb2R1bGFyIEFudCB0b29sa2l0IGZvciBkZXZlbG9waW5nIGFuZCB0ZXN0aW5nIEphdmEvSjJFRQorICAgICAgICBhcHBsaWNhdGlvbnMuIEpBTSBzdXBwb3J0cyBFSkIgYW5kIFNlcnZsZXQvSlNQIGRldmVsb3BtZW50IHVzaW5nIFhEb2NsZXQsCisgICAgICAgIEpVbml0LCBDYWN0dXMsIE1hdmVuLCBDYXN0b3IgYW5kIE1EQS9VTUwgY29kZSBnZW5lcmF0aW9uIG9uIHZhcmlvdXMgSjJFRQorICAgICAgICBzZXJ2ZXJzIGluY2x1ZGluZyBKQm9zcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhZ2VuLmNvbS9qYW0uanNwIj5odHRwOi8vd3d3LmphdmFnZW4uY29tL2phbS5qc3A8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhZ2VuLmNvbS9mZWVkYmFjay5kbyI+RmVlZGJhY2s8L2E+IDxici8+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qYXZhZ2VuLmNvbS9idWdzLmRvIj5CdWcgUmVwb3J0czwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+TGljZW5zZTo8L3RoPgorICAgICAgICAgICAgPHRkPkdQTDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iS3J5c2FsaXMgQ2VudGlwZWRlIj4KKyAgICAgICAgPHA+VGhlIENlbnRpcGVkZSBhZG1pbiB0b2xkIHVzLCB0aGF0IHRoYXQgcHJvamVjdAorICAgICAgICAgICAiaXMgbm8gbW9yZSIgYW5kIHRoYXQgIkFudHdvcmtzIGhhcyB0YWtlbiBpdCBwbGFjZS4iCisgICAgICAgIDwvcD4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iTGVhZmN1dHRlciI+CisgICAgICAgIDxwPkxlYWZjdXR0ZXIgaXMgYW4gQVBJIHdoaWNoIGFsbG93cyB5b3UgdG8gZXhlY3V0ZSBBbnQgdGFza3MgZnJvbSBKYXZhIGNvZGUuIDxici8+CisgICAgICAgICAgIExlYWZjdXR0ZXIgaXMgdXNlZnVsIGFzOiA8dWw+CisgICAgICAgICAgIDxsaT5BIHdheSBvZiBpbnRlZ3JhdGluZyBBbnQgdGFza3MgaW50byBleGlzdGluZyBKYXZhIHByb2dyYW1zLiA8L2xpPgorICAgICAgICAgICA8bGk+QSB3aG9sZXNhbGUgYWx0ZXJuYXRpdmUgdG8gc3RhbmRhcmQgQW50IGZvciBwcm9jZXNzIGF1dG9tYXRpb24uIDwvbGk+CisgICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvcD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGk+dW5rbm93bjwvaT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vbGVhZmN1dHRlci5kZXYuamF2YS5uZXQvIj5odHRwczovL2xlYWZjdXR0ZXIuZGV2LmphdmEubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwczovL2xlYWZjdXR0ZXIuZGV2LmphdmEubmV0L3NlcnZsZXRzL1Byb2plY3RGb3J1bVZpZXciPkRpc2N1c3Npb24gRm9ydW08L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0ibHVudGJ1aWxkIj4KKworICAgICAgICA8cD5MdW50YnVpbGQgaXMgYW4gb3BlbiBzb3VyY2UgYnVpbGQgYXV0b21hdGlvbiBhbmQgbWFuYWdlbWVudAorICAgICAgICB0b29sIGJhc2VkIG9uIEFwYWNoZSBBbnQuIEJ1aWxkcyBhcmUgc2V0dXAgdGhyb3VnaCBjb25jZXB0cyBvZgorICAgICAgICBwcm9qZWN0cywgdmlld3MsIHNjaGVkdWxlcywgbW9kdWxlcywgZXRjLiBBbGwgY29uZmlndXJhdGlvbnMKKyAgICAgICAgYW5kIG1vbml0b3JpbmcgdGFza3MgaXMgcGVyZm9ybWVkIGZyb20gYSBjbGVhbiB3ZWIKKyAgICAgICAgaW50ZXJmYWNlLiBJdCBzdXBwb3J0cyBzY2hlZHVsZXMgYnVpbGRzLCBmb3JjZSBidWlsZHMsCisgICAgICAgIHJlYnVpbGRzLCBjbGVhbiBidWlsZCwgaW5jcmVtZW50IGJ1aWxkLCBldGMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPkFudCAxLng8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2x1bnRidWlsZC8iPmh0dHA6Ly93d3cuc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2x1bnRidWlsZC88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZiA9J2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbHVudGJ1aWxkLyc+bHVudGJ1aWxkIHByb2plY3QgcGFnZTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5PcGVuc291cmNlPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJOQW50Ij4KKworICAgICAgICA8cD5OQW50IGlzIGEgLk5FVCBiYXNlZCBidWlsZCB0b29sLiBJbiB0aGVvcnkgaXQgaXMga2luZCBvZgorICAgICAgICBsaWtlIG1ha2Ugd2l0aG91dCBtYWtlJ3Mgd3JpbmtsZXMuIEluIHByYWN0aWNlIGl0J3MgYSBsb3QgbGlrZQorICAgICAgICBBbnQuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorICAgICAgICAgICAgPHRkPmNvbXBhdGlibGUgaW4gc3Bpcml0LjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL25hbnQuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL25hbnQuc291cmNlZm9yZ2UubmV0LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L21haWwvP2dyb3VwX2lkPTMxNjUwIj5wcm9qZWN0IG1haWxpbmcgbGlzdDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUGFyYWJ1aWxkIj4KKworICAgICAgICA8cD5QYXJhYnVpbGQgaXMgYW4gYXV0b21hdGVkIG11bHRpcGxhdGZvcm0gYnVpbGQgbWFuYWdlbWVudCBzZXJ2ZXIuCisgICAgICAgIFBhcmFidWlsZCBoZWxwcyBzb2Z0d2FyZSB0ZWFtcyBhbmQgb3JnYW5pemF0aW9ucyBvZiBhbGwgc2l6ZXMgcmVkdWNlCisgICAgICAgIHJpc2tzIG9mIHByb2plY3QgZmFpbHVyZXMgYW5kIGluY3JlYXNlIHByb2R1Y3Rpdml0eSBieSBwcm92aWRpbmcgcHJvdmlkZXMKKyAgICAgICAgYXV0b21hdGljIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gYnVpbGRzIGFuZCBzdGFibGUgc2NoZWR1bGVkIGJ1aWxkcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuMyBhbmQgbGF0ZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudmlld3RpZXIuY29tL3Byb2R1Y3RzL3BhcmFidWlsZC5odG0iPmh0dHA6Ly93d3cudmlld3RpZXIuY29tL3Byb2R1Y3RzL3BhcmFidWlsZC5odG08L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy52aWV3dGllci5jb20vYWJvdXRfdXMuaHRtIj5odHRwOi8vd3d3LnZpZXd0aWVyLmNvbS9hYm91dF91cy5odG08L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+Q29tbWVyY2lhbDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUmFudCI+CisKKyAgICAgICAgPHA+UmFudCBzdGFuZHMgZm9yIFJlbW90ZSBBbnQuIEl0IGlzIGEgZGlzdHJpYnV0ZWQgYnVpbGQKKyAgICAgICAgc3lzdGVtIHRoYXQgYWxsb3dzIGFuIEFudCBidWlsZCBmaWxlIHRvIGxhdW5jaCBidWlsZHMgb24gb3RoZXIKKyAgICAgICAgc3lzdGVtcyBhbmQgcmVjZWl2ZSBleGNlcHRpb25zIHNob3VsZCB0aGV5IG9jY3VyLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3JlbW90ZWFudC8iPmh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvcmVtb3RlYW50LzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbnRhY3Q6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86Y25lbHNvbkBlaW5ub3ZhdGlvbi5jb20iPkNocmlzIE5lbHNvbjwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5NSVQgTGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iU2F2YW50Ij4KKworICAgICAgICA8cD5TYXZhbnQgaGVscHMgc2ltcGxpZnkgYnVpbGRzIGFuZCBjb2RlYmFzZXMgYnkgaGFuZGxpbmcgdGhlCisgICAgICAgIHJlc29sdXRpb24gb2YgcHJvamVjdCBkZXBlbmRlbmNpZXMgYXV0b21hdGljYWxseS4gU2F2YW50IHN1cHBvcnRzCisgICAgICAgIE1hdmVuIHN0eWxlIGRlcGVuZGVuY3kgZG93bmxvYWRzIGFuZCB2YXJpb3VzIG90aGVyIG1ldGhvZHMgb2YKKyAgICAgICAgcmV0cmlldmluZyBkZXBlbmRlbmNpZXMsIGluY2x1ZGluZyBmZXRjaGluZyBmaWxlcyBmcm9tIENWUyBtb2R1bGVzLgorICAgICAgICBTYXZhbnQgZ29lcyBhIHN0ZXAgZnVydGhlciB0aGFuIG90aGVyIGRlcGVuZGVuY3kgc29sdXRpb25zIGFuZCBwcm92aWRlcworICAgICAgICB0aGUgbWVhbnMgZm9yIG11bHRpcGxlIGludGVybmFsIHByb2plY3RzIHRvIGJ1aWxkIGVhY2ggb3RoZXIgaW4gb3JkZXIKKyAgICAgICAgdG8gcmVzb2x2ZSBpbnRlci1wcm9qZWN0IGRlcGVuZGVuY2llcy48L3A+CisKKyAgICAgICAgPHA+U2F2YW50IGNhbiBiZSB1c2VkIHZpYSB2YXJpb3VzIEFudCB0eXBlcyBhbmQgdGFza3MgYXMgd2VsbCBhcyB1c2VkCisgICAgICAgIGZyb20gYW55IEphdmEgYXBwbGljYXRpb24gaW5jbHVkaW5nIHRob3NlIHRoYXQgZG8gbm90IG1ha2UgdXNlIG9mIEFudC48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNi4xPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmludmVyc29mdC5jb20vIj5odHRwOi8vd3d3LmludmVyc29mdC5jb20vPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuaW52ZXJzb2Z0LmNvbS9jb250YWN0Lmh0bWwiPmh0dHA6Ly93d3cuaW52ZXJzb2Z0LmNvbS9jb250YWN0Lmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+TEdQTDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iV2ViVGVzdCI+CisKKyAgICAgICAgPHA+V2ViVGVzdCBpcyBhIGZyZWUgb3BlbiBzb3VyY2UgdG9vbCBmb3IgYXV0b21hdGVkIHRlc3Rpbmcgb2Ygd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgSXQgaXMgYSBzZXQgb2YgcG93ZXJmdWwgQW50IHRhc2tzIGFsbG93aW5nIHRvIGNhbGwgd2ViIHBhZ2VzLCBtaW1pYyB1c2VyIGFjdGlvbnMKKyAgICAgICAgKGNsaWNraW5nIGxpbmtzLCBmaWxsaW5nIGZvcm1zLCAuLi4pIGFuZCB2ZXJpZnkgdGhlIHJlc3VsdHMuCisgICAgICAgIFRoZSBnZW5lcmF0ZWQgcmVwb3J0cyBnaXZlIGNvbXByZWhlbnNpdmUgaW5mb3JtYXRpb24gb24gc3VjY2VzcyBhbmQgZmFpbHVyZSBvZiB0aGUgdGVzdCBzdGVwcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db21wYXRpYmlsaXR5OjwvdGg+CisgICAgICAgICAgICA8dGQ+QW50IDEuNi41PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd2VidGVzdC5jYW5vby5jb20vIj5odHRwOi8vd2VidGVzdC5jYW5vby5jb20vPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29udGFjdDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9saXN0cy5jYW5vby5jb20vbWFpbG1hbi9saXN0aW5mby93ZWJ0ZXN0LyI+cHJvamVjdCBtYWlsaW5nIGxpc3Q8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5MaWNlbnNlOjwvdGg+CisgICAgICAgICAgICA8dGQ+QXBhY2hlIGxpa2UgbGljZW5zZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iWE1MIFB1YmxpY2F0aW9uIj4KKworICAgICAgICA8cD5YTUwgUHVibGljYXRpb24gaXMgYSBzZXQgb2YgdG9vbHMgdG8gZ2VuZXJhdGUgV2ViIHBhZ2VzCisgICAgICAgIGZyb20gZGVza3RvcCBkb2N1bWVudHMgb3Igb3RoZXIgc3RydWN0dXJlZCBkb2N1bWVudHMgdXNpbmcKKyAgICAgICAgWFNMVCBhbmQgQW50LjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkNvbXBhdGliaWxpdHk6PC90aD4KKyAgICAgICAgICAgIDx0ZD5BbnQgMS40PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vWE1McHVibGljYXRpb24ub3JnLyI+aHR0cDovL1hNTHB1YmxpY2F0aW9uLm9yZy88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZiA9Im1haWx0bzpqbXZhbmVsQGZyZWUuZnIiPkplYW4tTWFyYyBWYW5lbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9InlFZCI+CisKKyAgICAgICAgPHA+eUVkIGlzIGEgZnJlZXdhcmUgbXVsdGktcHVycG9zZSBncmFwaCBhbmQgZGlhZ3JhbSBlZGl0b3IKKyAgICAgICAgdGhhdCBydW5zIG9uIHRoZSBKYXZhIDIgcGxhdGZvcm0uIEl0IHByb3ZpZGVzIGFuIGltcG9ydCBmaWx0ZXIKKyAgICAgICAgZm9yIEFudCBidWlsZCBzY3JpcHRzIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gY29udmVuaWVudGx5CisgICAgICAgIGRpc3BsYXkgYW5kIGJyb3dzZSB0aGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlIGRpZmZlcmVudCB0YXJnZXRzCisgICAgICAgIG9mIHRoZSBidWlsZCBmaWxlLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kCisgICAgICAgIHVuZGVyc3RhbmRpbmcgbGFyZ2UgYnVpbGQgZmlsZXMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+Q29tcGF0aWJpbGl0eTo8L3RoPgorCisgICAgICAgICAgICA8dGQ+QW50IDEueDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy55d29ya3MuY29tL3Byb2R1Y3RzL3llZC8iPmh0dHA6Ly93d3cueXdvcmtzLmNvbS9wcm9kdWN0cy95ZWQvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisKKyAgICAgICAgICAgIDx0aD5Db250YWN0OjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZiA9J2h0dHA6Ly93d3cueXdvcmtzLmNvbS9lbi9jb21wYW55X2NvbnRhY3QuaHRtJz55V29ya3MgU3VwcG9ydDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkxpY2Vuc2U6PC90aD4KKyAgICAgICAgICAgIDx0ZD5GcmVld2FyZTwvdGQ+CisgICAgICAgICAgPC90cj4KKworICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3MvcHJvamVjdHMvaW5kZXgueG1sIGIvdHJ1bmsveGRvY3MvcHJvamVjdHMvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMzcwMjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9wcm9qZWN0cy9pbmRleC54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8aW5kZXggdmFsdWU9IjEiLz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjaHJpc3RvcGgud2lsaGVsbXNAdC1vbmxpbmUuZGUiPkNocmlzdG9waCBXaWxoZWxtczwvYXV0aG9yPgorICAgIDx0aXRsZT5XZWxjb21lPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworICA8c2VjdGlvbiBuYW1lPSJXZWxjb21lIHRvIHRoZSBBbnQgUHJvamVjdHMgQXJlYSI+CisgICAgPGgzPlRoaXMgaXMgd2hlcmUgdGhlIEFudCBzdWItcHJvamVjdHMgbGl2ZSE8L2gzPgorCisgICAgPHA+Tm93LCB0aGF0IEFudCBoYXMgYmVjb21lIGFuIEFwYWNoZSBUb3AtTGV2ZWwgUHJvamVjdCBpdCBpcyB0aW1lIHRvIG1ha2Ugc3BhY2Ugb24gdGhpcworICAgIFdlYi1QYWdlIGZvciBBbnQgc3ViLXByb2plY3RzLjwvcD4KKyAgICA8cD5UbyBtYWtlIHN1cmUgeW91IGRvIG5vdCBtaXNzIGFueXRoaW5nOiBTdGF5IHR1bmVkIGFuZCB2aXNpdCB0aGlzIHBhZ2UgZnJvbSB0aW1lIHRvIHRpbWUgOikhCisgICAgPC9wPgorICA8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CisKZGlmZiAtLWdpdCBhL3RydW5rL3hkb2NzL3Byb2plY3RzL2l2eS54bWwgYi90cnVuay94ZG9jcy9wcm9qZWN0cy9pdnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjYzNmMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9wcm9qZWN0cy9pdnkueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/Pg0KKzwhLS0NCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCistLT4NCis8ZG9jdW1lbnQ+DQorDQorICA8cHJvcGVydGllcz4NCisgICAgPGluZGV4IHZhbHVlPSIxIi8+DQorICAgIDx0aXRsZT5UaGUgSXZ5IFN1YnByb2plY3Q8L3RpdGxlPg0KKyAgPC9wcm9wZXJ0aWVzPg0KKw0KKyAgPGJvZHk+DQorDQorICAgIDxzZWN0aW9uIG5hbWU9IlRoZSBJdnkgU3VicHJvamVjdCI+DQorICAgICAgPGgzPkFwYWNoZSBJdnk8L2gzPg0KKw0KKyAgICAgIDxwPkl2eSBpcyBhIHNpbXBsZSB5ZXQgcG93ZXJmdWwgZGVwZW5kZW5jeSBtYW5hZ2VyIGZlYXR1cmluZyBjb250aW51b3VzIGludGVncmF0aW9uLA0KKyAgICAgIGRlcGVuZGVuY2llcyBvZiBkZXBlbmRlbmNpZXMgbWFuYWdlbWVudCwgbXVsdGlwbGUgcmVwb3NpdG9yaWVzIGluY2x1ZGluZyBpYmlibGlvIGFuZA0KKyAgICAgIGhpZ2ggcGVyZm9ybWFuY2UgKHVzZSBvZiBhIGxvY2FsIGNhY2hlKS48L3A+DQorDQorICAgIDwvc2VjdGlvbj4NCisNCisgIDwvYm9keT4NCis8L2RvY3VtZW50Pg0KKw0KZGlmZiAtLWdpdCBhL3RydW5rL3hkb2NzL3Jlc291cmNlcy54bWwgYi90cnVuay94ZG9jcy9yZXNvdXJjZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTdhYjQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9yZXNvdXJjZXMueG1sCkBAIC0wLDAgKzEsNzYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgorPCEtLQorICAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8ZG9jdW1lbnQ+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iYm9kZXdpZ0BhcGFjaGUub3JnIj5TdGVmYW4gQm9kZXdpZzwvYXV0aG9yPgorICAgIDx0aXRsZT5SZXNvdXJjZXM8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJvZHk+CisgICAgPHNlY3Rpb24gbmFtZT0iRkFRcyI+CisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBdCBBbnQncyB3ZWJzaXRlIj4KKworICAgICAgICA8cD5TdGFydGluZyB3aXRoIHRoZSByZWxlYXNlIG9mIEFudCAxLjQgdGhlIEFudCdzIEZBUSBpcworICAgICAgICBidW5kbGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gY2FuCisgICAgICAgIGFsd2F5cyBiZSBmb3VuZCBhdCB0aGUgd2Vic2l0ZS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5GQVE6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJmYXEuaHRtbCI+aHR0cDovL2FudC5hcGFjaGUub3JnL2ZhcS5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iakd1cnUiPgorICAgICAgICA8cD5qR3VydSBob3N0cyBhbiBpbnRlcmFjdGl2ZSBBbnQgZGlzY3Vzc2lvbiBmb3J1bSBhbmQgRkFRIHN5c3RlbTwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkZvcnVtOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qZ3VydS5jb20vZm9ydW1zL2hvbWUuanNwP3RvcGljPUFudCI+aHR0cDovL3d3dy5qZ3VydS5jb20vZm9ydW1zL2hvbWUuanNwP3RvcGljPUFudDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkZBUTo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuamd1cnUuY29tL2ZhcS9ob21lLmpzcD90b3BpYz1BbnQiPmh0dHA6Ly93d3cuamd1cnUuY29tL2ZhcS9ob21lLmpzcD90b3BpYz1BbnQ8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJGQVEgYWJvdXQgQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgdGFza3MiPgorICAgICAgICA8cD5CZW5vaXQgTW91c3NhdWQsIHRoZSBvcmlnaW5hbCBhdXRob3Igb2YgdGhlIEJvcmxhbmQKKyAgICAgICAgQXBwbGljYXRpb24gU2VydmVyIHNwZWNpZmljIDxhCisgICAgICAgIGhyZWY9Im1hbnVhbC9PcHRpb25hbFRhc2tzL2VqYi5odG1sI2VqYnRhc2tzIj5FSkIgdGFza3M8L2E+IGhhcyBwdXQKKyAgICAgICAgdG9nZXRoZXIgYSBGQVEgZm9yIHRoaXMgc3BlY2lmaWMgc3VidGFzay48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5GQVE6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm1vdXNzYXVkLm9yZy9lamJqYXIuaHRtbCI+aHR0cDovL3d3dy5tb3Vzc2F1ZC5vcmcvZWpiamFyLmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IldJS0lzIj4KKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFwYWNoZSI+CisKKyAgICAgICAgPHA+VGhlIEFTRiBwcm92aWRlcyBhIFdpa2kgZmFybSBmb3IgQXBhY2hlIHByb2plY3RzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPk1haW4gcGFnZTo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvZ2VuZXJhbCI+QXBhY2hlIFdpa2kgRmFybTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkFudCBXaWtpOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9hbnQvIj5BbnQgV2lraTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisKKworCisgICAgPHNlY3Rpb24gbmFtZT0iQm9va3MiPgorICAgICAgPHA+VGhlIG1vc3QgcmVjZW50IGJvb2tzIGNvbWUgZmlyc3Q8L3A+CisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnQgaW4gQWN0aW9uIgorICAgICAgICAgIGlzYm49IjE5MzIzOTQ4MFgiPgorICAgICAgICA8cD5QdWJsaXNoZWQgQXByaWwvTWF5IDIwMDcsIGFuZCBjb3ZlcmluZyBBbnQgMS43LjwvcD4KKworICAgICAgICA8cD5UaGlzIGlzIGEgbWFqb3IgcmV3cml0ZSBvZiB0aGUgZmlyc3QgZWRpdGlvbjsgc3RpbGwgNjAwIHBhZ2VzIGxvbmcuCisgICAgICAgIDwvcD4KKworICAgICAgICA8cD4KKyAgICAgICAgICBUaGlzIGJvb2sgbW92ZXMgdXAgZnJvbSBBbnQxLjUgdG8gSmF2YTEuNSBhbmQgMS43LCB3aXRoIGEgbmVhci1jb21wbGV0ZQorICAgICAgICAgIHJld3JpdGUgb2YgdGhlIGFwcGxpZWQtYW50IHNlY3Rpb24sIGNvdmVyaW5nIG5ldyB0b3BpY3Mgc3VjaCBhcworICAgICAgICAgIGFudGxpYnMsIHJlcG9zaXRvcnkgbWFuYWdlbWVudCB3aXRoIEl2eSwgWG1sIFNjaGVtYSB2YWxpZGF0aW9uLAorICAgICAgICAgIEVKQjMuMC9KYXZhIEVFIGRldmVsb3BtZW50IGFuZCBhZHZhbmNlZCBkZXBsb3ltZW50IHVzaW5nIFNtYXJ0RnJvZy4KKyAgICAgICAgICBUaGUgYW50IGNvZGluZyBzZWN0aW9uIGxvb2tzIGF0IEFudFVuaXQsIGFudGxpYiBhdXRob3JpbmcgYW5kCisgICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlcywgd2hpbGUgdGhlIGJlZ2lubmVycyBjaGFwdGVycywgdGhlIGZpcnN0IHRoaXJkCisgICAgICAgICAgb2YgdGhlIGJvb2ssIHN0aWxsIHNob3dzIGRldmVsb3BlcnMgaG93IHRvIGJ1aWxkLCB0ZXN0LCBwYWNrYWdlIGFuZAorICAgICAgICAgIHJlZGlzdHJpYnV0ZSBhIEphdmEgYXBwbGljYXRpb24uCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgSWYgeW91IGFyZSBvbmUgb2YgdGhlIDIwLDAwMCsgb3duZXJzIG9mIHRoZSBmaXJzdCBlZGl0aW9uLCBpdCBpcyBub3cKKyAgICAgICAgICBvYnNvbGV0ZS4gU29ycnkgOikKKyAgICAgICAgPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+U3RldmUgTG91Z2hyYW4gYW5kIEVyaWsgSGF0Y2hlcjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+UHVibGlzaGVyIFVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm1hbm5pbmcuY29tL2xvdWdocmFuLyI+CisgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5tYW5uaW5nLmNvbS9sb3VnaHJhbi8KKyAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Cb29rIFVSTDwvdGg+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnRib29rLm9yZy8iPgorICAgICAgICAgICAgICAgIGh0dHA6Ly9hbnRib29rLm9yZy8KKyAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Tb3VyY2UgY29kZSByZXBvc2l0b3J5PC90aD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9hbnRib29rIj4KKyAgICAgICAgICAgICAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2FudGJvb2sKKyAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnQ6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCAybmQgZWRpdGlvbiIgaXNibj0iMDU5NjAwNjA5OCI+CisgICAgICAgIDxwPlB1Ymxpc2hlZCBBcHJpbCAyMDA1LCBhbmQgY292ZXJzIEFudCByZWxlYXNlIDEuNi4xLjwvcD4KKworICAgICAgICA8cD5UaGlzIGlzIGEgY29tcGxldGUgcmV3cml0ZSBvZiB0aGUgZmlyc3QgZWRpdGlvbjsgdGhpcyBib29rIGlzCisgICAgICAgIG5vdyAyOTAgcGFnZXMgYW5kIHNvIGNvdmVycyBBbnQgaW4gbW9yZSBkZXB0aCB0aGFuIGl0cyBwcmVkZWNlc3Nvci4KKyAgICAgICAgPC9wPgorCisgICAgICAgIDxwPkl0IGFsc28gbWl4ZXMgcmVmZXJlbmNlIGluZm9ybWF0aW9uICh0YWJsZXMpIHdpdGggdGV4dCBleHBsYW5hdGlvbgorICAgICAgICBvbiBob3cgdG8gdXNlIHRoZSB0YXNrcy4gQ29udGVudHMgaW5jbHVkZXMgSlVuaXQsIENWUywgZXhlY3V0aW9uLCBiYXNpYworICAgICAgICBkZXBsb3ltZW50LCBXZWIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgYW5kIFhEb2NsZXQuIFRoZXJlIGlzIGFsc28gY292ZXJhZ2UKKyAgICAgICAgb2YgWERvY2xldCwgYW5kIGEgY2hhcHRlciBvbiBob3cgdG8gZXh0ZW5kIEFudCBpbiBKYXZhLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgorICAgICAgICAgICAgPHRkPlN0ZXZlIEhvbHpuZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9yZWlsbHkuY29tL2NhdGFsb2cvYW50dGRnMi8iPmh0dHA6Ly93d3cub3JlaWxseS5jb20vY2F0YWxvZy9hbnR0ZGcyLzwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iUHJhZ21hdGljIFByb2plY3QgQXV0b21hdGlvbiIgaXNibj0iMDk3NDUxNDAzOSI+CisgICAgICAgIDxwPgorCisgICAgICAgIEhvdyB0byBCdWlsZCwgRGVwbG95LCBhbmQgTW9uaXRvciBKYXZhIEFwcGxpY2F0aW9ucy4KKyAgICAgICAgUHVibGlzaGVkOiBKdWx5IDIwMDQgSVNCTjogICAgICAgIDAtOTc0NTE0MC0zLTkKKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICBUaGlzIGlzIG5vdCBhIHJlZmVyZW5jZSBndWlkZSB0byBBbnQsIGJ1dCBhIGJvb2sgb24gaG93IHRvIGF1dG9tYXRlIHRoZSBidWlsZCBwcm9jZXNzLgorICAgICAgICAgIFRoZSBjb3JlIGJ1aWxkLCBjb250aW51b3VzIGludGVncmF0aW9uLCByZXBvcnRpbmcgYW5kIHJlbGVhc2UgbWFuYWdlbWVudAorICAgICAgICAgIGFyZSBhbGwgY292ZXJlZC4gQW50IGlzIG9mIGNvdXJzZSBjZW50cmFsIHRvIHRoaXMuIFRoaXMgaXMgYSBmdW4gcmVhZCEKKyAgICAgICAgPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgorICAgICAgICAgICAgPHRkPk1pa2UgQ2xhcms8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnByYWdtYXRpY3Byb2dyYW1tZXIuY29tL3NrL2F1dG8vIj5odHRwOi8vd3d3LnByYWdtYXRpY3Byb2dyYW1tZXIuY29tL3NrL2F1dG8vLzwvYT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworCisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkV4dHJlbWUgUHJvZ3JhbW1pbmcgd2l0aCBBbnQiIGlzYm49IjA2NzIzMjU2MjQiPgorICAgICAgICAgPHA+IFRoaXMgYm9vayBzaG93cyBob3cgdG8gaW1wbGVtZW50IGFuIFhQIHByb2plY3QgdXNpbmcgQW50IDEuNS4zLCBhbmQgbWFueSBvdGhlciAzcmQgcGFydHkgdG9vbHMuICBDb3ZlcnM6PC9wPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgPGxpPlRoZSBmdW5kYW1lbnRhbHMgb2YgQW50OiBjb25jZXB0cywgY29yZSBhbmQgb3B0aW9uYWwgdGFza3M8L2xpPgorICAgICAgICAgICAgICAgPGxpPkhvdyB0byB3cml0ZSBjdXN0b20gQW50IGNvbXBvbmVudHMsIGluY2x1ZGluZyBjdXN0b20gVGFza3MsIExvZ2dlcnMsIExpc3RlbmVycywgSW5wdXQgSGFuZGxlcnMsIFNlbGVjdG9ycywgRmlsdGVycywgTWFwcGVycyBhbmQgRGF0YSBUeXBlczwvbGk+CisgICAgICAgICAgICAgICA8bGk+TWl0aWdhdGluZyByaXNrcyBieSBjcmVhdGluZyBzcGlrZSB0ZXN0cyB3aXRoIEFudCBidWlsZGZpbGVzPC9saT4KKyAgICAgICAgICAgICAgIDxsaT5BZGQgQ1ZTIHZlcnNpb24gY29udHJvbCBhbmQgdGVzdGluZyB3aXRoIEpVbml0PC9saT4KKyAgICAgICAgICAgICAgIDxsaT5BdXRvbWF0ZSBuaWdodGx5IGJ1aWxkcyBhbmQgcmVwb3J0aW5nPC9saT4KKyAgICAgICAgICAgICAgIDxsaT5EZXBsb3kgYXBwbGljYXRpb25zIGR5bmFtaWNhbGx5IHVzaW5nIFhEb2NsZXQ8L2xpPgorICAgICAgICAgICAgICAgPGxpPkVuZm9yY2luZyBDb2RlIFN0YW5kYXJkcyB3aXRoIEphbG9weSwgUE1ELCBDaGVja1N0eWxlLCBpQ29udHJhY3QsIEpEZXBlbmQ8L2xpPgorICAgICAgICAgICAgICAgPGxpPlVzaW5nIFJlbW90ZSBBbnQgKFJhbnQpIGFuZCBDcnVpc2VDb250cm9sPC9saT4KKyAgICAgICAgICAgICAgIDxsaT5HZW5lcmF0aW5nIHByb2plY3QgZG9jdW1lbnRhdGlvbjwvbGk+CisgICAgICAgICAgICAgICA8bGk+QWRhcHRpbmcgYW4gWFAgcHJvY2VzcyBmb3IgdXNlIGJ5IG90aGVyIHRlYW1zIG9yIGFjcm9zcyBhbiBlbnRlcnByaXNlPC9saT4KKyAgICAgICAgICAgICAgIDxsaT5DdXN0b20gVGFzayBleGFtcGxlcyB0byBnZW5lcmF0aW5nIFVNTCBkaWFncmFtcywgY3JlYXRpbmcgcmVwb3J0cyBhbmQgbWV0cmljcyBvbi10aGUtZmx5PC9saT4KKyAgICAgICAgICAgICAgIDxsaT5Gb2xsb3dzIGEgY2FzZS1zdHVkeSBvZiBhIHRlYW0gdGhhdCBpbXBsZW1lbnRzIGFuIFhQIFByb2plY3Q8L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yczo8L3RoPgorICAgICAgICAgICAgPHRkPkdsZW5uIE5pZW1leWVyIGFuZCBKZXJlbXkgUG90ZWV0PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnNhbXMuY29tL2NhdGFsb2cvcHJvZHVjdC5hc3A/cHJvZHVjdF9pZD0lN0JGQjgyNUE0OC1CQzA0LTRDNTUtQkQ4Qy1ERjkzQzZCQkY5MjAlN0QiPmh0dHA6Ly93d3cuc2Ftcy5jb20vY2F0YWxvZy9wcm9kdWN0LmFzcD9wcm9kdWN0X2lkPSU3QkZCODI1QTQ4LUJDMDQtNEM1NS1CRDhDLURGOTNDNkJCRjkyMCU3RDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudC4gRGFzIEphdmEtQnVpbGQtVG9vbCBpbiBkZXIgUHJheGlzIiBpc2JuPSIzODI3MzIwNjY2Ij4KKyAgICAgICAgPHA+QSBHZXJtYW4gbGFuZ3VhZ2UgYm9vayBvbiBBbnQgdGhhdCBjb3ZlcnMgQW50IDEuNS4KKyAgICAgICAgVGhpcyBpcyB0aGUgb3JpZ2luYWwgZGVzY3JpcHRpb246PC9wPgorICAgICAgICA8c291cmNlPgorICAgICAgICBEYXMgQnVpbGQtVG9vbCBBbnQgaXN0IGRhcyBPcGVuLVNvdXJjZS1XZXJremV1ZywgZGFzIGRlbiBFbnR3aWNrbHVuZ3Nwcm96ZXNzIGVpbmVyIEphdmEtCisgICAgICAgIG9kZXIgSjJFRS1BbndlbmR1bmcgd2VzZW50bGljaCB2ZXJlaW5mYWNodC4gR2VzdGV1ZXJ0IGR1cmNoIFhNTC1iYXNpZXJ0ZSBTa3JpcHRlIGbvv71ocnQgZXMKKyAgICAgICAgbmFoZXp1IGFsbGUgQXVmZ2FiZW4gYXVzLCBkaWUgbmFjaCBkZW0gS29kaWVyZW4gZWluZXIgQW53ZW5kdW5nIGFuZmFsbGVuLjwvc291cmNlPgorICAgICAgICA8cD5Tb21lIHRvcGljczo8L3A+CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgPGxpPmNyZWF0aW5nIGFyY2hpdmVzICh6aXAsIGphcik8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5jYWxsIHRoZSBqYXZhIGNvbXBpbGVyPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+ZWRpdCBwcm9wZXJ0eSBmaWxlczwvbGk+CisgICAgICAgICAgICAgICAgPGxpPmZpbGUgb3BlcmF0aW9uPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+c291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDxwPlRoZSBib29rIGlzIGF2YWlsYWJsZSBpbiBFbmdsaXNoIGFzICJBbnQ6IFRoZSBKYXZhIEJ1aWxkIFRvb2wgaW4gUHJhY3RpY2UiPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkF1dGhvcnM6PC90aD4KKyAgICAgICAgICAgIDx0ZD5CZXJuZCBNYXR6a2U8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuYWRkaXNvbi13ZXNsZXkuZGUvbWFpbi9tYWluLmFzcD9wYWdlPWhvbWUvYm9va2RldGFpbHMmYW1wO1Byb2R1Y3RJRD0xMzQ1OSI+aHR0cDovL3d3dy5hZGRpc29uLXdlc2xleS5kZS9tYWluL21haW4uYXNwP3BhZ2U9aG9tZS9ib29rZGV0YWlscyZhbXA7UHJvZHVjdElEPTEzNDU5PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSmF2YSBEZXZlbG9wbWVudCB3aXRoIEFudCIgaXNibj0iMTkzMDExMDU4OCI+CisgICAgICAgIDxwPlB1Ymxpc2hlZCAyMDAyLiBUaGlzIGJvb2sgY292ZXJzIEFudCAxLjUsIGluY2x1ZGluZzo8L3A+CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgPGxpPlRoZSBuZXcgQW50IDEuNSBmZWF0dXJlczwvbGk+CisgICAgICAgICAgICAgICAgPGxpPkFudCdzIGRhdGF0eXBlcyBhbmQgcHJvcGVydHkgaGFuZGxpbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5KVW5pdCB0ZXN0aW5nIGFuZCByZXBvcnRpbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5Db250aW51b3VzIGludGVncmF0aW9uIHRlY2huaXF1ZXM8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5YRG9jbGV0IGZvciBhdHRyaWJ1dGUtb3JpZW50ZWQgcHJvZ3JhbW1pbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5FSkIgZ2VuZXJhdGlvbiwgYnVpbGRpbmcsIGFuZCBwYWNrYWdpbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5Xcml0aW5nIGFuZCB0ZXN0aW5nIG5hdGl2ZSBjb2RlPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+QnVpbGRpbmcgV2ViIFNlcnZpY2VzIHdpdGggQXBhY2hlIEF4aXM8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5EZXBsb3lpbmcgeW91ciBzeXN0ZW0gdG8gbXVsdGlwbGUgcmVtb3RlIHNlcnZlcnM8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5Vc2luZyBhbmQgd3JpdGluZworICAgICAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+TG9nZ2VyczwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+TGlzdGVuZXJzPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5TZWxlY3RvcnM8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPkN1c3RvbSB0YXNrczwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvdWw+CisgICAgICAgIDxwPkFsc28gYXZhaWxhYmxlIGluIEtvcmVhbiBhbmQgR2VybWFuIGVkaXRpb25zPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yczo8L3RoPgorICAgICAgICAgICAgPHRkPkVyaWsgSGF0Y2hlciBhbmQgU3RldmUgTG91Z2hyYW48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cubWFubmluZy5jb20vYW50Ym9vay8iPmh0dHA6Ly93d3cubWFubmluZy5jb20vYW50Ym9vay88L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnQ6IFRoZSBEZWZpbml0aXZlIEd1aWRlLCAxc3QgZWRpdGlvbiIgaXNibj0iMDU5NjAwMTg0MyI+CisgICAgICAgICAgPCEtLSBhIHNvb24gYXMgc29tZWJvZHkgc3VibWl0cyBhIGRlc2NyaXB0aW9uLCBsZXQncyBhZGQgaXQgLS0+CisgICAgICAgIDxwPlB1Ymxpc2hlZCAyMDAyLCBDb3ZlcnMgQW50IHJlbGVhc2UgMS40LjEuPC9wPgorICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkF1dGhvcnM6PC90aD4KKyAgICAgICAgICAgIDx0ZD5KZXNzZSBFLiBUaWxseSBhbmQgRXJpYyBNLiBCdXJrZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmVpbGx5LmNvbS9jYXRhbG9nL2FudHRkZy8iPmh0dHA6Ly93d3cub3JlaWxseS5jb20vY2F0YWxvZy9hbnR0ZGcvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50LiBLdXJ6IHVuZCBHdXQuIiBpc2JuPSIzODk3MjEyNDEyIj4KKworICAgICAgICA8cD5BIEdlcm1hbiBsYW5ndWFnZSBzaG9ydCByZWZlcmVuY2UgZm9yIEFudCB0aGF0IGNvdmVycyBBbnQKKyAgICAgICAgMS40LiAgVGhpcyBpcyB0aGUgb3JpZ2luYWwgZGVzY3JpcHRpb246PC9wPgorCisgICAgICAgIDxzb3VyY2U+CisgIEFudCBrdXJ6ICZhbXA7IGd1dCBlbnRoJiN4ZTQ7bHQgZWluZSB2b2xsc3QmI3hlNDtuZGlnZSBSZWZlcmVueiBkZXIgQnVpbHQtaW4gVGFza3MKKyAgdW5kIGlocmVyIGpld2VpbGlnZW4gQXR0cmlidXRlIHNvd2llIGt1cnplIEJlaXNwaWVsZSBmJiN4ZmM7ciBpaHJlIFZlcndlbmR1bmcuCisgIERhbmViZW4gYmlldGV0IGRhcyBCdWNoIGVpbmUga25hcHBlIEVpbmYmI3hmYztocnVuZyBpbiBkaWUgQXJiZWl0IG1pdCBBbnQgdW5kCisgIGVpbmUgRXJsJiN4ZTQ7dXRlcnVuZyBkZXIgQW50LUJhc2lzZWxlbWVudGUgKFByb2pla3RlLCBQcm9wZXJ0aWVzLCBUYXJnZXRzIHVuZCBUYXNrcykuCisgIEJlaGFuZGVsdCB3ZXJkZW4gYXUmI3hkZjtlcmRlbSBncnVuZGxlZ2VuZGUgS29uemVwdGUgd2llIEZpbGVzZXRzLCBQYXR0ZXJuc2V0cyB1bmQKKyAgUGZhZHN0cnVrdHVyZW4sIGRhcyBTY2hyZWliZW4gZWlnZW5lciBUYXNrcywgZGllIEF1ZnJ1Zi1TeW50YXggdW5kIE9wdGlvbmFsIFRhc2tzLiA8L3NvdXJjZT4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD5TdGVmYW4gRWRsaWNoPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5kZS9leGVjL29iaWRvcy9BU0lOLzM4OTcyMTI0MTIvIj5odHRwOi8vd3d3LmFtYXpvbi5kZS9leGVjL29iaWRvcy9BU0lOLzM4OTcyMTI0MTIvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSmF2YSBUb29scyBmb3IgZVh0cmVtZSBQcm9ncmFtbWluZyIgaXNibj0iMDQ3MTIwNzA4WCI+CisgICAgICAgIDxwPlRoaXMgYm9vayBjb3ZlcnMgdGhlIGZvbGxvd2luZyBYUCBzdWJqZWN0czo8L3A+CisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgPGxpPkF1dG9tYXRlZCB1bml0IGFuZCBmdW5jdGlvbmFsIHRlc3Rpbmc8L2xpPgorICAgICAgICAgICAgICAgIDxsaT5Db250aW51b3VzIGludGVncmF0aW9uIHRocm91Z2ggYnVpbGQgYW5kIGRlcGxveW1lbnQgYXV0b21hdGlvbjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPlRoZSB2YWx1ZSBvZiByZWZhY3RvcmluZyBhbmQgY29udGludW91cyBpbnRlZ3JhdGlvbjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPkhvdyBBbnQsIEpVbml0LCBKVW5pdFBlcmYsIENhY3R1cywgSFRUUFVuaXQsIGFuZCBKTWV0ZXIKKyAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBnb2FscyBvZiB0aGUgWFAgbWV0aG9kb2xvZ3k8L2xpPgorICAgICAgICAgICAgPC91bD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkF1dGhvcnM6PC90aD4KKyAgICAgICAgICAgIDx0ZD5SaWNoYXJkIEhpZ2h0b3dlciBhbmQgTmljaG9sYXMgTGVzaWVja2k8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cud2lsZXkuY29tL2NkYS9wcm9kdWN0LzAsLDA0NzEyMDcwOFgsMDAuaHRtbCI+aHR0cDovL3d3dy53aWxleS5jb20vY2RhL3Byb2R1Y3QvMCwsMDQ3MTIwNzA4WCwwMC5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IkFydGljbGVzIGFuZCBQcmVzZW50YXRpb25zIj4KKworICAgICAgPHA+VGhlIGZvbGxvd2luZyBzZWN0aW9ucyBsaXN0IGFydGljbGVzIGFuZCBwcmVzZW50YXRpb25zCisgICAgICB3cml0dGVuIGFib3V0IEFwYWNoZSBBbnQuICBJZiB5b3UndmUgd3JpdHRlbiBzb21ldGhpbmcgdGhhdAorICAgICAgc2hvdWxkIGJlIGluY2x1ZGVkLCBwbGVhc2UgcG9zdCBpdCB0byBvbmUgb2YgdGhlIG1haWxpbmcKKyAgICAgIGxpc3RzLjwvcD4KKworICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIG5hbWU9IkFydGljbGVzIj4KKworICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkV4dGVuZGluZyBBbnQgSW5wdXQgQWJpbGl0aWVzIj4KKyAgICAgICAgIDxwPlRoZSBjb250ZW50cyBvZiB0aGlzIGRvY3VtZW50IGlzIHRoZSBmb2xsb3dpbmc6PHVsPgorICAgICAgICAgICA8bGk+U2VjdGlvbiAyIHByb3ZpZGVzIGEgc2ltcGxlIGV4YW1wbGUgaG93IElucHV0SGFuZGxlcnMgYXJlIGNyZWF0ZWQsPC9saT4KKyAgICAgICAgICAgPGxpPlNlY3Rpb24gMyBkZXZlbG9wcyBhbiBpbnB1dGhhbmRsZXIgdGhhdCBtYXNrcyB0aGUgcGFzc3dvcmRzIHR5cGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsPC9saT4KKyAgICAgICAgICAgPGxpPlNlY3Rpb24gNCBnaXZlcyB0d28gaGFuZGxlcnMsIHdob3NlIGlucHV0IGlzIHR5cGVkIGluIGdyYXBoaWNhbCBjb21wb25lbnRzLDwvbGk+CisgICAgICAgICAgIDxsaT5TZWN0aW9uIDUgZXh0ZW5kcyBJbnB1dCB0YXNrIHNvIHRoYXQgd2UgY2FuIHVzZSBkaWVyZW50IGlucHV0IGhhbmRsZXJzIG9uIGRpZmZlcmVudCB1c2VzIG9mICZsdDtpbnB1dCZndDssPC9saT4KKyAgICAgICAgICAgPGxpPlNlY3Rpb24gNiBkZXNjcmliZXMgYSBwcm9ibGVtIGZvdW5kIHdoaWxlIHdyaXRpbmcgdGhpcyBkb2N1bWVudCw8L2xpPgorICAgICAgICAgICA8bGk+U2VjdGlvbiA3IHN1bW1hcml6ZXMgc29tZSBkYXJrIGNvcm5lcnMgdGhlIGF1dGhvciBkbyBub3QgdW5kZXJzdGFuZC48L2xpPgorICAgICAgICAgPC91bD48L3A+CisKKyAgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgICA8dGQ+SXZhbiBJdmFub3Y8L3RkPgorICAgICAgICAgICA8L3RyPgorICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9MTAzNTA5Ij5odHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9MTAzNTA5IChEb3dubG9hZCBaSVArUERGIGZyb20gU291cmNlZm9yZ2UpPC9hPjwvdGQ+CisgICAgICAgICAgIDwvdHI+CisgICAgICAgICA8L3RhYmxlPgorICAgICAgIDwvc3Vic2VjdGlvbj4KKworCisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IktlZXAgdGhlIEFudCwgSG9sZCB0aGUgWE1MIj4KKyAgICAgICAgPHA+S2V5IEcuIEdhdXRoaWVyIHRhbGtzIGFib3V0IHdyaXRpbmcgImJ1aWxkZmlsZXMiIGluIEphdmEuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+S2V5IEcuIEdhdXRoaWVyPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmZ0cG9ubGluZS5jb20vamF2YXByby8yMDA0XzA2L21hZ2F6aW5lL2ZlYXR1cmVzL2tnYXV0aGllci8iPmh0dHA6Ly93d3cuZnRwb25saW5lLmNvbS9qYXZhcHJvLzIwMDRfMDYvbWFnYXppbmUvZmVhdHVyZXMva2dhdXRoaWVyLzwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudCAxLjYgZm9yIFRhc2sgV3JpdGVycyI+CisgICAgICAgIDxwPlRoaXMgYXJ0aWNsZSB0YWxrcyBhYm91dCBYTUwgbmFtZXNwYWNlIGhhbmRsaW5nLCBBbnQKKyAgICAgICAgbGlicmFyaWVzIGFuZCB0aGUgbmV3bHkgaW50cm9kdWNlZCB0eXBlIHBvbHltb3JwaGlzbS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD5TdGVmYW4gQm9kZXdpZzwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL290bi5vcmFjbGUuY29tL3B1Yi9hcnRpY2xlcy9ib2Rld2lnX3Rhc2t3cml0ZXJzLmh0bWwiPmh0dHA6Ly9vdG4ub3JhY2xlLmNvbS9wdWIvYXJ0aWNsZXMvYm9kZXdpZ190YXNrd3JpdGVycy5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iTWFuYWdpbmcgQnVpbGQgQ29tcGxleGl0eSB3aXRoIEFwYWNoZSBBbnQgMS42Ij4KKworICAgICAgICA8cD5BcyBBcGFjaGUgQW50IGlzIGFwcGxpZWQgdG8gaW5jcmVhc2luZ2x5IGRpZmZpY3VsdCB0YXNrcywKKyAgICAgICAgaXRzIHVzZXJzIGFyZSBjcmVhdGluZyBtb3JlIGNvbXBsZXggYW5kIGxlc3MgbGVnaWJsZSBidWlsZAorICAgICAgICBmaWxlcy4gVGhpcyBpcyBkdWUsIGluIHBhcnQsIHRvIHRoZSBsaW1pdGVkIHRvb2xzIGZvcgorICAgICAgICBkZWNvbXBvc2l0aW9uIGFuZCBjb2RlIHJldXNlIHdpdGhpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZgorICAgICAgICBBbnQuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+R2VvZmZyZXkgV2lzZW1hbjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5zeXMtY29uLmNvbS9zdG9yeS8/c3RvcnlpZD00NTA3OCZhbXA7REU9MSI+aHR0cDovL3d3dy5zeXMtY29uLmNvbS9zdG9yeS8/c3RvcnlpZD00NTA3OCZhbXA7REU9MTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik5ldyBBbnQgMS42IEZlYXR1cmVzIGZvciBCaWcgUHJvamVjdHMiPgorICAgICAgICA8cD5UaGlzIGFydGljbGUgZGVzY3JpYmVzIHRoZSAmbHQ7bWFjcm9kZWYmZ3Q7LCAmbHQ7aW1wb3J0Jmd0OworICAgICAgICAgIGFuZCAmbHQ7c3ViYW50Jmd0OyB0YXNrcyBpbiBkZXRhaWwgYW5kIHNob3dzIGhvdyB0aGV5IGhlbHAgaW4KKyAgICAgICAgICBidWlsZGluZyBiaWdnZXIgc3lzdGVtcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD5TdGVmYW4gQm9kZXdpZzwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL290bi5vcmFjbGUuY29tL3B1Yi9hcnRpY2xlcy9ib2Rld2lnX2FudDEuNi5odG1sIj5odHRwOi8vb3RuLm9yYWNsZS5jb20vcHViL2FydGljbGVzL2JvZGV3aWdfYW50MS42Lmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJQcm9ncmFtbWllcmVuIGb8ciBBbnQiPgorICAgICAgICA8cD5UaGlzIGFydGljbGUgZGVzY3JpYmVzIHRoZSBtYWluIHRvcGljcyBvZiBwcm9ncmFtbWluZyB5b3VyIG93biB0YXNrcy4KKyAgICAgICAgRGVzY3JpcHRpb24gaXMgZG9uZSBvbiBmaXZlIGV4YW1wbGVzLjwvcD4KKyAgICAgICAgPHA+VGhpcyBhcnRpY2xlIGlzIHdyaXR0ZW4gaW4gR2VybWFuIGFuZCBwdWJsaXNoZWQgaW4KKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5zaWdzLWRhdGFjb20uZGUvc2QvcHVibGljYXRpb25zL2pzL2luZGV4Lmh0bSI+SmF2YS1TcGVrdHJ1bTwvYT4KKyAgICAgICAgNS8yMDA0LjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgorICAgICAgICAgICAgPHRkPkJlcm5kIE1hdHprZTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5zaWdzLWRhdGFjb20uZGUvc2QvbmV3cy9kb2N1bWVudD9QSUQ9MjE2Ij5odHRwOi8vd3d3LnNpZ3MtZGF0YWNvbS5kZS9zZC9uZXdzL2RvY3VtZW50P1BJRD0yMTY8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBbnQgaW4gQW5nZXI6IFVzaW5nIEFudCBpbiBhIFByb2R1Y3Rpb24gRGV2ZWxvcG1lbnQgU3lzdGVtIj4KKyAgICAgICAgPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgc3RyYXRlZ2llcyBhbmQgc29tZSBiYXNpYyBleGFtcGxlcyBvZiBob3cgdG8KKyAgICAgICAgdXNlIEFudCBpbiBsYXJnZXIgdGVhbSBkZXZlbG9wbWVudCBwcm9qZWN0cy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD5TdGV2ZSBMb3VnaHJhbjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iYW50X2luX2FuZ2VyLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRfaW5fYW5nZXIuaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudCBUYXNrIEd1aWRlbGluZXMiPgorICAgICAgICA8cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gd3JpdGUgY3VzdG9tIEFudCB0YXNrcywgYW5kIGhvdyB0byBzdWJtaXQKKyAgICAgICAgdGhlbSB0byBwb3RlbnRpYWxseSBiZSBpbmNsdWRlZCBpbiBBbnQuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+U3RldmUgTG91Z2hyYW48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9ImFudF90YXNrX2d1aWRlbGluZXMuaHRtbCI+aHR0cDovL2FudC5hcGFjaGUub3JnL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkJ1aWxkIGEgQmV0dGVyIFJvYm90IHdpdGggQW50Ij4KKyAgICAgICAgPHA+VGhpcyBhcnRpY2xlIGRlc2NyaWJlcyB0aGUgZ29yeSBkZXRhaWxzIG9mIHdyaXRpbmcgY3VzdG9tCisgICAgICAgICAgIEFudCB0YXNrcy48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD5FcmlrIEhhdGNoZXI8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuZmF3Y2V0dGUuY29tL2phdmFwcm8vMjAwM18wMi9tYWdhemluZS9mZWF0dXJlcy9laGF0Y2hlci8iPmh0dHA6Ly93d3cuZmF3Y2V0dGUuY29tL2phdmFwcm8vMjAwM18wMi9tYWdhemluZS9mZWF0dXJlcy9laGF0Y2hlci9sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQXV0b21hdGluZyB0aGUgYnVpbGQgYW5kIHRlc3QgcHJvY2VzcyI+CisgICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBkZW1vbnN0cmF0ZXMgYW4gYXBwcm9hY2ggdG8gdGhlIGF1dG9tYXRlZCBidWlsZCBhbmQgdGVzdCBwcm9jZXNzLiBXb3JraW5nIHdpdGggQW50IDEuMyBhbmQgdGhlIEpVbml0IHRlc3QgZnJhbWV3b3JrLCBpdCBzaG93cyBob3cgdG8gYXV0b21hdGUgYSBwcm9jZXNzIHRoYXQgY2FwdHVyZXMgcGVydGluZW50IGluZm9ybWF0aW9uIGFib3V0IGVhY2ggdGVzdCBzdWl0ZSBydW4sIGdlbmVyYXRlcyBhbiBhdHRyYWN0aXZlIHJlcG9ydCwgYW5kIGUtbWFpbHMgdGhlIHJlcG9ydC48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86ZWhhdGNoZXJAYXBhY2hlLm9yZyI+RXJpayBIYXRjaGVyPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2phdmEvbGlicmFyeS9qLWp1bml0bWFpbC8iPmh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9qYXZhL2xpYnJhcnkvai1qdW5pdG1haWwvPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iSW5jcmVtZW50YWwgZGV2ZWxvcG1lbnQgd2l0aCBBbnQgYW5kIEpVbml0Ij4KKyAgICAgICAgPHA+VGhpcyBhcnRpY2xlIGV4cGxvcmVzIHRoZSBiZW5lZml0cyBvZiB1bml0IHRlc3Rpbmcgd2l0aCBBbnQgYW5kCisgICAgICAgIEpVbml0LCBkZXRhaWxpbmcgaG93IHRvIGRldmVsb3AgYXV0b21hdGVkIHVuaXQgdGVzdHMgYW5kIGludGVncmF0ZSB0aGVtCisgICAgICAgIGludG8geW91ciBidWlsZCBwcm9jZXNzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzptYWxjb2xtQG51ZWFydGguY29tIj5NYWxjb2xtIERhdmlzPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy0xMDYuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L2otYW50Lz9kd3pvbmU9amF2YSI+aHR0cDovL3d3dy0xMDYuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L2otYW50Lz9kd3pvbmU9amF2YTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkF1dG9tYXRlIHlvdXIgYnVpbGQgcHJvY2VzcyB1c2luZyBKYXZhIGFuZCBBbnQiPgorICAgICAgICA8cD5UaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gaW50cm9kdWN0aW9uIHRvIHVzaW5nIEFudCB3aXRoIHNvbWUgYmFzaWMKKyAgICAgICAgZXhhbXBsZXMgYW5kIGJ5IGhpZ2hsaWdodGluZyBzb21lIG9mIHRoZSBpbXBvcnRhbnQgdGFza3MuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOm1pY2hhZWwuY3ltZXJtYW5AamF2YXdvcmxkLmNvbSI+TWljaGFlbCBDeW1lcm1hbjwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuamF2YXdvcmxkLmNvbS9qYXZhd29ybGQvanctMTAtMjAwMC9qdy0xMDIwLWFudC5odG1sIj5odHRwOi8vd3d3LmphdmF3b3JsZC5jb20vamF2YXdvcmxkL2p3LTEwLTIwMDAvanctMTAyMC1hbnQuaHRtbDwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlNob3J0IHR1dG9yaWFsIGluIENhY3R1cyZhcG9zOyAoZm9ybWVybHkgSjJFRVVuaXQpCisgICAgICBkb2N1bWVudGF0aW9uIj4KKyAgICAgICAgPHA+VGhlcmUgaXMgYSBzaG9ydCB0dXRvcmlhbCBvbiBob3cgdG8gdXNlIEFudCBpbiBDYWN0dXMmYXBvczsKKyAgICAgICAgZG9jdW1lbnRhdGlvbi4gIEl0IGhhcyBhIHNsYW50IHRvd2FyZHMgYnVpbGQgZmlsZXMgdGhhdCB3aWxsIGJlIHVzZWQKKyAgICAgICAgd2l0aCBDYWN0dXMuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+Q2FjdHVzIGRldmVsb3BtZW50IHRlYW08L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY2FjdHVzL2hvd3RvX2FudF9wcmltZXIuaHRtbCI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jYWN0dXMvaG93dG9fYW50X3ByaW1lci5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iRGV2ZWxvcGluZyBjdXN0b20gQW50IHRhc2tzIHdpdGggVmlzdWFsQWdlIGZvciBKYXZhIj4KKyAgICAgICAgPHA+VGhpcyBhcnRpY2xlIG91dGxpbmVzIGhvdyB0byBpbnRlZ3JhdGUgQW50IGludG8gVmlzdWFsQWdlIGZvciBKYXZhLAorICAgICAgICBhbmQgaG93IHRvIHdyaXRlIGFuZCBkZWJ1ZyBjdXN0b20gdGFza3MgdXNpbmcgdGhlIElERSBhbmQgdGhlCisgICAgICAgIGludGVncmF0ZWQgZGVidWdnZXIuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ibWFpbHRvOmdsZW5uQHNvbWFuZXR3b3Jrcy5jb20iPkdsZW5uIE1jQWxsaXN0ZXI8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Ny5zb2Z0d2FyZS5pYm0uY29tL3ZhZC5uc2YvZGF0YS9kb2N1bWVudDIzNjY/T3BlbkRvY3VtZW50JmFtcDtwPTEmYW1wO0JDVD0xJmFtcDtGb290ZXI9MSI+aHR0cDovL3d3dzcuc29mdHdhcmUuaWJtLmNvbS92YWQubnNmL2RhdGEvZG9jdW1lbnQyMzY2P09wZW5Eb2N1bWVudCZhbXA7cD0xJmFtcDtCQ1Q9MSZhbXA7Rm9vdGVyPTE8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJBdXRvbWF0ZWQgYnVpbGRzIHdpdGggVmlzdWFsQWdlIGZvciBKYXZhIGFuZCBBbnQiPgorICAgICAgICA8cD5UaGlzIGFydGljbGUgc2hvd3MgaG93IHlvdSBjYW4gcGVyZm9ybSBjb21tYW5kIGxpbmUgYnVpbGRzIHdpdGggYQorICAgICAgICBWaXN1YWxBZ2UgZm9yIEphdmEgcmVwb3NpdG9yeS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86Z2xlbm5Ac29tYW5ldHdvcmtzLmNvbSI+R2xlbm4gTWNBbGxpc3RlcjwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3c3LnNvZnR3YXJlLmlibS5jb20vdmFkLm5zZi9EYXRhL0RvY3VtZW50NDM2Nj9PcGVuRG9jdW1lbnQmYW1wO3A9MSZhbXA7QkNUPTMmYW1wO0Zvb3Rlcj0xIj5odHRwOi8vd3d3Ny5zb2Z0d2FyZS5pYm0uY29tL3ZhZC5uc2YvRGF0YS9Eb2N1bWVudDQzNjY/T3BlbkRvY3VtZW50JmFtcDtwPTEmYW1wO0JDVD0zJmFtcDtGb290ZXI9MTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3N1YnNlY3Rpb24+CisKKyAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IkFudDogQSBCdWlsZCBUb29sIGZyb20gdGhlIEpha2FydGEgUHJvamVjdCI+CisgICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBpcyBmcm9tIHRoZSAmcXVvdDtCZXN0IFByYWN0aWNlcyZxdW90OyBzZWN0aW9uIG9mCisgICAgICAgIFN1biZhcG9zO3MgRG90LUNvbSBCdWlsZGVyIFNpdGUuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+TGF1cmEgR2VlbGUgV2FuZzwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2RjYi5zdW4uY29tL3ByYWN0aWNlcy9wcm9maWxlcy9hbnQuanNwIj5odHRwOi8vZGNiLnN1bi5jb20vcHJhY3RpY2VzL3Byb2ZpbGVzL2FudC5qc3A8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJNYWtpbmcgYSBNb3VudGFpbiBPdXQgb2YgYW4gQW50aGlsbCI+CisgICAgICAgIDxwPlRoaXMgYXJ0aWNsZSBpcyBmcm9tIHRoZSBKdW5lIDIwMDEgaXNzdWUgb2YgdGhlIEphdmEgRGV2ZWxvcGVyJmFwb3M7CisgICAgICAgIEpvdXJuYWwuICBZb3UgbmVlZCB0byBiZSBhIHJlZ2lzdGVyZWQgSkRKIHN1YnNjcmliZXIgdG8gdmlldyB0aGlzCisgICAgICAgIGFydGljbGUuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+TmVhbCBGb3JkPC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnN5cy1jb24uY29tL2phdmEvYXJjaGl2ZXNhLmNmbT92b2x1bWU9MDYmYW1wO2lzc3VlPTA2Ij5odHRwOi8vd3d3LnN5cy1jb24uY29tL2phdmEvYXJjaGl2ZXNhLmNmbT92b2x1bWU9MDYmYW1wO2lzc3VlPTA2PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iVXNpbmcgQW50IGFuZCBXZWJsb2dpYyBFSkJzIj4KKyAgICAgICAgPHA+VGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBob3cgdG8gdXNlIEFudCB0byBjcmVhdGUgV2VibG9naWMgRUpCcywgYW5kCisgICAgICAgIHNvbWUgd29ya2Fyb3VuZHMgZm9yIGlzc3VlcyB5b3UgbWF5IGVuY291bnRlci48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD5KZXNzZSBFLiBUaWxseTwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDAxLzA2LzI1L2FudGVqYi5odG1sIj5odHRwOi8vd3d3Lm9uamF2YS5jb20vcHViL2Evb25qYXZhLzIwMDEvMDYvMjUvYW50ZWpiLmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJVc2luZyBKYXZhU2NyaXB0IHdpdGggQW50Ij4KKyAgICAgICAgPHA+QSB0dXRvcmlhbCBhYm91dCB1c2luZyBKYXZhU2NyaXB0IGFuZCBYU0xUIHdpdGggQW50LjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgorICAgICAgICAgICAgPHRkPkR5bGFuIFNjaGllbWFubjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5zaXRlcGVuLmNvbS9hbnQvamF2YXNjcmlwdC5odG1sIj5odHRwOi8vd3d3LnNpdGVwZW4uY29tL2FudC9qYXZhc2NyaXB0Lmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJCdWlsZGluZyB3aXRoIEFudCI+CisgICAgICAgIDxwPlNlcmllcyBvZiBhcnRpY2xlcyB0aGF0IGRlc2NyaWJlIGEgZnJhbWV3b3JrIGZvciB3ZWIKKyAgICAgICAgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgYmFzZWQgb24gQW50IGFuZCBKVW5pdC48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJtYWlsdG86YWxleGNAcHVycGxldGVjaC5jb20iPkFsZXggQ2hhZmZlZTwvYT48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlVSTDo8L3RoPgorICAgICAgICAgICAgPHRkPkludHJvZHVjdGlvbjogPGEgaHJlZj0iaHR0cDovL3NvZnR3YXJlZGV2LmVhcnRod2ViLmNvbS9zZHRlY2gvYXJ0aWNsZS8wLCwxMjA2NV85ODk2MzEsMDAuaHRtbCI+aHR0cDovL3NvZnR3YXJlZGV2LmVhcnRod2ViLmNvbS9zZHRlY2gvYXJ0aWNsZS8wLCwxMjA2NV85ODk2MzEsMDAuaHRtbDwvYT48YnIvPgorICAgICAgICAgICAgICAgIERpcmVjdG9yeSBTdHJ1Y3R1cmU6IDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZWRldi5lYXJ0aHdlYi5jb20vc2R0ZWNoL2FydGljbGUvMCwsMTIwODJfOTk0OTkxLDAwLmh0bWwiPmh0dHA6Ly9zb2Z0d2FyZWRldi5lYXJ0aHdlYi5jb20vc2R0ZWNoL2FydGljbGUvMCwsMTIwODJfOTk0OTkxLDAwLmh0bWw8L2E+PGJyLz4KKyAgICAgICAgICAgICAgICBEZXBsb3ltZW50IGFuZCBEaXN0cmlidXRpb246IDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZWRldi5lYXJ0aHdlYi5jb20vc2R0ZWNoL2FydGljbGUvMCwsMTIwNzdfOTk4MjQxLDAwLmh0bWwiPmh0dHA6Ly9zb2Z0d2FyZWRldi5lYXJ0aHdlYi5jb20vc2R0ZWNoL2FydGljbGUvMCwsMTIwNzdfOTk4MjQxLDAwLmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJEZXZlbG9waW5nIHdpdGggSkFYQiBhbmQgQW50Ij4KKyAgICAgICAgPHA+U2VyaWVzIG9mIGFydGljbGVzIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBBbnQgdG9nZXRoZXIgd2l0aAorICAgICAgICB0aGUgSmF2YSBBUEkgZm9yIFhNTCBCaW5kaW5nIChKQVhCKS48L3A+CisKKyAgICAgICAgPHRhYmxlIGNsYXNzPSJleHRlcm5hbHMiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5BdXRob3I6PC90aD4KKyAgICAgICAgICAgIDx0ZD5Kb3NlcGggU2hlbGJ5PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9uamF2YS5jb20vcHViL2Evb25qYXZhLzIwMDIvMDMvMDYvamF4YW50MS5odG1sIj5odHRwOi8vd3d3Lm9uamF2YS5jb20vcHViL2Evb25qYXZhLzIwMDIvMDMvMDYvamF4YW50MS5odG1sPC9hPjxici8+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDAyLzAzLzEzL2pheGJhbnQyLmh0bWwiPmh0dHA6Ly93d3cub25qYXZhLmNvbS9wdWIvYS9vbmphdmEvMjAwMi8wMy8xMy9qYXhiYW50Mi5odG1sPC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJQcmVzZW50YXRpb25zIj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50IEJ1aWxkIFRvb2wiPgorICAgICAgICA8cD5BIFBvd2VyUG9pbnQgcHJlc2VudGF0aW9uIG9uIEFudCAxLjIuICBJdCBwcm92aWRlcyBhIGJhc2ljIG92ZXJ2aWV3CisgICAgICAgIG9mIEFudCZhcG9zO3MgY2FwYWJpbGl0aWVzLjwvcD4KKworICAgICAgICA8dGFibGUgY2xhc3M9ImV4dGVybmFscyI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPkF1dGhvcjo8L3RoPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Im1haWx0bzpjaGFuZXpvbkBuZXRzY2FwZS5jb20iPlBhdHJpY2sgQ2hhbmV6b248L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5VUkw6PC90aD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vcGVvcGxlLm5ldHNjYXBlLmNvbS9jaGFuZXpvbi90ZWNoL2FudC9hbnRfcHJlc28ucHB0Ij5odHRwOi8vcGVvcGxlLm5ldHNjYXBlLmNvbS9jaGFuZXpvbi90ZWNoL2FudC9hbnRfcHJlc28ucHB0PC9hPjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvc3Vic2VjdGlvbj4KKworICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQW50Ij4KKyAgICAgICAgPHA+QSBkZXRhaWxlZCBBbnQgMS4zIFBvd2VyUG9pbnQgcHJlc2VudGF0aW9uLCBtYWRlIGF0IHRoZSBTdC4gTG91aXMgSmF2YSBVc2VycyBHcm91cAorICAgICAgICBtZWV0aW5nIGluIE1hcmNoIDIwMDEuICBJbmNsdWRlcyBhIGRldGFpbGVkIGJ1aWxkIGZpbGUgYW5kIGJhc2ljCisgICAgICAgIGRlc2NyaXB0aW9ucyBvZiBhbGwgdGhlIGJ1aWx0IGluIGFuZCBvcHRpb25hbCB0YXNrcy4gIFVwZGF0ZWQgZm9yIEFudCAxLjQgaW4gT2N0b2JlciAyMDAxLgorICAgICAgICBBdmFpbGFibGUgaW4gUERGIGZvcm1hdCBub3cuPC9wPgorCisgICAgICAgIDx0YWJsZSBjbGFzcz0iZXh0ZXJuYWxzIj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+QXV0aG9yOjwvdGg+CisgICAgICAgICAgICA8dGQ+TWFyayBWb2xrbWFubjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGg+VVJMOjwvdGg+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vY2l3ZWIuY29tL2puYi9maWxlcy9BbnQucGRmIj5odHRwOi8vd3d3Lm9jaXdlYi5jb20vam5iL2ZpbGVzL0FudC5wZGY8L2E+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9zdWJzZWN0aW9uPgorCisKKyAgICA8L3NlY3Rpb24+CisgIDwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9zcmNkb3dubG9hZC54bWwgYi90cnVuay94ZG9jcy9zcmNkb3dubG9hZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MTc5NQotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL3NyY2Rvd25sb2FkLnhtbApAQCAtMCwwICsxLDE2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxkb2N1bWVudD4KKworICA8cHJvcGVydGllcz4KKyAgICA8dGl0bGU+U291cmNlIERpc3RyaWJ1dGlvbnM8L3RpdGxlPgorICAgIDxiYXNlLz4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iRG93bmxvYWRpbmcgQW50Ij4KKworPHA+VXNlIHRoZSBsaW5rcyBiZWxvdyB0byBkb3dubG9hZCBhIHNvdXJjZSBkaXN0cmlidXRpb24gb2YgQW50IGZyb20KK29uZSBvZiBvdXIgbWlycm9ycy4gIEl0IGlzIGdvb2QgcHJhY3RpY2UgdG8KKzxhIGhyZWY9Iltsb2NhdGlvbl0jVmVyaWZ5IFJlbGVhc2VzIj52ZXJpZnkgdGhlIGludGVncml0eTwvYT4KK29mIHRoZSBkaXN0cmlidXRpb24gZmlsZXMsIGVzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBvbmUgb2Ygb3VyCittaXJyb3Igc2l0ZXMuICBJbiBvcmRlciB0byBkbyB0aGlzIHlvdSBtdXN0IHVzZSB0aGUgc2lnbmF0dXJlcyBmcm9tCitvdXIgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50LyI+bWFpbiBkaXN0cmlidXRpb24KK2RpcmVjdG9yeTwvYT4uPC9wPgorCis8cD5BbnQgaXMgZGlzdHJpYnV0ZWQgYXMgPGNvZGU+emlwPC9jb2RlPiwgPGNvZGU+dGFyLmd6PC9jb2RlPiBhbmQKKzxjb2RlPnRhci5iejI8L2NvZGU+IGFyY2hpdmVzIC0gdGhlIGNvbnRlbnRzIGFyZSB0aGUgc2FtZS4gIFBsZWFzZQorbm90ZSB0aGF0IHRoZSA8Y29kZT50YXIuKjwvY29kZT4gYXJjaGl2ZXMgY29udGFpbiBmaWxlIG5hbWVzIGxvbmdlcgordGhhbiAxMDAgY2hhcmFjdGVycyBhbmQgaGF2ZSBiZWVuIGNyZWF0ZWQgdXNpbmcgR05VIHRhciBleHRlbnNpb25zLgorVGh1cyB0aGV5IG11c3QgYmUgdW50YXJyZWQgd2l0aCBhIEdOVSBjb21wYXRpYmxlIHZlcnNpb24gb2YKKzxjb2RlPnRhcjwvY29kZT4uPC9wPgorCis8cD5JZiB5b3UgZG8gbm90IHNlZSB0aGUgZmlsZSB5b3UgbmVlZCBpbiB0aGUgbGlua3MgYmVsb3csIHBsZWFzZSBzZWUKK3RoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5tYXN0ZXIgZGlzdHJpYnV0aW9uCitkaXJlY3Rvcnk8L2E+IG9yLCBwcmVmZXJhYmx5LCBpdHMgPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50LyI+bWlycm9yPC9hPi48L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iTWlycm9yIj4KKworPHA+WW91IGFyZSBjdXJyZW50bHkgdXNpbmcgPGI+W3ByZWZlcnJlZF08L2I+LiAgSWYgeW91IGVuY291bnRlciBhCitwcm9ibGVtIHdpdGggdGhpcyBtaXJyb3IsIHBsZWFzZSBzZWxlY3QgYW5vdGhlciBtaXJyb3IuICBJZiBhbGwKK21pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YKK3RoZSBtaXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZS48L3A+CisKKzxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPgorT3RoZXIgbWlycm9yczogPHNlbGVjdCBuYW1lPSJQcmVmZXJyZWQiPgorW2lmLWFueSBodHRwXQorICBbZm9yIGh0dHBdPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIj5baHR0cF08L29wdGlvbj5bZW5kXQorW2VuZF0KK1tpZi1hbnkgZnRwXQorICBbZm9yIGZ0cF08b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj5bZW5kXQorW2VuZF0KK1tpZi1hbnkgYmFja3VwXQorICBbZm9yIGJhY2t1cF08b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXQorW2VuZF0KKzwvc2VsZWN0PgorPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSIgLz4KKzwvZm9ybT4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ3VycmVudCBSZWxlYXNlIG9mIEFudCI+CisKKzxwPkN1cnJlbnRseSwgQXBhY2hlIEFudCAxLjcuMCBpcyB0aGUgYmVzdCBhdmFpbGFibGUgdmVyc2lvbiwgc2VlIHRoZQorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L1JFQURNRS5odG1sIj5yZWxlYXNlIG5vdGVzPC9hPi48L3A+CisKKzxkaXYgY2xhc3M9Indhcm5pbmciPgorPGRpdiBjbGFzcz0ibGFiZWwiPk5vdGU8L2Rpdj4KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPkFudCAxLjcuMCBoYXMgYmVlbiByZWxlYXNlZCBvbiAxOS1EZWMtMjAwNiBhbmQKK21heSBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBtaXJyb3JzIGZvciBhIGZldyBkYXlzLjwvZGl2PgorPC9kaXY+Cis8YnI+PC9icj4KKzxkaXYgY2xhc3M9Indhcm5pbmciPgorPGRpdiBjbGFzcz0ibGFiZWwiPlRhciBmaWxlcyBtYXkgcmVxdWlyZSBnbnUgdGFyIHRvIGV4dHJhY3Q8L2Rpdj4KKzxkaXYgY2xhc3M9ImNvbnRlbnQiPlRhciBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGNvbnRhaW4gbG9uZyBmaWxlIG5hbWVzLCBhbmQgbWF5CisgcmVxdWlyZSBnbnUgdGFyIHRvIGRvIHRoZSBleHRyYWN0aW9uLjwvZGl2PgorPC9kaXY+CisKKzx1bD4KKzxsaT48Y29kZT4uemlwPC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L3NvdXJjZS9hcGFjaGUtYW50LTEuNy4wLXNyYy56aXAiPmFwYWNoZS1hbnQtMS43LjAtc3JjLnppcDwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnppcC5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L3NvdXJjZS9hcGFjaGUtYW50LTEuNy4wLXNyYy56aXAuc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L3NvdXJjZS9hcGFjaGUtYW50LTEuNy4wLXNyYy56aXAubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmd6PC9jb2RlPiBhcmNoaXZlOgorPGEgaHJlZj0iW3ByZWZlcnJlZF0vYW50L3NvdXJjZS9hcGFjaGUtYW50LTEuNy4wLXNyYy50YXIuZ3oiPmFwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5nejwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5nei5hc2MiPlBHUDwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L3NvdXJjZS9hcGFjaGUtYW50LTEuNy4wLXNyYy50YXIuZ3ouc2hhMSI+U0hBMTwvYT5dCitbPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvYW50L3NvdXJjZS9hcGFjaGUtYW50LTEuNy4wLXNyYy50YXIuZ3oubWQ1Ij5NRDU8L2E+XTwvbGk+CisKKzxsaT48Y29kZT4udGFyLmJ6MjwvY29kZT4gYXJjaGl2ZToKKzxhIGhyZWY9IltwcmVmZXJyZWRdL2FudC9zb3VyY2UvYXBhY2hlLWFudC0xLjcuMC1zcmMudGFyLmJ6MiI+YXBhY2hlLWFudC0xLjcuMC1zcmMudGFyLmJ6MjwvYT4KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5iejIuYXNjIj5QR1A8L2E+XQorWzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9zb3VyY2UvYXBhY2hlLWFudC0xLjcuMC1zcmMudGFyLmJ6Mi5zaGExIj5TSEExPC9hPl0KK1s8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvc291cmNlL2FwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5iejIubWQ1Ij5NRDU8L2E+XTwvbGk+Cis8L3VsPgorPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik9sZCBBbnQgUmVsZWFzZXMiPgorCis8cD5PbGRlciByZWxlYXNlcyBvZiBBbnQgY2FuIGJlIGZvdW5kIDxhCitocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50L3NvdXJjZS8iPmhlcmU8L2E+LiAgVGhvc2UKK3JlbGVhc2VzIGFyZSBvbmx5IHByb3ZpZGVkIGFzIDxjb2RlPnppcDwvY29kZT4gYXJjaGl2ZXMgdGhhdCBjYW4gYmUKK2V4dHJhY3RlZCBieSA8Y29kZT5qYXIgeGYgPC9jb2RlPjxlbT5hcmNoaXZlLnppcDwvZW0+IC0gd2UgaGlnaGx5CityZWNvbW1lbmQgdG8gbm90IHVzZSB0aG9zZSByZWxlYXNlcyBidXQgdXBncmFkZSB0byBBbnQncyA8YQoraHJlZj0iW2xvY2F0aW9uXSNDdXJyZW50IFJlbGVhc2Ugb2YgQW50Ij5sYXRlc3Q8L2E+IHJlbGVhc2UuPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlZlcmlmeSBSZWxlYXNlcyI+CisKKzxwPkl0IGlzIGVzc2VudGlhbCB0aGF0IHlvdSB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgZG93bmxvYWRlZAorZmlsZXMgdXNpbmcgdGhlIFBHUCBzaWduYXR1cmUgb3IgdGhlIFNIQTEgb3IgTUQ1IGNoZWNrc3Vtcy4gIFRoZQorY2hlY2tzdW1zIGFyZSBub3QgYXMgc3Ryb25nIGluZGljYXRvcnMgYXMgdGhlIFBHUCBzaWduYXR1cmUuPC9wPgorCis8cD5UaGUgUEdQIHNpZ25hdHVyZXMgY2FuIGJlIHZlcmlmaWVkIHVzaW5nIFBHUCBvciBHUEcuICBGaXJzdAorZG93bmxvYWQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9LRVlTIj5LRVlTPC9hPgorYXMgd2VsbCBhcyB0aGUgPGNvZGU+YXNjPC9jb2RlPiBzaWduYXR1cmUgZmlsZSBmb3IgdGhlIHBhcnRpY3VsYXIKK2Rpc3RyaWJ1dGlvbi4gIE1ha2Ugc3VyZSB5b3UgZ2V0IHRoZXNlIGZpbGVzIGZyb20gdGhlIDxhCitocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvIj5tYWluIGRpc3RyaWJ1dGlvbgorZGlyZWN0b3J5PC9hPiwgcmF0aGVyIHRoYW4gZnJvbSBhIG1pcnJvci4gVGhlbiB2ZXJpZnkgdGhlIHNpZ25hdHVyZXMKK3VzaW5nPC9wPgorCis8cD48Y29kZT4KKyUgcGdwayAtYSBLRVlTPGJyIC8+CislIHBncHYgYXBhY2hlLWFudC0xLjcuMC1zcmMudGFyLmd6LmFzYzxiciAvPgorPC9jb2RlPgorPGVtPm9yPC9lbT48YnIgLz4KKzxjb2RlPgorJSBwZ3AgLWthIEtFWVM8YnIgLz4KKyUgcGdwIGFwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5nei5hc2M8YnIgLz4KKzwvY29kZT4KKzxlbT5vcjwvZW0+PGJyIC8+Cis8Y29kZT4KKyUgZ3BnIC0taW1wb3J0IEtFWVM8YnIgLz4KKyUgZ3BnIC0tdmVyaWZ5IGFwYWNoZS1hbnQtMS43LjAtc3JjLnRhci5nei5hc2MKKzwvY29kZT48L3A+CisKKzxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdmVyaWZ5IHRoZSBjaGVja3N1bXMgb24gdGhlIGZpbGVzLiAgVW5peAorcHJvZ3JhbXMgY2FsbGVkIDxjb2RlPm1kNTwvY29kZT4vPGNvZGU+c2hhMTwvY29kZT4gb3IKKzxjb2RlPm1kNXN1bTwvY29kZT4vPGNvZGU+c2hhMXN1bTwvY29kZT4gYXJlIGluY2x1ZGVkIGluIG1hbnkgdW5peAorZGlzdHJpYnV0aW9ucy4gIDxjb2RlPipzdW08L2NvZGU+IGlzIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YgPGEKK2hyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXh0dXRpbHMvdGV4dHV0aWxzLmh0bWwiPkdOVQorVGV4dHV0aWxzPC9hPi4gIFdpbmRvd3MgdXNlcnMgY2FuIGdldCBiaW5hcnkgbWQ1IHByb2dyYW1zIGZyb20gPGEKK2hyZWY9Imh0dHA6Ly93d3cuZm91cm1pbGFiLmNoL21kNS8iPmhlcmU8L2E+LCA8YQoraHJlZj0iaHR0cDovL3d3dy5wYy10b29scy5uZXQvd2luMzIvZnJlZXdhcmUvY29uc29sZS8iPmhlcmU8L2E+LiAgPGEKK2hyZWY9Imh0dHA6Ly93d3cuc2xhdmFzb2Z0LmNvbS9mc3VtLyI+ZnN1bTwvYT4gc3VwcG9ydHMgTUQ1IGFuZAorU0hBMS48L3A+CisKKzxwPldlIGhpZ2hseSByZWNvbW1lbmQgdG8gdmVyaWZ5IHRoZSBQR1Agc2lnbmF0dXJlLCB0aG91Z2guPC9wPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9zdHlsZXNoZWV0cy9wcm9qZWN0LnhtbCBiL3RydW5rL3hkb2NzL3N0eWxlc2hlZXRzL3Byb2plY3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzllYjcKLS0tIC9kZXYvbnVsbAorKysgYi90cnVuay94ZG9jcy9zdHlsZXNoZWV0cy9wcm9qZWN0LnhtbApAQCAtMCwwICsxLDk0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJBcGFjaGUgQW50IiBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj4KKworICAgIDx0aXRsZT5BcGFjaGUgQW50PC90aXRsZT4KKyAgICA8bG9nbyBocmVmPSJpbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmIj5BcGFjaGUgQW50PC9sb2dvPgorCisgICAgPGJvZHk+CisgICAgICAgPG1lbnVzZWN0aW9uIG5hbWU9IkhvbWUiIGluZGV4PSIwIiAgICAgICAgIGhyZWY9Ii9pbmRleC5odG1sIj4KKyAgICAgICAgICAgIDxtZW51IG5hbWU9IkFwYWNoZSBBbnQiPgorICAgICAgICAgICAgICAgIDxpdGVtIG5hbWU9IldlbGNvbWUiICAgICAgICAgICAgICAgaHJlZj0iL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJMaWNlbnNlIiAgICAgICAgICAgICAgIGhyZWY9Ii9saWNlbnNlLmh0bWwiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJOZXdzIiAgICAgICAgICAgICAgICAgIGhyZWY9Ii9hbnRuZXdzLmh0bWwiLz4KKyAgICAgICAgICAgIDwvbWVudT4KKworICAgICAgICAgICAgPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iTWFudWFsIgorICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii9tYW51YWwvaW5kZXguaHRtbCIvPgorICAgICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlJlbGF0ZWQgUHJvamVjdHMiCisgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3Byb2plY3RzLmh0bWwiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJFeHRlcm5hbCBUb29scyBhbmQgVGFza3MiCisgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iL2V4dGVybmFsLmh0bWwiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJSZXNvdXJjZXMiCisgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iL3Jlc291cmNlcy5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMiCisgICAgICAgICAgICAgICAgICAgICAgaHJlZj0iL2ZhcS5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iV2lraSIKKyAgICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2FudC9Gcm9udFBhZ2UiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJIYXZpbmcgUHJvYmxlbXM/IgorICAgICAgICAgICAgICAgICAgICAgIGhyZWY9Ii9wcm9ibGVtcy5odG1sIi8+CisgICAgICAgICAgICA8L21lbnU+CisKKyAgICAgICAgICAgIDxtZW51IG5hbWU9IkRvd25sb2FkIj4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJCaW5hcnkgRGlzdHJpYnV0aW9ucyIgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSIvPgorICAgICAgICAgICAgICAgIDxpdGVtIG5hbWU9IlNvdXJjZSBEaXN0cmlidXRpb25zIiBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpIi8+CisgICAgICAgICAgICA8L21lbnU+CisKKyAgICAgICAgICAgIDxtZW51IG5hbWU9IkNvbnRyaWJ1dGluZyI+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbGluZyBMaXN0cyIgICAgICAgICBocmVmPSIvbWFpbC5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iU3VidmVyc2lvbiBSZXBvc2l0b3JpZXMiICAgICAgaHJlZj0iL3N2bi5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iTmlnaHRseSBCdWlsZHMiICAgICAgaHJlZj0iL25pZ2h0bGllcy5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQnVnIERhdGFiYXNlIiAgICAgICAgICBocmVmPSIvYnVncy5odG1sIi8+CisgICAgICAgICAgICA8L21lbnU+CisKKyAgICAgICAgICAgIDxtZW51IG5hbWU9IlNwb25zb3JzaGlwIj4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iRG9uYXRpb25zIiAgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCIvPgorICAgICAgICAgICAgPC9tZW51PgorCisgICAgICAgICAgICA8bWVudSBuYW1lPSJQcm9qZWN0IE1hbmFnZW1lbnQiPgorICAgICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkNvbnRyaWJ1dG9ycyIgICAgICAgICAgaHJlZj0iL2NvbnRyaWJ1dG9ycy5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIEFudCBNaXNzaW9uIiAgICBocmVmPSIvbWlzc2lvbi5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iUHJvamVjdCBCeWxhd3MiICAgICAgICBocmVmPSIvYnlsYXdzLmh0bWwiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJMZWdhbCIgICAgICAgICAgICAgICAgIGhyZWY9Ii9sZWdhbC5odG1sIi8+CisgICAgICAgICAgICA8L21lbnU+CisgICAgICAgIDwvbWVudXNlY3Rpb24+CisKKyAgICAgICAgPG1lbnVzZWN0aW9uIG5hbWU9IlByb2plY3RzIiBpbmRleD0iMSIgICAgIGhyZWY9Ii9wcm9qZWN0cy9pbmRleC5odG1sIj4KKyAgICAgICAgICAgIDxtZW51IG5hbWU9IlByb2plY3RzIj4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJXZWxjb21lIiAgICAgICAgICAgICAgIGhyZWY9Ii9wcm9qZWN0cy9pbmRleC5odG1sIi8+CisgICAgICAgICAgICA8L21lbnU+CisgICAgICAgICAgICA8bWVudSBuYW1lPSJBbnQgTGlicmFyaWVzIj4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJJbnRyb2R1Y3Rpb24iICAgICAgICAgIGhyZWY9Ii9hbnRsaWJzL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJDaGFydGVyIiAgICAgICAgICAgICAgIGhyZWY9Ii9hbnRsaWJzL2NoYXJ0ZXIuaHRtbCIvPgorICAgICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkFudCBMaWJyYXJpZXMiICAgICAgICAgaHJlZj0iL2FudGxpYnMvcHJvcGVyLmh0bWwiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJTYW5kYm94IEFudCBMaWJyYXJpZXMiIGhyZWY9Ii9hbnRsaWJzL3NhbmRib3guaHRtbCIvPgorICAgICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkJpbmFyeSBEaXN0cmlidXRpb25zIiBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9iaW5kb3dubG9hZC5jZ2kiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJTb3VyY2UgRGlzdHJpYnV0aW9ucyIgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvc3JjZG93bmxvYWQuY2dpIi8+CisgICAgICAgICAgICA8L21lbnU+CisgICAgICAgICAgICA8bWVudSBuYW1lPSJJdnkiPgorICAgICAgICAgICAgICAgIDxpdGVtIG5hbWU9IkludHJvZHVjdGlvbiIgICAgICAgICBocmVmPSIvcHJvamVjdHMvaXZ5Lmh0bWwiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJIb21lcGFnZSIgICAgICAgICAgICAgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS8iLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJEaXN0cmlidXRpb25zIiAgICAgICAgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS9kb3dubG9hZC5jZ2kiLz4KKyAgICAgICAgICAgICAgICA8aXRlbSBuYW1lPSJXaWtpIiAgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9pdnkvIi8+CisgICAgICAgICAgICA8L21lbnU+CisgICAgICAgIDwvbWVudXNlY3Rpb24+CisgICAgPC9ib2R5PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3Mvc3R5bGVzaGVldHMvc2l0ZS52c2wgYi90cnVuay94ZG9jcy9zdHlsZXNoZWV0cy9zaXRlLnZzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmE1NTIzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsveGRvY3Mvc3R5bGVzaGVldHMvc2l0ZS52c2wKQEAgLTAsMCArMSwxOTYgQEAKKyMqCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiMKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisjIyBDb250ZW50IFN0eWxlc2hlZXQgZm9yIFNpdGUKKyAgICAjIyBEZWZpbmVkIHZhcmlhYmxlcworICAgICNzZXQgKCRsaWdodGJnID0gIiNmZmZmZmYiKQorICAgICNzZXQgKCRsaWdodGZnID0gIiNmZmZmZmYiKQorICAgICNzZXQgKCRkYXJrZmcgPSAiIzAwMDAwMCIpCisgICAgI3NldCAoJGFjdGl2ZSA9ICIjZmZjYzAwIikKKyAgICAjc2V0ICgkYmx1ZTQgPSAiI0IyQzRFMCIpCisgICAgI3NldCAoJGJsdWUzID0gIiMyOTQ1NjMiKQorICAgICNzZXQgKCRibHVlMiA9ICIjNEM2QzhGIikKKyAgICAjc2V0ICgkYmx1ZTEgPSAiI0NGRENFRCIpCisgICAgI3NldCAoJHNvdXJjZWJvcmRlciA9ICIjMDIzMjY0IikKKyAgICAjc2V0ICgkcG91bmQgPSAiIyIgKQorICAgICNzZXQgKCRzc2kgPSAiaW5jbHVkZSB2aXJ0dWFsPSIpCisgICAgI3NldCAoJGFkc3VybCA9ICIvYWRzL2J1dHRvbmJhci5odG1sIikKKyMjIHN0YXJ0IHRoZSBwcm9jZXNzaW5nCisjZG9jdW1lbnQoKQorIyMgZW5kIHRoZSBwcm9jZXNzaW5nCisKKyMjIFRoaXMgaXMgd2hlcmUgdGhlIGNvbW1vbiBwYWdlIG1hY3JvJ3MgbGl2ZQorCisjbWFjcm8gKCBpc2JuICRpc2JuKQorPHA+PGI+QXZhaWxhYmxlIGZyb206PC9iPjxicj4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvdGcvZGV0YWlsLy0vJCFpc2JuL2FwYWNoZXNvZnR3YXItMjAvIiB0YXJnZXQ9Il9ibGFuayI+QW1hem9uLmNvbTwvYT4KKyAgfCA8YSBocmVmPSJodHRwOi8vc2VydmljZS5iZmFzdC5jb20vYmZhc3QvY2xpY2s/YmZtaWQ9MjE4MSZhbXA7YmZtdHlwZT1ib29rJmFtcDtzb3VyY2VpZD00MTQ2MjU0NCZhbXA7YmZwaWQ9JCFpc2JuIiB0YXJnZXQ9Il9ibGFuayI+QmFybmVzICZhbXA7IE5vYmxlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9va3NlbnNlLmNvbS9wcm9kdWN0L2luZm8uanNwP2FmZmlsaWF0ZUlkPUFwYWNoZSZhbXA7aXNibj0kIWlzYm4iIHRhcmdldD0iX2JsYW5rIj5Cb29rIFNlbnNlPC9hPgorICB8IDxhIGhyZWY9Imh0dHA6Ly93d3cucG93ZWxscy5jb20vY2dpLWJpbi9iaWJsaW8/aXNibj0kIWlzYm4mYW1wO3BhcnRuZXJfaWQ9Mjk2OTMiIHRhcmdldD0iX2JsYW5rIj5Qb3dlbGxzLmNvbTwvYT4KKzxicj48L3A+CisjZW5kCisKKyNtYWNybyAoIHN1YnNlY3Rpb24gJHN1YnNlY3Rpb24pCisgICAgICA8aDQgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSIkZXNjYXBlLmdldFRleHQoJHN1YnNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKSkiPjwvYT4KKyAgICAgICAgJHN1YnNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKQorICAgICAgPC9oND4KKyAgICAgICNmb3JlYWNoICggJGl0ZW1zIGluICRzdWJzZWN0aW9uLmdldENoaWxkcmVuKCkgKQorICAgICAgICAjaWYgKCRpdGVtcy5nZXROYW1lKCkuZXF1YWxzKCJpbWciKSkKKyAgICAgICAgICAjaW1hZ2UgKCRpdGVtcykKKyAgICAgICAgI2Vsc2VpZiAoJGl0ZW1zLmdldE5hbWUoKS5lcXVhbHMoInNvdXJjZSIpKQorICAgICAgICAgICNzb3VyY2UgKCRpdGVtcykKKyAgICAgICAgI2Vsc2VpZiAoJGl0ZW1zLmdldE5hbWUoKS5lcXVhbHMoInRhYmxlIikpCisgICAgICAgICAgI3RhYmxlICgkaXRlbXMpCisgICAgICAgICNlbHNlaWYgKCRpdGVtcy5nZXROYW1lKCkuZXF1YWxzKCJzdWJzdWJzZWN0aW9uIikpCisgICAgICAgICAgI3N1YnN1YnNlY3Rpb24gKCRpdGVtcykKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAkeG1sb3V0Lm91dHB1dFN0cmluZygkaXRlbXMpCisgICAgICAgICNlbmQKKyAgICAgICNlbmQKKyAgICAgICNpZiAoJHN1YnNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoImlzYm4iKSkKKyAgICAgICAgI3NldCAoJGlzYm4gPSAkc3Vic2VjdGlvbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiaXNibiIpKQorICAgICAgICAjaXNibiAoJGlzYm4pCisgICAgICAjZW5kCisjZW5kCisKKyNtYWNybyAoIHN1YnN1YnNlY3Rpb24gJHN1YnN1YnNlY3Rpb24pCisgICAgICA8aDUgY2xhc3M9InN1YnNlY3Rpb24iPgorICAgICAgICA8YSBuYW1lPSIkZXNjYXBlLmdldFRleHQoJHN1YnN1YnNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKSkiPjwvYT4KKyAgICAgICAgKioqICRzdWJzdWJzZWN0aW9uLmdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIikgKioqCisgICAgICA8L2g1PgorICAgICAgI2ZvcmVhY2ggKCAkaXRlbXMgaW4gJHN1YnN1YnNlY3Rpb24uZ2V0Q2hpbGRyZW4oKSApCisgICAgICAgICNpZiAoJGl0ZW1zLmdldE5hbWUoKS5lcXVhbHMoImltZyIpKQorICAgICAgICAgICNpbWFnZSAoJGl0ZW1zKQorICAgICAgICAjZWxzZWlmICgkaXRlbXMuZ2V0TmFtZSgpLmVxdWFscygic291cmNlIikpCisgICAgICAgICAgI3NvdXJjZSAoJGl0ZW1zKQorICAgICAgICAjZWxzZWlmICgkaXRlbXMuZ2V0TmFtZSgpLmVxdWFscygidGFibGUiKSkKKyAgICAgICAgICAjdGFibGUgKCRpdGVtcykKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAkeG1sb3V0Lm91dHB1dFN0cmluZygkaXRlbXMpCisgICAgICAgICNlbmQKKyAgICAgICNlbmQKKyNlbmQKKworI21hY3JvICggc2VjdGlvbiAkc2VjdGlvbikKKyAgICA8aDMgY2xhc3M9InNlY3Rpb24iPgorICAgICAgPGEgbmFtZT0iJGVzY2FwZS5nZXRUZXh0KCRzZWN0aW9uLmdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIikpIj48L2E+CisgICAgICAkc2VjdGlvbi5nZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpCisgICAgPC9oMz4KKyAgICAgICNmb3JlYWNoICggJGl0ZW1zIGluICRzZWN0aW9uLmdldENoaWxkcmVuKCkgKQorICAgICAgICAjaWYgKCRpdGVtcy5nZXROYW1lKCkuZXF1YWxzKCJpbWciKSkKKyAgICAgICAgICAjaW1hZ2UgKCRpdGVtcykKKyAgICAgICAgI2Vsc2VpZiAoJGl0ZW1zLmdldE5hbWUoKS5lcXVhbHMoInNvdXJjZSIpKQorICAgICAgICAgICNzb3VyY2UgKCRpdGVtcykKKyAgICAgICAgI2Vsc2VpZiAoJGl0ZW1zLmdldE5hbWUoKS5lcXVhbHMoInRhYmxlIikpCisgICAgICAgICAgI3RhYmxlICgkaXRlbXMpCisgICAgICAgICNlbHNlaWYgKCRpdGVtcy5nZXROYW1lKCkuZXF1YWxzKCJzdWJzZWN0aW9uIikpCisgICAgICAgICAgI3N1YnNlY3Rpb24gKCRpdGVtcykKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAkeG1sb3V0Lm91dHB1dFN0cmluZygkaXRlbXMpCisgICAgICAgICNlbmQKKyAgICAgICNlbmQKKyNlbmQKKworIyMgVGhpcyBpcyB3aGVyZSB0aGUgRkFRIHNwZWNpZmljIG1hY3JvJ3MgbGl2ZQorCisjbWFjcm8gKHRvYyAkc2VjdGlvbikKKyAgICAgIDxoNCBjbGFzcz0idG9jIj4kc2VjdGlvbi5nZXRBdHRyaWJ1dGVWYWx1ZSgidGl0bGUiKTwvaDQ+CisgICAgICAgIDx1bD4KKyAgICAjZm9yZWFjaCAoJGZhcSBpbiAkc2VjdGlvbi5nZXRDaGlsZHJlbigiZmFxIikgKQorICAgICAgI3N1YnRvYyAoJGZhcSkKKyAgICAjZW5kCisgICAgICAgIDwvdWw+CisjZW5kCisKKyNtYWNybyAoc3VidG9jICRmYXEpCisgICNzZXQgKCRpZCA9ICRmYXEuZ2V0QXR0cmlidXRlVmFsdWUoImlkIikpCisgICAgICA8bGk+PGEgaHJlZj0iJHBvdW5kJGlkIj4KKyAgJHhtbG91dC5vdXRwdXRTdHJpbmcoJGZhcS5nZXRDaGlsZCgicXVlc3Rpb24iKSwgdHJ1ZSkKKyAgICAgIDwvYT48L2xpPgorI2VuZAorCisjbWFjcm8gKGFuc3dlcnMgJHNlY3Rpb24pCisgICNmb3JlYWNoICgkZmFxIGluICRzZWN0aW9uLmdldENoaWxkcmVuKCJmYXEiKSApCisgICAgI2ZhcSAoJGZhcSkKKyAgI2VuZAorI2VuZAorCisjbWFjcm8gKGZhcSAkZmFxKQorICAjc2V0ICgkaWQgPSAkZmFxLmdldEF0dHJpYnV0ZVZhbHVlKCJpZCIpKQorICAgIDxwIGNsYXNzPSJmYXEiPgorICAgICAgPGEgbmFtZT0iJGlkIj48L2E+CisgICAgICAkeG1sb3V0Lm91dHB1dFN0cmluZygkZmFxLmdldENoaWxkKCJxdWVzdGlvbiIpLCB0cnVlKQorICAgIDwvcD4KKyAgICAjZm9yZWFjaCAoJGl0ZW0gaW4gJGZhcS5nZXRDaGlsZCgiYW5zd2VyIikuZ2V0Q2hpbGRyZW4oKSkKKyAgICAgICNpZiAoJGl0ZW0uZ2V0TmFtZSgpLmVxdWFscygiaW1nIikpCisgICAgICAgICNpbWFnZSAoJGl0ZW0pCisgICAgICAjZWxzZWlmICgkaXRlbS5nZXROYW1lKCkuZXF1YWxzKCJzb3VyY2UiKSkKKyAgICAgICAgI3NvdXJjZSAoJGl0ZW0pCisgICAgICAjZWxzZWlmICgkaXRlbS5nZXROYW1lKCkuZXF1YWxzKCJ0YWJsZSIpKQorICAgICAgICAjdGFibGUgKCRpdGVtKQorICAgICAgI2Vsc2UKKyAgICAgICAgJHhtbG91dC5vdXRwdXRTdHJpbmcoJGl0ZW0pCisgICAgICAjZW5kCisgICAgI2VuZAorI2VuZAorCisjbWFjcm8gKGRvY3VtZW50KQorICAjaGVhZGVyKCkKKyAgPGRpdiBjbGFzcz0ibWFpbiI+CisgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgIDxoMSBjbGFzcz0idGl0bGUiPiRyb290LmdldENoaWxkKCJwcm9wZXJ0aWVzIikuZ2V0Q2hpbGQoInRpdGxlIikuZ2V0VGV4dCgpPC9oMT4KKyAgI3NldCAoJGFsbFNlY3Rpb25zID0gJHJvb3QuZ2V0Q2hpbGQoImJvZHkiKS5nZXRDaGlsZHJlbigic2VjdGlvbiIpKQorICAjZm9yZWFjaCAoICRzZWN0aW9uIGluICRhbGxTZWN0aW9ucyApCisgICAgI3NlY3Rpb24gKCRzZWN0aW9uKQorICAjZW5kCisKKyAgI2lmICgkcm9vdC5nZXRDaGlsZHJlbigiZmFxc2VjdGlvbiIpLnNpemUoKSA+IDApCisgICAgI3NldCAoJGFsbEZhcVNlY3Rpb25zID0gJHJvb3QuZ2V0Q2hpbGRyZW4oImZhcXNlY3Rpb24iKSkKKyAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+UXVlc3Rpb25zPC9oMz4KKyAgICAjZm9yZWFjaCAoICRmYXFTZWN0aW9uIGluICRhbGxGYXFTZWN0aW9ucyApCisgICAgICAjdG9jICgkZmFxU2VjdGlvbikKKyAgICAjZW5kCisKKyAgICAgIDxoMyBjbGFzcz0ic2VjdGlvbiI+QW5zd2VyczwvaDM+CisgICAgI2ZvcmVhY2ggKCAkZmFxU2VjdGlvbiBpbiAkYWxsRmFxU2VjdGlvbnMgKQorICAgICAgI2Fuc3dlcnMgKCRmYXFTZWN0aW9uKQorICAgICNlbmQKKyAgI2VuZAorICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgI2Zvb3RlcigpCisjZW5kCmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9zdHlsZXNoZWV0cy90ZW1wbGF0ZXMudm0gYi90cnVuay94ZG9jcy9zdHlsZXNoZWV0cy90ZW1wbGF0ZXMudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzZTAzYgotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL3N0eWxlc2hlZXRzL3RlbXBsYXRlcy52bQpAQCAtMCwwICsxLDI5NSBAQAorIyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIworCisjIyBUaGlzIGlzIHdoZXJlIHRoZSBjb21tb24gbWFjcm8ncyBsaXZlCisKKyNtYWNybyAoIHRhYmxlICR0YWJsZSkKKyAgI2lmICgkdGFibGUuZ2V0QXR0cmlidXRlVmFsdWUoImNsYXNzIikpCisgICAgI3NldCAoJGNsYXNzID0gJHRhYmxlLmdldEF0dHJpYnV0ZVZhbHVlKCJjbGFzcyIpKQorICAjZWxzZQorICAgICNzZXQgKCRjbGFzcyA9ICJGb3JyZXN0VGFibGUiKQorICAjZW5kCisgIDx0YWJsZSBjbGFzcz0iJCFjbGFzcyIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSI0Ij4KKyAgI2ZvcmVhY2ggKCAkaXRlbXMgaW4gJHRhYmxlLmdldENoaWxkcmVuKCkgKQorICAgICNpZiAoJGl0ZW1zLmdldE5hbWUoKS5lcXVhbHMoInRyIikpCisgICAgICAjdHIgKCRpdGVtcykKKyAgICAjZW5kCisgICNlbmQKKyAgI2lmICgkdGFibGUuZ2V0UGFyZW50KCkuZ2V0QXR0cmlidXRlVmFsdWUoImlzYm4iKSkKKyAgICAjc2V0ICgkaXNibiA9ICR0YWJsZS5nZXRQYXJlbnQoKS5nZXRBdHRyaWJ1dGVWYWx1ZSgiaXNibiIpKQorICAgIDx0cj48dGg+SVNCTjo8L3RoPjx0ZD4kIWlzYm48L3RkPjwvdHI+CisgICNlbmQKKyAgPC90YWJsZT4KKyNlbmQKKworI21hY3JvICggdHIgJHRyKQorICA8dHI+CisgICNmb3JlYWNoICggJGl0ZW1zIGluICR0ci5nZXRDaGlsZHJlbigpICkKKyAgICAjaWYgKCRpdGVtcy5nZXROYW1lKCkuZXF1YWxzKCJ0ZCIpKQorICAgICAgI3RkICgkaXRlbXMpCisgICAgI2Vsc2VpZiAoJGl0ZW1zLmdldE5hbWUoKS5lcXVhbHMoInRoIikpCisgICAgICAjdGggKCRpdGVtcykKKyAgICAjZW5kCisgICNlbmQKKzwvdHI+CisjZW5kCisKKyNtYWNybyAoIHRkICR2YWx1ZSkKKyAgI2lmICgkdmFsdWUuZ2V0QXR0cmlidXRlVmFsdWUoImNvbHNwYW4iKSkKKyAgICAjc2V0ICgkY29sc3BhbiA9ICR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgiY29sc3BhbiIpKQorICAjZWxzZQorICAgICNzZXQgKCRjb2xzcGFuID0gMSkKKyAgI2VuZAorICAjaWYgKCR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgicm93c3BhbiIpKQorICAgICNzZXQgKCRyb3dzcGFuID0gJHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJyb3dzcGFuIikpCisgICNlbHNlCisgICAgI3NldCAoJHJvd3NwYW4gPSAxKQorICAjZW5kCisgIDx0ZCBjb2xzcGFuPSIkIWNvbHNwYW4iIHJvd3NwYW49IiQhcm93c3BhbiIKKyAgICAgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+CisgICAgI2lmICgkdmFsdWUuZ2V0VGV4dCgpLmxlbmd0aCgpICE9IDAgfHwgJHZhbHVlLmhhc0NoaWxkcmVuKCkpCisgICAgICAkeG1sb3V0Lm91dHB1dFN0cmluZygkdmFsdWUsIHRydWUpCisgICAgI2Vsc2UKKyAgICAgICZuYnNwOworICAgICNlbmQKKyAgPC90ZD4KKyNlbmQKKworI21hY3JvICggdGggJHZhbHVlKQorICAjaWYgKCR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgiY29sc3BhbiIpKQorICAgICNzZXQgKCRjb2xzcGFuID0gJHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJjb2xzcGFuIikpCisgICNlbHNlCisgICAgI3NldCAoJGNvbHNwYW4gPSAxKQorICAjZW5kCisgICNpZiAoJHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJyb3dzcGFuIikpCisgICAgI3NldCAoJHJvd3NwYW4gPSAkdmFsdWUuZ2V0QXR0cmlidXRlVmFsdWUoInJvd3NwYW4iKSkKKyAgI2Vsc2UKKyAgICAjc2V0ICgkcm93c3BhbiA9IDEpCisgICNlbmQKKyAgPHRoIGNvbHNwYW49IiQhY29sc3BhbiIgcm93c3Bhbj0iJCFyb3dzcGFuIgorICAgICAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KKyAgICAjaWYgKCR2YWx1ZS5nZXRUZXh0KCkubGVuZ3RoKCkgIT0gMCB8fCAkdmFsdWUuaGFzQ2hpbGRyZW4oKSkKKyAgICAgICR4bWxvdXQub3V0cHV0U3RyaW5nKCR2YWx1ZSwgdHJ1ZSkKKyAgICAjZWxzZQorICAgICAgJm5ic3A7CisgICAgI2VuZAorICA8L3RoPgorI2VuZAorCisjbWFjcm8gKCBwcm9qZWN0YW5jaG9yICRuYW1lICR2YWx1ZSApCisgICNpZiAoJHZhbHVlLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkKKyAgICA8YSBocmVmPSIkdmFsdWUiPiRuYW1lPC9hPgorICAjZWxzZWlmICgkdmFsdWUuc3RhcnRzV2l0aCgiL3NpdGUiKSkKKyAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnJHZhbHVlIj4kbmFtZTwvYT4KKyAgI2Vsc2UKKyAgICA8YSBocmVmPSIkcmVsYXRpdmVQYXRoJHZhbHVlIj4kbmFtZTwvYT4KKyAgI2VuZAorI2VuZAorCisjbWFjcm8gKCBtZXRhYXV0aG9yICRhdXRob3IgJGVtYWlsICkKKyAgPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSIkYXV0aG9yIj4KKyAgPG1ldGEgbmFtZT0iZW1haWwiIGNvbnRlbnQ9IiRlbWFpbCI+CisjZW5kCisKKyNtYWNybyAoIGltYWdlICR2YWx1ZSApCisgICNpZiAoJHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJ3aWR0aCIpKQorICAgICNzZXQgKCR3aWR0aD0kdmFsdWUuZ2V0QXR0cmlidXRlVmFsdWUoIndpZHRoIikpCisgICNlbmQKKyAgI2lmICgkdmFsdWUuZ2V0QXR0cmlidXRlVmFsdWUoImhlaWdodCIpKQorICAgICNzZXQgKCRoZWlnaHQ9JHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJoZWlnaHQiKSkKKyAgI2VuZAorICAjaWYgKCR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgiYWxpZ24iKSkKKyAgICAjc2V0ICgkYWxpZ249JHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJhbGlnbiIpKQorICAjZW5kCisgICNpZiAoJHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJhbHQiKSkKKyAgICAjc2V0ICgkYWxpZ249JHZhbHVlLmdldEF0dHJpYnV0ZVZhbHVlKCJhbHQiKSkKKyAgI2VuZAorICA8aW1nIHNyYz0iJHJlbGF0aXZlUGF0aCR2YWx1ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgic3JjIikiCisgICAgICAgd2lkdGg9IiQhd2lkdGgiIGhlaWdodD0iJCFoZWlnaHQiIGFsaWduPSIkIWFsaWduIiBhbHQ9IiQhYWx0Ij4KKyNlbmQKKworI21hY3JvICggc291cmNlICR2YWx1ZSkKKzxwcmUgY2xhc3M9ImNvZGUiPiRlc2NhcGUuZ2V0VGV4dCgkdmFsdWUuZ2V0VGV4dCgpKTwvcHJlPgorI2VuZAorCisjbWFjcm8gKCBtYWtlVGFicyApCisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWIiPgorICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0idGFiIGJhciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgI3NldCAoICR0YWJzID0gJHByb2plY3QuZ2V0Q2hpbGQoImJvZHkiKS5nZXRDaGlsZHJlbigibWVudXNlY3Rpb24iKSkKKyAgI2lmICggJHByb2plY3QuZ2V0Q2hpbGQoImJvZHkiKS5nZXRDaGlsZCgibWVudXNlY3Rpb24iKSApCisgICAgI2ZvcmVhY2ggKCAkdGFiIGluICR0YWJzICkKKyAgICAgICNzZXQgKCRjdXJyZW50SW5kZXggPSAkcm9vdC5nZXRDaGlsZCgicHJvcGVydGllcyIpLmdldENoaWxkKCJpbmRleCIpLmdldEF0dHJpYnV0ZVZhbHVlKCJ2YWx1ZSIpICkKKyAgICAgICNzZXQgKCRpbmRleCA9ICR0YWIuZ2V0QXR0cmlidXRlVmFsdWUoImluZGV4IikpCisgICAgICAjc2V0ICgkbmFtZSA9ICR0YWIuZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiKSkKKyAgICAgICNzZXQgKCRsaW5rID0gJHRhYi5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHJlZiIpKQorICAgICAgI2lmICggKCRjdXJyZW50SW5kZXggJiYgJGN1cnJlbnRJbmRleC50cmltKCkuZXF1YWxzKCAkaW5kZXggKSkgfHwgKCghJGN1cnJlbnRJbmRleCkgJiYgJHZlbG9jaXR5Q291bnQgPT0gMSkgKQorICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgiPjxpbWcgYWx0PSIiIGhlaWdodD0iNSIgd2lkdGg9IjgiIHNyYz0iJHJlbGF0aXZlUGF0aC9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD48dGQgdmFsaWduPSJib3R0b20iPgorICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdW1tYXJ5PSJzZWxlY3RlZCB0YWIiIHN0eWxlPSJoZWlnaHQ6IDEuNWVtIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIkYmx1ZTIiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iJHJlbGF0aXZlUGF0aC9pbWFnZXMvdGFiU2VsLWxlZnQuZ2lmIj48L3RkPjx0ZCB2YWxpZ249Im1pZGRsZSIgYmdjb2xvcj0iJGJsdWUyIj48Zm9udCBjb2xvcj0iJGxpZ2h0ZmciIHNpemU9IjIiIGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtc2VyaWYiPjxiPiRuYW1lPC9iPjwvZm9udD48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiRibHVlMiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIkcmVsYXRpdmVQYXRoL2ltYWdlcy90YWJTZWwtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1Ij48aW1nIGFsdD0iIiBoZWlnaHQ9IjgiIHdpZHRoPSI4IiBzcmM9IiRyZWxhdGl2ZVBhdGgvaW1hZ2VzL3NwYWNlci5naWYiPjwvdGQ+PHRkIHZhbGlnbj0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3VtbWFyeT0ibm9uIHNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS40ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNSIgYmdjb2xvcj0iJGJsdWU0Ij48aW1nIGhlaWdodD0iNSIgd2lkdGg9IjUiIGFsdD0iIiBzcmM9IiRyZWxhdGl2ZVBhdGgvaW1hZ2VzL3RhYi1sZWZ0LmdpZiI+PC90ZD48dGQgdmFsaWduPSJtaWRkbGUiIGJnY29sb3I9IiRibHVlNCI+PGEgaHJlZj0iJHJlbGF0aXZlUGF0aCRsaW5rIj48Zm9udCBzaXplPSIyIiBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBTYW5zLXNlcmlmIj4kbmFtZTwvZm9udD48L2E+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIkYmx1ZTQiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iJHJlbGF0aXZlUGF0aC9pbWFnZXMvdGFiLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICNlbmQKKyAgICAjZW5kCisgICNlbHNlCisgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOCI+PGltZyBhbHQ9IiIgaGVpZ2h0PSI1IiB3aWR0aD0iOCIgc3JjPSIkcmVsYXRpdmVQYXRoL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPjx0ZCB2YWxpZ249ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlbGVjdGVkIHRhYiIgc3R5bGU9ImhlaWdodDogMS41ZW0iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUiIGJnY29sb3I9IiRibHVlMiI+PGltZyBoZWlnaHQ9IjUiIHdpZHRoPSI1IiBhbHQ9IiIgc3JjPSIkcmVsYXRpdmVQYXRoL2ltYWdlcy90YWJTZWwtbGVmdC5naWYiPjwvdGQ+PHRkIHZhbGlnbj0ibWlkZGxlIiBiZ2NvbG9yPSIkYmx1ZTIiPjxmb250IGNvbG9yPSIkbGlnaHRmZyIgc2l6ZT0iMiIgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgU2Fucy1zZXJpZiI+PGI+SG9tZTwvYj48L2ZvbnQ+PC90ZD48dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1IiBiZ2NvbG9yPSIkYmx1ZTIiPjxpbWcgaGVpZ2h0PSI1IiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iJHJlbGF0aXZlUGF0aC9pbWFnZXMvdGFiU2VsLXJpZ2h0LmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgI2VuZAorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2Rpdj4KKyNlbmQKKworCisjbWFjcm8gKCBtYWtlTWFpbk5hdmlnYXRpb24gKQorICAjc2V0ICggJHRhYnMgPSAkcHJvamVjdC5nZXRDaGlsZCgiYm9keSIpLmdldENoaWxkcmVuKCJtZW51c2VjdGlvbiIpKQorICAjaWYgKCAkcHJvamVjdC5nZXRDaGlsZCgiYm9keSIpLmdldENoaWxkKCJtZW51c2VjdGlvbiIpICkKKyAgICAjc2V0ICggJGN1cnJlbnRJbmRleCA9ICRyb290LmdldENoaWxkKCJwcm9wZXJ0aWVzIikuZ2V0Q2hpbGQoImluZGV4IikuZ2V0QXR0cmlidXRlVmFsdWUoInZhbHVlIikgKQorICAgICNpZiAoICRjdXJyZW50SW5kZXggKQorICAgICAgI2ZvcmVhY2ggKCAkdGFiIGluICR0YWJzICkKKyAgICAgICAgI3NldCAoJGluZGV4ID0gJHRhYi5nZXRBdHRyaWJ1dGVWYWx1ZSgiaW5kZXgiKSkKKyAgICAgICAgI2lmICggJGN1cnJlbnRJbmRleC50cmltKCkuZXF1YWxzKCAkaW5kZXggKSApCisgICAgICAgICAgI3NldCAoJG1lbnVzID0gJHRhYi5nZXRDaGlsZHJlbigibWVudSIpKQorICAgICAgICAjZW5kCisgICAgICAjZW5kCisgICAgI2Vsc2UKKyAgICAgICNzZXQgKCRtZW51cyA9ICRwcm9qZWN0LmdldENoaWxkKCJib2R5IikuZ2V0Q2hpbGQoIm1lbnVzZWN0aW9uIikuZ2V0Q2hpbGRyZW4oIm1lbnUiKSkKKyAgICAjZW5kCisgICNlbHNlCisgICAgI3NldCAoJG1lbnVzID0gJHByb2plY3QuZ2V0Q2hpbGQoImJvZHkiKS5nZXRDaGlsZHJlbigibWVudSIpKQorICAjZW5kCisgICNtYWtlUHJvamVjdCAoICRtZW51cyApCisjZW5kCisKKyNtYWNybyAobWFrZVByb2plY3QgJG1lbnVzKQorCisgIDxkaXYgY2xhc3M9Im1lbnVjb250YWluZXIiPgorICAgIDxkaXYgY2xhc3M9Im1lbnUiPgorICAgICAgPHVsPgorICAgICAgI2ZvcmVhY2ggKCAkbWVudSBpbiAkbWVudXMgKQorICAgICAgICA8bGkgY2xhc3M9Im1lbnVoZWFkZXIiPiRtZW51LmdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIikKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICAjZm9yZWFjaCAoICRpdGVtIGluICRtZW51LmdldENoaWxkcmVuKCkgKQorICAgICAgICAgICAgICAjc2V0ICgkbmFtZSA9ICRpdGVtLmdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIikpCisgICAgICAgICAgICAgICNzZXQgKCRjdXJyZW50ID0gJHJvb3QuZ2V0Q2hpbGQoInByb3BlcnRpZXMiKS5nZXRDaGlsZCgidGl0bGUiKS5nZXRUZXh0KCkgKQorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgI2lmICggJGN1cnJlbnQudHJpbSgpLmVxdWFscyggJG5hbWUgKSApCisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbCI+JG5hbWU8L3NwYW4+CisgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgI3Byb2plY3RhbmNob3IoJG5hbWUgJGl0ZW0uZ2V0QXR0cmlidXRlVmFsdWUoImhyZWYiKSkKKyAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAjZW5kCisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9saT4KKyAgICAgICNlbmQKKyAgICAgIDwvdWw+CisgICAgPC9kaXY+CisgICAgPGNlbnRlcj4KKyAgICA8IS0tJHBvdW5kJHNzaSIkYWRzdXJsIiAtLT4KKyAgICA8L2NlbnRlcj4KKyAgICA8aW1nIHN0eWxlPSJmbG9hdDogbGVmdCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9IiRyZWxhdGl2ZVBhdGgvaW1hZ2VzL21lbnUtbGVmdC5naWYiPgorICAgIDxpbWcgc3R5bGU9ImZsb2F0OiByaWdodCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjEwIiBib3JkZXI9IjAiIGFsdD0iIiBzcmM9IiRyZWxhdGl2ZVBhdGgvaW1hZ2VzL21lbnUtcmlnaHQuZ2lmIj4KKyAgPC9kaXY+CisjZW5kCisKKyNtYWNybyAoaGVhZGVyKQorICA8aHRtbCBsYW5nPSJlbiI+CisgICAgPCEtLSBHRU5FUkFURUQgRklMRSwgRE8gTk9UIEVESVQsIEVESVQgVEhFIFhNTCBGSUxFIElOIHhkb2NzIElOU1RFQUQhIC0tPgorICAgIDxoZWFkPgorICAgICAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgICAgICAgIDx0aXRsZT4kcHJvamVjdC5nZXRDaGlsZCgidGl0bGUiKS5nZXRUZXh0KCkgLSAkcm9vdC5nZXRDaGlsZCgicHJvcGVydGllcyIpLmdldENoaWxkKCJ0aXRsZSIpLmdldFRleHQoKTwvdGl0bGU+CisgICAgICAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiBocmVmPSIkcmVsYXRpdmVQYXRoL3BhZ2UuY3NzIiByZWw9InN0eWxlc2hlZXQiPgorICAjc2V0ICgkYXV0aG9ycyA9ICRyb290LmdldENoaWxkKCJwcm9wZXJ0aWVzIikuZ2V0Q2hpbGRyZW4oImF1dGhvciIpKQorICAjZm9yZWFjaCAoICRhdSBpbiAkYXV0aG9ycyApCisgICAgI21ldGFhdXRob3IgKCAkYXUuZ2V0VGV4dCgpICRhdS5nZXRBdHRyaWJ1dGVWYWx1ZSgiZW1haWwiKSApCisgICNlbmQKKyAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxwIGNsYXNzPSJuYXZwYXRoIj4KKyAgICAgICAgPHNjcmlwdCBzcmM9IiRyZWxhdGl2ZVBhdGgvYnJlYWRjcnVtYnMuanMiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorICAgICAgPC9wPgorCisgICAgICA8ZGl2IGNsYXNzPSJsb2dvYmFyIj4KKyAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIGJvcmRlcj0iMCIgYWx0PSJBcGFjaGUgQW50IHNpdGUiIHNyYz0iJHJlbGF0aXZlUGF0aC9pbWFnZXMvZ3JvdXAtbG9nby5naWYiPjwvdGQ+CisgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPjxpbWcgYWx0PSJBcGFjaGUgQW50IGxvZ28iIGJvcmRlcj0iMCIgc3JjPSIkcmVsYXRpdmVQYXRoL2ltYWdlcy9wcm9qZWN0LWxvZ28uZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgICAgICAgIDxmb3JtIHRhcmdldD0iX2JsYW5rIiBvbnN1Ym1pdD0icS52YWx1ZSA9IHF1ZXJ5LnZhbHVlICsgJyBzaXRlOmFudC5hcGFjaGUub3JnJyIgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIiBtZXRob2Q9ImdldCI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHN1bW1hcnk9InNlYXJjaCIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IiRibHVlMiI+CisgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj48aW1nIGhlaWdodD0iMTAiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIkcmVsYXRpdmVQYXRoL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgYWx0PSIiIHNyYz0iJHJlbGF0aXZlUGF0aC9pbWFnZXMvc3BhY2VyLmdpZiI+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0ic2VhcmNoY2FwdGlvbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InEiIHR5cGU9ImhpZGRlbiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHNpemU9IjE1IiBpZD0icXVlcnkiIHR5cGU9InRleHQiPgorICAgICAgICAgICAgICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iNSIgYWx0PSIiIHNyYz0iJHJlbGF0aXZlUGF0aC9pbWFnZXMvc3BhY2VyLmdpZiI+CisgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IlNlYXJjaCIgdmFsdWU9IlNlYXJjaCIgdHlwZT0ic3VibWl0Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICAgICAgICAgICAgdGhlIEFwYWNoZSBBbnQgc2l0ZQorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIkcmVsYXRpdmVQYXRoL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgaGVpZ2h0PSIxMCIgd2lkdGg9IjkiIHNyYz0iJHJlbGF0aXZlUGF0aC9pbWFnZXMvc2VhcmNoLWxlZnQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBhbHQ9IiIgc3JjPSIkcmVsYXRpdmVQYXRoL2ltYWdlcy9zcGFjZXIuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGltZyBhbHQ9IiIgYm9yZGVyPSIwIiBoZWlnaHQ9IjEwIiB3aWR0aD0iOSIgc3JjPSIkcmVsYXRpdmVQYXRoL2ltYWdlcy9zZWFyY2gtcmlnaHQuZ2lmIj48L3RkPgorICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L2Rpdj4KKworICAgICAgI21ha2VUYWJzKCkKKworICAgICAgPGRpdiBjbGFzcz0iYmx1ZWJhciI+PC9kaXY+CisgICAgICAjbWFrZU1haW5OYXZpZ2F0aW9uKCkKKyAgICAgIDxkaXYgY2xhc3M9ImxpZ2h0Ymx1ZWJhciI+Jm5ic3A7PC9kaXY+CisjZW5kCisKKyNtYWNybyAoZm9vdGVyKQorICAgICAgPHAgY2xhc3M9ImNvcHlyaWdodCI+CisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCEtLQorICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKCIgLSAiKyJMYXN0IFB1Ymxpc2hlZDogIiArIGRvY3VtZW50Lmxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgIC8vICAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L3A+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisjZW5kCmRpZmYgLS1naXQgYS90cnVuay94ZG9jcy9zdm4ueG1sIGIvdHJ1bmsveGRvY3Mvc3ZuLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWY3NWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1bmsveGRvY3Mvc3ZuLnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGRvY3VtZW50PgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aXRsZT5TVk4gUmVwb3NpdG9yaWVzPC90aXRsZT4KKyAgICA8YXV0aG9yIGVtYWlsPSIiPkFudG9pbmUgTGV2eS1MYW1iZXJ0PC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKyAgICA8c2VjdGlvbiBuYW1lPSJBY2Nlc3MgdGhlIFNvdXJjZSBUcmVlIChTdWJ2ZXJzaW9uKSI+CisKKyAgICAgIDxwPkFueW9uZSBjYW4gY2hlY2tvdXQgc291cmNlIGNvZGUgZnJvbSBvdXIgcHVibGljIFN1YnZlcnNpb24gcmVwb3NpdG9yeS4gVG8gZG8gc28sCisgICAgICAgICBzaW1wbHkgdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCAoaWYgeW91IGFyZSB1c2luZyBhIEdVSSBjbGllbnQsIGNvbmZpZ3VyZSBpdAorICAgICAgICAgYXBwcm9wcmlhdGVseSk6PC9wPgorCisgICAgICA8c291cmNlPgorc3ZuIGNvIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L1twcm9qZWN0XS90cnVuay8gYW50LVtwcm9qZWN0XTwvc291cmNlPgorCisgICAgICA8cD5Nb2R1bGVzIGF2YWlsYWJsZSBmb3IgYWNjZXNzIGFyZTo8L3A+CisKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvY29yZS90cnVuay8iPmFudDwvYT4gLSBUaGUgJnF1b3Q7bWFpbiZxdW90OyBBbnQgbW9kdWxlLjxici8+CisgICAgICAgICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9jb3JlL3RydW5rLworICAgICAgICA8L2xpPgorICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2FudC9hbnRsaWJzL2FudHVuaXQvdHJ1bmsvIj5hbnR1bml0PC9hPiBUZXN0IGZyYW1ld29yayBmb3IgQW50Ljxici8+CisgICAgICAgICAgICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9hbnRsaWJzL2FudHVuaXQvdHJ1bmsvPC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvYW50bGlicy9kb3RuZXQvdHJ1bmsvIj5Eb3RuZXQgYW50bGliPC9hPiBDb250YWlucyBOYW50LCBOdW5pdCwgLi4uPGJyLz4KKyAgICAgICAgICAgIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50L2FudGxpYnMvZG90bmV0L3RydW5rLzwvbGk+CisgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvYW50L2FudGxpYnMvc3ZuL3RydW5rLyI+c3ZuIGFudGxpYjwvYT4gQ29udGFpbnMgdGFza3MgdG8gaW50ZXJhY3Qgd2l0aCBTdWJ2ZXJzaW9uIHJlcG9zaXRvcmllcy48YnIvPgorICAgICAgICAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvYW50bGlicy9zdm4vdHJ1bmsvPC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9hbnQvc2FuZGJveC8iPnNhbmRib3g8L2E+IC0gTmV3IGRldmVsb3BtZW50cy4gQ29udGFpbnMgY3VycmVudGx5IGdlbmRvYy48YnIvPgorICAgICAgICAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQvc2FuZGJveC8KKyAgICAgICAgPC9saT4KKyAgICAgIDwvdWw+CisKKyAgICAgIDxwPklmIHlvdSBhcmUgbm90IGZhbWlsaWFyIHdpdGggU3VidmVyc2lvbiwgPGEKKyAgICAgIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9jdnNpbmRleC5odG1sIj5KYWthcnRhJ3MKKyAgICAgIHNvdXJjZSByZXBvc2l0b3JpZXMgcGFnZTwvYT4gbWF5IGhvbGQgbWFueSBoZWxwZnVsIGhpbnRzLjwvcD4KKworICAgICAgPHA+TmlnaHRseSBzbmFwc2hvdHMgb2YgdGhlIFNWTiB0cmVlIGFyZSBhdmFpbGFibGUgYXQKKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3NuYXBzaG90cy9hbnQvIj5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvc25hcHNob3RzL2FudC88L2E+LjwvcD4KKworICAgICAgPHA+QSBuaWNlIHZpZXcgb2YgdGhlIHNvdXJjZSBoaXN0b3J5IGlzIGF2YWlsYWJsZSB0aHJvdWdoCisgICAgICA8YSBocmVmPSJodHRwOi8vZmlzaGV5ZTMuY2VucXVhLmNvbS9icm93c2UvYW50LyI+Q2VucXVhJ3MgRmlzaGV5ZSBpbnN0YW5jZTwvYT4uPC9wPgorICAgICAgICAgCisKKyAgPC9zZWN0aW9uPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdHJ1bmsveGRvY3MvdmVsb2NpdHkucHJvcGVydGllcyBiL3RydW5rL3hkb2NzL3ZlbG9jaXR5LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3OTI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3RydW5rL3hkb2NzL3ZlbG9jaXR5LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisjIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworZmlsZS5yZXNvdXJjZS5sb2FkZXIucGF0aD14ZG9jcy9zdHlsZXNoZWV0cwordmVsb2NpbWFjcm8ubGlicmFyeT10ZW1wbGF0ZXMudm0K